ZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTQ5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzODdjNQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsNDE2IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDE5OTgtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgQ29weXJpZ2h0IDIwMDktMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyMgTWFpbiBNYWtlZmlsZSBmb3IgU1lTTElOVVgKKyMKKworYWxsX2Zpcm13YXJlIDo9IGJpb3MgZWZpMzIgZWZpNjQKKworIworIyB0b3BkaXIgaXMgb25seSBzZXQgd2hlbiB3ZSBhcmUgZG9pbmcgYSByZWN1cnNpdmUgbWFrZS4gRG8gYSBidW5jaCBvZgorIyBpbml0aWFsaXNhdGlvbiBpZiBpdCdzIHVuc2V0IHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGludm9jYXRpb24uCisjCitpZmVxICgkKHRvcGRpciksKQorCit0b3BkaXIgPSAkKENVUkRJUikKKworIworIyBCZWNhdXNlIHdlIG5lZWQgdG8gYnVpbGQgbW9kdWxlcyBtdWx0aXBsZSB0aW1lcywgZS5nLiBmb3IgQklPUywKKyMgZWZpMzIsIGVmaTY0LCB3ZSBvdXRwdXQgYWxsIG9iamVjdCBhbmQgZXhlY3V0YWJsZSBmaWxlcyB0byBhCisjIHNlcGFyYXRlIG9iamVjdCBkaXJlY3RvcnkgZm9yIGVhY2ggZmlybXdhcmUuCisjCisjIFRoZSBvdXRwdXQgZGlyZWN0b3J5IGNhbiBiZSBjdXN0b21pc2VkIGJ5IHNldHRpbmcgdGhlIE89L29iai9wYXRoLworIyB2YXJpYWJsZSB3aGVuIGludm9raW5nIG1ha2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCB0aGUgZGVmYXVsdAorIyBkaXJlY3RvcnkgaXMgdGhlIHRvcC1sZXZlbCBvZiB0aGUgU3lzbGludXggc291cmNlLgorIworaWZlcSAoIiQob3JpZ2luIE8pIiwgImNvbW1hbmQgbGluZSIpCisJT0JKRElSIDo9ICQoTykKK2Vsc2UKKwlPQkpESVIgPSAkKHRvcGRpcikKK2VuZGlmCisKKyMgSWYgdGhlIG91dHB1dCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Qgd2UgYmFpbCBiZWNhdXNlIHRoYXQgaXMgdGhlCisjIGxlYXN0IHN1cnByaXNpbmcgdGhpbmcgdG8gZG8uCitjZC1vdXRwdXQgOj0gJChzaGVsbCBjZCAkKE9CSkRJUikgJiYgL2Jpbi9wd2QpCiskKGlmICQoY2Qtb3V0cHV0KSwsIFwKKwkkKGVycm9yIG91dHB1dCBkaXJlY3RvcnkgIiQoT0JKRElSKSIgZG9lcyBub3QgZXhpc3QpKQorCisjCisjIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZXhwb3J0ZWQgdG8gZXZlcnkgaW52b2NhdGlvbiBvZgorIyBtYWtlLAorIworIyAndG9wZGlyJyAtIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIFN5c2xpbnV4IHNvdXJjZQorIyAnb2JqZGlyJyAtIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIG91dHB1dCBmaWxlcyBmb3IgdGhpcyBmaXJtd2FyZQorIyAnTUFLRURJUicgLSBjb250YWlucyBNYWtlZmlsZSBmcmFnbWVudHMKKyMgJ09CSkRJUicgLSB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiBvdXRwdXQgZmlsZXMKKyMKKyMgVGhlcmUgYXJlIGFsc28gYSBoYW5kZnVsIG9mIHZhcmlhYmxlcyB0aGF0IGFyZSBwYXNzZWQgdG8gZWFjaAorIyBzdWItbWFrZSwKKyMKKyMgU1JDIC0gc291cmNlIHRyZWUgbG9jYXRpb24gb2YgdGhlIG1vZHVsZSBiZWluZyBjb21waWxlZAorIyBPQkogLSBvdXRwdXQgdHJlZSBsb2NhdGlvbiBvZiB0aGUgbW9kdWxlIGJlaW5nIGNvbXBpbGVkCisjCisjIEEgY291cGxlIG9mIHJ1bGVzIGZvciB3cml0aW5nIE1ha2VmaWxlcywKKyMKKyMgLSBEbyBub3QgdXNlIHJlbGF0aXZlIHBhdGhzLCB1c2UgdGhlIGFib3ZlIHZhcmlhYmxlcworIyAtIFlvdSBjYW4gd3JpdGUgJChTUkMpIGEgbG90IGxlc3MgaWYgeW91IGFkZCBpdCB0byBWUEFUSAorIworCitNQUtFRElSID0gJCh0b3BkaXIpL21rCitleHBvcnQgTUFLRURJUiB0b3BkaXIgT0JKRElSCisKK2luY2x1ZGUgJChNQUtFRElSKS9zeXNsaW51eC5taworLWluY2x1ZGUgJChPQkpESVIpL3ZlcnNpb24ubWsKKworcHJpdmF0ZS10YXJnZXRzID0gcHJlcmVsIHVucHJlcmVsIG9mZmljaWFsIHJlbGVhc2UgYnVybiBpc29saW51eC5pc28gXAorCQkgIHByZXVwbG9hZCB1cGxvYWQgdGVzdCB1bml0dGVzdCByZWdyZXNzaW9uIHNwb3RsZXNzCisKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSwpCisJTUFLRUNNREdPQUxTICs9IGFsbAorZW5kaWYKKworIworIyBUaGUgJ2Jpb3MnLCAnZWZpMzInIGFuZCAnZWZpNjQnIGFyZSBkdW1teSB0YXJnZXRzLiBUaGVpciBvbmx5CisjIHB1cnBvc2UgaXMgdG8gaW5zdHJ1Y3QgdXMgd2hpY2ggb3V0cHV0IGRpcmVjdG9yaWVzIG5lZWQKKyMgY3JlYXRpbmcuIFdoaWNoIG1lYW5zIHRoYXQgd2UgYWx3YXlzIG5lZWQgYSAqcmVhbCogdGFyZ2V0LCBzdWNoIGFzCisjICdhbGwnLCBhcHBlbmRlZCB0byB0aGUgbWFrZSBnb2Fscy4KKyMKK2Zpcm13YXJlID0gJChhbGxfZmlybXdhcmUpCityZWFsLXRhcmdldCA6PSAkKGZpbHRlci1vdXQgJChmaXJtd2FyZSksICQoTUFLRUNNREdPQUxTKSkKK3JlYWwtZmlybXdhcmUgOj0gJChmaWx0ZXIgJChmaXJtd2FyZSksICQoTUFLRUNNREdPQUxTKSkKKworaWZlcSAoJChyZWFsLXRhcmdldCksKQorCXJlYWwtdGFyZ2V0ID0gYWxsCitlbmRpZgorCitpZmVxICgkKHJlYWwtZmlybXdhcmUpLCkKKwlyZWFsLWZpcm13YXJlID0gJChmaXJtd2FyZSkKK2VuZGlmCisKKy5QSE9OWTogJChmaWx0ZXItb3V0ICQocHJpdmF0ZS10YXJnZXRzKSwgJChNQUtFQ01ER09BTFMpKQorJChmaWx0ZXItb3V0ICQocHJpdmF0ZS10YXJnZXRzKSwgJChNQUtFQ01ER09BTFMpKToKKwkkKE1BS0UpIC1DICQoT0JKRElSKSAtZiAkKENVUkRJUikvTWFrZWZpbGUgU1JDPSIkKHRvcGRpcikiIFwKKwkJT0JKPSQoT0JKRElSKSBvYmpkaXI9JChPQkpESVIpICQoTUFLRUNNREdPQUxTKQorCit1bml0dGVzdDoKKwlwcmludGYgIkV4ZWN1dGluZyB1bml0IHRlc3RzXG4iCisJJChNQUtFKSAtQyBjb3JlL21lbS90ZXN0cyBhbGwKKwkkKE1BS0UpIC1DIGNvbTMyL2xpYi9zeXNsaW51eC90ZXN0cyBhbGwKKworcmVncmVzc2lvbjoKKwkkKE1BS0UpIC1DIHRlc3RzIFNSQz0iJCh0b3BkaXIpL3Rlc3RzIiBPQko9IiQodG9wZGlyKS90ZXN0cyIgXAorCQlvYmpkaXI9JChPQkpESVIpIFwKKwkJLWYgJCh0b3BkaXIpL3Rlc3RzL01ha2VmaWxlIGFsbAorCit0ZXN0OiB1bml0dGVzdCByZWdyZXNzaW9uCisKKyMgSG9vayB0byBhZGQgcHJpdmF0ZSBNYWtlZmlsZSB0YXJnZXRzIGZvciB0aGUgbWFpbnRhaW5lci4KKy1pbmNsdWRlICQodG9wZGlyKS9NYWtlZmlsZS5wcml2YXRlCisKK2Vsc2UgIyBpZmVxICgkKHRvcGRpciksKQorCitpbmNsdWRlICQoTUFLRURJUikvc3lzbGludXgubWsKKworIyBIb29rIHRvIGFkZCBwcml2YXRlIE1ha2VmaWxlIHRhcmdldHMgZm9yIHRoZSBtYWludGFpbmVyLgorLWluY2x1ZGUgJCh0b3BkaXIpL01ha2VmaWxlLnByaXZhdGUKKworIworIyBUaGUgQlRBUkdFVCByZWZlcnMgdG8gb2JqZWN0cyB0aGF0IGFyZSBkZXJpdmVkIGZyb20gbGRsaW51eC5hc207IHdlCisjIGxpa2UgdG8ga2VlcCB0aG9zZSB1bmlmb3JtIGZvciBkZWJ1Z2dpbmcgcmVhc29uczsgaG93ZXZlciwgZGlzdHJpYnV0b3JzCisjIHdhbnQgdG8gcmVjb21waWxlIHRoZSBpbnN0YWxsZXJzIChJVEFSR0VUKS4KKyMKKyMgQk9CSkVDVFMgYW5kIElPQkpFQ1RTIGFyZSB0aGUgc2FtZSB0aGluZywgZXhjZXB0IHVzZWQgZm9yCisjIGluc3RhbGxhdGlvbiwgc28gdGhleSBpbmNsdWRlIG9iamVjdHMgdGhhdCBtYXkgYmUgaW4gc3ViZGlyZWN0b3JpZXMKKyMgd2l0aCB0aGVpciBvd24gTWFrZWZpbGVzLiAgRmluYWxseSwgdGhlcmUgaXMgYSBsaXN0IG9mIHRob3NlCisjIGRpcmVjdG9yaWVzLgorIworCitpZm5kZWYgRUZJX0JVSUxECitNT0RVTEVTID0gbWVtZGlzay9tZW1kaXNrIFwKKwljb20zMi9tZW51LyouYzMyIGNvbTMyL21vZHVsZXMvKi5jMzIgY29tMzIvbWJvb3QvKi5jMzIgXAorCWNvbTMyL2hkdC8qLmMzMiBjb20zMi9yb3NoLyouYzMyIGNvbTMyL2dmeGJvb3QvKi5jMzIgXAorCWNvbTMyL3N5c2R1bXAvKi5jMzIgY29tMzIvbHVhL3NyYy8qLmMzMiBjb20zMi9jaGFpbi8qLmMzMiBcCisJY29tMzIvbGliLyouYzMyIGNvbTMyL2xpYnV0aWwvKi5jMzIgY29tMzIvZ3BsbGliLyouYzMyIFwKKwljb20zMi9lbGZsaW5rL2xkbGludXgvKi5jMzIgY29tMzIvY21lbnUvbGlibWVudS8qLmMzMgorZWxzZQorIyBGSVhNRTogUHJ1bmUgb3RoZXIgQklPUy1jZW50cmljIG1vZHVsZXMKK01PRFVMRVMgPSBjb20zMi9tZW51LyouYzMyIGNvbTMyL21vZHVsZXMvKi5jMzIgY29tMzIvbWJvb3QvKi5jMzIgXAorCWNvbTMyL2hkdC8qLmMzMiBjb20zMi9yb3NoLyouYzMyIGNvbTMyL2dmeGJvb3QvKi5jMzIgXAorCWNvbTMyL3N5c2R1bXAvKi5jMzIgY29tMzIvbHVhL3NyYy8qLmMzMiBjb20zMi9jaGFpbi8qLmMzMiBcCisJY29tMzIvbGliLyouYzMyIGNvbTMyL2xpYnV0aWwvKi5jMzIgY29tMzIvZ3BsbGliLyouYzMyIFwKKwljb20zMi9jbWVudS9saWJtZW51LyouYzMyIGNvbTMyL2VsZmxpbmsvbGRsaW51eC8kKExETElOVVgpCitlbmRpZgorCisjIExpc3Qgb2YgbW9kdWxlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgaW5zdGFsbGVkIGZvciBhbGwgZGVyaXZhdGl2ZXMKK0lOU1RBTExBQkxFX01PRFVMRVMgPSAkKE1PRFVMRVMpCisKKyMgc3lzbGludXguZXhlIGlzIEJUQVJHRVQgc28gYXMgdG8gbm90IHJlcXVpcmUgZXZlcnlvbmUgdG8gaGF2ZSB0aGUKKyMgbWluZ3cgc3VpdGUgaW5zdGFsbGVkCitCVEFSR0VUICA9IHZlcnNpb24uZ2VuIHZlcnNpb24uaCAkKE9CSkRJUikvdmVyc2lvbi5taworQk9CSkVDVFMgPSAkKEJUQVJHRVQpIFwKKwltYnIvKi5iaW4gXAorCWNvcmUvcHhlbGludXguMCBjb3JlL2xweGVsaW51eC4wIFwKKwljb3JlL2lzb2xpbnV4LmJpbiBjb3JlL2lzb2xpbnV4LWRlYnVnLmJpbiBcCisJZ3B4ZS9ncHhlbGludXguMCBkb3Mvc3lzbGludXguY29tIFwKKwl3aW4zMi9zeXNsaW51eC5leGUgd2luNjQvc3lzbGludXg2NC5leGUgXAorCWRvc3V0aWwvKi5jb20gZG9zdXRpbC8qLnN5cyBcCisJJChNT0RVTEVTKQorCisjIEJTVUJESVJzIGJ1aWxkIHRoZSBvbi10YXJnZXQgYmluYXJ5IGNvbXBvbmVudHMuCisjIElTVUJESVJzIGJ1aWxkIHRoZSBpbnN0YWxsZXIgKGhvc3QpIGNvbXBvbmVudHMuCisjCisjIE5vdGU6IGxpYmluc3RhbGxlciBpcyBib3RoIGEgQlNVQkRJUiBhbmQgYW4gSVNVQkRJUi4gIEl0IGNvbnRhaW5zCisjIGZpbGVzIHRoYXQgZGVwZW5kIG9ubHkgb24gdGhlIEIgcGhhc2UsIGJ1dCBtYXkgaGF2ZSB0byBiZSByZWdlbmVyYXRlZAorIyBmb3IgIm1ha2UgaW5zdGFsbGVyIi4KKworaWZkZWYgRUZJX0JVSUxECisKK0JTVUJESVJTID0gY29kZXBhZ2UgY29tMzIgbHpvIGNvcmUgbWJyIHNhbXBsZSBlZmkgdHh0CitJU1VCRElSUyA9CisKK0lOU1RBTExTVUJESVJTID0gZWZpCisKK05FVElOU1RBTExBQkxFID0gZWZpL3N5c2xpbnV4LmVmaSAkKElOU1RBTExBQkxFX01PRFVMRVMpCisKK2Vsc2UKKworQlNVQkRJUlMgPSBjb2RlcGFnZSBjb20zMiBsem8gY29yZSBtZW1kaXNrIG1iciBncHhlIHNhbXBsZSBcCisJICAgZGlhZyBsaWJpbnN0YWxsZXIgZG9zIHdpbjMyIHdpbjY0IGRvc3V0aWwgdHh0CisKK0lUQVJHRVQgID0KK0lPQkpFQ1RTID0gJChJVEFSR0VUKSBcCisJdXRpbHMvZ2V0aG9zdGlwIHV0aWxzL2lzb2h5YnJpZCB1dGlscy9ta2Rpc2tpbWFnZSBcCisJbXRvb2xzL3N5c2xpbnV4IGxpbnV4L3N5c2xpbnV4IGV4dGxpbnV4L2V4dGxpbnV4CitJU1VCRElSUyA9IGxpYmluc3RhbGxlciBtdG9vbHMgbGludXggZXh0bGludXggdXRpbHMKKworIyBUaGluZ3MgdG8gaW5zdGFsbCBpbiAvdXNyL2JpbgorSU5TVEFMTF9CSU4gICA9CW10b29scy9zeXNsaW51eAorIyBUaGluZ3MgdG8gaW5zdGFsbCBpbiAvc2JpbgorSU5TVEFMTF9TQklOICA9IGV4dGxpbnV4L2V4dGxpbnV4CisjIFRoaW5ncyB0byBpbnN0YWxsIGluIC91c3IvbGliL3N5c2xpbnV4CitJTlNUQUxMX0FVWCAgID0JY29yZS9weGVsaW51eC4wIGdweGUvZ3B4ZWxpbnV4LjAgZ3B4ZS9ncHhlbGludXhrLjAgXAorCQljb3JlL2lzb2xpbnV4LmJpbiBjb3JlL2lzb2xpbnV4LWRlYnVnLmJpbiBcCisJCWRvcy9zeXNsaW51eC5jb20gY29yZS9scHhlbGludXguMCBcCisJCW1ici8qLmJpbiAkKElOU1RBTExBQkxFX01PRFVMRVMpCitJTlNUQUxMX0FVWF9PUFQgPSB3aW4zMi9zeXNsaW51eC5leGUgd2luNjQvc3lzbGludXg2NC5leGUKK0lOU1RBTExfRElBRyAgPQlkaWFnL21ici9oYW5kb2ZmLmJpbiBcCisJCWRpYWcvZ2VvZHNwL2dlb2RzcDFzLmltZy54eiBkaWFnL2dlb2RzcC9nZW9kc3Btcy5pbWcueHoKKworIyBUaGVzZSBkaXJlY3RvcmllcyBtYW5hZ2UgdGhlaXIgb3duIGluc3RhbGxhYmxlcworSU5TVEFMTFNVQkRJUlMgPSBjb20zMiB1dGlscyBkb3N1dGlsCisKKyMgVGhpbmdzIHRvIGluc3RhbGwgaW4gL2Jvb3QvZXh0bGludXgKK0VYVEJPT1RJTlNUQUxMID0gJChJTlNUQUxMQUJMRV9NT0RVTEVTKQorCisjIFRoaW5ncyB0byBpbnN0YWxsIGluIC90ZnRwYm9vdAorTkVUSU5TVEFMTEFCTEUgPSBjb3JlL3B4ZWxpbnV4LjAgZ3B4ZS9ncHhlbGludXguMCBjb3JlL2xweGVsaW51eC4wIFwKKwkJICQoSU5TVEFMTEFCTEVfTU9EVUxFUykKKworZW5kaWYgIyBpZmRlZiBFRklfQlVJTEQKKworLlBIT05ZOiBzdWJkaXJzICQoQlNVQkRJUlMpICQoSVNVQkRJUlMpIHRlc3QKKworaWZlcSAoJChIQVZFX0ZJUk1XQVJFKSwpCisKK2Zpcm13YXJlID0gJChhbGxfZmlybXdhcmUpCisKKyMgSWYgbm8gZmlybXdhcmUgd2FzIHNwZWNpZmllZCB0aGUgcmVzdCBvZiBNQUtFQ01ER09BTFMgYXBwbGllcyB0byBhbGwKKyMgZmlybXdhcmUuCitpZmVxICgkKGZpbHRlciAkKGZpcm13YXJlKSwkKE1BS0VDTURHT0FMUykpLCkKK2FsbCBzdHJpcCB0aWR5IGNsZWFuIGRpc3QgaW5zdGFsbCBpbnN0YWxsZXIgbmV0aW5zdGFsbDogJChhbGxfZmlybXdhcmUpCisKK2Vsc2UKKworIyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhlIHJlc3Qgb2YgTUFLRUNNREdPQUxTIGF0IHRoaXMgbGV2ZWwuIEl0CisjIHdpbGwgYmUgaGFuZGxlZCBmb3IgZWFjaCBvZiAkKGZpcm13YXJlKS4KK3N0cmlwIHRpZHkgY2xlYW4gZGlzdCBpbnN0YWxsIGluc3RhbGxlciBuZXRpbnN0YWxsOgorCitlbmRpZgorCisjIENvbnZlcnQgJ21ha2UgYmlvcyBzdHJpcCcgdG8gJ21ha2Ugc3RyaXAnLCBldGMgZm9yIHJlc3Qgb2YgdGhlIE1ha2VmaWxlcy4KK01BS0VDTURHT0FMUyA6PSAkKGZpbHRlci1vdXQgJChmaXJtd2FyZSksJChNQUtFQ01ER09BTFMpKQoraWZlcSAoJChNQUtFQ01ER09BTFMpLCkKKwlNQUtFQ01ER09BTFMgKz0gYWxsCitlbmRpZgorCisjCisjIFlvdSdkIHRoaW5rIHRoYXQgd2UnZCBiZSBhYmxlIHRvIHVzZSB0aGUgJ2RlZmluZScgZGlyZWN0aXZlIHRvCisjIGFic3RyYWN0IHRoZSBjb2RlIGZvciBpbnZva2luZyBtYWtlKDEpIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBidXQKKyMgYnkgdXNpbmcgJ2RlZmluZScgd2UgbG9zZSB0aGUgYWJpbGl0eSB0byBidWlsZCBpbiBwYXJhbGxlbC4KKyMKKy5QSE9OWTogJChmaXJtd2FyZSkKK2Jpb3M6CisJQG1rZGlyIC1wICQoT0JKKS9iaW9zCisJJChNQUtFKSAtQyAkKE9CSikvYmlvcyAtZiAkKFNSQykvTWFrZWZpbGUgU1JDPSIkKFNSQykiIFwKKwkJb2JqZGlyPSQoT0JKKS9iaW9zIE9CSj0kKE9CSikvYmlvcyBIQVZFX0ZJUk1XQVJFPTEgXAorCQlGSVJNV0FSRT1CSU9TIFwKKwkJQVJDSD1pMzg2IExETElOVVg9bGRsaW51eC5jMzIgJChNQUtFQ01ER09BTFMpCisKK2VmaTMyOgorCUBta2RpciAtcCAkKE9CSikvZWZpMzIKKwkkKE1BS0UpIC1DICQoT0JKKS9lZmkzMiAtZiAkKFNSQykvTWFrZWZpbGUgU1JDPSIkKFNSQykiIFwKKwkJb2JqZGlyPSQoT0JKKS9lZmkzMiBPQko9JChPQkopL2VmaTMyIEhBVkVfRklSTVdBUkU9MSBcCisJCUFSQ0g9aTM4NiBCSVRTPTMyIEVGSV9CVUlMRD0xIExETElOVVg9bGRsaW51eC5lMzIgXAorCQlGSVJNV0FSRT1FRkkzMiBcCisJCSQoTUFLRUNNREdPQUxTKQorCitlZmk2NDoKKwlAbWtkaXIgLXAgJChPQkopL2VmaTY0CisJJChNQUtFKSAtQyAkKE9CSikvZWZpNjQgLWYgJChTUkMpL01ha2VmaWxlIFNSQz0iJChTUkMpIiBcCisJCW9iamRpcj0kKE9CSikvZWZpNjQgT0JKPSQoT0JKKS9lZmk2NCBIQVZFX0ZJUk1XQVJFPTEgXAorCQlBUkNIPXg4Nl82NCBCSVRTPTY0IEVGSV9CVUlMRD0xIExETElOVVg9bGRsaW51eC5lNjQgXAorCQlGSVJNV0FSRT1FRkk2NCBcCisJCSQoTUFLRUNNREdPQUxTKQorCitlbHNlICMgaWZlcSgkKEhBVkVfRklSTVdBUkUpLCkKKworYWxsOiBhbGwtbG9jYWwgc3ViZGlycworCithbGwtbG9jYWw6ICQoQlRBUkdFVCkgJChJVEFSR0VUKQorCS1scyAtbCAkKEJPQkpFQ1RTKSAkKElPQkpFQ1RTKQorc3ViZGlyczogJChCU1VCRElSUykgJChJU1VCRElSUykKKworJChzb3J0ICQoSVNVQkRJUlMpICQoQlNVQkRJUlMpKToKKwlAbWtkaXIgLXAgJEAKKwkkKE1BS0UpIC1DICRAIFNSQz0iJChTUkMpLyRAIiBPQko9IiQoT0JKKS8kQCIgXAorCQktZiAkKFNSQykvJEAvTWFrZWZpbGUgJChNQUtFQ01ER09BTFMpCisKKyQoSVRBUkdFVCk6CisJQG1rZGlyIC1wICRACisJJChNQUtFKSAtQyAkQCBTUkM9IiQoU1JDKS8kQCIgT0JKPSIkKE9CSikvJEAiIFwKKwkJLWYgJChTUkMpLyRAL01ha2VmaWxlICQoTUFLRUNNREdPQUxTKQorCiskKEJJTkZJTEVTKToKKwlAbWtkaXIgLXAgJEAKKwkkKE1BS0UpIC1DICRAIFNSQz0iJChTUkMpLyRAIiBPQko9IiQoT0JKKS8kQCIgXAorCQktZiAkKFNSQykvJEAvTWFrZWZpbGUgJChNQUtFQ01ER09BTFMpCisKKyMKKyMgTGlzdCB0aGUgZGVwZW5kZW5jaWVzIHRvIGhlbHAgb3V0IHBhcmFsbGVsIGJ1aWxkcy4KK2RvcyBleHRsaW51eCBsaW51eCBtdG9vbHMgd2luMzIgd2luNjQ6IGxpYmluc3RhbGxlcgorbGliaW5zdGFsbGVyOiBjb3JlCit1dGlsczogbWJyCitjb3JlOiBjb20zMgorZWZpOiBjb3JlCitncHhlOiBjb3JlCisKK2luc3RhbGxlcjogaW5zdGFsbGVyLWxvY2FsCisJc2V0IC1lOyBmb3IgaSBpbiAkKElTVUJESVJTKTsgXAorCQlkbyAkKE1BS0UpIC1DICQkaSBTUkM9IiQoU1JDKS8kJGkiIE9CSj0iJChPQkopLyQkaSIgXAorCQktZiAkKFNSQykvJCRpL01ha2VmaWxlIGFsbDsgZG9uZQorCisKK2luc3RhbGxlci1sb2NhbDogJChJVEFSR0VUKSAkKEJJTkZJTEVTKQorCitzdHJpcDogc3RyaXAtbG9jYWwKKwlzZXQgLWU7IGZvciBpIGluICQoSVNVQkRJUlMpOyBcCisJCWRvICQoTUFLRSkgLUMgJCRpIFNSQz0iJChTUkMpLyQkaSIgT0JKPSIkKE9CSikvJCRpIiBcCisJCS1mICQoU1JDKS8kJGkvTWFrZWZpbGUgc3RyaXA7IGRvbmUKKwktbHMgLWwgJChCT0JKRUNUUykgJChJT0JKRUNUUykKKworc3RyaXAtbG9jYWw6CisKK3ZlcnNpb24uZ2VuOiAkKHRvcGRpcikvdmVyc2lvbiAkKHRvcGRpcikvdmVyc2lvbi5wbAorCSQoUEVSTCkgJCh0b3BkaXIpL3ZlcnNpb24ucGwgJDwgJEAgJyVkZWZpbmUgPCBAJwordmVyc2lvbi5oOiAkKHRvcGRpcikvdmVyc2lvbiAkKHRvcGRpcikvdmVyc2lvbi5wbAorCSQoUEVSTCkgJCh0b3BkaXIpL3ZlcnNpb24ucGwgJDwgJEAgJyNkZWZpbmUgPCBAJworCitsb2NhbC1pbnN0YWxsOiBpbnN0YWxsZXIKKwlta2RpciAtbSA3NTUgLXAgJChJTlNUQUxMUk9PVCkkKEJJTkRJUikKKwlpbnN0YWxsIC1tIDc1NSAtYyAkKElOU1RBTExfQklOKSAkKElOU1RBTExST09UKSQoQklORElSKQorCW1rZGlyIC1tIDc1NSAtcCAkKElOU1RBTExST09UKSQoU0JJTkRJUikKKwlpbnN0YWxsIC1tIDc1NSAtYyAkKElOU1RBTExfU0JJTikgJChJTlNUQUxMUk9PVCkkKFNCSU5ESVIpCisJbWtkaXIgLW0gNzU1IC1wICQoSU5TVEFMTFJPT1QpJChBVVhESVIpCisJaW5zdGFsbCAtbSA2NDQgLWMgJChJTlNUQUxMX0FVWCkgJChJTlNUQUxMUk9PVCkkKEFVWERJUikKKwktaW5zdGFsbCAtbSA2NDQgLWMgJChJTlNUQUxMX0FVWF9PUFQpICQoSU5TVEFMTFJPT1QpJChBVVhESVIpCisJbWtkaXIgLW0gNzU1IC1wICQoSU5TVEFMTFJPT1QpJChESUFHRElSKQorCWluc3RhbGwgLW0gNjQ0IC1jICQoSU5TVEFMTF9ESUFHKSAkKElOU1RBTExST09UKSQoRElBR0RJUikKKwlta2RpciAtbSA3NTUgLXAgJChJTlNUQUxMUk9PVCkkKE1BTkRJUikvbWFuMQorCWluc3RhbGwgLW0gNjQ0IC1jICQodG9wZGlyKS9tYW4vKi4xICQoSU5TVEFMTFJPT1QpJChNQU5ESVIpL21hbjEKKwk6IG1rZGlyIC1tIDc1NSAtcCAkKElOU1RBTExST09UKSQoTUFORElSKS9tYW44CisJOiBpbnN0YWxsIC1tIDY0NCAtYyBtYW4vKi44ICQoSU5TVEFMTFJPT1QpJChNQU5ESVIpL21hbjgKKworaWZuZGVmIEVGSV9CVUlMRAoraW5zdGFsbDogbG9jYWwtaW5zdGFsbAorCXNldCAtZSA7IGZvciBpIGluICQoSU5TVEFMTFNVQkRJUlMpIDsgXAorCQlkbyAkKE1BS0UpIC1DICQkaSBTUkM9IiQoU1JDKS8kJGkiIE9CSj0iJChPQkopLyQkaSIgXAorCQktZiAkKFNSQykvJCRpL01ha2VmaWxlICRAOyBkb25lCitlbHNlCitpbnN0YWxsOgorCW1rZGlyIC1tIDc1NSAtcCAkKElOU1RBTExST09UKSQoQVVYRElSKS9lZmkkKEJJVFMpCisJc2V0IC1lIDsgZm9yIGkgaW4gJChJTlNUQUxMU1VCRElSUykgOyBcCisJCWRvICQoTUFLRSkgLUMgJCRpIFNSQz0iJChTUkMpLyQkaSIgT0JKPSIkKE9CSikvJCRpIiBcCisJCUJJVFM9IiQoQklUUykiIEFVWERJUj0iJChBVVhESVIpL2VmaSQoQklUUykiIFwKKwkJLWYgJChTUkMpLyQkaS9NYWtlZmlsZSAkQDsgZG9uZQorCS1pbnN0YWxsIC1tIDY0NCAkKElOU1RBTExBQkxFX01PRFVMRVMpICQoSU5TVEFMTFJPT1QpJChBVVhESVIpL2VmaSQoQklUUykKKwlpbnN0YWxsIC1tIDY0NCBjb20zMi9lbGZsaW5rL2xkbGludXgvJChMRExJTlVYKSAkKElOU1RBTExST09UKSQoQVVYRElSKS9lZmkkKEJJVFMpCitlbmRpZgorCitpZmRlZiBFRklfQlVJTEQKK25ldGluc3RhbGw6CisJbWtkaXIgLXAgJChJTlNUQUxMUk9PVCkkKFRGVFBCT09UKS9lZmkkKEJJVFMpCisJaW5zdGFsbCAtbSA2NDQgJChORVRJTlNUQUxMQUJMRSkgJChJTlNUQUxMUk9PVCkkKFRGVFBCT09UKS9lZmkkKEJJVFMpCitlbHNlCituZXRpbnN0YWxsOiBpbnN0YWxsZXIKKwlta2RpciAtcCAkKElOU1RBTExST09UKSQoVEZUUEJPT1QpCisJaW5zdGFsbCAtbSA2NDQgJChORVRJTlNUQUxMQUJMRSkgJChJTlNUQUxMUk9PVCkkKFRGVFBCT09UKQorZW5kaWYKKworZXh0Ym9vdGluc3RhbGw6IGluc3RhbGxlcgorCW1rZGlyIC1tIDc1NSAtcCAkKElOU1RBTExST09UKSQoRVhUTElOVVhESVIpCisJaW5zdGFsbCAtbSA2NDQgJChFWFRCT09USU5TVEFMTCkgJChJTlNUQUxMUk9PVCkkKEVYVExJTlVYRElSKQorCitpbnN0YWxsLWFsbDogaW5zdGFsbCBuZXRpbnN0YWxsIGV4dGJvb3RpbnN0YWxsCisKK2xvY2FsLXRpZHk6CisJcm0gLWYgKi5vICouZWxmICpfYmluLmMgc3R1cGlkLiogcGF0Y2gub2Zmc2V0CisJcm0gLWYgKi5sc3IgKi5sc3QgKi5tYXAgKi5zZWMgKi50bXAKKwlybSAtZiAkKE9CU09MRVRFKQorCit0aWR5OiBsb2NhbC10aWR5ICQoQkVTVUJESVJTKSAkKElFU1VCRElSUykgJChCU1VCRElSUykgJChJU1VCRElSUykKKworbG9jYWwtY2xlYW46CisJcm0gLWYgJChJVEFSR0VUKQorCitjbGVhbjogbG9jYWwtdGlkeSBsb2NhbC1jbGVhbiAkKEJFU1VCRElSUykgJChJRVNVQkRJUlMpICQoQlNVQkRJUlMpICQoSVNVQkRJUlMpCisKK2xvY2FsLWRpc3Q6CisJZmluZCAuIFwoIC1uYW1lICcqficgLW8gLW5hbWUgJyMqJyAtbyAtbmFtZSBjb3JlIFwKKwkJLW8gLW5hbWUgJy4qLmQnIC1vIC1uYW1lIC5kZXBlbmQgXCkgLXR5cGUgZiAtcHJpbnQwIFwKKwl8IHhhcmdzIC0wcnQgcm0gLWYKKworZGlzdDogbG9jYWwtZGlzdCBsb2NhbC10aWR5ICQoQkVTVUJESVJTKSAkKElFU1VCRElSUykgJChCU1VCRElSUykgJChJU1VCRElSUykKKworIyBTaG9ydGN1dCB0byBidWlsZCBsaW51eC9zeXNsaW51eCB1c2luZyBrbGliYwora2xpYmM6CisJJChNQUtFKSBjbGVhbgorCSQoTUFLRSkgQ0M9a2xjYyBJVEFSR0VUPSBJU1VCRElSUz0nbGludXggZXh0bGludXgnIEJTVUJESVJTPQorZW5kaWYgIyBpZmVxICgkKEhBVkVfRklSTVdBUkUpLCkKKworZW5kaWYgIyBpZmVxICgkKHRvcGRpciksKQorCitsb2NhbC1zcG90bGVzczoKKwlmaW5kIC4gXCggLW5hbWUgJyp+JyAtbyAtbmFtZSAnIyonIC1vIC1uYW1lIGNvcmUgXAorCQktbyAtbmFtZSAnLiouZCcgLW8gLW5hbWUgLmRlcGVuZCAtbyAtbmFtZSAnKi5zby4qJyBcKSBcCisJCS10eXBlIGYgLXByaW50MCBcCisJfCB4YXJncyAtMHJ0IHJtIC1mCisKK3Nwb3RsZXNzOiBsb2NhbC1zcG90bGVzcworCXJtIC1yZiAkKGFsbF9maXJtd2FyZSkKKworIworIyBDb21tb24gcnVsZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IGV2ZXJ5IGludm9jYXRpb24gb2YgbWFrZS4KKyMKKyQoT0JKRElSKS92ZXJzaW9uLm1rOiAkKHRvcGRpcikvdmVyc2lvbiAkKHRvcGRpcikvdmVyc2lvbi5wbAorCSQoUEVSTCkgJCh0b3BkaXIpL3ZlcnNpb24ucGwgJDwgJEAgJzwgOj0gQCcKZGlmZiAtLWdpdCBhL05FV1MgYi9ORVdTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTViMmMKLS0tIC9kZXYvbnVsbAorKysgYi9ORVdTCkBAIC0wLDAgKzEsMTc0NSBAQAorU3RhcnRpbmcgd2l0aCAxLjQ3LCBjaGFuZ2VzIG1hcmtlZCB3aXRoIFNZU0xJTlVYLCBQWEVMSU5VWCwgSVNPTElOVVgKK29yIEVYVExJTlVYIGFwcGx5IHRvIHRoYXQgc3BlY2lmaWMgcHJvZ3JhbSBvbmx5OyBvdGhlciBjaGFuZ2VzIGFwcGx5Cit0byBhbGwgZGVyaXZhdGl2ZXMuCisKK0NoYW5nZXMgaW4gNi4wMzoKKwkqIGNoYWluOiBGaXggY2hhaW5sb2FkaW5nIG9uIDYuMDIgKFJhcGhhZWwgUy4gQ2FydmFsaG8pLgorCSogY29yZTogRG8gbm90IGxlYWsgdGhlIF9fbG93bWVtIGFuZCBfX2JzczE2IG1hY3JvcyB0byBtb2R1bGVzOworCSAgaGlkZSB0aGVtIHNvIG1vZHVsZXMgd2lsbCBub3QgdXNlIHRoZW0uCisJKiBsb2FkX2xpbnV4OiBEbyBub3QgdXNlIHNpemUgaGV1cmlzdGljIGZvciBub24tcmVsb2NhdGFibGUKKwkgIGtlcm5lbHMsIGZvciB6SW1hZ2Uga2VybmVscyBhbmQgZm9yIG5vbi1MaW51eCBrZXJuZWxzLgorCSogUFhFTElOVVg6IEZpeCB0aGUgU0VORENPT0tJRVMgZmVhdHVyZSBmb3IgSFRUUAorCSAgKFJ1c3NlbCBTYW50aWxsYW5lcykuCisJKiBnbnUtZWZpOiBBZGQgZ251LWVmaSBhcyBhIHN1Ym1vZHVsZS4KKwkqIEFOU0k6IFN1cHBvcnQgY29sb3IgdGFibGVzIHdpdGggbW9yZSB0aGFuIDI1NiBlbnRyaWVzCisJICAoSmFtZXMgQnVyZW4pLgorCSogRUZJOiBGaXggZGlzcGxheWVkIHZlcnNpb247IGFkZCBEQVRFIChHZW5lIEN1bW0pCisJKiBQWEVMSU5VWCwgRUZJOiBGaXggYmFkIHJlYWQgb2YgZmlsZSBzaXplIG92ZXIgVEZUUCBvbiBFRkk2NAorCSAgKFN5bHZhaW4gR2F1bHQpLgorCSogRml4IGhhbmQgb3ZlciB0byBrZXJuZWw6CisJICAiQm9vdGluZyBrZXJuZWwgZmFpbGVkOiBJbnZhbGlkIGFyZ3VtZW50IiBlcnJvci4KKwkqIElTT0xJTlVYOiBFRFgsIExCQSB2YWx1ZXMgaGlnaGVyIHRoYW4gNjU1MzU7IHdvcmsgYXJvdW5kIGZvcgorCSAgYnVnZ3kgQklPUywgd2hlcmUgdGhlIHN5c3RlbSB3b3VsZCBoYW5nLCB3b3VsZCByZWJvb3QsIG9yCisJICB3b3VsZCBzaG93IGEgIkRpc2sgZXJyb3IgMDEsIEFYPTQyIiBtZXNzYWdlLgorCSogY29yZS9sZWdhY3luZXQ6IEVuYWJsZSBkb3QgcXVhZCByZXNvbHV0aW9uIChHZW5lIEN1bW0pLgorCSogZGlhZy9nZW9kc3AgaW1wcm92ZW1lbnRzIChHZW5lIEN1bW0pLgorCSogRE9TOiBGaXggc3lzbGludXguY29tIERPUy1iYXNlZCBpbnN0YWxsZXIuCisJKiBJbXByb3ZlIGdjYyA0LjMuMCBjb21wYXRpYmlsaXR5LgorCSogc3lzbHhpbnQ6IGZpeCBjb21waWxhdGlvbiBvbiBub24teDg2IGFyY2hpdGVjdHVyZXMuCisJKiBsb2NhbGJvb3Q6IEZpeCAibG9jYWxib290IDB4ODAiIGFuZCBzaW1pbGFyIGNhc2VzLgorCSogQWRkIG1lbXNldCgpIGNhbGxzIHByaW9yIHRvIGFueSBpbnRjYWxsKCkgYW5kIG90aGVyIG1lbSBmaXhlczsKKwkgIHNwZWNpYWxseSByZWxldmFudCBmb3Igb2xkZXIgaGFyZHdhcmUgYW5kL29yIGJ1Z2d5IEJJT1MuCisJKiBwb3dlcm9mZi5jMzI6IEZpeGVzIChHZW5lIEN1bW0pLgorCSogSERUOiBGaXggbWVtb3J5IGxlYWsgaW4gQ0xJIChGZWxpcGUgUGVuYSkuCisJKiBBQ1BJOiBSZW1vdmUgbWVtc2V0IG9mIGJ1ZmZlcjsgaXQgbWFrZXMgdGhpbmdzIGNsZWFyZXIgYnV0CisJICBhbHNvIHByZXZlbnRzIHNvbWUgY29tcGlsYXRpb24gd2FybmluZ3MgKEVyd2FuIFZlbHUpLgorCSogQWRkIG1hbnBhZ2VzIGZvciBpc29oeWJyaWQsIG1lbWRpc2tmaW5kCisJICAoUGV0ZXIgSm9uZXMsIEdlbmUgQ3VtbSkuCisJKiBJU09MSU5VWDogRXhwZXJpbWVudGFsIFJvY2sgUmlkZ2Ugc3VwcG9ydCAoVGhvbWFzIFNjaG1pdHQpLgorCSogY29tYXBpOiBSZW1vdmUgdGhlIGNvbWFwaSBpbnRlcmZhY2VzLgorCSogRUZJOiBGaXhlcyBvbiBQRSBmaWxlcyBhbmQgT1ZNRiBjb21wYXRpYmlsaXR5CisJICAoU3lsdmFpbiBHYXVsdCwgR2VuZSBDdW1tKS4KKwkqIEVGSTogVXBkYXRlcyBhbmQgZml4ZXMgZm9yIGdudS1lZmkgc3ViLW1vZHVsZQorCSAgKFN5bHZhaW4gR2F1bHQsIEdlbmUgQ3VtbSkuCisJKiBCSU9TOiBGaXggbG93IG1lbW9yeSBjaGVjay4KKwkqIEZpbGVzeXN0ZW0gVVVJRCB0byBTWVNBUFBFTkQgYml0IDB4NDAwMDAgZm9yIEZBVCBhbmQgZXh0MgorCSAgKFNlcmogS2FsaWNoZXYpLgorCSogTWFrZWZpbGVzOiBFeHBvcnQgdGhlIGZpcm13YXJlIHR5cGUgYXMgYSBjcHAgdmFyaWFibGUuCisJICBBZGRpdGlvbmFsIGltcHJvdmVtZW50cy4gRml4ICJtYWtlIHNwb3RsZXNzIi4KKwkqIGNvcmUsIEJJT1M6IE1vdmUgX19zeXNsaW51eF9zaHVmZmxlcl9zaXplIHRvIGFzc2VtYmx5LgorCSAgQWN0dWFsbHkgZ2V0IHRoZSBzaHVmZmxlciBzaXplIHNhbmVseS4gRml4IGJvb3RpbmcgcmVjZW50CisJICBTeXNsaW51eCB2ZXJzaW9ucyBvbiBjZXJ0YWluIGhhcmR3YXJlIGFuZCBvbiBjZXJ0YWluCisJICB2aXJ0dWFsaXphdGlvbiBzb2Z0d2FyZSAoZS5nLiBRRU1VIDAuMTEuMSwgVmlydHVhbEJveCA0LjEueCkuCisJKiBsdWE6IFVwZ3JhZGUgdG8gdi41LjIuMyAoRmVyZW5jIFfDoWduZXIpIGFuZCBhZGRpdGlvbmFsIGZpeGVzLgorCSogY2hhaW5sb2FkOiBGaXhlcyB0byBjaGFpbi5jMzIgYW5kIHB4ZWNobi5jMzIuCisJKiBOVEZTOiBNYWtlIGJ5dGVfc2hpZnQgYSBjb25zdGFudC4KKwkqIE5URlM6IENvcnJlY3QgcGFyc2luZyBvZiBmaWxlIHJ1bnMgKEFuZHkgQWxleCkuCisJKiBjb3JlLCBCSU9TOiBDb3JyZWN0IGRldGVjdGlvbiBvZiBFREQgKEFuZHkgQWxleCkuCisJKiBjb3JlOiBBdm9pZCBpbml0aWFsaXppbmcgdGhlIGNhY2hlIG1vcmUgdGhhbiBvbmNlCisJICAoUmFwaGFlbCBTLiBDYXJ2YWxobykuCisJKiBOVEZTOiBIYW5kbGUgZnJhZ21lbnRlZCAkTUZUIGZpbGUgKEFuZHkgQWxleCkuCisJKiBCSU9TOiBVc2UgaW50IDB4MTYsIGFoPTB4MDIgdG8gcHJvYmUgZm9yIHNoaWZ0IGZsYWdzLiBBdHRlbXB0CisJICB3b3JrYXJvdW5kIGZvciBVU0Iga2V5Ym9hcmRzIG5vdCByZXNwb25kaW5nIGF0IGJvb3QgdGltZS4KKwkqIGtiZDogR2V0dGluZyB0aGUga2V5Ym9hcmQgc2hpZnQgc3RhdGUgaXMgbm93IGEgZmlybXdhcmUgbWV0aG9kLgorCSoga2JkOiBGaXggZm9yY2UtcHJvbXB0IGZlYXR1cmVzLgorCSogQlRSRlM6IEZpeCBib290aW5nIG9uIEJUUkZTLgorCSogY2FjaGUsIGJ0cmZzOiBQcm92aWRlIGEgZ2VuZXJhbCBjYWNoZWQgcmVhZCByb3V0aW5lLgorCSogTlRGUzogQ29ycmVjdCBmaWxlLT5vZmZzZXQgdXNhZ2UgaW4gbnRmc19yZWFkZGlyIChBbmR5IEFsZXgpLgorCSogTmV3IHN1cHBvcnQgZm9yIFVGUy9GRlMgKFVGUzEvMikgKFJhcGhhZWwgUy4gQ2FydmFsaG8pLgorCSogYWR2OiBSZW1vdmUgZG91YmxlIGRlZmluaXRpb247CisJICBpdCBzaG91bGQgZml4IHVzZXMgb2YgdGhlIEFEViwgaW5jbHVkaW5nICItLW9uY2UiLgorCSogbWVtZHVtcDogUmVtb3ZlIG9sZCBvYnNvbGV0ZSBDT00xNiBiaW5hcnkuCisJKiBpc29oeWJyaWQ6IE51bWVyb3VzIGZpeGVzIChUaG9tYXMgU2NobWl0dCkuCisJKiBjaGFpbi5jMzI6IEFkZCBhbiBhZGp1c3RhYmxlICJzdHJpY3Q9ezAsMSwyfSIgZmxhZywgaW1wcm92ZQorCSAgZXJyb3IgcmVwb3J0aW5nIChNaWNoYWwgU29sdHlzLikKKwkqIGxweGVsaW51eC4wOiBXb3JrYXJvdW5kIGZvciB2YXJpb3VzIGJ1Z2d5IEJJT1NlcyAoR2VuZQorCSAgQ3VtbS4pCisJKiBQWEU6IEZpeCBhIHN0YWNrLXNtYXNoaW5nIGJ1ZyB3aGljaCBicm9rZSBhIGxhcmdlIG51bWJlciBvZgorCSAgc3lzdGVtcy4KKworQ2hhbmdlcyBpbiA2LjAyOgorCSogZWZpNjQ6IEFkZCBzdXBwb3J0IGZvciBib290aW5nIDMyLWJpdCBrZXJuZWxzLgorCSogZWZpOiBVc2UgdGhlIEVGSSBoYW5kb3ZlciBwcm90b2NvbCB3aGVuIGJvb3Rpbmcga2VybmVscyBpZgorCSAgYXZhaWxhYmxlLgorCSogRml4IHZhcmlvdXMgbWFrZSB0YXJnZXRzIHRoYXQgYmVjYW1lIGJyb2tlbiB3aGVuIHN3aXRjaGluZyB0bworCSAgcGVyLWZpcm13YXJlIG9iamVjdCBkaXJlY3RvcmllcywgaW5jbHVkaW5nICdtYWtlIGluc3RhbGwnIGFuZAorCSAgJ21ha2UgbmV0aW5zdGFsbCcuCisJKiBlZmk6IEltcHJvdmUgaGFuZGxpbmcgb2YgcGFja2V0IGxvc3MgaW4gVURQIHN0YWNrLgorCSogdGVzdHM6IEludHJvZHVjZSBhIG5ldyByZWdyZXNzaW9uIHRlc3QgZnJhbWV3b3JrIGRlc2lnbmVkIHRvCisJICBlbnN1cmUgYnVncyBhcmUgbm90IHJlaW50cm9kdWNlZCBvbmNlIGZpeGVkLgorCSogZWZpOiBJbXBsZW1lbnQgbG9jYWxib290IHN1cHBvcnQuCisKK0NoYW5nZXMgaW4gNi4wMToKKwkqIGVmaTogTWFyayBzb21lIHN5bWJvbHMgYXMgX19leHBvcnQgb3RoZXJ3aXNlIGxpYmNvbTMyLmMzMiBhbmQKKwkgIHZlc2FtZW51LmMzMiB3aWxsIHJlZnVzZSB0byBsb2FkLgorCSogYmlvczogV2lyZSB1cCB0aGUgYmlvcyBrZXJuZWwgbG9hZGVyLiBJdCB3YXMgaW1wb3NzaWJsZSB0bworCSAgbG9hZCBhIGtlcm5lbCBmcm9tIGJpb3MgaW4gNi4wMC4KKwkqIGVmaTogRml4ICdtYWtlIGluc3RhbGxlcicuIFRoZXJlIGFyZSBubyBFRkkgaW5zdGFsbGVycyBzbworCSAgZG9uJ3QgdHJ5IGFuZCBidWlsZCB0aGVtIGFzIHdlIHJ1biBpbnRvIGJ1aWxkIGVycm9ycy4KKwkqIGVmaTogUmV1c2UgdGhlIGluaXRpYWwgVEZUUCBjbGllbnQgcG9ydCBpbiBzdWJzZXF1ZW50CisJICB0cmFuc2ZlcnMgb3RoZXJ3aXNlIHRoZSBzZXJ2ZXIgd2lsbCBzZW5kIGFuIGVycm9yIHBhY2tldC4KKwkqIGVmaTogU29tZSBmaXJtd2FyZSB3aWxsIG5vdCBzZXQgYSBkZWZhdWx0IFRUTCB2YWx1ZSBpbiBJUAorCSAgcGFja2V0cyAtIHdlIG11c3QgZXhwbGljaXRseSBzZXQgaXQgb3Vyc2VsdmVzIG90aGVyd2lzZSBhCisJICB2YWx1ZSBvZiB6ZXJvIG1heSBiZSB1c2VkLgorCSogYmlvcywgZm9udDogRml4IGEgZm9udCByZWdyZXNzaW9uIGFmZmVjdGluZyBzb21lIFZpcnR1YWxCb3gKKwkgIHVzZXJzLgorCitDaGFuZ2VzIGluIDYuMDA6CisJKiBBZGQgc3VwcG9ydCBmb3IgYm9vdGluZyBmcm9tIEVGSS4KKwkqIEVGSSBUQ1AvSVAgc3VwcG9ydC4gVGhpcyBhbGxvd3MgdGhlIEVGSSBiYWNrZW5kIHRvIGhvb2sgaW50bworCSAgdGhlIGdlbmVyaWMgVEZUUCwgSFRUUCBhbmQgRlRQIGZ1bmN0aW9uYWxpdHkuCisKK0NoYW5nZXMgaW4gNS4xMToKKwkqIER5bmFtaWMgZGVidWcgc3VwcG9ydDogQWRkIG5ldyBtb2R1bGUsIGRlYnVnLmMzMiwgdGhhdCBhbGxvd3MKKwkgIGRlYnVnIGNvZGUgdG8gYmUgZHluYW1pY2FsbHkgZW5hYmxlZCBhbmQgZGlzYWJsZWQgYXQgcnVudGltZS4KKworQ2hhbmdlcyBpbiA1LjEwOgorCSogUFhFTElOVVg6IEFuIGVudGlyZWx5IG5ldyBuZXR3b3JrIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uCisJICB0aGUgbHdJUCBlbWJlZGRlZCBUQ1AvSVAgc3RhY2suICBBcyBhIHJlc3VsdCwgcGxhaW4gUFhFTElOVVgKKwkgIGNhbiBub3cgc3VwcG9ydCBIVFRQIGFuZCBGVFAgd2l0aG91dCBnUFhFL2lQWEUuICBscy9yZWFkZGlyCisJICBmdW5jdGlvbmFsaXR5IGlzIHN1cHBvcnRlZCBvdmVyIEhUVFAgd2l0aCBhbiBpbmRleGluZworCSAgd2Vic2VydmVyLCBvciBvdmVyIEZUUCB3aXRoIG1vc3QgY29tbW9uIEZUUCBzZXJ2ZXJzLiBGb3IgdGhlCisJICBuZXcgbmV0d29yayBzdGFjayB1c2UgbHB4ZWxpbnV4LjAuIEZvciB0aGUgbGVnYWN5IHN0YWNrIHVzZQorCSAgcHhlbGludXguMC4KKwkqIFJlbmFtZSB0aGUgImlwYXBwZW5kIiBvcHRpb24gdG8gInN5c2FwcGVuZCIgKCJpcGFwcGVuZCIgaXMKKwkgIHN0aWxsIGFjY2VwdGVkIGFzIGFuIGFsaWFzKSBhbmQgbWFrZSBpdCBhdmFpbGFibGUgZm9yIGFsbAorCSAgZGVyaXZhdGl2ZXMuICBBZGQgYWRkaXRpb25hbCBzdHJpbmdzIGRlcml2ZWQgZnJvbSB0aGUgc3lzdGVtCisJICBETUkvU01CSU9TIGluZm9ybWF0aW9uIGlmIGF2YWlsYWJsZS4KKwkqICJzeXNhcHBlbmQiIHN0cmluZ3MgYXJlIGFsc28gc2VudCBhcyBodHRwIGNvb2tpZXMsIHdpdGggdGhlCisJICBwcmVmaXggX1N5c2xpbnV4XyBhZGRlZCwgb24gYWxsIGh0dHAgdHJhbnNmZXJzLiAgVGhpcyBjYW4gYmUKKwkgIG92ZXJyaWRkZW4gd2l0aCB0aGUgU0VORENPT0tJRVMgY29uZmlndXJhdGlvbiBmaWxlIGNvbW1hbmQuCisJKiBwb3dlcm9mZi5jMzI6IEEgbmV3IG1vZHVsZSB0byBwb3dlciBvZmYgYSBzeXN0ZW0gdmlhIEFQTS4gSXQKKwkgIHJlcGxhY2VzIHRoZSBwb3dlcm9mZiBDT01CT09UIG1vZHVsZSAoU2ViYXN0aWFuIEhlcmJzenQpLgorCSogUFhFTElOVVg6IEZpeCBib290aW5nIHdpdGggREhDUCBvcHRpb25zIDIwOSBhbmQgMjEwIHdoaWNoIHdhcworCSAgYnJva2VuIGluIDUuMDAuCisJKiBIYW5kbGUgbG9hZGluZyBrZXJuZWwgaW1hZ2VzIHdpdGggbm8gcHJvdGVjdGVkIG1vZGUgY29kZS4gQQorCSAgbGVnaXRpbWF0ZSBrZXJuZWwgaW1hZ2UgY2FuIGNvbnNpc3Qgc29sZWx5IG9mIHJlYWwtbW9kZSBjb2RlLgorCSAgVGhlIHN1cHBvcnQgZm9yIGJvb3Rpbmcgc3VjaCBpbWFnZXMgd2FzIGJyb2tlbiBpbiA1LjAwIChKb3NoIFRyaXBsZXR0KS4KKwkqIEZpeCBhIHJlZ3Jlc3Npb24gaW4gdGhlIC5wc2YgZm9udCBmaWxlIGxvYWRlciBpbnRyb2R1Y2VkCisJICBpbiA1LjAwLgorCitDaGFuZ2VzIGluIDUuMDE6CisJKiB0eHQvOiBBIG5ldyBBc2NpaURvYyBkb2N1bWVudGF0aW9uIHNldCAod29yay1pbi1wcm9ncmVzcykKKwkgIChHZW5lIEN1bW0pLgorCSogY29yZTogRml4IGEgYnVnIGluIHRoZSByZWFsbG9jKCkgaW1wbGVtZW50YXRpb24gdGhhdCBjYXVzZWQKKwkgIG1hY2hpbmVzIHRvIGFwcGVhciB0byBydW4gb3V0IG9mIGZyZWUgbWVtb3J5LgorCSogbGRsaW51eDogRml4IG11bHRpcGxlIGJ1ZmZlciBvdmVyZmxvd3MgaW4gY21kbGluZSBwYXJzaW5nCisJICBjb2RlIHRoYXQgcmVzdWx0ZWQgaW4gZmlsZXMgZmFpbGluZyB0byBydW4gYW5kIGNtZGxpbmVzCisJICBiZWluZyB0cnVuY2F0ZWQuCisJKiBjb3JlOiBGaXggZGVidWcgYnVpbGQgYnkgdGFnZ2luZyBfX2JhZF9TRUcoKSB3aXRoIF9fZXhwb3J0LgorCSogY29tMzI6IFJlc3RyaWN0IGxpYnJhcnkgZmlsZW5hbWVzIHRvIDguMyBmb3JtYXQuCisJKiBFWFRMSU5VWDogRml4IGluc3RhbGxhdGlvbiBhbmQgc3ViZGlyZWN0b3J5IHBhdGNoaW5nLgorCSogSVNPTElOVVg6IEZpeCBib290aW5nIGlzb2h5YnJpZCBpbWFnZXMgdGhhdCBhcmUgb3ZlciAzMksuCisJKiBjb20zMjogU3RyaXAgbW9kdWxlcyB0byByZWR1Y2UgdGhlaXIgc2l6ZS4KKwkqIFhGUzogSW1wbGVtZW50IGRpcmVjdG9yeSBibG9jayBjYWNoZSBhbmQgZml4CisgICAgICAgICAgc2hvcnRmb3JtLWRpcmVjdG9yeSBsb29rdXAgKFBhdWxvIEFsY2FudGFyYSkuCisKK0NoYW5nZXMgaW4gNS4wMDoKKwkqIGNvbTMyOiBTd2l0Y2hlZCBmcm9tIHRoZSBDT00zMiBvYmplY3QgZm9ybWF0IHRvIEVMRiBhcyBpdCBpcworCSAgYSBtdWNoIG1vcmUgcG93ZXJmdWwgZm9ybWF0IHRoYXQgYWxsb3dzIHVuZGVmaW5lZCBzeW1ib2xzIHRvCisJICBiZSByZXNvbHZlZCBhdCBydW50aW1lIGFuZCBkeW5hbWljIGxvYWRpbmcgb2YgbW9kdWxlCisJICBkZXBlbmRlbmNpZXMsIHdoaWNoIG1lYW5zIG1vZHVsZXMgbm93IGJlY29tZSBzaGFyZWQgb2JqZWN0CisJICBmaWxlcyBpbnN0ZWFkIG9mIHN0YXRpY2FsbHkgbGlua2VkIGJpbmFyaWVzIC0gcmVkdWNpbmcgYm90aAorCSAgZGlzayBzcGFjZSBhbmQgcnVudGltZSBtZW1vcnkgY29uc3VtcHRpb24uCisJKiBjb3JlOiBTcGxpdCBub24tY29yZSBmdW5jdGlvbmFsaXR5IGludG8gbGRsaW51eC5jMzIsIHdoaWNoCisJICBpcyBhbiBFTEYgbW9kdWxlIGxvYWRlZCBieSB0aGUgY29yZSB0aGF0IGNvbnRhaW5zIGV2ZXJ5dGhpbmcKKwkgIHRoZSBjb3JlIGRvZXNuJ3QgcmVxdWlyZSB0byBib290IHRoZSBzeXN0ZW0sIGUuZy4gY29uZmlnCisJICBwYXJzZXIsIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UsIGV0Yy4KKwkqIFJlcGxhY2VkIF9faW50Y2FsbCgpIGNhbGxzIHdpdGggZGlyZWN0IGZ1bmN0aW9uIGNhbGxzIG5vdworCSAgdGhhdCB3ZSBjYW4gcmVzb2x2ZSB1bmRlZmluZWQgc3ltYm9scyBhdCBydW50aW1lLCB0aGFua3MgdG8KKwkgIHRoZSBFTEYgb2JqZWN0IHN1cHBvcnQuIE5vdyB0aGF0IHdlIG5vIGxvbmdlciBuZWVkIHRvIGdvCisJICB0aHJvdWdoIHRoZSAxNi1iaXQgaW50ZXJydXB0IG1lY2hhbmlzbSB3ZSBjYW4gbWFrZSBmdWxsIHVzZQorCSAgb2YgdGhlIDMyLWJpdCBleGVjdXRpb24gZW52aXJvbm1lbnQuIFRoaXMgY2hhbmdlIHJlcXVpcmVkCisJICByZWltcGxlbWVudGluZyBsb3RzIG9mIHRoZSAxNi1iaXQgYXNzZW1ibHkgY29kZSBmcm9tIGNvcmUvCisJICBpbiBDLgorCSogY29tMzI6IF9fY29tMzIuY3NfYm91bmNlIGlzIGdvbmUgbm93IHdlIGFsd2F5cyBydW4gaW4gYQorCSAgMzItYml0IGVudmlyb25tZW50IG9uY2Ugd2UgZXhlY3V0ZSBsZGxpbnV4LmMzMi4KKwkqIGxkbGludXg6IEEgbmV3ICJQQVRIIiBkaXJlY3RpdmUgd2FzIGFkZGVkIHRvIHRoZSBsZGxpbnV4LmMzMgorCSAgY29uZmlnIHBhcnNlciB0aGF0IHNwZWNpZmllcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mCisJICBkaXJlY3RvcmllcyB0byBzZWFyY2ggd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgbW9kdWxlcy4KKwkqIEFMTDogRGVsZXRlIGFsbCByZWZlcmVuY2VzIHRvL2NvZGUgZm9yIDE2LWJpdCBDT01CT09UIGZpbGVzLgorCSAgQ09NQk9PVCBmaWxlcyAoLmNidCBhbmQgLmNvbSkgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgdW5kZXIKKwkgIFN5c2xpbnV4LgorCitDaGFuZ2VzIGluIDQuMDc6CisJKiBFWFRMSU5VWDogZml4IGNyYXNoIGNhdXNlZCBieSBkZXJlZmVyZW5jaW5nIGdhcmJhZ2UgcG9pbnRlci4KKwkqIFBsdWcgbWVtb3J5IGxlYWsgaW4gc2VhcmNoZGlyIHdoaWNoIGV2ZW50dWFsbHkgbGVhZHMgdG8gYW4KKwkgIG9ic2VydmFibGUgaGFuZyAoU2hhbyBNaWxsZXIpLgorCSogSVNPTElOVVg6IGZpeCBidWcgdHJpZ2dlcmVkIGJ5IGlzb2h5YnJpZCBpbWFnZXMgbGFyZ2VyIHRoYW4KKwkgIDMySyB3aGljaCByZXN1bHRzIGluIGFuIGludmFsaWQgaW1hZ2UgY2hlY2tzdW0gZXJyb3IuCisJKiBtZW51Z2VuOiBtYWtlIGl0IFB5M2sgY29tcGF0aWJsZSAoUGF1bG8gQWxjYW50YXJhKS4KKworQ2hhbmdlcyBpbiA0LjA2OgorCSogU3VwcG9ydCBmb3IgTlRGUywgYnkgUGF1bG8gQWxjYW50YXJhLgorCSogRVhUTElOVVg6IG1vcmUgcm9idXN0IGRldmljZSBkZXRlY3Rpb24sIGFsbG93IHVzZXIgdG8gb3ZlcnJpZGUuCisJKiBrb250cm9uX3dkdC5jMzI6IEFkZCBhIG5ldyBtb2R1bGUgdG8gZW5hYmxlIHRoZSBoYXJkd2FyZQorCSAgd2F0Y2hkb2cgb2Ygc29tZSBLb250cm9uIGJvYXJkcy4gSXQgYWxsb3dzIGVuYWJsaW5nIHRoZSB3YXRjaGRvZworCSAgYW5kIHRoZW4gYm9vdGluZyBhIGdpdmVuIGltYWdlLgorCSogSERUIHVwZGF0ZWQsIGFuZCBub3cgY2FuIGRpc3BsYXkgaW1hZ2VzIHJlZ2FyZGluZyBzb21lIGRldGVjdGlvbgorCSAgc3RlcHMuIEFkZCBwb3N0ZXhlYyBjb21tYW5kIHRvIHJ1biBhIHBhcnRpY3VsYXIgZW50cnkgYWZ0ZXIKKwkgIEhEVCdzIGV4ZWN1dGlvbiwgYWRkIHNpbGVudCBvcHRpb24gYW5kIHZhcmlvdXMgZml4ZXMuCisJKiBpZmNwdS5jMzI6IERldGVjdCBoeXBlcnZpc29yIHByZXNlbmNlLgorCSogbHVhLmMzMjogQWRkIGRoY3Agc3VwcG9ydCBhbmQgc3VwcG9ydCBmb3IgbmF0aXZlIFN5c2xpbnV4CisJICBmdW5jdGlvbnMgc3lzbGludXhfY29uZmlnKCksIHN5c2xpbnV4X2lwYXBwZW5kX3N0cmluZ3MoKSBhbmQKKwkgIHN5c2xpbnV4X3JlYm9vdCgpLgorCSogaXNvaHlicmlkOiBXb3JrYXJvdW5kIGZvciB2YXJpb3VzIEVGSSBzeXN0ZW1zLgorCSogcHhlY2huLmMzMiwgYSBQWEUgTkJQIGNoYWlubG9hZGVyLiAgTW9yZSB2ZXJzYXRpbGUgYWx0ZXJuYXRpdmUKKwkgIHRvIHB4ZWNoYWluLmNvbSBhbmQgcmVzb2x2ZXMgdGhlIFBYRUxJTlVYIC0+IFdEUyBpc3N1ZSB3aXRoCisJICBNaWNyb3NvZnQgV2luZG93cyBTZXJ2ZXIgMjAwOFIyIChHZW5lIEN1bW0pLgorCSogYnRyZnM6IEZpeCBib290aW5nIG9mZiBvZiBhIHN1YnZvbHVtZS4KKwkqIGNvbTMyOiBBZGQgZGV2aWNlIHRyZWUgc3VwcG9ydC4KKwkqIFNZU0xJTlVYOiBGaXggcmVsYXRpdmUgcGF0aHMgZm9yIFZGQVQuIFRoZSBDT05GSUcgYW5kIEFQUEVORAorCSAgZGlyZWN0aXZlcyBub3cgc3VwcG9ydCBlbnRpcmVseSByZWxhdGl2ZSBwYXRocy4KKworQ2hhbmdlcyBpbiA0LjA1OgorCSogSERUIHVwZGF0ZWQsIGFuZCBub3cgc3VwcG9ydHMgdXBsb2FkaW5nIGRhdGEgdG8gYSBURlRQCisJICBzZXJ2ZXIuCisJKiBJU09MSU5VWDogcmVtb3ZlIHRoZSAuaW1nIGZpbGUgc3VwcG9ydDsgaXQgaGFzIGJlZW4gYnJva2VuCisJICBvbiB2aXJ0dWFsbHkgYWxsIHN5c3RlbXMgc2luY2UgdGhlIGJlZ2lubmluZywgYW5kIGhhcyBiZWVuCisJICB0b3RhbGx5IGJyb2tlbiBzaW5jZSA0LjAwIGF0IGxlYXN0LiAgVXNlIE1FTURJU0sgaW5zdGVhZC4KKwkqIGNoYWluLmMzMjogU3VwcG9ydCBjaGFpbmluZyBSZWFjdE9TJyBGcmVlTGRyIChTaGFvIE1pbGxlcikKKwkqIGlzb2h5YnJpZDogLW0gb3B0aW9uIHRvIGFkZCBzdXBwb3J0IGZvciBNYWMgRUZJIGJvb3RpbmcuCisgICAgICAgICogaWZtZW1kc2suYzMyOiBDaG9vc2UgYm9vdCBvcHRpb24gYmFzZWQgb24gcHJlc2VuY2Ugb2YKKwkgIE1FTURJU0suCisJKiBSZW1vdmUgYm9ndXMgZGlzdHJpYnV0ZWQgbWstbGJhLWltZyBiaW5hcnkuCisJKiBUaGUgU3lzbGludXggcHJvamVjdCBoYXMgYSBuZXcsIGNvb2wgbG9nbyBieSBBYmkKKwkgICJpeHh2aWwiIFJhc2hlZWQgKGRvYy9sb2dvLyopLgorCitDaGFuZ2VzIGluIDQuMDQ6CisJKiBQWEVMSU5VWDogRml4IGhhbmRsaW5nIG9mIHVucXVhbGlmaWVkIEROUyBuYW1lcy4KKwkqIFBYRUxJTlVYOiBGaXggdGltZXIgYnVnIHdoZW4gUFhFTElOVVggbWlnaHQgYmUgdW5sb2FkZWQKKwkgIChHZW5lIEN1bW0pLgorCSogY29yZS93cml0ZWRlYy5pbmM6IEZpeCBkdXBsaWNhdGUgZGVjbGFyYXRpb24gYW5kIG92ZXJmbG93CisJICAoR2VuZSBDdW1tKS4KKwkqIEdDQyA0LjUgZml4ZXMuCisJKiBzYW1wbGUgZGlyZWN0b3J5OiBGaXggTWFrZWZpbGUgaW5jbHVkZSAoR2VuZSBDdW1tKS4KKwkqIHZlci5jb206IE5ldyB1bml2ZXJzYWwgRE9TL0NPTUJPT1QgYXBwbGljYXRpb24gdG8gZGlzcGxheQorCSAgdmVyc2lvbiBpbmZvcm1hdGlvbiAoaW5jbHVkZXMgRFJNSykgKEdlbmUgQ3VtbSkuCisJKiByb3NoLmMzMjogdXBkYXRlZDsgVXNpbmcgZ2V0b3B0KCkgZm9yIGludGVybmFsIGNvbW1hbmRzIHRvIGFpZAorCSAgcGFyc2luZyBvcHRpb25zOyBGaXggYnVncyBpbiBsczsgYWRkIHdhcm0gcmVib290IGFuZCBlY2hvCisJICAoR2VuZSBDdW1tKS4KKwkqIGNvbTMyOiBmaXggYSBmaWxlIGRlc2NyaXB0b3IgbGVhay4KKwkqIGdmeGJvb3QuYzMyOiBoYW5kbGUgVEVYVC4uRU5EVEVYVDsgZXJyb3Igb3V0IG9uIG5vIExBQkVMcworCSAgZm91bmQgKFNlYmFzdGlhbiBIZXJic3p0KS4KKwkqIEZpeCBib290aW5nIG9uIG5vbi1wYXJ0aXRpb25lZCBkZXZpY2VzLgorCSogTUJSLCBpc29oeWJyaWQ6IFdvcmthcm91bmQgZm9yIGEgQklPUyBpc3N1ZSBvbiBBY2VyCisJICBUcmF2ZWxtYXRlIGFuZCBwb3NzaWJseSBvdGhlciBtYWNoaW5lcy4KKyAgICAgICAgKiBDT00zMjogQWRkaW5nIEFDUEkgcGFyc2luZyBsaWJhcnkKKyAgICAgICAgKiBIRFQ6IFJlbGVhc2UgMC40LjEgdG8gc3VwcG9ydCBBQ1BJIHBhcnNpbmcsIAorICAgICAgICAgIGltcHJvdmVkIG11dGxpLWNvcmUvY3B1IHJlcG9ydGluZyAKKwkqIExVQTogVXBkYXRpbmcgdG8gNS4xLjQtMgorCSogU1lTTElOVVg6IGNvcmUvZGlza3N0YXJ0LmluYzogUmVzZXQgRFMgYWZ0ZXIgY2hlY2tzdW0gaW4gY2FzZQorCSAgaXQgaXNuJ3QgMCAoR2VuZSBDdW1tKS4KKwkqIHdpbjY0OiBTY3JpcHQgdXBkYXRlIGZvciBhZGRpdGlvbmFsIG1pbmd3IGNvbXBpbGVyIG5hbWVzCisJICAoR2VuZSBDdW1tKS4KKwkqIGRpYWc6IE5ldyBkaXJlY3RvcnkgZm9yIGRpYWdub3N0aWMtcmVsYXRlZCB0b29scy4gIEFkZCBhCisJICBoYW5kb2ZmIE1CUi9WQlIgYW5kIGdlb21ldHJ5IGRpc3BsYXkgaW1hZ2VzIChHZW5lIEN1bW0pLgorCSogTUVNRElTSzogdXNlICJtZW09IiBwYXJhbWV0ZXIgdG8gbWFyayBhdmFpbGFibGUgbWVtb3J5IGFib3ZlCisJICB0aGlzIHBvaW50IGFzIHJlc2VydmVkIChjb3JlIGFscmVhZHkgZG9lcyBhbGlnbm1lbnQpIChHZW5lIEN1bW0pLgorCSogTUVNRElTSzogQWRkaXRpb25hbCBkaXNrIHByb2JlIGNoZWNrcyBhbmQgZGVidWcgb3V0cHV0CisJICAoU2hhbyBNaWxsZXIsIEdlbmUgQ3VtbSkuCisJKiBncHhlOiBhZGQgZ3B4ZWxpbnV4ay4wLCBiYXNlZCBvZmYgb2YgdW5kaW9ubHkua3B4ZSArIG5ldworCSAgc2NyaXB0IChHZW5lIEN1bW0pLgorCSogaXNvaHlicmlkOiBpbnN0YWxsIHRoZSBpc29oZHBmeCouYmluL2lzb2hkcHB4Ki5iaW4gZmlsZXMgdG8KKwkgIG1ha2UgaXNvaHlicmlkIGltYWdlcyBpbiBvbmUgc3RlcCB3aXRoIEdOVSB4b3JyaXNvLgorCSogUFhFTElOVVg6IGRpc2FibGUgYSBoYWNrIHRoYXQgd291bGQgbWFrZSBsb2NhbGJvb3Qgd29yayBvbgorCSAgc29tZSBtYWNoaW5lcywgYnV0IGJyZWFrIGp1c3QgYWJvdXQgYXMgbWFueS4gIFNvbWUgbWFjaGluZXMKKwkgIHdoaWNoIHdvcmtlZCB3aXRoICJsb2NhbGJvb3QgMCIgaW4gcHJldmlvdXMgdmVyc2lvbnMgbWF5CisJICBuZWVkICJsb2NhbGJvb3QgLTEiIGluIHRoaXMgb25lLiAgSWYgeW91IGhhdmUgYSBtYWNoaW5lCisJICB3aGljaCByZXF1aXJlcyAibG9jYWxib290IC0xIiwgYSBjb3B5IG9mIHRoZSBkbWlkZWNvZGUKKwkgIG9yIHN5c2R1bXAgb3V0cHV0IHdvdWxkIGJlIGFwcHJlY2lhdGVkLgorCSogSW5jbHVkZSBhIHNldCBvZiBkaWFnbm9zdGljcyBieSBHZW5lIEN1bW0uCisJKiBGaXhlcyBmb3IgZ2NjIDQuNiBhbmQgYmludXRpbHMgMi4yMS41MS4KKwkqIGNoYWluLmMzMjogQWxsb3cgInV1aWQiIGFzIGEgc3lub255bSB0byAiZ3VpZCIuCisJKiBIYW5kbGUgZGlyZWN0b3J5IG5hbWVzIHN0YXJ0aW5nIHdpdGggLi4gZm9yIHZmYXQgYW5kCisJICBpc285NjYwLgorCSogTmV3IE1FTlUgSElEREVOS0VZIGNvbW1hbmQgdG8gcHJvdmlkZSBhIG9uZS1rZXlzdHJva2Ugd2F5IHRvCisJICBhY3RpdmF0ZSBhIGJvb3Qgb3B0aW9uIGZyb20gYSBoaWRkZW4gbWVudSBpbnRybyBzY3JlZW4uCisKK0NoYW5nZXMgaW4gNC4wMzoKKwkqIERvbid0IGhhbmcgaWYgbm8gY29uZmlndXJhdGlvbiBmaWxlIGlzIGZvdW5kLgorCSogQmV0dGVyIHN1cHBvcnQgZm9yIGJvb3RpbmcgZnJvbSBNQlJzIHdoaWNoIGRvbid0IHBhc3MKKwkgIGhhbmRvdmVyIGluZm9ybWF0aW9uLgorCSogRVhUTElOVVg6IFRyeSB0byBiZSBzbWFydGVyIGFib3V0IGZpbmRpbmcgdGhlIHBhcnRpdGlvbgorCSAgb2Zmc2V0LgorCSogY2hhaW4uYzMyOiBzdXBwb3J0IGNoYWlubG9hZGluZyBEZWxsIFJlYWwgTW9kZSBLZXJuZWwgKEdlbmUKKwkgIEN1bW0pLgorCSogY2hhaW4uYzMyOiBmaXggYm9vdGluZyBpbiBDSFMgbW9kZS4KKwkqIHJvc2guYzMyIHVwZGF0ZWQgKEdlbmUgQ3VtbSkuCisJKiBGaXggdGhlIC1zIG9wdGlvbiB0byB0aGUgc3lzbGludXgvZXh0bGludXggaW5zdGFsbGVyIChBcndpbgorCSAgVm9zc2VsbWFuKS4KKwkqIGlzb2h5YnJpZDogZml4IHBhZGRpbmcgb2YgbGFyZ2UgaW1hZ2VzIChQSiBQYW5kaXQpLgorCitDaGFuZ2VzIGluIDQuMDI6CisJKiBTWVNMSU5VWDogY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgLWQgb3B0aW9uIGlzCisJICBzcGVjaWZpZWQgd2l0aCBhIG5vbi1hYnNvbHV0ZSBwYXRoLCBpLmUuICJzeXNsaW51eCAtZAorCSAgc3lzbGludXgiIGluc3RlYWQgb2YgInN5c2xpbnV4IC1kIC9zeXNsaW51eCIuCisJKiBJU09MSU5VWDogcmVjb2duaXplIHRoZSBkaXJlY3RvcnkgbmFtZXMgL2Jvb3Qvc3lzbGludXggYW5kCisJICAvc3lzbGludXgsIGFuZCB0aGUgZmlsZW5hbWUgc3lzbGludXguY2ZnIGluIGFkZGl0aW9uIHRvIHRoZQorCSAgaXNvbGludXgtc3BlY2lmaWMgbmFtZXMuICBUaHVzLCAic3lzbGludXguY2ZnIiBpcyBub3cgYQorCSAgZ2VuZXJpYyBuYW1lLCB3aGVyZWFzICJpc29saW51eC5jZmciIG9yICJleHRsaW51eC5jb25mIiBpcworCSAgc3BlY2lmaWMgdG8gZGlmZmVyZW50IGRlcml2YXRpdmUuCisJKiBjaGFpbi5jMzI6IHN1cHBvcnQgc2V0dGluZyBhbHRlcm5hdGUgY29uZmlnIGZpbGVuYW1lIGZvcgorCSAgc3RhZ2UyIG9mIEdSVUIgTGVnYWN5IChHZXJ0IEh1bHNlbG1hbnMpLgorCSogd2hpY2hzeXMuYzMyOiBleGVjdXRlIHNwZWNpZmljIGNvbW1hbmQsIGJhc2VkIG9uIFN5c2xpbnV4CisJICBib290bG9hZGVyIHZhcmlhbnQgKEdlcnQgSHVsc2VsbWFucykuCisJKiBsdWEuYzMyOiBhIGxvdCBvZiBuZXcgYmluZGluZ3MgYWRkZWQgdG8gdGhlICJzeXNsaW51eCIKKwkgIG5hbWVzcGFjZTogVkVTQSwgUENJLCBETUksIGtlcm5lbCBsb2FkaW5nIChNYXJjZWwgUml0dGVyKS4KKwkqIGJ0cmZzOiBwcmludCBhIGNvbXByZWhlbnNpdmUgZXJyb3IgbWVzc2FnZSBpZiBjb21wcmVzc2VkIG9yCisJICBlbmNyeXB0ZWQgZmlsZXMgYXJlIGVuY291bnRlcmVkIChuZWl0aGVyIGlzIGN1cnJlbnRseQorCSAgc3VwcG9ydGVkLikKKwkqIFNZU0xJTlVYOiBtdG9vbHMgaW5zdGFsbGVyOiBob25vciBUTVBESVIsIGVycm9yIG91dCBvbiBkaXNrCisJICBmdWxsLgorCSogSGFuZGxlIGZhbGxiYWNrcyBmcm9tIEVERCB0byBDSFMsIHRvIGRlYWwgd2l0aCBzeXN0ZW1zIHdoaWNoCisJICBhbm5vdW5jZSBFREQgc3VwcG9ydCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBpdC4KKwkqIFNZU0xJTlVYOiB0aGUgbXRvb2xzLCBET1MgYW5kIHdpbjMyIGluc3RhbGxlcnMgbm93IHVzZSB0aGUgbmV3CisJICBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKwkqIFBYRUxJTlVYOiBmaXggdGhlIHVzZSBvZiBJUCBhZGRyZXNzZXMgaW4gVEZUUCA6OiBvciB0ZnRwOi8vCisJICBob3N0IHN5bnRheC4KKwkqIFNZU0xJTlVYOiBleHBlcmltZW50YWwgV2luNjQgaW5zdGFsbGVyIChzeXNsaW51eDY0LmV4ZSkuCisKK0NoYW5nZXMgaW4gNC4wMToKKwkqIElTT0xJTlVYOiBmaXggaW5pdGlhbGl6YXRpb24gb24gc3lzdGVtcyB3aGljaCBkb24ndCB6ZXJvCisJICBsb3cgbWVtb3J5LgorCSogU1lTTElOVVgvRVhUTElOVVg6IGZpeCBoYW5kaW5nIG9mIGRpc2sgcmVhZCByZXRyaWVzIGluCisJICBFREQgbW9kZS4KKwkqIElTT0xJTlVYOiBjaGFuZ2UgdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIHRvIGF2b2lkCisJICBwcm9ibGVtcyB3aXRoIGNlcnRhaW4gKG9sZCkgQklPU2VzLiAgU3BlY2lhbCB0aGFua3MgdG8KKwkgIEhlbG11dCBIdWxsZW4gZm9yIGludmFsdWFibGUgZGVidWdnaW5nIHN1cHBvcnQuCisJKiBpZnBsb3AuYzMyOiBuZXcgbW9kdWxlIHdoaWNoIGRldGVjdHMgaWYgdGhlIFBMb1AgQm9vdCBMb2FkZXIKKwkgIGFscmVhZHkgaGFzIGJvb3RlZCBhIENEUk9NIG9yIFVTQiBkcml2ZSAoR2VydCBIdWxzZWxtYW5zKS4KKwkqIENvcnJlY3QgYSBzZXZlcmUgbWVtb3J5IG92ZXJ3cml0ZSBidWcsIHRyaWdnZXJlZCBwcmltYXJpbHkKKwkgIHdoZW4gc2VsZWN0aW5nIGEgdmVyeSBsb25nIGNvbW1hbmQgbGluZSBpbiB0aGUgbWVudSBzeXN0ZW0uCisJKiBsdWEuYzMyOiBMdWEgc2NyaXB0IGludGVycHJldGVyLCBjdXJyZW50bHkgZXhwZXJpbWVudGFsCisJICAoQWxleGV5IFpheXRzZXYsIE1hcmNlbCBSaXR0ZXIsIEdlZXJ0IFN0YXBwZXJzKS4KKwkqIFBYRUxJTlVYOiBuZXcgb3B0aW9uIElQQVBQRU5EIDQgdG8gYXBwZW5kIHRoZSBzeXN0ZW0gVVVJRCB0bworCSAgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCisJKiBQWEVMSU5VWDogZGlzcGxheSBCT09USUYgYW5kIFNZU1VVSUQgYXQgc3RhcnR1cCB0aW1lLCBhbmQKKwkgIHdoZW4gQ3RybC1OIGlzIHByZXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKworQ2hhbmdlcyBpbiA0LjAwOgorCSogTWFqb3IgY29kZSBiYXNlIGNoYW5nZXM7IGFsbCBmaWxlc3lzdGVtIHJld3JpdHRlbiBpbiBDLgorCSAgVGhpcyB3b3JrIHdhcyBkb25lIHByaW1hcmlseSBieSBMaXUgQWxlYXhhbmRlciAoWXVhbmhhbiBMaXUpLgorCSogRVhUTElOVVg6IGJ0cmZzIGFuZCBleHQ0IHN1cHBvcnQuICBidHJmcyBzdXBwb3J0IHdhcyBkb25lIGJ5CisJICBBbGVrIER1IG9mIEludGVsLgorCSogRVhUTElOVVggaXMgbm8gbG9uZ2VyIGEgc2VwYXJhdGUgZGVyaXZhdGl2ZTsgZXh0bGludXggYW5kCisJICBzeXNsaW51eCBib3RoIGluc3RhbGwgdGhlIHNhbWUgbG9hZGVyIChsZGxpbnV4LnN5cyk7IGZvciB0aGUKKwkgIExpbnV4LWJhc2VkIGluc3RhbGxlcnMgdGhlIGV4dGxpbnV4IGJpbmFyeSBpcyB1c2VkIGZvciBhCisJICBtb3VudGVkIGZpbGVzeXN0ZW07IHRoZSBzeXNsaW51eCBiaW5hcnkgZm9yIGFuIHVubW91bnRlZAorCSAgZmlsZXN5c3RlbS4KKwkqIFdoZW4gbG9hZGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgQ09ORklHCisJICBjb21tYW5kLCBvbmUgY2FuIG5vdyBhbHNvIHNwZWNpZnkgYSBuZXcgY3VycmVudCBkaXJlY3RvcnkKKwkgIHdpdGggYW4gQVBQRU5EIHN0YXRlbWVudC4KKwkqIEZ1bGwgQURWIHN1cHBvcnQgZm9yIFN5c2xpbnV4LCB0byBib290LW9uY2UgYW5kIE1FTlUgU0FWRQorCSAgd29ya3MuCisJKiBGdWxsIHN1cHBvcnQgb2YgR1BULXBhcnRpdGlvbmVkIGRpc2tzLCBpbmNsdWRpbmcgZGlza3MKKwkgIGFuZC9vciBwYXJpdGl0aW9ucyBsYXJnZXIgdGhhbiAyIFRpQiAoaWYgc3VwcG9ydGVkIGJ5IEJJT1MuKQorCSogVGhlIEdQVCBoYW5kb3ZlciBwcm90b2NvbCBhZGp1c3RlZCB0byB0aGUgY3VycmVudCBUMTMKKwkgIGNvbW1pdHRlZSBkcmFmdDsgc2VlIGRvYy9ncHQudHh0LgorCSogSERUOiBjb2RlIGNsZWFudXAsIHNtYWxsIGJ1Z2ZpeGVzCisJKiBUaGUgImxpbnV4IiBzeXNsaW51eCBpbnN0YWxsZXIgKHN5c2xpbnV4LW5vbXRvb2xzKSBub3cgaGFzIGEKKwkgIGNvbW1hbmQtbGluZSBzeW50YXggY2xvc2VyIHRvIHRoZSBleHRsaW51eCBpbnN0YWxsZXIuICBUaGUKKwkgIG10b29scywgZG9zIGFuZCB3aW4zMiBpbnN0YWxsZXJzIHdpbGwgZ2V0IHRoaXMgbmV3IHN5bnRheAorCSAgZXZlbnR1YWxseSwgYnV0IGl0IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCisJKiBjaGFpbi5jMzI6IHN1cHBvcnQgYm9vdGluZyBHUFQgcGFydGl0aW9ucyBieSBpbmRleCwgR1VJRCwgbGFiZWwuCisJKiBjaGFpbi5jMzI6IHN1cHBvcnQgYm9vdGluZyB0aGUgU3lzbGludXggcGFydGl0aW9uIHdpdGggImZzIi4KKwkqIGNoYWluLmMzMjogaW1wbGVtZW50IGdwdC50eHQgaGFuZC1vdmVyIHByb3RvY29sLgorCSogY2hhaW4uYzMyOiBzdXBwb3J0IGZvciBjaGFpbmxvYWRpbmcgR3J1YiBzdGFnZSAyLgorCSogUFhFTElOVVg6IFRGVFAgVVJMIHN5bnRheCAodGZ0cDovLykgc3VwcG9ydGVkIGV2ZW4gd2hlbiBub3QKKwkgIHJ1bm5pbmcgZ1BYRS9ncHhlbGludXguCisJKiBOZXcgbHMuYzMyIG1vZHVsZSB0byBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgZGlzayBmcm9tCisJICB0aGUgY29tbWFuZCBsaW5lLCBhbmQgcHdkLmMzMiB0byBkaXNwbGF5IHRoZSBjdXJyZW50CisJICBkaXJlY3RvcnkuCisJKiByb3NoLmMzMiAocmVhZCBvbmx5IHNoZWxsKSB1cGRhdGVkIGFuZCBob3BlZnVsbHkgdXNhYmxlLgorCSogUFhFTElOVVg6IFN1cHBvcnQgImxvY2FsYm9vdCAtMSIsIGp1c3QgbGlrZSB0aGUgb3RoZXIKKwkgIGRlcml2YXRpdmVzLgorCSogZ2Z4Ym9vdC5jb20gcmVtb3ZlZCBpbiBmYXZvciBvZiBnZnhib290LmMzMi4KKwkqIE5ldyBNRU5VIEhFTFAgc3RhdGVtZW50IHRvIGRpc3BsYXkgZnVsbHNjcmVlbiBoZWxwIHRleHQgYXMgYQorCSAgcmVzdWx0IG9mIGEgbWVudSBzZWxlY3Rpb24uCisJKiBtZW1kaXNrZmluZCB1dGlsaXR5IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgcGhyYW0gZHJpdmVyCisJICBpbiB0aGUgTGludXgga2VybmVsIHRvIG1vdW50IGEgbWVtZGlzay4KKyAgICAgICAgKiBpZmNwdS5jMzI6IEFkZGluZyB1c2FnZSB3aGVuIG5vIHBhcmFtZXRlcnMgYXJlIGdpdmVuLCAKKyAgICAgICAgICBhZGRpbmcgUEFFIHN1cHBvcnQuCisJKiBpZmNwdS5jMzIsIGlmY3B1NjQuYzMyOiBoYW5kbGUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCBwZXIKKwkgIHRhcmdldC4KKwkqIGlzb2h5YnJpZDogQyB2ZXJzaW9uIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgUGVybC4KKwkqIE5ldyBjb21tYW5kIE1FTlUgSU1NRURJQVRFIHRvIHBlcm1pdCBob3RrZXlzIHRvIGFjdGl2YXRlCisJICBpbW1lZGlhdGVseSB3aXRob3V0IG5lZWRpbmcgRW50ZXIuCisJKiBtZGlza2Noay5jb20gc3VwcG9ydHMgYSAtLW5vLXNlcXVlbnRpYWwgKG9yIC1uKSBvcHRpb24gdG8KKwkgIHN1cHByZXNzIHRoZSBjbGFzc2ljIGFsbC1kcml2ZS1wcm9iaW5nIGhldXJpc3RpYy4gIFVzZWZ1bAorCSAgb24gQklPU2VzIHdobyBjcmFzaC9oYW5nIHdoZW4gY2VydGFpbiBkcml2ZSBudW1iZXJzIGFyZQorCSAgcHJvYmVkLgorCSogRWxUb3JpdG8uU3lzIERPUyBkcml2ZXIgbm93IHNjYW5zIGRyaXZlIG51bWJlcnMgdXB3YXJkcworCSAgaW5zdGVhZCBvZiBkb3dud2FyZHMsIGluIG9yZGVyIHRvIGF2b2lkIGEgZmFpcmx5IGNvbW1vbgorCSAgYnVnIG9uIHNvbWUgQklPU2VzIHdoZXJlIHByb2JpbmcgZHJpdmUgMHhGRiBjYXVzZXMgYQorCSAgZmFpbHVyZS4KKwkqIE5BU00gMi4wMyBvciBsYXRlciByZXF1aXJlZCB0byBidWlsZC4gIDIuMDcgb3IgbGF0ZXIKKyAgICAgICAgICByZWNvbW1lbmRlZC4KKworQ2hhbmdlcyBpbiAzLjg2OgorCSogY2hhaW4uYzMyOiBmaXggY2hhaW5sb2FkaW5nIHRoZSBNQlIgb2YgYSBoYXJkIGRpc2sgKGJyb2tlbgorCSAgaW4gMy44NSkuCisJKiBtYm9vdC5jMzI6IHJlcG9ydCB0aGUgYm9vdCBsb2FkZXIgbmFtZSBpbiB0aGUgaW5mb3JtYXRpb24KKwkgIHN0cnVjdHVyZS4KKwkqIGNvbTMyOiBzZXQgYXJndlswXSBpbiBhIGNvbTMyIG1vZHVsZS4KKwkqIGNvcmU6IGFkZCBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIFhlbiBIVk0gb2xkZXIgdGhhbgorCSAgdmVyc2lvbiAzLjM6IGRpc2FibGUgaGFsdCBvbiB0aG9zZSBwbGF0Zm9ybXMuCisJKiBGaXggcHJvYmxlbXMgd2hlcmUgY2VydGFpbiBvcGVyYXRpb25zIGluIGNvbTMyIG1vZHVsZXMgd291bGQKKwkgIGNhdXNlIHRoZSBjb3JlIHRvIGJlbGlldmUgdGhlIHN5c3RlbSB3YXMgaWRsZS4KKwkqIE1FTURJU0s6IGZpeCBNQlIgZGV0ZWN0aW9uIHdoZW4gdXNlZCB3aXRoIGEgRE9TRU1VIGhlYWRlciBvcgorCSAgYW4gb2Zmc2V0LgorCSogTUVNRElTSzogZ2VuZXJhdGUgdGhlIG1CRlQgY2hlY2tzdW0gY29ycmVjdGx5LgorCitDaGFuZ2VzIGluIDMuODU6CisJKiBnUFhFTElOVVg6IHVwZGF0ZWQgdG8gZ1BYRSAxLjAuMC4gIGdQWEVMSU5VWCBjYW4gbm93IGRvIE5CUAorCSAgY2hhaW5sb2FkaW5nLCBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIHNlY29uZCBESENQLgorCSogdmVzYW1lbnUuYzMyOiB1bmJyZWFrIHRoZSBkZWZhdWx0ICJncmV5IGhvbGUiIGJhY2tncm91bmQuCisJKiBXZSBubyBsb25nZXIgaGF2ZSBhIGJ1aWx0LWluIGRlZmF1bHQgb2YgImxpbnV4IGF1dG8iLgorCSAgSW5zdGVhZCwgaWYgbm8gREVGQVVMVCBvciBVSSBzdGF0ZW1lbnQgaXMgZm91bmQsIG9yIHRoZQorCSAgY29uZmlndXJhdGlvbiBmaWxlIGlzIG1pc3NpbmcgZW50aXJlbHksIHdlIGRyb3AgdG8gdGhlIGJvb3Q6CisJICBwcm9tcHQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIChpZiBOT0VTQ0FQRSBpcyBzZXQsIHdlIHN0b3AKKwkgIHdpdGggYSAiYm9vdCBmYWlsZWQiIG1lc3NhZ2U7IHRoaXMgaXMgYWxzbyB0aGUgY2FzZSBmb3IKKwkgIFBYRUxJTlVYIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IGZvdW5kLikKKwkqIGNoYWluLmMzMjogc3VwcG9ydCBjaGFpbmxvYWRpbmcgR3J1YjRET1M7IHBhdGNoIGJ5IEdlcnQKKwkgIEh1bHNlbG1hbnMuCisJKiBOZXcgdG9vbDogc3lzZHVtcC5jMzIsIGNhbiBiZSB1c2VkIHRvIHByb2R1Y2Ugc3lzdGVtCisJICBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHZpYSB0ZnRwIG9yIHltb2RlbSAoc2VyaWFsIHBvcnQpLgorCSogInZnYT1jdXJyZW50IiBvbiB0aGUgTGludXggY29tbWFuZCBsaW5lIGlzIG5vdyBzdXBwb3J0ZWQuCisJKiBjaGFpbi5jMzI6IHN1cHBvcnQgZm9yIFdpbmRvd3MgUmVjb3ZlcnkgQ29uc29sZSwgdmlhIHRoZQorCSAgImNtbGRyPSIgb3B0aW9uLgorCSogY2hhaW4uYzMyOiBzaG91bGQgbm93IHN1cHBvcnQgbG9hZGluZyBOVExEUiBmcm9tIGRpZmZlcmVudAorCSAgdHlwZSBtZWRpYSB0aGFuIGxvYWRlZCBmcm9tLgorCSogY2hhaW4uYzMyOiBzdXBwb3J0IGNoYWlubG9hZGluZyB0byBhIEZBVC9OVEZTIHBhcnRpdGlvbiB3aXRoCisJICBpbnZhbGlkICJoaWRkZW4gc2VjdG9ycyIgdmlhIHRoZSAic2V0aGlkZGVuIiBvcHRpb24uCisJKiBtZW1kaXNrOiBmaXggdGhlIG1CRlQgQUNQSSB0YWJsZS4KKwkqIHZlc2FtZW51LmMzMjogaWYgdGhlIGltYWdlIGlzIHNtYWxsZXIgdGhhbiB0aGUgc2NyZWVuLCB0aWxlCisJICBpdCBhY3Jvc3MgdGhlIHdob2xlIHNjcmVlbi4KKwkqIG1rZGlza2ltYWdlOiAtcyBvcHRpb24gZm9yIHByb2R1Y2luZyBhIHNwYXJzZSBpbWFnZS4KKwkqIHZlc2FtZW51LmMzMjogc3VwcG9ydCBhcmJpdHJhcnkgcmVzb2x1dGlvbiBzZXR0aW5nIChiZXlvbmQKKwkgIEJJT1Mgc3VwcG9ydCkgb24gc29tZSBJbnRlbC1iYXNlZCB2aWRlbyBjaGlwc2V0cy4gIFRoaXMgY29kZQorCSAgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSAiOTE1cmVzb2x1dGlvbiIgdG9vbCBieQorCSAgU3RldmUgVG9tbGplbm92aWM7IHlvdXIgbWlsZWFnZSBtaWdodCB2YXJ5LgorCSAgCitDaGFuZ2VzIGluIDMuODQ6CisJKiBTWVNMSU5VWDogbWFrZSB0aGUgRE9TIGluc3RhbGxlciB3b3JrIGZvciBNUy1ET1MgNy54LzgueAorCSAgKFdpbjl4L01FKSBhZ2Fpbi4KKwkqIEhEVDogdXBkYXRlZCB0byB2ZXJzaW9uIDAuMy42IChudW1lcm91cyBjaGFuZ2VzLikKKwkqIG1ib290LmMzMjogbm93IHN1cHBvcnRzIHZpZGVvIG1vZGUgc2V0dGluZyBpZiByZXF1ZXN0ZWQgYnkKKwkgIHRoZSBpbWFnZS4KKwkqIE1FTURJU0s6IEZpeCBmbG9wcHkgaW1hZ2VzIG9mIFBDLURPUy4KKwkqIE1FTURJU0s6IEFkZCBzdXBwb3J0IGZvciBlbXVsYXRpb24gb2YgQ0QtUk9NIGltYWdlczsgcGF0Y2gKKwkgIGJ5IFNoYW8gTWlsbGVyLgorCSogTUVNRElTSzogQ29tcGx5IHdpdGggdGhlIFdpbjl4ICJzYWZlIGhvb2siIHN0YW5kYXJkLAorCSAgYWxsb3dpbmcgYSBwcm90ZWN0ZWQtbW9kZSBkcml2ZXIuCisJKiBNRU1ESVNLOiBOZXcgIm1CRlQiIEFDUEkgdGFibGUsIGJ5IGFuYWxvZ3kgd2l0aCB0aGUgaVNDU0kKKwkgIGlCRlQgdGFibGUuICBUaGlzIGFsbG93cyBkZXRlY3Rpb24gZnJvbSBhIHByb3RlY3RlZC1tb2RlCisJICBvcGVyYXRpbmcgc3lzdGVtIHdpdGhvdXQgRUREIHN1cHBvcnQuCisJKiAzMi1iaXQgdmVyc2lvbiBvZiB0aGUgZ2Z4Ym9vdCBsb2FkZXIgKGdmeGJvb3QuYzMyKSwgc28gZmFyCisJICBleHBlcmltZW50YWwuICBUaGlzIHdpbGwgcmVwbGFjZSBnZnhib290LmNvbSBpbiB0aGUgZnV0dXJlLgorCSogdmVzYW1lbnUuYzMyOiBuZXcgTUVOVSBSRVNPTFVUSU9OIGRpcmVjdGl2ZSB0byBzZXQgYSBzY3JlZW4KKwkgIHJlc29sdXRpb24gb3RoZXIgdGhhbiA2NDB4NDgwLgorCSogY2hhaW4uYzMyOiBhZGQgc3VwcG9ydCBmb3IgbG9hZGluZyBpc29saW51eC5iaW4uCisJKiBjaGFpbi5jMzI6IG1ha2Ugc3VyZSB0byBhbHdheXMgcmV0dXJuIHRvIHRleHQgbW9kZS4KKwkqIGVsdG9yaXRvLnN5czogRE9TIGRyaXZlciBmb3IgZ2VuZXJpYyBDRC1ST01zOyBieSBHYXJ5IFRvbmcKKwkgIGFuZCBCYXJ0IExhZ2Vyd2Vpai4KKworQ2hhbmdlcyBpbiAzLjgzOgorCSogUFhFTElOVVg6IGNsZWFyIG1lbW9yeSBiZWZvcmUgaGFuZGluZyBvdmVyIHRvIGEgY2hhaW5sb2FkZWQKKwkgIE5CUC4gIFRoaXMgbWF5IGhlbHAgYXZvaWQgYSBidWcgaW4gV2luZG93cyBSSVMuCisJKiBQWEVMSU5VWDogZml4IGxvY2FsYm9vdCBhZnRlciBOQlAgY2hhaW5sb2FkaW5nIG9uIGNlcnRhaW4KKwkgIEJJT1NlcyAoaW5jbHVkaW5nIEFTVVMgQThOLUUsIGJ1dCBwb3NzaWJseSBvdGhlcnMuKQorCSogY2hhaW4uYzMyOiBzdXBwb3J0IGNoYWlubG9hZGVkIGJvb3Rsb2FkZXJzIG9uIElTT0xJTlVYLgorCSogUFhFTElOVVg6IGFsbG93IGZpbGVuYW1lcyB1cCB0byAyNTEgY2hhcmFjdGVycy4KKwkqIE1FTURJU0s6IGZpeCBwcm9ibGVtcyBib290aW5nIGZyb20gVVNCIG9uIFRoaW5rcGFkcywgYW5kCisJICBwb3NzaWJseSBvdGhlciBtYWNoaW5lcyBvciBoYXJkd2FyZSBjb21iaW5hdGlvbnMuCisJKiBpc29oeWJyaWQ6IGZpeCB0aGUgLWlkIG9wdGlvbi4KKwkqIEhEVDogdXBkYXRlZCB0byB2ZXJzaW9uIDAuMy40LgorCSogTUVNRElTSzogdGhlIHN0YWNrIHNpemUgaXMgbm93IGNvbmZpZ3VyYWJsZSwgd2l0aCB0aGUgc3RhY2s9CisJICBvcHRpb24uCisJKiBTaW1wbGUgbWVudTogZml4IEN0cmwtVyAod29yZCBlcmFzZSkgaW4gY29tbWFuZC1saW5lIGVkaXQuCisJKiBTaW1wbGUgbWVudTogZml4IGNyYXNoIG9uIHNvbWUgcGxhdGZvcm1zLgorCSogR2Z4Ym9vdDogZml4ZXMgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nLgorCSogUFhFTElOVVg6IGFkZCBhIHRvb2wgdG8gb3ZlcnJpZGUgc3BlY2lmaWMgREhDUCBvcHRpb25zIHZpYQorCSAgdmFsdWVzIGhhcmRjb2RlZCBpbiB0aGUgcHhlbGludXguMCBmaWxlLiAgVGhlc2UgaGFyZGNvZGVkCisJICB2YWx1ZXMgY2FuIGJlIGVpdGhlciAiYmVmb3JlIERIQ1AiIChkZWZhdWx0cyBpZiBESENQIGRvIG5vdAorCSAgcHJvdmlkZSB2YWx1ZXMpLCBvciAiYWZ0ZXIgREhDUCIgKG92ZXJyaWRlcyBESENQKS4gIFRoZSB0b29sCisJICBweGVsaW51eC1vcHRpb25zIGNhbiBiZSB1c2VkIHRvIHNldCB0aGVzZSBvcHRpb25zLiAgVGhpcworCSAgZmVhdHVyZSBkb2VzIG5vdCBhcHBseSB0byBncHhlbGludXguMDsgd2hlbiB1c2VkIHdpdGggZ1BYRQorCSAgdGhpcyBpcyBiZXR0ZXIgaGFuZGxlZCBieSBtb2RpZnlpbmcgdGhlIGVtYmVkZGVkIHNjcmlwdC4KKworQ2hhbmdlcyBpbiAzLjgyOgorCSogaXNvaHlicmlkOiBmaXggdGhlIC1wYXJ0b2sgbG9naWMgZm9yIGxvYWRpbmcgZnJvbSBhIHBhcnRpdGlvbi4KKwkqIElTT0xJTlVYOiBkZWFsIHdpdGggc3lzdGVtcyB3aGljaCByZXR1cm4gZnJvbSBJTlQgMTNoIHdpdGgKKwkgIGludGVycnVwdHMgZGlzYWJsZWQuCisJKiBEbyBub3QgaW52b2tlIHRoZSBpZGxlIGhhbmRsZXIgZHVyaW5nIGxhcmdlIGZpbGUgbG9hZHMuCisJKiBTaW1wbGUgbWVudTogbWFrZSBPTlRJTUVPVVQgd29yayB3aXRoIE1FTlUgSElEREVOLgorCSogUFhFTElOVVg6IGhhbmRsZSBURlRQIHNlcnZlcnMgd2hpY2ggaGF2ZSBleHRyYSBOVUxzIGF0IHRoZQorCSAgZW5kIG9mIGFuIE9BQ0sgcGFja2V0LgorCitDaGFuZ2VzIGluIDMuODE6CisJKiBTaHVmZmxlcjogZml4IGJ1ZyBpbiByZWFsLW1vZGUgZW50cnkuICBUaGlzIGFmZmVjdGVkIGEKKwkgIG51bWJlciBvZiBtb2R1bGVzLCBwcm9iYWJseSBpbiByZWxhdGl2ZWx5IHVuaW1wb3J0YW50IHdheXMsCisJICBidXQgaXQgY29tcGxldGVseSBicm9rZSBsaW51eC5jMzIuCisJKiBJbXByb3ZlZCBwZXJmb3JtYW5jZS4KKwkqIEF0dGVtcHQgdG8gaGFsdCB0aGUgcHJvY2Vzc29yIHdoaWxlIGlkbGUuICBUaGlzIGNhbiBjYXVzZQorCSAgYmFkIHJlcG9uc2l2ZW5lc3Mgd2hlbiB1c2luZyBhIHNlcmlhbCBjb25zb2xlIGVzcGVjaWFsbHkgZm9yCisJICBhdXRvbWF0ZWQgaW5wdXQ7IGlmIHRoYXQgZW5kcyB1cCBiZWluZyBhIHByb2JsZW0sIHVzZSB0aGUKKwkgIG5ldyAiTk9IQUxUIDEiIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKwkqIGxpbnV4LmMzMiBub3cgc3VwcHJlc3NlcyBhbGwgbWVzc2FnZXMgaWYgdGhlICJxdWlldCIgZmxhZyBpcworCSAgc3BlY2lmaWVkLgorCSogaXNvaHlicmlkOiBhZGQgYSB2YXJpZXR5IG9mIG9wdGlvbnMsIGFuZCBhIGhlbHAgbWVzc2FnZS4KKwkqIElTT0xJTlVYOiBmaXggYm9vdGluZyBpbiBoeWJyaWQgbW9kZSB3aGVuIENCSU9TIGlzIHVzZWQuCisJICBUaGlzIHVuZm9ydHVuYXRlbHkgbWVhbnMgdGhhdCB0aGUgaXNvaHlicmlkIGhhbmRvZmYgcHJvdG9jb2wKKwkgIGhhcyBjaGFuZ2VkLCBzbyB0aGUgaXNvaHlicmlkIHV0aWxpdHkgbXVzdCB2ZXJzaW9uLW1hdGNoCisJICBpc29saW51eC5iaW4uCisJKiBEcm9wIHN1cHBvcnQgZm9yIEFDUEkgMyBleHRlbmRlZCBtZW1vcnkgZmxhZ3MuCisJKiBNZW51IHN5c3RlbTogZG9uJ3Qgc2V0IHRoZSBhdXRvY3IgZmxhZyBvbiB0aGUgc2VyaWFsCisJICBjb25zb2xlLgorCSogYWx0bWJyOiBmaXggaGFuZGxpbmcgb2YgbG9naWNhbCBwYXJ0aXRpb25zLgorCSogYWx0bWJyOiBjYXAgYXQgNDM5IGJ5dGVzIHNvIHRoZSBwYXJ0aXRpb24gc2VsZWN0IGJ5dGUgaXNuJ3QKKwkgIHBhcnQgb2YgdGhlIGZpbGUuCisKK0NoYW5nZXMgaW4gMy44MDoKKwkqIE5ldyBzaHVmZmxlciBtZWNoYW5pc20gYW5kIEFQSS4KKwkqIFJld3JpdHRlbiBtYm9vdC5jMzIgbW9kdWxlLgorCSogVGhlIHN5c2xpbnV4X2Jvb3RfbGludXgoKSBmdW5jdGlvbiBoYXMgYmVlbiBzaW1wbGlmaWVkLgorCSogRG9uJ3QgaGFuZyB0cnlpbmcgdG8gYm9vdCBhICJtZW51IHF1aXQiIGxhYmVsIGZyb20gdGhlIENMSS4KKwkqIEZpeCBwcm9ibGVtIHdpdGggYm9vdC1vbmNlICJzdGlja2luZyIgb24gc29tZSBCSU9TZXMuCisJKiBpc29oeWJyaWQ6IGZpeCBwcm9ibGVtIHdpdGggaW1hZ2VzIG92ZXIgMiBHQiBpbiBzaXplLgorCSogQVBNIHBvd2Vyb2ZmIG1vZHVsZSAocG93ZXJvZmYuY29tKSBieSBTZWJhc3RpYW4gSGVyYnN6dC4KKwkqIElTT0xJTlVYOiBmaXggdGhlIGhhbmRsaW5nIG9mIGxhcmdlIGRpcmVjdG9yaWVzLiAgQnVnIGZvdW5kCisJICBhbmQgZml4ZWQgYnkgU3RlZmZlbiBXaW50ZXJmZWxkdC4KKworQ2hhbmdlcyBpbiAzLjc1OgorCSogUFhFTElOVVg6IGZpeCB0aGUgImtlZXBweGUiIG9wdGlvbiwgd2hpY2ggd2FzIGJyb2tlbiBpbgorCSAgMy43NC4KKwkqIE1FTURJU0s6IGNvcnJlY3QgdGhlIGV4dHJhY3Rpb24gb2YgZ2VvbWV0cnkgaW5mb3JtYXRpb24gZnJvbQorCSAgdGhlIE1CUiBvZiBhIGhhcmQgZGlzayBpbWFnZSwgYWdhaW4gYnJva2VuIGluIDMuNzQuCisJKiBleHRsaW51eCgxKSBtYW4gcGFnZSBmcm9tIEJyaWFuIFBlbGxpbi4KKwkqIFNpbXBsZSBtZW51OiBNRU5VIFNBVkUgaXMgbm93IGNvbnRyb2xsYWJsZSBvbiBhIG1lbnUtYnktbWVudQorCSAgb3IgZW50cnktYnktZW50cnkgYmFzaXMuCisJKiBnUFhFTElOVVg6IGZpeCBpbnRlcnJ1cHQtZGlzYWJsaW5nIGJ1Zy4KKwkqIEhEVDogZml4IGxvY2t1cCBvbiBtYWNoaW5lcyB3aXRoIGNlcnRhaW4gUENJIGNvbmZpZ3VyYXRpb25zLgorCitDaGFuZ2VzIGluIDMuNzQ6CisJKiBOZXcgVUkgZGlyZWN0aXZlLCB3aGljaCBhbGxvd3MgYSBtb3JlIG5hdHVyYWwgd2F5IHRvIHNwZWNpZnkKKwkgIGEgbWVudSBzeXN0ZW0gKG9yIG5vdC4pICBXaXRoIHRoZSBVSSBkaXJlY3RpdmUgc3BlY2lmeWluZworCSAgdGhlIG1lbnUgc3lzdGVtLCB0aGUgREVGQVVMVCBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gc2VsZWN0CisJICB0aGUgZGVmYXVsdCBlbnRyeSBpbnNpZGUgdGhlIG1lbnVzLgorCSoga2JkbWFwLmMzMjogbmV3IG1vZHVsZSB0byBsb2FkIGEgbmV3IGtleWJvYXJkIG1hcAorCSAgZHluYW1pY2FsbHkuCisJKiBpc29oeWJyaWQ6IHdvcmthcm91bmQgYnVnIGluIHNvbWUgdmVyc2lvbnMgb2YgYmludXRpbHMuCisJKiBGaXggaXNzdWUgd2l0aCB0aGUgcGxhY2VtZW50IG9mIHRoZSBpbml0cmQgb24gc29tZSBtYWNoaW5lcy4KKwkqIGlmY3B1NjQ6IGZpeCBoYW5kbGluZyBvZiBsZXNzIHRoYW4gdGhyZWUgYXJndW1lbnRzLgorCSogRml4IGJ1ZyBpbiB0aGUgc2h1ZmZsZSBsaWJyYXJ5IHdoZW4gZGVhbGluZyB3aXRoIGEgdmVyeQorCSAgbGFyZ2UgbnVtYmVyIG9mIGZyYWdtZW50cy4KKwkqIERvY3VtZW50YXRpb24gZml4ZXMgYnkgVmljZW50ZSBKaW1lbmV6IEFndWlsYXIuCisJKiBnUFhFIHVwZGF0ZWQgdG8gdmVyc2lvbiAwLjkuNy4KKwkqIGhkdC5jMzI6IEhhcmR3YXJlIERldGVjdGlvbiBUb29sLCBhbiBpbnRlcmFjdGl2ZSBoYXJkd2FyZQorCSAgYW5hbHl6ZXIgbW9kdWxlIGJ5IEVyd2FuIFZlbHUuCisJKiBNRU1ESVNLOiBlbmFibGUgYXV0b21hdGljIGRldGVybWluYXRpb24gb2YgdGhlIGRpc2sgZ2VvbWV0cnkKKwkgIGZvciBhIGxhcmdlIGZsb3BweSBkaXNrIGltYWdlIGlmIChhbmQgb25seSBpZikgaXQgaXMKKwkgIGZvcm1hdHRlZCB3aXRoIGEgRkFUIGZpbGVzeXN0ZW0uCisJKiBTWVNMSU5VWDogZml4IHRoZSBoYW5kbGluZyBvZiAuYnNzIGZpbGVzIG9uIEZBVDEyLzE2LgorCSogU3VwcHJlc3MgdGhlIExvYWRpbmcgLi4uIG1lc3NhZ2UgaWYgInF1aWV0IiBpcyBzcGVjaWZpZWQgb24KKwkgIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCSogRml4IHRoZSB1c2Ugb2YgIkNPTlNPTEUgMCIgd2l0aCBtZW51LmMzMi4KKwkqIEFsbG93IENPTTMyIG1vZHVsZXMgdG8gYmUgYXdhcmUgb2YgYWxsIG1lbW9yeSBldmVuIGluIHRoZQorCSAgcHJlc2VuY2Ugb2YgYSBtZW1vcnkgaG9sZS4gIFRoZSAibGludXguYzMyIiBtb2R1bGUgY2FuIGJlCisJICB1c2VkIHRvIGxvYWQgYSBrZXJuZWwgKG9yIG1lbWRpc2spIHBsdXMgbGFyZ2UgaW5pdHJkIG9uCisJICBzdWNoIGEgc3lzdGVtLgorCSogTUJSOiBwcm9kdWNlIGFsdGVybmF0ZSBNQlIgdmFyaWFudHMgd2hpY2ggZm9yY2UgdGhlIGRyaXZlCisJICBudW1iZXIgdG8gaGQwIChfZiB2YXJpYW50cyksIG9yIGZvcmNlIHRoZSBkcml2ZSBudW1iZXIgdG8KKwkgIGhkMCBpZiB0aGUgQ3RybCBrZXkgaXMgcHJlc3NlZCAoX2MgdmFyaWFudHMuKSAgRnVydGhlcm1vcmUsCisJICBhZGQgYW4gTUJSIHZhcmlhbnQgKGFsdG1iciouYmluKSB3aGljaCBpZ25vcmVzIHRoZSBhY3RpdmUKKwkgIGZsYWcgYW5kIGluc3RlYWQgYm9vdHMgdGhlIHBhcnRpdGlvbiBudW1iZXIgc3BlY2lmaWVkIGluIHRoZQorCSAgYnl0ZSBhdCBvZmZzZXQgNDM5IGRlY2ltYWwuCisJKiBBZGQgSVBBUFBFTkQgc3RyaW5ncyB0byBjb20zMiBtb2R1bGVzLCBlc3BlY2lhbGx5IG5lZWRlZCBmb3IKKwkgIGxpbnV4LmMzMi4KKwkqIE5ldyBNRU5VIFNBVkUgZGlyZWN0aXZlIHdoaWNoIHNhdmVzIHRoZSBsYXRlc3QgbWVudQorCSAgc2VsZWN0aW9uIHVudGlsIHRoZSBuZXh0IGJvb3QuICBDdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCBmb3IKKwkgIEVYVExJTlVYLgorCSogZ2Z4Ym9vdC5jb206ICpleHBlcmltZW50YWwqIGludGVyZmFjZSBtb2R1bGUgdG8gU3RlZmZlbgorCSAgV2ludGVyZmVsZHQncyAiZ2Z4Ym9vdCIgZ3JhcGhpY2FsIGZyb250IGVuZAorCSAgKGh0dHA6Ly9nZnhib290LnNvdXJjZWZvcmdlLm5ldC8pLiAgTW9kdWxlIGJ5IFNlYmFzdGlhbiBIZXJic3p0LgorCitDaGFuZ2VzIGluIDMuNzM6CisJKiBVcGdyYWRlIGdQWEUgdG8gcmVsZWFzZSB2ZXJzaW9uIDAuOS41LgorCSogRml4IGEgbnVtYmVyIG9mIGJ1aWxkIGVycm9ycyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4KKwkqIEhhbmRsZSBzeXN0ZW1zIHdpdGggRTgyMCAiZXh0ZW5kZWQgYXR0cmlidXRlcyIgcGVyIEFDUEkgMy4KKwkgIFNvbWVvbmUgImNsZXZlcmx5IiBkZWNpZGVkIHRvIGNoYW5nZSB0aGUgRTgyMCBzcGVjIGluIGEKKwkgIGJhY2t3YXJkcy1pbmNvbXBhdGlibGUgbWFubmVyIQorCSogTUVNRElTSzogZGVmYXVsdCB0byAic2FmZWludCIuCisJKiBBZG9wdCB0aGUgbW9uaWtlciAiVGhlIFN5c2xpbnV4IFByb2plY3QiLCBzdGFuZGFyZCBwcm9wZXIKKwkgIG5vdW4gY2FwaXRhbGl6YXRpb24sIHRvIHJlZmVyIHRvIHRoZSBwcm9qZWN0IGFzIGEgd2hvbGUuCisJICBUaHVzLCByZXNlcnZlIHRoZSBhbGwtY2FwcyAiU1lTTElOVVgiIHRvIHJlZmVyIHRvIHRoZSBGQVQKKwkgIGxvYWRlci4KKwkqIG1ib290LmMzMjogYWRkICItc29sYXJpcyIgb3B0aW9uIHRvIHBhc3MgREhDUCBpbmZvcm1hdGlvbiB0bworCSAgdGhlIFNvbGFyaXMga2VybmVsOyByZXF1aXJlZCBmb3IgYXV0b21hdGljIFNvbGFyaXMgYm9vdAorCSAgd2l0aG91dCB1c2luZyBTb2xhcmlzJyBweGVib290IHByb2dyYW0uCisJKiBjb25maWcuYzMyOiB0cml2aWFsIENPTTMyIG1vZHVsZSB0byByZXN0YXJ0IFN5c2xpbnV4IHdpdGgKKwkgIGFub3RoZXIgY29uZmlndXJhdGlvbiBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoZXF1aXZhbGVudAorCSAgdG8gdGhlIENPTkZJRyBjb21tYW5kIGluIHRoZSBjb25maWd1cmF0aW4gZmlsZS4pCisKK0NoYW5nZXMgaW4gMy43MjoKKwkqIEluY2x1ZGUgdGhlIHB4ZWNoYWluLmNvbSBtb2R1bGUgZnJvbSBKZWZmZXJ5IEh1dHplbG1hbiBhdAorCSAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuICBUaGlzIGFsbG93cyBjaGFpbmluZyBhbm90aGVyCisJICBQWEUgYm9vdCBwcm9ncmFtIHdoaWxlIGNoYW5naW5nIHRoZSBESENQIHBhY2tldCBwYXNzZWQgdG8KKwkgIGl0LgorCSogUmVvcmdhbml6ZSB0aGUgTWFrZWZpbGUgc3lzdGVtLgorCSogTWFqb3IgUENJIGNvcmUgY2xlYW51cHMgYW5kIG90aGVyIHNvdXJjZSBjbGVhbnVwLgorCSogZ1BYRSBjb2RlIHVwZGF0ZWQuCisJKiBUcnkgdG8gYXZvaWQgbWVtb3J5LXNub29waW5nIGF0dGFja3Mgb24gcGFzc3dvcmRzLiAgTm90ZQorCSAgdGhhdCBpZiBzb21lb25lIGhhcyByb290IG9uIHRoZSBib3gsIHRoZXkgZ2VuZXJhbGx5IGRvbid0CisJICBuZWVkIHRvIGNvbXByb21pc2UgdGhlIGJvb3QgbG9hZGVyLi4uCisJKiBJU09MSU5VWDogZml4IGNyYXNoIHdoZW4gZ2l2ZW4gYSB6ZXJvLWxlbmd0aCBmaWxlLgorCSogc2RpLmMzMjogc3VwcG9ydCBnemlwcGVkIFNESSBpbWFnZXMuCisJKiBJU09MSU5VWDogc3VwcG9ydCBnZW5lcmF0aW5nIGltYWdlcyB3aGljaCBjYW4gYmUgZWl0aGVyCisJICBhIENELVJPTSBvciBhIGhhcmQgZGlzayAoVVNCIGRpc2ssIGV0Yy4pICBTZWUKKwkgIGRvYy9pc29saW51eC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisJKiBSZW1vdGUgZ2RiIHN1cHBvcnQgZm9yIENPTTMyIG1vZHVsZXM7IHBhdGNoIGZyb20gU3RlZmFuCisJICBIYWpub2N6aS4KKwkqIFN1cHBvcnQgYmVlcHMgaW4gRi1rZXkgaGVscCBpbiB0aGUgc2ltcGxlIG1lbnUgc3lzdGVtLgorCSogVGFiIGRpc3BsYXkgb2YgbGFiZWxzLCBiYXNlZCBvbiBhIHBhdGNoIGZyb20gU2ViYXN0aWFuCisJICBIZXJic3p0LiAgQ2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIE5PQ09NUExFVEUgY29uZmlndXJhdGlvbgorCSAgY29tbWFuZC4KKwkqICJtZW51IGRlZmF1bHQiIGNhbiBub3cgYmUgc3BlY2lmaWVkIGFmdGVyICJtZW51IGJlZ2luIiwgdG8KKwkgIGluZGljYXRlIHRoYXQgYSBzcGVjaWZpYyBzdWJtZW51IHNob3VsZCBiZSB0aGUgZGVmYXVsdCBlbnRyeS4KKworQ2hhbmdlcyBpbiAzLjcxOgorCSogV29ya2Fyb3VuZCBmb3IgYSBWRVNBIEJJT1Mgd2hpY2ggdHJpZXMgdG8gbWFrZSBET1Mgc3lzdGVtCisJICBjYWxscyghISkKKwkqIFNpbXBsZSBtZW51OiBmaXggbmF2aWdhdGlvbiBhcm91bmQgZGlzYWJsZWQgZW50cmllcworCSAgKG9yIGF0IGxlYXN0IHRyeSB0by4uLikKKwkqIEVYVExJTlVYOiBwcm9wZXIgZXJyb3IgbWVzc2FnZSB3aGVuIGNvbmZ1c2VkIGFib3V0IG1vdW50CisJICBwb2ludC4KKwkqIE1FTURJU0s6IGJlIHNtYXJ0ZXIgYWJvdXQgaW5jb21wbGV0ZWx5IGRpc2FibGVkIGZsb3BwaWVzIGluCisJICB0aGUgQklPUyBhbmQgYWJvdXQgYmVpbmcgdGhlIG9ubHkgZmxvcHB5LgorCSogT3B0aW9uYWxseSBhbGxvdyBpbml0cmQgdG8gYmUgc3BlY2lmaWVkIG9uIGEgc2VwYXJhdGUgbGluZQorCSAgcmF0aGVyIHRoYW4gYXMgcGFydCBvZiB0aGUgImFwcGVuZCIgbGluZS4gIFRoaXMgaXMgbm90CisJICByZWNvbW1lbmRlZCwgYnV0IGFwcGFyZW50bHkgbWFrZXMgbGlmZSBlYXNpZXIgZm9yIHNvbWUKKwkgIHRvb2xzLgorCSogU1lTTElOVVg6IGlmIG5vIGNvbmZpZyBmaWxlIGlzIHByZXNlbnQsIHNldCB0aGUgY3VycmVudAorCSAgZGlyZWN0b3J5IHRvIHRoZSByb290IGRpcmVjdG9yeSAoU2ViYXN0aWFuIEhlcmJzenQpLgorCSogY2hhaW4uYzMyOiBvcHRpb24gImhpZGUiIHRvIHN1cHBvcnQgaGlkaW5nIGFuZCB1bmhpZGluZyBvZgorCSAgcHJpbWFyeSBwYXJ0aXRpb25zIG9uIHRoZSBib290IGRyaXZlIHdpdGggRE9TLCBXaW4sIG9yIE9TLzIKKwkgIHBhcnRpdGlvbiB0eXBlcyAoMDEsIDA0LCAwNiwgMDcsIDBiLCAwYywgMGUpLgorCSogVW5icmVhayB0aGUgS0JETUFQIGNvbW1hbmQgKGJyb2tlbiBpbiAzLjcwKS4KKwkqIEVYVExJTlVYOiBmaXggdGhlIGhhbmRsaW5nIG9mIHRoZSBBRFYgd2hlbiB1c2luZyBDQklPUy4KKwkqIGlmY3B1NjQuYzMyOiBzaW1wbGUgQ09NMzIgbW9kdWxlIHRvIHNlbGVjdCBhIDMyLSBvciA2NC1iaXQKKwkgIGtlcm5lbCAoYW5kIG9wdGlvbmFsbHkgMzItYml0IGtlcm5lbHMgd2l0aCBvciB3aXRob3V0IFBBRS4pCisJICBFdmVudHVhbGx5IHdlIHdhbnQgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZm9yIHRoaXMKKwkgIGtpbmQgb2Ygc3R1ZmY7IGEgTHVhIG1vZHVsZSBpcyB1bmRlciBkZXZlbG9wbWVudC4KKwkqIEZpeCBwYXJzaW5nIG9mIHRoZSBTRVJJQUwgY29tbWFuZCB3aXRob3V0IGEgYmF1ZCByYXRlCisJICBzcGVjaWZpZWQuCisJKiBjaGFpbi5jMzI6IGVycm9yIG91dCB3aGVuIHRyeSB0byBib290IGFuIHVuYm9vdGFibGUKKwkgIHBhcnRpdGlvbi4KKwkqIFNZU0xJTlVYOiB3aGVuIGJ1aWxkaW5nIHRoZSBXaW4zMiBpbnN0YWxsZXIsIHNlYXJjaCBmb3IKKwkgIE1pbkdXIHVuZGVyIGEgbGFyZ2UgbnVtYmVyIG9mIHBvc3NpYmxlIG5hbWVzLgorCitDaGFuZ2VzIGluIDMuNzA6CisJKiBQWEVMSU5VWDogU3VwcG9ydCBlbmhhbmNlZCBjYXBhYmlsaXRpZXMgd2hlbiBydW5uaW5nIG9uIHRvcAorCSAgb2YgZ1BYRSAoaHR0cDovL3d3dy5ldGhlcmJvb3Qub3JnLykuICBJbiBwYXJ0aWN1bGFyLCBzdXBwb3J0CisJICBVUkwtc3R5bGUgc3ludGF4IGZvciBmaWxlbmFtZXMsIGFuZCBhbnkgcHJvdG9jb2wgdGhhdCBnUFhFCisJICBzdXBwb3J0cyAoZXhjZXB0LCBjdXJyZW50bHksIGlTQ1NJIGFuZCBBb0UuKSAgVGhpcyBmZWF0dXJlCisJICBpcyBjdXJyZW50bHkgaGlnaGx5IGV4cGVyaW1lbnRhbC4KKwkqIFN1YnN0YW50aWFsIGluZnJhc3RydWN0dXJlIGNoYW5nZXMgdG8gc3VwcG9ydCBmaWxlcyB3aG9zZQorCSAgbGVuZ3RoIGFyZW4ndCBrbm93biBhdCBvcGVuIHRpbWUgKHR5cGljYWxseSBuZXR3b3JrCisJICBjb25uZWN0aW9ucy4pICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzZW1hbnRpY3Mgb2Ygc29tZSBvZiB0aGUKKwkgIGNvbWJvb3QgQVBJcyBoYXZlIGNoYW5nZWQgc2xpZ2h0bHk7IHBsZWFzZSBzZWUgZG9jL2NvbWJvb3QudHh0LgorCSogUFhFTElOVVg6IFdlIG5vIGxvbmdlciByZXF1aXJlIGEgVEZUUCBzZXJ2ZXIgd2hpY2ggc3VwcG9ydHMKKwkgIHRoZSB0c2l6ZSBvcHRpb24gZm9yIGFsbCB0cmFuc2ZlcnMuCisJKiBQWEVMSU5VWDogSW50ZWdyYXRlIHdpdGggdGhlIGdQWEUgc291cmNlIGJhc2U7IHVuaWZpZWQgaW1hZ2UKKwkgIG5vdyBpbmNsdWRlZCBhcyAiZ3B4ZWxpbnV4LjAiLgorCSogVGhlIHNvdXJjZSB0cmVlIGhhcyBiZWVuIHJlc3RydWN0dXJlZDsgZmlsZXMgdGhhdCB3ZXJlCisJICBwcmV2aW91c2x5IGluIHRoZSByb290IGhhdmUgbW92ZWQgaW50byB0aGUgY29yZSwgZG9zLCBncHhlLAorCSAgYW5kIHV0aWxzIGRpcmVjdG9yaWVzLgorCSogIm1ha2UgaW5zdGFsbCIsICJtYWtlIG5ldGluc3RhbGwiLCBhbmQgIm1ha2UgZXh0Ym9vdGluc3RhbGwiCisJICBoYXZlIGJlZW4gdXBkYXRlZCBtYXNzaXZlbHkuICAibWFrZSBpbnN0YWxsLWFsbCIgbm93IGluc3RhbGxzCisJICBhbGwgdGhyZWUuCisJKiBDaGFuZ2UgZGVmYXVsdCBkaXIgZm9yIGF1eGlsaWFyeSBmaWxlcyBmcm9tCisJICAvdXNyL2xpYi9zeXNsaW51eCB0byAvdXNyL3NoYXJlL3N5c2xpbnV4LgorCSogU1lTTElOVVg6IFZGQVQgbG9uZyBmaWxlbmFtZSBzdXBwb3J0LgorCSogTUVNRElTSzogQW55IGltYWdlIGxlc3MgdGhhbiA0MDk2SyAoNCBNQikgaXMgdHJlYXRlZCBhcyBhCisJICBmbG9wcHkgZGlzay4gIFRoZSBnZW9tZXRyeS1ndWVzc2luZyBjb2RlIHdpbGwgcmVjb2duaXplIGFsbAorCSAgY29tbW9uIGV4dGVuZGVkIGZvcm1hdHMsIGJ1dCBpdCBpcyBzdGlsbCBwb3NzaWJsZSBzb21lIHZlcnkKKwkgIGV4b3RpYyBmb3JtYXRzIG5lZWQgZ2VvbWV0cnkgc3BlY2lmaWNhdGlvbi4gIExhcmdlIGZsb3BwaWVzCisJICBhbmQgdmVyeSBzbWFsbCBoYXJkZGlza3Mgc3RpbGwgbmVlZCBleHBsaWNpdCBzcGVjaWZpY2F0aW9uLgorCSogY2hhaW4uYzMyOiBvcHRpb24gInN3YXAiIHRvIHN1cHBvcnQgc3dhcHBpbmcgb2YgQklPUyBkcml2ZQorCSAgbnVtYmVycy4gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGJvb3QgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcworCSAgKERPUywgV2luZG93cykgZnJvbSBhIHNlY29uZGFyeSBkcml2ZS4KKwkqIGNoYWluLmMzMjogb3B0aW9uICJmaWxlPSIgdG8gc3VwcG9ydCBsb2FkaW5nIGEgYm9vdCBmaWxlIGZyb20KKwkgIHRoZSBTWVNMSU5VWCBmaWxlc3lzdGVtIGluc3RlYWQgb2YgbG9hZGluZyB0aGUgYm9vdCBzZWN0b3IKKwkgIGZyb20gdGhlIGRyaXZlLgorCSogY2hhaW4uYzMyOiBvcHRpb24gInNlZz0iIHRvIGNvbnRyb2wgdGhlIGxvYWQgbG9jYXRpb24uCisJKiBjaGFpbi5jMzI6IG9wdGlvbiAibnRsZHI9IiBhcyBhIHNob3J0aGFuZCBmb3IgInNlZz0weDIwMDAKKwkgIGZpbGU9IjsgdXNlIHRoaXMgdG8gbG9hZCBvbmUgb2YgV2luTlQncyBsb2FkZXJzOgorCisJICBjaGFpbi5jMzIgaGQwIDEgbnRsZHI9L01pbmlOVC9zZXR1cGxkci5iaW4KKworCSAgTm90ZSB0aGF0IHRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIHRoZSBTWVNMSU5VWCBmaWxlc3lzdGVtLgorCSogY2hhaW4uMzI6IG9wdGlvbnMgImZyZWVkb3M9IiBhbmQgIm1zZG9zPSIvInBjZG9zPSIgYXMKKwkgIHNob3J0aGFuZHMgZm9yICJzZWc9MHg2MCBmaWxlPSIgYW5kICJzZWc9MHg3MCBmaWxlPSIKKwkgIHJlc3BlY3RpdmVseTsgdXNlIHRoaXMgdG8gbG9hZCBGcmVlRE9TJ3Mga2VybmVsLnN5cywgTVMtRE9TJ3MKKwkgIGlvLnN5cyBvciBQQy1ET1MncyBpYm1iaW8uc3lzLgorCSogQ2hhbmdlIHRvIHRoZSBBMjAgYWxnb3JpdGhtIHdoaWNoICpNSUdIVCogaGVscCBzeXN0ZW1zIHRoYXQKKwkgIGhhdmUgc3lzdGVtcyB3aGljaCBmcmVlemUgd2hlbiBTeXNsaW51eCBpcyB1c2VkIHdpdGggVVNCCisJICBrZXlib2FyZHMuICBOb3RlIHRoYXQgdGhpcyBoYXMgYmVlbiBoYXJkIGRvIHZlcmlmeSwgc28gSQorCSAgd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGZlZWRiYWNrIG9uIGl0LgorCSogQ29tcGxleCBtZW51IHN5c3RlbTogdW5icmVhayBtZW51cyB3aGljaCBoYXMgdW5uYW1lZAorCSAgc3VibWVudXMsIGxpa2UgY29tcGxleC5jLgorCSogRml4IG5ld2xpbmUgb24gdGhlIHNlcmlhbCBwb3J0IGZvciBzb21lIGNvbTMyIG1vZHVsZXMuCisJKiBjaGFpbi5jMzI6IHN1cHBvcnQgImJvb3QiIGFzIHRoZSBkcml2ZSBzcGVjaWZpY2F0aW9uLAorCSAgaW5kaWNhdGluZyB0aGUgZHJpdmUgZnJvbSB3aGljaCBpdCB3YXMgYm9vdGVkCisJICAoZm9yIHN5c2xpbnV4L2V4dGxpbnV4KS4KKwkqIFNZU0xJTlVYL0VYVExJTlVYOiBzdXBwb3J0ICJsb2NhbGJvb3QiIHdpdGggdGhlIHNhbWUgZmVhdHVyZQorCSAgc2V0IGFzIElTT0xJTlVYLgorCSogQWRkIGFuIGV4cGVyaW1lbnRhbCBNQlIgZm9yIEdQVCBwYXJ0aXRpb24gdGFibGVzLgorCSogVXNlICQoQ0MpIHdoZW4gZGV0ZXJtaW5pbmcgY29tcGlsZSBmbGFncy4KKwkqIGNoYWluLmMzMjogZml4IGJvb3RpbmcgZnJvbSBsb2dpY2FsIHBhcnRpdGlvbnMgKFNlcmdleQorCSAgVmxhc292LikKKworQ2hhbmdlcyBpbiAzLjYzOgorCSogRml4IGVycm9ycyBpbiB0aGUgUENJIGFuZCBETUkgZGV0ZWN0aW9uIG1vZHVsZXMgKEVyd2FuIFZlbHUsCisJICBTZWJhc3RpYW4gSGVyYnN6dCkuCisJKiBGaXggaG9zdCBkZXBlbmRlbmNpZXMgYW5kIG90aGVyIGlzc3VlcyBpbiB0aGUgYnVpbGQgc3lzdGVtLgorCSogUFhFTElOVVg6IEFsbG93IGNsYXNzIEUgYWRkcmVzc2VzIGFzIHVuaWNhc3QuCisJKiBzZGkuYzMyOiBtb2R1bGUgdG8gbG9hZCBNaWNyb3NvZnQgU3lzdGVtIERlcGxveW1lbnQgSW1hZ2VzLgorCSAgRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWU6CisJICAgIGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM4Mzg1NDMuYXNweAorCSogRVhUTElOVVg6IENvcnJlY3QgcmVhZGluZyBkaXJlY3RvcmllcyB3aXRoIGRlbGV0ZWQgZW50cmllcy4KKwkqIFNodWZmbGUgbGlicmFyeTogY29ycmVjdCB0aGUgaGFuZGxpbmcgb2YgY2VydGFpbiBnZW9tZXRyaWVzCisJICAoYW4gdXB3YXJkIG1vdmUgd2l0aCBzb3VyY2UgbWF0ZXJpYWwgYmxvY2tpbmcgdGhlIG1vdmUpOyBhcworCSAgcmVxdWlyZWQgYnkgc2RpLmMzMiBidXQgdGhlb3JldGljYWxseSBwb3NzaWJsZSBmb3Igb3RoZXIKKwkgIGZvcm1hdHMgYXMgd2VsbC4KKwkqIEFkZCAibWFrZSBuZXRpbnN0YWxsIiB0byBpbnN0YWxsIC90ZnRwYm9vdC4KKwkqIEZpeCBzb21lIGRvY3VtZW50YXRpb24gZmlsZXMgdGhhdCBkaWRuJ3QgZ2V0IG1vdmVkL3JlbmFtZWQuCisKK0NoYW5nZXMgaW4gMy42MjoKKwkqIENsZWFuIHVwIGdhcmJhZ2UgYWZ0ZXIgImFib3J0ZWQuIiBtZXNzYWdlLgorCSogQ2xlYW4gdXAgbWVtZHVtcC5jb20gZmlsZW5hbWVzLgorCSogU3VwcG9ydCBTSEEyNTYgYW5kIFNIQTUxMiBlbmNyeXB0ZWQgcGFzc3dvcmRzLgorCSogVGhlIHNodWZmbGUgbGlicmFyeSBub3cgY2FuIGdlbmVyYXRlIGNoYWluZWQgZGVzY3JpcHRvcnMsCisJICB0aHVzIGFsbG93aW5nIHByZXR0eSBtdWNoIGFyYml0cmFyaWx5IGNvbXBsZXggbWVtb3J5IG1hcHMuCisJKiBIYW5kbGUgY29tbWFuZCBsaW5lcyB1cCB0byAyMDQ3IGNoYXJhY3RlcnMsIHRoZSBjdXJyZW50CisJICBMaW51eCBrZXJuZWwgbGltaXQuCisJKiB2ZXNhbWVudTogc3VwcG9ydCBzeXN0ZW1zIHdpdGhvdXQgbGluZWFyIGZyYW1lYnVmZmVyIHN1cHBvcnQKKwkgIChzaWdoLCB3aGF0IGlzIHRoaXMsIDE5OTM/KSBhbmQgMTUtYml0IFJHQiBtb2Rlcy4KKwkqIE1vdmUgdGhlIGxhYmVsIHN0b3JhZ2UgKGZvciB0aGUgY29tbWFuZC1saW5lIGludGVyZmFjZSkgdG8KKwkgIGhpZ2ggbWVtb3J5LCByZW1vdmluZyB0aGUgc2l6ZSBsaW1pdCBhbmQgZnJlZWluZyB1cCA2NEsgb2YKKwkgIGxvdyBtZW1vcnkuCisJKiBHZXQgcmlkIG9mIDQwOTYtZW50cnkgbGltaXQgaW4gdGhlIHNpbXBsZSBtZW51IHN5c3RlbS4KKwkqIE5ldyBoaWVyYXJjaGlhbCBzdWJtZW51IHN1cHBvcnQ6IHNlZSBNRU5VIEJFR0lOLCBNRU5VIEVORCwKKwkgIE1FTlUgR09UTyBpbiBkb2MvbWVudS50eHQuCisJKiBNRU5VIFFVSVQgYWxsb3dzIGNyZWF0aW5nIGEgbWVudSBlbnRyeSBmb3IgcmV0dXJuaW5nIHRvIHRoZQorCSAgY29tbWFuZCBsaW5lLgorCSogSVNPTElOVVg6IFdvcmsgYXJvdW5kIGJ1ZyBpbiBjZXJ0YWluIEFkYXB0ZWMgQklPU2VzLAorCSAgcGF0Y2ggYnkgQnJ1Y2UgUm9ic29uLgorCSogcG5ndG9wbm0gZGVwZW5kZW5jeSByZW1vdmVkIGZyb20gc2FtcGxlcy8gZGlyZWN0b3J5LgorCSogVGV4dCBkb2N1bWVudGF0aW9uIGZpbGVzIChpbiBkb2MvKSByZW5hbWVkICouZG9jIC0+ICoudHh0LgorCitDaGFuZ2VzIGluIDMuNjE6CisJKiBFWFRMSU5VWDogZml4IGNyYXNoIHdoZW4gYWNjZXNzaW5nIGFuIGVtcHR5IGZpbGUuCisJKiBlbGYuYzMyOiBJZiBhIFBIRFIgc2VnbWVudCBpcyBwcmVzZW50LCBsb2FkIGl0LgorCSogRml4IFNIQS0xIGFuZCBNRDUgcGFzc3dvcmRzLgorCSogSVNPTElOVVg6IGZpeCBib290aW5nIHdoZW4gbWFzdGVyZWQgd2l0aG91dAorCSAgbWtpc29mcyAtYm9vdC1pbmZvLXRhYmxlIChicm9rZW4gc2luY2UgMy41MCwgc2lnaC4uLikKKwkqIEhhbmRsZSBCSU9TZXMgd2hpY2ggZW1pdCBtdWx0aXBsZSBjb250aWd1b3VzIHZhbGlkCisJICBtZW1vcnkgcmVnaW9ucyBpbiB0aGUgZTgyMCBtYXAuCisKK0NoYW5nZXMgaW4gMy42MDoKKwkqIFN1cHBvcnQgZm9yICJhdXhpbGxpYXJ5IGRhdGEgdmVjdG9yIiwgYSBzbWFsbCBhbW91bnQgb2YKKwkgIHdyaXRhYmxlIHN0b3JhZ2UuICBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgZm9yIEVYVExJTlVYLAorCSAgYnV0IHRoZSBpbmZyYXN0cnVjdHVyZSBpcyB0aGVyZSBmb3IgdGhlIG90aGVyIGRlcml2YXRpdmVzLAorCSAgYXNzdW1pbmcgYSBzdWl0YWJsZSBzdG9yYWdlIGxvY2F0aW9uIGNhbiBiZSBmb3VuZC4KKwkqIEVYVExJTlVYOiBib290LW9uY2Ugc3VwcG9ydCAoLS1vbmNlLCAtLWNsZWFyLW9uY2UsIGFuZAorCSAgLS1yZXNldC1hZHYpLgorCSogQSBjb21tYW5kIGlzIG5vdyByZXF1aXJlZCB0byB0aGUgRVhUTElOVVggaW5zdGFsbGVyLCBpLmUuIGF0CisJICBsZWFzdCBvbmUgb2YgLS1pbnN0YWxsLCAtLXVwZGF0ZSwgLS1vbmNlLCAtLWNsZWFyLW9uY2UsIG9yCisJICAtLXJlc2V0LWFkdi4KKworQ2hhbmdlcyBpbiAzLjU1OgorCSogUFhFTElOVVg6IGFzIHBlciBSRkMgNTA3MSwgUFhFTElOVVggbm8gbG9uZ2VyIHJlcXVpcmVzIHRoZQorCSAgdXNlIG9mIHRoZSBtYWdpYyBjb29raWUgb3B0aW9uICgyMDgpIGZvciB1bmVuY2Fwc3VsYXRlZAorCSAgb3B0aW9ucy4gIEN1cnJlbnRseSBpdCBkb2VzIG5vdCByZXF1aXJlIGl0IGZvcgorCSAgdmVuZG9yLWVuY2Fwc3VsYXRlZCBvcHRpb25zICh2ZW5kb3Itb3B0aW9uLXNwYWNlKSBlaXRoZXIsCisJICBidXQgdGhhdCBNQVkgYmUgcmV2ZXJ0ZWQgaW4gdGhlIGZ1dHVyZSBpZiBpdCBjYXVzZXMKKwkgIHByb2JsZW1zLgorCSogRG9jdW1lbnRhdGlvbiB0ZXh0IGZpbGVzIG1vdmVkIHRvIGEgY29tbW9uICJkb2MiIGRpcmVjdG9yeTsKKwkgIG1hbiBwYWdlcyBmcm9tIHRoZSBEZWJpYW4gcHJvamVjdCBhZGRlZCB0byB0aGUgIm1hbiIKKwkgIGRpcmVjdG9yeS4KKwkqIENvcnJlY3QgYnVnIHdpdGggc2VsZi1vdmVybGFwcGluZyBtZW1vcnkgYXJlYXMgd2hlbiB1c2luZworCSAgdGhlIHNodWZmbGUgaW50ZXJmYWNlLgorCitDaGFuZ2VzIGluIDMuNTQ6CisJKiBBZGQgIm1lbnUgc2VwYXJhdG9yIiwgIm1lbnUgaW5kZW50IiwgIm1lbnUgZGlzYWJsZWQiCisJICAoc2VlIFJFQURNRS5tZW51KS4KKwkqIHZlc2FtZW51OiBmaXggaGFuZGluZyBvZiBWRVNBIG1vZGVzIHdpdGggbm9uY29udGlndW91cworCSAgbWVtb3J5IGJ1ZmZlcnMuICBJbiBwYXJ0aWN1bGFyLCBRZW11L0tWTSBzZXRzIHVwIHN1Y2ggYSBtb2RlCisJICB3aGVuIENpcnJ1cyBMb2dpYyBlbXVsYXRpb24gaXMgZW5hYmxlZCAod2hpY2ggaXMgdGhlCisJICBkZWZhdWx0LikKKwkqIFN1cHBvcnQgZm9yIGNhbGxpbmcgcmVhbCBtb2RlIGZ1bmN0aW9ucyB1c2luZyBmYXIgY2FsbHMsCisJICB3aXRoIGFyZ3VtZW50IG9uIHRoZSBzdGFjay4gIFRoaXMgd2FzIGltcGxlbWVudGVkIHRvIHN1cHBvcnQKKwkgIHRoZSBCSU9TIEJCUyBzcGVjaWZpY2F0aW9uLCBidXQgc3Vic2VxdWVudCBleHBlcmltZW50cyBzaG93CisJICB0aGF0IHRoZSBhdCBsZWFzdCBvbmUgb2YgdGhlIG1vc3QgY29tbW9uIEJJT1MgY29yZXMsIEF3YXJkLAorCSAgcGFzc2VzIHRoZSBwcmVzZW5jZSBjaGVjayBidXQgZG9lc24ndCBhY3R1YWxseSBpbXBsZW1lbnQgdGhlCisJICBmdW5jdGlvbmFsaXR5LgorCitDaGFuZ2VzIGluIDMuNTM6CisJKiBGaXggYnVncyByZWxhdGVkIHRvIHRoZSAkUG5QIEJJT1MgZnVuY3Rpb25hbGl0eSBvbiBzb21lCisJICBwbGF0Zm9ybXMuCisJKiBQWEVMSU5VWDogRml4IHRoZSAibmFrZWQiIHZlcnNpb24gb2YgOjogKHN1cHByZXNzIHByZWZpeC4pCisJKiBlbGYuYzMyOiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuCisJKiBGYXN0ZXIgb3BlcmF0aW9uIHVuZGVyIEludGVsIFZUIHZpcnR1YWxpemF0aW9uLgorCSogUFhFTElOVVg6IEZpeCBESENQIGJvb3RmaWxlIG9wdGlvbi4KKwkqIG1rZGlza2ltYWdlOiBTdXBwb3J0IG1vcmUgdGhhbiAxMDI0IGN5bGluZGVycy4KKwkqIChIb3BlZnVsbHkpIGZpeCBpbnN0YWxsZXIgb24gbm9uLXg4NiBwbGF0Zm9ybXMuCisJKiBGaXggc2h1ZmZsZV9hbmRfYm9vdF9ybSwgdXNlZCBieSBsaW51eC5jMzIuCisJKiBGaXggc2h1ZmZsZV9hbmRfYm9vdF9wbSBvbiAzODYvNDg2LgorCSogSVNPTElOVVggKGF0IGxlYXN0KTogZml4IGJzcyBtZW1vcnkgb3ZlcndyaXRlIGhhbmcuCisJKiBNQlI6IEZpeCBib290aW5nIGZyb20gbG9naWNhbCBwYXJ0aXRpb25zLgorCSogQ29kZSBjbGVhbnVwcy4KKworQ2hhbmdlcyBpbiAzLjUyOgorCSogSGFuZGxlIGNhcGl0YWxpemVkIEYta2V5IGNvbW1hbmRzIGluIHRoZSBtZW51IHN5c3RlbS4KKwkqIEZpeCBwYWRkaW5nIGVycm9yIHdoZW4gbG9hZGluZyBtdWx0aXBsZSByYW1kaXNrcy4KKwkqIFdvcmthcm91bmQgZm9yIFZNd2FyZSBjcmFzaGluZyB3aGVuIHRyeWluZyB0byBwcmludCBhCisJICBtZXNzYWdlIGR1cmluZyBlYXJseSBrZXJuZWwgYm9vdCAoZG9lcyBub3Qgc2VlbSB0byB3b3JrLAorCSAgY29uc2lkZXIgZGVsZXRpbmcuKQorCSogY2hhaW4uYzMyOiBhZGQgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIGZvciBhIHNwZWNpZmljIE1CUgorCSAgc2lnbmF0dXJlIGF0IHJ1bnRpbWUuCisJKiBGYWxsIGJhY2sgdG8gdGhlIHNlcnZlciBpZGVudGl0eSBvcHRpb24gaWYgdGhlIHNpYWRkciBmaWVsZAorCSAgaW4gdGhlIERIQ1AgaGVhZGVyIGlzbid0IHNldC4gIFRoaXMgc2VlbXMgdG8gbWF0Y2ggdGhlCisJICBiZWhhdmlvdXIgb2YgbW9zdCBQWEUgc3RhY2tzLgorCSogbWtkaXNraW1hZ2U6IGdpdmUgdGhlIGdlbmVyYXRlZCBkaXNrIGltYWdlIGFuIE1CUiBzaWduYXR1cmUuCisJKiBNRU1ESVNLOiBGaXggZmFpbHVyZXMgb24gc29tZSBCSU9TZXMuCisJKiBTaW1wbGUgbWVudSBzeXN0ZW06IG5ldyAiTUVOVSBISURERU4iIG9wdGlvbiB0byBub3QgZGlzcGxheQorCSAgdGhlIG1lbnUgdW5sZXNzIHRoZSB1c2VyIHByZXNzZXMgYSBrZXkuCisJKiBTaW1wbGUgbWVudSBzeXN0ZW06IHN1cHBvcnQgTUQ1LWVuY3J5cHRlZCBwYXNzd29yZHMgKG1vZGVybgorCSAgVW5peCBzdGFuZGFyZCBzdHlsZSwgd2l0aCAiJDEkIiBwcmVmaXhlcy4pCisJKiBwY2l0ZXN0LmMzMjogbm93IGZ1bmN0aW9ucyBhcyBhIGZ1bGwgImxzcGNpIi4gIFRoYW5rcyB0bworCSAgRXJ3YW4gVmVsdSBmb3IgdGhpcyB3b3JrLgorCSogTUVNRElTSzogTWFrZSBFREQgYWN0dWFsbHkgd29yay4KKwkqIElTT0xJTlVYOiBGaXggZm9yIGNlcnRhaW4gYnJva2VuIENELVJPTSBCSU9TZXMgd2hpY2gKKwkgIHJhbmRvbWx5IGNvcnJ1cHRlZCByZWdpc3RlciBGUy4KKwkqIFNpbXBsZSBtZW51IHN5c3RlbTogZml4IG1lbW9yeSBvdmVyd3JpdGUgYnVnIHRoYXQgY2F1c2VkCisJICBzb21lIHN5c3RlbXMgdG8gbG9jayB1cCBvciBiZWhhdmUgd2VpcmRseS4KKwkqIEZpeCBidWlsZGluZyBvbiA2NC1iaXQgc3lzdGVtcyB3aXRob3V0IGEgMzItYml0IGxpYmMgaW5zdGFsbGVkLgorCitDaGFuZ2VzIGluIDMuNTE6CisJKiBFWFRMSU5VWDogRml4IGZhaWx1cmUgdG8gZmluZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorCitDaGFuZ2VzIGluIDMuNTA6CisJKiBOZXcga2V5d29yZHMgYWxsb3cgdGhlIHR5cGUgb2YgZmlsZSB0byBiZSBzcGVjaWZpZWQgaW4gdGhlCisJICBjb25maWd1cmF0aW9uIGZpbGUuCisJKiBJdCBpcyBub3cgc3VwcG9ydGVkIHRvIGxvYWQgYSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBmaWxlCisJICB3aXRoIHRoZSBDT05GSUcga2V5d29yZC4KKwkqIEZpeCBBUEkgY2FsbCAweDAwMTkgKFJlYWQgRGlzay4pCisJKiBNRU5VIEFVVE9CT09ULCBNRU5VIFRBQk1TRywgTUVOVSBQQVNTUFJPTVBUIGFsbG93cworCSAgaW50ZXJuYXRpb25hbGl6YXRpb24gb2YgbWVudSBtZXNzYWdlcy4KKwkqIEEgbmV3IGZlYXR1cmUsIFRFWFQgSEVMUCwgYWxsb3dzIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHNldAorCSAgYSBtdWx0aS1saW5lIGhlbHAgbWVzc2FnZSBmb3IgaW5kaXZpZHVhbCBzZWxlY3Rpb25zLgorCSogRml4IEFQSSBjYWxsIDB4MDAxMiAoQ2xlYW51cCwgc2h1ZmZsZSBhbmQgYm9vdC4pCisJKiBOZXcgQVBJIGNhbGwgIkNsZWFudXAsIHNodWZmbGUgYW5kIGJvb3QgdG8gZmxhdCBwcm90ZWN0ZWQgbW9kZSIKKwkqIE5ldyBBUEkgY2FsbCAiQ2xlYW51cCwgc2h1ZmZsZSBhbmQgYm9vdCB0byByZWFsIG1vZGUiLAorCSAgc2ltaWxhciB0byBBUEkgY2FsbCAweDAwMTIgYnV0IGFsbG93cyBhcmJpdHJhcnkgcmVnaXN0ZXIgc2V0dGluZy4KKwkqIEludHJvZHVjZSBhIGxpYnJhcnkgaW50ZXJmYWNlIGZvciBsb2FkaW5nIGFyYml0cmFyeSBiaW5hcnkKKwkgIGZvcm1hdHMgd2l0aCByZWxhdGl2ZWx5IGVhc2lseSB1bmRlcnN0b29kIGNvZGUuICBTZWUKKwkgIHRoZSBlbGYuYzMyIG1vZHVsZSBmb3IgYW4gZXhhbXBsZSBvbiBob3cgdG8gdXNlIGl0LgorCSogTmV3IG1vZHVsZSAiZWxmLmMzMiIsIHRvIGxvYWQgYSBwcm90ZWN0ZWQtbW9kZSBFTEYga2VybmVsLgorCSogTUJSIChvbGQgYW5kIG5ldyk6IEZpeCBidWcgaW4gQ0hTIG1vZGUgd2hlbiBMQkEgPgorCSAgNjU1MzUqc2VjdG9ycy4KKwkqIHZlc2FtZW51OiBmaXggZGVjb2Rpbmcgb2YgcGFsZXR0aXplZCBQTkcgaW1hZ2VzLgorCSogVXBkYXRlIHRoZSBMaW51eCBrZXJuZWwgYm9vdCBwcm90b2NvbC4KKwkqIFBYRUxJTlVYOiBQcmVzcyBDdHJsLU4gYXQgdGhlIGJvb3QgcHJvbXB0IHRvIHJlYWQgb3V0IHRoZQorCSAgbmV0d29yayBpbmZvLgorCSogSW5zdGVhZCBvZiB0aGUgKG5vbi1leGlzdGVudCkgTUFDLCB1c2UgdGhlIGNsaWVudCBpZGVudGlmaWVyCisJICBmb3IgbmV0d29ya3MgbGlrZSBJbmZpbmliYW5kIGFuZCBGaXJld2lyZS8xMzk0LgorCSogQWRkIGEgbmV3IElOQ0xVREUgY29tbWFuZCB0byB0aGUgY29yZSBzeXNsaW51eCBwYXJzZXIuCisJKiBBbGxvdyBiaW5kaW5nIGhlbHAgdGV4dCB0byBGMTEgYW5kIEYxMi4KKwkqIEYta2V5IGhlbHAgbm93IGF2YWlsYWJsZSBpbiB0aGUgc2ltcGxlIG1lbnUgc3lzdGVtLgorCSogRGlzYWJsZWQgdGhlIHBvbGxpbmcgZm9yIEFSUCBkdXJpbmcgaWRsZS4gIEl0IGlzIHNpbXBseSB0b28KKwkgIHNsb3cgb24gc29tZSAoYnJva2VuISkgUFhFIHN0YWNrcy4KKwkqIFBYRUxJTlVYOiBhbHNvIHRyeSB0byBmZXRjaCB0aGUgY29uZmlnIGZpbGUgYmFzZWQgb24gVVVJRC4KKwkqIFNZU0xJTlVYL0VYVExJTlVYOiBOZXcgUkFJRCBtb2RlICgtcikgd2hpY2ggY2FsbHMgdGhlIEJJT1MKKwkgIHRvIGxvYWQgdGhlIG5leHQgZGV2aWNlICh0eXBpY2FsbHkgdGhlIG5leHQgZHJpdmUpIG9uIGJvb3QKKwkgIGZhaWx1cmUuCisKK0NoYW5nZXMgaW4gMy4zNjoKKwkqIE1FTURJU0s6IERpc2FibGUgRUREIGJ5IGRlZmF1bHQgb24gZmxvcHB5IGRpc2tzLiAgRUREIGNhbiBiZQorCSAgZW5hYmxlZCB3aXRoIHRoZSAiZWRkIiBvcHRpb24gYW5kIGRpc2FibGVkIHdpdGggIm5vZWRkIi4KKwkgIFRoaXMgKGhvcGVmdWxseSkgc2hvdWxkIG1ha2UgR2hvc3Qgd29yayBhZ2Fpbi4KKwkqIFNZU0xJTlVYOiAidW5peCIgaW5zdGFsbGVyIG5vdyB1c2VzIExpbnV4IGlvY3RscyBpbnN0ZWFkIG9mCisJICB1c2luZyBsaWJmYXQuCisJKiBOZXcgTUJSIHdoaWNoIGNhbiBib290IGZyb20gbG9naWNhbCBwYXJ0aXRpb25zLgorCSogU1lTTElOVVg6IEZpeCBidWcgaW4gZGV0ZWN0aW5nIHNwZWNpYWwgZXh0ZW5zaW9ucyB3aGljaCB3YXMKKwkgIGludHJvZHVjZWQgaW4gMy4zNSA6KAorCSogUFhFTElOVVg6IFVuYnJlYWsgY2hhaW5ib290aW5nIEZyZWVCU0QgKGFuZCBwb3NzaWJseSBvdGhlcnMuKQorCitDaGFuZ2VzIGluIDMuMzU6CisJKiBNRU1ESVNLOiBOZXcgInNhZmVpbnQiIG1vZGUuCisJKiBNRU1ESVNLOiBCZSBtb3JlIGNvbXBsaWFudCB3aXRoIHRoZSBQblAgQklPUyBzcGVjLgorCSogTUVNRElTSzogVHVybiBvbiBFREQgc3VwcG9ydCBieSBkZWZhdWx0LgorCSogTUVNRElTSzogVHJ5IHRvIHdvcmsgb24gc29tZSBtYWNoaW5lcyBvbiB3aGljaCBpdCB3b3VsZCBub3QKKwkgIHdvcmsgd2hlbiB0aGVyZSB3YXMgbm8gZmxvcHB5IGRyaXZlIGluIHRoZSBzeXN0ZW0uCisJKiBTaW1wbGUgbWVudSBzeXN0ZW06IGZpeCBzZXJpYWwgY29uc29sZSBzdXBwb3J0IChicm9rZW4gaW4KKwkgIDMuMzApLgorCSogU1lTTElOVVg6IFN1cHBvcnQgc3ViZGlyZWN0b3JpZXMuICBMaWtlIElTT0xJTlVYLCB0aGUKKwkgICJjdXJyZW50IGRpcmVjdG9yeSIgaXMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBzeXNsaW51eC5jZmcKKwkgIGlzIGZvdW5kOyB0aGlzIGlzIHNlYXJjaGVkIGZvciBpbiB0aGUgc2VxdWVuY2UKKwkgIC9ib290L3N5c2xpbnV4LCAvc3lzbGludXgsIC8uICBBcyBhIHNpZGUgYmVuZWZpdCwgbGFiZWwgbmFtZXMKKwkgIGxpa2UgImxpbnV4LTIuNi4xOCIgYW5kICJsaW51eC0yLjYuMTkiIGFyZSBub3cgc3VwcG9ydGVkLgorCisJICBUbyBpbnN0YWxsIGxkbGludXguc3lzIGluIGEgc3ViZGlyZWN0b3J5LCBwYXNzIHRoZSAtZAorCSAgZGlyZWN0b3J5IG9wdGlvbiB0byB0aGUgU1lTTElOVVggaW5zdGFsbGVyLgorCisJICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBzbGF4Lm9yZyAodGhhbmtzLCBUb21hcyEpCisJKiBOZXcgQVBJIGNhbGw6IHJlYWQgZGlzay4KKwkqIEludm9rZSBPTkVSUk9SIG9uIGluaXRyZCBsb2FkIGZhaWx1cmUuCisKK0NoYW5nZXMgaW4gMy4zMToKKwkqIFRoZSBzaW1wbGUgbWVudSBzeXN0ZW0gKG1lbnUuYzMyIGFuZCB2ZXNhbWVudS5jMzIpIG5vdworCSAgc3VwcG9ydCBsb2FkaW5nIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBmaWxlIGF0IGEgdGltZSwKKwkgIHVzaW5nIE1FTlUgSU5DTFVERSBvciBieSBzcGVjaWZ5aW5nIG11bHRpcGxlIGZpbGVuYW1lcy4KKwkqIFRoZSBNRU5VIENPTE9SIHN0YXRlbWVudCBjYW4gbm93IGNvbnRyb2wgdGhlIHNoYWRvd2luZyBtb2RlLgorCitDaGFuZ2VzIGluIDMuMzA6CisJKiBsaWJjb20zMiBleHRlbmRlZCB0byBzdXBwb3J0IGdyYXBoaWNzIG1vZGUgYW5kIGdyYXBoaWNhbCBjb25zb2xlLgorCSogdmVzYW1lbnUuYzMyLCBuZXcgZ3JhcGhpY2FsIHZlcnNpb24gb2YgdGhlIFNpbXBsZQorCSAgTWVudSBTeXN0ZW0sIHNlZSBSRUFETUUubWVudS4KKwkqIE5ldyBjb20zMiBtb2R1bGVzIGJ5IEVyd2FuIFZlbHUgZG8gc2VsZWN0aW9uIGJhc2VkIG9uIENQVUlECisJICBvciBQQ0kgZGV2aWNlcyBwcmVzZW50LgorCSogUlBNIHNwZWM6IGFkZCBzeXNsaW51eC10ZnRwYm9vdCBtb2R1bGU7IG1vdmUgc3lzbGludXggYnkKKwkgIGRlZmF1bHQgdG8gdGhlIC91c3Ivc2hhcmUvc3lzbGludXggZGlyZWN0b3J5LgorCSogUlBNIHNwZWM6IGV4dGxpbnV4IGlzIG5vdyBhIHNlcGFyYXRlIHBhY2thZ2UuCisKK0NoYW5nZXMgaW4gMy4yMDoKKwkqIEVYVExJTlVYOiBOZXcgb3B0aW9ucyAtLWluc3RhbGwgKC1pKSBhbmQgLS11cGRhdGUgKC1VKSwgdG8KKwkgIG1ha2UgaXQgY2xlYXIgaWYgYSBib290IGxvYWRlciBzaG91bGQgYmUgaW5zdGFsbGVkIG9yCisJICB1cGRhdGVkLiAgRm9yIG5vdywgZGVmYXVsdHMgdG8gLS1pbnN0YWxsIGZvciBjb21wYXRpYmlsaXR5OworCSAgYSBmdXR1cmUgdmVyc2lvbiB3aWxsIHJlcXVpcmUgb25lIG9mIHRoZXNlIG9wdGlvbnMuCisJKiBOZXcgbGlicmFyeSBmdW5jdGlvbnMgdG8gbG9hZCBhbmQgcGxhY2UgZmlsZXMgaW4gbWVtb3J5LgorCSogbWJvb3QuYzMyIGJ1ZyBmaXhlcy4KKwkqIFJlbW92ZSA4IE1CIGtlcm5lbCBzaXplIHJlc3RyaWN0aW9uLgorCSogQWRkICJrbGliYyIgdGFyZ2V0IGZvciBidWlsZGluZyB1bml4L3N5c2xpbnV4IGFuZAorCSAgZXh0bGludXgvZXh0bGludXggd2l0aCBrbGNjIChrbGliYy0xLjQuMjcgb3IgbGF0ZXIuKQorCSogUFhFTElOVVg6IEZhaWwgKGFuZCBldmVudHVhbGx5IHJlYm9vdCkgaWYgbm8gY29uZmlndXJhdGlvbgorCSAgZmlsZSB3YXMgZm91bmQuCisJKiBDT00zMiBtb2R1bGUgYnkgRXJ3YW4gVmVsdSB0byBtYWtlIGRlY2lzaW9ucyBiYXNlZCBvbiBETUkKKwkgIGluZm8uCisJKiBGaXggaXNzdWUgd2hlcmUgZ29pbmcgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBtZW51cyBhIGxvdAorCSAgd291bGQgY2F1c2UgYSBoYW5nLgorCSogSVNPTElOVVg6IEZpeCBidWcgd2hpY2ggbWFkZSAiY2QgYm9vdCBzZWN0b3JzIiBub3Qgd29yay4KKworQ2hhbmdlcyBpbiAzLjExOgorCSogTUVNRElTSzogRml4IGJ1ZyBieSB3aGljaCBhY2Nlc3NpbmcgdGhlIHJlYWwgZmxvcHB5IGRpc2sKKwkgIGFzIEI6IGluIE1TLURPUyB3YXMgYnJva2VuLgorCSogU2ltcGxlIG1lbnUgc3lzdGVtOiBhbGxvdyB0d2Vha2luZyBvZiB0aGUgc2NyZWVuIGxheW91dC4KKwkqIFNpbXBsZSBtZW51IHN5c3RlbTogYmV0dGVyIGNvbW1hbmQtbGluZSBlZGl0aW5nLCBjb3JyZWN0bHkKKwkgIGhhbmRsZSBjb21tYW5kIGxpbmVzIGFib3ZlIDI1NiBjaGFyYWN0ZXJzLgorCSogUFhFTElOVVg6IHJldmVydCBtZW1vcnkgYWxsb2NhdGlvbiBjaGFuZ2UgdGhhdCBjYXVzZWQKKwkgIHByb2JsZW1zIG9uIHNvbWUgbmV0d29yayBjYXJkcy4KKwkqIE1FTURJU0s6IFRyeSB3b3JrIGFyb3VuZCBhIGJ1ZyBvbiBzb21lIEJJT1NlcyB3aGVuIG5vCisJICBwaHlzaWNhbCBmbG9wcHkgZGlzayBpcyBwcmVzZW50IGluIHRoZSBzeXN0ZW0uCisJKiBFbmFibGUgdGhlIDE2NTUwQSBGSUZPcywgaWYgcHJlc2VudCwgd2hlbiBkb2luZyBzZXJpYWwKKwkgIGNvbnNvbGUuCisJKiBOZXcgInRvdGFsdGltZW91dCIgY29tbWFuZCBlc3RhYmxpc2hlcyBhIHRpbWVvdXQgd2l0aG91dAorCSAgcmVnYXJkIGZvciBhbnkgdXNlciBpbnB1dC4KKwkqIFNpbXBsZSBtZW51IHN5c3RlbTogdGltZW91dCBiZWhhdmlvdXIgbm93IG1vcmUgaW4gbGluZSB3aXRoCisJICB1c2VyIGV4cGVjdGF0aW9ucy4KKwkqIFNpbXBsZSBtZW51IHN5c3RlbTogIm9udGltZW91dCIgc2hvdWxkIG5vdyB3b3JrIGNvcnJlY3RseS4KKworQ2hhbmdlcyBpbiAzLjEwOgorCSogZ2NjIDQuMC4xIGNvbXBpbGF0aW9uIGZpeGVzLgorCSogQWRkIHN1cHBvcnQgZm9yIHF1ZXJ5aW5nIHRoZSBQQ0kgQklPUyBpbiBsaWJjb20zMgorCSAgKHVzZWQgYnkgZXRoZXJzZWwgZXQgYWwuKQorCSogRml4IFBDSSBoYW5kaW5nIChldGhlcnNlbCBldGMpIG9uIHNldmVyYWwgb2xkIGNoaXBzZXRzIChhbmQKKwkgIFZNV2FyZS4pCisJKiBUcnkgdG8gZGVhbCB3aXRoIHN5c3RlbXMgd2l0aCBicm9rZW4gRUJJT1MuCisJKiBOZXcgQVBJIGNhbGwgdG8gZG8gImxvY2FsYm9vdCIuCisJKiBOZXcgQVBJIGNhbGwgdG8gcXVlcnkgZmVhdHVyZXMuCisJKiBOZXcgQVBJIGNhbGwgdG8gcnVuIGtlcm5lbCBpbWFnZSwgYSBsb3dlci1sZXZlbCBjYWxsIHRoYW4KKwkgICJydW4gY29tbWFuZCIuICBTZWUgY29tYm9vdC5kb2MuCisJKiBGaXggZm9yIGJ1ZyBpbiBFQklPUyBjb2RlIGRpc2NvdmVyZWQgYnkgQXJ3aW4gVm9zc2VsbWFuLgorCSogTk9FU0NBUEUgc2VjdXJpdHkgZml4LgorCSogQ29tbWVudHMgYXJlIG5vdyByZWNvZ25pemVkIGV2ZW4gd2l0aG91dCBhIHNwYWNlIGZvbGxvd2luZyAjLgorCSogRml4IGluY29ycmVjdCBoYW5kbGluZyBvZiBtaXhlcyBvZiBlbnRyaWVzIHdpdGggYW5kIHdpdGhvdXQKKwkgIE1FTlUgUEFTU1dELgorCSogVGhlIGlkbGUgQVBJIGNhbGwgbm93IGhhcm1sZXNzbHkgcmV0dXJucyBmYWlsdXJlIGlmIGl0IGlzIGEKKwkgIG5vLW9wLiAgVGhhdCB3YXkgdGhlIGNhbGxlciBjYW4gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvCisJICBib3RoZXIgaW52b2tpbmcgaXQgYWdhaW4uCisJKiBUZW1wb3JhcmlseSBkaXNhYmxlIHRoZSBpZGxlIEFQSSBjYWxsIG9uIFBYRUxJTlVYLCBkdWUgdG8KKwkgIHNvbWUgcGxhdGZvcm1zIG9uIHdoaWNoIHRoZSBpZGxlIEFQSSBjYWxsIHNlZW1zIHRvIGhhbmc7IHRoaXMKKwkgIHByb2JsZW0gaGFzIG5vdCB5ZXQgYmVlbiBkZWJ1Z2dlZC4KKwkqIE1FTURJU0s6IHRoZSBoYW5kbGluZyBvZiBET1NFTVUtaGVhZGVyZWQgaW1hZ2VzIHdhcyBicm9rZW47CisJICBmaXggaXQuCisJKiBFWFRMSU5VWDogc3ltbGlua3MgYXJlIG5vdyBzdXBwb3J0ZWQuCisJKiBTaW1wbGUgbWVudSBzeXN0ZW06IE4gYW5kIFAgbm93IHdvcmsgY29ycmVjdGx5IGFzIGhvdGtleXMuCisJKiBNRU1ESVNLOiBtb3JlIEJJT1MgYnVnIHdvcmthcm91bmRzLgorCitDaGFuZ2VzIGluIDMuMDk6CisJKiBnY2M0IGNvbXBpbGF0aW9uIGZpeC4KKwkqIDxCRUw+IChDdHJsLUcpIGluIG1lc3NhZ2UgZmlsZXMgbm93IGNhdXNlcyBhIGJlZXAuCisJKiBSZWR1Y2UgdGhlIGNvbW1hbmQgbGluZSB0byA1MTEgY2hhcmFjdGVyczsgMTAyMyBjYXVzZWQKKwkgIG1lbW9yeSBvdmVyZmxvd3MuCisKK0NoYW5nZXMgaW4gMy4wODoKKwkqIFNZU0xJTlVYOiBGaXggcGVyZm9ybWFuY2UgcmVncmVzc2lvbiAoLXMgbW9kZSBhbHdheXMKKwkgIGVuYWJsZWQuKQorCSogQWRkIEFQSSBmdW5jdGlvbiBmb3IgaWRsZSBsb29wLgorCSogbGlidXRpbDogQWRkIGRvX2lkbGUoKSBmdW5jdGlvbiBmb3IgaWRsZSBsb29wLCBtYWtlCisJICBnZXRfa2V5KCkgdXNlIGl0LgorCSogbGlidXRpbDogQWRkIFNIQS0xIGFuZCBiYXNlNjQgZnVuY3Rpb25zLgorCSogU2ltcGxlIG1lbnUgc3lzdGVtOiBhZGQgcGFzc3dvcmQgc3VwcG9ydC4KKwkqIEVYVExJTlVYOiBTcGFyc2UgZmlsZXMgbm93IGhhbmRsZWQgY29ycmVjdGx5LgorCSogRVhUTElOVVg6IExhcmdlIGRpcmVjdG9yaWVzIG5vdyBoYW5kbGVkIGNvcnJlY3RseS4KKwkqIEFMTDogQXQgdGhlIHByb21wdCwgQ3RybC1YIG5vdyBmb3JjZXMgdGV4dCBtb2RlLgorCSogRml4IGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nIGVycm9yLCB0aGF0IGNvdWxkIGNhdXNlCisJICBoYW5ncy4KKwkqIFJld3JpdHRlbiBhZHZhbmNlZCBtZW51aW5nIHN5c3RlbSBmcm9tIE11cmFsaSBHYW5hcGF0aHkuCisJKiBNRU1ESVNLOiBOZXcgImJpZ3JhdyIgbW9kZSB0byB3b3JrIGFyb3VuZCBjZXJ0YWluIGJyb2tlbgorCSAgQklPUyBmbGFzaCBwcm9ncmFtcy4KKwkqIENPTTMyIG1vZHVsZSB0byBib290IE11bHRpYm9vdCBzeXN0ZW1zLCBpbmNsdWRpbmcgWGVuLiAgU2VlCisJICBjb20zMi9tb2R1bGVzL21ib290LmRvYy4KKwkqIE1heCBjb21tYW5kIGxpbmUgY2hhbmdlZCB0byAxMDIzIGNoYXJhY3RlcnMuICBOb3RlIHRoYXQgdGhlCisJICBrZXJuZWwgcHJvcGVyIHN0aWxsIGNhbiBvbmx5IGhhbmRsZSAyNTUgY2hhcmFjdGVycyB3aXRob3V0CisJICBwYXRjaGluZywgYW5kIENPTTE2IGJpbmFyaWVzIGNhbiBvbmx5IGhhbmRsZSAxMjUgY2hhcmFjdGVycy4KKworQ2hhbmdlcyBpbiAzLjA3OgorCSogRml4IGNoYWlubG9hZGluZyAoY2hhaW4uYzMyKS4KKwkqIEZpeCB6bGliIGJ1aWxkIHByb2JsZW0uCisJKiBVc2UgYSBwcml2YXRlIGNvcHkgb2YgPGxpbnV4L2V4dDJfZnMuaD4uCisKK0NoYW5nZXMgaW4gMy4wNjoKKwkqIEZpeCB0eXBvIHRoYXQgY2F1c2VkIHRoZSByYW1kaXNrIHRvIGxvYWQgaW4gdGhlIHdyb25nIHBsYWNlLgorCitDaGFuZ2VzIGluIDMuMDU6CisJKiBOZXcgQVBJIGZ1bmN0aW9uICJzaHVmZmxlIGFuZCBib290IjsgYWxsb3dzIENPTTMyIG1vZHVsZXMgdG8KKwkgIGxvYWQgb3IgY29uc3RydWN0IChhbG1vc3QpIGFyYml0cmFyaWx5IGNvbXBsZXggb2JqZWN0cywKKwkgIGUuZy4gYSBrZXJuZWwgYW5kIGl0cyBpbml0cmQvaW5pdHJhbWZzIGluIHBpZWNlcywgYW5kIGhhdmUKKwkgIHRoZSBBUEkgY29yZSByZW9yZ2FuaXplIG1lbW9yeSBmb3IgYm9vdGluZy4gIChBIGxpYnJhcnkgQVBJCisJICBmb3IgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGludHJvZHVjZWQgaW4gYSBsYXRlciB2ZXJzaW9uLikKKwkqIFRoZSBpbml0cmQ9IG9wdGlvbiBub3cgc3VwcG9ydHMgbXVsdGlwbGUgZmlsZW5hbWVzIHNlcGFyYXRlZAorCSAgYnkgY29tbWFzLiAgVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBpbml0cmFtZnMsIHdoaWNoIGNhbgorCSAgYmUgY29tcG9zZWQgb2YgbXVsdGlwbGUgc2VwYXJhdGUgY3BpbyBvciBjcGlvLmd6IGFyY2hpdmVzLgorCSAgKE5vdGU6IGFsbCBmaWxlcyBleGNlcHQgdGhlIGxhc3Qgb25lIGFyZSB6ZXJvLXBhZGRlZCB0byBhIDRLCisJICBwYWdlIGJvdW5kYXJ5LiAgVGhpcyBzaG91bGQgbm90IGFmZmVjdCBpbml0cmFtZnMuKQorCSogRVhUTElOVVg6IEZpeCBBUEkgZnVuY3Rpb24gMDAwQWggKGdldCBkZXJpdmF0aXZlLXNwZWNpZmljCisJICBpbmZvKS4KKwkqIGxpYmNvbTMyL2V0aGVyc2VsOiBTdXBwb3J0IFBDSSBDb25maWcgTWVjaGFuaXNtICMyIG9uCisJICBtYWNoaW5lcyBzdGlsbCBpbmZlc3RlZCB3aXRoIHRoYXQgaGlkZW91cyBvbGQgaGFjay4KKwkqIFNZU0xJTlVYOiBGaXggZGlyZWN0b3J5LXBhcnNpbmcgYnVnLgorCitDaGFuZ2VzIGluIDMuMDI6CisJKiBTWVNMSU5VWDogVGhlICJ1bml4IiBpbnN0YWxsZXIgbm93IHNldHMgdGhlIE1TLURPUworCSAgYXR0cmlidXRlcyAoaGlkZGVuLCBzeXN0ZW0sIHJlYWRvbmx5LikKKwkqIENPTTMyIGxpYnJhcnk6IGJ1aWxkIHRoZSAubG54ICh0ZXN0IG1vZHVsZXMgZm9yIHJ1bm5pbmcKKwkgIHVuZGVyIExpbnV4KSBhcyBhcmNoaXRlY3R1cmUgbmF0aXZlIG1vZHVsZXMsIGluIGNhc2UKKwkgIGkzODYgZGV2ZWwgbGlicmFyaWVzIGFyZW4ndCBpbnN0YWxsZWQuCisJKiBFWFRMSU5VWDogSGFjayBmb3Igc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIEJMS0dFVFNJWkU2NAorCSAgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQgaGVhZGVyIGZpbGVzLgorCSogU2ltcGxlIG1lbnUgc3lzdGVtOiBtaW5vciBhZXN0ZXRpYyBpbXByb3ZlbWVudHMsIGFuZCB0cnkgdG8KKwkgIHdvcmsgYmV0dGVyIG92ZXIgYSBzZXJpYWwgY29uc29sZSAoc3BlZWQsIGFuZCByZWFkYWJpbGl0eSBvbgorCSAgbW9ub2Nocm9tZSB0ZXJtaW5hbCBlbXVsYXRvcnMuKQorCSogTmV3IENPTlNPTEUgZGlyZWN0aXZlIHRvIGNvbnRyb2wgb3V0cHV0IG9uIHRoZSB2aWRlbyBjb25zb2xlCisJICAodXNlZnVsIGZvciBkZWFsaW5nIHdpdGggc29tZSBicm9rZW4gc2VyaWFsLWZvcndhcmRpbmcKKwkgIEJJT1Nlcy4pCisJKiBOZXcgY29tMzIgbW9kdWxlICJldGhlcnNlbCIgZm9yIHNlYXJjaGluZyBmb3IgYW4gRXRoZXJuZXQKKwkgIGNhcmQgYW5kIHNlbGVjdGluZyB0aGUgcHJvcGVyIHZlcnNpb24gb2YgRXRoZXJib290LgorCSogRVhUTElOVVg6IEFsbG93IHRoZSB1c2VyIHRvIG92ZXJyaWRlIHRoZSBkZXRlY3RlZCBnZW9tZXRyeS4KKwkgIEFkZCBoZWxwLgorCitDaGFuZ2VzIGluIDMuMDE6CisJKiBFWFRMSU5VWCwgU1lTTElOVVg6IEZpeCBjb21waWxlIGVycm9ycyBvbiBzb21lIHN5c3RlbXMuCisJKiBFWFRMSU5VWDogRGVmYXVsdCB0byB6aXBkcml2ZSBnZW9tZXRyeSAoNjQgaGVhZHMsIDMyCisJICBzZWN0b3JzKSBpZiBubyBvdGhlciBnZW9tZXRyeSBjYW4gYmUgZGV0ZWN0ZWQuCisKK0NoYW5nZXMgaW4gMy4wMDoKKwkqIFNZU0xJTlVYOiBTdXBwb3J0IEZBVDMyIGFuZCBFREQuICBBcyBhbiB1bmZvcnR1bmF0ZQorCSAgY29uc2VxdWVuY2UsIExETElOVVguU1lTIGlzIG5vIGxvbmdlciBhbiBvcmRpbmFyeSBmaWxlOyBpdAorCSAgaXMgYmxvY2stbWFwcGVkIGF0IGluc3RhbGwgdGltZSwgd2hpY2ggbWVhbnMgaXQgY2FuIG9ubHkgYmUKKwkgIHdyaXR0ZW4gdXNpbmcgdGhlIHN5c2xpbnV4IGluc3RhbGxlcnMuCisJKiBTWVNMSU5VWDogUmVvcmdhbml6ZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBpbnN0YWxsZXJzOworICAgICAgICAgIGVhY2ggb25lIG9mIHRoZSBpbnN0YWxsZXJzIChkb3MsIHdpbjMyLCB1bml4LCBtdG9vbHMpIGlzIG5vdworICAgICAgICAgIGJ1aWx0IGluIGl0cyBvd24gc3ViZGlyZWN0b3J5LiAgSW4gcGFydGljdWxhciwgIm10b29scyIgaXMKKwkgIHRoZSB1bnByaXZpbGVnZWQgaW5zdGFsbGVyIHdoaWNoIHVzZXMgbXRvb2xzOyAidW5peCIgaXMgdGhlCisJICBwcml2aWxlZ2VkIGluc3RhbGxlciB3aGljaCB1c2VzIHN5c3RlbSBjYWxscy4KKwkqIFNZU0xJTlVYOiBDb21wbGV0ZWx5IHJld3JpdHRlbiBET1MgaW5zdGFsbGVyIGluIEMuCisJKiBBTEw6ICJsYWJlbCIgc3RhdGVtZW50IGluZm9ybWF0aW9uIGlzIG5vdyBzdG9yZWQgaW4gYQorCSAgY29tcHJlc3NlZCBmb3JtYXQsIHdoaWNoIG1lYW5zIHRoYXQgYSBsb3QgbW9yZSBsYWJlbHMgYXJlCisJICBwZXJtaXR0ZWQgKDUwMC0xMDAwIGluIGEgdHlwaWNhbCBjb25maWd1cmF0aW9uLCBidXQgZGVwZW5kcworCSAgb24gdGhlIGNvbXBsZXhpdHkuKQorCSogRVhUTElOVVg6IE5ldyBkZXJpdmF0aXZlLCB3aGljaCBib290cyBmcm9tIGFuIGV4dDIvZXh0MworCSAgZmlsZXN5c3RlbS4KKwkqIFNZU0xJTlVYOiBUaGUgRE9TIGFuZCBXaW4zMiBpbnN0YWxsZXJzIGNhbiBub3cgb3B0aW9uYWxseQorCSAgd3JpdGUgdGhlIGJvb3Qgc2VjdG9yIHRvIGEgZmlsZSBpbnN0ZWFkIG9mIHRoZSByZWFsIGJvb3QKKwkgIHNlY3Rvci4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgTGludXggaW5zdGFsbGVycywKKwkgIGhvd2V2ZXIuCisJKiBBTEw6IE5ldyBOT0VTQ0FQRSBjb21tYW5kLCBkaXNhYmxlcyB0aGUgImhvbGQgZG93biB0aGUgU2hpZnQKKwkgIGtleSB0byBkaXNwbGF5IHRoZSBwcm9tcHQiIGJlaGF2aW91ci4KKwkqIE5ldyBzaW1wbGUgbWVudSBzeXN0ZW0sIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBhZHZhbmNlZAorCSAgbWVudSBzeXN0ZW0gYWxyZWFkeSBwcmVzZW50LiAgU2VlIFJFQURNRS5tZW51IGZvciBkZXRhaWxzLgorCSogUFhFTElOVVg6IEZpbGVuYW1lcyBjYW4gbm93IGJlIHByZWZpeGVkIHdpdGggYW4gSVAgYWRkcmVzcworCSAgb3IgRE5TIG5hbWUgcGx1cyA6OiAoZS5nLiAxOTIuMC4yLjE6OmZpbGVuYW1lIG9yCisJICBzZXJ2ZXIuZG9tYWluLmNvbTo6ZmlsZW5hbWUpLCB3aGljaCBkb3dubG9hZHMgYSBmaWxlIGZyb20gYW4KKwkgIGFsdGVybmF0ZSBURlRQIHNlcnZlciwgb3IganVzdCBhIDo6IChlLmcuIDo6ZmlsZW5hbWUpLCB3aGljaAorCSAgc3VwcHJlc3NlcyB0aGUgY29tbW9uIHBhdGhuYW1lIHByZWZpeC4gIFNlZSBweGVsaW51eC5kb2MuCisJKiBTWVNMSU5VWDogQWRkIGFuIC1tIG9wdGlvbiB0byB0aGUgRE9TIGFuZCBXaW4zMiBpbnN0YWxsZXJzCisJICB0byB3cml0ZSBhbiBNQlIgYW5kIC1hIHRvIG1hcmsgdGhlIHBhcnRpdGlvbiBTWVNMSU5VWCBpcworCSAgYmVpbmcgaW5zdGFsbGVkIG9uIGFjdGl2ZS4KKwkqIE1FTURJU0s6IEdpdmUgYSB3YXkgdG8gcXVlcnkgdGhlIGJvb3QgbG9hZGVyIHR5cGUgd2hpbGUKKwkgIHJ1bm5pbmcgTUVNRElTSzsgc2VlIG1lbWRpc2svbWVtZGlzay5kb2MgYW5kCisJICBzYW1wbGUvbWRpc2tjaGsuYy4KKwkqIG1rZGlza2ltYWdlOiBzdWJzdGFudGlhbGx5IGltcHJvdmVkIG1rZGlza2ltYWdlIHdoaWNoLCBhbW9uZworCSAgb3RoZXIgdGhpbmdzLCBjYW4gbm93IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBVU0Iga2V5cyBhcworCSAgemlwZHJpdmVzOyBzZWUgUkVBRE1FLnVzYmtleSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQ2hhbmdlcyBpbiAyLjEzOgorCSogTUVNRElTSzogRml4IGNvbW1hbmQtbGluZSBwYXJzaW5nICJicm93biBwYXBlciBiYWciIGNsYXNzCisJICBidWcuCisJKiBNRU1ESVNLOiBBZGQgInJhdyIgbW9kZSB0byBzdXBwb3J0IHRoZSBET1MgYm9vdCBkaXNrIGZyb20KKwkgIFdpbk1FL1hQLCB3aGljaCBzZWVtcyB0byBkZWxpYmVyYXRlbHkgY3Jhc2ggdGhlIHN5c3RlbQorCSAgd2hlbiBzb21lb25lIHVzZXMgdGhlICJJTlQgMTVoIG1vdmVyIiBoaWdobWVtIEFQSS4KKwkqIE1ha2UgIm1ha2UgaW5zdGFsbCIgZG8gc29tZXRoaW5nIHNhbmUgZm9yIHRoZSBjb20zMgorCSAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuCisJKiBJbiB0aGUgc3BlYyBmaWxlLCBjcmVhdGUgYSBzZXBhcmF0ZSAtZGV2ZWwgUlBNIGZvciB0aGUgY29tMzIKKwkgIGRldmVsb3BtZW50IGVudmlyb25tZW50LgorCitDaGFuZ2VzIGluIDIuMTI6CisJKiBTaW1wbGUgQyBsaWJyYXJ5LCBiYXNlZCBvbiBrbGliYywgZm9yIHdyaXRpbmcgQ09NMzIKKwkgIHByb2dyYW1zLgorCSogRml4IHRoZSBoYW5kbGluZyBvZiBmaWxlIGxlbmd0aCBpbiBsb2FkaW5nIG9mIENPTTMyCisJICBwcm9ncmFtcy4KKwkqIE1FTURJU0s6IFdvcmsgYXJvdW5kIGEgbGlua2VyIGJ1ZyBieSByZWFycmFuZ2luZyB0aGUgY29kZSB0bworCSAgbm90IHVzZSB0aGUgbGlua2VyIGZvciB0aGUgMTYtYml0IGNvZGUuCisJKiBTWVNMSU5VWDogSWYgd2UncmUgYnVpbGRpbmcgb24gYSBtYWNoaW5lIHdpdGhvdXQgYSBXaW4zMgorCSAgKG1pbmd3KSBjb21waWxlciwganVzdCBza2lwIGJ1aWxkaW5nIHN5c2xpbnV4LmV4ZS4KKwkqIElTT0xJTlVYOiBTdXBwb3J0IG5vbi1ta2lzb2ZzIG1hc3RlcmluZyBwcm9ncmFtcywgYXQgbGVhc3QKKwkgIGFzIGxvbmcgYXMgdGhlIGltYWdlIGlzIHNpbmdsZS1zZXNzaW9uLiAgRm9yIGJlc3QgcmVzdWx0cywKKwkgIElTT0xJTlVYIHNob3VsZCBiZSB0aGUgb25seSBib290IGxvYWRlciBpbnN0YWxsZWQuCisJKiBNRU1ESVNLOiBBbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoYXQgdGhlIHNpbXVsYXRlZCBkaXNrCisJICBzaG91bGQgYmUgd3JpdGUtcHJvdGVjdGVkLgorCitDaGFuZ2VzIGluIDIuMTE6CisJKiBBTEw6IEFkZCBhbiBBUEkgY2FsbCB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lLgorCSogU1lTTElOVVg6IEZpeCBidWcgaW4gMi4xMCB0aGF0IHByZXZlbnRlZCBpdCBmcm9tIHdvcmtpbmcKKwkgIGNvcnJlY3RseSBmb3IgYSBsb3Qgb2YgcGVvcGxlLgorCSogU1lTTElOVVg6IEluIHRoZSBpbnN0YWxsZXIsIG1ha2UgbXRvb2xzIGEgYml0IGxlc3MgZnVzc3kuCisJKiBNYWtlIHRoZSBtZW51IHN5c3RlbSBjb21waWxlIHdpdGggbmV3ZXIgZ2NjJ3MuCisKK0NoYW5nZXMgaW4gMi4xMDoKKwkqIE1FTURJU0s6IEhhbmRsZSBpbWFnZXMgY29tcHJlc3NlZCB3aXRoIHppcCBhcyB3ZWxsIGFzIHdpdGgKKwkgIGd6aXAuICBTb21lIFdpbmRvd3MtYmFzZWQgaW1hZ2UgdG9vbHMgYXBwYXJlbnRseSBnZW5lcmF0ZQorCSAgdGhlc2Uga2luZHMgb2YgaW1hZ2VzIGJ5IGRlZmF1bHQuICBQYXRjaCBieSBQYXRyaWNrCisJICBMb1ByZXN0aS4KKwkqIE1ham9yIG1lbnUgaW1wcm92ZW1lbnQgZnJvbSBNdXJhbGkgR2FuYXBhdGh5LgorCSogSVNPTElOVVg6IFdvbmRlcmZ1bGx5IHNpY2sgYW5kIGJyaWxsaWFudCB3b3JrYXJvdW5kIGZvcgorCSAgc2V2ZXJlIGJ1Z3MgaW4gY2VydGFpbiBBd2FyZCBCSU9TZXM7IGZyb20gS251dCBQZXRlcnNlbi4KKwkqIFNZU0xJTlVYOiBGaXggZm9yIHRoZSBub210b29scyBpbnN0YWxsZWQsIGZyb20gRnJlZGVyaWMKKwkgIFBhc3RlbGV1cnMuCisJKiBQWEVMSU5VWDogRml4IGhhbmRsaW5nIG9mIElQIG51bWJlcnMgaW4gdGhlIHJhbmdlcworCSAgMTAwLTEwOSBhbmQgMjAwLTIwOS4KKwkqIEFMTDogTmV3IG9wdGlvbiAiYWxsb3dvcHRpb25zIiAoZGVmYXVsdHMgdG8gMSksIHdoaWNoCisJICBjb250cm9scyBpZiBvcHRpb25zIGFyZSBhbGxvd2VkIG9uIHRoZSBjb21tYW5kIGxpbmUgb3Igbm90LgorCSogU1lTTElOVVg6IFN1cHBvcnQgYnVpbGRpbmcgdW5kZXIga2xpYmMgKHNlZSB0aGUga2xpYmMKKwkgIGRpc3RyaWJ1dGlvbiBmb3IgZGV0YWlscy4pCisKK0NoYW5nZXMgaW4gMi4wOToKKwkqIFNZU0xJTlVYOiBSZW1vdmUgcmVzaWR1YWwgc2V0dWlkIGNyYXAgZnJvbQorCSAgc3lzbGludXgtbm9tdG9vbHMuCisJKiBIYW5kbGUgdmlkZW8gcGFnZXMgY29ycmVjdGx5IHdoZW4gdXNpbmcgdGhlIEFQSSBmdW5jdGlvbnMuCisJKiBIYW5kbGUgY29tcGlsaW5nIG9uIGFuIHg4Ni02NCBwbGF0Zm9ybSBjb3JyZWN0bHkuCisJKiBNZW51IHN5c3RlbSBmcm9tIE11cmFsaSBLcmlzaG5hbiBHYW5hcGF0aHk7IHNlZSB0aGUgbWVudQorCSAgZGlyZWN0b3J5IGZvciBpbmZvcm1hdGlvbi4KKwkqIENPTUJPT1Q6IEFsbG93IENPTUJPT1QgcHJvZ3JhbXMgdG8gY2hhbmdlIHNjcmVlbiB0ZXh0IG1vZGUuCisJKiBDT01CT09UOiBDb3JyZWN0IHRoZSBkb2N1bWVudGF0aW9uIG9mIGhvdyB0byBkZXRlY3QKKwkgIFNZU0xJTlVYIGZyb20gQ09NQk9PVCEhISEKKwkqIENPTUJPT1Q6IEZpeCAiZ2V0IGtleSB3aXRob3V0IGVjaG8iIEFQSSBmdW5jdGlvbi4KKwkqIFNZU0xJTlVYOiBGaXggYnVnIHRoYXQgYWZmZWN0ZWQgdGhlIEFQSSBvcGVuIGZ1bmN0aW9uLgorCSogQUxMOiBJbXByb3ZlIHRoZSBFODIwIG1lbW9yeSBwYXJzZXIsIHRvIHdvcmsgYXJvdW5kIHNvbWUKKwkgIGJ1Z2d5IEJJT1Nlcy4KKworQ2hhbmdlcyBpbiAyLjA4OgorCSogQWRkIG5ldyBjb25maWd1cmF0aW9uIGNvbW1hbmQgIm9udGltZW91dCIgdG8gYWxsb3cgdGltZW91dAorCSAgdG8gaGF2ZSBhIGRpZmZlcmVudCBhY3Rpb24gdGhhbiBqdXN0IHByZXNzaW5nIEVudGVyLgorCSogQWRkIG5ldyBjb25maWd1cmF0aW9uIGNvbW1hbmQgIm9uZXJyb3IiIHRvIGFsbG93IGEgY3VzdG9tCisJICBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIGluIGNhc2UgdGhlIGtlcm5lbCBpbWFnZSBpcyBub3QgZm91bmQuCisJKiBGaXggYnVncyBpbiB0aGUgQ09NQk9PVC9DT00zMiBjb21tYW5kLWxpbmUgcGFyc2luZy4gIEFQUEVORAorCSAgbm93IHdvcmtzIHdpdGggQ09NQk9PVC9DT00zMiBpbWFnZXMuCisJKiBQWEVMSU5VWDogUG9sbCBmb3IgQVJQIHJlcXVlc3RzIHdoaWxlIHNpdHRpbmcgYXQgdGhlCisJICBwcm9tcHQuICBUaGlzIG1ha2VzIHNvbWUgYm9vdCBzZXJ2ZXJzIGEgbG90IGxlc3MgdW5oYXBweS4KKwkqIFBYRUxJTlVYOiBBY3R1YWxseSBmcmVlIHNvY2tldHMgd2hlbiB3ZSBnZXQgYSBmYWlsdXJlCisJICAoaW5jbHVkaW5nIGZpbGUgbm90IGZvdW5kLikgIFRoaXMgYnVnIHdvdWxkIGNhdXNlIHVzIHRvIHJ1bgorCSAgb3V0IG9mIHNvY2tldHMgYW5kIHRodXMgImdvIGRlYWYiIGFmdGVyIGEgd2hpbGUuCisJKiBNRU1ESVNLOiBBZGQgYW4gQVBJIHRvIHF1ZXJ5IGZvciB0aGUgZXhpc3RlbmNlIG9mIE1FTURJU0suCisJKiBTWVNMSU5VWDogRml4IGxvYWRpbmcgYm9vdCBzZWN0b3JzICguYnMvLmJzcykgZnJvbSBmbG9wcHkKKwkgIGRpc2suCisJKiAuYzMyIGlzIG5vdyBvbmUgb2YgdGhlIGV4dGVuc2lvbnMgc2VhcmNoZWQgZm9yCisJICBhdXRvbWF0aWNhbGx5LgorCSogUFhFTElOVVg6IFJGQkcuZXhlIHNlZW1zIHRvIHJhbmRvbWx5IG92ZXJ3cml0ZSBtZW1vcnkKKwkgIGxvY2F0aW9uIDB4NTcwMC4gIFRodXMsIGRvbid0IHVzZSBpdCEKKwkqIFBYRUxJTlVYOiBDaGFuZ2UgcGF0aG5hbWUgbGVuZ3RoIG1heCBmcm9tIDYzIHRvIDEyNzsgY2hhbmdlCisJICBtYXggdmtlcm5lbHMgZnJvbSAxMjggdG8gNjQuCisJKiBTdXBwb3J0IEN0cmwtVSAtPiBraWxsIGVudGlyZSBjb21tYW5kIGxpbmUgaW5wdXQuCisJKiBUaGUgInNhbXBsZXMiIGRpcmVjdG9yeSBjb250YWlucyBhIChiYXJlbHkgYXQgYWxsIHRlc3RlZCkKKwkgIGNoYWluIGxvYWRpbmcgZXhhbXBsZSwgY2hhaW4uYzMyLCB3aGljaCBtYXkgYmUgdXNlZCB0bworCSAgY2hhaW5sb2FkIGxvY2FsIGZsb3BweSBkaXNrcyBhbmQgaGFyZCBkaXNrcy4gIFVzZSB3aXRoCisJICAiY2hhaW4gZmROIiBvciAiY2hhaW4gaGROIFtwYXJ0aXRpb25dIjsgTiA9IDAgZm9yIHRoZSBmaXJzdAorCSAgZHJpdmUgb2YgZWFjaCB0eXBlLgorCitDaGFuZ2VzIGluIDIuMDc6CisJKiBNRU1ESVNLOiBXb3JrYXJvdW5kIGZvciBCSU9TZXMgd2hpY2ggZ28gaW50byBhIHNuaXQgd2hlbgorCSAgdGhleSBnZXQgYSBSRVNFVCBjb21tYW5kIGZvciB0aGUgZmxvcHB5IHN5c3RlbSB3aGVuIHRoZXJlIGlzCisJICBubyBmbG9wcHkgaW4gdGhlIHN5c3RlbS4KKwkqIFBYRUxJTlVYOiBBZGQgImlwYXBwZW5kIDIiLCB3aGljaCBwYXNzZXMgdGhlIGhhcmR3YXJlCisJICBhZGRyZXNzIG9mIHRoZSBib290IGludGVyZmFjZSB0byB0aGUga2VybmVsIGFzIGEKKwkgIGNvbW1hbmQtbGluZSBvcHRpb24uCisJKiBta2Rpc2tpbWFnZTogZml4IHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBlbmQgbGltaXQuCisJKiBQWEVMSU5VWDogRml4IG11bHRpcGxlIGJ1Z3MgaW4gY2hhaW5sb2FkaW5nIG9mIG90aGVyIE5CUHMuCisJKiBNRU1ESVNLOiBGaXggYnVnIHRoYXQgd291bGQgb2NjYXRpb25hbGx5IGNhdXNlICJyYW4gb3V0IG9mCisJICBpbnB1dCBkYXRhIiB3aGVuIHVzaW5nIGNvbXByZXNzZWQgZGlzayBpbWFnZXMuCisJKiBTWVNMSU5VWDogVXBkYXRlcyBmb3IgdGhlIHdpbjMyIGluc3RhbGxlciAoZnJvbSBMYXJzIE11bmNoLikKKwkqIFBYRUxJTlVYOiBQWEVMSU5VWC1zcGVjaWZpYyBvcHRpb25zIGFyZSBub3cgcmVjb2duaXplZCBib3RoCisJICBpbiBhIHZlbmRvci1vcHRpb24tc3BhY2UgKGEuay5hLiB0eXBlIDQzIGVuY2Fwc3VsYXRlZCkgYXMKKwkgIHdlbGwgYXMgaW4gYSBzaXRlLW9wdGlvbi1zcGFjZSAodW5lbmNhcHN1bGF0ZWQuKQorCSogQ09NMzI6IERvbid0IGNyYXNoIHdoZW4gRFMgIT0gMC4KKwkqIENPTUJPT1QvQ09NMzI6IE1ha2UgZmlsZSByZWFkaW5nIHdvcmsgY29ycmVjdGx5LiAgVGhhbmtzIHRvCisJICBQaHVuZyBDaGkgS2llbiBmb3Igc3VibWl0dGluZyBhIHRlc3QgcHJvZ3JhbS4KKworQ2hhbmdlcyBpbiAyLjA2OgorCSogQUxMOiBGaXggcHJvYmxlbSB0aGF0IHdvdWxkIG9jY2F0aW9uYWxseSBjYXVzZSBhCisJICBib290IGZhaWx1cmUsIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBrZXJuZWwuCisJKiBJU09MSU5VWDogRml4IHByb2JsZW0gdGhhdCB3b3VsZCBvY2NhdGlvbmFsbHkgY2F1c2UgYQorCSAgYm9vdCBmYWlsdXJlLCBkZXBlbmRpbmcgb24gdGhlIGxlbmd0aCBvZiBkaXJlY3Rvcmllcy4KKwkqIFNZU0xJTlVYOiBXaW4zMiBpbnN0YWxsZXIgbm93IGZsdXNoZXMgYnVmZmVycy4KKwkqIHBwbXRvbHNzMTY6IEJlIGZ1bGx5IGNvbXBsaWFudCB3aXRoIHRoZSBQTk0gc3BlYzsKKwkgIGFjdHVhbGx5IHByb2Nlc3MgY29tbWVudHMgaW4gdGhlIGhlYWRlciBhbmQgb2RkCisJICBhbGlnbm1lbnRzIG9mIHRoZSB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIHdlbGwgYXMKKwkgICJwbGFpbiIgKG5vdCByYXcpIGZpbGVzIGFuZCBQQk0gYW5kIFBHTSBmaWxlcy4KKwkqIFBYRUxJTlVYOiBMb3dlciB0aGUgZGVmYXVsdCBNVFUgdG8gMTQ3MiBpbiBvcmRlciB0byBkZWFsCisJICB3aXRoIHN5c3RlbXMgd2l0aCBzbGlnaHRseSBub25zdGFuZGFyZCBNVFVzLCBhbmQgUFhFCisJICBzdGFja3Mgd2hpY2ggZG9uJ3QgZGVmcmFnbWVudCBjb3JyZWN0bHkuICBVbmZvcnR1bmF0ZWx5IHRoaXMKKwkgIGlzIHZlcnkgaGFyZCB0byB0ZXN0IGR5bmFtaWNhbGx5LgorCitDaGFuZ2VzIGluIDIuMDU6CisJKiBQWEVMSU5VWDogQWRkIGEgZGVmYXVsdCBxdWVyeSBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgYWRkcmVzcworCSAgb2YgdGhlIGJvb3QgZGV2aWNlLiAgVGhpcyBpcyBpbiBsb3dlciBjYXNlIGhleGFkZWNpbWFsIGZvcm0KKwkgIHNlcGFyYXRlZCBieSBkYXNoZXMgYW5kIGluY2x1ZGluZyB0aGUgaGFyZHdhcmUgdHlwZSwgZm9yCisJICBleGFtcGxlLCB0aGUgRXRoZXJuZXQgKHR5cGUgMSkgYWRkcmVzcyA4ODo5OTpBQTpCQjpDQzpERAorCSAgd291bGQgcXVlcnkgdGhlIGZpbGUgcHhlbGludXguY2ZnLzAxLTg4LTk5LWFhLWJiLWNjLWRkLgorICAgICAgICAqIFBYRUxJTlVYOiBGaXggYnVnIGludm9sdmluZyBub24tSVAtYmFzZWQgY29uZmlnIGZpbGUgbmFtZXMuCisJKiBTWVNMSU5VWDogTmV3IGluc3RhbGxlciBmb3IgV2luTlQtYmFzZWQgc3lzdGVtcywgZnJvbSBMYXJzCisJICBNdW5jaC4KKwkqIE1FTURJU0s6IEZpeCBoYW5kbGluZyBvZiBtZW1vcnkgcmVnaW9uIG92ZXJsYXAgd2hlbgorCSAgZGVjb21wcmVzc2luZy4gIFRoYW5rcyB0byBNaWtoYWlsIEt1cGNoaWsgZm9yIGlkZW50aWZ5aW5nCisJICB0aGUgcHJvYmxlbS4KKworQ2hhbmdlcyBpbiAyLjA0OgorCSogQUxMOiBSZWNsYWltIGV2ZW4gbW9yZSBsb3cgbWVtb3J5IGJ5IG9ic2VydmluZyB0aGF0CisJICBjb21ib290X3NlZyA9PSByZWFsX21vZGVfc2VnIGlzIHBlcmZlY3RseSBmaW5lLCBhbmQgYnkgdGhlCisJICBmYWN0IHRoYXQgdGhlIDEwMDBoIHNlZ21lbnQgbWFuYWdlZCB0byBnZXQgdW51c2VkIGluIGFsbAorCSAgZGVyaXZhdGl2ZXMuLi4KKwkqIFBYRUxJTlVYOiBBdHRlbXB0IHRvIG5lZ290aWF0ZSBmdWxsIEV0aGVybmV0LXNpemVkIGJsb2NrcworCSAgKDE0NjggYnl0ZXMpIHVzaW5nIHRoZSBibGtzaXplIG9wdGlvbi4KKwkqIFNZU0xJTlVYOiBSZXN1cnJlY3QgdGhlIG9sZCBuby1tdG9vbHMgdmVyc2lvbiBvZiB0aGUKKwkgIGluc3RhbGxlciwgYWx0aG91Z2ggYXMgYSByb290LW9ubHkgdG9vbC4gIFNvbWUgZGlzdHJpYnV0b3JzCisJICBoYXZlIGluZGljYXRlZCB0aGF0IHRoZXkgbmVlZCBhIHNtYWxsIHN0YW5kYWxvbmUgaW5zdGFsbGVyLgorCSogTUVNRElTSzogRml4IGEgbWVtb3J5IG9mZnNldCBjb21wdXRhdGlvbiBlcnJvciB3aGVuCisJICBpbnN0YWxsaW5nIGNvbXByZXNzZWQgZGlza3Mgd2hpY2ggZ2VuZXJhbGx5IHdvdWxkIGNhdXNlCisJICAxIE1CIG9mIG1lbW9yeSB0byBiZSB3YXN0ZWQuCisJKiBNRU1ESVNLOiBGaXggaW5zdGFsbGluZyB0aGUgRTgyMCBtZW1vcnkgbWFwLiAgQ2FsbGluZworCSAgSU5UIDE1aCBBWD0wRTgyMGggd2l0aCBNRU1ESVNLIDIuMDMgbG9hZGVkIHdvdWxkIGdpdmUgYQorCSAgY29tcGxldGVseSBjb3JydXB0IG1lbW9yeSBtYXAuCisJKiBTWVNMSU5VWDogTWFrZSBsaWJzeXNsaW51eCBhIGR5bmFtaWMgbGlicmFyeSwgc28gdGhhdCBpdCBjYW4KKwkgIGJlIHVwZGF0ZWQgc2VwYXJhdGVseSBmcm9tIGNsaWVudCBwcm9ncmFtcy4gIFRoZSB3aG9sZSBpZGVhLAorCSAgYWZ0ZXIgYWxsLCBpcyB0byBlbmFibGUgYWx0ZXJuYXRlIHByb2dyYW1zIHRvIGJlY29tZQorCSAgc3lzbGludXggaW5zdGFsbGVycy4KKwkqIEluY2x1ZGUgYW4gcnBtIHNwZWMgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uLCBzbyBycG1idWlsZAorCSAgLXRhIHdvcmtzLgorCitDaGFuZ2VzIGluIDIuMDM6CisJKiBBY3R1YWxseSBzdXBwb3J0IGNvbW1lbnQgbGluZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKwkqIFBYRUxJTlVYOiBUcnkgdG8gcmVzb2x2ZSBzb21lIHByb2JsZW1zIHdpdGggc3RhY2sgc3dpdGNoZXMuCisJKiBQWEVMSU5VWDogSGFuZGxlIFBYRSBzdGFja3Mgd2l0aCBicm9rZW4gcm91dGluZy4KKwkgIFdpdGggdGhlc2Ugd29ya2Fyb3VuZHMsIHRoZSByZW1vdGUgaW5zdGFsbCBQWEUgYm9vdCBmbG9wcHkKKwkgIChyYmZnLmV4ZSkgZnJvbSBBcmdvbiBUZWNobm9sb2dpZXMgc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorCSogRml4IHByb2JsZW1zIHdpdGggUGVybCBzY3JpcHRzIGluIFVURi04IGxvY2FsZXMuCisJKiBZb3UgcHJvYmFibHkgbmVlZCBOQVNNIDAuOTguMzQgb3IgbGF0ZXIgdG8gY29tcGlsZSB0aGlzCisJICB2ZXJzaW9uLiAgMC45OC4zNiBpcyByZWNvbW1lbmRlZC4KKwkqIE1FTURJU0s6IE5vdyBzdXBwb3J0cyBnemlwIGNvbXByZXNzZWQgaW1hZ2VzLgorCitDaGFuZ2VzIGluIDIuMDI6CisJKiBTWVNMSU5VWDogU2VjdXJpdHkgZmxhd3MgaGF2ZSBiZWVuIGZvdW5kIGluIHRoZSBTWVNMSU5VWAorCSAgaW5zdGFsbGVyIHdoZW4gcnVubmluZyBzZXR1aWQgcm9vdC4gIFJld3JpdGUgdGhlIFNZU0xJTlVYCisJICBpbnN0YWxsZXIgc28gaXQgdXNlcyBtdG9vbHMgaW5zdGVhZC4gIEl0IHRoZXJlZm9yZSBub3cKKwkgIHJlcXVpcmVzIG10b29scyAoc3BlY2lmaWNhbGx5IG1jb3B5IGFuZCBtYXR0cmliKSB0byBleGlzdCBvbgorCSAgeW91ciBzeXN0ZW0sIGJ1dCBpdCB3aWxsIG5vdCByZXF1aXJlIHJvb3QgcHJpdmlsZWdlcyBhbmQKKwkgIFNIT1VMRCBOT1QgYmUgc2V0dWlkLgorCitDaGFuZ2VzIGluIDIuMDE6CisJKiBNRU1ESVNLOiBGaXggbWVtb3J5IHNpemluZyBidWcgd2hlbiB0aGUgcmFtZGlzayBjcm9zc2VzIHRoZQorCSAgMTYgTUIgYm91bmRhcnkuCisJKiBNRU1ESVNLOiBBZGQgYSAicGF1c2UiIG9wdGlvbiB0byBzdG9wIGltbWVkaWF0ZWx5IGJlZm9yZQorCSAgYm9vdGluZywgdG8gcmVhZCBvZmYgdGhlIG1lc3NhZ2VzLgorCSogTUVNRElTSzogU3VwcG9ydCBkaXNrIGltYWdlcyB3aXRoIERPU0VNVSBoZWFkZXJzLgorCSogVXBkYXRlIHRoZSBta2Rpc2tpbWFnZSBzY3JpcHQgdG8gaGFuZGxlIG5ld2VyIG10b29scworCSAgdmVyc2lvbnMsIGFuZCBiZSBhYmxlIHRvIGdlbmVyYXRlIGRpc2sgaW1hZ2VzIHdpdGggRE9TRU1VCisJICBoZWFkZXJzIChjb250cm9sbGVkIGJ5IHRoZSAtZCBvcHRpb24pLgorCSogRml4IHRoZSBDT00zMiBzYW1wbGUgcHJvZ3JhbS4KKwkqIFBYRUxJTlVYLCBJU09MSU5VWDogRml4IHNvbWUgQ09NQk9PVCBBUEkgY2FsbHMuCisJKiBQWEVMSU5VWDogRG9jIGZpeC4KKwkqIEJ1aWxkIFNZU0xJTlVYIGludG8gYSBzbWFsbCBsaWJyYXJ5IGZvciBlbmNhcHN1bGF0aW9uIGludG8KKwkgIG90aGVyIHByb2dyYW1zIChob3dldmVyLCBwbGVhc2Uga2VlcCBpbiBtaW5kIHRoaXMgaXMgYSBHUEwnZAorCSAgbGlicmFyeS4pCisJKiBTWVNMSU5VWDogTWFrZSBpbnN0YWxsZXIgd29yayB3aXRoICJvd25lciIgaW4gL2V0Yy9mc3RhYi4KKwkqIFNZU0xJTlVYOiBGaXggaXNzdWUgd2l0aCB3b3JraW5nIG9uIG5vbnBhcnRpdGlvbmVkIGhhcmQgZGlzaworCSAgZGV2aWNlcy4gIFRISVMgQ09ORklHVVJBVElPTiBJUyBOT1QgUkVDT01NRU5ERUQuCisKK0NoYW5nZXMgaW4gMi4wMDoKKwkqIEFMTDogQWRkIHN1cHBvcnQgZm9yICJDT00zMiIgKDMyLWJpdCBDT01CT09UKSBpbWFnZXMuCisJKiBBTEw6IEFkZCBhbiBBUEkgZm9yIENPTUJPT1QvQ09NMzIgaW1hZ2VzLiAgU2VlIGNvbWJvb3QuZG9jCisJICBmb3IgZGV0YWlscy4gIFRoZXJlIGlzIGEgQyBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IKKwkgIENPTTMyIGJlaW5nIGNyZWF0ZWQ7IGl0IHNob3VsZCBiZSByZWFkeSBhdCBzb21lIHBvaW50IGluCisJICB0aGUgZnV0dXJlLgorCSogRml4IG1ici5hc20gc28gdGhhdCBpdCBhY3R1YWxseSB3b3Jrcy4KKwkqIFNZU0xJTlVYOiBUaGUgc3lzbGludXggaW5zdGFsbGVyICpTSE9VTEQqIG5vdyBiZSBzYWZlIHRvCisJICBydW4gc2V0dWlkIHJvb3QuCisJKiBQWEVMSU5VWDogRml4IGJ1ZyB3aGVyZSBQWEVMSU5VWCB3b3VsZCBvdmVycmlkZSByYW5kb20KKwkgIGNodW5rcyBvZiB0aGUgVU5ESSBjb2RlIHNlZ21lbnQhICBUaGFua3MgdG8gS2V2aW4gVHJhbiBmb3IKKwkgIGZpbmRpbmcgdGhpcyBidWcuCisJKiBJU09MSU5VWDogRml4IGEgYnVnIHJlbGF0ZWQgdG8gc2xhc2hlcyBpbiBwYXRobmFtZXMuCisJKiBJU09MSU5VWDogRml4IGEgYnVnIGluIGhhbmRsaW5nIGluaXRyZHMgb3ZlciAxMjggTUIuCisJKiBBTEw6IE1ha2UgdGhlIDxDdHJsLVY+IGtleSBwcmludCBvdXQgdGhlIHZlcnNpb247IHRoaXMgaXMKKwkgIHRvIGhlbHAgZGVidWdnaW5nLgorCSogQWRkIGEgc21hbGwgc2NyaXB0LCBta2Rpc2tpbWFnZSwgdG8gY3JlYXRlIGEgRE9TLWZvcm1hdHRlZAorCSAgaGFyZCBkaXNrIGltYWdlIHVzaW5nIG10b29scy4gIFRoaXMgbWF5IGJlIHVzZWZ1bCBpbgorCSAgY29uanVuY3Rpb24gd2l0aCBNRU1ESVNLLgorCSogSVNPTElOVVg6IFNlYXJjaCBmb3IgYSAvYm9vdC9pc29saW51eCBkaXJlY3RvcnkgYXMgd2VsbCBhcworCSAgL2lzb2xpbnV4LgorCSogQUxMOiBGaXggYSBidWcgcmVsYXRlZCB0byB2ZXJ5IGxvbmcgY29uZmlndXJhdGlvbiBmaWxlcy4KKwkqIFBYRUxJTlVYOiBXb3JrIGFyb3VuZCBhIE5BU00gYnVnIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBubworCSAgZGVsYXkgYmVmb3JlIHJlc2V0IGlmIGFuIGVycm9yIG9jY3Vycy4KKworQ2hhbmdlcyBpbiAxLjc2OgorCSogSVNPTElOVVg6IFJlbW92ZSBjb2RlIG5vIGxvbmdlciB1c2VkIHdoaWNoIGNhdXNlZCBoYW5ncyBvbgorCSAgc29tZSBUb3NoaWJhIGxhcHRvcHMuCisKK0NoYW5nZXMgaW4gMS43NToKKwkqIEFMTDogTkFTTSAwLjk4LjMyIG9yIGxhdGVyIGlzIG5vdyByZXF1aXJlZCB0byBidWlsZAorCSAgU1lTTElOVVggZnJvbSBzb3VyY2VzLgorCSogU1lTTElOVVg6IHB1dCBiYWNrIGluIHRoZSB3b3JrYXJvdW5kIGZvciB0aGUgQklPUyBmbG9wcHkKKwkgIHRhYmxlLiAgVGhpcyBzZWVtcyB0byBiZSBhIHJlcXVpcmVtZW50IGZvciAiZXh0ZW5kZWQiIGZsb3BweQorCSAgZm9ybWF0cyB0byB3b3JrIGNvcnJlY3RseS4KKwkqIFNZU0xJTlVYOiBObyBsb25nZXIgd2FybiBpZiBvbmUgaXMgdHJ5aW5nIHRvIGJvb3Qgb24gYSAyODYKKwkgIG9yIG9sZGVyLiAgVGhlIGFib3ZlIEJJT1Mgd29ya2Fyb3VuZCBubyBsb25nZXIgZml0cyBpZiB0aGUKKwkgIHJlcXVpcmVtZW50IHRvIHVzZSBvbmx5IDgwODYtY29tcGF0aWJsZSBjb2RlIGluIHRoZSBlYXJseQorCSAgYm9vdCBpcyBtYWludGFpbmVkLiAgSXQgbWFkZSBzZW5zZSBpbiAxOTk0LCBidXQgaW4gMjAwMiBhCisJICAyODYgb3Igb2xkZXIgaXMgYSBtdXNldW0gb2JqZWN0LgorCSogU1lTTElOVVg6IFVzZSBhIGRvd25yaWdodCBiaXphcnJlLCBzdGF0ZWZ1bCBhbGdvcml0aG0gdG8gdHJ5CisJICB0byBndWVzcyB0aGUgbWF4aW11bSB0cmFuc2ZlciBzaXplLiAgSSBhbSAqaG9waW5nKiB0aGlzIHdpbGwKKwkgIGN1dCBkb3duIG9uIHRoZSBudW1iZXIgb2Ygc3lzdGVtcyBmb3Igd2hpY2ggLXMgaXMgcmVxdWlyZWQKKwkgIHRvIHdvcmsgYXQgYW55IGFjY2VwdGFibGUgc3BlZWQuCisJKiBJU09MSU5VWDogQWRkIGEgZmV3IG1vcmUgd29ya2Fyb3VuZHMgZm9yIHZhcmlvdXMgYnJva2VuIEVsCisJICBUb3JpdG8gQklPU2VzLgorCSogTWFrZSBzdXJlIC5kZXBlbmQgZmlsZXMgYXJlbid0IGFjY2lkZW50YWxseSBwYWNrZWQuLi4KKwkqIEFMTDogRml4IGJ1Z3MgaW4gdGhlIGV4dGVuc2lvbi1kZXRlY3QgY29kZTsgdGhpcyBjYXVzZWQKKwkgIGZpbGVzIGxpa2UgQ09NQk9PVCBpbWFnZXMgYW5kIENEIGJvb3Qgc2VjdG9ycyB0byBiZQorCSAgbWlzLWlkZW50aWZpZWQgYXMgTGludXgga2VybmVscyBhbmQgcmVqZWN0ZWQuCisJKiBBTEw6IEZpeCB0aGUgcmV0dXJuIGZyb20gQ09NQk9PVC4KKwkqIEFMTDogRG8gc29tZSBvZiB0aGUgZWFybHkgZ3JvdW5kd29yayBmb3Igc3VwcG9ydGluZyBET1MKKwkgIHN5c3RlbSBjYWxscyBpbiBDT01CT09ULgorCSogR2V0IHJpZCBvZiB1bm5lY2Vzc2FyeSAibmVhciIgZGlyZWN0aXZlcywgbWFraW5nIHRoZSBjb2RlCisJICBiaWdnZXIuCisJKiBQWEVMSU5VWDogUHV0IHRoZSBQWEUgc3RhY2sgYmFjayBpbiB0aGUgaW5pdCBzdGF0ZSBiZWZvcmUKKwkgIGludm9raW5nIGEgY2hhaW4tbG9hZGVkIE5CUC4KKwkqIFBYRUxJTlVYOiBBY3R1YWxseSBmb3VuZCB0aGUgY29tYmluYXRpb24gb2YgY2FsbHMgdGhhdAorCSAgYWxsb3dzIHNvbWUgKG1vc3Q/KSBQWEUgMisgc3RhY2tzIHRvIGJlIHVubG9hZGVkIGZyb20gbWVtb3J5CisJICBwcm9wZXJseS4KKwkqIFBYRUxJTlVYOiBBZGQgImtlZXBweGUiIGNvbW1hbmQtbGluZSBvcHRpb24gdG8gZGlzYWJsZQorCSAgdGhlIHN0YW5kYXJkIHVubG9hZGluZyBvZiB0aGUgUFhFIHN0YWNrLgorCitDaGFuZ2VzIGluIDEuNzQ6CisJKiBTWVNMSU5VWDogZml4IGJ1ZyB0aGF0IHdvdWxkIGNhdXNlIHZhbGlkIGtlcm5lbCBpbWFnZXMgdG8gYmUKKwkgIGxhYmVsbGVkICJpbnZhbGlkIi4KKworQ2hhbmdlcyBpbiAxLjczOgorCSogV29yayBvbiByZW1vdmluZyBncmF0dWl0b3VzIGRpZmZlcmVuY2VzIGJldHdlZW4gbW9kdWxlcy4KKwkqIEJyZWFrIHVwIHRoZSBzb3VyY2UgaW4gY29tbW9uIGFuZCBtb2R1bGUtc3BlY2lmaWMgZmlsZXMuCisJKiBQWEVMSU5VWDogQWxsb3cgY2hhaW5pbmcgb2Ygb3RoZXIgUFhFIE5CUHMuCisJKiBJU09MSU5VWDogQWxsb3cgbG9hZGluZyAiQ0QtUk9NIGJvb3Qgc2VjdG9ycyIuCisJKiBBTEw6IGdlbmVyYWxpemUgdGhlIGRlZmluaXRpb24gb2YgYSBib290IHNlY3Rvci9OQlAuCisKK0NoYW5nZXMgaW4gMS43MjoKKwkqIFBYRUxJTlVYLCBJU09MSU5VWDogRml4IGJ1Z3MgaW4gdGhlIG5ldyBjb3JlIGNvZGUuCisKK0NoYW5nZXMgaW4gMS43MToKKwkqIEZpeCBhICJicm93biBwYXBlciBiYWciIGNsYXNzIGJ1ZyBpbiB0aGUgbmV3IGNvcmUgY29kZS4KKworQ2hhbmdlcyBpbiAxLjcwOgorCSogTWFqb3IgY29kZSByZXN0cnVjdHVyaW5nLgorCSogUmVsYXggdGhlIGNvbnZlbnRpb25hbCBtZW1vcnkgbGltaXRzIHNvbWV3aGF0LgorCSogTUVNRElTSzogU2V0IHVwIHRoZSAidmVyc2lvbiBudW1iZXIgc3RyaW5nIiBwb2ludGVyIGluIHRoZQorCSAgaGVhZGVyIGNvcnJlY3RseS4KKyAgICAgICAgKiBTWVNMSU5VWDogRml4LCBhZ2FpbiwgInRoZSBidWcgdGhhdCB3b24ndCBkaWUiOiB0aGUgdXNlIG9mCisgICAgICAgICAgdGhlIG9mZnNldCBwYXJhbWV0ZXIgd2l0aCB0aGUgU1lTTElOVVggaW5zdGFsbGVyLgorCSogU1lTTElOVVg6IEZpeCBwb3NzaWJsZSBzdXBlcmJsb2NrIGNvcnJ1cHRpb24gcHJvYmxlbSBpbiB0aGUKKwkgIFNZU0xJTlVYIGluc3RhbGxlci4KKworQ2hhbmdlcyBpbiAxLjY3OgorCSogSGFuZGxlIGJ1ZyBpbiB0aGUgbG9jYXRpb24gb2YgaW5pdHJkLgorCitDaGFuZ2VzIGluIDEuNjY6CisJKiBNRU1ESVNLOiBNYWtlIGNvbXBpbGUgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBnY2MuCisKK0NoYW5nZXMgaW4gMS42NToKKwkqIElTT0xJTlVYOiBTdXBwb3J0IGJvb3RpbmcgZGlzayBpbWFnZSBmaWxlcyAodG8gYm9vdCBET1Mgb3IKKwkgIG90aGVyIG5vbi1MaW51eCBvcGVyYXRpbmcgc3lzdGVtcyksICpJRiogdGhlIEJJT1Mgd29ya3MKKwkgIGNvcnJlY3RseTsgdW5mb3J0dW5hdGVseSBtYW55IEJJT1NlcyBhcHBhcmVudGx5IGRvbid0LgorCSogU3VwcG9ydCBMaW51eCBib290IHByb3RvY29sIHZlcnNpb24gMi4wMyAoZXhwbGljaXRseQorCSAgc3BlY2lmeSB0aGUgaW5pdHJkIGFkZHJlc3MgbGltaXQuKQorCSogSGFuZGxlIHNtYWxsICJwc2V1ZG8ta2VybmVscyI7IGltYWdlcyB0aGF0IHVzZSB0aGUgTGludXgKKwkgIGtlcm5lbCBib290IHByb3RvY29scyBidXQgYXJlIGxlc3MgdGhhbiA2NEsgaW4gc2l6ZS4KKwkqIE1FTURJU0s6IE5ldyBzdWJzeXN0ZW07IHRoaXMgaXMgYSBkcml2ZXIgd2hpY2ggYWxsb3dzCisJICBsZWdhY3kgT1NlcyB0byBib290IHVzaW5nIGFuIGluLW1lbW9yeSBzaW11bGF0ZWQgZGlzay4KKwkgIFNlZSBtZW1kaXNrL21lbWRpc2suZG9jIGZvciBtb3JlIGluZm8uCisJKiBQWEVMSU5VWCwgSVNPTElOVVg6IENvcnJlY3RseSBoYW5kbGUgZmlsZXMgbGFyZ2VyIHRoYW4gNjU1MzUKKwkgIGJsb2NrcyAoMzIgTUIgZm9yIFBYRUxJTlVYLCAxMjggTUIgZm9yIElTT0xJTlVYLikKKwkqIFBYRUxJTlVYOiBNYWtlIGEgYmVzdC1lZmZvcnQgYXR0ZW1wdCBhdCBmcmVlaW5nIGFsbCBtZW1vcnkKKwkgIGNsYWltZWQuICBGcm9tIHRoZSBsb29rcyBvZiBpdCwgaXQgd2lsbCBmYWlsIG9uIG1vc3QgUFhFCisJICBzdGFja3MuCisKK0NoYW5nZXMgaW4gMS42NDoKKwkqIExpbWl0ZWQgc3VwcG9ydCBmb3IgaGFyZHdhcmUgZmxvdyBjb250cm9sIHdoZW4gdXNpbmcgYQorCSAgc2VyaWFsIHBvcnQgY29uc29sZS4KKwkqIFN1cHBvcnQgc3BlY2lmeWluZyB0aGUgc2VyaWFsIHBvcnQgSS9PIGFkZHJlc3MgZXhwbGljaXRseS4KKwkqIE1ha2UgRE9TIGluc3RhbGxlciBob3BlZnVsbHkgYmVoYXZlIG1vcmUgbmljZWx5IHdoZW4gdXNlZCBvbgorCSAgcmVjZW50IFdpbmRvd3MgdmVyc2lvbnMuCisJKiBGaXggcmV0dXJuaW5nIHRvIHRleHQgbW9kZSB3aGVuIGEgZm9udCBoYXMgYmVlbiBzcGVjaWZpZWQuCisJKiBBdHRlbXB0IHRvIGRldGVjdCBtaXNzaW5nIHNlcmlhbCBwb3J0IGhhcmR3YXJlIGFuZCBkaXNhYmxlCisJICB0aGUgc2VyaWFsIHBvcnQgaWYgdGhlcmUgaXMgbm90aGluZyB0aGVyZS4KKworQ2hhbmdlcyBpbiAxLjYzOgorCSogTWFrZSB0aGUgcHBtdG9sc3MxNiBwcm9ncmFtIGhhbmRsZSBjb2xvciBjb252ZXJzaW9uIG1vcmUKKwkgIGNvcnJlY3RseS4KKwkqIENsZWFuIHVwICJtYWtlIGluc3RhbGwiIHRhcmdldCwgaG9ub3VyIElOU1RBTExST09UIGlmIGl0CisJICBleGlzdHMuCisJKiBTWVNMSU5VWDogRml4IHN0YWNrLXNtYXNoIGJ1ZyBpZGVudGlmaWVkIGJ5IFN0ZWZmZW4KKwkgIFdpbnRlcmZlbGR0LgorCSogSG9wZWZ1bGx5IGZpeCByZXR1cm4tdG8tdGV4dC1tb2RlIG9uIHNvbWUgZ3JhcGhpY3MgY2FyZHMuCisJKiBJU09MSU5VWDogQnVnIHdvcmthcm91bmQgZm9yIEF3YXJkIEJJT1MgNC41MSwgYW5kIHBlcmhhcHMKKwkgIG90aGVyIGJ1Z2d5IEJJT1NlcyBhcyB3ZWxsLgorCitDaGFuZ2VzIGluIDEuNjI6CisJKiBQWEVMSU5VWDogQWxsb3cgdGhlIERIQ1Agc2VydmVyIHRvIG92ZXJyaWRlIHRoZQorCSAgY29uZmlndXJhdGlvbiBmaWxlIG5hbWUgYW5kIHBhdGhuYW1lIHByZWZpeCwgdXNpbmcKKwkgICJzaXRlLXNwZWNpZmljIiBESENQIG9wdGlvbnMuCisJKiBQWEVMSU5VWDogRG9jdW1lbnRhdGlvbiBmaXhlcy4KKwkqIFBYRUxJTlVYOiBGaXggdGhlICJpcGFwcGVuZCIgb3B0aW9uOyB0aGUgbGFzdCB0d28gdmFsdWVzCisJICB3ZXJlIHJldmVyc2VkIHZzLiB3aGF0IHRoZSBrZXJuZWwgZXhwZWN0ZWQuCisJKiBJbnRyb2R1Y2UgYSB3YXkgdG8gcmV0dXJuIHRvIHRleHQgbW9kZSBvbmNlIHdlIGFyZSBhbHJlYWR5CisJICBpbiBncmFwaGljcyBtb2RlLiAgVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBGLWtleSBoZWxwCisJICBzY3JlZW5zLgorCSogRml4IHNldmVyYWwgYnVncyBpbiB0aGUgd2F5IHJldHVybiB0byB0ZXh0IG1vZGUgd2FzIGhhbmRsZWQuCisKK0NoYW5nZXMgaW4gMS42MToKKwkqIElTT0xJTlVYOiBTdXBwb3J0IGZ1bGwgcGF0aG5hbWUgc2VhcmNoZXMuICBNYXggbGVuZ3RoIGZvciBhCisJICBwYXRobmFtZSBpcyAyNTUgY2hhcmFjdGVycy4gIEFzIGEgcmVzdWx0LCBvbmx5IDY0ICJsYWJlbCIKKwkgIHN0YXRlbWVudHMgYXJlIHN1cHBvcnRlZCBpbiBJU09MSU5VWC4KKwkqIFBYRUxJTlVYOiBNYXggZmlsZW5hbWUgbGVuZ3RoIGV4dGVuZGVkIHRvIDYzIGNoYXJhY3RlcnMuCisKK0NoYW5nZXMgaW4gMS42MDoKKwkqIEFkZCBzdXBwb3J0IGZvciBncmFwaGljYWwgc3BsYXNoIHNjcmVlbnMuCisJKiBBZGQgbW9kZSBjb250cm9sIGNoYXJhY3RlcnMsIHdoaWNoIGFsbG93cyB5b3UgdG8gY29udHJvbAorCSAgbWVzc2FnZSBkaXNwbGF5IG91dHB1dCBkZXBlbmRpbmcgb24gb3V0cHV0IG1vZGUgKHRleHQsCisJICBncmFwaGljcywgb3Igc2VyaWFsIHBvcnQuKQorCSogSVNPTElOVVg6IE5ldyBwcm9ncmFtLCB3aGljaCBib290cyBMaW51eCBmcm9tIGEgQ0QtUk9NCisJICB3aXRob3V0IHVzaW5nIGZsb3BweSBlbXVsYXRpb24gbW9kZS4gIFNlZSBpc29saW51eC5kb2MgZm9yCisJICBtb3JlIGRldGFpbHMuCisJKiBQWEVMSU5VWDogRG9uJ3Qgc2VhcmNoIGZvciBib290IHNlY3RvciBmaWxlIHR5cGVzLCBzaW5jZQorCSAgdGhleSBkb24ndCB3b3JrIGFueXdheS4KKwkqIFNZU0xJTlVYOiBEb2N1bWVudCB0aGUgTE9DSyBjb21tYW5kIGZvciBXaW45eCwgYW5kIHRoZSBlcnJvcgorCSAgZGlhbG9nIGJveCBmb3IgV2luTlQvMksuCisKK0NoYW5nZXMgaW4gMS41NDoKKwkqIFBYRUxJTlVYOiBGaXggY29kZSBmb3IgZmluZGluZyAhUFhFIGZyb20gUFhFTlYrLiAgVGhpcyB3YXMKKwkgIGR1ZSB0byBhIHNwZWMgYnVnOyBtYXRjaCB0aGUgbW9zdCByZWNlbnQgc3BlYyBzaW5jZSB0aGF0CisJICBzZWVtcyB0byBiZSB3aGF0IGltcGxlbWVudGF0aW9ucyBhY3R1YWxseSBkby4KKwkqIFNZU0xJTlVYOiBBZGQgc29tZSBzbWFydHMgdG8gdGhlIGJvb3Qgc2VjdG9yLCB3aGljaAorCSAgaG9wZWZ1bGx5IHNob3VsZCByZWR1Y2UgdGhlIG51bWJlciBvZiBzeXN0ZW1zIHdoaWNoIHJlcXVpcmUKKwkgIHN0dXBpZCBtb2RlICgic3lzbGludXggLXMiKS4KKwkqIFBYRUxJTlVYOiBEb2N1bWVudCBmdXJ0aGVyIHNvbWUgb2YgdGhlIHBhdGhvbG9naWVzIHdpdGggb2xkCisJICBQWEUgc3RhY2tzLgorCSogV2hlbiBzcGVjaWZ5aW5nIGEgImRlZmF1bHQiIGNvbW1hbmQgbGluZSwgbm8gbG9uZ2VyCisJICBhdXRvbWF0aWNhbGx5IGFwcGVudCAiYXV0byIuICBTZWUgdGhlICJERUZBVUxUIiBjb21tYW5kIGluCisJICBzeXNsaW51eC5kb2MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisJKiBQWEVMSU5VWDogQ2xlYW4gdXAgdGhlIGFsbG9jYXRpb24gb2YgbG9jYWwgc29ja2V0IG51bWJlcnMuCisKK0NoYW5nZXMgaW4gMS41MzoKKwkqIFBYRUxJTlVYOiBSZW5hbWUgcHhlbGludXguYmluIHRvIHB4ZWxpbnV4LjAsIHRvIG1hdGNoIHdoYXQKKwkgIG1vc3QgUFhFIHNlcnZlcnMgc2VlbSB0byBleHBlY3QuCisJKiBQWEVMSU5VWDogVXBkYXRlIHRoZSBESENQL2Jvb3Qgc2VydmVyIHNldHVwIGRvY3VtZW50YXRpb24uCisJKiBQWEVMSU5VWDogU3VwcG9ydCBuZXcgImxvY2FsYm9vdCIgb3B0aW9uIGZvciAibGFiZWwiCisJICBzZWN0aW9ucy4KKwkqIFBYRUxJTlVYOiBNb3JlIHJvYnVzdCBwYXJzaW5nIG9mIERIQ1AvYm9vdCBzZXJ2ZXIgcGFja2V0cy4KKwkqIFBYRUxJTlVYOiBJbmNsdWRlIGEgc21hbGwgdXRpbGl0eSBwcm9ncmFtICJnZXRob3N0aXAiIHRvCisJICBjb21wdXRlIGhleGFkZWNpbWFsIElQIGFkZHJlc3Nlcy4KKworQ2hhbmdlcyBpbiAxLjUyOgorCSogUFhFTElOVVg6IEZpeCBidWdzIGludHJvZHVjZWQgYnkgbmV3IEEyMCBjb2RlLiAgKFNZU0xJTlVYCisJICBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgZm9yIGNvZGUgY29uc2lzdGVuY3kgcmVhc29ucywgYnV0IEknbQorCSAgcHJldHR5IHN1cmUgdGhlIGNoYW5nZXMgYXJlIGRvbid0IGNhcmUgb24gU1lTTElOVVguKQorCSogRG9jdW1lbnRhdGlvbiB1cGRhdGVzLgorCSogUFhFTElOVVg6IEFkZCAiaXBhcHBlbmQiIG9wdGlvbiB0byBnZW5lcmF0ZSBhbiBpcD0gb3B0aW9uIHRvCisJICB0aGUga2VybmVsLgorCitDaGFuZ2VzIGluIDEuNTE6CisJKiBQWEVMSU5VWDogTm90IGFsbCBQWEUgc3RhY2tzIGZpbGwgaW4gdGhlIElQIGFkZHJlc3MgZm9yIGEKKwkgIHR5cGUgMyBjYWNoZWQgaW5mbyBxdWVyeS4gIFVzZSBhIHR5cGUgMiBjYWNoZWQgaW5mbyBxdWVyeQorCSAgZm9yIHRoaXMgaW5mb3JtYXRpb24gKG9ubHkuKQorCSogWWV0IGFub3RoZXIgYXR0ZW1wdCBhdCBBMjAgY29kaW5nLiAgTm93IHN1cHBvcnQgQklPUyBjYWxsCisJICAxNToyNDAxIGFzIHdlbGwsIGFuZCBoYW5kbGUgbWFjaGluZXMgd2hpY2ggYWx3YXlzIGhhdmUgQTIwCisJICBvbiBzZXBhcmF0ZWx5LgorCSogU3VwcG9ydCBtZW1vcnkgZGV0ZWN0aW9uIHVzaW5nIElOVCAxNWgsIEFYPTBFODIwaC4gIEJJT1MKKwkgIG1hbnVmYWN0dXJlcnMgaGF2ZSBhcHBhcmVudGx5IGdvdHRlbiBzbG9wcHkgYWJvdXQga2VlcGluZworCSAgSU5UIDE1aCwgQVg9MEU4MDFoIHdvcmtpbmcgcHJvcGVybHkuCisJKiBEb24ndCBpc3N1ZSA8Q1I+PExGPiBvbnRvIHRoZSBzZXJpYWwgcG9ydCB3aGVuIHdlJ3JlIGRvaW5nCisJICBzY3JlZW4gd3JhcGFyb3VuZC4KKworQ2hhbmdlcyBpbiAxLjUwOgorCSogWWV0IGFub3RoZXIgQTIwLWNvZGUgdXBkYXRlLiAgSXQgc2VlbXMgc29tZSAibGVnYWN5LWZyZWUiCisJICBtYWNoaW5lcyBhbmQgZW1iZWRkZWQgZ2VhciBzaW1wbHkgZG9uJ3QgaGF2ZSBhIEtCQyB0byB0YWxrCisJICB0bywgYW5kIHRoYXQgd2FpdGluZyBmb3Igb25lIHdpbGwgd2FpdCBmb3JldmVyLiAgU2lnaC4KKworQ2hhbmdlcyBpbiAxLjQ5OgorCSogU1lTTElOVVg6IEltcGxlbWVudCBhIGhhY2sgZm9yIEJJT1MgZHJpdmVycyB3aGljaCBob2cgc2lnbmlmaWNhbnQKKwkgIGNodW5rcyBvZiBsb3cgbWVtb3J5IGR1cmluZyBib290LiAgKE5vdGU6IFBYRUxJTlVYIGFscmVhZHkKKwkgIGhhZCB0aGlzIG1vZGlmaWNhdGlvbi4gIFNZU0xJTlVYIGRvZXMgc3RpbGwgcmVxdWlyZSB0aGF0IHRoZQorCSAgbG93IDUxMksgaXMgYXZhaWxhYmxlOyBQWEVMSU5VWCByZXF1aXJlcyAzODRLLiAgTWFjaGluZXMKKwkgIHdpdGggYSBwaHlzaWNhbCBtZW1vcnkgaG9sZSBpbiB0aGUgbG93IDY0MEsgY2Fubm90IGJvb3QKKwkgIExpbnV4IG5vIG1hdHRlciB3aGF0LikgIERlcGVuZGluZyB3aGF0IHRoZSByZWFzb24gaXMgZm9yIHRoZQorCSAgbWVtb3J5IGhvbGUsIGEgbmV3IGtlcm5lbCAoMi40LjAtdGVzdDMtcHJlMyBvciBsYXRlcikgbWF5IGJlCisJICByZXF1aXJlZC4KKwkqIFNZU0xJTlVYOiBEZWZhdWx0IGluc3RhbGxlciBiaW5hcnkgbm93IGNvbXBpbGVkIGFnYWluc3QKKwkgIGdsaWJjIDIuMS4gIElmIHRoaXMgaXMgaW5hcHByb3ByaWF0ZSBmb3IgeW91ciBzeXN0ZW0gYW5kIHlvdQorCSAgc3RpbGwgd2FudCB0byB1c2UgdGhlIG9mZmljYWwgdmVyc2lvbiBvZiBTWVNMSU5VWCwgcGxlYXNlCisJICBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiAiZGlzdHJpYi5kb2MiIHRvIHJlYnVpbGQgdGhlCisJICBpbnN0YWxsZXIuCisJKiBTWVNMSU5VWDogTGludXggaW5zdGFsbGVyIHByb2dyYW0gbm93IHN1cHBvcnRzIC1vIDxvZmZzZXQ+CisJICBvcHRpb24gd2hpY2ggZG9lcyBhIGxvb3BiYWNrIG1vdW50IHdpdGggdGhlCisJICAtbyBsb29wLG9mZnNldD08PiBvcHRpb24uICBVc2VmdWwgdG8gcnVuIFNZU0xJTlVYIG9uIGFuCisJICBpbmRpdmlkdWFsIHBhcnRpdGlvbiBvZiBhIHdob2xlLWhhcmRkaXNrIGltYWdlLgorCSogSW5jbHVkZSB0aGUgc291cmNlIGNvZGUgdG8gYSBNYXN0ZXIgQm9vdCBSZWNvcmQgKE1CUikKKwkgIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHRoZSBvbmUgaW5zdGFsbGVkIERPUyBleGNlcHQgaXQKKwkgIGluY2x1ZGVzIEVCSU9TIHN1cHBvcnQsIGFuZCBzaG91bGQgYmUgcmVzaXN0YW50IHRvIGdlb21ldHJ5CisJICBjaGFuZ2VzLiAgVGhlIE1CUiBjb2RlIGlzIHB1YmxpYyBkb21haW4uCisJKiBQWEVMSU5VWDogRml4ICJkb3VibGUgcCIgYnVnOiBpZiB0aGUgdGZ0cCBwcmVmaXggd2FzIG51bGwsCisJICBhbGwgZmlsZW5hbWVzIHdvdWxkIGdldCBhICJwIiBwcmVwcmVuZGVkLCBlLmcuCisJICAicHB4ZWxpbnV4LmNmZyIgYW5kICJwdm1saW51eCIuCisKK0NoYW5nZXMgaW4gMS40ODoKKwkqIFBYRUxJTlVYOiBXb3JrYXJvdW5kIGZvciBQWEUgUk9NcyBiYXNlZCBvbiB0aGUgSW50ZWwgUFhFIFBESworCSAgMy4wIGJ1aWxkIDA3MSBhbmQgZWFybGllcjogbWlzc2luZyAhUFhFIHN0cnVjdHVyZSBwb2ludGVyLgorCSogUFhFTElOVVg6IEhhbmRsZSBsYXJnZXIgQk9PVFAvREhDUCBwYWNrYWdlcy4KKwkqIFBYRUxJTlVYOiBUaGUgY29tbWFuZCBsaW5lIHBhc3Npbmcgd2FzIGJyb2tlbjsgZml4LgorCSogUFhFTElOVVg6IE1ha2UgQ09NQk9PVCBpbWFnZXMgd29yay4KKwkqIFBYRUxJTlVYOiBEb2N1bWVudGF0aW9uIG9uIGhvdyB0byBtYWtlIGJvb3Rpbmcgd29yayB1c2luZworCSAgdGhlIFBESyAzLjAtZGVyaXZlZCBjbGllbnRzLCB3aGljaCBhcmVuJ3Qgc28gZ2VuZXJvdXMgYXMgdG8KKwkgIGFsbG93IGJvb3Rpbmcgd2l0aCBvbmx5ICJQWEVDbGllbnQiIHNwZWNpZmllZC4KKworQ2hhbmdlcyBpbiAxLjQ3OgorCSogUFhFTElOVVg6IFJGQyAxMTIzIHN0YXRlcyB0aGF0IGEgVEZUUCBpbXBsZW1lbnRhdGlvbiBNVVNUCisJICB1c2UgYWRhcHRpdmUgdGltZW91dCwgImF0IGxlYXN0IGFuIGV4cG9uZW50aWFsIGJhY2tvZmYgb2YKKyAgICAgICAgICByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IGlzIG5lY2Vzc2FyeS4iICBJbXBsZW1lbnQgYSB2ZXJ5CisJICBzaW1wbGUgZXhwb25lbnRpYWwgYmFja29mZiBmb3IgcmV0cmFuc21pdHMuCisJKiBQWEVMSU5VWDogVXBkYXRlZCBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcgcG9pbnRlciB0byBuZXcKKwkgIFRGVFAgc2VydmVyLgorCSogUFhFTElOVVg6IFdoZW4gc2VuZGluZyBFUlJPUiBkdWUgdG8gYmFkIE9BQ0ssIHVzZSB0aGUgcHJvcGVyCisJICBkZXN0aW5hdGlvbiBwb3J0IG51bWJlciAod2h5IGFyZSBURlRQIHBvcnQgbnVtYmVycyBzbyBvZGQ/KQorCSogUFhFTElOVVg6IElmIHRoZSBib290IGRpZXMgaW4gdGhlIG1pZGRsZSBzb21ld2hlcmUsCisJICBldmVudHVhbGx5IGdpdmUgdXAgYW5kIHJlc2V0IHRoZSBtYWNoaW5lICh1bmF0dGVuZGVkCisJICBvcGVyYXRpb24uKQorCitDaGFuZ2VzIGluIDEuNDY6CisJKiBOZXcgcHJvZ3JhbSBQWEVMSU5VWCB0byBkbyBuZXR3b3JrIGJvb3RpbmcgdXNpbmcgYQorCSAgUFhFLWNvbXBsaWFudCAoUHJlLUV4ZWN1dGlvbiBFbnZpcm9ubWVudCkgbmV0d29yayBib290aW5nCisJICBQUk9NLiAgU2VlIHB4ZWxpbnV4LmRvYyBmb3IgZGV0YWlscy4KKworQ2hhbmdlcyBpbiAxLjQ1OgorCSogU2VyaWFsIGNvbnNvbGUgc3VwcG9ydC4gIFNlZSBzeXNsaW51eC5kb2MgZm9yIGRldGFpbHMuCisKK0NoYW5nZXMgaW4gMS40NDoKKwkqIENoYW5nZSBISUdITUVNX01BWCB0byAzODAwMDAwMGggdG8gKGhvcGVmdWxseSkgYXZvaWQgdGhlCisJICBrZXJuZWwgc3RlcHBpbmcgb24gaXQ7IDNmMDAwMDAwaCB3YXMgYXBwYXJlbnRseSBhIGhpZ2hlcgorCSAgbGltaXQgdGhhbiB0aGUga2VybmVsIHVzZWQhCisKK0NoYW5nZXMgaW4gMS40MzoKKwkqIEFkZCBzeXMyYW5zaS5wbCBzY3JpcHQgdG8gZGlzcGxheSB0aGUgY29udGVudHMgb2YgYQorCSAgY29sb3JpemVkIFNZU0xJTlVYIGZpbGUuCisJKiBDaGFuZ2VkIHRoZSBpb19kZWxheSBvbmNlIGFnYWluLCBhZnRlciBhIHJlcG9ydCB0aGF0IHRoZQorCSAgb2xkIGRlbGF5IHBvcnQgY2F1c2VzIGhhbmdzIG9uIHNvbWUgc3lzdGVtcy4KKworQ2hhbmdlcyBpbiAxLjQyOgorCSogRnJvYiB0aGUgImZhc3QgQTIwIGdhdGUiIHBvcnQgYXMgd2VsbCBhcyB0aGUga2V5Ym9hcmQKKwkgIGNvbnRyb2xsZXI7IHdpbGwgdGhpcyBoZWxwIHN5c3RlbXMgd2l0aCBwcm9ibGVtcz8KKwkqIEJlIGV2ZW4gbW9yZSBwYXJhbm9pZCBhYm91dCBBMjAsIHVuZm9ydHVuYXRlbHkgZXZlbiB0aGlzCisJICBzZWVtcyB0byBiZSBub3QgcGFyYW5vaWQgZW5vdWdoLi4uIHdoYXQgSSBkb24ndCB1bmRlcnN0YW5kCisJICBpcyB0aGF0IGlmIHRoZXJlIGlzIGhhcmR3YXJlIG91dCB0aGVyZSAqdGhpcyBicm9rZW4qLCBob3cKKwkgIGNhbiBpdCBydW4gTGludXggYXQgYWxsPyAgUmVwb3J0IGFuIGVycm9yIG1lc3NhZ2UgcmF0aGVyCisJICB0aGFuIGhhbmcgZm9yZXZlciBpZiBBMjAgaXMgc3R1Y2suCisJKiBJbmNsdWRlIHNvbWUgaW50ZXJtZWRpYXRlIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24sIHBsdXMKKwkgIHByb3ZpZGUgYSAibWFrZSBpbnN0YWxsZXIiIHRhcmdldCBmb3IgZGlzdHJpYnV0b3JzIHRvIHJlbGluaworCSAgdGhlIGluc3RhbGwgcHJvZ3JhbXMgb25seS4gIEkgd291bGQgcHJlZmVyIHRoZSBzeXNsaW51eCBib290CisJICBsb2FkZXIgcHJvcGVyIHRvIGJlICJiaW5hcnkgY2xlYW4iIGZvciBkZWJ1Z2dhYmxpdHkgLS0gdXNlCisJICAibWFrZSBjbGVhbiA7IG1ha2UgaW5zdGFsbGVyIiB0byByZWJ1aWxkIHRoZSBpbnN0YWxsZXJzIG9ubHkuCisKK0NoYW5nZXMgaW4gMS40MToKKwkqIERvbid0IGdldCBjb25mdXNlZCBieSBkaXJlY3Rvcmllcywgdm9sdW1lIGxhYmVscywgb3IgVkZBVAorCSAgbG9uZyBuYW1lcy4KKwkqIFVzZSBJTlQgMTVoLCBBWD0wRTgwMWggdG8gcXVlcnkgbWVtb3J5IHNpemUgYmVmb3JlIHRyeWluZworCSAgSU5UIDE1aCwgQUg9ODhoLiAgVGhpcyBub3Qgb25seSBwcm92aWRlcyBtb3JlIGhlYWRyb29tCisJICBiZXR3ZWVuIHRoZSBrZXJuZWwgYW5kIHRoZSBpbml0cmQgb24gbGFyZ2UtbWVtb3J5IG1hY2hpbmVzLAorCSAgYnV0IGl0IGFwcGVhcnMgc29tZSByZWNlbnQgQklPU2VzIGFjdHVhbGx5IGhhdmUgc3RhcnRlZAorCSAgcmV0dXJuaW5nIGdhcmJhZ2UgZm9yIHRoZSBBSD04OGggKG9sZGVyKSBjYWxsLgorCSogVHJ1c3QgaGlnaCBtZW1vcnkgYmV5b25kIHRoZSAxNSBNQiBtYXJrIGlmIHRoZSB1c2VyIGhhcworCSAgc3BlY2lmaWVkIGl0LCBvciBpZiBvYnRhaW5lZCB3aXRoIElOVCAxNWgsIEFIPTBFODAxaCAod2l0aAorCSAgbm8gbWVtb3J5IGhvbGVzIGFib3ZlIDEgTUIuKQorCitDaGFuZ2VzIGluIDEuNDA6CisJKiBJbmNyZWFzZSBBMjBNIGRlbGF5IGFuZCBwdXQgaW4gYSB0ZXN0IHRvIGF2b2lkIHByb2JsZW1zIG9uCisJICBjZXJ0YWluIElCTSBUaGlua3BhZHMgKHRoYW5rcyB0byBEb25uaWUgQmFybmVzIG9mIFJlZEhhdAorCSAgZm9yIHZpdGFsIGluZm8gb24gdGhpcyBvbmUuKQorCSogU3VwcG9ydCBDT01CT09UIHN0eWxlIGJvb3QgY29tbWFuZCBpbWFnZXMuCisJKiBTdXBwb3J0IGNoYWluIGxvYWRpbmcgKGZvcmVpZ24gb3BlcmF0aW5nIHN5c3RlbXMsIGUuZy4gRE9TKS4KKwkqIEluY2x1ZGUgYSBuZXcgImNvcHlicyIgRE9TIHV0aWxpdHkgdG8gY29weSBhIGJvb3Qgc2VjdG9yIHRvCisJICBhIGZpbGUgKHVuZGVyIExpbnV4LCB1c2UgImRkIi4pCisJKiBGaXggdGhlIERPUyBpbnN0YWxsZXIgdG8gd29yayBmb3IgZGlza3Mgb3ZlciAzMiBNQi4KKwkqIFNZU0xJTlVYIHNob3VsZCBub3cgaGFuZGxlIGRpc2tzIHdpdGggbW9yZSB0aGFuIDY1NTM2IHRyYWNrcy4KKworQ2hhbmdlcyBpbiAxLjM3OgorCSogRml4IGEgYnVnIHRoYXQgY2F1c2VkICJsYWJlbCIgc3RhdGVtZW50cyBpbiBzeXNsaW51eC5jZmcgdG8KKwkgIG5vdCBiZSBoYW5kbGVkIHByb3Blcmx5LgorCSogVXBkYXRlZCB0aGUgZG9jdW1lbnRhdGlvbi4gIEFtb25nIG90aGVyIHRoaW5ncywgd2Ugbm93IGFsbG93CisJICB1cCB0byAxMjggImxhYmVsIiBzdGF0ZW1lbnRzLgorCitDaGFuZ2VzIGluIDEuMzY6CisJKiBGaXggZm9yIGJvb3Rpbmcgb2xkIChwcmUtaW5pdHJkKSBrZXJuZWxzLgorCSogSXQgc2VlbXMgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiBPUy8yIGRvZXNuJ3Qgc2V0IHVwIGFsbAorCSAgdGhlIGZpZWxkcyBpbiB0aGUgc3VwZXJibG9jayBjb3JyZWN0bHkuICBBY2NvdW50IGZvciB0aGF0LgorCSogRml4IGJ1ZyB0aGF0IGNhdXNlZCBib290IGZhaWx1cmUgd2hlbiB1c2luZyB0aGUgbWVtPSBvcHRpb24uCisKK0NoYW5nZXMgaW4gMS4zNToKKwkqIExvYWRpbmcgZnJvbSBwYXJ0aXRpb25zIG5vdyBzaG91bGQgd29yayBwcm9wZXJseS4gIChBY3R1YWxseQorCSAgdGVzdGVkLCB0aGlzIHRpbWUuICBZb3Ugc2hvdWxkIGV2ZW4gYmUgYWJsZSB0byBkZCBhIGZsb3BweQorCSAgdG8gYSBwYXJ0aXRpb24gYW5kIGJvb3QgZnJvbSBpdC4pCisJKiBSZW1vdmVkIGxhcmdlIHdvcmthcm91bmQgY29kZSBmb3IgYW4gYWxsZWdlZCBhbmNpZW50IEJJT1MKKwkgIGJ1ZyBJIGhhdmUgbmV2ZXIgYWN0dWFsbHkgc2Vlbi4gIFRoZSAtcyBvcHRpb24gc2hvdWxkIHdvcmsKKwkgIG9uIHRob3NlIG1hY2hpbmVzLCBhbnl3YXkuCisJKiBTdXBwb3J0IGZvciBzaW1wbGUga2V5Ym9hcmQgcmVtYXBwaW5ncywgc2FtZSBhcyB1c2VkIGJ5CisJICBMSUxPIChvbmNlIGFnYWluIHRvIHN1cHBvcnQgbG9jYWxpemF0aW9uLikgIFRoZSBwcm9ncmFtCisJICBrZXl0YWItbGlsby5wbCBmcm9tIHRoZSBMSUxPIGRpc3RyaWJ1dGlvbiBpbmNsdWRlZCB0bworCSAgZ2VuZXJhdGUgc3VjaCBtYXBzLgorCSogQWRkZWQgYSAic2FmZSwgc2xvdyBhbmQgc3R1cGlkIiAoLXMpIG9wdGlvbiB0byB0aGUKKwkgIGluc3RhbGxlcnMuICBUaGlzIG9wdGlvbiB3aWxsIGxvYm90b21pemUgdGhlIGJvb3Qgc2VjdG9yIHRvCisJICBob3BlZnVsbHkgd29yayBvbiBldmVuIHZlcnkgYnVnZ3kgQklPU2VzLgorCitDaGFuZ2VzIGluIDEuMzQ6CisJKiBBYmlsaXR5IHRvIGxvYWQgYSBWR0EgZm9udCBvbiBib290dXAgKGZvciBsb2NhbGl6ZWQgTGludXgKKwkgIGRpc3RyaWJ1dGlvbnMuKQorCitDaGFuZ2VzIGluIDEuMzM6CisJKiBCdWcgZml4IGluIHRoZSBMaW51eCBpbnN0YWxsZXIuCisJKiBBZGRlZCBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIGNlcnRhaW4gQU1JL0ludGVsIEJJT1NlcworCSAgd2hlbiBib290aW5nIGZyb20gQ0QtUk9NLgorCSogRG9jdW1lbnRhdGlvbiBjaGFuZ2VzLgorCitDaGFuZ2VzIGluIDEuMzI6CisJKiBGQVQxNiBmaWxlc3lzdGVtcyBhcmUgbm93IHN1cHBvcnRlZC4KKworQ2hhbmdlcyBpbiAxLjMxOgorCSogTm93IGNvbXBpbGVzIHVuZGVyIExpbnV4LCB1c2luZyBOQVNNLCByYXRoZXIgdGhhbiB1c2luZworCSAgVHVyYm8gQXNzZW1ibGVyIHVuZGVyIERPUy4gIFNlZSBodHRwOi8vd3d3LmNyeW9nZW4uY29tL05hc20KKwkgIGZvciBpbmZvcm1hdGlvbiBhYm91dCBOQVNNLgorCSogTGludXgtaG9zdGVkIFNZU0xJTlVYIGluc3RhbGxlciwgYXMgd2VsbCBhcyBhCisJICByZXdyaXR0ZW4gRE9TIGluc3RhbGxlciAobm93IGlzIHdyaXR0ZW4gaW4gYXNzZW1ibGVyLCBzbyB3ZQorCSAgZG9uJ3QgbmVlZCBUdXJibyBDLikKKworQ2hhbmdlcyBpbiAxLjMwOgorCSogQWRkZWQgc3VwcG9ydCBmb3IgbG9hZGluZyBiekltYWdlIGFuZCBpbml0cmQgbG9hZGluZywgYW5kIG1hZGUKKwkgIFNZU0xJTlVYIG5ldy1zZXR1cC1jb2RlIGF3YXJlIChTWVNMSU5VWCAxLjMwIGlkPTB4MzEpLgorCSogQWRkZWQgTElMTy1zdHlsZSBrZXJuZWwgbGFiZWxzOyBzZWUgdGhlIExBQkVMIGFuZCBJTVBMSUNJVAorCSAga2V5d29yZHMgaW4gUkVBRE1FIGZpbGUuCisJKiBBZGRlZCBzdXBwb3J0IGZvciBjb2xvcml6YXRpb24gb2YgaW50cm8gYW5kIGhlbHAgc2NyZWVucy4KKwkqIFRoZSB2Z2E9IG9wdGlvbiBpcyBub3cgaGFuZGxlZCBjb3JyZWN0bHkuCisJKiBNYXNzaXZlIHJld3JpdGUgb2YgbGFyZ2UgY2h1bmtzIG9mIHRoZSBjb2RlIGluIG9yZGVyIHRvCisJICBzdXBwb3J0IHRoZSBmaXJzdCB0d28gbmV3IGZlYXR1cmVzLgorCitDaGFuZ2VzIGluIDEuMjA6CisJKiBBZGRlZCBzaW1wbGUgb25saW5lIGhlbHAgYXQgdGhlICJib290OiIgcHJvbXB0LgorCSogUmVtb3ZlZCAyODgwSyBpbWFnZSBhcyBJIG5vIGxvbmdlciBoYXZlIGFjY2VzcyB0byBzdWNoIGEKKwkgIGZsb3BweSBkcml2ZS4JIChEb25hdGlvbnMgYWNjZXB0ZWQhISkKKwkqIERlY2lkZWQgdG8gZGlzdHJpYnV0ZSB0aGUgc291cmNlIGluIGEgc3ViZGlyZWN0b3J5IHJhdGhlcgorCSAgdGhhbiBpbiBhIG5lc3RlZCB6aXBmaWxlLgorCitDaGFuZ2VzIGluIDEuMTE6CisJKiBSZW1vdmVkIGEgc2FuaXR5IGNoZWNrIHdoaWNoIHdvdWxkIGNhdXNlIGJvb3RpbmcgdG8gZmFpbCBvbgorCSAgUGhvZW5peCBCSU9TIHZlcnNpb24gNC4wMy4gIEFwcGFyZW50bHkgdGhpcyBCSU9TIGlzIGJ1Z2d5LgorCitDaGFuZ2VzIGluIDEuMTA6CisJKiBBZGRlZCBjb25maWd1cmF0aW9uIGZpbGUgU1lTTElOVVguQ0ZHLiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbAorCSAgY29uZmlndXJhYmxlIG9wdGlvbnMsIGFuZCBjYW4gYmUgZWRpdGVkIGZyb20gYW55IE9TIHdoaWNoIGNhbgorCSAgYWNjZXNzIGFuIE1TLURPUyBmaWxlc3lzdGVtOyB0aGVyZSBpcyBubyBsb25nZXIgYSBuZWVkIHRvIHJ1bgorCSAgU1lTTElOVVguRVhFIGV4Y2VwdCB0byB3cml0ZSB0aGUgYm9vdCBzZWN0b3IuCisJKiBEZWZhdWx0IGNvbW1hbmQgbGluZSBub3cgZ2l2ZW4gYnkgImRlZmF1bHQiIGxpbmUgaW4gY29uZmlnCisJICBmaWxlLgorCSogTElOVVhNU0cuVFhUIGFuZCBCT09UTVNHLlRYVCBoYXJkLWNvZGVkIGZpbGUgbmFtZXMgcmVwbGFjZWQgYnkKKwkgICJkaXNwbGF5IiBhbmQgInByb21wdCIgbGluZXMgaW4gY29uZmlnIGZpbGUuCisJKiBMSUxPLXN0eWxlIG9wdGlvbiBhcHBlbmRpbmcgbm93IHN1cHBvcnRlZCAoImFwcGVuZCIgbGluZSBpbgorCSAgY29uZmlnIGZpbGUpLgorCSogUHJvbXB0IHRpbWVvdXQgaXMgbm93IHN1cHBvcnRlZCAoInRpbWVvdXQiIGxpbmUgaW4gY29uZmlnCisJICBmaWxlKS4gIFRoZSB0aW1lb3V0IGlzIGNhbmNlbGxlZCB3aGVuIGFueXRoaW5nIGlzIHR5cGVkIG9uIHRoZQorCSAgY29tbWFuZCBsaW5lLgorCSogUHJlc3NpbmcgPEVTQz4gb3IgPEN0cmwtQz4gYXQgdGhlIExvYWRpbmcuLi4gc3RhZ2Ugbm93IGFib3J0cworCSAgdGhlIGtlcm5lbCBsb2FkaW5nIGluIHByb2dyZXNzIGFuZCByZXR1cm5zIHRoZSB1c2VyIHRvIHRoZQorCSAgYm9vdDogcHJvbXB0LgorCSogVGhlIGluc3RhbGxlciBub3cgYXV0b21hdGljYWxseSBzZXRzIHRoZSBSRUFET05MWSBmbGFnIG9uCisJICBMRExJTlVYLlNZUy4KKwkqIEFkZGVkIDI4ODBLIGRpc2sgaW1hZ2UuCisKK0NoYW5nZXMgaW4gMS4wMzoKKwkqIEZpeGVkIGJ1ZyB0aGF0IHdvdWxkIHByZXZlbnQgYm9vdGluZyBmcm9tIGRvdWJsZS1kZW5zaXR5CisJICBmbG9wcGllcyBhbmQgb3RoZXIgRE9TIGZpbGVzeXN0ZW1zIHdpdGggbXVsdGlwbGUgc2VjdG9ycyBwZXIKKwkgIGNsdXN0ZXIuCisJKiBBZGRlZCA3MjBLIGRpc2sgaW1hZ2UuCisJKiBDaGFuZ2VkIGRlZmF1bHQga2VybmVsIG5hbWUgb24gZGlzayBpbWFnZXMgdG8gTElOVVguCisKK0NoYW5nZXMgaW4gMS4wMjoKKwkqIEZpeGVkIGJ1ZyB0aGF0IHdvdWxkIGdhcmJsZSB0aGUgY29tbWFuZCBsaW5lIG9uIHJlY2VudCBrZXJuZWxzCisJICB3aXRoIG1vcmUgdGhhbiA0IHNlY3RvcnMgb2Ygc2V0dXAgY29kZSAodGhpcyB3YXNuJ3QgcmVhbGx5IGEKKwkgICpidWcqOyByYXRoZXIsIGEga2VybmVsIGNoYW5nZSBicm9rZSB0aGUgY29kZS4gIFVuZm9ydHVuYXRlbHkKKwkgIHRoZSBMaW51eCBib290IGludGVyZmFjZSBpcyBzdGlsbCBzb3JlbHkgdW5kb2N1bWVudGVkKS4KKwkqIEFkZGVkIEJPT1RNU0cuVFhUIGZpbGUgc3VwcG9ydCAobWVzc2FnZSBmaWxlIHdoaWNoIGRvZXMgbm90CisJICBmb3JjZSBkaXNwbGF5IG9mIHRoZSBib290IHByb21wdCkuCisKK0NoYW5nZXMgaW4gMS4wMToKKwkqIEZpeGVkIGJ1ZyBvbiBzb21lIChtb3N0PykgMzg2IEJJT1NlcyB3b3VsZCByZXF1aXJlIHR3byBib290CisJICBhdHRlbXB0cy4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDBmZDBmCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsNDAgQEAKK1NlZSB0aGUgZmlsZXMgaW4gdGhlIGRvYyBkaXJlY3RvcnkgZm9yIGRvY3VtZW50YXRpb24gYWJvdXQgU1lTTElOVVg6CisKKwlzeXNsaW51eC50eHQJICAgIC0gVXNhZ2UgaW5zdHJ1Y3Rpb25zOyBtYW51YWwuCisJZGlzdHJpYi50eHQJICAgIC0gRm9yIGNyZWF0b3JzIG9mIExpbnV4IGRpc3RyaWJ1dGlvbnMuCisJcHhlbGludXgudHh0CSAgICAtIERvY3VtZW50YXRpb24gc3BlY2lmaWMgdG8gUFhFTElOVVguCisJaXNvbGludXgudHh0CSAgICAtIERvY3VtZW50YXRpb24gc3BlY2lmaWMgdG8gSVNPTElOVVguCisJZXh0bGludXgudHh0CSAgICAtIERvY3VtZW50YXRpb24gc3BlY2lmaWMgdG8gRVhUTElOVVguCisJbWVudS50eHQJICAgIC0gQWJvdXQgdGhlIG1lbnUgc3lzdGVtcy4KKwl1c2JrZXkudHh0CSAgICAtIEFib3V0IHVzaW5nIFNZU0xJTlVYIG9uIFVTQiBrZXlzLgorCW1lbWRpc2sudHh0ICAgICAgICAgLSBEb2N1bWVudGF0aW9uIGFib3V0IE1FTURJU0suCisKK0Fsc28gc2VlIHRoZSBmaWxlczoKKworCU5FV1MJCSAgICAtIExpc3Qgb2YgY2hhbmdlcyBmcm9tIHByZXZpb3VzIHJlbGVhc2VzLgorCVRPRE8JCSAgICAtIEFib3V0IGZlYXR1cmVzIHBsYW5uZWQgZm9yIGZ1dHVyZSByZWxlYXNlcy4KKwlDT1BZSU5HCQkgICAgLSBGb3IgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhpcyBzb2Z0d2FyZS4KKworU1lTTElOVVggbm93IGJ1aWxkcyBpbiBhIExpbnV4IGVudmlyb25tZW50LCB1c2luZyBuYXNtLiAgWW91IG5lZWQgbmFzbQordmVyc2lvbiAyLjAzIG9yIGxhdGVyICgyLjA3IG9yIGxhdGVyIHJlY29tbWVuZGVkKSB0byBidWlsZCBTWVNMSU5VWAorZnJvbSBzb3VyY2UuICBTZWUgaHR0cDovL3d3dy5uYXNtLnVzLyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgbmFzbS4KKworInV0aWxzL2lzb2h5YnJpZCIgbmVlZHMgdGhlIFVVSUQgbGlicmFyeSBhbmQgZm9sbG93aW5nIGhlYWRlciBmaWxlLAorCisJL3Vzci9pbmNsdWRlL3V1aWQvdXVpZC5oCisKK1lvdSBjYW4gZ2V0IHRoZW0gZnJvbSB0aGUgInV1aWQtZGV2IiBwYWNrYWdlIG9uIERlYmlhbiBiYXNlZCBzeXN0ZW1zCitvciBmcm9tIHRoZSAibGlidXVpZC1kZXZlbCIgcGFja2FnZSBvbiBSUE0gYmFzZWQgZGlzdHJpYnV0aW9ucy4KKworVGhlcmUgaXMgbm93IGEgbWFpbGluZyBsaXN0IGZvciBTWVNMSU5VWC4gIFNlZSB0aGUgZW5kIG9mIHN5c2xpbnV4LnR4dAorZm9yIGRldGFpbHMuCisKK1NZU0xJTlVYIGlzOgorCisgICBDb3B5cmlnaHQgMTk5NC0yMDExIEguIFBldGVyIEFudmluIGV0IGFsIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgpkaWZmIC0tZ2l0IGEvYmlvcy9jb20zMi9jaGFpbi9jaGFpbi5jMzIgYi9iaW9zL2NvbTMyL2NoYWluL2NoYWluLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTFlMDNlCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9jaGFpbi9jaGFpbi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYmlvcy9jb20zMi9jbWVudS9jb21wbGV4LmMzMiBiL2Jpb3MvY29tMzIvY21lbnUvY29tcGxleC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTc3YmYwOAotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvY21lbnUvY29tcGxleC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYmlvcy9jb20zMi9jbWVudS9kaXNwbGF5LmMzMiBiL2Jpb3MvY29tMzIvY21lbnUvZGlzcGxheS5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTJjNTgyNAotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvY21lbnUvZGlzcGxheS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYmlvcy9jb20zMi9jbWVudS9saWJtZW51L2xpYm1lbnUuYzMyIGIvYmlvcy9jb20zMi9jbWVudS9saWJtZW51L2xpYm1lbnUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3MThlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2NtZW51L2xpYm1lbnUvbGlibWVudS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYmlvcy9jb20zMi9jbWVudS9zaW1wbGUuYzMyIGIvYmlvcy9jb20zMi9jbWVudS9zaW1wbGUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkOThlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2NtZW51L3NpbXBsZS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYmlvcy9jb20zMi9jbWVudS90ZXN0LmMgYi9iaW9zL2NvbTMyL2NtZW51L3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZkZTIxCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9jbWVudS90ZXN0LmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDYgTXVyYWxpIEtyaXNobmFuIEdhbmFwYXRoeSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiY21lbnUuaCIKKyNpbmNsdWRlICJoZWxwLmgiCisjaW5jbHVkZSAicGFzc3dvcmRzLmgiCisjaW5jbHVkZSAiY29tMzJpby5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIE1BWF9DTURfTElORV9MRU5HVEggNTE0CisKK3R5cGVkZWYgc3RydWN0IHNfeHRyYSB7CisgIGxvbmcgaXBhcHBlbmQ7IC8vIFN0b3JlcyB0aGUgaXBhcHBlbmQgZmxhZyB0byBzZW5kICh1c2VmdWwgZm9yIFBYRUxJTlVYIG9ubHkpCisgIGNoYXIgKmFyZ3NtZW51OyAvLyBTdG9yZXMgdGhlIG5hbWUgb2YgbWVudSB3aGljaCBjb250YWlucyBvcHRpb25zIGZvciB0aGUgZ2l2ZW4gUlVOIGl0ZW0KKyAgY2hhciAqcGVybXM7IC8vIHN0b3JlcyB0aGUgcGVybWlzc2lvbnMgcmVxdWlyZWQgdG8gYWN0aXZhdGUgdGhlIGl0ZW0KK30gdF94dHJhOworCit0eXBlZGVmIHRfeHRyYSAqcHRfeHRyYTsgLy8gUG9pbnRlciB0byBleHRyYSBkYXRhc3RydWN0dXJlCisKKy8vIFR5cGVzIG9mIGRvdCBjb21tYW5kcyBmb3Igd2hpY2ggY2FsbGVyIHRha2VzIHJlc3BvbnNpYmlsaXR5IG9mIGhhbmRsaW5nCisvLyBJbiBzb21lIGNhc2Ugc29tZSBjb21tYW5kcyBtYXkgbm90IG1ha2Ugc2Vuc2UsIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIKKy8vIHRvIGhhbmRsZSBjYXNlcyB3aGljaCBkbyBub3QgbWFrZSBzZW5zZQordHlwZWRlZiBlbnVtIHtRVUlUX0NNRCwgUkVQRUFUX0NNRCwgRU5URVJfQ01ELCBFU0NBUEVfQ01EfSB0X2RvdGNtZDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgKi8KKworLy8gZGVmYXVsdCB1c2VyCisjZGVmaW5lIEdVRVNUX1VTRVIgImd1ZXN0IgorCisvLyBmb3IgbG9jYWwgY29tbWFuZHMuIHJldHVybiB2YWx1ZSBvZiBleGVjZG90Y21kCisjZGVmaW5lIFFVSVRfQ01EIDAKKyNkZWZpbmUgUlBUX0NNRCAxCisKK2NoYXIgdXNlcm5hbWVbMTJdOyAvLyBOYW1lIG9mIHVzZXIgY3VycmVudGx5IHVzaW5nIHRoZSBzeXN0ZW0KKworaW50IFBXRF9ST1c7IC8vIExpbmUgbnVtYmVyIHdoZXJlIHVzZXIgYXV0aGVudGljYXRpb24gaGFwcGVucworaW50IEVESVRfUk9XOyAvLyByb3cgd2hlcmUgVXNlciBUYWIKKworY2hhciBsb2dpbnN0cltdID0gIjxMPm9naW4gICI7CitjaGFyIGxvZ291dHN0clszMF07CisKK2ludCB2bW9kZTsgLy8gVGhlIHZpZGVvIG1vZGUgd2Ugd2FudCB0byBiZSBpbgorY2hhciB0aW1lb3V0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOyAvLyBDb21tYW5kIHRvIGV4ZWN1dGUgb24gdGltZW91dAorY2hhciB0b3RhbHRpbWVvdXRjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07IC8vIENvbW1hbmQgdG8gZXhlY3V0ZSBvbiB0b3RhbHRpbWVvdXQKKworY2hhciBRVUlUU1RSW10gPSAiLnF1aXQiOyAvLyBzYW1lIGFzIGV4aXQKK2NoYXIgSUdOT1JFU1RSW109Ii5pZ25vcmUiOyAvLyBzYW1lIGFzIHJlcGVhdCwgd2FpdAorCisvKi0tLS0tLS0tLS0tLS0tLS0gIEVuZCBnbG9iYWxzICovCisKKy8vIHJldHVybnMgcG9pbnRlciB0byBmaXJzdCBub24tc3BhY2UgY2hhcgorLy8gYW5kIGFkdmFuY2VzIGVuZCBvZiBzdHIgYnkgcmVtb3ZpbmcgdHJhaWxpbmcgc3BhY2VzCitjaGFyICogc3RyaXAoY2hhciAqc3RyKQoreworICBjaGFyICpwLCpzLCplOworICBpZiAoIXN0cikgcmV0dXJuIE5VTEw7CisgIHAgPSBzdHI7CisgIHMgPSBOVUxMOworICBlID0gTlVMTDsKKyAgd2hpbGUgKCpwKSB7CisgICAgaWYgKCpwICE9ICcgJykgeworICAgICAgIC8vIG1hcmsgc3RhcnQgb2Ygc3RyaW5nIG9yIHJlY29yZCB0aGUgbGFzdCB2aXNpdGVkIG5vbi1zcGFjZSBjaGFyCisgICAgICAgaWYgKCFzKSBzPXA7IGVsc2UgZT1wOworICAgIH0KKyAgICBwKys7CisgIH0KKyAgKigrK2UpPSdcMCc7IC8vIGtpbGwgc3RyaW5nIGVhcmxpZXIKKyAgcmV0dXJuIHM7Cit9CisKKy8vIGV4ZWN1dGVzIGEgbGlzdCBvZiAlIHNlcGFyYXRlZCBjb21tYW5kcworLy8gbm9uLWRvdCBjb21tYW5kcyBhcmUgYXNzdW1lZCB0byBiZSBzeXNsaW51eCBjb21tYW5kcworLy8gQWxsIHN5c2xpbnV4IGNvbW1hbmRzIGFyZSBhcHBlbmRlZCB3aXRoIHRoZSBjb250ZW50cyBvZiBrZXJhcmdzCisvLyBJZiBpdCBmYWlscyAoa2VybmVsIG5vdCBmb3VuZCkgdGhlbiB0aGUgbmV4dCBvbmUgaXMgdHJpZWQgaW4gdGhlCisvLyBsaXN0CisvLyByZXR1cm5zIFFVSVRfQ01EIG9yIFJQVF9DTUQKK3RfZG90Y21kIGV4ZWNkb3RjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpkZWZjbWQsIGNvbnN0IGNoYXIgKmtlcmFyZ3MpCit7CisgICBjaGFyIGNtZGxpbmVbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgICBjaGFyIGRvdGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgIGNoYXIgKmN1cnIsKm5leHQsKnAsKmFyZ3M7CisgICBjaGFyIGN0cjsKKworICAgc3RyY3B5KGRvdGNtZCxjbWQpOworICAgbmV4dCA9IGRvdGNtZDsKKyAgIGNtZGxpbmVbMF0gPSAnXDAnOworICAgd2hpbGUgKCpuZXh0KSB7IC8vIGlmIHNvbWV0aGluZyB0byBkbworICAgICAgY3VyciA9IG5leHQ7CisgICAgICBwID0gc3RyY2hyKG5leHQsJyUnKTsKKyAgICAgIGlmIChwKSB7CisgICAgICAgICAqcC0tPSdcMCc7IG5leHQ9cCsyOworICAgICAgICAgd2hpbGUgKCpwID09ICcgJykgcC0tOworICAgICAgICAgKigrK3ApPSdcMCc7IC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqZGVmY21kKSB7IC8vIGV4ZWN1dGUgZGVmY21kIG5leHQKKyAgICAgICAgICAgIG5leHQ9ZGVmY21kOworICAgICAgICAgICAgZGVmY21kPU5VTEw7IC8vIGV4ZWMgZGVmIGNtZCBvbmx5IG9uY2UKKyAgICAgICAgfSBlbHNlIG5leHQ9TlVMTDsKKyAgICAgIH0KKyAgICAgIC8vIG5vdyB3ZSBqdXN0IG5lZWQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCAiY3VyciIKKyAgICAgIGN1cnIgPSBzdHJpcChjdXJyKTsKKyAgICAgIGlmIChjdXJyWzBdICE9ICcuJykgeyAvLyBqdXN0IHJ1biB0aGUga2VybmVsCisgICAgICAgICBzdHJjcHkoY21kbGluZSxjdXJyKTsKKyAgICAgICAgIGlmIChrZXJhcmdzKSBzdHJjYXQoY21kbGluZSxrZXJhcmdzKTsKKyAgICAgICAgIHJ1bnN5c2xpbnV4aW1hZ2UoY21kbGluZSwwKTsgLy8gTm8gSVBBcHBlbmQKKyAgICAgIH0gZWxzZSB7IC8vIFdlIGhhdmUgYSBET1QgY29tbWFuZAorICAgICAgICAvLyBzcGxpdCBjb21tYW5kIGludG8gY29tbWFuZCBhbmQgYXJncyAobWF5IGJlIGVtcHR5KQorICAgICAgICBhcmdzID0gY3VycjsKKyAgICAgICAgd2hpbGUgKCAoKmFyZ3MgIT0gJyAnKSAmJiAoKmFyZ3MgIT0gJ1wwJykgKSBhcmdzKys7CisgICAgICAgIGlmICgqYXJncykgeyAvLyBmb3VuZCBhIHNwYWNlCisgICAgICAgICAgICphcmdzKysgPSAnXDAnOworICAgICAgICAgICB3aGlsZSAoKmFyZ3MgPT0gJyAnKSBhcmdzKys7IC8vIHNraXAgb3ZlciBzcGFjZXMKKyAgICAgICAgfQorICAgICAgICBpZiAoIChzdHJjbXAoY3VyciwiLmV4aXQiKT09MCkgfHwKKyAgICAgICAgICAgICAoc3RyY21wKGN1cnIsIi5xdWl0Iik9PTApCisgICAgICAgICAgICkKKyAgICAgICAgICAgcmV0dXJuIFFVSVRfQ01EOworICAgICAgICBpZiAoIChzdHJjbXAoY3VyciwiLnJlcGVhdCIpPT0wKSB8fAorICAgICAgICAgICAgIChzdHJjbXAoY3VyciwiLmlnbm9yZSIpPT0wKSB8fAorICAgICAgICAgICAgIChzdHJjbXAoY3VyciwiLndhaXQiKT09MCkKKyAgICAgICAgICAgKQorICAgICAgICAgICByZXR1cm4gUlBUX0NNRDsKKyAgICAgICAgaWYgKHN0cmNtcChjdXJyLCIuYmVlcCIpPT0wKSB7CisgICAgICAgICAgIGlmICgoYXJncykgJiYgKCcwJyA8PSBhcmdzWzBdKSAmJiAoYXJnc1swXSA8PSAnOScpKQorICAgICAgICAgICAgICBjdHIgPSBhcmdzWzBdLScwJzsKKyAgICAgICAgICAgZWxzZSBjdHI9MTsKKyAgICAgICAgICAgZm9yICg7Y3RyPjA7IGN0ci0tKSBiZWVwKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChjdXJyLCIuaGVscCIpPT0wKSBydW5oZWxwKGFyZ3MpOworICAgICAgfQorICAgfQorICAgcmV0dXJuIFJQVF9DTUQ7IC8vIGJ5IGRlZmF1bHQgd2UgZG8gbm90IHF1aXQKK30KKworCitUSU1FT1VUQ09ERSB0aW1lb3V0KGNvbnN0IGNoYXIgKmNtZCkKK3sKKyAgdF9kb3RjbWQgYzsKKyAgYyA9IGV4ZWNkb3RjbWQoY21kLCIud2FpdCIsTlVMTCk7CisgIHN3aXRjaChjKSB7CisgICAgY2FzZSBFTlRFUl9DTUQ6CisgICAgICAgICByZXR1cm4gQ09ERV9FTlRFUjsKKyAgICBjYXNlIEVTQ0FQRV9DTUQ6CisgICAgICAgICByZXR1cm4gQ09ERV9FU0NBUEU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBDT0RFX1dBSVQ7CisgIH0KK30KKworVElNRU9VVENPREUgb250aW1lb3V0KHZvaWQpCit7CisgICByZXR1cm4gdGltZW91dCh0aW1lb3V0Y21kKTsKK30KKworVElNRU9VVENPREUgb250b3RhbHRpbWVvdXQodm9pZCkKK3sKKyAgIHJldHVybiB0aW1lb3V0KHRvdGFsdGltZW91dGNtZCk7Cit9CisKK3ZvaWQga2V5c19oYW5kbGVyKHRfbWVudXN5c3RlbSAqIG1zIF9fYXR0cmlidXRlX18gKCggdW51c2VkICkpLCB0X21lbnVpdGVtICogbWksIGludCBzY2FuY29kZSkKK3sKKyAgIGludCBuYywgbnI7CisKKyAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZuciwgJm5jKSkgeworICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgbmMgPSA4MDsKKyAgICAgICBuciA9IDI0OworICAgfQorCisgICBpZiAoIChzY2FuY29kZSA9PSBLRVlfRjEpICYmIChtaS0+aGVscGlkICE9IDB4RkZGRikgKSB7IC8vIElmIHNjYW5jb2RlIG9mIEYxIGFuZCBub24tdHJpdmlhbCBoZWxwaWQKKyAgICAgIHJ1bmhlbHBzeXN0ZW0obWktPmhlbHBpZCk7CisgICB9CisKKyAgIC8vIElmIHVzZXIgaGl0IFRBQiwgYW5kIGl0ZW0gaXMgYW4gImV4ZWN1dGFibGUiIGl0ZW0KKyAgIC8vIGFuZCB1c2VyIGhhcyBwcml2aWxlZ2VzIHRvIGVkaXQgaXQsIGVkaXQgaXQgaW4gcGxhY2UuCisgICBpZiAoKHNjYW5jb2RlID09IEtFWV9UQUIpICYmIChtaS0+YWN0aW9uID09IE9QVF9SVU4pICYmCisgICAgICAgKEVESVRfUk9XIDwgbnIpICYmIChFRElUX1JPVyA+IDApICYmCisgICAgICAgKGlzYWxsb3dlZCh1c2VybmFtZSwiZWRpdGNtZCIpIHx8IGlzYWxsb3dlZCh1c2VybmFtZSwicm9vdCIpKSkgeworICAgICAvLyBVc2VyIHR5cGVkIFRBQiBhbmQgaGFzIHBlcm1pc3Npb25zIHRvIGVkaXQgY29tbWFuZCBsaW5lCisgICAgIGdvdG94eShFRElUX1JPVywxKTsKKyAgICAgY3NwcmludCgiQ29tbWFuZCBsaW5lOiIsMHgwNyk7CisgICAgIGVkaXRzdHJpbmcobWktPmRhdGEsQUNUSU9OTEVOKTsKKyAgICAgZ290b3h5KEVESVRfUk9XLDEpOworICAgICBjcHJpbnQoJyAnLDB4MDcsbmMtMSk7CisgICB9Cit9CisKK3RfaGFuZGxlcl9yZXR1cm4gbG9naW5faGFuZGxlcih0X21lbnVzeXN0ZW0gKm1zLCB0X21lbnVpdGVtICptaSkKK3sKKyAgKHZvaWQpbWk7IC8vIFVudXNlZAorICBjaGFyIHB3ZFs0MF07CisgIGNoYXIgbG9naW5bNDBdOworICBpbnQgbmMsIG5yOworICB0X2hhbmRsZXJfcmV0dXJuIHJ2OworCisgICh2b2lkKW1zOworCisgIHJ2ID0gQUNUSU9OX0lOVkFMSUQ7CisgIGlmIChQV0RfUk9XIDwgMCkgcmV0dXJuIHJ2OyAvLyBObyBuZWVkIHRvIGF1dGhlbnRpY2F0ZQorCisgIGlmIChtaS0+aXRlbSA9PSBsb2dpbnN0cikgeyAvKiBVc2VyIHdhbnRzIHRvIGxvZ2luICovCisgICAgaWYgKGdldHNjcmVlbnNpemUoMSwgJm5yLCAmbmMpKSB7CisgICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgIG5jID0gODA7CisgICAgICAgIG5yID0gMjQ7CisgICAgfQorCisgICAgZ290b3h5KFBXRF9ST1csMSk7CisgICAgY3NwcmludCgiRW50ZXIgVXNlcm5hbWU6ICIsMHgwNyk7CisgICAgZ2V0c3RyaW5nKGxvZ2luLCBzaXplb2YgdXNlcm5hbWUpOworICAgIGdvdG94eShQV0RfUk9XLDEpOworICAgIGNwcmludCgnICcsMHgwNyxuYyk7CisgICAgY3NwcmludCgiRW50ZXIgUGFzc3dvcmQ6ICIsMHgwNyk7CisgICAgZ2V0cHdkKHB3ZCwgc2l6ZW9mIHB3ZCk7CisgICAgZ290b3h5KFBXRF9ST1csMSk7CisgICAgY3ByaW50KCcgJywweDA3LG5jKTsKKworICAgIGlmIChhdXRoZW50aWNhdGVfdXNlcihsb2dpbixwd2QpKQorICAgIHsKKyAgICAgIHN0cmNweSh1c2VybmFtZSxsb2dpbik7CisgICAgICBzdHJjcHkobG9nb3V0c3RyLCI8TD5vZ291dCAiKTsKKyAgICAgIHN0cmNhdChsb2dvdXRzdHIsdXNlcm5hbWUpOworICAgICAgbWktPml0ZW0gPSBsb2dvdXRzdHI7IC8vIENoYW5nZSBpdGVtIHRvIHJlYWQgIkxvZ291dCIKKyAgICAgIHJ2LnJlZnJlc2ggPSAxOyAvLyByZWZyZXNoIHRoZSBzY3JlZW4gKGFzIGl0ZW0gY29udGVudHMgY2hhbmdlZCkKKyAgICB9CisgICAgZWxzZSBzdHJjcHkodXNlcm5hbWUsR1VFU1RfVVNFUik7CisgIH0KKyAgZWxzZSAvLyBVc2VyIG5lZWRzIHRvIGxvZ291dAorICB7CisgICAgc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworICAgIHN0cmNweShsb2dvdXRzdHIsIiIpOworICAgIG1pLT5pdGVtID0gbG9naW5zdHI7CisgIH0KKworICByZXR1cm4gcnY7Cit9CisKK3RfaGFuZGxlcl9yZXR1cm4gY2hlY2tfcGVybXModF9tZW51c3lzdGVtICptcywgdF9tZW51aXRlbSAqbWkpCit7CisgICBjaGFyICpwZXJtczsKKyAgIHB0X3h0cmEgeDsKKworICAgKHZvaWQpIG1zOyAvLyBUbyBrZWVwIGNvbXBpbGVyIGhhcHB5CisKKyAgIHggPSAocHRfeHRyYSkgbWktPmV4dHJhX2RhdGE7CisgICBwZXJtcyA9ICggeCA/IHgtPnBlcm1zIDogTlVMTCk7CisgICBpZiAoIXBlcm1zKSByZXR1cm4gQUNUSU9OX1ZBTElEOworCisgICBpZiAoaXNhbGxvd2VkKHVzZXJuYW1lLCJyb290IikgfHwgaXNhbGxvd2VkKHVzZXJuYW1lLHBlcm1zKSkgLy8gSWYgYWxsb3dlZAorICAgICAgcmV0dXJuIEFDVElPTl9WQUxJRDsKKyAgIGVsc2UgcmV0dXJuIEFDVElPTl9JTlZBTElEOworfQorCisvLyBDb21wdXRlIHRoZSBmdWxsIGNvbW1hbmQgbGluZSB0byBhZGQgYW5kIGlmIG5vbi10cml2aWFsCisvLyBwcmVwZW5kIHRoZSBzdHJpbmcgcHJlcGVuZCB0byBmaW5hbCBjb21tYW5kIGxpbmUKKy8vIEFzc3VtZSBjbWRsaW5lIHBvaW50cyB0byBidWZmZXIgbG9uZyBlbm91Z2ggdG8gaG9sZCBhbnN3ZXIKK3ZvaWQgZ2VuY29tbWFuZChwdF9tZW51aXRlbSBtaSwgY2hhciAqY21kbGluZSkKK3sKKyAgIHB0X3h0cmEgeDsKKyAgIGNtZGxpbmVbMF0gPSAnXDAnOworICAgc3RyY2F0KGNtZGxpbmUsbWktPmRhdGEpOworICAgeCA9IChwdF94dHJhKSBtaS0+ZXh0cmFfZGF0YTsKKyAgIGlmICggKHgpICYmICh4LT5hcmdzbWVudSkpIGdlbl9hcHBlbmRfbGluZSh4LT5hcmdzbWVudSxjbWRsaW5lKTsKK30KKworCisvLyBydW4gdGhlIGdpdmVuIGNvbW1hbmQgdG9nZXRoZXIgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnMgd2hpY2ggbWF5IG5lZWQgcGFzc2luZwordm9pZCBydW5jb21tYW5kKHB0X21lbnVpdGVtIG1pKQoreworICAgY2hhciAqbGluZTsKKyAgIHB0X3h0cmEgeDsKKyAgIGxvbmcgaXBhcHBlbmQ7CisKKyAgIGxpbmUgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqTUFYX0NNRF9MSU5FX0xFTkdUSCk7CisgICBnZW5jb21tYW5kKG1pLGxpbmUpOworICAgeCA9IChwdF94dHJhKSBtaS0+ZXh0cmFfZGF0YTsKKyAgIGlwYXBwZW5kID0gKHggPyB4LT5pcGFwcGVuZCA6IDApOworCisgICBydW5zeXNsaW51eGltYWdlKGxpbmUsaXBhcHBlbmQpOworICAgZnJlZShsaW5lKTsKK30KKworLy8gc2V0IHRoZSBleHRyYSBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIG1lbnUgaXRlbS4KK3ZvaWQgc2V0X3h0cmEocHRfbWVudWl0ZW0gbWksIGNvbnN0IGNoYXIgKmFyZ3NtZW51LCBjb25zdCBjaGFyICpwZXJtcywgdW5zaWduZWQgaW50IGhlbHBpZCwgbG9uZyBpcGFwcGVuZCkKK3sKKyAgIHB0X3h0cmEgeHRyYTsKKyAgIGludCBiYWRfYXJnc21lbnUsIGJhZF9wZXJtcywgYmFkX2lwYXBwZW5kOworCisgICBtaS0+ZXh0cmFfZGF0YSA9IE5VTEw7IC8vIGluaXRhbGl6ZQorICAgbWktPmhlbHBpZCA9IGhlbHBpZDsgLy8gc2V0IGhlbHAgaWQKKworICAgaWYgKG1pLT5hY3Rpb24gIT0gT1BUX1JVTikgcmV0dXJuOworCisgICBiYWRfYXJnc21lbnUgPSBiYWRfcGVybXMgPSBiYWRfaXBhcHBlbmQgPSAwOworICAgaWYgKCAoYXJnc21lbnU9PU5VTEwpIHx8IChzdHJsZW4oYXJnc21lbnUpPT0wKSkgYmFkX2FyZ3NtZW51ID0gMTsKKyAgIGlmICggKHBlcm1zPT1OVUxMKSB8fCAoc3RybGVuKHBlcm1zKT09MCkpIGJhZF9wZXJtcyA9IDE7CisgICBpZiAoIGlwYXBwZW5kPT0wKSBiYWRfaXBhcHBlbmQgPSAxOworCisgICBpZiAoYmFkX2FyZ3NtZW51ICYmIGJhZF9wZXJtcyAmJiBiYWRfaXBhcHBlbmQpIHJldHVybjsKKworICAgeHRyYSA9IChwdF94dHJhKSBtYWxsb2Moc2l6ZW9mKHRfeHRyYSkpOworICAgbWktPmV4dHJhX2RhdGEgPSAodm9pZCAqKSB4dHJhOworICAgeHRyYS0+YXJnc21lbnUgPSB4dHJhLT5wZXJtcyA9IE5VTEw7CisgICB4dHJhLT5pcGFwcGVuZCA9IGlwYXBwZW5kOworICAgaWYgKCFiYWRfYXJnc21lbnUpIHsKKyAgICAgIHh0cmEtPmFyZ3NtZW51ID0gKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSooc3RybGVuKGFyZ3NtZW51KSsxKSk7CisgICAgICBzdHJjcHkoeHRyYS0+YXJnc21lbnUsYXJnc21lbnUpOworICAgfQorICAgaWYgKCFiYWRfcGVybXMpIHsKKyAgICAgIHh0cmEtPnBlcm1zID0gKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSooc3RybGVuKHBlcm1zKSsxKSk7CisgICAgICBzdHJjcHkoeHRyYS0+cGVybXMscGVybXMpOworICAgICAgbWktPmhhbmRsZXIgPSAmY2hlY2tfcGVybXM7CisgICB9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgIHB0X21lbnVpdGVtIGN1cnI7CisgIGNoYXIgcXVpdDsKKyAgY2hhciBleGl0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIGV4aXRjbWRyb290W01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIG9uZXJyY21kW01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIHN0YXJ0ZmlsZVtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciAqZWNtZDsgLy8gZWZmZWN0aXZlIGV4aXQgY29tbWFuZCBvciBvbmVycm9yY21kCisgIGNoYXIgc2tpcGJpdHM7CisgIGNoYXIgc2tpcGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgaW50IHRpbWVvdXQ7IC8vIHRpbWUgaW4gbXVsdGlwbGVzIG9mIDAuMSBzZWNvbmRzCisgIGludCB0b3RhbHRpbWVvdXQ7IC8vIHRpbWUgaW4gbXVsdGlwbGVzIG9mIDAuMSBzZWNvbmRzCisgIHRfZG90Y21kIGRvdHJ2OyAvLyB0byBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4ZWNkb3RjbWQKKyAgaW50IHRlbXA7CisKKyAgc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworLyogLS0tLSBJbml0aWFsaXppbmcgbWVudSBzeXN0ZW0gcGFyYW1ldGVycyAtLS0gKi8KKyAgdm1vZGUgPSAweEZGOworICBza2lwYml0cyA9IDA7CisgIFBXRF9ST1cgPSAyMzsKKyAgRURJVF9ST1cgPSAyMzsKKyAgc3RyY3B5KG9uZXJyY21kLCIucmVwZWF0Iik7CisgIHN0cmNweShleGl0Y21kLCIuZXhpdCIpOworICBzdHJjcHkoZXhpdGNtZHJvb3QsIiIpOworICAvLyBJZiBub3Qgc3BlY2lmaWVkIGV4aXRjbWRyb290ID0gZXhpdGNtZAorICBpZiAoZXhpdGNtZHJvb3RbMF0gPT0gJ1wwJykgc3RyY3B5KGV4aXRjbWRyb290LGV4aXRjbWQpOworICAvLyBUaW1lb3V0IHN0dWZmCisgIHRpbWVvdXQgPSA2MDA7CisgIHN0cmNweSh0aW1lb3V0Y21kLCIuYmVlcCIpOworICB0b3RhbHRpbWVvdXQgPSAwOworICBzdHJjcHkodG90YWx0aW1lb3V0Y21kLCIud2FpdCIpOworICBzdHJjcHkoc3RhcnRmaWxlLCIiKTsKKworICBpbml0X2hlbHAoIi9pc29saW51eC9oZWxwIik7CisgIGluaXRfcGFzc3dvcmRzKCIiKTsKKyAgaW5pdF9tZW51c3lzdGVtKCJBIHRlc3Qgb2YgdGhlIHRlc3QubWVudSBmaWxlIik7CisgIHNldF93aW5kb3dfc2l6ZSgxLDEsMjMsNzgpOworCisgIC8vIFJlZ2lzdGVyIHRoZSBvbnRpbWVvdXQgaGFuZGxlciwgd2l0aCBhIHRpbWUgb3V0IG9mIDEwIHNlY29uZHMKKyAgcmVnX29udGltZW91dChvbnRpbWVvdXQsdGltZW91dCoxMCwwKTsKKyAgcmVnX29udG90YWx0aW1lb3V0KG9udG90YWx0aW1lb3V0LHRvdGFsdGltZW91dCoxMCk7CisKKyAgLy8gUmVnaXN0ZXIgbWVudXN5c3RlbSBoYW5kbGVycworICByZWdfaGFuZGxlcihIRExSX0tFWVMsJmtleXNfaGFuZGxlcik7CisvKiAtLS0tIEVuZCBvZiBpbml0aWFsaXphdGlvbiAtLS0gKi8KKworLyogLS0tLS0tLSBNRU5VIHRlc3RpbmcgLS0tLS0gKi8KKyAgYWRkX25hbWVkX21lbnUoInRlc3RpbmciLCIgVGVzdGluZyAiLC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIlNlbGYgTG9vcCIsIkdvIHRvIFRlc3RpbmciLE9QVF9TVUJNRU5VLCJ0ZXN0aW5nIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiTWVtb3J5IFRlc3QiLCJQZXJmb3JtIGV4dGVuc2l2ZSBtZW1vcnkgdGVzdGluZyIsT1BUX1JVTiwibWVtdGVzdCIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIkV4aXQgdGhpcyBtZW51IiwiR28gb25lIGxldmVsIHVwIixPUFRfRVhJVE1FTlUsIiIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworLyogLS0tLS0tLSBNRU5VIHJlc2N1ZSAtLS0tLSAqLworICBhZGRfbmFtZWRfbWVudSgicmVzY3VlIiwiIFJlc2N1ZSBPcHRpb25zICIsLTEpOworICBzZXRfbWVudV9wb3MoMTAsMTApOworCisgIGN1cnIgPSBhZGRfaXRlbSgiTGludXggUmVzY3VlIiwibGlucmVzYyIsT1BUX1JVTiwibGlucmVzYyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIkRvcyBSZXNjdWUiLCJkb3NyZXNjIixPUFRfUlVOLCJkb3NyZXNjIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiV2luZG93cyBSZXNjdWUiLCJ3aW5yZXNjIixPUFRfUlVOLCJ3aW5yZXNjIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiRXhpdCB0aGlzIG1lbnUiLCJHbyBvbmUgbGV2ZWwgdXAiLE9QVF9FWElUTUVOVSwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisvKiAtLS0tLS0tIE1FTlUgbWFpbiAtLS0tLSAqLworICBhZGRfbmFtZWRfbWVudSgibWFpbiIsIiBNYWluIE1lbnUgIiwtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJQcmVwYXJlIiwicHJlcCIsT1BUX1JVTiwicHJlcCIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIlJlc2N1ZSBvcHRpb25zLi4uIiwiVHJvdWJsZXNob290IGEgc3lzdGVtIixPUFRfU1VCTUVOVSwicmVzY3VlIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiVGVzdGluZy4uLiIsIk9wdGlvbnMgdG8gdGVzdCBoYXJkd2FyZSIsT1BUX1NVQk1FTlUsInRlc3RpbmciLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJFeGl0IHRoaXMgbWVudSIsIkdvIG9uZSBsZXZlbCB1cCIsT1BUX0VYSVRNRU5VLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisvKiAtLS0tLS0tIEVORCBPRiBNRU5VIGRlY2xhcmF0aW9ucyAtLS0tLSAqLworCisvLyBDaGVjayBpZiB3ZSBzaG91bGQgc2tpcCB0aGUgbWVudSBhbHRvZ2V0aGVyCisgIHF1aXQgPSAwOyAvLyBEb250IHNraXAgdGhlIG1lbnUKKyAgaWYgKGdldHNoaWZ0ZmxhZ3MoKSAmIHNraXBiaXRzKSB7IC8vIHdlIG11c3Qgc2tpcCB0aGUgbWVudSBhbHRvZ3RoZXIgYW5kIGV4ZWN1dGUgc2tpcGNtZAorICAgIGRvdHJ2ID0gZXhlY2RvdGNtZChza2lwY21kLCIuYmVlcCUuZXhpdCIsTlVMTCk7IC8vIFdvcnN0IGNhc2Ugd2UgYmVlcCBhbmQgZXhpdAorICAgIGlmIChkb3RydiA9PSBRVUlUX0NNRCkgcXVpdCA9IDE7CisgIH0KKworLy8gU3dpdGNoIHZpZGUgbW9kZSBpZiByZXF1aXJlZAorICAgaWYgKHZtb2RlICE9IDB4RkYpIHNldHZpZGVvbW9kZSh2bW9kZSk7CisKKy8vIERvIHdlIGhhdmUgYSBzdGFydGZpbGUgdG8gZGlzcGxheT8KKyAgIGlmIChzdGFydGZpbGVbMF0gIT0gJ1wwJykgcnVuaGVscChzdGFydGZpbGUpOworCisvLyBUaGUgbWFpbiBsb29wCisgIHdoaWxlIChxdWl0ID09IDApIHsgLy8gQXMgbG9uZyBhcyBxdWl0IGlzIHplcm8gcmVwZWF0CisgICAgIGN1cnIgPSBzaG93bWVudXMoZmluZF9tZW51X251bSgibWFpbiIpKTsgLy8gSW5pdGlhbCBtZW51IGlzIHRoZSBvbmUgY2FsbGVkICJtYWluIgorCisgICAgIGlmIChjdXJyKSB7CisgICAgICAgIGlmIChjdXJyLT5hY3Rpb24gPT0gT1BUX1JVTikgeworICAgICAgICAgICBlY21kID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKk1BWF9DTURfTElORV9MRU5HVEgpOworICAgICAgICAgICBnZW5jb21tYW5kKGN1cnIsZWNtZCk7CisgICAgICAgICAgIHRlbXAgPSAoY3Vyci0+ZXh0cmFfZGF0YSA/ICgocHRfeHRyYSljdXJyLT5leHRyYV9kYXRhKS0+aXBhcHBlbmQgOiAwKTsKKyAgICAgICAgICAgcnVuc3lzbGludXhpbWFnZShlY21kLHRlbXApOworICAgICAgICAgICAvLyBrZXJuZWwgbm90IGZvdW5kIHNvIGV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGRvdCBjb21tYW5kCisgICAgICAgICAgIGRvdHJ2ID0gZXhlY2RvdGNtZChvbmVycmNtZCwiLnF1aXQiLGVjbWQpOyAvLyBwYXNzIGJhZCBjbWRsaW5lIGFzIGFyZworICAgICAgICAgICBpZiAoZG90cnY9PSBRVUlUX0NNRCkgcXVpdCA9IDE7CisgICAgICAgICAgIGZyZWUoZWNtZCk7IGVjbWQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgY3NwcmludCgiRXJyb3IgaW4gcHJvZ3JhbW1pbmchIiwweDA3KTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZmluZCBlZmZlY3RpdmUgZXhpdCBjb21tYW5kCisgICAgICAgIGVjbWQgPSAoIGlzYWxsb3dlZCh1c2VybmFtZSwicm9vdCIpID8gZXhpdGNtZHJvb3QgOiBleGl0Y21kKTsKKyAgICAgICAgZG90cnYgPSBleGVjZG90Y21kKGVjbWQsIi5yZXBlYXQiLE5VTEwpOworICAgICAgICBxdWl0ID0gKGRvdHJ2ID09IFFVSVRfQ01EID8gMSA6IDApOyAvLyBzaG91bGQgd2UgZXhpdCBub3cKKyAgICAgfQorICB9CisKKy8vIERlYWxsb2NhdGUgc3BhY2UgdXNlZCBhbmQgcXVpdAorICBjbG9zZV9wYXNzd29yZHMoKTsKKyAgY2xvc2VfaGVscCgpOworICBjbG9zZV9tZW51c3lzdGVtKCk7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2NtZW51L3Rlc3QuYzMyIGIvYmlvcy9jb20zMi9jbWVudS90ZXN0LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xY2RmNTdmCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9jbWVudS90ZXN0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2NtZW51L3Rlc3QyLmMgYi9iaW9zL2NvbTMyL2NtZW51L3Rlc3QyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1MmYxYgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvY21lbnUvdGVzdDIuYwpAQCAtMCwwICsxLDUzNCBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBNdXJhbGkgS3Jpc2huYW4gR2FuYXBhdGh5IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCAqKSAwKQorI2VuZGlmCisKKyNpbmNsdWRlICJjbWVudS5oIgorI2luY2x1ZGUgImhlbHAuaCIKKyNpbmNsdWRlICJwYXNzd29yZHMuaCIKKyNpbmNsdWRlICJjb20zMmlvLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgTUFYX0NNRF9MSU5FX0xFTkdUSCA1MTQKKwordHlwZWRlZiBzdHJ1Y3Qgc194dHJhIHsKKyAgbG9uZyBpcGFwcGVuZDsgLy8gU3RvcmVzIHRoZSBpcGFwcGVuZCBmbGFnIHRvIHNlbmQgKHVzZWZ1bCBmb3IgUFhFTElOVVggb25seSkKKyAgY2hhciAqYXJnc21lbnU7IC8vIFN0b3JlcyB0aGUgbmFtZSBvZiBtZW51IHdoaWNoIGNvbnRhaW5zIG9wdGlvbnMgZm9yIHRoZSBnaXZlbiBSVU4gaXRlbQorICBjaGFyICpwZXJtczsgLy8gc3RvcmVzIHRoZSBwZXJtaXNzaW9ucyByZXF1aXJlZCB0byBhY3RpdmF0ZSB0aGUgaXRlbQorfSB0X3h0cmE7CisKK3R5cGVkZWYgdF94dHJhICpwdF94dHJhOyAvLyBQb2ludGVyIHRvIGV4dHJhIGRhdGFzdHJ1Y3R1cmUKKworLy8gVHlwZXMgb2YgZG90IGNvbW1hbmRzIGZvciB3aGljaCBjYWxsZXIgdGFrZXMgcmVzcG9uc2liaWxpdHkgb2YgaGFuZGxpbmcKKy8vIEluIHNvbWUgY2FzZSBzb21lIGNvbW1hbmRzIG1heSBub3QgbWFrZSBzZW5zZSwgaXQgaXMgdXAgdG8gdGhlIGNhbGxlcgorLy8gdG8gaGFuZGxlIGNhc2VzIHdoaWNoIGRvIG5vdCBtYWtlIHNlbnNlCit0eXBlZGVmIGVudW0ge1FVSVRfQ01ELCBSRVBFQVRfQ01ELCBFTlRFUl9DTUQsIEVTQ0FQRV9DTUR9IHRfZG90Y21kOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAqLworCisvLyBkZWZhdWx0IHVzZXIKKyNkZWZpbmUgR1VFU1RfVVNFUiAiZ3Vlc3QiCisKKy8vIGZvciBsb2NhbCBjb21tYW5kcy4gcmV0dXJuIHZhbHVlIG9mIGV4ZWNkb3RjbWQKKyNkZWZpbmUgUVVJVF9DTUQgMAorI2RlZmluZSBSUFRfQ01EIDEKKworY2hhciB1c2VybmFtZVsxMl07IC8vIE5hbWUgb2YgdXNlciBjdXJyZW50bHkgdXNpbmcgdGhlIHN5c3RlbQorCitpbnQgUFdEX1JPVzsgLy8gTGluZSBudW1iZXIgd2hlcmUgdXNlciBhdXRoZW50aWNhdGlvbiBoYXBwZW5zCitpbnQgRURJVF9ST1c7IC8vIHJvdyB3aGVyZSBVc2VyIFRhYgorCitjaGFyIGxvZ2luc3RyW10gPSAiPEw+b2dpbiAgIjsKK2NoYXIgbG9nb3V0c3RyWzMwXTsKKworaW50IHZtb2RlOyAvLyBUaGUgdmlkZW8gbW9kZSB3ZSB3YW50IHRvIGJlIGluCitjaGFyIHRpbWVvdXRjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07IC8vIENvbW1hbmQgdG8gZXhlY3V0ZSBvbiB0aW1lb3V0CitjaGFyIHRvdGFsdGltZW91dGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsgLy8gQ29tbWFuZCB0byBleGVjdXRlIG9uIHRvdGFsdGltZW91dAorCitjaGFyIFFVSVRTVFJbXSA9ICIucXVpdCI7IC8vIHNhbWUgYXMgZXhpdAorY2hhciBJR05PUkVTVFJbXT0iLmlnbm9yZSI7IC8vIHNhbWUgYXMgcmVwZWF0LCB3YWl0CisKKy8qLS0tLS0tLS0tLS0tLS0tLSAgRW5kIGdsb2JhbHMgKi8KKworLy8gcmV0dXJucyBwb2ludGVyIHRvIGZpcnN0IG5vbi1zcGFjZSBjaGFyCisvLyBhbmQgYWR2YW5jZXMgZW5kIG9mIHN0ciBieSByZW1vdmluZyB0cmFpbGluZyBzcGFjZXMKK2NoYXIgKiBzdHJpcChjaGFyICpzdHIpCit7CisgIGNoYXIgKnAsKnMsKmU7CisgIGlmICghc3RyKSByZXR1cm4gTlVMTDsKKyAgcCA9IHN0cjsKKyAgcyA9IE5VTEw7CisgIGUgPSBOVUxMOworICB3aGlsZSAoKnApIHsKKyAgICBpZiAoKnAgIT0gJyAnKSB7CisgICAgICAgLy8gbWFyayBzdGFydCBvZiBzdHJpbmcgb3IgcmVjb3JkIHRoZSBsYXN0IHZpc2l0ZWQgbm9uLXNwYWNlIGNoYXIKKyAgICAgICBpZiAoIXMpIHM9cDsgZWxzZSBlPXA7CisgICAgfQorICAgIHArKzsKKyAgfQorICAqKCsrZSk9J1wwJzsgLy8ga2lsbCBzdHJpbmcgZWFybGllcgorICByZXR1cm4gczsKK30KKworLy8gZXhlY3V0ZXMgYSBsaXN0IG9mICUgc2VwYXJhdGVkIGNvbW1hbmRzCisvLyBub24tZG90IGNvbW1hbmRzIGFyZSBhc3N1bWVkIHRvIGJlIHN5c2xpbnV4IGNvbW1hbmRzCisvLyBBbGwgc3lzbGludXggY29tbWFuZHMgYXJlIGFwcGVuZGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIGtlcmFyZ3MKKy8vIElmIGl0IGZhaWxzIChrZXJuZWwgbm90IGZvdW5kKSB0aGVuIHRoZSBuZXh0IG9uZSBpcyB0cmllZCBpbiB0aGUKKy8vIGxpc3QKKy8vIHJldHVybnMgUVVJVF9DTUQgb3IgUlBUX0NNRAordF9kb3RjbWQgZXhlY2RvdGNtZChjb25zdCBjaGFyICpjbWQsIGNoYXIgKmRlZmNtZCwgY29uc3QgY2hhciAqa2VyYXJncykKK3sKKyAgIGNoYXIgY21kbGluZVtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgIGNoYXIgZG90Y21kW01BWF9DTURfTElORV9MRU5HVEhdOworICAgY2hhciAqY3VyciwqbmV4dCwqcCwqYXJnczsKKyAgIGNoYXIgY3RyOworCisgICBzdHJjcHkoZG90Y21kLGNtZCk7CisgICBuZXh0ID0gZG90Y21kOworICAgY21kbGluZVswXSA9ICdcMCc7CisgICB3aGlsZSAoKm5leHQpIHsgLy8gaWYgc29tZXRoaW5nIHRvIGRvCisgICAgICBjdXJyID0gbmV4dDsKKyAgICAgIHAgPSBzdHJjaHIobmV4dCwnJScpOworICAgICAgaWYgKHApIHsKKyAgICAgICAgICpwLS09J1wwJzsgbmV4dD1wKzI7CisgICAgICAgICB3aGlsZSAoKnAgPT0gJyAnKSBwLS07CisgICAgICAgICAqKCsrcCk9J1wwJzsgLy8gcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCpkZWZjbWQpIHsgLy8gZXhlY3V0ZSBkZWZjbWQgbmV4dAorICAgICAgICAgICAgbmV4dD1kZWZjbWQ7CisgICAgICAgICAgICBkZWZjbWQ9TlVMTDsgLy8gZXhlYyBkZWYgY21kIG9ubHkgb25jZQorICAgICAgICB9IGVsc2UgbmV4dD1OVUxMOworICAgICAgfQorICAgICAgLy8gbm93IHdlIGp1c3QgbmVlZCB0byBleGVjdXRlIHRoZSBjb21tYW5kICJjdXJyIgorICAgICAgY3VyciA9IHN0cmlwKGN1cnIpOworICAgICAgaWYgKGN1cnJbMF0gIT0gJy4nKSB7IC8vIGp1c3QgcnVuIHRoZSBrZXJuZWwKKyAgICAgICAgIHN0cmNweShjbWRsaW5lLGN1cnIpOworICAgICAgICAgaWYgKGtlcmFyZ3MpIHN0cmNhdChjbWRsaW5lLGtlcmFyZ3MpOworICAgICAgICAgcnVuc3lzbGludXhpbWFnZShjbWRsaW5lLDApOyAvLyBObyBJUEFwcGVuZAorICAgICAgfSBlbHNlIHsgLy8gV2UgaGF2ZSBhIERPVCBjb21tYW5kCisgICAgICAgIC8vIHNwbGl0IGNvbW1hbmQgaW50byBjb21tYW5kIGFuZCBhcmdzIChtYXkgYmUgZW1wdHkpCisgICAgICAgIGFyZ3MgPSBjdXJyOworICAgICAgICB3aGlsZSAoICgqYXJncyAhPSAnICcpICYmICgqYXJncyAhPSAnXDAnKSApIGFyZ3MrKzsKKyAgICAgICAgaWYgKCphcmdzKSB7IC8vIGZvdW5kIGEgc3BhY2UKKyAgICAgICAgICAgKmFyZ3MrKyA9ICdcMCc7CisgICAgICAgICAgIHdoaWxlICgqYXJncyA9PSAnICcpIGFyZ3MrKzsgLy8gc2tpcCBvdmVyIHNwYWNlcworICAgICAgICB9CisgICAgICAgIGlmICggKHN0cmNtcChjdXJyLCIuZXhpdCIpPT0wKSB8fAorICAgICAgICAgICAgIChzdHJjbXAoY3VyciwiLnF1aXQiKT09MCkKKyAgICAgICAgICAgKQorICAgICAgICAgICByZXR1cm4gUVVJVF9DTUQ7CisgICAgICAgIGlmICggKHN0cmNtcChjdXJyLCIucmVwZWF0Iik9PTApIHx8CisgICAgICAgICAgICAgKHN0cmNtcChjdXJyLCIuaWdub3JlIik9PTApIHx8CisgICAgICAgICAgICAgKHN0cmNtcChjdXJyLCIud2FpdCIpPT0wKQorICAgICAgICAgICApCisgICAgICAgICAgIHJldHVybiBSUFRfQ01EOworICAgICAgICBpZiAoc3RyY21wKGN1cnIsIi5iZWVwIik9PTApIHsKKyAgICAgICAgICAgaWYgKChhcmdzKSAmJiAoJzAnIDw9IGFyZ3NbMF0pICYmIChhcmdzWzBdIDw9ICc5JykpCisgICAgICAgICAgICAgIGN0ciA9IGFyZ3NbMF0tJzAnOworICAgICAgICAgICBlbHNlIGN0cj0xOworICAgICAgICAgICBmb3IgKDtjdHI+MDsgY3RyLS0pIGJlZXAoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKGN1cnIsIi5oZWxwIik9PTApIHJ1bmhlbHAoYXJncyk7CisgICAgICB9CisgICB9CisgICByZXR1cm4gUlBUX0NNRDsgLy8gYnkgZGVmYXVsdCB3ZSBkbyBub3QgcXVpdAorfQorCisKK1RJTUVPVVRDT0RFIHRpbWVvdXQoY29uc3QgY2hhciAqY21kKQoreworICB0X2RvdGNtZCBjOworICBjID0gZXhlY2RvdGNtZChjbWQsIi53YWl0IixOVUxMKTsKKyAgc3dpdGNoKGMpIHsKKyAgICBjYXNlIEVOVEVSX0NNRDoKKyAgICAgICAgIHJldHVybiBDT0RFX0VOVEVSOworICAgIGNhc2UgRVNDQVBFX0NNRDoKKyAgICAgICAgIHJldHVybiBDT0RFX0VTQ0FQRTsKKyAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIENPREVfV0FJVDsKKyAgfQorfQorCitUSU1FT1VUQ09ERSBvbnRpbWVvdXQodm9pZCkKK3sKKyAgIHJldHVybiB0aW1lb3V0KHRpbWVvdXRjbWQpOworfQorCitUSU1FT1VUQ09ERSBvbnRvdGFsdGltZW91dCh2b2lkKQoreworICAgcmV0dXJuIHRpbWVvdXQodG90YWx0aW1lb3V0Y21kKTsKK30KKwordm9pZCBrZXlzX2hhbmRsZXIodF9tZW51c3lzdGVtICogbXMgX19hdHRyaWJ1dGVfXyAoKCB1bnVzZWQgKSksIHRfbWVudWl0ZW0gKiBtaSwgaW50IHNjYW5jb2RlKQoreworICAgaW50IG5jLCBucjsKKworICAgaWYgKGdldHNjcmVlbnNpemUoMSwgJm5yLCAmbmMpKSB7CisgICAgICAgLyogVW5rbm93biBzY3JlZW4gc2l6ZT8gKi8KKyAgICAgICBuYyA9IDgwOworICAgICAgIG5yID0gMjQ7CisgICB9CisKKyAgIGlmICggKHNjYW5jb2RlID09IEtFWV9GMSkgJiYgKG1pLT5oZWxwaWQgIT0gMHhGRkZGKSApIHsgLy8gSWYgc2NhbmNvZGUgb2YgRjEgYW5kIG5vbi10cml2aWFsIGhlbHBpZAorICAgICAgcnVuaGVscHN5c3RlbShtaS0+aGVscGlkKTsKKyAgIH0KKworICAgLy8gSWYgdXNlciBoaXQgVEFCLCBhbmQgaXRlbSBpcyBhbiAiZXhlY3V0YWJsZSIgaXRlbQorICAgLy8gYW5kIHVzZXIgaGFzIHByaXZpbGVnZXMgdG8gZWRpdCBpdCwgZWRpdCBpdCBpbiBwbGFjZS4KKyAgIGlmICgoc2NhbmNvZGUgPT0gS0VZX1RBQikgJiYgKG1pLT5hY3Rpb24gPT0gT1BUX1JVTikgJiYKKyAgICAgICAoRURJVF9ST1cgPCBucikgJiYgKEVESVRfUk9XID4gMCkgJiYKKyAgICAgICAoaXNhbGxvd2VkKHVzZXJuYW1lLCJlZGl0Y21kIikgfHwgaXNhbGxvd2VkKHVzZXJuYW1lLCJyb290IikpKSB7CisgICAgIC8vIFVzZXIgdHlwZWQgVEFCIGFuZCBoYXMgcGVybWlzc2lvbnMgdG8gZWRpdCBjb21tYW5kIGxpbmUKKyAgICAgZ290b3h5KEVESVRfUk9XLDEpOworICAgICBjc3ByaW50KCJDb21tYW5kIGxpbmU6IiwweDA3KTsKKyAgICAgZWRpdHN0cmluZyhtaS0+ZGF0YSxBQ1RJT05MRU4pOworICAgICBnb3RveHkoRURJVF9ST1csMSk7CisgICAgIGNwcmludCgnICcsMHgwNyxuYy0xKTsKKyAgIH0KK30KKwordF9oYW5kbGVyX3JldHVybiBsb2dpbl9oYW5kbGVyKHRfbWVudXN5c3RlbSAqbXMsIHRfbWVudWl0ZW0gKm1pKQoreworICAodm9pZCltaTsgLy8gVW51c2VkCisgIGNoYXIgcHdkWzQwXTsKKyAgY2hhciBsb2dpbls0MF07CisgIGludCBuYywgbnI7CisgIHRfaGFuZGxlcl9yZXR1cm4gcnY7CisKKyAgKHZvaWQpbXM7CisKKyAgcnYgPSBBQ1RJT05fSU5WQUxJRDsKKyAgaWYgKFBXRF9ST1cgPCAwKSByZXR1cm4gcnY7IC8vIE5vIG5lZWQgdG8gYXV0aGVudGljYXRlCisKKyAgaWYgKG1pLT5pdGVtID09IGxvZ2luc3RyKSB7IC8qIFVzZXIgd2FudHMgdG8gbG9naW4gKi8KKyAgICBpZiAoZ2V0c2NyZWVuc2l6ZSgxLCAmbnIsICZuYykpIHsKKyAgICAgICAgLyogVW5rbm93biBzY3JlZW4gc2l6ZT8gKi8KKyAgICAgICAgbmMgPSA4MDsKKyAgICAgICAgbnIgPSAyNDsKKyAgICB9CisKKyAgICBnb3RveHkoUFdEX1JPVywxKTsKKyAgICBjc3ByaW50KCJFbnRlciBVc2VybmFtZTogIiwweDA3KTsKKyAgICBnZXRzdHJpbmcobG9naW4sIHNpemVvZiB1c2VybmFtZSk7CisgICAgZ290b3h5KFBXRF9ST1csMSk7CisgICAgY3ByaW50KCcgJywweDA3LG5jKTsKKyAgICBjc3ByaW50KCJFbnRlciBQYXNzd29yZDogIiwweDA3KTsKKyAgICBnZXRwd2QocHdkLCBzaXplb2YgcHdkKTsKKyAgICBnb3RveHkoUFdEX1JPVywxKTsKKyAgICBjcHJpbnQoJyAnLDB4MDcsbmMpOworCisgICAgaWYgKGF1dGhlbnRpY2F0ZV91c2VyKGxvZ2luLHB3ZCkpCisgICAgeworICAgICAgc3RyY3B5KHVzZXJuYW1lLGxvZ2luKTsKKyAgICAgIHN0cmNweShsb2dvdXRzdHIsIjxMPm9nb3V0ICIpOworICAgICAgc3RyY2F0KGxvZ291dHN0cix1c2VybmFtZSk7CisgICAgICBtaS0+aXRlbSA9IGxvZ291dHN0cjsgLy8gQ2hhbmdlIGl0ZW0gdG8gcmVhZCAiTG9nb3V0IgorICAgICAgcnYucmVmcmVzaCA9IDE7IC8vIHJlZnJlc2ggdGhlIHNjcmVlbiAoYXMgaXRlbSBjb250ZW50cyBjaGFuZ2VkKQorICAgIH0KKyAgICBlbHNlIHN0cmNweSh1c2VybmFtZSxHVUVTVF9VU0VSKTsKKyAgfQorICBlbHNlIC8vIFVzZXIgbmVlZHMgdG8gbG9nb3V0CisgIHsKKyAgICBzdHJjcHkodXNlcm5hbWUsR1VFU1RfVVNFUik7CisgICAgc3RyY3B5KGxvZ291dHN0ciwiIik7CisgICAgbWktPml0ZW0gPSBsb2dpbnN0cjsKKyAgfQorCisgIHJldHVybiBydjsKK30KKwordF9oYW5kbGVyX3JldHVybiBjaGVja19wZXJtcyh0X21lbnVzeXN0ZW0gKm1zLCB0X21lbnVpdGVtICptaSkKK3sKKyAgIGNoYXIgKnBlcm1zOworICAgcHRfeHRyYSB4OworCisgICAodm9pZCkgbXM7IC8vIFRvIGtlZXAgY29tcGlsZXIgaGFwcHkKKworICAgeCA9IChwdF94dHJhKSBtaS0+ZXh0cmFfZGF0YTsKKyAgIHBlcm1zID0gKCB4ID8geC0+cGVybXMgOiBOVUxMKTsKKyAgIGlmICghcGVybXMpIHJldHVybiBBQ1RJT05fVkFMSUQ7CisKKyAgIGlmIChpc2FsbG93ZWQodXNlcm5hbWUsInJvb3QiKSB8fCBpc2FsbG93ZWQodXNlcm5hbWUscGVybXMpKSAvLyBJZiBhbGxvd2VkCisgICAgICByZXR1cm4gQUNUSU9OX1ZBTElEOworICAgZWxzZSByZXR1cm4gQUNUSU9OX0lOVkFMSUQ7Cit9CisKKy8vIENvbXB1dGUgdGhlIGZ1bGwgY29tbWFuZCBsaW5lIHRvIGFkZCBhbmQgaWYgbm9uLXRyaXZpYWwKKy8vIHByZXBlbmQgdGhlIHN0cmluZyBwcmVwZW5kIHRvIGZpbmFsIGNvbW1hbmQgbGluZQorLy8gQXNzdW1lIGNtZGxpbmUgcG9pbnRzIHRvIGJ1ZmZlciBsb25nIGVub3VnaCB0byBob2xkIGFuc3dlcgordm9pZCBnZW5jb21tYW5kKHB0X21lbnVpdGVtIG1pLCBjaGFyICpjbWRsaW5lKQoreworICAgcHRfeHRyYSB4OworICAgY21kbGluZVswXSA9ICdcMCc7CisgICBzdHJjYXQoY21kbGluZSxtaS0+ZGF0YSk7CisgICB4ID0gKHB0X3h0cmEpIG1pLT5leHRyYV9kYXRhOworICAgaWYgKCAoeCkgJiYgKHgtPmFyZ3NtZW51KSkgZ2VuX2FwcGVuZF9saW5lKHgtPmFyZ3NtZW51LGNtZGxpbmUpOworfQorCisKKy8vIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCB0b2dldGhlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucyB3aGljaCBtYXkgbmVlZCBwYXNzaW5nCit2b2lkIHJ1bmNvbW1hbmQocHRfbWVudWl0ZW0gbWkpCit7CisgICBjaGFyICpsaW5lOworICAgcHRfeHRyYSB4OworICAgbG9uZyBpcGFwcGVuZDsKKworICAgbGluZSA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSpNQVhfQ01EX0xJTkVfTEVOR1RIKTsKKyAgIGdlbmNvbW1hbmQobWksbGluZSk7CisgICB4ID0gKHB0X3h0cmEpIG1pLT5leHRyYV9kYXRhOworICAgaXBhcHBlbmQgPSAoeCA/IHgtPmlwYXBwZW5kIDogMCk7CisKKyAgIHJ1bnN5c2xpbnV4aW1hZ2UobGluZSxpcGFwcGVuZCk7CisgICBmcmVlKGxpbmUpOworfQorCisvLyBzZXQgdGhlIGV4dHJhIGluZm8gZm9yIHRoZSBzcGVjaWZpZWQgbWVudSBpdGVtLgordm9pZCBzZXRfeHRyYShwdF9tZW51aXRlbSBtaSwgY29uc3QgY2hhciAqYXJnc21lbnUsIGNvbnN0IGNoYXIgKnBlcm1zLCB1bnNpZ25lZCBpbnQgaGVscGlkLCBsb25nIGlwYXBwZW5kKQoreworICAgcHRfeHRyYSB4dHJhOworICAgaW50IGJhZF9hcmdzbWVudSwgYmFkX3Blcm1zLCBiYWRfaXBhcHBlbmQ7CisKKyAgIG1pLT5leHRyYV9kYXRhID0gTlVMTDsgLy8gaW5pdGFsaXplCisgICBtaS0+aGVscGlkID0gaGVscGlkOyAvLyBzZXQgaGVscCBpZAorCisgICBpZiAobWktPmFjdGlvbiAhPSBPUFRfUlVOKSByZXR1cm47CisKKyAgIGJhZF9hcmdzbWVudSA9IGJhZF9wZXJtcyA9IGJhZF9pcGFwcGVuZCA9IDA7CisgICBpZiAoIChhcmdzbWVudT09TlVMTCkgfHwgKHN0cmxlbihhcmdzbWVudSk9PTApKSBiYWRfYXJnc21lbnUgPSAxOworICAgaWYgKCAocGVybXM9PU5VTEwpIHx8IChzdHJsZW4ocGVybXMpPT0wKSkgYmFkX3Blcm1zID0gMTsKKyAgIGlmICggaXBhcHBlbmQ9PTApIGJhZF9pcGFwcGVuZCA9IDE7CisKKyAgIGlmIChiYWRfYXJnc21lbnUgJiYgYmFkX3Blcm1zICYmIGJhZF9pcGFwcGVuZCkgcmV0dXJuOworCisgICB4dHJhID0gKHB0X3h0cmEpIG1hbGxvYyhzaXplb2YodF94dHJhKSk7CisgICBtaS0+ZXh0cmFfZGF0YSA9ICh2b2lkICopIHh0cmE7CisgICB4dHJhLT5hcmdzbWVudSA9IHh0cmEtPnBlcm1zID0gTlVMTDsKKyAgIHh0cmEtPmlwYXBwZW5kID0gaXBhcHBlbmQ7CisgICBpZiAoIWJhZF9hcmdzbWVudSkgeworICAgICAgeHRyYS0+YXJnc21lbnUgPSAoY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpKihzdHJsZW4oYXJnc21lbnUpKzEpKTsKKyAgICAgIHN0cmNweSh4dHJhLT5hcmdzbWVudSxhcmdzbWVudSk7CisgICB9CisgICBpZiAoIWJhZF9wZXJtcykgeworICAgICAgeHRyYS0+cGVybXMgPSAoY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpKihzdHJsZW4ocGVybXMpKzEpKTsKKyAgICAgIHN0cmNweSh4dHJhLT5wZXJtcyxwZXJtcyk7CisgICAgICBtaS0+aGFuZGxlciA9ICZjaGVja19wZXJtczsKKyAgIH0KK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgcHRfbWVudWl0ZW0gY3VycjsKKyAgY2hhciBxdWl0OworICBjaGFyIGV4aXRjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgIGNoYXIgZXhpdGNtZHJvb3RbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgIGNoYXIgb25lcnJjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgIGNoYXIgc3RhcnRmaWxlW01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyICplY21kOyAvLyBlZmZlY3RpdmUgZXhpdCBjb21tYW5kIG9yIG9uZXJyb3JjbWQKKyAgY2hhciBza2lwYml0czsKKyAgY2hhciBza2lwY21kW01BWF9DTURfTElORV9MRU5HVEhdOworICBpbnQgdGltZW91dDsgLy8gdGltZSBpbiBtdWx0aXBsZXMgb2YgMC4xIHNlY29uZHMKKyAgaW50IHRvdGFsdGltZW91dDsgLy8gdGltZSBpbiBtdWx0aXBsZXMgb2YgMC4xIHNlY29uZHMKKyAgdF9kb3RjbWQgZG90cnY7IC8vIHRvIHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgZXhlY2RvdGNtZAorICBpbnQgdGVtcDsKKworICBzdHJjcHkodXNlcm5hbWUsR1VFU1RfVVNFUik7CisvKiAtLS0tIEluaXRpYWxpemluZyBtZW51IHN5c3RlbSBwYXJhbWV0ZXJzIC0tLSAqLworICB2bW9kZSA9IDB4RkY7CisgIHNraXBiaXRzID0gU0hJRlRfUFJFU1NFRCB8IENBUFNMT0NLX09OOworICBQV0RfUk9XID0gMjM7CisgIEVESVRfUk9XID0gMjM7CisgIHN0cmNweShvbmVycmNtZCwiLmJlZXAgMiAlICUgLmhlbHAgaGxwMDAwMjUudHh0ICUgLmV4aXQiKTsKKyAgc3RyY3B5KGV4aXRjbWQsIi5leGl0Iik7CisgIHN0cmNweShleGl0Y21kcm9vdCwiIik7CisgIC8vIElmIG5vdCBzcGVjaWZpZWQgZXhpdGNtZHJvb3QgPSBleGl0Y21kCisgIGlmIChleGl0Y21kcm9vdFswXSA9PSAnXDAnKSBzdHJjcHkoZXhpdGNtZHJvb3QsZXhpdGNtZCk7CisgIC8vIFRpbWVvdXQgc3R1ZmYKKyAgdGltZW91dCA9IDYwMDsKKyAgc3RyY3B5KHRpbWVvdXRjbWQsIi53YWl0Iik7CisgIHRvdGFsdGltZW91dCA9IDA7CisgIHN0cmNweSh0b3RhbHRpbWVvdXRjbWQsImNoYWluLmMzMiBoZCAwIik7CisgIHN0cmNweShzdGFydGZpbGUsImhscDAwMDI2LnR4dCIpOworCisgIGluaXRfaGVscCgiL2lzb2xpbnV4L2hlbHAiKTsKKyAgaW5pdF9wYXNzd29yZHMoIi9pc29saW51eC9wYXNzd29yZCIpOworICBpbml0X21lbnVzeXN0ZW0oIiBDT01CT09UIE1lbnUgU3lzdGVtICIpOworICBzZXRfd2luZG93X3NpemUoMSwxLDIxLDc5KTsKKworICAvLyBSZWdpc3RlciB0aGUgb250aW1lb3V0IGhhbmRsZXIsIHdpdGggYSB0aW1lIG91dCBvZiAxMCBzZWNvbmRzCisgIHJlZ19vbnRpbWVvdXQob250aW1lb3V0LHRpbWVvdXQqMTAsMCk7CisgIHJlZ19vbnRvdGFsdGltZW91dChvbnRvdGFsdGltZW91dCx0b3RhbHRpbWVvdXQqMTApOworCisgIC8vIFJlZ2lzdGVyIG1lbnVzeXN0ZW0gaGFuZGxlcnMKKyAgcmVnX2hhbmRsZXIoSERMUl9LRVlTLCZrZXlzX2hhbmRsZXIpOworLyogLS0tLSBFbmQgb2YgaW5pdGlhbGl6YXRpb24gLS0tICovCisKKy8qIC0tLS0tLS0gTUVOVSBuZXRtZW51IC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJuZXRtZW51IiwiIEluaXQgTmV0d29yayAiLC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxOPm9uZSIsIkRvbnQgc3RhcnQgbmV0d29yayIsT1BUX1JBRElPSVRFTSwibmV0d29yaz1ubyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxkPmhjcCIsIlVzZSBESENQIixPUFRfUkFESU9JVEVNLCJuZXR3b3JrPWRoY3AiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKy8qIC0tLS0tLS0gTUVOVSB0ZXN0aW5nIC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJ0ZXN0aW5nIiwiIFRlc3RpbmcgIiwtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8TT5lbW9yeSBUZXN0IiwiUGVyZm9ybSBleHRlbnNpdmUgbWVtb3J5IHRlc3RpbmciLE9QVF9SVU4sIm1lbXRlc3QiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDI1LDMpOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8ST5udmlzaWJsZSIsIllvdSBkb250IHNlZSB0aGlzIixPUFRfSU5WSVNJQkxFLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8RT54aXQgbWVudSIsIkdvIG9uZSBsZXZlbCB1cCIsT1BUX0VYSVRNRU5VLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKy8qIC0tLS0tLS0gTUVOVSByZXNjdWUgLS0tLS0gKi8KKyAgYWRkX25hbWVkX21lbnUoInJlc2N1ZSIsIiBSZXNjdWUgT3B0aW9ucyAiLC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxMPmludXggUmVzY3VlIiwiUnVuIGxpbnJlc2MiLE9QVF9SVU4sImxpbnJlc2MiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8RD5vcyBSZXNjdWUiLCJkb3NyZXNjIixPUFRfUlVOLCJkb3NyZXNjIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPFc+aW5kb3dzIFJlc2N1ZSIsIndpbnJlc2MiLE9QVF9SVU4sIndpbnJlc2MiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8RT54aXQgdGhpcyBtZW51IiwiR28gb25lIGxldmVsIHVwIixPUFRfRVhJVE1FTlUsIiIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworLyogLS0tLS0tLSBNRU5VIHByZXAgLS0tLS0gKi8KKyAgYWRkX25hbWVkX21lbnUoInByZXAiLCIgUHJlcCBvcHRpb25zICIsLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPGI+YXNldXJsIGJ5IElQPyIsIlNwZWNpZnkgZ3VpIGJhc2V1cmwgYnkgSVAgYWRkcmVzcyIsT1BUX0NIRUNLQk9YLCJiYXNldXJsPWh0dHA6Ly8xOTIuMTY4LjAuMSIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxtPm91bnRjZD8iLCJNb3VudCB0aGUgY2Ryb20gZHJpdmU/IixPUFRfQ0hFQ0tCT1gsIm1vdW50Y2QiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJOZXR3b3JrIEluaXRpYWxpemF0aW9uIiwiSG93IHRvIGluaXRpYWxpc2UgbmV0d29yayBkZXZpY2U/IixPUFRfUkFESU9NRU5VLCJuZXRtZW51IiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiIiwiIixPUFRfU0VQLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJSZWluc3RhbGwgPHc+aW5kb3dzIiwiUmUtaW5zdGFsbCB0aGUgd2luZG93cyBzaWRlIG9mIGEgZHVhbCBib290IHNldHVwIixPUFRfQ0hFQ0tCT1gsInJlcGFpcj13aW4iLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJSZWluc3RhbGwgPGw+aW51eCIsIlJlLWluc3RhbGwgdGhlIGxpbnV4IHNpZGUgb2YgYSBkdWFsIGJvb3Qgc2V0dXAiLE9QVF9DSEVDS0JPWCwicmVwYWlyPWxpbiIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIiIsIiIsT1BUX1NFUCwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPFI+dW4gcHJlcCBub3ciLCJFeGVjdXRlIHByZXAgd2l0aCB0aGUgYWJvdmUgb3B0aW9ucyIsT1BUX1JVTiwicHJlcCIsMCk7CisgIHNldF94dHJhKGN1cnIsInByZXAiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8RT54aXQgdGhpcyBtZW51IiwiR28gdXAgb25lIGxldmVsIixPUFRfRVhJVE1FTlUsIiIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworLyogLS0tLS0tLSBNRU5VIG1haW4gLS0tLS0gKi8KKyAgYWRkX25hbWVkX21lbnUoIm1haW4iLCIgTWFpbiBNZW51ICIsLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbShsb2dpbnN0ciwiTG9naW4vTG9nb3V0IG9mIGF1dGhlbnRpY2F0aW9uIHN5c3RlbSIsT1BUX1JVTixOVUxMLDApOworICBjdXJyLT5oZWxwaWQgPSA2NTUzNTsKKyAgY3Vyci0+aGFuZGxlciA9ICZsb2dpbl9oYW5kbGVyOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPFA+cmVwYXJlIiwicHJlcCIsT1BUX1JVTiwicHJlcCIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxQPnJlcCBvcHRpb25zLi4uIiwiT3B0aW9ucyBmb3IgcHJlcCIsT1BUX1NVQk1FTlUsInByZXAiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8Uj5lc2N1ZSBvcHRpb25zLi4uIiwiVHJvdWJsZXNob290IGEgc3lzdGVtIixPUFRfU1VCTUVOVSwicmVzY3VlIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiwyNiwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPFQ+ZXN0aW5nLi4uIiwiT3B0aW9ucyB0byB0ZXN0IGhhcmR3YXJlIixPUFRfU1VCTUVOVSwidGVzdGluZyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxFPnhpdCB0byBwcm9tcHQiLCJFeGl0IHRoZSBtZW51IHN5c3RlbSIsT1BUX0VYSVRNRU5VLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisvKiAtLS0tLS0tIEVORCBPRiBNRU5VIGRlY2xhcmF0aW9ucyAtLS0tLSAqLworCisvLyBDaGVjayBpZiB3ZSBzaG91bGQgc2tpcCB0aGUgbWVudSBhbHRvZ2V0aGVyCisgIHF1aXQgPSAwOyAvLyBEb250IHNraXAgdGhlIG1lbnUKKyAgaWYgKGdldHNoaWZ0ZmxhZ3MoKSAmIHNraXBiaXRzKSB7IC8vIHdlIG11c3Qgc2tpcCB0aGUgbWVudSBhbHRvZ3RoZXIgYW5kIGV4ZWN1dGUgc2tpcGNtZAorICAgIGRvdHJ2ID0gZXhlY2RvdGNtZChza2lwY21kLCIuYmVlcCUuZXhpdCIsTlVMTCk7IC8vIFdvcnN0IGNhc2Ugd2UgYmVlcCBhbmQgZXhpdAorICAgIGlmIChkb3RydiA9PSBRVUlUX0NNRCkgcXVpdCA9IDE7CisgIH0KKworLy8gU3dpdGNoIHZpZGUgbW9kZSBpZiByZXF1aXJlZAorICAgaWYgKHZtb2RlICE9IDB4RkYpIHNldHZpZGVvbW9kZSh2bW9kZSk7CisKKy8vIERvIHdlIGhhdmUgYSBzdGFydGZpbGUgdG8gZGlzcGxheT8KKyAgIGlmIChzdGFydGZpbGVbMF0gIT0gJ1wwJykgcnVuaGVscChzdGFydGZpbGUpOworCisvLyBUaGUgbWFpbiBsb29wCisgIHdoaWxlIChxdWl0ID09IDApIHsgLy8gQXMgbG9uZyBhcyBxdWl0IGlzIHplcm8gcmVwZWF0CisgICAgIGN1cnIgPSBzaG93bWVudXMoZmluZF9tZW51X251bSgibWFpbiIpKTsgLy8gSW5pdGlhbCBtZW51IGlzIHRoZSBvbmUgY2FsbGVkICJtYWluIgorCisgICAgIGlmIChjdXJyKSB7CisgICAgICAgIGlmIChjdXJyLT5hY3Rpb24gPT0gT1BUX1JVTikgeworICAgICAgICAgICBlY21kID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKk1BWF9DTURfTElORV9MRU5HVEgpOworICAgICAgICAgICBnZW5jb21tYW5kKGN1cnIsZWNtZCk7CisgICAgICAgICAgIHRlbXAgPSAoY3Vyci0+ZXh0cmFfZGF0YSA/ICgocHRfeHRyYSljdXJyLT5leHRyYV9kYXRhKS0+aXBhcHBlbmQgOiAwKTsKKyAgICAgICAgICAgcnVuc3lzbGludXhpbWFnZShlY21kLHRlbXApOworICAgICAgICAgICAvLyBrZXJuZWwgbm90IGZvdW5kIHNvIGV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGRvdCBjb21tYW5kCisgICAgICAgICAgIGRvdHJ2ID0gZXhlY2RvdGNtZChvbmVycmNtZCwiLnF1aXQiLGVjbWQpOyAvLyBwYXNzIGJhZCBjbWRsaW5lIGFzIGFyZworICAgICAgICAgICBpZiAoZG90cnY9PSBRVUlUX0NNRCkgcXVpdCA9IDE7CisgICAgICAgICAgIGZyZWUoZWNtZCk7IGVjbWQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgY3NwcmludCgiRXJyb3IgaW4gcHJvZ3JhbW1pbmchIiwweDA3KTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZmluZCBlZmZlY3RpdmUgZXhpdCBjb21tYW5kCisgICAgICAgIGVjbWQgPSAoIGlzYWxsb3dlZCh1c2VybmFtZSwicm9vdCIpID8gZXhpdGNtZHJvb3QgOiBleGl0Y21kKTsKKyAgICAgICAgZG90cnYgPSBleGVjZG90Y21kKGVjbWQsIi5yZXBlYXQiLE5VTEwpOworICAgICAgICBxdWl0ID0gKGRvdHJ2ID09IFFVSVRfQ01EID8gMSA6IDApOyAvLyBzaG91bGQgd2UgZXhpdCBub3cKKyAgICAgfQorICB9CisKKy8vIERlYWxsb2NhdGUgc3BhY2UgdXNlZCBhbmQgcXVpdAorICBjbG9zZV9wYXNzd29yZHMoKTsKKyAgY2xvc2VfaGVscCgpOworICBjbG9zZV9tZW51c3lzdGVtKCk7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2NtZW51L3Rlc3QyLmMzMiBiL2Jpb3MvY29tMzIvY21lbnUvdGVzdDIuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3N2M0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2NtZW51L3Rlc3QyLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9sZGxpbnV4LmMzMiBiL2Jpb3MvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkOGYyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9sZGxpbnV4LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9sZGxpbnV4LmVsZiBiL2Jpb3MvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguZWxmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg0ZTg1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9sZGxpbnV4LmVsZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5jMzIgYi9iaW9zL2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYzNDg1NQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvZ2Z4Ym9vdC9nZnhib290LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5lbGYgYi9iaW9zL2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5lbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmY5YzNiMwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvZ2Z4Ym9vdC9nZnhib290LmVsZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2dwbGxpYi9saWJncGwuYzMyIGIvYmlvcy9jb20zMi9ncGxsaWIvbGliZ3BsLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMDk5NWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9ncGxsaWIvbGliZ3BsLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2dwbGxpYi9saWJncGwuZWxmIGIvYmlvcy9jb20zMi9ncGxsaWIvbGliZ3BsLmVsZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNTA1M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9ncGxsaWIvbGliZ3BsLmVsZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2hkdC9oZHQuYzMyIGIvYmlvcy9jb20zMi9oZHQvaGR0LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOGU1MjhmCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9oZHQvaGR0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2xpYi9saWJjb20zMi5jMzIgYi9iaW9zL2NvbTMyL2xpYi9saWJjb20zMi5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWVkYWIzMwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbGliL2xpYmNvbTMyLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2xpYi9saWJjb20zMi5lbGYgYi9iaW9zL2NvbTMyL2xpYi9saWJjb20zMi5lbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzczN2U4NwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbGliL2xpYmNvbTMyLmVsZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2xpYnV0aWwvbGlidXRpbC5jMzIgYi9iaW9zL2NvbTMyL2xpYnV0aWwvbGlidXRpbC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDk2ZmMzMAotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbGlidXRpbC9saWJ1dGlsLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2xpYnV0aWwvbGlidXRpbF9sbnguYSBiL2Jpb3MvY29tMzIvbGlidXRpbC9saWJ1dGlsX2xueC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2FjZTYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2xpYnV0aWwvbGlidXRpbF9sbnguYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvY21lbnUuYzMyIGIvYmlvcy9jb20zMi9sdWEvc3JjL2NtZW51LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZTFkM2YzCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9sdWEvc3JjL2NtZW51LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvY3B1LmMzMiBiL2Jpb3MvY29tMzIvbHVhL3NyYy9jcHUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkZDZjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2x1YS9zcmMvY3B1LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvZGhjcC5jMzIgYi9iaW9zL2NvbTMyL2x1YS9zcmMvZGhjcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWRkMmNhNAotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbHVhL3NyYy9kaGNwLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvZG1pLmMzMiBiL2Jpb3MvY29tMzIvbHVhL3NyYy9kbWkuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc1YzNmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2x1YS9zcmMvZG1pLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvbGZzLmMzMiBiL2Jpb3MvY29tMzIvbHVhL3NyYy9sZnMuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRhMzA5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2x1YS9zcmMvbGZzLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvbGlibHVhLmMzMiBiL2Jpb3MvY29tMzIvbHVhL3NyYy9saWJsdWEuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0N2JmODkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2x1YS9zcmMvbGlibHVhLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvbHVhLmMzMiBiL2Jpb3MvY29tMzIvbHVhL3NyYy9sdWEuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmYTRkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2x1YS9zcmMvbHVhLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvcGNpLmMzMiBiL2Jpb3MvY29tMzIvbHVhL3NyYy9wY2kuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmZDBkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL2x1YS9zcmMvcGNpLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvc3lzbGludXguYzMyIGIvYmlvcy9jb20zMi9sdWEvc3JjL3N5c2xpbnV4LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZDAzNjQwCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9sdWEvc3JjL3N5c2xpbnV4LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL2x1YS9zcmMvdmVzYS5jMzIgYi9iaW9zL2NvbTMyL2x1YS9zcmMvdmVzYS5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODdlY2NhNwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbHVhL3NyYy92ZXNhLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21ib290L21ib290LmMzMiBiL2Jpb3MvY29tMzIvbWJvb3QvbWJvb3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYyM2VjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21ib290L21ib290LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21lbnUvbWVudS5jMzIgYi9iaW9zL2NvbTMyL21lbnUvbWVudS5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTU4NGIwMAotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbWVudS9tZW51LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21lbnUvdmVzYW1lbnUuYzMyIGIvYmlvcy9jb20zMi9tZW51L3Zlc2FtZW51LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mM2Y0NWZiCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tZW51L3Zlc2FtZW51LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvY2F0LmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9jYXQuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYyYmY3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvY2F0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvY21kLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9jbWQuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjZGU3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvY21kLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvY29uZmlnLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9jb25maWcuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI3OWJlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvY29uZmlnLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvY3B0aW1lLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9jcHRpbWUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3M2E2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvY3B0aW1lLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvY3B1aWQuYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL2NwdWlkLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMjFlYzJkCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL2NwdWlkLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvY3B1aWR0ZXN0LmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9jcHVpZHRlc3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhMjE0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvY3B1aWR0ZXN0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvZGVidWcuYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL2RlYnVnLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmUxZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL2RlYnVnLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvZGlzay5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvZGlzay5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmY2NjVhNgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy9kaXNrLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvZG1pdGVzdC5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvZG1pdGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2YzYmIxOQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy9kbWl0ZXN0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvZWxmLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9lbGYuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0MjU2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvZWxmLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvZXRoZXJzZWwuYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL2V0aGVyc2VsLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Y2VlZDYzCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL2V0aGVyc2VsLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvZ3B4ZWNtZC5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvZ3B4ZWNtZC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjY4NGUxNQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy9ncHhlY21kLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvaGV4ZHVtcC5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvaGV4ZHVtcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM5ZWVkMwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy9oZXhkdW1wLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvaG9zdC5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvaG9zdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzU2YjBhYgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy9ob3N0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvaWZjcHUuYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL2lmY3B1LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMTk4OGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL2lmY3B1LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvaWZjcHU2NC5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvaWZjcHU2NC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGFhNmZkMwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy9pZmNwdTY0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvaWZtZW1kc2suYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL2lmbWVtZHNrLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lODU3MTViCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL2lmbWVtZHNrLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvaWZwbG9wLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9pZnBsb3AuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkMDk2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvaWZwbG9wLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMva2JkbWFwLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9rYmRtYXAuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0ZmMwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMva2JkbWFwLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMva29udHJvbl93ZHQuYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL2tvbnRyb25fd2R0LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMzZiYTUwCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL2tvbnRyb25fd2R0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvbGludXguYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL2xpbnV4LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNzE2ZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL2xpbnV4LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvbHMuYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL2xzLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYmYwZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL2xzLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvbWVtaW5mby5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvbWVtaW5mby5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmMzMTJhMwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy9tZW1pbmZvLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvcGNpdGVzdC5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvcGNpdGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTI5Y2NkMwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy9wY2l0ZXN0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvcG1sb2FkLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9wbWxvYWQuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1ZmFkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvcG1sb2FkLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvcG93ZXJvZmYuYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL3Bvd2Vyb2ZmLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lY2EyZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL3Bvd2Vyb2ZmLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvcHJkaGNwLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9wcmRoY3AuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY2OGVmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvcHJkaGNwLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvcHdkLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9wd2QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlZmUzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvcHdkLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvcHhlY2huLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9weGVjaG4uYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkYmRhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvcHhlY2huLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvcmVib290LmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9yZWJvb3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk2OTI0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvcmVib290LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvc2FuYm9vdC5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvc2FuYm9vdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGNiZGY3YwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy9zYW5ib290LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvc2RpLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy9zZGkuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5NGQzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvc2RpLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvdmVzYWluZm8uYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL3Zlc2FpbmZvLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMjFiMTAxCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL3Zlc2FpbmZvLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvdnBkdGVzdC5jMzIgYi9iaW9zL2NvbTMyL21vZHVsZXMvdnBkdGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWRiOTc2OAotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvbW9kdWxlcy92cGR0ZXN0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvd2hpY2hzeXMuYzMyIGIvYmlvcy9jb20zMi9tb2R1bGVzL3doaWNoc3lzLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NmI1ZDViCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9tb2R1bGVzL3doaWNoc3lzLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL21vZHVsZXMvenpqc29uLmMzMiBiL2Jpb3MvY29tMzIvbW9kdWxlcy96empzb24uYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2OWRmMjEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL21vZHVsZXMvenpqc29uLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3Jvc2gvcm9zaC5jMzIgYi9iaW9zL2NvbTMyL3Jvc2gvcm9zaC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmEyMDhiYgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvcm9zaC9yb3NoLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMvYWR2ZHVtcC5jMzIgYi9iaW9zL2NvbTMyL3NhbXBsZXMvYWR2ZHVtcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzY4ZDE1NgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvc2FtcGxlcy9hZHZkdW1wLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMvZW50cnlkdW1wLmMzMiBiL2Jpb3MvY29tMzIvc2FtcGxlcy9lbnRyeWR1bXAuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzNWIzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL3NhbXBsZXMvZW50cnlkdW1wLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5jMzIgYi9iaW9zL2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhhZDhlMAotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvc2FtcGxlcy9mYW5jeWhlbGxvLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5sbnggYi9iaW9zL2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5sbngKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjg0NGUzOQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvc2FtcGxlcy9mYW5jeWhlbGxvLmxueApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMvaGVsbG8uYzMyIGIvYmlvcy9jb20zMi9zYW1wbGVzL2hlbGxvLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjg2ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb20zMi9zYW1wbGVzL2hlbGxvLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5jMzIgYi9iaW9zL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzQ3YTU0NQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvc2FtcGxlcy9rZXl0ZXN0LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5sbnggYi9iaW9zL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5sbngKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGJlMjgwYgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvc2FtcGxlcy9rZXl0ZXN0LmxueApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMvbG9jYWxib290LmMzMiBiL2Jpb3MvY29tMzIvc2FtcGxlcy9sb2NhbGJvb3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiNmI2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL3NhbXBsZXMvbG9jYWxib290LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMvcmVzb2x2LmMzMiBiL2Jpb3MvY29tMzIvc2FtcGxlcy9yZXNvbHYuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiZjI5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvbTMyL3NhbXBsZXMvcmVzb2x2LmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3NhbXBsZXMvc2VyaWFsaW5mby5jMzIgYi9iaW9zL2NvbTMyL3NhbXBsZXMvc2VyaWFsaW5mby5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODFkNDYyMgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvc2FtcGxlcy9zZXJpYWxpbmZvLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5jMzIgYi9iaW9zL2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDI3MGZjYgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvc3lzZHVtcC9zeXNkdW1wLmMzMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5lbGYgYi9iaW9zL2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5lbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDAyZjg1YQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29tMzIvc3lzZHVtcC9zeXNkdW1wLmVsZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUvaXNvbGludXgtZGVidWcuYmluIGIvYmlvcy9jb3JlL2lzb2xpbnV4LWRlYnVnLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTliOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb3JlL2lzb2xpbnV4LWRlYnVnLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUvaXNvbGludXguYmluIGIvYmlvcy9jb3JlL2lzb2xpbnV4LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBmODQzCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb3JlL2lzb2xpbnV4LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUva3dkaGFzaC5nZW4gYi9iaW9zL2NvcmUva3dkaGFzaC5nZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiOTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29yZS9rd2RoYXNoLmdlbgpAQCAtMCwwICsxLDUxIEBACitoYXNoX21lbnUgICAgICAgICAgICAgICBlcXUgMHgwMDM3MTliNQoraGFzaF90ZXh0ICAgICAgICAgICAgICAgZXF1IDB4MDAzYjliNzQKK2hhc2hfaW5jbHVkZSAgICAgICAgICAgIGVxdSAweDlhMDdkOGZmCitoYXNoX2FwcGVuZCAgICAgICAgICAgICBlcXUgMHhjNTM5OTlhNAoraGFzaF9pbml0cmQgICAgICAgICAgICAgZXF1IDB4ZDRkNTVlMjQKK2hhc2hfY29uZmlnICAgICAgICAgICAgIGVxdSAweGMwYzY5NTQ3CitoYXNoX2RlZmF1bHQgICAgICAgICAgICBlcXUgMHhjYzUxNTllZAoraGFzaF91aSAgICAgICAgICAgICAgICAgZXF1IDB4MDAwMDBlYzkKK2hhc2hfZGlzcGxheSAgICAgICAgICAgIGVxdSAweGQ1MDliYzQwCitoYXNoX2ZvbnQgICAgICAgICAgICAgICBlcXUgMHgwMDMyYjFiNAoraGFzaF9pbXBsaWNpdCAgICAgICAgICAgZXF1IDB4YTZmNTAyMDcKK2hhc2hfaXBhcHBlbmQgICAgICAgICAgIGVxdSAweGM1Mzk5YWYwCitoYXNoX2tiZG1hcCAgICAgICAgICAgICBlcXUgMHhkMDEzYjg1MAoraGFzaF9rZXJuZWwgICAgICAgICAgICAgZXF1IDB4ZDA2OGI0Y2MKK2hhc2hfbGludXggICAgICAgICAgICAgIGVxdSAweDA2ZjUzNmQ4CitoYXNoX2Jvb3QgICAgICAgICAgICAgICBlcXUgMHgwMDMwYjE5NAoraGFzaF9ic3MgICAgICAgICAgICAgICAgZXF1IDB4MDAwMTg2MTMKK2hhc2hfcHhlICAgICAgICAgICAgICAgIGVxdSAweDAwMDFjZjY1CitoYXNoX3B4ZXJldHJ5ICAgICAgICAgICBlcXUgMHhjZDEzNWRhNworaGFzaF9mZGltYWdlICAgICAgICAgICAgZXF1IDB4NGVhNzA4OWMKK2hhc2hfY29tYm9vdCAgICAgICAgICAgIGVxdSAweDE4ZTBiMThjCitoYXNoX2NvbTMyICAgICAgICAgICAgICBlcXUgMHgwNjA2MzI1MgoraGFzaF9sYWJlbCAgICAgICAgICAgICAgZXF1IDB4MDZmMTA0Y2MKK2hhc2hfbG9jYWxib290ICAgICAgICAgIGVxdSAweDA0ZjBkZWY0CitoYXNoX3Byb21wdCAgICAgICAgICAgICBlcXUgMHhlNzE2M2E3NAoraGFzaF9zYXkgICAgICAgICAgICAgICAgZXF1IDB4MDAwMWMwNTkKK2hhc2hfc2VyaWFsICAgICAgICAgICAgIGVxdSAweGUwNjhhODRjCitoYXNoX2NvbnNvbGUgICAgICAgICAgICBlcXUgMHgxOGQ4MzFmZAoraGFzaF90aW1lb3V0ICAgICAgICAgICAgZXF1IDB4ZDRlMzMyYzkKK2hhc2hfdG90YWx0aW1lb3V0ICAgICAgIGVxdSAweGVmNTFkMGE5CitoYXNoX2FsbG93b3B0aW9ucyAgICAgICBlcXUgMHgxNjQ4ZGQxMAoraGFzaF9vbnRpbWVvdXQgICAgICAgICAgZXF1IDB4ZDRlMzVlYjkKK2hhc2hfb25lcnJvciAgICAgICAgICAgIGVxdSAweDFhNjhjNTg5CitoYXNoX25vZXNjYXBlICAgICAgICAgICBlcXUgMHgwZDAwMDkwZQoraGFzaF9ub2NvbXBsZXRlICAgICAgICAgZXF1IDB4MWQzYTM2ZTYKK2hhc2hfbm9oYWx0ICAgICAgICAgICAgIGVxdSAweGRhYzU4OWY0CitoYXNoX3N5c2FwcGVuZCAgICAgICAgICBlcXUgMHgwNTM5ZTk3MAoraGFzaF9zZW5kY29va2llcyAgICAgICAgZXF1IDB4MTkwNGU1ZWIKK2hhc2hfZjAgICAgICAgICAgICAgICAgIGVxdSAweDAwMDAwY2YwCitoYXNoX2YxICAgICAgICAgICAgICAgICBlcXUgMHgwMDAwMGNmMQoraGFzaF9mMiAgICAgICAgICAgICAgICAgZXF1IDB4MDAwMDBjZjIKK2hhc2hfZjMgICAgICAgICAgICAgICAgIGVxdSAweDAwMDAwY2YzCitoYXNoX2Y0ICAgICAgICAgICAgICAgICBlcXUgMHgwMDAwMGNmNAoraGFzaF9mNSAgICAgICAgICAgICAgICAgZXF1IDB4MDAwMDBjZjUKK2hhc2hfZjYgICAgICAgICAgICAgICAgIGVxdSAweDAwMDAwY2Y2CitoYXNoX2Y3ICAgICAgICAgICAgICAgICBlcXUgMHgwMDAwMGNmNworaGFzaF9mOCAgICAgICAgICAgICAgICAgZXF1IDB4MDAwMDBjZjgKK2hhc2hfZjkgICAgICAgICAgICAgICAgIGVxdSAweDAwMDAwY2Y5CitoYXNoX2YxMCAgICAgICAgICAgICAgICBlcXUgMHgwMDAxOWUxMAoraGFzaF9mMTEgICAgICAgICAgICAgICAgZXF1IDB4MDAwMTllMTEKK2hhc2hfZjEyICAgICAgICAgICAgICAgIGVxdSAweDAwMDE5ZTEyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUvbGRsaW51eC5iaW4gYi9iaW9zL2NvcmUvbGRsaW51eC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzYTc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29yZS9sZGxpbnV4LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUvbGRsaW51eC5ic3MgYi9iaW9zL2NvcmUvbGRsaW51eC5ic3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiMGQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29yZS9sZGxpbnV4LmJzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUvbGRsaW51eC5zeXMgYi9iaW9zL2NvcmUvbGRsaW51eC5zeXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyYWFlOAotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29yZS9sZGxpbnV4LnN5cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUvbHB4ZWxpbnV4LjAgYi9iaW9zL2NvcmUvbHB4ZWxpbnV4LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmYTdjMQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvY29yZS9scHhlbGludXguMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUvbHB4ZWxpbnV4LmJpbiBiL2Jpb3MvY29yZS9scHhlbGludXguYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZmE3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvcmUvbHB4ZWxpbnV4LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUvcHhlbGludXguMCBiL2Jpb3MvY29yZS9weGVsaW51eC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTM4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2NvcmUvcHhlbGludXguMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2NvcmUvcHhlbGludXguYmluIGIvYmlvcy9jb3JlL3B4ZWxpbnV4LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWEzODg4Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9jb3JlL3B4ZWxpbnV4LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2RpYWcvZ2VvZHNwL2dlb2RzcDFzLmJpbiBiL2Jpb3MvZGlhZy9nZW9kc3AvZ2VvZHNwMXMuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjI2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2RpYWcvZ2VvZHNwL2dlb2RzcDFzLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2RpYWcvZ2VvZHNwL2dlb2RzcDFzLmltZy54eiBiL2Jpb3MvZGlhZy9nZW9kc3AvZ2VvZHNwMXMuaW1nLnh6Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTdjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2RpYWcvZ2VvZHNwL2dlb2RzcDFzLmltZy54egpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2RpYWcvZ2VvZHNwL2dlb2RzcG1zLmJpbiBiL2Jpb3MvZGlhZy9nZW9kc3AvZ2VvZHNwbXMuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiM2MxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2RpYWcvZ2VvZHNwL2dlb2RzcG1zLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2RpYWcvZ2VvZHNwL2dlb2RzcG1zLmltZy54eiBiL2Jpb3MvZGlhZy9nZW9kc3AvZ2VvZHNwbXMuaW1nLnh6Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDE5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2RpYWcvZ2VvZHNwL2dlb2RzcG1zLmltZy54egpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2RpYWcvbWJyL2hhbmRvZmYuYmluIGIvYmlvcy9kaWFnL21ici9oYW5kb2ZmLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM0ZWIzCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9kaWFnL21ici9oYW5kb2ZmLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2Rvcy9zeXNsaW51eC5jb20gYi9iaW9zL2Rvcy9zeXNsaW51eC5jb20KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTE0ZTcyYwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvZG9zL3N5c2xpbnV4LmNvbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2Rvc3V0aWwvY29weWJzLmNvbSBiL2Jpb3MvZG9zdXRpbC9jb3B5YnMuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZGFiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL2Rvc3V0aWwvY29weWJzLmNvbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2Rvc3V0aWwvZWx0b3JpdG8uc3lzIGIvYmlvcy9kb3N1dGlsL2VsdG9yaXRvLnN5cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmJlYjVkCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9kb3N1dGlsL2VsdG9yaXRvLnN5cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2V4dGxpbnV4L2V4dGxpbnV4IGIvYmlvcy9leHRsaW51eC9leHRsaW51eApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40Y2M2YjEzCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9leHRsaW51eC9leHRsaW51eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2dweGUvZ3B4ZWxpbnV4LjAgYi9iaW9zL2dweGUvZ3B4ZWxpbnV4LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzNzE2NgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvZ3B4ZS9ncHhlbGludXguMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2dweGUvZ3B4ZWxpbnV4ay4wIGIvYmlvcy9ncHhlL2dweGVsaW51eGsuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmYzOGYxCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9ncHhlL2dweGVsaW51eGsuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2xpbnV4L3N5c2xpbnV4IGIvYmlvcy9saW51eC9zeXNsaW51eApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTFlMGQzCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9saW51eC9zeXNsaW51eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL2xpbnV4L3N5c2xpbnV4LW5vbXRvb2xzIGIvYmlvcy9saW51eC9zeXNsaW51eC1ub210b29scwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTFlMGQzCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9saW51eC9zeXNsaW51eC1ub210b29scwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9hbHRtYnIuYmluIGIvYmlvcy9tYnIvYWx0bWJyLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjYwMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9tYnIvYWx0bWJyLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9hbHRtYnJfYy5iaW4gYi9iaW9zL21ici9hbHRtYnJfYy5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1MzI0MwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvbWJyL2FsdG1icl9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9hbHRtYnJfZi5iaW4gYi9iaW9zL21ici9hbHRtYnJfZi5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzNzkzOQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvbWJyL2FsdG1icl9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9ncHRtYnIuYmluIGIvYmlvcy9tYnIvZ3B0bWJyLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc4MWIwCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9tYnIvZ3B0bWJyLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9ncHRtYnJfYy5iaW4gYi9iaW9zL21ici9ncHRtYnJfYy5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1N2NlOQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvbWJyL2dwdG1icl9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9ncHRtYnJfZi5iaW4gYi9iaW9zL21ici9ncHRtYnJfZi5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyNjY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvbWJyL2dwdG1icl9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9pc29oZHBmeC5iaW4gYi9iaW9zL21ici9pc29oZHBmeC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzNzE3MwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvbWJyL2lzb2hkcGZ4LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9pc29oZHBmeF9jLmJpbiBiL2Jpb3MvbWJyL2lzb2hkcGZ4X2MuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYzIyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL21ici9pc29oZHBmeF9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9pc29oZHBmeF9mLmJpbiBiL2Jpb3MvbWJyL2lzb2hkcGZ4X2YuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOTRhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL21ici9pc29oZHBmeF9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9pc29oZHBweC5iaW4gYi9iaW9zL21ici9pc29oZHBweC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwNjNmNgotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvbWJyL2lzb2hkcHB4LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9pc29oZHBweF9jLmJpbiBiL2Jpb3MvbWJyL2lzb2hkcHB4X2MuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTc1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL21ici9pc29oZHBweF9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9pc29oZHBweF9mLmJpbiBiL2Jpb3MvbWJyL2lzb2hkcHB4X2YuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWRjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL21ici9pc29oZHBweF9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9tYnIuYmluIGIvYmlvcy9tYnIvbWJyLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZhNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy9tYnIvbWJyLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9tYnJfYy5iaW4gYi9iaW9zL21ici9tYnJfYy5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhODRhYwotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvbWJyL21icl9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21ici9tYnJfZi5iaW4gYi9iaW9zL21ici9tYnJfZi5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlMzY5NAotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvbWJyL21icl9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL21lbWRpc2svbWVtZGlzayBiL2Jpb3MvbWVtZGlzay9tZW1kaXNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGE1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL21lbWRpc2svbWVtZGlzawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL210b29scy9zeXNsaW51eCBiL2Jpb3MvbXRvb2xzL3N5c2xpbnV4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmZDE3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL210b29scy9zeXNsaW51eApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL3NhbXBsZS9zeXNsb2dvLmxzcyBiL2Jpb3Mvc2FtcGxlL3N5c2xvZ28ubHNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTMwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL3NhbXBsZS9zeXNsb2dvLmxzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL3R4dC9odG1sL2lzb2xpbnV4Lmh0bWwgYi9iaW9zL3R4dC9odG1sL2lzb2xpbnV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhOWU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2Jpb3MvdHh0L2h0bWwvaXNvbGludXguaHRtbApAQCAtMCwwICsxLDg4MSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPg0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iYXBwbGljYXRpb24veGh0bWwreG1sOyBjaGFyc2V0PVVURi04IiAvPg0KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQXNjaWlEb2MgOC42LjgiIC8+DQorPHRpdGxlPmlzb2xpbnV4KDEpPC90aXRsZT4NCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KKy8qIFNoYXJlZCBDU1MgZm9yIEFzY2lpRG9jIHhodG1sMTEgYW5kIGh0bWw1IGJhY2tlbmRzICovDQorDQorLyogRGVmYXVsdCBmb250LiAqLw0KK2JvZHkgew0KKyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsc2VyaWY7DQorfQ0KKw0KKy8qIFRpdGxlIGZvbnQuICovDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiwNCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUsDQordGhlYWQsIHAudGFibGUuaGVhZGVyLA0KKyN0b2N0aXRsZSwNCisjYXV0aG9yLCAjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyaywNCisjZm9vdGVyIHsNCisgIGZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsNCit9DQorDQorYm9keSB7DQorICBtYXJnaW46IDFlbSA1JSAxZW0gNSU7DQorfQ0KKw0KK2Egew0KKyAgY29sb3I6IGJsdWU7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCit9DQorYTp2aXNpdGVkIHsNCisgIGNvbG9yOiBmdWNoc2lhOw0KK30NCisNCitlbSB7DQorICBmb250LXN0eWxlOiBpdGFsaWM7DQorICBjb2xvcjogbmF2eTsNCit9DQorDQorc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICMwODMxOTQ7DQorfQ0KKw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBtYXJnaW4tdG9wOiAxLjJlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KKyAgbGluZS1oZWlnaHQ6IDEuMzsNCit9DQorDQoraDEsIGgyLCBoMyB7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitoMiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorfQ0KK2gzIHsNCisgIGZsb2F0OiBsZWZ0Ow0KK30NCitoMyArICogew0KKyAgY2xlYXI6IGxlZnQ7DQorfQ0KK2g1IHsNCisgIGZvbnQtc2l6ZTogMS4wZW07DQorfQ0KKw0KK2Rpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogMDsNCit9DQorDQoraHIgew0KKyAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOw0KK30NCisNCitwIHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KK3VsLCBvbCwgbGkgPiBwIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3VsID4gbGkgICAgIHsgY29sb3I6ICNhYWE7IH0NCit1bCA+IGxpID4gKiB7IGNvbG9yOiBibGFjazsgfQ0KKw0KKy5tb25vc3BhY2VkLCBjb2RlLCBwcmUgew0KKyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCisgIGNvbG9yOiBuYXZ5Ow0KKyAgcGFkZGluZzogMDsNCisgIG1hcmdpbjogMDsNCit9DQorDQorDQorI2F1dGhvciB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCit9DQorI2VtYWlsIHsNCit9DQorI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmsgew0KK30NCisNCisjZm9vdGVyIHsNCisgIGZvbnQtc2l6ZTogc21hbGw7DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLXRvcDogNC4wZW07DQorfQ0KKyNmb290ZXItdGV4dCB7DQorICBmbG9hdDogbGVmdDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorI2Zvb3Rlci1iYWRnZXMgew0KKyAgZmxvYXQ6IHJpZ2h0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisNCisjcHJlYW1ibGUgew0KKyAgbWFyZ2luLXRvcDogMS41ZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmltYWdlYmxvY2ssIGRpdi5leGFtcGxlYmxvY2ssIGRpdi52ZXJzZWJsb2NrLA0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYubGl0ZXJhbGJsb2NrLCBkaXYubGlzdGluZ2Jsb2NrLCBkaXYuc2lkZWJhcmJsb2NrLA0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAyLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDIuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBjb2xvcjogIzYwNjA2MDsNCit9DQorDQorZGl2LmNvbnRlbnQgeyAvKiBCbG9jayBlbGVtZW50IGNvbnRlbnQuICovDQorICBwYWRkaW5nOiAwOw0KK30NCisNCisvKiBCbG9jayBlbGVtZW50IHRpdGxlcy4gKi8NCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCitkaXYudGl0bGUgKyAqIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKw0KK3RkIGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCArIGRpdi50aXRsZSB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorDQorZGl2LnNpZGViYXJibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJhY2tncm91bmQ6ICNmZmZmZWU7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjBmMGYwOw0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5saXN0aW5nYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgYmFja2dyb3VuZDogI2Y4ZjhmODsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYucXVvdGVibG9jaywgZGl2LnZlcnNlYmxvY2sgew0KKyAgcGFkZGluZy1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgY29sb3I6ICM4ODg7DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCitkaXYudmVyc2VibG9jayA+IHByZS5jb250ZW50IHsNCisgIGZvbnQtZmFtaWx5OiBpbmhlcml0Ow0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KK30NCitkaXYudmVyc2VibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC43NWVtOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorLyogREVQUkVDQVRFRDogUHJlIHZlcnNpb24gOC4yLjcgdmVyc2Ugc3R5bGUgbGl0ZXJhbCBibG9jay4gKi8NCitkaXYudmVyc2VibG9jayArIGRpdi5hdHRyaWJ1dGlvbiB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisNCitkaXYuYWRtb25pdGlvbmJsb2NrIC5pY29uIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgdGQuY29udGVudCB7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KK30NCisNCitkaXYuZXhhbXBsZWJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCit9DQorDQorZGl2LmltYWdlYmxvY2sgZGl2LmNvbnRlbnQgeyBwYWRkaW5nLWxlZnQ6IDA7IH0NCitzcGFuLmltYWdlIGltZyB7IGJvcmRlci1zdHlsZTogbm9uZTsgfQ0KK2EuaW1hZ2U6dmlzaXRlZCB7IGNvbG9yOiB3aGl0ZTsgfQ0KKw0KK2RsIHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2R0IHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCitkZCA+ICo6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorfQ0KKw0KK3VsLCBvbCB7DQorICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7DQorfQ0KK29sLmFyYWJpYyB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7DQorfQ0KK29sLmxvd2VyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYTsNCit9DQorb2wudXBwZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLWFscGhhOw0KK30NCitvbC5sb3dlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItcm9tYW47DQorfQ0KK29sLnVwcGVycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1yb21hbjsNCit9DQorDQorZGl2LmNvbXBhY3QgdWwsIGRpdi5jb21wYWN0IG9sLA0KK2Rpdi5jb21wYWN0IHAsIGRpdi5jb21wYWN0IHAsDQorZGl2LmNvbXBhY3QgZGl2LCBkaXYuY29tcGFjdCBkaXYgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQordGZvb3Qgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkID4gZGl2LnZlcnNlIHsNCisgIHdoaXRlLXNwYWNlOiBwcmU7DQorfQ0KKw0KK2Rpdi5oZGxpc3Qgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZGl2LmhkbGlzdCB0ciB7DQorICBwYWRkaW5nLWJvdHRvbTogMTVweDsNCit9DQorZHQuaGRsaXN0MS5zdHJvbmcsIHRkLmhkbGlzdDEuc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZC5oZGxpc3QxIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjhlbTsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCit0ZC5oZGxpc3QyIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5oZGxpc3QuY29tcGFjdCB0ciB7DQorICBtYXJnaW46IDA7DQorICBwYWRkaW5nLWJvdHRvbTogMDsNCit9DQorDQorLmNvbW1lbnQgew0KKyAgYmFja2dyb3VuZDogeWVsbG93Ow0KK30NCisNCisuZm9vdG5vdGUsIC5mb290bm90ZXJlZiB7DQorICBmb250LXNpemU6IDAuOGVtOw0KK30NCisNCitzcGFuLmZvb3Rub3RlLCBzcGFuLmZvb3Rub3RlcmVmIHsNCisgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjsNCit9DQorDQorI2Zvb3Rub3RlcyB7DQorICBtYXJnaW46IDIwcHggMCAyMHB4IDA7DQorICBwYWRkaW5nOiA3cHggMCAwIDA7DQorfQ0KKw0KKyNmb290bm90ZXMgZGl2LmZvb3Rub3RlIHsNCisgIG1hcmdpbjogMCAwIDVweCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGhyIHsNCisgIGJvcmRlcjogbm9uZTsNCisgIGJvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7DQorICBoZWlnaHQ6IDFweDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tbGVmdDogMDsNCisgIHdpZHRoOiAyMCU7DQorICBtaW4td2lkdGg6IDEwMHB4Ow0KK30NCisNCitkaXYuY29saXN0IHRkIHsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuM2VtOw0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmNvbGlzdCB0ZCBpbWcgew0KKyAgbWFyZ2luLXRvcDogMC4zZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICAjZm9vdGVyLWJhZGdlcyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorI3RvYyB7DQorICBtYXJnaW4tYm90dG9tOiAyLjVlbTsNCit9DQorDQorI3RvY3RpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQorZGl2LnRvY2xldmVsMCwgZGl2LnRvY2xldmVsMSwgZGl2LnRvY2xldmVsMiwgZGl2LnRvY2xldmVsMywgZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tdG9wOiAwOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCit9DQorZGl2LnRvY2xldmVsMiB7DQorICBtYXJnaW4tbGVmdDogMmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsMyB7DQorICBtYXJnaW4tbGVmdDogNGVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tbGVmdDogNmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorDQorc3Bhbi5hcXVhIHsgY29sb3I6IGFxdWE7IH0NCitzcGFuLmJsYWNrIHsgY29sb3I6IGJsYWNrOyB9DQorc3Bhbi5ibHVlIHsgY29sb3I6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEgeyBjb2xvcjogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheSB7IGNvbG9yOiBncmF5OyB9DQorc3Bhbi5ncmVlbiB7IGNvbG9yOiBncmVlbjsgfQ0KK3NwYW4ubGltZSB7IGNvbG9yOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24geyBjb2xvcjogbWFyb29uOyB9DQorc3Bhbi5uYXZ5IHsgY29sb3I6IG5hdnk7IH0NCitzcGFuLm9saXZlIHsgY29sb3I6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUgeyBjb2xvcjogcHVycGxlOyB9DQorc3Bhbi5yZWQgeyBjb2xvcjogcmVkOyB9DQorc3Bhbi5zaWx2ZXIgeyBjb2xvcjogc2lsdmVyOyB9DQorc3Bhbi50ZWFsIHsgY29sb3I6IHRlYWw7IH0NCitzcGFuLndoaXRlIHsgY29sb3I6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3cgeyBjb2xvcjogeWVsbG93OyB9DQorDQorc3Bhbi5hcXVhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBhcXVhOyB9DQorc3Bhbi5ibGFjay1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmxhY2s7IH0NCitzcGFuLmJsdWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyYXk7IH0NCitzcGFuLmdyZWVuLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmVlbjsgfQ0KK3NwYW4ubGltZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbGltZTsgfQ0KK3NwYW4ubWFyb29uLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBtYXJvb247IH0NCitzcGFuLm5hdnktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG5hdnk7IH0NCitzcGFuLm9saXZlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBwdXJwbGU7IH0NCitzcGFuLnJlZC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcmVkOyB9DQorc3Bhbi5zaWx2ZXItYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogdGVhbDsgfQ0KK3NwYW4ud2hpdGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3ctYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYmlnIHsgZm9udC1zaXplOiAyZW07IH0NCitzcGFuLnNtYWxsIHsgZm9udC1zaXplOiAwLjZlbTsgfQ0KKw0KK3NwYW4udW5kZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0NCitzcGFuLm92ZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsgfQ0KK3NwYW4ubGluZS10aHJvdWdoIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IH0NCisNCitkaXYudW5icmVha2FibGUgeyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0NCisNCisNCisvKg0KKyAqIHhodG1sMTEgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorZGl2LnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZSB7DQorICBib3JkZXI6IDNweCBzb2xpZCAjNTI3YmJkOw0KK30NCit0aGVhZCwgcC50YWJsZS5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZSB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisvKiBCZWNhdXNlIHRoZSB0YWJsZSBmcmFtZSBhdHRyaWJ1dGUgaXMgb3ZlcnJpZGVuIGJ5IENTUyBpbiBtb3N0IGJyb3dzZXJzLiAqLw0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZvaWQiXSB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9ImhzaWRlcyJdIHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2c2lkZXMiXSB7DQorICBib3JkZXItdG9wLXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsNCit9DQorDQorDQorLyoNCisgKiBodG1sNSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK3RoZWFkLCBwLnRhYmxlYmxvY2suaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogM3B4Ow0KKyAgYm9yZGVyLXNwYWNpbmc6IDBweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KK30NCit0aC50YWJsZWJsb2NrLCB0ZC50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogMXB4Ow0KKyAgcGFkZGluZzogNHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCit9DQorDQordGFibGUudGFibGVibG9jay5mcmFtZS10b3Bib3Qgew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXNpZGVzIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1ub25lIHsNCisgIGJvcmRlci1zdHlsZTogaGlkZGVuOw0KK30NCisNCit0aC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0IHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciwgdGQudGFibGVibG9jay5oYWxpZ24tY2VudGVyIHsNCisgIHRleHQtYWxpZ246IGNlbnRlcjsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tcmlnaHQsIHRkLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0IHsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCit0aC50YWJsZWJsb2NrLnZhbGlnbi10b3AsIHRkLnRhYmxlYmxvY2sudmFsaWduLXRvcCB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUsIHRkLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20sIHRkLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOw0KK30NCisNCisNCisvKg0KKyAqIG1hbnBhZ2Ugc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorYm9keS5tYW5wYWdlIGgxIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitib2R5Lm1hbnBhZ2UgaDIgew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitib2R5Lm1hbnBhZ2UgZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAzZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICBib2R5Lm1hbnBhZ2UgZGl2I3RvYyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorDQorPC9zdHlsZT4NCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQorLyo8IVtDREFUQVsqLw0KK3ZhciBhc2NpaWRvYyA9IHsgIC8vIE5hbWVzcGFjZS4NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBUYWJsZSBPZiBDb250ZW50cyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBBdXRob3I6IE1paGFpIEJhem9uLCBTZXB0ZW1iZXIgMjAwMg0KKyAqIGh0dHA6Ly9zdHVkZW50cy5pbmZvaWFzaS5yby9+bWlzaG9vDQorICoNCisgKiBUYWJsZSBPZiBDb250ZW50IGdlbmVyYXRvcg0KKyAqIFZlcnNpb246IDAuNA0KKyAqDQorICogRmVlbCBmcmVlIHRvIHVzZSB0aGlzIHNjcmlwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYw0KKyAqIExpY2Vuc2UsIGFzIGxvbmcgYXMgeW91IGRvIG5vdCByZW1vdmUgb3IgYWx0ZXIgdGhpcyBub3RpY2UuDQorICovDQorDQorIC8qIG1vZGlmaWVkIGJ5IFRyb3kgRC4gSGFuc29uLCBTZXB0ZW1iZXIgMjAwNi4gTGljZW5zZTogR1BMICovDQorIC8qIG1vZGlmaWVkIGJ5IFN0dWFydCBSYWNraGFtLCAyMDA2LCAyMDA5LiBMaWNlbnNlOiBHUEwgKi8NCisNCisvLyB0b2NsZXZlbHMgPSAxLi40Lg0KK3RvYzogZnVuY3Rpb24gKHRvY2xldmVscykgew0KKw0KKyAgZnVuY3Rpb24gZ2V0VGV4dChlbCkgew0KKyAgICB2YXIgdGV4dCA9ICIiOw0KKyAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgIGlmIChpLm5vZGVUeXBlID09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIC8vIElFIGRvZXNuJ3Qgc3BlYWsgY29uc3RhbnRzLg0KKyAgICAgICAgdGV4dCArPSBpLmRhdGE7DQorICAgICAgZWxzZSBpZiAoaS5maXJzdENoaWxkICE9IG51bGwpDQorICAgICAgICB0ZXh0ICs9IGdldFRleHQoaSk7DQorICAgIH0NCisgICAgcmV0dXJuIHRleHQ7DQorICB9DQorDQorICBmdW5jdGlvbiBUb2NFbnRyeShlbCwgdGV4dCwgdG9jbGV2ZWwpIHsNCisgICAgdGhpcy5lbGVtZW50ID0gZWw7DQorICAgIHRoaXMudGV4dCA9IHRleHQ7DQorICAgIHRoaXMudG9jbGV2ZWwgPSB0b2NsZXZlbDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIHRvY0VudHJpZXMoZWwsIHRvY2xldmVscykgew0KKyAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5Ow0KKyAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdbaEhdKFsxLScrKHRvY2xldmVscysxKSsnXSknKTsNCisgICAgLy8gRnVuY3Rpb24gdGhhdCBzY2FucyB0aGUgRE9NIHRyZWUgZm9yIGhlYWRlciBlbGVtZW50cyAodGhlIERPTTINCisgICAgLy8gbm9kZUl0ZXJhdG9yIEFQSSB3b3VsZCBiZSBhIGJldHRlciB0ZWNobmlxdWUgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgYWxsDQorICAgIC8vIGJyb3dzZXJzKS4NCisgICAgdmFyIGl0ZXJhdGUgPSBmdW5jdGlvbiAoZWwpIHsNCisgICAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykgew0KKyAgICAgICAgICB2YXIgbW8gPSByZS5leGVjKGkudGFnTmFtZSk7DQorICAgICAgICAgIGlmIChtbyAmJiAoaS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgaS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpKSAhPSAiZmxvYXQiKSB7DQorICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbmV3IFRvY0VudHJ5KGksIGdldFRleHQoaSksIG1vWzFdLTEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGl0ZXJhdGUoaSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGl0ZXJhdGUoZWwpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgdmFyIHRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b2MiKTsNCisgIGlmICghdG9jKSB7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIC8vIERlbGV0ZSBleGlzdGluZyBUT0MgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgVE9DLg0KKyAgdmFyIHRvY0VudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgdmFyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gdG9jLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCgvXnRvY2xldmVsLykpDQorICAgICAgdG9jRW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IHRvY0VudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICB0b2MucmVtb3ZlQ2hpbGQodG9jRW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgVE9DIGVudHJpZXMuDQorICB2YXIgZW50cmllcyA9IHRvY0VudHJpZXMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKSwgdG9jbGV2ZWxzKTsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KKyAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2ldOw0KKyAgICBpZiAoZW50cnkuZWxlbWVudC5pZCA9PSAiIikNCisgICAgICBlbnRyeS5lbGVtZW50LmlkID0gIl90b2NfIiArIGk7DQorICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOw0KKyAgICBhLmhyZWYgPSAiIyIgKyBlbnRyeS5lbGVtZW50LmlkOw0KKyAgICBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVudHJ5LnRleHQpKTsNCisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KKyAgICBkaXYuYXBwZW5kQ2hpbGQoYSk7DQorICAgIGRpdi5jbGFzc05hbWUgPSAidG9jbGV2ZWwiICsgZW50cnkudG9jbGV2ZWw7DQorICAgIHRvYy5hcHBlbmRDaGlsZChkaXYpOw0KKyAgfQ0KKyAgaWYgKGVudHJpZXMubGVuZ3RoID09IDApDQorICAgIHRvYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYyk7DQorfSwNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBGb290bm90ZXMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQmFzZWQgb24gZm9vdG5vdGUgZ2VuZXJhdGlvbiBjb2RlIGZyb206DQorICogaHR0cDovL3d3dy5icmFuZHNwYW5raW5nbmV3Lm5ldC9hcmNoaXZlLzIwMDUvMDcvZm9ybWF0X2Zvb3Rub3RlLmh0bWwNCisgKi8NCisNCitmb290bm90ZXM6IGZ1bmN0aW9uICgpIHsNCisgIC8vIERlbGV0ZSBleGlzdGluZyBmb290bm90ZSBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBmb290bm9kZXMuDQorICB2YXIgaTsNCisgIHZhciBub3RlaG9sZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvb3Rub3RlcyIpOw0KKyAgaWYgKCFub3RlaG9sZGVyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHZhciBlbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIGZvciAoaSA9IDA7IGkgPCBub3RlaG9sZGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gbm90ZWhvbGRlci5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2JyAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gImZvb3Rub3RlIikNCisgICAgICBlbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgZW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIG5vdGVob2xkZXIucmVtb3ZlQ2hpbGQoZW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgZm9vdG5vdGUgZW50cmllcy4NCisgIHZhciBjb250ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKTsNCisgIHZhciBzcGFucyA9IGNvbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCisgIHZhciByZWZzID0ge307DQorICB2YXIgbiA9IDA7DQorICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZSIpIHsNCisgICAgICBuKys7DQorICAgICAgdmFyIG5vdGUgPSBzcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIpOw0KKyAgICAgIGlmICghbm90ZSkgew0KKyAgICAgICAgLy8gVXNlIFtcc1xTXSBpbiBwbGFjZSBvZiAuIHNvIG11bHRpLWxpbmUgbWF0Y2hlcyB3b3JrLg0KKyAgICAgICAgLy8gQmVjYXVzZSBKYXZhU2NyaXB0IGhhcyBubyBzIChkb3RhbGwpIHJlZ2V4IGZsYWcuDQorICAgICAgICBub3RlID0gc3BhbnNbaV0uaW5uZXJIVE1MLm1hdGNoKC9ccypcWyhbXHNcU10qKV1ccyovKVsxXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaWQ9J19mb290bm90ZXJlZl8iICsgbiArICInIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgICBzcGFuc1tpXS5zZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIsIG5vdGUpOw0KKyAgICAgIH0NCisgICAgICBub3RlaG9sZGVyLmlubmVySFRNTCArPQ0KKyAgICAgICAgIjxkaXYgY2xhc3M9J2Zvb3Rub3RlJyBpZD0nX2Zvb3Rub3RlXyIgKyBuICsgIic+IiArDQorICAgICAgICAiPGEgaHJlZj0nI19mb290bm90ZXJlZl8iICsgbiArICInIHRpdGxlPSdSZXR1cm4gdG8gdGV4dCc+IiArDQorICAgICAgICBuICsgIjwvYT4uICIgKyBub3RlICsgIjwvZGl2PiI7DQorICAgICAgdmFyIGlkID1zcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7DQorICAgICAgaWYgKGlkICE9IG51bGwpIHJlZnNbIiMiK2lkXSA9IG47DQorICAgIH0NCisgIH0NCisgIGlmIChuID09IDApDQorICAgIG5vdGVob2xkZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub3RlaG9sZGVyKTsNCisgIGVsc2Ugew0KKyAgICAvLyBQcm9jZXNzIGZvb3Rub3RlcmVmcy4NCisgICAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZXJlZiIpIHsNCisgICAgICAgIHZhciBocmVmID0gc3BhbnNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsNCisgICAgICAgIGhyZWYgPSBocmVmLm1hdGNoKC8jLiovKVswXTsgIC8vIEJlY2F1c2UgSUUgcmV0dXJuIGZ1bGwgVVJMLg0KKyAgICAgICAgbiA9IHJlZnNbaHJlZl07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfSwNCisNCitpbnN0YWxsOiBmdW5jdGlvbih0b2NsZXZlbHMpIHsNCisgIHZhciB0aW1lcklkOw0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsKCkgew0KKyAgICBhc2NpaWRvYy5mb290bm90ZXMoKTsNCisgICAgaWYgKHRvY2xldmVscykgew0KKyAgICAgIGFzY2lpZG9jLnRvYyh0b2NsZXZlbHMpOw0KKyAgICB9DQorICB9DQorDQorICBmdW5jdGlvbiByZWluc3RhbGxBbmRSZW1vdmVUaW1lcigpIHsNCisgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsNCisgICAgcmVpbnN0YWxsKCk7DQorICB9DQorDQorICB0aW1lcklkID0gc2V0SW50ZXJ2YWwocmVpbnN0YWxsLCA1MDApOw0KKyAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpDQorICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCByZWluc3RhbGxBbmRSZW1vdmVUaW1lciwgZmFsc2UpOw0KKyAgZWxzZQ0KKyAgICB3aW5kb3cub25sb2FkID0gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXI7DQorfQ0KKw0KK30NCithc2NpaWRvYy5pbnN0YWxsKCk7DQorLypdXT4qLw0KKzwvc2NyaXB0Pg0KKzwvaGVhZD4NCis8Ym9keSBjbGFzcz0ibWFucGFnZSI+DQorPGRpdiBpZD0iaGVhZGVyIj4NCis8aDE+DQoraXNvbGludXgoMSkgTWFudWFsIFBhZ2UNCis8L2gxPg0KKzxoMj5OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPHA+aXNvbGludXggLQ0KKyAgIFRoZSBTeXNsaW51eCBkZXJpdmF0aXZlIElTT0xJTlVYIGZvciBJU085NjYwIENEL0RWRCBtZWRpYQ0KKzwvcD4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJjb250ZW50Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfc3lub3BzaXMiPlNZTk9QU0lTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0idmVyc2VibG9jayI+DQorPHByZSBjbGFzcz0iY29udGVudCI+PHN0cm9uZz5ta2lzb2ZzPC9zdHJvbmc+IC1vIDxlbT5pc29pbWFnZTwvZW0+IFwNCisgICAgICAgIC1iIDxlbT5pc29saW51eC9pc29saW51eC5iaW48L2VtPiAtYyA8ZW0+aXNvbGludXgvYm9vdC5jYXQ8L2VtPiBcDQorICAgICAgICAtbm8tZW11bC1ib290IC1ib290LWxvYWQtc2l6ZSA0IC1ib290LWluZm8tdGFibGUgXA0KKyAgICAgICAgPGVtPnJvb3Qtb2YtaXNvLXRyZWU8L2VtPjwvcHJlPg0KKzxkaXYgY2xhc3M9ImF0dHJpYnV0aW9uIj4NCis8L2Rpdj48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZGVzY3JpcHRpb24iPkRFU0NSSVBUSU9OPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JU09MSU5VWCBpcyBhIGJvb3QgbG9hZGVyIGZvciBMaW51eC9pMzg2IHRoYXQgb3BlcmF0ZXMgb2ZmIElTTyA5NjYwL0VsDQorVG9yaXRvIENELVJPTXMgaW4gIm5vIGVtdWxhdGlvbiIgbW9kZS4gIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIGNyZWF0ZQ0KK2FuICJlbXVsYXRpb24gZGlzayBpbWFnZSIgd2l0aCBsaW1pdGVkIHNwYWNlIChmb3IgImZsb3BweSBlbXVsYXRpb24iKQ0KK29yIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgKGZvciAiaGFyZCBkaXNrIGVtdWxhdGlvbiIuKTwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRvIGNyZWF0ZSBhbiBpbWFnZSwgY3JlYXRlIGEgZGlyZWN0b3J5IGNhbGxlZCAiaXNvbGludXgvIiAob3IsIGlmIHlvdQ0KK3ByZWZlciwgImJvb3QvaXNvbGludXgvIikgdW5kZXJuZWF0aCB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgeW91ciBJU08gaW1hZ2UNCittYXN0ZXIgZmlsZSB0cmVlLiAgQ29weSBpc29saW51eC5iaW4sIGEgY29uZmlnIGZpbGUgY2FsbGVkDQorImlzb2xpbnV4LmNmZyIgKHNlZSA8c3Ryb25nPnN5c2xpbnV4LmNmZzwvc3Ryb25nPig1KSBmb3IgZGV0YWlscyBvbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlKSwNCithbmQgYWxsIG5lY2Vzc2FyeSBmaWxlcyAoa2VybmVscywgaW5pdHJkLCBkaXNwbGF5IGZpbGVzLCBldGMuKSBpbnRvIHRoaXMNCitkaXJlY3RvcnksIHRoZW4gdXNlIHRoZSBhYm92ZSBjb21tYW5kIHRvIGNyZWF0ZSB5b3VyIElTTyBpbWFnZSAoYWRkDQorYWRkaXRpb25hbCBvcHRpb25zIGFzIGFwcHJvcHJpYXRlLCBzdWNoIGFzIC1KIG9yIC1SKS4gIElmIHlvdSBuYW1lZCB0aGUNCitkaXJlY3RvcnkgYm9vdC9pc29saW51eCB0aGF0IHNob3VsZCBvZiBjb3Vyc2UgYmU8YnIgLz4NCisgICAgICAgIC1iIGJvb3QvaXNvbGludXgvaXNvbGludXguYmluIC1jIGJvb3QvaXNvbGludXgvYm9vdC5jYXQuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9jb25maWdfZmlsZV9kaXJlY3RvcnkiPkNPTkZJRyBGSUxFIERJUkVDVE9SWTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNPTElOVVggd2lsbCBzZWFyY2ggZm9yIHRoZSBjb25maWcgZmlsZSBkaXJlY3RvcnkgaW4gdGhlIG9yZGVyDQorL2Jvb3QvaXNvbGludXgsIC9pc29saW51eCwgLy4gIFRoZSBmaXJzdCBkaXJlY3RvcnkgdGhhdCBleGlzdHMgaXMNCit1c2VkLCBldmVuIGlmIGl0IGNvbnRhaW5zIG5vIGZpbGVzLiAgVGhlcmVmb3JlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQNCit0aGVzZSBkaXJlY3RvcmllcyBkb24mIzgyMTc7dCBleGlzdCBpZiB5b3UgZG9uJiM4MjE3O3Qgd2FudCBJU09MSU5VWCB0byB1c2UgdGhlbS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2h5YnJpZF9jZF9yb21faGFyZF9kaXNrX21vZGUiPkhZQlJJRCBDRC1ST00vSEFSRCBESVNLIE1PREU8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlN0YXJ0aW5nIGluIHZlcnNpb24gMy43MiwgSVNPTElOVVggc3VwcG9ydHMgYSAiaHlicmlkIG1vZGUiIHdoaWNoIGNhbg0KK2JlIGJvb3RlZCBmcm9tIGVpdGhlciBDRC1ST00gb3IgZnJvbSBhIGRldmljZSB3aGljaCBCSU9TIGNvbnNpZGVycyBhDQoraGFyZCBkaXNrIG9yIFpJUCBkaXNrLCBlLmcuIGEgVVNCIGtleSBvciBzaW1pbGFyLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRvIGVuYWJsZSB0aGlzIG1vZGUsIHRoZSAuaXNvIGltYWdlIHNob3VsZCBiZSBwb3N0cHJvY2Vzc2VkIHdpdGggdGhlDQorImlzb2h5YnJpZCIgc2NyaXB0IGZyb20gdGhlIHV0aWxzIGRpcmVjdG9yeTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmlzb2h5YnJpZCBmaWxlbmFtZS5pc288L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIHNjcmlwdCBjcmVhdGVzIHRoZSBuZWNlc3NhcnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBiZSBhYmxlIHRvDQorYm9vdCBpbiBoeWJyaWQgbW9kZS4gIEl0IGFsc28gcGFkcyBvdXQgdGhlIGltYWdlIHRvIGFuIGV2ZW4gbXVsdGlwbGUNCitvZiAxIE1CLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgaW1hZ2UgY2FuIHRoZW4gYmUgY29waWVkIHVzaW5nIGFueSByYXcgZGlzayB3cml0aW5nIHRvb2wgKG9uIFVuaXgNCitzeXN0ZW1zLCB0eXBpY2FsbHkgImRkIiBvciAiY2F0IikgdG8gYSBVU0IgZGlzaywgb3Igd3JpdHRlbiB0byBhDQorQ0QtUk9NIHVzaW5nIHN0YW5kYXJkIENEIGJ1cm5pbmcgdG9vbHMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIElTTyA5NjYwIGZpbGVzeXN0ZW0gaXMgZW5jYXBzdWxhdGVkIGluIGEgcGFydGl0aW9uICh3aGljaCBzdGFydHMNCithdCBvZmZzZXQgemVybywgd2hpY2ggbWF5IGNvbmZ1c2Ugc29tZSBzeXN0ZW1zLikgIFRoaXMgbWFrZXMgaXQNCitwb3NzaWJsZSBmb3IgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIG9uY2UgYm9vdGVkLCB0byB1c2UgdGhlIHJlbWFpbmRlcg0KK29mIHRoZSBkZXZpY2UgZm9yIHBlcnNpc3RlbnQgc3RvcmFnZSBieSBjcmVhdGluZyBhIHNlY29uZCBwYXJ0aXRpb24uPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9taXNjZWxsYW5lb3VzIj5NSVNDRUxMQU5FT1VTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5NYWtlIHN1cmUgeW91IGhhdmUgYSByZWNlbnQgZW5vdWdoIHZlcnNpb24gb2YgbWtpc29mcy4gIEkgcmVjb21tZW5kDQorbWtpc29mcyAxLjEzIChkaXN0cmlidXRlZCB3aXRoIGNkcmVjb3JkIDEuOSksIGJ1dCAxLjEyIG1pZ2h0IHdvcmsgYXMNCit3ZWxsIChub3QgdGVzdGVkLik8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JU09MSU5VWCByZXNvbHZlcyBwYXRobmFtZXMgdGhlIGZvbGxvd2luZyB3YXk6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InVsaXN0Ij48dWw+DQorPGxpPg0KKzxwPg0KK0EgcGF0aG5hbWUgY29uc2lzdHMgb2YgbmFtZXMgc2VwYXJhdGVkIGJ5IHNsYXNoZXMsIFVuaXgtc3R5bGUuDQorPC9wPg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0EgbGVhZGluZyAvIG1lYW5zIGl0IHNlYXJjaGVzIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5OyBvdGhlcndpc2UgdGhlDQorICBzZWFyY2ggaXMgZnJvbSB0aGUgaXNvbGludXggZGlyZWN0b3J5ICh0aGluayBvZiB0aGlzIGFzIHRoZSAiY3VycmVudA0KKyAgZGlyZWN0b3J5Ii4pDQorPC9wPg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KKy4gYW5kIC4uIGluIHBhdGhuYW1lIHNlYXJjaGVzIGFyZSBub3Qgc3VwcG9ydGVkLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitUaGUgbWF4aW11bSBsZW5ndGggb2YgYW55IHBhdGhuYW1lIGlzIDI1NSBjaGFyYWN0ZXJzLg0KKzwvcD4NCis8L2xpPg0KKzwvdWw+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Ob3RlIHRoYXQgSVNPTElOVVggb25seSB1c2VzIHRoZSAicGxhaW4iIElTTyA5NjYwIGZpbGVuYW1lcywgaS5lLiBpdA0KK2RvZXMgbm90IHN1cHBvcnQgUm9jayBSaWRnZSBvciBKb2xpZXQgZmlsZW5hbWVzLiAgSXQgY2FuIHN0aWxsIGJlIHVzZWQNCitvbiBhIGRpc2sgd2hpY2ggdXNlcyBSb2NrIFJpZGdlIGFuZC9vciBKb2xpZXQgZXh0ZW5zaW9ucywgb2YgY291cnNlLg0KK1VuZGVyIExpbnV4LCB5b3UgY2FuIHZlcmlmeSB0aGUgcGxhaW4gZmlsZW5hbWVzIGJ5IG1vdW50aW5nIHdpdGggdGhlDQorIi1vIG5vcm9jayxub2pvbGlldCIgb3B0aW9uIHRvIHRoZSBtb3VudCBjb21tYW5kLiAgTm90ZSwgaG93ZXZlciwgdGhhdA0KK0lTT0xJTlVYIGRvZXMgc3VwcG9ydCAibG9uZyIgKGxldmVsIDIpIElTTyA5NjYwIHBsYWluIGZpbGVuYW1lcywgc28gaWYNCitjb21wYXRpYmlsaXR5IHdpdGggc2hvcnQtbmFtZXMtb25seSBvcGVyYXRpbmcgc3lzdGVtcyBsaWtlIE1TLURPUyBpcw0KK25vdCBhbiBpc3N1ZSwgeW91IGNhbiB1c2UgdGhlICItbCIgb3IgIi1pc28tbGV2ZWwgMiIgb3B0aW9uIHRvIG1raXNvZnMNCit0byBnZW5lcmF0ZSBsb25nICh1cCB0byAzMSBjaGFyYWN0ZXJzKSBwbGFpbiBmaWxlbmFtZXMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNPTElOVVggZG9lcyBub3Qgc3VwcG9ydCBkaXNjb250aWd1b3VzIGZpbGVzLCBpbnRlcmxlYXZlZCBtb2RlLCBvcg0KK2xvZ2ljYWwgYmxvY2sgYW5kIHNlY3RvciBzaXplcyBvdGhlciB0aGFuIDIwNDguICBUaGlzIHNob3VsZCBub3JtYWxseQ0KK25vdCBiZSBhIHByb2JsZW0uPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNPTElOVVggaXMgYnkgZGVmYXVsdCBidWlsdCBpbiB0d28gdmVyc2lvbnMsIG9uZSB2ZXJzaW9uIHdpdGggZXh0cmENCitkZWJ1Z2dpbmcgbWVzc2FnZXMgZW5hYmxlZC4gIElmIHlvdSBhcmUgaGF2aW5nIHByb2JsZW1zIHdpdGggSVNPTElOVVgsDQorSSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaWYgeW91IGNvdWxkIHRyeSBvdXQgdGhlIGRlYnVnZ2luZyB2ZXJzaW9uDQorKGlzb2xpbnV4LWRlYnVnLmJpbikgYW5kIGxldCBtZSBrbm93IHdoYXQgaXQgcmVwb3J0cy4gIFRoZSBkZWJ1Z2dpbmcNCit2ZXJzaW9uIGRvZXMgbm90IGluY2x1ZGUgaHlicmlkIG1vZGUgc3VwcG9ydCAoc2VlIGJlbG93Lik8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX3NlZV9hbHNvIj5TRUUgQUxTTzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5zeXNsaW51eC5jZmc8L3N0cm9uZz4oNSksIDxzdHJvbmc+c3lzbGludXgtY2xpPC9zdHJvbmc+KDEpLCA8c3Ryb25nPmxpbG88L3N0cm9uZz4oOCksIDxzdHJvbmc+a2V5dGFiLWxpbG8ucGw8L3N0cm9uZz4oOCksDQorPHN0cm9uZz5mZGlzazwvc3Ryb25nPig4KSwgPHN0cm9uZz5ta2ZzPC9zdHJvbmc+KDgpLCA8c3Ryb25nPnN1cGVyZm9ybWF0PC9zdHJvbmc+KDEpLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYXV0aG9yIj5BVVRIT1I8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgQXNjaWlEb2MgZGVyaXZlZCBkb2N1bWVudCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsDQorPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBkb2N1bWVudGF0aW9uIGJ5IEguIFBldGVyIEFudmluICZsdDs8YSBocmVmPSJtYWlsdG86aHBhQHp5dG9yLmNvbSI+aHBhQHp5dG9yLmNvbTwvYT4mZ3Q7LiAgVGhlIGNvbnZlcnNpb24NCit0byBhbiBBc2NpaURvYyB3YXMgbWFkZSBieSBHZW5lIEN1bW0gJmx0OzxhIGhyZWY9Im1haWx0bzpnZW5lLmN1bW1AZ21haWwuY29tIj5nZW5lLmN1bW1AZ21haWwuY29tPC9hPiZndDs8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBpZD0iZm9vdG5vdGVzIj48aHIgLz48L2Rpdj4NCis8ZGl2IGlkPSJmb290ZXIiPg0KKzxkaXYgaWQ9ImZvb3Rlci10ZXh0Ij4NCitMYXN0IHVwZGF0ZWQgMjAxNC0wMS0xNyAxNjowOTo1NiBQU1QNCis8L2Rpdj4NCis8L2Rpdj4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2Jpb3MvdHh0L2h0bWwvcHhlbGludXguaHRtbCBiL2Jpb3MvdHh0L2h0bWwvcHhlbGludXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQ5YzUxCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy90eHQvaHRtbC9weGVsaW51eC5odG1sCkBAIC0wLDAgKzEsMTMxMSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPg0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iYXBwbGljYXRpb24veGh0bWwreG1sOyBjaGFyc2V0PVVURi04IiAvPg0KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQXNjaWlEb2MgOC42LjgiIC8+DQorPHRpdGxlPnB4ZWxpbnV4KDEpPC90aXRsZT4NCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KKy8qIFNoYXJlZCBDU1MgZm9yIEFzY2lpRG9jIHhodG1sMTEgYW5kIGh0bWw1IGJhY2tlbmRzICovDQorDQorLyogRGVmYXVsdCBmb250LiAqLw0KK2JvZHkgew0KKyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsc2VyaWY7DQorfQ0KKw0KKy8qIFRpdGxlIGZvbnQuICovDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiwNCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUsDQordGhlYWQsIHAudGFibGUuaGVhZGVyLA0KKyN0b2N0aXRsZSwNCisjYXV0aG9yLCAjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyaywNCisjZm9vdGVyIHsNCisgIGZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsNCit9DQorDQorYm9keSB7DQorICBtYXJnaW46IDFlbSA1JSAxZW0gNSU7DQorfQ0KKw0KK2Egew0KKyAgY29sb3I6IGJsdWU7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCit9DQorYTp2aXNpdGVkIHsNCisgIGNvbG9yOiBmdWNoc2lhOw0KK30NCisNCitlbSB7DQorICBmb250LXN0eWxlOiBpdGFsaWM7DQorICBjb2xvcjogbmF2eTsNCit9DQorDQorc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICMwODMxOTQ7DQorfQ0KKw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBtYXJnaW4tdG9wOiAxLjJlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KKyAgbGluZS1oZWlnaHQ6IDEuMzsNCit9DQorDQoraDEsIGgyLCBoMyB7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitoMiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorfQ0KK2gzIHsNCisgIGZsb2F0OiBsZWZ0Ow0KK30NCitoMyArICogew0KKyAgY2xlYXI6IGxlZnQ7DQorfQ0KK2g1IHsNCisgIGZvbnQtc2l6ZTogMS4wZW07DQorfQ0KKw0KK2Rpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogMDsNCit9DQorDQoraHIgew0KKyAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOw0KK30NCisNCitwIHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KK3VsLCBvbCwgbGkgPiBwIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3VsID4gbGkgICAgIHsgY29sb3I6ICNhYWE7IH0NCit1bCA+IGxpID4gKiB7IGNvbG9yOiBibGFjazsgfQ0KKw0KKy5tb25vc3BhY2VkLCBjb2RlLCBwcmUgew0KKyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCisgIGNvbG9yOiBuYXZ5Ow0KKyAgcGFkZGluZzogMDsNCisgIG1hcmdpbjogMDsNCit9DQorDQorDQorI2F1dGhvciB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCit9DQorI2VtYWlsIHsNCit9DQorI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmsgew0KK30NCisNCisjZm9vdGVyIHsNCisgIGZvbnQtc2l6ZTogc21hbGw7DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLXRvcDogNC4wZW07DQorfQ0KKyNmb290ZXItdGV4dCB7DQorICBmbG9hdDogbGVmdDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorI2Zvb3Rlci1iYWRnZXMgew0KKyAgZmxvYXQ6IHJpZ2h0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisNCisjcHJlYW1ibGUgew0KKyAgbWFyZ2luLXRvcDogMS41ZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmltYWdlYmxvY2ssIGRpdi5leGFtcGxlYmxvY2ssIGRpdi52ZXJzZWJsb2NrLA0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYubGl0ZXJhbGJsb2NrLCBkaXYubGlzdGluZ2Jsb2NrLCBkaXYuc2lkZWJhcmJsb2NrLA0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAyLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDIuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBjb2xvcjogIzYwNjA2MDsNCit9DQorDQorZGl2LmNvbnRlbnQgeyAvKiBCbG9jayBlbGVtZW50IGNvbnRlbnQuICovDQorICBwYWRkaW5nOiAwOw0KK30NCisNCisvKiBCbG9jayBlbGVtZW50IHRpdGxlcy4gKi8NCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCitkaXYudGl0bGUgKyAqIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKw0KK3RkIGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCArIGRpdi50aXRsZSB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorDQorZGl2LnNpZGViYXJibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJhY2tncm91bmQ6ICNmZmZmZWU7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjBmMGYwOw0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5saXN0aW5nYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgYmFja2dyb3VuZDogI2Y4ZjhmODsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYucXVvdGVibG9jaywgZGl2LnZlcnNlYmxvY2sgew0KKyAgcGFkZGluZy1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgY29sb3I6ICM4ODg7DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCitkaXYudmVyc2VibG9jayA+IHByZS5jb250ZW50IHsNCisgIGZvbnQtZmFtaWx5OiBpbmhlcml0Ow0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KK30NCitkaXYudmVyc2VibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC43NWVtOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorLyogREVQUkVDQVRFRDogUHJlIHZlcnNpb24gOC4yLjcgdmVyc2Ugc3R5bGUgbGl0ZXJhbCBibG9jay4gKi8NCitkaXYudmVyc2VibG9jayArIGRpdi5hdHRyaWJ1dGlvbiB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisNCitkaXYuYWRtb25pdGlvbmJsb2NrIC5pY29uIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgdGQuY29udGVudCB7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KK30NCisNCitkaXYuZXhhbXBsZWJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCit9DQorDQorZGl2LmltYWdlYmxvY2sgZGl2LmNvbnRlbnQgeyBwYWRkaW5nLWxlZnQ6IDA7IH0NCitzcGFuLmltYWdlIGltZyB7IGJvcmRlci1zdHlsZTogbm9uZTsgfQ0KK2EuaW1hZ2U6dmlzaXRlZCB7IGNvbG9yOiB3aGl0ZTsgfQ0KKw0KK2RsIHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2R0IHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCitkZCA+ICo6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorfQ0KKw0KK3VsLCBvbCB7DQorICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7DQorfQ0KK29sLmFyYWJpYyB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7DQorfQ0KK29sLmxvd2VyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYTsNCit9DQorb2wudXBwZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLWFscGhhOw0KK30NCitvbC5sb3dlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItcm9tYW47DQorfQ0KK29sLnVwcGVycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1yb21hbjsNCit9DQorDQorZGl2LmNvbXBhY3QgdWwsIGRpdi5jb21wYWN0IG9sLA0KK2Rpdi5jb21wYWN0IHAsIGRpdi5jb21wYWN0IHAsDQorZGl2LmNvbXBhY3QgZGl2LCBkaXYuY29tcGFjdCBkaXYgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQordGZvb3Qgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkID4gZGl2LnZlcnNlIHsNCisgIHdoaXRlLXNwYWNlOiBwcmU7DQorfQ0KKw0KK2Rpdi5oZGxpc3Qgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZGl2LmhkbGlzdCB0ciB7DQorICBwYWRkaW5nLWJvdHRvbTogMTVweDsNCit9DQorZHQuaGRsaXN0MS5zdHJvbmcsIHRkLmhkbGlzdDEuc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZC5oZGxpc3QxIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjhlbTsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCit0ZC5oZGxpc3QyIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5oZGxpc3QuY29tcGFjdCB0ciB7DQorICBtYXJnaW46IDA7DQorICBwYWRkaW5nLWJvdHRvbTogMDsNCit9DQorDQorLmNvbW1lbnQgew0KKyAgYmFja2dyb3VuZDogeWVsbG93Ow0KK30NCisNCisuZm9vdG5vdGUsIC5mb290bm90ZXJlZiB7DQorICBmb250LXNpemU6IDAuOGVtOw0KK30NCisNCitzcGFuLmZvb3Rub3RlLCBzcGFuLmZvb3Rub3RlcmVmIHsNCisgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjsNCit9DQorDQorI2Zvb3Rub3RlcyB7DQorICBtYXJnaW46IDIwcHggMCAyMHB4IDA7DQorICBwYWRkaW5nOiA3cHggMCAwIDA7DQorfQ0KKw0KKyNmb290bm90ZXMgZGl2LmZvb3Rub3RlIHsNCisgIG1hcmdpbjogMCAwIDVweCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGhyIHsNCisgIGJvcmRlcjogbm9uZTsNCisgIGJvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7DQorICBoZWlnaHQ6IDFweDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tbGVmdDogMDsNCisgIHdpZHRoOiAyMCU7DQorICBtaW4td2lkdGg6IDEwMHB4Ow0KK30NCisNCitkaXYuY29saXN0IHRkIHsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuM2VtOw0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmNvbGlzdCB0ZCBpbWcgew0KKyAgbWFyZ2luLXRvcDogMC4zZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICAjZm9vdGVyLWJhZGdlcyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorI3RvYyB7DQorICBtYXJnaW4tYm90dG9tOiAyLjVlbTsNCit9DQorDQorI3RvY3RpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQorZGl2LnRvY2xldmVsMCwgZGl2LnRvY2xldmVsMSwgZGl2LnRvY2xldmVsMiwgZGl2LnRvY2xldmVsMywgZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tdG9wOiAwOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCit9DQorZGl2LnRvY2xldmVsMiB7DQorICBtYXJnaW4tbGVmdDogMmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsMyB7DQorICBtYXJnaW4tbGVmdDogNGVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tbGVmdDogNmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorDQorc3Bhbi5hcXVhIHsgY29sb3I6IGFxdWE7IH0NCitzcGFuLmJsYWNrIHsgY29sb3I6IGJsYWNrOyB9DQorc3Bhbi5ibHVlIHsgY29sb3I6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEgeyBjb2xvcjogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheSB7IGNvbG9yOiBncmF5OyB9DQorc3Bhbi5ncmVlbiB7IGNvbG9yOiBncmVlbjsgfQ0KK3NwYW4ubGltZSB7IGNvbG9yOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24geyBjb2xvcjogbWFyb29uOyB9DQorc3Bhbi5uYXZ5IHsgY29sb3I6IG5hdnk7IH0NCitzcGFuLm9saXZlIHsgY29sb3I6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUgeyBjb2xvcjogcHVycGxlOyB9DQorc3Bhbi5yZWQgeyBjb2xvcjogcmVkOyB9DQorc3Bhbi5zaWx2ZXIgeyBjb2xvcjogc2lsdmVyOyB9DQorc3Bhbi50ZWFsIHsgY29sb3I6IHRlYWw7IH0NCitzcGFuLndoaXRlIHsgY29sb3I6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3cgeyBjb2xvcjogeWVsbG93OyB9DQorDQorc3Bhbi5hcXVhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBhcXVhOyB9DQorc3Bhbi5ibGFjay1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmxhY2s7IH0NCitzcGFuLmJsdWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyYXk7IH0NCitzcGFuLmdyZWVuLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmVlbjsgfQ0KK3NwYW4ubGltZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbGltZTsgfQ0KK3NwYW4ubWFyb29uLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBtYXJvb247IH0NCitzcGFuLm5hdnktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG5hdnk7IH0NCitzcGFuLm9saXZlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBwdXJwbGU7IH0NCitzcGFuLnJlZC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcmVkOyB9DQorc3Bhbi5zaWx2ZXItYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogdGVhbDsgfQ0KK3NwYW4ud2hpdGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3ctYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYmlnIHsgZm9udC1zaXplOiAyZW07IH0NCitzcGFuLnNtYWxsIHsgZm9udC1zaXplOiAwLjZlbTsgfQ0KKw0KK3NwYW4udW5kZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0NCitzcGFuLm92ZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsgfQ0KK3NwYW4ubGluZS10aHJvdWdoIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IH0NCisNCitkaXYudW5icmVha2FibGUgeyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0NCisNCisNCisvKg0KKyAqIHhodG1sMTEgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorZGl2LnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZSB7DQorICBib3JkZXI6IDNweCBzb2xpZCAjNTI3YmJkOw0KK30NCit0aGVhZCwgcC50YWJsZS5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZSB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisvKiBCZWNhdXNlIHRoZSB0YWJsZSBmcmFtZSBhdHRyaWJ1dGUgaXMgb3ZlcnJpZGVuIGJ5IENTUyBpbiBtb3N0IGJyb3dzZXJzLiAqLw0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZvaWQiXSB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9ImhzaWRlcyJdIHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2c2lkZXMiXSB7DQorICBib3JkZXItdG9wLXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsNCit9DQorDQorDQorLyoNCisgKiBodG1sNSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK3RoZWFkLCBwLnRhYmxlYmxvY2suaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogM3B4Ow0KKyAgYm9yZGVyLXNwYWNpbmc6IDBweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KK30NCit0aC50YWJsZWJsb2NrLCB0ZC50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogMXB4Ow0KKyAgcGFkZGluZzogNHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCit9DQorDQordGFibGUudGFibGVibG9jay5mcmFtZS10b3Bib3Qgew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXNpZGVzIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1ub25lIHsNCisgIGJvcmRlci1zdHlsZTogaGlkZGVuOw0KK30NCisNCit0aC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0IHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciwgdGQudGFibGVibG9jay5oYWxpZ24tY2VudGVyIHsNCisgIHRleHQtYWxpZ246IGNlbnRlcjsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tcmlnaHQsIHRkLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0IHsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCit0aC50YWJsZWJsb2NrLnZhbGlnbi10b3AsIHRkLnRhYmxlYmxvY2sudmFsaWduLXRvcCB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUsIHRkLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20sIHRkLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOw0KK30NCisNCisNCisvKg0KKyAqIG1hbnBhZ2Ugc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorYm9keS5tYW5wYWdlIGgxIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitib2R5Lm1hbnBhZ2UgaDIgew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitib2R5Lm1hbnBhZ2UgZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAzZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICBib2R5Lm1hbnBhZ2UgZGl2I3RvYyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorDQorPC9zdHlsZT4NCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQorLyo8IVtDREFUQVsqLw0KK3ZhciBhc2NpaWRvYyA9IHsgIC8vIE5hbWVzcGFjZS4NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBUYWJsZSBPZiBDb250ZW50cyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBBdXRob3I6IE1paGFpIEJhem9uLCBTZXB0ZW1iZXIgMjAwMg0KKyAqIGh0dHA6Ly9zdHVkZW50cy5pbmZvaWFzaS5yby9+bWlzaG9vDQorICoNCisgKiBUYWJsZSBPZiBDb250ZW50IGdlbmVyYXRvcg0KKyAqIFZlcnNpb246IDAuNA0KKyAqDQorICogRmVlbCBmcmVlIHRvIHVzZSB0aGlzIHNjcmlwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYw0KKyAqIExpY2Vuc2UsIGFzIGxvbmcgYXMgeW91IGRvIG5vdCByZW1vdmUgb3IgYWx0ZXIgdGhpcyBub3RpY2UuDQorICovDQorDQorIC8qIG1vZGlmaWVkIGJ5IFRyb3kgRC4gSGFuc29uLCBTZXB0ZW1iZXIgMjAwNi4gTGljZW5zZTogR1BMICovDQorIC8qIG1vZGlmaWVkIGJ5IFN0dWFydCBSYWNraGFtLCAyMDA2LCAyMDA5LiBMaWNlbnNlOiBHUEwgKi8NCisNCisvLyB0b2NsZXZlbHMgPSAxLi40Lg0KK3RvYzogZnVuY3Rpb24gKHRvY2xldmVscykgew0KKw0KKyAgZnVuY3Rpb24gZ2V0VGV4dChlbCkgew0KKyAgICB2YXIgdGV4dCA9ICIiOw0KKyAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgIGlmIChpLm5vZGVUeXBlID09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIC8vIElFIGRvZXNuJ3Qgc3BlYWsgY29uc3RhbnRzLg0KKyAgICAgICAgdGV4dCArPSBpLmRhdGE7DQorICAgICAgZWxzZSBpZiAoaS5maXJzdENoaWxkICE9IG51bGwpDQorICAgICAgICB0ZXh0ICs9IGdldFRleHQoaSk7DQorICAgIH0NCisgICAgcmV0dXJuIHRleHQ7DQorICB9DQorDQorICBmdW5jdGlvbiBUb2NFbnRyeShlbCwgdGV4dCwgdG9jbGV2ZWwpIHsNCisgICAgdGhpcy5lbGVtZW50ID0gZWw7DQorICAgIHRoaXMudGV4dCA9IHRleHQ7DQorICAgIHRoaXMudG9jbGV2ZWwgPSB0b2NsZXZlbDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIHRvY0VudHJpZXMoZWwsIHRvY2xldmVscykgew0KKyAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5Ow0KKyAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdbaEhdKFsxLScrKHRvY2xldmVscysxKSsnXSknKTsNCisgICAgLy8gRnVuY3Rpb24gdGhhdCBzY2FucyB0aGUgRE9NIHRyZWUgZm9yIGhlYWRlciBlbGVtZW50cyAodGhlIERPTTINCisgICAgLy8gbm9kZUl0ZXJhdG9yIEFQSSB3b3VsZCBiZSBhIGJldHRlciB0ZWNobmlxdWUgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgYWxsDQorICAgIC8vIGJyb3dzZXJzKS4NCisgICAgdmFyIGl0ZXJhdGUgPSBmdW5jdGlvbiAoZWwpIHsNCisgICAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykgew0KKyAgICAgICAgICB2YXIgbW8gPSByZS5leGVjKGkudGFnTmFtZSk7DQorICAgICAgICAgIGlmIChtbyAmJiAoaS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgaS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpKSAhPSAiZmxvYXQiKSB7DQorICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbmV3IFRvY0VudHJ5KGksIGdldFRleHQoaSksIG1vWzFdLTEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGl0ZXJhdGUoaSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGl0ZXJhdGUoZWwpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgdmFyIHRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b2MiKTsNCisgIGlmICghdG9jKSB7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIC8vIERlbGV0ZSBleGlzdGluZyBUT0MgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgVE9DLg0KKyAgdmFyIHRvY0VudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgdmFyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gdG9jLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCgvXnRvY2xldmVsLykpDQorICAgICAgdG9jRW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IHRvY0VudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICB0b2MucmVtb3ZlQ2hpbGQodG9jRW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgVE9DIGVudHJpZXMuDQorICB2YXIgZW50cmllcyA9IHRvY0VudHJpZXMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKSwgdG9jbGV2ZWxzKTsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KKyAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2ldOw0KKyAgICBpZiAoZW50cnkuZWxlbWVudC5pZCA9PSAiIikNCisgICAgICBlbnRyeS5lbGVtZW50LmlkID0gIl90b2NfIiArIGk7DQorICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOw0KKyAgICBhLmhyZWYgPSAiIyIgKyBlbnRyeS5lbGVtZW50LmlkOw0KKyAgICBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVudHJ5LnRleHQpKTsNCisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KKyAgICBkaXYuYXBwZW5kQ2hpbGQoYSk7DQorICAgIGRpdi5jbGFzc05hbWUgPSAidG9jbGV2ZWwiICsgZW50cnkudG9jbGV2ZWw7DQorICAgIHRvYy5hcHBlbmRDaGlsZChkaXYpOw0KKyAgfQ0KKyAgaWYgKGVudHJpZXMubGVuZ3RoID09IDApDQorICAgIHRvYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYyk7DQorfSwNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBGb290bm90ZXMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQmFzZWQgb24gZm9vdG5vdGUgZ2VuZXJhdGlvbiBjb2RlIGZyb206DQorICogaHR0cDovL3d3dy5icmFuZHNwYW5raW5nbmV3Lm5ldC9hcmNoaXZlLzIwMDUvMDcvZm9ybWF0X2Zvb3Rub3RlLmh0bWwNCisgKi8NCisNCitmb290bm90ZXM6IGZ1bmN0aW9uICgpIHsNCisgIC8vIERlbGV0ZSBleGlzdGluZyBmb290bm90ZSBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBmb290bm9kZXMuDQorICB2YXIgaTsNCisgIHZhciBub3RlaG9sZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvb3Rub3RlcyIpOw0KKyAgaWYgKCFub3RlaG9sZGVyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHZhciBlbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIGZvciAoaSA9IDA7IGkgPCBub3RlaG9sZGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gbm90ZWhvbGRlci5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2JyAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gImZvb3Rub3RlIikNCisgICAgICBlbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgZW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIG5vdGVob2xkZXIucmVtb3ZlQ2hpbGQoZW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgZm9vdG5vdGUgZW50cmllcy4NCisgIHZhciBjb250ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKTsNCisgIHZhciBzcGFucyA9IGNvbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCisgIHZhciByZWZzID0ge307DQorICB2YXIgbiA9IDA7DQorICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZSIpIHsNCisgICAgICBuKys7DQorICAgICAgdmFyIG5vdGUgPSBzcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIpOw0KKyAgICAgIGlmICghbm90ZSkgew0KKyAgICAgICAgLy8gVXNlIFtcc1xTXSBpbiBwbGFjZSBvZiAuIHNvIG11bHRpLWxpbmUgbWF0Y2hlcyB3b3JrLg0KKyAgICAgICAgLy8gQmVjYXVzZSBKYXZhU2NyaXB0IGhhcyBubyBzIChkb3RhbGwpIHJlZ2V4IGZsYWcuDQorICAgICAgICBub3RlID0gc3BhbnNbaV0uaW5uZXJIVE1MLm1hdGNoKC9ccypcWyhbXHNcU10qKV1ccyovKVsxXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaWQ9J19mb290bm90ZXJlZl8iICsgbiArICInIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgICBzcGFuc1tpXS5zZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIsIG5vdGUpOw0KKyAgICAgIH0NCisgICAgICBub3RlaG9sZGVyLmlubmVySFRNTCArPQ0KKyAgICAgICAgIjxkaXYgY2xhc3M9J2Zvb3Rub3RlJyBpZD0nX2Zvb3Rub3RlXyIgKyBuICsgIic+IiArDQorICAgICAgICAiPGEgaHJlZj0nI19mb290bm90ZXJlZl8iICsgbiArICInIHRpdGxlPSdSZXR1cm4gdG8gdGV4dCc+IiArDQorICAgICAgICBuICsgIjwvYT4uICIgKyBub3RlICsgIjwvZGl2PiI7DQorICAgICAgdmFyIGlkID1zcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7DQorICAgICAgaWYgKGlkICE9IG51bGwpIHJlZnNbIiMiK2lkXSA9IG47DQorICAgIH0NCisgIH0NCisgIGlmIChuID09IDApDQorICAgIG5vdGVob2xkZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub3RlaG9sZGVyKTsNCisgIGVsc2Ugew0KKyAgICAvLyBQcm9jZXNzIGZvb3Rub3RlcmVmcy4NCisgICAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZXJlZiIpIHsNCisgICAgICAgIHZhciBocmVmID0gc3BhbnNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsNCisgICAgICAgIGhyZWYgPSBocmVmLm1hdGNoKC8jLiovKVswXTsgIC8vIEJlY2F1c2UgSUUgcmV0dXJuIGZ1bGwgVVJMLg0KKyAgICAgICAgbiA9IHJlZnNbaHJlZl07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfSwNCisNCitpbnN0YWxsOiBmdW5jdGlvbih0b2NsZXZlbHMpIHsNCisgIHZhciB0aW1lcklkOw0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsKCkgew0KKyAgICBhc2NpaWRvYy5mb290bm90ZXMoKTsNCisgICAgaWYgKHRvY2xldmVscykgew0KKyAgICAgIGFzY2lpZG9jLnRvYyh0b2NsZXZlbHMpOw0KKyAgICB9DQorICB9DQorDQorICBmdW5jdGlvbiByZWluc3RhbGxBbmRSZW1vdmVUaW1lcigpIHsNCisgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsNCisgICAgcmVpbnN0YWxsKCk7DQorICB9DQorDQorICB0aW1lcklkID0gc2V0SW50ZXJ2YWwocmVpbnN0YWxsLCA1MDApOw0KKyAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpDQorICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCByZWluc3RhbGxBbmRSZW1vdmVUaW1lciwgZmFsc2UpOw0KKyAgZWxzZQ0KKyAgICB3aW5kb3cub25sb2FkID0gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXI7DQorfQ0KKw0KK30NCithc2NpaWRvYy5pbnN0YWxsKCk7DQorLypdXT4qLw0KKzwvc2NyaXB0Pg0KKzwvaGVhZD4NCis8Ym9keSBjbGFzcz0ibWFucGFnZSI+DQorPGRpdiBpZD0iaGVhZGVyIj4NCis8aDE+DQorcHhlbGludXgoMSkgTWFudWFsIFBhZ2UNCis8L2gxPg0KKzxoMj5OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPHA+cHhlbGludXggLQ0KKyAgIFRoZSBTeXNsaW51eCBkZXJpdmF0aXZlIFBYRUxJTlVYIGZvciBQWEUgbmV0d29yayBib290aW5nDQorPC9wPg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImNvbnRlbnQiPg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9zeW5vcHNpcyI+U1lOT1BTSVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJ2ZXJzZWJsb2NrIj4NCis8cHJlIGNsYXNzPSJjb250ZW50Ij5weGVsaW51eC4wPC9wcmU+DQorPGRpdiBjbGFzcz0iYXR0cmlidXRpb24iPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9kZXNjcmlwdGlvbiI+REVTQ1JJUFRJT048L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gaXMgYSBTeXNsaW51eCBkZXJpdmF0aXZlLCBmb3IgYm9vdGluZyBMaW51eCBvZmYgYSBuZXR3b3JrDQorc2VydmVyLCB1c2luZyBhIG5ldHdvcmsgUk9NIGNvbmZvcm1pbmcgdG8gdGhlIEludGVsIFBYRSAoUHJlLUV4ZWN1dGlvbg0KK0Vudmlyb25tZW50KSBzcGVjaWZpY2F0aW9uLiAgPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiBpcyA8ZW0+Km5vdCo8L2VtPiBhIHByb2dyYW0gdGhhdCBpcw0KK2ludGVuZGVkIHRvIGJlIGZsYXNoZWQgb3IgYnVybmVkIGludG8gYSBQUk9NIG9uIHRoZSBuZXR3b3JrIGNhcmQ7IGlmDQoreW91IHdhbnQgdGhhdCwgY2hlY2sgb3V0IEV0aGVyYm9vdCAoPGEgaHJlZj0iaHR0cDovL3d3dy5ldGhlcmJvb3Qub3JnLyI+aHR0cDovL3d3dy5ldGhlcmJvb3Qub3JnLzwvYT4pLg0KK0V0aGVyYm9vdCA1LjQgb3IgbGF0ZXIgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgYSBQWEUtY29tcGxpYW50IGJvb3QNCitQUk9NIGZvciBtYW55IG5ldHdvcmsgY2FyZHMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+UFhFTElOVVggZ2VuZXJhbGx5IHJlcXVpcmVzIHRoYXQgZnVsbCBmaWxlIHBhdGhuYW1lcyBhcmUgMTI3IGNoYXJhY3RlcnMgb3Igc2hvcnRlciBpbiBsZW5ndGguPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9jdXJyZW50X2RpcmVjdG9yeSI+Q1VSUkVOVCBESVJFQ1RPUlk8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSBpbml0aWFsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgZWl0aGVyIGFzIHN1cHBsaWVkIGJ5IERIQ1ANCitvcHRpb24gMjEwIChweGVsaW51eC5wYXRocHJlZml4KSwgdGhlIGhhcmRjb2RlZCBwYXRoLXByZWZpeCBvciB0aGUNCitwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBQWEVMSU5VWCBmaWxlLCBhcyBpbmRpY2F0ZWQgYnkgREhDUCBmaWVsZHMNCis8ZW0+c25hbWU8L2VtPiBhbmQgPGVtPmZpbGU8L2VtPiAoc25hbWU9IjE5Mi4xNjguMi4zIiBhbmQgZmlsZT0iYm9vdC9weGVsaW51eC4wIg0KK3Jlc3VsdHMgaW4gInRmdHA6Ly8xOTIuMTY4LjIuMy9ib290LyIsICIxOTIuMTY4LjIuMzo6Ym9vdC8iIGluIG9sZGVyDQorUFhFTElOVVggZm9ybWF0KSB3aXRoIHByZWNlZGVuY2Ugc3BlY2lmaWVkIHVuZGVyIDxzdHJvbmc+T1BUSU9OUzwvc3Ryb25nPi48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5BbGwgdW5xdWFsaWZpZWQgZmlsZW5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9jb25maWd1cmF0aW9uIj5DT05GSUdVUkFUSU9OPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5TZWUgPHN0cm9uZz5zeXNsaW51eC5jZmc8L3N0cm9uZz4oNSkgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIGNvbnRlbnRzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkJlY2F1c2UgbW9yZSB0aGFuIG9uZSBzeXN0ZW0gbWF5IGJlIGJvb3RlZCBmcm9tIHRoZSBzYW1lIHNlcnZlciwgdGhlDQorY29uZmlndXJhdGlvbiBmaWxlIG5hbWUgZGVwZW5kcyBvbiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgYm9vdGluZw0KK21hY2hpbmUuICBBZnRlciBhdHRlbXB0aW5nIHRoZSBmaWxlIGFzIHNwZWNpZmllZCBpbiB0aGUgREhDUCBvcg0KK2hhcmRjb2RlZCBvcHRpb25zLCBQWEVMSU5VWCB3aWxsIHByb2JlIHRoZSBmb2xsb3dpbmcgcGF0aHMsIHByZWZpeGVkDQord2l0aCAicHhlbGludXguY2ZnLyIsIHVuZGVyIHRoZSBpbml0aWFsIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InVsaXN0Ij48dWw+DQorPGxpPg0KKzxwPg0KK1RoZSBjbGllbnQgVVVJRCBpZiBwcm92aWRlZCBieSB0aGUgUFhFIHN0YWNrIChub3RlLCBzb21lIEJJT1NlcyBkb24mIzgyMTc7dA0KK2hhdmUgYSB2YWxpZCBVVUlELCBhbmQgeW91IG1pZ2h0IGVuZCB1cCB3aXRoIHNvbWV0aGluZyBsaWtlIGFsbCAxJiM4MjE3O3MuKQ0KK1RoaXMgaXMgaW4gdGhlIHN0YW5kYXJkIFVVSUQgZm9ybWF0IHVzaW5nIGxvd2VyIGNhc2UgaGV4YWRlY2ltYWwgZGlnaXRzLA0KK2UuZy4gYjg5NDU5MDgtZDZhNi00MWE5LTYxMWQtNzRhNmFiODBiODNkLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitUaGUgaGFyZHdhcmUgdHlwZSAodXNpbmcgaXRzIEFSUCB0eXBlIGNvZGUpIGFuZCBhZGRyZXNzLCBhbGwgaW4gbG93ZXINCitjYXNlIGhleGFkZWNpbWFsIHdpdGggZGFzaCBzZXBhcmF0b3JzOyBmb3IgZXhhbXBsZSwgZm9yIGFuIEV0aGVybmV0IChBUlANCit0eXBlIDEpIHdpdGggYWRkcmVzcyA4ODo5OTpBQTpCQjpDQzpERCBpdCB3b3VsZCBzZWFyY2ggZm9yIHRoZSBmaWxlbmFtZQ0KKzAxLTg4LTk5LWFhLWJiLWNjLWRkLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitUaGUgY2xpZW50JiM4MjE3O3MgSVB2NCBhZGRyZXNzIGluIHVwcGVyLWNhc2UgaGV4aWRlY2ltYWwgKGllIDE5Mi4xNjguMi45MQ0KKyYjODU5NDsgQzBBODAyNUI7IHlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlZCBwcm9nYW0gImdldGhvc3RpcCIgdG8gY29tcHV0ZSB0aGUNCitoZXhhZGVjaW1hbCBJUCBhZGRyZXNzIGZvciBhbnkgaG9zdC4pIGZvbGxvd2VkIGJ5IHJlbW92aW5nIGNoYXJhY3RlcnMsDQorb25lIGF0IGEgdGltZSwgZnJvbSB0aGUgZW5kLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCisiZGVmYXVsdCINCis8L3A+DQorPC9saT4NCis8L3VsPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U3RhcnRpbmcgaW4gcmVsZWFzZSAzLjIwLCBpZiBQWEVMSU5VWCBjYW4gbm90IGZpbmQgYSBjb25maWd1cmF0aW9uIGZpbGUsDQoraXQgd2lsbCByZWJvb3QgYWZ0ZXIgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgaGFzIGV4cGlyZWQuICBUaGlzIGtlZXBzIGENCittYWNoaW5lIGZyb20gZ2V0dGluZyBzdHVjayBpbmRlZmluaXRlbHkgZHVlIHRvIGEgYm9vdCBzZXJ2ZXIgZmFpbHVyZS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX29wdGlvbnMiPk9QVElPTlM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gKHN0YXJ0aW5nIHdpdGggdmVyc2lvbiAxLjYyKSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nDQorbm9uc3RhbmRhcmQgREhDUCBvcHRpb25zLCB3aGljaCBkZXBlbmRpbmcgb24geW91ciBESENQIHNlcnZlciB5b3UgbWF5IGJlDQorYWJsZSB0byB1c2UgdG8gY3VzdG9taXplIHRoZSBzcGVjaWZpYyBiZWhhdmlvdXIgb2YgPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPi4gIFNlZSBSRkMNCis1MDcxIGZvciBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2Ugb3B0aW9ucy4gT3B0aW9ucyBmb3INCis8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IGNhbiBiZSBzcGVjaWZpZWQgYnkgREhDUCBvcHRpb25zIG9yIGhhcmRjb2RlZCBpbnRvIHRoZQ0KK2JpbmFyeS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX29wdGlvbl9wcmlvcml0eSI+T3B0aW9uIFByaW9yaXR5PC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkhhcmRjb2RlZCBhZnRlci1vcHRpb25zIGFyZSBhcHBsaWVkIGFmdGVyIERIQ1Agb3B0aW9ucyAoYW5kIG92ZXJycmlkZSkNCit3aGlsZSBoYXJkY29kZWQgYmVmb3JlLW9wdGlvbnMgYXJlIGFwcGxpZWQgcHJpb3IgdG8gREhDUCBvcHRpb25zIGFuZA0KK2RlZmF1bHQgYmVoYXZpb3IgdGFrZXMgdGhlIGxvd2VzdCBwcmlvcml0eS48L3A+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2RoY3Bfb3B0aW9ucyI+REhDUCBvcHRpb25zPC9oMz4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5PcHRpb24gMjA4PC9zdHJvbmc+IChweGVsaW51eC5tYWdpYykNCis8L2R0Pg0KKzxkZD4NCis8cD4NCitFYXJsaWVyIHZlcnNpb25zIG9mIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gcmVxdWlyZWQgdGhpcyB0byBiZSBzZXQgdG8gRjE6MDA6NzQ6N0UNCisoMjQxLjAuMTE2LjEyNikgZm9yIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gdG8gcmVjb2duaXplIGFueSBzcGVjaWFsIERIQ1Agb3B0aW9ucw0KK3doYXRzb2V2ZXIuICBBcyBvZiA8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IDMuNTUsIHRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIG5vDQorbG9uZ2VyIHJlcXVpcmVkLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5PcHRpb24gMjA5PC9zdHJvbmc+IChweGVsaW51eC5jb25maWdmaWxlKQ0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK1NwZWNpZmllcyB0aGUgaW5pdGlhbCA8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lIHdoaWNoIG1heSBiZQ0KK3F1YWxpZmllZCBvciB1bnF1YWxpZmllZC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+T3B0aW9uIDIxMDwvc3Ryb25nPiAocHhlbGludXgucGF0aHByZWZpeCkNCis8L2R0Pg0KKzxkZD4NCis8cD4NCitTcGVjaWZpZXMgdGhlIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gY29tbW9uIHBhdGggcHJlZml4LCBpbnN0ZWFkIG9mIGRlcml2aW5nIGl0IGZyb20NCit0aGUgYm9vdCBmaWxlIG5hbWUuICBUaGlzIGFsbW9zdCBjZXJ0YWlubHkgbmVlZHMgdG8gZW5kIGluIHdoYXRldmVyDQorY2hhcmFjdGVyIHRoZSBURlRQIHNlcnZlciBPUyB1c2VzIGFzIGEgcGF0aG5hbWUgc2VwYXJhdG9yLCBlLmcuIHNsYXNoDQorKC8pIGZvciBVbml4Lg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5PcHRpb24gMjExPC9zdHJvbmc+IChweGVsaW51eC5yZWJvb3R0aW1lKQ0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK1NwZWNpZmllcywgaW4gc2Vjb25kcywgdGhlIHRpbWUgdG8gd2FpdCBiZWZvcmUgcmVib290IGluIHRoZSBldmVudCBvZg0KK1RGVFAgZmFpbHVyZS4gIDAgbWVhbnMgd2FpdCAiZm9yZXZlciIgKGluIHJlYWxpdHksIGl0IHdhaXRzDQorYXBwcm94aW1hdGVseSAxMzYgeWVhcnMuKQ0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2hhcmRjb2RlZF9vcHRpb25zIj5IYXJkY29kZWQgb3B0aW9uczwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5TaW5jZSB2ZXJzaW9uIDMuODMsIHRoZSBwcm9ncmFtICJweGVsaW51eC1vcHRpb25zIiBjYW4gYmUgdXNlZCB0bw0KK2hhcmQtY29kZSBESENQIG9wdGlvbnMgaW50byB0aGUgcHhlbGludXguMCBpbWFnZSBmaWxlOyB0aGlzIGlzDQorc29tZXRpbWVzIHVzZWZ1bCB3aGVuIHRoZSBESENQIHNlcnZlciBpcyB1bmRlciBkaWZmZXJlbnQNCithZG1pbmlzdHJhdGl2ZSBjb250cm9sLiAgSGFyZGNvZGVkIG9wdGlvbnM8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiAgNiA9Jmd0OyAnZG9tYWluLW5hbWUtc2VydmVycycsDQorIDE1ID0mZ3Q7ICdkb21haW4tbmFtZScsDQorIDU0ID0mZ3Q7ICduZXh0LXNlcnZlcicsDQorMjA5ID0mZ3Q7ICdjb25maWctZmlsZScsDQorMjEwID0mZ3Q7ICdwYXRoLXByZWZpeCcsDQorMjExID0mZ3Q7ICdyZWJvb3R0aW1lJzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfaHR0cF9mdHAiPkhUVFAvRlRQPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5TaW5jZSB2ZXJzaW9uIDUuMTAsIGEgc3BlY2lhbCBQWEVMSU5VWCBiaW5hcnksIGxweGVsaW51eC4wLCBuYXRpdmVseQ0KK3N1cHBvcnRzIEhUVFAgYW5kIEZUUCB0cmFuc2ZlcnMsIGdyZWF0bHkgaW5jcmVhc2luZyBsb2FkIHNwZWVkIGFuZA0KK2FsbG93aW5nIGZvciBzdGFuZGFyZCBIVFRQIHNjcmlwdHMgdG8gcHJlc2VudCBQWEVMSU5VWCYjODIxNztzIGNvbmZpZ3VyYXRpb24NCitmaWxlLiAgVG8gdXNlIGh0dHAgb3IgZnRwLCB1c2Ugc3RhbmRhcmQgVVJMIHN5bnRheCBhcyBmaWxlbmFtZTsgdXNlIHRoZQ0KK0RIQ1Agb3B0aW9ucyBiZWxvdyB0byB0cmFuc21pdCBhIHN1aXRhYmxlIFVSTCBwcmVmaXggdG8gdGhlIGNsaWVudCwgb3INCit1c2UgdGhlICJweGVsaW51eC1vcHRpb25zIiB0b29sIHByb3ZpZGVkIGluIHRoZSB1dGlscyBkaXJlY3RvcnkgdG8NCitwcm9ncmFtIGl0IGRpcmVjdGx5IGludG8gdGhlIGxweGVsaW51eC4wIGZpbGUuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9maWxlbmFtZV9zeW50YXgiPkZJTEVOQU1FIFNZTlRBWDwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+UFhFTElOVVggc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHBhdGhuYW1lIGNvbnZlbnRpb25zOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz46OmZpbGVuYW1lPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorU3VwcHJlc3NlcyB0aGUgY29tbW9uIGZpbGVuYW1lIHByZWZpeCwgaS5lLiBwYXNzZXMgdGhlIHN0cmluZyAiZmlsZW5hbWUiDQordW5tb2RpZmllZCB0byB0aGUgc2VydmVyLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5JUCBhZGRyZXNzOjpmaWxlbmFtZTwvc3Ryb25nPiAoZS5nLiAxOTIuMTY4LjIuMzo6ZmlsZW5hbWUpDQorPC9kdD4NCis8ZGQ+DQorPHA+DQorU3VwcHJlc3NlcyB0aGUgY29tbW9uIGZpbGVuYW1lIHByZWZpeCwgPHN0cm9uZz5hbmQ8L3N0cm9uZz4gc2VuZHMgYSByZXF1ZXN0IHRvIGFuIGFsdGVybmF0ZSBURlRQIHNlcnZlci4gIEluc3RlYWQgb2YgYW4gSVAgYWRkcmVzcywgYSBETlMgbmFtZSBjYW4gYmUgdXNlZC4gIEl0IHdpbGwgYmUgYXNzdW1lZCB0byBiZSBmdWxseSBxdWFsaWZpZWQgaWYgaXQgY29udGFpbnMgZG90czsgb3RoZXJ3aXNlIHRoZSBsb2NhbCBkb21haW4gYXMgcmVwb3J0ZWQgYnkgdGhlIERIQ1Agc2VydmVyIChvcHRpb24gMTUpIHdpbGwgYmUgYWRkZWQuDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjo6IHdhcyBjaG9zZW4gYmVjYXVzZSBpdCBpcyB1bmxpa2VseSB0byBjb25mbGljdCB3aXRoIG9wZXJhdGluZyBzeXN0ZW0NCit1c2FnZS4gIEhvd2V2ZXIsIGlmIHlvdSBoYXBwZW4gdG8gaGF2ZSBhbiBlbnZpcm9ubWVudCBmb3Igd2hpY2ggdGhlDQorc3BlY2lhbCB0cmVhdG1lbnQgb2YgOjogaXMgYSBwcm9ibGVtLCBwbGVhc2UgY29udGFjdCB0aGUgU3lzbGludXgNCittYWlsaW5nIGxpc3QuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U2luY2UgdmVyc2lvbiA0LjAwLCBQWEVMSU5VWCBhbHNvIHN1cHBvcnRzIHN0YW5kYXJkIFVSTCBzeW50YXguPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9rZWVwcHhlIj5LRUVQUFhFPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Ob3JtYWxseSwgUFhFTElOVVggd2lsbCB1bmxvYWQgdGhlIFBYRSBhbmQgVU5ESSBzdGFja3MgYmVmb3JlIGludm9raW5nDQordGhlIGtlcm5lbC4gIEluIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyAoZm9yIGV4YW1wbGUsIHdoZW4gdXNpbmcgTUVNRElTSw0KK3RvIGJvb3QgYW4gb3BlcmF0aW5nIHN5c3RlbSB3aXRoIGFuIFVOREkgbmV0d29yayBkcml2ZXIpIGl0IG1pZ2h0IGJlDQorZGVzaXJhYmxlIHRvIGtlZXAgdGhlIFBYRSBzdGFjayBpbiBtZW1vcnkuICBJZiB0aGUgb3B0aW9uICJrZWVwcHhlIg0KK2lzIGdpdmVuIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLCBQWEVMSU5VWCB3aWxsIGtlZXAgdGhlIFBYRSBhbmQNCitVTkRJIHN0YWNrcyBpbiBtZW1vcnkuICAoSWYgeW91IGRvbiYjODIxNzt0IGtub3cgd2hhdCB0aGlzIG1lYW5zLCB5b3UNCitwcm9iYWJseSBkb24mIzgyMTc7dCBuZWVkIGl0Lik8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2V4YW1wbGVzIj5FWEFNUExFUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9jb25maWd1cmF0aW9uX2ZpbGVuYW1lIj5Db25maWd1cmF0aW9uIGZpbGVuYW1lPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciBESENQIHNpYWRkciAxOTIuMTY4LjIuMywgZmlsZSA8ZW0+bXlib290ZGlyL3B4ZWxpbnV4LjA8L2VtPiwgY2xpZW50IFVVSUQNCitiODk0NTkwOC1kNmE2LTQxYTktNjExZC03NGE2YWI4MGI4M2QsIEV0aGVybmV0IE1BQyBhZGRyZXNzDQorODg6OTk6QUE6QkI6Q0M6REQgYW5kIElQdjQgYWRkcmVzcyAxOTIuMTY4LjIuOTEsIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4NCit0aGlzIG9yZGVyIHdpbGwgYmUgYXR0ZW1wdGVkIChhZnRlciBjb25maWctZmlsZSBvcHRpb25zKTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPm15Ym9vdGRpci9weGVsaW51eC5jZmcvYjg5NDU5MDgtZDZhNi00MWE5LTYxMWQtNzRhNmFiODBiODNkDQorbXlib290ZGlyL3B4ZWxpbnV4LmNmZy8wMS04OC05OS1hYS1iYi1jYy1kZA0KK215Ym9vdGRpci9weGVsaW51eC5jZmcvQzBBODAyNUINCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgwMjUNCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgwMg0KK215Ym9vdGRpci9weGVsaW51eC5jZmcvQzBBODANCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgNCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQQ0KK215Ym9vdGRpci9weGVsaW51eC5jZmcvQzANCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MNCitteWJvb3RkaXIvcHhlbGludXguY2ZnL2RlZmF1bHQ8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX3RmdHBfc2VydmVycyI+VEZUUCBzZXJ2ZXJzPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciBiZXN0IHJlc3VsdHMsIHVzZSBhIFRGVFAgc2VydmVyIHdoaWNoIHN1cHBvcnRzIHRoZSAidHNpemUiIFRGVFANCitvcHRpb24gKFJGQyAxNzg0L1JGQyAyMzQ5KS4gIFRoZSAidGZ0cC1ocGEiIFRGVFAgc2VydmVyLCB3aGljaCBzdXBwb3J0DQorb3B0aW9ucywgaXMgYXZhaWxhYmxlIGF0OjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9uZXR3b3JrL3RmdHAvDQorZnRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL25ldHdvcmsvdGZ0cC88L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5hbmQgb24gYW55IGtlcm5lbC5vcmcgbWlycm9yIChzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5rZXJuZWwub3JnL21pcnJvcnMvIj5odHRwOi8vd3d3Lmtlcm5lbC5vcmcvbWlycm9ycy88L2E+KS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Bbm90aGVyIFRGVFAgc2VydmVyIHdoaWNoIHN1cHBvcnRzIHRoaXMgaXMgYXRmdHAgYnkgSmVhbi1QaWVycmUNCitMZWZlYnZyZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmZ0cDovL2Z0cC5tYW1hbGludXguY29tL3B1Yi9hdGZ0cC88L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JZiB5b3VyIGJvb3Qgc2VydmVyIGlzIHJ1bm5pbmcgV2luZG93cyAoYW5kIHlvdSBjYW4mIzgyMTc7dCBmaXggdGhhdCksIHRyeQ0KK3RmdHBkMzIgYnkgUGhpbGlwcGUgSm91bmluICh5b3UgbmVlZCB2ZXJzaW9uIDIuMTEgb3IgbGF0ZXI7IHByZXZpb3VzDQordmVyc2lvbnMgaGFkIGEgYnVnIHdoaWNoIG1hZGUgaXQgaW5jb21wYXRpYmxlIHdpdGggUFhFTElOVVgpOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+aHR0cDovL3RmdHBkMzIuam91bmluLm5ldC88L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2RoY3BfY29uZmlnX3NpbXBsZSI+REhDUCBjb25maWc6IFNpbXBsZTwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgUFhFIHByb3RvY29sIHVzZXMgYSB2ZXJ5IGNvbXBsZXggc2V0IG9mIGV4dGVuc2lvbnMgdG8gREhDUCBvcg0KK0JPT1RQLiAgSG93ZXZlciwgbW9zdCBQWEUgaW1wbGVtZW50YXRpb25zJiM4MjAxOyYjODIxMjsmIzgyMDE7dGhpcyBpbmNsdWRlcyBhbGwgSW50ZWwNCitvbmVzIHZlcnNpb24gMC45OW4gYW5kIGxhdGVyJiM4MjAxOyYjODIxMjsmIzgyMDE7c2VlbSB0byBiZSBhYmxlIHRvIGJvb3QgaW4gYQ0KKyJjb252ZW50aW9uYWwiIERIQ1AvVEZUUCBjb25maWd1cmF0aW9uLiAgQXNzdW1pbmcgeW91IGRvbiYjODIxNzt0IGhhdmUgdG8NCitzdXBwb3J0IGFueSB2ZXJ5IG9sZCBvciBvdGhlcndpc2Ugc2V2ZXJlbHkgYnJva2VuIGNsaWVudHMsIHRoaXMgaXMNCitwcm9iYWJseSB0aGUgYmVzdCBjb25maWd1cmF0aW9uIHVubGVzcyB5b3UgYWxyZWFkeSBoYXZlIGEgUFhFIGJvb3QNCitzZXJ2ZXIgb24geW91ciBuZXR3b3JrLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkEgc2FtcGxlIERIQ1Agc2V0dXAsIHVzaW5nIHRoZSAiY29udmVudGlvbmFsIFRGVFAiIGNvbmZpZ3VyYXRpb24sDQord291bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nLCB1c2luZyBJU0MgZGhjcCAyLjAgZGhjcGQuY29uZg0KK3N5bnRheDo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmFsbG93IGJvb3Rpbmc7DQorYWxsb3cgYm9vdHA7DQorDQorIyBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4NCisNCitvcHRpb24gZG9tYWluLW5hbWUgIiZsdDtkb21haW4gbmFtZSZndDsiOw0KK29wdGlvbiBzdWJuZXQtbWFzayAmbHQ7c3VibmV0IG1hc2smZ3Q7Ow0KK29wdGlvbiBicm9hZGNhc3QtYWRkcmVzcyAmbHQ7YnJvYWRjYXN0IGFkZHJlc3MmZ3Q7Ow0KK29wdGlvbiBkb21haW4tbmFtZS1zZXJ2ZXJzICZsdDtkbnMgc2VydmVycyZndDs7DQorb3B0aW9uIHJvdXRlcnMgJmx0O2RlZmF1bHQgcm91dGVyJmd0OzsNCisNCisjIEdyb3VwIHRoZSBQWEUgYm9vdGFibGUgaG9zdHMgdG9nZXRoZXINCitncm91cCB7DQorICAgICAgICAjIFBYRS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4NCisgICAgICAgIG5leHQtc2VydmVyICZsdDtURlRQIHNlcnZlciBhZGRyZXNzJmd0OzsNCisgICAgICAgIGZpbGVuYW1lICIvdGZ0cGJvb3QvcHhlbGludXguMCI7DQorDQorICAgICAgICAjIFlvdSBuZWVkIGFuIGVudHJ5IGxpa2UgdGhpcyBmb3IgZXZlcnkgaG9zdA0KKyAgICAgICAgIyB1bmxlc3MgeW91J3JlIHVzaW5nIGR5bmFtaWMgYWRkcmVzc2VzDQorICAgICAgICBob3N0ICZsdDtob3N0bmFtZSZndDsgew0KKyAgICAgICAgICAgICAgICBoYXJkd2FyZSBldGhlcm5ldCAmbHQ7ZXRoZXJuZXQgYWRkcmVzcyZndDs7DQorICAgICAgICAgICAgICAgIGZpeGVkLWFkZHJlc3MgJmx0O2hvc3RuYW1lJmd0OzsNCisgICAgICAgIH0NCit9PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Tm90ZSB0aGF0IGlmIHlvdXIgcGFydGljdWxhciBURlRQIGRhZW1vbiBydW5zIHVuZGVyIGNocm9vdCAodGZ0cC1ocGENCit3aWxsIGRvIHRoaXMgaWYgeW91IHNwZWNpZnkgdGhlIC1zIChzZWN1cmUpIG9wdGlvbjsgdGhpcyBpcyBoaWdobHkNCityZWNvbW1lbmRlZCksIHlvdSBhbG1vc3QgY2VydGFpbmx5IHNob3VsZCBub3QgaW5jbHVkZSB0aGUgL3RmdHBib290DQorcHJlZml4IGluIHRoZSBmaWxlbmFtZSBzdGF0ZW1lbnQuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9kaGNwX2NvbmZpZ19weGVfMSI+REhDUCBDb25maWc6IFBYRS0xPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklmIHRoZSBzaW1wbGUgY29uZmlnIGRvZXMgbm90IHdvcmsgZm9yIHlvdXIgZW52aXJvbm1lbnQsIHlvdSBwcm9iYWJseQ0KK3Nob3VsZCBzZXQgdXAgYSAiUFhFIGJvb3Qgc2VydmVyIiBvbiBwb3J0IDQwMTEgb2YgeW91ciBURlRQIHNlcnZlcjsgYQ0KK2ZyZWUgUFhFIGJvb3Qgc2VydmVyIGlzIGF2YWlsYWJsZSBhdDo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48YSBocmVmPSJodHRwOi8vd3d3Lmthbm8ub3JnLnVrL3Byb2plY3RzL3B4ZS8iPmh0dHA6Ly93d3cua2Fuby5vcmcudWsvcHJvamVjdHMvcHhlLzwvYT48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5XaXRoIHN1Y2ggYSBib290IHNlcnZlciBkZWZpbmVkLCB5b3VyIERIQ1AgY29uZmlndXJhdGlvbiBzaG91bGQgbG9vaw0KK3RoZSBzYW1lIGV4Y2VwdCBmb3IgYW4gIm9wdGlvbiBkaGNwLWNsYXNzLWlkZW50aWZpZXIiICgib3B0aW9uDQordmVuZG9yLWNsYXNzLWlkZW50aWZpZXIiIGlmIHlvdSBhcmUgdXNpbmcgREhDUCAzLjApOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+YWxsb3cgYm9vdGluZzsNCithbGxvdyBib290cDsNCisNCisjIFN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLg0KKw0KK29wdGlvbiBkb21haW4tbmFtZSAiJmx0O2RvbWFpbiBuYW1lJmd0OyI7DQorb3B0aW9uIHN1Ym5ldC1tYXNrICZsdDtzdWJuZXQgbWFzayZndDs7DQorb3B0aW9uIGJyb2FkY2FzdC1hZGRyZXNzICZsdDticm9hZGNhc3QgYWRkcmVzcyZndDs7DQorb3B0aW9uIGRvbWFpbi1uYW1lLXNlcnZlcnMgJmx0O2RucyBzZXJ2ZXJzJmd0OzsNCitvcHRpb24gcm91dGVycyAmbHQ7ZGVmYXVsdCByb3V0ZXImZ3Q7Ow0KKw0KKyMgR3JvdXAgdGhlIFBYRSBib290YWJsZSBob3N0cyB0b2dldGhlcg0KK2dyb3VwIHsNCisgICAgICAgICMgUFhFLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLg0KKyAgICAgICAgb3B0aW9uIGRoY3AtY2xhc3MtaWRlbnRpZmllciAiUFhFQ2xpZW50IjsNCisgICAgICAgIG5leHQtc2VydmVyICZsdDtweGUgYm9vdCBzZXJ2ZXIgYWRkcmVzcyZndDs7DQorDQorICAgICAgICAjIFlvdSBuZWVkIGFuIGVudHJ5IGxpa2UgdGhpcyBmb3IgZXZlcnkgaG9zdA0KKyAgICAgICAgIyB1bmxlc3MgeW91J3JlIHVzaW5nIGR5bmFtaWMgYWRkcmVzc2VzDQorICAgICAgICBob3N0ICZsdDtob3N0bmFtZSZndDsgew0KKyAgICAgICAgICAgICAgICBoYXJkd2FyZSBldGhlcm5ldCAmbHQ7ZXRoZXJuZXQgYWRkcmVzcyZndDs7DQorICAgICAgICAgICAgICAgIGZpeGVkLWFkZHJlc3MgJmx0O2hvc3RuYW1lJmd0OzsNCisgICAgICAgIH0NCit9PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SGVyZSwgdGhlIGJvb3QgZmlsZSBuYW1lIGlzIG9idGFpbmVkIGZyb20gdGhlIFBYRSBzZXJ2ZXIuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9kaGNwX2NvbmZpZ19lbmNhcHN1bGF0ZWQiPkRIQ1AgQ29uZmlnOiBFbmNhcHN1bGF0ZWQ8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgdGhlICJjb252ZW50aW9uYWwgVEZUUCIgY29uZmlndXJhdGlvbiBkb2VzbiYjODIxNzt0IHdvcmsgb24geW91ciBjbGllbnRzLA0KK2FuZCBzZXR0aW5nIHVwIGEgUFhFIGJvb3Qgc2VydmVyIGlzIG5vdCBhbiBvcHRpb24sIHlvdSBjYW4gYXR0ZW1wdCB0aGUNCitmb2xsb3dpbmcgY29uZmlndXJhdGlvbi4gIEl0IGhhcyBiZWVuIGtub3duIHRvIGJvb3Qgc29tZQ0KK2NvbmZpZ3VyYXRpb25zIGNvcnJlY3RseTsgaG93ZXZlciwgdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXM6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5hbGxvdyBib290aW5nOw0KK2FsbG93IGJvb3RwOw0KKw0KKyMgU3RhbmRhcmQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uDQorDQorb3B0aW9uIGRvbWFpbi1uYW1lICImbHQ7ZG9tYWluIG5hbWUmZ3Q7IjsNCitvcHRpb24gc3VibmV0LW1hc2sgJmx0O3N1Ym5ldCBtYXNrJmd0OzsNCitvcHRpb24gYnJvYWRjYXN0LWFkZHJlc3MgJmx0O2Jyb2FkY2FzdCBhZGRyZXNzJmd0OzsNCitvcHRpb24gZG9tYWluLW5hbWUtc2VydmVycyAmbHQ7ZG5zIHNlcnZlcnMmZ3Q7Ow0KK29wdGlvbiByb3V0ZXJzICZsdDtkZWZhdWx0IHJvdXRlciZndDs7DQorDQorIyBHcm91cCB0aGUgUFhFIGJvb3RhYmxlIGhvc3RzIHRvZ2V0aGVyDQorZ3JvdXAgew0KKyAgICAgICAgIyBQWEUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uDQorICAgICAgICBvcHRpb24gZGhjcC1jbGFzcy1pZGVudGlmaWVyICJQWEVDbGllbnQiOw0KKyAgICAgICAgb3B0aW9uIHZlbmRvci1lbmNhcHN1bGF0ZWQtb3B0aW9ucyAwOTowZjo4MDowMDowYzo0ZTo2NTo3NDo3Nzo2Zjo3Mjo2YjoyMDo2Mjo2Zjo2Zjo3NDowYTowNzowMDo1MDo3Mjo2Zjo2ZDo3MDo3NDowNjowMTowMjowODowMzo4MDowMDowMDo0NzowNDo4MDowMDowMDowMDpmZjsNCisgICAgICAgIG5leHQtc2VydmVyICZsdDtURlRQIHNlcnZlciZndDs7DQorICAgICAgICBmaWxlbmFtZSAiL3RmdHBib290L3B4ZWxpbnV4LjAiOw0KKw0KKyAgICAgICAgIyBZb3UgbmVlZCBhbiBlbnRyeSBsaWtlIHRoaXMgZm9yIGV2ZXJ5IGhvc3QNCisgICAgICAgICMgdW5sZXNzIHlvdSdyZSB1c2luZyBkeW5hbWljIGFkZHJlc3Nlcw0KKyAgICAgICAgaG9zdCAmbHQ7aG9zdG5hbWUmZ3Q7IHsNCisgICAgICAgICAgICAgICAgaGFyZHdhcmUgZXRoZXJuZXQgJmx0O2V0aGVybmV0IGFkZHJlc3MmZ3Q7Ow0KKyAgICAgICAgICAgICAgICBmaXhlZC1hZGRyZXNzICZsdDtob3N0bmFtZSZndDs7DQorICAgICAgICB9DQorfTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGUgdGhhdCB0aGlzIDxzdHJvbmc+d2lsbCBub3Q8L3N0cm9uZz4gYm9vdCBzb21lIGNsaWVudHMgdGhhdCA8c3Ryb25nPndpbGw8L3N0cm9uZz4gYm9vdCB3aXRoIHRoZQ0KKyJjb252ZW50aW9uYWwgVEZUUCIgY29uZmlndXJhdGlvbjsgSW50ZWwgQm9vdCBDbGllbnQgMy4wIGFuZCBsYXRlciBhcmUNCitrbm93biB0byBmYWxsIGludG8gdGhpcyBjYXRlZ29yeS48L3A+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2RoY3BfY29uZmlnX2lzY19kaGNwZF9vcHRpb25zIj5ESENQIENvbmZpZzogSVNDIGRoY3BkIG9wdGlvbnM8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNDIGRoY3AgMy4wIHN1cHBvcnRzIGEgcmF0aGVyIG5pY2Ugc3ludGF4IGZvciBzcGVjaWZ5aW5nIGN1c3RvbQ0KK29wdGlvbnM7IHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgc3ludGF4IGluIGRoY3BkLmNvbmYgaWYgeW91IGFyZQ0KK3J1bm5pbmcgdGhpcyB2ZXJzaW9uIG9mIGRoY3BkOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+b3B0aW9uIHNwYWNlIHB4ZWxpbnV4Ow0KK29wdGlvbiBweGVsaW51eC5tYWdpYyAgICAgIGNvZGUgMjA4ID0gc3RyaW5nOw0KK29wdGlvbiBweGVsaW51eC5jb25maWdmaWxlIGNvZGUgMjA5ID0gdGV4dDsNCitvcHRpb24gcHhlbGludXgucGF0aHByZWZpeCBjb2RlIDIxMCA9IHRleHQ7DQorb3B0aW9uIHB4ZWxpbnV4LnJlYm9vdHRpbWUgY29kZSAyMTEgPSB1bnNpZ25lZCBpbnRlZ2VyIDMyOzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+Tk9URTogSW4gZWFybGllciB2ZXJzaW9ucyBvZiBQWEVMSU5VWCwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgYXMgYQ0KKyJzaXRlLW9wdGlvbi1zcGFjZSIuICBTaW5jZSBQWEVMSU5VWCAyLjA3LCB0aGlzIHdpbGwgd29yayBib3RoIGFzIGENCisic2l0ZS1vcHRpb24tc3BhY2UiICh1bmVuY2Fwc3VsYXRlZCkgYW5kIGFzIGEgInZlbmRvci1vcHRpb24tc3BhY2UiDQorKHR5cGUgNDMgZW5jYXBzdWxhdGVkLikgIFRoaXMgbWF5IGF2b2lkIG1lc3Npbmcgd2l0aCB0aGUNCitkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QsIGFzIGRldGFpbGVkIGJlbG93LjwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZW4sIGluc2lkZSB5b3VyIFBYRUxJTlVYLWJvb3RpbmcgZ3JvdXAgb3IgY2xhc3MgKHdoZXJlZXZlciB5b3UgaGF2ZQ0KK3RoZSBQWEVMSU5VWC1yZWxhdGVkIG9wdGlvbnMsIHN1Y2ggYXMgdGhlIGZpbGVuYW1lIG9wdGlvbiksIHlvdSBjYW4NCithZGQsIGZvciBleGFtcGxlOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+IyBBbHdheXMgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGxpbmVzIGZvciBhbGwgUFhFTElOVVggY2xpZW50cw0KK3NpdGUtb3B0aW9uLXNwYWNlICJweGVsaW51eCI7DQorb3B0aW9uIHB4ZWxpbnV4Lm1hZ2ljIGYxOjAwOjc0OjdlOw0KK2lmIGV4aXN0cyBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3Qgew0KKyAgICAgICAgIyBBbHdheXMgc2VuZCB0aGUgUFhFTElOVVggb3B0aW9ucyAoc3BlY2lmaWVkIGluIGhleGFkZWNpbWFsKQ0KKyAgICAgICAgb3B0aW9uIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCA9IGNvbmNhdChvcHRpb24gZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0LGQwLGQxLGQyLGQzKTsNCit9DQorIyBUaGVzZSBsaW5lcyBzaG91bGQgYmUgY3VzdG9taXplZCB0byB5b3VyIHNldHVwDQorb3B0aW9uIHB4ZWxpbnV4LmNvbmZpZ2ZpbGUgImNvbmZpZ3MvY29tbW9uIjsNCitvcHRpb24gcHhlbGludXgucGF0aHByZWZpeCAiL3RmdHBib290L3B4ZWxpbnV4L2ZpbGVzLyI7DQorb3B0aW9uIHB4ZWxpbnV4LnJlYm9vdHRpbWUgMzA7DQorZmlsZW5hbWUgIi90ZnRwYm9vdC9weGVsaW51eC9weGVsaW51eC5iaW4iOzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGUgdGhhdCB0aGUgY29uZmlnZmlsZSBpcyByZWxhdGl2ZSB0byB0aGUgcGF0aHByZWZpeDogdGhpcyB3aWxsIGxvb2sNCitmb3IgYSBjb25maWcgZmlsZSBjYWxsZWQgL3RmdHBib290L3B4ZWxpbnV4L2ZpbGVzL2NvbmZpZ3MvY29tbW9uIG9uDQordGhlIFRGVFAgc2VydmVyLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSAib3B0aW9uIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCIgc3RhdGVtZW50IGZvcmNlcyB0aGUgREhDUA0KK3NlcnZlciB0byBzZW5kIHRoZSBQWEVMSU5VWC1zcGVjaWZpYyBvcHRpb25zLCBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QNCitleHBsaWNpdGx5IHJlcXVlc3RlZC4gIFNpbmNlIHRoZSBESENQIHJlcXVlc3QgaXMgZG9uZSBiZWZvcmUgUFhFTElOVVgNCitpcyBsb2FkZWQsIHRoZSBQWEUgY2xpZW50IHdvbiYjODIxNzt0IGtub3cgdG8gcmVxdWVzdCB0aGVtLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlVzaW5nIElTQyBkaGNwIDMuMCB5b3UgY2FuIGNyZWF0ZSBhIGxvdCBvZiB0aGVzZSBzdHJpbmdzIG9uIHRoZSBmbHkuDQorRm9yIGV4YW1wbGUsIHRvIHVzZSB0aGUgaGV4YWRlY2ltYWwgZm9ybSBvZiB0aGUgaGFyZHdhcmUgYWRkcmVzcyBhcw0KK3RoZSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSwgeW91IGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+c2l0ZS1vcHRpb24tc3BhY2UgInB4ZWxpbnV4IjsNCitvcHRpb24gcHhlbGludXgubWFnaWMgZjE6MDA6NzQ6N2U7DQoraWYgZXhpc3RzIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCB7DQorICAgICAgICAjIEFsd2F5cyBzZW5kIHRoZSBQWEVMSU5VWCBvcHRpb25zIChzcGVjaWZpZWQgaW4gaGV4YWRlY2ltYWwpDQorICAgICAgICBvcHRpb24gZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0ID0gY29uY2F0KG9wdGlvbiBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QsZDAsZDEsZDIsZDMpOw0KK30NCitvcHRpb24gcHhlbGludXguY29uZmlnZmlsZSA9DQorICAgICAgICBjb25jYXQoInB4ZWxpbnV4LmNmZy8iLCBiaW5hcnktdG8tYXNjaWkoMTYsIDgsICI6IiwgaGFyZHdhcmUpKTsNCitmaWxlbmFtZSAiL3RmdHBib290L3B4ZWxpbnV4LmJpbiI7PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgeW91IHVzZWQgdGhpcyBmcm9tIGEgY2xpZW50IHdob3NlIEV0aGVybmV0IGFkZHJlc3Mgd2FzDQorNTg6RkE6ODQ6Q0Y6NTU6MEUsIHRoaXMgd291bGQgbG9vayBmb3IgYSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZWQNCisiL3RmdHBib290L3B4ZWxpbnV4LmNmZy8xOjU4OmZhOjg0OmNmOjU1OmUiLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfa25vd25faXNzdWVzIj5LTk9XTiBJU1NVRVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSBmb2xsb3dpbmcgcHJvYmxlbXMgYXJlIGtub3duIHdpdGggUFhFTElOVVgsIHNvIGZhcjo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0idWxpc3QiPjx1bD4NCis8bGk+DQorPHA+DQorVGhlIGVycm9yIHJlY292ZXJ5IHJvdXRpbmUgZG9lc24mIzgyMTc7dCB3b3JrIHF1aXRlIHJpZ2h0LiAgRm9yIHJpZ2h0IG5vdywNCisgIGl0IGp1c3QgZG9lcyBhIGhhcmQgcmVzZXQgLSBzZWVtcyBnb29kIGVub3VnaC4NCis8L3A+DQorPC9saT4NCis8bGk+DQorPHA+DQorV2Ugc2hvdWxkIHByb2JhYmx5IGNhbGwgdGhlIFVEUCByZWNlaXZlIGZ1bmN0aW9uIGluIHRoZSBrZXlib2FyZA0KKyAgZW50cnkgbG9vcCwgc28gdGhhdCB3ZSBhbnN3ZXIgQVJQIHJlcXVlc3RzLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitCb290IHNlY3RvcnMvZGlzayBpbWFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Lg0KKzwvcD4NCis8L2xpPg0KKzwvdWw+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JZiB5b3UgaGF2ZSBhZGRpdGlvbmFsIHByb2JsZW1zLCBwbGVhc2UgY29udGFjdCB0aGUgU3lzbGludXggbWFpbGluZw0KK2xpc3QgKHNlZSBzeXNsaW51eC50eHQgZm9yIHRoZSBhZGRyZXNzLik8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2Jyb2tlbl9weGVfc3RhY2tzIj5Ccm9rZW4gUFhFIHN0YWNrczwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Mb3RzIG9mIFBYRSBzdGFja3MsIGVzcGVjaWFsbHkgb2xkIG9uZXMsIGhhdmUgdmFyaW91cyBwcm9ibGVtcyBvZg0KK3ZhcnlpbmcgZGVncmVlcyBvZiBzZXZlcml0eS4gIFBsZWFzZSBzZWU6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5odHRwOi8vc3lzbGludXguenl0b3IuY29tL2hhcmR3YXJlLnBocDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJvbGlzdCBsb3dlcnJvbWFuIj48b2wgY2xhc3M9Imxvd2Vycm9tYW4iPg0KKzxsaT4NCis8cD4NCitmb3IgYSBsaXN0IG9mIGN1cnJlbnRseSBrbm93biBoYXJkd2FyZSBwcm9ibGVtcywgd2l0aCB3b3JrYXJvdW5kcw0KK2lmIGtub3duLg0KKzwvcD4NCis8L2xpPg0KKzwvb2w+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGVyZSBhcmUgYSBudW1iZXIgb2YgZXh0cmVtZWx5IGJyb2tlbiBQWEUgc3RhY2tzIGluIHRoZSBmaWVsZC4gIFRoZQ0KK2dQWEUgcHJvamVjdCAoZm9ybWVybHkga25vd24gYXMgRXRoZXJib290KSBwcm92aWRlcyBhbiBvcGVuLXNvdXJjZSBQWEUNCitzdGFjayB0aGF0IHdvcmtzIHdpdGggYSBudW1iZXIgb2YgY2FyZHMsIGFuZCB3aGljaCBjYW4gYmUgbG9hZGVkIGZyb20NCithIENELVJPTSwgVVNCIGtleSwgb3IgZmxvcHB5IGlmIGRlc2lyZWQuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SW5mb3JtYXRpb24gb24gZ1BYRSBpcyBhdmFpbGFibGUgZnJvbTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy88L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0ib2xpc3QgbG93ZXJyb21hbiI+PG9sIGNsYXNzPSJsb3dlcnJvbWFuIj4NCis8bGk+DQorPHA+DQorYW5kIHJlYWR5LXRvLXVzZSBST00gb3IgZGlzayBpbWFnZXMgZnJvbToNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmh0dHA6Ly93d3cucm9tLW8tbWF0aWMubmV0LzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2xpPg0KKzwvb2w+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Tb21lIGNhcmRzLCBsaWtlIG1heSBzeXN0ZW1zIHdpdGggdGhlIFNpUyA5MDAsIGhhcyBhIFBYRSBzdGFjayB3aGljaA0KK3dvcmtzIGp1c3QgYmFyZWx5IHdlbGwgZW5vdWdoIHRvIGxvYWQgYSBzaW5nbGUgZmlsZSwgYnV0IGRvZXNuJiM4MjE3O3QNCitoYW5kbGUgdGhlIG1vcmUgYWR2YW5jZWQgaXRlbXMgcmVxdWlyZWQgYnkgUFhFTElOVVguICBJZiBzbywgaXQgaXMNCitwb3NzaWJsZSB0byB1c2UgdGhlIGJ1aWx0LWluIFBYRSBzdGFjayB0byBsb2FkIGdQWEUsIHdoaWNoIGNhbiB0aGVuDQorbG9hZCBQWEVMSU5VWC4gIFNlZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy93aWtpL3B4ZWNoYWluaW5nPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9ub3RlcyI+Tk9URVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfbXRmdHAiPk1URlRQPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlBYRUxJTlVYIGRvZXMgbm90IHN1cHBvcnQgTVRGVFAsIGFuZCB0aGVyZSBhcmUgbm8gcGxhbnMgb2YgZG9pbmcgc28sIGFzDQorTVRGVFAgaXMgaW5oZXJlbnRseSBicm9rZW4gZm9yIGZpbGVzIG1vcmUgdGhhbiA2NTUzNSBwYWNrZXRzIChhYm91dCA5Mg0KK01CKSBpbiBzaXplLiAgSXQgaXMgb2YgY291cnNlIHBvc3NpYmxlIHRvIHVzZSBNVEZUUCBmb3IgdGhlIGluaXRpYWwNCitib290LCBpZiB5b3UgaGF2ZSBzdWNoIGEgc2V0dXAuICBNVEZUUCBzZXJ2ZXIgc2V0dXAgaXMgYmV5b25kIHRoZSBzY29wZQ0KK29mIHRoaXMgZG9jdW1lbnQuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9lcnJvcl9yZWNvdmVyeSI+RXJyb3IgUmVjb3Zlcnk8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgdGhlIGJvb3QgZmFpbHMsIFBYRUxJTlVYICh1bmxpa2UgU1lTTElOVVgpIHdpbGwgbm90IHdhaXQgZm9yZXZlcjsNCityYXRoZXIsIGlmIGl0IGhhcyBub3QgcmVjZWl2ZWQgYW55IGlucHV0IGZvciBhcHByb3hpbWF0ZWx5IGZpdmUNCittaW51dGVzIGFmdGVyIGRpc3BsYXlpbmcgYW4gZXJyb3IgbWVzc2FnZSwgaXQgd2lsbCByZXNldCB0aGUgbWFjaGluZS4NCitUaGlzIGFsbG93cyBhbiB1bmF0dGVuZGVkIG1hY2hpbmUgdG8gcmVjb3ZlciBpbiBjYXNlIGl0IGhhZCBiYWQgZW5vdWdoDQorbHVjayBvZiB0cnlpbmcgdG8gYm9vdCBhdCB0aGUgc2FtZSB0aW1lIHRoZSBURlRQIHNlcnZlciBnb2VzIGRvd24uPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9zZWVfYWxzbyI+U0VFIEFMU088L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+c3lzbGludXguY2ZnPC9zdHJvbmc+KDUpLCA8c3Ryb25nPnN5c2xpbnV4LWNsaTwvc3Ryb25nPigxKSwgPHN0cm9uZz5saWxvPC9zdHJvbmc+KDgpLCA8c3Ryb25nPmtleXRhYi1saWxvLnBsPC9zdHJvbmc+KDgpLA0KKzxzdHJvbmc+ZmRpc2s8L3N0cm9uZz4oOCksIDxzdHJvbmc+bWtmczwvc3Ryb25nPig4KSwgPHN0cm9uZz5zdXBlcmZvcm1hdDwvc3Ryb25nPigxKS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2F1dGhvciI+QVVUSE9SPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIEFzY2lpRG9jIGRlcml2ZWQgZG9jdW1lbnQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbA0KKzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gZG9jdW1lbnRhdGlvbiBieSBILiBQZXRlciBBbnZpbiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmhwYUB6eXRvci5jb20iPmhwYUB6eXRvci5jb208L2E+Jmd0Oy4gIFRoZSBjb252ZXJzaW9uDQordG8gYW4gQXNjaWlEb2Mgd2FzIG1hZGUgYnkgR2VuZSBDdW1tICZsdDs8YSBocmVmPSJtYWlsdG86Z2VuZS5jdW1tQGdtYWlsLmNvbSI+Z2VuZS5jdW1tQGdtYWlsLmNvbTwvYT4mZ3Q7PC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3Rub3RlcyI+PGhyIC8+PC9kaXY+DQorPGRpdiBpZD0iZm9vdGVyIj4NCis8ZGl2IGlkPSJmb290ZXItdGV4dCI+DQorTGFzdCB1cGRhdGVkIDIwMTQtMDEtMTcgMTY6MDk6NTYgUFNUDQorPC9kaXY+DQorPC9kaXY+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9iaW9zL3R4dC9odG1sL3N5c2xpbnV4LWNsaS5odG1sIGIvYmlvcy90eHQvaHRtbC9zeXNsaW51eC1jbGkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM4NDNmCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy90eHQvaHRtbC9zeXNsaW51eC1jbGkuaHRtbApAQCAtMCwwICsxLDgzOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPg0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iYXBwbGljYXRpb24veGh0bWwreG1sOyBjaGFyc2V0PVVURi04IiAvPg0KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQXNjaWlEb2MgOC42LjgiIC8+DQorPHRpdGxlPnN5c2xpbnV4LWNsaSgxKTwvdGl0bGU+DQorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCisvKiBTaGFyZWQgQ1NTIGZvciBBc2NpaURvYyB4aHRtbDExIGFuZCBodG1sNSBiYWNrZW5kcyAqLw0KKw0KKy8qIERlZmF1bHQgZm9udC4gKi8NCitib2R5IHsNCisgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLHNlcmlmOw0KK30NCisNCisvKiBUaXRsZSBmb250LiAqLw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlLA0KK3RoZWFkLCBwLnRhYmxlLmhlYWRlciwNCisjdG9jdGl0bGUsDQorI2F1dGhvciwgI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmssDQorI2Zvb3RlciB7DQorICBmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7DQorfQ0KKw0KK2JvZHkgew0KKyAgbWFyZ2luOiAxZW0gNSUgMWVtIDUlOw0KK30NCisNCithIHsNCisgIGNvbG9yOiBibHVlOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorfQ0KK2E6dmlzaXRlZCB7DQorICBjb2xvcjogZnVjaHNpYTsNCit9DQorDQorZW0gew0KKyAgZm9udC1zdHlsZTogaXRhbGljOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KKw0KK3N0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjMDgzMTk0Ow0KK30NCisNCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgbWFyZ2luLXRvcDogMS4yZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCisgIGxpbmUtaGVpZ2h0OiAxLjM7DQorfQ0KKw0KK2gxLCBoMiwgaDMgew0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQoraDIgew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KK30NCitoMyB7DQorICBmbG9hdDogbGVmdDsNCit9DQoraDMgKyAqIHsNCisgIGNsZWFyOiBsZWZ0Ow0KK30NCitoNSB7DQorICBmb250LXNpemU6IDEuMGVtOw0KK30NCisNCitkaXYuc2VjdGlvbmJvZHkgew0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorfQ0KKw0KK2hyIHsNCisgIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjsNCit9DQorDQorcCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCisNCit1bCwgb2wsIGxpID4gcCB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit1bCA+IGxpICAgICB7IGNvbG9yOiAjYWFhOyB9DQordWwgPiBsaSA+ICogeyBjb2xvcjogYmxhY2s7IH0NCisNCisubW9ub3NwYWNlZCwgY29kZSwgcHJlIHsNCisgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7DQorICBmb250LXNpemU6IGluaGVyaXQ7DQorICBjb2xvcjogbmF2eTsNCisgIHBhZGRpbmc6IDA7DQorICBtYXJnaW46IDA7DQorfQ0KKw0KKw0KKyNhdXRob3Igew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorfQ0KKyNlbWFpbCB7DQorfQ0KKyNyZXZudW1iZXIsICNyZXZkYXRlLCAjcmV2cmVtYXJrIHsNCit9DQorDQorI2Zvb3RlciB7DQorICBmb250LXNpemU6IHNtYWxsOw0KKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIG1hcmdpbi10b3A6IDQuMGVtOw0KK30NCisjZm9vdGVyLXRleHQgew0KKyAgZmxvYXQ6IGxlZnQ7DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorfQ0KKyNmb290ZXItYmFkZ2VzIHsNCisgIGZsb2F0OiByaWdodDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorDQorI3ByZWFtYmxlIHsNCisgIG1hcmdpbi10b3A6IDEuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5pbWFnZWJsb2NrLCBkaXYuZXhhbXBsZWJsb2NrLCBkaXYudmVyc2VibG9jaywNCitkaXYucXVvdGVibG9jaywgZGl2LmxpdGVyYWxibG9jaywgZGl2Lmxpc3RpbmdibG9jaywgZGl2LnNpZGViYXJibG9jaywNCitkaXYuYWRtb25pdGlvbmJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMi4wZW07DQorICBtYXJnaW4tYm90dG9tOiAyLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgY29sb3I6ICM2MDYwNjA7DQorfQ0KKw0KK2Rpdi5jb250ZW50IHsgLyogQmxvY2sgZWxlbWVudCBjb250ZW50LiAqLw0KKyAgcGFkZGluZzogMDsNCit9DQorDQorLyogQmxvY2sgZWxlbWVudCB0aXRsZXMuICovDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCit9DQorZGl2LnRpdGxlICsgKiB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisNCit0ZCBkaXYudGl0bGU6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KK2Rpdi5jb250ZW50IGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgKyBkaXYudGl0bGUgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KKw0KK2Rpdi5zaWRlYmFyYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBiYWNrZ3JvdW5kOiAjZmZmZmVlOw0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgI2YwZjBmMDsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYubGlzdGluZ2Jsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGJhY2tncm91bmQ6ICNmOGY4Zjg7DQorICBwYWRkaW5nOiAwLjVlbTsNCit9DQorDQorZGl2LnF1b3RlYmxvY2ssIGRpdi52ZXJzZWJsb2NrIHsNCisgIHBhZGRpbmctbGVmdDogMS4wZW07DQorICBtYXJnaW4tbGVmdDogMS4wZW07DQorICBtYXJnaW4tcmlnaHQ6IDEwJTsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGNvbG9yOiAjODg4Ow0KK30NCisNCitkaXYucXVvdGVibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQorZGl2LnZlcnNlYmxvY2sgPiBwcmUuY29udGVudCB7DQorICBmb250LWZhbWlseTogaW5oZXJpdDsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCit9DQorZGl2LnZlcnNlYmxvY2sgPiBkaXYuYXR0cmlidXRpb24gew0KKyAgcGFkZGluZy10b3A6IDAuNzVlbTsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KKy8qIERFUFJFQ0FURUQ6IFByZSB2ZXJzaW9uIDguMi43IHZlcnNlIHN0eWxlIGxpdGVyYWwgYmxvY2suICovDQorZGl2LnZlcnNlYmxvY2sgKyBkaXYuYXR0cmlidXRpb24gew0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorDQorZGl2LmFkbW9uaXRpb25ibG9jayAuaWNvbiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KK30NCitkaXYuYWRtb25pdGlvbmJsb2NrIHRkLmNvbnRlbnQgew0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCit9DQorDQorZGl2LmV4YW1wbGVibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCisgIHBhZGRpbmctbGVmdDogMC41ZW07DQorfQ0KKw0KK2Rpdi5pbWFnZWJsb2NrIGRpdi5jb250ZW50IHsgcGFkZGluZy1sZWZ0OiAwOyB9DQorc3Bhbi5pbWFnZSBpbWcgeyBib3JkZXItc3R5bGU6IG5vbmU7IH0NCithLmltYWdlOnZpc2l0ZWQgeyBjb2xvcjogd2hpdGU7IH0NCisNCitkbCB7DQorICBtYXJnaW4tdG9wOiAwLjhlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuOGVtOw0KK30NCitkdCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBjb2xvcjogbmF2eTsNCit9DQorZGQgPiAqOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KK30NCisNCit1bCwgb2wgew0KKyAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOw0KK30NCitvbC5hcmFiaWMgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOw0KK30NCitvbC5sb3dlcmFscGhhIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGE7DQorfQ0KK29sLnVwcGVyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1hbHBoYTsNCit9DQorb2wubG93ZXJyb21hbiB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLXJvbWFuOw0KK30NCitvbC51cHBlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogdXBwZXItcm9tYW47DQorfQ0KKw0KK2Rpdi5jb21wYWN0IHVsLCBkaXYuY29tcGFjdCBvbCwNCitkaXYuY29tcGFjdCBwLCBkaXYuY29tcGFjdCBwLA0KK2Rpdi5jb21wYWN0IGRpdiwgZGl2LmNvbXBhY3QgZGl2IHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK3Rmb290IHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZCA+IGRpdi52ZXJzZSB7DQorICB3aGl0ZS1zcGFjZTogcHJlOw0KK30NCisNCitkaXYuaGRsaXN0IHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2Rpdi5oZGxpc3QgdHIgew0KKyAgcGFkZGluZy1ib3R0b206IDE1cHg7DQorfQ0KK2R0LmhkbGlzdDEuc3Ryb25nLCB0ZC5oZGxpc3QxLnN0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQordGQuaGRsaXN0MSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zdHlsZTogbm9ybWFsOw0KKyAgcGFkZGluZy1yaWdodDogMC44ZW07DQorICBjb2xvcjogbmF2eTsNCit9DQordGQuaGRsaXN0MiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCitkaXYuaGRsaXN0LmNvbXBhY3QgdHIgew0KKyAgbWFyZ2luOiAwOw0KKyAgcGFkZGluZy1ib3R0b206IDA7DQorfQ0KKw0KKy5jb21tZW50IHsNCisgIGJhY2tncm91bmQ6IHllbGxvdzsNCit9DQorDQorLmZvb3Rub3RlLCAuZm9vdG5vdGVyZWYgew0KKyAgZm9udC1zaXplOiAwLjhlbTsNCit9DQorDQorc3Bhbi5mb290bm90ZSwgc3Bhbi5mb290bm90ZXJlZiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7DQorfQ0KKw0KKyNmb290bm90ZXMgew0KKyAgbWFyZ2luOiAyMHB4IDAgMjBweCAwOw0KKyAgcGFkZGluZzogN3B4IDAgMCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGRpdi5mb290bm90ZSB7DQorICBtYXJnaW46IDAgMCA1cHggMDsNCit9DQorDQorI2Zvb3Rub3RlcyBociB7DQorICBib3JkZXI6IG5vbmU7DQorICBib3JkZXItdG9wOiAxcHggc29saWQgc2lsdmVyOw0KKyAgaGVpZ2h0OiAxcHg7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorICB3aWR0aDogMjAlOw0KKyAgbWluLXdpZHRoOiAxMDBweDsNCit9DQorDQorZGl2LmNvbGlzdCB0ZCB7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjNlbTsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5jb2xpc3QgdGQgaW1nIHsNCisgIG1hcmdpbi10b3A6IDAuM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgI2Zvb3Rlci1iYWRnZXMgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKyN0b2Mgew0KKyAgbWFyZ2luLWJvdHRvbTogMi41ZW07DQorfQ0KKw0KKyN0b2N0aXRsZSB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK2Rpdi50b2NsZXZlbDAsIGRpdi50b2NsZXZlbDEsIGRpdi50b2NsZXZlbDIsIGRpdi50b2NsZXZlbDMsIGRpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLXRvcDogMDsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorfQ0KK2Rpdi50b2NsZXZlbDIgew0KKyAgbWFyZ2luLWxlZnQ6IDJlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDMgew0KKyAgbWFyZ2luLWxlZnQ6IDRlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLWxlZnQ6IDZlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KKw0KK3NwYW4uYXF1YSB7IGNvbG9yOiBhcXVhOyB9DQorc3Bhbi5ibGFjayB7IGNvbG9yOiBibGFjazsgfQ0KK3NwYW4uYmx1ZSB7IGNvbG9yOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhIHsgY29sb3I6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXkgeyBjb2xvcjogZ3JheTsgfQ0KK3NwYW4uZ3JlZW4geyBjb2xvcjogZ3JlZW47IH0NCitzcGFuLmxpbWUgeyBjb2xvcjogbGltZTsgfQ0KK3NwYW4ubWFyb29uIHsgY29sb3I6IG1hcm9vbjsgfQ0KK3NwYW4ubmF2eSB7IGNvbG9yOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZSB7IGNvbG9yOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlIHsgY29sb3I6IHB1cnBsZTsgfQ0KK3NwYW4ucmVkIHsgY29sb3I6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyIHsgY29sb3I6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbCB7IGNvbG9yOiB0ZWFsOyB9DQorc3Bhbi53aGl0ZSB7IGNvbG9yOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93IHsgY29sb3I6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYXF1YS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYXF1YTsgfQ0KK3NwYW4uYmxhY2stYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsYWNrOyB9DQorc3Bhbi5ibHVlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBmdWNoc2lhOyB9DQorc3Bhbi5ncmF5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9DQorc3Bhbi5ncmVlbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZ3JlZW47IH0NCitzcGFuLmxpbWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGxpbWU7IH0NCitzcGFuLm1hcm9vbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbWFyb29uOyB9DQorc3Bhbi5uYXZ5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogb2xpdmU7IH0NCitzcGFuLnB1cnBsZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcHVycGxlOyB9DQorc3Bhbi5yZWQtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBzaWx2ZXI7IH0NCitzcGFuLnRlYWwtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHRlYWw7IH0NCitzcGFuLndoaXRlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB5ZWxsb3c7IH0NCisNCitzcGFuLmJpZyB7IGZvbnQtc2l6ZTogMmVtOyB9DQorc3Bhbi5zbWFsbCB7IGZvbnQtc2l6ZTogMC42ZW07IH0NCisNCitzcGFuLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9DQorc3Bhbi5vdmVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7IH0NCitzcGFuLmxpbmUtdGhyb3VnaCB7IHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyB9DQorDQorZGl2LnVuYnJlYWthYmxlIHsgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOyB9DQorDQorDQorLyoNCisgKiB4aHRtbDExIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2Rpdi50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGUgew0KKyAgYm9yZGVyOiAzcHggc29saWQgIzUyN2JiZDsNCit9DQordGhlYWQsIHAudGFibGUuaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGUgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQorLyogQmVjYXVzZSB0aGUgdGFibGUgZnJhbWUgYXR0cmlidXRlIGlzIG92ZXJyaWRlbiBieSBDU1MgaW4gbW9zdCBicm93c2Vycy4gKi8NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2b2lkIl0gew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJoc2lkZXMiXSB7DQorICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0idnNpZGVzIl0gew0KKyAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7DQorfQ0KKw0KKw0KKy8qDQorICogaHRtbDUgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQordGFibGUudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCit0aGVhZCwgcC50YWJsZWJsb2NrLmhlYWRlciB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjNTI3YmJkOw0KK30NCitwLnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQordGFibGUudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDNweDsNCisgIGJvcmRlci1zcGFjaW5nOiAwcHg7DQorICBib3JkZXItc3R5bGU6IHNvbGlkOw0KKyAgYm9yZGVyLWNvbG9yOiAjNTI3YmJkOw0KKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCit9DQordGgudGFibGVibG9jaywgdGQudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDFweDsNCisgIHBhZGRpbmc6IDRweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorfQ0KKw0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtdG9wYm90IHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItcmlnaHQtc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1zaWRlcyB7DQorICBib3JkZXItdG9wLXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItYm90dG9tLXN0eWxlOiBoaWRkZW47DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtbm9uZSB7DQorICBib3JkZXItc3R5bGU6IGhpZGRlbjsNCit9DQorDQordGgudGFibGVibG9jay5oYWxpZ24tbGVmdCwgdGQudGFibGVibG9jay5oYWxpZ24tbGVmdCB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCit0aC50YWJsZWJsb2NrLmhhbGlnbi1jZW50ZXIsIHRkLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciB7DQorICB0ZXh0LWFsaWduOiBjZW50ZXI7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1yaWdodCB7DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQordGgudGFibGVibG9jay52YWxpZ24tdG9wLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi10b3Agew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tbWlkZGxlLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUgew0KKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tYm90dG9tLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20gew0KKyAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsNCit9DQorDQorDQorLyoNCisgKiBtYW5wYWdlIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2JvZHkubWFucGFnZSBoMSB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQorYm9keS5tYW5wYWdlIGgyIHsNCisgIGJvcmRlci1zdHlsZTogbm9uZTsNCit9DQorYm9keS5tYW5wYWdlIGRpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgYm9keS5tYW5wYWdlIGRpdiN0b2MgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKw0KKzwvc3R5bGU+DQorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KKy8qPCFbQ0RBVEFbKi8NCit2YXIgYXNjaWlkb2MgPSB7ICAvLyBOYW1lc3BhY2UuDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gVGFibGUgT2YgQ29udGVudHMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQXV0aG9yOiBNaWhhaSBCYXpvbiwgU2VwdGVtYmVyIDIwMDINCisgKiBodHRwOi8vc3R1ZGVudHMuaW5mb2lhc2kucm8vfm1pc2hvbw0KKyAqDQorICogVGFibGUgT2YgQ29udGVudCBnZW5lcmF0b3INCisgKiBWZXJzaW9uOiAwLjQNCisgKg0KKyAqIEZlZWwgZnJlZSB0byB1c2UgdGhpcyBzY3JpcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMNCisgKiBMaWNlbnNlLCBhcyBsb25nIGFzIHlvdSBkbyBub3QgcmVtb3ZlIG9yIGFsdGVyIHRoaXMgbm90aWNlLg0KKyAqLw0KKw0KKyAvKiBtb2RpZmllZCBieSBUcm95IEQuIEhhbnNvbiwgU2VwdGVtYmVyIDIwMDYuIExpY2Vuc2U6IEdQTCAqLw0KKyAvKiBtb2RpZmllZCBieSBTdHVhcnQgUmFja2hhbSwgMjAwNiwgMjAwOS4gTGljZW5zZTogR1BMICovDQorDQorLy8gdG9jbGV2ZWxzID0gMS4uNC4NCit0b2M6IGZ1bmN0aW9uICh0b2NsZXZlbHMpIHsNCisNCisgIGZ1bmN0aW9uIGdldFRleHQoZWwpIHsNCisgICAgdmFyIHRleHQgPSAiIjsNCisgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICBpZiAoaS5ub2RlVHlwZSA9PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSAvLyBJRSBkb2Vzbid0IHNwZWFrIGNvbnN0YW50cy4NCisgICAgICAgIHRleHQgKz0gaS5kYXRhOw0KKyAgICAgIGVsc2UgaWYgKGkuZmlyc3RDaGlsZCAhPSBudWxsKQ0KKyAgICAgICAgdGV4dCArPSBnZXRUZXh0KGkpOw0KKyAgICB9DQorICAgIHJldHVybiB0ZXh0Ow0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gVG9jRW50cnkoZWwsIHRleHQsIHRvY2xldmVsKSB7DQorICAgIHRoaXMuZWxlbWVudCA9IGVsOw0KKyAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KKyAgICB0aGlzLnRvY2xldmVsID0gdG9jbGV2ZWw7DQorICB9DQorDQorICBmdW5jdGlvbiB0b2NFbnRyaWVzKGVsLCB0b2NsZXZlbHMpIHsNCisgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTsNCisgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnW2hIXShbMS0nKyh0b2NsZXZlbHMrMSkrJ10pJyk7DQorICAgIC8vIEZ1bmN0aW9uIHRoYXQgc2NhbnMgdGhlIERPTSB0cmVlIGZvciBoZWFkZXIgZWxlbWVudHMgKHRoZSBET00yDQorICAgIC8vIG5vZGVJdGVyYXRvciBBUEkgd291bGQgYmUgYSBiZXR0ZXIgdGVjaG5pcXVlIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IGFsbA0KKyAgICAvLyBicm93c2VycykuDQorICAgIHZhciBpdGVyYXRlID0gZnVuY3Rpb24gKGVsKSB7DQorICAgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICAgIGlmIChpLm5vZGVUeXBlID09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHsNCisgICAgICAgICAgdmFyIG1vID0gcmUuZXhlYyhpLnRhZ05hbWUpOw0KKyAgICAgICAgICBpZiAobW8gJiYgKGkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8IGkuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKSkgIT0gImZsb2F0Iikgew0KKyAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IG5ldyBUb2NFbnRyeShpLCBnZXRUZXh0KGkpLCBtb1sxXS0xKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpdGVyYXRlKGkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpdGVyYXRlKGVsKTsNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHZhciB0b2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9jIik7DQorICBpZiAoIXRvYykgew0KKyAgICByZXR1cm47DQorICB9DQorDQorICAvLyBEZWxldGUgZXhpc3RpbmcgVE9DIGVudHJpZXMgaW4gY2FzZSB3ZSdyZSByZWxvYWRpbmcgdGhlIFRPQy4NCisgIHZhciB0b2NFbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIHZhciBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHRvYy5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IHRvYy5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2Jw0KKyAgICAgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikubWF0Y2goL150b2NsZXZlbC8pKQ0KKyAgICAgIHRvY0VudHJpZXNUb1JlbW92ZS5wdXNoKGVudHJ5KTsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCB0b2NFbnRyaWVzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCisgICAgdG9jLnJlbW92ZUNoaWxkKHRvY0VudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIFRPQyBlbnRyaWVzLg0KKyAgdmFyIGVudHJpZXMgPSB0b2NFbnRyaWVzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50IiksIHRvY2xldmVscyk7DQorICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHsNCisgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpXTsNCisgICAgaWYgKGVudHJ5LmVsZW1lbnQuaWQgPT0gIiIpDQorICAgICAgZW50cnkuZWxlbWVudC5pZCA9ICJfdG9jXyIgKyBpOw0KKyAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsNCisgICAgYS5ocmVmID0gIiMiICsgZW50cnkuZWxlbWVudC5pZDsNCisgICAgYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbnRyeS50ZXh0KSk7DQorICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCisgICAgZGl2LmFwcGVuZENoaWxkKGEpOw0KKyAgICBkaXYuY2xhc3NOYW1lID0gInRvY2xldmVsIiArIGVudHJ5LnRvY2xldmVsOw0KKyAgICB0b2MuYXBwZW5kQ2hpbGQoZGl2KTsNCisgIH0NCisgIGlmIChlbnRyaWVzLmxlbmd0aCA9PSAwKQ0KKyAgICB0b2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b2MpOw0KK30sDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gRm9vdG5vdGVzIGdlbmVyYXRvcg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qIEJhc2VkIG9uIGZvb3Rub3RlIGdlbmVyYXRpb24gY29kZSBmcm9tOg0KKyAqIGh0dHA6Ly93d3cuYnJhbmRzcGFua2luZ25ldy5uZXQvYXJjaGl2ZS8yMDA1LzA3L2Zvcm1hdF9mb290bm90ZS5odG1sDQorICovDQorDQorZm9vdG5vdGVzOiBmdW5jdGlvbiAoKSB7DQorICAvLyBEZWxldGUgZXhpc3RpbmcgZm9vdG5vdGUgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgZm9vdG5vZGVzLg0KKyAgdmFyIGk7DQorICB2YXIgbm90ZWhvbGRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb290bm90ZXMiKTsNCisgIGlmICghbm90ZWhvbGRlcikgew0KKyAgICByZXR1cm47DQorICB9DQorICB2YXIgZW50cmllc1RvUmVtb3ZlID0gW107DQorICBmb3IgKGkgPSAwOyBpIDwgbm90ZWhvbGRlci5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IG5vdGVob2xkZXIuY2hpbGROb2Rlc1tpXTsNCisgICAgaWYgKGVudHJ5Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2RpdicgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpID09ICJmb290bm90ZSIpDQorICAgICAgZW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IGVudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICBub3RlaG9sZGVyLnJlbW92ZUNoaWxkKGVudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIGZvb3Rub3RlIGVudHJpZXMuDQorICB2YXIgY29udCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50Iik7DQorICB2YXIgc3BhbnMgPSBjb250LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQorICB2YXIgcmVmcyA9IHt9Ow0KKyAgdmFyIG4gPSAwOw0KKyAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGUiKSB7DQorICAgICAgbisrOw0KKyAgICAgIHZhciBub3RlID0gc3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiKTsNCisgICAgICBpZiAoIW5vdGUpIHsNCisgICAgICAgIC8vIFVzZSBbXHNcU10gaW4gcGxhY2Ugb2YgLiBzbyBtdWx0aS1saW5lIG1hdGNoZXMgd29yay4NCisgICAgICAgIC8vIEJlY2F1c2UgSmF2YVNjcmlwdCBoYXMgbm8gcyAoZG90YWxsKSByZWdleCBmbGFnLg0KKyAgICAgICAgbm90ZSA9IHNwYW5zW2ldLmlubmVySFRNTC5tYXRjaCgvXHMqXFsoW1xzXFNdKildXHMqLylbMV07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGlkPSdfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgICAgc3BhbnNbaV0uc2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiLCBub3RlKTsNCisgICAgICB9DQorICAgICAgbm90ZWhvbGRlci5pbm5lckhUTUwgKz0NCisgICAgICAgICI8ZGl2IGNsYXNzPSdmb290bm90ZScgaWQ9J19mb290bm90ZV8iICsgbiArICInPiIgKw0KKyAgICAgICAgIjxhIGhyZWY9JyNfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyB0aXRsZT0nUmV0dXJuIHRvIHRleHQnPiIgKw0KKyAgICAgICAgbiArICI8L2E+LiAiICsgbm90ZSArICI8L2Rpdj4iOw0KKyAgICAgIHZhciBpZCA9c3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOw0KKyAgICAgIGlmIChpZCAhPSBudWxsKSByZWZzWyIjIitpZF0gPSBuOw0KKyAgICB9DQorICB9DQorICBpZiAobiA9PSAwKQ0KKyAgICBub3RlaG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm90ZWhvbGRlcik7DQorICBlbHNlIHsNCisgICAgLy8gUHJvY2VzcyBmb290bm90ZXJlZnMuDQorICAgIGZvciAoaT0wOyBpPHNwYW5zLmxlbmd0aDsgaSsrKSB7DQorICAgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGVyZWYiKSB7DQorICAgICAgICB2YXIgaHJlZiA9IHNwYW5zW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0uZ2V0QXR0cmlidXRlKCJocmVmIik7DQorICAgICAgICBocmVmID0gaHJlZi5tYXRjaCgvIy4qLylbMF07ICAvLyBCZWNhdXNlIElFIHJldHVybiBmdWxsIFVSTC4NCisgICAgICAgIG4gPSByZWZzW2hyZWZdOw0KKyAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0NCisgICAgICAgICAgIls8YSBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30sDQorDQoraW5zdGFsbDogZnVuY3Rpb24odG9jbGV2ZWxzKSB7DQorICB2YXIgdGltZXJJZDsNCisNCisgIGZ1bmN0aW9uIHJlaW5zdGFsbCgpIHsNCisgICAgYXNjaWlkb2MuZm9vdG5vdGVzKCk7DQorICAgIGlmICh0b2NsZXZlbHMpIHsNCisgICAgICBhc2NpaWRvYy50b2ModG9jbGV2ZWxzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIoKSB7DQorICAgIGNsZWFySW50ZXJ2YWwodGltZXJJZCk7DQorICAgIHJlaW5zdGFsbCgpOw0KKyAgfQ0KKw0KKyAgdGltZXJJZCA9IHNldEludGVydmFsKHJlaW5zdGFsbCwgNTAwKTsNCisgIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKQ0KKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIsIGZhbHNlKTsNCisgIGVsc2UNCisgICAgd2luZG93Lm9ubG9hZCA9IHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyOw0KK30NCisNCit9DQorYXNjaWlkb2MuaW5zdGFsbCgpOw0KKy8qXV0+Ki8NCis8L3NjcmlwdD4NCis8L2hlYWQ+DQorPGJvZHkgY2xhc3M9Im1hbnBhZ2UiPg0KKzxkaXYgaWQ9ImhlYWRlciI+DQorPGgxPg0KK3N5c2xpbnV4LWNsaSgxKSBNYW51YWwgUGFnZQ0KKzwvaDE+DQorPGgyPk5BTUU8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8cD5zeXNsaW51eC1jbGkgLQ0KKyAgICpTeXNsaW51eCogYm9vdCBwcm9tcHQvY29tbWFuZCBsaW5lIGludGVyZmFjZQ0KKzwvcD4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJjb250ZW50Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZGVzY3JpcHRpb24iPkRFU0NSSVBUSU9OPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+J3MgYm9vdCBwcm9tcHQgcHJvdmlkZXMgYSB2ZXJ5IHNpbXBsaXN0aWMgY29tbWFuZCBsaW5lDQoraW50ZXJmYWNlIGZvciBsb2FkaW5nIG1vZHVsZXMgYW5kIGJvb3Rpbmcga2VybmVscy48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2Jvb3RfcHJvbXB0Ij5CT09UIFBST01QVDwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9jb21tYW5kX2xpbmVfa2V5c3Ryb2tlcyI+Q09NTUFORCBMSU5FIEtFWVNUUk9LRVM8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIGNvbW1hbmQgbGluZSBwcm9tcHQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBrZXlzdHJva2VzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+Jmx0O0VudGVyJmd0OyAgICAgICAgICAgICAgIGJvb3Qgc3BlY2lmaWVkIGNvbW1hbmQgbGluZQ0KKyZsdDtCYWNrU3BhY2UmZ3Q7ICAgICAgICAgICBlcmFzZSBvbmUgY2hhcmFjdGVyDQorJmx0O0N0cmwtVSZndDsgICAgICAgICAgICAgIGVyYXNlIHRoZSB3aG9sZSBsaW5lDQorJmx0O0N0cmwtViZndDsgICAgICAgICAgICAgIGRpc3BsYXkgdGhlIGN1cnJlbnQgU3lzbGludXggdmVyc2lvbg0KKyZsdDtDdHJsLVcmZ3Q7ICAgICAgICAgICAgICBlcmFzZSBvbmUgd29yZA0KKyZsdDtDdHJsLVgmZ3Q7ICAgICAgICAgICAgICBmb3JjZSB0ZXh0IG1vZGUNCismbHQ7VGFiJmd0OyAgICAgICAgICAgICAgICAgbGlzdCBtYXRjaGluZyBsYWJlbHMNCismbHQ7RjEmZ3Q7Li4mbHQ7RjEyJmd0OyAgICAgICAgICAgaGVscCBzY3JlZW5zIChpZiBjb25maWd1cmVkKQ0KKyZsdDtDdHJsLUYmZ3Q7Jmx0O2RpZ2l0Jmd0OyAgICAgICBlcXVpdmFsZW50IHRvIEYxLi5GMTANCismbHQ7Q3RybC1DJmd0OyAgICAgICAgICAgICAgaW50ZXJydXB0IGJvb3QgaW4gcHJvZ3Jlc3MNCismbHQ7RXNjJmd0OyAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGJvb3QgaW4gcHJvZ3Jlc3MNCismbHQ7Q3RybC1OJmd0OyAgICAgICAgICAgICAgZGlzcGxheSBuZXR3b3JrIGluZm9ybWF0aW9uIChQWEVMSU5VWCBvbmx5OyAzLjUwLTQuMDYpPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il93b3JraW5nX2RpcmVjdG9yeSI+V09SS0lORyBESVJFQ1RPUlk8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+QXQgc3RhcnQsIHRoZSBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5IGZvciA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+LzxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gd2lsbA0KK2JlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uIGZpbGUuICBJZiBubw0KK2NvbmZpZ3VyYXRpb24gZmlsZSBpcyBmb3VuZCwgPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBzaG91bGQgZGVmYXVsdCB0byB0aGUNCitpbnN0YWxsLXRpbWUgd29ya2luZyBkaXJlY3RvcnksIGhvd2V2ZXIgdGhpcyBpcyBhIGtub3duIGlzc3VlIHdpdGggc29tZQ0KK3ZlcnNpb25zIGluY2x1ZGluZyA0LjA2LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkF0IHN0YXJ0LCB0aGUgaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiB3aWxsIGJlIHRoZQ0KK3BhcmVudCBkaXJlY3Rvcnkgb2YgcHhlbGludXguMCB1bmxlc3Mgb3ZlcnJpZGRlbiB3aXRoIERIQ1Agb3B0aW9uIDIxMC4NCitJZiBubyBjb25maWd1cmF0aW9uIGZpbGUgaXMgZm91bmQsIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gd2lsbCBzdGFydCBhIHRpbWVyIHRvDQorcmVib290IHRoZSBzeXN0ZW0gaW4gYW4gYXR0ZW1wdCB0byByZXN0YXJ0IHRoZSBib290IHByb2Nlc3MgYW5kIHJlc29sdmUNCithIHBvc3NpYmxlIHRyYW5zaWVudCBpc3N1ZS48L3A+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2FsdGVybmF0ZV9maWxlbmFtZXMiPkFMVEVSTkFURSBGSUxFTkFNRVM8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Rm9yIGtlcm5lbC1saWtlIGZpbGUgbmFtZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSwgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiB3aWxsDQorYXR0ZW1wdCB0byBhcHBlbmQgZmlsZSBuYW1lIGV4dGVuc2lvbnMgdG8gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgd2hlbg0KK3RoZSBmaWxlIGlzIG5vdCBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAuMFs8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IG9ubHldLA0KKy5iaW5bPHN0cm9uZz5JU09MSU5VWDwvc3Ryb25nPiBvbmx5XSwgLmJzWzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gb25seV0sIC5ic3NbPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBvbmx5XSwNCisuYzMyLCAuY2J0W1VwIHRvIDQuMDZdLCAuY29tW1VwIHRvIDQuMDZdIGFuZCAuaW1nWzxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gMS42NS00LjA0IG9ubHldLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfcGF0aF9ydWxlcyI+UEFUSCBSVUxFUzwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyA8c3Ryb25nPmFsd2F5czwvc3Ryb25nPiBzZWFyY2hlZCBmaXJzdCwgYmVmb3JlIFBBVEgsDQord2hlbiBhdHRlbXB0aW5nIHRvIG9wZW4gYSBmaWxlbmFtZS4gVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMNCitub3QgYWZmZWN0ZWQgd2hlbiBzcGVjaWZ5aW5nIGEgZmlsZSB3aXRoIGFuIGFic29sdXRlIHBhdGguIEZvcg0KK2V4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcgZmlsZSBzeXN0ZW0gbGF5b3V0LDwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+L2Jvb3QvDQorICAgICAgICAvYmluLw0KKyAgICAgICAgICAgICAgICBscy5jMzINCisgICAgICAgICAgICAgICAgbGlibHMuYzMyDQorICAgICAgICAvZm9vLw0KKyAgICAgICAgICAgICAgICBsaWJscy5jMzI8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5hc3N1bWluZyB0aGF0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIC9ib290L2ZvbywgYW5kIGFzc3VtaW5nDQordGhhdCBsaWJscy5jMzIgaXMgYSBkZXBlbmRlbmN5IG9mIGxzLmMzMiwgZXhlY3V0aW5nIC9ib290L2Jpbi9scy5jMzINCit3aWxsIGNhdXNlIC9ib290L2Zvby9saWJscy5jMzIgdG8gYmUgbG9hZGVkLCBub3QgL2Jvb3QvYmluL2xpYmxzLmMzMiwNCitldmVuIGlmIC9ib290L2JpbiBpcyBzcGVjaWZpZWQgaW4gdGhlIFBBVEggZGlyZWN0aXZlIG9mIGEgY29uZmlnIGZpbGUuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIHJlYXNvbiB0aGF0IHRoaW5ncyB3b3JrIHRoaXMgd2F5IGlzIHRoYXQgdHlwaWNhbGx5IGEgdXNlciB3aWxsDQoraW5zdGFsbCBhbGwgbGlicmFyeSBmaWxlcyBpbiB0aGUgU3lzbGludXggaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgYXMNCitzcGVjaWZpZWQgd2l0aCB0aGUgLS1kaXJlY3RvcnkgaW5zdGFsbGVyIG9wdGlvbi4gVGhpcyBtZXRob2QgYWxsb3dzDQordGhlIHVzZXIgdG8gb21pdCB0aGUgUEFUSCBkaXJlY3RpdmUgZnJvbSB0aGVpciBjb25maWcgZmlsZSBhbmQgc3RpbGwNCitoYXZlIHRoaW5ncyB3b3JrIGNvcnJlY3RseS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2F1dGhvciI+QVVUSE9SPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIEFzY2lpRG9jIGRlcml2ZWQgZG9jdW1lbnQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbA0KKzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gZG9jdW1lbnRhdGlvbiBieSBILiBQZXRlciBBbnZpbiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmhwYUB6eXRvci5jb20iPmhwYUB6eXRvci5jb208L2E+Jmd0Oy4gIFRoZSBjb252ZXJzaW9uDQordG8gYW4gQXNjaWlEb2Mgd2FzIG1hZGUgYnkgR2VuZSBDdW1tICZsdDs8YSBocmVmPSJtYWlsdG86Z2VuZS5jdW1tQGdtYWlsLmNvbSI+Z2VuZS5jdW1tQGdtYWlsLmNvbTwvYT4mZ3Q7PC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3Rub3RlcyI+PGhyIC8+PC9kaXY+DQorPGRpdiBpZD0iZm9vdGVyIj4NCis8ZGl2IGlkPSJmb290ZXItdGV4dCI+DQorTGFzdCB1cGRhdGVkIDIwMTQtMDEtMTcgMTY6MDk6NTYgUFNUDQorPC9kaXY+DQorPC9kaXY+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9iaW9zL3R4dC9odG1sL3N5c2xpbnV4LmNmZy5odG1sIGIvYmlvcy90eHQvaHRtbC9zeXNsaW51eC5jZmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZhZGUwCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy90eHQvaHRtbC9zeXNsaW51eC5jZmcuaHRtbApAQCAtMCwwICsxLDE3ODYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiINCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCis8aGVhZD4NCis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9ImFwcGxpY2F0aW9uL3hodG1sK3htbDsgY2hhcnNldD1VVEYtOCIgLz4NCis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkFzY2lpRG9jIDguNi44IiAvPg0KKzx0aXRsZT5zeXNsaW51eC5jZmcoNSk8L3RpdGxlPg0KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQorLyogU2hhcmVkIENTUyBmb3IgQXNjaWlEb2MgeGh0bWwxMSBhbmQgaHRtbDUgYmFja2VuZHMgKi8NCisNCisvKiBEZWZhdWx0IGZvbnQuICovDQorYm9keSB7DQorICBmb250LWZhbWlseTogR2VvcmdpYSxzZXJpZjsNCit9DQorDQorLyogVGl0bGUgZm9udC4gKi8NCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LA0KK2Rpdi50aXRsZSwgY2FwdGlvbi50aXRsZSwNCit0aGVhZCwgcC50YWJsZS5oZWFkZXIsDQorI3RvY3RpdGxlLA0KKyNhdXRob3IsICNyZXZudW1iZXIsICNyZXZkYXRlLCAjcmV2cmVtYXJrLA0KKyNmb290ZXIgew0KKyAgZm9udC1mYW1pbHk6IEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmOw0KK30NCisNCitib2R5IHsNCisgIG1hcmdpbjogMWVtIDUlIDFlbSA1JTsNCit9DQorDQorYSB7DQorICBjb2xvcjogYmx1ZTsNCisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KK30NCithOnZpc2l0ZWQgew0KKyAgY29sb3I6IGZ1Y2hzaWE7DQorfQ0KKw0KK2VtIHsNCisgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCisNCitzdHJvbmcgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzA4MzE5NDsNCit9DQorDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIG1hcmdpbi10b3A6IDEuMmVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorICBsaW5lLWhlaWdodDogMS4zOw0KK30NCisNCitoMSwgaDIsIGgzIHsNCisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBzaWx2ZXI7DQorfQ0KK2gyIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCit9DQoraDMgew0KKyAgZmxvYXQ6IGxlZnQ7DQorfQ0KK2gzICsgKiB7DQorICBjbGVhcjogbGVmdDsNCit9DQoraDUgew0KKyAgZm9udC1zaXplOiAxLjBlbTsNCit9DQorDQorZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAwOw0KK30NCisNCitociB7DQorICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7DQorfQ0KKw0KK3Agew0KKyAgbWFyZ2luLXRvcDogMC41ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCit9DQorDQordWwsIG9sLCBsaSA+IHAgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQordWwgPiBsaSAgICAgeyBjb2xvcjogI2FhYTsgfQ0KK3VsID4gbGkgPiAqIHsgY29sb3I6IGJsYWNrOyB9DQorDQorLm1vbm9zcGFjZWQsIGNvZGUsIHByZSB7DQorICBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlOw0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KKyAgY29sb3I6IG5hdnk7DQorICBwYWRkaW5nOiAwOw0KKyAgbWFyZ2luOiAwOw0KK30NCisNCisNCisjYXV0aG9yIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBmb250LXNpemU6IDEuMWVtOw0KK30NCisjZW1haWwgew0KK30NCisjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyayB7DQorfQ0KKw0KKyNmb290ZXIgew0KKyAgZm9udC1zaXplOiBzbWFsbDsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICBtYXJnaW4tdG9wOiA0LjBlbTsNCit9DQorI2Zvb3Rlci10ZXh0IHsNCisgIGZsb2F0OiBsZWZ0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisjZm9vdGVyLWJhZGdlcyB7DQorICBmbG9hdDogcmlnaHQ7DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KKyNwcmVhbWJsZSB7DQorICBtYXJnaW4tdG9wOiAxLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCitkaXYuaW1hZ2VibG9jaywgZGl2LmV4YW1wbGVibG9jaywgZGl2LnZlcnNlYmxvY2ssDQorZGl2LnF1b3RlYmxvY2ssIGRpdi5saXRlcmFsYmxvY2ssIGRpdi5saXN0aW5nYmxvY2ssIGRpdi5zaWRlYmFyYmxvY2ssDQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCitkaXYuYWRtb25pdGlvbmJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDIuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMi4wZW07DQorICBtYXJnaW4tcmlnaHQ6IDEwJTsNCisgIGNvbG9yOiAjNjA2MDYwOw0KK30NCisNCitkaXYuY29udGVudCB7IC8qIEJsb2NrIGVsZW1lbnQgY29udGVudC4gKi8NCisgIHBhZGRpbmc6IDA7DQorfQ0KKw0KKy8qIEJsb2NrIGVsZW1lbnQgdGl0bGVzLiAqLw0KK2Rpdi50aXRsZSwgY2FwdGlvbi50aXRsZSB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KK2Rpdi50aXRsZSArICogew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQorDQordGQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCBkaXYudGl0bGU6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KK2Rpdi5jb250ZW50ICsgZGl2LnRpdGxlIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCisNCitkaXYuc2lkZWJhcmJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYmFja2dyb3VuZDogI2ZmZmZlZTsNCisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7DQorICBib3JkZXItbGVmdDogNHB4IHNvbGlkICNmMGYwZjA7DQorICBwYWRkaW5nOiAwLjVlbTsNCit9DQorDQorZGl2Lmxpc3RpbmdibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7DQorICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmMGYwZjA7DQorICBiYWNrZ3JvdW5kOiAjZjhmOGY4Ow0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYudmVyc2VibG9jayB7DQorICBwYWRkaW5nLWxlZnQ6IDEuMGVtOw0KKyAgbWFyZ2luLWxlZnQ6IDEuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmMGYwZjA7DQorICBjb2xvcjogIzg4ODsNCit9DQorDQorZGl2LnF1b3RlYmxvY2sgPiBkaXYuYXR0cmlidXRpb24gew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgdGV4dC1hbGlnbjogcmlnaHQ7DQorfQ0KKw0KK2Rpdi52ZXJzZWJsb2NrID4gcHJlLmNvbnRlbnQgew0KKyAgZm9udC1mYW1pbHk6IGluaGVyaXQ7DQorICBmb250LXNpemU6IGluaGVyaXQ7DQorfQ0KK2Rpdi52ZXJzZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjc1ZW07DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisvKiBERVBSRUNBVEVEOiBQcmUgdmVyc2lvbiA4LjIuNyB2ZXJzZSBzdHlsZSBsaXRlcmFsIGJsb2NrLiAqLw0KK2Rpdi52ZXJzZWJsb2NrICsgZGl2LmF0dHJpYnV0aW9uIHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KKw0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgLmljb24gew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB0ZC5jb250ZW50IHsNCisgIHBhZGRpbmctbGVmdDogMC41ZW07DQorICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNkZGRkZGQ7DQorfQ0KKw0KK2Rpdi5leGFtcGxlYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNkZGRkZGQ7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KK30NCisNCitkaXYuaW1hZ2VibG9jayBkaXYuY29udGVudCB7IHBhZGRpbmctbGVmdDogMDsgfQ0KK3NwYW4uaW1hZ2UgaW1nIHsgYm9yZGVyLXN0eWxlOiBub25lOyB9DQorYS5pbWFnZTp2aXNpdGVkIHsgY29sb3I6IHdoaXRlOyB9DQorDQorZGwgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZHQgew0KKyAgbWFyZ2luLXRvcDogMC41ZW07DQorICBtYXJnaW4tYm90dG9tOiAwOw0KKyAgZm9udC1zdHlsZTogbm9ybWFsOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KK2RkID4gKjpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjFlbTsNCit9DQorDQordWwsIG9sIHsNCisgICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTsNCit9DQorb2wuYXJhYmljIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsNCit9DQorb2wubG93ZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhOw0KK30NCitvbC51cHBlcmFscGhhIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogdXBwZXItYWxwaGE7DQorfQ0KK29sLmxvd2Vycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1yb21hbjsNCit9DQorb2wudXBwZXJyb21hbiB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLXJvbWFuOw0KK30NCisNCitkaXYuY29tcGFjdCB1bCwgZGl2LmNvbXBhY3Qgb2wsDQorZGl2LmNvbXBhY3QgcCwgZGl2LmNvbXBhY3QgcCwNCitkaXYuY29tcGFjdCBkaXYsIGRpdi5jb21wYWN0IGRpdiB7DQorICBtYXJnaW4tdG9wOiAwLjFlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuMWVtOw0KK30NCisNCit0Zm9vdCB7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQordGQgPiBkaXYudmVyc2Ugew0KKyAgd2hpdGUtc3BhY2U6IHByZTsNCit9DQorDQorZGl2LmhkbGlzdCB7DQorICBtYXJnaW4tdG9wOiAwLjhlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuOGVtOw0KK30NCitkaXYuaGRsaXN0IHRyIHsNCisgIHBhZGRpbmctYm90dG9tOiAxNXB4Ow0KK30NCitkdC5oZGxpc3QxLnN0cm9uZywgdGQuaGRsaXN0MS5zdHJvbmcgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkLmhkbGlzdDEgew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIHBhZGRpbmctcmlnaHQ6IDAuOGVtOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KK3RkLmhkbGlzdDIgew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmhkbGlzdC5jb21wYWN0IHRyIHsNCisgIG1hcmdpbjogMDsNCisgIHBhZGRpbmctYm90dG9tOiAwOw0KK30NCisNCisuY29tbWVudCB7DQorICBiYWNrZ3JvdW5kOiB5ZWxsb3c7DQorfQ0KKw0KKy5mb290bm90ZSwgLmZvb3Rub3RlcmVmIHsNCisgIGZvbnQtc2l6ZTogMC44ZW07DQorfQ0KKw0KK3NwYW4uZm9vdG5vdGUsIHNwYW4uZm9vdG5vdGVyZWYgew0KKyAgdmVydGljYWwtYWxpZ246IHN1cGVyOw0KK30NCisNCisjZm9vdG5vdGVzIHsNCisgIG1hcmdpbjogMjBweCAwIDIwcHggMDsNCisgIHBhZGRpbmc6IDdweCAwIDAgMDsNCit9DQorDQorI2Zvb3Rub3RlcyBkaXYuZm9vdG5vdGUgew0KKyAgbWFyZ2luOiAwIDAgNXB4IDA7DQorfQ0KKw0KKyNmb290bm90ZXMgaHIgew0KKyAgYm9yZGVyOiBub25lOw0KKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHNpbHZlcjsNCisgIGhlaWdodDogMXB4Ow0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCisgIG1hcmdpbi1sZWZ0OiAwOw0KKyAgd2lkdGg6IDIwJTsNCisgIG1pbi13aWR0aDogMTAwcHg7DQorfQ0KKw0KK2Rpdi5jb2xpc3QgdGQgew0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorICBwYWRkaW5nLWJvdHRvbTogMC4zZW07DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCitkaXYuY29saXN0IHRkIGltZyB7DQorICBtYXJnaW4tdG9wOiAwLjNlbTsNCit9DQorDQorQG1lZGlhIHByaW50IHsNCisgICNmb290ZXItYmFkZ2VzIHsgZGlzcGxheTogbm9uZTsgfQ0KK30NCisNCisjdG9jIHsNCisgIG1hcmdpbi1ib3R0b206IDIuNWVtOw0KK30NCisNCisjdG9jdGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuMWVtOw0KK30NCisNCitkaXYudG9jbGV2ZWwwLCBkaXYudG9jbGV2ZWwxLCBkaXYudG9jbGV2ZWwyLCBkaXYudG9jbGV2ZWwzLCBkaXYudG9jbGV2ZWw0IHsNCisgIG1hcmdpbi10b3A6IDA7DQorICBtYXJnaW4tYm90dG9tOiAwOw0KK30NCitkaXYudG9jbGV2ZWwyIHsNCisgIG1hcmdpbi1sZWZ0OiAyZW07DQorICBmb250LXNpemU6IDAuOWVtOw0KK30NCitkaXYudG9jbGV2ZWwzIHsNCisgIG1hcmdpbi1sZWZ0OiA0ZW07DQorICBmb250LXNpemU6IDAuOWVtOw0KK30NCitkaXYudG9jbGV2ZWw0IHsNCisgIG1hcmdpbi1sZWZ0OiA2ZW07DQorICBmb250LXNpemU6IDAuOWVtOw0KK30NCisNCitzcGFuLmFxdWEgeyBjb2xvcjogYXF1YTsgfQ0KK3NwYW4uYmxhY2sgeyBjb2xvcjogYmxhY2s7IH0NCitzcGFuLmJsdWUgeyBjb2xvcjogYmx1ZTsgfQ0KK3NwYW4uZnVjaHNpYSB7IGNvbG9yOiBmdWNoc2lhOyB9DQorc3Bhbi5ncmF5IHsgY29sb3I6IGdyYXk7IH0NCitzcGFuLmdyZWVuIHsgY29sb3I6IGdyZWVuOyB9DQorc3Bhbi5saW1lIHsgY29sb3I6IGxpbWU7IH0NCitzcGFuLm1hcm9vbiB7IGNvbG9yOiBtYXJvb247IH0NCitzcGFuLm5hdnkgeyBjb2xvcjogbmF2eTsgfQ0KK3NwYW4ub2xpdmUgeyBjb2xvcjogb2xpdmU7IH0NCitzcGFuLnB1cnBsZSB7IGNvbG9yOiBwdXJwbGU7IH0NCitzcGFuLnJlZCB7IGNvbG9yOiByZWQ7IH0NCitzcGFuLnNpbHZlciB7IGNvbG9yOiBzaWx2ZXI7IH0NCitzcGFuLnRlYWwgeyBjb2xvcjogdGVhbDsgfQ0KK3NwYW4ud2hpdGUgeyBjb2xvcjogd2hpdGU7IH0NCitzcGFuLnllbGxvdyB7IGNvbG9yOiB5ZWxsb3c7IH0NCisNCitzcGFuLmFxdWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGFxdWE7IH0NCitzcGFuLmJsYWNrLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBibGFjazsgfQ0KK3NwYW4uYmx1ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmx1ZTsgfQ0KK3NwYW4uZnVjaHNpYS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZ3JheTsgfQ0KK3NwYW4uZ3JlZW4tYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyZWVuOyB9DQorc3Bhbi5saW1lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24tYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG1hcm9vbjsgfQ0KK3NwYW4ubmF2eS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbmF2eTsgfQ0KK3NwYW4ub2xpdmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHB1cnBsZTsgfQ0KK3NwYW4ucmVkLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiByZWQ7IH0NCitzcGFuLnNpbHZlci1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogc2lsdmVyOyB9DQorc3Bhbi50ZWFsLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB0ZWFsOyB9DQorc3Bhbi53aGl0ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogd2hpdGU7IH0NCitzcGFuLnllbGxvdy1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogeWVsbG93OyB9DQorDQorc3Bhbi5iaWcgeyBmb250LXNpemU6IDJlbTsgfQ0KK3NwYW4uc21hbGwgeyBmb250LXNpemU6IDAuNmVtOyB9DQorDQorc3Bhbi51bmRlcmxpbmUgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQ0KK3NwYW4ub3ZlcmxpbmUgeyB0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lOyB9DQorc3Bhbi5saW5lLXRocm91Z2ggeyB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsgfQ0KKw0KK2Rpdi51bmJyZWFrYWJsZSB7IHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsgfQ0KKw0KKw0KKy8qDQorICogeGh0bWwxMSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCitkaXYudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlIHsNCisgIGJvcmRlcjogM3B4IHNvbGlkICM1MjdiYmQ7DQorfQ0KK3RoZWFkLCBwLnRhYmxlLmhlYWRlciB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjNTI3YmJkOw0KK30NCitwLnRhYmxlIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKy8qIEJlY2F1c2UgdGhlIHRhYmxlIGZyYW1lIGF0dHJpYnV0ZSBpcyBvdmVycmlkZW4gYnkgQ1NTIGluIG1vc3QgYnJvd3NlcnMuICovDQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0idm9pZCJdIHsNCisgIGJvcmRlci1zdHlsZTogbm9uZTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0iaHNpZGVzIl0gew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7DQorICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZzaWRlcyJdIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IG5vbmU7DQorICBib3JkZXItYm90dG9tLXN0eWxlOiBub25lOw0KK30NCisNCisNCisvKg0KKyAqIGh0bWw1IHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK3RhYmxlLnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQordGhlYWQsIHAudGFibGVibG9jay5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2sgew0KKyAgYm9yZGVyLXdpZHRoOiAzcHg7DQorICBib3JkZXItc3BhY2luZzogMHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCisgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7DQorfQ0KK3RoLnRhYmxlYmxvY2ssIHRkLnRhYmxlYmxvY2sgew0KKyAgYm9yZGVyLXdpZHRoOiAxcHg7DQorICBwYWRkaW5nOiA0cHg7DQorICBib3JkZXItc3R5bGU6IHNvbGlkOw0KKyAgYm9yZGVyLWNvbG9yOiAjNTI3YmJkOw0KK30NCisNCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXRvcGJvdCB7DQorICBib3JkZXItbGVmdC1zdHlsZTogaGlkZGVuOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBoaWRkZW47DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtc2lkZXMgew0KKyAgYm9yZGVyLXRvcC1zdHlsZTogaGlkZGVuOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLW5vbmUgew0KKyAgYm9yZGVyLXN0eWxlOiBoaWRkZW47DQorfQ0KKw0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWxlZnQsIHRkLnRhYmxlYmxvY2suaGFsaWduLWxlZnQgew0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tY2VudGVyLCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1jZW50ZXIgew0KKyAgdGV4dC1hbGlnbjogY2VudGVyOw0KK30NCit0aC50YWJsZWJsb2NrLmhhbGlnbi1yaWdodCwgdGQudGFibGVibG9jay5oYWxpZ24tcmlnaHQgew0KKyAgdGV4dC1hbGlnbjogcmlnaHQ7DQorfQ0KKw0KK3RoLnRhYmxlYmxvY2sudmFsaWduLXRvcCwgdGQudGFibGVibG9jay52YWxpZ24tdG9wIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK3RoLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSwgdGQudGFibGVibG9jay52YWxpZ24tbWlkZGxlIHsNCisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQorfQ0KK3RoLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSwgdGQudGFibGVibG9jay52YWxpZ24tYm90dG9tIHsNCisgIHZlcnRpY2FsLWFsaWduOiBib3R0b207DQorfQ0KKw0KKw0KKy8qDQorICogbWFucGFnZSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCitib2R5Lm1hbnBhZ2UgaDEgew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjsNCisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBzaWx2ZXI7DQorfQ0KK2JvZHkubWFucGFnZSBoMiB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2JvZHkubWFucGFnZSBkaXYuc2VjdGlvbmJvZHkgew0KKyAgbWFyZ2luLWxlZnQ6IDNlbTsNCit9DQorDQorQG1lZGlhIHByaW50IHsNCisgIGJvZHkubWFucGFnZSBkaXYjdG9jIHsgZGlzcGxheTogbm9uZTsgfQ0KK30NCisNCisNCis8L3N0eWxlPg0KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCisvKjwhW0NEQVRBWyovDQordmFyIGFzY2lpZG9jID0geyAgLy8gTmFtZXNwYWNlLg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIFRhYmxlIE9mIENvbnRlbnRzIGdlbmVyYXRvcg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qIEF1dGhvcjogTWloYWkgQmF6b24sIFNlcHRlbWJlciAyMDAyDQorICogaHR0cDovL3N0dWRlbnRzLmluZm9pYXNpLnJvL35taXNob28NCisgKg0KKyAqIFRhYmxlIE9mIENvbnRlbnQgZ2VuZXJhdG9yDQorICogVmVyc2lvbjogMC40DQorICoNCisgKiBGZWVsIGZyZWUgdG8gdXNlIHRoaXMgc2NyaXB0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljDQorICogTGljZW5zZSwgYXMgbG9uZyBhcyB5b3UgZG8gbm90IHJlbW92ZSBvciBhbHRlciB0aGlzIG5vdGljZS4NCisgKi8NCisNCisgLyogbW9kaWZpZWQgYnkgVHJveSBELiBIYW5zb24sIFNlcHRlbWJlciAyMDA2LiBMaWNlbnNlOiBHUEwgKi8NCisgLyogbW9kaWZpZWQgYnkgU3R1YXJ0IFJhY2toYW0sIDIwMDYsIDIwMDkuIExpY2Vuc2U6IEdQTCAqLw0KKw0KKy8vIHRvY2xldmVscyA9IDEuLjQuDQordG9jOiBmdW5jdGlvbiAodG9jbGV2ZWxzKSB7DQorDQorICBmdW5jdGlvbiBnZXRUZXh0KGVsKSB7DQorICAgIHZhciB0ZXh0ID0gIiI7DQorICAgIGZvciAodmFyIGkgPSBlbC5maXJzdENoaWxkOyBpICE9IG51bGw7IGkgPSBpLm5leHRTaWJsaW5nKSB7DQorICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykgLy8gSUUgZG9lc24ndCBzcGVhayBjb25zdGFudHMuDQorICAgICAgICB0ZXh0ICs9IGkuZGF0YTsNCisgICAgICBlbHNlIGlmIChpLmZpcnN0Q2hpbGQgIT0gbnVsbCkNCisgICAgICAgIHRleHQgKz0gZ2V0VGV4dChpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gdGV4dDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIFRvY0VudHJ5KGVsLCB0ZXh0LCB0b2NsZXZlbCkgew0KKyAgICB0aGlzLmVsZW1lbnQgPSBlbDsNCisgICAgdGhpcy50ZXh0ID0gdGV4dDsNCisgICAgdGhpcy50b2NsZXZlbCA9IHRvY2xldmVsOw0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gdG9jRW50cmllcyhlbCwgdG9jbGV2ZWxzKSB7DQorICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk7DQorICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1toSF0oWzEtJysodG9jbGV2ZWxzKzEpKyddKScpOw0KKyAgICAvLyBGdW5jdGlvbiB0aGF0IHNjYW5zIHRoZSBET00gdHJlZSBmb3IgaGVhZGVyIGVsZW1lbnRzICh0aGUgRE9NMg0KKyAgICAvLyBub2RlSXRlcmF0b3IgQVBJIHdvdWxkIGJlIGEgYmV0dGVyIHRlY2huaXF1ZSBidXQgbm90IHN1cHBvcnRlZCBieSBhbGwNCisgICAgLy8gYnJvd3NlcnMpLg0KKyAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uIChlbCkgew0KKyAgICAgIGZvciAodmFyIGkgPSBlbC5maXJzdENoaWxkOyBpICE9IG51bGw7IGkgPSBpLm5leHRTaWJsaW5nKSB7DQorICAgICAgICBpZiAoaS5ub2RlVHlwZSA9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7DQorICAgICAgICAgIHZhciBtbyA9IHJlLmV4ZWMoaS50YWdOYW1lKTsNCisgICAgICAgICAgaWYgKG1vICYmIChpLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSB8fCBpLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIikpICE9ICJmbG9hdCIpIHsNCisgICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBuZXcgVG9jRW50cnkoaSwgZ2V0VGV4dChpKSwgbW9bMV0tMSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaXRlcmF0ZShpKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgaXRlcmF0ZShlbCk7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorDQorICB2YXIgdG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvYyIpOw0KKyAgaWYgKCF0b2MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgLy8gRGVsZXRlIGV4aXN0aW5nIFRPQyBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBUT0MuDQorICB2YXIgdG9jRW50cmllc1RvUmVtb3ZlID0gW107DQorICB2YXIgaTsNCisgIGZvciAoaSA9IDA7IGkgPCB0b2MuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgew0KKyAgICB2YXIgZW50cnkgPSB0b2MuY2hpbGROb2Rlc1tpXTsNCisgICAgaWYgKGVudHJ5Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2RpdicNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKQ0KKyAgICAgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLm1hdGNoKC9edG9jbGV2ZWwvKSkNCisgICAgICB0b2NFbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jRW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIHRvYy5yZW1vdmVDaGlsZCh0b2NFbnRyaWVzVG9SZW1vdmVbaV0pOw0KKyAgfQ0KKw0KKyAgLy8gUmVidWlsZCBUT0MgZW50cmllcy4NCisgIHZhciBlbnRyaWVzID0gdG9jRW50cmllcyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGVudCIpLCB0b2NsZXZlbHMpOw0KKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7DQorICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaV07DQorICAgIGlmIChlbnRyeS5lbGVtZW50LmlkID09ICIiKQ0KKyAgICAgIGVudHJ5LmVsZW1lbnQuaWQgPSAiX3RvY18iICsgaTsNCisgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7DQorICAgIGEuaHJlZiA9ICIjIiArIGVudHJ5LmVsZW1lbnQuaWQ7DQorICAgIGEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZW50cnkudGV4dCkpOw0KKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQorICAgIGRpdi5hcHBlbmRDaGlsZChhKTsNCisgICAgZGl2LmNsYXNzTmFtZSA9ICJ0b2NsZXZlbCIgKyBlbnRyeS50b2NsZXZlbDsNCisgICAgdG9jLmFwcGVuZENoaWxkKGRpdik7DQorICB9DQorICBpZiAoZW50cmllcy5sZW5ndGggPT0gMCkNCisgICAgdG9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9jKTsNCit9LA0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEZvb3Rub3RlcyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBCYXNlZCBvbiBmb290bm90ZSBnZW5lcmF0aW9uIGNvZGUgZnJvbToNCisgKiBodHRwOi8vd3d3LmJyYW5kc3BhbmtpbmduZXcubmV0L2FyY2hpdmUvMjAwNS8wNy9mb3JtYXRfZm9vdG5vdGUuaHRtbA0KKyAqLw0KKw0KK2Zvb3Rub3RlczogZnVuY3Rpb24gKCkgew0KKyAgLy8gRGVsZXRlIGV4aXN0aW5nIGZvb3Rub3RlIGVudHJpZXMgaW4gY2FzZSB3ZSdyZSByZWxvYWRpbmcgdGhlIGZvb3Rub2Rlcy4NCisgIHZhciBpOw0KKyAgdmFyIG5vdGVob2xkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9vdG5vdGVzIik7DQorICBpZiAoIW5vdGVob2xkZXIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgdmFyIGVudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgZm9yIChpID0gMDsgaSA8IG5vdGVob2xkZXIuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgew0KKyAgICB2YXIgZW50cnkgPSBub3RlaG9sZGVyLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSA9PSAiZm9vdG5vdGUiKQ0KKyAgICAgIGVudHJpZXNUb1JlbW92ZS5wdXNoKGVudHJ5KTsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCisgICAgbm90ZWhvbGRlci5yZW1vdmVDaGlsZChlbnRyaWVzVG9SZW1vdmVbaV0pOw0KKyAgfQ0KKw0KKyAgLy8gUmVidWlsZCBmb290bm90ZSBlbnRyaWVzLg0KKyAgdmFyIGNvbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGVudCIpOw0KKyAgdmFyIHNwYW5zID0gY29udC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KKyAgdmFyIHJlZnMgPSB7fTsNCisgIHZhciBuID0gMDsNCisgIGZvciAoaT0wOyBpPHNwYW5zLmxlbmd0aDsgaSsrKSB7DQorICAgIGlmIChzcGFuc1tpXS5jbGFzc05hbWUgPT0gImZvb3Rub3RlIikgew0KKyAgICAgIG4rKzsNCisgICAgICB2YXIgbm90ZSA9IHNwYW5zW2ldLmdldEF0dHJpYnV0ZSgiZGF0YS1ub3RlIik7DQorICAgICAgaWYgKCFub3RlKSB7DQorICAgICAgICAvLyBVc2UgW1xzXFNdIGluIHBsYWNlIG9mIC4gc28gbXVsdGktbGluZSBtYXRjaGVzIHdvcmsuDQorICAgICAgICAvLyBCZWNhdXNlIEphdmFTY3JpcHQgaGFzIG5vIHMgKGRvdGFsbCkgcmVnZXggZmxhZy4NCisgICAgICAgIG5vdGUgPSBzcGFuc1tpXS5pbm5lckhUTUwubWF0Y2goL1xzKlxbKFtcc1xTXSopXVxzKi8pWzFdOw0KKyAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0NCisgICAgICAgICAgIls8YSBpZD0nX2Zvb3Rub3RlcmVmXyIgKyBuICsgIicgaHJlZj0nI19mb290bm90ZV8iICsgbiArDQorICAgICAgICAgICInIHRpdGxlPSdWaWV3IGZvb3Rub3RlJyBjbGFzcz0nZm9vdG5vdGUnPiIgKyBuICsgIjwvYT5dIjsNCisgICAgICAgIHNwYW5zW2ldLnNldEF0dHJpYnV0ZSgiZGF0YS1ub3RlIiwgbm90ZSk7DQorICAgICAgfQ0KKyAgICAgIG5vdGVob2xkZXIuaW5uZXJIVE1MICs9DQorICAgICAgICAiPGRpdiBjbGFzcz0nZm9vdG5vdGUnIGlkPSdfZm9vdG5vdGVfIiArIG4gKyAiJz4iICsNCisgICAgICAgICI8YSBocmVmPScjX2Zvb3Rub3RlcmVmXyIgKyBuICsgIicgdGl0bGU9J1JldHVybiB0byB0ZXh0Jz4iICsNCisgICAgICAgIG4gKyAiPC9hPi4gIiArIG5vdGUgKyAiPC9kaXY+IjsNCisgICAgICB2YXIgaWQgPXNwYW5zW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsNCisgICAgICBpZiAoaWQgIT0gbnVsbCkgcmVmc1siIyIraWRdID0gbjsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG4gPT0gMCkNCisgICAgbm90ZWhvbGRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vdGVob2xkZXIpOw0KKyAgZWxzZSB7DQorICAgIC8vIFByb2Nlc3MgZm9vdG5vdGVyZWZzLg0KKyAgICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICAgIGlmIChzcGFuc1tpXS5jbGFzc05hbWUgPT0gImZvb3Rub3RlcmVmIikgew0KKyAgICAgICAgdmFyIGhyZWYgPSBzcGFuc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLmdldEF0dHJpYnV0ZSgiaHJlZiIpOw0KKyAgICAgICAgaHJlZiA9IGhyZWYubWF0Y2goLyMuKi8pWzBdOyAgLy8gQmVjYXVzZSBJRSByZXR1cm4gZnVsbCBVUkwuDQorICAgICAgICBuID0gcmVmc1tocmVmXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaHJlZj0nI19mb290bm90ZV8iICsgbiArDQorICAgICAgICAgICInIHRpdGxlPSdWaWV3IGZvb3Rub3RlJyBjbGFzcz0nZm9vdG5vdGUnPiIgKyBuICsgIjwvYT5dIjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9LA0KKw0KK2luc3RhbGw6IGZ1bmN0aW9uKHRvY2xldmVscykgew0KKyAgdmFyIHRpbWVySWQ7DQorDQorICBmdW5jdGlvbiByZWluc3RhbGwoKSB7DQorICAgIGFzY2lpZG9jLmZvb3Rub3RlcygpOw0KKyAgICBpZiAodG9jbGV2ZWxzKSB7DQorICAgICAgYXNjaWlkb2MudG9jKHRvY2xldmVscyk7DQorICAgIH0NCisgIH0NCisNCisgIGZ1bmN0aW9uIHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyKCkgew0KKyAgICBjbGVhckludGVydmFsKHRpbWVySWQpOw0KKyAgICByZWluc3RhbGwoKTsNCisgIH0NCisNCisgIHRpbWVySWQgPSBzZXRJbnRlcnZhbChyZWluc3RhbGwsIDUwMCk7DQorICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikNCisgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyLCBmYWxzZSk7DQorICBlbHNlDQorICAgIHdpbmRvdy5vbmxvYWQgPSByZWluc3RhbGxBbmRSZW1vdmVUaW1lcjsNCit9DQorDQorfQ0KK2FzY2lpZG9jLmluc3RhbGwoKTsNCisvKl1dPiovDQorPC9zY3JpcHQ+DQorPC9oZWFkPg0KKzxib2R5IGNsYXNzPSJtYW5wYWdlIj4NCis8ZGl2IGlkPSJoZWFkZXIiPg0KKzxoMT4NCitzeXNsaW51eC5jZmcoNSkgTWFudWFsIFBhZ2UNCis8L2gxPg0KKzxoMj5OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPHA+c3lzbGludXguY2ZnIC0NCisgICAqU3lzbGludXgqIGNvbmZpZ3VyYXRpb24gZmlsZQ0KKzwvcD4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJjb250ZW50Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZGVzY3JpcHRpb24iPkRFU0NSSVBUSU9OPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Db25maWd1cmF0aW9uIGZvciB0aGUgYm9vdCBiZWhhdmlvciBhbmQgdXNlciBleHBlcmllbmNlIG9mIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4NCitib290IGxvYWRlcnMsIHRoZSBmb3JtYXQgb2YgZGlzcGxheSBmaWxlcyBhbmQgdGhlIGJvb3QgcHJvbXB0IGJlaGF2aW9yLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIG5vdCBjb21wbGV0ZWx5IGRlY29kZWQuICBTeW50YXgNCitkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGRlc2NyaWJlZCBhYm92ZSBtYXkgc3RpbGwgd29yayBjb3JyZWN0bHkgaW4gdGhpcw0KK3ZlcnNpb24gb2YgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiwgYnV0IG1heSBicmVhayBpbiBhIGZ1dHVyZSBvbmUuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9sb2NhdGlvbl9uYW1lIj5MT0NBVElPTi9OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IChiZWZvcmUgNC4wMCkgdXNlZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlbmFtZSBvZg0KK3N5c2xpbnV4LmNmZy4gIDxzdHJvbmc+RVhUTElOVVg8L3N0cm9uZz4gKG1lcmdlZCBpbnRvIDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gYXMgb2YgNC4wMCkgdXNlZCB0aGUNCitmaWxlbmFtZSBleHRsaW51eC5jb25mLiAgQm90aCBkZWZhdWx0IHRvIHNlYXJjaGluZyBmb3IgdGhlIGNvbmZpZyBmaWxlDQoraW4gdGhlIGluc3RhbGxlZCBkaXJlY3RvcnkgKGNvbnRhaW5pbmcgbGRsaW51eC5zeXMvZXh0bGludXguc3lzKS4gIEFzIG9mDQorNC4wMCwgPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiB3aWxsIHNlYXJjaCBmb3IgZXh0bGludXguY29uZiB0aGVuIHN5c2xpbnV4LmNmZyBpbiBlYWNoDQorZGlyZWN0b3J5IGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdGhlIG5leHQgZGlyZWN0b3J5LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkFzIG9mIDMuMzUsIDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gYWxzbyBzZWFyY2hlcyAvYm9vdC9zeXNsaW51eCwgL3N5c2xpbnV4IGFuZCAvLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gKGJlZm9yZSA0LjAyKSB1c2VkIHRoZSBjb25maWd1cmF0aW9uIGZpbGVuYW1lIG9mDQoraXNvbGludXguY2ZnLCBzZWFyY2hpbmcgIC9ib290L2lzb2xpbnV4IChzdGFydGluZyAyLjAwKSwgdGhlbiAvaXNvbGludXgNCithbmQgLy4gIEFzIG9mIDQuMDIsIDxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gd2lsbCBzZWFyY2ggZm9yIGlzb2xpbnV4LmNmZyB0aGVuDQorc3lzbGludXguY2ZnIGluIC9ib290L2lzb2xpbnV4IGJlZm9yZSBzZWFyY2hpbmcgZm9yIHRoZSBzYW1lIGZpbGVzIGluDQorL2lzb2xpbnV4LCAvYm9vdC9zeXNsaW51eCwgL3N5c2xpbnV4LCBhbmQgLy48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2dsb2JhbF9kaXJlY3RpdmVzX21haW4iPkdMT0JBTCBESVJFQ1RJVkVTIC0gTUFJTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiM8L3N0cm9uZz4gY29tbWVudA0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0EgbGluZSBjb21tZW50LiAgQXMgb2YgdmVyc2lvbiAzLjEwLCB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgPHN0cm9uZz4jPC9zdHJvbmc+IGFuZCB0aGUNCitjb21tZW50IGlzIG5vIGxvbmdlciByZXF1aXJlZC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+TUVOVTwvc3Ryb25nPiBhbnkgc3RyaW5nDQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDMuMDArKSBBIGRpcmVjdGl2ZSBmb3IgdGhlIHNpbXBsZSBtZW51IHN5c3RlbSwgdHJlYXRlZCBhcyBhIGNvbW1lbnQNCitvdXRzaWRlIHRoZSBtZW51LiAgU2VlIG1lbnUudHh0Lg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5JTkNMVURFPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYW5vdGhlciBmaWxlIGF0IHRoaXMgcG9pbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24NCitmaWxlLiBGaWxlcyBjYW4gY3VycmVudGx5IGJlIG5lc3RlZCB1cCB0byAxNiBsZXZlbHMgZGVlcCwgYnV0IGl0IGlzIG5vdA0KK2d1YXJhbnRlZWQgdGhhdCBtb3JlIHRoYW4gOCBsZXZlbHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+REVGQVVMVDwvc3Ryb25nPiA8ZW0+a2VybmVsPC9lbT4gPGVtPm9wdGlvbnMmIzgyMzA7PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitTZXRzIHRoZSBkZWZhdWx0IGNvbW1hbmQgbGluZSAod2hpY2ggb2Z0ZW4gcmVmZXJlbmNlcyBhIExBQkVMKS4gIElmDQorPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBib290cyBhdXRvbWF0aWNhbGx5LCBpdCB3aWxsIGFjdCBqdXN0IGFzIGlmIHRoZSBlbnRyaWVzIGFmdGVyDQorPHN0cm9uZz5ERUZBVUxUPC9zdHJvbmc+IGhhZCBiZWVuIHR5cGVkIGluIGF0IHRoZSA8ZW0+Ym9vdDo8L2VtPiBwcm9tcHQuICBNdWx0aXBsZSB1c2VzIHdpbGwNCityZXN1bHQgaW4gYW4gb3ZlcnJpZGUuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgbm8gY29uZmlndXJhdGlvbiBmaWxlIGlzIHByZXNlbnQsIG9yIG5vIDxzdHJvbmc+REVGQVVMVDwvc3Ryb25nPiBvciA8c3Ryb25nPlVJPC9zdHJvbmc+IGVudHJ5IGlzDQorcHJlc2VudCBpbiB0aGUgY29uZmlnIGZpbGUsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGFuZCB0aGUNCis8ZW0+Ym9vdDo8L2VtPiBwcm9tcHQgaXMgc2hvd24gKDMuODUrKS48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+VUk8L3N0cm9uZz4gPGVtPm1vZHVsZTwvZW0+IDxlbT5vcHRpb25zJiM4MjMwOzwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorU2VsZWN0cyBhIHNwZWNpZmljIHVzZXIgaW50ZXJmYWNlIDxlbT5tb2R1bGU8L2VtPiAodHlwaWNhbGx5IG1lbnUuYzMyIG9yDQordmVzYW1lbnUuYzMyKS4gIFRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHRyZWF0cyB0aGlzIGFzIGEgZGlyZWN0aXZlDQordGhhdCBvdmVycmlkZXMgdGhlIDxzdHJvbmc+REVGQVVMVDwvc3Ryb25nPiBkaXJlY3RpdmUgdG8gbG9hZCB0aGlzIG1vZHVsZSBpbnN0ZWFkIGF0DQorc3RhcnR1cCwgZm9yIGFuIGVtcHR5IGNvbW1hbmQgbGluZSBhbmQgYXQgdGltZW91dCBhbmQgPHN0cm9uZz5QUk9NUFQ8L3N0cm9uZz4gZGlyZWN0aXZlDQordG8gbm90IHByb21wdCAoYnV0IHRoZXNlIGRpcmVjdGl2ZXMgbWF5IGhhdmUgZWZmZWN0cyBvbiBvdGhlcg0KK2NvbmZpZ3VyYXRpb24gcGFyc2VycykuICBNdWx0aXBsZSB1c2VzIHdpbGwgcmVzdWx0IGluIGFuIG92ZXJyaWRlLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5MQUJFTDwvc3Ryb25nPiA8ZW0+bXlsYWJlbDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorQmVnaW4gYSBuZXcgPHN0cm9uZz5MQUJFTDwvc3Ryb25nPiBjbGF1c2UuICBJZiA8ZW0+bXlsYWJlbDwvZW0+IGlzIGVudGVyZWQgYXMgdGhlIGtlcm5lbCB0bw0KK2Jvb3QsIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gc2hvdWxkIGluc3RlYWQgYm9vdCAiaW1hZ2UiIChzcGVjaWZpZWQgYnkgYSBkaXJlY3RpdmUNCitmcm9tIDxzdHJvbmc+S0VSTkVMLUxJS0UgRElSRUNUSVZFUzwvc3Ryb25nPikgd2l0aCBhbnkgc3BlY2lmaWVkIDxzdHJvbmc+RFVBTC1QVVJQT1NFDQorRElSRUNUSVZFUzwvc3Ryb25nPiBiZWluZyB1c2VkIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBpbnN0YW5jZS4NCis8L3A+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48ZW0+bXlsYWJlbDwvZW0+IG11c3QgYmUgdW5pcXVlLiAgQ3VycmVudGx5IHRoZSBmaXJzdCBpbnN0YW5jZSBpcyB1c2VkIGJ1dCBtYXkNCityZXN1bHQgaW4gYW4gZXJyb3Igb3IgdW5kZXNpcmVkIGJlaGF2aW9yLiAgPGVtPm15bGFiZWw8L2VtPiBlbmRzIGF0IHRoZSBmaXJzdA0KK2NoYXJhY3RlciB0aGF0IGlzIG5vdCBhIG5vbi13aGl0ZS1zcGFjZSBwcmludGFibGUgY2hhcmFjdGVyIGFuZCBzaG91bGQNCitiZSByZXN0cmljdGVkIHRvIG5vbi13aGl0ZS1zcGFjZSB0eXBlYWJsZSBjaGFyYWN0ZXJzLiAgUHJpb3IgdG8gdmVyc2lvbg0KKzMuMzIsIHRoaXMgd291bGQgdHJhbnNmb3JtZWQgdG8gYSBET1MgY29tcGF0aWJsZSBmb3JtYXQgb2YgOC4zIHdpdGggYQ0KK3Jlc3RyaWN0ZWQgY2hhcmFjdGVyIHNldC4gIEEgPHN0cm9uZz5MQUJFTDwvc3Ryb25nPiBjbGF1c2UgbXVzdCBjb250YWluIGV4YWN0bHkgMSBvZg0KK3RoZSA8c3Ryb25nPktFUk5FTC1MSUtFIERJUkVDVElWRVM8L3N0cm9uZz4gYW5kIG1heSBjb250YWluIDEgZWFjaCBvZiB0aGUgPHN0cm9uZz5MQUJFTC1PTkxZDQorRElSRUNUSVZFUzwvc3Ryb25nPiBvciA8c3Ryb25nPkRVQUwtUFVSUE9TRSBESVJFQ1RJVkVTPC9zdHJvbmc+LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPldpdGhpbiBhIDxzdHJvbmc+TEFCRUw8L3N0cm9uZz4sIHVzaW5nIG11bHRpcGxlIDxzdHJvbmc+S0VSTkVMLUxJS0UgRElSRUNUSVZFUzwvc3Ryb25nPiBvciByZXVzZSBvZg0KKzxzdHJvbmc+TEFCRUwtT05MWSBESVJFQ1RJVkVTPC9zdHJvbmc+IG9yIDxzdHJvbmc+RFVBTC1QVVJQT1NFIERJUkVDVElWRVM8L3N0cm9uZz4gd2lsbCByZXN1bHQgaW4gYW4NCitvdmVycmlkZS4gIE90aGVyd2lzZSwgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGRpcmVjdGl2ZSB3aWxsDQorcmVzdWx0IGluIHRoZSBsYXN0IGJlaW5nIGVmZmVjdGl2ZS48L3A+PC9kaXY+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9kdWFsX3B1cnBvc2VfZGlyZWN0aXZlcyI+RFVBTC1QVVJQT1NFIERJUkVDVElWRVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlVzZSBvZiBhbnkgb2YgdGhlIDxzdHJvbmc+RFVBTC1QVVJQT1NFIERJUkVDVElWRVM8L3N0cm9uZz4gYXMgPHN0cm9uZz5HTE9CQUwgRElSRUNUSVZFUzwvc3Ryb25nPiBpcw0KK2Rpc2NvdXJhZ2VkIGlmIHRoZXJlIHdpbGwgYmUgYW55IG5vbi1MaW51eCBpbWFnZXMgbG9hZGVkIGFzIDxzdHJvbmc+QUxMPC9zdHJvbmc+IGltYWdlcw0KK3dpbGwgZ2V0IHRoZXNlLCBpbmNsdWRpbmcgdGhvc2UgbWFudWFsbHkgZW50ZXJlZCBhdCB0aGUgPGVtPmJvb3Q6PC9lbT4gcHJvbXB0LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4gPGVtPm9wdGlvbnMmIzgyMzA7PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitBZGQgb25lIG9yIG1vcmUgb3B0aW9ucyB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4gIFRoZXNlIGFyZSBhZGRlZA0KK2JvdGggZm9yIGF1dG9tYXRpYyBhbmQgbWFudWFsIGJvb3RzLiAgVGhlIG9wdGlvbnMgYXJlIGFkZGVkIGF0IHRoZSB2ZXJ5DQorYmVnaW5uaW5nIG9mIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLCB1c3VhbGx5IHBlcm1pdHRpbmcgZXhwbGljaXRseQ0KK2VudGVyZWQga2VybmVsIG9wdGlvbnMgdG8gb3ZlcnJpZGUgdGhlbS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlDQorTElMTyAiYXBwZW5kIiBvcHRpb24uDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VXNlIG9mIHRoZSBwYXJhbWV0ZXIgPGVtPmluaXRyZD08L2VtPiBzdXBwb3J0cyBtdWx0aXBsZSBmaWxlbmFtZXMgc2VwYXJhdGVkIGJ5DQorY29tbWFzIChpZSA8ZW0+aW5pdHJkPWluaXRyZF9maWxlMSxpbml0cmRfZmlsZTI8L2VtPikgd2l0aGluIGEgc2luZ2xlIGluc3RhbmNlLg0KK1RoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgaW5pdHJhbWZzLCB3aGljaCBjYW4gYmUgY29tcG9zZWQgb2YgbXVsdGlwbGUNCitzZXBhcmF0ZSBjcGlvIG9yIGNwaW8uZ3ogYXJjaGl2ZXMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Tm90ZTogYWxsIGluaXRyZCBmaWxlcyBleGNlcHQgdGhlIGxhc3Qgb25lIGFyZSB6ZXJvLXBhZGRlZCB0byBhIDRLIHBhZ2UNCitib3VuZGFyeS4gIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgaW5pdHJhbWZzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGU6IE9ubHkgdGhlIGxhc3QgZWZmZWN0aXZlIDxlbT5pbml0cmQ9PC9lbT4gcGFyYW1ldGVyIGlzIHVzZWQgZm9yIGxvYWRpbmcNCitpbml0cmQgZmlsZXMuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkFQUEVORDwvc3Ryb25nPiAtDQorPC9kdD4NCis8ZGQ+DQorPHA+DQorQXBwZW5kIG5vdGhpbmcuICA8c3Ryb25nPkFQUEVORDwvc3Ryb25nPiB3aXRoIGEgc2luZ2xlIGh5cGhlbiBhcyBhcmd1bWVudCBpbiBhIDxzdHJvbmc+TEFCRUw8L3N0cm9uZz4NCitzZWN0aW9uIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIGEgZ2xvYmFsIDxzdHJvbmc+QVBQRU5EPC9zdHJvbmc+Lg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+U1lTQVBQRU5EPC9zdHJvbmc+IDxlbT5iaXRtYXNrPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5JUEFQUEVORDwvc3Ryb25nPiA8ZW0+Yml0bWFzazwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDxzdHJvbmc+U1lTQVBQRU5EPC9zdHJvbmc+OiA1LjEwKzsgPHN0cm9uZz5JUEFQUEVORDwvc3Ryb25nPjogPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiBvbmx5KQ0KK1RoZSA8c3Ryb25nPlNZU0FQUEVORDwvc3Ryb25nPiBvcHRpb24gd2FzIGludHJvZHVjZWQgaW4gPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiA1LjEwOyBpdCBpcyBhbg0KK2VuaGFuY2VtZW50IG9mIGEgcHJldmlvdXMgb3B0aW9uIDxzdHJvbmc+SVBBUFBFTkQ8L3N0cm9uZz4gd2hpY2ggd2FzIG9ubHkgYXZhaWxhYmxlIG9uDQorPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPi4gIDxlbT5iaXRtYXNrPC9lbT4gaXMgaW50ZXJwcmV0ZWQgYXMgZGVjaW1hbCBmb3JtYXQgdW5sZXNzIHByZWZpeGVkDQord2l0aCAiMHgiIGZvciBoZXhhZGVjaW1hbCBvciAiMCIgKHplcm8pIGZvciBvY3RhbC4gIFRoZSA8ZW0+Yml0bWFzazwvZW0+IGlzIGFuDQorT1IgKHN1bSkgb2YgdGhlIGZvbGxvd2luZyBpbnRlZ2VyIG9wdGlvbnM6DQorPC9wPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPjE8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitBbiBvcHRpb24gb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCwgYmFzZWQgb24NCit0aGUgaW5wdXQgZnJvbSB0aGUgREhDUC9CT09UUCBvciBQWEUgYm9vdCBzZXJ2ZXIgYW5kIGFkZGVkIHRvIHRoZSBrZXJuZWwNCitjb21tYW5kIGxpbmUoc2VlIG5vdGUgYmVsb3c7IGVtcHR5IGZvciBub24tUFhFTElOVVggdmFyaWFudHMpOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+aXA9Jmx0O2NsaWVudC1pcCZndDs6Jmx0O2Jvb3Qtc2VydmVyLWlwJmd0OzombHQ7Z3ctaXAmZ3Q7OiZsdDtuZXRtYXNrJmd0OzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJhZG1vbml0aW9uYmxvY2siPg0KKzx0YWJsZT48dHI+DQorPHRkIGNsYXNzPSJpY29uIj4NCis8ZGl2IGNsYXNzPSJ0aXRsZSI+Tm90ZTwvZGl2Pg0KKzwvdGQ+DQorPHRkIGNsYXNzPSJjb250ZW50Ij5UaGUgdXNlIG9mIG9wdGlvbiAxIGlzIG5vIHN1YnN0aXR1dGUgZm9yIHJ1bm5pbmcgYSBESENQIGNsaWVudCBpbg0KK3RoZSBib290ZWQgc3lzdGVtIGFuZCBzaG91bGQgaW5zdGVhZCBvbmx5IGJlIHVzZWQgdG8gc2VlZCB0aGUgY2xpZW50IGZvcg0KK2EgcmVxdWVzdC4gIFdpdGhvdXQgcmVndWxhciByZW5ld2FscywgdGhlIGxlYXNlIGFjcXVpcmVkIGJ5IHRoZSBQWEUgQklPUw0KK3dpbGwgZXhwaXJlLCBtYWtpbmcgdGhlIElQIGFkZHJlc3MgYXZhaWxhYmxlIGZvciByZXVzZSBieSB0aGUgREhDUA0KK3NlcnZlci48L3RkPg0KKzwvdHI+PC90YWJsZT4NCis8L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4yPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorQW4gb3B0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0IHNob3VsZCBiZSBnZW5lcmF0ZWQsIGluDQorZGFzaC1zZXBhcmF0ZWQgaGV4YWRlY2ltYWwgd2l0aCBsZWFkaW5nIGhhcmR3YXJlIHR5cGUgKHNhbWUgYXMgZm9yIHRoZQ0KK2NvbmZpZ3VyYXRpb24gZmlsZTsgc2VlIHB4ZWxpbnV4LnR4dC4pIGFuZCBhZGRlZCB0byB0aGUga2VybmVsIGNvbW1hbmQNCitsaW5lLCBhbGxvd2luZyBhbiBpbml0cmQgcHJvZ3JhbSB0byBkZXRlcm1pbmUgZnJvbSB3aGljaCBpbnRlcmZhY2UgdGhlDQorc3lzdGVtIGJvb3RlZChlbXB0eSBmb3Igbm9uLVBYRUxJTlVYIHZhcmlhbnRzKToNCis8L3A+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPkJPT1RJRj0mbHQ7aGFyZHdhcmUtYWRkcmVzcy1vZi1ib290LWludGVyZmFjZSZndDs8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+NDwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0FuIG9wdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdCBzaG91bGQgYmUgZ2VuZXJhdGVkLCBpbiBsb3dlcg0KK2Nhc2UgaGV4YWRlY2ltYWwgaW4gdGhlIGZvcm1hdCBub3JtYWxseSB1c2VkIGZvciBVVUlEcyAoc2FtZSBhcyBmb3IgdGhlDQorY29uZmlndXJhdGlvbiBmaWxlOyBzZWUgcHhlbGludXgudHh0LikgYW5kIGFkZGVkIHRvIHRoZSBrZXJuZWwgY29tbWFuZA0KK2xpbmU6DQorPC9wPg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5TWVNVVUlEPSZsdDtzeXN0ZW0gdXVpZCZndDs8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+ODwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyg1LjEwKykgaW5kaWNhdGUgdGhlIENQVSBmYW1pbHkgYW5kIGNlcnRhaW4gcGFydGljdWxhcmx5DQorc2lnbmlmaWNhbnQgQ1BVIGZlYXR1cmUgYml0czoNCis8L3A+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPkNQVT0mbHQ7ZmFtaWx5Jmd0OyZsdDtmZWF0dXJlcyZndDs8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgJmx0O2ZhbWlseSZndDsgaXMgYSBzaW5nbGUgZGlnaXQgZnJvbSAzIChpMzg2KSB0byA2IChpNjg2IG9yIGhpZ2hlci4pICBUaGUNCitmb2xsb3dpbmcgQ1BVIGZlYXR1cmVzIGFyZSBjdXJyZW50bHkgcmVwb3J0ZWQ7IGFkZGl0aW9uYWwgZmxhZ3MgbWF5IGJlDQorYWRkZWQgaW4gdGhlIGZ1dHVyZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPlAgICAgICAgUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24gKFBBRSkNCitWICAgICAgIEludGVsIFZpcnR1YWxpemF0aW9uIFRlY2hub2xvZ3kgKFZUL1ZNWCkNCitUICAgICAgIEludGVsIFRydXN0ZWQgRXhlY3Rpb24gVGVjaG5vbG9neSAoVFhUL1NNWCkNCitYICAgICAgIEV4ZWN1dGlvbiBEaXNhYmxlIChYRC9OWCkNCitMICAgICAgIExvbmcgTW9kZSAoeDg2LTY0KQ0KK1MgICAgICAgQU1EIFNNWCB2aXJ0dWFsaXphdGlvbjwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5ETUk8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoNS4xMCspIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgZGVyaXZlZCBmcm9tIERNSS9TTUJJT1MNCitpbmZvcm1hdGlvbiBpZiBhdmFpbGFibGU6DQorPC9wPg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5CaXQgICAgIFN0cmluZyAgICAgICAgICBTaWduaWZpY2FuY2UNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorMHgwMDAxMCBTWVNWRU5ET1I9ICAgICAgU3lzdGVtIHZlbmRvciBuYW1lDQorMHgwMDAyMCBTWVNQUk9EVUNUPSAgICAgU3lzdGVtIHByb2R1Y3QgbmFtZQ0KKzB4MDAwNDAgU1lTVkVSU0lPTj0gICAgIFN5c3RlbSB2ZXJzaW9uDQorMHgwMDA4MCBTWVNTRVJJQUw9ICAgICAgU3lzdGVtIHNlcmlhbCBudW1iZXINCisweDAwMTAwIFNZU1NLVT0gICAgICAgICBTeXN0ZW0gU0tVDQorMHgwMDIwMCBTWVNGQU1JTFk9ICAgICAgU3lzdGVtIGZhbWlseQ0KKzB4MDA0MDAgTUJWRU5ET1I9ICAgICAgIE1vdGhlcmJvYXJkIHZlbmRvciBuYW1lDQorMHgwMDgwMCBNQlZFUlNJT049ICAgICAgTW90aGVyYm9hcmQgdmVyc2lvbg0KKzB4MDEwMDAgTUJTRVJJQUw9ICAgICAgIE1vdGhlcmJvYXJkIHNlcmlhbCBudW1iZXINCisweDAyMDAwIE1CQVNTRVQ9ICAgICAgICBNb3RoZXJib2FyZCBhc3NldCB0YWcNCisweDA0MDAwIEJJT1NWRU5ET1I9ICAgICBCSU9TIHZlbmRvciBuYW1lDQorMHgwODAwMCBCSU9TVkVSU0lPTj0gICAgQklPUyB2ZXJzaW9uDQorMHgxMDAwMCBTWVNGRj0gICAgICAgICAgU3lzdGVtIGZvcm0gZmFjdG9yPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgdGhlc2Ugc3RyaW5ncyBjb250YWluIHdoaXRlLXNwYWNlIGNoYXJhY3RlcnMsIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGgNCit1bmRlcnNjb3JlcyAoXykuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIHN5c3RlbSBmb3JtIGZhY3RvciB2YWx1ZSBpcyBhIG51bWJlciBkZWZpbmVkIGluIHRoZSBTTUJJT1MNCitzcGVjaWZpY2F0aW9uLCBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5kbXRmLm9yZy8iPmh0dHA6Ly93d3cuZG10Zi5vcmcvPC9hPi4gIEFzIG9mIHZlcnNpb24gMi43LjENCitvZiB0aGUgc3BlY2lmaWNhdGlvbiwgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGRlZmluZWQ6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4gMSAgICAgT3RoZXINCisgMiAgICAgVW5rbm93bg0KKyAzICAgICBEZXNrdG9wDQorIDQgICAgIExvdyBwcm9maWxlIGRlc2t0b3ANCisgNSAgICAgUGl6emEgYm94DQorIDYgICAgIE1pbmkgdG93ZXINCisgNyAgICAgVG93ZXINCisgOCAgICAgUG9ydGJsZQ0KKyA5ICAgICBMYXB0b3ANCisxMCAgICAgTm90ZWJvb2sNCisxMSAgICAgSGFuZGhlbGQNCisxMiAgICAgRG9ja2luZyBzdGF0aW9uDQorMTMgICAgIEFsbC1pbi1vbmUNCisxNCAgICAgU3Vibm90ZWJvb2sNCisxNSAgICAgU3BhY2Utc2F2aW5nDQorMTYgICAgIEx1bmNoIGJveA0KKzE3ICAgICBNYWluIHNlcnZlciBjaGFzc2lzDQorMTggICAgIEV4cGFuc2lvbiBjaGFzc2lzDQorMTkgICAgIFN1YmNoYXNzaXMNCisyMCAgICAgQnVzIGV4cGFuc2lvbiBjaGFzc2lzDQorMjEgICAgIFBlcmlwaGVyYWwgY2hhc3Npcw0KKzIyICAgICBSQUlEIGNoYXNzaXMNCisyMyAgICAgUmFjayBtb3VudCBjaGFzc3MNCisyNCAgICAgU2VhbGVkLWNhc2UgUEMNCisyNSAgICAgTXVsdGktc3lzdGVtIGNoYXNzaXMNCisyNiAgICAgQ29tcGFjdCBQQ0kNCisyNyAgICAgQWR2YW5jZWQgVENJDQorMjggICAgIEJsYWRlDQorMjkgICAgIEJsYWRlIGVuY2xvc3VyZTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9rZXJuZWxfbGlrZV9kaXJlY3RpdmVzIj5LRVJORUwtTElLRSBESVJFQ1RJVkVTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+S0VSTkVMPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorTG9hZCBhIGtlcm5lbC1saWtlIGZpbGUgPGVtPmltYWdlPC9lbT4gd2l0aCBhdXRvbWF0aWMgZmlsZXR5cGUgZGV0ZWN0aW9uIGJhc2VkDQorb24gZmlsZSBleHRlbnNpb24sIGxpc3RlZCB1bmRlciB0aGUgbm9uLWF1dG8tZGV0ZWN0aW5nIGRpcmVjdGl2ZXMsDQorZGVmYXVsdGluZyB0byA8c3Ryb25nPkxJTlVYPC9zdHJvbmc+Lg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPkxJTlVYPC9zdHJvbmc+IGlzIHVzZWQgYXMgYW4gZXhhbXBsZV0NCis8c3Ryb25nPkxJTlVYPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+OjoNCitMb2FkIDxlbT5pbWFnZTwvZW0+IGFzIGEgTGludXgtbGlrZSBrZXJuZWwuIE1FTURJU0sgaXMgYW4gZXhhbXBsZSBvZiBhDQorbm9uLUxpbnV4IGtlcm5lbCBsb2FkZWQgaW4gYSBMaW51eC1saWtlIGZhc2hpb24uPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkJPT1Q8L3N0cm9uZz4gPGVtPmltYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoPHN0cm9uZz5JU09MSU5VWDwvc3Ryb25nPiBvbmx5OiAuYmluOyA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IG9ubHk6IC5icykgTG9hZCBhIGJvb3Qgc2VjdG9yLiAgLmJpbg0KK2lzIGEgIkNEIGJvb3Qgc2VjdG9yIiBhbmQgLmJzIGlzIGEgcmVndWxhciBkaXNrIGJvb3Qgc2VjdG9yLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5CU1M8L3N0cm9uZz4gPGVtPmltYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBvbmx5OiAuYnNzKSBMb2FkIGEgQlNTIGltYWdlLCBhIC5icyBpbWFnZSB3aXRoIHRoZSBET1MNCitzdXBlcmJsb2NrIHBhdGNoZWQgaW4uDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkNPTUJPT1Q8L3N0cm9uZz4gPGVtPmltYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoLmNvbSwgLmNidDsgUmVtb3ZlZCBhcyBvZiA1LjAwKSBMb2FkIGEgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBDT01CT09UIGltYWdlLiAgLmNvbQ0KK2ltYWdlcyBtYXkgYWxzbyBiZSBydW5uYWJsZSBmcm9tIERPUyB3aGlsZSAuY2J0IGltYWdlcyBhcmUgbm90LiAgU2VlDQorYWxzbyA8c3Ryb25nPmNvbWJvb3QudHh0PC9zdHJvbmc+DQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkNPTTMyPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKC5jMzIpIExvYWQgYSA8c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+IENPTTMyICgzMi1iaXQgPHN0cm9uZz5DT01CT09UPC9zdHJvbmc+KSBpbWFnZS4gIFNlZSBhbHNvDQorPHN0cm9uZz5jb21ib290LnR4dDwvc3Ryb25nPg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5DT05GSUc8L3N0cm9uZz4gPGVtPmltYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitMb2FkIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgcmVhZCwgdGhlDQord29ya2luZyBkaXJlY3RvcnkgaXMgY2hhbmdlZCAoaWYgc3BlY2lmaWVkIHZpYSBhbiA8c3Ryb25nPkFQUEVORDwvc3Ryb25nPiksIHRoZW4gdGhlDQorY29uZmlndXJhdGlvbiBmaWxlIGlzIHBhcnNlZC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RkRJTUFHRTwvc3Ryb25nPiA8ZW0+aW1hZ2U8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyhSZW1vdmVkIGFzIG9mIDQuMDUsIGFkZGVkIDEuNjU7IDxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gb25seTogLmltZykgTG9hZCBhIGRpc2sNCitpbWFnZS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+TE9DQUxCT09UPC9zdHJvbmc+IDxlbT50eXBlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiAxLjUzKzsgPHN0cm9uZz5JU09MSU5VWDwvc3Ryb25nPiA/PzMuMTArOyA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IDMuNzArKUF0dGVtcHQgYQ0KK2RpZmZlcmVudCBsb2NhbCBib290IG1ldGhvZC4gIFRoZSBzcGVjaWFsIHZhbHVlIC0xIGNhdXNlcyB0aGUgYm9vdA0KK2xvYWRlciB0byByZXBvcnQgZmFpbHVyZSB0byB0aGUgQklPUywgd2hpY2gsIG9uIHJlY2VudCBCSU9TZXMsIHNob3VsZA0KK21lYW4gdGhhdCB0aGUgbmV4dCBib290IGRldmljZSBpbiB0aGUgYm9vdCBzZXF1ZW5jZSBzaG91bGQgYmUgYWN0aXZhdGVkLg0KKyBWYWx1ZXMgb3RoZXIgdGhhbiB0aG9zZSBkb2N1bWVudGVkIG1heSBwcm9kdWNlIHVuZGVzaXJlZCByZXN1bHRzLg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk9uIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4sIDxlbT50eXBlPC9lbT4gMCBtZWFucyBwZXJmb3JtIGEgbm9ybWFsIGJvb3QuICA8ZW0+dHlwZTwvZW0+IDQgd2lsbA0KK3BlcmZvcm0gYSBsb2NhbCBib290IHdpdGggdGhlIFVuaXZlcnNhbCBOZXR3b3JrIERyaXZlciBJbnRlcmZhY2UgKFVOREkpDQorZHJpdmVyIHN0aWxsIHJlc2lkZW50IGluIG1lbW9yeS4gIEZpbmFsbHksIDxlbT50eXBlPC9lbT4gNSB3aWxsIHBlcmZvcm0gYSBsb2NhbA0KK2Jvb3Qgd2l0aCB0aGUgZW50aXJlIFBYRSBzdGFjaywgaW5jbHVkaW5nIHRoZSBVTkRJIGRyaXZlciwgc3RpbGwNCityZXNpZGVudCBpbiBtZW1vcnkuIEFsbCBvdGhlciB2YWx1ZXMgYXJlIHVuZGVmaW5lZC4gIElmIHlvdSBkb24mIzgyMTc7dCBrbm93DQord2hhdCB0aGUgVU5ESSBvciBQWEUgc3RhY2tzIGFyZSwgZG9uJiM4MjE3O3Qgd29ycnkmIzgyMDE7JiM4MjEyOyYjODIwMTt5b3UgZG9uJiM4MjE3O3Qgd2FudCB0aGVtLA0KK2p1c3Qgc3BlY2lmeSAwLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk9uIDxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4vPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiwgdGhlIDxlbT50eXBlPC9lbT4gc3BlY2lmaWVzIHRoZSBsb2NhbCBkcml2ZSBudW1iZXIgdG8NCitib290IGZyb207IDB4MDAgaXMgdGhlIHByaW1hcnkgZmxvcHB5IGRyaXZlIGFuZCAweDgwIGlzIHRoZSBwcmltYXJ5IGhhcmQNCitkcml2ZS48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+UFhFPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gb25seTogLjApIExvYWQgYSBQWEUgTkJQIChOZXR3b3JrIEJvb3QgUHJvZ3JhbSkgaW1hZ2UuICBUaGUNCitQWEUgcHJvdG9jb2wgZG9lcyBub3QgcHJvdmlkZSBhbnkgbWVhbnMgZm9yIHNwZWNpZml5aW5nIG9yIHVzaW5nIGENCitjb21tYW5kIGxpbmUgb3IgaW5pdHJkLg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2xhYmVsX29ubHlfZGlyZWN0aXZlcyI+TEFCRUwtT05MWSBESVJFQ1RJVkVTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+SU5JVFJEPC9zdHJvbmc+IDxlbT5pbml0cmRfZmlsZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDMuNzErKSBBbiBpbml0cmQgY2FuIGJlIHNwZWNpZmllZCBpbiBhIHNlcGFyYXRlIHN0YXRlbWVudCAoSU5JVFJEKQ0KK2luc3RlYWQgb2YgYXMgcGFydCBvZiB0aGUgPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4gc3RhdGVtZW50OyB0aGlzIGZ1bmN0aW9uYWxseSBhcHBlbmRzDQorImluaXRyZD1pbml0cmRfZmlsZSIgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuICBMaWtlIDxlbT5pbml0cmQ9PC9lbT4sIHRoaXMNCithbHNvIHN1cHBvcnRzIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCBmaWxlIG5hbWVzIChzZWUgPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4pLg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2dsb2JhbF9kaXJlY3RpdmVzX3NlY29uZGFyeSI+R0xPQkFMIERJUkVDVElWRVMgLSBTRUNPTkRBUlk8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZXNlIGFyZSBnbG9iYWwgZGlyZWN0aXZlcyB0aGF0IGFyZSBvZiBsZXNzZXIgaW1wb3J0YW5jZSwgb2Z0ZW4NCithZmZlY3RpbmcgdGhlIHVzZXIgZXhwZXJpZW5jZSBhbmQgbm90IHRoZSBib290IHByb2Nlc3MuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkFMTE9XT1BUSU9OUzwvc3Ryb25nPiA8ZW0+ZmxhZ192YWw8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0lmIDxlbT5mbGFnX3ZhbDwvZW0+IGlzIDAsIHRoZSB1c2VyIGlzIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgYW55IGFyZ3VtZW50cyBvbg0KK3RoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgVGhlIG9ubHkgb3B0aW9ucyByZWNvZ25pemVkIGFyZSB0aG9zZQ0KK3NwZWNpZmllZCBpbiBhbiA8c3Ryb25nPkFQUEVORDwvc3Ryb25nPikgc3RhdGVtZW50LiAgVGhlIGRlZmF1bHQgaXMgMS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+SU1QTElDSVQ8L3N0cm9uZz4gPGVtPmZsYWdfdmFsPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJZiA8ZW0+ZmxhZ192YWw8L2VtPiBpcyAwLCBkbyBub3QgbG9hZCBhIGtlcm5lbCBpbWFnZSB1bmxlc3MgaXQgaGFzIGJlZW4NCitleHBsaWNpdGx5IG5hbWVkIGluIGEgPHN0cm9uZz5MQUJFTDwvc3Ryb25nPiBzdGF0ZW1lbnQuICBUaGUgZGVmYXVsdCBpcyAxLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5USU1FT1VUPC9zdHJvbmc+IDxlbT50aW1lb3V0PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJbmRpY2F0ZXMgaG93IGxvbmcgdG8gd2FpdCBhdCB0aGUgPGVtPmJvb3Q6PC9lbT4gcHJvbXB0IHVudGlsIGJvb3RpbmcNCithdXRvbWF0aWNhbGx5LCBpbiB1bml0cyBvZiAxLzEwIHMuICBUaGUgdGltZW91dCBpcyBjYW5jZWxsZWQgYXMgc29vbiBhcw0KK3RoZSB1c2VyIHR5cGVzIGFueXRoaW5nIG9uIHRoZSBrZXlib2FyZCwgdGhlIGFzc3VtcHRpb24gYmVpbmcgdGhhdCB0aGUNCit1c2VyIHdpbGwgY29tcGxldGUgdGhlIGNvbW1hbmQgbGluZSBhbHJlYWR5IGJlZ3VuLiAgVGhlIHRpbWVyIGlzIHJlc2V0DQordG8gMCB1cG9uIHJldHVybiBmcm9tIGFuIHVuc3VjY2Vzc2Z1bCBhdHRlbXB0IHRvIGJvb3Qgb3IgZnJvbSBhIG1vZHVsZS4NCitBIHRpbWVvdXQgb2YgemVybyAodGhlIGRlZmF1bHQpIHdpbGwgZGlzYWJsZSB0aGUgdGltZW91dCBjb21wbGV0ZWx5Lg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5UT1RBTFRJTUVPVVQ8L3N0cm9uZz4gPGVtPnRpbWVvdXQ8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0luZGljYXRlcyBob3cgbG9uZyB0byB3YWl0IHVudGlsIGJvb3RpbmcgYXV0b21hdGljYWxseSwgaW4gdW5pdHMgb2YNCisxLzEwIHMuICBUaGlzIHRpbWVvdXQgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gY2FuY2VsbGVkIGJ5IHVzZXIgaW5wdXQsIGFuZCBjYW4gdGh1cyBiZQ0KK3VzZWQgdG8gZGVhbCB3aXRoIHNlcmlhbCBwb3J0IGdsaXRjaGVzIG9yICJ0aGUgdXNlciB3YWxrZWQgYXdheSIgdHlwZQ0KK3NpdHVhdGlvbnMuICBBIHRpbWVvdXQgb2YgemVybyAodGhlIGRlZmF1bHQpIHdpbGwgZGlzYWJsZSB0aGUgdGltZW91dA0KK2NvbXBsZXRlbHkuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Qm90aCA8c3Ryb25nPlRJTUVPVVQ8L3N0cm9uZz4gYW5kIDxzdHJvbmc+VE9UQUxUSU1FT1VUPC9zdHJvbmc+IGNhbiBiZSB1c2VkIHRvZ2V0aGVyLCBmb3IgZXhhbXBsZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiMgV2FpdCA1IHNlY29uZHMgdW5sZXNzIHRoZSB1c2VyIHR5cGVzIHNvbWV0aGluZywgYnV0DQorIyBhbHdheXMgYm9vdCBhZnRlciAxNSBtaW51dGVzLg0KK1RJTUVPVVQgNTANCitUT1RBTFRJTUVPVVQgOTAwMDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+T05USU1FT1VUPC9zdHJvbmc+IDxlbT5rZXJuZWwgb3B0aW9ucyYjODIzMDs8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK1NldHMgdGhlIGNvbW1hbmQgbGluZSBpbnZva2VkIG9uIGEgdGltZW91dCAod2hpY2ggb2Z0ZW4gcmVmZXJlbmNlcyBhDQorTEFCRUwpLiAgSWYgbm90IHNwZWNpZmllZCwgPGVtPlVJPC9lbT4gKGlmIHVzZWQpIG9yICdERUZBVUxUIGlzIHVzZWQuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk9ORVJST1I8L3N0cm9uZz4gPGVtPmtlcm5lbCBvcHRpb25zJiM4MjMwOzwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSWYgYSBrZXJuZWwgaW1hZ2UgaXMgbm90IGZvdW5kIChlaXRoZXIgZHVlIHRvIGl0IG5vdCBleGlzdGluZywgb3INCitiZWNhdXNlIDxzdHJvbmc+SU1QTElDSVQ8L3N0cm9uZz4gaXMgc2V0KSwgcnVuIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4gIFRoZSBmYXVsdHkNCitjb21tYW5kIGxpbmUgaXMgYXBwZW5kZWQgdG8gdGhlIHNwZWNpZmllZCBvcHRpb25zLCBzbyBpZiB0aGUgPHN0cm9uZz5PTkVSUk9SPC9zdHJvbmc+DQorZGlyZWN0aXZlIHJlYWRzIGFzOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+T05FUlJPUiB4eXp6eSBwbHVnaDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPmFuZCB0aGUgY29tbWFuZCBsaW5lIGFzIGVudGVyZWQgYnkgdGhlIHVzZXIgaXM6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5mb28gYmFyIGJhejwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gd2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgYXMgaWYgZW50ZXJlZCBieSB0aGUgdXNlcjo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPnh5enp5IHBsdWdoIGZvbyBiYXIgYmF6PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPlNFUklBTDwvc3Ryb25nPiA8ZW0+cG9ydCBbYmF1ZHJhdGUgW2Zsb3djb250cm9sXV08L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0VuYWJsZXMgYSBzZXJpYWwgcG9ydCB0byBhY3QgYXMgdGhlIGNvbnNvbGUuICA8ZW0+cG9ydDwvZW0+IGlzIGEgbnVtYmVyICgwID0NCisvZGV2L3R0eVMwID0gQ09NMSwgZXRjLikgb3IgYW4gSS9PIHBvcnQgYWRkcmVzcyAoZS5nLiAweDNGOCk7IGlmDQorPGVtPmJhdWRyYXRlPC9lbT4gaXMgb21pdHRlZCwgdGhlIGJhdWQgcmF0ZSBkZWZhdWx0cyB0byA5NjAwIGJwcy4gIFRoZSBzZXJpYWwNCitwYXJhbWV0ZXJzIGFyZSBoYXJkY29kZWQgdG8gYmUgOCBiaXRzLCBubyBwYXJpdHksIDEgc3RvcCBiaXQuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PGVtPmZsb3djb250cm9sPC9lbT4gaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGJpdHM6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4weDAwMSAtIEFzc2VydCBEVFINCisweDAwMiAtIEFzc2VydCBSVFMNCisweDAwOCAtIEVuYWJsZSBpbnRlcnJ1cHRzDQorMHgwMTAgLSBXYWl0IGZvciBDVFMgYXNzZXJ0aW9uDQorMHgwMjAgLSBXYWl0IGZvciBEU1IgYXNzZXJ0aW9uDQorMHgwNDAgLSBXYWl0IGZvciBSSSBhc3NlcnRpb24NCisweDA4MCAtIFdhaXQgZm9yIERDRCBhc3NlcnRpb24NCisweDEwMCAtIElnbm9yZSBpbnB1dCB1bmxlc3MgQ1RTIGFzc2VydGVkDQorMHgyMDAgLSBJZ25vcmUgaW5wdXQgdW5sZXNzIERTUiBhc3NlcnRlZA0KKzB4NDAwIC0gSWdub3JlIGlucHV0IHVubGVzcyBSSSBhc3NlcnRlZA0KKzB4ODAwIC0gSWdub3JlIGlucHV0IHVubGVzcyBEQ0QgYXNzZXJ0ZWQ8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5BbGwgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VHlwaWNhbCB2YWx1ZXMgYXJlOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+ICAgIDAgLSBObyBmbG93IGNvbnRyb2wgKGRlZmF1bHQpDQorMHgzMDMgLSBOdWxsIG1vZGVtIGNhYmxlIGRldGVjdA0KKzB4MDEzIC0gUlRTL0NUUyBmbG93IGNvbnRyb2wNCisweDgxMyAtIFJUUy9DVFMgZmxvdyBjb250cm9sLCBtb2RlbSBpbnB1dA0KKzB4MDIzIC0gRFRSL0RTUiBmbG93IGNvbnRyb2wNCisweDA4MyAtIERUUi9EQ0QgZmxvdyBjb250cm9sPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Rm9yIHRoZSA8c3Ryb25nPlNFUklBTDwvc3Ryb25nPiBkaXJlY3RpdmUgdG8gYmUgZ3VhcmFudGVlZCB0byB3b3JrIHByb3Blcmx5LCBpdCBzaG91bGQNCitiZSB0aGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImFkbW9uaXRpb25ibG9jayI+DQorPHRhYmxlPjx0cj4NCis8dGQgY2xhc3M9Imljb24iPg0KKzxkaXYgY2xhc3M9InRpdGxlIj5Ob3RlPC9kaXY+DQorPC90ZD4NCis8dGQgY2xhc3M9ImNvbnRlbnQiPjxlbT5wb3J0PC9lbT4gdmFsdWVzIGZyb20gMCB0byAzIG1lYW5zIHRoZSBmaXJzdCBmb3VyIHNlcmlhbCBwb3J0cw0KK2RldGVjdGVkIGJ5IHRoZSBCSU9TLiAgVGhleSBtYXkgb3IgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZSBsZWdhY3kgcG9ydA0KK3ZhbHVlcyAweDNGOCwgMHgyRjgsIDB4M0U4LCAweDJFOC48L3RkPg0KKzwvdHI+PC90YWJsZT4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkVuYWJsaW5nIGludGVycnVwdHMgKHNldHRpbmcgdGhlIDB4MDA4IGJpdCkgbWF5IGdpdmUgYmV0dGVyDQorcmVzcG9uc2l2ZW5lc3Mgd2l0aG91dCBzZXR0aW5nIHRoZSA8c3Ryb25nPk5PSEFMVDwvc3Ryb25nPiBvcHRpb24sIGJ1dCBjb3VsZA0KK3BvdGVudGlhbGx5IGNhdXNlIHByb2JsZW1zIHdpdGggYnVnZ3kgQklPU2VzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgb3B0aW9uIGlzICJzdGlja3kiIGFuZCBpcyBub3QgYXV0b21hdGljYWxseSByZXNldCB3aGVuIGxvYWRpbmcgYQ0KK25ldyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgQ09ORklHIGNvbW1hbmQuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk5PSEFMVDwvc3Ryb25nPiA8ZW0+ZmxhZ192YWw8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0lmIDxlbT5mbGFnX3ZhbDwvZW0+IGlzIDEsIGRvbiYjODIxNzt0IGhhbHQgdGhlIHByb2Nlc3NvciB3aGlsZSBpZGxlLiBIYWx0aW5nIHRoZQ0KK3Byb2Nlc3NvciB3aGlsZSBpZGxlIHNpZ25pZmljYW50bHkgcmVkdWNlcyB0aGUgcG93ZXIgY29uc3VtcHRpb24sIGJ1dA0KK2NhbiBjYXVzZSBwb29yIHJlc3BvbnNpdmVuZXNzIHRvIHRoZSBzZXJpYWwgY29uc29sZSwgZXNwZWNpYWxseSB3aGVuDQordXNpbmcgc2NyaXB0cyB0byBkcml2ZSB0aGUgc2VyaWFsIGNvbnNvbGUsIGFzIG9wcG9zZWQgdG8gaHVtYW4NCitpbnRlcmFjdGlvbi4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Q09OU09MRTwvc3Ryb25nPiA8ZW0+ZmxhZ192YWw8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0lmIDxlbT5mbGFnX3ZhbDwvZW0+IGlzIDAsIGRpc2FibGUgb3V0cHV0IHRvIHRoZSBub3JtYWwgdmlkZW8gY29uc29sZS4gSWYNCis8ZW0+ZmxhZ192YWw8L2VtPiBpcyAxLCBlbmFibGUgb3V0cHV0IHRvIHRoZSB2aWRlbyBjb25zb2xlICh0aGlzIGlzIHRoZQ0KK2RlZmF1bHQuKQ0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlNvbWUgQklPU2VzIHRyeSB0byBmb3J3YXJkIHRoaXMgdG8gdGhlIHNlcmlhbCBjb25zb2xlIGFuZCBzb21ldGltZXMgbWFrZQ0KK2EgdG90YWwgbWVzcyB0aGVyZW9mLCBzbyB0aGlzIG9wdGlvbiBsZXRzIHlvdSBkaXNhYmxlIHRoZSB2aWRlbyBjb25zb2xlDQorb24gdGhlc2Ugc3lzdGVtcy48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Rk9OVDwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0xvYWQgYSBmb250IGluIC5wc2YgZm9ybWF0IGJlZm9yZSBkaXNwbGF5aW5nIGFueSBvdXRwdXQgKGV4Y2VwdCB0aGUNCitjb3B5cmlnaHQgbGluZSwgd2hpY2ggaXMgb3V0cHV0IGFzIGxkbGludXguc3lzIGl0c2VsZiBpcyBsb2FkZWQuKQ0KKzxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gb25seSBsb2FkcyB0aGUgZm9udCBvbnRvIHRoZSB2aWRlbyBjYXJkOyBpZiB0aGUgLnBzZiBmaWxlDQorY29udGFpbnMgYSBVbmljb2RlIHRhYmxlIGl0IGlzIGlnbm9yZWQuICBUaGlzIG9ubHkgd29ya3Mgb24gRUdBIGFuZCBWR0ENCitjYXJkczsgaG9wZWZ1bGx5IGl0IHNob3VsZCBkbyBub3RoaW5nIG9uIG90aGVycy4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+S0JETUFQPC9zdHJvbmc+IDxlbT5rZXltYXA8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0luc3RhbGwgYSBzaW1wbGUga2V5Ym9hcmQgbWFwLiAgVGhlIGtleWJvYXJkIHJlbWFwcGVyIHVzZWQgaXMgPHN0cm9uZz52ZXJ5PC9zdHJvbmc+DQorc2ltcGxpc3RpYyAoaXQgc2ltcGx5IHJlbWFwcyB0aGUga2V5Y29kZXMgcmVjZWl2ZWQgZnJvbSB0aGUgQklPUywgd2hpY2gNCittZWFucyB0aGF0IG9ubHkgdGhlIGtleSBjb21iaW5hdGlvbnMgcmVsZXZhbnQgaW4gdGhlIGRlZmF1bHQgbGF5b3V0JiM4MjAxOyYjODIxMjsmIzgyMDE7dXN1YWxseSBVLlMuIEVuZ2xpc2gmIzgyMDE7JiM4MjEyOyYjODIwMTtjYW4gYmUgbWFwcGVkKSBidXQgc2hvdWxkIGF0IGxlYXN0IGhlbHAgcGVvcGxlDQord2l0aCBBWkVSVFkga2V5Ym9hcmQgbGF5b3V0IGFuZCB0aGUgbG9jYXRpb25zIG9mID0gYW5kICwgKHR3byBzcGVjaWFsDQorY2hhcmFjdGVycyB1c2VkIGhlYXZpbHkgb24gdGhlIExpbnV4IGtlcm5lbCBjb21tYW5kIGxpbmUuKQ0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSBpbmNsdWRlZCBwcm9ncmFtIGtleXRhYi1saWxvLnBsIGZyb20gdGhlIExJTE8gZGlzdHJpYnV0aW9uIGNhbiBiZQ0KK3VzZWQgdG8gY3JlYXRlIHN1Y2gga2V5bWFwcy4gIFRoZSBmaWxlIGtleXRhYi1saWxvLnR4dCBjb250YWlucyB0aGUNCitkb2N1bWVudGF0aW9uIGZvciB0aGlzIHByb2dyYW0uPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkRJU1BMQVk8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitEaXNwbGF5cyB0aGUgaW5kaWNhdGVkIGZpbGUgb24gdGhlIHNjcmVlbiBhdCBib290IHRpbWUgKGJlZm9yZSB0aGUgYm9vdDoNCitwcm9tcHQsIGlmIGRpc3BsYXllZCkuICBQbGVhc2Ugc2VlIHRoZSBzZWN0aW9uIGJlbG93IG9uIDxzdHJvbmc+RElTUExBWTwvc3Ryb25nPiBmaWxlcy4NCis8L3A+DQorPGRpdiBjbGFzcz0iYWRtb25pdGlvbmJsb2NrIj4NCis8dGFibGU+PHRyPg0KKzx0ZCBjbGFzcz0iaWNvbiI+DQorPGRpdiBjbGFzcz0idGl0bGUiPk5vdGU8L2Rpdj4NCis8L3RkPg0KKzx0ZCBjbGFzcz0iY29udGVudCI+SWYgdGhlIGZpbGUgaXMgbWlzc2luZywgdGhpcyBvcHRpb24gaXMgc2ltcGx5IGlnbm9yZWQuPC90ZD4NCis8L3RyPjwvdGFibGU+DQorPC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+U0FZPC9zdHJvbmc+IDxlbT5tZXNzYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitQcmludHMgdGhlIG1lc3NhZ2Ugb24gdGhlIHNjcmVlbi4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+UFJPTVBUPC9zdHJvbmc+IDxlbT5mbGFnX3ZhbDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSWYgPGVtPmZsYWdfdmFsPC9lbT4gaXMgMCwgZGlzcGxheSB0aGUgYm9vdDogcHJvbXB0IG9ubHkgaWYgdGhlIFNoaWZ0IG9yIEFsdA0KK2tleSBpcyBwcmVzc2VkLCBvciBDYXBzIExvY2sgb3IgU2Nyb2xsIGxvY2sgaXMgc2V0ICh0aGlzIGlzIHRoZQ0KK2RlZmF1bHQpLiAgSWYgPGVtPmZsYWdfdmFsPC9lbT4gaXMgMSwgYWx3YXlzIGRpc3BsYXkgdGhlIGJvb3Q6IHByb21wdC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Tk9FU0NBUEU8L3N0cm9uZz4gPGVtPmZsYWdfdmFsPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJZiA8ZW0+ZmxhZ192YWw8L2VtPiBpcyBzZXQgdG8gMSwgaWdub3JlIHRoZSBTaGlmdC9BbHQvQ2FwcyBMb2NrL1Njcm9sbCBMb2NrDQorZXNjYXBlcy4gIFVzZSB0aGlzICh0b2dldGhlciB3aXRoIFBST01QVCAwKSB0byBmb3JjZSB0aGUgZGVmYXVsdCBib290DQorYWx0ZXJuYXRpdmUuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk5PQ09NUExFVEU8L3N0cm9uZz4gPGVtPmZsYWdfdmFsPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJZiA8ZW0+ZmxhZ192YWw8L2VtPiBpcyBzZXQgdG8gMSwgdGhlIFRhYiBrZXkgZG9lcyBub3QgZGlzcGxheSBsYWJlbHMgYXQgdGhlDQorYm9vdDogcHJvbXB0Lg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjE8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5GMjwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkYzPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjQ8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5GNTwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkY2PC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Rjc8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5GODwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkY5PC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjEwPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjExPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjEyPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorRGlzcGxheXMgdGhlIGluZGljYXRlZCBmaWxlIG9uIHRoZSBzY3JlZW4gd2hlbiBhIGZ1bmN0aW9uIGtleSBpcyBwcmVzc2VkDQorYXQgdGhlIGJvb3Q6IHByb21wdC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHByZS1ib290IG9ubGluZSBoZWxwDQorKHByZXN1bWFibHkgZm9yIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbnMuKSAgUGxlYXNlIHNlZSB0aGUNCitzZWN0aW9uIGJlbG93IG9uIERJU1BMQVkgZmlsZXMuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+V2hlbiB1c2luZyB0aGUgc2VyaWFsIGNvbnNvbGUsIHByZXNzICZsdDtDdHJsLUYmZ3Q7Jmx0O2RpZ2l0Jmd0OyB0byBnZXQgdG8gdGhlIGhlbHANCitzY3JlZW5zLCBlLmcuICZsdDtDdHJsLUYmZ3Q7Jmx0OzImZ3Q7IHRvIGdldCB0byB0aGUgRjIgc2NyZWVuLiBGb3IgRjEwLUYxMiwgaGl0DQorJmx0O0N0cmwtRiZndDsmbHQ7QSZndDssICZsdDtDdHJsLUYmZ3Q7QiwgJmx0O0N0cmwtRiZndDtDLiAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyDQordmVyc2lvbnMsIEYxMCBjYW4gYWxzbyBiZSBlbnRlcmVkIGFzICZsdDtDdHJsLUYmZ3Q7MC48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+UEFUSDwvc3Ryb25nPiA8ZW0+cGF0aDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDUuMDArKSBTcGVjaWZ5IGEgc3BhY2Utc2VwYXJhdGVkICgnIDxlbT47IDUuMDAtNS4xMCB3YXMgYSBjb2xvbiAnOjwvZW0+KSBsaXN0DQorb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIG1vZHVsZXMuIFRoaXMgZGlyZWN0aXZlDQoraXMgdXNlZnVsIGZvciBzcGVjaWZ5aW5nIHRoZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBsaWIqLmMzMiBsaWJyYXJ5DQorZmlsZXMgYXMgb3RoZXIgbW9kdWxlcyBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZXNlIGZpbGVzLCBidXQgbWF5IG5vdA0KK3Jlc2lkZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuICBNdWx0aXBsZSBpbnN0YW5jZXMgd2lsbCBhcHBlbmQgYWRkaXRpb25hbA0KK3BhdGhzLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5TRU5EQ09PS0lFUzwvc3Ryb25nPiA8ZW0+Yml0bWFzazwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gNS4xMCspIFdoZW4gZG93bmxvYWRpbmcgZmlsZXMgb3ZlciBodHRwLCB0aGUgU1lTQVBQRU5EDQorc3RyaW5ncyBhcmUgcHJlcGVuZGVkIHdpdGggPGVtPlN5c2xpbnV4PC9lbT4gYW5kIHNlbnQgdG8gdGhlIHNlcnZlciBhcyBjb29raWVzLg0KK1RoZSBjb29raWVzIGFyZSBVUkwtZW5jb2RlZDsgd2hpdGVzcGFjZSBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiByZXBsYWNlZCB3aXRoDQordW5kZXJzY29yZXMuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhpcyBjb21tYW5kIGxpbWl0cyB0aGUgY29va2llcyBzZW5kOyAwIG1lYW5zIG5vIGNvb2tpZXMuICBUaGUgZGVmYXVsdA0KK2lzIC0xLCBtZWFuaW5nIHNlbmQgYWxsIGNvb2tpZXMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhpcyBvcHRpb24gaXMgInN0aWNreSIgYW5kIGlzIG5vdCBhdXRvbWF0aWNhbGx5IHJlc2V0IHdoZW4gbG9hZGluZyBhDQorbmV3IGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoIHRoZSBDT05GSUcgY29tbWFuZC48L3A+PC9kaXY+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9kaXNwbGF5X2ZpbGVfZm9ybWF0Ij5ESVNQTEFZIEZJTEUgRk9STUFUPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5ESVNQTEFZIGFuZCBmdW5jdGlvbi1rZXkgaGVscCBmaWxlcyBhcmUgdGV4dCBmaWxlcyBpbiBlaXRoZXIgRE9TIG9yIFVOSVgNCitmb3JtYXQgKHdpdGggb3Igd2l0aG91dCAmbHQ7Q1ImZ3Q7KS4gIEluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIHNwZWNpYWwgY29kZXMNCithcmUgaW50ZXJwcmV0ZWQ6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+aWRlbnRpY2FsIHRvICMzPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtGRiZndDs8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAmbHQ7Q3RybC1MJmd0OyA9IEFTQ0lJIDEyPGJyIC8+DQorQ2xlYXIgdGhlIHNjcmVlbiwgaG9tZSB0aGUgY3Vyc29yLiAgTm90ZSB0aGF0IHRoZSBzY3JlZW4gaXMgZmlsbGVkIHdpdGgNCit0aGUgY3VycmVudCBkaXNwbGF5IGNvbG9yLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7RkYmZ3Q7PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorPSAmbHQ7Q3RybC1MJmd0OyA9IEFTQ0lJIDEyOyBDbGVhciB0aGUgc2NyZWVuLCBob21lIHRoZSBjdXJzb3IuICBOb3RlIHRoYXQgdGhlDQorc2NyZWVuIGlzIGZpbGxlZCB3aXRoIHRoZSBjdXJyZW50IGRpc3BsYXkgY29sb3IuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtGRiZndDs8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7RkYmZ3Q7ID0gJmx0O0N0cmwtTCZndDsgPSBBU0NJSSAxMg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkNsZWFyIHRoZSBzY3JlZW4sIGhvbWUgdGhlIGN1cnNvci4gIE5vdGUgdGhhdCB0aGUgc2NyZWVuIGlzIGZpbGxlZCB3aXRoDQordGhlIGN1cnJlbnQgZGlzcGxheSBjb2xvci48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Jmx0O0ZGJmd0Ozwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyZsdDtGRiZndDsgPSAmbHQ7Q3RybC1MJmd0OyA9IEFTQ0lJIDEyPGJyIC8+DQorQ2xlYXIgdGhlIHNjcmVlbiwgaG9tZSB0aGUgY3Vyc29yLiAgTm90ZSB0aGF0IHRoZSBzY3JlZW4gaXMgZmlsbGVkIHdpdGgNCit0aGUgY3VycmVudCBkaXNwbGF5IGNvbG9yLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7U0kmZ3Q7PC9zdHJvbmc+PGVtPiZsdDtiZyZndDsmbHQ7ZmcmZ3Q7PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7U0kmZ3Q7ID0gJmx0O0N0cmwtTyZndDsgPSBBU0NJSSAxNQ0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlNldCB0aGUgZGlzcGxheSBjb2xvcnMgdG8gdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kDQorY29sb3JzLCB3aGVyZSAmbHQ7YmcmZ3Q7IGFuZCAmbHQ7ZmcmZ3Q7IGFyZSB0aGUgMiBoZXggZGlnaXRzIHJlcHJlc2VudGluZyAxIGJ5dGUsDQorY29ycmVzcG9uZGluZyB0byB0aGUgc3RhbmRhcmQgUEMgZGlzcGxheSBhdHRyaWJ1dGVzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+MCA9IGJsYWNrICAgICAgICAgICAgICAgOCA9IGRhcmsgZ3JleQ0KKzEgPSBkYXJrIGJsdWUgICAgICAgICAgIDkgPSBicmlnaHQgYmx1ZQ0KKzIgPSBkYXJrIGdyZWVuICAgICAgICAgIGEgPSBicmlnaHQgZ3JlZW4NCiszID0gZGFyayBjeWFuICAgICAgICAgICBiID0gYnJpZ2h0IGN5YW4NCis0ID0gZGFyayByZWQgICAgICAgICAgICBjID0gYnJpZ2h0IHJlZA0KKzUgPSBkYXJrIHB1cnBsZSAgICAgICAgIGQgPSBicmlnaHQgcHVycGxlDQorNiA9IGJyb3duICAgICAgICAgICAgICAgZSA9IHllbGxvdw0KKzcgPSBsaWdodCBncmV5ICAgICAgICAgIGYgPSB3aGl0ZTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlBpY2tpbmcgYSBicmlnaHQgY29sb3IgKDgtZikgZm9yIHRoZSBiYWNrZ3JvdW5kIHJlc3VsdHMgaW4gdGhlDQorY29ycmVzcG9uZGluZyBkYXJrIGNvbG9yICgwLTcpLCB3aXRoIHRoZSBmb3JlZ3JvdW5kIGZsYXNoaW5nLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkNvbG9ycyBhcmUgbm90IHZpc2libGUgb3ZlciB0aGUgc2VyaWFsIGNvbnNvbGUuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtDQU4mZ3Q7PC9zdHJvbmc+PGVtPmZpbGVuYW1lJmx0O25ld2xpbmUmZ3Q7PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7Q0FOJmd0OyA9ICZsdDtDdHJsLVgmZ3Q7ID0gQVNDSUkgMjQNCis8L3A+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JZiBhIFZHQSBkaXNwbGF5IGlzIHByZXNlbnQsIGVudGVyIGdyYXBoaWNzIG1vZGUgYW5kIGRpc3BsYXkgdGhlIGdyYXBoaWMNCitpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQgaXMgYW4gYWQgaG9jIGZvcm1hdA0KK2NhbGxlZCBMU1MxNjsgdGhlIGluY2x1ZGVkIFBlcmwgcHJvZ3JhbSAicHBtdG9sc3MxNiIgY2FuIGJlIHVzZWQgdG8NCitwcm9kdWNlIHRoZXNlIGltYWdlcy4gIFRoaXMgUGVybCBwcm9ncmFtIGFsc28gaW5jbHVkZXMgdGhlIGZpbGUgZm9ybWF0DQorc3BlY2lmaWNhdGlvbi48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgaW1hZ2UgaXMgZGlzcGxheWVkIGluIDY0MHg0ODAgMTYtY29sb3IgbW9kZS4gIE9uY2UgaW4gZ3JhcGhpY3MgbW9kZSwNCit0aGUgZGlzcGxheSBhdHRyaWJ1dGVzIChzZXQgYnkgJmx0O1NJJmd0OyBjb2RlIHNlcXVlbmNlcykgd29yayBzbGlnaHRseQ0KK2RpZmZlcmVudGx5OiB0aGUgYmFja2dyb3VuZCBjb2xvciBpcyBpZ25vcmVkLCBhbmQgdGhlIGZvcmVncm91bmQgY29sb3JzDQorYXJlIHRoZSAxNiBjb2xvcnMgc3BlY2lmaWVkIGluIHRoZSBpbWFnZSBmaWxlLiAgRm9yIHRoYXQgcmVhc29uLA0KK3BwbXRvbHNzMTYgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoYXQgY2VydGFpbiBjb2xvcnMgc2hvdWxkIGJlIGFzc2lnbmVkDQordG8gc3BlY2lmaWMgY29sb3IgaW5kaWNpZXMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Q29sb3IgaW5kaWNpZXMgMCBhbmQgNywgaW4gcGFydGljdWxhciwgc2hvdWxkIGJlIGNob3NlbiB3aXRoIGNhcmU6IDAgaXMNCit0aGUgYmFja2dyb3VuZCBjb2xvciwgYW5kIDcgaXMgdGhlIGNvbG9yIHVzZWQgZm9yIHRoZSB0ZXh0IHByaW50ZWQgYnkNCis8c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+IGl0c2VsZi48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Jmx0O0VNJmd0Ozwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyZsdDtFTSZndDsgPSAmbHQ7Q3RybC1ZJmd0OyA9IEFTQ0lJIDI1PGJyIC8+DQorSWYgd2UgYXJlIGN1cnJlbnRseSBpbiBncmFwaGljcyBtb2RlLCByZXR1cm4gdG8gdGV4dCBtb2RlLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7RExFJmd0Ozwvc3Ryb25nPi4uPHN0cm9uZz4mbHQ7RVRCJmd0Ozwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyZsdDtDdHJsLVAmZ3Q7Li4mbHQ7Q3RybC1XJmd0OyA9IEFTQ0lJIDE2LTIzDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlc2UgY29kZXMgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG1vZGVzIHRvIHByaW50IGEgY2VydGFpbiBwYXJ0IG9mDQordGhlIG1lc3NhZ2UgZmlsZSBpbi4gIEVhY2ggb2YgdGhlc2UgY29udHJvbCBjaGFyYWN0ZXJzIHNlbGVjdCBhIHNwZWNpZmljDQorc2V0IG9mIG1vZGVzICh0ZXh0IHNjcmVlbiwgZ3JhcGhpY3Mgc2NyZWVuLCBzZXJpYWwgcG9ydCkgZm9yIHdoaWNoIHRoZQ0KK291dHB1dCBpcyBhY3R1YWxseSBkaXNwbGF5ZWQ6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5DaGFyYWN0ZXIgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgR3JhcGggICBTZXJpYWwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCismbHQ7RExFJmd0OyA9ICZsdDtDdHJsLVAmZ3Q7ID0gQVNDSUkgMTYgICAgIE5vICAgICAgTm8gICAgICBObw0KKyZsdDtEQzEmZ3Q7ID0gJmx0O0N0cmwtUSZndDsgPSBBU0NJSSAxNyAgICAgWWVzICAgICBObyAgICAgIE5vDQorJmx0O0RDMiZndDsgPSAmbHQ7Q3RybC1SJmd0OyA9IEFTQ0lJIDE4ICAgICBObyAgICAgIFllcyAgICAgTm8NCismbHQ7REMzJmd0OyA9ICZsdDtDdHJsLVMmZ3Q7ID0gQVNDSUkgMTkgICAgIFllcyAgICAgWWVzICAgICBObw0KKyZsdDtEQzQmZ3Q7ID0gJmx0O0N0cmwtVCZndDsgPSBBU0NJSSAyMCAgICAgTm8gICAgICBObyAgICAgIFllcw0KKyZsdDtOQUsmZ3Q7ID0gJmx0O0N0cmwtVSZndDsgPSBBU0NJSSAyMSAgICAgWWVzICAgICBObyAgICAgIFllcw0KKyZsdDtTWU4mZ3Q7ID0gJmx0O0N0cmwtViZndDsgPSBBU0NJSSAyMiAgICAgTm8gICAgICBZZXMgICAgIFllcw0KKyZsdDtFVEImZ3Q7ID0gJmx0O0N0cmwtVyZndDsgPSBBU0NJSSAyMyAgICAgWWVzICAgICBZZXMgICAgIFllczwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHdpbGwgYWN0dWFsbHkgcHJpbnQgb3V0IHdoaWNoIG1vZGUgdGhlDQorY29uc29sZSBpcyBpbjo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiZsdDtEQzEmZ3Q7VGV4dCBtb2RlJmx0O0RDMiZndDtHcmFwaGljcyBtb2RlJmx0O0RDNCZndDtTZXJpYWwgcG9ydCZsdDtFVEImZ3Q7PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtTVUImZ3Q7PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorJmx0O1NVQiZndDsgPSAmbHQ7Q3RybC1aJmd0OyA9IEFTQ0lJIDI2DQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+RW5kIG9mIGZpbGUgKERPUyBjb252ZW50aW9uKS48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Jmx0O0JFTCZndDs8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7QkVMJmd0OyA9ICZsdDtDdHJsLUcmZ3Q7ID0gQVNDSUkgNzxiciAvPg0KK0JlZXAgdGhlIHNwZWFrZXIuDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYm9vdF9sb2FkZXJfaWRzX3VzZWQiPkJPT1QgTE9BREVSIElEUyBVU0VEPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgTGludXggYm9vdCBwcm90b2NvbCBzdXBwb3J0cyBhICJib290IGxvYWRlciBJRCIsIGEgc2luZ2xlIGJ5dGUgd2hlcmUNCit0aGUgdXBwZXIgbnliYmxlIHNwZWNpZmllcyBhIGJvb3QgbG9hZGVyIGZhbWlseSAoMyA9IDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4pIGFuZCB0aGUNCitsb3dlciBueWJibGUgaXMgdmVyc2lvbiBvciwgaW4gdGhlIGNhc2Ugb2YgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiwgbWVkaWE6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4weDMxICg0OSkgPSBTWVNMSU5VWA0KKzB4MzIgKDUwKSA9IFBYRUxJTlVYDQorMHgzMyAoNTEpID0gSVNPTElOVVgNCisweDM0ICg1MikgPSBFWFRMSU5VWDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkluIHJlY2VudCB2ZXJzaW9ucyBvZiBMaW51eCwgdGhpcyBJRCBpcyBhdmFpbGFibGUgYXMNCisvcHJvYy9zeXMva2VybmVsL2Jvb3Rsb2FkZXJfdHlwZS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX25vdmljZV9wcm90ZWN0aW9uIj5OT1ZJQ0UgUFJPVEVDVElPTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IGJvb3Rpbmcgb24gYSBtYWNoaW5lIHdpdGggdG9vIGxpdHRsZQ0KK21lbW9yeSwgd2hpY2ggbWVhbnMgdGhlIExpbnV4IGJvb3Qgc2VxdWVuY2UgY2Fubm90IGNvbXBsZXRlLiAgSWYgc28sIGENCittZXNzYWdlIGlzIGRpc3BsYXllZCBhbmQgdGhlIGJvb3Qgc2VxdWVuY2UgYWJvcnRlZC4gIEhvbGRpbmcgZG93biB0aGUNCitDdHJsIGtleSB3aGlsZSBib290aW5nIGRpc2FibGVzIHRoaXMgZmVhdHVyZS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5BbnkgZmlsZSB0aGF0IDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gdXNlcyBjYW4gYmUgbWFya2VkIGhpZGRlbiwgc3lzdGVtIG9yIHJlYWRvbmx5DQoraWYgc28gaXMgY29udmVuaWVudDsgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBpZ25vcmVzIGFsbCBmaWxlIGF0dHJpYnV0ZXMuICBUaGUNCis8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IGluc3RhbGxlciBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIHJlYWRvbmx5L2hpZGRlbi9zeXN0ZW0NCithdHRyaWJ1dGVzIG9uIExETElOVVguU1lTLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZXhhbXBsZSI+RVhBTVBMRTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SGVyZSBhcmUgc29tZSBzYW1wbGUgY29uZmlnIGZpbGVzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+IyBTRVJJQUwgMCAxMTUyMDANCitERUZBVUxUIGxpbnV4DQorUFJPTVBUIDENCitUSU1FT1VUIDYwMA0KKw0KK0xBQkVMIGxpbnV4DQorICBMSU5VWCB2bWxpbnV6DQorICBBUFBFTkQgaW5pdHJkPWluaXRyZDEuZ3osaW5pdHJkMi5neg0KKw0KK0xBQkVMIG0NCisgIENPTTMyIG1lbnUuYzMyPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SW4gdGhpcyBleGFtcGxlLCBzZXJpYWwgcG9ydCB1c2UgaXMgZGlzYWJsZWQgYnV0IGNhbiBiZSBlbmFibGVkIGJ5DQordW5jb21tZW50aW5nIHRoZSBmaXJzdCBsaW5lIGFuZCB1dGlsaXplIHNlcmlhbCBwb3J0IDAgYXQgMTE1MjAwIGJwcy4gIElmDQorPGVtPmxpbnV4PC9lbT4gaXMgdHlwZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIGtlcm5lbC1saWtlIGZpbGUgPGVtPnZtbGludXo8L2VtPiBpcw0KK2V4ZWN1dGVkIGFzIGEgTGludXgga2VybmVsLCBpbml0cmQgZmlsZXMgaW5pdHJkMS5neiBhbmQgaW5pdHJkMi5neiBhcmUNCitsb2FkZWQgYXMgaW5pdGlhbCByYW1kaXNrIGZpbGVzIChsaWtlIGNwaW8uZ3ogZmlsZXMgZm9yIGluaXRyYW1mcykuICBJZg0KKzxlbT5tPC9lbT4gaXMgdHlwZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIENPTTMyIG1vZHVsZSA8ZW0+bWVudS5jMzI8L2VtPiBpcw0KK2V4ZWN1dGVkIHRvIGxhdW5jaCBhIG1lbnUgc3lzdGVtLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfa25vd25fYnVncyI+S05PV04gQlVHUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U2V2ZXJhbCBrbm93biBidWdzL2NvbW1vbiBwcm9ibGVtcyBhcmUgbGlzdGVkIGF0DQorPGEgaHJlZj0iaHR0cDovL3d3dy5zeXNsaW51eC5vcmcvd2lraS9pbmRleC5waHAvQ29tbW9uX1Byb2JsZW1zIj5odHRwOi8vd3d3LnN5c2xpbnV4Lm9yZy93aWtpL2luZGV4LnBocC9Db21tb25fUHJvYmxlbXM8L2E+IGFuZCBrbm93bg0KK2hhcmR3YXJlIGNvbXBhdGliaWxpdHkgaXNzdWVzIGFyZSBsaXN0ZWQgYXQNCis8YSBocmVmPSJodHRwOi8vd3d3LnN5c2xpbnV4Lm9yZy93aWtpL2luZGV4LnBocC9IYXJkd2FyZV9Db21wYXRpYmlsaXR5Ij5odHRwOi8vd3d3LnN5c2xpbnV4Lm9yZy93aWtpL2luZGV4LnBocC9IYXJkd2FyZV9Db21wYXRpYmlsaXR5PC9hPiB3aXRoDQorZmlsZW5hbWUgdHJhbnNsYXRpb24gZGlmZmljdWx0eSBhbmQgZWFybHkgUFhFIHN0YWNrcyBiZWluZyBzb21lIG9mIHRoZQ0KK21vc3QgY29tbW9uLiAgUmVwb3J0aW5nIG9mIG90aGVyIGVuY291bnRlcmVkIGlzc3VlcyBpcyB3ZWxjb21lIGFuZA0KK2FwcHJlY2lhdGVkLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYnVnX3JlcG9ydHMiPkJVRyBSRVBPUlRTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JIHdvdWxkIGFwcHJlY2lhdGUgaGVhcmluZyBvZiBhbnkgcHJvYmxlbXMgeW91IGhhdmUgd2l0aCBTeXNsaW51eC4gIEkNCit3b3VsZCBhbHNvIGxpa2UgdG8gaGVhciBmcm9tIHlvdSBpZiB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgdXNlZCBTeXNsaW51eCwNCis8c3Ryb25nPmVzcGVjaWFsbHk8L3N0cm9uZz4gaWYgeW91IGFyZSB1c2luZyBpdCBmb3IgYSBkaXN0cmlidXRpb24uPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgeW91IGFyZSByZXBvcnRpbmcgcHJvYmxlbXMsIHBsZWFzZSBpbmNsdWRlIGFsbCBwb3NzaWJsZSBpbmZvcm1hdGlvbg0KK2Fib3V0IHlvdXIgc3lzdGVtIGFuZCB5b3VyIEJJT1M7IHRoZSB2YXN0IG1ham9yaXR5IG9mIGFsbCBwcm9ibGVtcw0KK3JlcG9ydGVkIHR1cm4gb3V0IHRvIGJlIEJJT1Mgb3IgaGFyZHdhcmUgYnVncywgYW5kIEkgbmVlZCBhcyBtdWNoDQoraW5mb3JtYXRpb24gYXMgcG9zc2libGUgaW4gb3JkZXIgdG8gZGlhZ25vc2UgdGhlIHByb2JsZW1zLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZXJlIGlzIGEgbWFpbGluZyBsaXN0IGZvciBkaXNjdXNzaW9uIGFtb25nIFN5c2xpbnV4IHVzZXJzIGFuZCBmb3INCithbm5vdW5jZW1lbnRzIG9mIG5ldyBhbmQgdGVzdCB2ZXJzaW9ucy4gIFRvIGpvaW4sIG9yIHRvIGJyb3dzZSB0aGUNCithcmNoaXZlLCBnbyB0bzo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48YSBocmVmPSJodHRwOi8vd3d3Lnp5dG9yLmNvbS9tYWlsbWFuL2xpc3RpbmZvL3N5c2xpbnV4Ij5odHRwOi8vd3d3Lnp5dG9yLmNvbS9tYWlsbWFuL2xpc3RpbmZvL3N5c2xpbnV4PC9hPjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlBsZWFzZSBETyBOT1Qgc2VuZCBIVE1MIG1lc3NhZ2VzIG9yIGF0dGFjaG1lbnRzIHRvIHRoZSBtYWlsaW5nIGxpc3QNCisoaW5jbHVkaW5nIG11bHRpcGFydC9hbHRlcm5hdGl2ZSBvciBzaW1pbGFyLikgIEFsbCBzdWNoIG1lc3NhZ2VzIHdpbGwgYmUNCitib3VuY2VkLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYXV0aG9yIj5BVVRIT1I8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgQXNjaWlEb2MgZGVyaXZlZCBkb2N1bWVudCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsDQorPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBkb2N1bWVudGF0aW9uIGJ5IEguIFBldGVyIEFudmluICZsdDs8YSBocmVmPSJtYWlsdG86aHBhQHp5dG9yLmNvbSI+aHBhQHp5dG9yLmNvbTwvYT4mZ3Q7LiAgVGhlIGNvbnZlcnNpb24NCit0byBhbiBBc2NpaURvYyB3YXMgbWFkZSBieSBHZW5lIEN1bW0gJmx0OzxhIGhyZWY9Im1haWx0bzpnZW5lLmN1bW1AZ21haWwuY29tIj5nZW5lLmN1bW1AZ21haWwuY29tPC9hPiZndDs8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBpZD0iZm9vdG5vdGVzIj48aHIgLz48L2Rpdj4NCis8ZGl2IGlkPSJmb290ZXIiPg0KKzxkaXYgaWQ9ImZvb3Rlci10ZXh0Ij4NCitMYXN0IHVwZGF0ZWQgMjAxNC0wMS0xNyAxNjowOTo1NiBQU1QNCis8L2Rpdj4NCis8L2Rpdj4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2Jpb3MvdHh0L2h0bWwvc3lzbGludXguaHRtbCBiL2Jpb3MvdHh0L2h0bWwvc3lzbGludXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzA4NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy90eHQvaHRtbC9zeXNsaW51eC5odG1sCkBAIC0wLDAgKzEsMTEyMyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPg0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iYXBwbGljYXRpb24veGh0bWwreG1sOyBjaGFyc2V0PVVURi04IiAvPg0KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQXNjaWlEb2MgOC42LjgiIC8+DQorPHRpdGxlPnN5c2xpbnV4KDEpPC90aXRsZT4NCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KKy8qIFNoYXJlZCBDU1MgZm9yIEFzY2lpRG9jIHhodG1sMTEgYW5kIGh0bWw1IGJhY2tlbmRzICovDQorDQorLyogRGVmYXVsdCBmb250LiAqLw0KK2JvZHkgew0KKyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsc2VyaWY7DQorfQ0KKw0KKy8qIFRpdGxlIGZvbnQuICovDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiwNCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUsDQordGhlYWQsIHAudGFibGUuaGVhZGVyLA0KKyN0b2N0aXRsZSwNCisjYXV0aG9yLCAjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyaywNCisjZm9vdGVyIHsNCisgIGZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsNCit9DQorDQorYm9keSB7DQorICBtYXJnaW46IDFlbSA1JSAxZW0gNSU7DQorfQ0KKw0KK2Egew0KKyAgY29sb3I6IGJsdWU7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCit9DQorYTp2aXNpdGVkIHsNCisgIGNvbG9yOiBmdWNoc2lhOw0KK30NCisNCitlbSB7DQorICBmb250LXN0eWxlOiBpdGFsaWM7DQorICBjb2xvcjogbmF2eTsNCit9DQorDQorc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICMwODMxOTQ7DQorfQ0KKw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBtYXJnaW4tdG9wOiAxLjJlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KKyAgbGluZS1oZWlnaHQ6IDEuMzsNCit9DQorDQoraDEsIGgyLCBoMyB7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitoMiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorfQ0KK2gzIHsNCisgIGZsb2F0OiBsZWZ0Ow0KK30NCitoMyArICogew0KKyAgY2xlYXI6IGxlZnQ7DQorfQ0KK2g1IHsNCisgIGZvbnQtc2l6ZTogMS4wZW07DQorfQ0KKw0KK2Rpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogMDsNCit9DQorDQoraHIgew0KKyAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOw0KK30NCisNCitwIHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KK3VsLCBvbCwgbGkgPiBwIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3VsID4gbGkgICAgIHsgY29sb3I6ICNhYWE7IH0NCit1bCA+IGxpID4gKiB7IGNvbG9yOiBibGFjazsgfQ0KKw0KKy5tb25vc3BhY2VkLCBjb2RlLCBwcmUgew0KKyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCisgIGNvbG9yOiBuYXZ5Ow0KKyAgcGFkZGluZzogMDsNCisgIG1hcmdpbjogMDsNCit9DQorDQorDQorI2F1dGhvciB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCit9DQorI2VtYWlsIHsNCit9DQorI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmsgew0KK30NCisNCisjZm9vdGVyIHsNCisgIGZvbnQtc2l6ZTogc21hbGw7DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLXRvcDogNC4wZW07DQorfQ0KKyNmb290ZXItdGV4dCB7DQorICBmbG9hdDogbGVmdDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorI2Zvb3Rlci1iYWRnZXMgew0KKyAgZmxvYXQ6IHJpZ2h0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisNCisjcHJlYW1ibGUgew0KKyAgbWFyZ2luLXRvcDogMS41ZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmltYWdlYmxvY2ssIGRpdi5leGFtcGxlYmxvY2ssIGRpdi52ZXJzZWJsb2NrLA0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYubGl0ZXJhbGJsb2NrLCBkaXYubGlzdGluZ2Jsb2NrLCBkaXYuc2lkZWJhcmJsb2NrLA0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAyLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDIuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBjb2xvcjogIzYwNjA2MDsNCit9DQorDQorZGl2LmNvbnRlbnQgeyAvKiBCbG9jayBlbGVtZW50IGNvbnRlbnQuICovDQorICBwYWRkaW5nOiAwOw0KK30NCisNCisvKiBCbG9jayBlbGVtZW50IHRpdGxlcy4gKi8NCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCitkaXYudGl0bGUgKyAqIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKw0KK3RkIGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCArIGRpdi50aXRsZSB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorDQorZGl2LnNpZGViYXJibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJhY2tncm91bmQ6ICNmZmZmZWU7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjBmMGYwOw0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5saXN0aW5nYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgYmFja2dyb3VuZDogI2Y4ZjhmODsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYucXVvdGVibG9jaywgZGl2LnZlcnNlYmxvY2sgew0KKyAgcGFkZGluZy1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgY29sb3I6ICM4ODg7DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCitkaXYudmVyc2VibG9jayA+IHByZS5jb250ZW50IHsNCisgIGZvbnQtZmFtaWx5OiBpbmhlcml0Ow0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KK30NCitkaXYudmVyc2VibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC43NWVtOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorLyogREVQUkVDQVRFRDogUHJlIHZlcnNpb24gOC4yLjcgdmVyc2Ugc3R5bGUgbGl0ZXJhbCBibG9jay4gKi8NCitkaXYudmVyc2VibG9jayArIGRpdi5hdHRyaWJ1dGlvbiB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisNCitkaXYuYWRtb25pdGlvbmJsb2NrIC5pY29uIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgdGQuY29udGVudCB7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KK30NCisNCitkaXYuZXhhbXBsZWJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCit9DQorDQorZGl2LmltYWdlYmxvY2sgZGl2LmNvbnRlbnQgeyBwYWRkaW5nLWxlZnQ6IDA7IH0NCitzcGFuLmltYWdlIGltZyB7IGJvcmRlci1zdHlsZTogbm9uZTsgfQ0KK2EuaW1hZ2U6dmlzaXRlZCB7IGNvbG9yOiB3aGl0ZTsgfQ0KKw0KK2RsIHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2R0IHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCitkZCA+ICo6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorfQ0KKw0KK3VsLCBvbCB7DQorICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7DQorfQ0KK29sLmFyYWJpYyB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7DQorfQ0KK29sLmxvd2VyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYTsNCit9DQorb2wudXBwZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLWFscGhhOw0KK30NCitvbC5sb3dlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItcm9tYW47DQorfQ0KK29sLnVwcGVycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1yb21hbjsNCit9DQorDQorZGl2LmNvbXBhY3QgdWwsIGRpdi5jb21wYWN0IG9sLA0KK2Rpdi5jb21wYWN0IHAsIGRpdi5jb21wYWN0IHAsDQorZGl2LmNvbXBhY3QgZGl2LCBkaXYuY29tcGFjdCBkaXYgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQordGZvb3Qgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkID4gZGl2LnZlcnNlIHsNCisgIHdoaXRlLXNwYWNlOiBwcmU7DQorfQ0KKw0KK2Rpdi5oZGxpc3Qgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZGl2LmhkbGlzdCB0ciB7DQorICBwYWRkaW5nLWJvdHRvbTogMTVweDsNCit9DQorZHQuaGRsaXN0MS5zdHJvbmcsIHRkLmhkbGlzdDEuc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZC5oZGxpc3QxIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjhlbTsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCit0ZC5oZGxpc3QyIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5oZGxpc3QuY29tcGFjdCB0ciB7DQorICBtYXJnaW46IDA7DQorICBwYWRkaW5nLWJvdHRvbTogMDsNCit9DQorDQorLmNvbW1lbnQgew0KKyAgYmFja2dyb3VuZDogeWVsbG93Ow0KK30NCisNCisuZm9vdG5vdGUsIC5mb290bm90ZXJlZiB7DQorICBmb250LXNpemU6IDAuOGVtOw0KK30NCisNCitzcGFuLmZvb3Rub3RlLCBzcGFuLmZvb3Rub3RlcmVmIHsNCisgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjsNCit9DQorDQorI2Zvb3Rub3RlcyB7DQorICBtYXJnaW46IDIwcHggMCAyMHB4IDA7DQorICBwYWRkaW5nOiA3cHggMCAwIDA7DQorfQ0KKw0KKyNmb290bm90ZXMgZGl2LmZvb3Rub3RlIHsNCisgIG1hcmdpbjogMCAwIDVweCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGhyIHsNCisgIGJvcmRlcjogbm9uZTsNCisgIGJvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7DQorICBoZWlnaHQ6IDFweDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tbGVmdDogMDsNCisgIHdpZHRoOiAyMCU7DQorICBtaW4td2lkdGg6IDEwMHB4Ow0KK30NCisNCitkaXYuY29saXN0IHRkIHsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuM2VtOw0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmNvbGlzdCB0ZCBpbWcgew0KKyAgbWFyZ2luLXRvcDogMC4zZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICAjZm9vdGVyLWJhZGdlcyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorI3RvYyB7DQorICBtYXJnaW4tYm90dG9tOiAyLjVlbTsNCit9DQorDQorI3RvY3RpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQorZGl2LnRvY2xldmVsMCwgZGl2LnRvY2xldmVsMSwgZGl2LnRvY2xldmVsMiwgZGl2LnRvY2xldmVsMywgZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tdG9wOiAwOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCit9DQorZGl2LnRvY2xldmVsMiB7DQorICBtYXJnaW4tbGVmdDogMmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsMyB7DQorICBtYXJnaW4tbGVmdDogNGVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tbGVmdDogNmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorDQorc3Bhbi5hcXVhIHsgY29sb3I6IGFxdWE7IH0NCitzcGFuLmJsYWNrIHsgY29sb3I6IGJsYWNrOyB9DQorc3Bhbi5ibHVlIHsgY29sb3I6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEgeyBjb2xvcjogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheSB7IGNvbG9yOiBncmF5OyB9DQorc3Bhbi5ncmVlbiB7IGNvbG9yOiBncmVlbjsgfQ0KK3NwYW4ubGltZSB7IGNvbG9yOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24geyBjb2xvcjogbWFyb29uOyB9DQorc3Bhbi5uYXZ5IHsgY29sb3I6IG5hdnk7IH0NCitzcGFuLm9saXZlIHsgY29sb3I6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUgeyBjb2xvcjogcHVycGxlOyB9DQorc3Bhbi5yZWQgeyBjb2xvcjogcmVkOyB9DQorc3Bhbi5zaWx2ZXIgeyBjb2xvcjogc2lsdmVyOyB9DQorc3Bhbi50ZWFsIHsgY29sb3I6IHRlYWw7IH0NCitzcGFuLndoaXRlIHsgY29sb3I6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3cgeyBjb2xvcjogeWVsbG93OyB9DQorDQorc3Bhbi5hcXVhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBhcXVhOyB9DQorc3Bhbi5ibGFjay1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmxhY2s7IH0NCitzcGFuLmJsdWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyYXk7IH0NCitzcGFuLmdyZWVuLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmVlbjsgfQ0KK3NwYW4ubGltZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbGltZTsgfQ0KK3NwYW4ubWFyb29uLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBtYXJvb247IH0NCitzcGFuLm5hdnktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG5hdnk7IH0NCitzcGFuLm9saXZlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBwdXJwbGU7IH0NCitzcGFuLnJlZC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcmVkOyB9DQorc3Bhbi5zaWx2ZXItYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogdGVhbDsgfQ0KK3NwYW4ud2hpdGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3ctYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYmlnIHsgZm9udC1zaXplOiAyZW07IH0NCitzcGFuLnNtYWxsIHsgZm9udC1zaXplOiAwLjZlbTsgfQ0KKw0KK3NwYW4udW5kZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0NCitzcGFuLm92ZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsgfQ0KK3NwYW4ubGluZS10aHJvdWdoIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IH0NCisNCitkaXYudW5icmVha2FibGUgeyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0NCisNCisNCisvKg0KKyAqIHhodG1sMTEgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorZGl2LnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZSB7DQorICBib3JkZXI6IDNweCBzb2xpZCAjNTI3YmJkOw0KK30NCit0aGVhZCwgcC50YWJsZS5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZSB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisvKiBCZWNhdXNlIHRoZSB0YWJsZSBmcmFtZSBhdHRyaWJ1dGUgaXMgb3ZlcnJpZGVuIGJ5IENTUyBpbiBtb3N0IGJyb3dzZXJzLiAqLw0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZvaWQiXSB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9ImhzaWRlcyJdIHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2c2lkZXMiXSB7DQorICBib3JkZXItdG9wLXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsNCit9DQorDQorDQorLyoNCisgKiBodG1sNSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK3RoZWFkLCBwLnRhYmxlYmxvY2suaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogM3B4Ow0KKyAgYm9yZGVyLXNwYWNpbmc6IDBweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KK30NCit0aC50YWJsZWJsb2NrLCB0ZC50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogMXB4Ow0KKyAgcGFkZGluZzogNHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCit9DQorDQordGFibGUudGFibGVibG9jay5mcmFtZS10b3Bib3Qgew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXNpZGVzIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1ub25lIHsNCisgIGJvcmRlci1zdHlsZTogaGlkZGVuOw0KK30NCisNCit0aC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0IHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciwgdGQudGFibGVibG9jay5oYWxpZ24tY2VudGVyIHsNCisgIHRleHQtYWxpZ246IGNlbnRlcjsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tcmlnaHQsIHRkLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0IHsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCit0aC50YWJsZWJsb2NrLnZhbGlnbi10b3AsIHRkLnRhYmxlYmxvY2sudmFsaWduLXRvcCB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUsIHRkLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20sIHRkLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOw0KK30NCisNCisNCisvKg0KKyAqIG1hbnBhZ2Ugc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorYm9keS5tYW5wYWdlIGgxIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitib2R5Lm1hbnBhZ2UgaDIgew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitib2R5Lm1hbnBhZ2UgZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAzZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICBib2R5Lm1hbnBhZ2UgZGl2I3RvYyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorDQorPC9zdHlsZT4NCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQorLyo8IVtDREFUQVsqLw0KK3ZhciBhc2NpaWRvYyA9IHsgIC8vIE5hbWVzcGFjZS4NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBUYWJsZSBPZiBDb250ZW50cyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBBdXRob3I6IE1paGFpIEJhem9uLCBTZXB0ZW1iZXIgMjAwMg0KKyAqIGh0dHA6Ly9zdHVkZW50cy5pbmZvaWFzaS5yby9+bWlzaG9vDQorICoNCisgKiBUYWJsZSBPZiBDb250ZW50IGdlbmVyYXRvcg0KKyAqIFZlcnNpb246IDAuNA0KKyAqDQorICogRmVlbCBmcmVlIHRvIHVzZSB0aGlzIHNjcmlwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYw0KKyAqIExpY2Vuc2UsIGFzIGxvbmcgYXMgeW91IGRvIG5vdCByZW1vdmUgb3IgYWx0ZXIgdGhpcyBub3RpY2UuDQorICovDQorDQorIC8qIG1vZGlmaWVkIGJ5IFRyb3kgRC4gSGFuc29uLCBTZXB0ZW1iZXIgMjAwNi4gTGljZW5zZTogR1BMICovDQorIC8qIG1vZGlmaWVkIGJ5IFN0dWFydCBSYWNraGFtLCAyMDA2LCAyMDA5LiBMaWNlbnNlOiBHUEwgKi8NCisNCisvLyB0b2NsZXZlbHMgPSAxLi40Lg0KK3RvYzogZnVuY3Rpb24gKHRvY2xldmVscykgew0KKw0KKyAgZnVuY3Rpb24gZ2V0VGV4dChlbCkgew0KKyAgICB2YXIgdGV4dCA9ICIiOw0KKyAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgIGlmIChpLm5vZGVUeXBlID09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIC8vIElFIGRvZXNuJ3Qgc3BlYWsgY29uc3RhbnRzLg0KKyAgICAgICAgdGV4dCArPSBpLmRhdGE7DQorICAgICAgZWxzZSBpZiAoaS5maXJzdENoaWxkICE9IG51bGwpDQorICAgICAgICB0ZXh0ICs9IGdldFRleHQoaSk7DQorICAgIH0NCisgICAgcmV0dXJuIHRleHQ7DQorICB9DQorDQorICBmdW5jdGlvbiBUb2NFbnRyeShlbCwgdGV4dCwgdG9jbGV2ZWwpIHsNCisgICAgdGhpcy5lbGVtZW50ID0gZWw7DQorICAgIHRoaXMudGV4dCA9IHRleHQ7DQorICAgIHRoaXMudG9jbGV2ZWwgPSB0b2NsZXZlbDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIHRvY0VudHJpZXMoZWwsIHRvY2xldmVscykgew0KKyAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5Ow0KKyAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdbaEhdKFsxLScrKHRvY2xldmVscysxKSsnXSknKTsNCisgICAgLy8gRnVuY3Rpb24gdGhhdCBzY2FucyB0aGUgRE9NIHRyZWUgZm9yIGhlYWRlciBlbGVtZW50cyAodGhlIERPTTINCisgICAgLy8gbm9kZUl0ZXJhdG9yIEFQSSB3b3VsZCBiZSBhIGJldHRlciB0ZWNobmlxdWUgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgYWxsDQorICAgIC8vIGJyb3dzZXJzKS4NCisgICAgdmFyIGl0ZXJhdGUgPSBmdW5jdGlvbiAoZWwpIHsNCisgICAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykgew0KKyAgICAgICAgICB2YXIgbW8gPSByZS5leGVjKGkudGFnTmFtZSk7DQorICAgICAgICAgIGlmIChtbyAmJiAoaS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgaS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpKSAhPSAiZmxvYXQiKSB7DQorICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbmV3IFRvY0VudHJ5KGksIGdldFRleHQoaSksIG1vWzFdLTEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGl0ZXJhdGUoaSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGl0ZXJhdGUoZWwpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgdmFyIHRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b2MiKTsNCisgIGlmICghdG9jKSB7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIC8vIERlbGV0ZSBleGlzdGluZyBUT0MgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgVE9DLg0KKyAgdmFyIHRvY0VudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgdmFyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gdG9jLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCgvXnRvY2xldmVsLykpDQorICAgICAgdG9jRW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IHRvY0VudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICB0b2MucmVtb3ZlQ2hpbGQodG9jRW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgVE9DIGVudHJpZXMuDQorICB2YXIgZW50cmllcyA9IHRvY0VudHJpZXMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKSwgdG9jbGV2ZWxzKTsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KKyAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2ldOw0KKyAgICBpZiAoZW50cnkuZWxlbWVudC5pZCA9PSAiIikNCisgICAgICBlbnRyeS5lbGVtZW50LmlkID0gIl90b2NfIiArIGk7DQorICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOw0KKyAgICBhLmhyZWYgPSAiIyIgKyBlbnRyeS5lbGVtZW50LmlkOw0KKyAgICBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVudHJ5LnRleHQpKTsNCisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KKyAgICBkaXYuYXBwZW5kQ2hpbGQoYSk7DQorICAgIGRpdi5jbGFzc05hbWUgPSAidG9jbGV2ZWwiICsgZW50cnkudG9jbGV2ZWw7DQorICAgIHRvYy5hcHBlbmRDaGlsZChkaXYpOw0KKyAgfQ0KKyAgaWYgKGVudHJpZXMubGVuZ3RoID09IDApDQorICAgIHRvYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYyk7DQorfSwNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBGb290bm90ZXMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQmFzZWQgb24gZm9vdG5vdGUgZ2VuZXJhdGlvbiBjb2RlIGZyb206DQorICogaHR0cDovL3d3dy5icmFuZHNwYW5raW5nbmV3Lm5ldC9hcmNoaXZlLzIwMDUvMDcvZm9ybWF0X2Zvb3Rub3RlLmh0bWwNCisgKi8NCisNCitmb290bm90ZXM6IGZ1bmN0aW9uICgpIHsNCisgIC8vIERlbGV0ZSBleGlzdGluZyBmb290bm90ZSBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBmb290bm9kZXMuDQorICB2YXIgaTsNCisgIHZhciBub3RlaG9sZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvb3Rub3RlcyIpOw0KKyAgaWYgKCFub3RlaG9sZGVyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHZhciBlbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIGZvciAoaSA9IDA7IGkgPCBub3RlaG9sZGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gbm90ZWhvbGRlci5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2JyAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gImZvb3Rub3RlIikNCisgICAgICBlbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgZW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIG5vdGVob2xkZXIucmVtb3ZlQ2hpbGQoZW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgZm9vdG5vdGUgZW50cmllcy4NCisgIHZhciBjb250ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKTsNCisgIHZhciBzcGFucyA9IGNvbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCisgIHZhciByZWZzID0ge307DQorICB2YXIgbiA9IDA7DQorICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZSIpIHsNCisgICAgICBuKys7DQorICAgICAgdmFyIG5vdGUgPSBzcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIpOw0KKyAgICAgIGlmICghbm90ZSkgew0KKyAgICAgICAgLy8gVXNlIFtcc1xTXSBpbiBwbGFjZSBvZiAuIHNvIG11bHRpLWxpbmUgbWF0Y2hlcyB3b3JrLg0KKyAgICAgICAgLy8gQmVjYXVzZSBKYXZhU2NyaXB0IGhhcyBubyBzIChkb3RhbGwpIHJlZ2V4IGZsYWcuDQorICAgICAgICBub3RlID0gc3BhbnNbaV0uaW5uZXJIVE1MLm1hdGNoKC9ccypcWyhbXHNcU10qKV1ccyovKVsxXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaWQ9J19mb290bm90ZXJlZl8iICsgbiArICInIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgICBzcGFuc1tpXS5zZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIsIG5vdGUpOw0KKyAgICAgIH0NCisgICAgICBub3RlaG9sZGVyLmlubmVySFRNTCArPQ0KKyAgICAgICAgIjxkaXYgY2xhc3M9J2Zvb3Rub3RlJyBpZD0nX2Zvb3Rub3RlXyIgKyBuICsgIic+IiArDQorICAgICAgICAiPGEgaHJlZj0nI19mb290bm90ZXJlZl8iICsgbiArICInIHRpdGxlPSdSZXR1cm4gdG8gdGV4dCc+IiArDQorICAgICAgICBuICsgIjwvYT4uICIgKyBub3RlICsgIjwvZGl2PiI7DQorICAgICAgdmFyIGlkID1zcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7DQorICAgICAgaWYgKGlkICE9IG51bGwpIHJlZnNbIiMiK2lkXSA9IG47DQorICAgIH0NCisgIH0NCisgIGlmIChuID09IDApDQorICAgIG5vdGVob2xkZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub3RlaG9sZGVyKTsNCisgIGVsc2Ugew0KKyAgICAvLyBQcm9jZXNzIGZvb3Rub3RlcmVmcy4NCisgICAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZXJlZiIpIHsNCisgICAgICAgIHZhciBocmVmID0gc3BhbnNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsNCisgICAgICAgIGhyZWYgPSBocmVmLm1hdGNoKC8jLiovKVswXTsgIC8vIEJlY2F1c2UgSUUgcmV0dXJuIGZ1bGwgVVJMLg0KKyAgICAgICAgbiA9IHJlZnNbaHJlZl07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfSwNCisNCitpbnN0YWxsOiBmdW5jdGlvbih0b2NsZXZlbHMpIHsNCisgIHZhciB0aW1lcklkOw0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsKCkgew0KKyAgICBhc2NpaWRvYy5mb290bm90ZXMoKTsNCisgICAgaWYgKHRvY2xldmVscykgew0KKyAgICAgIGFzY2lpZG9jLnRvYyh0b2NsZXZlbHMpOw0KKyAgICB9DQorICB9DQorDQorICBmdW5jdGlvbiByZWluc3RhbGxBbmRSZW1vdmVUaW1lcigpIHsNCisgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsNCisgICAgcmVpbnN0YWxsKCk7DQorICB9DQorDQorICB0aW1lcklkID0gc2V0SW50ZXJ2YWwocmVpbnN0YWxsLCA1MDApOw0KKyAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpDQorICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCByZWluc3RhbGxBbmRSZW1vdmVUaW1lciwgZmFsc2UpOw0KKyAgZWxzZQ0KKyAgICB3aW5kb3cub25sb2FkID0gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXI7DQorfQ0KKw0KK30NCithc2NpaWRvYy5pbnN0YWxsKCk7DQorLypdXT4qLw0KKzwvc2NyaXB0Pg0KKzwvaGVhZD4NCis8Ym9keSBjbGFzcz0ibWFucGFnZSI+DQorPGRpdiBpZD0iaGVhZGVyIj4NCis8aDE+DQorc3lzbGludXgoMSkgTWFudWFsIFBhZ2UNCis8L2gxPg0KKzxoMj5OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPHA+c3lzbGludXggLQ0KKyAgIEluc3RhbGwgU1lTTElOVVggdG8gYSBmaWxlIHN5c3RlbQ0KKzwvcD4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJjb250ZW50Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfc3lub3BzaXMiPlNZTk9QU0lTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0idmVyc2VibG9jayI+DQorPHByZSBjbGFzcz0iY29udGVudCI+PHN0cm9uZz5zeXNsaW51eDwvc3Ryb25nPiBbPGVtPk9QVElPTlM8L2VtPl0gPGVtPkRFVklDRTwvZW0+DQorPHN0cm9uZz5leHRsaW51eDwvc3Ryb25nPiBbPGVtPk9QVElPTlM8L2VtPl0gPGVtPlBBVEg8L2VtPg0KKzxzdHJvbmc+c3lzbGludXg8L3N0cm9uZz4gWy1oIHwgLS1oZWxwIHwgLXYgfCAtLXZlcnNpb25dDQorPHN0cm9uZz5leHRsaW51eDwvc3Ryb25nPiBbLWggfCAtLWhlbHAgfCAtdiB8IC0tdmVyc2lvbl08L3ByZT4NCis8ZGl2IGNsYXNzPSJhdHRyaWJ1dGlvbiI+DQorPC9kaXY+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2Rlc2NyaXB0aW9uIj5ERVNDUklQVElPTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SW5zdGFsbCA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IHRvIHRoZSA8ZW0+REVWSUNFPC9lbT4vPGVtPlBBVEg8L2VtPiwgYWx0ZXJpbmcgdGhlIGJvb3Qgc2VjdG9yIGFuZA0KK2luc3RhbGxpbmcgdGhlIDxlbT5sZGxpbnV4LnN5czwvZW0+IGJvb3QgbG9hZGVyIGZpbGUuICBGb3IgdGhlIExpbnV4IGluc3RhbGxlcg0KK2V4dGxpbnV4LCA8ZW0+UEFUSDwvZW0+IGlzIHRoZSBkZXNpcmVkIHBhdGggZm9yIHRoZSBjb250cm9sIGZpbGVzIG9uIGEgbW91bnRlZCwNCitzdXBwb3J0ZWQgZmlsZSBzeXN0ZW0gYW5kIHNldHMgdGhlIGluc3RhbGwtdGltZSB3b3JraW5nIGRpcmVjdG9yeS4gIEZvcg0KK2FsbCBvdGhlcnMsIDxlbT5ERVZJQ0U8L2VtPiBtdXN0IHNwZWNpZnkgYSBGQVQxMi9GQVQxNi9GQVQzMiBmaWxlIHN5c3RlbS4gIEZvcg0KK3RoZSBMaW51eCBpbnN0YWxsZXJzIHN5c2xpbnV4IGFuZCBzeXNsaW51eC1tdG9vbHMsIDxlbT5ERVZJQ0U8L2VtPiBzaG91bGQgYmUgYW4NCit1bm1vdW50ZWQgZmlsZSBzeXN0ZW0uICBGb3IgdGhlIERPUy9XaW4zMi9XaW42NCBpbnN0YWxsZXJzLCA8ZW0+REVWSUNFPC9lbT4NCitzaG91bGQgYmUgYSBkcml2ZSBsaWtlIDxlbT5hOjwvZW0+IChjYXNlIGluc2Vuc2l0aXZlKS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Gb3IgdmVyc2lvbnMgfjQuMDAgYW5kIGxhdGVyLCBlaXRoZXIgLWkvLS1pbnN0YWxsIG9yIC1VLy0tdXBkYXRlIG11c3QgYmUNCitzcGVjaWZpZWQgdW5sZXNzIG1vZGlmeWluZyB0aGUgQURWIG9mIGFuIGV4aXN0aW5nIGluc3RhbGwgKG9wdGlvbnMNCit0YWdnZWQgd2l0aCA8ZW0+QURWPC9lbT4pIG9yIHJlcXVlc3RpbmcgdGhlIGhlbHAvdXNhZ2Ugb3IgdmVyc2lvbiBpbmZvLCAuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYsIGR1cmluZyBib290LCB0aGUgU2hpZnQgb3IgQWx0IGtleXMgYXJlIGhlbGQgZG93biwgb3IgdGhlIENhcHMgb3INCitTY3JvbGwgbG9ja3MgYXJlIHNldCwgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiB3aWxsIGRpc3BsYXkgYSA8c3Ryb25nPmxpbG88L3N0cm9uZz4oOCkgLXN0eWxlICJib290OiINCitwcm9tcHQuIFRoZSB1c2VyIGNhbiB0aGVuIHR5cGUgYSBrZXJuZWwgZmlsZSBuYW1lIGZvbGxvd2VkIGJ5IGFueSBrZXJuZWwNCitwYXJhbWV0ZXJzLiBUaGUgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBib290bG9hZGVyIGRvZXMgbm90IG5lZWQgdG8ga25vdyBhYm91dCB0aGUNCitrZXJuZWwgb3IgY29uZmlnIGZpbGVzIGluIGFkdmFuY2UuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBzdXBwb3J0cyB0aGUgbG9hZGluZyBvZiBpbml0aWFsIHJhbWRpc2tzIChpbml0cmQpIGFuZCB0aGUNCitiekltYWdlIGtlcm5lbCBmb3JtYXQuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+UGxlYXNlIG5vdGUsIHRoZSBsZGxpbnV4LnN5cyBib290IGxvYWRlciBmaWxlIGlzIGZsYWdnZWQgYXMgaW1tdXRhYmxlDQorKHdoZXJlIGFwcGxpY2FibGUpIGFuZCBpcyBtb2RpZmllZCBhZnRlciBjb3B5aW5nIGluIHRvIGhlbHAgZW5zdXJlDQorYm9vdC10aW1lIGludGVncml0eS4gIEZpbGUgc3lzdGVtcyB3aXRoIGEgc3VmZmljaWVudGx5IGxhcmdlIGJvb3QgbG9hZGVyDQorcmVzZXJ2ZWQgYXJlYSwgbGlrZSBidHJmcywgd2lsbCBoYXZlIGxkbGludXguc3lzIGluc3RhbGxlZCB0aGVyZSByYXRoZXINCit0aGFuIGFzIGEgbm9ybWFsIGZpbGUuICBQcmlvciB0byB2ZXJzaW9uIDQuMDAsIGV4dGxpbnV4IHdvdWxkIGluc3RhbGwgYQ0KK2ZpbGUgZXh0bGludXguc3lzIHdoaWNoIHZlcnNpb25zIDQuMDAgYW5kIGxhdGVyIGluc3RhbGxlcnMgd2lsbCByZXBsYWNlIHdpdGggbGRsaW51eC5zeXMuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9vcHRpb25zIj5PUFRJT05TPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX3N0YW5kYWxvbmVfb3B0aW9ucyI+U3RhbmRhbG9uZSBvcHRpb25zPC9oMz4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4taTwvc3Ryb25nPiwgPHN0cm9uZz4tLWluc3RhbGw8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisofjQuMDArKSBJbnN0YWxsIFNZU0xJTlVYLCByZWdhcmRsZXNzIG9mIGFuIGV4aXN0aW5nIGluc3RhbGwuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1VPC9zdHJvbmc+LCA8c3Ryb25nPi0tdXBkYXRlPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKH40LjAwKykgVXBkYXRlIGFuIGV4aXN0aW5nIFNZU0xJTlVYL0VYVExJTlVYIGluc3RhbGwuICBJZiBubyBTeXNsaW51eA0KK2Jvb3QgbG9hZGVyIGlzIHByZXNlbnQsIHJldHVybiBhbiBlcnJvci4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LWg8L3N0cm9uZz4sIDxzdHJvbmc+LS1oZWxwPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorRGlzcGxheSBoZWxwL3VzYWdlIGluZm9ybWF0aW9uLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tdjwvc3Ryb25nPiwgPHN0cm9uZz4tLXZlcnNpb248L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitEaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQgaW1tZWRpYXRlbHkuDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfcmVndWxhcl9vcHRpb25zIj5SZWd1bGFyIE9wdGlvbnM8L2gzPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1hPC9zdHJvbmc+LCA8c3Ryb25nPi0tYWN0aXZlPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKERPUy9XaW4zMi9XaW42NCBPTkxZKSBNYXJrIHRoZSBpbnN0YWxsIHRhcmdldCBmaWxlIHN5c3RlbSYjODIxNztzIHBhcnRpdGlvbg0KK2FjdGl2ZS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LWQ8L3N0cm9uZz4sIDxzdHJvbmc+LS1kaXJlY3Rvcnk8L3N0cm9uZz4gPGVtPnN1YmRpcmVjdG9yeTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKE5vdCBuZWNlc3NhcnkgZm9yIGV4dGxpbnV4IGFzIGl0IGlzIGltcGxpZWQgYnkgPGVtPlBBVEg8L2VtPikgSW5zdGFsbCB0aGUNCis8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IGNvbnRyb2wgZmlsZXMgaW4gYSBzdWJkaXJlY3Rvcnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUNCisocmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IG9uIHRoZSBkZXZpY2UpLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tLWRldmljZTwvc3Ryb25nPiA8ZW0+REVWSUNFPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoZXh0bGludXggT05MWTsgNC4wNispIEZvcmNlIHVzZSBvZiBhIHNwZWNpZmljIGJsb2NrIGRldmljZSAoZXhwZXJ0cw0KK29ubHkpLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tZjwvc3Ryb25nPiwgPHN0cm9uZz4tLWZvcmNlPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorRm9yY2UgaW5zdGFsbCBldmVuIGlmIGl0IGFwcGVhcnMgdW5zYWZlLiAgQmVmb3JlIDQuMDAsIC1mIHdhcyB1c2VkIGZvcg0KKy0tb2Zmc2V0IGluIHRoZSBMaW51eCBpbnN0YWxsZXJzLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tSDwvc3Ryb25nPiwgPHN0cm9uZz4tLWhlYWRzPC9zdHJvbmc+IDxlbT5oZWFkLWNvdW50PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitPdmVycmlkZSB0aGUgZGV0ZWN0ZWQgbnVtYmVyIG9mIGhlYWRzIGZvciB0aGUgZ2VvbWV0cnkuICBTZWUgYWxzbw0KKzxzdHJvbmc+LS1zZWN0b3I8L3N0cm9uZz4uDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+LW08L3N0cm9uZz4sIDxzdHJvbmc+LS1tYnI8L3N0cm9uZz46DQorKERPUy9XaW4zMi9XaW42NCBPTkxZKSBJbnN0YWxsIHRoZSByZWd1bGFyIFN5c2xpbnV4IE1CUiBjb2RlIHRvIHRoZSBNQlIuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1NPC9zdHJvbmc+LCA8c3Ryb25nPi0tbWVudS1zYXZlPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDQuMDArOyBBRFYpIFNldCB0aGUgbGFiZWwgdG8gc2VsZWN0IGFzIGRlZmF1bHQgb24gdGhlIG5leHQgYm9vdC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LW88L3N0cm9uZz4sIDxzdHJvbmc+LS1vbmNlPC9zdHJvbmc+IDxlbT5jb21tYW5kPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoQURWKSBEZWNsYXJlIGEgYm9vdCBjb21tYW5kIHRvIGJlIHRyaWVkIG9uIHRoZSBmaXJzdCBib290IG9ubHkuICBUaGUNCit1c2Ugb2YgPHN0cm9uZz4tbzwvc3Ryb25nPiBmb3IgdGhlIExpbnV4IGluc3RhbGxlcnMgc3lzbGludXggb3Igc3lzbGludXgtbXRvb2xzIGhhcw0KK2JlZW4gZGVwcmVjYXRlZCBhcyBvZiB+NC4wMCBhbmQgaXMgbm8gbG9uZ2VyIHZhbGlkIGFzIG9mIH40LjAyLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tTzwvc3Ryb25nPiwgPHN0cm9uZz4tLWNsZWFyLW9uY2U8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitDbGVhciB0aGUgYm9vdC1vbmNlIGNvbW1hbmQuICBTZWUgYWxzbyA8c3Ryb25nPi0tb25jZTwvc3Ryb25nPi4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LXI8L3N0cm9uZz4sIDxzdHJvbmc+LS1yYWlkPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKEFEVikgUkFJRCBtb2RlLiAgSWYgYm9vdCBmYWlscywgdGVsbCB0aGUgQklPUyB0byBib290IHRoZSBuZXh0IGRldmljZQ0KK2luIHRoZSBib290IHNlcXVlbmNlICh1c3VhbGx5IHRoZSBuZXh0IGhhcmQgZGlzaykgaW5zdGVhZCBvZiBzdG9wcGluZw0KK3dpdGggYW4gZXJyb3IgbWVzc2FnZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBSQUlELTEgYm9vdGluZy4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LS1yZXNldC1hZHY8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoQURWKSBSZXNldCBhdXhpbGxpYXJ5IGRhdGEgdmVjdG9yLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tUzwvc3Ryb25nPiwgPHN0cm9uZz4tLXNlY3RvcnM8L3N0cm9uZz4gPGVtPnNlY3Rvci1jb3VudDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorT3ZlcnJpZGUgdGhlIGRldGVjdGVkIG51bWJlciBvZiBzZWN0b3JzIGZvciB0aGUgZ2VvbWV0cnkuICBTZWUgYWxzbw0KKzxzdHJvbmc+LS1oZWFkPC9zdHJvbmc+Lg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tczwvc3Ryb25nPiwgPHN0cm9uZz4tLXN0dXBpZDwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0luc3RhbGwgYSAic2FmZSwgc2xvdyBhbmQgc3R1cGlkIiB2ZXJzaW9uIG9mIDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4uIFRoaXMgdmVyc2lvbg0KK21heSB3b3JrIG9uIHNvbWUgdmVyeSBidWdneSBCSU9TZXMgb24gd2hpY2ggPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiB3b3VsZCBvdGhlcndpc2UNCitmYWlsLiBJZiB5b3UgZmluZCBhIG1hY2hpbmUgb24gd2hpY2ggdGhlIC1zIG9wdGlvbiBpcyByZXF1aXJlZCB0byBtYWtlDQoraXQgYm9vdCByZWxpYWJseSwgcGxlYXNlIHNlbmQgYXMgbXVjaCBpbmZvIGFib3V0IHlvdXIgbWFjaGluZSBhcyB5b3UNCitjYW4sIGFuZCBpbmNsdWRlIHRoZSBmYWlsdXJlIG1vZGUuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi10PC9zdHJvbmc+LCA8c3Ryb25nPi0tb2Zmc2V0PC9zdHJvbmc+IDxlbT5vZmZzZXQ8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyhMaW51eCBzeXNsaW51eC9zeXNsaW51eC1tdG9vbHMgT05MWSkgSW5kaWNhdGVzIHRoYXQgdGhlIGZpbGVzeXN0ZW0gaXMNCithdCBhbiBvZmZzZXQgZnJvbSB0aGUgYmFzZSBvZiB0aGUgZGV2aWNlIG9yIGZpbGUuDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+LXo8L3N0cm9uZz4sIDxzdHJvbmc+LS16aXBkcml2ZTwvc3Ryb25nPg0KK0Fzc3VtZSB6aXBkcml2ZSBnZW9tZXRyeSAoPGVtPi0taGVhZHMgNjQgLS1zZWN0b3JzIDMyPC9lbT4pLiAgU2VlIGFsc28gPHN0cm9uZz4tLWhlYWQ8L3N0cm9uZz4NCithbmQgPHN0cm9uZz4tLXNlY3Rvcjwvc3Ryb25nPi48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2V4YW1wbGVzIj5FWEFNUExFUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9ib290aW5nX2RvcyI+Qm9vdGluZyBET1M8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Rm9yIGJvb3RpbmcgRE9TIGFuZCBvdGhlciBzaW1pbGFyIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVyZSBpcyBhbiBlYXN5DQorYW5kIGdlbmVyYWxseSByZWxpYWJsZSBzb2x1dGlvbiB0byBzdWJzdGl0dXRlIGluIFNZU0xJTlVYIGFzIHRoZSBwcmltYXJ5DQorYm9vdCBsb2FkZXIuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InVsaXN0Ij48dWw+DQorPGxpPg0KKzxwPg0KK01ha2UgYSBET1MtYm9vdGFibGUgZGlzazsgIFRoZSBmb2xsb3dpbmcgYXJlIHBvc3NpYmxlIGNvbW1hbmRzOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+Zm9ybWF0IGE6IC9zDQorc3lzIGE6PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0NvcHkgdGhlIERPUyBib290IHNlY3RvciBvZmYgdXNpbmcgTGludXggb3IgY29weWJzLmNvbToNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmRkIGlmPS9kZXYvZmQwIG9mPWRvcy5ic3MgYnM9NTEyIGNvdW50PTENCitjb3B5YnMgYTogYTpkb3MuYnNzPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0luc3RhbGwgU1lTTElOVVggdXNpbmcgb25lIG9mOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+c3lzbGludXggYToNCitzeXNsaW51eCAvZGV2L2ZkMCAgICAgICAgICAgICAgIChiZWZvcmUgNC4wMCkNCitzeXNsaW51eCAtaSAvZGV2L2ZkMCAgICAgICAgICAgICg0LjAwKyk8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9saT4NCis8bGk+DQorPHA+DQorRm9yIExpbnV4LCBtb3VudCB0aGUgZGlzayBhbmQgY29weSB0aGUgZG9zLmJzcyB0byB0aGUgZGlzazoNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPm1vdW50IC10IG1zZG9zIC9kZXYvZmQwIC9tbnQNCitjcCBkb3MuYnNzIC9tbnQ8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9saT4NCis8bGk+DQorPHA+DQorQ29weSBhIExpbnV4IGtlcm5lbCBpbWFnZSBhbmQgaW5pdHJkIHBheWxvYWQgZmlsZXM6DQorPC9wPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkxpbnV4Ojwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyAgICAgICAgY3Agdm1saW51eCAvbW50DQorICAgICAgICBjcCBpbml0cmQuZ3ogL21udA0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5ET1MvV2luZG93czo8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisgICAgICAgIGNvcHkgdm1saW51eCBhOg0KKyAgICAgICAgY29weSBpbml0cmQuZ3ogYToNCis8L3A+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0ZvciBMaW51eCwgdW1vdW50IHRoZSBkaXNrIChpZiBhcHBsaWNhYmxlKToNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPnVtb3VudCAvbW50PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvbGk+DQorPC91bD48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfbWJyIj5NQlI8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SW4gb3JkZXIgdG8gYm9vdCBmcm9tIGEgaGFyZCBkaXNrIChvciBoYXJkIGRpc2stbGlrZSBkZXZpY2UpIGluIEJJT1MNCittb2RlLCBhbiBhcHByb3ByaWF0ZSBNQlIgYm9vdCBibG9jayBtdXN0IGFsc28gYmUgaW5zdGFsbGVkIGluIHRoZSBNQlINCisoZmlyc3Qgc2VjdG9yIG9yIDUxMiBieXRlcyBvZiB0aGUgZGlzayksIG9jY3VweWluZyBhdCBtb3N0IDQ0MCBieXRlcy48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RE9TL1dpbmRvd3M6PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSWYgdXNpbmcgRkRJU0ssIEZESVNLIG9yIGEgc2ltaWxhciBhcHBsaWNhdGlvbiBtdXN0IGFsc28gYmUgdXNlZCB0byBtYXJrDQordGhlIHBhcnRpdGlvbiBhcyBhY3RpdmUuDQorPC9wPg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4gICAgZmRpc2sgL21icg0KK09SDQorICAgIHN5c2xpbnV4IC1tYSBjOjwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5MaW51eDo8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+ZGQgYnM9NDQwIGNvdW50PTEgY29udj1ub3RydW5jIGlmPW1ici9tYnIuYmluIG9mPS9kZXYvc2RhPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Rm9yIGFsdG1ici5iaW4sIGFuIGVhc3kgd2F5IHRvIG92ZXJ3cml0ZSB0aGUgTUJSIGJvb3QgYmxvY2sgYW5kIHNwZWNpZnkNCit0aGUgcGFydGlvbiBudW1iZXIgaXM6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5wcmludGYgJ1wxJyB8IGNhdCBhbHRtYnIuYmluIC0gfCBkZCBicz00NDAgY291bnQ9MSBcDQorICBpZmxhZz1mdWxsYmxvY2sgY29udj1ub3RydW5jIG9mPS9kZXYvc2RhPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Tm90ZTogdXNpbmcgPGVtPmNhdDwvZW0+IGZvciB3cml0aW5nIHRoZSBNQlIgY2FuIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyBjYXVzZQ0KK2RhdGEgbG9zcyBvciBvdmVyd3JpdHRpbmcuICBGb3IgdGhpcyByZWFzb24sIHVzaW5nIDxlbT5kZDwvZW0+IGlzIHJlY29tbWVuZGVkDQorZm9yIGFsbCBzaXR1YXRpb25zLjwvcD48L2Rpdj4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX3NlZV9hbHNvIj5TRUUgQUxTTzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5zeXNsaW51eC5jZmc8L3N0cm9uZz4oNSksIDxzdHJvbmc+c3lzbGludXgtY2xpPC9zdHJvbmc+KDEpLCA8c3Ryb25nPmxpbG88L3N0cm9uZz4oOCksIDxzdHJvbmc+a2V5dGFiLWxpbG8ucGw8L3N0cm9uZz4oOCksDQorPHN0cm9uZz5mZGlzazwvc3Ryb25nPig4KSwgPHN0cm9uZz5ta2ZzPC9zdHJvbmc+KDgpLCA8c3Ryb25nPnN1cGVyZm9ybWF0PC9zdHJvbmc+KDEpLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYXV0aG9yIj5BVVRIT1I8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgQXNjaWlEb2MgZGVyaXZlZCBkb2N1bWVudCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsDQorPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBkb2N1bWVudGF0aW9uIGJ5IEguIFBldGVyIEFudmluICZsdDs8YSBocmVmPSJtYWlsdG86aHBhQHp5dG9yLmNvbSI+aHBhQHp5dG9yLmNvbTwvYT4mZ3Q7LiBUaGUgY29udmVyc2lvbiB0bw0KK2EgbWFucGFnZSB3YXMgbWFkZSBieSBBcnRodXIgS29ybiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmFydGh1ckBrb3JuLmNoIj5hcnRodXJAa29ybi5jaDwvYT4mZ3Q7LiAgVGhlIGNvbnZlcnNpb24gdG8NCithbiBBc2NpaURvYyB3YXMgbWFkZSBieSBHZW5lIEN1bW0gJmx0OzxhIGhyZWY9Im1haWx0bzpnZW5lLmN1bW1AZ21haWwuY29tIj5nZW5lLmN1bW1AZ21haWwuY29tPC9hPiZndDs8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2NvcHlyaWdodCI+Q09QWVJJR0hUPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Db3B5cmlnaHQgKEMpIDE5OTQtMjAxMiBILiBQZXRlciBBbnZpbi4gRnJlZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkDQordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdmVyc2lvbiAyDQorKEdQTHYyKSAob3IsIGF0IHlvdXIgb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbikuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3Rub3RlcyI+PGhyIC8+PC9kaXY+DQorPGRpdiBpZD0iZm9vdGVyIj4NCis8ZGl2IGlkPSJmb290ZXItdGV4dCI+DQorTGFzdCB1cGRhdGVkIDIwMTQtMDEtMTcgMTY6MDk6NTYgUFNUDQorPC9kaXY+DQorPC9kaXY+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9iaW9zL3V0aWxzL2dldGhvc3RpcCBiL2Jpb3MvdXRpbHMvZ2V0aG9zdGlwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzYjk4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL3V0aWxzL2dldGhvc3RpcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL3V0aWxzL2lzb2h5YnJpZCBiL2Jpb3MvdXRpbHMvaXNvaHlicmlkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhY2JiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL3V0aWxzL2lzb2h5YnJpZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL3V0aWxzL2lzb2h5YnJpZC5wbCBiL2Jpb3MvdXRpbHMvaXNvaHlicmlkLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjNWI4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL3V0aWxzL2lzb2h5YnJpZC5wbApAQCAtMCwwICsxLDM2MCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDItMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjCisjIFBvc3QtcHJvY2VzcyBhbiBJU08gOTY2MCBpbWFnZSBnZW5lcmF0ZWQgd2l0aCBta2lzb2ZzL2dlbmlzb2ltYWdlCisjIHRvIGFsbG93ICJoeWJyaWQgYm9vdGluZyIgYXMgYSBDRC1ST00gb3IgYXMgYSBoYXJkIGRpc2suCisjCisKK3VzZSBieXRlczsKK3VzZSBGY250bDsKKworIyBVc2VyLXNwZWNpZnlhYmxlIG9wdGlvbnMKKyVvcHQgPSAoCisgICAgIyBGYWtlIGdlb21ldHJ5ICh6aXBkcml2ZS1zdHlsZS4uLikKKyAgICAnaCcgICAgICA9PiA2NCwKKyAgICAncycgICAgICA9PiAzMiwKKyAgICAjIFBhcnRpdGlvbiBudW1iZXIKKyAgICAnZW50cnknICA9PiAxLAorICAgICMgUGFydGl0aW9uIG9mZnNldAorICAgICdvZmZzZXQnID0+IDAsCisgICAgIyBQYXJ0aXRpb24gdHlwZQorICAgICd0eXBlJyAgID0+IDB4MTcsCQkjICJXaW5kb3dzIGhpZGRlbiBJRlMiCisgICAgIyBNQlIgSUQKKyAgICAnaWQnICAgICA9PiB1bmRlZiwKKyk7CisKKyV2YWxpZF9yYW5nZSA9ICgKKyAgICAnaCcgICAgICA9PiBbMSwgMjU2XSwKKyAgICAncycgICAgICA9PiBbMSwgNjNdLAorICAgICdlbnRyeScgID0+IFsxLCA0XSwKKyAgICAnb2Zmc2V0JyA9PiBbMCwgNjRdLAorICAgICd0eXBlJyAgID0+IFswLCAyNTVdLAorICAgICdpZCcgICAgID0+IFswLCAweGZmZmZmZmZmXSwKKyAgICAnaGQwJyAgICA9PiBbMCwgMl0sCisgICAgJ3BhcnRvaycgPT4gWzAsIDFdLAorKTsKKworIyBCb29sZWFuIG9wdGlvbnMganVzdCBzZXQgb3RoZXIgb3B0aW9ucworJWJvb2xfb3B0ID0gKAorICAgICdub2hkMCcgICAgPT4gWydoZDAnLCAwXSwKKyAgICAnZm9yY2VoZDAnID0+IFsnaGQwJywgMV0sCisgICAgJ2N0cmxoZDAnICA9PiBbJ2hkMCcsIDJdLAorICAgICdub3BhcnRvaycgPT4gWydwYXJ0b2snLCAwXSwKKyAgICAncGFydG9rJyAgID0+IFsncGFydG9rJywgMV0sCispOworCitzdWIgdXNhZ2UoKSB7CisgICAgcHJpbnQgU1RERVJSICJVc2FnZTogJDAgW29wdGlvbnNdIGZpbGVuYW1lLmlzb1xuIiwKKyAgICAiT3B0aW9uczpcbiIsCisgICAgIiAgLWggICAgICAgICAgTnVtYmVyIG9mIGRlZmF1bHQgZ2VvbWV0cnkgaGVhZHNcbiIsCisgICAgIiAgLXMgICAgICAgICAgTnVtYmVyIG9mIGRlZmF1bHQgZ2VvbWV0cnkgc2VjdG9yc1xuIiwKKyAgICAiICAtZW50cnkgICAgICBTcGVjaWZ5IHBhcnRpdGlvbiBlbnRyeSBudW1iZXIgKDEtNClcbiIsCisgICAgIiAgLW9mZnNldCAgICAgU3BlY2lmeSBwYXJ0aXRpb24gb2Zmc2V0IChkZWZhdWx0IDApXG4iLAorICAgICIgIC10eXBlICAgICAgIFNwZWNpZnkgcGFydGl0aW9uIHR5cGUgKGRlZmF1bHQgMHgxNylcbiIsCisgICAgIiAgLWlkICAgICAgICAgU3BlY2lmeSBNQlIgSUQgKGRlZmF1bHQgcmFuZG9tKVxuIiwKKyAgICAiICAtZm9yY2VoZDAgICBBbHdheXMgYXNzdW1lIHdlIGFyZSBsb2FkZWQgYXMgZGlzayBJRCAwXG4iLAorICAgICIgIC1jdHJsaGQwICAgIEFzc3VtZSBkaXNrIElEIDAgaWYgdGhlIEN0cmwga2V5IGlzIHByZXNzZWRcbiIsCisgICAgIiAgLXBhcnRvayAgICAgQWxsb3cgYm9vdGluZyBmcm9tIHdpdGhpbiBhIHBhcnRpdGlvblxuIjsKKyAgICBleGl0IDE7Cit9CisKKyMgUGFyc2UgYSBDLXN0eWxlIGludGVnZXIgKGRlY2ltYWwvb2N0YWwvaGV4KQorc3ViIGRvaCgkKSB7CisgICAgbXkoJG4pID0gQF87CisgICAgcmV0dXJuICgkbiA9fiAvXjAvKSA/IG9jdCAkbiA6ICRuKzA7Cit9CisKK3N1YiBnZXRfcmFuZG9tKCkgeworICAgICMgR2V0IGEgMzItYml0IHJhbmRvbSBudW1iZXIKKyAgICBteSAkcmZkLCAkcm5kOworICAgIG15ICRyaWQ7CisKKyAgICBpZiAob3BlbigkcmZkLCAiPCAvZGV2L3VyYW5kb21cMCIpICYmIHJlYWQoJHJmZCwgJHJuZCwgNCkgPT0gNCkgeworCSRyaWQgPSB1bnBhY2soIlYiLCAkcm5kKTsKKyAgICB9CisKKyAgICBjbG9zZSgkcmZkKSBpZiAoZGVmaW5lZCgkcmZkKSk7CisgICAgcmV0dXJuICRyaWQgaWYgKGRlZmluZWQoJHJpZCkpOworCisgICAgIyBUaGlzIHN1Y2tzIGJ1dCBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nLi4uCisgICAgcmV0dXJuICgkJCt0aW1lKCkpICYgMHhmZmZmZmZmZjsKK30KKworc3ViIGdldF9oZXhfZGF0YSgpIHsKKyAgICBteSAkbWJyID0gJyc7CisgICAgbXkgJGxpbmUsICRieXRlOworICAgIHdoaWxlICggJGxpbmUgPSA8REFUQT4gKSB7CisJY2hvbXAgJGxpbmU7CisJbGFzdCBpZiAoJGxpbmUgZXEgJyonKTsKKwlmb3JlYWNoICRieXRlICggc3BsaXQoL1xzKy8sICRsaW5lKSApIHsKKwkgICAgJG1iciAuPSBjaHIoaGV4KCRieXRlKSk7CisJfQorICAgIH0KKyAgICByZXR1cm4gJG1icjsKK30KKword2hpbGUgKCRBUkdWWzBdID1+IC9eXC0oLiopJC8pIHsKKyAgICAkbyA9ICQxOworICAgIHNoaWZ0IEBBUkdWOworICAgIGlmIChkZWZpbmVkKCRib29sX29wdHskb30pKSB7CisJKCRvLCAkdikgPSBAeyRib29sX29wdHskb319OworCSRvcHR7JG99ID0gJHY7CisgICAgfSBlbHNpZiAoZXhpc3RzKCRvcHR7JG99KSkgeworCSRvcHR7JG99ID0gZG9oKHNoaWZ0IEBBUkdWKTsKKwlpZiAoZGVmaW5lZCgkdmFsaWRfcmFuZ2V7JG99KSkgeworCSAgICAoJGwsICRoKSA9IEB7JHZhbGlkX3JhbmdleyRvfX07CisJICAgIGlmICgkb3B0eyRvfSA8ICRsIHx8ICRvcHR7JG99ID4gJGgpIHsKKwkJZGllICIkMDogdmFsaWQgdmFsdWVzIGZvciB0aGUgLSRvIHBhcmFtZXRlciBhcmUgJGwgdG8gJGhcbiI7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKwl1c2FnZSgpOworICAgIH0KK30KKworKCRmaWxlKSA9IEBBUkdWOworCitpZiAoIWRlZmluZWQoJGZpbGUpKSB7CisgICAgdXNhZ2UoKTsKK30KKworb3BlbihGSUxFLCAiKzwgJGZpbGVcMCIpIG9yIGRpZSAiJDA6IGNhbm5vdCBvcGVuICRmaWxlOiAkIVxuIjsKK2Jpbm1vZGUgRklMRTsKKworIworIyBGaXJzdCwgYWN0dWFsbHkgZmlndXJlIG91dCB3aGVyZSBta2lzb2ZzIGhpZCBpc29saW51eC5iaW4KKyMKK3NlZWsoRklMRSwgMTcqMjA0OCwgU0VFS19TRVQpIG9yIGRpZSAiJDA6ICRmaWxlOiAkIVxuIjsKK3JlYWQoRklMRSwgJGJvb3RfcmVjb3JkLCAyMDQ4KSA9PSAyMDQ4IG9yIGRpZSAiJDA6ICRmaWxlOiByZWFkIGVycm9yXG4iOworKCRicl9zaWduLCAkYnJfY2F0X29mZnNldCkgPSB1bnBhY2soImE3MVYiLCAkYm9vdF9yZWNvcmQpOworaWYgKCRicl9zaWduIG5lICgiXDBDRDAwMVwxRUwgVE9SSVRPIFNQRUNJRklDQVRJT04iIC4gKCJcMCIgeCA0MSkpKSB7CisgICAgZGllICIkMDogJGZpbGU6IG5vIGJvb3QgcmVjb3JkIGZvdW5kXG4iOworfQorc2VlayhGSUxFLCAkYnJfY2F0X29mZnNldCoyMDQ4LCBTRUVLX1NFVCkgb3IgZGllICIkMDogJGZpbGU6ICQhXG4iOworcmVhZChGSUxFLCAkYm9vdF9jYXQsIDIwNDgpID09IDIwNDggb3IgZGllICIkMDogJGZpbGU6IHJlYWQgZXJyb3JcbiI7CisKKyMgV2UgbXVzdCBoYXZlIGEgVmFsaWRhdGlvbiBFbnRyeSBmb2xsb3dlZCBieSBhIERlZmF1bHQgRW50cnkuLi4KKyMgbm8gZmFuY2luZXNzIGFsbG93ZWQgZm9yIHRoZSBIeWJyaWQgbW9kZSBbWFhYOiBtaWdodCByZWxheCB0aGlzIGxhdGVyXQorQHZlID0gdW5wYWNrKCJ2MTYiLCAkYm9vdF9jYXQpOworJGNzID0gMDsKK2ZvciAoJGkgPSAwOyAkaSA8IDE2OyAkaSsrKSB7CisgICAgJGNzICs9ICR2ZVskaV07Cit9CitpZiAoJHZlWzBdICE9IDB4MDAwMSB8fCAkdmVbMTVdICE9IDB4YWE1NSB8fCAkY3MgJiAweGZmZmYpIHsKKyAgICBkaWUgIiQwOiAkZmlsZTogaW52YWxpZCBib290IGNhdGFsb2dcbiI7Cit9CisoJGRlX2Jvb3QsICRkZV9tZWRpYSwgJGRlX3NlZywgJGRlX3N5cywgJGRlX21iejEsICRkZV9jb3VudCwgCisgJGRlX2xiYSwgJGRlX21iejIpID0gdW5wYWNrKCJDQ3ZDQ3ZWdiIsIHN1YnN0cigkYm9vdF9jYXQsIDMyLCAzMikpOworaWYgKCRkZV9ib290ICE9IDB4ODggfHwgJGRlX21lZGlhICE9IDAgfHwKKyAgICAoJGRlX3NlZ21lbnQgIT0gMCAmJiAkZGVfc2VnbWVudCAhPSAweDdjMCkgfHwgJGRlX2NvdW50ICE9IDQpIHsKKyAgICBkaWUgIiQwOiAkZmlsZTogdW5leHBlY3RlZCBib290IGNhdGFsb2cgcGFyYW1ldGVyc1xuIjsKK30KKworIyBOb3cgJGRlX2xiYSBzaG91bGQgY29udGFpbiB0aGUgQ0Qgc2VjdG9yIG51bWJlciBmb3IgaXNvbGludXguYmluCitzZWVrKEZJTEUsICRkZV9sYmEqMjA0OCsweDQwLCBTRUVLX1NFVCkgb3IgZGllICIkMDogJGZpbGU6ICQhXG4iOworcmVhZChGSUxFLCAkaWJzaWcsIDQpOworaWYgKCRpYnNpZyBuZSAiXHhmYlx4YzBceDc4XHg3MCIpIHsKKyAgICBkaWUgIiQwOiAkZmlsZTogYm9vdGxvYWRlciBkb2VzIG5vdCBoYXZlIGEgaXNvbGludXguYmluIGh5YnJpZCBzaWduYXR1cmUuIi4KKyAgICAgICAgIk5vdGUgdGhhdCBpc29saW51eC1kZWJ1Zy5iaW4gZG9lcyBub3Qgc3VwcG9ydCBoeWJyaWQgYm9vdGluZy5cbiI7Cit9CisKKyMgR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBpbWFnZQorKEBpbWdzdGF0ID0gc3RhdChGSUxFKSkgb3IgZGllICIkMDogJGZpbGU6ICQhXG4iOworJGltZ3NpemUgPSAkaW1nc3RhdFs3XTsKK2lmICghJGltZ3NpemUpIHsKKyAgICBkaWUgIiQwOiAkZmlsZTogY2Fubm90IGRldGVybWluZSBsZW5ndGggb2YgZmlsZVxuIjsKK30KKyMgVGFyZ2V0IGltYWdlIHNpemU6IHJvdW5kIHVwIHRvIGEgbXVsdGlwbGUgb2YgJGgqJHMqNTEyCiskaCA9ICRvcHR7J2gnfTsKKyRzID0gJG9wdHsncyd9OworJGN5bHNpemUgPSAkaCokcyo1MTI7CiskZnJhYyA9ICRpbWdzaXplICUgJGN5bHNpemU7CiskcGFkZGluZyA9ICgkZnJhYyA+IDApID8gJGN5bHNpemUgLSAkZnJhYyA6IDA7CiskaW1nc2l6ZSArPSAkcGFkZGluZzsKKyRjID0gaW50KCRpbWdzaXplLyRjeWxzaXplKTsKK2lmICgkYyA+IDEwMjQpIHsKKyAgICBwcmludCBTVERFUlIgIldhcm5pbmc6IG1vcmUgdGhhbiAxMDI0IGN5bGluZGVycyAoJGMpLlxuIjsKKyAgICBwcmludCBTVERFUlIgIk5vdCBhbGwgQklPU2VzIHdpbGwgYmUgYWJsZSB0byBib290IHRoaXMgZGV2aWNlLlxuIjsKKyAgICAkY2MgPSAxMDI0OworfSBlbHNlIHsKKyAgICAkY2MgPSAkYzsKK30KKworIyBQcmVzZXJ2ZSBpZCB3aGVuIHJ1biBhZ2FpbgoraWYgKGRlZmluZWQoJG9wdHsnaWQnfSkpIHsKKyAgICAkaWQgPSBwYWNrKCJWIiwgZG9oKCRvcHR7J2lkJ30pKTsKK30gZWxzZSB7CisgICAgc2VlayhGSUxFLCA0NDAsIFNFRUtfU0VUKSBvciBkaWUgIiQwOiAkZmlsZTogJCFcbiI7CisgICAgcmVhZChGSUxFLCAkaWQsIDQpOworICAgIGlmICgkaWQgZXEgIlx4MDBceDAwXHgwMFx4MDAiKSB7CisJJGlkID0gcGFjaygiViIsIGdldF9yYW5kb20oKSk7CisgICAgfQorfQorCisjIFByaW50IHRoZSBNQlIgYW5kIHBhcnRpdGlvbiB0YWJsZQorc2VlayhGSUxFLCAwLCBTRUVLX1NFVCkgb3IgZGllICIkMDogJGZpbGU6ICQhXG4iOworCitmb3IgKCRpID0gMDsgJGkgPD0gJG9wdHsnaGQwJ30rMyokb3B0eydwYXJ0b2snfTsgJGkrKykgeworICAgICRtYnIgPSBnZXRfaGV4X2RhdGEoKTsKK30KK2lmICggbGVuZ3RoKCRtYnIpID4gNDMyICkgeworICAgIGRpZSAiJDA6IEJhZCBNQlIgY29kZVxuIjsKK30KKworJG1iciAuPSAiXDAiIHggKDQzMiAtIGxlbmd0aCgkbWJyKSk7CisKKyRtYnIgLj0gcGFjaygiVlYiLCAkZGVfbGJhKjQsIDApOyAJIyBPZmZzZXQgNDMyOiBMQkEgb2YgaXNvbGludXguYmluCiskbWJyIC49ICRpZDsJCQkJIyBPZmZzZXQgNDQwOiBNQlIgSUQKKyRtYnIgLj0gIlwwXDAiOwkJCQkjIE9mZnNldCA0NDY6IGFjdHVhbCBwYXJ0aXRpb24gdGFibGUKKworIyBQcmludCBwYXJ0aXRpb24gdGFibGUKKyRvZmZzZXQgID0gJG9wdHsnb2Zmc2V0J307CiskcHNpemUgICA9ICRjKiRoKiRzIC0gJG9mZnNldDsKKyRiaGVhZCAgID0gaW50KCRvZmZzZXQvJHMpICUgJGg7CiskYnNlY3QgICA9ICgkb2Zmc2V0ICUgJHMpICsgMTsKKyRiY3lsICAgID0gaW50KCRvZmZzZXQvKCRoKiRzKSk7CiskYnNlY3QgICs9ICgkYmN5bCAmIDB4MzAwKSA+PiAyOworJGJjeWwgICAmPSAweGZmOworJGVoZWFkICAgPSAkaC0xOworJGVzZWN0ICAgPSAkcyArICgoKCRjYy0xKSAmIDB4MzAwKSA+PiAyKTsKKyRlY3lsICAgID0gKCRjYy0xKSAmIDB4ZmY7CiskZnN0eXBlICA9ICRvcHR7J3R5cGUnfTsJIyBQYXJ0aXRpb24gdHlwZQorJHBlbnRyeSAgPSAkb3B0eydlbnRyeSd9OwkjIFBhcnRpdGlvbiBzbG90CisKK2ZvciAoICRpID0gMSA7ICRpIDw9IDQgOyAkaSsrICkgeworICAgIGlmICggJGkgPT0gJHBlbnRyeSApIHsKKwkkbWJyIC49IHBhY2soIkNDQ0NDQ0NDVlYiLCAweDgwLCAkYmhlYWQsICRic2VjdCwgJGJjeWwsICRmc3R5cGUsCisJCSAgICAgJGVoZWFkLCAkZXNlY3QsICRlY3lsLCAkb2Zmc2V0LCAkcHNpemUpOworICAgIH0gZWxzZSB7CisJJG1iciAuPSAiXDAiIHggMTY7CisgICAgfQorfQorJG1iciAuPSAiXHg1NVx4YWEiOworCitwcmludCBGSUxFICRtYnI7CisKKyMgUGFkIHRoZSBpbWFnZSB0byBhIGZha2UgY3lsaW5kZXIgYm91bmRhcnkKK3NlZWsoRklMRSwgJGltZ3N0YXRbN10sIFNFRUtfU0VUKSBvciBkaWUgIiQwOiAkZmlsZTogJCFcbiI7CitpZiAoJHBhZGRpbmcpIHsKKyAgICBwcmludCBGSUxFICJcMCIgeCAkcGFkZGluZzsKK30KKworIyBEb25lLi4uCitjbG9zZShGSUxFKTsKKworZXhpdCAwOworX19FTkRfXworMzMgZWQgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAKKzkwIDkwIDkwIDkwIDkwIDkwIDkwIDMzIGVkIGZhIDhlIGQ1IGJjIDAgN2MgZmIgZmMgNjYgMzEgZGIgNjYgMzEgYzkgNjYgNTMKKzY2IDUxIDYgNTcgOGUgZGQgOGUgYzUgNTIgYmUgMCA3YyBiZiAwIDYgYjkgMCAxIGYzIGE1IGVhIDRiIDYgMCAwIDUyIGI0IDQxCitiYiBhYSA1NSAzMSBjOSAzMCBmNiBmOSBjZCAxMyA3MiAxNiA4MSBmYiA1NSBhYSA3NSAxMCA4MyBlMSAxIDc0IGIgNjYgYzcgNgorZjEgNiBiNCA0MiBlYiAxNSBlYiAwIDVhIDUxIGI0IDggY2QgMTMgODMgZTEgM2YgNWIgNTEgZiBiNiBjNiA0MCA1MCBmNyBlMQorNTMgNTIgNTAgYmIgMCA3YyBiOSA0IDAgNjYgYTEgYjAgNyBlOCA0NCAwIGYgODIgODAgMCA2NiA0MCA4MCBjNyAyIGUyIGYyIDY2Cis4MSAzZSA0MCA3YyBmYiBjMCA3OCA3MCA3NSA5IGZhIGJjIGVjIDdiIGVhIDQ0IDdjIDAgMCBlOCA4MyAwIDY5IDczIDZmIDZjCis2OSA2ZSA3NSA3OCAyZSA2MiA2OSA2ZSAyMCA2ZCA2OSA3MyA3MyA2OSA2ZSA2NyAyMCA2ZiA3MiAyMCA2MyA2ZiA3MiA3MiA3NQorNzAgNzQgMmUgZCBhIDY2IDYwIDY2IDMxIGQyIDY2IDMgNiBmOCA3YiA2NiAxMyAxNiBmYyA3YiA2NiA1MiA2NiA1MCA2IDUzIDZhCisxIDZhIDEwIDg5IGU2IDY2IGY3IDM2IGU4IDdiIGMwIGU0IDYgODggZTEgODggYzUgOTIgZjYgMzYgZWUgN2IgODggYzYgOCBlMQorNDEgYjggMSAyIDhhIDE2IGYyIDdiIGNkIDEzIDhkIDY0IDEwIDY2IDYxIGMzIGU4IDFlIDAgNGYgNzAgNjUgNzIgNjEgNzQgNjkKKzZlIDY3IDIwIDczIDc5IDczIDc0IDY1IDZkIDIwIDZjIDZmIDYxIDY0IDIwIDY1IDcyIDcyIDZmIDcyIDJlIGQgYSA1ZSBhYyBiNAorZSA4YSAzZSA2MiA0IGIzIDcgY2QgMTAgM2MgYSA3NSBmMSBjZCAxOCBmNCBlYiBmZCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAorMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAorMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAorMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIAorKgorMzMgZWQgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAKKzkwIDkwIDkwIDkwIDkwIDkwIDkwIDMzIGVkIGZhIDhlIGQ1IGJjIDAgN2MgZmIgZmMgNjYgMzEgZGIgNjYgMzEgYzkgNjYgNTMKKzY2IDUxIDYgNTcgOGUgZGQgOGUgYzUgYjIgODAgNTIgYmUgMCA3YyBiZiAwIDYgYjkgMCAxIGYzIGE1IGVhIDRkIDYgMCAwIDUyCitiNCA0MSBiYiBhYSA1NSAzMSBjOSAzMCBmNiBmOSBjZCAxMyA3MiAxNiA4MSBmYiA1NSBhYSA3NSAxMCA4MyBlMSAxIDc0IGIgNjYKK2M3IDYgZjMgNiBiNCA0MiBlYiAxNSBlYiAwIDVhIDUxIGI0IDggY2QgMTMgODMgZTEgM2YgNWIgNTEgZiBiNiBjNiA0MCA1MCBmNworZTEgNTMgNTIgNTAgYmIgMCA3YyBiOSA0IDAgNjYgYTEgYjAgNyBlOCA0NCAwIGYgODIgODAgMCA2NiA0MCA4MCBjNyAyIGUyIGYyCis2NiA4MSAzZSA0MCA3YyBmYiBjMCA3OCA3MCA3NSA5IGZhIGJjIGVjIDdiIGVhIDQ0IDdjIDAgMCBlOCA4MyAwIDY5IDczIDZmCis2YyA2OSA2ZSA3NSA3OCAyZSA2MiA2OSA2ZSAyMCA2ZCA2OSA3MyA3MyA2OSA2ZSA2NyAyMCA2ZiA3MiAyMCA2MyA2ZiA3MiA3MgorNzUgNzAgNzQgMmUgZCBhIDY2IDYwIDY2IDMxIGQyIDY2IDMgNiBmOCA3YiA2NiAxMyAxNiBmYyA3YiA2NiA1MiA2NiA1MCA2IDUzCis2YSAxIDZhIDEwIDg5IGU2IDY2IGY3IDM2IGU4IDdiIGMwIGU0IDYgODggZTEgODggYzUgOTIgZjYgMzYgZWUgN2IgODggYzYgOAorZTEgNDEgYjggMSAyIDhhIDE2IGYyIDdiIGNkIDEzIDhkIDY0IDEwIDY2IDYxIGMzIGU4IDFlIDAgNGYgNzAgNjUgNzIgNjEgNzQKKzY5IDZlIDY3IDIwIDczIDc5IDczIDc0IDY1IDZkIDIwIDZjIDZmIDYxIDY0IDIwIDY1IDcyIDcyIDZmIDcyIDJlIGQgYSA1ZSBhYworYjQgZSA4YSAzZSA2MiA0IGIzIDcgY2QgMTAgM2MgYSA3NSBmMSBjZCAxOCBmNCBlYiBmZCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKKzAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKKzAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKKzAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgCisqCiszMyBlZCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MAorOTAgOTAgOTAgOTAgOTAgOTAgOTAgMzMgZWQgZmEgOGUgZDUgYmMgMCA3YyBmYiBmYyA2NiAzMSBkYiA2NiAzMSBjOSA2NiA1MworNjYgNTEgNiA1NyA4ZSBkZCA4ZSBjNSA2MCBiNCAyIGNkIDE2IGE4IDQgNjEgNzQgMiBiMiA4MCA1MiBiZSAwIDdjIGJmIDAgNgorYjkgMCAxIGYzIGE1IGVhIDU3IDYgMCAwIDUyIGI0IDQxIGJiIGFhIDU1IDMxIGM5IDMwIGY2IGY5IGNkIDEzIDcyIDE2IDgxIGZiCis1NSBhYSA3NSAxMCA4MyBlMSAxIDc0IGIgNjYgYzcgNiBmZCA2IGI0IDQyIGViIDE1IGViIDAgNWEgNTEgYjQgOCBjZCAxMyA4MworZTEgM2YgNWIgNTEgZiBiNiBjNiA0MCA1MCBmNyBlMSA1MyA1MiA1MCBiYiAwIDdjIGI5IDQgMCA2NiBhMSBiMCA3IGU4IDQ0IDAKK2YgODIgODAgMCA2NiA0MCA4MCBjNyAyIGUyIGYyIDY2IDgxIDNlIDQwIDdjIGZiIGMwIDc4IDcwIDc1IDkgZmEgYmMgZWMgN2IKK2VhIDQ0IDdjIDAgMCBlOCA4MyAwIDY5IDczIDZmIDZjIDY5IDZlIDc1IDc4IDJlIDYyIDY5IDZlIDIwIDZkIDY5IDczIDczIDY5Cis2ZSA2NyAyMCA2ZiA3MiAyMCA2MyA2ZiA3MiA3MiA3NSA3MCA3NCAyZSBkIGEgNjYgNjAgNjYgMzEgZDIgNjYgMyA2IGY4IDdiCis2NiAxMyAxNiBmYyA3YiA2NiA1MiA2NiA1MCA2IDUzIDZhIDEgNmEgMTAgODkgZTYgNjYgZjcgMzYgZTggN2IgYzAgZTQgNiA4OAorZTEgODggYzUgOTIgZjYgMzYgZWUgN2IgODggYzYgOCBlMSA0MSBiOCAxIDIgOGEgMTYgZjIgN2IgY2QgMTMgOGQgNjQgMTAgNjYKKzYxIGMzIGU4IDFlIDAgNGYgNzAgNjUgNzIgNjEgNzQgNjkgNmUgNjcgMjAgNzMgNzkgNzMgNzQgNjUgNmQgMjAgNmMgNmYgNjEKKzY0IDIwIDY1IDcyIDcyIDZmIDcyIDJlIGQgYSA1ZSBhYyBiNCBlIDhhIDNlIDYyIDQgYjMgNyBjZCAxMCAzYyBhIDc1IGYxIGNkCisxOCBmNCBlYiBmZCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCiswIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCiswIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgCisqCiszMyBlZCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MAorOTAgOTAgOTAgOTAgOTAgOTAgOTAgMzMgZWQgZmEgOGUgZDUgYmMgMCA3YyBmYiBmYyA2NiAzMSBkYiA2NiAzMSBjOSAyMSBmNgorNzQgMjYgZjYgNCA3ZiA3NSAyMSAzOCA0YyA0IDc0IDFjIDY2IDNkIDIxIDQ3IDUwIDU4IDc1IDEwIDgwIDdjIDQgZWQgNzUgYQorNjYgOGIgNGMgMzQgNjYgOGIgNWMgMzggZWIgNCA2NiA4YiA0YyA4IDY2IDUzIDY2IDUxIDYgNTcgOGUgZGQgOGUgYzUgNTIgYmUKKzAgN2MgYmYgMCA2IGI5IDAgMSBmMyBhNSBlYSA3NSA2IDAgMCA1MiBiNCA0MSBiYiBhYSA1NSAzMSBjOSAzMCBmNiBmOSBjZCAxMworNzIgMTYgODEgZmIgNTUgYWEgNzUgMTAgODMgZTEgMSA3NCBiIDY2IGM3IDYgMWIgNyBiNCA0MiBlYiAxNSBlYiAwIDVhIDUxIGI0Cis4IGNkIDEzIDgzIGUxIDNmIDViIDUxIGYgYjYgYzYgNDAgNTAgZjcgZTEgNTMgNTIgNTAgYmIgMCA3YyBiOSA0IDAgNjYgYTEgYjAKKzcgZTggNDQgMCBmIDgyIDgwIDAgNjYgNDAgODAgYzcgMiBlMiBmMiA2NiA4MSAzZSA0MCA3YyBmYiBjMCA3OCA3MCA3NSA5IGZhCitiYyBlYyA3YiBlYSA0NCA3YyAwIDAgZTggODMgMCA2OSA3MyA2ZiA2YyA2OSA2ZSA3NSA3OCAyZSA2MiA2OSA2ZSAyMCA2ZCA2OQorNzMgNzMgNjkgNmUgNjcgMjAgNmYgNzIgMjAgNjMgNmYgNzIgNzIgNzUgNzAgNzQgMmUgZCBhIDY2IDYwIDY2IDMxIGQyIDY2IDMKKzYgZjggN2IgNjYgMTMgMTYgZmMgN2IgNjYgNTIgNjYgNTAgNiA1MyA2YSAxIDZhIDEwIDg5IGU2IDY2IGY3IDM2IGU4IDdiIGMwCitlNCA2IDg4IGUxIDg4IGM1IDkyIGY2IDM2IGVlIDdiIDg4IGM2IDggZTEgNDEgYjggMSAyIDhhIDE2IGYyIDdiIGNkIDEzIDhkCis2NCAxMCA2NiA2MSBjMyBlOCAxZSAwIDRmIDcwIDY1IDcyIDYxIDc0IDY5IDZlIDY3IDIwIDczIDc5IDczIDc0IDY1IDZkIDIwCis2YyA2ZiA2MSA2NCAyMCA2NSA3MiA3MiA2ZiA3MiAyZSBkIGEgNWUgYWMgYjQgZSA4YSAzZSA2MiA0IGIzIDcgY2QgMTAgM2MgYQorNzUgZjEgY2QgMTggZjQgZWIgZmQgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKKzAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgCisqCiszMyBlZCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MAorOTAgOTAgOTAgOTAgOTAgOTAgOTAgMzMgZWQgZmEgOGUgZDUgYmMgMCA3YyBmYiBmYyA2NiAzMSBkYiA2NiAzMSBjOSAyMSBmNgorNzQgMjYgZjYgNCA3ZiA3NSAyMSAzOCA0YyA0IDc0IDFjIDY2IDNkIDIxIDQ3IDUwIDU4IDc1IDEwIDgwIDdjIDQgZWQgNzUgYQorNjYgOGIgNGMgMzQgNjYgOGIgNWMgMzggZWIgNCA2NiA4YiA0YyA4IDY2IDUzIDY2IDUxIDYgNTcgOGUgZGQgOGUgYzUgYjIgODAKKzUyIGJlIDAgN2MgYmYgMCA2IGI5IDAgMSBmMyBhNSBlYSA3NyA2IDAgMCA1MiBiNCA0MSBiYiBhYSA1NSAzMSBjOSAzMCBmNiBmOQorY2QgMTMgNzIgMTYgODEgZmIgNTUgYWEgNzUgMTAgODMgZTEgMSA3NCBiIDY2IGM3IDYgMWQgNyBiNCA0MiBlYiAxNSBlYiAwIDVhCis1MSBiNCA4IGNkIDEzIDgzIGUxIDNmIDViIDUxIGYgYjYgYzYgNDAgNTAgZjcgZTEgNTMgNTIgNTAgYmIgMCA3YyBiOSA0IDAgNjYKK2ExIGIwIDcgZTggNDQgMCBmIDgyIDgwIDAgNjYgNDAgODAgYzcgMiBlMiBmMiA2NiA4MSAzZSA0MCA3YyBmYiBjMCA3OCA3MCA3NQorOSBmYSBiYyBlYyA3YiBlYSA0NCA3YyAwIDAgZTggODMgMCA2OSA3MyA2ZiA2YyA2OSA2ZSA3NSA3OCAyZSA2MiA2OSA2ZSAyMAorNmQgNjkgNzMgNzMgNjkgNmUgNjcgMjAgNmYgNzIgMjAgNjMgNmYgNzIgNzIgNzUgNzAgNzQgMmUgZCBhIDY2IDYwIDY2IDMxIGQyCis2NiAzIDYgZjggN2IgNjYgMTMgMTYgZmMgN2IgNjYgNTIgNjYgNTAgNiA1MyA2YSAxIDZhIDEwIDg5IGU2IDY2IGY3IDM2IGU4Cis3YiBjMCBlNCA2IDg4IGUxIDg4IGM1IDkyIGY2IDM2IGVlIDdiIDg4IGM2IDggZTEgNDEgYjggMSAyIDhhIDE2IGYyIDdiIGNkCisxMyA4ZCA2NCAxMCA2NiA2MSBjMyBlOCAxZSAwIDRmIDcwIDY1IDcyIDYxIDc0IDY5IDZlIDY3IDIwIDczIDc5IDczIDc0IDY1Cis2ZCAyMCA2YyA2ZiA2MSA2NCAyMCA2NSA3MiA3MiA2ZiA3MiAyZSBkIGEgNWUgYWMgYjQgZSA4YSAzZSA2MiA0IGIzIDcgY2QgMTAKKzNjIGEgNzUgZjEgY2QgMTggZjQgZWIgZmQgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKKzAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAKKyoKKzMzIGVkIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwCis5MCA5MCA5MCA5MCA5MCA5MCA5MCAzMyBlZCBmYSA4ZSBkNSBiYyAwIDdjIGZiIGZjIDY2IDMxIGRiIDY2IDMxIGM5IDIxIGY2Cis3NCAyNiBmNiA0IDdmIDc1IDIxIDM4IDRjIDQgNzQgMWMgNjYgM2QgMjEgNDcgNTAgNTggNzUgMTAgODAgN2MgNCBlZCA3NSBhCis2NiA4YiA0YyAzNCA2NiA4YiA1YyAzOCBlYiA0IDY2IDhiIDRjIDggNjYgNTMgNjYgNTEgNiA1NyA4ZSBkZCA4ZSBjNSA2MCBiNAorMiBjZCAxNiBhOCA0IDYxIDc0IDIgYjIgODAgNTIgYmUgMCA3YyBiZiAwIDYgYjkgMCAxIGYzIGE1IGVhIDgxIDYgMCAwIDUyIGI0Cis0MSBiYiBhYSA1NSAzMSBjOSAzMCBmNiBmOSBjZCAxMyA3MiAxNiA4MSBmYiA1NSBhYSA3NSAxMCA4MyBlMSAxIDc0IGIgNjYgYzcKKzYgMjcgNyBiNCA0MiBlYiAxNSBlYiAwIDVhIDUxIGI0IDggY2QgMTMgODMgZTEgM2YgNWIgNTEgZiBiNiBjNiA0MCA1MCBmNyBlMQorNTMgNTIgNTAgYmIgMCA3YyBiOSA0IDAgNjYgYTEgYjAgNyBlOCA0NCAwIGYgODIgODAgMCA2NiA0MCA4MCBjNyAyIGUyIGYyIDY2Cis4MSAzZSA0MCA3YyBmYiBjMCA3OCA3MCA3NSA5IGZhIGJjIGVjIDdiIGVhIDQ0IDdjIDAgMCBlOCA4MyAwIDY5IDczIDZmIDZjCis2OSA2ZSA3NSA3OCAyZSA2MiA2OSA2ZSAyMCA2ZCA2OSA3MyA3MyA2OSA2ZSA2NyAyMCA2ZiA3MiAyMCA2MyA2ZiA3MiA3MiA3NQorNzAgNzQgMmUgZCBhIDY2IDYwIDY2IDMxIGQyIDY2IDMgNiBmOCA3YiA2NiAxMyAxNiBmYyA3YiA2NiA1MiA2NiA1MCA2IDUzIDZhCisxIDZhIDEwIDg5IGU2IDY2IGY3IDM2IGU4IDdiIGMwIGU0IDYgODggZTEgODggYzUgOTIgZjYgMzYgZWUgN2IgODggYzYgOCBlMQorNDEgYjggMSAyIDhhIDE2IGYyIDdiIGNkIDEzIDhkIDY0IDEwIDY2IDYxIGMzIGU4IDFlIDAgNGYgNzAgNjUgNzIgNjEgNzQgNjkKKzZlIDY3IDIwIDczIDc5IDczIDc0IDY1IDZkIDIwIDZjIDZmIDYxIDY0IDIwIDY1IDcyIDcyIDZmIDcyIDJlIGQgYSA1ZSBhYyBiNAorZSA4YSAzZSA2MiA0IGIzIDcgY2QgMTAgM2MgYSA3NSBmMSBjZCAxOCBmNCBlYiBmZCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAorMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAKKyoKZGlmZiAtLWdpdCBhL2Jpb3MvdXRpbHMvbWVtZGlza2ZpbmQgYi9iaW9zL3V0aWxzL21lbWRpc2tmaW5kCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0YThjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL3V0aWxzL21lbWRpc2tmaW5kCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpb3MvdXRpbHMvbWtkaXNraW1hZ2UgYi9iaW9zL3V0aWxzL21rZGlza2ltYWdlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3YmE3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL3V0aWxzL21rZGlza2ltYWdlCkBAIC0wLDAgKzEsMzM5IEBACisjIS91c3IvYmluL3BlcmwKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMjAwMi0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMgICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIworIyBDcmVhdGVzIGEgYmxhbmsgTVMtRE9TIGZvcm1hdHRlZCBoYXJkIGRpc2sgaW1hZ2UKKyMKKwordXNlIGJ5dGVzOwordXNlIGludGVnZXI7Cit1c2UgRmNudGw7Cit1c2UgRXJybm87Cit1c2UgQ3dkOwordXNlIElPOjpIYW5kbGU7CQkJIyBGb3IgZmx1c2goKQorCitzdWIgYWJzb2x1dGVfcGF0aCgkKSB7CisgICAgbXkoJGYpID0gQF87CisgICAgbXkoJGMpOworCisgICAgcmV0dXJuICRmIGlmICggJGYgPX4gL15cLy8gKTsKKyAgICAkYyA9IGN3ZCgpOworICAgICRjID0gJycgaWYgKCAkYyBlcSAnLycgKTsKKyAgICByZXR1cm4gJGMuJy8nLiRmOworfQorCitzdWIgaXNfbGludXgoKSB7CisgICAgcmV0dXJuICEhZXZhbCAneyAnLgorCSd1c2UgUE9TSVg7ICcuCisJJygkc3lzbmFtZSwgJG5vZGVuYW1lLCAkcmVsZWFzZSwgJHZlcnNpb24sICRtYWNoaW5lKSA9IFBPU0lYOjp1bmFtZSgpOyAnLgorCSJyZXR1cm4gXCRzeXNuYW1lIGVxIFwnTGludXhcJzsgfSI7Cit9CisKK3N1YiBnZXRfcmFuZG9tKCkgeworICAgICMgR2V0IGEgMzItYml0IHJhbmRvbSBudW1iZXIKKyAgICBteSAkcmZkLCAkcm5kOworICAgIG15ICRyaWQ7CisKKyAgICBpZiAob3BlbigkcmZkLCAiPCAvZGV2L3VyYW5kb21cMCIpICYmIHJlYWQoJHJmZCwgJHJuZCwgNCkgPT0gNCkgeworCSRyaWQgPSB1bnBhY2soIlYiLCAkcm5kKTsKKyAgICB9CisKKyAgICBjbG9zZSgkcmZkKSBpZiAoZGVmaW5lZCgkcmZkKSk7CisgICAgcmV0dXJuICRyaWQgaWYgKGRlZmluZWQoJHJpZCkpOworCisgICAgIyBUaGlzIHN1Y2tzIGJ1dCBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nLi4uCisgICAgcmV0dXJuICgkJCt0aW1lKCkpICYgMHhmZmZmZmZmZjsKK30KKworc3ViIGdldF9oZXhfZGF0YSgpIHsKKyAgICBteSAkbWJyID0gJyc7CisgICAgbXkgJGxpbmUsICRieXRlOworICAgIHdoaWxlICggJGxpbmUgPSA8REFUQT4gKSB7CisJY2hvbXAgJGxpbmU7CisJbGFzdCBpZiAoJGxpbmUgZXEgJyonKTsKKwlmb3JlYWNoICRieXRlICggc3BsaXQoL1xzKy8sICRsaW5lKSApIHsKKwkgICAgJG1iciAuPSBjaHIoaGV4KCRieXRlKSk7CisJfQorICAgIH0KKyAgICByZXR1cm4gJG1icjsKK30KKworJGlzX2xpbnV4ID0gaXNfbGludXgoKTsKK2lmICggJGlzX2xpbnV4ICkgeworICAgICMgSU9DVEwgbnVtYmVycworICAgICRCTEtSUlBBUlQgICAgPSAweDEyNWY7CisgICAgJEJMS0dFVFNJWkUgICA9IDB4MTI2MDsKK30KKworJW9wdCA9ICgpOworQGFyZ3MgPSAoKTsKKword2hpbGUgKGRlZmluZWQoJGEgPSBzaGlmdChAQVJHVikpKSB7CisgICAgaWYgKCAkYSA9fiAvXlwtLyApIHsKKwlmb3JlYWNoICRvICggc3BsaXQoLy8sIHN1YnN0cigkYSwxKSkgKSB7CisJICAgICRvcHR7JG99ID0gMTsKKwkgICAgaWYgKCRvIGVxICdpJykgeworCQkkaWQgPSBzaGlmdChAQVJHVik7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKwlwdXNoKEBhcmdzLCAkYSk7CisgICAgfQorfQorCisoJGZpbGUsJGMsJGgsJHMpID0gQGFyZ3M7CiskYyArPSAwOyAgJGggKz0gMDsgICRzICs9IDA7CisKKyRwZW50cnkgPSAxOworJHBlbnRyeSA9IDIgaWYgKCAkb3B0eycyJ30gKTsKKyRwZW50cnkgPSAzIGlmICggJG9wdHsnMyd9ICk7CiskcGVudHJ5ID0gNCBpZiAoICRvcHR7JzQnfSApOworCitpZiAoICRvcHR7J3onfSApIHsKKyAgICAkaCA9ICRoIHx8IDY0OworICAgICRzID0gJHMgfHwgMzI7Cit9CisKK2lmICggJG9wdHsnTSd9ICYmICRoICYmICRzICkgeworICAgICMgU3BlY2lmeSBzaXplIGluIG1lZ2FieXRlcywgbm90IGluIGN5bGluZGVycworICAgICRjID0gKCRjKjEwMjQqMikvKCRoKiRzKTsKK30KKworJGlzX29wZW4gPSAwOworCitpZiAoICRjID09IDAgJiYgJGZpbGUgbmUgJycgKSB7CisgICAgJGxlbiA9IDA7CisgICAgaWYgKCBzeXNvcGVuKE9VVFBVVCwgJGZpbGUsIE9fUkRXUiwgMDY2NikgKSB7CisJJGlzX29wZW4gPSAxOworCisJaWYgKCAoQGZpbGVzdGF0ID0gc3RhdChPVVRQVVQpKSAmJiBTX0lTUkVHKCRmaWxlc3RhdFsyXSkgKSB7CisJICAgICRsZW4gPSAkZmlsZXN0YXRbN10gPj4gOTsKKwl9IGVsc2lmICggJGlzX2xpbnV4ICYmIFNfSVNCTEsoJGZpbGVzdGF0WzJdKSApIHsKKwkgICAgJGJsa3NpemUgPSBwYWNrKCJMISIsIDApOworCSAgICBpZiAoIGlvY3RsKE9VVFBVVCwgJEJMS0dFVFNJWkUsICRibGtzaXplKSA9PSAwICkgeworCQkkbGVuID0gdW5wYWNrKCJMISIsICRibGtzaXplKTsgIyBJbiA1MTItYnl0ZSBzZWN0b3JzIQorCSAgICB9CisJfQorICAgIH0KKworICAgIGlmICggISRsZW4gKSB7CisJcHJpbnQgU1RERVJSICIkMDogJGZpbGU6IGRvbid0IGtub3cgaG93IHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGlzIGRldmljZVxuIjsKKwlleGl0IDE7CisgICAgfQorCisgICAgJGMgPSAkbGVuLygkaCokcyk7Cit9CisKK2lmICggJGZpbGUgZXEgJycgfHwgJGMgPCAxIHx8ICRoIDwgMSB8fCAkaCA+IDI1NiB8fCAkcyA8IDEgfHwgJHMgPiA2MyApIHsKKyAgICBwcmludCBTVERFUlIgIlVzYWdlOiAkMCBbLWRvRk16NF1bLWkgaWRdIGZpbGUgYyBoIHMgKG1heDogMTAyNCAyNTYgNjMpXG4iOworICAgIHByaW50IFNUREVSUiAiICAgIC1kICAgIGFkZCBET1NFTVUgaGVhZGVyXG4iOworICAgIHByaW50IFNUREVSUiAiICAgIC1vICAgIHByaW50IGZpbGVzeXN0ZW0gb2Zmc2V0IHRvIHN0ZG91dFxuIjsKKyAgICBwcmludCBTVERFUlIgIiAgICAtRiAgICBmb3JtYXQgcGFydGl0aW9uIGFzIEZBVDMyXG4iOworICAgIHByaW50IFNUREVSUiAiICAgIC1NICAgIFwiY1wiIGFyZ3VtZW50IGlzIG1lZ2FieXRlcywgY2FsY3VsYXRlIGN5bGluZGVyc1xuIjsKKyAgICBwcmludCBTVERFUlIgIiAgICAteiAgICB1c2UgemlwZGlzayBnZW9tZXRyeSAoaD02NCBzPTMyKVxuIjsKKyAgICBwcmludCBTVERFUlIgIiAgICAtNCAgICB1c2UgcGFydGl0aW9uIGVudHJ5IDQgKHN0YW5kYXJkIGZvciB6aXBkaXNrcylcbiI7CisgICAgcHJpbnQgU1RERVJSICIgICAgLWkgICAgc3BlY2lmeSB0aGUgTUJSIElEXG4iOworICAgIHByaW50IFNUREVSUiAiICAgIC1zICAgIG91dHB1dCBhIHNwYXJzZSBmaWxlIChkb24ndCBhbGxvY2F0ZSBhbGwgYmxvY2tzKVxuIjsKKyAgICBleGl0IDE7Cit9CisKK2lmICgkYyA+IDEwMjQpIHsKKyAgICBwcmludCBTVERFUlIgIldhcm5pbmc6IG1vcmUgdGhhbiAxMDI0IGN5bGluZGVycyAoJGMpLlxuIjsKKyAgICBwcmludCBTVERFUlIgIk5vdCBhbGwgQklPU2VzIHdpbGwgYmUgYWJsZSB0byBib290IHRoaXMgZGV2aWNlLlxuIjsKKyAgICAkY2MgPSAxMDI0OworfSBlbHNlIHsKKyAgICAkY2MgPSAkYzsKK30KKworJGN5bHNpemUgPSAkaCokcyo1MTI7CisKK2lmICggISRpc19vcGVuICkgeworICAgIHN5c29wZW4oT1VUUFVULCAkZmlsZSwgT19DUkVBVHxPX1JEV1J8T19UUlVOQywgMDY2NikKKwlvciBkaWUgIiQwOiBDYW5ub3Qgb3BlbjogJGZpbGVcbiI7Cit9CitiaW5tb2RlIE9VVFBVVDsKKworIyBQcmludCBvdXQgRE9TRU1VIGhlYWRlciwgaWYgcmVxdWVzdGVkCitpZiAoICRvcHR7J2QnfSApIHsKKyAgICAkZW11aGRyID0gIkRPU0VNVVwwIiAuIHBhY2soIlZWVlYiLCAkaCwgJHMsICRjLCAxMjgpOworICAgICRlbXVoZHIgLj0gIlwwIiB4ICgxMjggLSBsZW5ndGgoJGVtdWhkcikpOworICAgIHByaW50IE9VVFBVVCAkZW11aGRyOworfQorCisjIFByaW50IHRoZSBNQlIgYW5kIHBhcnRpdGlvbiB0YWJsZQorJG1iciA9IGdldF9oZXhfZGF0YSgpOworaWYgKCBsZW5ndGgoJG1icikgPiA0NDAgKSB7CisgICAgZGllICIkMDogQmFkIE1CUiBjb2RlXG4iOworfQorCiskbWJyIC49ICJcMCIgeCAoNDQwIC0gbGVuZ3RoKCRtYnIpKTsKK2lmIChkZWZpbmVkKCRpZCkpIHsKKyAgICAkaWQgPSB0b19pbnQoJGlkKTsKK30gZWxzZSB7CisgICAgJGlkID0gZ2V0X3JhbmRvbSgpOworfQorJG1iciAuPSBwYWNrKCJWIiwgJGlkKTsJCSMgT2Zmc2V0IDQ0MDogTUJSIElECiskbWJyIC49ICJcMFwwIjsJCQkjIE9mZnNldCA0NDY6IGFjdHVhbCBwYXJ0aXRpb24gdGFibGUKKworcHJpbnQgT1VUUFVUICRtYnI7CisKKyMgUHJpbnQgcGFydGl0aW9uIHRhYmxlCiskcHNpemUgPSAkYyokaCokcy0kczsKKyRiaGVhZCAgID0gKCRoID4gMSkgPyAxIDogMDsKKyRic2VjdCAgID0gMTsKKyRiY3lsICAgID0gKCRoID4gMSkgPyAwIDogMTsKKyRlaGVhZCAgID0gJGgtMTsKKyRlc2VjdCAgID0gJHMgKyAoKCgkY2MtMSkgJiAweDMwMCkgPj4gMik7CiskZWN5bCAgICA9ICgkY2MtMSkgJiAweGZmOworaWYgKCAkYyA+IDEwMjQgKSB7CisgICAgJGZzdHlwZSA9IDB4MGU7Cit9IGVsc2lmICggJHBzaXplID4gNjU1MzYgKSB7CisgICAgJGZzdHlwZSA9IDB4MDY7Cit9IGVsc2UgeworICAgICRmc3R5cGUgPSAweDA0OworfQorZm9yICggJGkgPSAxIDsgJGkgPD0gNCA7ICRpKysgKSB7CisgICAgaWYgKCAkaSA9PSAkcGVudHJ5ICkgeworCXByaW50IE9VVFBVVCBwYWNrKCJDQ0NDQ0NDQ1ZWIiwgMHg4MCwgJGJoZWFkLCAkYnNlY3QsICRiY3lsLCAkZnN0eXBlLAorCQkJICAkZWhlYWQsICRlc2VjdCwgJGVjeWwsICRzLCAkcHNpemUpOworICAgIH0gZWxzZSB7CisJcHJpbnQgT1VUUFVUICJcMCIgeCAxNjsKKyAgICB9Cit9CitwcmludCBPVVRQVVQgIlx4NTVceGFhIjsKKworIyBPdXRwdXQgYmxhbmsgZmlsZQorJHRvdGFsc2l6ZSA9ICRjKiRoKiRzOworJHRyYWNrcyAgICA9ICRjKiRoOworCisjIElmIC1zIGlzIGdpdmVuLCB0cnkgdG8gc2ltcGx5IHVzZSB0cnVuY2F0ZS4uLgordW5sZXNzICgkb3B0eydzJ30gJiYgdHJ1bmNhdGUoT1VUUFVULCAkdG90YWxzaXplKSkgeworICAgICR0cmFjayA9ICJcMCIgeCAoNTEyKiRzKTsKKworICAgICMgUHJpbnQgZnJhY3Rpb25hbCB0cmFjaworICAgIHByaW50IE9VVFBVVCAiXDAiIHggKDUxMiAqICgkcy0xKSk7CisKKyAgICBmb3IgKCAkaSA9IDEgOyAkaSA8ICR0cmFja3MgOyAkaSsrICkgeworCXByaW50IE9VVFBVVCAkdHJhY2s7CisgICAgfQorfQorCisjIFByaW50IG10b29scyB0ZW1wIGZpbGUKKyRuID0gMDsKK3doaWxlICggIWRlZmluZWQoJHRtcGRpcikgKSB7CisgICAgJHRtcGRpciA9ICIvdG1wL21rZGlza2ltYWdlLiQkLiIuKCRuKyspOworICAgIGlmICggIW1rZGlyKCR0bXBkaXIsIDA3MDApICkgeworCWRpZSAiJDA6IEZhaWxlZCB0byBtYWtlIHRlbXAgZGlyZWN0b3J5OiAkdG1wZGlyXG4iCisJICAgIGlmICggJCEgIT0gRUVYSVNUICk7CisJdW5kZWYgJHRtcGRpcjsKKyAgICB9Cit9CisKKyRjZmdmaWxlID0gJHRtcGRpci4nL210b29scy5jb25mJzsKKyRpbWdsaW5rID0gJHRtcGRpci4nL2Rpc2suaW1nJzsKK2RpZSAiJDA6IEZhaWxlZCB0byBjcmVhdGUgc3ltbGluayAkaW1nbGlua1xuIgorICAgIGlmICggIXN5bWxpbmsoYWJzb2x1dGVfcGF0aCgkZmlsZSksICRpbWdsaW5rKSApOworCiskaGVhZGVyX3NpemUgPSAoJG9wdHsnZCd9ID8gMTI4IDogMCk7CisKKyMgU3RhcnQgb2YgZmlsZXN5c3RlbQorJG9mZnNldCA9ICRzKjUxMiArICRoZWFkZXJfc2l6ZTsKKworIyBTdGFydCBvZiBwYXJ0aXRpb24gdGFibGUgZW50cnkKKyRwc3RhcnQgPSAkaGVhZGVyX3NpemUgKyA0NDYgKyAxNiooJHBlbnRyeS0xKTsKKworb3BlbihNQ09ORklHLCAiPiAke2NmZ2ZpbGV9Iikgb3IgZGllICIkMDogQ2Fubm90IG1ha2UgbXRvb2xzIGNvbmZpZ1xuIjsKK3ByaW50IE1DT05GSUcgImRyaXZlIHo6XG4iOworcHJpbnQgTUNPTkZJRyAiZmlsZT1cIiR7aW1nbGlua31cIlxuIjsKK3ByaW50IE1DT05GSUcgImN5bGluZGVycz0ke2N9XG4iOworcHJpbnQgTUNPTkZJRyAiaGVhZHM9JHtofVxuIjsKK3ByaW50IE1DT05GSUcgInNlY3RvcnM9JHtzfVxuIjsKK3ByaW50IE1DT05GSUcgIm9mZnNldD0ke29mZnNldH1cbiI7CitwcmludCBNQ09ORklHICJtZm9ybWF0X29ubHlcbiI7CitjbG9zZShNQ09ORklHKTsKKworIyBPdXRwdXQgdGhlIGZpbGVzeXN0ZW0gb2Zmc2V0IHRvIHN0ZG91dCBpZiBhcHByb3ByaWF0ZQoraWYgKCAkb3B0eydvJ30gKSB7CisgICAgcHJpbnQgJG9mZnNldCwgIlxuIjsKK30KKworJEVOVnsnTVRPT0xTUkMnfSA9ICRjZmdmaWxlOworaWYgKCAkb3B0eydGJ30gKSB7CisgICAgc3lzdGVtKCdtZm9ybWF0JywgJy1GJywgJ3o6Jyk7Cit9IGVsc2UgeworICAgIHN5c3RlbSgnbWZvcm1hdCcsICd6OicpOworfQorCisjIENsZWFuIHVwIGluIC90bXAKK3VubGluaygkY2ZnZmlsZSk7Cit1bmxpbmsoJGltZ2xpbmspOworcm1kaXIoJHRtcGRpcik7CisKKyMgTVRPT0xTIGRvZXNuJ3Qgd3JpdGUgdGhlIGJzSGlkZGVuU2VjcyBmaWVsZCBjb3JyZWN0bHkKK3NlZWsoT1VUUFVULCAkb2Zmc2V0ICsgMHgxYywgMCk7CitwcmludCBPVVRQVVQgcGFjaygiViIsICgkb2Zmc2V0LSRoZWFkZXJfc2l6ZSk+PjkpOworCisjIFNldCB0aGUgcGFydGl0aW9uIHR5cGUKK2lmICggJG9wdHsnRid9ICkgeworICAgIGlmICggJGMgPiAxMDI0ICkgeworCSRmc3R5cGUgPSAweDBjOwkJIyBGQVQzMiBMQkEKKyAgICB9IGVsc2UgeworCSRmc3R5cGUgPSAweDBiOworICAgIH0KK30gZWxzZSB7CisgICAgaWYgKCAkYyA+IDEwMjQgKSB7CisJJGZzdHlwZSA9IDB4MGU7CQkjIEZBVDE2IExCQQorICAgIH0gZWxzaWYgKCAkcHNpemUgPiA2NTUzNiApIHsKKwkkZnN0eXBlID0gMHgwNjsJCSMgRkFUMTYgPiAzMk1CCisgICAgfSBlbHNlIHsKKwkkZnN0eXBlID0gMHgwNDsJCSMgRkFUMTYgPD0gMzJNQgorICAgIH0KKyAgICBzZWVrKE9VVFBVVCwgJG9mZnNldCArIDB4MzYsIDApOworICAgIHJlYWQoT1VUUFVULCAkZnNuYW1lLCA4KTsKKworICAgICMgRkFUMTI6IGFkanVzdCBwYXJ0aXRpb24gdHlwZQorICAgIGlmICggJGZzbmFtZSBlcSAnRkFUMTIgICAnICkgeworCSRmc3R5cGUgPSAweDAxOwkJIyBGQVQxMgorICAgIH0KK30KK3NlZWsoT1VUUFVULCAkcHN0YXJ0KzQsIDApOworcHJpbnQgT1VUUFVUIHBhY2soIkMiLCAkZnN0eXBlKTsKKworZmx1c2ggT1VUUFVUOworCisjIEp1c3QgaW4gY2FzZSB0aGlzIGlzIGEgYmxvY2sgZGV2aWNlLCB0cnkgdG8gZmx1c2ggdGhlIHBhcnRpdGlvbiB0YWJsZQoraWYgKCAkaXNfbGludXggKSB7CisgICAgaW9jdGwoT1VUUFVULCAkQkxLUlJQQVJULCAwKTsKK307CisKK2V4aXQgMDsKK19fRU5EX18KKzMzIGMwIGZhIDhlIGQ4IDhlIGQwIGJjIDAgN2MgODkgZTYgNiA1NyA4ZSBjMCBmYiBmYyBiZiAwIDYgYjkgMCAxIGYzIGE1IGVhCisxZiA2IDAgMCA1MiA1MiBiNCA0MSBiYiBhYSA1NSAzMSBjOSAzMCBmNiBmOSBjZCAxMyA3MiAxMyA4MSBmYiA1NSBhYSA3NSBkCitkMSBlOSA3MyA5IDY2IGM3IDYgOGQgNiBiNCA0MiBlYiAxNSA1YSBiNCA4IGNkIDEzIDgzIGUxIDNmIDUxIGYgYjYgYzYgNDAgZjcKK2UxIDUyIDUwIDY2IDMxIGMwIDY2IDk5IGU4IDY2IDAgZTggMzUgMSA0ZCA2OSA3MyA3MyA2OSA2ZSA2NyAyMCA2ZiA3MCA2NSA3MgorNjEgNzQgNjkgNmUgNjcgMjAgNzMgNzkgNzMgNzQgNjUgNmQgMmUgZCBhIDY2IDYwIDY2IDMxIGQyIGJiIDAgN2MgNjYgNTIgNjYKKzUwIDYgNTMgNmEgMSA2YSAxMCA4OSBlNiA2NiBmNyAzNiBmNCA3YiBjMCBlNCA2IDg4IGUxIDg4IGM1IDkyIGY2IDM2IGY4IDdiCis4OCBjNiA4IGUxIDQxIGI4IDEgMiA4YSAxNiBmYSA3YiBjZCAxMyA4ZCA2NCAxMCA2NiA2MSBjMyBlOCBjNCBmZiBiZSBiZSA3ZAorYmYgYmUgNyBiOSAyMCAwIGYzIGE1IGMzIDY2IDYwIDg5IGU1IGJiIGJlIDcgYjkgNCAwIDMxIGMwIDUzIDUxIGY2IDcgODAgNzQKKzMgNDAgODkgZGUgODMgYzMgMTAgZTIgZjMgNDggNzQgNWIgNzkgMzkgNTkgNWIgOGEgNDcgNCAzYyBmIDc0IDYgMjQgN2YgM2MKKzUgNzUgMjIgNjYgOGIgNDcgOCA2NiA4YiA1NiAxNCA2NiAxIGQwIDY2IDIxIGQyIDc1IDMgNjYgODkgYzIgZTggYWMgZmYgNzIKKzMgZTggYjYgZmYgNjYgOGIgNDYgMWMgZTggYTAgZmYgODMgYzMgMTAgZTIgY2MgNjYgNjEgYzMgZTggNzYgMCA0ZCA3NSA2YyA3NAorNjkgNzAgNmMgNjUgMjAgNjEgNjMgNzQgNjkgNzYgNjUgMjAgNzAgNjEgNzIgNzQgNjkgNzQgNjkgNmYgNmUgNzMgMmUgZCBhIDY2Cis4YiA0NCA4IDY2IDMgNDYgMWMgNjYgODkgNDQgOCBlOCAzMCBmZiA3MiAyNyA2NiA4MSAzZSAwIDdjIDU4IDQ2IDUzIDQyIDc1Cis5IDY2IDgzIGMwIDQgZTggMWMgZmYgNzIgMTMgODEgM2UgZmUgN2QgNTUgYWEgZiA4NSBmMiBmZSBiYyBmYSA3YiA1YSA1ZiA3CitmYSBmZiBlNCBlOCAxZSAwIDRmIDcwIDY1IDcyIDYxIDc0IDY5IDZlIDY3IDIwIDczIDc5IDczIDc0IDY1IDZkIDIwIDZjIDZmCis2MSA2NCAyMCA2NSA3MiA3MiA2ZiA3MiAyZSBkIGEgNWUgYWMgYjQgZSA4YSAzZSA2MiA0IGIzIDcgY2QgMTAgM2MgYSA3NSBmMQorY2QgMTggZjQgZWIgZmQgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAKKyoKZGlmZiAtLWdpdCBhL2Jpb3MvdmVyc2lvbi5nZW4gYi9iaW9zL3ZlcnNpb24uZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYTZkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL3ZlcnNpb24uZ2VuCkBAIC0wLDAgKzEsNiBAQAorJWRlZmluZSBWRVJTSU9OIDYuMDMKKyVkZWZpbmUgVkVSU0lPTl9TVFIgIjYuMDMiCislZGVmaW5lIFZFUlNJT05fTUFKT1IgNgorJWRlZmluZSBWRVJTSU9OX01JTk9SIDMKKyVkZWZpbmUgWUVBUiAyMDE0CislZGVmaW5lIFlFQVJfU1RSICIyMDE0IgpkaWZmIC0tZ2l0IGEvYmlvcy92ZXJzaW9uLmggYi9iaW9zL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjE5Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvYmlvcy92ZXJzaW9uLmgKQEAgLTAsMCArMSw2IEBACisjZGVmaW5lIFZFUlNJT04gNi4wMworI2RlZmluZSBWRVJTSU9OX1NUUiAiNi4wMyIKKyNkZWZpbmUgVkVSU0lPTl9NQUpPUiA2CisjZGVmaW5lIFZFUlNJT05fTUlOT1IgMworI2RlZmluZSBZRUFSIDIwMTQKKyNkZWZpbmUgWUVBUl9TVFIgIjIwMTQiCmRpZmYgLS1naXQgYS9iaW9zL3dpbjMyL3N5c2xpbnV4LmV4ZSBiL2Jpb3Mvd2luMzIvc3lzbGludXguZXhlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjM2M4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW9zL3dpbjMyL3N5c2xpbnV4LmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW9zL3dpbjY0L3N5c2xpbnV4NjQuZXhlIGIvYmlvcy93aW42NC9zeXNsaW51eDY0LmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzVkOTEyCi0tLSAvZGV2L251bGwKKysrIGIvYmlvcy93aW42NC9zeXNsaW51eDY0LmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9NYWtlZmlsZSBiL2NvZGVwYWdlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTU5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitWUEFUSAkJPSAkKFNSQykKK1BFUkwJCT0gcGVybAorQ1BTUkMJCT0gJCh3aWxkY2FyZCAkKFNSQykvKi50eHQpCitDUE9CSgkJPSAkKG5vdGRpciAkKENQU1JDKSkKK0dFTkZJTEVTCT0gJChwYXRzdWJzdCAlLnR4dCwlLmNwLCQoQ1BPQkopKQorCisuU1VGRklYRVM6IC50eHQgLmNwCisKK2FsbDogJChHRU5GSUxFUykKKworIyBUaGlzIGdlbmVyYXRlcyBjb2RlcGFnZSBmaWxlcyB3aGVyZSB0aGUgZGlzcGxheSBhbmQgZmlsZXN5c3RlbQorIyBjb2RlcGFnZXMgYXJlIGJvdGggdGhlIHNhbWUuCislLmNwOiAlLnR4dCBjcHRhYmxlLnBsIFVuaWNvZGVEYXRhCisJJChQRVJMKSAkKFNSQykvY3B0YWJsZS5wbCAkKFNSQykvVW5pY29kZURhdGEgJDwgJDwgJEAKKwordGlkeToKKwlybSAtZiAqLmNwICouYmluCisKK2NsZWFuOiB0aWR5CisKK2Rpc3Q6IHRpZHkKKworc3BvdGxlc3M6IGNsZWFuCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9Vbmljb2RlRGF0YSBiL2NvZGVwYWdlL1VuaWNvZGVEYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTkxNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9Vbmljb2RlRGF0YQpAQCAtMCwwICsxLDk1MiBAQAorMDAwMDs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtOVUxMOzs7OworMDAwMTs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtTVEFSVCBPRiBIRUFESU5HOzs7OworMDAwMjs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtTVEFSVCBPRiBURVhUOzs7OworMDAwMzs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtFTkQgT0YgVEVYVDs7OzsKKzAwMDQ7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047RU5EIE9GIFRSQU5TTUlTU0lPTjs7OzsKKzAwMDU7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047RU5RVUlSWTs7OzsKKzAwMDY7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047QUNLTk9XTEVER0U7Ozs7CiswMDA3Ozxjb250cm9sPjtDYzswO0JOOzs7OztOO0JFTEw7Ozs7CiswMDA4Ozxjb250cm9sPjtDYzswO0JOOzs7OztOO0JBQ0tTUEFDRTs7OzsKKzAwMDk7PGNvbnRyb2w+O0NjOzA7Uzs7Ozs7TjtDSEFSQUNURVIgVEFCVUxBVElPTjs7OzsKKzAwMEE7PGNvbnRyb2w+O0NjOzA7Qjs7Ozs7TjtMSU5FIEZFRUQgKExGKTs7OzsKKzAwMEI7PGNvbnRyb2w+O0NjOzA7Uzs7Ozs7TjtMSU5FIFRBQlVMQVRJT047Ozs7CiswMDBDOzxjb250cm9sPjtDYzswO1dTOzs7OztOO0ZPUk0gRkVFRCAoRkYpOzs7OworMDAwRDs8Y29udHJvbD47Q2M7MDtCOzs7OztOO0NBUlJJQUdFIFJFVFVSTiAoQ1IpOzs7OworMDAwRTs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtTSElGVCBPVVQ7Ozs7CiswMDBGOzxjb250cm9sPjtDYzswO0JOOzs7OztOO1NISUZUIElOOzs7OworMDAxMDs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtEQVRBIExJTksgRVNDQVBFOzs7OworMDAxMTs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtERVZJQ0UgQ09OVFJPTCBPTkU7Ozs7CiswMDEyOzxjb250cm9sPjtDYzswO0JOOzs7OztOO0RFVklDRSBDT05UUk9MIFRXTzs7OzsKKzAwMTM7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047REVWSUNFIENPTlRST0wgVEhSRUU7Ozs7CiswMDE0Ozxjb250cm9sPjtDYzswO0JOOzs7OztOO0RFVklDRSBDT05UUk9MIEZPVVI7Ozs7CiswMDE1Ozxjb250cm9sPjtDYzswO0JOOzs7OztOO05FR0FUSVZFIEFDS05PV0xFREdFOzs7OworMDAxNjs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtTWU5DSFJPTk9VUyBJRExFOzs7OworMDAxNzs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLOzs7OworMDAxODs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtDQU5DRUw7Ozs7CiswMDE5Ozxjb250cm9sPjtDYzswO0JOOzs7OztOO0VORCBPRiBNRURJVU07Ozs7CiswMDFBOzxjb250cm9sPjtDYzswO0JOOzs7OztOO1NVQlNUSVRVVEU7Ozs7CiswMDFCOzxjb250cm9sPjtDYzswO0JOOzs7OztOO0VTQ0FQRTs7OzsKKzAwMUM7PGNvbnRyb2w+O0NjOzA7Qjs7Ozs7TjtJTkZPUk1BVElPTiBTRVBBUkFUT1IgRk9VUjs7OzsKKzAwMUQ7PGNvbnRyb2w+O0NjOzA7Qjs7Ozs7TjtJTkZPUk1BVElPTiBTRVBBUkFUT1IgVEhSRUU7Ozs7CiswMDFFOzxjb250cm9sPjtDYzswO0I7Ozs7O047SU5GT1JNQVRJT04gU0VQQVJBVE9SIFRXTzs7OzsKKzAwMUY7PGNvbnRyb2w+O0NjOzA7Uzs7Ozs7TjtJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FOzs7OworMDAyMDtTUEFDRTtaczswO1dTOzs7OztOOzs7OzsKKzAwMjE7RVhDTEFNQVRJT04gTUFSSztQbzswO09OOzs7OztOOzs7OzsKKzAwMjI7UVVPVEFUSU9OIE1BUks7UG87MDtPTjs7Ozs7Tjs7Ozs7CiswMDIzO05VTUJFUiBTSUdOO1BvOzA7RVQ7Ozs7O047Ozs7OworMDAyNDtET0xMQVIgU0lHTjtTYzswO0VUOzs7OztOOzs7OzsKKzAwMjU7UEVSQ0VOVCBTSUdOO1BvOzA7RVQ7Ozs7O047Ozs7OworMDAyNjtBTVBFUlNBTkQ7UG87MDtPTjs7Ozs7Tjs7Ozs7CiswMDI3O0FQT1NUUk9QSEU7UG87MDtPTjs7Ozs7TjtBUE9TVFJPUEhFLVFVT1RFOzs7OworMDAyODtMRUZUIFBBUkVOVEhFU0lTO1BzOzA7T047Ozs7O1k7T1BFTklORyBQQVJFTlRIRVNJUzs7OzsKKzAwMjk7UklHSFQgUEFSRU5USEVTSVM7UGU7MDtPTjs7Ozs7WTtDTE9TSU5HIFBBUkVOVEhFU0lTOzs7OworMDAyQTtBU1RFUklTSztQbzswO09OOzs7OztOOzs7OzsKKzAwMkI7UExVUyBTSUdOO1NtOzA7RVM7Ozs7O047Ozs7OworMDAyQztDT01NQTtQbzswO0NTOzs7OztOOzs7OzsKKzAwMkQ7SFlQSEVOLU1JTlVTO1BkOzA7RVM7Ozs7O047Ozs7OworMDAyRTtGVUxMIFNUT1A7UG87MDtDUzs7Ozs7TjtQRVJJT0Q7Ozs7CiswMDJGO1NPTElEVVM7UG87MDtDUzs7Ozs7TjtTTEFTSDs7OzsKKzAwMzA7RElHSVQgWkVSTztOZDswO0VOOzswOzA7MDtOOzs7OzsKKzAwMzE7RElHSVQgT05FO05kOzA7RU47OzE7MTsxO047Ozs7OworMDAzMjtESUdJVCBUV087TmQ7MDtFTjs7MjsyOzI7Tjs7Ozs7CiswMDMzO0RJR0lUIFRIUkVFO05kOzA7RU47OzM7MzszO047Ozs7OworMDAzNDtESUdJVCBGT1VSO05kOzA7RU47OzQ7NDs0O047Ozs7OworMDAzNTtESUdJVCBGSVZFO05kOzA7RU47OzU7NTs1O047Ozs7OworMDAzNjtESUdJVCBTSVg7TmQ7MDtFTjs7Njs2OzY7Tjs7Ozs7CiswMDM3O0RJR0lUIFNFVkVOO05kOzA7RU47Ozc7Nzs3O047Ozs7OworMDAzODtESUdJVCBFSUdIVDtOZDswO0VOOzs4Ozg7ODtOOzs7OzsKKzAwMzk7RElHSVQgTklORTtOZDswO0VOOzs5Ozk7OTtOOzs7OzsKKzAwM0E7Q09MT047UG87MDtDUzs7Ozs7Tjs7Ozs7CiswMDNCO1NFTUlDT0xPTjtQbzswO09OOzs7OztOOzs7OzsKKzAwM0M7TEVTUy1USEFOIFNJR047U207MDtPTjs7Ozs7WTs7Ozs7CiswMDNEO0VRVUFMUyBTSUdOO1NtOzA7T047Ozs7O047Ozs7OworMDAzRTtHUkVBVEVSLVRIQU4gU0lHTjtTbTswO09OOzs7OztZOzs7OzsKKzAwM0Y7UVVFU1RJT04gTUFSSztQbzswO09OOzs7OztOOzs7OzsKKzAwNDA7Q09NTUVSQ0lBTCBBVDtQbzswO09OOzs7OztOOzs7OzsKKzAwNDE7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQTtMdTswO0w7Ozs7O047Ozs7MDA2MTsKKzAwNDI7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQjtMdTswO0w7Ozs7O047Ozs7MDA2MjsKKzAwNDM7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQztMdTswO0w7Ozs7O047Ozs7MDA2MzsKKzAwNDQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgRDtMdTswO0w7Ozs7O047Ozs7MDA2NDsKKzAwNDU7TEFUSU4gQ0FQSVRBTCBMRVRURVIgRTtMdTswO0w7Ozs7O047Ozs7MDA2NTsKKzAwNDY7TEFUSU4gQ0FQSVRBTCBMRVRURVIgRjtMdTswO0w7Ozs7O047Ozs7MDA2NjsKKzAwNDc7TEFUSU4gQ0FQSVRBTCBMRVRURVIgRztMdTswO0w7Ozs7O047Ozs7MDA2NzsKKzAwNDg7TEFUSU4gQ0FQSVRBTCBMRVRURVIgSDtMdTswO0w7Ozs7O047Ozs7MDA2ODsKKzAwNDk7TEFUSU4gQ0FQSVRBTCBMRVRURVIgSTtMdTswO0w7Ozs7O047Ozs7MDA2OTsKKzAwNEE7TEFUSU4gQ0FQSVRBTCBMRVRURVIgSjtMdTswO0w7Ozs7O047Ozs7MDA2QTsKKzAwNEI7TEFUSU4gQ0FQSVRBTCBMRVRURVIgSztMdTswO0w7Ozs7O047Ozs7MDA2QjsKKzAwNEM7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTDtMdTswO0w7Ozs7O047Ozs7MDA2QzsKKzAwNEQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTTtMdTswO0w7Ozs7O047Ozs7MDA2RDsKKzAwNEU7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTjtMdTswO0w7Ozs7O047Ozs7MDA2RTsKKzAwNEY7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTztMdTswO0w7Ozs7O047Ozs7MDA2RjsKKzAwNTA7TEFUSU4gQ0FQSVRBTCBMRVRURVIgUDtMdTswO0w7Ozs7O047Ozs7MDA3MDsKKzAwNTE7TEFUSU4gQ0FQSVRBTCBMRVRURVIgUTtMdTswO0w7Ozs7O047Ozs7MDA3MTsKKzAwNTI7TEFUSU4gQ0FQSVRBTCBMRVRURVIgUjtMdTswO0w7Ozs7O047Ozs7MDA3MjsKKzAwNTM7TEFUSU4gQ0FQSVRBTCBMRVRURVIgUztMdTswO0w7Ozs7O047Ozs7MDA3MzsKKzAwNTQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgVDtMdTswO0w7Ozs7O047Ozs7MDA3NDsKKzAwNTU7TEFUSU4gQ0FQSVRBTCBMRVRURVIgVTtMdTswO0w7Ozs7O047Ozs7MDA3NTsKKzAwNTY7TEFUSU4gQ0FQSVRBTCBMRVRURVIgVjtMdTswO0w7Ozs7O047Ozs7MDA3NjsKKzAwNTc7TEFUSU4gQ0FQSVRBTCBMRVRURVIgVztMdTswO0w7Ozs7O047Ozs7MDA3NzsKKzAwNTg7TEFUSU4gQ0FQSVRBTCBMRVRURVIgWDtMdTswO0w7Ozs7O047Ozs7MDA3ODsKKzAwNTk7TEFUSU4gQ0FQSVRBTCBMRVRURVIgWTtMdTswO0w7Ozs7O047Ozs7MDA3OTsKKzAwNUE7TEFUSU4gQ0FQSVRBTCBMRVRURVIgWjtMdTswO0w7Ozs7O047Ozs7MDA3QTsKKzAwNUI7TEVGVCBTUVVBUkUgQlJBQ0tFVDtQczswO09OOzs7OztZO09QRU5JTkcgU1FVQVJFIEJSQUNLRVQ7Ozs7CiswMDVDO1JFVkVSU0UgU09MSURVUztQbzswO09OOzs7OztOO0JBQ0tTTEFTSDs7OzsKKzAwNUQ7UklHSFQgU1FVQVJFIEJSQUNLRVQ7UGU7MDtPTjs7Ozs7WTtDTE9TSU5HIFNRVUFSRSBCUkFDS0VUOzs7OworMDA1RTtDSVJDVU1GTEVYIEFDQ0VOVDtTazswO09OOzs7OztOO1NQQUNJTkcgQ0lSQ1VNRkxFWDs7OzsKKzAwNUY7TE9XIExJTkU7UGM7MDtPTjs7Ozs7TjtTUEFDSU5HIFVOREVSU0NPUkU7Ozs7CiswMDYwO0dSQVZFIEFDQ0VOVDtTazswO09OOzs7OztOO1NQQUNJTkcgR1JBVkU7Ozs7CiswMDYxO0xBVElOIFNNQUxMIExFVFRFUiBBO0xsOzA7TDs7Ozs7Tjs7OzAwNDE7OzAwNDEKKzAwNjI7TEFUSU4gU01BTEwgTEVUVEVSIEI7TGw7MDtMOzs7OztOOzs7MDA0Mjs7MDA0MgorMDA2MztMQVRJTiBTTUFMTCBMRVRURVIgQztMbDswO0w7Ozs7O047OzswMDQzOzswMDQzCiswMDY0O0xBVElOIFNNQUxMIExFVFRFUiBEO0xsOzA7TDs7Ozs7Tjs7OzAwNDQ7OzAwNDQKKzAwNjU7TEFUSU4gU01BTEwgTEVUVEVSIEU7TGw7MDtMOzs7OztOOzs7MDA0NTs7MDA0NQorMDA2NjtMQVRJTiBTTUFMTCBMRVRURVIgRjtMbDswO0w7Ozs7O047OzswMDQ2OzswMDQ2CiswMDY3O0xBVElOIFNNQUxMIExFVFRFUiBHO0xsOzA7TDs7Ozs7Tjs7OzAwNDc7OzAwNDcKKzAwNjg7TEFUSU4gU01BTEwgTEVUVEVSIEg7TGw7MDtMOzs7OztOOzs7MDA0ODs7MDA0OAorMDA2OTtMQVRJTiBTTUFMTCBMRVRURVIgSTtMbDswO0w7Ozs7O047OzswMDQ5OzswMDQ5CiswMDZBO0xBVElOIFNNQUxMIExFVFRFUiBKO0xsOzA7TDs7Ozs7Tjs7OzAwNEE7OzAwNEEKKzAwNkI7TEFUSU4gU01BTEwgTEVUVEVSIEs7TGw7MDtMOzs7OztOOzs7MDA0Qjs7MDA0QgorMDA2QztMQVRJTiBTTUFMTCBMRVRURVIgTDtMbDswO0w7Ozs7O047OzswMDRDOzswMDRDCiswMDZEO0xBVElOIFNNQUxMIExFVFRFUiBNO0xsOzA7TDs7Ozs7Tjs7OzAwNEQ7OzAwNEQKKzAwNkU7TEFUSU4gU01BTEwgTEVUVEVSIE47TGw7MDtMOzs7OztOOzs7MDA0RTs7MDA0RQorMDA2RjtMQVRJTiBTTUFMTCBMRVRURVIgTztMbDswO0w7Ozs7O047OzswMDRGOzswMDRGCiswMDcwO0xBVElOIFNNQUxMIExFVFRFUiBQO0xsOzA7TDs7Ozs7Tjs7OzAwNTA7OzAwNTAKKzAwNzE7TEFUSU4gU01BTEwgTEVUVEVSIFE7TGw7MDtMOzs7OztOOzs7MDA1MTs7MDA1MQorMDA3MjtMQVRJTiBTTUFMTCBMRVRURVIgUjtMbDswO0w7Ozs7O047OzswMDUyOzswMDUyCiswMDczO0xBVElOIFNNQUxMIExFVFRFUiBTO0xsOzA7TDs7Ozs7Tjs7OzAwNTM7OzAwNTMKKzAwNzQ7TEFUSU4gU01BTEwgTEVUVEVSIFQ7TGw7MDtMOzs7OztOOzs7MDA1NDs7MDA1NAorMDA3NTtMQVRJTiBTTUFMTCBMRVRURVIgVTtMbDswO0w7Ozs7O047OzswMDU1OzswMDU1CiswMDc2O0xBVElOIFNNQUxMIExFVFRFUiBWO0xsOzA7TDs7Ozs7Tjs7OzAwNTY7OzAwNTYKKzAwNzc7TEFUSU4gU01BTEwgTEVUVEVSIFc7TGw7MDtMOzs7OztOOzs7MDA1Nzs7MDA1NworMDA3ODtMQVRJTiBTTUFMTCBMRVRURVIgWDtMbDswO0w7Ozs7O047OzswMDU4OzswMDU4CiswMDc5O0xBVElOIFNNQUxMIExFVFRFUiBZO0xsOzA7TDs7Ozs7Tjs7OzAwNTk7OzAwNTkKKzAwN0E7TEFUSU4gU01BTEwgTEVUVEVSIFo7TGw7MDtMOzs7OztOOzs7MDA1QTs7MDA1QQorMDA3QjtMRUZUIENVUkxZIEJSQUNLRVQ7UHM7MDtPTjs7Ozs7WTtPUEVOSU5HIENVUkxZIEJSQUNLRVQ7Ozs7CiswMDdDO1ZFUlRJQ0FMIExJTkU7U207MDtPTjs7Ozs7TjtWRVJUSUNBTCBCQVI7Ozs7CiswMDdEO1JJR0hUIENVUkxZIEJSQUNLRVQ7UGU7MDtPTjs7Ozs7WTtDTE9TSU5HIENVUkxZIEJSQUNLRVQ7Ozs7CiswMDdFO1RJTERFO1NtOzA7T047Ozs7O047Ozs7OworMDA3Rjs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtERUxFVEU7Ozs7CiswMDgwOzxjb250cm9sPjtDYzswO0JOOzs7OztOOzs7OzsKKzAwODE7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047Ozs7OworMDA4Mjs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtCUkVBSyBQRVJNSVRURUQgSEVSRTs7OzsKKzAwODM7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047Tk8gQlJFQUsgSEVSRTs7OzsKKzAwODQ7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047Ozs7OworMDA4NTs8Y29udHJvbD47Q2M7MDtCOzs7OztOO05FWFQgTElORSAoTkVMKTs7OzsKKzAwODY7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047U1RBUlQgT0YgU0VMRUNURUQgQVJFQTs7OzsKKzAwODc7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047RU5EIE9GIFNFTEVDVEVEIEFSRUE7Ozs7CiswMDg4Ozxjb250cm9sPjtDYzswO0JOOzs7OztOO0NIQVJBQ1RFUiBUQUJVTEFUSU9OIFNFVDs7OzsKKzAwODk7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047Q0hBUkFDVEVSIFRBQlVMQVRJT04gV0lUSCBKVVNUSUZJQ0FUSU9OOzs7OworMDA4QTs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtMSU5FIFRBQlVMQVRJT04gU0VUOzs7OworMDA4Qjs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtQQVJUSUFMIExJTkUgRk9SV0FSRDs7OzsKKzAwOEM7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047UEFSVElBTCBMSU5FIEJBQ0tXQVJEOzs7OworMDA4RDs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtSRVZFUlNFIExJTkUgRkVFRDs7OzsKKzAwOEU7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047U0lOR0xFIFNISUZUIFRXTzs7OzsKKzAwOEY7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047U0lOR0xFIFNISUZUIFRIUkVFOzs7OworMDA5MDs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtERVZJQ0UgQ09OVFJPTCBTVFJJTkc7Ozs7CiswMDkxOzxjb250cm9sPjtDYzswO0JOOzs7OztOO1BSSVZBVEUgVVNFIE9ORTs7OzsKKzAwOTI7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047UFJJVkFURSBVU0UgVFdPOzs7OworMDA5Mzs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtTRVQgVFJBTlNNSVQgU1RBVEU7Ozs7CiswMDk0Ozxjb250cm9sPjtDYzswO0JOOzs7OztOO0NBTkNFTCBDSEFSQUNURVI7Ozs7CiswMDk1Ozxjb250cm9sPjtDYzswO0JOOzs7OztOO01FU1NBR0UgV0FJVElORzs7OzsKKzAwOTY7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047U1RBUlQgT0YgR1VBUkRFRCBBUkVBOzs7OworMDA5Nzs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtFTkQgT0YgR1VBUkRFRCBBUkVBOzs7OworMDA5ODs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtTVEFSVCBPRiBTVFJJTkc7Ozs7CiswMDk5Ozxjb250cm9sPjtDYzswO0JOOzs7OztOOzs7OzsKKzAwOUE7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047U0lOR0xFIENIQVJBQ1RFUiBJTlRST0RVQ0VSOzs7OworMDA5Qjs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtDT05UUk9MIFNFUVVFTkNFIElOVFJPRFVDRVI7Ozs7CiswMDlDOzxjb250cm9sPjtDYzswO0JOOzs7OztOO1NUUklORyBURVJNSU5BVE9SOzs7OworMDA5RDs8Y29udHJvbD47Q2M7MDtCTjs7Ozs7TjtPUEVSQVRJTkcgU1lTVEVNIENPTU1BTkQ7Ozs7CiswMDlFOzxjb250cm9sPjtDYzswO0JOOzs7OztOO1BSSVZBQ1kgTUVTU0FHRTs7OzsKKzAwOUY7PGNvbnRyb2w+O0NjOzA7Qk47Ozs7O047QVBQTElDQVRJT04gUFJPR1JBTSBDT01NQU5EOzs7OworMDBBMDtOTy1CUkVBSyBTUEFDRTtaczswO0NTOzxub0JyZWFrPiAwMDIwOzs7O047Tk9OLUJSRUFLSU5HIFNQQUNFOzs7OworMDBBMTtJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLO1BvOzA7T047Ozs7O047Ozs7OworMDBBMjtDRU5UIFNJR047U2M7MDtFVDs7Ozs7Tjs7Ozs7CiswMEEzO1BPVU5EIFNJR047U2M7MDtFVDs7Ozs7Tjs7Ozs7CiswMEE0O0NVUlJFTkNZIFNJR047U2M7MDtFVDs7Ozs7Tjs7Ozs7CiswMEE1O1lFTiBTSUdOO1NjOzA7RVQ7Ozs7O047Ozs7OworMDBBNjtCUk9LRU4gQkFSO1NvOzA7T047Ozs7O047QlJPS0VOIFZFUlRJQ0FMIEJBUjs7OzsKKzAwQTc7U0VDVElPTiBTSUdOO1NvOzA7T047Ozs7O047Ozs7OworMDBBODtESUFFUkVTSVM7U2s7MDtPTjs8Y29tcGF0PiAwMDIwIDAzMDg7Ozs7TjtTUEFDSU5HIERJQUVSRVNJUzs7OzsKKzAwQTk7Q09QWVJJR0hUIFNJR047U287MDtPTjs7Ozs7Tjs7Ozs7CiswMEFBO0ZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SO0xsOzA7TDs8c3VwZXI+IDAwNjE7Ozs7Tjs7Ozs7CiswMEFCO0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLO1BpOzA7T047Ozs7O1k7TEVGVCBQT0lOVElORyBHVUlMTEVNRVQ7Kjs7OworMDBBQztOT1QgU0lHTjtTbTswO09OOzs7OztOOzs7OzsKKzAwQUQ7U09GVCBIWVBIRU47Q2Y7MDtCTjs7Ozs7Tjs7Ozs7CiswMEFFO1JFR0lTVEVSRUQgU0lHTjtTbzswO09OOzs7OztOO1JFR0lTVEVSRUQgVFJBREUgTUFSSyBTSUdOOzs7OworMDBBRjtNQUNST047U2s7MDtPTjs8Y29tcGF0PiAwMDIwIDAzMDQ7Ozs7TjtTUEFDSU5HIE1BQ1JPTjs7OzsKKzAwQjA7REVHUkVFIFNJR047U287MDtFVDs7Ozs7Tjs7Ozs7CiswMEIxO1BMVVMtTUlOVVMgU0lHTjtTbTswO0VUOzs7OztOO1BMVVMtT1ItTUlOVVMgU0lHTjs7OzsKKzAwQjI7U1VQRVJTQ1JJUFQgVFdPO05vOzA7RU47PHN1cGVyPiAwMDMyOzsyOzI7TjtTVVBFUlNDUklQVCBESUdJVCBUV087Ozs7CiswMEIzO1NVUEVSU0NSSVBUIFRIUkVFO05vOzA7RU47PHN1cGVyPiAwMDMzOzszOzM7TjtTVVBFUlNDUklQVCBESUdJVCBUSFJFRTs7OzsKKzAwQjQ7QUNVVEUgQUNDRU5UO1NrOzA7T047PGNvbXBhdD4gMDAyMCAwMzAxOzs7O047U1BBQ0lORyBBQ1VURTs7OzsKKzAwQjU7TUlDUk8gU0lHTjtMbDswO0w7PGNvbXBhdD4gMDNCQzs7OztOOzs7MDM5Qzs7MDM5QworMDBCNjtQSUxDUk9XIFNJR047U287MDtPTjs7Ozs7TjtQQVJBR1JBUEggU0lHTjs7OzsKKzAwQjc7TUlERExFIERPVDtQbzswO09OOzs7OztOOzs7OzsKKzAwQjg7Q0VESUxMQTtTazswO09OOzxjb21wYXQ+IDAwMjAgMDMyNzs7OztOO1NQQUNJTkcgQ0VESUxMQTs7OzsKKzAwQjk7U1VQRVJTQ1JJUFQgT05FO05vOzA7RU47PHN1cGVyPiAwMDMxOzsxOzE7TjtTVVBFUlNDUklQVCBESUdJVCBPTkU7Ozs7CiswMEJBO01BU0NVTElORSBPUkRJTkFMIElORElDQVRPUjtMbDswO0w7PHN1cGVyPiAwMDZGOzs7O047Ozs7OworMDBCQjtSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUks7UGY7MDtPTjs7Ozs7WTtSSUdIVCBQT0lOVElORyBHVUlMTEVNRVQ7Kjs7OworMDBCQztWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVI7Tm87MDtPTjs8ZnJhY3Rpb24+IDAwMzEgMjA0NCAwMDM0Ozs7MS80O047RlJBQ1RJT04gT05FIFFVQVJURVI7Ozs7CiswMEJEO1ZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRjtObzswO09OOzxmcmFjdGlvbj4gMDAzMSAyMDQ0IDAwMzI7OzsxLzI7TjtGUkFDVElPTiBPTkUgSEFMRjs7OzsKKzAwQkU7VlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTO05vOzA7T047PGZyYWN0aW9uPiAwMDMzIDIwNDQgMDAzNDs7OzMvNDtOO0ZSQUNUSU9OIFRIUkVFIFFVQVJURVJTOzs7OworMDBCRjtJTlZFUlRFRCBRVUVTVElPTiBNQVJLO1BvOzA7T047Ozs7O047Ozs7OworMDBDMDtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkU7THU7MDtMOzAwNDEgMDMwMDs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEEgR1JBVkU7OzswMEUwOworMDBDMTtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEU7THU7MDtMOzAwNDEgMDMwMTs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEEgQUNVVEU7OzswMEUxOworMDBDMjtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWDtMdTswO0w7MDA0MSAwMzAyOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBDSVJDVU1GTEVYOzs7MDBFMjsKKzAwQzM7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFO0x1OzA7TDswMDQxIDAzMDM7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFRJTERFOzs7MDBFMzsKKzAwQzQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUztMdTswO0w7MDA0MSAwMzA4Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBESUFFUkVTSVM7OzswMEU0OworMDBDNTtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRTtMdTswO0w7MDA0MSAwMzBBOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBSSU5HOzs7MDBFNTsKKzAwQzY7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQUU7THU7MDtMOzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEEgRTthc2ggKjs7MDBFNjsKKzAwQzc7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEE7THU7MDtMOzAwNDMgMDMyNzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEMgQ0VESUxMQTs7OzAwRTc7CiswMEM4O0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRTtMdTswO0w7MDA0NSAwMzAwOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBHUkFWRTs7OzAwRTg7CiswMEM5O0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURTtMdTswO0w7MDA0NSAwMzAxOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBBQ1VURTs7OzAwRTk7CiswMENBO0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYO0x1OzA7TDswMDQ1IDAzMDI7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIENJUkNVTUZMRVg7OzswMEVBOworMDBDQjtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTO0x1OzA7TDswMDQ1IDAzMDg7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIERJQUVSRVNJUzs7OzAwRUI7CiswMENDO0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRTtMdTswO0w7MDA0OSAwMzAwOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBHUkFWRTs7OzAwRUM7CiswMENEO0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURTtMdTswO0w7MDA0OSAwMzAxOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBBQ1VURTs7OzAwRUQ7CiswMENFO0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYO0x1OzA7TDswMDQ5IDAzMDI7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIENJUkNVTUZMRVg7OzswMEVFOworMDBDRjtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTO0x1OzA7TDswMDQ5IDAzMDg7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIERJQUVSRVNJUzs7OzAwRUY7CiswMEQwO0xBVElOIENBUElUQUwgTEVUVEVSIEVUSDtMdTswO0w7Ozs7O047O0ljZWxhbmRpYzs7MDBGMDsKKzAwRDE7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFO0x1OzA7TDswMDRFIDAzMDM7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFRJTERFOzs7MDBGMTsKKzAwRDI7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFO0x1OzA7TDswMDRGIDAzMDA7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIEdSQVZFOzs7MDBGMjsKKzAwRDM7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFO0x1OzA7TDswMDRGIDAzMDE7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIEFDVVRFOzs7MDBGMzsKKzAwRDQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVg7THU7MDtMOzAwNEYgMDMwMjs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIE8gQ0lSQ1VNRkxFWDs7OzAwRjQ7CiswMEQ1O0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERTtMdTswO0w7MDA0RiAwMzAzOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBUSUxERTs7OzAwRjU7CiswMEQ2O0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVM7THU7MDtMOzAwNEYgMDMwODs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIE8gRElBRVJFU0lTOzs7MDBGNjsKKzAwRDc7TVVMVElQTElDQVRJT04gU0lHTjtTbTswO09OOzs7OztOOzs7OzsKKzAwRDg7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRTtMdTswO0w7Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBTTEFTSDs7OzAwRjg7CiswMEQ5O0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRTtMdTswO0w7MDA1NSAwMzAwOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBHUkFWRTs7OzAwRjk7CiswMERBO0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURTtMdTswO0w7MDA1NSAwMzAxOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBBQ1VURTs7OzAwRkE7CiswMERCO0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYO0x1OzA7TDswMDU1IDAzMDI7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIENJUkNVTUZMRVg7OzswMEZCOworMDBEQztMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTO0x1OzA7TDswMDU1IDAzMDg7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIERJQUVSRVNJUzs7OzAwRkM7CiswMEREO0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURTtMdTswO0w7MDA1OSAwMzAxOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBBQ1VURTs7OzAwRkQ7CiswMERFO0xBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOO0x1OzA7TDs7Ozs7Tjs7SWNlbGFuZGljOzswMEZFOworMDBERjtMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUztMbDswO0w7Ozs7O047O0dlcm1hbjs7OworMDBFMDtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFO0xsOzA7TDswMDYxIDAzMDA7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgQSBHUkFWRTs7MDBDMDs7MDBDMAorMDBFMTtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFO0xsOzA7TDswMDYxIDAzMDE7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgQSBBQ1VURTs7MDBDMTs7MDBDMQorMDBFMjtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVg7TGw7MDtMOzAwNjEgMDMwMjs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBBIENJUkNVTUZMRVg7OzAwQzI7OzAwQzIKKzAwRTM7TEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERTtMbDswO0w7MDA2MSAwMzAzOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIEEgVElMREU7OzAwQzM7OzAwQzMKKzAwRTQ7TEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVM7TGw7MDtMOzAwNjEgMDMwODs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBBIERJQUVSRVNJUzs7MDBDNDs7MDBDNAorMDBFNTtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkU7TGw7MDtMOzAwNjEgMDMwQTs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBBIFJJTkc7OzAwQzU7OzAwQzUKKzAwRTY7TEFUSU4gU01BTEwgTEVUVEVSIEFFO0xsOzA7TDs7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgQSBFO2FzaCAqOzAwQzY7OzAwQzYKKzAwRTc7TEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBO0xsOzA7TDswMDYzIDAzMjc7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgQyBDRURJTExBOzswMEM3OzswMEM3CiswMEU4O0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkU7TGw7MDtMOzAwNjUgMDMwMDs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBFIEdSQVZFOzswMEM4OzswMEM4CiswMEU5O0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEU7TGw7MDtMOzAwNjUgMDMwMTs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBFIEFDVVRFOzswMEM5OzswMEM5CiswMEVBO0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWDtMbDswO0w7MDA2NSAwMzAyOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIEUgQ0lSQ1VNRkxFWDs7MDBDQTs7MDBDQQorMDBFQjtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUztMbDswO0w7MDA2NSAwMzA4Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIEUgRElBRVJFU0lTOzswMENCOzswMENCCiswMEVDO0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkU7TGw7MDtMOzAwNjkgMDMwMDs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBJIEdSQVZFOzswMENDOzswMENDCiswMEVEO0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEU7TGw7MDtMOzAwNjkgMDMwMTs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBJIEFDVVRFOzswMENEOzswMENECiswMEVFO0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWDtMbDswO0w7MDA2OSAwMzAyOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIEkgQ0lSQ1VNRkxFWDs7MDBDRTs7MDBDRQorMDBFRjtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUztMbDswO0w7MDA2OSAwMzA4Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIEkgRElBRVJFU0lTOzswMENGOzswMENGCiswMEYwO0xBVElOIFNNQUxMIExFVFRFUiBFVEg7TGw7MDtMOzs7OztOOztJY2VsYW5kaWM7MDBEMDs7MDBEMAorMDBGMTtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFO0xsOzA7TDswMDZFIDAzMDM7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgTiBUSUxERTs7MDBEMTs7MDBEMQorMDBGMjtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFO0xsOzA7TDswMDZGIDAzMDA7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgTyBHUkFWRTs7MDBEMjs7MDBEMgorMDBGMztMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFO0xsOzA7TDswMDZGIDAzMDE7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgTyBBQ1VURTs7MDBEMzs7MDBEMworMDBGNDtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVg7TGw7MDtMOzAwNkYgMDMwMjs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBPIENJUkNVTUZMRVg7OzAwRDQ7OzAwRDQKKzAwRjU7TEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERTtMbDswO0w7MDA2RiAwMzAzOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIE8gVElMREU7OzAwRDU7OzAwRDUKKzAwRjY7TEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVM7TGw7MDtMOzAwNkYgMDMwODs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBPIERJQUVSRVNJUzs7MDBENjs7MDBENgorMDBGNztESVZJU0lPTiBTSUdOO1NtOzA7T047Ozs7O047Ozs7OworMDBGODtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRTtMbDswO0w7Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIE8gU0xBU0g7OzAwRDg7OzAwRDgKKzAwRjk7TEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRTtMbDswO0w7MDA3NSAwMzAwOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIFUgR1JBVkU7OzAwRDk7OzAwRDkKKzAwRkE7TEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURTtMbDswO0w7MDA3NSAwMzAxOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIFUgQUNVVEU7OzAwREE7OzAwREEKKzAwRkI7TEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYO0xsOzA7TDswMDc1IDAzMDI7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgVSBDSVJDVU1GTEVYOzswMERCOzswMERCCiswMEZDO0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTO0xsOzA7TDswMDc1IDAzMDg7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgVSBESUFFUkVTSVM7OzAwREM7OzAwREMKKzAwRkQ7TEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURTtMbDswO0w7MDA3OSAwMzAxOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIFkgQUNVVEU7OzAwREQ7OzAwREQKKzAwRkU7TEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOO0xsOzA7TDs7Ozs7Tjs7SWNlbGFuZGljOzAwREU7OzAwREUKKzAwRkY7TEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVM7TGw7MDtMOzAwNzkgMDMwODs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBZIERJQUVSRVNJUzs7MDE3ODs7MDE3OAorMDEwMDtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OO0x1OzA7TDswMDQxIDAzMDQ7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIE1BQ1JPTjs7OzAxMDE7CiswMTAxO0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OO0xsOzA7TDswMDYxIDAzMDQ7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgQSBNQUNST047OzAxMDA7OzAxMDAKKzAxMDI7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFO0x1OzA7TDswMDQxIDAzMDY7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIEJSRVZFOzs7MDEwMzsKKzAxMDM7TEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRTtMbDswO0w7MDA2MSAwMzA2Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIEEgQlJFVkU7OzAxMDI7OzAxMDIKKzAxMDQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSztMdTswO0w7MDA0MSAwMzI4Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBPR09ORUs7OzswMTA1OworMDEwNTtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSztMbDswO0w7MDA2MSAwMzI4Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIEEgT0dPTkVLOzswMTA0OzswMTA0CiswMTA2O0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURTtMdTswO0w7MDA0MyAwMzAxOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBBQ1VURTs7OzAxMDc7CiswMTA3O0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEU7TGw7MDtMOzAwNjMgMDMwMTs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBDIEFDVVRFOzswMTA2OzswMTA2CiswMTA4O0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDSVJDVU1GTEVYO0x1OzA7TDswMDQzIDAzMDI7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBDIENJUkNVTUZMRVg7OzswMTA5OworMDEwOTtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVg7TGw7MDtMOzAwNjMgMDMwMjs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBDIENJUkNVTUZMRVg7OzAxMDg7OzAxMDgKKzAxMEE7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRTtMdTswO0w7MDA0MyAwMzA3Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBET1Q7OzswMTBCOworMDEwQjtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRTtMbDswO0w7MDA2MyAwMzA3Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIEMgRE9UOzswMTBBOzswMTBBCiswMTBDO0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTjtMdTswO0w7MDA0MyAwMzBDOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBIQUNFSzs7OzAxMEQ7CiswMTBEO0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST047TGw7MDtMOzAwNjMgMDMwQzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBDIEhBQ0VLOzswMTBDOzswMTBDCiswMTBFO0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTjtMdTswO0w7MDA0NCAwMzBDOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBIQUNFSzs7OzAxMEY7CiswMTBGO0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST047TGw7MDtMOzAwNjQgMDMwQzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBEIEhBQ0VLOzswMTBFOzswMTBFCiswMTEwO0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0U7THU7MDtMOzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEQgQkFSOzs7MDExMTsKKzAxMTE7TEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0U7TGw7MDtMOzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBEIEJBUjs7MDExMDs7MDExMAorMDExMjtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OO0x1OzA7TDswMDQ1IDAzMDQ7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIE1BQ1JPTjs7OzAxMTM7CiswMTEzO0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OO0xsOzA7TDswMDY1IDAzMDQ7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgRSBNQUNST047OzAxMTI7OzAxMTIKKzAxMTY7TEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRTtMdTswO0w7MDA0NSAwMzA3Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBET1Q7OzswMTE3OworMDExNztMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRTtMbDswO0w7MDA2NSAwMzA3Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIEUgRE9UOzswMTE2OzswMTE2CiswMTE4O0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUs7THU7MDtMOzAwNDUgMDMyODs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEUgT0dPTkVLOzs7MDExOTsKKzAxMTk7TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUs7TGw7MDtMOzAwNjUgMDMyODs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBFIE9HT05FSzs7MDExODs7MDExOAorMDExQTtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST047THU7MDtMOzAwNDUgMDMwQzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEUgSEFDRUs7OzswMTFCOworMDExQjtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OO0xsOzA7TDswMDY1IDAzMEM7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgRSBIQUNFSzs7MDExQTs7MDExQQorMDExQztMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0lSQ1VNRkxFWDtMdTswO0w7MDA0NyAwMzAyOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBDSVJDVU1GTEVYOzs7MDExRDsKKzAxMUQ7TEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYO0xsOzA7TDswMDY3IDAzMDI7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgRyBDSVJDVU1GTEVYOzswMTFDOzswMTFDCiswMTFFO0xBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBCUkVWRTtMdTswO0w7MDA0NyAwMzA2Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBCUkVWRTs7OzAxMUY7CiswMTFGO0xBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQlJFVkU7TGw7MDtMOzAwNjcgMDMwNjs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBHIEJSRVZFOzswMTFFOzswMTFFCiswMTIwO0xBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkU7THU7MDtMOzAwNDcgMDMwNzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEcgRE9UOzs7MDEyMTsKKzAxMjE7TEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkU7TGw7MDtMOzAwNjcgMDMwNzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBHIERPVDs7MDEyMDs7MDEyMAorMDEyMjtMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQTtMdTswO0w7MDA0NyAwMzI3Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBDRURJTExBOzs7MDEyMzsKKzAxMjM7TEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBO0xsOzA7TDswMDY3IDAzMjc7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgRyBDRURJTExBOzswMTIyOzswMTIyCiswMTI0O0xBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBDSVJDVU1GTEVYO0x1OzA7TDswMDQ4IDAzMDI7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIENJUkNVTUZMRVg7OzswMTI1OworMDEyNTtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIENJUkNVTUZMRVg7TGw7MDtMOzAwNjggMDMwMjs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBIIENJUkNVTUZMRVg7OzAxMjQ7OzAxMjQKKzAxMjY7TEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIFNUUk9LRTtMdTswO0w7Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBCQVI7OzswMTI3OworMDEyNztMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIFNUUk9LRTtMbDswO0w7Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIEggQkFSOzswMTI2OzswMTI2CiswMTI4O0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBUSUxERTtMdTswO0w7MDA0OSAwMzAzOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBUSUxERTs7OzAxMjk7CiswMTI5O0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggVElMREU7TGw7MDtMOzAwNjkgMDMwMzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBJIFRJTERFOzswMTI4OzswMTI4CiswMTJBO0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST047THU7MDtMOzAwNDkgMDMwNDs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEkgTUFDUk9OOzs7MDEyQjsKKzAxMkI7TEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST047TGw7MDtMOzAwNjkgMDMwNDs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBJIE1BQ1JPTjs7MDEyQTs7MDEyQQorMDEyRTtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLO0x1OzA7TDswMDQ5IDAzMjg7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIE9HT05FSzs7OzAxMkY7CiswMTJGO0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLO0xsOzA7TDswMDY5IDAzMjg7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgSSBPR09ORUs7OzAxMkU7OzAxMkUKKzAxMzA7TEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBBQk9WRTtMdTswO0w7MDA0OSAwMzA3Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBET1Q7OzswMDY5OworMDEzMTtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJO0xsOzA7TDs7Ozs7Tjs7OzAwNDk7OzAwNDkKKzAxMzQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVg7THU7MDtMOzAwNEEgMDMwMjs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEogQ0lSQ1VNRkxFWDs7OzAxMzU7CiswMTM1O0xBVElOIFNNQUxMIExFVFRFUiBKIFdJVEggQ0lSQ1VNRkxFWDtMbDswO0w7MDA2QSAwMzAyOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIEogQ0lSQ1VNRkxFWDs7MDEzNDs7MDEzNAorMDEzNjtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggQ0VESUxMQTtMdTswO0w7MDA0QiAwMzI3Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBDRURJTExBOzs7MDEzNzsKKzAxMzc7TEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDRURJTExBO0xsOzA7TDswMDZCIDAzMjc7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgSyBDRURJTExBOzswMTM2OzswMTM2CiswMTM4O0xBVElOIFNNQUxMIExFVFRFUiBLUkE7TGw7MDtMOzs7OztOOztHcmVlbmxhbmRpYzs7OworMDEzOTtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQUNVVEU7THU7MDtMOzAwNEMgMDMwMTs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEwgQUNVVEU7OzswMTNBOworMDEzQTtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEFDVVRFO0xsOzA7TDswMDZDIDAzMDE7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgTCBBQ1VURTs7MDEzOTs7MDEzOQorMDEzQjtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQTtMdTswO0w7MDA0QyAwMzI3Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBDRURJTExBOzs7MDEzQzsKKzAxM0M7TEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBO0xsOzA7TDswMDZDIDAzMjc7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgTCBDRURJTExBOzswMTNCOzswMTNCCiswMTNEO0xBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDQVJPTjtMdTswO0w7MDA0QyAwMzBDOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBIQUNFSzs7OzAxM0U7CiswMTNFO0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST047TGw7MDtMOzAwNkMgMDMwQzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBMIEhBQ0VLOzswMTNEOzswMTNECiswMTQxO0xBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0U7THU7MDtMOzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIEwgU0xBU0g7OzswMTQyOworMDE0MjtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRTtMbDswO0w7Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIEwgU0xBU0g7OzAxNDE7OzAxNDEKKzAxNDM7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFO0x1OzA7TDswMDRFIDAzMDE7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIEFDVVRFOzs7MDE0NDsKKzAxNDQ7TEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURTtMbDswO0w7MDA2RSAwMzAxOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIE4gQUNVVEU7OzAxNDM7OzAxNDMKKzAxNDU7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENFRElMTEE7THU7MDtMOzAwNEUgMDMyNzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIE4gQ0VESUxMQTs7OzAxNDY7CiswMTQ2O0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQTtMbDswO0w7MDA2RSAwMzI3Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIE4gQ0VESUxMQTs7MDE0NTs7MDE0NQorMDE0NztMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST047THU7MDtMOzAwNEUgMDMwQzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIE4gSEFDRUs7OzswMTQ4OworMDE0ODtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OO0xsOzA7TDswMDZFIDAzMEM7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgTiBIQUNFSzs7MDE0Nzs7MDE0NworMDE0QTtMQVRJTiBDQVBJVEFMIExFVFRFUiBFTkc7THU7MDtMOzs7OztOOztTYW1pOzswMTRCOworMDE0QjtMQVRJTiBTTUFMTCBMRVRURVIgRU5HO0xsOzA7TDs7Ozs7Tjs7U2FtaTswMTRBOzswMTRBCiswMTRDO0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST047THU7MDtMOzAwNEYgMDMwNDs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIE8gTUFDUk9OOzs7MDE0RDsKKzAxNEQ7TEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST047TGw7MDtMOzAwNkYgMDMwNDs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBPIE1BQ1JPTjs7MDE0Qzs7MDE0QworMDE1MDtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFO0x1OzA7TDswMDRGIDAzMEI7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIERPVUJMRSBBQ1VURTs7OzAxNTE7CiswMTUxO0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFO0xsOzA7TDswMDZGIDAzMEI7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgTyBET1VCTEUgQUNVVEU7OzAxNTA7OzAxNTAKKzAxNTI7TEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRTtMdTswO0w7Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBFOzs7MDE1MzsKKzAxNTM7TEFUSU4gU01BTEwgTElHQVRVUkUgT0U7TGw7MDtMOzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBPIEU7OzAxNTI7OzAxNTIKKzAxNTQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIEFDVVRFO0x1OzA7TDswMDUyIDAzMDE7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIEFDVVRFOzs7MDE1NTsKKzAxNTU7TEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBBQ1VURTtMbDswO0w7MDA3MiAwMzAxOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIFIgQUNVVEU7OzAxNTQ7OzAxNTQKKzAxNTY7TEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENFRElMTEE7THU7MDtMOzAwNTIgMDMyNzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIFIgQ0VESUxMQTs7OzAxNTc7CiswMTU3O0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQTtMbDswO0w7MDA3MiAwMzI3Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIFIgQ0VESUxMQTs7MDE1Njs7MDE1NgorMDE1ODtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0FST047THU7MDtMOzAwNTIgMDMwQzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIFIgSEFDRUs7OzswMTU5OworMDE1OTtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OO0xsOzA7TDswMDcyIDAzMEM7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgUiBIQUNFSzs7MDE1ODs7MDE1OAorMDE1QTtMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEU7THU7MDtMOzAwNTMgMDMwMTs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIFMgQUNVVEU7OzswMTVCOworMDE1QjtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFO0xsOzA7TDswMDczIDAzMDE7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgUyBBQ1VURTs7MDE1QTs7MDE1QQorMDE1QztMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0lSQ1VNRkxFWDtMdTswO0w7MDA1MyAwMzAyOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBDSVJDVU1GTEVYOzs7MDE1RDsKKzAxNUQ7TEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDSVJDVU1GTEVYO0xsOzA7TDswMDczIDAzMDI7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgUyBDSVJDVU1GTEVYOzswMTVDOzswMTVDCiswMTVFO0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBO0x1OzA7TDswMDUzIDAzMjc7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBTIENFRElMTEE7Kjs7MDE1RjsKKzAxNUY7TEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBO0xsOzA7TDswMDczIDAzMjc7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgUyBDRURJTExBOyo7MDE1RTs7MDE1RQorMDE2MDtMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST047THU7MDtMOzAwNTMgMDMwQzs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIFMgSEFDRUs7OzswMTYxOworMDE2MTtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OO0xsOzA7TDswMDczIDAzMEM7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgUyBIQUNFSzs7MDE2MDs7MDE2MAorMDE2MjtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0VESUxMQTtMdTswO0w7MDA1NCAwMzI3Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBDRURJTExBOyo7OzAxNjM7CiswMTYzO0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0VESUxMQTtMbDswO0w7MDA3NCAwMzI3Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIFQgQ0VESUxMQTsqOzAxNjI7OzAxNjIKKzAxNjQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENBUk9OO0x1OzA7TDswMDU0IDAzMEM7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIEhBQ0VLOzs7MDE2NTsKKzAxNjU7TEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTjtMbDswO0w7MDA3NCAwMzBDOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIFQgSEFDRUs7OzAxNjQ7OzAxNjQKKzAxNjY7TEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIFNUUk9LRTtMdTswO0w7Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBCQVI7OzswMTY3OworMDE2NztMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIFNUUk9LRTtMbDswO0w7Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIFQgQkFSOzswMTY2OzswMTY2CiswMTY4O0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBUSUxERTtMdTswO0w7MDA1NSAwMzAzOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBUSUxERTs7OzAxNjk7CiswMTY5O0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggVElMREU7TGw7MDtMOzAwNzUgMDMwMzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBVIFRJTERFOzswMTY4OzswMTY4CiswMTZBO0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST047THU7MDtMOzAwNTUgMDMwNDs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIFUgTUFDUk9OOzs7MDE2QjsKKzAxNkI7TEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST047TGw7MDtMOzAwNzUgMDMwNDs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBVIE1BQ1JPTjs7MDE2QTs7MDE2QQorMDE2QztMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQlJFVkU7THU7MDtMOzAwNTUgMDMwNjs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIFUgQlJFVkU7OzswMTZEOworMDE2RDtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEJSRVZFO0xsOzA7TDswMDc1IDAzMDY7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgVSBCUkVWRTs7MDE2Qzs7MDE2QworMDE2RTtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRTtMdTswO0w7MDA1NSAwMzBBOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBSSU5HOzs7MDE2RjsKKzAxNkY7TEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFO0xsOzA7TDswMDc1IDAzMEE7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgVSBSSU5HOzswMTZFOzswMTZFCiswMTcwO0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEU7THU7MDtMOzAwNTUgMDMwQjs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIFUgRE9VQkxFIEFDVVRFOzs7MDE3MTsKKzAxNzE7TEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEU7TGw7MDtMOzAwNzUgMDMwQjs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBVIERPVUJMRSBBQ1VURTs7MDE3MDs7MDE3MAorMDE3MjtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLO0x1OzA7TDswMDU1IDAzMjg7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIE9HT05FSzs7OzAxNzM7CiswMTczO0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLO0xsOzA7TDswMDc1IDAzMjg7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgVSBPR09ORUs7OzAxNzI7OzAxNzIKKzAxNzQ7TEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIENJUkNVTUZMRVg7THU7MDtMOzAwNTcgMDMwMjs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIFcgQ0lSQ1VNRkxFWDs7OzAxNzU7CiswMTc1O0xBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggQ0lSQ1VNRkxFWDtMbDswO0w7MDA3NyAwMzAyOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIFcgQ0lSQ1VNRkxFWDs7MDE3NDs7MDE3NAorMDE3NjtMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWDtMdTswO0w7MDA1OSAwMzAyOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBDSVJDVU1GTEVYOzs7MDE3NzsKKzAxNzc7TEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBDSVJDVU1GTEVYO0xsOzA7TDswMDc5IDAzMDI7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgWSBDSVJDVU1GTEVYOzswMTc2OzswMTc2CiswMTc4O0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVM7THU7MDtMOzAwNTkgMDMwODs7OztOO0xBVElOIENBUElUQUwgTEVUVEVSIFkgRElBRVJFU0lTOzs7MDBGRjsKKzAxNzk7TEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFO0x1OzA7TDswMDVBIDAzMDE7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBaIEFDVVRFOzs7MDE3QTsKKzAxN0E7TEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURTtMbDswO0w7MDA3QSAwMzAxOzs7O047TEFUSU4gU01BTEwgTEVUVEVSIFogQUNVVEU7OzAxNzk7OzAxNzkKKzAxN0I7TEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRTtMdTswO0w7MDA1QSAwMzA3Ozs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBET1Q7OzswMTdDOworMDE3QztMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRTtMbDswO0w7MDA3QSAwMzA3Ozs7O047TEFUSU4gU01BTEwgTEVUVEVSIFogRE9UOzswMTdCOzswMTdCCiswMTdEO0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTjtMdTswO0w7MDA1QSAwMzBDOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBIQUNFSzs7OzAxN0U7CiswMTdFO0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST047TGw7MDtMOzAwN0EgMDMwQzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBaIEhBQ0VLOzswMTdEOzswMTdECiswMTkxO0xBVElOIENBUElUQUwgTEVUVEVSIEYgV0lUSCBIT09LO0x1OzA7TDs7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBGIEhPT0s7OzswMTkyOworMDE5MjtMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0s7TGw7MDtMOzs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBTQ1JJUFQgRjs7MDE5MTs7MDE5MQorMDFBMDtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STjtMdTswO0w7MDA0RiAwMzFCOzs7O047TEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBIT1JOOzs7MDFBMTsKKzAxQTE7TEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOO0xsOzA7TDswMDZGIDAzMUI7Ozs7TjtMQVRJTiBTTUFMTCBMRVRURVIgTyBIT1JOOzswMUEwOzswMUEwCiswMUFGO0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOO0x1OzA7TDswMDU1IDAzMUI7Ozs7TjtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIEhPUk47OzswMUIwOworMDFCMDtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk47TGw7MDtMOzAwNzUgMDMxQjs7OztOO0xBVElOIFNNQUxMIExFVFRFUiBVIEhPUk47OzAxQUY7OzAxQUYKKzAyMTg7TEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XO0x1OzA7TDswMDUzIDAzMjY7Ozs7Tjs7Kjs7MDIxOTsKKzAyMTk7TEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDT01NQSBCRUxPVztMbDswO0w7MDA3MyAwMzI2Ozs7O047Oyo7MDIxODs7MDIxOAorMDIxQTtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ09NTUEgQkVMT1c7THU7MDtMOzAwNTQgMDMyNjs7OztOOzsqOzswMjFCOworMDIxQjtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XO0xsOzA7TDswMDc0IDAzMjY7Ozs7Tjs7KjswMjFBOzswMjFBCiswMkM2O01PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVDtMbTswO09OOzs7OztOO01PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYOzs7OworMDJDNztDQVJPTjtMbTswO09OOzs7OztOO01PRElGSUVSIExFVFRFUiBIQUNFSztNYW5kYXJpbiBDaGluZXNlIHRoaXJkIHRvbmU7OzsKKzAyRDg7QlJFVkU7U2s7MDtPTjs8Y29tcGF0PiAwMDIwIDAzMDY7Ozs7TjtTUEFDSU5HIEJSRVZFOzs7OworMDJEOTtET1QgQUJPVkU7U2s7MDtPTjs8Y29tcGF0PiAwMDIwIDAzMDc7Ozs7TjtTUEFDSU5HIERPVCBBQk9WRTtNYW5kYXJpbiBDaGluZXNlIGxpZ2h0IHRvbmU7OzsKKzAyREI7T0dPTkVLO1NrOzA7T047PGNvbXBhdD4gMDAyMCAwMzI4Ozs7O047U1BBQ0lORyBPR09ORUs7Ozs7CiswMkRDO1NNQUxMIFRJTERFO1NrOzA7T047PGNvbXBhdD4gMDAyMCAwMzAzOzs7O047U1BBQ0lORyBUSUxERTs7OzsKKzAyREQ7RE9VQkxFIEFDVVRFIEFDQ0VOVDtTazswO09OOzxjb21wYXQ+IDAwMjAgMDMwQjs7OztOO1NQQUNJTkcgRE9VQkxFIEFDVVRFOzs7OworMDMwMDtDT01CSU5JTkcgR1JBVkUgQUNDRU5UO01uOzIzMDtOU007Ozs7O047Tk9OLVNQQUNJTkcgR1JBVkU7VmFyaWE7OzsKKzAzMDE7Q09NQklOSU5HIEFDVVRFIEFDQ0VOVDtNbjsyMzA7TlNNOzs7OztOO05PTi1TUEFDSU5HIEFDVVRFO094aWEsIFRvbm9zOzs7CiswMzAzO0NPTUJJTklORyBUSUxERTtNbjsyMzA7TlNNOzs7OztOO05PTi1TUEFDSU5HIFRJTERFOzs7OworMDMwOTtDT01CSU5JTkcgSE9PSyBBQk9WRTtNbjsyMzA7TlNNOzs7OztOO05PTi1TUEFDSU5HIEhPT0sgQUJPVkU7Ozs7CiswMzIzO0NPTUJJTklORyBET1QgQkVMT1c7TW47MjIwO05TTTs7Ozs7TjtOT04tU1BBQ0lORyBET1QgQkVMT1c7Ozs7CiswMzdBO0dSRUVLIFlQT0dFR1JBTU1FTkk7TG07MDtMOzxjb21wYXQ+IDAwMjAgMDM0NTs7OztOO0dSRUVLIFNQQUNJTkcgSU9UQSBCRUxPVzs7OzsKKzAzODQ7R1JFRUsgVE9OT1M7U2s7MDtPTjs8Y29tcGF0PiAwMDIwIDAzMDE7Ozs7TjtHUkVFSyBTUEFDSU5HIFRPTk9TOzs7OworMDM4NTtHUkVFSyBESUFMWVRJS0EgVE9OT1M7U2s7MDtPTjswMEE4IDAzMDE7Ozs7TjtHUkVFSyBTUEFDSU5HIERJQUVSRVNJUyBUT05PUzs7OzsKKzAzODY7R1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUztMdTswO0w7MDM5MSAwMzAxOzs7O047R1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgVE9OT1M7OzswM0FDOworMDM4ODtHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1M7THU7MDtMOzAzOTUgMDMwMTs7OztOO0dSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gVE9OT1M7OzswM0FEOworMDM4OTtHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUztMdTswO0w7MDM5NyAwMzAxOzs7O047R1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFRPTk9TOzs7MDNBRTsKKzAzOEE7R1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TO0x1OzA7TDswMzk5IDAzMDE7Ozs7TjtHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFRPTk9TOzs7MDNBRjsKKzAzOEM7R1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TO0x1OzA7TDswMzlGIDAzMDE7Ozs7TjtHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFRPTk9TOzs7MDNDQzsKKzAzOEU7R1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TO0x1OzA7TDswM0E1IDAzMDE7Ozs7TjtHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFRPTk9TOzs7MDNDRDsKKzAzOEY7R1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUztMdTswO0w7MDNBOSAwMzAxOzs7O047R1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgVE9OT1M7OzswM0NFOworMDM5MDtHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1M7TGw7MDtMOzAzQ0EgMDMwMTs7OztOO0dSRUVLIFNNQUxMIExFVFRFUiBJT1RBIERJQUVSRVNJUyBUT05PUzs7OzsKKzAzOTE7R1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEE7THU7MDtMOzs7OztOOzs7OzAzQjE7CiswMzkyO0dSRUVLIENBUElUQUwgTEVUVEVSIEJFVEE7THU7MDtMOzs7OztOOzs7OzAzQjI7CiswMzkzO0dSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BO0x1OzA7TDs7Ozs7Tjs7OzswM0IzOworMDM5NDtHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQTtMdTswO0w7Ozs7O047Ozs7MDNCNDsKKzAzOTU7R1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTjtMdTswO0w7Ozs7O047Ozs7MDNCNTsKKzAzOTY7R1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQTtMdTswO0w7Ozs7O047Ozs7MDNCNjsKKzAzOTc7R1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBO0x1OzA7TDs7Ozs7Tjs7OzswM0I3OworMDM5ODtHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQTtMdTswO0w7Ozs7O047Ozs7MDNCODsKKzAzOTk7R1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQTtMdTswO0w7Ozs7O047Ozs7MDNCOTsKKzAzOUE7R1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEE7THU7MDtMOzs7OztOOzs7OzAzQkE7CiswMzlCO0dSRUVLIENBUElUQUwgTEVUVEVSIExBTURBO0x1OzA7TDs7Ozs7TjtHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1CREE7OzswM0JCOworMDM5QztHUkVFSyBDQVBJVEFMIExFVFRFUiBNVTtMdTswO0w7Ozs7O047Ozs7MDNCQzsKKzAzOUQ7R1JFRUsgQ0FQSVRBTCBMRVRURVIgTlU7THU7MDtMOzs7OztOOzs7OzAzQkQ7CiswMzlFO0dSRUVLIENBUElUQUwgTEVUVEVSIFhJO0x1OzA7TDs7Ozs7Tjs7OzswM0JFOworMDM5RjtHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OO0x1OzA7TDs7Ozs7Tjs7OzswM0JGOworMDNBMDtHUkVFSyBDQVBJVEFMIExFVFRFUiBQSTtMdTswO0w7Ozs7O047Ozs7MDNDMDsKKzAzQTE7R1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPO0x1OzA7TDs7Ozs7Tjs7OzswM0MxOworMDNBMztHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQTtMdTswO0w7Ozs7O047Ozs7MDNDMzsKKzAzQTQ7R1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVO0x1OzA7TDs7Ozs7Tjs7OzswM0M0OworMDNBNTtHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OO0x1OzA7TDs7Ozs7Tjs7OzswM0M1OworMDNBNjtHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEk7THU7MDtMOzs7OztOOzs7OzAzQzY7CiswM0E3O0dSRUVLIENBUElUQUwgTEVUVEVSIENISTtMdTswO0w7Ozs7O047Ozs7MDNDNzsKKzAzQTg7R1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJO0x1OzA7TDs7Ozs7Tjs7OzswM0M4OworMDNBOTtHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQTtMdTswO0w7Ozs7O047Ozs7MDNDOTsKKzAzQUE7R1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQTtMdTswO0w7MDM5OSAwMzA4Ozs7O047R1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBESUFFUkVTSVM7OzswM0NBOworMDNBQjtHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBO0x1OzA7TDswM0E1IDAzMDg7Ozs7TjtHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIERJQUVSRVNJUzs7OzAzQ0I7CiswM0FDO0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TO0xsOzA7TDswM0IxIDAzMDE7Ozs7TjtHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgVE9OT1M7OzAzODY7OzAzODYKKzAzQUQ7R1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUztMbDswO0w7MDNCNSAwMzAxOzs7O047R1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gVE9OT1M7OzAzODg7OzAzODgKKzAzQUU7R1JFRUsgU01BTEwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TO0xsOzA7TDswM0I3IDAzMDE7Ozs7TjtHUkVFSyBTTUFMTCBMRVRURVIgRVRBIFRPTk9TOzswMzg5OzswMzg5CiswM0FGO0dSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggVE9OT1M7TGw7MDtMOzAzQjkgMDMwMTs7OztOO0dSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFRPTk9TOzswMzhBOzswMzhBCiswM0IwO0dSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBIEFORCBUT05PUztMbDswO0w7MDNDQiAwMzAxOzs7O047R1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gRElBRVJFU0lTIFRPTk9TOzs7OworMDNCMTtHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEE7TGw7MDtMOzs7OztOOzs7MDM5MTs7MDM5MQorMDNCMjtHUkVFSyBTTUFMTCBMRVRURVIgQkVUQTtMbDswO0w7Ozs7O047OzswMzkyOzswMzkyCiswM0IzO0dSRUVLIFNNQUxMIExFVFRFUiBHQU1NQTtMbDswO0w7Ozs7O047OzswMzkzOzswMzkzCiswM0I0O0dSRUVLIFNNQUxMIExFVFRFUiBERUxUQTtMbDswO0w7Ozs7O047OzswMzk0OzswMzk0CiswM0I1O0dSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OO0xsOzA7TDs7Ozs7Tjs7OzAzOTU7OzAzOTUKKzAzQjY7R1JFRUsgU01BTEwgTEVUVEVSIFpFVEE7TGw7MDtMOzs7OztOOzs7MDM5Njs7MDM5NgorMDNCNztHUkVFSyBTTUFMTCBMRVRURVIgRVRBO0xsOzA7TDs7Ozs7Tjs7OzAzOTc7OzAzOTcKKzAzQjg7R1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBO0xsOzA7TDs7Ozs7Tjs7OzAzOTg7OzAzOTgKKzAzQjk7R1JFRUsgU01BTEwgTEVUVEVSIElPVEE7TGw7MDtMOzs7OztOOzs7MDM5OTs7MDM5OQorMDNCQTtHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEE7TGw7MDtMOzs7OztOOzs7MDM5QTs7MDM5QQorMDNCQjtHUkVFSyBTTUFMTCBMRVRURVIgTEFNREE7TGw7MDtMOzs7OztOO0dSRUVLIFNNQUxMIExFVFRFUiBMQU1CREE7OzAzOUI7OzAzOUIKKzAzQkM7R1JFRUsgU01BTEwgTEVUVEVSIE1VO0xsOzA7TDs7Ozs7Tjs7OzAzOUM7OzAzOUMKKzAzQkQ7R1JFRUsgU01BTEwgTEVUVEVSIE5VO0xsOzA7TDs7Ozs7Tjs7OzAzOUQ7OzAzOUQKKzAzQkU7R1JFRUsgU01BTEwgTEVUVEVSIFhJO0xsOzA7TDs7Ozs7Tjs7OzAzOUU7OzAzOUUKKzAzQkY7R1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST047TGw7MDtMOzs7OztOOzs7MDM5Rjs7MDM5RgorMDNDMDtHUkVFSyBTTUFMTCBMRVRURVIgUEk7TGw7MDtMOzs7OztOOzs7MDNBMDs7MDNBMAorMDNDMTtHUkVFSyBTTUFMTCBMRVRURVIgUkhPO0xsOzA7TDs7Ozs7Tjs7OzAzQTE7OzAzQTEKKzAzQzI7R1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BO0xsOzA7TDs7Ozs7Tjs7OzAzQTM7OzAzQTMKKzAzQzM7R1JFRUsgU01BTEwgTEVUVEVSIFNJR01BO0xsOzA7TDs7Ozs7Tjs7OzAzQTM7OzAzQTMKKzAzQzQ7R1JFRUsgU01BTEwgTEVUVEVSIFRBVTtMbDswO0w7Ozs7O047OzswM0E0OzswM0E0CiswM0M1O0dSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OO0xsOzA7TDs7Ozs7Tjs7OzAzQTU7OzAzQTUKKzAzQzY7R1JFRUsgU01BTEwgTEVUVEVSIFBISTtMbDswO0w7Ozs7O047OzswM0E2OzswM0E2CiswM0M3O0dSRUVLIFNNQUxMIExFVFRFUiBDSEk7TGw7MDtMOzs7OztOOzs7MDNBNzs7MDNBNworMDNDODtHUkVFSyBTTUFMTCBMRVRURVIgUFNJO0xsOzA7TDs7Ozs7Tjs7OzAzQTg7OzAzQTgKKzAzQzk7R1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBO0xsOzA7TDs7Ozs7Tjs7OzAzQTk7OzAzQTkKKzAzQ0E7R1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0E7TGw7MDtMOzAzQjkgMDMwODs7OztOO0dSRUVLIFNNQUxMIExFVFRFUiBJT1RBIERJQUVSRVNJUzs7MDNBQTs7MDNBQQorMDNDQjtHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQTtMbDswO0w7MDNDNSAwMzA4Ozs7O047R1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gRElBRVJFU0lTOzswM0FCOzswM0FCCiswM0NDO0dSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1M7TGw7MDtMOzAzQkYgMDMwMTs7OztOO0dSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OIFRPTk9TOzswMzhDOzswMzhDCiswM0NEO0dSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1M7TGw7MDtMOzAzQzUgMDMwMTs7OztOO0dSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFRPTk9TOzswMzhFOzswMzhFCiswM0NFO0dSRUVLIFNNQUxMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TO0xsOzA7TDswM0M5IDAzMDE7Ozs7TjtHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgVE9OT1M7OzAzOEY7OzAzOEYKKzA0MDE7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU87THU7MDtMOzA0MTUgMDMwODs7OztOOzs7OzA0NTE7CiswNDAyO0NZUklMTElDIENBUElUQUwgTEVUVEVSIERKRTtMdTswO0w7Ozs7O047O1NlcmJvY3JvYXRpYW47OzA0NTI7CiswNDAzO0NZUklMTElDIENBUElUQUwgTEVUVEVSIEdKRTtMdTswO0w7MDQxMyAwMzAxOzs7O047Ozs7MDQ1MzsKKzA0MDQ7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIElFO0x1OzA7TDs7Ozs7TjtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFOzs7MDQ1NDsKKzA0MDU7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRFpFO0x1OzA7TDs7Ozs7Tjs7OzswNDU1OworMDQwNjtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEk7THU7MDtMOzs7OztOO0NZUklMTElDIENBUElUQUwgTEVUVEVSIEk7OzswNDU2OworMDQwNztDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSTtMdTswO0w7MDQwNiAwMzA4Ozs7O047O1VrcmFpbmlhbjs7MDQ1NzsKKzA0MDg7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSkU7THU7MDtMOzs7OztOOzs7OzA0NTg7CiswNDA5O0NZUklMTElDIENBUElUQUwgTEVUVEVSIExKRTtMdTswO0w7Ozs7O047Ozs7MDQ1OTsKKzA0MEE7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTkpFO0x1OzA7TDs7Ozs7Tjs7OzswNDVBOworMDQwQjtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0hFO0x1OzA7TDs7Ozs7Tjs7U2VyYm9jcm9hdGlhbjs7MDQ1QjsKKzA0MEM7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFO0x1OzA7TDswNDFBIDAzMDE7Ozs7Tjs7OzswNDVDOworMDQwRTtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBVO0x1OzA7TDswNDIzIDAzMDY7Ozs7Tjs7QnllbG9ydXNzaWFuOzswNDVFOworMDQwRjtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkhFO0x1OzA7TDs7Ozs7Tjs7OzswNDVGOworMDQxMDtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBO0x1OzA7TDs7Ozs7Tjs7OzswNDMwOworMDQxMTtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRTtMdTswO0w7Ozs7O047Ozs7MDQzMTsKKzA0MTI7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkU7THU7MDtMOzs7OztOOzs7OzA0MzI7CiswNDEzO0NZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRTtMdTswO0w7Ozs7O047Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0U7OzswNDMzOworMDQxNDtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERTtMdTswO0w7Ozs7O047Ozs7MDQzNDsKKzA0MTU7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUU7THU7MDtMOzs7OztOOzs7OzA0MzU7CiswNDE2O0NZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRTtMdTswO0w7Ozs7O047Ozs7MDQzNjsKKzA0MTc7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkU7THU7MDtMOzs7OztOOzs7OzA0Mzc7CiswNDE4O0NZUklMTElDIENBUElUQUwgTEVUVEVSIEk7THU7MDtMOzs7OztOO0NZUklMTElDIENBUElUQUwgTEVUVEVSIElJOzs7MDQzODsKKzA0MTk7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSTtMdTswO0w7MDQxOCAwMzA2Ozs7O047Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSUk7OzswNDM5OworMDQxQTtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQTtMdTswO0w7Ozs7O047Ozs7MDQzQTsKKzA0MUI7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUw7THU7MDtMOzs7OztOOzs7OzA0M0I7CiswNDFDO0NZUklMTElDIENBUElUQUwgTEVUVEVSIEVNO0x1OzA7TDs7Ozs7Tjs7OzswNDNDOworMDQxRDtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTjtMdTswO0w7Ozs7O047Ozs7MDQzRDsKKzA0MUU7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTztMdTswO0w7Ozs7O047Ozs7MDQzRTsKKzA0MUY7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUEU7THU7MDtMOzs7OztOOzs7OzA0M0Y7CiswNDIwO0NZUklMTElDIENBUElUQUwgTEVUVEVSIEVSO0x1OzA7TDs7Ozs7Tjs7OzswNDQwOworMDQyMTtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUztMdTswO0w7Ozs7O047Ozs7MDQ0MTsKKzA0MjI7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEU7THU7MDtMOzs7OztOOzs7OzA0NDI7CiswNDIzO0NZUklMTElDIENBUElUQUwgTEVUVEVSIFU7THU7MDtMOzs7OztOOzs7OzA0NDM7CiswNDI0O0NZUklMTElDIENBUElUQUwgTEVUVEVSIEVGO0x1OzA7TDs7Ozs7Tjs7OzswNDQ0OworMDQyNTtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQTtMdTswO0w7Ozs7O047Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0hBOzs7MDQ0NTsKKzA0MjY7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFO0x1OzA7TDs7Ozs7Tjs7OzswNDQ2OworMDQyNztDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEU7THU7MDtMOzs7OztOOzs7OzA0NDc7CiswNDI4O0NZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQTtMdTswO0w7Ozs7O047Ozs7MDQ0ODsKKzA0Mjk7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hDSEE7THU7MDtMOzs7OztOOzs7OzA0NDk7CiswNDJBO0NZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTjtMdTswO0w7Ozs7O047Ozs7MDQ0QTsKKzA0MkI7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVTtMdTswO0w7Ozs7O047Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSSTs7OzA0NEI7CiswNDJDO0NZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTjtMdTswO0w7Ozs7O047Ozs7MDQ0QzsKKzA0MkQ7Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRTtMdTswO0w7Ozs7O047Q1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUkVWRVJTRUQgRTs7OzA0NEQ7CiswNDJFO0NZUklMTElDIENBUElUQUwgTEVUVEVSIFlVO0x1OzA7TDs7Ozs7TjtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJVTs7OzA0NEU7CiswNDJGO0NZUklMTElDIENBUElUQUwgTEVUVEVSIFlBO0x1OzA7TDs7Ozs7TjtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJQTs7OzA0NEY7CiswNDMwO0NZUklMTElDIFNNQUxMIExFVFRFUiBBO0xsOzA7TDs7Ozs7Tjs7OzA0MTA7OzA0MTAKKzA0MzE7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFO0xsOzA7TDs7Ozs7Tjs7OzA0MTE7OzA0MTEKKzA0MzI7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFO0xsOzA7TDs7Ozs7Tjs7OzA0MTI7OzA0MTIKKzA0MzM7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRTtMbDswO0w7Ozs7O047Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEdFOzswNDEzOzswNDEzCiswNDM0O0NZUklMTElDIFNNQUxMIExFVFRFUiBERTtMbDswO0w7Ozs7O047OzswNDE0OzswNDE0CiswNDM1O0NZUklMTElDIFNNQUxMIExFVFRFUiBJRTtMbDswO0w7Ozs7O047OzswNDE1OzswNDE1CiswNDM2O0NZUklMTElDIFNNQUxMIExFVFRFUiBaSEU7TGw7MDtMOzs7OztOOzs7MDQxNjs7MDQxNgorMDQzNztDWVJJTExJQyBTTUFMTCBMRVRURVIgWkU7TGw7MDtMOzs7OztOOzs7MDQxNzs7MDQxNworMDQzODtDWVJJTExJQyBTTUFMTCBMRVRURVIgSTtMbDswO0w7Ozs7O047Q1lSSUxMSUMgU01BTEwgTEVUVEVSIElJOzswNDE4OzswNDE4CiswNDM5O0NZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJO0xsOzA7TDswNDM4IDAzMDY7Ozs7TjtDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSUk7OzA0MTk7OzA0MTkKKzA0M0E7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBO0xsOzA7TDs7Ozs7Tjs7OzA0MUE7OzA0MUEKKzA0M0I7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMO0xsOzA7TDs7Ozs7Tjs7OzA0MUI7OzA0MUIKKzA0M0M7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNO0xsOzA7TDs7Ozs7Tjs7OzA0MUM7OzA0MUMKKzA0M0Q7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOO0xsOzA7TDs7Ozs7Tjs7OzA0MUQ7OzA0MUQKKzA0M0U7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIE87TGw7MDtMOzs7OztOOzs7MDQxRTs7MDQxRQorMDQzRjtDWVJJTExJQyBTTUFMTCBMRVRURVIgUEU7TGw7MDtMOzs7OztOOzs7MDQxRjs7MDQxRgorMDQ0MDtDWVJJTExJQyBTTUFMTCBMRVRURVIgRVI7TGw7MDtMOzs7OztOOzs7MDQyMDs7MDQyMAorMDQ0MTtDWVJJTExJQyBTTUFMTCBMRVRURVIgRVM7TGw7MDtMOzs7OztOOzs7MDQyMTs7MDQyMQorMDQ0MjtDWVJJTExJQyBTTUFMTCBMRVRURVIgVEU7TGw7MDtMOzs7OztOOzs7MDQyMjs7MDQyMgorMDQ0MztDWVJJTExJQyBTTUFMTCBMRVRURVIgVTtMbDswO0w7Ozs7O047OzswNDIzOzswNDIzCiswNDQ0O0NZUklMTElDIFNNQUxMIExFVFRFUiBFRjtMbDswO0w7Ozs7O047OzswNDI0OzswNDI0CiswNDQ1O0NZUklMTElDIFNNQUxMIExFVFRFUiBIQTtMbDswO0w7Ozs7O047Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEtIQTs7MDQyNTs7MDQyNQorMDQ0NjtDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFO0xsOzA7TDs7Ozs7Tjs7OzA0MjY7OzA0MjYKKzA0NDc7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRTtMbDswO0w7Ozs7O047OzswNDI3OzswNDI3CiswNDQ4O0NZUklMTElDIFNNQUxMIExFVFRFUiBTSEE7TGw7MDtMOzs7OztOOzs7MDQyODs7MDQyOAorMDQ0OTtDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEE7TGw7MDtMOzs7OztOOzs7MDQyOTs7MDQyOQorMDQ0QTtDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOO0xsOzA7TDs7Ozs7Tjs7OzA0MkE7OzA0MkEKKzA0NEI7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlU7TGw7MDtMOzs7OztOO0NZUklMTElDIFNNQUxMIExFVFRFUiBZRVJJOzswNDJCOzswNDJCCiswNDRDO0NZUklMTElDIFNNQUxMIExFVFRFUiBTT0ZUIFNJR047TGw7MDtMOzs7OztOOzs7MDQyQzs7MDQyQworMDQ0RDtDWVJJTExJQyBTTUFMTCBMRVRURVIgRTtMbDswO0w7Ozs7O047Q1lSSUxMSUMgU01BTEwgTEVUVEVSIFJFVkVSU0VEIEU7OzA0MkQ7OzA0MkQKKzA0NEU7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVO0xsOzA7TDs7Ozs7TjtDWVJJTExJQyBTTUFMTCBMRVRURVIgSVU7OzA0MkU7OzA0MkUKKzA0NEY7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBO0xsOzA7TDs7Ozs7TjtDWVJJTExJQyBTTUFMTCBMRVRURVIgSUE7OzA0MkY7OzA0MkYKKzA0NTE7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIElPO0xsOzA7TDswNDM1IDAzMDg7Ozs7Tjs7OzA0MDE7OzA0MDEKKzA0NTI7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIERKRTtMbDswO0w7Ozs7O047O1NlcmJvY3JvYXRpYW47MDQwMjs7MDQwMgorMDQ1MztDWVJJTExJQyBTTUFMTCBMRVRURVIgR0pFO0xsOzA7TDswNDMzIDAzMDE7Ozs7Tjs7OzA0MDM7OzA0MDMKKzA0NTQ7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRTtMbDswO0w7Ozs7O047Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEU7OzA0MDQ7OzA0MDQKKzA0NTU7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIERaRTtMbDswO0w7Ozs7O047OzswNDA1OzswNDA1CiswNDU2O0NZUklMTElDIFNNQUxMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEk7TGw7MDtMOzs7OztOO0NZUklMTElDIFNNQUxMIExFVFRFUiBJOzswNDA2OzswNDA2CiswNDU3O0NZUklMTElDIFNNQUxMIExFVFRFUiBZSTtMbDswO0w7MDQ1NiAwMzA4Ozs7O047O1VrcmFpbmlhbjswNDA3OzswNDA3CiswNDU4O0NZUklMTElDIFNNQUxMIExFVFRFUiBKRTtMbDswO0w7Ozs7O047OzswNDA4OzswNDA4CiswNDU5O0NZUklMTElDIFNNQUxMIExFVFRFUiBMSkU7TGw7MDtMOzs7OztOOzs7MDQwOTs7MDQwOQorMDQ1QTtDWVJJTExJQyBTTUFMTCBMRVRURVIgTkpFO0xsOzA7TDs7Ozs7Tjs7OzA0MEE7OzA0MEEKKzA0NUI7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTSEU7TGw7MDtMOzs7OztOOztTZXJib2Nyb2F0aWFuOzA0MEI7OzA0MEIKKzA0NUM7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEtKRTtMbDswO0w7MDQzQSAwMzAxOzs7O047OzswNDBDOzswNDBDCiswNDVFO0NZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVO0xsOzA7TDswNDQzIDAzMDY7Ozs7Tjs7QnllbG9ydXNzaWFuOzA0MEU7OzA0MEUKKzA0NUY7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIERaSEU7TGw7MDtMOzs7OztOOzs7MDQwRjs7MDQwRgorMDQ5MDtDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUgV0lUSCBVUFRVUk47THU7MDtMOzs7OztOO0NZUklMTElDIENBUElUQUwgTEVUVEVSIEdFIFdJVEggVVBUVVJOOzs7MDQ5MTsKKzA0OTE7Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRSBXSVRIIFVQVFVSTjtMbDswO0w7Ozs7O047Q1lSSUxMSUMgU01BTEwgTEVUVEVSIEdFIFdJVEggVVBUVVJOOzswNDkwOzswNDkwCiswNUIwO0hFQlJFVyBQT0lOVCBTSEVWQTtNbjsxMDtOU007Ozs7O047Ozs7OworMDVCMTtIRUJSRVcgUE9JTlQgSEFUQUYgU0VHT0w7TW47MTE7TlNNOzs7OztOOzs7OzsKKzA1QjI7SEVCUkVXIFBPSU5UIEhBVEFGIFBBVEFIO01uOzEyO05TTTs7Ozs7Tjs7Ozs7CiswNUIzO0hFQlJFVyBQT0lOVCBIQVRBRiBRQU1BVFM7TW47MTM7TlNNOzs7OztOOzs7OzsKKzA1QjQ7SEVCUkVXIFBPSU5UIEhJUklRO01uOzE0O05TTTs7Ozs7Tjs7Ozs7CiswNUI1O0hFQlJFVyBQT0lOVCBUU0VSRTtNbjsxNTtOU007Ozs7O047Ozs7OworMDVCNjtIRUJSRVcgUE9JTlQgU0VHT0w7TW47MTY7TlNNOzs7OztOOzs7OzsKKzA1Qjc7SEVCUkVXIFBPSU5UIFBBVEFIO01uOzE3O05TTTs7Ozs7Tjs7Ozs7CiswNUI4O0hFQlJFVyBQT0lOVCBRQU1BVFM7TW47MTg7TlNNOzs7OztOOzs7OzsKKzA1Qjk7SEVCUkVXIFBPSU5UIEhPTEFNO01uOzE5O05TTTs7Ozs7Tjs7Ozs7CiswNUJCO0hFQlJFVyBQT0lOVCBRVUJVVFM7TW47MjA7TlNNOzs7OztOOzs7OzsKKzA1QkM7SEVCUkVXIFBPSU5UIERBR0VTSCBPUiBNQVBJUTtNbjsyMTtOU007Ozs7O047SEVCUkVXIFBPSU5UIERBR0VTSDtvciBzaHVydXE7OzsKKzA1QkQ7SEVCUkVXIFBPSU5UIE1FVEVHO01uOzIyO05TTTs7Ozs7Tjs7Kjs7OworMDVCRTtIRUJSRVcgUFVOQ1RVQVRJT04gTUFRQUY7UGQ7MDtSOzs7OztOOzs7OzsKKzA1QkY7SEVCUkVXIFBPSU5UIFJBRkU7TW47MjM7TlNNOzs7OztOOzs7OzsKKzA1QzA7SEVCUkVXIFBVTkNUVUFUSU9OIFBBU0VRO1BvOzA7Ujs7Ozs7TjtIRUJSRVcgUE9JTlQgUEFTRVE7Kjs7OworMDVDMTtIRUJSRVcgUE9JTlQgU0hJTiBET1Q7TW47MjQ7TlNNOzs7OztOOzs7OzsKKzA1QzI7SEVCUkVXIFBPSU5UIFNJTiBET1Q7TW47MjU7TlNNOzs7OztOOzs7OzsKKzA1QzM7SEVCUkVXIFBVTkNUVUFUSU9OIFNPRiBQQVNVUTtQbzswO1I7Ozs7O047Oyo7OzsKKzA1RDA7SEVCUkVXIExFVFRFUiBBTEVGO0xvOzA7Ujs7Ozs7Tjs7Ozs7CiswNUQxO0hFQlJFVyBMRVRURVIgQkVUO0xvOzA7Ujs7Ozs7Tjs7Ozs7CiswNUQyO0hFQlJFVyBMRVRURVIgR0lNRUw7TG87MDtSOzs7OztOOzs7OzsKKzA1RDM7SEVCUkVXIExFVFRFUiBEQUxFVDtMbzswO1I7Ozs7O047Ozs7OworMDVENDtIRUJSRVcgTEVUVEVSIEhFO0xvOzA7Ujs7Ozs7Tjs7Ozs7CiswNUQ1O0hFQlJFVyBMRVRURVIgVkFWO0xvOzA7Ujs7Ozs7Tjs7Ozs7CiswNUQ2O0hFQlJFVyBMRVRURVIgWkFZSU47TG87MDtSOzs7OztOOzs7OzsKKzA1RDc7SEVCUkVXIExFVFRFUiBIRVQ7TG87MDtSOzs7OztOOzs7OzsKKzA1RDg7SEVCUkVXIExFVFRFUiBURVQ7TG87MDtSOzs7OztOOzs7OzsKKzA1RDk7SEVCUkVXIExFVFRFUiBZT0Q7TG87MDtSOzs7OztOOzs7OzsKKzA1REE7SEVCUkVXIExFVFRFUiBGSU5BTCBLQUY7TG87MDtSOzs7OztOOzs7OzsKKzA1REI7SEVCUkVXIExFVFRFUiBLQUY7TG87MDtSOzs7OztOOzs7OzsKKzA1REM7SEVCUkVXIExFVFRFUiBMQU1FRDtMbzswO1I7Ozs7O047Ozs7OworMDVERDtIRUJSRVcgTEVUVEVSIEZJTkFMIE1FTTtMbzswO1I7Ozs7O047Ozs7OworMDVERTtIRUJSRVcgTEVUVEVSIE1FTTtMbzswO1I7Ozs7O047Ozs7OworMDVERjtIRUJSRVcgTEVUVEVSIEZJTkFMIE5VTjtMbzswO1I7Ozs7O047Ozs7OworMDVFMDtIRUJSRVcgTEVUVEVSIE5VTjtMbzswO1I7Ozs7O047Ozs7OworMDVFMTtIRUJSRVcgTEVUVEVSIFNBTUVLSDtMbzswO1I7Ozs7O047Ozs7OworMDVFMjtIRUJSRVcgTEVUVEVSIEFZSU47TG87MDtSOzs7OztOOzs7OzsKKzA1RTM7SEVCUkVXIExFVFRFUiBGSU5BTCBQRTtMbzswO1I7Ozs7O047Ozs7OworMDVFNDtIRUJSRVcgTEVUVEVSIFBFO0xvOzA7Ujs7Ozs7Tjs7Ozs7CiswNUU1O0hFQlJFVyBMRVRURVIgRklOQUwgVFNBREk7TG87MDtSOzs7OztOOzs7OzsKKzA1RTY7SEVCUkVXIExFVFRFUiBUU0FESTtMbzswO1I7Ozs7O047Ozs7OworMDVFNztIRUJSRVcgTEVUVEVSIFFPRjtMbzswO1I7Ozs7O047Ozs7OworMDVFODtIRUJSRVcgTEVUVEVSIFJFU0g7TG87MDtSOzs7OztOOzs7OzsKKzA1RTk7SEVCUkVXIExFVFRFUiBTSElOO0xvOzA7Ujs7Ozs7Tjs7Ozs7CiswNUVBO0hFQlJFVyBMRVRURVIgVEFWO0xvOzA7Ujs7Ozs7Tjs7Ozs7CiswNUYwO0hFQlJFVyBMSUdBVFVSRSBZSURESVNIIERPVUJMRSBWQVY7TG87MDtSOzs7OztOO0hFQlJFVyBMRVRURVIgRE9VQkxFIFZBVjs7OzsKKzA1RjE7SEVCUkVXIExJR0FUVVJFIFlJRERJU0ggVkFWIFlPRDtMbzswO1I7Ozs7O047SEVCUkVXIExFVFRFUiBWQVYgWU9EOzs7OworMDVGMjtIRUJSRVcgTElHQVRVUkUgWUlERElTSCBET1VCTEUgWU9EO0xvOzA7Ujs7Ozs7TjtIRUJSRVcgTEVUVEVSIERPVUJMRSBZT0Q7Ozs7CiswNUYzO0hFQlJFVyBQVU5DVFVBVElPTiBHRVJFU0g7UG87MDtSOzs7OztOOzs7OzsKKzA1RjQ7SEVCUkVXIFBVTkNUVUFUSU9OIEdFUlNIQVlJTTtQbzswO1I7Ozs7O047Ozs7OworMDYwQztBUkFCSUMgQ09NTUE7UG87MDtDUzs7Ozs7Tjs7Ozs7CiswNjFCO0FSQUJJQyBTRU1JQ09MT047UG87MDtBTDs7Ozs7Tjs7Ozs7CiswNjFGO0FSQUJJQyBRVUVTVElPTiBNQVJLO1BvOzA7QUw7Ozs7O047Ozs7OworMDYyMTtBUkFCSUMgTEVUVEVSIEhBTVpBO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBIQU1aQUg7Ozs7CiswNjIyO0FSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFO0xvOzA7QUw7MDYyNyAwNjUzOzs7O047QVJBQklDIExFVFRFUiBNQUREQUggT04gQUxFRjs7OzsKKzA2MjM7QVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkU7TG87MDtBTDswNjI3IDA2NTQ7Ozs7TjtBUkFCSUMgTEVUVEVSIEhBTVpBSCBPTiBBTEVGOzs7OworMDYyNDtBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFO0xvOzA7QUw7MDY0OCAwNjU0Ozs7O047QVJBQklDIExFVFRFUiBIQU1aQUggT04gV0FXOzs7OworMDYyNTtBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBCRUxPVztMbzswO0FMOzA2MjcgMDY1NTs7OztOO0FSQUJJQyBMRVRURVIgSEFNWkFIIFVOREVSIEFMRUY7Ozs7CiswNjI2O0FSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkU7TG87MDtBTDswNjRBIDA2NTQ7Ozs7TjtBUkFCSUMgTEVUVEVSIEhBTVpBSCBPTiBZQTs7OzsKKzA2Mjc7QVJBQklDIExFVFRFUiBBTEVGO0xvOzA7QUw7Ozs7O047Ozs7OworMDYyODtBUkFCSUMgTEVUVEVSIEJFSDtMbzswO0FMOzs7OztOO0FSQUJJQyBMRVRURVIgQkFBOzs7OworMDYyOTtBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBUQUEgTUFSQlVUQUg7Ozs7CiswNjJBO0FSQUJJQyBMRVRURVIgVEVIO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBUQUE7Ozs7CiswNjJCO0FSQUJJQyBMRVRURVIgVEhFSDtMbzswO0FMOzs7OztOO0FSQUJJQyBMRVRURVIgVEhBQTs7OzsKKzA2MkM7QVJBQklDIExFVFRFUiBKRUVNO0xvOzA7QUw7Ozs7O047Ozs7OworMDYyRDtBUkFCSUMgTEVUVEVSIEhBSDtMbzswO0FMOzs7OztOO0FSQUJJQyBMRVRURVIgSEFBOzs7OworMDYyRTtBUkFCSUMgTEVUVEVSIEtIQUg7TG87MDtBTDs7Ozs7TjtBUkFCSUMgTEVUVEVSIEtIQUE7Ozs7CiswNjJGO0FSQUJJQyBMRVRURVIgREFMO0xvOzA7QUw7Ozs7O047Ozs7OworMDYzMDtBUkFCSUMgTEVUVEVSIFRIQUw7TG87MDtBTDs7Ozs7Tjs7Ozs7CiswNjMxO0FSQUJJQyBMRVRURVIgUkVIO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBSQTs7OzsKKzA2MzI7QVJBQklDIExFVFRFUiBaQUlOO0xvOzA7QUw7Ozs7O047Ozs7OworMDYzMztBUkFCSUMgTEVUVEVSIFNFRU47TG87MDtBTDs7Ozs7Tjs7Ozs7CiswNjM0O0FSQUJJQyBMRVRURVIgU0hFRU47TG87MDtBTDs7Ozs7Tjs7Ozs7CiswNjM1O0FSQUJJQyBMRVRURVIgU0FEO0xvOzA7QUw7Ozs7O047Ozs7OworMDYzNjtBUkFCSUMgTEVUVEVSIERBRDtMbzswO0FMOzs7OztOOzs7OzsKKzA2Mzc7QVJBQklDIExFVFRFUiBUQUg7TG87MDtBTDs7Ozs7Tjs7Ozs7CiswNjM4O0FSQUJJQyBMRVRURVIgWkFIO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBESEFIOzs7OworMDYzOTtBUkFCSUMgTEVUVEVSIEFJTjtMbzswO0FMOzs7OztOOzs7OzsKKzA2M0E7QVJBQklDIExFVFRFUiBHSEFJTjtMbzswO0FMOzs7OztOOzs7OzsKKzA2NDA7QVJBQklDIFRBVFdFRUw7TG07MDtBTDs7Ozs7Tjs7Ozs7CiswNjQxO0FSQUJJQyBMRVRURVIgRkVIO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBGQTs7OzsKKzA2NDI7QVJBQklDIExFVFRFUiBRQUY7TG87MDtBTDs7Ozs7Tjs7Ozs7CiswNjQzO0FSQUJJQyBMRVRURVIgS0FGO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBDQUY7Ozs7CiswNjQ0O0FSQUJJQyBMRVRURVIgTEFNO0xvOzA7QUw7Ozs7O047Ozs7OworMDY0NTtBUkFCSUMgTEVUVEVSIE1FRU07TG87MDtBTDs7Ozs7Tjs7Ozs7CiswNjQ2O0FSQUJJQyBMRVRURVIgTk9PTjtMbzswO0FMOzs7OztOOzs7OzsKKzA2NDc7QVJBQklDIExFVFRFUiBIRUg7TG87MDtBTDs7Ozs7TjtBUkFCSUMgTEVUVEVSIEhBOzs7OworMDY0ODtBUkFCSUMgTEVUVEVSIFdBVztMbzswO0FMOzs7OztOOzs7OzsKKzA2NDk7QVJBQklDIExFVFRFUiBBTEVGIE1BS1NVUkE7TG87MDtBTDs7Ozs7TjtBUkFCSUMgTEVUVEVSIEFMRUYgTUFRU1VSQUg7Ozs7CiswNjRBO0FSQUJJQyBMRVRURVIgWUVIO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBZQTs7OzsKKzA2NEI7QVJBQklDIEZBVEhBVEFOO01uOzI3O05TTTs7Ozs7Tjs7Ozs7CiswNjRDO0FSQUJJQyBEQU1NQVRBTjtNbjsyODtOU007Ozs7O047Ozs7OworMDY0RDtBUkFCSUMgS0FTUkFUQU47TW47Mjk7TlNNOzs7OztOOzs7OzsKKzA2NEU7QVJBQklDIEZBVEhBO01uOzMwO05TTTs7Ozs7TjtBUkFCSUMgRkFUSEFIOzs7OworMDY0RjtBUkFCSUMgREFNTUE7TW47MzE7TlNNOzs7OztOO0FSQUJJQyBEQU1NQUg7Ozs7CiswNjUwO0FSQUJJQyBLQVNSQTtNbjszMjtOU007Ozs7O047QVJBQklDIEtBU1JBSDs7OzsKKzA2NTE7QVJBQklDIFNIQUREQTtNbjszMztOU007Ozs7O047QVJBQklDIFNIQUREQUg7Ozs7CiswNjUyO0FSQUJJQyBTVUtVTjtNbjszNDtOU007Ozs7O047Ozs7OworMDY2MDtBUkFCSUMtSU5ESUMgRElHSVQgWkVSTztOZDswO0FOOzswOzA7MDtOOzs7OzsKKzA2NjE7QVJBQklDLUlORElDIERJR0lUIE9ORTtOZDswO0FOOzsxOzE7MTtOOzs7OzsKKzA2NjI7QVJBQklDLUlORElDIERJR0lUIFRXTztOZDswO0FOOzsyOzI7MjtOOzs7OzsKKzA2NjM7QVJBQklDLUlORElDIERJR0lUIFRIUkVFO05kOzA7QU47OzM7MzszO047Ozs7OworMDY2NDtBUkFCSUMtSU5ESUMgRElHSVQgRk9VUjtOZDswO0FOOzs0OzQ7NDtOOzs7OzsKKzA2NjU7QVJBQklDLUlORElDIERJR0lUIEZJVkU7TmQ7MDtBTjs7NTs1OzU7Tjs7Ozs7CiswNjY2O0FSQUJJQy1JTkRJQyBESUdJVCBTSVg7TmQ7MDtBTjs7Njs2OzY7Tjs7Ozs7CiswNjY3O0FSQUJJQy1JTkRJQyBESUdJVCBTRVZFTjtOZDswO0FOOzs3Ozc7NztOOzs7OzsKKzA2Njg7QVJBQklDLUlORElDIERJR0lUIEVJR0hUO05kOzA7QU47Ozg7ODs4O047Ozs7OworMDY2OTtBUkFCSUMtSU5ESUMgRElHSVQgTklORTtOZDswO0FOOzs5Ozk7OTtOOzs7OzsKKzA2NkE7QVJBQklDIFBFUkNFTlQgU0lHTjtQbzswO0VUOzs7OztOOzs7OzsKKzA2Nzk7QVJBQklDIExFVFRFUiBUVEVIO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBUQUEgV0lUSCBTTUFMTCBUQUg7Ozs7CiswNjdFO0FSQUJJQyBMRVRURVIgUEVIO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBUQUEgV0lUSCBUSFJFRSBET1RTIEJFTE9XOzs7OworMDY4NjtBUkFCSUMgTEVUVEVSIFRDSEVIO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBIQUEgV0lUSCBNSURETEUgVEhSRUUgRE9UUyBET1dOV0FSRDs7OzsKKzA2ODg7QVJBQklDIExFVFRFUiBEREFMO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBEQUwgV0lUSCBTTUFMTCBUQUg7Ozs7CiswNjkxO0FSQUJJQyBMRVRURVIgUlJFSDtMbzswO0FMOzs7OztOO0FSQUJJQyBMRVRURVIgUkEgV0lUSCBTTUFMTCBUQUg7Ozs7CiswNjk4O0FSQUJJQyBMRVRURVIgSkVIO0xvOzA7QUw7Ozs7O047QVJBQklDIExFVFRFUiBSQSBXSVRIIFRIUkVFIERPVFMgQUJPVkU7Ozs7CiswNkE5O0FSQUJJQyBMRVRURVIgS0VIRUg7TG87MDtBTDs7Ozs7TjtBUkFCSUMgTEVUVEVSIE9QRU4gQ0FGOzs7OworMDZBRjtBUkFCSUMgTEVUVEVSIEdBRjtMbzswO0FMOzs7OztOOzsqOzs7CiswNkJBO0FSQUJJQyBMRVRURVIgTk9PTiBHSFVOTkE7TG87MDtBTDs7Ozs7TjtBUkFCSUMgTEVUVEVSIERPVExFU1MgTk9PTjs7OzsKKzA2QkU7QVJBQklDIExFVFRFUiBIRUggRE9BQ0hBU0hNRUU7TG87MDtBTDs7Ozs7TjtBUkFCSUMgTEVUVEVSIEtOT1RURUQgSEE7Ozs7CiswNkMxO0FSQUJJQyBMRVRURVIgSEVIIEdPQUw7TG87MDtBTDs7Ozs7TjtBUkFCSUMgTEVUVEVSIEhBIEdPQUw7Ozs7CiswNkQyO0FSQUJJQyBMRVRURVIgWUVIIEJBUlJFRTtMbzswO0FMOzs7OztOO0FSQUJJQyBMRVRURVIgWUEgQkFSUkVFOzs7OworMEUwMTtUSEFJIENIQVJBQ1RFUiBLTyBLQUk7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIEtPIEtBSTs7OzsKKzBFMDI7VEhBSSBDSEFSQUNURVIgS0hPIEtIQUk7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIEtITyBLSEFJOzs7OworMEUwMztUSEFJIENIQVJBQ1RFUiBLSE8gS0hVQVQ7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIEtITyBLSFVBVDs7OzsKKzBFMDQ7VEhBSSBDSEFSQUNURVIgS0hPIEtIV0FJO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBLSE8gS0hXQUk7Ozs7CiswRTA1O1RIQUkgQ0hBUkFDVEVSIEtITyBLSE9OO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBLSE8gS0hPTjs7OzsKKzBFMDY7VEhBSSBDSEFSQUNURVIgS0hPIFJBS0hBTkc7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIEtITyBSQUtIQU5HOzs7OworMEUwNztUSEFJIENIQVJBQ1RFUiBOR08gTkdVO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBOR08gTkdVOzs7OworMEUwODtUSEFJIENIQVJBQ1RFUiBDSE8gQ0hBTjtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgQ0hPIENIQU47Ozs7CiswRTA5O1RIQUkgQ0hBUkFDVEVSIENITyBDSElORztMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgQ0hPIENISU5HOzs7OworMEUwQTtUSEFJIENIQVJBQ1RFUiBDSE8gQ0hBTkc7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIENITyBDSEFORzs7OzsKKzBFMEI7VEhBSSBDSEFSQUNURVIgU08gU087TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIFNPIFNPOzs7OworMEUwQztUSEFJIENIQVJBQ1RFUiBDSE8gQ0hPRTtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgQ0hPIENIT0U7Ozs7CiswRTBEO1RIQUkgQ0hBUkFDVEVSIFlPIFlJTkc7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIFlPIFlJTkc7Ozs7CiswRTBFO1RIQUkgQ0hBUkFDVEVSIERPIENIQURBO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBETyBDSEFEQTs7OzsKKzBFMEY7VEhBSSBDSEFSQUNURVIgVE8gUEFUQUs7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIFRPIFBBVEFLOzs7OworMEUxMDtUSEFJIENIQVJBQ1RFUiBUSE8gVEhBTjtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgVEhPIFRIQU47Ozs7CiswRTExO1RIQUkgQ0hBUkFDVEVSIFRITyBOQU5HTU9OVEhPO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBUSE8gTkFOR01PTlRITzs7OzsKKzBFMTI7VEhBSSBDSEFSQUNURVIgVEhPIFBIVVRIQU87TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIFRITyBQSFVUSEFPOzs7OworMEUxMztUSEFJIENIQVJBQ1RFUiBOTyBORU47TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIE5PIE5FTjs7OzsKKzBFMTQ7VEhBSSBDSEFSQUNURVIgRE8gREVLO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBETyBERUs7Ozs7CiswRTE1O1RIQUkgQ0hBUkFDVEVSIFRPIFRBTztMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgVE8gVEFPOzs7OworMEUxNjtUSEFJIENIQVJBQ1RFUiBUSE8gVEhVTkc7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIFRITyBUSFVORzs7OzsKKzBFMTc7VEhBSSBDSEFSQUNURVIgVEhPIFRIQUhBTjtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgVEhPIFRIQUhBTjs7OzsKKzBFMTg7VEhBSSBDSEFSQUNURVIgVEhPIFRIT05HO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBUSE8gVEhPTkc7Ozs7CiswRTE5O1RIQUkgQ0hBUkFDVEVSIE5PIE5VO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBOTyBOVTs7OzsKKzBFMUE7VEhBSSBDSEFSQUNURVIgQk8gQkFJTUFJO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBCTyBCQUlNQUk7Ozs7CiswRTFCO1RIQUkgQ0hBUkFDVEVSIFBPIFBMQTtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgUE8gUExBOzs7OworMEUxQztUSEFJIENIQVJBQ1RFUiBQSE8gUEhVTkc7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIFBITyBQSFVORzs7OzsKKzBFMUQ7VEhBSSBDSEFSQUNURVIgRk8gRkE7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIEZPIEZBOzs7OworMEUxRTtUSEFJIENIQVJBQ1RFUiBQSE8gUEhBTjtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgUEhPIFBIQU47Ozs7CiswRTFGO1RIQUkgQ0hBUkFDVEVSIEZPIEZBTjtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgRk8gRkFOOzs7OworMEUyMDtUSEFJIENIQVJBQ1RFUiBQSE8gU0FNUEhBTztMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgUEhPIFNBTVBIQU87Ozs7CiswRTIxO1RIQUkgQ0hBUkFDVEVSIE1PIE1BO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBNTyBNQTs7OzsKKzBFMjI7VEhBSSBDSEFSQUNURVIgWU8gWUFLO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBZTyBZQUs7Ozs7CiswRTIzO1RIQUkgQ0hBUkFDVEVSIFJPIFJVQTtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgUk8gUlVBOzs7OworMEUyNDtUSEFJIENIQVJBQ1RFUiBSVTtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgUlU7Ozs7CiswRTI1O1RIQUkgQ0hBUkFDVEVSIExPIExJTkc7TG87MDtMOzs7OztOO1RIQUkgTEVUVEVSIExPIExJTkc7Ozs7CiswRTI2O1RIQUkgQ0hBUkFDVEVSIExVO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBMVTs7OzsKKzBFMjc7VEhBSSBDSEFSQUNURVIgV08gV0FFTjtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgV08gV0FFTjs7OzsKKzBFMjg7VEhBSSBDSEFSQUNURVIgU08gU0FMQTtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgU08gU0FMQTs7OzsKKzBFMjk7VEhBSSBDSEFSQUNURVIgU08gUlVTSTtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgU08gUlVTSTs7OzsKKzBFMkE7VEhBSSBDSEFSQUNURVIgU08gU1VBO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBTTyBTVUE7Ozs7CiswRTJCO1RIQUkgQ0hBUkFDVEVSIEhPIEhJUDtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgSE8gSElQOzs7OworMEUyQztUSEFJIENIQVJBQ1RFUiBMTyBDSFVMQTtMbzswO0w7Ozs7O047VEhBSSBMRVRURVIgTE8gQ0hVTEE7Ozs7CiswRTJEO1RIQUkgQ0hBUkFDVEVSIE8gQU5HO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBPIEFORzs7OzsKKzBFMkU7VEhBSSBDSEFSQUNURVIgSE8gTk9LSFVLO0xvOzA7TDs7Ozs7TjtUSEFJIExFVFRFUiBITyBOT0sgSFVLOzs7OworMEUyRjtUSEFJIENIQVJBQ1RFUiBQQUlZQU5OT0k7TG87MDtMOzs7OztOO1RIQUkgUEFJIFlBTiBOT0k7cGFpeWFuIG5vaTs7OworMEUzMDtUSEFJIENIQVJBQ1RFUiBTQVJBIEE7TG87MDtMOzs7OztOO1RIQUkgVk9XRUwgU0lHTiBTQVJBIEE7Ozs7CiswRTMxO1RIQUkgQ0hBUkFDVEVSIE1BSSBIQU4tQUtBVDtNbjswO05TTTs7Ozs7TjtUSEFJIFZPV0VMIFNJR04gTUFJIEhBTi1BS0FUOzs7OworMEUzMjtUSEFJIENIQVJBQ1RFUiBTQVJBIEFBO0xvOzA7TDs7Ozs7TjtUSEFJIFZPV0VMIFNJR04gU0FSQSBBQTs7OzsKKzBFMzM7VEhBSSBDSEFSQUNURVIgU0FSQSBBTTtMbzswO0w7PGNvbXBhdD4gMEU0RCAwRTMyOzs7O047VEhBSSBWT1dFTCBTSUdOIFNBUkEgQU07Ozs7CiswRTM0O1RIQUkgQ0hBUkFDVEVSIFNBUkEgSTtNbjswO05TTTs7Ozs7TjtUSEFJIFZPV0VMIFNJR04gU0FSQSBJOzs7OworMEUzNTtUSEFJIENIQVJBQ1RFUiBTQVJBIElJO01uOzA7TlNNOzs7OztOO1RIQUkgVk9XRUwgU0lHTiBTQVJBIElJOzs7OworMEUzNjtUSEFJIENIQVJBQ1RFUiBTQVJBIFVFO01uOzA7TlNNOzs7OztOO1RIQUkgVk9XRUwgU0lHTiBTQVJBIFVFOzs7OworMEUzNztUSEFJIENIQVJBQ1RFUiBTQVJBIFVFRTtNbjswO05TTTs7Ozs7TjtUSEFJIFZPV0VMIFNJR04gU0FSQSBVRUU7c2FyYSB1dWU7OzsKKzBFMzg7VEhBSSBDSEFSQUNURVIgU0FSQSBVO01uOzEwMztOU007Ozs7O047VEhBSSBWT1dFTCBTSUdOIFNBUkEgVTs7OzsKKzBFMzk7VEhBSSBDSEFSQUNURVIgU0FSQSBVVTtNbjsxMDM7TlNNOzs7OztOO1RIQUkgVk9XRUwgU0lHTiBTQVJBIFVVOzs7OworMEUzQTtUSEFJIENIQVJBQ1RFUiBQSElOVEhVO01uOzk7TlNNOzs7OztOO1RIQUkgVk9XRUwgU0lHTiBQSElOVEhVOzs7OworMEUzRjtUSEFJIENVUlJFTkNZIFNZTUJPTCBCQUhUO1NjOzA7RVQ7Ozs7O047VEhBSSBCQUhUIFNJR047Ozs7CiswRTQwO1RIQUkgQ0hBUkFDVEVSIFNBUkEgRTtMbzswO0w7Ozs7O047VEhBSSBWT1dFTCBTSUdOIFNBUkEgRTs7OzsKKzBFNDE7VEhBSSBDSEFSQUNURVIgU0FSQSBBRTtMbzswO0w7Ozs7O047VEhBSSBWT1dFTCBTSUdOIFNBUkEgQUU7Ozs7CiswRTQyO1RIQUkgQ0hBUkFDVEVSIFNBUkEgTztMbzswO0w7Ozs7O047VEhBSSBWT1dFTCBTSUdOIFNBUkEgTzs7OzsKKzBFNDM7VEhBSSBDSEFSQUNURVIgU0FSQSBBSSBNQUlNVUFOO0xvOzA7TDs7Ozs7TjtUSEFJIFZPV0VMIFNJR04gU0FSQSBNQUkgTVVBTjtzYXJhIGFpIG1haSBtdWFuOzs7CiswRTQ0O1RIQUkgQ0hBUkFDVEVSIFNBUkEgQUkgTUFJTUFMQUk7TG87MDtMOzs7OztOO1RIQUkgVk9XRUwgU0lHTiBTQVJBIE1BSSBNQUxBSTtzYXJhIGFpIG1haSBtYWxhaTs7OworMEU0NTtUSEFJIENIQVJBQ1RFUiBMQUtLSEFOR1lBTztMbzswO0w7Ozs7O047VEhBSSBMQUsgS0hBTkcgWUFPO2xha2toYW5nIHlhbzs7OworMEU0NjtUSEFJIENIQVJBQ1RFUiBNQUlZQU1PSztMbTswO0w7Ozs7O047VEhBSSBNQUkgWUFNT0s7bWFpIHlhbW9rOzs7CiswRTQ3O1RIQUkgQ0hBUkFDVEVSIE1BSVRBSUtIVTtNbjswO05TTTs7Ozs7TjtUSEFJIFZPV0VMIFNJR04gTUFJIFRBSSBLSFU7bWFpIHRhaWtodTs7OworMEU0ODtUSEFJIENIQVJBQ1RFUiBNQUkgRUs7TW47MTA3O05TTTs7Ozs7TjtUSEFJIFRPTkUgTUFJIEVLOzs7OworMEU0OTtUSEFJIENIQVJBQ1RFUiBNQUkgVEhPO01uOzEwNztOU007Ozs7O047VEhBSSBUT05FIE1BSSBUSE87Ozs7CiswRTRBO1RIQUkgQ0hBUkFDVEVSIE1BSSBUUkk7TW47MTA3O05TTTs7Ozs7TjtUSEFJIFRPTkUgTUFJIFRSSTs7OzsKKzBFNEI7VEhBSSBDSEFSQUNURVIgTUFJIENIQVRUQVdBO01uOzEwNztOU007Ozs7O047VEhBSSBUT05FIE1BSSBDSEFUVEFXQTs7OzsKKzBFNEM7VEhBSSBDSEFSQUNURVIgVEhBTlRIQUtIQVQ7TW47MDtOU007Ozs7O047VEhBSSBUSEFOVEhBS0hBVDs7OzsKKzBFNEQ7VEhBSSBDSEFSQUNURVIgTklLSEFISVQ7TW47MDtOU007Ozs7O047VEhBSSBOSUtLSEFISVQ7bmlra2hhaGl0Ozs7CiswRTRFO1RIQUkgQ0hBUkFDVEVSIFlBTUFLS0FOO01uOzA7TlNNOzs7OztOO1RIQUkgWUFNQUtLQU47Ozs7CiswRTRGO1RIQUkgQ0hBUkFDVEVSIEZPTkdNQU47UG87MDtMOzs7OztOO1RIQUkgRk9OR01BTjs7OzsKKzBFNTA7VEhBSSBESUdJVCBaRVJPO05kOzA7TDs7MDswOzA7Tjs7Ozs7CiswRTUxO1RIQUkgRElHSVQgT05FO05kOzA7TDs7MTsxOzE7Tjs7Ozs7CiswRTUyO1RIQUkgRElHSVQgVFdPO05kOzA7TDs7MjsyOzI7Tjs7Ozs7CiswRTUzO1RIQUkgRElHSVQgVEhSRUU7TmQ7MDtMOzszOzM7MztOOzs7OzsKKzBFNTQ7VEhBSSBESUdJVCBGT1VSO05kOzA7TDs7NDs0OzQ7Tjs7Ozs7CiswRTU1O1RIQUkgRElHSVQgRklWRTtOZDswO0w7OzU7NTs1O047Ozs7OworMEU1NjtUSEFJIERJR0lUIFNJWDtOZDswO0w7OzY7Njs2O047Ozs7OworMEU1NztUSEFJIERJR0lUIFNFVkVOO05kOzA7TDs7Nzs3Ozc7Tjs7Ozs7CiswRTU4O1RIQUkgRElHSVQgRUlHSFQ7TmQ7MDtMOzs4Ozg7ODtOOzs7OzsKKzBFNTk7VEhBSSBESUdJVCBOSU5FO05kOzA7TDs7OTs5Ozk7Tjs7Ozs7CiswRTVBO1RIQUkgQ0hBUkFDVEVSIEFOR0tIQU5LSFU7UG87MDtMOzs7OztOO1RIQUkgQU5HS0hBTktIVTs7OzsKKzBFNUI7VEhBSSBDSEFSQUNURVIgS0hPTVVUO1BvOzA7TDs7Ozs7TjtUSEFJIEtIT01VVDs7OzsKKzFFMDI7TEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIERPVCBBQk9WRTtMdTswO0w7MDA0MiAwMzA3Ozs7O047Ozs7MUUwMzsKKzFFMDM7TEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBET1QgQUJPVkU7TGw7MDtMOzAwNjIgMDMwNzs7OztOOzs7MUUwMjs7MUUwMgorMUUwQTtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggRE9UIEFCT1ZFO0x1OzA7TDswMDQ0IDAzMDc7Ozs7Tjs7OzsxRTBCOworMUUwQjtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIERPVCBBQk9WRTtMbDswO0w7MDA2NCAwMzA3Ozs7O047OzsxRTBBOzsxRTBBCisxRTFFO0xBVElOIENBUElUQUwgTEVUVEVSIEYgV0lUSCBET1QgQUJPVkU7THU7MDtMOzAwNDYgMDMwNzs7OztOOzs7OzFFMUY7CisxRTFGO0xBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFO0xsOzA7TDswMDY2IDAzMDc7Ozs7Tjs7OzFFMUU7OzFFMUUKKzFFNDA7TEFUSU4gQ0FQSVRBTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRTtMdTswO0w7MDA0RCAwMzA3Ozs7O047Ozs7MUU0MTsKKzFFNDE7TEFUSU4gU01BTEwgTEVUVEVSIE0gV0lUSCBET1QgQUJPVkU7TGw7MDtMOzAwNkQgMDMwNzs7OztOOzs7MUU0MDs7MUU0MAorMUU1NjtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggRE9UIEFCT1ZFO0x1OzA7TDswMDUwIDAzMDc7Ozs7Tjs7OzsxRTU3OworMUU1NztMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIERPVCBBQk9WRTtMbDswO0w7MDA3MCAwMzA3Ozs7O047OzsxRTU2OzsxRTU2CisxRTYwO0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBET1QgQUJPVkU7THU7MDtMOzAwNTMgMDMwNzs7OztOOzs7OzFFNjE7CisxRTYxO0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggRE9UIEFCT1ZFO0xsOzA7TDswMDczIDAzMDc7Ozs7Tjs7OzFFNjA7OzFFNjAKKzFFNkE7TEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIERPVCBBQk9WRTtMdTswO0w7MDA1NCAwMzA3Ozs7O047Ozs7MUU2QjsKKzFFNkI7TEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkU7TGw7MDtMOzAwNzQgMDMwNzs7OztOOzs7MUU2QTs7MUU2QQorMUU4MDtMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggR1JBVkU7THU7MDtMOzAwNTcgMDMwMDs7OztOOzs7OzFFODE7CisxRTgxO0xBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggR1JBVkU7TGw7MDtMOzAwNzcgMDMwMDs7OztOOzs7MUU4MDs7MUU4MAorMUU4MjtMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggQUNVVEU7THU7MDtMOzAwNTcgMDMwMTs7OztOOzs7OzFFODM7CisxRTgzO0xBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggQUNVVEU7TGw7MDtMOzAwNzcgMDMwMTs7OztOOzs7MUU4Mjs7MUU4MgorMUU4NDtMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggRElBRVJFU0lTO0x1OzA7TDswMDU3IDAzMDg7Ozs7Tjs7OzsxRTg1OworMUU4NTtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIERJQUVSRVNJUztMbDswO0w7MDA3NyAwMzA4Ozs7O047OzsxRTg0OzsxRTg0CisxRUYyO0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBHUkFWRTtMdTswO0w7MDA1OSAwMzAwOzs7O047Ozs7MUVGMzsKKzFFRjM7TEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBHUkFWRTtMbDswO0w7MDA3OSAwMzAwOzs7O047OzsxRUYyOzsxRUYyCisyMDBDO1pFUk8gV0lEVEggTk9OLUpPSU5FUjtDZjswO0JOOzs7OztOOzs7OzsKKzIwMEQ7WkVSTyBXSURUSCBKT0lORVI7Q2Y7MDtCTjs7Ozs7Tjs7Ozs7CisyMDBFO0xFRlQtVE8tUklHSFQgTUFSSztDZjswO0w7Ozs7O047Ozs7OworMjAwRjtSSUdIVC1UTy1MRUZUIE1BUks7Q2Y7MDtSOzs7OztOOzs7OzsKKzIwMTM7RU4gREFTSDtQZDswO09OOzs7OztOOzs7OzsKKzIwMTQ7RU0gREFTSDtQZDswO09OOzs7OztOOzs7OzsKKzIwMTU7SE9SSVpPTlRBTCBCQVI7UGQ7MDtPTjs7Ozs7TjtRVU9UQVRJT04gREFTSDs7OzsKKzIwMTc7RE9VQkxFIExPVyBMSU5FO1BvOzA7T047PGNvbXBhdD4gMDAyMCAwMzMzOzs7O047U1BBQ0lORyBET1VCTEUgVU5ERVJTQ09SRTs7OzsKKzIwMTg7TEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUks7UGk7MDtPTjs7Ozs7TjtTSU5HTEUgVFVSTkVEIENPTU1BIFFVT1RBVElPTiBNQVJLOzs7OworMjAxOTtSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUks7UGY7MDtPTjs7Ozs7TjtTSU5HTEUgQ09NTUEgUVVPVEFUSU9OIE1BUks7Ozs7CisyMDFBO1NJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSztQczswO09OOzs7OztOO0xPVyBTSU5HTEUgQ09NTUEgUVVPVEFUSU9OIE1BUks7Ozs7CisyMDFDO0xFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLO1BpOzA7T047Ozs7O047RE9VQkxFIFRVUk5FRCBDT01NQSBRVU9UQVRJT04gTUFSSzs7OzsKKzIwMUQ7UklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLO1BmOzA7T047Ozs7O047RE9VQkxFIENPTU1BIFFVT1RBVElPTiBNQVJLOzs7OworMjAxRTtET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUks7UHM7MDtPTjs7Ozs7TjtMT1cgRE9VQkxFIENPTU1BIFFVT1RBVElPTiBNQVJLOzs7OworMjAyMDtEQUdHRVI7UG87MDtPTjs7Ozs7Tjs7Ozs7CisyMDIxO0RPVUJMRSBEQUdHRVI7UG87MDtPTjs7Ozs7Tjs7Ozs7CisyMDIyO0JVTExFVDtQbzswO09OOzs7OztOOzs7OzsKKzIwMjY7SE9SSVpPTlRBTCBFTExJUFNJUztQbzswO09OOzxjb21wYXQ+IDAwMkUgMDAyRSAwMDJFOzs7O047Ozs7OworMjAzMDtQRVIgTUlMTEUgU0lHTjtQbzswO0VUOzs7OztOOzs7OzsKKzIwMzk7U0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUks7UGk7MDtPTjs7Ozs7WTtMRUZUIFBPSU5USU5HIFNJTkdMRSBHVUlMTEVNRVQ7Ozs7CisyMDNBO1NJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSztQZjswO09OOzs7OztZO1JJR0hUIFBPSU5USU5HIFNJTkdMRSBHVUlMTEVNRVQ7Ozs7CisyMDdGO1NVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOO0xsOzA7TDs8c3VwZXI+IDAwNkU7Ozs7Tjs7Ozs7CisyMEE3O1BFU0VUQSBTSUdOO1NjOzA7RVQ7Ozs7O047Ozs7OworMjBBQTtORVcgU0hFUUVMIFNJR047U2M7MDtFVDs7Ozs7Tjs7Ozs7CisyMEFCO0RPTkcgU0lHTjtTYzswO0VUOzs7OztOOzs7OzsKKzIwQUM7RVVSTyBTSUdOO1NjOzA7RVQ7Ozs7O047Ozs7OworMjBBRjtEUkFDSE1BIFNJR047U2M7MDtFVDs7Ozs7Tjs7Ozs7CisyMTE2O05VTUVSTyBTSUdOO1NvOzA7T047PGNvbXBhdD4gMDA0RSAwMDZGOzs7O047TlVNRVJPOzs7OworMjEyMjtUUkFERSBNQVJLIFNJR047U287MDtPTjs8c3VwZXI+IDAwNTQgMDA0RDs7OztOO1RSQURFTUFSSzs7OzsKKzIyMTk7QlVMTEVUIE9QRVJBVE9SO1NtOzA7T047Ozs7O047Ozs7OworMjIxQTtTUVVBUkUgUk9PVDtTbTswO09OOzs7OztZOzs7OzsKKzIyMUU7SU5GSU5JVFk7U207MDtPTjs7Ozs7Tjs7Ozs7CisyMjI5O0lOVEVSU0VDVElPTjtTbTswO09OOzs7OztOOzs7OzsKKzIyNDg7QUxNT1NUIEVRVUFMIFRPO1NtOzA7T047Ozs7O1k7Ozs7OworMjI2MTtJREVOVElDQUwgVE87U207MDtPTjs7Ozs7Tjs7Ozs7CisyMjY0O0xFU1MtVEhBTiBPUiBFUVVBTCBUTztTbTswO09OOzs7OztZO0xFU1MgVEhBTiBPUiBFUVVBTCBUTzs7OzsKKzIyNjU7R1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPO1NtOzA7T047Ozs7O1k7R1JFQVRFUiBUSEFOIE9SIEVRVUFMIFRPOzs7OworMjMxMDtSRVZFUlNFRCBOT1QgU0lHTjtTbzswO09OOzs7OztOOzs7OzsKKzIzMjA7VE9QIEhBTEYgSU5URUdSQUw7U207MDtPTjs7Ozs7WTs7Ozs7CisyMzIxO0JPVFRPTSBIQUxGIElOVEVHUkFMO1NtOzA7T047Ozs7O1k7Ozs7OworMjUwMDtCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTDtTbzswO09OOzs7OztOO0ZPUk1TIExJR0hUIEhPUklaT05UQUw7Ozs7CisyNTAyO0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTDtTbzswO09OOzs7OztOO0ZPUk1TIExJR0hUIFZFUlRJQ0FMOzs7OworMjUwQztCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQ7U287MDtPTjs7Ozs7TjtGT1JNUyBMSUdIVCBET1dOIEFORCBSSUdIVDs7OzsKKzI1MTA7Qk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQ7U287MDtPTjs7Ozs7TjtGT1JNUyBMSUdIVCBET1dOIEFORCBMRUZUOzs7OworMjUxNDtCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUO1NvOzA7T047Ozs7O047Rk9STVMgTElHSFQgVVAgQU5EIFJJR0hUOzs7OworMjUxODtCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQ7U287MDtPTjs7Ozs7TjtGT1JNUyBMSUdIVCBVUCBBTkQgTEVGVDs7OzsKKzI1MUM7Qk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVDtTbzswO09OOzs7OztOO0ZPUk1TIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVDs7OzsKKzI1MjQ7Qk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUO1NvOzA7T047Ozs7O047Rk9STVMgTElHSFQgVkVSVElDQUwgQU5EIExFRlQ7Ozs7CisyNTJDO0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMO1NvOzA7T047Ozs7O047Rk9STVMgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTDs7OzsKKzI1MzQ7Qk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMO1NvOzA7T047Ozs7O047Rk9STVMgTElHSFQgVVAgQU5EIEhPUklaT05UQUw7Ozs7CisyNTNDO0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTDtTbzswO09OOzs7OztOO0ZPUk1TIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMOzs7OworMjU1MDtCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUw7U287MDtPTjs7Ozs7TjtGT1JNUyBET1VCTEUgSE9SSVpPTlRBTDs7OzsKKzI1NTE7Qk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTDtTbzswO09OOzs7OztOO0ZPUk1TIERPVUJMRSBWRVJUSUNBTDs7OzsKKzI1NTI7Qk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEU7U287MDtPTjs7Ozs7TjtGT1JNUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFOzs7OworMjU1MztCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRTtTbzswO09OOzs7OztOO0ZPUk1TIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEU7Ozs7CisyNTU0O0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQ7U287MDtPTjs7Ozs7TjtGT1JNUyBET1VCTEUgRE9XTiBBTkQgUklHSFQ7Ozs7CisyNTU1O0JPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEU7U287MDtPTjs7Ozs7TjtGT1JNUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEU7Ozs7CisyNTU2O0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEU7U287MDtPTjs7Ozs7TjtGT1JNUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEU7Ozs7CisyNTU3O0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVDtTbzswO09OOzs7OztOO0ZPUk1TIERPVUJMRSBET1dOIEFORCBMRUZUOzs7OworMjU1ODtCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEU7U287MDtPTjs7Ozs7TjtGT1JNUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRTs7OzsKKzI1NTk7Qk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFO1NvOzA7T047Ozs7O047Rk9STVMgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEU7Ozs7CisyNTVBO0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUO1NvOzA7T047Ozs7O047Rk9STVMgRE9VQkxFIFVQIEFORCBSSUdIVDs7OzsKKzI1NUI7Qk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEU7U287MDtPTjs7Ozs7TjtGT1JNUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFOzs7OworMjU1QztCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRTtTbzswO09OOzs7OztOO0ZPUk1TIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEU7Ozs7CisyNTVEO0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQ7U287MDtPTjs7Ozs7TjtGT1JNUyBET1VCTEUgVVAgQU5EIExFRlQ7Ozs7CisyNTVFO0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRTtTbzswO09OOzs7OztOO0ZPUk1TIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFOzs7OworMjU1RjtCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEU7U287MDtPTjs7Ozs7TjtGT1JNUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRTs7OzsKKzI1NjA7Qk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQ7U287MDtPTjs7Ozs7TjtGT1JNUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUOzs7OworMjU2MTtCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRTtTbzswO09OOzs7OztOO0ZPUk1TIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEU7Ozs7CisyNTYyO0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFO1NvOzA7T047Ozs7O047Rk9STVMgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRTs7OzsKKzI1NjM7Qk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVDtTbzswO09OOzs7OztOO0ZPUk1TIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVDs7OzsKKzI1NjQ7Qk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRTtTbzswO09OOzs7OztOO0ZPUk1TIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRTs7OzsKKzI1NjU7Qk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRTtTbzswO09OOzs7OztOO0ZPUk1TIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRTs7OzsKKzI1NjY7Qk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMO1NvOzA7T047Ozs7O047Rk9STVMgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUw7Ozs7CisyNTY3O0JPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFO1NvOzA7T047Ozs7O047Rk9STVMgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRTs7OzsKKzI1Njg7Qk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEU7U287MDtPTjs7Ozs7TjtGT1JNUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFOzs7OworMjU2OTtCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMO1NvOzA7T047Ozs7O047Rk9STVMgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMOzs7OworMjU2QTtCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRTtTbzswO09OOzs7OztOO0ZPUk1TIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEU7Ozs7CisyNTZCO0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFO1NvOzA7T047Ozs7O047Rk9STVMgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRTs7OzsKKzI1NkM7Qk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTDtTbzswO09OOzs7OztOO0ZPUk1TIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTDs7OzsKKzI1ODA7VVBQRVIgSEFMRiBCTE9DSztTbzswO09OOzs7OztOOzs7OzsKKzI1ODQ7TE9XRVIgSEFMRiBCTE9DSztTbzswO09OOzs7OztOOzs7OzsKKzI1ODg7RlVMTCBCTE9DSztTbzswO09OOzs7OztOOzs7OzsKKzI1OEM7TEVGVCBIQUxGIEJMT0NLO1NvOzA7T047Ozs7O047Ozs7OworMjU5MDtSSUdIVCBIQUxGIEJMT0NLO1NvOzA7T047Ozs7O047Ozs7OworMjU5MTtMSUdIVCBTSEFERTtTbzswO09OOzs7OztOOzs7OzsKKzI1OTI7TUVESVVNIFNIQURFO1NvOzA7T047Ozs7O047Ozs7OworMjU5MztEQVJLIFNIQURFO1NvOzA7T047Ozs7O047Ozs7OworMjVBMDtCTEFDSyBTUVVBUkU7U287MDtPTjs7Ozs7Tjs7Ozs7CitGRTdEO0FSQUJJQyBTSEFEREEgTUVESUFMIEZPUk07TG87MDtBTDs8bWVkaWFsPiAwNjQwIDA2NTE7Ozs7TjtBUkFCSUMgU0hBRERBSCBPTiBUQVRXRUVMOzs7OworRkU4MDtBUkFCSUMgTEVUVEVSIEhBTVpBIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2MjE7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgSEFNWkFIOzs7OworRkU4MTtBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjIyOzs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIE1BRERBSCBPTiBBTEVGOzs7OworRkU4MjtBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBGSU5BTCBGT1JNO0xvOzA7QUw7PGZpbmFsPiAwNjIyOzs7O047R0xZUEggRk9SIEZJTkFMIEFSQUJJQyBNQUREQUggT04gQUxFRjs7OzsKK0ZFODM7QVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDYyMzs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBIQU1aQUggT04gQUxFRjs7OzsKK0ZFODQ7QVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgRklOQUwgRk9STTtMbzswO0FMOzxmaW5hbD4gMDYyMzs7OztOO0dMWVBIIEZPUiBGSU5BTCBBUkFCSUMgSEFNWkFIIE9OIEFMRUY7Ozs7CitGRTg1O0FSQUJJQyBMRVRURVIgV0FXIFdJVEggSEFNWkEgQUJPVkUgSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDYyNDs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBIQU1aQUggT04gV0FXOzs7OworRkU4QjtBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFIElOSVRJQUwgRk9STTtMbzswO0FMOzxpbml0aWFsPiAwNjI2Ozs7O047R0xZUEggRk9SIElOSVRJQUwgQVJBQklDIEhBTVpBSCBPTiBZQTs7OzsKK0ZFOEQ7QVJBQklDIExFVFRFUiBBTEVGIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2Mjc7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgQUxFRjs7OzsKK0ZFOEU7QVJBQklDIExFVFRFUiBBTEVGIEZJTkFMIEZPUk07TG87MDtBTDs8ZmluYWw+IDA2Mjc7Ozs7TjtHTFlQSCBGT1IgRklOQUwgQVJBQklDIEFMRUY7Ozs7CitGRThGO0FSQUJJQyBMRVRURVIgQkVIIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2Mjg7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgQkFBOzs7OworRkU5MTtBUkFCSUMgTEVUVEVSIEJFSCBJTklUSUFMIEZPUk07TG87MDtBTDs8aW5pdGlhbD4gMDYyODs7OztOO0dMWVBIIEZPUiBJTklUSUFMIEFSQUJJQyBCQUE7Ozs7CitGRTkzO0FSQUJJQyBMRVRURVIgVEVIIE1BUkJVVEEgSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDYyOTs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBUQUEgTUFSQlVUQUg7Ozs7CitGRTk1O0FSQUJJQyBMRVRURVIgVEVIIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2MkE7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgVEFBOzs7OworRkU5NztBUkFCSUMgTEVUVEVSIFRFSCBJTklUSUFMIEZPUk07TG87MDtBTDs8aW5pdGlhbD4gMDYyQTs7OztOO0dMWVBIIEZPUiBJTklUSUFMIEFSQUJJQyBUQUE7Ozs7CitGRTk5O0FSQUJJQyBMRVRURVIgVEhFSCBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjJCOzs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIFRIQUE7Ozs7CitGRTlCO0FSQUJJQyBMRVRURVIgVEhFSCBJTklUSUFMIEZPUk07TG87MDtBTDs8aW5pdGlhbD4gMDYyQjs7OztOO0dMWVBIIEZPUiBJTklUSUFMIEFSQUJJQyBUSEFBOzs7OworRkU5RDtBUkFCSUMgTEVUVEVSIEpFRU0gSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDYyQzs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBKRUVNOzs7OworRkU5RjtBUkFCSUMgTEVUVEVSIEpFRU0gSU5JVElBTCBGT1JNO0xvOzA7QUw7PGluaXRpYWw+IDA2MkM7Ozs7TjtHTFlQSCBGT1IgSU5JVElBTCBBUkFCSUMgSkVFTTs7OzsKK0ZFQTE7QVJBQklDIExFVFRFUiBIQUggSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDYyRDs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBIQUE7Ozs7CitGRUEzO0FSQUJJQyBMRVRURVIgSEFIIElOSVRJQUwgRk9STTtMbzswO0FMOzxpbml0aWFsPiAwNjJEOzs7O047R0xZUEggRk9SIElOSVRJQUwgQVJBQklDIEhBQTs7OzsKK0ZFQTU7QVJBQklDIExFVFRFUiBLSEFIIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2MkU7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgS0hBQTs7OzsKK0ZFQTc7QVJBQklDIExFVFRFUiBLSEFIIElOSVRJQUwgRk9STTtMbzswO0FMOzxpbml0aWFsPiAwNjJFOzs7O047R0xZUEggRk9SIElOSVRJQUwgQVJBQklDIEtIQUE7Ozs7CitGRUE5O0FSQUJJQyBMRVRURVIgREFMIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2MkY7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgREFMOzs7OworRkVBQjtBUkFCSUMgTEVUVEVSIFRIQUwgSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDYzMDs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBUSEFMOzs7OworRkVBRDtBUkFCSUMgTEVUVEVSIFJFSCBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjMxOzs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIFJBOzs7OworRkVBRjtBUkFCSUMgTEVUVEVSIFpBSU4gSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDYzMjs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBaQUlOOzs7OworRkVCMTtBUkFCSUMgTEVUVEVSIFNFRU4gSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDYzMzs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBTRUVOOzs7OworRkVCMztBUkFCSUMgTEVUVEVSIFNFRU4gSU5JVElBTCBGT1JNO0xvOzA7QUw7PGluaXRpYWw+IDA2MzM7Ozs7TjtHTFlQSCBGT1IgSU5JVElBTCBBUkFCSUMgU0VFTjs7OzsKK0ZFQjU7QVJBQklDIExFVFRFUiBTSEVFTiBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjM0Ozs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIFNIRUVOOzs7OworRkVCNztBUkFCSUMgTEVUVEVSIFNIRUVOIElOSVRJQUwgRk9STTtMbzswO0FMOzxpbml0aWFsPiAwNjM0Ozs7O047R0xZUEggRk9SIElOSVRJQUwgQVJBQklDIFNIRUVOOzs7OworRkVCOTtBUkFCSUMgTEVUVEVSIFNBRCBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjM1Ozs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIFNBRDs7OzsKK0ZFQkI7QVJBQklDIExFVFRFUiBTQUQgSU5JVElBTCBGT1JNO0xvOzA7QUw7PGluaXRpYWw+IDA2MzU7Ozs7TjtHTFlQSCBGT1IgSU5JVElBTCBBUkFCSUMgU0FEOzs7OworRkVCRDtBUkFCSUMgTEVUVEVSIERBRCBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjM2Ozs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIERBRDs7OzsKK0ZFQkY7QVJBQklDIExFVFRFUiBEQUQgSU5JVElBTCBGT1JNO0xvOzA7QUw7PGluaXRpYWw+IDA2MzY7Ozs7TjtHTFlQSCBGT1IgSU5JVElBTCBBUkFCSUMgREFEOzs7OworRkVDMTtBUkFCSUMgTEVUVEVSIFRBSCBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjM3Ozs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIFRBSDs7OzsKK0ZFQzU7QVJBQklDIExFVFRFUiBaQUggSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDYzODs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBESEFIOzs7OworRkVDOTtBUkFCSUMgTEVUVEVSIEFJTiBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjM5Ozs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIEFJTjs7OzsKK0ZFQ0E7QVJBQklDIExFVFRFUiBBSU4gRklOQUwgRk9STTtMbzswO0FMOzxmaW5hbD4gMDYzOTs7OztOO0dMWVBIIEZPUiBGSU5BTCBBUkFCSUMgQUlOOzs7OworRkVDQjtBUkFCSUMgTEVUVEVSIEFJTiBJTklUSUFMIEZPUk07TG87MDtBTDs8aW5pdGlhbD4gMDYzOTs7OztOO0dMWVBIIEZPUiBJTklUSUFMIEFSQUJJQyBBSU47Ozs7CitGRUNDO0FSQUJJQyBMRVRURVIgQUlOIE1FRElBTCBGT1JNO0xvOzA7QUw7PG1lZGlhbD4gMDYzOTs7OztOO0dMWVBIIEZPUiBNRURJQUwgQVJBQklDIEFJTjs7OzsKK0ZFQ0Q7QVJBQklDIExFVFRFUiBHSEFJTiBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjNBOzs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIEdIQUlOOzs7OworRkVDRTtBUkFCSUMgTEVUVEVSIEdIQUlOIEZJTkFMIEZPUk07TG87MDtBTDs8ZmluYWw+IDA2M0E7Ozs7TjtHTFlQSCBGT1IgRklOQUwgQVJBQklDIEdIQUlOOzs7OworRkVDRjtBUkFCSUMgTEVUVEVSIEdIQUlOIElOSVRJQUwgRk9STTtMbzswO0FMOzxpbml0aWFsPiAwNjNBOzs7O047R0xZUEggRk9SIElOSVRJQUwgQVJBQklDIEdIQUlOOzs7OworRkVEMDtBUkFCSUMgTEVUVEVSIEdIQUlOIE1FRElBTCBGT1JNO0xvOzA7QUw7PG1lZGlhbD4gMDYzQTs7OztOO0dMWVBIIEZPUiBNRURJQUwgQVJBQklDIEdIQUlOOzs7OworRkVEMTtBUkFCSUMgTEVUVEVSIEZFSCBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjQxOzs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIEZBOzs7OworRkVEMztBUkFCSUMgTEVUVEVSIEZFSCBJTklUSUFMIEZPUk07TG87MDtBTDs8aW5pdGlhbD4gMDY0MTs7OztOO0dMWVBIIEZPUiBJTklUSUFMIEFSQUJJQyBGQTs7OzsKK0ZFRDU7QVJBQklDIExFVFRFUiBRQUYgSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDY0Mjs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBRQUY7Ozs7CitGRUQ3O0FSQUJJQyBMRVRURVIgUUFGIElOSVRJQUwgRk9STTtMbzswO0FMOzxpbml0aWFsPiAwNjQyOzs7O047R0xZUEggRk9SIElOSVRJQUwgQVJBQklDIFFBRjs7OzsKK0ZFRDk7QVJBQklDIExFVFRFUiBLQUYgSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDY0Mzs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBDQUY7Ozs7CitGRURCO0FSQUJJQyBMRVRURVIgS0FGIElOSVRJQUwgRk9STTtMbzswO0FMOzxpbml0aWFsPiAwNjQzOzs7O047R0xZUEggRk9SIElOSVRJQUwgQVJBQklDIENBRjs7OzsKK0ZFREQ7QVJBQklDIExFVFRFUiBMQU0gSVNPTEFURUQgRk9STTtMbzswO0FMOzxpc29sYXRlZD4gMDY0NDs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBMQU07Ozs7CitGRURGO0FSQUJJQyBMRVRURVIgTEFNIElOSVRJQUwgRk9STTtMbzswO0FMOzxpbml0aWFsPiAwNjQ0Ozs7O047R0xZUEggRk9SIElOSVRJQUwgQVJBQklDIExBTTs7OzsKK0ZFRTE7QVJBQklDIExFVFRFUiBNRUVNIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2NDU7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgTUVFTTs7OzsKK0ZFRTM7QVJBQklDIExFVFRFUiBNRUVNIElOSVRJQUwgRk9STTtMbzswO0FMOzxpbml0aWFsPiAwNjQ1Ozs7O047R0xZUEggRk9SIElOSVRJQUwgQVJBQklDIE1FRU07Ozs7CitGRUU1O0FSQUJJQyBMRVRURVIgTk9PTiBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjQ2Ozs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIE5PT047Ozs7CitGRUU3O0FSQUJJQyBMRVRURVIgTk9PTiBJTklUSUFMIEZPUk07TG87MDtBTDs8aW5pdGlhbD4gMDY0Njs7OztOO0dMWVBIIEZPUiBJTklUSUFMIEFSQUJJQyBOT09OOzs7OworRkVFOTtBUkFCSUMgTEVUVEVSIEhFSCBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjQ3Ozs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIEhBOzs7OworRkVFQjtBUkFCSUMgTEVUVEVSIEhFSCBJTklUSUFMIEZPUk07TG87MDtBTDs8aW5pdGlhbD4gMDY0Nzs7OztOO0dMWVBIIEZPUiBJTklUSUFMIEFSQUJJQyBIQTs7OzsKK0ZFRUM7QVJBQklDIExFVFRFUiBIRUggTUVESUFMIEZPUk07TG87MDtBTDs8bWVkaWFsPiAwNjQ3Ozs7O047R0xZUEggRk9SIE1FRElBTCBBUkFCSUMgSEE7Ozs7CitGRUVEO0FSQUJJQyBMRVRURVIgV0FXIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2NDg7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgV0FXOzs7OworRkVFRjtBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQSBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjQ5Ozs7O047R0xZUEggRk9SIElTT0xBVEUgQVJBQklDIEFMRUYgTUFRU1VSQUg7Ozs7CitGRUYwO0FSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBIEZJTkFMIEZPUk07TG87MDtBTDs8ZmluYWw+IDA2NDk7Ozs7TjtHTFlQSCBGT1IgRklOQUwgQVJBQklDIEFMRUYgTUFRU1VSQUg7Ozs7CitGRUYxO0FSQUJJQyBMRVRURVIgWUVIIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2NEE7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgWUE7Ozs7CitGRUYyO0FSQUJJQyBMRVRURVIgWUVIIEZJTkFMIEZPUk07TG87MDtBTDs8ZmluYWw+IDA2NEE7Ozs7TjtHTFlQSCBGT1IgRklOQUwgQVJBQklDIFlBOzs7OworRkVGMztBUkFCSUMgTEVUVEVSIFlFSCBJTklUSUFMIEZPUk07TG87MDtBTDs8aW5pdGlhbD4gMDY0QTs7OztOO0dMWVBIIEZPUiBJTklUSUFMIEFSQUJJQyBZQTs7OzsKK0ZFRjU7QVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBJU09MQVRFRCBGT1JNO0xvOzA7QUw7PGlzb2xhdGVkPiAwNjQ0IDA2MjI7Ozs7TjtHTFlQSCBGT1IgSVNPTEFURSBBUkFCSUMgTUFEREFIIE9OIExJR0FUVVJFIExBTSBBTEVGOzs7OworRkVGNjtBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIE1BRERBIEFCT1ZFIEZJTkFMIEZPUk07TG87MDtBTDs8ZmluYWw+IDA2NDQgMDYyMjs7OztOO0dMWVBIIEZPUiBGSU5BTCBBUkFCSUMgTUFEREFIIE9OIExJR0FUVVJFIExBTSBBTEVGOzs7OworRkVGNztBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2NDQgMDYyMzs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBIQU1aQUggT04gTElHQVRVUkUgTEFNIEFMRUY7Ozs7CitGRUY4O0FSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIFdJVEggSEFNWkEgQUJPVkUgRklOQUwgRk9STTtMbzswO0FMOzxmaW5hbD4gMDY0NCAwNjIzOzs7O047R0xZUEggRk9SIEZJTkFMIEFSQUJJQyBIQU1aQUggT04gTElHQVRVUkUgTEFNIEFMRUY7Ozs7CitGRUZCO0FSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIElTT0xBVEVEIEZPUk07TG87MDtBTDs8aXNvbGF0ZWQ+IDA2NDQgMDYyNzs7OztOO0dMWVBIIEZPUiBJU09MQVRFIEFSQUJJQyBMSUdBVFVSRSBMQU0gQUxFRjs7OzsKK0ZFRkM7QVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgRklOQUwgRk9STTtMbzswO0FMOzxmaW5hbD4gMDY0NCAwNjI3Ozs7O047R0xZUEggRk9SIEZJTkFMIEFSQUJJQyBMSUdBVFVSRSBMQU0gQUxFRjs7OzsKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2NwMTI1MC50eHQgYi9jb2RlcGFnZS9jcDEyNTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZmFiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDEyNTAudHh0CkBAIC0wLDAgKzEsMjc0IEBACisjCisjICAgIE5hbWU6ICAgICBjcDEyNTAgdG8gVW5pY29kZSB0YWJsZQorIyAgICBVbmljb2RlIHZlcnNpb246IDIuMAorIyAgICBUYWJsZSB2ZXJzaW9uOiAyLjAxCisjICAgIFRhYmxlIGZvcm1hdDogIEZvcm1hdCBBCisjICAgIERhdGU6ICAgICAgICAgIDA0LzE1Lzk4CisjCisjICAgIENvbnRhY3Q6ICAgICAgIFNoYXduLlN0ZWVsZUBtaWNyb3NvZnQuY29tCisjCisjICAgIEdlbmVyYWwgbm90ZXM6IG5vbmUKKyMKKyMgICAgRm9ybWF0OiBUaHJlZSB0YWItc2VwYXJhdGVkIGNvbHVtbnMKKyMgICAgICAgIENvbHVtbiAjMSBpcyB0aGUgY3AxMjUwIGNvZGUgKGluIGhleCkKKyMgICAgICAgIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMgICAgICAgIENvbHVtbiAjMyBpcyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjICAgIFRoZSBlbnRyaWVzIGFyZSBpbiBjcDEyNTAgb3JkZXIKKyMKKzB4MDAJMHgwMDAwCSNOVUxMCisweDAxCTB4MDAwMQkjU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJI1NUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSNFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJI0VORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSNFTlFVSVJZCisweDA2CTB4MDAwNgkjQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSNCRUxMCisweDA4CTB4MDAwOAkjQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBBCTB4MDAwQQkjTElORSBGRUVECisweDBCCTB4MDAwQgkjVkVSVElDQUwgVEFCVUxBVElPTgorMHgwQwkweDAwMEMJI0ZPUk0gRkVFRAorMHgwRAkweDAwMEQJI0NBUlJJQUdFIFJFVFVSTgorMHgwRQkweDAwMEUJI1NISUZUIE9VVAorMHgwRgkweDAwMEYJI1NISUZUIElOCisweDEwCTB4MDAxMAkjREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJI0RFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJI0RFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJI0RFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJI05FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJI0VORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSNDQU5DRUwKKzB4MTkJMHgwMDE5CSNFTkQgT0YgTUVESVVNCisweDFBCTB4MDAxQQkjU1VCU1RJVFVURQorMHgxQgkweDAwMUIJI0VTQ0FQRQorMHgxQwkweDAwMUMJI0ZJTEUgU0VQQVJBVE9SCisweDFECTB4MDAxRAkjR1JPVVAgU0VQQVJBVE9SCisweDFFCTB4MDAxRQkjUkVDT1JEIFNFUEFSQVRPUgorMHgxRgkweDAwMUYJI1VOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjU1BBQ0UKKzB4MjEJMHgwMDIxCSNFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSNOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJI0RPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjQVBPU1RST1BIRQorMHgyOAkweDAwMjgJI0xFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSNSSUdIVCBQQVJFTlRIRVNJUworMHgyQQkweDAwMkEJI0FTVEVSSVNLCisweDJCCTB4MDAyQgkjUExVUyBTSUdOCisweDJDCTB4MDAyQwkjQ09NTUEKKzB4MkQJMHgwMDJECSNIWVBIRU4tTUlOVVMKKzB4MkUJMHgwMDJFCSNGVUxMIFNUT1AKKzB4MkYJMHgwMDJGCSNTT0xJRFVTCisweDMwCTB4MDAzMAkjRElHSVQgWkVSTworMHgzMQkweDAwMzEJI0RJR0lUIE9ORQorMHgzMgkweDAwMzIJI0RJR0lUIFRXTworMHgzMwkweDAwMzMJI0RJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjRElHSVQgRk9VUgorMHgzNQkweDAwMzUJI0RJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSNESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSNESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJI0RJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjRElHSVQgTklORQorMHgzQQkweDAwM0EJI0NPTE9OCisweDNCCTB4MDAzQgkjU0VNSUNPTE9OCisweDNDCTB4MDAzQwkjTEVTUy1USEFOIFNJR04KKzB4M0QJMHgwMDNECSNFUVVBTFMgU0lHTgorMHgzRQkweDAwM0UJI0dSRUFURVItVEhBTiBTSUdOCisweDNGCTB4MDAzRgkjUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJI0NPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJI0xBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJI0xBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NEEJMHgwMDRBCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRCCTB4MDA0QgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0QwkweDAwNEMJI0xBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NEQJMHgwMDRECSNMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRFCTB4MDA0RQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0RgkweDAwNEYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJI0xBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJI0xBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJI0xBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVBCTB4MDA1QQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1QgkweDAwNUIJI0xFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NUMJMHgwMDVDCSNSRVZFUlNFIFNPTElEVVMKKzB4NUQJMHgwMDVECSNSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1RQkweDAwNUUJI0NJUkNVTUZMRVggQUNDRU5UCisweDVGCTB4MDA1RgkjTE9XIExJTkUKKzB4NjAJMHgwMDYwCSNHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSNMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJI0xBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSNMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJI0xBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSNMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJI0xBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NkEJMHgwMDZBCSNMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2QgkweDAwNkIJI0xBVElOIFNNQUxMIExFVFRFUiBLCisweDZDCTB4MDA2QwkjTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NkQJMHgwMDZECSNMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2RQkweDAwNkUJI0xBVElOIFNNQUxMIExFVFRFUiBOCisweDZGCTB4MDA2RgkjTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSNMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJI0xBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSNMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJI0xBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSNMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJI0xBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSNMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3QQkweDAwN0EJI0xBVElOIFNNQUxMIExFVFRFUiBaCisweDdCCTB4MDA3QgkjTEVGVCBDVVJMWSBCUkFDS0VUCisweDdDCTB4MDA3QwkjVkVSVElDQUwgTElORQorMHg3RAkweDAwN0QJI1JJR0hUIENVUkxZIEJSQUNLRVQKKzB4N0UJMHgwMDdFCSNUSUxERQorMHg3RgkweDAwN0YJI0RFTEVURQorMHg4MAkweDIwQUMJI0VVUk8gU0lHTgorMHg4MQkgICAgICAJI1VOREVGSU5FRAorMHg4MgkweDIwMUEJI1NJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworMHg4MwkgICAgICAJI1VOREVGSU5FRAorMHg4NAkweDIwMUUJI0RPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworMHg4NQkweDIwMjYJI0hPUklaT05UQUwgRUxMSVBTSVMKKzB4ODYJMHgyMDIwCSNEQUdHRVIKKzB4ODcJMHgyMDIxCSNET1VCTEUgREFHR0VSCisweDg4CSAgICAgIAkjVU5ERUZJTkVECisweDg5CTB4MjAzMAkjUEVSIE1JTExFIFNJR04KKzB4OEEJMHgwMTYwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4OEIJMHgyMDM5CSNTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworMHg4QwkweDAxNUEJI0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorMHg4RAkweDAxNjQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTgorMHg4RQkweDAxN0QJI0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorMHg4RgkweDAxNzkJI0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorMHg5MAkgICAgICAJI1VOREVGSU5FRAorMHg5MQkweDIwMTgJI0xFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisweDkyCTB4MjAxOQkjUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisweDkzCTB4MjAxQwkjTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKzB4OTQJMHgyMDFECSNSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKzB4OTUJMHgyMDIyCSNCVUxMRVQKKzB4OTYJMHgyMDEzCSNFTiBEQVNICisweDk3CTB4MjAxNAkjRU0gREFTSAorMHg5OAkgICAgICAJI1VOREVGSU5FRAorMHg5OQkweDIxMjIJI1RSQURFIE1BUksgU0lHTgorMHg5QQkweDAxNjEJI0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4OUIJMHgyMDNBCSNTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OUMJMHgwMTVCCSNMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisweDlECTB4MDE2NQkjTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTgorMHg5RQkweDAxN0UJI0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4OUYJMHgwMTdBCSNMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisweEEwCTB4MDBBMAkjTk8tQlJFQUsgU1BBQ0UKKzB4QTEJMHgwMkM3CSNDQVJPTgorMHhBMgkweDAyRDgJI0JSRVZFCisweEEzCTB4MDE0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorMHhBNAkweDAwQTQJI0NVUlJFTkNZIFNJR04KKzB4QTUJMHgwMTA0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisweEE2CTB4MDBBNgkjQlJPS0VOIEJBUgorMHhBNwkweDAwQTcJI1NFQ1RJT04gU0lHTgorMHhBOAkweDAwQTgJI0RJQUVSRVNJUworMHhBOQkweDAwQTkJI0NPUFlSSUdIVCBTSUdOCisweEFBCTB4MDE1RQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKzB4QUIJMHgwMEFCCSNMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhBQwkweDAwQUMJI05PVCBTSUdOCisweEFECTB4MDBBRAkjU09GVCBIWVBIRU4KKzB4QUUJMHgwMEFFCSNSRUdJU1RFUkVEIFNJR04KKzB4QUYJMHgwMTdCCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisweEIwCTB4MDBCMAkjREVHUkVFIFNJR04KKzB4QjEJMHgwMEIxCSNQTFVTLU1JTlVTIFNJR04KKzB4QjIJMHgwMkRCCSNPR09ORUsKKzB4QjMJMHgwMTQyCSNMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorMHhCNAkweDAwQjQJI0FDVVRFIEFDQ0VOVAorMHhCNQkweDAwQjUJI01JQ1JPIFNJR04KKzB4QjYJMHgwMEI2CSNQSUxDUk9XIFNJR04KKzB4QjcJMHgwMEI3CSNNSURETEUgRE9UCisweEI4CTB4MDBCOAkjQ0VESUxMQQorMHhCOQkweDAxMDUJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLCisweEJBCTB4MDE1RgkjTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisweEJCCTB4MDBCQgkjUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweEJDCTB4MDEzRAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENBUk9OCisweEJECTB4MDJERAkjRE9VQkxFIEFDVVRFIEFDQ0VOVAorMHhCRQkweDAxM0UJI0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04KKzB4QkYJMHgwMTdDCSNMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorMHhDMAkweDAxNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBBQ1VURQorMHhDMQkweDAwQzEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhDMgkweDAwQzIJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweEMzCTB4MDEwMgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFCisweEM0CTB4MDBDNAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhDNQkweDAxMzkJI0xBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBBQ1VURQorMHhDNgkweDAxMDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorMHhDNwkweDAwQzcJI0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweEM4CTB4MDEwQwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisweEM5CTB4MDBDOQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweENBCTB4MDExOAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhDQgkweDAwQ0IJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4Q0MJMHgwMTFBCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST04KKzB4Q0QJMHgwMENECSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4Q0UJMHgwMENFCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorMHhDRgkweDAxMEUJI0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTgorMHhEMAkweDAxMTAJI0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKzB4RDEJMHgwMTQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEUKKzB4RDIJMHgwMTQ3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST04KKzB4RDMJMHgwMEQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RDQJMHgwMEQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorMHhENQkweDAxNTAJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKzB4RDYJMHgwMEQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEQ3CTB4MDBENwkjTVVMVElQTElDQVRJT04gU0lHTgorMHhEOAkweDAxNTgJI0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTgorMHhEOQkweDAxNkUJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisweERBCTB4MDBEQQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweERCCTB4MDE3MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorMHhEQwkweDAwREMJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMERECSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKzB4REUJMHgwMTYyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorMHhERgkweDAwREYJI0xBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweEUwCTB4MDE1NQkjTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBBQ1VURQorMHhFMQkweDAwRTEJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4RTIJMHgwMEUyCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwMTAzCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFCisweEU0CTB4MDBFNAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4RTUJMHgwMTNBCSNMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEFDVVRFCisweEU2CTB4MDEwNwkjTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorMHhFNwkweDAwRTcJI0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHhFOAkweDAxMEQJI0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKzB4RTkJMHgwMEU5CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweEVBCTB4MDExOQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKzB4RUIJMHgwMEVCCSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworMHhFQwkweDAxMUIJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0FST04KKzB4RUQJMHgwMEVECSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweEVFCTB4MDBFRQkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisweEVGCTB4MDEwRgkjTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBDQVJPTgorMHhGMAkweDAxMTEJI0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggU1RST0tFCisweEYxCTB4MDE0NAkjTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorMHhGMgkweDAxNDgJI0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0FST04KKzB4RjMJMHgwMEYzCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweEY0CTB4MDBGNAkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweEY1CTB4MDE1MQkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKzB4RjYJMHgwMEY2CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHhGNwkweDAwRjcJI0RJVklTSU9OIFNJR04KKzB4RjgJMHgwMTU5CSNMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OCisweEY5CTB4MDE2RgkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisweEZBCTB4MDBGQQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAxNzEJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisweEZDCTB4MDBGQwkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4RkQJMHgwMEZECSNMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisweEZFCTB4MDE2MwkjTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDRURJTExBCisweEZGCTB4MDJEOQkjRE9UIEFCT1ZFCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDEyNTEudHh0IGIvY29kZXBhZ2UvY3AxMjUxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDliMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3AxMjUxLnR4dApAQCAtMCwwICsxLDI3NCBAQAorIworIyAgICBOYW1lOiAgICAgY3AxMjUxIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMQorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8xNS85OAorIworIyAgICBDb250YWN0OiAgICAgICBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIworIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwMTI1MSBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3AxMjUxIG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJI0xJTkUgRkVFRAorMHgwQgkweDAwMEIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSNGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSNDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSNTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJI1NVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSNFU0NBUEUKKzB4MUMJMHgwMDFDCSNGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJI0dST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSNBU1RFUklTSworMHgyQgkweDAwMkIJI1BMVVMgU0lHTgorMHgyQwkweDAwMkMJI0NPTU1BCisweDJECTB4MDAyRAkjSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSNDT0xPTgorMHgzQgkweDAwM0IJI1NFTUlDT0xPTgorMHgzQwkweDAwM0MJI0xFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJI1ZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjVElMREUKKzB4N0YJMHgwMDdGCSNERUxFVEUKKzB4ODAJMHgwNDAyCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBESkUKKzB4ODEJMHgwNDAzCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSkUKKzB4ODIJMHgyMDFBCSNTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODMJMHgwNDUzCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgR0pFCisweDg0CTB4MjAxRQkjRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisweDg1CTB4MjAyNgkjSE9SSVpPTlRBTCBFTExJUFNJUworMHg4NgkweDIwMjAJI0RBR0dFUgorMHg4NwkweDIwMjEJI0RPVUJMRSBEQUdHRVIKKzB4ODgJMHgyMEFDCSNFVVJPIFNJR04KKzB4ODkJMHgyMDMwCSNQRVIgTUlMTEUgU0lHTgorMHg4QQkweDA0MDkJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIExKRQorMHg4QgkweDIwMzkJI1NJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweDhDCTB4MDQwQQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTkpFCisweDhECTB4MDQwQwkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFCisweDhFCTB4MDQwQgkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNIRQorMHg4RgkweDA0MEYJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIERaSEUKKzB4OTAJMHgwNDUyCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgREpFCisweDkxCTB4MjAxOAkjTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OTIJMHgyMDE5CSNSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OTMJMHgyMDFDCSNMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworMHg5NAkweDIwMUQJI1JJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworMHg5NQkweDIwMjIJI0JVTExFVAorMHg5NgkweDIwMTMJI0VOIERBU0gKKzB4OTcJMHgyMDE0CSNFTSBEQVNICisweDk4CSAgICAgIAkjVU5ERUZJTkVECisweDk5CTB4MjEyMgkjVFJBREUgTUFSSyBTSUdOCisweDlBCTB4MDQ1OQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIExKRQorMHg5QgkweDIwM0EJI1NJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworMHg5QwkweDA0NUEJI0NZUklMTElDIFNNQUxMIExFVFRFUiBOSkUKKzB4OUQJMHgwNDVDCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgS0pFCisweDlFCTB4MDQ1QgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTSEUKKzB4OUYJMHgwNDVGCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpIRQorMHhBMAkweDAwQTAJI05PLUJSRUFLIFNQQUNFCisweEExCTB4MDQwRQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVQorMHhBMgkweDA0NUUJI0NZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVCisweEEzCTB4MDQwOAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSkUKKzB4QTQJMHgwMEE0CSNDVVJSRU5DWSBTSUdOCisweEE1CTB4MDQ5MAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFIFdJVEggVVBUVVJOCisweEE2CTB4MDBBNgkjQlJPS0VOIEJBUgorMHhBNwkweDAwQTcJI1NFQ1RJT04gU0lHTgorMHhBOAkweDA0MDEJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisweEE5CTB4MDBBOQkjQ09QWVJJR0hUIFNJR04KKzB4QUEJMHgwNDA0CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKzB4QUIJMHgwMEFCCSNMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhBQwkweDAwQUMJI05PVCBTSUdOCisweEFECTB4MDBBRAkjU09GVCBIWVBIRU4KKzB4QUUJMHgwMEFFCSNSRUdJU1RFUkVEIFNJR04KKzB4QUYJMHgwNDA3CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSQorMHhCMAkweDAwQjAJI0RFR1JFRSBTSUdOCisweEIxCTB4MDBCMQkjUExVUy1NSU5VUyBTSUdOCisweEIyCTB4MDQwNgkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisweEIzCTB4MDQ1NgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorMHhCNAkweDA0OTEJI0NZUklMTElDIFNNQUxMIExFVFRFUiBHSEUgV0lUSCBVUFRVUk4KKzB4QjUJMHgwMEI1CSNNSUNSTyBTSUdOCisweEI2CTB4MDBCNgkjUElMQ1JPVyBTSUdOCisweEI3CTB4MDBCNwkjTUlERExFIERPVAorMHhCOAkweDA0NTEJI0NZUklMTElDIFNNQUxMIExFVFRFUiBJTworMHhCOQkweDIxMTYJI05VTUVSTyBTSUdOCisweEJBCTB4MDQ1NAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorMHhCQgkweDAwQkIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDA0NTgJI0NZUklMTElDIFNNQUxMIExFVFRFUiBKRQorMHhCRAkweDA0MDUJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIERaRQorMHhCRQkweDA0NTUJI0NZUklMTElDIFNNQUxMIExFVFRFUiBEWkUKKzB4QkYJMHgwNDU3CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkKKzB4QzAJMHgwNDEwCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisweEMxCTB4MDQxMQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKzB4QzIJMHgwNDEyCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorMHhDMwkweDA0MTMJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorMHhDNAkweDA0MTQJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisweEM1CTB4MDQxNQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKzB4QzYJMHgwNDE2CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUKKzB4QzcJMHgwNDE3CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorMHhDOAkweDA0MTgJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKzB4QzkJMHgwNDE5CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBJCisweENBCTB4MDQxQQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKzB4Q0IJMHgwNDFCCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorMHhDQwkweDA0MUMJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisweENECTB4MDQxRAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKzB4Q0UJMHgwNDFFCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPCisweENGCTB4MDQxRgkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUEUKKzB4RDAJMHgwNDIwCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorMHhEMQkweDA0MjEJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisweEQyCTB4MDQyMgkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEUKKzB4RDMJMHgwNDIzCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisweEQ0CTB4MDQyNAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKzB4RDUJMHgwNDI1CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQQorMHhENgkweDA0MjYJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorMHhENwkweDA0MjcJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorMHhEOAkweDA0MjgJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQQorMHhEOQkweDA0MjkJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisweERBCTB4MDQyQQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCisweERCCTB4MDQyQgkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorMHhEQwkweDA0MkMJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorMHhERAkweDA0MkQJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKzB4REUJMHgwNDJFCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorMHhERgkweDA0MkYJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisweEUwCTB4MDQzMAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKzB4RTEJMHgwNDMxCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUKKzB4RTIJMHgwNDMyCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKzB4RTMJMHgwNDMzCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisweEU0CTB4MDQzNAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisweEU1CTB4MDQzNQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisweEU2CTB4MDQzNgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorMHhFNwkweDA0MzcJI0NZUklMTElDIFNNQUxMIExFVFRFUiBaRQorMHhFOAkweDA0MzgJI0NZUklMTElDIFNNQUxMIExFVFRFUiBJCisweEU5CTB4MDQzOQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKzB4RUEJMHgwNDNBCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EKKzB4RUIJMHgwNDNCCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKzB4RUMJMHgwNDNDCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKzB4RUQJMHgwNDNECSNDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4KKzB4RUUJMHgwNDNFCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgTworMHhFRgkweDA0M0YJI0NZUklMTElDIFNNQUxMIExFVFRFUiBQRQorMHhGMAkweDA0NDAJI0NZUklMTElDIFNNQUxMIExFVFRFUiBFUgorMHhGMQkweDA0NDEJI0NZUklMTElDIFNNQUxMIExFVFRFUiBFUworMHhGMgkweDA0NDIJI0NZUklMTElDIFNNQUxMIExFVFRFUiBURQorMHhGMwkweDA0NDMJI0NZUklMTElDIFNNQUxMIExFVFRFUiBVCisweEY0CTB4MDQ0NAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVGCisweEY1CTB4MDQ0NQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisweEY2CTB4MDQ0NgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorMHhGNwkweDA0NDcJI0NZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKzB4RjgJMHgwNDQ4CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisweEY5CTB4MDQ0OQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisweEZBCTB4MDQ0QQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBUkQgU0lHTgorMHhGQgkweDA0NEIJI0NZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisweEZDCTB4MDQ0QwkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorMHhGRAkweDA0NEQJI0NZUklMTElDIFNNQUxMIExFVFRFUiBFCisweEZFCTB4MDQ0RQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVCisweEZGCTB4MDQ0RgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDEyNTIudHh0IGIvY29kZXBhZ2UvY3AxMjUyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmY0YjIwCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3AxMjUyLnR4dApAQCAtMCwwICsxLDI3NCBAQAorIworIyAgICBOYW1lOiAgICAgY3AxMjUyIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMQorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8xNS85OAorIworIyAgICBDb250YWN0OiAgICAgICBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIworIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwMTI1MiBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3AxMjUyIG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJI0xJTkUgRkVFRAorMHgwQgkweDAwMEIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSNGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSNDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSNTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJI1NVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSNFU0NBUEUKKzB4MUMJMHgwMDFDCSNGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJI0dST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSNBU1RFUklTSworMHgyQgkweDAwMkIJI1BMVVMgU0lHTgorMHgyQwkweDAwMkMJI0NPTU1BCisweDJECTB4MDAyRAkjSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSNDT0xPTgorMHgzQgkweDAwM0IJI1NFTUlDT0xPTgorMHgzQwkweDAwM0MJI0xFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJI1ZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjVElMREUKKzB4N0YJMHgwMDdGCSNERUxFVEUKKzB4ODAJMHgyMEFDCSNFVVJPIFNJR04KKzB4ODEJICAgICAgCSNVTkRFRklORUQKKzB4ODIJMHgyMDFBCSNTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODMJMHgwMTkyCSNMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKzB4ODQJMHgyMDFFCSNET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODUJMHgyMDI2CSNIT1JJWk9OVEFMIEVMTElQU0lTCisweDg2CTB4MjAyMAkjREFHR0VSCisweDg3CTB4MjAyMQkjRE9VQkxFIERBR0dFUgorMHg4OAkweDAyQzYJI01PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorMHg4OQkweDIwMzAJI1BFUiBNSUxMRSBTSUdOCisweDhBCTB4MDE2MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisweDhCCTB4MjAzOQkjU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OEMJMHgwMTUyCSNMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisweDhECSAgICAgIAkjVU5ERUZJTkVECisweDhFCTB4MDE3RAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisweDhGCSAgICAgIAkjVU5ERUZJTkVECisweDkwCSAgICAgIAkjVU5ERUZJTkVECisweDkxCTB4MjAxOAkjTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OTIJMHgyMDE5CSNSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OTMJMHgyMDFDCSNMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworMHg5NAkweDIwMUQJI1JJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworMHg5NQkweDIwMjIJI0JVTExFVAorMHg5NgkweDIwMTMJI0VOIERBU0gKKzB4OTcJMHgyMDE0CSNFTSBEQVNICisweDk4CTB4MDJEQwkjU01BTEwgVElMREUKKzB4OTkJMHgyMTIyCSNUUkFERSBNQVJLIFNJR04KKzB4OUEJMHgwMTYxCSNMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisweDlCCTB4MjAzQQkjU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweDlDCTB4MDE1MwkjTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKzB4OUQJICAgICAgCSNVTkRFRklORUQKKzB4OUUJMHgwMTdFCSNMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisweDlGCTB4MDE3OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworMHhBMAkweDAwQTAJI05PLUJSRUFLIFNQQUNFCisweEExCTB4MDBBMQkjSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworMHhBMgkweDAwQTIJI0NFTlQgU0lHTgorMHhBMwkweDAwQTMJI1BPVU5EIFNJR04KKzB4QTQJMHgwMEE0CSNDVVJSRU5DWSBTSUdOCisweEE1CTB4MDBBNQkjWUVOIFNJR04KKzB4QTYJMHgwMEE2CSNCUk9LRU4gQkFSCisweEE3CTB4MDBBNwkjU0VDVElPTiBTSUdOCisweEE4CTB4MDBBOAkjRElBRVJFU0lTCisweEE5CTB4MDBBOQkjQ09QWVJJR0hUIFNJR04KKzB4QUEJMHgwMEFBCSNGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorMHhBQgkweDAwQUIJI0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweEFDCTB4MDBBQwkjTk9UIFNJR04KKzB4QUQJMHgwMEFECSNTT0ZUIEhZUEhFTgorMHhBRQkweDAwQUUJI1JFR0lTVEVSRUQgU0lHTgorMHhBRgkweDAwQUYJI01BQ1JPTgorMHhCMAkweDAwQjAJI0RFR1JFRSBTSUdOCisweEIxCTB4MDBCMQkjUExVUy1NSU5VUyBTSUdOCisweEIyCTB4MDBCMgkjU1VQRVJTQ1JJUFQgVFdPCisweEIzCTB4MDBCMwkjU1VQRVJTQ1JJUFQgVEhSRUUKKzB4QjQJMHgwMEI0CSNBQ1VURSBBQ0NFTlQKKzB4QjUJMHgwMEI1CSNNSUNSTyBTSUdOCisweEI2CTB4MDBCNgkjUElMQ1JPVyBTSUdOCisweEI3CTB4MDBCNwkjTUlERExFIERPVAorMHhCOAkweDAwQjgJI0NFRElMTEEKKzB4QjkJMHgwMEI5CSNTVVBFUlNDUklQVCBPTkUKKzB4QkEJMHgwMEJBCSNNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKzB4QkIJMHgwMEJCCSNSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QkMJMHgwMEJDCSNWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKzB4QkQJMHgwMEJECSNWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKzB4QkUJMHgwMEJFCSNWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKzB4QkYJMHgwMEJGCSNJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisweEMwCTB4MDBDMAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweEMxCTB4MDBDMQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisweEMyCTB4MDBDMgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4QzMJMHgwMEMzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKzB4QzQJMHgwMEM0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweEM1CTB4MDBDNQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4QzYJMHgwMEM2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBRQorMHhDNwkweDAwQzcJI0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweEM4CTB4MDBDOAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEM5CTB4MDBDOQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweENBCTB4MDBDQQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKzB4Q0IJMHgwMENCCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweENDCTB4MDBDQwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisweENECTB4MDBDRAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweENFCTB4MDBDRQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4Q0YJMHgwMENGCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisweEQwCTB4MDBEMAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisweEQxCTB4MDBEMQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisweEQyCTB4MDBEMgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisweEQzCTB4MDBEMwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweEQ0CTB4MDBENAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RDUJMHgwMEQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKzB4RDYJMHgwMEQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEQ3CTB4MDBENwkjTVVMVElQTElDQVRJT04gU0lHTgorMHhEOAkweDAwRDgJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKzB4RDkJMHgwMEQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4REEJMHgwMERBCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKzB4REIJMHgwMERCCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHhEQwkweDAwREMJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMERECSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKzB4REUJMHgwMERFCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STgorMHhERgkweDAwREYJI0xBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweEUwCTB4MDBFMAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorMHhFMQkweDAwRTEJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4RTIJMHgwMEUyCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwMEUzCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisweEU0CTB4MDBFNAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4RTUJMHgwMEU1CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4RTYJMHgwMEU2CSNMQVRJTiBTTUFMTCBMRVRURVIgQUUKKzB4RTcJMHgwMEU3CSNMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4RTgJMHgwMEU4CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEU5CTB4MDBFOQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHhFQQkweDAwRUEJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHhFQgkweDAwRUIJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweEVDCTB4MDBFQwkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorMHhFRAkweDAwRUQJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4RUUJMHgwMEVFCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4RUYJMHgwMEVGCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworMHhGMAkweDAwRjAJI0xBVElOIFNNQUxMIExFVFRFUiBFVEgKKzB4RjEJMHgwMEYxCSNMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisweEYyCTB4MDBGMgkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorMHhGMwkweDAwRjMJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RjQJMHgwMEY0CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RjUJMHgwMEY1CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisweEY2CTB4MDBGNgkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4RjcJMHgwMEY3CSNESVZJU0lPTiBTSUdOCisweEY4CTB4MDBGOAkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKzB4RjkJMHgwMEY5CSNMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisweEZBCTB4MDBGQQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAwRkIJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHhGQwkweDAwRkMJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweEZECTB4MDBGRAkjTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorMHhGRQkweDAwRkUJI0xBVElOIFNNQUxMIExFVFRFUiBUSE9STgorMHhGRgkweDAwRkYJI0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDEyNTMudHh0IGIvY29kZXBhZ2UvY3AxMjUzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGE1NWIwCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3AxMjUzLnR4dApAQCAtMCwwICsxLDI3NCBAQAorIworIyAgICBOYW1lOiAgICAgY3AxMjUzIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMQorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8xNS85OAorIworIyAgICBDb250YWN0OiAgICAgICBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIworIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwMTI1MyBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3AxMjUzIG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJI0xJTkUgRkVFRAorMHgwQgkweDAwMEIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSNGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSNDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSNTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJI1NVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSNFU0NBUEUKKzB4MUMJMHgwMDFDCSNGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJI0dST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSNBU1RFUklTSworMHgyQgkweDAwMkIJI1BMVVMgU0lHTgorMHgyQwkweDAwMkMJI0NPTU1BCisweDJECTB4MDAyRAkjSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSNDT0xPTgorMHgzQgkweDAwM0IJI1NFTUlDT0xPTgorMHgzQwkweDAwM0MJI0xFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJI1ZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjVElMREUKKzB4N0YJMHgwMDdGCSNERUxFVEUKKzB4ODAJMHgyMEFDCSNFVVJPIFNJR04KKzB4ODEJICAgICAgCSNVTkRFRklORUQKKzB4ODIJMHgyMDFBCSNTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODMJMHgwMTkyCSNMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKzB4ODQJMHgyMDFFCSNET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODUJMHgyMDI2CSNIT1JJWk9OVEFMIEVMTElQU0lTCisweDg2CTB4MjAyMAkjREFHR0VSCisweDg3CTB4MjAyMQkjRE9VQkxFIERBR0dFUgorMHg4OAkgICAgICAJI1VOREVGSU5FRAorMHg4OQkweDIwMzAJI1BFUiBNSUxMRSBTSUdOCisweDhBCSAgICAgIAkjVU5ERUZJTkVECisweDhCCTB4MjAzOQkjU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OEMJICAgICAgCSNVTkRFRklORUQKKzB4OEQJICAgICAgCSNVTkRFRklORUQKKzB4OEUJICAgICAgCSNVTkRFRklORUQKKzB4OEYJICAgICAgCSNVTkRFRklORUQKKzB4OTAJICAgICAgCSNVTkRFRklORUQKKzB4OTEJMHgyMDE4CSNMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHg5MgkweDIwMTkJI1JJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHg5MwkweDIwMUMJI0xFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweDk0CTB4MjAxRAkjUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweDk1CTB4MjAyMgkjQlVMTEVUCisweDk2CTB4MjAxMwkjRU4gREFTSAorMHg5NwkweDIwMTQJI0VNIERBU0gKKzB4OTgJICAgICAgCSNVTkRFRklORUQKKzB4OTkJMHgyMTIyCSNUUkFERSBNQVJLIFNJR04KKzB4OUEJICAgICAgCSNVTkRFRklORUQKKzB4OUIJMHgyMDNBCSNTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OUMJICAgICAgCSNVTkRFRklORUQKKzB4OUQJICAgICAgCSNVTkRFRklORUQKKzB4OUUJICAgICAgCSNVTkRFRklORUQKKzB4OUYJICAgICAgCSNVTkRFRklORUQKKzB4QTAJMHgwMEEwCSNOTy1CUkVBSyBTUEFDRQorMHhBMQkweDAzODUJI0dSRUVLIERJQUxZVElLQSBUT05PUworMHhBMgkweDAzODYJI0dSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKzB4QTMJMHgwMEEzCSNQT1VORCBTSUdOCisweEE0CTB4MDBBNAkjQ1VSUkVOQ1kgU0lHTgorMHhBNQkweDAwQTUJI1lFTiBTSUdOCisweEE2CTB4MDBBNgkjQlJPS0VOIEJBUgorMHhBNwkweDAwQTcJI1NFQ1RJT04gU0lHTgorMHhBOAkweDAwQTgJI0RJQUVSRVNJUworMHhBOQkweDAwQTkJI0NPUFlSSUdIVCBTSUdOCisweEFBCSAgICAgIAkjVU5ERUZJTkVECisweEFCCTB4MDBBQgkjTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QUMJMHgwMEFDCSNOT1QgU0lHTgorMHhBRAkweDAwQUQJI1NPRlQgSFlQSEVOCisweEFFCTB4MDBBRQkjUkVHSVNURVJFRCBTSUdOCisweEFGCTB4MjAxNQkjSE9SSVpPTlRBTCBCQVIKKzB4QjAJMHgwMEIwCSNERUdSRUUgU0lHTgorMHhCMQkweDAwQjEJI1BMVVMtTUlOVVMgU0lHTgorMHhCMgkweDAwQjIJI1NVUEVSU0NSSVBUIFRXTworMHhCMwkweDAwQjMJI1NVUEVSU0NSSVBUIFRIUkVFCisweEI0CTB4MDM4NAkjR1JFRUsgVE9OT1MKKzB4QjUJMHgwMEI1CSNNSUNSTyBTSUdOCisweEI2CTB4MDBCNgkjUElMQ1JPVyBTSUdOCisweEI3CTB4MDBCNwkjTUlERExFIERPVAorMHhCOAkweDAzODgJI0dSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworMHhCOQkweDAzODkJI0dSRUVLIENBUElUQUwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisweEJBCTB4MDM4QQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisweEJCCTB4MDBCQgkjUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweEJDCTB4MDM4QwkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisweEJECTB4MDBCRAkjVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisweEJFCTB4MDM4RQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisweEJGCTB4MDM4RgkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworMHhDMAkweDAzOTAJI0dSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworMHhDMQkweDAzOTEJI0dSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBCisweEMyCTB4MDM5MgkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQorMHhDMwkweDAzOTMJI0dSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisweEM0CTB4MDM5NAkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEKKzB4QzUJMHgwMzk1CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCisweEM2CTB4MDM5NgkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorMHhDNwkweDAzOTcJI0dSRUVLIENBUElUQUwgTEVUVEVSIEVUQQorMHhDOAkweDAzOTgJI0dSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisweEM5CTB4MDM5OQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQorMHhDQQkweDAzOUEJI0dSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCisweENCCTB4MDM5QgkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEKKzB4Q0MJMHgwMzlDCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorMHhDRAkweDAzOUQJI0dSRUVLIENBUElUQUwgTEVUVEVSIE5VCisweENFCTB4MDM5RQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkKKzB4Q0YJMHgwMzlGCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisweEQwCTB4MDNBMAkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkKKzB4RDEJMHgwM0ExCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8KKzB4RDIJICAgICAgCSNVTkRFRklORUQKKzB4RDMJMHgwM0EzCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorMHhENAkweDAzQTQJI0dSRUVLIENBUElUQUwgTEVUVEVSIFRBVQorMHhENQkweDAzQTUJI0dSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKzB4RDYJMHgwM0E2CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKzB4RDcJMHgwM0E3CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkKKzB4RDgJMHgwM0E4CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKzB4RDkJMHgwM0E5CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorMHhEQQkweDAzQUEJI0dSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKzB4REIJMHgwM0FCCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisweERDCTB4MDNBQwkjR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKzB4REQJMHgwM0FECSNHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisweERFCTB4MDNBRQkjR1JFRUsgU01BTEwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisweERGCTB4MDNBRgkjR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworMHhFMAkweDAzQjAJI0dSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworMHhFMQkweDAzQjEJI0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorMHhFMgkweDAzQjIJI0dSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisweEUzCTB4MDNCMwkjR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCisweEU0CTB4MDNCNAkjR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisweEU1CTB4MDNCNQkjR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKzB4RTYJMHgwM0I2CSNHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQorMHhFNwkweDAzQjcJI0dSRUVLIFNNQUxMIExFVFRFUiBFVEEKKzB4RTgJMHgwM0I4CSNHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKzB4RTkJMHgwM0I5CSNHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQorMHhFQQkweDAzQkEJI0dSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorMHhFQgkweDAzQkIJI0dSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorMHhFQwkweDAzQkMJI0dSRUVLIFNNQUxMIExFVFRFUiBNVQorMHhFRAkweDAzQkQJI0dSRUVLIFNNQUxMIExFVFRFUiBOVQorMHhFRQkweDAzQkUJI0dSRUVLIFNNQUxMIExFVFRFUiBYSQorMHhFRgkweDAzQkYJI0dSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCisweEYwCTB4MDNDMAkjR1JFRUsgU01BTEwgTEVUVEVSIFBJCisweEYxCTB4MDNDMQkjR1JFRUsgU01BTEwgTEVUVEVSIFJITworMHhGMgkweDAzQzIJI0dSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQorMHhGMwkweDAzQzMJI0dSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorMHhGNAkweDAzQzQJI0dSRUVLIFNNQUxMIExFVFRFUiBUQVUKKzB4RjUJMHgwM0M1CSNHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTgorMHhGNgkweDAzQzYJI0dSRUVLIFNNQUxMIExFVFRFUiBQSEkKKzB4RjcJMHgwM0M3CSNHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCisweEY4CTB4MDNDOAkjR1JFRUsgU01BTEwgTEVUVEVSIFBTSQorMHhGOQkweDAzQzkJI0dSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorMHhGQQkweDAzQ0EJI0dSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisweEZCCTB4MDNDQgkjR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKzB4RkMJMHgwM0NDCSNHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisweEZECTB4MDNDRAkjR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworMHhGRQkweDAzQ0UJI0dSRUVLIFNNQUxMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisweEZGCSAgICAgIAkjVU5ERUZJTkVECmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDEyNTQudHh0IGIvY29kZXBhZ2UvY3AxMjU0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODdlZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3AxMjU0LnR4dApAQCAtMCwwICsxLDI3NCBAQAorIworIyAgICBOYW1lOiAgICAgY3AxMjU0IHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMQorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8xNS85OAorIworIyAgICBDb250YWN0OiAgICAgICBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIworIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwMTI1NCBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3AxMjU0IG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJI0xJTkUgRkVFRAorMHgwQgkweDAwMEIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSNGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSNDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSNTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJI1NVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSNFU0NBUEUKKzB4MUMJMHgwMDFDCSNGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJI0dST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSNBU1RFUklTSworMHgyQgkweDAwMkIJI1BMVVMgU0lHTgorMHgyQwkweDAwMkMJI0NPTU1BCisweDJECTB4MDAyRAkjSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSNDT0xPTgorMHgzQgkweDAwM0IJI1NFTUlDT0xPTgorMHgzQwkweDAwM0MJI0xFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJI1ZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjVElMREUKKzB4N0YJMHgwMDdGCSNERUxFVEUKKzB4ODAJMHgyMEFDCSNFVVJPIFNJR04KKzB4ODEJICAgICAgCSNVTkRFRklORUQKKzB4ODIJMHgyMDFBCSNTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODMJMHgwMTkyCSNMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKzB4ODQJMHgyMDFFCSNET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODUJMHgyMDI2CSNIT1JJWk9OVEFMIEVMTElQU0lTCisweDg2CTB4MjAyMAkjREFHR0VSCisweDg3CTB4MjAyMQkjRE9VQkxFIERBR0dFUgorMHg4OAkweDAyQzYJI01PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorMHg4OQkweDIwMzAJI1BFUiBNSUxMRSBTSUdOCisweDhBCTB4MDE2MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisweDhCCTB4MjAzOQkjU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OEMJMHgwMTUyCSNMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisweDhECSAgICAgIAkjVU5ERUZJTkVECisweDhFCSAgICAgIAkjVU5ERUZJTkVECisweDhGCSAgICAgIAkjVU5ERUZJTkVECisweDkwCSAgICAgIAkjVU5ERUZJTkVECisweDkxCTB4MjAxOAkjTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OTIJMHgyMDE5CSNSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OTMJMHgyMDFDCSNMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworMHg5NAkweDIwMUQJI1JJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworMHg5NQkweDIwMjIJI0JVTExFVAorMHg5NgkweDIwMTMJI0VOIERBU0gKKzB4OTcJMHgyMDE0CSNFTSBEQVNICisweDk4CTB4MDJEQwkjU01BTEwgVElMREUKKzB4OTkJMHgyMTIyCSNUUkFERSBNQVJLIFNJR04KKzB4OUEJMHgwMTYxCSNMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisweDlCCTB4MjAzQQkjU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweDlDCTB4MDE1MwkjTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKzB4OUQJICAgICAgCSNVTkRFRklORUQKKzB4OUUJICAgICAgCSNVTkRFRklORUQKKzB4OUYJMHgwMTc4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisweEEwCTB4MDBBMAkjTk8tQlJFQUsgU1BBQ0UKKzB4QTEJMHgwMEExCSNJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisweEEyCTB4MDBBMgkjQ0VOVCBTSUdOCisweEEzCTB4MDBBMwkjUE9VTkQgU0lHTgorMHhBNAkweDAwQTQJI0NVUlJFTkNZIFNJR04KKzB4QTUJMHgwMEE1CSNZRU4gU0lHTgorMHhBNgkweDAwQTYJI0JST0tFTiBCQVIKKzB4QTcJMHgwMEE3CSNTRUNUSU9OIFNJR04KKzB4QTgJMHgwMEE4CSNESUFFUkVTSVMKKzB4QTkJMHgwMEE5CSNDT1BZUklHSFQgU0lHTgorMHhBQQkweDAwQUEJI0ZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisweEFCCTB4MDBBQgkjTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QUMJMHgwMEFDCSNOT1QgU0lHTgorMHhBRAkweDAwQUQJI1NPRlQgSFlQSEVOCisweEFFCTB4MDBBRQkjUkVHSVNURVJFRCBTSUdOCisweEFGCTB4MDBBRgkjTUFDUk9OCisweEIwCTB4MDBCMAkjREVHUkVFIFNJR04KKzB4QjEJMHgwMEIxCSNQTFVTLU1JTlVTIFNJR04KKzB4QjIJMHgwMEIyCSNTVVBFUlNDUklQVCBUV08KKzB4QjMJMHgwMEIzCSNTVVBFUlNDUklQVCBUSFJFRQorMHhCNAkweDAwQjQJI0FDVVRFIEFDQ0VOVAorMHhCNQkweDAwQjUJI01JQ1JPIFNJR04KKzB4QjYJMHgwMEI2CSNQSUxDUk9XIFNJR04KKzB4QjcJMHgwMEI3CSNNSURETEUgRE9UCisweEI4CTB4MDBCOAkjQ0VESUxMQQorMHhCOQkweDAwQjkJI1NVUEVSU0NSSVBUIE9ORQorMHhCQQkweDAwQkEJI01BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorMHhCQgkweDAwQkIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDAwQkMJI1ZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorMHhCRAkweDAwQkQJI1ZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhCRQkweDAwQkUJI1ZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworMHhCRgkweDAwQkYJI0lOVkVSVEVEIFFVRVNUSU9OIE1BUksKKzB4QzAJMHgwMEMwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4QzEJMHgwMEMxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4QzIJMHgwMEMyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhDMwkweDAwQzMJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhDNAkweDAwQzQJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4QzUJMHgwMEM1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorMHhDNgkweDAwQzYJI0xBVElOIENBUElUQUwgTEVUVEVSIEFFCisweEM3CTB4MDBDNwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4QzgJMHgwMEM4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKzB4QzkJMHgwMEM5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4Q0EJMHgwMENBCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHhDQgkweDAwQ0IJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4Q0MJMHgwMENDCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4Q0QJMHgwMENECSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4Q0UJMHgwMENFCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorMHhDRgkweDAwQ0YJI0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4RDAJMHgwMTFFCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKzB4RDEJMHgwMEQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKzB4RDIJMHgwMEQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4RDMJMHgwMEQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RDQJMHgwMEQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorMHhENQkweDAwRDUJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhENgkweDAwRDYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4RDcJMHgwMEQ3CSNNVUxUSVBMSUNBVElPTiBTSUdOCisweEQ4CTB4MDBEOAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhEOQkweDAwRDkJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHhEQQkweDAwREEJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhEQgkweDAwREIJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweERDCTB4MDBEQwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHhERAkweDAxMzAJI0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUKKzB4REUJMHgwMTVFCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorMHhERgkweDAwREYJI0xBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweEUwCTB4MDBFMAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorMHhFMQkweDAwRTEJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4RTIJMHgwMEUyCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwMEUzCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisweEU0CTB4MDBFNAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4RTUJMHgwMEU1CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4RTYJMHgwMEU2CSNMQVRJTiBTTUFMTCBMRVRURVIgQUUKKzB4RTcJMHgwMEU3CSNMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4RTgJMHgwMEU4CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEU5CTB4MDBFOQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHhFQQkweDAwRUEJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHhFQgkweDAwRUIJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweEVDCTB4MDBFQwkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorMHhFRAkweDAwRUQJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4RUUJMHgwMEVFCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4RUYJMHgwMEVGCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworMHhGMAkweDAxMUYJI0xBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQlJFVkUKKzB4RjEJMHgwMEYxCSNMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisweEYyCTB4MDBGMgkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorMHhGMwkweDAwRjMJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RjQJMHgwMEY0CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RjUJMHgwMEY1CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisweEY2CTB4MDBGNgkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4RjcJMHgwMEY3CSNESVZJU0lPTiBTSUdOCisweEY4CTB4MDBGOAkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKzB4RjkJMHgwMEY5CSNMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisweEZBCTB4MDBGQQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAwRkIJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHhGQwkweDAwRkMJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweEZECTB4MDEzMQkjTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorMHhGRQkweDAxNUYJI0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorMHhGRgkweDAwRkYJI0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDEyNTUudHh0IGIvY29kZXBhZ2UvY3AxMjU1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODVmOTkzCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3AxMjU1LnR4dApAQCAtMCwwICsxLDI3NCBAQAorIworIyAgICBOYW1lOiAgICAgY3AxMjU1IHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMQorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAxLzcvMjAwMAorIworIyAgICBDb250YWN0OiAgICAgICBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIworIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwMTI1NSBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3AxMjU1IG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJI0xJTkUgRkVFRAorMHgwQgkweDAwMEIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSNGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSNDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSNTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJI1NVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSNFU0NBUEUKKzB4MUMJMHgwMDFDCSNGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJI0dST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSNBU1RFUklTSworMHgyQgkweDAwMkIJI1BMVVMgU0lHTgorMHgyQwkweDAwMkMJI0NPTU1BCisweDJECTB4MDAyRAkjSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSNDT0xPTgorMHgzQgkweDAwM0IJI1NFTUlDT0xPTgorMHgzQwkweDAwM0MJI0xFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJI1ZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjVElMREUKKzB4N0YJMHgwMDdGCSNERUxFVEUKKzB4ODAJMHgyMEFDCSNFVVJPIFNJR04KKzB4ODEJICAgICAgCSNVTkRFRklORUQKKzB4ODIJMHgyMDFBCSNTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODMJMHgwMTkyCSNMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKzB4ODQJMHgyMDFFCSNET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODUJMHgyMDI2CSNIT1JJWk9OVEFMIEVMTElQU0lTCisweDg2CTB4MjAyMAkjREFHR0VSCisweDg3CTB4MjAyMQkjRE9VQkxFIERBR0dFUgorMHg4OAkweDAyQzYJI01PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorMHg4OQkweDIwMzAJI1BFUiBNSUxMRSBTSUdOCisweDhBCSAgICAgIAkjVU5ERUZJTkVECisweDhCCTB4MjAzOQkjU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OEMJICAgICAgCSNVTkRFRklORUQKKzB4OEQJICAgICAgCSNVTkRFRklORUQKKzB4OEUJICAgICAgCSNVTkRFRklORUQKKzB4OEYJICAgICAgCSNVTkRFRklORUQKKzB4OTAJICAgICAgCSNVTkRFRklORUQKKzB4OTEJMHgyMDE4CSNMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHg5MgkweDIwMTkJI1JJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHg5MwkweDIwMUMJI0xFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweDk0CTB4MjAxRAkjUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweDk1CTB4MjAyMgkjQlVMTEVUCisweDk2CTB4MjAxMwkjRU4gREFTSAorMHg5NwkweDIwMTQJI0VNIERBU0gKKzB4OTgJMHgwMkRDCSNTTUFMTCBUSUxERQorMHg5OQkweDIxMjIJI1RSQURFIE1BUksgU0lHTgorMHg5QQkgICAgICAJI1VOREVGSU5FRAorMHg5QgkweDIwM0EJI1NJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworMHg5QwkgICAgICAJI1VOREVGSU5FRAorMHg5RAkgICAgICAJI1VOREVGSU5FRAorMHg5RQkgICAgICAJI1VOREVGSU5FRAorMHg5RgkgICAgICAJI1VOREVGSU5FRAorMHhBMAkweDAwQTAJI05PLUJSRUFLIFNQQUNFCisweEExCTB4MDBBMQkjSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworMHhBMgkweDAwQTIJI0NFTlQgU0lHTgorMHhBMwkweDAwQTMJI1BPVU5EIFNJR04KKzB4QTQJMHgyMEFBCSNORVcgU0hFUUVMIFNJR04KKzB4QTUJMHgwMEE1CSNZRU4gU0lHTgorMHhBNgkweDAwQTYJI0JST0tFTiBCQVIKKzB4QTcJMHgwMEE3CSNTRUNUSU9OIFNJR04KKzB4QTgJMHgwMEE4CSNESUFFUkVTSVMKKzB4QTkJMHgwMEE5CSNDT1BZUklHSFQgU0lHTgorMHhBQQkweDAwRDcJI01VTFRJUExJQ0FUSU9OIFNJR04KKzB4QUIJMHgwMEFCCSNMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhBQwkweDAwQUMJI05PVCBTSUdOCisweEFECTB4MDBBRAkjU09GVCBIWVBIRU4KKzB4QUUJMHgwMEFFCSNSRUdJU1RFUkVEIFNJR04KKzB4QUYJMHgwMEFGCSNNQUNST04KKzB4QjAJMHgwMEIwCSNERUdSRUUgU0lHTgorMHhCMQkweDAwQjEJI1BMVVMtTUlOVVMgU0lHTgorMHhCMgkweDAwQjIJI1NVUEVSU0NSSVBUIFRXTworMHhCMwkweDAwQjMJI1NVUEVSU0NSSVBUIFRIUkVFCisweEI0CTB4MDBCNAkjQUNVVEUgQUNDRU5UCisweEI1CTB4MDBCNQkjTUlDUk8gU0lHTgorMHhCNgkweDAwQjYJI1BJTENST1cgU0lHTgorMHhCNwkweDAwQjcJI01JRERMRSBET1QKKzB4QjgJMHgwMEI4CSNDRURJTExBCisweEI5CTB4MDBCOQkjU1VQRVJTQ1JJUFQgT05FCisweEJBCTB4MDBGNwkjRElWSVNJT04gU0lHTgorMHhCQgkweDAwQkIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDAwQkMJI1ZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorMHhCRAkweDAwQkQJI1ZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhCRQkweDAwQkUJI1ZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworMHhCRgkweDAwQkYJI0lOVkVSVEVEIFFVRVNUSU9OIE1BUksKKzB4QzAJMHgwNUIwCSNIRUJSRVcgUE9JTlQgU0hFVkEKKzB4QzEJMHgwNUIxCSNIRUJSRVcgUE9JTlQgSEFUQUYgU0VHT0wKKzB4QzIJMHgwNUIyCSNIRUJSRVcgUE9JTlQgSEFUQUYgUEFUQUgKKzB4QzMJMHgwNUIzCSNIRUJSRVcgUE9JTlQgSEFUQUYgUUFNQVRTCisweEM0CTB4MDVCNAkjSEVCUkVXIFBPSU5UIEhJUklRCisweEM1CTB4MDVCNQkjSEVCUkVXIFBPSU5UIFRTRVJFCisweEM2CTB4MDVCNgkjSEVCUkVXIFBPSU5UIFNFR09MCisweEM3CTB4MDVCNwkjSEVCUkVXIFBPSU5UIFBBVEFICisweEM4CTB4MDVCOAkjSEVCUkVXIFBPSU5UIFFBTUFUUworMHhDOQkweDA1QjkJI0hFQlJFVyBQT0lOVCBIT0xBTQorMHhDQQkJI1VOREVGSU5FRAorMHhDQgkweDA1QkIJI0hFQlJFVyBQT0lOVCBRVUJVVFMKKzB4Q0MJMHgwNUJDCSNIRUJSRVcgUE9JTlQgREFHRVNIIE9SIE1BUElRCisweENECTB4MDVCRAkjSEVCUkVXIFBPSU5UIE1FVEVHCisweENFCTB4MDVCRQkjSEVCUkVXIFBVTkNUVUFUSU9OIE1BUUFGCisweENGCTB4MDVCRgkjSEVCUkVXIFBPSU5UIFJBRkUKKzB4RDAJMHgwNUMwCSNIRUJSRVcgUFVOQ1RVQVRJT04gUEFTRVEKKzB4RDEJMHgwNUMxCSNIRUJSRVcgUE9JTlQgU0hJTiBET1QKKzB4RDIJMHgwNUMyCSNIRUJSRVcgUE9JTlQgU0lOIERPVAorMHhEMwkweDA1QzMJI0hFQlJFVyBQVU5DVFVBVElPTiBTT0YgUEFTVVEKKzB4RDQJMHgwNUYwCSNIRUJSRVcgTElHQVRVUkUgWUlERElTSCBET1VCTEUgVkFWCisweEQ1CTB4MDVGMQkjSEVCUkVXIExJR0FUVVJFIFlJRERJU0ggVkFWIFlPRAorMHhENgkweDA1RjIJI0hFQlJFVyBMSUdBVFVSRSBZSURESVNIIERPVUJMRSBZT0QKKzB4RDcJMHgwNUYzCSNIRUJSRVcgUFVOQ1RVQVRJT04gR0VSRVNICisweEQ4CTB4MDVGNAkjSEVCUkVXIFBVTkNUVUFUSU9OIEdFUlNIQVlJTQorMHhEOQkgICAgICAJI1VOREVGSU5FRAorMHhEQQkgICAgICAJI1VOREVGSU5FRAorMHhEQgkgICAgICAJI1VOREVGSU5FRAorMHhEQwkgICAgICAJI1VOREVGSU5FRAorMHhERAkgICAgICAJI1VOREVGSU5FRAorMHhERQkgICAgICAJI1VOREVGSU5FRAorMHhERgkgICAgICAJI1VOREVGSU5FRAorMHhFMAkweDA1RDAJI0hFQlJFVyBMRVRURVIgQUxFRgorMHhFMQkweDA1RDEJI0hFQlJFVyBMRVRURVIgQkVUCisweEUyCTB4MDVEMgkjSEVCUkVXIExFVFRFUiBHSU1FTAorMHhFMwkweDA1RDMJI0hFQlJFVyBMRVRURVIgREFMRVQKKzB4RTQJMHgwNUQ0CSNIRUJSRVcgTEVUVEVSIEhFCisweEU1CTB4MDVENQkjSEVCUkVXIExFVFRFUiBWQVYKKzB4RTYJMHgwNUQ2CSNIRUJSRVcgTEVUVEVSIFpBWUlOCisweEU3CTB4MDVENwkjSEVCUkVXIExFVFRFUiBIRVQKKzB4RTgJMHgwNUQ4CSNIRUJSRVcgTEVUVEVSIFRFVAorMHhFOQkweDA1RDkJI0hFQlJFVyBMRVRURVIgWU9ECisweEVBCTB4MDVEQQkjSEVCUkVXIExFVFRFUiBGSU5BTCBLQUYKKzB4RUIJMHgwNURCCSNIRUJSRVcgTEVUVEVSIEtBRgorMHhFQwkweDA1REMJI0hFQlJFVyBMRVRURVIgTEFNRUQKKzB4RUQJMHgwNURECSNIRUJSRVcgTEVUVEVSIEZJTkFMIE1FTQorMHhFRQkweDA1REUJI0hFQlJFVyBMRVRURVIgTUVNCisweEVGCTB4MDVERgkjSEVCUkVXIExFVFRFUiBGSU5BTCBOVU4KKzB4RjAJMHgwNUUwCSNIRUJSRVcgTEVUVEVSIE5VTgorMHhGMQkweDA1RTEJI0hFQlJFVyBMRVRURVIgU0FNRUtICisweEYyCTB4MDVFMgkjSEVCUkVXIExFVFRFUiBBWUlOCisweEYzCTB4MDVFMwkjSEVCUkVXIExFVFRFUiBGSU5BTCBQRQorMHhGNAkweDA1RTQJI0hFQlJFVyBMRVRURVIgUEUKKzB4RjUJMHgwNUU1CSNIRUJSRVcgTEVUVEVSIEZJTkFMIFRTQURJCisweEY2CTB4MDVFNgkjSEVCUkVXIExFVFRFUiBUU0FESQorMHhGNwkweDA1RTcJI0hFQlJFVyBMRVRURVIgUU9GCisweEY4CTB4MDVFOAkjSEVCUkVXIExFVFRFUiBSRVNICisweEY5CTB4MDVFOQkjSEVCUkVXIExFVFRFUiBTSElOCisweEZBCTB4MDVFQQkjSEVCUkVXIExFVFRFUiBUQVYKKzB4RkIJICAgICAgCSNVTkRFRklORUQKKzB4RkMJICAgICAgCSNVTkRFRklORUQKKzB4RkQJMHgyMDBFCSNMRUZULVRPLVJJR0hUIE1BUksKKzB4RkUJMHgyMDBGCSNSSUdIVC1UTy1MRUZUIE1BUksKKzB4RkYJICAgICAgCSNVTkRFRklORUQKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2NwMTI1Ni50eHQgYi9jb2RlcGFnZS9jcDEyNTYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGRjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDEyNTYudHh0CkBAIC0wLDAgKzEsMjc0IEBACisjCisjICAgIE5hbWU6ICAgICBjcDEyNTYgdG8gVW5pY29kZSB0YWJsZQorIyAgICBVbmljb2RlIHZlcnNpb246IDIuMQorIyAgICBUYWJsZSB2ZXJzaW9uOiAyLjAxCisjICAgIFRhYmxlIGZvcm1hdDogIEZvcm1hdCBBCisjICAgIERhdGU6ICAgICAgICAgIDAxLzUvOTkKKyMKKyMgICAgQ29udGFjdDogICAgICAgU2hhd24uU3RlZWxlQG1pY3Jvc29mdC5jb20KKyMKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDEyNTYgY29kZSAoaW4gaGV4KQorIyAgICAgICAgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIyAgICAgICAgQ29sdW1uICMzIGlzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMgICAgVGhlIGVudHJpZXMgYXJlIGluIGNwMTI1NiBvcmRlcgorIworMHgwMAkweDAwMDAJI05VTEwKKzB4MDEJMHgwMDAxCSNTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJI0VORCBPRiBURVhUCisweDA0CTB4MDAwNAkjRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJI0VOUVVJUlkKKzB4MDYJMHgwMDA2CSNBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJI0JFTEwKKzB4MDgJMHgwMDA4CSNCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSNIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MEEJMHgwMDBBCSNMSU5FIEZFRUQKKzB4MEIJMHgwMDBCCSNWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBDCTB4MDAwQwkjRk9STSBGRUVECisweDBECTB4MDAwRAkjQ0FSUklBR0UgUkVUVVJOCisweDBFCTB4MDAwRQkjU0hJRlQgT1VUCisweDBGCTB4MDAwRgkjU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSNEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSNERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSNTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJI0NBTkNFTAorMHgxOQkweDAwMTkJI0VORCBPRiBNRURJVU0KKzB4MUEJMHgwMDFBCSNTVUJTVElUVVRFCisweDFCCTB4MDAxQgkjRVNDQVBFCisweDFDCTB4MDAxQwkjRklMRSBTRVBBUkFUT1IKKzB4MUQJMHgwMDFECSNHUk9VUCBTRVBBUkFUT1IKKzB4MUUJMHgwMDFFCSNSRUNPUkQgU0VQQVJBVE9SCisweDFGCTB4MDAxRgkjVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSNTUEFDRQorMHgyMQkweDAwMjEJI0VYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSNRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJI05VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSNQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSNBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSNBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJI1JJR0hUIFBBUkVOVEhFU0lTCisweDJBCTB4MDAyQQkjQVNURVJJU0sKKzB4MkIJMHgwMDJCCSNQTFVTIFNJR04KKzB4MkMJMHgwMDJDCSNDT01NQQorMHgyRAkweDAwMkQJI0hZUEhFTi1NSU5VUworMHgyRQkweDAwMkUJI0ZVTEwgU1RPUAorMHgyRgkweDAwMkYJI1NPTElEVVMKKzB4MzAJMHgwMDMwCSNESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjRElHSVQgT05FCisweDMyCTB4MDAzMgkjRElHSVQgVFdPCisweDMzCTB4MDAzMwkjRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSNESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjRElHSVQgRklWRQorMHgzNgkweDAwMzYJI0RJR0lUIFNJWAorMHgzNwkweDAwMzcJI0RJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSNESUdJVCBOSU5FCisweDNBCTB4MDAzQQkjQ09MT04KKzB4M0IJMHgwMDNCCSNTRU1JQ09MT04KKzB4M0MJMHgwMDNDCSNMRVNTLVRIQU4gU0lHTgorMHgzRAkweDAwM0QJI0VRVUFMUyBTSUdOCisweDNFCTB4MDAzRQkjR1JFQVRFUi1USEFOIFNJR04KKzB4M0YJMHgwMDNGCSNRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJI0xBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJI0xBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0QQkweDAwNEEJI0xBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NEIJMHgwMDRCCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRDCTB4MDA0QwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0RAkweDAwNEQJI0xBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NEUJMHgwMDRFCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRGCTB4MDA0RgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJI0xBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJI0xBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJI0xBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJI0xBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NUEJMHgwMDVBCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDVCCTB4MDA1QgkjTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1QwkweDAwNUMJI1JFVkVSU0UgU09MSURVUworMHg1RAkweDAwNUQJI1JJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVFCTB4MDA1RQkjQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NUYJMHgwMDVGCSNMT1cgTElORQorMHg2MAkweDAwNjAJI0dSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJI0xBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSNMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJI0xBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSNMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJI0xBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSNMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2QQkweDAwNkEJI0xBVElOIFNNQUxMIExFVFRFUiBKCisweDZCCTB4MDA2QgkjTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NkMJMHgwMDZDCSNMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2RAkweDAwNkQJI0xBVElOIFNNQUxMIExFVFRFUiBNCisweDZFCTB4MDA2RQkjTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NkYJMHgwMDZGCSNMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJI0xBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSNMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJI0xBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSNMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJI0xBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSNMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJI0xBVElOIFNNQUxMIExFVFRFUiBZCisweDdBCTB4MDA3QQkjTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N0IJMHgwMDdCCSNMRUZUIENVUkxZIEJSQUNLRVQKKzB4N0MJMHgwMDdDCSNWRVJUSUNBTCBMSU5FCisweDdECTB4MDA3RAkjUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3RQkweDAwN0UJI1RJTERFCisweDdGCTB4MDA3RgkjREVMRVRFCisweDgwCTB4MjBBQwkjRVVSTyBTSUdOCisweDgxCTB4MDY3RQkjQVJBQklDIExFVFRFUiBQRUgKKzB4ODIJMHgyMDFBCSNTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODMJMHgwMTkyCSNMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKzB4ODQJMHgyMDFFCSNET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODUJMHgyMDI2CSNIT1JJWk9OVEFMIEVMTElQU0lTCisweDg2CTB4MjAyMAkjREFHR0VSCisweDg3CTB4MjAyMQkjRE9VQkxFIERBR0dFUgorMHg4OAkweDAyQzYJI01PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorMHg4OQkweDIwMzAJI1BFUiBNSUxMRSBTSUdOCisweDhBCTB4MDY3OQkjQVJBQklDIExFVFRFUiBUVEVICisweDhCCTB4MjAzOQkjU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OEMJMHgwMTUyCSNMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisweDhECTB4MDY4NgkjQVJBQklDIExFVFRFUiBUQ0hFSAorMHg4RQkweDA2OTgJI0FSQUJJQyBMRVRURVIgSkVICisweDhGCTB4MDY4OAkjQVJBQklDIExFVFRFUiBEREFMCisweDkwCTB4MDZBRgkjQVJBQklDIExFVFRFUiBHQUYKKzB4OTEJMHgyMDE4CSNMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHg5MgkweDIwMTkJI1JJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHg5MwkweDIwMUMJI0xFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweDk0CTB4MjAxRAkjUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweDk1CTB4MjAyMgkjQlVMTEVUCisweDk2CTB4MjAxMwkjRU4gREFTSAorMHg5NwkweDIwMTQJI0VNIERBU0gKKzB4OTgJMHgwNkE5CSNBUkFCSUMgTEVUVEVSIEtFSEVICisweDk5CTB4MjEyMgkjVFJBREUgTUFSSyBTSUdOCisweDlBCTB4MDY5MQkjQVJBQklDIExFVFRFUiBSUkVICisweDlCCTB4MjAzQQkjU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweDlDCTB4MDE1MwkjTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKzB4OUQJMHgyMDBDCSNaRVJPIFdJRFRIIE5PTi1KT0lORVIKKzB4OUUJMHgyMDBECSNaRVJPIFdJRFRIIEpPSU5FUgorMHg5RgkweDA2QkEJI0FSQUJJQyBMRVRURVIgTk9PTiBHSFVOTkEKKzB4QTAJMHgwMEEwCSNOTy1CUkVBSyBTUEFDRQorMHhBMQkweDA2MEMJI0FSQUJJQyBDT01NQQorMHhBMgkweDAwQTIJI0NFTlQgU0lHTgorMHhBMwkweDAwQTMJI1BPVU5EIFNJR04KKzB4QTQJMHgwMEE0CSNDVVJSRU5DWSBTSUdOCisweEE1CTB4MDBBNQkjWUVOIFNJR04KKzB4QTYJMHgwMEE2CSNCUk9LRU4gQkFSCisweEE3CTB4MDBBNwkjU0VDVElPTiBTSUdOCisweEE4CTB4MDBBOAkjRElBRVJFU0lTCisweEE5CTB4MDBBOQkjQ09QWVJJR0hUIFNJR04KKzB4QUEJMHgwNkJFCSNBUkFCSUMgTEVUVEVSIEhFSCBET0FDSEFTSE1FRQorMHhBQgkweDAwQUIJI0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweEFDCTB4MDBBQwkjTk9UIFNJR04KKzB4QUQJMHgwMEFECSNTT0ZUIEhZUEhFTgorMHhBRQkweDAwQUUJI1JFR0lTVEVSRUQgU0lHTgorMHhBRgkweDAwQUYJI01BQ1JPTgorMHhCMAkweDAwQjAJI0RFR1JFRSBTSUdOCisweEIxCTB4MDBCMQkjUExVUy1NSU5VUyBTSUdOCisweEIyCTB4MDBCMgkjU1VQRVJTQ1JJUFQgVFdPCisweEIzCTB4MDBCMwkjU1VQRVJTQ1JJUFQgVEhSRUUKKzB4QjQJMHgwMEI0CSNBQ1VURSBBQ0NFTlQKKzB4QjUJMHgwMEI1CSNNSUNSTyBTSUdOCisweEI2CTB4MDBCNgkjUElMQ1JPVyBTSUdOCisweEI3CTB4MDBCNwkjTUlERExFIERPVAorMHhCOAkweDAwQjgJI0NFRElMTEEKKzB4QjkJMHgwMEI5CSNTVVBFUlNDUklQVCBPTkUKKzB4QkEJMHgwNjFCCSNBUkFCSUMgU0VNSUNPTE9OCisweEJCCTB4MDBCQgkjUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweEJDCTB4MDBCQwkjVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisweEJECTB4MDBCRAkjVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisweEJFCTB4MDBCRQkjVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisweEJGCTB4MDYxRgkjQVJBQklDIFFVRVNUSU9OIE1BUksKKzB4QzAJMHgwNkMxCSNBUkFCSUMgTEVUVEVSIEhFSCBHT0FMCisweEMxCTB4MDYyMQkjQVJBQklDIExFVFRFUiBIQU1aQQorMHhDMgkweDA2MjIJI0FSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFCisweEMzCTB4MDYyMwkjQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUKKzB4QzQJMHgwNjI0CSNBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFCisweEM1CTB4MDYyNQkjQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQkVMT1cKKzB4QzYJMHgwNjI2CSNBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFCisweEM3CTB4MDYyNwkjQVJBQklDIExFVFRFUiBBTEVGCisweEM4CTB4MDYyOAkjQVJBQklDIExFVFRFUiBCRUgKKzB4QzkJMHgwNjI5CSNBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBCisweENBCTB4MDYyQQkjQVJBQklDIExFVFRFUiBURUgKKzB4Q0IJMHgwNjJCCSNBUkFCSUMgTEVUVEVSIFRIRUgKKzB4Q0MJMHgwNjJDCSNBUkFCSUMgTEVUVEVSIEpFRU0KKzB4Q0QJMHgwNjJECSNBUkFCSUMgTEVUVEVSIEhBSAorMHhDRQkweDA2MkUJI0FSQUJJQyBMRVRURVIgS0hBSAorMHhDRgkweDA2MkYJI0FSQUJJQyBMRVRURVIgREFMCisweEQwCTB4MDYzMAkjQVJBQklDIExFVFRFUiBUSEFMCisweEQxCTB4MDYzMQkjQVJBQklDIExFVFRFUiBSRUgKKzB4RDIJMHgwNjMyCSNBUkFCSUMgTEVUVEVSIFpBSU4KKzB4RDMJMHgwNjMzCSNBUkFCSUMgTEVUVEVSIFNFRU4KKzB4RDQJMHgwNjM0CSNBUkFCSUMgTEVUVEVSIFNIRUVOCisweEQ1CTB4MDYzNQkjQVJBQklDIExFVFRFUiBTQUQKKzB4RDYJMHgwNjM2CSNBUkFCSUMgTEVUVEVSIERBRAorMHhENwkweDAwRDcJI01VTFRJUExJQ0FUSU9OIFNJR04KKzB4RDgJMHgwNjM3CSNBUkFCSUMgTEVUVEVSIFRBSAorMHhEOQkweDA2MzgJI0FSQUJJQyBMRVRURVIgWkFICisweERBCTB4MDYzOQkjQVJBQklDIExFVFRFUiBBSU4KKzB4REIJMHgwNjNBCSNBUkFCSUMgTEVUVEVSIEdIQUlOCisweERDCTB4MDY0MAkjQVJBQklDIFRBVFdFRUwKKzB4REQJMHgwNjQxCSNBUkFCSUMgTEVUVEVSIEZFSAorMHhERQkweDA2NDIJI0FSQUJJQyBMRVRURVIgUUFGCisweERGCTB4MDY0MwkjQVJBQklDIExFVFRFUiBLQUYKKzB4RTAJMHgwMEUwCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweEUxCTB4MDY0NAkjQVJBQklDIExFVFRFUiBMQU0KKzB4RTIJMHgwMEUyCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwNjQ1CSNBUkFCSUMgTEVUVEVSIE1FRU0KKzB4RTQJMHgwNjQ2CSNBUkFCSUMgTEVUVEVSIE5PT04KKzB4RTUJMHgwNjQ3CSNBUkFCSUMgTEVUVEVSIEhFSAorMHhFNgkweDA2NDgJI0FSQUJJQyBMRVRURVIgV0FXCisweEU3CTB4MDBFNwkjTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweEU4CTB4MDBFOAkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorMHhFOQkweDAwRTkJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4RUEJMHgwMEVBCSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKzB4RUIJMHgwMEVCCSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworMHhFQwkweDA2NDkJI0FSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBCisweEVECTB4MDY0QQkjQVJBQklDIExFVFRFUiBZRUgKKzB4RUUJMHgwMEVFCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4RUYJMHgwMEVGCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworMHhGMAkweDA2NEIJI0FSQUJJQyBGQVRIQVRBTgorMHhGMQkweDA2NEMJI0FSQUJJQyBEQU1NQVRBTgorMHhGMgkweDA2NEQJI0FSQUJJQyBLQVNSQVRBTgorMHhGMwkweDA2NEUJI0FSQUJJQyBGQVRIQQorMHhGNAkweDAwRjQJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorMHhGNQkweDA2NEYJI0FSQUJJQyBEQU1NQQorMHhGNgkweDA2NTAJI0FSQUJJQyBLQVNSQQorMHhGNwkweDAwRjcJI0RJVklTSU9OIFNJR04KKzB4RjgJMHgwNjUxCSNBUkFCSUMgU0hBRERBCisweEY5CTB4MDBGOQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHhGQQkweDA2NTIJI0FSQUJJQyBTVUtVTgorMHhGQgkweDAwRkIJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHhGQwkweDAwRkMJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweEZECTB4MjAwRQkjTEVGVC1UTy1SSUdIVCBNQVJLCisweEZFCTB4MjAwRgkjUklHSFQtVE8tTEVGVCBNQVJLCisweEZGCTB4MDZEMgkjQVJBQklDIExFVFRFUiBZRUggQkFSUkVFCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDEyNTcudHh0IGIvY29kZXBhZ2UvY3AxMjU3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM0NzVlCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3AxMjU3LnR4dApAQCAtMCwwICsxLDI3NCBAQAorIworIyAgICBOYW1lOiAgICAgY3AxMjU3IHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMQorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8xNS85OAorIworIyAgICBDb250YWN0OiAgICAgICBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIworIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwMTI1NyBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3AxMjU3IG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJI0xJTkUgRkVFRAorMHgwQgkweDAwMEIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSNGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSNDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSNTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJI1NVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSNFU0NBUEUKKzB4MUMJMHgwMDFDCSNGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJI0dST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSNBU1RFUklTSworMHgyQgkweDAwMkIJI1BMVVMgU0lHTgorMHgyQwkweDAwMkMJI0NPTU1BCisweDJECTB4MDAyRAkjSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSNDT0xPTgorMHgzQgkweDAwM0IJI1NFTUlDT0xPTgorMHgzQwkweDAwM0MJI0xFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJI1ZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjVElMREUKKzB4N0YJMHgwMDdGCSNERUxFVEUKKzB4ODAJMHgyMEFDCSNFVVJPIFNJR04KKzB4ODEJICAgICAgCSNVTkRFRklORUQKKzB4ODIJMHgyMDFBCSNTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODMJICAgICAgCSNVTkRFRklORUQKKzB4ODQJMHgyMDFFCSNET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKzB4ODUJMHgyMDI2CSNIT1JJWk9OVEFMIEVMTElQU0lTCisweDg2CTB4MjAyMAkjREFHR0VSCisweDg3CTB4MjAyMQkjRE9VQkxFIERBR0dFUgorMHg4OAkgICAgICAJI1VOREVGSU5FRAorMHg4OQkweDIwMzAJI1BFUiBNSUxMRSBTSUdOCisweDhBCSAgICAgIAkjVU5ERUZJTkVECisweDhCCTB4MjAzOQkjU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OEMJICAgICAgCSNVTkRFRklORUQKKzB4OEQJMHgwMEE4CSNESUFFUkVTSVMKKzB4OEUJMHgwMkM3CSNDQVJPTgorMHg4RgkweDAwQjgJI0NFRElMTEEKKzB4OTAJICAgICAgCSNVTkRFRklORUQKKzB4OTEJMHgyMDE4CSNMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHg5MgkweDIwMTkJI1JJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHg5MwkweDIwMUMJI0xFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweDk0CTB4MjAxRAkjUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweDk1CTB4MjAyMgkjQlVMTEVUCisweDk2CTB4MjAxMwkjRU4gREFTSAorMHg5NwkweDIwMTQJI0VNIERBU0gKKzB4OTgJICAgICAgCSNVTkRFRklORUQKKzB4OTkJMHgyMTIyCSNUUkFERSBNQVJLIFNJR04KKzB4OUEJICAgICAgCSNVTkRFRklORUQKKzB4OUIJMHgyMDNBCSNTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4OUMJICAgICAgCSNVTkRFRklORUQKKzB4OUQJMHgwMEFGCSNNQUNST04KKzB4OUUJMHgwMkRCCSNPR09ORUsKKzB4OUYJICAgICAgCSNVTkRFRklORUQKKzB4QTAJMHgwMEEwCSNOTy1CUkVBSyBTUEFDRQorMHhBMQkgICAgICAJI1VOREVGSU5FRAorMHhBMgkweDAwQTIJI0NFTlQgU0lHTgorMHhBMwkweDAwQTMJI1BPVU5EIFNJR04KKzB4QTQJMHgwMEE0CSNDVVJSRU5DWSBTSUdOCisweEE1CSAgICAgIAkjVU5ERUZJTkVECisweEE2CTB4MDBBNgkjQlJPS0VOIEJBUgorMHhBNwkweDAwQTcJI1NFQ1RJT04gU0lHTgorMHhBOAkweDAwRDgJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKzB4QTkJMHgwMEE5CSNDT1BZUklHSFQgU0lHTgorMHhBQQkweDAxNTYJI0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisweEFCCTB4MDBBQgkjTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QUMJMHgwMEFDCSNOT1QgU0lHTgorMHhBRAkweDAwQUQJI1NPRlQgSFlQSEVOCisweEFFCTB4MDBBRQkjUkVHSVNURVJFRCBTSUdOCisweEFGCTB4MDBDNgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKzB4QjAJMHgwMEIwCSNERUdSRUUgU0lHTgorMHhCMQkweDAwQjEJI1BMVVMtTUlOVVMgU0lHTgorMHhCMgkweDAwQjIJI1NVUEVSU0NSSVBUIFRXTworMHhCMwkweDAwQjMJI1NVUEVSU0NSSVBUIFRIUkVFCisweEI0CTB4MDBCNAkjQUNVVEUgQUNDRU5UCisweEI1CTB4MDBCNQkjTUlDUk8gU0lHTgorMHhCNgkweDAwQjYJI1BJTENST1cgU0lHTgorMHhCNwkweDAwQjcJI01JRERMRSBET1QKKzB4QjgJMHgwMEY4CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhCOQkweDAwQjkJI1NVUEVSU0NSSVBUIE9ORQorMHhCQQkweDAxNTcJI0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorMHhCQgkweDAwQkIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDAwQkMJI1ZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorMHhCRAkweDAwQkQJI1ZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhCRQkweDAwQkUJI1ZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworMHhCRgkweDAwRTYJI0xBVElOIFNNQUxMIExFVFRFUiBBRQorMHhDMAkweDAxMDQJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKzB4QzEJMHgwMTJFCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLCisweEMyCTB4MDEwMAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorMHhDMwkweDAxMDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorMHhDNAkweDAwQzQJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4QzUJMHgwMEM1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorMHhDNgkweDAxMTgJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKzB4QzcJMHgwMTEyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisweEM4CTB4MDEwQwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisweEM5CTB4MDBDOQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweENBCTB4MDE3OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisweENCCTB4MDExNgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorMHhDQwkweDAxMjIJI0xBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisweENECTB4MDEzNgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKzB4Q0UJMHgwMTJBCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggTUFDUk9OCisweENGCTB4MDEzQgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKzB4RDAJMHgwMTYwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4RDEJMHgwMTQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEUKKzB4RDIJMHgwMTQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorMHhEMwkweDAwRDMJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhENAkweDAxNEMJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04KKzB4RDUJMHgwMEQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKzB4RDYJMHgwMEQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEQ3CTB4MDBENwkjTVVMVElQTElDQVRJT04gU0lHTgorMHhEOAkweDAxNzIJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKzB4RDkJMHgwMTQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisweERBCTB4MDE1QQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFCisweERCCTB4MDE2QQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorMHhEQwkweDAwREMJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMTdCCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisweERFCTB4MDE3RAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisweERGCTB4MDBERgkjTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKzB4RTAJMHgwMTA1CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworMHhFMQkweDAxMkYJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLCisweEUyCTB4MDEwMQkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04KKzB4RTMJMHgwMTA3CSNMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisweEU0CTB4MDBFNAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4RTUJMHgwMEU1CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4RTYJMHgwMTE5CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhFNwkweDAxMTMJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisweEU4CTB4MDEwRAkjTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorMHhFOQkweDAwRTkJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4RUEJMHgwMTdBCSNMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisweEVCCTB4MDExNwkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKzB4RUMJMHgwMTIzCSNMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKzB4RUQJMHgwMTM3CSNMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKzB4RUUJMHgwMTJCCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorMHhFRgkweDAxM0MJI0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorMHhGMAkweDAxNjEJI0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4RjEJMHgwMTQ0CSNMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisweEYyCTB4MDE0NgkjTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisweEYzCTB4MDBGMwkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhGNAkweDAxNEQJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisweEY1CTB4MDBGNQkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhGNgkweDAwRjYJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEY3CTB4MDBGNwkjRElWSVNJT04gU0lHTgorMHhGOAkweDAxNzMJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLCisweEY5CTB4MDE0MgkjTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKzB4RkEJMHgwMTVCCSNMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisweEZCCTB4MDE2QgkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04KKzB4RkMJMHgwMEZDCSNMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHhGRAkweDAxN0MJI0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisweEZFCTB4MDE3RQkjTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorMHhGRgkweDAyRDkJI0RPVCBBQk9WRQpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvY3AxMjU4LnR4dCBiL2NvZGVwYWdlL2NwMTI1OC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwMmIzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVwYWdlL2NwMTI1OC50eHQKQEAgLTAsMCArMSwyNzQgQEAKKyMKKyMgICAgTmFtZTogICAgIGNwMTI1OCB0byBVbmljb2RlIHRhYmxlCisjICAgIFVuaWNvZGUgdmVyc2lvbjogMi4wCisjICAgIFRhYmxlIHZlcnNpb246IDIuMDEKKyMgICAgVGFibGUgZm9ybWF0OiAgRm9ybWF0IEEKKyMgICAgRGF0ZTogICAgICAgICAgMDQvMTUvOTgKKyMKKyMgICAgQ29udGFjdDogICAgICAgU2hhd24uU3RlZWxlQG1pY3Jvc29mdC5jb20KKyMKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDEyNTggY29kZSAoaW4gaGV4KQorIyAgICAgICAgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIyAgICAgICAgQ29sdW1uICMzIGlzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMgICAgVGhlIGVudHJpZXMgYXJlIGluIGNwMTI1OCBvcmRlcgorIworMHgwMAkweDAwMDAJI05VTEwKKzB4MDEJMHgwMDAxCSNTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJI0VORCBPRiBURVhUCisweDA0CTB4MDAwNAkjRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJI0VOUVVJUlkKKzB4MDYJMHgwMDA2CSNBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJI0JFTEwKKzB4MDgJMHgwMDA4CSNCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSNIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MEEJMHgwMDBBCSNMSU5FIEZFRUQKKzB4MEIJMHgwMDBCCSNWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBDCTB4MDAwQwkjRk9STSBGRUVECisweDBECTB4MDAwRAkjQ0FSUklBR0UgUkVUVVJOCisweDBFCTB4MDAwRQkjU0hJRlQgT1VUCisweDBGCTB4MDAwRgkjU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSNEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSNERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSNTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJI0NBTkNFTAorMHgxOQkweDAwMTkJI0VORCBPRiBNRURJVU0KKzB4MUEJMHgwMDFBCSNTVUJTVElUVVRFCisweDFCCTB4MDAxQgkjRVNDQVBFCisweDFDCTB4MDAxQwkjRklMRSBTRVBBUkFUT1IKKzB4MUQJMHgwMDFECSNHUk9VUCBTRVBBUkFUT1IKKzB4MUUJMHgwMDFFCSNSRUNPUkQgU0VQQVJBVE9SCisweDFGCTB4MDAxRgkjVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSNTUEFDRQorMHgyMQkweDAwMjEJI0VYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSNRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJI05VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSNQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSNBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSNBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJI1JJR0hUIFBBUkVOVEhFU0lTCisweDJBCTB4MDAyQQkjQVNURVJJU0sKKzB4MkIJMHgwMDJCCSNQTFVTIFNJR04KKzB4MkMJMHgwMDJDCSNDT01NQQorMHgyRAkweDAwMkQJI0hZUEhFTi1NSU5VUworMHgyRQkweDAwMkUJI0ZVTEwgU1RPUAorMHgyRgkweDAwMkYJI1NPTElEVVMKKzB4MzAJMHgwMDMwCSNESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjRElHSVQgT05FCisweDMyCTB4MDAzMgkjRElHSVQgVFdPCisweDMzCTB4MDAzMwkjRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSNESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjRElHSVQgRklWRQorMHgzNgkweDAwMzYJI0RJR0lUIFNJWAorMHgzNwkweDAwMzcJI0RJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSNESUdJVCBOSU5FCisweDNBCTB4MDAzQQkjQ09MT04KKzB4M0IJMHgwMDNCCSNTRU1JQ09MT04KKzB4M0MJMHgwMDNDCSNMRVNTLVRIQU4gU0lHTgorMHgzRAkweDAwM0QJI0VRVUFMUyBTSUdOCisweDNFCTB4MDAzRQkjR1JFQVRFUi1USEFOIFNJR04KKzB4M0YJMHgwMDNGCSNRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJI0xBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJI0xBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0QQkweDAwNEEJI0xBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NEIJMHgwMDRCCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRDCTB4MDA0QwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0RAkweDAwNEQJI0xBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NEUJMHgwMDRFCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRGCTB4MDA0RgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJI0xBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJI0xBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJI0xBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJI0xBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NUEJMHgwMDVBCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDVCCTB4MDA1QgkjTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1QwkweDAwNUMJI1JFVkVSU0UgU09MSURVUworMHg1RAkweDAwNUQJI1JJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVFCTB4MDA1RQkjQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NUYJMHgwMDVGCSNMT1cgTElORQorMHg2MAkweDAwNjAJI0dSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJI0xBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSNMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJI0xBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSNMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJI0xBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSNMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2QQkweDAwNkEJI0xBVElOIFNNQUxMIExFVFRFUiBKCisweDZCCTB4MDA2QgkjTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NkMJMHgwMDZDCSNMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2RAkweDAwNkQJI0xBVElOIFNNQUxMIExFVFRFUiBNCisweDZFCTB4MDA2RQkjTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NkYJMHgwMDZGCSNMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJI0xBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSNMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJI0xBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSNMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJI0xBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSNMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJI0xBVElOIFNNQUxMIExFVFRFUiBZCisweDdBCTB4MDA3QQkjTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N0IJMHgwMDdCCSNMRUZUIENVUkxZIEJSQUNLRVQKKzB4N0MJMHgwMDdDCSNWRVJUSUNBTCBMSU5FCisweDdECTB4MDA3RAkjUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3RQkweDAwN0UJI1RJTERFCisweDdGCTB4MDA3RgkjREVMRVRFCisweDgwCTB4MjBBQwkjRVVSTyBTSUdOCisweDgxCSAgICAgIAkjVU5ERUZJTkVECisweDgyCTB4MjAxQQkjU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisweDgzCTB4MDE5MgkjTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisweDg0CTB4MjAxRQkjRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisweDg1CTB4MjAyNgkjSE9SSVpPTlRBTCBFTExJUFNJUworMHg4NgkweDIwMjAJI0RBR0dFUgorMHg4NwkweDIwMjEJI0RPVUJMRSBEQUdHRVIKKzB4ODgJMHgwMkM2CSNNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4ODkJMHgyMDMwCSNQRVIgTUlMTEUgU0lHTgorMHg4QQkgICAgICAJI1VOREVGSU5FRAorMHg4QgkweDIwMzkJI1NJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweDhDCTB4MDE1MgkjTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQorMHg4RAkgICAgICAJI1VOREVGSU5FRAorMHg4RQkgICAgICAJI1VOREVGSU5FRAorMHg4RgkgICAgICAJI1VOREVGSU5FRAorMHg5MAkgICAgICAJI1VOREVGSU5FRAorMHg5MQkweDIwMTgJI0xFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisweDkyCTB4MjAxOQkjUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisweDkzCTB4MjAxQwkjTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKzB4OTQJMHgyMDFECSNSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKzB4OTUJMHgyMDIyCSNCVUxMRVQKKzB4OTYJMHgyMDEzCSNFTiBEQVNICisweDk3CTB4MjAxNAkjRU0gREFTSAorMHg5OAkweDAyREMJI1NNQUxMIFRJTERFCisweDk5CTB4MjEyMgkjVFJBREUgTUFSSyBTSUdOCisweDlBCSAgICAgIAkjVU5ERUZJTkVECisweDlCCTB4MjAzQQkjU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweDlDCTB4MDE1MwkjTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKzB4OUQJICAgICAgCSNVTkRFRklORUQKKzB4OUUJICAgICAgCSNVTkRFRklORUQKKzB4OUYJMHgwMTc4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisweEEwCTB4MDBBMAkjTk8tQlJFQUsgU1BBQ0UKKzB4QTEJMHgwMEExCSNJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisweEEyCTB4MDBBMgkjQ0VOVCBTSUdOCisweEEzCTB4MDBBMwkjUE9VTkQgU0lHTgorMHhBNAkweDAwQTQJI0NVUlJFTkNZIFNJR04KKzB4QTUJMHgwMEE1CSNZRU4gU0lHTgorMHhBNgkweDAwQTYJI0JST0tFTiBCQVIKKzB4QTcJMHgwMEE3CSNTRUNUSU9OIFNJR04KKzB4QTgJMHgwMEE4CSNESUFFUkVTSVMKKzB4QTkJMHgwMEE5CSNDT1BZUklHSFQgU0lHTgorMHhBQQkweDAwQUEJI0ZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisweEFCCTB4MDBBQgkjTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QUMJMHgwMEFDCSNOT1QgU0lHTgorMHhBRAkweDAwQUQJI1NPRlQgSFlQSEVOCisweEFFCTB4MDBBRQkjUkVHSVNURVJFRCBTSUdOCisweEFGCTB4MDBBRgkjTUFDUk9OCisweEIwCTB4MDBCMAkjREVHUkVFIFNJR04KKzB4QjEJMHgwMEIxCSNQTFVTLU1JTlVTIFNJR04KKzB4QjIJMHgwMEIyCSNTVVBFUlNDUklQVCBUV08KKzB4QjMJMHgwMEIzCSNTVVBFUlNDUklQVCBUSFJFRQorMHhCNAkweDAwQjQJI0FDVVRFIEFDQ0VOVAorMHhCNQkweDAwQjUJI01JQ1JPIFNJR04KKzB4QjYJMHgwMEI2CSNQSUxDUk9XIFNJR04KKzB4QjcJMHgwMEI3CSNNSURETEUgRE9UCisweEI4CTB4MDBCOAkjQ0VESUxMQQorMHhCOQkweDAwQjkJI1NVUEVSU0NSSVBUIE9ORQorMHhCQQkweDAwQkEJI01BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorMHhCQgkweDAwQkIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDAwQkMJI1ZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorMHhCRAkweDAwQkQJI1ZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhCRQkweDAwQkUJI1ZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworMHhCRgkweDAwQkYJI0lOVkVSVEVEIFFVRVNUSU9OIE1BUksKKzB4QzAJMHgwMEMwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4QzEJMHgwMEMxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4QzIJMHgwMEMyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhDMwkweDAxMDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRQorMHhDNAkweDAwQzQJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4QzUJMHgwMEM1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorMHhDNgkweDAwQzYJI0xBVElOIENBUElUQUwgTEVUVEVSIEFFCisweEM3CTB4MDBDNwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4QzgJMHgwMEM4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKzB4QzkJMHgwMEM5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4Q0EJMHgwMENBCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHhDQgkweDAwQ0IJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4Q0MJMHgwMzAwCSNDT01CSU5JTkcgR1JBVkUgQUNDRU5UCisweENECTB4MDBDRAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweENFCTB4MDBDRQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4Q0YJMHgwMENGCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisweEQwCTB4MDExMAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorMHhEMQkweDAwRDEJI0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorMHhEMgkweDAzMDkJI0NPTUJJTklORyBIT09LIEFCT1ZFCisweEQzCTB4MDBEMwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweEQ0CTB4MDBENAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RDUJMHgwMUEwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STgorMHhENgkweDAwRDYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4RDcJMHgwMEQ3CSNNVUxUSVBMSUNBVElPTiBTSUdOCisweEQ4CTB4MDBEOAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhEOQkweDAwRDkJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHhEQQkweDAwREEJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhEQgkweDAwREIJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweERDCTB4MDBEQwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHhERAkweDAxQUYJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOCisweERFCTB4MDMwMwkjQ09NQklOSU5HIFRJTERFCisweERGCTB4MDBERgkjTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKzB4RTAJMHgwMEUwCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweEUxCTB4MDBFMQkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhFMgkweDAwRTIJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhFMwkweDAxMDMJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUKKzB4RTQJMHgwMEU0CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhFNQkweDAwRTUJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorMHhFNgkweDAwRTYJI0xBVElOIFNNQUxMIExFVFRFUiBBRQorMHhFNwkweDAwRTcJI0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHhFOAkweDAwRTgJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKzB4RTkJMHgwMEU5CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweEVBCTB4MDBFQQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweEVCCTB4MDBFQgkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4RUMJMHgwMzAxCSNDT01CSU5JTkcgQUNVVEUgQUNDRU5UCisweEVECTB4MDBFRAkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorMHhFRQkweDAwRUUJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorMHhFRgkweDAwRUYJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisweEYwCTB4MDExMQkjTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKzB4RjEJMHgwMEYxCSNMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisweEYyCTB4MDMyMwkjQ09NQklOSU5HIERPVCBCRUxPVworMHhGMwkweDAwRjMJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RjQJMHgwMEY0CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RjUJMHgwMUExCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4KKzB4RjYJMHgwMEY2CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHhGNwkweDAwRjcJI0RJVklTSU9OIFNJR04KKzB4RjgJMHgwMEY4CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhGOQkweDAwRjkJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4RkEJMHgwMEZBCSNMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweEZCCTB4MDBGQgkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweEZDCTB4MDBGQwkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4RkQJMHgwMUIwCSNMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4KKzB4RkUJMHgyMEFCCSNET05HIFNJR04KKzB4RkYJMHgwMEZGCSNMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUwpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvY3A0MzcudHh0IGIvY29kZXBhZ2UvY3A0MzcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNzRkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDQzNy50eHQKQEAgLTAsMCArMSwyNzQgQEAKKyMKKyMgICAgTmFtZTogICAgIGNwNDM3X0RPU0xhdGluVVMgdG8gVW5pY29kZSB0YWJsZQorIyAgICBVbmljb2RlIHZlcnNpb246IDIuMAorIyAgICBUYWJsZSB2ZXJzaW9uOiAyLjAwCisjICAgIFRhYmxlIGZvcm1hdDogIEZvcm1hdCBBCisjICAgIERhdGU6ICAgICAgICAgIDA0LzI0Lzk2CisjICAgIENvbnRhY3Q6IFNoYXduLlN0ZWVsZUBtaWNyb3NvZnQuY29tCisjICAgICAgICAgICAgICAgICAgIAorIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwNDM3X0RPU0xhdGluVVMgY29kZSAoaW4gaGV4KQorIyAgICAgICAgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIyAgICAgICAgQ29sdW1uICMzIGlzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMgICAgVGhlIGVudHJpZXMgYXJlIGluIGNwNDM3X0RPU0xhdGluVVMgb3JkZXIKKyMKKzB4MDAJMHgwMDAwCSNOVUxMCisweDAxCTB4MDAwMQkjU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJI1NUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSNFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJI0VORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSNFTlFVSVJZCisweDA2CTB4MDAwNgkjQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSNCRUxMCisweDA4CTB4MDAwOAkjQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBhCTB4MDAwYQkjTElORSBGRUVECisweDBiCTB4MDAwYgkjVkVSVElDQUwgVEFCVUxBVElPTgorMHgwYwkweDAwMGMJI0ZPUk0gRkVFRAorMHgwZAkweDAwMGQJI0NBUlJJQUdFIFJFVFVSTgorMHgwZQkweDAwMGUJI1NISUZUIE9VVAorMHgwZgkweDAwMGYJI1NISUZUIElOCisweDEwCTB4MDAxMAkjREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJI0RFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJI0RFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJI0RFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJI05FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJI0VORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSNDQU5DRUwKKzB4MTkJMHgwMDE5CSNFTkQgT0YgTUVESVVNCisweDFhCTB4MDAxYQkjU1VCU1RJVFVURQorMHgxYgkweDAwMWIJI0VTQ0FQRQorMHgxYwkweDAwMWMJI0ZJTEUgU0VQQVJBVE9SCisweDFkCTB4MDAxZAkjR1JPVVAgU0VQQVJBVE9SCisweDFlCTB4MDAxZQkjUkVDT1JEIFNFUEFSQVRPUgorMHgxZgkweDAwMWYJI1VOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjU1BBQ0UKKzB4MjEJMHgwMDIxCSNFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSNOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJI0RPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjQVBPU1RST1BIRQorMHgyOAkweDAwMjgJI0xFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSNSSUdIVCBQQVJFTlRIRVNJUworMHgyYQkweDAwMmEJI0FTVEVSSVNLCisweDJiCTB4MDAyYgkjUExVUyBTSUdOCisweDJjCTB4MDAyYwkjQ09NTUEKKzB4MmQJMHgwMDJkCSNIWVBIRU4tTUlOVVMKKzB4MmUJMHgwMDJlCSNGVUxMIFNUT1AKKzB4MmYJMHgwMDJmCSNTT0xJRFVTCisweDMwCTB4MDAzMAkjRElHSVQgWkVSTworMHgzMQkweDAwMzEJI0RJR0lUIE9ORQorMHgzMgkweDAwMzIJI0RJR0lUIFRXTworMHgzMwkweDAwMzMJI0RJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjRElHSVQgRk9VUgorMHgzNQkweDAwMzUJI0RJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSNESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSNESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJI0RJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjRElHSVQgTklORQorMHgzYQkweDAwM2EJI0NPTE9OCisweDNiCTB4MDAzYgkjU0VNSUNPTE9OCisweDNjCTB4MDAzYwkjTEVTUy1USEFOIFNJR04KKzB4M2QJMHgwMDNkCSNFUVVBTFMgU0lHTgorMHgzZQkweDAwM2UJI0dSRUFURVItVEhBTiBTSUdOCisweDNmCTB4MDAzZgkjUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJI0NPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJI0xBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJI0xBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NGEJMHgwMDRhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRiCTB4MDA0YgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0YwkweDAwNGMJI0xBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NGQJMHgwMDRkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRlCTB4MDA0ZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0ZgkweDAwNGYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJI0xBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJI0xBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJI0xBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVhCTB4MDA1YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1YgkweDAwNWIJI0xFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NWMJMHgwMDVjCSNSRVZFUlNFIFNPTElEVVMKKzB4NWQJMHgwMDVkCSNSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1ZQkweDAwNWUJI0NJUkNVTUZMRVggQUNDRU5UCisweDVmCTB4MDA1ZgkjTE9XIExJTkUKKzB4NjAJMHgwMDYwCSNHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSNMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJI0xBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSNMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJI0xBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSNMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJI0xBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NmEJMHgwMDZhCSNMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2YgkweDAwNmIJI0xBVElOIFNNQUxMIExFVFRFUiBLCisweDZjCTB4MDA2YwkjTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NmQJMHgwMDZkCSNMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2ZQkweDAwNmUJI0xBVElOIFNNQUxMIExFVFRFUiBOCisweDZmCTB4MDA2ZgkjTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSNMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJI0xBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSNMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJI0xBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSNMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJI0xBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSNMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3YQkweDAwN2EJI0xBVElOIFNNQUxMIExFVFRFUiBaCisweDdiCTB4MDA3YgkjTEVGVCBDVVJMWSBCUkFDS0VUCisweDdjCTB4MDA3YwkjVkVSVElDQUwgTElORQorMHg3ZAkweDAwN2QJI1JJR0hUIENVUkxZIEJSQUNLRVQKKzB4N2UJMHgwMDdlCSNUSUxERQorMHg3ZgkweDAwN2YJI0RFTEVURQorMHg4MAkweDAwYzcJI0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweDgxCTB4MDBmYwkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4ODIJMHgwMGU5CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweDgzCTB4MDBlMgkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweDg0CTB4MDBlNAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4ODUJMHgwMGUwCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweDg2CTB4MDBlNQkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisweDg3CTB4MDBlNwkjTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweDg4CTB4MDBlYQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweDg5CTB4MDBlYgkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4OGEJMHgwMGU4CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweDhiCTB4MDBlZgkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4OGMJMHgwMGVlCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4OGQJMHgwMGVjCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisweDhlCTB4MDBjNAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHg4ZgkweDAwYzUJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisweDkwCTB4MDBjOQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweDkxCTB4MDBlNgkjTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKzB4OTIJMHgwMGM2CSNMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisweDkzCTB4MDBmNAkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweDk0CTB4MDBmNgkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4OTUJMHgwMGYyCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisweDk2CTB4MDBmYgkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweDk3CTB4MDBmOQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHg5OAkweDAwZmYJI0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisweDk5CTB4MDBkNgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHg5YQkweDAwZGMJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4OWIJMHgwMGEyCSNDRU5UIFNJR04KKzB4OWMJMHgwMGEzCSNQT1VORCBTSUdOCisweDlkCTB4MDBhNQkjWUVOIFNJR04KKzB4OWUJMHgyMGE3CSNQRVNFVEEgU0lHTgorMHg5ZgkweDAxOTIJI0xBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworMHhhMAkweDAwZTEJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4YTEJMHgwMGVkCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweGEyCTB4MDBmMwkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhhMwkweDAwZmEJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKzB4YTQJMHgwMGYxCSNMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisweGE1CTB4MDBkMQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisweGE2CTB4MDBhYQkjRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKzB4YTcJMHgwMGJhCSNNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKzB4YTgJMHgwMGJmCSNJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisweGE5CTB4MjMxMAkjUkVWRVJTRUQgTk9UIFNJR04KKzB4YWEJMHgwMGFjCSNOT1QgU0lHTgorMHhhYgkweDAwYmQJI1ZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhhYwkweDAwYmMJI1ZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorMHhhZAkweDAwYTEJI0lOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKzB4YWUJMHgwMGFiCSNMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhhZgkweDAwYmIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhiMAkweDI1OTEJI0xJR0hUIFNIQURFCisweGIxCTB4MjU5MgkjTUVESVVNIFNIQURFCisweGIyCTB4MjU5MwkjREFSSyBTSEFERQorMHhiMwkweDI1MDIJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorMHhiNAkweDI1MjQJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorMHhiNQkweDI1NjEJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGI2CTB4MjU2MgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YjcJMHgyNTU2CSNCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGI4CTB4MjU1NQkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiOQkweDI1NjMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKzB4YmEJMHgyNTUxCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisweGJiCTB4MjU1NwkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisweGJjCTB4MjU1ZAkjQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorMHhiZAkweDI1NWMJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGJlCTB4MjU1YgkjQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKzB4YmYJMHgyNTEwCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHhjMAkweDI1MTQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4YzEJMHgyNTM0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4YzIJMHgyNTJjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjMwkweDI1MWMJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YzQJMHgyNTAwCSNCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorMHhjNQkweDI1M2MJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjNgkweDI1NWUJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhjNwkweDI1NWYJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhjOAkweDI1NWEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisweGM5CTB4MjU1NAkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorMHhjYQkweDI1NjkJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKzB4Y2IJMHgyNTY2CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4Y2MJMHgyNTYwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjZAkweDI1NTAJI0JPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorMHhjZQkweDI1NmMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4Y2YJMHgyNTY3CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMAkweDI1NjgJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGQxCTB4MjU2NAkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMgkweDI1NjUJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDMJMHgyNTU5CSNCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4ZDQJMHgyNTU4CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4ZDUJMHgyNTUyCSNCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhkNgkweDI1NTMJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGQ3CTB4MjU2YgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDgJMHgyNTZhCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkOQkweDI1MTgJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorMHhkYQkweDI1MGMJI0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorMHhkYgkweDI1ODgJI0ZVTEwgQkxPQ0sKKzB4ZGMJMHgyNTg0CSNMT1dFUiBIQUxGIEJMT0NLCisweGRkCTB4MjU4YwkjTEVGVCBIQUxGIEJMT0NLCisweGRlCTB4MjU5MAkjUklHSFQgSEFMRiBCTE9DSworMHhkZgkweDI1ODAJI1VQUEVSIEhBTEYgQkxPQ0sKKzB4ZTAJMHgwM2IxCSNHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKzB4ZTEJMHgwMGRmCSNMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworMHhlMgkweDAzOTMJI0dSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisweGUzCTB4MDNjMAkjR1JFRUsgU01BTEwgTEVUVEVSIFBJCisweGU0CTB4MDNhMwkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKzB4ZTUJMHgwM2MzCSNHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKzB4ZTYJMHgwMGI1CSNNSUNSTyBTSUdOCisweGU3CTB4MDNjNAkjR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorMHhlOAkweDAzYTYJI0dSRUVLIENBUElUQUwgTEVUVEVSIFBISQorMHhlOQkweDAzOTgJI0dSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisweGVhCTB4MDNhOQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKzB4ZWIJMHgwM2I0CSNHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKzB4ZWMJMHgyMjFlCSNJTkZJTklUWQorMHhlZAkweDAzYzYJI0dSRUVLIFNNQUxMIExFVFRFUiBQSEkKKzB4ZWUJMHgwM2I1CSNHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorMHhlZgkweDIyMjkJI0lOVEVSU0VDVElPTgorMHhmMAkweDIyNjEJI0lERU5USUNBTCBUTworMHhmMQkweDAwYjEJI1BMVVMtTUlOVVMgU0lHTgorMHhmMgkweDIyNjUJI0dSRUFURVItVEhBTiBPUiBFUVVBTCBUTworMHhmMwkweDIyNjQJI0xFU1MtVEhBTiBPUiBFUVVBTCBUTworMHhmNAkweDIzMjAJI1RPUCBIQUxGIElOVEVHUkFMCisweGY1CTB4MjMyMQkjQk9UVE9NIEhBTEYgSU5URUdSQUwKKzB4ZjYJMHgwMGY3CSNESVZJU0lPTiBTSUdOCisweGY3CTB4MjI0OAkjQUxNT1NUIEVRVUFMIFRPCisweGY4CTB4MDBiMAkjREVHUkVFIFNJR04KKzB4ZjkJMHgyMjE5CSNCVUxMRVQgT1BFUkFUT1IKKzB4ZmEJMHgwMGI3CSNNSURETEUgRE9UCisweGZiCTB4MjIxYQkjU1FVQVJFIFJPT1QKKzB4ZmMJMHgyMDdmCSNTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorMHhmZAkweDAwYjIJI1NVUEVSU0NSSVBUIFRXTworMHhmZQkweDI1YTAJI0JMQUNLIFNRVUFSRQorMHhmZgkweDAwYTAJI05PLUJSRUFLIFNQQUNFCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvY3A3MzcudHh0IGIvY29kZXBhZ2UvY3A3MzcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGI1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDczNy50eHQKQEAgLTAsMCArMSwyNzQgQEAKKyMKKyMgICAgTmFtZTogICAgIGNwNzM3X0RPU0dyZWVrIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMAorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8yNC85NgorIyAgICBDb250YWN0OiBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIyAgICAgICAgICAgICAgICAgICAKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDczN19ET1NHcmVlayBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3A3MzdfRE9TR3JlZWsgb3JkZXIKKyMKKzB4MDAJMHgwMDAwCSNOVUxMCisweDAxCTB4MDAwMQkjU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJI1NUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSNFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJI0VORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSNFTlFVSVJZCisweDA2CTB4MDAwNgkjQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSNCRUxMCisweDA4CTB4MDAwOAkjQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBhCTB4MDAwYQkjTElORSBGRUVECisweDBiCTB4MDAwYgkjVkVSVElDQUwgVEFCVUxBVElPTgorMHgwYwkweDAwMGMJI0ZPUk0gRkVFRAorMHgwZAkweDAwMGQJI0NBUlJJQUdFIFJFVFVSTgorMHgwZQkweDAwMGUJI1NISUZUIE9VVAorMHgwZgkweDAwMGYJI1NISUZUIElOCisweDEwCTB4MDAxMAkjREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJI0RFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJI0RFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJI0RFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJI05FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJI0VORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSNDQU5DRUwKKzB4MTkJMHgwMDE5CSNFTkQgT0YgTUVESVVNCisweDFhCTB4MDAxYQkjU1VCU1RJVFVURQorMHgxYgkweDAwMWIJI0VTQ0FQRQorMHgxYwkweDAwMWMJI0ZJTEUgU0VQQVJBVE9SCisweDFkCTB4MDAxZAkjR1JPVVAgU0VQQVJBVE9SCisweDFlCTB4MDAxZQkjUkVDT1JEIFNFUEFSQVRPUgorMHgxZgkweDAwMWYJI1VOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjU1BBQ0UKKzB4MjEJMHgwMDIxCSNFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSNOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJI0RPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjQVBPU1RST1BIRQorMHgyOAkweDAwMjgJI0xFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSNSSUdIVCBQQVJFTlRIRVNJUworMHgyYQkweDAwMmEJI0FTVEVSSVNLCisweDJiCTB4MDAyYgkjUExVUyBTSUdOCisweDJjCTB4MDAyYwkjQ09NTUEKKzB4MmQJMHgwMDJkCSNIWVBIRU4tTUlOVVMKKzB4MmUJMHgwMDJlCSNGVUxMIFNUT1AKKzB4MmYJMHgwMDJmCSNTT0xJRFVTCisweDMwCTB4MDAzMAkjRElHSVQgWkVSTworMHgzMQkweDAwMzEJI0RJR0lUIE9ORQorMHgzMgkweDAwMzIJI0RJR0lUIFRXTworMHgzMwkweDAwMzMJI0RJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjRElHSVQgRk9VUgorMHgzNQkweDAwMzUJI0RJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSNESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSNESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJI0RJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjRElHSVQgTklORQorMHgzYQkweDAwM2EJI0NPTE9OCisweDNiCTB4MDAzYgkjU0VNSUNPTE9OCisweDNjCTB4MDAzYwkjTEVTUy1USEFOIFNJR04KKzB4M2QJMHgwMDNkCSNFUVVBTFMgU0lHTgorMHgzZQkweDAwM2UJI0dSRUFURVItVEhBTiBTSUdOCisweDNmCTB4MDAzZgkjUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJI0NPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJI0xBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJI0xBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NGEJMHgwMDRhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRiCTB4MDA0YgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0YwkweDAwNGMJI0xBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NGQJMHgwMDRkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRlCTB4MDA0ZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0ZgkweDAwNGYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJI0xBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJI0xBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJI0xBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVhCTB4MDA1YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1YgkweDAwNWIJI0xFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NWMJMHgwMDVjCSNSRVZFUlNFIFNPTElEVVMKKzB4NWQJMHgwMDVkCSNSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1ZQkweDAwNWUJI0NJUkNVTUZMRVggQUNDRU5UCisweDVmCTB4MDA1ZgkjTE9XIExJTkUKKzB4NjAJMHgwMDYwCSNHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSNMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJI0xBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSNMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJI0xBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSNMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJI0xBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NmEJMHgwMDZhCSNMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2YgkweDAwNmIJI0xBVElOIFNNQUxMIExFVFRFUiBLCisweDZjCTB4MDA2YwkjTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NmQJMHgwMDZkCSNMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2ZQkweDAwNmUJI0xBVElOIFNNQUxMIExFVFRFUiBOCisweDZmCTB4MDA2ZgkjTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSNMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJI0xBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSNMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJI0xBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSNMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJI0xBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSNMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3YQkweDAwN2EJI0xBVElOIFNNQUxMIExFVFRFUiBaCisweDdiCTB4MDA3YgkjTEVGVCBDVVJMWSBCUkFDS0VUCisweDdjCTB4MDA3YwkjVkVSVElDQUwgTElORQorMHg3ZAkweDAwN2QJI1JJR0hUIENVUkxZIEJSQUNLRVQKKzB4N2UJMHgwMDdlCSNUSUxERQorMHg3ZgkweDAwN2YJI0RFTEVURQorMHg4MAkweDAzOTEJI0dSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBCisweDgxCTB4MDM5MgkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQorMHg4MgkweDAzOTMJI0dSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisweDgzCTB4MDM5NAkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEKKzB4ODQJMHgwMzk1CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCisweDg1CTB4MDM5NgkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorMHg4NgkweDAzOTcJI0dSRUVLIENBUElUQUwgTEVUVEVSIEVUQQorMHg4NwkweDAzOTgJI0dSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisweDg4CTB4MDM5OQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQorMHg4OQkweDAzOWEJI0dSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCisweDhhCTB4MDM5YgkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEKKzB4OGIJMHgwMzljCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorMHg4YwkweDAzOWQJI0dSRUVLIENBUElUQUwgTEVUVEVSIE5VCisweDhkCTB4MDM5ZQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkKKzB4OGUJMHgwMzlmCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisweDhmCTB4MDNhMAkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkKKzB4OTAJMHgwM2ExCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8KKzB4OTEJMHgwM2EzCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorMHg5MgkweDAzYTQJI0dSRUVLIENBUElUQUwgTEVUVEVSIFRBVQorMHg5MwkweDAzYTUJI0dSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKzB4OTQJMHgwM2E2CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKzB4OTUJMHgwM2E3CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkKKzB4OTYJMHgwM2E4CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKzB4OTcJMHgwM2E5CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorMHg5OAkweDAzYjEJI0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorMHg5OQkweDAzYjIJI0dSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisweDlhCTB4MDNiMwkjR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCisweDliCTB4MDNiNAkjR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisweDljCTB4MDNiNQkjR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKzB4OWQJMHgwM2I2CSNHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQorMHg5ZQkweDAzYjcJI0dSRUVLIFNNQUxMIExFVFRFUiBFVEEKKzB4OWYJMHgwM2I4CSNHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKzB4YTAJMHgwM2I5CSNHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQorMHhhMQkweDAzYmEJI0dSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorMHhhMgkweDAzYmIJI0dSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorMHhhMwkweDAzYmMJI0dSRUVLIFNNQUxMIExFVFRFUiBNVQorMHhhNAkweDAzYmQJI0dSRUVLIFNNQUxMIExFVFRFUiBOVQorMHhhNQkweDAzYmUJI0dSRUVLIFNNQUxMIExFVFRFUiBYSQorMHhhNgkweDAzYmYJI0dSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCisweGE3CTB4MDNjMAkjR1JFRUsgU01BTEwgTEVUVEVSIFBJCisweGE4CTB4MDNjMQkjR1JFRUsgU01BTEwgTEVUVEVSIFJITworMHhhOQkweDAzYzMJI0dSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorMHhhYQkweDAzYzIJI0dSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQorMHhhYgkweDAzYzQJI0dSRUVLIFNNQUxMIExFVFRFUiBUQVUKKzB4YWMJMHgwM2M1CSNHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTgorMHhhZAkweDAzYzYJI0dSRUVLIFNNQUxMIExFVFRFUiBQSEkKKzB4YWUJMHgwM2M3CSNHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCisweGFmCTB4MDNjOAkjR1JFRUsgU01BTEwgTEVUVEVSIFBTSQorMHhiMAkweDI1OTEJI0xJR0hUIFNIQURFCisweGIxCTB4MjU5MgkjTUVESVVNIFNIQURFCisweGIyCTB4MjU5MwkjREFSSyBTSEFERQorMHhiMwkweDI1MDIJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorMHhiNAkweDI1MjQJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorMHhiNQkweDI1NjEJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGI2CTB4MjU2MgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YjcJMHgyNTU2CSNCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGI4CTB4MjU1NQkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiOQkweDI1NjMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKzB4YmEJMHgyNTUxCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisweGJiCTB4MjU1NwkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisweGJjCTB4MjU1ZAkjQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorMHhiZAkweDI1NWMJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGJlCTB4MjU1YgkjQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKzB4YmYJMHgyNTEwCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHhjMAkweDI1MTQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4YzEJMHgyNTM0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4YzIJMHgyNTJjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjMwkweDI1MWMJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YzQJMHgyNTAwCSNCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorMHhjNQkweDI1M2MJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjNgkweDI1NWUJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhjNwkweDI1NWYJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhjOAkweDI1NWEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisweGM5CTB4MjU1NAkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorMHhjYQkweDI1NjkJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKzB4Y2IJMHgyNTY2CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4Y2MJMHgyNTYwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjZAkweDI1NTAJI0JPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorMHhjZQkweDI1NmMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4Y2YJMHgyNTY3CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMAkweDI1NjgJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGQxCTB4MjU2NAkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMgkweDI1NjUJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDMJMHgyNTU5CSNCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4ZDQJMHgyNTU4CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4ZDUJMHgyNTUyCSNCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhkNgkweDI1NTMJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGQ3CTB4MjU2YgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDgJMHgyNTZhCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkOQkweDI1MTgJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorMHhkYQkweDI1MGMJI0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorMHhkYgkweDI1ODgJI0ZVTEwgQkxPQ0sKKzB4ZGMJMHgyNTg0CSNMT1dFUiBIQUxGIEJMT0NLCisweGRkCTB4MjU4YwkjTEVGVCBIQUxGIEJMT0NLCisweGRlCTB4MjU5MAkjUklHSFQgSEFMRiBCTE9DSworMHhkZgkweDI1ODAJI1VQUEVSIEhBTEYgQkxPQ0sKKzB4ZTAJMHgwM2M5CSNHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EKKzB4ZTEJMHgwM2FjCSNHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworMHhlMgkweDAzYWQJI0dSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKzB4ZTMJMHgwM2FlCSNHUkVFSyBTTUFMTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKzB4ZTQJMHgwM2NhCSNHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorMHhlNQkweDAzYWYJI0dSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKzB4ZTYJMHgwM2NjCSNHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisweGU3CTB4MDNjZAkjR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworMHhlOAkweDAzY2IJI0dSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisweGU5CTB4MDNjZQkjR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKzB4ZWEJMHgwMzg2CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisweGViCTB4MDM4OAkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisweGVjCTB4MDM4OQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKzB4ZWQJMHgwMzhhCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKzB4ZWUJMHgwMzhjCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKzB4ZWYJMHgwMzhlCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKzB4ZjAJMHgwMzhmCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisweGYxCTB4MDBiMQkjUExVUy1NSU5VUyBTSUdOCisweGYyCTB4MjI2NQkjR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisweGYzCTB4MjI2NAkjTEVTUy1USEFOIE9SIEVRVUFMIFRPCisweGY0CTB4MDNhYQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorMHhmNQkweDAzYWIJI0dSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKzB4ZjYJMHgwMGY3CSNESVZJU0lPTiBTSUdOCisweGY3CTB4MjI0OAkjQUxNT1NUIEVRVUFMIFRPCisweGY4CTB4MDBiMAkjREVHUkVFIFNJR04KKzB4ZjkJMHgyMjE5CSNCVUxMRVQgT1BFUkFUT1IKKzB4ZmEJMHgwMGI3CSNNSURETEUgRE9UCisweGZiCTB4MjIxYQkjU1FVQVJFIFJPT1QKKzB4ZmMJMHgyMDdmCSNTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorMHhmZAkweDAwYjIJI1NVUEVSU0NSSVBUIFRXTworMHhmZQkweDI1YTAJI0JMQUNLIFNRVUFSRQorMHhmZgkweDAwYTAJI05PLUJSRUFLIFNQQUNFCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvY3A3NzUudHh0IGIvY29kZXBhZ2UvY3A3NzUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjJjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDc3NS50eHQKQEAgLTAsMCArMSwyNzUgQEAKKyMKKyMgICAgTmFtZTogICAgIGNwNzc1X0RPU0JhbHRSaW0gdG8gVW5pY29kZSB0YWJsZQorIyAgICBVbmljb2RlIHZlcnNpb246IDIuMAorIyAgICBUYWJsZSB2ZXJzaW9uOiAyLjAwCisjICAgIFRhYmxlIGZvcm1hdDogIEZvcm1hdCBBCisjICAgIERhdGU6ICAgICAgICAgIDA0LzI0Lzk2CisjICAgIENvbnRhY3Q6IFNoYXduLlN0ZWVsZUBtaWNyb3NvZnQuY29tCisjICAgICAgICAgICAgICAgICAgIAorIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwNzc1X0RPU0JhbHRSaW0gY29kZSAoaW4gaGV4KQorIyAgICAgICAgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIyAgICAgICAgQ29sdW1uICMzIGlzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMgICAgVGhlIGVudHJpZXMgYXJlIGluIGNwNzc1X0RPU0JhbHRSaW0gb3JkZXIKKyMKKzB4MDAJMHgwMDAwCSNOVUxMCisweDAxCTB4MDAwMQkjU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJI1NUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSNFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJI0VORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSNFTlFVSVJZCisweDA2CTB4MDAwNgkjQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSNCRUxMCisweDA4CTB4MDAwOAkjQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBhCTB4MDAwYQkjTElORSBGRUVECisweDBiCTB4MDAwYgkjVkVSVElDQUwgVEFCVUxBVElPTgorMHgwYwkweDAwMGMJI0ZPUk0gRkVFRAorMHgwZAkweDAwMGQJI0NBUlJJQUdFIFJFVFVSTgorMHgwZQkweDAwMGUJI1NISUZUIE9VVAorMHgwZgkweDAwMGYJI1NISUZUIElOCisweDEwCTB4MDAxMAkjREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJI0RFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJI0RFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJI0RFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJI05FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJI0VORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSNDQU5DRUwKKzB4MTkJMHgwMDE5CSNFTkQgT0YgTUVESVVNCisweDFhCTB4MDAxYQkjU1VCU1RJVFVURQorMHgxYgkweDAwMWIJI0VTQ0FQRQorMHgxYwkweDAwMWMJI0ZJTEUgU0VQQVJBVE9SCisweDFkCTB4MDAxZAkjR1JPVVAgU0VQQVJBVE9SCisweDFlCTB4MDAxZQkjUkVDT1JEIFNFUEFSQVRPUgorMHgxZgkweDAwMWYJI1VOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjU1BBQ0UKKzB4MjEJMHgwMDIxCSNFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSNOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJI0RPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjQVBPU1RST1BIRQorMHgyOAkweDAwMjgJI0xFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSNSSUdIVCBQQVJFTlRIRVNJUworMHgyYQkweDAwMmEJI0FTVEVSSVNLCisweDJiCTB4MDAyYgkjUExVUyBTSUdOCisweDJjCTB4MDAyYwkjQ09NTUEKKzB4MmQJMHgwMDJkCSNIWVBIRU4tTUlOVVMKKzB4MmUJMHgwMDJlCSNGVUxMIFNUT1AKKzB4MmYJMHgwMDJmCSNTT0xJRFVTCisweDMwCTB4MDAzMAkjRElHSVQgWkVSTworMHgzMQkweDAwMzEJI0RJR0lUIE9ORQorMHgzMgkweDAwMzIJI0RJR0lUIFRXTworMHgzMwkweDAwMzMJI0RJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjRElHSVQgRk9VUgorMHgzNQkweDAwMzUJI0RJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSNESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSNESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJI0RJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjRElHSVQgTklORQorMHgzYQkweDAwM2EJI0NPTE9OCisweDNiCTB4MDAzYgkjU0VNSUNPTE9OCisweDNjCTB4MDAzYwkjTEVTUy1USEFOIFNJR04KKzB4M2QJMHgwMDNkCSNFUVVBTFMgU0lHTgorMHgzZQkweDAwM2UJI0dSRUFURVItVEhBTiBTSUdOCisweDNmCTB4MDAzZgkjUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJI0NPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJI0xBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJI0xBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NGEJMHgwMDRhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRiCTB4MDA0YgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0YwkweDAwNGMJI0xBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NGQJMHgwMDRkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRlCTB4MDA0ZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0ZgkweDAwNGYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJI0xBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJI0xBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJI0xBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVhCTB4MDA1YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1YgkweDAwNWIJI0xFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NWMJMHgwMDVjCSNSRVZFUlNFIFNPTElEVVMKKzB4NWQJMHgwMDVkCSNSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1ZQkweDAwNWUJI0NJUkNVTUZMRVggQUNDRU5UCisweDVmCTB4MDA1ZgkjTE9XIExJTkUKKzB4NjAJMHgwMDYwCSNHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSNMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJI0xBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSNMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJI0xBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSNMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJI0xBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NmEJMHgwMDZhCSNMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2YgkweDAwNmIJI0xBVElOIFNNQUxMIExFVFRFUiBLCisweDZjCTB4MDA2YwkjTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NmQJMHgwMDZkCSNMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2ZQkweDAwNmUJI0xBVElOIFNNQUxMIExFVFRFUiBOCisweDZmCTB4MDA2ZgkjTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSNMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJI0xBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSNMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJI0xBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSNMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJI0xBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSNMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3YQkweDAwN2EJI0xBVElOIFNNQUxMIExFVFRFUiBaCisweDdiCTB4MDA3YgkjTEVGVCBDVVJMWSBCUkFDS0VUCisweDdjCTB4MDA3YwkjVkVSVElDQUwgTElORQorMHg3ZAkweDAwN2QJI1JJR0hUIENVUkxZIEJSQUNLRVQKKzB4N2UJMHgwMDdlCSNUSUxERQorMHg3ZgkweDAwN2YJI0RFTEVURQorMHg4MAkweDAxMDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorMHg4MQkweDAwZmMJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweDgyCTB4MDBlOQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHg4MwkweDAxMDEJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OCisweDg0CTB4MDBlNAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4ODUJMHgwMTIzCSNMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKzB4ODYJMHgwMGU1CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4ODcJMHgwMTA3CSNMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisweDg4CTB4MDE0MgkjTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKzB4ODkJMHgwMTEzCSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorMHg4YQkweDAxNTYJI0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisweDhiCTB4MDE1NwkjTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisweDhjCTB4MDEyYgkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04KKzB4OGQJMHgwMTc5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUKKzB4OGUJMHgwMGM0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweDhmCTB4MDBjNQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4OTAJMHgwMGM5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4OTEJMHgwMGU2CSNMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorMHg5MgkweDAwYzYJI0xBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKzB4OTMJMHgwMTRkCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE1BQ1JPTgorMHg5NAkweDAwZjYJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweDk1CTB4MDEyMgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKzB4OTYJMHgwMGEyCSNDRU5UIFNJR04KKzB4OTcJMHgwMTVhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKzB4OTgJMHgwMTViCSNMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisweDk5CTB4MDBkNgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHg5YQkweDAwZGMJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4OWIJMHgwMGY4CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHg5YwkweDAwYTMJI1BPVU5EIFNJR04KKzB4OWQJMHgwMGQ4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisweDllCTB4MDBkNwkjTVVMVElQTElDQVRJT04gU0lHTgorMHg5ZgkweDAwYTQJI0NVUlJFTkNZIFNJR04KKzB4YTAJMHgwMTAwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OCisweGExCTB4MDEyYQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorMHhhMgkweDAwZjMJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4YTMJMHgwMTdiCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisweGE0CTB4MDE3YwkjTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKzB4YTUJMHgwMTdhCSNMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisweGE2CTB4MjAxZAkjUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweGE3CTB4MDBhNgkjQlJPS0VOIEJBUgorMHhhOAkweDAwYTkJI0NPUFlSSUdIVCBTSUdOCisweGE5CTB4MDBhZQkjUkVHSVNURVJFRCBTSUdOCisweGFhCTB4MDBhYwkjTk9UIFNJR04KKzB4YWIJMHgwMGJkCSNWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKzB4YWMJMHgwMGJjCSNWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKzB4YWQJMHgwMTQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisweGFlCTB4MDBhYgkjTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4YWYJMHgwMGJiCSNSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4YjAJMHgyNTkxCSNMSUdIVCBTSEFERQorMHhiMQkweDI1OTIJI01FRElVTSBTSEFERQorMHhiMgkweDI1OTMJI0RBUksgU0hBREUKKzB4YjMJMHgyNTAyCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKzB4YjQJMHgyNTI0CSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKzB4YjUJMHgwMTA0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisweGI2CTB4MDEwYwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisweGI3CTB4MDExOAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhiOAkweDAxMTYJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKzB4YjkJMHgyNTYzCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisweGJhCTB4MjU1MQkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorMHhiYgkweDI1NTcJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorMHhiYwkweDI1NWQJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKzB4YmQJMHgwMTJlCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLCisweGJlCTB4MDE2MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisweGJmCTB4MjUxMAkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKzB4YzAJMHgyNTE0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisweGMxCTB4MjUzNAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisweGMyCTB4MjUyYwkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKzB4YzMJMHgyNTFjCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisweGM0CTB4MjUwMAkjQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKzB4YzUJMHgyNTNjCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4YzYJMHgwMTcyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLCisweGM3CTB4MDE2YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorMHhjOAkweDI1NWEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisweGM5CTB4MjU1NAkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorMHhjYQkweDI1NjkJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKzB4Y2IJMHgyNTY2CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4Y2MJMHgyNTYwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjZAkweDI1NTAJI0JPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorMHhjZQkweDI1NmMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4Y2YJMHgwMTdkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4ZDAJMHgwMTA1CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworMHhkMQkweDAxMGQJI0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKzB4ZDIJMHgwMTE5CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhkMwkweDAxMTcJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisweGQ0CTB4MDEyZgkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKzB4ZDUJMHgwMTYxCSNMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisweGQ2CTB4MDE3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKzB4ZDcJMHgwMTZiCSNMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorMHhkOAkweDAxN2UJI0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4ZDkJMHgyNTE4CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKzB4ZGEJMHgyNTBjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKzB4ZGIJMHgyNTg4CSNGVUxMIEJMT0NLCisweGRjCTB4MjU4NAkjTE9XRVIgSEFMRiBCTE9DSworMHhkZAkweDI1OGMJI0xFRlQgSEFMRiBCTE9DSworMHhkZQkweDI1OTAJI1JJR0hUIEhBTEYgQkxPQ0sKKzB4ZGYJMHgyNTgwCSNVUFBFUiBIQUxGIEJMT0NLCisweGUwCTB4MDBkMwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweGUxCTB4MDBkZgkjTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdFUk1BTikKKzB4ZTIJMHgwMTRjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OCisweGUzCTB4MDE0MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisweGU0CTB4MDBmNQkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhlNQkweDAwZDUJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhlNgkweDAwYjUJI01JQ1JPIFNJR04KKzB4ZTcJMHgwMTQ0CSNMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisweGU4CTB4MDEzNgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKzB4ZTkJMHgwMTM3CSNMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKzB4ZWEJMHgwMTNiCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorMHhlYgkweDAxM2MJI0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorMHhlYwkweDAxNDYJI0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorMHhlZAkweDAxMTIJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBNQUNST04KKzB4ZWUJMHgwMTQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorMHhlZgkweDIwMTkJI1JJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHhmMAkweDAwYWQJI1NPRlQgSFlQSEVOCisweGYxCTB4MDBiMQkjUExVUy1NSU5VUyBTSUdOCisweGYyCTB4MjAxYwkjTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKzB4ZjMJMHgwMGJlCSNWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKzB4ZjQJMHgwMGI2CSNQSUxDUk9XIFNJR04KKzB4ZjUJMHgwMGE3CSNTRUNUSU9OIFNJR04KKzB4ZjYJMHgwMGY3CSNESVZJU0lPTiBTSUdOCisweGY3CTB4MjAxZQkjRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisweGY4CTB4MDBiMAkjREVHUkVFIFNJR04KKzB4ZjkJMHgyMjE5CSNCVUxMRVQgT1BFUkFUT1IKKzB4ZmEJMHgwMGI3CSNNSURETEUgRE9UCisweGZiCTB4MDBiOQkjU1VQRVJTQ1JJUFQgT05FCisweGZjCTB4MDBiMwkjU1VQRVJTQ1JJUFQgVEhSRUUKKzB4ZmQJMHgwMGIyCSNTVVBFUlNDUklQVCBUV08KKzB4ZmUJMHgyNWEwCSNCTEFDSyBTUVVBUkUKKzB4ZmYJMHgwMGEwCSNOTy1CUkVBSyBTUEFDRQorCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvY3A4NTAudHh0IGIvY29kZXBhZ2UvY3A4NTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDdiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDg1MC50eHQKQEAgLTAsMCArMSwyNzQgQEAKKyMKKyMgICAgTmFtZTogICAgIGNwODUwX0RPU0xhdGluMSB0byBVbmljb2RlIHRhYmxlCisjICAgIFVuaWNvZGUgdmVyc2lvbjogMi4wCisjICAgIFRhYmxlIHZlcnNpb246IDIuMDAKKyMgICAgVGFibGUgZm9ybWF0OiAgRm9ybWF0IEEKKyMgICAgRGF0ZTogICAgICAgICAgMDQvMjQvOTYKKyMgICAgQ29udGFjdDogU2hhd24uU3RlZWxlQG1pY3Jvc29mdC5jb20KKyMgICAgICAgICAgICAgICAgICAgCisjICAgIEdlbmVyYWwgbm90ZXM6IG5vbmUKKyMKKyMgICAgRm9ybWF0OiBUaHJlZSB0YWItc2VwYXJhdGVkIGNvbHVtbnMKKyMgICAgICAgIENvbHVtbiAjMSBpcyB0aGUgY3A4NTBfRE9TTGF0aW4xIGNvZGUgKGluIGhleCkKKyMgICAgICAgIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMgICAgICAgIENvbHVtbiAjMyBpcyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjICAgIFRoZSBlbnRyaWVzIGFyZSBpbiBjcDg1MF9ET1NMYXRpbjEgb3JkZXIKKyMKKzB4MDAJMHgwMDAwCSNOVUxMCisweDAxCTB4MDAwMQkjU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJI1NUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSNFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJI0VORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSNFTlFVSVJZCisweDA2CTB4MDAwNgkjQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSNCRUxMCisweDA4CTB4MDAwOAkjQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBhCTB4MDAwYQkjTElORSBGRUVECisweDBiCTB4MDAwYgkjVkVSVElDQUwgVEFCVUxBVElPTgorMHgwYwkweDAwMGMJI0ZPUk0gRkVFRAorMHgwZAkweDAwMGQJI0NBUlJJQUdFIFJFVFVSTgorMHgwZQkweDAwMGUJI1NISUZUIE9VVAorMHgwZgkweDAwMGYJI1NISUZUIElOCisweDEwCTB4MDAxMAkjREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJI0RFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJI0RFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJI0RFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJI05FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJI0VORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSNDQU5DRUwKKzB4MTkJMHgwMDE5CSNFTkQgT0YgTUVESVVNCisweDFhCTB4MDAxYQkjU1VCU1RJVFVURQorMHgxYgkweDAwMWIJI0VTQ0FQRQorMHgxYwkweDAwMWMJI0ZJTEUgU0VQQVJBVE9SCisweDFkCTB4MDAxZAkjR1JPVVAgU0VQQVJBVE9SCisweDFlCTB4MDAxZQkjUkVDT1JEIFNFUEFSQVRPUgorMHgxZgkweDAwMWYJI1VOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjU1BBQ0UKKzB4MjEJMHgwMDIxCSNFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSNOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJI0RPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjQVBPU1RST1BIRQorMHgyOAkweDAwMjgJI0xFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSNSSUdIVCBQQVJFTlRIRVNJUworMHgyYQkweDAwMmEJI0FTVEVSSVNLCisweDJiCTB4MDAyYgkjUExVUyBTSUdOCisweDJjCTB4MDAyYwkjQ09NTUEKKzB4MmQJMHgwMDJkCSNIWVBIRU4tTUlOVVMKKzB4MmUJMHgwMDJlCSNGVUxMIFNUT1AKKzB4MmYJMHgwMDJmCSNTT0xJRFVTCisweDMwCTB4MDAzMAkjRElHSVQgWkVSTworMHgzMQkweDAwMzEJI0RJR0lUIE9ORQorMHgzMgkweDAwMzIJI0RJR0lUIFRXTworMHgzMwkweDAwMzMJI0RJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjRElHSVQgRk9VUgorMHgzNQkweDAwMzUJI0RJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSNESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSNESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJI0RJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjRElHSVQgTklORQorMHgzYQkweDAwM2EJI0NPTE9OCisweDNiCTB4MDAzYgkjU0VNSUNPTE9OCisweDNjCTB4MDAzYwkjTEVTUy1USEFOIFNJR04KKzB4M2QJMHgwMDNkCSNFUVVBTFMgU0lHTgorMHgzZQkweDAwM2UJI0dSRUFURVItVEhBTiBTSUdOCisweDNmCTB4MDAzZgkjUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJI0NPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJI0xBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJI0xBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NGEJMHgwMDRhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRiCTB4MDA0YgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0YwkweDAwNGMJI0xBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NGQJMHgwMDRkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRlCTB4MDA0ZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0ZgkweDAwNGYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJI0xBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJI0xBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJI0xBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVhCTB4MDA1YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1YgkweDAwNWIJI0xFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NWMJMHgwMDVjCSNSRVZFUlNFIFNPTElEVVMKKzB4NWQJMHgwMDVkCSNSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1ZQkweDAwNWUJI0NJUkNVTUZMRVggQUNDRU5UCisweDVmCTB4MDA1ZgkjTE9XIExJTkUKKzB4NjAJMHgwMDYwCSNHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSNMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJI0xBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSNMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJI0xBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSNMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJI0xBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NmEJMHgwMDZhCSNMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2YgkweDAwNmIJI0xBVElOIFNNQUxMIExFVFRFUiBLCisweDZjCTB4MDA2YwkjTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NmQJMHgwMDZkCSNMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2ZQkweDAwNmUJI0xBVElOIFNNQUxMIExFVFRFUiBOCisweDZmCTB4MDA2ZgkjTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSNMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJI0xBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSNMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJI0xBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSNMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJI0xBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSNMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3YQkweDAwN2EJI0xBVElOIFNNQUxMIExFVFRFUiBaCisweDdiCTB4MDA3YgkjTEVGVCBDVVJMWSBCUkFDS0VUCisweDdjCTB4MDA3YwkjVkVSVElDQUwgTElORQorMHg3ZAkweDAwN2QJI1JJR0hUIENVUkxZIEJSQUNLRVQKKzB4N2UJMHgwMDdlCSNUSUxERQorMHg3ZgkweDAwN2YJI0RFTEVURQorMHg4MAkweDAwYzcJI0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweDgxCTB4MDBmYwkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4ODIJMHgwMGU5CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweDgzCTB4MDBlMgkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweDg0CTB4MDBlNAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4ODUJMHgwMGUwCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweDg2CTB4MDBlNQkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisweDg3CTB4MDBlNwkjTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweDg4CTB4MDBlYQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweDg5CTB4MDBlYgkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4OGEJMHgwMGU4CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweDhiCTB4MDBlZgkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4OGMJMHgwMGVlCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4OGQJMHgwMGVjCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisweDhlCTB4MDBjNAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHg4ZgkweDAwYzUJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisweDkwCTB4MDBjOQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweDkxCTB4MDBlNgkjTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKzB4OTIJMHgwMGM2CSNMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisweDkzCTB4MDBmNAkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweDk0CTB4MDBmNgkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4OTUJMHgwMGYyCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisweDk2CTB4MDBmYgkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweDk3CTB4MDBmOQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHg5OAkweDAwZmYJI0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisweDk5CTB4MDBkNgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHg5YQkweDAwZGMJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4OWIJMHgwMGY4CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHg5YwkweDAwYTMJI1BPVU5EIFNJR04KKzB4OWQJMHgwMGQ4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisweDllCTB4MDBkNwkjTVVMVElQTElDQVRJT04gU0lHTgorMHg5ZgkweDAxOTIJI0xBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworMHhhMAkweDAwZTEJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4YTEJMHgwMGVkCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweGEyCTB4MDBmMwkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhhMwkweDAwZmEJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKzB4YTQJMHgwMGYxCSNMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisweGE1CTB4MDBkMQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisweGE2CTB4MDBhYQkjRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKzB4YTcJMHgwMGJhCSNNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKzB4YTgJMHgwMGJmCSNJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisweGE5CTB4MDBhZQkjUkVHSVNURVJFRCBTSUdOCisweGFhCTB4MDBhYwkjTk9UIFNJR04KKzB4YWIJMHgwMGJkCSNWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKzB4YWMJMHgwMGJjCSNWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKzB4YWQJMHgwMGExCSNJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisweGFlCTB4MDBhYgkjTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4YWYJMHgwMGJiCSNSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4YjAJMHgyNTkxCSNMSUdIVCBTSEFERQorMHhiMQkweDI1OTIJI01FRElVTSBTSEFERQorMHhiMgkweDI1OTMJI0RBUksgU0hBREUKKzB4YjMJMHgyNTAyCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKzB4YjQJMHgyNTI0CSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKzB4YjUJMHgwMGMxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4YjYJMHgwMGMyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhiNwkweDAwYzAJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorMHhiOAkweDAwYTkJI0NPUFlSSUdIVCBTSUdOCisweGI5CTB4MjU2MwkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorMHhiYQkweDI1NTEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKzB4YmIJMHgyNTU3CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKzB4YmMJMHgyNTVkCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisweGJkCTB4MDBhMgkjQ0VOVCBTSUdOCisweGJlCTB4MDBhNQkjWUVOIFNJR04KKzB4YmYJMHgyNTEwCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHhjMAkweDI1MTQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4YzEJMHgyNTM0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4YzIJMHgyNTJjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjMwkweDI1MWMJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YzQJMHgyNTAwCSNCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorMHhjNQkweDI1M2MJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjNgkweDAwZTMJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKzB4YzcJMHgwMGMzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKzB4YzgJMHgyNTVhCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorMHhjOQkweDI1NTQJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKzB4Y2EJMHgyNTY5CSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisweGNiCTB4MjU2NgkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisweGNjCTB4MjU2MAkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKzB4Y2QJMHgyNTUwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKzB4Y2UJMHgyNTZjCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisweGNmCTB4MDBhNAkjQ1VSUkVOQ1kgU0lHTgorMHhkMAkweDAwZjAJI0xBVElOIFNNQUxMIExFVFRFUiBFVEgKKzB4ZDEJMHgwMGQwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKzB4ZDIJMHgwMGNhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHhkMwkweDAwY2IJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4ZDQJMHgwMGM4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKzB4ZDUJMHgwMTMxCSNMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisweGQ2CTB4MDBjZAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweGQ3CTB4MDBjZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4ZDgJMHgwMGNmCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisweGQ5CTB4MjUxOAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisweGRhCTB4MjUwYwkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisweGRiCTB4MjU4OAkjRlVMTCBCTE9DSworMHhkYwkweDI1ODQJI0xPV0VSIEhBTEYgQkxPQ0sKKzB4ZGQJMHgwMGE2CSNCUk9LRU4gQkFSCisweGRlCTB4MDBjYwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisweGRmCTB4MjU4MAkjVVBQRVIgSEFMRiBCTE9DSworMHhlMAkweDAwZDMJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhlMQkweDAwZGYJI0xBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweGUyCTB4MDBkNAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4ZTMJMHgwMGQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4ZTQJMHgwMGY1CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisweGU1CTB4MDBkNQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisweGU2CTB4MDBiNQkjTUlDUk8gU0lHTgorMHhlNwkweDAwZmUJI0xBVElOIFNNQUxMIExFVFRFUiBUSE9STgorMHhlOAkweDAwZGUJI0xBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisweGU5CTB4MDBkYQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweGVhCTB4MDBkYgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKzB4ZWIJMHgwMGQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4ZWMJMHgwMGZkCSNMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisweGVkCTB4MDBkZAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisweGVlCTB4MDBhZgkjTUFDUk9OCisweGVmCTB4MDBiNAkjQUNVVEUgQUNDRU5UCisweGYwCTB4MDBhZAkjU09GVCBIWVBIRU4KKzB4ZjEJMHgwMGIxCSNQTFVTLU1JTlVTIFNJR04KKzB4ZjIJMHgyMDE3CSNET1VCTEUgTE9XIExJTkUKKzB4ZjMJMHgwMGJlCSNWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKzB4ZjQJMHgwMGI2CSNQSUxDUk9XIFNJR04KKzB4ZjUJMHgwMGE3CSNTRUNUSU9OIFNJR04KKzB4ZjYJMHgwMGY3CSNESVZJU0lPTiBTSUdOCisweGY3CTB4MDBiOAkjQ0VESUxMQQorMHhmOAkweDAwYjAJI0RFR1JFRSBTSUdOCisweGY5CTB4MDBhOAkjRElBRVJFU0lTCisweGZhCTB4MDBiNwkjTUlERExFIERPVAorMHhmYgkweDAwYjkJI1NVUEVSU0NSSVBUIE9ORQorMHhmYwkweDAwYjMJI1NVUEVSU0NSSVBUIFRIUkVFCisweGZkCTB4MDBiMgkjU1VQRVJTQ1JJUFQgVFdPCisweGZlCTB4MjVhMAkjQkxBQ0sgU1FVQVJFCisweGZmCTB4MDBhMAkjTk8tQlJFQUsgU1BBQ0UKKxoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDg1Mi50eHQgYi9jb2RlcGFnZS9jcDg1Mi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmMzU2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVwYWdlL2NwODUyLnR4dApAQCAtMCwwICsxLDI3NCBAQAorIworIyAgICBOYW1lOiAgICAgY3A4NTJfRE9TTGF0aW4yIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMAorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8yNC85NgorIyAgICBDb250YWN0OiBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIyAgICAgICAgICAgICAgICAgICAKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDg1Ml9ET1NMYXRpbjIgY29kZSAoaW4gaGV4KQorIyAgICAgICAgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIyAgICAgICAgQ29sdW1uICMzIGlzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMgICAgVGhlIGVudHJpZXMgYXJlIGluIGNwODUyX0RPU0xhdGluMiBvcmRlcgorIworMHgwMAkweDAwMDAJI05VTEwKKzB4MDEJMHgwMDAxCSNTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJI0VORCBPRiBURVhUCisweDA0CTB4MDAwNAkjRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJI0VOUVVJUlkKKzB4MDYJMHgwMDA2CSNBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJI0JFTEwKKzB4MDgJMHgwMDA4CSNCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSNIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MGEJMHgwMDBhCSNMSU5FIEZFRUQKKzB4MGIJMHgwMDBiCSNWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBjCTB4MDAwYwkjRk9STSBGRUVECisweDBkCTB4MDAwZAkjQ0FSUklBR0UgUkVUVVJOCisweDBlCTB4MDAwZQkjU0hJRlQgT1VUCisweDBmCTB4MDAwZgkjU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSNEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSNERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSNTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJI0NBTkNFTAorMHgxOQkweDAwMTkJI0VORCBPRiBNRURJVU0KKzB4MWEJMHgwMDFhCSNTVUJTVElUVVRFCisweDFiCTB4MDAxYgkjRVNDQVBFCisweDFjCTB4MDAxYwkjRklMRSBTRVBBUkFUT1IKKzB4MWQJMHgwMDFkCSNHUk9VUCBTRVBBUkFUT1IKKzB4MWUJMHgwMDFlCSNSRUNPUkQgU0VQQVJBVE9SCisweDFmCTB4MDAxZgkjVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSNTUEFDRQorMHgyMQkweDAwMjEJI0VYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSNRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJI05VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSNQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSNBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSNBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJI1JJR0hUIFBBUkVOVEhFU0lTCisweDJhCTB4MDAyYQkjQVNURVJJU0sKKzB4MmIJMHgwMDJiCSNQTFVTIFNJR04KKzB4MmMJMHgwMDJjCSNDT01NQQorMHgyZAkweDAwMmQJI0hZUEhFTi1NSU5VUworMHgyZQkweDAwMmUJI0ZVTEwgU1RPUAorMHgyZgkweDAwMmYJI1NPTElEVVMKKzB4MzAJMHgwMDMwCSNESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjRElHSVQgT05FCisweDMyCTB4MDAzMgkjRElHSVQgVFdPCisweDMzCTB4MDAzMwkjRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSNESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjRElHSVQgRklWRQorMHgzNgkweDAwMzYJI0RJR0lUIFNJWAorMHgzNwkweDAwMzcJI0RJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSNESUdJVCBOSU5FCisweDNhCTB4MDAzYQkjQ09MT04KKzB4M2IJMHgwMDNiCSNTRU1JQ09MT04KKzB4M2MJMHgwMDNjCSNMRVNTLVRIQU4gU0lHTgorMHgzZAkweDAwM2QJI0VRVUFMUyBTSUdOCisweDNlCTB4MDAzZQkjR1JFQVRFUi1USEFOIFNJR04KKzB4M2YJMHgwMDNmCSNRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJI0xBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJI0xBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0YQkweDAwNGEJI0xBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NGIJMHgwMDRiCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRjCTB4MDA0YwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0ZAkweDAwNGQJI0xBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NGUJMHgwMDRlCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRmCTB4MDA0ZgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJI0xBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJI0xBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJI0xBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJI0xBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NWEJMHgwMDVhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDViCTB4MDA1YgkjTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1YwkweDAwNWMJI1JFVkVSU0UgU09MSURVUworMHg1ZAkweDAwNWQJI1JJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVlCTB4MDA1ZQkjQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NWYJMHgwMDVmCSNMT1cgTElORQorMHg2MAkweDAwNjAJI0dSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJI0xBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSNMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJI0xBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSNMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJI0xBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSNMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2YQkweDAwNmEJI0xBVElOIFNNQUxMIExFVFRFUiBKCisweDZiCTB4MDA2YgkjTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NmMJMHgwMDZjCSNMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2ZAkweDAwNmQJI0xBVElOIFNNQUxMIExFVFRFUiBNCisweDZlCTB4MDA2ZQkjTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NmYJMHgwMDZmCSNMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJI0xBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSNMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJI0xBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSNMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJI0xBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSNMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJI0xBVElOIFNNQUxMIExFVFRFUiBZCisweDdhCTB4MDA3YQkjTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N2IJMHgwMDdiCSNMRUZUIENVUkxZIEJSQUNLRVQKKzB4N2MJMHgwMDdjCSNWRVJUSUNBTCBMSU5FCisweDdkCTB4MDA3ZAkjUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3ZQkweDAwN2UJI1RJTERFCisweDdmCTB4MDA3ZgkjREVMRVRFCisweDgwCTB4MDBjNwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4ODEJMHgwMGZjCSNMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHg4MgkweDAwZTkJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4ODMJMHgwMGUyCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4ODQJMHgwMGU0CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHg4NQkweDAxNmYJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorMHg4NgkweDAxMDcJI0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKzB4ODcJMHgwMGU3CSNMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4ODgJMHgwMTQyCSNMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorMHg4OQkweDAwZWIJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweDhhCTB4MDE1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorMHg4YgkweDAxNTEJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisweDhjCTB4MDBlZQkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisweDhkCTB4MDE3OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisweDhlCTB4MDBjNAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHg4ZgkweDAxMDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorMHg5MAkweDAwYzkJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHg5MQkweDAxMzkJI0xBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBBQ1VURQorMHg5MgkweDAxM2EJI0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQUNVVEUKKzB4OTMJMHgwMGY0CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4OTQJMHgwMGY2CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHg5NQkweDAxM2QJI0xBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDQVJPTgorMHg5NgkweDAxM2UJI0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04KKzB4OTcJMHgwMTVhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKzB4OTgJMHgwMTViCSNMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisweDk5CTB4MDBkNgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHg5YQkweDAwZGMJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4OWIJMHgwMTY0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0FST04KKzB4OWMJMHgwMTY1CSNMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENBUk9OCisweDlkCTB4MDE0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorMHg5ZQkweDAwZDcJI01VTFRJUExJQ0FUSU9OIFNJR04KKzB4OWYJMHgwMTBkCSNMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisweGEwCTB4MDBlMQkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhhMQkweDAwZWQJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4YTIJMHgwMGYzCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweGEzCTB4MDBmYQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhhNAkweDAxMDQJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKzB4YTUJMHgwMTA1CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworMHhhNgkweDAxN2QJI0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorMHhhNwkweDAxN2UJI0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4YTgJMHgwMTE4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisweGE5CTB4MDExOQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKzB4YWEJMHgwMGFjCSNOT1QgU0lHTgorMHhhYgkweDAxN2EJI0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKzB4YWMJMHgwMTBjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKzB4YWQJMHgwMTVmCSNMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKzB4YWUJMHgwMGFiCSNMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhhZgkweDAwYmIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhiMAkweDI1OTEJI0xJR0hUIFNIQURFCisweGIxCTB4MjU5MgkjTUVESVVNIFNIQURFCisweGIyCTB4MjU5MwkjREFSSyBTSEFERQorMHhiMwkweDI1MDIJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorMHhiNAkweDI1MjQJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorMHhiNQkweDAwYzEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhiNgkweDAwYzIJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweGI3CTB4MDExYQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENBUk9OCisweGI4CTB4MDE1ZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKzB4YjkJMHgyNTYzCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisweGJhCTB4MjU1MQkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorMHhiYgkweDI1NTcJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorMHhiYwkweDI1NWQJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKzB4YmQJMHgwMTdiCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisweGJlCTB4MDE3YwkjTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKzB4YmYJMHgyNTEwCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHhjMAkweDI1MTQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4YzEJMHgyNTM0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4YzIJMHgyNTJjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjMwkweDI1MWMJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YzQJMHgyNTAwCSNCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorMHhjNQkweDI1M2MJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjNgkweDAxMDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRQorMHhjNwkweDAxMDMJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUKKzB4YzgJMHgyNTVhCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorMHhjOQkweDI1NTQJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKzB4Y2EJMHgyNTY5CSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisweGNiCTB4MjU2NgkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisweGNjCTB4MjU2MAkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKzB4Y2QJMHgyNTUwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKzB4Y2UJMHgyNTZjCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisweGNmCTB4MDBhNAkjQ1VSUkVOQ1kgU0lHTgorMHhkMAkweDAxMTEJI0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggU1RST0tFCisweGQxCTB4MDExMAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorMHhkMgkweDAxMGUJI0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTgorMHhkMwkweDAwY2IJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4ZDQJMHgwMTBmCSNMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIENBUk9OCisweGQ1CTB4MDE0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENBUk9OCisweGQ2CTB4MDBjZAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweGQ3CTB4MDBjZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4ZDgJMHgwMTFiCSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OCisweGQ5CTB4MjUxOAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisweGRhCTB4MjUwYwkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisweGRiCTB4MjU4OAkjRlVMTCBCTE9DSworMHhkYwkweDI1ODQJI0xPV0VSIEhBTEYgQkxPQ0sKKzB4ZGQJMHgwMTYyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorMHhkZQkweDAxNmUJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisweGRmCTB4MjU4MAkjVVBQRVIgSEFMRiBCTE9DSworMHhlMAkweDAwZDMJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhlMQkweDAwZGYJI0xBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweGUyCTB4MDBkNAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4ZTMJMHgwMTQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEUKKzB4ZTQJMHgwMTQ0CSNMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisweGU1CTB4MDE0OAkjTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDQVJPTgorMHhlNgkweDAxNjAJI0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorMHhlNwkweDAxNjEJI0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4ZTgJMHgwMTU0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQUNVVEUKKzB4ZTkJMHgwMGRhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKzB4ZWEJMHgwMTU1CSNMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIEFDVVRFCisweGViCTB4MDE3MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorMHhlYwkweDAwZmQJI0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKzB4ZWQJMHgwMGRkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKzB4ZWUJMHgwMTYzCSNMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENFRElMTEEKKzB4ZWYJMHgwMGI0CSNBQ1VURSBBQ0NFTlQKKzB4ZjAJMHgwMGFkCSNTT0ZUIEhZUEhFTgorMHhmMQkweDAyZGQJI0RPVUJMRSBBQ1VURSBBQ0NFTlQKKzB4ZjIJMHgwMmRiCSNPR09ORUsKKzB4ZjMJMHgwMmM3CSNDQVJPTgorMHhmNAkweDAyZDgJI0JSRVZFCisweGY1CTB4MDBhNwkjU0VDVElPTiBTSUdOCisweGY2CTB4MDBmNwkjRElWSVNJT04gU0lHTgorMHhmNwkweDAwYjgJI0NFRElMTEEKKzB4ZjgJMHgwMGIwCSNERUdSRUUgU0lHTgorMHhmOQkweDAwYTgJI0RJQUVSRVNJUworMHhmYQkweDAyZDkJI0RPVCBBQk9WRQorMHhmYgkweDAxNzEJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisweGZjCTB4MDE1OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENBUk9OCisweGZkCTB4MDE1OQkjTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDQVJPTgorMHhmZQkweDI1YTAJI0JMQUNLIFNRVUFSRQorMHhmZgkweDAwYTAJI05PLUJSRUFLIFNQQUNFCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvY3A4NTUudHh0IGIvY29kZXBhZ2UvY3A4NTUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDYzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDg1NS50eHQKQEAgLTAsMCArMSwyNzUgQEAKKyMKKyMgICAgTmFtZTogICAgIGNwODU1X0RPU0N5cmlsbGljIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMAorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8yNC85NgorIyAgICBDb250YWN0OiBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIyAgICAgICAgICAgICAgICAgICAKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDg1NV9ET1NDeXJpbGxpYyBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3A4NTVfRE9TQ3lyaWxsaWMgb3JkZXIKKyMKKzB4MDAJMHgwMDAwCSNOVUxMCisweDAxCTB4MDAwMQkjU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJI1NUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSNFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJI0VORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSNFTlFVSVJZCisweDA2CTB4MDAwNgkjQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSNCRUxMCisweDA4CTB4MDAwOAkjQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBhCTB4MDAwYQkjTElORSBGRUVECisweDBiCTB4MDAwYgkjVkVSVElDQUwgVEFCVUxBVElPTgorMHgwYwkweDAwMGMJI0ZPUk0gRkVFRAorMHgwZAkweDAwMGQJI0NBUlJJQUdFIFJFVFVSTgorMHgwZQkweDAwMGUJI1NISUZUIE9VVAorMHgwZgkweDAwMGYJI1NISUZUIElOCisweDEwCTB4MDAxMAkjREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJI0RFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJI0RFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJI0RFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJI05FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJI0VORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSNDQU5DRUwKKzB4MTkJMHgwMDE5CSNFTkQgT0YgTUVESVVNCisweDFhCTB4MDAxYQkjU1VCU1RJVFVURQorMHgxYgkweDAwMWIJI0VTQ0FQRQorMHgxYwkweDAwMWMJI0ZJTEUgU0VQQVJBVE9SCisweDFkCTB4MDAxZAkjR1JPVVAgU0VQQVJBVE9SCisweDFlCTB4MDAxZQkjUkVDT1JEIFNFUEFSQVRPUgorMHgxZgkweDAwMWYJI1VOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjU1BBQ0UKKzB4MjEJMHgwMDIxCSNFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSNOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJI0RPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjQVBPU1RST1BIRQorMHgyOAkweDAwMjgJI0xFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSNSSUdIVCBQQVJFTlRIRVNJUworMHgyYQkweDAwMmEJI0FTVEVSSVNLCisweDJiCTB4MDAyYgkjUExVUyBTSUdOCisweDJjCTB4MDAyYwkjQ09NTUEKKzB4MmQJMHgwMDJkCSNIWVBIRU4tTUlOVVMKKzB4MmUJMHgwMDJlCSNGVUxMIFNUT1AKKzB4MmYJMHgwMDJmCSNTT0xJRFVTCisweDMwCTB4MDAzMAkjRElHSVQgWkVSTworMHgzMQkweDAwMzEJI0RJR0lUIE9ORQorMHgzMgkweDAwMzIJI0RJR0lUIFRXTworMHgzMwkweDAwMzMJI0RJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjRElHSVQgRk9VUgorMHgzNQkweDAwMzUJI0RJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSNESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSNESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJI0RJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjRElHSVQgTklORQorMHgzYQkweDAwM2EJI0NPTE9OCisweDNiCTB4MDAzYgkjU0VNSUNPTE9OCisweDNjCTB4MDAzYwkjTEVTUy1USEFOIFNJR04KKzB4M2QJMHgwMDNkCSNFUVVBTFMgU0lHTgorMHgzZQkweDAwM2UJI0dSRUFURVItVEhBTiBTSUdOCisweDNmCTB4MDAzZgkjUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJI0NPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJI0xBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJI0xBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NGEJMHgwMDRhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRiCTB4MDA0YgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0YwkweDAwNGMJI0xBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NGQJMHgwMDRkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRlCTB4MDA0ZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0ZgkweDAwNGYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJI0xBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJI0xBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJI0xBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVhCTB4MDA1YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1YgkweDAwNWIJI0xFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NWMJMHgwMDVjCSNSRVZFUlNFIFNPTElEVVMKKzB4NWQJMHgwMDVkCSNSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1ZQkweDAwNWUJI0NJUkNVTUZMRVggQUNDRU5UCisweDVmCTB4MDA1ZgkjTE9XIExJTkUKKzB4NjAJMHgwMDYwCSNHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSNMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJI0xBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSNMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJI0xBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSNMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJI0xBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NmEJMHgwMDZhCSNMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2YgkweDAwNmIJI0xBVElOIFNNQUxMIExFVFRFUiBLCisweDZjCTB4MDA2YwkjTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NmQJMHgwMDZkCSNMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2ZQkweDAwNmUJI0xBVElOIFNNQUxMIExFVFRFUiBOCisweDZmCTB4MDA2ZgkjTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSNMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJI0xBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSNMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJI0xBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSNMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJI0xBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSNMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3YQkweDAwN2EJI0xBVElOIFNNQUxMIExFVFRFUiBaCisweDdiCTB4MDA3YgkjTEVGVCBDVVJMWSBCUkFDS0VUCisweDdjCTB4MDA3YwkjVkVSVElDQUwgTElORQorMHg3ZAkweDAwN2QJI1JJR0hUIENVUkxZIEJSQUNLRVQKKzB4N2UJMHgwMDdlCSNUSUxERQorMHg3ZgkweDAwN2YJI0RFTEVURQorMHg4MAkweDA0NTIJI0NZUklMTElDIFNNQUxMIExFVFRFUiBESkUKKzB4ODEJMHgwNDAyCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBESkUKKzB4ODIJMHgwNDUzCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgR0pFCisweDgzCTB4MDQwMwkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0pFCisweDg0CTB4MDQ1MQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisweDg1CTB4MDQwMQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKzB4ODYJMHgwNDU0CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFCisweDg3CTB4MDQwNAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIElFCisweDg4CTB4MDQ1NQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaRQorMHg4OQkweDA0MDUJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIERaRQorMHg4YQkweDA0NTYJI0NZUklMTElDIFNNQUxMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkKKzB4OGIJMHgwNDA2CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkKKzB4OGMJMHgwNDU3CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkKKzB4OGQJMHgwNDA3CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSQorMHg4ZQkweDA0NTgJI0NZUklMTElDIFNNQUxMIExFVFRFUiBKRQorMHg4ZgkweDA0MDgJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEpFCisweDkwCTB4MDQ1OQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIExKRQorMHg5MQkweDA0MDkJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIExKRQorMHg5MgkweDA0NWEJI0NZUklMTElDIFNNQUxMIExFVFRFUiBOSkUKKzB4OTMJMHgwNDBhCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBOSkUKKzB4OTQJMHgwNDViCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNIRQorMHg5NQkweDA0MGIJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFRTSEUKKzB4OTYJMHgwNDVjCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgS0pFCisweDk3CTB4MDQwYwkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFCisweDk4CTB4MDQ1ZQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUKKzB4OTkJMHgwNDBlCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBVCisweDlhCTB4MDQ1ZgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaSEUKKzB4OWIJMHgwNDBmCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkhFCisweDljCTB4MDQ0ZQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVCisweDlkCTB4MDQyZQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKzB4OWUJMHgwNDRhCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisweDlmCTB4MDQyYQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCisweGEwCTB4MDQzMAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKzB4YTEJMHgwNDEwCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisweGEyCTB4MDQzMQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisweGEzCTB4MDQxMQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKzB4YTQJMHgwNDQ2CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisweGE1CTB4MDQyNgkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFCisweGE2CTB4MDQzNAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisweGE3CTB4MDQxNAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKzB4YTgJMHgwNDM1CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgSUUKKzB4YTkJMHgwNDE1CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorMHhhYQkweDA0NDQJI0NZUklMTElDIFNNQUxMIExFVFRFUiBFRgorMHhhYgkweDA0MjQJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEVGCisweGFjCTB4MDQzMwkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorMHhhZAkweDA0MTMJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorMHhhZQkweDAwYWIJI0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweGFmCTB4MDBiYgkjUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweGIwCTB4MjU5MQkjTElHSFQgU0hBREUKKzB4YjEJMHgyNTkyCSNNRURJVU0gU0hBREUKKzB4YjIJMHgyNTkzCSNEQVJLIFNIQURFCisweGIzCTB4MjUwMgkjQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisweGI0CTB4MjUyNAkjQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisweGI1CTB4MDQ0NQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisweGI2CTB4MDQyNQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKzB4YjcJMHgwNDM4CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorMHhiOAkweDA0MTgJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKzB4YjkJMHgyNTYzCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisweGJhCTB4MjU1MQkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorMHhiYgkweDI1NTcJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorMHhiYwkweDI1NWQJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKzB4YmQJMHgwNDM5CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorMHhiZQkweDA0MTkJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKzB4YmYJMHgyNTEwCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHhjMAkweDI1MTQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4YzEJMHgyNTM0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4YzIJMHgyNTJjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjMwkweDI1MWMJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YzQJMHgyNTAwCSNCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorMHhjNQkweDI1M2MJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjNgkweDA0M2EJI0NZUklMTElDIFNNQUxMIExFVFRFUiBLQQorMHhjNwkweDA0MWEJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisweGM4CTB4MjU1YQkjQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKzB4YzkJMHgyNTU0CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisweGNhCTB4MjU2OQkjQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorMHhjYgkweDI1NjYJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjYwkweDI1NjAJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisweGNkCTB4MjU1MAkjQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisweGNlCTB4MjU2YwkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjZgkweDAwYTQJI0NVUlJFTkNZIFNJR04KKzB4ZDAJMHgwNDNiCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKzB4ZDEJMHgwNDFiCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorMHhkMgkweDA0M2MJI0NZUklMTElDIFNNQUxMIExFVFRFUiBFTQorMHhkMwkweDA0MWMJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisweGQ0CTB4MDQzZAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisweGQ1CTB4MDQxZAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKzB4ZDYJMHgwNDNlCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgTworMHhkNwkweDA0MWUJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKzB4ZDgJMHgwNDNmCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgUEUKKzB4ZDkJMHgyNTE4CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKzB4ZGEJMHgyNTBjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKzB4ZGIJMHgyNTg4CSNGVUxMIEJMT0NLCisweGRjCTB4MjU4NAkjTE9XRVIgSEFMRiBCTE9DSworMHhkZAkweDA0MWYJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisweGRlCTB4MDQ0ZgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisweGRmCTB4MjU4MAkjVVBQRVIgSEFMRiBCTE9DSworMHhlMAkweDA0MmYJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisweGUxCTB4MDQ0MAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisweGUyCTB4MDQyMAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKzB4ZTMJMHgwNDQxCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKzB4ZTQJMHgwNDIxCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworMHhlNQkweDA0NDIJI0NZUklMTElDIFNNQUxMIExFVFRFUiBURQorMHhlNgkweDA0MjIJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisweGU3CTB4MDQ0MwkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKzB4ZTgJMHgwNDIzCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisweGU5CTB4MDQzNgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorMHhlYQkweDA0MTYJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorMHhlYgkweDA0MzIJI0NZUklMTElDIFNNQUxMIExFVFRFUiBWRQorMHhlYwkweDA0MTIJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisweGVkCTB4MDQ0YwkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorMHhlZQkweDA0MmMJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorMHhlZgkweDIxMTYJI05VTUVSTyBTSUdOCisweGYwCTB4MDBhZAkjU09GVCBIWVBIRU4KKzB4ZjEJMHgwNDRiCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorMHhmMgkweDA0MmIJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKzB4ZjMJMHgwNDM3CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKzB4ZjQJMHgwNDE3CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorMHhmNQkweDA0NDgJI0NZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKzB4ZjYJMHgwNDI4CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKzB4ZjcJMHgwNDRkCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorMHhmOAkweDA0MmQJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKzB4ZjkJMHgwNDQ5CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKzB4ZmEJMHgwNDI5CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorMHhmYgkweDA0NDcJI0NZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKzB4ZmMJMHgwNDI3CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUKKzB4ZmQJMHgwMGE3CSNTRUNUSU9OIFNJR04KKzB4ZmUJMHgyNWEwCSNCTEFDSyBTUVVBUkUKKzB4ZmYJMHgwMGEwCSNOTy1CUkVBSyBTUEFDRQorCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvY3A4NTcudHh0IGIvY29kZXBhZ2UvY3A4NTcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTUwODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDg1Ny50eHQKQEAgLTAsMCArMSwyNzUgQEAKKyMKKyMgICAgTmFtZTogICAgIGNwODU3X0RPU1R1cmtpc2ggdG8gVW5pY29kZSB0YWJsZQorIyAgICBVbmljb2RlIHZlcnNpb246IDIuMAorIyAgICBUYWJsZSB2ZXJzaW9uOiAyLjAwCisjICAgIFRhYmxlIGZvcm1hdDogIEZvcm1hdCBBCisjICAgIERhdGU6ICAgICAgICAgIDA0LzI0Lzk2CisjICAgIENvbnRhY3Q6IFNoYXduLlN0ZWVsZUBtaWNyb3NvZnQuY29tCisjICAgICAgICAgICAgICAgICAgIAorIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwODU3X0RPU1R1cmtpc2ggY29kZSAoaW4gaGV4KQorIyAgICAgICAgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIyAgICAgICAgQ29sdW1uICMzIGlzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMgICAgVGhlIGVudHJpZXMgYXJlIGluIGNwODU3X0RPU1R1cmtpc2ggb3JkZXIKKyMKKzB4MDAJMHgwMDAwCSNOVUxMCisweDAxCTB4MDAwMQkjU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJI1NUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSNFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJI0VORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSNFTlFVSVJZCisweDA2CTB4MDAwNgkjQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSNCRUxMCisweDA4CTB4MDAwOAkjQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBhCTB4MDAwYQkjTElORSBGRUVECisweDBiCTB4MDAwYgkjVkVSVElDQUwgVEFCVUxBVElPTgorMHgwYwkweDAwMGMJI0ZPUk0gRkVFRAorMHgwZAkweDAwMGQJI0NBUlJJQUdFIFJFVFVSTgorMHgwZQkweDAwMGUJI1NISUZUIE9VVAorMHgwZgkweDAwMGYJI1NISUZUIElOCisweDEwCTB4MDAxMAkjREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJI0RFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJI0RFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJI0RFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJI05FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJI0VORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSNDQU5DRUwKKzB4MTkJMHgwMDE5CSNFTkQgT0YgTUVESVVNCisweDFhCTB4MDAxYQkjU1VCU1RJVFVURQorMHgxYgkweDAwMWIJI0VTQ0FQRQorMHgxYwkweDAwMWMJI0ZJTEUgU0VQQVJBVE9SCisweDFkCTB4MDAxZAkjR1JPVVAgU0VQQVJBVE9SCisweDFlCTB4MDAxZQkjUkVDT1JEIFNFUEFSQVRPUgorMHgxZgkweDAwMWYJI1VOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjU1BBQ0UKKzB4MjEJMHgwMDIxCSNFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSNOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJI0RPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjQVBPU1RST1BIRQorMHgyOAkweDAwMjgJI0xFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSNSSUdIVCBQQVJFTlRIRVNJUworMHgyYQkweDAwMmEJI0FTVEVSSVNLCisweDJiCTB4MDAyYgkjUExVUyBTSUdOCisweDJjCTB4MDAyYwkjQ09NTUEKKzB4MmQJMHgwMDJkCSNIWVBIRU4tTUlOVVMKKzB4MmUJMHgwMDJlCSNGVUxMIFNUT1AKKzB4MmYJMHgwMDJmCSNTT0xJRFVTCisweDMwCTB4MDAzMAkjRElHSVQgWkVSTworMHgzMQkweDAwMzEJI0RJR0lUIE9ORQorMHgzMgkweDAwMzIJI0RJR0lUIFRXTworMHgzMwkweDAwMzMJI0RJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjRElHSVQgRk9VUgorMHgzNQkweDAwMzUJI0RJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSNESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSNESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJI0RJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjRElHSVQgTklORQorMHgzYQkweDAwM2EJI0NPTE9OCisweDNiCTB4MDAzYgkjU0VNSUNPTE9OCisweDNjCTB4MDAzYwkjTEVTUy1USEFOIFNJR04KKzB4M2QJMHgwMDNkCSNFUVVBTFMgU0lHTgorMHgzZQkweDAwM2UJI0dSRUFURVItVEhBTiBTSUdOCisweDNmCTB4MDAzZgkjUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJI0NPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJI0xBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJI0xBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJI0xBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NGEJMHgwMDRhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRiCTB4MDA0YgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0YwkweDAwNGMJI0xBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NGQJMHgwMDRkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRlCTB4MDA0ZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0ZgkweDAwNGYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJI0xBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJI0xBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJI0xBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVhCTB4MDA1YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1YgkweDAwNWIJI0xFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NWMJMHgwMDVjCSNSRVZFUlNFIFNPTElEVVMKKzB4NWQJMHgwMDVkCSNSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1ZQkweDAwNWUJI0NJUkNVTUZMRVggQUNDRU5UCisweDVmCTB4MDA1ZgkjTE9XIExJTkUKKzB4NjAJMHgwMDYwCSNHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSNMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJI0xBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSNMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJI0xBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSNMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJI0xBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NmEJMHgwMDZhCSNMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2YgkweDAwNmIJI0xBVElOIFNNQUxMIExFVFRFUiBLCisweDZjCTB4MDA2YwkjTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NmQJMHgwMDZkCSNMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2ZQkweDAwNmUJI0xBVElOIFNNQUxMIExFVFRFUiBOCisweDZmCTB4MDA2ZgkjTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSNMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJI0xBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSNMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJI0xBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSNMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJI0xBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSNMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3YQkweDAwN2EJI0xBVElOIFNNQUxMIExFVFRFUiBaCisweDdiCTB4MDA3YgkjTEVGVCBDVVJMWSBCUkFDS0VUCisweDdjCTB4MDA3YwkjVkVSVElDQUwgTElORQorMHg3ZAkweDAwN2QJI1JJR0hUIENVUkxZIEJSQUNLRVQKKzB4N2UJMHgwMDdlCSNUSUxERQorMHg3ZgkweDAwN2YJI0RFTEVURQorMHg4MAkweDAwYzcJI0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweDgxCTB4MDBmYwkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4ODIJMHgwMGU5CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweDgzCTB4MDBlMgkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweDg0CTB4MDBlNAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4ODUJMHgwMGUwCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweDg2CTB4MDBlNQkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisweDg3CTB4MDBlNwkjTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweDg4CTB4MDBlYQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweDg5CTB4MDBlYgkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4OGEJMHgwMGU4CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweDhiCTB4MDBlZgkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4OGMJMHgwMGVlCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4OGQJMHgwMTMxCSNMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisweDhlCTB4MDBjNAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHg4ZgkweDAwYzUJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisweDkwCTB4MDBjOQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweDkxCTB4MDBlNgkjTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKzB4OTIJMHgwMGM2CSNMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisweDkzCTB4MDBmNAkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweDk0CTB4MDBmNgkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4OTUJMHgwMGYyCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisweDk2CTB4MDBmYgkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweDk3CTB4MDBmOQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHg5OAkweDAxMzAJI0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUKKzB4OTkJMHgwMGQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweDlhCTB4MDBkYwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHg5YgkweDAwZjgJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisweDljCTB4MDBhMwkjUE9VTkQgU0lHTgorMHg5ZAkweDAwZDgJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKzB4OWUJMHgwMTVlCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorMHg5ZgkweDAxNWYJI0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorMHhhMAkweDAwZTEJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4YTEJMHgwMGVkCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweGEyCTB4MDBmMwkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhhMwkweDAwZmEJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKzB4YTQJMHgwMGYxCSNMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisweGE1CTB4MDBkMQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisweGE2CTB4MDExZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIEJSRVZFCisweGE3CTB4MDExZgkjTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRQorMHhhOAkweDAwYmYJI0lOVkVSVEVEIFFVRVNUSU9OIE1BUksKKzB4YTkJMHgwMGFlCSNSRUdJU1RFUkVEIFNJR04KKzB4YWEJMHgwMGFjCSNOT1QgU0lHTgorMHhhYgkweDAwYmQJI1ZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhhYwkweDAwYmMJI1ZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorMHhhZAkweDAwYTEJI0lOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKzB4YWUJMHgwMGFiCSNMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhhZgkweDAwYmIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhiMAkweDI1OTEJI0xJR0hUIFNIQURFCisweGIxCTB4MjU5MgkjTUVESVVNIFNIQURFCisweGIyCTB4MjU5MwkjREFSSyBTSEFERQorMHhiMwkweDI1MDIJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorMHhiNAkweDI1MjQJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorMHhiNQkweDAwYzEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhiNgkweDAwYzIJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweGI3CTB4MDBjMAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweGI4CTB4MDBhOQkjQ09QWVJJR0hUIFNJR04KKzB4YjkJMHgyNTYzCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisweGJhCTB4MjU1MQkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorMHhiYgkweDI1NTcJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorMHhiYwkweDI1NWQJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKzB4YmQJMHgwMGEyCSNDRU5UIFNJR04KKzB4YmUJMHgwMGE1CSNZRU4gU0lHTgorMHhiZgkweDI1MTAJI0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisweGMwCTB4MjUxNAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorMHhjMQkweDI1MzQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorMHhjMgkweDI1MmMJI0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisweGMzCTB4MjUxYwkjQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjNAkweDI1MDAJI0JPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisweGM1CTB4MjUzYwkjQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisweGM2CTB4MDBlMwkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhjNwkweDAwYzMJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhjOAkweDI1NWEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisweGM5CTB4MjU1NAkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorMHhjYQkweDI1NjkJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKzB4Y2IJMHgyNTY2CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4Y2MJMHgyNTYwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjZAkweDI1NTAJI0JPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorMHhjZQkweDI1NmMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4Y2YJMHgwMGE0CSNDVVJSRU5DWSBTSUdOCisweGQwCTB4MDBiYQkjTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisweGQxCTB4MDBhYQkjRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKzB4ZDIJMHgwMGNhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHhkMwkweDAwY2IJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4ZDQJMHgwMGM4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKzB4ZDUJCSNVTkRFRklORUQKKzB4ZDYJMHgwMGNkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4ZDcJMHgwMGNlCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorMHhkOAkweDAwY2YJI0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4ZDkJMHgyNTE4CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKzB4ZGEJMHgyNTBjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKzB4ZGIJMHgyNTg4CSNGVUxMIEJMT0NLCisweGRjCTB4MjU4NAkjTE9XRVIgSEFMRiBCTE9DSworMHhkZAkweDAwYTYJI0JST0tFTiBCQVIKKzB4ZGUJMHgwMGNjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4ZGYJMHgyNTgwCSNVUFBFUiBIQUxGIEJMT0NLCisweGUwCTB4MDBkMwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweGUxCTB4MDBkZgkjTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKzB4ZTIJMHgwMGQ0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorMHhlMwkweDAwZDIJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorMHhlNAkweDAwZjUJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKzB4ZTUJMHgwMGQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKzB4ZTYJMHgwMGI1CSNNSUNSTyBTSUdOCisweGU3CQkjVU5ERUZJTkVECisweGU4CTB4MDBkNwkjTVVMVElQTElDQVRJT04gU0lHTgorMHhlOQkweDAwZGEJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhlYQkweDAwZGIJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweGViCTB4MDBkOQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisweGVjCTB4MDBlYwkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorMHhlZAkweDAwZmYJI0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisweGVlCTB4MDBhZgkjTUFDUk9OCisweGVmCTB4MDBiNAkjQUNVVEUgQUNDRU5UCisweGYwCTB4MDBhZAkjU09GVCBIWVBIRU4KKzB4ZjEJMHgwMGIxCSNQTFVTLU1JTlVTIFNJR04KKzB4ZjIJCSNVTkRFRklORUQKKzB4ZjMJMHgwMGJlCSNWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKzB4ZjQJMHgwMGI2CSNQSUxDUk9XIFNJR04KKzB4ZjUJMHgwMGE3CSNTRUNUSU9OIFNJR04KKzB4ZjYJMHgwMGY3CSNESVZJU0lPTiBTSUdOCisweGY3CTB4MDBiOAkjQ0VESUxMQQorMHhmOAkweDAwYjAJI0RFR1JFRSBTSUdOCisweGY5CTB4MDBhOAkjRElBRVJFU0lTCisweGZhCTB4MDBiNwkjTUlERExFIERPVAorMHhmYgkweDAwYjkJI1NVUEVSU0NSSVBUIE9ORQorMHhmYwkweDAwYjMJI1NVUEVSU0NSSVBUIFRIUkVFCisweGZkCTB4MDBiMgkjU1VQRVJTQ1JJUFQgVFdPCisweGZlCTB4MjVhMAkjQkxBQ0sgU1FVQVJFCisweGZmCTB4MDBhMAkjTk8tQlJFQUsgU1BBQ0UKKworGgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2NwODYwLnR4dCBiL2NvZGVwYWdlL2NwODYwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGU5Mzc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3A4NjAudHh0CkBAIC0wLDAgKzEsMjc1IEBACisjCisjICAgIE5hbWU6ICAgICBjcDg2MF9ET1NQb3J0dWd1ZXNlIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMAorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8yNC85NgorIyAgICBDb250YWN0OiBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIyAgICAgICAgICAgICAgICAgICAKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDg2MF9ET1NQb3J0dWd1ZXNlIGNvZGUgKGluIGhleCkKKyMgICAgICAgIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMgICAgICAgIENvbHVtbiAjMyBpcyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjICAgIFRoZSBlbnRyaWVzIGFyZSBpbiBjcDg2MF9ET1NQb3J0dWd1ZXNlIG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwYQkweDAwMGEJI0xJTkUgRkVFRAorMHgwYgkweDAwMGIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MGMJMHgwMDBjCSNGT1JNIEZFRUQKKzB4MGQJMHgwMDBkCSNDQVJSSUFHRSBSRVRVUk4KKzB4MGUJMHgwMDBlCSNTSElGVCBPVVQKKzB4MGYJMHgwMDBmCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxYQkweDAwMWEJI1NVQlNUSVRVVEUKKzB4MWIJMHgwMDFiCSNFU0NBUEUKKzB4MWMJMHgwMDFjCSNGSUxFIFNFUEFSQVRPUgorMHgxZAkweDAwMWQJI0dST1VQIFNFUEFSQVRPUgorMHgxZQkweDAwMWUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MWYJMHgwMDFmCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MmEJMHgwMDJhCSNBU1RFUklTSworMHgyYgkweDAwMmIJI1BMVVMgU0lHTgorMHgyYwkweDAwMmMJI0NPTU1BCisweDJkCTB4MDAyZAkjSFlQSEVOLU1JTlVTCisweDJlCTB4MDAyZQkjRlVMTCBTVE9QCisweDJmCTB4MDAyZgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M2EJMHgwMDNhCSNDT0xPTgorMHgzYgkweDAwM2IJI1NFTUlDT0xPTgorMHgzYwkweDAwM2MJI0xFU1MtVEhBTiBTSUdOCisweDNkCTB4MDAzZAkjRVFVQUxTIFNJR04KKzB4M2UJMHgwMDNlCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzZgkweDAwM2YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRhCTB4MDA0YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0YgkweDAwNGIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NGMJMHgwMDRjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRkCTB4MDA0ZAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0ZQkweDAwNGUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NGYJMHgwMDRmCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1YQkweDAwNWEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NWIJMHgwMDViCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVjCTB4MDA1YwkjUkVWRVJTRSBTT0xJRFVTCisweDVkCTB4MDA1ZAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NWUJMHgwMDVlCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1ZgkweDAwNWYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZhCTB4MDA2YQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NmIJMHgwMDZiCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2YwkweDAwNmMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZkCTB4MDA2ZAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NmUJMHgwMDZlCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2ZgkweDAwNmYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N2EJMHgwMDdhCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3YgkweDAwN2IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3YwkweDAwN2MJI1ZFUlRJQ0FMIExJTkUKKzB4N2QJMHgwMDdkCSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdlCTB4MDA3ZQkjVElMREUKKzB4N2YJMHgwMDdmCSNERUxFVEUKKzB4ODAJMHgwMGM3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHg4MQkweDAwZmMJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweDgyCTB4MDBlOQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHg4MwkweDAwZTIJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHg4NAkweDAwZTMJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKzB4ODUJMHgwMGUwCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweDg2CTB4MDBjMQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisweDg3CTB4MDBlNwkjTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweDg4CTB4MDBlYQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweDg5CTB4MDBjYQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKzB4OGEJMHgwMGU4CSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweDhiCTB4MDBjZAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweDhjCTB4MDBkNAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4OGQJMHgwMGVjCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisweDhlCTB4MDBjMwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisweDhmCTB4MDBjMgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4OTAJMHgwMGM5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4OTEJMHgwMGMwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4OTIJMHgwMGM4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKzB4OTMJMHgwMGY0CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4OTQJMHgwMGY1CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisweDk1CTB4MDBmMgkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorMHg5NgkweDAwZGEJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHg5NwkweDAwZjkJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4OTgJMHgwMGNjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4OTkJMHgwMGQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKzB4OWEJMHgwMGRjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweDliCTB4MDBhMgkjQ0VOVCBTSUdOCisweDljCTB4MDBhMwkjUE9VTkQgU0lHTgorMHg5ZAkweDAwZDkJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHg5ZQkweDIwYTcJI1BFU0VUQSBTSUdOCisweDlmCTB4MDBkMwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweGEwCTB4MDBlMQkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhhMQkweDAwZWQJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4YTIJMHgwMGYzCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweGEzCTB4MDBmYQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhhNAkweDAwZjEJI0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKzB4YTUJMHgwMGQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKzB4YTYJMHgwMGFhCSNGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorMHhhNwkweDAwYmEJI01BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorMHhhOAkweDAwYmYJI0lOVkVSVEVEIFFVRVNUSU9OIE1BUksKKzB4YTkJMHgwMGQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4YWEJMHgwMGFjCSNOT1QgU0lHTgorMHhhYgkweDAwYmQJI1ZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhhYwkweDAwYmMJI1ZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorMHhhZAkweDAwYTEJI0lOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKzB4YWUJMHgwMGFiCSNMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhhZgkweDAwYmIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhiMAkweDI1OTEJI0xJR0hUIFNIQURFCisweGIxCTB4MjU5MgkjTUVESVVNIFNIQURFCisweGIyCTB4MjU5MwkjREFSSyBTSEFERQorMHhiMwkweDI1MDIJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorMHhiNAkweDI1MjQJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorMHhiNQkweDI1NjEJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGI2CTB4MjU2MgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YjcJMHgyNTU2CSNCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGI4CTB4MjU1NQkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiOQkweDI1NjMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKzB4YmEJMHgyNTUxCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisweGJiCTB4MjU1NwkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisweGJjCTB4MjU1ZAkjQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorMHhiZAkweDI1NWMJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGJlCTB4MjU1YgkjQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKzB4YmYJMHgyNTEwCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHhjMAkweDI1MTQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4YzEJMHgyNTM0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4YzIJMHgyNTJjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjMwkweDI1MWMJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YzQJMHgyNTAwCSNCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorMHhjNQkweDI1M2MJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjNgkweDI1NWUJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhjNwkweDI1NWYJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhjOAkweDI1NWEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisweGM5CTB4MjU1NAkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorMHhjYQkweDI1NjkJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKzB4Y2IJMHgyNTY2CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4Y2MJMHgyNTYwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjZAkweDI1NTAJI0JPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorMHhjZQkweDI1NmMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4Y2YJMHgyNTY3CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMAkweDI1NjgJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGQxCTB4MjU2NAkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMgkweDI1NjUJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDMJMHgyNTU5CSNCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4ZDQJMHgyNTU4CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4ZDUJMHgyNTUyCSNCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhkNgkweDI1NTMJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGQ3CTB4MjU2YgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDgJMHgyNTZhCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkOQkweDI1MTgJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorMHhkYQkweDI1MGMJI0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorMHhkYgkweDI1ODgJI0ZVTEwgQkxPQ0sKKzB4ZGMJMHgyNTg0CSNMT1dFUiBIQUxGIEJMT0NLCisweGRkCTB4MjU4YwkjTEVGVCBIQUxGIEJMT0NLCisweGRlCTB4MjU5MAkjUklHSFQgSEFMRiBCTE9DSworMHhkZgkweDI1ODAJI1VQUEVSIEhBTEYgQkxPQ0sKKzB4ZTAJMHgwM2IxCSNHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKzB4ZTEJMHgwMGRmCSNMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworMHhlMgkweDAzOTMJI0dSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisweGUzCTB4MDNjMAkjR1JFRUsgU01BTEwgTEVUVEVSIFBJCisweGU0CTB4MDNhMwkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKzB4ZTUJMHgwM2MzCSNHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKzB4ZTYJMHgwMGI1CSNNSUNSTyBTSUdOCisweGU3CTB4MDNjNAkjR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorMHhlOAkweDAzYTYJI0dSRUVLIENBUElUQUwgTEVUVEVSIFBISQorMHhlOQkweDAzOTgJI0dSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisweGVhCTB4MDNhOQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKzB4ZWIJMHgwM2I0CSNHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKzB4ZWMJMHgyMjFlCSNJTkZJTklUWQorMHhlZAkweDAzYzYJI0dSRUVLIFNNQUxMIExFVFRFUiBQSEkKKzB4ZWUJMHgwM2I1CSNHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorMHhlZgkweDIyMjkJI0lOVEVSU0VDVElPTgorMHhmMAkweDIyNjEJI0lERU5USUNBTCBUTworMHhmMQkweDAwYjEJI1BMVVMtTUlOVVMgU0lHTgorMHhmMgkweDIyNjUJI0dSRUFURVItVEhBTiBPUiBFUVVBTCBUTworMHhmMwkweDIyNjQJI0xFU1MtVEhBTiBPUiBFUVVBTCBUTworMHhmNAkweDIzMjAJI1RPUCBIQUxGIElOVEVHUkFMCisweGY1CTB4MjMyMQkjQk9UVE9NIEhBTEYgSU5URUdSQUwKKzB4ZjYJMHgwMGY3CSNESVZJU0lPTiBTSUdOCisweGY3CTB4MjI0OAkjQUxNT1NUIEVRVUFMIFRPCisweGY4CTB4MDBiMAkjREVHUkVFIFNJR04KKzB4ZjkJMHgyMjE5CSNCVUxMRVQgT1BFUkFUT1IKKzB4ZmEJMHgwMGI3CSNNSURETEUgRE9UCisweGZiCTB4MjIxYQkjU1FVQVJFIFJPT1QKKzB4ZmMJMHgyMDdmCSNTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorMHhmZAkweDAwYjIJI1NVUEVSU0NSSVBUIFRXTworMHhmZQkweDI1YTAJI0JMQUNLIFNRVUFSRQorMHhmZgkweDAwYTAJI05PLUJSRUFLIFNQQUNFCisKKxoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDg2MS50eHQgYi9jb2RlcGFnZS9jcDg2MS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzYjBiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVwYWdlL2NwODYxLnR4dApAQCAtMCwwICsxLDI3NSBAQAorIworIyAgICBOYW1lOiAgICAgY3A4NjFfRE9TSWNlbGFuZGljIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMAorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8yNC85NgorIyAgICBDb250YWN0OiBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIyAgICAgICAgICAgICAgICAgICAKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDg2MV9ET1NJY2VsYW5kaWMgY29kZSAoaW4gaGV4KQorIyAgICAgICAgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIyAgICAgICAgQ29sdW1uICMzIGlzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMgICAgVGhlIGVudHJpZXMgYXJlIGluIGNwODYxX0RPU0ljZWxhbmRpYyBvcmRlcgorIworMHgwMAkweDAwMDAJI05VTEwKKzB4MDEJMHgwMDAxCSNTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJI0VORCBPRiBURVhUCisweDA0CTB4MDAwNAkjRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJI0VOUVVJUlkKKzB4MDYJMHgwMDA2CSNBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJI0JFTEwKKzB4MDgJMHgwMDA4CSNCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSNIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MGEJMHgwMDBhCSNMSU5FIEZFRUQKKzB4MGIJMHgwMDBiCSNWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBjCTB4MDAwYwkjRk9STSBGRUVECisweDBkCTB4MDAwZAkjQ0FSUklBR0UgUkVUVVJOCisweDBlCTB4MDAwZQkjU0hJRlQgT1VUCisweDBmCTB4MDAwZgkjU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSNEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSNERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSNTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJI0NBTkNFTAorMHgxOQkweDAwMTkJI0VORCBPRiBNRURJVU0KKzB4MWEJMHgwMDFhCSNTVUJTVElUVVRFCisweDFiCTB4MDAxYgkjRVNDQVBFCisweDFjCTB4MDAxYwkjRklMRSBTRVBBUkFUT1IKKzB4MWQJMHgwMDFkCSNHUk9VUCBTRVBBUkFUT1IKKzB4MWUJMHgwMDFlCSNSRUNPUkQgU0VQQVJBVE9SCisweDFmCTB4MDAxZgkjVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSNTUEFDRQorMHgyMQkweDAwMjEJI0VYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSNRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJI05VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSNQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSNBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSNBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJI1JJR0hUIFBBUkVOVEhFU0lTCisweDJhCTB4MDAyYQkjQVNURVJJU0sKKzB4MmIJMHgwMDJiCSNQTFVTIFNJR04KKzB4MmMJMHgwMDJjCSNDT01NQQorMHgyZAkweDAwMmQJI0hZUEhFTi1NSU5VUworMHgyZQkweDAwMmUJI0ZVTEwgU1RPUAorMHgyZgkweDAwMmYJI1NPTElEVVMKKzB4MzAJMHgwMDMwCSNESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjRElHSVQgT05FCisweDMyCTB4MDAzMgkjRElHSVQgVFdPCisweDMzCTB4MDAzMwkjRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSNESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjRElHSVQgRklWRQorMHgzNgkweDAwMzYJI0RJR0lUIFNJWAorMHgzNwkweDAwMzcJI0RJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSNESUdJVCBOSU5FCisweDNhCTB4MDAzYQkjQ09MT04KKzB4M2IJMHgwMDNiCSNTRU1JQ09MT04KKzB4M2MJMHgwMDNjCSNMRVNTLVRIQU4gU0lHTgorMHgzZAkweDAwM2QJI0VRVUFMUyBTSUdOCisweDNlCTB4MDAzZQkjR1JFQVRFUi1USEFOIFNJR04KKzB4M2YJMHgwMDNmCSNRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJI0xBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJI0xBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0YQkweDAwNGEJI0xBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NGIJMHgwMDRiCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRjCTB4MDA0YwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0ZAkweDAwNGQJI0xBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NGUJMHgwMDRlCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRmCTB4MDA0ZgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJI0xBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJI0xBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJI0xBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJI0xBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NWEJMHgwMDVhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDViCTB4MDA1YgkjTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1YwkweDAwNWMJI1JFVkVSU0UgU09MSURVUworMHg1ZAkweDAwNWQJI1JJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVlCTB4MDA1ZQkjQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NWYJMHgwMDVmCSNMT1cgTElORQorMHg2MAkweDAwNjAJI0dSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJI0xBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSNMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJI0xBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSNMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJI0xBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSNMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2YQkweDAwNmEJI0xBVElOIFNNQUxMIExFVFRFUiBKCisweDZiCTB4MDA2YgkjTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NmMJMHgwMDZjCSNMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2ZAkweDAwNmQJI0xBVElOIFNNQUxMIExFVFRFUiBNCisweDZlCTB4MDA2ZQkjTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NmYJMHgwMDZmCSNMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJI0xBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSNMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJI0xBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSNMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJI0xBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSNMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJI0xBVElOIFNNQUxMIExFVFRFUiBZCisweDdhCTB4MDA3YQkjTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N2IJMHgwMDdiCSNMRUZUIENVUkxZIEJSQUNLRVQKKzB4N2MJMHgwMDdjCSNWRVJUSUNBTCBMSU5FCisweDdkCTB4MDA3ZAkjUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3ZQkweDAwN2UJI1RJTERFCisweDdmCTB4MDA3ZgkjREVMRVRFCisweDgwCTB4MDBjNwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4ODEJMHgwMGZjCSNMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHg4MgkweDAwZTkJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4ODMJMHgwMGUyCSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4ODQJMHgwMGU0CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHg4NQkweDAwZTAJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4ODYJMHgwMGU1CSNMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4ODcJMHgwMGU3CSNMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4ODgJMHgwMGVhCSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKzB4ODkJMHgwMGViCSNMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworMHg4YQkweDAwZTgJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKzB4OGIJMHgwMGQwCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKzB4OGMJMHgwMGYwCSNMQVRJTiBTTUFMTCBMRVRURVIgRVRICisweDhkCTB4MDBkZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4KKzB4OGUJMHgwMGM0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweDhmCTB4MDBjNQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4OTAJMHgwMGM5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4OTEJMHgwMGU2CSNMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorMHg5MgkweDAwYzYJI0xBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKzB4OTMJMHgwMGY0CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4OTQJMHgwMGY2CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHg5NQkweDAwZmUJI0xBVElOIFNNQUxMIExFVFRFUiBUSE9STgorMHg5NgkweDAwZmIJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHg5NwkweDAwZGQJI0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorMHg5OAkweDAwZmQJI0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKzB4OTkJMHgwMGQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweDlhCTB4MDBkYwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHg5YgkweDAwZjgJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisweDljCTB4MDBhMwkjUE9VTkQgU0lHTgorMHg5ZAkweDAwZDgJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKzB4OWUJMHgyMGE3CSNQRVNFVEEgU0lHTgorMHg5ZgkweDAxOTIJI0xBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworMHhhMAkweDAwZTEJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4YTEJMHgwMGVkCSNMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweGEyCTB4MDBmMwkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhhMwkweDAwZmEJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKzB4YTQJMHgwMGMxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4YTUJMHgwMGNkCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4YTYJMHgwMGQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4YTcJMHgwMGRhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKzB4YTgJMHgwMGJmCSNJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisweGE5CTB4MjMxMAkjUkVWRVJTRUQgTk9UIFNJR04KKzB4YWEJMHgwMGFjCSNOT1QgU0lHTgorMHhhYgkweDAwYmQJI1ZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhhYwkweDAwYmMJI1ZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorMHhhZAkweDAwYTEJI0lOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKzB4YWUJMHgwMGFiCSNMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhhZgkweDAwYmIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhiMAkweDI1OTEJI0xJR0hUIFNIQURFCisweGIxCTB4MjU5MgkjTUVESVVNIFNIQURFCisweGIyCTB4MjU5MwkjREFSSyBTSEFERQorMHhiMwkweDI1MDIJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorMHhiNAkweDI1MjQJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorMHhiNQkweDI1NjEJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGI2CTB4MjU2MgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YjcJMHgyNTU2CSNCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGI4CTB4MjU1NQkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiOQkweDI1NjMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKzB4YmEJMHgyNTUxCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisweGJiCTB4MjU1NwkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisweGJjCTB4MjU1ZAkjQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorMHhiZAkweDI1NWMJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGJlCTB4MjU1YgkjQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKzB4YmYJMHgyNTEwCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHhjMAkweDI1MTQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4YzEJMHgyNTM0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4YzIJMHgyNTJjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjMwkweDI1MWMJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YzQJMHgyNTAwCSNCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorMHhjNQkweDI1M2MJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjNgkweDI1NWUJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhjNwkweDI1NWYJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhjOAkweDI1NWEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisweGM5CTB4MjU1NAkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorMHhjYQkweDI1NjkJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKzB4Y2IJMHgyNTY2CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4Y2MJMHgyNTYwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjZAkweDI1NTAJI0JPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorMHhjZQkweDI1NmMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4Y2YJMHgyNTY3CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMAkweDI1NjgJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGQxCTB4MjU2NAkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMgkweDI1NjUJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDMJMHgyNTU5CSNCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4ZDQJMHgyNTU4CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4ZDUJMHgyNTUyCSNCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhkNgkweDI1NTMJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGQ3CTB4MjU2YgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDgJMHgyNTZhCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkOQkweDI1MTgJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorMHhkYQkweDI1MGMJI0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorMHhkYgkweDI1ODgJI0ZVTEwgQkxPQ0sKKzB4ZGMJMHgyNTg0CSNMT1dFUiBIQUxGIEJMT0NLCisweGRkCTB4MjU4YwkjTEVGVCBIQUxGIEJMT0NLCisweGRlCTB4MjU5MAkjUklHSFQgSEFMRiBCTE9DSworMHhkZgkweDI1ODAJI1VQUEVSIEhBTEYgQkxPQ0sKKzB4ZTAJMHgwM2IxCSNHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKzB4ZTEJMHgwMGRmCSNMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworMHhlMgkweDAzOTMJI0dSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisweGUzCTB4MDNjMAkjR1JFRUsgU01BTEwgTEVUVEVSIFBJCisweGU0CTB4MDNhMwkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKzB4ZTUJMHgwM2MzCSNHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKzB4ZTYJMHgwMGI1CSNNSUNSTyBTSUdOCisweGU3CTB4MDNjNAkjR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorMHhlOAkweDAzYTYJI0dSRUVLIENBUElUQUwgTEVUVEVSIFBISQorMHhlOQkweDAzOTgJI0dSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisweGVhCTB4MDNhOQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKzB4ZWIJMHgwM2I0CSNHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKzB4ZWMJMHgyMjFlCSNJTkZJTklUWQorMHhlZAkweDAzYzYJI0dSRUVLIFNNQUxMIExFVFRFUiBQSEkKKzB4ZWUJMHgwM2I1CSNHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorMHhlZgkweDIyMjkJI0lOVEVSU0VDVElPTgorMHhmMAkweDIyNjEJI0lERU5USUNBTCBUTworMHhmMQkweDAwYjEJI1BMVVMtTUlOVVMgU0lHTgorMHhmMgkweDIyNjUJI0dSRUFURVItVEhBTiBPUiBFUVVBTCBUTworMHhmMwkweDIyNjQJI0xFU1MtVEhBTiBPUiBFUVVBTCBUTworMHhmNAkweDIzMjAJI1RPUCBIQUxGIElOVEVHUkFMCisweGY1CTB4MjMyMQkjQk9UVE9NIEhBTEYgSU5URUdSQUwKKzB4ZjYJMHgwMGY3CSNESVZJU0lPTiBTSUdOCisweGY3CTB4MjI0OAkjQUxNT1NUIEVRVUFMIFRPCisweGY4CTB4MDBiMAkjREVHUkVFIFNJR04KKzB4ZjkJMHgyMjE5CSNCVUxMRVQgT1BFUkFUT1IKKzB4ZmEJMHgwMGI3CSNNSURETEUgRE9UCisweGZiCTB4MjIxYQkjU1FVQVJFIFJPT1QKKzB4ZmMJMHgyMDdmCSNTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorMHhmZAkweDAwYjIJI1NVUEVSU0NSSVBUIFRXTworMHhmZQkweDI1YTAJI0JMQUNLIFNRVUFSRQorMHhmZgkweDAwYTAJI05PLUJSRUFLIFNQQUNFCisKKxoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDg2Mi50eHQgYi9jb2RlcGFnZS9jcDg2Mi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzNTQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVwYWdlL2NwODYyLnR4dApAQCAtMCwwICsxLDI3NSBAQAorIworIyAgICBOYW1lOiAgICAgY3A4NjJfRE9TSGVicmV3IHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMAorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8yNC85NgorIyAgICBDb250YWN0OiBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIyAgICAgICAgICAgICAgICAgICAKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDg2Ml9ET1NIZWJyZXcgY29kZSAoaW4gaGV4KQorIyAgICAgICAgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIyAgICAgICAgQ29sdW1uICMzIGlzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMgICAgVGhlIGVudHJpZXMgYXJlIGluIGNwODYyX0RPU0hlYnJldyBvcmRlcgorIworMHgwMAkweDAwMDAJI05VTEwKKzB4MDEJMHgwMDAxCSNTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJI0VORCBPRiBURVhUCisweDA0CTB4MDAwNAkjRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJI0VOUVVJUlkKKzB4MDYJMHgwMDA2CSNBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJI0JFTEwKKzB4MDgJMHgwMDA4CSNCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSNIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MGEJMHgwMDBhCSNMSU5FIEZFRUQKKzB4MGIJMHgwMDBiCSNWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBjCTB4MDAwYwkjRk9STSBGRUVECisweDBkCTB4MDAwZAkjQ0FSUklBR0UgUkVUVVJOCisweDBlCTB4MDAwZQkjU0hJRlQgT1VUCisweDBmCTB4MDAwZgkjU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSNEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSNERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSNTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJI0NBTkNFTAorMHgxOQkweDAwMTkJI0VORCBPRiBNRURJVU0KKzB4MWEJMHgwMDFhCSNTVUJTVElUVVRFCisweDFiCTB4MDAxYgkjRVNDQVBFCisweDFjCTB4MDAxYwkjRklMRSBTRVBBUkFUT1IKKzB4MWQJMHgwMDFkCSNHUk9VUCBTRVBBUkFUT1IKKzB4MWUJMHgwMDFlCSNSRUNPUkQgU0VQQVJBVE9SCisweDFmCTB4MDAxZgkjVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSNTUEFDRQorMHgyMQkweDAwMjEJI0VYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSNRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJI05VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSNQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSNBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSNBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJI1JJR0hUIFBBUkVOVEhFU0lTCisweDJhCTB4MDAyYQkjQVNURVJJU0sKKzB4MmIJMHgwMDJiCSNQTFVTIFNJR04KKzB4MmMJMHgwMDJjCSNDT01NQQorMHgyZAkweDAwMmQJI0hZUEhFTi1NSU5VUworMHgyZQkweDAwMmUJI0ZVTEwgU1RPUAorMHgyZgkweDAwMmYJI1NPTElEVVMKKzB4MzAJMHgwMDMwCSNESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjRElHSVQgT05FCisweDMyCTB4MDAzMgkjRElHSVQgVFdPCisweDMzCTB4MDAzMwkjRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSNESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjRElHSVQgRklWRQorMHgzNgkweDAwMzYJI0RJR0lUIFNJWAorMHgzNwkweDAwMzcJI0RJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSNESUdJVCBOSU5FCisweDNhCTB4MDAzYQkjQ09MT04KKzB4M2IJMHgwMDNiCSNTRU1JQ09MT04KKzB4M2MJMHgwMDNjCSNMRVNTLVRIQU4gU0lHTgorMHgzZAkweDAwM2QJI0VRVUFMUyBTSUdOCisweDNlCTB4MDAzZQkjR1JFQVRFUi1USEFOIFNJR04KKzB4M2YJMHgwMDNmCSNRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJI0xBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJI0xBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0YQkweDAwNGEJI0xBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NGIJMHgwMDRiCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRjCTB4MDA0YwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0ZAkweDAwNGQJI0xBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NGUJMHgwMDRlCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRmCTB4MDA0ZgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJI0xBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJI0xBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJI0xBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJI0xBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NWEJMHgwMDVhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDViCTB4MDA1YgkjTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1YwkweDAwNWMJI1JFVkVSU0UgU09MSURVUworMHg1ZAkweDAwNWQJI1JJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVlCTB4MDA1ZQkjQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NWYJMHgwMDVmCSNMT1cgTElORQorMHg2MAkweDAwNjAJI0dSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJI0xBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSNMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJI0xBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSNMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJI0xBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSNMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2YQkweDAwNmEJI0xBVElOIFNNQUxMIExFVFRFUiBKCisweDZiCTB4MDA2YgkjTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NmMJMHgwMDZjCSNMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2ZAkweDAwNmQJI0xBVElOIFNNQUxMIExFVFRFUiBNCisweDZlCTB4MDA2ZQkjTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NmYJMHgwMDZmCSNMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJI0xBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSNMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJI0xBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSNMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJI0xBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSNMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJI0xBVElOIFNNQUxMIExFVFRFUiBZCisweDdhCTB4MDA3YQkjTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N2IJMHgwMDdiCSNMRUZUIENVUkxZIEJSQUNLRVQKKzB4N2MJMHgwMDdjCSNWRVJUSUNBTCBMSU5FCisweDdkCTB4MDA3ZAkjUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3ZQkweDAwN2UJI1RJTERFCisweDdmCTB4MDA3ZgkjREVMRVRFCisweDgwCTB4MDVkMAkjSEVCUkVXIExFVFRFUiBBTEVGCisweDgxCTB4MDVkMQkjSEVCUkVXIExFVFRFUiBCRVQKKzB4ODIJMHgwNWQyCSNIRUJSRVcgTEVUVEVSIEdJTUVMCisweDgzCTB4MDVkMwkjSEVCUkVXIExFVFRFUiBEQUxFVAorMHg4NAkweDA1ZDQJI0hFQlJFVyBMRVRURVIgSEUKKzB4ODUJMHgwNWQ1CSNIRUJSRVcgTEVUVEVSIFZBVgorMHg4NgkweDA1ZDYJI0hFQlJFVyBMRVRURVIgWkFZSU4KKzB4ODcJMHgwNWQ3CSNIRUJSRVcgTEVUVEVSIEhFVAorMHg4OAkweDA1ZDgJI0hFQlJFVyBMRVRURVIgVEVUCisweDg5CTB4MDVkOQkjSEVCUkVXIExFVFRFUiBZT0QKKzB4OGEJMHgwNWRhCSNIRUJSRVcgTEVUVEVSIEZJTkFMIEtBRgorMHg4YgkweDA1ZGIJI0hFQlJFVyBMRVRURVIgS0FGCisweDhjCTB4MDVkYwkjSEVCUkVXIExFVFRFUiBMQU1FRAorMHg4ZAkweDA1ZGQJI0hFQlJFVyBMRVRURVIgRklOQUwgTUVNCisweDhlCTB4MDVkZQkjSEVCUkVXIExFVFRFUiBNRU0KKzB4OGYJMHgwNWRmCSNIRUJSRVcgTEVUVEVSIEZJTkFMIE5VTgorMHg5MAkweDA1ZTAJI0hFQlJFVyBMRVRURVIgTlVOCisweDkxCTB4MDVlMQkjSEVCUkVXIExFVFRFUiBTQU1FS0gKKzB4OTIJMHgwNWUyCSNIRUJSRVcgTEVUVEVSIEFZSU4KKzB4OTMJMHgwNWUzCSNIRUJSRVcgTEVUVEVSIEZJTkFMIFBFCisweDk0CTB4MDVlNAkjSEVCUkVXIExFVFRFUiBQRQorMHg5NQkweDA1ZTUJI0hFQlJFVyBMRVRURVIgRklOQUwgVFNBREkKKzB4OTYJMHgwNWU2CSNIRUJSRVcgTEVUVEVSIFRTQURJCisweDk3CTB4MDVlNwkjSEVCUkVXIExFVFRFUiBRT0YKKzB4OTgJMHgwNWU4CSNIRUJSRVcgTEVUVEVSIFJFU0gKKzB4OTkJMHgwNWU5CSNIRUJSRVcgTEVUVEVSIFNISU4KKzB4OWEJMHgwNWVhCSNIRUJSRVcgTEVUVEVSIFRBVgorMHg5YgkweDAwYTIJI0NFTlQgU0lHTgorMHg5YwkweDAwYTMJI1BPVU5EIFNJR04KKzB4OWQJMHgwMGE1CSNZRU4gU0lHTgorMHg5ZQkweDIwYTcJI1BFU0VUQSBTSUdOCisweDlmCTB4MDE5MgkjTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisweGEwCTB4MDBlMQkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhhMQkweDAwZWQJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4YTIJMHgwMGYzCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweGEzCTB4MDBmYQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhhNAkweDAwZjEJI0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKzB4YTUJMHgwMGQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKzB4YTYJMHgwMGFhCSNGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorMHhhNwkweDAwYmEJI01BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorMHhhOAkweDAwYmYJI0lOVkVSVEVEIFFVRVNUSU9OIE1BUksKKzB4YTkJMHgyMzEwCSNSRVZFUlNFRCBOT1QgU0lHTgorMHhhYQkweDAwYWMJI05PVCBTSUdOCisweGFiCTB4MDBiZAkjVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisweGFjCTB4MDBiYwkjVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisweGFkCTB4MDBhMQkjSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworMHhhZQkweDAwYWIJI0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweGFmCTB4MDBiYgkjUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweGIwCTB4MjU5MQkjTElHSFQgU0hBREUKKzB4YjEJMHgyNTkyCSNNRURJVU0gU0hBREUKKzB4YjIJMHgyNTkzCSNEQVJLIFNIQURFCisweGIzCTB4MjUwMgkjQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisweGI0CTB4MjUyNAkjQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisweGI1CTB4MjU2MQkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKzB4YjYJMHgyNTYyCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorMHhiNwkweDI1NTYJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YjgJMHgyNTU1CSNCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGI5CTB4MjU2MwkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorMHhiYQkweDI1NTEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKzB4YmIJMHgyNTU3CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKzB4YmMJMHgyNTVkCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisweGJkCTB4MjU1YwkjQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YmUJMHgyNTViCSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiZgkweDI1MTAJI0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisweGMwCTB4MjUxNAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorMHhjMQkweDI1MzQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorMHhjMgkweDI1MmMJI0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisweGMzCTB4MjUxYwkjQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjNAkweDI1MDAJI0JPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisweGM1CTB4MjUzYwkjQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisweGM2CTB4MjU1ZQkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisweGM3CTB4MjU1ZgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGM4CTB4MjU1YQkjQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKzB4YzkJMHgyNTU0CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisweGNhCTB4MjU2OQkjQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorMHhjYgkweDI1NjYJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjYwkweDI1NjAJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisweGNkCTB4MjU1MAkjQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisweGNlCTB4MjU2YwkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjZgkweDI1NjcJI0JPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisweGQwCTB4MjU2OAkjQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDEJMHgyNTY0CSNCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisweGQyCTB4MjU2NQkjQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorMHhkMwkweDI1NTkJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhkNAkweDI1NTgJI0JPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhkNQkweDI1NTIJI0JPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisweGQ2CTB4MjU1MwkjQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4ZDcJMHgyNTZiCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorMHhkOAkweDI1NmEJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisweGQ5CTB4MjUxOAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisweGRhCTB4MjUwYwkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisweGRiCTB4MjU4OAkjRlVMTCBCTE9DSworMHhkYwkweDI1ODQJI0xPV0VSIEhBTEYgQkxPQ0sKKzB4ZGQJMHgyNThjCSNMRUZUIEhBTEYgQkxPQ0sKKzB4ZGUJMHgyNTkwCSNSSUdIVCBIQUxGIEJMT0NLCisweGRmCTB4MjU4MAkjVVBQRVIgSEFMRiBCTE9DSworMHhlMAkweDAzYjEJI0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorMHhlMQkweDAwZGYJI0xBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHRVJNQU4pCisweGUyCTB4MDM5MwkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKzB4ZTMJMHgwM2MwCSNHUkVFSyBTTUFMTCBMRVRURVIgUEkKKzB4ZTQJMHgwM2EzCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorMHhlNQkweDAzYzMJI0dSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorMHhlNgkweDAwYjUJI01JQ1JPIFNJR04KKzB4ZTcJMHgwM2M0CSNHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisweGU4CTB4MDNhNgkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisweGU5CTB4MDM5OAkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKzB4ZWEJMHgwM2E5CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorMHhlYgkweDAzYjQJI0dSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorMHhlYwkweDIyMWUJI0lORklOSVRZCisweGVkCTB4MDNjNgkjR1JFRUsgU01BTEwgTEVUVEVSIFBISQorMHhlZQkweDAzYjUJI0dSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisweGVmCTB4MjIyOQkjSU5URVJTRUNUSU9OCisweGYwCTB4MjI2MQkjSURFTlRJQ0FMIFRPCisweGYxCTB4MDBiMQkjUExVUy1NSU5VUyBTSUdOCisweGYyCTB4MjI2NQkjR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisweGYzCTB4MjI2NAkjTEVTUy1USEFOIE9SIEVRVUFMIFRPCisweGY0CTB4MjMyMAkjVE9QIEhBTEYgSU5URUdSQUwKKzB4ZjUJMHgyMzIxCSNCT1RUT00gSEFMRiBJTlRFR1JBTAorMHhmNgkweDAwZjcJI0RJVklTSU9OIFNJR04KKzB4ZjcJMHgyMjQ4CSNBTE1PU1QgRVFVQUwgVE8KKzB4ZjgJMHgwMGIwCSNERUdSRUUgU0lHTgorMHhmOQkweDIyMTkJI0JVTExFVCBPUEVSQVRPUgorMHhmYQkweDAwYjcJI01JRERMRSBET1QKKzB4ZmIJMHgyMjFhCSNTUVVBUkUgUk9PVAorMHhmYwkweDIwN2YJI1NVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisweGZkCTB4MDBiMgkjU1VQRVJTQ1JJUFQgVFdPCisweGZlCTB4MjVhMAkjQkxBQ0sgU1FVQVJFCisweGZmCTB4MDBhMAkjTk8tQlJFQUsgU1BBQ0UKKworGgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2NwODYzLnR4dCBiL2NvZGVwYWdlL2NwODYzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWYzZThiCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3A4NjMudHh0CkBAIC0wLDAgKzEsMjc1IEBACisjCisjICAgIE5hbWU6ICAgICBjcDg2M19ET1NDYW5hZGFGIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMAorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8yNC85NgorIyAgICBDb250YWN0OiBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIyAgICAgICAgICAgICAgICAgICAKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDg2M19ET1NDYW5hZGFGIGNvZGUgKGluIGhleCkKKyMgICAgICAgIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMgICAgICAgIENvbHVtbiAjMyBpcyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjICAgIFRoZSBlbnRyaWVzIGFyZSBpbiBjcDg2M19ET1NDYW5hZGFGIG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwYQkweDAwMGEJI0xJTkUgRkVFRAorMHgwYgkweDAwMGIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MGMJMHgwMDBjCSNGT1JNIEZFRUQKKzB4MGQJMHgwMDBkCSNDQVJSSUFHRSBSRVRVUk4KKzB4MGUJMHgwMDBlCSNTSElGVCBPVVQKKzB4MGYJMHgwMDBmCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxYQkweDAwMWEJI1NVQlNUSVRVVEUKKzB4MWIJMHgwMDFiCSNFU0NBUEUKKzB4MWMJMHgwMDFjCSNGSUxFIFNFUEFSQVRPUgorMHgxZAkweDAwMWQJI0dST1VQIFNFUEFSQVRPUgorMHgxZQkweDAwMWUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MWYJMHgwMDFmCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MmEJMHgwMDJhCSNBU1RFUklTSworMHgyYgkweDAwMmIJI1BMVVMgU0lHTgorMHgyYwkweDAwMmMJI0NPTU1BCisweDJkCTB4MDAyZAkjSFlQSEVOLU1JTlVTCisweDJlCTB4MDAyZQkjRlVMTCBTVE9QCisweDJmCTB4MDAyZgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M2EJMHgwMDNhCSNDT0xPTgorMHgzYgkweDAwM2IJI1NFTUlDT0xPTgorMHgzYwkweDAwM2MJI0xFU1MtVEhBTiBTSUdOCisweDNkCTB4MDAzZAkjRVFVQUxTIFNJR04KKzB4M2UJMHgwMDNlCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzZgkweDAwM2YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRhCTB4MDA0YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0YgkweDAwNGIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NGMJMHgwMDRjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRkCTB4MDA0ZAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0ZQkweDAwNGUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NGYJMHgwMDRmCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1YQkweDAwNWEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NWIJMHgwMDViCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVjCTB4MDA1YwkjUkVWRVJTRSBTT0xJRFVTCisweDVkCTB4MDA1ZAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NWUJMHgwMDVlCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1ZgkweDAwNWYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZhCTB4MDA2YQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NmIJMHgwMDZiCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2YwkweDAwNmMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZkCTB4MDA2ZAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NmUJMHgwMDZlCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2ZgkweDAwNmYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N2EJMHgwMDdhCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3YgkweDAwN2IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3YwkweDAwN2MJI1ZFUlRJQ0FMIExJTkUKKzB4N2QJMHgwMDdkCSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdlCTB4MDA3ZQkjVElMREUKKzB4N2YJMHgwMDdmCSNERUxFVEUKKzB4ODAJMHgwMGM3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHg4MQkweDAwZmMJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweDgyCTB4MDBlOQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHg4MwkweDAwZTIJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHg4NAkweDAwYzIJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweDg1CTB4MDBlMAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorMHg4NgkweDAwYjYJI1BJTENST1cgU0lHTgorMHg4NwkweDAwZTcJI0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHg4OAkweDAwZWEJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHg4OQkweDAwZWIJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweDhhCTB4MDBlOAkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorMHg4YgkweDAwZWYJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisweDhjCTB4MDBlZQkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisweDhkCTB4MjAxNwkjRE9VQkxFIExPVyBMSU5FCisweDhlCTB4MDBjMAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweDhmCTB4MDBhNwkjU0VDVElPTiBTSUdOCisweDkwCTB4MDBjOQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweDkxCTB4MDBjOAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweDkyCTB4MDBjYQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKzB4OTMJMHgwMGY0CSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4OTQJMHgwMGNiCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweDk1CTB4MDBjZgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworMHg5NgkweDAwZmIJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHg5NwkweDAwZjkJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4OTgJMHgwMGE0CSNDVVJSRU5DWSBTSUdOCisweDk5CTB4MDBkNAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4OWEJMHgwMGRjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweDliCTB4MDBhMgkjQ0VOVCBTSUdOCisweDljCTB4MDBhMwkjUE9VTkQgU0lHTgorMHg5ZAkweDAwZDkJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHg5ZQkweDAwZGIJI0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweDlmCTB4MDE5MgkjTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisweGEwCTB4MDBhNgkjQlJPS0VOIEJBUgorMHhhMQkweDAwYjQJI0FDVVRFIEFDQ0VOVAorMHhhMgkweDAwZjMJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4YTMJMHgwMGZhCSNMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweGE0CTB4MDBhOAkjRElBRVJFU0lTCisweGE1CTB4MDBiOAkjQ0VESUxMQQorMHhhNgkweDAwYjMJI1NVUEVSU0NSSVBUIFRIUkVFCisweGE3CTB4MDBhZgkjTUFDUk9OCisweGE4CTB4MDBjZQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4YTkJMHgyMzEwCSNSRVZFUlNFRCBOT1QgU0lHTgorMHhhYQkweDAwYWMJI05PVCBTSUdOCisweGFiCTB4MDBiZAkjVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisweGFjCTB4MDBiYwkjVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisweGFkCTB4MDBiZQkjVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisweGFlCTB4MDBhYgkjTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4YWYJMHgwMGJiCSNSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4YjAJMHgyNTkxCSNMSUdIVCBTSEFERQorMHhiMQkweDI1OTIJI01FRElVTSBTSEFERQorMHhiMgkweDI1OTMJI0RBUksgU0hBREUKKzB4YjMJMHgyNTAyCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKzB4YjQJMHgyNTI0CSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKzB4YjUJMHgyNTYxCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiNgkweDI1NjIJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGI3CTB4MjU1NgkjQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorMHhiOAkweDI1NTUJI0JPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKzB4YjkJMHgyNTYzCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisweGJhCTB4MjU1MQkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorMHhiYgkweDI1NTcJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorMHhiYwkweDI1NWQJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKzB4YmQJMHgyNTVjCSNCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorMHhiZQkweDI1NWIJI0JPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGJmCTB4MjUxMAkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKzB4YzAJMHgyNTE0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisweGMxCTB4MjUzNAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisweGMyCTB4MjUyYwkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKzB4YzMJMHgyNTFjCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisweGM0CTB4MjUwMAkjQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKzB4YzUJMHgyNTNjCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4YzYJMHgyNTVlCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4YzcJMHgyNTVmCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4YzgJMHgyNTVhCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorMHhjOQkweDI1NTQJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKzB4Y2EJMHgyNTY5CSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisweGNiCTB4MjU2NgkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisweGNjCTB4MjU2MAkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKzB4Y2QJMHgyNTUwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKzB4Y2UJMHgyNTZjCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisweGNmCTB4MjU2NwkjQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKzB4ZDAJMHgyNTY4CSNCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorMHhkMQkweDI1NjQJI0JPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKzB4ZDIJMHgyNTY1CSNCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGQzCTB4MjU1OQkjQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGQ0CTB4MjU1OAkjQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisweGQ1CTB4MjU1MgkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4ZDYJMHgyNTUzCSNCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhkNwkweDI1NmIJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGQ4CTB4MjU2YQkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKzB4ZDkJMHgyNTE4CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKzB4ZGEJMHgyNTBjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKzB4ZGIJMHgyNTg4CSNGVUxMIEJMT0NLCisweGRjCTB4MjU4NAkjTE9XRVIgSEFMRiBCTE9DSworMHhkZAkweDI1OGMJI0xFRlQgSEFMRiBCTE9DSworMHhkZQkweDI1OTAJI1JJR0hUIEhBTEYgQkxPQ0sKKzB4ZGYJMHgyNTgwCSNVUFBFUiBIQUxGIEJMT0NLCisweGUwCTB4MDNiMQkjR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisweGUxCTB4MDBkZgkjTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKzB4ZTIJMHgwMzkzCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorMHhlMwkweDAzYzAJI0dSRUVLIFNNQUxMIExFVFRFUiBQSQorMHhlNAkweDAzYTMJI0dSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisweGU1CTB4MDNjMwkjR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisweGU2CTB4MDBiNQkjTUlDUk8gU0lHTgorMHhlNwkweDAzYzQJI0dSRUVLIFNNQUxMIExFVFRFUiBUQVUKKzB4ZTgJMHgwM2E2CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKzB4ZTkJMHgwMzk4CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorMHhlYQkweDAzYTkJI0dSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisweGViCTB4MDNiNAkjR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisweGVjCTB4MjIxZQkjSU5GSU5JVFkKKzB4ZWQJMHgwM2M2CSNHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisweGVlCTB4MDNiNQkjR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKzB4ZWYJMHgyMjI5CSNJTlRFUlNFQ1RJT04KKzB4ZjAJMHgyMjYxCSNJREVOVElDQUwgVE8KKzB4ZjEJMHgwMGIxCSNQTFVTLU1JTlVTIFNJR04KKzB4ZjIJMHgyMjY1CSNHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKzB4ZjMJMHgyMjY0CSNMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKzB4ZjQJMHgyMzIwCSNUT1AgSEFMRiBJTlRFR1JBTAorMHhmNQkweDIzMjEJI0JPVFRPTSBIQUxGIElOVEVHUkFMCisweGY2CTB4MDBmNwkjRElWSVNJT04gU0lHTgorMHhmNwkweDIyNDgJI0FMTU9TVCBFUVVBTCBUTworMHhmOAkweDAwYjAJI0RFR1JFRSBTSUdOCisweGY5CTB4MjIxOQkjQlVMTEVUIE9QRVJBVE9SCisweGZhCTB4MDBiNwkjTUlERExFIERPVAorMHhmYgkweDIyMWEJI1NRVUFSRSBST09UCisweGZjCTB4MjA3ZgkjU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4ZmQJMHgwMGIyCSNTVVBFUlNDUklQVCBUV08KKzB4ZmUJMHgyNWEwCSNCTEFDSyBTUVVBUkUKKzB4ZmYJMHgwMGEwCSNOTy1CUkVBSyBTUEFDRQorCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvY3A4NjQudHh0IGIvY29kZXBhZ2UvY3A4NjQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDc5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDg2NC50eHQKQEAgLTAsMCArMSwyNzUgQEAKKyMKKyMgICAgTmFtZTogICAgIGNwODY0X0RPU0FyYWJpYyB0byBVbmljb2RlIHRhYmxlCisjICAgIFVuaWNvZGUgdmVyc2lvbjogMi4wCisjICAgIFRhYmxlIHZlcnNpb246IDIuMDAKKyMgICAgVGFibGUgZm9ybWF0OiAgRm9ybWF0IEEKKyMgICAgRGF0ZTogICAgICAgICAgMDQvMjQvOTYKKyMgICAgQ29udGFjdDogU2hhd24uU3RlZWxlQG1pY3Jvc29mdC5jb20KKyMgICAgICAgICAgICAgICAgICAgCisjICAgIEdlbmVyYWwgbm90ZXM6IG5vbmUKKyMKKyMgICAgRm9ybWF0OiBUaHJlZSB0YWItc2VwYXJhdGVkIGNvbHVtbnMKKyMgICAgICAgIENvbHVtbiAjMSBpcyB0aGUgY3A4NjRfRE9TQXJhYmljIGNvZGUgKGluIGhleCkKKyMgICAgICAgIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMgICAgICAgIENvbHVtbiAjMyBpcyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjICAgIFRoZSBlbnRyaWVzIGFyZSBpbiBjcDg2NF9ET1NBcmFiaWMgb3JkZXIKKyMKKzB4MDAJMHgwMDAwCSNOVUxMCisweDAxCTB4MDAwMQkjU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJI1NUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSNFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJI0VORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSNFTlFVSVJZCisweDA2CTB4MDAwNgkjQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSNCRUxMCisweDA4CTB4MDAwOAkjQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBhCTB4MDAwYQkjTElORSBGRUVECisweDBiCTB4MDAwYgkjVkVSVElDQUwgVEFCVUxBVElPTgorMHgwYwkweDAwMGMJI0ZPUk0gRkVFRAorMHgwZAkweDAwMGQJI0NBUlJJQUdFIFJFVFVSTgorMHgwZQkweDAwMGUJI1NISUZUIE9VVAorMHgwZgkweDAwMGYJI1NISUZUIElOCisweDEwCTB4MDAxMAkjREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJI0RFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJI0RFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJI0RFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJI05FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJI0VORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSNDQU5DRUwKKzB4MTkJMHgwMDE5CSNFTkQgT0YgTUVESVVNCisweDFhCTB4MDAxYQkjU1VCU1RJVFVURQorMHgxYgkweDAwMWIJI0VTQ0FQRQorMHgxYwkweDAwMWMJI0ZJTEUgU0VQQVJBVE9SCisweDFkCTB4MDAxZAkjR1JPVVAgU0VQQVJBVE9SCisweDFlCTB4MDAxZQkjUkVDT1JEIFNFUEFSQVRPUgorMHgxZgkweDAwMWYJI1VOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjU1BBQ0UKKzB4MjEJMHgwMDIxCSNFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSNOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJI0RPTExBUiBTSUdOCisweDI1CTB4MDY2YQkjQVJBQklDIFBFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MmEJMHgwMDJhCSNBU1RFUklTSworMHgyYgkweDAwMmIJI1BMVVMgU0lHTgorMHgyYwkweDAwMmMJI0NPTU1BCisweDJkCTB4MDAyZAkjSFlQSEVOLU1JTlVTCisweDJlCTB4MDAyZQkjRlVMTCBTVE9QCisweDJmCTB4MDAyZgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M2EJMHgwMDNhCSNDT0xPTgorMHgzYgkweDAwM2IJI1NFTUlDT0xPTgorMHgzYwkweDAwM2MJI0xFU1MtVEhBTiBTSUdOCisweDNkCTB4MDAzZAkjRVFVQUxTIFNJR04KKzB4M2UJMHgwMDNlCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzZgkweDAwM2YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRhCTB4MDA0YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0YgkweDAwNGIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NGMJMHgwMDRjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRkCTB4MDA0ZAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0ZQkweDAwNGUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NGYJMHgwMDRmCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1YQkweDAwNWEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NWIJMHgwMDViCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVjCTB4MDA1YwkjUkVWRVJTRSBTT0xJRFVTCisweDVkCTB4MDA1ZAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NWUJMHgwMDVlCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1ZgkweDAwNWYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZhCTB4MDA2YQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NmIJMHgwMDZiCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2YwkweDAwNmMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZkCTB4MDA2ZAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NmUJMHgwMDZlCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2ZgkweDAwNmYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N2EJMHgwMDdhCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3YgkweDAwN2IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3YwkweDAwN2MJI1ZFUlRJQ0FMIExJTkUKKzB4N2QJMHgwMDdkCSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdlCTB4MDA3ZQkjVElMREUKKzB4N2YJMHgwMDdmCSNERUxFVEUKKzB4ODAJMHgwMGIwCSNERUdSRUUgU0lHTgorMHg4MQkweDAwYjcJI01JRERMRSBET1QKKzB4ODIJMHgyMjE5CSNCVUxMRVQgT1BFUkFUT1IKKzB4ODMJMHgyMjFhCSNTUVVBUkUgUk9PVAorMHg4NAkweDI1OTIJI01FRElVTSBTSEFERQorMHg4NQkweDI1MDAJI0ZPUk1TIExJR0hUIEhPUklaT05UQUwKKzB4ODYJMHgyNTAyCSNGT1JNUyBMSUdIVCBWRVJUSUNBTAorMHg4NwkweDI1M2MJI0ZPUk1TIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisweDg4CTB4MjUyNAkjRk9STVMgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKzB4ODkJMHgyNTJjCSNGT1JNUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisweDhhCTB4MjUxYwkjRk9STVMgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisweDhiCTB4MjUzNAkjRk9STVMgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4OGMJMHgyNTEwCSNGT1JNUyBMSUdIVCBET1dOIEFORCBMRUZUCisweDhkCTB4MjUwYwkjRk9STVMgTElHSFQgRE9XTiBBTkQgUklHSFQKKzB4OGUJMHgyNTE0CSNGT1JNUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4OGYJMHgyNTE4CSNGT1JNUyBMSUdIVCBVUCBBTkQgTEVGVAorMHg5MAkweDAzYjIJI0dSRUVLIFNNQUxMIEJFVEEKKzB4OTEJMHgyMjFlCSNJTkZJTklUWQorMHg5MgkweDAzYzYJI0dSRUVLIFNNQUxMIFBISQorMHg5MwkweDAwYjEJI1BMVVMtT1ItTUlOVVMgU0lHTgorMHg5NAkweDAwYmQJI0ZSQUNUSU9OIDEvMgorMHg5NQkweDAwYmMJI0ZSQUNUSU9OIDEvNAorMHg5NgkweDIyNDgJI0FMTU9TVCBFUVVBTCBUTworMHg5NwkweDAwYWIJI0xFRlQgUE9JTlRJTkcgR1VJTExFTUVUCisweDk4CTB4MDBiYgkjUklHSFQgUE9JTlRJTkcgR1VJTExFTUVUCisweDk5CTB4ZmVmNwkjQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisweDlhCTB4ZmVmOAkjQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBGSU5BTCBGT1JNCisweDliCQkjVU5ERUZJTkVECisweDljCQkjVU5ERUZJTkVECisweDlkCTB4ZmVmYgkjQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgSVNPTEFURUQgRk9STQorMHg5ZQkweGZlZmMJI0FSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIEZJTkFMIEZPUk0KKzB4OWYJCSNVTkRFRklORUQKKzB4YTAJMHgwMGEwCSNOT04tQlJFQUtJTkcgU1BBQ0UKKzB4YTEJMHgwMGFkCSNTT0ZUIEhZUEhFTgorMHhhMgkweGZlODIJI0FSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFIEZJTkFMIEZPUk0KKzB4YTMJMHgwMGEzCSNQT1VORCBTSUdOCisweGE0CTB4MDBhNAkjQ1VSUkVOQ1kgU0lHTgorMHhhNQkweGZlODQJI0FSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEFCT1ZFIEZJTkFMIEZPUk0KKzB4YTYJCSNVTkRFRklORUQKKzB4YTcJCSNVTkRFRklORUQKKzB4YTgJMHhmZThlCSNBUkFCSUMgTEVUVEVSIEFMRUYgRklOQUwgRk9STQorMHhhOQkweGZlOGYJI0FSQUJJQyBMRVRURVIgQkVIIElTT0xBVEVEIEZPUk0KKzB4YWEJMHhmZTk1CSNBUkFCSUMgTEVUVEVSIFRFSCBJU09MQVRFRCBGT1JNCisweGFiCTB4ZmU5OQkjQVJBQklDIExFVFRFUiBUSEVIIElTT0xBVEVEIEZPUk0KKzB4YWMJMHgwNjBjCSNBUkFCSUMgQ09NTUEKKzB4YWQJMHhmZTlkCSNBUkFCSUMgTEVUVEVSIEpFRU0gSVNPTEFURUQgRk9STQorMHhhZQkweGZlYTEJI0FSQUJJQyBMRVRURVIgSEFIIElTT0xBVEVEIEZPUk0KKzB4YWYJMHhmZWE1CSNBUkFCSUMgTEVUVEVSIEtIQUggSVNPTEFURUQgRk9STQorMHhiMAkweDA2NjAJI0FSQUJJQy1JTkRJQyBESUdJVCBaRVJPCisweGIxCTB4MDY2MQkjQVJBQklDLUlORElDIERJR0lUIE9ORQorMHhiMgkweDA2NjIJI0FSQUJJQy1JTkRJQyBESUdJVCBUV08KKzB4YjMJMHgwNjYzCSNBUkFCSUMtSU5ESUMgRElHSVQgVEhSRUUKKzB4YjQJMHgwNjY0CSNBUkFCSUMtSU5ESUMgRElHSVQgRk9VUgorMHhiNQkweDA2NjUJI0FSQUJJQy1JTkRJQyBESUdJVCBGSVZFCisweGI2CTB4MDY2NgkjQVJBQklDLUlORElDIERJR0lUIFNJWAorMHhiNwkweDA2NjcJI0FSQUJJQy1JTkRJQyBESUdJVCBTRVZFTgorMHhiOAkweDA2NjgJI0FSQUJJQy1JTkRJQyBESUdJVCBFSUdIVAorMHhiOQkweDA2NjkJI0FSQUJJQy1JTkRJQyBESUdJVCBOSU5FCisweGJhCTB4ZmVkMQkjQVJBQklDIExFVFRFUiBGRUggSVNPTEFURUQgRk9STQorMHhiYgkweDA2MWIJI0FSQUJJQyBTRU1JQ09MT04KKzB4YmMJMHhmZWIxCSNBUkFCSUMgTEVUVEVSIFNFRU4gSVNPTEFURUQgRk9STQorMHhiZAkweGZlYjUJI0FSQUJJQyBMRVRURVIgU0hFRU4gSVNPTEFURUQgRk9STQorMHhiZQkweGZlYjkJI0FSQUJJQyBMRVRURVIgU0FEIElTT0xBVEVEIEZPUk0KKzB4YmYJMHgwNjFmCSNBUkFCSUMgUVVFU1RJT04gTUFSSworMHhjMAkweDAwYTIJI0NFTlQgU0lHTgorMHhjMQkweGZlODAJI0FSQUJJQyBMRVRURVIgSEFNWkEgSVNPTEFURUQgRk9STQorMHhjMgkweGZlODEJI0FSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKzB4YzMJMHhmZTgzCSNBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisweGM0CTB4ZmU4NQkjQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisweGM1CTB4ZmVjYQkjQVJBQklDIExFVFRFUiBBSU4gRklOQUwgRk9STQorMHhjNgkweGZlOGIJI0FSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkUgSU5JVElBTCBGT1JNCisweGM3CTB4ZmU4ZAkjQVJBQklDIExFVFRFUiBBTEVGIElTT0xBVEVEIEZPUk0KKzB4YzgJMHhmZTkxCSNBUkFCSUMgTEVUVEVSIEJFSCBJTklUSUFMIEZPUk0KKzB4YzkJMHhmZTkzCSNBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBIElTT0xBVEVEIEZPUk0KKzB4Y2EJMHhmZTk3CSNBUkFCSUMgTEVUVEVSIFRFSCBJTklUSUFMIEZPUk0KKzB4Y2IJMHhmZTliCSNBUkFCSUMgTEVUVEVSIFRIRUggSU5JVElBTCBGT1JNCisweGNjCTB4ZmU5ZgkjQVJBQklDIExFVFRFUiBKRUVNIElOSVRJQUwgRk9STQorMHhjZAkweGZlYTMJI0FSQUJJQyBMRVRURVIgSEFIIElOSVRJQUwgRk9STQorMHhjZQkweGZlYTcJI0FSQUJJQyBMRVRURVIgS0hBSCBJTklUSUFMIEZPUk0KKzB4Y2YJMHhmZWE5CSNBUkFCSUMgTEVUVEVSIERBTCBJU09MQVRFRCBGT1JNCisweGQwCTB4ZmVhYgkjQVJBQklDIExFVFRFUiBUSEFMIElTT0xBVEVEIEZPUk0KKzB4ZDEJMHhmZWFkCSNBUkFCSUMgTEVUVEVSIFJFSCBJU09MQVRFRCBGT1JNCisweGQyCTB4ZmVhZgkjQVJBQklDIExFVFRFUiBaQUlOIElTT0xBVEVEIEZPUk0KKzB4ZDMJMHhmZWIzCSNBUkFCSUMgTEVUVEVSIFNFRU4gSU5JVElBTCBGT1JNCisweGQ0CTB4ZmViNwkjQVJBQklDIExFVFRFUiBTSEVFTiBJTklUSUFMIEZPUk0KKzB4ZDUJMHhmZWJiCSNBUkFCSUMgTEVUVEVSIFNBRCBJTklUSUFMIEZPUk0KKzB4ZDYJMHhmZWJmCSNBUkFCSUMgTEVUVEVSIERBRCBJTklUSUFMIEZPUk0KKzB4ZDcJMHhmZWMxCSNBUkFCSUMgTEVUVEVSIFRBSCBJU09MQVRFRCBGT1JNCisweGQ4CTB4ZmVjNQkjQVJBQklDIExFVFRFUiBaQUggSVNPTEFURUQgRk9STQorMHhkOQkweGZlY2IJI0FSQUJJQyBMRVRURVIgQUlOIElOSVRJQUwgRk9STQorMHhkYQkweGZlY2YJI0FSQUJJQyBMRVRURVIgR0hBSU4gSU5JVElBTCBGT1JNCisweGRiCTB4MDBhNgkjQlJPS0VOIFZFUlRJQ0FMIEJBUgorMHhkYwkweDAwYWMJI05PVCBTSUdOCisweGRkCTB4MDBmNwkjRElWSVNJT04gU0lHTgorMHhkZQkweDAwZDcJI01VTFRJUExJQ0FUSU9OIFNJR04KKzB4ZGYJMHhmZWM5CSNBUkFCSUMgTEVUVEVSIEFJTiBJU09MQVRFRCBGT1JNCisweGUwCTB4MDY0MAkjQVJBQklDIFRBVFdFRUwKKzB4ZTEJMHhmZWQzCSNBUkFCSUMgTEVUVEVSIEZFSCBJTklUSUFMIEZPUk0KKzB4ZTIJMHhmZWQ3CSNBUkFCSUMgTEVUVEVSIFFBRiBJTklUSUFMIEZPUk0KKzB4ZTMJMHhmZWRiCSNBUkFCSUMgTEVUVEVSIEtBRiBJTklUSUFMIEZPUk0KKzB4ZTQJMHhmZWRmCSNBUkFCSUMgTEVUVEVSIExBTSBJTklUSUFMIEZPUk0KKzB4ZTUJMHhmZWUzCSNBUkFCSUMgTEVUVEVSIE1FRU0gSU5JVElBTCBGT1JNCisweGU2CTB4ZmVlNwkjQVJBQklDIExFVFRFUiBOT09OIElOSVRJQUwgRk9STQorMHhlNwkweGZlZWIJI0FSQUJJQyBMRVRURVIgSEVIIElOSVRJQUwgRk9STQorMHhlOAkweGZlZWQJI0FSQUJJQyBMRVRURVIgV0FXIElTT0xBVEVEIEZPUk0KKzB4ZTkJMHhmZWVmCSNBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQSBJU09MQVRFRCBGT1JNCisweGVhCTB4ZmVmMwkjQVJBQklDIExFVFRFUiBZRUggSU5JVElBTCBGT1JNCisweGViCTB4ZmViZAkjQVJBQklDIExFVFRFUiBEQUQgSVNPTEFURUQgRk9STQorMHhlYwkweGZlY2MJI0FSQUJJQyBMRVRURVIgQUlOIE1FRElBTCBGT1JNCisweGVkCTB4ZmVjZQkjQVJBQklDIExFVFRFUiBHSEFJTiBGSU5BTCBGT1JNCisweGVlCTB4ZmVjZAkjQVJBQklDIExFVFRFUiBHSEFJTiBJU09MQVRFRCBGT1JNCisweGVmCTB4ZmVlMQkjQVJBQklDIExFVFRFUiBNRUVNIElTT0xBVEVEIEZPUk0KKzB4ZjAJMHhmZTdkCSNBUkFCSUMgU0hBRERBIE1FRElBTCBGT1JNCisweGYxCTB4MDY1MQkjQVJBQklDIFNIQUREQUgKKzB4ZjIJMHhmZWU1CSNBUkFCSUMgTEVUVEVSIE5PT04gSVNPTEFURUQgRk9STQorMHhmMwkweGZlZTkJI0FSQUJJQyBMRVRURVIgSEVIIElTT0xBVEVEIEZPUk0KKzB4ZjQJMHhmZWVjCSNBUkFCSUMgTEVUVEVSIEhFSCBNRURJQUwgRk9STQorMHhmNQkweGZlZjAJI0FSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBIEZJTkFMIEZPUk0KKzB4ZjYJMHhmZWYyCSNBUkFCSUMgTEVUVEVSIFlFSCBGSU5BTCBGT1JNCisweGY3CTB4ZmVkMAkjQVJBQklDIExFVFRFUiBHSEFJTiBNRURJQUwgRk9STQorMHhmOAkweGZlZDUJI0FSQUJJQyBMRVRURVIgUUFGIElTT0xBVEVEIEZPUk0KKzB4ZjkJMHhmZWY1CSNBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIE1BRERBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKzB4ZmEJMHhmZWY2CSNBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIE1BRERBIEFCT1ZFIEZJTkFMIEZPUk0KKzB4ZmIJMHhmZWRkCSNBUkFCSUMgTEVUVEVSIExBTSBJU09MQVRFRCBGT1JNCisweGZjCTB4ZmVkOQkjQVJBQklDIExFVFRFUiBLQUYgSVNPTEFURUQgRk9STQorMHhmZAkweGZlZjEJI0FSQUJJQyBMRVRURVIgWUVIIElTT0xBVEVEIEZPUk0KKzB4ZmUJMHgyNWEwCSNCTEFDSyBTUVVBUkUKKzB4ZmYJCSNVTkRFRklORUQKKworGgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2NwODY1LnR4dCBiL2NvZGVwYWdlL2NwODY1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQ3M2RhCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3A4NjUudHh0CkBAIC0wLDAgKzEsMjc1IEBACisjCisjICAgIE5hbWU6ICAgICBjcDg2NV9ET1NOb3JkaWMgdG8gVW5pY29kZSB0YWJsZQorIyAgICBVbmljb2RlIHZlcnNpb246IDIuMAorIyAgICBUYWJsZSB2ZXJzaW9uOiAyLjAwCisjICAgIFRhYmxlIGZvcm1hdDogIEZvcm1hdCBBCisjICAgIERhdGU6ICAgICAgICAgIDA0LzI0Lzk2CisjICAgIENvbnRhY3Q6IFNoYXduLlN0ZWVsZUBtaWNyb3NvZnQuY29tCisjICAgICAgICAgICAgICAgICAgIAorIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwODY1X0RPU05vcmRpYyBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3A4NjVfRE9TTm9yZGljIG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwYQkweDAwMGEJI0xJTkUgRkVFRAorMHgwYgkweDAwMGIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MGMJMHgwMDBjCSNGT1JNIEZFRUQKKzB4MGQJMHgwMDBkCSNDQVJSSUFHRSBSRVRVUk4KKzB4MGUJMHgwMDBlCSNTSElGVCBPVVQKKzB4MGYJMHgwMDBmCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxYQkweDAwMWEJI1NVQlNUSVRVVEUKKzB4MWIJMHgwMDFiCSNFU0NBUEUKKzB4MWMJMHgwMDFjCSNGSUxFIFNFUEFSQVRPUgorMHgxZAkweDAwMWQJI0dST1VQIFNFUEFSQVRPUgorMHgxZQkweDAwMWUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MWYJMHgwMDFmCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MmEJMHgwMDJhCSNBU1RFUklTSworMHgyYgkweDAwMmIJI1BMVVMgU0lHTgorMHgyYwkweDAwMmMJI0NPTU1BCisweDJkCTB4MDAyZAkjSFlQSEVOLU1JTlVTCisweDJlCTB4MDAyZQkjRlVMTCBTVE9QCisweDJmCTB4MDAyZgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M2EJMHgwMDNhCSNDT0xPTgorMHgzYgkweDAwM2IJI1NFTUlDT0xPTgorMHgzYwkweDAwM2MJI0xFU1MtVEhBTiBTSUdOCisweDNkCTB4MDAzZAkjRVFVQUxTIFNJR04KKzB4M2UJMHgwMDNlCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzZgkweDAwM2YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRhCTB4MDA0YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0YgkweDAwNGIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NGMJMHgwMDRjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRkCTB4MDA0ZAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0ZQkweDAwNGUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NGYJMHgwMDRmCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1YQkweDAwNWEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NWIJMHgwMDViCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVjCTB4MDA1YwkjUkVWRVJTRSBTT0xJRFVTCisweDVkCTB4MDA1ZAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NWUJMHgwMDVlCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1ZgkweDAwNWYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZhCTB4MDA2YQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NmIJMHgwMDZiCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2YwkweDAwNmMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZkCTB4MDA2ZAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NmUJMHgwMDZlCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2ZgkweDAwNmYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N2EJMHgwMDdhCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3YgkweDAwN2IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3YwkweDAwN2MJI1ZFUlRJQ0FMIExJTkUKKzB4N2QJMHgwMDdkCSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdlCTB4MDA3ZQkjVElMREUKKzB4N2YJMHgwMDdmCSNERUxFVEUKKzB4ODAJMHgwMGM3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHg4MQkweDAwZmMJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweDgyCTB4MDBlOQkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHg4MwkweDAwZTIJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHg4NAkweDAwZTQJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweDg1CTB4MDBlMAkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorMHg4NgkweDAwZTUJI0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorMHg4NwkweDAwZTcJI0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHg4OAkweDAwZWEJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHg4OQkweDAwZWIJI0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweDhhCTB4MDBlOAkjTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorMHg4YgkweDAwZWYJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisweDhjCTB4MDBlZQkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisweDhkCTB4MDBlYwkjTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorMHg4ZQkweDAwYzQJI0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4OGYJMHgwMGM1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorMHg5MAkweDAwYzkJI0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHg5MQkweDAwZTYJI0xBVElOIFNNQUxMIExJR0FUVVJFIEFFCisweDkyCTB4MDBjNgkjTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorMHg5MwkweDAwZjQJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorMHg5NAkweDAwZjYJI0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweDk1CTB4MDBmMgkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorMHg5NgkweDAwZmIJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHg5NwkweDAwZjkJI0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4OTgJMHgwMGZmCSNMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworMHg5OQkweDAwZDYJI0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4OWEJMHgwMGRjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweDliCTB4MDBmOAkjTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKzB4OWMJMHgwMGEzCSNQT1VORCBTSUdOCisweDlkCTB4MDBkOAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHg5ZQkweDIwYTcJI1BFU0VUQSBTSUdOCisweDlmCTB4MDE5MgkjTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisweGEwCTB4MDBlMQkjTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhhMQkweDAwZWQJI0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4YTIJMHgwMGYzCSNMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweGEzCTB4MDBmYQkjTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhhNAkweDAwZjEJI0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKzB4YTUJMHgwMGQxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKzB4YTYJMHgwMGFhCSNGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorMHhhNwkweDAwYmEJI01BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorMHhhOAkweDAwYmYJI0lOVkVSVEVEIFFVRVNUSU9OIE1BUksKKzB4YTkJMHgyMzEwCSNSRVZFUlNFRCBOT1QgU0lHTgorMHhhYQkweDAwYWMJI05PVCBTSUdOCisweGFiCTB4MDBiZAkjVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisweGFjCTB4MDBiYwkjVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisweGFkCTB4MDBhMQkjSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworMHhhZQkweDAwYWIJI0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweGFmCTB4MDBhNAkjQ1VSUkVOQ1kgU0lHTgorMHhiMAkweDI1OTEJI0xJR0hUIFNIQURFCisweGIxCTB4MjU5MgkjTUVESVVNIFNIQURFCisweGIyCTB4MjU5MwkjREFSSyBTSEFERQorMHhiMwkweDI1MDIJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorMHhiNAkweDI1MjQJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorMHhiNQkweDI1NjEJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGI2CTB4MjU2MgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YjcJMHgyNTU2CSNCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGI4CTB4MjU1NQkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiOQkweDI1NjMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKzB4YmEJMHgyNTUxCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisweGJiCTB4MjU1NwkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisweGJjCTB4MjU1ZAkjQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorMHhiZAkweDI1NWMJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGJlCTB4MjU1YgkjQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKzB4YmYJMHgyNTEwCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHhjMAkweDI1MTQJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4YzEJMHgyNTM0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4YzIJMHgyNTJjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorMHhjMwkweDI1MWMJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YzQJMHgyNTAwCSNCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorMHhjNQkweDI1M2MJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorMHhjNgkweDI1NWUJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhjNwkweDI1NWYJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhjOAkweDI1NWEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisweGM5CTB4MjU1NAkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorMHhjYQkweDI1NjkJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKzB4Y2IJMHgyNTY2CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4Y2MJMHgyNTYwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjZAkweDI1NTAJI0JPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorMHhjZQkweDI1NmMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4Y2YJMHgyNTY3CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMAkweDI1NjgJI0JPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGQxCTB4MjU2NAkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkMgkweDI1NjUJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDMJMHgyNTU5CSNCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4ZDQJMHgyNTU4CSNCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4ZDUJMHgyNTUyCSNCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorMHhkNgkweDI1NTMJI0JPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGQ3CTB4MjU2YgkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4ZDgJMHgyNTZhCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhkOQkweDI1MTgJI0JPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorMHhkYQkweDI1MGMJI0JPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorMHhkYgkweDI1ODgJI0ZVTEwgQkxPQ0sKKzB4ZGMJMHgyNTg0CSNMT1dFUiBIQUxGIEJMT0NLCisweGRkCTB4MjU4YwkjTEVGVCBIQUxGIEJMT0NLCisweGRlCTB4MjU5MAkjUklHSFQgSEFMRiBCTE9DSworMHhkZgkweDI1ODAJI1VQUEVSIEhBTEYgQkxPQ0sKKzB4ZTAJMHgwM2IxCSNHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKzB4ZTEJMHgwMGRmCSNMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworMHhlMgkweDAzOTMJI0dSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisweGUzCTB4MDNjMAkjR1JFRUsgU01BTEwgTEVUVEVSIFBJCisweGU0CTB4MDNhMwkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKzB4ZTUJMHgwM2MzCSNHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKzB4ZTYJMHgwMGI1CSNNSUNSTyBTSUdOCisweGU3CTB4MDNjNAkjR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorMHhlOAkweDAzYTYJI0dSRUVLIENBUElUQUwgTEVUVEVSIFBISQorMHhlOQkweDAzOTgJI0dSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisweGVhCTB4MDNhOQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKzB4ZWIJMHgwM2I0CSNHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKzB4ZWMJMHgyMjFlCSNJTkZJTklUWQorMHhlZAkweDAzYzYJI0dSRUVLIFNNQUxMIExFVFRFUiBQSEkKKzB4ZWUJMHgwM2I1CSNHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorMHhlZgkweDIyMjkJI0lOVEVSU0VDVElPTgorMHhmMAkweDIyNjEJI0lERU5USUNBTCBUTworMHhmMQkweDAwYjEJI1BMVVMtTUlOVVMgU0lHTgorMHhmMgkweDIyNjUJI0dSRUFURVItVEhBTiBPUiBFUVVBTCBUTworMHhmMwkweDIyNjQJI0xFU1MtVEhBTiBPUiBFUVVBTCBUTworMHhmNAkweDIzMjAJI1RPUCBIQUxGIElOVEVHUkFMCisweGY1CTB4MjMyMQkjQk9UVE9NIEhBTEYgSU5URUdSQUwKKzB4ZjYJMHgwMGY3CSNESVZJU0lPTiBTSUdOCisweGY3CTB4MjI0OAkjQUxNT1NUIEVRVUFMIFRPCisweGY4CTB4MDBiMAkjREVHUkVFIFNJR04KKzB4ZjkJMHgyMjE5CSNCVUxMRVQgT1BFUkFUT1IKKzB4ZmEJMHgwMGI3CSNNSURETEUgRE9UCisweGZiCTB4MjIxYQkjU1FVQVJFIFJPT1QKKzB4ZmMJMHgyMDdmCSNTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorMHhmZAkweDAwYjIJI1NVUEVSU0NSSVBUIFRXTworMHhmZQkweDI1YTAJI0JMQUNLIFNRVUFSRQorMHhmZgkweDAwYTAJI05PLUJSRUFLIFNQQUNFCisKKxoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcDg2Ni50eHQgYi9jb2RlcGFnZS9jcDg2Ni50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyMTNhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVwYWdlL2NwODY2LnR4dApAQCAtMCwwICsxLDI3NSBAQAorIworIyAgICBOYW1lOiAgICAgY3A4NjZfRE9TQ3lyaWxsaWNSdXNzaWFuIHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMAorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwNC8yNC85NgorIyAgICBDb250YWN0OiBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIyAgICAgICAgICAgICAgICAgICAKKyMgICAgR2VuZXJhbCBub3Rlczogbm9uZQorIworIyAgICBGb3JtYXQ6IFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIyAgICAgICAgQ29sdW1uICMxIGlzIHRoZSBjcDg2Nl9ET1NDeXJpbGxpY1J1c3NpYW4gY29kZSAoaW4gaGV4KQorIyAgICAgICAgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIyAgICAgICAgQ29sdW1uICMzIGlzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMgICAgVGhlIGVudHJpZXMgYXJlIGluIGNwODY2X0RPU0N5cmlsbGljUnVzc2lhbiBvcmRlcgorIworMHgwMAkweDAwMDAJI05VTEwKKzB4MDEJMHgwMDAxCSNTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJI0VORCBPRiBURVhUCisweDA0CTB4MDAwNAkjRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJI0VOUVVJUlkKKzB4MDYJMHgwMDA2CSNBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJI0JFTEwKKzB4MDgJMHgwMDA4CSNCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSNIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MGEJMHgwMDBhCSNMSU5FIEZFRUQKKzB4MGIJMHgwMDBiCSNWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBjCTB4MDAwYwkjRk9STSBGRUVECisweDBkCTB4MDAwZAkjQ0FSUklBR0UgUkVUVVJOCisweDBlCTB4MDAwZQkjU0hJRlQgT1VUCisweDBmCTB4MDAwZgkjU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSNEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSNERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSNTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJI0NBTkNFTAorMHgxOQkweDAwMTkJI0VORCBPRiBNRURJVU0KKzB4MWEJMHgwMDFhCSNTVUJTVElUVVRFCisweDFiCTB4MDAxYgkjRVNDQVBFCisweDFjCTB4MDAxYwkjRklMRSBTRVBBUkFUT1IKKzB4MWQJMHgwMDFkCSNHUk9VUCBTRVBBUkFUT1IKKzB4MWUJMHgwMDFlCSNSRUNPUkQgU0VQQVJBVE9SCisweDFmCTB4MDAxZgkjVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSNTUEFDRQorMHgyMQkweDAwMjEJI0VYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSNRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJI05VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSNQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSNBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSNBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJI1JJR0hUIFBBUkVOVEhFU0lTCisweDJhCTB4MDAyYQkjQVNURVJJU0sKKzB4MmIJMHgwMDJiCSNQTFVTIFNJR04KKzB4MmMJMHgwMDJjCSNDT01NQQorMHgyZAkweDAwMmQJI0hZUEhFTi1NSU5VUworMHgyZQkweDAwMmUJI0ZVTEwgU1RPUAorMHgyZgkweDAwMmYJI1NPTElEVVMKKzB4MzAJMHgwMDMwCSNESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjRElHSVQgT05FCisweDMyCTB4MDAzMgkjRElHSVQgVFdPCisweDMzCTB4MDAzMwkjRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSNESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjRElHSVQgRklWRQorMHgzNgkweDAwMzYJI0RJR0lUIFNJWAorMHgzNwkweDAwMzcJI0RJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSNESUdJVCBOSU5FCisweDNhCTB4MDAzYQkjQ09MT04KKzB4M2IJMHgwMDNiCSNTRU1JQ09MT04KKzB4M2MJMHgwMDNjCSNMRVNTLVRIQU4gU0lHTgorMHgzZAkweDAwM2QJI0VRVUFMUyBTSUdOCisweDNlCTB4MDAzZQkjR1JFQVRFUi1USEFOIFNJR04KKzB4M2YJMHgwMDNmCSNRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJI0xBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJI0xBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0YQkweDAwNGEJI0xBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NGIJMHgwMDRiCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRjCTB4MDA0YwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0ZAkweDAwNGQJI0xBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NGUJMHgwMDRlCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRmCTB4MDA0ZgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJI0xBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJI0xBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJI0xBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJI0xBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NWEJMHgwMDVhCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDViCTB4MDA1YgkjTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1YwkweDAwNWMJI1JFVkVSU0UgU09MSURVUworMHg1ZAkweDAwNWQJI1JJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVlCTB4MDA1ZQkjQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NWYJMHgwMDVmCSNMT1cgTElORQorMHg2MAkweDAwNjAJI0dSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJI0xBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSNMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJI0xBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSNMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJI0xBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSNMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2YQkweDAwNmEJI0xBVElOIFNNQUxMIExFVFRFUiBKCisweDZiCTB4MDA2YgkjTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NmMJMHgwMDZjCSNMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2ZAkweDAwNmQJI0xBVElOIFNNQUxMIExFVFRFUiBNCisweDZlCTB4MDA2ZQkjTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NmYJMHgwMDZmCSNMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJI0xBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSNMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJI0xBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSNMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJI0xBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSNMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJI0xBVElOIFNNQUxMIExFVFRFUiBZCisweDdhCTB4MDA3YQkjTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N2IJMHgwMDdiCSNMRUZUIENVUkxZIEJSQUNLRVQKKzB4N2MJMHgwMDdjCSNWRVJUSUNBTCBMSU5FCisweDdkCTB4MDA3ZAkjUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3ZQkweDAwN2UJI1RJTERFCisweDdmCTB4MDA3ZgkjREVMRVRFCisweDgwCTB4MDQxMAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorMHg4MQkweDA0MTEJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisweDgyCTB4MDQxMgkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKzB4ODMJMHgwNDEzCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUKKzB4ODQJMHgwNDE0CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERQorMHg4NQkweDA0MTUJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIElFCisweDg2CTB4MDQxNgkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisweDg3CTB4MDQxNwkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKzB4ODgJMHgwNDE4CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJCisweDg5CTB4MDQxOQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorMHg4YQkweDA0MWEJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisweDhiCTB4MDQxYgkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwKKzB4OGMJMHgwNDFjCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorMHg4ZAkweDA0MWQJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisweDhlCTB4MDQxZQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTworMHg4ZgkweDA0MWYJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisweDkwCTB4MDQyMAkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKzB4OTEJMHgwNDIxCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworMHg5MgkweDA0MjIJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisweDkzCTB4MDQyMwkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorMHg5NAkweDA0MjQJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEVGCisweDk1CTB4MDQyNQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKzB4OTYJMHgwNDI2CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKzB4OTcJMHgwNDI3CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUKKzB4OTgJMHgwNDI4CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKzB4OTkJMHgwNDI5CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorMHg5YQkweDA0MmEJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTgorMHg5YgkweDA0MmIJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKzB4OWMJMHgwNDJjCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKzB4OWQJMHgwNDJkCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisweDllCTB4MDQyZQkjQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKzB4OWYJMHgwNDJmCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorMHhhMAkweDA0MzAJI0NZUklMTElDIFNNQUxMIExFVFRFUiBBCisweGExCTB4MDQzMQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisweGEyCTB4MDQzMgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisweGEzCTB4MDQzMwkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorMHhhNAkweDA0MzQJI0NZUklMTElDIFNNQUxMIExFVFRFUiBERQorMHhhNQkweDA0MzUJI0NZUklMTElDIFNNQUxMIExFVFRFUiBJRQorMHhhNgkweDA0MzYJI0NZUklMTElDIFNNQUxMIExFVFRFUiBaSEUKKzB4YTcJMHgwNDM3CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKzB4YTgJMHgwNDM4CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorMHhhOQkweDA0MzkJI0NZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJCisweGFhCTB4MDQzYQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisweGFiCTB4MDQzYgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisweGFjCTB4MDQzYwkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNCisweGFkCTB4MDQzZAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisweGFlCTB4MDQzZQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKzB4YWYJMHgwNDNmCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgUEUKKzB4YjAJMHgyNTkxCSNMSUdIVCBTSEFERQorMHhiMQkweDI1OTIJI01FRElVTSBTSEFERQorMHhiMgkweDI1OTMJI0RBUksgU0hBREUKKzB4YjMJMHgyNTAyCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKzB4YjQJMHgyNTI0CSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKzB4YjUJMHgyNTYxCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiNgkweDI1NjIJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisweGI3CTB4MjU1NgkjQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorMHhiOAkweDI1NTUJI0JPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKzB4YjkJMHgyNTYzCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisweGJhCTB4MjU1MQkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorMHhiYgkweDI1NTcJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorMHhiYwkweDI1NWQJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKzB4YmQJMHgyNTVjCSNCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorMHhiZQkweDI1NWIJI0JPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGJmCTB4MjUxMAkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKzB4YzAJMHgyNTE0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisweGMxCTB4MjUzNAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisweGMyCTB4MjUyYwkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKzB4YzMJMHgyNTFjCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisweGM0CTB4MjUwMAkjQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKzB4YzUJMHgyNTNjCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4YzYJMHgyNTVlCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4YzcJMHgyNTVmCSNCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4YzgJMHgyNTVhCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorMHhjOQkweDI1NTQJI0JPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKzB4Y2EJMHgyNTY5CSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisweGNiCTB4MjU2NgkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisweGNjCTB4MjU2MAkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKzB4Y2QJMHgyNTUwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKzB4Y2UJMHgyNTZjCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisweGNmCTB4MjU2NwkjQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKzB4ZDAJMHgyNTY4CSNCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorMHhkMQkweDI1NjQJI0JPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKzB4ZDIJMHgyNTY1CSNCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGQzCTB4MjU1OQkjQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGQ0CTB4MjU1OAkjQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisweGQ1CTB4MjU1MgkjQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4ZDYJMHgyNTUzCSNCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorMHhkNwkweDI1NmIJI0JPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGQ4CTB4MjU2YQkjQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKzB4ZDkJMHgyNTE4CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKzB4ZGEJMHgyNTBjCSNCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKzB4ZGIJMHgyNTg4CSNGVUxMIEJMT0NLCisweGRjCTB4MjU4NAkjTE9XRVIgSEFMRiBCTE9DSworMHhkZAkweDI1OGMJI0xFRlQgSEFMRiBCTE9DSworMHhkZQkweDI1OTAJI1JJR0hUIEhBTEYgQkxPQ0sKKzB4ZGYJMHgyNTgwCSNVUFBFUiBIQUxGIEJMT0NLCisweGUwCTB4MDQ0MAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisweGUxCTB4MDQ0MQkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTCisweGUyCTB4MDQ0MgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisweGUzCTB4MDQ0MwkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKzB4ZTQJMHgwNDQ0CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYKKzB4ZTUJMHgwNDQ1CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKzB4ZTYJMHgwNDQ2CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisweGU3CTB4MDQ0NwkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRQorMHhlOAkweDA0NDgJI0NZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKzB4ZTkJMHgwNDQ5CSNDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKzB4ZWEJMHgwNDRhCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisweGViCTB4MDQ0YgkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKzB4ZWMJMHgwNDRjCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisweGVkCTB4MDQ0ZAkjQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEUKKzB4ZWUJMHgwNDRlCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKzB4ZWYJMHgwNDRmCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKzB4ZjAJMHgwNDAxCSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJTworMHhmMQkweDA0NTEJI0NZUklMTElDIFNNQUxMIExFVFRFUiBJTworMHhmMgkweDA0MDQJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFVLUkFJTklBTiBJRQorMHhmMwkweDA0NTQJI0NZUklMTElDIFNNQUxMIExFVFRFUiBVS1JBSU5JQU4gSUUKKzB4ZjQJMHgwNDA3CSNDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSQorMHhmNQkweDA0NTcJI0NZUklMTElDIFNNQUxMIExFVFRFUiBZSQorMHhmNgkweDA0MGUJI0NZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUKKzB4ZjcJMHgwNDVlCSNDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgVQorMHhmOAkweDAwYjAJI0RFR1JFRSBTSUdOCisweGY5CTB4MjIxOQkjQlVMTEVUIE9QRVJBVE9SCisweGZhCTB4MDBiNwkjTUlERExFIERPVAorMHhmYgkweDIyMWEJI1NRVUFSRSBST09UCisweGZjCTB4MjExNgkjTlVNRVJPIFNJR04KKzB4ZmQJMHgwMGE0CSNDVVJSRU5DWSBTSUdOCisweGZlCTB4MjVhMAkjQkxBQ0sgU1FVQVJFCisweGZmCTB4MDBhMAkjTk8tQlJFQUsgU1BBQ0UKKworGgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2NwODY5LnR4dCBiL2NvZGVwYWdlL2NwODY5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2QzZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3A4NjkudHh0CkBAIC0wLDAgKzEsMjc1IEBACisjCisjICAgIE5hbWU6ICAgICBjcDg2OV9ET1NHcmVlazIgdG8gVW5pY29kZSB0YWJsZQorIyAgICBVbmljb2RlIHZlcnNpb246IDIuMAorIyAgICBUYWJsZSB2ZXJzaW9uOiAyLjAwCisjICAgIFRhYmxlIGZvcm1hdDogIEZvcm1hdCBBCisjICAgIERhdGU6ICAgICAgICAgIDA0LzI0Lzk2CisjICAgIENvbnRhY3Q6IFNoYXduLlN0ZWVsZUBtaWNyb3NvZnQuY29tCisjICAgICAgICAgICAgICAgICAgIAorIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwODY5X0RPU0dyZWVrMiBjb2RlIChpbiBoZXgpCisjICAgICAgICBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjICAgICAgICBDb2x1bW4gIzMgaXMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIyAgICBUaGUgZW50cmllcyBhcmUgaW4gY3A4NjlfRE9TR3JlZWsyIG9yZGVyCisjCisweDAwCTB4MDAwMAkjTlVMTAorMHgwMQkweDAwMDEJI1NUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSNTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSNFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjRU5RVUlSWQorMHgwNgkweDAwMDYJI0FDS05PV0xFREdFCisweDA3CTB4MDAwNwkjQkVMTAorMHgwOAkweDAwMDgJI0JBQ0tTUEFDRQorMHgwOQkweDAwMDkJI0hPUklaT05UQUwgVEFCVUxBVElPTgorMHgwYQkweDAwMGEJI0xJTkUgRkVFRAorMHgwYgkweDAwMGIJI1ZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MGMJMHgwMDBjCSNGT1JNIEZFRUQKKzB4MGQJMHgwMDBkCSNDQVJSSUFHRSBSRVRVUk4KKzB4MGUJMHgwMDBlCSNTSElGVCBPVVQKKzB4MGYJMHgwMDBmCSNTSElGVCBJTgorMHgxMAkweDAwMTAJI0RBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSNERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSNERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSNERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJI0RFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSNORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJI1NZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSNFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjQ0FOQ0VMCisweDE5CTB4MDAxOQkjRU5EIE9GIE1FRElVTQorMHgxYQkweDAwMWEJI1NVQlNUSVRVVEUKKzB4MWIJMHgwMDFiCSNFU0NBUEUKKzB4MWMJMHgwMDFjCSNGSUxFIFNFUEFSQVRPUgorMHgxZAkweDAwMWQJI0dST1VQIFNFUEFSQVRPUgorMHgxZQkweDAwMWUJI1JFQ09SRCBTRVBBUkFUT1IKKzB4MWYJMHgwMDFmCSNVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJI1NQQUNFCisweDIxCTB4MDAyMQkjRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJI1FVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSNET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJI1BFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJI0FNUEVSU0FORAorMHgyNwkweDAwMjcJI0FQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSNMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjUklHSFQgUEFSRU5USEVTSVMKKzB4MmEJMHgwMDJhCSNBU1RFUklTSworMHgyYgkweDAwMmIJI1BMVVMgU0lHTgorMHgyYwkweDAwMmMJI0NPTU1BCisweDJkCTB4MDAyZAkjSFlQSEVOLU1JTlVTCisweDJlCTB4MDAyZQkjRlVMTCBTVE9QCisweDJmCTB4MDAyZgkjU09MSURVUworMHgzMAkweDAwMzAJI0RJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSNESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSNESUdJVCBUV08KKzB4MzMJMHgwMDMzCSNESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJI0RJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSNESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjRElHSVQgU0lYCisweDM3CTB4MDAzNwkjRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSNESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJI0RJR0lUIE5JTkUKKzB4M2EJMHgwMDNhCSNDT0xPTgorMHgzYgkweDAwM2IJI1NFTUlDT0xPTgorMHgzYwkweDAwM2MJI0xFU1MtVEhBTiBTSUdOCisweDNkCTB4MDAzZAkjRVFVQUxTIFNJR04KKzB4M2UJMHgwMDNlCSNHUkVBVEVSLVRIQU4gU0lHTgorMHgzZgkweDAwM2YJI1FVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSNDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJI0xBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJI0xBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJI0xBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRhCTB4MDA0YQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0YgkweDAwNGIJI0xBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NGMJMHgwMDRjCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRkCTB4MDA0ZAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0ZQkweDAwNGUJI0xBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NGYJMHgwMDRmCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJI0xBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJI0xBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJI0xBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1YQkweDAwNWEJI0xBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NWIJMHgwMDViCSNMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVjCTB4MDA1YwkjUkVWRVJTRSBTT0xJRFVTCisweDVkCTB4MDA1ZAkjUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NWUJMHgwMDVlCSNDSVJDVU1GTEVYIEFDQ0VOVAorMHg1ZgkweDAwNWYJI0xPVyBMSU5FCisweDYwCTB4MDA2MAkjR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSNMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJI0xBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSNMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJI0xBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSNMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJI0xBVElOIFNNQUxMIExFVFRFUiBJCisweDZhCTB4MDA2YQkjTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NmIJMHgwMDZiCSNMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2YwkweDAwNmMJI0xBVElOIFNNQUxMIExFVFRFUiBMCisweDZkCTB4MDA2ZAkjTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NmUJMHgwMDZlCSNMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2ZgkweDAwNmYJI0xBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSNMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJI0xBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSNMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJI0xBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSNMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJI0xBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N2EJMHgwMDdhCSNMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3YgkweDAwN2IJI0xFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3YwkweDAwN2MJI1ZFUlRJQ0FMIExJTkUKKzB4N2QJMHgwMDdkCSNSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdlCTB4MDA3ZQkjVElMREUKKzB4N2YJMHgwMDdmCSNERUxFVEUKKzB4ODAJCSNVTkRFRklORUQKKzB4ODEJCSNVTkRFRklORUQKKzB4ODIJCSNVTkRFRklORUQKKzB4ODMJCSNVTkRFRklORUQKKzB4ODQJCSNVTkRFRklORUQKKzB4ODUJCSNVTkRFRklORUQKKzB4ODYJMHgwMzg2CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisweDg3CQkjVU5ERUZJTkVECisweDg4CTB4MDBiNwkjTUlERExFIERPVAorMHg4OQkweDAwYWMJI05PVCBTSUdOCisweDhhCTB4MDBhNgkjQlJPS0VOIEJBUgorMHg4YgkweDIwMTgJI0xFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisweDhjCTB4MjAxOQkjUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisweDhkCTB4MDM4OAkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisweDhlCTB4MjAxNQkjSE9SSVpPTlRBTCBCQVIKKzB4OGYJMHgwMzg5CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworMHg5MAkweDAzOGEJI0dSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworMHg5MQkweDAzYWEJI0dSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKzB4OTIJMHgwMzhjCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKzB4OTMJCSNVTkRFRklORUQKKzB4OTQJCSNVTkRFRklORUQKKzB4OTUJMHgwMzhlCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKzB4OTYJMHgwM2FiCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisweDk3CTB4MDBhOQkjQ09QWVJJR0hUIFNJR04KKzB4OTgJMHgwMzhmCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisweDk5CTB4MDBiMgkjU1VQRVJTQ1JJUFQgVFdPCisweDlhCTB4MDBiMwkjU1VQRVJTQ1JJUFQgVEhSRUUKKzB4OWIJMHgwM2FjCSNHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworMHg5YwkweDAwYTMJI1BPVU5EIFNJR04KKzB4OWQJMHgwM2FkCSNHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisweDllCTB4MDNhZQkjR1JFRUsgU01BTEwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisweDlmCTB4MDNhZgkjR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworMHhhMAkweDAzY2EJI0dSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisweGExCTB4MDM5MAkjR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisweGEyCTB4MDNjYwkjR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworMHhhMwkweDAzY2QJI0dSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKzB4YTQJMHgwMzkxCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQorMHhhNQkweDAzOTIJI0dSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEKKzB4YTYJMHgwMzkzCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorMHhhNwkweDAzOTQJI0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBCisweGE4CTB4MDM5NQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgorMHhhOQkweDAzOTYJI0dSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEKKzB4YWEJMHgwMzk3CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEKKzB4YWIJMHgwMGJkCSNWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKzB4YWMJMHgwMzk4CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorMHhhZAkweDAzOTkJI0dSRUVLIENBUElUQUwgTEVUVEVSIElPVEEKKzB4YWUJMHgwMGFiCSNMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhhZgkweDAwYmIJI1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhiMAkweDI1OTEJI0xJR0hUIFNIQURFCisweGIxCTB4MjU5MgkjTUVESVVNIFNIQURFCisweGIyCTB4MjU5MwkjREFSSyBTSEFERQorMHhiMwkweDI1MDIJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorMHhiNAkweDI1MjQJI0JPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorMHhiNQkweDAzOWEJI0dSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCisweGI2CTB4MDM5YgkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEKKzB4YjcJMHgwMzljCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorMHhiOAkweDAzOWQJI0dSRUVLIENBUElUQUwgTEVUVEVSIE5VCisweGI5CTB4MjU2MwkjQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorMHhiYQkweDI1NTEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKzB4YmIJMHgyNTU3CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKzB4YmMJMHgyNTVkCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisweGJkCTB4MDM5ZQkjR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkKKzB4YmUJMHgwMzlmCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisweGJmCTB4MjUxMAkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKzB4YzAJMHgyNTE0CSNCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisweGMxCTB4MjUzNAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisweGMyCTB4MjUyYwkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKzB4YzMJMHgyNTFjCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisweGM0CTB4MjUwMAkjQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKzB4YzUJMHgyNTNjCSNCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4YzYJMHgwM2EwCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQorMHhjNwkweDAzYTEJI0dSRUVLIENBUElUQUwgTEVUVEVSIFJITworMHhjOAkweDI1NWEJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisweGM5CTB4MjU1NAkjQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorMHhjYQkweDI1NjkJI0JPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKzB4Y2IJMHgyNTY2CSNCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4Y2MJMHgyNTYwCSNCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorMHhjZAkweDI1NTAJI0JPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorMHhjZQkweDI1NmMJI0JPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4Y2YJMHgwM2EzCSNHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorMHhkMAkweDAzYTQJI0dSRUVLIENBUElUQUwgTEVUVEVSIFRBVQorMHhkMQkweDAzYTUJI0dSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKzB4ZDIJMHgwM2E2CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKzB4ZDMJMHgwM2E3CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkKKzB4ZDQJMHgwM2E4CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKzB4ZDUJMHgwM2E5CSNHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorMHhkNgkweDAzYjEJI0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorMHhkNwkweDAzYjIJI0dSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisweGQ4CTB4MDNiMwkjR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCisweGQ5CTB4MjUxOAkjQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisweGRhCTB4MjUwYwkjQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisweGRiCTB4MjU4OAkjRlVMTCBCTE9DSworMHhkYwkweDI1ODQJI0xPV0VSIEhBTEYgQkxPQ0sKKzB4ZGQJMHgwM2I0CSNHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKzB4ZGUJMHgwM2I1CSNHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorMHhkZgkweDI1ODAJI1VQUEVSIEhBTEYgQkxPQ0sKKzB4ZTAJMHgwM2I2CSNHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQorMHhlMQkweDAzYjcJI0dSRUVLIFNNQUxMIExFVFRFUiBFVEEKKzB4ZTIJMHgwM2I4CSNHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKzB4ZTMJMHgwM2I5CSNHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQorMHhlNAkweDAzYmEJI0dSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorMHhlNQkweDAzYmIJI0dSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorMHhlNgkweDAzYmMJI0dSRUVLIFNNQUxMIExFVFRFUiBNVQorMHhlNwkweDAzYmQJI0dSRUVLIFNNQUxMIExFVFRFUiBOVQorMHhlOAkweDAzYmUJI0dSRUVLIFNNQUxMIExFVFRFUiBYSQorMHhlOQkweDAzYmYJI0dSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCisweGVhCTB4MDNjMAkjR1JFRUsgU01BTEwgTEVUVEVSIFBJCisweGViCTB4MDNjMQkjR1JFRUsgU01BTEwgTEVUVEVSIFJITworMHhlYwkweDAzYzMJI0dSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorMHhlZAkweDAzYzIJI0dSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQorMHhlZQkweDAzYzQJI0dSRUVLIFNNQUxMIExFVFRFUiBUQVUKKzB4ZWYJMHgwMzg0CSNHUkVFSyBUT05PUworMHhmMAkweDAwYWQJI1NPRlQgSFlQSEVOCisweGYxCTB4MDBiMQkjUExVUy1NSU5VUyBTSUdOCisweGYyCTB4MDNjNQkjR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKzB4ZjMJMHgwM2M2CSNHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisweGY0CTB4MDNjNwkjR1JFRUsgU01BTEwgTEVUVEVSIENISQorMHhmNQkweDAwYTcJI1NFQ1RJT04gU0lHTgorMHhmNgkweDAzYzgJI0dSRUVLIFNNQUxMIExFVFRFUiBQU0kKKzB4ZjcJMHgwMzg1CSNHUkVFSyBESUFMWVRJS0EgVE9OT1MKKzB4ZjgJMHgwMGIwCSNERUdSRUUgU0lHTgorMHhmOQkweDAwYTgJI0RJQUVSRVNJUworMHhmYQkweDAzYzkJI0dSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorMHhmYgkweDAzY2IJI0dSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisweGZjCTB4MDNiMAkjR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisweGZkCTB4MDNjZQkjR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKzB4ZmUJMHgyNWEwCSNCTEFDSyBTUVVBUkUKKzB4ZmYJMHgwMGEwCSNOTy1CUkVBSyBTUEFDRQorCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvY3A4NzQudHh0IGIvY29kZXBhZ2UvY3A4NzQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjY1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9jcDg3NC50eHQKQEAgLTAsMCArMSwyNzQgQEAKKyMKKyMgICAgTmFtZTogICAgIGNwODc0IHRvIFVuaWNvZGUgdGFibGUKKyMgICAgVW5pY29kZSB2ZXJzaW9uOiAyLjAKKyMgICAgVGFibGUgdmVyc2lvbjogMi4wMQorIyAgICBUYWJsZSBmb3JtYXQ6ICBGb3JtYXQgQQorIyAgICBEYXRlOiAgICAgICAgICAwMi8yOC85OAorIworIyAgICBDb250YWN0OiAgICAgICBTaGF3bi5TdGVlbGVAbWljcm9zb2Z0LmNvbQorIworIyAgICBHZW5lcmFsIG5vdGVzOiBub25lCisjCisjICAgIEZvcm1hdDogVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjICAgICAgICBDb2x1bW4gIzEgaXMgdGhlIGNwODc0IGNvZGUgKGluIGhleCkKKyMgICAgICAgIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMgICAgICAgIENvbHVtbiAjMyBpcyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjICAgIFRoZSBlbnRyaWVzIGFyZSBpbiBjcDg3NCBvcmRlcgorIworMHgwMAkweDAwMDAJI05VTEwKKzB4MDEJMHgwMDAxCSNTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJI0VORCBPRiBURVhUCisweDA0CTB4MDAwNAkjRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJI0VOUVVJUlkKKzB4MDYJMHgwMDA2CSNBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJI0JFTEwKKzB4MDgJMHgwMDA4CSNCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSNIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MEEJMHgwMDBBCSNMSU5FIEZFRUQKKzB4MEIJMHgwMDBCCSNWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBDCTB4MDAwQwkjRk9STSBGRUVECisweDBECTB4MDAwRAkjQ0FSUklBR0UgUkVUVVJOCisweDBFCTB4MDAwRQkjU0hJRlQgT1VUCisweDBGCTB4MDAwRgkjU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSNEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSNERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSNTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJI0NBTkNFTAorMHgxOQkweDAwMTkJI0VORCBPRiBNRURJVU0KKzB4MUEJMHgwMDFBCSNTVUJTVElUVVRFCisweDFCCTB4MDAxQgkjRVNDQVBFCisweDFDCTB4MDAxQwkjRklMRSBTRVBBUkFUT1IKKzB4MUQJMHgwMDFECSNHUk9VUCBTRVBBUkFUT1IKKzB4MUUJMHgwMDFFCSNSRUNPUkQgU0VQQVJBVE9SCisweDFGCTB4MDAxRgkjVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSNTUEFDRQorMHgyMQkweDAwMjEJI0VYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSNRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJI05VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSNQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSNBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSNBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJI1JJR0hUIFBBUkVOVEhFU0lTCisweDJBCTB4MDAyQQkjQVNURVJJU0sKKzB4MkIJMHgwMDJCCSNQTFVTIFNJR04KKzB4MkMJMHgwMDJDCSNDT01NQQorMHgyRAkweDAwMkQJI0hZUEhFTi1NSU5VUworMHgyRQkweDAwMkUJI0ZVTEwgU1RPUAorMHgyRgkweDAwMkYJI1NPTElEVVMKKzB4MzAJMHgwMDMwCSNESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjRElHSVQgT05FCisweDMyCTB4MDAzMgkjRElHSVQgVFdPCisweDMzCTB4MDAzMwkjRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSNESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjRElHSVQgRklWRQorMHgzNgkweDAwMzYJI0RJR0lUIFNJWAorMHgzNwkweDAwMzcJI0RJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSNESUdJVCBOSU5FCisweDNBCTB4MDAzQQkjQ09MT04KKzB4M0IJMHgwMDNCCSNTRU1JQ09MT04KKzB4M0MJMHgwMDNDCSNMRVNTLVRIQU4gU0lHTgorMHgzRAkweDAwM0QJI0VRVUFMUyBTSUdOCisweDNFCTB4MDAzRQkjR1JFQVRFUi1USEFOIFNJR04KKzB4M0YJMHgwMDNGCSNRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJI0xBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJI0xBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJI0xBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0QQkweDAwNEEJI0xBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NEIJMHgwMDRCCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRDCTB4MDA0QwkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0RAkweDAwNEQJI0xBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NEUJMHgwMDRFCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRGCTB4MDA0RgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJI0xBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJI0xBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJI0xBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSNMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJI0xBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NUEJMHgwMDVBCSNMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDVCCTB4MDA1QgkjTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1QwkweDAwNUMJI1JFVkVSU0UgU09MSURVUworMHg1RAkweDAwNUQJI1JJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVFCTB4MDA1RQkjQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NUYJMHgwMDVGCSNMT1cgTElORQorMHg2MAkweDAwNjAJI0dSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJI0xBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSNMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJI0xBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSNMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJI0xBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSNMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2QQkweDAwNkEJI0xBVElOIFNNQUxMIExFVFRFUiBKCisweDZCCTB4MDA2QgkjTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NkMJMHgwMDZDCSNMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2RAkweDAwNkQJI0xBVElOIFNNQUxMIExFVFRFUiBNCisweDZFCTB4MDA2RQkjTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NkYJMHgwMDZGCSNMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJI0xBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSNMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJI0xBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSNMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJI0xBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSNMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJI0xBVElOIFNNQUxMIExFVFRFUiBZCisweDdBCTB4MDA3QQkjTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N0IJMHgwMDdCCSNMRUZUIENVUkxZIEJSQUNLRVQKKzB4N0MJMHgwMDdDCSNWRVJUSUNBTCBMSU5FCisweDdECTB4MDA3RAkjUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3RQkweDAwN0UJI1RJTERFCisweDdGCTB4MDA3RgkjREVMRVRFCisweDgwCTB4MjBBQwkjRVVSTyBTSUdOCisweDgxCSAgICAgIAkjVU5ERUZJTkVECisweDgyCSAgICAgIAkjVU5ERUZJTkVECisweDgzCSAgICAgIAkjVU5ERUZJTkVECisweDg0CSAgICAgIAkjVU5ERUZJTkVECisweDg1CTB4MjAyNgkjSE9SSVpPTlRBTCBFTExJUFNJUworMHg4NgkgICAgICAJI1VOREVGSU5FRAorMHg4NwkgICAgICAJI1VOREVGSU5FRAorMHg4OAkgICAgICAJI1VOREVGSU5FRAorMHg4OQkgICAgICAJI1VOREVGSU5FRAorMHg4QQkgICAgICAJI1VOREVGSU5FRAorMHg4QgkgICAgICAJI1VOREVGSU5FRAorMHg4QwkgICAgICAJI1VOREVGSU5FRAorMHg4RAkgICAgICAJI1VOREVGSU5FRAorMHg4RQkgICAgICAJI1VOREVGSU5FRAorMHg4RgkgICAgICAJI1VOREVGSU5FRAorMHg5MAkgICAgICAJI1VOREVGSU5FRAorMHg5MQkweDIwMTgJI0xFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisweDkyCTB4MjAxOQkjUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisweDkzCTB4MjAxQwkjTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKzB4OTQJMHgyMDFECSNSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKzB4OTUJMHgyMDIyCSNCVUxMRVQKKzB4OTYJMHgyMDEzCSNFTiBEQVNICisweDk3CTB4MjAxNAkjRU0gREFTSAorMHg5OAkgICAgICAJI1VOREVGSU5FRAorMHg5OQkgICAgICAJI1VOREVGSU5FRAorMHg5QQkgICAgICAJI1VOREVGSU5FRAorMHg5QgkgICAgICAJI1VOREVGSU5FRAorMHg5QwkgICAgICAJI1VOREVGSU5FRAorMHg5RAkgICAgICAJI1VOREVGSU5FRAorMHg5RQkgICAgICAJI1VOREVGSU5FRAorMHg5RgkgICAgICAJI1VOREVGSU5FRAorMHhBMAkweDAwQTAJI05PLUJSRUFLIFNQQUNFCisweEExCTB4MEUwMQkjVEhBSSBDSEFSQUNURVIgS08gS0FJCisweEEyCTB4MEUwMgkjVEhBSSBDSEFSQUNURVIgS0hPIEtIQUkKKzB4QTMJMHgwRTAzCSNUSEFJIENIQVJBQ1RFUiBLSE8gS0hVQVQKKzB4QTQJMHgwRTA0CSNUSEFJIENIQVJBQ1RFUiBLSE8gS0hXQUkKKzB4QTUJMHgwRTA1CSNUSEFJIENIQVJBQ1RFUiBLSE8gS0hPTgorMHhBNgkweDBFMDYJI1RIQUkgQ0hBUkFDVEVSIEtITyBSQUtIQU5HCisweEE3CTB4MEUwNwkjVEhBSSBDSEFSQUNURVIgTkdPIE5HVQorMHhBOAkweDBFMDgJI1RIQUkgQ0hBUkFDVEVSIENITyBDSEFOCisweEE5CTB4MEUwOQkjVEhBSSBDSEFSQUNURVIgQ0hPIENISU5HCisweEFBCTB4MEUwQQkjVEhBSSBDSEFSQUNURVIgQ0hPIENIQU5HCisweEFCCTB4MEUwQgkjVEhBSSBDSEFSQUNURVIgU08gU08KKzB4QUMJMHgwRTBDCSNUSEFJIENIQVJBQ1RFUiBDSE8gQ0hPRQorMHhBRAkweDBFMEQJI1RIQUkgQ0hBUkFDVEVSIFlPIFlJTkcKKzB4QUUJMHgwRTBFCSNUSEFJIENIQVJBQ1RFUiBETyBDSEFEQQorMHhBRgkweDBFMEYJI1RIQUkgQ0hBUkFDVEVSIFRPIFBBVEFLCisweEIwCTB4MEUxMAkjVEhBSSBDSEFSQUNURVIgVEhPIFRIQU4KKzB4QjEJMHgwRTExCSNUSEFJIENIQVJBQ1RFUiBUSE8gTkFOR01PTlRITworMHhCMgkweDBFMTIJI1RIQUkgQ0hBUkFDVEVSIFRITyBQSFVUSEFPCisweEIzCTB4MEUxMwkjVEhBSSBDSEFSQUNURVIgTk8gTkVOCisweEI0CTB4MEUxNAkjVEhBSSBDSEFSQUNURVIgRE8gREVLCisweEI1CTB4MEUxNQkjVEhBSSBDSEFSQUNURVIgVE8gVEFPCisweEI2CTB4MEUxNgkjVEhBSSBDSEFSQUNURVIgVEhPIFRIVU5HCisweEI3CTB4MEUxNwkjVEhBSSBDSEFSQUNURVIgVEhPIFRIQUhBTgorMHhCOAkweDBFMTgJI1RIQUkgQ0hBUkFDVEVSIFRITyBUSE9ORworMHhCOQkweDBFMTkJI1RIQUkgQ0hBUkFDVEVSIE5PIE5VCisweEJBCTB4MEUxQQkjVEhBSSBDSEFSQUNURVIgQk8gQkFJTUFJCisweEJCCTB4MEUxQgkjVEhBSSBDSEFSQUNURVIgUE8gUExBCisweEJDCTB4MEUxQwkjVEhBSSBDSEFSQUNURVIgUEhPIFBIVU5HCisweEJECTB4MEUxRAkjVEhBSSBDSEFSQUNURVIgRk8gRkEKKzB4QkUJMHgwRTFFCSNUSEFJIENIQVJBQ1RFUiBQSE8gUEhBTgorMHhCRgkweDBFMUYJI1RIQUkgQ0hBUkFDVEVSIEZPIEZBTgorMHhDMAkweDBFMjAJI1RIQUkgQ0hBUkFDVEVSIFBITyBTQU1QSEFPCisweEMxCTB4MEUyMQkjVEhBSSBDSEFSQUNURVIgTU8gTUEKKzB4QzIJMHgwRTIyCSNUSEFJIENIQVJBQ1RFUiBZTyBZQUsKKzB4QzMJMHgwRTIzCSNUSEFJIENIQVJBQ1RFUiBSTyBSVUEKKzB4QzQJMHgwRTI0CSNUSEFJIENIQVJBQ1RFUiBSVQorMHhDNQkweDBFMjUJI1RIQUkgQ0hBUkFDVEVSIExPIExJTkcKKzB4QzYJMHgwRTI2CSNUSEFJIENIQVJBQ1RFUiBMVQorMHhDNwkweDBFMjcJI1RIQUkgQ0hBUkFDVEVSIFdPIFdBRU4KKzB4QzgJMHgwRTI4CSNUSEFJIENIQVJBQ1RFUiBTTyBTQUxBCisweEM5CTB4MEUyOQkjVEhBSSBDSEFSQUNURVIgU08gUlVTSQorMHhDQQkweDBFMkEJI1RIQUkgQ0hBUkFDVEVSIFNPIFNVQQorMHhDQgkweDBFMkIJI1RIQUkgQ0hBUkFDVEVSIEhPIEhJUAorMHhDQwkweDBFMkMJI1RIQUkgQ0hBUkFDVEVSIExPIENIVUxBCisweENECTB4MEUyRAkjVEhBSSBDSEFSQUNURVIgTyBBTkcKKzB4Q0UJMHgwRTJFCSNUSEFJIENIQVJBQ1RFUiBITyBOT0tIVUsKKzB4Q0YJMHgwRTJGCSNUSEFJIENIQVJBQ1RFUiBQQUlZQU5OT0kKKzB4RDAJMHgwRTMwCSNUSEFJIENIQVJBQ1RFUiBTQVJBIEEKKzB4RDEJMHgwRTMxCSNUSEFJIENIQVJBQ1RFUiBNQUkgSEFOLUFLQVQKKzB4RDIJMHgwRTMyCSNUSEFJIENIQVJBQ1RFUiBTQVJBIEFBCisweEQzCTB4MEUzMwkjVEhBSSBDSEFSQUNURVIgU0FSQSBBTQorMHhENAkweDBFMzQJI1RIQUkgQ0hBUkFDVEVSIFNBUkEgSQorMHhENQkweDBFMzUJI1RIQUkgQ0hBUkFDVEVSIFNBUkEgSUkKKzB4RDYJMHgwRTM2CSNUSEFJIENIQVJBQ1RFUiBTQVJBIFVFCisweEQ3CTB4MEUzNwkjVEhBSSBDSEFSQUNURVIgU0FSQSBVRUUKKzB4RDgJMHgwRTM4CSNUSEFJIENIQVJBQ1RFUiBTQVJBIFUKKzB4RDkJMHgwRTM5CSNUSEFJIENIQVJBQ1RFUiBTQVJBIFVVCisweERBCTB4MEUzQQkjVEhBSSBDSEFSQUNURVIgUEhJTlRIVQorMHhEQgkgICAgICAJI1VOREVGSU5FRAorMHhEQwkgICAgICAJI1VOREVGSU5FRAorMHhERAkgICAgICAJI1VOREVGSU5FRAorMHhERQkgICAgICAJI1VOREVGSU5FRAorMHhERgkweDBFM0YJI1RIQUkgQ1VSUkVOQ1kgU1lNQk9MIEJBSFQKKzB4RTAJMHgwRTQwCSNUSEFJIENIQVJBQ1RFUiBTQVJBIEUKKzB4RTEJMHgwRTQxCSNUSEFJIENIQVJBQ1RFUiBTQVJBIEFFCisweEUyCTB4MEU0MgkjVEhBSSBDSEFSQUNURVIgU0FSQSBPCisweEUzCTB4MEU0MwkjVEhBSSBDSEFSQUNURVIgU0FSQSBBSSBNQUlNVUFOCisweEU0CTB4MEU0NAkjVEhBSSBDSEFSQUNURVIgU0FSQSBBSSBNQUlNQUxBSQorMHhFNQkweDBFNDUJI1RIQUkgQ0hBUkFDVEVSIExBS0tIQU5HWUFPCisweEU2CTB4MEU0NgkjVEhBSSBDSEFSQUNURVIgTUFJWUFNT0sKKzB4RTcJMHgwRTQ3CSNUSEFJIENIQVJBQ1RFUiBNQUlUQUlLSFUKKzB4RTgJMHgwRTQ4CSNUSEFJIENIQVJBQ1RFUiBNQUkgRUsKKzB4RTkJMHgwRTQ5CSNUSEFJIENIQVJBQ1RFUiBNQUkgVEhPCisweEVBCTB4MEU0QQkjVEhBSSBDSEFSQUNURVIgTUFJIFRSSQorMHhFQgkweDBFNEIJI1RIQUkgQ0hBUkFDVEVSIE1BSSBDSEFUVEFXQQorMHhFQwkweDBFNEMJI1RIQUkgQ0hBUkFDVEVSIFRIQU5USEFLSEFUCisweEVECTB4MEU0RAkjVEhBSSBDSEFSQUNURVIgTklLSEFISVQKKzB4RUUJMHgwRTRFCSNUSEFJIENIQVJBQ1RFUiBZQU1BS0tBTgorMHhFRgkweDBFNEYJI1RIQUkgQ0hBUkFDVEVSIEZPTkdNQU4KKzB4RjAJMHgwRTUwCSNUSEFJIERJR0lUIFpFUk8KKzB4RjEJMHgwRTUxCSNUSEFJIERJR0lUIE9ORQorMHhGMgkweDBFNTIJI1RIQUkgRElHSVQgVFdPCisweEYzCTB4MEU1MwkjVEhBSSBESUdJVCBUSFJFRQorMHhGNAkweDBFNTQJI1RIQUkgRElHSVQgRk9VUgorMHhGNQkweDBFNTUJI1RIQUkgRElHSVQgRklWRQorMHhGNgkweDBFNTYJI1RIQUkgRElHSVQgU0lYCisweEY3CTB4MEU1NwkjVEhBSSBESUdJVCBTRVZFTgorMHhGOAkweDBFNTgJI1RIQUkgRElHSVQgRUlHSFQKKzB4RjkJMHgwRTU5CSNUSEFJIERJR0lUIE5JTkUKKzB4RkEJMHgwRTVBCSNUSEFJIENIQVJBQ1RFUiBBTkdLSEFOS0hVCisweEZCCTB4MEU1QgkjVEhBSSBDSEFSQUNURVIgS0hPTVVUCisweEZDCSAgICAgIAkjVU5ERUZJTkVECisweEZECSAgICAgIAkjVU5ERUZJTkVECisweEZFCSAgICAgIAkjVU5ERUZJTkVECisweEZGCSAgICAgIAkjVU5ERUZJTkVECmRpZmYgLS1naXQgYS9jb2RlcGFnZS9jcHRhYmxlLnBsIGIvY29kZXBhZ2UvY3B0YWJsZS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMjljZjAwCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvY3B0YWJsZS5wbApAQCAtMCwwICsxLDE3NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFByb2R1Y2UgYSBjb2RlcGFnZSBtYXRjaGluZyB0YWJsZS4gIEZvciBlYWNoIDgtYml0IGNoYXJhY3RlciwgbGlzdAorIyBhIHByaW1hcnkgYW5kIGFuIGFsdGVybmF0ZSBtYXRjaCAodGhlIGxhdHRlciB1c2VkIGZvciBjYXNlLWluc2Vuc2l0aXZlCisjIG1hdGNoaW5nLikKKyMKKyMgVXNhZ2U6CisjCWNwdGFibGUucGwgVW5pY29kZURhdGEgY29uc29sZS1jcC50eHQgZmlsZXN5c3RlbS1jcC50eHQgb3V0cHV0LmNwCisjCisjIE5vdGU6IGZvciB0aGUgZm9ybWF0IG9mIHRoZSBVbmljb2RlRGF0YSBmaWxlLCBzZWU6CisjIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvVUNELmh0bWwKKyMKKworKCR1Y2QsICRjcGNvLCAkY3BmcywgJGNwb3V0KSA9IEBBUkdWOworCitpZiAoIWRlZmluZWQoJGNwb3V0KSkgeworICAgIGRpZSAiVXNhZ2U6ICQwIFVuaWNvZGVEYXRhIGNvbnNvbGUtY3AudHh0IGZzLWNwLnR4dCBvdXRwdXQuY3BcbiI7Cit9CisKKyV1Y2FzZSAgID0gKCk7CislbGNhc2UgICA9ICgpOworJXRjYXNlICAgPSAoKTsKKyVkZWNvbXAgID0gKCk7CisKK29wZW4oVUNELCAnPCcsICR1Y2QpCisgICAgb3IgZGllICIkMDogY291bGQgbm90IG9wZW4gdW5pY29kZSBkYXRhOiAkdWNkOiAkIVxuIjsKK3doaWxlIChkZWZpbmVkKCRsaW5lID0gPFVDRD4pKSB7CisgICAgY2hvbXAgJGxpbmU7CisgICAgQGYgPSBzcGxpdCgvOy8sICRsaW5lKTsKKyAgICAkbiA9IGhleCAkZlswXTsKKyAgICAkdWNhc2V7JG59ID0gKCRmWzEyXSBuZSAnJykgPyBoZXggJGZbMTJdIDogJG47CisgICAgJGxjYXNleyRufSA9ICgkZlsxM10gbmUgJycpID8gaGV4ICRmWzEzXSA6ICRuOworICAgICR0Y2FzZXskbn0gPSAoJGZbMTRdIG5lICcnKSA/IGhleCAkZlsxNF0gOiAkbjsKKyAgICBpZiAoJGZbNV0gPX4gL15bMC05QS1GXHNdKyQvKSB7CisJIyBUaGlzIGNoYXJhY3RlciBoYXMgYSBjYW5vbmljYWwgZGVjb21wb3NpdGlvbi4KKwkjIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcmVqZWN0cyBhbmdsZSBicmFja2V0cywgc28gb3RoZXIKKwkjIGRlY29tcG9zaXRpb25zIGFyZW4ndCBwZXJtaXR0ZWQuCisJJGRlY29tcHskbn0gPSBbXTsKKwlmb3JlYWNoIG15ICRkY2ggKHNwbGl0KCcgJywgJGZbNV0pKSB7CisJICAgIHB1c2goQHskZGVjb21weyRufX0sIGhleCAkZGNoKTsKKwl9CisgICAgfQorfQorY2xvc2UoVUNEKTsKKworIworIyBGaWxlc3lzdGVtIGFuZCBjb25zb2xlIGNvZGVwYWdlcy4gIFRoZSBmaWxlc3lzdGVtIGNvZGVwYWdlIGlzIHVzZWQKKyMgZm9yIEZBVCBzaG9ydG5hbWVzLCB3aGVyZWFzIHRoZSBjb25zb2xlIGNvZGVwYWdlIGlzIHdoYXRldmVyIGlzIHVzZWQKKyMgb24gdGhlIHNjcmVlbiBhbmQga2V5Ym9hcmQuCisjCitAeHRhYiA9ICh1bmRlZikgeCAyNTY7CisldGFieCA9ICgpOworb3BlbihDUEZTLCAnPCcsICRjcGZzKQorICAgIG9yIGRpZSAiJDA6IGNvdWxkIG5vdCBvcGVuIGZzIGNvZGVwYWdlOiAkY3BmczogJCFcbiI7Cit3aGlsZSAoZGVmaW5lZCgkbGluZSA9IDxDUEZTPikpIHsKKyAgICAkbGluZSA9fiBzL1xzKihcIy4qfCkkLy87CisgICAgQGYgPSBzcGxpdCgvXHMrLywgJGxpbmUpOworICAgIG5leHQgaWYgKHNjYWxhciBAZiAhPSAyKTsKKyAgICBuZXh0IGlmIChoZXggJGZbMF0gPiAyNTUpOworICAgICR4dGFiW2hleCAkZlswXV0gPSBoZXggJGZbMV07ICMgQ29kZXBhZ2UgLT4gVW5pY29kZQorICAgICR0YWJ4e2hleCAkZlsxXX0gPSBoZXggJGZbMF07ICMgVW5pY29kZSAtPiBDb2RlcGFnZQorfQorY2xvc2UoQ1BGUyk7CisKK0B5dGFiID0gKHVuZGVmKSB4IDI1NjsKKyV0YWJ5ID0gKCk7CitvcGVuKENQQ08sICc8JywgJGNwY28pCisgICAgb3IgZGllICIkMDogY291bGQgbm90IG9wZW4gY29uc29sZSBjb2RlcGFnZTogJGNwY286ICQhXG4iOword2hpbGUgKGRlZmluZWQoJGxpbmUgPSA8Q1BDTz4pKSB7CisgICAgJGxpbmUgPX4gcy9ccyooXCMuKnwpJC8vOworICAgIEBmID0gc3BsaXQoL1xzKy8sICRsaW5lKTsKKyAgICBuZXh0IGlmIChzY2FsYXIgQGYgIT0gMik7CisgICAgbmV4dCBpZiAoaGV4ICRmWzBdID4gMjU1KTsKKyAgICAkeXRhYltoZXggJGZbMF1dID0gaGV4ICRmWzFdOyAjIENvZGVwYWdlIC0+IFVuaWNvZGUKKyAgICAkdGFieXtoZXggJGZbMV19ID0gaGV4ICRmWzBdOyAjIFVuaWNvZGUgLT4gQ29kZXBhZ2UKK30KK2Nsb3NlKENQQ08pOworCitvcGVuKENQT1VULCAnPicsICRjcG91dCkKKyAgICBvciBkaWUgIiQwOiBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZTogJGNwb3V0OiAkIVxuIjsKKyMKKyMgTWFnaWMgbnVtYmVyLCBpbiBhbnRpY2lwYXRpb24gb2YgYmVpbmcgYWJsZSB0byBsb2FkIHRoZXNlCisjIGZpbGVzIGR5bmFtaWNhbGx5Li4uCisjCitwcmludCBDUE9VVCBwYWNrKCJWViIsIDB4NThhOGIzZDQsIDB4NTFkMjFlYjEpOworCisjIEhlYWRlciBmaWVsZHMgYXZhaWxhYmxlIGZvciBmdXR1cmUgdXNlLi4uCitwcmludCBDUE9VVCBwYWNrKCJWVlZWVlYiLCAwLCAwLCAwLCAwLCAwLCAwKTsKKworIworIyBTZWxmIChzaG9ydG5hbWUpIHVwcGVyY2FzZSB0YWJsZS4KKyMgVGhpcyBkZXBlbmRzIGJvdGggb24gdGhlIGNvbnNvbGUgY29kZXBhZ2UgYW5kIHRoZSBmaWxlc3lzdGVtIGNvZGVwYWdlOworIyB0aGUgbG9naWNhbCB0cmFuc2NvZGluZyBvcGVyYXRpb24gaXM6CisjCisjICR0YWJ4eyR1Y2FzZXskeXRhYlskaV19fQorIworIyAuLi4gd2hlcmUgQHl0YWIgaXMgY29uc29sZSBjb2RlcGFnZSAtPiBVbmljb2RlIGFuZAorIyAldGFieCBpcyBVbmljb2RlIC0+IGZpbGVzeXN0ZW0gY29kZXBhZ2UuCisjCitAdWN0YWIgPSAodW5kZWYpIHggMjU2OworZm9yICgkaSA9IDA7ICRpIDwgMjU2OyAkaSsrKSB7CisgICAgJHV1YyA9ICR1Y2FzZXskeXRhYlskaV19OwkjIFVuaWNvZGUgdXBwZXIgY2FzZQorICAgIGlmIChkZWZpbmVkKCR0YWJ4eyR1dWN9KSkgeworCSMgU3RyYWlnaHQtZm9yd2FyZCBjb252ZXJzaW9uCisJJHUgPSAkdGFieHskdXVjfTsKKyAgICB9IGVsc2lmIChkZWZpbmVkKCR0YWJ4eyR7JGRlY29tcHskdXVjfX1bMF19KSkgeworCSMgVXBwZXIgY2FzZSBlcXVpdmFsZW50IHN0cmlwcGVkIG9mIGFjY2VudHMKKwkkdSA9ICR0YWJ4eyR7JGRlY29tcHskdXVjfX1bMF19OworICAgIH0gZWxzZSB7CisJIyBObyBlcXVpdmFsZW50IGF0IGFsbCBmb3VuZC4gIEFzc3VtZSBpdCBpcyBhIGxvd2VyLWNhc2Utb25seQorCSMgY2hhcmFjdGVyLCBsaWtlIGdyZWVrIGFscGhhIGluIENQNDM3LgorCSR1ID0gJGk7CisgICAgfQorICAgICR1Y3RhYlskaV0gPSAkdTsKKyAgICBwcmludCBDUE9VVCBwYWNrKCJDIiwgJHUpOworfQorCisjCisjIFNlbGYgKHNob3J0bmFtZSkgbG93ZXJjYXNlIHRhYmxlLgorIyBUaGlzIGRlcGVuZHMgYm90aCBvbiB0aGUgY29uc29sZSBjb2RlcGFnZSBhbmQgdGhlIGZpbGVzeXN0ZW0gY29kZXBhZ2U7CisjIHRoZSBsb2dpY2FsIHRyYW5zY29kaW5nIG9wZXJhdGlvbiBpczoKKyMKKyMgJHRhYnl7JGxjYXNleyR4dGFiWyRpXX19CisjCisjIC4uLiB3aGVyZSBAeXRhYiBpcyBjb25zb2xlIGNvZGVwYWdlIC0+IFVuaWNvZGUgYW5kCisjICV0YWJ4IGlzIFVuaWNvZGUgLT4gZmlsZXN5c3RlbSBjb2RlcGFnZS4KKyMKK0BsY3RhYiA9ICh1bmRlZikgeCAyNTY7Citmb3IgKCRpID0gMDsgJGkgPCAyNTY7ICRpKyspIHsKKyAgICAkbGxjID0gJGxjYXNleyR4dGFiWyRpXX07CSMgVW5pY29kZSBsb3dlciBjYXNlCisgICAgaWYgKGRlZmluZWQoJGwgPSAkdGFieXskbGxjfSkgJiYgJHVjdGFiWyRsXSA9PSAkaSkgeworCSMgU3RyYWlnaHQtZm9yd2FyZCBjb252ZXJzaW9uCisgICAgfSBlbHNpZiAoZGVmaW5lZCgkbCA9ICR0YWJ4eyR7JGRlY29tcHskbGxjfX1bMF19KSAmJiAkdWN0YWJbJGxdID09ICRpKSB7CisJIyBMb3dlciBjYXNlIGVxdWl2YWxlbnQgc3RyaXBwZWQgb2YgYWNjZW50cworICAgIH0gZWxzZSB7CisJIyBObyBlcXVpdmFsZW50IGF0IGFsbCBmb3VuZC4gIEZpbmQgKmFueXRoaW5nKiB0aGF0IG1hdGNoZXMgdGhlCisJIyBiaWplY3Rpb24gY3JpdGVyaW9uLi4uCisJZm9yICgkbCA9IDA7ICRsIDwgMjU2OyAkbCsrKSB7CisJICAgIGxhc3QgaWYgKCR1Y3RhYlskbF0gPT0gJGkpOworCX0KKwkkbCA9ICRpIGlmICgkbCA9PSAyNTYpOwkjIElmIG5vdGhpbmcsIHdlJ3JlIHNjcmV3ZWQgYW55d2F5Li4uCisgICAgfQorICAgICRsY3RhYlskaV0gPSAkbDsKKyAgICBwcmludCBDUE9VVCBwYWNrKCJDIiwgJGwpOworfQorCisjCisjIFVuaWNvZGUgKGxvbmduYW1lKSBtYXRjaGluZyB0YWJsZS4KKyMgVGhpcyBvbmx5IGRlcGVuZHMgb24gdGhlIGNvbnNvbGUgY29kZXBhZ2UuCisjCiskcHAwID0gJyc7ICAkcHAxID0gJyc7Citmb3IgKCRpID0gMDsgJGkgPCAyNTY7ICRpKyspIHsKKyAgICBpZiAoIWRlZmluZWQoJHl0YWJbJGldKSkgeworCSRwMCA9ICRwMSA9IDB4ZmZmZjsKKyAgICB9IGVsc2UgeworCSRwMCA9ICR5dGFiWyRpXTsKKwlpZiAoJHVjYXNleyRwMH0gIT0gJHAwKSB7CisJICAgICRwMSA9ICR1Y2FzZXskcDB9OworCX0gZWxzaWYgKCRsY2FzZXskcDB9ICE9ICRwMCkgeworCSAgICAkcDEgPSAkbGNhc2V7JHAwfTsKKwl9IGVsc2lmICgkdGNhc2V7JHAwfSAhPSAkcDApIHsKKwkgICAgJHAxID0gJHRjYXNleyRwMH07CisJfSBlbHNlIHsKKwkgICAgJHAxID0gJHAwOworCX0KKyAgICB9CisgICAgIyBPbmx5IHRoZSBCTVAgaXMgc3VwcG9ydGVkLi4uCisgICAgJHAwID0gMHhmZmZmIGlmICgkcDAgPiAweGZmZmYpOworICAgICRwMSA9IDB4ZmZmZiBpZiAoJHAxID4gMHhmZmZmKTsKKyAgICAkcHAwIC49IHBhY2soInYiLCAkcDApOworICAgICRwcDEgLj0gcGFjaygidiIsICRwMSk7Cit9CitwcmludCBDUE9VVCAkcHAwLCAkcHAxOworY2xvc2UgKENQT1VUKTsKKworICAgIApkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvZ2Vuc3Vic2V0LnBsIGIvY29kZXBhZ2UvZ2Vuc3Vic2V0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkZDdmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9nZW5zdWJzZXQucGwKQEAgLTAsMCArMSw1NyBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIEdlbmVyYXRlIGEgc3Vic2V0IG9mIHRoZSBVbmljb2RlRGF0YS50eHQgZmlsZSwgYXZhaWxhYmxlIGZyb20KKyMgZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL1VuaWNvZGVEYXRhLnR4dAorIworIyBVc2FnZToKKyMgICBnZW5zdWJzZXQucGwgW3N1YnNldCBmaWxlc10gPCBVbmljb2RlRGF0YS50eHQgPiBNaW5pVUNELnR4dAorIworCislbmVlZF90aGVzZSA9ICgpOworCisjIE1hcmsgYXMgbmVlZGVkIGFsbCB0aGUgY2hhcmFjdGVycyBtZW50aW9uZWQgaW4gdGhlIHJlbGV2YW50IGZpbGVzCitmb3JlYWNoICRmaWxlIChAQVJHVikgeworICAgIG9wZW4oRiwgJzwnLCAkZmlsZSkgb3IgZGllOworICAgIHdoaWxlIChkZWZpbmVkKCRsaW5lID0gPEY+KSkgeworCSRsaW5lID1+IHMvXHMqKFwjLip8KSQvLzsgIyBSZW1vdmUgY29tbWVudHMgYW5kIGZpbmFsIGJsYW5rcworCUBmID0gc3BsaXQoL1xzKy8sICRsaW5lKTsKKwluZXh0IGlmIChzY2FsYXIgQGYgIT0gMik7CisJJG5lZWRfdGhlc2V7aGV4ICRmWzFdfSsrOworICAgIH0KKyAgICBjbG9zZShGKTsKK30KKworIyBBbHNvIG1hcmsgYXMgbmVlZGVkIGFueSBjYXNlIHZhcmlhbnRzIG9mIHRob3NlCisjIChOb3RlOiB0aGlzIGRvZXNuJ3QgbmVjZXNzYXJpbHkgcHJvdmlkZSB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUsCisjIGJ1dCB3ZSBzaG91bGRuJ3QgbmVlZCBpdC4pCit3aGlsZSAoZGVmaW5lZCgkbGluZSA9IDxTVERJTj4pKSB7CisgICAgQGYgPSBzcGxpdCgvOy8sICRsaW5lKTsKKyAgICBpZiAoJGZbMF0gPX4gL14oWzAtOWEtZl0rKSQvaSkgeworCSRyID0gaGV4ICRmWzBdOworCWlmICgkbmVlZF90aGVzZXskcn0pIHsKKwkgICAgJG5lZWRfdGhlc2V7aGV4ICRmWzEyXX0rKyBpZiAoJGZbMTJdIG5lICcnKTsKKwkgICAgJG5lZWRfdGhlc2V7aGV4ICRmWzEzXX0rKyBpZiAoJGZbMTNdIG5lICcnKTsKKwkgICAgJG5lZWRfdGhlc2V7aGV4ICRmWzE0XX0rKyBpZiAoJGZbMTRdIG5lICcnKTsKKwl9CisgICAgfQorfQorCisjIEZpbmFsbHksIHdyaXRlIG91dCB0aGUgc3Vic2V0CitzZWVrKFNURElOLCAwLCAwKTsKK3doaWxlIChkZWZpbmVkKCRsaW5lID0gPFNURElOPikpIHsKKyAgICAoJHYsICRsKSA9IHNwbGl0KC87LywgJGxpbmUsIDIpOworICAgIGlmICgkdiA9fiAvXihbMC05YS1mXSspXC0oWzAtOWEtZl0rKSQvaSkgeworCSMgVGhpcyBpc24ndCBhY3R1YWxseSB0aGUgZm9ybWF0Li4uIGZpeCB0aGF0IGlmIGl0IGV2ZXIgbWF0dGVycworCSRyMSA9IGhleCAkMTsKKwkkcjIgPSBoZXggJDI7CisgICAgfSBlbHNpZiAoJHYgPX4gL14oWzAtOWEtZl0rKSQvaSkgeworCSRyMSA9ICRyMiA9IGhleCAkMTsKKyAgICB9IGVsc2UgeworCW5leHQ7CisgICAgfQorICAgIGZvciAoJHIgPSAkcjE7ICRyIDw9ICRyMjsgJHIrKykgeworCXByaW50ZiAiJTA0WDslcyIsICRyLCAkbCBpZiAoJG5lZWRfdGhlc2V7JHJ9KTsKKyAgICB9Cit9CisKKwkKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2lzbzg4NTktMS50eHQgYi9jb2RlcGFnZS9pc284ODU5LTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3M2VjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9pc284ODU5LTEudHh0CkBAIC0wLDAgKzEsMzAzIEBACisjCisjCU5hbWU6ICAgICAgICAgICAgIElTTy9JRUMgODg1OS0xOjE5OTggdG8gVW5pY29kZQorIwlVbmljb2RlIHZlcnNpb246ICAzLjAKKyMJVGFibGUgdmVyc2lvbjogICAgMS4wCisjCVRhYmxlIGZvcm1hdDogICAgIEZvcm1hdCBBCisjCURhdGU6ICAgICAgICAgICAgIDE5OTkgSnVseSAyNworIwlBdXRob3JzOiAgICAgICAgICBLZW4gV2hpc3RsZXIgPGtlbndAc3liYXNlLmNvbT4KKyMKKyMJQ29weXJpZ2h0IChjKSAxOTkxLTE5OTkgVW5pY29kZSwgSW5jLiAgQWxsIFJpZ2h0cyByZXNlcnZlZC4KKyMKKyMJVGhpcyBmaWxlIGlzIHByb3ZpZGVkIGFzLWlzIGJ5IFVuaWNvZGUsIEluYy4gKFRoZSBVbmljb2RlIENvbnNvcnRpdW0pLgorIwlObyBjbGFpbXMgYXJlIG1hZGUgYXMgdG8gZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gIE5vCisjCXdhcnJhbnRpZXMgb2YgYW55IGtpbmQgYXJlIGV4cHJlc3NlZCBvciBpbXBsaWVkLiAgVGhlIHJlY2lwaWVudAorIwlhZ3JlZXMgdG8gZGV0ZXJtaW5lIGFwcGxpY2FiaWxpdHkgb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQuICBJZiB0aGlzCisjCWZpbGUgaGFzIGJlZW4gcHJvdmlkZWQgb24gb3B0aWNhbCBtZWRpYSBieSBVbmljb2RlLCBJbmMuLCB0aGUgc29sZQorIwlyZW1lZHkgZm9yIGFueSBjbGFpbSB3aWxsIGJlIGV4Y2hhbmdlIG9mIGRlZmVjdGl2ZSBtZWRpYSB3aXRoaW4gOTAKKyMJZGF5cyBvZiByZWNlaXB0LgorIworIwlVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCisjCXN1cHBsaWVkIGluIHRoaXMgZmlsZSBpbiB0aGUgY3JlYXRpb24gb2YgcHJvZHVjdHMgc3VwcG9ydGluZyB0aGUKKyMJVW5pY29kZSBTdGFuZGFyZCwgYW5kIHRvIG1ha2UgY29waWVzIG9mIHRoaXMgZmlsZSBpbiBhbnkgZm9ybSBmb3IKKyMJaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgcmVtYWlucworIwlhdHRhY2hlZC4KKyMKKyMJR2VuZXJhbCBub3RlczoKKyMKKyMJVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGF0YSB0aGUgVW5pY29kZSBDb25zb3J0aXVtIGhhcyBvbiBob3cKKyMgICAgICAgSVNPL0lFQyA4ODU5LTE6MTk5OCBjaGFyYWN0ZXJzIG1hcCBpbnRvIFVuaWNvZGUuCisjCisjCUZvcm1hdDogIFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIwkJIENvbHVtbiAjMSBpcyB0aGUgSVNPL0lFQyA4ODU5LTEgY29kZSAoaW4gaGV4IGFzIDB4WFgpCisjCQkgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIwkJIENvbHVtbiAjMyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjCVRoZSBlbnRyaWVzIGFyZSBpbiBJU08vSUVDIDg4NTktMSBvcmRlci4KKyMKKyMJVmVyc2lvbiBoaXN0b3J5CisjCTEuMCB2ZXJzaW9uIHVwZGF0ZXMgMC4xIHZlcnNpb24gYnkgYWRkaW5nIG1hcHBpbmdzIGZvciBhbGwKKyMJY29udHJvbCBjaGFyYWN0ZXJzLgorIworIwlVcGRhdGVkIHZlcnNpb25zIG9mIHRoaXMgZmlsZSBtYXkgYmUgZm91bmQgaW46CisjCQk8ZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy8+CisjCisjCUFueSBjb21tZW50cyBvciBwcm9ibGVtcywgY29udGFjdCA8ZXJyYXRhQHVuaWNvZGUub3JnPgorIwlQbGVhc2Ugbm90ZSB0aGF0IDxlcnJhdGFAdW5pY29kZS5vcmc+IGlzIGFuIGFyY2hpdmFsIGFkZHJlc3M7CisjCW5vdGljZXMgd2lsbCBiZSBjaGVja2VkLCBidXQgZG8gbm90IGV4cGVjdCBhbiBpbW1lZGlhdGUgcmVzcG9uc2UuCisjCisweDAwCTB4MDAwMAkjCU5VTEwKKzB4MDEJMHgwMDAxCSMJU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJIwlTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjCUVORCBPRiBURVhUCisweDA0CTB4MDAwNAkjCUVORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSMJRU5RVUlSWQorMHgwNgkweDAwMDYJIwlBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJIwlCRUxMCisweDA4CTB4MDAwOAkjCUJBQ0tTUEFDRQorMHgwOQkweDAwMDkJIwlIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MEEJMHgwMDBBCSMJTElORSBGRUVECisweDBCCTB4MDAwQgkjCVZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSMJRk9STSBGRUVECisweDBECTB4MDAwRAkjCUNBUlJJQUdFIFJFVFVSTgorMHgwRQkweDAwMEUJIwlTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSMJU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSMJREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJIwlERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSMJREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjCURFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjCURFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSMJTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSMJU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJIwlFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjCUNBTkNFTAorMHgxOQkweDAwMTkJIwlFTkQgT0YgTUVESVVNCisweDFBCTB4MDAxQQkjCVNVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSMJRVNDQVBFCisweDFDCTB4MDAxQwkjCUZJTEUgU0VQQVJBVE9SCisweDFECTB4MDAxRAkjCUdST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJIwlSRUNPUkQgU0VQQVJBVE9SCisweDFGCTB4MDAxRgkjCVVOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjCVNQQUNFCisweDIxCTB4MDAyMQkjCUVYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSMJUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSMJTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSMJRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSMJUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjCUFNUEVSU0FORAorMHgyNwkweDAwMjcJIwlBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjCUxFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSMJUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSMJQVNURVJJU0sKKzB4MkIJMHgwMDJCCSMJUExVUyBTSUdOCisweDJDCTB4MDAyQwkjCUNPTU1BCisweDJECTB4MDAyRAkjCUhZUEhFTi1NSU5VUworMHgyRQkweDAwMkUJIwlGVUxMIFNUT1AKKzB4MkYJMHgwMDJGCSMJU09MSURVUworMHgzMAkweDAwMzAJIwlESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjCURJR0lUIE9ORQorMHgzMgkweDAwMzIJIwlESUdJVCBUV08KKzB4MzMJMHgwMDMzCSMJRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSMJRElHSVQgRk9VUgorMHgzNQkweDAwMzUJIwlESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjCURJR0lUIFNJWAorMHgzNwkweDAwMzcJIwlESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJIwlESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJIwlESUdJVCBOSU5FCisweDNBCTB4MDAzQQkjCUNPTE9OCisweDNCCTB4MDAzQgkjCVNFTUlDT0xPTgorMHgzQwkweDAwM0MJIwlMRVNTLVRIQU4gU0lHTgorMHgzRAkweDAwM0QJIwlFUVVBTFMgU0lHTgorMHgzRQkweDAwM0UJIwlHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJIwlRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjCUNPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NEEJMHgwMDRBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRDCTB4MDA0QwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NEQJMHgwMDRECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRGCTB4MDA0RgkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDVCCTB4MDA1QgkjCUxFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NUMJMHgwMDVDCSMJUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjCVJJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVFCTB4MDA1RQkjCUNJUkNVTUZMRVggQUNDRU5UCisweDVGCTB4MDA1RgkjCUxPVyBMSU5FCisweDYwCTB4MDA2MAkjCUdSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJIwlMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJIwlMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJIwlMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJIwlMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJIwlMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJIwlMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJIwlMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJIwlMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2QQkweDAwNkEJIwlMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2QgkweDAwNkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJIwlMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2RAkweDAwNkQJIwlMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2RQkweDAwNkUJIwlMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJIwlMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJIwlMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJIwlMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJIwlMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJIwlMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJIwlMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJIwlMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJIwlMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJIwlMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJIwlMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJIwlMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3QQkweDAwN0EJIwlMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJIwlMRUZUIENVUkxZIEJSQUNLRVQKKzB4N0MJMHgwMDdDCSMJVkVSVElDQUwgTElORQorMHg3RAkweDAwN0QJIwlSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjCVRJTERFCisweDdGCTB4MDA3RgkjCURFTEVURQorMHg4MAkweDAwODAJIwk8Y29udHJvbD4KKzB4ODEJMHgwMDgxCSMJPGNvbnRyb2w+CisweDgyCTB4MDA4MgkjCTxjb250cm9sPgorMHg4MwkweDAwODMJIwk8Y29udHJvbD4KKzB4ODQJMHgwMDg0CSMJPGNvbnRyb2w+CisweDg1CTB4MDA4NQkjCTxjb250cm9sPgorMHg4NgkweDAwODYJIwk8Y29udHJvbD4KKzB4ODcJMHgwMDg3CSMJPGNvbnRyb2w+CisweDg4CTB4MDA4OAkjCTxjb250cm9sPgorMHg4OQkweDAwODkJIwk8Y29udHJvbD4KKzB4OEEJMHgwMDhBCSMJPGNvbnRyb2w+CisweDhCCTB4MDA4QgkjCTxjb250cm9sPgorMHg4QwkweDAwOEMJIwk8Y29udHJvbD4KKzB4OEQJMHgwMDhECSMJPGNvbnRyb2w+CisweDhFCTB4MDA4RQkjCTxjb250cm9sPgorMHg4RgkweDAwOEYJIwk8Y29udHJvbD4KKzB4OTAJMHgwMDkwCSMJPGNvbnRyb2w+CisweDkxCTB4MDA5MQkjCTxjb250cm9sPgorMHg5MgkweDAwOTIJIwk8Y29udHJvbD4KKzB4OTMJMHgwMDkzCSMJPGNvbnRyb2w+CisweDk0CTB4MDA5NAkjCTxjb250cm9sPgorMHg5NQkweDAwOTUJIwk8Y29udHJvbD4KKzB4OTYJMHgwMDk2CSMJPGNvbnRyb2w+CisweDk3CTB4MDA5NwkjCTxjb250cm9sPgorMHg5OAkweDAwOTgJIwk8Y29udHJvbD4KKzB4OTkJMHgwMDk5CSMJPGNvbnRyb2w+CisweDlBCTB4MDA5QQkjCTxjb250cm9sPgorMHg5QgkweDAwOUIJIwk8Y29udHJvbD4KKzB4OUMJMHgwMDlDCSMJPGNvbnRyb2w+CisweDlECTB4MDA5RAkjCTxjb250cm9sPgorMHg5RQkweDAwOUUJIwk8Y29udHJvbD4KKzB4OUYJMHgwMDlGCSMJPGNvbnRyb2w+CisweEEwCTB4MDBBMAkjCU5PLUJSRUFLIFNQQUNFCisweEExCTB4MDBBMQkjCUlOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKzB4QTIJMHgwMEEyCSMJQ0VOVCBTSUdOCisweEEzCTB4MDBBMwkjCVBPVU5EIFNJR04KKzB4QTQJMHgwMEE0CSMJQ1VSUkVOQ1kgU0lHTgorMHhBNQkweDAwQTUJIwlZRU4gU0lHTgorMHhBNgkweDAwQTYJIwlCUk9LRU4gQkFSCisweEE3CTB4MDBBNwkjCVNFQ1RJT04gU0lHTgorMHhBOAkweDAwQTgJIwlESUFFUkVTSVMKKzB4QTkJMHgwMEE5CSMJQ09QWVJJR0hUIFNJR04KKzB4QUEJMHgwMEFBCSMJRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKzB4QUIJMHgwMEFCCSMJTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QUMJMHgwMEFDCSMJTk9UIFNJR04KKzB4QUQJMHgwMEFECSMJU09GVCBIWVBIRU4KKzB4QUUJMHgwMEFFCSMJUkVHSVNURVJFRCBTSUdOCisweEFGCTB4MDBBRgkjCU1BQ1JPTgorMHhCMAkweDAwQjAJIwlERUdSRUUgU0lHTgorMHhCMQkweDAwQjEJIwlQTFVTLU1JTlVTIFNJR04KKzB4QjIJMHgwMEIyCSMJU1VQRVJTQ1JJUFQgVFdPCisweEIzCTB4MDBCMwkjCVNVUEVSU0NSSVBUIFRIUkVFCisweEI0CTB4MDBCNAkjCUFDVVRFIEFDQ0VOVAorMHhCNQkweDAwQjUJIwlNSUNSTyBTSUdOCisweEI2CTB4MDBCNgkjCVBJTENST1cgU0lHTgorMHhCNwkweDAwQjcJIwlNSURETEUgRE9UCisweEI4CTB4MDBCOAkjCUNFRElMTEEKKzB4QjkJMHgwMEI5CSMJU1VQRVJTQ1JJUFQgT05FCisweEJBCTB4MDBCQQkjCU1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorMHhCQgkweDAwQkIJIwlSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QkMJMHgwMEJDCSMJVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisweEJECTB4MDBCRAkjCVZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhCRQkweDAwQkUJIwlWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKzB4QkYJMHgwMEJGCSMJSU5WRVJURUQgUVVFU1RJT04gTUFSSworMHhDMAkweDAwQzAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4QzEJMHgwMEMxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisweEMyCTB4MDBDMgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweEMzCTB4MDBDMwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhDNAkweDAwQzQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweEM1CTB4MDBDNQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisweEM2CTB4MDBDNgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEFFCisweEM3CTB4MDBDNwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweEM4CTB4MDBDOAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorMHhDOQkweDAwQzkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4Q0EJMHgwMENBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKzB4Q0IJMHgwMENCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworMHhDQwkweDAwQ0MJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4Q0QJMHgwMENECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweENFCTB4MDBDRQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisweENGCTB4MDBDRgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4RDAJMHgwMEQwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRIIChJY2VsYW5kaWMpCisweEQxCTB4MDBEMQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorMHhEMgkweDAwRDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4RDMJMHgwMEQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweEQ0CTB4MDBENAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweEQ1CTB4MDBENQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhENgkweDAwRDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEQ3CTB4MDBENwkjCU1VTFRJUExJQ0FUSU9OIFNJR04KKzB4RDgJMHgwMEQ4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhEOQkweDAwRDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4REEJMHgwMERBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweERCCTB4MDBEQgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweERDCTB4MDBEQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMERECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisweERFCTB4MDBERQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOIChJY2VsYW5kaWMpCisweERGCTB4MDBERgkjCUxBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHZXJtYW4pCisweEUwCTB4MDBFMAkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4RTEJMHgwMEUxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhFMgkweDAwRTIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwMEUzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhFNAkweDAwRTQJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhFNQkweDAwRTUJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4RTYJMHgwMEU2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEFFCisweEU3CTB4MDBFNwkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHhFOAkweDAwRTgJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEU5CTB4MDBFOQkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4RUEJMHgwMEVBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweEVCCTB4MDBFQgkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweEVDCTB4MDBFQwkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4RUQJMHgwMEVECSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorMHhFRQkweDAwRUUJIwlMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4RUYJMHgwMEVGCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4RjAJMHgwMEYwCSMJTEFUSU4gU01BTEwgTEVUVEVSIEVUSCAoSWNlbGFuZGljKQorMHhGMQkweDAwRjEJIwlMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisweEYyCTB4MDBGMgkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4RjMJMHgwMEYzCSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhGNAkweDAwRjQJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RjUJMHgwMEY1CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhGNgkweDAwRjYJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHhGNwkweDAwRjcJIwlESVZJU0lPTiBTSUdOCisweEY4CTB4MDBGOAkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisweEY5CTB4MDBGOQkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4RkEJMHgwMEZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAwRkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKzB4RkMJMHgwMEZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4RkQJMHgwMEZECSMJTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorMHhGRQkweDAwRkUJIwlMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4gKEljZWxhbmRpYykKKzB4RkYJMHgwMEZGCSMJTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2lzbzg4NTktMTAudHh0IGIvY29kZXBhZ2UvaXNvODg1OS0xMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0YTQyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVwYWdlL2lzbzg4NTktMTAudHh0CkBAIC0wLDAgKzEsMzAzIEBACisjCisjCU5hbWU6ICAgICAgICAgICAgIElTTy9JRUMgODg1OS0xMDoxOTk4IHRvIFVuaWNvZGUKKyMJVW5pY29kZSB2ZXJzaW9uOiAgMy4wCisjCVRhYmxlIHZlcnNpb246ICAgIDEuMQorIwlUYWJsZSBmb3JtYXQ6ICAgICBGb3JtYXQgQQorIwlEYXRlOiAgICAgICAgICAgICAxOTk5IE9jdG9iZXIgMTEKKyMJQXV0aG9yczogICAgICAgICAgS2VuIFdoaXN0bGVyIDxrZW53QHN5YmFzZS5jb20+CisjCisjCUNvcHlyaWdodCAoYykgMTk5OSBVbmljb2RlLCBJbmMuICBBbGwgUmlnaHRzIHJlc2VydmVkLgorIworIwlUaGlzIGZpbGUgaXMgcHJvdmlkZWQgYXMtaXMgYnkgVW5pY29kZSwgSW5jLiAoVGhlIFVuaWNvZGUgQ29uc29ydGl1bSkuCisjCU5vIGNsYWltcyBhcmUgbWFkZSBhcyB0byBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiAgTm8KKyMJd2FycmFudGllcyBvZiBhbnkga2luZCBhcmUgZXhwcmVzc2VkIG9yIGltcGxpZWQuICBUaGUgcmVjaXBpZW50CisjCWFncmVlcyB0byBkZXRlcm1pbmUgYXBwbGljYWJpbGl0eSBvZiBpbmZvcm1hdGlvbiBwcm92aWRlZC4gIElmIHRoaXMKKyMJZmlsZSBoYXMgYmVlbiBwcm92aWRlZCBvbiBvcHRpY2FsIG1lZGlhIGJ5IFVuaWNvZGUsIEluYy4sIHRoZSBzb2xlCisjCXJlbWVkeSBmb3IgYW55IGNsYWltIHdpbGwgYmUgZXhjaGFuZ2Ugb2YgZGVmZWN0aXZlIG1lZGlhIHdpdGhpbiA5MAorIwlkYXlzIG9mIHJlY2VpcHQuCisjCisjCVVuaWNvZGUsIEluYy4gaGVyZWJ5IGdyYW50cyB0aGUgcmlnaHQgdG8gZnJlZWx5IHVzZSB0aGUgaW5mb3JtYXRpb24KKyMJc3VwcGxpZWQgaW4gdGhpcyBmaWxlIGluIHRoZSBjcmVhdGlvbiBvZiBwcm9kdWN0cyBzdXBwb3J0aW5nIHRoZQorIwlVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtIGZvcgorIwlpbnRlcm5hbCBvciBleHRlcm5hbCBkaXN0cmlidXRpb24gYXMgbG9uZyBhcyB0aGlzIG5vdGljZSByZW1haW5zCisjCWF0dGFjaGVkLgorIworIwlHZW5lcmFsIG5vdGVzOgorIworIwlUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkYXRhIHRoZSBVbmljb2RlIENvbnNvcnRpdW0gaGFzIG9uIGhvdworIyAgICAgICBJU08vSUVDIDg4NTktMTA6MTk5OCBjaGFyYWN0ZXJzIG1hcCBpbnRvIFVuaWNvZGUuCisjCisjCUZvcm1hdDogIFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIwkJIENvbHVtbiAjMSBpcyB0aGUgSVNPL0lFQyA4ODU5LTEwIGNvZGUgKGluIGhleCBhcyAweFhYKQorIwkJIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMJCSBDb2x1bW4gIzMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIwlUaGUgZW50cmllcyBhcmUgaW4gSVNPL0lFQyA4ODU5LTEwIG9yZGVyLgorIworIwlWZXJzaW9uIGhpc3RvcnkKKyMJMS4wIHZlcnNpb24gbmV3LgorIyAgICAgICAxLjEgY29ycmVjdGVkIG1pc3Rha2UgaW4gbWFwcGluZyBvZiAweEE0CisjCisjCVVwZGF0ZWQgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIG1heSBiZSBmb3VuZCBpbjoKKyMJCTxmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTLz4KKyMKKyMJQW55IGNvbW1lbnRzIG9yIHByb2JsZW1zLCBjb250YWN0IDxlcnJhdGFAdW5pY29kZS5vcmc+CisjCVBsZWFzZSBub3RlIHRoYXQgPGVycmF0YUB1bmljb2RlLm9yZz4gaXMgYW4gYXJjaGl2YWwgYWRkcmVzczsKKyMJbm90aWNlcyB3aWxsIGJlIGNoZWNrZWQsIGJ1dCBkbyBub3QgZXhwZWN0IGFuIGltbWVkaWF0ZSByZXNwb25zZS4KKyMKKzB4MDAJMHgwMDAwCSMJTlVMTAorMHgwMQkweDAwMDEJIwlTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjCVNUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSMJRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSMJRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJIwlFTlFVSVJZCisweDA2CTB4MDAwNgkjCUFDS05PV0xFREdFCisweDA3CTB4MDAwNwkjCUJFTEwKKzB4MDgJMHgwMDA4CSMJQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjCUhPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJIwlMSU5FIEZFRUQKKzB4MEIJMHgwMDBCCSMJVkVSVElDQUwgVEFCVUxBVElPTgorMHgwQwkweDAwMEMJIwlGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSMJQ0FSUklBR0UgUkVUVVJOCisweDBFCTB4MDAwRQkjCVNISUZUIE9VVAorMHgwRgkweDAwMEYJIwlTSElGVCBJTgorMHgxMAkweDAwMTAJIwlEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjCURFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJIwlERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSMJREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSMJREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJIwlORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJIwlTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjCUVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSMJQ0FOQ0VMCisweDE5CTB4MDAxOQkjCUVORCBPRiBNRURJVU0KKzB4MUEJMHgwMDFBCSMJU1VCU1RJVFVURQorMHgxQgkweDAwMUIJIwlFU0NBUEUKKzB4MUMJMHgwMDFDCSMJRklMRSBTRVBBUkFUT1IKKzB4MUQJMHgwMDFECSMJR1JPVVAgU0VQQVJBVE9SCisweDFFCTB4MDAxRQkjCVJFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSMJVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSMJU1BBQ0UKKzB4MjEJMHgwMDIxCSMJRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJIwlRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJIwlOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJIwlET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJIwlQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSMJQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjCUFQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSMJTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJIwlSSUdIVCBQQVJFTlRIRVNJUworMHgyQQkweDAwMkEJIwlBU1RFUklTSworMHgyQgkweDAwMkIJIwlQTFVTIFNJR04KKzB4MkMJMHgwMDJDCSMJQ09NTUEKKzB4MkQJMHgwMDJECSMJSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjCUZVTEwgU1RPUAorMHgyRgkweDAwMkYJIwlTT0xJRFVTCisweDMwCTB4MDAzMAkjCURJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSMJRElHSVQgT05FCisweDMyCTB4MDAzMgkjCURJR0lUIFRXTworMHgzMwkweDAwMzMJIwlESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJIwlESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjCURJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSMJRElHSVQgU0lYCisweDM3CTB4MDAzNwkjCURJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjCURJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjCURJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSMJQ09MT04KKzB4M0IJMHgwMDNCCSMJU0VNSUNPTE9OCisweDNDCTB4MDAzQwkjCUxFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjCUVRVUFMUyBTSUdOCisweDNFCTB4MDAzRQkjCUdSRUFURVItVEhBTiBTSUdOCisweDNGCTB4MDAzRgkjCVFVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSMJQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0QQkweDAwNEEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRCCTB4MDA0QgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0RAkweDAwNEQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRFCTB4MDA0RQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVBCTB4MDA1QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSMJTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1QwkweDAwNUMJIwlSRVZFUlNFIFNPTElEVVMKKzB4NUQJMHgwMDVECSMJUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSMJQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NUYJMHgwMDVGCSMJTE9XIExJTkUKKzB4NjAJMHgwMDYwCSMJR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjCUxBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjCUxBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjCUxBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjCUxBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjCUxBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjCUxBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjCUxBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjCUxBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjCUxBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjCUxBVElOIFNNQUxMIExFVFRFUiBKCisweDZCCTB4MDA2QgkjCUxBVElOIFNNQUxMIExFVFRFUiBLCisweDZDCTB4MDA2QwkjCUxBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjCUxBVElOIFNNQUxMIExFVFRFUiBNCisweDZFCTB4MDA2RQkjCUxBVElOIFNNQUxMIExFVFRFUiBOCisweDZGCTB4MDA2RgkjCUxBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjCUxBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjCUxBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjCUxBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjCUxBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjCUxBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjCUxBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjCUxBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjCUxBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjCUxBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjCUxBVElOIFNNQUxMIExFVFRFUiBZCisweDdBCTB4MDA3QQkjCUxBVElOIFNNQUxMIExFVFRFUiBaCisweDdCCTB4MDA3QgkjCUxFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJIwlWRVJUSUNBTCBMSU5FCisweDdECTB4MDA3RAkjCVJJR0hUIENVUkxZIEJSQUNLRVQKKzB4N0UJMHgwMDdFCSMJVElMREUKKzB4N0YJMHgwMDdGCSMJREVMRVRFCisweDgwCTB4MDA4MAkjCTxjb250cm9sPgorMHg4MQkweDAwODEJIwk8Y29udHJvbD4KKzB4ODIJMHgwMDgyCSMJPGNvbnRyb2w+CisweDgzCTB4MDA4MwkjCTxjb250cm9sPgorMHg4NAkweDAwODQJIwk8Y29udHJvbD4KKzB4ODUJMHgwMDg1CSMJPGNvbnRyb2w+CisweDg2CTB4MDA4NgkjCTxjb250cm9sPgorMHg4NwkweDAwODcJIwk8Y29udHJvbD4KKzB4ODgJMHgwMDg4CSMJPGNvbnRyb2w+CisweDg5CTB4MDA4OQkjCTxjb250cm9sPgorMHg4QQkweDAwOEEJIwk8Y29udHJvbD4KKzB4OEIJMHgwMDhCCSMJPGNvbnRyb2w+CisweDhDCTB4MDA4QwkjCTxjb250cm9sPgorMHg4RAkweDAwOEQJIwk8Y29udHJvbD4KKzB4OEUJMHgwMDhFCSMJPGNvbnRyb2w+CisweDhGCTB4MDA4RgkjCTxjb250cm9sPgorMHg5MAkweDAwOTAJIwk8Y29udHJvbD4KKzB4OTEJMHgwMDkxCSMJPGNvbnRyb2w+CisweDkyCTB4MDA5MgkjCTxjb250cm9sPgorMHg5MwkweDAwOTMJIwk8Y29udHJvbD4KKzB4OTQJMHgwMDk0CSMJPGNvbnRyb2w+CisweDk1CTB4MDA5NQkjCTxjb250cm9sPgorMHg5NgkweDAwOTYJIwk8Y29udHJvbD4KKzB4OTcJMHgwMDk3CSMJPGNvbnRyb2w+CisweDk4CTB4MDA5OAkjCTxjb250cm9sPgorMHg5OQkweDAwOTkJIwk8Y29udHJvbD4KKzB4OUEJMHgwMDlBCSMJPGNvbnRyb2w+CisweDlCCTB4MDA5QgkjCTxjb250cm9sPgorMHg5QwkweDAwOUMJIwk8Y29udHJvbD4KKzB4OUQJMHgwMDlECSMJPGNvbnRyb2w+CisweDlFCTB4MDA5RQkjCTxjb250cm9sPgorMHg5RgkweDAwOUYJIwk8Y29udHJvbD4KKzB4QTAJMHgwMEEwCSMJTk8tQlJFQUsgU1BBQ0UKKzB4QTEJMHgwMTA0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworMHhBMgkweDAxMTIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisweEEzCTB4MDEyMgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisweEE0CTB4MDEyQQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKzB4QTUJMHgwMTI4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIFRJTERFCisweEE2CTB4MDEzNgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisweEE3CTB4MDBBNwkjCVNFQ1RJT04gU0lHTgorMHhBOAkweDAxM0IJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorMHhBOQkweDAxMTAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU1RST0tFCisweEFBCTB4MDE2MAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorMHhBQgkweDAxNjYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggU1RST0tFCisweEFDCTB4MDE3RAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorMHhBRAkweDAwQUQJIwlTT0ZUIEhZUEhFTgorMHhBRQkweDAxNkEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OCisweEFGCTB4MDE0QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEVORworMHhCMAkweDAwQjAJIwlERUdSRUUgU0lHTgorMHhCMQkweDAxMDUJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworMHhCMgkweDAxMTMJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorMHhCMwkweDAxMjMJIwlMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKzB4QjQJMHgwMTJCCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04KKzB4QjUJMHgwMTI5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBUSUxERQorMHhCNgkweDAxMzcJIwlMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKzB4QjcJMHgwMEI3CSMJTUlERExFIERPVAorMHhCOAkweDAxM0MJIwlMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKzB4QjkJMHgwMTExCSMJTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKzB4QkEJMHgwMTYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorMHhCQgkweDAxNjcJIwlMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIFNUUk9LRQorMHhCQwkweDAxN0UJIwlMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisweEJECTB4MjAxNQkjCUhPUklaT05UQUwgQkFSCisweEJFCTB4MDE2QgkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OCisweEJGCTB4MDE0QgkjCUxBVElOIFNNQUxMIExFVFRFUiBFTkcKKzB4QzAJMHgwMTAwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorMHhDMQkweDAwQzEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4QzIJMHgwMEMyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4QzMJMHgwMEMzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisweEM0CTB4MDBDNAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4QzUJMHgwMEM1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4QzYJMHgwMEM2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKzB4QzcJMHgwMTJFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE9HT05FSworMHhDOAkweDAxMEMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKzB4QzkJMHgwMEM5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweENBCTB4MDExOAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKzB4Q0IJMHgwMENCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworMHhDQwkweDAxMTYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisweENECTB4MDBDRAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorMHhDRQkweDAwQ0UJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorMHhDRgkweDAwQ0YJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisweEQwCTB4MDBEMAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEVUSCAoSWNlbGFuZGljKQorMHhEMQkweDAxNDUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorMHhEMgkweDAxNEMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OCisweEQzCTB4MDBEMwkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhENAkweDAwRDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorMHhENQkweDAwRDUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKzB4RDYJMHgwMEQ2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHhENwkweDAxNjgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggVElMREUKKzB4RDgJMHgwMEQ4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhEOQkweDAxNzIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLCisweERBCTB4MDBEQQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhEQgkweDAwREIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHhEQwkweDAwREMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweERECTB4MDBERAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorMHhERQkweDAwREUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiAoSWNlbGFuZGljKQorMHhERgkweDAwREYJIwlMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR2VybWFuKQorMHhFMAkweDAxMDEJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorMHhFMQkweDAwRTEJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisweEUyCTB4MDBFMgkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhFMwkweDAwRTMJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisweEU0CTB4MDBFNAkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweEU1CTB4MDBFNQkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorMHhFNgkweDAwRTYJIwlMQVRJTiBTTUFMTCBMRVRURVIgQUUKKzB4RTcJMHgwMTJGCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKzB4RTgJMHgwMTBECSMJTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorMHhFOQkweDAwRTkJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweEVBCTB4MDExOQkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisweEVCCTB4MDBFQgkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweEVDCTB4MDExNwkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisweEVECTB4MDBFRAkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4RUUJMHgwMEVFCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisweEVGCTB4MDBFRgkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisweEYwCTB4MDBGMAkjCUxBVElOIFNNQUxMIExFVFRFUiBFVEggKEljZWxhbmRpYykKKzB4RjEJMHgwMTQ2CSMJTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisweEYyCTB4MDE0RAkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisweEYzCTB4MDBGMwkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RjQJMHgwMEY0CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweEY1CTB4MDBGNQkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKzB4RjYJMHgwMEY2CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4RjcJMHgwMTY5CSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBUSUxERQorMHhGOAkweDAwRjgJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhGOQkweDAxNzMJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE9HT05FSworMHhGQQkweDAwRkEJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweEZCCTB4MDBGQgkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHhGQwkweDAwRkMJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHhGRAkweDAwRkQJIwlMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisweEZFCTB4MDBGRQkjCUxBVElOIFNNQUxMIExFVFRFUiBUSE9STiAoSWNlbGFuZGljKQorMHhGRgkweDAxMzgJIwlMQVRJTiBTTUFMTCBMRVRURVIgS1JBCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9pc284ODU5LTExLnR4dCBiL2NvZGVwYWdlL2lzbzg4NTktMTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmJkOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9pc284ODU5LTExLnR4dApAQCAtMCwwICsxLDI5NyBAQAorIworIwlOYW1lOiAgICAgICAgICAgICBJU08vSUVDIDg4NTktMTE6MjAwMSB0byBVbmljb2RlCisjCVVuaWNvZGUgdmVyc2lvbjogIDMuMgorIwlUYWJsZSB2ZXJzaW9uOiAgICAxLjAKKyMJVGFibGUgZm9ybWF0OiAgICAgRm9ybWF0IEEKKyMJRGF0ZTogICAgICAgICAgICAgMjAwMiBPY3RvYmVyIDcKKyMJQXV0aG9yczogICAgICAgICAgS2VuIFdoaXN0bGVyIDxrZW53QHN5YmFzZS5jb20+CisjCisjCUNvcHlyaWdodCAoYykgMjAwMiBVbmljb2RlLCBJbmMuICBBbGwgUmlnaHRzIHJlc2VydmVkLgorIworIwlUaGlzIGZpbGUgaXMgcHJvdmlkZWQgYXMtaXMgYnkgVW5pY29kZSwgSW5jLiAoVGhlIFVuaWNvZGUgQ29uc29ydGl1bSkuCisjCU5vIGNsYWltcyBhcmUgbWFkZSBhcyB0byBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiAgTm8KKyMJd2FycmFudGllcyBvZiBhbnkga2luZCBhcmUgZXhwcmVzc2VkIG9yIGltcGxpZWQuICBUaGUgcmVjaXBpZW50CisjCWFncmVlcyB0byBkZXRlcm1pbmUgYXBwbGljYWJpbGl0eSBvZiBpbmZvcm1hdGlvbiBwcm92aWRlZC4gIElmIHRoaXMKKyMJZmlsZSBoYXMgYmVlbiBwcm92aWRlZCBvbiBvcHRpY2FsIG1lZGlhIGJ5IFVuaWNvZGUsIEluYy4sIHRoZSBzb2xlCisjCXJlbWVkeSBmb3IgYW55IGNsYWltIHdpbGwgYmUgZXhjaGFuZ2Ugb2YgZGVmZWN0aXZlIG1lZGlhIHdpdGhpbiA5MAorIwlkYXlzIG9mIHJlY2VpcHQuCisjCisjCVVuaWNvZGUsIEluYy4gaGVyZWJ5IGdyYW50cyB0aGUgcmlnaHQgdG8gZnJlZWx5IHVzZSB0aGUgaW5mb3JtYXRpb24KKyMJc3VwcGxpZWQgaW4gdGhpcyBmaWxlIGluIHRoZSBjcmVhdGlvbiBvZiBwcm9kdWN0cyBzdXBwb3J0aW5nIHRoZQorIwlVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtIGZvcgorIwlpbnRlcm5hbCBvciBleHRlcm5hbCBkaXN0cmlidXRpb24gYXMgbG9uZyBhcyB0aGlzIG5vdGljZSByZW1haW5zCisjCWF0dGFjaGVkLgorIworIwlHZW5lcmFsIG5vdGVzOgorIworIwlUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkYXRhIHRoZSBVbmljb2RlIENvbnNvcnRpdW0gaGFzIG9uIGhvdworIyAgICAgICBJU08vSUVDIDg4NTktMTE6MjAwMSBjaGFyYWN0ZXJzIG1hcCBpbnRvIFVuaWNvZGUuCisjCisjCUlTTy9JRUMgODg1OS0xMToyMDAxIGlzIGVxdWl2YWxlbnQgdG8gVElTIDYyMC0yNTMzICgxOTkwKSB3aXRoCisjCXRoZSBhZGRpdGlvbiBvZiAweEEwIE5PLUJSRUFLIFNQQUNFLgorIworIwlGb3JtYXQ6ICBUaHJlZSB0YWItc2VwYXJhdGVkIGNvbHVtbnMKKyMJCSBDb2x1bW4gIzEgaXMgdGhlIElTTy9JRUMgODg1OS0xMSBjb2RlIChpbiBoZXggYXMgMHhYWCkKKyMJCSBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjCQkgQ29sdW1uICMzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMJVGhlIGVudHJpZXMgYXJlIGluIElTTy9JRUMgODg1OS0xMSBvcmRlci4KKyMKKyMJVmVyc2lvbiBoaXN0b3J5OgorIwkJMjAwMiBPY3RvYmVyIDcgIENyZWF0ZWQKKyMKKyMJVXBkYXRlZCB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgbWF5IGJlIGZvdW5kIGluOgorIwkJPGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvPgorIworIwlGb3IgYW55IGNvbW1lbnRzIG9yIHByb2JsZW1zLCBwbGVhc2UgdXNlIHRoZSBVbmljb2RlCisjCXdlYiBjb250YWN0IGZvcm0gYXQ6CisjCQlodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0aW5nLmh0bWwKKyMKKzB4MDAJMHgwMDAwCSMJTlVMTAorMHgwMQkweDAwMDEJIwlTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjCVNUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSMJRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSMJRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJIwlFTlFVSVJZCisweDA2CTB4MDAwNgkjCUFDS05PV0xFREdFCisweDA3CTB4MDAwNwkjCUJFTEwKKzB4MDgJMHgwMDA4CSMJQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjCUhPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJIwlMSU5FIEZFRUQKKzB4MEIJMHgwMDBCCSMJVkVSVElDQUwgVEFCVUxBVElPTgorMHgwQwkweDAwMEMJIwlGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSMJQ0FSUklBR0UgUkVUVVJOCisweDBFCTB4MDAwRQkjCVNISUZUIE9VVAorMHgwRgkweDAwMEYJIwlTSElGVCBJTgorMHgxMAkweDAwMTAJIwlEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjCURFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJIwlERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSMJREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSMJREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJIwlORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJIwlTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjCUVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSMJQ0FOQ0VMCisweDE5CTB4MDAxOQkjCUVORCBPRiBNRURJVU0KKzB4MUEJMHgwMDFBCSMJU1VCU1RJVFVURQorMHgxQgkweDAwMUIJIwlFU0NBUEUKKzB4MUMJMHgwMDFDCSMJRklMRSBTRVBBUkFUT1IKKzB4MUQJMHgwMDFECSMJR1JPVVAgU0VQQVJBVE9SCisweDFFCTB4MDAxRQkjCVJFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSMJVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSMJU1BBQ0UKKzB4MjEJMHgwMDIxCSMJRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJIwlRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJIwlOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJIwlET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJIwlQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSMJQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjCUFQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSMJTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJIwlSSUdIVCBQQVJFTlRIRVNJUworMHgyQQkweDAwMkEJIwlBU1RFUklTSworMHgyQgkweDAwMkIJIwlQTFVTIFNJR04KKzB4MkMJMHgwMDJDCSMJQ09NTUEKKzB4MkQJMHgwMDJECSMJSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjCUZVTEwgU1RPUAorMHgyRgkweDAwMkYJIwlTT0xJRFVTCisweDMwCTB4MDAzMAkjCURJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSMJRElHSVQgT05FCisweDMyCTB4MDAzMgkjCURJR0lUIFRXTworMHgzMwkweDAwMzMJIwlESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJIwlESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjCURJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSMJRElHSVQgU0lYCisweDM3CTB4MDAzNwkjCURJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjCURJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjCURJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSMJQ09MT04KKzB4M0IJMHgwMDNCCSMJU0VNSUNPTE9OCisweDNDCTB4MDAzQwkjCUxFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjCUVRVUFMUyBTSUdOCisweDNFCTB4MDAzRQkjCUdSRUFURVItVEhBTiBTSUdOCisweDNGCTB4MDAzRgkjCVFVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSMJQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0QQkweDAwNEEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRCCTB4MDA0QgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0RAkweDAwNEQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRFCTB4MDA0RQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVBCTB4MDA1QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSMJTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1QwkweDAwNUMJIwlSRVZFUlNFIFNPTElEVVMKKzB4NUQJMHgwMDVECSMJUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSMJQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NUYJMHgwMDVGCSMJTE9XIExJTkUKKzB4NjAJMHgwMDYwCSMJR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjCUxBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjCUxBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjCUxBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjCUxBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjCUxBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjCUxBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjCUxBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjCUxBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjCUxBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjCUxBVElOIFNNQUxMIExFVFRFUiBKCisweDZCCTB4MDA2QgkjCUxBVElOIFNNQUxMIExFVFRFUiBLCisweDZDCTB4MDA2QwkjCUxBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjCUxBVElOIFNNQUxMIExFVFRFUiBNCisweDZFCTB4MDA2RQkjCUxBVElOIFNNQUxMIExFVFRFUiBOCisweDZGCTB4MDA2RgkjCUxBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjCUxBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjCUxBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjCUxBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjCUxBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjCUxBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjCUxBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjCUxBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjCUxBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjCUxBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjCUxBVElOIFNNQUxMIExFVFRFUiBZCisweDdBCTB4MDA3QQkjCUxBVElOIFNNQUxMIExFVFRFUiBaCisweDdCCTB4MDA3QgkjCUxFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJIwlWRVJUSUNBTCBMSU5FCisweDdECTB4MDA3RAkjCVJJR0hUIENVUkxZIEJSQUNLRVQKKzB4N0UJMHgwMDdFCSMJVElMREUKKzB4N0YJMHgwMDdGCSMJREVMRVRFCisweDgwCTB4MDA4MAkjCTxjb250cm9sPgorMHg4MQkweDAwODEJIwk8Y29udHJvbD4KKzB4ODIJMHgwMDgyCSMJPGNvbnRyb2w+CisweDgzCTB4MDA4MwkjCTxjb250cm9sPgorMHg4NAkweDAwODQJIwk8Y29udHJvbD4KKzB4ODUJMHgwMDg1CSMJPGNvbnRyb2w+CisweDg2CTB4MDA4NgkjCTxjb250cm9sPgorMHg4NwkweDAwODcJIwk8Y29udHJvbD4KKzB4ODgJMHgwMDg4CSMJPGNvbnRyb2w+CisweDg5CTB4MDA4OQkjCTxjb250cm9sPgorMHg4QQkweDAwOEEJIwk8Y29udHJvbD4KKzB4OEIJMHgwMDhCCSMJPGNvbnRyb2w+CisweDhDCTB4MDA4QwkjCTxjb250cm9sPgorMHg4RAkweDAwOEQJIwk8Y29udHJvbD4KKzB4OEUJMHgwMDhFCSMJPGNvbnRyb2w+CisweDhGCTB4MDA4RgkjCTxjb250cm9sPgorMHg5MAkweDAwOTAJIwk8Y29udHJvbD4KKzB4OTEJMHgwMDkxCSMJPGNvbnRyb2w+CisweDkyCTB4MDA5MgkjCTxjb250cm9sPgorMHg5MwkweDAwOTMJIwk8Y29udHJvbD4KKzB4OTQJMHgwMDk0CSMJPGNvbnRyb2w+CisweDk1CTB4MDA5NQkjCTxjb250cm9sPgorMHg5NgkweDAwOTYJIwk8Y29udHJvbD4KKzB4OTcJMHgwMDk3CSMJPGNvbnRyb2w+CisweDk4CTB4MDA5OAkjCTxjb250cm9sPgorMHg5OQkweDAwOTkJIwk8Y29udHJvbD4KKzB4OUEJMHgwMDlBCSMJPGNvbnRyb2w+CisweDlCCTB4MDA5QgkjCTxjb250cm9sPgorMHg5QwkweDAwOUMJIwk8Y29udHJvbD4KKzB4OUQJMHgwMDlECSMJPGNvbnRyb2w+CisweDlFCTB4MDA5RQkjCTxjb250cm9sPgorMHg5RgkweDAwOUYJIwk8Y29udHJvbD4KKzB4QTAJMHgwMEEwCSMJTk8tQlJFQUsgU1BBQ0UKKzB4QTEJMHgwRTAxCSMJVEhBSSBDSEFSQUNURVIgS08gS0FJCisweEEyCTB4MEUwMgkjCVRIQUkgQ0hBUkFDVEVSIEtITyBLSEFJCisweEEzCTB4MEUwMwkjCVRIQUkgQ0hBUkFDVEVSIEtITyBLSFVBVAorMHhBNAkweDBFMDQJIwlUSEFJIENIQVJBQ1RFUiBLSE8gS0hXQUkKKzB4QTUJMHgwRTA1CSMJVEhBSSBDSEFSQUNURVIgS0hPIEtIT04KKzB4QTYJMHgwRTA2CSMJVEhBSSBDSEFSQUNURVIgS0hPIFJBS0hBTkcKKzB4QTcJMHgwRTA3CSMJVEhBSSBDSEFSQUNURVIgTkdPIE5HVQorMHhBOAkweDBFMDgJIwlUSEFJIENIQVJBQ1RFUiBDSE8gQ0hBTgorMHhBOQkweDBFMDkJIwlUSEFJIENIQVJBQ1RFUiBDSE8gQ0hJTkcKKzB4QUEJMHgwRTBBCSMJVEhBSSBDSEFSQUNURVIgQ0hPIENIQU5HCisweEFCCTB4MEUwQgkjCVRIQUkgQ0hBUkFDVEVSIFNPIFNPCisweEFDCTB4MEUwQwkjCVRIQUkgQ0hBUkFDVEVSIENITyBDSE9FCisweEFECTB4MEUwRAkjCVRIQUkgQ0hBUkFDVEVSIFlPIFlJTkcKKzB4QUUJMHgwRTBFCSMJVEhBSSBDSEFSQUNURVIgRE8gQ0hBREEKKzB4QUYJMHgwRTBGCSMJVEhBSSBDSEFSQUNURVIgVE8gUEFUQUsKKzB4QjAJMHgwRTEwCSMJVEhBSSBDSEFSQUNURVIgVEhPIFRIQU4KKzB4QjEJMHgwRTExCSMJVEhBSSBDSEFSQUNURVIgVEhPIE5BTkdNT05USE8KKzB4QjIJMHgwRTEyCSMJVEhBSSBDSEFSQUNURVIgVEhPIFBIVVRIQU8KKzB4QjMJMHgwRTEzCSMJVEhBSSBDSEFSQUNURVIgTk8gTkVOCisweEI0CTB4MEUxNAkjCVRIQUkgQ0hBUkFDVEVSIERPIERFSworMHhCNQkweDBFMTUJIwlUSEFJIENIQVJBQ1RFUiBUTyBUQU8KKzB4QjYJMHgwRTE2CSMJVEhBSSBDSEFSQUNURVIgVEhPIFRIVU5HCisweEI3CTB4MEUxNwkjCVRIQUkgQ0hBUkFDVEVSIFRITyBUSEFIQU4KKzB4QjgJMHgwRTE4CSMJVEhBSSBDSEFSQUNURVIgVEhPIFRIT05HCisweEI5CTB4MEUxOQkjCVRIQUkgQ0hBUkFDVEVSIE5PIE5VCisweEJBCTB4MEUxQQkjCVRIQUkgQ0hBUkFDVEVSIEJPIEJBSU1BSQorMHhCQgkweDBFMUIJIwlUSEFJIENIQVJBQ1RFUiBQTyBQTEEKKzB4QkMJMHgwRTFDCSMJVEhBSSBDSEFSQUNURVIgUEhPIFBIVU5HCisweEJECTB4MEUxRAkjCVRIQUkgQ0hBUkFDVEVSIEZPIEZBCisweEJFCTB4MEUxRQkjCVRIQUkgQ0hBUkFDVEVSIFBITyBQSEFOCisweEJGCTB4MEUxRgkjCVRIQUkgQ0hBUkFDVEVSIEZPIEZBTgorMHhDMAkweDBFMjAJIwlUSEFJIENIQVJBQ1RFUiBQSE8gU0FNUEhBTworMHhDMQkweDBFMjEJIwlUSEFJIENIQVJBQ1RFUiBNTyBNQQorMHhDMgkweDBFMjIJIwlUSEFJIENIQVJBQ1RFUiBZTyBZQUsKKzB4QzMJMHgwRTIzCSMJVEhBSSBDSEFSQUNURVIgUk8gUlVBCisweEM0CTB4MEUyNAkjCVRIQUkgQ0hBUkFDVEVSIFJVCisweEM1CTB4MEUyNQkjCVRIQUkgQ0hBUkFDVEVSIExPIExJTkcKKzB4QzYJMHgwRTI2CSMJVEhBSSBDSEFSQUNURVIgTFUKKzB4QzcJMHgwRTI3CSMJVEhBSSBDSEFSQUNURVIgV08gV0FFTgorMHhDOAkweDBFMjgJIwlUSEFJIENIQVJBQ1RFUiBTTyBTQUxBCisweEM5CTB4MEUyOQkjCVRIQUkgQ0hBUkFDVEVSIFNPIFJVU0kKKzB4Q0EJMHgwRTJBCSMJVEhBSSBDSEFSQUNURVIgU08gU1VBCisweENCCTB4MEUyQgkjCVRIQUkgQ0hBUkFDVEVSIEhPIEhJUAorMHhDQwkweDBFMkMJIwlUSEFJIENIQVJBQ1RFUiBMTyBDSFVMQQorMHhDRAkweDBFMkQJIwlUSEFJIENIQVJBQ1RFUiBPIEFORworMHhDRQkweDBFMkUJIwlUSEFJIENIQVJBQ1RFUiBITyBOT0tIVUsKKzB4Q0YJMHgwRTJGCSMJVEhBSSBDSEFSQUNURVIgUEFJWUFOTk9JCisweEQwCTB4MEUzMAkjCVRIQUkgQ0hBUkFDVEVSIFNBUkEgQQorMHhEMQkweDBFMzEJIwlUSEFJIENIQVJBQ1RFUiBNQUkgSEFOLUFLQVQKKzB4RDIJMHgwRTMyCSMJVEhBSSBDSEFSQUNURVIgU0FSQSBBQQorMHhEMwkweDBFMzMJIwlUSEFJIENIQVJBQ1RFUiBTQVJBIEFNCisweEQ0CTB4MEUzNAkjCVRIQUkgQ0hBUkFDVEVSIFNBUkEgSQorMHhENQkweDBFMzUJIwlUSEFJIENIQVJBQ1RFUiBTQVJBIElJCisweEQ2CTB4MEUzNgkjCVRIQUkgQ0hBUkFDVEVSIFNBUkEgVUUKKzB4RDcJMHgwRTM3CSMJVEhBSSBDSEFSQUNURVIgU0FSQSBVRUUKKzB4RDgJMHgwRTM4CSMJVEhBSSBDSEFSQUNURVIgU0FSQSBVCisweEQ5CTB4MEUzOQkjCVRIQUkgQ0hBUkFDVEVSIFNBUkEgVVUKKzB4REEJMHgwRTNBCSMJVEhBSSBDSEFSQUNURVIgUEhJTlRIVQorMHhERgkweDBFM0YJIwlUSEFJIENVUlJFTkNZIFNZTUJPTCBCQUhUCisweEUwCTB4MEU0MAkjCVRIQUkgQ0hBUkFDVEVSIFNBUkEgRQorMHhFMQkweDBFNDEJIwlUSEFJIENIQVJBQ1RFUiBTQVJBIEFFCisweEUyCTB4MEU0MgkjCVRIQUkgQ0hBUkFDVEVSIFNBUkEgTworMHhFMwkweDBFNDMJIwlUSEFJIENIQVJBQ1RFUiBTQVJBIEFJIE1BSU1VQU4KKzB4RTQJMHgwRTQ0CSMJVEhBSSBDSEFSQUNURVIgU0FSQSBBSSBNQUlNQUxBSQorMHhFNQkweDBFNDUJIwlUSEFJIENIQVJBQ1RFUiBMQUtLSEFOR1lBTworMHhFNgkweDBFNDYJIwlUSEFJIENIQVJBQ1RFUiBNQUlZQU1PSworMHhFNwkweDBFNDcJIwlUSEFJIENIQVJBQ1RFUiBNQUlUQUlLSFUKKzB4RTgJMHgwRTQ4CSMJVEhBSSBDSEFSQUNURVIgTUFJIEVLCisweEU5CTB4MEU0OQkjCVRIQUkgQ0hBUkFDVEVSIE1BSSBUSE8KKzB4RUEJMHgwRTRBCSMJVEhBSSBDSEFSQUNURVIgTUFJIFRSSQorMHhFQgkweDBFNEIJIwlUSEFJIENIQVJBQ1RFUiBNQUkgQ0hBVFRBV0EKKzB4RUMJMHgwRTRDCSMJVEhBSSBDSEFSQUNURVIgVEhBTlRIQUtIQVQKKzB4RUQJMHgwRTRECSMJVEhBSSBDSEFSQUNURVIgTklLSEFISVQKKzB4RUUJMHgwRTRFCSMJVEhBSSBDSEFSQUNURVIgWUFNQUtLQU4KKzB4RUYJMHgwRTRGCSMJVEhBSSBDSEFSQUNURVIgRk9OR01BTgorMHhGMAkweDBFNTAJIwlUSEFJIERJR0lUIFpFUk8KKzB4RjEJMHgwRTUxCSMJVEhBSSBESUdJVCBPTkUKKzB4RjIJMHgwRTUyCSMJVEhBSSBESUdJVCBUV08KKzB4RjMJMHgwRTUzCSMJVEhBSSBESUdJVCBUSFJFRQorMHhGNAkweDBFNTQJIwlUSEFJIERJR0lUIEZPVVIKKzB4RjUJMHgwRTU1CSMJVEhBSSBESUdJVCBGSVZFCisweEY2CTB4MEU1NgkjCVRIQUkgRElHSVQgU0lYCisweEY3CTB4MEU1NwkjCVRIQUkgRElHSVQgU0VWRU4KKzB4RjgJMHgwRTU4CSMJVEhBSSBESUdJVCBFSUdIVAorMHhGOQkweDBFNTkJIwlUSEFJIERJR0lUIE5JTkUKKzB4RkEJMHgwRTVBCSMJVEhBSSBDSEFSQUNURVIgQU5HS0hBTktIVQorMHhGQgkweDBFNUIJIwlUSEFJIENIQVJBQ1RFUiBLSE9NVVQKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2lzbzg4NTktMTMudHh0IGIvY29kZXBhZ2UvaXNvODg1OS0xMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxMWI1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVwYWdlL2lzbzg4NTktMTMudHh0CkBAIC0wLDAgKzEsMjk5IEBACisjCisjCU5hbWU6ICAgICAgICAgICAgIElTTy9JRUMgODg1OS0xMzoxOTk4ICB0byBVbmljb2RlCisjCVVuaWNvZGUgdmVyc2lvbjogIDMuMAorIwlUYWJsZSB2ZXJzaW9uOiAgICAxLjAKKyMJVGFibGUgZm9ybWF0OiAgICAgRm9ybWF0IEEKKyMJRGF0ZTogICAgICAgICAgICAgMTk5OSBKdWx5IDI3CisjCUF1dGhvcnM6ICAgICAgICAgIEtlbiBXaGlzdGxlciA8a2Vud0BzeWJhc2UuY29tPgorIworIwlDb3B5cmlnaHQgKGMpIDE5OTggLSAxOTk5IFVuaWNvZGUsIEluYy4gIEFsbCBSaWdodHMgcmVzZXJ2ZWQuCisjCisjCVRoaXMgZmlsZSBpcyBwcm92aWRlZCBhcy1pcyBieSBVbmljb2RlLCBJbmMuIChUaGUgVW5pY29kZSBDb25zb3J0aXVtKS4KKyMJTm8gY2xhaW1zIGFyZSBtYWRlIGFzIHRvIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBObworIwl3YXJyYW50aWVzIG9mIGFueSBraW5kIGFyZSBleHByZXNzZWQgb3IgaW1wbGllZC4gIFRoZSByZWNpcGllbnQKKyMJYWdyZWVzIHRvIGRldGVybWluZSBhcHBsaWNhYmlsaXR5IG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkLiAgSWYgdGhpcworIwlmaWxlIGhhcyBiZWVuIHByb3ZpZGVkIG9uIG9wdGljYWwgbWVkaWEgYnkgVW5pY29kZSwgSW5jLiwgdGhlIHNvbGUKKyMJcmVtZWR5IGZvciBhbnkgY2xhaW0gd2lsbCBiZSBleGNoYW5nZSBvZiBkZWZlY3RpdmUgbWVkaWEgd2l0aGluIDkwCisjCWRheXMgb2YgcmVjZWlwdC4KKyMKKyMJVW5pY29kZSwgSW5jLiBoZXJlYnkgZ3JhbnRzIHRoZSByaWdodCB0byBmcmVlbHkgdXNlIHRoZSBpbmZvcm1hdGlvbgorIwlzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCisjCVVuaWNvZGUgU3RhbmRhcmQsIGFuZCB0byBtYWtlIGNvcGllcyBvZiB0aGlzIGZpbGUgaW4gYW55IGZvcm0gZm9yCisjCWludGVybmFsIG9yIGV4dGVybmFsIGRpc3RyaWJ1dGlvbiBhcyBsb25nIGFzIHRoaXMgbm90aWNlIHJlbWFpbnMKKyMJYXR0YWNoZWQuCisjCisjCUdlbmVyYWwgbm90ZXM6CisjCisjCVRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRhdGEgdGhlIFVuaWNvZGUgQ29uc29ydGl1bSBoYXMgb24gaG93CisjICAgICAgIElTTy9JRUMgODg1OS0xMzoxOTk4IGNoYXJhY3RlcnMgbWFwIGludG8gVW5pY29kZS4KKyMKKyMJRm9ybWF0OiAgVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjCQkgQ29sdW1uICMxIGlzIHRoZSBJU08vSUVDIDg4NTktMTMgY29kZSAoaW4gaGV4IGFzIDB4WFgpCisjCQkgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIwkJIENvbHVtbiAjMyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjCVRoZSBlbnRyaWVzIGFyZSBpbiBJU08vSUVDIDg4NTktMTMgb3JkZXIuCisjCisjCVVwZGF0ZWQgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIG1heSBiZSBmb3VuZCBpbjoKKyMJCTxmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTLz4KKyMKKyMJQW55IGNvbW1lbnRzIG9yIHByb2JsZW1zLCBjb250YWN0IDxlcnJhdGFAdW5pY29kZS5vcmc+CisjCVBsZWFzZSBub3RlIHRoYXQgPGVycmF0YUB1bmljb2RlLm9yZz4gaXMgYW4gYXJjaGl2YWwgYWRkcmVzczsKKyMJbm90aWNlcyB3aWxsIGJlIGNoZWNrZWQsIGJ1dCBkbyBub3QgZXhwZWN0IGFuIGltbWVkaWF0ZSByZXNwb25zZS4KKyMKKzB4MDAJMHgwMDAwCSMJTlVMTAorMHgwMQkweDAwMDEJIwlTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjCVNUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSMJRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSMJRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJIwlFTlFVSVJZCisweDA2CTB4MDAwNgkjCUFDS05PV0xFREdFCisweDA3CTB4MDAwNwkjCUJFTEwKKzB4MDgJMHgwMDA4CSMJQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjCUhPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJIwlMSU5FIEZFRUQKKzB4MEIJMHgwMDBCCSMJVkVSVElDQUwgVEFCVUxBVElPTgorMHgwQwkweDAwMEMJIwlGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSMJQ0FSUklBR0UgUkVUVVJOCisweDBFCTB4MDAwRQkjCVNISUZUIE9VVAorMHgwRgkweDAwMEYJIwlTSElGVCBJTgorMHgxMAkweDAwMTAJIwlEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjCURFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJIwlERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSMJREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSMJREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJIwlORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJIwlTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjCUVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSMJQ0FOQ0VMCisweDE5CTB4MDAxOQkjCUVORCBPRiBNRURJVU0KKzB4MUEJMHgwMDFBCSMJU1VCU1RJVFVURQorMHgxQgkweDAwMUIJIwlFU0NBUEUKKzB4MUMJMHgwMDFDCSMJRklMRSBTRVBBUkFUT1IKKzB4MUQJMHgwMDFECSMJR1JPVVAgU0VQQVJBVE9SCisweDFFCTB4MDAxRQkjCVJFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSMJVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSMJU1BBQ0UKKzB4MjEJMHgwMDIxCSMJRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJIwlRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJIwlOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJIwlET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJIwlQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSMJQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjCUFQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSMJTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJIwlSSUdIVCBQQVJFTlRIRVNJUworMHgyQQkweDAwMkEJIwlBU1RFUklTSworMHgyQgkweDAwMkIJIwlQTFVTIFNJR04KKzB4MkMJMHgwMDJDCSMJQ09NTUEKKzB4MkQJMHgwMDJECSMJSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjCUZVTEwgU1RPUAorMHgyRgkweDAwMkYJIwlTT0xJRFVTCisweDMwCTB4MDAzMAkjCURJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSMJRElHSVQgT05FCisweDMyCTB4MDAzMgkjCURJR0lUIFRXTworMHgzMwkweDAwMzMJIwlESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJIwlESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjCURJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSMJRElHSVQgU0lYCisweDM3CTB4MDAzNwkjCURJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjCURJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjCURJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSMJQ09MT04KKzB4M0IJMHgwMDNCCSMJU0VNSUNPTE9OCisweDNDCTB4MDAzQwkjCUxFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjCUVRVUFMUyBTSUdOCisweDNFCTB4MDAzRQkjCUdSRUFURVItVEhBTiBTSUdOCisweDNGCTB4MDAzRgkjCVFVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSMJQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0QQkweDAwNEEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRCCTB4MDA0QgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0RAkweDAwNEQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRFCTB4MDA0RQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVBCTB4MDA1QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSMJTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1QwkweDAwNUMJIwlSRVZFUlNFIFNPTElEVVMKKzB4NUQJMHgwMDVECSMJUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSMJQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NUYJMHgwMDVGCSMJTE9XIExJTkUKKzB4NjAJMHgwMDYwCSMJR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjCUxBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjCUxBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjCUxBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjCUxBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjCUxBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjCUxBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjCUxBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjCUxBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjCUxBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjCUxBVElOIFNNQUxMIExFVFRFUiBKCisweDZCCTB4MDA2QgkjCUxBVElOIFNNQUxMIExFVFRFUiBLCisweDZDCTB4MDA2QwkjCUxBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjCUxBVElOIFNNQUxMIExFVFRFUiBNCisweDZFCTB4MDA2RQkjCUxBVElOIFNNQUxMIExFVFRFUiBOCisweDZGCTB4MDA2RgkjCUxBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjCUxBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjCUxBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjCUxBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjCUxBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjCUxBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjCUxBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjCUxBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjCUxBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjCUxBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjCUxBVElOIFNNQUxMIExFVFRFUiBZCisweDdBCTB4MDA3QQkjCUxBVElOIFNNQUxMIExFVFRFUiBaCisweDdCCTB4MDA3QgkjCUxFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJIwlWRVJUSUNBTCBMSU5FCisweDdECTB4MDA3RAkjCVJJR0hUIENVUkxZIEJSQUNLRVQKKzB4N0UJMHgwMDdFCSMJVElMREUKKzB4N0YJMHgwMDdGCSMJREVMRVRFCisweDgwCTB4MDA4MAkjCTxjb250cm9sPgorMHg4MQkweDAwODEJIwk8Y29udHJvbD4KKzB4ODIJMHgwMDgyCSMJPGNvbnRyb2w+CisweDgzCTB4MDA4MwkjCTxjb250cm9sPgorMHg4NAkweDAwODQJIwk8Y29udHJvbD4KKzB4ODUJMHgwMDg1CSMJPGNvbnRyb2w+CisweDg2CTB4MDA4NgkjCTxjb250cm9sPgorMHg4NwkweDAwODcJIwk8Y29udHJvbD4KKzB4ODgJMHgwMDg4CSMJPGNvbnRyb2w+CisweDg5CTB4MDA4OQkjCTxjb250cm9sPgorMHg4QQkweDAwOEEJIwk8Y29udHJvbD4KKzB4OEIJMHgwMDhCCSMJPGNvbnRyb2w+CisweDhDCTB4MDA4QwkjCTxjb250cm9sPgorMHg4RAkweDAwOEQJIwk8Y29udHJvbD4KKzB4OEUJMHgwMDhFCSMJPGNvbnRyb2w+CisweDhGCTB4MDA4RgkjCTxjb250cm9sPgorMHg5MAkweDAwOTAJIwk8Y29udHJvbD4KKzB4OTEJMHgwMDkxCSMJPGNvbnRyb2w+CisweDkyCTB4MDA5MgkjCTxjb250cm9sPgorMHg5MwkweDAwOTMJIwk8Y29udHJvbD4KKzB4OTQJMHgwMDk0CSMJPGNvbnRyb2w+CisweDk1CTB4MDA5NQkjCTxjb250cm9sPgorMHg5NgkweDAwOTYJIwk8Y29udHJvbD4KKzB4OTcJMHgwMDk3CSMJPGNvbnRyb2w+CisweDk4CTB4MDA5OAkjCTxjb250cm9sPgorMHg5OQkweDAwOTkJIwk8Y29udHJvbD4KKzB4OUEJMHgwMDlBCSMJPGNvbnRyb2w+CisweDlCCTB4MDA5QgkjCTxjb250cm9sPgorMHg5QwkweDAwOUMJIwk8Y29udHJvbD4KKzB4OUQJMHgwMDlECSMJPGNvbnRyb2w+CisweDlFCTB4MDA5RQkjCTxjb250cm9sPgorMHg5RgkweDAwOUYJIwk8Y29udHJvbD4KKzB4QTAJMHgwMEEwCSMJTk8tQlJFQUsgU1BBQ0UKKzB4QTEJMHgyMDFECSMJUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweEEyCTB4MDBBMgkjCUNFTlQgU0lHTgorMHhBMwkweDAwQTMJIwlQT1VORCBTSUdOCisweEE0CTB4MDBBNAkjCUNVUlJFTkNZIFNJR04KKzB4QTUJMHgyMDFFCSMJRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisweEE2CTB4MDBBNgkjCUJST0tFTiBCQVIKKzB4QTcJMHgwMEE3CSMJU0VDVElPTiBTSUdOCisweEE4CTB4MDBEOAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKzB4QTkJMHgwMEE5CSMJQ09QWVJJR0hUIFNJR04KKzB4QUEJMHgwMTU2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKzB4QUIJMHgwMEFCCSMJTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QUMJMHgwMEFDCSMJTk9UIFNJR04KKzB4QUQJMHgwMEFECSMJU09GVCBIWVBIRU4KKzB4QUUJMHgwMEFFCSMJUkVHSVNURVJFRCBTSUdOCisweEFGCTB4MDBDNgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEFFCisweEIwCTB4MDBCMAkjCURFR1JFRSBTSUdOCisweEIxCTB4MDBCMQkjCVBMVVMtTUlOVVMgU0lHTgorMHhCMgkweDAwQjIJIwlTVVBFUlNDUklQVCBUV08KKzB4QjMJMHgwMEIzCSMJU1VQRVJTQ1JJUFQgVEhSRUUKKzB4QjQJMHgyMDFDCSMJTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKzB4QjUJMHgwMEI1CSMJTUlDUk8gU0lHTgorMHhCNgkweDAwQjYJIwlQSUxDUk9XIFNJR04KKzB4QjcJMHgwMEI3CSMJTUlERExFIERPVAorMHhCOAkweDAwRjgJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhCOQkweDAwQjkJIwlTVVBFUlNDUklQVCBPTkUKKzB4QkEJMHgwMTU3CSMJTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisweEJCCTB4MDBCQgkjCVJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDAwQkMJIwlWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKzB4QkQJMHgwMEJECSMJVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisweEJFCTB4MDBCRQkjCVZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworMHhCRgkweDAwRTYJIwlMQVRJTiBTTUFMTCBMRVRURVIgQUUKKzB4QzAJMHgwMTA0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworMHhDMQkweDAxMkUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLCisweEMyCTB4MDEwMAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBNQUNST04KKzB4QzMJMHgwMTA2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEFDVVRFCisweEM0CTB4MDBDNAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4QzUJMHgwMEM1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4QzYJMHgwMTE4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhDNwkweDAxMTIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisweEM4CTB4MDEwQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorMHhDOQkweDAwQzkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4Q0EJMHgwMTc5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisweENCCTB4MDExNgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKzB4Q0MJMHgwMTIyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKzB4Q0QJMHgwMTM2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKzB4Q0UJMHgwMTJBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorMHhDRgkweDAxM0IJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorMHhEMAkweDAxNjAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4RDEJMHgwMTQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisweEQyCTB4MDE0NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisweEQzCTB4MDBEMwkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhENAkweDAxNEMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OCisweEQ1CTB4MDBENQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhENgkweDAwRDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEQ3CTB4MDBENwkjCU1VTFRJUExJQ0FUSU9OIFNJR04KKzB4RDgJMHgwMTcyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE9HT05FSworMHhEOQkweDAxNDEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisweERBCTB4MDE1QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorMHhEQgkweDAxNkEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OCisweERDCTB4MDBEQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMTdCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorMHhERQkweDAxN0QJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4REYJMHgwMERGCSMJTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdlcm1hbikKKzB4RTAJMHgwMTA1CSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKzB4RTEJMHgwMTJGCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKzB4RTIJMHgwMTAxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04KKzB4RTMJMHgwMTA3CSMJTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorMHhFNAkweDAwRTQJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhFNQkweDAwRTUJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4RTYJMHgwMTE5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKzB4RTcJMHgwMTEzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBNQUNST04KKzB4RTgJMHgwMTBECSMJTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorMHhFOQkweDAwRTkJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweEVBCTB4MDE3QQkjCUxBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKzB4RUIJMHgwMTE3CSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKzB4RUMJMHgwMTIzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisweEVECTB4MDEzNwkjCUxBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorMHhFRQkweDAxMkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorMHhFRgkweDAxM0MJIwlMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKzB4RjAJMHgwMTYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorMHhGMQkweDAxNDQJIwlMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisweEYyCTB4MDE0NgkjCUxBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorMHhGMwkweDAwRjMJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweEY0CTB4MDE0RAkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisweEY1CTB4MDBGNQkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKzB4RjYJMHgwMEY2CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4RjcJMHgwMEY3CSMJRElWSVNJT04gU0lHTgorMHhGOAkweDAxNzMJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE9HT05FSworMHhGOQkweDAxNDIJIwlMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorMHhGQQkweDAxNUIJIwlMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisweEZCCTB4MDE2QgkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OCisweEZDCTB4MDBGQwkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisweEZECTB4MDE3QwkjCUxBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisweEZFCTB4MDE3RQkjCUxBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4RkYJMHgyMDE5CSMJUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9pc284ODU5LTE0LnR4dCBiL2NvZGVwYWdlL2lzbzg4NTktMTQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTk4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9pc284ODU5LTE0LnR4dApAQCAtMCwwICsxLDMwMSBAQAorIworIwlOYW1lOiAgICAgICAgICAgICBJU08vSUVDIDg4NTktMTQ6MTk5OCB0byBVbmljb2RlCisjCVVuaWNvZGUgdmVyc2lvbjogIDMuMAorIwlUYWJsZSB2ZXJzaW9uOiAgICAxLjAKKyMJVGFibGUgZm9ybWF0OiAgICAgRm9ybWF0IEEKKyMJRGF0ZTogICAgICAgICAgICAgMTk5OSBKdWx5IDI3CisjCUF1dGhvcnM6ICAgICAgICAgIE1hcmt1cyBLdWhuIDxodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvPgorIwkJCSAgS2VuIFdoaXN0bGVyIDxrZW53QHN5YmFzZS5jb20+CisjCisjCUNvcHlyaWdodCAoYykgMTk5OCAtIDE5OTkgVW5pY29kZSwgSW5jLiAgQWxsIFJpZ2h0cyByZXNlcnZlZC4KKyMKKyMJVGhpcyBmaWxlIGlzIHByb3ZpZGVkIGFzLWlzIGJ5IFVuaWNvZGUsIEluYy4gKFRoZSBVbmljb2RlIENvbnNvcnRpdW0pLgorIwlObyBjbGFpbXMgYXJlIG1hZGUgYXMgdG8gZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gIE5vCisjCXdhcnJhbnRpZXMgb2YgYW55IGtpbmQgYXJlIGV4cHJlc3NlZCBvciBpbXBsaWVkLiAgVGhlIHJlY2lwaWVudAorIwlhZ3JlZXMgdG8gZGV0ZXJtaW5lIGFwcGxpY2FiaWxpdHkgb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQuICBJZiB0aGlzCisjCWZpbGUgaGFzIGJlZW4gcHJvdmlkZWQgb24gb3B0aWNhbCBtZWRpYSBieSBVbmljb2RlLCBJbmMuLCB0aGUgc29sZQorIwlyZW1lZHkgZm9yIGFueSBjbGFpbSB3aWxsIGJlIGV4Y2hhbmdlIG9mIGRlZmVjdGl2ZSBtZWRpYSB3aXRoaW4gOTAKKyMJZGF5cyBvZiByZWNlaXB0LgorIworIwlVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCisjCXN1cHBsaWVkIGluIHRoaXMgZmlsZSBpbiB0aGUgY3JlYXRpb24gb2YgcHJvZHVjdHMgc3VwcG9ydGluZyB0aGUKKyMJVW5pY29kZSBTdGFuZGFyZCwgYW5kIHRvIG1ha2UgY29waWVzIG9mIHRoaXMgZmlsZSBpbiBhbnkgZm9ybSBmb3IKKyMJaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgcmVtYWlucworIwlhdHRhY2hlZC4KKyMKKyMJR2VuZXJhbCBub3RlczoKKyMKKyMJVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGF0YSB0aGUgVW5pY29kZSBDb25zb3J0aXVtIGhhcyBvbiBob3cKKyMgICAgICAgSVNPL0lFQyA4ODU5LTE0OjE5OTggY2hhcmFjdGVycyBtYXAgaW50byBVbmljb2RlLgorIworIwlGb3JtYXQ6ICBUaHJlZSB0YWItc2VwYXJhdGVkIGNvbHVtbnMKKyMJCSBDb2x1bW4gIzEgaXMgdGhlIElTTy9JRUMgODg1OS0xNCBjb2RlIChpbiBoZXggYXMgMHhYWCkKKyMJCSBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjCQkgQ29sdW1uICMzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMJVGhlIGVudHJpZXMgYXJlIGluIElTTy9JRUMgODg1OS0xNCBvcmRlci4KKyMKKyMJVXBkYXRlZCB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgbWF5IGJlIGZvdW5kIGluOgorIwkJPGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvPgorIworIwlBbnkgY29tbWVudHMgb3IgcHJvYmxlbXMsIGNvbnRhY3QgPGVycmF0YUB1bmljb2RlLm9yZz4KKyMJUGxlYXNlIG5vdGUgdGhhdCA8ZXJyYXRhQHVuaWNvZGUub3JnPiBpcyBhbiBhcmNoaXZhbCBhZGRyZXNzOworIwlub3RpY2VzIHdpbGwgYmUgY2hlY2tlZCwgYnV0IGRvIG5vdCBleHBlY3QgYW4gaW1tZWRpYXRlIHJlc3BvbnNlLgorIworMHgwMAkweDAwMDAJIwlOVUxMCisweDAxCTB4MDAwMQkjCVNUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSMJU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJIwlFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJIwlFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjCUVOUVVJUlkKKzB4MDYJMHgwMDA2CSMJQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSMJQkVMTAorMHgwOAkweDAwMDgJIwlCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSMJSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBBCTB4MDAwQQkjCUxJTkUgRkVFRAorMHgwQgkweDAwMEIJIwlWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBDCTB4MDAwQwkjCUZPUk0gRkVFRAorMHgwRAkweDAwMEQJIwlDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSMJU0hJRlQgT1VUCisweDBGCTB4MDAwRgkjCVNISUZUIElOCisweDEwCTB4MDAxMAkjCURBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSMJREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjCURFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJIwlERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJIwlERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjCU5FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjCVNZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSMJRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJIwlDQU5DRUwKKzB4MTkJMHgwMDE5CSMJRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJIwlTVUJTVElUVVRFCisweDFCCTB4MDAxQgkjCUVTQ0FQRQorMHgxQwkweDAwMUMJIwlGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJIwlHUk9VUCBTRVBBUkFUT1IKKzB4MUUJMHgwMDFFCSMJUkVDT1JEIFNFUEFSQVRPUgorMHgxRgkweDAwMUYJIwlVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJIwlTUEFDRQorMHgyMQkweDAwMjEJIwlFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjCVFVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjCU5VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjCURPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjCVBFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJIwlBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSMJQVBPU1RST1BIRQorMHgyOAkweDAwMjgJIwlMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjCVJJR0hUIFBBUkVOVEhFU0lTCisweDJBCTB4MDAyQQkjCUFTVEVSSVNLCisweDJCCTB4MDAyQgkjCVBMVVMgU0lHTgorMHgyQwkweDAwMkMJIwlDT01NQQorMHgyRAkweDAwMkQJIwlIWVBIRU4tTUlOVVMKKzB4MkUJMHgwMDJFCSMJRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjCVNPTElEVVMKKzB4MzAJMHgwMDMwCSMJRElHSVQgWkVSTworMHgzMQkweDAwMzEJIwlESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSMJRElHSVQgVFdPCisweDMzCTB4MDAzMwkjCURJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjCURJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSMJRElHSVQgRklWRQorMHgzNgkweDAwMzYJIwlESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSMJRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSMJRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSMJRElHSVQgTklORQorMHgzQQkweDAwM0EJIwlDT0xPTgorMHgzQgkweDAwM0IJIwlTRU1JQ09MT04KKzB4M0MJMHgwMDNDCSMJTEVTUy1USEFOIFNJR04KKzB4M0QJMHgwMDNECSMJRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSMJR1JFQVRFUi1USEFOIFNJR04KKzB4M0YJMHgwMDNGCSMJUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJIwlDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NEIJMHgwMDRCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0QwkweDAwNEMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NEUJMHgwMDRFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0RgkweDAwNEYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NUEJMHgwMDVBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1QgkweDAwNUIJIwlMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjCVJFVkVSU0UgU09MSURVUworMHg1RAkweDAwNUQJIwlSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1RQkweDAwNUUJIwlDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJIwlMT1cgTElORQorMHg2MAkweDAwNjAJIwlHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSMJTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSMJTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSMJTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSMJTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSMJTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NkEJMHgwMDZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSMJTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NkMJMHgwMDZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NkQJMHgwMDZECSMJTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSMJTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NkYJMHgwMDZGCSMJTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSMJTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSMJTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSMJTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSMJTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSMJTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSMJTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSMJTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSMJTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N0IJMHgwMDdCCSMJTEVGVCBDVVJMWSBCUkFDS0VUCisweDdDCTB4MDA3QwkjCVZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSMJUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3RQkweDAwN0UJIwlUSUxERQorMHg3RgkweDAwN0YJIwlERUxFVEUKKzB4ODAJMHgwMDgwCSMJPGNvbnRyb2w+CisweDgxCTB4MDA4MQkjCTxjb250cm9sPgorMHg4MgkweDAwODIJIwk8Y29udHJvbD4KKzB4ODMJMHgwMDgzCSMJPGNvbnRyb2w+CisweDg0CTB4MDA4NAkjCTxjb250cm9sPgorMHg4NQkweDAwODUJIwk8Y29udHJvbD4KKzB4ODYJMHgwMDg2CSMJPGNvbnRyb2w+CisweDg3CTB4MDA4NwkjCTxjb250cm9sPgorMHg4OAkweDAwODgJIwk8Y29udHJvbD4KKzB4ODkJMHgwMDg5CSMJPGNvbnRyb2w+CisweDhBCTB4MDA4QQkjCTxjb250cm9sPgorMHg4QgkweDAwOEIJIwk8Y29udHJvbD4KKzB4OEMJMHgwMDhDCSMJPGNvbnRyb2w+CisweDhECTB4MDA4RAkjCTxjb250cm9sPgorMHg4RQkweDAwOEUJIwk8Y29udHJvbD4KKzB4OEYJMHgwMDhGCSMJPGNvbnRyb2w+CisweDkwCTB4MDA5MAkjCTxjb250cm9sPgorMHg5MQkweDAwOTEJIwk8Y29udHJvbD4KKzB4OTIJMHgwMDkyCSMJPGNvbnRyb2w+CisweDkzCTB4MDA5MwkjCTxjb250cm9sPgorMHg5NAkweDAwOTQJIwk8Y29udHJvbD4KKzB4OTUJMHgwMDk1CSMJPGNvbnRyb2w+CisweDk2CTB4MDA5NgkjCTxjb250cm9sPgorMHg5NwkweDAwOTcJIwk8Y29udHJvbD4KKzB4OTgJMHgwMDk4CSMJPGNvbnRyb2w+CisweDk5CTB4MDA5OQkjCTxjb250cm9sPgorMHg5QQkweDAwOUEJIwk8Y29udHJvbD4KKzB4OUIJMHgwMDlCCSMJPGNvbnRyb2w+CisweDlDCTB4MDA5QwkjCTxjb250cm9sPgorMHg5RAkweDAwOUQJIwk8Y29udHJvbD4KKzB4OUUJMHgwMDlFCSMJPGNvbnRyb2w+CisweDlGCTB4MDA5RgkjCTxjb250cm9sPgorMHhBMAkweDAwQTAJIwlOTy1CUkVBSyBTUEFDRQorMHhBMQkweDFFMDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggRE9UIEFCT1ZFCisweEEyCTB4MUUwMwkjCUxBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggRE9UIEFCT1ZFCisweEEzCTB4MDBBMwkjCVBPVU5EIFNJR04KKzB4QTQJMHgwMTBBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRQorMHhBNQkweDAxMEIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRQorMHhBNgkweDFFMEEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggRE9UIEFCT1ZFCisweEE3CTB4MDBBNwkjCVNFQ1RJT04gU0lHTgorMHhBOAkweDFFODAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggR1JBVkUKKzB4QTkJMHgwMEE5CSMJQ09QWVJJR0hUIFNJR04KKzB4QUEJMHgxRTgyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEFDVVRFCisweEFCCTB4MUUwQgkjCUxBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggRE9UIEFCT1ZFCisweEFDCTB4MUVGMgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBHUkFWRQorMHhBRAkweDAwQUQJIwlTT0ZUIEhZUEhFTgorMHhBRQkweDAwQUUJIwlSRUdJU1RFUkVEIFNJR04KKzB4QUYJMHgwMTc4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworMHhCMAkweDFFMUUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFCisweEIxCTB4MUUxRgkjCUxBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFCisweEIyCTB4MDEyMAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkUKKzB4QjMJMHgwMTIxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkUKKzB4QjQJMHgxRTQwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRQorMHhCNQkweDFFNDEJIwlMQVRJTiBTTUFMTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRQorMHhCNgkweDAwQjYJIwlQSUxDUk9XIFNJR04KKzB4QjcJMHgxRTU2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUCBXSVRIIERPVCBBQk9WRQorMHhCOAkweDFFODEJIwlMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEdSQVZFCisweEI5CTB4MUU1NwkjCUxBVElOIFNNQUxMIExFVFRFUiBQIFdJVEggRE9UIEFCT1ZFCisweEJBCTB4MUU4MwkjCUxBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggQUNVVEUKKzB4QkIJMHgxRTYwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRQorMHhCQwkweDFFRjMJIwlMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEdSQVZFCisweEJECTB4MUU4NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBESUFFUkVTSVMKKzB4QkUJMHgxRTg1CSMJTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBESUFFUkVTSVMKKzB4QkYJMHgxRTYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBET1QgQUJPVkUKKzB4QzAJMHgwMEMwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweEMxCTB4MDBDMQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhDMgkweDAwQzIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhDMwkweDAwQzMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKzB4QzQJMHgwMEM0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhDNQkweDAwQzUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorMHhDNgkweDAwQzYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBRQorMHhDNwkweDAwQzcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHhDOAkweDAwQzgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKzB4QzkJMHgwMEM5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisweENBCTB4MDBDQQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweENCCTB4MDBDQgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4Q0MJMHgwMENDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisweENECTB4MDBDRAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorMHhDRQkweDAwQ0UJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorMHhDRgkweDAwQ0YJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisweEQwCTB4MDE3NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYCisweEQxCTB4MDBEMQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorMHhEMgkweDAwRDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4RDMJMHgwMEQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweEQ0CTB4MDBENAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweEQ1CTB4MDBENQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhENgkweDAwRDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEQ3CTB4MUU2QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkUKKzB4RDgJMHgwMEQ4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhEOQkweDAwRDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4REEJMHgwMERBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweERCCTB4MDBEQgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweERDCTB4MDBEQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMERECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisweERFCTB4MDE3NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBDSVJDVU1GTEVYCisweERGCTB4MDBERgkjCUxBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweEUwCTB4MDBFMAkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4RTEJMHgwMEUxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhFMgkweDAwRTIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwMEUzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhFNAkweDAwRTQJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhFNQkweDAwRTUJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4RTYJMHgwMEU2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEFFCisweEU3CTB4MDBFNwkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHhFOAkweDAwRTgJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEU5CTB4MDBFOQkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4RUEJMHgwMEVBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweEVCCTB4MDBFQgkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweEVDCTB4MDBFQwkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4RUQJMHgwMEVECSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorMHhFRQkweDAwRUUJIwlMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4RUYJMHgwMEVGCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4RjAJMHgwMTc1CSMJTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYCisweEYxCTB4MDBGMQkjCUxBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKzB4RjIJMHgwMEYyCSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorMHhGMwkweDAwRjMJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweEY0CTB4MDBGNAkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorMHhGNQkweDAwRjUJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisweEY2CTB4MDBGNgkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEY3CTB4MUU2QgkjCUxBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRE9UIEFCT1ZFCisweEY4CTB4MDBGOAkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisweEY5CTB4MDBGOQkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4RkEJMHgwMEZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAwRkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKzB4RkMJMHgwMEZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4RkQJMHgwMEZECSMJTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorMHhGRQkweDAxNzcJIwlMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIENJUkNVTUZMRVgKKzB4RkYJMHgwMEZGCSMJTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKwpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvaXNvODg1OS0xNS50eHQgYi9jb2RlcGFnZS9pc284ODU5LTE1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjJmMzJmCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvaXNvODg1OS0xNS50eHQKQEAgLTAsMCArMSwzMDMgQEAKKyMKKyMJTmFtZTogICAgICAgICAgICAgSVNPL0lFQyA4ODU5LTE1OjE5OTkgdG8gVW5pY29kZQorIwlVbmljb2RlIHZlcnNpb246ICAzLjAKKyMJVGFibGUgdmVyc2lvbjogICAgMS4wCisjCVRhYmxlIGZvcm1hdDogICAgIEZvcm1hdCBBCisjCURhdGU6ICAgICAgICAgICAgIDE5OTkgSnVseSAyNworIwlBdXRob3JzOiAgICAgICAgICBNYXJrdXMgS3VobiA8aHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1Lz4KKyMJCQkgIEtlbiBXaGlzdGxlciA8a2Vud0BzeWJhc2UuY29tPgorIworIwlDb3B5cmlnaHQgKGMpIDE5OTggLSAxOTk5IFVuaWNvZGUsIEluYy4gIEFsbCBSaWdodHMgcmVzZXJ2ZWQuCisjCisjCVRoaXMgZmlsZSBpcyBwcm92aWRlZCBhcy1pcyBieSBVbmljb2RlLCBJbmMuIChUaGUgVW5pY29kZSBDb25zb3J0aXVtKS4KKyMJTm8gY2xhaW1zIGFyZSBtYWRlIGFzIHRvIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBObworIwl3YXJyYW50aWVzIG9mIGFueSBraW5kIGFyZSBleHByZXNzZWQgb3IgaW1wbGllZC4gIFRoZSByZWNpcGllbnQKKyMJYWdyZWVzIHRvIGRldGVybWluZSBhcHBsaWNhYmlsaXR5IG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkLiAgSWYgdGhpcworIwlmaWxlIGhhcyBiZWVuIHByb3ZpZGVkIG9uIG9wdGljYWwgbWVkaWEgYnkgVW5pY29kZSwgSW5jLiwgdGhlIHNvbGUKKyMJcmVtZWR5IGZvciBhbnkgY2xhaW0gd2lsbCBiZSBleGNoYW5nZSBvZiBkZWZlY3RpdmUgbWVkaWEgd2l0aGluIDkwCisjCWRheXMgb2YgcmVjZWlwdC4KKyMKKyMJVW5pY29kZSwgSW5jLiBoZXJlYnkgZ3JhbnRzIHRoZSByaWdodCB0byBmcmVlbHkgdXNlIHRoZSBpbmZvcm1hdGlvbgorIwlzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCisjCVVuaWNvZGUgU3RhbmRhcmQsIGFuZCB0byBtYWtlIGNvcGllcyBvZiB0aGlzIGZpbGUgaW4gYW55IGZvcm0gZm9yCisjCWludGVybmFsIG9yIGV4dGVybmFsIGRpc3RyaWJ1dGlvbiBhcyBsb25nIGFzIHRoaXMgbm90aWNlIHJlbWFpbnMKKyMJYXR0YWNoZWQuCisjCisjCUdlbmVyYWwgbm90ZXM6CisjCisjCVRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRhdGEgdGhlIFVuaWNvZGUgQ29uc29ydGl1bSBoYXMgb24gaG93CisjICAgICAgIElTTy9JRUMgODg1OS0xNToxOTk5IGNoYXJhY3RlcnMgbWFwIGludG8gVW5pY29kZS4KKyMKKyMJRm9ybWF0OiAgVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjCQkgQ29sdW1uICMxIGlzIHRoZSBJU08vSUVDIDg4NTktMTUgY29kZSAoaW4gaGV4IGFzIDB4WFgpCisjCQkgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIwkJIENvbHVtbiAjMyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjCVRoZSBlbnRyaWVzIGFyZSBpbiBJU08vSUVDIDg4NTktMTUgb3JkZXIuCisjCisjCVZlcnNpb24gaGlzdG9yeQorIworIwlVcGRhdGVkIHZlcnNpb25zIG9mIHRoaXMgZmlsZSBtYXkgYmUgZm91bmQgaW46CisjCQk8ZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy8+CisjCisjCUFueSBjb21tZW50cyBvciBwcm9ibGVtcywgY29udGFjdCA8ZXJyYXRhQHVuaWNvZGUub3JnPgorIwlQbGVhc2Ugbm90ZSB0aGF0IDxlcnJhdGFAdW5pY29kZS5vcmc+IGlzIGFuIGFyY2hpdmFsIGFkZHJlc3M7CisjCW5vdGljZXMgd2lsbCBiZSBjaGVja2VkLCBidXQgZG8gbm90IGV4cGVjdCBhbiBpbW1lZGlhdGUgcmVzcG9uc2UuCisjCisweDAwCTB4MDAwMAkjCU5VTEwKKzB4MDEJMHgwMDAxCSMJU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJIwlTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjCUVORCBPRiBURVhUCisweDA0CTB4MDAwNAkjCUVORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSMJRU5RVUlSWQorMHgwNgkweDAwMDYJIwlBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJIwlCRUxMCisweDA4CTB4MDAwOAkjCUJBQ0tTUEFDRQorMHgwOQkweDAwMDkJIwlIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MEEJMHgwMDBBCSMJTElORSBGRUVECisweDBCCTB4MDAwQgkjCVZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSMJRk9STSBGRUVECisweDBECTB4MDAwRAkjCUNBUlJJQUdFIFJFVFVSTgorMHgwRQkweDAwMEUJIwlTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSMJU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSMJREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJIwlERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSMJREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjCURFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjCURFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSMJTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSMJU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJIwlFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjCUNBTkNFTAorMHgxOQkweDAwMTkJIwlFTkQgT0YgTUVESVVNCisweDFBCTB4MDAxQQkjCVNVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSMJRVNDQVBFCisweDFDCTB4MDAxQwkjCUZJTEUgU0VQQVJBVE9SCisweDFECTB4MDAxRAkjCUdST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJIwlSRUNPUkQgU0VQQVJBVE9SCisweDFGCTB4MDAxRgkjCVVOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjCVNQQUNFCisweDIxCTB4MDAyMQkjCUVYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSMJUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSMJTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSMJRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSMJUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjCUFNUEVSU0FORAorMHgyNwkweDAwMjcJIwlBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjCUxFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSMJUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSMJQVNURVJJU0sKKzB4MkIJMHgwMDJCCSMJUExVUyBTSUdOCisweDJDCTB4MDAyQwkjCUNPTU1BCisweDJECTB4MDAyRAkjCUhZUEhFTi1NSU5VUworMHgyRQkweDAwMkUJIwlGVUxMIFNUT1AKKzB4MkYJMHgwMDJGCSMJU09MSURVUworMHgzMAkweDAwMzAJIwlESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjCURJR0lUIE9ORQorMHgzMgkweDAwMzIJIwlESUdJVCBUV08KKzB4MzMJMHgwMDMzCSMJRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSMJRElHSVQgRk9VUgorMHgzNQkweDAwMzUJIwlESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjCURJR0lUIFNJWAorMHgzNwkweDAwMzcJIwlESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJIwlESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJIwlESUdJVCBOSU5FCisweDNBCTB4MDAzQQkjCUNPTE9OCisweDNCCTB4MDAzQgkjCVNFTUlDT0xPTgorMHgzQwkweDAwM0MJIwlMRVNTLVRIQU4gU0lHTgorMHgzRAkweDAwM0QJIwlFUVVBTFMgU0lHTgorMHgzRQkweDAwM0UJIwlHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJIwlRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjCUNPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NEEJMHgwMDRBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRDCTB4MDA0QwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NEQJMHgwMDRECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRGCTB4MDA0RgkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDVCCTB4MDA1QgkjCUxFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NUMJMHgwMDVDCSMJUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjCVJJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVFCTB4MDA1RQkjCUNJUkNVTUZMRVggQUNDRU5UCisweDVGCTB4MDA1RgkjCUxPVyBMSU5FCisweDYwCTB4MDA2MAkjCUdSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJIwlMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJIwlMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJIwlMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJIwlMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJIwlMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJIwlMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJIwlMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJIwlMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2QQkweDAwNkEJIwlMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2QgkweDAwNkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJIwlMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2RAkweDAwNkQJIwlMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2RQkweDAwNkUJIwlMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJIwlMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJIwlMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJIwlMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJIwlMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJIwlMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJIwlMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJIwlMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJIwlMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJIwlMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJIwlMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJIwlMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3QQkweDAwN0EJIwlMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJIwlMRUZUIENVUkxZIEJSQUNLRVQKKzB4N0MJMHgwMDdDCSMJVkVSVElDQUwgTElORQorMHg3RAkweDAwN0QJIwlSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjCVRJTERFCisweDdGCTB4MDA3RgkjCURFTEVURQorMHg4MAkweDAwODAJIwk8Y29udHJvbD4KKzB4ODEJMHgwMDgxCSMJPGNvbnRyb2w+CisweDgyCTB4MDA4MgkjCTxjb250cm9sPgorMHg4MwkweDAwODMJIwk8Y29udHJvbD4KKzB4ODQJMHgwMDg0CSMJPGNvbnRyb2w+CisweDg1CTB4MDA4NQkjCTxjb250cm9sPgorMHg4NgkweDAwODYJIwk8Y29udHJvbD4KKzB4ODcJMHgwMDg3CSMJPGNvbnRyb2w+CisweDg4CTB4MDA4OAkjCTxjb250cm9sPgorMHg4OQkweDAwODkJIwk8Y29udHJvbD4KKzB4OEEJMHgwMDhBCSMJPGNvbnRyb2w+CisweDhCCTB4MDA4QgkjCTxjb250cm9sPgorMHg4QwkweDAwOEMJIwk8Y29udHJvbD4KKzB4OEQJMHgwMDhECSMJPGNvbnRyb2w+CisweDhFCTB4MDA4RQkjCTxjb250cm9sPgorMHg4RgkweDAwOEYJIwk8Y29udHJvbD4KKzB4OTAJMHgwMDkwCSMJPGNvbnRyb2w+CisweDkxCTB4MDA5MQkjCTxjb250cm9sPgorMHg5MgkweDAwOTIJIwk8Y29udHJvbD4KKzB4OTMJMHgwMDkzCSMJPGNvbnRyb2w+CisweDk0CTB4MDA5NAkjCTxjb250cm9sPgorMHg5NQkweDAwOTUJIwk8Y29udHJvbD4KKzB4OTYJMHgwMDk2CSMJPGNvbnRyb2w+CisweDk3CTB4MDA5NwkjCTxjb250cm9sPgorMHg5OAkweDAwOTgJIwk8Y29udHJvbD4KKzB4OTkJMHgwMDk5CSMJPGNvbnRyb2w+CisweDlBCTB4MDA5QQkjCTxjb250cm9sPgorMHg5QgkweDAwOUIJIwk8Y29udHJvbD4KKzB4OUMJMHgwMDlDCSMJPGNvbnRyb2w+CisweDlECTB4MDA5RAkjCTxjb250cm9sPgorMHg5RQkweDAwOUUJIwk8Y29udHJvbD4KKzB4OUYJMHgwMDlGCSMJPGNvbnRyb2w+CisweEEwCTB4MDBBMAkjCU5PLUJSRUFLIFNQQUNFCisweEExCTB4MDBBMQkjCUlOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKzB4QTIJMHgwMEEyCSMJQ0VOVCBTSUdOCisweEEzCTB4MDBBMwkjCVBPVU5EIFNJR04KKzB4QTQJMHgyMEFDCSMJRVVSTyBTSUdOCisweEE1CTB4MDBBNQkjCVlFTiBTSUdOCisweEE2CTB4MDE2MAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorMHhBNwkweDAwQTcJIwlTRUNUSU9OIFNJR04KKzB4QTgJMHgwMTYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorMHhBOQkweDAwQTkJIwlDT1BZUklHSFQgU0lHTgorMHhBQQkweDAwQUEJIwlGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorMHhBQgkweDAwQUIJIwlMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhBQwkweDAwQUMJIwlOT1QgU0lHTgorMHhBRAkweDAwQUQJIwlTT0ZUIEhZUEhFTgorMHhBRQkweDAwQUUJIwlSRUdJU1RFUkVEIFNJR04KKzB4QUYJMHgwMEFGCSMJTUFDUk9OCisweEIwCTB4MDBCMAkjCURFR1JFRSBTSUdOCisweEIxCTB4MDBCMQkjCVBMVVMtTUlOVVMgU0lHTgorMHhCMgkweDAwQjIJIwlTVVBFUlNDUklQVCBUV08KKzB4QjMJMHgwMEIzCSMJU1VQRVJTQ1JJUFQgVEhSRUUKKzB4QjQJMHgwMTdECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisweEI1CTB4MDBCNQkjCU1JQ1JPIFNJR04KKzB4QjYJMHgwMEI2CSMJUElMQ1JPVyBTSUdOCisweEI3CTB4MDBCNwkjCU1JRERMRSBET1QKKzB4QjgJMHgwMTdFCSMJTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorMHhCOQkweDAwQjkJIwlTVVBFUlNDUklQVCBPTkUKKzB4QkEJMHgwMEJBCSMJTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisweEJCCTB4MDBCQgkjCVJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDAxNTIJIwlMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisweEJECTB4MDE1MwkjCUxBVElOIFNNQUxMIExJR0FUVVJFIE9FCisweEJFCTB4MDE3OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKzB4QkYJMHgwMEJGCSMJSU5WRVJURUQgUVVFU1RJT04gTUFSSworMHhDMAkweDAwQzAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4QzEJMHgwMEMxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisweEMyCTB4MDBDMgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweEMzCTB4MDBDMwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhDNAkweDAwQzQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweEM1CTB4MDBDNQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisweEM2CTB4MDBDNgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEFFCisweEM3CTB4MDBDNwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweEM4CTB4MDBDOAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorMHhDOQkweDAwQzkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4Q0EJMHgwMENBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKzB4Q0IJMHgwMENCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworMHhDQwkweDAwQ0MJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4Q0QJMHgwMENECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweENFCTB4MDBDRQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisweENGCTB4MDBDRgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4RDAJMHgwMEQwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisweEQxCTB4MDBEMQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorMHhEMgkweDAwRDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4RDMJMHgwMEQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweEQ0CTB4MDBENAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweEQ1CTB4MDBENQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhENgkweDAwRDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEQ3CTB4MDBENwkjCU1VTFRJUExJQ0FUSU9OIFNJR04KKzB4RDgJMHgwMEQ4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorMHhEOQkweDAwRDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4REEJMHgwMERBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweERCCTB4MDBEQgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweERDCTB4MDBEQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMERECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisweERFCTB4MDBERQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisweERGCTB4MDBERgkjCUxBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweEUwCTB4MDBFMAkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4RTEJMHgwMEUxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhFMgkweDAwRTIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwMEUzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhFNAkweDAwRTQJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhFNQkweDAwRTUJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4RTYJMHgwMEU2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEFFCisweEU3CTB4MDBFNwkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHhFOAkweDAwRTgJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEU5CTB4MDBFOQkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4RUEJMHgwMEVBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweEVCCTB4MDBFQgkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweEVDCTB4MDBFQwkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4RUQJMHgwMEVECSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorMHhFRQkweDAwRUUJIwlMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4RUYJMHgwMEVGCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4RjAJMHgwMEYwCSMJTEFUSU4gU01BTEwgTEVUVEVSIEVUSAorMHhGMQkweDAwRjEJIwlMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisweEYyCTB4MDBGMgkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4RjMJMHgwMEYzCSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhGNAkweDAwRjQJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RjUJMHgwMEY1CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhGNgkweDAwRjYJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHhGNwkweDAwRjcJIwlESVZJU0lPTiBTSUdOCisweEY4CTB4MDBGOAkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisweEY5CTB4MDBGOQkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4RkEJMHgwMEZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAwRkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKzB4RkMJMHgwMEZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4RkQJMHgwMEZECSMJTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorMHhGRQkweDAwRkUJIwlMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4KKzB4RkYJMHgwMEZGCSMJTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKwpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvaXNvODg1OS0xNi50eHQgYi9jb2RlcGFnZS9pc284ODU5LTE2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRjZjBkCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvaXNvODg1OS0xNi50eHQKQEAgLTAsMCArMSwyOTkgQEAKKyMKKyMJTmFtZTogICAgICAgICAgICAgSVNPL0lFQyA4ODU5LTE2OjIwMDEgdG8gVW5pY29kZQorIwlVbmljb2RlIHZlcnNpb246ICAzLjAKKyMJVGFibGUgdmVyc2lvbjogICAgMS4wCisjCVRhYmxlIGZvcm1hdDogICAgIEZvcm1hdCBBCisjCURhdGU6ICAgICAgICAgICAgIDIwMDEgSnVseSAyNgorIwlBdXRob3JzOiAgICAgICAgICBNYXJrdXMgS3VobiA8aHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1Lz4KKyMKKyMJQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVW5pY29kZSwgSW5jLiAgQWxsIFJpZ2h0cyByZXNlcnZlZC4KKyMKKyMJVGhpcyBmaWxlIGlzIHByb3ZpZGVkIGFzLWlzIGJ5IFVuaWNvZGUsIEluYy4gKFRoZSBVbmljb2RlIENvbnNvcnRpdW0pLgorIwlObyBjbGFpbXMgYXJlIG1hZGUgYXMgdG8gZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gIE5vCisjCXdhcnJhbnRpZXMgb2YgYW55IGtpbmQgYXJlIGV4cHJlc3NlZCBvciBpbXBsaWVkLiAgVGhlIHJlY2lwaWVudAorIwlhZ3JlZXMgdG8gZGV0ZXJtaW5lIGFwcGxpY2FiaWxpdHkgb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQuICBJZiB0aGlzCisjCWZpbGUgaGFzIGJlZW4gcHJvdmlkZWQgb24gb3B0aWNhbCBtZWRpYSBieSBVbmljb2RlLCBJbmMuLCB0aGUgc29sZQorIwlyZW1lZHkgZm9yIGFueSBjbGFpbSB3aWxsIGJlIGV4Y2hhbmdlIG9mIGRlZmVjdGl2ZSBtZWRpYSB3aXRoaW4gOTAKKyMJZGF5cyBvZiByZWNlaXB0LgorIworIwlVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCisjCXN1cHBsaWVkIGluIHRoaXMgZmlsZSBpbiB0aGUgY3JlYXRpb24gb2YgcHJvZHVjdHMgc3VwcG9ydGluZyB0aGUKKyMJVW5pY29kZSBTdGFuZGFyZCwgYW5kIHRvIG1ha2UgY29waWVzIG9mIHRoaXMgZmlsZSBpbiBhbnkgZm9ybSBmb3IKKyMJaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgcmVtYWlucworIwlhdHRhY2hlZC4KKyMKKyMJR2VuZXJhbCBub3RlczoKKyMKKyMJVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGF0YSB0aGUgVW5pY29kZSBDb25zb3J0aXVtIGhhcyBvbiBob3cKKyMgICAgICAgSVNPL0lFQyA4ODU5LTE2OjIwMDEgY2hhcmFjdGVycyBtYXAgaW50byBVbmljb2RlLgorIworIwlGb3JtYXQ6ICBUaHJlZSB0YWItc2VwYXJhdGVkIGNvbHVtbnMKKyMJCSBDb2x1bW4gIzEgaXMgdGhlIElTTy9JRUMgODg1OS0xNiBjb2RlIChpbiBoZXggYXMgMHhYWCkKKyMJCSBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjCQkgQ29sdW1uICMzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMJVGhlIGVudHJpZXMgYXJlIGluIElTTy9JRUMgODg1OS0xNiBvcmRlci4KKyMKKyMJVXBkYXRlZCB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgbWF5IGJlIGZvdW5kIGluOgorIwkJPGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvPgorIworIwlBbnkgY29tbWVudHMgb3IgcHJvYmxlbXMsIGNvbnRhY3QgPGVycmF0YUB1bmljb2RlLm9yZz4KKyMJUGxlYXNlIG5vdGUgdGhhdCA8ZXJyYXRhQHVuaWNvZGUub3JnPiBpcyBhbiBhcmNoaXZhbCBhZGRyZXNzOworIwlub3RpY2VzIHdpbGwgYmUgY2hlY2tlZCwgYnV0IGRvIG5vdCBleHBlY3QgYW4gaW1tZWRpYXRlIHJlc3BvbnNlLgorIworMHgwMAkweDAwMDAJIwlOVUxMCisweDAxCTB4MDAwMQkjCVNUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSMJU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJIwlFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJIwlFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjCUVOUVVJUlkKKzB4MDYJMHgwMDA2CSMJQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSMJQkVMTAorMHgwOAkweDAwMDgJIwlCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSMJSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBBCTB4MDAwQQkjCUxJTkUgRkVFRAorMHgwQgkweDAwMEIJIwlWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBDCTB4MDAwQwkjCUZPUk0gRkVFRAorMHgwRAkweDAwMEQJIwlDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSMJU0hJRlQgT1VUCisweDBGCTB4MDAwRgkjCVNISUZUIElOCisweDEwCTB4MDAxMAkjCURBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSMJREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjCURFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJIwlERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJIwlERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjCU5FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjCVNZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSMJRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJIwlDQU5DRUwKKzB4MTkJMHgwMDE5CSMJRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJIwlTVUJTVElUVVRFCisweDFCCTB4MDAxQgkjCUVTQ0FQRQorMHgxQwkweDAwMUMJIwlGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJIwlHUk9VUCBTRVBBUkFUT1IKKzB4MUUJMHgwMDFFCSMJUkVDT1JEIFNFUEFSQVRPUgorMHgxRgkweDAwMUYJIwlVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJIwlTUEFDRQorMHgyMQkweDAwMjEJIwlFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjCVFVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjCU5VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjCURPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjCVBFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJIwlBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSMJQVBPU1RST1BIRQorMHgyOAkweDAwMjgJIwlMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjCVJJR0hUIFBBUkVOVEhFU0lTCisweDJBCTB4MDAyQQkjCUFTVEVSSVNLCisweDJCCTB4MDAyQgkjCVBMVVMgU0lHTgorMHgyQwkweDAwMkMJIwlDT01NQQorMHgyRAkweDAwMkQJIwlIWVBIRU4tTUlOVVMKKzB4MkUJMHgwMDJFCSMJRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjCVNPTElEVVMKKzB4MzAJMHgwMDMwCSMJRElHSVQgWkVSTworMHgzMQkweDAwMzEJIwlESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSMJRElHSVQgVFdPCisweDMzCTB4MDAzMwkjCURJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjCURJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSMJRElHSVQgRklWRQorMHgzNgkweDAwMzYJIwlESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSMJRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSMJRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSMJRElHSVQgTklORQorMHgzQQkweDAwM0EJIwlDT0xPTgorMHgzQgkweDAwM0IJIwlTRU1JQ09MT04KKzB4M0MJMHgwMDNDCSMJTEVTUy1USEFOIFNJR04KKzB4M0QJMHgwMDNECSMJRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSMJR1JFQVRFUi1USEFOIFNJR04KKzB4M0YJMHgwMDNGCSMJUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJIwlDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NEIJMHgwMDRCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0QwkweDAwNEMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NEUJMHgwMDRFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0RgkweDAwNEYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NUEJMHgwMDVBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1QgkweDAwNUIJIwlMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjCVJFVkVSU0UgU09MSURVUworMHg1RAkweDAwNUQJIwlSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1RQkweDAwNUUJIwlDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJIwlMT1cgTElORQorMHg2MAkweDAwNjAJIwlHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSMJTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSMJTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSMJTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSMJTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSMJTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NkEJMHgwMDZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSMJTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NkMJMHgwMDZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NkQJMHgwMDZECSMJTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSMJTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NkYJMHgwMDZGCSMJTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSMJTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSMJTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSMJTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSMJTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSMJTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSMJTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSMJTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSMJTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N0IJMHgwMDdCCSMJTEVGVCBDVVJMWSBCUkFDS0VUCisweDdDCTB4MDA3QwkjCVZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSMJUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3RQkweDAwN0UJIwlUSUxERQorMHg3RgkweDAwN0YJIwlERUxFVEUKKzB4ODAJMHgwMDgwCSMJPGNvbnRyb2w+CisweDgxCTB4MDA4MQkjCTxjb250cm9sPgorMHg4MgkweDAwODIJIwk8Y29udHJvbD4KKzB4ODMJMHgwMDgzCSMJPGNvbnRyb2w+CisweDg0CTB4MDA4NAkjCTxjb250cm9sPgorMHg4NQkweDAwODUJIwk8Y29udHJvbD4KKzB4ODYJMHgwMDg2CSMJPGNvbnRyb2w+CisweDg3CTB4MDA4NwkjCTxjb250cm9sPgorMHg4OAkweDAwODgJIwk8Y29udHJvbD4KKzB4ODkJMHgwMDg5CSMJPGNvbnRyb2w+CisweDhBCTB4MDA4QQkjCTxjb250cm9sPgorMHg4QgkweDAwOEIJIwk8Y29udHJvbD4KKzB4OEMJMHgwMDhDCSMJPGNvbnRyb2w+CisweDhECTB4MDA4RAkjCTxjb250cm9sPgorMHg4RQkweDAwOEUJIwk8Y29udHJvbD4KKzB4OEYJMHgwMDhGCSMJPGNvbnRyb2w+CisweDkwCTB4MDA5MAkjCTxjb250cm9sPgorMHg5MQkweDAwOTEJIwk8Y29udHJvbD4KKzB4OTIJMHgwMDkyCSMJPGNvbnRyb2w+CisweDkzCTB4MDA5MwkjCTxjb250cm9sPgorMHg5NAkweDAwOTQJIwk8Y29udHJvbD4KKzB4OTUJMHgwMDk1CSMJPGNvbnRyb2w+CisweDk2CTB4MDA5NgkjCTxjb250cm9sPgorMHg5NwkweDAwOTcJIwk8Y29udHJvbD4KKzB4OTgJMHgwMDk4CSMJPGNvbnRyb2w+CisweDk5CTB4MDA5OQkjCTxjb250cm9sPgorMHg5QQkweDAwOUEJIwk8Y29udHJvbD4KKzB4OUIJMHgwMDlCCSMJPGNvbnRyb2w+CisweDlDCTB4MDA5QwkjCTxjb250cm9sPgorMHg5RAkweDAwOUQJIwk8Y29udHJvbD4KKzB4OUUJMHgwMDlFCSMJPGNvbnRyb2w+CisweDlGCTB4MDA5RgkjCTxjb250cm9sPgorMHhBMAkweDAwQTAJIwlOTy1CUkVBSyBTUEFDRQorMHhBMQkweDAxMDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisweEEyCTB4MDEwNQkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLCisweEEzCTB4MDE0MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKzB4QTQJMHgyMEFDCSMJRVVSTyBTSUdOCisweEE1CTB4MjAxRQkjCURPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworMHhBNgkweDAxNjAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4QTcJMHgwMEE3CSMJU0VDVElPTiBTSUdOCisweEE4CTB4MDE2MQkjCUxBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4QTkJMHgwMEE5CSMJQ09QWVJJR0hUIFNJR04KKzB4QUEJMHgwMjE4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XCisweEFCCTB4MDBBQgkjCUxFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweEFDCTB4MDE3OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorMHhBRAkweDAwQUQJIwlTT0ZUIEhZUEhFTgorMHhBRQkweDAxN0EJIwlMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisweEFGCTB4MDE3QgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKzB4QjAJMHgwMEIwCSMJREVHUkVFIFNJR04KKzB4QjEJMHgwMEIxCSMJUExVUy1NSU5VUyBTSUdOCisweEIyCTB4MDEwQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorMHhCMwkweDAxNDIJIwlMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorMHhCNAkweDAxN0QJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4QjUJMHgyMDFECSMJUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisweEI2CTB4MDBCNgkjCVBJTENST1cgU0lHTgorMHhCNwkweDAwQjcJIwlNSURETEUgRE9UCisweEI4CTB4MDE3RQkjCUxBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4QjkJMHgwMTBECSMJTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorMHhCQQkweDAyMTkJIwlMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XCisweEJCCTB4MDBCQgkjCVJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDAxNTIJIwlMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisweEJECTB4MDE1MwkjCUxBVElOIFNNQUxMIExJR0FUVVJFIE9FCisweEJFCTB4MDE3OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKzB4QkYJMHgwMTdDCSMJTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKzB4QzAJMHgwMEMwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweEMxCTB4MDBDMQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhDMgkweDAwQzIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhDMwkweDAxMDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUKKzB4QzQJMHgwMEM0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhDNQkweDAxMDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUKKzB4QzYJMHgwMEM2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKzB4QzcJMHgwMEM3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4QzgJMHgwMEM4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEM5CTB4MDBDOQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHhDQQkweDAwQ0EJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHhDQgkweDAwQ0IJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweENDCTB4MDBDQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorMHhDRAkweDAwQ0QJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4Q0UJMHgwMENFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4Q0YJMHgwMENGCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworMHhEMAkweDAxMTAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU1RST0tFCisweEQxCTB4MDE0MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorMHhEMgkweDAwRDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4RDMJMHgwMEQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisweEQ0CTB4MDBENAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweEQ1CTB4MDE1MAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKzB4RDYJMHgwMEQ2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHhENwkweDAxNUEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKzB4RDgJMHgwMTcwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorMHhEOQkweDAwRDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4REEJMHgwMERBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweERCCTB4MDBEQgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweERDCTB4MDBEQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMTE4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhERQkweDAyMUEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ09NTUEgQkVMT1cKKzB4REYJMHgwMERGCSMJTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKzB4RTAJMHgwMEUwCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorMHhFMQkweDAwRTEJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisweEUyCTB4MDBFMgkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhFMwkweDAxMDMJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFCisweEU0CTB4MDBFNAkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweEU1CTB4MDEwNwkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKzB4RTYJMHgwMEU2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEFFCisweEU3CTB4MDBFNwkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHhFOAkweDAwRTgJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEU5CTB4MDBFOQkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4RUEJMHgwMEVBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweEVCCTB4MDBFQgkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweEVDCTB4MDBFQwkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4RUQJMHgwMEVECSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorMHhFRQkweDAwRUUJIwlMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4RUYJMHgwMEVGCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4RjAJMHgwMTExCSMJTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKzB4RjEJMHgwMTQ0CSMJTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorMHhGMgkweDAwRjIJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisweEYzCTB4MDBGMwkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RjQJMHgwMEY0CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweEY1CTB4MDE1MQkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisweEY2CTB4MDBGNgkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEY3CTB4MDE1QgkjCUxBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUKKzB4RjgJMHgwMTcxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKzB4RjkJMHgwMEY5CSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHhGQQkweDAwRkEJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweEZCCTB4MDBGQgkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorMHhGQwkweDAwRkMJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHhGRAkweDAxMTkJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhGRQkweDAyMUIJIwlMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XCisweEZGCTB4MDBGRgkjCUxBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9pc284ODU5LTIudHh0IGIvY29kZXBhZ2UvaXNvODg1OS0yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVkZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvaXNvODg1OS0yLnR4dApAQCAtMCwwICsxLDMwMyBAQAorIworIwlOYW1lOiAgICAgICAgICAgICBJU08gODg1OS0yOjE5OTkgdG8gVW5pY29kZQorIwlVbmljb2RlIHZlcnNpb246ICAzLjAKKyMJVGFibGUgdmVyc2lvbjogICAgMS4wCisjCVRhYmxlIGZvcm1hdDogICAgIEZvcm1hdCBBCisjCURhdGU6ICAgICAgICAgICAgIDE5OTkgSnVseSAyNworIwlBdXRob3JzOiAgICAgICAgICBLZW4gV2hpc3RsZXIgPGtlbndAc3liYXNlLmNvbT4KKyMKKyMJQ29weXJpZ2h0IChjKSAxOTkxLTE5OTkgVW5pY29kZSwgSW5jLiAgQWxsIFJpZ2h0cyByZXNlcnZlZC4KKyMKKyMJVGhpcyBmaWxlIGlzIHByb3ZpZGVkIGFzLWlzIGJ5IFVuaWNvZGUsIEluYy4gKFRoZSBVbmljb2RlIENvbnNvcnRpdW0pLgorIwlObyBjbGFpbXMgYXJlIG1hZGUgYXMgdG8gZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gIE5vCisjCXdhcnJhbnRpZXMgb2YgYW55IGtpbmQgYXJlIGV4cHJlc3NlZCBvciBpbXBsaWVkLiAgVGhlIHJlY2lwaWVudAorIwlhZ3JlZXMgdG8gZGV0ZXJtaW5lIGFwcGxpY2FiaWxpdHkgb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQuICBJZiB0aGlzCisjCWZpbGUgaGFzIGJlZW4gcHJvdmlkZWQgb24gb3B0aWNhbCBtZWRpYSBieSBVbmljb2RlLCBJbmMuLCB0aGUgc29sZQorIwlyZW1lZHkgZm9yIGFueSBjbGFpbSB3aWxsIGJlIGV4Y2hhbmdlIG9mIGRlZmVjdGl2ZSBtZWRpYSB3aXRoaW4gOTAKKyMJZGF5cyBvZiByZWNlaXB0LgorIworIwlVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCisjCXN1cHBsaWVkIGluIHRoaXMgZmlsZSBpbiB0aGUgY3JlYXRpb24gb2YgcHJvZHVjdHMgc3VwcG9ydGluZyB0aGUKKyMJVW5pY29kZSBTdGFuZGFyZCwgYW5kIHRvIG1ha2UgY29waWVzIG9mIHRoaXMgZmlsZSBpbiBhbnkgZm9ybSBmb3IKKyMJaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgcmVtYWlucworIwlhdHRhY2hlZC4KKyMKKyMJR2VuZXJhbCBub3RlczoKKyMKKyMJVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGF0YSB0aGUgVW5pY29kZSBDb25zb3J0aXVtIGhhcyBvbiBob3cKKyMgICAgICAgSVNPL0lFQyA4ODU5LTI6MTk5OSBjaGFyYWN0ZXJzIG1hcCBpbnRvIFVuaWNvZGUuCisjCisjCUZvcm1hdDogIFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIwkJIENvbHVtbiAjMSBpcyB0aGUgSVNPL0lFQyA4ODU5LTIgY29kZSAoaW4gaGV4IGFzIDB4WFgpCisjCQkgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIwkJIENvbHVtbiAjMyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjCVRoZSBlbnRyaWVzIGFyZSBpbiBJU08vSUVDIDg4NTktMiBvcmRlci4KKyMKKyMJVmVyc2lvbiBoaXN0b3J5CisjCTEuMCB2ZXJzaW9uIHVwZGF0ZXMgMC4xIHZlcnNpb24gYnkgYWRkaW5nIG1hcHBpbmdzIGZvciBhbGwKKyMJY29udHJvbCBjaGFyYWN0ZXJzLgorIworIwlVcGRhdGVkIHZlcnNpb25zIG9mIHRoaXMgZmlsZSBtYXkgYmUgZm91bmQgaW46CisjCQk8ZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy8+CisjCisjCUFueSBjb21tZW50cyBvciBwcm9ibGVtcywgY29udGFjdCA8ZXJyYXRhQHVuaWNvZGUub3JnPgorIwlQbGVhc2Ugbm90ZSB0aGF0IDxlcnJhdGFAdW5pY29kZS5vcmc+IGlzIGFuIGFyY2hpdmFsIGFkZHJlc3M7CisjCW5vdGljZXMgd2lsbCBiZSBjaGVja2VkLCBidXQgZG8gbm90IGV4cGVjdCBhbiBpbW1lZGlhdGUgcmVzcG9uc2UuCisjCisweDAwCTB4MDAwMAkjCU5VTEwKKzB4MDEJMHgwMDAxCSMJU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJIwlTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjCUVORCBPRiBURVhUCisweDA0CTB4MDAwNAkjCUVORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSMJRU5RVUlSWQorMHgwNgkweDAwMDYJIwlBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJIwlCRUxMCisweDA4CTB4MDAwOAkjCUJBQ0tTUEFDRQorMHgwOQkweDAwMDkJIwlIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MEEJMHgwMDBBCSMJTElORSBGRUVECisweDBCCTB4MDAwQgkjCVZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSMJRk9STSBGRUVECisweDBECTB4MDAwRAkjCUNBUlJJQUdFIFJFVFVSTgorMHgwRQkweDAwMEUJIwlTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSMJU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSMJREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJIwlERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSMJREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjCURFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjCURFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSMJTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSMJU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJIwlFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjCUNBTkNFTAorMHgxOQkweDAwMTkJIwlFTkQgT0YgTUVESVVNCisweDFBCTB4MDAxQQkjCVNVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSMJRVNDQVBFCisweDFDCTB4MDAxQwkjCUZJTEUgU0VQQVJBVE9SCisweDFECTB4MDAxRAkjCUdST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJIwlSRUNPUkQgU0VQQVJBVE9SCisweDFGCTB4MDAxRgkjCVVOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjCVNQQUNFCisweDIxCTB4MDAyMQkjCUVYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSMJUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSMJTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSMJRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSMJUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjCUFNUEVSU0FORAorMHgyNwkweDAwMjcJIwlBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjCUxFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSMJUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSMJQVNURVJJU0sKKzB4MkIJMHgwMDJCCSMJUExVUyBTSUdOCisweDJDCTB4MDAyQwkjCUNPTU1BCisweDJECTB4MDAyRAkjCUhZUEhFTi1NSU5VUworMHgyRQkweDAwMkUJIwlGVUxMIFNUT1AKKzB4MkYJMHgwMDJGCSMJU09MSURVUworMHgzMAkweDAwMzAJIwlESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjCURJR0lUIE9ORQorMHgzMgkweDAwMzIJIwlESUdJVCBUV08KKzB4MzMJMHgwMDMzCSMJRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSMJRElHSVQgRk9VUgorMHgzNQkweDAwMzUJIwlESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjCURJR0lUIFNJWAorMHgzNwkweDAwMzcJIwlESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJIwlESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJIwlESUdJVCBOSU5FCisweDNBCTB4MDAzQQkjCUNPTE9OCisweDNCCTB4MDAzQgkjCVNFTUlDT0xPTgorMHgzQwkweDAwM0MJIwlMRVNTLVRIQU4gU0lHTgorMHgzRAkweDAwM0QJIwlFUVVBTFMgU0lHTgorMHgzRQkweDAwM0UJIwlHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJIwlRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjCUNPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NEEJMHgwMDRBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRDCTB4MDA0QwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NEQJMHgwMDRECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRGCTB4MDA0RgkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDVCCTB4MDA1QgkjCUxFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NUMJMHgwMDVDCSMJUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjCVJJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVFCTB4MDA1RQkjCUNJUkNVTUZMRVggQUNDRU5UCisweDVGCTB4MDA1RgkjCUxPVyBMSU5FCisweDYwCTB4MDA2MAkjCUdSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJIwlMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJIwlMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJIwlMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJIwlMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJIwlMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJIwlMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJIwlMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJIwlMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2QQkweDAwNkEJIwlMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2QgkweDAwNkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJIwlMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2RAkweDAwNkQJIwlMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2RQkweDAwNkUJIwlMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJIwlMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJIwlMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJIwlMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJIwlMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJIwlMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJIwlMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJIwlMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJIwlMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJIwlMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJIwlMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJIwlMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3QQkweDAwN0EJIwlMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJIwlMRUZUIENVUkxZIEJSQUNLRVQKKzB4N0MJMHgwMDdDCSMJVkVSVElDQUwgTElORQorMHg3RAkweDAwN0QJIwlSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjCVRJTERFCisweDdGCTB4MDA3RgkjCURFTEVURQorMHg4MAkweDAwODAJIwk8Y29udHJvbD4KKzB4ODEJMHgwMDgxCSMJPGNvbnRyb2w+CisweDgyCTB4MDA4MgkjCTxjb250cm9sPgorMHg4MwkweDAwODMJIwk8Y29udHJvbD4KKzB4ODQJMHgwMDg0CSMJPGNvbnRyb2w+CisweDg1CTB4MDA4NQkjCTxjb250cm9sPgorMHg4NgkweDAwODYJIwk8Y29udHJvbD4KKzB4ODcJMHgwMDg3CSMJPGNvbnRyb2w+CisweDg4CTB4MDA4OAkjCTxjb250cm9sPgorMHg4OQkweDAwODkJIwk8Y29udHJvbD4KKzB4OEEJMHgwMDhBCSMJPGNvbnRyb2w+CisweDhCCTB4MDA4QgkjCTxjb250cm9sPgorMHg4QwkweDAwOEMJIwk8Y29udHJvbD4KKzB4OEQJMHgwMDhECSMJPGNvbnRyb2w+CisweDhFCTB4MDA4RQkjCTxjb250cm9sPgorMHg4RgkweDAwOEYJIwk8Y29udHJvbD4KKzB4OTAJMHgwMDkwCSMJPGNvbnRyb2w+CisweDkxCTB4MDA5MQkjCTxjb250cm9sPgorMHg5MgkweDAwOTIJIwk8Y29udHJvbD4KKzB4OTMJMHgwMDkzCSMJPGNvbnRyb2w+CisweDk0CTB4MDA5NAkjCTxjb250cm9sPgorMHg5NQkweDAwOTUJIwk8Y29udHJvbD4KKzB4OTYJMHgwMDk2CSMJPGNvbnRyb2w+CisweDk3CTB4MDA5NwkjCTxjb250cm9sPgorMHg5OAkweDAwOTgJIwk8Y29udHJvbD4KKzB4OTkJMHgwMDk5CSMJPGNvbnRyb2w+CisweDlBCTB4MDA5QQkjCTxjb250cm9sPgorMHg5QgkweDAwOUIJIwk8Y29udHJvbD4KKzB4OUMJMHgwMDlDCSMJPGNvbnRyb2w+CisweDlECTB4MDA5RAkjCTxjb250cm9sPgorMHg5RQkweDAwOUUJIwk8Y29udHJvbD4KKzB4OUYJMHgwMDlGCSMJPGNvbnRyb2w+CisweEEwCTB4MDBBMAkjCU5PLUJSRUFLIFNQQUNFCisweEExCTB4MDEwNAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKzB4QTIJMHgwMkQ4CSMJQlJFVkUKKzB4QTMJMHgwMTQxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorMHhBNAkweDAwQTQJIwlDVVJSRU5DWSBTSUdOCisweEE1CTB4MDEzRAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDQVJPTgorMHhBNgkweDAxNUEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKzB4QTcJMHgwMEE3CSMJU0VDVElPTiBTSUdOCisweEE4CTB4MDBBOAkjCURJQUVSRVNJUworMHhBOQkweDAxNjAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4QUEJMHgwMTVFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKzB4QUIJMHgwMTY0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENBUk9OCisweEFDCTB4MDE3OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorMHhBRAkweDAwQUQJIwlTT0ZUIEhZUEhFTgorMHhBRQkweDAxN0QJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4QUYJMHgwMTdCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorMHhCMAkweDAwQjAJIwlERUdSRUUgU0lHTgorMHhCMQkweDAxMDUJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworMHhCMgkweDAyREIJIwlPR09ORUsKKzB4QjMJMHgwMTQyCSMJTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKzB4QjQJMHgwMEI0CSMJQUNVVEUgQUNDRU5UCisweEI1CTB4MDEzRQkjCUxBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04KKzB4QjYJMHgwMTVCCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURQorMHhCNwkweDAyQzcJIwlDQVJPTgorMHhCOAkweDAwQjgJIwlDRURJTExBCisweEI5CTB4MDE2MQkjCUxBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4QkEJMHgwMTVGCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisweEJCCTB4MDE2NQkjCUxBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0FST04KKzB4QkMJMHgwMTdBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorMHhCRAkweDAyREQJIwlET1VCTEUgQUNVVEUgQUNDRU5UCisweEJFCTB4MDE3RQkjCUxBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKzB4QkYJMHgwMTdDCSMJTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKzB4QzAJMHgwMTU0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIEFDVVRFCisweEMxCTB4MDBDMQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhDMgkweDAwQzIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhDMwkweDAxMDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUKKzB4QzQJMHgwMEM0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhDNQkweDAxMzkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQUNVVEUKKzB4QzYJMHgwMTA2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEFDVVRFCisweEM3CTB4MDBDNwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweEM4CTB4MDEwQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorMHhDOQkweDAwQzkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4Q0EJMHgwMTE4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhDQgkweDAwQ0IJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweENDCTB4MDExQQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDQVJPTgorMHhDRAkweDAwQ0QJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4Q0UJMHgwMENFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4Q0YJMHgwMTBFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIENBUk9OCisweEQwCTB4MDExMAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKzB4RDEJMHgwMTQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisweEQyCTB4MDE0NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDQVJPTgorMHhEMwkweDAwRDMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RDQJMHgwMEQ0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RDUJMHgwMTUwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorMHhENgkweDAwRDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEQ3CTB4MDBENwkjCU1VTFRJUExJQ0FUSU9OIFNJR04KKzB4RDgJMHgwMTU4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENBUk9OCisweEQ5CTB4MDE2RQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisweERBCTB4MDBEQQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhEQgkweDAxNzAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisweERDCTB4MDBEQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMERECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisweERFCTB4MDE2MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDRURJTExBCisweERGCTB4MDBERgkjCUxBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweEUwCTB4MDE1NQkjCUxBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQUNVVEUKKzB4RTEJMHgwMEUxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhFMgkweDAwRTIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwMTAzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRQorMHhFNAkweDAwRTQJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhFNQkweDAxM0EJIwlMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEFDVVRFCisweEU2CTB4MDEwNwkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKzB4RTcJMHgwMEU3CSMJTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisweEU4CTB4MDEwRAkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKzB4RTkJMHgwMEU5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHhFQQkweDAxMTkJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhFQgkweDAwRUIJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworMHhFQwkweDAxMUIJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OCisweEVECTB4MDBFRAkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4RUUJMHgwMEVFCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisweEVGCTB4MDEwRgkjCUxBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST04KKzB4RjAJMHgwMTExCSMJTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKzB4RjEJMHgwMTQ0CSMJTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorMHhGMgkweDAxNDgJIwlMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OCisweEYzCTB4MDBGMwkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RjQJMHgwMEY0CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweEY1CTB4MDE1MQkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisweEY2CTB4MDBGNgkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEY3CTB4MDBGNwkjCURJVklTSU9OIFNJR04KKzB4RjgJMHgwMTU5CSMJTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDQVJPTgorMHhGOQkweDAxNkYJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUKKzB4RkEJMHgwMEZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAxNzEJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorMHhGQwkweDAwRkMJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHhGRAkweDAwRkQJIwlMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisweEZFCTB4MDE2MwkjCUxBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorMHhGRgkweDAyRDkJIwlET1QgQUJPVkUKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2lzbzg4NTktMy50eHQgYi9jb2RlcGFnZS9pc284ODU5LTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNmFjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9pc284ODU5LTMudHh0CkBAIC0wLDAgKzEsMjk2IEBACisjCisjCU5hbWU6ICAgICAgICAgICAgIElTTy9JRUMgODg1OS0zOjE5OTkgdG8gVW5pY29kZQorIwlVbmljb2RlIHZlcnNpb246ICAzLjAKKyMJVGFibGUgdmVyc2lvbjogICAgMS4wCisjCVRhYmxlIGZvcm1hdDogICAgIEZvcm1hdCBBCisjCURhdGU6ICAgICAgICAgICAgIDE5OTkgSnVseSAyNworIwlBdXRob3JzOiAgICAgICAgICBLZW4gV2hpc3RsZXIgPGtlbndAc3liYXNlLmNvbT4KKyMKKyMJQ29weXJpZ2h0IChjKSAxOTkxLTE5OTkgVW5pY29kZSwgSW5jLiAgQWxsIFJpZ2h0cyByZXNlcnZlZC4KKyMKKyMJVGhpcyBmaWxlIGlzIHByb3ZpZGVkIGFzLWlzIGJ5IFVuaWNvZGUsIEluYy4gKFRoZSBVbmljb2RlIENvbnNvcnRpdW0pLgorIwlObyBjbGFpbXMgYXJlIG1hZGUgYXMgdG8gZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gIE5vCisjCXdhcnJhbnRpZXMgb2YgYW55IGtpbmQgYXJlIGV4cHJlc3NlZCBvciBpbXBsaWVkLiAgVGhlIHJlY2lwaWVudAorIwlhZ3JlZXMgdG8gZGV0ZXJtaW5lIGFwcGxpY2FiaWxpdHkgb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQuICBJZiB0aGlzCisjCWZpbGUgaGFzIGJlZW4gcHJvdmlkZWQgb24gb3B0aWNhbCBtZWRpYSBieSBVbmljb2RlLCBJbmMuLCB0aGUgc29sZQorIwlyZW1lZHkgZm9yIGFueSBjbGFpbSB3aWxsIGJlIGV4Y2hhbmdlIG9mIGRlZmVjdGl2ZSBtZWRpYSB3aXRoaW4gOTAKKyMJZGF5cyBvZiByZWNlaXB0LgorIworIwlVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCisjCXN1cHBsaWVkIGluIHRoaXMgZmlsZSBpbiB0aGUgY3JlYXRpb24gb2YgcHJvZHVjdHMgc3VwcG9ydGluZyB0aGUKKyMJVW5pY29kZSBTdGFuZGFyZCwgYW5kIHRvIG1ha2UgY29waWVzIG9mIHRoaXMgZmlsZSBpbiBhbnkgZm9ybSBmb3IKKyMJaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgcmVtYWlucworIwlhdHRhY2hlZC4KKyMKKyMJR2VuZXJhbCBub3RlczoKKyMKKyMJVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGF0YSB0aGUgVW5pY29kZSBDb25zb3J0aXVtIGhhcyBvbiBob3cKKyMgICAgICAgSVNPL0lFQyA4ODU5LTM6MTk5OSBjaGFyYWN0ZXJzIG1hcCBpbnRvIFVuaWNvZGUuCisjCisjCUZvcm1hdDogIFRocmVlIHRhYi1zZXBhcmF0ZWQgY29sdW1ucworIwkJIENvbHVtbiAjMSBpcyB0aGUgSVNPL0lFQyA4ODU5LTMgY29kZSAoaW4gaGV4IGFzIDB4WFgpCisjCQkgQ29sdW1uICMyIGlzIHRoZSBVbmljb2RlIChpbiBoZXggYXMgMHhYWFhYKQorIwkJIENvbHVtbiAjMyB0aGUgVW5pY29kZSBuYW1lIChmb2xsb3dzIGEgY29tbWVudCBzaWduLCAnIycpCisjCisjCVRoZSBlbnRyaWVzIGFyZSBpbiBJU08vSUVDIDg4NTktMyBvcmRlci4KKyMKKyMJVmVyc2lvbiBoaXN0b3J5CisjCTEuMCB2ZXJzaW9uIHVwZGF0ZXMgMC4xIHZlcnNpb24gYnkgYWRkaW5nIG1hcHBpbmdzIGZvciBhbGwKKyMJY29udHJvbCBjaGFyYWN0ZXJzLgorIworIwlVcGRhdGVkIHZlcnNpb25zIG9mIHRoaXMgZmlsZSBtYXkgYmUgZm91bmQgaW46CisjCQk8ZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy8+CisjCisjCUFueSBjb21tZW50cyBvciBwcm9ibGVtcywgY29udGFjdCA8ZXJyYXRhQHVuaWNvZGUub3JnPgorIwlQbGVhc2Ugbm90ZSB0aGF0IDxlcnJhdGFAdW5pY29kZS5vcmc+IGlzIGFuIGFyY2hpdmFsIGFkZHJlc3M7CisjCW5vdGljZXMgd2lsbCBiZSBjaGVja2VkLCBidXQgZG8gbm90IGV4cGVjdCBhbiBpbW1lZGlhdGUgcmVzcG9uc2UuCisjCisweDAwCTB4MDAwMAkjCU5VTEwKKzB4MDEJMHgwMDAxCSMJU1RBUlQgT0YgSEVBRElORworMHgwMgkweDAwMDIJIwlTVEFSVCBPRiBURVhUCisweDAzCTB4MDAwMwkjCUVORCBPRiBURVhUCisweDA0CTB4MDAwNAkjCUVORCBPRiBUUkFOU01JU1NJT04KKzB4MDUJMHgwMDA1CSMJRU5RVUlSWQorMHgwNgkweDAwMDYJIwlBQ0tOT1dMRURHRQorMHgwNwkweDAwMDcJIwlCRUxMCisweDA4CTB4MDAwOAkjCUJBQ0tTUEFDRQorMHgwOQkweDAwMDkJIwlIT1JJWk9OVEFMIFRBQlVMQVRJT04KKzB4MEEJMHgwMDBBCSMJTElORSBGRUVECisweDBCCTB4MDAwQgkjCVZFUlRJQ0FMIFRBQlVMQVRJT04KKzB4MEMJMHgwMDBDCSMJRk9STSBGRUVECisweDBECTB4MDAwRAkjCUNBUlJJQUdFIFJFVFVSTgorMHgwRQkweDAwMEUJIwlTSElGVCBPVVQKKzB4MEYJMHgwMDBGCSMJU0hJRlQgSU4KKzB4MTAJMHgwMDEwCSMJREFUQSBMSU5LIEVTQ0FQRQorMHgxMQkweDAwMTEJIwlERVZJQ0UgQ09OVFJPTCBPTkUKKzB4MTIJMHgwMDEyCSMJREVWSUNFIENPTlRST0wgVFdPCisweDEzCTB4MDAxMwkjCURFVklDRSBDT05UUk9MIFRIUkVFCisweDE0CTB4MDAxNAkjCURFVklDRSBDT05UUk9MIEZPVVIKKzB4MTUJMHgwMDE1CSMJTkVHQVRJVkUgQUNLTk9XTEVER0UKKzB4MTYJMHgwMDE2CSMJU1lOQ0hST05PVVMgSURMRQorMHgxNwkweDAwMTcJIwlFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisweDE4CTB4MDAxOAkjCUNBTkNFTAorMHgxOQkweDAwMTkJIwlFTkQgT0YgTUVESVVNCisweDFBCTB4MDAxQQkjCVNVQlNUSVRVVEUKKzB4MUIJMHgwMDFCCSMJRVNDQVBFCisweDFDCTB4MDAxQwkjCUZJTEUgU0VQQVJBVE9SCisweDFECTB4MDAxRAkjCUdST1VQIFNFUEFSQVRPUgorMHgxRQkweDAwMUUJIwlSRUNPUkQgU0VQQVJBVE9SCisweDFGCTB4MDAxRgkjCVVOSVQgU0VQQVJBVE9SCisweDIwCTB4MDAyMAkjCVNQQUNFCisweDIxCTB4MDAyMQkjCUVYQ0xBTUFUSU9OIE1BUksKKzB4MjIJMHgwMDIyCSMJUVVPVEFUSU9OIE1BUksKKzB4MjMJMHgwMDIzCSMJTlVNQkVSIFNJR04KKzB4MjQJMHgwMDI0CSMJRE9MTEFSIFNJR04KKzB4MjUJMHgwMDI1CSMJUEVSQ0VOVCBTSUdOCisweDI2CTB4MDAyNgkjCUFNUEVSU0FORAorMHgyNwkweDAwMjcJIwlBUE9TVFJPUEhFCisweDI4CTB4MDAyOAkjCUxFRlQgUEFSRU5USEVTSVMKKzB4MjkJMHgwMDI5CSMJUklHSFQgUEFSRU5USEVTSVMKKzB4MkEJMHgwMDJBCSMJQVNURVJJU0sKKzB4MkIJMHgwMDJCCSMJUExVUyBTSUdOCisweDJDCTB4MDAyQwkjCUNPTU1BCisweDJECTB4MDAyRAkjCUhZUEhFTi1NSU5VUworMHgyRQkweDAwMkUJIwlGVUxMIFNUT1AKKzB4MkYJMHgwMDJGCSMJU09MSURVUworMHgzMAkweDAwMzAJIwlESUdJVCBaRVJPCisweDMxCTB4MDAzMQkjCURJR0lUIE9ORQorMHgzMgkweDAwMzIJIwlESUdJVCBUV08KKzB4MzMJMHgwMDMzCSMJRElHSVQgVEhSRUUKKzB4MzQJMHgwMDM0CSMJRElHSVQgRk9VUgorMHgzNQkweDAwMzUJIwlESUdJVCBGSVZFCisweDM2CTB4MDAzNgkjCURJR0lUIFNJWAorMHgzNwkweDAwMzcJIwlESUdJVCBTRVZFTgorMHgzOAkweDAwMzgJIwlESUdJVCBFSUdIVAorMHgzOQkweDAwMzkJIwlESUdJVCBOSU5FCisweDNBCTB4MDAzQQkjCUNPTE9OCisweDNCCTB4MDAzQgkjCVNFTUlDT0xPTgorMHgzQwkweDAwM0MJIwlMRVNTLVRIQU4gU0lHTgorMHgzRAkweDAwM0QJIwlFUVVBTFMgU0lHTgorMHgzRQkweDAwM0UJIwlHUkVBVEVSLVRIQU4gU0lHTgorMHgzRgkweDAwM0YJIwlRVUVTVElPTiBNQVJLCisweDQwCTB4MDA0MAkjCUNPTU1FUkNJQUwgQVQKKzB4NDEJMHgwMDQxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorMHg0MgkweDAwNDIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzCTB4MDA0MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMKKzB4NDQJMHgwMDQ0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorMHg0NQkweDAwNDUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2CTB4MDA0NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEYKKzB4NDcJMHgwMDQ3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworMHg0OAkweDAwNDgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5CTB4MDA0OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkKKzB4NEEJMHgwMDRBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorMHg0QgkweDAwNEIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRDCTB4MDA0QwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEwKKzB4NEQJMHgwMDRECSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorMHg0RQkweDAwNEUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRGCTB4MDA0RgkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8KKzB4NTAJMHgwMDUwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorMHg1MQkweDAwNTEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyCTB4MDA1MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFIKKzB4NTMJMHgwMDUzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworMHg1NAkweDAwNTQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1CTB4MDA1NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUKKzB4NTYJMHgwMDU2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorMHg1NwkweDAwNTcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4CTB4MDA1OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFgKKzB4NTkJMHgwMDU5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorMHg1QQkweDAwNUEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDVCCTB4MDA1QgkjCUxFRlQgU1FVQVJFIEJSQUNLRVQKKzB4NUMJMHgwMDVDCSMJUkVWRVJTRSBTT0xJRFVTCisweDVECTB4MDA1RAkjCVJJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVFCTB4MDA1RQkjCUNJUkNVTUZMRVggQUNDRU5UCisweDVGCTB4MDA1RgkjCUxPVyBMSU5FCisweDYwCTB4MDA2MAkjCUdSQVZFIEFDQ0VOVAorMHg2MQkweDAwNjEJIwlMQVRJTiBTTUFMTCBMRVRURVIgQQorMHg2MgkweDAwNjIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQgorMHg2MwkweDAwNjMJIwlMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NAkweDAwNjQJIwlMQVRJTiBTTUFMTCBMRVRURVIgRAorMHg2NQkweDAwNjUJIwlMQVRJTiBTTUFMTCBMRVRURVIgRQorMHg2NgkweDAwNjYJIwlMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NwkweDAwNjcJIwlMQVRJTiBTTUFMTCBMRVRURVIgRworMHg2OAkweDAwNjgJIwlMQVRJTiBTTUFMTCBMRVRURVIgSAorMHg2OQkweDAwNjkJIwlMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2QQkweDAwNkEJIwlMQVRJTiBTTUFMTCBMRVRURVIgSgorMHg2QgkweDAwNkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgSworMHg2QwkweDAwNkMJIwlMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2RAkweDAwNkQJIwlMQVRJTiBTTUFMTCBMRVRURVIgTQorMHg2RQkweDAwNkUJIwlMQVRJTiBTTUFMTCBMRVRURVIgTgorMHg2RgkweDAwNkYJIwlMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MAkweDAwNzAJIwlMQVRJTiBTTUFMTCBMRVRURVIgUAorMHg3MQkweDAwNzEJIwlMQVRJTiBTTUFMTCBMRVRURVIgUQorMHg3MgkweDAwNzIJIwlMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MwkweDAwNzMJIwlMQVRJTiBTTUFMTCBMRVRURVIgUworMHg3NAkweDAwNzQJIwlMQVRJTiBTTUFMTCBMRVRURVIgVAorMHg3NQkweDAwNzUJIwlMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NgkweDAwNzYJIwlMQVRJTiBTTUFMTCBMRVRURVIgVgorMHg3NwkweDAwNzcJIwlMQVRJTiBTTUFMTCBMRVRURVIgVworMHg3OAkweDAwNzgJIwlMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OQkweDAwNzkJIwlMQVRJTiBTTUFMTCBMRVRURVIgWQorMHg3QQkweDAwN0EJIwlMQVRJTiBTTUFMTCBMRVRURVIgWgorMHg3QgkweDAwN0IJIwlMRUZUIENVUkxZIEJSQUNLRVQKKzB4N0MJMHgwMDdDCSMJVkVSVElDQUwgTElORQorMHg3RAkweDAwN0QJIwlSSUdIVCBDVVJMWSBCUkFDS0VUCisweDdFCTB4MDA3RQkjCVRJTERFCisweDdGCTB4MDA3RgkjCURFTEVURQorMHg4MAkweDAwODAJIwk8Y29udHJvbD4KKzB4ODEJMHgwMDgxCSMJPGNvbnRyb2w+CisweDgyCTB4MDA4MgkjCTxjb250cm9sPgorMHg4MwkweDAwODMJIwk8Y29udHJvbD4KKzB4ODQJMHgwMDg0CSMJPGNvbnRyb2w+CisweDg1CTB4MDA4NQkjCTxjb250cm9sPgorMHg4NgkweDAwODYJIwk8Y29udHJvbD4KKzB4ODcJMHgwMDg3CSMJPGNvbnRyb2w+CisweDg4CTB4MDA4OAkjCTxjb250cm9sPgorMHg4OQkweDAwODkJIwk8Y29udHJvbD4KKzB4OEEJMHgwMDhBCSMJPGNvbnRyb2w+CisweDhCCTB4MDA4QgkjCTxjb250cm9sPgorMHg4QwkweDAwOEMJIwk8Y29udHJvbD4KKzB4OEQJMHgwMDhECSMJPGNvbnRyb2w+CisweDhFCTB4MDA4RQkjCTxjb250cm9sPgorMHg4RgkweDAwOEYJIwk8Y29udHJvbD4KKzB4OTAJMHgwMDkwCSMJPGNvbnRyb2w+CisweDkxCTB4MDA5MQkjCTxjb250cm9sPgorMHg5MgkweDAwOTIJIwk8Y29udHJvbD4KKzB4OTMJMHgwMDkzCSMJPGNvbnRyb2w+CisweDk0CTB4MDA5NAkjCTxjb250cm9sPgorMHg5NQkweDAwOTUJIwk8Y29udHJvbD4KKzB4OTYJMHgwMDk2CSMJPGNvbnRyb2w+CisweDk3CTB4MDA5NwkjCTxjb250cm9sPgorMHg5OAkweDAwOTgJIwk8Y29udHJvbD4KKzB4OTkJMHgwMDk5CSMJPGNvbnRyb2w+CisweDlBCTB4MDA5QQkjCTxjb250cm9sPgorMHg5QgkweDAwOUIJIwk8Y29udHJvbD4KKzB4OUMJMHgwMDlDCSMJPGNvbnRyb2w+CisweDlECTB4MDA5RAkjCTxjb250cm9sPgorMHg5RQkweDAwOUUJIwk8Y29udHJvbD4KKzB4OUYJMHgwMDlGCSMJPGNvbnRyb2w+CisweEEwCTB4MDBBMAkjCU5PLUJSRUFLIFNQQUNFCisweEExCTB4MDEyNgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBTVFJPS0UKKzB4QTIJMHgwMkQ4CSMJQlJFVkUKKzB4QTMJMHgwMEEzCSMJUE9VTkQgU0lHTgorMHhBNAkweDAwQTQJIwlDVVJSRU5DWSBTSUdOCisweEE2CTB4MDEyNAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBDSVJDVU1GTEVYCisweEE3CTB4MDBBNwkjCVNFQ1RJT04gU0lHTgorMHhBOAkweDAwQTgJIwlESUFFUkVTSVMKKzB4QTkJMHgwMTMwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBBQk9WRQorMHhBQQkweDAxNUUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorMHhBQgkweDAxMUUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKzB4QUMJMHgwMTM0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVgKKzB4QUQJMHgwMEFECSMJU09GVCBIWVBIRU4KKzB4QUYJMHgwMTdCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorMHhCMAkweDAwQjAJIwlERUdSRUUgU0lHTgorMHhCMQkweDAxMjcJIwlMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIFNUUk9LRQorMHhCMgkweDAwQjIJIwlTVVBFUlNDUklQVCBUV08KKzB4QjMJMHgwMEIzCSMJU1VQRVJTQ1JJUFQgVEhSRUUKKzB4QjQJMHgwMEI0CSMJQUNVVEUgQUNDRU5UCisweEI1CTB4MDBCNQkjCU1JQ1JPIFNJR04KKzB4QjYJMHgwMTI1CSMJTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBDSVJDVU1GTEVYCisweEI3CTB4MDBCNwkjCU1JRERMRSBET1QKKzB4QjgJMHgwMEI4CSMJQ0VESUxMQQorMHhCOQkweDAxMzEJIwlMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisweEJBCTB4MDE1RgkjCUxBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorMHhCQgkweDAxMUYJIwlMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEJSRVZFCisweEJDCTB4MDEzNQkjCUxBVElOIFNNQUxMIExFVFRFUiBKIFdJVEggQ0lSQ1VNRkxFWAorMHhCRAkweDAwQkQJIwlWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKzB4QkYJMHgwMTdDCSMJTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKzB4QzAJMHgwMEMwCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisweEMxCTB4MDBDMQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhDMgkweDAwQzIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorMHhDNAkweDAwQzQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweEM1CTB4MDEwQQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkUKKzB4QzYJMHgwMTA4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVgKKzB4QzcJMHgwMEM3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4QzgJMHgwMEM4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEM5CTB4MDBDOQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHhDQQkweDAwQ0EJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHhDQgkweDAwQ0IJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweENDCTB4MDBDQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorMHhDRAkweDAwQ0QJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4Q0UJMHgwMENFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4Q0YJMHgwMENGCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworMHhEMQkweDAwRDEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKzB4RDIJMHgwMEQyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisweEQzCTB4MDBEMwkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhENAkweDAwRDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorMHhENQkweDAxMjAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggRE9UIEFCT1ZFCisweEQ2CTB4MDBENgkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4RDcJMHgwMEQ3CSMJTVVMVElQTElDQVRJT04gU0lHTgorMHhEOAkweDAxMUMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0lSQ1VNRkxFWAorMHhEOQkweDAwRDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4REEJMHgwMERBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweERCCTB4MDBEQgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweERDCTB4MDBEQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMTZDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEJSRVZFCisweERFCTB4MDE1QwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDSVJDVU1GTEVYCisweERGCTB4MDBERgkjCUxBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweEUwCTB4MDBFMAkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4RTEJMHgwMEUxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhFMgkweDAwRTIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTQJMHgwMEU0CSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4RTUJMHgwMTBCCSMJTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkUKKzB4RTYJMHgwMTA5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDSVJDVU1GTEVYCisweEU3CTB4MDBFNwkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHhFOAkweDAwRTgJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEU5CTB4MDBFOQkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4RUEJMHgwMEVBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweEVCCTB4MDBFQgkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweEVDCTB4MDBFQwkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4RUQJMHgwMEVECSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorMHhFRQkweDAwRUUJIwlMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4RUYJMHgwMEVGCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4RjEJMHgwMEYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorMHhGMgkweDAwRjIJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisweEYzCTB4MDBGMwkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RjQJMHgwMEY0CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisweEY1CTB4MDEyMQkjCUxBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggRE9UIEFCT1ZFCisweEY2CTB4MDBGNgkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEY3CTB4MDBGNwkjCURJVklTSU9OIFNJR04KKzB4RjgJMHgwMTFECSMJTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYCisweEY5CTB4MDBGOQkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4RkEJMHgwMEZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAwRkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKzB4RkMJMHgwMEZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4RkQJMHgwMTZECSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBCUkVWRQorMHhGRQkweDAxNUQJIwlMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENJUkNVTUZMRVgKKzB4RkYJMHgwMkQ5CSMJRE9UIEFCT1ZFCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9pc284ODU5LTQudHh0IGIvY29kZXBhZ2UvaXNvODg1OS00LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjJlNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvaXNvODg1OS00LnR4dApAQCAtMCwwICsxLDMwMyBAQAorIworIwlOYW1lOiAgICAgICAgICAgICBJU08vSUVDIDg4NTktNDoxOTk4IHRvIFVuaWNvZGUKKyMJVW5pY29kZSB2ZXJzaW9uOiAgMy4wCisjCVRhYmxlIHZlcnNpb246ICAgIDEuMAorIwlUYWJsZSBmb3JtYXQ6ICAgICBGb3JtYXQgQQorIwlEYXRlOiAgICAgICAgICAgICAxOTk5IEp1bHkgMjcKKyMJQXV0aG9yczogICAgICAgICAgS2VuIFdoaXN0bGVyIDxrZW53QHN5YmFzZS5jb20+CisjCisjCUNvcHlyaWdodCAoYykgMTk5MS0xOTk5IFVuaWNvZGUsIEluYy4gIEFsbCBSaWdodHMgcmVzZXJ2ZWQuCisjCisjCVRoaXMgZmlsZSBpcyBwcm92aWRlZCBhcy1pcyBieSBVbmljb2RlLCBJbmMuIChUaGUgVW5pY29kZSBDb25zb3J0aXVtKS4KKyMJTm8gY2xhaW1zIGFyZSBtYWRlIGFzIHRvIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBObworIwl3YXJyYW50aWVzIG9mIGFueSBraW5kIGFyZSBleHByZXNzZWQgb3IgaW1wbGllZC4gIFRoZSByZWNpcGllbnQKKyMJYWdyZWVzIHRvIGRldGVybWluZSBhcHBsaWNhYmlsaXR5IG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkLiAgSWYgdGhpcworIwlmaWxlIGhhcyBiZWVuIHByb3ZpZGVkIG9uIG9wdGljYWwgbWVkaWEgYnkgVW5pY29kZSwgSW5jLiwgdGhlIHNvbGUKKyMJcmVtZWR5IGZvciBhbnkgY2xhaW0gd2lsbCBiZSBleGNoYW5nZSBvZiBkZWZlY3RpdmUgbWVkaWEgd2l0aGluIDkwCisjCWRheXMgb2YgcmVjZWlwdC4KKyMKKyMJVW5pY29kZSwgSW5jLiBoZXJlYnkgZ3JhbnRzIHRoZSByaWdodCB0byBmcmVlbHkgdXNlIHRoZSBpbmZvcm1hdGlvbgorIwlzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCisjCVVuaWNvZGUgU3RhbmRhcmQsIGFuZCB0byBtYWtlIGNvcGllcyBvZiB0aGlzIGZpbGUgaW4gYW55IGZvcm0gZm9yCisjCWludGVybmFsIG9yIGV4dGVybmFsIGRpc3RyaWJ1dGlvbiBhcyBsb25nIGFzIHRoaXMgbm90aWNlIHJlbWFpbnMKKyMJYXR0YWNoZWQuCisjCisjCUdlbmVyYWwgbm90ZXM6CisjCisjCVRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRhdGEgdGhlIFVuaWNvZGUgQ29uc29ydGl1bSBoYXMgb24gaG93CisjICAgICAgIElTTy9JRUMgODg1OS00OjE5OTggY2hhcmFjdGVycyBtYXAgaW50byBVbmljb2RlLgorIworIwlGb3JtYXQ6ICBUaHJlZSB0YWItc2VwYXJhdGVkIGNvbHVtbnMKKyMJCSBDb2x1bW4gIzEgaXMgdGhlIElTTy9JRUMgODg1OS00IGNvZGUgKGluIGhleCBhcyAweFhYKQorIwkJIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMJCSBDb2x1bW4gIzMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIwlUaGUgZW50cmllcyBhcmUgaW4gSVNPL0lFQyA4ODU5LTQgb3JkZXIuCisjCisjCVZlcnNpb24gaGlzdG9yeQorIwkxLjAgdmVyc2lvbiB1cGRhdGVzIDAuMSB2ZXJzaW9uIGJ5IGFkZGluZyBtYXBwaW5ncyBmb3IgYWxsCisjCWNvbnRyb2wgY2hhcmFjdGVycy4KKyMKKyMJVXBkYXRlZCB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgbWF5IGJlIGZvdW5kIGluOgorIwkJPGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvPgorIworIwlBbnkgY29tbWVudHMgb3IgcHJvYmxlbXMsIGNvbnRhY3QgPGVycmF0YUB1bmljb2RlLm9yZz4KKyMJUGxlYXNlIG5vdGUgdGhhdCA8ZXJyYXRhQHVuaWNvZGUub3JnPiBpcyBhbiBhcmNoaXZhbCBhZGRyZXNzOworIwlub3RpY2VzIHdpbGwgYmUgY2hlY2tlZCwgYnV0IGRvIG5vdCBleHBlY3QgYW4gaW1tZWRpYXRlIHJlc3BvbnNlLgorIworMHgwMAkweDAwMDAJIwlOVUxMCisweDAxCTB4MDAwMQkjCVNUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSMJU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJIwlFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJIwlFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjCUVOUVVJUlkKKzB4MDYJMHgwMDA2CSMJQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSMJQkVMTAorMHgwOAkweDAwMDgJIwlCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSMJSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBBCTB4MDAwQQkjCUxJTkUgRkVFRAorMHgwQgkweDAwMEIJIwlWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBDCTB4MDAwQwkjCUZPUk0gRkVFRAorMHgwRAkweDAwMEQJIwlDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSMJU0hJRlQgT1VUCisweDBGCTB4MDAwRgkjCVNISUZUIElOCisweDEwCTB4MDAxMAkjCURBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSMJREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjCURFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJIwlERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJIwlERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjCU5FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjCVNZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSMJRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJIwlDQU5DRUwKKzB4MTkJMHgwMDE5CSMJRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJIwlTVUJTVElUVVRFCisweDFCCTB4MDAxQgkjCUVTQ0FQRQorMHgxQwkweDAwMUMJIwlGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJIwlHUk9VUCBTRVBBUkFUT1IKKzB4MUUJMHgwMDFFCSMJUkVDT1JEIFNFUEFSQVRPUgorMHgxRgkweDAwMUYJIwlVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJIwlTUEFDRQorMHgyMQkweDAwMjEJIwlFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjCVFVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjCU5VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjCURPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjCVBFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJIwlBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSMJQVBPU1RST1BIRQorMHgyOAkweDAwMjgJIwlMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjCVJJR0hUIFBBUkVOVEhFU0lTCisweDJBCTB4MDAyQQkjCUFTVEVSSVNLCisweDJCCTB4MDAyQgkjCVBMVVMgU0lHTgorMHgyQwkweDAwMkMJIwlDT01NQQorMHgyRAkweDAwMkQJIwlIWVBIRU4tTUlOVVMKKzB4MkUJMHgwMDJFCSMJRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjCVNPTElEVVMKKzB4MzAJMHgwMDMwCSMJRElHSVQgWkVSTworMHgzMQkweDAwMzEJIwlESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSMJRElHSVQgVFdPCisweDMzCTB4MDAzMwkjCURJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjCURJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSMJRElHSVQgRklWRQorMHgzNgkweDAwMzYJIwlESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSMJRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSMJRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSMJRElHSVQgTklORQorMHgzQQkweDAwM0EJIwlDT0xPTgorMHgzQgkweDAwM0IJIwlTRU1JQ09MT04KKzB4M0MJMHgwMDNDCSMJTEVTUy1USEFOIFNJR04KKzB4M0QJMHgwMDNECSMJRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSMJR1JFQVRFUi1USEFOIFNJR04KKzB4M0YJMHgwMDNGCSMJUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJIwlDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NEIJMHgwMDRCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0QwkweDAwNEMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NEUJMHgwMDRFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0RgkweDAwNEYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NUEJMHgwMDVBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1QgkweDAwNUIJIwlMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjCVJFVkVSU0UgU09MSURVUworMHg1RAkweDAwNUQJIwlSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1RQkweDAwNUUJIwlDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJIwlMT1cgTElORQorMHg2MAkweDAwNjAJIwlHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSMJTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSMJTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSMJTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSMJTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSMJTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NkEJMHgwMDZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSMJTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NkMJMHgwMDZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NkQJMHgwMDZECSMJTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSMJTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NkYJMHgwMDZGCSMJTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSMJTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSMJTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSMJTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSMJTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSMJTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSMJTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSMJTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSMJTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N0IJMHgwMDdCCSMJTEVGVCBDVVJMWSBCUkFDS0VUCisweDdDCTB4MDA3QwkjCVZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSMJUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3RQkweDAwN0UJIwlUSUxERQorMHg3RgkweDAwN0YJIwlERUxFVEUKKzB4ODAJMHgwMDgwCSMJPGNvbnRyb2w+CisweDgxCTB4MDA4MQkjCTxjb250cm9sPgorMHg4MgkweDAwODIJIwk8Y29udHJvbD4KKzB4ODMJMHgwMDgzCSMJPGNvbnRyb2w+CisweDg0CTB4MDA4NAkjCTxjb250cm9sPgorMHg4NQkweDAwODUJIwk8Y29udHJvbD4KKzB4ODYJMHgwMDg2CSMJPGNvbnRyb2w+CisweDg3CTB4MDA4NwkjCTxjb250cm9sPgorMHg4OAkweDAwODgJIwk8Y29udHJvbD4KKzB4ODkJMHgwMDg5CSMJPGNvbnRyb2w+CisweDhBCTB4MDA4QQkjCTxjb250cm9sPgorMHg4QgkweDAwOEIJIwk8Y29udHJvbD4KKzB4OEMJMHgwMDhDCSMJPGNvbnRyb2w+CisweDhECTB4MDA4RAkjCTxjb250cm9sPgorMHg4RQkweDAwOEUJIwk8Y29udHJvbD4KKzB4OEYJMHgwMDhGCSMJPGNvbnRyb2w+CisweDkwCTB4MDA5MAkjCTxjb250cm9sPgorMHg5MQkweDAwOTEJIwk8Y29udHJvbD4KKzB4OTIJMHgwMDkyCSMJPGNvbnRyb2w+CisweDkzCTB4MDA5MwkjCTxjb250cm9sPgorMHg5NAkweDAwOTQJIwk8Y29udHJvbD4KKzB4OTUJMHgwMDk1CSMJPGNvbnRyb2w+CisweDk2CTB4MDA5NgkjCTxjb250cm9sPgorMHg5NwkweDAwOTcJIwk8Y29udHJvbD4KKzB4OTgJMHgwMDk4CSMJPGNvbnRyb2w+CisweDk5CTB4MDA5OQkjCTxjb250cm9sPgorMHg5QQkweDAwOUEJIwk8Y29udHJvbD4KKzB4OUIJMHgwMDlCCSMJPGNvbnRyb2w+CisweDlDCTB4MDA5QwkjCTxjb250cm9sPgorMHg5RAkweDAwOUQJIwk8Y29udHJvbD4KKzB4OUUJMHgwMDlFCSMJPGNvbnRyb2w+CisweDlGCTB4MDA5RgkjCTxjb250cm9sPgorMHhBMAkweDAwQTAJIwlOTy1CUkVBSyBTUEFDRQorMHhBMQkweDAxMDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisweEEyCTB4MDEzOAkjCUxBVElOIFNNQUxMIExFVFRFUiBLUkEKKzB4QTMJMHgwMTU2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKzB4QTQJMHgwMEE0CSMJQ1VSUkVOQ1kgU0lHTgorMHhBNQkweDAxMjgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggVElMREUKKzB4QTYJMHgwMTNCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKzB4QTcJMHgwMEE3CSMJU0VDVElPTiBTSUdOCisweEE4CTB4MDBBOAkjCURJQUVSRVNJUworMHhBOQkweDAxNjAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKzB4QUEJMHgwMTEyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorMHhBQgkweDAxMjIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorMHhBQwkweDAxNjYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggU1RST0tFCisweEFECTB4MDBBRAkjCVNPRlQgSFlQSEVOCisweEFFCTB4MDE3RAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorMHhBRgkweDAwQUYJIwlNQUNST04KKzB4QjAJMHgwMEIwCSMJREVHUkVFIFNJR04KKzB4QjEJMHgwMTA1CSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKzB4QjIJMHgwMkRCCSMJT0dPTkVLCisweEIzCTB4MDE1NwkjCUxBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorMHhCNAkweDAwQjQJIwlBQ1VURSBBQ0NFTlQKKzB4QjUJMHgwMTI5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBUSUxERQorMHhCNgkweDAxM0MJIwlMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKzB4QjcJMHgwMkM3CSMJQ0FST04KKzB4QjgJMHgwMEI4CSMJQ0VESUxMQQorMHhCOQkweDAxNjEJIwlMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisweEJBCTB4MDExMwkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisweEJCCTB4MDEyMwkjCUxBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorMHhCQwkweDAxNjcJIwlMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIFNUUk9LRQorMHhCRAkweDAxNEEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFTkcKKzB4QkUJMHgwMTdFCSMJTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorMHhCRgkweDAxNEIJIwlMQVRJTiBTTUFMTCBMRVRURVIgRU5HCisweEMwCTB4MDEwMAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBNQUNST04KKzB4QzEJMHgwMEMxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisweEMyCTB4MDBDMgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisweEMzCTB4MDBDMwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhDNAkweDAwQzQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisweEM1CTB4MDBDNQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisweEM2CTB4MDBDNgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEFFCisweEM3CTB4MDEyRQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKzB4QzgJMHgwMTBDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisweEM5CTB4MDBDOQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHhDQQkweDAxMTgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisweENCCTB4MDBDQgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKzB4Q0MJMHgwMTE2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorMHhDRAkweDAwQ0QJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4Q0UJMHgwMENFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4Q0YJMHgwMTJBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorMHhEMAkweDAxMTAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU1RST0tFCisweEQxCTB4MDE0NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisweEQyCTB4MDE0QwkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04KKzB4RDMJMHgwMTM2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKzB4RDQJMHgwMEQ0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RDUJMHgwMEQ1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisweEQ2CTB4MDBENgkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4RDcJMHgwMEQ3CSMJTVVMVElQTElDQVRJT04gU0lHTgorMHhEOAkweDAwRDgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisweEQ5CTB4MDE3MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKzB4REEJMHgwMERBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisweERCCTB4MDBEQgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisweERDCTB4MDBEQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4REQJMHgwMTY4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFRJTERFCisweERFCTB4MDE2QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04KKzB4REYJMHgwMERGCSMJTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKzB4RTAJMHgwMTAxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04KKzB4RTEJMHgwMEUxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhFMgkweDAwRTIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwMEUzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhFNAkweDAwRTQJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhFNQkweDAwRTUJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4RTYJMHgwMEU2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEFFCisweEU3CTB4MDEyRgkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLCisweEU4CTB4MDEwRAkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKzB4RTkJMHgwMEU5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHhFQQkweDAxMTkJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworMHhFQgkweDAwRUIJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworMHhFQwkweDAxMTcJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorMHhFRAkweDAwRUQJIwlMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisweEVFCTB4MDBFRQkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorMHhFRgkweDAxMkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorMHhGMAkweDAxMTEJIwlMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorMHhGMQkweDAxNDYJIwlMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKzB4RjIJMHgwMTRECSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKzB4RjMJMHgwMTM3CSMJTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisweEY0CTB4MDBGNAkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorMHhGNQkweDAwRjUJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisweEY2CTB4MDBGNgkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisweEY3CTB4MDBGNwkjCURJVklTSU9OIFNJR04KKzB4RjgJMHgwMEY4CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKzB4RjkJMHgwMTczCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKzB4RkEJMHgwMEZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAwRkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKzB4RkMJMHgwMEZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4RkQJMHgwMTY5CSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBUSUxERQorMHhGRQkweDAxNkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorMHhGRgkweDAyRDkJIwlET1QgQUJPVkUKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2lzbzg4NTktNS50eHQgYi9jb2RlcGFnZS9pc284ODU5LTUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWQxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9pc284ODU5LTUudHh0CkBAIC0wLDAgKzEsMzAzIEBACisjCisjCU5hbWU6ICAgICAgICAgICAgIElTTyA4ODU5LTU6MTk5OSB0byBVbmljb2RlCisjCVVuaWNvZGUgdmVyc2lvbjogIDMuMAorIwlUYWJsZSB2ZXJzaW9uOiAgICAxLjAKKyMJVGFibGUgZm9ybWF0OiAgICAgRm9ybWF0IEEKKyMJRGF0ZTogICAgICAgICAgICAgMTk5OSBKdWx5IDI3CisjCUF1dGhvcnM6ICAgICAgICAgIEtlbiBXaGlzdGxlciA8a2Vud0BzeWJhc2UuY29tPgorIworIwlDb3B5cmlnaHQgKGMpIDE5OTEtMTk5OSBVbmljb2RlLCBJbmMuICBBbGwgUmlnaHRzIHJlc2VydmVkLgorIworIwlUaGlzIGZpbGUgaXMgcHJvdmlkZWQgYXMtaXMgYnkgVW5pY29kZSwgSW5jLiAoVGhlIFVuaWNvZGUgQ29uc29ydGl1bSkuCisjCU5vIGNsYWltcyBhcmUgbWFkZSBhcyB0byBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiAgTm8KKyMJd2FycmFudGllcyBvZiBhbnkga2luZCBhcmUgZXhwcmVzc2VkIG9yIGltcGxpZWQuICBUaGUgcmVjaXBpZW50CisjCWFncmVlcyB0byBkZXRlcm1pbmUgYXBwbGljYWJpbGl0eSBvZiBpbmZvcm1hdGlvbiBwcm92aWRlZC4gIElmIHRoaXMKKyMJZmlsZSBoYXMgYmVlbiBwcm92aWRlZCBvbiBvcHRpY2FsIG1lZGlhIGJ5IFVuaWNvZGUsIEluYy4sIHRoZSBzb2xlCisjCXJlbWVkeSBmb3IgYW55IGNsYWltIHdpbGwgYmUgZXhjaGFuZ2Ugb2YgZGVmZWN0aXZlIG1lZGlhIHdpdGhpbiA5MAorIwlkYXlzIG9mIHJlY2VpcHQuCisjCisjCVVuaWNvZGUsIEluYy4gaGVyZWJ5IGdyYW50cyB0aGUgcmlnaHQgdG8gZnJlZWx5IHVzZSB0aGUgaW5mb3JtYXRpb24KKyMJc3VwcGxpZWQgaW4gdGhpcyBmaWxlIGluIHRoZSBjcmVhdGlvbiBvZiBwcm9kdWN0cyBzdXBwb3J0aW5nIHRoZQorIwlVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtIGZvcgorIwlpbnRlcm5hbCBvciBleHRlcm5hbCBkaXN0cmlidXRpb24gYXMgbG9uZyBhcyB0aGlzIG5vdGljZSByZW1haW5zCisjCWF0dGFjaGVkLgorIworIwlHZW5lcmFsIG5vdGVzOgorIworIwlUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkYXRhIHRoZSBVbmljb2RlIENvbnNvcnRpdW0gaGFzIG9uIGhvdworIyAgICAgICBJU08vSUVDIDg4NTktNToxOTk5IGNoYXJhY3RlcnMgbWFwIGludG8gVW5pY29kZS4KKyMKKyMJRm9ybWF0OiAgVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjCQkgQ29sdW1uICMxIGlzIHRoZSBJU08vSUVDIDg4NTktNSBjb2RlIChpbiBoZXggYXMgMHhYWCkKKyMJCSBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjCQkgQ29sdW1uICMzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMJVGhlIGVudHJpZXMgYXJlIGluIElTTy9JRUMgODg1OS01IG9yZGVyLgorIworIwlWZXJzaW9uIGhpc3RvcnkKKyMJMS4wIHZlcnNpb24gdXBkYXRlcyAwLjEgdmVyc2lvbiBieSBhZGRpbmcgbWFwcGluZ3MgZm9yIGFsbAorIwljb250cm9sIGNoYXJhY3RlcnMuCisjCisjCVVwZGF0ZWQgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIG1heSBiZSBmb3VuZCBpbjoKKyMJCTxmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTLz4KKyMKKyMJQW55IGNvbW1lbnRzIG9yIHByb2JsZW1zLCBjb250YWN0IDxlcnJhdGFAdW5pY29kZS5vcmc+CisjCVBsZWFzZSBub3RlIHRoYXQgPGVycmF0YUB1bmljb2RlLm9yZz4gaXMgYW4gYXJjaGl2YWwgYWRkcmVzczsKKyMJbm90aWNlcyB3aWxsIGJlIGNoZWNrZWQsIGJ1dCBkbyBub3QgZXhwZWN0IGFuIGltbWVkaWF0ZSByZXNwb25zZS4KKyMKKzB4MDAJMHgwMDAwCSMJTlVMTAorMHgwMQkweDAwMDEJIwlTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjCVNUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSMJRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSMJRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJIwlFTlFVSVJZCisweDA2CTB4MDAwNgkjCUFDS05PV0xFREdFCisweDA3CTB4MDAwNwkjCUJFTEwKKzB4MDgJMHgwMDA4CSMJQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjCUhPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJIwlMSU5FIEZFRUQKKzB4MEIJMHgwMDBCCSMJVkVSVElDQUwgVEFCVUxBVElPTgorMHgwQwkweDAwMEMJIwlGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSMJQ0FSUklBR0UgUkVUVVJOCisweDBFCTB4MDAwRQkjCVNISUZUIE9VVAorMHgwRgkweDAwMEYJIwlTSElGVCBJTgorMHgxMAkweDAwMTAJIwlEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjCURFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJIwlERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSMJREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSMJREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJIwlORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJIwlTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjCUVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSMJQ0FOQ0VMCisweDE5CTB4MDAxOQkjCUVORCBPRiBNRURJVU0KKzB4MUEJMHgwMDFBCSMJU1VCU1RJVFVURQorMHgxQgkweDAwMUIJIwlFU0NBUEUKKzB4MUMJMHgwMDFDCSMJRklMRSBTRVBBUkFUT1IKKzB4MUQJMHgwMDFECSMJR1JPVVAgU0VQQVJBVE9SCisweDFFCTB4MDAxRQkjCVJFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSMJVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSMJU1BBQ0UKKzB4MjEJMHgwMDIxCSMJRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJIwlRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJIwlOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJIwlET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJIwlQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSMJQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjCUFQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSMJTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJIwlSSUdIVCBQQVJFTlRIRVNJUworMHgyQQkweDAwMkEJIwlBU1RFUklTSworMHgyQgkweDAwMkIJIwlQTFVTIFNJR04KKzB4MkMJMHgwMDJDCSMJQ09NTUEKKzB4MkQJMHgwMDJECSMJSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjCUZVTEwgU1RPUAorMHgyRgkweDAwMkYJIwlTT0xJRFVTCisweDMwCTB4MDAzMAkjCURJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSMJRElHSVQgT05FCisweDMyCTB4MDAzMgkjCURJR0lUIFRXTworMHgzMwkweDAwMzMJIwlESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJIwlESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjCURJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSMJRElHSVQgU0lYCisweDM3CTB4MDAzNwkjCURJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjCURJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjCURJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSMJQ09MT04KKzB4M0IJMHgwMDNCCSMJU0VNSUNPTE9OCisweDNDCTB4MDAzQwkjCUxFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjCUVRVUFMUyBTSUdOCisweDNFCTB4MDAzRQkjCUdSRUFURVItVEhBTiBTSUdOCisweDNGCTB4MDAzRgkjCVFVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSMJQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0QQkweDAwNEEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRCCTB4MDA0QgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0RAkweDAwNEQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRFCTB4MDA0RQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVBCTB4MDA1QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSMJTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1QwkweDAwNUMJIwlSRVZFUlNFIFNPTElEVVMKKzB4NUQJMHgwMDVECSMJUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSMJQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NUYJMHgwMDVGCSMJTE9XIExJTkUKKzB4NjAJMHgwMDYwCSMJR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjCUxBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjCUxBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjCUxBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjCUxBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjCUxBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjCUxBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjCUxBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjCUxBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjCUxBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjCUxBVElOIFNNQUxMIExFVFRFUiBKCisweDZCCTB4MDA2QgkjCUxBVElOIFNNQUxMIExFVFRFUiBLCisweDZDCTB4MDA2QwkjCUxBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjCUxBVElOIFNNQUxMIExFVFRFUiBNCisweDZFCTB4MDA2RQkjCUxBVElOIFNNQUxMIExFVFRFUiBOCisweDZGCTB4MDA2RgkjCUxBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjCUxBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjCUxBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjCUxBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjCUxBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjCUxBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjCUxBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjCUxBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjCUxBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjCUxBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjCUxBVElOIFNNQUxMIExFVFRFUiBZCisweDdBCTB4MDA3QQkjCUxBVElOIFNNQUxMIExFVFRFUiBaCisweDdCCTB4MDA3QgkjCUxFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJIwlWRVJUSUNBTCBMSU5FCisweDdECTB4MDA3RAkjCVJJR0hUIENVUkxZIEJSQUNLRVQKKzB4N0UJMHgwMDdFCSMJVElMREUKKzB4N0YJMHgwMDdGCSMJREVMRVRFCisweDgwCTB4MDA4MAkjCTxjb250cm9sPgorMHg4MQkweDAwODEJIwk8Y29udHJvbD4KKzB4ODIJMHgwMDgyCSMJPGNvbnRyb2w+CisweDgzCTB4MDA4MwkjCTxjb250cm9sPgorMHg4NAkweDAwODQJIwk8Y29udHJvbD4KKzB4ODUJMHgwMDg1CSMJPGNvbnRyb2w+CisweDg2CTB4MDA4NgkjCTxjb250cm9sPgorMHg4NwkweDAwODcJIwk8Y29udHJvbD4KKzB4ODgJMHgwMDg4CSMJPGNvbnRyb2w+CisweDg5CTB4MDA4OQkjCTxjb250cm9sPgorMHg4QQkweDAwOEEJIwk8Y29udHJvbD4KKzB4OEIJMHgwMDhCCSMJPGNvbnRyb2w+CisweDhDCTB4MDA4QwkjCTxjb250cm9sPgorMHg4RAkweDAwOEQJIwk8Y29udHJvbD4KKzB4OEUJMHgwMDhFCSMJPGNvbnRyb2w+CisweDhGCTB4MDA4RgkjCTxjb250cm9sPgorMHg5MAkweDAwOTAJIwk8Y29udHJvbD4KKzB4OTEJMHgwMDkxCSMJPGNvbnRyb2w+CisweDkyCTB4MDA5MgkjCTxjb250cm9sPgorMHg5MwkweDAwOTMJIwk8Y29udHJvbD4KKzB4OTQJMHgwMDk0CSMJPGNvbnRyb2w+CisweDk1CTB4MDA5NQkjCTxjb250cm9sPgorMHg5NgkweDAwOTYJIwk8Y29udHJvbD4KKzB4OTcJMHgwMDk3CSMJPGNvbnRyb2w+CisweDk4CTB4MDA5OAkjCTxjb250cm9sPgorMHg5OQkweDAwOTkJIwk8Y29udHJvbD4KKzB4OUEJMHgwMDlBCSMJPGNvbnRyb2w+CisweDlCCTB4MDA5QgkjCTxjb250cm9sPgorMHg5QwkweDAwOUMJIwk8Y29udHJvbD4KKzB4OUQJMHgwMDlECSMJPGNvbnRyb2w+CisweDlFCTB4MDA5RQkjCTxjb250cm9sPgorMHg5RgkweDAwOUYJIwk8Y29udHJvbD4KKzB4QTAJMHgwMEEwCSMJTk8tQlJFQUsgU1BBQ0UKKzB4QTEJMHgwNDAxCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKzB4QTIJMHgwNDAyCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREpFCisweEEzCTB4MDQwMwkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIEdKRQorMHhBNAkweDA0MDQJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKzB4QTUJMHgwNDA1CSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRFpFCisweEE2CTB4MDQwNgkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorMHhBNwkweDA0MDcJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSQorMHhBOAkweDA0MDgJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBKRQorMHhBOQkweDA0MDkJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBMSkUKKzB4QUEJMHgwNDBBCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTkpFCisweEFCCTB4MDQwQgkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIFRTSEUKKzB4QUMJMHgwNDBDCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFCisweEFECTB4MDBBRAkjCVNPRlQgSFlQSEVOCisweEFFCTB4MDQwRQkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUKKzB4QUYJMHgwNDBGCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRFpIRQorMHhCMAkweDA0MTAJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisweEIxCTB4MDQxMQkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisweEIyCTB4MDQxMgkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisweEIzCTB4MDQxMwkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorMHhCNAkweDA0MTQJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERQorMHhCNQkweDA0MTUJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorMHhCNgkweDA0MTYJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUKKzB4QjcJMHgwNDE3CSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKzB4QjgJMHgwNDE4CSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorMHhCOQkweDA0MTkJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBJCisweEJBCTB4MDQxQQkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisweEJCCTB4MDQxQgkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisweEJDCTB4MDQxQwkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisweEJECTB4MDQxRAkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisweEJFCTB4MDQxRQkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKzB4QkYJMHgwNDFGCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUEUKKzB4QzAJMHgwNDIwCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKzB4QzEJMHgwNDIxCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVMKKzB4QzIJMHgwNDIyCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEUKKzB4QzMJMHgwNDIzCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorMHhDNAkweDA0MjQJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorMHhDNQkweDA0MjUJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQQorMHhDNgkweDA0MjYJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKzB4QzcJMHgwNDI3CSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisweEM4CTB4MDQyOAkjCUNZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQQorMHhDOQkweDA0MjkJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorMHhDQQkweDA0MkEJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKzB4Q0IJMHgwNDJCCSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorMHhDQwkweDA0MkMJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKzB4Q0QJMHgwNDJECSMJQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorMHhDRQkweDA0MkUJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorMHhDRgkweDA0MkYJIwlDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorMHhEMAkweDA0MzAJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorMHhEMQkweDA0MzEJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUKKzB4RDIJMHgwNDMyCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisweEQzCTB4MDQzMwkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBHSEUKKzB4RDQJMHgwNDM0CSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisweEQ1CTB4MDQzNQkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBJRQorMHhENgkweDA0MzYJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisweEQ3CTB4MDQzNwkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBaRQorMHhEOAkweDA0MzgJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorMHhEOQkweDA0MzkJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorMHhEQQkweDA0M0EJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EKKzB4REIJMHgwNDNCCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisweERDCTB4MDQzQwkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBFTQorMHhERAkweDA0M0QJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4KKzB4REUJMHgwNDNFCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKzB4REYJMHgwNDNGCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisweEUwCTB4MDQ0MAkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBFUgorMHhFMQkweDA0NDEJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKzB4RTIJMHgwNDQyCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisweEUzCTB4MDQ0MwkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBVCisweEU0CTB4MDQ0NAkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBFRgorMHhFNQkweDA0NDUJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKzB4RTYJMHgwNDQ2CSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorMHhFNwkweDA0NDcJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisweEU4CTB4MDQ0OAkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKzB4RTkJMHgwNDQ5CSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisweEVBCTB4MDQ0QQkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKzB4RUIJMHgwNDRCCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKzB4RUMJMHgwNDRDCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorMHhFRAkweDA0NEQJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorMHhFRQkweDA0NEUJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKzB4RUYJMHgwNDRGCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisweEYwCTB4MjExNgkjCU5VTUVSTyBTSUdOCisweEYxCTB4MDQ1MQkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBJTworMHhGMgkweDA0NTIJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgREpFCisweEYzCTB4MDQ1MwkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBHSkUKKzB4RjQJMHgwNDU0CSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorMHhGNQkweDA0NTUJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpFCisweEY2CTB4MDQ1NgkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkKKzB4RjcJMHgwNDU3CSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJCisweEY4CTB4MDQ1OAkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBKRQorMHhGOQkweDA0NTkJIwlDWVJJTExJQyBTTUFMTCBMRVRURVIgTEpFCisweEZBCTB4MDQ1QQkjCUNZUklMTElDIFNNQUxMIExFVFRFUiBOSkUKKzB4RkIJMHgwNDVCCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTSEUKKzB4RkMJMHgwNDVDCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtKRQorMHhGRAkweDAwQTcJIwlTRUNUSU9OIFNJR04KKzB4RkUJMHgwNDVFCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUKKzB4RkYJMHgwNDVGCSMJQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaSEUKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2lzbzg4NTktNi50eHQgYi9jb2RlcGFnZS9pc284ODU5LTYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWM3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9pc284ODU5LTYudHh0CkBAIC0wLDAgKzEsMjYwIEBACisjCisjCU5hbWU6ICAgICAgICAgICAgIElTTyA4ODU5LTY6MTk5OSB0byBVbmljb2RlCisjCVVuaWNvZGUgdmVyc2lvbjogIDMuMAorIwlUYWJsZSB2ZXJzaW9uOiAgICAxLjAKKyMJVGFibGUgZm9ybWF0OiAgICAgRm9ybWF0IEEKKyMJRGF0ZTogICAgICAgICAgICAgMTk5OSBKdWx5IDI3CisjCUF1dGhvcnM6ICAgICAgICAgIEtlbiBXaGlzdGxlciA8a2Vud0BzeWJhc2UuY29tPgorIworIwlDb3B5cmlnaHQgKGMpIDE5OTEtMTk5OSBVbmljb2RlLCBJbmMuICBBbGwgUmlnaHRzIHJlc2VydmVkLgorIworIwlUaGlzIGZpbGUgaXMgcHJvdmlkZWQgYXMtaXMgYnkgVW5pY29kZSwgSW5jLiAoVGhlIFVuaWNvZGUgQ29uc29ydGl1bSkuCisjCU5vIGNsYWltcyBhcmUgbWFkZSBhcyB0byBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiAgTm8KKyMJd2FycmFudGllcyBvZiBhbnkga2luZCBhcmUgZXhwcmVzc2VkIG9yIGltcGxpZWQuICBUaGUgcmVjaXBpZW50CisjCWFncmVlcyB0byBkZXRlcm1pbmUgYXBwbGljYWJpbGl0eSBvZiBpbmZvcm1hdGlvbiBwcm92aWRlZC4gIElmIHRoaXMKKyMJZmlsZSBoYXMgYmVlbiBwcm92aWRlZCBvbiBvcHRpY2FsIG1lZGlhIGJ5IFVuaWNvZGUsIEluYy4sIHRoZSBzb2xlCisjCXJlbWVkeSBmb3IgYW55IGNsYWltIHdpbGwgYmUgZXhjaGFuZ2Ugb2YgZGVmZWN0aXZlIG1lZGlhIHdpdGhpbiA5MAorIwlkYXlzIG9mIHJlY2VpcHQuCisjCisjCVVuaWNvZGUsIEluYy4gaGVyZWJ5IGdyYW50cyB0aGUgcmlnaHQgdG8gZnJlZWx5IHVzZSB0aGUgaW5mb3JtYXRpb24KKyMJc3VwcGxpZWQgaW4gdGhpcyBmaWxlIGluIHRoZSBjcmVhdGlvbiBvZiBwcm9kdWN0cyBzdXBwb3J0aW5nIHRoZQorIwlVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtIGZvcgorIwlpbnRlcm5hbCBvciBleHRlcm5hbCBkaXN0cmlidXRpb24gYXMgbG9uZyBhcyB0aGlzIG5vdGljZSByZW1haW5zCisjCWF0dGFjaGVkLgorIworIwlHZW5lcmFsIG5vdGVzOgorIworIwlUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkYXRhIHRoZSBVbmljb2RlIENvbnNvcnRpdW0gaGFzIG9uIGhvdworIyAgICAgICBJU08vSUVDIDg4NTktNjoxOTk5IGNoYXJhY3RlcnMgbWFwIGludG8gVW5pY29kZS4KKyMKKyMJRm9ybWF0OiAgVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjCQkgQ29sdW1uICMxIGlzIHRoZSBJU08vSUVDIDg4NTktNiBjb2RlIChpbiBoZXggYXMgMHhYWCkKKyMJCSBDb2x1bW4gIzIgaXMgdGhlIFVuaWNvZGUgKGluIGhleCBhcyAweFhYWFgpCisjCQkgQ29sdW1uICMzIHRoZSBVbmljb2RlIG5hbWUgKGZvbGxvd3MgYSBjb21tZW50IHNpZ24sICcjJykKKyMKKyMJVGhlIGVudHJpZXMgYXJlIGluIElTTy9JRUMgODg1OS02IG9yZGVyLgorIworIwlWZXJzaW9uIGhpc3RvcnkKKyMJMS4wIHZlcnNpb24gdXBkYXRlcyAwLjEgdmVyc2lvbiBieSBhZGRpbmcgbWFwcGluZ3MgZm9yIGFsbAorIwljb250cm9sIGNoYXJhY3RlcnMuCisjCTB4MzAuLjB4MzkgcmVtYXBwZWQgdG8gdGhlIEFTQ0lJIGRpZ2l0cyAoVSswMDMwLi5VKzAwMzkpIGluc3RlYWQKKyMJb2YgdGhlIEFyYWJpYyBkaWdpdHMgKFUrMDY2MC4uVSswNjY5KS4KKyMKKyMJVXBkYXRlZCB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgbWF5IGJlIGZvdW5kIGluOgorIwkJPGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvPgorIworIwlBbnkgY29tbWVudHMgb3IgcHJvYmxlbXMsIGNvbnRhY3QgPGVycmF0YUB1bmljb2RlLm9yZz4KKyMJUGxlYXNlIG5vdGUgdGhhdCA8ZXJyYXRhQHVuaWNvZGUub3JnPiBpcyBhbiBhcmNoaXZhbCBhZGRyZXNzOworIwlub3RpY2VzIHdpbGwgYmUgY2hlY2tlZCwgYnV0IGRvIG5vdCBleHBlY3QgYW4gaW1tZWRpYXRlIHJlc3BvbnNlLgorIworMHgwMAkweDAwMDAJIwlOVUxMCisweDAxCTB4MDAwMQkjCVNUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSMJU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJIwlFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJIwlFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjCUVOUVVJUlkKKzB4MDYJMHgwMDA2CSMJQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSMJQkVMTAorMHgwOAkweDAwMDgJIwlCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSMJSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBBCTB4MDAwQQkjCUxJTkUgRkVFRAorMHgwQgkweDAwMEIJIwlWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBDCTB4MDAwQwkjCUZPUk0gRkVFRAorMHgwRAkweDAwMEQJIwlDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSMJU0hJRlQgT1VUCisweDBGCTB4MDAwRgkjCVNISUZUIElOCisweDEwCTB4MDAxMAkjCURBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSMJREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjCURFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJIwlERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJIwlERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjCU5FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjCVNZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSMJRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJIwlDQU5DRUwKKzB4MTkJMHgwMDE5CSMJRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJIwlTVUJTVElUVVRFCisweDFCCTB4MDAxQgkjCUVTQ0FQRQorMHgxQwkweDAwMUMJIwlGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJIwlHUk9VUCBTRVBBUkFUT1IKKzB4MUUJMHgwMDFFCSMJUkVDT1JEIFNFUEFSQVRPUgorMHgxRgkweDAwMUYJIwlVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJIwlTUEFDRQorMHgyMQkweDAwMjEJIwlFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjCVFVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjCU5VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjCURPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjCVBFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJIwlBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSMJQVBPU1RST1BIRQorMHgyOAkweDAwMjgJIwlMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjCVJJR0hUIFBBUkVOVEhFU0lTCisweDJBCTB4MDAyQQkjCUFTVEVSSVNLCisweDJCCTB4MDAyQgkjCVBMVVMgU0lHTgorMHgyQwkweDAwMkMJIwlDT01NQQorMHgyRAkweDAwMkQJIwlIWVBIRU4tTUlOVVMKKzB4MkUJMHgwMDJFCSMJRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjCVNPTElEVVMKKzB4MzAJMHgwMDMwCSMJRElHSVQgWkVSTworMHgzMQkweDAwMzEJIwlESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSMJRElHSVQgVFdPCisweDMzCTB4MDAzMwkjCURJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjCURJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSMJRElHSVQgRklWRQorMHgzNgkweDAwMzYJIwlESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSMJRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSMJRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSMJRElHSVQgTklORQorMHgzQQkweDAwM0EJIwlDT0xPTgorMHgzQgkweDAwM0IJIwlTRU1JQ09MT04KKzB4M0MJMHgwMDNDCSMJTEVTUy1USEFOIFNJR04KKzB4M0QJMHgwMDNECSMJRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSMJR1JFQVRFUi1USEFOIFNJR04KKzB4M0YJMHgwMDNGCSMJUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJIwlDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NEIJMHgwMDRCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0QwkweDAwNEMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NEUJMHgwMDRFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0RgkweDAwNEYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NUEJMHgwMDVBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1QgkweDAwNUIJIwlMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjCVJFVkVSU0UgU09MSURVUworMHg1RAkweDAwNUQJIwlSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1RQkweDAwNUUJIwlDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJIwlMT1cgTElORQorMHg2MAkweDAwNjAJIwlHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSMJTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSMJTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSMJTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSMJTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSMJTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NkEJMHgwMDZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSMJTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NkMJMHgwMDZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NkQJMHgwMDZECSMJTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSMJTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NkYJMHgwMDZGCSMJTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSMJTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSMJTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSMJTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSMJTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSMJTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSMJTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSMJTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSMJTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N0IJMHgwMDdCCSMJTEVGVCBDVVJMWSBCUkFDS0VUCisweDdDCTB4MDA3QwkjCVZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSMJUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3RQkweDAwN0UJIwlUSUxERQorMHg3RgkweDAwN0YJIwlERUxFVEUKKzB4ODAJMHgwMDgwCSMJPGNvbnRyb2w+CisweDgxCTB4MDA4MQkjCTxjb250cm9sPgorMHg4MgkweDAwODIJIwk8Y29udHJvbD4KKzB4ODMJMHgwMDgzCSMJPGNvbnRyb2w+CisweDg0CTB4MDA4NAkjCTxjb250cm9sPgorMHg4NQkweDAwODUJIwk8Y29udHJvbD4KKzB4ODYJMHgwMDg2CSMJPGNvbnRyb2w+CisweDg3CTB4MDA4NwkjCTxjb250cm9sPgorMHg4OAkweDAwODgJIwk8Y29udHJvbD4KKzB4ODkJMHgwMDg5CSMJPGNvbnRyb2w+CisweDhBCTB4MDA4QQkjCTxjb250cm9sPgorMHg4QgkweDAwOEIJIwk8Y29udHJvbD4KKzB4OEMJMHgwMDhDCSMJPGNvbnRyb2w+CisweDhECTB4MDA4RAkjCTxjb250cm9sPgorMHg4RQkweDAwOEUJIwk8Y29udHJvbD4KKzB4OEYJMHgwMDhGCSMJPGNvbnRyb2w+CisweDkwCTB4MDA5MAkjCTxjb250cm9sPgorMHg5MQkweDAwOTEJIwk8Y29udHJvbD4KKzB4OTIJMHgwMDkyCSMJPGNvbnRyb2w+CisweDkzCTB4MDA5MwkjCTxjb250cm9sPgorMHg5NAkweDAwOTQJIwk8Y29udHJvbD4KKzB4OTUJMHgwMDk1CSMJPGNvbnRyb2w+CisweDk2CTB4MDA5NgkjCTxjb250cm9sPgorMHg5NwkweDAwOTcJIwk8Y29udHJvbD4KKzB4OTgJMHgwMDk4CSMJPGNvbnRyb2w+CisweDk5CTB4MDA5OQkjCTxjb250cm9sPgorMHg5QQkweDAwOUEJIwk8Y29udHJvbD4KKzB4OUIJMHgwMDlCCSMJPGNvbnRyb2w+CisweDlDCTB4MDA5QwkjCTxjb250cm9sPgorMHg5RAkweDAwOUQJIwk8Y29udHJvbD4KKzB4OUUJMHgwMDlFCSMJPGNvbnRyb2w+CisweDlGCTB4MDA5RgkjCTxjb250cm9sPgorMHhBMAkweDAwQTAJIwlOTy1CUkVBSyBTUEFDRQorMHhBNAkweDAwQTQJIwlDVVJSRU5DWSBTSUdOCisweEFDCTB4MDYwQwkjCUFSQUJJQyBDT01NQQorMHhBRAkweDAwQUQJIwlTT0ZUIEhZUEhFTgorMHhCQgkweDA2MUIJIwlBUkFCSUMgU0VNSUNPTE9OCisweEJGCTB4MDYxRgkjCUFSQUJJQyBRVUVTVElPTiBNQVJLCisweEMxCTB4MDYyMQkjCUFSQUJJQyBMRVRURVIgSEFNWkEKKzB4QzIJMHgwNjIyCSMJQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUKKzB4QzMJMHgwNjIzCSMJQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUKKzB4QzQJMHgwNjI0CSMJQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRQorMHhDNQkweDA2MjUJIwlBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBCRUxPVworMHhDNgkweDA2MjYJIwlBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFCisweEM3CTB4MDYyNwkjCUFSQUJJQyBMRVRURVIgQUxFRgorMHhDOAkweDA2MjgJIwlBUkFCSUMgTEVUVEVSIEJFSAorMHhDOQkweDA2MjkJIwlBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBCisweENBCTB4MDYyQQkjCUFSQUJJQyBMRVRURVIgVEVICisweENCCTB4MDYyQgkjCUFSQUJJQyBMRVRURVIgVEhFSAorMHhDQwkweDA2MkMJIwlBUkFCSUMgTEVUVEVSIEpFRU0KKzB4Q0QJMHgwNjJECSMJQVJBQklDIExFVFRFUiBIQUgKKzB4Q0UJMHgwNjJFCSMJQVJBQklDIExFVFRFUiBLSEFICisweENGCTB4MDYyRgkjCUFSQUJJQyBMRVRURVIgREFMCisweEQwCTB4MDYzMAkjCUFSQUJJQyBMRVRURVIgVEhBTAorMHhEMQkweDA2MzEJIwlBUkFCSUMgTEVUVEVSIFJFSAorMHhEMgkweDA2MzIJIwlBUkFCSUMgTEVUVEVSIFpBSU4KKzB4RDMJMHgwNjMzCSMJQVJBQklDIExFVFRFUiBTRUVOCisweEQ0CTB4MDYzNAkjCUFSQUJJQyBMRVRURVIgU0hFRU4KKzB4RDUJMHgwNjM1CSMJQVJBQklDIExFVFRFUiBTQUQKKzB4RDYJMHgwNjM2CSMJQVJBQklDIExFVFRFUiBEQUQKKzB4RDcJMHgwNjM3CSMJQVJBQklDIExFVFRFUiBUQUgKKzB4RDgJMHgwNjM4CSMJQVJBQklDIExFVFRFUiBaQUgKKzB4RDkJMHgwNjM5CSMJQVJBQklDIExFVFRFUiBBSU4KKzB4REEJMHgwNjNBCSMJQVJBQklDIExFVFRFUiBHSEFJTgorMHhFMAkweDA2NDAJIwlBUkFCSUMgVEFUV0VFTAorMHhFMQkweDA2NDEJIwlBUkFCSUMgTEVUVEVSIEZFSAorMHhFMgkweDA2NDIJIwlBUkFCSUMgTEVUVEVSIFFBRgorMHhFMwkweDA2NDMJIwlBUkFCSUMgTEVUVEVSIEtBRgorMHhFNAkweDA2NDQJIwlBUkFCSUMgTEVUVEVSIExBTQorMHhFNQkweDA2NDUJIwlBUkFCSUMgTEVUVEVSIE1FRU0KKzB4RTYJMHgwNjQ2CSMJQVJBQklDIExFVFRFUiBOT09OCisweEU3CTB4MDY0NwkjCUFSQUJJQyBMRVRURVIgSEVICisweEU4CTB4MDY0OAkjCUFSQUJJQyBMRVRURVIgV0FXCisweEU5CTB4MDY0OQkjCUFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBCisweEVBCTB4MDY0QQkjCUFSQUJJQyBMRVRURVIgWUVICisweEVCCTB4MDY0QgkjCUFSQUJJQyBGQVRIQVRBTgorMHhFQwkweDA2NEMJIwlBUkFCSUMgREFNTUFUQU4KKzB4RUQJMHgwNjRECSMJQVJBQklDIEtBU1JBVEFOCisweEVFCTB4MDY0RQkjCUFSQUJJQyBGQVRIQQorMHhFRgkweDA2NEYJIwlBUkFCSUMgREFNTUEKKzB4RjAJMHgwNjUwCSMJQVJBQklDIEtBU1JBCisweEYxCTB4MDY1MQkjCUFSQUJJQyBTSEFEREEKKzB4RjIJMHgwNjUyCSMJQVJBQklDIFNVS1VOCmRpZmYgLS1naXQgYS9jb2RlcGFnZS9pc284ODU5LTcudHh0IGIvY29kZXBhZ2UvaXNvODg1OS03LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ2Yjc0Ci0tLSAvZGV2L251bGwKKysrIGIvY29kZXBhZ2UvaXNvODg1OS03LnR4dApAQCAtMCwwICsxLDMwOCBAQAorIworIwlOYW1lOiAgICAgICAgICAgICBJU08gODg1OS03OjIwMDMgdG8gVW5pY29kZQorIwlVbmljb2RlIHZlcnNpb246ICA0LjAKKyMJVGFibGUgdmVyc2lvbjogICAgMi4wCisjCVRhYmxlIGZvcm1hdDogICAgIEZvcm1hdCBBCisjCURhdGU6ICAgICAgICAgICAgIDIwMDMtTm92LTEyCisjCUF1dGhvcnM6ICAgICAgICAgIEtlbiBXaGlzdGxlciA8a2Vud0BzeWJhc2UuY29tPgorIworIwlDb3B5cmlnaHQgKGMpIDE5OTEtMjAwMyBVbmljb2RlLCBJbmMuICBBbGwgUmlnaHRzIHJlc2VydmVkLgorIworIwlUaGlzIGZpbGUgaXMgcHJvdmlkZWQgYXMtaXMgYnkgVW5pY29kZSwgSW5jLiAoVGhlIFVuaWNvZGUgQ29uc29ydGl1bSkuCisjCU5vIGNsYWltcyBhcmUgbWFkZSBhcyB0byBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiAgTm8KKyMJd2FycmFudGllcyBvZiBhbnkga2luZCBhcmUgZXhwcmVzc2VkIG9yIGltcGxpZWQuICBUaGUgcmVjaXBpZW50CisjCWFncmVlcyB0byBkZXRlcm1pbmUgYXBwbGljYWJpbGl0eSBvZiBpbmZvcm1hdGlvbiBwcm92aWRlZC4gIElmIHRoaXMKKyMJZmlsZSBoYXMgYmVlbiBwcm92aWRlZCBvbiBvcHRpY2FsIG1lZGlhIGJ5IFVuaWNvZGUsIEluYy4sIHRoZSBzb2xlCisjCXJlbWVkeSBmb3IgYW55IGNsYWltIHdpbGwgYmUgZXhjaGFuZ2Ugb2YgZGVmZWN0aXZlIG1lZGlhIHdpdGhpbiA5MAorIwlkYXlzIG9mIHJlY2VpcHQuCisjCisjCVVuaWNvZGUsIEluYy4gaGVyZWJ5IGdyYW50cyB0aGUgcmlnaHQgdG8gZnJlZWx5IHVzZSB0aGUgaW5mb3JtYXRpb24KKyMJc3VwcGxpZWQgaW4gdGhpcyBmaWxlIGluIHRoZSBjcmVhdGlvbiBvZiBwcm9kdWN0cyBzdXBwb3J0aW5nIHRoZQorIwlVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtIGZvcgorIwlpbnRlcm5hbCBvciBleHRlcm5hbCBkaXN0cmlidXRpb24gYXMgbG9uZyBhcyB0aGlzIG5vdGljZSByZW1haW5zCisjCWF0dGFjaGVkLgorIworIwlHZW5lcmFsIG5vdGVzOgorIworIwlUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkYXRhIHRoZSBVbmljb2RlIENvbnNvcnRpdW0gaGFzIG9uIGhvdworIyAgICAgICBJU08gODg1OS03OjIwMDMgY2hhcmFjdGVycyBtYXAgaW50byBVbmljb2RlLgorIworIwlJU08gODg1OS03OjE5ODcgaXMgZXF1aXZhbGVudCB0byBJU08tSVItMTI2LCBFTE9UIDkyOCwKKyMJYW5kIEVDTUEgMTE4LiBJU08gODg1OS03OjIwMDMgYWRkcyB0d28gY3VycmVuY3kgc2lnbnMgCisjCWFuZCBvbmUgb3RoZXIgY2hhcmFjdGVyIG5vdCBpbiB0aGUgZWFybGllciBzdGFuZGFyZC4KKyMKKyMJRm9ybWF0OiAgVGhyZWUgdGFiLXNlcGFyYXRlZCBjb2x1bW5zCisjCQkgQ29sdW1uICMxIGlzIHRoZSBJU08gODg1OS03IGNvZGUgKGluIGhleCBhcyAweFhYKQorIwkJIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMJCSBDb2x1bW4gIzMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIwlUaGUgZW50cmllcyBhcmUgaW4gSVNPIDg4NTktNyBvcmRlci4KKyMKKyMJVmVyc2lvbiBoaXN0b3J5CisjCTEuMCB2ZXJzaW9uIHVwZGF0ZXMgMC4xIHZlcnNpb24gYnkgYWRkaW5nIG1hcHBpbmdzIGZvciBhbGwKKyMJY29udHJvbCBjaGFyYWN0ZXJzLgorIwlSZW1hcCAweEExIHRvIFUrMjAxOCAoaW5zdGVhZCBvZiAweDAyQkQpIHRvIG1hdGNoIHRleHQgb2YgODg1OS03CisjCVJlbWFwIDB4QTIgdG8gVSsyMDE5IChpbnN0ZWFkIG9mIDB4MDJCQykgdG8gbWF0Y2ggdGV4dCBvZiA4ODU5LTcKKyMKKyMJMi4wIHZlcnNpb24gdXBkYXRlcyAxLjAgdmVyc2lvbiBieSBhZGRpbmcgbWFwcGluZ3MgZm9yIHRoZQorIwl0aHJlZSBuZXdseSBhZGRlZCBjaGFyYWN0ZXJzIDB4QTQsIDB4QTUsIDB4QUEuCisjCisjCVVwZGF0ZWQgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIG1heSBiZSBmb3VuZCBpbjoKKyMJCTxodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy8+CisjCisjCUFueSBjb21tZW50cyBvciBwcm9ibGVtcywgY29udGFjdCB0aGUgVW5pY29kZSBDb25zb3J0aXVtIGF0OgorIwkgICAgICAgIDxodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydGluZy5odG1sPgorIworMHgwMAkweDAwMDAJIwlOVUxMCisweDAxCTB4MDAwMQkjCVNUQVJUIE9GIEhFQURJTkcKKzB4MDIJMHgwMDAyCSMJU1RBUlQgT0YgVEVYVAorMHgwMwkweDAwMDMJIwlFTkQgT0YgVEVYVAorMHgwNAkweDAwMDQJIwlFTkQgT0YgVFJBTlNNSVNTSU9OCisweDA1CTB4MDAwNQkjCUVOUVVJUlkKKzB4MDYJMHgwMDA2CSMJQUNLTk9XTEVER0UKKzB4MDcJMHgwMDA3CSMJQkVMTAorMHgwOAkweDAwMDgJIwlCQUNLU1BBQ0UKKzB4MDkJMHgwMDA5CSMJSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisweDBBCTB4MDAwQQkjCUxJTkUgRkVFRAorMHgwQgkweDAwMEIJIwlWRVJUSUNBTCBUQUJVTEFUSU9OCisweDBDCTB4MDAwQwkjCUZPUk0gRkVFRAorMHgwRAkweDAwMEQJIwlDQVJSSUFHRSBSRVRVUk4KKzB4MEUJMHgwMDBFCSMJU0hJRlQgT1VUCisweDBGCTB4MDAwRgkjCVNISUZUIElOCisweDEwCTB4MDAxMAkjCURBVEEgTElOSyBFU0NBUEUKKzB4MTEJMHgwMDExCSMJREVWSUNFIENPTlRST0wgT05FCisweDEyCTB4MDAxMgkjCURFVklDRSBDT05UUk9MIFRXTworMHgxMwkweDAwMTMJIwlERVZJQ0UgQ09OVFJPTCBUSFJFRQorMHgxNAkweDAwMTQJIwlERVZJQ0UgQ09OVFJPTCBGT1VSCisweDE1CTB4MDAxNQkjCU5FR0FUSVZFIEFDS05PV0xFREdFCisweDE2CTB4MDAxNgkjCVNZTkNIUk9OT1VTIElETEUKKzB4MTcJMHgwMDE3CSMJRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworMHgxOAkweDAwMTgJIwlDQU5DRUwKKzB4MTkJMHgwMDE5CSMJRU5EIE9GIE1FRElVTQorMHgxQQkweDAwMUEJIwlTVUJTVElUVVRFCisweDFCCTB4MDAxQgkjCUVTQ0FQRQorMHgxQwkweDAwMUMJIwlGSUxFIFNFUEFSQVRPUgorMHgxRAkweDAwMUQJIwlHUk9VUCBTRVBBUkFUT1IKKzB4MUUJMHgwMDFFCSMJUkVDT1JEIFNFUEFSQVRPUgorMHgxRgkweDAwMUYJIwlVTklUIFNFUEFSQVRPUgorMHgyMAkweDAwMjAJIwlTUEFDRQorMHgyMQkweDAwMjEJIwlFWENMQU1BVElPTiBNQVJLCisweDIyCTB4MDAyMgkjCVFVT1RBVElPTiBNQVJLCisweDIzCTB4MDAyMwkjCU5VTUJFUiBTSUdOCisweDI0CTB4MDAyNAkjCURPTExBUiBTSUdOCisweDI1CTB4MDAyNQkjCVBFUkNFTlQgU0lHTgorMHgyNgkweDAwMjYJIwlBTVBFUlNBTkQKKzB4MjcJMHgwMDI3CSMJQVBPU1RST1BIRQorMHgyOAkweDAwMjgJIwlMRUZUIFBBUkVOVEhFU0lTCisweDI5CTB4MDAyOQkjCVJJR0hUIFBBUkVOVEhFU0lTCisweDJBCTB4MDAyQQkjCUFTVEVSSVNLCisweDJCCTB4MDAyQgkjCVBMVVMgU0lHTgorMHgyQwkweDAwMkMJIwlDT01NQQorMHgyRAkweDAwMkQJIwlIWVBIRU4tTUlOVVMKKzB4MkUJMHgwMDJFCSMJRlVMTCBTVE9QCisweDJGCTB4MDAyRgkjCVNPTElEVVMKKzB4MzAJMHgwMDMwCSMJRElHSVQgWkVSTworMHgzMQkweDAwMzEJIwlESUdJVCBPTkUKKzB4MzIJMHgwMDMyCSMJRElHSVQgVFdPCisweDMzCTB4MDAzMwkjCURJR0lUIFRIUkVFCisweDM0CTB4MDAzNAkjCURJR0lUIEZPVVIKKzB4MzUJMHgwMDM1CSMJRElHSVQgRklWRQorMHgzNgkweDAwMzYJIwlESUdJVCBTSVgKKzB4MzcJMHgwMDM3CSMJRElHSVQgU0VWRU4KKzB4MzgJMHgwMDM4CSMJRElHSVQgRUlHSFQKKzB4MzkJMHgwMDM5CSMJRElHSVQgTklORQorMHgzQQkweDAwM0EJIwlDT0xPTgorMHgzQgkweDAwM0IJIwlTRU1JQ09MT04KKzB4M0MJMHgwMDNDCSMJTEVTUy1USEFOIFNJR04KKzB4M0QJMHgwMDNECSMJRVFVQUxTIFNJR04KKzB4M0UJMHgwMDNFCSMJR1JFQVRFUi1USEFOIFNJR04KKzB4M0YJMHgwMDNGCSMJUVVFU1RJT04gTUFSSworMHg0MAkweDAwNDAJIwlDT01NRVJDSUFMIEFUCisweDQxCTB4MDA0MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIJMHgwMDQyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorMHg0MwkweDAwNDMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisweDQ0CTB4MDA0NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUJMHgwMDQ1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorMHg0NgkweDAwNDYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisweDQ3CTB4MDA0NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDgJMHgwMDQ4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorMHg0OQkweDAwNDkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisweDRBCTB4MDA0QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NEIJMHgwMDRCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworMHg0QwkweDAwNEMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisweDRECTB4MDA0RAkjCUxBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NEUJMHgwMDRFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorMHg0RgkweDAwNEYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisweDUwCTB4MDA1MAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEJMHgwMDUxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorMHg1MgkweDAwNTIJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisweDUzCTB4MDA1MwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQJMHgwMDU0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorMHg1NQkweDAwNTUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisweDU2CTB4MDA1NgkjCUxBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcJMHgwMDU3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworMHg1OAkweDAwNTgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisweDU5CTB4MDA1OQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NUEJMHgwMDVBCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorMHg1QgkweDAwNUIJIwlMRUZUIFNRVUFSRSBCUkFDS0VUCisweDVDCTB4MDA1QwkjCVJFVkVSU0UgU09MSURVUworMHg1RAkweDAwNUQJIwlSSUdIVCBTUVVBUkUgQlJBQ0tFVAorMHg1RQkweDAwNUUJIwlDSVJDVU1GTEVYIEFDQ0VOVAorMHg1RgkweDAwNUYJIwlMT1cgTElORQorMHg2MAkweDAwNjAJIwlHUkFWRSBBQ0NFTlQKKzB4NjEJMHgwMDYxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEKKzB4NjIJMHgwMDYyCSMJTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMJMHgwMDYzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEMKKzB4NjQJMHgwMDY0CSMJTEFUSU4gU01BTEwgTEVUVEVSIEQKKzB4NjUJMHgwMDY1CSMJTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYJMHgwMDY2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEYKKzB4NjcJMHgwMDY3CSMJTEFUSU4gU01BTEwgTEVUVEVSIEcKKzB4NjgJMHgwMDY4CSMJTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkJMHgwMDY5CSMJTEFUSU4gU01BTEwgTEVUVEVSIEkKKzB4NkEJMHgwMDZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEoKKzB4NkIJMHgwMDZCCSMJTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NkMJMHgwMDZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIEwKKzB4NkQJMHgwMDZECSMJTEFUSU4gU01BTEwgTEVUVEVSIE0KKzB4NkUJMHgwMDZFCSMJTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NkYJMHgwMDZGCSMJTEFUSU4gU01BTEwgTEVUVEVSIE8KKzB4NzAJMHgwMDcwCSMJTEFUSU4gU01BTEwgTEVUVEVSIFAKKzB4NzEJMHgwMDcxCSMJTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIJMHgwMDcyCSMJTEFUSU4gU01BTEwgTEVUVEVSIFIKKzB4NzMJMHgwMDczCSMJTEFUSU4gU01BTEwgTEVUVEVSIFMKKzB4NzQJMHgwMDc0CSMJTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUJMHgwMDc1CSMJTEFUSU4gU01BTEwgTEVUVEVSIFUKKzB4NzYJMHgwMDc2CSMJTEFUSU4gU01BTEwgTEVUVEVSIFYKKzB4NzcJMHgwMDc3CSMJTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzgJMHgwMDc4CSMJTEFUSU4gU01BTEwgTEVUVEVSIFgKKzB4NzkJMHgwMDc5CSMJTEFUSU4gU01BTEwgTEVUVEVSIFkKKzB4N0EJMHgwMDdBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N0IJMHgwMDdCCSMJTEVGVCBDVVJMWSBCUkFDS0VUCisweDdDCTB4MDA3QwkjCVZFUlRJQ0FMIExJTkUKKzB4N0QJMHgwMDdECSMJUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3RQkweDAwN0UJIwlUSUxERQorMHg3RgkweDAwN0YJIwlERUxFVEUKKzB4ODAJMHgwMDgwCSMJPGNvbnRyb2w+CisweDgxCTB4MDA4MQkjCTxjb250cm9sPgorMHg4MgkweDAwODIJIwk8Y29udHJvbD4KKzB4ODMJMHgwMDgzCSMJPGNvbnRyb2w+CisweDg0CTB4MDA4NAkjCTxjb250cm9sPgorMHg4NQkweDAwODUJIwk8Y29udHJvbD4KKzB4ODYJMHgwMDg2CSMJPGNvbnRyb2w+CisweDg3CTB4MDA4NwkjCTxjb250cm9sPgorMHg4OAkweDAwODgJIwk8Y29udHJvbD4KKzB4ODkJMHgwMDg5CSMJPGNvbnRyb2w+CisweDhBCTB4MDA4QQkjCTxjb250cm9sPgorMHg4QgkweDAwOEIJIwk8Y29udHJvbD4KKzB4OEMJMHgwMDhDCSMJPGNvbnRyb2w+CisweDhECTB4MDA4RAkjCTxjb250cm9sPgorMHg4RQkweDAwOEUJIwk8Y29udHJvbD4KKzB4OEYJMHgwMDhGCSMJPGNvbnRyb2w+CisweDkwCTB4MDA5MAkjCTxjb250cm9sPgorMHg5MQkweDAwOTEJIwk8Y29udHJvbD4KKzB4OTIJMHgwMDkyCSMJPGNvbnRyb2w+CisweDkzCTB4MDA5MwkjCTxjb250cm9sPgorMHg5NAkweDAwOTQJIwk8Y29udHJvbD4KKzB4OTUJMHgwMDk1CSMJPGNvbnRyb2w+CisweDk2CTB4MDA5NgkjCTxjb250cm9sPgorMHg5NwkweDAwOTcJIwk8Y29udHJvbD4KKzB4OTgJMHgwMDk4CSMJPGNvbnRyb2w+CisweDk5CTB4MDA5OQkjCTxjb250cm9sPgorMHg5QQkweDAwOUEJIwk8Y29udHJvbD4KKzB4OUIJMHgwMDlCCSMJPGNvbnRyb2w+CisweDlDCTB4MDA5QwkjCTxjb250cm9sPgorMHg5RAkweDAwOUQJIwk8Y29udHJvbD4KKzB4OUUJMHgwMDlFCSMJPGNvbnRyb2w+CisweDlGCTB4MDA5RgkjCTxjb250cm9sPgorMHhBMAkweDAwQTAJIwlOTy1CUkVBSyBTUEFDRQorMHhBMQkweDIwMTgJIwlMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworMHhBMgkweDIwMTkJIwlSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QTMJMHgwMEEzCSMJUE9VTkQgU0lHTgorMHhBNAkweDIwQUMJIwlFVVJPIFNJR04KKzB4QTUJMHgyMEFGCSMJRFJBQ0hNQSBTSUdOCisweEE2CTB4MDBBNgkjCUJST0tFTiBCQVIKKzB4QTcJMHgwMEE3CSMJU0VDVElPTiBTSUdOCisweEE4CTB4MDBBOAkjCURJQUVSRVNJUworMHhBOQkweDAwQTkJIwlDT1BZUklHSFQgU0lHTgorMHhBQQkweDAzN0EJIwlHUkVFSyBZUE9HRUdSQU1NRU5JCisweEFCCTB4MDBBQgkjCUxFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisweEFDCTB4MDBBQwkjCU5PVCBTSUdOCisweEFECTB4MDBBRAkjCVNPRlQgSFlQSEVOCisweEFGCTB4MjAxNQkjCUhPUklaT05UQUwgQkFSCisweEIwCTB4MDBCMAkjCURFR1JFRSBTSUdOCisweEIxCTB4MDBCMQkjCVBMVVMtTUlOVVMgU0lHTgorMHhCMgkweDAwQjIJIwlTVVBFUlNDUklQVCBUV08KKzB4QjMJMHgwMEIzCSMJU1VQRVJTQ1JJUFQgVEhSRUUKKzB4QjQJMHgwMzg0CSMJR1JFRUsgVE9OT1MKKzB4QjUJMHgwMzg1CSMJR1JFRUsgRElBTFlUSUtBIFRPTk9TCisweEI2CTB4MDM4NgkjCUdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKzB4QjcJMHgwMEI3CSMJTUlERExFIERPVAorMHhCOAkweDAzODgJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKzB4QjkJMHgwMzg5CSMJR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKzB4QkEJMHgwMzhBCSMJR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisweEJCCTB4MDBCQgkjCVJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDAzOEMJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKzB4QkQJMHgwMEJECSMJVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisweEJFCTB4MDM4RQkjCUdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworMHhCRgkweDAzOEYJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisweEMwCTB4MDM5MAkjCUdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworMHhDMQkweDAzOTEJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQorMHhDMgkweDAzOTIJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCisweEMzCTB4MDM5MwkjCUdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisweEM0CTB4MDM5NAkjCUdSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBCisweEM1CTB4MDM5NQkjCUdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04KKzB4QzYJMHgwMzk2CSMJR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorMHhDNwkweDAzOTcJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEKKzB4QzgJMHgwMzk4CSMJR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKzB4QzkJMHgwMzk5CSMJR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQorMHhDQQkweDAzOUEJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQQorMHhDQgkweDAzOUIJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQQorMHhDQwkweDAzOUMJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorMHhDRAkweDAzOUQJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBOVQorMHhDRQkweDAzOUUJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBYSQorMHhDRgkweDAzOUYJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisweEQwCTB4MDNBMAkjCUdSRUVLIENBUElUQUwgTEVUVEVSIFBJCisweEQxCTB4MDNBMQkjCUdSRUVLIENBUElUQUwgTEVUVEVSIFJITworMHhEMwkweDAzQTMJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorMHhENAkweDAzQTQJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUKKzB4RDUJMHgwM0E1CSMJR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTgorMHhENgkweDAzQTYJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKzB4RDcJMHgwM0E3CSMJR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJCisweEQ4CTB4MDNBOAkjCUdSRUVLIENBUElUQUwgTEVUVEVSIFBTSQorMHhEOQkweDAzQTkJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorMHhEQQkweDAzQUEJIwlHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisweERCCTB4MDNBQgkjCUdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKzB4REMJMHgwM0FDCSMJR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKzB4REQJMHgwM0FECSMJR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworMHhERQkweDAzQUUJIwlHUkVFSyBTTUFMTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKzB4REYJMHgwM0FGCSMJR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworMHhFMAkweDAzQjAJIwlHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKzB4RTEJMHgwM0IxCSMJR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisweEUyCTB4MDNCMgkjCUdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisweEUzCTB4MDNCMwkjCUdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQorMHhFNAkweDAzQjQJIwlHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKzB4RTUJMHgwM0I1CSMJR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKzB4RTYJMHgwM0I2CSMJR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKzB4RTcJMHgwM0I3CSMJR1JFRUsgU01BTEwgTEVUVEVSIEVUQQorMHhFOAkweDAzQjgJIwlHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKzB4RTkJMHgwM0I5CSMJR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKzB4RUEJMHgwM0JBCSMJR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCisweEVCCTB4MDNCQgkjCUdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorMHhFQwkweDAzQkMJIwlHUkVFSyBTTUFMTCBMRVRURVIgTVUKKzB4RUQJMHgwM0JECSMJR1JFRUsgU01BTEwgTEVUVEVSIE5VCisweEVFCTB4MDNCRQkjCUdSRUVLIFNNQUxMIExFVFRFUiBYSQorMHhFRgkweDAzQkYJIwlHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorMHhGMAkweDAzQzAJIwlHUkVFSyBTTUFMTCBMRVRURVIgUEkKKzB4RjEJMHgwM0MxCSMJR1JFRUsgU01BTEwgTEVUVEVSIFJITworMHhGMgkweDAzQzIJIwlHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEKKzB4RjMJMHgwM0MzCSMJR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisweEY0CTB4MDNDNAkjCUdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKzB4RjUJMHgwM0M1CSMJR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKzB4RjYJMHgwM0M2CSMJR1JFRUsgU01BTEwgTEVUVEVSIFBISQorMHhGNwkweDAzQzcJIwlHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCisweEY4CTB4MDNDOAkjCUdSRUVLIFNNQUxMIExFVFRFUiBQU0kKKzB4RjkJMHgwM0M5CSMJR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBCisweEZBCTB4MDNDQQkjCUdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisweEZCCTB4MDNDQgkjCUdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisweEZDCTB4MDNDQwkjCUdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKzB4RkQJMHgwM0NECSMJR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworMHhGRQkweDAzQ0UJIwlHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUwpkaWZmIC0tZ2l0IGEvY29kZXBhZ2UvaXNvODg1OS04LnR4dCBiL2NvZGVwYWdlL2lzbzg4NTktOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM4ZGE0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVwYWdlL2lzbzg4NTktOC50eHQKQEAgLTAsMCArMSwyNzAgQEAKKyMKKyMJTmFtZTogICAgICAgICAgICAgSVNPL0lFQyA4ODU5LTg6MTk5OSB0byBVbmljb2RlCisjCVVuaWNvZGUgdmVyc2lvbjogIDMuMAorIwlUYWJsZSB2ZXJzaW9uOiAgICAxLjEKKyMJVGFibGUgZm9ybWF0OiAgICAgRm9ybWF0IEEKKyMJRGF0ZTogICAgICAgICAgICAgMjAwMC1KYW4tMDMKKyMJQXV0aG9yczogICAgICAgICAgS2VuIFdoaXN0bGVyIDxrZW53QHN5YmFzZS5jb20+CisjCisjCUNvcHlyaWdodCAoYykgMTk5MS0xOTk5IFVuaWNvZGUsIEluYy4gIEFsbCBSaWdodHMgcmVzZXJ2ZWQuCisjCisjCVRoaXMgZmlsZSBpcyBwcm92aWRlZCBhcy1pcyBieSBVbmljb2RlLCBJbmMuIChUaGUgVW5pY29kZSBDb25zb3J0aXVtKS4KKyMJTm8gY2xhaW1zIGFyZSBtYWRlIGFzIHRvIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBObworIwl3YXJyYW50aWVzIG9mIGFueSBraW5kIGFyZSBleHByZXNzZWQgb3IgaW1wbGllZC4gIFRoZSByZWNpcGllbnQKKyMJYWdyZWVzIHRvIGRldGVybWluZSBhcHBsaWNhYmlsaXR5IG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkLiAgSWYgdGhpcworIwlmaWxlIGhhcyBiZWVuIHByb3ZpZGVkIG9uIG9wdGljYWwgbWVkaWEgYnkgVW5pY29kZSwgSW5jLiwgdGhlIHNvbGUKKyMJcmVtZWR5IGZvciBhbnkgY2xhaW0gd2lsbCBiZSBleGNoYW5nZSBvZiBkZWZlY3RpdmUgbWVkaWEgd2l0aGluIDkwCisjCWRheXMgb2YgcmVjZWlwdC4KKyMKKyMJVW5pY29kZSwgSW5jLiBoZXJlYnkgZ3JhbnRzIHRoZSByaWdodCB0byBmcmVlbHkgdXNlIHRoZSBpbmZvcm1hdGlvbgorIwlzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCisjCVVuaWNvZGUgU3RhbmRhcmQsIGFuZCB0byBtYWtlIGNvcGllcyBvZiB0aGlzIGZpbGUgaW4gYW55IGZvcm0gZm9yCisjCWludGVybmFsIG9yIGV4dGVybmFsIGRpc3RyaWJ1dGlvbiBhcyBsb25nIGFzIHRoaXMgbm90aWNlIHJlbWFpbnMKKyMJYXR0YWNoZWQuCisjCisjCUdlbmVyYWwgbm90ZXM6CisjCisjCVRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRhdGEgdGhlIFVuaWNvZGUgQ29uc29ydGl1bSBoYXMgb24gaG93CisjICAgICAgIElTTy9JRUMgODg1OS04OjE5OTkgY2hhcmFjdGVycyBtYXAgaW50byBVbmljb2RlLgorIworIwlGb3JtYXQ6ICBUaHJlZSB0YWItc2VwYXJhdGVkIGNvbHVtbnMKKyMJCSBDb2x1bW4gIzEgaXMgdGhlIElTTy9JRUMgODg1OS04IGNvZGUgKGluIGhleCBhcyAweFhYKQorIwkJIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMJCSBDb2x1bW4gIzMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIwlUaGUgZW50cmllcyBhcmUgaW4gSVNPL0lFQyA4ODU5LTggb3JkZXIuCisjCisjCVZlcnNpb24gaGlzdG9yeQorIwkxLjAgdmVyc2lvbiB1cGRhdGVzIDAuMSB2ZXJzaW9uIGJ5IGFkZGluZyBtYXBwaW5ncyBmb3IgYWxsCisjCWNvbnRyb2wgY2hhcmFjdGVycy4KKyMgICAgICAgMS4xIHZlcnNpb24gdXBkYXRlcyB0byB0aGUgcHVibGlzaGVkIDg4NTktODoxOTk5LCBjb3JyZWN0aW5nCisjICAgICAgICAgIHRoZSBtYXBwaW5nIG9mIDB4QUYgYW5kIGFkZGluZyBtYXBwaW5ncyBmb3IgTFJNIGFuZCBSTE0uCisjCisjCVVwZGF0ZWQgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIG1heSBiZSBmb3VuZCBpbjoKKyMJCTxmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTLz4KKyMKKyMJQW55IGNvbW1lbnRzIG9yIHByb2JsZW1zLCBjb250YWN0IDxlcnJhdGFAdW5pY29kZS5vcmc+CisjCVBsZWFzZSBub3RlIHRoYXQgPGVycmF0YUB1bmljb2RlLm9yZz4gaXMgYW4gYXJjaGl2YWwgYWRkcmVzczsKKyMJbm90aWNlcyB3aWxsIGJlIGNoZWNrZWQsIGJ1dCBkbyBub3QgZXhwZWN0IGFuIGltbWVkaWF0ZSByZXNwb25zZS4KKyMKKzB4MDAJMHgwMDAwCSMJTlVMTAorMHgwMQkweDAwMDEJIwlTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjCVNUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSMJRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSMJRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJIwlFTlFVSVJZCisweDA2CTB4MDAwNgkjCUFDS05PV0xFREdFCisweDA3CTB4MDAwNwkjCUJFTEwKKzB4MDgJMHgwMDA4CSMJQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjCUhPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJIwlMSU5FIEZFRUQKKzB4MEIJMHgwMDBCCSMJVkVSVElDQUwgVEFCVUxBVElPTgorMHgwQwkweDAwMEMJIwlGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSMJQ0FSUklBR0UgUkVUVVJOCisweDBFCTB4MDAwRQkjCVNISUZUIE9VVAorMHgwRgkweDAwMEYJIwlTSElGVCBJTgorMHgxMAkweDAwMTAJIwlEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjCURFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJIwlERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSMJREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSMJREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJIwlORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJIwlTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjCUVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSMJQ0FOQ0VMCisweDE5CTB4MDAxOQkjCUVORCBPRiBNRURJVU0KKzB4MUEJMHgwMDFBCSMJU1VCU1RJVFVURQorMHgxQgkweDAwMUIJIwlFU0NBUEUKKzB4MUMJMHgwMDFDCSMJRklMRSBTRVBBUkFUT1IKKzB4MUQJMHgwMDFECSMJR1JPVVAgU0VQQVJBVE9SCisweDFFCTB4MDAxRQkjCVJFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSMJVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSMJU1BBQ0UKKzB4MjEJMHgwMDIxCSMJRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJIwlRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJIwlOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJIwlET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJIwlQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSMJQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjCUFQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSMJTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJIwlSSUdIVCBQQVJFTlRIRVNJUworMHgyQQkweDAwMkEJIwlBU1RFUklTSworMHgyQgkweDAwMkIJIwlQTFVTIFNJR04KKzB4MkMJMHgwMDJDCSMJQ09NTUEKKzB4MkQJMHgwMDJECSMJSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjCUZVTEwgU1RPUAorMHgyRgkweDAwMkYJIwlTT0xJRFVTCisweDMwCTB4MDAzMAkjCURJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSMJRElHSVQgT05FCisweDMyCTB4MDAzMgkjCURJR0lUIFRXTworMHgzMwkweDAwMzMJIwlESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJIwlESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjCURJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSMJRElHSVQgU0lYCisweDM3CTB4MDAzNwkjCURJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjCURJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjCURJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSMJQ09MT04KKzB4M0IJMHgwMDNCCSMJU0VNSUNPTE9OCisweDNDCTB4MDAzQwkjCUxFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjCUVRVUFMUyBTSUdOCisweDNFCTB4MDAzRQkjCUdSRUFURVItVEhBTiBTSUdOCisweDNGCTB4MDAzRgkjCVFVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSMJQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0QQkweDAwNEEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRCCTB4MDA0QgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0RAkweDAwNEQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRFCTB4MDA0RQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVBCTB4MDA1QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSMJTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1QwkweDAwNUMJIwlSRVZFUlNFIFNPTElEVVMKKzB4NUQJMHgwMDVECSMJUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSMJQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NUYJMHgwMDVGCSMJTE9XIExJTkUKKzB4NjAJMHgwMDYwCSMJR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjCUxBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjCUxBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjCUxBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjCUxBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjCUxBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjCUxBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjCUxBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjCUxBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjCUxBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjCUxBVElOIFNNQUxMIExFVFRFUiBKCisweDZCCTB4MDA2QgkjCUxBVElOIFNNQUxMIExFVFRFUiBLCisweDZDCTB4MDA2QwkjCUxBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjCUxBVElOIFNNQUxMIExFVFRFUiBNCisweDZFCTB4MDA2RQkjCUxBVElOIFNNQUxMIExFVFRFUiBOCisweDZGCTB4MDA2RgkjCUxBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjCUxBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjCUxBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjCUxBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjCUxBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjCUxBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjCUxBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjCUxBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjCUxBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjCUxBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjCUxBVElOIFNNQUxMIExFVFRFUiBZCisweDdBCTB4MDA3QQkjCUxBVElOIFNNQUxMIExFVFRFUiBaCisweDdCCTB4MDA3QgkjCUxFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJIwlWRVJUSUNBTCBMSU5FCisweDdECTB4MDA3RAkjCVJJR0hUIENVUkxZIEJSQUNLRVQKKzB4N0UJMHgwMDdFCSMJVElMREUKKzB4N0YJMHgwMDdGCSMJREVMRVRFCisweDgwCTB4MDA4MAkjCTxjb250cm9sPgorMHg4MQkweDAwODEJIwk8Y29udHJvbD4KKzB4ODIJMHgwMDgyCSMJPGNvbnRyb2w+CisweDgzCTB4MDA4MwkjCTxjb250cm9sPgorMHg4NAkweDAwODQJIwk8Y29udHJvbD4KKzB4ODUJMHgwMDg1CSMJPGNvbnRyb2w+CisweDg2CTB4MDA4NgkjCTxjb250cm9sPgorMHg4NwkweDAwODcJIwk8Y29udHJvbD4KKzB4ODgJMHgwMDg4CSMJPGNvbnRyb2w+CisweDg5CTB4MDA4OQkjCTxjb250cm9sPgorMHg4QQkweDAwOEEJIwk8Y29udHJvbD4KKzB4OEIJMHgwMDhCCSMJPGNvbnRyb2w+CisweDhDCTB4MDA4QwkjCTxjb250cm9sPgorMHg4RAkweDAwOEQJIwk8Y29udHJvbD4KKzB4OEUJMHgwMDhFCSMJPGNvbnRyb2w+CisweDhGCTB4MDA4RgkjCTxjb250cm9sPgorMHg5MAkweDAwOTAJIwk8Y29udHJvbD4KKzB4OTEJMHgwMDkxCSMJPGNvbnRyb2w+CisweDkyCTB4MDA5MgkjCTxjb250cm9sPgorMHg5MwkweDAwOTMJIwk8Y29udHJvbD4KKzB4OTQJMHgwMDk0CSMJPGNvbnRyb2w+CisweDk1CTB4MDA5NQkjCTxjb250cm9sPgorMHg5NgkweDAwOTYJIwk8Y29udHJvbD4KKzB4OTcJMHgwMDk3CSMJPGNvbnRyb2w+CisweDk4CTB4MDA5OAkjCTxjb250cm9sPgorMHg5OQkweDAwOTkJIwk8Y29udHJvbD4KKzB4OUEJMHgwMDlBCSMJPGNvbnRyb2w+CisweDlCCTB4MDA5QgkjCTxjb250cm9sPgorMHg5QwkweDAwOUMJIwk8Y29udHJvbD4KKzB4OUQJMHgwMDlECSMJPGNvbnRyb2w+CisweDlFCTB4MDA5RQkjCTxjb250cm9sPgorMHg5RgkweDAwOUYJIwk8Y29udHJvbD4KKzB4QTAJMHgwMEEwCSMJTk8tQlJFQUsgU1BBQ0UKKzB4QTIJMHgwMEEyCSMJQ0VOVCBTSUdOCisweEEzCTB4MDBBMwkjCVBPVU5EIFNJR04KKzB4QTQJMHgwMEE0CSMJQ1VSUkVOQ1kgU0lHTgorMHhBNQkweDAwQTUJIwlZRU4gU0lHTgorMHhBNgkweDAwQTYJIwlCUk9LRU4gQkFSCisweEE3CTB4MDBBNwkjCVNFQ1RJT04gU0lHTgorMHhBOAkweDAwQTgJIwlESUFFUkVTSVMKKzB4QTkJMHgwMEE5CSMJQ09QWVJJR0hUIFNJR04KKzB4QUEJMHgwMEQ3CSMJTVVMVElQTElDQVRJT04gU0lHTgorMHhBQgkweDAwQUIJIwlMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhBQwkweDAwQUMJIwlOT1QgU0lHTgorMHhBRAkweDAwQUQJIwlTT0ZUIEhZUEhFTgorMHhBRQkweDAwQUUJIwlSRUdJU1RFUkVEIFNJR04KKzB4QUYJMHgwMEFGCSMJTUFDUk9OCisweEIwCTB4MDBCMAkjCURFR1JFRSBTSUdOCisweEIxCTB4MDBCMQkjCVBMVVMtTUlOVVMgU0lHTgorMHhCMgkweDAwQjIJIwlTVVBFUlNDUklQVCBUV08KKzB4QjMJMHgwMEIzCSMJU1VQRVJTQ1JJUFQgVEhSRUUKKzB4QjQJMHgwMEI0CSMJQUNVVEUgQUNDRU5UCisweEI1CTB4MDBCNQkjCU1JQ1JPIFNJR04KKzB4QjYJMHgwMEI2CSMJUElMQ1JPVyBTSUdOCisweEI3CTB4MDBCNwkjCU1JRERMRSBET1QKKzB4QjgJMHgwMEI4CSMJQ0VESUxMQQorMHhCOQkweDAwQjkJIwlTVVBFUlNDUklQVCBPTkUKKzB4QkEJMHgwMEY3CSMJRElWSVNJT04gU0lHTgorMHhCQgkweDAwQkIJIwlSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKzB4QkMJMHgwMEJDCSMJVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisweEJECTB4MDBCRAkjCVZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorMHhCRQkweDAwQkUJIwlWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKzB4REYJMHgyMDE3CSMJRE9VQkxFIExPVyBMSU5FCisweEUwCTB4MDVEMAkjCUhFQlJFVyBMRVRURVIgQUxFRgorMHhFMQkweDA1RDEJIwlIRUJSRVcgTEVUVEVSIEJFVAorMHhFMgkweDA1RDIJIwlIRUJSRVcgTEVUVEVSIEdJTUVMCisweEUzCTB4MDVEMwkjCUhFQlJFVyBMRVRURVIgREFMRVQKKzB4RTQJMHgwNUQ0CSMJSEVCUkVXIExFVFRFUiBIRQorMHhFNQkweDA1RDUJIwlIRUJSRVcgTEVUVEVSIFZBVgorMHhFNgkweDA1RDYJIwlIRUJSRVcgTEVUVEVSIFpBWUlOCisweEU3CTB4MDVENwkjCUhFQlJFVyBMRVRURVIgSEVUCisweEU4CTB4MDVEOAkjCUhFQlJFVyBMRVRURVIgVEVUCisweEU5CTB4MDVEOQkjCUhFQlJFVyBMRVRURVIgWU9ECisweEVBCTB4MDVEQQkjCUhFQlJFVyBMRVRURVIgRklOQUwgS0FGCisweEVCCTB4MDVEQgkjCUhFQlJFVyBMRVRURVIgS0FGCisweEVDCTB4MDVEQwkjCUhFQlJFVyBMRVRURVIgTEFNRUQKKzB4RUQJMHgwNURECSMJSEVCUkVXIExFVFRFUiBGSU5BTCBNRU0KKzB4RUUJMHgwNURFCSMJSEVCUkVXIExFVFRFUiBNRU0KKzB4RUYJMHgwNURGCSMJSEVCUkVXIExFVFRFUiBGSU5BTCBOVU4KKzB4RjAJMHgwNUUwCSMJSEVCUkVXIExFVFRFUiBOVU4KKzB4RjEJMHgwNUUxCSMJSEVCUkVXIExFVFRFUiBTQU1FS0gKKzB4RjIJMHgwNUUyCSMJSEVCUkVXIExFVFRFUiBBWUlOCisweEYzCTB4MDVFMwkjCUhFQlJFVyBMRVRURVIgRklOQUwgUEUKKzB4RjQJMHgwNUU0CSMJSEVCUkVXIExFVFRFUiBQRQorMHhGNQkweDA1RTUJIwlIRUJSRVcgTEVUVEVSIEZJTkFMIFRTQURJCisweEY2CTB4MDVFNgkjCUhFQlJFVyBMRVRURVIgVFNBREkKKzB4RjcJMHgwNUU3CSMJSEVCUkVXIExFVFRFUiBRT0YKKzB4RjgJMHgwNUU4CSMJSEVCUkVXIExFVFRFUiBSRVNICisweEY5CTB4MDVFOQkjCUhFQlJFVyBMRVRURVIgU0hJTgorMHhGQQkweDA1RUEJIwlIRUJSRVcgTEVUVEVSIFRBVgorMHhGRAkweDIwMEUJIwlMRUZULVRPLVJJR0hUIE1BUksKKzB4RkUJMHgyMDBGCSMJUklHSFQtVE8tTEVGVCBNQVJLCisKZGlmZiAtLWdpdCBhL2NvZGVwYWdlL2lzbzg4NTktOS50eHQgYi9jb2RlcGFnZS9pc284ODU5LTkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTAxZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlcGFnZS9pc284ODU5LTkudHh0CkBAIC0wLDAgKzEsMzA3IEBACisjCisjCU5hbWU6ICAgICAgICAgICAgIElTTy9JRUMgODg1OS05OjE5OTkgdG8gVW5pY29kZQorIwlVbmljb2RlIHZlcnNpb246ICAzLjAKKyMJVGFibGUgdmVyc2lvbjogICAgMS4wCisjCVRhYmxlIGZvcm1hdDogICAgIEZvcm1hdCBBCisjCURhdGU6ICAgICAgICAgICAgIDE5OTkgSnVseSAyNworIwlBdXRob3JzOiAgICAgICAgICBLZW4gV2hpc3RsZXIgPGtlbndAc3liYXNlLmNvbT4KKyMKKyMJQ29weXJpZ2h0IChjKSAxOTkxLTE5OTkgVW5pY29kZSwgSW5jLiAgQWxsIFJpZ2h0cyByZXNlcnZlZC4KKyMKKyMJVGhpcyBmaWxlIGlzIHByb3ZpZGVkIGFzLWlzIGJ5IFVuaWNvZGUsIEluYy4gKFRoZSBVbmljb2RlIENvbnNvcnRpdW0pLgorIwlObyBjbGFpbXMgYXJlIG1hZGUgYXMgdG8gZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gIE5vCisjCXdhcnJhbnRpZXMgb2YgYW55IGtpbmQgYXJlIGV4cHJlc3NlZCBvciBpbXBsaWVkLiAgVGhlIHJlY2lwaWVudAorIwlhZ3JlZXMgdG8gZGV0ZXJtaW5lIGFwcGxpY2FiaWxpdHkgb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQuICBJZiB0aGlzCisjCWZpbGUgaGFzIGJlZW4gcHJvdmlkZWQgb24gbWFnbmV0aWMgbWVkaWEgYnkgVW5pY29kZSwgSW5jLiwgdGhlIHNvbGUKKyMJcmVtZWR5IGZvciBhbnkgY2xhaW0gd2lsbCBiZSBleGNoYW5nZSBvZiBkZWZlY3RpdmUgbWVkaWEgd2l0aGluIDkwCisjCWRheXMgb2YgcmVjZWlwdC4KKyMKKyMJVW5pY29kZSwgSW5jLiBoZXJlYnkgZ3JhbnRzIHRoZSByaWdodCB0byBmcmVlbHkgdXNlIHRoZSBpbmZvcm1hdGlvbgorIwlzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCisjCVVuaWNvZGUgU3RhbmRhcmQsIGFuZCB0byBtYWtlIGNvcGllcyBvZiB0aGlzIGZpbGUgaW4gYW55IGZvcm0gZm9yCisjCWludGVybmFsIG9yIGV4dGVybmFsIGRpc3RyaWJ1dGlvbiBhcyBsb25nIGFzIHRoaXMgbm90aWNlIHJlbWFpbnMKKyMJYXR0YWNoZWQuCisjCisjCUdlbmVyYWwgbm90ZXM6CisjCisjCVRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRhdGEgdGhlIFVuaWNvZGUgQ29uc29ydGl1bSBoYXMgb24gaG93CisjICAgICAgIElTTy9JRUMgODg1OS05OjE5OTkgY2hhcmFjdGVycyBtYXAgaW50byBVbmljb2RlLgorIworIwlGb3JtYXQ6ICBUaHJlZSB0YWItc2VwYXJhdGVkIGNvbHVtbnMKKyMJCSBDb2x1bW4gIzEgaXMgdGhlIElTTy9JRUMgODg1OS05IGNvZGUgKGluIGhleCBhcyAweFhYKQorIwkJIENvbHVtbiAjMiBpcyB0aGUgVW5pY29kZSAoaW4gaGV4IGFzIDB4WFhYWCkKKyMJCSBDb2x1bW4gIzMgdGhlIFVuaWNvZGUgbmFtZSAoZm9sbG93cyBhIGNvbW1lbnQgc2lnbiwgJyMnKQorIworIwlUaGUgZW50cmllcyBhcmUgaW4gSVNPL0lFQyA4ODU5LTkgb3JkZXIuCisjCisjCUlTTy9JRUMgODg1OS05IGlzIGFsc28gZXF1aXZhbGVudCB0byBJU08tSVItMTQ4LgorIworIwlWZXJzaW9uIGhpc3RvcnkKKyMJMS4wIHZlcnNpb24gdXBkYXRlcyAwLjEgdmVyc2lvbiBieSBhZGRpbmcgbWFwcGluZ3MgZm9yIGFsbAorIwljb250cm9sIGNoYXJhY3RlcnMuCisjCisjCVVwZGF0ZWQgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIG1heSBiZSBmb3VuZCBpbjoKKyMJCTxmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTLz4KKyMKKyMJQW55IGNvbW1lbnRzIG9yIHByb2JsZW1zLCBjb250YWN0IDxlcnJhdGFAdW5pY29kZS5vcmc+CisjCVBsZWFzZSBub3RlIHRoYXQgPGVycmF0YUB1bmljb2RlLm9yZz4gaXMgYW4gYXJjaGl2YWwgYWRkcmVzczsKKyMJbm90aWNlcyB3aWxsIGJlIGNoZWNrZWQsIGJ1dCBkbyBub3QgZXhwZWN0IGFuIGltbWVkaWF0ZSByZXNwb25zZS4KKyMKKzB4MDAJMHgwMDAwCSMJTlVMTAorMHgwMQkweDAwMDEJIwlTVEFSVCBPRiBIRUFESU5HCisweDAyCTB4MDAwMgkjCVNUQVJUIE9GIFRFWFQKKzB4MDMJMHgwMDAzCSMJRU5EIE9GIFRFWFQKKzB4MDQJMHgwMDA0CSMJRU5EIE9GIFRSQU5TTUlTU0lPTgorMHgwNQkweDAwMDUJIwlFTlFVSVJZCisweDA2CTB4MDAwNgkjCUFDS05PV0xFREdFCisweDA3CTB4MDAwNwkjCUJFTEwKKzB4MDgJMHgwMDA4CSMJQkFDS1NQQUNFCisweDA5CTB4MDAwOQkjCUhPUklaT05UQUwgVEFCVUxBVElPTgorMHgwQQkweDAwMEEJIwlMSU5FIEZFRUQKKzB4MEIJMHgwMDBCCSMJVkVSVElDQUwgVEFCVUxBVElPTgorMHgwQwkweDAwMEMJIwlGT1JNIEZFRUQKKzB4MEQJMHgwMDBECSMJQ0FSUklBR0UgUkVUVVJOCisweDBFCTB4MDAwRQkjCVNISUZUIE9VVAorMHgwRgkweDAwMEYJIwlTSElGVCBJTgorMHgxMAkweDAwMTAJIwlEQVRBIExJTksgRVNDQVBFCisweDExCTB4MDAxMQkjCURFVklDRSBDT05UUk9MIE9ORQorMHgxMgkweDAwMTIJIwlERVZJQ0UgQ09OVFJPTCBUV08KKzB4MTMJMHgwMDEzCSMJREVWSUNFIENPTlRST0wgVEhSRUUKKzB4MTQJMHgwMDE0CSMJREVWSUNFIENPTlRST0wgRk9VUgorMHgxNQkweDAwMTUJIwlORUdBVElWRSBBQ0tOT1dMRURHRQorMHgxNgkweDAwMTYJIwlTWU5DSFJPTk9VUyBJRExFCisweDE3CTB4MDAxNwkjCUVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKzB4MTgJMHgwMDE4CSMJQ0FOQ0VMCisweDE5CTB4MDAxOQkjCUVORCBPRiBNRURJVU0KKzB4MUEJMHgwMDFBCSMJU1VCU1RJVFVURQorMHgxQgkweDAwMUIJIwlFU0NBUEUKKzB4MUMJMHgwMDFDCSMJRklMRSBTRVBBUkFUT1IKKzB4MUQJMHgwMDFECSMJR1JPVVAgU0VQQVJBVE9SCisweDFFCTB4MDAxRQkjCVJFQ09SRCBTRVBBUkFUT1IKKzB4MUYJMHgwMDFGCSMJVU5JVCBTRVBBUkFUT1IKKzB4MjAJMHgwMDIwCSMJU1BBQ0UKKzB4MjEJMHgwMDIxCSMJRVhDTEFNQVRJT04gTUFSSworMHgyMgkweDAwMjIJIwlRVU9UQVRJT04gTUFSSworMHgyMwkweDAwMjMJIwlOVU1CRVIgU0lHTgorMHgyNAkweDAwMjQJIwlET0xMQVIgU0lHTgorMHgyNQkweDAwMjUJIwlQRVJDRU5UIFNJR04KKzB4MjYJMHgwMDI2CSMJQU1QRVJTQU5ECisweDI3CTB4MDAyNwkjCUFQT1NUUk9QSEUKKzB4MjgJMHgwMDI4CSMJTEVGVCBQQVJFTlRIRVNJUworMHgyOQkweDAwMjkJIwlSSUdIVCBQQVJFTlRIRVNJUworMHgyQQkweDAwMkEJIwlBU1RFUklTSworMHgyQgkweDAwMkIJIwlQTFVTIFNJR04KKzB4MkMJMHgwMDJDCSMJQ09NTUEKKzB4MkQJMHgwMDJECSMJSFlQSEVOLU1JTlVTCisweDJFCTB4MDAyRQkjCUZVTEwgU1RPUAorMHgyRgkweDAwMkYJIwlTT0xJRFVTCisweDMwCTB4MDAzMAkjCURJR0lUIFpFUk8KKzB4MzEJMHgwMDMxCSMJRElHSVQgT05FCisweDMyCTB4MDAzMgkjCURJR0lUIFRXTworMHgzMwkweDAwMzMJIwlESUdJVCBUSFJFRQorMHgzNAkweDAwMzQJIwlESUdJVCBGT1VSCisweDM1CTB4MDAzNQkjCURJR0lUIEZJVkUKKzB4MzYJMHgwMDM2CSMJRElHSVQgU0lYCisweDM3CTB4MDAzNwkjCURJR0lUIFNFVkVOCisweDM4CTB4MDAzOAkjCURJR0lUIEVJR0hUCisweDM5CTB4MDAzOQkjCURJR0lUIE5JTkUKKzB4M0EJMHgwMDNBCSMJQ09MT04KKzB4M0IJMHgwMDNCCSMJU0VNSUNPTE9OCisweDNDCTB4MDAzQwkjCUxFU1MtVEhBTiBTSUdOCisweDNECTB4MDAzRAkjCUVRVUFMUyBTSUdOCisweDNFCTB4MDAzRQkjCUdSRUFURVItVEhBTiBTSUdOCisweDNGCTB4MDAzRgkjCVFVRVNUSU9OIE1BUksKKzB4NDAJMHgwMDQwCSMJQ09NTUVSQ0lBTCBBVAorMHg0MQkweDAwNDEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisweDQyCTB4MDA0MgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEIKKzB4NDMJMHgwMDQzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NAkweDAwNDQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBECisweDQ1CTB4MDA0NQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUKKzB4NDYJMHgwMDQ2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NwkweDAwNDcJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisweDQ4CTB4MDA0OAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEgKKzB4NDkJMHgwMDQ5CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0QQkweDAwNEEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisweDRCCTB4MDA0QgkjCUxBVElOIENBUElUQUwgTEVUVEVSIEsKKzB4NEMJMHgwMDRDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0RAkweDAwNEQJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisweDRFCTB4MDA0RQkjCUxBVElOIENBUElUQUwgTEVUVEVSIE4KKzB4NEYJMHgwMDRGCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MAkweDAwNTAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisweDUxCTB4MDA1MQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFEKKzB4NTIJMHgwMDUyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MwkweDAwNTMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisweDU0CTB4MDA1NAkjCUxBVElOIENBUElUQUwgTEVUVEVSIFQKKzB4NTUJMHgwMDU1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NgkweDAwNTYJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisweDU3CTB4MDA1NwkjCUxBVElOIENBUElUQUwgTEVUVEVSIFcKKzB4NTgJMHgwMDU4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OQkweDAwNTkJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisweDVBCTB4MDA1QQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFoKKzB4NUIJMHgwMDVCCSMJTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1QwkweDAwNUMJIwlSRVZFUlNFIFNPTElEVVMKKzB4NUQJMHgwMDVECSMJUklHSFQgU1FVQVJFIEJSQUNLRVQKKzB4NUUJMHgwMDVFCSMJQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NUYJMHgwMDVGCSMJTE9XIExJTkUKKzB4NjAJMHgwMDYwCSMJR1JBVkUgQUNDRU5UCisweDYxCTB4MDA2MQkjCUxBVElOIFNNQUxMIExFVFRFUiBBCisweDYyCTB4MDA2MgkjCUxBVElOIFNNQUxMIExFVFRFUiBCCisweDYzCTB4MDA2MwkjCUxBVElOIFNNQUxMIExFVFRFUiBDCisweDY0CTB4MDA2NAkjCUxBVElOIFNNQUxMIExFVFRFUiBECisweDY1CTB4MDA2NQkjCUxBVElOIFNNQUxMIExFVFRFUiBFCisweDY2CTB4MDA2NgkjCUxBVElOIFNNQUxMIExFVFRFUiBGCisweDY3CTB4MDA2NwkjCUxBVElOIFNNQUxMIExFVFRFUiBHCisweDY4CTB4MDA2OAkjCUxBVElOIFNNQUxMIExFVFRFUiBICisweDY5CTB4MDA2OQkjCUxBVElOIFNNQUxMIExFVFRFUiBJCisweDZBCTB4MDA2QQkjCUxBVElOIFNNQUxMIExFVFRFUiBKCisweDZCCTB4MDA2QgkjCUxBVElOIFNNQUxMIExFVFRFUiBLCisweDZDCTB4MDA2QwkjCUxBVElOIFNNQUxMIExFVFRFUiBMCisweDZECTB4MDA2RAkjCUxBVElOIFNNQUxMIExFVFRFUiBNCisweDZFCTB4MDA2RQkjCUxBVElOIFNNQUxMIExFVFRFUiBOCisweDZGCTB4MDA2RgkjCUxBVElOIFNNQUxMIExFVFRFUiBPCisweDcwCTB4MDA3MAkjCUxBVElOIFNNQUxMIExFVFRFUiBQCisweDcxCTB4MDA3MQkjCUxBVElOIFNNQUxMIExFVFRFUiBRCisweDcyCTB4MDA3MgkjCUxBVElOIFNNQUxMIExFVFRFUiBSCisweDczCTB4MDA3MwkjCUxBVElOIFNNQUxMIExFVFRFUiBTCisweDc0CTB4MDA3NAkjCUxBVElOIFNNQUxMIExFVFRFUiBUCisweDc1CTB4MDA3NQkjCUxBVElOIFNNQUxMIExFVFRFUiBVCisweDc2CTB4MDA3NgkjCUxBVElOIFNNQUxMIExFVFRFUiBWCisweDc3CTB4MDA3NwkjCUxBVElOIFNNQUxMIExFVFRFUiBXCisweDc4CTB4MDA3OAkjCUxBVElOIFNNQUxMIExFVFRFUiBYCisweDc5CTB4MDA3OQkjCUxBVElOIFNNQUxMIExFVFRFUiBZCisweDdBCTB4MDA3QQkjCUxBVElOIFNNQUxMIExFVFRFUiBaCisweDdCCTB4MDA3QgkjCUxFRlQgQ1VSTFkgQlJBQ0tFVAorMHg3QwkweDAwN0MJIwlWRVJUSUNBTCBMSU5FCisweDdECTB4MDA3RAkjCVJJR0hUIENVUkxZIEJSQUNLRVQKKzB4N0UJMHgwMDdFCSMJVElMREUKKzB4N0YJMHgwMDdGCSMJREVMRVRFCisweDgwCTB4MDA4MAkjCTxjb250cm9sPgorMHg4MQkweDAwODEJIwk8Y29udHJvbD4KKzB4ODIJMHgwMDgyCSMJPGNvbnRyb2w+CisweDgzCTB4MDA4MwkjCTxjb250cm9sPgorMHg4NAkweDAwODQJIwk8Y29udHJvbD4KKzB4ODUJMHgwMDg1CSMJPGNvbnRyb2w+CisweDg2CTB4MDA4NgkjCTxjb250cm9sPgorMHg4NwkweDAwODcJIwk8Y29udHJvbD4KKzB4ODgJMHgwMDg4CSMJPGNvbnRyb2w+CisweDg5CTB4MDA4OQkjCTxjb250cm9sPgorMHg4QQkweDAwOEEJIwk8Y29udHJvbD4KKzB4OEIJMHgwMDhCCSMJPGNvbnRyb2w+CisweDhDCTB4MDA4QwkjCTxjb250cm9sPgorMHg4RAkweDAwOEQJIwk8Y29udHJvbD4KKzB4OEUJMHgwMDhFCSMJPGNvbnRyb2w+CisweDhGCTB4MDA4RgkjCTxjb250cm9sPgorMHg5MAkweDAwOTAJIwk8Y29udHJvbD4KKzB4OTEJMHgwMDkxCSMJPGNvbnRyb2w+CisweDkyCTB4MDA5MgkjCTxjb250cm9sPgorMHg5MwkweDAwOTMJIwk8Y29udHJvbD4KKzB4OTQJMHgwMDk0CSMJPGNvbnRyb2w+CisweDk1CTB4MDA5NQkjCTxjb250cm9sPgorMHg5NgkweDAwOTYJIwk8Y29udHJvbD4KKzB4OTcJMHgwMDk3CSMJPGNvbnRyb2w+CisweDk4CTB4MDA5OAkjCTxjb250cm9sPgorMHg5OQkweDAwOTkJIwk8Y29udHJvbD4KKzB4OUEJMHgwMDlBCSMJPGNvbnRyb2w+CisweDlCCTB4MDA5QgkjCTxjb250cm9sPgorMHg5QwkweDAwOUMJIwk8Y29udHJvbD4KKzB4OUQJMHgwMDlECSMJPGNvbnRyb2w+CisweDlFCTB4MDA5RQkjCTxjb250cm9sPgorMHg5RgkweDAwOUYJIwk8Y29udHJvbD4KKzB4QTAJMHgwMEEwCSMJTk8tQlJFQUsgU1BBQ0UKKzB4QTEJMHgwMEExCSMJSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworMHhBMgkweDAwQTIJIwlDRU5UIFNJR04KKzB4QTMJMHgwMEEzCSMJUE9VTkQgU0lHTgorMHhBNAkweDAwQTQJIwlDVVJSRU5DWSBTSUdOCisweEE1CTB4MDBBNQkjCVlFTiBTSUdOCisweEE2CTB4MDBBNgkjCUJST0tFTiBCQVIKKzB4QTcJMHgwMEE3CSMJU0VDVElPTiBTSUdOCisweEE4CTB4MDBBOAkjCURJQUVSRVNJUworMHhBOQkweDAwQTkJIwlDT1BZUklHSFQgU0lHTgorMHhBQQkweDAwQUEJIwlGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorMHhBQgkweDAwQUIJIwlMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhBQwkweDAwQUMJIwlOT1QgU0lHTgorMHhBRAkweDAwQUQJIwlTT0ZUIEhZUEhFTgorMHhBRQkweDAwQUUJIwlSRUdJU1RFUkVEIFNJR04KKzB4QUYJMHgwMEFGCSMJTUFDUk9OCisweEIwCTB4MDBCMAkjCURFR1JFRSBTSUdOCisweEIxCTB4MDBCMQkjCVBMVVMtTUlOVVMgU0lHTgorMHhCMgkweDAwQjIJIwlTVVBFUlNDUklQVCBUV08KKzB4QjMJMHgwMEIzCSMJU1VQRVJTQ1JJUFQgVEhSRUUKKzB4QjQJMHgwMEI0CSMJQUNVVEUgQUNDRU5UCisweEI1CTB4MDBCNQkjCU1JQ1JPIFNJR04KKzB4QjYJMHgwMEI2CSMJUElMQ1JPVyBTSUdOCisweEI3CTB4MDBCNwkjCU1JRERMRSBET1QKKzB4QjgJMHgwMEI4CSMJQ0VESUxMQQorMHhCOQkweDAwQjkJIwlTVVBFUlNDUklQVCBPTkUKKzB4QkEJMHgwMEJBCSMJTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisweEJCCTB4MDBCQgkjCVJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworMHhCQwkweDAwQkMJIwlWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKzB4QkQJMHgwMEJECSMJVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisweEJFCTB4MDBCRQkjCVZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworMHhCRgkweDAwQkYJIwlJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisweEMwCTB4MDBDMAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorMHhDMQkweDAwQzEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKzB4QzIJMHgwMEMyCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4QzMJMHgwMEMzCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisweEM0CTB4MDBDNAkjCUxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKzB4QzUJMHgwMEM1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4QzYJMHgwMEM2CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKzB4QzcJMHgwMEM3CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKzB4QzgJMHgwMEM4CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEM5CTB4MDBDOQkjCUxBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorMHhDQQkweDAwQ0EJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorMHhDQgkweDAwQ0IJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweENDCTB4MDBDQwkjCUxBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorMHhDRAkweDAwQ0QJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKzB4Q0UJMHgwMENFCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4Q0YJMHgwMENGCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworMHhEMAkweDAxMUUJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKzB4RDEJMHgwMEQxCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisweEQyCTB4MDBEMgkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorMHhEMwkweDAwRDMJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKzB4RDQJMHgwMEQ0CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RDUJMHgwMEQ1CSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisweEQ2CTB4MDBENgkjCUxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKzB4RDcJMHgwMEQ3CSMJTVVMVElQTElDQVRJT04gU0lHTgorMHhEOAkweDAwRDgJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisweEQ5CTB4MDBEOQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorMHhEQQkweDAwREEJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKzB4REIJMHgwMERCCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKzB4REMJMHgwMERDCSMJTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworMHhERAkweDAxMzAJIwlMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFCisweERFCTB4MDE1RQkjCUxBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisweERGCTB4MDBERgkjCUxBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisweEUwCTB4MDBFMAkjCUxBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKzB4RTEJMHgwMEUxCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorMHhFMgkweDAwRTIJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKzB4RTMJMHgwMEUzCSMJTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorMHhFNAkweDAwRTQJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworMHhFNQkweDAwRTUJIwlMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzB4RTYJMHgwMEU2CSMJTEFUSU4gU01BTEwgTEVUVEVSIEFFCisweEU3CTB4MDBFNwkjCUxBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorMHhFOAkweDAwRTgJIwlMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisweEU5CTB4MDBFOQkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKzB4RUEJMHgwMEVBCSMJTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisweEVCCTB4MDBFQgkjCUxBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisweEVDCTB4MDBFQwkjCUxBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKzB4RUQJMHgwMEVECSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorMHhFRQkweDAwRUUJIwlMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKzB4RUYJMHgwMEVGCSMJTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKzB4RjAJMHgwMTFGCSMJTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRQorMHhGMQkweDAwRjEJIwlMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisweEYyCTB4MDBGMgkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKzB4RjMJMHgwMEYzCSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorMHhGNAkweDAwRjQJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKzB4RjUJMHgwMEY1CSMJTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorMHhGNgkweDAwRjYJIwlMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworMHhGNwkweDAwRjcJIwlESVZJU0lPTiBTSUdOCisweEY4CTB4MDBGOAkjCUxBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisweEY5CTB4MDBGOQkjCUxBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKzB4RkEJMHgwMEZBCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorMHhGQgkweDAwRkIJIwlMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKzB4RkMJMHgwMEZDCSMJTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKzB4RkQJMHgwMTMxCSMJTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorMHhGRQkweDAxNUYJIwlMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKzB4RkYJMHgwMEZGCSMJTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKworCmRpZmYgLS1naXQgYS9jb20zMi9MSUNFTkNFIGIvY29tMzIvTElDRU5DRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWVjNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvTElDRU5DRQpAQCAtMCwwICsxLDMyIEBACitsaWJjb20zMiBhbmQgbGlidXRpbCBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjCisjIyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisjIyAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisjIyAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyMjICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisjIyAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorIyMgICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisjIyAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworIyMgICBjb25kaXRpb25zOgorIyMKKyMjICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyMjICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjIworIyMgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMjICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisjIyAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisjIyAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisjIyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorIyMgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyMjICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorIyMgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZpbGVzIGluIHRoZSBzYW1wbGUsIG1vZHVsZXMgYW5kIGxpYmdwbCBkaXJlY3RvcmllcyBhcmUgbW9zdGx5IHVuZGVyIHRoZQorR05VIEdQTCAoc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIGRpcmVjdG9yeSBhYm92ZS4pCmRpZmYgLS1naXQgYS9jb20zMi9NYWtlZmlsZSBiL2NvbTMyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NGM5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitTVUJESVJTID0gbGlidXBsb2FkIHRvb2xzIGxpYiBlbGZsaW5rL2xkbGludXggZ3BsbGliIGxpYnV0aWwgbW9kdWxlcyBtYm9vdCBcCisJICBtZW51IHNhbXBsZXMgZWxmbGluayByb3NoIGNtZW51IGhkdCBnZnhib290IHN5c2R1bXAgbHVhL3NyYyBjaGFpbgorCisuUEhPTlk6IHN1YmRpcnMgJChTVUJESVJTKQorc3ViZGlyczogJChTVUJESVJTKQorJChTVUJESVJTKToKKwlAbWtkaXIgLXAgJChPQkopLyRACisJJChNQUtFKSAtQyAkKE9CSikvJEAgU1JDPSIkKFNSQykiLyRAIE9CSj0iJChPQkopIi8kQC8gXAorCQktZiAkKFNSQykvJEAvTWFrZWZpbGUgJChNQUtFQ01ER09BTFMpCisKK2FsbCB0aWR5IGRpc3QgY2xlYW4gc3BvdGxlc3MgaW5zdGFsbDogc3ViZGlycworCisjIFBhcmFsbGVsIGRlcGVuZGVuY2llcworY2hhaW4gbWJvb3QgbWVudTogbGliIGxpYnV0aWwgZ3BsbGliCitjbWVudTogbGliIGxpYnV0aWwKK2VsZmxpbmsvbGRsaW51eDogbGliCitnZnhib290OiBsaWIgbGlidXRpbCBncGxsaWIKK2hkdDogbGliIGxpYnVwbG9hZCBjbWVudSBncGxsaWIgbGlidXRpbAorbW9kdWxlczogbGliIGxpYnV0aWwgZ3BsbGliCityb3NoOiBsaWIgbGlidXRpbAorc2FtcGxlczogbGlidXRpbCBlbGZsaW5rL2xkbGludXgKK3N5c2R1bXA6IGxpYiBsaWJ1dGlsIGxpYnVwbG9hZCBncGxsaWIKK2x1YS9zcmM6IGNtZW51IG1vZHVsZXMKZGlmZiAtLWdpdCBhL2NvbTMyL2NoYWluL01ha2VmaWxlIGIvY29tMzIvY2hhaW4vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1YWY5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NoYWluL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMjAwMS0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMgICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIyAgIENvcHlyaWdodCAyMDEwIFNoYW8gTWlsbGVyCisjIyAgIENvcHlyaWdodCAyMDEwLTIwMTIgTWljaGFsIFNvbHR5cworIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvZWxmLm1rCisKK09CSlMgPSBjaGFpbi5vIHBhcnRpdGVyLm8gdXRpbGl0eS5vIG9wdGlvbnMubyBtYW5nbGUubworQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisKK2FsbDogY2hhaW4uYzMyCisKK2NoYWluLmVsZjogJChPQkpTKSAkKENfTElCUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICReCisKKyUubzogJS5jCisJJChDQykgJChNQUtFREVQUykgJChDRkxBR1MpICQoQ0hBSU5FWFRPUFQpIC1jIC1vICRAICQ8CisKK3RpZHkgZGlzdDoKKwlybSAtZiAqLm8gKi5sbyAqLmEgKi5sc3QgKi5lbGYgLiouZCAqLnRtcAorCitjbGVhbjogdGlkeQorCXJtIC1mICoubG54CisKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICoubHNzICouYzMyICouY29tCisJcm0gLWYgKn4gXCMqCisKK2luc3RhbGw6CisKKworLWluY2x1ZGUgLiouZApkaWZmIC0tZ2l0IGEvY29tMzIvY2hhaW4vY2hhaW4uYyBiL2NvbTMyL2NoYWluL2NoYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2Y2Q3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NoYWluL2NoYWluLmMKQEAgLTAsMCArMSw2NDMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqICAgQ29weXJpZ2h0IDIwMTAgU2hhbyBNaWxsZXIKKyAqICAgQ29weXJpZ2h0IDIwMTAtMjAxMiBNaWNoYWwgU29sdHlzCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFBsZWFzZSBzZWUgZG9jL2NoYWluLnR4dCBmb3IgdGhlIGRldGFpbGVkIGRvY3VtZW50YXRpb24uCisgKi8KKworI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxjb25zb2xlcy5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9sb2FkZmlsZS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3RybS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Rpc2suaD4KKyNpbmNsdWRlIDxzeXNsaW51eC92aWRlby5oPgorI2luY2x1ZGUgImNoYWluLmgiCisjaW5jbHVkZSAidXRpbGl0eS5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJwYXJ0aXRlci5oIgorI2luY2x1ZGUgIm1hbmdsZS5oIgorCitzdGF0aWMgaW50IGZpeGVkX2NudCA9IDEyODsgICAvKiBzZWUgY29tbWVudHMgaW4gbWFpbigpICovCisKK3N0YXRpYyBpbnQgb3ZlcmxhcChjb25zdCBzdHJ1Y3QgZGF0YV9hcmVhICphLCBjb25zdCBzdHJ1Y3QgZGF0YV9hcmVhICpiKQoreworICAgIHJldHVybgorCWEtPmJhc2UgKyBhLT5zaXplID4gYi0+YmFzZSAmJgorCWItPmJhc2UgKyBiLT5zaXplID4gYS0+YmFzZTsKK30KKworc3RhdGljIGludCBpc19waHlzKHVpbnQ4X3Qgc2RpZnMpCit7CisgICAgcmV0dXJuCisJc2RpZnMgPT0gU1lTTElOVVhfRlNfU1lTTElOVVggfHwKKwlzZGlmcyA9PSBTWVNMSU5VWF9GU19FWFRMSU5VWCB8fAorCXNkaWZzID09IFNZU0xJTlVYX0ZTX0lTT0xJTlVYOworfQorCisvKgorICogU2VhcmNoIGZvciBhIHNwZWNpZmljIGRyaXZlLCBiYXNlZCBvbiB0aGUgTUJSIHNpZ25hdHVyZS4KKyAqIFJldHVybiBkcml2ZSBhbmQgaXRlcmF0b3IgYXQgMHRoIHBvc2l0aW9uLgorICovCitzdGF0aWMgaW50IGZpbmRfYnlfc2lnKHVpbnQzMl90IG1icl9zaWcsCisJCQlzdHJ1Y3QgcGFydF9pdGVyICoqX2Jvb3RfcGFydCkKK3sKKyAgICBzdHJ1Y3QgcGFydF9pdGVyICppdGVyID0gTlVMTDsKKyAgICBzdHJ1Y3QgZGlza19pbmZvIGRpc2tpbmZvOworICAgIGludCBkcml2ZTsKKworICAgIGZvciAoZHJpdmUgPSAweDgwOyBkcml2ZSA8IDB4ODAgKyBmaXhlZF9jbnQ7IGRyaXZlKyspIHsKKwlpZiAoZGlza19nZXRfcGFyYW1zKGRyaXZlLCAmZGlza2luZm8pKQorCSAgICBjb250aW51ZTsJCS8qIERyaXZlIGRvZXNuJ3QgZXhpc3QgKi8KKwlpZiAoIShpdGVyID0gcGlfYmVnaW4oJmRpc2tpbmZvLCBvcHQucGlmbGFncykpKQorCSAgICBjb250aW51ZTsKKwkvKiBDaGVjayBmb3IgYSBtYXRjaGluZyBNQlIgZGlzayAqLworCWlmIChpdGVyLT50eXBlID09IHR5cGVkb3MgJiYgaXRlci0+ZG9zLmRpc2tfc2lnID09IG1icl9zaWcpCisJICAgIGdvdG8gb2s7CisJcGlfZGVsKCZpdGVyKTsKKyAgICB9CisgICAgZHJpdmUgPSAtMTsKK29rOgorICAgICpfYm9vdF9wYXJ0ID0gaXRlcjsKKyAgICByZXR1cm4gZHJpdmU7Cit9CisKKy8qCisgKiBTZWFyY2ggZm9yIGEgc3BlY2lmaWMgZHJpdmUvcGFydGl0aW9uLCBiYXNlZCBvbiB0aGUgR1BUIEdVSUQuCisgKiBSZXR1cm4gZHJpdmUgYW5kIGl0ZXJhdG9yIGF0IHByb3BlciBwb3NpdGlvbi4KKyAqLworc3RhdGljIGludCBmaW5kX2J5X2d1aWQoY29uc3Qgc3RydWN0IGd1aWQgKmdwdF9ndWlkLAorCQkJc3RydWN0IHBhcnRfaXRlciAqKl9ib290X3BhcnQpCit7CisgICAgc3RydWN0IHBhcnRfaXRlciAqaXRlciA9IE5VTEw7CisgICAgc3RydWN0IGRpc2tfaW5mbyBkaXNraW5mbzsKKyAgICBpbnQgZHJpdmU7CisKKyAgICBmb3IgKGRyaXZlID0gMHg4MDsgZHJpdmUgPCAweDgwICsgZml4ZWRfY250OyBkcml2ZSsrKSB7CisJaWYgKGRpc2tfZ2V0X3BhcmFtcyhkcml2ZSwgJmRpc2tpbmZvKSkKKwkgICAgY29udGludWU7CQkvKiBEcml2ZSBkb2Vzbid0IGV4aXN0ICovCisJaWYgKCEoaXRlciA9IHBpX2JlZ2luKCZkaXNraW5mbywgb3B0LnBpZmxhZ3MpKSkKKwkgICAgY29udGludWU7CisJLyogQ2hlY2sgZm9yIGEgbWF0Y2hpbmcgR1BUIGRpc2svcGFydGl0aW9uIGd1aWQgKi8KKwlpZiAoaXRlci0+dHlwZSA9PSB0eXBlZ3B0KQorCSAgICBkbyB7CisJCWlmICghbWVtY21wKCZpdGVyLT5ncHQucGFydF9ndWlkLCBncHRfZ3VpZCwgc2l6ZW9mICpncHRfZ3VpZCkpCisJCSAgICBnb3RvIG9rOworCSAgICB9IHdoaWxlICghcGlfbmV4dChpdGVyKSk7CisJcGlfZGVsKCZpdGVyKTsKKyAgICB9CisgICAgZHJpdmUgPSAtMTsKK29rOgorICAgICpfYm9vdF9wYXJ0ID0gaXRlcjsKKyAgICByZXR1cm4gZHJpdmU7Cit9CisKKy8qCisgKiBTZWFyY2ggZm9yIGEgc3BlY2lmaWMgZHJpdmUvcGFydGl0aW9uLCBiYXNlZCBvbiB0aGUgR1BUIGxhYmVsLgorICogUmV0dXJuIGRyaXZlIGFuZCBpdGVyYXRvciBhdCBwcm9wZXIgcG9zaXRpb24uCisgKi8KK3N0YXRpYyBpbnQgZmluZF9ieV9sYWJlbChjb25zdCBjaGFyICpsYWJlbCwgc3RydWN0IHBhcnRfaXRlciAqKl9ib290X3BhcnQpCit7CisgICAgc3RydWN0IHBhcnRfaXRlciAqaXRlciA9IE5VTEw7CisgICAgc3RydWN0IGRpc2tfaW5mbyBkaXNraW5mbzsKKyAgICBpbnQgZHJpdmU7CisKKyAgICBmb3IgKGRyaXZlID0gMHg4MDsgZHJpdmUgPCAweDgwICsgZml4ZWRfY250OyBkcml2ZSsrKSB7CisJaWYgKGRpc2tfZ2V0X3BhcmFtcyhkcml2ZSwgJmRpc2tpbmZvKSkKKwkgICAgY29udGludWU7CQkvKiBEcml2ZSBkb2Vzbid0IGV4aXN0ICovCisJaWYgKCEoaXRlciA9IHBpX2JlZ2luKCZkaXNraW5mbywgb3B0LnBpZmxhZ3MpKSkKKwkgICAgY29udGludWU7CisJLyogQ2hlY2sgZm9yIGEgbWF0Y2hpbmcgR1BUIHBhcnRpdGlvbiBsYWJlbCAqLworCWlmIChpdGVyLT50eXBlID09IHR5cGVncHQpCisJICAgIHdoaWxlICghcGlfbmV4dChpdGVyKSkgeworCQlpZiAoIXN0cmNtcChsYWJlbCwgaXRlci0+Z3B0LnBhcnRfbGFiZWwpKQorCQkgICAgZ290byBvazsKKwkgICAgfQorCXBpX2RlbCgmaXRlcik7CisgICAgfQorICAgIGRyaXZlID0gLTE7CitvazoKKyAgICAqX2Jvb3RfcGFydCA9IGl0ZXI7CisgICAgcmV0dXJuIGRyaXZlOworfQorCitzdGF0aWMgdm9pZCBkb19ib290KHN0cnVjdCBkYXRhX2FyZWEgKmRhdGEsIGludCBuZGF0YSkKK3sKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptbWFwOworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqbWxpc3QgPSBOVUxMOworICAgIGFkZHJfdCBlbmRpbWFnZTsKKyAgICB1aW50OF90IGRyaXZlbm8gPSBvcHQucmVncy5lZHguYlswXTsKKyAgICB1aW50OF90IHN3YXBkcml2ZSA9IGRyaXZlbm8gJiAweDgwOworICAgIGludCBpOworCisgICAgbW1hcCA9IHN5c2xpbnV4X21lbW9yeV9tYXAoKTsKKworICAgIGlmICghbW1hcCkgeworCWVycm9yKCJDYW5ub3QgcmVhZCBzeXN0ZW0gbWVtb3J5IG1hcC4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgZW5kaW1hZ2UgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuZGF0YTsgaSsrKSB7CisJaWYgKGRhdGFbaV0uYmFzZSArIGRhdGFbaV0uc2l6ZSA+IGVuZGltYWdlKQorCSAgICBlbmRpbWFnZSA9IGRhdGFbaV0uYmFzZSArIGRhdGFbaV0uc2l6ZTsKKyAgICB9CisgICAgaWYgKGVuZGltYWdlID4gZG9zbWF4KQorCWdvdG8gdG9vX2JpZzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuZGF0YTsgaSsrKSB7CisJaWYgKHN5c2xpbnV4X2FkZF9tb3ZlbGlzdCgmbWxpc3QsIGRhdGFbaV0uYmFzZSwKKwkJCQkgIChhZGRyX3QpIGRhdGFbaV0uZGF0YSwgZGF0YVtpXS5zaXplKSkKKwkgICAgZ290byBlbm9tZW07CisgICAgfQorCisgICAgaWYgKG9wdC5zd2FwICYmIGRyaXZlbm8gIT0gc3dhcGRyaXZlKSB7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3dhcHN0dWJfbWFzdGVyW10gPSB7CisJICAgIC8qIFRoZSBhY3R1YWwgc3dhcCBjb2RlICovCisJICAgIDB4NTMsCQkvKiAwMDogcHVzaCBieCAqLworCSAgICAweDBmLCAweGI2LCAweGRhLAkvKiAwMTogbW92enggYngsZGwgKi8KKwkgICAgMHgyZSwgMHg4YSwgMHg1NywgMHg2MCwJLyogMDQ6IG1vdiBkbCxbY3M6YngrMHg2MF0gKi8KKwkgICAgMHg1YiwJCS8qIDA4OiBwb3AgYnggKi8KKwkgICAgMHhlYSwgMCwgMCwgMCwgMCwJLyogMDk6IGptcCBmYXIgMDowICovCisJICAgIDB4OTAsIDB4OTAsCQkvKiAwRTogbm9wOyBub3AgKi8KKwkgICAgLyogQ29kZSB0byBpbnN0YWxsIHRoaXMgaW4gdGhlIHJpZ2h0IGxvY2F0aW9uICovCisJICAgIC8qIEVudHJ5IHdpdGggRFMgPSBDUzsgRVMgPSBTSSA9IDA7IENYID0gMjU2ICovCisJICAgIDB4MjYsIDB4NjYsIDB4OGIsIDB4N2MsIDB4NGMsCS8qIDEwOiBtb3YgZWRpLFtlczpzaSs0KjB4MTNdICovCisJICAgIDB4NjYsIDB4ODksIDB4M2UsIDB4MGEsIDB4MDAsCS8qIDE1OiBtb3YgWzB4MEFdLGVkaSAqLworCSAgICAweDI2LCAweDhiLCAweDNlLCAweDEzLCAweDA0LAkvKiAxQTogbW92IGRpLFtlczoweDQxM10gKi8KKwkgICAgMHg0ZiwJCS8qIDFGOiBkZWMgZGkgKi8KKwkgICAgMHgyNiwgMHg4OSwgMHgzZSwgMHgxMywgMHgwNCwJLyogMjA6IG1vdiBbZXM6MHg0MTNdLGRpICovCisJICAgIDB4NjYsIDB4YzEsIDB4ZTcsIDB4MTYsCS8qIDI1OiBzaGwgZWRpLDE2KzYgKi8KKwkgICAgMHgyNiwgMHg2NiwgMHg4OSwgMHg3YywgMHg0YywJLyogMjk6IG1vdiBbZXM6c2krNCoweDEzXSxlZGkgKi8KKwkgICAgMHg2NiwgMHhjMSwgMHhlZiwgMHgxMCwJLyogMkU6IHNociBlZGksMTYgKi8KKwkgICAgMHg4ZSwgMHhjNywJCS8qIDMyOiBtb3YgZXMsZGkgKi8KKwkgICAgMHgzMSwgMHhmZiwJCS8qIDM0OiB4b3IgZGksZGkgKi8KKwkgICAgMHhmMywgMHg2NiwgMHhhNSwJLyogMzY6IHJlcCBtb3ZzZCAqLworCSAgICAweGJlLCAwLCAwLAkJLyogMzk6IG1vdiBzaSwwICovCisJICAgIDB4YmYsIDAsIDAsCQkvKiAzQzogbW92IGRpLDAgKi8KKwkgICAgMHg4ZSwgMHhkZSwJCS8qIDNGOiBtb3YgZHMsc2kgKi8KKwkgICAgMHg4ZSwgMHhjNywJCS8qIDQxOiBtb3YgZXMsZGkgKi8KKwkgICAgMHg2NiwgMHhiOSwgMCwgMCwgMCwgMCwJLyogNDM6IG1vdiBlY3gsMCAqLworCSAgICAweDY2LCAweGJlLCAwLCAwLCAwLCAwLAkvKiA0OTogbW92IGVzaSwwICovCisJICAgIDB4NjYsIDB4YmYsIDAsIDAsIDAsIDAsCS8qIDRGOiBtb3YgZWRpLDAgKi8KKwkgICAgMHhlYSwgMCwgMCwgMCwgMCwJLyogNTU6IGptcCAwOjAgKi8KKwkgICAgLyogcGFkIG91dCB0byBzZWdtZW50IGJvdW5kYXJ5ICovCisJICAgIDB4OTAsIDB4OTAsCQkvKiA1QTogLi4uICovCisJICAgIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsCS8qIDVDOiAuLi4gKi8KKwl9OworCXN0YXRpYyB1aW50OF90IHN3YXBzdHViWzEwMjRdOworCXVpbnQ4X3QgKnA7CisKKwkvKiBOb3RlOiB3ZSBjYW4ndCByZWx5IG9uIGVpdGhlciBJTlQgMTNoIG5vciB0aGUgZG9zbWF4CisJICAgdmVjdG9yIHRvIGJlIGNvcnJlY3QgYXQgdGhpcyBzdGFnZSwgc28gd2UgaGF2ZSB0byB1c2UgYW4KKwkgICBpbnN0YWxsZXIgc3R1YiB0byBwdXQgdGhpbmdzIGluIHRoZSByaWdodCBwbGFjZS4KKwkgICBSb3VuZCB0aGUgaW5zdGFsbGVyIGxvY2F0aW9uIHRvIGEgMUsgYm91bmRhcnkgc28gdGhlIG9ubHkKKwkgICBwb3NzaWJsZSBvdmVybGFwIGlzIHRoZSBpZGVudGl0eSBtYXBwaW5nLiAqLworCWVuZGltYWdlID0gKGVuZGltYWdlICsgMTAyM3UpICYgfjEwMjN1OworCisJLyogQ3JlYXRlIHN3YXAgc3R1YiAqLworCW1lbWNweShzd2Fwc3R1Yiwgc3dhcHN0dWJfbWFzdGVyLCBzaXplb2Ygc3dhcHN0dWJfbWFzdGVyKTsKKwkqKHVpbnQxNl90ICopICYgc3dhcHN0dWJbMHgzYV0gPSBvcHQucmVncy5kczsKKwkqKHVpbnQxNl90ICopICYgc3dhcHN0dWJbMHgzZF0gPSBvcHQucmVncy5lczsKKwkqKHVpbnQzMl90ICopICYgc3dhcHN0dWJbMHg0NV0gPSBvcHQucmVncy5lY3gubDsKKwkqKHVpbnQzMl90ICopICYgc3dhcHN0dWJbMHg0Yl0gPSBvcHQucmVncy5lc2kubDsKKwkqKHVpbnQzMl90ICopICYgc3dhcHN0dWJbMHg1MV0gPSBvcHQucmVncy5lZGkubDsKKwkqKHVpbnQxNl90ICopICYgc3dhcHN0dWJbMHg1Nl0gPSBvcHQucmVncy5pcDsKKwkqKHVpbnQxNl90ICopICYgc3dhcHN0dWJbMHg1OF0gPSBvcHQucmVncy5jczsKKwlwID0gJnN3YXBzdHViW3NpemVvZiBzd2Fwc3R1Yl9tYXN0ZXJdOworCisJLyogTWFwcGluZyB0YWJsZTsgc3RhcnQgb3V0IHdpdGggaWRlbnRpdHkgbWFwcGluZyBldmVyeXRoaW5nICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCSAgICBwW2ldID0gaTsKKworCS8qIEFuZCB0aGUgYWN0dWFsIHN3YXAgKi8KKwlwW2RyaXZlbm9dID0gc3dhcGRyaXZlOworCXBbc3dhcGRyaXZlXSA9IGRyaXZlbm87CisKKwkvKiBBZGp1c3QgcmVnaXN0ZXJzICovCisJb3B0LnJlZ3MuZHMgPSBvcHQucmVncy5jcyA9IGVuZGltYWdlID4+IDQ7CisJb3B0LnJlZ3MuZXNpLmwgPSBvcHQucmVncy5lcyA9IDA7CisJb3B0LnJlZ3MuZWN4LmwgPSBzaXplb2Ygc3dhcHN0dWIgPj4gMjsKKwlvcHQucmVncy5pcCA9IDB4MTA7CS8qIEluc3RhbGxlciBvZmZzZXQgKi8KKwlvcHQucmVncy5lYnguYlswXSA9IG9wdC5yZWdzLmVkeC5iWzBdID0gc3dhcGRyaXZlOworCisJaWYgKHN5c2xpbnV4X2FkZF9tb3ZlbGlzdCgmbWxpc3QsIGVuZGltYWdlLCAoYWRkcl90KSBzd2Fwc3R1YiwKKwkJCQkgIHNpemVvZiBzd2Fwc3R1YikpCisJICAgIGdvdG8gZW5vbWVtOworCisJZW5kaW1hZ2UgKz0gc2l6ZW9mIHN3YXBzdHViOworICAgIH0KKworICAgIC8qIFRlbGwgdGhlIHNodWZmbGVyIG5vdCB0byBtdWNrIHdpdGggdGhpcyBhcmVhLi4uICovCisgICAgc3lzbGludXhfYWRkX21lbW1hcCgmbW1hcCwgZW5kaW1hZ2UsIDB4YTAwMDAgLSBlbmRpbWFnZSwgU01UX1JFU0VSVkVEKTsKKworICAgIC8qIEZvcmNlIHRleHQgbW9kZSAqLworICAgIHN5c2xpbnV4X2ZvcmNlX3RleHRfbW9kZSgpOworCisgICAgcHV0cygiQm9vdGluZy4uLiIpOworICAgIHN5c2xpbnV4X3NodWZmbGVfYm9vdF9ybShtbGlzdCwgbW1hcCwgb3B0LmtlZXBweGUsICZvcHQucmVncyk7CisgICAgZXJyb3IoIkNoYWluYm9vdCBmYWlsZWQgISIpOworICAgIHJldHVybjsKKwordG9vX2JpZzoKKyAgICBlcnJvcigiTG9hZGVyIGZpbGUgdG9vIGxhcmdlLiIpOworICAgIHJldHVybjsKKworZW5vbWVtOgorICAgIGVycm9yKCJPdXQgb2YgbWVtb3J5LiIpOworICAgIHJldHVybjsKK30KKworaW50IGZpbmRfZHAoc3RydWN0IHBhcnRfaXRlciAqKl9pdGVyKQoreworICAgIHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIgPSBOVUxMOworICAgIHN0cnVjdCBkaXNrX2luZm8gZGlza2luZm87CisgICAgc3RydWN0IGd1aWQgZ3B0X2d1aWQ7CisgICAgdWludDY0X3QgZnNfbGJhOworICAgIGludCBkcml2ZSwgaGQsIHBhcnRpdGlvbjsKKyAgICBjb25zdCB1bmlvbiBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8gKnNkaTsKKworICAgIHNkaSA9IHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbygpOworCisgICAgaWYgKCFzdHJuY21wKG9wdC5kcml2ZW5hbWUsICJtYnIiLCAzKSkgeworCWlmIChmaW5kX2J5X3NpZyhzdHJ0b3VsKG9wdC5kcml2ZW5hbWUgKyA0LCBOVUxMLCAwKSwgJml0ZXIpIDwgMCkgeworCSAgICBlcnJvcigiVW5hYmxlIHRvIGZpbmQgcmVxdWVzdGVkIE1CUiBzaWduYXR1cmUuIik7CisJICAgIGdvdG8gYmFpbDsKKwl9CisgICAgfSBlbHNlIGlmICghc3RybmNtcChvcHQuZHJpdmVuYW1lLCAiZ3VpZCIsIDQpKSB7CisJaWYgKHN0cl90b19ndWlkKG9wdC5kcml2ZW5hbWUgKyA1LCAmZ3B0X2d1aWQpKQorCSAgICBnb3RvIGJhaWw7CisJaWYgKGZpbmRfYnlfZ3VpZCgmZ3B0X2d1aWQsICZpdGVyKSA8IDApIHsKKwkgICAgZXJyb3IoIlVuYWJsZSB0byBmaW5kIHJlcXVlc3RlZCBHUFQgZGlzayBvciBwYXJ0aXRpb24gYnkgZ3VpZC4iKTsKKwkgICAgZ290byBiYWlsOworCX0KKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKG9wdC5kcml2ZW5hbWUsICJsYWJlbCIsIDUpKSB7CisJaWYgKCFvcHQuZHJpdmVuYW1lWzZdKSB7CisJICAgIGVycm9yKCJObyBsYWJlbCBzcGVjaWZpZWQuIik7CisJICAgIGdvdG8gYmFpbDsKKwl9CisJaWYgKGZpbmRfYnlfbGFiZWwob3B0LmRyaXZlbmFtZSArIDYsICZpdGVyKSA8IDApIHsKKwkgICAgZXJyb3IoIlVuYWJsZSB0byBmaW5kIHJlcXVlc3RlZCBHUFQgcGFydGl0aW9uIGJ5IGxhYmVsLiIpOworCSAgICBnb3RvIGJhaWw7CisJfQorICAgIH0gZWxzZSBpZiAoKG9wdC5kcml2ZW5hbWVbMF0gPT0gJ2gnIHx8IG9wdC5kcml2ZW5hbWVbMF0gPT0gJ2YnKSAmJgorCSAgICAgICBvcHQuZHJpdmVuYW1lWzFdID09ICdkJykgeworCWhkID0gb3B0LmRyaXZlbmFtZVswXSA9PSAnaCcgPyAweDgwIDogMDsKKwlvcHQuZHJpdmVuYW1lICs9IDI7CisJZHJpdmUgPSBoZCB8IHN0cnRvbChvcHQuZHJpdmVuYW1lLCBOVUxMLCAwKTsKKworCWlmIChkaXNrX2dldF9wYXJhbXMoZHJpdmUsICZkaXNraW5mbykpCisJICAgIGdvdG8gYmFpbDsKKwkvKiB0aGlzIHdpbGwgc3RhcnQgaXRlcmF0aW9uIG92ZXIgRkRELCBwb3NzaWJseSByYXcgKi8KKwlpZiAoIShpdGVyID0gcGlfYmVnaW4oJmRpc2tpbmZvLCBvcHQucGlmbGFncykpKQorCSAgICBnb3RvIGJhaWw7CisKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3B0LmRyaXZlbmFtZSwgImJvb3QiKSB8fCAhc3RyY21wKG9wdC5kcml2ZW5hbWUsICJmcyIpKSB7CisJaWYgKCFpc19waHlzKHNkaS0+Yy5maWxlc3lzdGVtKSkgeworCSAgICBlcnJvcigiV2hlbiBzeXNsaW51eCBpcyBub3QgYm9vdGVkIGZyb20gcGh5c2ljYWwgZGlzayAob3IgaXRzIGVtdWxhdGlvbiksXG4iCisJCSAgICInYm9vdCcgYW5kICdmcycgYXJlIG1lYW5pbmdsZXNzLiIpOworCSAgICBnb3RvIGJhaWw7CisJfQorCS8qIG9mZnNldHMgbWF0Y2gsIGJ1dCBpbiBjYXNlIGl0IGNoYW5nZXMgaW4gdGhlIGZ1dHVyZSAqLworCWlmIChzZGktPmMuZmlsZXN5c3RlbSA9PSBTWVNMSU5VWF9GU19JU09MSU5VWCkgeworCSAgICBkcml2ZSA9IHNkaS0+aXNvLmRyaXZlX251bWJlcjsKKwkgICAgZnNfbGJhID0gKnNkaS0+aXNvLnBhcnRvZmZzZXQ7CisJfSBlbHNlIHsKKwkgICAgZHJpdmUgPSBzZGktPmRpc2suZHJpdmVfbnVtYmVyOworCSAgICBmc19sYmEgPSAqc2RpLT5kaXNrLnBhcnRvZmZzZXQ7CisJfQorCWlmIChkaXNrX2dldF9wYXJhbXMoZHJpdmUsICZkaXNraW5mbykpCisJICAgIGdvdG8gYmFpbDsKKwkvKiB0aGlzIHdpbGwgc3RhcnQgaXRlcmF0aW9uIG92ZXIgZGlzayBlbXVsYXRpb24sIHBvc3NpYmx5IHJhdyAqLworCWlmICghKGl0ZXIgPSBwaV9iZWdpbigmZGlza2luZm8sIG9wdC5waWZsYWdzKSkpCisJICAgIGdvdG8gYmFpbDsKKworCS8qICdmcycgPT4gd2Ugc2hvdWxkIGxvb2t1cCB0aGUgc3lzbGludXggcGFydGl0aW9uIG51bWJlciBhbmQgdXNlIGl0ICovCisJaWYgKCFzdHJjbXAob3B0LmRyaXZlbmFtZSwgImZzIikpIHsKKwkgICAgZG8geworCQlpZiAoaXRlci0+YWJzX2xiYSA9PSBmc19sYmEpCisJCSAgICBicmVhazsKKwkgICAgfSB3aGlsZSAoIXBpX25leHQoaXRlcikpOworCSAgICAvKiBicm9rZW4gcGFydCBzdHJ1Y3R1cmUgb3Igb3RoZXIgcHJvYmxlbXMgKi8KKwkgICAgaWYgKGl0ZXItPnN0YXR1cykgeworCQllcnJvcigiVW5hYmxlIHRvIGZpbmQgcGFydGl0aW9uIHdpdGggc3lzbGludXggKGZzKS4iKTsKKwkJZ290byBiYWlsOworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisJZXJyb3IoIlVucGFyc2FibGUgZHJpdmUgc3BlY2lmaWNhdGlvbi4iKTsKKwlnb3RvIGJhaWw7CisgICAgfQorICAgIC8qIG1haW4gb3B0aW9ucyBkb25lIC0gb25seSB0aGluZyBsZWZ0IGlzIGV4cGxpY2l0IHBhcnRpdGlvbiBzcGVjaWZpY2F0aW9uLAorICAgICAqIGlmIHdlJ3JlIHN0aWxsIGF0IHRoZSBkaXNrIHN0YWdlIHdpdGggdGhlIGl0ZXJhdG9yIEFORCB1c2VyIHN1cHBsaWVkCisgICAgICogcGFydGl0aW9uIG51bWJlciAoaW5jbHVkaW5nIGRpc2sgcHNldWRvLXBhcnRpdGlvbikuCisgICAgICovCisgICAgaWYgKCFpdGVyLT5pbmRleCAmJiBvcHQucGFydGl0aW9uKSB7CisJcGFydGl0aW9uID0gc3RydG9sKG9wdC5wYXJ0aXRpb24sIE5VTEwsIDApOworCS8qIHNlYXJjaCBmb3IgbWF0Y2hpbmcgcGFydCMsIGluY2x1ZGluZyBkaXNrICovCisJZG8geworCSAgICBpZiAoaXRlci0+aW5kZXggPT0gcGFydGl0aW9uKQorCQlicmVhazsKKwl9IHdoaWxlICghcGlfbmV4dChpdGVyKSk7CisJaWYgKGl0ZXItPnN0YXR1cykgeworCSAgICBlcnJvcigiVW5hYmxlIHRvIGZpbmQgcmVxdWVzdGVkIGRpc2sgLyBwYXJ0aXRpb24gY29tYmluYXRpb24uIik7CisJICAgIGdvdG8gYmFpbDsKKwl9CisgICAgfQorCisgICAgaWYgKCEoaXRlci0+ZGkuZGlzayAmIDB4ODApICYmIGl0ZXItPmluZGV4KSB7CisJd2FybigiUGFydGl0aW9ucyBvbiBmbG9wcHkgZGV2aWNlcyBtYXkgbm90IHdvcmsuIik7CisgICAgfQorCisgICAgKl9pdGVyID0gaXRlcjsKKworICAgIHJldHVybiAwOworCitiYWlsOgorICAgIHBpX2RlbCgmaXRlcik7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNldHVwX2hhbmRvdmVyKGNvbnN0IHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIsCisJCSAgIHN0cnVjdCBkYXRhX2FyZWEgKmRhdGEpCit7CisgICAgc3RydWN0IGRpc2tfZG9zX3BhcnRfZW50cnkgKmhhOworICAgIHVpbnQzMl90IHN5bnRoX3NpemUgPSBzaXplb2YgKmhhOworCisgICAgLyoKKyAgICAgKiB3ZSBoYXZlIHRvIGNvdmVyIGJvdGggbm9uLWl0ZXJhdGVkIGJ1dCBvdGhlcndpc2UgcHJvcGVybHkgZGV0ZWN0ZWQKKyAgICAgKiBncHQvZG9zIHNjaGVtZXMgYXMgd2VsbCBhcyByYXcgZGlza3M7IGNoZWNraW5nIGluZGV4IGZvciAwIGNvdmVycyBib3RoCisgICAgICovCisgICAgaWYgKGl0ZXItPmluZGV4ID09IDApIHsKKwl1aW50MzJfdCBsZW47CisJLyogUkFXIGhhbmRvdmVyIHByb3RvY29sICovCisJaGEgPSBtYWxsb2Moc3ludGhfc2l6ZSk7CisJaWYgKCFoYSkgeworCSAgICBjcml0bSgpOworCSAgICBnb3RvIGJhaWw7CisJfQorCWxlbiA9IH4wdTsKKwlpZiAoaXRlci0+bGVuZ3RoIDwgbGVuKQorCSAgICBsZW4gPSBpdGVyLT5sZW5ndGg7CisJbGJhMmNocygmaGEtPnN0YXJ0LCAmaXRlci0+ZGksIDAsIEwyQ19DQUREKTsKKwlsYmEyY2hzKCZoYS0+ZW5kLCAmaXRlci0+ZGksIGxlbiAtIDEsIEwyQ19DQUREKTsKKwloYS0+YWN0aXZlX2ZsYWcgPSAweDgwOworCWhhLT5vc3R5cGUgPSAweERBOwkvKiAiTm9uLUZTIERhdGEiLCBhbnl0aGluZyBpcyBnb29kIGhlcmUgdGhvdWdoIC4uLiAqLworCWhhLT5zdGFydF9sYmEgPSAwOworCWhhLT5sZW5ndGggPSBsZW47CisgICAgfSBlbHNlIGlmIChpdGVyLT50eXBlID09IHR5cGVncHQpIHsKKwl1aW50MzJfdCAqcGxlbjsKKwkvKiBHUFQgaGFuZG92ZXIgcHJvdG9jb2wgKi8KKwlzeW50aF9zaXplICs9IHNpemVvZiAqcGxlbiArIGl0ZXItPmdwdC5wZV9zaXplOworCWhhID0gbWFsbG9jKHN5bnRoX3NpemUpOworCWlmICghaGEpIHsKKwkgICAgY3JpdG0oKTsKKwkgICAgZ290byBiYWlsOworCX0KKwlsYmEyY2hzKCZoYS0+c3RhcnQsICZpdGVyLT5kaSwgaXRlci0+YWJzX2xiYSwgTDJDX0NBREQpOworCWxiYTJjaHMoJmhhLT5lbmQsICZpdGVyLT5kaSwgaXRlci0+YWJzX2xiYSArIGl0ZXItPmxlbmd0aCAtIDEsIEwyQ19DQUREKTsKKwloYS0+YWN0aXZlX2ZsYWcgPSAweDgwOworCWhhLT5vc3R5cGUgPSAweEVEOworCS8qIEFsbCBiaXRzIHNldCBieSBkZWZhdWx0ICovCisJaGEtPnN0YXJ0X2xiYSA9IH4wdTsKKwloYS0+bGVuZ3RoID0gfjB1OworCS8qIElmIHRoZXNlIGZpdCB0aGUgcHJlY2lzaW9uLCBwYXNzIHRoZW0gb24gKi8KKwlpZiAoaXRlci0+YWJzX2xiYSA8IGhhLT5zdGFydF9sYmEpCisJICAgIGhhLT5zdGFydF9sYmEgPSBpdGVyLT5hYnNfbGJhOworCWlmIChpdGVyLT5sZW5ndGggPCBoYS0+bGVuZ3RoKQorCSAgICBoYS0+bGVuZ3RoID0gaXRlci0+bGVuZ3RoOworCS8qIE5leHQgY29tZXMgdGhlIEdQVCBwYXJ0aXRpb24gcmVjb3JkIGxlbmd0aCAqLworCXBsZW4gPSAodWludDMyX3QgKikoaGEgKyAxKTsKKwlwbGVuWzBdID0gaXRlci0+Z3B0LnBlX3NpemU7CisJLyogTmV4dCBjb21lcyB0aGUgR1BUIHBhcnRpdGlvbiByZWNvcmQgY29weSAqLworCW1lbWNweShwbGVuICsgMSwgaXRlci0+cmVjb3JkLCBwbGVuWzBdKTsKKyNpZmRlZiBERUJVRworCWRwcmludGYoIkdQVCBoYW5kb3ZlcjpcbiIpOworCWRpc2tfZG9zX3BhcnRfZHVtcChoYSk7CisJZGlza19ncHRfcGFydF9kdW1wKChzdHJ1Y3QgZGlza19ncHRfcGFydF9lbnRyeSAqKShwbGVuICsgMSkpOworI2VuZGlmCisgICAgLyogdGhlIG9ubHkgcG9zc2libGUgY2FzZSBsZWZ0IGlzIGRvcyBzY2hlbWUgKi8KKyAgICB9IGVsc2UgaWYgKGl0ZXItPnR5cGUgPT0gdHlwZWRvcykgeworCS8qIE1CUiBoYW5kb3ZlciBwcm90b2NvbCAqLworCWhhID0gbWFsbG9jKHN5bnRoX3NpemUpOworCWlmICghaGEpIHsKKwkgICAgY3JpdG0oKTsKKwkgICAgZ290byBiYWlsOworCX0KKwltZW1jcHkoaGEsIGl0ZXItPnJlY29yZCwgc3ludGhfc2l6ZSk7CisJLyogbWFrZSBzdXJlIHRoZXNlIG1hdGNoIGJpb3MgaW1hZ2luYXRpb25zIGFuZCBhcmUgZWJyIGFnbm9zdGljICovCisJbGJhMmNocygmaGEtPnN0YXJ0LCAmaXRlci0+ZGksIGl0ZXItPmFic19sYmEsIEwyQ19DQUREKTsKKwlsYmEyY2hzKCZoYS0+ZW5kLCAmaXRlci0+ZGksIGl0ZXItPmFic19sYmEgKyBpdGVyLT5sZW5ndGggLSAxLCBMMkNfQ0FERCk7CisJaGEtPnN0YXJ0X2xiYSA9IGl0ZXItPmFic19sYmE7CisJaGEtPmxlbmd0aCA9IGl0ZXItPmxlbmd0aDsKKworI2lmZGVmIERFQlVHCisJZHByaW50ZigiTUJSIGhhbmRvdmVyOlxuIik7CisJZGlza19kb3NfcGFydF9kdW1wKGhhKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisJLyogc2hvdWxkbid0IGV2ZXIgaGFwcGVuICovCisJZ290byBiYWlsOworICAgIH0KKworICAgIGRhdGEtPmJhc2UgPSAweDdiZTsKKyAgICBkYXRhLT5zaXplID0gc3ludGhfc2l6ZTsKKyAgICBkYXRhLT5kYXRhID0gKHZvaWQgKiloYTsKKworICAgIHJldHVybiAwOworYmFpbDoKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgc3RydWN0IHBhcnRfaXRlciAqaXRlciA9IE5VTEw7CisgICAgdm9pZCAqc2JjayA9IE5VTEw7CisgICAgc3RydWN0IGRhdGFfYXJlYSBmZGF0LCBoZGF0LCBzZGF0LCBkYXRhWzNdOworICAgIGludCBuZGF0YSA9IDA7CisKKyAgICBjb25zb2xlX2Fuc2lfcmF3KCk7CisKKyAgICBtZW1zZXQoJmZkYXQsIDAsIHNpemVvZiBmZGF0KTsKKyAgICBtZW1zZXQoJmhkYXQsIDAsIHNpemVvZiBoZGF0KTsKKyAgICBtZW1zZXQoJnNkYXQsIDAsIHNpemVvZiBzZGF0KTsKKworICAgIG9wdF9zZXRfZGVmcygpOworICAgIGlmIChvcHRfcGFyc2VfYXJncyhhcmdjLCBhcmd2KSkKKwlnb3RvIGJhaWw7CisKKyNpZiAwCisgICAgLyogR2V0IG1heCBmaXhlZCBkaXNrIG51bWJlciAqLworICAgIGZpeGVkX2NudCA9ICoodWludDhfdCAqKSgweDQ3NSk7CisKKyAgICAvKgorICAgICAqIGhtbSwgbG9va3MgbGlrZSB3ZSBjYW4ndCBkbyB0aGF0IC0KKyAgICAgKiBzb21lIGJpb3Nlcy92bXMganVzdCBzZXQgaXQgdG8gMQorICAgICAqIGFuZCBnbyBvbiBsaXZpbmcgaGFwcGlseQorICAgICAqIGFueSBiZXR0ZXIgb3B0aW9ucyB0aGFuIGhhcmRjb2RlZCAweDgwIC0gMHhGRiA/CisgICAgICovCisjZW5kaWYKKworICAgIC8qIEdldCBkaXNrL3BhcnQgaXRlcmF0b3IgbWF0Y2hpbmcgdXNlciBzdXBwbGllZCBvcHRpb25zICovCisgICAgaWYgKGZpbmRfZHAoJml0ZXIpKQorCWdvdG8gYmFpbDsKKworICAgIC8qIFBlcmZvcm0gaW5pdGlhbCBwYXJ0aXRpb24gZW50cnkgbWFuZ2xpbmcgKi8KKyAgICBpZiAobWFuZ2xlcGVfZml4Y2hzKGl0ZXIpKQorCWdvdG8gYmFpbDsKKyAgICBpZiAobWFuZ2xlcGVfaGlkZShpdGVyKSkKKwlnb3RvIGJhaWw7CisKKyAgICAvKiBMb2FkIHRoZSBib290IGZpbGUgKi8KKyAgICBpZiAob3B0LmZpbGUpIHsKKwlmZGF0LmJhc2UgPSAob3B0LmZzZWcgPDwgNCkgKyBvcHQuZm9mZjsKKworCWlmIChsb2FkZmlsZShvcHQuZmlsZSwgJmZkYXQuZGF0YSwgJmZkYXQuc2l6ZSkpIHsKKwkgICAgZXJyb3IoIkNvdWxkbid0IHJlYWQgdGhlIGJvb3QgZmlsZS4iKTsKKwkgICAgZ290byBiYWlsOworCX0KKwlpZiAoZmRhdC5iYXNlICsgZmRhdC5zaXplID4gZG9zbWF4KSB7CisJICAgIGVycm9yKCJUaGUgYm9vdCBmaWxlIGlzIHRvbyBiaWcgdG8gbG9hZCBhdCB0aGlzIGFkZHJlc3MuIik7CisJICAgIGdvdG8gYmFpbDsKKwl9CisgICAgfQorCisgICAgLyogTG9hZCB0aGUgc2VjdG9yICovCisgICAgaWYgKG9wdC5zZWN0KSB7CisJc2RhdC5iYXNlID0gKG9wdC5zc2VnIDw8IDQpICsgb3B0LnNvZmY7CisJc2RhdC5zaXplID0gaXRlci0+ZGkuYnBzOworCisJaWYgKHNkYXQuYmFzZSArIHNkYXQuc2l6ZSA+IGRvc21heCkgeworCSAgICBlcnJvcigiVGhlIHNlY3RvciBjYW5ub3QgYmUgbG9hZGVkIGF0IHN1Y2ggaGlnaCBhZGRyZXNzLiIpOworCSAgICBnb3RvIGJhaWw7CisJfQorCWlmICghKHNkYXQuZGF0YSA9IGRpc2tfcmVhZF9zZWN0b3JzKCZpdGVyLT5kaSwgaXRlci0+YWJzX2xiYSwgMSkpKSB7CisJICAgIGVycm9yKCJDb3VsZG4ndCByZWFkIHRoZSBzZWN0b3IuIik7CisJICAgIGdvdG8gYmFpbDsKKwl9CisJaWYgKG9wdC5zYXZlKSB7CisJICAgIGlmICghKHNiY2sgPSBtYWxsb2Moc2RhdC5zaXplKSkpIHsKKwkJY3JpdG0oKTsKKwkJZ290byBiYWlsOworCSAgICB9CisJICAgIG1lbWNweShzYmNrLCBzZGF0LmRhdGEsIHNkYXQuc2l6ZSk7CisJfQorCWlmIChvcHQuZmlsZSAmJiBvcHQubWFwcyAmJiBvdmVybGFwKCZmZGF0LCAmc2RhdCkpIHsKKwkgICAgd2FybigiVGhlIHNlY3RvciB3b24ndCBiZSBtbWFwcGVkLCBhcyBpdCB3b3VsZCBjb25mbGljdCB3aXRoIHRoZSBib290IGZpbGUuIik7CisJICAgIG9wdC5tYXBzID0gZmFsc2U7CisJfQorICAgIH0KKworICAgIC8qIFByZXAgdGhlIGhhbmRvdmVyICovCisgICAgaWYgKG9wdC5oYW5kKSB7CisJaWYgKHNldHVwX2hhbmRvdmVyKGl0ZXIsICZoZGF0KSkKKwkgICAgZ290byBiYWlsOworCS8qIFZlcmlmeSBwb3NzaWJsZSBjb25mbGljdHMgKi8KKwlpZiAoICggb3B0LmZpbGUgJiYgb3ZlcmxhcCgmZmRhdCwgJmhkYXQpKSB8fAorCSAgICAgKCBvcHQubWFwcyAmJiBvdmVybGFwKCZzZGF0LCAmaGRhdCkpICkgeworCSAgICB3YXJuKCJIYW5kb3ZlciBhcmVhIHdvbid0IGJlIHByZXBhcmVkLFxuIgorCQkgICJhcyBpdCB3b3VsZCBjb25mbGljdCB3aXRoIHRoZSBib290IGZpbGUgYW5kL29yIHRoZSBzZWN0b3IuIik7CisJICAgIG9wdC5oYW5kID0gZmFsc2U7CisJfQorICAgIH0KKworICAgIC8qIEFkanVzdCByZWdpc3RlcnMgKi8KKworICAgIG1hbmdsZXJfaW5pdChpdGVyKTsKKyAgICBtYW5nbGVyX2hhbmRvdmVyKGl0ZXIsICZoZGF0KTsKKyAgICBtYW5nbGVyX2dybGRyKGl0ZXIpOworCisgICAgLyogUGF0Y2hpbmcgZnVuY3Rpb25zICovCisKKyAgICBpZiAobWFuZ2xlZl9pc29saW51eCgmZmRhdCkpCisJZ290byBiYWlsOworCisgICAgaWYgKG1hbmdsZWZfZ3J1YihpdGVyLCAmZmRhdCkpCisJZ290byBiYWlsOworI2lmIDAKKyAgICBpZiAobWFuZ2xlZl9kcm1rKCZmZGF0KSkKKwlnb3RvIGJhaWw7CisjZW5kaWYKKyAgICBpZiAobWFuZ2xlZl9icGIoaXRlciwgJmZkYXQpKQorCWdvdG8gYmFpbDsKKworICAgIGlmIChtYW5nbGVzX2JwYihpdGVyLCAmc2RhdCkpCisJZ290byBiYWlsOworCisgICAgaWYgKG1hbmdsZXNfc2F2ZShpdGVyLCAmc2RhdCwgc2JjaykpCisJZ290byBiYWlsOworCisgICAgaWYgKG1hbmdsZXNmX2Jzcygmc2RhdCwgJmZkYXQpKQorCWdvdG8gYmFpbDsKKworICAgIC8qIFRoaXMgKm11c3QqIGJlIGFmdGVyIEJQQiBzYXZpbmcgb3IgY29weWluZyAqLworICAgIGlmIChtYW5nbGVzX2NtbGRyKCZzZGF0KSkKKwlnb3RvIGJhaWw7CisKKyAgICAvKgorICAgICAqIFByZXBhcmUgYm9vdC10aW1lIG1tYXAgZGF0YS4gV2Ugc2hvdWxkIHRvIGl0IGhlcmUsIGFzIG1hbmdsZXJzIGNvdWxkCisgICAgICogcG90ZW50aWFsbHkgYWx0ZXIgc29tZSBvZiB0aGUgZGF0YS4KKyAgICAgKi8KKworICAgIGlmIChvcHQuZmlsZSkKKwltZW1jcHkoZGF0YSArIG5kYXRhKyssICZmZGF0LCBzaXplb2YgZmRhdCk7CisgICAgaWYgKG9wdC5tYXBzKQorCW1lbWNweShkYXRhICsgbmRhdGErKywgJnNkYXQsIHNpemVvZiBzZGF0KTsKKyAgICBpZiAob3B0LmhhbmQpCisJbWVtY3B5KGRhdGEgKyBuZGF0YSsrLCAmaGRhdCwgc2l6ZW9mIGhkYXQpOworCisjaWZkZWYgREVCVUcKKyAgICBkcHJpbnRmKCJpdGVyLT5kaSBkc2ssIGJwczogJVgsICV1XG5pdGVyLT5kaSBsYmFjbnQsIEMqSCpTOiAlIlBSSXU2NCIsICV1XG4iCisJICAgIml0ZXItPmRpIEMsIEgsIFM6ICV1LCAldSwgJXVcbiIsCisJaXRlci0+ZGkuZGlzaywgaXRlci0+ZGkuYnBzLAorCWl0ZXItPmRpLmxiYWNudCwgaXRlci0+ZGkuY3lsICogaXRlci0+ZGkuaGVhZCAqIGl0ZXItPmRpLnNwdCwKKwlpdGVyLT5kaS5jeWwsIGl0ZXItPmRpLmhlYWQsIGl0ZXItPmRpLnNwdCk7CisgICAgZHByaW50ZigiaXRlciBpZHg6ICVkXG4iLCBpdGVyLT5pbmRleCk7CisgICAgZHByaW50ZigiaXRlciBsYmE6ICUiUFJJdTY0IlxuIiwgaXRlci0+YWJzX2xiYSk7CisgICAgaWYgKG9wdC5oYW5kKQorCWRwcmludGYoImhhbmQgbGJhOiAldVxuIiwKKwkJKChzdHJ1Y3QgZGlza19kb3NfcGFydF9lbnRyeSAqKWhkYXQuZGF0YSktPnN0YXJ0X2xiYSk7CisjZW5kaWYKKworICAgIGlmIChvcHQud2FybikgeworCXB1dHMoIlByZXNzIGFueSBrZXkgdG8gY29udGludWUgYm9vdGluZy4uLiIpOworCXdhaXRfa2V5KCk7CisgICAgfQorCisgICAgaWYgKG5kYXRhICYmICFvcHQuYnJrY2hhaW4pIC8qIGJvb3Qgb25seSBpZiB3ZSBhY3R1YWxseSBjaGFpbmxvYWQgKi8KKwlkb19ib290KGRhdGEsIG5kYXRhKTsKKyAgICBlbHNlCisJcHV0cygiU2VydmljZS1vbmx5IHJ1biBjb21wbGV0ZWQsIGV4aXRpbmcuIik7CitiYWlsOgorICAgIHBpX2RlbCgmaXRlcik7CisgICAgLyogRnJlZSBhbGxvY2F0ZWQgYXJlYXMgKi8KKyAgICBmcmVlKGZkYXQuZGF0YSk7CisgICAgZnJlZShzZGF0LmRhdGEpOworICAgIGZyZWUoaGRhdC5kYXRhKTsKKyAgICBmcmVlKHNiY2spOworICAgIHJldHVybiAyNTU7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTQgc3c9NCBub2V0OiAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvY2hhaW4vY2hhaW4uaCBiL2NvbTMyL2NoYWluL2NoYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1OTE0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NoYWluL2NoYWluLmgKQEAgLTAsMCArMSwyOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICogICBDb3B5cmlnaHQgMjAxMCBTaGFvIE1pbGxlcgorICogICBDb3B5cmlnaHQgMjAxMC0yMDEyIE1pY2hhbCBTb2x0eXMKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIENPTTMyX0NIQUlOX0NIQUlOX0gKKyNkZWZpbmUgQ09NMzJfQ0hBSU5fQ0hBSU5fSAorCisjaW5jbHVkZSA8c3lzbGludXgvbW92ZWJpdHMuaD4KKworc3RydWN0IGRhdGFfYXJlYSB7CisgICAgdm9pZCAqZGF0YTsKKyAgICBhZGRyX3QgYmFzZTsKKyAgICBhZGRyX3Qgc2l6ZTsKK307CisKKyNlbmRpZgorCisvKiB2aW06IHNldCB0cz04IHN0cz00IHN3PTQgbm9ldDogKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2NoYWluL21hbmdsZS5jIGIvY29tMzIvY2hhaW4vbWFuZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzMWU1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NoYWluL21hbmdsZS5jCkBAIC0wLDAgKzEsNjgyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKiAgIENvcHlyaWdodCAyMDEwIFNoYW8gTWlsbGVyCisgKiAgIENvcHlyaWdodCAyMDEwLTIwMTIgTWljaGFsIFNvbHR5cworICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJjaGFpbi5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1dGlsaXR5LmgiCisjaW5jbHVkZSAicGFydGl0ZXIuaCIKKyNpbmNsdWRlICJtYW5nbGUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgY21sZHJfc2lnbmF0dXJlWzhdID0gImNtZGNvbnMiOworCisvKiBDcmVhdGUgYm9vdCBpbmZvIHRhYmxlOiBuZWVkZWQgd2hlbiB5b3Ugd2FudCB0byBjaGFpbmxvYWQKKyAqIGFub3RoZXIgdmVyc2lvbiBvZiBJU09MSU5VWCAob3IgYW5vdGhlciBib290bGFvZGVyIHRoYXQgbmVlZHMKKyAqIHRoZSAtYm9vdC1pbmZvLXRhYmxlIHN3aXRjaCBvZiBta2lzb2ZzKQorICogKHdpbGwgb25seSB3b3JrIHdoZW4gcnVuIGZyb20gSVNPTElOVVgpCisgKi8KK2ludCBtYW5nbGVmX2lzb2xpbnV4KHN0cnVjdCBkYXRhX2FyZWEgKmRhdGEpCit7CisgICAgY29uc3QgdW5pb24gc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvICpzZGk7CisgICAgdW5zaWduZWQgY2hhciAqaXNvbGludXhfYmluOworICAgIHVpbnQzMl90ICpjaGVja3N1bSwgKmNoa2hlYWQsICpjaGt0YWlsOworICAgIHVpbnQzMl90IGZpbGVfbGJhID0gMDsKKworICAgIGlmICghKG9wdC5maWxlICYmIG9wdC5pc29saW51eCkpCisJcmV0dXJuIDA7CisKKyAgICBzZGkgPSBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8oKTsKKworICAgIGlmIChzZGktPmMuZmlsZXN5c3RlbSAhPSBTWVNMSU5VWF9GU19JU09MSU5VWCkgeworCWVycm9yKCJUaGUgaXNvbGludXg9IG9wdGlvbiBpcyBvbmx5IHZhbGlkIHdoZW4gcnVuIGZyb20gSVNPTElOVVguIik7CisJZ290byBiYWlsOworICAgIH0KKworICAgIC8qIEJvb3QgaW5mbyB0YWJsZSBpbmZvIChpbnRlZ2VycyBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCkKKworICAgICAgIE9mZnNldCBOYW1lICAgICAgICAgU2l6ZSAgICAgIE1lYW5pbmcKKyAgICAgICA4ICAgICAgYmlfcHZkICAgICAgIDQgYnl0ZXMgICBMQkEgb2YgcHJpbWFyeSB2b2x1bWUgZGVzY3JpcHRvcgorICAgICAgIDEyICAgICBiaV9maWxlICAgICAgNCBieXRlcyAgIExCQSBvZiBib290IGZpbGUKKyAgICAgICAxNiAgICAgYmlfbGVuZ3RoICAgIDQgYnl0ZXMgICBCb290IGZpbGUgbGVuZ3RoIGluIGJ5dGVzCisgICAgICAgMjAgICAgIGJpX2NzdW0gICAgICA0IGJ5dGVzICAgMzItYml0IGNoZWNrc3VtCisgICAgICAgMjQgICAgIGJpX3Jlc2VydmVkICA0MCBieXRlcyAgUmVzZXJ2ZWQKKworICAgICAgIFRoZSAzMi1iaXQgY2hlY2tzdW0gaXMgdGhlIHN1bSBvZiBhbGwgdGhlIDMyLWJpdCB3b3JkcyBpbiB0aGUKKyAgICAgICBib290IGZpbGUgc3RhcnRpbmcgYXQgYnl0ZSBvZmZzZXQgNjQuIEFsbCBsaW5lYXIgYmxvY2sKKyAgICAgICBhZGRyZXNzZXMgKExCQXMpIGFyZSBnaXZlbiBpbiBDRCBzZWN0b3JzIChub3JtYWxseSAyMDQ4IGJ5dGVzKS4KKworICAgICAgIExCQSBvZiBwcmltYXJ5IHZvbHVtZSBkZXNjcmlwdG9yIHNob3VsZCBhbHJlYWR5IGJlIHNldCB0byAxNi4KKyAgICAgICAqLworCisgICAgaXNvbGludXhfYmluID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhLT5kYXRhOworCisgICAgLyogR2V0IExCQSBhZGRyZXNzIG9mIGJvb3RmaWxlICovCisgICAgZmlsZV9sYmEgPSBnZXRfZmlsZV9sYmEob3B0LmZpbGUpOworCisgICAgaWYgKGZpbGVfbGJhID09IDApIHsKKwllcnJvcigiRmFpbGVkIHRvIGZpbmQgTEJBIG9mZnNldCBvZiB0aGUgYm9vdCBmaWxlLiIpOworCWdvdG8gYmFpbDsKKyAgICB9CisgICAgLyogU2V0IGl0ICovCisgICAgKigodWludDMyX3QgKikgJiBpc29saW51eF9iaW5bMTJdKSA9IGZpbGVfbGJhOworCisgICAgLyogU2V0IGJvb3QgZmlsZSBsZW5ndGggKi8KKyAgICAqKCh1aW50MzJfdCAqKSAmIGlzb2xpbnV4X2JpblsxNl0pID0gZGF0YS0+c2l6ZTsKKworICAgIC8qIENhbGN1bGF0ZSBjaGVja3N1bSAqLworICAgIGNoZWNrc3VtID0gKHVpbnQzMl90ICopICYgaXNvbGludXhfYmluWzIwXTsKKyAgICBjaGtoZWFkID0gKHVpbnQzMl90ICopICYgaXNvbGludXhfYmluWzY0XTsKKyAgICBjaGt0YWlsID0gKHVpbnQzMl90ICopICYgaXNvbGludXhfYmluW2RhdGEtPnNpemUgJiB+M3VdOworICAgICpjaGVja3N1bSA9IDA7CisgICAgd2hpbGUgKGNoa2hlYWQgPCBjaGt0YWlsKQorCSpjaGVja3N1bSArPSAqY2hraGVhZCsrOworCisgICAgLyoKKyAgICAgKiBEZWFsIHdpdGggcG9zc2libGUgZnJhY3Rpb25hbCBkd29yZCBhdCB0aGUgZW5kOworICAgICAqIHRoaXMgKnNob3VsZCogbmV2ZXIgaGFwcGVuLi4uCisgICAgICovCisgICAgaWYgKGRhdGEtPnNpemUgJiAzKSB7CisJdWludDMyX3QgeHdvcmQgPSAwOworCW1lbWNweSgmeHdvcmQsIGNoa2hlYWQsIGRhdGEtPnNpemUgJiAzKTsKKwkqY2hlY2tzdW0gKz0geHdvcmQ7CisgICAgfQorICAgIHJldHVybiAwOworYmFpbDoKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBMZWdhY3kgZ3J1YidzIHN0YWdlMiBjaGFpbmxvYWRpbmcKKyAqLworaW50IG1hbmdsZWZfZ3J1Yihjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyLCBzdHJ1Y3QgZGF0YV9hcmVhICpkYXRhKQoreworICAgIC8qIExheW91dCBvZiBzdGFnZTIgZmlsZSAoZnJvbSBieXRlIDB4MCB0byAweDI3MCkgKi8KKyAgICBzdHJ1Y3QgZ3J1Yl9zdGFnZTJfcGF0Y2hfYXJlYSB7CisJLyogMHgwIHRvIDB4MjA1ICovCisJY2hhciB1bmtub3duWzB4MjA2XTsKKwkvKiAweDIwNjogY29tcGF0aWJpbGl0eSB2ZXJzaW9uIG51bWJlciBtYWpvciAqLworCXVpbnQ4X3QgY29tcGF0X3ZlcnNpb25fbWFqb3I7CisJLyogMHgyMDc6IGNvbXBhdGliaWxpdHkgdmVyc2lvbiBudW1iZXIgbWlub3IgKi8KKwl1aW50OF90IGNvbXBhdF92ZXJzaW9uX21pbm9yOworCisJLyogMHgyMDg6IGluc3RhbGxfcGFydGl0aW9uIHZhcmlhYmxlICovCisJc3RydWN0IHsKKwkgICAgLyogMHgyMDg6IHN1Yi1wYXJ0aXRpb24gaW4gc3ViLXBhcnRpdGlvbiBwYXJ0MiAqLworCSAgICB1aW50OF90IHBhcnQzOworCSAgICAvKiAweDIwOTogc3ViLXBhcnRpdGlvbiBpbiB0b3AtbGV2ZWwgcGFydGl0aW9uICovCisJICAgIHVpbnQ4X3QgcGFydDI7CisJICAgIC8qIDB4MjBhOiB0b3AtbGV2ZWwgcGFydGl0b24gbnVtYmVyICovCisJICAgIHVpbnQ4X3QgcGFydDE7CisJICAgIC8qIDB4MjBiOiBCSU9TIGRyaXZlIG51bWJlciAobXVzdCBiZSAwKSAqLworCSAgICB1aW50OF90IGRyaXZlOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGluc3RhbGxfcGFydGl0aW9uOworCisJLyogMHgyMGM6IGRlcHJlY2F0ZWQgKGhpc3RvcmljYWwgcmVhc29uIG9ubHkpICovCisJdWludDMyX3Qgc2F2ZWRfZW50cnlubzsKKwkvKiAweDIxMDogc3RhZ2UyX0lEOiB3aWxsIGFsd2F5cyBiZSBTVEFHRTJfSURfU1RBR0UyID0gMCBpbiBzdGFnZTIgKi8KKwl1aW50OF90IHN0YWdlMl9pZDsKKwkvKiAweDIxMTogZm9yY2UgTEJBICovCisJdWludDhfdCBmb3JjZV9sYmE7CisJLyogMHgyMTI6IHZlcnNpb24gc3RyaW5nICh3aWxsIHByb2JhYmx5IGJlIDAuOTcpICovCisJY2hhciB2ZXJzaW9uX3N0cmluZ1s1XTsKKwkvKiAweDIxNzogY29uZmlnIGZpbGVuYW1lICovCisJY2hhciBjb25maWdfZmlsZVs4OV07CisJLyogMHgyNzA6IHN0YXJ0IG9mIGNvZGUgKGFmdGVyIGp1bXAgZnJvbSAweDIwMCkgKi8KKwljaGFyIGNvZGVzdGFydFsxXTsKKyAgICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAqc3RhZ2UyOworCisgICAgaWYgKCEob3B0LmZpbGUgJiYgb3B0LmdydWIpKQorCXJldHVybiAwOworCisgICAgaWYgKGRhdGEtPnNpemUgPCBzaXplb2YgKnN0YWdlMikgeworCWVycm9yKCJUaGUgZmlsZSBzcGVjaWZpZWQgYnkgZ3J1Yj08bG9hZGVyPiBpcyB0b28gc21hbGwgdG8gYmUgc3RhZ2UyIG9mIEdSVUIgTGVnYWN5LiIpOworCWdvdG8gYmFpbDsKKyAgICB9CisgICAgc3RhZ2UyID0gZGF0YS0+ZGF0YTsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBudW1iZXIgdG8gc2VlIGlmIHdlIGxvYWRlZCBhIHJlYWwKKyAgICAgKiBzdGFnZTIgZmlsZSBvciBhIHN0YWdlMiBmaWxlIHRoYXQgd2Ugc3VwcG9ydC4KKyAgICAgKi8KKyAgICBpZiAoc3RhZ2UyLT5jb21wYXRfdmVyc2lvbl9tYWpvciAhPSAzCisJICAgIHx8IHN0YWdlMi0+Y29tcGF0X3ZlcnNpb25fbWlub3IgIT0gMikgeworCWVycm9yKCJUaGUgZmlsZSBzcGVjaWZpZWQgYnkgZ3J1Yj08bG9hZGVyPiBpcyBub3QgYSBzdXBwb3J0ZWQgc3RhZ2UyIEdSVUIgTGVnYWN5IGJpbmFyeS4iKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHUlVCIExlZ2FjeSB3YW50cyB0aGUgcGFydGl0aW9uIG51bWJlciBpbiB0aGUgaW5zdGFsbF9wYXJ0aXRpb24KKyAgICAgKiB2YXJpYWJsZSwgbG9jYXRlZCBhdCBvZmZzZXQgMHgyMDggb2Ygc3RhZ2UyLgorICAgICAqIFdoZW4gR1JVQiBMZWdhY3kgaXMgbG9hZGVkLCBpdCBpcyBsb2NhdGVkIGF0IG1lbW9yeSBhZGRyZXNzIDB4ODIwOC4KKyAgICAgKgorICAgICAqIEl0IGxvb2tzIHZlcnkgc2ltaWxhciB0byB0aGUgImJvb3QgaW5mb3JtYXRpb24gZm9ybWF0IiBvZiB0aGUKKyAgICAgKiBNdWx0aWJvb3Qgc3BlY2lmaWNhdGlvbjoKKyAgICAgKiAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9ncnViL21hbnVhbC9tdWx0aWJvb3QvbXVsdGlib290Lmh0bWwjQm9vdC1pbmZvcm1hdGlvbi1mb3JtYXQKKyAgICAgKgorICAgICAqICAgMHgyMDggPSBwYXJ0Mzogc3ViLXBhcnRpdGlvbiBpbiBzdWItcGFydGl0aW9uIHBhcnQyCisgICAgICogICAweDIwOSA9IHBhcnQyOiBzdWItcGFydGl0aW9uIGluIHRvcC1sZXZlbCBwYXJ0aXRpb24KKyAgICAgKiAgIDB4MjBhID0gcGFydDE6IHRvcC1sZXZlbCBwYXJ0aXRpb24gbnVtYmVyCisgICAgICogICAweDIwYiA9IGRyaXZlOiBCSU9TIGRyaXZlIG51bWJlciAobXVzdCBiZSAwKQorICAgICAqCisgICAgICogR1JVQiBMZWdhY3kgZG9lc24ndCBzdG9yZSB0aGUgQklPUyBkcml2ZSBudW1iZXIgYXQgMHgyMGIsIGJ1dCBhdAorICAgICAqIGFub3RoZXIgbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBQYXJ0aXRpb24gbnVtYmVycyBhbHdheXMgc3RhcnQgZnJvbSB6ZXJvLgorICAgICAqIFVudXNlZCBwYXJ0aXRpb24gYnl0ZXMgbXVzdCBiZSBzZXQgdG8gMHhGRi4KKyAgICAgKgorICAgICAqIFdlIG9ubHkgY2FyZSBhYm91dCB0b3AtbGV2ZWwgcGFydGl0aW9uLCBzbyB3ZSBvbmx5IG5lZWQgdG8gY2hhbmdlCisgICAgICogInBhcnQxIiB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWU6CisgICAgICogICAtMTogICB3aG9sZSBkcml2ZSAoZGVmYXVsdCkgKC0xID0gMHhGRikKKyAgICAgKiAgIDAtMzogIHByaW1hcnkgcGFydGl0aW9ucworICAgICAqICAgNC0qOiAgbG9naWNhbCBwYXJ0aXRpb25zCisgICAgICovCisgICAgc3RhZ2UyLT5pbnN0YWxsX3BhcnRpdGlvbi5wYXJ0MSA9IGl0ZXItPmluZGV4IC0gMTsKKworICAgIC8qCisgICAgICogR3J1YiBMZWdhY3kgcmVzZXJ2ZXMgODkgYnl0ZXMgKGZyb20gMHg4MjE3IHRvIDB4ODI2ZikgZm9yIHRoZQorICAgICAqIGNvbmZpZyBmaWxlbmFtZS4gVGhlIGZpbGVuYW1lIHBhc3NlZCB2aWEgZ3J1YmNmZz0gd2lsbCBvdmVyd3JpdGUKKyAgICAgKiB0aGUgZGVmYXVsdCBjb25maWcgZmlsZW5hbWUgIi9ib290L2dydWIvbWVudS5sc3QiLgorICAgICAqLworICAgIGlmIChvcHQuZ3J1YmNmZykgeworCWlmIChzdHJsZW4ob3B0LmdydWJjZmcpID49IHNpemVvZiBzdGFnZTItPmNvbmZpZ19maWxlKSB7CisJICAgIGVycm9yKCJUaGUgY29uZmlnIGZpbGVuYW1lIGxlbmd0aCBjYW4ndCBleGNlZWQgODggY2hhcmFjdGVycy4iKTsKKwkgICAgZ290byBiYWlsOworCX0KKworCXN0cmNweSgoY2hhciAqKXN0YWdlMi0+Y29uZmlnX2ZpbGUsIG9wdC5ncnViY2ZnKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2JhaWw6CisgICAgcmV0dXJuIC0xOworfQorI2lmIDAKKy8qCisgKiBEZWxsJ3MgRFJNSyBjaGFpbmxvYWRpbmcuCisgKi8KK2ludCBtYW5nbGVmX2RybWsoc3RydWN0IGRhdGFfYXJlYSAqZGF0YSkKK3sKKyAgICAvKgorICAgICAqIERSTUsgZW50cnkgaXMgZGlmZmVyZW50IHRoYW4gTVMtRE9TL1BDLURPUworICAgICAqIEEgbmV3IHNpemUsIGFsaWduZWQgdG8gMTYgYnl0ZXMgdG8gZWFzZSB1c2Ugb2YgZHM6W2JwKzI4XS4KKyAgICAgKiBXZSBvbmx5IHJlYWxseSBuZWVkIDQgbmV3LCB1c2FibGUgYnl0ZXMgYXQgdGhlIGVuZC4KKyAgICAgKi8KKworICAgIGlmICghKG9wdC5maWxlICYmIG9wdC5kcm1rKSkKKwlyZXR1cm4gMDsKKworICAgIHVpbnQzMl90IHRzaXplID0gKGRhdGEtPnNpemUgKyAxOSkgJiAweGZmZmZmZmYwOworICAgIGNvbnN0IHVuaW9uIHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbyAqc2RpOworICAgIHVpbnQ2NF90IGZzX2xiYTsKKworICAgIHNkaSA9IHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbygpOworICAgIC8qIFdlIHNob3VsZCBsb29rdXAgdGhlIFN5c2xpbnV4IHBhcnRpdGlvbiBvZmZzZXQgYW5kIHVzZSBpdCAqLworICAgIGZzX2xiYSA9ICpzZGktPmRpc2sucGFydG9mZnNldDsKKworICAgIC8qCisgICAgICogZnNfbGJhIHNob3VsZCBiZSB2ZXJpZmllZCBhZ2FpbnN0IHRoZSBkaXNrIGFzIHNvbWUgRFJNSworICAgICAqIHZhcmlhbnRzIHdpbGwgY2hlY2sgYW5kIGZhaWwgaWYgaXQgZG9lcyBub3QgbWF0Y2gKKyAgICAgKi8KKyAgICBkcHJpbnRmKCIgIGZzX2xiYSBvZmZzZXQgaXMgJWRcbiIsIGZzX2xiYSk7CisgICAgLyogRFJNSyBvbmx5IHVzZXMgYSBEV09SRCAqLworICAgIGlmIChmc19sYmEgPiAweGZmZmZmZmZmKSB7CisJZXJyb3IoIkxCQSB2ZXJ5IGxhcmdlOyBPbmx5IHVzaW5nIGxvd2VyIDMyIGJpdHM7IERSTUsgd2lsbCBwcm9iYWJseSBmYWlsLiIpOworICAgIH0KKyAgICBvcHQucmVncy5zcyA9IG9wdC5yZWdzLmZzID0gb3B0LnJlZ3MuZ3MgPSAwOwkvKiBVc2VkIGJlZm9yZSBpbml0aWFsaXplZCAqLworICAgIGlmICghcmVhbGxvYyhkYXRhLT5kYXRhLCB0c2l6ZSkpIHsKKwllcnJvcigiRmFpbGVkIHRvIHJlYWxsb2MgZm9yIERSTUsuIik7CisJZ290byBiYWlsOworICAgIH0KKyAgICBkYXRhLT5zaXplID0gdHNpemU7CisgICAgLyogZHM6YnAgaXMgYXNzdW1lZCBieSBEUk1LIHRvIGJlIHRoZSBib290IHNlY3RvciAqLworICAgIC8qIG9mZnNldCAyOCBpcyB0aGUgRkFUIEhpZGRlblNlY3RvcnMgdmFsdWUgKi8KKyAgICBvcHQucmVncy5kcyA9ICh0c2l6ZSA+PiA0KSArIChvcHQuZnNlZyAtIDIpOworICAgIC8qICJQYXRjaCIgaW50byB0YWlsIG9mIHRoZSBuZXcgc3BhY2UgKi8KKyAgICAqKHVpbnQzMl90ICopKChjaGFyKilkYXRhLT5kYXRhICsgdHNpemUgLSA0KSA9IGZzX2xiYTsKKworICAgIHJldHVybiAwOworYmFpbDoKKyAgICByZXR1cm4gLTE7Cit9CisjZW5kaWYKKy8qIEFkanVzdCBCUEIgY29tbW9uIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IG1hbmdsZV9icGIoY29uc3Qgc3RydWN0IHBhcnRfaXRlciAqaXRlciwgc3RydWN0IGRhdGFfYXJlYSAqZGF0YSwgY29uc3QgY2hhciAqdGFnKQoreworICAgIGludCB0eXBlID0gYnBiX2RldGVjdChkYXRhLT5kYXRhLCB0YWcpOworICAgIGludCBvZmYgPSBkcnZvZmZfZGV0ZWN0KHR5cGUpOworCisgICAgLyogQlBCOiBoaWRkZW4gc2VjdG9ycyA2NGJpdCAtIGV4RkFUIG9ubHkgZm9yIG5vdyAqLworICAgIGlmICh0eXBlID09IGJwYkVYRikKKwkgICAgKih1aW50NjRfdCAqKSAoKGNoYXIgKilkYXRhLT5kYXRhICsgMHg0MCkgPSBpdGVyLT5hYnNfbGJhOworICAgIC8qIEJQQjogaGlkZGVuIHNlY3RvcnMgMzJiaXQqLworICAgIGVsc2UgaWYgKGJwYlYzNCA8PSB0eXBlICYmIHR5cGUgPD0gYnBiVjcwKSB7CisJaWYgKGl0ZXItPmFic19sYmEgPCB+MHUpCisJICAgICoodWludDMyX3QgKikgKChjaGFyICopZGF0YS0+ZGF0YSArIDB4MWMpID0gaXRlci0+YWJzX2xiYTsKKwllbHNlCisJICAgIC8qIHdvbid0IHJlYWxseSBoZWxwIG11Y2gsIGJ1dCAuLi4gKi8KKwkgICAgKih1aW50MzJfdCAqKSAoKGNoYXIgKilkYXRhLT5kYXRhICsgMHgxYykgPSB+MHU7CisgICAgLyogQlBCOiBoaWRkZW4gc2VjdG9ycyAxNmJpdCovCisgICAgfSBlbHNlIGlmIChicGJWMzAgPD0gdHlwZSAmJiB0eXBlIDw9IGJwYlYzMikgeworCWlmIChpdGVyLT5hYnNfbGJhIDwgMHhGRkZGKQorCSAgICAqKHVpbnQxNl90ICopICgoY2hhciAqKWRhdGEtPmRhdGEgKyAweDFjKSA9IGl0ZXItPmFic19sYmE7CisJZWxzZQorCSAgICAvKiB3b24ndCByZWFsbHkgaGVscCBtdWNoLCBidXQgLi4uICovCisJICAgICoodWludDE2X3QgKikgKChjaGFyICopZGF0YS0+ZGF0YSArIDB4MWMpID0gKHVpbnQxNl90KX4wdTsKKyAgICB9CisKKyAgICAvKiBCUEI6IGxlZ2FjeSBnZW9tZXRyeSAqLworICAgIGlmIChicGJWMzAgPD0gdHlwZSAmJiB0eXBlIDw9IGJwYlY3MCkgeworCWlmIChpdGVyLT5kaS5jYmlvcykKKwkgICAgKih1aW50MzJfdCAqKSgoY2hhciAqKWRhdGEtPmRhdGEgKyAweDE4KSA9IChpdGVyLT5kaS5oZWFkIDw8IDE2KSB8IGl0ZXItPmRpLnNwdDsKKwllbHNlIHsKKwkgICAgaWYgKGl0ZXItPmRpLmRpc2sgJiAweDgwKQorCQkqKHVpbnQzMl90ICopKChjaGFyICopZGF0YS0+ZGF0YSArIDB4MTgpID0gMHgwMEZGMDAzRjsKKwkgICAgZWxzZQorCQkqKHVpbnQzMl90ICopKChjaGFyICopZGF0YS0+ZGF0YSArIDB4MTgpID0gMHgwMDAyMDAxMjsKKwl9CisgICAgfQorICAgIC8qIEJQQjogZHJpdmUgKi8KKyAgICBpZiAob2ZmID49IDApIHsKKwkqKHVpbnQ4X3QgKikoKGNoYXIgKilkYXRhLT5kYXRhICsgb2ZmKSA9IChvcHQuc3dhcCA/IGl0ZXItPmRpLmRpc2sgJiAweDgwIDogaXRlci0+ZGkuZGlzayk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGp1c3QgQlBCIG9mIGEgQlBCLWNvbXBhdGlibGUgZmlsZQorICovCitpbnQgbWFuZ2xlZl9icGIoY29uc3Qgc3RydWN0IHBhcnRfaXRlciAqaXRlciwgc3RydWN0IGRhdGFfYXJlYSAqZGF0YSkKK3sKKyAgICBpZiAoIShvcHQuZmlsZSAmJiBvcHQuZmlsZWJwYikpCisJcmV0dXJuIDA7CisKKyAgICByZXR1cm4gbWFuZ2xlX2JwYihpdGVyLCBkYXRhLCAiZmlsZSIpOworfQorCisvKgorICogQWRqdXN0IEJQQiBvZiBhIHNlY3RvcgorICovCitpbnQgbWFuZ2xlc19icGIoY29uc3Qgc3RydWN0IHBhcnRfaXRlciAqaXRlciwgc3RydWN0IGRhdGFfYXJlYSAqZGF0YSkKK3sKKyAgICBpZiAoIShvcHQuc2VjdCAmJiBvcHQuc2V0YnBiKSkKKwlyZXR1cm4gMDsKKworICAgIHJldHVybiBtYW5nbGVfYnBiKGl0ZXIsIGRhdGEsICJzZWN0Iik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGZ1bGwgQlBCIHBhdGNoaW5nLCBhbmFsb2dvdXNseSB0byBzeXNsaW51eCdzCisgKiBuYXRpdmUgQlNTLgorICovCitpbnQgbWFuZ2xlc2ZfYnNzKHN0cnVjdCBkYXRhX2FyZWEgKnNlYywgc3RydWN0IGRhdGFfYXJlYSAqZmlsKQoreworICAgIGludCB0eXBlMSwgdHlwZTI7CisgICAgc2l6ZV90IGNudCA9IDA7CisKKyAgICBpZiAoIShvcHQuc2VjdCAmJiBvcHQuZmlsZSAmJiBvcHQuYnNzKSkKKwlyZXR1cm4gMDsKKworICAgIHR5cGUxID0gYnBiX2RldGVjdChmaWwtPmRhdGEsICJic3MvZmlsZSIpOworICAgIHR5cGUyID0gYnBiX2RldGVjdChzZWMtPmRhdGEsICJic3Mvc2VjdCIpOworCisgICAgaWYgKCF0eXBlMSB8fCAhdHlwZTIpIHsKKwllcnJvcigiQ291bGRuJ3QgZGV0ZXJtaW5lIHRoZSBCUEIgdHlwZSBmb3Igb3B0aW9uICdic3MnLiIpOworCWdvdG8gYmFpbDsKKyAgICB9CisgICAgaWYgKHR5cGUxICE9IHR5cGUyKSB7CisJZXJyb3IoIk9wdGlvbiAnYnNzJyBjYW4ndCBiZSB1c2VkLFxuIgorCQkid2hlbiBhIHNlY3RvciBhbmQgYSBmaWxlIGhhdmUgaW5jb21wYXRpYmxlIEJQQnMuIik7CisJZ290byBiYWlsOworICAgIH0KKworICAgIC8qIENvcHkgY29tbW9uIDIuMCBkYXRhICovCisgICAgbWVtY3B5KChjaGFyICopZmlsLT5kYXRhICsgMHgwQiwgKGNoYXIgKilzZWMtPmRhdGEgKyAweDBCLCAweDBEKTsKKworICAgIC8qIENvcHkgMy4wKyBkYXRhICovCisgICAgaWYgKHR5cGUxIDw9IGJwYlYzMCkgeworCWNudCA9IDB4MDY7CisgICAgfSBlbHNlIGlmICh0eXBlMSA8PSBicGJWMzIpIHsKKwljbnQgPSAweDA4OworICAgIH0gZWxzZSBpZiAodHlwZTEgPD0gYnBiVjM0KSB7CisJY250ID0gMHgwQzsKKyAgICB9IGVsc2UgaWYgKHR5cGUxIDw9IGJwYlY0MCkgeworCWNudCA9IDB4MkU7CisgICAgfSBlbHNlIGlmICh0eXBlMSA8PSBicGJWTlQpIHsKKwljbnQgPSAweDNDOworICAgIH0gZWxzZSBpZiAodHlwZTEgPD0gYnBiVjcwKSB7CisJY250ID0gMHg0MjsKKyAgICB9IGVsc2UgaWYgKHR5cGUxIDw9IGJwYkVYRikgeworCWNudCA9IDB4NjA7CisgICAgfQorICAgIG1lbWNweSgoY2hhciAqKWZpbC0+ZGF0YSArIDB4MTgsIChjaGFyICopc2VjLT5kYXRhICsgMHgxOCwgY250KTsKKworICAgIHJldHVybiAwOworYmFpbDoKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBTYXZlIHNlY3Rvci4KKyAqLworaW50IG1hbmdsZXNfc2F2ZShjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyLCBjb25zdCBzdHJ1Y3QgZGF0YV9hcmVhICpkYXRhLCB2b2lkICpvcmcpCit7CisgICAgaWYgKCEob3B0LnNlY3QgJiYgb3B0LnNhdmUpKQorCXJldHVybiAwOworCisgICAgaWYgKG1lbWNtcChvcmcsIGRhdGEtPmRhdGEsIGRhdGEtPnNpemUpKSB7CisJaWYgKGRpc2tfd3JpdGVfc2VjdG9ycygmaXRlci0+ZGksIGl0ZXItPmFic19sYmEsIGRhdGEtPmRhdGEsIDEpKSB7CisJICAgIGVycm9yKCJDYW5ub3Qgd3JpdGUgdGhlIHVwZGF0ZWQgc2VjdG9yLiIpOworCSAgICBnb3RvIGJhaWw7CisJfQorCS8qIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYWdhaW4gKi8KKwltZW1jcHkob3JnLCBkYXRhLT5kYXRhLCBkYXRhLT5zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2JhaWw6CisgICAgcmV0dXJuIC0xOworfQorCisvKgorICogVG8gYm9vdCB0aGUgUmVjb3ZlcnkgQ29uc29sZSBvZiBXaW5kb3dzIE5ULzJLL1hQIHdlIG5lZWQgdG8gd3JpdGUKKyAqIHRoZSBzdHJpbmcgImNtZGNvbnNcMCIgdG8gbWVtb3J5IGxvY2F0aW9uIDAwMDA6N0MwMy4KKyAqIE1lbW9yeSBsb2NhdGlvbiAwMDAwOjdDMDAgY29udGFpbnMgdGhlIGJvb3RzZWN0b3Igb2YgdGhlIHBhcnRpdGlvbi4KKyAqLworaW50IG1hbmdsZXNfY21sZHIoc3RydWN0IGRhdGFfYXJlYSAqZGF0YSkKK3sKKyAgICBpZiAoIShvcHQuc2VjdCAmJiBvcHQuY21sZHIpKQorCXJldHVybiAwOworCisgICAgbWVtY3B5KChjaGFyICopZGF0YS0+ZGF0YSArIDMsIGNtbGRyX3NpZ25hdHVyZSwgc2l6ZW9mIGNtbGRyX3NpZ25hdHVyZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFNldCBjb21tb24gcmVnaXN0ZXJzICovCitpbnQgbWFuZ2xlcl9pbml0KGNvbnN0IHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIpCit7CisgICAgLyogU2V0IGluaXRpYWwgcmVnaXN0cnkgdmFsdWVzICovCisgICAgaWYgKG9wdC5maWxlKSB7CisJb3B0LnJlZ3MuY3MgPSBvcHQucmVncy5kcyA9IG9wdC5yZWdzLnNzID0gb3B0LmZzZWc7CisJb3B0LnJlZ3MuaXAgPSBvcHQuZmlwOworICAgIH0gZWxzZSB7CisJb3B0LnJlZ3MuY3MgPSBvcHQucmVncy5kcyA9IG9wdC5yZWdzLnNzID0gb3B0LnNzZWc7CisJb3B0LnJlZ3MuaXAgPSBvcHQuc2lwOworICAgIH0KKworICAgIGlmIChvcHQucmVncy5pcCA9PSAweDdDMDAgJiYgIW9wdC5yZWdzLmNzKQorCW9wdC5yZWdzLmVzcC5sID0gMHg3QzAwOworCisgICAgLyogRE9TIGtlcm5lbHMgd2FudCB0aGUgZHJpdmUgbnVtYmVyIGluIEJMIGluc3RlYWQgb2YgREwuIEluZHVsZ2UgdGhlbS4gKi8KKyAgICBvcHQucmVncy5lYnguYlswXSA9IG9wdC5yZWdzLmVkeC5iWzBdID0gaXRlci0+ZGkuZGlzazsKKworICAgIHJldHVybiAwOworfQorCisvKiBkczpzaSAmIGRzOmJwICovCitpbnQgbWFuZ2xlcl9oYW5kb3Zlcihjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyLCBjb25zdCBzdHJ1Y3QgZGF0YV9hcmVhICpkYXRhKQoreworICAgIGlmIChvcHQuZmlsZSAmJiBvcHQubWFwcyAmJiAhb3B0LmhwdHIpIHsKKwlvcHQucmVncy5lc2kubCA9IG9wdC5yZWdzLmVicC5sID0gb3B0LnNvZmY7CisJb3B0LnJlZ3MuZHMgPSBvcHQuc3NlZzsKKwlvcHQucmVncy5lYXgubCA9IDA7CisgICAgfSBlbHNlIGlmIChvcHQuaGFuZCkgeworCS8qIGJhc2UgaXMgcmVhbGx5IDB4N2JlICovCisJb3B0LnJlZ3MuZXNpLmwgPSBvcHQucmVncy5lYnAubCA9IGRhdGEtPmJhc2U7CisJb3B0LnJlZ3MuZHMgPSAwOworCWlmIChpdGVyLT5pbmRleCAmJiBpdGVyLT50eXBlID09IHR5cGVncHQpICAgLyogbXVzdCBiZSBpdGVyYXRlZCBhbmQgR1BUICovCisJICAgIG9wdC5yZWdzLmVheC5sID0gMHg1NDUwNDcyMTsJLyogJyFHUFQnICovCisJZWxzZQorCSAgICBvcHQucmVncy5lYXgubCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHUkxEUiBvZiBHUlVCNERPUyB3YW50cyB0aGUgcGFydGl0aW9uIG51bWJlciBpbiBESDoKKyAqIC0xOiAgIHdob2xlIGRyaXZlIChkZWZhdWx0KQorICogMC0zOiAgcHJpbWFyeSBwYXJ0aXRpb25zCisgKiA0LSo6ICBsb2dpY2FsIHBhcnRpdGlvbnMKKyAqLworaW50IG1hbmdsZXJfZ3JsZHIoY29uc3Qgc3RydWN0IHBhcnRfaXRlciAqaXRlcikKK3sKKyAgICBpZiAob3B0LmdybGRyKQorCW9wdC5yZWdzLmVkeC5iWzFdID0gaXRlci0+aW5kZXggLSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0cnkgdG8gY29weSB2YWx1ZXMgZnJvbSB0ZW1wb3JhcnkgaXRlcmF0b3IsIGlmIHBvc2l0aW9ucyBtYXRjaAorICovCitzdGF0aWMgdm9pZCBtYnJjcHkoc3RydWN0IHBhcnRfaXRlciAqZGl0ZXIsIHN0cnVjdCBwYXJ0X2l0ZXIgKnNpdGVyKQoreworICAgIGlmIChkaXRlci0+ZG9zLmNlYnJfbGJhID09IHNpdGVyLT5kb3MuY2Vicl9sYmEgJiYKKwkgICAgZGl0ZXItPmRpLmRpc2sgPT0gc2l0ZXItPmRpLmRpc2spIHsKKwltZW1jcHkoZGl0ZXItPmRhdGEsIHNpdGVyLT5kYXRhLCBzaXplb2Yoc3RydWN0IGRpc2tfZG9zX21icikpOworICAgIH0KK30KKworc3RhdGljIGludCBmbGlwaGlkZShzdHJ1Y3QgcGFydF9pdGVyICppdGVyLCBzdHJ1Y3QgcGFydF9pdGVyICptaXRlcikKK3sKKyAgICBzdHJ1Y3QgZGlza19kb3NfcGFydF9lbnRyeSAqZHA7CisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IG1hc2sgPQorCSgxIDw8IDB4MDEpIHwgKDEgPDwgMHgwNCkgfCAoMSA8PCAweDA2KSB8CisJKDEgPDwgMHgwNykgfCAoMSA8PCAweDBiKSB8ICgxIDw8IDB4MGMpIHwgKDEgPDwgMHgwZSk7CisgICAgdWludDhfdCB0OworCisgICAgZHAgPSAoc3RydWN0IGRpc2tfZG9zX3BhcnRfZW50cnkgKilpdGVyLT5yZWNvcmQ7CisgICAgdCA9IGRwLT5vc3R5cGU7CisKKyAgICBpZiAoKHQgPD0gMHgxZikgJiYgKChtYXNrID4+ICh0ICYgfjB4MTB1KSkgJiAxKSkgeworCS8qIEl0J3MgYSBoaWRlYWJsZSBwYXJ0aXRpb24gdHlwZSAqLworCWlmIChtaXRlci0+aW5kZXggPT0gaXRlci0+aW5kZXggfHwgb3B0LmhpZGUgJiBISURFX1JFVikKKwkgICAgdCAmPSB+MHgxMHU7CS8qIHVuaGlkZSAqLworCWVsc2UKKwkgICAgdCB8PSAweDEwdTsJLyogaGlkZSAqLworICAgIH0KKyAgICBpZiAoZHAtPm9zdHlwZSAhPSB0KSB7CisJZHAtPm9zdHlwZSA9IHQ7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIG1pdGVyIC0gaXRlcmF0b3Igd2UgbWF0Y2ggYWdhaW5zdAorICogaGlkZSBiaXRzIG1lYW5pbmc6CisgKiAuLnwgLSBlbmFibGUgKDEpIC8gZGlzYWJsZSAoMCkKKyAqIC58LiAtIGFsbCAoMSkgLyBwcmkgKDApCisgKiB8Li4gLSB1bmhpZGUgKDEpIC8gaGlkZSAoMCkKKyAqLworaW50IG1hbmdsZXBlX2hpZGUoc3RydWN0IHBhcnRfaXRlciAqbWl0ZXIpCit7CisgICAgaW50IHdiID0gMCwgd2VyciA9IDA7CisgICAgc3RydWN0IHBhcnRfaXRlciAqaXRlciA9IE5VTEw7CisgICAgaW50IHJpZHg7CisKKyAgICBpZiAoIShvcHQuaGlkZSAmIEhJREVfT04pKQorCXJldHVybiAwOworCisgICAgaWYgKG1pdGVyLT50eXBlICE9IHR5cGVkb3MpIHsKKwllcnJvcigiT3B0aW9uICdbdW5daGlkZVthbGxdJyB3b3JrcyBvbmx5IGZvciBsZWdhY3kgKERPUykgcGFydGl0aW9uIHNjaGVtZS4iKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG1pdGVyLT5pbmRleCA+IDQgJiYgIShvcHQuaGlkZSAmIEhJREVfRVhUKSkKKwl3YXJuKCJTcGVjaWZpZWQgcGFydGl0aW9uIGlzIGxvZ2ljYWwsIHNvIGl0IGNhbid0IGJlIHVuaGlkZGVuIHdpdGhvdXQgJ3VuaGlkZWFsbCcuIik7CisKKyAgICBpZiAoIShpdGVyID0gcGlfYmVnaW4oJm1pdGVyLT5kaSwgUElGX1NURVBBTEwgfCBvcHQucGlmbGFncykpKQorCXJldHVybiAtMTsKKworICAgIHdoaWxlICghcGlfbmV4dChpdGVyKSAmJiAhd2VycikgeworCXJpZHggPSBpdGVyLT5pbmRleDA7CisJaWYgKCEob3B0LmhpZGUgJiBISURFX0VYVCkgJiYgcmlkeCA+IDMpCisJICAgIGJyZWFrOyAgLyogc2tpcCB3aGVuIHdlJ3JlIGNvbnN0cmFpbmVkIHRvIHByaSBvbmx5ICovCisKKwlpZiAoaXRlci0+aW5kZXggIT0gLTEpCisJICAgIHdiIHw9IGZsaXBoaWRlKGl0ZXIsIG1pdGVyKTsKKworCS8qCisJICogd2UgaGF2ZSB0byB1cGRhdGUgbWJyIGFuZCBlYWNoIGV4dGVuZGVkIHBhcnRpdGlvbiwgYnV0IG9ubHkgaWYKKwkgKiBjaGFuZ2VzICh3Yikgd2VyZSBkZXRlY3RlZCBhbmQgdGhlcmUgd2FzIG5vIHByaW9yIHdyaXRlIGVycm9yICh3ZXJyKQorCSAqLworCWlmIChyaWR4ID49IDMgJiYgd2IgJiYgIXdlcnIpIHsKKwkgICAgbWJyY3B5KG1pdGVyLCBpdGVyKTsKKwkgICAgd2VyciB8PSBkaXNrX3dyaXRlX3NlY3RvcnMoJml0ZXItPmRpLCBpdGVyLT5kb3MuY2Vicl9sYmEsIGl0ZXItPmRhdGEsIDEpOworCSAgICB3YiA9IDA7CisJfQorICAgIH0KKworICAgIGlmIChpdGVyLT5zdGF0dXMgPCAwKQorCWdvdG8gYmFpbDsKKworICAgIC8qIGxhc3QgdXBkYXRlICovCisgICAgaWYgKHdiICYmICF3ZXJyKSB7CisJbWJyY3B5KG1pdGVyLCBpdGVyKTsKKwl3ZXJyIHw9IGRpc2tfd3JpdGVfc2VjdG9ycygmaXRlci0+ZGksIGl0ZXItPmRvcy5jZWJyX2xiYSwgaXRlci0+ZGF0YSwgMSk7CisgICAgfQorICAgIGlmICh3ZXJyKQorCXdhcm4oIkZhaWxlZCB0byB3cml0ZSBFL01CUiBkdXJpbmcgJ1t1bl1oaWRlW2FsbF0nLiIpOworCitiYWlsOgorICAgIHBpX2RlbCgmaXRlcik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXBkY2hzKHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIsIGludCBleHQpCit7CisgICAgc3RydWN0IGRpc2tfZG9zX3BhcnRfZW50cnkgKmRwOworICAgIHVpbnQzMl90IG9jaHMxLCBvY2hzMiwgbGJhOworCisgICAgZHAgPSAoc3RydWN0IGRpc2tfZG9zX3BhcnRfZW50cnkgKilpdGVyLT5yZWNvcmQ7CisgICAgaWYgKCFleHQpIHsKKwkvKiBwcmltYXJ5IG9yIGxvZ2ljYWwgKi8KKwlsYmEgPSAodWludDMyX3QpaXRlci0+YWJzX2xiYTsKKyAgICB9IGVsc2UgeworCS8qIGV4dGVuZGVkICovCisJZHAgKz0gMTsKKwlsYmEgPSBpdGVyLT5kb3MubmVicl9sYmE7CisgICAgfQorICAgIG9jaHMxID0gKih1aW50MzJfdCAqKWRwLT5zdGFydDsKKyAgICBvY2hzMiA9ICoodWludDMyX3QgKilkcC0+ZW5kOworCisgICAgLyoKKyAgICAgKiBXZSBoYXZlIHRvIGJlIGEgYml0IG1vcmUgY2FyZWZ1bCBoZXJlIGluIGNhc2Ugb2YgMCBzdGFydCBhbmQvb3IgbGVuZ3RoOworICAgICAqIHN0YXJ0ID0gMCB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGlzayAoQy9IL1MgPQorICAgICAqIDAvMC8xKSBvciB0aGUgW0JdRUJSLCBsZW5ndGggPSAwIHdvdWxkIGFjdHVhbGx5IHNldCB0aGUgZW5kIENIUyB0byBiZQorICAgICAqIGxvd2VyIHRoYW4gdGhlIHN0YXJ0IENIUy4KKyAgICAgKgorICAgICAqIEJvdGggYXJlIGhhcm1sZXNzIGluIGNhc2Ugb2YgYSBob2xlIChhbmQgaW4gbm9uLWhvbGUgY2FzZSB3aWxsIG1ha2UKKyAgICAgKiBwYXJ0aXRlciBjb21wbGFpbiBhYm91dCBjb3JydXB0IGxheW91dCBpZiBQSUZfU1RSSUNUIGlzIHNldCksIGJ1dCBpdAorICAgICAqIG1ha2VzIGV2ZXJ5dGhpbmcgbG9vayBzaWxseSBhbmQgbm90IHJlYWxseSBjb3JyZWN0LgorICAgICAqCisgICAgICogVGh1cyB0aGUgYXBwcm9hY2ggYXMgc2VlbiBiZWxvdy4KKyAgICAgKi8KKworICAgIGlmIChkcC0+c3RhcnRfbGJhIHx8IGl0ZXItPmluZGV4ICE9IC0xKSB7CisJbGJhMmNocygmZHAtPnN0YXJ0LCAmaXRlci0+ZGksIGxiYSwgTDJDX0NBREQpOworICAgIH0gZWxzZSB7CisJbWVtc2V0KCZkcC0+c3RhcnQsIDAsIHNpemVvZiBkcC0+c3RhcnQpOworICAgIH0KKworICAgIGlmICgoZHAtPnN0YXJ0X2xiYSB8fCBpdGVyLT5pbmRleCAhPSAtMSkgJiYgZHAtPmxlbmd0aCkgeworCWxiYTJjaHMoJmRwLT5lbmQsICZpdGVyLT5kaSwgbGJhICsgZHAtPmxlbmd0aCAtIDEsIEwyQ19DQUREKTsKKyAgICB9IGVsc2UgeworCW1lbXNldCgmZHAtPmVuZCwgMCwgc2l6ZW9mIGRwLT5lbmQpOworICAgIH0KKworICAgIHJldHVybgorCSoodWludDMyX3QgKilkcC0+c3RhcnQgIT0gb2NoczEgfHwKKwkqKHVpbnQzMl90ICopZHAtPmVuZCAhPSBvY2hzMjsKK30KKworLyoKKyAqIG1pdGVyIC0gaXRlcmF0b3Igd2UgbWF0Y2ggYWdhaW5zdAorICovCitpbnQgbWFuZ2xlcGVfZml4Y2hzKHN0cnVjdCBwYXJ0X2l0ZXIgKm1pdGVyKQoreworICAgIGludCB3YiA9IDAsIHdlcnIgPSAwOworICAgIHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIgPSBOVUxMOworICAgIGludCByaWR4OworCisgICAgaWYgKCFvcHQuZml4Y2hzKQorCXJldHVybiAwOworCisgICAgaWYgKG1pdGVyLT50eXBlICE9IHR5cGVkb3MpIHsKKwllcnJvcigiT3B0aW9uICdmaXhjaHMnIHdvcmtzIG9ubHkgZm9yIGxlZ2FjeSAoRE9TKSBwYXJ0aXRpb24gc2NoZW1lLiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIShpdGVyID0gcGlfYmVnaW4oJm1pdGVyLT5kaSwgUElGX1NURVBBTEwgfCBvcHQucGlmbGFncykpKQorCXJldHVybiAtMTsKKworICAgIHdoaWxlICghcGlfbmV4dChpdGVyKSAmJiAhd2VycikgeworCXJpZHggPSBpdGVyLT5pbmRleDA7CisKKwl3YiB8PSB1cGRjaHMoaXRlciwgMCk7CisJaWYgKHJpZHggPiAzKQorCSAgICB3YiB8PSB1cGRjaHMoaXRlciwgMSk7CisKKwkvKgorCSAqIHdlIGhhdmUgdG8gdXBkYXRlIG1iciBhbmQgZWFjaCBleHRlbmRlZCBwYXJ0aXRpb24sIGJ1dCBvbmx5IGlmCisJICogY2hhbmdlcyAod2IpIHdlcmUgZGV0ZWN0ZWQgYW5kIHRoZXJlIHdhcyBubyBwcmlvciB3cml0ZSBlcnJvciAod2VycikKKwkgKi8KKwlpZiAocmlkeCA+PSAzICYmIHdiICYmICF3ZXJyKSB7CisJICAgIG1icmNweShtaXRlciwgaXRlcik7CisJICAgIHdlcnIgfD0gZGlza193cml0ZV9zZWN0b3JzKCZpdGVyLT5kaSwgaXRlci0+ZG9zLmNlYnJfbGJhLCBpdGVyLT5kYXRhLCAxKTsKKwkgICAgd2IgPSAwOworCX0KKyAgICB9CisKKyAgICBpZiAoaXRlci0+c3RhdHVzIDwgMCkKKwlnb3RvIGJhaWw7CisKKyAgICAvKiBsYXN0IHVwZGF0ZSAqLworICAgIGlmICh3YiAmJiAhd2VycikgeworCW1icmNweShtaXRlciwgaXRlcik7CisJd2VyciB8PSBkaXNrX3dyaXRlX3NlY3RvcnMoJml0ZXItPmRpLCBpdGVyLT5kb3MuY2Vicl9sYmEsIGl0ZXItPmRhdGEsIDEpOworICAgIH0KKyAgICBpZiAod2VycikKKwl3YXJuKCJGYWlsZWQgdG8gd3JpdGUgRS9NQlIgZHVyaW5nICdmaXhjaHMnLiIpOworCitiYWlsOgorICAgIHBpX2RlbCgmaXRlcik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTQgc3c9NCBub2V0OiAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvY2hhaW4vbWFuZ2xlLmggYi9jb20zMi9jaGFpbi9tYW5nbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGE1Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY2hhaW4vbWFuZ2xlLmgKQEAgLTAsMCArMSw2MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICogICBDb3B5cmlnaHQgMjAxMCBTaGFvIE1pbGxlcgorICogICBDb3B5cmlnaHQgMjAxMC0yMDEyIE1pY2hhbCBTb2x0eXMKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBDT00zMl9DSEFJTl9NQU5HTEVfSAorI2RlZmluZSBDT00zMl9DSEFJTl9NQU5HTEVfSAorCisjaW5jbHVkZSAiY2hhaW4uaCIKKyNpbmNsdWRlICJwYXJ0aXRlci5oIgorCisvKiBmaWxlJ3MgbWFuZ2xlcnMgKi8KK2ludCBtYW5nbGVmX2lzb2xpbnV4KHN0cnVjdCBkYXRhX2FyZWEgKmRhdGEpOworaW50IG1hbmdsZWZfZ3J1Yihjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyLCBzdHJ1Y3QgZGF0YV9hcmVhICpkYXRhKTsKK2ludCBtYW5nbGVmX2JwYihjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyLCBzdHJ1Y3QgZGF0YV9hcmVhICpkYXRhKTsKKy8qIGludCBtYW5nbGVmX2RybWsoc3RydWN0IGRhdGFfYXJlYSAqZGF0YSk7Ki8KKworLyogc2VjdG9yJ3MgbWFuZ2xlcnMgKi8KK2ludCBtYW5nbGVzX2JwYihjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyLCBzdHJ1Y3QgZGF0YV9hcmVhICpkYXRhKTsKK2ludCBtYW5nbGVzX3NhdmUoY29uc3Qgc3RydWN0IHBhcnRfaXRlciAqaXRlciwgY29uc3Qgc3RydWN0IGRhdGFfYXJlYSAqZGF0YSwgdm9pZCAqb3JnKTsKK2ludCBtYW5nbGVzX2NtbGRyKHN0cnVjdCBkYXRhX2FyZWEgKmRhdGEpOworCisvKiBzZWN0b3IgKyBmaWxlJ3MgbWFuZ2xlcnMgKi8KK2ludCBtYW5nbGVzZl9ic3Moc3RydWN0IGRhdGFfYXJlYSAqc2VjLCBzdHJ1Y3QgZGF0YV9hcmVhICpmaWwpOworCisvKiByZWdpc3RlcnMnIG1hbmdsZXJzICovCitpbnQgbWFuZ2xlcl9pbml0KGNvbnN0IHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIpOworaW50IG1hbmdsZXJfaGFuZG92ZXIoY29uc3Qgc3RydWN0IHBhcnRfaXRlciAqaXRlciwgY29uc3Qgc3RydWN0IGRhdGFfYXJlYSAqZGF0YSk7CitpbnQgbWFuZ2xlcl9ncmxkcihjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyKTsKKworLyogcGFydGl0aW9uIGxheW91dCdzIG1hbmdsZXJzICovCitpbnQgbWFuZ2xlcGVfZml4Y2hzKHN0cnVjdCBwYXJ0X2l0ZXIgKm1pdGVyKTsKK2ludCBtYW5nbGVwZV9oaWRlKHN0cnVjdCBwYXJ0X2l0ZXIgKm1pdGVyKTsKKworI2VuZGlmCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTQgc3c9NCBub2V0OiAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvY2hhaW4vb3B0aW9ucy5jIGIvY29tMzIvY2hhaW4vb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OWUwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jaGFpbi9vcHRpb25zLmMKQEAgLTAsMCArMSw0MzYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqICAgQ29weXJpZ2h0IDIwMTAgU2hhbyBNaWxsZXIKKyAqICAgQ29weXJpZ2h0IDIwMTAtMjAxMiBNaWNoYWwgU29sdHlzCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImNoYWluLmgiCisjaW5jbHVkZSAicGFydGl0ZXIuaCIKKyNpbmNsdWRlICJ1dGlsaXR5LmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorCitzdHJ1Y3Qgb3B0aW9ucyBvcHQ7CisKK3N0YXRpYyBpbnQgc29pX3MybihjaGFyICpwdHIsCisJCQlhZGRyX3QgKnNlZywKKwkJCWFkZHJfdCAqb2ZmLAorCQkJYWRkcl90ICppcCwKKwkJCWFkZHJfdCBkZWYpCit7CisgICAgYWRkcl90IHNlZ3ZhbCwgb2ZmdmFsLCBpcHZhbCwgdmFsOworICAgIGNoYXIgKnA7CisKKyAgICAvKiBkZWZhdWx0cyAqLworICAgIHNlZ3ZhbCA9IDA7CisgICAgb2ZmdmFsID0gZGVmOworICAgIGlwdmFsID0gZGVmOworCisgICAgc2VndmFsID0gc3RydG91bChwdHIsICZwLCAwKTsKKyAgICBpZiAocFswXSA9PSAnOicgJiYgcFsxXSAmJiBwWzFdICE9ICc6JykKKwlvZmZ2YWwgPSBzdHJ0b3VsKHArMSwgJnAsIDApOworICAgIGlmIChwWzBdID09ICc6JyAmJiBwWzFdICYmIHBbMV0gIT0gJzonKQorCWlwdmFsID0gc3RydG91bChwKzEsIE5VTEwsIDApOworCisgICAgLyogdmVyaWZ5IGlmIGxvYWQgYWRkcmVzcyBpcyB3aXRoaW4gW2Rvc21pbiwgZG9zbWF4KSAqLworICAgIHZhbCA9IChzZWd2YWwgPDwgNCkgKyBvZmZ2YWw7CisKKyAgICBpZiAodmFsIDwgZG9zbWluIHx8IHZhbCA+PSBkb3NtYXgpIHsKKwllcnJvcigiSW52YWxpZCBzZWc6b2ZmOiogYWRkcmVzcyBzcGVjaWZpZWQuIik7CisJZ290byBiYWlsOworICAgIH0KKworICAgIC8qCisgICAgICogdmVyaWZ5IGlmIGp1bXAgYWRkcmVzcyBpcyB3aXRoaW4gW2Rvc21pbiwgZG9zbWF4KSBhbmQgb2Zmc2V0IGlzIDE2Yml0CisgICAgICogc2FuZQorICAgICAqLworICAgIHZhbCA9IChzZWd2YWwgPDwgNCkgKyBpcHZhbDsKKworICAgIGlmIChpcHZhbCA+IDB4RkZGRSB8fCB2YWwgPCBkb3NtaW4gfHwgdmFsID49IGRvc21heCkgeworCWVycm9yKCJJbnZhbGlkIHNlZzoqOmlwIGFkZHJlc3Mgc3BlY2lmaWVkLiIpOworCWdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoc2VnKQorCSpzZWcgPSBzZWd2YWw7CisgICAgaWYgKG9mZikKKwkqb2ZmID0gb2ZmdmFsOworICAgIGlmIChpcCkKKwkqaXAgID0gaXB2YWw7CisKKyAgICByZXR1cm4gMDsKK2JhaWw6CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworICAgIHNpemVfdCBpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1c2FnZVtdID0geworIlVzYWdlOiIsCisiIiwKKyIgIGRpc2sgKyBwYXJ0aXRpb24gc2VsZWN0aW9uOiIsCisiICAgICAgICBjaGFpbi5jMzIgW29wdGlvbnNdIiwKKyIgICAgICAgIGNoYWluLmMzMiBoZCNbLCNdIFtvcHRpb25zXSIsCisiICAgICAgICBjaGFpbi5jMzIgZmQjWywjXSBbb3B0aW9uc10iLAorIiAgICAgICAgY2hhaW4uYzMyIG1icj08aWQ+WywjXSBbb3B0aW9uc10iLAorIiAgICAgICAgY2hhaW4uYzMyIGd1aWQ9PGd1aWQ+WywjXSBbb3B0aW9uc10iLAorIiAgICAgICAgY2hhaW4uYzMyIGJvb3RbLCNdIFtvcHRpb25zXSIsCisiIiwKKyIgIGRpcmVjdCBwYXJ0aXRpb24gc2VsZWN0aW9uOiIsCisiICAgICAgICBjaGFpbi5jMzIgZ3VpZD08Z3VpZD4gW29wdGlvbnNdIiwKKyIgICAgICAgIGNoYWluLmMzMiBsYWJlbD08bGFiZWw+IFtvcHRpb25zXSIsCisiICAgICAgICBjaGFpbi5jMzIgZnMgW29wdGlvbnNdIiwKKyIiLAorIllvdSBjYW4gdXNlICc6JyBpbnN0ZWFkIG9mICc9JyBhbmQgJyAnIGluc3RlYWQgb2YgJywnLiIsCisiVGhlIGRlZmF1bHQgaXMgJ2Jvb3QsMCcuIiwKKyIiLAorIk9wdGlvbnM6IiwKKyIgIHNlY3RbPTxzWzpvWzppXV0+XSAgIExvYWQgc2VjdG9yIGF0IDxzOm8+LCBqdW1wIHRvIDxzOmk+IiwKKyIgICAgICAgICAgICAgICAgICAgICAgIC0gZGVmYXVsdHMgdG8gMDoweDdDMDA6MHg3QzAwIiwKKyIgICAgICAgICAgICAgICAgICAgICAgIC0gb21pdHRlZCBvL2kgdmFsdWVzIGRlZmF1bHQgdG8gMCIsCisiICBtYXBzICAgICAgICAgICAgICAgICBNYXAgbG9hZGVkIHNlY3RvciBpbnRvIHJlYWwgbWVtb3J5IiwKKyIgIHNldGJwYiAgICAgICAgICAgICAgIEZpeCBCUEIgZmllbGRzIGluIGxvYWRlZCBzZWN0b3IiLAorIiAgZmlsZWJwYiAgICAgICAgICAgICAgQXBwbHkgJ3NldGJwYicgdG8gbG9hZGVkIGZpbGUiLAorIiAgc2F2ZSAgICAgICAgICAgICAgICAgV3JpdGUgYWRqdXN0ZWQgc2VjdG9yIGJhY2sgdG8gZGlzayIsCisiICBoYW5kICAgICAgICAgICAgICAgICBQcmVwYXJlIGhhbmRvdmVyIGFyZWEiLAorIiAgaHB0ciAgICAgICAgICAgICAgICAgRm9yY2UgZHM6c2kgYW5kIGRzOmJwIHRvIHBvaW50IHRvIGhhbmRvdmVyIGFyZWEiLAorIiAgc3dhcCAgICAgICAgICAgICAgICAgU3dhcCBkcml2ZSBudW1iZXJzLCBpZiBib290ZGlzayBpcyBub3QgZmQwL2hkMCIsCisiICBub2hpZGUgICAgICAgICAgICAgICBEaXNhYmxlIGFsbCBoaWRlIHZhcmlhdGlvbnMgKGRlZmF1bHQpIiwKKyIgIGhpZGUgICAgICAgICAgICAgICAgIEhpZGUgcHJpbWFyeSBwYXJ0aXRpb25zLCB1bmhpZGUgc2VsZWN0ZWQgcGFydGl0aW9uIiwKKyIgIGhpZGVhbGwgICAgICAgICAgICAgIEhpZGUgKmFsbCogcGFydGl0aW9ucywgdW5oaWRlIHNlbGVjdGVkIHBhcnRpdGlvbiIsCisiICB1bmhpZGUgICAgICAgICAgICAgICBVbmhpZGUgcHJpbWFyeSBwYXJ0aXRpb25zIiwKKyIgIHVuaGlkZWFsbCAgICAgICAgICAgIFVuaGlkZSAqYWxsKiBwYXJ0aXRpb25zIiwKKyIgIGZpeGNocyAgICAgICAgICAgICAgIFdhbGsgKmFsbCogcGFydGl0aW9ucyBhbmQgZml4IEUvTUJScycgQ0hTIHZhbHVlcyIsCisiICBrZWVwcHhlICAgICAgICAgICAgICBLZWVwIHRoZSBQWEUgYW5kIFVOREkgc3RhY2tzIGluIG1lbW9yeSAoUFhFTElOVVgpIiwKKyIgIHdhcm4gICAgICAgICAgICAgICAgIFdhaXQgZm9yIGEga2V5cHJlc3MgdG8gY29udGludWUgY2hhaW5sb2FkaW5nIiwKKyIgIGJyZWFrICAgICAgICAgICAgICAgIERvbid0IGNoYWlubG9hZCIsCisiICBzdHJpY3RbPTwwfDF8Mj5dICAgICBTZXQgdGhlIGxldmVsIG9mIHN0cmljdG5lc3MgaW4gc2FuaXR5IGNoZWNrcyIsCisiICAgICAgICAgICAgICAgICAgICAgICAtIHN0cmljdCB3L28gYW55IHZhbHVlIGlzIHRoZSBzYW1lIGFzIHN0cmljdD0yIiwKKyIgIHJlbGF4ICAgICAgICAgICAgICAgIFRoZSBzYW1lIGFzIHN0cmljdD0wIiwKKyIgIHByZWZtYnIgICAgICAgICAgICAgIE9uIGh5YnJpZCBNQlIvR1BUIGRpc2tzLCBwcmVmZXIgbGVnYWN5IGxheW91dCIsCisiIiwKKyIgIGZpbGU9PGZpbGU+ICAgICAgICAgIExvYWQgYW5kIGV4ZWN1dGUgPGZpbGU+IiwKKyIgIHNlZz08c1s6b1s6aV1dPiAgICAgIExvYWQgZmlsZSBhdCA8czpvPiwganVtcCB0byA8czppPiIsCisiICAgICAgICAgICAgICAgICAgICAgICAtIGRlZmF1bHRzIHRvIDA6MHg3QzAwOjB4N0MwMCIsCisiICAgICAgICAgICAgICAgICAgICAgICAtIG9taXR0ZWQgby9pIHZhbHVlcyBkZWZhdWx0IHRvIDAiLAorIiAgaXNvbGludXg9PGxvYWRlcj4gICAgTG9hZCBhbm90aGVyIHZlcnNpb24gb2YgSVNPTElOVVgiLAorIiAgbnRsZHI9PGxvYWRlcj4gICAgICAgTG9hZCBXaW5kb3dzIE5UTERSLCBTRVRVUExEUi5CSU4gb3IgQk9PVE1HUiIsCisiICByZWFjdG9zPTxsb2FkZXI+ICAgICBMb2FkIFJlYWN0T1MncyBsb2FkZXIiLAorIiAgY21sZHI9PGxvYWRlcj4gICAgICAgTG9hZCBSZWNvdmVyeSBDb25zb2xlIG9mIFdpbmRvd3MgTlQvMksvWFAvMjAwMyIsCisiICBmcmVlZG9zPTxsb2FkZXI+ICAgICBMb2FkIEZyZWVET1MgS0VSTkVMLlNZUyIsCisiICBtc2Rvcz08bG9hZGVyPiAgICAgICBMb2FkIE1TLURPUyAyLnh4IC0gNi54eCBJTy5TWVMiLAorIiAgbXNkb3M3PTxsb2FkZXI+ICAgICAgTG9hZCBNUy1ET1MgNysgSU8uU1lTIiwKKyIgIHBjZG9zPTxsb2FkZXI+ICAgICAgIExvYWQgUEMtRE9TIElCTUJJTy5DT00iLAorIiAgZHJtaz08bG9hZGVyPiAgICAgICAgTG9hZCBEUk1LIERFTExCSU8uQklOIiwKKyIgIGdydWI9PGxvYWRlcj4gICAgICAgIExvYWQgR1JVQiBMZWdhY3kgc3RhZ2UyIiwKKyIgIGdydWJjZmc9PGNvbmZpZz4gICAgIFNldCBhbHRlcm5hdGl2ZSBjb25maWcgZmlsZW5hbWUgZm9yIEdSVUIgTGVnYWN5IiwKKyIgIGdybGRyPTxsb2FkZXI+ICAgICAgIExvYWQgR1JVQjRET1MgZ3JsZHIiLAorIiAgYnNzPTxzZWN0aW1hZ2U+ICAgICAgRW11bGF0ZSBzeXNsaW51eCdzIEJTUyIsCisiICBicz08c2VjdGltYWdlPiAgICAgICBFbXVsYXRlIHN5c2xpbnV4J3MgQlMiLAorIiIsCisiUGxlYXNlIHNlZSBkb2MvY2hhaW4udHh0IGZvciB0aGUgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbi4iCit9OworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodXNhZ2UpL3NpemVvZih1c2FnZVswXSk7IGkrKykgeworCWlmIChpICUgMjAgPT0gMTkpIHsKKwkgICAgcHV0cygiUHJlc3MgYW55IGtleS4uLiIpOworCSAgICB3YWl0X2tleSgpOworCX0KKwlwdXRzKHVzYWdlW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgb3B0X3NldF9kZWZzKHZvaWQpCit7CisgICAgbWVtc2V0KCZvcHQsIDAsIHNpemVvZiBvcHQpOworICAgIG9wdC5zZWN0ID0gdHJ1ZTsJICAgIC8qIGJ5IGRlZi4gbG9hZCBzZWN0b3IgKi8KKyAgICBvcHQubWFwcyA9IHRydWU7CSAgICAvKiBieSBkZWYuIG1hcCBzZWN0b3IgKi8KKyAgICBvcHQuaGFuZCA9IHRydWU7CSAgICAvKiBieSBkZWYuIHByZXBhcmUgaGFuZG92ZXIgKi8KKyAgICBvcHQuYnJrY2hhaW4gPSBmYWxzZTsgICAvKiBieSBkZWYuIGRvIGNoYWlubG9hZCAqLworICAgIG9wdC5waWZsYWdzID0gUElGX1NUUklDVDsJLyogYnkgZGVmLiBiZSBzdHJpY3QsIGJ1dCBpZ25vcmUgZGlzayBzaXplcyAqLworICAgIG9wdC5mb2ZmID0gb3B0LnNvZmYgPSBvcHQuZmlwID0gb3B0LnNpcCA9IDB4N0MwMDsKKyAgICBvcHQuZHJpdmVuYW1lID0gImJvb3QiOworI2lmZGVmIERFQlVHCisgICAgb3B0Lndhcm4gPSB0cnVlOworI2VuZGlmCit9CisKK2ludCBvcHRfcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBpOworICAgIHNpemVfdCB2OworICAgIGNoYXIgKnA7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJmaWxlPSIsIDUpKSB7CisJICAgIG9wdC5maWxlID0gYXJndltpXSArIDU7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJub2ZpbGUiKSkgeworCSAgICBvcHQuZmlsZSA9IE5VTEw7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAic2VnPSIsIDQpKSB7CisJICAgIGlmIChzb2lfczJuKGFyZ3ZbaV0gKyA0LCAmb3B0LmZzZWcsICZvcHQuZm9mZiwgJm9wdC5maXAsIDApKQorCQlnb3RvIGJhaWw7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiYnNzPSIsIDQpKSB7CisJICAgIG9wdC5maWxlID0gYXJndltpXSArIDQ7CisJICAgIG9wdC5ic3MgPSB0cnVlOworCSAgICBvcHQubWFwcyA9IGZhbHNlOworCSAgICBvcHQuc2V0YnBiID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJicz0iLCAzKSkgeworCSAgICBvcHQuZmlsZSA9IGFyZ3ZbaV0gKyAzOworCSAgICBvcHQuc2VjdCA9IGZhbHNlOworCSAgICBvcHQuZmlsZWJwYiA9IHRydWU7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiaXNvbGludXg9IiwgOSkpIHsKKwkgICAgb3B0LmZpbGUgPSBhcmd2W2ldICsgOTsKKwkgICAgb3B0Lmlzb2xpbnV4ID0gdHJ1ZTsKKwkgICAgb3B0LmhhbmQgPSBmYWxzZTsKKwkgICAgb3B0LnNlY3QgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJudGxkcj0iLCA2KSkgeworCSAgICBvcHQuZnNlZyA9IDB4MjAwMDsgIC8qIE5UTERSIHdhbnRzIHRoaXMgYWRkcmVzcyAqLworCSAgICBvcHQuZm9mZiA9IDA7CisJICAgIG9wdC5maXAgPSAwOworCSAgICBvcHQuZmlsZSA9IGFyZ3ZbaV0gKyA2OworCSAgICBvcHQuc2V0YnBiID0gdHJ1ZTsKKwkgICAgb3B0LmhhbmQgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJyZWFjdG9zPSIsIDgpKSB7CisJICAgIC8qCisJICAgICAqIHNldHRpbmdzIGJhc2VkIG9uIGNvbW1pdAorCSAgICAgKiAgIGFkNGNmMTQ3MDk3N2Y2NDhlZTFkZDQ1ZTk3OTM5NTg5Y2NiMDM5M2MKKwkgICAgICogbm90ZSwgY29uZmxpY3RzIHdpdGg6CisJICAgICAqICAgaHR0cDovL3JlYWN0b3MuZnJlZWRvb3JzLm9yZy9SZWFjdG9zJTIwMC4zLjEzL1JlYWN0T1MtMC4zLjEzLVJFTC1zcmMvYm9vdC9mcmVlbGRyL25vdGVzLnR4dAorCSAgICAgKi8KKwkgICAgb3B0LmZzZWcgPSAwOworCSAgICBvcHQuZm9mZiA9IDB4ODAwMDsKKwkgICAgb3B0LmZpcCA9IDB4ODEwMDsKKwkgICAgb3B0LmZpbGUgPSBhcmd2W2ldICsgODsKKwkgICAgb3B0LnNldGJwYiA9IHRydWU7CisJICAgIG9wdC5oYW5kID0gZmFsc2U7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiY21sZHI9IiwgNikpIHsKKwkgICAgb3B0LmZzZWcgPSAweDIwMDA7ICAvKiBDTUxEUiB3YW50cyB0aGlzIGFkZHJlc3MgKi8KKwkgICAgb3B0LmZvZmYgPSAwOworCSAgICBvcHQuZmlwID0gMDsKKwkgICAgb3B0LmZpbGUgPSBhcmd2W2ldICsgNjsKKwkgICAgb3B0LmNtbGRyID0gdHJ1ZTsKKwkgICAgb3B0LnNldGJwYiA9IHRydWU7CisJICAgIG9wdC5oYW5kID0gZmFsc2U7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiZnJlZWRvcz0iLCA4KSkgeworCSAgICBvcHQuZnNlZyA9IDB4NjA7ICAgIC8qIEZSRUVET1Mgd2FudHMgdGhpcyBhZGRyZXNzICovCisJICAgIG9wdC5mb2ZmID0gMDsKKwkgICAgb3B0LmZpcCA9IDA7CisJICAgIG9wdC5zc2VnID0gMHgxRkUwOworCSAgICBvcHQuZmlsZSA9IGFyZ3ZbaV0gKyA4OworCSAgICBvcHQuc2V0YnBiID0gdHJ1ZTsKKwkgICAgb3B0LmhhbmQgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCAodiA9IDYsICFzdHJuY21wKGFyZ3ZbaV0sICJtc2Rvcz0iLCB2KSB8fAorCQkgICAgICFzdHJuY21wKGFyZ3ZbaV0sICJwY2Rvcz0iLCB2KSkgfHwKKwkJICAgICh2ID0gNywgIXN0cm5jbXAoYXJndltpXSwgIm1zZG9zNz0iLCB2KSkgKSB7CisJICAgIG9wdC5mc2VnID0gMHg3MDsgICAgLyogTVMtRE9TIDIuMDAgLi4gNi54eCB3YW50cyB0aGlzIGFkZHJlc3MgKi8KKwkgICAgb3B0LmZvZmYgPSAwOworCSAgICBvcHQuZmlwID0gdiA9PSA3ID8gMHgyMDAgOiAwOyAgLyogTVMtRE9TIDcuMCsgd2FudHMgdGhpcyBpcCAqLworCSAgICBvcHQuc3NlZyA9IDB4ODAwMDsKKwkgICAgb3B0LmZpbGUgPSBhcmd2W2ldICsgdjsKKwkgICAgb3B0LnNldGJwYiA9IHRydWU7CisJICAgIG9wdC5oYW5kID0gZmFsc2U7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiZHJtaz0iLCA1KSkgeworCSAgICBvcHQuZnNlZyA9IDB4NzA7ICAgIC8qIERSTUsgd2FudHMgdGhpcyBhZGRyZXNzICovCisJICAgIG9wdC5mb2ZmID0gMDsKKwkgICAgb3B0LmZpcCA9IDA7CisJICAgIG9wdC5zc2VnID0gMHgyMDAwOworCSAgICBvcHQuc29mZiA9IDA7CisJICAgIG9wdC5zaXAgPSAwOworCSAgICBvcHQuZmlsZSA9IGFyZ3ZbaV0gKyA1OworCSAgICAvKiBvcHQuZHJtayA9IHRydWU7ICovCisJICAgIG9wdC5zZXRicGIgPSB0cnVlOworCSAgICBvcHQuaGFuZCA9IGZhbHNlOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgImdydWI9IiwgNSkpIHsKKwkgICAgb3B0LmZzZWcgPSAweDgwMDsJLyogc3RhZ2UyIHdhbnRzIHRoaXMgYWRkcmVzcyAqLworCSAgICBvcHQuZm9mZiA9IDA7CisJICAgIG9wdC5maXAgPSAweDIwMDsKKwkgICAgb3B0LmZpbGUgPSBhcmd2W2ldICsgNTsKKwkgICAgb3B0LmdydWIgPSB0cnVlOworCSAgICBvcHQuaGFuZCA9IGZhbHNlOworCSAgICBvcHQuc2VjdCA9IGZhbHNlOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgImdydWJjZmc9IiwgOCkpIHsKKwkgICAgb3B0LmdydWJjZmcgPSBhcmd2W2ldICsgODsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJncmxkcj0iLCA2KSkgeworCSAgICBvcHQuZmlsZSA9IGFyZ3ZbaV0gKyA2OworCSAgICBvcHQuZ3JsZHIgPSB0cnVlOworCSAgICBvcHQuaGFuZCA9IGZhbHNlOworCSAgICBvcHQuc2VjdCA9IGZhbHNlOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAia2VlcHB4ZSIpKSB7CisJICAgIG9wdC5rZWVwcHhlID0gMzsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIm5va2VlcHB4ZSIpKSB7CisJICAgIG9wdC5rZWVwcHhlID0gMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIm1hcHMiKSkgeworCSAgICBvcHQubWFwcyA9IHRydWU7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJub21hcHMiKSkgeworCSAgICBvcHQubWFwcyA9IGZhbHNlOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiaGFuZCIpKSB7CisJICAgIG9wdC5oYW5kID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIm5vaGFuZCIpKSB7CisJICAgIG9wdC5oYW5kID0gZmFsc2U7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJocHRyIikpIHsKKwkgICAgb3B0LmhwdHIgPSB0cnVlOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAibm9ocHRyIikpIHsKKwkgICAgb3B0LmhwdHIgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgInN3YXAiKSkgeworCSAgICBvcHQuc3dhcCA9IHRydWU7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJub3N3YXAiKSkgeworCSAgICBvcHQuc3dhcCA9IGZhbHNlOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAibm9oaWRlIikpIHsKKwkgICAgb3B0LmhpZGUgPSBISURFX09GRjsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgImhpZGUiKSkgeworCSAgICBvcHQuaGlkZSA9IEhJREVfT047CisJICAgIG9wdC5waWZsYWdzIHw9IFBJRl9TVFJJQ1QgfCBQSUZfU1RSSUNURVI7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJoaWRlYWxsIikpIHsKKwkgICAgb3B0LmhpZGUgPSBISURFX09OIHwgSElERV9FWFQ7CisJICAgIG9wdC5waWZsYWdzIHw9IFBJRl9TVFJJQ1QgfCBQSUZfU1RSSUNURVI7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJ1bmhpZGUiKSkgeworCSAgICBvcHQuaGlkZSA9IEhJREVfT04gfCBISURFX1JFVjsKKwkgICAgb3B0LnBpZmxhZ3MgfD0gUElGX1NUUklDVCB8IFBJRl9TVFJJQ1RFUjsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgInVuaGlkZWFsbCIpKSB7CisJICAgIG9wdC5oaWRlID0gSElERV9PTiB8IEhJREVfRVhUIHwgSElERV9SRVY7CisJICAgIG9wdC5waWZsYWdzIHw9IFBJRl9TVFJJQ1QgfCBQSUZfU1RSSUNURVI7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJzZXRicGIiKSkgeworCSAgICBvcHQuc2V0YnBiID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIm5vc2V0YnBiIikpIHsKKwkgICAgb3B0LnNldGJwYiA9IGZhbHNlOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiZmlsZWJwYiIpKSB7CisJICAgIG9wdC5maWxlYnBiID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIm5vZmlsZWJwYiIpKSB7CisJICAgIG9wdC5maWxlYnBiID0gZmFsc2U7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAic2VjdD0iLCA1KSB8fAorCQkgICAhc3RyY21wKGFyZ3ZbaV0sICJzZWN0IikpIHsKKwkgICAgaWYgKGFyZ3ZbaV1bNF0pIHsKKwkJaWYgKHNvaV9zMm4oYXJndltpXSArIDUsICZvcHQuc3NlZywgJm9wdC5zb2ZmLCAmb3B0LnNpcCwgMCkpCisJCSAgICBnb3RvIGJhaWw7CisJICAgIH0KKwkgICAgb3B0LnNlY3QgPSB0cnVlOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAibm9zZWN0IikpIHsKKwkgICAgb3B0LnNlY3QgPSBmYWxzZTsKKwkgICAgb3B0Lm1hcHMgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgInNhdmUiKSkgeworCSAgICBvcHQuc2F2ZSA9IHRydWU7CisJICAgIG9wdC5waWZsYWdzIHw9IFBJRl9TVFJJQ1QgfCBQSUZfU1RSSUNURVI7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJub3NhdmUiKSkgeworCSAgICBvcHQuc2F2ZSA9IGZhbHNlOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiZml4Y2hzIikpIHsKKwkgICAgb3B0LmZpeGNocyA9IHRydWU7CisJICAgIG9wdC5waWZsYWdzIHw9IFBJRl9TVFJJQ1QgfCBQSUZfU1RSSUNURVI7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJub2ZpeGNocyIpKSB7CisJICAgIG9wdC5maXhjaHMgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgInJlbGF4IikgfHwgIXN0cmNtcChhcmd2W2ldLCAibm9zdHJpY3QiKSkgeworCSAgICBvcHQucGlmbGFncyAmPSB+KFBJRl9TVFJJQ1QgfCBQSUZfU1RSSUNURVIpOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAibm9yZWxheCIpIHx8ICFzdHJjbXAoYXJndltpXSwgInN0cmljdCIpKSB7CisJICAgIG9wdC5waWZsYWdzIHw9IFBJRl9TVFJJQ1QgfCBQSUZfU1RSSUNURVI7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAic3RyaWN0PSIsIDcpKSB7CisJICAgIGlmIChhcmd2W2ldWzddIDwgJzAnIHx8IGFyZ3ZbaV1bN10gPiAnMicgfHwgIWFyZ3ZbaV1bOF0pIHsKKwkJZXJyb3IoIlN0cmljdCBsZXZlbCBtdXN0IGJlIDAsIDEgb3IgMi4iKTsKKwkJZ290byBiYWlsOworCSAgICB9CisJICAgIG9wdC5waWZsYWdzICY9IH4oUElGX1NUUklDVCB8IFBJRl9TVFJJQ1RFUik7CisJICAgIHN3aXRjaCAoYXJndltpXVs3XSkgeworCQljYXNlICcyJzogb3B0LnBpZmxhZ3MgfD0gUElGX1NUUklDVEVSOworCQljYXNlICcxJzogb3B0LnBpZmxhZ3MgfD0gUElGX1NUUklDVDsgYnJlYWs7CisJCWRlZmF1bHQ6OworCSAgICB9CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJ3YXJuIikpIHsKKwkgICAgb3B0Lndhcm4gPSB0cnVlOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAibm93YXJuIikpIHsKKwkgICAgb3B0Lndhcm4gPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgInByZWZtYnIiKSkgeworCSAgICBvcHQucGlmbGFncyB8PSBQSUZfUFJFRk1CUjsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIm5vcHJlZm1iciIpKSB7CisJICAgIG9wdC5waWZsYWdzICY9IH5QSUZfUFJFRk1CUjsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIm5vYnJlYWsiKSkgeworCSAgICBvcHQuYnJrY2hhaW4gPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgImJyZWFrIikpIHsKKwkgICAgb3B0LmJya2NoYWluID0gdHJ1ZTsKKwkgICAgb3B0LmZpbGUgPSBOVUxMOworCSAgICBvcHQubWFwcyA9IGZhbHNlOworCSAgICBvcHQuaGFuZCA9IGZhbHNlOworCX0gZWxzZSBpZiAoKChhcmd2W2ldWzBdID09ICdoJyB8fCBhcmd2W2ldWzBdID09ICdmJykKKwkJICAgICYmIGFyZ3ZbaV1bMV0gPT0gJ2QnKQorCQkgICB8fCAhc3RybmNtcChhcmd2W2ldLCAibWJyOiIsIDQpCisJCSAgIHx8ICFzdHJuY21wKGFyZ3ZbaV0sICJtYnI9IiwgNCkKKwkJICAgfHwgIXN0cm5jbXAoYXJndltpXSwgImd1aWQ6IiwgNSkKKwkJICAgfHwgIXN0cm5jbXAoYXJndltpXSwgImd1aWQ9IiwgNSkKKwkJICAgfHwgIXN0cm5jbXAoYXJndltpXSwgImxhYmVsOiIsIDYpCisJCSAgIHx8ICFzdHJuY21wKGFyZ3ZbaV0sICJsYWJlbD0iLCA2KQorCQkgICB8fCAhc3RyY21wKGFyZ3ZbaV0sICJib290IikKKwkJICAgfHwgIXN0cm5jbXAoYXJndltpXSwgImJvb3QsIiwgNSkKKwkJICAgfHwgIXN0cmNtcChhcmd2W2ldLCAiZnMiKSkgeworCSAgICBvcHQuZHJpdmVuYW1lID0gYXJndltpXTsKKwkgICAgaWYgKHN0cm5jbXAoYXJndltpXSwgImxhYmVsIiwgNSkpCisJCXAgPSBzdHJjaHIob3B0LmRyaXZlbmFtZSwgJywnKTsKKwkgICAgZWxzZQorCQlwID0gTlVMTDsKKwkgICAgaWYgKHApIHsKKwkJKnAgPSAnXDAnOworCQlvcHQucGFydGl0aW9uID0gcCArIDE7CisJICAgIH0gZWxzZSBpZiAoYXJndltpICsgMV0gJiYgYXJndltpICsgMV1bMF0gPj0gJzAnCisJCSAgICAmJiBhcmd2W2kgKyAxXVswXSA8PSAnOScpIHsKKwkJb3B0LnBhcnRpdGlvbiA9IGFyZ3ZbKytpXTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHVzYWdlKCk7CisJICAgIGdvdG8gYmFpbDsKKwl9CisgICAgfQorCisgICAgaWYgKG9wdC5ncnViY2ZnICYmICFvcHQuZ3J1YikgeworCWVycm9yKCJncnViY2ZnPTxmaWxlbmFtZT4gbXVzdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggZ3J1Yj08bG9hZGVyPi4iKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKG9wdC5maWxlYnBiICYmICFvcHQuZmlsZSkgeworCWVycm9yKCJPcHRpb24gJ2ZpbGVicGInIHJlcXVpcmVzIGEgZmlsZS4iKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKG9wdC5zYXZlICYmICFvcHQuc2VjdCkgeworCWVycm9yKCJPcHRpb24gJ3NhdmUnIHJlcXVpcmVzIGEgc2VjdG9yLiIpOworCWdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAob3B0LnNldGJwYiAmJiAhb3B0LnNlY3QpIHsKKwllcnJvcigiT3B0aW9uICdzZXRicGInIHJlcXVpcmVzIGEgc2VjdG9yLiIpOworCWdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAob3B0Lm1hcHMgJiYgIW9wdC5zZWN0KSB7CisJZXJyb3IoIk9wdGlvbiAnbWFwcycgcmVxdWlyZXMgYSBzZWN0b3IuIik7CisJZ290byBiYWlsOworICAgIH0KKworICAgIHJldHVybiAwOworYmFpbDoKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTQgc3c9NCBub2V0OiAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvY2hhaW4vb3B0aW9ucy5oIGIvY29tMzIvY2hhaW4vb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTZlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jaGFpbi9vcHRpb25zLmgKQEAgLTAsMCArMSw4MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICogICBDb3B5cmlnaHQgMjAxMCBTaGFvIE1pbGxlcgorICogICBDb3B5cmlnaHQgMjAxMC0yMDEyIE1pY2hhbCBTb2x0eXMKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBDT00zMl9DSEFJTl9PUFRJT05TX0gKKyNkZWZpbmUgQ09NMzJfQ0hBSU5fT1BUSU9OU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9ib290cm0uaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorCitlbnVtIHtISURFX09GRiA9IDAsIEhJREVfT04gPSAxLCBISURFX0VYVCA9IDIsIEhJREVfUkVWID0gNH07CisKK3N0cnVjdCBvcHRpb25zIHsKKyAgICBjb25zdCBjaGFyICpkcml2ZW5hbWU7CisgICAgY29uc3QgY2hhciAqcGFydGl0aW9uOworICAgIGNvbnN0IGNoYXIgKmZpbGU7CisgICAgY29uc3QgY2hhciAqZ3J1YmNmZzsKKyAgICBhZGRyX3QgZnNlZzsKKyAgICBhZGRyX3QgZm9mZjsKKyAgICBhZGRyX3QgZmlwOworICAgIGFkZHJfdCBzc2VnOworICAgIGFkZHJfdCBzb2ZmOworICAgIGFkZHJfdCBzaXA7CisgICAgaW50IGhpZGU7CisgICAgaW50IHBpZmxhZ3M7CisgICAgdWludDE2X3Qga2VlcHB4ZTsKKyAgICBib29sIGlzb2xpbnV4OworICAgIGJvb2wgY21sZHI7CisgICAgYm9vbCBkcm1rOworICAgIGJvb2wgZ3J1YjsKKyAgICBib29sIGdybGRyOworICAgIGJvb2wgbWFwczsKKyAgICBib29sIGhhbmQ7CisgICAgYm9vbCBocHRyOworICAgIGJvb2wgc3dhcDsKKyAgICBib29sIHNlY3Q7CisgICAgYm9vbCBzYXZlOworICAgIGJvb2wgYnNzOworICAgIGJvb2wgc2V0YnBiOworICAgIGJvb2wgZmlsZWJwYjsKKyAgICBib29sIGZpeGNoczsKKyAgICBib29sIHdhcm47CisgICAgYm9vbCBicmtjaGFpbjsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfcm1fcmVncyByZWdzOworfTsKKworZXh0ZXJuIHN0cnVjdCBvcHRpb25zIG9wdDsKKwordm9pZCBvcHRfc2V0X2RlZnModm9pZCk7CitpbnQgb3B0X3BhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKKyNlbmRpZgorCisvKiB2aW06IHNldCB0cz04IHN0cz00IHN3PTQgbm9ldDogKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2NoYWluL3BhcnRpdGVyLmMgYi9jb20zMi9jaGFpbi9wYXJ0aXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NzBkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jaGFpbi9wYXJ0aXRlci5jCkBAIC0wLDAgKzEsNzE0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKiAgIENvcHlyaWdodCAyMDEwIFNoYW8gTWlsbGVyCisgKiAgIENvcHlyaWdodCAyMDEwLTIwMTIgTWljaGFsIFNvbHR5cworICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcGFydGl0ZXIuYworICoKKyAqIFByb3ZpZGVzIGRpc2sgLyBwYXJ0aXRpb24gaXRlcmF0aW9uLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9kaXNrLmg+CisjaW5jbHVkZSAicGFydGl0ZXIuaCIKKyNpbmNsdWRlICJ1dGlsaXR5LmgiCisKKyNkZWZpbmUgb3N0X2lzX2V4dCh0eXBlKSAoKHR5cGUpID09IDB4MDUgfHwgKHR5cGUpID09IDB4MEYgfHwgKHR5cGUpID09IDB4ODUpCisjZGVmaW5lIG9zdF9pc19ub25kYXRhKHR5cGUpIChvc3RfaXNfZXh0KHR5cGUpIHx8ICh0eXBlKSA9PSAweDAwKQorI2RlZmluZSBzYW5lKHMsbCkgKChzKSsobCkgPiAocykpCisKKy8qIHZpcnR1YWwgZm9yd2FyZHMgKi8KKworc3RhdGljIHZvaWQgcGlfZHRvcl8oc3RydWN0IHBhcnRfaXRlciAqKTsKK3N0YXRpYyBpbnQgIHBpX25leHRfKHN0cnVjdCBwYXJ0X2l0ZXIgKik7CitzdGF0aWMgaW50ICBwaV9kb3NfbmV4dChzdHJ1Y3QgcGFydF9pdGVyICopOworc3RhdGljIGludCAgcGlfZ3B0X25leHQoc3RydWN0IHBhcnRfaXRlciAqKTsKKworLyogdnRhYiBhbmQgdHlwZXMgKi8KKworc3RhdGljIHN0cnVjdCBpdGVydHlwZSB0eXBlc1tdID0geworICAgWzBdID0geworCS5kdG9yID0gJnBpX2R0b3JfLAorCS5uZXh0ID0gJnBpX2Rvc19uZXh0LAorfSwgWzFdID0geworCS5kdG9yID0gJnBpX2R0b3JfLAorCS5uZXh0ID0gJnBpX2dwdF9uZXh0LAorfSwgWzJdID0geworCS5kdG9yID0gJnBpX2R0b3JfLAorCS5uZXh0ID0gJnBpX25leHRfLAorfX07CisKK2NvbnN0IHN0cnVjdCBpdGVydHlwZSAqIGNvbnN0IHR5cGVkb3MgPSB0eXBlczsKK2NvbnN0IHN0cnVjdCBpdGVydHlwZSAqIGNvbnN0IHR5cGVncHQgPSB0eXBlcysxOworY29uc3Qgc3RydWN0IGl0ZXJ0eXBlICogY29uc3QgdHlwZXJhdyA9IHR5cGVzKzI7CisKKy8qIHBpX2R0b3JfKCkgLSBjb21tb24vcmF3IGl0ZXJhdG9yIGNsZWFudXAgKi8KK3N0YXRpYyB2b2lkIHBpX2R0b3JfKHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIpCit7CisgICAgLyogc3lzbGludXgncyBmcmVlIGlzIG51bGwgcmVzaWxpZW50ICovCisgICAgZnJlZShpdGVyLT5kYXRhKTsKK30KKworLyogcGlfY3RvcigpIC0gY29tbW9uL3JhdyBpdGVyYXRvciBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIGludCBwaV9jdG9yKHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIsCisJY29uc3Qgc3RydWN0IGRpc2tfaW5mbyAqZGksIGludCBmbGFncworKQoreworICAgIG1lbWNweSgmaXRlci0+ZGksIGRpLCBzaXplb2YgKmRpKTsKKyAgICBpdGVyLT5mbGFncyA9IGZsYWdzOworICAgIGl0ZXItPmluZGV4MCA9IC0xOworICAgIGl0ZXItPmxlbmd0aCA9IGRpLT5sYmFjbnQ7CisKKyAgICBpdGVyLT50eXBlID0gdHlwZXJhdzsKKyAgICByZXR1cm4gMDsKK30KKworLyogcGlfZG9zX2N0b3IoKSAtIE1CUi9FQlIgaXRlcmF0b3Igc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyBpbnQgcGlfZG9zX2N0b3Ioc3RydWN0IHBhcnRfaXRlciAqaXRlciwKKwljb25zdCBzdHJ1Y3QgZGlza19pbmZvICpkaSwgaW50IGZsYWdzLAorCWNvbnN0IHN0cnVjdCBkaXNrX2Rvc19tYnIgKm1icgorKQoreworICAgIGlmIChwaV9jdG9yKGl0ZXIsIGRpLCBmbGFncykpCisJcmV0dXJuIC0xOworCisgICAgaWYgKCEoaXRlci0+ZGF0YSA9IG1hbGxvYyhzaXplb2YgKm1icikpKSB7CisJY3JpdG0oKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgbWVtY3B5KGl0ZXItPmRhdGEsIG1iciwgc2l6ZW9mICptYnIpOworCisgICAgaXRlci0+ZG9zLmJlYnJfaW5kZXgwID0gLTE7CisgICAgaXRlci0+ZG9zLmRpc2tfc2lnID0gbWJyLT5kaXNrX3NpZzsKKworICAgIGl0ZXItPnR5cGUgPSB0eXBlZG9zOworICAgIHJldHVybiAwOworYmFpbDoKKyAgICBwaV9kdG9yXyhpdGVyKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIHBpX2dwdF9jdG9yKCkgLSBHUFQgaXRlcmF0b3Igc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyBpbnQgcGlfZ3B0X2N0b3Ioc3RydWN0IHBhcnRfaXRlciAqaXRlciwKKwljb25zdCBzdHJ1Y3QgZGlza19pbmZvICpkaSwgaW50IGZsYWdzLAorCWNvbnN0IHN0cnVjdCBkaXNrX2dwdF9oZWFkZXIgKmdwdGgsIGNvbnN0IHN0cnVjdCBkaXNrX2dwdF9wYXJ0X2VudHJ5ICpncHRsCispCit7CisgICAgdWludDY0X3Qgc2l6OworCisgICAgaWYgKHBpX2N0b3IoaXRlciwgZGksIGZsYWdzKSkKKwlyZXR1cm4gLTE7CisKKyAgICBzaXogPSAodWludDY0X3QpZ3B0aC0+cGFydF9jb3VudCAqIGdwdGgtPnBhcnRfc2l6ZTsKKworICAgIGlmICghKGl0ZXItPmRhdGEgPSBtYWxsb2MoKHNpemVfdClzaXopKSkgeworCWNyaXRtKCk7CisJZ290byBiYWlsOworICAgIH0KKworICAgIG1lbWNweShpdGVyLT5kYXRhLCBncHRsLCAoc2l6ZV90KXNpeik7CisKKyAgICBpdGVyLT5ncHQucGVfY291bnQgPSAoaW50KWdwdGgtPnBhcnRfY291bnQ7CisgICAgaXRlci0+Z3B0LnBlX3NpemUgPSAoaW50KWdwdGgtPnBhcnRfc2l6ZTsKKyAgICBpdGVyLT5ncHQudWZpcnN0ID0gZ3B0aC0+bGJhX2ZpcnN0X3VzYWJsZTsKKyAgICBpdGVyLT5ncHQudWxhc3QgPSBncHRoLT5sYmFfbGFzdF91c2FibGU7CisKKyAgICBtZW1jcHkoJml0ZXItPmdwdC5kaXNrX2d1aWQsICZncHRoLT5kaXNrX2d1aWQsIHNpemVvZiBncHRoLT5kaXNrX2d1aWQpOworICAgIG1lbWNweSgmaXRlci0+Z3B0LnBhcnRfZ3VpZCwgJmdwdGgtPmRpc2tfZ3VpZCwgc2l6ZW9mIGdwdGgtPmRpc2tfZ3VpZCk7CisKKyAgICBpdGVyLT50eXBlID0gdHlwZWdwdDsKKyAgICByZXR1cm4gMDsKK2JhaWw6CisgICAgcGlfZHRvcl8oaXRlcik7CisgICAgcmV0dXJuIC0xOworfQorCisvKiBMb2dpY2FsIHBhcnRpdGlvbiBtdXN0IGJlIHNhbmUsIG1lYW5pbmc6CisgKiAtIG11c3QgYmUgZGF0YSBvciBlbXB0eQorICogLSBtdXN0IGhhdmUgbm9uLTAgc3RhcnQgYW5kIGxlbmd0aAorICogLSB2YWx1ZXMgbXVzdCBub3Qgd3JhcCBhcm91bmQgMzJiaXQKKyAqIC0gbXVzdCBiZSBpbnNpZGUgY3VycmVudCBFQlIgZnJhbWUKKyAqLworCitzdGF0aWMgaW50IG5vdHNhbmVfbG9naWNhbChjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyKQoreworICAgIGNvbnN0IHN0cnVjdCBkaXNrX2Rvc19wYXJ0X2VudHJ5ICpkcDsKKyAgICB1aW50MzJfdCBlbmRfbG9nOworCisgICAgZHAgPSAoKHN0cnVjdCBkaXNrX2Rvc19tYnIgKilpdGVyLT5kYXRhKS0+dGFibGU7CisKKyAgICBpZiAoIWRwWzBdLm9zdHlwZSkKKwlyZXR1cm4gMDsKKworICAgIGlmIChvc3RfaXNfZXh0KGRwWzBdLm9zdHlwZSkpIHsKKwllcnJvcigiVGhlIDFzdCBFQlIgZW50cnkgbXVzdCBiZSBkYXRhIG9yIGVtcHR5LiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIShpdGVyLT5mbGFncyAmIFBJRl9TVFJJQ1QpKQorCXJldHVybiAwOworCisgICAgZW5kX2xvZyA9IGRwWzBdLnN0YXJ0X2xiYSArIGRwWzBdLmxlbmd0aDsKKworICAgIGlmICghZHBbMF0uc3RhcnRfbGJhIHx8CisJIWRwWzBdLmxlbmd0aCB8fAorCSFzYW5lKGRwWzBdLnN0YXJ0X2xiYSwgZHBbMF0ubGVuZ3RoKSB8fAorCWVuZF9sb2cgPiBpdGVyLT5kb3MubmVicl9zaXopIHsKKworCWVycm9yKCJMb2dpY2FsIHBhcnRpdGlvbiAoaW4gRUJSKSB3aXRoIGludmFsaWQgb2Zmc2V0IGFuZC9vciBsZW5ndGguIik7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBFeHRlbmRlZCBwYXJ0aXRpb24gbXVzdCBiZSBzYW5lLCBtZWFuaW5nOgorICogLSBtdXN0IGJlIGV4dGVuZGVkIG9yIGVtcHR5CisgKiAtIG11c3QgaGF2ZSBub24tMCBzdGFydCBhbmQgbGVuZ3RoCisgKiAtIHZhbHVlcyBtdXN0IG5vdCB3cmFwIGFyb3VuZCAzMmJpdAorICogLSBtdXN0IGJlIGluc2lkZSBiYXNlIEVCUiBmcmFtZQorICovCisKK3N0YXRpYyBpbnQgbm90c2FuZV9leHRlbmRlZChjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyKQoreworICAgIGNvbnN0IHN0cnVjdCBkaXNrX2Rvc19wYXJ0X2VudHJ5ICpkcDsKKyAgICB1aW50MzJfdCBlbmRfZWJyOworCisgICAgZHAgPSAoKHN0cnVjdCBkaXNrX2Rvc19tYnIgKilpdGVyLT5kYXRhKS0+dGFibGU7CisKKyAgICBpZiAoIWRwWzFdLm9zdHlwZSkKKwlyZXR1cm4gMDsKKworICAgIGlmICghb3N0X2lzX25vbmRhdGEoZHBbMV0ub3N0eXBlKSkgeworCWVycm9yKCJUaGUgMm5kIEVCUiBlbnRyeSBtdXN0IGJlIGV4dGVuZGVkIG9yIGVtcHR5LiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIShpdGVyLT5mbGFncyAmIFBJRl9TVFJJQ1QpKQorCXJldHVybiAwOworCisgICAgZW5kX2ViciA9IGRwWzFdLnN0YXJ0X2xiYSArIGRwWzFdLmxlbmd0aDsKKworICAgIGlmICghZHBbMV0uc3RhcnRfbGJhIHx8CisJIWRwWzFdLmxlbmd0aCB8fAorCSFzYW5lKGRwWzFdLnN0YXJ0X2xiYSwgZHBbMV0ubGVuZ3RoKSB8fAorCWVuZF9lYnIgPiBpdGVyLT5kb3MuYmVicl9zaXopIHsKKworCWVycm9yKCJFeHRlbmRlZCBwYXJ0aXRpb24gKEVCUikgd2l0aCBpbnZhbGlkIG9mZnNldCBhbmQvb3IgbGVuZ3RoLiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogUHJpbWFyeSBwYXJ0aXRpb24gbXVzdCBiZSBzYW5lLCBtZWFuaW5nOgorICogLSBtdXN0IGhhdmUgbm9uLTAgc3RhcnQgYW5kIGxlbmd0aAorICogLSB2YWx1ZXMgbXVzdCBub3Qgd3JhcCBhcm91bmQgMzJiaXQKKyAqLworCitzdGF0aWMgaW50IG5vdHNhbmVfcHJpbWFyeShjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyKQoreworICAgIGNvbnN0IHN0cnVjdCBkaXNrX2Rvc19wYXJ0X2VudHJ5ICpkcDsKKyAgICBkcCA9ICgoc3RydWN0IGRpc2tfZG9zX21iciAqKWl0ZXItPmRhdGEpLT50YWJsZSArIGl0ZXItPmluZGV4MDsKKworICAgIGlmICghZHAtPm9zdHlwZSkKKwlyZXR1cm4gMDsKKworICAgIGlmICghKGl0ZXItPmZsYWdzICYgUElGX1NUUklDVCkpCisJcmV0dXJuIDA7CisKKyAgICBpZiAoIWRwLT5zdGFydF9sYmEgfHwKKwkhZHAtPmxlbmd0aCB8fAorCSFzYW5lKGRwLT5zdGFydF9sYmEsIGRwLT5sZW5ndGgpIHx8CisJKChpdGVyLT5mbGFncyAmIFBJRl9TVFJJQ1RFUikgJiYgKGRwLT5zdGFydF9sYmEgKyBkcC0+bGVuZ3RoID4gaXRlci0+ZGkubGJhY250KSkpIHsKKwllcnJvcigiUHJpbWFyeSBwYXJ0aXRpb24gKGluIE1CUikgd2l0aCBpbnZhbGlkIG9mZnNldCBhbmQvb3IgbGVuZ3RoLiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBub3RzYW5lX2dwdChjb25zdCBzdHJ1Y3QgcGFydF9pdGVyICppdGVyKQoreworICAgIGNvbnN0IHN0cnVjdCBkaXNrX2dwdF9wYXJ0X2VudHJ5ICpncDsKKyAgICBncCA9IChjb25zdCBzdHJ1Y3QgZGlza19ncHRfcGFydF9lbnRyeSAqKQorCShpdGVyLT5kYXRhICsgaXRlci0+aW5kZXgwICogaXRlci0+Z3B0LnBlX3NpemUpOworCisgICAgaWYgKGd1aWRfaXMwKCZncC0+dHlwZSkpCisJcmV0dXJuIDA7CisKKyAgICBpZiAoIShpdGVyLT5mbGFncyAmIFBJRl9TVFJJQ1QpKQorCXJldHVybiAwOworCisgICAgaWYgKGdwLT5sYmFfZmlyc3QgPCBpdGVyLT5ncHQudWZpcnN0IHx8CisJZ3AtPmxiYV9sYXN0ID4gaXRlci0+Z3B0LnVsYXN0KSB7CisJZXJyb3IoIkxCQSBzZWN0b3JzIG9mIEdQVCBwYXJ0aXRpb24gYXJlIGJleW9uZCB0aGUgcmFuZ2UgYWxsb3dlZCBpbiBHUFQgaGVhZGVyLiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb3NfbmV4dF9tYnIoc3RydWN0IHBhcnRfaXRlciAqaXRlciwgdWludDMyX3QgKmxiYSwKKwkJCSAgICBzdHJ1Y3QgZGlza19kb3NfcGFydF9lbnRyeSAqKl9kcCkKK3sKKyAgICBzdHJ1Y3QgZGlza19kb3NfcGFydF9lbnRyeSAqZHA7CisKKyAgICB3aGlsZSAoKytpdGVyLT5pbmRleDAgPCA0KSB7CisJZHAgPSAoKHN0cnVjdCBkaXNrX2Rvc19tYnIgKilpdGVyLT5kYXRhKS0+dGFibGUgKyBpdGVyLT5pbmRleDA7CisKKwlpZiAobm90c2FuZV9wcmltYXJ5KGl0ZXIpKSB7CisJICAgIGl0ZXItPnN0YXR1cyA9IFBJX0lOU0FORTsKKwkgICAgcmV0dXJuIC0xOworCX0KKworCWlmIChvc3RfaXNfZXh0KGRwLT5vc3R5cGUpKSB7CisJICAgIGlmIChpdGVyLT5kb3MuYmVicl9pbmRleDAgPj0gMCkgeworCQllcnJvcigiTW9yZSB0aGFuIDEgZXh0ZW5kZWQgcGFydGl0aW9uLiIpOworCQlpdGVyLT5zdGF0dXMgPSBQSV9JTlNBTkU7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICAvKiByZWNvcmQgYmFzZSBFQlIgaW5kZXggKi8KKwkgICAgaXRlci0+ZG9zLmJlYnJfaW5kZXgwID0gaXRlci0+aW5kZXgwOworCX0KKwlpZiAoIW9zdF9pc19ub25kYXRhKGRwLT5vc3R5cGUpIHx8IChpdGVyLT5mbGFncyAmIFBJRl9TVEVQQUxMKSkgeworCSAgICAqbGJhID0gZHAtPnN0YXJ0X2xiYTsKKwkgICAgKl9kcCA9IGRwOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJlcF9iYXNlX2VicihzdHJ1Y3QgcGFydF9pdGVyICppdGVyKQoreworICAgIHN0cnVjdCBkaXNrX2Rvc19wYXJ0X2VudHJ5ICpkcDsKKworICAgIGlmIChpdGVyLT5kb3MuYmVicl9pbmRleDAgPCAwKQkvKiBpZiB3ZSBkb24ndCBoYXZlIGJhc2UgZXh0ZW5kZWQgcGFydGl0aW9uIGF0IGFsbCAqLworCXJldHVybiAtMTsKKyAgICBlbHNlIGlmICghaXRlci0+ZG9zLmJlYnJfbGJhKSB7IC8qIGlmIG5vdCBpbml0aWFsaXplZCB5ZXQgKi8KKwlkcCA9ICgoc3RydWN0IGRpc2tfZG9zX21iciAqKWl0ZXItPmRhdGEpLT50YWJsZSArIGl0ZXItPmRvcy5iZWJyX2luZGV4MDsKKworCWl0ZXItPmRvcy5iZWJyX2xiYSA9IGRwLT5zdGFydF9sYmE7CisJaXRlci0+ZG9zLmJlYnJfc2l6ID0gZHAtPmxlbmd0aDsKKworCWl0ZXItPmRvcy5uZWJyX2xiYSA9IGRwLT5zdGFydF9sYmE7CisJaXRlci0+ZG9zLm5lYnJfc2l6ID0gZHAtPmxlbmd0aDsKKworCWl0ZXItPmluZGV4MC0tOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb3NfbmV4dF9lYnIoc3RydWN0IHBhcnRfaXRlciAqaXRlciwgdWludDMyX3QgKmxiYSwKKwkJCSAgICBzdHJ1Y3QgZGlza19kb3NfcGFydF9lbnRyeSAqKl9kcCkKK3sKKyAgICBzdHJ1Y3QgZGlza19kb3NfcGFydF9lbnRyeSAqZHA7CisKKyAgICBpZiAocHJlcF9iYXNlX2VicihpdGVyKSA8IDApIHsKKwlpdGVyLT5zdGF0dXMgPSBQSV9ET05FOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICB3aGlsZSAoKytpdGVyLT5pbmRleDAgPCAxMDI0ICYmIGl0ZXItPmRvcy5uZWJyX2xiYSkgeworCWZyZWUoaXRlci0+ZGF0YSk7CisJaWYgKCEoaXRlci0+ZGF0YSA9CisJCSAgICBkaXNrX3JlYWRfc2VjdG9ycygmaXRlci0+ZGksIGl0ZXItPmRvcy5uZWJyX2xiYSwgMSkpKSB7CisJICAgIGVycm9yKCJDb3VsZG4ndCBsb2FkIEVCUi4iKTsKKwkgICAgaXRlci0+c3RhdHVzID0gUElfRVJSTE9BRDsKKwkgICAgcmV0dXJuIC0xOworCX0KKworCS8qIGNoZWNrIHNhbml0eSBvZiBsb2FkZWQgZGF0YSAqLworCWlmIChub3RzYW5lX2xvZ2ljYWwoaXRlcikgfHwgbm90c2FuZV9leHRlbmRlZChpdGVyKSkgeworCSAgICBpdGVyLT5zdGF0dXMgPSBQSV9JTlNBTkU7CisJICAgIHJldHVybiAtMTsKKwl9CisKKwlkcCA9ICgoc3RydWN0IGRpc2tfZG9zX21iciAqKWl0ZXItPmRhdGEpLT50YWJsZTsKKworCWl0ZXItPmRvcy5jZWJyX2xiYSA9IGl0ZXItPmRvcy5uZWJyX2xiYTsKKwlpdGVyLT5kb3MuY2Vicl9zaXogPSBpdGVyLT5kb3MubmVicl9zaXo7CisKKwkvKiBzZXR1cCBuZXh0IGZyYW1lIHZhbHVlcyAqLworCWlmIChkcFsxXS5vc3R5cGUpIHsKKwkgICAgaXRlci0+ZG9zLm5lYnJfbGJhID0gaXRlci0+ZG9zLmJlYnJfbGJhICsgZHBbMV0uc3RhcnRfbGJhOworCSAgICBpdGVyLT5kb3MubmVicl9zaXogPSBkcFsxXS5sZW5ndGg7CisJfSBlbHNlIHsKKwkgICAgaXRlci0+ZG9zLm5lYnJfbGJhID0gMDsKKwkgICAgaXRlci0+ZG9zLm5lYnJfc2l6ID0gMDsKKwl9CisKKwlpZiAoIWRwWzBdLm9zdHlwZSkKKwkgICAgaXRlci0+ZG9zLmxvZ3NraXBjbnQrKzsKKworCWlmIChkcFswXS5vc3R5cGUgfHwgKGl0ZXItPmZsYWdzICYgUElGX1NURVBBTEwpKSB7CisJICAgICpsYmEgPSBkcFswXS5zdGFydF9sYmEgPyBpdGVyLT5kb3MuY2Vicl9sYmEgKyBkcFswXS5zdGFydF9sYmEgOiAwOworCSAgICAqX2RwID0gZHA7CisJICAgIHJldHVybiAwOworCX0KKwkvKgorCSAqIFRoaXMgd2F5IGl0J3MgcG9zc2libGUgdG8gY29udGludWUsIGlmIHNvbWUgY3Jhenkgc29mdCBsZWZ0IGEgImhvbGUiCisJICogLSBFQlIgd2l0aCBhIHZhbGlkIGV4dGVuZGVkIHBhcnRpdGlvbiB3aXRob3V0IGEgbG9naWNhbCBvbmUuIEluCisJICogc3VjaCBjYXNlLCBsaW51eCB3aWxsIG5vdCByZXNlcnZlIGEgbnVtYmVyIGZvciBzdWNoIGhvbGUgLSBzbyB3ZQorCSAqIGRvbid0IGluY3JlYXNlIGluZGV4MC4gSWYgUElGX1NURVBBTEwgZmxhZyBpcyBzZXQsIHdlIHdpbGwgbmV2ZXIKKwkgKiByZWFjaCB0aGlzIHBsYWNlLgorCSAqLworICAgIH0KKyAgICBpdGVyLT5zdGF0dXMgPSBQSV9ET05FOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZ3B0X2NvbnZfbGFiZWwoc3RydWN0IHBhcnRfaXRlciAqaXRlcikKK3sKKyAgICBjb25zdCBzdHJ1Y3QgZGlza19ncHRfcGFydF9lbnRyeSAqZ3A7CisgICAgY29uc3QgaW50MTZfdCAqb3JpZ19sYWI7CisKKyAgICBncCA9IChjb25zdCBzdHJ1Y3QgZGlza19ncHRfcGFydF9lbnRyeSAqKQorCShpdGVyLT5kYXRhICsgaXRlci0+aW5kZXgwICogaXRlci0+Z3B0LnBlX3NpemUpOworICAgIG9yaWdfbGFiID0gKGNvbnN0IGludDE2X3QgKilncC0+bmFtZTsKKworICAgIC8qIGNhdmVhdDogdGhpcyBpcyB2ZXJ5IGNydWRlIGNvbnZlcnNpb24gKi8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBJX0dQVExBQlNJWkUvMjsgaSsrKSB7CisJaXRlci0+Z3B0LnBhcnRfbGFiZWxbaV0gPSAoY2hhcilvcmlnX2xhYltpXTsKKyAgICB9CisgICAgaXRlci0+Z3B0LnBhcnRfbGFiZWxbUElfR1BUTEFCU0laRS8yXSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX2NyYyh1aW50MzJfdCBjcmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgaW50IHNpeikKK3sKKyAgICByZXR1cm4gY3JjID09IGNyYzMyKGNyYzMyKDAsIE5VTEwsIDApLCBidWYsIHNpeik7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRfY3JjX2hkcih2b2lkICpidWYpCit7CisgICAgc3RydWN0IGRpc2tfZ3B0X2hlYWRlciAqZ2ggPSBidWY7CisgICAgdWludDMyX3QgY3JjID0gZ2gtPmNoa3N1bTsKKyAgICBpbnQgdmFsaWQ7CisKKyAgICBnaC0+Y2hrc3VtID0gMDsKKyAgICB2YWxpZCA9IGNyYyA9PSBjcmMzMihjcmMzMigwLCBOVUxMLCAwKSwgYnVmLCBnaC0+aGRyX3NpemUpOworICAgIGdoLT5jaGtzdW0gPSBjcmM7CisgICAgcmV0dXJuIHZhbGlkOworfQorCitzdGF0aWMgaW50IHBpX25leHRfKHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIpCit7CisgICAgaXRlci0+c3RhdHVzID0gUElfRE9ORTsKKyAgICByZXR1cm4gaXRlci0+c3RhdHVzOworfQorCitzdGF0aWMgaW50IHBpX2Rvc19uZXh0KHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIpCit7CisgICAgdWludDMyX3QgYWJzX2xiYSA9IDA7CisgICAgc3RydWN0IGRpc2tfZG9zX3BhcnRfZW50cnkgKmRvc19wYXJ0ID0gTlVMTDsKKworICAgIGlmIChpdGVyLT5zdGF0dXMpCisJcmV0dXJuIGl0ZXItPnN0YXR1czsKKworICAgIC8qIGxvb2sgZm9yIHByaW1hcnkgcGFydGl0aW9ucyAqLworICAgIGlmIChpdGVyLT5pbmRleDAgPCA0ICYmCisJICAgIGRvc19uZXh0X21icihpdGVyLCAmYWJzX2xiYSwgJmRvc19wYXJ0KSA8IDApCisJcmV0dXJuIGl0ZXItPnN0YXR1czsKKworICAgIC8qIGxvb2sgZm9yIGxvZ2ljYWwgcGFydGl0aW9ucyAqLworICAgIGlmIChpdGVyLT5pbmRleDAgPj0gNCAmJgorCSAgICBkb3NfbmV4dF9lYnIoaXRlciwgJmFic19sYmEsICZkb3NfcGFydCkgPCAwKQorCXJldHVybiBpdGVyLT5zdGF0dXM7CisKKyAgICAvKgorICAgICAqIG5vdGUgc3BlY2lhbCBpbmRleCBoYW5kbGluZzoKKyAgICAgKiBpbiBjYXNlIFBJRl9TVEVQQUxMIGlzIHNldCAtIHRoaXMgbWFrZXMgdGhlIGluZGV4IGNvbnNpc3RlbnQgd2l0aAorICAgICAqIG5vbi1QSUZfU1RFUEFMTCBpdGVyYXRvcnMKKyAgICAgKi8KKworICAgIGlmICghZG9zX3BhcnQtPm9zdHlwZSkKKwlpdGVyLT5pbmRleCA9IC0xOworICAgIGVsc2UKKwlpdGVyLT5pbmRleCA9IGl0ZXItPmluZGV4MCArIDEgLSBpdGVyLT5kb3MubG9nc2tpcGNudDsKKyAgICBpdGVyLT5hYnNfbGJhID0gYWJzX2xiYTsKKyAgICBpdGVyLT5sZW5ndGggPSBkb3NfcGFydC0+bGVuZ3RoOworICAgIGl0ZXItPnJlY29yZCA9IChjaGFyICopZG9zX3BhcnQ7CisKKyNpZmRlZiBERUJVRworICAgIGRpc2tfZG9zX3BhcnRfZHVtcChkb3NfcGFydCk7CisjZW5kaWYKKworICAgIHJldHVybiBpdGVyLT5zdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgcGlfZ3B0X25leHQoc3RydWN0IHBhcnRfaXRlciAqaXRlcikKK3sKKyAgICBjb25zdCBzdHJ1Y3QgZGlza19ncHRfcGFydF9lbnRyeSAqZ3B0X3BhcnQgPSBOVUxMOworCisgICAgaWYgKGl0ZXItPnN0YXR1cykKKwlyZXR1cm4gaXRlci0+c3RhdHVzOworCisgICAgd2hpbGUgKCsraXRlci0+aW5kZXgwIDwgaXRlci0+Z3B0LnBlX2NvdW50KSB7CisJZ3B0X3BhcnQgPSAoY29uc3Qgc3RydWN0IGRpc2tfZ3B0X3BhcnRfZW50cnkgKikKKwkgICAgKGl0ZXItPmRhdGEgKyBpdGVyLT5pbmRleDAgKiBpdGVyLT5ncHQucGVfc2l6ZSk7CisKKwlpZiAobm90c2FuZV9ncHQoaXRlcikpIHsKKwkgICAgaXRlci0+c3RhdHVzID0gUElfSU5TQU5FOworCSAgICByZXR1cm4gaXRlci0+c3RhdHVzOworCX0KKworCWlmICghZ3VpZF9pczAoJmdwdF9wYXJ0LT50eXBlKSB8fCAoaXRlci0+ZmxhZ3MgJiBQSUZfU1RFUEFMTCkpCisJICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBubyBtb3JlIHBhcnRpdGlvbnMgPyAqLworICAgIGlmIChpdGVyLT5pbmRleDAgPT0gaXRlci0+Z3B0LnBlX2NvdW50KSB7CisJaXRlci0+c3RhdHVzID0gUElfRE9ORTsKKwlyZXR1cm4gaXRlci0+c3RhdHVzOworICAgIH0KKyAgICAvKiBncHRfcGFydCBpcyBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIGhlcmUgKi8KKyAgICBpdGVyLT5pbmRleCA9IGl0ZXItPmluZGV4MCArIDE7CisgICAgaXRlci0+YWJzX2xiYSA9IGdwdF9wYXJ0LT5sYmFfZmlyc3Q7CisgICAgaXRlci0+bGVuZ3RoID0gZ3B0X3BhcnQtPmxiYV9sYXN0IC0gZ3B0X3BhcnQtPmxiYV9maXJzdCArIDE7CisgICAgaXRlci0+cmVjb3JkID0gKGNoYXIgKilncHRfcGFydDsKKyAgICBtZW1jcHkoJml0ZXItPmdwdC5wYXJ0X2d1aWQsICZncHRfcGFydC0+dWlkLCBzaXplb2Yoc3RydWN0IGd1aWQpKTsKKyAgICBncHRfY29udl9sYWJlbChpdGVyKTsKKworI2lmZGVmIERFQlVHCisgICAgZGlza19ncHRfcGFydF9kdW1wKGdwdF9wYXJ0KTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGl0ZXItPnN0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBwYXJ0X2l0ZXIgKnBpX2FsbG9jKHZvaWQpCit7CisgICAgc3RydWN0IHBhcnRfaXRlciAqaXRlcjsKKyAgICBpZiAoIShpdGVyID0gbWFsbG9jKHNpemVvZiAqaXRlcikpKQorCWNyaXRtKCk7CisgICAgZWxzZQorCW1lbXNldChpdGVyLCAwLCBzaXplb2YgKml0ZXIpOworICAgIHJldHVybiBpdGVyOworfQorCisvKiBwaV9kZWwoKSAtIGRlbGV0ZSBpdGVyYXRvciAqLwordm9pZCBwaV9kZWwoc3RydWN0IHBhcnRfaXRlciAqKl9pdGVyKQoreworICAgIGlmKCFfaXRlciB8fCAhKl9pdGVyKQorCXJldHVybjsKKyAgICBwaV9kdG9yKCpfaXRlcik7CisgICAgZnJlZSgqX2l0ZXIpOworICAgICpfaXRlciA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHRyeV9ncHRfd2UoY29uc3QgY2hhciAqc3RyLCBpbnQgc2VjKQoreworICAgIGlmIChzZWMpCisJZXJyb3Ioc3RyKTsKKyAgICBlbHNlCisJd2FybihzdHIpOworfQorCitzdGF0aWMgc3RydWN0IGRpc2tfZ3B0X2hlYWRlciAqdHJ5X2dwdF9oZHIoY29uc3Qgc3RydWN0IGRpc2tfaW5mbyAqZGksIGludCBzZWMpCit7CisgICAgY29uc3QgY2hhciAqZGVzYyA9IHNlYyA/ICJiYWNrdXAiIDogInByaW1hcnkiOworICAgIHVpbnQ2NF90IGdwdF9jdXIgPSBzZWMgPyBkaS0+bGJhY250IC0gMSA6IDE7CisgICAgc3RydWN0IGRpc2tfZ3B0X2hlYWRlciAqZ3B0aDsKKyAgICBjaGFyIGVycmJ1Zls2NF07CisKKyAgICBncHRoID0gZGlza19yZWFkX3NlY3RvcnMoZGksIGdwdF9jdXIsIDEpOworICAgIGlmICghZ3B0aCkgeworCXNwcmludGYoZXJyYnVmLCAiVW5hYmxlIHRvIHJlYWQgJXMgR1BUIGhlYWRlci4iLCBkZXNjKTsKKwl0cnlfZ3B0X3dlKGVycmJ1Ziwgc2VjKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYoIXZhbGlkX2NyY19oZHIoZ3B0aCkpIHsKKwlzcHJpbnRmKGVycmJ1ZiwgIkludmFsaWQgY2hlY2tzdW0gb2YgJXMgR1BUIGhlYWRlci4iLCBkZXNjKTsKKwl0cnlfZ3B0X3dlKGVycmJ1Ziwgc2VjKTsKKwlmcmVlKGdwdGgpOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZ3B0aDsKK30KKworc3RhdGljIHN0cnVjdCBkaXNrX2dwdF9wYXJ0X2VudHJ5ICp0cnlfZ3B0X2xpc3QoY29uc3Qgc3RydWN0IGRpc2tfaW5mbyAqZGksIGNvbnN0IHN0cnVjdCBkaXNrX2dwdF9oZWFkZXIgKmdwdGgsIGludCBhbHQpCit7CisgICAgaW50IHByaSA9IGdwdGgtPmxiYV9jdXIgPCBncHRoLT5sYmFfYWx0OworICAgIGNvbnN0IGNoYXIgKmRlc2MgPSBhbHQgPyAiYWx0ZXJuYXRpdmUiIDogIm1haW4iOworICAgIHN0cnVjdCBkaXNrX2dwdF9wYXJ0X2VudHJ5ICpncHRsOworICAgIGNoYXIgZXJyYnVmWzY0XTsKKyAgICB1aW50NjRfdCBncHRfbHNpejsJICAgIC8qIHNpemUgb2YgR1BUIHBhcnRpdGlvbiBsaXN0IGluIGJ5dGVzICovCisgICAgdWludDY0X3QgZ3B0X2xjbnQ7CSAgICAvKiBzaXplIG9mIEdQVCBwYXJ0aXRpb24gaW4gc2VjdG9ycyAqLworICAgIHVpbnQ2NF90IGdwdF9sb2ZmOwkgICAgLyogb2Zmc2V0IHRvIEdQVCBwYXJ0aXRpb24gbGlzdCBpbiBzZWN0b3JzICovCisKKyAgICBncHRfbHNpeiA9ICh1aW50NjRfdClncHRoLT5wYXJ0X3NpemUgKiBncHRoLT5wYXJ0X2NvdW50OworICAgIGdwdF9sY250ID0gKGdwdF9sc2l6ICsgZGktPmJwcyAtIDEpIC8gZGktPmJwczsKKyAgICBpZiAoIWFsdCkgeworCS8qIHByZWZlciBoZWFkZXIgdmFsdWUgZm9yIHBhcnRpdGlvbiB0YWJsZSBpZiBub3QgYXNraW5nIGZvciBhbHRlcm5hdGl2ZSAqLworCWdwdF9sb2ZmID0gZ3B0aC0+bGJhX3RhYmxlOworICAgIH0gZWxzZSB7CisJLyogdHJ5IHRvIHJlYWQgYWx0ZXJuYXRpdmUsIHdlIGhhdmUgdG8gY2FsY3VsYXRlIGl0cyBwb3NpdGlvbiAqLworCWlmICghcHJpKQorCSAgICBncHRfbG9mZiA9IGdwdGgtPmxiYV9hbHQgKyAxOworCWVsc2UKKwkgICAgZ3B0X2xvZmYgPSBncHRoLT5sYmFfYWx0IC0gZ3B0X2xjbnQ7CisgICAgfQorCisgICAgZ3B0bCA9IGRpc2tfcmVhZF9zZWN0b3JzKGRpLCBncHRfbG9mZiwgZ3B0X2xjbnQpOworICAgIGlmICghZ3B0bCkgeworCXNwcmludGYoZXJyYnVmLCAiVW5hYmxlIHRvIHJlYWQgJXMgR1BUIHBhcnRpdGlvbiBsaXN0LiIsIGRlc2MpOworCXRyeV9ncHRfd2UoZXJyYnVmLCBhbHQpOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIXZhbGlkX2NyYyhncHRoLT50YWJsZV9jaGtzdW0sIChjb25zdCB1aW50OF90ICopZ3B0bCwgZ3B0X2xzaXopKSB7CisJc3ByaW50ZihlcnJidWYsICJJbnZhbGlkIGNoZWNrc3VtIG9mICVzIEdQVCBwYXJ0aXRpb24gbGlzdC4iLCBkZXNjKTsKKwl0cnlfZ3B0X3dlKGVycmJ1ZiwgYWx0KTsKKwlmcmVlKGdwdGwpOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZ3B0bDsKK30KKworc3RhdGljIGludCBub3RzYW5lX2dwdF9oZHIoY29uc3Qgc3RydWN0IGRpc2tfaW5mbyAqZGksIGNvbnN0IHN0cnVjdCBkaXNrX2dwdF9oZWFkZXIgKmdwdGgsIGludCBmbGFncykKK3sKKyAgICB1aW50NjRfdCBncHRfbG9mZjsJICAgIC8qIG9mZnNldCB0byBHUFQgcGFydGl0aW9uIGxpc3QgaW4gc2VjdG9ycyAqLworICAgIHVpbnQ2NF90IGdwdF9sc2l6OwkgICAgLyogc2l6ZSBvZiBHUFQgcGFydGl0aW9uIGxpc3QgaW4gYnl0ZXMgKi8KKyAgICB1aW50NjRfdCBncHRfbGNudDsJICAgIC8qIHNpemUgb2YgR1BUIHBhcnRpdGlvbiBpbiBzZWN0b3JzICovCisgICAgdWludDY0X3QgZ3B0X3NlYzsJICAgIC8qIHNlY29uZGFyeSBncHQgaGVhZGVyICovCisKKyAgICBpZiAoIShmbGFncyAmIFBJRl9TVFJJQ1QpKQorCXJldHVybiAwOworCisgICAgaWYgKGdwdGgtPmxiYV9hbHQgPCBncHRoLT5sYmFfY3VyKQorCWdwdF9zZWMgPSBncHRoLT5sYmFfY3VyOworICAgIGVsc2UKKwlncHRfc2VjID0gZ3B0aC0+bGJhX2FsdDsKKyAgICBncHRfbG9mZiA9IGdwdGgtPmxiYV90YWJsZTsKKyAgICBncHRfbHNpeiA9ICh1aW50NjRfdClncHRoLT5wYXJ0X3NpemUgKiBncHRoLT5wYXJ0X2NvdW50OworICAgIGdwdF9sY250ID0gKGdwdF9sc2l6ICsgZGktPmJwcyAtIDEpIC8gZGktPmJwczsKKworICAgIC8qCisgICAgICogZGlza19yZWFkX3NlY3RvcnMgYWxsb3dzIHJlYWRpbmcgb2YgbWF4IDI1NSBzZWN0b3JzLCBzbyB3ZSB1c2UKKyAgICAgKiBpdCBhcyBhIHNhbml0eSBjaGVjayBiYXNlLiBFRkkgZG9lc24ndCBzcGVjaWZ5IG1heCAoQUZBSUspLgorICAgICAqLworICAgIGlmIChncHRfbG9mZiA8IDIgfHwgIWdwdF9sc2l6IHx8IGdwdF9sY250ID4gMjU1dSB8fAorCSAgICBncHRoLT5sYmFfZmlyc3RfdXNhYmxlID4gZ3B0aC0+bGJhX2xhc3RfdXNhYmxlIHx8CisJICAgICFzYW5lKGdwdF9sb2ZmLCBncHRfbGNudCkgfHwKKwkgICAgKGdwdF9sb2ZmICsgZ3B0X2xjbnQgPiBncHRoLT5sYmFfZmlyc3RfdXNhYmxlICYmIGdwdF9sb2ZmIDw9IGdwdGgtPmxiYV9sYXN0X3VzYWJsZSkgfHwKKwkgICAgIGdwdF9sb2ZmICsgZ3B0X2xjbnQgPiBncHRfc2VjIHx8CisJICAgICgoZmxhZ3MgJiBQSUZfU1RSSUNURVIpICYmIChncHRfc2VjID49IGRpLT5sYmFjbnQpKSB8fAorCSAgICBncHRoLT5wYXJ0X3NpemUgPCBzaXplb2Yoc3RydWN0IGRpc2tfZ3B0X3BhcnRfZW50cnkpKQorCXJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCisvKiBwaV9iZWdpbigpIC0gdmFsaWRhdGUgYW5kIGFuZCBnZXQgcHJvcGVyIGl0ZXJhdG9yIGZvciBhIGRpc2sgZGVzY3JpYmVkIGJ5IGRpICovCitzdHJ1Y3QgcGFydF9pdGVyICpwaV9iZWdpbihjb25zdCBzdHJ1Y3QgZGlza19pbmZvICpkaSwgaW50IGZsYWdzKQoreworICAgIGludCBpc2dwdCA9IDAsIHJldCA9IC0xOworICAgIHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXI7CisgICAgc3RydWN0IGRpc2tfZG9zX21iciAqbWJyID0gTlVMTDsKKyAgICBzdHJ1Y3QgZGlza19ncHRfaGVhZGVyICpncHRoID0gTlVMTDsKKyAgICBzdHJ1Y3QgZGlza19ncHRfcGFydF9lbnRyeSAqZ3B0bCA9IE5VTEw7CisKKyAgICAvKiBQcmVhbGxvY2F0ZSBpdGVyYXRvciAqLworICAgIGlmICghKGl0ZXIgPSBwaV9hbGxvYygpKSkKKwlnb3RvIG91dDsKKworICAgIC8qIFJlYWQgTUJSICovCisgICAgaWYgKCEobWJyID0gZGlza19yZWFkX3NlY3RvcnMoZGksIDAsIDEpKSkgeworCWVycm9yKCJVbmFibGUgdG8gcmVhZCB0aGUgZmlyc3QgZGlzayBzZWN0b3IuIik7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIE1CUiBtYWdpYyAqLworICAgIGlmIChtYnItPnNpZyAhPSBkaXNrX21icl9zaWdfbWFnaWMpIHsKKwl3YXJuKCJObyBNQlIgbWFnaWMsIHRyZWF0aW5nIGRpc2sgYXMgcmF3LiIpOworCS8qIGxvb2tzIGxpa2UgUkFXICovCisJcmV0ID0gcGlfY3RvcihpdGVyLCBkaSwgZmxhZ3MpOworCWdvdG8gb3V0OworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBHUFQgcHJvdGVjdGl2ZSBNQlIgKi8KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7IGkrKykKKwlpc2dwdCB8PSAobWJyLT50YWJsZVtpXS5vc3R5cGUgPT0gMHhFRSk7CisgICAgaXNncHQgPSBpc2dwdCAmJiAhKGZsYWdzICYgUElGX1BSRUZNQlIpOworCisgICAgLyogVHJ5IHRvIHJlYWQgR1BUIGhlYWRlciAqLworICAgIGlmIChpc2dwdCkgeworCWdwdGggPSB0cnlfZ3B0X2hkcihkaSwgMCk7CisJaWYgKCFncHRoKQorCSAgICAvKgorCSAgICAgKiB0aGlzIHJlYWQgbWlnaHQgZmFpbCBpZiBiaW9zIHJlcG9ydHMgZGlmZmVyZW50IGRpc2sgc2l6ZSAoZGlmZmVyZW50IHZtL3BjKQorCSAgICAgKiBub3QgbXVjaCB3ZSBjYW4gZG8gaGVyZSB0byBhdm9pZCBpdAorCSAgICAgKi8KKwkgICAgZ3B0aCA9IHRyeV9ncHRfaGRyKGRpLCAxKTsKKwlpZiAoIWdwdGgpCisJICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChncHRoICYmIGdwdGgtPnJldi51aW50MzIgPT0gMHgwMDAxMDAwMCAmJgorCSAgICAhbWVtY21wKGdwdGgtPnNpZywgZGlza19ncHRfc2lnX21hZ2ljLCBzaXplb2YgZ3B0aC0+c2lnKSkgeworCS8qIGxvb2tzIGxpa2UgR1BUIHYxLjAgKi8KKyNpZmRlZiBERUJVRworCWRwcmludGYoIkxvb2tzIGxpa2UgYSBHUFQgdjEuMCBkaXNrLlxuIik7CisJZGlza19ncHRfaGVhZGVyX2R1bXAoZ3B0aCk7CisjZW5kaWYKKwlpZiAobm90c2FuZV9ncHRfaGRyKGRpLCBncHRoLCBmbGFncykpIHsKKwkgICAgZXJyb3IoIkdQVCBoZWFkZXIgdmFsdWVzIGFyZSBjb3JydXB0ZWQuIik7CisJICAgIGdvdG8gb3V0OworCX0KKworCWdwdGwgPSB0cnlfZ3B0X2xpc3QoZGksIGdwdGgsIDApOworCWlmICghZ3B0bCkKKwkgICAgZ3B0bCA9IHRyeV9ncHRfbGlzdChkaSwgZ3B0aCwgMSk7CisJaWYgKCFncHRsKQorCSAgICBnb3RvIG91dDsKKworCS8qIGxvb2tzIGxpa2UgR1BUICovCisJcmV0ID0gcGlfZ3B0X2N0b3IoaXRlciwgZGksIGZsYWdzLCBncHRoLCBncHRsKTsKKyAgICB9IGVsc2UgeworCS8qIGxvb2tzIGxpa2UgTUJSICovCisJcmV0ID0gcGlfZG9zX2N0b3IoaXRlciwgZGksIGZsYWdzLCBtYnIpOworICAgIH0KK291dDoKKyAgICBpZiAocmV0IDwgMCkgeworCWZyZWUoaXRlcik7CisJaXRlciA9IE5VTEw7CisgICAgfQorICAgIGZyZWUobWJyKTsKKyAgICBmcmVlKGdwdGgpOworICAgIGZyZWUoZ3B0bCk7CisKKyAgICByZXR1cm4gaXRlcjsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9NCBzdz00IG5vZXQ6ICovCmRpZmYgLS1naXQgYS9jb20zMi9jaGFpbi9wYXJ0aXRlci5oIGIvY29tMzIvY2hhaW4vcGFydGl0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmMwZTQyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY2hhaW4vcGFydGl0ZXIuaApAQCAtMCwwICsxLDExOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICogICBDb3B5cmlnaHQgMjAxMCBTaGFvIE1pbGxlcgorICogICBDb3B5cmlnaHQgMjAxMC0yMDEyIE1pY2hhbCBTb2x0eXMKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHBhcnRpdGVyLmgKKyAqCisgKiBQcm92aWRlcyBkaXNrIC8gcGFydGl0aW9uIGl0ZXJhdGlvbi4KKyAqLworCisjaWZuZGVmIENPTTMyX0NIQUlOX1BBUlRJVEVSX0gKKyNkZWZpbmUgQ09NMzJfQ0hBSU5fUEFSVElURVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvZGlzay5oPgorCisvKiBzdGF0dXMgKi8KKworZW51bSB7UElfRVJSTE9BRCA9IC0zMSwgUElfSU5TQU5FLCBQSV9PSyA9IDAsIFBJX0RPTkV9OworCisvKiBmbGFncyAqLworCitlbnVtIHtQSUZfU1RFUEFMTCA9IDEsIFBJRl9QUkVGTUJSID0gMiwgUElGX1NUUklDVCA9IDQsIFBJRl9TVFJJQ1RFUiA9IDh9OworCitzdHJ1Y3QgaXRlcnR5cGU7CitzdHJ1Y3QgcGFydF9pdGVyOworCitzdHJ1Y3QgaXRlcnR5cGUgeworCXZvaWQgKCpkdG9yKShzdHJ1Y3QgcGFydF9pdGVyICopOworCWludCAgKCpuZXh0KShzdHJ1Y3QgcGFydF9pdGVyICopOworfTsKKworI2RlZmluZSBQSV9HUFRMQUJTSVpFICgoaW50KXNpemVvZigoKHN0cnVjdCBkaXNrX2dwdF9wYXJ0X2VudHJ5ICopMCktPm5hbWUpKQorCitzdHJ1Y3QgcGFydF9pdGVyIHsKKyAgICBjb25zdCBzdHJ1Y3QgaXRlcnR5cGUgKnR5cGU7CisgICAgY2hhciAqZGF0YTsKKyAgICBjaGFyICpyZWNvcmQ7CisgICAgdWludDY0X3QgYWJzX2xiYTsKKyAgICB1aW50NjRfdCBsZW5ndGg7CisgICAgaW50IGluZGV4MDsJICAgIC8qIGluY2x1ZGluZyBob2xlcywgZnJvbSAtMSAoZGlzaywgdGhlbiBwYXJ0cyBmcm9tIDApICovCisgICAgaW50IGluZGV4OwkgICAgLyogZXhjbHVkaW5nIGhvbGVzLCBmcm9tICAwIChkaXNrLCB0aGVuIHBhcnRzIGZyb20gMSksIC0xIG1lYW5zIGhvbGUsIGlmIFBJRl9TVEVQQUxMIGlzIHNldCAqLworICAgIGludCBmbGFnczsJICAgIC8qIGZsYWdzLCBzZWUgI2RlZmluZXMgYWJvdmUgKi8KKyAgICBpbnQgc3RhdHVzOwkgICAgLyogY3VycmVudCBzdGF0dXMsIHNlZSBlbnVtcyBhYm92ZSAqLworICAgIHN0cnVjdCBkaXNrX2luZm8gZGk7CisgICAgdW5pb24geworCXN0cnVjdCB7CisJICAgIHVpbnQzMl90IGRpc2tfc2lnOwkgIC8qIDMyYml0IGRpc2sgc2lnbmF0dXJlIGFzIHN0b3JlZCBpbiBNQlIgKi8KKworCSAgICB1aW50MzJfdCBiZWJyX2xiYTsJICAvKiBhYnNvbHV0ZSBsYmEgb2YgYmFzZSBleHRlbmRlZCBwYXJ0aXRpb24gKi8KKwkgICAgdWludDMyX3QgYmVicl9zaXo7CSAgLyogc2l6ZSBvZiBiYXNlIGV4dGVuZGVkIHBhcnRpdGlvbiAqLworCisJICAgIHVpbnQzMl90IGNlYnJfbGJhOwkgIC8qIGFic29sdXRlIGxiYSBvZiBjdXJyIGV4dC4gcGFydGl0aW9uICovCisJICAgIHVpbnQzMl90IGNlYnJfc2l6OwkgIC8qIHNpemUgb2YgY3VyciBleHQuIHBhcnRpdGlvbiAqLworCSAgICB1aW50MzJfdCBuZWJyX2xiYTsJICAvKiBhYnNvbHV0ZSBsYmEgb2YgbmV4dCBleHQuIHBhcnRpdGlvbiAqLworCSAgICB1aW50MzJfdCBuZWJyX3NpejsJICAvKiBzaXplIG9mIG5leHQgZXh0LiBwYXJ0aXRpb24gKi8KKworCSAgICBpbnQgYmVicl9pbmRleDA7CSAgLyogaW5kZXggb2YgKDAtMykgb2YgYmFzZSBleHQuIHBhcnQuLCAtMSBpZiBub3QgcHJlc2VudCBpbiBNQlIgKi8KKwkgICAgaW50IGxvZ3NraXBjbnQ7CSAgLyogaG93IG1hbnkgbG9naWNhbCBob2xlcyB3ZXJlIHNraXBwZWQgKi8KKwl9IGRvczsKKwlzdHJ1Y3QgeworCSAgICBzdHJ1Y3QgZ3VpZCBkaXNrX2d1aWQ7CisJICAgIHN0cnVjdCBndWlkIHBhcnRfZ3VpZDsKKwkgICAgY2hhciBwYXJ0X2xhYmVsW1BJX0dQVExBQlNJWkUvMisxXTsKKwkgICAgaW50IHBlX2NvdW50OworCSAgICBpbnQgcGVfc2l6ZTsKKwkgICAgdWludDY0X3QgdWZpcnN0OworCSAgICB1aW50NjRfdCB1bGFzdDsKKwl9IGdwdDsKKyAgICB9OworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpdGVydHlwZSAqIGNvbnN0IHR5cGVkb3M7CitleHRlcm4gY29uc3Qgc3RydWN0IGl0ZXJ0eXBlICogY29uc3QgdHlwZWdwdDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXRlcnR5cGUgKiBjb25zdCB0eXBlcmF3OworCitzdHJ1Y3QgcGFydF9pdGVyICpwaV9iZWdpbihjb25zdCBzdHJ1Y3QgZGlza19pbmZvICosIGludCBmbGFncyk7Cit2b2lkIHBpX2RlbChzdHJ1Y3QgcGFydF9pdGVyICoqKTsKKworLyogaW5saW5lIHZpcnR1YWxzICovCitzdGF0aWMgaW5saW5lIGludCBwaV9uZXh0KHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIpCit7CisgICAgcmV0dXJuIGl0ZXItPnR5cGUtPm5leHQoaXRlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaV9kdG9yKHN0cnVjdCBwYXJ0X2l0ZXIgKml0ZXIpCit7CisgICAgaXRlci0+dHlwZS0+ZHRvcihpdGVyKTsKK30KKworI2VuZGlmCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTQgc3c9NCBub2V0OiAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvY2hhaW4vdXRpbGl0eS5jIGIvY29tMzIvY2hhaW4vdXRpbGl0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzk5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jaGFpbi91dGlsaXR5LmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqICAgQ29weXJpZ2h0IDIwMTAgU2hhbyBNaWxsZXIKKyAqICAgQ29weXJpZ2h0IDIwMTAtMjAxMiBNaWNoYWwgU29sdHlzCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8c3lzbGludXgvZGlzay5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3BtYXBpLmg+CisjaW5jbHVkZSAidXRpbGl0eS5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqYnBidHlwZXNbXSA9IHsKKyAgICBbMF0gPSAgInVua25vd24iLAorICAgIFsxXSA9ICAiMi4wIiwKKyAgICBbMl0gPSAgIjMuMCIsCisgICAgWzNdID0gICIzLjIiLAorICAgIFs0XSA9ICAiMy40IiwKKyAgICBbNV0gPSAgIjQuMCIsCisgICAgWzZdID0gICI4LjAgKE5UKykiLAorICAgIFs3XSA9ICAiNy4wIiwKKyAgICBbOF0gPSAgImV4RkFUIiwKK307CisKK3ZvaWQgd2FpdF9rZXkodm9pZCkKK3sKKyAgICBpbnQgY250OworICAgIGNoYXIganVuazsKKworICAgIC8qIGRyYWluICovCisgICAgZG8geworCWVycm5vID0gMDsKKwljbnQgPSByZWFkKDAsICZqdW5rLCAxKTsKKyAgICB9IHdoaWxlIChjbnQgPiAwIHx8IChjbnQgPCAwICYmIGVycm5vID09IEVBR0FJTikpOworCisgICAgLyogd2FpdCAqLworICAgIGRvIHsKKwllcnJubyA9IDA7CisJY250ID0gcmVhZCgwLCAmanVuaywgMSk7CisgICAgfSB3aGlsZSAoIWNudCB8fCAoY250IDwgMCAmJiBlcnJubyA9PSBFQUdBSU4pKTsKK30KKworaW50IGd1aWRfaXMwKGNvbnN0IHN0cnVjdCBndWlkICpndWlkKQoreworICAgIHJldHVybgorCSEoZ3VpZC0+ZGF0YTEgfHwKKwkgIGd1aWQtPmRhdGEyIHx8CisJICBndWlkLT5kYXRhMyB8fAorCSAgZ3VpZC0+ZGF0YTQpOworfQorCisvKgorICogbW9kZSBleHBsYW5hdGlvbjoKKyAqCisgKiBjbnVsIC0gInN0cmljdCIgbW9kZSwgbmV2ZXIgcmV0dXJuaW5nIGhpZ2hlciB2YWx1ZSB0aGFuIG9idGFpbmVkIGZyb20gY2Jpb3MKKyAqIGNhZGQgLSBpZiB0aGUgZGlzayBpcyBsYXJnZXIgdGhhbiByZXBvcnRlZCBnZW9tZXRyeSAvYW5kLyBpZiB0aGUgZ2VvbWV0cnkgaGFzCisgKiAgICAgICAgbGVzcyBjeWxpbmRlcnMgdGhhbiAxMDI0IC0gaXQgbWVhbnMgdGhhdCB0aGUgdG90YWwgc2l6ZSBpcyBzb21ld2hlcmUKKyAqICAgICAgICBiZXR3ZWVuIGNzIGFuZCBjcysxOyBpbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSwgd2UgYnVtcCB0aGUgY3MgdG8gYmUgYWJsZQorICogICAgICAgIHRvIHJldHVybiBtYXRjaGluZyBjaHMgdHJpcGxldAorICogY21heCAtIGFzc3VtZSB3ZSBjYW4gdXNlIGFueSBjeWxpbmRlciB2YWx1ZQorICoKKyAqIGJ5IGRlZmF1bHQgY2FkZCBzZWVtcyBtb3N0IHJlYXNvbmFibGUsIGdpdmluZyBjb25zaXN0ZW50IHJlc3VsdHMgd2l0aCBlLmcuCisgKiBzZmRpc2sncyBiZWhhdmlvcgorICovCit2b2lkIGxiYTJjaHMoZGlza19jaHMgKmRzdCwgY29uc3Qgc3RydWN0IGRpc2tfaW5mbyAqZGksIHVpbnQ2NF90IGxiYSwgaW50IG1vZGUpCit7CisgICAgdWludDMyX3QgYywgaCwgcywgdDsKKyAgICB1aW50MzJfdCBjcywgaHMsIHNzOworCisgICAgLyoKKyAgICAgKiBOb3QgbXVjaCByZWFzb24gaGVyZSwgYnV0IGlmIHdlIGhhdmUgbm8gdmFsaWQgQ0hTIGdlb21ldHJ5LCB3ZSBhc3N1bWUKKyAgICAgKiAidHlwaWNhbCIgb25lcyB0byBoYXZlIHNvbWV0aGluZyB0byByZXR1cm4uCisgICAgICovCisgICAgaWYgKGRpLT5jYmlvcykgeworCWNzID0gZGktPmN5bDsKKwlocyA9IGRpLT5oZWFkOworCXNzID0gZGktPnNwdDsKKwlpZiAobW9kZSA9PSBMMkNfQ0FERCkgeworCSAgICBpZiAoY3MgPCAxMDI0ICYmIGRpLT5sYmFjbnQgPiBjcypocypzcykKKwkJY3MrKzsKKwl9IGVsc2UgaWYgKG1vZGUgPT0gTDJDX0NNQVgpCisJICAgIGNzID0gMTAyNDsKKyAgICB9IGVsc2UgeworCWlmIChkaS0+ZGlzayAmIDB4ODApIHsKKwkgICAgY3MgPSAxMDI0OworCSAgICBocyA9IDI1NTsKKwkgICAgc3MgPSA2MzsKKwl9IGVsc2UgeworCSAgICBjcyA9IDgwOworCSAgICBocyA9IDI7CisJICAgIHNzID0gMTg7CisJfQorICAgIH0KKworICAgIGlmIChsYmEgPj0gY3MqaHMqc3MpIHsKKwlzID0gc3M7CisJaCA9IGhzIC0gMTsKKwljID0gY3MgLSAxOworICAgIH0gZWxzZSB7CisJcyA9IChsYmEgJSBzcykgKyAxOworCXQgPSBsYmEgLyBzczsKKwloID0gdCAlIGhzOworCWMgPSB0IC8gaHM7CisgICAgfQorCisgICAgKCpkc3QpWzBdID0gaDsKKyAgICAoKmRzdClbMV0gPSBzIHwgKChjICYgMHgzMDApID4+IDIpOworICAgICgqZHN0KVsyXSA9IGM7Cit9CisKK3VpbnQzMl90IGdldF9maWxlX2xiYShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBzdHJ1Y3QgY29tMzJfZmlsZWRhdGEgZmQ7CisgICAgdWludDMyX3QgbGJhID0gMDsKKyAgICBpbnQgc2l6ZSA9IDY1NTM2OworICAgIGNoYXIgKmJ1ZjsKKworICAgIGJ1ZiA9IGxtYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFidWYpCisJcmV0dXJuIDA7CisKKyAgICAvKiBQdXQgdGhlIGZpbGVuYW1lIGluIHRoZSBib3VuY2UgYnVmZmVyICovCisgICAgc3RybGNweShidWYsIGZpbGVuYW1lLCBzaXplKTsKKworICAgIGlmIChvcGVuX2ZpbGUoYnVmLCBPX1JET05MWSwgJmZkKSA8PSAwKSB7CisJZ290byBmYWlsOwkJLyogRmlsZW5hbWUgbm90IGZvdW5kICovCisgICAgfQorCisgICAgLyogU2luY2UgdGhlIGZpcnN0IG1lbWJlciBpcyB0aGUgTEJBLCB3ZSBzaW1wbHkgY2FzdCAqLworICAgIGxiYSA9ICooKHVpbnQzMl90ICopIE1LX1BUUigwLCBmZC5oYW5kbGUpKTsKKworICAgIC8qIENhbGwgY29tYXBpX2Nsb3NlKCkgdG8gZnJlZSB0aGUgc3RydWN0dXJlICovCisgICAgY2xvc2VfZmlsZShmZC5oYW5kbGUpOworCitmYWlsOgorICAgIGxmcmVlKGJ1Zik7CisgICAgcmV0dXJuIGxiYTsKK30KKworLyogZHJpdmUgb2Zmc2V0IGRldGVjdGlvbiAqLworaW50IGRydm9mZl9kZXRlY3QoaW50IHR5cGUpCit7CisgICAgaWYgKGJwYlY0MCA8PSB0eXBlICYmIHR5cGUgPD0gYnBiVk5UKSB7CisJcmV0dXJuIDB4MjQ7CisgICAgfSBlbHNlIGlmICh0eXBlID09IGJwYlY3MCkgeworCXJldHVybiAweDQwOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBicGJFWEYpIHsKKwlyZXR1cm4gMHg2RjsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBoZXVyaXN0aWNzIGNvdWxkIGNlcnRhaW5seSBiZSBpbXByb3ZlZAorICovCitpbnQgYnBiX2RldGVjdChjb25zdCB1aW50OF90ICpzZWMsIGNvbnN0IGNoYXIgKnRhZykKK3sKKyAgICBpbnQgYSwgYiwgYywgam1wID0gLTEsIHJldiA9IDA7CisKKyAgICAvKiBleEZBVCBtZXNzIGZpcnN0IChtZWRpYSBkZXNjcmlwdG9yIGlzIDAgaGVyZSkgKi8KKyAgICBpZiAoIW1lbWNtcChzZWMgKyAweDAzLCAiRVhGQVQgICAiLCA4KSkgeworCXJldiA9IGJwYkVYRjsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBtZWRpYSBkZXNjcmlwdG9yIGNoZWNrICovCisgICAgaWYgKChzZWNbMHgxNV0gJiAweEYwKSAhPSAweEYwKQorCWdvdG8gb3V0OworCisgICAgaWYgKHNlY1swXSA9PSAweEVCKQkvKiBqdW1wIHNob3J0ICovCisJam1wID0gMiArICooaW50OF90ICopKHNlYyArIDEpOworICAgIGVsc2UgaWYgKHNlY1swXSA9PSAweEU5KSAvKiBqdW1wIG5lYXIgKi8KKwlqbXAgPSAzICsgKihpbnQxNl90ICopKHNlYyArIDEpOworCisgICAgaWYgKGptcCA8IDApICAgIC8qIG5vIGJvb3QgY29kZSBhdCBhbGwgPyAqLworCWdvdG8gbm9jb2RlOworCisgICAgLyogc2FuaXR5ICovCisgICAgaWYgKGptcCA8IDB4MTggfHwgam1wID4gMHgxRjApCisJZ290byBvdXQ7CisKKyAgICAvKiBkZXRlY3QgYnkganVtcCAqLworICAgIGlmIChqbXAgPj0gMHgxOCAmJiBqbXAgPCAweDFFKQorCXJldiA9IGJwYlYyMDsKKyAgICBlbHNlIGlmIChqbXAgPj0gMHgxRSAmJiBqbXAgPCAweDIwKQorCXJldiA9IGJwYlYzMDsKKyAgICBlbHNlIGlmIChqbXAgPj0gMHgyMCAmJiBqbXAgPCAweDI0KQorCXJldiA9IGJwYlYzMjsKKyAgICBlbHNlIGlmIChqbXAgPj0gMHgyNCAmJiBqbXAgPCAweDQ2KQorCXJldiA9IGJwYlYzNDsKKworICAgIC8qIFRPRE86IHNvbWUgYmV0dGVyIFYyIC0gVjMuNCBjaGVja3MgPyAqLworCisgICAgaWYgKHJldikKKwlnb3RvIG91dDsKKyAgICAvKgorICAgICAqIEJQQiBpbmZvOgorICAgICAqIDIuMCA9PSAgICAgICAweDBCIC0gMHgxNworICAgICAqIDMuMCA9PSAyLjAgKyAweDE4IC0gMHgxRAorICAgICAqIDMuMiA9PSAzLjAgKyAweDFFIC0gMHgxRgorICAgICAqIDMuNCA9PSEyLjAgKyAweDE4IC0gMHgyMworICAgICAqIDQuMCA9PSAzLjQgKyAweDI0IC0gMHg0NQorICAgICAqICBOVCA9PX4zLjQgKyAweDI0IC0gMHg1MworICAgICAqIDcuMCA9PSAzLjQgKyAweDI0IC0gMHg1OQorICAgICAqLworCitub2NvZGU6CisgICAgYSA9IG1lbWNtcChzZWMgKyAweDAzLCAiTlRGUyIsIDQpOworICAgIGIgPSBtZW1jbXAoc2VjICsgMHgzNiwgIkZBVCIsIDMpOworICAgIGMgPSBtZW1jbXAoc2VjICsgMHg1MiwgIkZBVCIsIDMpOwkvKiBleHQuIERPUyA3KyBicyAqLworCisgICAgaWYgKChzZWNbMHgyNl0gJiAweEZFKSA9PSAweDI4ICYmICFiKSB7CisJcmV2ID0gYnBiVjQwOworICAgIH0gZWxzZSBpZiAoc2VjWzB4MjZdID09IDB4ODAgJiYgIWEpIHsKKwlyZXYgPSBicGJWTlQ7CisgICAgfSBlbHNlIGlmICgoc2VjWzB4NDJdICYgMHhGRSkgPT0gMHgyOCAmJiAhYykgeworCXJldiA9IGJwYlY3MDsKKyAgICB9CisKK291dDoKKyAgICBwcmludGYoIkJQQiBkZXRlY3Rpb24gKCVzKTogJXNcbiIsIHRhZywgYnBidHlwZXNbcmV2XSk7CisgICAgcmV0dXJuIHJldjsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9NCBzdz00IG5vZXQ6ICovCmRpZmYgLS1naXQgYS9jb20zMi9jaGFpbi91dGlsaXR5LmggYi9jb20zMi9jaGFpbi91dGlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2MDE3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NoYWluL3V0aWxpdHkuaApAQCAtMCwwICsxLDc1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKiAgIENvcHlyaWdodCAyMDEwIFNoYW8gTWlsbGVyCisgKiAgIENvcHlyaWdodCAyMDEwLTIwMTIgTWljaGFsIFNvbHR5cworICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIENPTTMyX0NIQUlOX1VUSUxJVFlfSAorI2RlZmluZSBDT00zMl9DSEFJTl9VVElMSVRZX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzbGludXgvZGlzay5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L21vdmViaXRzLmg+CisKKy8qIG1vc3QgKGFsbCA/KSBicGIgInR5cGVzIiBrbm93biB0byBodW1hbmtpbmQgYXMgb2YgMjAxMiAqLworZW51bSB7YnBiVU5LLCBicGJWMjAsIGJwYlYzMCwgYnBiVjMyLCBicGJWMzQsIGJwYlY0MCwgYnBiVk5ULCBicGJWNzAsIGJwYkVYRn07CisKKy8qIHNlZSB1dGlsaXR5LmMgZm9yIGRldGFpbHMgKi8KK2VudW0ge0wyQ19DTlVMLCBMMkNfQ0FERCwgTDJDX0NNQVh9OworCisvKiBmaXJzdCB1c2FibGUgYW5kIGZpcnN0IHVudXNhYmxlIG9mZnNldHMgKi8KKyNkZWZpbmUgZG9zbWluICgoYWRkcl90KTB4NTAwdSkKKyNkZWZpbmUgZG9zbWF4ICgoYWRkcl90KSgqKHVpbnQxNl90ICopIDB4NDEzIDw8IDEwKSkKKwordm9pZCB3YWl0X2tleSh2b2lkKTsKK3ZvaWQgbGJhMmNocyhkaXNrX2NocyAqZHN0LCBjb25zdCBzdHJ1Y3QgZGlza19pbmZvICpkaSwgdWludDY0X3QgbGJhLCBpbnQgbW9kZSk7Cit1aW50MzJfdCBnZXRfZmlsZV9sYmEoY29uc3QgY2hhciAqZmlsZW5hbWUpOworaW50IGRydm9mZl9kZXRlY3QoaW50IHR5cGUpOworaW50IGJwYl9kZXRlY3QoY29uc3QgdWludDhfdCAqYnBiLCBjb25zdCBjaGFyICp0YWcpOworaW50IGd1aWRfaXMwKGNvbnN0IHN0cnVjdCBndWlkICpndWlkKTsKKworc3RhdGljIGlubGluZSBpbnQgd2Fybihjb25zdCBjaGFyICp4KQoreworICAgIHJldHVybiBmcHJpbnRmKHN0ZGVyciwgIldBUk46ICVzXG4iLCB4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXJyb3IoY29uc3QgY2hhciAqeCkKK3sKKyAgICByZXR1cm4gZnByaW50ZihzdGRlcnIsICJFUlI6ICVzXG4iLCB4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3JpdChjb25zdCBjaGFyICp4KQoreworICAgIHJldHVybiBmcHJpbnRmKHN0ZGVyciwgIkNSSVQ6ICVzIEAlczolZFxuIiwgeCwgX19GSUxFX18sIF9fTElORV9fKTsKK30KKworI2RlZmluZSBjcml0bSgpICBjcml0KCJNYWxsb2MgZmFpbHVyZS4iKQorCisjZW5kaWYKKworLyogdmltOiBzZXQgdHM9OCBzdHM9NCBzdz00IG5vZXQ6ICovCmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9DSEFOR0VTIGIvY29tMzIvY21lbnUvQ0hBTkdFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2UyMTgzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvQ0hBTkdFUwpAQCAtMCwwICsxLDMyIEBACitDaGFuZ2VzIGluIHYxLjIKKy0tLS0tLS0tLS0tLS0tLQorKiBBbGxvd2VkIG1lbnUncyB0byBoYXZlIG5hbWVzLiBTdWJtZW51J3MgY2FuIGJlIHJlZmVycmVkIHRvIGJ5IG5hbWVzCisgIGluc3RlYWQgb2YgdGhlaXIgaW5kZXggaW4gdGhlIG1lbnUgc3lzdGVtLiBUaGlzIGFsbG93cyB1c2VyIHRvIHJlZmVyCisgIHRvIHN1Ym1lbnVzIHdoaWNoIGFyZSBub3QgeWV0IHBhcnQgb2YgdGhlIG1lbnVzeXN0ZW0uCisqIGhlbHAgcGFnZXMgY2FuIGJlIGxvbmdlciB0aGFuIG9uZSBzY3JlZW4KKyogbWVudWdlbi5weTogUHl0aG9uIHNjcmlwdCBmb3IgY29udmVydGluZyAubWVudSBmaWxlcyB0byBDIHNvdXJjZSBjb2RlCisgIC5tZW51IGZpbGVzIGNhbiBiZSB1c2VkIHRvIGRlc2NpYmUgbW9zdCBzdGF0aWMgdXNlcyBvZiBtZW51IHN5c3RlbSwKKyAgaW5jbHVkaW5nIFN1Yk1lbnVzLCBDaGVja2JveGVzLCBSYWRpb0J1dHRvbnMsIFVzZXIgQXV0aGVudGljYXRpb24gYW5kCisgIENvbnRleHQgc2Vuc2l0aXZlIGhlbHAuIFlvdSBjYW4gYWxzbyByZXN0cmljdCB1c2Ugb2YgY2VydGFpbiBpdGVtcworICB0byB1c2VycyB3aXRoIGNlcnRhaW4gY3JlZGVudGlhbHMuCisKKyAgU2VlIE1FTlVfRk9STUFUIGZvciB0aGUgZm9ybWF0IG9mIC5tZW51IGZpbGVzCisKKyogZGlzcGxheS5jMzI6IFRha2VzIHRoZSBuYW1lIG9mIHRoZSB0ZXh0IGZpbGUgdG8gZGlzcGxheSBhbmQgZGlzcGxheXMgaXQKKyAgYWxsb3dpbmcgdXNlciB0byBzY3JvbGwgdGhyb3VnaCB0aGUgdGV4dC4KKworICBVU0FHRTogZGlzcGxheS5jMzIgPGZpbGVuYW1lPgorCisgIDxmaWxlbmFtZT4gbXVzdCBiZSBhbiBhYnNvbHV0ZSBmaWxlbmFtZSAoaW5jbHVkaW5nIHRoZSAvaXNvbGludXggcGFydCkKKworQ2hhbmdlcyBpbiB2MS4xCistLS0tLS0tLS0tLS0tLS0KKyogQWRkaXRpb25hbCBoYW5kbGVyIHR5cGU6IEtleXMgaGFuZGxlcgorKiBNZW51aXRlbSBoYW5kbGVycyBub3cgaGF2ZSBhIHJldHVybiB2YWx1ZSBvZiB0eXBlIHRfaGFuZGxlcl9yZXR1cm4uCisgIEZvciBhbGwgc2ltcGxlIGNhc2VzLCB5b3UganVzdCByZXR1cm4gQUNUSU9OX1ZBTElEIG9yIEFDVElPTl9JTlZBTElECisgIChGb3Igc29tZSB0eXBlcyBvZiBtZW51IGl0ZW1zLCBoYW5kbGVycyBhcmUgaWdub3JlZCwgYW5kIGZvcgorICAgb3RoZXJzIHRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZCkKKyogYWRkX21lbnUgdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQgKHRvIGJldHRlciBjb250cm9sIG1lbW9yeSBmb290cHJpbnQpCisgIFlvdSBjYW4ganVzdCBzZXQgaXQgdG8gLTEgdG8gY2hvb3NlIHRoZSBkZWZhdWx0IHZhbHVlCisqIE5vdyB0aGUgbWVudSBzeXN0ZW0gc3VwcG9ydCBsb25nIG1lbnUncyB1c2luZyBzY3JvbGwgYmFycy4KKyogU3VwcG9ydCBmb3IgcGFzc3dvcmRzIGFuZCBjb250ZXh0IHNlbnNpdGl2ZSBoZWxwIGlzIGFkZGVkLgpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvSElTVE9SWSBiL2NvbTMyL2NtZW51L0hJU1RPUlkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5YmViMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NtZW51L0hJU1RPUlkKQEAgLTAsMCArMSwyMCBAQAorCitHQ0MgJiAzMi1iaXQgY29kZQorLS0tLS0tLS0tLS0tLS0tLS0KK0R1ZSB0byB0aGUgbGltaXRhdGlvbnMgb2YgdGhlIENPTSBmaWxlIGZvcm1hdCwKKyg2NEtCIGxpbWl0IG9uIG1lbW9yeSBmb290cHJpbnQpIHRoZSBjb2RlIGhhcyBiZWVuIGNoYW5nZWQKK3NvIHRoYXQgdGhlIGNvZGUgY29tcGlsZXMgdG8gYSAzMi1iaXQgQ09NQk9PVCBwcm9ncmFtLgorU2luY2UgdGhlIGNvZGUgbWFrZXMgdXNlIG9mIEJJT1MgY2FsbHMsIHRoaXMgY29kZSBjYW5ub3QgYmUKK2NvbXBpbGVkIGludG8gYSBmb3JtYXQgd2hpY2ggY2FuIGV4ZWN1dGUgdW5kZXIgTGludXguIEFzIGEKK3NpZGUgZWZmZWN0LCB0aGVyZSBpcyBubyBuaWNlIHdheSB0byBkZWJ1ZyB0aGlzIGNvZGUuIEluIG9yZGVyCit0byBkZWJ1ZyB0aGlzIGNvZGUsIHlvdSB3aWxsIGhhdmUgdG8gcnVuIHRoZSBjb2RlIHVuZGVyIHN5c2xpbnV4LgorCitHQ0MgJiAxNi1iaXQgY29kZQorLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBjb2RlIHdhcyBwb3J0ZWQgdG8gR0NDIGJ5IFBldGVyIEFudmluLgorCitPcGVuV2F0Y29tICYgMTYtYml0IGNvZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorT3JpZ2luYWxseSB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gZm9yIHRoZSBPcGVud2F0Y29tIGNvbXBpbGVyCithbmQgZ2VuZXJhdGVkIC5DT00gZmlsZXMsIHdoaWNoIGNvdWxkIGV4ZWN1dGUgdW5kZXIgRE9TIGFzIHdlbGwgYXMKK1NZU0xJTlVYLgpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvTUFOVUFMIGIvY29tMzIvY21lbnUvTUFOVUFMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNzAxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jbWVudS9NQU5VQUwKQEAgLTAsMCArMSwzNDggQEAKKyAgICAgICAgICBPdmVydmlldyBvZiB3cml0aW5nIGNvZGUgdXNpbmcgdGhlIG1lbnUgc3lzdGVtCisgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb24gYW5kIGRldmVsb3BlciBkb2N1bWVudGF0aW9uLgorRm9yIHNpbXBsZSBjYXNlcywgeW91IHNob3VsZCBzdGFydCBieSB1c2luZyBzaW1wbGUuYyBhcyBhIHRlbXBsYXRlLgorY29tcGxleC5jIGlsbHVzdHJhdGVzIG1vc3Qgb2YgdGhlIGZlYXR1cmVzIGF2YWlsYWJsZSBpbiB0aGUgbWVudSBzeXN0ZW0uCisKK01lbnUgRmVhdHVyZXMgY3VycmVudGx5IHN1cHBvcnRlZCBhcmU6CisqIG1lbnUgaXRlbXMsCisqIHN1Ym1lbnVzLAorKiBkaXNhYmxlZCBpdGVtcywKKyogY2hlY2tib3hlcywKKyogaW52aXNpYmxlIGl0ZW1zICh1c2VmdWwgZm9yIGR5bmFtaWMgbWVudXMpLCBhbmQKKyogUmFkaW8gbWVudXMsCisqIENvbnRleHQgc2Vuc2l0aXZlIGhlbHAKKyogQXV0aGVudGljYXRlZCB1c2VycworCitUaGUga2V5cyB1c2VkIGFyZToKKworKiBBcnJvdyBLZXlzLCBQZ1VwLCBQZ0RuLCBIb21lLCBFbmQgS2V5cworKiBTcGFjZSB0byBzd2l0Y2ggc3RhdGUgb2YgYSBjaGVja2JveAorKiBFbnRlciB0byBjaG9vc2UgdGhlIGl0ZW0KKyogRXNjYXBlIHRvIGV4aXQgZnJvbSBpdAorKiBTaG9ydGN1dCBrZXlzCisKKzEuIE92ZXJ2aWV3CistLS0tLS0tLS0tLQorCitUaGUgY29kZSB1c3VhbGx5IGNvbnNpc3RzIG9mIG1hbnkgc3RhZ2VzLgorCisgKiBDb25maWd1cmluZyB0aGUgbWVudXN5dGVtCisgKiBJbnN0YWxsaW5nIGdsb2JhbCBoYW5kbGVycyBbb3B0aW9uYWxdCisgKiBQb3B1bGF0aW5nIHRoZSBtZW51c3lzdGVtCisgKiBFeGVjdXRpbmcgdGhlIG1lbnVzeXN0ZW0KKyAqIFByb2Nlc3NpbmcgdGhlIHJlc3VsdAorCisxLjEgQ29uZmlndXJpbmcgdGhlIG1lbnVzeXN0ZW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBpbmNsdWRlcyBzZXR0aW5nIHRoZSB3aW5kb3cgdGhlIG1lbnUgc3lzdGVtIHNob3VsZCB1c2UsCit0aGUgY2hvaWNlIG9mIGNvbG9ycywgdGhlIHRpdGxlIG9mIHRoZSBtZW51IGV0Yy4gSW4gbW9zdCBmdW5jdGlvbnMKK2NhbGxzLCBhIHZhbHVlIG9mIC0xIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGJlIHVzZWQuCitGb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBhcmd1bWVudHMgYXJlIGxvb2sgYXQgZnVuY3Rpb24KK2RlY2xhcmF0aW9ucyBpbiBtZW51LmgKKworPGNvZGU+CisgIC8vIENob29zZSB0aGUgZGVmYXVsdCB0aXRsZSBhbmQgc2V0dXAgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBhdHRyaWJ1dGVzLi4uLgorICBpbml0X21lbnVzeXN0ZW0oTlVMTCk7CisgIHNldF93aW5kb3dfc2l6ZSgxLDEsMjMsNzgpOyAvLyBMZWF2ZSBvbmUgcm93L2NvbCBib3JkZXIgYWxsIGFyb3VuZAorCisgIC8vIENob29zZSB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBhdHRyaWJ1dGVzIGFuZCBjaGFyJ3MKKyAgLy8gLTEgbWVhbnMgY2hvb3NlIGRlZmF1bHRzIChBY3R1YWxseSB0aGUgbmV4dCA0IGxpbmVzIGFyZSBub3QgbmVlZGVkKQorICBzZXRfbm9ybWFsX2F0dHIgKC0xLC0xLC0xLC0xKTsKKyAgc2V0X3N0YXR1c19pbmZvICgtMSwtMSk7CisgIHNldF90aXRsZV9pbmZvICAoLTEsLTEpOworICBzZXRfbWlzY19pbmZvKC0xLC0xLC0xLC0xKTsKKzwvY29kZT4KKworMS4yIFBvcHVsYXRpbmcgdGhlIG1lbnVzeXN0ZW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGludm9sdmVzIGFkZGluZyBhIG1lbnUgdG8gdGhlIHN5c3RlbSwgYW5kIHRoZSBvcHRpb25zIHdoaWNoCitzaG91bGQgYXBwZWFyIGluIHRoZSBtZW51LiBBbiBleGFtcGxlIGlzIGdpdmVuIGJlbG93LgorCis8Y29kZT4KKyAgTUFJTk1FTlUgPSBhZGRfbWVudSgiIE1lbnUgVGl0bGUgIiwtMSk7CisgIENIRUNLRUQgPSAxOworICBhZGRfaXRlbSgib3B0aW9uMSIsIlN0YXR1cyAxIixPUFRfUlVOLCJrZXJuZWwxIGFyZzE9dmFsMSIsMCk7CisgIGFkZF9pdGVtKCJzZWxmbG9vcCIsIlN0YXR1cyAyIixPUFRfU1VCTUVOVSxOVUxMLE1BSU5NRU5VKTsKKyAgYWRkX2l0ZW0oIm90aGVybWVudSIsIlN0YXR1cyAzIixPUFRfU1VCTUVOVSwibWVudW5hbWUiLDApOworICBhZGRfc2VwKCk7CisgIGFkZF9pdGVtKCJjaGVja2JveCwiQ2hlY2tib3ggSW5mbyIsT1BUX0NIRUNLQk9YLE5VTEwsQ0hFQ0tFRCk7CisgIGFkZF9pdGVtKCJFeGl0ICIsIlN0YXR1cyBTdHJpbmciLE9QVF9FWElUTUVOVSxOVUxMLDApOworPC9jb2RlPgorCitUaGUgY2FsbCB0byBhZGRfbWVudSBoYXMgdHdvIGFyZ3VtZW50cywgdGhlIGZpcnN0IGJlaW5nIHRoZSB0aXRsZSBvZgordGhlIG1lbnUgYW5kIHRoZSBzZWNvbmQgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbWVudS4KK1B1dHRpbmcgYSAtMSwgd2lsbCB1c2UgdGhlIGRlZmF1bHQgKHNlZSBNRU5VU0laRSBpbiBtZW51LmgpLiBJZiB5b3UgdHJ5Cit0byBhZGQgbW9yZSBpdGVtcyB0aGFuIHNwZWNpZmllZCwgdGhlIGV4dHJhIGl0ZW1zIHdpbGwgbm90IGFwcGVhciBpbgordGhlIG1lbnUuIFRoZSBhY2N1cmFjeSBvZiB0aGlzIG51bWJlciBhZmZlY3RzIHRoZSBtZW1vcnkgcmVxdWlyZWQKK3RvIHJ1biB0aGUgc3lzdGVtLgorCitJZiB5b3UgZG8gbm90IHdhbnQgdG8ga2VlcCB0cmFjayBvZiB0aGUgcmV0dXJuIHZhbHVlcywgeW91IGNhbiBhbHNvIHVzZQordGhlIGZvbGxvd2luZyB2YXJpYW50IG9mIGFkZF9tZW51CisKKzxjb2RlPgorYWRkX25hbWVkX21lbnUoIm1haW4iLCIgTWVudSBUaXRsZSAiLC0xKQorPC9jb2RlPgorCitUaGlzIGNyZWF0ZXMgYSBuZXcgbWVudSBhcyBiZWZvcmUgYW5kIGdpdmVzIGl0IGEgbmFtZSAibWFpbiIuIFdoZW4gdXNpbmcgbmFtZWQKK21lbnVzLCB5b3UgZ2V0IGFuIGFsdGVybmF0ZSB3YXkgZm9yIGFkZGluZyBzdWJtZW51J3MuIFNlZSBiZWxvdyBmb3IgZGV0YWlscy4KKworVGhlIGNhbGwgdG8gYWRkX2l0ZW0gaGFzIGZpdmUgYXJndW1lbnRzLgorVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSB0ZXh0IHdoaWNoIGFwcGVhcnMgaW4gdGhlIG1lbnUgaXRzZWxmLgorVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIHN0YXR1cyBsaW5lLgorVGhlIHRoaXJkIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGlzIG1lbnVpdGVtLiBJdCBpcyBvbmUgb2YKK3RoZSBmb2xsb3dpbmcKKworICogT1BUX1JVTiA6IGV4ZWN1dGFibGUgY29udGVudAorICogT1BUX0VYSVRNRU5VIDogZXhpdHMgbWVudSB0byBwYXJlbnQKKyAqIE9QVF9TVUJNRU5VIDogaWYgc2VsZWN0ZWQsIGRpc3BsYXlzIGEgc3VibWVudQorICogT1BUX0NIRUNLQk9YIDogYXNzb2NpYXRlcyBhIGJvb2xlYW4gd2l0aCB0aGlzIGl0ZW0gd2hpY2ggY2FuIGJlIHRvZ2dsZWQKKyAqIE9QVF9SQURJT01FTlU6IGFzc29jaWF0ZXMgdGhpcyB3aXRoIGEgcmFkaW8gbWVudS4KKyAgICAgIEFmdGVyIGV4ZWN1dGlvbiwgdGhlIGRhdGEgZmllbGQgb2YgdGhpcyBpdGVtIHdpbGwgcG9pbnQKKyAgICAgIHRvIHRoZSBvcHRpb24gc2VsZWN0ZWQuCisgKiBPUFRfU0VQIDogQSBtZW51IHNlcGVyYXRvciAodmlzdWFsbHkgZGl2aWRlIG1lbnUgaW50byBwYXJ0cykKKyAqIE9QVF9SQURJT0lURU06IHRoaXMgaXRlbSBpcyBvbmUgb2YgdGhlIG9wdGlvbnMgaW4gYSBSQURJT01FTlUKKyAqIE9QVF9JTkFDVElWRSA6IEEgZGlzYWJsZWQgaXRlbSAodXNlciBjYW5ub3Qgc2VsZWN0IHRoaXMpCisgKiBPUFRfSU5WSVNJQkxFOiBUaGlzIGl0ZW0gd2lsbCBub3QgYmUgZGlzcGxheWVkLgorCitUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBmaWVsZCBhbHdheXMgYSBzdHJpbmcuCitVc3VhbGx5IHRoaXMgc3RyaW5nIGlzIGp1c3QgY29waWVkIGFuZCBub3RoaW5nIGlzIGRvbmUgd2l0aCBpdC4gVHdvCitjYXNlcywgd2hlcmUgaXQgaXMgdXNlZC4KKworSW4gY2FzZSBvZiBhIHJhZGlvbWVudSB0aGUgaW5wdXQgc3RyaW5nIGlzIGlnbm9yZWQgYW5kIHRoZSAiZGF0YSIgZmllbGQKK3BvaW50cyB0byB0aGUgbWVudWl0ZW0gY2hvc2VuIChEb250IGZvcmdldCB0byB0eXBlY2FzdCB0aGlzIHBvaW50ZXIgdG8KKyh0X21lbnVpdGVtICopIHdoZW4gcmVhZGluZyB0aGlzIGluZm8pLgorCitJbiBjYXNlIG9mIGEgc3VibWVudSwgdGhpcyBzdHJpbmcgaWYgbm9uLXRyaXZpYWwgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlCituYW1lIG9mIHRoZSBzdWJtZW51IHdoaWNoIHNob3VsZCBiZSBsaW5rZWQgdGhlcmUuIFRoaXMgaW50ZXJwcmV0YXRpb24KK2hhcHBlbnMgd2hlbiB0aGUgbWVudSBpcyBmaXJzdCBydW4gYW5kIG5vdCB3aGVuIHRoZSBtZW51IHN5c3RlbSBpcyBiZWluZworY3JlYXRlZC4gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlIHRoZSBtZW51c3lzdGVtIGluIGFuIGFyYml0cmFyeQorb3JkZXIuCisKKworVGhlIGZpZnRoIGFyZ3VtZW50IGlzIGEgbnVtYmVyIHdob3NlIG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUKK2l0ZW0uIEZvciBhIENIRUNLQk9YIGl0IHNob3VsZCBiZSAwLzEgc2V0dGluZyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUKK2NoZWNrYm94LiBGb3IgYSBTVUJNRU5VIGl0IHNob3VsZCBiZSB0aGUgaW5kZXggb2YgdGhlIG1lbnUgd2hpY2ggc2hvdWxkCitiZSBkaXNwbGF5ZWQgaWYgdGhpcyBvcHRpb24gaXMgY2hvc2VuLiBJbmNhc2UgdGhlIGRhdGEgZmllbGQgaXMgbm9uLXRyaXZpYWwsCit0aGlzIG51bWJlciBpcyBpZ25vcmVkIGFuZCBjb21wdXRlZCBsYXRlci4gRm9yIGEgUkFESU9NRU5VIGl0IHNob3VsZCBiZSB0aGUKK2luZGV4IG9mIHRoZSBtZW51IHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgb3B0aW9ucyAoQWxsIGl0ZW1zIGluIHRoYXQgbWVudQorbm90IG9mIHR5cGUgUkFESU9JVEVNIGFyZSBpZ25vcmVkKS4gRm9yIGFsbCBvdGhlciB0eXBlcywgdGhpcworYXJndW1lbnQgaGFzIG5vIG1lYW5pbmcgYXQgYWxsLgorCitBIGNhbGwgdG8gYWRkX3NlcCBpcyBhIGNvbnZlbmllbnQgc2hvcnRoYW5kIGZvciBjYWxsaW5nIGFkZF9pdGVtCit3aXRoIHRoZSB0eXBlIHNldCB0byBPUFRfU0VQLgorCisxLjMgRXhlY3V0aW5nIHRoZSBtZW51c3lzdGVtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGlzIHRoZSBzaW1wbGVzdCBvZiBhbGwuIEp1c3QgY2FsbCBzaG93bWVudXMsIHdpdGggdGhlIGluZGV4CitvZiB0aGUgbWFpbiBtZW51IGFzIGl0cyBhcmd1bWVudC4gSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1lbnUKK2l0ZW0gd2hpY2ggd2FzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgorCis8Y29kZT4KKyAgIGNob2ljZSA9IHNob3dtZW51cyhNQUlOKTsgLy8gSW5pdGlhbCBtZW51IGlzIHRoZSBvbmUgd2l0aCBpbmRleCBNQUlOCisgICAvLyBvciBjaG9pY2UgPSBzaG93bWVudXMoZmluZF9tZW51X251bSgibWFpbiIpKTsgLy8gSW5pdGlhbCBtZW51IGlzIHRoZSBvbmUgbmFtZWQgIm1haW4iCis8L2NvZGU+CisKKzEuNCBQcm9jZXNzaW5nIHRoZSByZXN1bHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgcG9pbnRlciB3aWxsIGVpdGhlciBiZSBOVUxMICh1c2VyIGhpdCBFc2NhcGUpIG9yIGFsd2F5cyBwb2ludAordG8gYSBtZW51aXRlbSB3aGljaCBjYW4gYmUgImV4ZWN1dGVkIiwgaS5lLiBpdCB3aWxsIGJlIG9mIHR5cGUgT1BUX1JVTi4KK1VzdWFsbHkgYXQgdGhpcyBwb2ludCwgYWxsIHdlIG5lZWQgdG8gZG8gaXMgdG8gYXNrIHN5c2xpbnV4IHRvIHJ1bgordGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVudWl0ZW0uIFRoZSBmb2xsb3dpbmcgY29kZSBleGVjdXRlcwordGhlIGNvbW1hbmQgc3RvcmVkIGluIGNob2ljZS0+ZGF0YSAodGhlcmUgaXMgbm8gb3RoZXIgdXNlIGZvciB0aGUgZGF0YQorZmllbGQsIGV4Y2VwdCBmb3IgcmFkaW9tZW51J3MpCisKKzxjb2RlPgorICBpZiAoY2hvaWNlKQorICB7CisgICAgICAgIGlmIChjaG9pY2UtPmFjdGlvbiA9PSBPUFRfUlVOKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3lzbGludXgpIHJ1bmNvbW1hbmQoY2hvaWNlLT5kYXRhKTsKKyAgICAgICAgICAgIGVsc2UgY3NwcmludChjaG9pY2UtPmRhdGEsMHgwNyk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBjc3ByaW50KCJFcnJvciBpbiBwcm9ncmFtbWluZyEiLDB4MDcpOworICB9Cis8L2NvZGU+CisKKzIuIEFkdmFuY2VkIGZlYXR1cmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorRXZlcnljYWxsIHRvIGFkZF9pdGVtIGFjdHVhbGx5IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtZW51aXRlbQorY3JlYXRlZC4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdXNpbmcgYW55IG9mIHRoZSBhZHZhbmNlZCBmZWF0dXJlcy4KKworMi4xIGV4dHJhX2RhdGEKKy0tLS0tLS0tLS0tLS0tCitGb3IgZXhhbXBsZSwgZXZlcnkgbWVudWl0ZW0gaGFzIGFuICJleHRyYV9kYXRhIiBmaWVsZCAoYSBwb2ludGVyKQord2hpY2ggdGhlIHVzZXIgY2FuIHVzZSB0byBwb2ludCBhbnkgZGF0YSBoZS9zaGUgcGxlYXNlcy4gVGhlIG1lbnVzeXN0ZW0KK2l0c2VsZiBkb2VzIG5vdCB1c2UgdGhpcyBmaWVsZCBpbiBhbnl3YXkuCisKKzIuMiBoZWxwaWQKKy0tLS0tLS0tLS0KK0V2ZXJ5IGl0ZW0gYWxzbyBoYXMgYSBmaWVsZCBjYWxsZWQgImhlbHBpZCIuIEl0IGlzIG1lYW50IHRvIGhvbGQgc29tZQora2luZCBvZiBpZGVudGlmaWVyIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGFuZCB1c2VkIHRvIGdlbmVyYXRlCithIGNvbnRleHQgc2Vuc2l0aXZlIGhlbHAgc3lzdGVtLiBUaGlzIGNhbiBiZSBzZXQgYWZ0ZXIgYSBjYWxsIHRvCithZGRfaXRlbSBhcyBmb2xsb3dzCis8Y29kZT4KKyAgYWRkX2l0ZW0oInNlbGZsb29wIiwiU3RhdHVzIDIiLE9QVF9TVUJNRU5VLE5VTEwsTUFJTk1FTlUpOworICBzZXRfaXRlbV9vcHRpb25zKCdBJyw0NTE2KTsKKzwvY29kZT4KKworVGhlIGZpcnN0IGlzIHRoZSBzaG9ydGN1dCBrZXkgZm9yIHRoaXMgZW50cnkuIFlvdSBjYW4gcHV0IC0xIHRvIGVuc3VyZQordGhhdCB0aGUgc2hvcnRjdXQga2V5IGlzIG5vdCByZXNldC4gVGhlIHNlY29uZCBpcyBzb21lIHVuc2lnbmVkIGludGVnZXIuCitJZiB0aGlzIHZhbHVlIGlzIDB4RkZGRiwgdGhlbiB0aGUgaGVscGlkIGlzIG5vdCBjaGFuZ2VkLgorCisyLjMgSW5zdGFsbGluZyBnbG9iYWwgaGFuZGxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSXQgaXMgcG9zc2libGUgdG8gcmVnaXN0ZXIgaGFuZGxlcnMgZm9yIHRoZSBtZW51IHN5c3RlbS4gVGhlc2UgYXJlCit1c2VyIGZ1bmN0aW9ucyB3aGljaCBhcmUgY2FsbGVkIGJ5IHRoZSBtZW51c3lzdGVtIGluIGNlcnRhaW4KK3NpdHVhdGlvbnMuIFVzdWFsbHkgdGhlIGhhbmRsZXJzIGdldCBhIHBvaW50ZXIgdG8gdGhlIG1lbnVzeXN0ZW0KK2RhdGFzdHJ1Y3R1cmUgYXMgd2VsbCBhcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgaXRlbSBzZWxlY3RlZC4KK1NvbWUgaGFuZGxlcnMgbWF5IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiBTb21lIGhhbmRsZXJzIGFyZQorcmVxdWlyZWQgdG8gcmV0dXJuIHZhbHVlcyB3aGlsZSBvdGhlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBkbyBzby4KKworQ3VycmVudGx5IHRoZSBtZW51c3lzdGVtIHN1cHBvcnQgdGhyZWUgdHlwZXMgb2YgZ2xvYmFsIGhhbmRsZXJzCisqIHRpbWVvdXQgaGFuZGxlcgorKiBzY3JlZW4gaGFuZGxlcgorKiBrZXlzIGhhbmRsZXIKKworMi4zLjEgdGltZW91dCBoYW5kbGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgaXMgaW5zdGFsbGVkIHVzaW5nIGEgY2FsbCB0byAicmVnX29udGltZW91dChmbixudW1zdGVwcyxzdGVwc2l6ZSkiCitmdW5jdGlvbi4gZm4gaXMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzIGFuZAorcmV0dXJucyBvbmUgb2YgQ09ERV9XQUlULCBDT0RFX0VOVEVSLCBDT0RFX0VTQ0FQRS4gVGhpcyBmdW5jdGlvbiBpcworY2FsbGVkIHdoZW4gbnVtc3RlcHMqc3RlcHNpemUgQ2VudGlzZWNvbmRzIGhhdmUgZ29uZSBieSB3aXRob3V0IGFueQordXNlciBpbnB1dC4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgQ09ERV9XQUlUIHRoZW4gdGhlIG1lbnVzeXN0ZW0KK3dhaXRzIGZvciB1c2VyIGlucHV0IChmb3IgYW5vdGhlciBudW1zdGVwcypzdGVwc2l6ZSBDZW50aXNlY29uZHMpLiBJZgorQ09ERV9FTlRFUiBvciBDT0RFX0VTQ0FQRSBpcyByZXR1cm5lZCwgdGhlbiB0aGUgc3lzdGVtIHByZXRlbmRzIHRoYXQKK3RoZSB1c2VyIGhpdCBFTlRFUiBvciBFU0NBUEUgb24gdGhlIGtleWJvYXJkIGFuZCBhY3RzIGFjY29yZGluZ2x5LgorCisyLjMuMiBTY3JlZW4gaGFuZGxlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgaXMgaW5zdGFsbGVkIHVzaW5nIGEgY2FsbCB0byAicmVnX2hhbmRsZXIoSERMUl9TQ1JFRU4sZm4pIi4gZm4gaXMKK2EgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgcG9pbnRlciB0byB0aGUgbWVudXN5c3RlbQorZGF0YXN0cnVjdHVyZSBhbmQgdGhlIGN1cnJlbnQgaXRlbSBzZWxlY3RlZCBhbmQgcmV0dXJucyBub3RoaW5nLgorVGhpcyBpcyBjYWxsZWQgZXZlcnl0aW1lIGEgbWVudSBpcyBkcmF3biAoaS5lLiBldmVyeXRpbWUgdXNlciBjaGFuZ2VzCit0aGUgY3VycmVudCBzZWxlY3Rpb24pLiBUaGlzIGlzIG1lYW50IGZvciBkaXNwbGF5aW5nIGFueSBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbiB3aGljaCByZWZsZWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc3lzdGVtLgorCisyLjMuMyBLZXlzIGhhbmRsZXIKKy0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBpcyBpbnN0YWxsZWQgdXNpbmcgYSBjYWxsIHRvICJyZWdfaGFuZGxlcihIRExSX0tFWVMsZm4pIi4gZm4gaXMKK2EgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgcG9pbnRlciB0byB0aGUgbWVudXN5c3RlbQorZGF0YXN0cnVjdHVyZSwgdGhlIGN1cnJlbnQgaXRlbSBhbmQgdGhlIHNjYW4gY29kZSBvZiBhIGtleSBhbmQgcmV0dXJucworbm90aGluZy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIGEga2V5IHdoaWNoCit0aGUgbWVudXN5c3RlbSBkb2VzIG5vdCBrbm93IHRvIGRlYWx3aXRoLiBJbiBhbnkgY2FzZSwgd2hlbiB0aGlzIGNhbGwKK3JldHVybnMgdGhlIHNjcmVlbiBzaG91bGQgbm90IGhhdmUgY2hhbmdlZCBpbiBhbnkgd2F5LiBVc3VhbGx5LAorb25lIGNhbiBjaGFuZ2UgdGhlIGFjdGl2ZSBwYWdlIGFuZCBkaXNwbGF5IGFueSBvdXRwdXQgbmVlZGVkIGFuZAorcmVzZXQgdGhlIGFjdGl2ZSBwYWdlIHdoZW4geW91IHJldHVybiBmcm9tIHRoaXMgY2FsbC4KKworY29tcGxleC5jIGltcGxlbWVudHMgYSBrZXlfaGFuZGxlciwgd2hpY2ggaW1wbGVtZW50cyBhIHNpbXBsZQorY29udGV4dCBzZW5zaXRpdmUgaGVscCBzeXN0ZW0sIGJ5IGRpc3BsYXlpbmcgdGhlIGNvbnRlbnRzIG9mIGEKK2ZpbGUgd2hvc2UgbmFtZSBpcyBiYXNlZCBvbiB0aGUgaGVscGlkIG9mIHRoZSBhY3RpdmUgaXRlbS4KKworQWxzbywgY29tcGxleC5jJ3MgaGFuZGxlciBhbGxvd3MgY2VydGFpbiB1c2VycyB0byBtYWtlIGNoYW5nZXMKK3RvIGVkaXQgdGhlIGNvbW1hbmRzIGFzc29jaWF0ZWQgd2l0aCBhIG1lbnUgaXRlbS4KKworMi40IEluc3RhbGxpbmcgaXRlbSBsZXZlbCBoYW5kbGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW4gYWRkaXRpb24gdG8gZ2xvYmFsIGhhbmRsZXJzLCBvbmUgY2FuIGFsc28gaW5zdGFsbCBoYW5kbGVycyBmb3IgZWFjaAoraW5kaXZpZHVhbCBpdGVtLiBBIGhhbmRsZXIgZm9yIGFuIGluZGl2aWR1YWwgaXRlbSBpcyBhIGZ1bmN0aW9uIHdoaWNoCit0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIG1lbnVzeXN0ZW0gZGF0YXN0cnVjdHVyZSBhbmQgYSBwb2ludGVyIHRvIHRoZQorY3VycmVudCBpdGVtIGFuZCByZXR1cm4gYSBzdHJ1Y3R1cmUgb2YgdHlwZSB0X2hhbmRsZXJfcmV0dXJuLiBDdXJyZW50bHkKK2l0IGhhcyB0d28gYml0IGZpZWxkcyAidmFsaWQiIGFuZCAicmVmcmVzaCIuCisKK1RoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBoaXRzICJlbnRlciIgb24gYSBSVU4gaXRlbSwgb3IKK2NoYW5nZXMgdGhlIHN0YXR1cyBvZiBhIENIRUNLQk9YLCBvciBjYWxsZWQgKmFmdGVyKiBhIHJhZGlvIG1lbnUgY2hvaWNlCitoYXMgYmVlbiBzZXQuIEluIGFsbCBvdGhlciBjYXNlcywgaW5zdGFsbGluZyBhIGhhbmRsZXIgaGFzIG5vIGVmZmVjdC4KKworVGhlIGhhbmRsZXIgY2FuIGNoYW5nZSBhbnkgb2YgdGhlIGludGVybmFsIGRhdGFzdHJ1Y3R1cmVzIGl0IHBsZWFzZXMuCitGb3IgZS5nLiBpbiBhIHJhZGlvbWVudSBoYW5kbGVyLCBvbmUgY2FuIGNoYW5nZSB0aGUgdGV4dCBkaXNwbGF5ZWQKK29uIHRoZSBtZW51aXRlbSBkZXBlbmRpbmcgb24gd2hpY2ggY2hvaWNlIHdhcyBzZWxlY3RlZCAoc2VlIGNvbXBsZXguYworZm9yIGFuIGV4YW1wbGUpLiBUaGUgcmV0dXJuIHZhbHVlcyBhcmUgaWdub3JlZCBmb3IgUkFESU9NRU5VJ3MuCisKK0luIGNhc2Ugb2YgUlVOIGl0ZW1zOiB0aGUgcmV0dXJuIHZhbHVlcyBhcmUgdXNlZCBhcyBmb2xsb3dzLiBJZiB0aGUKK3JldHVybiB2YWx1ZSBvZiAidmFsaWQiIHdhcyBmYWxzZSwgdGhlbiB0aGlzIHVzZXIgY2hvaWNlIGlzIGlnbm9yZWQuCitUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgaGFuZGxlciBoYXMgdXNlZnVsIHNpZGUgZWZmZWN0cy4gRm9yIGUuZy4KK2NvbXBsZXguYyBoYXMgYSBMb2dpbiBpdGVtLCB3aG9zZSBoYW5kbGVyIGFsd2F5cyByZXR1cm4gSU5WQUxJRC4gSXQKK3NldHMgYSBnbG9iYWwgdmFyaWFibGUgdG8gdGhlIG5hbWUgb2YgdGhlIHVzZXIgbG9nZ2VkIGluLCBhbmQgZW5hYmxlcworc29tZSBtZW51IGl0ZW1zLCBhbmQgbWFrZXMgc29tZSBpbnZpc2libGUgaXRlbXMgdmlzaWJsZS4KKworKiBJZiB0aGUgaGFuZGxlciBkb2VzIG5vdCBjaGFuZ2UgdGhlIHZpc2liaWxpdHkgc3RhdHVzIG9mIGFueSBpdGVtcywKKyAgdGhlIGhhbmRsZXIgc2hvdWxkIHNldCAicmVmcmVzaCIgdG8gMC4KKyogSWYgdGhlIGhhbmRsZXIgY2hhbmdlcyB0aGUgdmlzaWJpbGl0eSBzdGF0dXMgb2YgaXRlbXMgaW4gdGhlIGN1cnJlbnQKKyAgbWVudSBzZXQgInJlZnJlc2giIHRvIDEuCisqIElmIHlvdSBhcmUgY2hhbmdpbmcgdGhlIHZpc2liaWxpdHkgc3RhdHVzIG9mIGl0ZW1zIGluIG1lbnUncyBjdXJyZW50bHkKKyAgbm90IGRpc3BsYXllZCwgdGhlbiB5b3UgY2FuIHNldCAicmVmcmVzaCIgdG8gMC4KKyogQ2hhbmdpbmcgdGhlIHZpc2liaWxpdHkgc3RhdHVzIG9mIGl0ZW1zIGluIGFub3RoZXIgbWVudQorICB3aGljaCBpcyBjdXJyZW50bHkgZGlzcGxheWVkLCBpcyBub3Qgc3VwcG9ydGVkLiBJZiB5b3UgZG8gaXQsCisgIHRoZSBzY3JlZW4gY29udGVudHMgbWF5IG5vdCByZWZsZWN0IHRoZSBjaGFuZ2UgdW50aWwgeW91IGdldCB0byB0aGUKKyAgbWVudSB3aGljaCB3YXMgY2hhbmdlZC4gV2hlbiB5b3UgZG8gZ2V0IHRvIHRoYXQgbWVudSwgeW91IG1heSBub3RpY2UKKyAgcGllY2VzIG9mIHRoZSBvbGQgbWVudSBzdGlsbCBvbiB0aGUgc2NyZWVuLgorCitJbiBjYXNlIG9mIENIRUNLQk9YRVM6IHRoZSByZXR1cm4gdmFsdWUgb2YgInZhbGlkIiBpcyBpZ25vcmVkLiBCZWNhdXNlLAordGhlIGhhbmRsZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb2YgY2hlY2tib3ggaWYgdGhlIHVzZXIgc2VsZWN0ZWQgdmFsdWUKK2lzIG5vdCBhcHByb3ByaWF0ZS4gb25seSB0aGUgdmFsdWUgb2YgInJlZnJlc2giIGlzIGhvbm9yZWQuIEluIHRoaXMgY2FzZQorYWxsIHRoZSBjYXZlYXRzIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGggYXBwbHkuCisKK21lbnUuaCBkZWZpbmVzIHR3byBpbnN0YW5jZXMgb2YgdF9oYW5kbGVyX3JldHVybgorQUNUSU9OX1ZBTElEIGFuZCBBQ1RJT05fSU5WQUxJRCBmb3IgY29tbW9uIHVzZS4gVGhlc2Ugc2V0IHRoZSB2YWxpZCBmbGFnCit0byAxIGFuZCAwIHJlc3BlY3RpdmVseSBhbmQgdGhlIHJlZnJlc2ggZmxhZyB0byAwLgorCiszLiBUaGluZ3MgdG8gbG9vayBvdXQgZm9yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitXaGVuIHlvdSBkZWZpbmUgdGhlIG1lbnUgc3lzdGVtLCBhbHdheXMgZGVjbGFyZSBpdCBpbiB0aGUgb3Bwb3NpdGUKK29yZGVyLCBpLmUuIGFsbCBsb3dlciBsZXZlbCBtZW51J3Mgc2hvdWxkIGJlIGRlZmluZWQgYmVmb3JlIHRoZSBoaWdoZXIKK2xldmVsIG1lbnVzLiBUaGlzIGlzIGJlY2F1c2UgaW4gb3JkZXIgdG8gZGVmaW5lIHRoZSBNQUlOTUVOVSwgeW91IG5lZWQKK3RvIGtub3cgdGhlIGluZGV4IGFzc2lnbmVkIHRvIGFsbCBpdHMgc3VibWVudXMuCisKKzQuIEFkZGl0aW9uYWwgTW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitZb3UgY2FuIG1ha2UgdXNlIG9mIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBtb2R1bGVzLCBpbiB3cml0aW5nIHlvdXIKK2hhbmRsZXJzLgorCisqIFBhc3N3b3JkcworKiBIZWxwCisKKzQuMSBQYXNzd29yZHMKKy0tLS0tLS0tLS0tLS0KK1RoaXMgbW9kdWxlIHdhcyB3cml0dGVuIGJ5IFRoLiBHZWJoYXJkdC4gVGhpcyBpcyBiYXNpY2FsbHkgYSBtb2RpZmljYXRpb24KK29mIHRoZSBERVMgY3J5cHQgZnVuY3Rpb24gb2J0YWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY2Ugb2YgdGhlCitvcmlnaW5hbCBjcnlwdCBmdW5jdGlvbiBvbiBDIGxpYnJhcmllcy4gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlCitkZWZpbmVkCisKKyAgaW5pdF9wYXNzd29yZHMoUFdERklMRSkKKyAgICAgIC8vIFJlYWQgaW4gdGhlIHBhc3N3b3JkIGRhdGFiYXNlIGZyb20gdGhlIGZpbGUKKyAgYXV0aGVudGljYXRlX3VzZXIodXNlcixwd2QpCisgICAgICAvLyBDaGVja3MgaWYgdXNlcixwd2QgaXMgdmFsaWQKKyAgaXNhbGxvd2VkKHVzZXIscGVybSkKKyAgICAgIC8vIENoZWNrcyBpZiB0aGUgdXNlciBoYXMgYSBzcGVjaWZpZWQgcGVybWlzc2lvbgorICBjbG9zZV9wYXNzd29yZHMoKQorICAgICAgLy8gVW5sb2FkcyBwYXNzd29yZCBkYXRhYmFzZSBmcm9tIG1lbW9yeQorCisgIFNlZSB0aGUgc2FtcGxlIHBhc3N3b3JkIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgZmlsZSBmb3JtYXQKKyAgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBwZXJtaXNzaW9ucy4KKworU2VlIGNvbXBsZXguYyBmb3IgYSBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhpcy4KKworNC4yIEhlbHAKKy0tLS0tLS0tCitUaGlzIGNhbiBiZSB1c2VkIHRvIHNldCB1cCBhIGNvbnRleHQgc2Vuc2l0aXZlIGhlbHAgc3lzdGVtLiBUaGUgZm9sbG93aW5nCitmdW5jdGlvbnMgYXJlIGRlZmluZWQKKworICAgaW5pdF9oZWxwKEhFTFBCQVNFRElSKQorICAgICAgIC8vIEluaXRpYWxpc2VzIHRoZSBoZWxwIHN5c3RlbS4gQWxsIGhlbHAgZmlsZXMgd2lsbCBiZSBsb2FkZWQKKyAgICAgICAvLyBmcm9tIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkLgorICAgcnVuaGVscHN5c3RlbShjb250ZXh0KQorICAgICAgIC8vIERpc3BsYXlzIHRoZSBjb250ZW50cyBvZiBIRUxQQkFTRURJUi9obHA8Y29udGV4dD4udHh0CisKK0luIG9yZGVyIHRvIGhhdmUgYSBmdW5jdGlvbmluZyBoZWxwIHN5c3RlbSwgeW91IGp1c3QgbmVlZCB0byBjcmVhdGUKK3RoZSBobHA8Tk5OTk4+LnR4dCBmaWxlcyBhbmQgaW5pdGlhbGl6ZSB0aGUgaGVscCBzeXN0ZW0gYnkgc3BlY2lmeWluZwordGhlIGJhc2UgZGlyZWN0b3J5LgorCitUaGUgZmlyc3QgbGluZSBvZiB0aGlzIGZpbGUgYXNzdW1lZCB0byBiZSB0aGUgdGl0bGUgb2YgdGhlIGhlbHAgc2NyZWVuLgorWW91IGNhbiB1c2UgXk4gYW5kIF5PIHRvIGNoYW5nZSBhdHRyaWJ1dGVzIGFic29sdXRlbHkgYW5kIHJlbGF0aXZlbHksCitpLmUuIFteT100NiAoaS5lLiBDdHJsLU8gZm9sbG93ZWQgYnkgY2hhcnMgNCBhbmQgNikgd2lsbCBzZXQgdGhlCithdHRyaWJ1dGUgdG8gNDYsIHdoaWxlIFteTl0wOCB3aWxsIFhPUiB0aGUgY3VycmVudCBhdHRyaWJ1dGUgd2l0aAorc3BlY2lmaWVkIG51bWJlciwgdGh1cyBpbiB0aGlzIGNhc2UgdGhlIGZpcnN0IFteTl0wOCB3aWxsIHR1cm4gb24KK2hpZ2hsaWdodGluZyBhbmQgdGhlIHNlY29uZCBvbmUgd2lsbCB0dXJuIGl0IG9mZi4KZGlmZiAtLWdpdCBhL2NvbTMyL2NtZW51L01FTlVfRk9STUFUIGIvY29tMzIvY21lbnUvTUVOVV9GT1JNQVQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjYjAyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NtZW51L01FTlVfRk9STUFUCkBAIC0wLDAgKzEsMjYyIEBACitBIC5tZW51IGZpbGUgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgYmFzaWMgbWVudSBzdHJ1Y3R1cmVzIHdoaWNoIGNhbiBiZSBjb252ZXJ0ZWQKK2ludG8gQyBjb2RlIHdoaWNoIGNhbiB0aGVuIGJlIGNvbXBpbGVkIGludG8gYSAuYzMyIGZpbGUgZm9yIHVzZSB3aXRoIFNZU0xJTlVYLgorVGhlIGZvcm1hdCBvZiBhIC5tZW51IGZpbGUgaXMgc2ltaWxhciB0byBhbiBpbmkgZmlsZSwgYnV0IHdpdGggaW1wb3J0YW50CitkaWZmZXJlbmNlcy4KKworTGluZXMgc3RhcnRpbmcgd2l0aCAjIGFuZCA7IGFyZSB0cmVhdGVkIGFzIGNvbW1lbnRzLiBCbGFuayBsaW5lcyBhcmUgdXNlZCB0bworc2VwYXJhdGUgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lIG1lbnUgaXRlbSBmcm9tIGFub3RoZXIuIE11bHRpcGxlIGJsYW5rIGxpbmVzIGFyZQorZXF1aXZhbGVudCB0byBhIHNpbmdsZSBvbmUuICBJbiBvdGhlciBjb250ZXh0cyBCbGFuayBsaW5lcyBhcmUgbm90IHNpZ25pZmljYW50LgorCitNZW51cworLS0tLS0KK0VhY2ggbWVudSBkZWNsYXJhdGlvbiBzdGFydHMgd2l0aCBhIGxpbmUgY29udGFpbmluZyB0aGUgbmFtZSBvZiBtZW51IGluIFsgXS4KK1RoaXMgaXMgdGhlICJuaWNrbmFtZSIgb2YgdGhlIG1lbnUgYW5kIHNob3VsZCBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBtZW51cy4KK1RoaXMgaXMgbm90IHZpc2libGUgdG8gdGhlIHVzZXIgb2YgdGhlIG1lbnUgc3lzdGVtLiBUaGUgaW5pdGlhbCBtZW51IG11c3QKK2JlIGNhbGxlZCAibWFpbiIKKworVGhlIG1lbnUgZGVjbGFyYXRpb24gaXMgZm9sbG93ZWQgYnkgbGluZXMgd2hpY2ggc2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtZW51LgorVGhpcyBpcyBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUgYW5kIGZvbGxvd2VkIGJ5IGRlY2xhcmF0aW9uIG9mIG1lbnUgaXRlbXMgaW4KK3RoYXQgbWVudS4KKworQWxsIGxpbmVzIHdoaWNoIG9jY3VyIGJlZm9yZSB0aGUgZmlyc3QgbWVudSBkZWNsYXJhdGlvbiBpcyBjb25zaWRlcmVkIGFzCithIGdsb2JhbCBkZWNsYXJhdGlvbi4KKworQWJzdHJhY3QgRm9ybWF0CistLS0tLS0tLS0tLS0tLS0KKworVGhlIG92ZXJhbGwgZm9ybWF0IHNob3VsZCBsb29rIGxpa2UgdGhpcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPEdMT0JBTCBTRVRUSU5HUz4KKworW21lbnVuYW1lMV0KKworPE1FTlUgU0VUVElOR1M+CisKKzxJVEVNIDE+CisKKy4uLgorCis8SVRFTSBOPgorCitbbWVudW5hbWUyXQorCis8TUVOVSBTRVRUSU5HUz4KKworPElURU0gQT4KKworPElURU0gQj4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHTE9CQUwgU0VUVElOR1MKKy0tLS0tLS0tLS0tLS0tLQorVGhlIGZvbGxvd2luZyBnbG9iYWwgc2V0dGluZ3MgYXJlIG5vdyBzdXBwb3J0ZWQuIE1hbnkgb2YgdGhlIGtleXdvcmRzCithY2NlcHQgd2hhdCB3ZSBjYWxsIGEgIkRPVCBDT01NQU5EIiBhcyBhcmd1bWVudC4gU2ltcGx5IHB1dCB0aGV5IGFyZQoraW5zdHJ1Y3Rpb25zIHRvIHRoZSBtZW51IHN5c3RlbSB0byBwZXJmb3JtIGNlcnRhaW4gYWN0aW9ucy4KK1RoZSBzeW50YXggYW5kIHNlbWFudGljcyBvZiBET1QgQ09NTUFORFMgYXJlIGdpdmVuIGxhdGVyIGluIHRoZSBzZWN0aW9uCit0aXRsZWQgIkRPVCBDT01NQU5EUyIuCisKK3ZpZGVvbW9kZTogKGRlZmF1bHQgMHhGRikgIFtVc2Ugd2l0aCBjYXJlXQorICAgVGhlIHRleHRtb2RlIGluIHdoaWNoIHRoZSB3aG9sZSBtZW51IHN5c3RlbSBzaG91bGQgb3BlcmF0ZS4KKyAgIE11c3QgYmUgYSBudW1iZXIgKHVzZSAweCBub3RhdGlvbiBmb3IgaGV4YWRlY2ltYWwpLgorICAgTG9va3VwIFJhbHBoIEJyb3duIEludGVycnVwdCBMaXN0IGFuZCBzZWFyY2ggZm9yIFZpZGVvIE1vZGUKKyAgIHRvIGZpbmQgYSBudW1iZXIgdG8gcHV0IGhlcmUuCisKKyAgIHNldHRpbmcgdG8gMHhGRiB3aWxsIG1lYW4sIG1lbnUgc3lzdGVtIHdpbGwgdXNlIHRoZSBjdXJyZW50CisgICB2aWRlbyBtb2RlLgorCit0aXRsZToKKyAgIFRoZSB0aXRsZSBvZiB0aGUgd2hvbGUgbWVudSBzeXN0ZW0KKwordG9wLCBsZWZ0LCBib3QsIHJpZ2h0OiAoZGVmYXVsdCAwLDAsMjEsNzkpCisgICBUaGUgYXJlYSBvZiB0aGUgc2NyZWVuIHVzZWQgYnkgdGhlIG1lbnUgc3lzdGVtLiBUaGUgcmVtYWluaW5nCisgICBwYXJ0IG9mIHRoZSBzY3JlZW4gY2FuIGJlIHVzZWQgYnkgdGhlIHVzZXIgZm9yIGFueXRoaW5nLgorCitoZWxwZGlyOiAoZGVmYXVsdCAvaXNvbGludXgvaGVscCkKKyAgIExvY2F0aW9uIG9mIHRoZSBkaXJlY3Rvcnkgd2hlcmUgaGVscCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQuIFRoZQorICAgaGVscCBmaWxlcyBtdXN0IGJlIGNhbGxlZCAiaGxwTk5OTk4udHh0IiB3aGVyZSBOTk5OTiBpcyB0aGUgaGVscGlkLgorCitwd2RmaWxlOiAoZGVmYXVsdCAvaXNvbGludXgvcGFzc3dkKQorICAgVGhlIG5hbWUgb2YgdGhlIHBhc3N3b3JkIGZpbGUgd2hpY2ggY29udGFpbnMgdXNlciwgcGFzc3dvcmQgYW5kIHBlcm1pc3Npb25zCisgICBTZWUgInBhc3N3ZCIgZmlsZSBmb3IgZGV0YWlscyByZWdhcmRpbmcgZm9ybWF0IG9mIHRoaXMgZmlsZQorCitlZGl0cm93OiAoZGVmYXVsdCAyMykKKyAgIHRoZSByb3cgb24gdGhlIHNjcmVlbiB3aGVyZSBvbmUgY2FuIGVkaXQgdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBtdXN0CisgICBiZSBvdXRzaWRlIHRoZSBtZW51IGFyZWEuIFNldCB0aGlzIHRvIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGRpc2FibGUKKyAgIGVkaXRpbmcgdGhlIGNvbW1hbmQgbGluZS4gSW4gY2FzZSBvZiBhdXRoZW50aWNhdGVkIHVzZXJzLCB0aGUgY3VycmVudAorICAgdXNlciBtdXN0IGhhdmUgImVkaXRjbWQiIHBlcm1pc3Npb25zIHRvIGVkaXQgdGhlIGNvbW1hbmQgbGluZQorCitwd2Ryb3c6IChkZWZhdWx0IDIzKQorICAgVGhlIHJvdyBvbiB0aGUgc2NyZWVuIHVzZWQgZm9yIHVzZXIgYXV0aGVudGljYXRpb24uIE11c3QgYmUgb3V0c2lkZQorICAgbWVudSBhcmVhIChjYW4gYmUgc2FtZSBhcyBlZGl0cm93KS4gU2V0IHRvIG5lZ2F0aXZlIHRvIGRpc2FibGUKKyAgIHVzZXIgYXV0aGVudGljYXRpb24KKworc2tpcGlmOiAoZGVmYXVsdCAwKQorICAgVGhlIE9SIG9mIHRoZSBiaXRzIGluIHRoZSBTaGlmdC1mbGFncyBhbnkgb2Ygd2hpY2ggY2FuIGNhdXNlIHRoZSBtZW51IHN5c3RlbQorICAgdG8gYmUgc2tpcHBlZCBhbGwgdG9nZXRoZXIgKDAgbWVhbnMgbWVudSBzeXN0ZW0gYWx3YXlzIHJ1bnMpLiBJdCBjYW4gYWxzbworICAgYmUgYSBjb21iaW5hdGlvbiBvZiAiQWx0IiwiQ3RybCIsIlNoaWZ0IiwiQ2FwcyIsIklucyIsIlNjcm9sbCIuCisgICBXaGVuIG1lbnUgc3lzdGVtIHN0YXJ0cyBpdCBjaGVja3MgaWYgYW55IG9mIHRoZSBzcGVjaWZpZWQga2V5cyBhcmUgT24vcHJlc3NlZC4KKyAgIElmIHRydWUsIHRoZSBzeXN0ZW0gZXhpdHMgaW1tZWRpYXRlbHkgYW5kIGV4ZWN1dGVzIHRoZSBza2lwY21kLgorCisgICBlLmcuIHNldHRpbmcgaXQgdG8gInNoaWZ0LWFsdC1jYXBzIiBtZWFucyBtZW51IHdpbGwgYmUgc2tpcHBlZCBpZiBhbHQgT1Igc2hpZnQKKyAgIGlzIHByZXNzZWQgT1IgY2FwcyBpcyBvbi4gc2V0dGluZyB0byAiMCIgbWVhbnMgbWVudSB3aWxsIGFsd2F5cyBydW4uCisKK3NraXBjbWQ6IChkZWZhdWx0IC5leGl0KQorICAgdmFsaWQgdGVybWluYWwgY29tbWFuZHM6IC5leGl0IC5pZ25vcmUgb3IgYW55IHN5c2xpbnV4IGNvbW1hbmQKKyAgIGNvbW1hbmQgdG8gZXhlY3V0ZSBpZiBtZW51IHN5c3RlbSBpcyBza2lwcGVkLiBUaGlzIG11c3QgYmUgYSBub24tdHJpdmlhbAorICAgc3lzbGludXggY29tbWFuZCBpZiBza2lwY29uZG4gaXMgbm90ICIwIi4gIi5leGl0IiBtZWFucyBtZW51IHN5c3RlbQorICAgcXVpdHMgYmFjayB0byB0aGUgYm9vdCBwcm9tcHQuCisKK3N0YXJ0ZmlsZTogKGRlZmF1bHQgIiIpCisgICBpZiBub24tZW1wdHkgdGhlIHN5c3RlbSB3aWxsIGRpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBiZWZvcmUgbGF1bmNoaW5nCisgICB0aGUgbWVudXN5c3RlbS4gVGhpcyBoYXBwZW5zIG9ubHkgaWYgdGhlIG1lbnVzeXN0ZW0gaXMgbm90IHNraXBwZWQuIENhbiBiZSB1c2VkCisgICB0byBkaXNwbGF5IGxpY2Vuc2luZywgdXNhZ2Ugb3Igd2VsY29tZSBtZXNzYWdlcy4gQSBmaWxlIHdpdGggZ2l2ZW4gbmFtZQorICAgaXMgZXhwZWN0ZWQgdG8gYmUgZm91bmQgaW4gdGhlIGhlbHBkaXIgZGlyZWN0b3J5LgorCitleGl0Y21kOiAoZGVmYXVsdCAuZXhpdCkKKyAgIHZhbGlkIHRlcm1pbmFsIGNvbW1hbmRzOiAuZXhpdCAucmVwZWF0IG9yIGFueSBzeXNsaW51eCBjb21tYW5kCisgICBUaGUgZGVmYXVsdCBjb21tYW5kIHRvIGV4ZWN1dGUgd2hlbiB1c2VyIHF1aXRzIHRoZSBtZW51IHN5c3RlbS4KKworZXhpdGNtZHJvb3Q6IChkZWZhdWx0ID1leGl0Y21kKQorICAgU2FtZSBhcyBleGl0Y21kIGV4Y2VwdCBhcHBsaWVzIHdoZW4gY3VycmVudCB1c2VyIGhhcyAicm9vdCIgcHJpdmlsZWdlcy4gSWYgbm90CisgICBzcGVjaWZpZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUgYXMgZXhpdGNtZAorCit0aW1lb3V0OiAoZGVmYXVsdCAzMDAwKQorICAgVGhlIGFtb3VudCBvZiB0aW1lIChpbiBtdWx0aXBsZSBvZiAwLjEgc2Vjb25kcykgdG8gd2FpdCBmb3IgdXNlciBrZXlwcmVzcy4gSWYgbm8KKyAgIGtleSBwcmVzc2VkIGZvciBzcGVjaWZpZWQgZHVyYXRpb24gdGhlbiB0aGUgdGltZW91dGNtZCBpcyBleGVjdXRlZC4KKwordG90YWx0aW1lb3V0OiAoZGVmYXVsdCAwKQorICAgVGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIChpbiBtdWx0aXBsZXMgb2YgMC4xIHNlY29uZHMpIHRoZSBzeXN0ZW0gd2lsbCB3YWl0IGZvcgorICAgdXNlciB0byBtYWtlIGEgZGVjaXNpb24uIElmIG5vIGRlY2lzaW9uIGhhcyBiZWVuIG1hZGUgaW4gdGhlIHNwZWNpZmllZCBkdXJhdGlvbgorICAgdG90YWx0aW1lb3V0Y21kIHdpbGwgYmUgZXhlY3V0ZWQKKworICAgTk9URTogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSB0aW1lIHNwZW50IGJyb3dzaW5nIHRoZSBoZWxwIHN5c3RlbSBvcgorICAgdGhlIHRpbWUgdGFrZW4gZm9yIHRoZSB1c2VyIHRvIGVudGVyIGhpcy9oZXIgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMuCisKK3RpbWVvdXRjbWQ6IChkZWZhdWx0IC5iZWVwKQorICAgdmFsaWQgdGVybWluYWwgY29tbWFuZHM6IC53YWl0IC5lbnRlciAuZXNjYXBlIG9yIGFueSBzeXNsaW51eCBjb21tYW5kCisgICBjb21tYW5kIHRvIGV4ZWN1dGUgd2hlbiB3ZSB0aW1lb3V0IHdhaXRpbmcgZm9yIHVzZXIgaW5wdXQuIFRoZSBjb21tYW5kcworICAgLmVudGVyIGFuZCAuZXNjYXBlIHRlbGwgdGhlIG1lbnUgc3lzdGVtIHRvIHByZXRlbmQgdGhlIHVzZXIgdHlwZWQgRU5URVIgb3IKKyAgIEVTQ0FQRSBvbiB0aGUga2V5Ym9hcmQsIHdoaWxlIC53YWl0IHRlbGxzIHRoZSBtZW51c3lzdGVtIHRvIHdhaXQgZm9yIG9uZQorICAgbW9yZSB0aW1lIHBlcmlvZAorCit0b3RhbHRpbWVvdXRjbWQ6IChkZWZhdWx0IC53YWl0KQorICAgY2hvaWNlcyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRpbWVvdXRjbWQKKworTUVOVSBTRVRUSU5HUworLS0tLS0tLS0tLS0tLQorCit0aXRsZTogKG11c3QgYmUgc3BlY2lmaWVkKQorICAgVGl0bGUgb2YgdGhpcyBtZW51CisKK3Jvdyxjb2w6IFtVc2FnZSBub3QgcmVjb21lbmRlZF0KKyAgIHBvc2l0aW9uIGluIHNjcmVlbiB3aGVyZSB0aGlzIG1lbnUgc2hvdWxkIGJlIHBsYWNlZC4gQnkgZGVmYXVsdCB0aGUKKyAgIHN5c3RlbSB3aWxsIGNob29zZSBhbiBhcHByb3ByaWF0ZSBsb2NhdGlvbi4KKworSVRFTSBBVFRSSUJVVEVTCistLS0tLS0tLS0tLS0tLS0KKworaXRlbToKKyAgICAgIFRoZSBzdHJpbmcgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBDaGFyYWN0ZXJzIGVuY2xvc2VkIGluIDwgPiBhcmUgaGlnaGxpZ2h0ZWQuCisKK3Nob3J0Y3V0OiAoZGVmYXVsdCAtMSkgdmFsaWQgdmFsdWVzIEEtWmEtejAtOSBvciAtMSBbVXNhZ2Ugbm90IHJlY29tbWVuZGVkXQorICAgICAgU2V0cyB0aGUgc2hvcnRjdXQga2V5IGZvciB0aGlzIGl0ZW0uIElmIHNldCB0byAtMSwgdGhlIHN5c3RlbSBzY2FucyBmb3IgdGhlIGZpcnN0CisgICAgICBoaWdobGlnaHRlZCBsZXR0ZXIgaW4gdGhlIGdpdmVuIHJhbmdlIGFuZCBzZXRzIHRoYXQgYXMgdGhlIHNob3J0Y3V0IGtleS4KKworaW5mbzogKGRlZmF1bHQgc2FtZSBhcyBkYXRhKQorICAgICAgQWRkaXRpb25hbCB0ZXh0dWFsIGluZm9ybWF0aW9uIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGJhcgorCit0eXBlOgorICAgICAgdGhlIHR5cGUgb2YgZW50cnkgdGhpcyBpdGVtIHJlcHJlc2VudHMuIFRoaXMgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgIHJ1bjogICAgICAgY2hvb3NpbmcgdGhpcyB3aWxsIHJ1biBzb21ldGhpbmcgaW4gU1lTTElOVVgKKyAgICAgICAgICAgICAgICAgdXNlIGRhdGEgdG8gc3BlY2lmeSB0aGUgYWN0dWFsIGNvbW1hbmQgdG8gZXhlY3V0ZQorICAgICAgZXhpdG1lbnU6ICBleGl0IHRvIHBhcmVudCBtZW51CisgICAgICBzdWJtZW51OiAgIGNob29zaW5nIHdpbGwgb3BlbiB1cCBzdWJtZW51CisgICAgICAgICAgICAgICAgIHVzZSBkYXRhIHRvIHNwZWNpZnkgdGhlICJuaWNrbmFtZSIgb2YgdGhlIG1lbnUKKyAgICAgICAgICAgICAgICAgd2hpY2ggc2hvdWxkIGNvbWUgaGVyZQorICAgICAgc2VwOiAgICAgICBQb3NpdGlvbiBhIHNlcGFyYXRvciBoZXJlCisgICAgICBpbmFjdGl2ZTogIG1lbnUgaXRlbSBpcyBkaXNhYmxlZAorICAgICAgY2hlY2tib3g6ICB0aGlzIGlzIGEgY2hlY2tib3gKKyAgICAgICAgICAgICAgICAgdXNlIHN0YXRlIHRvIHNldCBpbml0aWFsIHN0YXRlCisgICAgICBpbnZpc2libGU6IFVzZXIgZG9lcyBub3Qgc2VlIHRoaXMgaXRlbQorICAgICAgcmFkaW9pdGVtOiBPbmUgY2hvaWNlIGluIGEgcmFkaW9tZW51CisgICAgICByYWRpb21lbnU6IEFsbG93IHVzZXIgdG8gY2hvb3NlIG9uZSBvZiBtYW55IGNob2ljZXMKKyAgICAgICAgICAgICAgICAgKGluaXRpYWwgY2hvaWNlIGlzIGFsd2F5cyBOVUxMKQorICAgICAgbG9naW46ICAgICBTZWxlY3RpbmcgdGhpcyB3aWxsIGFsbG93IHVzZXIgdG8gbG9naW4gdG8gc3lzdGVtCisKK2RhdGE6CisgICAgICBmb3IgcnVuIGl0ZW1zLCB0aGUgc3lzbGludXggY29tbWFuZCB0byBleGVjdXRlCisgICAgICBmb3Igc3VibWVudXMgYW5kIHJhZGlvbWVudXMsIG5pY2tuYW1lIG9mIG1lbnUKKyAgICAgIGZvciBjaGVja2JveGVzLCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8ga2VybmVsIGNvbW1hbmQgbGluZSAoaWYgc2V0KQorICAgICAgZm9yIHJhZGlvaXRlbXMsIHN0cmluZyB0byBiZSBhZGRlZCB0byBrZXJuZWwgY29tbWFuZCBsaW5lIChpZiBjaG9zZW4pCisKK2lwYXBwZW5kOgorICAgICAgaXBhcHBlbmQgZmxhZyB0byBwYXNzIHRvIFBYRUxJTlVYIChoYXJtbGVzcyBmb3Igb3RoZXIgdmFyaWFudHMgb2YgU1lTTElOVVgpCisgICAgICBTZWUgc3lzbGludXggZG9jdW1lbnRhdGlvbiBmb3IgbWVhbmluZyBvZiB0aGUgRkxBR1MKKworaGVscGlkOiAoZGVmYXVsdCA2NTUzNSB3aGljaCBpcyBub3QgYSB2YWxpZCBpZCkKKyAgICAgIGFzc29jaWF0ZXMgYSBjb250ZXh0IGZvciB0aGUgaGVscCBzeXN0ZW0uCisKK3N0YXRlOiAoZGVmYXVsdCAwKQorICAgICAgSW5pdGlhbCBzdGF0ZSBvZiBhIGNoZWNrYm94IChmb3Igb3RoZXIgaXRlbXMgdGhpcyBoYXMgbm8gbWVhbmluZykKKworcGVybXM6IChkZWZhdWx0ICIiKQorICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gd2hpY2ggdXNlciBtdXN0CisgICAgICBoYXZlIHRvIGFjdGl2YXRlIHRoaXMgaXRlbS4gRm9yIGVnLiBpZiB0aGlzIGl0ZW0gaXMgYSBzdWJtZW51CisgICAgICB0aGVuIHVzZXIgbmVlZHMgdGhlIHBlcm1pc3Npb24gaW4gb3JkZXIgdG8gb3BlbiB0aGUgc3VibWVudQorCithcmdzbWVudTogKGRlZmF1bHQgIiIpCisgICAgICBOYW1lIG9mIHRoZSBtZW51IHRvIGJlIHNjYW5uZWQgZm9yIHNldHRpbmcgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8KKyAgICAgIHBhc3MgdG8gY29tbWFuZCBsaW5lIHdoZW4gdGhpcyBpdGVtIGlzIGNob3NlbiBmb3IgZXhlY3V0aW9uLiBTdWJtZW51cworICAgICAgb2Ygc3BlY2lmaWVkIG1lbnUgYXJlIGFsc28gc2Nhbm5lZC4gT25seSBjaGVja2JveGVzIGFuZCByYWRpb21lbnUncworICAgICAgYXJlIHNjYW5uZWQuIEl0ZW1zIG9mIG90aGVyIHR5cGUgaW4gdGhpcyBtZW51IGlzIHNpbGVudGx5IGlnbm9yZWQuCisKKworRE9UIENPTU1BTkRTCistLS0tLS0tLS0tLS0KK0RvdCBjb21tYW5kcyBhcmUgYmFzaWNhbGx5IGluc3RydWN0aW9ucyB0byB0aGUgbWVudSBzeXN0ZW0gdG8gZG8gY2VydGFpbiB0aGluZ3MuCisKK0EgInNpbmdsZSBjb21tYW5kIiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZworCitbTlRdIEEgc3lzbGludXggY29tbWFuZCAoYW55IERPVCBjb21tYW5kIG5vdCBzdGFydGluZyB3aXRoIGEgIi4iIGlzIGFzc3VtZWQgdG8gYmUgdGhpcykKK1tOVF0gLmJlZXAgW25dCitbTlRdIC5oZWxwIDxmaWxlPgorW05UXSAubm9wCitbVF0gIC5leGl0IG9yIC5xdWl0IChlcXVpdmFsZW50KQorW1RdICAucmVwZWF0IG9yIC53YWl0IG9yIC5pZ25vcmUgKGFsbCB0aHJlZSBhcmUgZXF1aXZhbGVudCkKKworQSBkb3QgY29tbWFuZCBpcyBhIHNlcXVlbmNlIG9mICJzaW5nbGUgY29tbWFuZHMiIHNlcGFyYXRlZCBieSBhICIlIi4gV2hlbiBhIGRvdCBjb21tYW5kCitpcyBleGVjdXRlZCB0aGUgc3lzdGVtIGV4ZWN1dGVzIGFsbCB0aGUgZ2l2ZW4gInNpbmdsZSBjb21tYW5kcyIgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4KK0FsbCB0aGUgY29tbWFuZHMgbWFya2VkICJbVF0iIGFyZSB0ZXJtaW5hbCBjb21tYW5kcywgaS5lLiB3aGVuIHRoZSBzeXN0ZW0gZW5jb3VudGVycworc3VjaCBhIGNvbW1hbmQgaXQgc3RvcHMgcHJvY2Vzc2luZyB0aGUgZG90IGNvbW1hbmQgYW5kIHJldHVybnMgdGhlIHRlcm1pbmFsIGNvbW1hbmQKK3doaWNoIGNhdXNlZCB0aGUgdGVybWluYXRpb24gdG8gdGhlIGNhbGxlciAod2hvIHVzdWFsbHkgaW50ZXJwcmV0cyB0aGUgY29tbWFuZAorYXBwcm9wcmlhdGVseSkuCisKK0FsbCBjb21tYW5kcyBtYXJrZWQgd2l0aCBbTlRdIGFyZSBub24tdGVybWluYWwgY29tbWFuZHMsIGkuZS4gb25jZSB0aGVzZSBjb21tYW5kcyBhcmUKK3Byb2Nlc3NlZCB0aGUgc3lzdGVtIGNvbnRpbnVlcyB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgInNpbmdsZSBjb21tYW5kcyIgc3BlY2lmaWVkIGluCit0aGUgIkRPVCBDT01NQU5EIi4KKworTm90ZTogVGhlIGNhc2Ugb2YgYSBzeXNsaW51eCBjb21tYW5kIGlzIHRyaWNreS4gV2hlbiBleGVjdXRlZCwgdGhlIGNvbW1hbmQgc2hvdWxkIG5ldmVyIHJldHVybgorKGlmIHRoZSBzcGVjaWZpZWQga2VybmVsIGV4aXN0cykgc28gdGhlIGZhY3QgdGhhdCB3ZSBjb25zaWRlciBpdCBhIFtOVF0gc2hvdWxkIGJlIHRha2VuIHdpdGgKK2EgcGluY2ggb2Ygc2FsdC4gSG93ZXZlciwgaWYgdGhlIHN5c2xpbnV4IGNvbW1hbmQgZG9lcyByZXR1cm4gKGluIGNhc2Ugb2Ygbm8ga2VybmVsKSwgdGhlbgorcmVtYWluaW5nICJzaW5nbGUgY29tbWFuZHMiIGFyZSBwcm9jZXNzZWQuIEluIHBhcnRpY3VsYXIgImtlcjEgYXJnMSAlIGtlcjIgYXJnMiAlIGtlcjMgYXJncyIKK2hhcyB0aGUgZWZmZWN0IG9mIGV4ZWN1dGluZyB0aGUgZmlyc3Qga2VybmVsIHdoaWNoIGV4aXN0cworCisubm9wOgorICAgRG9lcyBub3RoaW5nLgorLmJlZXA6CisgICAuYmVlcCBbbl0gcHJvZHVjZXMgYSBiZWVwIG4gdGltZXMuIG4gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDkuIElmIG5vdCBzcGVjaWZpZWQgbj0xLgorICAgKGhlbmNlIC5iZWVwIDAgaXMgZXF1aXZhbGVudCB0byAubm9wKQorLmhlbHA6CisgICAuaGVscCA8ZmlsZT4KKyAgIERpc3BsYXlzIHRoZSBoZWxwIGZpbGUgPGZpbGU+IHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgaW4gdGhlICJoZWxwIiBkaXJlY3RvcnkuIEl0cyBuYW1lCisgICBkb2VzIG5vdCBoYXZlIHRvIGJlIGluIHRoZSBmb3JtICJobHBOTk5OTi50eHQiIChhcyByZXF1aXJlZCBieSB0aGUgY29udGV4dCBzZW5zaXRpdmUgaGVscCkuCisgICBFeGVjdXRpbmcgdGhpcyBjb21tYW5kIHdpbGwgbWVhbiB0aGUgYXBwcm9wcmlhdGUgaGVscCBzY3JlZW4gaXMgZGlzcGxheWVkIHRpbGwgdGhlIHVzZXIgaGl0cworICAgRVNDQVBFCisKK1RoZSBtZWFuaW5nIG9mIHRoZSBUZXJtaW5hbCBjb21tYW5kcyBjYW4gdmFyeSB3aXRoIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIEZvciBleGFtcGxlLAorYSAiLmVudGVyIiBvciAiLmVzY2FwZSIgZG9lcyBub3QgaGF2ZSBhbnkgbWVhbmluZyBpbiB0aGUgIm9uZXJyb3JjbWQiIGNvbnRleHQgYnV0IGl0IGhhcyBhIG1lYW5pbmcKK2luIHRoZSAib250aW1lb3V0IiBjb250ZXh0LiBJbiBjYXNlIHRoZSB1c2VyIGdpdmVzIGEgVGVybWluYWwgY29tbWFuZCB3aGljaCBkb2VzIG5vdCBtYWtlIHNlbnNlLCBpdAoraXMgdXB0byB0aGUgY29kZSAoaW4gdGhpcyBjYXNlIGFkdl9tZW51LnRwbCkgdG8gZG8gd2hhdCBpdCBwbGVhc2VzLgpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvTWFrZWZpbGUgYi9jb20zMi9jbWVudS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmI1MjMxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvTWFrZWZpbGUKQEAgLTAsMCArMSw3NCBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMjIE1ha2VmaWxlIGZvciB0aGUgY29tcGxleCBtZW51IHN5c3RlbQorIyMKKworTk9HUEwgOj0gMQorCitMSUJTICA9IGxpYm1lbnUvbGlibWVudS5jMzIgXAorICAgICAgICAkKG9iamRpcikvY29tMzIvbGlidXRpbC9saWJ1dGlsLmMzMiBcCisgICAgICAgICQob2JqZGlyKS9jb20zMi9saWIvbGliY29tMzIuYzMyCisKK0NfTElCUwkgID0gbGlibWVudS9saWJtZW51LmMzMgorCitWUEFUSCA9ICQoU1JDKQoraW5jbHVkZSAkKE1BS0VESVIpL2VsZi5taworCitDRkxBR1MJICArPSAtSSQoU1JDKS9saWJtZW51CisKK0xJQk1FTlUgPSBsaWJtZW51L3N5c2xueC5vIGxpYm1lbnUvY29tMzJpby5vIGxpYm1lbnUvdHVpLm8gXAorCWxpYm1lbnUvbWVudS5vIGxpYm1lbnUvcGFzc3dvcmRzLm8gbGlibWVudS9kZXMubyBsaWJtZW51L2hlbHAubyBcCisJJChvYmpkaXIpL2NvbTMyL2xpYnV0aWwvbGlidXRpbC5jMzIgJChvYmpkaXIpL2NvbTMyL2xpYi9saWJjb20zMi5jMzIKKworQ01FTlVTID0gJChwYXRzdWJzdCAlLmMsJS5jMzIsJCh3aWxkY2FyZCAkKFNSQykvKi5jKSkKK0lNRU5VUyA9ICQocGF0c3Vic3QgJS5tZW51LCUuYzMyLCQod2lsZGNhcmQgJChTUkMpLyoubWVudSkpCisKK01FTlVTID0gJChMSUJTKSAkKHN1YnN0ICQoU1JDKS8sLCQoQ01FTlVTKSAkKElNRU5VUykpCisKKy5TVUZGSVhFUzogLlMgLmMgLm8gLmVsZiAuYzMyIC5tZW51CisKKy5QUkVDSU9VUzogJS5jCislLmM6ICUubWVudSBhZHZfbWVudS50cGwKKwkkKFBZVEhPTikgJChTUkMpL21lbnVnZW4ucHkgLS1pbnB1dD0kPCAtLW91dHB1dD0kQCAtLXRlbXBsYXRlPSQoU1JDKS9hZHZfbWVudS50cGwKKworYWxsOgltYWtlb3V0cHV0ZGlycyBtZW51cworCittYWtlb3V0cHV0ZGlyczoKKwlAbWtkaXIgLXAgJChPQkopL2xpYm1lbnUKKworbGlibWVudS9saWJtZW51LmVsZjogJChMSUJNRU5VKQorCSQoTEQpIC1zaGFyZWQgJChMREZMQUdTKSAtc29uYW1lICQocGF0c3Vic3QgJS5lbGYsJS5jMzIsJChARikpIFwKKwkJLW8gJEAgJF4KKwordGlkeSBkaXN0OgorCXJtIC1mICoubyAqLmxvICoubHN0ICouZWxmICovKi5vICovKi5lbGYgLiouZCAqLy4qLmQKKworbGliY2xlYW46CisJcm0gLWYgbGlibWVudS8qLmMzMgorCitjbGVhbjogdGlkeSBtZW51Y2xlYW4KKwlybSAtZiAqLmxzcyAqLmNvbQorCittZW51Y2xlYW46CisJcm0gLWYgJChwYXRzdWJzdCAlLm1lbnUsJS5jLCQod2lsZGNhcmQgKi5tZW51KSkKKworc3BvdGxlc3M6IGNsZWFuIGxpYmNsZWFuIG1lbnVjbGVhbgorCXJtIC1mICp+IFwjKiAqLmMzMgorCittZW51czogJChNRU5VUykKKworaW5zdGFsbDoJIyBEb24ndCBpbnN0YWxsIHNhbXBsZXMKKworLWluY2x1ZGUgLiouZCAqLy4qLmQKZGlmZiAtLWdpdCBhL2NvbTMyL2NtZW51L1JFQURNRSBiL2NvbTMyL2NtZW51L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg1ZDJmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvUkVBRE1FCkBAIC0wLDAgKzEsOTUgQEAKKyAgICAgICAgICBUZXh0IFVzZXIgSW50ZXJmYWNlIHVzaW5nIGNvbWJvb3QKKyAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyBhIG1lbnUgc3lzdGVtIHdyaXR0ZW4gYnkgTXVyYWxpIEtyaXNobmFuIEdhbmFwYXRoeSBhbmQgcG9ydGVkCitmcm9tIE9wZW5XYXRjb20gdG8gZ2NjIGJ5IEhQQS4gSXQgaXMgY3VycmVudGx5IGJlaW5nIG1haW50YWluZWQgYnkgdGhlCitvcmlnaW5hbCBhdXRob3IuCisKK1RvIGNvbmZpZ3VyZSB0aGUgbWVudXMsIHlvdSBuZWVkIHRvIHNldCB1cCBhIG1lbnUgY29uZmlndXJhdGlvbiBmaWxlCit0byBoYXZlIHRoZSBtZW51IGl0ZW1zIHlvdSBkZXNpcmUsIHRoZW4gYnVpbGQgdGhlIG1lbnUgc3lzdGVtIHVzaW5nCittYWtlLiAgWW91IGNhbiB1c2UgZWl0aGVyIHNpbXBsZS5jIG9yIGNvbXBsZXguYyBhcyBhIHN0YXJ0aW5nIHBvaW50Citmb3IgeW91ciBvd24gbWVudSBjb25maWd1cmF0aW9uIGZpbGU7IElmIHlvdXIgbWVudSBzeXN0ZW0gaXMgb25seSBnb2luZwordG8gaGF2ZSBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhpbmdzIHdoaWNoIGNhbiBiZSBleGVjdXRlZCBkaXJlY3RseSwKK3RoZW4geW91IGNhbiBjcmVhdGUgYSBmaWxlIGluICIubWVudSIgZm9ybWF0IGluc3RlYWQgb2YgdGhlIEMgY29kZS4KKworU2VlIE1FTlVfRk9STUFUIGZvciB0aGUgc3ludGF4IG9mIC5tZW51IGZpbGVzCisKK1RoZSByZXN1bHRpbmcgY29kZSBpcyBhIDMyLWJpdCBDT01CT09UIGNvZGUsIGFuZCBoZW5jZSBjYW4gYmUgZXhlY3V0ZWQKK29ubHkgdW5kZXIgc3lzbGludXguIFlvdSBjYW4gdXNlIHRvb2xzIGxpa2UgYm9jaHMgdG8gaGVscCBkZWJ1ZyB5b3VyCitjb2RlLgorCitNZW51IEZlYXR1cmVzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYXJlOgorKiBtZW51IGl0ZW1zLAorKiBzdWJtZW51cywKKyogZGlzYWJsZWQgaXRlbXMsCisqIGNoZWNrYm94ZXMsCisqIGludmlzaWJsZSBpdGVtcyAodXNlZnVsIGZvciBkeW5hbWljIG1lbnVzKSwgYW5kCisqIFJhZGlvIG1lbnVzLAorKiBDb250ZXh0IHNlbnNpdGl2ZSBoZWxwCisqIEF1dGhlbnRpY2F0ZWQgdXNlcnMKKyogRWRpdGluZyBjb21tYW5kcyBhc3NvY2lhdGVkIHdpdGggaXRlbXMKKworVGhlIGtleXMgdXNlZCBhcmU6CisKKyogQXJyb3cgS2V5cywgUGdVcCwgUGdEbiwgSG9tZSwgRW5kIEtleXMKKyogU3BhY2UgdG8gc3dpdGNoIHN0YXRlIG9mIGEgY2hlY2tib3gKKyogRW50ZXIgdG8gY2hvb3NlIHRoZSBpdGVtCisqIEVzY2FwZSB0byBleGl0IGZyb20gaXQKKyogU2hvcnRjdXQga2V5cworCitGZWF0dXJlcworLS0tLS0tLS0KK1RoaXMgaXMgYSBnZW5lcmFsIHB1cnBvc2UgbWVudSBzeXN0ZW0gaW1wbGVtZW50ZWQgdXNpbmcgb25seSBCSU9TIGNhbGxzLAorc28gaXQgY2FuIGJlIGV4ZWN1dGVkIGluIGEgQ09NQk9PVCBlbnZpcm9ubWVudCBhcyB3ZWxsLiBJdCBpcyBoaWdobHkKK2N1c3RvbWl6YWJsZS4gU29tZSBmZWF0dXJlcyBpbmNsdWRlOgorCisqIFN0YXR1cyBsaW5lCisgICAgRGlzcGxheSBhbnkgaGVscCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZWFjaCBtZW51IGl0ZW0uCisqIFdpbmRvdworICAgIFNwZWNpZnkgYSB3aW5kb3cgd2l0aGluIHdoaWNoIHRoZSBtZW51IHN5c3RlbSBkcmF3cyBhbGwgaXRzIG1lbnUncy4KKyAgICBJdCBpcyB1cHRvIHRoZSB1c2VyIHRvIGVuc3VyZSB0aGF0IHRoZSBtZW51J3MgZml0IHdpdGhpbiB0aGUgd2luZG93LgorKiBQb3NpdGlvbmluZyBzdWJtZW51cworICAgIEJ5IGRlZmF1bHQsIGVhY2ggc3VibWVudSBpcyBwb3NpdGlvbmVkIGp1c3QgYmVsb3cgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICBlbnRyeSBvZiB0aGUgcGFyZW50IG1lbnUuIEhvd2V2ZXIsIHRoZSB1c2VyIG1heSBwb3NpdGlvbiBlYWNoIG1lbnUKKyAgICBhdCBhIHNwZWNpZmljIGxvY2F0aW9uIG9mIGhpcyBjaG9pY2UuIFRoaXMgaXMgdXNlZnVsLCB3aGVuIHRoZSBtZW51J3MKKyAgICBoYXZlIGxvdHMgb2Ygb3B0aW9ucy4KKyogUmVnaXN0ZXJpbmcgaGFuZGxlcnMgZm9yIGVhY2ggbWVudSBpdGVtCisgICAgVGhpcyBpcyBtYWlubHkgdXNlZCBmb3IgY2hlY2tib3hlcyBhbmQgcmFkaW9tZW51J3MsIHdoZXJlIGEgc2VsZWN0aW9uIG1heQorICAgIHJlc3VsdCBpbiBkaXNhYmxpbmcgb3RoZXIgbWVudSBpdGVtcy9jaGVja2JveGVzCisqIEdsb2JhbCBTY3JlZW4gSGFuZGxlcgorICAgIFRoaXMgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIG1lbnUgaXMgcmVkcmF3bi4gVGhlIHVzZXIgY2FuIGRpc3BsYXkKKyAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICh1c3VhbGx5IG91dHNpZGUgdGhlIHdpbmRvdyB3aGVyZSB0aGUgbWVudSBpcworICAgIGJlaW5nIGRpc3BsYXllZCkuIFNlZSB0aGUgY29tcGxleC5jIGZvciBhbiBleGFtcGxlLCB3aGVyZSB0aGUgZ2xvYmFsCisgICAgaGFuZGxlciBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIGNob2ljZXMgbWFkZSBzbyBmYXIuCisqIEdsb2JhbCBLZXlzIEhhbmRsZXIKKyAgICBUaGlzIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSB1c2VyIHByZXNzZXMgYSBrZXkgd2hpY2ggdGhlIG1lbnUKKyAgICBzeXN0ZW0gZG9lcyBub3QgdW5kZXJzdGFuZC4gVGhpcyBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IGNvbnRleHQKKyAgICBzZW5zaXRpdmUgaGVscC4gU2VlIGNvbXBsZXguYyBmb3IgaG93IHRvIHVzZSB0aGlzIGhvb2sgdG8gaW1wbGVtZW50CisgICAgYSBjb250ZXh0IHNlbnNpdGl2ZSBoZWxwIHN5c3RlbSBhcyB3ZWxsIGFzICJPbiB0aGUgZmx5IiBlZGl0aW5nCisgICAgb2YgY29tbWFuZHMgYXNzb2NpYXRlZCB3aXRoIG1lbnVzLgorKiBTaG9ydGN1dCBLZXlzCisgICAgV2l0aCBlYWNoIGl0ZW0gb25lIGNhbiByZWdpc3RlciBhIHNob3J0Y3V0IGtleSBmcm9tIFtBLVphLXowLTldLgorICAgIFByZXNzaW5nIGEga2V5IHdpdGhpbiB0aGF0IHJhbmdlLCB3aWxsIHRha2UgeW91IHRvIHRoZSBuZXh0IGl0ZW0KKyAgICB3aXRoIHRoYXQgc2hvcnRjdXQga2V5IChzbyB5b3UgY2FuIGhhdmUgbXVsdGlwbGUgaXRlbXMgd2l0aCB0aGUKKyAgICBzYW1lIHNob3J0Y3V0IGtleSkuIFRoZSBkZWZhdWx0IHNob3J0Y3V0IGtleSBmb3IgZWFjaCBpdGVtLCBpcworICAgIHRoZSBsb3dlciBjYXNlIHZlcnNpb24gb2YgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIGl0ZW0gaW4gdGhlIHJhbmdlCisgICAgW0EtWmEtejAtOV0uCisqIEVzY2FwZSBLZXlzCisgICAgRWFjaCBpdGVtIGVudHJ5IGNhbiBoYXZlIGEgc3Vic3RyaW5nIGVuY2xvc2VkIGluIDwgYW5kID4uIFRoaXMgcGFydAorICAgIGlzIGhpZ2hsaWdodGVkLiBDYW4gYmUgdXNlZCB0byBoaWdobGlnaHQgdGhlIHNob3J0Y3V0IGtleXMuIEJ5IGRlZmF1bHQKKyAgICBpZiBhbiBpdGVtIGhhcyBhIDwsIHRoZW4gdGhlIGZpcnN0IGNoYXIgaW5zaWRlIDwgYW5kID4gaW4gdGhlIHJhbmdlCisgICAgW0EtWmEtejAtOV0gaXMgY29udmVydGVkIHRvIGxvd2VyIGNhc2UgYW5kIHNldCBhcyB0aGUgc2hvcnRjdXQga2V5LgorKiBPbnRpbWVvdXQgaGFuZGxlcgorICAgIFRoZSB1c2VyIGNhbiByZWdpc3RlciBhbiBvbnRpbWVvdXQgaGFuZGxlciwgd2hpY2ggZ2V0cyBjYWxsZWQgaWYKKyAgICBubyBrZXkgaGFzIGJlZW4gcHJlc3NlZCBmb3IgYSB1c2VyIHNwZWNpZmljIGFtb3VudCBvZiB0aW1lIChkZWZhdWx0IDUgbWluKS4KKyAgICBGb3IgYW4gZXhhbXBsZSBzZWUgdGhlIGNvbXBsZXguYyBmaWxlLgorCitDcmVkaXRzCistLS0tLS0tCisqIFRoZSBXYXRjb20gZGV2ZWxvcGVycyBhbmQgUGV0ZXIgQW52aW4gZm9yIGZpZ3VyaW5nIG91dCBhbiBPUworICBpbmRlcGVuZGVudCBzdGFydHVwIGNvZGUuCisqIFRob21hcyBmb3IgcG9ydGluZyB0aGUgY3J5cHQgZnVuY3Rpb24gYW5kIHJlbW92aW5nIGFsbCBDIGxpYnJhcnkKKyAgZGVwZW5kZW5jaWVzCisqIFBldGVyIEFudmluIGZvciBwb3J0aW5nIHRoZSBjb2RlIHRvIEdDQworCistIE11cmFsaSAoZ211cmFsaStndWljZEBjcy51Y2hpY2Fnby5lZHUpCmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9UT0RPIGIvY29tMzIvY21lbnUvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmVlODJjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvVE9ETwpAQCAtMCwwICsxLDIgQEAKKyogV3JpdGUgQ09NQk9PVCBjb2RlIHRvIHJlYWQgLm1lbnUgZmlsZXMgYW5kIHBhcnNlIHRoZW0gZGlyZWN0bHkKKyAgLSB0YWtlIHRoZSBuYW1lIG9mIG1lbnUgZmlsZSB0byBwYXJzZSBmcm9tIGNvbW1hbmRsaW5lCmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9hZHZfbWVudS50cGwgYi9jb20zMi9jbWVudS9hZHZfbWVudS50cGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzMTcwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NtZW51L2Fkdl9tZW51LnRwbApAQCAtMCwwICsxLDQ2NSBAQAorQWxsIHRoZSBsaW5lcyBpbiB0aGlzIGZpbGUgbm90IGluIGJldHdlZW4gLS1zb21ldGhpbmcgQkVHSU5TLS0gYW5kIC0tc29tZXRoaW5nIEVORFMtLQoraXMgaWdub3JlZCBjb21wbGV0ZWx5IGFuZCB3aWxsIG5vdCBtYWtlIGl0IGludG8gdGhlIGdlbmVyYXRlZCBDIGZpbGUKKworVGhpcyBmaWxlIGhhcyBzZWN0aW9ucyBvZiBDIGNvZGUgZWFjaCBzZWN0aW9uIGRlbGltaXRlZCBieSAtLXNlY25hbWUgQkVHSU5TLS0KK2FuZCAtLXNlY25hbWUgRU5EUy0tLiBJbiB0aGUgZ2VuZXJhdGVkIEMgY29kZSBjZXJ0YWluIHNlY3Rpb24gbWF5IGJlIHVzZWQgbXVsdGlwbGUKK3RpbWVzLiBDdXJyZW50bHkgdGhlIGRpZmZlcmVudCBzZWN0aW9uIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBhcmUKKworaGVhZGVyLCBzeXN0ZW0sIGl0ZW0sIGxvZ2luIGFuZCBmb290ZXIKKworQW55IGFkZGl0aW9uYWwgc2VjdGlvbnMgeW91IGRlZmluZSB3aWxsIGJlIHByb2Nlc3NlZCBidXQgd2lsbCBwcm9iYWJseSBub3QgbWFrZSBpdAordG8gdGhlIEMgY29kZSBpZiB5b3UgZG8gbm90IG1vZGlmeSBtZW51Z2VuLnB5IHRvIHVzZSBpdC4KKworaGVhZGVyIGFuZCBmb290ZXIgZ28gdGhyb3VnaCB1bm1vbGVzdGVkLiBUaGUgcmVtYWluaW5nIGFyZSAlIHN1YnN0aXR1dGVkIHVzaW5nCitweXRob24gcnVsZXMuIEJhc2ljYWxseSBpdCBtZWFucyAlKHZhcilzIGdldHMgcmVwbGFjZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZQorInZhciIgd2hpY2ggaXMgYSBwcm9jZXNzZWQgZm9ybSBvZiB3aGF0IGlzIHJlYWQgZnJvbSB0aGUgLm1lbnUgZmlsZQorCitOT1RFOiBUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIEMgY29kZSBpbiB0aGUgcHl0aG9uIHNjcmlwdCwgc28geW91IGFyZSBmcmVlIHRvCittb2RpZnkgdGhpcyB0ZW1wbGF0ZSB0byBzdWl0IHlvdXIgbmVlZHMKKworLS1oZWFkZXIgQkVHSU5TLS0KKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDYgTXVyYWxpIEtyaXNobmFuIEdhbmFwYXRoeSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiY21lbnUuaCIKKyNpbmNsdWRlICJoZWxwLmgiCisjaW5jbHVkZSAicGFzc3dvcmRzLmgiCisjaW5jbHVkZSAiY29tMzJpby5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIE1BWF9DTURfTElORV9MRU5HVEggNTE0CisKK3R5cGVkZWYgc3RydWN0IHNfeHRyYSB7CisgIGxvbmcgaXBhcHBlbmQ7IC8vIFN0b3JlcyB0aGUgaXBhcHBlbmQgZmxhZyB0byBzZW5kICh1c2VmdWwgZm9yIFBYRUxJTlVYIG9ubHkpCisgIGNoYXIgKmFyZ3NtZW51OyAvLyBTdG9yZXMgdGhlIG5hbWUgb2YgbWVudSB3aGljaCBjb250YWlucyBvcHRpb25zIGZvciB0aGUgZ2l2ZW4gUlVOIGl0ZW0KKyAgY2hhciAqcGVybXM7IC8vIHN0b3JlcyB0aGUgcGVybWlzc2lvbnMgcmVxdWlyZWQgdG8gYWN0aXZhdGUgdGhlIGl0ZW0KK30gdF94dHJhOworCit0eXBlZGVmIHRfeHRyYSAqcHRfeHRyYTsgLy8gUG9pbnRlciB0byBleHRyYSBkYXRhc3RydWN0dXJlCisKKy8vIFR5cGVzIG9mIGRvdCBjb21tYW5kcyBmb3Igd2hpY2ggY2FsbGVyIHRha2VzIHJlc3BvbnNpYmlsaXR5IG9mIGhhbmRsaW5nCisvLyBJbiBzb21lIGNhc2Ugc29tZSBjb21tYW5kcyBtYXkgbm90IG1ha2Ugc2Vuc2UsIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIKKy8vIHRvIGhhbmRsZSBjYXNlcyB3aGljaCBkbyBub3QgbWFrZSBzZW5zZQordHlwZWRlZiBlbnVtIHtRVUlUX0NNRCwgUkVQRUFUX0NNRCwgRU5URVJfQ01ELCBFU0NBUEVfQ01EfSB0X2RvdGNtZDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgKi8KKworLy8gZGVmYXVsdCB1c2VyCisjZGVmaW5lIEdVRVNUX1VTRVIgImd1ZXN0IgorCisvLyBmb3IgbG9jYWwgY29tbWFuZHMuIHJldHVybiB2YWx1ZSBvZiBleGVjZG90Y21kCisjZGVmaW5lIFFVSVRfQ01EIDAKKyNkZWZpbmUgUlBUX0NNRCAxCisKK2NoYXIgdXNlcm5hbWVbMTJdOyAvLyBOYW1lIG9mIHVzZXIgY3VycmVudGx5IHVzaW5nIHRoZSBzeXN0ZW0KKworaW50IFBXRF9ST1c7IC8vIExpbmUgbnVtYmVyIHdoZXJlIHVzZXIgYXV0aGVudGljYXRpb24gaGFwcGVucworaW50IEVESVRfUk9XOyAvLyByb3cgd2hlcmUgVXNlciBUYWIKKworY2hhciBsb2dpbnN0cltdID0gIjxMPm9naW4gICI7CitjaGFyIGxvZ291dHN0clszMF07CisKK2ludCB2bW9kZTsgLy8gVGhlIHZpZGVvIG1vZGUgd2Ugd2FudCB0byBiZSBpbgorY2hhciB0aW1lb3V0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOyAvLyBDb21tYW5kIHRvIGV4ZWN1dGUgb24gdGltZW91dAorY2hhciB0b3RhbHRpbWVvdXRjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07IC8vIENvbW1hbmQgdG8gZXhlY3V0ZSBvbiB0b3RhbHRpbWVvdXQKKworY2hhciBRVUlUU1RSW10gPSAiLnF1aXQiOyAvLyBzYW1lIGFzIGV4aXQKK2NoYXIgSUdOT1JFU1RSW109Ii5pZ25vcmUiOyAvLyBzYW1lIGFzIHJlcGVhdCwgd2FpdAorCisvKi0tLS0tLS0tLS0tLS0tLS0gIEVuZCBnbG9iYWxzICovCisKKy8vIHJldHVybnMgcG9pbnRlciB0byBmaXJzdCBub24tc3BhY2UgY2hhcgorLy8gYW5kIGFkdmFuY2VzIGVuZCBvZiBzdHIgYnkgcmVtb3ZpbmcgdHJhaWxpbmcgc3BhY2VzCitjaGFyICogc3RyaXAoY2hhciAqc3RyKQoreworICBjaGFyICpwLCpzLCplOworICBpZiAoIXN0cikgcmV0dXJuIE5VTEw7CisgIHAgPSBzdHI7CisgIHMgPSBOVUxMOworICBlID0gTlVMTDsKKyAgd2hpbGUgKCpwKSB7CisgICAgaWYgKCpwICE9ICcgJykgeworICAgICAgIC8vIG1hcmsgc3RhcnQgb2Ygc3RyaW5nIG9yIHJlY29yZCB0aGUgbGFzdCB2aXNpdGVkIG5vbi1zcGFjZSBjaGFyCisgICAgICAgaWYgKCFzKSBzPXA7IGVsc2UgZT1wOworICAgIH0KKyAgICBwKys7CisgIH0KKyAgKigrK2UpPSdcMCc7IC8vIGtpbGwgc3RyaW5nIGVhcmxpZXIKKyAgcmV0dXJuIHM7Cit9CisKKy8vIGV4ZWN1dGVzIGEgbGlzdCBvZiAlIHNlcGFyYXRlZCBjb21tYW5kcworLy8gbm9uLWRvdCBjb21tYW5kcyBhcmUgYXNzdW1lZCB0byBiZSBzeXNsaW51eCBjb21tYW5kcworLy8gQWxsIHN5c2xpbnV4IGNvbW1hbmRzIGFyZSBhcHBlbmRlZCB3aXRoIHRoZSBjb250ZW50cyBvZiBrZXJhcmdzCisvLyBJZiBpdCBmYWlscyAoa2VybmVsIG5vdCBmb3VuZCkgdGhlbiB0aGUgbmV4dCBvbmUgaXMgdHJpZWQgaW4gdGhlCisvLyBsaXN0CisvLyByZXR1cm5zIFFVSVRfQ01EIG9yIFJQVF9DTUQKK3RfZG90Y21kIGV4ZWNkb3RjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpkZWZjbWQsIGNvbnN0IGNoYXIgKmtlcmFyZ3MpCit7CisgICBjaGFyIGNtZGxpbmVbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgICBjaGFyIGRvdGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgIGNoYXIgKmN1cnIsKm5leHQsKnAsKmFyZ3M7CisgICBjaGFyIGN0cjsKKworICAgc3RyY3B5KGRvdGNtZCxjbWQpOworICAgbmV4dCA9IGRvdGNtZDsKKyAgIGNtZGxpbmVbMF0gPSAnXDAnOworICAgd2hpbGUgKCpuZXh0KSB7IC8vIGlmIHNvbWV0aGluZyB0byBkbworICAgICAgY3VyciA9IG5leHQ7CisgICAgICBwID0gc3RyY2hyKG5leHQsJyUnKTsKKyAgICAgIGlmIChwKSB7CisgICAgICAgICAqcC0tPSdcMCc7IG5leHQ9cCsyOworICAgICAgICAgd2hpbGUgKCpwID09ICcgJykgcC0tOworICAgICAgICAgKigrK3ApPSdcMCc7IC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqZGVmY21kKSB7IC8vIGV4ZWN1dGUgZGVmY21kIG5leHQKKyAgICAgICAgICAgIG5leHQ9ZGVmY21kOworICAgICAgICAgICAgZGVmY21kPU5VTEw7IC8vIGV4ZWMgZGVmIGNtZCBvbmx5IG9uY2UKKyAgICAgICAgfSBlbHNlIG5leHQ9TlVMTDsKKyAgICAgIH0KKyAgICAgIC8vIG5vdyB3ZSBqdXN0IG5lZWQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCAiY3VyciIKKyAgICAgIGN1cnIgPSBzdHJpcChjdXJyKTsKKyAgICAgIGlmIChjdXJyWzBdICE9ICcuJykgeyAvLyBqdXN0IHJ1biB0aGUga2VybmVsCisgICAgICAgICBzdHJjcHkoY21kbGluZSxjdXJyKTsKKyAgICAgICAgIGlmIChrZXJhcmdzKSBzdHJjYXQoY21kbGluZSxrZXJhcmdzKTsKKyAgICAgICAgIHJ1bnN5c2xpbnV4aW1hZ2UoY21kbGluZSwwKTsgLy8gTm8gSVBBcHBlbmQKKyAgICAgIH0gZWxzZSB7IC8vIFdlIGhhdmUgYSBET1QgY29tbWFuZAorICAgICAgICAvLyBzcGxpdCBjb21tYW5kIGludG8gY29tbWFuZCBhbmQgYXJncyAobWF5IGJlIGVtcHR5KQorICAgICAgICBhcmdzID0gY3VycjsKKyAgICAgICAgd2hpbGUgKCAoKmFyZ3MgIT0gJyAnKSAmJiAoKmFyZ3MgIT0gJ1wwJykgKSBhcmdzKys7CisgICAgICAgIGlmICgqYXJncykgeyAvLyBmb3VuZCBhIHNwYWNlCisgICAgICAgICAgICphcmdzKysgPSAnXDAnOworICAgICAgICAgICB3aGlsZSAoKmFyZ3MgPT0gJyAnKSBhcmdzKys7IC8vIHNraXAgb3ZlciBzcGFjZXMKKyAgICAgICAgfQorICAgICAgICBpZiAoIChzdHJjbXAoY3VyciwiLmV4aXQiKT09MCkgfHwKKyAgICAgICAgICAgICAoc3RyY21wKGN1cnIsIi5xdWl0Iik9PTApCisgICAgICAgICAgICkKKyAgICAgICAgICAgcmV0dXJuIFFVSVRfQ01EOworICAgICAgICBpZiAoIChzdHJjbXAoY3VyciwiLnJlcGVhdCIpPT0wKSB8fAorICAgICAgICAgICAgIChzdHJjbXAoY3VyciwiLmlnbm9yZSIpPT0wKSB8fAorICAgICAgICAgICAgIChzdHJjbXAoY3VyciwiLndhaXQiKT09MCkKKyAgICAgICAgICAgKQorICAgICAgICAgICByZXR1cm4gUlBUX0NNRDsKKyAgICAgICAgaWYgKHN0cmNtcChjdXJyLCIuYmVlcCIpPT0wKSB7CisgICAgICAgICAgIGlmICgoYXJncykgJiYgKCcwJyA8PSBhcmdzWzBdKSAmJiAoYXJnc1swXSA8PSAnOScpKQorICAgICAgICAgICAgICBjdHIgPSBhcmdzWzBdLScwJzsKKyAgICAgICAgICAgZWxzZSBjdHI9MTsKKyAgICAgICAgICAgZm9yICg7Y3RyPjA7IGN0ci0tKSBiZWVwKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChjdXJyLCIuaGVscCIpPT0wKSBydW5oZWxwKGFyZ3MpOworICAgICAgfQorICAgfQorICAgcmV0dXJuIFJQVF9DTUQ7IC8vIGJ5IGRlZmF1bHQgd2UgZG8gbm90IHF1aXQKK30KKworCitUSU1FT1VUQ09ERSB0aW1lb3V0KGNvbnN0IGNoYXIgKmNtZCkKK3sKKyAgdF9kb3RjbWQgYzsKKyAgYyA9IGV4ZWNkb3RjbWQoY21kLCIud2FpdCIsTlVMTCk7CisgIHN3aXRjaChjKSB7CisgICAgY2FzZSBFTlRFUl9DTUQ6CisgICAgICAgICByZXR1cm4gQ09ERV9FTlRFUjsKKyAgICBjYXNlIEVTQ0FQRV9DTUQ6CisgICAgICAgICByZXR1cm4gQ09ERV9FU0NBUEU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBDT0RFX1dBSVQ7CisgIH0KK30KKworVElNRU9VVENPREUgb250aW1lb3V0KHZvaWQpCit7CisgICByZXR1cm4gdGltZW91dCh0aW1lb3V0Y21kKTsKK30KKworVElNRU9VVENPREUgb250b3RhbHRpbWVvdXQodm9pZCkKK3sKKyAgIHJldHVybiB0aW1lb3V0KHRvdGFsdGltZW91dGNtZCk7Cit9CisKK3ZvaWQga2V5c19oYW5kbGVyKHRfbWVudXN5c3RlbSAqIG1zIF9fYXR0cmlidXRlX18gKCggdW51c2VkICkpLCB0X21lbnVpdGVtICogbWksIGludCBzY2FuY29kZSkKK3sKKyAgIGludCBuYywgbnI7CisKKyAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZuciwgJm5jKSkgeworICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgbmMgPSA4MDsKKyAgICAgICBuciA9IDI0OworICAgfQorCisgICBpZiAoIChzY2FuY29kZSA9PSBLRVlfRjEpICYmIChtaS0+aGVscGlkICE9IDB4RkZGRikgKSB7IC8vIElmIHNjYW5jb2RlIG9mIEYxIGFuZCBub24tdHJpdmlhbCBoZWxwaWQKKyAgICAgIHJ1bmhlbHBzeXN0ZW0obWktPmhlbHBpZCk7CisgICB9CisKKyAgIC8vIElmIHVzZXIgaGl0IFRBQiwgYW5kIGl0ZW0gaXMgYW4gImV4ZWN1dGFibGUiIGl0ZW0KKyAgIC8vIGFuZCB1c2VyIGhhcyBwcml2aWxlZ2VzIHRvIGVkaXQgaXQsIGVkaXQgaXQgaW4gcGxhY2UuCisgICBpZiAoKHNjYW5jb2RlID09IEtFWV9UQUIpICYmIChtaS0+YWN0aW9uID09IE9QVF9SVU4pICYmCisgICAgICAgKEVESVRfUk9XIDwgbnIpICYmIChFRElUX1JPVyA+IDApICYmCisgICAgICAgKGlzYWxsb3dlZCh1c2VybmFtZSwiZWRpdGNtZCIpIHx8IGlzYWxsb3dlZCh1c2VybmFtZSwicm9vdCIpKSkgeworICAgICAvLyBVc2VyIHR5cGVkIFRBQiBhbmQgaGFzIHBlcm1pc3Npb25zIHRvIGVkaXQgY29tbWFuZCBsaW5lCisgICAgIGdvdG94eShFRElUX1JPVywxKTsKKyAgICAgY3NwcmludCgiQ29tbWFuZCBsaW5lOiIsMHgwNyk7CisgICAgIGVkaXRzdHJpbmcobWktPmRhdGEsQUNUSU9OTEVOKTsKKyAgICAgZ290b3h5KEVESVRfUk9XLDEpOworICAgICBjcHJpbnQoJyAnLDB4MDcsbmMtMSk7CisgICB9Cit9CisKK3RfaGFuZGxlcl9yZXR1cm4gbG9naW5faGFuZGxlcih0X21lbnVzeXN0ZW0gKm1zLCB0X21lbnVpdGVtICptaSkKK3sKKyAgKHZvaWQpbWk7IC8vIFVudXNlZAorICBjaGFyIHB3ZFs0MF07CisgIGNoYXIgbG9naW5bNDBdOworICBpbnQgbmMsIG5yOworICB0X2hhbmRsZXJfcmV0dXJuIHJ2OworCisgICh2b2lkKW1zOworCisgIHJ2ID0gQUNUSU9OX0lOVkFMSUQ7CisgIGlmIChQV0RfUk9XIDwgMCkgcmV0dXJuIHJ2OyAvLyBObyBuZWVkIHRvIGF1dGhlbnRpY2F0ZQorCisgIGlmIChtaS0+aXRlbSA9PSBsb2dpbnN0cikgeyAvKiBVc2VyIHdhbnRzIHRvIGxvZ2luICovCisgICAgaWYgKGdldHNjcmVlbnNpemUoMSwgJm5yLCAmbmMpKSB7CisgICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgIG5jID0gODA7CisgICAgICAgIG5yID0gMjQ7CisgICAgfQorCisgICAgZ290b3h5KFBXRF9ST1csMSk7CisgICAgY3NwcmludCgiRW50ZXIgVXNlcm5hbWU6ICIsMHgwNyk7CisgICAgZ2V0c3RyaW5nKGxvZ2luLCBzaXplb2YgdXNlcm5hbWUpOworICAgIGdvdG94eShQV0RfUk9XLDEpOworICAgIGNwcmludCgnICcsMHgwNyxuYyk7CisgICAgY3NwcmludCgiRW50ZXIgUGFzc3dvcmQ6ICIsMHgwNyk7CisgICAgZ2V0cHdkKHB3ZCwgc2l6ZW9mIHB3ZCk7CisgICAgZ290b3h5KFBXRF9ST1csMSk7CisgICAgY3ByaW50KCcgJywweDA3LG5jKTsKKworICAgIGlmIChhdXRoZW50aWNhdGVfdXNlcihsb2dpbixwd2QpKQorICAgIHsKKyAgICAgIHN0cmNweSh1c2VybmFtZSxsb2dpbik7CisgICAgICBzdHJjcHkobG9nb3V0c3RyLCI8TD5vZ291dCAiKTsKKyAgICAgIHN0cmNhdChsb2dvdXRzdHIsdXNlcm5hbWUpOworICAgICAgbWktPml0ZW0gPSBsb2dvdXRzdHI7IC8vIENoYW5nZSBpdGVtIHRvIHJlYWQgIkxvZ291dCIKKyAgICAgIHJ2LnJlZnJlc2ggPSAxOyAvLyByZWZyZXNoIHRoZSBzY3JlZW4gKGFzIGl0ZW0gY29udGVudHMgY2hhbmdlZCkKKyAgICB9CisgICAgZWxzZSBzdHJjcHkodXNlcm5hbWUsR1VFU1RfVVNFUik7CisgIH0KKyAgZWxzZSAvLyBVc2VyIG5lZWRzIHRvIGxvZ291dAorICB7CisgICAgc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworICAgIHN0cmNweShsb2dvdXRzdHIsIiIpOworICAgIG1pLT5pdGVtID0gbG9naW5zdHI7CisgIH0KKworICByZXR1cm4gcnY7Cit9CisKK3RfaGFuZGxlcl9yZXR1cm4gY2hlY2tfcGVybXModF9tZW51c3lzdGVtICptcywgdF9tZW51aXRlbSAqbWkpCit7CisgICBjaGFyICpwZXJtczsKKyAgIHB0X3h0cmEgeDsKKworICAgKHZvaWQpIG1zOyAvLyBUbyBrZWVwIGNvbXBpbGVyIGhhcHB5CisKKyAgIHggPSAocHRfeHRyYSkgbWktPmV4dHJhX2RhdGE7CisgICBwZXJtcyA9ICggeCA/IHgtPnBlcm1zIDogTlVMTCk7CisgICBpZiAoIXBlcm1zKSByZXR1cm4gQUNUSU9OX1ZBTElEOworCisgICBpZiAoaXNhbGxvd2VkKHVzZXJuYW1lLCJyb290IikgfHwgaXNhbGxvd2VkKHVzZXJuYW1lLHBlcm1zKSkgLy8gSWYgYWxsb3dlZAorICAgICAgcmV0dXJuIEFDVElPTl9WQUxJRDsKKyAgIGVsc2UgcmV0dXJuIEFDVElPTl9JTlZBTElEOworfQorCisvLyBDb21wdXRlIHRoZSBmdWxsIGNvbW1hbmQgbGluZSB0byBhZGQgYW5kIGlmIG5vbi10cml2aWFsCisvLyBwcmVwZW5kIHRoZSBzdHJpbmcgcHJlcGVuZCB0byBmaW5hbCBjb21tYW5kIGxpbmUKKy8vIEFzc3VtZSBjbWRsaW5lIHBvaW50cyB0byBidWZmZXIgbG9uZyBlbm91Z2ggdG8gaG9sZCBhbnN3ZXIKK3ZvaWQgZ2VuY29tbWFuZChwdF9tZW51aXRlbSBtaSwgY2hhciAqY21kbGluZSkKK3sKKyAgIHB0X3h0cmEgeDsKKyAgIGNtZGxpbmVbMF0gPSAnXDAnOworICAgc3RyY2F0KGNtZGxpbmUsbWktPmRhdGEpOworICAgeCA9IChwdF94dHJhKSBtaS0+ZXh0cmFfZGF0YTsKKyAgIGlmICggKHgpICYmICh4LT5hcmdzbWVudSkpIGdlbl9hcHBlbmRfbGluZSh4LT5hcmdzbWVudSxjbWRsaW5lKTsKK30KKworCisvLyBydW4gdGhlIGdpdmVuIGNvbW1hbmQgdG9nZXRoZXIgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnMgd2hpY2ggbWF5IG5lZWQgcGFzc2luZwordm9pZCBydW5jb21tYW5kKHB0X21lbnVpdGVtIG1pKQoreworICAgY2hhciAqbGluZTsKKyAgIHB0X3h0cmEgeDsKKyAgIGxvbmcgaXBhcHBlbmQ7CisKKyAgIGxpbmUgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqTUFYX0NNRF9MSU5FX0xFTkdUSCk7CisgICBnZW5jb21tYW5kKG1pLGxpbmUpOworICAgeCA9IChwdF94dHJhKSBtaS0+ZXh0cmFfZGF0YTsKKyAgIGlwYXBwZW5kID0gKHggPyB4LT5pcGFwcGVuZCA6IDApOworCisgICBydW5zeXNsaW51eGltYWdlKGxpbmUsaXBhcHBlbmQpOworICAgZnJlZShsaW5lKTsKK30KKworLy8gc2V0IHRoZSBleHRyYSBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIG1lbnUgaXRlbS4KK3ZvaWQgc2V0X3h0cmEocHRfbWVudWl0ZW0gbWksIGNvbnN0IGNoYXIgKmFyZ3NtZW51LCBjb25zdCBjaGFyICpwZXJtcywgdW5zaWduZWQgaW50IGhlbHBpZCwgbG9uZyBpcGFwcGVuZCkKK3sKKyAgIHB0X3h0cmEgeHRyYTsKKyAgIGludCBiYWRfYXJnc21lbnUsIGJhZF9wZXJtcywgYmFkX2lwYXBwZW5kOworCisgICBtaS0+ZXh0cmFfZGF0YSA9IE5VTEw7IC8vIGluaXRhbGl6ZQorICAgbWktPmhlbHBpZCA9IGhlbHBpZDsgLy8gc2V0IGhlbHAgaWQKKworICAgaWYgKG1pLT5hY3Rpb24gIT0gT1BUX1JVTikgcmV0dXJuOworCisgICBiYWRfYXJnc21lbnUgPSBiYWRfcGVybXMgPSBiYWRfaXBhcHBlbmQgPSAwOworICAgaWYgKCAoYXJnc21lbnU9PU5VTEwpIHx8IChzdHJsZW4oYXJnc21lbnUpPT0wKSkgYmFkX2FyZ3NtZW51ID0gMTsKKyAgIGlmICggKHBlcm1zPT1OVUxMKSB8fCAoc3RybGVuKHBlcm1zKT09MCkpIGJhZF9wZXJtcyA9IDE7CisgICBpZiAoIGlwYXBwZW5kPT0wKSBiYWRfaXBhcHBlbmQgPSAxOworCisgICBpZiAoYmFkX2FyZ3NtZW51ICYmIGJhZF9wZXJtcyAmJiBiYWRfaXBhcHBlbmQpIHJldHVybjsKKworICAgeHRyYSA9IChwdF94dHJhKSBtYWxsb2Moc2l6ZW9mKHRfeHRyYSkpOworICAgbWktPmV4dHJhX2RhdGEgPSAodm9pZCAqKSB4dHJhOworICAgeHRyYS0+YXJnc21lbnUgPSB4dHJhLT5wZXJtcyA9IE5VTEw7CisgICB4dHJhLT5pcGFwcGVuZCA9IGlwYXBwZW5kOworICAgaWYgKCFiYWRfYXJnc21lbnUpIHsKKyAgICAgIHh0cmEtPmFyZ3NtZW51ID0gKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSooc3RybGVuKGFyZ3NtZW51KSsxKSk7CisgICAgICBzdHJjcHkoeHRyYS0+YXJnc21lbnUsYXJnc21lbnUpOworICAgfQorICAgaWYgKCFiYWRfcGVybXMpIHsKKyAgICAgIHh0cmEtPnBlcm1zID0gKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSooc3RybGVuKHBlcm1zKSsxKSk7CisgICAgICBzdHJjcHkoeHRyYS0+cGVybXMscGVybXMpOworICAgICAgbWktPmhhbmRsZXIgPSAmY2hlY2tfcGVybXM7CisgICB9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgIHB0X21lbnVpdGVtIGN1cnI7CisgIGNoYXIgcXVpdDsKKyAgY2hhciBleGl0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIGV4aXRjbWRyb290W01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIG9uZXJyY21kW01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIHN0YXJ0ZmlsZVtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciAqZWNtZDsgLy8gZWZmZWN0aXZlIGV4aXQgY29tbWFuZCBvciBvbmVycm9yY21kCisgIGNoYXIgc2tpcGJpdHM7CisgIGNoYXIgc2tpcGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgaW50IHRpbWVvdXQ7IC8vIHRpbWUgaW4gbXVsdGlwbGVzIG9mIDAuMSBzZWNvbmRzCisgIGludCB0b3RhbHRpbWVvdXQ7IC8vIHRpbWUgaW4gbXVsdGlwbGVzIG9mIDAuMSBzZWNvbmRzCisgIHRfZG90Y21kIGRvdHJ2OyAvLyB0byBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4ZWNkb3RjbWQKKyAgaW50IHRlbXA7CisKKyAgc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworLS1oZWFkZXIgRU5EUy0tCistLXN5c3RlbSBCRUdJTlMtLQorLyogLS0tLSBJbml0aWFsaXppbmcgbWVudSBzeXN0ZW0gcGFyYW1ldGVycyAtLS0gKi8KKyAgdm1vZGUgPSAlKHZpZGVvbW9kZSlzOworICBza2lwYml0cyA9ICUoc2tpcGNvbmRuKXM7CisgIFBXRF9ST1cgPSAlKHB3ZHJvdylzOworICBFRElUX1JPVyA9ICUoZWRpdHJvdylzOworICBzdHJjcHkob25lcnJjbWQsIiUob25lcnJvcmNtZClzIik7CisgIHN0cmNweShleGl0Y21kLCIlKGV4aXRjbWQpcyIpOworICBzdHJjcHkoZXhpdGNtZHJvb3QsIiUoZXhpdGNtZHJvb3QpcyIpOworICAvLyBJZiBub3Qgc3BlY2lmaWVkIGV4aXRjbWRyb290ID0gZXhpdGNtZAorICBpZiAoZXhpdGNtZHJvb3RbMF0gPT0gJ1wwJykgc3RyY3B5KGV4aXRjbWRyb290LGV4aXRjbWQpOworICAvLyBUaW1lb3V0IHN0dWZmCisgIHRpbWVvdXQgPSAlKHRpbWVvdXQpczsKKyAgc3RyY3B5KHRpbWVvdXRjbWQsIiUodGltZW91dGNtZClzIik7CisgIHRvdGFsdGltZW91dCA9ICUodG90YWx0aW1lb3V0KXM7CisgIHN0cmNweSh0b3RhbHRpbWVvdXRjbWQsIiUodG90YWx0aW1lb3V0Y21kKXMiKTsKKyAgc3RyY3B5KHN0YXJ0ZmlsZSwiJShzdGFydGZpbGUpcyIpOworCisgIGluaXRfaGVscCgiJShoZWxwZGlyKXMiKTsKKyAgaW5pdF9wYXNzd29yZHMoIiUocHdkZmlsZSlzIik7CisgIGluaXRfbWVudXN5c3RlbSgiJSh0aXRsZSlzIik7CisgIHNldF93aW5kb3dfc2l6ZSglKHRvcClzLCUobGVmdClzLCUoYm90KXMsJShyaWdodClzKTsKKworICAvLyBSZWdpc3RlciB0aGUgb250aW1lb3V0IGhhbmRsZXIsIHdpdGggYSB0aW1lIG91dCBvZiAxMCBzZWNvbmRzCisgIHJlZ19vbnRpbWVvdXQob250aW1lb3V0LHRpbWVvdXQqMTAsMCk7CisgIHJlZ19vbnRvdGFsdGltZW91dChvbnRvdGFsdGltZW91dCx0b3RhbHRpbWVvdXQqMTApOworCisgIC8vIFJlZ2lzdGVyIG1lbnVzeXN0ZW0gaGFuZGxlcnMKKyAgcmVnX2hhbmRsZXIoSERMUl9LRVlTLCZrZXlzX2hhbmRsZXIpOworLyogLS0tLSBFbmQgb2YgaW5pdGlhbGl6YXRpb24gLS0tICovCistLXN5c3RlbSBFTkRTLS0KKy0taXRlbSBCRUdJTlMtLQorCisgIGN1cnIgPSBhZGRfaXRlbSgiJShpdGVtKXMiLCIlKGluZm8pcyIsJSh0eXBlKXMsIiUoZGF0YSlzIiwlKHN0YXRlKWQpOworICBzZXRfeHRyYShjdXJyLCIlKGFyZ3NtZW51KXMiLCIlKHBlcm1zKXMiLCUoaGVscGlkKWQsJShpcGFwcGVuZClkKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoJShzaG9ydGN1dClzKTsKKy0taXRlbSBFTkRTLS0KKy0tbG9naW4gQkVHSU5TLS0KKworICBjdXJyID0gYWRkX2l0ZW0obG9naW5zdHIsIkxvZ2luL0xvZ291dCBvZiBhdXRoZW50aWNhdGlvbiBzeXN0ZW0iLE9QVF9SVU4sTlVMTCwwKTsKKyAgY3Vyci0+aGVscGlkID0gJShoZWxwaWQpZDsKKyAgY3Vyci0+aGFuZGxlciA9ICZsb2dpbl9oYW5kbGVyOworLS1sb2dpbiBFTkRTLS0KKy0tbWVudSBCRUdJTlMtLQorCisvKiAtLS0tLS0tIE1FTlUgJShuYW1lKXMgLS0tLS0gKi8KKyAgYWRkX25hbWVkX21lbnUoIiUobmFtZSlzIiwiJSh0aXRsZSlzIiwtMSk7CistLW1lbnUgRU5EUy0tCistLWZvb3RlciBCRUdJTlMtLQorLyogLS0tLS0tLSBFTkQgT0YgTUVOVSBkZWNsYXJhdGlvbnMgLS0tLS0gKi8KKworLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHNraXAgdGhlIG1lbnUgYWx0b2dldGhlcgorICBxdWl0ID0gMDsgLy8gRG9udCBza2lwIHRoZSBtZW51CisgIGlmIChnZXRzaGlmdGZsYWdzKCkgJiBza2lwYml0cykgeyAvLyB3ZSBtdXN0IHNraXAgdGhlIG1lbnUgYWx0b2d0aGVyIGFuZCBleGVjdXRlIHNraXBjbWQKKyAgICBkb3RydiA9IGV4ZWNkb3RjbWQoc2tpcGNtZCwiLmJlZXAlLmV4aXQiLE5VTEwpOyAvLyBXb3JzdCBjYXNlIHdlIGJlZXAgYW5kIGV4aXQKKyAgICBpZiAoZG90cnYgPT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICB9CisKKy8vIFN3aXRjaCB2aWRlIG1vZGUgaWYgcmVxdWlyZWQKKyAgIGlmICh2bW9kZSAhPSAweEZGKSBzZXR2aWRlb21vZGUodm1vZGUpOworCisvLyBEbyB3ZSBoYXZlIGEgc3RhcnRmaWxlIHRvIGRpc3BsYXk/CisgICBpZiAoc3RhcnRmaWxlWzBdICE9ICdcMCcpIHJ1bmhlbHAoc3RhcnRmaWxlKTsKKworLy8gVGhlIG1haW4gbG9vcAorICB3aGlsZSAocXVpdCA9PSAwKSB7IC8vIEFzIGxvbmcgYXMgcXVpdCBpcyB6ZXJvIHJlcGVhdAorICAgICBjdXJyID0gc2hvd21lbnVzKGZpbmRfbWVudV9udW0oIm1haW4iKSk7IC8vIEluaXRpYWwgbWVudSBpcyB0aGUgb25lIGNhbGxlZCAibWFpbiIKKworICAgICBpZiAoY3VycikgeworICAgICAgICBpZiAoY3Vyci0+YWN0aW9uID09IE9QVF9SVU4pIHsKKyAgICAgICAgICAgZWNtZCA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSpNQVhfQ01EX0xJTkVfTEVOR1RIKTsKKyAgICAgICAgICAgZ2VuY29tbWFuZChjdXJyLGVjbWQpOworICAgICAgICAgICB0ZW1wID0gKGN1cnItPmV4dHJhX2RhdGEgPyAoKHB0X3h0cmEpY3Vyci0+ZXh0cmFfZGF0YSktPmlwYXBwZW5kIDogMCk7CisgICAgICAgICAgIHJ1bnN5c2xpbnV4aW1hZ2UoZWNtZCx0ZW1wKTsKKyAgICAgICAgICAgLy8ga2VybmVsIG5vdCBmb3VuZCBzbyBleGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBkb3QgY29tbWFuZAorICAgICAgICAgICBkb3RydiA9IGV4ZWNkb3RjbWQob25lcnJjbWQsIi5xdWl0IixlY21kKTsgLy8gcGFzcyBiYWQgY21kbGluZSBhcyBhcmcKKyAgICAgICAgICAgaWYgKGRvdHJ2PT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICAgICAgICAgICBmcmVlKGVjbWQpOyBlY21kID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGNzcHJpbnQoIkVycm9yIGluIHByb2dyYW1taW5nISIsMHgwNyk7CisgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZpbmQgZWZmZWN0aXZlIGV4aXQgY29tbWFuZAorICAgICAgICBlY21kID0gKCBpc2FsbG93ZWQodXNlcm5hbWUsInJvb3QiKSA/IGV4aXRjbWRyb290IDogZXhpdGNtZCk7CisgICAgICAgIGRvdHJ2ID0gZXhlY2RvdGNtZChlY21kLCIucmVwZWF0IixOVUxMKTsKKyAgICAgICAgcXVpdCA9IChkb3RydiA9PSBRVUlUX0NNRCA/IDEgOiAwKTsgLy8gc2hvdWxkIHdlIGV4aXQgbm93CisgICAgIH0KKyAgfQorCisvLyBEZWFsbG9jYXRlIHNwYWNlIHVzZWQgYW5kIHF1aXQKKyAgY2xvc2VfcGFzc3dvcmRzKCk7CisgIGNsb3NlX2hlbHAoKTsKKyAgY2xvc2VfbWVudXN5c3RlbSgpOworICByZXR1cm4gMDsKK30KKworLS1mb290ZXIgRU5EUy0tCmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9jb21wbGV4LmMgYi9jb20zMi9jbWVudS9jb21wbGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2NThmYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NtZW51L2NvbXBsZXguYwpAQCAtMCwwICsxLDQ1MCBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNSBNdXJhbGkgS3Jpc2huYW4gR2FuYXBhdGh5IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCAqKSAwKQorI2VuZGlmCisKKyNpbmNsdWRlICJjbWVudS5oIgorI2luY2x1ZGUgImNvbTMyaW8uaCIKKyNpbmNsdWRlICJoZWxwLmgiCisjaW5jbHVkZSAicGFzc3dvcmRzLmgiCisjaW5jbHVkZSAiZGVzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxnZXRrZXkuaD4KKworLyogR2xvYmFsIHZhcmlhYmxlcyAqLworY2hhciBpbmZvbGluZVsxNjBdOworY2hhciBidWZmZXJbODBdOworCisvLyBEaWZmZXJlbnQgbmV0d29yayBvcHRpb25zCitzdGF0aWMgY2hhciBub25ldFtdID0gIjxuPmV0d29yayBbbm9uZV0iOworc3RhdGljIGNoYXIgZGhjcG5ldFtdID0gIjxuPmV0d29yayBbZGhjcF0iOworc3RhdGljIGNoYXIgc3RhdG5ldFtdID0gIjxuPmV0d29yayBbc3RhdGljXSI7CisKK3N0YXRpYyBjaGFyIGxvZ2luc3RyW10gPSAiPEw+b2dpbiAgIjsKK3N0YXRpYyBjaGFyIGxvZ291dHN0cltdID0gIjxMPm9nb3V0ICI7CisKK3N0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGJhc2V1cmw6MTsJLy8gRG8gd2UgbmVlZCB0byBzcGVjaWZ5IGJ5IHVybAorICAgIHVuc2lnbmVkIGludCBtb3VudGNkOjE7CS8vIFNob3VsZCB3ZSBtb3VudCB0aGUgY2QKKyAgICB1bnNpZ25lZCBpbnQgd2lucmVwOjE7CS8vIFdhbnQgdG8gcmVwYWlyIHdpbmRvd3M/CisgICAgdW5zaWduZWQgaW50IGxpbnJlcDoxOwkvLyBXYW50IHRvIHJlcGFpciBsaW51eD8KK30gZmxhZ3M7CisKKy8vIFNvbWUgbWVudSBvcHRpb25zCit0X21lbnVpdGVtICpiYXNldXJsLCAqbW91bnRjZCwgKm5ldHdvcmssICpydW5wcmVwLCAqd2lucmVwLCAqbGlucmVwOwordF9tZW51aXRlbSAqc3RhdCwgKmRoY3AsICpub25lLCAqcHJlcG9wdCwgKnNlY3JldDsKKworLy8gYWxsIHRoZSBtZW51cyB3ZSBhcmUgZ29pbmcgdG8gZGVjbGFyZQordW5zaWduZWQgY2hhciBURVNUSU5HLCBSRVNDVUUsIE1BSU4sIFBSRVBNRU5VLCBORVRNRU5VLCBMT05HTUVOVSwgU0VDUkVUTUVOVTsKKworY2hhciB1c2VybmFtZVsxMl07CQkvLyBOYW1lIG9mIHVzZXIgY3VycmVudGx5IHVzaW5nIHRoZSBzeXN0ZW0KKworLyogRW5kIGdsb2JhbHMgKi8KKworVElNRU9VVENPREUgb250aW1lb3V0KHZvaWQpCit7CisgICAgYmVlcCgpOworICAgIHJldHVybiBDT0RFX1dBSVQ7Cit9CisKKyNkZWZpbmUgSU5GTElORSAyMgorI2RlZmluZSBQV0RMSU5FIDMKKyNkZWZpbmUgUFdEUFJPTVBUIDIxCisjZGVmaW5lIFBXRENPTFVNTiA2MAorI2RlZmluZSBQV0RBVFRSIDB4NzQKKyNkZWZpbmUgRURJVFBST01QVCAyMQorCit2b2lkIGtleXNfaGFuZGxlcih0X21lbnVzeXN0ZW0gKiBtcyBfX2F0dHJpYnV0ZV9fICgoIHVudXNlZCApKSwgdF9tZW51aXRlbSAqIG1pLCBpbnQgc2NhbmNvZGUpCit7CisgICAgaW50IG5jLCBucjsKKworICAgIGlmICgoc2NhbmNvZGUpID09IEtFWV9GMSAmJiBtaS0+aGVscGlkICE9IDB4RkZGRikgewkvLyBJZiBzY2FuY29kZSBvZiBGMQorCXJ1bmhlbHBzeXN0ZW0obWktPmhlbHBpZCk7CisgICAgfQorICAgIC8vIElmIHVzZXIgaGl0IFRBQiwgYW5kIGl0ZW0gaXMgYW4gImV4ZWN1dGFibGUiIGl0ZW0KKyAgICAvLyBhbmQgdXNlciBoYXMgcHJpdmlsZWdlcyB0byBlZGl0IGl0LCBlZGl0IGl0IGluIHBsYWNlLgorICAgIGlmICgoc2NhbmNvZGUgPT0gS0VZX1RBQikgJiYgKG1pLT5hY3Rpb24gPT0gT1BUX1JVTikgJiYKKwkoaXNhbGxvd2VkKHVzZXJuYW1lLCAiZWRpdGNtZCIpIHx8IGlzYWxsb3dlZCh1c2VybmFtZSwgInJvb3QiKSkpIHsKKyAgICBpZiAoZ2V0c2NyZWVuc2l6ZSgxLCAmbnIsICZuYykpIHsKKyAgICAgICAgLyogVW5rbm93biBzY3JlZW4gc2l6ZT8gKi8KKyAgICAgICAgbmMgPSA4MDsKKyAgICAgICAgbnIgPSAyNDsKKyAgICB9CisJLy8gVXNlciB0eXBlZCBUQUIgYW5kIGhhcyBwZXJtaXNzaW9ucyB0byBlZGl0IGNvbW1hbmQgbGluZQorCWdvdG94eShFRElUUFJPTVBULCAxKTsKKwljc3ByaW50KCJDb21tYW5kIGxpbmU6IiwgMHgwNyk7CisJZWRpdHN0cmluZyhtaS0+ZGF0YSwgQUNUSU9OTEVOKTsKKwlnb3RveHkoRURJVFBST01QVCwgMSk7CisgICAgY2xlYXJfbGluZSgpOworICAgIH0KK30KKwordF9oYW5kbGVyX3JldHVybiBsb2dpbl9oYW5kbGVyKHRfbWVudXN5c3RlbSAqIG1zLCB0X21lbnVpdGVtICogbWkpCit7CisgICAgKHZvaWQpbWk7CQkJLy8gVW51c2VkCisgICAgY2hhciBwd2RbNDBdOworICAgIGNoYXIgbG9naW5bNDBdOworICAgIGludCBuYywgbnI7CisgICAgdF9oYW5kbGVyX3JldHVybiBydjsKKworICAgICh2b2lkKW1zOworCisgICAgaWYgKG1pLT5pdGVtID09IGxvZ2luc3RyKSB7CS8qIFVzZXIgd2FudHMgdG8gbG9naW4gKi8KKyAgICBpZiAoZ2V0c2NyZWVuc2l6ZSgxLCAmbnIsICZuYykpIHsKKyAgICAgICAgLyogVW5rbm93biBzY3JlZW4gc2l6ZT8gKi8KKyAgICAgICAgbmMgPSA4MDsKKyAgICAgICAgbnIgPSAyNDsKKyAgICB9CisJZ290b3h5KFBXRFBST01QVCwgMSk7CisJY3NwcmludCgiRW50ZXIgVXNlcm5hbWU6ICIsIDB4MDcpOworCWdldHN0cmluZyhsb2dpbiwgc2l6ZW9mIHVzZXJuYW1lKTsKKwlnb3RveHkoUFdEUFJPTVBULCAxKTsKKyAgICBjbGVhcl9saW5lKCk7CisJY3NwcmludCgiRW50ZXIgUGFzc3dvcmQ6ICIsIDB4MDcpOworCWdldHB3ZChwd2QsIHNpemVvZiBwd2QpOworCWdvdG94eShQV0RQUk9NUFQsIDEpOworICAgIGNsZWFyX2xpbmUoKTsKKworCWlmIChhdXRoZW50aWNhdGVfdXNlcihsb2dpbiwgcHdkKSkgeworCSAgICBzdHJjcHkodXNlcm5hbWUsIGxvZ2luKTsKKwkgICAgbWktPml0ZW0gPSBsb2dvdXRzdHI7CS8vIENoYW5nZSBpdGVtIHRvIHJlYWQgIkxvZ291dCIKKwl9IGVsc2UKKwkgICAgc3RyY3B5KHVzZXJuYW1lLCBHVUVTVF9VU0VSKTsKKyAgICB9IGVsc2UJCQkvLyBVc2VyIG5lZWRzIHRvIGxvZ291dAorICAgIHsKKwlzdHJjcHkodXNlcm5hbWUsIEdVRVNUX1VTRVIpOworCW1pLT5pdGVtID0gbG9naW5zdHI7CisgICAgfQorCisgICAgaWYgKHN0cmNtcCh1c2VybmFtZSwgR1VFU1RfVVNFUikgPT0gMCkgeworCXByZXBvcHQtPmFjdGlvbiA9IE9QVF9JTkFDVElWRTsKKwlzZWNyZXQtPmFjdGlvbiA9IE9QVF9JTlZJU0lCTEU7CisgICAgfSBlbHNlIHsKKwlwcmVwb3B0LT5hY3Rpb24gPSBPUFRfU1VCTUVOVTsKKwlwcmVwb3B0LT5pdGVtZGF0YS5yYWRpb21lbnVudW0gPSBQUkVQTUVOVTsKKwlzZWNyZXQtPmFjdGlvbiA9IE9QVF9TVUJNRU5VOworCXNlY3JldC0+aXRlbWRhdGEuc3VibWVudW51bSA9IFNFQ1JFVE1FTlU7CisgICAgfQorICAgIHJ2LnZhbGlkID0gMDsKKyAgICBydi5yZWZyZXNoID0gMTsKKyAgICBydi5yZXNlcnZlZCA9IDA7CisgICAgcmV0dXJuIHJ2OworfQorCit2b2lkIG1zeXNfaGFuZGxlcih0X21lbnVzeXN0ZW0gKiBtcywgdF9tZW51aXRlbSAqIG1pKQoreworICAgIGludCBuYywgbnI7CisgICAgdm9pZCAqdjsKKworICAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZuciwgJm5jKSkgeworICAgICAgICAvKiBVbmtub3duIHNjcmVlbiBzaXplPyAqLworICAgICAgICBuYyA9IDgwOworICAgICAgICBuciA9IDI0OworICAgIH0KKyAgICBnb3RveHkoUFdETElORSwgUFdEQ09MVU1OKTsKKyAgICBjc3ByaW50KCJVc2VyOiAiLCBQV0RBVFRSKTsKKyAgICBjcHJpbnQobXMtPmZpbGxjaGFyLCBtcy0+ZmlsbGF0dHIsIHNpemVvZiB1c2VybmFtZSk7CisgICAgZ290b3h5KFBXRExJTkUsIFBXRENPTFVNTiArIDYpOworICAgIGNzcHJpbnQodXNlcm5hbWUsIFBXREFUVFIpOworCisgICAgaWYgKG1pLT5wYXJpbmRleCAhPSBQUkVQTUVOVSkJLy8gSWYgd2UgYXJlIG5vdCBpbiB0aGUgUFJFUCBNRU5VCisgICAgeworCWdvdG94eShJTkZMSU5FLCAwKTsKKyAgICByZXNldF9jb2xvcnMoKTsKKyAgICBjbGVhcl9saW5lKCk7CisJZ290b3h5KElORkxJTkUgKyAxLCAwKTsKKyAgICBjbGVhcl9saW5lKCk7CisJcmV0dXJuOworICAgIH0KKyAgICBzdHJjcHkoaW5mb2xpbmUsICIgIik7CisgICAgaWYgKGZsYWdzLmJhc2V1cmwpCisJc3RyY2F0KGluZm9saW5lLCAiYmFzZXVybD1odHRwOi8vMTkyLjE2OC4xMS4xMi9ndWkgIik7CisgICAgaWYgKGZsYWdzLm1vdW50Y2QpCisJc3RyY2F0KGluZm9saW5lLCAibW91bnRjZD15ZXMgIik7CisgICAgdiA9ICh2b2lkICopbmV0d29yay0+ZGF0YTsKKyAgICBpZiAodiAhPSBOVUxMKQkJLy8gU29tZSBuZXR3b3JrIG9wdGlvbiBzcGVjaWZpZWQKKyAgICB7CisJc3RyY2F0KGluZm9saW5lLCAibmV0d29yaz0iKTsKKwlzdHJjYXQoaW5mb2xpbmUsIChjaGFyICopKCgodF9tZW51aXRlbSAqKSB2KS0+ZGF0YSkpOworICAgIH0KKyAgICBpZiAoZmxhZ3Mud2lucmVwKQorCXN0cmNhdChpbmZvbGluZSwgInJlcGFpcj13aW4gIik7CisgICAgaWYgKGZsYWdzLmxpbnJlcCkKKwlzdHJjYXQoaW5mb2xpbmUsICJyZXBhaXI9bGluICIpOworCisgICAgZ290b3h5KElORkxJTkUsIDApOworICAgIHJlc2V0X2NvbG9ycygpOworICAgIGNsZWFyX2xpbmUoKTsKKyAgICBnb3RveHkoSU5GTElORSArIDEsIDApOworICAgIGNsZWFyX2xpbmUoKTsKKyAgICBnb3RveHkoSU5GTElORSwgMCk7CisgICAgY3NwcmludCgiS2VybmVsIEFyZ3VtZW50czoiLCAweDA3KTsKKyAgICBnb3RveHkoSU5GTElORSwgMTcpOworICAgIGNzcHJpbnQoaW5mb2xpbmUsIDB4MDcpOworfQorCit0X2hhbmRsZXJfcmV0dXJuIG5ldHdvcmtfaGFuZGxlcih0X21lbnVzeXN0ZW0gKiBtcywgdF9tZW51aXRlbSAqIG1pKQoreworICAgIC8vIG1pPW5ldHdvcmsgc2luY2UgdGhpcyBpcyBoYW5kbGVyIG9ubHkgZm9yIHRoYXQuCisgICAgKHZvaWQpbXM7CQkJLy8gVW51c2VkCisKKyAgICBpZiAobWktPmRhdGEgPT0gKHZvaWQgKilub25lKQorCW1pLT5pdGVtID0gbm9uZXQ7CisgICAgaWYgKG1pLT5kYXRhID09ICh2b2lkICopc3RhdCkKKwltaS0+aXRlbSA9IHN0YXRuZXQ7CisgICAgaWYgKG1pLT5kYXRhID09ICh2b2lkICopZGhjcCkKKwltaS0+aXRlbSA9IGRoY3BuZXQ7CisgICAgcmV0dXJuIEFDVElPTl9JTlZBTElEOwkvLyBWQUxJRCBvciBJTlZBTElEIGRvZXMgbm90IG1hdHRlcgorfQorCit0X2hhbmRsZXJfcmV0dXJuIGNoZWNrYm94X2hhbmRsZXIodF9tZW51c3lzdGVtICogbXMsIHRfbWVudWl0ZW0gKiBtaSkKK3sKKyAgICAodm9pZCltczsJCQkvKiBVbnVzZWQgKi8KKworICAgIHRfaGFuZGxlcl9yZXR1cm4gcnY7CisKKyAgICBpZiAobWktPmFjdGlvbiAhPSBPUFRfQ0hFQ0tCT1gpCisJcmV0dXJuIEFDVElPTl9JTlZBTElEOworCisgICAgaWYgKHN0cmNtcChtaS0+ZGF0YSwgImJhc2V1cmwiKSA9PSAwKQorCWZsYWdzLmJhc2V1cmwgPSAobWktPml0ZW1kYXRhLmNoZWNrZWQgPyAxIDogMCk7CisgICAgaWYgKHN0cmNtcChtaS0+ZGF0YSwgIndpbnJlcGFpciIpID09IDApIHsKKwlpZiAobWktPml0ZW1kYXRhLmNoZWNrZWQpIHsKKwkgICAgZmxhZ3Mud2lucmVwID0gMTsKKwkgICAgbGlucmVwLT5hY3Rpb24gPSBPUFRfSU5BQ1RJVkU7CisJfSBlbHNlIHsKKwkgICAgZmxhZ3Mud2lucmVwID0gMDsKKwkgICAgbGlucmVwLT5hY3Rpb24gPSBPUFRfQ0hFQ0tCT1g7CisJfQorICAgIH0KKyAgICBpZiAoc3RyY21wKG1pLT5kYXRhLCAibGlucmVwYWlyIikgPT0gMCkgeworCWlmIChtaS0+aXRlbWRhdGEuY2hlY2tlZCkgeworCSAgICBmbGFncy5saW5yZXAgPSAxOworCSAgICB3aW5yZXAtPmFjdGlvbiA9IE9QVF9JTkFDVElWRTsKKwl9IGVsc2UgeworCSAgICBmbGFncy53aW5yZXAgPSAwOworCSAgICB3aW5yZXAtPmFjdGlvbiA9IE9QVF9DSEVDS0JPWDsKKwl9CisgICAgfQorICAgIGlmIChzdHJjbXAobWktPmRhdGEsICJtb3VudGNkIikgPT0gMCkKKwlmbGFncy5tb3VudGNkID0gKG1pLT5pdGVtZGF0YS5jaGVja2VkID8gMSA6IDApOworCisgICAgcnYudmFsaWQgPSAwOworICAgIHJ2LnJlZnJlc2ggPSAxOworICAgIHJ2LnJlc2VydmVkID0gMDsKKyAgICByZXR1cm4gcnY7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgdF9tZW51aXRlbSAqY3VycjsKKyAgICBjaGFyIGNtZFsxNjBdOworICAgIGNoYXIgaXBbMzBdOworCisgICAgLy8gU2V0IGRlZmF1bHQgdXNlcm5hbWUgYXMgZ3Vlc3QKKyAgICBzdHJjcHkodXNlcm5hbWUsIEdVRVNUX1VTRVIpOworCisgICAgLy8gU3dpdGNoIHZpZGVvIG1vZGUgaGVyZQorICAgIC8vIHNldHZpZGVvbW9kZSgweDE4KTsgLy8gb3Igd2hhdGV2ZXIgbW9kZSB5b3Ugd2FudAorCisgICAgLy8gQ2hvb3NlIHRoZSBkZWZhdWx0IHRpdGxlIGFuZCBzZXR1cCBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIGF0dHJpYnV0ZXMuLi4uCisgICAgaW5pdF9wYXNzd29yZHMoIi9pc29saW51eC9wYXNzd29yZCIpOworICAgIGluaXRfaGVscCgiL2lzb2xpbnV4L2hlbHAiKTsKKyAgICBpbml0X21lbnVzeXN0ZW0oTlVMTCk7CisgICAgc2V0X3dpbmRvd19zaXplKDEsIDEsIDIwLCA3OCk7CS8vIExlYXZlIHNvbWUgc3BhY2UgYXJvdW5kCisKKyAgICAvLyBDaG9vc2UgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgYXR0cmlidXRlcyBhbmQgY2hhcidzCisgICAgLy8gLTEgbWVhbnMgY2hvb3NlIGRlZmF1bHRzIChBY3R1YWxseSB0aGUgbmV4dCA0IGxpbmVzIGFyZSBub3QgbmVlZGVkKQorICAgIC8vc2V0X25vcm1hbF9hdHRyICgtMSwtMSwtMSwtMSk7CisgICAgLy9zZXRfc3RhdHVzX2luZm8gKC0xLC0xKTsgLy8gRGlzcGxheSBzdGF0dXMgb24gdGhlIGxhc3QgbGluZQorICAgIC8vc2V0X3RpdGxlX2luZm8gICgtMSwtMSk7CisgICAgLy9zZXRfbWlzY19pbmZvKC0xLC0xLC0xLC0xKTsKKworICAgIC8vIFJlZ2lzdGVyIHRoZSBtZW51c3lzdGVtIGhhbmRsZXIKKyAgICByZWdfaGFuZGxlcihIRExSX1NDUkVFTiwgJm1zeXNfaGFuZGxlcik7CisgICAgcmVnX2hhbmRsZXIoSERMUl9LRVlTLCAma2V5c19oYW5kbGVyKTsKKyAgICAvLyBSZWdpc3RlciB0aGUgb250aW1lb3V0IGhhbmRsZXIsIHdpdGggYSB0aW1lIG91dCBvZiAxMCBzZWNvbmRzCisgICAgcmVnX29udGltZW91dChvbnRpbWVvdXQsIDEwLCAwKTsKKworICAgIE5FVE1FTlUgPSBhZGRfbWVudSgiIEluaXQgTmV0d29yayAiLCAtMSk7CisgICAgbm9uZSA9IGFkZF9pdGVtKCI8Tj5vbmUiLCAiRG9udCBzdGFydCBuZXR3b3JrIiwgT1BUX1JBRElPSVRFTSwgIm5vICIsIDApOworICAgIGRoY3AgPSBhZGRfaXRlbSgiPGQ+aGNwIiwgIlVzZSBESENQIiwgT1BUX1JBRElPSVRFTSwgImRoY3AgIiwgMCk7CisgICAgc3RhdCA9CisJYWRkX2l0ZW0oIjxzPnRhdGljIiwgIlVzZSBzdGF0aWMgSVAgSSB3aWxsIHNwZWNpZnkgbGF0ZXIiLAorCQkgT1BUX1JBRElPSVRFTSwgInN0YXRpYyAiLCAwKTsKKworICAgIFRFU1RJTkcgPSBhZGRfbWVudSgiIFRlc3RpbmcgIiwgLTEpOworICAgIHNldF9tZW51X3Bvcyg1LCA1NSk7CisgICAgYWRkX2l0ZW0oIjxNPmVtb3J5IFRlc3QiLCAiUGVyZm9ybSBleHRlbnNpdmUgbWVtb3J5IHRlc3RpbmciLCBPUFRfUlVOLAorCSAgICAgIm1lbXRlc3QiLCAwKTsKKyAgICBhZGRfaXRlbSgiPEk+bnZpc2libGUiLCAiWW91IGRvbnQgc2VlIHRoaXMiLCBPUFRfSU5WSVNJQkxFLCAianVuayIsIDApOworICAgIGFkZF9pdGVtKCI8RT54aXQgdGhpcyBtZW51IiwgIkdvIG9uZSBsZXZlbCB1cCIsIE9QVF9FWElUTUVOVSwgImV4aXQiLCAwKTsKKworICAgIFJFU0NVRSA9IGFkZF9tZW51KCIgUmVzY3VlIE9wdGlvbnMgIiwgLTEpOworICAgIGFkZF9pdGVtKCI8TD5pbnV4IFJlc2N1ZSIsICJsaW5yZXNjIiwgT1BUX1JVTiwgImxpbnJlc2MiLCAwKTsKKyAgICBhZGRfaXRlbSgiPEQ+b3MgUmVzY3VlIiwgImRvc3Jlc2MiLCBPUFRfUlVOLCAiZG9zcmVzYyIsIDApOworICAgIGFkZF9pdGVtKCI8Vz5pbmRvd3MgUmVzY3VlIiwgIndpbnJlc2MiLCBPUFRfUlVOLCAid2lucmVzYyIsIDApOworICAgIGFkZF9pdGVtKCI8RT54aXQgdGhpcyBtZW51IiwgIkdvIG9uZSBsZXZlbCB1cCIsIE9QVF9FWElUTUVOVSwgImV4aXQiLCAwKTsKKworICAgIFBSRVBNRU5VID0gYWRkX21lbnUoIiBQcmVwIG9wdGlvbnMgIiwgLTEpOworICAgIGJhc2V1cmwgPQorCWFkZF9pdGVtKCI8Yj5hc2V1cmwgYnkgSVA/IiwgIlNwZWNpZnkgZ3VpIGJhc2V1cmwgYnkgSVAgYWRkcmVzcyIsCisJCSBPUFRfQ0hFQ0tCT1gsICJiYXNldXJsIiwgMCk7CisgICAgbW91bnRjZCA9CisJYWRkX2l0ZW0oIjxtPm91bnRjZD8iLCAiTW91bnQgdGhlIGNkcm9tIGRyaXZlPyIsIE9QVF9DSEVDS0JPWCwKKwkJICJtb3VudGNkIiwgMCk7CisgICAgbmV0d29yayA9CisJYWRkX2l0ZW0oZGhjcG5ldCwgIkhvdyB0byBpbml0aWFsaXNlIG5ldHdvcmsgZGV2aWNlPyIsIE9QVF9SQURJT01FTlUsCisJCSBOVUxMLCBORVRNRU5VKTsKKyAgICBhZGRfc2VwKCk7CisgICAgd2lucmVwID0KKwlhZGRfaXRlbSgiUmVpbnN0YWxsIDx3PmluZG93cyIsCisJCSAiUmUtaW5zdGFsbCB0aGUgd2luZG93cyBzaWRlIG9mIGEgZHVhbCBib290IHNldHVwIiwKKwkJIE9QVF9DSEVDS0JPWCwgIndpbnJlcGFpciIsIDApOworICAgIGxpbnJlcCA9CisJYWRkX2l0ZW0oIlJlaW5zdGFsbCA8bD5pbnV4IiwKKwkJICJSZS1pbnN0YWxsIHRoZSBsaW51eCBzaWRlIG9mIGEgZHVhbCBib290IHNldHVwIiwgT1BUX0NIRUNLQk9YLAorCQkgImxpbnJlcGFpciIsIDApOworICAgIGFkZF9zZXAoKTsKKyAgICBydW5wcmVwID0KKwlhZGRfaXRlbSgiPFI+dW4gcHJlcCBub3ciLCAiRXhlY3V0ZSBwcmVwIHdpdGggdGhlIGFib3ZlIG9wdGlvbnMiLAorCQkgT1BUX1JVTiwgInByZXAiLCAwKTsKKyAgICBhZGRfaXRlbSgiPEU+eGl0IHRoaXMgbWVudSIsICJHbyB1cCBvbmUgbGV2ZWwiLCBPUFRfRVhJVE1FTlUsICJleGl0bWVudSIsCisJICAgICAwKTsKKyAgICBiYXNldXJsLT5oYW5kbGVyID0gJmNoZWNrYm94X2hhbmRsZXI7CisgICAgbW91bnRjZC0+aGFuZGxlciA9ICZjaGVja2JveF9oYW5kbGVyOworICAgIHdpbnJlcC0+aGFuZGxlciA9ICZjaGVja2JveF9oYW5kbGVyOworICAgIGxpbnJlcC0+aGFuZGxlciA9ICZjaGVja2JveF9oYW5kbGVyOworICAgIG5ldHdvcmstPmhhbmRsZXIgPSAmbmV0d29ya19oYW5kbGVyOworICAgIGZsYWdzLmJhc2V1cmwgPSAwOworICAgIGZsYWdzLm1vdW50Y2QgPSAwOworICAgIGZsYWdzLndpbnJlcCA9IDA7CisgICAgZmxhZ3MubGlucmVwID0gMDsKKworICAgIFNFQ1JFVE1FTlUgPSBhZGRfbWVudSgiIFNlY3JldCBNZW51ICIsIC0xKTsKKyAgICBhZGRfaXRlbSgic2VjcmV0IDEiLCAiU2VjcmV0IiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgic2VjcmV0IDIiLCAiU2VjcmV0IiwgT1BUX1JVTiwgIkEiLCAwKTsKKworICAgIExPTkdNRU5VID0gYWRkX21lbnUoIiBMb25nIE1lbnUgIiwgNDApOwkvLyBPdmVycmlkZSBkZWZhdWx0IGhlcmUKKyAgICBhZGRfaXRlbSgiPEE+YSIsICJBYSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxCPmIiLCAiQWIiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8Qz4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxEPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPEU+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8Rj4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxHPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPEg+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8ST4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxKPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPEs+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8TD4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxKPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPEs+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8TD4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxNPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPE4+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8Tz4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxQPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPFE+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8Uj4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxTPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPFQ+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8VT4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxWPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPFc+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8WD4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjxZPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPFo+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8MT4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjwyPiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPDM+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8ND4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjw1PiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPDY+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworICAgIGFkZF9pdGVtKCI8Nz4iLCAiQSIsIE9QVF9SVU4sICJBIiwgMCk7CisgICAgYWRkX2l0ZW0oIjw4PiIsICJBIiwgT1BUX1JVTiwgIkEiLCAwKTsKKyAgICBhZGRfaXRlbSgiPDk+IiwgIkEiLCBPUFRfUlVOLCAiQSIsIDApOworCisgICAgTUFJTiA9IGFkZF9tZW51KCIgTWFpbiBNZW51ICIsIDgpOworICAgIGN1cnIgPSBhZGRfaXRlbShsb2dpbnN0ciwgIkxvZ2luIGFzIGEgcHJpdmlsZWdlZCB1c2VyIiwgT1BUX1JVTiwgTlVMTCwgMCk7CisgICAgc2V0X2l0ZW1fb3B0aW9ucygtMSwgMjMpOworICAgIGN1cnItPmhhbmRsZXIgPSAmbG9naW5faGFuZGxlcjsKKworICAgIGFkZF9pdGVtKCI8UD5yZXBhcmUiLCAicHJlcCIsIE9QVF9SVU4sICJwcmVwIiwgMCk7CisgICAgc2V0X2l0ZW1fb3B0aW9ucygtMSwgMjQpOworICAgIHByZXBvcHQgPQorCWFkZF9pdGVtKCI8UD5yZXAgb3B0aW9ucy4uLiIsCisJCSAiT3B0aW9ucyBmb3IgcHJlcCBpbWFnZTogUmVxdWlyZXMgYXV0aGVudGljYXRlZCB1c2VyIiwKKwkJIE9QVF9JTkFDVElWRSwgTlVMTCwgUFJFUE1FTlUpOworICAgIHNldF9pdGVtX29wdGlvbnMoLTEsIDI1KTsKKworICAgIGFkZF9pdGVtKCI8Uj5lc2N1ZSBvcHRpb25zLi4uIiwgIlRyb3VibGVzaG9vdCBhIHN5c3RlbSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCSAgICAgUkVTQ1VFKTsKKyAgICBzZXRfaXRlbV9vcHRpb25zKC0xLCAyNik7CisgICAgYWRkX2l0ZW0oIjxUPmVzdGluZy4uLiIsICJPcHRpb25zIHRvIHRlc3QgaGFyZHdhcmUiLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkgICAgIFRFU1RJTkcpOworICAgIHNldF9pdGVtX29wdGlvbnMoLTEsIDI3KTsKKyAgICBhZGRfaXRlbSgiPEw+b25nIE1lbnUuLi4iLCAidGVzdCBtZW51IHN5c3RlbSIsIE9QVF9TVUJNRU5VLCBOVUxMLCBMT05HTUVOVSk7CisgICAgc2V0X2l0ZW1fb3B0aW9ucygtMSwgMjgpOworICAgIHNlY3JldCA9CisJYWRkX2l0ZW0oIjxTPmVjcmV0IE1lbnUuLi4iLCAiU2VjcmV0IG1lbnUiLCBPUFRfSU5WSVNJQkxFLCBOVUxMLAorCQkgU0VDUkVUTUVOVSk7CisgICAgc2V0X2l0ZW1fb3B0aW9ucygtMSwgMjkpOworICAgIGFkZF9pdGVtKCI8RT54aXQgdG8gcHJvbXB0IiwgIkV4aXQgdGhlIG1lbnUgc3lzdGVtIiwgT1BUX0VYSVRNRU5VLCAiZXhpdCIsCisJICAgICAwKTsKKyAgICBzZXRfaXRlbV9vcHRpb25zKC0xLCAzMCk7CisgICAgY3NwcmludCgiUHJlc3MgYW55IGtleSB3aXRoaW4gNSBzZWNvbmRzIHRvIHNob3cgbWVudS4uLiIsIDB4MDcpOworICAgIGlmIChnZXRfa2V5KHN0ZGluLCA1MCkgPT0gS0VZX05PTkUpCS8vIEdyYW51bGFyaXR5IG9mIDEwMCBtaWxsaXNlY29uZHMKKyAgICB7CisJY3NwcmludCgiU29ycnkhIFRpbWUncyB1cC5cclxuIiwgMHgwNyk7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGN1cnIgPSBzaG93bWVudXMoTUFJTik7CisgICAgaWYgKGN1cnIpIHsKKwlpZiAoY3Vyci0+YWN0aW9uID09IE9QVF9SVU4pIHsKKwkgICAgc3RyY3B5KGNtZCwgY3Vyci0+ZGF0YSk7CisJICAgIGlmIChjdXJyID09IHJ1bnByZXApIHsKKwkJc3RyY2F0KGNtZCwgaW5mb2xpbmUpOworCQlpZiAobmV0d29yay0+ZGF0YSA9PSAodm9pZCAqKXN0YXQpCS8vIFdlIHdhbnQgc3RhdGljCisJCXsKKwkJICAgIGNzcHJpbnQoIkVudGVyIElQIGFkZHJlc3MgKGxhc3QgdHdvIG9jdGV0cyBvbmx5KTogIiwgMHgwNyk7CisJCSAgICBzdHJjcHkoaXAsICJKdW5rIik7CisJCSAgICBlZGl0c3RyaW5nKGlwLCBzaXplb2YgaXApOworCQkgICAgc3RyY2F0KGNtZCwgImlwYWRkcj0xOTIuMTY4LiIpOworCQkgICAgc3RyY2F0KGNtZCwgaXApOworCQl9CisJICAgIH0KKwkgICAgaWYgKGlzc3lzbGludXgoKSkKKwkJcnVuc3lzbGludXhjbWQoY21kKTsKKwkgICAgZWxzZQorCQljc3ByaW50KGNtZCwgMHgwNyk7CisJICAgIHJldHVybiAxOwkJLy8gU2hvdWxkIG5vdCBoYXBwZW4gd2hlbiBydW4gZnJvbSBTWVNMSU5VWAorCX0KKyAgICB9CisgICAgLy8gSWYgdXNlciBxdWl0cyB0aGUgbWVudSBzeXN0ZW0sIGNvbnRyb2wgY29tZXMgaGVyZQorICAgIC8vIElmIHlvdSB3YW50IHRvIGV4ZWN1dGUgc29tZSBzcGVjaWZpYyBjb21tYW5kIHVuY29tbWVudCB0aGUgbmV4dCB0d28gbGluZXMKKworICAgIC8vIGlmIChzeXNsaW51eCkgcnVuY29tbWFuZChZT1VSX0NPTU1BTkRfSEVSRSk7CisgICAgLy8gZWxzZSBjc3ByaW50KFlPVVJfQ09NTUFORF9IRVJFLDB4MDcpOworCisgICAgLy8gRGVhbGxvY2F0ZSBzcGFjZSB1c2VkIGZvciB0aGVzZSBkYXRhIHN0cnVjdHVyZXMKKyAgICBjbG9zZV9wYXNzd29yZHMoKTsKKyAgICBjbG9zZV9oZWxwKCk7CisgICAgY2xvc2VfbWVudXN5c3RlbSgpOworCisgICAgLy8gUmV0dXJuIHRvIHByb21wdAorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvZGlzcGxheS5jIGIvY29tMzIvY21lbnUvZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjEyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jbWVudS9kaXNwbGF5LmMKQEAgLTAsMCArMSwzNiBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBNdXJhbGkgS3Jpc2huYW4gR2FuYXBhdGh5IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCAqKSAwKQorI2VuZGlmCisKKyNpbmNsdWRlICJoZWxwLmgiCisjaW5jbHVkZSAiY29tMzJpby5oIgorI2luY2x1ZGUgImNtZW51LmgiCisjaW5jbHVkZSAidHVpLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGlmIChhcmdjIDwgMikgeworCWNzcHJpbnQoIlVzYWdlOiBkaXNwbGF5LmMzMiA8dGV4dGZpbGU+XG4iLCAweDA3KTsKKwlleGl0KDEpOworICAgIH0KKworICAgIGluaXRfaGVscChOVUxMKTsJCS8vIE5vIGJhc2UgZGlyLCBzbyBhbGwgZmlsZW5hbWVzIG11c3QgYmUgYWJzb2x1dGUKKyAgICBydW5oZWxwKGFyZ3ZbMV0pOworICAgIGNsb3NlX2hlbHAoKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2NtZW51L2xpYm1lbnUvY21lbnUuaCBiL2NvbTMyL2NtZW51L2xpYm1lbnUvY21lbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDFkMmVmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvbGlibWVudS9jbWVudS5oCkBAIC0wLDAgKzEsMjk0IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA1IE11cmFsaSBLcmlzaG5hbiBHYW5hcGF0aHkgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBwcm9ncmFtIGNhbiBiZSBjb21waWxlZCBmb3IgRE9TIHdpdGggdGhlIE9wZW5XYXRjb20gY29tcGlsZXIKKyAqIChodHRwOi8vd3d3Lm9wZW53YXRjb20ub3JnLyk6CisgKgorICogd2NsIC0zIC1vc3ggLW10IDxmaWxlbmFtZT4uYworICovCisKKyNpZm5kZWYgX19NRU5VX0hfXworI2RlZmluZSBfX01FTlVfSF9fCisKKyNpbmNsdWRlICJjb20zMmlvLmgiCisjaW5jbHVkZSAidHVpLmgiCisjaW5jbHVkZSAic3lzbG54LmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8vIFRJTUVPVVQgUEFSQU1FVEVSUworLyogSWYgbm8ga2V5IGlzIHByZXNzZWQgd2l0aGluIFRJTUVPVVROVU1TVEVQUyAqIFRJTUVPVVRTVEVQU0laRSBtaWxsaXNlY29uZHMKKyAgIGFuZCBpZiBhIHRpbWVvdXQgaGFuZGxlciBpcyByZWdpc3RlcmVkLCB0aGVuIHRoYXQgd2lsbCBiZSBjYWxsZWQuCisgICBUaGUgaGFuZGxlciBzaG91bGQgZWl0aGVyIGVpdGhlciB0YWtlIGNvbnRyb2wgZnJvbSB0aGVyZSBvbiwgb3IgcmV0dXJuIHdpdGhvdXQKKyAgIHByb2R1Y2luZyBhbnkgY2hhbmdlIGluIHRoZSBjdXJyZW50IHZpZGVvIHNldHRpbmdzLgorCisgICBGb3IgZS5nLiB0aGUgaGFuZGxlciBjb3VsZAorICAgKiBDb3VsZCBqdXN0IHF1aXQgdGhlIG1lbnUgcHJvZ3JhbQorICAgKiBiZWVwIGFuZCByZXR1cm4uCisKKyAgIFRJTUVPVVRTVEVQU0laRSBpcyB0aGUgaW50ZXJ2YWwgZm9yIHdoaWNoIHRoZSBwcm9ncmFtIHNsZWVwcyB3aXRob3V0IGNoZWNraW5nIGZvcgorICAgYW55IGtleXN0cm9rZS4gU28gaW5jcmVhc2luZyB0aGlzIHdpbGwgbWFrZSB0aGUgcmVzcG9uc2Ugb2YgdGhlIHN5c3RlbSBzbG93LgorICAgRGVjcmVhc2luZyB0aGlzIHdpbGwgbWFrZSBhIGxvdCBvZiBpbnRlcnJ1cHQgY2FsbHMgdXNpbmcgdXAgeW91ciBDUFUuIERlZmF1bHQKKyAgIHZhbHVlIG9mIFRJTUVPVVRTVEVQU0laRSBvZiAwLjEgc2Vjb25kcyBzaG91bGQgYmUgcmlnaHQgaW4gbW9zdCBjYXNlcy4KKworICAgVElNRU9VVE5VTVNURVBTIG9mIDMwMDAgY29ycmVzcG9uZHMgdG8gYSB3YWl0IHRpbWUgb2YgMzAwIHNlY29uZHMgb3IgNSBtaW51dGVzCisqLworCisjZGVmaW5lIFRJTUVPVVRTVEVQU0laRSAxMAorI2RlZmluZSBUSU1FT1VUTlVNU1RFUFMgMzAwMDBMCisKKy8vIEF0dHJpYnV0ZXMKKyNkZWZpbmUgTk9STUFMQVRUUiAgICAweDE3CisjZGVmaW5lIE5PUk1BTEhMSVRFICAgMHgxRgkvLyBOb3JtYWwgSGlnaGxpZ2h0IGF0dHJpYnV0ZQorI2RlZmluZSBSRVZFUlNFQVRUUiAgIDB4NzAKKyNkZWZpbmUgUkVWRVJTRUhMSVRFICAweDc4CS8vIFJldmVyc2UgSGlnaHRsaWdodCBhdHRyaWJ1dGUKKyNkZWZpbmUgSU5BQ1RBVFRSICAgICAweDE4CisjZGVmaW5lIElOQUNUSExJVEUgICAgMHgxMAkvLyBJbmFjdGl2ZSBIaWdobGlnaHQgYXR0cmlidXRlCisjZGVmaW5lIFJFVklOQUNUQVRUUiAgMHg3OAorI2RlZmluZSBSRVZJTkFDVEhMSVRFIDB4NzAJLy8gUmV2ZXJzZSBJbmFjdGl2ZSBIaWdobGlnaHQgYXR0cgorCisjZGVmaW5lIFNUQVRVU0FUVFIgICAgMHg3NAorI2RlZmluZSBTVEFUVVNITElURSAgIDB4N0IJLy8gU3RhdHVzIGhpZ2hsaWdodAorCisjZGVmaW5lIEZJTExDSEFSICAgICAgJyAnCisjZGVmaW5lIEZJTExBVFRSICAgICAgTk9STUFMQVRUUgorI2RlZmluZSBTSEFET1dBVFRSICAgIDB4MDAKKyNkZWZpbmUgU1BBQ0VDSEFSICAgICAnICcKKworI2RlZmluZSBURklMTENIQVIgICAgICcgJworI2RlZmluZSBUSVRMRUFUVFIgICAgIDB4NzAKKworI2RlZmluZSBFTkFCTEVITElURSAgICc8JwkvLyBDaGFyIHdoaWNoIHR1cm5zIG9uIGhpZ2hsaWdodAorI2RlZmluZSBESVNBQkxFSExJVEUgICc+JwkvLyBDaGFyIHdoaWNoIHR1cm5zIG9mZiBoaWdobGlnaHQKKyNkZWZpbmUgTk9ITElURSAgICAgICAwCQkvLyBUaGUgb2Zmc2V0IGludG8gYXR0cmliIGFycmF5IGZvciBub24taGlsaXRlCisjZGVmaW5lIEhMSVRFICAgICAgICAgMQkJLy8gVGhlIG9mZnNldCBmb3IgSGxpdGUgYXR0cmliCisKKyNkZWZpbmUgTU9SRUFCT1ZFICAgICdeJwkJLy8gY2hhciB0byBwcmludCB3aGVuIG1vcmUgbWVudSBpdGVtcyBhdmFpbGFibGUgYWJvdmUKKyNkZWZpbmUgTU9SRUJFTE9XICAgICd2JwkJLy8gbW9yZSBpdGVtcyBhdmFpbGFibGUgYmVsb3cKKworLy8gQXR0cmlidXRlcyBvZiB0aGUgbWVudSBzeXN0ZW0KKyNkZWZpbmUgTUFYTUVOVVMgICAgICAyNTAJLy8gTWF4aW11bSBudW1iZXIgb2YgbWVudSdzIGFsbG93ZWQKKyNkZWZpbmUgTUFYTUVOVVNJWkUgICAxMDAJLy8gRGVmYXVsdCB2YWx1ZSBmb3IgbWF4IG51bSBvZiBlbnRyaWVzIGluIGVhY2ggbWVudQorI2RlZmluZSBNQVhNRU5VSEVJR0hUIDIwCS8vIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgZGlzcGxheWVkCisjZGVmaW5lIE1FTlVCT1hUWVBFICAgQk9YX1NJTlNJTgkvLyBEZWZhdWx0IGJveCB0eXBlIExvb2sgYXQgdHVpLmggZm9yIG90aGVyIHZhbHVlcworCisvLyBVcHBlciBib3VuZHMgb24gbGVuZ3RocworLy8gV2UgY29weSB0aGUgZ2l2ZW4gc3RyaW5nLCBzbyB1c2VyIGNhbiByZXVzZSB0aGUgc3BhY2UgdXNlZCB0byBzdG9yZSBpbmNvbWluZyBhcmd1bWVudHMuCisjZGVmaW5lIE1FTlVMRU4gICAgICAgNzgJLy8gRWFjaCBtZW51IGVudHJ5IGlzIGF0bW9zdCBNRU5VTEVOIGNoYXJzCisjZGVmaW5lIFNUQVRMRU4gICAgICAgNzgJLy8gTWF4aW11bSBsZW5ndGggb2Ygc3RhdHVzIHN0cmluZworI2RlZmluZSBUSVRMRUxFTiAgICAgIDc4CS8vIE1heGltdW0gbGVuZ3RoIG9mIHRpdGxlIHN0cmluZworI2RlZmluZSBBQ1RJT05MRU4gICAgIDI1NQkvLyBNYXhpbXVtIGxlbmd0aCBvZiBhbiBhY3Rpb24gc3RyaW5nCisKKy8vIExheW91dCBvZiBtZW51CisjZGVmaW5lIE1FTlVST1cgICAgICAgMwkJLy8gUm93IHdoZXJlIG1lbnUgaXMgZGlzcGxheWVkIChyZWxhdGl2ZSB0byB3aW5kb3cpCisjZGVmaW5lIE1FTlVDT0wgICAgICAgNAkJLy8gQ29sIHdoZXJlIG1lbnUgaXMgZGlzcGxheWVkIChyZWxhdGl2ZSB0byB3aW5kb3cpCisjZGVmaW5lIE1FTlVQQUdFICAgICAgMQkJLy8gc2hvdyBpbiBkaXNwbGF5IHBhZ2UgMQorI2RlZmluZSBTVEFUTElORSAgICAgIDI0CS8vIExpbmUgbnVtYmVyIHdoZXJlIHN0YXR1cyBsaW5lIHN0YXJ0cyAocmVsYXRpdmUgdG8gd2luZG93KQorCisvLyBVc2VkIGZvciBwcmludGluZyBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyNkZWZpbmUgREVCVUdMSU5FICAgICAyMwkvLyBkZWJ1Z2dpbmcgaW5mbyBnb2VzIGhlcmUKKworLy8gT3RoZXIgQ2hhcnMKKyNkZWZpbmUgUkFESU9NRU5VQ0hBUiAnPicJLy8gPiBzeW1ib2wgZm9yIHJhZGlvIG1lbnU/CisjZGVmaW5lIENIRUNLRUQgICAgICAgJ1wxNDAnCS8vIENoZWNrIG1hcmsKKyNkZWZpbmUgVU5DSEVDS0VEICAgICAnXDE0NicJLy8gTGlnaHQgYnVsbGV0CisjZGVmaW5lIFJBRElPU0VMICAgICAgJy4nCS8vIEN1cnJlbnQgUmFkaW8gU2VsZWN0aW9uCisjZGVmaW5lIFJBRElPVU5TRUwgICAgJyAnCS8vIFJhZGlvIG9wdGlvbiBub3Qgc2VsZWN0ZWQKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjaGFyOworCisvLyBUeXBlcyBvZiBtZW51J3MKKyNkZWZpbmUgTk9STUFMTUVOVSAxCisjZGVmaW5lIFJBRElPTUVOVSAgMgorCit0eXBlZGVmIGVudW0geyBPUFRfSU5BQ1RJVkUsIE9QVF9TVUJNRU5VLCBPUFRfUlVOLCBPUFRfRVhJVE1FTlUsIE9QVF9DSEVDS0JPWCwKKyAgICBPUFRfUkFESU9NRU5VLCBPUFRfU0VQLCBPUFRfSU5WSVNJQkxFLAorICAgIE9QVF9SQURJT0lURU0KK30gdF9hY3Rpb247CisKK3R5cGVkZWYgdW5pb24geworICAgIHVjaGFyIHN1Ym1lbnVudW07CQkvLyBGb3Igc3VibWVudSdzCisgICAgdWNoYXIgY2hlY2tlZDsJCS8vIEZvciBjaGVjayBib3hlcworICAgIHVjaGFyIHJhZGlvbWVudW51bTsJCS8vIEl0ZW0gbWFwcGluZyB0byBhIHJhZGlvIG1lbnUKK30gdF9pdGVtZGF0YTsKKworc3RydWN0IHNfbWVudWl0ZW07CitzdHJ1Y3Qgc19tZW51Oworc3RydWN0IHNfbWVudXN5c3RlbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCB2YWxpZDoxOwkvLyBJcyBhY3Rpb24gdmFsaWQ/CisgICAgdW5zaWduZWQgaW50IHJlZnJlc2g6MTsJLy8gU2hvdWxkIHdlIHJlY29tcHV0ZSBtZW51IHN0dWZmPworICAgIHVuc2lnbmVkIGludCByZXNlcnZlZDo2OwkvLyBGb3IgZnV0dXJlIGV4cGFuc2lvbgorfSB0X2hhbmRsZXJfcmV0dXJuOworCit0X2hhbmRsZXJfcmV0dXJuIEFDVElPTl9WQUxJRCwgQUNUSU9OX0lOVkFMSUQ7CS8vIFNwZWNpZmljIHZhbHVlcworCit0eXBlZGVmIHRfaGFuZGxlcl9yZXR1cm4oKnRfaXRlbV9oYW5kbGVyKSAoc3RydWN0IHNfbWVudXN5c3RlbSAqLAorCQkJCQkgICBzdHJ1Y3Qgc19tZW51aXRlbSAqKTsKK3R5cGVkZWYgdm9pZCAoKnRfbWVudXN5c3RlbV9oYW5kbGVyKSAoc3RydWN0IHNfbWVudXN5c3RlbSAqLAorCQkJCSAgICAgIHN0cnVjdCBzX21lbnVpdGVtICopOwordHlwZWRlZiB2b2lkICgqdF9rZXlzX2hhbmRsZXIpIChzdHJ1Y3Qgc19tZW51c3lzdGVtICosIHN0cnVjdCBzX21lbnVpdGVtICosCisJCQkJdW5zaWduZWQgaW50IHNjYW5jb2RlKTsKKyAgICAvLyBMYXN0IHBhcmFtZXRlciA9IEhJR0ggQllURSA9IHNjYW4gY29kZSAsIExPVyBCWVRFID0gQVNDSUkgQ09ERQorCit0eXBlZGVmIGVudW0geyBIRExSX1NDUkVFTiwgSERMUl9LRVlTIH0gdF9oYW5kbGVyOworLy8gVHlwZXMgb2YgaGFuZGxlcnMgZm9yIG1lbnUgc3lzdGVtCisKKy8vIFRJTUVPVVQgaXMgdGhlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHdoaWNoIGNhbiBiZSByZXR1cm5lZCBieSB0aGUgaGFuZGxlcgorLy8gaW5zdHJ1Y3RpbmcgdGhlIG1lbnVzeXN0ZW0gd2hhdCB0byBkby4gVGhlIGRlZmF1bHQgaXMgQ09ERV9XQUlUCit0eXBlZGVmIGVudW0geyBDT0RFX1dBSVQsIENPREVfRU5URVIsIENPREVfRVNDQVBFIH0gVElNRU9VVENPREU7Cit0eXBlZGVmIFRJTUVPVVRDT0RFKCp0X3RpbWVvdXRfaGFuZGxlcikgKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCBzX21lbnVpdGVtIHsKKyAgICBjaGFyICppdGVtOworICAgIGNoYXIgKnN0YXR1czsKKyAgICBjaGFyICpkYXRhOwkJCS8vIHN0cmluZyBjb250YWluaW5nIGtlcm5lbCB0byBydW4uLiBidXQuLi4KKyAgICAvLyBmb3IgcmFkaW8gbWVudSdzIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSBpdGVtIHNlbGVjdGVkIG9yIE5VTEwgKGluaXRpYWxseSkKKyAgICAvLyBmb3Igc3VibWVudSdzIHRoaXMgc3RyaW5nIGNvdWxkIGJlIG5hbWUgb2YgbWVudQorICAgIHZvaWQgKmV4dHJhX2RhdGE7CQkvLyBBbnkgb3RoZXIgZGF0YSB1c2VyIGNhbiBwb2ludCB0bworICAgIHVuc2lnbmVkIGludCBoZWxwaWQ7CS8vIFVzZWQgZm9yIENvbnRleHQgc2Vuc2l0aXZlIGhlbHAKKyAgICB0X2l0ZW1faGFuZGxlciBoYW5kbGVyOwkvLyBQb2ludGVyIHRvIGZ1bmN0aW9uIG9mIHR5cGUgbWVudWZuCisgICAgdF9hY3Rpb24gYWN0aW9uOworICAgIHRfaXRlbWRhdGEgaXRlbWRhdGE7CS8vIERhdGEgZGVwZW5kcyBvbiBhY3Rpb24gdmFsdWUKKyAgICB1Y2hhciBzaG9ydGN1dDsJCS8vIG9uZSBvZiBbQS1aYS16MC05XSBzaG9ydGN1dCBmb3IgdGhpcyBtZW51IGl0ZW0KKyAgICB1Y2hhciBpbmRleDsJCS8vIEluZGV4IHdpdGhpbiB0aGUgbWVudSBhcnJheQorICAgIHVjaGFyIHBhcmluZGV4OwkJLy8gSW5kZXggb2YgdGhlIG1lbnUgaW4gd2hpY2ggdGhpcyBpdGVtIGFwcGVhcnMuCisKK30gdF9tZW51aXRlbTsKKwordHlwZWRlZiB0X21lbnVpdGVtICpwdF9tZW51aXRlbTsJLy8gUG9pbnRlciB0byB0eXBlIG1lbnVpdGVtCisKK3R5cGVkZWYgc3RydWN0IHNfbWVudSB7CisgICAgcHRfbWVudWl0ZW0gKml0ZW1zOwkJLy8gcG9pbnRlciB0byBhcnJheSBvZiBwb2ludGVyIHRvIG1lbnVpdGVtcworICAgIGNoYXIgKnRpdGxlOwkJLy8gVGl0bGUgc3RyaW5nIGZvciBtZW51CisgICAgY2hhciAqbmFtZTsJCQkvLyBtZW51IGNhbiBiZSByZWZlcnJlZCB0byBieSB0aGlzIHN0cmluZworICAgIGludCBtYXhtZW51c2l6ZTsJCS8vIHRoZSBzaXplIG9mIGFycmF5IGFsbG9jYXRlZAorICAgIHVjaGFyIG51bWl0ZW1zOwkJLy8gaG93IG1hbnkgaXRlbXMgZG8gd2UgYWN0dWFsbHkgaGF2ZQorICAgIHVjaGFyIG1lbnV3aWR0aDsKKyAgICB1Y2hhciByb3csIGNvbDsJCS8vIFBvc2l0aW9uIHdoZXJlIHRoaXMgbWVudSBzaG91bGQgYmUgZGlzcGxheWVkCisgICAgdWNoYXIgbWVudWhlaWdodDsJCS8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIGRpc3BsYXllZAorfSB0X21lbnU7CisKK3R5cGVkZWYgdF9tZW51ICpwdF9tZW51OwkvLyBQb2ludGVyIHRvIHR5cGUgbWVudQorCit0eXBlZGVmIHN0cnVjdCBzX21lbnVzeXN0ZW0geworICAgIHB0X21lbnUgbWVudXNbTUFYTUVOVVNdOworICAgIGNoYXIgKnRpdGxlOworICAgIHRfbWVudXN5c3RlbV9oYW5kbGVyIGhhbmRsZXI7CS8vIE1lbnUgc3lzdGVtIGhhbmRsZXIKKyAgICB0X2tleXNfaGFuZGxlciBrZXlzX2hhbmRsZXI7CS8vIEhhbmRsZXIgZm9yIHVua25vd24ga2V5cworICAgIHRfdGltZW91dF9oYW5kbGVyIG9udGltZW91dDsJLy8gVGltZW91dCBoYW5kbGVyCisgICAgdW5zaWduZWQgbG9uZyB0bV9udW1zdGVwczsKKyAgICAvLyBUaW1lIHRvIHdhaXQgZm9yIGtleSBwcmVzcz1udW1zdGVwcyAqIHN0ZXBzaXplIG1pbGxpc2Vjb25kcworICAgIHVuc2lnbmVkIGludCB0bV9zdGVwc2l6ZTsJLy8gVGltZW91dCBzdGVwIHNpemUgKGluIG1pbGxpc2Vjb25kcykKKyAgICAvLyBUb3RhbCB0aW1lb3V0IG1heCB0aW1lIHNwZW50IGlkbGUgYmVmb3JlIHdlIGNhbGwgaGFuZGxlcgorICAgIHVuc2lnbmVkIGxvbmcgdG1fdG90YWxfdGltZW91dDsJLy8gKGluIG1pbGxpIHNlY29uZHMpCisgICAgdW5zaWduZWQgbG9uZyB0bV9zb2Zhcl90aW1lb3V0OwkvLyBBbGwgYWNjdW11bGF0ZWQgdGltZW91dAorICAgIC8vIHRvdGFsIHRpbWVvdXQgaGFuZGxlcgorICAgIHRfdGltZW91dF9oYW5kbGVyIG9udG90YWx0aW1lb3V0OwkvLyBUb3RhbCB0aW1lb3V0IGhhbmRsZXIKKworICAgIGludCBtYXhtZW51aGVpZ2h0OworICAgIHVjaGFyIG51bW1lbnVzOworICAgIHVjaGFyIG5vcm1hbGF0dHJbMl07CS8vIFswXSBpcyBub24taGxpdGUgYXR0ciwgWzFdIGlzIGhsaXRlIGF0dHIKKyAgICB1Y2hhciByZXZlcnNlYXR0clsyXTsKKyAgICB1Y2hhciBpbmFjdGF0dHJbMl07CisgICAgdWNoYXIgcmV2aW5hY3RhdHRyWzJdOworICAgIHVjaGFyIHN0YXR1c2F0dHJbMl07CisgICAgdWNoYXIgZmlsbGNoYXI7CisgICAgdWNoYXIgZmlsbGF0dHI7CisgICAgdWNoYXIgc3BhY2VjaGFyOworICAgIHVjaGFyIHRmaWxsY2hhcjsKKyAgICB1Y2hhciB0aXRsZWF0dHI7CisgICAgdWNoYXIgc2hhZG93YXR0cjsKKyAgICB1Y2hhciBzdGF0bGluZTsKKyAgICB1Y2hhciBtZW51cGFnZTsKKyAgICBpbnQgbWF4cm93LCBtaW5yb3csIG51bXJvd3M7CS8vIE51bWJlciBvZiByb3dzIGluIHRoZSB3aW5kb3cKKyAgICBpbnQgbWF4Y29sLCBtaW5jb2wsIG51bWNvbHM7CS8vIE51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB3aW5kb3cKKworICAgIC8vIE1lbnUgYm94IGxvb2sKKyAgICBjaGFyIGJveF9ob3JpeiwgYm94X2x0cnQsIGJveF9ydGx0OwkvLyBTb21lIGNoYXJzIG9mIHRoZSBib3gsIGZvciByZWRyYXdpbmcgcG9ydGlvbnMgb2YgdGhlIGJveAorCit9IHRfbWVudXN5c3RlbTsKKwordHlwZWRlZiB0X21lbnVzeXN0ZW0gKnB0X21lbnVzeXN0ZW07CS8vIFBvaW50ZXIgdG8gdHlwZSBtZW51c3lzdGVtCisKK3B0X21lbnVpdGVtIHNob3dtZW51cyh1Y2hhciBzdGFydG1lbnUpOworCitwdF9tZW51c3lzdGVtIGluaXRfbWVudXN5c3RlbShjb25zdCBjaGFyICp0aXRsZSk7CisKK3ZvaWQgY2xvc2VfbWVudXN5c3RlbSh2b2lkKTsJLy8gRGVhbGxvY2F0ZSBtZW1vcnkgdXNlZAorCit2b2lkIHNldF9ub3JtYWxfYXR0cih1Y2hhciBub3JtYWwsIHVjaGFyIHNlbGVjdGVkLCB1Y2hhciBpbmFjdGl2ZW5vcm1hbCwKKwkJICAgICB1Y2hhciBpbmFjdGl2ZXNlbGVjdGVkKTsKKwordm9pZCBzZXRfbm9ybWFsX2hsaXRlKHVjaGFyIG5vcm1hbCwgdWNoYXIgc2VsZWN0ZWQsIHVjaGFyIGluYWN0aXZlbm9ybWFsLAorCQkgICAgICB1Y2hhciBpbmFjdGl2ZXNlbGVjdGVkKTsKKwordm9pZCBzZXRfc3RhdHVzX2luZm8odWNoYXIgc3RhdHVzYXR0ciwgdWNoYXIgc3RhdHVzaGxpdGUsIHVjaGFyIHN0YXRsaW5lKTsKKwordm9pZCBzZXRfdGl0bGVfaW5mbyh1Y2hhciB0ZmlsbGNoYXIsIHVjaGFyIHRpdGxlYXR0cik7CisKK3ZvaWQgc2V0X21pc2NfaW5mbyh1Y2hhciBmaWxsY2hhciwgdWNoYXIgZmlsbGF0dHIsIHVjaGFyIHNwYWNlY2hhciwKKwkJICAgdWNoYXIgc2hhZG93YXR0cik7CisKK3ZvaWQgc2V0X3dpbmRvd19zaXplKHVjaGFyIHRvcCwgdWNoYXIgbGVmdCwgdWNoYXIgYm90LCB1Y2hhciByaWdodCk7CS8vIFNldCB0aGUgd2luZG93IHdoaWNoIG1lbnVzeXN0ZW0gc2hvdWxkIHVzZQorCit2b2lkIHNldF9tZW51X29wdGlvbnModWNoYXIgbWF4bWVudWhlaWdodCk7CisvLyBtYXhpbXVtIGhlaWdodCBvZiBhIG1lbnUKKwordm9pZCByZWdfaGFuZGxlcih0X2hhbmRsZXIgaHR5cGUsIHZvaWQgKmhhbmRsZXIpOwkvLyBSZWdpc3RlciBoYW5kbGVyCisKK3ZvaWQgdW5yZWdfaGFuZGxlcih0X2hhbmRsZXIgaHR5cGUpOworCit2b2lkIHJlZ19vbnRpbWVvdXQodF90aW1lb3V0X2hhbmRsZXIsIHVuc2lnbmVkIGludCBudW1zdGVwcywKKwkJICAgdW5zaWduZWQgaW50IHN0ZXBzaXplKTsKKy8vIFNldCB0aW1lb3V0IGhhbmRsZXIsIHNldCAwIGZvciBkZWZhdWx0IHZhbHVlcy4KKy8vIFNvIHN0ZXBzaXplPTAgbWVhbnMgbnVtc3RlcHMgaXMgbWVhc3VyZWQgaW4gY2VudGlzZWNvbmRzLgordm9pZCB1bnJlZ19vbnRpbWVvdXQodm9pZCk7CisKK3ZvaWQgcmVnX29udG90YWx0aW1lb3V0KHRfdGltZW91dF9oYW5kbGVyLCB1bnNpZ25lZCBsb25nIG51bWNlbnRpc2Vjb25kcyk7Cit2b2lkIHVucmVnX29udG90YWx0aW1lb3V0KHZvaWQpOworCisvLyBGaW5kIHRoZSBudW1iZXIgb2YgdGhlIG1lbnUgZ2l2ZW4gdGhlIG5hbWUKKy8vIFJldHVybnMgLTEgaWYgbm90IGZvdW5kCit1Y2hhciBmaW5kX21lbnVfbnVtKGNvbnN0IGNoYXIgKm5hbWUpOworCisvLyBDcmVhdGUgYSBuZXcgbWVudSBhbmQgcmV0dXJuIGl0cyBwb3NpdGlvbgordWNoYXIgYWRkX21lbnUoY29uc3QgY2hhciAqdGl0bGUsIGludCBtYXhtZW51c2l6ZSk7CisKKy8vIENyZWF0ZSBhIG5hbWVkIG1lbnUgYW5kIHJldHVybiBpdHMgcG9zaXRpb24KK3VjaGFyIGFkZF9uYW1lZF9tZW51KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgbWF4bWVudXNpemUpOworCit2b2lkIHNldF9tZW51X3Bvcyh1Y2hhciByb3csIHVjaGFyIGNvbCk7CS8vIFNldCB0aGUgcG9zaXRpb24gb2YgdGhpcyBtZW51LgorCisvLyBBZGQgaXRlbSB0byB0aGUgImN1cnJlbnQiIG1lbnUKK3B0X21lbnVpdGVtIGFkZF9pdGVtKGNvbnN0IGNoYXIgKml0ZW0sIGNvbnN0IGNoYXIgKnN0YXR1cywgdF9hY3Rpb24gYWN0aW9uLAorCQkgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHVjaGFyIGl0ZW1kYXRhKTsKKworLy8gU2V0IHNob3J0Y3V0IGtleSBhbmQgaGVscCBpZAordm9pZCBzZXRfaXRlbV9vcHRpb25zKHVjaGFyIHNob3J0Y3V0LCBpbnQgaGVscGlkKTsKKworLy8gU2V0IHRoZSBzaG9ydGN1dCBrZXkgZm9yIHRoZSBjdXJyZW50IGl0ZW0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2hvcnRjdXQodWNoYXIgc2hvcnRjdXQpCit7CisgICAgc2V0X2l0ZW1fb3B0aW9ucyhzaG9ydGN1dCwgMHhGRkZGKTsKK30KKworLy8gQWRkIGEgc2VwYXJhdG9yIHRvIHRoZSAiY3VycmVudCIgbWVudQorcHRfbWVudWl0ZW0gYWRkX3NlcCh2b2lkKTsKKworLy8gR2VuZXJhdGUgc3RyaW5nIGJhc2VkIG9uIHN0YXRlIG9mIGNoZWNrYm94ZXMgYW5kIHJhZGlvaXRlbSBpbiBnaXZlbiBtZW51CisvLyBhbmQgYXBwZW5kIHN0cmluZyB0byBleGlzdGluZyBjb250ZW50cyBvZiAibGluZSIKKy8vIGxpbmUgbXVzdCBoYXZlIGVub3VnaCBzcGFjZSBhbGxvY2F0ZWQKK3ZvaWQgZ2VuX2FwcGVuZF9saW5lKGNvbnN0IGNoYXIgKm1lbnVfbmFtZSwgY2hhciAqbGluZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvbGlibWVudS9jb20zMmlvLmMgYi9jb20zMi9jbWVudS9saWJtZW51L2NvbTMyaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTU0YzQzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvbGlibWVudS9jb20zMmlvLmMKQEAgLTAsMCArMSw3OCBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNSBNdXJhbGkgS3Jpc2huYW4gR2FuYXBhdGh5IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgImNvbTMyaW8uaCIKKyNpbmNsdWRlICJ0dWkuaCIKKyNpbmNsdWRlICJzeXNsbnguaCIKKworY29tMzJzeXNfdCBpbnJlZywgb3V0cmVnOwkvLyBHbG9iYWwgcmVnaXN0ZXIgc2V0cyBmb3IgdXNlCisKK3ZvaWQgZ2V0cG9zKGNoYXIgKnJvdywgY2hhciAqY29sLCBjaGFyIHBhZ2UpCit7CisgICAgbWVtc2V0KCZpbnJlZywgMCwgc2l6ZW9mIGlucmVnKTsKKyAgICBSRUdfQUgoaW5yZWcpID0gMHgwMzsKKyAgICBSRUdfQkgoaW5yZWcpID0gcGFnZTsKKyAgICBfX2ludGNhbGwoMHgxMCwgJmlucmVnLCAmb3V0cmVnKTsKKyAgICAqcm93ID0gUkVHX0RIKG91dHJlZyk7CisgICAgKmNvbCA9IFJFR19ETChvdXRyZWcpOworfQorCitjaGFyIGlucHV0YyhjaGFyICpzY2FuY29kZSkKK3sKKyAgICBzeXNsaW51eF9pZGxlKCk7CQkvKiBTbyBzeXNsaW51eCBjYW4gcGVyZm9ybSBwZXJpb2RpYyBhY3Rpdml0eSAqLworICAgIG1lbXNldCgmaW5yZWcsIDAsIHNpemVvZiBpbnJlZyk7CisgICAgUkVHX0FIKGlucmVnKSA9IDB4MTA7CisgICAgX19pbnRjYWxsKDB4MTYsICZpbnJlZywgJm91dHJlZyk7CisgICAgaWYgKHNjYW5jb2RlKQorCSpzY2FuY29kZSA9IFJFR19BSChvdXRyZWcpOworICAgIHJldHVybiBSRUdfQUwob3V0cmVnKTsKK30KKwordm9pZCBnZXRjdXJzb3JzaGFwZShjaGFyICpzdGFydCwgY2hhciAqZW5kKQoreworICAgIGNoYXIgcGFnZSA9IDA7IC8vIFhYWCBUT0RPCisgICAgbWVtc2V0KCZpbnJlZywgMCwgc2l6ZW9mIGlucmVnKTsKKyAgICBSRUdfQUgoaW5yZWcpID0gMHgwMzsKKyAgICBSRUdfQkgoaW5yZWcpID0gcGFnZTsKKyAgICBfX2ludGNhbGwoMHgxMCwgJmlucmVnLCAmb3V0cmVnKTsKKyAgICAqc3RhcnQgPSBSRUdfQ0gob3V0cmVnKTsKKyAgICAqZW5kID0gUkVHX0NMKG91dHJlZyk7Cit9CisKK3ZvaWQgc2V0Y3Vyc29yc2hhcGUoY2hhciBzdGFydCwgY2hhciBlbmQpCit7CisgICAgbWVtc2V0KCZpbnJlZywgMCwgc2l6ZW9mIGlucmVnKTsKKyAgICBSRUdfQUgoaW5yZWcpID0gMHgwMTsKKyAgICBSRUdfQ0goaW5yZWcpID0gc3RhcnQ7CisgICAgUkVHX0NMKGlucmVnKSA9IGVuZDsKKyAgICBfX2ludGNhbGwoMHgxMCwgJmlucmVnLCAmb3V0cmVnKTsKK30KKwordm9pZCBzZXR2aWRlb21vZGUoY2hhciBtb2RlKQoreworICAgIG1lbXNldCgmaW5yZWcsIDAsIHNpemVvZiBpbnJlZyk7CisgICAgUkVHX0FIKGlucmVnKSA9IDB4MDA7CisgICAgUkVHX0FMKGlucmVnKSA9IG1vZGU7CisgICAgX19pbnRjYWxsKDB4MTAsICZpbnJlZywgJm91dHJlZyk7Cit9CisKKy8vIEdldCBjaGFyIGRpc3BsYXllZCBhdCBjdXJyZW50IHBvc2l0aW9uCit1bnNpZ25lZCBjaGFyIGdldGNoYXJhdChjaGFyIHBhZ2UpCit7CisgICAgbWVtc2V0KCZpbnJlZywgMCwgc2l6ZW9mIGlucmVnKTsKKyAgICBSRUdfQUgoaW5yZWcpID0gMHgwODsKKyAgICBSRUdfQkgoaW5yZWcpID0gcGFnZTsKKyAgICBfX2ludGNhbGwoMHgxNiwgJmlucmVnLCAmb3V0cmVnKTsKKyAgICByZXR1cm4gUkVHX0FMKG91dHJlZyk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9saWJtZW51L2NvbTMyaW8uaCBiL2NvbTMyL2NtZW51L2xpYm1lbnUvY29tMzJpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Y2NlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jbWVudS9saWJtZW51L2NvbTMyaW8uaApAQCAtMCwwICsxLDY2IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA1IE11cmFsaSBLcmlzaG5hbiBHYW5hcGF0aHkgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfX0NPTTMySU9fSF9fCisjZGVmaW5lIF9fQ09NMzJJT19IX18KKworI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaWJhbnNpLmg+CisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYKKworLyogQml0cyByZXByZXNlbnRpbmcgU2hpZnRGbGFncywgU2VlIEludDE2L0Z1bmN0aW9uIDIgb3IgTWVtWzB4NDE3XSB0byBnZXQgdGhpcyBpbmZvICovCisKKyNkZWZpbmUgSU5TRVJUX09OICAgICAoMTw8NykKKyNkZWZpbmUgQ0FQU0xPQ0tfT04gICAoMTw8NikKKyNkZWZpbmUgTlVNTE9DS19PTiAgICAoMTw8NSkKKyNkZWZpbmUgU0NSTExPQ0tfT04gICAoMTw8NCkKKyNkZWZpbmUgQUxUX1BSRVNTRUQgICAoMTw8MykKKyNkZWZpbmUgQ1RSTF9QUkVTU0VEICAoMTw8MikKKy8vIGFjdHVhbGx5IDE8PDEgaXMgTGVmdCBTaGlmdCwgMTw8MCBpcyByaWdodCBzaGlmdAorI2RlZmluZSBTSElGVF9QUkVTU0VEICgxPDwxIHwgMSA8PDApCisKKy8qIEJJT1MgQXNzaXN0ZWQgb3V0cHV0IHJvdXRpbmVzICovCisKK3ZvaWQgZ2V0cG9zKGNoYXIgKnJvdywgY2hhciAqY29sLCBjaGFyIHBhZ2UpOworCitjaGFyIGlucHV0YyhjaGFyICpzY2FuY29kZSk7CS8vIFJldHVybiBBU0NJSSBjaGFyIGJ5IHZhbCwgYW5kIHNjYW5jb2RlIGJ5IHJlZmVyZW5jZQorCit2b2lkIHNldGN1cnNvcnNoYXBlKGNoYXIgc3RhcnQsIGNoYXIgZW5kKTsJLy8gU2V0IGN1cnNvciBzaGFwZQordm9pZCBnZXRjdXJzb3JzaGFwZShjaGFyICpzdGFydCwgY2hhciAqZW5kKTsJLy8gR2V0IHNoYXBlIGZvciBjdXJyZW50IHBhZ2UKKworLy8gR2V0IGNoYXIgZGlzcGxheWVkIGF0IGN1cnJlbnQgcG9zaXRpb24gaW4gc3BlY2lmaWVkIHBhZ2UKK3Vuc2lnbmVkIGNoYXIgZ2V0Y2hhcmF0KGNoYXIgcGFnZSk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkYmlvc2IodW5zaWduZWQgaW50IG9mcykKK3sKKyAgICByZXR1cm4gKigodW5zaWduZWQgY2hhciAqKU1LX1BUUigwLCBvZnMpKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyIGdldHNoaWZ0ZmxhZ3Modm9pZCkKK3sKKyAgICByZXR1cm4gcmVhZGJpb3NiKDB4NDE3KTsKK30KKwordm9pZCBzY3JvbGx1cHdpbmRvdyhjaGFyIHRvcCwgY2hhciBsZWZ0LCBjaGFyIGJvdCwgY2hhciByaWdodCwgY2hhciBhdHRyLCBjaGFyIG51bWxpbmVzKTsJLy9TY3JvbGwgdXAgZ2l2ZW4gd2luZG93CisKK3ZvaWQgc2V0dmlkZW9tb2RlKGNoYXIgbW9kZSk7CS8vIFNldCB0aGUgdmlkZW8gbW9kZS4KKworc3RhdGljIGlubGluZSBjaGFyIGdldHZpZGVvbW9kZSh2b2lkKQkvLyBHZXQgdGhlIGN1cnJlbnQgdmlkZW8gbW9kZQoreworICAgIHJldHVybiByZWFkYmlvc2IoMHg0NDkpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2NtZW51L2xpYm1lbnUvZGVzLmMgYi9jb20zMi9jbWVudS9saWJtZW51L2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTQ4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jbWVudS9saWJtZW51L2Rlcy5jCkBAIC0wLDAgKzEsMTA2NCBAQAorLyoKKyAqIEZyZWVTZWM6IGxpYmNyeXB0IGZvciBOZXRCU0QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgRGF2aWQgQnVycmVuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEFkYXB0ZWQgZm9yIEZyZWVCU0QtMi4wIGJ5IEdlb2ZmcmV5IE0uIFJlaG1ldAorICoJdGhpcyBmaWxlIHNob3VsZCBub3cgKm9ubHkqIGV4cG9ydCBjcnlwdCgpLCBpbiBvcmRlciB0byBtYWtlCisgKgliaW5hcmllcyBvZiBsaWJjcnlwdCBleHBvcnRhYmxlIGZyb20gdGhlIFVTQQorICoKKyAqIEFkYXB0ZWQgZm9yIEZyZWVCU0QtNC4wIGJ5IE1hcmsgUiBWIE11cnJheQorICoJdGhpcyBmaWxlIHNob3VsZCBub3cgKm9ubHkqIGV4cG9ydCBjcnlwdF9kZXMoKSwgaW4gb3JkZXIgdG8gbWFrZQorICoJYSBtb2R1bGUgdGhhdCBjYW4gYmUgb3B0aW9uYWxseSBpbmNsdWRlZCBpbiBsaWJjcnlwdC4KKyAqCisgKiBBZGFwdGVkIGZvciBweGVsaW51eCBtZW51IGVudmlyb25tZW50IGJ5IFRoLkdlYmhhcmR0CisgKiAgICAgIHJlbW92ZWQgZGVwZW5kZW5jaWVzIG9mIHN0YW5kYXJkIEMgbGlicworICogICAgICBhZGRlZCBMT1dTUEFDRSBvcHRpb24gKHVzaW5nIGNvbW1vbiBzcGFjZSBmb3IgZGlmZmVyZW50IGFycmF5cykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIG90aGVyIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGlzIGFuIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBERVMgYW5kIHRoZSBjcnlwdCgzKSBpbnRlcmZhY2VzCisgKiBieSBEYXZpZCBCdXJyZW4gPGRhdmlkYkB3ZXJqLmNvbS5hdT4uCisgKgorICogQW4gZXhjZWxsZW50IHJlZmVyZW5jZSBvbiB0aGUgdW5kZXJseWluZyBhbGdvcml0aG0gKGFuZCByZWxhdGVkCisgKiBhbGdvcml0aG1zKSBpczoKKyAqCisgKglCLiBTY2huZWllciwgQXBwbGllZCBDcnlwdG9ncmFwaHk6IHByb3RvY29scywgYWxnb3JpdGhtcywKKyAqCWFuZCBzb3VyY2UgY29kZSBpbiBDLCBKb2huIFdpbGV5ICYgU29ucywgMTk5NC4KKyAqCisgKiBOb3RlIHRoYXQgaW4gdGhhdCBib29rJ3MgZGVzY3JpcHRpb24gb2YgREVTIHRoZSBsb29rdXBzIGZvciB0aGUgaW5pdGlhbCwKKyAqIHBib3gsIGFuZCBmaW5hbCBwZXJtdXRhdGlvbnMgYXJlIGludmVydGVkICh0aGlzIGhhcyBiZWVuIGJyb3VnaHQgdG8gdGhlCisgKiBhdHRlbnRpb24gb2YgdGhlIGF1dGhvcikuICBBIGxpc3Qgb2YgZXJyYXRhIGZvciB0aGlzIGJvb2sgaGFzIGJlZW4KKyAqIHBvc3RlZCB0byB0aGUgc2NpLmNyeXB0IG5ld3Nncm91cCBieSB0aGUgYXV0aG9yIGFuZCBpcyBhdmFpbGFibGUgZm9yIEZUUC4KKyAqCisgKiBBUkNISVRFQ1RVUkUgQVNTVU1QVElPTlM6CisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIDgtYnl0ZSBhcnJheXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBjYW4gYmUKKyAqCWFkZHJlc3NlZCBhcyBhcnJheXMgb2YgdV9pbnQzMl90J3MgKGllLiB0aGUgQ1BVIGlzIG5vdCBwaWNreSBhYm91dAorICoJYWxpZ25tZW50KS4KKyAqLworCisjZGVmaW5lIExPV1NQQUNFCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCAqKSAwKQorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBteV91X2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgbXlfdV9jaGFyX3Q7CisKKy8qIFJlLWVudHJhbnRpZnkgbWUgLS0gYWxsIHRoaXMganVuayBuZWVkcyB0byBiZSBpbgorICogc3RydWN0IGNyeXB0X2RhdGEgdG8gbWFrZSB0aGlzIHJlYWxseSByZWVudHJhbnQuLi4gKi8KK3N0YXRpYyBteV91X2NoYXJfdCBpbnZfa2V5X3Blcm1bNjRdOworc3RhdGljIG15X3VfY2hhcl90IGludl9jb21wX3Blcm1bNTZdOworc3RhdGljIG15X3VfY2hhcl90IHVfc2JveFs4XVs2NF07CitzdGF0aWMgbXlfdV9jaGFyX3QgdW5fcGJveFszMl07CitzdGF0aWMgbXlfdV9pbnQzMl90IGVuX2tleXNsWzE2XSwgZW5fa2V5c3JbMTZdOworc3RhdGljIG15X3VfaW50MzJfdCBkZV9rZXlzbFsxNl0sIGRlX2tleXNyWzE2XTsKKworI2lmbmRlZiBMT1dTUEFDRQorc3RhdGljIG15X3VfaW50MzJfdCBpcF9tYXNrbFs4XVsyNTZdLCBpcF9tYXNrcls4XVsyNTZdOworc3RhdGljIG15X3VfaW50MzJfdCBmcF9tYXNrbFs4XVsyNTZdLCBmcF9tYXNrcls4XVsyNTZdOworc3RhdGljIG15X3VfaW50MzJfdCBrZXlfcGVybV9tYXNrbFs4XVsxMjhdLCBrZXlfcGVybV9tYXNrcls4XVsxMjhdOworc3RhdGljIG15X3VfaW50MzJfdCBjb21wX21hc2tsWzhdWzEyOF0sIGNvbXBfbWFza3JbOF1bMTI4XTsKKyNlbmRpZgorCitzdGF0aWMgbXlfdV9pbnQzMl90IHNhbHRiaXRzOworc3RhdGljIG15X3VfaW50MzJfdCBvbGRfc2FsdDsKK3N0YXRpYyBteV91X2ludDMyX3Qgb2xkX3Jhd2tleTAsIG9sZF9yYXdrZXkxOworCisjaWZkZWYgTE9XU1BBQ0UKK3N0YXRpYyBteV91X2ludDMyX3QgY29tbW9uWzhdWzI1Nl07CisjZW5kaWYKKworLyogU3RhdGljIHN0dWZmIHRoYXQgc3RheXMgcmVzaWRlbnQgYW5kIGRvZXNuJ3QgY2hhbmdlIGFmdGVyCisgKiBiZWluZyBpbml0aWFsaXplZCwgYW5kIHRoZXJlZm9yZSBkb2Vzbid0IG5lZWQgdG8gYmUgbWFkZQorICogcmVlbnRyYW50LiAqLworc3RhdGljIG15X3VfY2hhcl90IGluaXRfcGVybVs2NF0sIGZpbmFsX3Blcm1bNjRdOworc3RhdGljIG15X3VfY2hhcl90IG1fc2JveFs0XVs0MDk2XTsKKworI2lmbmRlZiBMT1dTUEFDRQorc3RhdGljIG15X3VfaW50MzJfdCBwc2JveFs0XVsyNTZdOworI2VuZGlmCisKKy8qIEEgcGlsZSBvZiBkYXRhICovCitzdGF0aWMgY29uc3QgbXlfdV9jaGFyX3QgYXNjaWk2NFtdID0KKyAgICAiLi8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKK3N0YXRpYyBjb25zdCBteV91X2NoYXJfdCBJUFs2NF0gPSB7CisgICAgNTgsIDUwLCA0MiwgMzQsIDI2LCAxOCwgMTAsIDIsIDYwLCA1MiwgNDQsIDM2LCAyOCwgMjAsIDEyLCA0LAorICAgIDYyLCA1NCwgNDYsIDM4LCAzMCwgMjIsIDE0LCA2LCA2NCwgNTYsIDQ4LCA0MCwgMzIsIDI0LCAxNiwgOCwKKyAgICA1NywgNDksIDQxLCAzMywgMjUsIDE3LCA5LCAxLCA1OSwgNTEsIDQzLCAzNSwgMjcsIDE5LCAxMSwgMywKKyAgICA2MSwgNTMsIDQ1LCAzNywgMjksIDIxLCAxMywgNSwgNjMsIDU1LCA0NywgMzksIDMxLCAyMywgMTUsIDcKK307CisKK3N0YXRpYyBjb25zdCBteV91X2NoYXJfdCBrZXlfcGVybVs1Nl0gPSB7CisgICAgNTcsIDQ5LCA0MSwgMzMsIDI1LCAxNywgOSwgMSwgNTgsIDUwLCA0MiwgMzQsIDI2LCAxOCwKKyAgICAxMCwgMiwgNTksIDUxLCA0MywgMzUsIDI3LCAxOSwgMTEsIDMsIDYwLCA1MiwgNDQsIDM2LAorICAgIDYzLCA1NSwgNDcsIDM5LCAzMSwgMjMsIDE1LCA3LCA2MiwgNTQsIDQ2LCAzOCwgMzAsIDIyLAorICAgIDE0LCA2LCA2MSwgNTMsIDQ1LCAzNywgMjksIDIxLCAxMywgNSwgMjgsIDIwLCAxMiwgNAorfTsKKworc3RhdGljIGNvbnN0IG15X3VfY2hhcl90IGtleV9zaGlmdHNbMTZdID0geworICAgIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDEKK307CisKK3N0YXRpYyBjb25zdCBteV91X2NoYXJfdCBjb21wX3Blcm1bNDhdID0geworICAgIDE0LCAxNywgMTEsIDI0LCAxLCA1LCAzLCAyOCwgMTUsIDYsIDIxLCAxMCwKKyAgICAyMywgMTksIDEyLCA0LCAyNiwgOCwgMTYsIDcsIDI3LCAyMCwgMTMsIDIsCisgICAgNDEsIDUyLCAzMSwgMzcsIDQ3LCA1NSwgMzAsIDQwLCA1MSwgNDUsIDMzLCA0OCwKKyAgICA0NCwgNDksIDM5LCA1NiwgMzQsIDUzLCA0NiwgNDIsIDUwLCAzNiwgMjksIDMyCit9OworCisvKgorICoJTm8gRSBib3ggaXMgdXNlZCwgYXMgaXQncyByZXBsYWNlZCBieSBzb21lIEFORHMsIHNoaWZ0cywgYW5kIE9Scy4KKyAqLworCitzdGF0aWMgY29uc3QgbXlfdV9jaGFyX3Qgc2JveFs4XVs2NF0gPSB7CisgICAgeworICAgICAxNCwgNCwgMTMsIDEsIDIsIDE1LCAxMSwgOCwgMywgMTAsIDYsIDEyLCA1LCA5LCAwLCA3LAorICAgICAwLCAxNSwgNywgNCwgMTQsIDIsIDEzLCAxLCAxMCwgNiwgMTIsIDExLCA5LCA1LCAzLCA4LAorICAgICA0LCAxLCAxNCwgOCwgMTMsIDYsIDIsIDExLCAxNSwgMTIsIDksIDcsIDMsIDEwLCA1LCAwLAorICAgICAxNSwgMTIsIDgsIDIsIDQsIDksIDEsIDcsIDUsIDExLCAzLCAxNCwgMTAsIDAsIDYsIDEzfSwKKyAgICB7CisgICAgIDE1LCAxLCA4LCAxNCwgNiwgMTEsIDMsIDQsIDksIDcsIDIsIDEzLCAxMiwgMCwgNSwgMTAsCisgICAgIDMsIDEzLCA0LCA3LCAxNSwgMiwgOCwgMTQsIDEyLCAwLCAxLCAxMCwgNiwgOSwgMTEsIDUsCisgICAgIDAsIDE0LCA3LCAxMSwgMTAsIDQsIDEzLCAxLCA1LCA4LCAxMiwgNiwgOSwgMywgMiwgMTUsCisgICAgIDEzLCA4LCAxMCwgMSwgMywgMTUsIDQsIDIsIDExLCA2LCA3LCAxMiwgMCwgNSwgMTQsIDl9LAorICAgIHsKKyAgICAgMTAsIDAsIDksIDE0LCA2LCAzLCAxNSwgNSwgMSwgMTMsIDEyLCA3LCAxMSwgNCwgMiwgOCwKKyAgICAgMTMsIDcsIDAsIDksIDMsIDQsIDYsIDEwLCAyLCA4LCA1LCAxNCwgMTIsIDExLCAxNSwgMSwKKyAgICAgMTMsIDYsIDQsIDksIDgsIDE1LCAzLCAwLCAxMSwgMSwgMiwgMTIsIDUsIDEwLCAxNCwgNywKKyAgICAgMSwgMTAsIDEzLCAwLCA2LCA5LCA4LCA3LCA0LCAxNSwgMTQsIDMsIDExLCA1LCAyLCAxMn0sCisgICAgeworICAgICA3LCAxMywgMTQsIDMsIDAsIDYsIDksIDEwLCAxLCAyLCA4LCA1LCAxMSwgMTIsIDQsIDE1LAorICAgICAxMywgOCwgMTEsIDUsIDYsIDE1LCAwLCAzLCA0LCA3LCAyLCAxMiwgMSwgMTAsIDE0LCA5LAorICAgICAxMCwgNiwgOSwgMCwgMTIsIDExLCA3LCAxMywgMTUsIDEsIDMsIDE0LCA1LCAyLCA4LCA0LAorICAgICAzLCAxNSwgMCwgNiwgMTAsIDEsIDEzLCA4LCA5LCA0LCA1LCAxMSwgMTIsIDcsIDIsIDE0fSwKKyAgICB7CisgICAgIDIsIDEyLCA0LCAxLCA3LCAxMCwgMTEsIDYsIDgsIDUsIDMsIDE1LCAxMywgMCwgMTQsIDksCisgICAgIDE0LCAxMSwgMiwgMTIsIDQsIDcsIDEzLCAxLCA1LCAwLCAxNSwgMTAsIDMsIDksIDgsIDYsCisgICAgIDQsIDIsIDEsIDExLCAxMCwgMTMsIDcsIDgsIDE1LCA5LCAxMiwgNSwgNiwgMywgMCwgMTQsCisgICAgIDExLCA4LCAxMiwgNywgMSwgMTQsIDIsIDEzLCA2LCAxNSwgMCwgOSwgMTAsIDQsIDUsIDN9LAorICAgIHsKKyAgICAgMTIsIDEsIDEwLCAxNSwgOSwgMiwgNiwgOCwgMCwgMTMsIDMsIDQsIDE0LCA3LCA1LCAxMSwKKyAgICAgMTAsIDE1LCA0LCAyLCA3LCAxMiwgOSwgNSwgNiwgMSwgMTMsIDE0LCAwLCAxMSwgMywgOCwKKyAgICAgOSwgMTQsIDE1LCA1LCAyLCA4LCAxMiwgMywgNywgMCwgNCwgMTAsIDEsIDEzLCAxMSwgNiwKKyAgICAgNCwgMywgMiwgMTIsIDksIDUsIDE1LCAxMCwgMTEsIDE0LCAxLCA3LCA2LCAwLCA4LCAxM30sCisgICAgeworICAgICA0LCAxMSwgMiwgMTQsIDE1LCAwLCA4LCAxMywgMywgMTIsIDksIDcsIDUsIDEwLCA2LCAxLAorICAgICAxMywgMCwgMTEsIDcsIDQsIDksIDEsIDEwLCAxNCwgMywgNSwgMTIsIDIsIDE1LCA4LCA2LAorICAgICAxLCA0LCAxMSwgMTMsIDEyLCAzLCA3LCAxNCwgMTAsIDE1LCA2LCA4LCAwLCA1LCA5LCAyLAorICAgICA2LCAxMSwgMTMsIDgsIDEsIDQsIDEwLCA3LCA5LCA1LCAwLCAxNSwgMTQsIDIsIDMsIDEyfSwKKyAgICB7CisgICAgIDEzLCAyLCA4LCA0LCA2LCAxNSwgMTEsIDEsIDEwLCA5LCAzLCAxNCwgNSwgMCwgMTIsIDcsCisgICAgIDEsIDE1LCAxMywgOCwgMTAsIDMsIDcsIDQsIDEyLCA1LCA2LCAxMSwgMCwgMTQsIDksIDIsCisgICAgIDcsIDExLCA0LCAxLCA5LCAxMiwgMTQsIDIsIDAsIDYsIDEwLCAxMywgMTUsIDMsIDUsIDgsCisgICAgIDIsIDEsIDE0LCA3LCA0LCAxMCwgOCwgMTMsIDE1LCAxMiwgOSwgMCwgMywgNSwgNiwgMTF9Cit9OworCitzdGF0aWMgY29uc3QgbXlfdV9jaGFyX3QgcGJveFszMl0gPSB7CisgICAgMTYsIDcsIDIwLCAyMSwgMjksIDEyLCAyOCwgMTcsIDEsIDE1LCAyMywgMjYsIDUsIDE4LCAzMSwgMTAsCisgICAgMiwgOCwgMjQsIDE0LCAzMiwgMjcsIDMsIDksIDE5LCAxMywgMzAsIDYsIDIyLCAxMSwgNCwgMjUKK307CisKK3N0YXRpYyBjb25zdCBteV91X2ludDMyX3QgYml0czMyWzMyXSA9IHsKKyAgICAweDgwMDAwMDAwLCAweDQwMDAwMDAwLCAweDIwMDAwMDAwLCAweDEwMDAwMDAwLAorICAgIDB4MDgwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDEwMDAwMDAsCisgICAgMHgwMDgwMDAwMCwgMHgwMDQwMDAwMCwgMHgwMDIwMDAwMCwgMHgwMDEwMDAwMCwKKyAgICAweDAwMDgwMDAwLCAweDAwMDQwMDAwLCAweDAwMDIwMDAwLCAweDAwMDEwMDAwLAorICAgIDB4MDAwMDgwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDEwMDAsCisgICAgMHgwMDAwMDgwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDEwMCwKKyAgICAweDAwMDAwMDgwLCAweDAwMDAwMDQwLCAweDAwMDAwMDIwLCAweDAwMDAwMDEwLAorICAgIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDEKK307CisKK3N0YXRpYyBjb25zdCBteV91X2ludDMyX3QgYml0czI4WzI4XSA9IHsKKyAgICAweDA4MDAwMDAwLCAweDA0MDAwMDAwLCAweDAyMDAwMDAwLCAweDAxMDAwMDAwLAorICAgIDB4MDA4MDAwMDAsIDB4MDA0MDAwMDAsIDB4MDAyMDAwMDAsIDB4MDAxMDAwMDAsCisgICAgMHgwMDA4MDAwMCwgMHgwMDA0MDAwMCwgMHgwMDAyMDAwMCwgMHgwMDAxMDAwMCwKKyAgICAweDAwMDA4MDAwLCAweDAwMDA0MDAwLCAweDAwMDAyMDAwLCAweDAwMDAxMDAwLAorICAgIDB4MDAwMDA4MDAsIDB4MDAwMDA0MDAsIDB4MDAwMDAyMDAsIDB4MDAwMDAxMDAsCisgICAgMHgwMDAwMDA4MCwgMHgwMDAwMDA0MCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAxMCwKKyAgICAweDAwMDAwMDA4LCAweDAwMDAwMDA0LCAweDAwMDAwMDAyLCAweDAwMDAwMDAxCit9OworCitzdGF0aWMgY29uc3QgbXlfdV9pbnQzMl90IGJpdHMyNFsyNF0gPSB7CisgICAgMHgwMDgwMDAwMCwgMHgwMDQwMDAwMCwgMHgwMDIwMDAwMCwgMHgwMDEwMDAwMCwKKyAgICAweDAwMDgwMDAwLCAweDAwMDQwMDAwLCAweDAwMDIwMDAwLCAweDAwMDEwMDAwLAorICAgIDB4MDAwMDgwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDEwMDAsCisgICAgMHgwMDAwMDgwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDEwMCwKKyAgICAweDAwMDAwMDgwLCAweDAwMDAwMDQwLCAweDAwMDAwMDIwLCAweDAwMDAwMDEwLAorICAgIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDEKK307CisKK3N0YXRpYyBjb25zdCBteV91X2NoYXJfdCBiaXRzOFs4XSA9CisgICAgeyAweDgwLCAweDQwLCAweDIwLCAweDEwLCAweDA4LCAweDA0LCAweDAyLCAweDAxIH07CisvLyBzdGF0aWMgY29uc3QgbXlfdV9pbnQzMl90ICpiaXRzMjgsICpiaXRzMjQ7CisKK3N0YXRpYyBpbnQgYXNjaWlfdG9fYmluKGNoYXIgY2gpCit7CisgICAgaWYgKGNoID4gJ3onKQorCXJldHVybiAoMCk7CisgICAgaWYgKGNoID49ICdhJykKKwlyZXR1cm4gKGNoIC0gJ2EnICsgMzgpOworICAgIGlmIChjaCA+ICdaJykKKwlyZXR1cm4gKDApOworICAgIGlmIChjaCA+PSAnQScpCisJcmV0dXJuIChjaCAtICdBJyArIDEyKTsKKyAgICBpZiAoY2ggPiAnOScpCisJcmV0dXJuICgwKTsKKyAgICBpZiAoY2ggPj0gJy4nKQorCXJldHVybiAoY2ggLSAnLicpOworICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlc19pbml0KHZvaWQpCit7CisKKyNpZmRlZiBMT1dTUEFDRQorICAgIGludCBpLCBqLCBiOworI2Vsc2UKKyAgICBpbnQgaSwgaiwgYiwgaywgaW5iaXQsIG9iaXQ7CisgICAgbXlfdV9pbnQzMl90ICpwLCAqaWwsICppciwgKmZsLCAqZnI7CisjZW5kaWYKKyAgICBzdGF0aWMgaW50IGRlc19pbml0aWFsaXNlZCA9IDA7CisKKyAgICBpZiAoZGVzX2luaXRpYWxpc2VkID09IDEpCisJcmV0dXJuOworCisgICAgb2xkX3Jhd2tleTAgPSBvbGRfcmF3a2V5MSA9IDBMOworICAgIHNhbHRiaXRzID0gMEw7CisgICAgb2xkX3NhbHQgPSAwTDsKKyAgICAvLyAgICAgIGJpdHMyNCA9IChiaXRzMjggPSBiaXRzMzIgKyA0KSArIDQ7CisKKyAgICAvKgorICAgICAqIEludmVydCB0aGUgUy1ib3hlcywgcmVvcmRlcmluZyB0aGUgaW5wdXQgYml0cy4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCWZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CisJICAgIGIgPSAoaiAmIDB4MjApIHwgKChqICYgMSkgPDwgNCkgfCAoKGogPj4gMSkgJiAweGYpOworCSAgICB1X3Nib3hbaV1bal0gPSBzYm94W2ldW2JdOworCX0KKworICAgIC8qCisgICAgICogQ29udmVydCB0aGUgaW52ZXJ0ZWQgUy1ib3hlcyBpbnRvIDQgYXJyYXlzIG9mIDggYml0cy4KKyAgICAgKiBFYWNoIHdpbGwgaGFuZGxlIDEyIGJpdHMgb2YgdGhlIFMtYm94IGlucHV0LgorICAgICAqLworICAgIGZvciAoYiA9IDA7IGIgPCA0OyBiKyspCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisJICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKQorCQltX3Nib3hbYl1bKGkgPDwgNikgfCBqXSA9CisJCSAgICAobXlfdV9jaGFyX3QpICgodV9zYm94WyhiIDw8IDEpXVtpXSA8PCA0KSB8CisJCQkJICAgdV9zYm94WyhiIDw8IDEpICsgMV1bal0pOworCisgICAgLyoKKyAgICAgKiBTZXQgdXAgdGhlIGluaXRpYWwgJiBmaW5hbCBwZXJtdXRhdGlvbnMgaW50byBhIHVzZWZ1bCBmb3JtLCBhbmQKKyAgICAgKiBpbml0aWFsaXNlIHRoZSBpbnZlcnRlZCBrZXkgcGVybXV0YXRpb24uCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwlpbml0X3Blcm1bZmluYWxfcGVybVtpXSA9IElQW2ldIC0gMV0gPSAobXlfdV9jaGFyX3QpIGk7CisJaW52X2tleV9wZXJtW2ldID0gMjU1OworICAgIH0KKworICAgIC8qCisgICAgICogSW52ZXJ0IHRoZSBrZXkgcGVybXV0YXRpb24gYW5kIGluaXRpYWxpc2UgdGhlIGludmVydGVkIGtleQorICAgICAqIGNvbXByZXNzaW9uIHBlcm11dGF0aW9uLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCA1NjsgaSsrKSB7CisJaW52X2tleV9wZXJtW2tleV9wZXJtW2ldIC0gMV0gPSAobXlfdV9jaGFyX3QpIGk7CisJaW52X2NvbXBfcGVybVtpXSA9IDI1NTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEludmVydCB0aGUga2V5IGNvbXByZXNzaW9uIHBlcm11dGF0aW9uLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7CisJaW52X2NvbXBfcGVybVtjb21wX3Blcm1baV0gLSAxXSA9IChteV91X2NoYXJfdCkgaTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCB1cCB0aGUgT1ItbWFzayBhcnJheXMgZm9yIHRoZSBpbml0aWFsIGFuZCBmaW5hbCBwZXJtdXRhdGlvbnMsCisgICAgICogYW5kIGZvciB0aGUga2V5IGluaXRpYWwgYW5kIGNvbXByZXNzaW9uIHBlcm11dGF0aW9ucy4KKyAgICAgKi8KKworI2lmbmRlZiBMT1dTUEFDRQorICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkgICAgKihpbCA9ICZpcF9tYXNrbFtrXVtpXSkgPSAwTDsKKwkgICAgKihpciA9ICZpcF9tYXNrcltrXVtpXSkgPSAwTDsKKwkgICAgKihmbCA9ICZmcF9tYXNrbFtrXVtpXSkgPSAwTDsKKwkgICAgKihmciA9ICZmcF9tYXNrcltrXVtpXSkgPSAwTDsKKwkgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQlpbmJpdCA9IDggKiBrICsgajsKKwkJaWYgKGkgJiBiaXRzOFtqXSkgeworCQkgICAgaWYgKChvYml0ID0gaW5pdF9wZXJtW2luYml0XSkgPCAzMikKKwkJCSppbCB8PSBiaXRzMzJbb2JpdF07CisJCSAgICBlbHNlCisJCQkqaXIgfD0gYml0czMyW29iaXQgLSAzMl07CisJCSAgICBpZiAoKG9iaXQgPSBmaW5hbF9wZXJtW2luYml0XSkgPCAzMikKKwkJCSpmbCB8PSBiaXRzMzJbb2JpdF07CisJCSAgICBlbHNlCisJCQkqZnIgfD0gYml0czMyW29iaXQgLSAzMl07CisJCX0KKwkgICAgfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkgICAgKihpbCA9ICZrZXlfcGVybV9tYXNrbFtrXVtpXSkgPSAwTDsKKwkgICAgKihpciA9ICZrZXlfcGVybV9tYXNrcltrXVtpXSkgPSAwTDsKKwkgICAgZm9yIChqID0gMDsgaiA8IDc7IGorKykgeworCQlpbmJpdCA9IDggKiBrICsgajsKKwkJaWYgKGkgJiBiaXRzOFtqICsgMV0pIHsKKwkJICAgIGlmICgob2JpdCA9IGludl9rZXlfcGVybVtpbmJpdF0pID09IDI1NSkKKwkJCWNvbnRpbnVlOworCQkgICAgaWYgKG9iaXQgPCAyOCkKKwkJCSppbCB8PSBiaXRzMjhbb2JpdF07CisJCSAgICBlbHNlCisJCQkqaXIgfD0gYml0czI4W29iaXQgLSAyOF07CisJCX0KKwkgICAgfQorCSAgICAqKGlsID0gJmNvbXBfbWFza2xba11baV0pID0gMEw7CisJICAgICooaXIgPSAmY29tcF9tYXNrcltrXVtpXSkgPSAwTDsKKwkgICAgZm9yIChqID0gMDsgaiA8IDc7IGorKykgeworCQlpbmJpdCA9IDcgKiBrICsgajsKKwkJaWYgKGkgJiBiaXRzOFtqICsgMV0pIHsKKwkJICAgIGlmICgob2JpdCA9IGludl9jb21wX3Blcm1baW5iaXRdKSA9PSAyNTUpCisJCQljb250aW51ZTsKKwkJICAgIGlmIChvYml0IDwgMjQpCisJCQkqaWwgfD0gYml0czI0W29iaXRdOworCQkgICAgZWxzZQorCQkJKmlyIHw9IGJpdHMyNFtvYml0IC0gMjRdOworCQl9CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIEludmVydCB0aGUgUC1ib3ggcGVybXV0YXRpb24sIGFuZCBjb252ZXJ0IGludG8gT1ItbWFza3MgZm9yCisgICAgICogaGFuZGxpbmcgdGhlIG91dHB1dCBvZiB0aGUgUy1ib3ggYXJyYXlzIHNldHVwIGFib3ZlLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCXVuX3Bib3hbcGJveFtpXSAtIDFdID0gKG15X3VfY2hhcl90KSBpOworCisjaWZuZGVmIExPV1NQQUNFCisgICAgZm9yIChiID0gMDsgYiA8IDQ7IGIrKykKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkgICAgKihwID0gJnBzYm94W2JdW2ldKSA9IDBMOworCSAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCWlmIChpICYgYml0czhbal0pCisJCSAgICAqcCB8PSBiaXRzMzJbdW5fcGJveFs4ICogYiArIGpdXTsKKwkgICAgfQorCX0KKyNlbmRpZgorICAgIGRlc19pbml0aWFsaXNlZCA9IDE7Cit9CisKKyNpZmRlZiBMT1dTUEFDRQorCitzdGF0aWMgdm9pZCBzZXR1cF9pcF9tYXNrbCh2b2lkKQoreworICAgIGludCBpLCBqLCBrLCBpbmJpdCwgb2JpdDsKKyAgICBteV91X2ludDMyX3QgKmlsOworCisgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykgeworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCSAgICAqKGlsID0gJmNvbW1vbltrXVtpXSkgPSAwTDsKKwkgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQlpbmJpdCA9IDggKiBrICsgajsKKwkJaWYgKGkgJiBiaXRzOFtqXSkgeworCQkgICAgaWYgKChvYml0ID0gaW5pdF9wZXJtW2luYml0XSkgPCAzMikKKwkJCSppbCB8PSBiaXRzMzJbb2JpdF07CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2lwX21hc2tyKHZvaWQpCit7CisgICAgaW50IGksIGosIGssIGluYml0LCBvYml0OworICAgIG15X3VfaW50MzJfdCAqaXI7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJICAgICooaXIgPSAmY29tbW9uW2tdW2ldKSA9IDBMOworCSAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCWluYml0ID0gOCAqIGsgKyBqOworCQlpZiAoaSAmIGJpdHM4W2pdKSB7CisJCSAgICBpZiAoKG9iaXQgPSBpbml0X3Blcm1baW5iaXRdKSA+PSAzMikKKwkJCSppciB8PSBiaXRzMzJbb2JpdCAtIDMyXTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc2V0dXBfZnBfbWFza2wodm9pZCkKK3sKKyAgICBpbnQgaSwgaiwgaywgaW5iaXQsIG9iaXQ7CisgICAgbXlfdV9pbnQzMl90ICpmbDsKKworICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkgICAgKihmbCA9ICZjb21tb25ba11baV0pID0gMEw7CisJICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJaW5iaXQgPSA4ICogayArIGo7CisJCWlmIChpICYgYml0czhbal0pIHsKKwkJICAgIGlmICgob2JpdCA9IGZpbmFsX3Blcm1baW5iaXRdKSA8IDMyKQorCQkJKmZsIHw9IGJpdHMzMltvYml0XTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc2V0dXBfZnBfbWFza3Iodm9pZCkKK3sKKyAgICBpbnQgaSwgaiwgaywgaW5iaXQsIG9iaXQ7CisgICAgbXlfdV9pbnQzMl90ICpmcjsKKworICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkgICAgKihmciA9ICZjb21tb25ba11baV0pID0gMEw7CisJICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJaW5iaXQgPSA4ICogayArIGo7CisJCWlmIChpICYgYml0czhbal0pIHsKKwkJICAgIGlmICgob2JpdCA9IGZpbmFsX3Blcm1baW5iaXRdKSA+PSAzMikKKwkJCSpmciB8PSBiaXRzMzJbb2JpdCAtIDMyXTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc2V0dXBfa2V5X3Blcm1fbWFza2wodm9pZCkKK3sKKyAgICBpbnQgaSwgaiwgaywgaW5iaXQsIG9iaXQ7CisgICAgbXlfdV9pbnQzMl90ICppbDsKKworICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkgICAgKihpbCA9ICZjb21tb25ba11baV0pID0gMEw7CisJICAgIGZvciAoaiA9IDA7IGogPCA3OyBqKyspIHsKKwkJaW5iaXQgPSA4ICogayArIGo7CisJCWlmIChpICYgYml0czhbaiArIDFdKSB7CisJCSAgICBpZiAoKG9iaXQgPSBpbnZfa2V5X3Blcm1baW5iaXRdKSA9PSAyNTUpCisJCQljb250aW51ZTsKKwkJICAgIGlmIChvYml0IDwgMjgpCisJCQkqaWwgfD0gYml0czI4W29iaXRdOworCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXR1cF9rZXlfcGVybV9tYXNrcih2b2lkKQoreworICAgIGludCBpLCBqLCBrLCBpbmJpdCwgb2JpdDsKKyAgICBteV91X2ludDMyX3QgKmlyOworCisgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykgeworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCSAgICAqKGlyID0gJmNvbW1vbltrXVtpXSkgPSAwTDsKKwkgICAgZm9yIChqID0gMDsgaiA8IDc7IGorKykgeworCQlpbmJpdCA9IDggKiBrICsgajsKKwkJaWYgKGkgJiBiaXRzOFtqICsgMV0pIHsKKwkJICAgIGlmICgob2JpdCA9IGludl9rZXlfcGVybVtpbmJpdF0pID09IDI1NSkKKwkJCWNvbnRpbnVlOworCQkgICAgaWYgKG9iaXQgPj0gMjgpCisJCQkqaXIgfD0gYml0czI4W29iaXQgLSAyOF07CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2NvbXBfbWFza2wodm9pZCkKK3sKKyAgICBpbnQgaSwgaiwgaywgaW5iaXQsIG9iaXQ7CisgICAgbXlfdV9pbnQzMl90ICppbDsKKworICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkgICAgKihpbCA9ICZjb21tb25ba11baV0pID0gMEw7CisJICAgIGZvciAoaiA9IDA7IGogPCA3OyBqKyspIHsKKwkJaW5iaXQgPSA3ICogayArIGo7CisJCWlmIChpICYgYml0czhbaiArIDFdKSB7CisJCSAgICBpZiAoKG9iaXQgPSBpbnZfY29tcF9wZXJtW2luYml0XSkgPT0gMjU1KQorCQkJY29udGludWU7CisJCSAgICBpZiAob2JpdCA8IDI0KQorCQkJKmlsIHw9IGJpdHMyNFtvYml0XTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc2V0dXBfY29tcF9tYXNrcih2b2lkKQoreworICAgIGludCBpLCBqLCBrLCBpbmJpdCwgb2JpdDsKKyAgICBteV91X2ludDMyX3QgKmlyOworCisgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykgeworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCSAgICAqKGlyID0gJmNvbW1vbltrXVtpXSkgPSAwTDsKKwkgICAgZm9yIChqID0gMDsgaiA8IDc7IGorKykgeworCQlpbmJpdCA9IDcgKiBrICsgajsKKwkJaWYgKGkgJiBiaXRzOFtqICsgMV0pIHsKKwkJICAgIGlmICgob2JpdCA9IGludl9jb21wX3Blcm1baW5iaXRdKSA9PSAyNTUpCisJCQljb250aW51ZTsKKwkJICAgIGlmIChvYml0ID49IDI0KQorCQkJKmlyIHw9IGJpdHMyNFtvYml0IC0gMjRdOworCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXR1cF9wc2JveCh2b2lkKQoreworICAgIGludCBpLCBqLCBiOworICAgIG15X3VfaW50MzJfdCAqcDsKKworICAgIGZvciAoYiA9IDA7IGIgPCA0OyBiKyspCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJICAgICoocCA9ICZjb21tb25bYl1baV0pID0gMEw7CisJICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJaWYgKGkgJiBiaXRzOFtqXSkKKwkJICAgICpwIHw9IGJpdHMzMlt1bl9wYm94WzggKiBiICsgal1dOworCSAgICB9CisJfQorfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgc2V0dXBfc2FsdChteV91X2ludDMyX3Qgc2FsdCkKK3sKKyAgICBteV91X2ludDMyX3Qgb2JpdCwgc2FsdGJpdDsKKyAgICBpbnQgaTsKKworICAgIGlmIChzYWx0ID09IG9sZF9zYWx0KQorCXJldHVybjsKKyAgICBvbGRfc2FsdCA9IHNhbHQ7CisKKyAgICBzYWx0Yml0cyA9IDBMOworICAgIHNhbHRiaXQgPSAxOworICAgIG9iaXQgPSAweDgwMDAwMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykgeworCWlmIChzYWx0ICYgc2FsdGJpdCkKKwkgICAgc2FsdGJpdHMgfD0gb2JpdDsKKwlzYWx0Yml0IDw8PSAxOworCW9iaXQgPj49IDE7CisgICAgfQorfQorCitzdGF0aWMgbXlfdV9pbnQzMl90IGNoYXJfdG9faW50KGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBteV91X2ludDMyX3QgYnl0ZTAsIGJ5dGUxLCBieXRlMiwgYnl0ZTM7CisgICAgYnl0ZTAgPSAobXlfdV9pbnQzMl90KSAobXlfdV9jaGFyX3QpIGtleVswXTsKKyAgICBieXRlMSA9IChteV91X2ludDMyX3QpIChteV91X2NoYXJfdCkga2V5WzFdOworICAgIGJ5dGUyID0gKG15X3VfaW50MzJfdCkgKG15X3VfY2hhcl90KSBrZXlbMl07CisgICAgYnl0ZTMgPSAobXlfdV9pbnQzMl90KSAobXlfdV9jaGFyX3QpIGtleVszXTsKKworICAgIHJldHVybiBieXRlMCA8PCAyNCB8IGJ5dGUxIDw8IDE2IHwgYnl0ZTIgPDwgOCB8IGJ5dGUzOworfQorCitzdGF0aWMgaW50IGRlc19zZXRrZXkoY29uc3QgY2hhciAqa2V5KQoreworICAgIG15X3VfaW50MzJfdCBrMCwgazEsIHJhd2tleTAsIHJhd2tleTE7CisgICAgaW50IHNoaWZ0cywgcm91bmQ7CisKKyAgICBkZXNfaW5pdCgpOworCisgICAgLyogIHJhd2tleTAgPSBudG9obCgqKGNvbnN0IG15X3VfaW50MzJfdCAqKSBrZXkpOworICAgICAqICByYXdrZXkxID0gbnRvaGwoKihjb25zdCBteV91X2ludDMyX3QgKikgKGtleSArIDQpKTsKKyAgICAgKi8KKworICAgIHJhd2tleTAgPSBjaGFyX3RvX2ludChrZXkpOworICAgIHJhd2tleTEgPSBjaGFyX3RvX2ludChrZXkgKyA0KTsKKworICAgIGlmICgocmF3a2V5MCB8IHJhd2tleTEpCisJJiYgcmF3a2V5MCA9PSBvbGRfcmF3a2V5MCAmJiByYXdrZXkxID09IG9sZF9yYXdrZXkxKSB7CisJLyoKKwkgKiBBbHJlYWR5IHNldHVwIGZvciB0aGlzIGtleS4KKwkgKiBUaGlzIG9wdGltaXNhdGlvbiBmYWlscyBvbiBhIHplcm8ga2V5ICh3aGljaCBpcyB3ZWFrIGFuZAorCSAqIGhhcyBiYWQgcGFyaXR5IGFueXdheSkgaW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhlIHN0YXJ0aW5nCisJICogY29uZGl0aW9ucy4KKwkgKi8KKwlyZXR1cm4gKDApOworICAgIH0KKyAgICBvbGRfcmF3a2V5MCA9IHJhd2tleTA7CisgICAgb2xkX3Jhd2tleTEgPSByYXdrZXkxOworCisgICAgLyoKKyAgICAgKiAgICAgIERvIGtleSBwZXJtdXRhdGlvbiBhbmQgc3BsaXQgaW50byB0d28gMjgtYml0IHN1YmtleXMuCisgICAgICovCisKKyNpZmRlZiBMT1dTUEFDRQorICAgIHNldHVwX2tleV9wZXJtX21hc2tsKCk7CisgICAgazAgPSBjb21tb25bMF1bcmF3a2V5MCA+PiAyNV0KKwl8IGNvbW1vblsxXVsocmF3a2V5MCA+PiAxNykgJiAweDdmXQorCXwgY29tbW9uWzJdWyhyYXdrZXkwID4+IDkpICYgMHg3Zl0KKwl8IGNvbW1vblszXVsocmF3a2V5MCA+PiAxKSAmIDB4N2ZdCisJfCBjb21tb25bNF1bcmF3a2V5MSA+PiAyNV0KKwl8IGNvbW1vbls1XVsocmF3a2V5MSA+PiAxNykgJiAweDdmXQorCXwgY29tbW9uWzZdWyhyYXdrZXkxID4+IDkpICYgMHg3Zl0KKwl8IGNvbW1vbls3XVsocmF3a2V5MSA+PiAxKSAmIDB4N2ZdOworICAgIHNldHVwX2tleV9wZXJtX21hc2tyKCk7CisgICAgazEgPSBjb21tb25bMF1bcmF3a2V5MCA+PiAyNV0KKwl8IGNvbW1vblsxXVsocmF3a2V5MCA+PiAxNykgJiAweDdmXQorCXwgY29tbW9uWzJdWyhyYXdrZXkwID4+IDkpICYgMHg3Zl0KKwl8IGNvbW1vblszXVsocmF3a2V5MCA+PiAxKSAmIDB4N2ZdCisJfCBjb21tb25bNF1bcmF3a2V5MSA+PiAyNV0KKwl8IGNvbW1vbls1XVsocmF3a2V5MSA+PiAxNykgJiAweDdmXQorCXwgY29tbW9uWzZdWyhyYXdrZXkxID4+IDkpICYgMHg3Zl0KKwl8IGNvbW1vbls3XVsocmF3a2V5MSA+PiAxKSAmIDB4N2ZdOworI2Vsc2UKKyAgICBrMCA9IGtleV9wZXJtX21hc2tsWzBdW3Jhd2tleTAgPj4gMjVdCisJfCBrZXlfcGVybV9tYXNrbFsxXVsocmF3a2V5MCA+PiAxNykgJiAweDdmXQorCXwga2V5X3Blcm1fbWFza2xbMl1bKHJhd2tleTAgPj4gOSkgJiAweDdmXQorCXwga2V5X3Blcm1fbWFza2xbM11bKHJhd2tleTAgPj4gMSkgJiAweDdmXQorCXwga2V5X3Blcm1fbWFza2xbNF1bcmF3a2V5MSA+PiAyNV0KKwl8IGtleV9wZXJtX21hc2tsWzVdWyhyYXdrZXkxID4+IDE3KSAmIDB4N2ZdCisJfCBrZXlfcGVybV9tYXNrbFs2XVsocmF3a2V5MSA+PiA5KSAmIDB4N2ZdCisJfCBrZXlfcGVybV9tYXNrbFs3XVsocmF3a2V5MSA+PiAxKSAmIDB4N2ZdOworICAgIGsxID0ga2V5X3Blcm1fbWFza3JbMF1bcmF3a2V5MCA+PiAyNV0KKwl8IGtleV9wZXJtX21hc2tyWzFdWyhyYXdrZXkwID4+IDE3KSAmIDB4N2ZdCisJfCBrZXlfcGVybV9tYXNrclsyXVsocmF3a2V5MCA+PiA5KSAmIDB4N2ZdCisJfCBrZXlfcGVybV9tYXNrclszXVsocmF3a2V5MCA+PiAxKSAmIDB4N2ZdCisJfCBrZXlfcGVybV9tYXNrcls0XVtyYXdrZXkxID4+IDI1XQorCXwga2V5X3Blcm1fbWFza3JbNV1bKHJhd2tleTEgPj4gMTcpICYgMHg3Zl0KKwl8IGtleV9wZXJtX21hc2tyWzZdWyhyYXdrZXkxID4+IDkpICYgMHg3Zl0KKwl8IGtleV9wZXJtX21hc2tyWzddWyhyYXdrZXkxID4+IDEpICYgMHg3Zl07CisjZW5kaWYKKworICAgIC8qCisgICAgICogICAgICBSb3RhdGUgc3Via2V5cyBhbmQgZG8gY29tcHJlc3Npb24gcGVybXV0YXRpb24uCisgICAgICovCisgICAgc2hpZnRzID0gMDsKKyAgICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPCAxNjsgcm91bmQrKykgeworCW15X3VfaW50MzJfdCB0MCwgdDE7CisKKwlzaGlmdHMgKz0ga2V5X3NoaWZ0c1tyb3VuZF07CisKKwl0MCA9IChrMCA8PCBzaGlmdHMpIHwgKGswID4+ICgyOCAtIHNoaWZ0cykpOworCXQxID0gKGsxIDw8IHNoaWZ0cykgfCAoazEgPj4gKDI4IC0gc2hpZnRzKSk7CisKKyNpZmRlZiBMT1dTUEFDRQorCXNldHVwX2NvbXBfbWFza2woKTsKKwlkZV9rZXlzbFsxNSAtIHJvdW5kXSA9IGVuX2tleXNsW3JvdW5kXSA9IGNvbW1vblswXVsodDAgPj4gMjEpICYgMHg3Zl0KKwkgICAgfCBjb21tb25bMV1bKHQwID4+IDE0KSAmIDB4N2ZdCisJICAgIHwgY29tbW9uWzJdWyh0MCA+PiA3KSAmIDB4N2ZdCisJICAgIHwgY29tbW9uWzNdW3QwICYgMHg3Zl0KKwkgICAgfCBjb21tb25bNF1bKHQxID4+IDIxKSAmIDB4N2ZdCisJICAgIHwgY29tbW9uWzVdWyh0MSA+PiAxNCkgJiAweDdmXQorCSAgICB8IGNvbW1vbls2XVsodDEgPj4gNykgJiAweDdmXQorCSAgICB8IGNvbW1vbls3XVt0MSAmIDB4N2ZdOworCisJc2V0dXBfY29tcF9tYXNrcigpOworCWRlX2tleXNyWzE1IC0gcm91bmRdID0gZW5fa2V5c3Jbcm91bmRdID0gY29tbW9uWzBdWyh0MCA+PiAyMSkgJiAweDdmXQorCSAgICB8IGNvbW1vblsxXVsodDAgPj4gMTQpICYgMHg3Zl0KKwkgICAgfCBjb21tb25bMl1bKHQwID4+IDcpICYgMHg3Zl0KKwkgICAgfCBjb21tb25bM11bdDAgJiAweDdmXQorCSAgICB8IGNvbW1vbls0XVsodDEgPj4gMjEpICYgMHg3Zl0KKwkgICAgfCBjb21tb25bNV1bKHQxID4+IDE0KSAmIDB4N2ZdCisJICAgIHwgY29tbW9uWzZdWyh0MSA+PiA3KSAmIDB4N2ZdCisJICAgIHwgY29tbW9uWzddW3QxICYgMHg3Zl07CisjZWxzZQorCWRlX2tleXNsWzE1IC0gcm91bmRdID0KKwkgICAgZW5fa2V5c2xbcm91bmRdID0gY29tcF9tYXNrbFswXVsodDAgPj4gMjEpICYgMHg3Zl0KKwkgICAgfCBjb21wX21hc2tsWzFdWyh0MCA+PiAxNCkgJiAweDdmXQorCSAgICB8IGNvbXBfbWFza2xbMl1bKHQwID4+IDcpICYgMHg3Zl0KKwkgICAgfCBjb21wX21hc2tsWzNdW3QwICYgMHg3Zl0KKwkgICAgfCBjb21wX21hc2tsWzRdWyh0MSA+PiAyMSkgJiAweDdmXQorCSAgICB8IGNvbXBfbWFza2xbNV1bKHQxID4+IDE0KSAmIDB4N2ZdCisJICAgIHwgY29tcF9tYXNrbFs2XVsodDEgPj4gNykgJiAweDdmXQorCSAgICB8IGNvbXBfbWFza2xbN11bdDEgJiAweDdmXTsKKworCWRlX2tleXNyWzE1IC0gcm91bmRdID0KKwkgICAgZW5fa2V5c3Jbcm91bmRdID0gY29tcF9tYXNrclswXVsodDAgPj4gMjEpICYgMHg3Zl0KKwkgICAgfCBjb21wX21hc2tyWzFdWyh0MCA+PiAxNCkgJiAweDdmXQorCSAgICB8IGNvbXBfbWFza3JbMl1bKHQwID4+IDcpICYgMHg3Zl0KKwkgICAgfCBjb21wX21hc2tyWzNdW3QwICYgMHg3Zl0KKwkgICAgfCBjb21wX21hc2tyWzRdWyh0MSA+PiAyMSkgJiAweDdmXQorCSAgICB8IGNvbXBfbWFza3JbNV1bKHQxID4+IDE0KSAmIDB4N2ZdCisJICAgIHwgY29tcF9tYXNrcls2XVsodDEgPj4gNykgJiAweDdmXQorCSAgICB8IGNvbXBfbWFza3JbN11bdDEgJiAweDdmXTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Citkb19kZXMobXlfdV9pbnQzMl90IGxfaW4sIG15X3VfaW50MzJfdCByX2luLCBteV91X2ludDMyX3QgKiBsX291dCwKKyAgICAgICBteV91X2ludDMyX3QgKiByX291dCwgaW50IGNvdW50KQoreworICAgIC8qCisgICAgICogICAgICBsX2luLCByX2luLCBsX291dCwgYW5kIHJfb3V0IGFyZSBpbiBwc2V1ZG8tImJpZy1lbmRpYW4iIGZvcm1hdC4KKyAgICAgKi8KKyAgICBteV91X2ludDMyX3QgbCwgciwgKmtsLCAqa3IsICprbDEsICprcjE7CisgICAgbXlfdV9pbnQzMl90IGYsIHI0OGwsIHI0OHI7CisgICAgaW50IHJvdW5kOworCisgICAgaWYgKGNvdW50ID09IDApIHsKKwlyZXR1cm4gKDEpOworICAgIH0gZWxzZSBpZiAoY291bnQgPiAwKSB7CisJLyoKKwkgKiBFbmNyeXB0aW5nCisJICovCisJa2wxID0gZW5fa2V5c2w7CisJa3IxID0gZW5fa2V5c3I7CisgICAgfSBlbHNlIHsKKwkvKgorCSAqIERlY3J5cHRpbmcKKwkgKi8KKwljb3VudCA9IC1jb3VudDsKKwlrbDEgPSBkZV9rZXlzbDsKKwlrcjEgPSBkZV9rZXlzcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqICAgICAgRG8gaW5pdGlhbCBwZXJtdXRhdGlvbiAoSVApLgorICAgICAqLworCisjaWZkZWYgTE9XU1BBQ0UKKyAgICBzZXR1cF9pcF9tYXNrbCgpOworICAgIGwgPSBjb21tb25bMF1bbF9pbiA+PiAyNF0KKwl8IGNvbW1vblsxXVsobF9pbiA+PiAxNikgJiAweGZmXQorCXwgY29tbW9uWzJdWyhsX2luID4+IDgpICYgMHhmZl0KKwl8IGNvbW1vblszXVtsX2luICYgMHhmZl0KKwl8IGNvbW1vbls0XVtyX2luID4+IDI0XQorCXwgY29tbW9uWzVdWyhyX2luID4+IDE2KSAmIDB4ZmZdCisJfCBjb21tb25bNl1bKHJfaW4gPj4gOCkgJiAweGZmXQorCXwgY29tbW9uWzddW3JfaW4gJiAweGZmXTsKKyAgICBzZXR1cF9pcF9tYXNrcigpOworICAgIHIgPSBjb21tb25bMF1bbF9pbiA+PiAyNF0KKwl8IGNvbW1vblsxXVsobF9pbiA+PiAxNikgJiAweGZmXQorCXwgY29tbW9uWzJdWyhsX2luID4+IDgpICYgMHhmZl0KKwl8IGNvbW1vblszXVtsX2luICYgMHhmZl0KKwl8IGNvbW1vbls0XVtyX2luID4+IDI0XQorCXwgY29tbW9uWzVdWyhyX2luID4+IDE2KSAmIDB4ZmZdCisJfCBjb21tb25bNl1bKHJfaW4gPj4gOCkgJiAweGZmXQorCXwgY29tbW9uWzddW3JfaW4gJiAweGZmXTsKKyNlbHNlCisgICAgbCA9IGlwX21hc2tsWzBdW2xfaW4gPj4gMjRdCisJfCBpcF9tYXNrbFsxXVsobF9pbiA+PiAxNikgJiAweGZmXQorCXwgaXBfbWFza2xbMl1bKGxfaW4gPj4gOCkgJiAweGZmXQorCXwgaXBfbWFza2xbM11bbF9pbiAmIDB4ZmZdCisJfCBpcF9tYXNrbFs0XVtyX2luID4+IDI0XQorCXwgaXBfbWFza2xbNV1bKHJfaW4gPj4gMTYpICYgMHhmZl0KKwl8IGlwX21hc2tsWzZdWyhyX2luID4+IDgpICYgMHhmZl0KKwl8IGlwX21hc2tsWzddW3JfaW4gJiAweGZmXTsKKyAgICByID0gaXBfbWFza3JbMF1bbF9pbiA+PiAyNF0KKwl8IGlwX21hc2tyWzFdWyhsX2luID4+IDE2KSAmIDB4ZmZdCisJfCBpcF9tYXNrclsyXVsobF9pbiA+PiA4KSAmIDB4ZmZdCisJfCBpcF9tYXNrclszXVtsX2luICYgMHhmZl0KKwl8IGlwX21hc2tyWzRdW3JfaW4gPj4gMjRdCisJfCBpcF9tYXNrcls1XVsocl9pbiA+PiAxNikgJiAweGZmXQorCXwgaXBfbWFza3JbNl1bKHJfaW4gPj4gOCkgJiAweGZmXQorCXwgaXBfbWFza3JbN11bcl9pbiAmIDB4ZmZdOworI2VuZGlmCisKKyAgICB3aGlsZSAoY291bnQtLSkgeworCS8qCisJICogRG8gZWFjaCByb3VuZC4KKwkgKi8KKwlrbCA9IGtsMTsKKwlrciA9IGtyMTsKKwlyb3VuZCA9IDE2OworCXdoaWxlIChyb3VuZC0tKSB7CisJICAgIC8qCisJICAgICAqIEV4cGFuZCBSIHRvIDQ4IGJpdHMgKHNpbXVsYXRlIHRoZSBFLWJveCkuCisJICAgICAqLworCSAgICByNDhsID0gKChyICYgMHgwMDAwMDAwMSkgPDwgMjMpCisJCXwgKChyICYgMHhmODAwMDAwMCkgPj4gOSkKKwkJfCAoKHIgJiAweDFmODAwMDAwKSA+PiAxMSkKKwkJfCAoKHIgJiAweDAxZjgwMDAwKSA+PiAxMykKKwkJfCAoKHIgJiAweDAwMWY4MDAwKSA+PiAxNSk7CisKKwkgICAgcjQ4ciA9ICgociAmIDB4MDAwMWY4MDApIDw8IDcpCisJCXwgKChyICYgMHgwMDAwMWY4MCkgPDwgNSkKKwkJfCAoKHIgJiAweDAwMDAwMWY4KSA8PCAzKQorCQl8ICgociAmIDB4MDAwMDAwMWYpIDw8IDEpCisJCXwgKChyICYgMHg4MDAwMDAwMCkgPj4gMzEpOworCSAgICAvKgorCSAgICAgKiBEbyBzYWx0aW5nIGZvciBjcnlwdCgpIGFuZCBmcmllbmRzLCBhbmQKKwkgICAgICogWE9SIHdpdGggdGhlIHBlcm11dGVkIGtleS4KKwkgICAgICovCisJICAgIGYgPSAocjQ4bCBeIHI0OHIpICYgc2FsdGJpdHM7CisJICAgIHI0OGwgXj0gZiBeICprbCsrOworCSAgICByNDhyIF49IGYgXiAqa3IrKzsKKwkgICAgLyoKKwkgICAgICogRG8gc2JveCBsb29rdXBzICh3aGljaCBzaHJpbmsgaXQgYmFjayB0byAzMiBiaXRzKQorCSAgICAgKiBhbmQgZG8gdGhlIHBib3ggcGVybXV0YXRpb24gYXQgdGhlIHNhbWUgdGltZS4KKwkgICAgICovCisKKyNpZmRlZiBMT1dTUEFDRQorCSAgICBzZXR1cF9wc2JveCgpOworCSAgICBmID0gY29tbW9uWzBdW21fc2JveFswXVtyNDhsID4+IDEyXV0KKwkJfCBjb21tb25bMV1bbV9zYm94WzFdW3I0OGwgJiAweGZmZl1dCisJCXwgY29tbW9uWzJdW21fc2JveFsyXVtyNDhyID4+IDEyXV0KKwkJfCBjb21tb25bM11bbV9zYm94WzNdW3I0OHIgJiAweGZmZl1dOworI2Vsc2UKKwkgICAgZiA9IHBzYm94WzBdW21fc2JveFswXVtyNDhsID4+IDEyXV0KKwkJfCBwc2JveFsxXVttX3Nib3hbMV1bcjQ4bCAmIDB4ZmZmXV0KKwkJfCBwc2JveFsyXVttX3Nib3hbMl1bcjQ4ciA+PiAxMl1dCisJCXwgcHNib3hbM11bbV9zYm94WzNdW3I0OHIgJiAweGZmZl1dOworI2VuZGlmCisJICAgIC8qCisJICAgICAqIE5vdyB0aGF0IHdlJ3ZlIHBlcm11dGVkIHRoaW5ncywgY29tcGxldGUgZigpLgorCSAgICAgKi8KKwkgICAgZiBePSBsOworCSAgICBsID0gcjsKKwkgICAgciA9IGY7CisJfQorCXIgPSBsOworCWwgPSBmOworICAgIH0KKyAgICAvKgorICAgICAqIERvIGZpbmFsIHBlcm11dGF0aW9uIChpbnZlcnNlIG9mIElQKS4KKyAgICAgKi8KKworI2lmZGVmIExPV1NQQUNFCisgICAgc2V0dXBfZnBfbWFza2woKTsKKyAgICAqbF9vdXQgPSBjb21tb25bMF1bbCA+PiAyNF0KKwl8IGNvbW1vblsxXVsobCA+PiAxNikgJiAweGZmXQorCXwgY29tbW9uWzJdWyhsID4+IDgpICYgMHhmZl0KKwl8IGNvbW1vblszXVtsICYgMHhmZl0KKwl8IGNvbW1vbls0XVtyID4+IDI0XQorCXwgY29tbW9uWzVdWyhyID4+IDE2KSAmIDB4ZmZdCisJfCBjb21tb25bNl1bKHIgPj4gOCkgJiAweGZmXQorCXwgY29tbW9uWzddW3IgJiAweGZmXTsKKyAgICBzZXR1cF9mcF9tYXNrcigpOworICAgICpyX291dCA9IGNvbW1vblswXVtsID4+IDI0XQorCXwgY29tbW9uWzFdWyhsID4+IDE2KSAmIDB4ZmZdCisJfCBjb21tb25bMl1bKGwgPj4gOCkgJiAweGZmXQorCXwgY29tbW9uWzNdW2wgJiAweGZmXQorCXwgY29tbW9uWzRdW3IgPj4gMjRdCisJfCBjb21tb25bNV1bKHIgPj4gMTYpICYgMHhmZl0KKwl8IGNvbW1vbls2XVsociA+PiA4KSAmIDB4ZmZdCisJfCBjb21tb25bN11bciAmIDB4ZmZdOworI2Vsc2UKKyAgICAqbF9vdXQgPSBmcF9tYXNrbFswXVtsID4+IDI0XQorCXwgZnBfbWFza2xbMV1bKGwgPj4gMTYpICYgMHhmZl0KKwl8IGZwX21hc2tsWzJdWyhsID4+IDgpICYgMHhmZl0KKwl8IGZwX21hc2tsWzNdW2wgJiAweGZmXQorCXwgZnBfbWFza2xbNF1bciA+PiAyNF0KKwl8IGZwX21hc2tsWzVdWyhyID4+IDE2KSAmIDB4ZmZdCisJfCBmcF9tYXNrbFs2XVsociA+PiA4KSAmIDB4ZmZdCisJfCBmcF9tYXNrbFs3XVtyICYgMHhmZl07CisgICAgKnJfb3V0ID0gZnBfbWFza3JbMF1bbCA+PiAyNF0KKwl8IGZwX21hc2tyWzFdWyhsID4+IDE2KSAmIDB4ZmZdCisJfCBmcF9tYXNrclsyXVsobCA+PiA4KSAmIDB4ZmZdCisJfCBmcF9tYXNrclszXVtsICYgMHhmZl0KKwl8IGZwX21hc2tyWzRdW3IgPj4gMjRdCisJfCBmcF9tYXNrcls1XVsociA+PiAxNikgJiAweGZmXQorCXwgZnBfbWFza3JbNl1bKHIgPj4gOCkgJiAweGZmXQorCXwgZnBfbWFza3JbN11bciAmIDB4ZmZdOworI2VuZGlmCisgICAgcmV0dXJuICgwKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgZGVzX2NpcGhlcihjb25zdCBjaGFyICppbiwgY2hhciAqb3V0LCBteV91X2ludDMyX3Qgc2FsdCwgaW50IGNvdW50KQoreworICAgIG15X3VfaW50MzJfdCBsX291dCwgcl9vdXQsIHJhd2wsIHJhd3I7CisgICAgaW50IHJldHZhbDsKKyAgICB1bmlvbiB7CisJbXlfdV9pbnQzMl90ICp1aTMyOworCWNvbnN0IGNoYXIgKmM7CisgICAgfSB0cmFuczsKKworICAgIGRlc19pbml0KCk7CisKKyAgICBzZXR1cF9zYWx0KHNhbHQpOworCisgICAgdHJhbnMuYyA9IGluOworICAgIHJhd2wgPSBudG9obCgqdHJhbnMudWkzMisrKTsKKyAgICByYXdyID0gbnRvaGwoKnRyYW5zLnVpMzIpOworCisgICAgcmV0dmFsID0gZG9fZGVzKHJhd2wsIHJhd3IsICZsX291dCwgJnJfb3V0LCBjb3VudCk7CisKKyAgICB0cmFucy5jID0gb3V0OworICAgICp0cmFucy51aTMyKysgPSBodG9ubChsX291dCk7CisgICAgKnRyYW5zLnVpMzIgPSBodG9ubChyX291dCk7CisgICAgcmV0dXJuIChyZXR2YWwpOworfQorI2VuZGlmCisKK3ZvaWQgc2V0a2V5KGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBjaGFyICpwLCBwYWNrZWRfa2V5c1s4XTsKKworICAgIHAgPSBwYWNrZWRfa2V5czsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwlwW2ldID0gMDsKKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCSAgICBpZiAoKmtleSsrICYgMSkKKwkJcFtpXSB8PSBiaXRzOFtqXTsKKyAgICB9CisgICAgZGVzX3NldGtleShwKTsKK30KKwordm9pZCBlbmNyeXB0KGNoYXIgKmJsb2NrLCBpbnQgZmxhZykKK3sKKyAgICBteV91X2ludDMyX3QgaW9bMl07CisgICAgbXlfdV9jaGFyX3QgKnA7CisgICAgaW50IGksIGo7CisKKyAgICBkZXNfaW5pdCgpOworCisgICAgc2V0dXBfc2FsdCgwTCk7CisgICAgcCA9IChteV91X2NoYXJfdCAqKWJsb2NrOworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwlpb1tpXSA9IDBMOworCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKQorCSAgICBpZiAoKnArKyAmIDEpCisJCWlvW2ldIHw9IGJpdHMzMltqXTsKKyAgICB9CisgICAgZG9fZGVzKGlvWzBdLCBpb1sxXSwgaW8sIGlvICsgMSwgZmxhZyA/IC0xIDogMSk7CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykKKwkgICAgYmxvY2tbKGkgPDwgNSkgfCBqXSA9IChpb1tpXSAmIGJpdHMzMltqXSkgPyAxIDogMDsKK30KKworY2hhciAqY3J5cHQoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICpzZXR0aW5nKQoreworICAgIG15X3VfaW50MzJfdCBjb3VudCwgc2FsdCwgbCwgcjAsIHIxLCBrZXlidWZbMl07CisgICAgbXlfdV9jaGFyX3QgKnAsICpxOworICAgIHN0YXRpYyBjaGFyIG91dHB1dFsyMV07CisKKyAgICBkZXNfaW5pdCgpOworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBrZXksIHNoaWZ0aW5nIGVhY2ggY2hhcmFjdGVyIHVwIGJ5IG9uZSBiaXQKKyAgICAgKiBhbmQgcGFkZGluZyB3aXRoIHplcm9zLgorICAgICAqLworICAgIHEgPSAobXlfdV9jaGFyX3QgKikga2V5YnVmOworICAgIHdoaWxlIChxIC0gKG15X3VfY2hhcl90ICopIGtleWJ1ZiAtIDgpIHsKKwkqcSsrID0gKmtleSA8PCAxOworCWlmICgqKHEgLSAxKSkKKwkgICAga2V5Kys7CisgICAgfQorICAgIGlmIChkZXNfc2V0a2V5KChjaGFyICopa2V5YnVmKSkKKwlyZXR1cm4gKE5VTEwpOworCisjaWYgMAorICAgIGlmICgqc2V0dGluZyA9PSBfUEFTU1dPUkRfRUZNVDEpIHsKKwlpbnQgaTsKKwkvKgorCSAqICJuZXciLXN0eWxlOgorCSAqICAgICAgc2V0dGluZyAtIHVuZGVyc2NvcmUsIDQgYnl0ZXMgb2YgY291bnQsIDQgYnl0ZXMgb2Ygc2FsdAorCSAqICAgICAga2V5IC0gdW5saW1pdGVkIGNoYXJhY3RlcnMKKwkgKi8KKwlmb3IgKGkgPSAxLCBjb3VudCA9IDBMOyBpIDwgNTsgaSsrKQorCSAgICBjb3VudCB8PSBhc2NpaV90b19iaW4oc2V0dGluZ1tpXSkgPDwgKChpIC0gMSkgKiA2KTsKKworCWZvciAoaSA9IDUsIHNhbHQgPSAwTDsgaSA8IDk7IGkrKykKKwkgICAgc2FsdCB8PSBhc2NpaV90b19iaW4oc2V0dGluZ1tpXSkgPDwgKChpIC0gNSkgKiA2KTsKKworCXdoaWxlICgqa2V5KSB7CisJICAgIC8qCisJICAgICAqIEVuY3J5cHQgdGhlIGtleSB3aXRoIGl0c2VsZi4KKwkgICAgICovCisJICAgIGlmIChkZXNfY2lwaGVyKChjaGFyICopa2V5YnVmLCAoY2hhciAqKWtleWJ1ZiwgMEwsIDEpKQorCQlyZXR1cm4gKE5VTEwpOworCSAgICAvKgorCSAgICAgKiBBbmQgWE9SIHdpdGggdGhlIG5leHQgOCBjaGFyYWN0ZXJzIG9mIHRoZSBrZXkuCisJICAgICAqLworCSAgICBxID0gKG15X3VfY2hhcl90ICopIGtleWJ1ZjsKKwkgICAgd2hpbGUgKHEgLSAobXlfdV9jaGFyX3QgKikga2V5YnVmIC0gOCAmJiAqa2V5KQorCQkqcSsrIF49ICprZXkrKyA8PCAxOworCisJICAgIGlmIChkZXNfc2V0a2V5KChjaGFyICopa2V5YnVmKSkKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJc3RybmNweShvdXRwdXQsIHNldHRpbmcsIDkpOworCisJLyoKKwkgKiBEb3VibGUgY2hlY2sgdGhhdCB3ZSB3ZXJlbid0IGdpdmVuIGEgc2hvcnQgc2V0dGluZy4KKwkgKiBJZiB3ZSB3ZXJlLCB0aGUgYWJvdmUgY29kZSB3aWxsIHByb2JhYmx5IGhhdmUgY3JlYXRlZAorCSAqIHdpZXJkIHZhbHVlcyBmb3IgY291bnQgYW5kIHNhbHQsIGJ1dCB3ZSBkb24ndCByZWFsbHkgY2FyZS4KKwkgKiBKdXN0IG1ha2Ugc3VyZSB0aGUgb3V0cHV0IHN0cmluZyBkb2Vzbid0IGhhdmUgYW4gZXh0cmEKKwkgKiBOVUwgaW4gaXQuCisJICovCisJb3V0cHV0WzldID0gJ1wwJzsKKwlwID0gKG15X3VfY2hhcl90ICopIG91dHB1dCArIHN0cmxlbihvdXRwdXQpOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworCS8qCisJICogIm9sZCItc3R5bGU6CisJICogICAgICBzZXR0aW5nIC0gMiBieXRlcyBvZiBzYWx0CisJICogICAgICBrZXkgLSB1cCB0byA4IGNoYXJhY3RlcnMKKwkgKi8KKwljb3VudCA9IDI1OworCisJc2FsdCA9IChhc2NpaV90b19iaW4oc2V0dGluZ1sxXSkgPDwgNikKKwkgICAgfCBhc2NpaV90b19iaW4oc2V0dGluZ1swXSk7CisKKwlvdXRwdXRbMF0gPSBzZXR0aW5nWzBdOworCS8qCisJICogSWYgdGhlIGVuY3J5cHRlZCBwYXNzd29yZCB0aGF0IHRoZSBzYWx0IHdhcyBleHRyYWN0ZWQgZnJvbQorCSAqIGlzIG9ubHkgMSBjaGFyYWN0ZXIgbG9uZywgdGhlIHNhbHQgd2lsbCBiZSBjb3JydXB0ZWQuICBXZQorCSAqIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBzdHJpbmcgZG9lc24ndCBoYXZlIGFuIGV4dHJhCisJICogTlVMIGluIGl0IQorCSAqLworCW91dHB1dFsxXSA9IHNldHRpbmdbMV0gPyBzZXR0aW5nWzFdIDogb3V0cHV0WzBdOworCisJcCA9IChteV91X2NoYXJfdCAqKSBvdXRwdXQgKyAyOworICAgIH0KKyAgICBzZXR1cF9zYWx0KHNhbHQpOworICAgIC8qCisgICAgICogRG8gaXQuCisgICAgICovCisgICAgaWYgKGRvX2RlcygwTCwgMEwsICZyMCwgJnIxLCAoaW50KWNvdW50KSkKKwlyZXR1cm4gKE5VTEwpOworICAgIC8qCisgICAgICogTm93IGVuY29kZSB0aGUgcmVzdWx0Li4uCisgICAgICovCisgICAgbCA9IChyMCA+PiA4KTsKKyAgICAqcCsrID0gYXNjaWk2NFsobCA+PiAxOCkgJiAweDNmXTsKKyAgICAqcCsrID0gYXNjaWk2NFsobCA+PiAxMikgJiAweDNmXTsKKyAgICAqcCsrID0gYXNjaWk2NFsobCA+PiA2KSAmIDB4M2ZdOworICAgICpwKysgPSBhc2NpaTY0W2wgJiAweDNmXTsKKworICAgIGwgPSAocjAgPDwgMTYpIHwgKChyMSA+PiAxNikgJiAweGZmZmYpOworICAgICpwKysgPSBhc2NpaTY0WyhsID4+IDE4KSAmIDB4M2ZdOworICAgICpwKysgPSBhc2NpaTY0WyhsID4+IDEyKSAmIDB4M2ZdOworICAgICpwKysgPSBhc2NpaTY0WyhsID4+IDYpICYgMHgzZl07CisgICAgKnArKyA9IGFzY2lpNjRbbCAmIDB4M2ZdOworCisgICAgbCA9IHIxIDw8IDI7CisgICAgKnArKyA9IGFzY2lpNjRbKGwgPj4gMTIpICYgMHgzZl07CisgICAgKnArKyA9IGFzY2lpNjRbKGwgPj4gNikgJiAweDNmXTsKKyAgICAqcCsrID0gYXNjaWk2NFtsICYgMHgzZl07CisgICAgKnAgPSAwOworCisgICAgcmV0dXJuIChvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvbGlibWVudS9kZXMuaCBiL2NvbTMyL2NtZW51L2xpYm1lbnUvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyMGQ0MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NtZW51L2xpYm1lbnUvZGVzLmgKQEAgLTAsMCArMSw4IEBACisKKyNpZm5kZWYgX0RFU19IXworI2RlZmluZSBfREVTX0hfCisKKy8vIGRlcyBjcnlwdAorZXh0ZXJuIGNoYXIgKmNyeXB0KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqc2FsdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvbGlibWVudS9oZWxwLmMgYi9jb20zMi9jbWVudS9saWJtZW51L2hlbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjkxN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvbGlibWVudS9oZWxwLmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDUgTXVyYWxpIEtyaXNobmFuIEdhbmFwYXRoeSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAiaGVscC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAiY29tMzJpby5oIgorI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CS8vIHRvIHJlYWQgZW50aXJlIGZpbGUgaW50byBtZW1vcnkKKworaW50IG5jLCBucjsgLy8gTnVtYmVyIG9mIGNvbHVtbnMvcm93cyBvZiB0aGUgc2NyZWVuCitjaGFyIGhlbHBiYXNlZGlyW0hFTFBESVJMRU5dOwkvLyBuYW1lIG9mIGhlbHAgZGlyZWN0b3J5IGxpbWl0ZWQgdG8gSEVMUERJUkxFTgorCisvLyBGaW5kIHRoZSBvY2N1cmVuY2Ugb2YgdGhlIGNvdW50J3RoIFxuIGluIGJ1ZmZlciAob3IgTlVMTCkgaWYgbm90IGZvdW5kCitzdGF0aWMgY2hhciAqZmluZGxpbmUoY2hhciAqYnVmZmVyLCBpbnQgY291bnQpCit7CisgICAgaW50IGN0cjsKKyAgICBjaGFyICpwID0gYnVmZmVyIC0gMTsKKworICAgIGlmIChjb3VudCA8IDEpCisJcmV0dXJuIGJ1ZmZlcjsKKyAgICBmb3IgKGN0ciA9IDA7IGN0ciA8IGNvdW50OyBjdHIrKykgeworCXAgPSBzdHJjaHIocCArIDEsICdcbicpOworCWlmIChwID09IE5VTEwpCisJICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcDsKK30KKworLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gYnVmZmVyCitzdGF0aWMgaW50IGNvdW50bGluZXMoY2hhciAqYnVmZmVyKQoreworICAgIGludCBhbnM7CisgICAgY29uc3QgY2hhciAqcDsKKworICAgIHAgPSBidWZmZXIgLSAxOworICAgIGFucyA9IDE7CisgICAgd2hpbGUgKHApIHsKKwlwID0gc3RyY2hyKHAgKyAxLCAnXG4nKTsKKwlhbnMrKzsKKyAgICB9CisgICAgcmV0dXJuIGFuczsKK30KKworLy8gUHJpbnQgbnVtbGluZXMgb2YgdGV4dCBzdGFydGluZyBmcm9tIGJ1Zgorc3RhdGljIHZvaWQgcHJpbnR0ZXh0KGNoYXIgKmJ1ZiwgaW50IGZyb20pCit7CisgICAgY2hhciAqZiwgKnQ7CisgICAgaW50IG5saW5lcywgaTsKKworICAgIC8vIGNsZWFyIHdpbmRvdyB0byBwcmludAorICAgIG5saW5lcyA9IG5yIC0gSEVMUF9CT0RZX1JPVyAtIEhFTFBfQk9UVE9NX01BUkdJTiAtIDE7CisKKyAgICBmID0gZmluZGxpbmUoYnVmLCBmcm9tKTsKKyAgICBpZiAoIWYpCisJcmV0dXJuOwkJCS8vIG5vdGhpbmcgdG8gcHJpbnQKKyAgICBpZiAoKmYgPT0gJ1xuJykKKwlmKys7CQkJLy8gc3RhcnQgb2YgZnJvbSsxc3QgbGluZQorICAgIHQgPSBmOworCisgICAgZm9yIChpID0gMDsgaSA8IG5saW5lczsgaSsrKSB7CisgICAgICAgIGdvdG94eShIRUxQX0JPRFlfUk9XICsgaSwgSEVMUF9MRUZUX01BUkdJTik7CisgICAgICAgIGNsZWFyX2VuZF9vZl9saW5lKCk7CisgICAgICAgIHB1dGNoYXIoU08pOworICAgICAgICBnb3RveHkoSEVMUF9CT0RZX1JPVyArIGksIG5jIC0gMSk7CisgICAgICAgIHB1dGNoKExFRlRfQk9SREVSLCAweDA3KTsKKyAgICAgICAgcHV0Y2hhcihTSSk7CisKKyAgICAgICAgZ290b3h5KEhFTFBfQk9EWV9ST1cgKyBpLCBIRUxQX0xFRlRfTUFSR0lOKTsKKyAgICAgICAgd2hpbGUgKCp0ICE9ICdcbicpIHsKKyAgICAgICAgICAgIGlmICgqdCA9PSAnXDAnKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHB1dGNoYXIoKnQpOworICAgICAgICAgICAgdCsrOworICAgICAgICB9CisgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgICAgIHQrKzsKKyAgICB9Cit9CisKK3ZvaWQgc2hvd2hlbHAoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgY2hhciBwaDsKKyAgICBjaGFyICp0aXRsZSwgKnRleHQ7CisgICAgdW5pb24geworCWNoYXIgKmJ1ZmZlcjsKKwl2b2lkICp2YnVmOworICAgIH0gYnVmOwkJCS8vIFRoaXMgaXMgdG8gYXZvaWxkIHR5cGUtcHVubmluZyBpc3N1ZXMKKworICAgIGNoYXIgbGluZVs1MTJdOworICAgIHNpemVfdCBzaXplOworICAgIGludCBzY2FuOworICAgIGludCBydiwgbnVtbGluZXMsIGN1cnJfbGluZTsKKworICAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZuciwgJm5jKSkgeworICAgICAgICAvKiBVbmtub3duIHNjcmVlbiBzaXplPyAqLworICAgICAgICBuYyA9IDgwOworICAgICAgICBuciA9IDI0OworICAgIH0KKyAgICBwaCA9IG5yIC0gSEVMUF9CT0RZX1JPVzsKKyAgICBjbHMoKTsKKworICAgIC8qIFR1cm4gYXV0b3dyYXAgb2ZmLCB0byBhdm9pZCBzY3JvbGxpbmcgdGhlIG1lbnUgKi8KKyAgICBwcmludGYoQ1NJICI/N2wiKTsKKworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKSB7CS8vIHByaW50IGZpbGUgY29udGVudHMKKyAgICAgICAgc3RyY3B5KGxpbmUsICJGaWxlbmFtZSBub3QgZ2l2ZW4iKTsKKyAgICAgICAgZ290byBwdWtlOworICAgIH0KKworICAgIHJ2ID0gbG9hZGZpbGUoZmlsZW5hbWUsICh2b2lkICoqKSZidWYudmJ1ZiwgJnNpemUpOwkvLyBsb2FkIGVudGlyZSBmaWxlIGludG8gbWVtb3J5CisgICAgaWYgKHJ2IDwgMCkgewkJLy8gRXJyb3IgcmVhZGluZyBmaWxlIG9yIG5vIHN1Y2ggZmlsZQorICAgICAgICBzcHJpbnRmKGxpbmUsICJFcnJvciByZWFkaW5nIGZpbGUgb3IgZmlsZSBub3QgZm91bmRcbiBmaWxlPSVzIiwgZmlsZW5hbWUpOworICAgICAgICBnb3RvIHB1a2U7CisgICAgfQorCisgICAgdGl0bGUgPSBidWYuYnVmZmVyOworICAgIHRleHQgPSBmaW5kbGluZSh0aXRsZSwgMSk7CS8vIGVuZCBvZiBmaXJzdCBsaW5lCisgICAgKnRleHQrKyA9ICdcMCc7CQkvLyBlbmQgdGhlIHRpdGxlIHN0cmluZyBhbmQgaW5jcmVtZW50IHRleHQKKworICAgIC8vIE5vdyB3ZSBoYXZlIGEgZmlsZSBqdXN0IHByaW50IGl0LgorICAgIG51bWxpbmVzID0gY291bnRsaW5lcyh0ZXh0KTsKKyAgICBjdXJyX2xpbmUgPSAwOworICAgIHNjYW4gPSBLRVlfRVNDICsgMTsJCS8vIGFueXRoaW5nIGV4Y2VwdCBFU0NBUEUKKworICAgIC8qIHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgYXR0ciAqLworICAgIGRyYXdib3goMCwgMCwgbnIgLSAxLCBuYyAtIDEsIDB4MDcpOworICAgIHdoaWxlIChzY2FuICE9IEtFWV9FU0MpIHsKKyAgICAvKiBUaXRsZSAqLworICAgIGdvdG94eSgxLCAobmMgLSBzdHJsZW4odGl0bGUpKSAvIDIpOworICAgIGZwdXRzKHRpdGxlLCBzdGRvdXQpOworICAgIGRyYXdob3JpemxpbmUoMiwgSEVMUF9MRUZUX01BUkdJTiAtIDEsIG5jIC0gSEVMUF9SSUdIVF9NQVJHSU4sIDB4MDcsIDApOwkvLyBkdW1iPT0wCisgICAgLyogVGV4dCAqLworCXByaW50dGV4dCh0ZXh0LCBjdXJyX2xpbmUpOworICAgIGdvdG94eShIRUxQX0JPRFlfUk9XIC0gMSwgbmMgLSBIRUxQX1JJR0hUX01BUkdJTik7CisJaWYgKGN1cnJfbGluZSA+IDApCisJICAgIHB1dGNoYXIoSEVMUF9NT1JFX0FCT1ZFKTsKKwllbHNlCisJICAgIHB1dGNoYXIoJyAnKTsKKwlnb3RveHkobnIgLSBIRUxQX0JPVFRPTV9NQVJHSU4gLSAxLCBuYyAtIEhFTFBfUklHSFRfTUFSR0lOKTsKKwlpZiAoY3Vycl9saW5lIDwgbnVtbGluZXMgLSBwaCkKKwkgICAgcHV0Y2hhcihIRUxQX01PUkVfQkVMT1cpOworCWVsc2UKKwkgICAgcHV0Y2hhcignICcpOworCisgICAgc2NhbiA9IGdldF9rZXkoc3Rkb3V0LCAwKTsgLy8gd2FpdCBmb3IgdXNlciBrZXlwcmVzcworCisJc3dpdGNoIChzY2FuKSB7CisJY2FzZSBLRVlfSE9NRToKKwkgICAgY3Vycl9saW5lID0gMDsKKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfRU5EOgorCSAgICBjdXJyX2xpbmUgPSBudW1saW5lczsKKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfVVA6CisJICAgIGN1cnJfbGluZS0tOworCSAgICBicmVhazsKKwljYXNlIEtFWV9ET1dOOgorCSAgICBjdXJyX2xpbmUrKzsKKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfUEdVUDoKKwkgICAgY3Vycl9saW5lIC09IHBoOworCSAgICBicmVhazsKKwljYXNlIEtFWV9QR0ROOgorCSAgICBjdXJyX2xpbmUgKz0gcGg7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGJyZWFrOworCX0KKwlpZiAoY3Vycl9saW5lID4gbnVtbGluZXMgLSBwaCkKKwkgICAgY3Vycl9saW5lID0gbnVtbGluZXMgLSBwaDsKKwlpZiAoY3Vycl9saW5lIDwgMCkKKwkgICAgY3Vycl9saW5lID0gMDsKKyAgICB9CitvdXQ6CisgICAgY2xzKCk7CisgICAgcmV0dXJuOworCitwdWtlOgorICAgIGdvdG94eShIRUxQX0JPRFlfUk9XLCBIRUxQX0xFRlRfTUFSR0lOKTsKKyAgICBmcHV0cyhsaW5lLCBzdGRvdXQpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHNjYW4gPSBnZXRfa2V5KHN0ZGluLCAwKTsKKyAgICAgICAgaWYgKHNjYW4gPT0gS0VZX0VTQykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBnb3RvIG91dDsKK30KKwordm9pZCBydW5oZWxwKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGNoYXIgZnVsbG5hbWVbSEVMUERJUkxFTiArIDE2XTsKKworCWNscygpOworICAgIGN1cnNvcm9mZigpOworICAgIGlmIChoZWxwYmFzZWRpclswXSAhPSAwKSB7CisJc3RyY3B5KGZ1bGxuYW1lLCBoZWxwYmFzZWRpcik7CisJc3RyY2F0KGZ1bGxuYW1lLCAiLyIpOworCXN0cmNhdChmdWxsbmFtZSwgZmlsZW5hbWUpOworCXNob3doZWxwKGZ1bGxuYW1lKTsKKyAgICB9IGVsc2UKKwlzaG93aGVscChmaWxlbmFtZSk7CS8vIEFzc3VtZSBmaWxlbmFtZSBpcyBhYnNvbHV0ZQorfQorCit2b2lkIHJ1bmhlbHBzeXN0ZW0odW5zaWduZWQgaW50IGhlbHBpZCkKK3sKKyAgICBjaGFyIGZpbGVuYW1lWzE1XTsKKworICAgIHNwcmludGYoZmlsZW5hbWUsICJobHAlMDVkLnR4dCIsIGhlbHBpZCk7CisgICAgcnVuaGVscChmaWxlbmFtZSk7Cit9CisKK3ZvaWQgaW5pdF9oZWxwKGNvbnN0IGNoYXIgKmhlbHBkaXIpCit7CisgICAgaWYgKGhlbHBkaXIgIT0gTlVMTCkKKwlzdHJjcHkoaGVscGJhc2VkaXIsIGhlbHBkaXIpOworICAgIGVsc2UKKwloZWxwYmFzZWRpclswXSA9IDA7Cit9CisKK3ZvaWQgY2xvc2VfaGVscCh2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvbGlibWVudS9oZWxwLmggYi9jb20zMi9jbWVudS9saWJtZW51L2hlbHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNjYzNjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvbGlibWVudS9oZWxwLmgKQEAgLTAsMCArMSw0OSBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNSBNdXJhbGkgS3Jpc2huYW4gR2FuYXBhdGh5IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX19IRUxQX0hfCisjZGVmaW5lIF9fSEVMUF9IXworCisjaW5jbHVkZSAiY21lbnUuaCIKKyNpbmNsdWRlICJjb20zMmlvLmgiCisjaW5jbHVkZSAidHVpLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIEhvdyBtYW55IHJvd3MgZm9yIHRoZSB0aXRsZQorI2RlZmluZSBIRUxQX1RJVExFX0hFSUdIVCAxCisjZGVmaW5lIEhFTFBfQk9EWV9ST1cgKEhFTFBfVElUTEVfSEVJR0hUKzMpCisjZGVmaW5lIEhFTFBfTEVGVF9NQVJHSU4gMgorI2RlZmluZSBIRUxQX1JJR0hUX01BUkdJTiAyCS8vIEFzc3VtZSBhbGwgbGluZXMgZG9udCBjcm9zcyB0aGlzCisjZGVmaW5lIEhFTFBfQk9UVE9NX01BUkdJTiAxCS8vIE51bWJlciBvZiBsaW5lcyBub3QgdXNlIGZyb20gYm90dG9tIG9mIHNjcmVlbgorCisjZGVmaW5lIEhFTFBCT1ggQk9YX1NJTlNJTgorI2RlZmluZSBIRUxQRElSTEVOICA2NAorI2RlZmluZSBIRUxQUEFHRSAyCisKKyNkZWZpbmUgSEVMUF9NT1JFX0FCT1ZFICdeJwkvLyB0byBwcmludCB3aGVuIG1vcmUgaXMgYXZhaWxhYmxlIGFib3ZlCisjZGVmaW5lIEhFTFBfTU9SRV9CRUxPVyAndicJLy8gc2FtZSBhcyBhYm92ZSBidXQgZm9yIGJlbG93CisKKy8vIERpc3BsYXkgb25lIHNjcmVlbiBvZiBoZWxwIGluZm9ybWF0aW9uCit2b2lkIHNob3doZWxwKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLy8gU3RhcnQgdGhlIGhlbHAgc3lzdGVtIHVzaW5nIGlkIGhlbHBpZAordm9pZCBydW5oZWxwc3lzdGVtKHVuc2lnbmVkIGludCBoZWxwaWQpOworCisvLyBTdGFydCBoZWxwIHN5c3RlbSB3aXRoIHNwZWNpZmllZCBmaWxlCit2b2lkIHJ1bmhlbHAoY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvLyBEaXJlY3Rvcnkgd2hlcmUgaGVscCBmaWxlcyBhcmUgbG9jYXRlZAordm9pZCBpbml0X2hlbHAoY29uc3QgY2hhciAqaGVscGRpcik7CisvLyBGcmVlIGludGVybmFsIGRhdGFzdHJ1Y3R1cmVzCit2b2lkIGNsb3NlX2hlbHAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvbGlibWVudS9tZW51LmMgYi9jb20zMi9jbWVudS9saWJtZW51L21lbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjFlN2FkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvbGlibWVudS9tZW51LmMKQEAgLTAsMCArMSwxMjczIEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA1IE11cmFsaSBLcmlzaG5hbiBHYW5hcGF0aHkgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImNtZW51LmgiCisjaW5jbHVkZSAiY29tMzJpby5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKworLy8gTG9jYWwgVmFyaWFibGVzCitzdGF0aWMgcHRfbWVudXN5c3RlbSBtczsgICAgLy8gUG9pbnRlciB0byB0aGUgbWVudXN5c3RlbQorY2hhciBUSVRMRVNUUltdID0KKyAgICAiQ09NQk9PVCBNZW51IFN5c3RlbSBmb3IgU1lTTElOVVggZGV2ZWxvcGVkIGJ5IE11cmFsaSBLcmlzaG5hbiBHYW5hcGF0aHkiOworY2hhciBUSVRMRUxPTkdbXSA9ICIgVElUTEUgdG9vIGxvbmcgIjsKK2NoYXIgSVRFTUxPTkdbXSA9ICIgSVRFTSB0b28gbG9uZyAiOworY2hhciBBQ1RJT05MT05HW10gPSAiIEFDVElPTiB0b28gbG9uZyAiOworY2hhciBTVEFUVVNMT05HW10gPSAiIFNUQVRVUyB0b28gbG9uZyAiOworY2hhciBFTVBUWVNUUltdID0gIiI7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitpbnQgY2FsY192aXNpYmxlKHB0X21lbnUgbWVudSwgaW50IGZpcnN0KTsKK2ludCBuZXh0X3Zpc2libGUocHRfbWVudSBtZW51LCBpbnQgaW5kZXgpOworaW50IHByZXZfdmlzaWJsZShwdF9tZW51IG1lbnUsIGludCBpbmRleCk7CitpbnQgbmV4dF92aXNpYmxlX3NlcChwdF9tZW51IG1lbnUsIGludCBpbmRleCk7CitpbnQgcHJldl92aXNpYmxlX3NlcChwdF9tZW51IG1lbnUsIGludCBpbmRleCk7CitpbnQgY2FsY19maXJzdF9lYXJseShwdF9tZW51IG1lbnUsIGludCBjdXJyKTsKK2ludCBjYWxjX2ZpcnN0X2xhdGUocHRfbWVudSBtZW51LCBpbnQgY3Vycik7CitpbnQgaXN2aXNpYmxlKHB0X21lbnUgbWVudSwgaW50IGZpcnN0LCBpbnQgY3Vycik7CisKKy8qIEJhc2ljIE1lbnUgcm91dGluZXMgKi8KKworLy8gVGhpcyBpcyBzYW1lIGFzIGlucHV0YyBleGNlcHQgaXQgaG9ub3JzIHRoZSBvbnRpbWVvdXQgaGFuZGxlcgorLy8gYW5kIGNhbGxzIGl0IHdoZW4gbmVlZGVkLiBGb3IgdGhlIGNhbGxlZSwgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZQorLy8gYXMgdGhpcyB3aWxsIG5vdCByZXR1cm4gdW5sZXNzIGEga2V5IGhhcyBiZWVuIHByZXNzZWQuCitzdGF0aWMgaW50IGdldGNoKHZvaWQpCit7CisgICAgdF90aW1lb3V0X2hhbmRsZXIgdGg7CisgICAgaW50IGtleTsKKyAgICB1bnNpZ25lZCBsb25nIGk7CisKKyAgICAvLyBXYWl0IHVudGlsIGtleXByZXNzIGlmIG5vIGhhbmRsZXIgc3BlY2lmaWVkCisgICAgaWYgKChtcy0+b250aW1lb3V0ID09IE5VTEwpICYmIChtcy0+b250b3RhbHRpbWVvdXQgPT0gTlVMTCkpCisgICAgICAgIHJldHVybiBnZXRfa2V5KHN0ZGluLCAwKTsKKworICAgIHRoID0gbXMtPm9udGltZW91dDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtcy0+dG1fbnVtc3RlcHM7IGkrKykgeworICAgICAgICAgICAga2V5ID0gZ2V0X2tleShzdGRpbiwgbXMtPnRtX3N0ZXBzaXplKTsKKyAgICAgICAgICAgIGlmIChrZXkgIT0gS0VZX05PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGtleTsKKworICAgICAgICAgICAgaWYgKChtcy0+dG1fdG90YWxfdGltZW91dCA9PSAwKSB8fCAobXMtPm9udG90YWx0aW1lb3V0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIERvbnQgYm90aGVyIHdpdGggY2FsY3VsYXRpb25zIGlmIG5vIGhhbmRsZXIKKyAgICAgICAgICAgIG1zLT50bV9zb2Zhcl90aW1lb3V0ICs9IG1zLT50bV9zdGVwc2l6ZTsKKyAgICAgICAgICAgIGlmIChtcy0+dG1fc29mYXJfdGltZW91dCA+PSBtcy0+dG1fdG90YWxfdGltZW91dCkgeworICAgICAgICAgICAgICAgIHRoID0gbXMtPm9udG90YWx0aW1lb3V0OworICAgICAgICAgICAgICAgIG1zLT50bV9zb2Zhcl90aW1lb3V0ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAvLyBHZXQgb3V0IG9mIHRoZSBmb3IgbG9vcAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdGgpCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgLy8gbm8gaGFuZGxlcgorICAgICAgICBrZXkgPSB0aCgpOworICAgICAgICBzd2l0Y2ggKGtleSkgeworICAgICAgICBjYXNlIENPREVfRU5URVI6ICAgIC8vIFByZXRlbmQgdXNlciBoaXQgZW50ZXIKKyAgICAgICAgICAgIHJldHVybiBLRVlfRU5URVI7CisgICAgICAgIGNhc2UgQ09ERV9FU0NBUEU6ICAgLy8gUHJldGVuZCB1c2VyIGhpdCBlc2NhcGUKKyAgICAgICAgICAgIHJldHVybiBLRVlfRVNDOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEtFWV9OT05FOworfQorCitpbnQgZmluZF9zaG9ydGN1dChwdF9tZW51IG1lbnUsIHVjaGFyIHNob3J0Y3V0LCBpbnQgaW5kZXgpCisvLyBGaW5kIHRoZSBuZXh0IGluZGV4IHdpdGggc3BlY2lmaWVkIHNob3J0Y3V0IGtleQoreworICAgIGludCBhbnM7CisgICAgcHRfbWVudWl0ZW0gbWk7CisKKyAgICAvLyBHYXJiYWdlIGluIGdhcmJhZ2Ugb3V0CisgICAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBtZW51LT5udW1pdGVtcykpCisgICAgcmV0dXJuIGluZGV4OworICAgIGFucyA9IGluZGV4ICsgMTsKKyAgICAvLyBHbyB0aWxsIGVuZCBvZiBtZW51CisgICAgd2hpbGUgKGFucyA8IG1lbnUtPm51bWl0ZW1zKSB7CisgICAgbWkgPSBtZW51LT5pdGVtc1thbnNdOworICAgIGlmICgobWktPmFjdGlvbiA9PSBPUFRfSU5WSVNJQkxFKSB8fCAobWktPmFjdGlvbiA9PSBPUFRfU0VQKQorICAgICAgICB8fCAobWktPnNob3J0Y3V0ICE9IHNob3J0Y3V0KSkKKyAgICAgICAgYW5zKys7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYW5zOworICAgIH0KKyAgICAvLyBTdGFydCBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0cnkgYWdhaW4KKyAgICBhbnMgPSAwOworICAgIHdoaWxlIChhbnMgPCBpbmRleCkgeworICAgIG1pID0gbWVudS0+aXRlbXNbYW5zXTsKKyAgICBpZiAoKG1pLT5hY3Rpb24gPT0gT1BUX0lOVklTSUJMRSkgfHwgKG1pLT5hY3Rpb24gPT0gT1BUX1NFUCkKKyAgICAgICAgfHwgKG1pLT5zaG9ydGN1dCAhPSBzaG9ydGN1dCkpCisgICAgICAgIGFucysrOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGFuczsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4OyAgICAgICAvLyBTb3JyeSBub3QgZm91bmQKK30KKworLyogUmVkcmF3IGJhY2tncm91bmQgYW5kIHRpdGxlICovCitzdGF0aWMgdm9pZCByZXNldF91aSh2b2lkKQoreworICAgIHVjaGFyIHRwb3M7CisKKyAgICBjbHMoKTsKKyAgICBjbGVhcndpbmRvdyhtcy0+bWlucm93LCBtcy0+bWluY29sLCBtcy0+bWF4cm93LCBtcy0+bWF4Y29sLAorICAgICAgICAgICAgICAgIG1zLT5maWxsY2hhciwgbXMtPmZpbGxhdHRyKTsKKworICAgIHRwb3MgPSAobXMtPm51bWNvbHMgLSBzdHJsZW4obXMtPnRpdGxlKSAtIDEpID4+IDE7ICAvLyBjZW50ZXIgaXQgb24gbGluZQorICAgIGdvdG94eShtcy0+bWlucm93LCBtcy0+bWluY29sKTsKKyAgICBjcHJpbnQobXMtPnRmaWxsY2hhciwgbXMtPnRpdGxlYXR0ciwgbXMtPm51bWNvbHMpOworICAgIGdvdG94eShtcy0+bWlucm93LCBtcy0+bWluY29sICsgdHBvcyk7CisgICAgY3NwcmludChtcy0+dGl0bGUsIG1zLT50aXRsZWF0dHIpOworCisgICAgY3Vyc29yb2ZmKCk7Cit9CisKKy8qCisgKiBQcmludCBhIG1lbnUgaXRlbQorICoKKyAqIGF0dHJbMF0gaXMgbm9uLWhpbGl0ZSBhdHRyLCBhdHRyWzFdIGlzIGhpZ2hsaWdodCBhdHRyCisgKi8KK3ZvaWQgcHJpbnRtZW51aXRlbShjb25zdCBjaGFyICpzdHIsIHVjaGFyICogYXR0cikKK3sKKyAgICBpbnQgaGxpdGUgPSBOT0hMSVRFOyAgICAvLyBJbml0aWFsbHkgbm8gaGlnaGxpZ2h0aW5nCisKKyAgICB3aGlsZSAoKnN0cikgeworICAgICAgICBzd2l0Y2ggKCpzdHIpIHsKKyAgICAgICAgICAgIGNhc2UgQkVMTDogICAgICAvLyBObyBCZWxsIENoYXIKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRU5BQkxFSExJVEU6ICAgLy8gU3dpdGNoIG9uIGhpZ2hsaWdodGluZworICAgICAgICAgICAgICAgIGhsaXRlID0gSExJVEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU0FCTEVITElURTogIC8vIFR1cm4gb2ZmIGhpZ2hsaWdodGluZworICAgICAgICAgICAgICAgIGhsaXRlID0gTk9ITElURTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHV0Y2goKnN0ciwgYXR0cltobGl0ZV0pOworICAgICAgICB9CisgICAgICAgIHN0cisrOworICAgIH0KK30KKworCisvKioKKyAqIHByaW50X2xpbmUgLSBQcmludCBhIHdob2xlIGxpbmUgaW4gYSBtZW51CisgKiBAbWVudTogICBjdXJyZW50IG1lbnUgdG8gaGFuZGxlCisgKiBAY3VycjogICBpbmRleCBvZiB0aGUgY3VycmVudCBlbnRyeSBoaWdobGlnaHRlZAorICogQHRvcDogICAgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIEBtZW51CisgKiBAbGVmdDogICBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIEBtZW51CisgKiBAeDogICAgICBpbmRleCBpbiB0aGUgbWVudSBvZiBjdXJyCisgKiBAcm93OiAgICByb3cgY3VycmVudGx5IGRpc3BsYXllZAorICogQHJhZGlvOiAgcmFkaW8gaXRlbT8KKyAqKi8KK3N0YXRpYyB2b2lkIHByaW50X2xpbmUocHRfbWVudSBtZW51LCBpbnQgY3VyciwgdWNoYXIgdG9wLCB1Y2hhciBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHJvdywgYm9vbCByYWRpbykKK3sKKyAgICBwdF9tZW51aXRlbSBjaTsKKyAgICBjaGFyIGZjaGFyWzZdLCBsY2hhcls2XTsgICAgLy8gVGhlIGZpcnN0IGFuZCBsYXN0IGNoYXIgaW4gZm9yIGVhY2ggZW50cnkKKyAgICBjb25zdCBjaGFyICpzdHI7ICAgICAgICAgICAgLy8gSXRlbSBzdHJpbmcgKGNmIHByaW50bWVudWl0ZW0pCisgICAgY2hhciBzZXBbTUVOVUxFTl07ICAgICAgICAgIC8vIFNlcGFyYXRvciAoT1BUX1NFUCkKKyAgICB1Y2hhciAqYXR0cjsgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlCisgICAgaW50IG1lbnV3aWR0aCA9IG1lbnUtPm1lbnV3aWR0aCArIDM7CisKKyAgICBpZiAocm93ID49IG1lbnUtPm1lbnVoZWlnaHQpCisgICAgICAgIHJldHVybjsKKworICAgIGNpID0gbWVudS0+aXRlbXNbeF07CisKKyAgICBtZW1zZXQoc2VwLCBtcy0+Ym94X2hvcml6LCBtZW51d2lkdGgpOworICAgIHNlcFttZW51d2lkdGggLSAxXSA9IDA7CisKKyAgICAvLyBTZXR1cCB0aGUgZGVmYXVsdHMgbm93CisgICAgaWYgKHJhZGlvKSB7CisgICAgICAgIGZjaGFyWzBdID0gJ1xiJzsKKyAgICAgICAgZmNoYXJbMV0gPSBTTzsKKyAgICAgICAgZmNoYXJbMl0gPSAoeCA9PSBjdXJyID8gUkFESU9TRUwgOiBSQURJT1VOU0VMKTsKKyAgICAgICAgZmNoYXJbM10gPSBTSTsKKyAgICAgICAgZmNoYXJbNF0gPSAnXDAnOyAgICAvLyBVbnNlbGVjdGVkICggKQorICAgICAgICBsY2hhclswXSA9ICdcMCc7ICAgIC8vIE5vdGhpbmcgc3BlY2lhbCBhZnRlcgorICAgICAgICBhdHRyID0gbXMtPm5vcm1hbGF0dHI7ICAvLyBBbHdheXMgc2FtZSBhdHRyaWJ1dGUKKyAgICB9IGVsc2UgeworICAgICAgICBsY2hhclswXSA9IGZjaGFyWzBdID0gJyAnOworICAgICAgICBsY2hhclsxXSA9IGZjaGFyWzFdID0gJ1wwJzsgLy8gZmNoYXIgYW5kIGxjaGFyIGFyZSBqdXN0IHNwYWNlcworICAgICAgICBhdHRyID0gKHggPT0gY3VyciA/IG1zLT5yZXZlcnNlYXR0ciA6IG1zLT5ub3JtYWxhdHRyKTsgIC8vIE5vcm1hbCBhdHRyaWJ1dGVzCisgICAgfQorICAgIHN0ciA9IGNpLT5pdGVtOyAgICAgLy8gUG9pbnRlciB0byBpdGVtIHN0cmluZworICAgIHN3aXRjaCAoY2ktPmFjdGlvbikgLy8gc2V0IHVwIGF0dHIsc3RyLGZjaGFyLGxjaGFyIGZvciBldmVyeXRoaW5nCisgICAgeworICAgIGNhc2UgT1BUX0lOQUNUSVZFOgorICAgICAgICBpZiAocmFkaW8pCisgICAgICAgICAgICBhdHRyID0gbXMtPmluYWN0YXR0cjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXR0ciA9ICh4ID09IGN1cnIgPyBtcy0+cmV2aW5hY3RhdHRyIDogbXMtPmluYWN0YXR0cik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUX1NVQk1FTlU6CisgICAgICAgIGlmIChyYWRpbykKKyAgICAgICAgICAgIGJyZWFrOyAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgZm9yIHJhZGlvIG1lbnUKKyAgICAgICAgbGNoYXJbMF0gPSAnPic7CisgICAgICAgIGxjaGFyWzFdID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRfUkFESU9NRU5VOgorICAgICAgICBpZiAocmFkaW8pCisgICAgICAgICAgICBicmVhazsgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGZvciByYWRpbyBtZW51CisgICAgICAgIGxjaGFyWzBdID0gUkFESU9NRU5VQ0hBUjsKKyAgICAgICAgbGNoYXJbMV0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QVF9DSEVDS0JPWDoKKyAgICAgICAgaWYgKHJhZGlvKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgLy8gTm90IHN1cHBvcnRlZCBmb3IgcmFkaW8gbWVudQorICAgICAgICBsY2hhclswXSA9ICdcYic7CisgICAgICAgIGxjaGFyWzFdID0gU087CisgICAgICAgIGxjaGFyWzJdID0gKGNpLT5pdGVtZGF0YS5jaGVja2VkID8gQ0hFQ0tFRCA6IFVOQ0hFQ0tFRCk7CisgICAgICAgIGxjaGFyWzNdID0gU0k7CisgICAgICAgIGxjaGFyWzRdID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRfU0VQOgorICAgICAgICBmY2hhclswXSA9ICdcYic7CisgICAgICAgIGZjaGFyWzFdID0gU087CisgICAgICAgIGZjaGFyWzJdID0gTEVGVF9NSURETEVfQk9SREVSOworICAgICAgICBmY2hhclszXSA9IE1JRERMRV9CT1JERVI7CisgICAgICAgIGZjaGFyWzRdID0gTUlERExFX0JPUkRFUjsKKyAgICAgICAgZmNoYXJbNV0gPSAwOworICAgICAgICBtZW1zZXQoc2VwLCBNSURETEVfQk9SREVSLCBtZW51d2lkdGgpOworICAgICAgICBzZXBbbWVudXdpZHRoIC0gMV0gPSAwOworICAgICAgICBzdHIgPSBzZXA7CisgICAgICAgIGxjaGFyWzBdID0gTUlERExFX0JPUkRFUjsKKyAgICAgICAgbGNoYXJbMV0gPSBSSUdIVF9NSURETEVfQk9SREVSOworICAgICAgICBsY2hhclsyXSA9IFNJOworICAgICAgICBsY2hhclszXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUX0VYSVRNRU5VOgorICAgICAgICBpZiAocmFkaW8pCisgICAgICAgICAgICBicmVhazsgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGZvciByYWRpbyBtZW51CisgICAgICAgIGZjaGFyWzBdID0gJzwnOworICAgICAgICBmY2hhclsxXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAvLyBKdXN0IHRvIGtlZXAgdGhlIGNvbXBpbGVyIGhhcHB5CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFdpcGUgYXJlYSB3aXRoIHNwYWNlcworICAgIGdvdG94eSh0b3AgKyByb3csIGxlZnQgLSAyKTsKKyAgICBjcHJpbnQobXMtPnNwYWNlY2hhciwgYXR0cltOT0hMSVRFXSwgbWVudXdpZHRoICsgMik7CisKKyAgICAvLyBQcmludCBmaXJzdCBwYXJ0CisgICAgZ290b3h5KHRvcCArIHJvdywgbGVmdCAtIDIpOworICAgIGNzcHJpbnQoZmNoYXIsIGF0dHJbTk9ITElURV0pOworCisgICAgLy8gUHJpbnQgbWFpbiBwYXJ0CisgICAgZ290b3h5KHRvcCArIHJvdywgbGVmdCk7CisgICAgcHJpbnRtZW51aXRlbShzdHIsIGF0dHIpOworCisgICAgLy8gUHJpbnQgbGFzdCBwYXJ0CisgICAgZ290b3h5KHRvcCArIHJvdywgbGVmdCArIG1lbnV3aWR0aCAtIDEpOworICAgIGNzcHJpbnQobGNoYXIsIGF0dHJbTk9ITElURV0pOworfQorCisvLyBwcmludCB0aGUgbWVudSBzdGFydGluZyBmcm9tIEZJUlNUCisvLyB3aWxsIHByaW50IGEgbWF4aW11bSBvZiBtZW51LT5tZW51aGVpZ2h0IGl0ZW1zCitzdGF0aWMgdm9pZCBwcmludG1lbnUocHRfbWVudSBtZW51LCBpbnQgY3VyciwgdWNoYXIgdG9wLCB1Y2hhciBsZWZ0LCB1Y2hhciBmaXJzdCwgYm9vbCByYWRpbykKK3sKKyAgICBpbnQgeCwgcm93OyAgICAgICAgIC8vIHggPSBpbmRleCwgcm93ID0gcG9zaXRpb24gZnJvbSB0b3AKKyAgICBpbnQgbnVtaXRlbXMsIG1lbnV3aWR0aDsKKyAgICBwdF9tZW51aXRlbSBjaTsKKworICAgIG51bWl0ZW1zID0gY2FsY192aXNpYmxlKG1lbnUsIGZpcnN0KTsKKyAgICBpZiAobnVtaXRlbXMgPiBtZW51LT5tZW51aGVpZ2h0KQorICAgIG51bWl0ZW1zID0gbWVudS0+bWVudWhlaWdodDsKKworICAgIG1lbnV3aWR0aCA9IG1lbnUtPm1lbnV3aWR0aCArIDM7CisgICAgY2xlYXJ3aW5kb3codG9wLCBsZWZ0IC0gMiwgdG9wICsgbnVtaXRlbXMgKyAxLCBsZWZ0ICsgbWVudXdpZHRoICsgMSwKKyAgICAgICAgbXMtPmZpbGxjaGFyLCBtcy0+c2hhZG93YXR0cik7CisgICAgZHJhd2JveCh0b3AgLSAxLCBsZWZ0IC0gMywgdG9wICsgbnVtaXRlbXMsIGxlZnQgKyBtZW51d2lkdGgsCisgICAgICAgIG1zLT5ub3JtYWxhdHRyW05PSExJVEVdKTsKKworICAgIC8vIE1lbnUgdGl0bGUKKyAgICB4ID0gKG1lbnV3aWR0aCAtIHN0cmxlbihtZW51LT50aXRsZSkgLSAxKSA+PiAxOworICAgIGdvdG94eSh0b3AgLSAxLCBsZWZ0ICsgeCk7CisgICAgcHJpbnRtZW51aXRlbShtZW51LT50aXRsZSwgbXMtPm5vcm1hbGF0dHIpOworCisgICAgLy8gQWxsIGxpbmVzIGluIHRoZSBtZW51CisgICAgcm93ID0gLTE7ICAgICAgICAgICAvLyAxIGxlc3MgdGhhbiBpbml0YWwgdmFsdWUgb2YgeAorICAgIGZvciAoeCA9IGZpcnN0OyB4IDwgbWVudS0+bnVtaXRlbXM7IHgrKykgeworICAgICAgICBjaSA9IG1lbnUtPml0ZW1zW3hdOworICAgICAgICBpZiAoY2ktPmFjdGlvbiA9PSBPUFRfSU5WSVNJQkxFKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJvdysrOworICAgICAgICBpZiAocm93ID49IG51bWl0ZW1zKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgLy8gQWxyZWFkeSBoYXZlIGVub3VnaCBudW1iZXIgb2YgaXRlbXMKKyAgICAgICAgcHJpbnRfbGluZShtZW51LCBjdXJyLCB0b3AsIGxlZnQsIHgsIHJvdywgcmFkaW8pOworICAgIH0KKyAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIE1PUkVBQk9WRSBhbmQgTU9SRUJFTE9XIHRvIGJlIGFkZGVkCisgICAgLy8gcmV1c2UgeAorICAgIHJvdyA9IDA7CisgICAgeCA9IG5leHRfdmlzaWJsZV9zZXAobWVudSwgMCk7ICAvLyBGaXJzdCBpdGVtCisgICAgaWYgKCFpc3Zpc2libGUobWVudSwgZmlyc3QsIHgpKSAvLyBUaGVyZSBpcyBtb3JlIGFib3ZlCisgICAgeworICAgIHJvdyA9IDE7CisgICAgZ290b3h5KHRvcCwgbGVmdCArIG1lbnV3aWR0aCk7CisgICAgY3ByaW50KE1PUkVBQk9WRSwgbXMtPm5vcm1hbGF0dHJbTk9ITElURV0sIDEpOworICAgIH0KKyAgICB4ID0gcHJldl92aXNpYmxlX3NlcChtZW51LCBtZW51LT5udW1pdGVtcyk7IC8vIGxhc3QgaXRlbQorICAgIGlmICghaXN2aXNpYmxlKG1lbnUsIGZpcnN0LCB4KSkgLy8gVGhlcmUgaXMgbW9yZSBhYm92ZQorICAgIHsKKyAgICByb3cgPSAxOworICAgIGdvdG94eSh0b3AgKyBudW1pdGVtcyAtIDEsIGxlZnQgKyBtZW51d2lkdGgpOworICAgIGNwcmludChNT1JFQkVMT1csIG1zLT5ub3JtYWxhdHRyW05PSExJVEVdLCAxKTsKKyAgICB9CisgICAgLy8gQWRkIGEgc2Nyb2xsIGJveAorICAgIHggPSAoKG51bWl0ZW1zIC0gMSkgKiBjdXJyKSAvIChtZW51LT5udW1pdGVtcyk7CisgICAgaWYgKCh4ID4gMCkgJiYgKHJvdyA9PSAxKSkgeworICAgIGdvdG94eSh0b3AgKyB4LCBsZWZ0ICsgbWVudXdpZHRoKTsKKyAgICBjc3ByaW50KCJcMDE2XDE0MVwwMTciLCBtcy0+bm9ybWFsYXR0cltOT0hMSVRFXSk7CisgICAgfQorICAgIGlmIChtcy0+aGFuZGxlcikKKyAgICBtcy0+aGFuZGxlcihtcywgbWVudS0+aXRlbXNbY3Vycl0pOworfQorCit2b2lkIGNsZWFudXBtZW51KHB0X21lbnUgbWVudSwgdWNoYXIgdG9wLCB1Y2hhciBsZWZ0LCBpbnQgbnVtaXRlbXMpCit7CisgICAgaWYgKG51bWl0ZW1zID4gbWVudS0+bWVudWhlaWdodCkKKyAgICBudW1pdGVtcyA9IG1lbnUtPm1lbnVoZWlnaHQ7CisgICAgY2xlYXJ3aW5kb3codG9wLCBsZWZ0IC0gMiwgdG9wICsgbnVtaXRlbXMgKyAxLCBsZWZ0ICsgbWVudS0+bWVudXdpZHRoICsgNCwgbXMtPmZpbGxjaGFyLCBtcy0+ZmlsbGF0dHIpOyAvLyBDbGVhciB0aGUgc2hhZG93CisgICAgY2xlYXJ3aW5kb3codG9wIC0gMSwgbGVmdCAtIDMsIHRvcCArIG51bWl0ZW1zLCBsZWZ0ICsgbWVudS0+bWVudXdpZHRoICsgMywgbXMtPmZpbGxjaGFyLCBtcy0+ZmlsbGF0dHIpOyAvLyBtYWluIHdpbmRvdworfQorCisKKy8qIEhhbmRsZSBvbmUgbWVudSAqLworc3RhdGljIHB0X21lbnVpdGVtIGdldG1lbnVvcHRpb24ocHRfbWVudSBtZW51LCB1Y2hhciB0b3AsIHVjaGFyIGxlZnQsIHVjaGFyIHN0YXJ0b3B0LCBib29sIHJhZGlvKQorICAgICAvLyBSZXR1cm4gaXRlbSBjaG9zZW4gb3IgTlVMTCBpZiBFU0Mgd2FzIGhpdC4KK3sKKyAgICBpbnQgcHJldiwgcHJldl9maXJzdCwgY3VyciwgaSwgZmlyc3QsIHRtcDsKKyAgICBpbnQgYXNjID0gMDsKKyAgICBib29sIHJlZHJhdyA9IHRydWU7IC8vIE5lZWQgdG8gZHJhdyB0aGUgbWVudSB0aGUgZmlyc3QgdGltZQorICAgIHVjaGFyIG51bWl0ZW1zOworICAgIHB0X21lbnVpdGVtIGNpOyAgICAgLy8gQ3VycmVudCBpdGVtCisgICAgdF9oYW5kbGVyX3JldHVybiBocjsgICAgLy8gUmV0dXJuIHZhbHVlIG9mIGhhbmRsZXIKKworICAgIG51bWl0ZW1zID0gY2FsY192aXNpYmxlKG1lbnUsIDApOworICAgIC8vIFNldHVwIHN0YXR1cyBsaW5lCisgICAgZ290b3h5KG1zLT5taW5yb3cgKyBtcy0+c3RhdGxpbmUsIG1zLT5taW5jb2wpOworICAgIGNwcmludChtcy0+c3BhY2VjaGFyLCBtcy0+c3RhdHVzYXR0cltOT0hMSVRFXSwgbXMtPm51bWNvbHMpOworCisgICAgLy8gSW5pdGlhbGlzZSBjdXJyZW50IG1lbnUgaXRlbQorICAgIGN1cnIgPSBuZXh0X3Zpc2libGUobWVudSwgc3RhcnRvcHQpOworICAgIHByZXYgPSBjdXJyOworCisgICAgZ290b3h5KG1zLT5taW5yb3cgKyBtcy0+c3RhdGxpbmUsIG1zLT5taW5jb2wpOworICAgIGNwcmludChtcy0+c3BhY2VjaGFyLCBtcy0+c3RhdHVzYXR0cltOT0hMSVRFXSwgbXMtPm51bWNvbHMpOworICAgIGdvdG94eShtcy0+bWlucm93ICsgbXMtPnN0YXRsaW5lLCBtcy0+bWluY29sKTsKKyAgICBwcmludG1lbnVpdGVtKG1lbnUtPml0ZW1zW2N1cnJdLT5zdGF0dXMsIG1zLT5zdGF0dXNhdHRyKTsKKyAgICBmaXJzdCA9IGNhbGNfZmlyc3RfZWFybHkobWVudSwgY3Vycik7CisgICAgcHJldl9maXJzdCA9IGZpcnN0OworICAgIHdoaWxlICgxKSAgICAgICAgICAgLy8gRm9yZXZlcgorICAgIHsKKyAgICAvKiBSZWRyYXcgZXZlcnl0aGluZyBpZjoKKyAgICAgKiAgKyB3ZSBuZWVkIHRvIHNjcm9sbCAodGFrZSBjYXJlIG9mIHNjcm9sbCBiYXJzLCAuLi4pCisgICAgICogICsgbWVudW9wdGlvbgorICAgICAqLworICAgIGlmIChwcmV2X2ZpcnN0ICE9IGZpcnN0IHx8IHJlZHJhdykgeworICAgICAgICBwcmludG1lbnUobWVudSwgY3VyciwgdG9wLCBsZWZ0LCBmaXJzdCwgcmFkaW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFJlZHJhdyBvbmx5IHRoZSBoaWdobGlnaHRlZCBlbnRyeSAqLworICAgICAgICBwcmludF9saW5lKG1lbnUsIGN1cnIsIHRvcCwgbGVmdCwgcHJldiwgcHJldiAtIGZpcnN0LCByYWRpbyk7CisgICAgICAgIHByaW50X2xpbmUobWVudSwgY3VyciwgdG9wLCBsZWZ0LCBjdXJyLCBjdXJyIC0gZmlyc3QsIHJhZGlvKTsKKyAgICB9CisgICAgcmVkcmF3ID0gZmFsc2U7CisgICAgcHJldiA9IGN1cnI7CisgICAgcHJldl9maXJzdCA9IGZpcnN0OworICAgIGNpID0gbWVudS0+aXRlbXNbY3Vycl07CisgICAgYXNjID0gZ2V0Y2goKTsKKyAgICBzd2l0Y2ggKGFzYykgeworICAgICAgICBjYXNlIEtFWV9DVFJMKCdMJyk6CisgICAgICAgIHJlZHJhdyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZX0hPTUU6CisgICAgICAgIGN1cnIgPSBuZXh0X3Zpc2libGUobWVudSwgMCk7CisgICAgICAgIGZpcnN0ID0gY2FsY19maXJzdF9lYXJseShtZW51LCBjdXJyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlfRU5EOgorICAgICAgICBjdXJyID0gcHJldl92aXNpYmxlKG1lbnUsIG51bWl0ZW1zIC0gMSk7CisgICAgICAgIGZpcnN0ID0gY2FsY19maXJzdF9sYXRlKG1lbnUsIGN1cnIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtFWV9QR0ROOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICBjdXJyID0gbmV4dF92aXNpYmxlKG1lbnUsIGN1cnIgKyAxKTsKKyAgICAgICAgZmlyc3QgPSBjYWxjX2ZpcnN0X2xhdGUobWVudSwgY3Vycik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZX1BHVVA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgICAgIGN1cnIgPSBwcmV2X3Zpc2libGUobWVudSwgY3VyciAtIDEpOworICAgICAgICBmaXJzdCA9IGNhbGNfZmlyc3RfZWFybHkobWVudSwgY3Vycik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZX1VQOgorICAgICAgICBjdXJyID0gcHJldl92aXNpYmxlKG1lbnUsIGN1cnIgLSAxKTsKKyAgICAgICAgaWYgKGN1cnIgPCBmaXJzdCkKKyAgICAgICAgZmlyc3QgPSBjYWxjX2ZpcnN0X2Vhcmx5KG1lbnUsIGN1cnIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtFWV9ET1dOOgorICAgICAgICBjdXJyID0gbmV4dF92aXNpYmxlKG1lbnUsIGN1cnIgKyAxKTsKKyAgICAgICAgaWYgKCFpc3Zpc2libGUobWVudSwgZmlyc3QsIGN1cnIpKQorICAgICAgICBmaXJzdCA9IGNhbGNfZmlyc3RfbGF0ZShtZW51LCBjdXJyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlfTEVGVDoKKyAgICBjYXNlIEtFWV9FU0M6CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtFWV9SSUdIVDoKKyAgICBjYXNlIEtFWV9FTlRFUjoKKyAgICAgICAgaWYgKGNpLT5hY3Rpb24gPT0gT1BUX0lOQUNUSVZFKQorICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGNpLT5hY3Rpb24gPT0gT1BUX0NIRUNLQk9YKQorICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGNpLT5hY3Rpb24gPT0gT1BUX1NFUCkKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjaS0+YWN0aW9uID09IE9QVF9FWElUTUVOVSkKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgIC8vIEFzIGlmIHdlIGhpdCBFc2MKKyAgICAgICAgLy8gSWYgd2UgYXJlIGdvaW5nIGludG8gYSByYWRpbyBtZW51LCBkb250IGNhbGwgaGFuZGxlciwgcmV0dXJuIGNpCisgICAgICAgIGlmIChjaS0+YWN0aW9uID09IE9QVF9SQURJT01FTlUpCisgICAgICAgIHJldHVybiBjaTsKKyAgICAgICAgaWYgKGNpLT5oYW5kbGVyICE9IE5VTEwpICAgIC8vIERvIHdlIGhhdmUgYSBoYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgaHIgPSBjaS0+aGFuZGxlcihtcywgY2kpOworICAgICAgICBpZiAoaHIucmVmcmVzaCkgLy8gRG8gd2UgbmVlZCB0byByZWZyZXNoCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENsZWFudXAgbWVudSB1c2luZyBvbGQgbnVtYmVyIG9mIGl0ZW1zCisgICAgICAgICAgICBjbGVhbnVwbWVudShtZW51LCB0b3AsIGxlZnQsIG51bWl0ZW1zKTsKKyAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgaXRlbXMKKyAgICAgICAgICAgIG51bWl0ZW1zID0gY2FsY192aXNpYmxlKG1lbnUsIDApOworICAgICAgICAgICAgLy8gUmVwcmludCB0aGUgbWVudQorICAgICAgICAgICAgcHJpbnRtZW51KG1lbnUsIGN1cnIsIHRvcCwgbGVmdCwgZmlyc3QsIHJhZGlvKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaHIudmFsaWQpCisgICAgICAgICAgICByZXR1cm4gY2k7CisgICAgICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gY2k7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1BBQ0VDSEFSOgorICAgICAgICBpZiAoY2ktPmFjdGlvbiAhPSBPUFRfQ0hFQ0tCT1gpCisgICAgICAgIGJyZWFrOworICAgICAgICBjaS0+aXRlbWRhdGEuY2hlY2tlZCA9ICFjaS0+aXRlbWRhdGEuY2hlY2tlZDsKKyAgICAgICAgaWYgKGNpLT5oYW5kbGVyICE9IE5VTEwpICAgIC8vIERvIHdlIGhhdmUgYSBoYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgaHIgPSBjaS0+aGFuZGxlcihtcywgY2kpOworICAgICAgICBpZiAoaHIucmVmcmVzaCkgLy8gRG8gd2UgbmVlZCB0byByZWZyZXNoCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENsZWFudXAgbWVudSB1c2luZyBvbGQgbnVtYmVyIG9mIGl0ZW1zCisgICAgICAgICAgICBjbGVhbnVwbWVudShtZW51LCB0b3AsIGxlZnQsIG51bWl0ZW1zKTsKKyAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgaXRlbXMKKyAgICAgICAgICAgIG51bWl0ZW1zID0gY2FsY192aXNpYmxlKG1lbnUsIDApOworICAgICAgICAgICAgLy8gUmVwcmludCB0aGUgbWVudQorICAgICAgICAgICAgcHJpbnRtZW51KG1lbnUsIGN1cnIsIHRvcCwgbGVmdCwgZmlyc3QsIHJhZGlvKTsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBzaG9ydGN1dCBrZXkKKyAgICAgICAgaWYgKCgoYXNjID49ICdBJykgJiYgKGFzYyA8PSAnWicpKSB8fAorICAgICAgICAoKGFzYyA+PSAnYScpICYmIChhc2MgPD0gJ3onKSkgfHwKKyAgICAgICAgKChhc2MgPj0gJzAnKSAmJiAoYXNjIDw9ICc5JykpKSB7CisgICAgICAgIHRtcCA9IGZpbmRfc2hvcnRjdXQobWVudSwgYXNjLCBjdXJyKTsKKyAgICAgICAgaWYgKCh0bXAgPiBjdXJyKSAmJiAoIWlzdmlzaWJsZShtZW51LCBmaXJzdCwgdG1wKSkpCisgICAgICAgICAgICBmaXJzdCA9IGNhbGNfZmlyc3RfbGF0ZShtZW51LCB0bXApOworICAgICAgICBpZiAodG1wIDwgY3VycikKKyAgICAgICAgICAgIGZpcnN0ID0gY2FsY19maXJzdF9lYXJseShtZW51LCB0bXApOworICAgICAgICBjdXJyID0gdG1wOworICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobXMtPmtleXNfaGFuZGxlcikgICAvLyBDYWxsIGV4dHJhIGtleXMgaGFuZGxlcgorICAgICAgICAgICAgbXMtPmtleXNfaGFuZGxlcihtcywgbWVudS0+aXRlbXNbY3Vycl0sIGFzYyk7CisKKyAgICAgICAgICAgIC8qIFRoZSBoYW5kbGVyIG1heSBoYXZlIGNoYW5nZWQgdGhlIFVJLCByZXNldCBpdCBvbiBleGl0ICovCisgICAgICAgICAgICByZXNldF91aSgpOworICAgICAgICAgICAgLy8gQ2xlYW51cCBtZW51IHVzaW5nIG9sZCBudW1iZXIgb2YgaXRlbXMKKyAgICAgICAgICAgIGNsZWFudXBtZW51KG1lbnUsIHRvcCwgbGVmdCwgbnVtaXRlbXMpOworICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBpdGVtcworICAgICAgICAgICAgbnVtaXRlbXMgPSBjYWxjX3Zpc2libGUobWVudSwgMCk7CisgICAgICAgICAgICAvLyBSZXByaW50IHRoZSBtZW51CisgICAgICAgICAgICBwcmludG1lbnUobWVudSwgY3VyciwgdG9wLCBsZWZ0LCBmaXJzdCwgcmFkaW8pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBVcGRhdGUgc3RhdHVzIGxpbmUKKyAgICAvKiBFcmFzZSB0aGUgcHJldmlvdXMgc3RhdHVzICovCisgICAgZ290b3h5KG1zLT5taW5yb3cgKyBtcy0+c3RhdGxpbmUsIG1zLT5taW5jb2wpOworICAgIGNwcmludChtcy0+c3BhY2VjaGFyLCBtcy0+c3RhdHVzYXR0cltOT0hMSVRFXSwgbXMtPm51bWNvbHMpOworICAgIC8qIFByaW50IHRoZSBuZXcgc3RhdHVzICovCisgICAgZ290b3h5KG1zLT5taW5yb3cgKyBtcy0+c3RhdGxpbmUsIG1zLT5taW5jb2wpOworICAgIHByaW50bWVudWl0ZW0obWVudS0+aXRlbXNbY3Vycl0tPnN0YXR1cywgbXMtPnN0YXR1c2F0dHIpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsgICAgICAgIC8vIFNob3VsZCBuZXZlciBjb21lIGhlcmUKK30KKworLyogSGFuZGxlIHRoZSBlbnRpcmUgc3lzdGVtIG9mIG1lbnUncy4gKi8KK3B0X21lbnVpdGVtIHJ1bm1lbnVzeXN0ZW0odWNoYXIgdG9wLCB1Y2hhciBsZWZ0LCBwdF9tZW51IGNtZW51LCB1Y2hhciBzdGFydG9wdCwKKyAgICAgICAgICAgICAgdWNoYXIgbWVudXR5cGUpCisgICAgIC8qCisgICAgICAqIGNtZW51CisgICAgICAqICAgIFdoaWNoIG1lbnUgc2hvdWxkIGJlIGN1cnJlbnRseSBkaXNwbGF5ZWQKKyAgICAgICogdG9wLGxlZnQKKyAgICAgICogICAgV2hhdCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCxsZWZ0IGNvcm5lciBvZiB0aGUgbWVudQorICAgICAgKiBzdGFydG9wdAorICAgICAgKiAgICB3aGljaCBtZW51IGl0ZW0gZG8gSSBzdGFydCB3aXRoCisgICAgICAqIG1lbnV0eXBlCisgICAgICAqICAgIE5PUk1BTE1FTlUgb3IgUkFESU9NRU5VCisgICAgICAqCisgICAgICAqIFJldHVybiBWYWx1ZToKKyAgICAgICogICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpbmFsIGl0ZW0gY2hvc2VuLCBvciBOVUxMIGlmIG5vdGhpbmcgY2hvc2VuLgorICAgICAgKi8KK3sKKyAgICBwdF9tZW51aXRlbSBvcHQsIGNob2ljZTsKKyAgICB1Y2hhciBzdGFydGF0LCBtdDsKKyAgICB1Y2hhciByb3csIGNvbDsKKworICAgIGlmIChjbWVudSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCitzdGFydG92ZXI6CisgICAgLy8gU2V0IHRoZSBtZW51IGhlaWdodAorICAgIGNtZW51LT5tZW51aGVpZ2h0ID0gbXMtPm1heHJvdyAtIHRvcCAtIDM7CisgICAgaWYgKGNtZW51LT5tZW51aGVpZ2h0ID4gbXMtPm1heG1lbnVoZWlnaHQpCisgICAgY21lbnUtPm1lbnVoZWlnaHQgPSBtcy0+bWF4bWVudWhlaWdodDsKKyAgICBpZiAobWVudXR5cGUgPT0gTk9STUFMTUVOVSkKKyAgICBvcHQgPSBnZXRtZW51b3B0aW9uKGNtZW51LCB0b3AsIGxlZnQsIHN0YXJ0b3B0LCBmYWxzZSk7CisgICAgZWxzZSAgICAgICAgICAgIC8vIG1lbnV0eXBlID09IFJBRElPTUVOVQorICAgIG9wdCA9IGdldG1lbnVvcHRpb24oY21lbnUsIHRvcCwgbGVmdCwgc3RhcnRvcHQsIHRydWUpOworCisgICAgaWYgKG9wdCA9PSBOVUxMKSB7CisgICAgLy8gVXNlciBoaXQgRXNjCisgICAgY2xlYW51cG1lbnUoY21lbnUsIHRvcCwgbGVmdCwgY2FsY192aXNpYmxlKGNtZW51LCAwKSk7CisgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIEFyZSB3ZSBkb25lIHdpdGggdGhlIG1lbnUgc3lzdGVtPworICAgIGlmICgob3B0LT5hY3Rpb24gIT0gT1BUX1NVQk1FTlUpICYmIChvcHQtPmFjdGlvbiAhPSBPUFRfUkFESU9NRU5VKSkgeworICAgIGNsZWFudXBtZW51KGNtZW51LCB0b3AsIGxlZnQsIGNhbGNfdmlzaWJsZShjbWVudSwgMCkpOworICAgIHJldHVybiBvcHQ7ICAgICAvLyBwYXJlbnQgY2xlYW51cCBvdGhlciBtZW51cworICAgIH0KKyAgICAvLyBFaXRoZXIgcmFkaW9tZW51IG9yIHN1Ym1lbnUKKyAgICAvLyBEbyB3ZSBoYXZlIGEgdmFsaWQgbWVudSBudW1iZXI/IFRoZSBuZXh0IGhhY2sgdXNlcyB0aGUgZmFjdCB0aGF0CisgICAgLy8gaXRlbWRhdGEuc3VibWVudW51bSA9IGl0ZW1kYXRhLnJhZGlvbWVudW51bSAoc2luY2UgZW51bSBkYXRhIHR5cGUpCisgICAgaWYgKG9wdC0+aXRlbWRhdGEuc3VibWVudW51bSA+PSBtcy0+bnVtbWVudXMpICAgLy8gVGhpcyBpcyBCYWQuLi4uCisgICAgeworICAgIGdvdG94eSgxMiwgMTIpOyAvLyBNaWRkbGUgb2Ygc2NyZWVuCisgICAgY3NwcmludCgiRVJST1I6IEludmFsaWQgc3VibWVudSByZXF1ZXN0ZWQuIiwgMHgwNyk7CisgICAgY2xlYW51cG1lbnUoY21lbnUsIHRvcCwgbGVmdCwgY2FsY192aXNpYmxlKGNtZW51LCAwKSk7CisgICAgcmV0dXJuIE5VTEw7ICAgICAgICAvLyBQcmV0ZW5kIHVzZXIgaGl0IGVzYworICAgIH0KKyAgICAvLyBDYWxsIHJlY3Vyc2l2ZWx5IGZvciBzdWJtZW51CisgICAgLy8gUG9zaXRpb24gdGhlIHN1Ym1lbnUgYmVsb3cgdGhlIGN1cnJlbnQgaXRlbSwKKyAgICAvLyBjb3ZlcmluZyBoYWxmIHRoZSBjdXJyZW50IHdpbmRvdyAoaG9yaXpvbnRhbGx5KQorICAgIHJvdyA9IG1zLT5tZW51c1sodW5zaWduZWQgaW50KW9wdC0+aXRlbWRhdGEuc3VibWVudW51bV0tPnJvdzsKKyAgICBjb2wgPSBtcy0+bWVudXNbKHVuc2lnbmVkIGludClvcHQtPml0ZW1kYXRhLnN1Ym1lbnVudW1dLT5jb2w7CisgICAgaWYgKHJvdyA9PSAweEZGKQorICAgIHJvdyA9IHRvcCArIG9wdC0+aW5kZXggKyAyOworICAgIGlmIChjb2wgPT0gMHhGRikKKyAgICBjb2wgPSBsZWZ0ICsgMyArIChjbWVudS0+bWVudXdpZHRoID4+IDEpOworICAgIG10ID0gKG9wdC0+YWN0aW9uID09IE9QVF9TVUJNRU5VID8gTk9STUFMTUVOVSA6IFJBRElPTUVOVSk7CisgICAgc3RhcnRhdCA9IDA7CisgICAgaWYgKChvcHQtPmFjdGlvbiA9PSBPUFRfUkFESU9NRU5VKSAmJiAob3B0LT5kYXRhICE9IE5VTEwpKQorICAgIHN0YXJ0YXQgPSAoKHRfbWVudWl0ZW0gKikgb3B0LT5kYXRhKS0+aW5kZXg7CisKKyAgICBjaG9pY2UgPSBydW5tZW51c3lzdGVtKHJvdywgY29sLAorICAgICAgICAgICAgICAgbXMtPm1lbnVzWyh1bnNpZ25lZCBpbnQpb3B0LT5pdGVtZGF0YS5zdWJtZW51bnVtXSwKKyAgICAgICAgICAgICAgIHN0YXJ0YXQsIG10KTsKKyAgICBpZiAob3B0LT5hY3Rpb24gPT0gT1BUX1JBRElPTUVOVSkgeworICAgIGlmIChjaG9pY2UgIT0gTlVMTCkKKyAgICAgICAgb3B0LT5kYXRhID0gKHZvaWQgKiljaG9pY2U7IC8vIHN0b3JlIGNob2ljZSBpbiBkYXRhIGZpZWxkCisgICAgaWYgKG9wdC0+aGFuZGxlciAhPSBOVUxMKQorICAgICAgICBvcHQtPmhhbmRsZXIobXMsIG9wdCk7CisgICAgY2hvaWNlID0gTlVMTDsgICAgICAvLyBQcmV0ZW5kIHVzZXIgaGl0IGVzYworICAgIH0KKyAgICBpZiAoY2hvaWNlID09IE5VTEwpICAgICAvLyBVc2VyIGhpdCBFc2MgaW4gc3VibWVudQorICAgIHsKKyAgICAvLyBTdGFydG92ZXIKKyAgICBzdGFydG9wdCA9IG9wdC0+aW5kZXg7CisgICAgZ290byBzdGFydG92ZXI7CisgICAgfSBlbHNlIHsKKyAgICBjbGVhbnVwbWVudShjbWVudSwgdG9wLCBsZWZ0LCBjYWxjX3Zpc2libGUoY21lbnUsIDApKTsKKyAgICByZXR1cm4gY2hvaWNlOworICAgIH0KK30KKworLy8gRmluZHMgdGhlIGluZGV4b2YgdGhlIG1lbnUgd2l0aCBnaXZlbiBuYW1lCit1Y2hhciBmaW5kX21lbnVfbnVtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGk7CisgICAgcHRfbWVudSBtOworCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gKHVjaGFyKSAoLTEpOworICAgIGZvciAoaSA9IDA7IGkgPCBtcy0+bnVtbWVudXM7IGkrKykgeworICAgIG0gPSBtcy0+bWVudXNbaV07CisgICAgaWYgKChtLT5uYW1lKSAmJiAoc3RyY21wKG0tPm5hbWUsIG5hbWUpID09IDApKQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuICh1Y2hhcikgKC0xKTsKK30KKworLy8gUnVuIHRocm91Z2ggYWxsIGl0ZW1zIGFuZCBpZiB0aGV5IGFyZSBzdWJtZW51cworLy8gd2l0aCBhIG5vbi10cml2aWFsICJhY3Rpb24iIGFuZCB0cml2aWFsIHN1Ym1lbnVudW0KKy8vIHJlcGxhY2Ugc3VibWVudW51bSB3aXRoIHRoZSBtZW51IHdpdGggbmFtZSAiYWN0aW9uIgordm9pZCBmaXhfc3VibWVudXModm9pZCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBwdF9tZW51IG07CisgICAgcHRfbWVudWl0ZW0gbWk7CisKKyAgICBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXMtPm51bW1lbnVzOyBpKyspIHsKKyAgICBtID0gbXMtPm1lbnVzW2ldOworICAgIGZvciAoaiA9IDA7IGogPCBtLT5udW1pdGVtczsgaisrKSB7CisgICAgICAgIG1pID0gbS0+aXRlbXNbal07CisgICAgICAgIC8vIGlmIGl0ZW0gaXMgYSBzdWJtZW51IGFuZCBoYXMgbm9uLWVtcHR5IG5vbi10cml2aWFsIGRhdGEgc3RyaW5nCisgICAgICAgIGlmIChtaS0+ZGF0YSAmJiBzdHJsZW4obWktPmRhdGEpID4gMCAmJgorICAgICAgICAoKG1pLT5hY3Rpb24gPT0gT1BUX1NVQk1FTlUpCisgICAgICAgICB8fCAobWktPmFjdGlvbiA9PSBPUFRfUkFESU9NRU5VKSkpIHsKKyAgICAgICAgbWktPml0ZW1kYXRhLnN1Ym1lbnVudW0gPSBmaW5kX21lbnVfbnVtKG1pLT5kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9Cit9CisKKy8qIFVzZXIgQ2FsbGFibGUgZnVuY3Rpb25zICovCisKK3B0X21lbnVpdGVtIHNob3dtZW51cyh1Y2hhciBzdGFydG1lbnUpCit7CisgICAgcHRfbWVudWl0ZW0gcnY7CisKKyAgICBmaXhfc3VibWVudXMoKTsgICAgIC8vIEZpeCBzdWJtZW51IG51bWJlcnMgaW5jYXNlIG5pY2sgbmFtZXMgd2VyZSB1c2VkCisKKyAgICAvKiBUdXJuIGF1dG93cmFwIG9mZiwgdG8gYXZvaWQgc2Nyb2xsaW5nIHRoZSBtZW51ICovCisgICAgcHJpbnRmKENTSSAiPzdsIik7CisKKyAgICAvLyBTZXR1cCBzY3JlZW4gZm9yIG1lbnVzeXN0ZW0KKyAgICByZXNldF91aSgpOworCisgICAgLy8gR28sIG1haW4gbWVudSBjYW5ub3QgYmUgYSByYWRpbyBtZW51CisgICAgcnYgPSBydW5tZW51c3lzdGVtKG1zLT5taW5yb3cgKyBNRU5VUk9XLCBtcy0+bWluY29sICsgTUVOVUNPTCwKKyAgICAgICAgICAgICAgIG1zLT5tZW51c1sodW5zaWduZWQgaW50KXN0YXJ0bWVudV0sIDAsIE5PUk1BTE1FTlUpOworCisgICAgLy8gSGlkZSB0aGUgZ2FyYmFnZSB3ZSBsZWZ0IG9uIHRoZSBzY3JlZW4KKyAgICBjbHMoKTsKKyAgICBnb3RveHkobXMtPm1pbnJvdywgbXMtPm1pbmNvbCk7CisgICAgY3Vyc29yb24oKTsKKworICAgIC8vIFJldHVybiB1c2VyIGNob2ljZQorICAgIHJldHVybiBydjsKK30KKworcHRfbWVudXN5c3RlbSBpbml0X21lbnVzeXN0ZW0oY29uc3QgY2hhciAqdGl0bGUpCit7CisgICAgaW50IGk7CisKKyAgICBtcyA9IE5VTEw7CisgICAgbXMgPSAocHRfbWVudXN5c3RlbSkgbWFsbG9jKHNpemVvZih0X21lbnVzeXN0ZW0pKTsKKyAgICBpZiAobXMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgICBtcy0+bnVtbWVudXMgPSAwOworICAgIC8vIEluaXRpYWxpc2UgYWxsIG1lbnUgcG9pbnRlcnMKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYTUVOVVM7IGkrKykKKyAgICBtcy0+bWVudXNbaV0gPSBOVUxMOworCisgICAgbXMtPnRpdGxlID0gKGNoYXIgKiltYWxsb2MoVElUTEVMRU4gKyAxKTsKKyAgICBpZiAodGl0bGUgPT0gTlVMTCkKKyAgICBzdHJjcHkobXMtPnRpdGxlLCBUSVRMRVNUUik7ICAgIC8vIENvcHkgc3RyaW5nCisgICAgZWxzZQorICAgIHN0cmNweShtcy0+dGl0bGUsIHRpdGxlKTsKKworICAgIC8vIFRpbWVvdXQgc2V0dGluZ3MKKyAgICBtcy0+dG1fc3RlcHNpemUgPSBUSU1FT1VUU1RFUFNJWkU7CisgICAgbXMtPnRtX251bXN0ZXBzID0gVElNRU9VVE5VTVNURVBTOworCisgICAgbXMtPm5vcm1hbGF0dHJbTk9ITElURV0gPSBOT1JNQUxBVFRSOworICAgIG1zLT5ub3JtYWxhdHRyW0hMSVRFXSA9IE5PUk1BTEhMSVRFOworCisgICAgbXMtPnJldmVyc2VhdHRyW05PSExJVEVdID0gUkVWRVJTRUFUVFI7CisgICAgbXMtPnJldmVyc2VhdHRyW0hMSVRFXSA9IFJFVkVSU0VITElURTsKKworICAgIG1zLT5pbmFjdGF0dHJbTk9ITElURV0gPSBJTkFDVEFUVFI7CisgICAgbXMtPmluYWN0YXR0cltITElURV0gPSBJTkFDVEhMSVRFOworCisgICAgbXMtPnJldmluYWN0YXR0cltOT0hMSVRFXSA9IFJFVklOQUNUQVRUUjsKKyAgICBtcy0+cmV2aW5hY3RhdHRyW0hMSVRFXSA9IFJFVklOQUNUSExJVEU7CisKKyAgICBtcy0+c3RhdHVzYXR0cltOT0hMSVRFXSA9IFNUQVRVU0FUVFI7CisgICAgbXMtPnN0YXR1c2F0dHJbSExJVEVdID0gU1RBVFVTSExJVEU7CisKKyAgICBtcy0+c3RhdGxpbmUgPSBTVEFUTElORTsKKyAgICBtcy0+dGZpbGxjaGFyID0gVEZJTExDSEFSOworICAgIG1zLT50aXRsZWF0dHIgPSBUSVRMRUFUVFI7CisKKyAgICBtcy0+ZmlsbGNoYXIgPSBGSUxMQ0hBUjsKKyAgICBtcy0+ZmlsbGF0dHIgPSBGSUxMQVRUUjsKKyAgICBtcy0+c3BhY2VjaGFyID0gU1BBQ0VDSEFSOworICAgIG1zLT5zaGFkb3dhdHRyID0gU0hBRE9XQVRUUjsKKworICAgIG1zLT5tZW51cGFnZSA9IE1FTlVQQUdFOyAgICAvLyBVc3VhbGx5IG5vIG5lZWQgdG8gY2hhbmdlIHRoaXMgYXQgYWxsCisKKyAgICAvLyBJbml0aWFsaXNlIGFsbCBoYW5kbGVycworICAgIG1zLT5oYW5kbGVyID0gTlVMTDsKKyAgICBtcy0+a2V5c19oYW5kbGVyID0gTlVMTDsKKyAgICBtcy0+b250aW1lb3V0ID0gTlVMTDsgICAvLyBObyB0aW1lb3V0IGhhbmRsZXIKKyAgICBtcy0+dG1fdG90YWxfdGltZW91dCA9IDA7CisgICAgbXMtPnRtX3NvZmFyX3RpbWVvdXQgPSAwOworICAgIG1zLT5vbnRvdGFsdGltZW91dCA9IE5VTEw7CisKKyAgICAvLyBTZXR1cCBBQ1RJT05feyxJTn1WQUxJRAorICAgIEFDVElPTl9WQUxJRC52YWxpZCA9IDE7CisgICAgQUNUSU9OX1ZBTElELnJlZnJlc2ggPSAwOworICAgIEFDVElPTl9JTlZBTElELnZhbGlkID0gMDsKKyAgICBBQ1RJT05fSU5WQUxJRC5yZWZyZXNoID0gMDsKKworICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHNpemUgb2YgdGhlIHNjcmVlbiB3ZSBhcmUgaW4gbm93LgorICAgIC8vIEJ5IGRlZmF1bHQgd2UgdXNlIHRoZSB3aG9sZSBzY3JlZW4gZm9yIG91ciBtZW51CisgICAgaWYgKGdldHNjcmVlbnNpemUoMSwgJm1zLT5udW1yb3dzLCAmbXMtPm51bWNvbHMpKSB7CisgICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgIG1zLT5udW1jb2xzID0gODA7CisgICAgICAgIG1zLT5udW1yb3dzID0gMjQ7CisgICAgfQorICAgIG1zLT5taW5yb3cgPSBtcy0+bWluY29sID0gMDsKKyAgICBtcy0+bWF4Y29sID0gbXMtPm51bWNvbHMgLSAxOworICAgIG1zLT5tYXhyb3cgPSBtcy0+bnVtcm93cyAtIDE7CisKKyAgICAvLyBIb3cgbWFueSBlbnRyaWVzIHBlciBtZW51IGNhbiB3ZSBkaXNwbGF5IGF0IGEgdGltZQorICAgIG1zLT5tYXhtZW51aGVpZ2h0ID0gbXMtPm1heHJvdyAtIG1zLT5taW5yb3cgLSAzOworICAgIGlmIChtcy0+bWF4bWVudWhlaWdodCA+IE1BWE1FTlVIRUlHSFQpCisgICAgbXMtPm1heG1lbnVoZWlnaHQgPSBNQVhNRU5VSEVJR0hUOworCisgICAgY29uc29sZV9hbnNpX3JhdygpOworCisgICAgcmV0dXJuIG1zOworfQorCit2b2lkIHNldF9ub3JtYWxfYXR0cih1Y2hhciBub3JtYWwsIHVjaGFyIHNlbGVjdGVkLCB1Y2hhciBpbmFjdGl2ZW5vcm1hbCwKKyAgICAgICAgICAgICB1Y2hhciBpbmFjdGl2ZXNlbGVjdGVkKQoreworICAgIGlmIChub3JtYWwgIT0gMHhGRikKKyAgICBtcy0+bm9ybWFsYXR0clswXSA9IG5vcm1hbDsKKyAgICBpZiAoc2VsZWN0ZWQgIT0gMHhGRikKKyAgICBtcy0+cmV2ZXJzZWF0dHJbMF0gPSBzZWxlY3RlZDsKKyAgICBpZiAoaW5hY3RpdmVub3JtYWwgIT0gMHhGRikKKyAgICBtcy0+aW5hY3RhdHRyWzBdID0gaW5hY3RpdmVub3JtYWw7CisgICAgaWYgKGluYWN0aXZlc2VsZWN0ZWQgIT0gMHhGRikKKyAgICBtcy0+cmV2aW5hY3RhdHRyWzBdID0gaW5hY3RpdmVzZWxlY3RlZDsKK30KKwordm9pZCBzZXRfbm9ybWFsX2hsaXRlKHVjaGFyIG5vcm1hbCwgdWNoYXIgc2VsZWN0ZWQsIHVjaGFyIGluYWN0aXZlbm9ybWFsLAorICAgICAgICAgICAgICB1Y2hhciBpbmFjdGl2ZXNlbGVjdGVkKQoreworICAgIGlmIChub3JtYWwgIT0gMHhGRikKKyAgICBtcy0+bm9ybWFsYXR0clsxXSA9IG5vcm1hbDsKKyAgICBpZiAoc2VsZWN0ZWQgIT0gMHhGRikKKyAgICBtcy0+cmV2ZXJzZWF0dHJbMV0gPSBzZWxlY3RlZDsKKyAgICBpZiAoaW5hY3RpdmVub3JtYWwgIT0gMHhGRikKKyAgICBtcy0+aW5hY3RhdHRyWzFdID0gaW5hY3RpdmVub3JtYWw7CisgICAgaWYgKGluYWN0aXZlc2VsZWN0ZWQgIT0gMHhGRikKKyAgICBtcy0+cmV2aW5hY3RhdHRyWzFdID0gaW5hY3RpdmVzZWxlY3RlZDsKK30KKwordm9pZCBzZXRfc3RhdHVzX2luZm8odWNoYXIgc3RhdHVzYXR0ciwgdWNoYXIgc3RhdHVzaGxpdGUsIHVjaGFyIHN0YXRsaW5lKQoreworICAgIGlmIChzdGF0dXNhdHRyICE9IDB4RkYpCisgICAgbXMtPnN0YXR1c2F0dHJbTk9ITElURV0gPSBzdGF0dXNhdHRyOworICAgIGlmIChzdGF0dXNobGl0ZSAhPSAweEZGKQorICAgIG1zLT5zdGF0dXNhdHRyW0hMSVRFXSA9IHN0YXR1c2hsaXRlOworICAgIC8vIHN0YXRsaW5lIGlzIHJlbGF0aXZlIHRvIG1pbnJvdworICAgIGlmIChzdGF0bGluZSA+PSBtcy0+bnVtcm93cykKKyAgICBzdGF0bGluZSA9IG1zLT5udW1yb3dzIC0gMTsKKyAgICBtcy0+c3RhdGxpbmUgPSBzdGF0bGluZTsgICAgLy8gcmVsYXRpdmUgdG8gbXMtPm1pbnJvdywgMCBiYXNlZAorfQorCit2b2lkIHNldF90aXRsZV9pbmZvKHVjaGFyIHRmaWxsY2hhciwgdWNoYXIgdGl0bGVhdHRyKQoreworICAgIGlmICh0ZmlsbGNoYXIgIT0gMHhGRikKKyAgICBtcy0+dGZpbGxjaGFyID0gdGZpbGxjaGFyOworICAgIGlmICh0aXRsZWF0dHIgIT0gMHhGRikKKyAgICBtcy0+dGl0bGVhdHRyID0gdGl0bGVhdHRyOworfQorCit2b2lkIHNldF9taXNjX2luZm8odWNoYXIgZmlsbGNoYXIsIHVjaGFyIGZpbGxhdHRyLCB1Y2hhciBzcGFjZWNoYXIsCisgICAgICAgICAgIHVjaGFyIHNoYWRvd2F0dHIpCit7CisgICAgaWYgKGZpbGxjaGFyICE9IDB4RkYpCisgICAgbXMtPmZpbGxjaGFyID0gZmlsbGNoYXI7CisgICAgaWYgKGZpbGxhdHRyICE9IDB4RkYpCisgICAgbXMtPmZpbGxhdHRyID0gZmlsbGF0dHI7CisgICAgaWYgKHNwYWNlY2hhciAhPSAweEZGKQorICAgIG1zLT5zcGFjZWNoYXIgPSBzcGFjZWNoYXI7CisgICAgaWYgKHNoYWRvd2F0dHIgIT0gMHhGRikKKyAgICBtcy0+c2hhZG93YXR0ciA9IHNoYWRvd2F0dHI7Cit9CisKK3ZvaWQgc2V0X21lbnVfb3B0aW9ucyh1Y2hhciBtYXhtZW51aGVpZ2h0KQoreworICAgIGlmIChtYXhtZW51aGVpZ2h0ICE9IDB4RkYpCisgICAgbXMtPm1heG1lbnVoZWlnaHQgPSBtYXhtZW51aGVpZ2h0OworfQorCisvLyBTZXQgdGhlIHdpbmRvdyB3aGljaCBtZW51c3lzdGVtIHNob3VsZCB1c2UKK3ZvaWQgc2V0X3dpbmRvd19zaXplKHVjaGFyIHRvcCwgdWNoYXIgbGVmdCwgdWNoYXIgYm90LCB1Y2hhciByaWdodCkKK3sKKyAgICBpbnQgbnIsIG5jOworCisgICAgaWYgKCh0b3AgPiBib3QpIHx8IChsZWZ0ID4gcmlnaHQpKQorICAgIHJldHVybjsgICAgICAgICAvLyBTb3JyeSBubyBjaGFuZ2Ugd2lsbCBoYXBwZW4gaGVyZQorCisgICAgaWYgKGdldHNjcmVlbnNpemUoMSwgJm5yLCAmbmMpKSB7CisgICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgIG5yID0gODA7CisgICAgICAgIG5jID0gMjQ7CisgICAgfQorICAgIGlmIChib3QgPj0gbnIpCisgICAgYm90ID0gbnIgLSAxOworICAgIGlmIChyaWdodCA+PSBuYykKKyAgICByaWdodCA9IG5jIC0gMTsKKyAgICBtcy0+bWlucm93ID0gdG9wOworICAgIG1zLT5taW5jb2wgPSBsZWZ0OworICAgIG1zLT5tYXhyb3cgPSBib3Q7CisgICAgbXMtPm1heGNvbCA9IHJpZ2h0OworICAgIG1zLT5udW1jb2xzID0gcmlnaHQgLSBsZWZ0ICsgMTsKKyAgICBtcy0+bnVtcm93cyA9IGJvdCAtIHRvcCArIDE7CisgICAgaWYgKG1zLT5zdGF0bGluZSA+PSBtcy0+bnVtcm93cykKKyAgICBtcy0+c3RhdGxpbmUgPSBtcy0+bnVtcm93cyAtIDE7IC8vIENsaXAgc3RhdGxpbmUgaWYgbmVlZCBiZQorfQorCit2b2lkIHJlZ19oYW5kbGVyKHRfaGFuZGxlciBodHlwZSwgdm9pZCAqaGFuZGxlcikKK3sKKyAgICAvLyBJZiBiYWQgdmFsdWUgc2V0IHRvIGRlZmF1bHQgc2NyZWVuIGhhbmRsZXIKKyAgICBzd2l0Y2ggKGh0eXBlKSB7CisgICAgY2FzZSBIRExSX0tFWVM6CisgICAgbXMtPmtleXNfaGFuZGxlciA9ICh0X2tleXNfaGFuZGxlcikgaGFuZGxlcjsKKyAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIG1zLT5oYW5kbGVyID0gKHRfbWVudXN5c3RlbV9oYW5kbGVyKSBoYW5kbGVyOworICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCB1bnJlZ19oYW5kbGVyKHRfaGFuZGxlciBodHlwZSkKK3sKKyAgICBzd2l0Y2ggKGh0eXBlKSB7CisgICAgY2FzZSBIRExSX0tFWVM6CisgICAgbXMtPmtleXNfaGFuZGxlciA9IE5VTEw7CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBtcy0+aGFuZGxlciA9IE5VTEw7CisgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHJlZ19vbnRpbWVvdXQodF90aW1lb3V0X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG51bXN0ZXBzLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RlcHNpemUpCit7CisgICAgbXMtPm9udGltZW91dCA9IGhhbmRsZXI7CisgICAgaWYgKG51bXN0ZXBzICE9IDApCisgICAgbXMtPnRtX251bXN0ZXBzID0gbnVtc3RlcHM7CisgICAgaWYgKHN0ZXBzaXplICE9IDApCisgICAgbXMtPnRtX3N0ZXBzaXplID0gc3RlcHNpemU7Cit9CisKK3ZvaWQgdW5yZWdfb250aW1lb3V0KHZvaWQpCit7CisgICAgbXMtPm9udGltZW91dCA9IE5VTEw7Cit9CisKK3ZvaWQgcmVnX29udG90YWx0aW1lb3V0KHRfdGltZW91dF9oYW5kbGVyIGhhbmRsZXIsCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG51bWNlbnRpc2Vjb25kcykKK3sKKyAgICBpZiAobnVtY2VudGlzZWNvbmRzICE9IDApIHsKKyAgICBtcy0+b250b3RhbHRpbWVvdXQgPSBoYW5kbGVyOworICAgIG1zLT50bV90b3RhbF90aW1lb3V0ID0gbnVtY2VudGlzZWNvbmRzICogMTA7ICAgIC8vIHRvIGNvbnZlcnQgdG8gbWlsbGlzZWNvbmRzCisgICAgbXMtPnRtX3NvZmFyX3RpbWVvdXQgPSAwOworICAgIH0KK30KKwordm9pZCB1bnJlZ19vbnRvdGFsdGltZW91dCh2b2lkKQoreworICAgIG1zLT5vbnRvdGFsdGltZW91dCA9IE5VTEw7Cit9CisKK2ludCBuZXh0X3Zpc2libGUocHRfbWVudSBtZW51LCBpbnQgaW5kZXgpCit7CisgICAgaW50IGFuczsKKyAgICBpZiAoaW5kZXggPCAwKQorICAgIGFucyA9IDA7CisgICAgZWxzZSBpZiAoaW5kZXggPj0gbWVudS0+bnVtaXRlbXMpCisgICAgYW5zID0gbWVudS0+bnVtaXRlbXMgLSAxOworICAgIGVsc2UKKyAgICBhbnMgPSBpbmRleDsKKyAgICB3aGlsZSAoKGFucyA8IG1lbnUtPm51bWl0ZW1zIC0gMSkgJiYKKyAgICAgICAoKG1lbnUtPml0ZW1zW2Fuc10tPmFjdGlvbiA9PSBPUFRfSU5WSVNJQkxFKSB8fAorICAgICAgICAobWVudS0+aXRlbXNbYW5zXS0+YWN0aW9uID09IE9QVF9TRVApKSkKKyAgICBhbnMrKzsKKyAgICByZXR1cm4gYW5zOworfQorCitpbnQgcHJldl92aXNpYmxlKHB0X21lbnUgbWVudSwgaW50IGluZGV4KSAgIC8vIFJldHVybiBpbmRleCBvZiBwcmV2IHZpc2libGUKK3sKKyAgICBpbnQgYW5zOworICAgIGlmIChpbmRleCA8IDApCisgICAgYW5zID0gMDsKKyAgICBlbHNlIGlmIChpbmRleCA+PSBtZW51LT5udW1pdGVtcykKKyAgICBhbnMgPSBtZW51LT5udW1pdGVtcyAtIDE7CisgICAgZWxzZQorICAgIGFucyA9IGluZGV4OworICAgIHdoaWxlICgoYW5zID4gMCkgJiYKKyAgICAgICAoKG1lbnUtPml0ZW1zW2Fuc10tPmFjdGlvbiA9PSBPUFRfSU5WSVNJQkxFKSB8fAorICAgICAgICAobWVudS0+aXRlbXNbYW5zXS0+YWN0aW9uID09IE9QVF9TRVApKSkKKyAgICBhbnMtLTsKKyAgICByZXR1cm4gYW5zOworfQorCitpbnQgbmV4dF92aXNpYmxlX3NlcChwdF9tZW51IG1lbnUsIGludCBpbmRleCkKK3sKKyAgICBpbnQgYW5zOworICAgIGlmIChpbmRleCA8IDApCisgICAgYW5zID0gMDsKKyAgICBlbHNlIGlmIChpbmRleCA+PSBtZW51LT5udW1pdGVtcykKKyAgICBhbnMgPSBtZW51LT5udW1pdGVtcyAtIDE7CisgICAgZWxzZQorICAgIGFucyA9IGluZGV4OworICAgIHdoaWxlICgoYW5zIDwgbWVudS0+bnVtaXRlbXMgLSAxKSAmJgorICAgICAgIChtZW51LT5pdGVtc1thbnNdLT5hY3Rpb24gPT0gT1BUX0lOVklTSUJMRSkpCisgICAgYW5zKys7CisgICAgcmV0dXJuIGFuczsKK30KKworaW50IHByZXZfdmlzaWJsZV9zZXAocHRfbWVudSBtZW51LCBpbnQgaW5kZXgpICAgLy8gUmV0dXJuIGluZGV4IG9mIHByZXYgdmlzaWJsZQoreworICAgIGludCBhbnM7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICBhbnMgPSAwOworICAgIGVsc2UgaWYgKGluZGV4ID49IG1lbnUtPm51bWl0ZW1zKQorICAgIGFucyA9IG1lbnUtPm51bWl0ZW1zIC0gMTsKKyAgICBlbHNlCisgICAgYW5zID0gaW5kZXg7CisgICAgd2hpbGUgKChhbnMgPiAwKSAmJiAobWVudS0+aXRlbXNbYW5zXS0+YWN0aW9uID09IE9QVF9JTlZJU0lCTEUpKQorICAgIGFucy0tOworICAgIHJldHVybiBhbnM7Cit9CisKK2ludCBjYWxjX3Zpc2libGUocHRfbWVudSBtZW51LCBpbnQgZmlyc3QpCit7CisgICAgaW50IGFucywgaTsKKworICAgIGlmIChtZW51ID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgICAgYW5zID0gMDsKKyAgICBmb3IgKGkgPSBmaXJzdDsgaSA8IG1lbnUtPm51bWl0ZW1zOyBpKyspCisgICAgaWYgKG1lbnUtPml0ZW1zW2ldLT5hY3Rpb24gIT0gT1BUX0lOVklTSUJMRSkKKyAgICAgICAgYW5zKys7CisgICAgcmV0dXJuIGFuczsKK30KKworLy8gaXMgY3VyciB2aXNpYmxlIGlmIGZpcnN0IGVudHJ5IGlzIGZpcnN0PworaW50IGlzdmlzaWJsZShwdF9tZW51IG1lbnUsIGludCBmaXJzdCwgaW50IGN1cnIpCit7CisgICAgaWYgKGN1cnIgPCBmaXJzdCkKKyAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKGNhbGNfdmlzaWJsZShtZW51LCBmaXJzdCkgLSBjYWxjX3Zpc2libGUobWVudSwgY3VycikgPAorICAgICAgICBtZW51LT5tZW51aGVpZ2h0KTsKK30KKworLy8gQ2FsY3VsYXRlIHRoZSBmaXJzdCBlbnRyeSB0byBiZSBkaXNwbGF5ZWQKKy8vIHNvIHRoYXQgY3VyciBpcyB2aXNpYmxlIGFuZCBtYWtlIGN1cnIgYXMgbGF0ZSBhcyBwb3NzaWJsZQoraW50IGNhbGNfZmlyc3RfbGF0ZShwdF9tZW51IG1lbnUsIGludCBjdXJyKQoreworICAgIGludCBhbnMsIGksIG52OworCisgICAgbnYgPSBjYWxjX3Zpc2libGUobWVudSwgMCk7CisgICAgaWYgKG52IDw9IG1lbnUtPm1lbnVoZWlnaHQpCisgICAgcmV0dXJuIDA7CisgICAgLy8gU3RhcnQgd2l0aCBjdXJyIGFuZCBnbyBiYWNrIG1lbnUtPm1lbnVoZWlnaHQgdGltZXMKKyAgICBhbnMgPSBjdXJyICsgMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVudS0+bWVudWhlaWdodDsgaSsrKQorICAgIGFucyA9IHByZXZfdmlzaWJsZV9zZXAobWVudSwgYW5zIC0gMSk7CisgICAgcmV0dXJuIGFuczsKK30KKworLy8gQ2FsY3VsYXRlIHRoZSBmaXJzdCBlbnRyeSB0byBiZSBkaXNwbGF5ZWQKKy8vIHNvIHRoYXQgY3VyciBpcyB2aXNpYmxlIGFuZCBtYWtlIGN1cnIgYXMgZWFybHkgYXMgcG9zc2libGUKK2ludCBjYWxjX2ZpcnN0X2Vhcmx5KHB0X21lbnUgbWVudSwgaW50IGN1cnIpCit7CisgICAgaW50IGFucywgaSwgbnY7CisKKyAgICBudiA9IGNhbGNfdmlzaWJsZShtZW51LCAwKTsKKyAgICBpZiAobnYgPD0gbWVudS0+bWVudWhlaWdodCkKKyAgICByZXR1cm4gMDsKKyAgICAvLyBTdGFydCB3aXRoIGN1cnIgYW5kIGdvIGJhY2sgdGlsbCA+PSBtZW51LT5tZW51aGVpZ2h0CisgICAgLy8gaXRlbXMgYXJlIHZpc2libGUKKyAgICBudiA9IGNhbGNfdmlzaWJsZShtZW51LCBjdXJyKTsgIC8vIEFscmVhZHkgbnYgb2YgdGhlbSBhcmUgdmlzaWJsZQorICAgIGFucyA9IGN1cnI7CisgICAgZm9yIChpID0gMDsgaSA8IG1lbnUtPm1lbnVoZWlnaHQgLSBudjsgaSsrKQorICAgIGFucyA9IHByZXZfdmlzaWJsZV9zZXAobWVudSwgYW5zIC0gMSk7CisgICAgcmV0dXJuIGFuczsKK30KKworLy8gQ3JlYXRlIGEgbmV3IG1lbnUgYW5kIHJldHVybiBpdHMgcG9zaXRpb24KK3VjaGFyIGFkZF9tZW51KGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgbWF4bWVudXNpemUpCit7CisgICAgaW50IG51bSwgaTsKKyAgICBwdF9tZW51IG07CisKKyAgICBudW0gPSBtcy0+bnVtbWVudXM7CisgICAgaWYgKG51bSA+PSBNQVhNRU5VUykKKyAgICByZXR1cm4gLTE7CisgICAgbSA9IE5VTEw7CisgICAgbSA9IChwdF9tZW51KSBtYWxsb2Moc2l6ZW9mKHRfbWVudSkpOworICAgIGlmIChtID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICAgIG1zLT5tZW51c1tudW1dID0gbTsKKyAgICBtLT5udW1pdGVtcyA9IDA7CisgICAgbS0+bmFtZSA9IE5VTEw7CisgICAgbS0+cm93ID0gMHhGRjsKKyAgICBtLT5jb2wgPSAweEZGOworICAgIGlmIChtYXhtZW51c2l6ZSA8IDEpCisgICAgbS0+bWF4bWVudXNpemUgPSBNQVhNRU5VU0laRTsKKyAgICBlbHNlCisgICAgbS0+bWF4bWVudXNpemUgPSBtYXhtZW51c2l6ZTsKKyAgICBtLT5pdGVtcyA9IChwdF9tZW51aXRlbSAqKSBtYWxsb2Moc2l6ZW9mKHB0X21lbnVpdGVtKSAqIChtLT5tYXhtZW51c2l6ZSkpOworICAgIGZvciAoaSA9IDA7IGkgPCBtLT5tYXhtZW51c2l6ZTsgaSsrKQorICAgIG0tPml0ZW1zW2ldID0gTlVMTDsKKworICAgIG0tPnRpdGxlID0gKGNoYXIgKiltYWxsb2MoTUVOVUxFTiArIDEpOworICAgIGlmICh0aXRsZSkgeworICAgIGlmIChzdHJsZW4odGl0bGUpID4gTUVOVUxFTiAtIDIpCisgICAgICAgIHN0cmNweShtLT50aXRsZSwgVElUTEVMT05HKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNweShtLT50aXRsZSwgdGl0bGUpOworICAgIH0gZWxzZQorICAgIHN0cmNweShtLT50aXRsZSwgRU1QVFlTVFIpOworICAgIG0tPm1lbnV3aWR0aCA9IHN0cmxlbihtLT50aXRsZSk7CisgICAgbXMtPm51bW1lbnVzKys7CisgICAgcmV0dXJuIG1zLT5udW1tZW51cyAtIDE7Cit9CisKK3ZvaWQgc2V0X21lbnVfbmFtZShjb25zdCBjaGFyICpuYW1lKSAgICAvLyBTZXQgdGhlICJuYW1lIiBvZiB0aGlzIG1lbnUKK3sKKyAgICBwdF9tZW51IG07CisKKyAgICBtID0gbXMtPm1lbnVzW21zLT5udW1tZW51cyAtIDFdOworICAgIGlmIChtLT5uYW1lKSAgICAgICAgLy8gRnJlZSB1cCBwcmV2aW91cyBuYW1lCisgICAgeworICAgIGZyZWUobS0+bmFtZSk7CisgICAgbS0+bmFtZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG5hbWUpIHsKKyAgICBtLT5uYW1lID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7CisgICAgc3RyY3B5KG0tPm5hbWUsIG5hbWUpOworICAgIH0KK30KKworLy8gQ3JlYXRlIGEgbmV3IG5hbWVkIG1lbnUgYW5kIHJldHVybiBpdHMgcG9zaXRpb24KK3VjaGFyIGFkZF9uYW1lZF9tZW51KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgbWF4bWVudXNpemUpCit7CisgICAgYWRkX21lbnUodGl0bGUsIG1heG1lbnVzaXplKTsKKyAgICBzZXRfbWVudV9uYW1lKG5hbWUpOworICAgIHJldHVybiBtcy0+bnVtbWVudXMgLSAxOworfQorCit2b2lkIHNldF9tZW51X3Bvcyh1Y2hhciByb3csIHVjaGFyIGNvbCkgLy8gU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGlzIG1lbnUuCit7CisgICAgcHRfbWVudSBtOworCisgICAgbSA9IG1zLT5tZW51c1ttcy0+bnVtbWVudXMgLSAxXTsKKyAgICBtLT5yb3cgPSByb3c7CisgICAgbS0+Y29sID0gY29sOworfQorCitwdF9tZW51aXRlbSBhZGRfc2VwKHZvaWQpICAgICAgIC8vIEFkZCBhIHNlcGFyYXRvciB0byBjdXJyZW50IG1lbnUKK3sKKyAgICBwdF9tZW51aXRlbSBtaTsKKyAgICBwdF9tZW51IG07CisKKyAgICBtID0gKG1zLT5tZW51c1ttcy0+bnVtbWVudXMgLSAxXSk7CisgICAgbWkgPSBOVUxMOworICAgIG1pID0gKHB0X21lbnVpdGVtKSBtYWxsb2Moc2l6ZW9mKHRfbWVudWl0ZW0pKTsKKyAgICBpZiAobWkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgICBtLT5pdGVtc1sodW5zaWduZWQgaW50KW0tPm51bWl0ZW1zXSA9IG1pOworICAgIG1pLT5oYW5kbGVyID0gTlVMTDsgICAgIC8vIE5vIGhhbmRsZXIKKyAgICBtaS0+aXRlbSA9IG1pLT5zdGF0dXMgPSBtaS0+ZGF0YSA9IE5VTEw7CisgICAgbWktPmFjdGlvbiA9IE9QVF9TRVA7CisgICAgbWktPmluZGV4ID0gbS0+bnVtaXRlbXMrKzsKKyAgICBtaS0+cGFyaW5kZXggPSBtcy0+bnVtbWVudXMgLSAxOworICAgIG1pLT5zaG9ydGN1dCA9IDA7CisgICAgbWktPmhlbHBpZCA9IDA7CisgICAgcmV0dXJuIG1pOworfQorCisvLyBBZGQgaXRlbSB0byB0aGUgImN1cnJlbnQiIG1lbnUKK3B0X21lbnVpdGVtIGFkZF9pdGVtKGNvbnN0IGNoYXIgKml0ZW0sIGNvbnN0IGNoYXIgKnN0YXR1cywgdF9hY3Rpb24gYWN0aW9uLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHVjaGFyIGl0ZW1kYXRhKQoreworICAgIHB0X21lbnVpdGVtIG1pOworICAgIHB0X21lbnUgbTsKKyAgICBjb25zdCBjaGFyICpzdHI7CisgICAgdWNoYXIgaW5obGl0ZSA9IDA7ICAgICAgLy8gQXJlIHdlIGluc2lkZSBobGl0ZSBhcmVhCisKKyAgICBtID0gKG1zLT5tZW51c1ttcy0+bnVtbWVudXMgLSAxXSk7CisgICAgbWkgPSBOVUxMOworICAgIG1pID0gKHB0X21lbnVpdGVtKSBtYWxsb2Moc2l6ZW9mKHRfbWVudWl0ZW0pKTsKKyAgICBpZiAobWkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgICBtLT5pdGVtc1sodW5zaWduZWQgaW50KW0tPm51bWl0ZW1zXSA9IG1pOworICAgIG1pLT5oYW5kbGVyID0gTlVMTDsgICAgIC8vIE5vIGhhbmRsZXIKKworICAgIC8vIEFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHN0dWZmCisgICAgbWktPml0ZW0gPSAoY2hhciAqKW1hbGxvYyhNRU5VTEVOICsgMSk7CisgICAgbWktPnN0YXR1cyA9IChjaGFyICopbWFsbG9jKFNUQVRMRU4gKyAxKTsKKyAgICBtaS0+ZGF0YSA9IChjaGFyICopbWFsbG9jKEFDVElPTkxFTiArIDEpOworCisgICAgaWYgKGl0ZW0pIHsKKyAgICBpZiAoc3RybGVuKGl0ZW0pID4gTUVOVUxFTikgeworICAgICAgICBzdHJjcHkobWktPml0ZW0sIElURU1MT05HKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJjcHkobWktPml0ZW0sIGl0ZW0pOworICAgIH0KKyAgICBpZiAoc3RybGVuKG1pLT5pdGVtKSA+IG0tPm1lbnV3aWR0aCkKKyAgICAgICAgbS0+bWVudXdpZHRoID0gc3RybGVuKG1pLT5pdGVtKTsKKyAgICB9IGVsc2UKKyAgICBzdHJjcHkobWktPml0ZW0sIEVNUFRZU1RSKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICBpZiAoc3RybGVuKHN0YXR1cykgPiBTVEFUTEVOKSB7CisgICAgICAgIHN0cmNweShtaS0+c3RhdHVzLCBTVEFUVVNMT05HKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJjcHkobWktPnN0YXR1cywgc3RhdHVzKTsKKyAgICB9CisgICAgfSBlbHNlCisgICAgc3RyY3B5KG1pLT5zdGF0dXMsIEVNUFRZU1RSKTsKKworICAgIG1pLT5hY3Rpb24gPSBhY3Rpb247CisgICAgc3RyID0gbWktPml0ZW07CisgICAgbWktPnNob3J0Y3V0ID0gMDsKKyAgICBtaS0+aGVscGlkID0gMHhGRkZGOworICAgIGluaGxpdGUgPSAwOyAgICAgICAgLy8gV2UgaGF2ZSBub3QgeWV0IHNlZW4gYW4gRU5BQkxFSExJVEUgY2hhcgorICAgIC8vIEZpbmQgdGhlIGZpcnN0IGNoYXIgaW4gW0EtWmEtejAtOV0gYWZ0ZXIgRU5BQkxFSExJVEUgYW5kIG5vdCBhcmcgdG8gY29udHJvbCBjaGFyCisgICAgd2hpbGUgKCpzdHIpIHsKKyAgICBpZiAoKnN0ciA9PSBFTkFCTEVITElURSkgeworICAgICAgICBpbmhsaXRlID0gMTsKKyAgICB9CisgICAgaWYgKCpzdHIgPT0gRElTQUJMRUhMSVRFKSB7CisgICAgICAgIGluaGxpdGUgPSAwOworICAgIH0KKyAgICBpZiAoKGluaGxpdGUgPT0gMSkgJiYKKyAgICAgICAgKCgoKnN0ciA+PSAnQScpICYmICgqc3RyIDw9ICdaJykpIHx8CisgICAgICAgICAoKCpzdHIgPj0gJ2EnKSAmJiAoKnN0ciA8PSAneicpKSB8fAorICAgICAgICAgKCgqc3RyID49ICcwJykgJiYgKCpzdHIgPD0gJzknKSkpKSB7CisgICAgICAgIG1pLT5zaG9ydGN1dCA9ICpzdHI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICArK3N0cjsKKyAgICB9CisgICAgaWYgKChtaS0+c2hvcnRjdXQgPj0gJ0EnKSAmJiAobWktPnNob3J0Y3V0IDw9ICdaJykpIC8vIE1ha2UgbG93ZXIgY2FzZQorICAgIG1pLT5zaG9ydGN1dCA9IG1pLT5zaG9ydGN1dCAtICdBJyArICdhJzsKKworICAgIGlmIChkYXRhKSB7CisgICAgaWYgKHN0cmxlbihkYXRhKSA+IEFDVElPTkxFTikgeworICAgICAgICBzdHJjcHkobWktPmRhdGEsIEFDVElPTkxPTkcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmNweShtaS0+ZGF0YSwgZGF0YSk7CisgICAgfQorICAgIH0gZWxzZQorICAgIHN0cmNweShtaS0+ZGF0YSwgRU1QVFlTVFIpOworCisgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICBjYXNlIE9QVF9TVUJNRU5VOgorICAgIG1pLT5pdGVtZGF0YS5zdWJtZW51bnVtID0gaXRlbWRhdGE7CisgICAgYnJlYWs7CisgICAgY2FzZSBPUFRfQ0hFQ0tCT1g6CisgICAgbWktPml0ZW1kYXRhLmNoZWNrZWQgPSBpdGVtZGF0YTsKKyAgICBicmVhazsKKyAgICBjYXNlIE9QVF9SQURJT01FTlU6CisgICAgbWktPml0ZW1kYXRhLnJhZGlvbWVudW51bSA9IGl0ZW1kYXRhOworICAgIGlmIChtaS0+ZGF0YSkKKyAgICAgICAgZnJlZShtaS0+ZGF0YSk7CisgICAgbWktPmRhdGEgPSBOVUxMOyAgICAvLyBObyBzZWxlY3Rpb24gbWFkZQorICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLy8gdG8ga2VlcCB0aGUgY29tcGlsZXIgaGFwcHkKKyAgICBicmVhazsKKyAgICB9CisgICAgbWktPmluZGV4ID0gbS0+bnVtaXRlbXMrKzsKKyAgICBtaS0+cGFyaW5kZXggPSBtcy0+bnVtbWVudXMgLSAxOworICAgIHJldHVybiBtaTsKK30KKworLy8gU2V0IHRoZSBzaG9ydGN1dCBrZXkgZm9yIHRoZSBjdXJyZW50IGl0ZW0KK3ZvaWQgc2V0X2l0ZW1fb3B0aW9ucyh1Y2hhciBzaG9ydGN1dCwgaW50IGhlbHBpZCkKK3sKKyAgICBwdF9tZW51aXRlbSBtaTsKKyAgICBwdF9tZW51IG07CisKKyAgICBtID0gKG1zLT5tZW51c1ttcy0+bnVtbWVudXMgLSAxXSk7CisgICAgaWYgKG0tPm51bWl0ZW1zIDw9IDApCisgICAgcmV0dXJuOworICAgIG1pID0gbS0+aXRlbXNbKHVuc2lnbmVkIGludCltLT5udW1pdGVtcyAtIDFdOworCisgICAgaWYgKHNob3J0Y3V0ICE9IDB4RkYpCisgICAgbWktPnNob3J0Y3V0ID0gc2hvcnRjdXQ7CisgICAgaWYgKGhlbHBpZCAhPSAweEZGRkYpCisgICAgbWktPmhlbHBpZCA9IGhlbHBpZDsKK30KKworLy8gRnJlZSBpbnRlcm5hbCBkYXRhc3V0cnVjdHVyZXMKK3ZvaWQgY2xvc2VfbWVudXN5c3RlbSh2b2lkKQoreworfQorCisvLyBhcHBlbmRfbGluZV9oZWxwZXIocHRfbWVudSBtZW51LGNoYXIgKmxpbmUpCit2b2lkIGFwcGVuZF9saW5lX2hlbHBlcihpbnQgbWVudW51bSwgY2hhciAqbGluZSkKK3sKKyAgICBwdF9tZW51IG1lbnU7CisgICAgcHRfbWVudWl0ZW0gbWksIHJpOworICAgIGNoYXIgKmFwcDsKKyAgICBpbnQgY3RyOworCisgICAgbWVudSA9IG1zLT5tZW51c1ttZW51bnVtXTsKKyAgICBmb3IgKGN0ciA9IDA7IGN0ciA8IChpbnQpbWVudS0+bnVtaXRlbXM7IGN0cisrKSB7CisgICAgbWkgPSBtZW51LT5pdGVtc1tjdHJdOworICAgIGFwcCA9IE5VTEw7ICAgICAvL1doYXQgdG8gYXBwZW5kCisgICAgc3dpdGNoIChtaS0+YWN0aW9uKSB7CisgICAgY2FzZSBPUFRfQ0hFQ0tCT1g6CisgICAgICAgIGlmIChtaS0+aXRlbWRhdGEuY2hlY2tlZCkKKyAgICAgICAgYXBwID0gbWktPmRhdGE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUX1JBRElPTUVOVToKKyAgICAgICAgaWYgKG1pLT5kYXRhKSB7IC8vIFNvbWUgc2VsZWN0aW9uIGhhcyBiZWVuIG1hZGUKKyAgICAgICAgcmkgPSAocHRfbWVudWl0ZW0pIChtaS0+ZGF0YSk7CisgICAgICAgIGFwcCA9IHJpLT5kYXRhOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUX1NVQk1FTlU6CisgICAgICAgIGFwcGVuZF9saW5lX2hlbHBlcihtaS0+aXRlbWRhdGEuc3VibWVudW51bSwgbGluZSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYXBwKSB7CisgICAgICAgIHN0cmNhdChsaW5lLCAiICIpOworICAgICAgICBzdHJjYXQobGluZSwgYXBwKTsKKyAgICB9CisgICAgfQorfQorCisvLyBHZW5lcmF0ZSBzdHJpbmcgYmFzZWQgb24gc3RhdGUgb2YgY2hlY2tib3hlcyBhbmQgcmFkaW9pdGVtIGluIGdpdmVuIG1lbnUKKy8vIEFzc3VtZSBsaW5lIHBvaW50cyB0byBsYXJnZSBlbm91Z2ggYnVmZmVyCit2b2lkIGdlbl9hcHBlbmRfbGluZShjb25zdCBjaGFyICptZW51X25hbWUsIGNoYXIgKmxpbmUpCit7CisgICAgaW50IG1lbnVudW07CisKKyAgICBtZW51bnVtID0gZmluZF9tZW51X251bShtZW51X25hbWUpOworICAgIGlmIChtZW51bnVtIDwgMCkKKyAgICByZXR1cm47ICAgICAgICAgLy8gTm8gc3VjaCBtZW51CisgICAgYXBwZW5kX2xpbmVfaGVscGVyKG1lbnVudW0sIGxpbmUpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvbGlibWVudS9wYXNzd29yZHMuYyBiL2NvbTMyL2NtZW51L2xpYm1lbnUvcGFzc3dvcmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjZTQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NtZW51L2xpYm1lbnUvcGFzc3dvcmRzLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDUgTXVyYWxpIEtyaXNobmFuIEdhbmFwYXRoeSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b20gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAicGFzc3dvcmRzLmgiCisjaW5jbHVkZSAiZGVzLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ0dWkuaCIKKworI2RlZmluZSBNQVhfTElORSA1MTIKKy8vIE1heCBsaW5lIGxlbmd0aCBpbiBhIHB3ZGZpbGUKK3BfcHdkZW50cnkgdXNlcmRiW01BWF9VU0VSU107CS8vIEFycmF5IG9mIHBvaW50ZXJzCitpbnQgbnVtdXNlcnM7CQkJLy8gQWN0dWFsIG51bWJlciBvZiB1c2VycworCisvLyByZXR1cm5zIHRydWUgb3IgZmFsc2UsIGkuZS4gMSBvciAwCitjaGFyIGF1dGhlbnRpY2F0ZV91c2VyKGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpwd2QpCit7CisgICAgY2hhciBzYWx0WzEyXTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW11c2VyczsgaSsrKSB7CisJaWYgKHVzZXJkYltpXSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwlpZiAoc3RyY21wKHVzZXJuYW1lLCB1c2VyZGJbaV0tPnVzZXJuYW1lKSA9PSAwKSB7CisJICAgIHN0cmNweShzYWx0LCB1c2VyZGJbaV0tPnB3ZGhhc2gpOworCSAgICBzYWx0WzJdID0gJ1wwJzsKKwkgICAgaWYgKHN0cmNtcCh1c2VyZGJbaV0tPnB3ZGhhc2gsIGNyeXB0KHB3ZCwgc2FsdCkpID09IDApCisJCXJldHVybiAxOworCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIERvZXMgdXNlciBVU0VSTkFNRSAgaGF2ZSBwZXJtaXNzaW9uIFBFUk0KK2NoYXIgaXNhbGxvd2VkKGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpwZXJtKQoreworICAgIGludCBpOworICAgIGNoYXIgKmRwZXJtOworICAgIGNoYXIgKnRtcDsKKworICAgIC8vIElmIG5vIHVzZXJzLCB0aGVuIGV2ZXJ5Ym9keSBpcyBhbGxvd2VkIHRvIGRvIGV2ZXJ5dGhpbmcKKyAgICBpZiAobnVtdXNlcnMgPT0gMCkKKwlyZXR1cm4gMTsKKyAgICBpZiAoc3RyY21wKHVzZXJuYW1lLCBHVUVTVF9VU0VSKSA9PSAwKQorCXJldHVybiAwOworICAgIGRwZXJtID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHBlcm0pICsgMyk7CisgICAgc3RyY3B5KGRwZXJtICsgMSwgcGVybSk7CisgICAgZHBlcm1bMF0gPSAnOic7CisgICAgZHBlcm1bc3RybGVuKHBlcm0pICsgMV0gPSAnOic7CisgICAgZHBlcm1bc3RybGVuKHBlcm0pICsgMl0gPSAwOworICAgIC8vIE5vdyBkcGVybSA9ICI6cGVybToiCisgICAgZm9yIChpID0gMDsgaSA8IG51bXVzZXJzOyBpKyspIHsKKwlpZiAoc3RyY21wKHVzZXJkYltpXS0+dXNlcm5hbWUsIHVzZXJuYW1lKSA9PSAwKQkvLyBGb3VuZCB0aGUgdXNlcgorCXsKKwkgICAgaWYgKHVzZXJkYltpXS0+cGVybXMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CS8vIE5vIHBlcm1pc3Npb24KKwkgICAgdG1wID0gc3Ryc3RyKHVzZXJkYltpXS0+cGVybXMsIGRwZXJtKTsJLy8gU2VhcmNoIGZvciBwZXJtaXNzaW9uCisJICAgIGZyZWUoZHBlcm0pOwkvLyBSZWxlYXNlIG1lbW9yeQorCSAgICBpZiAodG1wID09IE5VTEwpCisJCXJldHVybiAwOworCSAgICBlbHNlCisJCXJldHVybiAxOworCX0KKyAgICB9CisgICAgLy8gVXNlciBub3QgZm91bmQgcmV0dXJuIDAKKyAgICBmcmVlKGRwZXJtKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gSW5pdGlhbGlzZSB0aGUgbGlzdCBvZiBvZiB1c2VyIHBhc3N3b3JkcyBwZXJtaXNzaW9ucyBmcm9tIGZpbGUKK3ZvaWQgaW5pdF9wYXNzd29yZHMoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgaW50IGk7CisgICAgY2hhciBsaW5lW01BWF9MSU5FXSwgKnAsICp1c2VyLCAqcHdkaGFzaCwgKnBlcm1zOworICAgIEZJTEUgKmY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1VTRVJTOyBpKyspCisJdXNlcmRiW2ldID0gTlVMTDsKKyAgICBudW11c2VycyA9IDA7CisKKyAgICBpZiAoIWZpbGVuYW1lKQorCXJldHVybjsJCQkvLyBObyBmaWxlbmFtZSBzcGVjaWZpZWQKKworICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICBpZiAoIWYpCisJcmV0dXJuOwkJCS8vIEZpbGUgZG9lcyBub3QgZXhpc3QKKworICAgIC8vIFByb2Nlc3MgZWFjaCBsaW5lCisgICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZiBsaW5lLCBmKSkgeworCS8vIFJlcGxhY2UgRU9MTiB3aXRoIFwwCisJcCA9IHN0cmNocihsaW5lLCAnXHInKTsKKwlpZiAocCkKKwkgICAgKnAgPSAnXDAnOworCXAgPSBzdHJjaHIobGluZSwgJ1xuJyk7CisJaWYgKHApCisJICAgICpwID0gJ1wwJzsKKworCS8vIElmIGNvbW1lbnQgbGluZSBvciBlbXB0eSBpZ25vcmUgbGluZQorCXAgPSBsaW5lOworCXdoaWxlICgqcCA9PSAnICcpCisJICAgIHArKzsJCS8vIHNraXAgaW5pdGlhbCBzcGFjZXMKKwlpZiAoKCpwID09ICcjJykgfHwgKCpwID09ICdcMCcpKQorCSAgICBjb250aW51ZTsJCS8vIFNraXAgY29tbWVudCBsaW5lcworCisJdXNlciA9IHA7CQkvLyBUaGlzIGlzIHdoZXJlIHVzZXJuYW1lIHN0YXJ0cworCXAgPSBzdHJjaHIodXNlciwgJzonKTsKKwlpZiAocCA9PSBOVUxMKQorCSAgICBjb250aW51ZTsJCS8vIE1hbGZvcm1lZCBsaW5lIHNraXAKKwkqcCA9ICdcMCc7CisJcHdkaGFzaCA9IHAgKyAxOworCWlmICgqcHdkaGFzaCA9PSAwKQorCSAgICBjb250aW51ZTsJCS8vIE1hbGZvcm1lZCBsaW5lIChubyBwYXNzd29yZCBzcGVjaWZpZWQpCisJcCA9IHN0cmNocihwd2RoYXNoLCAnOicpOworCWlmIChwID09IE5VTEwpIHsJLy8gTm8gcGVybXMgc3BlY2lmaWVkCisJICAgIHBlcm1zID0gTlVMTDsKKwl9IGVsc2UgeworCSAgICAqcCA9ICdcMCc7CisJICAgIHBlcm1zID0gcCArIDE7CisJICAgIGlmICgqcGVybXMgPT0gMCkKKwkJcGVybXMgPSBOVUxMOworCX0KKwkvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdXNlcixwd2RoYXNoIGFuZCBwZXJtcyBzZXR1cAorCXVzZXJkYltudW11c2Vyc10gPSAocF9wd2RlbnRyeSkgbWFsbG9jKHNpemVvZihwd2RlbnRyeSkpOworCXN0cmNweSh1c2VyZGJbbnVtdXNlcnNdLT51c2VybmFtZSwgdXNlcik7CisJc3RyY3B5KHVzZXJkYltudW11c2Vyc10tPnB3ZGhhc2gsIHB3ZGhhc2gpOworCWlmIChwZXJtcyA9PSBOVUxMKQorCSAgICB1c2VyZGJbbnVtdXNlcnNdLT5wZXJtcyA9IE5VTEw7CisJZWxzZSB7CisJICAgIHVzZXJkYltudW11c2Vyc10tPnBlcm1zID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHBlcm1zKSArIDMpOworCSAgICAodXNlcmRiW251bXVzZXJzXS0+cGVybXMpWzBdID0gJzonOworCSAgICBzdHJjcHkodXNlcmRiW251bXVzZXJzXS0+cGVybXMgKyAxLCBwZXJtcyk7CisJICAgICh1c2VyZGJbbnVtdXNlcnNdLT5wZXJtcylbc3RybGVuKHBlcm1zKSArIDFdID0gJzonOworCSAgICAodXNlcmRiW251bXVzZXJzXS0+cGVybXMpW3N0cmxlbihwZXJtcykgKyAyXSA9IDA7CisJICAgIC8vIE5vdyBwZXJtcyBmaWVsZCBwb2ludHMgdG8gIjpwZXJtczoiCisJfQorCW51bXVzZXJzKys7CisgICAgfQorICAgIGZjbG9zZShmKTsKK30KKwordm9pZCBjbG9zZV9wYXNzd29yZHModm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW11c2VyczsgaSsrKQorCWlmICh1c2VyZGJbaV0gIT0gTlVMTCkKKwkgICAgZnJlZSh1c2VyZGJbaV0pOworICAgIG51bXVzZXJzID0gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2NtZW51L2xpYm1lbnUvcGFzc3dvcmRzLmggYi9jb20zMi9jbWVudS9saWJtZW51L3Bhc3N3b3Jkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMGVjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jbWVudS9saWJtZW51L3Bhc3N3b3Jkcy5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX1BBU1NXT1JEU19IXworI2RlZmluZSBfUEFTU1dPUkRTX0hfCisKK2NoYXIgYXV0aGVudGljYXRlX3VzZXIoY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKnB3ZCk7CisKK2NoYXIgaXNhbGxvd2VkKGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpwZXJtKTsKKworLy8gSW5pdGlhbGlzZSB0aGUgbGlzdCBvZiBvZiB1c2VyIHBhc3N3b3JkcyBwZXJtaXNzaW9ucyBmcm9tIGZpbGUKK3ZvaWQgaW5pdF9wYXNzd29yZHMoY29uc3QgY2hhciAqZmlsZW5hbWUpOworLy8gRnJlZSBhbGwgc3BhY2UgdXNlZCBmb3IgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCit2b2lkIGNsb3NlX3Bhc3N3b3Jkcyh2b2lkKTsKKworI2RlZmluZSBNQVhfVVNFUlMgMTI4CQkvLyBNYXhpbXVtIG51bWJlciBvZiB1c2VycworI2RlZmluZSBVU0VSTkFNRV9MRU5HVEggMTIJLy8gTWF4IGxlbmd0aCBvZiB1c2VyIG5hbWUKKyNkZWZpbmUgUFdESEFTSF9MRU5HVEggIDQwCS8vIE1heCBsZW5naHQgb2YgcHdkIGhhc2gKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgdXNlcm5hbWVbVVNFUk5BTUVfTEVOR1RIICsgMV07CisgICAgY2hhciBwd2RoYXNoW1BXREhBU0hfTEVOR1RIICsgMV07CisgICAgY2hhciAqcGVybXM7CQkvLyBwb2ludGVyIHRvIHN0cmluZyBjb250YWluaW5nICI6IiBkZWxpbWl0ZWQgcGVybWlzc2lvbnMKK30gcHdkZW50cnk7CisKK3R5cGVkZWYgcHdkZW50cnkgKnBfcHdkZW50cnk7CisKKyNkZWZpbmUgR1VFU1RfVVNFUiAiZ3Vlc3QiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvbGlibWVudS9zeXNsbnguYyBiL2NvbTMyL2NtZW51L2xpYm1lbnUvc3lzbG54LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlYzJhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2NtZW51L2xpYm1lbnUvc3lzbG54LmMKQEAgLTAsMCArMSw2NSBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNSBNdXJhbGkgS3Jpc2huYW4gR2FuYXBhdGh5IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxncmFwaGljcy5oPgorI2luY2x1ZGUgInN5c2xueC5oIgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3ZpZGVvLmg+CisKK2NvbTMyc3lzX3QgaW5yZWcsIG91dHJlZzsJLy8gR2xvYmFsIHJlZ2lzdGVycyBmb3IgdGhpcyBtb2R1bGUKKwordm9pZCBydW5zeXNsaW51eGNtZChjb25zdCBjaGFyICpjbWQpCit7CisgICAgY2hhciAqYm91bmNlOworCisgICAgYm91bmNlID0gbG1hbGxvYyhzdHJsZW4oY21kKSArIDEpOworICAgIGlmICghYm91bmNlKQorCXJldHVybjsKKworICAgIHN0cmNweShib3VuY2UsIGNtZCk7CisgICAgbG9hZF9rZXJuZWwoYm91bmNlKTsKK30KKwordm9pZCBnb3RvdHh0bW9kZSh2b2lkKQoreworICAgIHN5c2xpbnV4X2ZvcmNlX3RleHRfbW9kZSgpOworfQorCit2b2lkIHN5c2xpbnV4X2lkbGUodm9pZCkKK3sKKyAgICBfX2lkbGUoKTsKK30KKwordW5zaWduZWQgaW50IGdldHZlcnNpb24oY2hhciAqZGVyaXYsIHVuc2lnbmVkIGludCAqbnVtZnVuKQoreworICAgIGlmIChkZXJpdikKKwkqZGVyaXYgPSBfX3N5c2xpbnV4X3ZlcnNpb24uZmlsZXN5c3RlbTsKKyAgICBpZiAobnVtZnVuKQorCSpudW1mdW4gPSBfX3N5c2xpbnV4X3ZlcnNpb24ubWF4X2FwaTsKKyAgICByZXR1cm4gX19zeXNsaW51eF92ZXJzaW9uLnZlcnNpb247Cit9CisKK2NoYXIgaXNzeXNsaW51eCh2b2lkKQoreworICAgIHJldHVybiAhIWdldHZlcnNpb24oTlVMTCwgTlVMTCk7Cit9CisKK3ZvaWQgcnVuc3lzbGludXhpbWFnZShjb25zdCBjaGFyICpjbWQsIGxvbmcgaXBhcHBlbmQpCit7CisgICAgKHZvaWQpaXBhcHBlbmQ7CQkvLyBYWFg6IFVudXNlZD8hCisKKyAgICBnZXR2ZXJzaW9uKE5VTEwsIE5VTEwpOworICAgIHJ1bnN5c2xpbnV4Y21kKGNtZCk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9saWJtZW51L3N5c2xueC5oIGIvY29tMzIvY21lbnUvbGlibWVudS9zeXNsbnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTY0OWU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvbGlibWVudS9zeXNsbnguaApAQCAtMCwwICsxLDY0IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA1IE11cmFsaSBLcmlzaG5hbiBHYW5hcGF0aHkgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfX1NZU0xOWF9IX18KKyNkZWZpbmUgX19TWVNMTlhfSF9fCisKKyNpbmNsdWRlIDxjb20zMi5oPgorCisvL01hY3JvcyB3aGljaCBoZWxwIHVzZXIgbm90IGhhdmUgdG8gcmVtZW1iZXIgdGhlIHN0cnVjdHVyZSBvZiByZWdpc3RlcgorLy8gRGF0YSBzdHJ1Y3R1cmUKKworI2RlZmluZSBSRUdfQUgoeCkgKCh4KS5lYXguYlsxXSkKKyNkZWZpbmUgUkVHX0FMKHgpICgoeCkuZWF4LmJbMF0pCisjZGVmaW5lIFJFR19BWCh4KSAoKHgpLmVheC53WzBdKQorI2RlZmluZSBSRUdfRUFYKHgpICgoeCkuZWF4LmwpCisKKyNkZWZpbmUgUkVHX0JIKHgpICgoeCkuZWJ4LmJbMV0pCisjZGVmaW5lIFJFR19CTCh4KSAoKHgpLmVieC5iWzBdKQorI2RlZmluZSBSRUdfQlgoeCkgKCh4KS5lYngud1swXSkKKyNkZWZpbmUgUkVHX0VCWCh4KSAoKHgpLmVieC5sKQorCisjZGVmaW5lIFJFR19DSCh4KSAoKHgpLmVjeC5iWzFdKQorI2RlZmluZSBSRUdfQ0woeCkgKCh4KS5lY3guYlswXSkKKyNkZWZpbmUgUkVHX0NYKHgpICgoeCkuZWN4LndbMF0pCisjZGVmaW5lIFJFR19FQ1goeCkgKCh4KS5lY3gubCkKKworI2RlZmluZSBSRUdfREgoeCkgKCh4KS5lZHguYlsxXSkKKyNkZWZpbmUgUkVHX0RMKHgpICgoeCkuZWR4LmJbMF0pCisjZGVmaW5lIFJFR19EWCh4KSAoKHgpLmVkeC53WzBdKQorI2RlZmluZSBSRUdfRURYKHgpICgoeCkuZWR4LmwpCisKKyNkZWZpbmUgUkVHX0RTKHgpICgoeCkuZHMpCisjZGVmaW5lIFJFR19FUyh4KSAoKHgpLmVzKQorI2RlZmluZSBSRUdfRlMoeCkgKCh4KS5mcykKKyNkZWZpbmUgUkVHX0dTKHgpICgoeCkuZ3MpCisKKyNkZWZpbmUgUkVHX1NJKHgpICgoeCkuZXNpLndbMF0pCisjZGVmaW5lIFJFR19FU0koeCkgKCh4KS5lc2kubCkKKworI2RlZmluZSBSRUdfREkoeCkgKCh4KS5lZGkud1swXSkKKyNkZWZpbmUgUkVHX0VESSh4KSAoKHgpLmVkaS5sKQorCitjaGFyIGlzc3lzbGludXgodm9pZCk7CQkvKiBDaGVjayBpZiBzeXNsaW51eCBpcyBydW5uaW5nICovCisKK3ZvaWQgcnVuc3lzbGludXhjbWQoY29uc3QgY2hhciAqY21kKTsJLyogUnVuIHNwZWNpZmllZCBjb21tYW5kICovCisKK3ZvaWQgZ290b3R4dG1vZGUodm9pZCk7CQkvKiBDaGFuZ2UgbW9kZSB0byB0ZXh0IG1vZGUgKi8KKwordm9pZCBzeXNsaW51eF9pZGxlKHZvaWQpOwkvKiBDYWxsIHN5c2xpbnV4IGlkbGUgbG9vcCAqLworCisvKiBSdW4gY29tbWFuZCBsaW5lIHdpdGggaXBhcHBlbmQsIHJldHVybnMgaWYga2VybmVsIGltYWdlIG5vdCBmb3VuZAorICAgSWYgc3lzbGludXggdmVyc2lvbiB0b28gb2xkLCB0aGVuIGRlZmF1bHRzIHRvIHJ1bnN5c2xpbnV4Y21kICovCit2b2lkIHJ1bnN5c2xpbnV4aW1hZ2UoY29uc3QgY2hhciAqY21kLCBsb25nIGlwYXBwZW5kKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9saWJtZW51L3R1aS5jIGIvY29tMzIvY21lbnUvbGlibWVudS90dWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDY5Mjc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvbGlibWVudS90dWkuYwpAQCAtMCwwICsxLDI1OCBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBNdXJhbGkgS3Jpc2huYW4gR2FuYXBhdGh5IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJ0dWkuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbTMyaW8uaCIKKworY29tMzJzeXNfdCBpbnJlZywgb3V0cmVnOwkvLyBHbG9iYWwgcmVnaXN0ZXIgc2V0cyBmb3IgdXNlCisKK2NoYXIgYmtzcHN0cltdID0gIiBcYiQiOworY2hhciBlb2xzdHJbXSA9ICJcbiQiOworCisvLyBSZWFkcyBhIGxpbmUgb2YgaW5wdXQgZnJvbSBzdGRpbi4gUmVwbGFjZSBDUiB3aXRoIE5VTCBieXRlCisvLyBwYXNzd29yZCA8PiAwIGltcGxpZXMgbm90IGVjaG9lZCBvbiBzY3JlZW4KKy8vIHNob3dvbGR2YWx1ZSA8PiAwIGltcGxpZXMgY3VycmVudHZhbHVlIGRpc3BsYXllZCBmaXJzdAorLy8gSWYgc2hvd29sZHZhbHVlIDw+IDAgdGhlbiBjYWxsZXIgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQKKy8vIHN0ciBpcyBOVUxMIHRlcm1pbmF0ZWQuCit2b2lkIGdldHVzZXJpbnB1dChjaGFyICpzdHJhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IHBhc3N3b3JkLAorCQkgIHVuc2lnbmVkIGludCBzaG93b2xkdmFsdWUpCit7CisgICAgdW5zaWduZWQgaW50IGM7CisgICAgY2hhciAqcCwgKnE7CQkvLyBwID0gY3VycmVudCBjaGFyIG9mIHN0cmluZywgcSA9IHRtcAorICAgIGNoYXIgKmxhc3Q7CQkJLy8gVGhlIGN1cnJlbnQgbGFzdCBjaGFyIG9mIHN0cmluZworICAgIGNoYXIgKnN0cjsJCQkvLyBwb2ludGVyIHRvIHN0cmluZyB3aGljaCBpcyBnb2luZyB0byBiZSBhbGxvY2F0ZWQKKyAgICBjaGFyIHJvdywgY29sOworICAgIGNoYXIgc3RhcnQsIGVuZDsJCS8vIEN1cnNvciBzaGFwZQorICAgIGNoYXIgZnVkZ2U7CQkJLy8gSG93IG1hbnkgY2hhcnMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBvdXRwdXQKKyAgICBjaGFyIGluc21vZGU7CQkvLyBBcmUgd2UgaW4gaW5zZXJ0IG9yIG92ZXJ3cml0ZQorCisgICAgZ2V0cG9zKCZyb3csICZjb2wsIDApOwkvLyBHZXQgY3VycmVudCBwb3NpdGlvbgorICAgIGdldGN1cnNvcnNoYXBlKCZzdGFydCwgJmVuZCk7CisgICAgaW5zbW9kZSA9IDE7CisKKyAgICBzdHIgPSAoY2hhciAqKW1hbGxvYyhzaXplICsgMSk7CS8vIEFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSB1c2VyIGlucHV0CisgICAgbWVtc2V0KHN0ciwgMCwgc2l6ZSArIDEpOwkvLyBaZXJvIGl0IG91dAorICAgIGlmIChwYXNzd29yZCAhPSAwKQorCXNob3dvbGR2YWx1ZSA9IDA7CS8vIFBhc3N3b3JkJ3MgbmV2ZXIgZGlzcGxheWVkCisKKyAgICBpZiAoc2hvd29sZHZhbHVlICE9IDApCisJc3RyY3B5KHN0ciwgc3RyYSk7CS8vIElmIHNob3cgb2xkIHZhbHVlIGNvcHkgY3VycmVudCB2YWx1ZQorCisgICAgbGFzdCA9IHN0cjsKKyAgICB3aGlsZSAoKmxhc3QpIHsKKwlsYXN0Kys7CisgICAgfQkJCQkvLyBGaW5kIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUKKyAgICBwID0gc3RyICsgc3RybGVuKHN0cik7CisKKyAgICBpZiAoaW5zbW9kZSA9PSAwKQorCXNldGN1cnNvcnNoYXBlKDEsIDcpOwkvLyBCbG9jayBjdXJzb3IKKyAgICBlbHNlCisJc2V0Y3Vyc29yc2hhcGUoNiwgNyk7CS8vIE5vcm1hbCBjdXJzb3IKKworICAgIC8vIEludmFyaWFudHM6IHAgaXMgdGhlIGN1cnJlbnQgY2hhcgorICAgIC8vIGNvbCBpcyB0aGUgY29ycmVzcG9uZGluZyBjb2x1bW4gb24gdGhlIHNjcmVlbgorICAgIGlmIChwYXNzd29yZCA9PSAwKQkJLy8gTm90IGEgcGFzc3dvcmQsIHByaW50IGluaXRpYWwgdmFsdWUKKyAgICB7CisJZ290b3h5KHJvdywgY29sKTsKKwljc3ByaW50KHN0ciwgR0VUU1RSQVRUUik7CisgICAgfQorICAgIHdoaWxlICgxKSB7CQkJLy8gRG8gZm9yZXZlcgorCWMgPSBnZXRfa2V5KHN0ZGluLCAwKTsKKwlpZiAoYyA9PSBLRVlfRU5URVIpCisJICAgIGJyZWFrOwkJLy8gVXNlciBoaXQgRW50ZXIgZ2V0b3V0IG9mIGxvb3AKKwlpZiAoYyA9PSBLRVlfRVNDKQkvLyBVc2VyIGhpdCBlc2NhcGUgZ2V0b3V0IGFuZCBudWxsaWZ5IHN0cmluZworCXsKKwkgICAgKnN0ciA9IDA7CisJICAgIGJyZWFrOworCX0KKwlmdWRnZSA9IDA7CisJLy8gaWYgc2NhbiBjb2RlIGlzIHJlZ29nbml6ZWQgZG8gc29tZXRoaW5nCisJLy8gZWxzZSBpZiBjaGFyIGNvZGUgaXMgcmVjb2duaXplZCBkbyBzb21ldGhpbmcKKwkvLyBlbHNlIGlnbm9yZQorCXN3aXRjaCAoYykgeworCWNhc2UgS0VZX0hPTUU6CisJICAgIHAgPSBzdHI7CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0VORDoKKwkgICAgcCA9IGxhc3Q7CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0xFRlQ6CisJICAgIGlmIChwID4gc3RyKQorCQlwLS07CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0NUUkwoS0VZX0xFRlQpOgorCSAgICBpZiAocCA9PSBzdHIpCisJCWJyZWFrOworCSAgICBpZiAoKnAgPT0gJyAnKQorCQl3aGlsZSAoKHAgPiBzdHIpICYmICgqcCA9PSAnICcpKQorCQkgICAgcC0tOworCSAgICBlbHNlIHsKKwkJaWYgKCoocCAtIDEpID09ICcgJykgeworCQkgICAgcC0tOworCQkgICAgd2hpbGUgKChwID4gc3RyKSAmJiAoKnAgPT0gJyAnKSkKKwkJCXAtLTsKKwkJfQorCSAgICB9CisJICAgIHdoaWxlICgocCA+IHN0cikgJiYgKCgqcCA9PSAnICcpIHx8ICgqKHAgLSAxKSAhPSAnICcpKSkKKwkJcC0tOworCSAgICBicmVhazsKKwljYXNlIEtFWV9SSUdIVDoKKwkgICAgaWYgKHAgPCBsYXN0KQorCQlwKys7CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0NUUkwoS0VZX1JJR0hUKToKKwkgICAgaWYgKCpwID09IDApCisJCWJyZWFrOwkJLy8gQXQgZW5kIG9mIHN0cmluZworCSAgICBpZiAoKnAgIT0gJyAnKQorCQl3aGlsZSAoKCpwICE9IDApICYmICgqcCAhPSAnICcpKQorCQkgICAgcCsrOworCSAgICB3aGlsZSAoKCpwICE9IDApICYmICgoKnAgPT0gJyAnKSAmJiAoKihwICsgMSkgIT0gJyAnKSkpCisJCXArKzsKKwkgICAgaWYgKCpwID09ICcgJykKKwkJcCsrOworCSAgICBicmVhazsKKwljYXNlIEtFWV9ERUw6CisJY2FzZSBLRVlfREVMRVRFOgorCSAgICBxID0gcDsKKwkgICAgd2hpbGUgKCoocSArIDEpKSB7CisJCSpxID0gKihxICsgMSk7CisJCXErKzsKKwkgICAgfQorCSAgICBpZiAobGFzdCA+IHN0cikKKwkJbGFzdC0tOworCSAgICBmdWRnZSA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0lOU0VSVDoKKwkgICAgaW5zbW9kZSA9IDEgLSBpbnNtb2RlOwkvLyBTd2l0Y2ggbW9kZQorCSAgICBpZiAoaW5zbW9kZSA9PSAwKQorCQlzZXRjdXJzb3JzaGFwZSgxLCA3KTsJLy8gQmxvY2sgY3Vyc29yCisJICAgIGVsc2UKKwkJc2V0Y3Vyc29yc2hhcGUoNiwgNyk7CS8vIE5vcm1hbCBjdXJzb3IKKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfQkFDS1NQQUNFOgkJLy8gTW92ZSBvdmVyIGJ5IG9uZQorCQlxID0gcDsKKwkJd2hpbGUgKHEgPD0gbGFzdCkgeworCQkgICAgKihxIC0gMSkgPSAqcTsKKwkJICAgIHErKzsKKwkJfQorCQlpZiAobGFzdCA+IHN0cikKKwkJICAgIGxhc3QtLTsKKwkJaWYgKHAgPiBzdHIpCisJCSAgICBwLS07CisJCWZ1ZGdlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfQ1RSTCgnVScpOgkvKiBDdHJsLVU6IGtpbGwgaW5wdXQgKi8KKwkJZnVkZ2UgPSBsYXN0IC0gc3RyOworCQl3aGlsZSAocCA+IHN0cikKKwkJICAgICpwLS0gPSAwOworCQlwID0gc3RyOworCQkqcCA9IDA7CisJCWxhc3QgPSBzdHI7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvLyBIYW5kbGUgaW5zZXJ0IGFuZCBvdmVyd3JpdGUgbW9kZQorCQlpZiAoKGMgPj0gJyAnKSAmJiAoYyA8IDEyOCkgJiYKKwkJICAgICgodW5zaWduZWQgaW50KShwIC0gc3RyKSA8IHNpemUgLSAxKSkgeworCQkgICAgaWYgKGluc21vZGUgPT0gMCkgewkvLyBPdmVyd3JpdGUgbW9kZQorCQkJaWYgKHAgPT0gbGFzdCkKKwkJCSAgICBsYXN0Kys7CisJCQkqbGFzdCA9IDA7CisJCQkqcCsrID0gYzsKKwkJICAgIH0gZWxzZSB7CS8vIEluc2VydCBtb2RlCisJCQlpZiAocCA9PSBsYXN0KSB7CS8vIGxhc3QgY2hhcgorCQkJICAgIGxhc3QrKzsKKwkJCSAgICAqbGFzdCA9IDA7CisJCQkgICAgKnArKyA9IGM7CisJCQl9IGVsc2UgewkvLyBOb24tbGFzdCBjaGFyCisJCQkgICAgcSA9IGxhc3QrKzsKKwkJCSAgICB3aGlsZSAocSA+PSBwKSB7CisJCQkJKnEgPSAqKHEgLSAxKTsKKwkJCQlxLS07CisJCQkgICAgfQorCQkJICAgICpwKysgPSBjOworCQkJfQorCQkgICAgfQorCQl9IGVsc2UKKwkJICAgIGJlZXAoKTsKKwkgICAgYnJlYWs7CisJfQorCS8vIE5vdyB0aGUgc3RyaW5nIGhhcyBiZWVuIG1vZGlmaWVkLCBwcmludCBpdAorCWlmIChwYXNzd29yZCA9PSAwKSB7CisJICAgIGdvdG94eShyb3csIGNvbCk7CisJICAgIGNzcHJpbnQoc3RyLCBHRVRTVFJBVFRSKTsKKwkgICAgaWYgKGZ1ZGdlID4gMCkKKwkJY3ByaW50KCcgJywgR0VUU1RSQVRUUiwgZnVkZ2UpOworCSAgICBnb3RveHkocm93LCBjb2wgKyAocCAtIHN0cikpOworCX0KKyAgICB9IC8qIHdoaWxlICovCisgICAgKnAgPSAnXDAnOworICAgIGlmIChwYXNzd29yZCA9PSAwKQorCWNzcHJpbnQoIlxyXG4iLCBHRVRTVFJBVFRSKTsKKyAgICBzZXRjdXJzb3JzaGFwZShzdGFydCwgZW5kKTsJLy8gQmxvY2sgY3Vyc29yCisgICAgLy8gSWYgdXNlciBoaXQgRVNDQVBFIHNvIHJldHVybiB3aXRob3V0IGFueSBjaGFuZ2VzCisgICAgaWYgKGMgIT0gS0VZX0VTQykKKwlzdHJjcHkoc3RyYSwgc3RyKTsKKyAgICBmcmVlKHN0cik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL0JveCBTdHVmZgorCisvLyBEcmF3IGJveCBhbmQgbGluZXMKK3ZvaWQgZHJhd2JveChjb25zdCBjaGFyIHRvcCwgY29uc3QgY2hhciBsZWZ0LCBjb25zdCBjaGFyIGJvdCwKKwkgICAgIGNvbnN0IGNoYXIgcmlnaHQsIGNvbnN0IGNoYXIgYXR0cikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHg7CisJcHV0Y2hhcihTTyk7CisgICAgLy8gVG9wIGJvcmRlcgorICAgIGdvdG94eSh0b3AsIGxlZnQpOworICAgIHB1dGNoKFRPUF9MRUZUX0NPUk5FUl9CT1JERVIsIGF0dHIpOworICAgIGNwcmludChUT1BfQk9SREVSLCBhdHRyLCByaWdodCAtIGxlZnQgLSAxKTsKKyAgICBwdXRjaChUT1BfUklHSFRfQ09STkVSX0JPUkRFUiwgYXR0cik7CisgICAgLy8gQm90dG9tIGJvcmRlcgorICAgIGdvdG94eShib3QsIGxlZnQpOworICAgIHB1dGNoKEJPVFRPTV9MRUZUX0NPUk5FUl9CT1JERVIsIGF0dHIpOworICAgIGNwcmludChCT1RUT01fQk9SREVSLCBhdHRyLCByaWdodCAtIGxlZnQgLSAxKTsKKyAgICBwdXRjaChCT1RUT01fUklHSFRfQ09STkVSX0JPUkRFUiwgYXR0cik7CisgICAgLy8gTGVmdCAmIHJpZ2h0IGJvcmRlcnMKKyAgICBmb3IgKHggPSB0b3AgKyAxOyB4IDwgYm90OyB4KyspIHsKKwlnb3RveHkoeCwgbGVmdCk7CisJcHV0Y2goTEVGVF9CT1JERVIsIGF0dHIpOworCWdvdG94eSh4LCByaWdodCk7CisJcHV0Y2goUklHSFRfQk9SREVSLCBhdHRyKTsKKyAgICB9CisJcHV0Y2hhcihTSSk7Cit9CisKK3ZvaWQgZHJhd2hvcml6bGluZShjb25zdCBjaGFyIHRvcCwgY29uc3QgY2hhciBsZWZ0LCBjb25zdCBjaGFyIHJpZ2h0LAorCQkgICBjb25zdCBjaGFyIGF0dHIsIGNoYXIgZHVtYikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHN0YXJ0LCBlbmQ7CisgICAgaWYgKGR1bWIgPT0gMCkgeworCXN0YXJ0ID0gbGVmdCArIDE7CisJZW5kID0gcmlnaHQgLSAxOworICAgIH0gZWxzZSB7CisJc3RhcnQgPSBsZWZ0OworCWVuZCA9IHJpZ2h0OworICAgIH0KKyAgICBnb3RveHkodG9wLCBzdGFydCk7CisJcHV0Y2hhcihTTyk7CisgICAgY3ByaW50KE1JRERMRV9CT1JERVIsIGF0dHIsIGVuZCAtIHN0YXJ0ICsgMSk7CisgICAgaWYgKGR1bWIgPT0gMCkgeworCWdvdG94eSh0b3AsIGxlZnQpOworCXB1dGNoKE1JRERMRV9CT1JERVIsIGF0dHIpOworCWdvdG94eSh0b3AsIHJpZ2h0KTsKKwlwdXRjaChNSURETEVfQk9SREVSLCBhdHRyKTsKKyAgICB9CisJcHV0Y2hhcihTSSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9saWJtZW51L3R1aS5oIGIvY29tMzIvY21lbnUvbGlibWVudS90dWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDU1NDg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvbGlibWVudS90dWkuaApAQCAtMCwwICsxLDc1IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA1IE11cmFsaSBLcmlzaG5hbiBHYW5hcGF0aHkgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfX1RVSV9IX18KKyNkZWZpbmUgX19UVUlfSF9fCisKKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGdldGtleS5oPgorI2luY2x1ZGUgPGNvbnNvbGVzLmg+CisjaW5jbHVkZSAic3lzbG54LmgiCisjaW5jbHVkZSAiY29tMzJpby5oIgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2VuZGlmCisKKyNkZWZpbmUgU08gJ1wwMTYnCisjZGVmaW5lIFNJICdcMDE3JworCisjZGVmaW5lIFRPUF9MRUZUX0NPUk5FUl9CT1JERVIgJ1wxNTQnCisjZGVmaW5lIFRPUF9CT1JERVIgJ1wxNjEnCisjZGVmaW5lIFRPUF9SSUdIVF9DT1JORVJfQk9SREVSICdcMTUzJworI2RlZmluZSBCT1RUT01fTEVGVF9DT1JORVJfQk9SREVSICdcMTU1JworI2RlZmluZSBCT1RUT01fQk9SREVSICdcMTYxJworI2RlZmluZSBCT1RUT01fUklHSFRfQ09STkVSX0JPUkRFUiAnXDE1MicKKyNkZWZpbmUgTEVGVF9CT1JERVIgJ1wxNzAnCisjZGVmaW5lIFJJR0hUX0JPUkRFUiAnXDE3MCcKKyNkZWZpbmUgTEVGVF9NSURETEVfQk9SREVSICdcMTY0JworI2RlZmluZSBNSURETEVfQk9SREVSICdcMTYxJworI2RlZmluZSBSSUdIVF9NSURETEVfQk9SREVSICdcMTY1JworCisjZGVmaW5lIEJFTEwgMHgwNworI2RlZmluZSBHRVRTVFJBVFRSIDB4MDcKKworLy8gR2VuZXJpYyB1c2VyIGlucHV0LAorLy8gcGFzc3dvcmQgPSAwIGlmZiBjaGFycyBlY2hvZWQgb24gc2NyZWVuCisvLyBzaG93b2xkdmFsdWUgPD4gMCBpZmYgY3VycmVudCBkaXNwbGF5ZWQgZm9yIGVkaXRpbmcKK3ZvaWQgZ2V0dXNlcmlucHV0KGNoYXIgKnN0ciwgdW5zaWduZWQgaW50IHNpemUsCisJCSAgdW5zaWduZWQgaW50IHBhc3N3b3JkLCB1bnNpZ25lZCBpbnQgc2hvd29sZHZhbHVlKTsKKworc3RhdGljIGlubGluZSB2b2lkIGdldHN0cmluZyhjaGFyICpzdHIsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIGdldHVzZXJpbnB1dChzdHIsIHNpemUsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZWRpdHN0cmluZyhjaGFyICpzdHIsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIGdldHVzZXJpbnB1dChzdHIsIHNpemUsIDAsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0cHdkKGNoYXIgKnN0ciwgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgZ2V0dXNlcmlucHV0KHN0ciwgc2l6ZSwgMSwgMCk7Cit9CisKK3ZvaWQgZHJhd2JveChjb25zdCBjaGFyLCBjb25zdCBjaGFyLCBjb25zdCBjaGFyLCBjb25zdCBjaGFyLAorCSAgICAgY29uc3QgY2hhcik7CisKKy8vIERyYXcgYSBob3Jpem9udGFsIGxpbmUKKy8vIGR1bWIgPT0gMSwgbWVhbnMganVzdCBkcmF3IHRoZSBsaW5lCisvLyBkdW1iID09IDAgbWVhbnMgY2hlY2sgdGhlIGZpcnN0IGFuZCBsYXN0IHBvc2l0aW9ucyBhbmQgZGVwZW5kaW5nIG9uIHdoYXQgaXMKKy8vICAgIGN1cnJlbnRseSBvbiB0aGUgc2NyZWVuIG1ha2UgaXQgYSBMVFJUIGFuZC9vciBSVExUIGFwcHJvcHJpYXRlbHkuCit2b2lkIGRyYXdob3JpemxpbmUoY29uc3QgY2hhciwgY29uc3QgY2hhciwgY29uc3QgY2hhciwgY29uc3QgY2hhciwKKwkJICAgY29uc3QgY2hhciBkdW1iKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9tZW51Z2VuLnB5IGIvY29tMzIvY21lbnUvbWVudWdlbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTY0ZDkzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvbWVudWdlbi5weQpAQCAtMCwwICsxLDMwNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBzeXMsIHJlLCBnZXRvcHQKKworY2xhc3MgTWVudXN5c3RlbToKKworICAgdHlwZXMgPSB7InJ1biIgICAgICA6ICJPUFRfUlVOIiwKKyAgICAgICAgICAgICJpbmFjdGl2ZSIgOiAiT1BUX0lOQUNUSVZFIiwKKyAgICAgICAgICAgICJjaGVja2JveCIgOiAiT1BUX0NIRUNLQk9YIiwKKyAgICAgICAgICAgICJyYWRpb21lbnUiOiAiT1BUX1JBRElPTUVOVSIsCisgICAgICAgICAgICAic2VwIiAgICAgIDogIk9QVF9TRVAiLAorICAgICAgICAgICAgImludmlzaWJsZSI6ICJPUFRfSU5WSVNJQkxFIiwKKyAgICAgICAgICAgICJyYWRpb2l0ZW0iOiAiT1BUX1JBRElPSVRFTSIsCisgICAgICAgICAgICAiZXhpdG1lbnUiIDogIk9QVF9FWElUTUVOVSIsCisgICAgICAgICAgICAibG9naW4iICAgIDogImxvZ2luIiwgIyBzcGVjaWFsIHR5cGUKKyAgICAgICAgICAgICJzdWJtZW51IiAgOiAiT1BUX1NVQk1FTlUifQorCisgICBlbnRyeV9pbml0ID0geyAiaXRlbSIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICJpbmZvIiA6ICIiLAorICAgICAgICAgICAgICAgICAgImRhdGEiIDogIiIsCisgICAgICAgICAgICAgICAgICAiaXBhcHBlbmQiIDogMCwgIyBmbGFnIHRvIHNlbmQgaW4gY2FzZSBvZiBQWEVMSU5VWAorICAgICAgICAgICAgICAgICAgImhlbHBpZCIgOiA2NTUzNSwgIyAweEZGRkYKKyAgICAgICAgICAgICAgICAgICJzaG9ydGN1dCI6Ii0xIiwKKyAgICAgICAgICAgICAgICAgICJzdGF0ZSIgIDogMCwgIyBpbml0aWFsIHN0YXRlIG9mIGNoZWNrYm94ZXMKKyAgICAgICAgICAgICAgICAgICJhcmdzbWVudSI6ICIiLCAjIG5hbWUgb2YgbWVudSBjb250YWluaW5nIGFyZ3VtZW50cworICAgICAgICAgICAgICAgICAgInBlcm1zIiAgOiAiIiwgIyBwZXJtaXNzaW9uIHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBlbnRyeQorICAgICAgICAgICAgICAgICAgIl91cGRhdGVkIiA6IE5vbmUsICMgaGFzIHRoaXMgZGljdGlvbmFyeSBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAgICAgICAgICJ0eXBlIiA6ICJydW4iIH0KKworICAgbWVudV9pbml0ID0geyAgInRpdGxlIiA6ICIiLAorICAgICAgICAgICAgICAgICAgInJvdyIgOiAiMHhGRiIsICMgbGV0IHN5c3RlbSBkZWNpZGUgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICJjb2wiIDogIjB4RkYiLAorICAgICAgICAgICAgICAgICAgIl91cGRhdGVkIiA6IE5vbmUsCisgICAgICAgICAgICAgICAgICAibmFtZSIgOiAiIiB9CisKKyAgIHN5c3RlbV9pbml0ID17ICJ2aWRlb21vZGUiIDogIjB4RkYiLAorICAgICAgICAgICAgICAgICAgInRpdGxlIiA6ICJNZW51IFN5c3RlbSIsCisgICAgICAgICAgICAgICAgICAidG9wIiA6ICIxIiwKKyAgICAgICAgICAgICAgICAgICJsZWZ0IiA6ICIxIiAsCisgICAgICAgICAgICAgICAgICAiYm90IiA6ICIyMSIsCisgICAgICAgICAgICAgICAgICAicmlnaHQiOiI3OSIsCisgICAgICAgICAgICAgICAgICAiaGVscGRpciIgOiAiL2lzb2xpbnV4L2hlbHAiLAorICAgICAgICAgICAgICAgICAgInB3ZGZpbGUiIDogIiIsCisgICAgICAgICAgICAgICAgICAicHdkcm93IiAgOiAiMjMiLAorICAgICAgICAgICAgICAgICAgImVkaXRyb3ciIDogIjIzIiwKKyAgICAgICAgICAgICAgICAgICJza2lwY29uZG4iICA6ICIwIiwKKyAgICAgICAgICAgICAgICAgICJza2lwY21kIiA6ICIuZXhpdCIsCisgICAgICAgICAgICAgICAgICAic3RhcnRmaWxlIjogIiIsCisgICAgICAgICAgICAgICAgICAib25lcnJvcmNtZCI6Ii5yZXBlYXQiLAorICAgICAgICAgICAgICAgICAgImV4aXRjbWQiICA6ICIuZXhpdCIsCisgICAgICAgICAgICAgICAgICAiZXhpdGNtZHJvb3QiICA6ICIiLAorICAgICAgICAgICAgICAgICAgInRpbWVvdXQiICA6ICI2MDAiLAorICAgICAgICAgICAgICAgICAgInRpbWVvdXRjbWQiOiIuYmVlcCIsCisgICAgICAgICAgICAgICAgICAidG90YWx0aW1lb3V0IiA6ICIwIiwKKyAgICAgICAgICAgICAgICAgICJ0b3RhbHRpbWVvdXRjbWQiIDogIi53YWl0IgorICAgICAgICAgICAgICAgICB9CisKKyAgIHNoaWZ0X2ZsYWdzID0geyAiYWx0IiAgOiAiQUxUX1BSRVNTRUQiLAorICAgICAgICAgICAgICAgICAgICJjdHJsIiA6ICJDVFJMX1BSRVNTRUQiLAorICAgICAgICAgICAgICAgICAgICJzaGlmdCI6ICJTSElGVF9QUkVTU0VEIiwKKyAgICAgICAgICAgICAgICAgICAiY2FwcyIgOiAiQ0FQU0xPQ0tfT04iLAorICAgICAgICAgICAgICAgICAgICJudW0iICA6ICJOVU1MT0NLX09OIiwKKyAgICAgICAgICAgICAgICAgICAiaW5zIiAgOiAiSU5TRVJUX09OIgorICAgICAgICAgICAgICAgICB9CisKKyAgIHJlcWRfdGVtcGxhdGVzID0gWyJpdGVtIiwibG9naW4iLCJtZW51Iiwic3lzdGVtIl0KKworICAgZGVmIF9faW5pdF9fKHNlbGYsdGVtcGxhdGUpOgorICAgICAgIHNlbGYuc3RhdGUgPSAic3lzdGVtIgorICAgICAgIHNlbGYuY29kZV90ZW1wbGF0ZV9maWxlbmFtZSA9IHRlbXBsYXRlCisgICAgICAgc2VsZi5tZW51cyA9IFtdCisgICAgICAgc2VsZi5pbml0X2VudHJ5KCkKKyAgICAgICBzZWxmLmluaXRfbWVudSgpCisgICAgICAgc2VsZi5pbml0X3N5c3RlbSgpCisgICAgICAgc2VsZi52dHlwZXMgPSAiIE9SICIuam9pbihsaXN0KHNlbGYudHlwZXMua2V5cygpKSkKKyAgICAgICBzZWxmLnZhdHRycyA9ICIgT1IgIi5qb2luKFt4IGZvciB4IGluIGxpc3Qoc2VsZi5lbnRyeS5rZXlzKCkpIGlmIHhbMF0gIT0gIl8iXSkKKyAgICAgICBzZWxmLm1hdHRycyA9ICIgT1IgIi5qb2luKFt4IGZvciB4IGluIGxpc3Qoc2VsZi5tZW51LmtleXMoKSkgaWYgeFswXSAhPSAiXyJdKQorCisgICBkZWYgaW5pdF9lbnRyeShzZWxmKToKKyAgICAgICBzZWxmLmVudHJ5ID0gc2VsZi5lbnRyeV9pbml0LmNvcHkoKQorCisgICBkZWYgaW5pdF9tZW51KHNlbGYpOgorICAgICAgIHNlbGYubWVudSA9IHNlbGYubWVudV9pbml0LmNvcHkoKQorCisgICBkZWYgaW5pdF9zeXN0ZW0oc2VsZik6CisgICAgICAgc2VsZi5zeXN0ZW0gPSBzZWxmLnN5c3RlbV9pbml0LmNvcHkoKQorCisgICBkZWYgYWRkX21lbnUoc2VsZixuYW1lKToKKyAgICAgICBzZWxmLmFkZF9pdGVtKCkKKyAgICAgICBzZWxmLmluaXRfbWVudSgpCisgICAgICAgc2VsZi5tZW51WyJuYW1lIl0gPSBuYW1lCisgICAgICAgc2VsZi5tZW51WyJfdXBkYXRlZCJdID0gMQorICAgICAgIHNlbGYubWVudXMuYXBwZW5kKCAoc2VsZi5tZW51LFtdKSApCisKKyAgIGRlZiBhZGRfaXRlbShzZWxmKToKKyAgICAgICBpZiBzZWxmLm1lbnVbIl91cGRhdGVkIl06ICMgbWVudSBkZXRhaWxzIGhhdmUgY2hhbmdlZAorICAgICAgICAgIHNlbGYubWVudXNbLTFdWzBdLnVwZGF0ZShzZWxmLm1lbnUpCisgICAgICAgICAgc2VsZi5pbml0X21lbnUoKQorICAgICAgIGlmIHNlbGYuZW50cnlbIl91cGRhdGVkIl06CisgICAgICAgICAgaWYgbm90IHNlbGYuZW50cnlbImluZm8iXToKKyAgICAgICAgICAgICBzZWxmLmVudHJ5WyJpbmZvIl0gPSBzZWxmLmVudHJ5WyJkYXRhIl0KKyAgICAgICAgICBpZiBub3Qgc2VsZi5tZW51czoKKyAgICAgICAgICAgICBwcmludCgiRXJyb3IgYmVmb3JlIGxpbmUgJWQiICUgc2VsZi5saW5lbm8pCisgICAgICAgICAgICAgcHJpbnQoIlJFQVNPTjogbWVudSBtdXN0IGJlIGRlY2xhcmVkIGJlZm9yZSBhIG1lbnUgaXRlbSBpcyBkZWNsYXJlZCIpCisgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgICBzZWxmLm1lbnVzWy0xXVsxXS5hcHBlbmQoc2VsZi5lbnRyeSkKKyAgICAgICBzZWxmLmluaXRfZW50cnkoKQorCisgICBkZWYgc2V0X2l0ZW0oc2VsZixuYW1lLHZhbHVlKToKKyAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmVudHJ5OgorICAgICAgICAgIG1zZyA9IFsiVW5rbm93biBhdHRyaWJ1dGUgJXMgaW4gbGluZSAlZCIgJSAobmFtZSxzZWxmLmxpbmVubyldCisgICAgICAgICAgbXNnLmFwcGVuZCgiUkVBU09OOiBBdHRyaWJ1dGUgbXVzdCBiZSBvbmUgb2YgJXMiICUgc2VsZi52YXR0cnMpCisgICAgICAgICAgcmV0dXJuICJcbiIuam9pbihtc2cpCisgICAgICAgaWYgbmFtZT09InR5cGUiIGFuZCB2YWx1ZSBub3QgaW4gc2VsZi50eXBlczoKKyAgICAgICAgICBtc2cgPSBbICJVbnJlY29nbml6ZWQgdHlwZSAlcyBpbiBsaW5lICVkIiAlICh2YWx1ZSxzZWxmLmxpbmVubyldCisgICAgICAgICAgbXNnLmFwcGVuZCgiUkVBU09OOiBWYWxpZCB0eXBlcyBhcmUgJXMiICUgc2VsZi52dHlwZXMpCisgICAgICAgICAgcmV0dXJuICJcbiIuam9pbihtc2cpCisgICAgICAgaWYgbmFtZT09InNob3J0Y3V0IjoKKyAgICAgICAgICBpZiAodmFsdWUgIT0gIi0xIikgYW5kIG5vdCByZS5tYXRjaCgiXltBLVphLXowLTldJCIsdmFsdWUpOgorICAgICAgICAgICAgIG1zZyA9IFsgIkludmFsaWQgc2hvcnRjdXQgY2hhciAnJXMnIGluIGxpbmUgJWQiICUgKHZhbHVlLHNlbGYubGluZW5vKSBdCisgICAgICAgICAgICAgbXNnLmFwcGVuZCgiUkVBU09OOiBWYWxpZCB2YWx1ZXMgYXJlIFtBLVphLXowLTldIikKKyAgICAgICAgICAgICByZXR1cm4gIlxuIi5qb2luKG1zZykKKyAgICAgICAgICBlbGlmIHZhbHVlICE9ICItMSI6IHZhbHVlID0gIiclcyciICUgdmFsdWUKKyAgICAgICBlbGlmIG5hbWUgaW4gWyJzdGF0ZSIsImhlbHBpZCIsImlwYXBwZW5kIl06CisgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZSkKKyAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgIHJldHVybiAiVmFsdWUgb2YgJXMgaW4gbGluZSAlZCBtdXN0IGJlIGFuIGludGVnZXIiICUgKG5hbWUsc2VsZi5saW5lbm8pCisgICAgICAgc2VsZi5lbnRyeVtuYW1lXSA9IHZhbHVlCisgICAgICAgc2VsZi5lbnRyeVsiX3VwZGF0ZWQiXSA9IDEKKyAgICAgICByZXR1cm4gIiIKKworICAgZGVmIHNldF9tZW51KHNlbGYsbmFtZSx2YWx1ZSk6CisgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5tZW51OgorICAgICAgICAgIHJldHVybiAiRXJyb3I6IFVua25vd24ga2V5d29yZCAlcyIgJSBuYW1lCisgICAgICAgc2VsZi5tZW51W25hbWVdID0gdmFsdWUKKyAgICAgICBzZWxmLm1lbnVbIl91cGRhdGVkIl0gPSAxCisgICAgICAgcmV0dXJuICIiCisKKyAgIGRlZiBzZXRfc3lzdGVtKHNlbGYsbmFtZSx2YWx1ZSk6CisgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5zeXN0ZW06CisgICAgICAgICAgcmV0dXJuICJFcnJvcjogVW5rbm93biBrZXl3b3JkICVzIiAlIG5hbWUKKyAgICAgICBpZiBuYW1lID09ICJza2lwY29uZG4iOgorICAgICAgICAgIHRyeTogIyBpcyBza2lwY29uZG4gYSBudW1iZXI/CisgICAgICAgICAgICAgYSA9IGludCh2YWx1ZSkKKyAgICAgICAgICBleGNlcHQ6ICMgaXQgaXMgYSAiLSIgZGVsaW1pdGVkIHNlcXVlbmNlCisgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5sb3dlcigpCisgICAgICAgICAgICAgcGFydHMgPSBbIHNlbGYuc2hpZnRfZmxhZ3MuZ2V0KHguc3RyaXAoKSxOb25lKSBmb3IgeCBpbiB2YWx1ZS5zcGxpdCgiLSIpIF0KKyAgICAgICAgICAgICBzZWxmLnN5c3RlbVsic2tpcGNvbmRuIl0gPSAiIHwgIi5qb2luKFtfZiBmb3IgX2YgaW4gcGFydHMgaWYgX2ZdKQorICAgICAgIGVsc2U6CisgICAgICAgICAgc2VsZi5zeXN0ZW1bbmFtZV0gPSB2YWx1ZQorCisgICBkZWYgc2V0KHNlbGYsbmFtZSx2YWx1ZSk6CisgICAgICAgIyByZW1vdmUgcXVvdGVzIGlmIGdpdmVuCisgICAgICAgaWYgKHZhbHVlWzBdID09IHZhbHVlWy0xXSkgYW5kICh2YWx1ZVswXSBpbiBbJyInLCInIl0pOiAjIHJlbW92ZSBxdW90ZXMKKyAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzE6LTFdCisgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSAic3lzdGVtIjoKKyAgICAgICAgICBlcnIgPSBzZWxmLnNldF9zeXN0ZW0obmFtZSx2YWx1ZSkKKyAgICAgICAgICBpZiBub3QgZXJyOiByZXR1cm4KKyAgICAgICBpZiBzZWxmLnN0YXRlID09ICJtZW51IjoKKyAgICAgICAgICBlcnIgPSBzZWxmLnNldF9tZW51KG5hbWUsdmFsdWUpCisgICAgICAgICAgIyBjaGFuZ2Ugc3RhdGUgdG8gZW50cnkgaXQgbWVudSByZXR1cm5zIGVycm9yCisgICAgICAgICAgaWYgZXJyOgorICAgICAgICAgICAgIGVyciA9IE5vbmUKKyAgICAgICAgICAgICBzZWxmLnN0YXRlID0gIml0ZW0iCisgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSAiaXRlbSI6CisgICAgICAgICAgZXJyID0gc2VsZi5zZXRfaXRlbShuYW1lLHZhbHVlKQorCisgICAgICAgaWYgbm90IGVycjogcmV0dXJuCisKKyAgICAgICAjIGFsbCBlcnJvcnMgc28gcmV0dXJuIGl0ZW0ncyBlcnJvciBtZXNzYWdlCisgICAgICAgcHJpbnQoZXJyKQorICAgICAgIHN5cy5leGl0KDEpCisKKyAgIGRlZiBwcmludF9lbnRyeShzZWxmLGVudHJ5LGZkKToKKyAgICAgICBlbnRyeVsidHlwZSJdID0gc2VsZi50eXBlc1tlbnRyeVsidHlwZSJdXQorICAgICAgIGlmIGVudHJ5WyJ0eXBlIl0gPT0gImxvZ2luIjogI3NwZWNpYWwgdHlwZQorICAgICAgICAgIGZkLndyaXRlKHNlbGYudGVtcGxhdGVzWyJsb2dpbiJdICUgZW50cnkpCisgICAgICAgZWxzZToKKyAgICAgICAgICBmZC53cml0ZShzZWxmLnRlbXBsYXRlc1siaXRlbSJdICUgZW50cnkpCisKKyAgIGRlZiBwcmludF9tZW51KHNlbGYsbWVudSxmZCk6CisgICAgICAgaWYgbWVudVsibmFtZSJdID09ICJtYWluIjogc2VsZi5mb3VuZG1haW4gPSAxCisgICAgICAgZmQud3JpdGUoc2VsZi50ZW1wbGF0ZXNbIm1lbnUiXSAlIG1lbnUpCisgICAgICAgaWYgKG1lbnVbInJvdyJdICE9ICIweEZGIikgb3IgKG1lbnVbImNvbCJdICE9ICIweEZGIik6CisgICAgICAgICAgZmQud3JpdGUoJyAgc2V0X21lbnVfcG9zKCUocm93KXMsJShjb2wpcyk7XG4nICUgbWVudSkKKworCisgICBkZWYgb3V0cHV0KHNlbGYsZmlsZW5hbWUpOgorICAgICAgIGN1cnJfdGVtcGxhdGUgPSBOb25lCisgICAgICAgY29udGVudHMgPSBbXQorICAgICAgIHNlbGYudGVtcGxhdGVzID0ge30KKyAgICAgICByZWdiZWcgPSByZS5jb21waWxlKHIiXi0tKD9QPG5hbWU+W2Etel0rKSBCRUdJTlM/LS1cbiQiKQorICAgICAgIHJlZ2VuZCA9IHJlLmNvbXBpbGUociJeLS1bYS16XSsgRU5EUz8tLVxuJCIpCisgICAgICAgaWZkID0gb3BlbihzZWxmLmNvZGVfdGVtcGxhdGVfZmlsZW5hbWUsInIiKQorICAgICAgIGZvciBsaW5lIGluIGlmZC5yZWFkbGluZXMoKToKKyAgICAgICAgICAgYiA9IHJlZ2JlZy5tYXRjaChsaW5lKQorICAgICAgICAgICBlID0gcmVnZW5kLm1hdGNoKGxpbmUpCisgICAgICAgICAgIGlmIGU6ICMgZW5kIG9mIHRlbXBsYXRlCisgICAgICAgICAgICAgIGlmIGN1cnJfdGVtcGxhdGU6CisgICAgICAgICAgICAgICAgIHNlbGYudGVtcGxhdGVzW2N1cnJfdGVtcGxhdGVdID0gIiIuam9pbihjb250ZW50cykKKyAgICAgICAgICAgICAgY3Vycl90ZW1wbGF0ZSA9IE5vbmUKKyAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgaWYgYjoKKyAgICAgICAgICAgICAgY3Vycl90ZW1wbGF0ZSA9IGIuZ3JvdXAoIm5hbWUiKQorICAgICAgICAgICAgICBjb250ZW50cyA9IFtdCisgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgIGlmIG5vdCBjdXJyX3RlbXBsYXRlOiBjb250aW51ZSAjIGxpbmVzIGJldHdlZW4gdGVtcGxhdGVzIGFyZSBpZ25vcmVkCisgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChsaW5lKQorICAgICAgIGlmZC5jbG9zZSgpCisKKyAgICAgICBtaXNzaW5nID0gTm9uZQorICAgICAgIGZvciB4IGluIHNlbGYucmVxZF90ZW1wbGF0ZXM6CisgICAgICAgICAgIGlmIHggbm90IGluIHNlbGYudGVtcGxhdGVzOiBtaXNzaW5nID0geAorICAgICAgIGlmIG1pc3Npbmc6CisgICAgICAgICAgIHByaW50KCJUZW1wbGF0ZSAlcyByZXF1aXJlZCBidXQgbm90IGRlZmluZWQgaW4gJXMiICUgKG1pc3Npbmcsc2VsZi5jb2RlX3RlbXBsYXRlX2ZpbGVuYW1lKSkKKworICAgICAgIGlmIGZpbGVuYW1lID09ICItIjoKKyAgICAgICAgICBmZCA9IHN5cy5zdGRvdXQKKyAgICAgICBlbHNlOiBmZCA9IG9wZW4oZmlsZW5hbWUsInciKQorICAgICAgIHNlbGYuZm91bmRtYWluID0gTm9uZQorICAgICAgIGZkLndyaXRlKHNlbGYudGVtcGxhdGVzWyJoZWFkZXIiXSkKKyAgICAgICBmZC53cml0ZShzZWxmLnRlbXBsYXRlc1sic3lzdGVtIl0gJSBzZWxmLnN5c3RlbSkKKyAgICAgICBmb3IgKG1lbnUsaXRlbXMpIGluIHNlbGYubWVudXM6CisgICAgICAgICAgIHNlbGYucHJpbnRfbWVudShtZW51LGZkKQorICAgICAgICAgICBmb3IgZW50cnkgaW4gaXRlbXM6IHNlbGYucHJpbnRfZW50cnkoZW50cnksZmQpCisgICAgICAgZmQud3JpdGUoc2VsZi50ZW1wbGF0ZXNbImZvb3RlciJdKQorICAgICAgIGZkLmNsb3NlKCkKKyAgICAgICBpZiBub3Qgc2VsZi5mb3VuZG1haW46CisgICAgICAgICAgcHJpbnQoIm1haW4gbWVudSBub3QgZm91bmQiKQorICAgICAgICAgIHByaW50KHNlbGYubWVudXMpCisgICAgICAgICAgc3lzLmV4aXQoMSkKKworICAgZGVmIGlucHV0KHNlbGYsZmlsZW5hbWUpOgorICAgICAgIGlmIGZpbGVuYW1lID09ICItIjoKKyAgICAgICAgICBmZCA9IHN5cy5zdGRpbgorICAgICAgIGVsc2U6IGZkID0gb3BlbihmaWxlbmFtZSwiciIpCisgICAgICAgc2VsZi5saW5lbm8gPSAwCisgICAgICAgc2VsZi5zdGF0ZSA9ICJzeXN0ZW0iCisgICAgICAgZm9yIGxpbmUgaW4gZmQucmVhZGxpbmVzKCk6CisgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQorICAgICAgICAgaWYgbGluZSBhbmQgbGluZVstMV0gaW4gWyJcciIsIlxuIl06IGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgIGlmIGxpbmUgYW5kIGxpbmVbLTFdIGluIFsiXHIiLCJcbiJdOiBsaW5lID0gbGluZVs6LTFdCisgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICBpZiBsaW5lIGFuZCBsaW5lWzBdIGluIFsiIyIsIjsiXTogY29udGludWUKKworICAgICAgICAgdHJ5OgorICAgICAgICAgICAjIGJsYW5rIGxpbmUgLT4gc3RhcnRpbmcgYSBuZXcgZW50cnkKKyAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gIml0ZW0iOiBzZWxmLmFkZF9pdGVtKCkKKyAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAjIHN0YXJ0aW5nIGEgbmV3IHNlY3Rpb24/CisgICAgICAgICAgIGlmIGxpbmVbMF0gPT0gIlsiIGFuZCBsaW5lWy0xXSA9PSAiXSI6CisgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAibWVudSIKKyAgICAgICAgICAgICAgc2VsZi5hZGRfbWVudShsaW5lWzE6LTFdKQorICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICMgYWRkIHByb3BlcnR5IG9mIGN1cnJlbnQgZW50cnkKKyAgICAgICAgICAgcG9zID0gbGluZS5maW5kKCI9IikgIyBmaW5kIHRoZSBmaXJzdCA9IGluIHN0cmluZworICAgICAgICAgICBpZiBwb3MgPCAwOgorICAgICAgICAgICAgICBwcmludCgiU3ludGF4IGVycm9yIGluIGxpbmUgJWQiICUgc2VsZi5saW5lbm8pCisgICAgICAgICAgICAgIHByaW50KCJSRUFTT046IG5vbi1zZWN0aW9uIGxpbmVzIG11c3QgYmUgb2YgdGhlIGZvcm0gQVRUUklCVVRFPVZBTFVFIikKKyAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgICAgYXR0ciA9IGxpbmVbOnBvc10uc3RyaXAoKS5sb3dlcigpCisgICAgICAgICAgIHZhbHVlID0gbGluZVtwb3MrMTpdLnN0cmlwKCkKKyAgICAgICAgICAgc2VsZi5zZXQoYXR0cix2YWx1ZSkKKyAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHByaW50KCJFcnJvciB3aGlsZSBwYXJzaW5nIGxpbmUgJWQ6ICVzIiAlIChzZWxmLmxpbmVubyxsaW5lKSkKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgZmQuY2xvc2UoKQorICAgICAgIHNlbGYuYWRkX2l0ZW0oKQorCitkZWYgdXNhZ2UoKToKKyAgICBwcmludChzeXMuYXJndlswXSwiIFtvcHRpb25zXSIpCisgICAgcHJpbnQoIi0taW5wdXQ9PGZpbGU+ICAgIGlzIHRoZSBuYW1lIG9mIHRoZSAubWVudSBmaWxlIGRlY2xhcmluZyB0aGUgbWVudSBzdHJ1Y3R1cmUiKQorICAgIHByaW50KCItLW91dHB1dD08ZmlsZT4gICBpcyB0aGUgbmFtZSBvZiBnZW5lcmF0ZWQgQyBzb3VyY2UiKQorICAgIHByaW50KCItLXRlbXBsYXRlPTxmaWxlPiBpcyB0aGUgbmFtZSBvZiB0ZW1wbGF0ZSB0byBiZSB1c2VkIikKKyAgICBwcmludCgpCisgICAgcHJpbnQoImlucHV0IGFuZCBvdXRwdXQgZGVmYXVsdCB0byAtIChzdGRpbiBhbmQgc3Rkb3V0IHJlc3BlY3RpdmVseSkiKQorICAgIHByaW50KCJ0ZW1wbGF0ZSBkZWZhdWx0cyB0byBhZHZfbWVudS50cGwiKQorICAgIHN5cy5leGl0KDEpCisKK2RlZiBtYWluKCk6CisgICAgdGZpbGUgPSAiYWR2X21lbnUudHBsIgorICAgIGlmaWxlID0gIi0iCisgICAgb2ZpbGUgPSAiLSIKKyAgICBvcHRzLGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImhpOm86dDoiLFsiaW5wdXQ9Iiwib3V0cHV0PSIsInRlbXBsYXRlPSIsImhlbHAiXSkKKyAgICBpZiBhcmdzOgorICAgICAgIHByaW50KCJVbmtub3duIG9wdGlvbnMgJXMiICUgYXJncykKKyAgICAgICB1c2FnZSgpCisgICAgZm9yIG8sYSBpbiBvcHRzOgorICAgICAgICBpZiBvIGluIFsiLWkiLCItLWlucHV0Il06CisgICAgICAgICAgIGlmaWxlID0gYQorICAgICAgICBlbGlmIG8gaW4gWyItbyIsICItLW91dHB1dCJdOgorICAgICAgICAgICBvZmlsZSA9IGEKKyAgICAgICAgZWxpZiBvIGluIFsiLXQiLCItLXRlbXBsYXRlIl06CisgICAgICAgICAgIHRmaWxlID0gYQorICAgICAgICBlbGlmIG8gaW4gWyItaCIsIi0taGVscCJdOgorICAgICAgICAgICB1c2FnZSgpCisKKyAgICBpbnN0ID0gTWVudXN5c3RlbSh0ZmlsZSkKKyAgICBpbnN0LmlucHV0KGlmaWxlKQorICAgIGluc3Qub3V0cHV0KG9maWxlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgbWFpbigpCmRpZmYgLS1naXQgYS9jb20zMi9jbWVudS9wYXNzd29yZCBiL2NvbTMyL2NtZW51L3Bhc3N3b3JkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYWZmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jbWVudS9wYXNzd29yZApAQCAtMCwwICsxLDE4IEBACisjIFRoaXMgZmlsZSBzaG91bGQgYmUgYXZhaWxhYmxlIGFzIC9pc29saW51eC9wYXNzd29yZAorIyBmb3IgY29tcGxleC5jIHRvIHVzZS4KKyMKKyMgQWxsIGxpbmVzIHN0YXJ0aW5nIHdpdGggIyBhbmQgZW1wdHkgbGluZXMgYXJlIGlnbm9yZWQKKyMKKyMgQWxsIG5vbi1jb21tZW50IGxpbmVzIGhlcmUgYXJlIG9mIHRoZSBmb3JtCisjIFVTRVJOQU1FOlBXREhBU0g6UEVSTTE6UEVSTTI6Li4uOgorIworIyB3aGVyZSBVU0VSTkFNRSBpcyBtYXhpbXVtIG9mIDEyIGNoYXJzLAorIyBQV0RIQVNIIGlzIG1heGltdW0gb2YgNDAgY2hhcnMgKERFUyBFTkNSWVBURUQpCisjIFBFUk0xLC4uLiBhcmUgYXJiaXRyYXJ5IHN0cmluZ3MKKyMKKyMgVGhlIGN1cnJlbnQgbGluZXMgY29ycmVzcG9uZCB0bworIyB1c2VyMTpzZWNyZXQxLCB1c2VyMjpzZWNyZXQyLCB1c2VyMzpzZWNyZXQzCisKK3VzZXIxOkxjTVJvM1laR3RQMGM6ZWRpdGNtZAordXNlcjI6RnFld3p5eFA3OGE3QToKK3VzZXIzOk1Lam1jLklIb1hCTlU6cm9vdApkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvc2ltcGxlLmMgYi9jb20zMi9jbWVudS9zaW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk2NjlmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvY21lbnUvc2ltcGxlLmMKQEAgLTAsMCArMSw4MiBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNSBNdXJhbGkgS3Jpc2huYW4gR2FuYXBhdGh5IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCAqKSAwKQorI2VuZGlmCisKKyNpbmNsdWRlICJjbWVudS5oIgorI2luY2x1ZGUgImNvbTMyaW8uaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IG1haW4odm9pZCkKK3sKKyAgICB0X21lbnVpdGVtICpjdXJyOworCisgICAgLy8gQ2hhbmdlIHRoZSB2aWRlbyBtb2RlIGhlcmUKKyAgICAvLyBzZXR2aWRlb21vZGUoMCkKKworICAgIC8vIENob29zZSB0aGUgZGVmYXVsdCB0aXRsZSBhbmQgc2V0dXAgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBhdHRyaWJ1dGVzLi4uLgorICAgIGluaXRfbWVudXN5c3RlbShOVUxMKTsKKyAgICBzZXRfd2luZG93X3NpemUoMSwgMSwgMjMsIDc4KTsJLy8gTGVhdmUgb25lIHJvdy9jb2wgYm9yZGVyIGFsbCBhcm91bmQKKworICAgIC8vIENob29zZSB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBhdHRyaWJ1dGVzIGFuZCBjaGFyJ3MKKyAgICAvLyAtMSBtZWFucyBjaG9vc2UgZGVmYXVsdHMgKEFjdHVhbGx5IHRoZSBuZXh0IDQgbGluZXMgYXJlIG5vdCBuZWVkZWQpCisgICAgLy9zZXRfbm9ybWFsX2F0dHIgKC0xLC0xLC0xLC0xKTsKKyAgICAvL3NldF9zdGF0dXNfaW5mbyAoLTEsLTEpOworICAgIC8vc2V0X3RpdGxlX2luZm8gICgtMSwtMSk7CisgICAgLy9zZXRfbWlzY19pbmZvKC0xLC0xLC0xLC0xKTsKKworICAgIC8vIG1lbnVpbmRleCA9IGFkZF9uYW1lZF9tZW51KCJuYW1lIiwiIE1lbnUgVGl0bGUgIiwtMSk7CisgICAgLy8gYWRkX2l0ZW0oIkl0ZW0gc3RyaW5nIiwiU3RhdHVzIFN0cmluZyIsVFlQRSwiYW55IHN0cmluZyIsTlVNKQorICAgIC8vICAgVFlQRSA9IE9QVF9SVU4gfCBPUFRfRVhJVE1FTlUgfCBPUFRfU1VCTUVOVSB8IE9QVF9DSEVDS0JPWCB8IE9QVF9JTkFDVElWRQorICAgIC8vICAgImFueSBzdHJpbmciIHVzZWZ1bCBmb3Igc3RvcmluZyBrZXJuZWwgbmFtZXMKKyAgICAvLyAgIEluIGNhc2Ugb2YgT1BUX1NVQk1FTlUsICJhbnkgc3RyaW5nIiBjYW4gYmUgc2V0IHRvICJuYW1lIiBvZiBtZW51IHRvIGJlIGxpbmtlZAorICAgIC8vICAgaW4gd2hpY2ggY2FzZSB2YWx1ZSBOVU0gaXMgaWdub3JlZAorICAgIC8vICAgTlVNID0gaW5kZXggb2Ygc3VibWVudSBpZiBPUFRfU1VCTUVOVSwKKyAgICAvLyAgICAgICAgIDAvMSBkZWZhdWx0IGNoZWNrZWQgc3RhdGUgaWYgT1BUX0NIRUNLQk9YCisgICAgLy8gICAgICAgICB1bnVzZWQgb3RoZXJ3aXNlLgorCisgICAgYWRkX25hbWVkX21lbnUoInRlc3RpbmciLCAiIFRlc3RpbmcgIiwgLTEpOworICAgIGFkZF9pdGVtKCJTZWxmIExvb3AiLCAiR28gdG8gdGVzdGluZyIsIE9QVF9TVUJNRU5VLCAidGVzdGluZyIsIDApOworICAgIGFkZF9pdGVtKCJNZW1vcnkgVGVzdCIsICJQZXJmb3JtIGV4dGVuc2l2ZSBtZW1vcnkgdGVzdGluZyIsIE9QVF9SVU4sCisJICAgICAibWVtdGVzdCIsIDApOworICAgIGFkZF9pdGVtKCJFeGl0IHRoaXMgbWVudSIsICJHbyBvbmUgbGV2ZWwgdXAiLCBPUFRfRVhJVE1FTlUsICJleGl0IiwgMCk7CisKKyAgICBhZGRfbmFtZWRfbWVudSgicmVzY3VlIiwgIiBSZXNjdWUgT3B0aW9ucyAiLCAtMSk7CisgICAgYWRkX2l0ZW0oIkxpbnV4IFJlc2N1ZSIsICJsaW5yZXNjIiwgT1BUX1JVTiwgImxpbnJlc2MiLCAwKTsKKyAgICBhZGRfaXRlbSgiRG9zIFJlc2N1ZSIsICJkb3NyZXNjIiwgT1BUX1JVTiwgImRvc3Jlc2MiLCAwKTsKKyAgICBhZGRfaXRlbSgiV2luZG93cyBSZXNjdWUiLCAid2lucmVzYyIsIE9QVF9SVU4sICJ3aW5yZXNjIiwgMCk7CisgICAgYWRkX2l0ZW0oIkV4aXQgdGhpcyBtZW51IiwgIkdvIG9uZSBsZXZlbCB1cCIsIE9QVF9FWElUTUVOVSwgImV4aXQiLCAwKTsKKworICAgIGFkZF9uYW1lZF9tZW51KCJtYWluIiwgIiBNYWluIE1lbnUgIiwgLTEpOworICAgIGFkZF9pdGVtKCJQcmVwYXJlIiwgInByZXAiLCBPUFRfUlVOLCAicHJlcCIsIDApOworICAgIGFkZF9pdGVtKCJSZXNjdWUgb3B0aW9ucy4uLiIsICJUcm91Ymxlc2hvb3QgYSBzeXN0ZW0iLCBPUFRfU1VCTUVOVSwKKwkgICAgICJyZXNjdWUiLCAwKTsKKyAgICBhZGRfaXRlbSgiVGVzdGluZy4uLiIsICJPcHRpb25zIHRvIHRlc3QgaGFyZHdhcmUiLCBPUFRfU1VCTUVOVSwgInRlc3RpbmciLAorCSAgICAgMCk7CisgICAgYWRkX2l0ZW0oIkV4aXQgdG8gcHJvbXB0IiwgIkV4aXQgdGhlIG1lbnUgc3lzdGVtIiwgT1BUX0VYSVRNRU5VLCAiZXhpdCIsIDApOworCisgICAgY3VyciA9IHNob3dtZW51cyhmaW5kX21lbnVfbnVtKCJtYWluIikpOwkvLyBJbml0aWFsIG1lbnUgaXMgdGhlIG9uZSBjYWxsZWQgIm1haW4iCisKKyAgICBpZiAoY3VycikgeworCWlmIChjdXJyLT5hY3Rpb24gPT0gT1BUX1JVTikgeworCSAgICBpZiAoaXNzeXNsaW51eCgpKQorCQlydW5zeXNsaW51eGNtZChjdXJyLT5kYXRhKTsKKwkgICAgZWxzZQorCQljc3ByaW50KGN1cnItPmRhdGEsIDB4MDcpOworCSAgICByZXR1cm4gMTsKKwl9CisJY3NwcmludCgiRXJyb3IgaW4gcHJvZ3JhbW1pbmchIiwgMHgwNyk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvY21lbnUvdGVzdC5tZW51IGIvY29tMzIvY21lbnUvdGVzdC5tZW51Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MWM1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jbWVudS90ZXN0Lm1lbnUKQEAgLTAsMCArMSw2MCBAQAorIyBjaG9vc2UgZGVmYXVsdCB0aXRsZQordGl0bGUgPSAiQSB0ZXN0IG9mIHRoZSB0ZXN0Lm1lbnUgZmlsZSIKK3RvcCA9IDEKK2xlZnQgPSAxCitib3QgPSAyMworcmlnaHQgPSA3OAorCitbdGVzdGluZ10KK3RpdGxlID0gIiBUZXN0aW5nICIKKworaXRlbT0iU2VsZiBMb29wIgoraW5mbz0iR28gdG8gVGVzdGluZyIKK3R5cGU9c3VibWVudQorZGF0YT10ZXN0aW5nCisKK2l0ZW09Ik1lbW9yeSBUZXN0IgoraW5mbz0iUGVyZm9ybSBleHRlbnNpdmUgbWVtb3J5IHRlc3RpbmciCitkYXRhPSJtZW10ZXN0IgorCitpdGVtPSJFeGl0IHRoaXMgbWVudSIKK2luZm89IkdvIG9uZSBsZXZlbCB1cCIKK3R5cGU9ZXhpdG1lbnUKKworW3Jlc2N1ZV0KK3RpdGxlID0gIiBSZXNjdWUgT3B0aW9ucyAiCityb3cgPSAxMAorY29sID0gMTAKKworaXRlbT0iTGludXggUmVzY3VlIgorZGF0YT0ibGlucmVzYyIKKworaXRlbT0iRG9zIFJlc2N1ZSIKK2RhdGE9ImRvc3Jlc2MiCisKK2l0ZW09IldpbmRvd3MgUmVzY3VlIgorZGF0YT0id2lucmVzYyIKKworaXRlbT0iRXhpdCB0aGlzIG1lbnUiCitpbmZvPSJHbyBvbmUgbGV2ZWwgdXAiCit0eXBlPWV4aXRtZW51CisKK1ttYWluXQordGl0bGUgPSAiIE1haW4gTWVudSAiCisKK2l0ZW09IlByZXBhcmUiCitkYXRhPSJwcmVwIgorCitpdGVtPSJSZXNjdWUgb3B0aW9ucy4uLiIKK2luZm89IlRyb3VibGVzaG9vdCBhIHN5c3RlbSIKK3R5cGU9c3VibWVudQorZGF0YT0icmVzY3VlIgorCitpdGVtPSJUZXN0aW5nLi4uIgoraW5mbz0iT3B0aW9ucyB0byB0ZXN0IGhhcmR3YXJlIgordHlwZT1zdWJtZW51CitkYXRhPSJ0ZXN0aW5nIgorCitpdGVtPSJFeGl0IHRoaXMgbWVudSIKK2luZm89IkdvIG9uZSBsZXZlbCB1cCIKK3R5cGU9ZXhpdG1lbnUKZGlmZiAtLWdpdCBhL2NvbTMyL2NtZW51L3Rlc3QyLm1lbnUgYi9jb20zMi9jbWVudS90ZXN0Mi5tZW51Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzBkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9jbWVudS90ZXN0Mi5tZW51CkBAIC0wLDAgKzEsMTQyIEBACisKK3RpdGxlPSIgQ09NQk9PVCBNZW51IFN5c3RlbSAiCisKKyMgbG9jYXRpb24gb2YgaGVscCBkaXJlY3RvcnkKK2hlbHBkaXI9Ii9pc29saW51eC9oZWxwIgorcHdkZmlsZT0iL2lzb2xpbnV4L3Bhc3N3b3JkIgorCisjIHNraXAgdGhlIG1lbnUgaWYgc2hpZnQgaXMgcHJlc3NlZCBvciBDYXBzIGlzIG9uCisjIGlmIHRoZSBtZW51IGlzIHNraXBwZWQgcnVuICJza2lwY21kIgorIyBpbiBvdXIgY2FzZSB3ZSBydW4gdGhlIE9TIG9uIHRoZSBmaXJzdCBoYXJkZGlzaworc2tpcGNvbmRuPXNoaWZ0LWNhcHMKK3NraXBjbWQ9ImNoYWluLmMzMiBoZCAwIgorCisjIHBlcnNvbiB3aXRoIHJvb3QgcHJpdmlsZWdlcyBjYW4gZXhpdCBtZW51CisjIG90aGVycyBqdXN0IHJlcGVhdAorZXhpdGNtZD0iLmV4aXQiCitvbmVycm9yY21kPSIuYmVlcCAyICUgJSAuaGVscCBobHAwMDAyNS50eHQgJSAuZXhpdCIKKworc3RhcnRmaWxlPSJobHAwMDAyNi50eHQiCisKK3RpbWVvdXRjbWQ9Ii53YWl0IgordG90YWx0aW1lb3V0Y21kPSJjaGFpbi5jMzIgaGQgMCIKKworW25ldG1lbnVdCit0aXRsZT0iIEluaXQgTmV0d29yayAiCisKK2l0ZW09IjxOPm9uZSIKK2luZm89IkRvbnQgc3RhcnQgbmV0d29yayIKK3R5cGU9cmFkaW9pdGVtCitkYXRhPSJuZXR3b3JrPW5vIgorCitpdGVtPSI8ZD5oY3AiCitpbmZvPSJVc2UgREhDUCIKK3R5cGU9cmFkaW9pdGVtCitkYXRhPSJuZXR3b3JrPWRoY3AiCisKK1t0ZXN0aW5nXQordGl0bGU9IiBUZXN0aW5nICIKKworaXRlbT0iPE0+ZW1vcnkgVGVzdCIKK2luZm89IlBlcmZvcm0gZXh0ZW5zaXZlIG1lbW9yeSB0ZXN0aW5nIgorZGF0YT0ibWVtdGVzdCIKK2hlbHBpZD0yNQoraXBhcHBlbmQ9MworCitpdGVtPSI8ST5udmlzaWJsZSIKK2luZm89IllvdSBkb250IHNlZSB0aGlzIgordHlwZT1pbnZpc2libGUKKworaXRlbT0iPEU+eGl0IG1lbnUiCitpbmZvPSJHbyBvbmUgbGV2ZWwgdXAiCit0eXBlPWV4aXRtZW51CisKK1tyZXNjdWVdCit0aXRsZT0iIFJlc2N1ZSBPcHRpb25zICIKKworaXRlbT0iPEw+aW51eCBSZXNjdWUiCitpbmZvPSJSdW4gbGlucmVzYyIKK2RhdGE9ImxpbnJlc2MiCisKK2l0ZW09IjxEPm9zIFJlc2N1ZSIKK2luZm89ImRvc3Jlc2MiCitkYXRhPSJkb3NyZXNjIgorCitpdGVtPSI8Vz5pbmRvd3MgUmVzY3VlIgoraW5mbz0id2lucmVzYyIKK2RhdGE9IndpbnJlc2MiCisKK2l0ZW09IjxFPnhpdCB0aGlzIG1lbnUiCitpbmZvPSJHbyBvbmUgbGV2ZWwgdXAiCit0eXBlPWV4aXRtZW51CisKK1twcmVwXQordGl0bGU9IiBQcmVwIG9wdGlvbnMgIgorCitpdGVtPSI8Yj5hc2V1cmwgYnkgSVA/IgoraW5mbz0iU3BlY2lmeSBndWkgYmFzZXVybCBieSBJUCBhZGRyZXNzIgordHlwZT1jaGVja2JveAorZGF0YT0iYmFzZXVybD1odHRwOi8vMTkyLjE2OC4wLjEiCisKK2l0ZW09IjxtPm91bnRjZD8iCitpbmZvPSJNb3VudCB0aGUgY2Ryb20gZHJpdmU/IgordHlwZT1jaGVja2JveAorZGF0YT0ibW91bnRjZCIKKworaXRlbT0iTmV0d29yayBJbml0aWFsaXphdGlvbiIKK2luZm89IkhvdyB0byBpbml0aWFsaXNlIG5ldHdvcmsgZGV2aWNlPyIKK3R5cGU9cmFkaW9tZW51CitkYXRhPSJuZXRtZW51IgorCit0eXBlPXNlcAorCitpdGVtPSJSZWluc3RhbGwgPHc+aW5kb3dzIgoraW5mbz0iUmUtaW5zdGFsbCB0aGUgd2luZG93cyBzaWRlIG9mIGEgZHVhbCBib290IHNldHVwIgordHlwZT1jaGVja2JveAorZGF0YT0icmVwYWlyPXdpbiIKKworaXRlbT0iUmVpbnN0YWxsIDxsPmludXgiCitpbmZvPSJSZS1pbnN0YWxsIHRoZSBsaW51eCBzaWRlIG9mIGEgZHVhbCBib290IHNldHVwIgordHlwZT1jaGVja2JveAorZGF0YT0icmVwYWlyPWxpbiIKKwordHlwZT1zZXAKKworaXRlbT0iPFI+dW4gcHJlcCBub3ciCitpbmZvPSJFeGVjdXRlIHByZXAgd2l0aCB0aGUgYWJvdmUgb3B0aW9ucyIKK2RhdGE9InByZXAiCithcmdzbWVudT0icHJlcCIKKworaXRlbT0iPEU+eGl0IHRoaXMgbWVudSIKK2luZm89IkdvIHVwIG9uZSBsZXZlbCIKK3R5cGU9ZXhpdG1lbnUKKworW21haW5dCisKK3RpdGxlPSIgTWFpbiBNZW51ICIKKwordHlwZT1sb2dpbgorCitpdGVtPSI8UD5yZXBhcmUiCitpbmZvPSJwcmVwIgorZGF0YT0icHJlcCIKKworaXRlbT0iPFA+cmVwIG9wdGlvbnMuLi4iCitpbmZvPSJPcHRpb25zIGZvciBwcmVwIgordHlwZT1zdWJtZW51CitkYXRhPSJwcmVwIgorCitpdGVtPSI8Uj5lc2N1ZSBvcHRpb25zLi4uIgoraW5mbz0iVHJvdWJsZXNob290IGEgc3lzdGVtIgordHlwZT1zdWJtZW51CitkYXRhPSJyZXNjdWUiCitoZWxwaWQ9MjYKKworaXRlbT0iPFQ+ZXN0aW5nLi4uIgoraW5mbz0iT3B0aW9ucyB0byB0ZXN0IGhhcmR3YXJlIgordHlwZT1zdWJtZW51CitkYXRhPSJ0ZXN0aW5nIgorCitpdGVtPSI8RT54aXQgdG8gcHJvbXB0IgoraW5mbz0iRXhpdCB0aGUgbWVudSBzeXN0ZW0iCit0eXBlPWV4aXRtZW51CmRpZmYgLS1naXQgYS9jb20zMi9lbGZsaW5rL01ha2VmaWxlIGIvY29tMzIvZWxmbGluay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2UxYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZWxmbGluay9NYWtlZmlsZQpAQCAtMCwwICsxLDM2IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNT0RVTEVTID0gCitURVNURklMRVMgPQorCithbGw6ICQoTU9EVUxFUykgJChURVNURklMRVMpCisKK3Rlc3RfbWVtYWxpZ24uZWxmIDogdGVzdF9tZW1hbGlnbi5vICAkKExJQlMpICQoQ19MSUJTKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJF4KKwordGVzdF9jb20zMi5lbGY6IENGTEFHUyArPSAtREVMRl9ERUJVRwordGVzdF9jb20zMi5lbGY6IHRlc3RfY29tMzIubyAuLi9saWIvbGliY29tMzJtaW4uYSAkKExJQkdDQykKKwkkKExEKSAtbiAkKExERkxBR1MpIC1vICRAIHRlc3RfY29tMzIubyAkKExJQkdDQykgLS13aG9sZS1hcmNoaXZlIC4uL2xpYi9saWJjb20zMm1pbi5hIC1NYXAgdGVzdF9jb20zMi5tYXAKKwordGlkeSBkaXN0OgorCXJtIC1mICoubyAqLmxvICouYSAqLmxzdCAqLmVsZiAuKi5kICoubWFwCisKK2NsZWFuOiB0aWR5CisJcm0gLWYgKi5sc3MgKi5jMzIgKi5sbnggKi5jb20KKworc3BvdGxlc3M6IGNsZWFuCisJcm0gLWYgKn4gXCMqCisKK2luc3RhbGw6CisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9NYWtlZmlsZSBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQ4ZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZWxmbGluay9sZGxpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsNTkgQEAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMjAxMS0yMDEzIEludGVsIENvcnBvcmF0aW9uIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvZWxmLm1rCisKK0NGTEFHUyArPSAtSSQodG9wZGlyKS9jb3JlL2VsZmxpbmsgLUkkKHRvcGRpcikvY29yZS9pbmNsdWRlIC1JJCh0b3BkaXIpL2NvbTMyL2xpYiAtZnZpc2liaWxpdHk9aGlkZGVuCitMSUJTID0gLS13aG9sZS1hcmNoaXZlICQob2JqZGlyKS9jb20zMi9saWIvbGliY29tMzJtaW4uYQorCitPQkpTID0gbGRsaW51eC5vIGNsaS5vIHJlYWRjb25maWcubyByZWZzdHIubyBjb2xvcnMubyBnZXRhZHYubyBhZHYubyBcCisJZXhlY3V0ZS5vIGNoYWluYm9vdC5vIGtlcm5lbC5vIGdldF9rZXkubyBhZHZ3cml0ZS5vIHNldGFkdi5vIFwKKwlsb2FkaGlnaC5vIG1zZy5vCisKK0JUQVJHRVQgPSAkKExETElOVVgpCisKK2lmZGVmIEVGSV9CVUlMRAorJS5lJChCSVRTKTogJS5lbGYKKwkkKE9CSkNPUFkpIC0tc3RyaXAtZGVidWcgLS1zdHJpcC11bm5lZWRlZCAkPCAkQAorU09OQU1FID0gJChwYXRzdWJzdCAlLmVsZiwlLmUkKEJJVFMpLCQoQEYpKQorZWxzZQorU09OQU1FID0gJChwYXRzdWJzdCAlLmVsZiwlLmMzMiwkKEBGKSkKK2VuZGlmCisKK2FsbDogJChCVEFSR0VUKSBsZGxpbnV4X2xueC5hCisKK2xkbGludXguZWxmIDogJChPQkpTKQorCSQoTEQpICQoTERGTEFHUykgLXNvbmFtZSAkKFNPTkFNRSkgLW8gJEAgJF4gJChMSUJTKQorCitMTlhDRkxBR1MgKz0gLURfX2V4cG9ydD0nX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSknCitMTlhMSUJPQkpTID0gZ2V0X2tleS5sbworbGRsaW51eF9sbnguYTogJChMTlhMSUJPQkpTKQorCXJtIC1mICRACisJJChBUikgY3EgJEAgJChMTlhMSUJPQkpTKQorCSQoUkFOTElCKSAkQAorCit0aWR5IGRpc3Q6CisJcm0gLWYgKi5vICoubG8gKi5hICoubHN0IC4qLmQgCisKK2NsZWFuOiB0aWR5CisJcm0gLWYgKi5sc3MgKi5sbnggKi5jb20KKworc3BvdGxlc3M6IGNsZWFuCisJcm0gLWYgKn4gXCMqICQoQlRBUkdFVCkKKworaW5zdGFsbDogYWxsCisJbWtkaXIgLW0gNzU1IC1wICQoSU5TVEFMTFJPT1QpJChBVVhESVIpCisJaW5zdGFsbCAtbSA2NDQgJChCVEFSR0VUKSAkKElOU1RBTExST09UKSQoQVVYRElSKQorCisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9hZHYuYyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9hZHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JiZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZWxmbGluay9sZGxpbnV4L2Fkdi5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC9hZHYuYworICoKKyAqIEFjY2VzcyB0aGUgc3lzbGludXggYXV4aWxsaWFyeSBkYXRhIHZlY3RvcgorICovCisKKyNpbmNsdWRlIDxzeXNsaW51eC9hZHYuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYWR2Lmg+CisKK3ZvaWQgX19jb25zdHJ1Y3RvciBfX3N5c2xpbnV4X2luaXQodm9pZCkKK3sKKwlmaXJtd2FyZS0+YWR2X29wcy0+aW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZWxmbGluay9sZGxpbnV4L2FkdndyaXRlLmMgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvYWR2d3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2U0NTUzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZWxmbGluay9sZGxpbnV4L2FkdndyaXRlLmMKQEAgLTAsMCArMSw0MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4L2FkdndyaXRlLmMKKyAqCisgKiBXcml0ZSBiYWNrIHRoZSBBRFYKKyAqLworCisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9hZHYuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9maXJtd2FyZS5oPgorCitfX2V4cG9ydCBpbnQgc3lzbGludXhfYWR2X3dyaXRlKHZvaWQpCit7CisgICAgcmV0dXJuIGZpcm13YXJlLT5hZHZfb3BzLT53cml0ZSgpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZWxmbGluay9sZGxpbnV4L2NoYWluYm9vdC5jIGIvY29tMzIvZWxmbGluay9sZGxpbnV4L2NoYWluYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDQ2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvY2hhaW5ib290LmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDEyIEludGVsIENvcnBvcmF0aW9uLCBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjaGFpbmJvb3RpbmcgLSByZXBsYWNlIHRoZSBjdXJyZW50IGJvb3Rsb2FkZXIgY29tcGxldGVseS4gIFRoaXMKKyAqIGlzIEJJT1Mtc3BlY2lmaWMuCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisKKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN5cy9leGVjLmg+CisjaW5jbHVkZSA8c3lzL2lvLmg+CisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgIm1lbnUuaCIKKyNpbmNsdWRlICJmcy5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxvY2FsYm9vdC5oIgorI2luY2x1ZGUgImJpb3MuaCIKKworI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3QuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9ib290cm0uaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorCit2b2lkIGNoYWluYm9vdF9maWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVpbnQzMl90IHR5cGUpCit7CisgICAgdWludDhfdCBrZWVwcHhlID0gMDsKKyAgICBjb25zdCB1bmlvbiBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8gKnNkaTsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfcm1fcmVncyByZWdzOworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqZnJhZ2xpc3QgPSBOVUxMOworICAgIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKm1tYXAgPSBOVUxMOworICAgIHN0cnVjdCBjb20zMl9maWxlZGF0YSBmZDsKKyAgICBjb20zMnN5c190IHJlZzsKKyAgICBjaGFyICpzdGFjazsKKyAgICB2b2lkICpidWY7CisgICAgaW50IHJ2LCBtYXgsIHNpemU7CisgICAgCisgICAgbWF4ID0gMHhBMDAwMDsJCS8qIE1heGltdW0gbG9hZCAqLworICAgIGJ1ZiA9IG1hbGxvYyhtYXgpOworICAgIGlmICghYnVmKQorCWdvdG8gYmFpbDsKKyAgICAKKyAgICBydiA9IG9wZW5fZmlsZShmaWxlLCBPX1JET05MWSwgJmZkKTsKKyAgICBpZiAocnYgPT0gLTEpCisJZ290byBiYWlsOworICAgIAorICAgIHJlZy5lYXgubCA9IG1heDsKKyAgICByZWcuZWJ4LmwgPSAwOworICAgIHJlZy5lZHgud1swXSA9IDA7CisgICAgcmVnLmVkaS5sID0gKHVpbnQzMl90KWJ1ZjsKKyAgICByZWcuZWJwLmwgPSAtMTsJLyogWFhYOiBsaW1pdD8gKi8KKyAgICByZWcuZXNpLndbMF0gPSBydjsKKworICAgIHBtX2xvYWRfaGlnaCgmcmVnKTsKKworICAgIHNpemUgPSByZWcuZWRpLmwgLSAodW5zaWduZWQgbG9uZylidWY7CisgICAgaWYgKHNpemUgPiAweEEwMDAwIC0gMHg3QzAwKSB7CisJcHJpbnRmKCJUb28gbGFyZ2UgZm9yIGEgYm9vc3RyYXAgKG5lZWQgTElOVVggaW5zdGVhZCBvZiBLRVJORUw/KVxuIik7CisJZ290byBiYWlsOworICAgIH0KKworICAgIG1tYXAgPSBzeXNsaW51eF9tZW1vcnlfbWFwKCk7CisgICAgaWYgKCFtbWFwKQorCWdvdG8gYmFpbDsKKworICAgIHNkaSA9IHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbygpOworCisgICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOworICAgIHJlZ3MuaXAgPSAweDdjMDA7CisKKyAgICBpZiAoc2RpLT5jLmZpbGVzeXN0ZW0gPT0gU1lTTElOVVhfRlNfU1lTTElOVVggfHwKKwlzZGktPmMuZmlsZXN5c3RlbSA9PSBTWVNMSU5VWF9GU19FWFRMSU5VWCkgeworCWlmIChzeXNsaW51eF9hZGRfbW92ZWxpc3QoJmZyYWdsaXN0LCAweDgwMCAtIDE4LAorCQkJCSAgKGFkZHJfdClzZGktPnIuZXNieCwgMTYpKQorCSAgICBnb3RvIGJhaWw7CisKKwkvKiBEUzpTSSBwb2ludHMgdG8gcGFydGl0aW9uIGluZm8gKi8KKwlyZWdzLmVzaS5sID0gMHg4MDAgLSAxODsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBhIEJTUyBib290IHNlY3RvciB3ZSBoYXZlIHRvIHRyYW5zZmVyIHRoZQorICAgICAqIHN1cGVyYmxvY2suCisgICAgICovCisgICAgaWYgKHNkaS0+Yy5maWxlc3lzdGVtID09IFNZU0xJTlVYX0ZTX1NZU0xJTlVYICYmCisJdHlwZSA9PSBJTUFHRV9UWVBFX0JTUyAmJiB0aGlzX2ZzLT5mc19vcHMtPmNvcHlfc3VwZXIoYnVmKSkKKwlnb3RvIGJhaWw7CisKKyAgICBpZiAoc2RpLT5jLmZpbGVzeXN0ZW0gPT0gU1lTTElOVVhfRlNfUFhFTElOVVgpIHsKKwlrZWVwcHhlID0gMHgwMzsJCS8qIENoYWlubG9hZGluZyArIGtlZXAgUFhFICovCisJc3RhY2sgPSAoY2hhciAqKXNkaS0+ci5mc3NpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIHJlZ2lzdGVycyB3aXRoIHRoZWlyIGluaXRpYWwgdmFsdWVzCisJICovCisKKwlyZWdzLmVheC5sID0gKih1aW50MzJfdCAqKSZzdGFja1szNl07CisJcmVncy5lY3gubCA9ICoodWludDMyX3QgKikmc3RhY2tbMzJdOworCXJlZ3MuZWR4LmwgPSAqKHVpbnQzMl90ICopJnN0YWNrWzI4XTsKKwlyZWdzLmVieC5sID0gKih1aW50MzJfdCAqKSZzdGFja1syNF07CisJcmVncy5lc3AubCA9IHNkaS0+cnIuci5lc2kud1swXSArIDQ0OworCXJlZ3MuZWJwLmwgPSAqKHVpbnQzMl90ICopJnN0YWNrWzE2XTsKKwlyZWdzLmVzaS5sID0gKih1aW50MzJfdCAqKSZzdGFja1sxMl07CisJcmVncy5lZGkubCA9ICoodWludDMyX3QgKikmc3RhY2tbOF07CisJcmVncy5lcyA9ICoodWludDE2X3QgKikmc3RhY2tbNF07CisJcmVncy5zcyA9IHNkaS0+cnIuci5mczsKKwlyZWdzLmRzID0gKih1aW50MTZfdCAqKSZzdGFja1s2XTsKKwlyZWdzLmZzID0gKih1aW50MTZfdCAqKSZzdGFja1syXTsKKwlyZWdzLmdzID0gKih1aW50MTZfdCAqKSZzdGFja1swXTsKKyAgICB9IGVsc2UgeworCWNvbnN0IHVpbnQxNl90ICplc2RpID0gKGNvbnN0IHVpbnQxNl90ICopc2RpLT5kaXNrLmVzZGlfcHRyOworCisJcmVncy5lc3AubCA9ICh1aW50MTZfdCkodW5zaWduZWQgbG9uZylTdGFja0J1ZiArIDQ0OworCisJLyoKKwkgKiBET04nVCBETyBUSElTIEZPUiBQWEVMSU5VWC4uLgorCSAqIEZvciBQWEUsIEVTOkJYIC0+IFBYRU5WKywgYW5kIHRoaXMgd291bGQKKwkgKiBjb3JydXB0IHRoYXQgdXNlLgorCSAqCisJICogUmVzdG9yZSBFUzpESSAtPiAkUG5QIChpZiB3ZSB3ZXJlIG91cnNlbHZlcworCSAqIGNhbGxlZCB0aGF0IHdheS4uLikKKwkgKi8KKwlyZWdzLmVkaS53WzBdID0gZXNkaVswXTsgLyogTmV3IERJICovCisJcmVncy5lcyAgICAgICA9IGVzZGlbMl07IC8qIE5ldyBFUyAqLworCisJcmVncy5lZHgubCAgICA9IHNkaS0+cnIuci5lZHguYlswXTsgLyogRHJpdmUgbnVtYmVyIC0+IERMICovCisgICAgfQorCisgICAgaWYgKHN5c2xpbnV4X2FkZF9tb3ZlbGlzdCgmZnJhZ2xpc3QsIDB4N2MwMCwgKGFkZHJfdClidWYsIHNpemUpKQorCWdvdG8gYmFpbDsKKworICAgIHN5c2xpbnV4X3NodWZmbGVfYm9vdF9ybShmcmFnbGlzdCwgbW1hcCwga2VlcHB4ZSwgJnJlZ3MpOworCitiYWlsOgorICAgIGlmIChmcmFnbGlzdCkKKwlzeXNsaW51eF9mcmVlX21vdmVsaXN0KGZyYWdsaXN0KTsKKyAgICBpZiAobW1hcCkKKwlzeXNsaW51eF9mcmVlX21lbW1hcChtbWFwKTsKKyAgICBpZiAoYnVmKQorCWZyZWUoYnVmKTsKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9jb20zMi9lbGZsaW5rL2xkbGludXgvY2xpLmMgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmMzBjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9jbGkuYwpAQCAtMCwwICsxLDQ4NiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYWR2Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxzeXMvZXhlYy5oPgorI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorCisjaW5jbHVkZSAiZ2V0a2V5LmgiCisjaW5jbHVkZSAibWVudS5oIgorI2luY2x1ZGUgImNsaS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjbGlfaGlzdG9yeV9oZWFkOworCit2b2lkIGNsZWFyX3NjcmVlbih2b2lkKQoreworICAgIC8vZHByaW50ZigiZW50ZXIiKTsKKyAgICBmcHV0cygiXDAzM2VcMDMzJUBcMDMzKTBcMDMzKEJcMSMwXDAzM1s/MjVsXDAzM1sySiIsIHN0ZG91dCk7Cit9CisKK3N0YXRpYyBpbnQgbXlnZXRrZXlfdGltZW91dChjbG9ja190ICprYmRfdG8sIGNsb2NrX3QgKnR0bykKK3sKKyAgICBjbG9ja190IHQwLCB0MTsKKyAgICBpbnQga2V5OworCisgICAgdDAgPSB0aW1lcyhOVUxMKTsKKyAgICBrZXkgPSBnZXRfa2V5KHN0ZGluLCAqa2JkX3RvID8gKmtiZF90byA6ICp0dG8pOworCisgICAgLyoga2JkdGltZW91dCBvbmx5IGFwcGxpZXMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciAqLworICAgIGlmICgqa2JkX3RvKQorCSprYmRfdG8gPSAwOworCisgICAgdDEgPSB0aW1lcyhOVUxMKSAtIHQwOworICAgIGlmICgqdHRvKSB7CisJLyogVGltZWQgb3V0LiAqLworCWlmICgqdHRvIDw9IChsb25nIGxvbmcpdDEpCisJICAgIGtleSA9IEtFWV9OT05FOworCWVsc2UgeworCSAgICAvKiBEaWQgaXQgd3JhcD8gKi8KKwkgICAgaWYgKCp0dG8gPiB0b3RhbHRpbWVvdXQpCisJCWtleSA9IEtFWV9OT05FOworCisJICAgICp0dG8gLT0gdDE7CisJfQorICAgIH0KKworICAgIHJldHVybiBrZXk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY21kX3JldmVyc2Vfc2VhcmNoKGludCAqY3Vyc29yLCBjbG9ja190ICprYmRfdG8sCisJCQkJICAgICAgIGNsb2NrX3QgKnR0bykKK3sKKyAgICBpbnQga2V5OworICAgIGludCBpID0gMDsKKyAgICBjaGFyIGJ1ZltNQVhfQ01ETElORV9MRU5dOworICAgIGNvbnN0IGNoYXIgKnAgPSBOVUxMOworICAgIHN0cnVjdCBjbGlfY29tbWFuZCAqbGFzdF9mb3VuZDsKKyAgICBzdHJ1Y3QgY2xpX2NvbW1hbmQgKmxhc3RfZ29vZCA9IE5VTEw7CisKKyAgICBsYXN0X2ZvdW5kID0gbGlzdF9lbnRyeShjbGlfaGlzdG9yeV9oZWFkLm5leHQsIHR5cGVvZigqbGFzdF9mb3VuZCksIGxpc3QpOworCisgICAgbWVtc2V0KGJ1ZiwgMCwgTUFYX0NNRExJTkVfTEVOKTsKKworICAgIHByaW50ZigiXDAzM1sxR1wwMzNbMTszNm0ocmV2ZXJzZS1pLXNlYXJjaClgJzogXDAzM1swbSIpOworICAgIHdoaWxlICgxKSB7CisJa2V5ID0gbXlnZXRrZXlfdGltZW91dChrYmRfdG8sIHR0byk7CisKKwlpZiAoa2V5ID09IEtFWV9DVFJMKCdDJykpIHsKKwkgICAgcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmIChrZXkgPT0gS0VZX0NUUkwoJ1InKSkgeworCSAgICBpZiAoaSA9PSAwKQorCQljb250aW51ZTsgLyogVXNlciB0eXBlZCBub3RoaW5nIHlldCAqLworCSAgICAvKiBVc2VyIHR5cGVkICdDVFJMLVInIGFnYWluLCBzbyB0cnkgdGhlIG5leHQgKi8KKwkgICAgbGFzdF9mb3VuZCA9IGxpc3RfZW50cnkobGFzdF9mb3VuZC0+bGlzdC5uZXh0LCB0eXBlb2YoKmxhc3RfZm91bmQpLCBsaXN0KTsKKwl9IGVsc2UgaWYgKGtleSA+PSAnICcgJiYga2V5IDw9ICd6JykgeworCSAgICAgICAgYnVmW2krK10gPSBrZXk7CisJfSBlbHNlIHsKKwkgICAgLyogVHJlYXQgb3RoZXIgaW5wdXQgY2hhcnMgYXMgdGVybWluYWwgKi8KKwkgICAgYnJlYWs7CisJfQorCisJd2hpbGUgKGxhc3RfZm91bmQpIHsKKwkgICAgcCA9IHN0cnN0cihsYXN0X2ZvdW5kLT5jb21tYW5kLCBidWYpOworCSAgICBpZiAocCkKKwkgICAgICAgIGJyZWFrOworCisJICAgIGlmIChsaXN0X2lzX2xhc3QoJmxhc3RfZm91bmQtPmxpc3QsICZjbGlfaGlzdG9yeV9oZWFkKSkKKwkJYnJlYWs7CisKKwkgICAgbGFzdF9mb3VuZCA9IGxpc3RfZW50cnkobGFzdF9mb3VuZC0+bGlzdC5uZXh0LCB0eXBlb2YoKmxhc3RfZm91bmQpLCBsaXN0KTsKKwl9CisKKwlpZiAoIXAgJiYgIWxhc3RfZ29vZCkgeworCSAgICByZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFwKSB7CisJICAgIGNvbnRpbnVlOworCX0gZWxzZSB7CisJICAgIGxhc3RfZ29vZCA9IGxhc3RfZm91bmQ7CisgICAgICAgICAgICAqY3Vyc29yID0gcCAtIGxhc3RfZ29vZC0+Y29tbWFuZDsKKwl9CisKKwlwcmludGYoIlwwMzNbPzdsXDAzM1s/MjVsIik7CisJLyogRGlkbid0IGhhbmRsZSB0aGUgbGluZSB3cmFwIGNhc2UgaGVyZSAqLworCXByaW50ZigiXDAzM1sxR1wwMzNbMTszNm0ocmV2ZXJzZS1pLXNlYXJjaClcMDMzWzBtYCVzJzogJXMiLAorCQlidWYsIGxhc3RfZ29vZC0+Y29tbWFuZCA/IDogIiIpOworCXByaW50ZigiXDAzM1tLXHIiKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGFzdF9nb29kID8gbGFzdF9nb29kLT5jb21tYW5kIDogTlVMTDsKK30KKworCisKK2NvbnN0IGNoYXIgKmVkaXRfY21kbGluZShjb25zdCBjaGFyICppbnB1dCwgaW50IHRvcCAvKiwgaW50IHdpZHRoICovICwKKwkJCSBpbnQgKCpwRHJhd19NZW51KSAoaW50LCBpbnQsIGludCksCisJCQkgdm9pZCAoKnNob3dfZmtleSkgKGludCksIGJvb2wgKnRpbWVkb3V0KQoreworICAgIGNoYXIgY21kbGluZVtNQVhfQ01ETElORV9MRU5dID0geyB9OworICAgIGludCBrZXksIGxlbiwgcHJldl9sZW4sIGN1cnNvcjsKKyAgICBpbnQgcmVkcmF3ID0gMDsKKyAgICBpbnQgeCwgeTsKKyAgICBib29sIGRvbmUgPSBmYWxzZTsKKyAgICBjb25zdCBjaGFyICpyZXQ7CisgICAgaW50IHdpZHRoID0gMDsKKyAgICBzdHJ1Y3QgY2xpX2NvbW1hbmQgKmNvbW1fY291bnRlciA9IE5VTEw7CisgICAgY2xvY2tfdCBrYmRfdG8gPSBrYmR0aW1lb3V0OworICAgIGNsb2NrX3QgdHRvID0gdG90YWx0aW1lb3V0OworCisgICAgaWYgKCF3aWR0aCkgeworCWludCBoZWlnaHQ7CisJaWYgKGdldHNjcmVlbnNpemUoMSwgJmhlaWdodCwgJndpZHRoKSkKKwkgICAgd2lkdGggPSA4MDsKKyAgICB9CisKKyAgICBsZW4gPSBjdXJzb3IgPSAwOworICAgIHByZXZfbGVuID0gMDsKKyAgICB4ID0geSA9IDA7CisKKyAgICAvKgorICAgICAqIEJlZm9yZSB3ZSBzdGFydCBtZXNzaW5nIHdpdGggdGhlIHgseSBjb29yZGluYXRlcyBwcmludCAnaW5wdXQnCisgICAgICogc28gdGhhdCBpdCBmb2xsb3dzIHdoYXRldmVyIHRleHQgaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgc2NyZWVuCisgICAgICogcHJldmlvdXNseS4KKyAgICAgKi8KKyAgICBwcmludGYoIiVzICIsIGlucHV0KTsKKworICAgIHdoaWxlICghZG9uZSkgeworCWlmIChyZWRyYXcgPiAxKSB7CisJICAgIC8qIENsZWFyIGFuZCByZWRyYXcgd2hvbGUgc2NyZWVuICovCisJICAgIC8qIEVuYWJsZSBBU0NJSSBvbiBHMCBhbmQgREVDIFZUIG9uIEcxOyBkbyBpdCBpbiB0aGlzIG9yZGVyCisJICAgICAgIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgTGludXggY29uc29sZSAqLworCSAgICBjbGVhcl9zY3JlZW4oKTsKKwkgICAgaWYgKHBEcmF3X01lbnUpCisJCSAgICAoKnBEcmF3X01lbnUpICgtMSwgdG9wLCAxKTsKKwkgICAgcHJldl9sZW4gPSAwOworCSAgICBwcmludGYoIlwwMzNbMkpcMDMzW0giKTsKKwkgICAgLy8gcHJpbnRmKCJcMDMzWzBtXDAzM1sySlwwMzNbSCIpOworCX0KKworCWlmIChyZWRyYXcgPiAwKSB7CisJICAgIGludCBkeSwgYXQ7CisKKwkgICAgcHJldl9sZW4gPSBtYXgobGVuLCBwcmV2X2xlbik7CisKKwkgICAgLyogUmVkcmF3IHRoZSBjb21tYW5kIGxpbmUgKi8KKwkgICAgcHJpbnRmKCJcMDMzWz8yNWwiKTsKKwkgICAgcHJpbnRmKCJcMDMzWzFHJXMgIiwgaW5wdXQpOworCisJICAgIHggPSBzdHJsZW4oaW5wdXQpOworCSAgICB5ID0gMDsKKwkgICAgYXQgPSAwOworCSAgICB3aGlsZSAoYXQgPCBwcmV2X2xlbikgeworCQlwdXRjaGFyKGF0ID49IGxlbiA/ICcgJyA6IGNtZGxpbmVbYXRdKTsKKwkJYXQrKzsKKwkJeCsrOworCQlpZiAoeCA+PSB3aWR0aCkgeworCQkgICAgcHJpbnRmKCJcclxuIik7CisJCSAgICB4ID0gMDsKKwkJICAgIHkrKzsKKwkJfQorCSAgICB9CisJICAgIHByaW50ZigiXDAzM1tLXHIiKTsKKworCSAgICBkeSA9IHkgLSAoY3Vyc29yICsgc3RybGVuKGlucHV0KSArIDEpIC8gd2lkdGg7CisJICAgIHggPSAoY3Vyc29yICsgc3RybGVuKGlucHV0KSArIDEpICUgd2lkdGg7CisKKwkgICAgaWYgKGR5KSB7CisJCXByaW50ZigiXDAzM1slZEEiLCBkeSk7CisJCXkgLT0gZHk7CisJICAgIH0KKwkgICAgaWYgKHgpCisJCXByaW50ZigiXDAzM1slZEMiLCB4KTsKKwkgICAgcHJpbnRmKCJcMDMzWz8yNWgiKTsKKwkgICAgcHJldl9sZW4gPSBsZW47CisJICAgIHJlZHJhdyA9IDA7CisJfQorCisJa2V5ID0gbXlnZXRrZXlfdGltZW91dCgma2JkX3RvLCAmdHRvKTsKKworCXN3aXRjaCAoa2V5KSB7CisJY2FzZSBLRVlfTk9ORToKKwkgICAgLyogV2UgdGltZWQgb3V0LiAqLworCSAgICAqdGltZWRvdXQgPSB0cnVlOworCSAgICByZXR1cm4gTlVMTDsKKworCWNhc2UgS0VZX0NUUkwoJ0wnKToKKwkgICAgcmVkcmF3ID0gMjsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9FTlRFUjoKKwljYXNlIEtFWV9DVFJMKCdKJyk6CisJICAgIHJldCA9IGNtZGxpbmU7CisJICAgIGRvbmUgPSB0cnVlOworCSAgICBicmVhazsKKworCWNhc2UgS0VZX0JBQ0tTUEFDRToKKwljYXNlIEtFWV9ERUw6CisJICAgIGlmIChjdXJzb3IpIHsKKwkJbWVtbW92ZShjbWRsaW5lICsgY3Vyc29yIC0gMSwgY21kbGluZSArIGN1cnNvciwKKwkJCWxlbiAtIGN1cnNvciArIDEpOworCQlsZW4tLTsKKwkJY3Vyc29yLS07CisJCXJlZHJhdyA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9DVFJMKCdEJyk6CisJY2FzZSBLRVlfREVMRVRFOgorCSAgICBpZiAoY3Vyc29yIDwgbGVuKSB7CisJCW1lbW1vdmUoY21kbGluZSArIGN1cnNvciwgY21kbGluZSArIGN1cnNvciArIDEsIGxlbiAtIGN1cnNvcik7CisJCWxlbi0tOworCQlyZWRyYXcgPSAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfQ1RSTCgnVScpOgorCSAgICBpZiAobGVuKSB7CisJCWxlbiA9IGN1cnNvciA9IDA7CisJCWNtZGxpbmVbbGVuXSA9ICdcMCc7CisJCXJlZHJhdyA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9DVFJMKCdXJyk6CisJICAgIGlmIChjdXJzb3IpIHsKKwkJaW50IHByZXZjdXJzb3IgPSBjdXJzb3I7CisKKwkJd2hpbGUgKGN1cnNvciAmJiBteV9pc3NwYWNlKGNtZGxpbmVbY3Vyc29yIC0gMV0pKQorCQkgICAgY3Vyc29yLS07CisKKwkJd2hpbGUgKGN1cnNvciAmJiAhbXlfaXNzcGFjZShjbWRsaW5lW2N1cnNvciAtIDFdKSkKKwkJICAgIGN1cnNvci0tOworCisjaWYgMAorCQltZW1tb3ZlKGNtZGxpbmUgKyBjdXJzb3IsIGNtZGxpbmUgKyBwcmV2Y3Vyc29yLAorCQkJbGVuIC0gcHJldmN1cnNvciArIDEpOworI2Vsc2UKKwkJeworCQkgICAgaW50IGk7CisJCSAgICBjaGFyICpxID0gY21kbGluZSArIGN1cnNvcjsKKwkJICAgIGNoYXIgKnAgPSBjbWRsaW5lICsgcHJldmN1cnNvcjsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSBwcmV2Y3Vyc29yICsgMTsgaSsrKQorCQkJKnErKyA9ICpwKys7CisJCX0KKyNlbmRpZgorCQlsZW4gLT0gKHByZXZjdXJzb3IgLSBjdXJzb3IpOworCQlyZWRyYXcgPSAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfTEVGVDoKKwljYXNlIEtFWV9DVFJMKCdCJyk6CisJICAgIGlmIChjdXJzb3IpIHsKKwkJY3Vyc29yLS07CisJCXJlZHJhdyA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9SSUdIVDoKKwljYXNlIEtFWV9DVFJMKCdGJyk6CisJICAgIGlmIChjdXJzb3IgPCBsZW4pIHsKKwkJcHV0Y2hhcihjbWRsaW5lW2N1cnNvcl0pOworCQljdXJzb3IrKzsKKwkJeCsrOworCQlpZiAoeCA+PSB3aWR0aCkgeworCQkgICAgcHJpbnRmKCJcclxuIik7CisJCSAgICB5Kys7CisJCSAgICB4ID0gMDsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfQ1RSTCgnSycpOgorCSAgICBpZiAoY3Vyc29yIDwgbGVuKSB7CisJCWNtZGxpbmVbbGVuID0gY3Vyc29yXSA9ICdcMCc7CisJCXJlZHJhdyA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9IT01FOgorCWNhc2UgS0VZX0NUUkwoJ0EnKToKKwkgICAgaWYgKGN1cnNvcikgeworCQljdXJzb3IgPSAwOworCQlyZWRyYXcgPSAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfRU5EOgorCWNhc2UgS0VZX0NUUkwoJ0UnKToKKwkgICAgaWYgKGN1cnNvciAhPSBsZW4pIHsKKwkJY3Vyc29yID0gbGVuOworCQlyZWRyYXcgPSAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfRjE6CisJY2FzZSBLRVlfRjI6CisJY2FzZSBLRVlfRjM6CisJY2FzZSBLRVlfRjQ6CisJY2FzZSBLRVlfRjU6CisJY2FzZSBLRVlfRjY6CisJY2FzZSBLRVlfRjc6CisJY2FzZSBLRVlfRjg6CisJY2FzZSBLRVlfRjk6CisJY2FzZSBLRVlfRjEwOgorCWNhc2UgS0VZX0YxMToKKwljYXNlIEtFWV9GMTI6CisJICAgIGlmIChzaG93X2ZrZXkgIT0gTlVMTCkgeworCQkoKnNob3dfZmtleSkgKGtleSk7CisJCXJlZHJhdyA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfQ1RSTCgnUCcpOgorCWNhc2UgS0VZX1VQOgorCSAgICB7CisJCWlmICghbGlzdF9lbXB0eSgmY2xpX2hpc3RvcnlfaGVhZCkpIHsKKwkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwkJICAgIGlmICghY29tbV9jb3VudGVyKQorCQkJbmV4dCA9IGNsaV9oaXN0b3J5X2hlYWQubmV4dDsKKwkJICAgIGVsc2UKKwkJCW5leHQgPSBjb21tX2NvdW50ZXItPmxpc3QubmV4dDsKKworCQkgICAgY29tbV9jb3VudGVyID0KKwkJCWxpc3RfZW50cnkobmV4dCwgdHlwZW9mKCpjb21tX2NvdW50ZXIpLCBsaXN0KTsKKworCQkgICAgaWYgKCZjb21tX2NvdW50ZXItPmxpc3QgIT0gJmNsaV9oaXN0b3J5X2hlYWQpCisJCQlzdHJjcHkoY21kbGluZSwgY29tbV9jb3VudGVyLT5jb21tYW5kKTsKKworCQkgICAgY3Vyc29yID0gbGVuID0gc3RybGVuKGNtZGxpbmUpOworCQkgICAgcmVkcmF3ID0gMTsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0NUUkwoJ04nKToKKwljYXNlIEtFWV9ET1dOOgorCSAgICB7CisJCWlmICghbGlzdF9lbXB0eSgmY2xpX2hpc3RvcnlfaGVhZCkpIHsKKwkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKnByZXY7CisKKwkJICAgIGlmICghY29tbV9jb3VudGVyKQorCQkJcHJldiA9IGNsaV9oaXN0b3J5X2hlYWQucHJldjsKKwkJICAgIGVsc2UKKwkJCXByZXYgPSBjb21tX2NvdW50ZXItPmxpc3QucHJldjsKKworCQkgICAgY29tbV9jb3VudGVyID0KKwkJCWxpc3RfZW50cnkocHJldiwgdHlwZW9mKCpjb21tX2NvdW50ZXIpLCBsaXN0KTsKKworCQkgICAgaWYgKCZjb21tX2NvdW50ZXItPmxpc3QgIT0gJmNsaV9oaXN0b3J5X2hlYWQpCisJCQlzdHJjcHkoY21kbGluZSwgY29tbV9jb3VudGVyLT5jb21tYW5kKTsKKworCQkgICAgY3Vyc29yID0gbGVuID0gc3RybGVuKGNtZGxpbmUpOworCQkgICAgcmVkcmF3ID0gMTsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0NUUkwoJ1InKToKKwkgICAgeworCSAgICAgICAgIC8qIAorCSAgICAgICAgICAqIEhhbmRsZSB0aGlzIGNhc2UgaW4gYW5vdGhlciBmdW5jdGlvbiwgc2luY2UgaXQncyAKKwkgICAgICAgICAgKiBhIGtpbmQgb2Ygc3BlY2lhbC4KKwkgICAgICAgICAgKi8KKwkgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBjbWRfcmV2ZXJzZV9zZWFyY2goJmN1cnNvciwgJmtiZF90bywgJnR0byk7CisJICAgICAgICBpZiAocCkgeworCSAgICAgICAgICAgIHN0cmNweShjbWRsaW5lLCBwKTsKKwkJICAgIGxlbiA9IHN0cmxlbihjbWRsaW5lKTsKKwkgICAgICAgIH0gZWxzZSB7CisJICAgICAgICAgICAgY21kbGluZVswXSA9ICdcMCc7CisJCSAgICBjdXJzb3IgPSBsZW4gPSAwOworCSAgICAgICAgfQorCSAgICAgICAgcmVkcmF3ID0gMTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIEtFWV9UQUI6CisJICAgIHsKKwkJY29uc3QgY2hhciAqcDsKKwkJc2l6ZV90IGxlbjsKKworCQkvKiBMYWJlbCBjb21wbGV0aW9uIGVuYWJsZWQ/ICovCisJCWlmIChub2NvbXBsZXRlKQorCSAgICAgICAgICAgIGJyZWFrOworCisJCXAgPSBjbWRsaW5lOworCQlsZW4gPSAwOworCQl3aGlsZSgqcCAmJiAhbXlfaXNzcGFjZSgqcCkpIHsKKwkJICAgIHArKzsKKwkJICAgIGxlbisrOworCQl9CisKKwkJcHJpbnRfbGFiZWxzKGNtZGxpbmUsIGxlbik7CisJCXJlZHJhdyA9IDE7CisJCWJyZWFrOworCSAgICB9CisJY2FzZSBLRVlfQ1RSTCgnVicpOgorCSAgICBpZiAoQklPU05hbWUpCisJCXByaW50ZigiJXMlcyVzIiwgc3lzbGludXhfYmFubmVyLAorCQkgICAgICAgKGNoYXIgKilNS19QVFIoMCwgQklPU05hbWUpLCBjb3B5cmlnaHRfc3RyKTsKKwkgICAgZWxzZQorCQlwcmludGYoIiVzJXMiLCBzeXNsaW51eF9iYW5uZXIsIGNvcHlyaWdodF9zdHIpOworCisJICAgIHJlZHJhdyA9IDE7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgaWYgKGtleSA+PSAnICcgJiYga2V5IDw9IDB4RkYgJiYgbGVuIDwgTUFYX0NNRExJTkVfTEVOIC0gMSkgeworCQlpZiAoY3Vyc29yID09IGxlbikgeworCQkgICAgY21kbGluZVtsZW4rK10gPSBrZXk7CisJCSAgICBjbWRsaW5lW2xlbl0gPSAnXDAnOworCQkgICAgcHV0Y2hhcihrZXkpOworCQkgICAgY3Vyc29yKys7CisJCSAgICB4Kys7CisJCSAgICBpZiAoeCA+PSB3aWR0aCkgeworCQkJcHJpbnRmKCJcclxuXDAzM1tLIik7CisJCQl5Kys7CisJCQl4ID0gMDsKKwkJICAgIH0KKwkJICAgIHByZXZfbGVuKys7CisJCX0gZWxzZSB7CisJCSAgICBpZiAoY3Vyc29yID4gbGVuKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJICAgIG1lbW1vdmUoY21kbGluZSArIGN1cnNvciArIDEsIGNtZGxpbmUgKyBjdXJzb3IsCisJCQkgICAgbGVuIC0gY3Vyc29yICsgMSk7CisJCSAgICBjbWRsaW5lW2N1cnNvcisrXSA9IGtleTsKKwkJICAgIGxlbisrOworCQkgICAgcmVkcmF3ID0gMTsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBwcmludGYoIlwwMzNbPzdoIik7CisKKyAgICAvKiBBZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGhpc3RvcnkgaWYgaXRzIGxlbmd0aCBpcyBsYXJnZXIgdGhhbiAwICovCisgICAgbGVuID0gc3RybGVuKHJldCk7CisgICAgaWYgKGxlbiA+IDApIHsKKwljb21tX2NvdW50ZXIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGlfY29tbWFuZCkpOworCWNvbW1fY291bnRlci0+Y29tbWFuZCA9IG1hbGxvYyhzaXplb2YoY2hhcikgKiAobGVuICsgMSkpOworCXN0cmNweShjb21tX2NvdW50ZXItPmNvbW1hbmQsIHJldCk7CisJbGlzdF9hZGQoJihjb21tX2NvdW50ZXItPmxpc3QpLCAmY2xpX2hpc3RvcnlfaGVhZCk7CisgICAgfQorCisgICAgcmV0dXJuIGxlbiA/IHJldCA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19jb25zdHJ1Y3RvciBjbGlfaW5pdCh2b2lkKQoreworCUlOSVRfTElTVF9IRUFEKCZjbGlfaGlzdG9yeV9oZWFkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2Rlc3RydWN0b3IgY2xpX2V4aXQodm9pZCkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CmRpZmYgLS1naXQgYS9jb20zMi9lbGZsaW5rL2xkbGludXgvY29sb3JzLmMgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvY29sb3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3MzJiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9jb2xvcnMuYwpAQCAtMCwwICsxLDE4NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29sb3J0YmwuaD4KKyNpbmNsdWRlICJtZW51LmgiCisKKy8qCisgKiBUaGUgY29sb3IvYXR0cmlidXRlIGluZGV4ZXMgKFwxI1gsIFwyI1hYLCBcMyNYWFgpIGFyZSBhcyBmb2xsb3dzCisgKgorICogMDAgLSBzY3JlZW4JCVJlc3Qgb2YgdGhlIHNjcmVlbgorICogMDEgLSBib3JkZXIJCUJvcmRlciBhcmVhCisgKiAwMiAtIHRpdGxlCQlUaXRsZSBiYXIKKyAqIDAzIC0gdW5zZWwJCVVuc2VsZWN0ZWQgbWVudSBpdGVtCisgKiAwNCAtIGhvdGtleQkJVW5zZWxlY3RlZCBob3RrZXkKKyAqIDA1IC0gc2VsCQlTZWxlY3Rpb24gYmFyCisgKiAwNiAtIGhvdHNlbAkJU2VsZWN0ZWQgaG90a2V5CisgKiAwNyAtIHNjcm9sbGJhcglTY3JvbGwgYmFyCisgKiAwOCAtIHRhYm1zZwkJUHJlc3MgW1RhYl0gbWVzc2FnZQorICogMDkgLSBjbWRtYXJrCQlDb21tYW5kIGxpbmUgbWFya2VyCisgKiAxMCAtIGNtZGxpbmUJCUNvbW1hbmQgbGluZQorICogMTEgLSBwd2Rib3JkZXIJUGFzc3dvcmQgYm94IGJvcmRlcgorICogMTIgLSBwd2RoZWFkZXIJUGFzc3dvcmQgYm94IGhlYWRlcgorICogMTMgLSBwd2RlbnRyeQlQYXNzd29yZCBib3ggY29udGVudHMKKyAqIDE0IC0gdGltZW91dF9tc2cJVGltZW91dCBtZXNzYWdlCisgKiAxNSAtIHRpbWVvdXQJCVRpbWVvdXQgY291bnRlcgorICogMTYgLSBoZWxwCQlDdXJyZW50IGVudHJ5IGhlbHAgdGV4dAorICogMTcgLSBkaXNhYmxlZCAgICAgICAgRGlzYWJsZWQgbWVudSBpdGVtCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb2xvcl90YWJsZSBkZWZhdWx0X2NvbG9yc1tdID0geworICAgIHsic2NyZWVuIiwgIjM3OzQwIiwgMHg4MGZmZmZmZiwgMHgwMDAwMDAwMCwgU0hBRE9XX05PUk1BTH0sCisgICAgeyJib3JkZXIiLCAiMzA7NDQiLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKKyAgICB7InRpdGxlIiwgIjE7MzY7NDQiLCAweGMwMDA5MGYwLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKKyAgICB7InVuc2VsIiwgIjM3OzQ0IiwgMHg5MGZmZmZmZiwgMHgwMDAwMDAwMCwgU0hBRE9XX05PUk1BTH0sCisgICAgeyJob3RrZXkiLCAiMTszNzs0NCIsIDB4ZmZmZmZmZmYsIDB4MDAwMDAwMDAsIFNIQURPV19OT1JNQUx9LAorICAgIHsic2VsIiwgIjc7Mzc7NDAiLCAweGUwMDAwMDAwLCAweDIwZmY4MDAwLCBTSEFET1dfQUxMfSwKKyAgICB7ImhvdHNlbCIsICIxOzc7Mzc7NDAiLCAweGUwNDAwMDAwLCAweDIwZmY4MDAwLCBTSEFET1dfQUxMfSwKKyAgICB7InNjcm9sbGJhciIsICIzMDs0NCIsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIFNIQURPV19OT1JNQUx9LAorICAgIHsidGFibXNnIiwgIjMxOzQwIiwgMHg5MGZmZmYwMCwgMHgwMDAwMDAwMCwgU0hBRE9XX05PUk1BTH0sCisgICAgeyJjbWRtYXJrIiwgIjE7MzY7NDAiLCAweGMwMDBmZmZmLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKKyAgICB7ImNtZGxpbmUiLCAiMzc7NDAiLCAweGMwZmZmZmZmLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKKyAgICB7InB3ZGJvcmRlciIsICIzMDs0NyIsIDB4ODBmZmZmZmYsIDB4MjBmZmZmZmYsIFNIQURPV19OT1JNQUx9LAorICAgIHsicHdkaGVhZGVyIiwgIjMxOzQ3IiwgMHg4MGZmODA4MCwgMHgyMGZmZmZmZiwgU0hBRE9XX05PUk1BTH0sCisgICAgeyJwd2RlbnRyeSIsICIzMDs0NyIsIDB4ODBmZmZmZmYsIDB4MjBmZmZmZmYsIFNIQURPV19OT1JNQUx9LAorICAgIHsidGltZW91dF9tc2ciLCAiMzc7NDAiLCAweDgwZmZmZmZmLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKKyAgICB7InRpbWVvdXQiLCAiMTszNzs0MCIsIDB4YzBmZmZmZmYsIDB4MDAwMDAwMDAsIFNIQURPV19OT1JNQUx9LAorICAgIHsiaGVscCIsICIzNzs0MCIsIDB4YzBmZmZmZmYsIDB4MDAwMDAwMDAsIFNIQURPV19OT1JNQUx9LAorICAgIHsiZGlzYWJsZWQiLCAiMTszMDs0NCIsIDB4NjBjY2NjY2MsIDB4MDAwMDAwMDAsIFNIQURPV19OT1JNQUx9LAorfTsKKworI2RlZmluZSBOQ09MT1JTIChzaXplb2YgZGVmYXVsdF9jb2xvcnMvc2l6ZW9mIGRlZmF1bHRfY29sb3JzWzBdKQorY29uc3QgaW50IG1lc3NhZ2VfYmFzZV9jb2xvciA9IE5DT0xPUlM7Citjb25zdCBpbnQgbWVudV9jb2xvcl90YWJsZV9zaXplID0gTkNPTE9SUyArIDI1NjsKKworLyogQWxnb3JpdGhtaWNhbGx5IGdlbmVyYXRlIHRoZSBtc2dYWCBjb2xvcnMgKi8KK3ZvaWQgc2V0X21zZ19jb2xvcnNfZ2xvYmFsKHN0cnVjdCBjb2xvcl90YWJsZSAqdGJsLAorCQkJICAgdW5zaWduZWQgaW50IGZnLCB1bnNpZ25lZCBpbnQgYmcsCisJCQkgICBlbnVtIGNvbG9yX3RhYmxlX3NoYWRvdyBzaGFkb3cpCit7CisgICAgc3RydWN0IGNvbG9yX3RhYmxlICpjcCA9IHRibCArIG1lc3NhZ2VfYmFzZV9jb2xvcjsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgZmdhLCBiZ2E7CisgICAgdW5zaWduZWQgaW50IGZnaCwgYmdoOworICAgIHVuc2lnbmVkIGludCBmZ19pZHgsIGJnX2lkeDsKKyAgICB1bnNpZ25lZCBpbnQgZmdfcmdiLCBiZ19yZ2I7CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjMnJnYls4XSA9CisJeyAweDAwMDAwMCwgMHgwMDAwZmYsIDB4MDBmZjAwLCAweDAwZmZmZiwgMHhmZjAwMDAsIDB4ZmYwMGZmLCAweGZmZmYwMCwKKwkweGZmZmZmZgorICAgIH07CisKKyAgICAvKiBDb252ZXJ0aW5nIFBDIFJHQkkgdG8gc2Vuc2libGUgUkdCQSB2YWx1ZXMgaXMgYW4gImludGVyZXN0aW5nIgorICAgICAgIHByb3Bvc2l0aW9uLiAgVGhpcyBhbGdvcml0aG0gbWF5IG5lZWQgcGxlbnR5IG9mIHR3ZWFraW5nLiAqLworCisgICAgZmdhID0gZmcgJiAweGZmMDAwMDAwOworICAgIGZnaCA9ICgoZmcgPj4gMSkgJiAweGZmMDAwMDAwKSB8IDB4ODAwMDAwMDA7CisKKyAgICBiZ2EgPSBiZyAmIDB4ZmYwMDAwMDA7CisgICAgYmdoID0gKChiZyA+PiAxKSAmIDB4ZmYwMDAwMDApIHwgMHg4MDAwMDAwMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCWZnX2lkeCA9IGkgJiAxNTsKKwliZ19pZHggPSBpID4+IDQ7CisKKwlmZ19yZ2IgPSBwYzJyZ2JbZmdfaWR4ICYgN10gJiBmZzsKKwliZ19yZ2IgPSBwYzJyZ2JbYmdfaWR4ICYgN10gJiBiZzsKKworCWlmIChmZ19pZHggJiA4KSB7CisJICAgIC8qIEhpZ2ggaW50ZW5zaXR5IGZvcmVncm91bmQgKi8KKwkgICAgZmdfcmdiIHw9IGZnaDsKKwl9IGVsc2UgeworCSAgICBmZ19yZ2IgfD0gZmdhOworCX0KKworCWlmIChiZ19pZHggPT0gMCkgeworCSAgICAvKiBEZWZhdWx0IGJsYWNrIGJhY2tncm91bmQsIGFzc3VtZSB0cmFuc3BhcmVudCAqLworCSAgICBiZ19yZ2IgPSAwOworCX0gZWxzZSBpZiAoYmdfaWR4ICYgOCkgeworCSAgICBiZ19yZ2IgfD0gYmdoOworCX0gZWxzZSB7CisJICAgIGJnX3JnYiB8PSBiZ2E7CisJfQorCisJY3AtPmFyZ2JfZmcgPSBmZ19yZ2I7CisJY3AtPmFyZ2JfYmcgPSBiZ19yZ2I7CisJY3AtPnNoYWRvdyA9IHNoYWRvdzsKKwljcCsrOworICAgIH0KK30KKworc3RydWN0IGNvbG9yX3RhYmxlICpkZWZhdWx0X2NvbG9yX3RhYmxlKHZvaWQpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgY29uc3Qgc3RydWN0IGNvbG9yX3RhYmxlICpkcDsKKyAgICBzdHJ1Y3QgY29sb3JfdGFibGUgKmNwOworICAgIHN0cnVjdCBjb2xvcl90YWJsZSAqY29sb3JfdGFibGU7CisgICAgc3RhdGljIGNvbnN0IGludCBwYzJhbnNpWzhdID0geyAwLCA0LCAyLCA2LCAxLCA1LCAzLCA3IH07CisgICAgc3RhdGljIGNoYXIgbXNnX25hbWVzWzYgKiAyNTZdOworICAgIGNoYXIgKm1wOworCisgICAgY29sb3JfdGFibGUgPSBjYWxsb2MoTkNPTE9SUyArIDI1Niwgc2l6ZW9mKHN0cnVjdCBjb2xvcl90YWJsZSkpOworCisgICAgZHAgPSBkZWZhdWx0X2NvbG9yczsKKyAgICBjcCA9IGNvbG9yX3RhYmxlOworCisgICAgZm9yIChpID0gMDsgaSA8IE5DT0xPUlM7IGkrKykgeworCSpjcCA9ICpkcDsKKwljcC0+YW5zaSA9IHJlZnN0cmR1cChkcC0+YW5zaSk7CisJY3ArKzsKKwlkcCsrOworICAgIH0KKworICAgIG1wID0gbXNnX25hbWVzOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCWNwLT5uYW1lID0gbXA7CisJbXAgKz0gc3ByaW50ZihtcCwgIm1zZyUwMngiLCBpKSArIDE7CisKKwlyc3ByaW50ZigmY3AtPmFuc2ksICIlczMlZDs0JWQiLCAoaSAmIDgpID8gIjE7IiA6ICIiLAorCQkgcGMyYW5zaVtpICYgN10sIHBjMmFuc2lbKGkgPj4gNCkgJiA3XSk7CisJY3ArKzsKKyAgICB9CisKKyAgLyoqKiBYWFg6IFRoaXMgbmVlZHMgdG8gbW92ZSB0byBydW5fbWVudSgpICoqKi8KKyAgICBjb25zb2xlX2NvbG9yX3RhYmxlID0gY29sb3JfdGFibGU7CisgICAgY29uc29sZV9jb2xvcl90YWJsZV9zaXplID0gTkNPTE9SUyArIDI1NjsKKworICAgIHNldF9tc2dfY29sb3JzX2dsb2JhbChjb2xvcl90YWJsZSwgTVNHX0NPTE9SU19ERUZfRkcsCisJCQkgIE1TR19DT0xPUlNfREVGX0JHLCBNU0dfQ09MT1JTX0RFRl9TSEFET1cpOworCisgICAgcmV0dXJuIGNvbG9yX3RhYmxlOworfQorCitzdHJ1Y3QgY29sb3JfdGFibGUgKmNvcHlfY29sb3JfdGFibGUoY29uc3Qgc3RydWN0IGNvbG9yX3RhYmxlICptYXN0ZXIpCit7CisgICAgY29uc3Qgc3RydWN0IGNvbG9yX3RhYmxlICpkcDsKKyAgICBzdHJ1Y3QgY29sb3JfdGFibGUgKmNvbG9yX3RhYmxlLCAqY3A7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBjb2xvcl90YWJsZSA9IGNhbGxvYyhOQ09MT1JTICsgMjU2LCBzaXplb2Yoc3RydWN0IGNvbG9yX3RhYmxlKSk7CisKKyAgICBkcCA9IG1hc3RlcjsKKyAgICBjcCA9IGNvbG9yX3RhYmxlOworCisgICAgZm9yIChpID0gMDsgaSA8IE5DT0xPUlMgKyAyNTY7IGkrKykgeworCSpjcCA9ICpkcDsKKwljcC0+YW5zaSA9IHJlZnN0cl9nZXQoZHAtPmFuc2kpOworCWNwKys7CisJZHArKzsKKyAgICB9CisKKyAgICByZXR1cm4gY29sb3JfdGFibGU7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9lbGZsaW5rL2xkbGludXgvY29uZmlnLmggYi9jb20zMi9lbGZsaW5rL2xkbGludXgvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyYjdkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9jb25maWcuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogICBDb3B5cmlnaHQgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpZm5kZWYgX19DT05GSUdfSF9fCisjZGVmaW5lIF9fQ09ORklHX0hfXworCisvKgorICogVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlICJkZWZhdWx0IiBhbmQgInVpIiBjb21tYW5kcworICogcmVzcGVjdGl2ZWx5LiAidWkiIHRha2VzIHByZWNlbmRlbmNlIG92ZXIgImRlZmF1bHQiLgorICovCisjZGVmaW5lIExFVkVMX0RFRkFVTFQJMQorI2RlZmluZSBMRVZFTF9VSQkyCisKK2V4dGVybiBzaG9ydCB1YXBwZW5kbGVuOwkvL2J5dGVzIGluIGFwcGVuZD0gY29tbWFuZAorZXh0ZXJuIHNob3J0IG9udGltZW91dGxlbjsJLy9ieXRlcyBpbiBvbnRpbWVvdXQgY29tbWFuZAorZXh0ZXJuIHNob3J0IG9uZXJyb3JsZW47CS8vYnl0ZXMgaW4gb25lcnJvciBjb21tYW5kCitleHRlcm4gc2hvcnQgZm9yY2Vwcm9tcHQ7CS8vZm9yY2UgcHJvbXB0CitleHRlcm4gc2hvcnQgbm9lc2NhcGU7CQkvL25vIGVzY2FwZQorZXh0ZXJuIHNob3J0IG5vY29tcGxldGU7CS8vbm8gbGFiZWwgY29tcGxldGlvbiBvbiBUQUIga2V5CitleHRlcm4gc2hvcnQgYWxsb3dpbXBsaWNpdDsJLy9hbGxvdyBpbXBsaWNpdCBrZXJuZWxzCitleHRlcm4gc2hvcnQgYWxsb3dvcHRpb25zOwkvL3VzZXItc3BlY2lmaWVkIG9wdGlvbnMgYWxsb3dlZAorZXh0ZXJuIHNob3J0IGluY2x1ZGVsZXZlbDsJLy9uZXN0aW5nIGxldmVsCitleHRlcm4gc2hvcnQgZGVmYXVsdGxldmVsOwkvL3RoZSBjdXJyZW50IGxldmVsIG9mIGRlZmF1bHQKK2V4dGVybiBzaG9ydCB2a2VybmVsOwkJLy9oYXZlIHdlIHNlZW4gYW55ICJsYWJlbCIgc3RhdGVtZW50cz8KK2V4dGVybiBzaG9ydCBkaXNwbGF5Y29uOwkvL2NvbmlvLmluYworZXh0ZXJuIHNob3J0IG5vaGFsdDsJCS8vaWRsZS5pbmMKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmRlZmF1bHRfY21kOwkvLyJkZWZhdWx0IiBjb21tYW5kIGxpbmUKK2V4dGVybiBjb25zdCBjaGFyICpvbmVycm9yOwkvLyJvbmVycm9yIiBjb21tYW5kIGxpbmUKK2V4dGVybiBjb25zdCBjaGFyICpvbnRpbWVvdXQ7CS8vIm9udGltZW91dCIgY29tbWFuZCBsaW5lCisKK2V4dGVybiB2b2lkIGNhdF9oZWxwX2ZpbGUoaW50IGtleSk7CitleHRlcm4gc3RydWN0IG1lbnVfZW50cnkgKmZpbmRfbGFiZWwoY29uc3QgY2hhciAqc3RyKTsKK2V4dGVybiB2b2lkIHByaW50X2xhYmVscyhjb25zdCBjaGFyICpwcmVmaXgsIHNpemVfdCBsZW4pOworCitleHRlcm4gaW50IG5ld19saW51eF9rZXJuZWwoY2hhciAqb2tlcm5lbCwgY2hhciAqb2NtZGxpbmUpOworCitleHRlcm4gdm9pZCBwbV9sb2FkX2hpZ2goY29tMzJzeXNfdCAqcmVncyk7CisKK2V4dGVybiB2b2lkIGxkbGludXhfZW50ZXJfY29tbWFuZCh2b2lkKTsKK2V4dGVybiB2b2lkIGxkbGludXhfY29uc29sZV9pbml0KHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFwcGx5X2V4dGVuc2lvbihjb25zdCBjaGFyICprZXJuZWwsIGNvbnN0IGNoYXIgKmV4dCk7CisKKyNlbmRpZiAvKiBfX0NPTkZJR19IX18gKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9leGVjdXRlLmMgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvZXhlY3V0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2M4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvZXhlY3V0ZS5jCkBAIC0wLDAgKzEsMTc0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisKKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN5cy9leGVjLmg+CisjaW5jbHVkZSA8c3lzL2lvLmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJtZW51LmgiCisjaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsb2NhbGJvb3QuaCIKKyNpbmNsdWRlICJiaW9zLmgiCisKKyNpbmNsdWRlIDxzeXNsaW51eC9ib290cm0uaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3QuaD4KKworY29uc3Qgc3RydWN0IGltYWdlX3R5cGVzIGltYWdlX2Jvb3RfdHlwZXNbXSA9IHsKKyAgICB7ICJsb2NhbGJvb3QiLCBJTUFHRV9UWVBFX0xPQ0FMQk9PVCB9LAorICAgIHsgImtlcm5lbCIsIElNQUdFX1RZUEVfS0VSTkVMIH0sCisgICAgeyAibGludXgiLCBJTUFHRV9UWVBFX0xJTlVYIH0sCisgICAgeyAiYm9vdCIsIElNQUdFX1RZUEVfQk9PVCB9LAorICAgIHsgImJzcyIsIElNQUdFX1RZUEVfQlNTIH0sCisgICAgeyAicHhlIiwgSU1BR0VfVFlQRV9QWEUgfSwKKyAgICB7ICJmZGltYWdlIiwgSU1BR0VfVFlQRV9GRElNQUdFIH0sCisgICAgeyAiY29tMzIiLCBJTUFHRV9UWVBFX0NPTTMyIH0sCisgICAgeyAiY29uZmlnIiwgSU1BR0VfVFlQRV9DT05GSUcgfSwKKyAgICB7IE5VTEwsIDAgfSwKK307CisKK2V4dGVybiBpbnQgY3JlYXRlX2FyZ3NfYW5kX2xvYWQoY2hhciAqKTsKKworX19leHBvcnQgdm9pZCBleGVjdXRlKGNvbnN0IGNoYXIgKmNtZGxpbmUsIHVpbnQzMl90IHR5cGUsIGJvb2wgc3lzYXBwZW5kKQoreworCWNvbnN0IGNoYXIgKmtlcm5lbCwgKmFyZ3M7CisJY29uc3QgY2hhciAqcDsKKwljb20zMnN5c190IGlyZWc7CisJY2hhciAqcSwgY2g7CisKKwltZW1zZXQoJmlyZWcsIDAsIHNpemVvZiBpcmVnKTsKKworCWlmIChzdHJsZW4oY21kbGluZSkgPj0gTUFYX0NNRExJTkVfTEVOKSB7CisJCXByaW50ZigiY21kbGluZSB0b28gbG9uZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwlxID0gbWFsbG9jKE1BWF9DTURMSU5FX0xFTik7CisJaWYgKCFxKSB7CisJCXByaW50ZigiJXMoKTogRmFpbCB0byBtYWxsb2MgYSBidWZmZXIgdG8gZXhlYyAlc1xuIiwKKwkJCV9fZnVuY19fLCBjbWRsaW5lKTsKKwkJcmV0dXJuOworCX0KKworCWtlcm5lbCA9IHE7CisJcCA9IGNtZGxpbmU7CisJd2hpbGUgKCpwICYmICFteV9pc3NwYWNlKCpwKSkKKwkJKnErKyA9ICpwKys7CisJKnErKyA9ICdcMCc7CisKKwlhcmdzID0gcTsKKwl3aGlsZSAoKnAgJiYgbXlfaXNzcGFjZSgqcCkpCisJCXArKzsKKworCWRvIHsKKwkJKnErKyA9IGNoID0gKnArKzsKKwl9IHdoaWxlIChjaCk7CisKKwlpZiAoc3lzYXBwZW5kKSB7CisJCS8qIElmIHdlJ3ZlIHNlZW4gc29tZSBhcmdzLCBpbnNlcnQgYSBzcGFjZSAqLworCQlpZiAoLS1xICE9IGFyZ3MpCisJCQkqcSsrID0gJyAnOworCisJCWRvX3N5c2FwcGVuZChxKTsKKwl9CisKKwlkcHJpbnRmKCJrZXJuZWwgaXMgJXMsIGFyZ3MgPSAlcyAgdHlwZSA9ICVkIFxuIiwga2VybmVsLCBhcmdzLCB0eXBlKTsKKworCWlmIChrZXJuZWxbMF0gPT0gJy4nKSB7CisJCS8qIEl0IG1pZ2h0IGJlIGEgdHlwZSBzcGVjaWZpZXIgKi8KKwkJY29uc3Qgc3RydWN0IGltYWdlX3R5cGVzICp0OworCQlmb3IgKHQgPSBpbWFnZV9ib290X3R5cGVzOyB0LT5uYW1lOyB0KyspIHsKKwkJCWlmICghc3RyY21wKGtlcm5lbCArIDEsIHQtPm5hbWUpKSB7CisJCQkJLyoKKwkJCQkgKiBTdHJpcCB0aGUgdHlwZSBzcGVjaWZpZXIsIGFwcGx5IHRoZQorCQkJCSAqIGZpbGVuYW1lIGV4dGVuc2lvbiBpZiBDT00zMiBhbmQKKwkJCQkgKiByZXRyeS4KKwkJCQkgKi8KKwkJCQlwID0gYXJnczsKKwkJCQlpZiAodC0+dHlwZSA9PSBJTUFHRV9UWVBFX0NPTTMyKSB7CisJCQkJCXAgPSBhcHBseV9leHRlbnNpb24ocCwgIi5jMzIiKTsKKwkJCQkJaWYgKCFwKQorCQkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWV4ZWN1dGUocCwgdC0+dHlwZSwgc3lzYXBwZW5kKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwlpZiAodHlwZSA9PSBJTUFHRV9UWVBFX0NPTTMyKSB7CisJCS8qCisJCSAqIFdlIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY29uc29sZSBpbiBhbiB1bmtub3duCisJCSAqIHN0YXRlLCBzbyBpbml0aWFsaXNlIGl0LgorCQkgKi8KKwkJbGRsaW51eF9jb25zb2xlX2luaXQoKTsKKworCQkvKiBuZXcgZW50cnkgZm9yIGVsZiBmb3JtYXQgYzMyICovCisJCWlmIChjcmVhdGVfYXJnc19hbmRfbG9hZCgoY2hhciAqKWNtZGxpbmUpKQorCQkJcHJpbnRmKCJGYWlsZWQgdG8gbG9hZCBDT00zMiBmaWxlICVzXG4iLCBrZXJuZWwpOworCisJCS8qCisJCSAqIFRoZSBvbGQgQ09NMzIgbW9kdWxlIGNvZGUgd291bGQgcnVuIHRoZSBtb2R1bGUgdGhlbgorCQkgKiBkcm9wIHRoZSB1c2VyIGJhY2sgYXQgdGhlIGNvbW1hbmQgcHJvbXB0LAorCQkgKiBpcnJlc3BlY3RpdmUgb2YgaG93IHRoZSBDT00zMiBtb2R1bGUgd2FzIGxvYWRlZCwKKwkJICogZS5nLiBmcm9tIHZlc2FtZW51LmMzMi4KKwkJICovCisJCXVubG9hZF9tb2R1bGVzX3NpbmNlKExETElOVVgpOworCisJCS8qIFJlc3RvcmUgdGhlIGNvbnNvbGUgKi8KKwkJbGRsaW51eF9jb25zb2xlX2luaXQoKTsKKworCQlsZGxpbnV4X2VudGVyX2NvbW1hbmQoKTsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gSU1BR0VfVFlQRV9DT05GSUcpIHsKKwkJY2hhciAqYXJndltdID0geyBMRExJTlVYLCBOVUxMLCBOVUxMIH07CisJCWNoYXIgKmNvbmZpZzsKKwkJaW50IHJ2OworCisJCS8qIGtlcm5lbCBjb250YWlucyB0aGUgY29uZmlnIGZpbGUgbmFtZSAqLworCQljb25maWcgPSBtYWxsb2MoRklMRU5BTUVfTUFYKTsKKwkJaWYgKCFjb25maWcpCisJCQlnb3RvIG91dDsKKworCQlyZWFscGF0aChjb25maWcsIGtlcm5lbCwgRklMRU5BTUVfTUFYKTsKKworCQkvKiBJZiB3ZSBnb3QgYW55dGhpbmcgb24gdGhlIGNvbW1hbmQgbGluZSwgZG8gYSBjaGRpciAqLworCQlpZiAoKmFyZ3MpCisJCQltYW5nbGVfbmFtZShjb25maWdfY3dkLCBhcmdzKTsKKworCQlhcmd2WzFdID0gY29uZmlnOworCQlydiA9IHN0YXJ0X2xkbGludXgoMiwgYXJndik7CisJCXByaW50ZigiRmFpbGVkIHRvIGV4ZWMgJXM6ICVzXG4iLCBMRExJTlVYLCBzdHJlcnJvcihydikpOworCX0gZWxzZSBpZiAodHlwZSA9PSBJTUFHRV9UWVBFX0xPQ0FMQk9PVCkgeworCQlsb2NhbF9ib290KHN0cnRvdWwoa2VybmVsLCBOVUxMLCAwKSk7CisJfSBlbHNlIGlmICh0eXBlID09IElNQUdFX1RZUEVfUFhFIHx8IHR5cGUgPT0gSU1BR0VfVFlQRV9CU1MgfHwKKwkJICAgdHlwZSA9PSBJTUFHRV9UWVBFX0JPT1QpIHsKKwkJY2hhaW5ib290X2ZpbGUoa2VybmVsLCB0eXBlKTsKKwl9IGVsc2UgeworCQkvKiBOZWVkIGFkZCBvbmUgaXRlbSBmb3Iga2VybmVsIGxvYWQsIGFzIHdlIGRvbid0IHVzZQorCQkqIHRoZSBhc3NlbWJseSBydW5rZXJuZWwuaW5jIGFueSBtb3JlICovCisJCW5ld19saW51eF9rZXJuZWwoKGNoYXIgKilrZXJuZWwsIChjaGFyICopYXJncyk7CisJfQorCitvdXQ6CisJZnJlZSgodm9pZCAqKWtlcm5lbCk7CisKKwkvKiBJZiB0aGlzIHJldHVybnMsIHNvbWV0aGluZyB3ZW50IGJhZDsgcmV0dXJuIHRvIG1lbnUgKi8KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9nZXRfa2V5LmMgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvZ2V0X2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmExMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvZ2V0X2tleS5jCkBAIC0wLDAgKzEsMjQzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZ2V0X2tleS5jCisgKgorICogR2V0IGEgc2luZ2xlIGtleSwgYW5kIHRyeSB0byBwaWNrIGFwYXJ0IGZ1bmN0aW9uIGtleSBjb2Rlcy4KKyAqIFRoaXMgZG9lc24ndCBkZWNvZGUgYW55d2hlcmUgY2xvc2UgdG8gYWxsIHBvc3NpYmxpdGllcywgYnV0CisgKiBob3BlZnVsbHkgaXMgZW5vdWdoIHRvIGJlIHVzZWZ1bC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxnZXRrZXkuaD4KKyNpbmNsdWRlIDxsaWJ1dGlsLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKworc3RydWN0IGtleWNvZGUgeworICAgIGludCBjb2RlOworICAgIGludCBzZXFsZW47CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2VxOworfTsKKworI2RlZmluZSBDT0RFKHgseSkgeyB4LCAoc2l6ZW9mIHkpLTEsIChjb25zdCB1bnNpZ25lZCBjaGFyICopKHkpIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBrZXljb2RlIGtleWNvZGVzW10gPSB7CisgICAgLyogRmlyc3QsIHRoZSBCSU9TIGNvbWJpbmVkIGNvZGVzICovCisgICAgQ09ERShLRVlfRjEsICJcMFx4M0IiKSwKKyAgICBDT0RFKEtFWV9GMiwgIlwwXHgzQyIpLAorICAgIENPREUoS0VZX0YzLCAiXDBceDNEIiksCisgICAgQ09ERShLRVlfRjQsICJcMFx4M0UiKSwKKyAgICBDT0RFKEtFWV9GNSwgIlwwXHgzRiIpLAorICAgIENPREUoS0VZX0Y2LCAiXDBceDQwIiksCisgICAgQ09ERShLRVlfRjcsICJcMFx4NDEiKSwKKyAgICBDT0RFKEtFWV9GOCwgIlwwXHg0MiIpLAorICAgIENPREUoS0VZX0Y5LCAiXDBceDQzIiksCisgICAgQ09ERShLRVlfRjEwLCAiXDBceDQ0IiksCisgICAgQ09ERShLRVlfRjExLCAiXDBceDg1IiksCisgICAgQ09ERShLRVlfRjEyLCAiXDBceDg2IiksCisKKyAgICBDT0RFKEtFWV9VUCwgIlwwXHg0OCIpLAorICAgIENPREUoS0VZX0RPV04sICJcMFx4NTAiKSwKKyAgICBDT0RFKEtFWV9MRUZULCAiXDBceDRCIiksCisgICAgQ09ERShLRVlfUklHSFQsICJcMFx4NEQiKSwKKyAgICBDT0RFKEtFWV9QR1VQLCAiXDBceDQ5IiksCisgICAgQ09ERShLRVlfUEdETiwgIlwwXHg1MSIpLAorICAgIENPREUoS0VZX0hPTUUsICJcMFx4NDciKSwKKyAgICBDT0RFKEtFWV9FTkQsICJcMFx4NEYiKSwKKyAgICBDT0RFKEtFWV9JTlNFUlQsICJcMFx4NTIiKSwKKyAgICBDT0RFKEtFWV9ERUxFVEUsICJcMFx4NTMiKSwKKworICAgIC8qIE5vdywgVlQveHRlcm0vTGludXggY29kZXMgKi8KKyAgICBDT0RFKEtFWV9GMSwgIlwwMzNbW0EiKSwKKyAgICBDT0RFKEtFWV9GMSwgIlwwMzNPUCIpLAorICAgIENPREUoS0VZX0YyLCAiXDAzM1tbQiIpLAorICAgIENPREUoS0VZX0YyLCAiXDAzM09RIiksCisgICAgQ09ERShLRVlfRjMsICJcMDMzW1tDIiksCisgICAgQ09ERShLRVlfRjMsICJcMDMzT1IiKSwKKyAgICBDT0RFKEtFWV9GNCwgIlwwMzNbW0QiKSwKKyAgICBDT0RFKEtFWV9GNCwgIlwwMzNPUyIpLAorICAgIENPREUoS0VZX0Y1LCAiXDAzM1tbRSIpLAorICAgIENPREUoS0VZX0Y1LCAiXDAzM1sxNX4iKSwKKyAgICBDT0RFKEtFWV9GNiwgIlwwMzNbMTd+IiksCisgICAgQ09ERShLRVlfRjcsICJcMDMzWzE4fiIpLAorICAgIENPREUoS0VZX0Y4LCAiXDAzM1sxOX4iKSwKKyAgICBDT0RFKEtFWV9GOSwgIlwwMzNbMjB+IiksCisgICAgQ09ERShLRVlfRjEwLCAiXDAzM1syMX4iKSwKKyAgICBDT0RFKEtFWV9GMTEsICJcMDMzWzIzfiIpLAorICAgIENPREUoS0VZX0YxMiwgIlwwMzNbMjR+IiksCisKKyAgICBDT0RFKEtFWV9VUCwgIlwwMzNbQSIpLAorICAgIENPREUoS0VZX0RPV04sICJcMDMzW0IiKSwKKyAgICBDT0RFKEtFWV9MRUZULCAiXDAzM1tEIiksCisgICAgQ09ERShLRVlfUklHSFQsICJcMDMzW0MiKSwKKyAgICBDT0RFKEtFWV9QR1VQLCAiXDAzM1s1fiIpLAorICAgIENPREUoS0VZX1BHVVAsICJcMDMzW1YiKSwKKyAgICBDT0RFKEtFWV9QR0ROLCAiXDAzM1s2fiIpLAorICAgIENPREUoS0VZX1BHRE4sICJcMDMzW1UiKSwKKyAgICBDT0RFKEtFWV9IT01FLCAiXDAzM1sxfiIpLAorICAgIENPREUoS0VZX0hPTUUsICJcMDMzW0giKSwKKyAgICBDT0RFKEtFWV9FTkQsICJcMDMzWzR+IiksCisgICAgQ09ERShLRVlfRU5ELCAiXDAzM1tGIiksCisgICAgQ09ERShLRVlfRU5ELCAiXDAzM09GIiksCisgICAgQ09ERShLRVlfSU5TRVJULCAiXDAzM1syfiIpLAorICAgIENPREUoS0VZX0lOU0VSVCwgIlwwMzNbQCIpLAorICAgIENPREUoS0VZX0RFTEVURSwgIlwwMzNbM34iKSwKKworICAgIC8qIEVGSSBzY2FuIGNvZGVzICovCisgICAgQ09ERShLRVlfVVAsICJcMFx4MDEiKSwKKyAgICBDT0RFKEtFWV9ET1dOLCAiXDBceDAyIiksCisgICAgQ09ERShLRVlfUklHSFQsICJcMFx4MDMiKSwKKyAgICBDT0RFKEtFWV9MRUZULCAiXDBceDA0IiksCisgICAgQ09ERShLRVlfSE9NRSwgIlwwXHgwNSIpLAorICAgIENPREUoS0VZX0VORCwgIlwwXHgwNiIpLAorICAgIENPREUoS0VZX0lOU0VSVCwgIlwwXHgwNyIpLAorICAgIENPREUoS0VZX0RFTEVURSwgIlwwXHgwOCIpLAorICAgIENPREUoS0VZX1BHVVAsICJcMFx4MDkiKSwKKyAgICBDT0RFKEtFWV9QR0ROLCAiXDBceDBhIiksCisgICAgQ09ERShLRVlfRjEsICJcMFx4MGIiKSwKKyAgICBDT0RFKEtFWV9GMiwgIlwwXHgwYyIpLAorICAgIENPREUoS0VZX0YzLCAiXDBceDBkIiksCisgICAgQ09ERShLRVlfRjQsICJcMFx4MGUiKSwKKyAgICBDT0RFKEtFWV9GNSwgIlwwXHgwZiIpLAorICAgIENPREUoS0VZX0Y2LCAiXDBceDEwIiksCisgICAgQ09ERShLRVlfRjcsICJcMFx4MTEiKSwKKyAgICBDT0RFKEtFWV9GOCwgIlwwXHgxMiIpLAorICAgIENPREUoS0VZX0Y5LCAiXDBceDEzIiksCisgICAgQ09ERShLRVlfRjEwLCAiXDBceDE0IiksCisgICAgQ09ERShLRVlfRjExLCAiXDBceDE1IiksCisgICAgQ09ERShLRVlfRjEyLCAiXDBceDE2IiksCisgICAgQ09ERShLRVlfRVNDLCAiXDBceDE3IiksCit9OworCisjZGVmaW5lIE5DT0RFUyAoKGludCkoc2l6ZW9mIGtleWNvZGVzL3NpemVvZihzdHJ1Y3Qga2V5Y29kZSkpKQorCisjZGVmaW5lIEtFWV9USU1FT1VUICgoQ0xLX1RDSys5KS8xMCkKKworLyoKKyAqIEF0dGVtcHQgdG8gZGVjb2RlIHRoZSBrZXkgc2VxdWVuY2UgaW4gJ2J1ZmZlcicuCisgKgorICogT24gc3VjY2VzcyAodGhlIGRhdGEgaW4gJ2J1ZmZlcicgbWF0Y2hlcyBhIGtleSBjb2RlKSBwdXQgdGhlCisgKiBjb3JyZXNwb25kaW5nIGtleSBjb2RlIGluICdjb2RlJyBhbmQgcmV0dXJuIDAuIFJldHVybiAxIGlmICdidWZmZXInCisgKiBwYXJ0aWFsbHkgbWF0Y2hlcyBhIGtleSBjb2RlLCBpLmUuIHdlIG5lZWQgbW9yZSBkYXRhIGJlZm9yZSB3ZSBjYW4KKyAqIG1ha2UgYW4gdW5hbWJpZ3VvdXMgbWF0Y2guIFJldHVybiAtMSBpZiB0aGUgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4KKyAqIGEga2V5IGNvZGUuCisgKi8KK2ludCBnZXRfa2V5X2RlY29kZShjaGFyICpidWZmZXIsIGludCBuYywgaW50ICpjb2RlKQoreworICAgIGNvbnN0IHN0cnVjdCBrZXljb2RlICprYzsKKyAgICBpbnQgaSwgcnY7CisKKyAgICBydiA9IC0xOworICAgIGZvciAoaSA9IDAsIGtjID0ga2V5Y29kZXM7IGkgPCBOQ09ERVM7IGkrKywga2MrKykgeworCWlmIChuYyA9PSBrYy0+c2VxbGVuICYmICFtZW1jbXAoYnVmZmVyLCBrYy0+c2VxLCBuYykpIHsKKwkgICAgKmNvZGUgPSBrYy0+Y29kZTsKKwkgICAgcnYgPSAwOworCSAgICBicmVhazsKKwl9IGVsc2UgaWYgKG5jIDwga2MtPnNlcWxlbiAmJiAhbWVtY21wKGJ1ZmZlciwga2MtPnNlcSwgbmMpKSB7CisJICAgIHJ2ID0gMTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybiBydjsKK30KKworI2lmZGVmIF9fQ09NMzJfXworZXh0ZXJuIHNzaXplX3QgX19yYXdjb25fcmVhZChzdHJ1Y3QgZmlsZV9pbmZvICpmcCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpOworCitpbnQgcmF3X3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwkodm9pZClmZDsKKworCS8qCisJICogSW5zdGVhZCBvZiB1c2luZyB0aGUgcmVhZCgyKSBzdGRsaWIgZnVuY3Rpb24gdXNlCisJICogX19yYXdjb25fcmVhZCgpIGRpcmVjdGx5IHNpbmNlIHdlIHdhbnQgYSBzaW5nbGUga2V5IGFuZAorCSAqIGRvbid0IHdhbnQgYW55IHByb2Nlc3NpbmcvYmF0Y2hpbmcgb2YgdGhlIHVzZXIgaW5wdXQgdG8KKwkgKiBvY2N1ciAtIHdlIHdhbnQgdGhlIHJhdyBkYXRhLgorCSAqLworCXJldHVybiBfX3Jhd2Nvbl9yZWFkKE5VTEwsIGJ1ZiwgY291bnQpOworfQorI2Vsc2UKK2V4dGVybiBpbnQgcmF3X3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CisjZW5kaWYKKworX19leHBvcnQgaW50IGdldF9rZXkoRklMRSAqIGYsIGNsb2NrX3QgdGltZW91dCkKK3sKKyAgICBjaGFyIGJ1ZmZlcltLRVlfTUFYTEVOXTsKKyAgICBpbnQgbmMsIHJ2OworICAgIGludCBhbm90aGVyOworICAgIGNoYXIgY2g7CisgICAgY2xvY2tfdCBzdGFydDsKKyAgICBpbnQgY29kZTsKKworICAgIC8qIFdlIHR5cGljYWxseSBzdGFydCBpbiB0aGUgbWlkZGxlIG9mIGEgY2xvY2sgdGljayAqLworICAgIGlmICh0aW1lb3V0KQorCXRpbWVvdXQrKzsKKworICAgIG5jID0gMDsKKyAgICBzdGFydCA9IHRpbWVzKE5VTEwpOworICAgIGRvIHsKKwlydiA9IHJhd19yZWFkKGZpbGVubyhmKSwgJmNoLCAxKTsKKwlpZiAocnYgPT0gMCB8fCAocnYgPT0gLTEgJiYgZXJybm8gPT0gRUFHQUlOKSkgeworCSAgICBjbG9ja190IGxhdGVuZXNzID0gdGltZXMoTlVMTCkgLSBzdGFydDsKKwkgICAgaWYgKG5jICYmIGxhdGVuZXNzID4gMSArIEtFWV9USU1FT1VUKSB7CisJCWlmIChuYyA9PSAxKQorCQkgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKWJ1ZmZlclswXTsJLyogdGltZW91dCAqLworCQllbHNlIGlmICh0aW1lb3V0ICYmIGxhdGVuZXNzID4gdGltZW91dCkKKwkJICAgIHJldHVybiBLRVlfTk9ORTsKKwkgICAgfSBlbHNlIGlmICghbmMgJiYgdGltZW91dCAmJiBsYXRlbmVzcyA+IHRpbWVvdXQpCisJCXJldHVybiBLRVlfTk9ORTsJLyogdGltZW91dCBiZWZvcmUgc2VxdWVuY2UgKi8KKworCSAgICBkb19pZGxlKCk7CisKKwkgICAgYW5vdGhlciA9IDE7CisJICAgIGNvbnRpbnVlOworCX0KKworCXN0YXJ0ID0gdGltZXMoTlVMTCk7CisKKwlidWZmZXJbbmMrK10gPSBjaDsKKworCWFub3RoZXIgPSAwOworCXJ2ID0gZ2V0X2tleV9kZWNvZGUoYnVmZmVyLCBuYywgJmNvZGUpOworCWlmICghcnYpCisJCXJldHVybiBjb2RlOworCWVsc2UgaWYgKHJ2ID09IDEpCisJCWFub3RoZXIgPSAxOworCisgICAgfSB3aGlsZSAoYW5vdGhlcik7CisKKyAgICAvKiBXZSBnb3QgYW4gdW5yZWNvZ25pemVkIHNlcXVlbmNlOyByZXR1cm4gdGhlIGZpcnN0IGNoYXJhY3RlciAqLworICAgIC8qIFdlIHJlYWxseSBzaG91bGQgcmVtZW1iZXIgdGhpcyBhbmQgcmV0dXJuIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBsYXRlciAqLworICAgIHJldHVybiAodW5zaWduZWQgY2hhcilidWZmZXJbMF07Cit9CmRpZmYgLS1naXQgYS9jb20zMi9lbGZsaW5rL2xkbGludXgvZ2V0YWR2LmMgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvZ2V0YWR2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyN2YxYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9nZXRhZHYuYwpAQCAtMCwwICsxLDY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbGludXgvZ2V0YWR2LmMKKyAqCisgKiBHZXQgYSBkYXRhIGl0ZW0gZnJvbSB0aGUgYXV4aWxsaWFyeSBkYXRhIHZlY3Rvci4gIFJldHVybnMgYSBwb2ludGVyCisgKiBhbmQgc2V0cyAqc2l6ZSBvbiBzdWNjZXNzOyBOVUxMIG9uIGZhaWx1cmUuCisgKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L2Fkdi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworX19leHBvcnQgY29uc3Qgdm9pZCAqc3lzbGludXhfZ2V0YWR2KGludCB0YWcsIHNpemVfdCAqIHNpemUpCit7CisgICAgY29uc3QgdWludDhfdCAqcDsKKyAgICBzaXplX3QgbGVmdDsKKworICAgIHAgPSBzeXNsaW51eF9hZHZfcHRyKCk7CisgICAgbGVmdCA9IHN5c2xpbnV4X2Fkdl9zaXplKCk7CisKKyAgICB3aGlsZSAobGVmdCA+PSAyKSB7CisJdWludDhfdCBwdGFnID0gKnArKzsKKwlzaXplX3QgcGxlbiA9ICpwKys7CisJbGVmdCAtPSAyOworCisJaWYgKHB0YWcgPT0gQURWX0VORCkKKwkgICAgcmV0dXJuIE5VTEw7CS8qIE5vdCBmb3VuZCAqLworCisJaWYgKGxlZnQgPCBwbGVuKQorCSAgICByZXR1cm4gTlVMTDsJLyogSXRlbSBvdmVycnVuICovCisKKwlpZiAocHRhZyA9PSB0YWcpIHsKKwkgICAgKnNpemUgPSBwbGVuOworCSAgICByZXR1cm4gcDsKKwl9CisKKwlwICs9IHBsZW47CisJbGVmdCAtPSBwbGVuOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZWxmbGluay9sZGxpbnV4L2tlcm5lbC5jIGIvY29tMzIvZWxmbGluay9sZGxpbnV4L2tlcm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmEzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9lbGZsaW5rL2xkbGludXgva2VybmVsLmMKQEAgLTAsMCArMSwxMzEgQEAKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbGludXguaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9weGUuaD4KKyNpbmNsdWRlICJjb3JlLmgiCisKK2NvbnN0IGNoYXIgKmdsb2JhbGRlZmF1bHQgPSBOVUxMOworY29uc3QgY2hhciAqYXBwZW5kID0gTlVMTDsKKworLyogV2lsbCBiZSBjYWxsZWQgZnJvbSByZWFkY29uZmlnLmMgKi8KK2ludCBuZXdfbGludXhfa2VybmVsKGNoYXIgKm9rZXJuZWwsIGNoYXIgKm9jbWRsaW5lKQoreworCWNvbnN0IGNoYXIgKmtlcm5lbF9uYW1lID0gTlVMTCwgKmFyZ3MgPSBOVUxMOworCXN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mcyA9IE5VTEw7CisJY2hhciAqdGVtcDsKKwl2b2lkICprZXJuZWxfZGF0YTsKKwlzaXplX3Qga2VybmVsX2xlbiwgY21kbGluZV9sZW47CisJYm9vbCBvcHRfcXVpZXQgPSBmYWxzZTsKKwljaGFyICppbml0cmRfbmFtZSwgKmNtZGxpbmU7CisKKwlkcHJpbnRmKCJva2VybmVsID0gJXMsIG9jbWRsaW5lID0gJXMiLCBva2VybmVsLCBvY21kbGluZSk7CisKKwlpZiAob2tlcm5lbCkKKwkJa2VybmVsX25hbWUgPSBva2VybmVsOworCWVsc2UgaWYgKGdsb2JhbGRlZmF1bHQpCisJCWtlcm5lbF9uYW1lID0gZ2xvYmFsZGVmYXVsdDsKKworCWlmIChvY21kbGluZSkKKwkJYXJncyA9IG9jbWRsaW5lOworCWVsc2UgaWYgKGFwcGVuZCkKKwkJYXJncyA9IGFwcGVuZDsKKworCWNtZGxpbmVfbGVuID0gc3RybGVuKCJCT09UX0lNQUdFPSIpICsgc3RybGVuKGtlcm5lbF9uYW1lKTsKKwljbWRsaW5lX2xlbiArPSAxOwkvKiBzcGFjZSBiZXR3ZWVuIEJPT1RfSU1BR0UgYW5kIGFyZ3MgKi8KKwljbWRsaW5lX2xlbiArPSBzdHJsZW4oYXJncyk7CisJY21kbGluZV9sZW4gKz0gMTsJLyogTlVMLXRlcm1pbmF0aW9uICovCisKKwljbWRsaW5lID0gbWFsbG9jKGNtZGxpbmVfbGVuKTsKKwlpZiAoIWNtZGxpbmUpIHsKKwkgICAgcHJpbnRmKCJGYWlsZWQgdG8gYWxsb2MgbWVtb3J5IGZvciBjbWRsaW5lXG4iKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJc3ByaW50ZihjbWRsaW5lLCAiQk9PVF9JTUFHRT0lcyAlcyIsIGtlcm5lbF9uYW1lLCBhcmdzKTsKKworCS8qICJrZWVwcHhlIiBoYW5kbGluZyAqLworI2lmIElTX1BYRUxJTlVYCisJZXh0ZXJuIGNoYXIgS2VlcFBYRTsKKworCWlmIChzdHJzdHIoY21kbGluZSwgImtlZXBweGUiKSkKKwkJS2VlcFBYRSB8PSAxOworI2VuZGlmCisKKwlpZiAoc3Ryc3RyKGNtZGxpbmUsICJxdWlldCIpKQorCQlvcHRfcXVpZXQgPSB0cnVlOworCisJaWYgKCFvcHRfcXVpZXQpCisJCXByaW50ZigiTG9hZGluZyAlcy4uLiAiLCBrZXJuZWxfbmFtZSk7CisKKwlpZiAobG9hZGZpbGUoa2VybmVsX25hbWUsICZrZXJuZWxfZGF0YSwgJmtlcm5lbF9sZW4pKSB7CisJCWlmIChvcHRfcXVpZXQpCisJCQlwcmludGYoIkxvYWRpbmcgJXMgIiwga2VybmVsX25hbWUpOworCQlwcmludGYoImZhaWxlZDogIik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAoIW9wdF9xdWlldCkKKwkJcHJpbnRmKCJva1xuIik7CisKKwkvKiBGaW5kIGFuZCBsb2FkIGluaXRyYW1mcyAqLworCXRlbXAgPSBzdHJzdHIoY21kbGluZSwgImluaXRyZD0iKTsKKwlpZiAodGVtcCkgeworCQkvKiBJbml0aWFsaXplIHRoZSBpbml0cmFtZnMgY2hhaW4gKi8KKwkJaW5pdHJhbWZzID0gaW5pdHJhbWZzX2luaXQoKTsKKwkJaWYgKCFpbml0cmFtZnMpCisJCQlnb3RvIGJhaWw7CisKKwkJdGVtcCArPSA2OyAvKiBzdHJsZW4oImluaXRyZCIpICovCisJCWRvIHsKKwkJICAgIHNpemVfdCBuID0gMDsKKwkJICAgIGNoYXIgKnA7CisKKwkJICAgIHRlbXArKzsJLyogU2tpcCA9IG9yICwgKi8KKworCQkgICAgcCA9IHRlbXA7CisJCSAgICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICcsJyAmJiAqcCkgeworCQkJcCsrOworCQkJbisrOworCQkgICAgfQorCisJCSAgICBpbml0cmRfbmFtZSA9IG1hbGxvYyhuICsgMSk7CisJCSAgICBpZiAoIWluaXRyZF9uYW1lKSB7CisJCQlwcmludGYoIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgaW5pdHJkXG4iKTsKKwkJCWdvdG8gYmFpbDsKKwkJICAgIH0KKworCQkgICAgc25wcmludGYoaW5pdHJkX25hbWUsIG4gKyAxLCAiJXMiLCB0ZW1wKTsKKwkJICAgIHRlbXAgKz0gbjsKKworCQkgICAgaWYgKCFvcHRfcXVpZXQpCisJCQlwcmludGYoIkxvYWRpbmcgJXMuLi4iLCBpbml0cmRfbmFtZSk7CisKKwkJICAgIGlmIChpbml0cmFtZnNfbG9hZF9hcmNoaXZlKGluaXRyYW1mcywgaW5pdHJkX25hbWUpKSB7CisJCQlpZiAob3B0X3F1aWV0KQorCQkJICAgIHByaW50ZigiTG9hZGluZyAlcyAiLCBpbml0cmRfbmFtZSk7CisJCQlmcmVlKGluaXRyZF9uYW1lKTsKKwkJCXByaW50ZigiZmFpbGVkOiAiKTsKKwkJCWdvdG8gYmFpbDsKKwkJICAgIH0KKworCQkgICAgZnJlZShpbml0cmRfbmFtZSk7CisKKwkJICAgIGlmICghb3B0X3F1aWV0KQorCQkJcHJpbnRmKCJva1xuIik7CisJCX0gd2hpbGUgKCp0ZW1wID09ICcsJyk7CisJfQorCisJLyogVGhpcyBzaG91bGQgbm90IHJldHVybi4uLiAqLworCXN5c2xpbnV4X2Jvb3RfbGludXgoa2VybmVsX2RhdGEsIGtlcm5lbF9sZW4sIGluaXRyYW1mcywgTlVMTCwgY21kbGluZSk7CisJcHJpbnRmKCJCb290aW5nIGtlcm5lbCBmYWlsZWQ6ICIpOworCitiYWlsOgorCWZyZWUoY21kbGluZSk7CisJcHJpbnRmKCIlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9sZGxpbnV4LmMgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvbGRsaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDFkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvbGRsaW51eC5jCkBAIC0wLDAgKzEsMzQ4IEBACisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgImNsaS5oIgorI2luY2x1ZGUgImNvbnNvbGUuaCIKKyNpbmNsdWRlICJjb20zMi5oIgorI2luY2x1ZGUgIm1lbnUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzeXNsaW51eC9hZHYuaCIKKyNpbmNsdWRlICJzeXNsaW51eC9ib290LmgiCisjaW5jbHVkZSAic3lzbGludXgvY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzeXMvbW9kdWxlLmg+CisKK3N0cnVjdCBmaWxlX2V4dCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwllbnVtIGtlcm5lbF90eXBlIHR5cGU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfZXh0IGZpbGVfZXh0ZW5zaW9uc1tdID0geworCXsgIi5jMzIiLCBJTUFHRV9UWVBFX0NPTTMyIH0sCisJeyAiLmltZyIsIElNQUdFX1RZUEVfRkRJTUFHRSB9LAorCXsgIi5ic3MiLCBJTUFHRV9UWVBFX0JTUyB9LAorCXsgIi5iaW4iLCBJTUFHRV9UWVBFX0JPT1QgfSwKKwl7ICIuYnMiLCBJTUFHRV9UWVBFX0JPT1QgfSwKKwl7ICIuMCIsIElNQUdFX1RZUEVfUFhFIH0sCisJeyBOVUxMLCAwIH0sCit9OworCisvKgorICogUmV0dXJuIGEgcG9pbnRlciB0byBvbmUgYnl0ZSBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlCisgKiBjb21tYW5kLgorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZpbmRfY29tbWFuZChjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqcDsKKworCXAgPSBzdHI7CisJd2hpbGUgKCpwICYmICFteV9pc3NwYWNlKCpwKSkKKwkJcCsrOworCXJldHVybiBwOworfQorCitfX2V4cG9ydCB1aW50MzJfdCBwYXJzZV9pbWFnZV90eXBlKGNvbnN0IGNoYXIgKmtlcm5lbCkKK3sKKwljb25zdCBzdHJ1Y3QgZmlsZV9leHQgKmV4dDsKKwljb25zdCBjaGFyICpwOworCWludCBsZW47CisKKwkvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgKi8KKwlwID0gZmluZF9jb21tYW5kKGtlcm5lbCk7CisJbGVuID0gcCAtIGtlcm5lbDsKKworCWZvciAoZXh0ID0gZmlsZV9leHRlbnNpb25zOyBleHQtPm5hbWU7IGV4dCsrKSB7CisJCWludCBlbGVuID0gc3RybGVuKGV4dC0+bmFtZSk7CisKKwkJaWYgKCFzdHJuY21wKGtlcm5lbCArIGxlbiAtIGVsZW4sIGV4dC0+bmFtZSwgZWxlbikpCisJCQlyZXR1cm4gZXh0LT50eXBlOworCX0KKworCS8qIHVzZSBJTUFHRV9UWVBFX0tFUk5FTCBhcyBkZWZhdWx0ICovCisJcmV0dXJuIElNQUdFX1RZUEVfS0VSTkVMOworfQorCisvKgorICogUmV0dXJucyB0aGUga2VybmVsIG5hbWUgd2l0aCBmaWxlIGV4dGVuc2lvbiBpZiBvbmUgd2Fzbid0IHByZXNlbnQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfZXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmtlcm5lbCkKK3sKKwljb25zdCBzdHJ1Y3QgZmlsZV9leHQgKmV4dDsKKwljb25zdCBjaGFyICpwOworCWludCBsZW47CisKKwkvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgKi8KKwlwID0gZmluZF9jb21tYW5kKGtlcm5lbCk7CisJbGVuID0gcCAtIGtlcm5lbDsKKworCWZvciAoZXh0ID0gZmlsZV9leHRlbnNpb25zOyBleHQtPm5hbWU7IGV4dCsrKSB7CisJCWNoYXIgKnN0cjsKKwkJaW50IGVsZW4gPSBzdHJsZW4oZXh0LT5uYW1lKTsKKwkJRklMRSAqZjsKKworCQlzdHIgPSBtYWxsb2MobGVuICsgZWxlbiArIDEpOworCisJCXN0cm5jcHkoc3RyLCBrZXJuZWwsIGxlbik7CisJCXN0cm5jcHkoc3RyICsgbGVuLCBleHQtPm5hbWUsIGVsZW4pOworCQlzdHJbbGVuICsgZWxlbl0gPSAnXDAnOworCQlmID0gZmluZHBhdGgoc3RyKTsKKwkJZnJlZShzdHIpOworCisJCWlmIChmKSB7CisJCQlmY2xvc2UoZik7CisJCQlyZXR1cm4gZXh0LT5uYW1lOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKmFwcGx5X2V4dGVuc2lvbihjb25zdCBjaGFyICprZXJuZWwsIGNvbnN0IGNoYXIgKmV4dCkKK3sKKwljb25zdCBjaGFyICpwOworCWNoYXIgKms7CisJaW50IGxlbiA9IHN0cmxlbihrZXJuZWwpOworCWludCBlbGVuID0gc3RybGVuKGV4dCk7CisKKwlrID0gbWFsbG9jKGxlbiArIGVsZW4gKyAxKTsKKwlpZiAoIWspCisJCXJldHVybiBOVUxMOworCisJcCA9IGZpbmRfY29tbWFuZChrZXJuZWwpOworCisJbGVuID0gcCAtIGtlcm5lbDsKKworCS8qIENvcHkganVzdCB0aGUga2VybmVsIG5hbWUgKi8KKwltZW1jcHkoaywga2VybmVsLCBsZW4pOworCisJLyogQXBwZW5kIHRoZSBleHRlbnNpb24gKi8KKwlpZiAoc3RybmNtcChwIC0gZWxlbiwgZXh0LCBlbGVuKSkgeworCQltZW1jcHkoayArIGxlbiwgZXh0LCBlbGVuKTsKKwkJbGVuICs9IGVsZW47CisJfQorCisJLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBsaW5lICovCisJc3RyY3B5KGsgKyBsZW4sIHApOworCisJa1tsZW4gKyBzdHJsZW4ocCldID0gJ1wwJzsKKworCXJldHVybiBrOworfQorCisvKgorICogQXR0ZW1wdCB0byBsb2FkIGEga2VybmVsIGFmdGVyIGRlY2lkaW5nIHdoYXQgdHlwZSBvZiBpbWFnZSBpdCBpcy4KKyAqCisgKiBXZSBvbmx5IHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgbG9hZGluZworICogdGhlIHRoZSBrZXJuZWwuIElmIHdlIHJldHVybiB0aGUgY2FsbGVyIHNob3VsZCBjYWxsIGVudGVyX2NtZGxpbmUoKQorICogc28gdGhhdCB0aGUgdXNlciBjYW4gaGVscCB1cyBvdXQuCisgKi8KK19fZXhwb3J0IHZvaWQgbG9hZF9rZXJuZWwoY29uc3QgY2hhciAqY29tbWFuZF9saW5lKQoreworCXN0cnVjdCBtZW51X2VudHJ5ICptZTsKKwljb25zdCBjaGFyICpjbWRsaW5lOworCWNvbnN0IGNoYXIgKmtlcm5lbDsKKwl1aW50MzJfdCB0eXBlOworCisJa2VybmVsID0gc3RyZHVwKGNvbW1hbmRfbGluZSk7CisJaWYgKCFrZXJuZWwpCisJCWdvdG8gYmFkX2tlcm5lbDsKKworCS8qIFZpcnR1YWwga2VybmVsPyAqLworCW1lID0gZmluZF9sYWJlbChrZXJuZWwpOworCWlmIChtZSkgeworCQljb25zdCBjaGFyICphcmdzOworCQljaGFyICpjbWQ7CisJCXNpemVfdCBsZW4gPSBzdHJsZW4obWUtPmNtZGxpbmUpICsgMTsKKworCQkvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgKi8KKwkJYXJncyA9IGZpbmRfY29tbWFuZChrZXJuZWwpOworCQl3aGlsZSgqYXJncyAmJiBteV9pc3NwYWNlKCphcmdzKSkKKwkJCWFyZ3MrKzsKKworCQlpZiAoc3RybGVuKGFyZ3MpKQorCQkJbGVuICs9IHN0cmxlbihhcmdzKSArIDE7IC8qICsxIGZvciBzcGFjZSAoJyAnKSAqLworCisJCWNtZCA9IG1hbGxvYyhsZW4pOworCQlpZiAoIWNtZCkKKwkJCWdvdG8gYmFkX2tlcm5lbDsKKworCQlpZiAoc3RybGVuKGFyZ3MpKQorCQkJc25wcmludGYoY21kLCBsZW4sICIlcyAlcyIsIG1lLT5jbWRsaW5lLCBhcmdzKTsKKwkJZWxzZQorCQkJc3RybmNweShjbWQsIG1lLT5jbWRsaW5lLCBsZW4pOworCisJCXR5cGUgPSBwYXJzZV9pbWFnZV90eXBlKGNtZCk7CisJCWV4ZWN1dGUoY21kLCB0eXBlLCBmYWxzZSk7CisJCS8qIFdlIHNob3VsZG4ndCByZXR1cm4gKi8KKwkJZ290byBiYWRfa2VybmVsOworCX0KKworCWlmICghYWxsb3dpbXBsaWNpdCkKKwkJZ290byBiYWRfaW1wbGljaXQ7CisKKwkvKiBJbnNlcnQgYSBudWxsIGNoYXJhY3RlciB0byBpZ25vcmUgYW55IHVzZXItc3BlY2lmaWVkIG9wdGlvbnMgKi8KKwlpZiAoIWFsbG93b3B0aW9ucykgeworCQljaGFyICpwID0gKGNoYXIgKilmaW5kX2NvbW1hbmQoa2VybmVsKTsKKwkJKnAgPSAnXDAnOworCX0KKworCXR5cGUgPSBwYXJzZV9pbWFnZV90eXBlKGtlcm5lbCk7CisJaWYgKHR5cGUgPT0gSU1BR0VfVFlQRV9LRVJORUwpIHsKKwkJY29uc3QgY2hhciAqZXh0OworCisJCS8qCisJCSAqIEF1dG9tYXRpY2FsbHkgbG9va3VwIHRoZSBleHRlbnNpb24gaWYgb25lIHdhc24ndAorCQkgKiBzdXBwbGllZCBieSB0aGUgdXNlci4KKwkJICovCisJCWV4dCA9IGdldF9leHRlbnNpb24oa2VybmVsKTsKKwkJaWYgKGV4dCkgeworCQkJY29uc3QgY2hhciAqazsKKworCQkJayA9IGFwcGx5X2V4dGVuc2lvbihrZXJuZWwsIGV4dCk7CisJCQlpZiAoIWspCisJCQkJZ290byBiYWRfa2VybmVsOworCisJCQlmcmVlKCh2b2lkICopa2VybmVsKTsKKwkJCWtlcm5lbCA9IGs7CisKKwkJCXR5cGUgPSBwYXJzZV9pbWFnZV90eXBlKGtlcm5lbCk7CisJCX0KKwl9CisKKwlleGVjdXRlKGtlcm5lbCwgdHlwZSwgdHJ1ZSk7CisJZnJlZSgodm9pZCAqKWtlcm5lbCk7CisKK2JhZF9pbXBsaWNpdDoKK2JhZF9rZXJuZWw6CisJLyoKKwkgKiBJZiB3ZSBmYWlsIHRvIGJvb3QgdGhlIGtlcm5lbCBleGVjdXRlIHRoZSAib25lcnJvciIgY29tbWFuZAorCSAqIGxpbmUuCisJICovCisJaWYgKG9uZXJyb3JsZW4pIHsKKwkJbWUgPSBmaW5kX2xhYmVsKG9uZXJyb3IpOworCQlpZiAobWUpCisJCQlyc3ByaW50ZigmY21kbGluZSwgIiVzICVzIiwgbWUtPmNtZGxpbmUsIGRlZmF1bHRfY21kKTsKKwkJZWxzZQorCQkJcnNwcmludGYoJmNtZGxpbmUsICIlcyAlcyIsIG9uZXJyb3IsIGRlZmF1bHRfY21kKTsKKworCQl0eXBlID0gcGFyc2VfaW1hZ2VfdHlwZShjbWRsaW5lKTsKKwkJZXhlY3V0ZShjbWRsaW5lLCB0eXBlLCB0cnVlKTsKKwl9Cit9CisKKy8qCisgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgeW91IG11c3QgY2FsbCBsZGludXhfZW50ZXJfY29tbWFuZCgpIHRvCisgKiBwcmVzZXJ2ZSB0aGUgNC4weCBiZWhhdmlvdXIuCisgKi8KK3ZvaWQgbGRsaW51eF9hdXRvX2Jvb3Qodm9pZCkKK3sKKwlpZiAoIWRlZmF1bHRsZXZlbCkgeworCQlpZiAoc3RybGVuKENvbmZpZ05hbWUpKQorCQkJcHJpbnRmKCJObyBERUZBVUxUIG9yIFVJIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlIGZvdW5kIVxuIik7CisJCWlmIChub2VzY2FwZSkKKwkJCWthYm9vbSgpOworCX0gZWxzZQorCQlsb2FkX2tlcm5lbChkZWZhdWx0X2NtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGVudGVyX2NtZGxpbmUodm9pZCkKK3sKKwljb25zdCBjaGFyICpjbWRsaW5lOworCisJLyogRW50ZXIgZW5kbGVzcyBjb21tYW5kIGxpbmUgcHJvbXB0LCBzaG91bGQgc3VwcG9ydCAiZXhpdCIgKi8KKwl3aGlsZSAoMSkgeworCQlib29sIHRvID0gZmFsc2U7CisKKwkJaWYgKG5vZXNjYXBlKSB7CisJCQlsZGxpbnV4X2F1dG9fYm9vdCgpOworCQkJY29udGludWU7CisJCX0KKworCQljbWRsaW5lID0gZWRpdF9jbWRsaW5lKCJib290OiIsIDEsIE5VTEwsIGNhdF9oZWxwX2ZpbGUsICZ0byk7CisJCXByaW50ZigiXG4iKTsKKworCQkvKiByZXR1cm4gaWYgdXNlciBvbmx5IHByZXNzIGVudGVyIG9yIHdlIHRpbWVkIG91dCAqLworCQlpZiAoIWNtZGxpbmUgfHwgY21kbGluZVswXSA9PSAnXDAnKSB7CisJCQlpZiAodG8gJiYgb250aW1lb3V0bGVuKQorCQkJCWxvYWRfa2VybmVsKG9udGltZW91dCk7CisJCQllbHNlCisJCQkJbGRsaW51eF9hdXRvX2Jvb3QoKTsKKwkJfSBlbHNlCisJCQlsb2FkX2tlcm5lbChjbWRsaW5lKTsKKwl9Cit9CisKK3ZvaWQgbGRsaW51eF9lbnRlcl9jb21tYW5kKHZvaWQpCit7CisJZW50ZXJfY21kbGluZSgpOworfQorCisvKgorICogVW5kbyB0aGUgd29yayB3ZSBkaWQgaW4gb3BlbmNvbnNvbGUoKS4KKyAqLworc3RhdGljIHZvaWQgX19kZXN0cnVjdG9yIGNsb3NlX2NvbnNvbGUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKQorCQljbG9zZShpKTsKK30KKwordm9pZCBsZGxpbnV4X2NvbnNvbGVfaW5pdCh2b2lkKQoreworCW9wZW5jb25zb2xlKCZkZXZfc3RkY29uX3IsICZkZXZfYW5zaXNlcmlhbF93KTsKK30KKworX19leHBvcnQgaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IHZvaWQgKmFkdjsKKwljb25zdCBjaGFyICpjbWRsaW5lOworCXNpemVfdCBjb3VudCA9IDA7CisKKwlsZGxpbnV4X2NvbnNvbGVfaW5pdCgpOworCisJcGFyc2VfY29uZmlncygmYXJndlsxXSk7CisKKwlfX3N5c2xpbnV4X3NldF9zZXJpYWxfY29uc29sZV9pbmZvKCk7CisKKwlhZHYgPSBzeXNsaW51eF9nZXRhZHYoQURWX0JPT1RPTkNFLCAmY291bnQpOworCWlmIChhZHYgJiYgY291bnQpIHsKKwkJLyoKKwkJICogV2UgYXBwYXJlbnRseSBoYXZlIGEgYm9vdC1vbmNlIHNldDsgY2xlYXIgaXQgYW5kCisJCSAqIHRoZW4gZXhlY3V0ZSB0aGUgYm9vdC1vbmNlLgorCQkgKi8KKwkJY2hhciAqc3JjLCAqZHN0OworCQlzaXplX3QgaTsKKworCQlzcmMgPSAoY2hhciAqKWFkdjsKKwkJY21kbGluZSA9IGRzdCA9IG1hbGxvYyhjb3VudCArIDEpOworCQlpZiAoIWRzdCkgeworCQkJcHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBBRFZcbiIpOworCQkJbGRsaW51eF9lbnRlcl9jb21tYW5kKCk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCSpkc3QrKyA9ICpzcmMrKzsKKwkJKmRzdCA9ICdcMCc7CS8qIE51bGwtdGVybWluYXRlICovCisKKwkJLyogQ2xlYXIgdGhlIGJvb3Qtb25jZSBkYXRhIGZyb20gdGhlIEFEViAqLworCQlpZiAoIXN5c2xpbnV4X3NldGFkdihBRFZfQk9PVE9OQ0UsIDAsIE5VTEwpKQorCQkJc3lzbGludXhfYWR2X3dyaXRlKCk7CisKKwkJbG9hZF9rZXJuZWwoY21kbGluZSk7IC8qIFNob3VsZG4ndCByZXR1cm4gKi8KKwkJbGRsaW51eF9lbnRlcl9jb21tYW5kKCk7CisJfQorCisJaWYgKCFmb3JjZXByb21wdCAmJiAhc2hpZnRfaXNfaGVsZCgpKQorCQlsZGxpbnV4X2F1dG9fYm9vdCgpOworCisJaWYgKGRlZmF1bHRsZXZlbCA+IDEpCisJCWxkbGludXhfYXV0b19ib290KCk7CisKKwlsZGxpbnV4X2VudGVyX2NvbW1hbmQoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9sb2FkaGlnaC5jIGIvY29tMzIvZWxmbGluay9sZGxpbnV4L2xvYWRoaWdoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyZjg0MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9sb2FkaGlnaC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAxOTk0LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbG9hZGhpZ2guYworICoKKyAqIEFuIGFsdGVybmF0ZSBpbnRlcmZhY2UgdG8gZ2V0ZnNzZWMuCisgKgorICogSW5wdXRzOglTSSAgPSBmaWxlIGhhbmRsZS9jbHVzdGVyIHBvaW50ZXIKKyAqCQlFREkgPSB0YXJnZXQgYWRkcmVzcyBpbiBoaWdoIG1lbW9yeQorICoJCUVBWCA9IG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGxvYWQKKyAqCQlEWCAgPSB6ZXJvLXBhZGRpbmcgbWFzayAoZS5nLiAwMDAzaCBmb3IgcGFkIHRvIGR3b3JkKQorICoJCUJYICA9IDE2LWJpdCBzdWJyb3V0aW5lIHRvIGNhbGwgYXQgdGhlIHRvcCBvZiBlYWNoIGxvb3AKKyAqICAgICAgICAgICAgICAgICAgICAodG8gcHJpbnQgc3RhdHVzIGFuZCBjaGVjayBmb3IgYWJvcnQpCisgKgkJRUJQID0gbWF4aW11bSBsb2FkIGFkZHJlc3MKKyAqCisgKiBPdXRwdXRzOglTSSAgPSBmaWxlIGhhbmRsZS9jbHVzdGVyIHBvaW50ZXIKKyAqCQlFQlggPSBmaXJzdCB1bnRvdWNoZWQgYWRkcmVzcyAobm90IGluY2x1ZGluZyBwYWRkaW5nKQorICoJCUVESSA9IGZpcnN0IHVudG91Y2hlZCBhZGRyZXNzIChpbmNsdWRpbmcgcGFkZGluZykKKyAqCQlDRiAgPSByZWFjaGVkIEVPRgorICoJCU9GICA9IHJhbiBvdXQgb2YgaGlnaCBtZW1vcnkKKyAqLworCisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZnMuaCIKKworI2RlZmluZSBNQVhfQ0hVTksJKDFVTCA8PCAyMCkgLyogMSBNQiAqLworCit2b2lkIHBtX2xvYWRfaGlnaChjb20zMnN5c190ICpyZWdzKQoreworICAgIHN0cnVjdCBmc19pbmZvICpmczsKKyAgICB1aW50MzJfdCBieXRlczsKKyAgICB1aW50MzJfdCB6ZXJvX21hc2s7CisgICAgYm9vbCBoYXZlX21vcmU7CisgICAgdWludDMyX3QgYnl0ZXNfcmVhZDsKKyAgICBjaGFyICpidWYsICpsaW1pdDsKKyAgICBzdHJ1Y3QgZmlsZSAqZmlsZTsKKyAgICB1aW50MzJfdCBzZWN0b3JfbWFzazsKKyAgICBzaXplX3QgcGFkOworICAgIHVpbnQzMl90IHJldGZsYWdzID0gMDsKKworICAgIGJ5dGVzICAgICA9IHJlZ3MtPmVheC5sOworICAgIHplcm9fbWFzayA9IHJlZ3MtPmVkeC53WzBdOworICAgIGJ1ZiAgICAgICA9IChjaGFyICopcmVncy0+ZWRpLmw7CisgICAgbGltaXQgICAgID0gKGNoYXIgKikocmVncy0+ZWJwLmwgJiB+emVyb19tYXNrKTsKKyAgICBmaWxlICAgICAgPSBoYW5kbGVfdG9fZmlsZShyZWdzLT5lc2kud1swXSk7CisgICAgZnMgICAgICAgID0gZmlsZS0+ZnM7CisKKyAgICBzZWN0b3JfbWFzayA9IFNFQ1RPUl9TSVpFKGZzKSAtIDE7CisKKyAgICB3aGlsZSAoYnl0ZXMpIHsKKwl1aW50MzJfdCBzZWN0b3JzOworCXVpbnQzMl90IGNodW5rOworCisJaWYgKGJ1ZiArIFNFQ1RPUl9TSVpFKGZzKSA+IGxpbWl0KSB7CisJICAgIC8qIENhbid0IGZpdCBldmVuIG9uZSBtb3JlIHNlY3RvciBpbi4uLiAqLworCSAgICByZXRmbGFncyA9IEVGTEFHU19PRjsKKwkgICAgYnJlYWs7CisJfQorCisJY2h1bmsgPSBieXRlczsKKworCWlmIChyZWdzLT5lYngud1swXSkgeworCSAgICBjYWxsMTYoKHZvaWQgKCopKHZvaWQpKShzaXplX3QpcmVncy0+ZWJ4LndbMF0sICZ6ZXJvX3JlZ3MsIE5VTEwpOworCSAgICBjaHVuayA9IG1pbihjaHVuaywgTUFYX0NIVU5LKTsKKwl9CisKKwlpZiAoY2h1bmsgPiAoKChjaGFyICopbGltaXQgLSBidWYpICYgfnNlY3Rvcl9tYXNrKSkKKwkgICAgY2h1bmsgPSAoKGNoYXIgKilsaW1pdCAtIGJ1ZikgJiB+c2VjdG9yX21hc2s7CisKKwlzZWN0b3JzID0gKGNodW5rICsgc2VjdG9yX21hc2spID4+IFNFQ1RPUl9TSElGVChmcyk7CisJYnl0ZXNfcmVhZCA9IGZzLT5mc19vcHMtPmdldGZzc2VjKGZpbGUsIGJ1Ziwgc2VjdG9ycywgJmhhdmVfbW9yZSk7CisKKwlpZiAoYnl0ZXNfcmVhZCA+IGNodW5rKQorCSAgICBieXRlc19yZWFkID0gY2h1bms7CisKKwlidWYgKz0gYnl0ZXNfcmVhZDsKKwlieXRlcyAtPSBieXRlc19yZWFkOworCisJaWYgKCFoYXZlX21vcmUpIHsKKwkgICAgLyoKKwkgICAgICogSWYgd2UgcmVhY2ggRU9GLCB0aGUgZmlsZXN5c3RlbSBkcml2ZXIgd2lsbCBoYXZlIGFscmVhZHkgY2xvc2VkCisJICAgICAqIHRoZSB1bmRlcmx5aW5nIGZpbGUuLi4gdGhpcyByZWFsbHkgc2hvdWxkIGJlIGNsZWFuZXIuCisJICAgICAqLworCSAgICBfY2xvc2VfZmlsZShmaWxlKTsKKwkgICAgcmVncy0+ZXNpLndbMF0gPSAwOworCSAgICByZXRmbGFncyA9IEVGTEFHU19DRjsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHBhZCA9IChzaXplX3QpYnVmICYgemVyb19tYXNrOworICAgIGlmIChwYWQpCisJbWVtc2V0KGJ1ZiwgMCwgcGFkKTsKKworICAgIHJlZ3MtPmVieC5sID0gKHNpemVfdClidWY7CisgICAgcmVncy0+ZWRpLmwgPSAoc2l6ZV90KWJ1ZiArIHBhZDsKKyAgICBzZXRfZmxhZ3MocmVncywgcmV0ZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZWxmbGluay9sZGxpbnV4L21zZy5jIGIvY29tMzIvZWxmbGluay9sZGxpbnV4L21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTdiM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9lbGZsaW5rL2xkbGludXgvbXNnLmMKQEAgLTAsMCArMSwyMjkgQEAKKyNpbmNsdWRlIDxzeXNsaW51eC92aWRlby5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxiaW9zLmg+CisjaW5jbHVkZSA8Z3JhcGhpY3MuaD4KKworc3RhdGljIHVpbnQ4X3QgVGV4dEF0dHJpYnV0ZTsJLyogVGV4dCBhdHRyaWJ1dGUgZm9yIG1lc3NhZ2UgZmlsZSAqLworZXh0ZXJuIHVpbnQ4X3QgRGlzcGxheU1hc2s7CS8qIERpc3BsYXkgbW9kZXMgbWFzayAqLworCisvKiBSb3V0aW5lIHRvIGludGVycHJldCBuZXh0IHByaW50IGNoYXIgKi8KK3N0YXRpYyB2b2lkICgqTmV4dENoYXJKdW1wKSh1aW50OF90KTsKKwordm9pZCBtc2dfaW5pdHZhcnModm9pZCk7CitzdGF0aWMgdm9pZCBtc2dfc2V0ZmcodWludDhfdCBkYXRhKTsKK3N0YXRpYyB2b2lkIG1zZ19wdXRjaGFyKHVpbnQ4X3QgY2gpOworCisvKgorICoKKyAqIGdldF9tc2dfZmlsZTogTG9hZCBhIHRleHQgZmlsZSBhbmQgd3JpdGUgaXRzIGNvbnRlbnRzIHRvIHRoZSBzY3JlZW4sCisgKiAgICAgICAgICAgICAgIGludGVycHJldGluZyBjb2xvciBjb2Rlcy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworaW50IGdldF9tc2dfZmlsZShjaGFyICpmaWxlbmFtZSkKK3sKKwlGSUxFICpmOworCWNoYXIgY2g7CisKKwlmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisJaWYgKCFmKQorCQlyZXR1cm4gLTE7CisKKwlUZXh0QXR0cmlidXRlID0gMHg3OwkvKiBEZWZhdWx0IGdyZXkgb24gd2hpdGUgKi8KKwlEaXNwbGF5TWFzayA9IDB4NzsJLyogRGlzcGxheSB0ZXh0IGluIGFsbCBtb2RlcyAqLworCW1zZ19pbml0dmFycygpOworCisJLyoKKwkgKiBSZWFkIHRoZSB0ZXh0IGZpbGUgYSBieXRlIGF0IGEgdGltZSBhbmQgaW50ZXJwcmV0IHRoYXQKKwkgKiBieXRlLgorCSAqLworCXdoaWxlICgoY2ggPSBnZXRjKGYpKSAhPSBFT0YpIHsKKwkJLyogRE9TIEVPRj8gKi8KKwkJaWYgKGNoID09IDB4MUEpCisJCQlicmVhazsKKworCQlOZXh0Q2hhckp1bXAoY2gpOwkvKiBEbyB3aGF0IHNoYWxsIGJlIGRvbmUgKi8KKwl9CisKKwlEaXNwbGF5TWFzayA9IDB4MDc7CisKKwlmY2xvc2UoZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpc3BsYXlfbWFza192Z2Eodm9pZCkKK3sKKwl1aW50OF90IG1hc2sgPSBVc2luZ1ZHQSAmIDB4MTsKKwlyZXR1cm4gKERpc3BsYXlNYXNrICYgKyttYXNrKTsKK30KKworc3RhdGljIHZvaWQgbXNnX3NldGJnKHVpbnQ4X3QgZGF0YSkKK3sKKwlpZiAodW5oZXhjaGFyKCZkYXRhKSA9PSAwKSB7CisJCWRhdGEgPDw9IDQ7CisJCWlmIChkaXNwbGF5X21hc2tfdmdhKCkpCisJCQlUZXh0QXR0cmlidXRlID0gZGF0YTsKKworCQlOZXh0Q2hhckp1bXAgPSBtc2dfc2V0Zmc7CisJfSBlbHNlIHsKKwkJVGV4dEF0dHJpYnV0ZSA9IDB4NzsJLyogRGVmYXVsdCBhdHRyaWJ1dGUgKi8KKwkJTmV4dENoYXJKdW1wID0gbXNnX3B1dGNoYXI7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc2dfc2V0ZmcodWludDhfdCBkYXRhKQoreworCWlmICh1bmhleGNoYXIoJmRhdGEpID09IDApIHsKKwkJaWYgKGRpc3BsYXlfbWFza192Z2EoKSkgeworCQkJLyogc2V0Ymcgc2V0IGZvcmVncm91bmQgdG8gMCAqLworCQkJVGV4dEF0dHJpYnV0ZSB8PSBkYXRhOworCQl9CisJfSBlbHNlCisJCVRleHRBdHRyaWJ1dGUgPSAweDc7CS8qIERlZmF1bHQgYXR0cmlidXRlICovCisKKwlOZXh0Q2hhckp1bXAgPSBtc2dfcHV0Y2hhcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19jdHJsX28odm9pZCkKK3sKKwlOZXh0Q2hhckp1bXAgPSBtc2dfc2V0Ymc7Cit9CisKKy8qIENvbnZlcnQgQU5TSSBjb2xvcnMgdG8gUEMgZGlzcGxheSBhdHRyaWJ1dGVzICovCitzdGF0aWMgaW50IGNvbnZlcnRfdG9fcGNkaXNwbGF5W10gPSB7IDAsIDQsIDIsIDYsIDEsIDUsIDMsIDcgfTsKKworc3RhdGljIHZvaWQgc2V0X2ZnYmcodm9pZCkKK3sKKwl1aW50OF90IGJnLCBmZzsKKworCWZnID0gY29udmVydF90b19wY2Rpc3BsYXlbKFRleHRBdHRyaWJ1dGUgJiAweDcpXTsKKwliZyA9IGNvbnZlcnRfdG9fcGNkaXNwbGF5WygoVGV4dEF0dHJpYnV0ZSA+PiA0KSAmIDB4NyldOworCisJcHJpbnRmKCJcMDMzWyIpOworCWlmIChUZXh0QXR0cmlidXRlICYgMHg4KQorCQlwcmludGYoIjE7Iik7IC8qIEZvcmVncm91bmQgYnJpZ2h0ICovCisKKwlwcmludGYoIjMlZG1cMDMzWyIsIGZnKTsKKworCWlmIChUZXh0QXR0cmlidXRlICYgMHg4MCkKKwkJcHJpbnRmKCI1OyIpOyAvKiBGb3JlZ3JvdW5kIGJsaW5rICovCisKKwlwcmludGYoIjQlZG0iLCBiZyk7Cit9CisKK3N0YXRpYyB2b2lkIG1zZ19mb3JtZmVlZCh2b2lkKQoreworCXNldF9mZ2JnKCk7CisJcHJpbnRmKCJcMDMzWzJKXDAzM1tIXDAzM1swbSIpOworfQorCitzdGF0aWMgdm9pZCBtc2dfbm92Z2Eodm9pZCkKK3sKKwlzeXNsaW51eF9mb3JjZV90ZXh0X21vZGUoKTsKKwltc2dfaW5pdHZhcnMoKTsKK30KKworc3RhdGljIHZvaWQgbXNnX3ZpZXdpbWFnZSh2b2lkKQoreworCUZJTEUgKmY7CisKKwkqVkdBRmlsZVB0ciA9ICdcMCc7CS8qIFplcm8tdGVybWluYXRlIGZpbGVuYW1lICovCisKKwltYW5nbGVfbmFtZShWR0FGaWxlTUJ1ZiwgVkdBRmlsZUJ1Zik7CisJZiA9IGZvcGVuKFZHQUZpbGVNQnVmLCAiciIpOworCWlmICghZikgeworCQkvKiBOb3QgdGhlcmUgKi8KKwkJTmV4dENoYXJKdW1wID0gbXNnX3B1dGNoYXI7CisJCXJldHVybjsKKwl9CisKKwl2Z2FkaXNwbGF5ZmlsZShmKTsKKwlmY2xvc2UoZik7CisJbXNnX2luaXR2YXJzKCk7Cit9CisKKy8qCisgKiBHZXR0aW5nIFZHQSBmaWxlbmFtZQorICovCitzdGF0aWMgdm9pZCBtc2dfZmlsZW5hbWUodWludDhfdCBkYXRhKQoreworCS8qIDxMRj4gPSBlbmQgb2YgZmlsZW5hbWUgKi8KKwlpZiAoZGF0YSA9PSAweDBBKSB7CisJCW1zZ192aWV3aW1hZ2UoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElnbm9yZSBzcGFjZS9jb250cm9sIGNoYXIgKi8KKwlpZiAoZGF0YSA+ICcgJykgeworCQlpZiAoKGNoYXIgKilWR0FGaWxlUHRyIDwgKFZHQUZpbGVCdWYgKyBzaXplb2YoVkdBRmlsZUJ1ZikpKQorCQkJKlZHQUZpbGVQdHIrKyA9IGRhdGE7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc2dfdmdhKHZvaWQpCit7CisJTmV4dENoYXJKdW1wID0gbXNnX2ZpbGVuYW1lOworCVZHQUZpbGVQdHIgPSAodWludDE2X3QgKilWR0FGaWxlQnVmOworfQorCitzdGF0aWMgdm9pZCBtc2dfbm9ybWFsKHVpbnQ4X3QgZGF0YSkKK3sKKwkvKiAweDEgPSB0ZXh0IG1vZGUsIDB4MiA9IGdyYXBoaWNzIG1vZGUgKi8KKwlpZiAoIWRpc3BsYXlfbWFza192Z2EoKSB8fCAhKERpc3BsYXlDb24gJiAweDAxKSkgeworCQkvKiBXcml0ZSB0byBzZXJpYWwgcG9ydCAqLworCQlpZiAoRGlzcGxheU1hc2sgJiAweDQpCisJCQl3cml0ZV9zZXJpYWwoZGF0YSk7CisKKwkJcmV0dXJuOwkJLyogTm90IHNjcmVlbiAqLworCX0KKworCXNldF9mZ2JnKCk7CisJcHJpbnRmKCIlY1wwMzNbMG0iLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgbXNnX21vZGVjdGwodWludDhfdCBkYXRhKQoreworCWRhdGEgJj0gMHgwNzsKKwlEaXNwbGF5TWFzayA9IGRhdGE7CisJTmV4dENoYXJKdW1wID0gbXNnX3B1dGNoYXI7Cit9CisKK3N0YXRpYyB2b2lkIG1zZ19wdXRjaGFyKHVpbnQ4X3QgY2gpCit7CisJLyogMTBoIHRvIDE3aCBhcmUgbW9kZSBjb250cm9scyAqLworCWlmIChjaCA+PSAweDEwICYmIGNoIDwgMHgxOCkgeworCQltc2dfbW9kZWN0bChjaCk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGNoKSB7CisJY2FzZSAweDBGOgkJLyogXk8gPSBjb2xvciBjb2RlIGZvbGxvd3MgKi8KKwkJbXNnX2N0cmxfbygpOworCQlicmVhazsKKwljYXNlIDB4MEQ6CQkvKiBJZ25vcmUgPENSPiAqLworCQlicmVhazsKKwljYXNlIDB4MEM6CQkvKiA8RkY+ID0gY2xlYXIgc2NyZWVuICovCisJCW1zZ19mb3JtZmVlZCgpOworCQlicmVhazsKKwljYXNlIDB4MTk6CQkvKiA8RU0+ID0gcmV0dXJuIHRvIHRleHQgbW9kZSAqLworCQltc2dfbm92Z2EoKTsKKwkJYnJlYWs7CisJY2FzZSAweDE4OgkJLyogPENBTj4gPSBWR0EgZmlsZW5hbWUgZm9sbG93cyAqLworCQltc2dfdmdhKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1zZ19ub3JtYWwoY2gpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBTdWJyb3V0aW5lIHRvIGluaXRpYWxpemUgdmFyaWFibGVzLCBhbHNvIG5lZWRlZCBhZnRlciBsb2FkaW5nCisgKiBncmFwaGljcyBmaWxlLgorICovCit2b2lkIG1zZ19pbml0dmFycyh2b2lkKQoreworCS8qIEluaXRpYWxpemUgc3RhdGUgbWFjaGluZSAqLworCU5leHRDaGFySnVtcCA9IG1zZ19wdXRjaGFyOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZWxmbGluay9sZGxpbnV4L3JlYWRjb25maWcuYyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9yZWFkY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3ZjgyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9yZWFkY29uZmlnLmMKQEAgLTAsMCArMSwxNTcxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDEzIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzeXMvaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Y29sb3J0YmwuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Fkdi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGJpb3MuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9weGVfYXBpLmg+CisKKyNpbmNsdWRlICJtZW51LmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZ2V0a2V5LmgiCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImZzLmgiCisKK2NvbnN0IHN0cnVjdCBtZW51X3BhcmFtZXRlciBtcGFybVtOUEFSQU1TXSA9IHsKKyAgICBbUF9XSURUSF0gPSB7IndpZHRoIiwgMH0sCisgICAgW1BfTUFSR0lOXSA9IHsibWFyZ2luIiwgMTB9LAorICAgIFtQX1BBU1NXRF9NQVJHSU5dID0geyJwYXNzd29yZG1hcmdpbiIsIDN9LAorICAgIFtQX01FTlVfUk9XU10gPSB7InJvd3MiLCAxMn0sCisgICAgW1BfVEFCTVNHX1JPV10gPSB7InRhYm1zZ3JvdyIsIDE4fSwKKyAgICBbUF9DTURMSU5FX1JPV10gPSB7ImNtZGxpbmVyb3ciLCAxOH0sCisgICAgW1BfRU5EX1JPV10gPSB7ImVuZHJvdyIsIC0xfSwKKyAgICBbUF9QQVNTV0RfUk9XXSA9IHsicGFzc3dvcmRyb3ciLCAxMX0sCisgICAgW1BfVElNRU9VVF9ST1ddID0geyJ0aW1lb3V0cm93IiwgMjB9LAorICAgIFtQX0hFTFBNU0dfUk9XXSA9IHsiaGVscG1zZ3JvdyIsIDIyfSwKKyAgICBbUF9IRUxQTVNHRU5EX1JPV10gPSB7ImhlbHBtc2dlbmRyb3ciLCAtMX0sCisgICAgW1BfSFNISUZUXSA9IHsiaHNoaWZ0IiwgMH0sCisgICAgW1BfVlNISUZUXSA9IHsidnNoaWZ0IiwgMH0sCisgICAgW1BfSElEREVOX1JPV10gPSB7ImhpZGRlbnJvdyIsIC0yfSwKK307CisKKy8qIE11c3QgbWF0Y2ggZW51bSBrZXJuZWxfdHlwZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtlcm5lbF90eXBlc1tdID0geworICAgICJub25lIiwKKyAgICAibG9jYWxib290IiwKKyAgICAia2VybmVsIiwKKyAgICAibGludXgiLAorICAgICJib290IiwKKyAgICAiYnNzIiwKKyAgICAicHhlIiwKKyAgICAiZmRpbWFnZSIsCisgICAgImNvbWJvb3QiLAorICAgICJjb20zMiIsCisgICAgImNvbmZpZyIsCisgICAgTlVMTAorfTsKKworc2hvcnQgdWFwcGVuZGxlbiA9IDA7CQkvL2J5dGVzIGluIGFwcGVuZD0gY29tbWFuZAorc2hvcnQgb250aW1lb3V0bGVuID0gMDsJCS8vYnl0ZXMgaW4gb250aW1lb3V0IGNvbW1hbmQKK3Nob3J0IG9uZXJyb3JsZW4gPSAwOwkJLy9ieXRlcyBpbiBvbmVycm9yIGNvbW1hbmQKK3Nob3J0IGZvcmNlcHJvbXB0ID0gMDsJCS8vZm9yY2UgcHJvbXB0CitzaG9ydCBub2VzY2FwZSA9IDA7CQkvL25vIGVzY2FwZQorc2hvcnQgbm9jb21wbGV0ZSA9IDA7CQkvL25vIGxhYmVsIGNvbXBsZXRpb24gb24gVEFCIGtleQorc2hvcnQgYWxsb3dpbXBsaWNpdCA9IDE7CS8vYWxsb3cgaW1wbGljaXQga2VybmVscworc2hvcnQgYWxsb3dvcHRpb25zID0gMTsJCS8vdXNlci1zcGVjaWZpZWQgb3B0aW9ucyBhbGxvd2VkCitzaG9ydCBpbmNsdWRlbGV2ZWwgPSAxOwkJLy9uZXN0aW5nIGxldmVsCitzaG9ydCBkZWZhdWx0bGV2ZWwgPSAwOwkJLy90aGUgY3VycmVudCBsZXZlbCBvZiBkZWZhdWx0CitzaG9ydCB2a2VybmVsID0gMDsJCS8vaGF2ZSB3ZSBzZWVuIGFueSAibGFiZWwiIHN0YXRlbWVudHM/CitleHRlcm4gc2hvcnQgTm9IYWx0OwkJLy9pZGxlLmMKKworY29uc3QgY2hhciAqb25lcnJvciA9IE5VTEw7CS8vIm9uZXJyb3IiIGNvbW1hbmQgbGluZQorY29uc3QgY2hhciAqb250aW1lb3V0ID0gTlVMTDsJLy8ib250aW1lb3V0IiBjb21tYW5kIGxpbmUKKworX19leHBvcnQgY29uc3QgY2hhciAqZGVmYXVsdF9jbWQgPSBOVUxMOwkvLyJkZWZhdWx0IiBjb21tYW5kIGxpbmUKKworLyogRW1wdHkgcmVmc3RyaW5nICovCitjb25zdCBjaGFyICplbXB0eV9zdHJpbmc7CisKKy8qIFJvb3QgbWVudSwgc3RhcnRpbmcgbWVudSwgaGlkZGVuIG1lbnUsIGFuZCBsaXN0IG9mIGFsbCBtZW51cyAqLworc3RydWN0IG1lbnUgKnJvb3RfbWVudSwgKnN0YXJ0X21lbnUsICpoaWRlX21lbnUsICptZW51X2xpc3QsICpkZWZhdWx0X21lbnU7CisKKy8qIFRoZXNlIGFyZSBnbG9iYWwgcGFyYW1ldGVycyByZWdhcmRsZXNzIG9mIHdoaWNoIG1lbnUgd2UncmUgZGlzcGxheWluZyAqLworaW50IHNoaWZ0a2V5ID0gMDsJCS8qIE9ubHkgZGlzcGxheSBtZW51IGlmIHNoaWZ0IGtleSBwcmVzc2VkICovCitpbnQgaGlkZGVubWVudSA9IDA7Citsb25nIGxvbmcgdG90YWx0aW1lb3V0ID0gMDsKK3Vuc2lnbmVkIGludCBrYmR0aW1lb3V0ID0gMDsKKworLyogS2VlcCB0cmFjayBvZiBnbG9iYWwgZGVmYXVsdCAqLworc3RhdGljIGludCBoYXNfdWkgPSAwOwkJLyogREVGQVVMVCBvbmx5IGNvdW50cyBpZiBVSSBpcyBmb3VuZCAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmdsb2JhbGRlZmF1bHQ7CitzdGF0aWMgYm9vbCBtZW51c2F2ZSA9IGZhbHNlOwkvKiBUcnVlIGlmIHRoZXJlIGlzIGFueSAibWVudSBzYXZlIiAqLworCisvKiBMaW5rZWQgbGlzdCBvZiBhbGwgZW50aXJlcywgaGlkZGVuIG9yIG5vdDsgdXNlZCBieSB1bmxhYmVsKCkgKi8KK3N0YXRpYyBzdHJ1Y3QgbWVudV9lbnRyeSAqYWxsX2VudHJpZXM7CitzdGF0aWMgc3RydWN0IG1lbnVfZW50cnkgKiphbGxfZW50cmllc19lbmQgPSAmYWxsX2VudHJpZXM7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVzc2FnZXMgbWVzc2FnZXNbTVNHX0NPVU5UXSA9IHsKKyAgICBbTVNHX0FVVE9CT09UXSA9IHsiYXV0b2Jvb3QiLCAiQXV0b21hdGljIGJvb3QgaW4gIyBzZWNvbmR7LHN9Li4uIn0sCisgICAgW01TR19UQUJdID0geyJ0YWJtc2ciLCAiUHJlc3MgW1RhYl0gdG8gZWRpdCBvcHRpb25zIn0sCisgICAgW01TR19OT1RBQl0gPSB7Im5vdGFibXNnIiwgIiJ9LAorICAgIFtNU0dfUEFTU1BST01QVF0gPSB7InBhc3Nwcm9tcHQiLCAiUGFzc3dvcmQgcmVxdWlyZWQifSwKK307CisKKyNkZWZpbmUgYXN0cmR1cCh4KSAoeyBjaGFyICpfX3ggPSAoeCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19uID0gc3RybGVuKF9feCkgKyAxOyBcCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqX19wID0gYWxsb2NhKF9fbik7IFwKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9fcCApIG1lbWNweShfX3AsIF9feCwgX19uKTsgXAorICAgICAgICAgICAgICAgICAgICAgIF9fcDsgfSkKKworLyoKKyAqIFNlYXJjaCB0aGUgbGlzdCBvZiBhbGwgbWVudXMgZm9yIGEgc3BlY2lmaWMgbGFiZWwKKyAqLworc3RhdGljIHN0cnVjdCBtZW51ICpmaW5kX21lbnUoY29uc3QgY2hhciAqbGFiZWwpCit7CisgICAgc3RydWN0IG1lbnUgKm07CisKKyAgICBmb3IgKG0gPSBtZW51X2xpc3Q7IG07IG0gPSBtLT5uZXh0KSB7CisJaWYgKCFzdHJjbXAobGFiZWwsIG0tPmxhYmVsKSkKKwkgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgTUFYX0xJTkUgNDA5NgorCisvKiBTdHJpcCBeIGZyb20gYSBzdHJpbmcsIHJldHVybmluZyBhIG5ldyByZWZlcmVuY2UgdG8gdGhlIHNhbWUgcmVmc3RyaW5nCisgICBpZiBub25lIHByZXNlbnQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzdHJpcF9jYXJldChjb25zdCBjaGFyICpzdHIpCit7CisgICAgY29uc3QgY2hhciAqcCwgKnI7CisgICAgY2hhciAqcTsKKyAgICBpbnQgY2FyZXRzID0gMDsKKworICAgIHAgPSBzdHI7CisgICAgZm9yICg7OykgeworCXAgPSBzdHJjaHIocCwgJ14nKTsKKwlpZiAoIXApCisJICAgIGJyZWFrOworCWNhcmV0cysrOworCXArKzsKKyAgICB9CisKKyAgICBpZiAoIWNhcmV0cykKKwlyZXR1cm4gcmVmc3RyX2dldChzdHIpOworCisgICAgciA9IHEgPSByZWZzdHJfYWxsb2Moc3RybGVuKHN0cikgLSBjYXJldHMpOworICAgIGZvciAocCA9IHN0cjsgKnA7IHArKykKKwlpZiAoKnAgIT0gJ14nKQorCSAgICAqcSsrID0gKnA7CisKKyAgICAqcSA9ICdcMCc7CQkJLyogcmVmc3RyX2FsbG9jKCkgYWxyZWFkeSBkaWQgdGhpcy4uLiAqLworCisgICAgcmV0dXJuIHI7Cit9CisKKy8qIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgYXQgYSBjZXJ0YWluIGtleXdvcmQgKGNhc2UgaW5zZW5zaXRpdmUpICovCisvKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIHBhc3QgdGhlIGtleXdvcmQgKi8KK3N0YXRpYyBjaGFyICpsb29raW5nX2F0KGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmt3ZCkKK3sKKyAgICBjaGFyICpwID0gbGluZTsKKyAgICBjb25zdCBjaGFyICpxID0ga3dkOworCisgICAgd2hpbGUgKCpwICYmICpxICYmICgoKnAgXiAqcSkgJiB+MHgyMCkgPT0gMCkgeworCXArKzsKKwlxKys7CisgICAgfQorCisgICAgaWYgKCpxKQorCXJldHVybiBOVUxMOwkJLyogRGlkbid0IHNlZSB0aGUga2V5d29yZCAqLworCisgICAgcmV0dXJuIG15X2lzc3BhY2UoKnApID8gcCA6IE5VTEw7CS8qIE11c3QgYmUgRU9MIG9yIHdoaXRlc3BhY2UgKi8KK30KKworc3RhdGljIHN0cnVjdCBtZW51ICpuZXdfbWVudShzdHJ1Y3QgbWVudSAqcGFyZW50LAorCQkJICAgICBzdHJ1Y3QgbWVudV9lbnRyeSAqcGFyZW50X2VudHJ5LCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKyAgICBzdHJ1Y3QgbWVudSAqbSA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1lbnUpKTsKKyAgICBpbnQgaTsKKwkKKwkvL2RwcmludGYoImVudGVyOiBtZW51X2xhYmVsID0gJXMiLCBsYWJlbCk7CisKKyAgICBtLT5sYWJlbCA9IGxhYmVsOworICAgIG0tPnRpdGxlID0gcmVmc3RyX2dldChlbXB0eV9zdHJpbmcpOworCisgICAgaWYgKHBhcmVudCkgeworCS8qIFN1Ym1lbnUgKi8KKwltLT5wYXJlbnQgPSBwYXJlbnQ7CisJbS0+cGFyZW50X2VudHJ5ID0gcGFyZW50X2VudHJ5OworCXBhcmVudF9lbnRyeS0+YWN0aW9uID0gTUFfU1VCTUVOVTsKKwlwYXJlbnRfZW50cnktPnN1Ym1lbnUgPSBtOworCisJZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKQorCSAgICBtLT5tZXNzYWdlc1tpXSA9IHJlZnN0cl9nZXQocGFyZW50LT5tZXNzYWdlc1tpXSk7CisKKwltZW1jcHkobS0+bXBhcm0sIHBhcmVudC0+bXBhcm0sIHNpemVvZiBtLT5tcGFybSk7CisKKwltLT5hbGxvd2VkaXQgPSBwYXJlbnQtPmFsbG93ZWRpdDsKKwltLT50aW1lb3V0ID0gcGFyZW50LT50aW1lb3V0OworCW0tPnNhdmUgPSBwYXJlbnQtPnNhdmU7CisKKwltLT5vbnRpbWVvdXQgPSByZWZzdHJfZ2V0KHBhcmVudC0+b250aW1lb3V0KTsKKwltLT5vbmVycm9yID0gcmVmc3RyX2dldChwYXJlbnQtPm9uZXJyb3IpOworCW0tPm1lbnVfbWFzdGVyX3Bhc3N3ZCA9IHJlZnN0cl9nZXQocGFyZW50LT5tZW51X21hc3Rlcl9wYXNzd2QpOworCW0tPm1lbnVfYmFja2dyb3VuZCA9IHJlZnN0cl9nZXQocGFyZW50LT5tZW51X2JhY2tncm91bmQpOworCisJbS0+Y29sb3JfdGFibGUgPSBjb3B5X2NvbG9yX3RhYmxlKHBhcmVudC0+Y29sb3JfdGFibGUpOworCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKwkgICAgbS0+ZmtleWhlbHBbaV0udGV4dG5hbWUgPSByZWZzdHJfZ2V0KHBhcmVudC0+ZmtleWhlbHBbaV0udGV4dG5hbWUpOworCSAgICBtLT5ma2V5aGVscFtpXS5iYWNrZ3JvdW5kID0KKwkJcmVmc3RyX2dldChwYXJlbnQtPmZrZXloZWxwW2ldLmJhY2tncm91bmQpOworCX0KKyAgICB9IGVsc2UgeworCS8qIFJvb3QgbWVudSAqLworCWZvciAoaSA9IDA7IGkgPCBNU0dfQ09VTlQ7IGkrKykKKwkgICAgbS0+bWVzc2FnZXNbaV0gPSByZWZzdHJkdXAobWVzc2FnZXNbaV0uZGVmbXNnKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlBBUkFNUzsgaSsrKQorCSAgICBtLT5tcGFybVtpXSA9IG1wYXJtW2ldLnZhbHVlOworCisJbS0+YWxsb3dlZGl0ID0gdHJ1ZTsJLyogQWxsb3cgZWRpdHMgb2YgdGhlIGNvbW1hbmQgbGluZSAqLworCW0tPmNvbG9yX3RhYmxlID0gZGVmYXVsdF9jb2xvcl90YWJsZSgpOworICAgIH0KKworICAgIG0tPm5leHQgPSBtZW51X2xpc3Q7CisgICAgbWVudV9saXN0ID0gbTsKKworICAgIHJldHVybiBtOworfQorCitzdHJ1Y3QgbGFiZWxkYXRhIHsKKyAgICBjb25zdCBjaGFyICpsYWJlbDsKKyAgICBjb25zdCBjaGFyICprZXJuZWw7CisgICAgZW51bSBrZXJuZWxfdHlwZSB0eXBlOworICAgIGNvbnN0IGNoYXIgKmFwcGVuZDsKKyAgICBjb25zdCBjaGFyICppbml0cmQ7CisgICAgY29uc3QgY2hhciAqbWVudWxhYmVsOworICAgIGNvbnN0IGNoYXIgKnBhc3N3ZDsKKyAgICBjaGFyICpoZWxwdGV4dDsKKyAgICB1bnNpZ25lZCBpbnQgaXBhcHBlbmQ7CisgICAgdW5zaWduZWQgaW50IG1lbnVoaWRlOworICAgIHVuc2lnbmVkIGludCBtZW51ZGVmYXVsdDsKKyAgICB1bnNpZ25lZCBpbnQgbWVudXNlcGFyYXRvcjsKKyAgICB1bnNpZ25lZCBpbnQgbWVudWRpc2FibGVkOworICAgIHVuc2lnbmVkIGludCBtZW51aW5kZW50OworICAgIGVudW0gbWVudV9hY3Rpb24gYWN0aW9uOworICAgIGludCBzYXZlOworICAgIHN0cnVjdCBtZW51ICpzdWJtZW51OworfTsKKworLyogTWVudSBjdXJyZW50bHkgYmVpbmcgcGFyc2VkICovCitzdGF0aWMgc3RydWN0IG1lbnUgKmN1cnJlbnRfbWVudTsKKworc3RhdGljIHZvaWQgY2xlYXJfbGFiZWxfZGF0YShzdHJ1Y3QgbGFiZWxkYXRhICpsZCkKK3sKKyAgICByZWZzdHJfcHV0KGxkLT5sYWJlbCk7CisgICAgcmVmc3RyX3B1dChsZC0+a2VybmVsKTsKKyAgICByZWZzdHJfcHV0KGxkLT5hcHBlbmQpOworICAgIHJlZnN0cl9wdXQobGQtPmluaXRyZCk7CisgICAgcmVmc3RyX3B1dChsZC0+bWVudWxhYmVsKTsKKyAgICByZWZzdHJfcHV0KGxkLT5wYXNzd2QpOworCisgICAgbWVtc2V0KGxkLCAwLCBzaXplb2YgKmxkKTsKK30KKworc3RhdGljIHN0cnVjdCBtZW51X2VudHJ5ICpuZXdfZW50cnkoc3RydWN0IG1lbnUgKm0pCit7CisgICAgc3RydWN0IG1lbnVfZW50cnkgKm1lOworCisgICAgLy9kcHJpbnRmKCJlbnRlciwgY2FsbCBmcm9tIG1lbnUgJXMiLCBtLT5sYWJlbCk7CisKKyAgICBpZiAobS0+bmVudHJpZXMgPj0gbS0+bmVudHJpZXNfc3BhY2UpIHsKKwlpZiAoIW0tPm5lbnRyaWVzX3NwYWNlKQorCSAgICBtLT5uZW50cmllc19zcGFjZSA9IDE7CisJZWxzZQorCSAgICBtLT5uZW50cmllc19zcGFjZSA8PD0gMTsKKworCW0tPm1lbnVfZW50cmllcyA9IHJlYWxsb2MobS0+bWVudV9lbnRyaWVzLCBtLT5uZW50cmllc19zcGFjZSAqCisJCQkJICBzaXplb2Yoc3RydWN0IG1lbnVfZW50cnkgKikpOworICAgIH0KKworICAgIG1lID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbWVudV9lbnRyeSkpOworICAgIG1lLT5tZW51ID0gbTsKKyAgICBtZS0+ZW50cnkgPSBtLT5uZW50cmllczsKKyAgICBtLT5tZW51X2VudHJpZXNbbS0+bmVudHJpZXMrK10gPSBtZTsKKyAgICAqYWxsX2VudHJpZXNfZW5kID0gbWU7CisgICAgYWxsX2VudHJpZXNfZW5kID0gJm1lLT5uZXh0OworCisgICAgcmV0dXJuIG1lOworfQorCitzdGF0aWMgdm9pZCBjb25zaWRlcl9mb3JfaG90a2V5KHN0cnVjdCBtZW51ICptLCBzdHJ1Y3QgbWVudV9lbnRyeSAqbWUpCit7CisgICAgY29uc3QgY2hhciAqcCA9IHN0cmNocihtZS0+ZGlzcGxheW5hbWUsICdeJyk7CisKKyAgICBpZiAobWUtPmFjdGlvbiAhPSBNQV9ESVNBQkxFRCkgeworCWlmIChwICYmIHBbMV0pIHsKKwkgICAgdW5zaWduZWQgY2hhciBob3RrZXkgPSBwWzFdICYgfjB4MjA7CisJICAgIGlmICghbS0+bWVudV9ob3RrZXlzW2hvdGtleV0pIHsKKwkJbWUtPmhvdGtleSA9IGhvdGtleTsKKwkJbS0+bWVudV9ob3RrZXlzW2hvdGtleV0gPSBtZTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qCisgKiBDb3B5IGEgc3RyaW5nLCBjb252ZXJ0aW5nIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byB1bmRlcnNjb3JlcworICogYW5kIGNvbXBhY3RpbmcgdGhlbS4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpbmFsIG51bGwuCisgKi8KK3N0YXRpYyBjaGFyICpjb3B5X3N5c2FwcGVuZF9zdHJpbmcoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisgICAgYm9vbCB3YXNfc3BhY2UgPSB0cnVlOwkvKiBLaWxsIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICAgIGNoYXIgKmVuZCA9IGRzdDsKKyAgICBjaGFyIGM7CisKKyAgICB3aGlsZSAoKGMgPSAqc3JjKyspKSB7CisJaWYgKGMgPD0gJyAnICYmIGMgPT0gJ1x4N2YnKSB7CisJICAgIGlmICghd2FzX3NwYWNlKQorCQkqZHN0KysgPSAnXyc7CisJICAgIHdhc19zcGFjZSA9IHRydWU7CisJfSBlbHNlIHsKKwkgICAgKmRzdCsrID0gYzsKKwkgICAgZW5kID0gZHN0OworCSAgICB3YXNfc3BhY2UgPSBmYWxzZTsKKwl9CisgICAgfQorICAgICplbmQgPSAnXDAnOworICAgIHJldHVybiBlbmQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlY29yZChzdHJ1Y3QgbWVudSAqbSwgc3RydWN0IGxhYmVsZGF0YSAqbGQsIGNvbnN0IGNoYXIgKmFwcGVuZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbWVudV9lbnRyeSAqbWU7CisJY29uc3Qgc3RydWN0IHN5c2xpbnV4X2lwYXBwZW5kX3N0cmluZ3MgKmlwYXBwZW5kOworCisJaWYgKCFsZC0+bGFiZWwpCisJCXJldHVybjsJCQkvKiBOb3RoaW5nIGRlZmluZWQgKi8KKworCS8qIEhpZGRlbiBlbnRyaWVzIGFyZSByZWNvcmRlZCBvbiBhIHNwZWNpYWwgImhpZGRlbiBtZW51IiAqLworCWlmIChsZC0+bWVudWhpZGUpCisJCW0gPSBoaWRlX21lbnU7CisKKwljaGFyIGlwb3B0aW9uc1s0MDk2XSwgKmlwcDsKKwljb25zdCBjaGFyICphOworCWNoYXIgKnM7CisKKwltZSA9IG5ld19lbnRyeShtKTsKKworCW1lLT5kaXNwbGF5bmFtZSA9IGxkLT5tZW51bGFiZWwKKwkgICAgPyByZWZzdHJfZ2V0KGxkLT5tZW51bGFiZWwpIDogcmVmc3RyX2dldChsZC0+bGFiZWwpOworCW1lLT5sYWJlbCA9IHJlZnN0cl9nZXQobGQtPmxhYmVsKTsKKwltZS0+cGFzc3dkID0gcmVmc3RyX2dldChsZC0+cGFzc3dkKTsKKwltZS0+aGVscHRleHQgPSBsZC0+aGVscHRleHQ7CisJbWUtPmhvdGtleSA9IDA7CisJbWUtPmFjdGlvbiA9IGxkLT5hY3Rpb24gPyBsZC0+YWN0aW9uIDogTUFfQ01EOworCW1lLT5zYXZlID0gbGQtPnNhdmUgPyAobGQtPnNhdmUgPiAwKSA6IG0tPnNhdmU7CisKKwlpZiAobGQtPm1lbnVpbmRlbnQpIHsKKwkgICAgY29uc3QgY2hhciAqZG47CisKKwkgICAgcnNwcmludGYoJmRuLCAiJSpzJXMiLCBsZC0+bWVudWluZGVudCwgIiIsIG1lLT5kaXNwbGF5bmFtZSk7CisJICAgIHJlZnN0cl9wdXQobWUtPmRpc3BsYXluYW1lKTsKKwkgICAgbWUtPmRpc3BsYXluYW1lID0gZG47CisJfQorCisJaWYgKGxkLT5tZW51c2VwYXJhdG9yKSB7CisJICAgIHJlZnN0cl9wdXQobWUtPmRpc3BsYXluYW1lKTsKKwkgICAgbWUtPmRpc3BsYXluYW1lID0gcmVmc3RyX2dldChlbXB0eV9zdHJpbmcpOworCX0KKworCWlmIChsZC0+bWVudXNlcGFyYXRvciB8fCBsZC0+bWVudWRpc2FibGVkKSB7CisJICAgIG1lLT5hY3Rpb24gPSBNQV9ESVNBQkxFRDsKKwkgICAgcmVmc3RyX3B1dChtZS0+bGFiZWwpOworCSAgICBtZS0+bGFiZWwgPSBOVUxMOworCSAgICByZWZzdHJfcHV0KG1lLT5wYXNzd2QpOworCSAgICBtZS0+cGFzc3dkID0gTlVMTDsKKwl9CisKKwlpZiAobGQtPm1lbnVsYWJlbCkKKwkgICAgY29uc2lkZXJfZm9yX2hvdGtleShtLCBtZSk7CisKKwlzd2l0Y2ggKG1lLT5hY3Rpb24pIHsKKwljYXNlIE1BX0NNRDoKKwkgICAgaXBwID0gaXBvcHRpb25zOworCSAgICAqaXBwID0gJ1wwJzsKKworCSAgICBpZiAobGQtPmluaXRyZCkKKwkJaXBwICs9IHNwcmludGYoaXBwLCAiIGluaXRyZD0lcyIsIGxkLT5pbml0cmQpOworCisJICAgIGlmIChsZC0+aXBhcHBlbmQpIHsKKwkJaXBhcHBlbmQgPSBzeXNsaW51eF9pcGFwcGVuZF9zdHJpbmdzKCk7CisJCWZvciAoaSA9IDA7IGkgPCBpcGFwcGVuZC0+Y291bnQ7IGkrKykgeworCQkgICAgaWYgKChsZC0+aXBhcHBlbmQgJiAoMVUgPDwgaSkpICYmCisJCQlpcGFwcGVuZC0+cHRyW2ldICYmIGlwYXBwZW5kLT5wdHJbaV1bMF0pIHsKKwkJCSppcHArKyA9ICcgJzsKKwkJCWlwcCA9IGNvcHlfc3lzYXBwZW5kX3N0cmluZyhpcHAsIGlwYXBwZW5kLT5wdHJbaV0pOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgICBhID0gbGQtPmFwcGVuZDsKKwkgICAgaWYgKCFhKQorCQlhID0gYXBwZW5kOworCSAgICBpZiAoIWEgfHwgKGFbMF0gPT0gJy0nICYmICFhWzFdKSkKKwkJYSA9ICIiOworCSAgICBzID0gYVswXSA/ICIgIiA6ICIiOworCisJICAgIGlmIChsZC0+dHlwZSA9PSBLVF9LRVJORUwpCisJCXJzcHJpbnRmKCZtZS0+Y21kbGluZSwgIiVzJXMlcyVzIiwgbGQtPmtlcm5lbCwgcywgYSwgaXBvcHRpb25zKTsKKwkgICAgZWxzZQorCQlyc3ByaW50ZigmbWUtPmNtZGxpbmUsICIuJXMgJXMlcyVzJXMiLAorCQkJIGtlcm5lbF90eXBlc1tsZC0+dHlwZV0sIGxkLT5rZXJuZWwsIHMsIGEsIGlwb3B0aW9ucyk7CisJCWRwcmludGYoInR5cGUgPSAlcywgY21kID0gJXMiLCBrZXJuZWxfdHlwZXNbbGQtPnR5cGVdLCBtZS0+Y21kbGluZSk7CisJICAgIGJyZWFrOworCisJY2FzZSBNQV9HT1RPX1VOUkVTOgorCWNhc2UgTUFfRVhJVF9VTlJFUzoKKwkgICAgbWUtPmNtZGxpbmUgPSByZWZzdHJfZ2V0KGxkLT5rZXJuZWwpOworCSAgICBicmVhazsKKworCWNhc2UgTUFfR09UTzoKKwljYXNlIE1BX0VYSVQ6CisJICAgIG1lLT5zdWJtZW51ID0gbGQtPnN1Ym1lbnU7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJfQorCisJaWYgKGxkLT5tZW51ZGVmYXVsdCAmJiBtZS0+YWN0aW9uID09IE1BX0NNRCkKKwkgICAgbS0+ZGVmZW50cnkgPSBtLT5uZW50cmllcyAtIDE7CisKKyAgICBjbGVhcl9sYWJlbF9kYXRhKGxkKTsKK30KKworc3RhdGljIHN0cnVjdCBtZW51ICpiZWdpbl9zdWJtZW51KGNvbnN0IGNoYXIgKnRhZykKK3sKKyAgICBzdHJ1Y3QgbWVudV9lbnRyeSAqbWU7CisKKyAgICBpZiAoIXRhZ1swXSkKKwl0YWcgPSBOVUxMOworCisgICAgbWUgPSBuZXdfZW50cnkoY3VycmVudF9tZW51KTsKKyAgICBtZS0+ZGlzcGxheW5hbWUgPSByZWZzdHJkdXAodGFnKTsKKyAgICByZXR1cm4gbmV3X21lbnUoY3VycmVudF9tZW51LCBtZSwgcmVmc3RyX2dldChtZS0+ZGlzcGxheW5hbWUpKTsKK30KKworc3RhdGljIHN0cnVjdCBtZW51ICplbmRfc3VibWVudSh2b2lkKQoreworICAgIHJldHVybiBjdXJyZW50X21lbnUtPnBhcmVudCA/IGN1cnJlbnRfbWVudS0+cGFyZW50IDogY3VycmVudF9tZW51OworfQorCit2b2lkIHByaW50X2xhYmVscyhjb25zdCBjaGFyICpwcmVmaXgsIHNpemVfdCBsZW4pCit7CisgICAgc3RydWN0IG1lbnVfZW50cnkgKm1lOworCisgICAgcHJpbnRmKCJcbiIpOworICAgIGZvciAobWUgPSBhbGxfZW50cmllczsgbWU7IG1lID0gbWUtPm5leHQgKSB7CisJaWYgKCFtZS0+bGFiZWwpCisJICAgIGNvbnRpbnVlOworCisJaWYgKCFzdHJuY21wKHByZWZpeCwgbWUtPmxhYmVsLCBsZW4pKQorCSAgICBwcmludGYoIiAlcyIsIG1lLT5sYWJlbCk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKworc3RydWN0IG1lbnVfZW50cnkgKmZpbmRfbGFiZWwoY29uc3QgY2hhciAqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgc3RydWN0IG1lbnVfZW50cnkgKm1lOworICAgIGludCBwb3M7CisKKyAgICBwID0gc3RyOworICAgIHdoaWxlICgqcCAmJiAhbXlfaXNzcGFjZSgqcCkpCisJcCsrOworCisgICAgLyogcCBub3cgcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIGJleW9uZCB0aGUga2VybmVsIG5hbWUgKi8KKyAgICBwb3MgPSBwIC0gc3RyOworCisgICAgZm9yIChtZSA9IGFsbF9lbnRyaWVzOyBtZTsgbWUgPSBtZS0+bmV4dCkgeworCWlmICghc3RybmNtcChzdHIsIG1lLT5sYWJlbCwgcG9zKSAmJiAhbWUtPmxhYmVsW3Bvc10pCisJICAgIHJldHVybiBtZTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnVubGFiZWwoY29uc3QgY2hhciAqc3RyKQoreworICAgIC8qIENvbnZlcnQgYSBDTEktc3R5bGUgY29tbWFuZCBsaW5lIHRvIGFuIGV4ZWN1dGFibGUgY29tbWFuZCBsaW5lICovCisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjb25zdCBjaGFyICpxOworICAgIHN0cnVjdCBtZW51X2VudHJ5ICptZTsKKyAgICBpbnQgcG9zOworCisgICAgcCA9IHN0cjsKKyAgICB3aGlsZSAoKnAgJiYgIW15X2lzc3BhY2UoKnApKQorCXArKzsKKworICAgIC8qIHAgbm93IHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBiZXlvbmQgdGhlIGtlcm5lbCBuYW1lICovCisgICAgcG9zID0gcCAtIHN0cjsKKworICAgIGZvciAobWUgPSBhbGxfZW50cmllczsgbWU7IG1lID0gbWUtPm5leHQpIHsKKwlpZiAoIXN0cm5jbXAoc3RyLCBtZS0+bGFiZWwsIHBvcykgJiYgIW1lLT5sYWJlbFtwb3NdKSB7CisJICAgIC8qIEZvdW5kIG1hdGNoaW5nIGxhYmVsICovCisJICAgIHJzcHJpbnRmKCZxLCAiJXMlcyIsIG1lLT5jbWRsaW5lLCBwKTsKKwkgICAgcmVmc3RyX3B1dChzdHIpOworCSAgICByZXR1cm4gcTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9fcmVmZHVwX3dvcmQoY2hhciAqcCwgY2hhciAqKnJlZikKK3sKKyAgICBjaGFyICpzcCA9IHA7CisgICAgY2hhciAqZXAgPSBzcDsKKworICAgIHdoaWxlICgqZXAgJiYgIW15X2lzc3BhY2UoKmVwKSkKKwllcCsrOworCisgICAgaWYgKHJlZikKKwkqcmVmID0gZXA7CisgICAgcmV0dXJuIHJlZnN0cm5kdXAoc3AsIGVwIC0gc3ApOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcmVmZHVwX3dvcmQoY2hhciAqKnApCit7CisgICAgcmV0dXJuIF9fcmVmZHVwX3dvcmQoKnAsIHApOworfQorCitpbnQgbXlfaXN4ZGlnaXQoY2hhciBjKQoreworICAgIHVuc2lnbmVkIGludCB1YyA9IGM7CisKKyAgICByZXR1cm4gKHVjIC0gJzAnKSA8IDEwIHx8ICgodWMgfCAweDIwKSAtICdhJykgPCA2OworfQorCit1bnNpZ25lZCBpbnQgaGV4dmFsKGNoYXIgYykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHVjID0gYyB8IDB4MjA7CisgICAgdW5zaWduZWQgaW50IHY7CisKKyAgICB2ID0gdWMgLSAnMCc7CisgICAgaWYgKHYgPCAxMCkKKwlyZXR1cm4gdjsKKworICAgIHJldHVybiB1YyAtICdhJyArIDEwOworfQorCit1bnNpZ25lZCBpbnQgaGV4dmFsMihjb25zdCBjaGFyICpwKQoreworICAgIHJldHVybiAoaGV4dmFsKHBbMF0pIDw8IDQpICsgaGV4dmFsKHBbMV0pOworfQorCit1aW50MzJfdCBwYXJzZV9hcmdiKGNoYXIgKipwKQoreworICAgIGNoYXIgKnNwID0gKnA7CisgICAgY2hhciAqZXA7CisgICAgdWludDMyX3QgYXJnYjsKKyAgICBzaXplX3QgbGVuLCBkbDsKKworICAgIGlmICgqc3AgPT0gJyMnKQorCXNwKys7CisKKyAgICBlcCA9IHNwOworCisgICAgd2hpbGUgKG15X2lzeGRpZ2l0KCplcCkpCisJZXArKzsKKworICAgICpwID0gZXA7CisgICAgbGVuID0gZXAgLSBzcDsKKworICAgIHN3aXRjaCAobGVuKSB7CisgICAgY2FzZSAzOgkJCS8qICNyZ2IgKi8KKwlhcmdiID0KKwkgICAgMHhmZjAwMDAwMCArCisJICAgIChoZXh2YWwoc3BbMF0pICogMHgxMSA8PCAxNikgKworCSAgICAoaGV4dmFsKHNwWzFdKSAqIDB4MTEgPDwgOCkgKyAoaGV4dmFsKHNwWzJdKSAqIDB4MTEpOworCWJyZWFrOworICAgIGNhc2UgNDoJCQkvKiAjYXJnYiAqLworCWFyZ2IgPQorCSAgICAoaGV4dmFsKHNwWzBdKSAqIDB4MTEgPDwgMjQpICsKKwkgICAgKGhleHZhbChzcFsxXSkgKiAweDExIDw8IDE2KSArCisJICAgIChoZXh2YWwoc3BbMl0pICogMHgxMSA8PCA4KSArIChoZXh2YWwoc3BbM10pICogMHgxMSk7CisJYnJlYWs7CisgICAgY2FzZSA2OgkJCS8qICNycmdnYmIgKi8KKyAgICBjYXNlIDk6CQkJLyogI3JycmdnZ2JiYiAqLworICAgIGNhc2UgMTI6CQkJLyogI3JycnJnZ2dnYmJiYiAqLworCWRsID0gbGVuIC8gMzsKKwlhcmdiID0KKwkgICAgMHhmZjAwMDAwMCArCisJICAgIChoZXh2YWwyKHNwICsgMCkgPDwgMTYpICsKKwkgICAgKGhleHZhbDIoc3AgKyBkbCkgPDwgOCkgKyBoZXh2YWwyKHNwICsgZGwgKiAyKTsKKwlicmVhazsKKyAgICBjYXNlIDg6CQkJLyogI2FhcnJnZ2JiICovCisJLyogI2FhYXJycmdnZ2JiYiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tICNycnJyZ2dnZ2JiYmIsCisJICAgYXNzdW1lIHRoZSBsYXR0ZXIgaXMgYSBtb3JlIGNvbW1vbiBmb3JtYXQgKi8KKyAgICBjYXNlIDE2OgkJCS8qICNhYWFhcnJycmdnZ2diYmJiICovCisJZGwgPSBsZW4gLyA0OworCWFyZ2IgPQorCSAgICAoaGV4dmFsMihzcCArIDApIDw8IDI0KSArCisJICAgIChoZXh2YWwyKHNwICsgZGwpIDw8IDE2KSArCisJICAgIChoZXh2YWwyKHNwICsgZGwgKiAyKSA8PCA4KSArIGhleHZhbDIoc3AgKyBkbCAqIDMpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJYXJnYiA9IDB4ZmZmZjAwMDA7CS8qIEJyaWdodCByZWQgKGVycm9yIGluZGljYXRpb24pICovCisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGFyZ2I7Cit9CisKKy8qCisgKiBQYXJzZXIgc3RhdGUuICBUaGlzIGlzIGdsb2JhbCBzbyB0aGF0IGluY2x1ZGluZyBtdWx0aXBsZQorICogZmlsZXMgd29yayBhcyBleHBlY3RlZCwgd2hpY2ggaXMgdGhhdCBldmVyeXRoaW5nIHdvcmtzIHRoZQorICogc2FtZSB3YXkgYXMgaWYgdGhlIGZpbGVzIGhhZCBiZWVuIGNvbmNhdGVuYXRlZCB0b2dldGhlci4KKyAqLworLy9zdGF0aWMgY29uc3QgY2hhciAqYXBwZW5kID0gTlVMTDsKK2V4dGVybiBjb25zdCBjaGFyICphcHBlbmQ7CitleHRlcm4gdWludDE2X3QgUFhFUmV0cnk7CitzdGF0aWMgc3RydWN0IGxhYmVsZGF0YSBsZDsKKworc3RhdGljIGludCBwYXJzZV9tYWluX2NvbmZpZyhjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKK3N0YXRpYyBjaGFyICppc19rZXJuZWxfdHlwZShjaGFyICpjbWRzdHIsIGVudW0ga2VybmVsX3R5cGUgKnR5cGUpCit7CisgICAgY29uc3QgY2hhciAqY29uc3QgKnA7CisgICAgY2hhciAqcTsKKyAgICBlbnVtIGtlcm5lbF90eXBlIHQgPSBLVF9OT05FOworCisgICAgZm9yIChwID0ga2VybmVsX3R5cGVzOyAqcDsgcCsrLCB0KyspIHsKKwlpZiAoKHEgPSBsb29raW5nX2F0KGNtZHN0ciwgKnApKSkgeworCSAgICAqdHlwZSA9IHQ7CisJICAgIHJldHVybiBxOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKmlzX21lc3NhZ2VfbmFtZShjaGFyICpjbWRzdHIsIGVudW0gbWVzc2FnZV9udW1iZXIgKm1zZ25yKQoreworICAgIGNoYXIgKnE7CisgICAgZW51bSBtZXNzYWdlX251bWJlciBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKSB7CisJaWYgKChxID0gbG9va2luZ19hdChjbWRzdHIsIG1lc3NhZ2VzW2ldLm5hbWUpKSkgeworCSAgICAqbXNnbnIgPSBpOworCSAgICByZXR1cm4gcTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2V4dGVybiB2b2lkIGdldF9tc2dfZmlsZShjaGFyICopOworCit2b2lkIGNhdF9oZWxwX2ZpbGUoaW50IGtleSkKK3sKKwlzdHJ1Y3QgbWVudSAqY20gPSBjdXJyZW50X21lbnU7CisJaW50IGZrZXk7CisKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgS0VZX0YxOgorCQlma2V5ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRjI6CisJCWZrZXkgPSAxOworCQlicmVhazsKKwljYXNlIEtFWV9GMzoKKwkJZmtleSA9IDI7CisJCWJyZWFrOworCWNhc2UgS0VZX0Y0OgorCQlma2V5ID0gMzsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRjU6CisJCWZrZXkgPSA0OworCQlicmVhazsKKwljYXNlIEtFWV9GNjoKKwkJZmtleSA9IDU7CisJCWJyZWFrOworCWNhc2UgS0VZX0Y3OgorCQlma2V5ID0gNjsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRjg6CisJCWZrZXkgPSA3OworCQlicmVhazsKKwljYXNlIEtFWV9GOToKKwkJZmtleSA9IDg7CisJCWJyZWFrOworCWNhc2UgS0VZX0YxMDoKKwkJZmtleSA9IDk7CisJCWJyZWFrOworCWNhc2UgS0VZX0YxMToKKwkJZmtleSA9IDEwOworCQlicmVhazsKKwljYXNlIEtFWV9GMTI6CisJCWZrZXkgPSAxMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmtleSA9IC0xOworCQlicmVhazsKKwl9CisKKwlpZiAoZmtleSA9PSAtMSkKKwkJcmV0dXJuOworCisJaWYgKGNtLT5ma2V5aGVscFtma2V5XS50ZXh0bmFtZSkgeworCQlwcmludGYoIlxuIik7CisJCWdldF9tc2dfZmlsZSgoY2hhciAqKWNtLT5ma2V5aGVscFtma2V5XS50ZXh0bmFtZSk7CisJfQorfQorCitzdGF0aWMgY2hhciAqaXNfZmtleShjaGFyICpjbWRzdHIsIGludCAqZmtleW5vKQoreworICAgIGNoYXIgKnE7CisgICAgaW50IG5vOworCisgICAgaWYgKChjbWRzdHJbMF0gfCAweDIwKSAhPSAnZicpCisJcmV0dXJuIE5VTEw7CisKKyAgICBubyA9IHN0cnRvdWwoY21kc3RyICsgMSwgJnEsIDEwKTsKKyAgICBpZiAoIW15X2lzc3BhY2UoKnEpKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKG5vIDwgMCB8fCBubyA+IDEyKQorCXJldHVybiBOVUxMOworCisgICAgKmZrZXlubyA9IChubyA9PSAwKSA/IDEwIDogbm8gLSAxOworICAgIHJldHVybiBxOworfQorCitleHRlcm4gdWludDhfdCBGbG93SWdub3JlOworZXh0ZXJuIHVpbnQ4X3QgRmxvd0lucHV0OworZXh0ZXJuIHVpbnQ4X3QgRmxvd091dHB1dDsKK2V4dGVybiB1aW50MTZfdCBTZXJpYWxQb3J0OworZXh0ZXJuIHVpbnQxNl90IEJhdWREaXZpc29yOworc3RhdGljIHVpbnQ4X3QgU2VyaWFsTm90aWNlID0gMTsKKworI2RlZmluZSBERUZBVUxUX0JBVUQJOTYwMAorI2RlZmluZSBCQVVEX0RJVklTT1IJMTE1MjAwCisKK2V4dGVybiB2b2lkIHNpcnFfY2xlYW51cF9ub3dpcGUodm9pZCk7CitleHRlcm4gdm9pZCBzaXJxX2luc3RhbGwodm9pZCk7CitleHRlcm4gdm9pZCB3cml0ZV9zZXJpYWxfc3RyKGNoYXIgKik7CisKK2V4dGVybiB2b2lkIGxvYWRmb250KGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCBsb2Fka2V5cyhjb25zdCBjaGFyICopOworCitleHRlcm4gY2hhciBzeXNsaW51eF9iYW5uZXJbXTsKK2V4dGVybiBjaGFyIGNvcHlyaWdodF9zdHJbXTsKKworLyoKKyAqIFBBVEgtYmFzZWQgbG9va3VwCisgKgorICogRWFjaCBlbnRyeSBpbiB0aGUgUEFUSCBkaXJlY3RpdmUgaXMgc2VwYXJhdGVkIGJ5IGEgY29sb24sIGUuZy4KKyAqCisgKiAgICAgUEFUSCAvYmFyOi9iaW4vZm9vOi9iYXovYmFyL2JpbgorICovCitzdGF0aWMgaW50IHBhcnNlX3BhdGgoY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgcGF0aF9lbnRyeSAqZW50cnk7CisgICAgY29uc3QgY2hhciAqc3RyOworCisgICAgd2hpbGUgKCpwKSB7CisJY2hhciAqYyA9IHA7CisKKwkvKiBGaW5kIHRoZSBuZXh0IGRpcmVjdG9yeSAqLworCXdoaWxlICgqYyAmJiAqYyAhPSAnOicpCisJICAgIGMrKzsKKworCXN0ciA9IHJlZnN0cm5kdXAocCwgYyAtIHApOworCWlmICghc3RyKQorCSAgICBnb3RvIGJhaWw7CisKKwllbnRyeSA9IHBhdGhfYWRkKHN0cik7CisJcmVmc3RyX3B1dChzdHIpOworCisJaWYgKCFlbnRyeSkKKwkgICAgZ290byBiYWlsOworCisJaWYgKCEqYysrKQorCSAgICBicmVhazsKKwlwID0gYzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworYmFpbDoKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2NvbmZpZ19maWxlKEZJTEUgKiBmKTsKKworc3RhdGljIHZvaWQgZG9faW5jbHVkZV9tZW51KGNoYXIgKnN0ciwgc3RydWN0IG1lbnUgKm0pCit7CisgICAgY29uc3QgY2hhciAqZmlsZTsKKyAgICBjaGFyICpwOworICAgIEZJTEUgKmY7CisgICAgaW50IGZkOworCisgICAgcCA9IHNraXBzcGFjZShzdHIpOworICAgIGZpbGUgPSByZWZkdXBfd29yZCgmcCk7CisgICAgcCA9IHNraXBzcGFjZShwKTsKKworICAgIGZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkKKwlnb3RvIHB1dDsKKworICAgIGYgPSBmZG9wZW4oZmQsICJyIik7CisgICAgaWYgKCFmKQorCWdvdG8gYmFpbDsKKworICAgIGlmICgqcCkgeworCXJlY29yZChtLCAmbGQsIGFwcGVuZCk7CisJbSA9IGN1cnJlbnRfbWVudSA9IGJlZ2luX3N1Ym1lbnUocCk7CisgICAgfQorCisgICAgcGFyc2VfY29uZmlnX2ZpbGUoZik7CisKKyAgICBpZiAoKnApIHsKKwlyZWNvcmQobSwgJmxkLCBhcHBlbmQpOworCW0gPSBjdXJyZW50X21lbnUgPSBlbmRfc3VibWVudSgpOworICAgIH0KKworYmFpbDoKKyAgICBjbG9zZShmZCk7CitwdXQ6CisgICAgcmVmc3RyX3B1dChmaWxlKTsKKworfQorCitzdGF0aWMgdm9pZCBkb19pbmNsdWRlKGNoYXIgKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpmaWxlOworICAgIGNoYXIgKnA7CisgICAgRklMRSAqZjsKKyAgICBpbnQgZmQ7CisKKyAgICBwID0gc2tpcHNwYWNlKHN0cik7CisgICAgZmlsZSA9IHJlZmR1cF93b3JkKCZwKTsKKworICAgIGZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkKKwlnb3RvIHB1dDsKKworICAgIGYgPSBmZG9wZW4oZmQsICJyIik7CisgICAgaWYgKGYpCisJcGFyc2VfY29uZmlnX2ZpbGUoZik7CisKKyAgICBjbG9zZShmZCk7CitwdXQ6CisgICAgcmVmc3RyX3B1dChmaWxlKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoRklMRSAqIGYpCit7CisgICAgY2hhciBsaW5lW01BWF9MSU5FXSwgKnAsICplcCwgY2g7CisgICAgZW51bSBrZXJuZWxfdHlwZSB0eXBlOworICAgIGVudW0gbWVzc2FnZV9udW1iZXIgbXNnbnI7CisgICAgaW50IGZrZXlubzsKKyAgICBzdHJ1Y3QgbWVudSAqbSA9IGN1cnJlbnRfbWVudTsKKworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikpIHsKKwlwID0gc3RyY2hyKGxpbmUsICdccicpOworCWlmIChwKQorCSAgICAqcCA9ICdcMCc7CisJcCA9IHN0cmNocihsaW5lLCAnXG4nKTsKKwlpZiAocCkKKwkgICAgKnAgPSAnXDAnOworCisJcCA9IHNraXBzcGFjZShsaW5lKTsKKworCWlmIChsb29raW5nX2F0KHAsICJtZW51IikpIHsKKworCSAgICBwID0gc2tpcHNwYWNlKHAgKyA0KTsKKworCSAgICBpZiAobG9va2luZ19hdChwLCAibGFiZWwiKSkgeworCQkJaWYgKGxkLmxhYmVsKSB7CisJCQkJcmVmc3RyX3B1dChsZC5tZW51bGFiZWwpOworCQkJCWxkLm1lbnVsYWJlbCA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDUpKTsKKwkJCX0gZWxzZSBpZiAobS0+cGFyZW50X2VudHJ5KSB7CisJCQkJcmVmc3RyX3B1dChtLT5wYXJlbnRfZW50cnktPmRpc3BsYXluYW1lKTsKKwkJCQltLT5wYXJlbnRfZW50cnktPmRpc3BsYXluYW1lID0gcmVmc3RyZHVwKHNraXBzcGFjZShwICsgNSkpOworCQkJCWNvbnNpZGVyX2Zvcl9ob3RrZXkobS0+cGFyZW50LCBtLT5wYXJlbnRfZW50cnkpOworCQkJCWlmICghbS0+dGl0bGVbMF0pIHsKKwkJCQkvKiBNRU5VIExBQkVMIC0+IE1FTlUgVElUTEUgb24gc3VibWVudSAqLworCQkJCXJlZnN0cl9wdXQobS0+dGl0bGUpOworCQkJCW0tPnRpdGxlID0gc3RyaXBfY2FyZXQobS0+cGFyZW50X2VudHJ5LT5kaXNwbGF5bmFtZSk7CisJCQkJfQorCQkJfQorCQkJfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJ0aXRsZSIpKSB7CisJCQlyZWZzdHJfcHV0KG0tPnRpdGxlKTsKKwkJCW0tPnRpdGxlID0gcmVmc3RyZHVwKHNraXBzcGFjZShwICsgNSkpOworCQkJaWYgKG0tPnBhcmVudF9lbnRyeSkgeworCQkJCS8qIE1FTlUgVElUTEUgLT4gTUVOVSBMQUJFTCBvbiBzdWJtZW51ICovCisJCQkJaWYgKG0tPnBhcmVudF9lbnRyeS0+ZGlzcGxheW5hbWUgPT0gbS0+bGFiZWwpIHsKKwkJCQlyZWZzdHJfcHV0KG0tPnBhcmVudF9lbnRyeS0+ZGlzcGxheW5hbWUpOworCQkJCW0tPnBhcmVudF9lbnRyeS0+ZGlzcGxheW5hbWUgPSByZWZzdHJfZ2V0KG0tPnRpdGxlKTsKKwkJCQl9CisJCQl9CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiZGVmYXVsdCIpKSB7CisJCWlmIChsZC5sYWJlbCkgeworCQkgICAgbGQubWVudWRlZmF1bHQgPSAxOworCQl9IGVsc2UgaWYgKG0tPnBhcmVudF9lbnRyeSkgeworCQkgICAgbS0+cGFyZW50LT5kZWZlbnRyeSA9IG0tPnBhcmVudF9lbnRyeS0+ZW50cnk7CisJCX0KKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJoaWRlIikpIHsKKwkJbGQubWVudWhpZGUgPSAxOworCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInBhc3N3ZCIpKSB7CisJCWlmIChsZC5sYWJlbCkgeworCQkgICAgcmVmc3RyX3B1dChsZC5wYXNzd2QpOworCQkgICAgbGQucGFzc3dkID0gcmVmc3RyZHVwKHNraXBzcGFjZShwICsgNikpOworCQl9IGVsc2UgaWYgKG0tPnBhcmVudF9lbnRyeSkgeworCQkgICAgcmVmc3RyX3B1dChtLT5wYXJlbnRfZW50cnktPnBhc3N3ZCk7CisJCSAgICBtLT5wYXJlbnRfZW50cnktPnBhc3N3ZCA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDYpKTsKKwkJfQorCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInNoaWZ0a2V5IikpIHsKKwkJc2hpZnRrZXkgPSAxOworCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInNhdmUiKSkgeworCQltZW51c2F2ZSA9IHRydWU7CisJCWlmIChsZC5sYWJlbCkKKwkJICAgIGxkLnNhdmUgPSAxOworCQllbHNlCisJCSAgICBtLT5zYXZlID0gdHJ1ZTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJub3NhdmUiKSkgeworCQlpZiAobGQubGFiZWwpCisJCSAgICBsZC5zYXZlID0gLTE7CisJCWVsc2UKKwkJICAgIG0tPnNhdmUgPSBmYWxzZTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJvbmVycm9yIikpIHsKKwkJcmVmc3RyX3B1dChtLT5vbmVycm9yKTsKKwkJbS0+b25lcnJvciA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDcpKTsKKwkJb25lcnJvcmxlbiA9IHN0cmxlbihtLT5vbmVycm9yKTsKKwkJcmVmc3RyX3B1dChvbmVycm9yKTsKKwkJb25lcnJvciA9IHJlZnN0cmR1cChtLT5vbmVycm9yKTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJtYXN0ZXIiKSkgeworCQlwID0gc2tpcHNwYWNlKHAgKyA2KTsKKwkJaWYgKGxvb2tpbmdfYXQocCwgInBhc3N3ZCIpKSB7CisJCSAgICByZWZzdHJfcHV0KG0tPm1lbnVfbWFzdGVyX3Bhc3N3ZCk7CisJCSAgICBtLT5tZW51X21hc3Rlcl9wYXNzd2QgPSByZWZzdHJkdXAoc2tpcHNwYWNlKHAgKyA2KSk7CisJCX0KKwkgICAgfSBlbHNlIGlmICgoZXAgPSBsb29raW5nX2F0KHAsICJpbmNsdWRlIikpKSB7CisJCWRvX2luY2x1ZGVfbWVudShlcCwgbSk7CisJICAgIH0gZWxzZSBpZiAoKGVwID0gbG9va2luZ19hdChwLCAiYmFja2dyb3VuZCIpKSkgeworCQlwID0gc2tpcHNwYWNlKGVwKTsKKwkJcmVmc3RyX3B1dChtLT5tZW51X2JhY2tncm91bmQpOworCQltLT5tZW51X2JhY2tncm91bmQgPSByZWZkdXBfd29yZCgmcCk7CisJICAgIH0gZWxzZSBpZiAoKGVwID0gbG9va2luZ19hdChwLCAiaGlkZGVuIikpKSB7CisJCWhpZGRlbm1lbnUgPSAxOworCSAgICB9IGVsc2UgaWYgKChlcCA9IGlzX21lc3NhZ2VfbmFtZShwLCAmbXNnbnIpKSkgeworCQlyZWZzdHJfcHV0KG0tPm1lc3NhZ2VzW21zZ25yXSk7CisJCW0tPm1lc3NhZ2VzW21zZ25yXSA9IHJlZnN0cmR1cChza2lwc3BhY2UoZXApKTsKKwkgICAgfSBlbHNlIGlmICgoZXAgPSBsb29raW5nX2F0KHAsICJjb2xvciIpKSB8fAorCQkgICAgICAgKGVwID0gbG9va2luZ19hdChwLCAiY29sb3VyIikpKSB7CisJCWludCBpOworCQlzdHJ1Y3QgY29sb3JfdGFibGUgKmNwdHI7CisJCXAgPSBza2lwc3BhY2UoZXApOworCQljcHRyID0gbS0+Y29sb3JfdGFibGU7CisJCWZvciAoaSA9IDA7IGkgPCBtZW51X2NvbG9yX3RhYmxlX3NpemU7IGkrKykgeworCQkgICAgaWYgKChlcCA9IGxvb2tpbmdfYXQocCwgY3B0ci0+bmFtZSkpKSB7CisJCQlwID0gc2tpcHNwYWNlKGVwKTsKKwkJCWlmICgqcCkgeworCQkJICAgIGlmIChsb29raW5nX2F0KHAsICIqIikpIHsKKwkJCQlwKys7CisJCQkgICAgfSBlbHNlIHsKKwkJCQlyZWZzdHJfcHV0KGNwdHItPmFuc2kpOworCQkJCWNwdHItPmFuc2kgPSByZWZkdXBfd29yZCgmcCk7CisJCQkgICAgfQorCisJCQkgICAgcCA9IHNraXBzcGFjZShwKTsKKwkJCSAgICBpZiAoKnApIHsKKwkJCQlpZiAobG9va2luZ19hdChwLCAiKiIpKQorCQkJCSAgICBwKys7CisJCQkJZWxzZQorCQkJCSAgICBjcHRyLT5hcmdiX2ZnID0gcGFyc2VfYXJnYigmcCk7CisKKwkJCQlwID0gc2tpcHNwYWNlKHApOworCQkJCWlmICgqcCkgeworCQkJCSAgICBpZiAobG9va2luZ19hdChwLCAiKiIpKQorCQkJCQlwKys7CisJCQkJICAgIGVsc2UKKwkJCQkJY3B0ci0+YXJnYl9iZyA9IHBhcnNlX2FyZ2IoJnApOworCisJCQkJICAgIC8qIFBhcnNlIGEgc2hhZG93IG1vZGUgKi8KKwkJCQkgICAgcCA9IHNraXBzcGFjZShwKTsKKwkJCQkgICAgY2ggPSAqcCB8IDB4MjA7CisJCQkJICAgIGlmIChjaCA9PSAnbicpCS8qIG5vbmUgKi8KKwkJCQkJY3B0ci0+c2hhZG93ID0gU0hBRE9XX05PTkU7CisJCQkJICAgIGVsc2UgaWYgKGNoID09ICdzJykJLyogc3RkLCBzdGFuZGFyZCAqLworCQkJCQljcHRyLT5zaGFkb3cgPSBTSEFET1dfTk9STUFMOworCQkJCSAgICBlbHNlIGlmIChjaCA9PSAnYScpCS8qIGFsbCAqLworCQkJCQljcHRyLT5zaGFkb3cgPSBTSEFET1dfQUxMOworCQkJCSAgICBlbHNlIGlmIChjaCA9PSAncicpCS8qIHJldiwgcmV2ZXJzZSAqLworCQkJCQljcHRyLT5zaGFkb3cgPSBTSEFET1dfUkVWRVJTRTsKKwkJCQl9CisJCQkgICAgfQorCQkJfQorCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBjcHRyKys7CisJCX0KKwkgICAgfSBlbHNlIGlmICgoZXAgPSBsb29raW5nX2F0KHAsICJtc2djb2xvciIpKSB8fAorCQkgICAgICAgKGVwID0gbG9va2luZ19hdChwLCAibXNnY29sb3VyIikpKSB7CisJCXVuc2lnbmVkIGludCBmZ19tYXNrID0gTVNHX0NPTE9SU19ERUZfRkc7CisJCXVuc2lnbmVkIGludCBiZ19tYXNrID0gTVNHX0NPTE9SU19ERUZfQkc7CisJCWVudW0gY29sb3JfdGFibGVfc2hhZG93IHNoYWRvdyA9IE1TR19DT0xPUlNfREVGX1NIQURPVzsKKworCQlwID0gc2tpcHNwYWNlKGVwKTsKKwkJaWYgKCpwKSB7CisJCSAgICBpZiAoIWxvb2tpbmdfYXQocCwgIioiKSkKKwkJCWZnX21hc2sgPSBwYXJzZV9hcmdiKCZwKTsKKworCQkgICAgcCA9IHNraXBzcGFjZShwKTsKKwkJICAgIGlmICgqcCkgeworCQkJaWYgKCFsb29raW5nX2F0KHAsICIqIikpCisJCQkgICAgYmdfbWFzayA9IHBhcnNlX2FyZ2IoJnApOworCisJCQlwID0gc2tpcHNwYWNlKHApOworCQkJc3dpdGNoICgqcCB8IDB4MjApIHsKKwkJCWNhc2UgJ24nOgorCQkJICAgIHNoYWRvdyA9IFNIQURPV19OT05FOworCQkJICAgIGJyZWFrOworCQkJY2FzZSAncyc6CisJCQkgICAgc2hhZG93ID0gU0hBRE9XX05PUk1BTDsKKwkJCSAgICBicmVhazsKKwkJCWNhc2UgJ2EnOgorCQkJICAgIHNoYWRvdyA9IFNIQURPV19BTEw7CisJCQkgICAgYnJlYWs7CisJCQljYXNlICdyJzoKKwkJCSAgICBzaGFkb3cgPSBTSEFET1dfUkVWRVJTRTsKKwkJCSAgICBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkgICAgLyogZ28gd2l0aCBkZWZhdWx0ICovCisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCX0KKwkJc2V0X21zZ19jb2xvcnNfZ2xvYmFsKG0tPmNvbG9yX3RhYmxlLCBmZ19tYXNrLCBiZ19tYXNrLCBzaGFkb3cpOworCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInNlcGFyYXRvciIpKSB7CisJCXJlY29yZChtLCAmbGQsIGFwcGVuZCk7CisJCWxkLmxhYmVsID0gcmVmc3RyX2dldChlbXB0eV9zdHJpbmcpOworCQlsZC5tZW51c2VwYXJhdG9yID0gMTsKKwkJcmVjb3JkKG0sICZsZCwgYXBwZW5kKTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJkaXNhYmxlIikgfHwgbG9va2luZ19hdChwLCAiZGlzYWJsZWQiKSkgeworCQlsZC5tZW51ZGlzYWJsZWQgPSAxOworCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImluZGVudCIpKSB7CisJCWxkLm1lbnVpbmRlbnQgPSBhdG9pKHNraXBzcGFjZShwICsgNikpOworCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImJlZ2luIikpIHsKKwkJcmVjb3JkKG0sICZsZCwgYXBwZW5kKTsKKwkJbSA9IGN1cnJlbnRfbWVudSA9IGJlZ2luX3N1Ym1lbnUoc2tpcHNwYWNlKHAgKyA1KSk7CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiZW5kIikpIHsKKwkJcmVjb3JkKG0sICZsZCwgYXBwZW5kKTsKKwkJbSA9IGN1cnJlbnRfbWVudSA9IGVuZF9zdWJtZW51KCk7CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAicXVpdCIpKSB7CisJCWlmIChsZC5sYWJlbCkKKwkJICAgIGxkLmFjdGlvbiA9IE1BX1FVSVQ7CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiZ290byIpKSB7CisJCWlmIChsZC5sYWJlbCkgeworCQkgICAgbGQuYWN0aW9uID0gTUFfR09UT19VTlJFUzsKKwkJICAgIHJlZnN0cl9wdXQobGQua2VybmVsKTsKKwkJICAgIGxkLmtlcm5lbCA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDQpKTsKKwkJfQorCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImV4aXQiKSkgeworCQlwID0gc2tpcHNwYWNlKHAgKyA0KTsKKwkJaWYgKGxkLmxhYmVsICYmIG0tPnBhcmVudCkgeworCQkgICAgaWYgKCpwKSB7CisJCQkvKiBUaGlzIGlzIHJlYWxseSBqdXN0IGEgZ290bywgZXhjZXB0IGZvciB0aGUgbWFya2VyICovCisJCQlsZC5hY3Rpb24gPSBNQV9FWElUX1VOUkVTOworCQkJcmVmc3RyX3B1dChsZC5rZXJuZWwpOworCQkJbGQua2VybmVsID0gcmVmc3RyZHVwKHApOworCQkgICAgfSBlbHNlIHsKKwkJCWxkLmFjdGlvbiA9IE1BX0VYSVQ7CisJCQlsZC5zdWJtZW51ID0gbS0+cGFyZW50OworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAic3RhcnQiKSkgeworCQlzdGFydF9tZW51ID0gbTsKKwkgICAgfSBlbHNlIHsKKwkJLyogVW5rbm93biwgY2hlY2sgZm9yIGxheW91dCBwYXJhbWV0ZXJzICovCisJCWVudW0gcGFyYW1ldGVyX251bWJlciBtcDsKKwkJZm9yIChtcCA9IDA7IG1wIDwgTlBBUkFNUzsgbXArKykgeworCQkgICAgaWYgKChlcCA9IGxvb2tpbmdfYXQocCwgbXBhcm1bbXBdLm5hbWUpKSkgeworCQkJbS0+bXBhcm1bbXBdID0gYXRvaShza2lwc3BhY2UoZXApKTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJLyogZmVuZzogbWVudSBoYW5kbGluZyBlbmQgKi8JCisJZWxzZSBpZiAobG9va2luZ19hdChwLCAidGV4dCIpKSB7CisKKwkJLyogbG9vcCB0aWxsIHdlIGZpbmVkIHRoZSAiZW5kdGV4dCIgKi8KKwkgICAgZW51bSB0ZXh0X2NtZCB7CisJCVRFWFRfVU5LTk9XTiwKKwkJVEVYVF9IRUxQCisJICAgIH0gY21kID0gVEVYVF9VTktOT1dOOworCSAgICBpbnQgbGVuID0gbGQuaGVscHRleHQgPyBzdHJsZW4obGQuaGVscHRleHQpIDogMDsKKwkgICAgaW50IHhsZW47CisKKwkgICAgcCA9IHNraXBzcGFjZShwICsgNCk7CisKKwkgICAgaWYgKGxvb2tpbmdfYXQocCwgImhlbHAiKSkKKwkJY21kID0gVEVYVF9IRUxQOworCisJICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikpIHsKKwkJcCA9IHNraXBzcGFjZShsaW5lKTsKKwkJaWYgKGxvb2tpbmdfYXQocCwgImVuZHRleHQiKSkKKwkJICAgIGJyZWFrOworCisJCXhsZW4gPSBzdHJsZW4obGluZSk7CisKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBURVhUX1VOS05PV046CisJCSAgICBicmVhazsKKwkJY2FzZSBURVhUX0hFTFA6CisJCSAgICBsZC5oZWxwdGV4dCA9IHJlYWxsb2MobGQuaGVscHRleHQsIGxlbiArIHhsZW4gKyAxKTsKKwkJICAgIG1lbWNweShsZC5oZWxwdGV4dCArIGxlbiwgbGluZSwgeGxlbiArIDEpOworCQkgICAgbGVuICs9IHhsZW47CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmICgoZXAgPSBpc19ma2V5KHAsICZma2V5bm8pKSkgeworCSAgICBwID0gc2tpcHNwYWNlKGVwKTsKKwkgICAgaWYgKG0tPmZrZXloZWxwW2ZrZXlub10udGV4dG5hbWUpIHsKKwkJcmVmc3RyX3B1dChtLT5ma2V5aGVscFtma2V5bm9dLnRleHRuYW1lKTsKKwkJbS0+ZmtleWhlbHBbZmtleW5vXS50ZXh0bmFtZSA9IE5VTEw7CisJICAgIH0KKwkgICAgaWYgKG0tPmZrZXloZWxwW2ZrZXlub10uYmFja2dyb3VuZCkgeworCQlyZWZzdHJfcHV0KG0tPmZrZXloZWxwW2ZrZXlub10uYmFja2dyb3VuZCk7CisJCW0tPmZrZXloZWxwW2ZrZXlub10uYmFja2dyb3VuZCA9IE5VTEw7CisJICAgIH0KKworCSAgICByZWZzdHJfcHV0KG0tPmZrZXloZWxwW2ZrZXlub10udGV4dG5hbWUpOworCSAgICBtLT5ma2V5aGVscFtma2V5bm9dLnRleHRuYW1lID0gcmVmZHVwX3dvcmQoJnApOworCSAgICBpZiAoKnApIHsKKwkJcCA9IHNraXBzcGFjZShwKTsKKwkJbS0+ZmtleWhlbHBbZmtleW5vXS5iYWNrZ3JvdW5kID0gcmVmZHVwX3dvcmQoJnApOworCSAgICB9CisJfSBlbHNlIGlmICgoZXAgPSBsb29raW5nX2F0KHAsICJpbmNsdWRlIikpKSB7CisJICAgIGRvX2luY2x1ZGUoZXApOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiYXBwZW5kIikpIHsKKwkgICAgY29uc3QgY2hhciAqYSA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDYpKTsKKwkgICAgaWYgKGxkLmxhYmVsKSB7CisJCXJlZnN0cl9wdXQobGQuYXBwZW5kKTsKKwkJbGQuYXBwZW5kID0gYTsKKwkgICAgfSBlbHNlIHsKKwkJcmVmc3RyX3B1dChhcHBlbmQpOworCQlhcHBlbmQgPSBhOworCSAgICB9CisJICAgIC8vZHByaW50Zigid2UgZ290IGEgYXBwZW5kOiAlcyIsIGEpOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiaW5pdHJkIikpIHsKKwkgICAgY29uc3QgY2hhciAqYSA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDYpKTsKKwkgICAgaWYgKGxkLmxhYmVsKSB7CisJCXJlZnN0cl9wdXQobGQuaW5pdHJkKTsKKwkJbGQuaW5pdHJkID0gYTsKKwkgICAgfSBlbHNlIHsKKwkJLyogSWdub3JlICovCisJICAgIH0KKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImxhYmVsIikpIHsKKwkgICAgcCA9IHNraXBzcGFjZShwICsgNSk7CisJICAgIC8qIHdoZW4gZmlyc3QgdGltZSBzZWUgImxhYmVsIiwgaXQgd2lsbCBub3QgcmVhbGx5IHJlY29yZCBhbnl0aGluZyAqLworCSAgICByZWNvcmQobSwgJmxkLCBhcHBlbmQpOworCSAgICBsZC5sYWJlbCA9IF9fcmVmZHVwX3dvcmQocCwgTlVMTCk7CisJICAgIGxkLmtlcm5lbCA9IF9fcmVmZHVwX3dvcmQocCwgTlVMTCk7CisJICAgIC8qIGZlbmc6IHRoaXMgaXMgdGhlIGRlZmF1bHQgdHlwZSBmb3IgYWxsICovCisJICAgIGxkLnR5cGUgPSBLVF9LRVJORUw7CisJICAgIGxkLnBhc3N3ZCA9IE5VTEw7CisJICAgIGxkLmFwcGVuZCA9IE5VTEw7CisJICAgIGxkLmluaXRyZCA9IE5VTEw7CisJICAgIGxkLm1lbnVsYWJlbCA9IE5VTEw7CisJICAgIGxkLmhlbHB0ZXh0ID0gTlVMTDsKKwkgICAgbGQuaXBhcHBlbmQgPSBTeXNBcHBlbmRzOworCSAgICBsZC5tZW51ZGVmYXVsdCA9IGxkLm1lbnVoaWRlID0gbGQubWVudXNlcGFyYXRvciA9CisJCWxkLm1lbnVkaXNhYmxlZCA9IGxkLm1lbnVpbmRlbnQgPSAwOworCX0gZWxzZSBpZiAoKGVwID0gaXNfa2VybmVsX3R5cGUocCwgJnR5cGUpKSkgeworCSAgICBpZiAobGQubGFiZWwpIHsKKwkJcmVmc3RyX3B1dChsZC5rZXJuZWwpOworCQlsZC5rZXJuZWwgPSByZWZzdHJkdXAoc2tpcHNwYWNlKGVwKSk7CisJCWxkLnR5cGUgPSB0eXBlOworCQkvL2RwcmludGYoImdvdCBhIGtlcm5lbDogJXMsIHR5cGUgPSAlZCIsIGxkLmtlcm5lbCwgbGQudHlwZSk7CisJICAgIH0KKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInRpbWVvdXQiKSkgeworCSAgICBrYmR0aW1lb3V0ID0gKGF0b2koc2tpcHNwYWNlKHAgKyA3KSkgKiBDTEtfVENLICsgOSkgLyAxMDsKKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInRvdGFsdGltZW91dCIpKSB7CisJICAgIHRvdGFsdGltZW91dCA9IChhdG9sbChza2lwc3BhY2UocCArIDEzKSkgKiBDTEtfVENLICsgOSkgLyAxMDsKKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgIm9udGltZW91dCIpKSB7CisJICAgIG9udGltZW91dCA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDkpKTsKKwkgICAgb250aW1lb3V0bGVuID0gc3RybGVuKG9udGltZW91dCk7CisJfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJhbGxvd29wdGlvbnMiKSkgeworCSAgICBhbGxvd29wdGlvbnMgPSAhIWF0b2koc2tpcHNwYWNlKHAgKyAxMikpOworCX0gZWxzZSBpZiAoKGVwID0gbG9va2luZ19hdChwLCAiaXBhcHBlbmQiKSkgfHwKKwkJICAgKGVwID0gbG9va2luZ19hdChwLCAic3lzYXBwZW5kIikpKSB7CisJICAgIHVpbnQzMl90IHMgPSBzdHJ0b3VsKHNraXBzcGFjZShlcCksIE5VTEwsIDApOworCSAgICBpZiAobGQubGFiZWwpCisJCWxkLmlwYXBwZW5kID0gczsKKwkgICAgZWxzZQorCQlTeXNBcHBlbmRzID0gczsKKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImRlZmF1bHQiKSkgeworCSAgICAvKiBkZWZhdWx0IGNvdWxkIGJlIGEga2VybmVsIGltYWdlIG9yIGFub3RoZXIgbGFiZWwgKi8KKwkgICAgcmVmc3RyX3B1dChnbG9iYWxkZWZhdWx0KTsKKwkgICAgZ2xvYmFsZGVmYXVsdCA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDcpKTsKKworCSAgICAvKgorCSAgICAgKiBPbiB0aGUgY2hhbmNlIHRoYXQgImRlZmF1bHQiIGlzIGFjdHVhbGx5IGEga2VybmVsIGltYWdlCisJICAgICAqIGFuZCBub3QgYSBsYWJlbCwgc3RvcmUgYSBjb3B5IG9mIGl0LCBidXQgb25seSBpZiB3ZQorCSAgICAgKiBoYXZlbid0IHNlZW4gYSAidWkiIGNvbW1hbmQuICJ1aSIgY29tbWFuZHMgdGFrZQorCSAgICAgKiBwcmVjZW5kZW5jZSBvdmVyICJkZWZhdWx0IiBjb21tYW5kcy4KKwkgICAgICovCisJICAgIGlmIChkZWZhdWx0bGV2ZWwgPCBMRVZFTF9VSSkgeworCQlkZWZhdWx0bGV2ZWwgPSBMRVZFTF9ERUZBVUxUOworCQlyZWZzdHJfcHV0KGRlZmF1bHRfY21kKTsKKwkJZGVmYXVsdF9jbWQgPSByZWZzdHJkdXAoZ2xvYmFsZGVmYXVsdCk7CisJICAgIH0KKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInVpIikpIHsKKwkgICAgaGFzX3VpID0gMTsKKwkgICAgZGVmYXVsdGxldmVsID0gTEVWRUxfVUk7CisJICAgIHJlZnN0cl9wdXQoZGVmYXVsdF9jbWQpOworCSAgICBkZWZhdWx0X2NtZCA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDIpKTsKKwl9CisJCisJLyoKKwkgKiBzdWJzZXQgMTogIHBjX29wZW5jbWQgCisJICogZGlzcGxheS9mb250L2tiZG1hcCBhcmUgcmF0aGVyIHNpbWlsYXIsIG9wZW4gYSBmaWxlIHRoZW4gZG8gc3RoCisJICovCisJZWxzZSBpZiAobG9va2luZ19hdChwLCAiZGlzcGxheSIpKSB7CisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCQljaGFyICpkc3QgPSBLZXJuZWxOYW1lOworCQlzaXplX3QgbGVuID0gRklMRU5BTUVfTUFYIC0gMTsKKworCQlmaWxlbmFtZSA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDcpKTsKKworCQl3aGlsZSAobGVuLS0gJiYgbm90X3doaXRlc3BhY2UoKmZpbGVuYW1lKSkKKwkJCSpkc3QrKyA9ICpmaWxlbmFtZSsrOworCQkqZHN0ID0gJ1wwJzsKKworCQlnZXRfbXNnX2ZpbGUoS2VybmVsTmFtZSk7CisJCXJlZnN0cl9wdXQoZmlsZW5hbWUpOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiZm9udCIpKSB7CisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCQljaGFyICpkc3QgPSBLZXJuZWxOYW1lOworCQlzaXplX3QgbGVuID0gRklMRU5BTUVfTUFYIC0gMTsKKworCQlmaWxlbmFtZSA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDQpKTsKKworCQl3aGlsZSAobGVuLS0gJiYgbm90X3doaXRlc3BhY2UoKmZpbGVuYW1lKSkKKwkJCSpkc3QrKyA9ICpmaWxlbmFtZSsrOworCQkqZHN0ID0gJ1wwJzsKKworCQlsb2FkZm9udChLZXJuZWxOYW1lKTsKKwkJcmVmc3RyX3B1dChmaWxlbmFtZSk7CisJfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJrYmRtYXAiKSkgeworCQljb25zdCBjaGFyICpmaWxlbmFtZTsKKworCQlmaWxlbmFtZSA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDYpKTsKKwkJbG9hZGtleXMoZmlsZW5hbWUpOworCQlyZWZzdHJfcHV0KGZpbGVuYW1lKTsKKwl9CisJLyoKKwkgKiBzdWJzZXQgMjogIHBjX3NldGludDE2CisJICogc2V0IGEgZ2xvYmFsIGZsYWcKKwkgKi8KKwllbHNlIGlmIChsb29raW5nX2F0KHAsICJpbXBsaWNpdCIpKSB7CisJCWFsbG93aW1wbGljaXQgPSBhdG9pKHNraXBzcGFjZShwICsgOCkpOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAicHJvbXB0IikpIHsKKwkJZm9yY2Vwcm9tcHQgPSBhdG9pKHNraXBzcGFjZShwICsgNikpOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiY29uc29sZSIpKSB7CisJCURpc3BsYXlDb24gPSBhdG9pKHNraXBzcGFjZShwICsgNykpOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiYWxsb3dvcHRpb25zIikpIHsKKwkJYWxsb3dvcHRpb25zID0gYXRvaShza2lwc3BhY2UocCArIDEyKSk7CisJfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJub2VzY2FwZSIpKSB7CisJCW5vZXNjYXBlID0gYXRvaShza2lwc3BhY2UocCArIDgpKTsKKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgIm5vY29tcGxldGUiKSkgeworCQlub2NvbXBsZXRlID0gYXRvaShza2lwc3BhY2UocCArIDEwKSk7CisJfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJub2hhbHQiKSkgeworCQlOb0hhbHQgPSBhdG9pKHNraXBzcGFjZShwICsgOCkpOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAib25lcnJvciIpKSB7CisJCXJlZnN0cl9wdXQobS0+b25lcnJvcik7CisJCW0tPm9uZXJyb3IgPSByZWZzdHJkdXAoc2tpcHNwYWNlKHAgKyA3KSk7CisJCW9uZXJyb3JsZW4gPSBzdHJsZW4obS0+b25lcnJvcik7CisJCXJlZnN0cl9wdXQob25lcnJvcik7CisJCW9uZXJyb3IgPSByZWZzdHJkdXAobS0+b25lcnJvcik7CisJfQorCisJZWxzZSBpZiAobG9va2luZ19hdChwLCAicHhlcmV0cnkiKSkKKwkJUFhFUmV0cnkgPSBhdG9pKHNraXBzcGFjZShwICsgOCkpOworCisJLyogc2VyaWFsIHNldHRpbmcsIGJwcywgZmxvdyBjb250cm9sICovCisJZWxzZSBpZiAobG9va2luZ19hdChwLCAic2VyaWFsIikpIHsKKwkJdWludDE2X3QgcG9ydCwgZmxvdzsKKwkJdWludDMyX3QgYmF1ZDsKKworCQlwID0gc2tpcHNwYWNlKHAgKyA2KTsKKwkJcG9ydCA9IGF0b2kocCk7CisKKwkJd2hpbGUgKGlzYWxudW0oKnApKQorCQkJcCsrOworCQlwID0gc2tpcHNwYWNlKHApOworCisJCS8qIERlZmF1bHQgdG8gbm8gZmxvdyBjb250cm9sICovCisJCUZsb3dPdXRwdXQgPSAwOworCQlGbG93SW5wdXQgPSAwOworCisJCWJhdWQgPSBERUZBVUxUX0JBVUQ7CisJCWlmIChpc2FsbnVtKCpwKSkgeworCQkJdWludDhfdCBpZ25vcmU7CisKKwkJCS8qIHNldHVwIGJhdWQgKi8KKwkJCWJhdWQgPSBhdG9pKHApOworCQkJd2hpbGUgKGlzYWxudW0oKnApKQorCQkJCXArKzsKKwkJCXAgPSBza2lwc3BhY2UocCk7CisKKwkJCWlnbm9yZSA9IDA7CisJCQlmbG93ID0gMDsKKwkJCWlmIChpc2FsbnVtKCpwKSkgeworCQkJCS8qIGZsb3cgY29udHJvbCAqLworCQkJCWZsb3cgPSBhdG9pKHApOworCQkJCWlnbm9yZSA9ICgoZmxvdyAmIDB4MEYwMCkgPj4gNCk7CisJCQl9CisKKwkJCUZsb3dJZ25vcmUgPSBpZ25vcmU7CisJCQlmbG93ID0gKChmbG93ICYgMHhmZikgPDwgOCkgfCAoZmxvdyAmIDB4ZmYpOworCQkJZmxvdyAmPSAweEYwMEI7CisJCQlGbG93T3V0cHV0ID0gKGZsb3cgJiAweGZmKTsKKwkJCUZsb3dJbnB1dCA9ICgoZmxvdyAmIDB4ZmYwMCkgPj4gOCk7CisJCX0KKworCQkvKgorCQkgKiBQYXJzZSBiYXVkCisJCSAqLworCQlpZiAoYmF1ZCA8IDc1KSB7CisJCQkvKiA8IDc1IGJhdWQgPT0gYm9ndXMgKi8KKwkJCVNlcmlhbFBvcnQgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQliYXVkID0gQkFVRF9ESVZJU09SIC8gYmF1ZDsKKwkJYmF1ZCAmPSAweGZmZmY7CisJCUJhdWREaXZpc29yID0gYmF1ZDsKKworCQlwb3J0ID0gZ2V0X3NlcmlhbF9wb3J0KHBvcnQpOworCQlTZXJpYWxQb3J0ID0gcG9ydDsKKworCQkvKgorCQkgKiBCZWdpbiBjb2RlIHRvIGFjdHVhbGx5IHNldCB1cCB0aGUgc2VyaWFsIHBvcnQKKwkJICovCisJCXNpcnFfY2xlYW51cF9ub3dpcGUoKTsKKworCQlvdXRiKDB4ODMsIHBvcnQgKyAzKTsgLyogRW5hYmxlIERMQUIgKi8KKwkJaW9fZGVsYXkoKTsKKworCQlvdXRiKChiYXVkICYgMHhmZiksIHBvcnQpOyAvKiB3cml0ZSBkaXZpc29yIHRvIExTICovCisJCWlvX2RlbGF5KCk7CisKKwkJb3V0YigoKGJhdWQgJiAweGZmMDApID4+IDgpLCBwb3J0ICsgMSk7IC8qIHdyaXRlIHRvIE1TICovCisJCWlvX2RlbGF5KCk7CisKKwkJb3V0YigweDAzLCBwb3J0ICsgMyk7IC8qIERpc2FibGUgRExBQiAqLworCQlpb19kZWxheSgpOworCisJCS8qCisJCSAqIFJlYWQgYmFjayBMQ1IgKGRldGVjdCBtaXNzaW5nIGh3KS4gSWYgbm90aGluZyBoZXJlCisJCSAqIHdlJ2xsIHJlYWQgMDAgb3IgRkYuCisJCSAqLworCQlpZiAoaW5iKHBvcnQgKyAzKSAhPSAweDAzKSB7CisJCQkvKiBBc3N1bWUgc2VyaWFsIHBvcnQgYnVzdGVkICovCisJCQlTZXJpYWxQb3J0ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJb3V0YigweDAxLCBwb3J0ICsgMik7IC8qIEVuYWJsZSBGSUZPcyBpZiBwcmVzZW50ICovCisJCWlvX2RlbGF5KCk7CisKKwkJLyogRGlzYWJsZSBGSUZPIGlmIHVudXNhYmxlICovCisJCWlmIChpbmIocG9ydCArIDIpIDwgMHgwQzApIHsKKwkJCW91dGIoMCwgcG9ydCArIDIpOworCQkJaW9fZGVsYXkoKTsKKwkJfQorCisJCS8qIEFzc2VydCBiaXRzIGluIE1DUiAqLworCQlvdXRiKEZsb3dPdXRwdXQsIHBvcnQgKyA0KTsKKwkJaW9fZGVsYXkoKTsKKworCQkvKiBFbmFibGUgaW50ZXJydXB0cyBpZiByZXF1ZXN0ZWQgKi8KKwkJaWYgKEZsb3dPdXRwdXQgJiAweDgpCisJCQlzaXJxX2luc3RhbGwoKTsKKworCQkvKiBTaG93IHNvbWUgbGlmZSAqLworCQlpZiAoU2VyaWFsTm90aWNlICE9IDApIHsKKwkJCVNlcmlhbE5vdGljZSA9IDA7CisKKwkJCXdyaXRlX3NlcmlhbF9zdHIoc3lzbGludXhfYmFubmVyKTsKKwkJCXdyaXRlX3NlcmlhbF9zdHIoY29weXJpZ2h0X3N0cik7CisJCX0KKworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAic2F5IikpIHsKKwkJcHJpbnRmKCIlc1xuIiwgcCs0KTsKKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInBhdGgiKSkgeworCQlpZiAocGFyc2VfcGF0aChza2lwc3BhY2UocCArIDQpKSkKKwkJCXByaW50ZigiRmFpbGVkIHRvIHBhcnNlIFBBVEhcbiIpOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAic2VuZGNvb2tpZXMiKSkgeworCQljb25zdCB1bmlvbiBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8gKnNkaTsKKworCQlwICs9IHN0cmxlbigic2VuZGNvb2tpZXMiKTsKKwkJc2RpID0gc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvKCk7CisKKwkJaWYgKHNkaS0+Yy5maWxlc3lzdGVtID09IFNZU0xJTlVYX0ZTX1BYRUxJTlVYKSB7CisJCQlTZW5kQ29va2llcyA9IHN0cnRvdWwoc2tpcHNwYWNlKHApLCBOVUxMLCAxMCk7CisJCQlodHRwX2Jha2VfY29va2llcygpOworCQl9CisJfQorICAgIH0KK30KKworc3RhdGljIGludCBwYXJzZV9tYWluX2NvbmZpZyhjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljb25zdCBjaGFyICptb2RlID0gInIiOworCUZJTEUgKmY7CisJaW50IGZkOworCisJaWYgKCFmaWxlbmFtZSkKKwkJZmQgPSBvcGVuX2NvbmZpZygpOworCWVsc2UKKwkJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisKKwlpZiAoY29uZmlnX2N3ZFswXSkgeworCQlpZiAoY2hkaXIoY29uZmlnX2N3ZCkgPCAwKQorCQkJcHJpbnRmKCJGYWlsZWQgdG8gY2hkaXIgdG8gJXNcbiIsIGNvbmZpZ19jd2QpOworCQljb25maWdfY3dkWzBdID0gJ1wwJzsKKwl9CisKKwlmID0gZmRvcGVuKGZkLCBtb2RlKTsKKwlwYXJzZV9jb25maWdfZmlsZShmKTsKKworCS8qCisJICogVXBkYXRlIENvbmZpZ05hbWUgc28gdGhhdCBzeXNsaW51eF9jb25maWdfZmlsZSgpIHJldHVybnMKKwkgKiB0aGUgZmlsZW5hbWUgd2UganVzdCBvcGVuZWQuIGZpbGVzeXN0ZW0tc3BlY2lmaWMKKwkgKiBvcGVuX2NvbmZpZygpIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gdXBkYXRlCisJICogQ29uZmlnTmFtZSB0aGVtc2VsdmVzLgorCSAqLworCWlmIChmaWxlbmFtZSkKKwkgICAgc3RyY3B5KENvbmZpZ05hbWUsIGZpbGVuYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZXNvbHZlX2dvdG9zKHZvaWQpCit7CisgICAgc3RydWN0IG1lbnVfZW50cnkgKm1lOworICAgIHN0cnVjdCBtZW51ICptOworCisgICAgZm9yIChtZSA9IGFsbF9lbnRyaWVzOyBtZTsgbWUgPSBtZS0+bmV4dCkgeworCWlmIChtZS0+YWN0aW9uID09IE1BX0dPVE9fVU5SRVMgfHwgbWUtPmFjdGlvbiA9PSBNQV9FWElUX1VOUkVTKSB7CisJICAgIG0gPSBmaW5kX21lbnUobWUtPmNtZGxpbmUpOworCSAgICByZWZzdHJfcHV0KG1lLT5jbWRsaW5lKTsKKwkgICAgbWUtPmNtZGxpbmUgPSBOVUxMOworCSAgICBpZiAobSkgeworCQltZS0+c3VibWVudSA9IG07CisJCW1lLT5hY3Rpb24tLTsJLyogRHJvcCB0aGUgX1VOUkVTICovCisJICAgIH0gZWxzZSB7CisJCW1lLT5hY3Rpb24gPSBNQV9ESVNBQkxFRDsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3ZvaWQgcGFyc2VfY29uZmlncyhjaGFyICoqYXJndikKK3sKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICBzdHJ1Y3QgbWVudSAqbTsKKyAgICBzdHJ1Y3QgbWVudV9lbnRyeSAqbWU7CisgICAgZHByaW50ZigiZW50ZXIiKTsKKworICAgIGVtcHR5X3N0cmluZyA9IHJlZnN0cmR1cCgiIik7CisKKyAgICAvKiBmZW5nOiByZXNldCBjdXJyZW50IG1lbnVfbGlzdCBhbmQgZW50cnkgbGlzdCAqLworICAgIG1lbnVfbGlzdCA9IE5VTEw7CisgICAgYWxsX2VudHJpZXMgPSBOVUxMOworCisgICAgLyogSW5pdGlhbGl6ZSBkZWZhdWx0cyBmb3IgdGhlIHJvb3QgYW5kIGhpZGRlbiBtZW51cyAqLworICAgIGhpZGVfbWVudSA9IG5ld19tZW51KE5VTEwsIE5VTEwsIHJlZnN0cmR1cCgiLmhpZGRlbiIpKTsKKyAgICByb290X21lbnUgPSBuZXdfbWVudShOVUxMLCBOVUxMLCByZWZzdHJkdXAoIi50b3AiKSk7CisgICAgc3RhcnRfbWVudSA9IHJvb3RfbWVudTsKKworICAgIC8qIE90aGVyIGluaXRpYWxpemF0aW9uICovCisgICAgbWVtc2V0KCZsZCwgMCwgc2l6ZW9mKHN0cnVjdCBsYWJlbGRhdGEpKTsKKworICAgIC8qIEFjdHVhbGx5IHByb2Nlc3MgdGhlIGZpbGVzICovCisgICAgY3VycmVudF9tZW51ID0gcm9vdF9tZW51OworCisgICAgaWYgKCFhcmd2IHx8ICEqYXJndikgeworCWlmIChwYXJzZV9tYWluX2NvbmZpZyhOVUxMKSA8IDApIHsKKwkgICAgcHJpbnRmKCJXQVJOSU5HOiBObyBjb25maWd1cmF0aW9uIGZpbGUgZm91bmRcbiIpOworCSAgICByZXR1cm47CisJfQorICAgIH0gZWxzZSB7CisJd2hpbGUgKChmaWxlbmFtZSA9ICphcmd2KyspKSB7CisJCWRwcmludGYoIlBhcnNpbmcgY29uZmlnOiAlcyIsIGZpbGVuYW1lKTsKKwkgICAgcGFyc2VfbWFpbl9jb25maWcoZmlsZW5hbWUpOworCX0KKyAgICB9CisKKyAgICAvKiBPbiBmaW5hbCBFT0YgcHJvY2VzcyB0aGUgbGFzdCBsYWJlbCBzdGF0ZW1lbnQgKi8KKyAgICByZWNvcmQoY3VycmVudF9tZW51LCAmbGQsIGFwcGVuZCk7CisKKyAgICAvKiBDb21tb24gcG9zdHByb2Nlc3NpbmcgKi8KKyAgICByZXNvbHZlX2dvdG9zKCk7CisKKyAgICAvKiBIYW5kbGUgZ2xvYmFsIGRlZmF1bHQgKi8KKyAgICAvL2lmIChoYXNfdWkgJiYgZ2xvYmFsZGVmYXVsdCkgeworICAgIGlmIChnbG9iYWxkZWZhdWx0KSB7CisJZHByaW50ZigiZ2xvYWJsZGVmYXVsdCA9ICVzIiwgZ2xvYmFsZGVmYXVsdCk7CisJbWUgPSBmaW5kX2xhYmVsKGdsb2JhbGRlZmF1bHQpOworCWlmIChtZSAmJiBtZS0+bWVudSAhPSBoaWRlX21lbnUpIHsKKwkgICAgbWUtPm1lbnUtPmRlZmVudHJ5ID0gbWUtPmVudHJ5OworCSAgICBzdGFydF9tZW51ID0gbWUtPm1lbnU7CisJICAgIGRlZmF1bHRfbWVudSA9IG1lLT5tZW51OworCX0KKyAgICB9CisKKyAgICAvKiBJZiAibWVudSBzYXZlIiBpcyBhY3RpdmUsIGxldCB0aGUgQURWIG92ZXJyaWRlIHRoZSBnbG9iYWwgZGVmYXVsdCAqLworICAgIGlmIChtZW51c2F2ZSkgeworCXNpemVfdCBsZW47CisJY29uc3QgY2hhciAqbGJsID0gc3lzbGludXhfZ2V0YWR2KEFEVl9NRU5VU0FWRSwgJmxlbik7CisJY2hhciAqbHN0cjsKKwlpZiAobGJsICYmIGxlbikgeworCSAgICBsc3RyID0gcmVmc3RyX2FsbG9jKGxlbik7CisJICAgIG1lbWNweShsc3RyLCBsYmwsIGxlbik7CS8qIHJlZnN0cl9hbGxvYygpIGFkZHMgdGhlIGZpbmFsIG51bGwgKi8KKwkgICAgbWUgPSBmaW5kX2xhYmVsKGxzdHIpOworCSAgICBpZiAobWUgJiYgbWUtPm1lbnUgIT0gaGlkZV9tZW51KSB7CisJCW1lLT5tZW51LT5kZWZlbnRyeSA9IG1lLT5lbnRyeTsKKwkJc3RhcnRfbWVudSA9IG1lLT5tZW51OworCSAgICB9CisJICAgIHJlZnN0cl9wdXQobHN0cik7CisJfQorICAgIH0KKworICAgIC8qIEZpbmFsIHBlci1tZW51IGluaXRpYWxpemF0aW9uLCB3aXRoIGFsbCBsYWJlbHMga25vd24gKi8KKyAgICBmb3IgKG0gPSBtZW51X2xpc3Q7IG07IG0gPSBtLT5uZXh0KSB7CisJbS0+Y3VyZW50cnkgPSBtLT5kZWZlbnRyeTsJLyogQWxsIG1lbnVzIHN0YXJ0IGF0IHRoZWlyIGRlZmF1bHRzICovCisKKwlpZiAobS0+b250aW1lb3V0KQorCSAgICBtLT5vbnRpbWVvdXQgPSB1bmxhYmVsKG0tPm9udGltZW91dCk7CisJaWYgKG0tPm9uZXJyb3IpCisJICAgIG0tPm9uZXJyb3IgPSB1bmxhYmVsKG0tPm9uZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9yZWZzdHIuYyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9yZWZzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQ5OGUxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZWxmbGluay9sZGxpbnV4L3JlZnN0ci5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHJlZnN0ci5jCisgKgorICogU2ltcGxlIHJlZmVyZW5jZS1jb3VudGVkIHN0cmluZ3MKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvbW9kdWxlLmg+CisjaW5jbHVkZSAicmVmc3RyLmgiCisKKy8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIHJlZnN0cmluZyBvZiBsZW4gYnl0ZXMsIHBsdXMgZmluYWwgbnVsbCAqLworLyogVGhlIGZpbmFsIG51bGwgaXMgaW5zZXJ0ZWQgaW4gdGhlIHN0cmluZzsgdGhlIHJlc3QgaXMgdW5pbml0aWFsaXplZC4gKi8KK2NoYXIgKnJlZnN0cl9hbGxvYyhzaXplX3QgbGVuKQoreworICAgIGNoYXIgKnIgPSBtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBsZW4gKyAxKTsKKyAgICBpZiAoIXIpCisJcmV0dXJuIE5VTEw7CisgICAgKih1bnNpZ25lZCBpbnQgKilyID0gMTsKKyAgICByICs9IHNpemVvZih1bnNpZ25lZCBpbnQpOworICAgIHJbbGVuXSA9ICdcMCc7CisgICAgcmV0dXJuIHI7Cit9CisKK2NvbnN0IGNoYXIgKnJlZnN0cm5kdXAoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKQoreworICAgIGNoYXIgKnI7CisKKyAgICBpZiAoIXN0cikKKwlyZXR1cm4gTlVMTDsKKworICAgIGxlbiA9IHN0cm5sZW4oc3RyLCBsZW4pOworICAgIHIgPSByZWZzdHJfYWxsb2MobGVuKTsKKyAgICBpZiAocikKKwltZW1jcHkociwgc3RyLCBsZW4pOworICAgIHJldHVybiByOworfQorCitjb25zdCBjaGFyICpyZWZzdHJkdXAoY29uc3QgY2hhciAqc3RyKQoreworICAgIGNoYXIgKnI7CisgICAgc2l6ZV90IGxlbjsKKworICAgIGlmICghc3RyKQorCXJldHVybiBOVUxMOworCisgICAgbGVuID0gc3RybGVuKHN0cik7CisgICAgciA9IHJlZnN0cl9hbGxvYyhsZW4pOworICAgIGlmIChyKQorCW1lbWNweShyLCBzdHIsIGxlbik7CisgICAgcmV0dXJuIHI7Cit9CisKK2ludCB2cnNwcmludGYoY29uc3QgY2hhciAqKmJ1ZnAsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgICB2YV9saXN0IGFwMTsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnA7CisKKyAgICB2YV9jb3B5KGFwMSwgYXApOworICAgIGxlbiA9IHZzbnByaW50ZihOVUxMLCAwLCBmbXQsIGFwMSk7CisgICAgdmFfZW5kKGFwMSk7CisKKyAgICAqYnVmcCA9IHAgPSByZWZzdHJfYWxsb2MobGVuKTsKKyAgICBpZiAoIXApCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHZzbnByaW50ZihwLCBsZW4gKyAxLCBmbXQsIGFwKTsKK30KKworaW50IHJzcHJpbnRmKGNvbnN0IGNoYXIgKipidWZwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBpbnQgcnY7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHJ2ID0gdnJzcHJpbnRmKGJ1ZnAsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisKKyAgICByZXR1cm4gcnY7Cit9CisKK3ZvaWQgcmVmc3RyX3B1dChjb25zdCBjaGFyICpyKQoreworICAgIHVuc2lnbmVkIGludCAqcmVmOworCisgICAgaWYgKHIpIHsKKwlyZWYgPSAodW5zaWduZWQgaW50ICopciAtIDE7CisKKwlpZiAoIS0tKnJlZikKKwkgICAgZnJlZShyZWYpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9zZXRhZHYuYyBiL2NvbTMyL2VsZmxpbmsvbGRsaW51eC9zZXRhZHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTM4NjIxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZWxmbGluay9sZGxpbnV4L3NldGFkdi5jCkBAIC0wLDAgKzEsMTE2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbGludXgvc2V0YWR2LmMKKyAqCisgKiAoT3Zlcil3cml0ZSBhIGRhdGEgaXRlbSBpbiB0aGUgYXV4aWxsaWFyeSBkYXRhIHZlY3Rvci4gIFRvCisgKiBkZWxldGUgYW4gaXRlbSwgc2V0IGl0cyBsZW5ndGggdG8gemVyby4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciwgYW5kIHNldCBlcnJuby4KKyAqCisgKiBOT1RFOiBEYXRhIGlzIG5vdCB3cml0dGVuIHRvIGRpc2sgdW5sZXNzCisgKiBzeXNsaW51eF9hZHZfd3JpdGUoKSBpcyBjYWxsZWQuCisgKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L2Fkdi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFsbG9jYS5oPgorCitfX2V4cG9ydCBpbnQgc3lzbGludXhfc2V0YWR2KGludCB0YWcsIHNpemVfdCBzaXplLCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIHVpbnQ4X3QgKnAsICphZHZ0bXA7CisgICAgc2l6ZV90IHJsZWZ0LCBsZWZ0OworCisgICAgaWYgKCh1bnNpZ25lZCl0YWcgLSAxID4gMjU0KSB7CisJZXJybm8gPSBFSU5WQUw7CisJcmV0dXJuIC0xOwkJLyogSW1wb3NzaWJsZSB0YWcgdmFsdWUgKi8KKyAgICB9CisKKyAgICBpZiAoc2l6ZSA+IDI1NSkgeworCWVycm5vID0gRU5PU1BDOwkJLyogTWF4IDI1NSBieXRlcyBmb3IgYSBkYXRhIGl0ZW0gKi8KKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgcmxlZnQgPSBsZWZ0ID0gc3lzbGludXhfYWR2X3NpemUoKTsKKyAgICBwID0gYWR2dG1wID0gYWxsb2NhKGxlZnQpOworICAgIG1lbWNweShwLCBzeXNsaW51eF9hZHZfcHRyKCksIGxlZnQpOwkvKiBNYWtlIHdvcmtpbmcgY29weSAqLworCisgICAgd2hpbGUgKHJsZWZ0ID49IDIpIHsKKwl1aW50OF90IHB0YWcgPSBwWzBdOworCXNpemVfdCBwbGVuID0gcFsxXSArIDI7CisKKwlpZiAocHRhZyA9PSBBRFZfRU5EKQorCSAgICBicmVhazsKKworCWlmIChwdGFnID09IHRhZykgeworCSAgICAvKiBGb3VuZCBvdXIgdGFnLiAgRGVsZXRlIGl0LiAqLworCisJICAgIGlmIChwbGVuID49IHJsZWZ0KSB7CisJCS8qIEVudGlyZSByZW1haW5kZXIgaXMgb3VyIHRhZyAqLworCQlicmVhazsKKwkgICAgfQorCSAgICBtZW1tb3ZlKHAsIHAgKyBwbGVuLCBybGVmdCAtIHBsZW4pOworCSAgICBybGVmdCAtPSBwbGVuOwkvKiBGZXdlciBieXRlcyB0byByZWFkLCBidXQgbm90IHRvIHdyaXRlICovCisJfSBlbHNlIHsKKwkgICAgLyogTm90IG91ciB0YWcgKi8KKwkgICAgaWYgKHBsZW4gPiBybGVmdCkKKwkJYnJlYWs7CQkvKiBDb3JydXB0IHRhZyAob3ZlcnJ1bikgLSBvdmVyd3JpdGUgaXQgKi8KKworCSAgICBsZWZ0IC09IHBsZW47CisJICAgIHJsZWZ0IC09IHBsZW47CisJICAgIHAgKz0gcGxlbjsKKwl9CisgICAgfQorCisgICAgLyogTm93IChwLCBsZWZ0KSByZWZsZWN0cyB0aGUgcG9zaXRpb24gdG8gd3JpdGUgaW4gYW5kIGhvdyBtdWNoIHNwYWNlCisgICAgICAgd2UgaGF2ZSBmb3Igb3VyIGRhdGEuICovCisKKyAgICBpZiAoc2l6ZSkgeworCWlmIChsZWZ0IDwgc2l6ZSArIDIpIHsKKwkgICAgZXJybm8gPSBFTk9TUEM7CS8qIE5vdCBlbm91Z2ggc3BhY2UgZm9yIGRhdGEgKi8KKwkgICAgcmV0dXJuIC0xOworCX0KKworCSpwKysgPSB0YWc7CisJKnArKyA9IHNpemU7CisJbWVtY3B5KHAsIGRhdGEsIHNpemUpOworCXAgKz0gc2l6ZTsKKwlsZWZ0IC09IHNpemUgKyAyOworICAgIH0KKworICAgIG1lbXNldChwLCAwLCBsZWZ0KTsKKworICAgIC8qIElmIHdlIGdvdCBoZXJlLCBldmVyeXRoaW5nIHdlbnQgT0ssIGNvbW1pdCB0aGUgd3JpdGUgdG8gbG93IG1lbW9yeSAqLworICAgIG1lbWNweShzeXNsaW51eF9hZHZfcHRyKCksIGFkdnRtcCwgc3lzbGludXhfYWR2X3NpemUoKSk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2VsZmxpbmsvdGVzdF9jb20zMi5jIGIvY29tMzIvZWxmbGluay90ZXN0X2NvbTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwODlkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2VsZmxpbmsvdGVzdF9jb20zMi5jCkBAIC0wLDAgKzEsMjA4IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxzeXMvbW9kdWxlLmg+CisjaW5jbHVkZSA8c3lzL2V4ZWMuaD4KKworI2RlZmluZSBJTkZPX1BSSU5UKGZtdCwgYXJncy4uLikJcHJpbnRmKCJbQ09NMzJdICIgZm10LCAjI2FyZ3MpCisKKyNkZWZpbmUgTUFYX0NPTU1BTkRfU0laRSAJODAJLy8gTWF4aW11bSBzaXplIG9mIHRoZSBjbWQgbGluZQorI2RlZmluZSBDT01NQU5EX0RFTElNCQkiIFx0XG4iCS8vIFdoaXRlc3BhY2UgZGVsaW1pdGVycworI2RlZmluZSBNQVhfQ09NTUFORF9BUkdTCShNQVhfQ09NTUFORF9TSVpFLzIpCS8vIE1heGltdW0gYXJndW1lbnQgY291bnQgZm9yCisJCQkJCQkJCQkJCQkgLy8gcHJvZ3JhbSBleGVjdXRpb24KKworLyoqCisgKiBwcmludF9oZWxwIC0gRGlzcGxheSB1c2FnZSBpbnN0cnVjdGlvbnMgb24gdGhlIHNjcmVlbi4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworICAgIHByaW50ZigiTGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHM6XG4iKTsKKyAgICBwcmludGYoImV4aXQgLSBleGl0cyB0aGUgcHJvZ3JhbVxuIik7CisgICAgcHJpbnRmKCJoZWxwIC0gc2hvd3MgdGhpcyBtZXNzYWdlXG4iKTsKKyAgICBwcmludGYoImxvYWQgPGxpYnJhcnk+Li4uIC0gbG9hZHMgdGhlIGxpYnJhcmllcyBpbnRvIHRoZSBlbnZpcm9ubWVudFxuIik7CisgICAgcHJpbnRmKCJzcGF3biA8ZXhlY3V0YWJsZT4gPGFyZ3M+IC0gbGF1bmNoZXMgYW4gZXhlY3V0YWJsZSBtb2R1bGVcbiIpOworICAgIHByaW50ZgorCSgidW5sb2FkIDxsaWJyYXJ5Pi4uLiAtIHVubG9hZHMgdGhlIGxpYnJhcmllcyBmcm9tIHRoZSBlbnZpcm9ubWVudFxuIik7CisgICAgcHJpbnRmKCJsaXN0IC0gcHJpbnRzIHRoZSBjdXJyZW50bHkgbG9hZGVkIG1vZHVsZXNcbiIpOworfQorCisvKioKKyAqIHByaW50X3Byb21wdCAtIERpc3BsYXkgdGhlIGNvbW1hbmQgcHJvbXB0LgorICovCitzdGF0aWMgdm9pZCBwcmludF9wcm9tcHQodm9pZCkKK3sKKyAgICBwcmludGYoIlxuZWxmbGluaz4gIik7Cit9CisKKy8qKgorICogcmVhZF9jb21tYW5kIC0gUmVhZCBhIG5ldyBjb21tYW5kIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LgorICogQGNtZDogdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgY29tbWFuZAorICogQHNpemU6IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHN0cmluZyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gdGhlIGJ1ZmZlcgorICoKKyAqIElmIHRoZSBjb21tYW5kIGlzIGxhcmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgc2l6ZSwgaXQgaXMgdHJ1bmNhdGVkLgorICovCitzdGF0aWMgdm9pZCByZWFkX2NvbW1hbmQoY2hhciAqY21kLCBpbnQgc2l6ZSkKK3sKKyAgICBjaGFyICpubCA9IE5VTEw7CisgICAgZmdldHMoY21kLCBzaXplLCBzdGRpbik7CisKKyAgICAvLyBTdHJpcCB0aGUgbmV3bGluZQorICAgIG5sID0gc3RyY2hyKGNtZCwgJ1xuJyk7CisKKyAgICBpZiAobmwgIT0gTlVMTCkKKwkqbmwgPSAnXDAnOworfQorCisvKioKKyAqIHByb2Nlc3Nfc3Bhd24gLSBIYW5kbGVzIHRoZSBleGVjdXRpb24gb2YgYSAnc3Bhd24nIGNvbW1hbmQuCisgKgorICogVGhlIGNvbW1hbmQgbGluZSBpcyBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIG9mIHN0cnRvay4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19zcGF3bih2b2lkKQoreworICAgIC8vIENvbXBvc2UgdGhlIGNvbW1hbmQgbGluZQorICAgIGNoYXIgKipjbWRfbGluZSA9IG1hbGxvYygoTUFYX0NPTU1BTkRfQVJHUyArIDEpICogc2l6ZW9mKGNoYXIgKikpOworICAgIGludCBhcmdjID0gMCwgcmVzdWx0OworICAgIGNoYXIgKmNydF9hcmc7CisKKyAgICBkbyB7CisJY3J0X2FyZyA9IHN0cnRvayhOVUxMLCBDT01NQU5EX0RFTElNKTsKKwlpZiAoY3J0X2FyZyAhPSBOVUxMICYmIHN0cmxlbihjcnRfYXJnKSA+IDApIHsKKwkgICAgY21kX2xpbmVbYXJnY10gPSBjcnRfYXJnOworCSAgICBhcmdjKys7CisJfSBlbHNlIHsKKwkgICAgYnJlYWs7CisJfQorICAgIH0gd2hpbGUgKGFyZ2MgPCBNQVhfQ09NTUFORF9BUkdTKTsKKworICAgIGNtZF9saW5lW2FyZ2NdID0gTlVMTDsKKworICAgIGlmIChjbWRfbGluZVswXSA9PSBOVUxMKSB7CisJcHJpbnRmKCJZb3UgbXVzdCBzcGVjaWZ5IGFuIGV4ZWN1dGFibGUgbW9kdWxlLlxuIik7CisgICAgfSBlbHNlIHsKKwlyZXN1bHQgPSBzcGF3bnYoY21kX2xpbmVbMF0sIGNtZF9saW5lKTsKKworCXByaW50ZigiU3Bhd24gcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisgICAgfQorCisgICAgZnJlZShjbWRfbGluZSk7Cit9CisKKy8qKgorICogcHJvY2Vzc19saWJyYXJ5IC0gSGFuZGxlcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSAnbG9hZCcgYW5kICd1bmxvYWQnIGNvbW1hbmRzLgorICogQGxvYWQ6IGNvbnRhaW5zIDEgaWYgdGhlIGxpYnJhcmllcyBhcmUgdG8gYmUgbG9hZGVkLCAwIGZvciB1bmxvYWRpbmcuCisgKgorICogVGhlIGNvbW1hbmQgbGluZSBpcyBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIG9mIHN0cnRvay4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19saWJyYXJ5KGludCBsb2FkKQoreworICAgIGNoYXIgKmNydF9saWI7CisgICAgaW50IHJlc3VsdDsKKworICAgIHdoaWxlICgoY3J0X2xpYiA9IHN0cnRvayhOVUxMLCBDT01NQU5EX0RFTElNKSkgIT0gTlVMTCkgeworCWlmIChzdHJsZW4oY3J0X2xpYikgPiAwKSB7CisJICAgIGlmIChsb2FkKQorCQlyZXN1bHQgPSBsb2FkX2xpYnJhcnkoY3J0X2xpYik7CisJICAgIGVsc2UKKwkJcmVzdWx0ID0gdW5sb2FkX2xpYnJhcnkoY3J0X2xpYik7CisKKwkgICAgaWYgKHJlc3VsdCA9PSAwKSB7CisJCXByaW50ZigiTGlicmFyeSAnJXMnICVzbG9hZGVkIHN1Y2Nlc3NmdWxseS5cbiIsIGNydF9saWIsCisJCSAgICAgICBsb2FkID8gIiIgOiAidW4iKTsKKwkgICAgfSBlbHNlIHsKKwkJcHJpbnRmKCJDb3VsZCBub3QgJXNsb2FkIGxpYnJhcnkgJyVzJzogZXJyb3IgJWRcbiIsCisJCSAgICAgICBsb2FkID8gIiIgOiAidW4iLCBjcnRfbGliLCByZXN1bHQpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoqCisgKiBwcm9jZXNzX2xpc3QgLSBIYW5kbGVzIHRoZSBleGVjdXRpb24gb2YgdGhlICdsaXN0JyBjb21tYW5kLgorICoKKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19saXN0KHZvaWQpCit7CisgICAgc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZTsKKyAgICBzdHJ1Y3QgbW9kdWxlX2RlcCAqY3J0X2RlcDsKKworICAgIGZvcl9lYWNoX21vZHVsZShtb2R1bGUpIHsKKwlwcmludGYoIiVzICglZEssICVzLCAlcykgOiAiLCBtb2R1bGUtPm5hbWUsIG1vZHVsZS0+bW9kdWxlX3NpemUgPj4gMTAsCisJICAgICAgIG1vZHVsZS0+c2hhbGxvdyA/ICJzaGFsbG93IiA6ICJyZWd1bGFyIiwKKwkgICAgICAgbW9kdWxlLT5tYWluX2Z1bmMgPT0gTlVMTCA/ICJsaWJyYXJ5IiA6ICJwcm9ncmFtIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydF9kZXAsICZtb2R1bGUtPnJlcXVpcmVkLCBsaXN0KSB7CisJICAgIHByaW50ZigiJXMgIiwgY3J0X2RlcC0+bW9kdWxlLT5uYW1lKTsKKwl9CisKKwlwcmludGYoIlxuIik7CisgICAgfQorfQorCisvKioKKyAqIHByb2Nlc3NfY29tbWFuZCAtIFJlY29nbml6ZXMgdGhlIHJlcXVlc3RlZCBjb21tYW5kIGFuZCBleGVjdXRlcyBpdC4KKyAqIEBjbWQ6IHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgY29tbWFuZCB3YXMgJ2V4aXQnLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBwcm9jZXNzX2NvbW1hbmQoY2hhciAqY21kKQoreworICAgIGNoYXIgKmNtZF9uYW1lOworCisgICAgY21kX25hbWUgPSBzdHJ0b2soY21kLCBDT01NQU5EX0RFTElNKTsKKworICAgIGlmIChzdHJjbXAoY21kX25hbWUsICJleGl0IikgPT0gMCkgeworCXByaW50ZigiR29vZGJ5ZSFcbiIpOworCXJldHVybiAxOworICAgIH0gZWxzZSBpZiAoc3RyY21wKGNtZF9uYW1lLCAiaGVscCIpID09IDApIHsKKwlwcmludF9oZWxwKCk7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoY21kX25hbWUsICJsb2FkIikgPT0gMCkgeworCXByb2Nlc3NfbGlicmFyeSgxKTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChjbWRfbmFtZSwgInNwYXduIikgPT0gMCkgeworCXByb2Nlc3Nfc3Bhd24oKTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChjbWRfbmFtZSwgInVubG9hZCIpID09IDApIHsKKwlwcm9jZXNzX2xpYnJhcnkoMCk7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoY21kX25hbWUsICJsaXN0IikgPT0gMCkgeworCXByb2Nlc3NfbGlzdCgpOworICAgIH0gZWxzZSB7CisJcHJpbnRmKCJVbmtub3duIGNvbW1hbmQuIFR5cGUgJ2hlbHAnIGZvciBhIGxpc3Qgb2YgdmFsaWQgY29tbWFuZHMuXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGUgZW50cnkgcG9pbnQgb2YgJ3Rlc3RfY29tMzInIENPTSBtb2R1bGUuCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgZG9uZSA9IDA7CisgICAgaW50IHJlczsKKyAgICBjaGFyIGNvbW1hbmRbTUFYX0NPTU1BTkRfU0laRV0gPSB7IDAgfTsKKworICAgIC8vIE9wZW4gYSBzdGFuZGFyZCByL3cgY29uc29sZQorICAgIG9wZW5jb25zb2xlKCZkZXZfc3RkY29uX3IsICZkZXZfc3RkY29uX3cpOworCisgICAgcmVzID0gZXhlY19pbml0KCk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisJcHJpbnRmKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuIik7CisJcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworCXByaW50ZigiRXhlY3V0aW9uIGVudmlyb25tZW50IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS5cbiIpOworICAgIH0KKworICAgIHByaW50ZigiXG5Gb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcywgdHlwZSAnaGVscCcuXG4iKTsKKworICAgIGRvIHsKKwlwcmludF9wcm9tcHQoKTsKKwlyZWFkX2NvbW1hbmQoY29tbWFuZCwgTUFYX0NPTU1BTkRfU0laRSk7CisJZG9uZSA9IHByb2Nlc3NfY29tbWFuZChjb21tYW5kKTsKKworICAgIH0gd2hpbGUgKCFkb25lKTsKKworICAgIGV4ZWNfdGVybSgpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9nZGJzdHViL01ha2VmaWxlIGIvY29tMzIvZ2Ric3R1Yi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQwMDNjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ2Ric3R1Yi9NYWtlZmlsZQpAQCAtMCwwICsxLDUwIEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyMjICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMjIEdEQiByZW1vdGUgZGVidWdnaW5nCisjIworCit0b3BkaXIgPSAuLi8uLgorTUFLRURJUiA9ICQodG9wZGlyKS9taworaW5jbHVkZSAkKE1BS0VESVIpL2NvbTMyLm1rCisKK0NGTEFHUyArPSAtZlBJRQorCitMSUJTCSAgID0gLi4vbGlidXRpbC9saWJ1dGlsX2NvbS5hIC4uL2xpYi9saWJjb20zMi5hICQoTElCR0NDKQorTE5YTElCUwkgICA9IC4uL2xpYnV0aWwvbGlidXRpbF9sbnguYQorCitNT0RVTEVTCSAgPSBnZGJzdHViLmMzMgorVEVTVEZJTEVTID0KKworT0JKUyA9IG1haW4ubyBpbnQubyBzZXJpYWwubyBnZGJzdHViLm8KKworYWxsOiAkKE1PRFVMRVMpICQoVEVTVEZJTEVTKQorCitnZGJzdHViLmVsZiA6ICQoT0JKUykgJChMSUJTKSAkKENfTElCUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICReCisKK3RpZHkgZGlzdCBjbGVhbjoKKwlybSAtZiAqLm8gKi5sbyAqLmEgKi5sc3QgKi5lbGYgLiouZCAqLnRtcAorCitjbGVhbjogdGlkeQorCXJtIC1mICoubG54CisKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICoubHNzICouYzMyICouY29tCisJcm0gLWYgKn4gXCMqCisKK2luc3RhbGw6CisJbWtkaXIgLW0gNzU1IC1wICQoSU5TVEFMTFJPT1QpJChBVVhESVIpCisJaW5zdGFsbCAtbSA2NDQgJChNT0RVTEVTKSAkKElOU1RBTExST09UKSQoQVVYRElSKQorCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS9jb20zMi9nZGJzdHViL2dkYnN0dWIuYyBiL2NvbTMyL2dkYnN0dWIvZ2Ric3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTlhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9nZGJzdHViL2dkYnN0dWIuYwpAQCAtMCwwICsxLDU2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTdGVmYW4gSGFqbm9jemkgPHN0ZWZhbmhhQGdtYWlsLmNvbT4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qKgorICogQGZpbGUKKyAqCisgKiBHREIgc3R1YiBmb3IgcmVtb3RlIGRlYnVnZ2luZworICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAic2VyaWFsLmgiCisKK3R5cGVkZWYgdWludDMyX3QgZ2RicmVnX3Q7CisKK2VudW0geworICAgIFBPU0lYX0VJTlZBTCA9IDB4MWMsCS8qIHVzZWQgdG8gcmVwb3J0IGJhZCBhcmd1bWVudHMgdG8gR0RCICovCisgICAgU0laRU9GX1BBWUxPQUQgPSAyNTYsCS8qIGJ1ZmZlciBzaXplIG9mIEdEQiBwYXlsb2FkIGRhdGEgKi8KKyAgICBEUjdfQ0xFQVIgPSAweDAwMDAwNDAwLAkvKiBkaXNhYmxlIGhhcmR3YXJlIGJyZWFrcG9pbnRzICovCisgICAgRFI2X0NMRUFSID0gMHhmZmZmMGZmMCwJLyogY2xlYXIgYnJlYWtwb2ludCBzdGF0dXMgKi8KK307CisKKy8qIFRoZSByZWdpc3RlciBzbmFwc2hvdCwgdGhpcyBtdXN0IGJlIGluIHN5bmMgd2l0aCBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdGhlCisgKiBHREIgcHJvdG9jb2wuICovCitlbnVtIHsKKyAgICBHREJNQUNIX0VBWCwKKyAgICBHREJNQUNIX0VDWCwKKyAgICBHREJNQUNIX0VEWCwKKyAgICBHREJNQUNIX0VCWCwKKyAgICBHREJNQUNIX0VTUCwKKyAgICBHREJNQUNIX0VCUCwKKyAgICBHREJNQUNIX0VTSSwKKyAgICBHREJNQUNIX0VESSwKKyAgICBHREJNQUNIX0VJUCwKKyAgICBHREJNQUNIX0VGTEFHUywKKyAgICBHREJNQUNIX0NTLAorICAgIEdEQk1BQ0hfU1MsCisgICAgR0RCTUFDSF9EUywKKyAgICBHREJNQUNIX0VTLAorICAgIEdEQk1BQ0hfRlMsCisgICAgR0RCTUFDSF9HUywKKyAgICBHREJNQUNIX05SRUdTLAorICAgIEdEQk1BQ0hfU0laRU9GX1JFR1MgPSBHREJNQUNIX05SRUdTICogc2l6ZW9mKGdkYnJlZ190KQorfTsKKworLyogQnJlYWtwb2ludCB0eXBlcyAqLworZW51bSB7CisgICAgR0RCTUFDSF9CUE1FTSwKKyAgICBHREJNQUNIX0JQSFcsCisgICAgR0RCTUFDSF9XQVRDSCwKKyAgICBHREJNQUNIX1JXQVRDSCwKKyAgICBHREJNQUNIX0FXQVRDSCwKK307CisKK3N0cnVjdCBnZGJzdHViIHsKKyAgICBpbnQgZXhpdF9oYW5kbGVyOwkJLyogbGVhdmUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKworICAgIGludCBzaWdubzsKKyAgICBnZGJyZWdfdCAqcmVnczsKKworICAgIHZvaWQgKCpwYXJzZSkgKHN0cnVjdCBnZGJzdHViICogc3R1YiwgY2hhciBjaCk7CisgICAgdWludDhfdCBja3N1bTE7CisKKyAgICAvKiBCdWZmZXIgZm9yIHBheWxvYWQgZGF0YSB3aGVuIHBhcnNpbmcgYSBwYWNrZXQuICBPbmNlIHRoZQorICAgICAqIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCwgdGhpcyBidWZmZXIgaXMgdXNlZCB0byBob2xkCisgICAgICogdGhlIHJlcGx5IHBheWxvYWQuICovCisgICAgY2hhciBidWZbU0laRU9GX1BBWUxPQUQgKyA0XTsJLyogJC4uLlBBWUxPQUQuLi4jWFggKi8KKyAgICBjaGFyICpwYXlsb2FkOwkJLyogc3RhcnQgb2YgcGF5bG9hZCAqLworICAgIGludCBsZW47CQkJLyogbGVuZ3RoIG9mIHBheWxvYWQgKi8KK307CisKKy8qKiBIYXJkd2FyZSBicmVha3BvaW50LCBmaWVsZHMgc3RvcmVkIGluIHg4NiBiaXQgcGF0dGVybiBmb3JtICovCitzdHJ1Y3QgaHdicCB7CisgICAgaW50IHR5cGU7CQkJLyogdHlwZSAoMT13cml0ZSB3YXRjaHBvaW50LCAzPWFjY2VzcyB3YXRjaHBvaW50KSAqLworICAgIHVuc2lnbmVkIGxvbmcgYWRkcjsJCS8qIGxpbmVhciBhZGRyZXNzICovCisgICAgc2l6ZV90IGxlbjsJCQkvKiBsZW5ndGggKDA9MS1ieXRlLCAxPTItYnl0ZSwgMz00LWJ5dGUpICovCisgICAgaW50IGVuYWJsZWQ7Cit9OworCitzdGF0aWMgc3RydWN0IGh3YnAgaHdicHNbNF07CitzdGF0aWMgZ2RicmVnX3QgZHI3ID0gRFI3X0NMRUFSOworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2RibWFjaF9zZXRfcGMoZ2RicmVnX3QgKiByZWdzLCBnZGJyZWdfdCBwYykKK3sKKyAgICByZWdzW0dEQk1BQ0hfRUlQXSA9IHBjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2RibWFjaF9zZXRfc2luZ2xlX3N0ZXAoZ2RicmVnX3QgKiByZWdzLCBpbnQgc3RlcCkKK3sKKyAgICByZWdzW0dEQk1BQ0hfRUZMQUdTXSAmPSB+KDEgPDwgOCk7CS8qIFRyYWNlIEZsYWcgKFRGKSAqLworICAgIHJlZ3NbR0RCTUFDSF9FRkxBR1NdIHw9IChzdGVwIDw8IDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2RibWFjaF9icmVha3BvaW50KHZvaWQpCit7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImludCAkM1xuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdicCAqZ2RibWFjaF9maW5kX2h3YnAoaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbikKK3sKKyAgICBzdHJ1Y3QgaHdicCAqYXZhaWxhYmxlID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIGh3YnBzIC8gc2l6ZW9mIGh3YnBzWzBdOyBpKyspIHsKKwlpZiAoaHdicHNbaV0udHlwZSA9PSB0eXBlICYmIGh3YnBzW2ldLmFkZHIgPT0gYWRkcgorCSAgICAmJiBod2Jwc1tpXS5sZW4gPT0gbGVuKSB7CisJICAgIHJldHVybiAmaHdicHNbaV07CisJfQorCWlmICghaHdicHNbaV0uZW5hYmxlZCkgeworCSAgICBhdmFpbGFibGUgPSAmaHdicHNbaV07CisJfQorICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlOworfQorCitzdGF0aWMgdm9pZCBnZGJtYWNoX2NvbW1pdF9od2JwKHN0cnVjdCBod2JwICpicCkKK3sKKyAgICBpbnQgcmVnbnVtID0gYnAgLSBod2JwczsKKworICAgIC8qIFNldCBicmVha3BvaW50IGFkZHJlc3MgKi8KKyAgICBzd2l0Y2ggKHJlZ251bSkgeworICAgIGNhc2UgMDoKK19fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUwLCAlJWRyMFxuIjogOiJyIihicC0+YWRkcikpOworCWJyZWFrOworICAgIGNhc2UgMToKK19fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUwLCAlJWRyMVxuIjogOiJyIihicC0+YWRkcikpOworCWJyZWFrOworICAgIGNhc2UgMjoKK19fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUwLCAlJWRyMlxuIjogOiJyIihicC0+YWRkcikpOworCWJyZWFrOworICAgIGNhc2UgMzoKK19fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUwLCAlJWRyM1xuIjogOiJyIihicC0+YWRkcikpOworCWJyZWFrOworICAgIH0KKworICAgIC8qIFNldCB0eXBlICovCisgICAgZHI3ICY9IH4oMHgzIDw8ICgxNiArIDQgKiByZWdudW0pKTsKKyAgICBkcjcgfD0gYnAtPnR5cGUgPDwgKDE2ICsgNCAqIHJlZ251bSk7CisKKyAgICAvKiBTZXQgbGVuZ3RoICovCisgICAgZHI3ICY9IH4oMHgzIDw8ICgxOCArIDQgKiByZWdudW0pKTsKKyAgICBkcjcgfD0gYnAtPmxlbiA8PCAoMTggKyA0ICogcmVnbnVtKTsKKworICAgIC8qIFNldC9jbGVhciBsb2NhbCBlbmFibGUgYml0ICovCisgICAgZHI3ICY9IH4oMHgzIDw8IDIgKiByZWdudW0pOworICAgIGRyNyB8PSBicC0+ZW5hYmxlZCA8PCAyICogcmVnbnVtOworfQorCitpbnQgZ2RibWFjaF9zZXRfYnJlYWtwb2ludChpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgbGVuLCBpbnQgZW5hYmxlKQoreworICAgIHN0cnVjdCBod2JwICpicDsKKworICAgIC8qIENoZWNrIGFuZCBjb252ZXJ0IGJyZWFrcG9pbnQgdHlwZSB0byB4ODYgdHlwZSAqLworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR0RCTUFDSF9XQVRDSDoKKwl0eXBlID0gMHgxOworCWJyZWFrOworICAgIGNhc2UgR0RCTUFDSF9BV0FUQ0g6CisJdHlwZSA9IDB4MzsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXJldHVybiAwOwkJLyogdW5zdXBwb3J0ZWQgYnJlYWtwb2ludCB0eXBlICovCisgICAgfQorCisgICAgLyogT25seSBsZW5ndGhzIDEsIDIsIGFuZCA0IGFyZSBzdXBwb3J0ZWQgKi8KKyAgICBpZiAobGVuICE9IDIgJiYgbGVuICE9IDQpIHsKKwlsZW4gPSAxOworICAgIH0KKyAgICBsZW4tLTsJCQkvKiBjb252ZXJ0IHRvIHg4NiBicmVha3BvaW50IGxlbmd0aCBiaXQgcGF0dGVybiAqLworCisgICAgLyogU2V0IHVwIHRoZSBicmVha3BvaW50ICovCisgICAgYnAgPSBnZGJtYWNoX2ZpbmRfaHdicCh0eXBlLCBhZGRyLCBsZW4pOworICAgIGlmICghYnApIHsKKwlyZXR1cm4gMDsJCS8qIHJhbiBvdXQgb2YgaGFyZHdhcmUgYnJlYWtwb2ludHMgKi8KKyAgICB9CisgICAgYnAtPnR5cGUgPSB0eXBlOworICAgIGJwLT5hZGRyID0gYWRkcjsKKyAgICBicC0+bGVuID0gbGVuOworICAgIGJwLT5lbmFibGVkID0gZW5hYmxlOworICAgIGdkYm1hY2hfY29tbWl0X2h3YnAoYnApOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBnZGJtYWNoX2Rpc2FibGVfaHdicHModm9pZCkKK3sKKyAgICAvKiBTdG9yZSBhbmQgY2xlYXIgaGFyZHdhcmUgYnJlYWtwb2ludHMgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlMCwgJSVkcjdcbiI6OiJyIihEUjdfQ0xFQVIpKTsKK30KKworc3RhdGljIHZvaWQgZ2RibWFjaF9lbmFibGVfaHdicHModm9pZCkKK3sKKyAgICAvKiBDbGVhciBicmVha3BvaW50IHN0YXR1cyByZWdpc3RlciAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUwLCAlJWRyNlxuIjo6InIiKERSNl9DTEVBUikpOworCisgICAgLyogUmVzdG9yZSBoYXJkd2FyZSBicmVha3BvaW50cyAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUwLCAlJWRyN1xuIjo6InIiKGRyNykpOworfQorCisvKiBQYWNrZXQgcGFyc2VyIHN0YXRlcyAqLworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zdGF0ZV9uZXcoc3RydWN0IGdkYnN0dWIgKnN0dWIsIGNoYXIgY2gpOworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zdGF0ZV9kYXRhKHN0cnVjdCBnZGJzdHViICpzdHViLCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkIGdkYnN0dWJfc3RhdGVfY2tzdW0xKHN0cnVjdCBnZGJzdHViICpzdHViLCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkIGdkYnN0dWJfc3RhdGVfY2tzdW0yKHN0cnVjdCBnZGJzdHViICpzdHViLCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkIGdkYnN0dWJfc3RhdGVfd2FpdF9hY2soc3RydWN0IGdkYnN0dWIgKnN0dWIsIGNoYXIgY2gpOworCitzdGF0aWMgdm9pZCBzZXJpYWxfd3JpdGUodm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNoYXIgKnAgPSBidWY7CisgICAgd2hpbGUgKGxlbi0tID4gMCkKKwlzZXJpYWxfcHV0YygqcCsrKTsKK30KKworc3RhdGljIHVpbnQ4X3QgZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChjaGFyIGNoKQoreworICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorCXJldHVybiBjaCAtICcwJzsKKyAgICBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorCXJldHVybiBjaCAtICdBJyArIDB4YTsKKyAgICBlbHNlCisJcmV0dXJuIChjaCAtICdhJyArIDB4YSkgJiAweGY7Cit9CisKK3N0YXRpYyB1aW50OF90IGdkYnN0dWJfdG9faGV4X2RpZ2l0KHVpbnQ4X3QgYikKK3sKKyAgICBiICY9IDB4ZjsKKyAgICByZXR1cm4gKGIgPCAweGEgPyAnMCcgOiAnYScgLSAweGEpICsgYjsKK30KKworLyoKKyAqIFRvIG1ha2UgcmVhZGluZy93cml0aW5nIGRldmljZSBtZW1vcnkgYXRvbWljLCB3ZSBjaGVjayBmb3IKKyAqIDItIG9yIDQtYnl0ZSBhbGlnbmVkIG9wZXJhdGlvbnMgYW5kIGhhbmRsZSB0aGVtIHNwZWNpYWxseS4KKyAqLworCitzdGF0aWMgdm9pZCBnZGJzdHViX2Zyb21faGV4X2J1ZihjaGFyICpkc3QsIGNoYXIgKnNyYywgaW50IGxlbmJ5dGVzKQoreworICAgIGlmIChsZW5ieXRlcyA9PSAyICYmICgodW5zaWduZWQgbG9uZylkc3QgJiAweDEpID09IDApIHsKKwl1aW50MTZfdCBpID0gZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChzcmNbMl0pIDw8IDEyIHwKKwkgICAgZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChzcmNbM10pIDw8IDggfAorCSAgICBnZGJzdHViX2Zyb21faGV4X2RpZ2l0KHNyY1swXSkgPDwgNCB8CisJICAgIGdkYnN0dWJfZnJvbV9oZXhfZGlnaXQoc3JjWzFdKTsKKwkqKHVpbnQxNl90ICopIGRzdCA9IGk7CisgICAgfSBlbHNlIGlmIChsZW5ieXRlcyA9PSA0ICYmICgodW5zaWduZWQgbG9uZylkc3QgJiAweDMpID09IDApIHsKKwl1aW50MzJfdCBpID0gZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChzcmNbNl0pIDw8IDI4IHwKKwkgICAgZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChzcmNbN10pIDw8IDI0IHwKKwkgICAgZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChzcmNbNF0pIDw8IDIwIHwKKwkgICAgZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChzcmNbNV0pIDw8IDE2IHwKKwkgICAgZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChzcmNbMl0pIDw8IDEyIHwKKwkgICAgZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChzcmNbM10pIDw8IDggfAorCSAgICBnZGJzdHViX2Zyb21faGV4X2RpZ2l0KHNyY1swXSkgPDwgNCB8CisJICAgIGdkYnN0dWJfZnJvbV9oZXhfZGlnaXQoc3JjWzFdKTsKKwkqKHVpbnQzMl90ICopIGRzdCA9IGk7CisgICAgfSBlbHNlIHsKKwl3aGlsZSAobGVuYnl0ZXMtLSA+IDApIHsKKwkgICAgKmRzdCsrID0gZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChzcmNbMF0pIDw8IDQgfAorCQlnZGJzdHViX2Zyb21faGV4X2RpZ2l0KHNyY1sxXSk7CisJICAgIHNyYyArPSAyOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfdG9faGV4X2J1ZihjaGFyICpkc3QsIGNoYXIgKnNyYywgaW50IGxlbmJ5dGVzKQoreworICAgIGlmIChsZW5ieXRlcyA9PSAyICYmICgodW5zaWduZWQgbG9uZylzcmMgJiAweDEpID09IDApIHsKKwl1aW50MTZfdCBpID0gKih1aW50MTZfdCAqKSBzcmM7CisJZHN0WzBdID0gZ2Ric3R1Yl90b19oZXhfZGlnaXQoaSA+PiA0KTsKKwlkc3RbMV0gPSBnZGJzdHViX3RvX2hleF9kaWdpdChpKTsKKwlkc3RbMl0gPSBnZGJzdHViX3RvX2hleF9kaWdpdChpID4+IDEyKTsKKwlkc3RbM10gPSBnZGJzdHViX3RvX2hleF9kaWdpdChpID4+IDgpOworICAgIH0gZWxzZSBpZiAobGVuYnl0ZXMgPT0gNCAmJiAoKHVuc2lnbmVkIGxvbmcpc3JjICYgMHgzKSA9PSAwKSB7CisJdWludDMyX3QgaSA9ICoodWludDMyX3QgKikgc3JjOworCWRzdFswXSA9IGdkYnN0dWJfdG9faGV4X2RpZ2l0KGkgPj4gNCk7CisJZHN0WzFdID0gZ2Ric3R1Yl90b19oZXhfZGlnaXQoaSk7CisJZHN0WzJdID0gZ2Ric3R1Yl90b19oZXhfZGlnaXQoaSA+PiAxMik7CisJZHN0WzNdID0gZ2Ric3R1Yl90b19oZXhfZGlnaXQoaSA+PiA4KTsKKwlkc3RbNF0gPSBnZGJzdHViX3RvX2hleF9kaWdpdChpID4+IDIwKTsKKwlkc3RbNV0gPSBnZGJzdHViX3RvX2hleF9kaWdpdChpID4+IDE2KTsKKwlkc3RbNl0gPSBnZGJzdHViX3RvX2hleF9kaWdpdChpID4+IDI4KTsKKwlkc3RbN10gPSBnZGJzdHViX3RvX2hleF9kaWdpdChpID4+IDI0KTsKKyAgICB9IGVsc2UgeworCXdoaWxlIChsZW5ieXRlcy0tID4gMCkgeworCSAgICAqZHN0KysgPSBnZGJzdHViX3RvX2hleF9kaWdpdCgqc3JjID4+IDQpOworCSAgICAqZHN0KysgPSBnZGJzdHViX3RvX2hleF9kaWdpdCgqc3JjKTsKKwkgICAgc3JjKys7CisJfQorICAgIH0KK30KKworc3RhdGljIHVpbnQ4X3QgZ2Ric3R1Yl9ja3N1bShjaGFyICpkYXRhLCBpbnQgbGVuKQoreworICAgIHVpbnQ4X3QgY2tzdW0gPSAwOworICAgIHdoaWxlIChsZW4tLSA+IDApIHsKKwlja3N1bSArPSAodWludDhfdCkgKiBkYXRhKys7CisgICAgfQorICAgIHJldHVybiBja3N1bTsKK30KKworc3RhdGljIHZvaWQgZ2Ric3R1Yl90eF9wYWNrZXQoc3RydWN0IGdkYnN0dWIgKnN0dWIpCit7CisgICAgdWludDhfdCBja3N1bSA9IGdkYnN0dWJfY2tzdW0oc3R1Yi0+cGF5bG9hZCwgc3R1Yi0+bGVuKTsKKyAgICBzdHViLT5idWZbMF0gPSAnJCc7CisgICAgc3R1Yi0+YnVmW3N0dWItPmxlbiArIDFdID0gJyMnOworICAgIHN0dWItPmJ1ZltzdHViLT5sZW4gKyAyXSA9IGdkYnN0dWJfdG9faGV4X2RpZ2l0KGNrc3VtID4+IDQpOworICAgIHN0dWItPmJ1ZltzdHViLT5sZW4gKyAzXSA9IGdkYnN0dWJfdG9faGV4X2RpZ2l0KGNrc3VtKTsKKyAgICBzZXJpYWxfd3JpdGUoc3R1Yi0+YnVmLCBzdHViLT5sZW4gKyA0KTsKKyAgICBzdHViLT5wYXJzZSA9IGdkYnN0dWJfc3RhdGVfd2FpdF9hY2s7Cit9CisKKy8qIEdEQiBjb21tYW5kcyAqLworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zZW5kX29rKHN0cnVjdCBnZGJzdHViICpzdHViKQoreworICAgIHN0dWItPnBheWxvYWRbMF0gPSAnTyc7CisgICAgc3R1Yi0+cGF5bG9hZFsxXSA9ICdLJzsKKyAgICBzdHViLT5sZW4gPSAyOworICAgIGdkYnN0dWJfdHhfcGFja2V0KHN0dWIpOworfQorCitzdGF0aWMgdm9pZCBnZGJzdHViX3NlbmRfbnVtX3BhY2tldChzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciByZXBseSwgaW50IG51bSkKK3sKKyAgICBzdHViLT5wYXlsb2FkWzBdID0gcmVwbHk7CisgICAgc3R1Yi0+cGF5bG9hZFsxXSA9IGdkYnN0dWJfdG9faGV4X2RpZ2l0KChjaGFyKW51bSA+PiA0KTsKKyAgICBzdHViLT5wYXlsb2FkWzJdID0gZ2Ric3R1Yl90b19oZXhfZGlnaXQoKGNoYXIpbnVtKTsKKyAgICBzdHViLT5sZW4gPSAzOworICAgIGdkYnN0dWJfdHhfcGFja2V0KHN0dWIpOworfQorCisvKiBGb3JtYXQgaXMgYXJnMSxhcmcyLC4uLixhcmduOmRhdGEgd2hlcmUgYXJnbiBhcmUgaGV4IGludGVnZXJzIGFuZCBkYXRhIGlzIG5vdCBhbiBhcmd1bWVudCAqLworc3RhdGljIGludCBnZGJzdHViX2dldF9wYWNrZXRfYXJncyhzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgdW5zaWduZWQgbG9uZyAqYXJncywKKwkJCQkgICBpbnQgbmFyZ3MsIGludCAqc3RvcF9pZHgpCit7CisgICAgaW50IGk7CisgICAgY2hhciBjaCA9IDA7CisgICAgaW50IGFyZ2MgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgdmFsID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgc3R1Yi0+bGVuICYmIGFyZ2MgPCBuYXJnczsgaSsrKSB7CisJY2ggPSBzdHViLT5wYXlsb2FkW2ldOworCWlmIChjaCA9PSAnOicpIHsKKwkgICAgYnJlYWs7CisJfSBlbHNlIGlmIChjaCA9PSAnLCcpIHsKKwkgICAgYXJnc1thcmdjKytdID0gdmFsOworCSAgICB2YWwgPSAwOworCX0gZWxzZSB7CisJICAgIHZhbCA9ICh2YWwgPDwgNCkgfCBnZGJzdHViX2Zyb21faGV4X2RpZ2l0KGNoKTsKKwl9CisgICAgfQorICAgIGlmIChzdG9wX2lkeCkgeworCSpzdG9wX2lkeCA9IGk7CisgICAgfQorICAgIGlmIChhcmdjIDwgbmFyZ3MpIHsKKwlhcmdzW2FyZ2MrK10gPSB2YWw7CisgICAgfQorICAgIHJldHVybiAoKGkgPT0gc3R1Yi0+bGVuIHx8IGNoID09ICc6JykgJiYgYXJnYyA9PSBuYXJncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfc2VuZF9lcnJubyhzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgaW50IGVycm5vKQoreworICAgIGdkYnN0dWJfc2VuZF9udW1fcGFja2V0KHN0dWIsICdFJywgZXJybm8pOworfQorCitzdGF0aWMgdm9pZCBnZGJzdHViX3JlcG9ydF9zaWduYWwoc3RydWN0IGdkYnN0dWIgKnN0dWIpCit7CisgICAgZ2Ric3R1Yl9zZW5kX251bV9wYWNrZXQoc3R1YiwgJ1MnLCBzdHViLT5zaWdubyk7Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfcmVhZF9yZWdzKHN0cnVjdCBnZGJzdHViICpzdHViKQoreworICAgIGdkYnN0dWJfdG9faGV4X2J1ZihzdHViLT5wYXlsb2FkLCAoY2hhciAqKXN0dWItPnJlZ3MsIEdEQk1BQ0hfU0laRU9GX1JFR1MpOworICAgIHN0dWItPmxlbiA9IEdEQk1BQ0hfU0laRU9GX1JFR1MgKiAyOworICAgIGdkYnN0dWJfdHhfcGFja2V0KHN0dWIpOworfQorCitzdGF0aWMgdm9pZCBnZGJzdHViX3dyaXRlX3JlZ3Moc3RydWN0IGdkYnN0dWIgKnN0dWIpCit7CisgICAgaWYgKHN0dWItPmxlbiAhPSAxICsgR0RCTUFDSF9TSVpFT0ZfUkVHUyAqIDIpIHsKKwlnZGJzdHViX3NlbmRfZXJybm8oc3R1YiwgUE9TSVhfRUlOVkFMKTsKKwlyZXR1cm47CisgICAgfQorICAgIGdkYnN0dWJfZnJvbV9oZXhfYnVmKChjaGFyICopc3R1Yi0+cmVncywgJnN0dWItPnBheWxvYWRbMV0sCisJCQkgR0RCTUFDSF9TSVpFT0ZfUkVHUyk7CisgICAgZ2Ric3R1Yl9zZW5kX29rKHN0dWIpOworfQorCitzdGF0aWMgdm9pZCBnZGJzdHViX3JlYWRfbWVtKHN0cnVjdCBnZGJzdHViICpzdHViKQoreworICAgIHVuc2lnbmVkIGxvbmcgYXJnc1syXTsKKyAgICBpZiAoIWdkYnN0dWJfZ2V0X3BhY2tldF9hcmdzCisJKHN0dWIsIGFyZ3MsIHNpemVvZiBhcmdzIC8gc2l6ZW9mIGFyZ3NbMF0sIE5VTEwpKSB7CisJZ2Ric3R1Yl9zZW5kX2Vycm5vKHN0dWIsIFBPU0lYX0VJTlZBTCk7CisJcmV0dXJuOworICAgIH0KKyAgICBhcmdzWzFdID0gKGFyZ3NbMV0gPCBTSVpFT0ZfUEFZTE9BRCAvIDIpID8gYXJnc1sxXSA6IFNJWkVPRl9QQVlMT0FEIC8gMjsKKyAgICBnZGJzdHViX3RvX2hleF9idWYoc3R1Yi0+cGF5bG9hZCwgKGNoYXIgKilhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICBzdHViLT5sZW4gPSBhcmdzWzFdICogMjsKKyAgICBnZGJzdHViX3R4X3BhY2tldChzdHViKTsKK30KKworc3RhdGljIHZvaWQgZ2Ric3R1Yl93cml0ZV9tZW0oc3RydWN0IGdkYnN0dWIgKnN0dWIpCit7CisgICAgdW5zaWduZWQgbG9uZyBhcmdzWzJdOworICAgIGludCBjb2xvbjsKKyAgICBpZiAoIWdkYnN0dWJfZ2V0X3BhY2tldF9hcmdzCisJKHN0dWIsIGFyZ3MsIHNpemVvZiBhcmdzIC8gc2l6ZW9mIGFyZ3NbMF0sICZjb2xvbikgfHwgY29sb24gPj0gc3R1Yi0+bGVuCisJfHwgc3R1Yi0+cGF5bG9hZFtjb2xvbl0gIT0gJzonIHx8IChzdHViLT5sZW4gLSBjb2xvbiAtIDEpICUgMiAhPSAwKSB7CisJZ2Ric3R1Yl9zZW5kX2Vycm5vKHN0dWIsIFBPU0lYX0VJTlZBTCk7CisJcmV0dXJuOworICAgIH0KKyAgICBnZGJzdHViX2Zyb21faGV4X2J1ZigoY2hhciAqKWFyZ3NbMF0sICZzdHViLT5wYXlsb2FkW2NvbG9uICsgMV0sCisJCQkgKHN0dWItPmxlbiAtIGNvbG9uIC0gMSkgLyAyKTsKKyAgICBnZGJzdHViX3NlbmRfb2soc3R1Yik7Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfY29udGludWUoc3RydWN0IGdkYnN0dWIgKnN0dWIsIGludCBzaW5nbGVfc3RlcCkKK3sKKyAgICBnZGJyZWdfdCBwYzsKKyAgICBpZiAoc3R1Yi0+bGVuID4gMQorCSYmIGdkYnN0dWJfZ2V0X3BhY2tldF9hcmdzKHN0dWIsICh1bnNpZ25lZCBsb25nICopJnBjLCAxLCBOVUxMKSkgeworCWdkYm1hY2hfc2V0X3BjKHN0dWItPnJlZ3MsIHBjKTsKKyAgICB9CisgICAgZ2RibWFjaF9zZXRfc2luZ2xlX3N0ZXAoc3R1Yi0+cmVncywgc2luZ2xlX3N0ZXApOworICAgIHN0dWItPmV4aXRfaGFuZGxlciA9IDE7CisgICAgLyogUmVwbHkgd2lsbCBiZSBzZW50IHdoZW4gd2UgaGl0IHRoZSBuZXh0IGJyZWFrcG9pbnQgb3IgaW50ZXJydXB0ICovCit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfYnJlYWtwb2ludChzdHJ1Y3QgZ2Ric3R1YiAqc3R1YikKK3sKKyAgICB1bnNpZ25lZCBsb25nIGFyZ3NbM107CisgICAgaW50IGVuYWJsZSA9IHN0dWItPnBheWxvYWRbMF0gPT0gJ1onID8gMSA6IDA7CisgICAgaWYgKCFnZGJzdHViX2dldF9wYWNrZXRfYXJncworCShzdHViLCBhcmdzLCBzaXplb2YgYXJncyAvIHNpemVvZiBhcmdzWzBdLCBOVUxMKSkgeworCWdkYnN0dWJfc2VuZF9lcnJubyhzdHViLCBQT1NJWF9FSU5WQUwpOworCXJldHVybjsKKyAgICB9CisgICAgaWYgKGdkYm1hY2hfc2V0X2JyZWFrcG9pbnQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgZW5hYmxlKSkgeworCWdkYnN0dWJfc2VuZF9vayhzdHViKTsKKyAgICB9IGVsc2UgeworCS8qIE5vdCBzdXBwb3J0ZWQgKi8KKwlzdHViLT5sZW4gPSAwOworCWdkYnN0dWJfdHhfcGFja2V0KHN0dWIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2Ric3R1Yl9yeF9wYWNrZXQoc3RydWN0IGdkYnN0dWIgKnN0dWIpCit7CisgICAgc3dpdGNoIChzdHViLT5wYXlsb2FkWzBdKSB7CisgICAgY2FzZSAnPyc6CisJZ2Ric3R1Yl9yZXBvcnRfc2lnbmFsKHN0dWIpOworCWJyZWFrOworICAgIGNhc2UgJ2cnOgorCWdkYnN0dWJfcmVhZF9yZWdzKHN0dWIpOworCWJyZWFrOworICAgIGNhc2UgJ0cnOgorCWdkYnN0dWJfd3JpdGVfcmVncyhzdHViKTsKKwlicmVhazsKKyAgICBjYXNlICdtJzoKKwlnZGJzdHViX3JlYWRfbWVtKHN0dWIpOworCWJyZWFrOworICAgIGNhc2UgJ00nOgorCWdkYnN0dWJfd3JpdGVfbWVtKHN0dWIpOworCWJyZWFrOworICAgIGNhc2UgJ2MnOgkJCS8qIENvbnRpbnVlICovCisgICAgY2FzZSAnayc6CQkJLyogS2lsbCAqLworICAgIGNhc2UgJ3MnOgkJCS8qIFN0ZXAgKi8KKyAgICBjYXNlICdEJzoJCQkvKiBEZXRhY2ggKi8KKwlnZGJzdHViX2NvbnRpbnVlKHN0dWIsIHN0dWItPnBheWxvYWRbMF0gPT0gJ3MnKTsKKwlpZiAoc3R1Yi0+cGF5bG9hZFswXSA9PSAnRCcpIHsKKwkgICAgZ2Ric3R1Yl9zZW5kX29rKHN0dWIpOworCX0KKwlicmVhazsKKyAgICBjYXNlICdaJzoJCQkvKiBJbnNlcnQgYnJlYWtwb2ludCAqLworICAgIGNhc2UgJ3onOgkJCS8qIFJlbW92ZSBicmVha3BvaW50ICovCisJZ2Ric3R1Yl9icmVha3BvaW50KHN0dWIpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJc3R1Yi0+bGVuID0gMDsKKwlnZGJzdHViX3R4X3BhY2tldChzdHViKTsKKwlicmVhazsKKyAgICB9Cit9CisKKy8qIEdEQiBwYWNrZXQgcGFyc2VyICovCitzdGF0aWMgdm9pZCBnZGJzdHViX3N0YXRlX25ldyhzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciBjaCkKK3sKKyAgICBpZiAoY2ggPT0gJyQnKSB7CisJc3R1Yi0+bGVuID0gMDsKKwlzdHViLT5wYXJzZSA9IGdkYnN0dWJfc3RhdGVfZGF0YTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfc3RhdGVfZGF0YShzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciBjaCkKK3sKKyAgICBpZiAoY2ggPT0gJyMnKSB7CisJc3R1Yi0+cGFyc2UgPSBnZGJzdHViX3N0YXRlX2Nrc3VtMTsKKyAgICB9IGVsc2UgaWYgKGNoID09ICckJykgeworCXN0dWItPmxlbiA9IDA7CQkvKiByZXRyeSBuZXcgcGFja2V0ICovCisgICAgfSBlbHNlIHsKKwkvKiBJZiB0aGUgbGVuZ3RoIGV4Y2VlZHMgb3VyIGJ1ZmZlciwgbGV0IHRoZSBjaGVja3N1bSBmYWlsICovCisJaWYgKHN0dWItPmxlbiA8IFNJWkVPRl9QQVlMT0FEKSB7CisJICAgIHN0dWItPnBheWxvYWRbc3R1Yi0+bGVuKytdID0gY2g7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zdGF0ZV9ja3N1bTEoc3RydWN0IGdkYnN0dWIgKnN0dWIsIGNoYXIgY2gpCit7CisgICAgc3R1Yi0+Y2tzdW0xID0gZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdChjaCkgPDwgNDsKKyAgICBzdHViLT5wYXJzZSA9IGdkYnN0dWJfc3RhdGVfY2tzdW0yOworfQorCitzdGF0aWMgdm9pZCBnZGJzdHViX3N0YXRlX2Nrc3VtMihzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciBjaCkKK3sKKyAgICB1aW50OF90IHRoZWlyX2Nrc3VtOworICAgIHVpbnQ4X3Qgb3VyX2Nrc3VtOworCisgICAgc3R1Yi0+cGFyc2UgPSBnZGJzdHViX3N0YXRlX25ldzsKKyAgICB0aGVpcl9ja3N1bSA9IHN0dWItPmNrc3VtMSArIGdkYnN0dWJfZnJvbV9oZXhfZGlnaXQoY2gpOworICAgIG91cl9ja3N1bSA9IGdkYnN0dWJfY2tzdW0oc3R1Yi0+cGF5bG9hZCwgc3R1Yi0+bGVuKTsKKworICAgIGlmICh0aGVpcl9ja3N1bSA9PSBvdXJfY2tzdW0pIHsKKwlzZXJpYWxfd3JpdGUoIisiLCAxKTsKKwlpZiAoc3R1Yi0+bGVuID4gMCkgeworCSAgICBnZGJzdHViX3J4X3BhY2tldChzdHViKTsKKwl9CisgICAgfSBlbHNlIHsKKwlzZXJpYWxfd3JpdGUoIi0iLCAxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfc3RhdGVfd2FpdF9hY2soc3RydWN0IGdkYnN0dWIgKnN0dWIsIGNoYXIgY2gpCit7CisgICAgaWYgKGNoID09ICcrJykgeworCXN0dWItPnBhcnNlID0gZ2Ric3R1Yl9zdGF0ZV9uZXc7CisgICAgfSBlbHNlIHsKKwkvKiBUaGlzIHJldHJhbnNtaXQgaXMgdmVyeSBhZ2dyZXNzaXZlIGJ1dCBuZWNlc3NhcnkgdG8ga2VlcAorCSAqIGluIHN5bmMgd2l0aCBHREIuICovCisJZ2Ric3R1Yl90eF9wYWNrZXQoc3R1Yik7CisgICAgfQorfQorCit2b2lkIGdkYnN0dWJfaGFuZGxlcihpbnQgc2lnbm8sIGdkYnJlZ190ICogcmVncykKK3sKKyAgICBzdHJ1Y3QgZ2Ric3R1YiBzdHViOworCisgICAgZ2RibWFjaF9kaXNhYmxlX2h3YnBzKCk7CisKKyAgICBzdHViLnBhcnNlID0gZ2Ric3R1Yl9zdGF0ZV9uZXc7CisgICAgc3R1Yi5wYXlsb2FkID0gJnN0dWIuYnVmWzFdOworICAgIHN0dWIuc2lnbm8gPSBzaWdubzsKKyAgICBzdHViLnJlZ3MgPSByZWdzOworICAgIHN0dWIuZXhpdF9oYW5kbGVyID0gMDsKKyAgICBnZGJzdHViX3JlcG9ydF9zaWduYWwoJnN0dWIpOworICAgIHdoaWxlICghc3R1Yi5leGl0X2hhbmRsZXIpCisJc3R1Yi5wYXJzZSgmc3R1Yiwgc2VyaWFsX2dldGMoKSk7CisKKyAgICBnZGJtYWNoX2VuYWJsZV9od2JwcygpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZ2Ric3R1Yi9pbnQuUyBiL2NvbTMyL2dkYnN0dWIvaW50LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExZmY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dkYnN0dWIvaW50LlMKQEAgLTAsMCArMSw3NyBAQAorICAgIC5zZWN0aW9uICIudGV4dCIsImF4IgorCisjZGVmaW5lIFNJR1RSQVAgNQorCisjZGVmaW5lIFNJWkVPRl9JMzg2X1JFR1MgICAgMzIKKyNkZWZpbmUgU0laRU9GX0kzODZfRkxBR1MgICA0CisKKy8qIFdoZW4gaW52b2tlZCwgdGhlIHN0YWNrIGNvbnRhaW5zOiBlZmxhZ3MsIGNzLCBlaXAsIHNpZ25vLiAqLworI2RlZmluZSBJSF9PRkZTRVRfR0RCX1JFR1MgKCAwICkKKyNkZWZpbmUgSUhfT0ZGU0VUX0dEQl9FSVAgKCBJSF9PRkZTRVRfR0RCX1JFR1MgKyBTSVpFT0ZfSTM4Nl9SRUdTICkKKyNkZWZpbmUgSUhfT0ZGU0VUX0dEQl9FRkxBR1MgKCBJSF9PRkZTRVRfR0RCX0VJUCArIDQgKQorI2RlZmluZSBJSF9PRkZTRVRfR0RCX1NFR19SRUdTICggSUhfT0ZGU0VUX0dEQl9FRkxBR1MgKyBTSVpFT0ZfSTM4Nl9GTEFHUyApCisjZGVmaW5lIElIX09GRlNFVF9HREJfRU5EICggSUhfT0ZGU0VUX0dEQl9TRUdfUkVHUyArIDYgKiA0ICkKKyNkZWZpbmUgSUhfT0ZGU0VUX09MRF9FSVAgKCBJSF9PRkZTRVRfR0RCX0VORCApCisjZGVmaW5lIElIX09GRlNFVF9PTERfQ1MgKCBJSF9PRkZTRVRfT0xEX0VJUCArIDQgKQorI2RlZmluZSBJSF9PRkZTRVRfT0xEX0VGTEFHUyAoIElIX09GRlNFVF9PTERfQ1MgKyA0ICkKKyNkZWZpbmUgSUhfT0ZGU0VUX0VORCAoIElIX09GRlNFVF9PTERfRUZMQUdTICsgNCApCisKKy8qIFdlIGFsc28gYWNjZXNzIHRoZSBzdGFjayB3aGlsc3Qgc3RpbGwgc3RvcmluZyBvciByZXN0b3JpbmcKKyAqIHRoZSByZWdpc3RlciBzbmFwc2hvdC4gIFNpbmNlIEVTUCBpcyBpbiBmbHV4LCB3ZSBuZWVkCisgKiBzcGVjaWFsIG9mZnNldHMuCisgKi8KKyNkZWZpbmUgSUhfT0ZGU0VUX0ZMVVhfT0xEX0NTICggSUhfT0ZGU0VUX09MRF9DUyAtIDQ0ICkKKyNkZWZpbmUgSUhfT0ZGU0VUX0ZMVVhfT0xEX0VGTEFHUyAoIElIX09GRlNFVF9PTERfRUZMQUdTIC0gNDAgKQorI2RlZmluZSBJSF9PRkZTRVRfRkxVWF9PTERfRUlQICggSUhfT0ZGU0VUX09MRF9FSVAgLSAzNiApCisjZGVmaW5lIElIX09GRlNFVF9GTFVYX0VORCAoIElIX09GRlNFVF9FTkQgLSAyMCApCisKKyAgICAuZ2xvYmFsIGludF9oYW5kbGVyCitpbnRfaGFuZGxlcjoKKwkvKiBTdG9yZSBDUFUgc3RhdGUgaW4gR0RCIHJlZ2lzdGVyIHNuYXBzaG90ICovCisJcHVzaHcJJDAKKwlwdXNodwklZ3MKKwlwdXNodwkkMAorCXB1c2h3CSVmcworCXB1c2h3CSQwCisJcHVzaHcJJWVzCisJcHVzaHcJJDAKKwlwdXNodwklZHMKKwlwdXNodwkkMAorCXB1c2h3CSVzcworCXB1c2h3CSQwCisJcHVzaHcJSUhfT0ZGU0VUX0ZMVVhfT0xEX0NTICsgMiglZXNwKQorCXB1c2hsCUlIX09GRlNFVF9GTFVYX09MRF9FRkxBR1MoJWVzcCkKKwlwdXNobAlJSF9PRkZTRVRfRkxVWF9PTERfRUlQKCVlc3ApCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJwCisJbGVhbAlJSF9PRkZTRVRfRkxVWF9FTkQoJWVzcCksICVlZGkKKwlwdXNobAklZWRpIC8qIG9sZCBFU1AgKi8KKwlwdXNobAklZWJ4CisJcHVzaGwJJWVkeAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWF4CisKKwkvKiBDYWxsIEdEQiBzdHViIGV4Y2VwdGlvbiBoYW5kbGVyICovCisgICAgbW92bCAgICAkU0lHVFJBUCwgJWVheAorCW1vdmwJJWVzcCwgJWVkeAorCWNhbGwJZ2Ric3R1Yl9oYW5kbGVyCisKKwkvKiBSZXN0b3JlIENQVSBzdGF0ZSBmcm9tIEdEQiByZWdpc3RlciBzbmFwc2hvdCAqLworCXBvcGwJJWVheAorCXBvcGwJJWVjeAorCXBvcGwJJWVkeAorCXBvcGwJJWVieAorCWFkZGwJJDQsICVlc3AgLyogQ2hhbmdpbmcgRVNQIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkICovCisJcG9wbAklZWJwCisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcG9wbAlJSF9PRkZTRVRfRkxVWF9PTERfRUlQKCVlc3ApCisJcG9wbAlJSF9PRkZTRVRfRkxVWF9PTERfRUZMQUdTKCVlc3ApCisJcG9wbAlJSF9PRkZTRVRfRkxVWF9PTERfQ1MoJWVzcCkKKwlwb3BsCSVzcworCXBvcGwJJWRzCisJcG9wbAklZXMKKwlwb3BsCSVmcworCXBvcGwJJWdzCisJaXJldApkaWZmIC0tZ2l0IGEvY29tMzIvZ2Ric3R1Yi9tYWluLmMgYi9jb20zMi9nZGJzdHViL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmY5ZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ2Ric3R1Yi9tYWluLmMKQEAgLTAsMCArMSwxNDIgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisjaW5jbHVkZSAic2VyaWFsLmgiCisKKyNkZWZpbmUgWDg2X0lOVF9EQiAgICAgIDEKKyNkZWZpbmUgWDg2X0lOVF9CUCAgICAgIDMKKyNkZWZpbmUgQ09NMzJfSURUICAgICAgICgodm9pZCopMHgxMDAwMDApCisjZGVmaW5lIENPTTMyX0xPQURfQUREUiAoKHZvaWQqKTB4MTAxMDAwKQorI2RlZmluZSBTVEFDS19TSVpFICAgICAgMHgxMDAwCisKK2V4dGVybiBjaGFyIF9zdGFydFtdLCBfZW5kW107CisKK3N0cnVjdCByZWxvY19pbmZvIHsKKyAgICB2b2lkICpkYXRhOworICAgIHNpemVfdCBsZW47CisgICAgdWludDMyX3Qgb2xkX2VzcDsKKyAgICB1aW50MzJfdCByZWxvY19iYXNlOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBmcHV0cyhtc2csIHN0ZGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgcmVsb2NfcHRyKHN0cnVjdCByZWxvY19pbmZvICpyaSwgdm9pZCAqcHRyKQoreworICAgIHJldHVybiByaS0+cmVsb2NfYmFzZSArICh1aW50MzJfdCkgKChjaGFyICopcHRyIC0gX3N0YXJ0KTsKK30KKworc3RhdGljIHZvaWQgaGlqYWNrX2ludGVycnVwdChpbnQgaW50biwgdWludDMyX3QgaGFuZGxlcikKK3sKKyAgICBzdHJ1Y3QgeworCXVpbnQzMl90IGxvOworCXVpbnQzMl90IGhpOworICAgIH0gKmlkdCA9IENPTTMyX0lEVDsKKworICAgIGlkdFtpbnRuXS5sbyA9IChpZHRbaW50bl0ubG8gJiAweGZmZmYwMDAwKSB8IChoYW5kbGVyICYgMHgwMDAwZmZmZik7CisgICAgaWR0W2ludG5dLmhpID0gKGlkdFtpbnRuXS5oaSAmIDB4MDAwMGZmZmYpIHwgKGhhbmRsZXIgJiAweGZmZmYwMDAwKTsKK30KKworc3RhdGljIHZvaWQgc2hpZnRfY21kbGluZShzdHJ1Y3QgY29tMzJfc3lzX2FyZ3MgKmNvbTMyKQoreworICAgIGNoYXIgKnA7CisKKyAgICAvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICAgIGZvciAocCA9IGNvbTMyLT5jc19jbWRsaW5lOyAqcCAhPSAnXDAnICYmICpwID09ICcgJzsgcCsrKSA7CisKKyAgICAvKiBTa2lwIGZpcnN0IHdvcmQgKi8KKyAgICBmb3IgKDsgKnAgIT0gJ1wwJyAmJiAqcCAhPSAnICc7IHArKykgOworCisgICAgLyogU2tpcCB3aGl0ZXNwYWNlIGFmdGVyIGZpcnN0IHdvcmQgKi8KKyAgICBmb3IgKDsgKnAgIT0gJ1wwJyAmJiAqcCA9PSAnICc7IHArKykgOworCisgICAgY29tMzItPmNzX2NtZGxpbmUgPSBwOworfQorCitzdGF0aWMgX19ub3JldHVybiByZWxvY19lbnRyeShzdHJ1Y3QgcmVsb2NfaW5mbyAqcmkpCit7CisgICAgZXh0ZXJuIGNoYXIgaW50X2hhbmRsZXJbXTsKKyAgICBzaXplX3Qgc3RhY2tfZnJhbWVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY29tMzJfc3lzX2FyZ3MpICsgNDsKKyAgICBzdHJ1Y3QgY29tMzJfc3lzX2FyZ3MgKmNvbTMyOworICAgIHVpbnQzMl90IG1vZHVsZV9lc3A7CisKKyAgICBoaWphY2tfaW50ZXJydXB0KFg4Nl9JTlRfREIsIHJlbG9jX3B0cihyaSwgaW50X2hhbmRsZXIpKTsKKyAgICBoaWphY2tfaW50ZXJydXB0KFg4Nl9JTlRfQlAsIHJlbG9jX3B0cihyaSwgaW50X2hhbmRsZXIpKTsKKworICAgIC8qIENvcHkgbW9kdWxlIHRvIGxvYWQgYWRkcmVzcyAqLworICAgIG1lbWNweShDT00zMl9MT0FEX0FERFIsIHJpLT5kYXRhLCByaS0+bGVuKTsKKworICAgIC8qIENvcHkgc3RhY2sgZnJhbWUgb250byBtb2R1bGUgc3RhY2sgKi8KKyAgICBtb2R1bGVfZXNwID0gKHJpLT5yZWxvY19iYXNlIC0gc3RhY2tfZnJhbWVfc2l6ZSkgJiB+MTU7CisgICAgbWVtY3B5KCh2b2lkICopbW9kdWxlX2VzcCwgKHZvaWQgKilyaS0+b2xkX2VzcCwgc3RhY2tfZnJhbWVfc2l6ZSk7CisKKyAgICAvKiBGaXggdXAgY29tbWFuZCBsaW5lICovCisgICAgY29tMzIgPSAoc3RydWN0IGNvbTMyX3N5c19hcmdzICopKG1vZHVsZV9lc3AgKyA0KTsKKyAgICBzaGlmdF9jbWRsaW5lKGNvbTMyKTsKKworICAgIC8qIFNldCB1cCBDUFUgc3RhdGUgdG8gcnVuIG1vZHVsZSBhbmQgZW50ZXIgR0RCICovCisgICAgYXNtIHZvbGF0aWxlICgibW92bCAlMCwgJSVlc3Bcblx0IgorCQkgICJwdXNoZlxuXHQiCisJCSAgInB1c2hsICUlY3Ncblx0IgorCQkgICJwdXNobCAlMVxuXHQiCisJCSAgImptcCAqJTJcblx0Ijo6InIiIChtb2R1bGVfZXNwKSwKKwkJICAiYyIoQ09NMzJfTE9BRF9BRERSKSwgInIiKHJlbG9jX3B0cihyaSwgaW50X2hhbmRsZXIpKQorCSk7CisgICAgZm9yICg7OykgOwkJCS8qIHNodXQgdGhlIGNvbXBpbGVyIHVwICovCit9CisKK3N0YXRpYyBpbmxpbmUgX19ub3JldHVybiByZWxvYyh2b2lkICpwdHIsIHNpemVfdCBsZW4pCit7CisgICAgZXh0ZXJuIHVpbnQzMl90IF9fZW50cnlfZXNwOworICAgIHNpemVfdCB0b3RhbF9zaXplID0gX2VuZCAtIF9zdGFydDsKKyAgICBfX25vcmV0dXJuKCplbnRyeV9mbikgKHN0cnVjdCByZWxvY19pbmZvICopOworICAgIHN0cnVjdCByZWxvY19pbmZvIHJpOworICAgIHVpbnQzMl90IGVzcDsKKyAgICBjaGFyICpkZXN0OworCisgICAgLyogQ2FsY3VsYXRlIHJlbG9jYXRpb24gYWRkcmVzcywgcHJlc2VydmUgY3VycmVudCBzdGFjayAqLworICAgIGFzbSB2b2xhdGlsZSAoIm1vdmwgJSVlc3AsICUwXG5cdCI6Ij1tIiAoZXNwKSk7CisgICAgZGVzdCA9IChjaGFyICopKChlc3AgLSBTVEFDS19TSVpFIC0gdG90YWxfc2l6ZSkgJiB+Myk7CisKKyAgICAvKiBDYWxjdWxhdGUgZW50cnkgcG9pbnQgaW4gcmVsb2NhdGVkIGNvZGUgKi8KKyAgICBlbnRyeV9mbiA9ICh2b2lkICopKGRlc3QgKyAoKGNoYXIgKilyZWxvY19lbnRyeSAtIF9zdGFydCkpOworCisgICAgLyogQ29weSBhbGwgc2VjdGlvbnMgdG8gcmVsb2NhdGlvbiBhZGRyZXNzICovCisgICAgcHJpbnRmKCJSZWxvY2F0aW5nICVkIGJ5dGVzIGZyb20gJXAgdG8gJXBcbiIsIHRvdGFsX3NpemUsIF9zdGFydCwgZGVzdCk7CisgICAgbWVtY3B5KGRlc3QsIF9zdGFydCwgdG90YWxfc2l6ZSk7CisKKyAgICAvKiBDYWxsIGludG8gcmVsb2NhdGVkIGNvZGUgKi8KKyAgICByaS5kYXRhID0gcHRyOworICAgIHJpLmxlbiA9IGxlbjsKKyAgICByaS5vbGRfZXNwID0gX19lbnRyeV9lc3A7CisgICAgcmkucmVsb2NfYmFzZSA9ICh1aW50MzJfdCkgZGVzdDsKKyAgICBlbnRyeV9mbigmcmkpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IGRhdGFfbGVuOworCisgICAgb3BlbmNvbnNvbGUoJmRldl9udWxsX3IsICZkZXZfc3RkY29uX3cpOworCisgICAgaWYgKGFyZ2MgPCAyKSB7CisJZXJyb3IoIlVzYWdlOiBnZGJzdHViLmMzMiBjb20zMl9maWxlIGFyZ3VtZW50cy4uLlxuIik7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGxvYWRmaWxlKGFyZ3ZbMV0sICZkYXRhLCAmZGF0YV9sZW4pKSB7CisJZXJyb3IoIlVuYWJsZSB0byBsb2FkIGZpbGVcbiIpOworCXJldHVybiAxOworICAgIH0KKworICAgIHNlcmlhbF9pbml0KCk7CisKKyAgICAvKiBObyBtb3JlIGxpYiBjYWxscyBhZnRlciB0aGlzIHBvaW50ICovCisgICAgcmVsb2MoZGF0YSwgZGF0YV9sZW4pOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZ2Ric3R1Yi9zZXJpYWwuYyBiL2NvbTMyL2dkYnN0dWIvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2OWIwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dkYnN0dWIvc2VyaWFsLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBUaGUgc2VyaWFsIHBvcnQgaW50ZXJmYWNlIHJvdXRpbmVzIGltcGxlbWVudCBhIHNpbXBsZSBwb2xsZWQgaS9vCisgKiBpbnRlcmZhY2UgdG8gYSBzdGFuZGFyZCBzZXJpYWwgcG9ydC4gIER1ZSB0byB0aGUgc3BhY2UgcmVzdHJpY3Rpb25zCisgKiBmb3IgdGhlIGJvb3QgYmxvY2tzLCBubyBCSU9TIHN1cHBvcnQgaXMgdXNlZCAoc2luY2UgQklPUyByZXF1aXJlcworICogZXhwZW5zaXZlIHJlYWwvcHJvdGVjdGVkIG1vZGUgc3dpdGNoZXMpLCBpbnN0ZWFkIHRoZSBydWRpbWVudGFyeQorICogQklPUyBzdXBwb3J0IGlzIGR1cGxpY2F0ZWQgaGVyZS4KKyAqCisgKiBUaGUgYmFzZSBhZGRyZXNzIGFuZCBzcGVlZCBmb3IgdGhlIGkvbyBwb3J0IGFyZSBwYXNzZWQgZnJvbSB0aGUKKyAqIE1ha2VmaWxlIGluIHRoZSBDT01DT05TT0xFIGFuZCBDT05TUEVFRCBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgVGhlCisgKiBsaW5lIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgY3VycmVudGx5IGhhcmQtY29kZWQgdG8gOCBiaXRzLCBubworICogcGFyaXR5LCAxIHN0b3AgYml0ICg4TjEpLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCBpbiBpbml0X3NlcmlhbCgpLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvaW8uaD4KKyNpbmNsdWRlICJzZXJpYWwuaCIKKworLyogU2V0IGRlZmF1bHQgdmFsdWVzIGlmIG5vbmUgc3BlY2lmaWVkICovCisKKyNpZm5kZWYgQ09NQ09OU09MRQorI2RlZmluZSBDT01DT05TT0xFCTB4M2Y4CisjZW5kaWYKKworI2lmbmRlZiBDT01TUEVFRAorI2RlZmluZSBDT01TUEVFRAk5NjAwCisjZW5kaWYKKworI2lmbmRlZiBDT01EQVRBCisjZGVmaW5lIENPTURBVEEJCTgKKyNlbmRpZgorCisjaWZuZGVmIENPTVBBUklUWQorI2RlZmluZSBDT01QQVJJVFkJMAorI2VuZGlmCisKKyNpZm5kZWYgQ09NU1RPUAorI2RlZmluZSBDT01TVE9QCQkxCisjZW5kaWYKKworI3VuZGVmIFVBUlRfQkFTRQorI2RlZmluZSBVQVJUX0JBU0UgKCBDT01DT05TT0xFICkKKworI3VuZGVmIFVBUlRfQkFVRAorI2RlZmluZSBVQVJUX0JBVUQgKCBDT01TUEVFRCApCisKKyNpZiAoKDExNTIwMCVVQVJUX0JBVUQpICE9IDApCisjZXJyb3IgQmFkIHR0eXMwIGJhdWQgcmF0ZQorI2VuZGlmCisKKyNkZWZpbmUgQ09NQlJEICgxMTUyMDAvVUFSVF9CQVVEKQorCisvKiBMaW5lIENvbnRyb2wgU2V0dGluZ3MgKi8KKyNkZWZpbmUgVUFSVF9MQ1MgKCAoICggKENPTURBVEEpIC0gNSApCTw8IDAgKSB8IFwKKwkJICAgKCAoIChDT01QQVJJVFkpICkJPDwgMyApIHwgXAorCQkgICAoICggKENPTVNUT1ApIC0gMSApCTw8IDIgKSApCisKKy8qIERhdGEgKi8KKyNkZWZpbmUgVUFSVF9SQlIgMHgwMAorI2RlZmluZSBVQVJUX1RCUiAweDAwCisKKy8qIENvbnRyb2wgKi8KKyNkZWZpbmUgVUFSVF9JRVIgMHgwMQorI2RlZmluZSBVQVJUX0lJUiAweDAyCisjZGVmaW5lIFVBUlRfRkNSIDB4MDIKKyNkZWZpbmUgVUFSVF9MQ1IgMHgwMworI2RlZmluZSBVQVJUX01DUiAweDA0CisjZGVmaW5lIFVBUlRfRExMIDB4MDAKKyNkZWZpbmUgVUFSVF9ETE0gMHgwMQorCisvKiBTdGF0dXMgKi8KKyNkZWZpbmUgVUFSVF9MU1IgMHgwNQorI2RlZmluZSAgVUFSVF9MU1JfVEVNUFQgMHg0MAkvKiBUcmFuc21pdHRlciBlbXB0eSAqLworI2RlZmluZSAgVUFSVF9MU1JfVEhSRSAgMHgyMAkvKiBUcmFuc21pdC1ob2xkLXJlZ2lzdGVyIGVtcHR5ICovCisjZGVmaW5lICBVQVJUX0xTUl9CSQkweDEwCS8qIEJyZWFrIGludGVycnVwdCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgIFVBUlRfTFNSX0ZFCTB4MDgJLyogRnJhbWUgZXJyb3IgaW5kaWNhdG9yICovCisjZGVmaW5lICBVQVJUX0xTUl9QRQkweDA0CS8qIFBhcml0eSBlcnJvciBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgIFVBUlRfTFNSX09FCTB4MDIJLyogT3ZlcnJ1biBlcnJvciBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgIFVBUlRfTFNSX0RSCTB4MDEJLyogUmVjZWl2ZXIgZGF0YSByZWFkeSAqLworCisjZGVmaW5lIFVBUlRfTVNSIDB4MDYKKyNkZWZpbmUgVUFSVF9TQ1IgMHgwNworCisjZGVmaW5lIHVhcnRfcmVhZGIoYWRkcikgaW5iKGFkZHIpCisjZGVmaW5lIHVhcnRfd3JpdGViKHZhbCxhZGRyKSBvdXRiKCh2YWwpLChhZGRyKSkKKworLyoKKyAqIHZvaWQgc2VyaWFsX3B1dGMoaW50IGNoKTsKKyAqCVdyaXRlIGNoYXJhY3RlciBgY2gnIHRvIHBvcnQgVUFSVF9CQVNFLgorICovCit2b2lkIHNlcmlhbF9wdXRjKGludCBjaCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGZvciAoOzspIHsKKwlzdGF0dXMgPSB1YXJ0X3JlYWRiKFVBUlRfQkFTRSArIFVBUlRfTFNSKTsKKwlpZiAoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkgeworCSAgICAvKiBUWCBidWZmZXIgZW10cHkgKi8KKwkgICAgdWFydF93cml0ZWIoY2gsIFVBUlRfQkFTRSArIFVBUlRfVEJSKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KK30KKworLyoKKyAqIGludCBzZXJpYWxfZ2V0Yyh2b2lkKTsKKyAqCVJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBwb3J0IFVBUlRfQkFTRS4KKyAqLworaW50IHNlcmlhbF9nZXRjKHZvaWQpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgY2g7CisgICAgZG8geworCXN0YXR1cyA9IHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9MU1IpOworICAgIH0gd2hpbGUgKChzdGF0dXMgJiAxKSA9PSAwKTsKKyAgICBjaCA9IHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9SQlIpOwkvKiBmZXRjaCAoZmlyc3QpIGNoYXJhY3RlciAqLworICAgIGNoICY9IDB4N2Y7CQkJLyogcmVtb3ZlIGFueSBwYXJpdHkgYml0cyB3ZSBnZXQgKi8KKyAgICBpZiAoY2ggPT0gMHg3ZikgewkJLyogTWFrZSBERUwuLi4gbG9vayBsaWtlIEJTICovCisJY2ggPSAweDA4OworICAgIH0KKyAgICByZXR1cm4gY2g7Cit9CisKKy8qCisgKiBpbnQgc2VyaWFsX2luaXQodm9pZCk7CisgKglJbml0aWFsaXplIHBvcnQgVUFSVF9CQVNFIHRvIHNwZWVkIENPTVNQRUVELCBsaW5lIHNldHRpbmdzIDhOMS4KKyAqLwordm9pZCBzZXJpYWxfaW5pdCh2b2lkKQoreworICAgIGludCBzdGF0dXM7CisgICAgaW50IGRpdmlzb3IsIGxjczsKKworICAgIGRpdmlzb3IgPSBDT01CUkQ7CisgICAgbGNzID0gVUFSVF9MQ1M7CisKKyNpZmRlZiBDT01QUkVTRVJWRQorICAgIGxjcyA9IHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9MQ1IpICYgMHg3ZjsKKyAgICB1YXJ0X3dyaXRlYigweDgwIHwgbGNzLCBVQVJUX0JBU0UgKyBVQVJUX0xDUik7CisgICAgZGl2aXNvciA9CisJKHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9ETE0pIDw8IDgpIHwgdWFydF9yZWFkYihVQVJUX0JBU0UgKworCQkJCQkJCSAgICAgVUFSVF9ETEwpOworICAgIHVhcnRfd3JpdGViKGxjcywgVUFSVF9CQVNFICsgVUFSVF9MQ1IpOworI2VuZGlmCisKKyAgICAvKiBTZXQgQmF1ZCBSYXRlIERpdmlzb3IgdG8gQ09NU1BFRUQsIGFuZCB0ZXN0IHRvIHNlZSBpZiB0aGUKKyAgICAgKiBzZXJpYWwgcG9ydCBhcHBlYXJzIHRvIGJlIHByZXNlbnQuCisgICAgICovCisgICAgdWFydF93cml0ZWIoMHg4MCB8IGxjcywgVUFSVF9CQVNFICsgVUFSVF9MQ1IpOworICAgIHVhcnRfd3JpdGViKDB4YWEsIFVBUlRfQkFTRSArIFVBUlRfRExMKTsKKyAgICBpZiAodWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX0RMTCkgIT0gMHhhYSkgeworCWdvdG8gb3V0OworICAgIH0KKyAgICB1YXJ0X3dyaXRlYigweDU1LCBVQVJUX0JBU0UgKyBVQVJUX0RMTCk7CisgICAgaWYgKHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9ETEwpICE9IDB4NTUpIHsKKwlnb3RvIG91dDsKKyAgICB9CisgICAgdWFydF93cml0ZWIoZGl2aXNvciAmIDB4ZmYsIFVBUlRfQkFTRSArIFVBUlRfRExMKTsKKyAgICBpZiAodWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX0RMTCkgIT0gKGRpdmlzb3IgJiAweGZmKSkgeworCWdvdG8gb3V0OworICAgIH0KKyAgICB1YXJ0X3dyaXRlYigweGFhLCBVQVJUX0JBU0UgKyBVQVJUX0RMTSk7CisgICAgaWYgKHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9ETE0pICE9IDB4YWEpIHsKKwlnb3RvIG91dDsKKyAgICB9CisgICAgdWFydF93cml0ZWIoMHg1NSwgVUFSVF9CQVNFICsgVUFSVF9ETE0pOworICAgIGlmICh1YXJ0X3JlYWRiKFVBUlRfQkFTRSArIFVBUlRfRExNKSAhPSAweDU1KSB7CisJZ290byBvdXQ7CisgICAgfQorICAgIHVhcnRfd3JpdGViKChkaXZpc29yID4+IDgpICYgMHhmZiwgVUFSVF9CQVNFICsgVUFSVF9ETE0pOworICAgIGlmICh1YXJ0X3JlYWRiKFVBUlRfQkFTRSArIFVBUlRfRExNKSAhPSAoKGRpdmlzb3IgPj4gOCkgJiAweGZmKSkgeworCWdvdG8gb3V0OworICAgIH0KKyAgICB1YXJ0X3dyaXRlYihsY3MsIFVBUlRfQkFTRSArIFVBUlRfTENSKTsKKworICAgIC8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworICAgIHVhcnRfd3JpdGViKDB4MCwgVUFSVF9CQVNFICsgVUFSVF9JRVIpOworCisgICAgLyogZGlzYWJsZSBmaWZvJ3MgKi8KKyAgICB1YXJ0X3dyaXRlYigweDAwLCBVQVJUX0JBU0UgKyBVQVJUX0ZDUik7CisKKyAgICAvKiBTZXQgY2xlYXIgdG8gc2VuZCwgc28gZmxvdyBjb250cm9sIHdvcmtzLi4uICovCisgICAgdWFydF93cml0ZWIoKDEgPDwgMSksIFVBUlRfQkFTRSArIFVBUlRfTUNSKTsKKworICAgIC8qIEZsdXNoIHRoZSBpbnB1dCBidWZmZXIuICovCisgICAgZG8geworCS8qIHJ4IGJ1ZmZlciByZWcKKwkgKiB0aHJvdyBhd2F5ICh1bmNvbmRpdGlvbmFsbHkgdGhlIGZpcnN0IHRpbWUpCisJICovCisJKHZvaWQpdWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX1JCUik7CisJLyogbGluZSBzdGF0dXMgcmVnICovCisJc3RhdHVzID0gdWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX0xTUik7CisgICAgfSB3aGlsZSAoc3RhdHVzICYgVUFSVF9MU1JfRFIpOworb3V0OgorICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dkYnN0dWIvc2VyaWFsLmggYi9jb20zMi9nZGJzdHViL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMjdhNjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9nZGJzdHViL3NlcmlhbC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0dQWEVfU0VSSUFMX0gKKyNkZWZpbmUgX0dQWEVfU0VSSUFMX0gKKworLyoqIEBmaWxlCisgKgorICogU2VyaWFsIGRyaXZlciBmdW5jdGlvbnMKKyAqCisgKi8KKworZXh0ZXJuIHZvaWQgc2VyaWFsX3B1dGMoaW50IGNoKTsKK2V4dGVybiBpbnQgc2VyaWFsX2dldGModm9pZCk7CitleHRlcm4gdm9pZCBzZXJpYWxfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIF9HUFhFX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9nZnhib290L01ha2VmaWxlIGIvY29tMzIvZ2Z4Ym9vdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjRkN2QwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ2Z4Ym9vdC9NYWtlZmlsZQpAQCAtMCwwICsxLDU2IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWUEFUSCA9ICQoU1JDKQoraW5jbHVkZSAkKE1BS0VESVIpL2VsZi5taworCitNT0RVTEVTCSAgPSBnZnhib290LmMzMgorCithbGw6ICQoTU9EVUxFUykKKworT0JKUyA9IGdmeGJvb3QubyByZWFsbW9kZV9jYWxsYmFjay5vCisKK2dmeGJvb3QuZWxmIDogJChPQkpTKSAkKExJQlMpICQoQ19MSUJTKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJF4KKworcmVhbG1vZGVfY2FsbGJhY2subzogcmVhbG1vZGVfY2FsbGJhY2suYXNtCitpZmVxICgkKEFSQ0gpLGkzODYpCisJJChOQVNNKSAtZiBiaW4gLU85OSAtbyAkKi50bXAgLWwgJCoubHN0ICQ8CisJJChPQkpDT1BZKSAtQiBpMzg2IC1JIGJpbmFyeSAtTyBlbGYzMi1pMzg2IFwKKwkgIC0tcmVkZWZpbmUtc3ltIF9iaW5hcnlfJCpfdG1wX3N0YXJ0PSQqX3N0YXJ0IFwKKwkgIC0tcmVkZWZpbmUtc3ltIF9iaW5hcnlfJCpfdG1wX2VuZD0kKl9lbmQgXAorCSAgLS1zdHJpcC1zeW1ib2wgX2JpbmFyeV8kKl90bXBfc2l6ZSBcCisJICAkKi50bXAgJEAKK2VuZGlmCitpZmVxICgkKEFSQ0gpLHg4Nl82NCkKKwkkKE5BU00pIC1mIGJpbiAtTzk5IC1vICQqLnRtcCAtbCAkKi5sc3QgJDwKKwkkKE9CSkNPUFkpIC1CIGkzODY6eDg2LTY0IC1JIGJpbmFyeSAtTyBlbGY2NC14ODYtNjQgXAorCSAgLS1yZWRlZmluZS1zeW0gX2JpbmFyeV8kKl90bXBfc3RhcnQ9JCpfc3RhcnQgXAorCSAgLS1yZWRlZmluZS1zeW0gX2JpbmFyeV8kKl90bXBfZW5kPSQqX2VuZCBcCisJICAtLXN0cmlwLXN5bWJvbCBfYmluYXJ5XyQqX3RtcF9zaXplIFwKKwkgICQqLnRtcCAkQAorZW5kaWYKKwordGlkeSBkaXN0OgorCXJtIC1mICoubyAqLmxvICouYSAqLmxzdCAuKi5kICoudG1wCisKK2NsZWFuOiB0aWR5CisJcm0gLWYgKi5sbngKKworc3BvdGxlc3M6IGNsZWFuCisJcm0gLWYgKi5sc3MgKi5jMzIgKi5jb20KKwlybSAtZiAqfiBcIyoKKworaW5zdGFsbDoKKworLWluY2x1ZGUgLiouZApkaWZmIC0tZ2l0IGEvY29tMzIvZ2Z4Ym9vdC9nZnhib290LmMgYi9jb20zMi9nZnhib290L2dmeGJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjcxMzJjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ2Z4Ym9vdC9nZnhib290LmMKQEAgLTAsMCArMSw5NzYgQEAKKy8qCisgKgorICogZ2Z4Ym9vdC5jCisgKgorICogQSBjb20zMiBtb2R1bGUgdG8gbG9hZCBnZnhib290IGdyYXBoaWNzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBTdGVmZmVuIFdpbnRlcmZlbGR0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsIEJvc3RvbiBNQQorICogMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8c3lzbGludXgvbG9hZGZpbGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9saW51eC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3QuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKworCisvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyNkZWZpbmUgTUFYX0NPTkZJR19MSU5FX0xFTgkyMDQ4CisjZGVmaW5lIE1BWF9DTURMSU5FX0xFTgkJMjA0OAorCisvLyBidWZmZXIgZm9yIHJlYWxtb2RlIGNhbGxiYWNrCisvLyBtdXN0IGJlIGF0IGxlYXN0IGJsb2NrIHNpemU7IGNhbiBpbiB0aGVvcnkgYmUgbGFyZ2VyIHRoYW4gNGssIGJ1dCB0aGVyZSdzCisvLyBub3QgZW5vdWdoIHNwYWNlIGxlZnQKKyNkZWZpbmUgUkVBTE1PREVfQlVGX1NJWkUJNDA5NgorI2RlZmluZSBMT1dNRU1fQlVGX1NJWkUJCTY1NTM2CisKKy8vIGdmeGJvb3Qgd29ya2luZyBtZW1vcnkgaW4gTUIKKyNkZWZpbmUJR0ZYX01FTU9SWV9TSVpFCQk3CisKKy8vIHJlYWQgY2h1bmsgc2l6ZSBmb3IgcHJvZ3Jlc3MgYmFyCisjZGVmaW5lIENIVU5LX1NJWkUJKDY0IDw8IDEwKQorCisvLyBjYWxsYmFjayBmdW5jdGlvbiBudW1iZXJzCisjZGVmaW5lIEdGWF9DQl9JTklUCQkwCisjZGVmaW5lIEdGWF9DQl9ET05FCQkxCisjZGVmaW5lIEdGWF9DQl9JTlBVVAkJMgorI2RlZmluZSBHRlhfQ0JfTUVOVV9JTklUCTMKKyNkZWZpbmUgR0ZYX0NCX0lORk9CT1hfSU5JVAk0CisjZGVmaW5lIEdGWF9DQl9JTkZPQk9YX0RPTkUJNQorI2RlZmluZSBHRlhfQ0JfUFJPR1JFU1NfSU5JVAk2CisjZGVmaW5lIEdGWF9DQl9QUk9HUkVTU19ET05FCTcKKyNkZWZpbmUgR0ZYX0NCX1BST0dSRVNTX1VQREFURQk4CisjZGVmaW5lIEdGWF9DQl9QUk9HUkVTU19MSU1JVAk5CQkvLyB1bnVzZWQKKyNkZWZpbmUgR0ZYX0NCX1BBU1NXT1JEX0lOSVQJMTAKKyNkZWZpbmUgR0ZYX0NCX1BBU1NXT1JEX0RPTkUJMTEKKworLy8gcmVhbCBtb2RlIGNvZGUgY2h1bmssIHdpbGwgYmUgcGxhY2VkIGludG8gbG93bWVtIGJ1ZmZlcgorZXh0ZXJuIGNvbnN0IGNoYXIgcmVhbG1vZGVfY2FsbGJhY2tfc3RhcnRbXSwgcmVhbG1vZGVfY2FsbGJhY2tfZW5kW107CisKKy8vIGdldHMgaW4gdGhlIHdheQorI3VuZGVmIGxpbnV4CisKKworLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisvLyBnZnhib290IGNvbmZpZyBkYXRhICg2NCBieXRlcykKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB7CisgIHVpbnQ4X3QgYm9vdGxvYWRlcjsJCS8vICAwOiBib290IGxvYWRlciB0eXBlICgwOiBsaWxvLCAxOiBzeXNsaW51eCwgMjogZ3J1YikKKyAgdWludDhfdCBzZWN0b3Jfc2hpZnQ7CQkvLyAgMTogc2VjdG9yIHNoaWZ0CisgIHVpbnQ4X3QgbWVkaWFfdHlwZTsJCS8vICAyOiBtZWRpYSB0eXBlICgwOiBkaXNrLCAxOiBmbG9wcHksIDI6IGNkcm9tKQorICB1aW50OF90IGZhaWxzYWZlOwkJLy8gIDM6IHR1cm4gb24gZmFpbHNhZmUgbW9kZSAoYml0bWFzaykKKwkJCQkvLyAgICAwOiBTSElGVCBwcmVzc2VkCisJCQkJLy8gICAgMTogc2tpcCBnZnhib290CisJCQkJLy8gICAgMjogc2tpcCBtb25pdG9yIGRldGVjdGlvbgorICB1aW50OF90IHN5c2NvbmZpZ19zaXplOwkvLyAgNDogc2l6ZSBvZiBzeXNjb25maWcgZGF0YQorICB1aW50OF90IGJvb3RfZHJpdmU7CQkvLyAgNTogQklPUyBib290IGRyaXZlCisgIHVpbnQxNl90IGNhbGxiYWNrOwkJLy8gIDY6IG9mZnNldCB0byBjYWxsYmFjayBoYW5kbGVyCisgIHVpbnQxNl90IGJvb3Rsb2FkZXJfc2VnOwkvLyAgODogY29kZS9kYXRhIHNlZ21lbnQgdXNlZCBieSBib290bG9hZGVyOyBtdXN0IGZvbGxvdyBnZnhfY2FsbGJhY2sKKyAgdWludDE2X3Qgc2VyaWFsX3BvcnQ7CQkvLyAxMDogc3lzbGludXggaW5pdGlhbGl6ZWQgc2VyaWFsIHBvcnQgZnJvbSAnc2VyaWFsJyBvcHRpb24KKyAgdWludDMyX3QgdXNlcl9pbmZvXzA7CQkvLyAxMjogZGF0YSBmb3IgaW5mbyBib3gKKyAgdWludDMyX3QgdXNlcl9pbmZvXzE7CQkvLyAxNjogZGF0YSBmb3IgaW5mbyBib3gKKyAgdWludDMyX3QgYmlvc19tZW1fc2l6ZTsJLy8gMjA6IEJJT1MgbWVtb3J5IHNpemUgKGluIGJ5dGVzKQorICB1aW50MTZfdCB4bWVtXzA7CQkvLyAyNDogZXh0ZW5kZWQgbWVtIGFyZWEgMCAoc3RhcnQ6c2l6ZSBpbiBNQjsgMTI6NCBiaXRzKSAtIG9ic29sZXRlCisgIHVpbnQxNl90IHhtZW1fMTsJCS8vIDI2OiBleHRlbmRlZCBtZW0gYXJlYSAxIC0gb2Jzb2xldGUKKyAgdWludDE2X3QgeG1lbV8yOwkJLy8gMjg6IGV4dGVuZGVkIG1lbSBhcmVhIDIgLSBvYnNvbGV0ZQorICB1aW50MTZfdCB4bWVtXzM7CQkvLyAzMDogZXh0ZW5kZWQgbWVtIGFyZWEgMyAtIG9ic29sZXRlCisgIHVpbnQzMl90IGZpbGU7CQkvLyAzMjogc3RhcnQgb2YgZ2Z4IGZpbGUKKyAgdWludDMyX3QgYXJjaGl2ZV9zdGFydDsJLy8gMzY6IHN0YXJ0IG9mIGNwaW8gYXJjaGl2ZQorICB1aW50MzJfdCBhcmNoaXZlX2VuZDsJCS8vIDQwOiBlbmQgb2YgY3BpbyBhcmNoaXZlCisgIHVpbnQzMl90IG1lbTBfc3RhcnQ7CQkvLyA0NDogbG93IGZyZWUgbWVtb3J5IHN0YXJ0CisgIHVpbnQzMl90IG1lbTBfZW5kOwkJLy8gNDg6IGxvdyBmcmVlIG1lbW9yeSBlbmQKKyAgdWludDMyX3QgeG1lbV9zdGFydDsJCS8vIDUyOiBleHRlbmRlZCBtZW0gc3RhcnQKKyAgdWludDMyX3QgeG1lbV9lbmQ7CQkvLyA1NjogZXh0ZW5kZWQgbWVtIGVuZAorICB1aW50MTZfdCBmZWF0dXJlczsJCS8vIDYwOiBmZWF0dXJlIGZsYWdzIHJldHVybmVkIGJ5IEdGWF9DQl9JTklUCisgIAkJCQkvLyAgICAwOiBHRlhfQ0JfTUVOVV9JTklUIGFjY2VwdHMgMzIgYml0IGFkZHJlc3NlcworICAJCQkJLy8gICAgMToga25vd3MgYWJvdXQgeG1lbV9zdGFydCwgeG1lbV9lbmQKKyAgdWludDE2X3QgcmVzZXJ2ZWRfMTsJCS8vIDYyOgorICB1aW50MzJfdCBnZnhib290X2N3ZDsJCS8vIDY0OiBpZiBzZXQsIHBvaW50cyB0byBjdXJyZW50IGdmeGJvb3Qgd29ya2luZyBkaXJlY3RvcnkgcmVsYXRpdmUKKwkJCQkvLyAgICAgdG8gc3lzbGludXggd29ya2luZyBkaXJlY3RvcnkKK30gZ2Z4X2NvbmZpZ190OworCisKKy8vIGdmeGJvb3QgbWVudSBkZXNjcmlwdGlvbiAoMTggYnl0ZXMpCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgeworICB1aW50MTZfdCBlbnRyaWVzOworICBjaGFyICpkZWZhdWx0X2VudHJ5OworICBjaGFyICpsYWJlbF9saXN0OworICB1aW50MTZfdCBsYWJlbF9zaXplOworICBjaGFyICphcmdfbGlzdDsKKyAgdWludDE2X3QgYXJnX3NpemU7Cit9IGdmeF9tZW51X3Q7CisKKworLy8gbWVudSBkZXNjcmlwdGlvbgordHlwZWRlZiBzdHJ1Y3QgbWVudV9zIHsKKyAgc3RydWN0IG1lbnVfcyAqbmV4dDsKKyAgY2hhciAqbGFiZWw7CQkvLyBjb25maWcgZW50cnkgbmFtZQorICBjaGFyICptZW51X2xhYmVsOwkvLyB0ZXh0IHRvIHNob3cgaW4gYm9vdCBtZW51CisgIGNoYXIgKmtlcm5lbDsJCS8vIG5hbWUgb2YgcHJvZ3JhbSB0byBsb2FkCisgIGNoYXIgKmFsdF9rZXJuZWw7CS8vIGFsdGVybmF0aXZlIG5hbWUgaW4gY2FzZSB1c2VyIGhhcyByZXBsYWNlZCBpdAorICBjaGFyICpsaW51eDsJCS8vIGRlIGZhY3RvIGFuIGFsaWFzIGZvciAna2VybmVsJworICBjaGFyICpsb2NhbGJvb3Q7CS8vIGJvb3QgZnJvbSBsb2NhbCBkaXNrCisgIGNoYXIgKmluaXRyZDsJCS8vIGluaXRyZCBhcyBzZXBhcmF0ZSBsaW5lIChpbnN0ZWFkIG9mIGFzIHBhcnQgb2YgJ2FwcGVuZCcpCisgIGNoYXIgKmFwcGVuZDsJCS8vIGtlcm5lbCBhcmdzCisgIGNoYXIgKmlwYXBwZW5kOwkvLyBhcHBlbmQgc3BlY2lhbCBweGVsaW51eCBhcmdzIChzZWUgZG9jKQorfSBtZW51X3Q7CisKKworLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCitnZnhfY29uZmlnX3QgZ2Z4X2NvbmZpZzsKK2dmeF9tZW51X3QgZ2Z4X21lbnU7CisKK21lbnVfdCAqbWVudTsKK21lbnVfdCAqbWVudV9kZWZhdWx0Oworc3RhdGljIG1lbnVfdCAqbWVudV9wdHIsICoqbWVudV9uZXh0OworCitzdHJ1Y3QgeworICB1aW50MzJfdCBqbXBfdGFibGVbMTJdOworICB1aW50MTZfdCBjb2RlX3NlZzsKKyAgY2hhciBmbmFtZV9idWZbNjRdOworfSBnZng7CisKK3ZvaWQgKmxvd21lbV9idWY7CisKK2ludCB0aW1lb3V0OworCitjaGFyIGNtZGxpbmVbTUFYX0NNRExJTkVfTEVOXTsKKworLy8gcHJvZ3Jlc3MgYmFyIGlzIHZpc2libGUKK3Vuc2lnbmVkIHByb2dyZXNzX2FjdGl2ZTsKKworCisvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KK3ZvaWQgc2hvd19tZXNzYWdlKGNoYXIgKmZpbGUpOworY2hhciAqZ2V0X2NvbmZpZ19maWxlX25hbWUodm9pZCk7CitjaGFyICpza2lwX25vbnNwYWNlcyhjaGFyICpzKTsKK3ZvaWQgY2hvcF9saW5lKGNoYXIgKnMpOworaW50IHJlYWRfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwordW5zaWduZWQgbWFnaWNfb2sodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCAqY29kZV9zaXplKTsKK3Vuc2lnbmVkIGZpbmRfZmlsZSh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgKmdmeF9maWxlX3N0YXJ0LCB1bnNpZ25lZCAqZmlsZV9sZW4sIHVuc2lnbmVkICpjb2RlX3NpemUpOworaW50IGdmeF9pbml0KGNoYXIgKmZpbGUpOworaW50IGdmeF9tZW51X2luaXQodm9pZCk7Cit2b2lkIGdmeF9kb25lKHZvaWQpOworaW50IGdmeF9pbnB1dCh2b2lkKTsKK3ZvaWQgZ2Z4X2luZm9ib3goaW50IHR5cGUsIGNoYXIgKnN0cjEsIGNoYXIgKnN0cjIpOwordm9pZCBnZnhfcHJvZ3Jlc3NfaW5pdChzc2l6ZV90IGtlcm5lbF9zaXplLCBjaGFyICpsYWJlbCk7Cit2b2lkIGdmeF9wcm9ncmVzc191cGRhdGUoc3NpemVfdCBzaXplKTsKK3ZvaWQgZ2Z4X3Byb2dyZXNzX2RvbmUodm9pZCk7Cit2b2lkICpsb2FkX29uZShjaGFyICpmaWxlLCBzc2l6ZV90ICpmaWxlX3NpemUpOwordm9pZCBib290KGludCBpbmRleCk7Cit2b2lkIGJvb3RfZW50cnkobWVudV90ICptZW51X3B0ciwgY2hhciAqYXJnKTsKKworCisvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IG1lbnVfaW5kZXg7CisgIGNvbnN0IHVuaW9uIHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbyAqc2RpOworICBjaGFyIHdvcmtpbmdfZGlyWzI1Nl07CisKKyAgb3BlbmNvbnNvbGUoJmRldl9zdGRjb25fciwgJmRldl9zdGRjb25fdyk7CisKKyAgbG93bWVtX2J1ZiA9IGxtYWxsb2MoTE9XTUVNX0JVRl9TSVpFKTsKKyAgaWYgKCFsb3dtZW1fYnVmKSB7CisgICAgcHJpbnRmKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzZGkgPSBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8oKTsKKworICBnZnhfY29uZmlnLnNlY3Rvcl9zaGlmdCA9IHNkaS0+ZGlzay5zZWN0b3Jfc2hpZnQ7CisgIGdmeF9jb25maWcuYm9vdF9kcml2ZSA9IHNkaS0+ZGlzay5kcml2ZV9udW1iZXI7CisKKyAgaWYoc2RpLT5jLmZpbGVzeXN0ZW0gPT0gU1lTTElOVVhfRlNfUFhFTElOVVgpIHsKKyAgICBnZnhfY29uZmlnLnNlY3Rvcl9zaGlmdCA9IDExOworICAgIGdmeF9jb25maWcuYm9vdF9kcml2ZSA9IDA7CisgIH0KKworICBnZnhfY29uZmlnLm1lZGlhX3R5cGUgPSBnZnhfY29uZmlnLmJvb3RfZHJpdmUgPCAweDgwID8gMSA6IDA7CisKKyAgaWYoc2RpLT5jLmZpbGVzeXN0ZW0gPT0gU1lTTElOVVhfRlNfSVNPTElOVVgpIHsKKyAgICBnZnhfY29uZmlnLm1lZGlhX3R5cGUgPSBzZGktPmlzby5jZF9tb2RlID8gMCA6IDI7CisgIH0KKworICBnZnhfY29uZmlnLmJvb3Rsb2FkZXIgPSAxOworICBnZnhfY29uZmlnLnN5c2NvbmZpZ19zaXplID0gc2l6ZW9mIGdmeF9jb25maWc7CisgIGdmeF9jb25maWcuYm9vdGxvYWRlcl9zZWcgPSAwOwkvLyBhcHBhcmVudGx5IG5vdCBuZWVkZWQKKworICBpZihhcmdjIDwgMikgeworICAgIHByaW50ZigiVXNhZ2U6IGdmeGJvb3QuYzMyIGJvb3Rsb2dvX2ZpbGUgW21lc3NhZ2VfZmlsZV1cbiIpOworICAgIGlmKGFyZ2MgPiAyKSBzaG93X21lc3NhZ2UoYXJndlsyXSk7CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmKHJlYWRfY29uZmlnX2ZpbGUoIn4iKSkgeworICAgIHByaW50ZigiRXJyb3IgcmVhZGluZyBjb25maWcgZmlsZVxuIik7CisgICAgaWYoYXJnYyA+IDIpIHNob3dfbWVzc2FnZShhcmd2WzJdKTsKKworICAgIHJldHVybiAwOworICB9CisKKyAgaWYoZ2V0Y3dkKHdvcmtpbmdfZGlyLCBzaXplb2Ygd29ya2luZ19kaXIpKSB7CisgICAgZ2Z4X2NvbmZpZy5nZnhib290X2N3ZCA9ICh1aW50MzJfdCkgd29ya2luZ19kaXI7CisgIH0KKworICBpZihnZnhfaW5pdChhcmd2WzFdKSkgeworICAgIHByaW50ZigiRXJyb3Igc2V0dGluZyB1cCBnZnhib290XG4iKTsKKyAgICBpZihhcmdjID4gMikgc2hvd19tZXNzYWdlKGFyZ3ZbMl0pOworCisgICAgcmV0dXJuIDA7CisgIH0KKworICBnZnhfbWVudV9pbml0KCk7CisKKyAgZm9yKDs7KSB7CisgICAgbWVudV9pbmRleCA9IGdmeF9pbnB1dCgpOworCisgICAgLy8gYWJvcnQgZ2Z4LCByZXR1cm4gdG8gdGV4dCBtb2RlIHByb21wdAorICAgIGlmKG1lbnVfaW5kZXggPT0gLTEpIHsKKyAgICAgIGdmeF9kb25lKCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBkb2VzIG5vdCByZXR1cm4gaWYgaXQgc3VjY2VlZHMKKyAgICBib290KG1lbnVfaW5kZXgpOworICB9CisKKyAgaWYoYXJnYyA+IDIpIHNob3dfbWVzc2FnZShhcmd2WzJdKTsKKworICByZXR1cm4gMDsKK30KKworCisvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KK3ZvaWQgc2hvd19tZXNzYWdlKGNoYXIgKmZpbGUpCit7CisgIGludCBjOworICBGSUxFICpmOworCisgIGlmKCEoZiA9IGZvcGVuKGZpbGUsICJyIikpKSByZXR1cm47CisKKyAgd2hpbGUoKGMgPSBnZXRjKGYpKSAhPSBFT0YpIHsKKyAgICBpZihjIDwgJyAnICYmIGMgIT0gJ1xuJyAmJiBjICE9ICdcdCcpIGNvbnRpbnVlOworICAgIHByaW50ZigiJWMiLCBjKTsKKyAgfQorCisgIGZjbG9zZShmKTsKK30KKworCisvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KK2NoYXIgKnNraXBfbm9uc3BhY2VzKGNoYXIgKnMpCit7CisgIHdoaWxlKCpzICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKSBzKys7CisKKyAgcmV0dXJuIHM7Cit9CisKKworLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCit2b2lkIGNob3BfbGluZShjaGFyICpzKQoreworICBpbnQgaSA9IHN0cmxlbihzKTsKKworICBpZighaSkgcmV0dXJuOworCisgIHdoaWxlKC0taSA+PSAwKSB7CisgICAgaWYoc1tpXSA9PSAnICcgfHwgc1tpXSA9PSAnXHQnIHx8IHNbaV0gPT0gJ1xuJykgeworICAgICAgc1tpXSA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKworLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisvLyBSZWFkIGFuZCBwYXJzZSBzeXNsaW51eCBjb25maWcgZmlsZS4KKy8vCisvLyByZXR1cm46CisvLyAgIDA6IG9rLCAxOiBlcnJvcgorLy8KK2ludCByZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICBGSUxFICpmOworICBjaGFyICpzLCAqdCwgYnVmW01BWF9DT05GSUdfTElORV9MRU5dOworICB1bnNpZ25lZCB1LCB0b3BfbGV2ZWwgPSAwLCB0ZXh0ID0gMDsKKworICBpZighc3RyY21wKGZpbGVuYW1lLCAifiIpKSB7CisgICAgdG9wX2xldmVsID0gMTsKKyAgICBmaWxlbmFtZSA9IHN5c2xpbnV4X2NvbmZpZ19maWxlKCk7CisgICAgZ2Z4X21lbnUuZW50cmllcyA9IDA7CisgICAgZ2Z4X21lbnUubGFiZWxfc2l6ZSA9IDA7CisgICAgZ2Z4X21lbnUuYXJnX3NpemUgPSAwOworICAgIG1lbnVfcHRyID0gTlVMTDsKKyAgICBtZW51X25leHQgPSAmbWVudTsKKyAgICBtZW51X2RlZmF1bHQgPSBjYWxsb2MoMSwgc2l6ZW9mICptZW51X2RlZmF1bHQpOworICB9CisKKyAgaWYoIShmID0gZm9wZW4oZmlsZW5hbWUsICJyIikpKSByZXR1cm4gMTsKKworICB3aGlsZSgocyA9IGZnZXRzKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZikpKSB7CisgICAgY2hvcF9saW5lKHMpOworICAgIHMgPSBza2lwc3BhY2Uocyk7CisgICAgaWYoISpzIHx8ICpzID09ICcjJykgY29udGludWU7CisgICAgdCA9IHNraXBfbm9uc3BhY2VzKHMpOworICAgIGlmKCp0KSAqdCsrID0gMDsKKyAgICB0ID0gc2tpcHNwYWNlKHQpOworCisgICAgaWYoIXN0cmNhc2VjbXAocywgImVuZHRleHQiKSkgeworICAgICAgdGV4dCA9IDA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAodGV4dCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYoIXN0cmNhc2VjbXAocywgInRpbWVvdXQiKSkgeworICAgICAgdGltZW91dCA9IGF0b2kodCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZighc3RyY2FzZWNtcChzLCAiZGVmYXVsdCIpKSB7CisgICAgICBtZW51X2RlZmF1bHQtPmxhYmVsID0gc3RyZHVwKHQpOworICAgICAgdSA9IHN0cmxlbih0KTsKKyAgICAgIGlmKHUgPiBnZnhfbWVudS5sYWJlbF9zaXplKSBnZnhfbWVudS5sYWJlbF9zaXplID0gdTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmKCFzdHJjYXNlY21wKHMsICJsYWJlbCIpKSB7CisgICAgICBtZW51X3B0ciA9ICptZW51X25leHQgPSBjYWxsb2MoMSwgc2l6ZW9mICoqbWVudV9uZXh0KTsKKyAgICAgIG1lbnVfbmV4dCA9ICZtZW51X3B0ci0+bmV4dDsKKyAgICAgIGdmeF9tZW51LmVudHJpZXMrKzsKKyAgICAgIG1lbnVfcHRyLT5sYWJlbCA9IG1lbnVfcHRyLT5tZW51X2xhYmVsID0gc3RyZHVwKHQpOworICAgICAgdSA9IHN0cmxlbih0KTsKKyAgICAgIGlmKHUgPiBnZnhfbWVudS5sYWJlbF9zaXplKSBnZnhfbWVudS5sYWJlbF9zaXplID0gdTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmKCFzdHJjYXNlY21wKHMsICJrZXJuZWwiKSAmJiBtZW51X3B0cikgeworICAgICAgbWVudV9wdHItPmtlcm5lbCA9IHN0cmR1cCh0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmKCFzdHJjYXNlY21wKHMsICJsaW51eCIpICYmIG1lbnVfcHRyKSB7CisgICAgICBtZW51X3B0ci0+bGludXggPSBzdHJkdXAodCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZighc3RyY2FzZWNtcChzLCAibG9jYWxib290IikgJiYgbWVudV9wdHIpIHsKKyAgICAgIG1lbnVfcHRyLT5sb2NhbGJvb3QgPSBzdHJkdXAodCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZighc3RyY2FzZWNtcChzLCAiaW5pdHJkIikgJiYgbWVudV9wdHIpIHsKKyAgICAgIG1lbnVfcHRyLT5pbml0cmQgPSBzdHJkdXAodCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZighc3RyY2FzZWNtcChzLCAiYXBwZW5kIikpIHsKKyAgICAgIChtZW51X3B0ciA/OiBtZW51X2RlZmF1bHQpLT5hcHBlbmQgPSBzdHJkdXAodCk7CisgICAgICB1ID0gc3RybGVuKHQpOworICAgICAgaWYodSA+IGdmeF9tZW51LmFyZ19zaXplKSBnZnhfbWVudS5hcmdfc2l6ZSA9IHU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZighc3RyY2FzZWNtcChzLCAiaXBhcHBlbmQiKSB8fCAhc3RyY2FzZWNtcChzLCAic3lzYXBwZW5kIikpIHsKKyAgICAgIChtZW51X3B0ciA/OiBtZW51X2RlZmF1bHQpLT5pcGFwcGVuZCA9IHN0cmR1cCh0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmKCFzdHJjYXNlY21wKHMsICJ0ZXh0IikpIHsKKyAgICAgIHRleHQgPSAxOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYoIXN0cmNhc2VjbXAocywgIm1lbnUiKSAmJiBtZW51X3B0cikgeworICAgICAgcyA9IHNraXBzcGFjZSh0KTsKKyAgICAgIHQgPSBza2lwX25vbnNwYWNlcyhzKTsKKyAgICAgIGlmKCp0KSAqdCsrID0gMDsKKyAgICAgIHQgPSBza2lwc3BhY2UodCk7CisKKyAgICAgIGlmKCFzdHJjYXNlY21wKHMsICJsYWJlbCIpKSB7CisgICAgICAgIG1lbnVfcHRyLT5tZW51X2xhYmVsID0gc3RyZHVwKHQpOworICAgICAgICB1ID0gc3RybGVuKHQpOworICAgICAgICBpZih1ID4gZ2Z4X21lbnUubGFiZWxfc2l6ZSkgZ2Z4X21lbnUubGFiZWxfc2l6ZSA9IHU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZighc3RyY2FzZWNtcChzLCAiaW5jbHVkZSIpKSB7CisgICAgICAgIGdvdG8gZG9faW5jbHVkZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN0cmNhc2VjbXAocywgImluY2x1ZGUiKSkgeworZG9faW5jbHVkZToKKyAgICAgIHMgPSB0OworICAgICAgdCA9IHNraXBfbm9uc3BhY2VzKHMpOworICAgICAgaWYgKCp0KSAqdCA9IDA7CisgICAgICByZWFkX2NvbmZpZ19maWxlKHMpOworICAgIH0KKyAgfQorCisgIGZjbG9zZShmKTsKKworICBpZiAoIXRvcF9sZXZlbCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoZ2Z4X21lbnUuZW50cmllcyA9PSAwKSB7CisgICAgcHJpbnRmKCJObyBMQUJFTCBrZXl3b3JkcyBmb3VuZC5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gZmluYWwgJ1wwJworICBnZnhfbWVudS5sYWJlbF9zaXplKys7CisgIGdmeF9tZW51LmFyZ19zaXplKys7CisKKyAgLy8gZW5zdXJlIHdlIGhhdmUgYSBkZWZhdWx0IGVudHJ5CisgIGlmKCFtZW51X2RlZmF1bHQtPmxhYmVsKSBtZW51X2RlZmF1bHQtPmxhYmVsID0gbWVudS0+bGFiZWw7CisKKyAgaWYobWVudV9kZWZhdWx0LT5sYWJlbCkgeworICAgIGZvcihtZW51X3B0ciA9IG1lbnU7IG1lbnVfcHRyOyBtZW51X3B0ciA9IG1lbnVfcHRyLT5uZXh0KSB7CisgICAgICBpZighc3RyY21wKG1lbnVfZGVmYXVsdC0+bGFiZWwsIG1lbnVfcHRyLT5sYWJlbCkpIHsKKyAgICAgICAgbWVudV9kZWZhdWx0LT5tZW51X2xhYmVsID0gbWVudV9wdHItPm1lbnVfbGFiZWw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGdmeF9tZW51LmRlZmF1bHRfZW50cnkgPSBtZW51X2RlZmF1bHQtPm1lbnVfbGFiZWw7CisgIGdmeF9tZW51LmxhYmVsX2xpc3QgPSBjYWxsb2MoZ2Z4X21lbnUuZW50cmllcywgZ2Z4X21lbnUubGFiZWxfc2l6ZSk7CisgIGdmeF9tZW51LmFyZ19saXN0ID0gY2FsbG9jKGdmeF9tZW51LmVudHJpZXMsIGdmeF9tZW51LmFyZ19zaXplKTsKKworICBmb3IodSA9IDAsIG1lbnVfcHRyID0gbWVudTsgbWVudV9wdHI7IG1lbnVfcHRyID0gbWVudV9wdHItPm5leHQsIHUrKykgeworICAgIGlmKCFtZW51X3B0ci0+YXBwZW5kKSBtZW51X3B0ci0+YXBwZW5kID0gbWVudV9kZWZhdWx0LT5hcHBlbmQ7CisgICAgaWYoIW1lbnVfcHRyLT5pcGFwcGVuZCkgbWVudV9wdHItPmlwYXBwZW5kID0gbWVudV9kZWZhdWx0LT5pcGFwcGVuZDsKKworICAgIGlmKG1lbnVfcHRyLT5tZW51X2xhYmVsKSBzdHJjcHkoZ2Z4X21lbnUubGFiZWxfbGlzdCArIHUgKiBnZnhfbWVudS5sYWJlbF9zaXplLCBtZW51X3B0ci0+bWVudV9sYWJlbCk7CisgICAgaWYobWVudV9wdHItPmFwcGVuZCkgc3RyY3B5KGdmeF9tZW51LmFyZ19saXN0ICsgdSAqIGdmeF9tZW51LmFyZ19zaXplLCBtZW51X3B0ci0+YXBwZW5kKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKKy8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorLy8gQ2hlY2sgaGVhZGVyIGFuZCByZXR1cm4gY29kZSBzdGFydCBvZmZzZXQuCisvLwordW5zaWduZWQgbWFnaWNfb2sodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCAqY29kZV9zaXplKQoreworICBpZigKKyAgICAqKHVuc2lnbmVkICopIGJ1ZiA9PSAweDBiMmQ5N2YwMCAmJgkJLy8gbWFnaWMgaWQKKyAgICAoYnVmWzRdID09IDgpCQkJCS8vIHZlcnNpb24gOAorICApIHsKKyAgICAqY29kZV9zaXplID0gKih1bnNpZ25lZCAqKSAoYnVmICsgMTIpOworICAgIHJldHVybiAqKHVuc2lnbmVkICopIChidWYgKyA4KTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKKy8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorLy8gU2VhcmNoIChjcGlvIGFyY2hpdmUpIGZvciBnZnggZmlsZS4KKy8vCit1bnNpZ25lZCBmaW5kX2ZpbGUodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkICpnZnhfZmlsZV9zdGFydCwgdW5zaWduZWQgKmZpbGVfbGVuLCB1bnNpZ25lZCAqY29kZV9zaXplKQoreworICB1bnNpZ25lZCBpLCBmbmFtZV9sZW4sIGNvZGVfc3RhcnQgPSAwOworCisgICpnZnhfZmlsZV9zdGFydCA9IDA7CisgICpjb2RlX3NpemUgPSAwOworCisgIGlmKChjb2RlX3N0YXJ0ID0gbWFnaWNfb2soYnVmLCBjb2RlX3NpemUpKSkgcmV0dXJuIGNvZGVfc3RhcnQ7CisKKyAgZm9yKGkgPSAwOyBpIDwgbGVuOykgeworICAgIGlmKChsZW4gLSBpKSA+PSAweDFhICYmIChidWZbaV0gKyAoYnVmW2kgKyAxXSA8PCA4KSkgPT0gMHg3MWM3KSB7CisgICAgICBmbmFtZV9sZW4gPSAqKHVuc2lnbmVkIHNob3J0ICopIChidWYgKyBpICsgMjApOworICAgICAgKmZpbGVfbGVuID0gKih1bnNpZ25lZCBzaG9ydCAqKSAoYnVmICsgaSArIDI0KSArICgqKHVuc2lnbmVkIHNob3J0ICopIChidWYgKyBpICsgMjIpIDw8IDE2KTsKKyAgICAgIGkgKz0gMjYgKyBmbmFtZV9sZW47CisgICAgICBpID0gKChpICsgMSkgJiB+MSk7CisgICAgICBpZigoY29kZV9zdGFydCA9IG1hZ2ljX29rKGJ1ZiArIGksIGNvZGVfc2l6ZSkpKSB7CisgICAgICAgICpnZnhfZmlsZV9zdGFydCA9IGk7CisgICAgICAgIHJldHVybiBjb2RlX3N0YXJ0OworICAgICAgfQorICAgICAgaSArPSAqZmlsZV9sZW47CisgICAgICBpID0gKChpICsgMSkgJiB+MSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGNvZGVfc3RhcnQ7Cit9CisKKworLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisvLyBJbml0aWFsaXplIGdmeGJvb3QgY29kZS4KKy8vCisvLyByZXR1cm46CisvLyAgIDA6IG9rLCAxOiBlcnJvcgorLy8KK2ludCBnZnhfaW5pdChjaGFyICpmaWxlKQoreworICBzaXplX3QgYXJjaGl2ZV9zaXplID0gMDsKKyAgdm9pZCAqYXJjaGl2ZTsKKyAgdW5zaWduZWQgY29kZV9zdGFydCwgY29kZV9zaXplLCBmaWxlX3N0YXJ0LCBmaWxlX2xlbiwgdTsKKyAgY29tMzJzeXNfdCByOworICB2b2lkICpsb3dtZW0gPSBsb3dtZW1fYnVmOworICB1bnNpZ25lZCBsb3dtZW1fc2l6ZSA9IExPV01FTV9CVUZfU0laRTsKKworICBtZW1zZXQoJnIsMCxzaXplb2YocikpOworICBwcm9ncmVzc19hY3RpdmUgPSAwOworCisgIHByaW50ZigiTG9hZGluZyAlcy4uLlxuIiwgZmlsZSk7CisgIGlmKGxvYWRmaWxlKGZpbGUsICZhcmNoaXZlLCAmYXJjaGl2ZV9zaXplKSkgcmV0dXJuIDE7CisKKyAgaWYoIWFyY2hpdmVfc2l6ZSkgcmV0dXJuIDE7CisKKyAgLy8gcHJpbnRmKCIlczogJWRcbiIsIGZpbGUsIGFyY2hpdmVfc2l6ZSk7CisKKyAgZ2Z4X2NvbmZpZy5hcmNoaXZlX3N0YXJ0ID0gKHVpbnQzMl90KSBhcmNoaXZlOworICBnZnhfY29uZmlnLmFyY2hpdmVfZW5kID0gZ2Z4X2NvbmZpZy5hcmNoaXZlX3N0YXJ0ICsgYXJjaGl2ZV9zaXplOworCisgIC8vIGxvY2F0ZSBmaWxlIGluc2lkZSBjcGlvIGFyY2hpdmUKKyAgaWYoIShjb2RlX3N0YXJ0ID0gZmluZF9maWxlKGFyY2hpdmUsIGFyY2hpdmVfc2l6ZSwgJmZpbGVfc3RhcnQsICZmaWxlX2xlbiwgJmNvZGVfc2l6ZSkpKSB7CisgICAgcHJpbnRmKCIlczogaW52YWxpZCBmaWxlIGZvcm1hdFxuIiwgZmlsZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworI2lmIDAKKyAgcHJpbnRmKAorICAgICJjb2RlX3N0YXJ0ID0gMHgleCwgY29kZV9zaXplID0gMHgleFxuIgorICAgICJhcmNoaXZlX3N0YXJ0ID0gMHgleCwgYXJjaGl2ZSBzaXplID0gMHgleFxuIgorICAgICJmaWxlX3N0YXJ0ID0gMHgleCwgZmlsZV9sZW4gPSAweCV4XG4iLAorICAgIGNvZGVfc3RhcnQsIGNvZGVfc2l6ZSwKKyAgICBnZnhfY29uZmlnLmFyY2hpdmVfc3RhcnQsIGFyY2hpdmVfc2l6ZSwKKyAgICBmaWxlX3N0YXJ0LCBmaWxlX2xlbgorICApOworI2VuZGlmCisKKyAgZ2Z4X2NvbmZpZy5maWxlID0gZ2Z4X2NvbmZpZy5hcmNoaXZlX3N0YXJ0ICsgZmlsZV9zdGFydDsKKworICB1ID0gcmVhbG1vZGVfY2FsbGJhY2tfZW5kIC0gcmVhbG1vZGVfY2FsbGJhY2tfc3RhcnQ7CisgIHUgPSAodSArIFJFQUxNT0RFX0JVRl9TSVpFICsgMHhmKSAmIH4weGY7CisKKyAgaWYodSArIGNvZGVfc2l6ZSA+IGxvd21lbV9zaXplKSB7CisgICAgcHJpbnRmKCJsb3dtZW0gYnVmZmVyIHRvbyBzbWFsbDogc2l6ZSAldSwgbmVlZGVkICV1XG4iLCBsb3dtZW1fc2l6ZSwgdSArIGNvZGVfc2l6ZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBtZW1jcHkobG93bWVtICsgUkVBTE1PREVfQlVGX1NJWkUsIHJlYWxtb2RlX2NhbGxiYWNrX3N0YXJ0LAorCSByZWFsbW9kZV9jYWxsYmFja19lbmQgLSByZWFsbW9kZV9jYWxsYmFja19zdGFydCk7CisKKyAgLy8gZmlsbCBpbiBidWZmZXIgc2l6ZSBhbmQgbG9jYXRpb24KKyAgKih1aW50MTZfdCAqKSAobG93bWVtICsgUkVBTE1PREVfQlVGX1NJWkUpID0gUkVBTE1PREVfQlVGX1NJWkU7CisgICoodWludDE2X3QgKikgKGxvd21lbSArIFJFQUxNT0RFX0JVRl9TSVpFICsgMikgPSAodWludDMyX3QpIGxvd21lbSA+PiA0OworCisgIGdmeF9jb25maWcuYm9vdGxvYWRlcl9zZWcgPSAoKHVpbnQzMl90KSBsb3dtZW0gKyBSRUFMTU9ERV9CVUZfU0laRSkgPj4gNDsKKyAgZ2Z4X2NvbmZpZy5jYWxsYmFjayA9IDQ7CS8vIHN0YXJ0IGFkZHJlc3MKKworICBsb3dtZW0gKz0gdTsKKyAgbG93bWVtX3NpemUgLT0gdTsKKworICBtZW1jcHkobG93bWVtLCBhcmNoaXZlICsgZmlsZV9zdGFydCArIGNvZGVfc3RhcnQsIGNvZGVfc2l6ZSk7CisKKyAgZ2Z4X2NvbmZpZy5tZW0wX3N0YXJ0ID0gKHVpbnQzMl90KSBsb3dtZW0gKyBjb2RlX3NpemU7CisgIGdmeF9jb25maWcubWVtMF9lbmQgPSAodWludDMyX3QpIGxvd21lbSArIGxvd21lbV9zaXplOworICAvLyBhbGlnbiBhIGJpdAorICBnZnhfY29uZmlnLm1lbTBfc3RhcnQgPSAoZ2Z4X2NvbmZpZy5tZW0wX3N0YXJ0ICsgMHhmKSAmIH4weGY7CisKKyAgZ2Z4X2NvbmZpZy54bWVtX3N0YXJ0ID0gKHVpbnQzMl90KSBtYWxsb2MoR0ZYX01FTU9SWV9TSVpFIDw8IDIwKTsKKyAgaWYoZ2Z4X2NvbmZpZy54bWVtX3N0YXJ0KSB7CisgICAgZ2Z4X2NvbmZpZy54bWVtX2VuZCA9IGdmeF9jb25maWcueG1lbV9zdGFydCArIChHRlhfTUVNT1JZX1NJWkUgPDwgMjApOworICB9CisKKyAgLy8gZmFrZTsgbm90IHVzZWQgYW55d2F5CisgIGdmeF9jb25maWcuYmlvc19tZW1fc2l6ZSA9IDI1NiA8PCAyMDsKKworICBnZnguY29kZV9zZWcgPSAodWludDMyX3QpIGxvd21lbSA+PiA0OworCisgIGZvcih1ID0gMDsgdSA8IHNpemVvZiBnZnguam1wX3RhYmxlIC8gc2l6ZW9mICpnZnguam1wX3RhYmxlOyB1KyspIHsKKyAgICBnZnguam1wX3RhYmxlW3VdID0gKGdmeC5jb2RlX3NlZyA8PCAxNikgKyAqKHVpbnQxNl90ICopIChsb3dtZW0gKyAyICogdSk7CisgIH0KKworI2lmIDAKKyAgZm9yKHUgPSAwOyB1IDwgc2l6ZW9mIGdmeC5qbXBfdGFibGUgLyBzaXplb2YgKmdmeC5qbXBfdGFibGU7IHUrKykgeworICAgIHByaW50ZigiJWQ6IDB4JTA4eFxuIiwgdSwgZ2Z4LmptcF90YWJsZVt1XSk7CisgIH0KKyNlbmRpZgorCisgIC8vIHdlIGFyZSByZWFkeSB0byBzdGFydAorCisgIHIuZXNpLmwgPSAodWludDMyX3QpICZnZnhfY29uZmlnOworICBfX2ZhcmNhbGwoZ2Z4LmNvZGVfc2VnLCBnZnguam1wX3RhYmxlW0dGWF9DQl9JTklUXSwgJnIsICZyKTsKKworICBpZigoci5lZmxhZ3MubCAmIEVGTEFHU19DRikpIHsKKyAgICBwcmludGYoImdyYXBoaWNzIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmKChnZnhfY29uZmlnLmZlYXR1cmVzICYgMykgIT0gMykgeworICAgIGdmeF9kb25lKCk7CisKKyAgICBwcmludGYoIiVzOiBib290IGdyYXBoaWNzIGNvZGUgdG9vIG9sZCwgcGxlYXNlIHVzZSBuZXdlciB2ZXJzaW9uXG4iLCBmaWxlKTsKKworICAgIHJldHVybiAxOworICB9CisKKworICByZXR1cm4gMDsKK30KKworCisvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KK2ludCBnZnhfbWVudV9pbml0KHZvaWQpCit7CisgIGNvbTMyc3lzX3QgcjsKKworICBtZW1zZXQoJnIsMCxzaXplb2YocikpOworICByLmVzaS5sID0gKHVpbnQzMl90KSAmZ2Z4X21lbnU7CisgIF9fZmFyY2FsbChnZnguY29kZV9zZWcsIGdmeC5qbXBfdGFibGVbR0ZYX0NCX01FTlVfSU5JVF0sICZyLCAmcik7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCit2b2lkIGdmeF9kb25lKHZvaWQpCit7CisgIGNvbTMyc3lzX3QgcjsKKworICBtZW1zZXQoJnIsMCxzaXplb2YocikpOworICBnZnhfcHJvZ3Jlc3NfZG9uZSgpOworCisgIF9fZmFyY2FsbChnZnguY29kZV9zZWcsIGdmeC5qbXBfdGFibGVbR0ZYX0NCX0RPTkVdLCAmciwgJnIpOworfQorCisKKy8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorLy8gUnVuIGdmeGJvb3QgbWFpbiBsb29wLgorLy8KKy8vIHJldHVybjoKKy8vICAgYm9vdCBtZW51IGluZGV4ICgtMTogZ28gdG8gdGV4dCBtb2RlIHByb21wdCkKKy8vCitpbnQgZ2Z4X2lucHV0KHZvaWQpCit7CisgIGNvbTMyc3lzX3QgcjsKKworICBtZW1zZXQoJnIsMCxzaXplb2YocikpOworICByLmVkaS5sID0gKHVpbnQzMl90KSBjbWRsaW5lOworICByLmVjeC5sID0gc2l6ZW9mIGNtZGxpbmU7CisgIHIuZWF4LmwgPSB0aW1lb3V0ICogMTgyIC8gMTAwOworICB0aW1lb3V0ID0gMDsJCS8vIHVzZSB0aW1lb3V0IG9ubHkgZmlyc3QgdGltZQorICBfX2ZhcmNhbGwoZ2Z4LmNvZGVfc2VnLCBnZnguam1wX3RhYmxlW0dGWF9DQl9JTlBVVF0sICZyLCAmcik7CisgIGlmKChyLmVmbGFncy5sICYgRUZMQUdTX0NGKSkgci5lYXgubCA9IDE7CisKKyAgaWYoci5lYXgubCA9PSAxKSByZXR1cm4gLTE7CisKKyAgcmV0dXJuIHIuZWJ4Lmw7Cit9CisKKworLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCit2b2lkIGdmeF9pbmZvYm94KGludCB0eXBlLCBjaGFyICpzdHIxLCBjaGFyICpzdHIyKQoreworICBjb20zMnN5c190IHI7CisKKyAgbWVtc2V0KCZyLDAsc2l6ZW9mKHIpKTsKKyAgci5lYXgubCA9IHR5cGU7CisgIHIuZXNpLmwgPSAodWludDMyX3QpIHN0cjE7CisgIHIuZWRpLmwgPSAodWludDMyX3QpIHN0cjI7CisgIF9fZmFyY2FsbChnZnguY29kZV9zZWcsIGdmeC5qbXBfdGFibGVbR0ZYX0NCX0lORk9CT1hfSU5JVF0sICZyLCAmcik7CisgIHIuZWRpLmwgPSByLmVheC5sID0gMDsKKyAgX19mYXJjYWxsKGdmeC5jb2RlX3NlZywgZ2Z4LmptcF90YWJsZVtHRlhfQ0JfSU5QVVRdLCAmciwgJnIpOworICBfX2ZhcmNhbGwoZ2Z4LmNvZGVfc2VnLCBnZnguam1wX3RhYmxlW0dGWF9DQl9JTkZPQk9YX0RPTkVdLCAmciwgJnIpOworfQorCisKKy8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQordm9pZCBnZnhfcHJvZ3Jlc3NfaW5pdChzc2l6ZV90IGtlcm5lbF9zaXplLCBjaGFyICpsYWJlbCkKK3sKKyAgY29tMzJzeXNfdCByOworCisgIG1lbXNldCgmciwwLHNpemVvZihyKSk7CisgIGlmKCFwcm9ncmVzc19hY3RpdmUpIHsKKyAgICByLmVheC5sID0ga2VybmVsX3NpemUgPj4gZ2Z4X2NvbmZpZy5zZWN0b3Jfc2hpZnQ7CQkvLyBpbiBzZWN0b3JzCisgICAgci5lc2kubCA9ICh1aW50MzJfdCkgbGFiZWw7CisgICAgX19mYXJjYWxsKGdmeC5jb2RlX3NlZywgZ2Z4LmptcF90YWJsZVtHRlhfQ0JfUFJPR1JFU1NfSU5JVF0sICZyLCAmcik7CisgIH0KKworICBwcm9ncmVzc19hY3RpdmUgPSAxOworfQorCisKKy8vIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQordm9pZCBnZnhfcHJvZ3Jlc3NfdXBkYXRlKHNzaXplX3QgYWR2YW5jZSkKK3sKKyAgY29tMzJzeXNfdCByOworCisgIG1lbXNldCgmciwwLHNpemVvZihyKSk7CisgIGlmKHByb2dyZXNzX2FjdGl2ZSkgeworICAgIHIuZWF4LmwgPSBhZHZhbmNlID4+IGdmeF9jb25maWcuc2VjdG9yX3NoaWZ0OwkJLy8gaW4gc2VjdG9ycworICAgIF9fZmFyY2FsbChnZnguY29kZV9zZWcsIGdmeC5qbXBfdGFibGVbR0ZYX0NCX1BST0dSRVNTX1VQREFURV0sICZyLCAmcik7CisgIH0KK30KKworCisvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KK3ZvaWQgZ2Z4X3Byb2dyZXNzX2RvbmUodm9pZCkKK3sKKyAgY29tMzJzeXNfdCByOworCisgIG1lbXNldCgmciwwLHNpemVvZihyKSk7CisgIGlmKHByb2dyZXNzX2FjdGl2ZSkgeworICAgIF9fZmFyY2FsbChnZnguY29kZV9zZWcsIGdmeC5qbXBfdGFibGVbR0ZYX0NCX1BST0dSRVNTX0RPTkVdLCAmciwgJnIpOworICB9CisKKyAgcHJvZ3Jlc3NfYWN0aXZlID0gMDsKK30KKworCisvLyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKy8vIFJlYWQgZmlsZSBhbmQgdXBkYXRlIHByb2dyZXNzIGJhci4KKy8vCit2b2lkICpsb2FkX29uZShjaGFyICpmaWxlLCBzc2l6ZV90ICpmaWxlX3NpemUpCit7CisgIGludCBmZDsKKyAgdm9pZCAqYnVmID0gTlVMTDsKKyAgY2hhciAqc3RyOworICBzdHJ1Y3Qgc3RhdCBzYnVmOworICBzc2l6ZV90IHNpemUgPSAwLCBjdXIsIGk7CisKKyAgKmZpbGVfc2l6ZSA9IDA7CisKKyAgaWYoKGZkID0gb3BlbihmaWxlLCBPX1JET05MWSkpID09IC0xKSB7CisgICAgYXNwcmludGYoJnN0ciwgIiVzOiBmaWxlIG5vdCBmb3VuZCIsIGZpbGUpOworICAgIGdmeF9pbmZvYm94KDAsIHN0ciwgTlVMTCk7CisgICAgZnJlZShzdHIpOworICAgIHJldHVybiBidWY7CisgIH0KKworICBpZighZnN0YXQoZmQsICZzYnVmKSAmJiBTX0lTUkVHKHNidWYuc3RfbW9kZSkpIHNpemUgPSBzYnVmLnN0X3NpemU7CisKKyAgaSA9IDA7CisKKyAgaWYoc2l6ZSkgeworICAgIGJ1ZiA9IG1hbGxvYyhzaXplKTsKKyAgICBmb3IoaSA9IDEsIGN1ciA9IDAgOyBjdXIgPCBzaXplICYmIGkgPiAwOyBjdXIgKz0gaSkgeworICAgICAgaSA9IHJlYWQoZmQsIGJ1ZiArIGN1ciwgbWluKENIVU5LX1NJWkUsIHNpemUgLSBjdXIpKTsKKyAgICAgIGlmKGkgPT0gLTEpIGJyZWFrOworICAgICAgZ2Z4X3Byb2dyZXNzX3VwZGF0ZShpKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZG8geworICAgICAgYnVmID0gcmVhbGxvYyhidWYsIHNpemUgKyBDSFVOS19TSVpFKTsKKyAgICAgIGkgPSByZWFkKGZkLCBidWYgKyBzaXplLCBDSFVOS19TSVpFKTsKKyAgICAgIGlmKGkgPT0gLTEpIGJyZWFrOworICAgICAgc2l6ZSArPSBpOworICAgICAgZ2Z4X3Byb2dyZXNzX3VwZGF0ZShpKTsKKyAgICB9IHdoaWxlKGkgPiAwKTsKKyAgfQorCisgIGNsb3NlKGZkKTsKKworICBpZihpID09IC0xKSB7CisgICAgYXNwcmludGYoJnN0ciwgIiVzOiByZWFkIGVycm9yIEAgJWQiLCBmaWxlLCBzaXplKTsKKyAgICBnZnhfaW5mb2JveCgwLCBzdHIsIE5VTEwpOworICAgIGZyZWUoc3RyKTsKKyAgICBmcmVlKGJ1Zik7CisgICAgYnVmID0gTlVMTDsKKyAgICBzaXplID0gMDsKKyAgfQorCisgICpmaWxlX3NpemUgPSBzaXplOworCisgIHJldHVybiBidWY7Cit9CisKKworLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisvLyBCb290IG1lbnUgZW50cnkuCisvLworLy8gY21kbGluZSBjYW4gb3B0aW9uYWxseSBzdGFydCB3aXRoIGxhYmVsIHN0cmluZy4KKy8vCit2b2lkIGJvb3QoaW50IGluZGV4KQoreworICBjaGFyICphcmcsICphbHRfa2VybmVsOworICBtZW51X3QgKm1lbnVfcHRyOworICBpbnQgaSwgbGFiZWxfbGVuOworICB1bnNpZ25lZCBpcGFwcDsKKyAgY29uc3Qgc3RydWN0IHN5c2xpbnV4X2lwYXBwZW5kX3N0cmluZ3MgKmlwYXBwZW5kOworICBjaGFyICpnZnhib290X2N3ZCA9IChjaGFyICopIGdmeF9jb25maWcuZ2Z4Ym9vdF9jd2Q7CisKKyAgaWYoZ2Z4Ym9vdF9jd2QpIHsKKyAgICBjaGRpcihnZnhib290X2N3ZCk7CisgICAgZ2Z4X2NvbmZpZy5nZnhib290X2N3ZCA9IDA7CisgIH0KKworICBmb3IobWVudV9wdHIgPSBtZW51OyBtZW51X3B0cjsgbWVudV9wdHIgPSBtZW51X3B0ci0+bmV4dCwgaW5kZXgtLSkgeworICAgIGlmKCFpbmRleCkgYnJlYWs7CisgIH0KKworICAvLyBpbnZhbGlkIGluZGV4IG9yIG1lbnUgZW50cnkKKyAgaWYoIW1lbnVfcHRyIHx8ICFtZW51X3B0ci0+bWVudV9sYWJlbCkgcmV0dXJuOworCisgIGFyZyA9IHNraXBzcGFjZShjbWRsaW5lKTsKKyAgbGFiZWxfbGVuID0gc3RybGVuKG1lbnVfcHRyLT5tZW51X2xhYmVsKTsKKworICAvLyBpZiBpdCBkb2VzIG5vdCBzdGFydCB3aXRoIGxhYmVsIHN0cmluZywgYXNzdW1lIGZpcnN0IHdvcmQgaXMga2VybmVsIG5hbWUKKyAgaWYoc3RybmNtcChhcmcsIG1lbnVfcHRyLT5tZW51X2xhYmVsLCBsYWJlbF9sZW4pKSB7CisgICAgYWx0X2tlcm5lbCA9IGFyZzsKKyAgICBhcmcgPSBza2lwX25vbnNwYWNlcyhhcmcpOworICAgIGlmKCphcmcpICphcmcrKyA9IDA7CisgICAgaWYoKmFsdF9rZXJuZWwpIG1lbnVfcHRyLT5hbHRfa2VybmVsID0gYWx0X2tlcm5lbDsKKyAgfQorICBlbHNlIHsKKyAgICBhcmcgKz0gbGFiZWxfbGVuOworICB9CisKKyAgYXJnID0gc2tpcHNwYWNlKGFyZyk7CisKKyAgLy8gaGFuZGxlIElQQVBQRU5ECisgIGlmKG1lbnVfcHRyLT5pcGFwcGVuZCAmJiAoaXBhcHAgPSBhdG9pKG1lbnVfcHRyLT5pcGFwcGVuZCkpKSB7CisgICAgaXBhcHBlbmQgPSBzeXNsaW51eF9pcGFwcGVuZF9zdHJpbmdzKCk7CisgICAgZm9yKGkgPSAwOyBpIDwgaXBhcHBlbmQtPmNvdW50OyBpKyspIHsKKyAgICAgIGlmKChpcGFwcCAmICgxIDw8IGkpKSAmJiBpcGFwcGVuZC0+cHRyW2ldKSB7CisgICAgICAgIHNwcmludGYoYXJnICsgc3RybGVuKGFyZyksICIgJXMiLCBpcGFwcGVuZC0+cHRyW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBib290X2VudHJ5KG1lbnVfcHRyLCBhcmcpOworCisgIGdmeF9wcm9ncmVzc19kb25lKCk7Cit9CisKKworLy8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisvLyBMb2FkICYgcnVuIGtlcm5lbC4KKy8vCisvLyBSZXR1cm5zIG9ubHkgb24gZXJyb3IuCisvLwordm9pZCBib290X2VudHJ5KG1lbnVfdCAqbWVudV9wdHIsIGNoYXIgKmFyZykKK3sKKyAgdm9pZCAqa2VybmVsLCAqaW5pdHJkX2J1ZjsKKyAgc3NpemVfdCBrZXJuZWxfc2l6ZSA9IDAsIGluaXRyZF9zaXplID0gMDsKKyAgc3RydWN0IGluaXRyYW1mcyAqaW5pdHJkID0gTlVMTDsKKyAgY2hhciAqZmlsZSwgKmNtZF9idWY7CisgIGludCBmZDsKKyAgc3RydWN0IHN0YXQgc2J1ZjsKKyAgY2hhciAqcywgKnMwLCAqdCwgKmluaXRyZF9hcmc7CisKKyAgaWYoIW1lbnVfcHRyKSByZXR1cm47CisKKyAgaWYobWVudV9wdHItPmxvY2FsYm9vdCkgeworICAgIGdmeF9kb25lKCk7CisgICAgc3lzbGludXhfbG9jYWxfYm9vdChzdHJ0b2wobWVudV9wdHItPmxvY2FsYm9vdCwgTlVMTCwgMCkpOworCisgICAgcmV0dXJuOworICB9CisKKyAgZmlsZSA9IG1lbnVfcHRyLT5hbHRfa2VybmVsOworICBpZighZmlsZSkgZmlsZSA9IG1lbnVfcHRyLT5rZXJuZWw7CisgIGlmKCFmaWxlKSBmaWxlID0gbWVudV9wdHItPmxpbnV4OworICBpZighZmlsZSkgeworICAgIGdmeF9kb25lKCk7CisgICAgYXNwcmludGYoJmNtZF9idWYsICIlcyAlcyIsIG1lbnVfcHRyLT5sYWJlbCwgYXJnKTsKKyAgICBzeXNsaW51eF9ydW5fY29tbWFuZChjbWRfYnVmKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBmaXJzdCwgbG9hZCBrZXJuZWwKKworICBrZXJuZWxfc2l6ZSA9IDA7CisKKyAgaWYoKGZkID0gb3BlbihmaWxlLCBPX1JET05MWSkpID49IDApIHsKKyAgICBpZighZnN0YXQoZmQsICZzYnVmKSAmJiBTX0lTUkVHKHNidWYuc3RfbW9kZSkpIGtlcm5lbF9zaXplID0gc2J1Zi5zdF9zaXplOworICAgIGNsb3NlKGZkKTsKKyAgfQorCisgIGdmeF9wcm9ncmVzc19pbml0KGtlcm5lbF9zaXplLCBmaWxlKTsKKworICBrZXJuZWwgPSBsb2FkX29uZShmaWxlLCAma2VybmVsX3NpemUpOworCisgIGlmKCFrZXJuZWwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZihrZXJuZWxfc2l6ZSA8IDEwMjQgfHwgKih1aW50MzJfdCAqKSAoa2VybmVsICsgMHgyMDIpICE9IDB4NTM3MjY0NDgpIHsKKyAgICAvLyBub3QgYSBsaW51eCBrZXJuZWwKKyAgICBnZnhfZG9uZSgpOworICAgIGFzcHJpbnRmKCZjbWRfYnVmLCAiJXMgJXMiLCBtZW51X3B0ci0+bGFiZWwsIGFyZyk7CisgICAgc3lzbGludXhfcnVuX2NvbW1hbmQoY21kX2J1Zik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gcHJpbnRmKCJrZXJuZWwgPSAlcCwgc2l6ZSA9ICVkXG4iLCBrZXJuZWwsIGtlcm5lbF9zaXplKTsKKworICAvLyBwYXJzZSBjbWRsaW5lIGZvciAiaW5pdHJkIiBvcHRpb24KKworICBpbml0cmRfYXJnID0gbWVudV9wdHItPmluaXRyZDsKKworICBzID0gczAgPSBzdHJkdXAoYXJnKTsKKworICB3aGlsZSgqcyAmJiBzdHJuY21wKHMsICJpbml0cmQ9Iiwgc2l6ZW9mICJpbml0cmQ9IiAtIDEpKSB7CisgICAgcyA9IHNraXBzcGFjZShza2lwX25vbnNwYWNlcyhzKSk7CisgIH0KKworICBpZigqcykgeworICAgIHMgKz0gc2l6ZW9mICJpbml0cmQ9IiAtIDE7CisgICAgKnNraXBfbm9uc3BhY2VzKHMpID0gMDsKKyAgICBpbml0cmRfYXJnID0gczsKKyAgfQorICBlbHNlIGlmKGluaXRyZF9hcmcpIHsKKyAgICBmcmVlKHMwKTsKKyAgICBpbml0cmRfYXJnID0gczAgPSBzdHJkdXAoaW5pdHJkX2FyZyk7CisgIH0KKworICBpZihpbml0cmRfYXJnKSB7CisgICAgaW5pdHJkID0gaW5pdHJhbWZzX2luaXQoKTsKKworICAgIHdoaWxlKCh0ID0gc3Ryc2VwKCZpbml0cmRfYXJnLCAiLCIpKSkgeworICAgICAgaW5pdHJkX2J1ZiA9IGxvYWRfb25lKHQsICZpbml0cmRfc2l6ZSk7CisKKyAgICAgIGlmKCFpbml0cmRfYnVmKSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlYWQgZXJyb3JcbiIsIHQpOworICAgICAgICBmcmVlKHMwKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpbml0cmFtZnNfYWRkX2RhdGEoaW5pdHJkLCBpbml0cmRfYnVmLCBpbml0cmRfc2l6ZSwgaW5pdHJkX3NpemUsIDQpOworCisgICAgICAvLyBwcmludGYoImluaXRyZCA9ICVwLCBzaXplID0gJWRcbiIsIGluaXRyZF9idWYsIGluaXRyZF9zaXplKTsKKyAgICB9CisgIH0KKworICBmcmVlKHMwKTsKKworICBnZnhfZG9uZSgpOworCisgIHN5c2xpbnV4X2Jvb3RfbGludXgoa2VybmVsLCBrZXJuZWxfc2l6ZSwgaW5pdHJkLCBOVUxMLCBhcmcpOworfQorCisKZGlmZiAtLWdpdCBhL2NvbTMyL2dmeGJvb3QvcmVhbG1vZGVfY2FsbGJhY2suYXNtIGIvY29tMzIvZ2Z4Ym9vdC9yZWFsbW9kZV9jYWxsYmFjay5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmMzBmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dmeGJvb3QvcmVhbG1vZGVfY2FsbGJhY2suYXNtCkBAIC0wLDAgKzEsMTkwIEBACisJCWJpdHMgMTYKKworCQlzZWN0aW9uIC50ZXh0CisKKwkJOyBtdXN0IGJlIGZpbGxlZCBpbgorZl9idWZfc2l6ZQlkdyAwCitmX2J1Zl9zZWcJZHcgMAorCisKKzsgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCitnZnhfY2I6CisJCXB1c2ggY3MKKwkJcG9wIGRzCisKKwkJY21wIGFsLGNiX2xlbgorCQlqYWUgZ2Z4X2NiXzgwCisKKwkJbW92enggYngsYWwKKwkJYWRkIGJ4LGJ4CisJCWNhbGwgd29yZCBbYngrY2JfdGFibGVdCisJCWptcCBnZnhfY2JfOTAKKworZ2Z4X2NiXzgwOgorCQltb3YgYWwsMGZmaAorZ2Z4X2NiXzkwOgorCQlyZXRmCisKKworOyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKzsgUmV0dXJuIHN0YXR1cyBpbmZvLgorOworOyByZXR1cm46Cis7ICBlZHgJCWZpbGVuYW1lIGJ1ZmZlciAoNjQgYnl0ZXMpCis7CitjYl9zdGF0dXM6CisJCW1vdiBlZHgsY3MKKwkJc2hsIGVkeCw0CisJCWFkZCBlZHgsZl9uYW1lCisJCXhvciBhbCxhbAorCQlyZXQKKworCis7IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorOyBPcGVuIGZpbGUuCis7Cis7IHJldHVybjoKKzsgICAgYWwJCTA6IG9rLCAxOiBmaWxlIG5vdCBmb3VuZAorOyAgIGVjeAkJZmlsZSBsZW5ndGggKGFsID0gMCkKKzsKK2NiX2ZvcGVuOgorCQltb3Ygc2ksZl9uYW1lCisJCXB1c2ggZHMKKwkJcG9wIGVzCisJCW1vdiBheCw2CisJCWludCAyMmgKKwkJeGNoZyBlZHgsZWF4CisJCW1vdiBhbCwxCisJCWpjIGNiX2ZvcGVuXzkwCisJCWNtcCBjeCxbZl9idWZfc2l6ZV0KKwkJamEgY2JfZm9wZW5fOTAKKwkJb3IgY3gsY3gKKwkJanogY2JfZm9wZW5fOTAKKwkJbW92IFtmX2Jsb2NrX3NpemVdLGN4CisJCW9yIGVkeCxlZHgKKwkJanogY2JfZm9wZW5fOTAKKwkJbW92IFtmX2hhbmRsZV0sc2kKKwkJbW92IFtmX3NpemVdLGVkeAorCQltb3YgZWN4LGVkeAorCQltb3YgYXgsW2ZfYnVmX3NpemVdCisJCWN3ZAorCQlkaXYgd29yZCBbZl9ibG9ja19zaXplXQorCQltb3YgW2ZfYmxvY2tzXSxheAorCisJCXhvciBhbCxhbAorY2JfZm9wZW5fOTA6CisJCXJldAorCisKKzsgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCis7IFJlYWQgbmV4dCBjaHVuay4KKzsKKzsgcmV0dXJuOgorOyAgIGVkeAkJYnVmZmVyIGFkZHJlc3MgKGxpbmVhcikKKzsgICBlY3gJCWRhdGEgbGVuZ3RoICg8IDY0aykKKzsKK2NiX2ZyZWFkOgorCQl4b3IgZWN4LGVjeAorCQltb3Ygc2ksW2ZfaGFuZGxlXQorCQlvciBzaSxzaQorCQlqeiBjYl9mcmVhZF84MAorCQltb3YgY3gsW2ZfYmxvY2tzXQorCQltb3YgZXMsW2ZfYnVmX3NlZ10KKwkJeG9yIGJ4LGJ4CisJCW1vdiBheCw3CisJCWludCAyMmgKKwkJbW92IFtmX2hhbmRsZV0sc2kKKwkJbW92IGFsLDEKKwkJamMgY2JfZnJlYWRfOTAKK2NiX2ZyZWFkXzgwOgorCQl4b3IgYWwsYWwKK2NiX2ZyZWFkXzkwOgorCQltb3Z6eCBlZHgsd29yZCBbZl9idWZfc2VnXQorCQlzaGwgZWR4LDQKKwkJcmV0CisKKworOyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKzsgUmV0dXJuIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCis7Cis7IHJldHVybjoKKzsgIGVkeAkJZmlsZW5hbWUKKzsKK2NiX2dldGN3ZDoKKwkJbW92IGF4LDFmaAorCQlpbnQgMjJoCisJCW1vdiBlZHgsZXMKKwkJc2hsIGVkeCw0CisJCW1vdnp4IGVieCxieAorCQlhZGQgZWR4LGVieAorCQl4b3IgYWwsYWwKKwkJcmV0CisKKworOyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKzsgU2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCis7CitjYl9jaGRpcjoKKwkJbW92IGJ4LGZfbmFtZQorCQlwdXNoIGRzCisJCXBvcCBlcworCQltb3YgYXgsMjVoCisJCWludCAyMmgKKwkJeG9yIGFsLGFsCisJCXJldAorCisKKzsgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCis7IHJlYWQgc2VjdG9yCis7Cis7ICBlZHgJCXNlY3RvcgorOworOyByZXR1cm46Cis7ICBlZHgJCWJ1ZmZlciAobGluZWFyIGFkZHJlc3MpCis7Cis7ICBOb3RlOiBkb2VzIG5vdCByZXR1cm4gb24gZXJyb3IhCis7CitjYl9yZWFkc2VjdG9yOgorCQl4b3IgZWRpLGVkaQorCQl4b3IgZXNpLGVzaQorCQltb3YgY3gsMQorCQltb3YgZXMsW2ZfYnVmX3NlZ10KKwkJeG9yIGJ4LGJ4CisJCW1vdiBheCwxOWgKKwkJaW50IDIyaAorCQltb3Z6eCBlZHgsd29yZCBbZl9idWZfc2VnXQorCQlzaGwgZWR4LDQKKwkJeG9yIGFsLGFsCisJCXJldAorCisKKzsgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCis7IFJlLXJlYWQgZnMgc3RydWN0dXJlcy4KKzsKK2NiX21vdW50OgorCQltb3YgYXgsMjZoCisJCWludCAyMmgKKwkJc2V0YyBhbAorCQlyZXQKKworCis7IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorOworCQlhbGlnbiAyLCBkYiAwCisKK2NiX3RhYmxlCWR3IGNiX3N0YXR1cworCQlkdyBjYl9mb3BlbgorCQlkdyBjYl9mcmVhZAorCQlkdyBjYl9nZXRjd2QKKwkJZHcgY2JfY2hkaXIKKwkJZHcgY2JfcmVhZHNlY3RvcgorCQlkdyBjYl9tb3VudAorY2JfbGVuCQllcXUgKCQtY2JfdGFibGUpLzIKKworZl9oYW5kbGUJZHcgMAorZl9ibG9ja19zaXplCWR3IDAKK2ZfYmxvY2tzCWR3IDAKK2Zfc2l6ZQkJZGQgMAorZl9uYW1lCQl0aW1lcyA2NCBkYiAwCitmX25hbWVfbGVuCWVxdSAkIC0gZl9uYW1lCisKZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGluY2x1ZGUvUkVBRE1FIGIvY29tMzIvZ3BsaW5jbHVkZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxYmY2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvUkVBRE1FCkBAIC0wLDAgKzEgQEAKK1B1dCBoZWFkZXIgZmlsZXMgZm9yIExHUEwgb3IgR1BMIGxpYnJhcnkgZnVuY3Rpb25zIGluIHRoaXMgZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL2FjcGkuaCBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9hY3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzZmZkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9hY3BpLmgKQEAgLTAsMCArMSw5OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgQUNQSV9ICisjZGVmaW5lIEFDUElfSAorCisjZGVmaW5lIERFQlVHX0FDUEkgMAorCit2b2lkIGRiZ19wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOworI2RlZmluZSBERUJVR19QUklOVCh4KSBkbyB7IGlmIChERUJVR19BQ1BJKSBkYmdfcHJpbnRmIHg7IH0gd2hpbGUgKDApCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxhY3BpL3N0cnVjdHMuaD4KKyNpbmNsdWRlIDxhY3BpL3JzZHAuaD4KKyNpbmNsdWRlIDxhY3BpL3JzZHQuaD4KKyNpbmNsdWRlIDxhY3BpL3hzZHQuaD4KKyNpbmNsdWRlIDxhY3BpL2ZhZHQuaD4KKyNpbmNsdWRlIDxhY3BpL21hZHQuaD4KKyNpbmNsdWRlIDxhY3BpL2RzZHQuaD4KKyNpbmNsdWRlIDxhY3BpL3NzZHQuaD4KKyNpbmNsdWRlIDxhY3BpL3Nic3QuaD4KKyNpbmNsdWRlIDxhY3BpL2VjZHQuaD4KKyNpbmNsdWRlIDxhY3BpL2ZhY3MuaD4KKyNpbmNsdWRlIDxhY3BpL2hwZXQuaD4KKyNpbmNsdWRlIDxhY3BpL3RjcGEuaD4KKyNpbmNsdWRlIDxhY3BpL21jZmcuaD4KKyNpbmNsdWRlIDxhY3BpL3NsaWMuaD4KKyNpbmNsdWRlIDxhY3BpL2Jvb3QuaD4KKworZW51bSB7IEFDUElfRk9VTkQgPSAxLCBFTk9fQUNQSSA9IDIgLCBNQURUX0ZPVU5EID0gMyAsIEVOT19NQURUID0gNCB9OworCisjZGVmaW5lIE1BWF9TU0RUIDEyOAorCisvKiBTb21lIG90aGVyIGRlc2NyaXB0aW9uIEhFQURFUlMgOiBBQ1BJIGRvYzogNS4yLjYqLworI2RlZmluZSBPRU1YICJPRU14IgorI2RlZmluZSBTUkFSICJTUkFUIgorI2RlZmluZSBCRVJUICJCRVJUIgorI2RlZmluZSBCT09UICJCT09UIgorI2RlZmluZSBDUEVQICJDUEVQIgorI2RlZmluZSBEQkdQICJER0JQIgorI2RlZmluZSBETUFSICJETUFSIgorI2RlZmluZSBFUlNUICJFUlNUIgorI2RlZmluZSBFVERUICJFVERUIgorI2RlZmluZSBIRVNUICJIRVNUIgorI2RlZmluZSBIUEVUICJIUEVUIgorI2RlZmluZSBJQkZUICJJQkZUIgorI2RlZmluZSBNQ0ZHICJNQ0ZHIgorI2RlZmluZSBTUENSICJTUENSIgorI2RlZmluZSBTUE1JICJTUE1JIgorI2RlZmluZSBUQ1BBICJUQ1BBIgorI2RlZmluZSBVRUZJICJVRUZJIgorI2RlZmluZSBXQUVUICJXQUVUIgorI2RlZmluZSBXREFUICJXREFUIgorI2RlZmluZSBXRFJUICJXRFJUIgorI2RlZmluZSBXU1BUICJXU1BUIgorI2RlZmluZSBTTElDICJTTElDIgorCisvKiBUaGlzIG1hY3JvIGFyZSB1c2VkIHRvIGV4dHJhY3QgQUNQSSBzdHJ1Y3R1cmVzIAorICogcGxlYXNlIGJlIGNhcmVmdWwgYWJvdXQgdGhlIHEgKGludGVyYXRvcikgbmFtaW5nICovCisjZGVmaW5lIGNwX3N0cnVjdChkZXN0KSBtZW1jcHkoZGVzdCxxLHNpemVvZigqZGVzdCkpOyBxKz1zaXplb2YoKmRlc3QpCisjZGVmaW5lIGNwX3N0cl9zdHJ1Y3QoZGVzdCkgbWVtY3B5KGRlc3QscSxzaXplb2YoZGVzdCktMSk7IGRlc3Rbc2l6ZW9mKGRlc3QpLTFdPTA7cSs9c2l6ZW9mKGRlc3QpLTEKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNfcnNkcCByc2RwOworICAgIHNfcnNkdCByc2R0OworICAgIHNfeHNkdCB4c2R0OworICAgIHNfZmFkdCBmYWR0OworICAgIHNfbWFkdCBtYWR0OworICAgIHNfZHNkdCBkc2R0OworICAgIHNfc3NkdCAqc3NkdFtNQVhfU1NEVF07CisgICAgdWludDhfdCBzc2R0X2NvdW50OworICAgIHNfc2JzdCBzYnN0OworICAgIHNfZWNkdCBlY2R0OworICAgIHNfZmFjcyBmYWNzOworICAgIHNfaHBldCBocGV0OworICAgIHNfdGNwYSB0Y3BhOworICAgIHNfbWNmZyBtY2ZnOworICAgIHNfc2xpYyBzbGljOworICAgIHNfYm9vdCBib290OworfSBzX2FjcGk7CisKK2ludCBwYXJzZV9hY3BpKHNfYWNwaSAqIGFjcGkpOworaW50IHBhcnNlX3hzZHQoc19hY3BpICogYWNwaSk7Cit2b2lkIHBhcnNlX21hZHQoc19hY3BpICogYWNwaSk7CitpbnQgc2VhcmNoX3JzZHAoc19hY3BpICphY3BpKTsKK3ZvaWQgZ2V0X2FjcGlfZGVzY3JpcHRpb25faGVhZGVyKHVpbnQ4X3QgKnEsIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgKiBhZGgpOworYm9vbCBwYXJzZV9oZWFkZXIodWludDY0X3QgKmFkZHJlc3MsIHNfYWNwaSAqYWNwaSk7CitjaGFyICpmbGFnc190b19zdHJpbmcoY2hhciAqYnVmZmVyLCB1aW50MTZfdCBmbGFncyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9ib290LmggYi9jb20zMi9ncGxpbmNsdWRlL2FjcGkvYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OWMwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxpbmNsdWRlL2FjcGkvYm9vdC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTEgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIEJPT1RfSAorI2RlZmluZSBCT09UX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2RlZmluZSBCT09UICJCT09UIgorCitlbnVtIHsgQk9PVF9UQUJMRV9GT1VORCA9IDEgfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90ICphZGRyZXNzOworICAgIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgaGVhZGVyOworICAgIC8qIFdoYXQncyBpbnNpZGUgPyAqLworICAgIGJvb2wgdmFsaWQ7Cit9IHNfYm9vdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2FjcGkvZHNkdC5oIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL2RzZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTFmYjMwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL2RzZHQuaApAQCAtMCwwICsxLDI4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBEU0RUX0gKKyNkZWZpbmUgRFNEVF9ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgRFNEVCAiRFNEVCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90ICphZGRyZXNzOworICAgIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgaGVhZGVyOworICAgIHVpbnQ4X3QgKmRlZmluaXRpb25fYmxvY2s7CisgICAgYm9vbCB2YWxpZDsKK30gc19kc2R0OworCit2b2lkIHBhcnNlX2RzZHQoc19kc2R0ICpkc2R0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL2VjZHQuaCBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9lY2R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1NzI2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9lY2R0LmgKQEAgLTAsMCArMSwzOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgRUNEVF9ICisjZGVmaW5lIEVDRFRfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjZGVmaW5lIEVDRFQgIkVDRFQiCisKKy8qIE9mZnNldCBvZiB0aGUgRUNfSUQgaW4gdGhlIHN0cnVjdHVyZSAqLworI2RlZmluZSBFQ19JRF9PRkZTRVQgNjUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90ICphZGRyZXNzOworICAgIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgaGVhZGVyOworICAgIGJvb2wgdmFsaWQ7CisgICAgdWludDMyX3Qgd2FybmluZ19lbmVyZ3lfbGV2ZWw7CisgICAgdWludDMyX3QgbG93X2VuZXJneV9sZXZlbDsKKyAgICB1aW50MzJfdCBjcml0aWNhbF9lbmVyZ3lfbGV2ZWw7CisgICAgc19nYXMgZWNfY29udHJvbDsKKyAgICBzX2dhcyBlY19kYXRhOworICAgIHVpbnQzMl90IHVpZDsKKyAgICB1aW50OF90IGdwZV9iaXQ7CisgICAgY2hhciAqZWNfaWQ7Cit9IHNfZWNkdDsKKwordm9pZCBwYXJzZV9lY2R0KHNfZWNkdCAqIGVjZHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2FjcGkvZmFjcy5oIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL2ZhY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWYwNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL2ZhY3MuaApAQCAtMCwwICsxLDQxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgRkFDU19ICisjZGVmaW5lIEZBQ1NfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjZGVmaW5lIEZBQ1MgIkZBQ1MiCisKKy8qIEZlYXR1cmVzIEZsYWdzIGZvciAiZmxhZ3MiICovCisjZGVmaW5lIFM0QklPU19GIDEKKworLyogRmVhdHVyZXMgZmxhZ3MgZm9yIGdsb2JhbF9sb2NrICovCisjZGVmaW5lIFBFTkRJTkcgMQorI2RlZmluZSBPV05FRCAxPDwxCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCAqYWRkcmVzczsKKyAgICB1aW50OF90IHNpZ25hdHVyZVs0KzFdOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQzMl90IGhhcmR3YXJlX3NpZ25hdHVyZTsKKyAgICB1aW50MzJfdCBmaXJtd2FyZV93YWtpbmdfdmVjdG9yOworICAgIHVpbnQzMl90IGdsb2JhbF9sb2NrOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHVpbnQ2NF90IHhfZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsKKyAgICB1aW50OF90IHZlcnNpb247CisgICAgYm9vbCB2YWxpZDsKK30gc19mYWNzOworCit2b2lkIHBhcnNlX2ZhY3Moc19mYWNzICpmYWNzKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL2ZhZHQuaCBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9mYWR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1MmJmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9mYWR0LmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTEgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIEZBRFRfSAorI2RlZmluZSBGQURUX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworZW51bSB7IEZBRFRfVEFCTEVfRk9VTkQgPSAxfTsKKworI2RlZmluZSBGQUNQICJGQUNQIgorI2RlZmluZSBGQURUICJGQURUIgorCisvKiBwcmVmZXJlZCBwbSBwcm9maWxlcyAqLworZW51bSB7IFBNX1VOU1BFQ0lGSUVEID0gMCwKKyAgICBQTV9ERVNLVE9QID0gMSwKKyAgICBQTV9NT0JJTEUgPSAyLAorICAgIFBNX1dPUktTVEFUSU9OID0gMywKKyAgICBQTV9FTlRFUlBSSVNFX1NFUlZFUiA9IDQsCisgICAgUE1fU09IT19TRVJWRVIgPSA1LAorICAgIFBNX0FQUExJQU5DRV9QQyA9IDYsCisgICAgUE1fUEVSRk9STUFOQ0VfU0VSVkVSID0gNworfTsKKworLyogaWFwY19ib290X2FyY2ggZmxhZ3MqLworI2RlZmluZSBJQVBDX0xFR0FHWV9ERVZJQ0UgMQorI2RlZmluZSBJQVBDXzgwNDIgMTw8MQorI2RlZmluZSBJQVBDX1ZHQV9OT1RfUFJFU0VOVCAxPDwyCisjZGVmaW5lIElBUENfTVNJX05PVF9TVVBQT1JURUQgMTw8MworI2RlZmluZSBJQVBDX1BDSUVfQVNQTV9DT05UUk9MUyAxPDw0CisKKy8qIGZlYXR1cmUgZmxhZ3MgZm9yICJmbGFncyIgKi8KKyNkZWZpbmUgV0JJTlZEIDEKKyNkZWZpbmUgV0JJTlZEX0ZMVVNIIDE8PDEKKyNkZWZpbmUgUFJPQ19DMSAxPDwyCisjZGVmaW5lIFBfTFZMMl9VUCAxPDwzCisjZGVmaW5lIFBXUl9CVVRUT04gMTw8NAorI2RlZmluZSBTTFBfQlVUVE9OIDE8PDUKKyNkZWZpbmUgRklYX1JUQyAxPDw2CisjZGVmaW5lIFJUQ19TNCAxPDw3CisjZGVmaW5lIFRNUl9WQUxfRVhUIDE8PDgKKyNkZWZpbmUgRENLX0NBUCAxPDw5CisjZGVmaW5lIFJFU0VUX1JFR19TVVAgMTw8MTAKKyNkZWZpbmUgU0VBTEVEX0NBU0UgMTw8MTEKKyNkZWZpbmUgSEVBRExFU1MgMTw8MTIKKyNkZWZpbmUgQ1BVX1NXX1NMUCAxPDwxMworI2RlZmluZSBQQ0lfRVhQX1dBSyAxPDwxNAorI2RlZmluZSBVU0VfUExBVEVGT1JNX0NMT0NLIDE8PDE1CisjZGVmaW5lIFM0X1JUQ19TVFNfVkFMSUQgMTw8MTYKKyNkZWZpbmUgUkVNT1RFX1BPV0VSX09OX0NBUEFCTEUgMTw8MTcKKyNkZWZpbmUgRk9SQ0VfQVBJQ19DTFVTVEVSX01PREVMIDE8PDE4CisjZGVmaW5lIEZPUkNFX0FQSUNfUEhZU0lDQUxfREVTVElOQVRJT05fTU9ERSAxPDwxOQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgKmFkZHJlc3M7CisgICAgc19hY3BpX2Rlc2NyaXB0aW9uX2hlYWRlciBoZWFkZXI7CisgICAgYm9vbCB2YWxpZDsKKyAgICB1aW50MzJfdCAqZmlybXdhcmVfY3RybDsKKyAgICB1aW50MzJfdCAqZHNkdF9hZGRyZXNzOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7CisgICAgdWludDhfdCBwcmVmZXJlZF9wbV9wcm9maWxlOworICAgIHVpbnQxNl90IHNjaV9pbnQ7CisgICAgdWludDMyX3Qgc21pX2NtZDsKKyAgICB1aW50OF90IGFjcGlfZW5hYmxlOworICAgIHVpbnQ4X3QgYWNwaV9kaXNhYmxlOworICAgIHVpbnQ4X3QgczRiaW9zX3JlcTsKKyAgICB1aW50OF90IHBzdGF0ZV9jbnQ7CisgICAgdWludDMyX3QgcG0xYV9ldnRfYmxrOworICAgIHVpbnQzMl90IHBtMWJfZXZ0X2JsazsKKyAgICB1aW50MzJfdCBwbTFhX2NudF9ibGs7CisgICAgdWludDMyX3QgcG0xYl9jbnRfYmxrOworICAgIHVpbnQzMl90IHBtMl9jbnRfYmxrOworICAgIHVpbnQzMl90IHBtX3Rtcl9ibGs7CisgICAgdWludDMyX3QgZ3BlMF9ibGs7CisgICAgdWludDMyX3QgZ3BlMV9ibGs7CisgICAgdWludDhfdCBwbTFfZXZ0X2xlbjsKKyAgICB1aW50OF90IHBtMV9jbnRfbGVuOworICAgIHVpbnQ4X3QgcG0yX2NudF9sZW47CisgICAgdWludDhfdCBwbV90bXJfbGVuOworICAgIHVpbnQ4X3QgZ3BlMF9ibGtfbGVuOworICAgIHVpbnQ4X3QgZ3BlMV9ibGtfbGVuOworICAgIHVpbnQ4X3QgZ3BlMV9iYXNlOworICAgIHVpbnQ4X3QgY3N0X2NudDsKKyAgICB1aW50MTZfdCBwX2x2bDJfbGF0OworICAgIHVpbnQxNl90IHBfbHZsM19sYXQ7CisgICAgdWludDE2X3QgZmx1c2hfc2l6ZTsKKyAgICB1aW50MTZfdCBmbHVzaF9zdHJpZGU7CisgICAgdWludDhfdCBkdXR5X29mZnNldDsKKyAgICB1aW50OF90IGR1dHlfd2lkdGg7CisgICAgdWludDhfdCBkYXlfYWxhcm07CisgICAgdWludDhfdCBtb25fYWxhcm07CisgICAgdWludDhfdCBjZW50dXJ5OworICAgIHVpbnQxNl90IGlhcGNfYm9vdF9hcmNoOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRfMjsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBzX2dhcyByZXNldF9yZWc7CisgICAgdWludDhfdCByZXNldF92YWx1ZTsKKyAgICB1aW50OF90IHJlc2VydmVkXzNbM107CisgICAgdWludDY0X3QgKnhfZmlybXdhcmVfY3RybDsKKyAgICB1aW50NjRfdCAqeF9kc2R0OworICAgIHNfZ2FzIHhfcG0xYV9ldnRfYmxrOworICAgIHNfZ2FzIHhfcG0xYl9ldnRfYmxrOworICAgIHNfZ2FzIHhfcG0xYV9jbnRfYmxrOworICAgIHNfZ2FzIHhfcG0xYl9jbnRfYmxrOworICAgIHNfZ2FzIHhfcG0yX2NudF9ibGs7CisgICAgc19nYXMgeF9wbV90bXJfYmxrOworICAgIHNfZ2FzIHhfZ3BlMF9ibGs7CisgICAgc19nYXMgeF9ncGUxX2JsazsKK30gc19mYWR0OworCit2b2lkIHBhcnNlX2ZhZHQoc19mYWR0ICogZmFkdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9ocGV0LmggYi9jb20zMi9ncGxpbmNsdWRlL2FjcGkvaHBldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGVhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxpbmNsdWRlL2FjcGkvaHBldC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTEgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIEhQRVRfSAorI2RlZmluZSBIUEVUX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2RlZmluZSBIUEVUICJIUEVUIgorCitlbnVtIHsgSFBFVF9UQUJMRV9GT1VORCA9IDEgfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90ICphZGRyZXNzOworICAgIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgaGVhZGVyOworICAgIC8qIFdoYXQncyBpbnNpZGUgPyAqLworICAgIGJvb2wgdmFsaWQ7Cit9IHNfaHBldDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2FjcGkvbWFkdC5oIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL21hZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ4ZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL21hZHQuaApAQCAtMCwwICsxLDE1NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTUFEVF9ICisjZGVmaW5lIE1BRFRfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjZGVmaW5lIE1BRFQgIk1BRFQiCisjZGVmaW5lIEFQSUMgIkFQSUMiCisKK2VudW0geworICAgIFBST0NFU1NPUl9MT0NBTF9BUElDID0gMCwKKyAgICBJT19BUElDID0gMSwKKyAgICBJTlRFUlJVUFRfU09VUkNFX09WRVJSSURFID0gMiwKKyAgICBOTUkgPSAzLAorICAgIExPQ0FMX0FQSUNfTk1JX1NUUlVDVFVSRSA9IDQsCisgICAgTE9DQUxfQVBJQ19BRERSRVNTX09WRVJSSURFX1NUUlVDVFVSRSA9IDUsCisgICAgSU9fU0FQSUMgPSA2LAorICAgIExPQ0FMX1NBUElDID0gNywKKyAgICBQTEFURUZPUk1fSU5URVJSVVBUX1NPVVJDRVMgPSA4Cit9OworCisvKiBGZWF0dXJlcyBmbGFncyBmb3IgCisgKiAtIHByb2Nlc3Nvcl9sb2NhbF9hcGljIGZsYWdzCisgKiAtIGxvY2FsIHNhcGljIGZsYWdzCisgKi8KKyNkZWZpbmUgUFJPQ0VTU09SX0xPQ0FMX0FQSUNfRU5BQkxFIDEKKworI2RlZmluZSBNQVhfU19MX1AgMjU1Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCB0eXBlOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgYWNwaV9pZDsKKyAgICB1aW50OF90IGFwaWNfaWQ7CisgICAgdWludDMyX3QgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzX3Byb2Nlc3Nvcl9sb2NhbF9hcGljOworCisjZGVmaW5lIE1BWF9JT19BUElDIDI1NQordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IGlvX2FwaWNfaWQ7CisgICAgdWludDhfdCByZXNlcnZlZDsKKyAgICB1aW50MzJfdCBpb19hcGljX2FkZHJlc3M7CisgICAgdWludDMyX3QgZ2xvYmFsX3N5c3RlbV9pbnRlcnJ1cHRfYmFzZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHNfaW9fYXBpYzsKKworLyogRmVhdHVyZXMgZmxhZ3MgZm9yCisgKiAtIGludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGUKKyAqIC0gbm1pCisgKi8KKy8qIEJpdHMgMSYyIG11c3QgYmUgc2V0IHRvIDAgKi8KKyNkZWZpbmUgUE9MQVJJVFlfQ09ORk9STV9NQVNLIDB4MAorI2RlZmluZSBQT0xBUklUWV9BQ1RJVkVfSElHSCAweDEKKyNkZWZpbmUgUE9MQVJJVFlfUkVTRVJWRUQgMHgyCisjZGVmaW5lIFBPTEFSSVRZX0FDVElWRV9MT1cgMHgzCisvKiBCaXRzIDMmNCBtdXN0IGJlIHNldCB0byAwICovCisjZGVmaW5lIFRSSUdHRVJfQ09ORk9STV9NQVNLIDB4MworI2RlZmluZSBUUklHR0VSX0VER0UgMHg0CisjZGVmaW5lIFRSSUdHRVJfUkVTRVJWRUQgMHg4CisjZGVmaW5lIFRSSUdHRVJfTEVWRUwgMHhBCisKKyNkZWZpbmUgTUFYX0lfU19PIDI1NQordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IGJ1czsKKyAgICB1aW50OF90IHNvdXJjZTsKKyAgICB1aW50MzJfdCBnbG9iYWxfc3lzdGVtX2ludGVycnVwdDsKKyAgICB1aW50MTZfdCBmbGFnczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHNfaW50ZXJydXB0X3NvdXJjZV9vdmVycmlkZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IGZsYWdzOworICAgIHVpbnQzMl90IGdsb2JhbF9zeXN0ZW1faW50ZXJydXB0OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc19ubWk7CisKKyNkZWZpbmUgTUFYX0xPQ0FMX0FQSUNfTk1JIDI1NQordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IGFjcGlfcHJvY2Vzc29yX2lkOworICAgIHVpbnQxNl90IGZsYWdzOworICAgIHVpbnQ4X3QgbG9jYWxfYXBpY19saW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc19sb2NhbF9hcGljX25taTsKKworI2RlZmluZSBNQVhfTF9BX0FfTyAyNTUKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHR5cGU7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgdWludDE2X3QgcmVzZXJ2ZWQ7CisgICAgdWludDY0X3QgbG9jYWxfYXBpY19hZGRyZXNzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc19sb2NhbF9hcGljX2FkZHJlc3Nfb3ZlcnJpZGU7CisKKyNkZWZpbmUgTUFYX0lPX1NBUElDIDI1NQordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IGlvX2FwaWNfaWQ7CisgICAgdWludDhfdCByZXNlcnZlZDsKKyAgICB1aW50MzJfdCBnbG9iYWxfc3lzdGVtX2ludGVycnVwdF9iYXNlOworICAgIHVpbnQ2NF90IGlvX3NhcGljX2FkZHJlc3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzX2lvX3NhcGljOworCisjZGVmaW5lIEFDUElfUFJPQ0VTU09SX1VJRF9TVFJJTkdfT0ZGU0VUIDE2CisjZGVmaW5lIE1BWF9MT0NBTF9TQVBJQyAyNTUKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHR5cGU7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgdWludDhfdCBhY3BpX3Byb2Nlc3Nvcl9pZDsKKyAgICB1aW50OF90IGxvY2FsX3NhcGljX2lkOworICAgIHVpbnQ4X3QgbG9jYWxfc2FwaWNfZWlkOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbM107CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgdWludDMyX3QgYWNwaV9wcm9jZXNzb3JfdWlkX3ZhbHVlOworICAgIGNoYXIgKmFjcGlfcHJvY2Vzc29yX3VpZF9zdHJpbmc7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzX2xvY2FsX3NhcGljOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgKmFkZHJlc3M7CisgICAgc19hY3BpX2Rlc2NyaXB0aW9uX2hlYWRlciBoZWFkZXI7CisgICAgdWludDMyX3QgbG9jYWxfYXBpY19hZGRyZXNzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHNfcHJvY2Vzc29yX2xvY2FsX2FwaWMgcHJvY2Vzc29yX2xvY2FsX2FwaWNbTUFYX1NfTF9QXTsKKyAgICB1aW50OF90IHByb2Nlc3Nvcl9sb2NhbF9hcGljX2NvdW50OworICAgIHNfaW9fYXBpYyBpb19hcGljW01BWF9JT19BUElDXTsKKyAgICB1aW50OF90IGlvX2FwaWNfY291bnQ7CisgICAgc19pbnRlcnJ1cHRfc291cmNlX292ZXJyaWRlIGludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGVbTUFYX0lfU19PXTsKKyAgICB1aW50OF90IGludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGVfY291bnQ7CisgICAgc19ubWkgbm1pW01BWF9JX1NfT107CisgICAgdWludDhfdCBubWlfY291bnQ7CisgICAgc19sb2NhbF9hcGljX25taSBsb2NhbF9hcGljX25taVtNQVhfTE9DQUxfQVBJQ19OTUldOworICAgIHVpbnQ4X3QgbG9jYWxfYXBpY19ubWlfY291bnQ7CisgICAgc19sb2NhbF9hcGljX2FkZHJlc3Nfb3ZlcnJpZGUgbG9jYWxfYXBpY19hZGRyZXNzX292ZXJyaWRlW01BWF9MX0FfQV9PXTsKKyAgICB1aW50OF90IGxvY2FsX2FwaWNfYWRkcmVzc19vdmVycmlkZV9jb3VudDsKKyAgICBzX2lvX3NhcGljIGlvX3NhcGljW01BWF9JT19TQVBJQ107CisgICAgdWludDhfdCBpb19zYXBpY19jb3VudDsKKyAgICBzX2xvY2FsX3NhcGljIGxvY2FsX3NhcGljW01BWF9MT0NBTF9TQVBJQ107CisgICAgdWludDhfdCBsb2NhbF9zYXBpY19jb3VudDsKKyAgICBib29sIHZhbGlkOworfSBzX21hZHQ7CisKK3ZvaWQgcHJpbnRfbWFkdChzX21hZHQgKiBtYWR0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL21jZmcuaCBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9tY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2NzMxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9tY2ZnLmgKQEAgLTAsMCArMSwyOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTUNGR19ICisjZGVmaW5lIE1DRkdfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjZGVmaW5lIE1DRkcgIk1DRkciCisKK2VudW0geyBNQ0ZHX1RBQkxFX0ZPVU5EID0gMSB9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgKmFkZHJlc3M7CisgICAgc19hY3BpX2Rlc2NyaXB0aW9uX2hlYWRlciBoZWFkZXI7CisgICAgLyogV2hhdCdzIGluc2lkZSA/ICovCisgICAgYm9vbCB2YWxpZDsKK30gc19tY2ZnOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9yc2RwLmggYi9jb20zMi9ncGxpbmNsdWRlL2FjcGkvcnNkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNTg1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxpbmNsdWRlL2FjcGkvcnNkcC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTEgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIFJTRFBfSAorI2RlZmluZSBSU0RQX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2RlZmluZSBSU0RQX01JTl9BRERSRVNTIDB4MEUwMDAwCisjZGVmaW5lIFJTRFBfTUFYX0FERFJFU1MgMHgwRkZGRkYKKworI2RlZmluZSBSU0RQICJSU0QgUFRSIgorCitlbnVtIHsgUlNEUF9UQUJMRV9GT1VORCA9IDEgfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgKmFkZHJlc3M7CisgICAgdWludDhfdCBzaWduYXR1cmVbOCArIDFdOworICAgIHVpbnQ4X3QgY2hlY2tzdW07CisgICAgdWludDhfdCBvZW1faWRbNiArIDFdOworICAgIHVpbnQ4X3QgcmV2aXNpb247CisgICAgdWludDhfdCAqcnNkdF9hZGRyZXNzOworICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICB1aW50OF90ICp4c2R0X2FkZHJlc3M7CisgICAgdWludDhfdCBleHRlbmRlZF9jaGVja3N1bTsKKyAgICBib29sIHZhbGlkOworfSBzX3JzZHA7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3JzZHQuaCBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9yc2R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3NWE2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9yc2R0LmgKQEAgLTAsMCArMSwzMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgUlNEVF9ICisjZGVmaW5lIFJTRFRfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitlbnVtIHsgUlNEVF9UQUJMRV9GT1VORCA9IDF9OworCisjZGVmaW5lIFJTRFQgIlJTRFQiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICphZGRyZXNzOworICAgIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgaGVhZGVyOworICAgIHVpbnQ4X3QgKmVudHJ5WzI1NV07CisgICAgdWludDhfdCBlbnRyeV9jb3VudDsKKyAgICBib29sIHZhbGlkOworfSBzX3JzZHQ7CisKK2ludCBwYXJzZV9yc2R0KHNfcnNkdCAqIHJzZHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2FjcGkvc2JzdC5oIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3Nic3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjVjNDdmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3Nic3QuaApAQCAtMCwwICsxLDMwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBTQlNUX0gKKyNkZWZpbmUgU0JTVF9ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgU0JTVCAiU0JTVCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90ICphZGRyZXNzOworICAgIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgaGVhZGVyOworICAgIGJvb2wgdmFsaWQ7CisgICAgdWludDMyX3Qgd2FybmluZ19lbmVyZ3lfbGV2ZWw7CisgICAgdWludDMyX3QgbG93X2VuZXJneV9sZXZlbDsKKyAgICB1aW50MzJfdCBjcml0aWNhbF9lbmVyZ3lfbGV2ZWw7Cit9IHNfc2JzdDsKKwordm9pZCBwYXJzZV9zYnN0KHNfc2JzdCAqIHNic3QpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2FjcGkvc2xpYy5oIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3NsaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzc2MjdkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3NsaWMuaApAQCAtMCwwICsxLDI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBTTElDX0gKKyNkZWZpbmUgU0xJQ19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgU0xJQyAiU0xJQyIKKworZW51bSB7IFNMSUNfVEFCTEVfRk9VTkQgPSAxIH07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCAqYWRkcmVzczsKKyAgICBzX2FjcGlfZGVzY3JpcHRpb25faGVhZGVyIGhlYWRlcjsKKyAgICAvKiBXaGF0J3MgaW5zaWRlID8gKi8KKyAgICBib29sIHZhbGlkOworfSBzX3NsaWM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3NzZHQuaCBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9zc2R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3NGRjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS9zc2R0LmgKQEAgLTAsMCArMSwyOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgU1NEVF9ICisjZGVmaW5lIFNTRFRfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjZGVmaW5lIFNTRFQgIlNTRFQiCisjZGVmaW5lIFBTRFQgIlBTRFQiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCAqYWRkcmVzczsKKyAgICBzX2FjcGlfZGVzY3JpcHRpb25faGVhZGVyIGhlYWRlcjsKKyAgICB1aW50OF90ICpkZWZpbml0aW9uX2Jsb2NrOworICAgIGJvb2wgdmFsaWQ7Cit9IHNfc3NkdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2FjcGkvc3RydWN0cy5oIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3N0cnVjdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2U4NjBiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3N0cnVjdHMuaApAQCAtMCwwICsxLDQ3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBBQ1BJX1NUUlVDVFNfSAorI2RlZmluZSBBQ1BJX1NUUlVDVFNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisvKiBUaGlzIHZhbHVlIGRlZmluZSB0aGUgcmVhbCBzaXplIG9mIHRoZSBhY3BpIHN0cnVjdHVyZSAKKyAqIE91ciBpcyBiaWdnZXIgYXMgd2UgbWFuYWdlIHRoZSBcMCBvZiBzdHJpbmdzCisgKiAqLworI2RlZmluZSBBQ1BJX0hFQURFUl9TSVpFIDM2CisKK2VudW0geyBHQVNfU1lTVEVNX01FTU9SWT0wLCBHQVNfU1lTVEVNX0lPPTEgfTsKKworLyogR2VuZXJpYyBBZGRyZXNzIFN0cnVjdHVyZSAoR0FTKSBGb3JtYXQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBhZGRyZXNzX3NwYWNlX2lkIGNvdWxkIGJlIHtHQVNfU1lTVEVNX01FTU9SWSB8IEdBU19TWVNURU1fSU99ICovCisgICAgdWludDhfdCBhZGRyZXNzX3NwYWNlX2lkOworICAgIHVpbnQ4X3QgcmVnaXN0ZXJfYml0X3dpZHRoOworICAgIHVpbnQ4X3QgcmVnaXN0ZXJfYml0X29mZnNldDsKKyAgICB1aW50OF90IHJlc2VydmVkOworICAgIHVpbnQ2NF90IGFkZHJlc3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzX2dhczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3Qgc2lnbmF0dXJlWzQgKyAxXTsKKyAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgdWludDhfdCByZXZpc2lvbjsKKyAgICB1aW50OF90IGNoZWNrc3VtOworICAgIHVpbnQ4X3Qgb2VtX2lkWzYgKyAxXTsKKyAgICB1aW50OF90IG9lbV90YWJsZV9pZFs4ICsgMV07CisgICAgdWludDMyX3Qgb2VtX3JldmlzaW9uOworICAgIHVpbnQ4X3QgY3JlYXRvcl9pZFs0ICsgMV07CisgICAgdWludDMyX3QgY3JlYXRvcl9yZXZpc2lvbjsKK30gc19hY3BpX2Rlc2NyaXB0aW9uX2hlYWRlcjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2FjcGkvdGNwYS5oIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3RjcGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmIyODc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3RjcGEuaApAQCAtMCwwICsxLDI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBUQ1BBX0gKKyNkZWZpbmUgVENQQV9ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgVENQQSAiVENQQSIKKworZW51bSB7IFRDUEFfVEFCTEVfRk9VTkQgPSAxIH07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCAqYWRkcmVzczsKKyAgICBzX2FjcGlfZGVzY3JpcHRpb25faGVhZGVyIGhlYWRlcjsKKyAgICAvKiBXaGF0J3MgaW5zaWRlID8gKi8KKyAgICBib29sIHZhbGlkOworfSBzX3RjcGE7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9hY3BpL3hzZHQuaCBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS94c2R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlNDI3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvYWNwaS94c2R0LmgKQEAgLTAsMCArMSwzMCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgWFNEVF9ICisjZGVmaW5lIFhTRFRfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitlbnVtIHsgWFNEVF9UQUJMRV9GT1VORCA9IDEgfTsKKworI2RlZmluZSBYU0RUICJYU0RUIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAqYWRkcmVzczsKKyAgICBzX2FjcGlfZGVzY3JpcHRpb25faGVhZGVyIGhlYWRlcjsKKyAgICB1aW50NjRfdCAqZW50cnlbMjU1XTsKKyAgICB1aW50OF90IGVudHJ5X2NvdW50OworICAgIGJvb2wgdmFsaWQ7Cit9IHNfeHNkdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2NwdWlkLmggYi9jb20zMi9ncGxpbmNsdWRlL2NwdWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzM2U5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvY3B1aWQuaApAQCAtMCwwICsxLDMxNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYtMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIHRha2VuIGZyb20gdGhlIExpbnV4IGtlcm5lbCwKKyAqICAgQ29weXJpZ2h0IDE5OTEtMjAwOSBMaW51cyBUb3J2YWxkcyBhbmQgY29udHJpYnV0b3JzCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24gTUEgMDIxMTAtMTMwMTsKKyAqICAgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfQ1BVSURfSAorI2RlZmluZSBfQ1BVSURfSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPHN5cy9iaXRvcHMuaD4KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisjaW5jbHVkZSA8c3lzL2lvLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworI2RlZmluZSBQQUdFX1NJWkUgNDA5NgorCisjZGVmaW5lIENQVV9NT0RFTF9TSVpFICA0OAorI2RlZmluZSBDUFVfVkVORE9SX1NJWkUgNDgKKworI2RlZmluZSBDUFVfRkxBR1MobV8pIFwKK21fKGJvb2wsICBmcHUsIAkJCS8qIE9uYm9hcmQgRlBVICovKSBcCittXyhib29sLCAgdm1lLCAJCQkvKiBWaXJ0dWFsIE1vZGUgRXh0ZW5zaW9ucyAqLykgXAorbV8oYm9vbCwgIGRlLCAJCQkvKiBEZWJ1Z2dpbmcgRXh0ZW5zaW9ucyAqLykgXAorbV8oYm9vbCwgIHBzZSwJCQkvKiBQYWdlIFNpemUgRXh0ZW5zaW9ucyAqLykgXAorbV8oYm9vbCwgIHRzYywJCQkvKiBUaW1lIFN0YW1wIENvdW50ZXIgKi8pIFwKK21fKGJvb2wsICBtc3IsCQkJLyogTW9kZWwtU3BlY2lmaWMgUmVnaXN0ZXJzLCBSRE1TUiwgV1JNU1IgKi8pIFwKK21fKGJvb2wsICBwYWUsCQkJLyogUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb25zICovKSBcCittXyhib29sLCAgbWNlLAkJCS8qIE1hY2hpbmUgQ2hlY2sgQXJjaGl0ZWN0dXJlICovKSBcCittXyhib29sLCAgY3g4LAkJCS8qIENNUFhDSEc4IGluc3RydWN0aW9uICovKSBcCittXyhib29sLCAgYXBpYywJCQkvKiBPbmJvYXJkIEFQSUMgKi8pIFwKK21fKGJvb2wsICBzZXAsCQkJLyogU1lTRU5URVIvU1lTRVhJVCAqLykgXAorbV8oYm9vbCwgIG10cnIsCQkJLyogTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXJzICovKSBcCittXyhib29sLCAgcGdlLAkJCS8qIFBhZ2UgR2xvYmFsIEVuYWJsZSAqLykgXAorbV8oYm9vbCwgIG1jYSwJCQkvKiBNYWNoaW5lIENoZWNrIEFyY2hpdGVjdHVyZSAqLykgXAorbV8oYm9vbCwgIGNtb3YsCQkJLyogQ01PViBpbnN0cnVjdGlvbiAoRkNNT1ZDQyBhbmQgRkNPTUkgdG9vIGlmIEZQVSBwcmVzZW50KSAqLykgXAorbV8oYm9vbCwgIHBhdCwJCQkvKiBQYWdlIEF0dHJpYnV0ZSBUYWJsZSAqLykgXAorbV8oYm9vbCwgIHBzZV8zNiwJCS8qIDM2LWJpdCBQU0VzICovKSBcCittXyhib29sLCAgcHNuLAkJCS8qIFByb2Nlc3NvciBzZXJpYWwgbnVtYmVyICovKSBcCittXyhib29sLCAgY2xmbHNoLAkJLyogU3VwcG9ydHMgdGhlIENMRkxVU0ggaW5zdHJ1Y3Rpb24gKi8pIFwKK21fKGJvb2wsICBkdHMsCQkJLyogRGVidWcgVHJhY2UgU3RvcmUgKi8pIFwKK21fKGJvb2wsICBhY3BpLAkJCS8qIEFDUEkgdmlhIE1TUiAqLykgXAorbV8oYm9vbCwgIHBiZSwJCQkvKiBQZW5kaW5nIEJyZWFrIEVuYWJsZSAqLykgXAorbV8oYm9vbCwgIG1teCwJCQkvKiBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8pIFwKK21fKGJvb2wsICBmeHNyLAkJCS8qIEZYU0FWRSBhbmQgRlhSU1RPUiBpbnN0cnVjdGlvbnMgKGZhc3Qgc2F2ZSBhbmQgcmVzdG9yZSBvZiBGUFUgY29udGV4dCksIGFuZCBDUjQuT1NGWFNSIGF2YWlsYWJsZSAqLykgXAorbV8oYm9vbCwgIHNzZSwJCQkvKiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zICovKSBcCittXyhib29sLCAgc3NlMiwJCQkvKiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zIDIgKi8pIFwKK21fKGJvb2wsICBzcywJCQkvKiBDUFUgc2VsZiBzbm9vcCAqLykgXAorbV8oYm9vbCwgIGh0dCwJCQkvKiBIeXBlci1UaHJlYWRpbmcgKi8pIFwKK21fKGJvb2wsICBhY2MsCQkJLyogQXV0b21hdGljIGNsb2NrIGNvbnRyb2wgKi8pIFwKK21fKGJvb2wsICBzeXNjYWxsLAkJLyogU1lTQ0FMTC9TWVNSRVQgKi8pIFwKK21fKGJvb2wsICBtcCwJCQkvKiBNUCBDYXBhYmxlLiAqLykgXAorbV8oYm9vbCwgIG54LAkJCS8qIEV4ZWN1dGUgRGlzYWJsZSAqLykgXAorbV8oYm9vbCwgIG1teGV4dCwJCS8qIEFNRCBNTVggZXh0ZW5zaW9ucyAqLykgXAorbV8oYm9vbCwgIGZ4c3Jfb3B0LAkJLyogRlhTQVZFL0ZYUlNUT1Igb3B0aW1pemF0aW9ucyAqLykgXAorbV8oYm9vbCwgIGdicGFnZXMsCQkvKiAicGRwZTFnYiIgR0IgcGFnZXMgKi8pIFwKK21fKGJvb2wsICByZHRzY3AsCQkvKiBSRFRTQ1AgKi8pIFwKK21fKGJvb2wsICBsbSwJCQkvKiBMb25nIE1vZGUgKHg4Ni02NCkgKi8pIFwKK21fKGJvb2wsICBub3dleHQsCQkvKiBBTUQgM0ROb3chIGV4dGVuc2lvbnMgKi8pIFwKK21fKGJvb2wsICBub3csCQkJLyogM0ROb3chICovKSBcCittXyhib29sLCAgc21wLAkJCS8qIEEgc21wIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gZm91bmQgKi8pIFwKK21fKGJvb2wsICBwbmksCQkJLyogU3RyZWFtaW5nIFNJTUQgRXh0ZW5zaW9ucy0zICovKSBcCittXyhib29sLCAgcGNsbXVscWQsCQkvKiBQQ0xNVUxRRFEgaW5zdHJ1Y3Rpb24gKi8pIFwKK21fKGJvb2wsICBkdGVzNjQsCQkvKiA2NC1iaXQgRGVidWcgU3RvcmUgKi8pIFwKK21fKGJvb2wsICB2bXgsCQkJLyogSGFyZHdhcmUgdmlydHVhbGl6YXRpb24gKi8pIFwKK21fKGJvb2wsICBzbXgsCQkJLyogU2FmZXIgTW9kZSAqLykgXAorbV8oYm9vbCwgIGVzdCwJCQkvKiBFbmhhbmNlZCBTcGVlZFN0ZXAgKi8pIFwKK21fKGJvb2wsICB0bTIsCQkJLyogVGhlcm1hbCBNb25pdG9yIDIgICovKSBcCittXyhib29sLCAgc3NlMywJCQkvKiBTdXBwbGVtZW50YWwgU1NFLTMgKi8pIFwKK21fKGJvb2wsICBjaWQsCQkJLyogQ29udGV4dCBJRCAqLykgXAorbV8oYm9vbCwgIGZtYSwJCQkvKiBGdXNlZCBtdWx0aXBseS1hZGQgICovKSBcCittXyhib29sLCAgY3gxNiwJCQkvKiBDTVBYQ0hHMTZCICovKSBcCittXyhib29sLCAgeHRwciwJCQkvKiBTZW5kIFRhc2sgUHJpb3JpdHkgTWVzc2FnZXMgKi8pIFwKK21fKGJvb2wsICBwZGNtLAkJCS8qIFBlcmZvcm1hbmNlIENhcGFiaWxpdGllcyAgKi8pIFwKK21fKGJvb2wsICBkY2EsCQkJLyogRGlyZWN0IENhY2hlIEFjY2VzcyAqLykgXAorbV8oYm9vbCwgIHhtbTRfMSwJCS8qICJzc2U0XzEiIFNTRS00LjEgKi8pIFwKK21fKGJvb2wsICB4bW00XzIsCQkvKiAic3NlNF8yIiBTU0UtNC4yICovKSBcCittXyhib29sLCAgeDJhcGljLAkJLyogeDJBUElDICovKSBcCittXyhib29sLCAgbW92YmUsCQkJLyogTU9WQkUgaW5zdHJ1Y3Rpb24gKi8pIFwKK21fKGJvb2wsICBwb3BjbnQsCQkvKiBQT1BDTlQgaW5zdHJ1Y3Rpb24gKi8pIFwKK21fKGJvb2wsICBhZXMsCQkJLyogQUVTIEluc3RydWN0aW9uICovKSBcCittXyhib29sLCAgeHNhdmUsCQkJLyogWFNBVkUvWFJTVE9SL1hTRVRCVi9YR0VUQlYgKi8pIFwKK21fKGJvb2wsICBvc3hzYXZlLAkJLyogWFNBVkUgZW5hYmxlZCBpbiB0aGUgT1MgKi8pIFwKK21fKGJvb2wsICBhdngsCQkJLyogQWR2YW5jZWQgVmVjdG9yIEV4dGVuc2lvbnMgKi8pIFwKK21fKGJvb2wsICBoeXBlcnZpc29yLAkJLyogUnVubmluZyBvbiBhIGh5cGVydmlzb3IgKi8pIFwKK21fKGJvb2wsICBhY2UyLAkJCS8qIEFkdmFuY2VkIENyeXB0b2dyYXBoeSBFbmdpbmUgdjIgKi8pIFwKK21fKGJvb2wsICBhY2UyX2VuLAkJLyogQUNFIHYyIGVuYWJsZWQgKi8pIFwKK21fKGJvb2wsICBwaGUsCQkJLyogUGFkTG9jayBIYXNoIEVuZ2luZSAqLykgXAorbV8oYm9vbCwgIHBoZV9lbiwJCS8qIFBhZExvY2sgSGFzaCBFbmdpbmUgRW5hYmxlZCAqLykgXAorbV8oYm9vbCwgIHBtbSwJCQkvKiBQYWRMb2NrIE1vbnRnb21lcnkgTXVsdGlwbGllciAqLykgXAorbV8oYm9vbCwgIHBtbV9lbiwJCS8qIFBhZExvY2sgTW9udGdvbWVyeSBNdWx0aXBsaWVyIGVuYWJsZWQgKi8pIFwKK21fKGJvb2wsICBzdm0sCQkJLyogU2VjdXJlIHZpcnR1YWwgbWFjaGluZSAqLykgXAorbV8oYm9vbCwgIGV4dGFwaWMsCQkvKiBFeHRlbmRlZCBBUElDIHNwYWNlICovKSBcCittXyhib29sLCAgY3I4X2xlZ2FjeSwJCS8qIENSOCBpbiAzMi1iaXQgbW9kZSAqLykgXAorbV8oYm9vbCwgIGFibSwJCQkvKiBBZHZhbmNlZCBiaXQgbWFuaXB1bGF0aW9uICovKSBcCittXyhib29sLCAgc3NlNGEsCQkJLyogU1NFNC1BICovKSBcCittXyhib29sLCAgbWlzYWxpZ25zc2UsCQkvKiBNaXNhbGlnbmVkIFNTRSBtb2RlICovKSBcCittXyhib29sLCAgbm93cHJlZmV0Y2gsCQkvKiAzRE5vdyBwcmVmZXRjaCBpbnN0cnVjdGlvbnMgKi8pIFwKK21fKGJvb2wsICBvc3Z3LAkJCS8qIE9TIFZpc2libGUgV29ya2Fyb3VuZCAqLykgXAorbV8oYm9vbCwgIGlicywJCQkvKiAgSW5zdHJ1Y3Rpb24gQmFzZWQgU2FtcGxpbmcgKi8pIFwKK21fKGJvb2wsICBzc2U1LAkJCS8qIFNTRTUgKi8pIFwKK21fKGJvb2wsICBza2luaXQsCQkvKiBTS0lOSVQvU1RHSSBpbnN0cnVjdGlvbnMgKi8pIFwKK21fKGJvb2wsICB3ZHQsCQkJLyogV2F0Y2hkb2cgVGltZXIgKi8pIFwKK21fKGJvb2wsICBpZGEsCQkJLyogSW50ZWwgRHluYW1pYyBBY2NlbGVyYXRpb24gKi8pIFwKK21fKGJvb2wsICBhcmF0LAkJCS8qIEFsd2F5cyBSdW5uaW5nIEFQSUMgVGltZXIgKi8pIFwKK21fKGJvb2wsICB0cHJfc2hhZG93LAkJLyogSW50ZWwgVFBSIFNoYWRvdyAqLykgXAorbV8oYm9vbCwgIHZubWksCQkJLyogSW50ZWwgVmlydHVhbCBOTUkgKi8pIFwKK21fKGJvb2wsICBmbGV4cHJpb3JpdHksCQkvKiBJbnRlbCBGbGV4UHJpb3JpdHkgKi8pIFwKK21fKGJvb2wsICBlcHQsCQkJLyogSW50ZWwgRXh0ZW5kZWQgUGFnZSBUYWJsZSAqLykgXAorbV8oYm9vbCwgIHZwaWQsCQkJLyogSW50ZWwgVmlydHVhbCBQcm9jZXNzb3IgSUQgKi8pCisKKyNkZWZpbmUgU1RSVUNUX01FTUJFUlModHlwZV8sIG5hbWVfLCBjb21tZW50XykgdHlwZV8gbmFtZV87CisKKyNkZWZpbmUgU1RSVUNUX01FTUJFUl9OQU1FUyh0eXBlXywgbmFtZV8sIGNvbW1lbnRfKSAjbmFtZV8gLCAKKworI2RlZmluZSBTVFJVQ1RVUkVfTUVNQkVSX09GRlNFVFModHlwZV8sIG5hbWVfLCBjb21tZW50XykgXAorCSAgb2Zmc2V0b2Yoc19jcHVfZmxhZ3MsIG5hbWVfKSwKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENQVV9GTEFHUyhTVFJVQ1RfTUVNQkVSUykKK30gc19jcHVfZmxhZ3M7CisKK2V4dGVybiBzaXplX3QgY3B1X2ZsYWdzX29mZnNldFtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmNwdV9mbGFnc19uYW1lc1tdOworZXh0ZXJuIHNpemVfdCBjcHVfZmxhZ3NfY291bnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyIHZlbmRvcltDUFVfVkVORE9SX1NJWkVdOworICAgIHVpbnQ4X3QgdmVuZG9yX2lkOworICAgIHVpbnQ4X3QgZmFtaWx5OworICAgIGNoYXIgbW9kZWxbQ1BVX01PREVMX1NJWkVdOworICAgIHVpbnQ4X3QgbW9kZWxfaWQ7CisgICAgdWludDhfdCBzdGVwcGluZzsKKyAgICB1aW50OF90IG51bV9jb3JlczsKKyAgICB1aW50MTZfdCBsMV9kYXRhX2NhY2hlX3NpemU7CisgICAgdWludDE2X3QgbDFfaW5zdHJ1Y3Rpb25fY2FjaGVfc2l6ZTsKKyAgICB1aW50MTZfdCBsMl9jYWNoZV9zaXplOworICAgIHNfY3B1X2ZsYWdzIGZsYWdzOworfSBzX2NwdTsKKworZXh0ZXJuIGJvb2wgZ2V0X2NwdV9mbGFnX3ZhbHVlX2Zyb21fbmFtZShzX2NwdSAqY3B1LCBjb25zdCBjaGFyICogZmxhZyk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnJvbSB0aGlzIHBvaW50IHRoaXMgaXMgc29tZSBpbnRlcm5hbCBzdHVmZiBtYWlubHkgdGFrZW4gZnJvbSB0aGUgbGludXgga2VybmVsICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRUZMQUdTIGJpdHMKKyAqLworI2RlZmluZSBYODZfRUZMQUdTX0NGICAgMHgwMDAwMDAwMQkvKiBDYXJyeSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfUEYgICAweDAwMDAwMDA0CS8qIFBhcml0eSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfQUYgICAweDAwMDAwMDEwCS8qIEF1eGlsbGFyeSBjYXJyeSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfWkYgICAweDAwMDAwMDQwCS8qIFplcm8gRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1NGICAgMHgwMDAwMDA4MAkvKiBTaWduIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19URiAgIDB4MDAwMDAxMDAJLyogVHJhcCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfSUYgICAweDAwMDAwMjAwCS8qIEludGVycnVwdCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfREYgICAweDAwMDAwNDAwCS8qIERpcmVjdGlvbiBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfT0YgICAweDAwMDAwODAwCS8qIE92ZXJmbG93IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19JT1BMIDB4MDAwMDMwMDAJLyogSU9QTCBtYXNrICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfTlQgICAweDAwMDA0MDAwCS8qIE5lc3RlZCBUYXNrICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfUkYgICAweDAwMDEwMDAwCS8qIFJlc3VtZSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVk0gICAweDAwMDIwMDAwCS8qIFZpcnR1YWwgTW9kZSAqLworI2RlZmluZSBYODZfRUZMQUdTX0FDICAgMHgwMDA0MDAwMAkvKiBBbGlnbm1lbnQgQ2hlY2sgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19WSUYgIDB4MDAwODAwMDAJLyogVmlydHVhbCBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1ZJUCAgMHgwMDEwMDAwMAkvKiBWaXJ0dWFsIEludGVycnVwdCBQZW5kaW5nICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfSUQgICAweDAwMjAwMDAwCS8qIENQVUlEIGRldGVjdGlvbiBmbGFnICovCisKKyNkZWZpbmUgWDg2X1ZFTkRPUl9JTlRFTCAwCisjZGVmaW5lIFg4Nl9WRU5ET1JfQ1lSSVggMQorI2RlZmluZSBYODZfVkVORE9SX0FNRCAyCisjZGVmaW5lIFg4Nl9WRU5ET1JfVU1DIDMKKyNkZWZpbmUgWDg2X1ZFTkRPUl9ORVhHRU4gNAorI2RlZmluZSBYODZfVkVORE9SX0NFTlRBVVIgNQorI2RlZmluZSBYODZfVkVORE9SX1JJU0UgNgorI2RlZmluZSBYODZfVkVORE9SX1RSQU5TTUVUQSA3CisjZGVmaW5lIFg4Nl9WRU5ET1JfTlNDIDgKKyNkZWZpbmUgWDg2X1ZFTkRPUl9VTktOT1dOIDkgCisjZGVmaW5lIFg4Nl9WRU5ET1JfTlVNIDEwIAorCisjZGVmaW5lIGNwdV9oYXMoYywgYml0KSAgICAgICAgICAgICAgICB0ZXN0X2JpdChiaXQsIChjKS0+eDg2X2NhcGFiaWxpdHkpCisKKy8vIFRha2VuIGZyb20gYXNtL3Byb2Nlc3Nvci1mbGFncy5oCisvLyBOU0MvQ3lyaXggQ1BVIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaW5kZXhlcworI2RlZmluZSBDWDg2X0NDUjIgICAgICAgMHhjMgorI2RlZmluZSBDWDg2X0NDUjMJMHhjMworI2RlZmluZSBDWDg2X0RJUjAgICAgICAgMHhmZQorI2RlZmluZSBDWDg2X0RJUjEgICAgICAgMHhmZgorCitzdGF0aWMgY29uc3QgY2hhciBDeDg2X21vZGVsW11bOV0gPSB7CisJIkN4NDg2IiwgIkN4NDg2IiwgIjV4ODYgIiwgIjZ4ODYiLCAiTWVkaWFHWCAiLCAiNng4Nk1YICIsCisJIk0gSUkgIiwgIlVua25vd24iCit9OworCitzdGF0aWMgY29uc3QgY2hhciBDeDQ4Nl9uYW1lW11bNV0gPSB7CisJIlNMQyIsICJETEMiLCAiU0xDMiIsICJETEMyIiwgIlNSeCIsICJEUngiLAorCSJTUngyIiwgIkRSeDIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciBDeDQ4NlNfbmFtZVtdWzRdID0geworCSJTIiwgIlMyIiwgIlNlIiwgIlMyZSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIEN4NDg2RF9uYW1lW11bNF0gPSB7CisJIkRYIiwgIkRYMiIsICI/IiwgIj8iLCAiPyIsICJEWDQiCit9OworCisKKy8qCisgKiAgQ1BVIHR5cGUgYW5kIGhhcmR3YXJlIGJ1ZyBmbGFncy4gS2VwdCBzZXBhcmF0ZWx5IGZvciBlYWNoIENQVS4KKyAqICBNZW1iZXJzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSByZWZlcmVuY2VkIGluIGhlYWQuUywgc28gdGhpbmsgdHdpY2UKKyAqICBiZWZvcmUgdG91Y2hpbmcgdGhlbS4gW21qXQorICovCisKK3N0cnVjdCBjcHVpbmZvX3g4NiB7CisgICAgdWludDhfdCB4ODY7CQkvKiBDUFUgZmFtaWx5ICovCisgICAgdWludDhfdCB4ODZfdmVuZG9yOwkJLyogQ1BVIHZlbmRvciAqLworICAgIHVpbnQ4X3QgeDg2X21vZGVsOworICAgIHVpbnQ4X3QgeDg2X21hc2s7CisgICAgY2hhciB3cF93b3Jrc19vazsJCS8qIEl0IGRvZXNuJ3Qgb24gMzg2J3MgKi8KKyAgICBjaGFyIGhsdF93b3Jrc19vazsJCS8qIFByb2JsZW1zIG9uIHNvbWUgNDg2RHg0J3MgYW5kIG9sZCAzODYncyAqLworICAgIGNoYXIgaGFyZF9tYXRoOworICAgIGNoYXIgcmZ1OworICAgIGludCBjcHVpZF9sZXZlbDsJCS8qIE1heGltdW0gc3VwcG9ydGVkIENQVUlEIGxldmVsLCAtMT1ubyBDUFVJRCAqLworICAgIHVpbnQzMl90IHg4Nl9jYXBhYmlsaXR5W05DQVBJTlRTXTsKKyAgICBjaGFyIHg4Nl92ZW5kb3JfaWRbMTZdOworICAgIGNoYXIgeDg2X21vZGVsX2lkWzY0XTsKKyAgICB1aW50MTZfdCB4ODZfbDFfZGF0YV9jYWNoZV9zaXplOwkvKiBpbiBLQiwgaWYgYXZhaWxhYmxlICovCisgICAgdWludDE2X3QgeDg2X2wxX2luc3RydWN0aW9uX2NhY2hlX3NpemU7CS8qIGluIEtCLCBpZiBhdmFpbGFibGUgKi8KKyAgICB1aW50MTZfdCB4ODZfbDJfY2FjaGVfc2l6ZTsJLyogaW4gS0IsIGlmIGF2YWlsYWJsZSAqLworICAgIGludCB4ODZfY2FjaGVfYWxpZ25tZW50OwkvKiBpbiBieXRlcyAqLworICAgIGNoYXIgZmRpdl9idWc7CisgICAgY2hhciBmMDBmX2J1ZzsKKyAgICBjaGFyIGNvbWFfYnVnOworICAgIGNoYXIgcGFkMDsKKyAgICBpbnQgeDg2X3Bvd2VyOworICAgIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OworI2lmZGVmIENPTkZJR19TTVAKKyAgICBjcHVtYXNrX3QgbGxjX3NoYXJlZF9tYXA7CS8qIGNwdXMgc2hhcmluZyB0aGUgbGFzdCBsZXZlbCBjYWNoZSAqLworI2VuZGlmCisgICAgdW5zaWduZWQgY2hhciB4ODZfbnVtX2NvcmVzOwkvKiBjcHVpZCByZXR1cm5lZCB0aGUgbnVtYmVyIG9mIGNvcmVzICovCisgICAgdW5zaWduZWQgY2hhciBib290ZWRfY29yZXM7CS8qIG51bWJlciBvZiBjb3JlcyBhcyBzZWVuIGJ5IE9TICovCisgICAgdW5zaWduZWQgY2hhciBhcGljaWQ7CisgICAgdW5zaWduZWQgY2hhciB4ODZfY2xmbHVzaF9zaXplOworCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBjcHVfbW9kZWxfaW5mbyB7CisgICAgaW50IHZlbmRvcjsKKyAgICBpbnQgZmFtaWx5OworICAgIGNoYXIgKm1vZGVsX25hbWVzWzE2XTsKK307CisKKy8qIGF0dGVtcHQgdG8gY29uc29saWRhdGUgY3B1IGF0dHJpYnV0ZXMgKi8KK3N0cnVjdCBjcHVfZGV2IHsKKyAgICBjb25zdCBjaGFyICpjX3ZlbmRvcjsKKworICAgIC8qIHNvbWUgaGF2ZSB0d28gcG9zc2liaWxpdGllcyBmb3IgY3B1aWQgc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqY19pZGVudFsyXTsKKworICAgIHN0cnVjdCBjcHVfbW9kZWxfaW5mbyBjX21vZGVsc1s0XTsKKworICAgIHZvaWQgKCpjX2luaXQpIChzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKTsKKyAgICB2b2lkICgqY19pZGVudGlmeSkgKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpOworICAgIHVuc2lnbmVkIGludCAoKmNfc2l6ZV9jYWNoZSkgKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKTsKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIFNNUCBtYWNoaW5lcyBmb2xsb3dpbmcgdGhlCisgKiBJbnRlbCBNdWx0aXByb2Nlc3NpbmcgU3BlY2lmaWNhdGlvbiAxLjEgYW5kIDEuNC4KKyAqLworCisvKgorICogVGhpcyB0YWcgaWRlbnRpZmllcyB3aGVyZSB0aGUgU01QIGNvbmZpZ3VyYXRpb24KKyAqIGluZm9ybWF0aW9uIGlzLgorICovCisKKyNkZWZpbmUgU01QX01BR0lDX0lERU5UICgoJ18nPDwyNCl8KCdQJzw8MTYpfCgnTSc8PDgpfCdfJykKKworc3RydWN0IGludGVsX21wX2Zsb2F0aW5nIHsKKyAgICBjaGFyIG1wZl9zaWduYXR1cmVbNF07CS8qICJfTVBfIiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1aW50MzJfdCBtcGZfcGh5c3B0cjsJLyogQ29uZmlndXJhdGlvbiB0YWJsZSBhZGRyZXNzICAqLworICAgIHVpbnQ4X3QgbXBmX2xlbmd0aDsJCS8qIE91ciBsZW5ndGggKHBhcmFncmFwaHMpICAgICAgKi8KKyAgICB1aW50OF90IG1wZl9zcGVjaWZpY2F0aW9uOwkvKiBTcGVjaWZpY2F0aW9uIHZlcnNpb24gICAgICAgICovCisgICAgdWludDhfdCBtcGZfY2hlY2tzdW07CS8qIENoZWNrc3VtIChtYWtlcyBzdW0gMCkgICAgICAgKi8KKyAgICB1aW50OF90IG1wZl9mZWF0dXJlMTsJLyogU3RhbmRhcmQgb3IgY29uZmlndXJhdGlvbiA/ICAqLworICAgIHVpbnQ4X3QgbXBmX2ZlYXR1cmUyOwkvKiBCaXQ3IHNldCBmb3IgSU1DUnxQSUMgICAgICAgICovCisgICAgdWludDhfdCBtcGZfZmVhdHVyZTM7CS8qIFVudXNlZCAoMCkgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1aW50OF90IG1wZl9mZWF0dXJlNDsJLyogVW51c2VkICgwKSAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQ4X3QgbXBmX2ZlYXR1cmU1OwkvKiBVbnVzZWQgKDApICAgICAgICAgICAgICAgICAgICovCit9OworCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZ2V0Q3g4Nih1aW50OF90IHJlZykgeworCW91dGIocmVnLCAweDIyKTsKKwlyZXR1cm4gaW5iKDB4MjMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0Q3g4Nih1aW50OF90IHJlZywgdWludDhfdCBkYXRhKSB7CisJb3V0YihyZWcsIDB4MjIpOworCW91dGIoZGF0YSwgMHgyMyk7Cit9CisKK2V4dGVybiB2b2lkIGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CitleHRlcm4gdm9pZCBkZXRlY3RfY3B1KHNfY3B1ICogY3B1KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL2Jvb3Rsb2FkZXJzLmggYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svYm9vdGxvYWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmEwZjRlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL2Jvb3Rsb2FkZXJzLmgKQEAgLTAsMCArMSwxOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllcgorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgU3lzbGludXgsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9fQk9PVExPQURFUlNfSF8KKyNkZWZpbmUgX19CT09UTE9BREVSU19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZGlzay9nZW9tLmg+CisjaW5jbHVkZSA8ZGlzay9wYXJ0aXRpb24uaD4KKworaW50IGdldF9ib290bG9hZGVyX3N0cmluZyhzdHJ1Y3QgZHJpdmVpbmZvICosIGNvbnN0IHN0cnVjdCBwYXJ0X2VudHJ5ICosCisJCQkgIGNoYXIgKiwgY29uc3QgaW50KTsKKyNlbmRpZiAvKiBfX0JPT1RMT0FERVJTX0hfICovCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2Rpc2svY29tbW9uLmggYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0MTVjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvZGlzay9jb21tb24uaApAQCAtMCwwICsxLDMzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBQaWVycmUtQWxleGFuZHJlIE1leWVyCisgKgorICogICBTb21lIHBhcnRzIGJvcnJvd2VkIGZyb20gY2hhaW4uYzMyOgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFN5c2xpbnV4LCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfQ09NTU9OX0hfCisjZGVmaW5lIF9DT01NT05fSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBGb3IgUEFHRV9TSVpFICovCisjaW5jbHVkZSA8Y3B1aWQuaD4KKworI2RlZmluZSBTRUNUT1IgNTEyCQkvKiBieXRlcy9zZWN0b3IgKi8KKworc3RydWN0IGViaW9zX2RhcGEgeworICAgIHVpbnQxNl90IGxlbjsKKyAgICB1aW50MTZfdCBjb3VudDsKKyAgICB1aW50MTZfdCBvZmY7CisgICAgdWludDE2X3Qgc2VnOworICAgIHVpbnQ2NF90IGxiYTsKK307CisKKyNlbmRpZiAvKiBfQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2Rpc2svZXJybm9fZGlzay5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL2Vycm5vX2Rpc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGJkODlkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL2Vycm5vX2Rpc2suaApAQCAtMCwwICsxLDUwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBQaWVycmUtQWxleGFuZHJlIE1leWVyCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTeXNsaW51eCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX0VSUk5PX0RJU0tfSAorI2RlZmluZSBfRVJSTk9fRElTS19ICisKK2V4dGVybiBpbnQgZXJybm9fZGlzazsKKworLyogUHJlZml4IHdpdGggRUQgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggZXJybm8gKi8KKyNkZWZpbmUJRURJTlYJMHgwMQkJLyogSW52YWxpZCBmdW5jdGlvbiBpbiBBSCBvciBpbnZhbGlkIHBhcmFtZXRlciAqLworI2RlZmluZQlFREFERFIJMHgwMgkJLyogQWRkcmVzcyBtYXJrIG5vdCBmb3VuZCAqLworI2RlZmluZQlFRFJPCTB4MDMJCS8qIERpc2sgd3JpdGUtcHJvdGVjdGVkICovCisjZGVmaW5lCUVETk9GTkQJMHgwNAkJLyogU2VjdG9yIG5vdCBmb3VuZC9yZWFkIGVycm9yICovCisjZGVmaW5lCUVEUkZBSUwJMHgwNQkJLyogUmVzZXQgZmFpbGVkIChoYXJkIGRpc2spICovCisjZGVmaW5lCUVEQ0hBTkcJMHgwNgkJLyogRGlzayBjaGFuZ2VkIChmbG9wcHkpICovCisjZGVmaW5lCUVERkFJTAkweDA3CQkvKiBEcml2ZSBwYXJhbWV0ZXIgYWN0aXZpdHkgZmFpbGVkIChoYXJkIGRpc2spICovCisjZGVmaW5lCUVERE1BCTB4MDgJCS8qIERNQSBvdmVycnVuICovCisjZGVmaW5lCUVEQk9VTkQJMHgwOQkJLyogRGF0YSBib3VuZGFyeSBlcnJvciAoYXR0ZW1wdGVkIERNQSBhY3Jvc3MgNjRLIGJvdW5kYXJ5IG9yID44MGggc2VjdG9ycykgKi8KKyNkZWZpbmUJRURCQURTCTB4MEEJCS8qIEJhZCBzZWN0b3IgZGV0ZWN0ZWQgKGhhcmQgZGlzaykgKi8KKyNkZWZpbmUJRURCQURUCTB4MEIJCS8qIEJhZCB0cmFjayBkZXRlY3RlZCAoaGFyZCBkaXNrKSAqLworI2RlZmluZQlFRElOVk0JMHgwQwkJLyogVW5zdXBwb3J0ZWQgdHJhY2sgb3IgaW52YWxpZCBtZWRpYSAqLworI2RlZmluZQlFRElOVlMJMHgwRAkJLyogSW52YWxpZCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBmb3JtYXQgKFBTLzIgaGFyZCBkaXNrKSAqLworI2RlZmluZQlFREFERFJNCTB4MEUJCS8qIENvbnRyb2wgZGF0YSBhZGRyZXNzIG1hcmsgZGV0ZWN0ZWQgKGhhcmQgZGlzaykgKi8KKyNkZWZpbmUJRURETUFSRwkweDBGCQkvKiBETUEgYXJiaXRyYXRpb24gbGV2ZWwgb3V0IG9mIHJhbmdlIChoYXJkIGRpc2spICovCisjZGVmaW5lCUVEQ1JDRgkweDEwCQkvKiBVbmNvcnJlY3RhYmxlIENSQyBvciBFQ0MgZXJyb3Igb24gcmVhZCAqLworI2RlZmluZQlFRENSQ1YJMHgxMQkJLyogRGF0YSBFQ0MgY29ycmVjdGVkIChoYXJkIGRpc2spICovCisjZGVmaW5lCUVEQ1RSTAkweDIwCQkvKiBDb250cm9sbGVyIGZhaWx1cmUgKi8KKyNkZWZpbmUJRURNRURJQQkweDMxCQkvKiBObyBtZWRpYSBpbiBkcml2ZSAoSUJNL01TIElOVCAxMyBleHRlbnNpb25zKSAqLworI2RlZmluZQlFRENNT1MJMHgzMgkJLyogSW5jb3JyZWN0IGRyaXZlIHR5cGUgc3RvcmVkIGluIENNT1MgKENvbXBhcSkgKi8KKyNkZWZpbmUJRURTRUVLRgkweDQwCQkvKiBTZWVrIGZhaWxlZCAqLworI2RlZmluZQlFRFRJTUUJMHg4MAkJLyogVGltZW91dCAobm90IHJlYWR5KSAqLworI2RlZmluZQlFRFJFQURZCTB4QUEJCS8qIERyaXZlIG5vdCByZWFkeSAoaGFyZCBkaXNrKSAqLworI2RlZmluZQlFRE5MT0NLCTB4QjAJCS8qIFZvbHVtZSBub3QgbG9ja2VkIGluIGRyaXZlIChJTlQgMTMgZXh0ZW5zaW9ucykgKi8KKyNkZWZpbmUJRURMT0NLCTB4QjEJCS8qIFZvbHVtZSBsb2NrZWQgaW4gZHJpdmUgKElOVCAxMyBleHRlbnNpb25zKSAqLworI2RlZmluZQlFRFJFTU9WCTB4QjIJCS8qIFZvbHVtZSBub3QgcmVtb3ZhYmxlIChJTlQgMTMgZXh0ZW5zaW9ucykgKi8KKyNkZWZpbmUJRURVU0VECTB4QjMJCS8qIFZvbHVtZSBpbiB1c2UgKElOVCAxMyBleHRlbnNpb25zKSAqLworI2RlZmluZQlFRENPVU5UCTB4QjQJCS8qIExvY2sgY291bnQgZXhjZWVkZWQgKElOVCAxMyBleHRlbnNpb25zKSAqLworI2RlZmluZQlFREVKRgkweEI1CQkvKiBWYWxpZCBlamVjdCByZXF1ZXN0IGZhaWxlZCAoSU5UIDEzIGV4dGVuc2lvbnMpICovCisjZGVmaW5lCUVEVU5LT1dOCTB4QkIJLyogVW5kZWZpbmVkIGVycm9yIChoYXJkIGRpc2spICovCisjZGVmaW5lCUVEV0YJMHhDQwkJLyogV3JpdGUgZmF1bHQgKGhhcmQgZGlzaykgKi8KKyNkZWZpbmUJRURSRgkweEUwCQkvKiBTdGF0dXMgcmVnaXN0ZXIgZXJyb3IgKGhhcmQgZGlzaykgKi8KKyNkZWZpbmUJRURTRgkweEZGCQkvKiBTZW5zZSBvcGVyYXRpb24gZmFpbGVkIChoYXJkIGRpc2spICovCisKKyNlbmRpZiAvKiBfRVJSTk9fRElTS19IICovCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2Rpc2svZXJyb3IuaCBiL2NvbTMyL2dwbGluY2x1ZGUvZGlzay9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDI2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svZXJyb3IuaApAQCAtMCwwICsxLDEzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBQaWVycmUtQWxleGFuZHJlIE1leWVyCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTeXNsaW51eCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX0VSUk9SX0hfCisjZGVmaW5lIF9FUlJPUl9IXwordm9pZCBnZXRfZXJyb3IoY29uc3QgY2hhciAqKTsKKyNlbmRpZiAvKiBfRVJST1JfSF8gKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGluY2x1ZGUvZGlzay9nZW9tLmggYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svZ2VvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWM3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svZ2VvbS5oCkBAIC0wLDAgKzEsMzI2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBQaWVycmUtQWxleGFuZHJlIE1leWVyCisgKgorICogICBTb21lIHBhcnRzIGJvcnJvd2VkIGZyb20gY2hhaW4uYzMyOgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFNvbWUgcGFydHMgYm9ycm93ZWQgZnJvbSBMaW51eDoKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCBEZWxsIEluYy4KKyAqICAgYnkgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgU3lzbGludXgsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9HRU9NX0hfCisjZGVmaW5lIF9HRU9NX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBJTlQgMTMgRXh0ZW5zaW9ucworICoKKyAqIE5vdGU6IGlmIHRoZSBzaXplIGlzIGxlc3MgdGhhbiAzMCBvbiBjYWxsLCB0aGUgZmluYWwgRFdPUkQgd2lsbCBub3QgYmUKKyAqICAgICAgIHJldHVybmVkIGJ5IGEgdjIueCBpbXBsZW1lbnRhdGlvbjsgc2ltaWxhcmx5IGZvciB0aGUgRGV2aWNlIFBhdGggaW5mbworICoqLworc3RydWN0IGVkZF9kZXZpY2VfcGFyYW1ldGVycyB7CisgICAgdWludDE2X3QgbGVuOwkJLyogc2l6ZSBvZiByZXR1cm5lZCBkYXRhICovCisJLyoqCisJICogQml0ZmllbGRzIGZvciBJQk0vTVMgSU5UIDEzIEV4dGVuc2lvbnMgaW5mb3JtYXRpb24gZmxhZ3M6CisJICogQml0KHMpICAgIERlc2NyaXB0aW9uICAgIChUYWJsZSAwMDI3NCkKKwkgKiAwICAgIERNQSBib3VuZGFyeSBlcnJvcnMgaGFuZGxlZCB0cmFuc3BhcmVudGx5CisJICogMSAgICBjeWxpbmRlci9oZWFkL3NlY3RvcnMtcGVyLXRyYWNrIGluZm9ybWF0aW9uIGlzIHZhbGlkCisJICogMiAgICByZW1vdmFibGUgZHJpdmUKKwkgKiAzICAgIHdyaXRlIHdpdGggdmVyaWZ5IHN1cHBvcnRlZAorCSAqIDQgICAgZHJpdmUgaGFzIGNoYW5nZS1saW5lIHN1cHBvcnQgKHJlcXVpcmVkIGlmIGRyaXZlID49IDgwaCBpcyByZW1vdmFibGUpCisJICogNSAgICBkcml2ZSBjYW4gYmUgbG9ja2VkIChyZXF1aXJlZCBpZiBkcml2ZSA+PSA4MGggaXMgcmVtb3ZhYmxlKQorCSAqIDYgICAgQ0hTIGluZm9ybWF0aW9uIHNldCB0byBtYXhpbXVtIHN1cHBvcnRlZCB2YWx1ZXMsIG5vdCBjdXJyZW50IG1lZGlhCisJICogMTUtNyAgICByZXNlcnZlZCAoMCkKKwkgKiovCisgICAgdWludDE2X3QgaW5mbzsJCS8qIGluZm9ybWF0aW9uIGZsYWdzICovCisgICAgdWludDMyX3QgY3lsaW5kZXJzOwkJLyogbnVtYmVyIG9mIHBoeXNpY2FsIGN5bGluZGVycyBvbiBkcml2ZSAqLworICAgIHVpbnQzMl90IGhlYWRzOwkJLyogbnVtYmVyIG9mIHBoeXNpY2FsIGhlYWRzIG9uIGRyaXZlICovCisgICAgdWludDMyX3Qgc2VjdG9yc19wZXJfdHJhY2s7CS8qIG51bWJlciBvZiBwaHlzaWNhbCBzZWN0b3JzIHBlciB0cmFjayAqLworICAgIHVpbnQ2NF90IHNlY3RvcnM7CQkvKiB0b3RhbCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBkcml2ZSAqLworICAgIHVpbnQxNl90IGJ5dGVzX3Blcl9zZWN0b3I7CS8qIGJ5dGVzIHBlciBzZWN0b3IgKi8KKyAgICAvKiAtLS0gdjIuMCsgLS0tICovCisgICAgdWludDMyX3QgZHB0ZV9wb2ludGVyOwkvKiBFREQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLCBGRkZGaDpGRkZGaCBpZiBub3QgYXZhaWxhYmxlICovCisgICAgLyogLS0tIHYzLjAgLS0tICovCisgICAgdWludDE2X3QgZGV2aWNlX3BhdGhfaW5mb3JtYXRpb247CS8qIHNpZ25hdHVyZSBCRUREaCB0byBpbmRpY2F0ZSBwcmVzZW5jZSBvZiBEZXZpY2UgUGF0aCBpbmZvICovCisgICAgdWludDhfdCBkZXZpY2VfcGF0aF9sZW5ndGg7CS8qIGxlbmd0aCBvZiBEZXZpY2UgUGF0aCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHNpZ25hdHVyZSBhbmQgdGhpcyBieXRlICgyNGggZm9yIHYzLjApICovCisgICAgdWludDhfdCBkZXZpY2VfcGF0aF9yZXNlcnZlZDsJLyogcmVzZXJ2ZWQgKDApICovCisgICAgdWludDE2X3QgZGV2aWNlX3BhdGhfcmVzZXJ2ZWRfMjsJLyogcmVzZXJ2ZWQgKDApICovCisgICAgdWludDhfdCBob3N0X2J1c190eXBlWzRdOwkvKiBBU0NJWiBuYW1lIG9mIGhvc3QgYnVzICgiSVNBIiBvciAiUENJIikgKi8KKyAgICB1aW50OF90IGludGVyZmFjZV90eXBlWzhdOwkvKiBBU0NJWiBuYW1lIG9mIGludGVyZmFjZSB0eXBlCisJCQkJICogICAgICAgICAiQVRBIgorCQkJCSAqICAgICAgICAgIkFUQVBJIgorCQkJCSAqICAgICAgICAgIlNDU0kiCisJCQkJICogICAgICAgICAiVVNCIgorCQkJCSAqICAgICAgICAgIjEzOTQiIElFRUUgMTM5NCAoRmlyZVdpcmUpCisJCQkJICogICAgICAgICAiRklCUkUiIEZpYnJlIENoYW5uZWwKKwkJCQkgKi8KKwkvKioKKwkgKiBGb3JtYXQgb2YgRUREIHYzLjAgSW50ZXJmYWNlIFBhdGg6CisJICogT2Zmc2V0ICAgIFNpemUgICAgRGVzY3JpcHRpb24gICAgKFRhYmxlIDAwMjc1KQorCSAqIC0tLUlTQS0tLQorCSAqIDAwaCAgICBXT1JEICAgIDE2LWJpdCBiYXNlIGFkZHJlc3MKKwkgKiAwMmggNiBCWVRFcyAgICByZXNlcnZlZCAoMCkKKwkgKiAtLS1QQ0ktLS0KKwkgKiAwMGggICAgQllURSAgICBQQ0kgYnVzIG51bWJlcgorCSAqIDAxaCAgICBCWVRFICAgIFBDSSBkZXZpY2UgbnVtYmVyCisJICogMDJoICAgIEJZVEUgICAgUENJIGZ1bmN0aW9uIG51bWJlcgorCSAqIDAzaCA1IEJZVEVzICAgIHJlc2VydmVkICgwKQorCSAqKi8KKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdWludDE2X3QgYmFzZV9hZGRyZXNzOworCSAgICB1aW50MTZfdCByZXNlcnZlZDE7CisJICAgIHVpbnQzMl90IHJlc2VydmVkMjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpc2E7CisJc3RydWN0IHsKKwkgICAgdWludDhfdCBidXM7CisJICAgIHVpbnQ4X3Qgc2xvdDsKKwkgICAgdWludDhfdCBmdW5jdGlvbjsKKwkgICAgdWludDhfdCBjaGFubmVsOworCSAgICB1aW50MzJfdCByZXNlcnZlZDsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwY2k7CisJLyogcGNpeCBpcyBzYW1lIGFzIHBjaSAqLworCXN0cnVjdCB7CisJICAgIHVpbnQ2NF90IHJlc2VydmVkOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGlibmQ7CisJc3RydWN0IHsKKwkgICAgdWludDY0X3QgcmVzZXJ2ZWQ7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgeHByczsKKwlzdHJ1Y3QgeworCSAgICB1aW50NjRfdCByZXNlcnZlZDsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBodHB0OworCXN0cnVjdCB7CisJICAgIHVpbnQ2NF90IHJlc2VydmVkOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVua25vd247CisgICAgfSBpbnRlcmZhY2VfcGF0aDsKKwkvKioKKwkgKiBGb3JtYXQgb2YgRUREIHYzLjAgRGV2aWNlIFBhdGg6CisJICogT2Zmc2V0ICAgIFNpemUgICAgRGVzY3JpcHRpb24gICAgKFRhYmxlIDAwMjc2KQorCSAqIC0tLUFUQS0tLQorCSAqIDAwaCAgICBCWVRFICAgIGZsYWc6IDAwaCA9IG1hc3RlciwgMDFoID0gc2xhdmUKKwkgKiAwMWggNyBCWVRFcyAgICByZXNlcnZlZCAoMCkKKwkgKiAtLS1BVEFQSS0tLQorCSAqIDAwaCAgICBCWVRFICAgIGZsYWc6IDAwaCA9IG1hc3RlciwgMDFoID0gc2xhdmUKKwkgKiAwMWggICAgQllURSAgICBsb2dpY2FsIHVuaXQgbnVtYmVyCisJICogMDJoIDYgQllURXMgICAgcmVzZXJ2ZWQgKDApCisJICogLS0tU0NTSS0tLQorCSAqIDAwaCAgICBCWVRFICAgIGxvZ2ljYWwgdW5pdCBudW1iZXIKKwkgKiAwMWggNyBCWVRFcyAgICByZXNlcnZlZCAoMCkKKwkgKiAtLS1VU0ItLS0KKwkgKiAwMGggICAgQllURSAgICB0byBiZSBkZXRlcm1pbmVkCisJICogMDFoIDcgQllURXMgICAgcmVzZXJ2ZWQgKDApCisJICogLS0tSUVFRTEzOTQtLS0KKwkgKiAwMGggICAgUVdPUkQgICAgNjQtYml0IEZpcmVXaXJlIEdlbmVyYWwgVW5pcXVlIElkZW50aWZpZXIgKEdVSUQpCisJICogLS0tRmlicmVDaGFubmVsLS0tCisJICogMDBoICAgIFFXT1JEICAgIFdvcmQgV2lkZSBOdW1iZXIgKFdXTikKKwkgKiovCisgICAgdW5pb24geworCXN0cnVjdCB7CisJICAgIHVpbnQ4X3QgZGV2aWNlOworCSAgICB1aW50OF90IHJlc2VydmVkMTsKKwkgICAgdWludDE2X3QgcmVzZXJ2ZWQyOworCSAgICB1aW50MzJfdCByZXNlcnZlZDM7CisJICAgIHVpbnQ2NF90IHJlc2VydmVkNDsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhdGE7CisJc3RydWN0IHsKKwkgICAgdWludDhfdCBkZXZpY2U7CisJICAgIHVpbnQ4X3QgbHVuOworCSAgICB1aW50OF90IHJlc2VydmVkMTsKKwkgICAgdWludDhfdCByZXNlcnZlZDI7CisJICAgIHVpbnQzMl90IHJlc2VydmVkMzsKKwkgICAgdWludDY0X3QgcmVzZXJ2ZWQ0OworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF0YXBpOworCXN0cnVjdCB7CisJICAgIHVpbnQxNl90IGlkOworCSAgICB1aW50NjRfdCBsdW47CisJICAgIHVpbnQxNl90IHJlc2VydmVkMTsKKwkgICAgdWludDMyX3QgcmVzZXJ2ZWQyOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHNjc2k7CisJc3RydWN0IHsKKwkgICAgdWludDY0X3Qgc2VyaWFsX251bWJlcjsKKwkgICAgdWludDY0X3QgcmVzZXJ2ZWQ7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdXNiOworCXN0cnVjdCB7CisJICAgIHVpbnQ2NF90IGV1aTsKKwkgICAgdWludDY0X3QgcmVzZXJ2ZWQ7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaTEzOTQ7CisJc3RydWN0IHsKKwkgICAgdWludDY0X3Qgd3dpZDsKKwkgICAgdWludDY0X3QgbHVuOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGZpYnJlOworCXN0cnVjdCB7CisJICAgIHVpbnQ2NF90IGlkZW50aXR5X3RhZzsKKwkgICAgdWludDY0X3QgcmVzZXJ2ZWQ7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaTJvOworCXN0cnVjdCB7CisJICAgIHVpbnQzMl90IGFycmF5X251bWJlcjsKKwkgICAgdWludDMyX3QgcmVzZXJ2ZWQxOworCSAgICB1aW50NjRfdCByZXNlcnZlZDI7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcmFpZDsKKwlzdHJ1Y3QgeworCSAgICB1aW50OF90IGRldmljZTsKKwkgICAgdWludDhfdCByZXNlcnZlZDE7CisJICAgIHVpbnQxNl90IHJlc2VydmVkMjsKKwkgICAgdWludDMyX3QgcmVzZXJ2ZWQzOworCSAgICB1aW50NjRfdCByZXNlcnZlZDQ7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc2F0YTsKKwlzdHJ1Y3QgeworCSAgICB1aW50NjRfdCByZXNlcnZlZDE7CisJICAgIHVpbnQ2NF90IHJlc2VydmVkMjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1bmtub3duOworICAgIH0gZGV2aWNlX3BhdGg7CisgICAgdWludDhfdCByZXNlcnZlZDsJCS8qIHJlc2VydmVkICgwKSAqLworICAgIHVpbnQ4X3QgY2hlY2tzdW07CQkvKiBjaGVja3N1bSBvZiBieXRlcyAxRWgtNDBoICh0d28ncyBjb21wbGVtZW50IG9mIHN1bSwgd2hpY2ggbWFrZXMKKwkJCQkgKiB0aGUgOC1iaXQgc3VtIG9mIGJ5dGVzIDFFaC00MWggZXF1YWwgMDBoKSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBEaXNrIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IGRyaXZlaW5mbyB7CisgICAgaW50IGRpc2s7CQkJLyogRGlzayBwb3J0ICgweDgwIC0gMHhmZikgKi8KKyAgICAvKiBMZWdhY3kgQy9IL1MgKi8KKyAgICBpbnQgY2Jpb3M7CQkJLyogQ0hTIGdlb21ldHJ5IGlzIHZhbGlkICovCisgICAgaW50IGxlZ2FjeV9tYXhfaGVhZDsKKyAgICBpbnQgbGVnYWN5X21heF9jeWxpbmRlcjsKKyAgICBpbnQgbGVnYWN5X3NlY3RvcnNfcGVyX3RyYWNrOworICAgIGludCBsZWdhY3lfbWF4X2RyaXZlOworICAgIGludCBsZWdhY3lfdHlwZTsJCS8qIERyaXZlIHR5cGUgKEFUL1BTMiBmbG9wcGllcyBvbmx5KSAqLworICAgIC8qIEVERCBzdXBwb3J0ICovCisgICAgaW50IGViaW9zOwkJCS8qIEVCSU9TIHN1cHBvcnRlZCBvbiB0aGlzIGRpc2sgKi8KKyAgICBpbnQgZWRkX3ZlcnNpb247CQkvKiBFQklPUyBtYWpvciB2ZXJzaW9uICovCisgICAgaW50IGVkZF9mdW5jdGlvbmFsaXR5X3N1YnNldDsKKyAgICBzdHJ1Y3QgZWRkX2RldmljZV9wYXJhbWV0ZXJzIGVkZF9wYXJhbXM7CS8qIEVERCBwYXJhbWV0ZXJzICovCit9OworCisvKioKKyAqIEZvcm1hdCBvZiBQaG9lbml4IEVuaGFuY2VkIERpc2sgRHJpdmUgU3BlYyB0cmFuc2xhdGVkIGRyaXZlIHBhcmFtZXRlciB0YWJsZToKKyAqIE9mZnNldCAgICBTaXplICAgIERlc2NyaXB0aW9uICAgIChUYWJsZSAwMDI3NykKKyAqIDAwaCAgICBXT1JEICAgIG51bWJlciBvZiBjeWxpbmRlcnMKKyAqIDAyaCAgICBCWVRFICAgIG51bWJlciBvZiBoZWFkcworICogMDNoICAgIEJZVEUgICAgQTBoIChzaWduYXR1cmUgaW5kaWNhdGluZyB0cmFuc2xhdGVkIHRhYmxlKQorICogMDRoICAgIEJZVEUgICAgbnVtYmVyIG9mIHBoeXNpY2FsIHNlY3RvcnMgcGVyIHRyYWNrCisgKiAwNWggICAgV09SRCAgICBzdGFydGluZyB3cml0ZSBwcmVjb21wZW5zYXRpb24gY3lsaW5kZXIgbnVtYmVyCisgKiAwN2ggICAgQllURSAgICByZXNlcnZlZAorICogMDhoICAgIEJZVEUgICAgY29udHJvbCBieXRlIChzZWUgIzAzMTk4IGF0IElOVCA0MSJESVNLIDAiKQorICogMDloICAgIFdPUkQgICAgbnVtYmVyIG9mIHBoeXNpY2FsIGN5bGluZGVycworICogMEJoICAgIEJZVEUgICAgbnVtYmVyIG9mIHBoeXNpY2FsIGhlYWRzCisgKiAwQ2ggICAgV09SRCAgICBjeWxpbmRlciBudW1iZXIgb2YgbGFuZGluZyB6b25lCisgKiAwRWggICAgQllURSAgICBudW1iZXIgb2YgbG9naWNhbCBzZWN0b3JzIHBlciB0cmFjaworICogMEZoICAgIEJZVEUgICAgY2hlY2tzdW0KKyAqIFByb2dyYW06IHRoZSBQaG9lbml4IEVuaGFuY2VkIERpc2sgRHJpdmUgU3BlY2lmaWNhdGlvbiBpcyBhbiBhZGRpdGlvbiB0byB0aGUKKyAqICAgICBJQk0vTVMgSU5UIDEzIGV4dGVuc2lvbnMKKyAqCisgKiBGb3JtYXQgb2YgUGhvZW5peCBFbmhhbmNlZCBEaXNrIERyaXZlIFNwZWMgRml4ZWQgRGlzayBQYXJhbWV0ZXIgVGFibGU6CisgKiBPZmZzZXQgICAgU2l6ZSAgICBEZXNjcmlwdGlvbiAgICAoVGFibGUgMDAyNzgpCisgKiAwMGggICAgV09SRCAgICBwaHlzaWNhbCBJL08gcG9ydCBiYXNlIGFkZHJlc3MKKyAqIDAyaCAgICBXT1JEICAgIGRpc2stZHJpdmUgY29udHJvbCBwb3J0IGFkZHJlc3MKKyAqIDA0aCAgICBCWVRFICAgIGRyaXZlIGZsYWdzIChzZWUgIzAwMjc5KQorICogMDVoICAgIEJZVEUgICAgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24KKyAqICAgICAgICAgYml0cyA3LTQgcmVzZXJ2ZWQgKDApCisgKiAgICAgICAgIGJpdHMgMy0wOiBQaG9lbml4IHByb3ByaWV0YXJ5ICh1c2VkIGJ5IEJJT1MpCisgKiAwNmggICAgQllURSAgICBJUlEgZm9yIGRyaXZlIChiaXRzIDMtMDsgYml0cyA3LTQgcmVzZXJ2ZWQgYW5kIG11c3QgYmUgMCkKKyAqIDA3aCAgICBCWVRFICAgIHNlY3RvciBjb3VudCBmb3IgbXVsdGktc2VjdG9yIHRyYW5zZmVycworICogMDhoICAgIEJZVEUgICAgRE1BIGNvbnRyb2wKKyAqICAgICAgICAgYml0cyA3LTQ6IERNQSB0eXBlICgwLTIpIGFzIHBlciBBVEEtMiBzcGVjaWZpY2F0aW9uCisgKiAgICAgICAgIGJpdHMgMy0wOiBETUEgY2hhbm5lbAorICogMDloICAgIEJZVEUgICAgcHJvZ3JhbW1lZCBJL08gY29udHJvbAorICogICAgICAgICBiaXRzIDctNDogcmVzZXJ2ZWQgKDApCisgKiAgICAgICAgIGJpdHMgMy0wOiBQSU8gdHlwZSAoMS00KSBhcyBwZXIgQVRBLTIgc3BlY2lmaWNhdGlvbgorICogMEFoICAgIFdPUkQgICAgZHJpdmUgb3B0aW9ucyAoc2VlICMwMDI4MCkKKyAqIDBDaCAyIEJZVEVzICAgIHJlc2VydmVkICgwKQorICogMEVoICAgIEJZVEUgICAgZXh0ZW5zaW9uIHJldmlzaW9uIGxldmVsIChoaWdoIG55YmJsZT1tYWpvciwgbG93IG55YmJsZT1taW5vcikKKyAqICAgICAgICAgKGN1cnJlbnRseSAxMGggZm9yIHYxLjAgYW5kIDExaCBmb3IgdjEuMS0zLjApCisgKiAwRmggICAgQllURSAgICAyJ3MgY29tcGxlbWVudCBjaGVja3N1bSBvZiBieXRlcyAwMGgtMEVoCisgKiAgICAgICAgIDgtYml0IHN1bSBvZiBhbGwgYnl0ZXMgMDBoLTBGaCBzaG91bGQgZXF1YWwgMDBoCisgKiBTZWVBbHNvOiAjMDAyNzcKKyAqCisgKiBCaXRmaWVsZHMgZm9yIFBob2VuaXggRW5oYW5jZWQgRGlzayBEcml2ZSBTcGVjIGRyaXZlIGZsYWdzOgorICogQml0KHMpICAgIERlc2NyaXB0aW9uICAgIChUYWJsZSAwMDI3OSkKKyAqIDcgICAgcmVzZXJ2ZWQgKDEpCisgKiA2ICAgIExCQSBlbmFibGVkCisgKiA1ICAgIHJlc2VydmVkICgxKQorICogNCAgICBkcml2ZSBpcyBzbGF2ZQorICogMy0wICAgIHJlc2VydmVkICgwKQorICogU2VlQWxzbzogIzAwMjc4LCMwMDI4MAorICoKKyAqIEJpdGZpZWxkcyBmb3IgUGhvZW5peCBFbmhhbmNlZCBEaXNrIERyaXZlIFNwZWMgZHJpdmUgb3B0aW9uczoKKyAqIEJpdChzKSAgICBEZXNjcmlwdGlvbiAgICAoVGFibGUgMDAyODApCisgKiAwICAgIGZhc3QgUElPIGVuYWJsZWQKKyAqIDEgICAgZmFzdCBETUEgYWNjZXNzIGVuYWJsZWQKKyAqIDIgICAgYmxvY2sgUElPIChtdWx0aS1zZWN0b3IgdHJhbnNmZXJzKSBlbmFibGVkCisgKiAzICAgIENIUyB0cmFuc2xhdGlvbiBlbmFibGVkCisgKiA0ICAgIExCQSB0cmFuc2xhdGlvbiBlbmFibGVkCisgKiA1ICAgIHJlbW92YWJsZSBtZWRpYQorICogNiAgICBBVEFQSSBkZXZpY2UgKENELVJPTSkKKyAqIDcgICAgMzItYml0IHRyYW5zZmVyIG1vZGUKKyAqIC0tLXYxLjErIC0tLQorICogOCAgICBBVEFQSSBkZXZpY2UgdXNlcyBEUlEgdG8gc2lnbmFsIHJlYWRpbmVzcyBmb3IgcGFja2V0IGNvbW1hbmQKKyAqICAgICAobXVzdCBiZSAwIGlmIGJpdCA2IGlzIDApCisgKiAxMC05ICAgIHRyYW5zbGF0aW9uIHR5cGUgKG11c3QgYmUgMDAgaWYgYml0IDMgaXMgMCkKKyAqICAgICAwMCBQaG9lbml4IGJpdC1zaGlmdGluZyB0cmFuc2xhdGlvbgorICogICAgIDAxIExCQS1hc3Npc3RlZCB0cmFuc2xhdGlvbgorICogICAgIDEwIHJlc2VydmVkCisgKiAgICAgMTEgcHJvcHJpZXRhcnkgdHJhbnNsYXRpb24KKyAqIC0tLXYzLjAtLS0KKyAqIDExICAgIFVsdHJhIERNQSBhY2Nlc3MgZW5hYmxlZAorICogMTUtMTIgICAgcmVzZXJ2ZWQKKyAqKi8KKworLyoKKyAqIFZhbHVlcyBmb3IgZGlza2V0dGUgZHJpdmUgdHlwZToKKyAqICAgICAwMWggICAgMzYwSworICogICAgIDAyaCAgICAxLjJNCisgKiAgICAgMDNoICAgIDcyMEsKKyAqICAgICAwNGggICAgMS40NE0KKyAqICAgICAwNWggICAgPz8/CisgKiAgICAgICAgICAgIHJlcG9ydGVkbHkgYW4gb2JzY3VyZSBkcml2ZSB0eXBlIHNoaXBwZWQgb24gc29tZSBJQk0gbWFjaGluZXMsCisgKiAgICAgICAgICAgIDIuODhNIG9uIHNvbWUgbWFjaGluZXMgKGF0IGxlYXN0IEFNSSA0ODYgQklPUykKKyAqICAgICAwNmggICAgMi44OE0KKyAqICAgICAxMGggICAgQVRBUEkgUmVtb3ZhYmxlIE1lZGlhIERldmljZQorICovCitlbnVtIGRpc2tldHRlX2RyaXZlX3R5cGVzIHsKKyAgICBESVNLRVRURV8zNjBLID0gMSwKKyAgICBESVNLRVRURV8xXzJNID0gMiwKKyAgICBESVNLRVRURV83MjBLID0gMywKKyAgICBESVNLRVRURV8xXzQ0TSA9IDQsCisgICAgRElTS0VUVEVfMl84OE0gPSA2LAorICAgIERJU0tFVFRFX0FUQVBJID0gMTAsCit9OworCisvKioKKyAqIGNoc190b19sYmEgLSBjb21wdXRlIGxiYSB2YWx1ZSBmcm9tIGN5bGluZGVyLCBoZWFkIGFuZCBzZWN0b3IgbnVtYmVyCisgKiovCitzdGF0aWMgaW5saW5lIGludCBjaHNfdG9fbGJhKGNvbnN0IHN0cnVjdCBkcml2ZWluZm8gKmRyaXZlX2luZm8sCisJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCBjeWxpbmRlciwKKwkJCSAgICAgY29uc3QgdW5zaWduZWQgaW50IGhlYWQsIGNvbnN0IHVuc2lnbmVkIGludCBzZWN0b3IpCit7CisgICAgLyogVXNlIEVERCwgaWYgdmFsaWQgKi8KKyAgICBpZiAoZHJpdmVfaW5mby0+ZWRkX3BhcmFtcy5zZWN0b3JzX3Blcl90cmFjayA+IDAgJiYKKwlkcml2ZV9pbmZvLT5lZGRfcGFyYW1zLmhlYWRzID4gMCkKKwlyZXR1cm4gKHNlY3RvciAtIDEpICsKKwkgICAgKGhlYWQgKiBkcml2ZV9pbmZvLT5lZGRfcGFyYW1zLnNlY3RvcnNfcGVyX3RyYWNrKSArCisJICAgIChjeWxpbmRlciAqIChkcml2ZV9pbmZvLT5lZGRfcGFyYW1zLmhlYWRzKSAqCisJICAgICBkcml2ZV9pbmZvLT5lZGRfcGFyYW1zLnNlY3RvcnNfcGVyX3RyYWNrKTsKKyAgICBlbHNlIGlmIChkcml2ZV9pbmZvLT5jYmlvcykKKwlyZXR1cm4gKHNlY3RvciAtIDEpICsgKGhlYWQgKiBkcml2ZV9pbmZvLT5sZWdhY3lfc2VjdG9yc19wZXJfdHJhY2spICsKKwkgICAgKGN5bGluZGVyICogKGRyaXZlX2luZm8tPmxlZ2FjeV9tYXhfaGVhZCArIDEpICoKKwkgICAgIGRyaXZlX2luZm8tPmxlZ2FjeV9zZWN0b3JzX3Blcl90cmFjayk7Cit9CisKK3ZvaWQgbGJhX3RvX2Nocyhjb25zdCBzdHJ1Y3QgZHJpdmVpbmZvICpkcml2ZV9pbmZvLCBjb25zdCBpbnQgbGJhLAorCQl1bnNpZ25lZCBpbnQgKmN5bGluZGVyLCB1bnNpZ25lZCBpbnQgKmhlYWQsCisJCXVuc2lnbmVkIGludCAqc2VjdG9yKTsKK2ludCBnZXRfZHJpdmVfcGFyYW1ldGVycyhzdHJ1Y3QgZHJpdmVpbmZvICpkcml2ZV9pbmZvKTsKKworI2VuZGlmIC8qIF9HRU9NX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGluY2x1ZGUvZGlzay9tYnJzLmggYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svbWJycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTA0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svbWJycy5oCkBAIC0wLDAgKzEsMTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFN5c2xpbnV4LCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfX01CUlNfSF8KKyNkZWZpbmUgX19NQlJTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxkaXNrL2dlb20uaD4KKwordm9pZCBnZXRfbWJyX3N0cmluZyhjb25zdCB1aW50MzJfdCwgdm9pZCAqLCBjb25zdCBpbnQpOwordWludDMyX3QgZ2V0X21icl9pZChjb25zdCBzdHJ1Y3QgZHJpdmVpbmZvICopOworI2VuZGlmIC8qIF9fTUJSU19IXyAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL21zZG9zLmggYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svbXNkb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM5ZGFkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL21zZG9zLmgKQEAgLTAsMCArMSwxOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllcgorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgU3lzbGludXgsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9NU0RPU19IXworI2RlZmluZSBfTVNET1NfSF8KKworI2luY2x1ZGUgPGRpc2svZ2VvbS5oPgorI2luY2x1ZGUgPGRpc2svcGFydGl0aW9uLmg+CisKK3R5cGVkZWYgdm9pZCAoKnBfY2FsbGJhY2spIChzdHJ1Y3QgZHJpdmVpbmZvICosIHN0cnVjdCBwYXJ0X2VudHJ5ICosIGludCwgaW50KTsKK2ludCBwYXJzZV9wYXJ0aXRpb25fdGFibGUoc3RydWN0IGRyaXZlaW5mbyAqLCBwX2NhbGxiYWNrKTsKKworI2VuZGlmIC8qIF9NU0RPU19IXyAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL3BhcnRpdGlvbi5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL3BhcnRpdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZGY4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svcGFydGl0aW9uLmgKQEAgLTAsMCArMSwzNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllcgorICoKKyAqICAgU29tZSBwYXJ0cyBib3Jyb3dlZCBmcm9tIGNoYWluLmMzMjoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTeXNsaW51eCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX1BBUlRJVElPTl9IXworI2RlZmluZSBfUEFSVElUSU9OX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBQQVJUSVRJT05fVEFCTEVTX09GRlNFVAkweDFiZQorCisvKiBBIERPUyBwYXJ0aXRpb24gdGFibGUgZW50cnkgKi8KK3N0cnVjdCBwYXJ0X2VudHJ5IHsKKyAgICB1aW50OF90IGFjdGl2ZV9mbGFnOwkvKiAweDgwIGlmICJhY3RpdmUiICovCisgICAgdWludDhfdCBzdGFydF9oZWFkOworICAgIHVpbnQ4X3Qgc3RhcnRfc2VjdDsKKyAgICB1aW50OF90IHN0YXJ0X2N5bDsKKyAgICB1aW50OF90IG9zdHlwZTsKKyAgICB1aW50OF90IGVuZF9oZWFkOworICAgIHVpbnQ4X3QgZW5kX3NlY3Q7CisgICAgdWludDhfdCBlbmRfY3lsOworICAgIHVpbnQzMl90IHN0YXJ0X2xiYTsKKyAgICB1aW50MzJfdCBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwordm9pZCBnZXRfbGFiZWwoaW50IGxhYmVsLCBjaGFyICoqYnVmZmVyX2xhYmVsKTsKKyNlbmRpZiAvKiBfUEFSVElUSU9OX0hfICovCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2Rpc2svcmVhZC5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL3JlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGE5ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL3JlYWQuaApAQCAtMCwwICsxLDE4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBQaWVycmUtQWxleGFuZHJlIE1leWVyCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTeXNsaW51eCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX1JFQURfSF8KKyNkZWZpbmUgX1JFQURfSF8KKworI2luY2x1ZGUgPGRpc2svZ2VvbS5oPgorCitpbnQgcmVhZF9tYnIoaW50LCB2b2lkICopOworaW50IGRldl9yZWFkKGludCwgdm9pZCAqLCB1bnNpZ25lZCBpbnQsIGludCk7CitpbnQgcmVhZF9zZWN0b3JzKHN0cnVjdCBkcml2ZWluZm8gKiwgdm9pZCAqLCBjb25zdCB1bnNpZ25lZCBpbnQsIGNvbnN0IGludCk7CisjZW5kaWYgLyogX1JFQURfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL3N3c3VzcC5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL3N3c3VzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOWFjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxpbmNsdWRlL2Rpc2svc3dzdXNwLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfU1dTVVNQX0hfCisjZGVmaW5lIF9TV1NVU1BfSF8KKworI2luY2x1ZGUgPGRpc2svZ2VvbS5oPgorI2luY2x1ZGUgPGRpc2svY29tbW9uLmg+CisjaW5jbHVkZSA8ZGlzay9wYXJ0aXRpb24uaD4KKworI2RlZmluZSBTV1NVU1BfU0lHCSJTMVNVU1BFTkQiCisKK3N0cnVjdCBzd3N1c3BfaGVhZGVyIHsKKyAgICBjaGFyIHJlc2VydmVkW1BBR0VfU0laRSAtIDIwIC0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIC0gc2l6ZW9mKGludCldOworICAgIHVuc2lnbmVkIGxvbmcgaW1hZ2U7CisgICAgdW5zaWduZWQgaW50IGZsYWdzOwkJLyogRmxhZ3MgdG8gcGFzcyB0byB0aGUgImJvb3QiIGtlcm5lbCAqLworICAgIGNoYXIgb3JpZ19zaWdbMTBdOworICAgIGNoYXIgc2lnWzEwXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitpbnQgc3dzdXNwX2NoZWNrKHN0cnVjdCBkcml2ZWluZm8gKiwgc3RydWN0IHBhcnRfZW50cnkgKik7CisjZW5kaWYgLyogX1NXU1VTUF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2Rpc2svdXRpbC5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmYwODVhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL3V0aWwuaApAQCAtMCwwICsxLDIxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBQaWVycmUtQWxleGFuZHJlIE1leWVyCisgKgorICogICBTb21lIHBhcnRzIGJvcnJvd2VkIGZyb20gY2hhaW4uYzMyOgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFN5c2xpbnV4LCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfVVRJTF9IXworI2RlZmluZSBfVVRJTF9IXworCisjaW5jbHVkZSA8Y29tMzIuaD4KKworaW50IGludDEzX3JldHJ5KGNvbnN0IGNvbTMyc3lzX3QgKiBpbnJlZywgY29tMzJzeXNfdCAqIG91dHJlZyk7CisjZW5kaWYgLyogX1VUSUxfSF8gKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGluY2x1ZGUvZGlzay93cml0ZS5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kaXNrL3dyaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkMjZmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvZGlzay93cml0ZS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIKKyAqCisgKiAgIFNvbWUgcGFydHMgYm9ycm93ZWQgZnJvbSBjaGFpbi5jMzI6CisgKgorICogICBDb3B5cmlnaHQgMjAwMy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgU3lzbGludXgsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9XUklURV9IXworI2RlZmluZSBfV1JJVEVfSF8KKworI2luY2x1ZGUgPGRpc2svZ2VvbS5oPgorCitpbnQgd3JpdGVfc2VjdG9ycyhjb25zdCBzdHJ1Y3QgZHJpdmVpbmZvICosIGNvbnN0IHVuc2lnbmVkIGludCwKKwkJICBjb25zdCB2b2lkICosIGNvbnN0IGludCk7CitpbnQgd3JpdGVfdmVyaWZ5X3NlY3RvcihzdHJ1Y3QgZHJpdmVpbmZvICpkcml2ZV9pbmZvLAorCQkJY29uc3QgdW5zaWduZWQgaW50LCBjb25zdCB2b2lkICopOworaW50IHdyaXRlX3ZlcmlmeV9zZWN0b3JzKHN0cnVjdCBkcml2ZWluZm8gKiwKKwkJCSBjb25zdCB1bnNpZ25lZCBpbnQsIGNvbnN0IHZvaWQgKiwgY29uc3QgaW50KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pLmggYi9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmNkNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pLmgKQEAgLTAsMCArMSw5OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIERNSV9ICisjZGVmaW5lIERNSV9ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNkZWZpbmUgTUFYX0RNSV9NRU1PUllfSVRFTVMgMzIKKyNkZWZpbmUgTUFYX0RNSV9DQUNIRV9JVEVNUyAzMgorI2RlZmluZSBPRU1fU1RSSU5HU19TSVpFIDUxMgorI2RlZmluZSBIQVJEV0FSRV9TRUNVUklUWV9TSVpFIDE2CisKKyNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKKworZXh0ZXJuIGNvbnN0IGNoYXIgKm91dF9vZl9zcGVjOworZXh0ZXJuIGNvbnN0IGNoYXIgKmJhZF9pbmRleDsKKworI2RlZmluZSBXT1JEKHgpICh1aW50MTZfdCkoKihjb25zdCB1aW50MTZfdCAqKSh4KSkKKyNkZWZpbmUgRFdPUkQoeCkgKHVpbnQzMl90KSgqKGNvbnN0IHVpbnQzMl90ICopKHgpKQorI2RlZmluZSBRV09SRCh4KSAoKihjb25zdCB1aW50NjRfdCAqKSh4KSkKKworZW51bSB7IERNSV9UQUJMRV9QUkVTRU5UID0gMTAwLCBFTk9ETUlUQUJMRSB9OworCisjaW5jbHVkZSAiZG1pX2Jpb3MuaCIKKyNpbmNsdWRlICJkbWlfc3lzdGVtLmgiCisjaW5jbHVkZSAiZG1pX2Jhc2VfYm9hcmQuaCIKKyNpbmNsdWRlICJkbWlfY2hhc3Npcy5oIgorI2luY2x1ZGUgImRtaV9wcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJkbWlfbWVtb3J5LmgiCisjaW5jbHVkZSAiZG1pX2JhdHRlcnkuaCIKKyNpbmNsdWRlICJkbWlfaXBtaS5oIgorI2luY2x1ZGUgImRtaV9jYWNoZS5oIgorCitleHRlcm4gY2hhciBkaXNwbGF5X2xpbmU7CisjZGVmaW5lIG1vcmVwcmludGYoLi4uKSBkbyB7IGRpc3BsYXlfbGluZSsrOyBpZiAoZGlzcGxheV9saW5lID09IDI0KSB7IGNoYXIgdGVtcGJ1ZlsxMF07IGRpc3BsYXlfbGluZT0wOyBwcmludGYoIlByZXNzIGVudGVyIHRvIGNvbnRpbnVlIik7IGZnZXRzKHRlbXBidWYsIHNpemVvZiB0ZW1wYnVmLCBzdGRpbik7fSAgcHJpbnRmICggX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IG51bTsKKyAgICB1aW50MTZfdCBsZW47CisgICAgdWludDE2X3QgdmVyOworICAgIHVpbnQzMl90IGJhc2U7CisgICAgdWludDE2X3QgbWFqb3JfdmVyc2lvbjsKKyAgICB1aW50MTZfdCBtaW5vcl92ZXJzaW9uOworfSBkbWlfdGFibGU7CisKK3N0cnVjdCBkbWlfaGVhZGVyIHsKKyAgICB1aW50OF90IHR5cGU7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgdWludDE2X3QgaGFuZGxlOworICAgIHVpbnQ4X3QgKmRhdGE7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc19iaW9zIGJpb3M7CisgICAgc19zeXN0ZW0gc3lzdGVtOworICAgIHNfYmFzZV9ib2FyZCBiYXNlX2JvYXJkOworICAgIHNfY2hhc3NpcyBjaGFzc2lzOworICAgIHNfcHJvY2Vzc29yIHByb2Nlc3NvcjsKKyAgICBzX2JhdHRlcnkgYmF0dGVyeTsKKyAgICBzX21lbW9yeV9tb2R1bGUgbWVtb3J5X21vZHVsZVtNQVhfRE1JX01FTU9SWV9JVEVNU107CisgICAgc19tZW1vcnkgbWVtb3J5W01BWF9ETUlfTUVNT1JZX0lURU1TXTsKKyAgICBzX2lwbWkgaXBtaTsKKyAgICBzX2NhY2hlIGNhY2hlW01BWF9ETUlfQ0FDSEVfSVRFTVNdOworICAgIGludCBtZW1vcnlfbW9kdWxlX2NvdW50OworICAgIGludCBtZW1vcnlfY291bnQ7CisgICAgaW50IGNhY2hlX2NvdW50OworICAgIGRtaV90YWJsZSBkbWl0YWJsZTsKKyAgICBjaGFyIG9lbV9zdHJpbmdzW09FTV9TVFJJTkdTX1NJWkVdOworICAgIHN0cnVjdCB7CisJY2hhciBwb3dlcl9vbl9wYXNzd2Rfc3RhdHVzW0hBUkRXQVJFX1NFQ1VSSVRZX1NJWkVdOworCWNoYXIga2V5Ym9hcmRfcGFzc3dkX3N0YXR1c1tIQVJEV0FSRV9TRUNVUklUWV9TSVpFXTsKKwljaGFyIGFkbWluaXN0cmF0b3JfcGFzc3dkX3N0YXR1c1tIQVJEV0FSRV9TRUNVUklUWV9TSVpFXTsKKwljaGFyIGZyb250X3BhbmVsX3Jlc2V0X3N0YXR1c1tIQVJEV0FSRV9TRUNVUklUWV9TSVpFXTsKKwlib29sIGZpbGxlZDsKKyAgICB9IGhhcmR3YXJlX3NlY3VyaXR5OworfSBzX2RtaTsKKwordm9pZCB0b19kbWlfaGVhZGVyKHN0cnVjdCBkbWlfaGVhZGVyICpoLCB1aW50OF90ICogZGF0YSk7Cit2b2lkIGRtaV9iaW9zX3J1bnRpbWVfc2l6ZSh1aW50MzJfdCBjb2RlLCBzX2RtaSAqIGRtaSk7Citjb25zdCBjaGFyICpkbWlfc3RyaW5nKHN0cnVjdCBkbWlfaGVhZGVyICpkbSwgdWludDhfdCBzKTsKK2ludCBkbWlfY2hlY2tzdW0odWludDhfdCAqIGJ1ZiwgaW50IGxlbik7Cit2b2lkIHBhcnNlX2RtaXRhYmxlKHNfZG1pICogZG1pKTsKK3ZvaWQgZG1pX2RlY29kZShzdHJ1Y3QgZG1pX2hlYWRlciAqaCwgdWludDE2X3QgdmVyLCBzX2RtaSAqIGRtaSk7CitpbnQgZG1pX2l0ZXJhdGUoc19kbWkgKiBkbWkpOworCisvKiBkbWlfdXRpbHMuYyAqLwordm9pZCBkaXNwbGF5X2Jpb3NfY2hhcmFjdGVyaXN0aWNzKHNfZG1pICogZG1pKTsKK3ZvaWQgZGlzcGxheV9iYXNlX2JvYXJkX2ZlYXR1cmVzKHNfZG1pICogZG1pKTsKK3ZvaWQgZGlzcGxheV9wcm9jZXNzb3JfZmxhZ3Moc19kbWkgKiBkbWkpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfYmFzZV9ib2FyZC5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pX2Jhc2VfYm9hcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQ1Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pX2Jhc2VfYm9hcmQuaApAQCAtMCwwICsxLDYwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNiBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgRE1JX0JBU0VfQk9BUkRfSAorI2RlZmluZSBETUlfQkFTRV9CT0FSRF9ICisKKyNpbmNsdWRlICJzdGRib29sLmgiCisjZGVmaW5lIEJBU0VfQk9BUkRfTUFOVUZBQ1RVUkVSX1NJWkUJCTY1CisjZGVmaW5lIEJBU0VfQk9BUkRfUFJPRFVDVF9OQU1FX1NJWkUJCTY1CisjZGVmaW5lIEJBU0VfQk9BUkRfVkVSU0lPTl9TSVpFCQkJNjUKKyNkZWZpbmUgQkFTRV9CT0FSRF9TRVJJQUxfU0laRQkJCTY1CisjZGVmaW5lIEJBU0VfQk9BUkRfQVNTRVRfVEFHX1NJWkUJCTY1CisjZGVmaW5lIEJBU0VfQk9BUkRfTE9DQVRJT05fU0laRQkJNjUKKyNkZWZpbmUgQkFTRV9CT0FSRF9GRUFUVVJFU19TSVpFCQkzMgorI2RlZmluZSBCQVNFX0JPQVJEX1RZUEVfU0laRQkJCTMyCisKKyNkZWZpbmUgQkFTRV9CT0FSRF9OQl9FTEVNRU5UUwkJCTUKKworI2RlZmluZSBCQVNFX0JPQVJEX0RFVklDRV9ERVNDUklQVElPTgkJNjUKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmJhc2VfYm9hcmRfZmVhdHVyZXNfc3RyaW5nc1tdOworCisvKiB0aGlzIHN0cnVjdCBoYXZlIEJBU0VfQk9BUkRfTkJfRUxFTUVOVFMgKi8KKy8qIGVhY2ggYm9vbCBpcyBhc3NvY2lhdGVkIHRvIHRoZSByZWxldmFudCBtZXNzYWdlIGFib3ZlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYm9vbCBob3N0aW5nOworICAgIGJvb2wgYm9hcmRfbmVlZHNfZGF1Z2h0ZXI7CisgICAgYm9vbCByZW1vdmFibGU7CisgICAgYm9vbCByZXBsYWNlYWJsZTsKKyAgICBib29sIGhvdF9zd2FwcGFibGU7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgc19iYXNlX2JvYXJkX2ZlYXR1cmVzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciBtYW51ZmFjdHVyZXJbQkFTRV9CT0FSRF9NQU5VRkFDVFVSRVJfU0laRV07CisgICAgY2hhciBwcm9kdWN0X25hbWVbQkFTRV9CT0FSRF9QUk9EVUNUX05BTUVfU0laRV07CisgICAgY2hhciB2ZXJzaW9uW0JBU0VfQk9BUkRfVkVSU0lPTl9TSVpFXTsKKyAgICBjaGFyIHNlcmlhbFtCQVNFX0JPQVJEX1NFUklBTF9TSVpFXTsKKyAgICBjaGFyIGFzc2V0X3RhZ1tCQVNFX0JPQVJEX0FTU0VUX1RBR19TSVpFXTsKKyAgICBjaGFyIGxvY2F0aW9uW0JBU0VfQk9BUkRfTE9DQVRJT05fU0laRV07CisgICAgY2hhciB0eXBlW0JBU0VfQk9BUkRfVFlQRV9TSVpFXTsKKyAgICBzX2Jhc2VfYm9hcmRfZmVhdHVyZXMgZmVhdHVyZXM7CisvKiBUaGUgZmlsbGVkIGZpZWxkIGhhdmUgdG8gYmUgc2V0IHRvIHRydWUgd2hlbiB0aGUgZG1pdGFibGUgaW1wbGVtZW50IHRoYXQgaXRlbSAqLworICAgIGJvb2wgZmlsbGVkOworICAgIHN0cnVjdCB7CisJY2hhciB0eXBlWzE2XTsKKwl1aW50OF90IHN0YXR1czsKKwljaGFyIGRlc2NyaXB0aW9uW0JBU0VfQk9BUkRfREVWSUNFX0RFU0NSSVBUSU9OXTsKKyAgICB9IGRldmljZXNfaW5mb3JtYXRpb25bMTBdOworfSBzX2Jhc2VfYm9hcmQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pX2JhdHRlcnkuaCBiL2NvbTMyL2dwbGluY2x1ZGUvZG1pL2RtaV9iYXR0ZXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyMWFhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvZG1pL2RtaV9iYXR0ZXJ5LmgKQEAgLTAsMCArMSw1NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIERNSV9CQVRURVJZX0gKKyNkZWZpbmUgRE1JX0JBVFRFUllfSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNkZWZpbmUgQkFUVEVSWV9MT0NBVElPTl9TSVpFCQk2NQorI2RlZmluZSBCQVRURVJZX01BTlVGQUNUVVJFUl9TSVpFCTY1CisjZGVmaW5lIEJBVFRFUllfTUFOVUZBQ1RVUkVfREFURV9TSVpFCTY1CisjZGVmaW5lIEJBVFRFUllfU0VSSUFMX1NJWkUJCTY1CisjZGVmaW5lIEJBVFRFUllfREVWSUNFX05BTUVfU0laRQk2NQorI2RlZmluZSBCQVRURVJZX0NIRU1JU1RSWV9TSVpFCQkzMgorI2RlZmluZSBCQVRURVJZX0NBUEFDSVRZX1NJWkUJCTE2CisjZGVmaW5lIEJBVFRFUllfREVTSUdOX1ZPTFRBR0VfU0laRQkxNgorI2RlZmluZSBCQVRURVJZX1NCRFNfU0laRQkJMjU1CisjZGVmaW5lIEJBVFRFUllfTUFYSU1VTV9FUlJPUl9TSVpFCTMyCisjZGVmaW5lIEJBVFRFUllfU0JEU19TRVJJQUxfU0laRQkzMgorI2RlZmluZSBCQVRURVJZX1NCRFNfTUFOVUZBQ1RVUkVfREFURV9TSVpFCTI1NQorI2RlZmluZSBCQVRURVJZX1NCRFNfQ0hFTUlTVFJZX1NJWkUJNjUKKyNkZWZpbmUgQkFUVEVSWV9PRU1fSU5GT19TSVpFCQkyNTUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgbG9jYXRpb25bQkFUVEVSWV9MT0NBVElPTl9TSVpFXTsKKyAgICBjaGFyIG1hbnVmYWN0dXJlcltCQVRURVJZX01BTlVGQUNUVVJFUl9TSVpFXTsKKyAgICBjaGFyIG1hbnVmYWN0dXJlX2RhdGVbQkFUVEVSWV9NQU5VRkFDVFVSRV9EQVRFX1NJWkVdOworICAgIGNoYXIgc2VyaWFsW0JBVFRFUllfU0VSSUFMX1NJWkVdOworICAgIGNoYXIgbmFtZVtCQVRURVJZX0RFVklDRV9OQU1FX1NJWkVdOworICAgIGNoYXIgY2hlbWlzdHJ5W0JBVFRFUllfQ0hFTUlTVFJZX1NJWkVdOworICAgIGNoYXIgZGVzaWduX2NhcGFjaXR5W0JBVFRFUllfQ0FQQUNJVFlfU0laRV07CisgICAgY2hhciBkZXNpZ25fdm9sdGFnZVtCQVRURVJZX0RFU0lHTl9WT0xUQUdFX1NJWkVdOworICAgIGNoYXIgc2Jkc1tCQVRURVJZX1NCRFNfU0laRV07CisgICAgY2hhciBzYmRzX3NlcmlhbFtCQVRURVJZX1NCRFNfU0VSSUFMX1NJWkVdOworICAgIGNoYXIgbWF4aW11bV9lcnJvcltCQVRURVJZX01BWElNVU1fRVJST1JfU0laRV07CisgICAgY2hhciBzYmRzX21hbnVmYWN0dXJlX2RhdGVbQkFUVEVSWV9TQkRTX01BTlVGQUNUVVJFX0RBVEVfU0laRV07CisgICAgY2hhciBzYmRzX2NoZW1pc3RyeVtCQVRURVJZX1NCRFNfQ0hFTUlTVFJZX1NJWkVdOworICAgIGNoYXIgb2VtX2luZm9bQkFUVEVSWV9PRU1fSU5GT19TSVpFXTsKKy8qIFRoZSBmaWxsZWQgZmllbGQgaGF2ZSB0byBiZSBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBkbWl0YWJsZSBpbXBsZW1lbnQgdGhhdCBpdGVtICovCisgICAgYm9vbCBmaWxsZWQ7Cit9IHNfYmF0dGVyeTsKKworY29uc3QgY2hhciAqZG1pX2JhdHRlcnlfY2hlbWlzdHJ5KHVpbnQ4X3QgY29kZSk7Cit2b2lkIGRtaV9iYXR0ZXJ5X2NhcGFjaXR5KHVpbnQxNl90IGNvZGUsIHVpbnQ4X3QgbXVsdGlwbGllciwgY2hhciAqY2FwYWNpdHkpOwordm9pZCBkbWlfYmF0dGVyeV92b2x0YWdlKHVpbnQxNl90IGNvZGUsIGNoYXIgKnZvbHRhZ2UpOwordm9pZCBkbWlfYmF0dGVyeV9tYXhpbXVtX2Vycm9yKHVpbnQ4X3QgY29kZSwgY2hhciAqZXJyb3IpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfYmlvcy5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pX2Jpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY3ZTBiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pX2Jpb3MuaApAQCAtMCwwICsxLDEwOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIERNSV9CSU9TX0gKKyNkZWZpbmUgRE1JX0JJT1NfSAorCisjaW5jbHVkZSAic3RkYm9vbC5oIgorI2RlZmluZSBCSU9TX1ZFTkRPUl9TSVpFCQk2NQorI2RlZmluZSBCSU9TX1ZFUlNJT05fU0laRQkJNjUKKyNkZWZpbmUgQklPU19SRUxFQVNFX1NJWkUJCTY1CisjZGVmaW5lIEJJT1NfUlVOVElNRV9TSVpFX1VOSVRfU0laRQkxNgorI2RlZmluZSBCSU9TX1JPTV9VTklUX1NJWkUJCTE2CisjZGVmaW5lIEJJT1NfQklPU19SRVZJU0lPTl9TSVpFCQkxNgorI2RlZmluZSBCSU9TX0ZJUk1XQVJFX1JFVklTSU9OX1NJWkUJMTYKKworI2RlZmluZSBCSU9TX0NIQVJfTkJfRUxFTUVOVFMJCTI5CisjZGVmaW5lIEJJT1NfQ0hBUl9YMV9OQl9FTEVNRU5UUwk4CisjZGVmaW5lIEJJT1NfQ0hBUl9YMl9OQl9FTEVNRU5UUwkzCisKK2V4dGVybiBjb25zdCBjaGFyICpiaW9zX2NoYXJhY19zdHJpbmdzW107CisKKy8qIHRoaXMgc3RydWN0IGhhcyBCSU9TX0NIQVJfTkJfRUxFTUVOVFMgKi8KKy8qIGVhY2ggYm9vbCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGV2YW50IG1lc3NhZ2UgYWJvdmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBib29sIGJpb3NfY2hhcmFjdGVyaXN0aWNzX25vdF9zdXBwb3J0ZWQ7CisgICAgYm9vbCBpc2E7CisgICAgYm9vbCBtY2E7CisgICAgYm9vbCBlaXNhOworICAgIGJvb2wgcGNpOworICAgIGJvb2wgcGNfY2FyZDsKKyAgICBib29sIHBucDsKKyAgICBib29sIGFwbTsKKyAgICBib29sIGJpb3NfdXBncmVhZGFibGU7CisgICAgYm9vbCBiaW9zX3NoYWRvd2luZzsKKyAgICBib29sIHZsYjsKKyAgICBib29sIGVzY2Q7CisgICAgYm9vbCBib290X2Zyb21fY2Q7CisgICAgYm9vbCBzZWxlY3RhYmxlX2Jvb3Q7CisgICAgYm9vbCBiaW9zX3JvbV9zb2NrZXRlZDsKKyAgICBib29sIGJvb3RfZnJvbV9wY21jaWE7CisgICAgYm9vbCBlZGQ7CisgICAgYm9vbCBqYXBhbmVzZV9mbG9wcHlfbmVjXzk4MDBfMV8yTUI7CisgICAgYm9vbCBqYXBhbmVzZV9mbG9wcHlfdG9zaGliYV8xXzJNQjsKKyAgICBib29sIGZsb3BweV81XzI1XzM2MEtCOworICAgIGJvb2wgZmxvcHB5XzVfMjVfMV8yTUI7CisgICAgYm9vbCBmbG9wcHlfM181XzcyMEtCOworICAgIGJvb2wgZmxvcHB5XzNfNV8yXzg4TUI7CisgICAgYm9vbCBwcmludF9zY3JlZW47CisgICAgYm9vbCBrZXlib2FyZF84MDQyX3N1cHBvcnQ7CisgICAgYm9vbCBzZXJpYWxfc3VwcG9ydDsKKyAgICBib29sIHByaW50ZXJfc3VwcG9ydDsKKyAgICBib29sIGNnYV9tb25vX3N1cHBvcnQ7CisgICAgYm9vbCBuZWNfcGNfOTg7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgc19jaGFyYWN0ZXJpc3RpY3M7CisKK2V4dGVybiBjb25zdCBjaGFyICpiaW9zX2NoYXJhY194MV9zdHJpbmdzW107CisKKy8qIHRoaXMgc3RydWN0IGhhcyBCSU9TX0NIQVJfWDFfTkJfRUxFTUVOVFMgKi8KKy8qIGVhY2ggYm9vbCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGV2YW50IG1lc3NhZ2UgYWJvdmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBib29sIGFjcGk7CisgICAgYm9vbCB1c2JfbGVnYWN5OworICAgIGJvb2wgYWdwOworICAgIGJvb2wgaTJvX2Jvb3Q7CisgICAgYm9vbCBsc18xMjBfYm9vdDsKKyAgICBib29sIHppcF9kcml2ZV9ib290OworICAgIGJvb2wgaWVlZV8xMzk0X2Jvb3Q7CisgICAgYm9vbCBzbWFydF9iYXR0ZXJ5OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHNfY2hhcmFjdGVyaXN0aWNzX3gxOworCitleHRlcm4gY29uc3QgY2hhciAqYmlvc19jaGFyYWNfeDJfc3RyaW5nc1tdOworCisvKiB0aGlzIHN0cnVjdCBoYXMgQklPU19DSEFSX1gyX05CX0VMRU1FTlRTICovCisvKiBlYWNoIGJvb2wgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxldmFudCBtZXNzYWdlIGFib3ZlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYm9vbCBiaW9zX2Jvb3Rfc3BlY2lmaWNhdGlvbjsKKyAgICBib29sIGJpb3NfbmV0d29ya19ib290X2J5X2tleXByZXNzOworICAgIGJvb2wgdGFyZ2V0X2NvbnRlbnRfZGlzdHJpYnV0aW9uOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHNfY2hhcmFjdGVyaXN0aWNzX3gyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciB2ZW5kb3JbQklPU19WRU5ET1JfU0laRV07CisgICAgY2hhciB2ZXJzaW9uW0JJT1NfVkVSU0lPTl9TSVpFXTsKKyAgICBjaGFyIHJlbGVhc2VfZGF0ZVtCSU9TX1JFTEVBU0VfU0laRV07CisgICAgdWludDE2X3QgYWRkcmVzczsKKyAgICB1aW50MTZfdCBydW50aW1lX3NpemU7CisgICAgY2hhciBydW50aW1lX3NpemVfdW5pdFtCSU9TX1JVTlRJTUVfU0laRV9VTklUX1NJWkVdOworICAgIHVpbnQxNl90IHJvbV9zaXplOworICAgIGNoYXIgcm9tX3NpemVfdW5pdFtCSU9TX1JPTV9VTklUX1NJWkVdOworICAgIHNfY2hhcmFjdGVyaXN0aWNzIGNoYXJhY3RlcmlzdGljczsKKyAgICBzX2NoYXJhY3RlcmlzdGljc194MSBjaGFyYWN0ZXJpc3RpY3NfeDE7CisgICAgc19jaGFyYWN0ZXJpc3RpY3NfeDIgY2hhcmFjdGVyaXN0aWNzX3gyOworICAgIGNoYXIgYmlvc19yZXZpc2lvbltCSU9TX0JJT1NfUkVWSVNJT05fU0laRV07CisgICAgY2hhciBmaXJtd2FyZV9yZXZpc2lvbltCSU9TX0ZJUk1XQVJFX1JFVklTSU9OX1NJWkVdOworLyogVGhlIGZpbGxlZCBmaWVsZCBoYXZlIHRvIGJlIHNldCB0byB0cnVlIHdoZW4gdGhlIGRtaXRhYmxlIGltcGxlbWVudCB0aGF0IGl0ZW0gKi8KKyAgICBib29sIGZpbGxlZDsKK30gc19iaW9zOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGluY2x1ZGUvZG1pL2RtaV9jYWNoZS5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pX2NhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzY2ZiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvZG1pL2RtaV9jYWNoZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBTb21lIHBhcnQgYm9ycm93ZWQgZnJvbSBETUkgRGVjb2RlOgorICoKKyAqICAgKEMpIDIwMDAtMjAwMiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogICAoQykgMjAwMi0yMDA3IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgRE1JX0NBQ0hFX0gKKyNkZWZpbmUgRE1JX0NBQ0hFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAic3RkYm9vbC5oIgorCisjZGVmaW5lIENBQ0hFX1NPQ0tFVF9ERVNJR05BVElPTl9TSVpFICA2NQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciBzb2NrZXRfZGVzaWduYXRpb25bQ0FDSEVfU09DS0VUX0RFU0lHTkFUSU9OX1NJWkVdOworICAgIGNoYXIgY29uZmlndXJhdGlvblszMl07CisgICAgY2hhciBtb2RlWzMyXTsKKyAgICBjaGFyIGxvY2F0aW9uWzhdOworICAgIHVpbnQxNl90IGluc3RhbGxlZF9zaXplOworICAgIHVpbnQxNl90IG1heF9zaXplOworICAgIGNoYXIgc3VwcG9ydGVkX3NyYW1fdHlwZXNbMzJdOworICAgIGNoYXIgaW5zdGFsbGVkX3NyYW1fdHlwZXNbMzJdOworICAgIHVpbnQxNl90IHNwZWVkOworICAgIGNoYXIgZXJyb3JfY29ycmVjdGlvbl90eXBlWzMyXTsKKyAgICBjaGFyIHN5c3RlbV90eXBlWzE2XTsKKyAgICBjaGFyIGFzc29jaWF0aXZpdHlbMzJdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHNfY2FjaGU7CisKK2NvbnN0IGNoYXIgKmRtaV9jYWNoZV9tb2RlKHVpbnQ4X3QgY29kZSk7Citjb25zdCBjaGFyICpkbWlfY2FjaGVfbG9jYXRpb24odWludDhfdCBjb2RlKTsKK3VpbnQxNl90IGRtaV9jYWNoZV9zaXplKHVpbnQxNl90IGNvZGUpOwordm9pZCBkbWlfY2FjaGVfdHlwZXModWludDE2X3QgY29kZSwgY29uc3QgY2hhciAqc2VwLCBjaGFyICphcnJheSk7Citjb25zdCBjaGFyICpkbWlfY2FjaGVfZWNfdHlwZSh1aW50OF90IGNvZGUpOworY29uc3QgY2hhciAqZG1pX2NhY2hlX3R5cGUodWludDhfdCBjb2RlKTsKK2NvbnN0IGNoYXIgKmRtaV9jYWNoZV9hc3NvY2lhdGl2aXR5KHVpbnQ4X3QgY29kZSk7CisjZW5kaWYgLyogRE1JX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGluY2x1ZGUvZG1pL2RtaV9jaGFzc2lzLmggYi9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfY2hhc3Npcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTc2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfY2hhc3Npcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA2IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBETUlfQ0hBU1NJU19ICisjZGVmaW5lIERNSV9DSEFTU0lTX0gKKworI2RlZmluZSBDSEFTU0lTX01BTlVGQUNUVVJFUl9TSVpFCTY1CisjZGVmaW5lIENIQVNTSVNfVFlQRV9TSVpFCQkxNgorI2RlZmluZSBDSEFTU0lTX0xPQ0tfU0laRQkJMTYKKyNkZWZpbmUgQ0hBU1NJU19WRVJTSU9OX1NJWkUJCTY1CisjZGVmaW5lIENIQVNTSVNfU0VSSUFMX1NJWkUJCTY1CisjZGVmaW5lIENIQVNTSVNfQVNTRVRfVEFHX1NJWkUJCTY1CisjZGVmaW5lIENIQVNTSVNfQk9PVF9VUF9TVEFURV9TSVpFCTMyCisjZGVmaW5lIENIQVNTSVNfUE9XRVJfU1VQUExZX1NUQVRFX1NJWkUJCTMyCisjZGVmaW5lIENIQVNTSVNfVEhFUk1BTF9TVEFURV9TSVpFCTMyCisjZGVmaW5lIENIQVNTSVNfU0VDVVJJVFlfU1RBVFVTX1NJWkUJMzIKKyNkZWZpbmUgQ0hBU1NJU19PRU1fSU5GT1JNQVRJT05fU0laRQkzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciBtYW51ZmFjdHVyZXJbQ0hBU1NJU19NQU5VRkFDVFVSRVJfU0laRV07CisgICAgY2hhciB0eXBlW0NIQVNTSVNfVFlQRV9TSVpFXTsKKyAgICBjaGFyIGxvY2tbQ0hBU1NJU19MT0NLX1NJWkVdOworICAgIGNoYXIgdmVyc2lvbltDSEFTU0lTX1ZFUlNJT05fU0laRV07CisgICAgY2hhciBzZXJpYWxbQ0hBU1NJU19TRVJJQUxfU0laRV07CisgICAgY2hhciBhc3NldF90YWdbQ0hBU1NJU19BU1NFVF9UQUdfU0laRV07CisgICAgY2hhciBib290X3VwX3N0YXRlW0NIQVNTSVNfQk9PVF9VUF9TVEFURV9TSVpFXTsKKyAgICBjaGFyIHBvd2VyX3N1cHBseV9zdGF0ZVtDSEFTU0lTX1BPV0VSX1NVUFBMWV9TVEFURV9TSVpFXTsKKyAgICBjaGFyIHRoZXJtYWxfc3RhdGVbQ0hBU1NJU19USEVSTUFMX1NUQVRFX1NJWkVdOworICAgIGNoYXIgc2VjdXJpdHlfc3RhdHVzW0NIQVNTSVNfU0VDVVJJVFlfU1RBVFVTX1NJWkVdOworICAgIGNoYXIgb2VtX2luZm9ybWF0aW9uW0NIQVNTSVNfT0VNX0lORk9STUFUSU9OX1NJWkVdOworICAgIHVpbnQxNl90IGhlaWdodDsKKyAgICB1aW50MTZfdCBuYl9wb3dlcl9jb3JkczsKKy8qIFRoZSBmaWxsZWQgZmllbGQgaGF2ZSB0byBiZSBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBkbWl0YWJsZSBpbXBsZW1lbnQgdGhhdCBpdGVtICovCisgICAgYm9vbCBmaWxsZWQ7Cit9IHNfY2hhc3NpczsKKworY29uc3QgY2hhciAqZG1pX2NoYXNzaXNfdHlwZSh1aW50OF90IGNvZGUpOworY29uc3QgY2hhciAqZG1pX2NoYXNzaXNfbG9jayh1aW50OF90IGNvZGUpOworY29uc3QgY2hhciAqZG1pX2NoYXNzaXNfc3RhdGUodWludDhfdCBjb2RlKTsKK2NvbnN0IGNoYXIgKmRtaV9jaGFzc2lzX3NlY3VyaXR5X3N0YXR1cyh1aW50OF90IGNvZGUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfaXBtaS5oIGIvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pX2lwbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTEwYWU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9kbWkvZG1pX2lwbWkuaApAQCAtMCwwICsxLDMzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNi0yMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBETUlfSVBNSV9ICisjZGVmaW5lIERNSV9JUE1JX0gKKworI2RlZmluZSBJUE1JX0lOVEVSRkFDRV9UWVBFX1NJWkUJMzIKKyNkZWZpbmUgSVBNSV9NRU1PUllfTU9ERUxfU0laRQkJMTYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgaW50ZXJmYWNlX3R5cGVbSVBNSV9JTlRFUkZBQ0VfVFlQRV9TSVpFXTsKKyAgICB1aW50OF90IG1ham9yX3NwZWNpZmljYXRpb25fdmVyc2lvbjsKKyAgICB1aW50OF90IG1pbm9yX3NwZWNpZmljYXRpb25fdmVyc2lvbjsKKyAgICB1aW50OF90IEkyQ19zbGF2ZV9hZGRyZXNzOworICAgIHVpbnQxNl90IG52X2FkZHJlc3M7CisgICAgdWludDY0X3QgYmFzZV9hZGRyZXNzOworCisgICAgdWludDhfdCBpcnE7CisgICAgYm9vbCBmaWxsZWQ7Cit9IHNfaXBtaTsKKwordm9pZCBkbWlfaXBtaV9iYXNlX2FkZHJlc3ModWludDhfdCB0eXBlLCBjb25zdCB1aW50OF90ICogcCwgc19pcG1pICogaXBtaSk7Citjb25zdCBjaGFyICpkbWlfaXBtaV9pbnRlcmZhY2VfdHlwZSh1aW50OF90IGNvZGUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfbWVtb3J5LmggYi9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhMTZhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvZG1pL2RtaV9tZW1vcnkuaApAQCAtMCwwICsxLDc4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgRE1JX01FTU9SWV9ICisjZGVmaW5lIERNSV9NRU1PUllfSAorCisjZGVmaW5lIE1FTU9SWV9NQU5VRkFDVFVSRVJfU0laRQk2NQorI2RlZmluZSBNRU1PUllfRVJST1JfU0laRQkJMTYKKyNkZWZpbmUgTUVNT1JZX1RPVEFMX1dJRFRIX1NJWkUJCTE2CisjZGVmaW5lIE1FTU9SWV9EQVRBX1dJRFRIX1NJWkUJCTE2CisjZGVmaW5lIE1FTU9SWV9TSVpFX1NJWkUJCTMyCisjZGVmaW5lIE1FTU9SWV9GT1JNX0ZBQ1RPUl9TSVpFCQkzMgorI2RlZmluZSBNRU1PUllfREVWSUNFX1NFVF9TSVpFCQkzMgorI2RlZmluZSBNRU1PUllfREVWSUNFX0xPQ0FUT1JfU0laRQk2NQorI2RlZmluZSBNRU1PUllfQkFOS19MT0NBVE9SX1NJWkUJNjUKKyNkZWZpbmUgTUVNT1JZX1RZUEVfU0laRQkJMzIKKyNkZWZpbmUgTUVNT1JZX1RZUEVfREVUQUlMX1NJWkUJCTE2CisjZGVmaW5lIE1FTU9SWV9TUEVFRF9TSVpFCQkxNgorI2RlZmluZSBNRU1PUllfU0VSSUFMX1NJWkUJCTY1CisjZGVmaW5lIE1FTU9SWV9BU1NFVF9UQUdfU0laRQkJNjUKKyNkZWZpbmUgTUVNT1JZX1BBUlRfTlVNQkVSX1NJWkUJCTY1CisjZGVmaW5lIE1FTU9SWV9TT0NLRVRfREVTSUdOQVRJT05fU0laRQk2NQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciBtYW51ZmFjdHVyZXJbTUVNT1JZX01BTlVGQUNUVVJFUl9TSVpFXTsKKyAgICBjaGFyIGVycm9yW01FTU9SWV9FUlJPUl9TSVpFXTsKKyAgICBjaGFyIHRvdGFsX3dpZHRoW01FTU9SWV9UT1RBTF9XSURUSF9TSVpFXTsKKyAgICBjaGFyIGRhdGFfd2lkdGhbTUVNT1JZX0RBVEFfV0lEVEhfU0laRV07CisgICAgY2hhciBzaXplW01FTU9SWV9TSVpFX1NJWkVdOworICAgIGNoYXIgZm9ybV9mYWN0b3JbTUVNT1JZX0ZPUk1fRkFDVE9SX1NJWkVdOworICAgIGNoYXIgZGV2aWNlX3NldFtNRU1PUllfREVWSUNFX1NFVF9TSVpFXTsKKyAgICBjaGFyIGRldmljZV9sb2NhdG9yW01FTU9SWV9ERVZJQ0VfTE9DQVRPUl9TSVpFXTsKKyAgICBjaGFyIGJhbmtfbG9jYXRvcltNRU1PUllfQkFOS19MT0NBVE9SX1NJWkVdOworICAgIGNoYXIgdHlwZVtNRU1PUllfVFlQRV9TSVpFXTsKKyAgICBjaGFyIHR5cGVfZGV0YWlsW01FTU9SWV9UWVBFX0RFVEFJTF9TSVpFXTsKKyAgICBjaGFyIHNwZWVkW01FTU9SWV9TUEVFRF9TSVpFXTsKKyAgICBjaGFyIHNlcmlhbFtNRU1PUllfU0VSSUFMX1NJWkVdOworICAgIGNoYXIgYXNzZXRfdGFnW01FTU9SWV9BU1NFVF9UQUdfU0laRV07CisgICAgY2hhciBwYXJ0X251bWJlcltNRU1PUllfUEFSVF9OVU1CRVJfU0laRV07CisvKiBUaGUgZmlsbGVkIGZpZWxkIGhhdmUgdG8gYmUgc2V0IHRvIHRydWUgd2hlbiB0aGUgZG1pdGFibGUgaW1wbGVtZW50IHRoYXQgaXRlbSAqLworICAgIGJvb2wgZmlsbGVkOworfSBzX21lbW9yeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgc29ja2V0X2Rlc2lnbmF0aW9uW01FTU9SWV9TT0NLRVRfREVTSUdOQVRJT05fU0laRV07CisgICAgY2hhciBiYW5rX2Nvbm5lY3Rpb25zWzhdOworICAgIGNoYXIgc3BlZWRbOF07CisgICAgY2hhciB0eXBlWzQ4XTsKKyAgICBjaGFyIGluc3RhbGxlZF9zaXplWzQ4XTsKKyAgICBjaGFyIGVuYWJsZWRfc2l6ZVs0OF07CisgICAgY2hhciBlcnJvcl9zdGF0dXNbOF07CisgICAgYm9vbCBmaWxsZWQ7Cit9IHNfbWVtb3J5X21vZHVsZTsKKwordm9pZCBkbWlfbWVtb3J5X2FycmF5X2Vycm9yX2hhbmRsZSh1aW50MTZfdCBjb2RlLCBjaGFyICphcnJheSk7Cit2b2lkIGRtaV9tZW1vcnlfZGV2aWNlX3dpZHRoKHVpbnQxNl90IGNvZGUsIGNoYXIgKndpZHRoKTsKK3ZvaWQgZG1pX21lbW9yeV9kZXZpY2Vfc2l6ZSh1aW50MTZfdCBjb2RlLCBjaGFyICpzaXplKTsKK2NvbnN0IGNoYXIgKmRtaV9tZW1vcnlfZGV2aWNlX2Zvcm1fZmFjdG9yKHVpbnQ4X3QgY29kZSk7Cit2b2lkIGRtaV9tZW1vcnlfZGV2aWNlX3NldCh1aW50OF90IGNvZGUsIGNoYXIgKnNldCk7Citjb25zdCBjaGFyICpkbWlfbWVtb3J5X2RldmljZV90eXBlKHVpbnQ4X3QgY29kZSk7Cit2b2lkIGRtaV9tZW1vcnlfZGV2aWNlX3R5cGVfZGV0YWlsKHVpbnQxNl90IGNvZGUsIGNoYXIgKnR5cGVfZGV0YWlsLCBpbnQgc2l6ZW9mX3R5cGVfZGV0YWlsKTsKK3ZvaWQgZG1pX21lbW9yeV9kZXZpY2Vfc3BlZWQodWludDE2X3QgY29kZSwgY2hhciAqc3BlZWQpOworCit2b2lkIGRtaV9tZW1vcnlfbW9kdWxlX2Nvbm5lY3Rpb25zKHVpbnQ4X3QsIGNoYXIgKiwgaW50KTsKK3ZvaWQgZG1pX21lbW9yeV9tb2R1bGVfc3BlZWQodWludDhfdCwgY2hhciAqKTsKK3ZvaWQgZG1pX21lbW9yeV9tb2R1bGVfdHlwZXModWludDE2X3QsIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBpbnQpOwordm9pZCBkbWlfbWVtb3J5X21vZHVsZV9zaXplKHVpbnQ4X3QsIGNoYXIgKiwgaW50KTsKK3ZvaWQgZG1pX21lbW9yeV9tb2R1bGVfZXJyb3IodWludDhfdCwgY29uc3QgY2hhciAqLCBjaGFyICopOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfcHJvY2Vzc29yLmggYi9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlNzY2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvZG1pL2RtaV9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDExNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIERNSV9QUk9DRVNTT1JfSAorI2RlZmluZSBETUlfUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgInN0ZGJvb2wuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNkZWZpbmUgUFJPQ0VTU09SX1NPQ0tFVF9ERVNJR05BVElPTl9TSVpFCQk2NQorI2RlZmluZSBQUk9DRVNTT1JfVFlQRV9TSVpFCQkzMgorI2RlZmluZSBQUk9DRVNTT1JfRkFNSUxZX1NJWkUJCTMyCisjZGVmaW5lIFBST0NFU1NPUl9NQU5VRkFDVFVSRVJfU0laRSAgICAgNjUKKyNkZWZpbmUgUFJPQ0VTU09SX1ZFUlNJT05fU0laRQkJNjUJCisjZGVmaW5lIFBST0NFU1NPUl9WT0xUQUdFX1NJWkUJCTE2CisjZGVmaW5lIFBST0NFU1NPUl9TVEFUVVNfU0laRQkJMTYKKyNkZWZpbmUgUFJPQ0VTU09SX1VQR1JBREVfU0laRQkJMTYKKyNkZWZpbmUgUFJPQ0VTU09SX0NBQ0hFX1NJWkUJCTE2CisjZGVmaW5lIFBST0NFU1NPUl9TRVJJQUxfU0laRQkJNjUKKyNkZWZpbmUgUFJPQ0VTU09SX0FTU0VUX1RBR19TSVpFCTY1CisjZGVmaW5lIFBST0NFU1NPUl9QQVJUX05VTUJFUl9TSVpFCTY1CisjZGVmaW5lIFBST0NFU1NPUl9JRF9TSVpFCQkzMgorCisjZGVmaW5lIFBST0NFU1NPUl9GTEFHU19FTEVNRU5UUwkzMgorLyogSW50ZWwgQVAtNDg1IHJldmlzaW9uIDI4LCB0YWJsZSA1ICovCitleHRlcm4gY29uc3QgY2hhciAqY3B1X2ZsYWdzX3N0cmluZ3NbUFJPQ0VTU09SX0ZMQUdTX0VMRU1FTlRTXTsKKworLyogdGhpcyBzdHJ1Y3QgaGF2ZSBQUk9DRVNTT1JfRkxBR1NfRUxFTUVOVFMgKi8KKy8qIGVhY2ggYm9vbCBpcyBhc3NvY2lhdGVkIHRvIHRoZSByZWxldmFudCBtZXNzYWdlIGFib3ZlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYm9vbCBmcHU7CisgICAgYm9vbCB2bWU7CisgICAgYm9vbCBkZTsKKyAgICBib29sIHBzZTsKKyAgICBib29sIHRzYzsKKyAgICBib29sIG1zcjsKKyAgICBib29sIHBhZTsKKyAgICBib29sIG1jZTsKKyAgICBib29sIGN4ODsKKyAgICBib29sIGFwaWM7CisgICAgYm9vbCBudWxsXzEwOworICAgIGJvb2wgc2VwOworICAgIGJvb2wgbXRycjsKKyAgICBib29sIHBnZTsKKyAgICBib29sIG1jYTsKKyAgICBib29sIGNtb3Y7CisgICAgYm9vbCBwYXQ7CisgICAgYm9vbCBwc2VfMzY7CisgICAgYm9vbCBwc247CisgICAgYm9vbCBjbGZzaDsKKyAgICBib29sIG51bGxfMjA7CisgICAgYm9vbCBkczsKKyAgICBib29sIGFjcGk7CisgICAgYm9vbCBtbXg7CisgICAgYm9vbCBmeHNyOworICAgIGJvb2wgc3NlOworICAgIGJvb2wgc3NlMjsKKyAgICBib29sIHNzOworICAgIGJvb2wgaHR0OworICAgIGJvb2wgdG07CisgICAgYm9vbCBudWxsXzMwOworICAgIGJvb2wgcGJlOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHNfZG1pX2NwdV9mbGFnczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IGZhbWlseTsKKyAgICB1aW50OF90IG1vZGVsOworICAgIHVpbnQ4X3Qgc3RlcHBpbmc7CisgICAgdWludDhfdCBtaW5vcl9zdGVwcGluZzsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBzX3NpZ25hdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgc29ja2V0X2Rlc2lnbmF0aW9uW1BST0NFU1NPUl9TT0NLRVRfREVTSUdOQVRJT05fU0laRV07CisgICAgY2hhciB0eXBlW1BST0NFU1NPUl9UWVBFX1NJWkVdOworICAgIGNoYXIgZmFtaWx5W1BST0NFU1NPUl9GQU1JTFlfU0laRV07CisgICAgY2hhciBtYW51ZmFjdHVyZXJbUFJPQ0VTU09SX01BTlVGQUNUVVJFUl9TSVpFXTsKKyAgICBjaGFyIHZlcnNpb25bUFJPQ0VTU09SX1ZFUlNJT05fU0laRV07CisgICAgdWludDE2X3Qgdm9sdGFnZV9tdjsKKyAgICB1aW50MTZfdCBleHRlcm5hbF9jbG9jazsKKyAgICB1aW50MTZfdCBtYXhfc3BlZWQ7CisgICAgdWludDE2X3QgY3VycmVudF9zcGVlZDsKKyAgICBjaGFyIHN0YXR1c1tQUk9DRVNTT1JfU1RBVFVTX1NJWkVdOworICAgIGNoYXIgdXBncmFkZVtQUk9DRVNTT1JfVVBHUkFERV9TSVpFXTsKKyAgICBjaGFyIGNhY2hlMVtQUk9DRVNTT1JfQ0FDSEVfU0laRV07CisgICAgY2hhciBjYWNoZTJbUFJPQ0VTU09SX0NBQ0hFX1NJWkVdOworICAgIGNoYXIgY2FjaGUzW1BST0NFU1NPUl9DQUNIRV9TSVpFXTsKKyAgICBjaGFyIHNlcmlhbFtQUk9DRVNTT1JfU0VSSUFMX1NJWkVdOworICAgIGNoYXIgYXNzZXRfdGFnW1BST0NFU1NPUl9BU1NFVF9UQUdfU0laRV07CisgICAgY2hhciBwYXJ0X251bWJlcltQUk9DRVNTT1JfUEFSVF9OVU1CRVJfU0laRV07CisgICAgY2hhciBpZFtQUk9DRVNTT1JfSURfU0laRV07CisgICAgdWludDE2X3QgY29yZV9jb3VudDsKKyAgICB1aW50MTZfdCBjb3JlX2VuYWJsZWQ7CisgICAgdWludDE2X3QgdGhyZWFkX2NvdW50OworICAgIHNfZG1pX2NwdV9mbGFncyBjcHVfZmxhZ3M7CisgICAgc19zaWduYXR1cmUgc2lnbmF0dXJlOworLyogVGhlIGZpbGxlZCBmaWVsZCBoYXZlIHRvIGJlIHNldCB0byB0cnVlIHdoZW4gdGhlIGRtaXRhYmxlIGltcGxlbWVudCB0aGF0IGl0ZW0gKi8KKyAgICBib29sIGZpbGxlZDsKK30gc19wcm9jZXNzb3I7CisKK2NvbnN0IGNoYXIgKmRtaV9wcm9jZXNzb3JfdHlwZSh1aW50OF90IGNvZGUpOworY29uc3QgY2hhciAqZG1pX3Byb2Nlc3Nvcl9mYW1pbHkodWludDhfdCBjb2RlLCBjaGFyICptYW51ZmFjdHVyZXIpOworY29uc3QgY2hhciAqZG1pX3Byb2Nlc3Nvcl9zdGF0dXModWludDhfdCBjb2RlKTsKK2NvbnN0IGNoYXIgKmRtaV9wcm9jZXNzb3JfdXBncmFkZSh1aW50OF90IGNvZGUpOwordm9pZCBkbWlfcHJvY2Vzc29yX2NhY2hlKHVpbnQxNl90IGNvZGUsIGNvbnN0IGNoYXIgKmxldmVsLCB1aW50MTZfdCB2ZXIsCisJCQkgY2hhciAqY2FjaGUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfc3lzdGVtLmggYi9jb20zMi9ncGxpbmNsdWRlL2RtaS9kbWlfc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4OTJlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGluY2x1ZGUvZG1pL2RtaV9zeXN0ZW0uaApAQCAtMCwwICsxLDUzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNiBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgRE1JX1NZU1RFTV9ICisjZGVmaW5lIERNSV9TWVNURU1fSAorCisjZGVmaW5lIFNZU1RFTV9NQU5VRkFDVFVSRVJfU0laRQk2NQorI2RlZmluZSBTWVNURU1fUFJPRFVDVF9OQU1FX1NJWkUJNjUKKyNkZWZpbmUgU1lTVEVNX1ZFUlNJT05fU0laRQkJNjUKKyNkZWZpbmUgU1lTVEVNX1NFUklBTF9TSVpFCQk2NQorI2RlZmluZSBTWVNURU1fVVVJRF9TSVpFCQk0MAorI2RlZmluZSBTWVNURU1fV0FLRVVQX1RZUEVfU0laRQkJMzIKKyNkZWZpbmUgU1lTVEVNX1NLVV9OVU1CRVJfU0laRQkJNjUKKyNkZWZpbmUgU1lTVEVNX0ZBTUlMWV9TSVpFCQk2NQorCisjZGVmaW5lIFNZU1RFTV9CT09UX1NUQVRVU19TSVpFCQk1MAorI2RlZmluZSBTWVNURU1fQ09ORklHVVJBVElPTl9PUFRJT05TX1NJWkUJNTAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgbWFudWZhY3R1cmVyW1NZU1RFTV9NQU5VRkFDVFVSRVJfU0laRV07CisgICAgY2hhciBwcm9kdWN0X25hbWVbU1lTVEVNX1BST0RVQ1RfTkFNRV9TSVpFXTsKKyAgICBjaGFyIHZlcnNpb25bU1lTVEVNX1ZFUlNJT05fU0laRV07CisgICAgY2hhciBzZXJpYWxbU1lTVEVNX1NFUklBTF9TSVpFXTsKKyAgICBjaGFyIHV1aWRbU1lTVEVNX1VVSURfU0laRV07CisgICAgY2hhciB3YWtldXBfdHlwZVtTWVNURU1fV0FLRVVQX1RZUEVfU0laRV07CisgICAgY2hhciBza3VfbnVtYmVyW1NZU1RFTV9TS1VfTlVNQkVSX1NJWkVdOworICAgIGNoYXIgZmFtaWx5W1NZU1RFTV9GQU1JTFlfU0laRV07CisvKiBUaGUgZmlsbGVkIGZpZWxkIGhhdmUgdG8gYmUgc2V0IHRvIHRydWUgd2hlbiB0aGUgZG1pdGFibGUgaW1wbGVtZW50IHRoYXQgaXRlbSAqLworICAgIGJvb2wgZmlsbGVkOworICAgIGNoYXIgc3lzdGVtX2Jvb3Rfc3RhdHVzW1NZU1RFTV9CT09UX1NUQVRVU19TSVpFXTsKKyAgICBjaGFyIGNvbmZpZ3VyYXRpb25fb3B0aW9uc1tTWVNURU1fQ09ORklHVVJBVElPTl9PUFRJT05TX1NJWkVdOworICAgIHN0cnVjdCB7CisJYm9vbCBmaWxsZWQ7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCB3YXRjaGRvZzsKKwljaGFyIGJvb3Rfb3B0aW9uWzE3XTsKKwljaGFyIGJvb3Rfb3B0aW9uX29uX2xpbWl0WzE3XTsKKwljaGFyIHJlc2V0X2NvdW50WzhdOworCWNoYXIgcmVzZXRfbGltaXRbOF07CisJY2hhciB0aW1lcl9pbnRlcnZhbFs4XTsKKwljaGFyIHRpbWVvdXRbOF07CisgICAgfSBzeXN0ZW1fcmVzZXQ7Cit9IHNfc3lzdGVtOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9ncGxpbmNsdWRlL21lbW9yeS5oIGIvY29tMzIvZ3BsaW5jbHVkZS9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTMzYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS9tZW1vcnkuaApAQCAtMCwwICsxLDUzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBQaWVycmUtQWxleGFuZHJlIE1leWVyCisgKgorICogICBTb21lIHBhcnRzIGJvcnJvd2VkIGZyb20gbWVtaW5mby5jMzI6CisgKgorICogICBDb3B5cmlnaHQgMjAwMy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgU29tZSBwYXJ0cyBib3Jyb3dlZCBmcm9tIExpbnV4OgorICoKKyAqICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCisgKiAgIENvcHlyaWdodCAyMDA3IHJQYXRoLCBJbmMuIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTeXNsaW51eCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX01FTU9SWV9IXworI2RlZmluZSBfTUVNT1JZX0hfCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgRTgyME1BWCAxMjgKKyNkZWZpbmUgRTgyMF9SQU0gICAgICAgIDEKKyNkZWZpbmUgRTgyMF9SRVNFUlZFRCAgIDIKKyNkZWZpbmUgRTgyMF9BQ1BJICAgICAgIDMJLyogdXNhYmxlIGFzIFJBTSBvbmNlIEFDUEkgdGFibGVzIGhhdmUgYmVlbiByZWFkICovCisjZGVmaW5lIEU4MjBfTlZTICAgICAgICA0CisKKyNkZWZpbmUgUkVTX1NUQVJUICAgICAgIDB4YTAwMDAKKyNkZWZpbmUgUkVTX0VORCAgICAgICAgIDB4MTAwMDAwCisKK3N0cnVjdCBlODIwZW50cnkgeworICAgIHVpbnQ2NF90IGFkZHI7CQkvKiBzdGFydCBvZiBtZW1vcnkgc2VnbWVudCAqLworICAgIHVpbnQ2NF90IHNpemU7CQkvKiBzaXplIG9mIG1lbW9yeSBzZWdtZW50ICovCisgICAgdWludDY0X3QgdHlwZTsJCS8qIHR5cGUgb2YgbWVtb3J5IHNlZ21lbnQgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitjb25zdCBjaGFyICpjb25zdCBlODIwX3R5cGVzWzVdOworCit2b2lkIGdldF90eXBlKGludCwgY2hhciAqLCBpbnQpOwordm9pZCBkZXRlY3RfbWVtb3J5X2U4MjAoc3RydWN0IGU4MjBlbnRyeSAqZGVzYywgaW50IHNpemVfbWFwLCBpbnQgKnNpemVfZm91bmQpOworaW50IGRldGVjdF9tZW1vcnlfZTgwMShpbnQgKiwgaW50ICopOworaW50IGRldGVjdF9tZW1vcnlfODgoaW50ICopOworCisvKiBUaGUgZm9sbG93aW5nIHN0dWZmIGNvdWxkIGJlIG1lcmdlIG9uY2UgdGhlIGFkZHJfdCB3aWxsIGJlIHNldCB0byA2NGJpdHMuCisgKiBzeXNsaW51eF9zY2FuX21lbW9yeSBjYW4gYmUgdXNlZCBmb3IgdGhhdCBwdXJwb3NlICovCit1bnNpZ25lZCBsb25nIG1lbXNpemVfZTgyMChzdHJ1Y3QgZTgyMGVudHJ5ICplODIwLCBpbnQgZTgyMF9ucik7CitpbnQgc2FuaXRpemVfZTgyMF9tYXAoc3RydWN0IGU4MjBlbnRyeSAqb3JpZ19tYXAsIHN0cnVjdCBlODIwZW50cnkgKm5ld19iaW9zLAorCQkgICAgICBzaG9ydCBvbGRfbnIpOwordW5zaWduZWQgbG9uZyBkZXRlY3RfbWVtc2l6ZSh2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS92cGQvdnBkLmggYi9jb20zMi9ncGxpbmNsdWRlL3ZwZC92cGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY3N2JkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS92cGQvdnBkLmgKQEAgLTAsMCArMSwzMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIFZQRF9ICisjZGVmaW5lIFZQRF9ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK2VudW0geyBWUERfVEFCTEVfUFJFU0VOVCA9IDEwMCwgRU5PVlBEVEFCTEUgfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgYmlvc19idWlsZF9pZFsxMF07CisgICAgY2hhciBib3hfc2VyaWFsX251bWJlcls4XTsKKyAgICBjaGFyIG1vdGhlcmJvYXJkX3NlcmlhbF9udW1iZXJbMTJdOworICAgIGNoYXIgbWFjaGluZV90eXBlX21vZGVsWzhdOworICAgIGNoYXIgYmlvc19yZWxlYXNlX2RhdGVbOV07CisgICAgY2hhciBkZWZhdWx0X2ZsYXNoX2ZpbGVuYW1lWzEzXTsKKyAgICBjaGFyIGJpb3NfdmVyc2lvblsyNTVdOworICAgIGNoYXIgYmFzZV9hZGRyZXNzWzE2XTsKKyAgICBib29sIGZpbGxlZDsKK30gc192cGQ7CisKK2ludCB2cGRfZGVjb2RlKHNfdnBkICogdnBkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsaW5jbHVkZS96empzb24venpqc29uLmggYi9jb20zMi9ncGxpbmNsdWRlL3p6anNvbi96empzb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGIzMmUxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsaW5jbHVkZS96empzb24venpqc29uLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIFpaSlNPTiAtIENvcHlyaWdodCAoQykgMjAwOCBieSBJdm8gdmFuIFBvb3J0ZW4KKyAqIExpY2Vuc2U6IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMQorICovCisjaWZuZGVmIFpaSlNPTl9ICisjZGVmaW5lIFpaSlNPTl9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogVmVyc2lvbjogKi8KKworI2RlZmluZSBaWkpTT05fVkVSU0lPTl9NQUpPUiAgICAxCisjZGVmaW5lIFpaSlNPTl9WRVJTSU9OX01JTk9SICAgIDEKKyNkZWZpbmUgWlpKU09OX1ZFUlNJT05fTUlDUk8gICAgMAorI2RlZmluZSBaWkpTT05fVkVSU0lPTl9JTlQgICAgICAoIDE8PDE2IHwgMTw8OCB8IDAgKQorI2RlZmluZSBaWkpTT05fSURFTlQgICAgICAgICAgICAienpqc29uIDEuMS4wIgorCisvKiBEZWZpbmVzOiAqLworCisjZGVmaW5lIFpaSlNPTl9BTExPV19FWFRSQV9DT01NQSAgICAgICAgMQorI2RlZmluZSBaWkpTT05fQUxMT1dfSUxMRUdBTF9FU0NBUEUgICAgIDIKKyNkZWZpbmUgWlpKU09OX0FMTE9XX0NPTlRST0xfQ0hBUlMgICAgICA0CisjZGVmaW5lIFpaSlNPTl9BTExPV19HQVJCQUdFX0FUX0VORCAgICAgOAorI2RlZmluZSBaWkpTT05fQUxMT1dfQ09NTUVOVFMgICAgICAgICAgIDE2CisKKyNkZWZpbmUgWlpKU09OX1ZFUllfTE9PU0UgICAgICAgICAgICAgICAoLTEpCisjZGVmaW5lIFpaSlNPTl9WRVJZX1NUUklDVCAgICAgICAgICAgICAgMAorCisvKiBUeXBlczogKi8KKworLyogbmVlZGVkIGJ5OiBwYSA9IHBhcnNlciwgcHIgPSBwcmludGVyLCBmID0gZnJlZSwgcSA9IHF1ZXJ5LCBjID0gY3JlYXRlICovCit0eXBlZGVmIHN0cnVjdCBaWkpTT05fQ09ORklHIHsKKyAgICBpbnQgc3RyaWN0bmVzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGEKKyAgICB2b2lkICppaGFuZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGEKKyAgICBpbnQgKCpnZXRjaGFyKSh2b2lkICppaGFuZGxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGEKKyAgICBpbnQgKCp1bmdldGNoYXIpKGludCBjLCB2b2lkICppaGFuZGxlKTsgICAgICAgICAgICAgICAgLy8gcGEKKyAgICB2b2lkICooKm1hbGxvYykoc2l6ZV90IHNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGEgICAgICBjCisgICAgdm9pZCAqKCpjYWxsb2MpKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpOyAgICAgICAgICAgIC8vIHBhICAgICAgYworICAgIHZvaWQgKCpmcmVlKSh2b2lkICpwdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYSAgICBmIGMKKyAgICB2b2lkICooKnJlYWxsb2MpKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOyAgICAgICAgICAgICAgLy8gcGEKKyAgICB2b2lkICplaGFuZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGEgcHIgICBjCisgICAgdm9pZCAoKmVycm9yKSh2b2lkICplaGFuZGxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7IC8vIHBhIHByICAgYworICAgIHZvaWQgKm9oYW5kbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBwcgorICAgIGludCAoKnByaW50KSh2b2lkICpvaGFuZGxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7ICAvLyAgICBwcgorICAgIGludCAoKnB1dGNoYXIpKGludCBjLCB2b2lkICpoYW5kbGUpOyAgICAgICAgICAgICAgICAgICAvLyAgICBwcgorfSBaWkpTT05fQ09ORklHOworCit0eXBlZGVmIGVudW0gWlpKU09OX1RZUEUgeworICAgIFpaSlNPTl9OT05FID0gMCwKKyAgICBaWkpTT05fT0JKRUNULAorICAgIFpaSlNPTl9BUlJBWSwKKyAgICBaWkpTT05fU1RSSU5HLAorICAgIFpaSlNPTl9OVU1CRVJfTkVHSU5ULAorICAgIFpaSlNPTl9OVU1CRVJfUE9TSU5ULAorICAgIFpaSlNPTl9OVU1CRVJfRE9VQkxFLAorICAgIFpaSlNPTl9OVUxMLAorICAgIFpaSlNPTl9UUlVFLAorICAgIFpaSlNPTl9GQUxTRQorfSBaWkpTT05fVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgWlpKU09OIHsKKyAgICBaWkpTT05fVFlQRSB0eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGNoYXIgKmxhYmVsOworICAgICAgICAgICAgc3RydWN0IFpaSlNPTiAqdmFsOworICAgICAgICB9IG9iamVjdDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHN0cnVjdCBaWkpTT04gKnZhbDsKKyAgICAgICAgfSBhcnJheTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgICAgfSBzdHJpbmc7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGl2YWw7CisgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICAgICAgIGR2YWw7CisgICAgICAgICAgICB9IHZhbDsKKyAgICAgICAgfSBudW1iZXI7CisgICAgfSB2YWx1ZTsKKyAgICBzdHJ1Y3QgWlpKU09OICpuZXh0OworfSBaWkpTT047CisKKy8qIEZ1bmN0aW9uczogKi8KKworWlpKU09OICp6empzb25fcGFyc2UoWlpKU09OX0NPTkZJRyAqY29uZmlnKTsKK3ZvaWQgenpqc29uX2ZyZWUoWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKnp6anNvbik7CitpbnQgenpqc29uX3ByaW50KFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICp6empzb24pOworCitaWkpTT04gKnp6anNvbl9vYmplY3RfZmluZF9sYWJlbChaWkpTT04gKnp6anNvbiwgY2hhciAqbGFiZWwpOworWlpKU09OICp6empzb25fb2JqZWN0X2ZpbmRfbGFiZWxzKFpaSlNPTiAqenpqc29uLCAuLi4pOyAvLyBlbmQgd2l0aCAsIE5VTEwKK3Vuc2lnbmVkIGludCB6empzb25fb2JqZWN0X2NvdW50KFpaSlNPTiAqenpqc29uKTsKK3Vuc2lnbmVkIGludCB6empzb25fYXJyYXlfY291bnQoWlpKU09OICp6empzb24pOworCitaWkpTT04gKnp6anNvbl9jcmVhdGVfdHJ1ZShaWkpTT05fQ09ORklHICpjb25maWcpOworWlpKU09OICp6empzb25fY3JlYXRlX2ZhbHNlKFpaSlNPTl9DT05GSUcgKmNvbmZpZyk7CitaWkpTT04gKnp6anNvbl9jcmVhdGVfbnVsbChaWkpTT05fQ09ORklHICpjb25maWcpOworWlpKU09OICp6empzb25fY3JlYXRlX251bWJlcl9kKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgZG91YmxlIGQpOworWlpKU09OICp6empzb25fY3JlYXRlX251bWJlcl9pKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgbG9uZyBsb25nIGkpOworWlpKU09OICp6empzb25fY3JlYXRlX3N0cmluZyhaWkpTT05fQ09ORklHICpjb25maWcsIGNoYXIgKnMpOworCisvKiBsaXN0IG9mIFpaSlNPTiAqJ3MgYW5kIGVuZCB3aXRoICwgTlVMTCAqLworWlpKU09OICp6empzb25fY3JlYXRlX2FycmF5KFpaSlNPTl9DT05GSUcgKmNvbmZpZywgLi4uKTsKKworLyogbGlzdCBvZiBjaGFyKixaWkpTT04qIHBhaXJzLCBlbmQgd2l0aCAsIE5VTEwgKi8KK1paSlNPTiAqenpqc29uX2NyZWF0ZV9vYmplY3QoWlpKU09OX0NPTkZJRyAqY29uZmlnLCAuLi4pOworCitaWkpTT04gKnp6anNvbl9hcnJheV9wcmVwZW5kKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICphcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaWkpTT04gKnZhbCk7CitaWkpTT04gKnp6anNvbl9hcnJheV9hcHBlbmQgKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICphcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaWkpTT04gKnZhbCk7CisKK1paSlNPTiAqenpqc29uX29iamVjdF9wcmVwZW5kKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbGFiZWwsIFpaSlNPTiAqdmFsKTsKK1paSlNPTiAqenpqc29uX29iamVjdF9hcHBlbmQgKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbGFiZWwsIFpaSlNPTiAqdmFsKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsbGliL01ha2VmaWxlIGIvY29tMzIvZ3BsbGliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTMwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvTWFrZWZpbGUKQEAgLTAsMCArMSw0NSBAQAorIworIyBMR1BML0dQTCBjb2RlIGxpYnJhcnkKKyMKKworIyBJbmNsdWRlIGNvbmZpZ3VyYXRpb24gcnVsZXMKK2luY2x1ZGUgJChNQUtFRElSKS9saWIubWsKKworUkVRRkxBR1MgKz0gLUkkKFNSQykvLi4vZ3BsaW5jbHVkZSAtSSQoU1JDKS8uLi9ncGxpbmNsdWRlL3p6anNvbgorCitHUExESVJTIDo9ICQoU1JDKSAkKGFkZHByZWZpeCAkKFNSQykvLGRpc2sgZG1pIHZwZCBhY3BpIHp6anNvbikKK0xJQk9CSlMgOj0gJChzdWJzdCAkKFNSQykvLCwkKGZvcmVhY2ggZGlyLCQoR1BMRElSUyksJChwYXRzdWJzdCAlLmMsJS5vLCQod2lsZGNhcmQgJChkaXIpLyouYykpKSkKKworQklORElSICAgPSAvdXNyL2JpbgorTElCRElSICAgPSAvdXNyL2xpYgorREFUQURJUiAgPSAvdXNyL3NoYXJlCitBVVhESVIgICA9ICQoREFUQURJUikvc3lzbGludXgKK0lOQ0RJUiAgID0gL3Vzci9pbmNsdWRlCitDT00zMkRJUiA9ICQoQVVYRElSKS9jb20zMgorCithbGw6IG1ha2VvdXRwdXRkaXJzIGxpYmdwbC5jMzIKKworbWFrZW91dHB1dGRpcnM6CisJQG1rZGlyIC1wICQoZm9yZWFjaCBiLCBcCisJCSQoYWRkcHJlZml4ICQoT0JKKSwkKHNvcnQgJChkaXIgJChMSUJPQkpTKSkpKSwkKGIpKQorCitsaWJncGwuZWxmIDogJChMSUJPQkpTKQorCSQoTEQpIC1zaGFyZWQgJChMREZMQUdTKSAtc29uYW1lICQocGF0c3Vic3QgJS5lbGYsJS5jMzIsJChARikpIC1vICRAICReCisKK3RpZHkgZGlzdCBjbGVhbjoKKwlmaW5kIC4gXCggLW5hbWUgXCoubyAtbyAtbmFtZSAuXCouZCAtbyAtbmFtZSBcKi50bXAgXCkgLXByaW50MCB8IFwKKwkJeGFyZ3MgLTByIHJtIC1mCisKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICouYzMyCisJcm0gLWYgKn4gXCMqICovKn4gKi9cIyoKKworIyBNaXhpbmcgaW4gdGhlIEdQTCBpbmNsdWRlIGZpbGVzIGlzIHN1Ym9wdGltYWwsIGJ1dCBJJ20gbm90IHN1cmUKKyMgdGhlcmUgaXMgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0LgoraW5zdGFsbDogYWxsCisJbWtkaXIgLW0gNzU1IC1wICQoSU5TVEFMTFJPT1QpJChDT00zMkRJUikKKwlpbnN0YWxsIC1tIDY0NCBsaWJncGwuYzMyICQoSU5TVEFMTFJPT1QpJChDT00zMkRJUikKKwlta2RpciAtcCAkKElOU1RBTExST09UKSQoQ09NMzJESVIpL2luY2x1ZGUvCisJY3AgLXIgJChTUkMpLy4uL2dwbGluY2x1ZGUgJChJTlNUQUxMUk9PVCkkKENPTTMyRElSKS9pbmNsdWRlLworCistaW5jbHVkZSAuKi5kICovLiouZCAqLyovLiouZApkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsbGliL2FjcGkvYWNwaS5jIGIvY29tMzIvZ3BsbGliL2FjcGkvYWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTNmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvYWNwaS9hY3BpLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTEgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgImFjcGkvYWNwaS5oIgorCisvKiBNMVBTIGZsYWdzIGhhdmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgc3RyaW5ncyAqLworY2hhciAqZmxhZ3NfdG9fc3RyaW5nKGNoYXIgKmJ1ZmZlciwgdWludDE2X3QgZmxhZ3MpCit7CisgICAgc3RyY3B5KGJ1ZmZlciwgImRlZmF1bHQiKTsKKyAgICBpZiAoKGZsYWdzICYgUE9MQVJJVFlfQUNUSVZFX0hJR0gpID09IFBPTEFSSVRZX0FDVElWRV9ISUdIKQorCXN0cmNweShidWZmZXIsICJoaWdoIik7CisgICAgZWxzZSBpZiAoKGZsYWdzICYgUE9MQVJJVFlfQUNUSVZFX0xPVykgPT0gUE9MQVJJVFlfQUNUSVZFX0xPVykKKwlzdHJjcHkoYnVmZmVyLCAibG93Iik7CisgICAgaWYgKChmbGFncyAmIFRSSUdHRVJfRURHRSkgPT0gVFJJR0dFUl9FREdFKQorCXN0cm5jYXQoYnVmZmVyLCAiIGVkZ2UiLCA1KTsKKyAgICBlbHNlIGlmICgoZmxhZ3MgJiBUUklHR0VSX0xFVkVMKSA9PSBUUklHR0VSX0xFVkVMKQorCXN0cm5jYXQoYnVmZmVyLCAiIGxldmVsIiwgNik7CisgICAgZWxzZQorCXN0cm5jYXQoYnVmZmVyLCAiIGRlZmF1bHQiLCA4KTsKKworICAgIHJldHVybiBidWZmZXI7Cit9CisKK3ZvaWQgZGJnX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIGluaXRfYWNwaShzX2FjcGkgKiBhY3BpKQoreworICAgIG1lbXNldChhY3BpLCAwLCBzaXplb2Yoc19hY3BpKSk7Cit9CisKK2ludCBwYXJzZV9hY3BpKHNfYWNwaSAqIGFjcGkpCit7CisgICAgaW50IHJldF92YWw7CisgICAgaW5pdF9hY3BpKGFjcGkpOworCisgICAgLyogTGV0J3Mgc2VhY2ggZm9yIFJTRFAgdGFibGUgKi8KKyAgICBpZiAoKHJldF92YWwgPSBzZWFyY2hfcnNkcChhY3BpKSkgIT0gUlNEUF9UQUJMRV9GT1VORCkKKwlyZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIExldCdzIHNlYWNoIGZvciBSU0RUIHRhYmxlCisgICAgICogVGhhdCdzIG5vdCBhIGJpZyBkZWFsIG5vdCBoYXZpbmcgaXQsIFhTRFQgaXMgZmFyIG1vcmUgcmVsZXZhbnQgKi8KKyAgICBwYXJzZV9yc2R0KCZhY3BpLT5yc2R0KTsKKyAgICBpZiAocGFyc2VfeHNkdChhY3BpKSAhPSBYU0RUX1RBQkxFX0ZPVU5EKSB7CisJICAgIERFQlVHX1BSSU5UKCgiWFNEVCBEZXRlY3Rpb24gZmFpbGVkXG4iKSk7CisJICAgIGZvciAoaW50IHRhYmxlPTA7IHRhYmxlIDxhY3BpLT5yc2R0LmVudHJ5X2NvdW50OyB0YWJsZSsrKSB7CisJCXBhcnNlX2hlYWRlcigodWludDY0X3QgKilhY3BpLT5yc2R0LmVudHJ5W3RhYmxlXSxhY3BpKTsKKwkgICAgfQorICAgIH0KKyAgICByZXR1cm4gQUNQSV9GT1VORDsKK30KKwordm9pZCBnZXRfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIodWludDhfdCAqIHEsIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgKiBhZGgpCit7CisgICAgY3Bfc3RyX3N0cnVjdChhZGgtPnNpZ25hdHVyZSk7CisgICAgY3Bfc3RydWN0KCZhZGgtPmxlbmd0aCk7CisgICAgY3Bfc3RydWN0KCZhZGgtPnJldmlzaW9uKTsKKyAgICBjcF9zdHJ1Y3QoJmFkaC0+Y2hlY2tzdW0pOworICAgIGNwX3N0cl9zdHJ1Y3QoYWRoLT5vZW1faWQpOworICAgIGNwX3N0cl9zdHJ1Y3QoYWRoLT5vZW1fdGFibGVfaWQpOworICAgIGNwX3N0cnVjdCgmYWRoLT5vZW1fcmV2aXNpb24pOworICAgIGNwX3N0cl9zdHJ1Y3QoYWRoLT5jcmVhdG9yX2lkKTsKKyAgICBjcF9zdHJ1Y3QoJmFkaC0+Y3JlYXRvcl9yZXZpc2lvbik7CisgICAgREVCVUdfUFJJTlQoKCJhY3BpX2hlYWRlciBhdCAlcCA9ICVzIHwgJXMgfCAlc1xuIiwgcSwgYWRoLT5zaWduYXR1cmUsYWRoLT5vZW1faWQsIGFkaC0+Y3JlYXRvcl9pZCApKTsKK30KKworYm9vbCBwYXJzZV9oZWFkZXIodWludDY0X3QgKmFkZHJlc3MsIHNfYWNwaSAqYWNwaSkgeworCSAgICBzX2FjcGlfZGVzY3JpcHRpb25faGVhZGVyIGFkaDsKKwkgICAgbWVtc2V0KCZhZGgsIDAsIHNpemVvZihhZGgpKTsKKworCSAgICBnZXRfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIoKHVpbnQ4X3QgKilhZGRyZXNzLCAmYWRoKTsKKworCSAgICAvKiBUcnlpbmcgdG8gZGV0ZXJtaW5lIHRoZSBwb2ludGVkIHRhYmxlICovCisJICAgIC8qIExvb2tpbmcgZm9yIEZBRFQgKi8KKwkgICAgaWYgKG1lbWNtcChhZGguc2lnbmF0dXJlLCBGQUNQLCBzaXplb2YoRkFDUCkgLSAxKSA9PSAwKSB7CisJCURFQlVHX1BSSU5UKCgiRkFDUCB0YWJsZSBmb3VuZFxuIikpOworCQlzX2ZhZHQgKmYgPSAmYWNwaS0+ZmFkdDsKKwkJc19mYWNzICpmYSA9ICZhY3BpLT5mYWNzOworCQlzX2RzZHQgKmQgPSAmYWNwaS0+ZHNkdDsKKwkJLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdmFsaWQsIGxldCdzIGZpbGwgaXQgKi8KKwkJZi0+dmFsaWQgPSB0cnVlOworCQlmLT5hZGRyZXNzID0gYWRkcmVzczsKKwkJbWVtY3B5KCZmLT5oZWFkZXIsICZhZGgsIHNpemVvZihhZGgpKTsKKwkJcGFyc2VfZmFkdChmKTsKKworCQkvKiBGQUNTIHdhc24ndCBhbHJlYWR5IGRldGVjdGVkCisJCSAqIEZBRFQgcG9pbnRzIHRvIGl0LCBsZXQncyB0cnkgdG8gZGV0ZWN0IGl0ICovCisJCWlmIChmYS0+dmFsaWQgPT0gZmFsc2UpIHsKKwkJICAgIGZhLT5hZGRyZXNzID0gKHVpbnQ2NF90ICopZi0+eF9maXJtd2FyZV9jdHJsOworCQkgICAgcGFyc2VfZmFjcyhmYSk7CisJCSAgICBpZiAoZmEtPnZhbGlkID09IGZhbHNlKSB7CisJCQkvKiBMZXQncyB0cnkgYWdhaW4gKi8KKwkJCWZhLT5hZGRyZXNzID0gKHVpbnQ2NF90ICopZi0+ZmlybXdhcmVfY3RybDsKKwkJCXBhcnNlX2ZhY3MoZmEpOworCQkgICAgfQorCQl9CisKKwkJLyogRFNEVCB3YXNuJ3QgYWxyZWFkeSBkZXRlY3RlZAorCQkgKiBGQURUIHBvaW50cyB0byBpdCwgbGV0J3MgdHJ5IHRvIGRldGVjdCBpdCAqLworCQlpZiAoZC0+dmFsaWQgPT0gZmFsc2UpIHsKKwkJICAgIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgbmV3X2FkaDsKKwkJICAgIGdldF9hY3BpX2Rlc2NyaXB0aW9uX2hlYWRlcigodWludDhfdCAqKWYtPnhfZHNkdCwKKwkJCQkJCSZuZXdfYWRoKTsKKwkJICAgIGlmIChtZW1jbXAobmV3X2FkaC5zaWduYXR1cmUsIERTRFQsIHNpemVvZihEU0RUKSAtIDEpID09IDApIHsKKwkJCURFQlVHX1BSSU5UKCgiRFNEVCB0YWJsZSBmb3VuZCB2aWEgeF9kc2R0XG4iKSk7CisJCQlkLT52YWxpZCA9IHRydWU7CisJCQlkLT5hZGRyZXNzID0gKHVpbnQ2NF90ICopZi0+eF9kc2R0OworCQkJbWVtY3B5KCZkLT5oZWFkZXIsICZuZXdfYWRoLCBzaXplb2YobmV3X2FkaCkpOworCQkJcGFyc2VfZHNkdChkKTsKKwkJICAgIH0gZWxzZSB7CisJCQkvKiBMZXQncyB0cnkgYWdhaW4gKi8KKwkJCWdldF9hY3BpX2Rlc2NyaXB0aW9uX2hlYWRlcigodWludDhfdCAqKWYtPmRzZHRfYWRkcmVzcywKKwkJCQkJCSAgICAmbmV3X2FkaCk7CisJCQlpZiAobWVtY21wKG5ld19hZGguc2lnbmF0dXJlLCBEU0RULCBzaXplb2YoRFNEVCkgLSAxKSA9PQorCQkJICAgIDApIHsKKwkJCSAgICBERUJVR19QUklOVCgoIkRTRFQgdGFibGUgZm91bmQgdmlhIGRzZHRfYWRkcmVzc1xuIikpOworCQkJICAgIGQtPnZhbGlkID0gdHJ1ZTsKKwkJCSAgICBkLT5hZGRyZXNzID0gKHVpbnQ2NF90ICopZi0+ZHNkdF9hZGRyZXNzOworCQkJICAgIG1lbWNweSgmZC0+aGVhZGVyLCAmbmV3X2FkaCwgc2l6ZW9mKG5ld19hZGgpKTsKKwkJCSAgICBwYXJzZV9kc2R0KGQpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0gLyogTG9va2luZyBmb3IgTUFEVCAqLworCSAgICBlbHNlIGlmIChtZW1jbXAoYWRoLnNpZ25hdHVyZSwgQVBJQywgc2l6ZW9mKEFQSUMpIC0gMSkgPT0gMCkgeworCQlERUJVR19QUklOVCgoIk1BRFQgdGFibGUgZm91bmRcbiIpKTsKKwkJc19tYWR0ICptID0gJmFjcGktPm1hZHQ7CisJCS8qIFRoaXMgc3RydWN0dXJlIGlzIHZhbGlkLCBsZXQncyBmaWxsIGl0ICovCisJCW0tPnZhbGlkID0gdHJ1ZTsKKwkJbS0+YWRkcmVzcyA9YWRkcmVzczsKKwkJbWVtY3B5KCZtLT5oZWFkZXIsICZhZGgsIHNpemVvZihhZGgpKTsKKwkJcGFyc2VfbWFkdChhY3BpKTsKKwkgICAgfSBlbHNlIGlmIChtZW1jbXAoYWRoLnNpZ25hdHVyZSwgRFNEVCwgc2l6ZW9mKERTRFQpIC0gMSkgPT0gMCkgeworCQlERUJVR19QUklOVCgoIkRTRFQgdGFibGUgZm91bmRcbiIpKTsKKwkJc19kc2R0ICpkID0gJmFjcGktPmRzZHQ7CisJCS8qIFRoaXMgc3RydWN0dXJlIGlzIHZhbGlkLCBsZXQncyBmaWxsIGl0ICovCisJCWQtPnZhbGlkID0gdHJ1ZTsKKwkJZC0+YWRkcmVzcyA9IGFkZHJlc3M7CisJCW1lbWNweSgmZC0+aGVhZGVyLCAmYWRoLCBzaXplb2YoYWRoKSk7CisJCXBhcnNlX2RzZHQoZCk7CisJCS8qIFBTRFQgaGF2ZSB0byBiZSBjb25zaWRlcmVkIGFzIFNTRFQuIEludGVsIEFDUEkgU3BlYyBAIDUuMi4xMS4zICovCisJICAgIH0gZWxzZSBpZiAoKG1lbWNtcChhZGguc2lnbmF0dXJlLCBTU0RULCBzaXplb2YoU1NEVCkgLSAxKSA9PSAwKQorCQkgICAgICAgfHwgKG1lbWNtcChhZGguc2lnbmF0dXJlLCBQU0RULCBzaXplb2YoUFNEVCkgLSAxKSA9PSAwKSkgeworCQkKKwkJREVCVUdfUFJJTlQoKCJTU0RUIHRhYmxlIGZvdW5kIHdpdGggJXMgXG4iLGFkaC5zaWduYXR1cmUpKTsKKworCQlpZiAoKGFjcGktPnNzZHRfY291bnQgPj0gTUFYX1NTRFQgLSAxKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKworCQkvKiBXZSBjYW4gaGF2ZSBtYW55IFNTRFQsIHNvIGxldCdzIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCQlpZiAoKGFjcGktPnNzZHRbYWNwaS0+c3NkdF9jb3VudF0gPQorCQkgICAgIG1hbGxvYyhzaXplb2Yoc19zc2R0KSkpID09IE5VTEwpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCXNfc3NkdCAqcyA9IGFjcGktPnNzZHRbYWNwaS0+c3NkdF9jb3VudF07CisKKwkJLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdmFsaWQsIGxldCdzIGZpbGwgaXQgKi8KKwkJcy0+dmFsaWQgPSB0cnVlOworCQlzLT5hZGRyZXNzID0gYWRkcmVzczsKKwkJbWVtY3B5KCZzLT5oZWFkZXIsICZhZGgsIHNpemVvZihhZGgpKTsKKworCQkvKiBTZWFyY2hpbmcgaG93IG11Y2ggZGVmaW5pdGlvbiBibG9ja3Mgd2UgbXVzdCBjb3B5ICovCisJCXVpbnQzMl90IGRlZmluaXRpb25fYmxvY2tfc2l6ZSA9IGFkaC5sZW5ndGggLSBBQ1BJX0hFQURFUl9TSVpFOworCQlpZiAoKHMtPmRlZmluaXRpb25fYmxvY2sgPQorCQkgICAgIG1hbGxvYyhkZWZpbml0aW9uX2Jsb2NrX3NpemUpKSAhPSBOVUxMKSB7CisJCSAgICBtZW1jcHkocy0+ZGVmaW5pdGlvbl9ibG9jaywKKwkJCSAgIChzLT5hZGRyZXNzICsgQUNQSV9IRUFERVJfU0laRSksCisJCQkgICBkZWZpbml0aW9uX2Jsb2NrX3NpemUpOworCQl9CisJCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHNzZHQgd2UgaGF2ZSAqLworCQlhY3BpLT5zc2R0X2NvdW50Kys7CisJICAgIH0gZWxzZSBpZiAobWVtY21wKGFkaC5zaWduYXR1cmUsIFNCU1QsIHNpemVvZihTQlNUKSAtIDEpID09IDApIHsKKwkJREVCVUdfUFJJTlQoKCJTQlNUIHRhYmxlIGZvdW5kXG4iKSk7CisJCXNfc2JzdCAqcyA9ICZhY3BpLT5zYnN0OworCQkvKiBUaGlzIHN0cnVjdHVyZSBpcyB2YWxpZCwgbGV0J3MgZmlsbCBpdCAqLworCQlzLT52YWxpZCA9IHRydWU7CisJCXMtPmFkZHJlc3MgPSBhZGRyZXNzOworCQltZW1jcHkoJnMtPmhlYWRlciwgJmFkaCwgc2l6ZW9mKGFkaCkpOworCQlwYXJzZV9zYnN0KHMpOworCSAgICB9IGVsc2UgaWYgKG1lbWNtcChhZGguc2lnbmF0dXJlLCBFQ0RULCBzaXplb2YoRUNEVCkgLSAxKSA9PSAwKSB7CisJCURFQlVHX1BSSU5UKCgiRUNEVCB0YWJsZSBmb3VuZFxuIikpOworCQlzX2VjZHQgKmUgPSAmYWNwaS0+ZWNkdDsKKwkJLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdmFsaWQsIGxldCdzIGZpbGwgaXQgKi8KKwkJZS0+dmFsaWQgPSB0cnVlOworCQllLT5hZGRyZXNzID0gYWRkcmVzczsKKwkJbWVtY3B5KCZlLT5oZWFkZXIsICZhZGgsIHNpemVvZihhZGgpKTsKKwkJcGFyc2VfZWNkdChlKTsKKwkgICAgfSAgZWxzZSBpZiAobWVtY21wKGFkaC5zaWduYXR1cmUsIEhQRVQsIHNpemVvZihIUEVUKSAtIDEpID09IDApIHsKKwkJREVCVUdfUFJJTlQoKCJIUEVUIHRhYmxlIGZvdW5kXG4iKSk7CisJCXNfaHBldCAqaCA9ICZhY3BpLT5ocGV0OworCQkvKiBUaGlzIHN0cnVjdHVyZSBpcyB2YWxpZCwgbGV0J3MgZmlsbCBpdCAqLworCQloLT52YWxpZCA9IHRydWU7CisJCWgtPmFkZHJlc3MgPSBhZGRyZXNzOworCQltZW1jcHkoJmgtPmhlYWRlciwgJmFkaCwgc2l6ZW9mKGFkaCkpOworCSAgICB9IGVsc2UgaWYgKG1lbWNtcChhZGguc2lnbmF0dXJlLCBUQ1BBLCBzaXplb2YoVENQQSkgLSAxKSA9PSAwKSB7CisJCURFQlVHX1BSSU5UKCgiVENQQSB0YWJsZSBmb3VuZFxuIikpOworCQlzX3RjcGEgKnQgPSAmYWNwaS0+dGNwYTsKKwkJLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdmFsaWQsIGxldCdzIGZpbGwgaXQgKi8KKwkJdC0+dmFsaWQgPSB0cnVlOworCQl0LT5hZGRyZXNzID0gYWRkcmVzczsKKwkJbWVtY3B5KCZ0LT5oZWFkZXIsICZhZGgsIHNpemVvZihhZGgpKTsKKwkgICAgfSBlbHNlIGlmIChtZW1jbXAoYWRoLnNpZ25hdHVyZSwgTUNGRywgc2l6ZW9mKE1DRkcpIC0gMSkgPT0gMCkgeworCQlERUJVR19QUklOVCgoIk1DRkcgdGFibGUgZm91bmRcbiIpKTsKKwkJc19tY2ZnICptID0gJmFjcGktPm1jZmc7CisJCS8qIFRoaXMgc3RydWN0dXJlIGlzIHZhbGlkLCBsZXQncyBmaWxsIGl0ICovCisJCW0tPnZhbGlkID0gdHJ1ZTsKKwkJbS0+YWRkcmVzcyA9IGFkZHJlc3M7CisJCW1lbWNweSgmbS0+aGVhZGVyLCAmYWRoLCBzaXplb2YoYWRoKSk7CisJICAgIH0gZWxzZSBpZiAobWVtY21wKGFkaC5zaWduYXR1cmUsIFNMSUMsIHNpemVvZihTTElDKSAtIDEpID09IDApIHsKKwkJREVCVUdfUFJJTlQoKCJTTElDIHRhYmxlIGZvdW5kXG4iKSk7CisJCXNfc2xpYyAqcyA9ICZhY3BpLT5zbGljOworCQkvKiBUaGlzIHN0cnVjdHVyZSBpcyB2YWxpZCwgbGV0J3MgZmlsbCBpdCAqLworCQlzLT52YWxpZCA9IHRydWU7CisJCXMtPmFkZHJlc3MgPSBhZGRyZXNzOworCQltZW1jcHkoJnMtPmhlYWRlciwgJmFkaCwgc2l6ZW9mKGFkaCkpOworCSAgICB9IGVsc2UgaWYgKG1lbWNtcChhZGguc2lnbmF0dXJlLCBCT09ULCBzaXplb2YoQk9PVCkgLSAxKSA9PSAwKSB7CisJCURFQlVHX1BSSU5UKCgiQk9PVCB0YWJsZSBmb3VuZFxuIikpOworCQlzX2Jvb3QgKmIgPSAmYWNwaS0+Ym9vdDsKKwkJLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdmFsaWQsIGxldCdzIGZpbGwgaXQgKi8KKwkJYi0+dmFsaWQgPSB0cnVlOworCQliLT5hZGRyZXNzID0gYWRkcmVzczsKKwkJbWVtY3B5KCZiLT5oZWFkZXIsICZhZGgsIHNpemVvZihhZGgpKTsKKwkgICAgfQorCSAgICAKKwkgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvYWNwaS9kc2R0LmMgYi9jb20zMi9ncGxsaWIvYWNwaS9kc2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmNDE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9hY3BpL2RzZHQuYwpAQCAtMCwwICsxLDQ4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSAiYWNwaS9hY3BpLmgiCisKK3ZvaWQgcGFyc2VfZHNkdChzX2RzZHQgKiBkKQoreworICAgIHVpbnQ4X3QgKnE7CisgICAgcSA9ICh1aW50OF90ICopZC0+YWRkcmVzczsKKyAgICBxICs9IEFDUElfSEVBREVSX1NJWkU7CisKKyAgICAvKiBTZWFyY2hpbmcgaG93IG11Y2ggZGVmaW5pdGlvbiBibG9ja3Mgd2UgbXVzdCBjb3B5ICovCisgICAgdWludDMyX3QgZGVmaW5pdGlvbl9ibG9ja19zaXplPWQtPmhlYWRlci5sZW5ndGgtQUNQSV9IRUFERVJfU0laRTsKKyAgICBpZiAoKGQtPmRlZmluaXRpb25fYmxvY2s9bWFsbG9jKGRlZmluaXRpb25fYmxvY2tfc2l6ZSkpICE9IE5VTEwpIHsKKwltZW1jcHkoZC0+ZGVmaW5pdGlvbl9ibG9jayxxLGRlZmluaXRpb25fYmxvY2tfc2l6ZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvYWNwaS9lY2R0LmMgYi9jb20zMi9ncGxsaWIvYWNwaS9lY2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkYzEzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9hY3BpL2VjZHQuYwpAQCAtMCwwICsxLDUzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSAiYWNwaS9hY3BpLmgiCisKK3ZvaWQgcGFyc2VfZWNkdChzX2VjZHQgKiBlKQoreworICAgIHVpbnQ4X3QgKnE7CisgICAgcSA9ICh1aW50OF90ICopZS0+YWRkcmVzczsKKyAgICBxICs9IEFDUElfSEVBREVSX1NJWkU7CisKKyAgICAvKiBDb3B5aW5nIHJlbWFpbmluZyBzdHJ1Y3RzICovCisgICAgY3Bfc3RydWN0KCZlLT5lY19jb250cm9sKTsKKyAgICBjcF9zdHJ1Y3QoJmUtPmVjX2RhdGEpOworICAgIGNwX3N0cnVjdCgmZS0+dWlkKTsKKyAgICBjcF9zdHJ1Y3QoJmUtPmdwZV9iaXQpOworCisgICAgLyogU2VhcmNoaW5nIGVjX2lkIHNpemUgd2UgbXVzdCBjb3B5ICovCisgICAgdWludDMyX3QgZWNfaWRfc2l6ZSA9IGUtPmhlYWRlci5sZW5ndGggLSBFQ19JRF9PRkZTRVQ7CisgICAgaWYgKChlLT5lY19pZCA9IG1hbGxvYyhlY19pZF9zaXplKSkgIT0gTlVMTCkgeworCW1lbWNweShlLT5lY19pZCwgKHVpbnQ2NF90ICopIChlLT5hZGRyZXNzICsgRUNfSURfT0ZGU0VUKSwgZWNfaWRfc2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsbGliL2FjcGkvZmFjcy5jIGIvY29tMzIvZ3BsbGliL2FjcGkvZmFjcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjk2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvYWNwaS9mYWNzLmMKQEAgLTAsMCArMSw1MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgImFjcGkvYWNwaS5oIgorCit2b2lkIHBhcnNlX2ZhY3Moc19mYWNzICogZikKK3sKKyAgICB1aW50OF90ICpxOworICAgIHEgPSAodWludDhfdCAqKSBmLT5hZGRyZXNzOworCisgICAgREVCVUdfUFJJTlQoKCJTZWFyY2hpbmcgRkFDUyBhdCAlcFxuIixxKSk7CisgICAgaWYgKG1lbWNtcChxLCBGQUNTLCBzaXplb2YoRkFDUykgLSAxKSA9PSAwKSB7CisJZi0+dmFsaWQgPSB0cnVlOworCWNwX3N0cl9zdHJ1Y3QoZi0+c2lnbmF0dXJlKTsKKwljcF9zdHJ1Y3QoJmYtPmxlbmd0aCk7CisJY3Bfc3RydWN0KCZmLT5oYXJkd2FyZV9zaWduYXR1cmUpOworCWNwX3N0cnVjdCgmZi0+ZmlybXdhcmVfd2FraW5nX3ZlY3Rvcik7CisJY3Bfc3RydWN0KCZmLT5nbG9iYWxfbG9jayk7CisJY3Bfc3RydWN0KCZmLT5mbGFncyk7CisJY3Bfc3RydWN0KCZmLT54X2Zpcm13YXJlX3dha2luZ192ZWN0b3IpOworCWNwX3N0cnVjdCgmZi0+dmVyc2lvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsbGliL2FjcGkvZmFkdC5jIGIvY29tMzIvZ3BsbGliL2FjcGkvZmFkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMjg3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvYWNwaS9mYWR0LmMKQEAgLTAsMCArMSw5OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgImFjcGkvYWNwaS5oIgorCit2b2lkIHBhcnNlX2ZhZHQoc19mYWR0ICogZikKK3sKKyAgICAvKiBMZXQncyBzZWFjaCBmb3IgRkFEVCB0YWJsZSAqLworICAgIHVpbnQ4X3QgKnE7CisKKyAgICAvKiBGaXhpbmcgdGFibGUgbmFtZSAqLworICAgIG1lbWNweShmLT5oZWFkZXIuc2lnbmF0dXJlLEZBRFQsc2l6ZW9mKEZBRFQpKTsKKyAgICAKKyAgICAvKiBDb3B5aW5nIHJlbWFpbmluZyBzdHJ1Y3RzICovCisgICAgcSA9ICh1aW50OF90ICopZi0+YWRkcmVzczsKKyAgICBxICs9IEFDUElfSEVBREVSX1NJWkU7CisgICAgREVCVUdfUFJJTlQoKCItIFBhcnNpbmcgRkFEVCBhdCAlcFxuIixxKSk7CisKKyAgICBjcF9zdHJ1Y3QoJmYtPmZpcm13YXJlX2N0cmwpOworICAgIGNwX3N0cnVjdCgmZi0+ZHNkdF9hZGRyZXNzKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnJlc2VydmVkKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnByZWZlcmVkX3BtX3Byb2ZpbGUpOworICAgIGNwX3N0cnVjdCgmZi0+c2NpX2ludCk7CisgICAgY3Bfc3RydWN0KCZmLT5zbWlfY21kKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPmFjcGlfZW5hYmxlKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPmFjcGlfZGlzYWJsZSk7CisgICAgY3Bfc3RydWN0KCZmLT5zNGJpb3NfcmVxKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnBzdGF0ZV9jbnQpOworICAgIGNwX3N0cnVjdCgmZi0+cG0xYV9ldnRfYmxrKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnBtMWJfZXZ0X2Jsayk7CisgICAgY3Bfc3RydWN0KCZmLT5wbTFhX2NudF9ibGspOworICAgIGNwX3N0cnVjdCgmZi0+cG0xYl9jbnRfYmxrKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnBtMl9jbnRfYmxrKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnBtX3Rtcl9ibGspOworICAgIGNwX3N0cnVjdCgmZi0+Z3BlMF9ibGspOworICAgIGNwX3N0cnVjdCgmZi0+Z3BlMV9ibGspOworICAgIGNwX3N0cnVjdCgmZi0+cG0xX2V2dF9sZW4pOworICAgIGNwX3N0cnVjdCgmZi0+cG0xX2NudF9sZW4pOworICAgIGNwX3N0cnVjdCgmZi0+cG0yX2NudF9sZW4pOworICAgIGNwX3N0cnVjdCgmZi0+cG1fdG1yX2xlbik7CisgICAgY3Bfc3RydWN0KCZmLT5ncGUwX2Jsa19sZW4pOworICAgIGNwX3N0cnVjdCgmZi0+Z3BlMV9ibGtfbGVuKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPmdwZTFfYmFzZSk7CisgICAgY3Bfc3RydWN0KCZmLT5jc3RfY250KTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnBfbHZsMl9sYXQpOworICAgIGNwX3N0cnVjdCgmZi0+cF9sdmwzX2xhdCk7CisgICAgY3Bfc3RydWN0KCZmLT5mbHVzaF9zaXplKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPmZsdXNoX3N0cmlkZSk7CisgICAgY3Bfc3RydWN0KCZmLT5kdXR5X29mZnNldCk7CisgICAgY3Bfc3RydWN0KCZmLT5kdXR5X3dpZHRoKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPmRheV9hbGFybSk7CisgICAgY3Bfc3RydWN0KCZmLT5tb25fYWxhcm0pOworICAgIGNwX3N0cnVjdCgmZi0+Y2VudHVyeSk7CisgICAgY3Bfc3RydWN0KCZmLT5pYXBjX2Jvb3RfYXJjaCk7CisgICAgY3Bfc3RydWN0KCZmLT5yZXNlcnZlZF8yKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPmZsYWdzKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnJlc2V0X3JlZyk7CisgICAgY3Bfc3RydWN0KCZmLT5yZXNldF92YWx1ZSk7CisgICAgY3Bfc3RydWN0KGYtPnJlc2VydmVkXzMpOworICAgIGNwX3N0cnVjdCgmZi0+eF9maXJtd2FyZV9jdHJsKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnhfZHNkdCk7CisgICAgY3Bfc3RydWN0KCZmLT54X3BtMWFfZXZ0X2Jsayk7CisgICAgY3Bfc3RydWN0KCZmLT54X3BtMWJfZXZ0X2Jsayk7CisgICAgY3Bfc3RydWN0KCZmLT54X3BtMWFfY250X2Jsayk7CisgICAgY3Bfc3RydWN0KCZmLT54X3BtMWJfY250X2Jsayk7CisgICAgY3Bfc3RydWN0KCZmLT54X3BtMl9jbnRfYmxrKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnhfcG1fdG1yX2Jsayk7CisgICAgY3Bfc3RydWN0KCZmLT54X2dwZTBfYmxrKTsKKyAgICBjcF9zdHJ1Y3QoJmYtPnhfZ3BlMV9ibGspOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsbGliL2FjcGkvbWFkdC5jIGIvY29tMzIvZ3BsbGliL2FjcGkvbWFkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGM5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvYWNwaS9tYWR0LmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTEgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJhY3BpL2FjcGkuaCIKKworLyogUGFyc2UgdGhlIGFwaWMgc3RydWN0dXJlcyAqLworc3RhdGljIHVpbnQ4X3QgKmFkZF9hcGljX3N0cnVjdHVyZShzX2FjcGkgKiBhY3BpLCB1aW50OF90ICogcSkKK3sKKyAgICB1aW50OF90IHR5cGUgPSAqcTsKKyAgICBxKys7CisgICAgdWludDhfdCBsZW5ndGggPSAqcTsKKyAgICBxKys7CisgICAgc19wcm9jZXNzb3JfbG9jYWxfYXBpYyAqc2xhOworICAgIHNfaW9fYXBpYyAqc2lvOworICAgIHNfaW50ZXJydXB0X3NvdXJjZV9vdmVycmlkZSAqc2lzbzsKKyAgICBzX25taSAqc25taTsKKyAgICBzX2xvY2FsX2FwaWNfbm1pICpzbGFuOworICAgIHNfbG9jYWxfYXBpY19hZGRyZXNzX292ZXJyaWRlICpzbGFhbzsKKyAgICBzX2lvX3NhcGljICpzaW9zYXBpYzsKKyAgICBzX2xvY2FsX3NhcGljICpzbHM7CisgICAgc19tYWR0ICptYWR0ID0gJmFjcGktPm1hZHQ7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFBST0NFU1NPUl9MT0NBTF9BUElDOgorCXNsYSA9ICZtYWR0LT5wcm9jZXNzb3JfbG9jYWxfYXBpY1ttYWR0LT5wcm9jZXNzb3JfbG9jYWxfYXBpY19jb3VudF07CisJc2xhLT50eXBlID0gdHlwZTsKKwlzbGEtPmxlbmd0aCA9IGxlbmd0aDsKKwljcF9zdHJ1Y3QoJnNsYS0+YWNwaV9pZCk7CisJY3Bfc3RydWN0KCZzbGEtPmFwaWNfaWQpOworCWNwX3N0cnVjdCgmc2xhLT5mbGFncyk7CisJbWFkdC0+cHJvY2Vzc29yX2xvY2FsX2FwaWNfY291bnQrKzsKKwlicmVhazsKKyAgICBjYXNlIElPX0FQSUM6CisJc2lvID0gJm1hZHQtPmlvX2FwaWNbbWFkdC0+aW9fYXBpY19jb3VudF07CisJc2lvLT50eXBlID0gdHlwZTsKKwlzaW8tPmxlbmd0aCA9IGxlbmd0aDsKKwljcF9zdHJ1Y3QoJnNpby0+aW9fYXBpY19pZCk7CisJY3Bfc3RydWN0KCZzaW8tPnJlc2VydmVkKTsKKwljcF9zdHJ1Y3QoJnNpby0+aW9fYXBpY19hZGRyZXNzKTsKKwljcF9zdHJ1Y3QoJnNpby0+Z2xvYmFsX3N5c3RlbV9pbnRlcnJ1cHRfYmFzZSk7CisJbWFkdC0+aW9fYXBpY19jb3VudCsrOworCWJyZWFrOworICAgIGNhc2UgSU5URVJSVVBUX1NPVVJDRV9PVkVSUklERToKKwlzaXNvID0KKwkgICAgJm1hZHQtPmludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGVbbWFkdC0+CisJCQkJCSAgICAgaW50ZXJydXB0X3NvdXJjZV9vdmVycmlkZV9jb3VudF07CisJc2lzby0+dHlwZSA9IHR5cGU7CisJc2lzby0+bGVuZ3RoID0gbGVuZ3RoOworCXNpc28tPmJ1cyA9ICpxOworCXErKzsKKwlzaXNvLT5zb3VyY2UgPSAqcTsKKwlxKys7CisJY3Bfc3RydWN0KCZzaXNvLT5nbG9iYWxfc3lzdGVtX2ludGVycnVwdCk7CisJY3Bfc3RydWN0KCZzaXNvLT5mbGFncyk7CisJbWFkdC0+aW50ZXJydXB0X3NvdXJjZV9vdmVycmlkZV9jb3VudCsrOworCWJyZWFrOworICAgIGNhc2UgTk1JOgorCXNubWkgPSAmbWFkdC0+bm1pW21hZHQtPm5taV9jb3VudF07CisJc25taS0+dHlwZSA9IHR5cGU7CisJc25taS0+bGVuZ3RoID0gbGVuZ3RoOworCWNwX3N0cnVjdCgmc25taS0+ZmxhZ3MpOworCWNwX3N0cnVjdCgmc25taS0+Z2xvYmFsX3N5c3RlbV9pbnRlcnJ1cHQpOworCW1hZHQtPm5taV9jb3VudCsrOworCWJyZWFrOworICAgIGNhc2UgTE9DQUxfQVBJQ19OTUlfU1RSVUNUVVJFOgorCXNsYW4gPSAmbWFkdC0+bG9jYWxfYXBpY19ubWlbbWFkdC0+bG9jYWxfYXBpY19ubWlfY291bnRdOworCXNsYW4tPnR5cGUgPSB0eXBlOworCXNsYW4tPmxlbmd0aCA9IGxlbmd0aDsKKwljcF9zdHJ1Y3QoJnNsYW4tPmFjcGlfcHJvY2Vzc29yX2lkKTsKKwljcF9zdHJ1Y3QoJnNsYW4tPmZsYWdzKTsKKwljcF9zdHJ1Y3QoJnNsYW4tPmxvY2FsX2FwaWNfbGludCk7CisJbWFkdC0+bG9jYWxfYXBpY19ubWlfY291bnQrKzsKKwlicmVhazsKKyAgICBjYXNlIExPQ0FMX0FQSUNfQUREUkVTU19PVkVSUklERV9TVFJVQ1RVUkU6CisJc2xhYW8gPQorCSAgICAmbWFkdC0+bG9jYWxfYXBpY19hZGRyZXNzX292ZXJyaWRlW21hZHQtPgorCQkJCQkgICAgICAgbG9jYWxfYXBpY19hZGRyZXNzX292ZXJyaWRlX2NvdW50XTsKKwlzbGFhby0+dHlwZSA9IHR5cGU7CisJc2xhYW8tPmxlbmd0aCA9IGxlbmd0aDsKKwljcF9zdHJ1Y3QoJnNsYWFvLT5yZXNlcnZlZCk7CisJY3Bfc3RydWN0KCZzbGFhby0+bG9jYWxfYXBpY19hZGRyZXNzKTsKKwltYWR0LT5sb2NhbF9hcGljX2FkZHJlc3Nfb3ZlcnJpZGVfY291bnQrKzsKKwlicmVhazsKKyAgICBjYXNlIElPX1NBUElDOgorCXNpb3NhcGljID0gJm1hZHQtPmlvX3NhcGljW21hZHQtPmlvX3NhcGljX2NvdW50XTsKKwlzaW9zYXBpYy0+dHlwZSA9IHR5cGU7CisJc2lvc2FwaWMtPmxlbmd0aCA9IGxlbmd0aDsKKwljcF9zdHJ1Y3QoJnNpb3NhcGljLT5pb19hcGljX2lkKTsKKwljcF9zdHJ1Y3QoJnNpb3NhcGljLT5yZXNlcnZlZCk7CisJY3Bfc3RydWN0KCZzaW9zYXBpYy0+Z2xvYmFsX3N5c3RlbV9pbnRlcnJ1cHRfYmFzZSk7CisJY3Bfc3RydWN0KCZzaW9zYXBpYy0+aW9fc2FwaWNfYWRkcmVzcyk7CisJbWFkdC0+aW9fc2FwaWNfY291bnQrKzsKKwlicmVhazsKKyAgICBjYXNlIExPQ0FMX1NBUElDOgorCXNscyA9ICZtYWR0LT5sb2NhbF9zYXBpY1ttYWR0LT5sb2NhbF9zYXBpY19jb3VudF07CisJc2xzLT50eXBlID0gdHlwZTsKKwlzbHMtPmxlbmd0aCA9IGxlbmd0aDsKKwljcF9zdHJ1Y3QoJnNscy0+YWNwaV9wcm9jZXNzb3JfaWQpOworCWNwX3N0cnVjdCgmc2xzLT5sb2NhbF9zYXBpY19pZCk7CisJY3Bfc3RydWN0KCZzbHMtPmxvY2FsX3NhcGljX2VpZCk7CisJY3Bfc3RydWN0KHNscy0+cmVzZXJ2ZWQpOworCWNwX3N0cnVjdCgmc2xzLT5mbGFncyk7CisJY3Bfc3RydWN0KCZzbHMtPmFjcGlfcHJvY2Vzc29yX3VpZF92YWx1ZSk7CisJaWYgKChzbHMtPmFjcGlfcHJvY2Vzc29yX3VpZF9zdHJpbmcgPQorCSAgICAgbWFsbG9jKGxlbmd0aCAtIEFDUElfUFJPQ0VTU09SX1VJRF9TVFJJTkdfT0ZGU0VUKSkgIT0gTlVMTCkgeworCSAgICBtZW1jcHkoc2xzLT5hY3BpX3Byb2Nlc3Nvcl91aWRfc3RyaW5nLCBxLAorCQkgICBsZW5ndGggLSBBQ1BJX1BST0NFU1NPUl9VSURfU1RSSU5HX09GRlNFVCk7CisJICAgIHEgKz0gbGVuZ3RoIC0gQUNQSV9QUk9DRVNTT1JfVUlEX1NUUklOR19PRkZTRVQ7CisJfQorCW1hZHQtPmxvY2FsX3NhcGljX2NvdW50Kys7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlwcmludGYoIlVua293biBBUElDIHN0cnVjdHVyZSB0eXBlICV1LCBzaXplPSV1IFxuIiwgdHlwZSwgbGVuZ3RoKTsKKwlxICs9IGxlbmd0aCAtIDI7CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiBxOworfQorCit2b2lkIHBhcnNlX21hZHQoc19hY3BpICogYWNwaSkKK3sKKyAgICAvKiBMZXQncyBzZWFjaCBmb3IgRkFEVCB0YWJsZSAqLworICAgIHVpbnQ4X3QgKnEsICptYXhfYWRkcmVzczsKKyAgICBzX21hZHQgKm0gPSAmYWNwaS0+bWFkdDsKKworICAgIC8qIEZpeGluZyB0YWJsZSBuYW1lICovCisgICAgbWVtY3B5KG0tPmhlYWRlci5zaWduYXR1cmUsIEFQSUMsIHNpemVvZihBUElDKSk7CisKKyAgICAvKiBDb3B5aW5nIHJlbWFpbmluZyBzdHJ1Y3RzICovCisgICAgcSA9ICh1aW50OF90ICopbS0+YWRkcmVzczsKKyAgICBxICs9IEFDUElfSEVBREVSX1NJWkU7CisgICAgCisgICAgbWF4X2FkZHJlc3MgPSAodWludDhfdCAqKW0tPmFkZHJlc3M7CisgICAgbWF4X2FkZHJlc3MgKz0gbS0+aGVhZGVyLmxlbmd0aDsKKworICAgIGNwX3N0cnVjdCgmbS0+bG9jYWxfYXBpY19hZGRyZXNzKTsKKyAgICBjcF9zdHJ1Y3QoJm0tPmZsYWdzKTsKKworICAgIHdoaWxlIChxIDwgIG1heF9hZGRyZXNzKSB7CisJcSA9IGFkZF9hcGljX3N0cnVjdHVyZShhY3BpLCBxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvYWNwaS9yc2RwLmMgYi9jb20zMi9ncGxsaWIvYWNwaS9yc2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlYTU2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9hY3BpL3JzZHAuYwpAQCAtMCwwICsxLDgyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSAiYWNwaS9hY3BpLmgiCisKK2ludCBzZWFyY2hfcnNkcChzX2FjcGkgKiBhY3BpKQoreworICAgIC8qIExldCdzIHNlYWNoIGZvciBSU0RUIHRhYmxlICovCisgICAgdWludDhfdCAqcTsKKworICAgIC8qIExldCdzIHN0YXJ0IGZvciB0aGUgYmFzZSBhZGRyZXNzICovCisgICAgZm9yIChxID0gKHVpbnQ4X3QgKilSU0RQX01JTl9BRERSRVNTOyBxIDwgKHVpbnQ4X3QgKilSU0RQX01BWF9BRERSRVNTOyBxKz0xNiApIHsKKwkvKiBTZWFyY2hpbmcgZm9yIFJTRFAgd2l0aCAiUlNEIFBUUiIgc2lnbmF0dXJlICovCisJaWYgKG1lbWNtcChxLCBSU0RQLCBzaXplb2YoUlNEUCktMSkgPT0gMCkgeworCSAgICBzX3JzZHAgKnIgPSAmYWNwaS0+cnNkcDsKKwkgICAgci0+dmFsaWQgPSB0cnVlOworCSAgICByLT5hZGRyZXNzID0gcTsKKwkgICAgY3Bfc3RyX3N0cnVjdChyLT5zaWduYXR1cmUpOworCSAgICBjcF9zdHJ1Y3QoJnItPmNoZWNrc3VtKTsKKwkgICAgY3Bfc3RyX3N0cnVjdChyLT5vZW1faWQpOworCSAgICBjcF9zdHJ1Y3QoJnItPnJldmlzaW9uKTsKKwkgICAgY3Bfc3RydWN0KCZyLT5yc2R0X2FkZHJlc3MpOworCSAgICBjcF9zdHJ1Y3QoJnItPmxlbmd0aCk7CisJICAgIGNwX3N0cnVjdCgmci0+eHNkdF9hZGRyZXNzKTsKKwkgICAgY3Bfc3RydWN0KCZyLT5leHRlbmRlZF9jaGVja3N1bSk7CisJICAgIHEgKz0gMzsJCS8qIHJlc2VydmVkIGZpZWxkICovCisJICAgIGFjcGktPnJzZHQuYWRkcmVzcyA9IHItPnJzZHRfYWRkcmVzczsKKwkgICAgYWNwaS0+eHNkdC5hZGRyZXNzID0gci0+eHNkdF9hZGRyZXNzOworCSAgICBERUJVR19QUklOVCgoIlJTRFQgc2hvdWxkIGJlIGF0ICVwXG4iLHItPnJzZHRfYWRkcmVzcykpOworCSAgICBERUJVR19QUklOVCgoIlhTRFQgc2hvdWxkIGJlIGF0ICVwXG4iLHItPnhzZHRfYWRkcmVzcykpOworCSAgICByZXR1cm4gUlNEUF9UQUJMRV9GT1VORDsKKwl9CisgICAgfQorICAgIHJldHVybiAtUlNEUF9UQUJMRV9GT1VORDsKK30KKwordm9pZCBwcmludF9yc2RwKHNfYWNwaSAqIGFjcGkpCit7CisgICAgc19yc2RwICpyID0gJmFjcGktPnJzZHA7CisKKyAgICBpZiAoIXItPnZhbGlkKQorCXJldHVybjsKKyAgICBwcmludGYoIlJTRFAgVGFibGUgQCAweCVwXG4iLCByLT5hZGRyZXNzKTsKKyAgICBwcmludGYoIiBzaWduYXR1cmUgICAgICAgICA6ICVzXG4iLCByLT5zaWduYXR1cmUpOworICAgIHByaW50ZigiIGNoZWNrc3VtICAgICAgICAgIDogJXVcbiIsIHItPmNoZWNrc3VtKTsKKyAgICBwcmludGYoIiBvZW0gaWQgICAgICAgICAgICA6ICVzXG4iLCByLT5vZW1faWQpOworICAgIHByaW50ZigiIHJldmlzaW9uICAgICAgICAgIDogJXVcbiIsIHItPnJldmlzaW9uKTsKKyAgICBwcmludGYoIiBSRFNUIGFkZHJlc3MgICAgICA6ICVwXG4iLCByLT5yc2R0X2FkZHJlc3MpOworICAgIHByaW50ZigiIGxlbmd0aCAgICAgICAgICAgIDogJXVcbiIsIHItPmxlbmd0aCk7CisgICAgcHJpbnRmKCIgWFNEVCBhZGRyZXNzICAgICAgOiAlcFxuIiwgci0+eHNkdF9hZGRyZXNzKTsKKyAgICBwcmludGYoIiBleHRlbmRlZCBjaGVja3N1bSA6ICV1XG4iLCByLT5leHRlbmRlZF9jaGVja3N1bSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvYWNwaS9yc2R0LmMgYi9jb20zMi9ncGxsaWIvYWNwaS9yc2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1MjI1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9hY3BpL3JzZHQuYwpAQCAtMCwwICsxLDcyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSAiYWNwaS9hY3BpLmgiCisKK2ludCBwYXJzZV9yc2R0KHNfcnNkdCAqcikKK3sKKyAgICAvKiBMZXQncyBzZWFjaCBmb3IgUlNEVCB0YWJsZSAqLworICAgIHVpbnQ4X3QgKnE7CisKKyAgICAvKiBMZXQncyBzdGFydCBmb3IgdGhlIGJhc2UgYWRkcmVzcyAqLworICAgIHEgPSByLT5hZGRyZXNzOworCisgICAgREVCVUdfUFJJTlQoKCJTZWFyY2hpbmcgZm9yIFJTRFQgYXQgJXBcbiIscSkpOworICAgIC8qIFNlYXJjaGluZyBmb3IgTUFEVCB3aXRoIEFQSUMgc2lnbmF0dXJlICovCisgICAgaWYgKG1lbWNtcChxLCBSU0RULCBzaXplb2YoUlNEVCktMSkgPT0gMCkgeworLy8gICAgICAgIERFQlVHX1BSSU5UKCgiUlNEVCA6ICVjICVjICVjICVjXG4iLHFbMF0sIHFbMV0sIHFbMl0sIHFbM10pKTsKKwlyLT52YWxpZCA9IHRydWU7CisJREVCVUdfUFJJTlQoKCJCZWZvcmUgXG4iKSk7CisJZ2V0X2FjcGlfZGVzY3JpcHRpb25faGVhZGVyKHEsICZyLT5oZWFkZXIpOworCURFQlVHX1BSSU5UKCgiUlNEVCB0YWJsZSBhdCAlcCBmb3VuZCB3aXRoICVkIGJ5dGVzIGxvbmcgd2l0aCAlZCBpdGVtc1xuIixyLT5hZGRyZXNzLCByLT5oZWFkZXIubGVuZ3RoLChyLT5oZWFkZXIubGVuZ3RoLUFDUElfSEVBREVSX1NJWkUpLzQpKTsKKworCXVpbnQzMl90ICpzdGFydCA9ICh1aW50MzJfdCAqKXItPmFkZHJlc3M7CisJc3RhcnQgKz0gKEFDUElfSEVBREVSX1NJWkUgLyA0KTsKKwl1aW50MzJfdCAqbWF4ID0gKHVpbnQzMl90ICopci0+YWRkcmVzczsKKwltYXggKz0gKHItPmhlYWRlci5sZW5ndGggLyA0KTsKKwlERUJVR19QUklOVCgoIlNlYXJjaGluZyBzdGFydGluZyBhdCAlcCB0aWxsICVwXG4iLHN0YXJ0LG1heCkpOworCXVpbnQzMl90ICpwOworCWZvciAocCA9IHN0YXJ0IDsgcCA8IG1heDsgcCsrKSB7CisgICAgICAgICAgICAvKiBMZXQncyBncmFiIHRoZSBwb2ludGVkIHRhYmxlIGhlYWRlciAqLworICAgICAgICAgICAgY2hhciBhZGRyZXNzWzE2XSA9IHsgMCB9OworICAgICAgICAgICAgc3ByaW50ZihhZGRyZXNzLCAiJXgiLCAqcCk7CisgICAgICAgICAgICB1aW50MzJfdCAqcG9pbnRlZF9hZGRyZXNzID0gKHVpbnQzMl90ICopc3RydG91bChhZGRyZXNzLCBOVUxMLCAxNik7CisJICAgIHItPmVudHJ5W3ItPmVudHJ5X2NvdW50XSA9ICh1aW50OF90ICopcG9pbnRlZF9hZGRyZXNzOworCSAgICBERUJVR19QUklOVCgoIiVkIDogJXBcbiIsci0+ZW50cnlfY291bnQsIHItPmVudHJ5W3ItPmVudHJ5X2NvdW50XSkpOworCSAgICByLT5lbnRyeV9jb3VudCsrOworCX0KKwlyZXR1cm4gUlNEVF9UQUJMRV9GT1VORDsKKyAgICB9CisKKyAgICByZXR1cm4gLVJTRFRfVEFCTEVfRk9VTkQ7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvYWNwaS9zYnN0LmMgYi9jb20zMi9ncGxsaWIvYWNwaS9zYnN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmMTEyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9hY3BpL3Nic3QuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSAiYWNwaS9hY3BpLmgiCisKK3ZvaWQgcGFyc2Vfc2JzdChzX3Nic3QgKiBzKQoreworICAgIHVpbnQ4X3QgKnE7CisgICAgcSA9ICh1aW50OF90ICopcy0+YWRkcmVzczsKKyAgICBxICs9IEFDUElfSEVBREVSX1NJWkU7CisKKyAgICAvKiBDb3B5aW5nIHJlbWFpbmluZyBzdHJ1Y3RzICovCisgICAgY3Bfc3RydWN0KCZzLT53YXJuaW5nX2VuZXJneV9sZXZlbCk7CisgICAgY3Bfc3RydWN0KCZzLT5sb3dfZW5lcmd5X2xldmVsKTsKKyAgICBjcF9zdHJ1Y3QoJnMtPmNyaXRpY2FsX2VuZXJneV9sZXZlbCk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvYWNwaS94c2R0LmMgYi9jb20zMi9ncGxsaWIvYWNwaS94c2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4YWJjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9hY3BpL3hzZHQuYwpAQCAtMCwwICsxLDc3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJhY3BpL2FjcGkuaCIKKworaW50IHBhcnNlX3hzZHQoc19hY3BpICogYWNwaSkKK3sKKyAgICAvKiBMZXQncyBzZWFjaCBmb3IgWFNEVCB0YWJsZSAqLworICAgIHVpbnQ4X3QgKnE7CisKKyAgICAvKiBMZXQncyBzdGFydCBmb3IgdGhlIGJhc2UgYWRkcmVzcyAqLworICAgIHEgPSBhY3BpLT54c2R0LmFkZHJlc3M7CisKKyAgICAvKiBJZiBhZGRyZXNzIGlzIG51bGwgcmV0dXJuIGFuIGVycm9yICovCisgICAgaWYgKHEgPT0gMCApIHsKKwlERUJVR19QUklOVCgoIlhTRFQgaXMgbnVsbCwgZXhpdGluZ1xuIikpOworICAgIAlyZXR1cm4gLVhTRFRfVEFCTEVfRk9VTkQ7CisgICAgfQorCisgICAgREVCVUdfUFJJTlQoKCJTZWFyY2hpbmcgWFNEVCBhdCAlcCIscSkpOworICAgIC8qIFNlYXJjaGluZyBmb3IgTUFEVCB3aXRoIEFQSUMgc2lnbmF0dXJlICovCisgICAgaWYgKG1lbWNtcChxLCBYU0RULCBzaXplb2YoWFNEVCkgLSAxKSA9PSAwKSB7CisJc194c2R0ICp4ID0gJmFjcGktPnhzZHQ7CisJeC0+dmFsaWQgPSB0cnVlOworCWdldF9hY3BpX2Rlc2NyaXB0aW9uX2hlYWRlcihxLCAmeC0+aGVhZGVyKTsKKwlERUJVR19QUklOVCgoIlhTRFQgdGFibGUgZm91bmQgYXQgJXAgOiBsZW5ndGg9JWRcbiIseC0+YWRkcmVzcyx4LT5oZWFkZXIubGVuZ3RoKSk7CisJREVCVUdfUFJJTlQoKCJFeHBlY3RlZCBUYWJsZXMgPSAlZFxuIiwoeC0+aGVhZGVyLmxlbmd0aC1BQ1BJX0hFQURFUl9TSVpFKS84KSk7CisKKwkvKiBXZSBub3cgaGF2ZSBhIHNldCBvZiBwb2ludGVycyB0byBzb21lIHRhYmxlcyAqLworCXVpbnQ2NF90ICpwID0gTlVMTDsKKwlmb3IgKHAgPSAoKHVpbnQ2NF90ICopKHgtPmFkZHJlc3MgKyBBQ1BJX0hFQURFUl9TSVpFKSk7CisJICAgICBwIDwgKCh1aW50NjRfdCAqKSh4LT5hZGRyZXNzICsgeC0+aGVhZGVyLmxlbmd0aCkpOyBwKyspIHsKKwkgICAgREVCVUdfUFJJTlQoKCIgTG9va2luZyBmb3IgSEVBREVSIGF0ICVwID0gJXhcbiIscCwqcCkpOworCisJICAgIC8qIExldCdzIGdyYWIgdGhlIHBvaW50ZWQgdGFibGUgaGVhZGVyICovCisJICAgIGNoYXIgYWRkcmVzc1sxNl0gPSB7IDAgfTsKKwkgICAgc3ByaW50ZihhZGRyZXNzLCAiJWxseCIsICpwKTsKKwkgICAgdWludDY0X3QgKnBvaW50ZWRfYWRkcmVzcyA9ICh1aW50NjRfdCAqKXN0cnRvdWwoYWRkcmVzcywgTlVMTCwgMTYpOworCisJICAgIHgtPmVudHJ5W3gtPmVudHJ5X2NvdW50XSA9IHBvaW50ZWRfYWRkcmVzczsKKwkgICAgaWYgKHBhcnNlX2hlYWRlcihwb2ludGVkX2FkZHJlc3MsIGFjcGkpKSB7CisJCXgtPmVudHJ5X2NvdW50Kys7CisJICAgIH0KKwl9CisJcmV0dXJuIFhTRFRfVEFCTEVfRk9VTkQ7CisgICAgfQorICAgIHJldHVybiAtWFNEVF9UQUJMRV9GT1VORDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi9jcHVpZC5jIGIvY29tMzIvZ3BsbGliL2NwdWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiZDBiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9jcHVpZC5jCkBAIC0wLDAgKzEsNjE1IEBACisvKgorICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIHRha2VuIGZyb20gdGhlIExpbnV4IGtlcm5lbCwKKyAqIENvcHlyaWdodCAxOTkxLTIwMDkgTGludXMgVG9ydmFsZHMgYW5kIGNvbnRyaWJ1dG9ycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjcHVpZC5oIgorCitjb25zdCBjaGFyICpjcHVfZmxhZ3NfbmFtZXNbXSA9IHsKKyAgICBDUFVfRkxBR1MoU1RSVUNUX01FTUJFUl9OQU1FUykKK307CisKK3NpemVfdCBjcHVfZmxhZ3Nfb2Zmc2V0W10gPSB7CisgICAgQ1BVX0ZMQUdTKFNUUlVDVFVSRV9NRU1CRVJfT0ZGU0VUUykKK307CisKK3NpemVfdCBjcHVfZmxhZ3NfY291bnQgPSBzaXplb2YgY3B1X2ZsYWdzX25hbWVzIC8gc2l6ZW9mICpjcHVfZmxhZ3NfbmFtZXM7CisKK3N0cnVjdCBjcHVfZGV2ICpjcHVfZGV2c1tYODZfVkVORE9SX05VTV0gPSB7IH07CisKK2Jvb2wgZ2V0X2NwdV9mbGFnX3ZhbHVlX2Zyb21fbmFtZShzX2NwdSAqY3B1LCBjb25zdCBjaGFyICogZmxhZ19uYW1lKSB7CisgICAgc2l6ZV90IGk7CisgICAgYm9vbCBjcHVfZmxhZ19wcmVzZW50PWZhbHNlLCAqZmxhZ192YWx1ZSA9ICZjcHVfZmxhZ19wcmVzZW50OworCisgICAgZm9yIChpID0gMDsgaSA8IGNwdV9mbGFnc19jb3VudDsgaSsrKSB7CisJaWYgKHN0cmNtcChjcHVfZmxhZ3NfbmFtZXNbaV0sZmxhZ19uYW1lKSA9PSAwKSB7CisgICAgICAgIAlmbGFnX3ZhbHVlID0gKGJvb2wgKikoKGNoYXIgKikmY3B1LT5mbGFncyArIGNwdV9mbGFnc19vZmZzZXRbaV0pOworCX0KKyAgICB9CisgICAgcmV0dXJuICpmbGFnX3ZhbHVlOworfQorCisKKy8qCisqIENQVUlEIGZ1bmN0aW9ucyByZXR1cm5pbmcgYSBzaW5nbGUgZGF0dW0KKyovCisKKy8qIFByb2JlIGZvciB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyBpbnQgaGF2ZV9jcHVpZF9wKHZvaWQpCit7CisgICAgcmV0dXJuIGNwdV9oYXNfZWZsYWcoWDg2X0VGTEFHU19JRCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBhbWRfY3B1X2RldiA9IHsKKyAgICAuY192ZW5kb3IgPSAiQU1EIiwKKyAgICAuY19pZGVudCA9IHsiQXV0aGVudGljQU1EIn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBpbnRlbF9jcHVfZGV2ID0geworICAgIC5jX3ZlbmRvciA9ICJJbnRlbCIsCisgICAgLmNfaWRlbnQgPSB7IkdlbnVpbmVJbnRlbCJ9Cit9OworCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgY3lyaXhfY3B1X2RldiA9IHsKKyAgICAuY192ZW5kb3IgPSAiQ3lyaXgiLAorICAgIC5jX2lkZW50ID0geyJDeXJpeEluc3RlYWQifQorfTsKKworc3RhdGljIHN0cnVjdCBjcHVfZGV2IHVtY19jcHVfZGV2ID0geworICAgIC5jX3ZlbmRvciA9ICJVTUMiLAorICAgIC5jX2lkZW50ID0geyJVTUMgVU1DIFVNQyJ9CisKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuZXhnZW5fY3B1X2RldiA9IHsKKyAgICAuY192ZW5kb3IgPSAiTmV4Z2VuIiwKKyAgICAuY19pZGVudCA9IHsiTmV4R2VuRHJpdmVuIn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBjZW50YXVyX2NwdV9kZXYgPSB7CisgICAgLmNfdmVuZG9yID0gIkNlbnRhdXIiLAorICAgIC5jX2lkZW50ID0geyJDZW50YXVySGF1bHMifQorfTsKKworc3RhdGljIHN0cnVjdCBjcHVfZGV2IHJpc2VfY3B1X2RldiA9IHsKKyAgICAuY192ZW5kb3IgPSAiUmlzZSIsCisgICAgLmNfaWRlbnQgPSB7IlJpc2VSaXNlUmlzZSJ9Cit9OworCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgdHJhbnNtZXRhX2NwdV9kZXYgPSB7CisgICAgLmNfdmVuZG9yID0gIlRyYW5zbWV0YSIsCisgICAgLmNfaWRlbnQgPSB7IkdlbnVpbmVUTXg4NiIsICJUcmFuc21ldGFDUFUifQorfTsKKworc3RhdGljIHN0cnVjdCBjcHVfZGV2IG5zY19jcHVfZGV2ID0geworICAgIC5jX3ZlbmRvciA9ICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIiwKKyAgICAuY19pZGVudCA9IHsiR2VvZGUgYnkgTlNDIn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiB1bmtub3duX2NwdV9kZXYgPSB7CisgICAgLmNfdmVuZG9yID0gIlVua25vd24gVmVuZG9yIiwKKyAgICAuY19pZGVudCA9IHsiVW5rbm93biBDUFUifQorfTsKKworLyoKKyAqIFJlYWQgTlNDL0N5cml4IERFVklEIHJlZ2lzdGVycyAoRElSKSB0byBnZXQgbW9yZSBkZXRhaWxlZCBpbmZvLiBhYm91dCB0aGUgQ1BVCisgKi8KK3ZvaWQgZG9fY3lyaXhfZGV2aWQodW5zaWduZWQgY2hhciAqZGlyMCwgdW5zaWduZWQgY2hhciAqZGlyMSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNjcjIsIGNjcjM7CisKKwkvKiB3ZSB0ZXN0IGZvciBERVZJRCBieSBjaGVja2luZyB3aGV0aGVyIENDUjMgaXMgd3JpdGFibGUgKi8KKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzIF4gMHg4MCk7CisJZ2V0Q3g4NigweGMwKTsgICAvKiBkdW1teSB0byBjaGFuZ2UgYnVzICovCisKKwlpZiAoZ2V0Q3g4NihDWDg2X0NDUjMpID09IGNjcjMpIHsgICAgICAgLyogbm8gREVWSUQgcmVncy4gKi8KKwkJY2NyMiA9IGdldEN4ODYoQ1g4Nl9DQ1IyKTsKKwkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIgXiAweDA0KTsKKwkJZ2V0Q3g4NigweGMwKTsgIC8qIGR1bW15ICovCisKKwkJaWYgKGdldEN4ODYoQ1g4Nl9DQ1IyKSA9PSBjY3IyKSAvKiBvbGQgQ3g0ODZTTEMvRExDICovCisJCQkqZGlyMCA9IDB4ZmQ7CisJCWVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3g0ODZTIEEgc3RlcCAqLworCQkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIpOworCQkJKmRpcjAgPSAweGZlOworCQl9CisJfSBlbHNlIHsKKwkJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOyAgLyogcmVzdG9yZSBDQ1IzICovCisKKwkJLyogcmVhZCBESVIwIGFuZCBESVIxIENQVSByZWdpc3RlcnMgKi8KKwkJKmRpcjAgPSBnZXRDeDg2KENYODZfRElSMCk7CisJCSpkaXIxID0gZ2V0Q3g4NihDWDg2X0RJUjEpOworCX0KK30KKwordm9pZCBpbml0X2NwdV9kZXZzKHZvaWQpCit7CisgICAgY3B1X2RldnNbWDg2X1ZFTkRPUl9JTlRFTF0gPSAmaW50ZWxfY3B1X2RldjsKKyAgICBjcHVfZGV2c1tYODZfVkVORE9SX0NZUklYXSA9ICZjeXJpeF9jcHVfZGV2OworICAgIGNwdV9kZXZzW1g4Nl9WRU5ET1JfQU1EXSA9ICZhbWRfY3B1X2RldjsKKyAgICBjcHVfZGV2c1tYODZfVkVORE9SX1VNQ10gPSAmdW1jX2NwdV9kZXY7CisgICAgY3B1X2RldnNbWDg2X1ZFTkRPUl9ORVhHRU5dID0gJm5leGdlbl9jcHVfZGV2OworICAgIGNwdV9kZXZzW1g4Nl9WRU5ET1JfQ0VOVEFVUl0gPSAmY2VudGF1cl9jcHVfZGV2OworICAgIGNwdV9kZXZzW1g4Nl9WRU5ET1JfUklTRV0gPSAmcmlzZV9jcHVfZGV2OworICAgIGNwdV9kZXZzW1g4Nl9WRU5ET1JfVFJBTlNNRVRBXSA9ICZ0cmFuc21ldGFfY3B1X2RldjsKKyAgICBjcHVfZGV2c1tYODZfVkVORE9SX05TQ10gPSAmbnNjX2NwdV9kZXY7CisgICAgY3B1X2RldnNbWDg2X1ZFTkRPUl9VTktOT1dOXSA9ICZ1bmtub3duX2NwdV9kZXY7Cit9CisKK3ZvaWQgZ2V0X2NwdV92ZW5kb3Ioc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworICAgIGNoYXIgKnYgPSBjLT54ODZfdmVuZG9yX2lkOworICAgIGludCBpOworICAgIGluaXRfY3B1X2RldnMoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgWDg2X1ZFTkRPUl9OVU0tMTsgaSsrKSB7CisJaWYgKGNwdV9kZXZzW2ldKSB7CisJICAgIGlmICghc3RyY21wKHYsIGNwdV9kZXZzW2ldLT5jX2lkZW50WzBdKSB8fAorCQkoY3B1X2RldnNbaV0tPmNfaWRlbnRbMV0gJiYKKwkJICFzdHJjbXAodiwgY3B1X2RldnNbaV0tPmNfaWRlbnRbMV0pKSkgeworCQljLT54ODZfdmVuZG9yID0gaTsKKwkJcmV0dXJuOworCSAgICB9CisJfQorICAgIH0KKworICAgIGMtPng4Nl92ZW5kb3IgPSBYODZfVkVORE9SX1VOS05PV047Cit9CisKK2ludCBnZXRfbW9kZWxfbmFtZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisgICAgdW5zaWduZWQgaW50ICp2OworICAgIGNoYXIgKnAsICpxOworCisgICAgaWYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA8IDB4ODAwMDAwMDQpCisJcmV0dXJuIDA7CisKKyAgICB2ID0gKHVuc2lnbmVkIGludCAqKWMtPng4Nl9tb2RlbF9pZDsKKyAgICBjcHVpZCgweDgwMDAwMDAyLCAmdlswXSwgJnZbMV0sICZ2WzJdLCAmdlszXSk7CisgICAgY3B1aWQoMHg4MDAwMDAwMywgJnZbNF0sICZ2WzVdLCAmdls2XSwgJnZbN10pOworICAgIGNwdWlkKDB4ODAwMDAwMDQsICZ2WzhdLCAmdls5XSwgJnZbMTBdLCAmdlsxMV0pOworICAgIGMtPng4Nl9tb2RlbF9pZFs0OF0gPSAwOworCisgICAgLyogSW50ZWwgY2hpcHMgcmlnaHQtanVzdGlmeSB0aGlzIHN0cmluZyBmb3Igc29tZSBkdW1iIHJlYXNvbjsKKyAgICAgICB1bmRvIHRoYXQgYnJhaW4gZGFtYWdlICovCisgICAgcCA9IHEgPSAmYy0+eDg2X21vZGVsX2lkWzBdOworICAgIHdoaWxlICgqcCA9PSAnICcpCisJcCsrOworICAgIGlmIChwICE9IHEpIHsKKwl3aGlsZSAoKnApCisJICAgICpxKysgPSAqcCsrOworCXdoaWxlIChxIDw9ICZjLT54ODZfbW9kZWxfaWRbNDhdKQorCSAgICAqcSsrID0gJ1wwJzsJLyogWmVyby1wYWQgdGhlIHJlc3QgKi8KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBkZXRlY3RfY2FjaGUodWludDMyX3QgeGx2bCwgc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworICAgIHVpbnQzMl90IGVheCwgZWJ4LCBlY3gsIGVkeCwgbDJzaXplOworICAgIC8qIERldGVjdGluZyBMMSBjYWNoZSAqLworICAgIGlmICh4bHZsID49IDB4ODAwMDAwMDUpIHsKKwljcHVpZCgweDgwMDAwMDA1LCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwljLT54ODZfbDFfZGF0YV9jYWNoZV9zaXplID0gZWN4ID4+IDI0OworCWMtPng4Nl9sMV9pbnN0cnVjdGlvbl9jYWNoZV9zaXplID0gZWR4ID4+IDI0OworICAgIH0KKworICAgIC8qIERldGVjdGluZyBMMiBjYWNoZSAqLworICAgIGMtPng4Nl9sMl9jYWNoZV9zaXplID0gMDsKKworICAgIGlmICh4bHZsIDwgMHg4MDAwMDAwNikJLyogU29tZSBjaGlwcyBqdXN0IGhhcyBhIGxhcmdlIEwxLiAqLworCXJldHVybjsKKworICAgIGNwdWlkKDB4ODAwMDAwMDYsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworICAgIGwyc2l6ZSA9IGVjeCA+PiAxNjsKKworICAgIC8qIFZlbmRvciBiYXNlZCBmaXhlcyAqLworICAgIHN3aXRjaCAoYy0+eDg2X3ZlbmRvcikgeworICAgIGNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkvKgorCSAqIEludGVsIFBJSUkgVHVhbGF0aW4uIFRoaXMgY29tZXMgaW4gdHdvIGZsYXZvdXJzLgorCSAqIE9uZSBoYXMgMjU2a2Igb2YgY2FjaGUsIHRoZSBvdGhlciA1MTIuIFdlIGhhdmUgbm8gd2F5CisJICogdG8gZGV0ZXJtaW5lIHdoaWNoLCBzbyB3ZSB1c2UgYSBib290dGltZSBvdmVycmlkZQorCSAqIGZvciB0aGUgNTEya2IgbW9kZWwsIGFuZCBhc3N1bWUgMjU2IG90aGVyd2lzZS4KKwkgKi8KKwlpZiAoKGMtPng4NiA9PSA2KSAmJiAoYy0+eDg2X21vZGVsID09IDExKSAmJiAobDJzaXplID09IDApKQorCSAgICBsMnNpemUgPSAyNTY7CisJYnJlYWs7CisgICAgY2FzZSBYODZfVkVORE9SX0FNRDoKKwkvKiBBTUQgZXJyYXRhIFQxMyAob3JkZXIgIzIxOTIyKSAqLworCWlmICgoYy0+eDg2ID09IDYpKSB7CisJICAgIGlmIChjLT54ODZfbW9kZWwgPT0gMyAmJiBjLT54ODZfbWFzayA9PSAwKQkvKiBEdXJvbiBSZXYgQTAgKi8KKwkJbDJzaXplID0gNjQ7CisJICAgIGlmIChjLT54ODZfbW9kZWwgPT0gNCAmJiAoYy0+eDg2X21hc2sgPT0gMCB8fCBjLT54ODZfbWFzayA9PSAxKSkJLyogVGJpcmQgcmV2IEExL0EyICovCisJCWwyc2l6ZSA9IDI1NjsKKwl9CisJYnJlYWs7CisgICAgfQorICAgIGMtPng4Nl9sMl9jYWNoZV9zaXplID0gbDJzaXplOworfQorCit2b2lkIGRldGVjdF9jeXJpeChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpIHsKKwl1bnNpZ25lZCBjaGFyIGRpcjAsIGRpcjBfbXNuLCBkaXIwX2xzbiwgZGlyMSA9IDA7CisgICAgICAgIGNoYXIgKmJ1ZiA9IGMtPng4Nl9tb2RlbF9pZDsKKwljaGFyIEN4ODZfY2JbXSA9ICI/LjV4IENvcmUvQnVzIENsb2NrIjsKKwljb25zdCBjaGFyIGN5cml4X21vZGVsX211bHQxW10gPSAiMTI/PzQzIjsKKwljb25zdCBjaGFyIGN5cml4X21vZGVsX211bHQyW10gPSAiMTIyMzM0NDUiOworICAgICAgICBjb25zdCBjaGFyICpwID0gTlVMTDsKKworCWRvX2N5cml4X2RldmlkKCZkaXIwLCAmZGlyMSk7CisJZGlyMF9tc24gPSBkaXIwID4+IDQ7IC8qIGlkZW50aWZpZXMgQ1BVICJmYW1pbHkiICAgKi8KKwlkaXIwX2xzbiA9IGRpcjAgJiAweGY7ICAgICAgICAgICAgICAgIC8qIG1vZGVsIG9yIGNsb2NrIG11bHRpcGxpZXIgKi8KKwljLT54ODZfbW9kZWwgPSAoZGlyMSA+PiA0KSArIDE7CisgICAgICAgIGMtPng4Nl9tYXNrID0gZGlyMSAmIDB4ZjsKKwlzd2l0Y2ggKGRpcjBfbXNuKSB7CisJCXVuc2lnbmVkIGNoYXIgdG1wOworCisJICAgICAgICBjYXNlIDA6IC8qIEN4NDg2U0xDL0RMQy9TUngvRFJ4ICovCisgICAgICAgICAgICAgICAgCSBwID0gQ3g0ODZfbmFtZVtkaXIwX2xzbiAmIDddOworCQkJIGJyZWFrOworCQorCQljYXNlIDE6IC8qIEN4NDg2Uy9EWC9EWDIvRFg0ICovCisJICAgICAgICAgICAgICAgICBwID0gKGRpcjBfbHNuICYgOCkgPyBDeDQ4NkRfbmFtZVtkaXIwX2xzbiAmIDVdIDogQ3g0ODZTX25hbWVbZGlyMF9sc24gJiAzXTsKKwkJCSBicmVhazsKKworCSAgICAgICAgIGNhc2UgMjogLyogNXg4NiAqLworCSAgICAgICAgICAgICAgICAgQ3g4Nl9jYlsyXSA9IGN5cml4X21vZGVsX211bHQxW2RpcjBfbHNuICYgNV07CisJCQkgcCA9IEN4ODZfY2IrMjsKKwkJCSBicmVhazsKKworCQljYXNlIDM6IC8qIDZ4ODYvNng4NkwgKi8KKwkJCSAgIEN4ODZfY2JbMV0gPSAnICc7CisJCQkgICBDeDg2X2NiWzJdID0gY3lyaXhfbW9kZWxfbXVsdDFbZGlyMF9sc24gJiA1XTsKKwkJCSAgIGlmIChkaXIxID4gMHgyMSkgeyAvKiA2ODZMICovCisJCQkJICAgQ3g4Nl9jYlswXSA9ICdMJzsKKwkJCQkgICBwID0gQ3g4Nl9jYjsKKwkJCQkgICAoYy0+eDg2X21vZGVsKSsrOworCQkJICAgfSBlbHNlICAgICAgICAgICAgIC8qIDY4NiAqLworCQkJCSAgIHAgPSBDeDg2X2NiKzE7CisJCQkgICAKKwkJCSAgIGMtPmNvbWFfYnVnID0gMTsKKwkJCSAgIGJyZWFrOworCQljYXNlIDQ6CisJICAgICAgICAgICAgICAgICAgIGMtPng4Nl9sMV9kYXRhX2NhY2hlX3NpemUgPSAxNjsgLyogWWVwIDE2SyBpbnRlZ3JhdGVkIGNhY2hlIHRoYXRzIGl0ICovCisJCQkgICBpZiAoYy0+Y3B1aWRfbGV2ZWwgIT0gMikgeyAvKiBNZWRpYSBHWCAqLworCQkJCSAgIEN4ODZfY2JbMl0gPSAoZGlyMF9sc24gJiAxKSA/ICczJyA6ICc0JzsKKwkJCQkgICBwID0gQ3g4Nl9jYisyOworCQkJICAgfQorCQkJICAgYnJlYWs7CisJCQorCQljYXNlIDU6IC8qIDZ4ODZNWC9NIElJICovCisJCQkgICBpZiAoZGlyMSA+IDcpIHsKKwkJCQkgICBkaXIwX21zbisrOyAgLyogTSBJSSAqLworCQkJICAgfSBlbHNlIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jb21hX2J1ZyA9IDE7ICAgICAgLyogNng4Nk1YLCBpdCBoYXMgdGhlIGJ1Zy4gKi8KKwkJCSAgIH0KKworCQkJICAgdG1wID0gKCEoZGlyMF9sc24gJiA3KSB8fCBkaXIwX2xzbiAmIDEpID8gMiA6IDA7CisJCQkgICBDeDg2X2NiW3RtcF0gPSBjeXJpeF9tb2RlbF9tdWx0MltkaXIwX2xzbiAmIDddOworCQkJICAgcCA9IEN4ODZfY2IrdG1wOworCQkJICAgaWYgKCgoZGlyMSAmIDB4MGYpID4gNCkgfHwgKChkaXIxICYgMHhmMCkgPT0gMHgyMCkpCisJCQkJICAgKGMtPng4Nl9tb2RlbCkrKzsKKwkJCSAgIGJyZWFrOworCQkKKwkJY2FzZSAweGY6ICAvKiBDeXJpeCA0ODYgd2l0aG91dCBERVZJRCByZWdpc3RlcnMgKi8KKwkJCSAgIHN3aXRjaCAoZGlyMF9sc24pIHsKKwkJCQkgICBjYXNlIDB4ZDogIC8qIGVpdGhlciBhIDQ4NlNMQyBvciBETEMgdy9vIERFVklEICovCisJCQkJCSAgIGRpcjBfbXNuID0gMDsgCisJCQkJCSAgIHAgPSBDeDQ4Nl9uYW1lWyhjLT5oYXJkX21hdGgpID8gMSA6IDBdOworCQkJCQkgICBicmVhazsKKwkJCQkgICAKKwkJCQkgICBjYXNlIDB4ZTogIC8qIGEgNDg2UyBBIHN0ZXAgKi8KKwkJCQkJICAgZGlyMF9tc24gPSAwOworCQkJCQkgICBwID0gQ3g0ODZTX25hbWVbMF07CisJCQkJCSAgIGJyZWFrOworCQkJICAgfQorCQkJICAgYnJlYWs7CisJCQkgICAKKwkJZGVmYXVsdDoKKwkJCSAgIGRpcjBfbXNuID0gNzsKKwkJCSAgIGJyZWFrOworCX0KKworCS8qIElmIHRoZSBwcm9jZXNzb3IgaXMgdW5rbm93biwgd2Uga2VlcCB0aGUgbW9kZWwgbmFtZSB3ZSBnb3QKKwkgKiBmcm9tIHRoZSBnZW5lcmljIGNhbGwgKi8KKwlpZiAoZGlyMF9tc24gPCA3KSB7CQorCQlzdHJjcHkoYnVmLCBDeDg2X21vZGVsW2RpcjBfbXNuICYgN10pOworCQlpZiAocCkgc3RyY2F0KGJ1ZiwgcCk7CisJfQorfQorCit2b2lkIGdlbmVyaWNfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworICAgIHVpbnQzMl90IHRmbXMsIHhsdmw7CisgICAgdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4OworCisgICAgLyogR2V0IHZlbmRvciBuYW1lICovCisgICAgY3B1aWQoMHgwMDAwMDAwMCwKKwkgICh1aW50MzJfdCAqKSAmIGMtPmNwdWlkX2xldmVsLAorCSAgKHVpbnQzMl90ICopICYgYy0+eDg2X3ZlbmRvcl9pZFswXSwKKwkgICh1aW50MzJfdCAqKSAmIGMtPng4Nl92ZW5kb3JfaWRbOF0sCisJICAodWludDMyX3QgKikgJiBjLT54ODZfdmVuZG9yX2lkWzRdKTsKKworICAgIGdldF9jcHVfdmVuZG9yKGMpOworCisgICAgLyogSW50ZWwtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHgwMDAwMDAwMSAqLworICAgIGlmIChjLT5jcHVpZF9sZXZlbCA+PSAweDAwMDAwMDAxKSB7CisJdWludDMyX3QgY2FwYWJpbGl0eSwgZXhjYXA7CisJY3B1aWQoMHgwMDAwMDAwMSwgJnRmbXMsICZlYngsICZleGNhcCwgJmNhcGFiaWxpdHkpOworCWMtPng4Nl9jYXBhYmlsaXR5WzBdID0gY2FwYWJpbGl0eTsKKwljLT54ODZfY2FwYWJpbGl0eVs0XSA9IGV4Y2FwOworCWMtPng4NiA9ICh0Zm1zID4+IDgpICYgMTU7CisJYy0+eDg2X21vZGVsID0gKHRmbXMgPj4gNCkgJiAxNTsKKwlpZiAoYy0+eDg2ID09IDB4ZikKKwkgICAgYy0+eDg2ICs9ICh0Zm1zID4+IDIwKSAmIDB4ZmY7CisJaWYgKGMtPng4NiA+PSAweDYpCisJICAgIGMtPng4Nl9tb2RlbCArPSAoKHRmbXMgPj4gMTYpICYgMHhGKSA8PCA0OworCWMtPng4Nl9tYXNrID0gdGZtcyAmIDE1OworCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0NMRkxTSCkpCisJICAgIGMtPng4Nl9jbGZsdXNoX3NpemUgPSAoKGVieCA+PiA4KSAmIDB4ZmYpICogODsKKyAgICB9IGVsc2UgeworCS8qIEhhdmUgQ1BVSUQgbGV2ZWwgMCBvbmx5IC0gdW5oZWFyZCBvZiAqLworCWMtPng4NiA9IDQ7CisgICAgfQorCisgICAgLyogQU1ELWRlZmluZWQgZmxhZ3M6IGxldmVsIDB4ODAwMDAwMDEgKi8KKyAgICB4bHZsID0gY3B1aWRfZWF4KDB4ODAwMDAwMDApOworICAgIGlmICgoeGx2bCAmIDB4ZmZmZjAwMDApID09IDB4ODAwMDAwMDApIHsKKwlpZiAoeGx2bCA+PSAweDgwMDAwMDAxKSB7CisJICAgIGMtPng4Nl9jYXBhYmlsaXR5WzFdID0gY3B1aWRfZWR4KDB4ODAwMDAwMDEpOworCSAgICBjLT54ODZfY2FwYWJpbGl0eVs2XSA9IGNwdWlkX2VjeCgweDgwMDAwMDAxKTsKKwl9CisJaWYgKHhsdmwgPj0gMHg4MDAwMDAwNCkKKwkgICAgZ2V0X21vZGVsX25hbWUoYyk7CS8qIERlZmF1bHQgbmFtZSAqLworICAgIH0KKworICAgIC8qIFNwZWNpZmljIGRldGVjdGlvbiBjb2RlICovCisgICAgc3dpdGNoIChjLT54ODZfdmVuZG9yKSB7CisJICAgIGNhc2UgWDg2X1ZFTkRPUl9DWVJJWDoKKwkgICAgY2FzZSBYODZfVkVORE9SX05TQzogZGV0ZWN0X2N5cml4KGMpOyBicmVhazsKKwkgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgLyogRGV0ZWN0aW5nIHRoZSBudW1iZXIgb2YgY29yZXMgKi8KKyAgICBzd2l0Y2ggKGMtPng4Nl92ZW5kb3IpIHsKKyAgICBjYXNlIFg4Nl9WRU5ET1JfQU1EOgorCWlmICh4bHZsID49IDB4ODAwMDAwMDgpIHsKKwkgICAgYy0+eDg2X251bV9jb3JlcyA9IChjcHVpZF9lY3goMHg4MDAwMDAwOCkgJiAweGZmKSArIDE7CisJICAgIGlmIChjLT54ODZfbnVtX2NvcmVzICYgKGMtPng4Nl9udW1fY29yZXMgLSAxKSkKKwkJYy0+eDg2X251bV9jb3JlcyA9IDE7CisJfQorCWJyZWFrOworICAgIGNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPj0gMHgwMDAwMDAwNCkgeworCSAgICBjcHVpZCgweDQsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCSAgICBjLT54ODZfbnVtX2NvcmVzID0gKChlYXggJiAweGZjMDAwMDAwKSA+PiAyNikgKyAxOworCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWMtPng4Nl9udW1fY29yZXMgPSAxOworCWJyZWFrOworICAgIH0KKworICAgIGRldGVjdF9jYWNoZSh4bHZsLCBjKTsKK30KKworLyoKKyAqIENoZWNrc3VtIGFuIE1QIGNvbmZpZ3VyYXRpb24gYmxvY2suCisgKi8KKworc3RhdGljIGludCBtcGZfY2hlY2tzdW0odW5zaWduZWQgY2hhciAqbXAsIGludCBsZW4pCit7CisgICAgaW50IHN1bSA9IDA7CisKKyAgICB3aGlsZSAobGVuLS0pCisJc3VtICs9ICptcCsrOworCisgICAgcmV0dXJuIHN1bSAmIDB4RkY7Cit9CisKK3N0YXRpYyBpbnQgc21wX3NjYW5fY29uZmlnKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisgICAgdW5zaWduZWQgbG9uZyAqYnAgPSAodW5zaWduZWQgbG9uZyAqKWJhc2U7CisgICAgc3RydWN0IGludGVsX21wX2Zsb2F0aW5nICptcGY7CisKKy8vICAgICAgICBwcmludGYoIlNjYW4gU01QIGZyb20gJXAgZm9yICVsZCBieXRlcy5cbiIsIGJwLGxlbmd0aCk7CisgICAgaWYgKHNpemVvZigqbXBmKSAhPSAxNikgeworCXByaW50ZigiRXJyb3I6IE1QRiBzaXplXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICB3aGlsZSAobGVuZ3RoID4gMCkgeworCW1wZiA9IChzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKilicDsKKwlpZiAoKCpicCA9PSBTTVBfTUFHSUNfSURFTlQpICYmCisJICAgIChtcGYtPm1wZl9sZW5ndGggPT0gMSkgJiYKKwkgICAgIW1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKWJwLCAxNikgJiYKKwkgICAgKChtcGYtPm1wZl9zcGVjaWZpY2F0aW9uID09IDEpCisJICAgICB8fCAobXBmLT5tcGZfc3BlY2lmaWNhdGlvbiA9PSA0KSkpIHsKKwkgICAgcmV0dXJuIDE7CisJfQorCWJwICs9IDQ7CisJbGVuZ3RoIC09IDE2OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGZpbmRfc21wX2NvbmZpZyh2b2lkKQoreworLy8gICAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzOworCisgICAgLyoKKyAgICAgKiBGSVhNRTogTGludXggYXNzdW1lcyB5b3UgaGF2ZSA2NDBLIG9mIGJhc2UgcmFtLi4KKyAgICAgKiB0aGlzIGNvbnRpbnVlcyB0aGUgZXJyb3IuLi4KKyAgICAgKgorICAgICAqIDEpIFNjYW4gdGhlIGJvdHRvbSAxSyBmb3IgYSBzaWduYXR1cmUKKyAgICAgKiAyKSBTY2FuIHRoZSB0b3AgMUsgb2YgYmFzZSBSQU0KKyAgICAgKiAzKSBTY2FuIHRoZSA2NEsgb2YgYmlvcworICAgICAqLworICAgIGlmIChzbXBfc2Nhbl9jb25maWcoMHgwLCAweDQwMCkgfHwKKwlzbXBfc2Nhbl9jb25maWcoNjM5ICogMHg0MDAsIDB4NDAwKSB8fAorCXNtcF9zY2FuX2NvbmZpZygweEYwMDAwLCAweDEwMDAwKSkKKwlyZXR1cm4gMTsKKyAgICAvKgorICAgICAqIElmIGl0IGlzIGFuIFNNUCBtYWNoaW5lIHdlIHNob3VsZCBrbm93IG5vdywgdW5sZXNzIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24gaXMgaW4gYW4gRUlTQS9NQ0EgYnVzIG1hY2hpbmUgd2l0aCBhbgorICAgICAqIGV4dGVuZGVkIGJpb3MgZGF0YSBhcmVhLgorICAgICAqCisgICAgICogdGhlcmUgaXMgYSByZWFsLW1vZGUgc2VnbWVudGVkIHBvaW50ZXIgcG9pbnRpbmcgdG8gdGhlCisgICAgICogNEsgRUJEQSBhcmVhIGF0IDB4NDBFLCBjYWxjdWxhdGUgYW5kIHNjYW4gaXQgaGVyZS4KKyAgICAgKgorICAgICAqIE5PVEUhIFRoZXJlIGFyZSBMaW51eCBsb2FkZXJzIHRoYXQgd2lsbCBjb3JydXB0IHRoZSBFQkRBCisgICAgICogYXJlYSwgYW5kIGFzIHN1Y2ggdGhpcyBraW5kIG9mIFNNUCBjb25maWcgbWF5IGJlIGxlc3MKKyAgICAgKiB0cnVzdHdvcnRoeSwgc2ltcGx5IGJlY2F1c2UgdGhlIFNNUCB0YWJsZSBtYXkgaGF2ZSBiZWVuCisgICAgICogc3RvbXBlZCBvbiBkdXJpbmcgZWFybHkgYm9vdC4gVGhlc2UgbG9hZGVycyBhcmUgYnVnZ3kgYW5kCisgICAgICogc2hvdWxkIGJlIGZpeGVkLgorICAgICAqCisgICAgICogTVAxLjQgU1BFQyBzdGF0ZXMgdG8gb25seSBzY2FuIGZpcnN0IDFLIG9mIDRLIEVCREEuCisgICAgICovCisKKy8vICAgICAgICBhZGRyZXNzID0gZ2V0X2Jpb3NfZWJkYSgpOworLy8gICAgICAgIGlmIChhZGRyZXNzKQorLy8gICAgICAgICAgICAgICAgc21wX3NjYW5fY29uZmlnKGFkZHJlc3MsIDB4NDAwKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBzZXRfY3B1X2ZsYWdzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYywgc19jcHUgKiBjcHUpCit7CisgICAgY3B1LT5mbGFncy5mcHUgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0ZQVSk7CisgICAgY3B1LT5mbGFncy52bWUgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1ZNRSk7CisgICAgY3B1LT5mbGFncy5kZSA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfREUpOworICAgIGNwdS0+ZmxhZ3MucHNlID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QU0UpOworICAgIGNwdS0+ZmxhZ3MudHNjID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9UU0MpOworICAgIGNwdS0+ZmxhZ3MubXNyID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NU1IpOworICAgIGNwdS0+ZmxhZ3MucGFlID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QQUUpOworICAgIGNwdS0+ZmxhZ3MubWNlID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NQ0UpOworICAgIGNwdS0+ZmxhZ3MuY3g4ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DWDgpOworICAgIGNwdS0+ZmxhZ3MuYXBpYyA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQVBJQyk7CisgICAgY3B1LT5mbGFncy5zZXAgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1NFUCk7CisgICAgY3B1LT5mbGFncy5tdHJyID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NVFJSKTsKKyAgICBjcHUtPmZsYWdzLnBnZSA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfUEdFKTsKKyAgICBjcHUtPmZsYWdzLm1jYSA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTUNBKTsKKyAgICBjcHUtPmZsYWdzLmNtb3YgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0NNT1YpOworICAgIGNwdS0+ZmxhZ3MucGF0ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QQVQpOworICAgIGNwdS0+ZmxhZ3MucHNlXzM2ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QU0UzNik7CisgICAgY3B1LT5mbGFncy5wc24gPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BOKTsKKyAgICBjcHUtPmZsYWdzLmNsZmxzaCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ0xGTFNIKTsKKyAgICBjcHUtPmZsYWdzLmR0cyA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRFRFUyk7CisgICAgY3B1LT5mbGFncy5hY3BpID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9BQ1BJKTsKKyAgICBjcHUtPmZsYWdzLnBiZSA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfUEJFKTsKKyAgICBjcHUtPmZsYWdzLm1teCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTU1YKTsKKyAgICBjcHUtPmZsYWdzLmZ4c3IgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0ZYU1IpOworICAgIGNwdS0+ZmxhZ3Muc3NlID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9YTU0pOworICAgIGNwdS0+ZmxhZ3Muc3NlMiA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWE1NMik7CisgICAgY3B1LT5mbGFncy5zcyA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfU0VMRlNOT09QKTsKKyAgICBjcHUtPmZsYWdzLmh0dCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfSFQpOworICAgIGNwdS0+ZmxhZ3MuYWNjID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9BQ0MpOworICAgIGNwdS0+ZmxhZ3Muc3lzY2FsbCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfU1lTQ0FMTCk7CisgICAgY3B1LT5mbGFncy5tcCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTVApOworICAgIGNwdS0+ZmxhZ3MubnggPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX05YKTsKKyAgICBjcHUtPmZsYWdzLm1teGV4dCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTU1YRVhUKTsKKyAgICBjcHUtPmZsYWdzLmZ4c3Jfb3B0ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9GWFNSX09QVCk7CisgICAgY3B1LT5mbGFncy5nYnBhZ2VzID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9HQlBBR0VTKTsKKyAgICBjcHUtPmZsYWdzLnJkdHNjcCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfUkRUU0NQKTsKKyAgICBjcHUtPmZsYWdzLmxtID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9MTSk7CisgICAgY3B1LT5mbGFncy5ub3dleHQgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFXzNETk9XRVhUKTsKKyAgICBjcHUtPmZsYWdzLm5vdyA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfM0ROT1cpOworICAgIGNwdS0+ZmxhZ3Muc21wID0gZmluZF9zbXBfY29uZmlnKCk7CisgICAgY3B1LT5mbGFncy5wbmkgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1hNTTMpOworICAgIGNwdS0+ZmxhZ3MucGNsbXVscWQgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BDTE1VTFFEUSk7CisgICAgY3B1LT5mbGFncy5kdGVzNjQgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0RURVM2NCk7CisgICAgY3B1LT5mbGFncy52bXggPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1ZNWCk7CisgICAgY3B1LT5mbGFncy5zbXggPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1NNWCk7CisgICAgY3B1LT5mbGFncy5lc3QgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0VTVCk7CisgICAgY3B1LT5mbGFncy50bTIgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1RNMik7CisgICAgY3B1LT5mbGFncy5zc2UzID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9TU0UzKTsKKyAgICBjcHUtPmZsYWdzLmNpZCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ0lEKTsKKyAgICBjcHUtPmZsYWdzLmZtYSA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRk1BKTsKKyAgICBjcHUtPmZsYWdzLmN4MTYgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0NYMTYpOworICAgIGNwdS0+ZmxhZ3MueHRwciA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWFRQUik7CisgICAgY3B1LT5mbGFncy5wZGNtID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QRENNKTsKKyAgICBjcHUtPmZsYWdzLmRjYSA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRENBKTsKKyAgICBjcHUtPmZsYWdzLnhtbTRfMSA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWE1NNF8xKTsKKyAgICBjcHUtPmZsYWdzLnhtbTRfMiA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWE1NNF8yKTsKKyAgICBjcHUtPmZsYWdzLngyYXBpYyA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWDJBUElDKTsKKyAgICBjcHUtPmZsYWdzLm1vdmJlID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NT1ZCRSk7CisgICAgY3B1LT5mbGFncy5wb3BjbnQgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BPUENOVCk7CisgICAgY3B1LT5mbGFncy5hZXMgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0FFUyk7CisgICAgY3B1LT5mbGFncy54c2F2ZSA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWFNBVkUpOworICAgIGNwdS0+ZmxhZ3Mub3N4c2F2ZSA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfT1NYU0FWRSk7CisgICAgY3B1LT5mbGFncy5hdnggPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0FWWCk7CisgICAgY3B1LT5mbGFncy5oeXBlcnZpc29yID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9IWVBFUlZJU09SKTsKKyAgICBjcHUtPmZsYWdzLmFjZTIgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0FDRTIpOworICAgIGNwdS0+ZmxhZ3MuYWNlMl9lbiA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQUNFMl9FTik7CisgICAgY3B1LT5mbGFncy5waGUgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BIRSk7CisgICAgY3B1LT5mbGFncy5waGVfZW4gPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BIRV9FTik7CisgICAgY3B1LT5mbGFncy5wbW0gPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BNTSk7CisgICAgY3B1LT5mbGFncy5wbW1fZW4gPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BNTV9FTik7CisgICAgY3B1LT5mbGFncy5leHRhcGljID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FWFRBUElDKTsKKyAgICBjcHUtPmZsYWdzLmNyOF9sZWdhY3kgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0NSOF9MRUdBQ1kpOworICAgIGNwdS0+ZmxhZ3MuYWJtID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9BQk0pOworICAgIGNwdS0+ZmxhZ3Muc3NlNGEgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1NTRTRBKTsKKyAgICBjcHUtPmZsYWdzLm1pc2FsaWduc3NlID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NSVNBTElHTlNTRSk7CisgICAgY3B1LT5mbGFncy5ub3dwcmVmZXRjaCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfM0ROT1dQUkVGRVRDSCk7CisgICAgY3B1LT5mbGFncy5vc3Z3ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9PU1ZXKTsKKyAgICBjcHUtPmZsYWdzLmlicyA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfSUJTKTsKKyAgICBjcHUtPmZsYWdzLnNzZTUgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1NTRTUpOworICAgIGNwdS0+ZmxhZ3Muc2tpbml0ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9TS0lOSVQpOworICAgIGNwdS0+ZmxhZ3Mud2R0ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9XRFQpOworICAgIGNwdS0+ZmxhZ3MuaWRhID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9JREEpOworICAgIGNwdS0+ZmxhZ3MuYXJhdCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQVJBVCk7CisgICAgY3B1LT5mbGFncy50cHJfc2hhZG93ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9UUFJfU0hBRE9XKTsKKyAgICBjcHUtPmZsYWdzLnZubWkgPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1ZOTUkpOworICAgIGNwdS0+ZmxhZ3MuZmxleHByaW9yaXR5ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9GTEVYUFJJT1JJVFkpOworICAgIGNwdS0+ZmxhZ3MuZXB0ID0gY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FUFQpOworICAgIGNwdS0+ZmxhZ3MudnBpZCA9IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfVlBJRCk7CisgICAgY3B1LT5mbGFncy5zdm0gPSBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1NWTSk7Cit9CisKK3ZvaWQgc2V0X2dlbmVyaWNfaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMsIHNfY3B1ICogY3B1KQoreworICAgIGNwdS0+ZmFtaWx5ID0gYy0+eDg2OworICAgIGNwdS0+dmVuZG9yX2lkID0gYy0+eDg2X3ZlbmRvcjsKKyAgICBjcHUtPm1vZGVsX2lkID0gYy0+eDg2X21vZGVsOworICAgIGNwdS0+c3RlcHBpbmcgPSBjLT54ODZfbWFzazsKKyAgICBzdHJsY3B5KGNwdS0+dmVuZG9yLCBjcHVfZGV2c1tjLT54ODZfdmVuZG9yXS0+Y192ZW5kb3IsCisJICAgIHNpemVvZihjcHUtPnZlbmRvcikpOworICAgIHN0cmxjcHkoY3B1LT5tb2RlbCwgYy0+eDg2X21vZGVsX2lkLCBzaXplb2YoY3B1LT5tb2RlbCkpOworICAgIGNwdS0+bnVtX2NvcmVzID0gYy0+eDg2X251bV9jb3JlczsKKyAgICBjcHUtPmwxX2RhdGFfY2FjaGVfc2l6ZSA9IGMtPng4Nl9sMV9kYXRhX2NhY2hlX3NpemU7CisgICAgY3B1LT5sMV9pbnN0cnVjdGlvbl9jYWNoZV9zaXplID0gYy0+eDg2X2wxX2luc3RydWN0aW9uX2NhY2hlX3NpemU7CisgICAgY3B1LT5sMl9jYWNoZV9zaXplID0gYy0+eDg2X2wyX2NhY2hlX3NpemU7Cit9CisKK3ZvaWQgZGV0ZWN0X2NwdShzX2NwdSAqIGNwdSkKK3sKKyAgICBzdHJ1Y3QgY3B1aW5mb194ODYgYzsKKyAgICBtZW1zZXQoJmMsMCxzaXplb2YoYykpOworICAgIGMueDg2X2NsZmx1c2hfc2l6ZSA9IDMyOworICAgIGMueDg2X3ZlbmRvciA9IFg4Nl9WRU5ET1JfVU5LTk9XTjsKKyAgICBjLmNwdWlkX2xldmVsID0gLTE7CQkvKiBDUFVJRCBub3QgZGV0ZWN0ZWQgKi8KKyAgICBjLng4Nl9udW1fY29yZXMgPSAxOworICAgIG1lbXNldCgmY3B1LT5mbGFncywgMCwgc2l6ZW9mKHNfY3B1X2ZsYWdzKSk7CisKKyAgICBpZiAoIWhhdmVfY3B1aWRfcCgpKQorCXJldHVybjsKKworICAgIGdlbmVyaWNfaWRlbnRpZnkoJmMpOworICAgIHNldF9nZW5lcmljX2luZm8oJmMsIGNwdSk7CisgICAgc2V0X2NwdV9mbGFncygmYywgY3B1KTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi9kaXNrL2F0YS5jIGIvY29tMzIvZ3BsbGliL2Rpc2svYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmNjY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9kaXNrL2F0YS5jCkBAIC0wLDAgKzEsNjIgQEAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqICAgICAgYXRhX2lkX3N0cmluZyAtIENvbnZlcnQgSURFTlRJRlkgREVWSUNFIHBhZ2UgaW50byBzdHJpbmcKKyAqICAgICAgQGlkOiBJREVOVElGWSBERVZJQ0UgcmVzdWx0cyB3ZSB3aWxsIGV4YW1pbmUKKyAqICAgICAgQHM6IHN0cmluZyBpbnRvIHdoaWNoIGRhdGEgaXMgb3V0cHV0CisgKiAgICAgIEBvZnM6IG9mZnNldCBpbnRvIGlkZW50aWZ5IGRldmljZSBwYWdlCisgKiAgICAgIEBsZW46IGxlbmd0aCBvZiBzdHJpbmcgdG8gcmV0dXJuLiBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyLgorICoKKyAqICAgICAgVGhlIHN0cmluZ3MgaW4gdGhlIElERU5USUZZIERFVklDRSBwYWdlIGFyZSBicm9rZW4gdXAgaW50bworICogICAgICAxNi1iaXQgY2h1bmtzLiAgUnVuIHRocm91Z2ggdGhlIHN0cmluZywgYW5kIG91dHB1dCBlYWNoCisgKiAgICAgIDgtYml0IGNodW5rIGxpbmVhcmx5LCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLgorICoKKyAqICAgICAgTE9DS0lORzoKKyAqICAgICAgY2FsbGVyLgorICovCit2b2lkIGF0YV9pZF9zdHJpbmcoY29uc3QgdWludDE2X3QgKiBpZCwgdW5zaWduZWQgY2hhciAqcywKKwkJICAgdW5zaWduZWQgaW50IG9mcywgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBpbnQgYzsKKworICAgIHdoaWxlIChsZW4gPiAwKSB7CisJYyA9IGlkW29mc10gPj4gODsKKwkqcyA9IGM7CisJcysrOworCisJYyA9IGlkW29mc10gJiAweGZmOworCSpzID0gYzsKKwlzKys7CisKKwlvZnMrKzsKKwlsZW4gLT0gMjsKKyAgICB9Cit9CisKKy8qKgorICogICAgICBhdGFfaWRfY19zdHJpbmcgLSBDb252ZXJ0IElERU5USUZZIERFVklDRSBwYWdlIGludG8gQyBzdHJpbmcKKyAqICAgICAgQGlkOiBJREVOVElGWSBERVZJQ0UgcmVzdWx0cyB3ZSB3aWxsIGV4YW1pbmUKKyAqICAgICAgQHM6IHN0cmluZyBpbnRvIHdoaWNoIGRhdGEgaXMgb3V0cHV0CisgKiAgICAgIEBvZnM6IG9mZnNldCBpbnRvIGlkZW50aWZ5IGRldmljZSBwYWdlCisgKiAgICAgIEBsZW46IGxlbmd0aCBvZiBzdHJpbmcgdG8gcmV0dXJuLiBtdXN0IGJlIGFuIG9kZCBudW1iZXIuCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBhdGFfaWRfc3RyaW5nIGV4Y2VwdCB0aGF0IGl0CisgKiAgICAgIHRyaW1zIHRyYWlsaW5nIHNwYWNlcyBhbmQgdGVybWluYXRlcyB0aGUgcmVzdWx0aW5nIHN0cmluZyB3aXRoCisgKiAgICAgIG51bGwuICBAbGVuIG11c3QgYmUgYWN0dWFsIG1heGltdW0gbGVuZ3RoIChldmVuIG51bWJlcikgKyAxLgorICoKKyAqICAgICAgTE9DS0lORzoKKyAqICAgICAgY2FsbGVyLgorICovCit2b2lkIGF0YV9pZF9jX3N0cmluZyhjb25zdCB1aW50MTZfdCAqIGlkLCB1bnNpZ25lZCBjaGFyICpzLAorCQkgICAgIHVuc2lnbmVkIGludCBvZnMsIHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgdW5zaWduZWQgY2hhciAqcDsKKworICAgIGF0YV9pZF9zdHJpbmcoaWQsIHMsIG9mcywgbGVuIC0gMSk7CisKKyAgICBwID0gcyArIHN0cm5sZW4oKGNvbnN0IGNoYXIgKilzLCBsZW4gLSAxKTsKKyAgICB3aGlsZSAocCA+IHMgJiYgcFstMV0gPT0gJyAnKQorCXAtLTsKKyAgICAqcCA9ICdcMCc7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZGlzay9ib290bG9hZGVycy5jIGIvY29tMzIvZ3BsbGliL2Rpc2svYm9vdGxvYWRlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDM0MDExCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL2Rpc2svYm9vdGxvYWRlcnMuYwpAQCAtMCwwICsxLDQ2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBQaWVycmUtQWxleGFuZHJlIE1leWVyCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTeXNsaW51eCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxkaXNrL2Jvb3Rsb2FkZXJzLmg+CisjaW5jbHVkZSA8ZGlzay9jb21tb24uaD4KKyNpbmNsdWRlIDxkaXNrL2dlb20uaD4KKyNpbmNsdWRlIDxkaXNrL3JlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqCisgKiBnZXRfYm9vdGxvYWRlcl9zdHJpbmcgLSByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYm9vdCBjb2RlIGluIGEKKyAqCQkJICAgYm9vdHNlY3RvcgorICogQGQ6CQkJZHJpdmVpbmZvIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBkcml2ZQorICogQHA6CXBhcnRpdGlvbiB0byBzY2FuICh1c3VhbGx5IHRoZSBhY3RpdmUgb25lKQorICogQGJ1ZmZlcjoJCXByZS1hbGxvY2F0ZWQgYnVmZmVyCisgKiBAYnVmZmVyX3NpemU6CUBidWZmZXIgc2l6ZQorICoqLworaW50IGdldF9ib290bG9hZGVyX3N0cmluZyhzdHJ1Y3QgZHJpdmVpbmZvICpkLCBjb25zdCBzdHJ1Y3QgcGFydF9lbnRyeSAqcCwKKwkJCSAgY2hhciAqYnVmZmVyLCBjb25zdCBpbnQgYnVmZmVyX3NpemUpCit7CisgICAgY2hhciBib290X3NlY3RvcltTRUNUT1IgKiBzaXplb2YoY2hhcildOworCisgICAgaWYgKHJlYWRfc2VjdG9ycyhkLCAmYm9vdF9zZWN0b3IsIHAtPnN0YXJ0X2xiYSwgMSkgPT0gLTEpCisJcmV0dXJuIC0xOworICAgIGVsc2UgeworCWlmICghc3RybmNtcChib290X3NlY3RvciArIDMsICJTWVNMSU5VWCIsIDgpKQorCSAgICBzdHJsY3B5KGJ1ZmZlciwgIlNZU0xJTlVYIiwgYnVmZmVyX3NpemUgLSAxKTsKKwllbHNlIGlmICghc3RybmNtcChib290X3NlY3RvciArIDMsICJFWFRMSU5VWCIsIDgpKQorCSAgICBzdHJsY3B5KGJ1ZmZlciwgIkVYVExJTlVYIiwgYnVmZmVyX3NpemUgLSAxKTsKKwllbHNlIGlmICghc3RybmNtcChib290X3NlY3RvciArIDMsICJNU1dJTjQuMSIsIDgpKQorCSAgICBzdHJsY3B5KGJ1ZmZlciwgIk1TV0lONC4xIiwgYnVmZmVyX3NpemUgLSAxKTsKKwllbHNlCisJICAgIHJldHVybiAtMTsKKwkvKiBBZGQgbW9yZS4uLiAqLworCisJYnVmZmVyW2J1ZmZlcl9zaXplIC0gMV0gPSAnXDAnOworCXJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi9kaXNrL2Vycm5vX2Rpc2suYyBiL2NvbTMyL2dwbGxpYi9kaXNrL2Vycm5vX2Rpc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY4ODAyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL2Rpc2svZXJybm9fZGlzay5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFN5c2xpbnV4LCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGRpc2svZXJybm9fZGlzay5oPgorCitpbnQgZXJybm9fZGlzazsKZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi9kaXNrL2Vycm9yLmMgYi9jb20zMi9ncGxsaWIvZGlzay9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNDcyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvZGlzay9lcnJvci5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFN5c2xpbnV4LCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGlzay9lcnJub19kaXNrLmg+CisKKy8qKgorICogZ2V0X2Vycm9yIC0gZGVjb2RlIGEgZGlzayBlcnJvciBzdGF0dXMKKyAqIEBzOglQcmVhbGxvY2F0ZWQgYnVmZmVyCisgKgorICogRmlsbCBAYnVmZmVyX3B0ciB3aXRoIHRoZSBsYXN0IGVycm5vX2Rpc2sKKyAqKi8KK3ZvaWQgZ2V0X2Vycm9yKGNvbnN0IGNoYXIgKnMpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgJWRcbiIsIHMsIGVycm5vX2Rpc2spOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsbGliL2Rpc2svZ2VvbS5jIGIvY29tMzIvZ3BsbGliL2Rpc2svZ2VvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMDk1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvZGlzay9nZW9tLmMKQEAgLTAsMCArMSwyNzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIKKyAqCisgKiAgIFNvbWUgcGFydHMgYm9ycm93ZWQgZnJvbSBjaGFpbi5jMzI6CisgKgorICogICBDb3B5cmlnaHQgMjAwMy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgU3lzbGludXgsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGRpc2svZ2VvbS5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoqCisgKiBsYmFfdG9fY2hzIC0gc3BsaXQgZ2l2ZW4gbGJhIGludG8gY3lsaW5kZXJzL2hlYWRzL3NlY3RvcnMKKyAqKi8KK3ZvaWQgbGJhX3RvX2Nocyhjb25zdCBzdHJ1Y3QgZHJpdmVpbmZvICpkcml2ZV9pbmZvLCBjb25zdCBpbnQgbGJhLAorCQl1bnNpZ25lZCBpbnQgKmN5bGluZGVyLCB1bnNpZ25lZCBpbnQgKmhlYWQsCisJCXVuc2lnbmVkIGludCAqc2VjdG9yKQoreworICAgIHVuc2lnbmVkIGludCB0cmFjazsKKworICAgIC8qIFVzZSBFREQsIGlmIHZhbGlkICovCisgICAgaWYgKGRyaXZlX2luZm8tPmVkZF9wYXJhbXMuc2VjdG9yc19wZXJfdHJhY2sgPiAwICYmCisJZHJpdmVfaW5mby0+ZWRkX3BhcmFtcy5oZWFkcyA+IDApIHsKKwkqY3lsaW5kZXIgPSAobGJhICUgZHJpdmVfaW5mby0+ZWRkX3BhcmFtcy5zZWN0b3JzX3Blcl90cmFjaykgKyAxOworCXRyYWNrID0gbGJhIC8gZHJpdmVfaW5mby0+ZWRkX3BhcmFtcy5zZWN0b3JzX3Blcl90cmFjazsKKwkqaGVhZCA9IHRyYWNrICUgZHJpdmVfaW5mby0+ZWRkX3BhcmFtcy5oZWFkczsKKwkqc2VjdG9yID0gdHJhY2sgLyBkcml2ZV9pbmZvLT5lZGRfcGFyYW1zLmhlYWRzOworICAgIH0gZWxzZSBpZiAoZHJpdmVfaW5mby0+Y2Jpb3MpIHsKKwkqY3lsaW5kZXIgPSAobGJhICUgZHJpdmVfaW5mby0+bGVnYWN5X3NlY3RvcnNfcGVyX3RyYWNrKSArIDE7CisJdHJhY2sgPSBsYmEgLyBkcml2ZV9pbmZvLT5sZWdhY3lfc2VjdG9yc19wZXJfdHJhY2s7CisJKmhlYWQgPSB0cmFjayAlIChkcml2ZV9pbmZvLT5sZWdhY3lfbWF4X2hlYWQgKyAxKTsKKwkqc2VjdG9yID0gdHJhY2sgLyAoZHJpdmVfaW5mby0+bGVnYWN5X21heF9oZWFkICsgMSk7CisgICAgfQorfQorCisvKioKKyAqIGRldGVjdF9leHRlbnNpb25zIC0gZGV0ZWN0IGlmIHdlIGNhbiB1c2UgZXh0ZW5zaW9ucworICoKKyAqIElOVCAxMyAtIElCTS9NUyBJTlQgMTMgRXh0ZW5zaW9ucyAtIElOU1RBTExBVElPTiBDSEVDSworICogICAgQUggPSA0MWgKKyAqICAgIEJYID0gNTVBQWgKKyAqICAgIERMID0gZHJpdmUgKDgwaC1GRmgpCisgKgorICogUmV0dXJuOiBDRiBzZXQgb24gZXJyb3IgKGV4dGVuc2lvbnMgbm90IHN1cHBvcnRlZCkKKyAqICAgIEFIID0gMDFoIChpbnZhbGlkIGZ1bmN0aW9uKQorICogICAgQ0YgY2xlYXIgaWYgc3VjY2Vzc2Z1bAorICogICAgQlggPSBBQTU1aCBpZiBpbnN0YWxsZWQKKyAqICAgIEFIID0gbWFqb3IgdmVyc2lvbiBvZiBleHRlbnNpb25zCisgKiAgICAgICAgMDFoID0gMS54CisgKiAgICAgICAgMjBoID0gMi4wIC8gRURELTEuMAorICogICAgICAgIDIxaCA9IDIuMSAvIEVERC0xLjEKKyAqICAgICAgICAzMGggPSBFREQtMy4wCisgKiAgICBBTCA9IGludGVybmFsIHVzZQorICogICAgQ1ggPSBBUEkgc3Vic2V0IHN1cHBvcnQgYml0bWFwIChzZWUgIzAwMjcxKQorICogICAgREggPSBleHRlbnNpb24gdmVyc2lvbiAodjIuMCsgPz8/IC0tIG5vdCBwcmVzZW50IGluIDEueCkKKyAqCisgKiBOb3RlOiB0aGUgUGhvZW5peCBFbmhhbmNlZCBEaXNrIERyaXZlIFNwZWNpZmljYXRpb24gdjEuMCB1c2VzIHZlcnNpb24gMi4wIG9mCisgKiAgICAgICB0aGUgSU5UIDEzIEV4dGVuc2lvbnMgQVBJCisgKgorICogQml0ZmllbGRzIGZvciBJQk0vTVMgSU5UIDEzIEV4dGVuc2lvbnMgQVBJIHN1cHBvcnQgYml0bWFwOgorICogQml0KHMpICAgIERlc2NyaXB0aW9uICAgIChUYWJsZSAwMDI3MSkKKyAqICAgICAwIGV4dGVuZGVkIGRpc2sgYWNjZXNzIGZ1bmN0aW9ucyAoQUg9NDJoLTQ0aCw0N2gsNDhoKSBzdXBwb3J0ZWQKKyAqICAgICAxIHJlbW92YWJsZSBkcml2ZSBjb250cm9sbGVyIGZ1bmN0aW9ucyAoQUg9NDVoLDQ2aCw0OGgsNDloLElOVCAxNS9BSD01MmgpCisgKiAgICAgICBzdXBwb3J0ZWQKKyAqICAgICAyIGVuaGFuY2VkIGRpc2sgZHJpdmUgKEVERCkgZnVuY3Rpb25zIChBSD00OGgsQUg9NEVoKSBzdXBwb3J0ZWQKKyAqICAgICAgIGV4dGVuZGVkIGRyaXZlIHBhcmFtZXRlciB0YWJsZSBpcyB2YWxpZCAoc2VlICMwMDI3MywjMDAyNzgpCisgKiAgICAgMy0xNSAgICByZXNlcnZlZCAoMCkKKyAqKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X2V4dGVuc2lvbnMoc3RydWN0IGRyaXZlaW5mbyAqZHJpdmVfaW5mbykKK3sKKyAgICBjb20zMnN5c190IGdldGViaW9zLCBlYmlvczsKKworICAgIG1lbXNldCgmZ2V0ZWJpb3MsIDAsIHNpemVvZiBnZXRlYmlvcyk7CisgICAgbWVtc2V0KCZlYmlvcywgMCwgc2l6ZW9mIGViaW9zKTsKKworICAgIGdldGViaW9zLmVmbGFncy5iWzBdID0gMHgzOwkvKiBDRiBzZXQgKi8KKyAgICBnZXRlYmlvcy5lYngud1swXSA9IDB4NTVhYTsKKyAgICBnZXRlYmlvcy5lZHguYlswXSA9IGRyaXZlX2luZm8tPmRpc2s7CisgICAgZ2V0ZWJpb3MuZWF4LmJbMV0gPSAweDQxOworCisgICAgX19pbnRjYWxsKDB4MTMsICZnZXRlYmlvcywgJmViaW9zKTsKKworICAgIGlmICghKGViaW9zLmVmbGFncy5sICYgRUZMQUdTX0NGKSAmJiBlYmlvcy5lYngud1swXSA9PSAweGFhNTUpIHsKKwlkcml2ZV9pbmZvLT5lYmlvcyA9IDE7CisJZHJpdmVfaW5mby0+ZWRkX3ZlcnNpb24gPSBlYmlvcy5lYXguYlsxXTsKKwlkcml2ZV9pbmZvLT5lZGRfZnVuY3Rpb25hbGl0eV9zdWJzZXQgPSBlYmlvcy5lY3gud1swXTsKKwlyZXR1cm4gMDsKKyAgICB9IGVsc2UKKwlyZXR1cm4gLTE7CQkvKiBEcml2ZSBkb2VzIG5vdCBleGlzdD8gKi8KK30KKworLyoqCisgKiBnZXRfZHJpdmVfcGFyYW1ldGVyc193aXRoX2V4dGVuc2lvbnMgLSByZXRyaWV2ZSBkaXNrIHBhcmFtZXRlcnMgdmlhIEFIPTQ4aAorICoKKyAqIElOVCAxMyAtIElCTS9NUyBJTlQgMTMgRXh0ZW5zaW9ucyAtIEdFVCBEUklWRSBQQVJBTUVURVJTCisgKiAgICAgQUggPSA0OGgKKyAqICAgICBETCA9IGRyaXZlICg4MGgtRkZoKQorICogICAgIERTOlNJIC0+IGJ1ZmZlciBmb3IgZHJpdmUgcGFyYW1ldGVycworICogUmV0dXJuOiBDRiBjbGVhciBpZiBzdWNjZXNzZnVsCisgKiAgICAgQUggPSAwMGgKKyAqICAgICBEUzpTSSBidWZmZXIgZmlsbGVkCisgKiAgICAgQ0Ygc2V0IG9uIGVycm9yCisgKiAgICAgQUggPSBlcnJvciBjb2RlIChzZWUgIzAwMjM0KQorICogQlVHOiBzZXZlcmFsIGRpZmZlcmVudCBDb21wYXEgQklPU2VzIGluY29ycmVjdGx5IHJlcG9ydCBoaWdoLW51bWJlcmVkCisgKiAgICAgZHJpdmVzIChzdWNoIGFzIDkwaCwgQjBoLCBEMGgsIGFuZCBGMGgpIGFzIHByZXNlbnQsIGdpdmluZyB0aGVtIHRoZQorICogICAgIHNhbWUgZ2VvbWV0cnkgYXMgZHJpdmUgODBoOyBhcyBhIHdvcmthcm91bmQsIHNjYW4gdGhyb3VnaCBkaXNrCisgKiAgICAgbnVtYmVycywgc3RvcHBpbmcgYXMgc29vbiBhcyB0aGUgbnVtYmVyIG9mIHZhbGlkIGRyaXZlcyBlbmNvdW50ZXJlZAorICogICAgIGVxdWFscyB0aGUgdmFsdWUgaW4gMDA0MGg6MDA3NWgKKyAqKi8KK3N0YXRpYyBpbnQgZ2V0X2RyaXZlX3BhcmFtZXRlcnNfd2l0aF9leHRlbnNpb25zKHN0cnVjdCBkcml2ZWluZm8gKmRyaXZlX2luZm8pCit7CisgICAgY29tMzJzeXNfdCBpbnJlZywgb3V0cmVnOworICAgIHN0cnVjdCBlZGRfZGV2aWNlX3BhcmFtZXRlcnMgKmRwOworCisgICAgbWVtc2V0KCZpbnJlZywgMCwgc2l6ZW9mIGlucmVnKTsKKworICAgIC8qCisgICAgICogVGhlIGNhbGxlciBzaGFsbCBzZXQgdGhpcyB2YWx1ZSB0byB0aGUgbWF4aW11bSBSZXN1bHQgQnVmZmVyCisgICAgICogbGVuZ3RoLCBpbiBieXRlcy4gSWYgdGhlIGxlbmd0aCBvZiB0aGlzIGJ1ZmZlciBpcyBsZXNzIHRoYW4gMzAKKyAgICAgKiBieXRlcywgdGhpcyBmdW5jdGlvbiBzaGFsbCBub3QgcmV0dXJuIHRoZSBwb2ludGVyIHRvIERyaXZlIFBhcmFtZXRlcgorICAgICAqIFRhYmxlIChEUFQpIGV4dGVuc2lvbi4gSWYgdGhlIGJ1ZmZlciBsZW5ndGggaXMgMzAgb3IgZ3JlYXRlciBvbgorICAgICAqIGVudHJ5LCBpdCBzaGFsbCBiZSBzZXQgdG8gMzAgb24gZXhpdC4gSWYgdGhlIGJ1ZmZlciBsZW5ndGggaXMKKyAgICAgKiBiZXR3ZWVuIDI2IGFuZCAyOSwgaXQgc2hhbGwgYmUgc2V0IHRvIDI2IG9uIGV4aXQuCisgICAgICogSWYgdGhlIGJ1ZmZlciBsZW5ndGggaXMgbGVzcyB0aGFuIDI2IG9uIGVudHJ5IGFuIGVycm9yIHNoYWxsIGJlCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgZHAgPSBsbWFsbG9jKHNpemVvZiAqZHApOworICAgIGlmICghZHApCisJcmV0dXJuIC0xOworCisgICAgZHAtPmxlbiA9IHNpemVvZihzdHJ1Y3QgZWRkX2RldmljZV9wYXJhbWV0ZXJzKTsKKworICAgIGlucmVnLmVzaS53WzBdID0gT0ZGUyhkcCk7CisgICAgaW5yZWcuZHMgPSBTRUcoZHApOworICAgIGlucmVnLmVkeC5iWzBdID0gZHJpdmVfaW5mby0+ZGlzazsKKyAgICBpbnJlZy5lYXguYlsxXSA9IDB4NDg7CisKKyAgICBfX2ludGNhbGwoMHgxMywgJmlucmVnLCAmb3V0cmVnKTsKKworICAgIC8qIENGIHNldCBvbiBlcnJvciAqLworICAgIGlmIChvdXRyZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpIHsKKwlsZnJlZShkcCk7CisJcmV0dXJuIG91dHJlZy5lYXguYlsxXTsKKyAgICB9CisKKyAgICBtZW1jcHkoJmRyaXZlX2luZm8tPmVkZF9wYXJhbXMsIGRwLCBzaXplb2YgZHJpdmVfaW5mby0+ZWRkX3BhcmFtcyk7CisgICAgbGZyZWUoZHApOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2V0X2RyaXZlX3BhcmFtZXRlcnNfd2l0aG91dF9leHRlbnNpb25zIC0gcmV0cmlldmUgZHJpdmUgcGFyYW1ldGVycyB2aWEgQUg9MDhoCisgKgorICogSU5UIDEzIC0gRElTSyAtIEdFVCBEUklWRSBQQVJBTUVURVJTIChQQyxYVDI4NixDT05WLFBTLEVTREksU0NTSSkKKyAqICAgICBBSCA9IDA4aAorICogICAgIERMID0gZHJpdmUgKGJpdCA3IHNldCBmb3IgaGFyZCBkaXNrKQorICoKKyAqIFJldHVybjogQ0Ygc2V0IG9uIGVycm9yCisgKiAgICAgQUggPSBzdGF0dXMgKDA3aCkgKHNlZSAjMDAyMzQpCisgKiAgICAgQ0YgY2xlYXIgaWYgc3VjY2Vzc2Z1bAorICogICAgIEFIID0gMDBoCisgKiAgICAgQUwgPSAwMGggb24gYXQgbGVhc3Qgc29tZSBCSU9TZXMKKyAqICAgICBCTCA9IGRyaXZlIHR5cGUgKEFUL1BTMiBmbG9wcGllcyBvbmx5KSAoc2VlICMwMDI0MikKKyAqICAgICBDSCA9IGxvdyBlaWdodCBiaXRzIG9mIG1heGltdW0gY3lsaW5kZXIgbnVtYmVyCisgKiAgICAgQ0wgPSBtYXhpbXVtIHNlY3RvciBudW1iZXIgKGJpdHMgNS0wKQorICogICAgICAgICAgaGlnaCB0d28gYml0cyBvZiBtYXhpbXVtIGN5bGluZGVyIG51bWJlciAoYml0cyA3LTYpCisgKiAgICAgREggPSBtYXhpbXVtIGhlYWQgbnVtYmVyCisgKiAgICAgREwgPSBudW1iZXIgb2YgZHJpdmVzCisgKiAgICAgRVM6REkgLT4gZHJpdmUgcGFyYW1ldGVyIHRhYmxlIChmbG9wcGllcyBvbmx5KQorICoKKyAqIE5vdGVzOgorICogICAtIG1heSByZXR1cm4gc3VjY2Vzc2Z1bCBldmVuIHRob3VnaCBzcGVjaWZpZWQgZHJpdmUgaXMgZ3JlYXRlciB0aGFuIHRoZQorICogICAgIG51bWJlciBvZiBhdHRhY2hlZCBkcml2ZXMgb2YgdGhhdCB0eXBlIChmbG9wcHkvaGFyZCk7IGNoZWNrIERMIHRvCisgKiAgICAgZW5zdXJlIHZhbGlkaXR5CisgKiAgIC0gZm9yIHN5c3RlbXMgcHJlZGF0aW5nIHRoZSBJQk0gQVQsIHRoaXMgY2FsbCBpcyBvbmx5IHZhbGlkIGZvciBoYXJkCisgKiAgICAgZGlza3MsIGFzIGl0IGlzIGltcGxlbWVudGVkIGJ5IHRoZSBoYXJkIGRpc2sgQklPUyByYXRoZXIgdGhhbiB0aGUKKyAqICAgICBST00gQklPUworICogICAtIFRvc2hpYmEgbGFwdG9wcyB3aXRoIEhhcmRSQU0gcmV0dXJuIERMPTAyaCB3aGVuIGNhbGxlZCB3aXRoIERMPTgwaCwKKyAqICAgICBidXQgZmFpbCBvbiBETD04MWguIFRoZSBCSU9TIGRhdGEgYXQgNDBoOjc1aCBjb3JyZWN0bHkgcmVwb3J0cyAwMWguCisgKiAgICAgbWF5IGluZGljYXRlIG9ubHkgdHdvIGRyaXZlcyBwcmVzZW50IGV2ZW4gaWYgbW9yZSBhcmUgYXR0YWNoZWQ7IHRvCisgKiAgICAgZW5zdXJlIGEgY29ycmVjdCBjb3VudCwgb25lIGNhbiB1c2UgQUg9MTVoIHRvIHNjYW4gdGhyb3VnaCBwb3NzaWJsZQorICogICAgIGRyaXZlcworICogICAtIGZvciBCSU9TZXMgd2hpY2ggcmVzZXJ2ZSB0aGUgbGFzdCBjeWxpbmRlciBmb3IgdGVzdGluZyBwdXJwb3NlcywgdGhlCisgKiAgICAgY3lsaW5kZXIgY291bnQgaXMgYXV0b21hdGljYWxseSBkZWNyZW1lbnRlZAorICogICAgIG9uIFBTLzFzIHdpdGggSUJNIFJPTSBET1MgNCwgbm9uZXhpc3RlbnQgZHJpdmVzIHJldHVybiBDRiBjbGVhciwKKyAqICAgICBCWD1DWD0wMDAwaCwgYW5kIEVTOkRJID0gMDAwMGg6MDAwMGgKKyAqICAgLSB0aGUgUEMtVG9vbHMgUENGT1JNQVQgcHJvZ3JhbSByZXF1aXJlcyB0aGF0IEFMPTAwaCBiZWZvcmUgaXQgd2lsbAorICogICAgIHByb2NlZWQgd2l0aCB0aGUgZm9ybWF0dGluZworICoKKyAqIEJVRzogc2V2ZXJhbCBkaWZmZXJlbnQgQ29tcGFxIEJJT1NlcyBpbmNvcnJlY3RseSByZXBvcnQgaGlnaC1udW1iZXJlZAorICogICAgICBkcml2ZXMgKHN1Y2ggYXMgOTBoLCBCMGgsIEQwaCwgYW5kIEYwaCkgYXMgcHJlc2VudCwgZ2l2aW5nIHRoZW0gdGhlCisgKiAgICAgIHNhbWUgZ2VvbWV0cnkgYXMgZHJpdmUgODBoOyBhcyBhIHdvcmthcm91bmQsIHNjYW4gdGhyb3VnaCBkaXNrCisgKiAgICAgIG51bWJlcnMsIHN0b3BwaW5nIGFzIHNvb24gYXMgdGhlIG51bWJlciBvZiB2YWxpZCBkcml2ZXMgZW5jb3VudGVyZWQKKyAqICAgICAgZXF1YWxzIHRoZSB2YWx1ZSBpbiAwMDQwaDowMDc1aAorICoKKyAqIFNlZUFsc286IEFIPTA2aCJBZGFwdGVjIixBSD0xM2giU3lRdWVzdCIsQUg9NDhoLEFIPTE1aCxJTlQgMUUKKyAqIFNlZUFsc286IElOVCA0MSJIQVJEIERJU0sgMCIKKyAqKi8KK3N0YXRpYyBpbnQgZ2V0X2RyaXZlX3BhcmFtZXRlcnNfd2l0aG91dF9leHRlbnNpb25zKHN0cnVjdCBkcml2ZWluZm8gKmRyaXZlX2luZm8pCit7CisgICAgY29tMzJzeXNfdCBnZXRwYXJtLCBwYXJtOworCisgICAgbWVtc2V0KCZnZXRwYXJtLCAwLCBzaXplb2YgZ2V0cGFybSk7CisgICAgbWVtc2V0KCZwYXJtLCAwLCBzaXplb2YgcGFybSk7CisKKyAgICAvKiBSYWxmIEJyb3duIHJlY29tbWVuZHMgc2V0dGluZyBFUzpESSB0byAwOjAgKi8KKyAgICBnZXRwYXJtLmVzaS53WzBdID0gMDsKKyAgICBnZXRwYXJtLmRzID0gMDsKKyAgICBnZXRwYXJtLmVkeC5iWzBdID0gZHJpdmVfaW5mby0+ZGlzazsKKyAgICBnZXRwYXJtLmVheC5iWzFdID0gMHgwODsKKworICAgIF9faW50Y2FsbCgweDEzLCAmZ2V0cGFybSwgJnBhcm0pOworCisgICAgLyogQ0Ygc2V0IG9uIGVycm9yICovCisgICAgaWYgKHBhcm0uZWZsYWdzLmwgJiBFRkxBR1NfQ0YpCisJcmV0dXJuIHBhcm0uZWF4LmJbMV07CisKKyAgICAvKiBETCBjb250YWlucyB0aGUgbWF4aW11bSBkcml2ZSBudW1iZXIgKGl0IHN0YXJ0cyBhdCAwKSAqLworICAgIGRyaXZlX2luZm8tPmxlZ2FjeV9tYXhfZHJpdmUgPSBwYXJtLmVkeC5iWzBdOworCisgICAgLy8gWFhYIGJyb2tlbgorICAgIC8qIERyaXZlIHNwZWNpZmllZCBncmVhdGVyIHRoYW4gdGhlIGJ1bWJlciBvZiBhdHRhY2hlZCBkcml2ZXMgKi8KKyAgICAvL2lmIChkcml2ZV9pbmZvLT5kaXNrID4gZHJpdmVfaW5mby0+ZHJpdmVzKQorICAgIC8vICAgICAgcmV0dXJuIC0xOworCisgICAgZHJpdmVfaW5mby0+bGVnYWN5X3R5cGUgPSBwYXJtLmVieC5iWzBdOworCisgICAgLyogREggY29udGFpbnMgdGhlIG1heGltdW0gaGVhZCBudW1iZXIgKGl0IHN0YXJ0cyBhdCAwKSAqLworICAgIGRyaXZlX2luZm8tPmxlZ2FjeV9tYXhfaGVhZCA9IHBhcm0uZWR4LmJbMV07CisKKyAgICAvKiBNYXhpbXVtIHNlY3RvciBudW1iZXIgKGJpdHMgNS0wKSBwZXIgdHJhY2sgKi8KKyAgICBkcml2ZV9pbmZvLT5sZWdhY3lfc2VjdG9yc19wZXJfdHJhY2sgPSBwYXJtLmVjeC5iWzBdICYgMHgzZjsKKworICAgIC8qCisgICAgICogTWF4aW11bSBjeWxpbmRlciBudW1iZXI6CisgICAgICogICAgIENIID0gbG93IGVpZ2h0IGJpdHMgb2YgbWF4aW11bSBjeWxpbmRlciBudW1iZXIKKyAgICAgKiAgICAgQ0wgPSBoaWdoIHR3byBiaXRzIG9mIG1heGltdW0gY3lsaW5kZXIgbnVtYmVyIChiaXRzIDctNikKKyAgICAgKi8KKyAgICBkcml2ZV9pbmZvLT5sZWdhY3lfbWF4X2N5bGluZGVyID0gcGFybS5lY3guYlsxXSArCisJKChwYXJtLmVjeC5iWzBdICYgMHhjMCkgPDwgMik7CisKKyAgICBpZiAoZHJpdmVfaW5mby0+bGVnYWN5X3NlY3RvcnNfcGVyX3RyYWNrID4gMCkKKwlkcml2ZV9pbmZvLT5jYmlvcyA9IDE7CS8qIFZhbGlkIGdlb21ldHJ5ICovCisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBnZXRfZHJpdmVfcGFyYW1ldGVycyAtIHJldHJpZXZlIGRyaXZlIHBhcmFtZXRlcnMKKyAqIEBkcml2ZV9pbmZvOgkJZHJpdmVpbmZvIHN0cnVjdHVyZSB0byBmaWxsCisgKiovCitpbnQgZ2V0X2RyaXZlX3BhcmFtZXRlcnMoc3RydWN0IGRyaXZlaW5mbyAqZHJpdmVfaW5mbykKK3sKKyAgICBpbnQgcmV0dXJuX2NvZGU7CisKKyAgICBpZiAoZGV0ZWN0X2V4dGVuc2lvbnMoZHJpdmVfaW5mbykpCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuX2NvZGUgPSBnZXRfZHJpdmVfcGFyYW1ldGVyc193aXRob3V0X2V4dGVuc2lvbnMoZHJpdmVfaW5mbyk7CisKKyAgICAvKiBJZiBnZW9tZXRyeSBpc24ndCB2YWxpZCwgbm8gbmVlZCB0byB0cnkgdG8gZ2V0IG1vcmUgaW5mbyBhYm91dCB0aGUgZHJpdmUgKi8KKyAgICAvKiBMb29rcyBsaWtlIGluIGNhbiBjb25mdXNlIHNvbWUgb3B0aWNhbCBkcml2ZXMgKi8KKyAgICBpZiAoZHJpdmVfaW5mby0+ZWJpb3MgJiYgZHJpdmVfaW5mby0+Y2Jpb3MpCisJZ2V0X2RyaXZlX3BhcmFtZXRlcnNfd2l0aF9leHRlbnNpb25zKGRyaXZlX2luZm8pOworCisgICAgcmV0dXJuIHJldHVybl9jb2RlOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsbGliL2Rpc2svbGFiZWxzLmMgYi9jb20zMi9ncGxsaWIvZGlzay9sYWJlbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdmZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL2Rpc2svbGFiZWxzLmMKQEAgLTAsMCArMSw3MDEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFN5c2xpbnV4LCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkIGdldF9sYWJlbChpbnQgbGFiZWwsIGNoYXIgKipidWZmZXJfbGFiZWwpCit7CisgICAgaW50IGJ1ZmZlcl9zaXplID0gKDgwICogc2l6ZW9mKGNoYXIpKTsKKyAgICBjaGFyICpidWZmZXIgPSBtYWxsb2MoYnVmZmVyX3NpemUpOworICAgICpidWZmZXJfbGFiZWwgPSBidWZmZXI7CisKKyAgICBzd2l0Y2ggKGxhYmVsKSB7CisgICAgY2FzZSAweDAxOgorCXN0cmxjcHkoYnVmZmVyLCAiRE9TIDEyLWJpdCBmYXQiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDAyOgorCXN0cmxjcHkoYnVmZmVyLCAiWEVOSVggcm9vdCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MDM6CisJc3RybGNweShidWZmZXIsICJYRU5JWCAvdXNyIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgwNDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkRPUyAzLjArIDE2LWJpdCBGQVQgKHVwIHRvIDMyTSkiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDA1OgorCXN0cmxjcHkoYnVmZmVyLCAiRE9TIDMuMysgRXh0ZW5kZWQgUGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgwNjoKKwlzdHJsY3B5KGJ1ZmZlciwgIkRPUyAzLjMxKyAxNi1iaXQgRkFUIChvdmVyIDMyTSkiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDA3OgorCXN0cmxjcHkoYnVmZmVyLCAiTlRGUy9leEZBVC9IUEZTIiwgYnVmZmVyX3NpemUpOworCS8vY2FzZSAweDA3OiBzdHJsY3B5KGJ1ZmZlciwgIkFkdmFuY2VkIFVuaXgiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCS8vY2FzZSAweDA3OiBzdHJsY3B5KGJ1ZmZlciwgIldpbmRvd3MgTlQgTlRGUyIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJLy9jYXNlIDB4MDc6IHN0cmxjcHkoYnVmZmVyLCAiUU5YMi54IChwcmUtMTk4OCkiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMHgwODoKKwlzdHJsY3B5KGJ1ZmZlciwgIkFJWCIsIGJ1ZmZlcl9zaXplKTsKKwkvL2Nhc2UgMHgwODogc3RybGNweShidWZmZXIsICJBSVggYm9vdCBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCS8vY2FzZSAweDA4OiBzdHJsY3B5KGJ1ZmZlciwgIlNwbGl0RHJpdmUiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCS8vY2FzZSAweDA4OiBzdHJsY3B5KGJ1ZmZlciwgIkRFTEwgcGFydGl0aW9uIHNwYW5uaW5nIG11bHRpcGxlIGRyaXZlcyIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJLy9jYXNlIDB4MDg6IHN0cmxjcHkoYnVmZmVyLCAiQ29tbW9kb3JlIERPUyIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJLy9jYXNlIDB4MDg6IHN0cmxjcHkoYnVmZmVyLCAiUU5YIDEueCBhbmQgMi54ICgicW55IikiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMHgwOToKKwlzdHJsY3B5KGJ1ZmZlciwgIkFJWCBib290YWJsZSBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJLy9jYXNlIDB4MDk6IHN0cmxjcHkoYnVmZmVyLCAiQ29oZXJlbnQgZmlsZXN5c3RlbSIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJLy9jYXNlIDB4MDk6IHN0cmxjcHkoYnVmZmVyLCAiUU5YIDEueCBhbmQgMi54ICgicW56IikiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMHgwYToKKwlzdHJsY3B5KGJ1ZmZlciwgIk9TLzIgQm9vdCBNYW5hZ2VyIiwgYnVmZmVyX3NpemUpOworCS8vY2FzZSAweDBhOiBzdHJsY3B5KGJ1ZmZlciwgIkNvaGVyZW50IHN3YXAgcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwkvL2Nhc2UgMHgwYTogc3RybGNweShidWZmZXIsICJPUFVTIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4MGI6CisJc3RybGNweShidWZmZXIsICJXSU45NSBPU1IyIDMyLWJpdCBGQVQiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDBjOgorCXN0cmxjcHkoYnVmZmVyLCAiV0lOOTUgT1NSMiAzMi1iaXQgRkFULCBMQkEtbWFwcGVkIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgwZToKKwlzdHJsY3B5KGJ1ZmZlciwgIldJTjk1OiBET1MgMTYtYml0IEZBVCwgTEJBLW1hcHBlZCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MGY6CisJc3RybGNweShidWZmZXIsICJXSU45NTogRXh0ZW5kZWQgcGFydGl0aW9uLCBMQkEtbWFwcGVkIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgxMDoKKwlzdHJsY3B5KGJ1ZmZlciwgIk9QVVMiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDExOgorCXN0cmxjcHkoYnVmZmVyLCAiSGlkZGVuIERPUyAxMi1iaXQgRkFUIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgxMjoKKwlzdHJsY3B5KGJ1ZmZlciwgIkNvbXBhcSBkaWFnbm9zdGljIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MTQ6CisJc3RybGNweShidWZmZXIsICJIaWRkZW4gRE9TIDE2LWJpdCBGQVQgPDMyTSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MTY6CisJc3RybGNweShidWZmZXIsICJIaWRkZW4gRE9TIDE2LWJpdCBGQVQgPj0zMk0iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDE3OgorCXN0cmxjcHkoYnVmZmVyLCAiSGlkZGVuIEhQRlMvZXhGQVQvTlRGUyIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MTg6CisJc3RybGNweShidWZmZXIsICJBU1QgU21hcnRTbGVlcCBQYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDE5OgorCXN0cmxjcHkoYnVmZmVyLCAiVW51c2VkIChDbGFpbWVkIGZvciBXaWxsb3d0ZWNoIFBob3RvbiBDT1MpIiwKKwkJYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgxYjoKKwlzdHJsY3B5KGJ1ZmZlciwgIkhpZGRlbiBXSU45NSBPU1IyIDMyLWJpdCBGQVQiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDFjOgorCXN0cmxjcHkoYnVmZmVyLCAiSGlkZGVuIFdJTjk1IE9TUjIgMzItYml0IEZBVCwgTEJBLW1hcHBlZCIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MWU6CisJc3RybGNweShidWZmZXIsICJIaWRkZW4gV0lOOTUgMTYtYml0IEZBVCwgTEJBLW1hcHBlZCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MjA6CisJc3RybGNweShidWZmZXIsICJVbnVzZWQiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDIxOgorCXN0cmxjcHkoYnVmZmVyLCAiUmVzZXJ2ZWQiLCBidWZmZXJfc2l6ZSk7CisJLy9jYXNlIDB4MjE6IHN0cmxjcHkoYnVmZmVyLCAiVW51c2VkIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4MjI6CisJc3RybGNweShidWZmZXIsICJVbnVzZWQiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDIzOgorCXN0cmxjcHkoYnVmZmVyLCAiUmVzZXJ2ZWQiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDI0OgorCXN0cmxjcHkoYnVmZmVyLCAiTkVDIERPUyAzLngiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDI2OgorCXN0cmxjcHkoYnVmZmVyLCAiUmVzZXJ2ZWQiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDI3OgorCXN0cmxjcHkoYnVmZmVyLCAiUFFTZXJ2aWNlIChBY2VyIGxhcHRvcCBoaWRkZW4gcmVzY3VlIHBhcnRpdGlvbikiLCBidWZmZXJfc2l6ZSk7CisJLy9XaW5kb3dzIFJFIGhpZGRlbiBwYXJ0aXRpb24KKwkvL01pck9TIEJTRCBwYXJ0aXRpb24KKwkvL1JvdXRlckJPT1Qga2VybmVsIHBhcnRpdGlvbgorCWJyZWFrOworICAgIGNhc2UgMHgyYToKKwlzdHJsY3B5KGJ1ZmZlciwgIkF0aGVPUyBGaWxlIFN5c3RlbSAoQUZTKSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MmI6CisJc3RybGNweShidWZmZXIsICJTeWxsYWJsZVNlY3VyZSAoU3lsU3RvcikiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDMxOgorCXN0cmxjcHkoYnVmZmVyLCAiUmVzZXJ2ZWQiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDMyOgorCXN0cmxjcHkoYnVmZmVyLCAiTk9TIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgzMzoKKwlzdHJsY3B5KGJ1ZmZlciwgIlJlc2VydmVkIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgzNDoKKwlzdHJsY3B5KGJ1ZmZlciwgIlJlc2VydmVkIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgzNToKKwlzdHJsY3B5KGJ1ZmZlciwgIkpGUyBvbiBPUy8yIG9yIGVDUyIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MzY6CisJc3RybGNweShidWZmZXIsICJSZXNlcnZlZCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4Mzg6CisJc3RybGNweShidWZmZXIsICJUSEVPUyB2ZXIgMy4yIDJnYiBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDM5OgorCXN0cmxjcHkoYnVmZmVyLCAiUGxhbiA5IHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwkvL2Nhc2UgMHgzOTogc3RybGNweShidWZmZXIsICJUSEVPUyB2ZXIgNCBzcGFubmVkIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJYnJlYWs7CisgICAgY2FzZSAweDNhOgorCXN0cmxjcHkoYnVmZmVyLCAiVEhFT1MgdmVyIDQgNGdiIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4M2I6CisJc3RybGNweShidWZmZXIsICJUSEVPUyB2ZXIgNCBleHRlbmRlZCBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDNjOgorCXN0cmxjcHkoYnVmZmVyLCAiUGFydGl0aW9uTWFnaWMgcmVjb3ZlcnkgcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHgzZDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkhpZGRlbiBOZXRXYXJlIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg0MDoKKwlzdHJsY3B5KGJ1ZmZlciwgIlZlbml4IDgwMjg2IiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg0MToKKwlzdHJsY3B5KGJ1ZmZlciwgIlBQQyBQUmVQIEJvb3QiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCS8vY2FzZSAweDQxOiBzdHJsY3B5KGJ1ZmZlciwgIlBlcnNvbmFsIFJJU0MgQm9vdCIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJLy8gc3RybGNweShidWZmZXIsICJMaW51eC9NSU5JWCAoc2hhcmluZyBkaXNrIHdpdGggRFJET1MpIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg0MjoKKwlzdHJsY3B5KGJ1ZmZlciwgIlNGUyAoU2VjdXJlIEZpbGVzeXN0ZW0pIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwkvLyBzdHJsY3B5KGJ1ZmZlciwgIkxpbnV4IHN3YXAgKHNoYXJpbmcgZGlzayB3aXRoIERSRE9TKSIsIGJ1ZmZlcl9zaXplKTsKKwkvL2Nhc2UgMHg0Mjogc3RybGNweShidWZmZXIsICJXaW5kb3dzIDIwMDAgbWFya2VyIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4NDM6CisJc3RybGNweShidWZmZXIsICJMaW51eCBuYXRpdmUgKHNoYXJpbmcgZGlzayB3aXRoIERSRE9TKSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4NDQ6CisJc3RybGNweShidWZmZXIsICJHb0JhY2sgcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg0NToKKwlzdHJsY3B5KGJ1ZmZlciwgIkJvb3QtVVMgYm9vdCBtYW5hZ2VyIiwgYnVmZmVyX3NpemUpOworCS8vY2FzZSAweDQ1OiBzdHJsY3B5KGJ1ZmZlciwgIlByaWFtIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwkvL2Nhc2UgMHg0NTogc3RybGNweShidWZmZXIsICJFVU1FTC9FbGFuIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4NDY6CisJc3RybGNweShidWZmZXIsICJFVU1FTC9FbGFuIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg0NzoKKwlzdHJsY3B5KGJ1ZmZlciwgIkVVTUVML0VsYW4iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDQ4OgorCXN0cmxjcHkoYnVmZmVyLCAiRVVNRUwvRWxhbiIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4NGE6CisJc3RybGNweShidWZmZXIsICJBZGFPUyBBcXVpbGEgKERlZmF1bHQpIiwgYnVmZmVyX3NpemUpOworCS8vY2FzZSAweDRhOiBzdHJsY3B5KGJ1ZmZlciwgIkFMRlMvVEhJTiBsaWdodHdlaWdodCBmaWxlc3lzdGVtIGZvciBET1MiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMHg0YzoKKwlzdHJsY3B5KGJ1ZmZlciwgIk9iZXJvbiBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDRkOgorCXN0cmxjcHkoYnVmZmVyLCAiUU5YNC54IiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg0ZToKKwlzdHJsY3B5KGJ1ZmZlciwgIlFOWDQueCAybmQgcGFydCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4NGY6CisJc3RybGNweShidWZmZXIsICJRTlg0LnggM3JkIHBhcnQiLCBidWZmZXJfc2l6ZSk7CisJLy9jYXNlIDB4NGY6IHN0cmxjcHkoYnVmZmVyLCAiT2Jlcm9uIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJYnJlYWs7CisgICAgY2FzZSAweDUwOgorCXN0cmxjcHkoYnVmZmVyLCAiT25UcmFjayBEaXNrIE1hbmFnZXIgKG9sZGVyIHZlcnNpb25zKSBSTyIsCisJCWJ1ZmZlcl9zaXplKTsKKwkvL2Nhc2UgMHg1MDogc3RybGNweShidWZmZXIsICJMeW54IFJUT1MiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCS8vY2FzZSAweDUwOiBzdHJsY3B5KGJ1ZmZlciwgIk5hdGl2ZSBPYmVyb24gKGFsdCkiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMHg1MToKKwlzdHJsY3B5KGJ1ZmZlciwgIk9uVHJhY2sgRGlzayBNYW5hZ2VyIFJXIChETTYgQXV4MSkiLCBidWZmZXJfc2l6ZSk7CisJLy9jYXNlIDB4NTE6IHN0cmxjcHkoYnVmZmVyLCAiTm92ZWxsIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4NTI6CisJc3RybGNweShidWZmZXIsICJDUC9NIiwgYnVmZmVyX3NpemUpOworCS8vY2FzZSAweDUyOiBzdHJsY3B5KGJ1ZmZlciwgIk1pY3JvcG9ydCBTeXNWL0FUIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4NTM6CisJc3RybGNweShidWZmZXIsICJEaXNrIE1hbmFnZXIgNi4wIEF1eDMiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDU0OgorCXN0cmxjcHkoYnVmZmVyLCAiRGlzayBNYW5hZ2VyIDYuMCBEeW5hbWljIERyaXZlIE92ZXJsYXkiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDU1OgorCXN0cmxjcHkoYnVmZmVyLCAiRVotRHJpdmUiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDU2OgorCXN0cmxjcHkoYnVmZmVyLCAiR29sZGVuIEJvdyBWRmVhdHVyZSBQYXJ0aXRpb25lZCBWb2x1bWUuIiwgYnVmZmVyX3NpemUpOworCS8vY2FzZSAweDU2OiBzdHJsY3B5KGJ1ZmZlciwgIkRNIGNvbnZlcnRlZCB0byBFWi1CSU9TIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4NTc6CisJc3RybGNweShidWZmZXIsICJEcml2ZVBybyIsIGJ1ZmZlcl9zaXplKTsKKwkvL2Nhc2UgMHg1Nzogc3RybGNweShidWZmZXIsICJWTkRJIFBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJYnJlYWs7CisgICAgY2FzZSAweDVjOgorCXN0cmxjcHkoYnVmZmVyLCAiUHJpYW0gRURpc2siLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDYxOgorCXN0cmxjcHkoYnVmZmVyLCAiU3BlZWRTdG9yIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg2MzoKKwlzdHJsY3B5KGJ1ZmZlciwKKwkJIlVuaXggU3lzdGVtIFYgKFNDTywgSVNDIFVuaXgsIFVuaXhXYXJlLCAuLi4pLCBNYWNoLCBHTlUgSHVyZCIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4NjQ6CisJc3RybGNweShidWZmZXIsICJOb3ZlbGwgTmV0d2FyZSAyODYsIDIueHgiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCS8vc3RybGNweShidWZmZXIsICJQQy1BUk1PVVIgcHJvdGVjdGVkIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4NjU6CisJc3RybGNweShidWZmZXIsICJOb3ZlbGwgTmV0d2FyZSAzODYsIDMueHggb3IgNC54eCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4NjY6CisJc3RybGNweShidWZmZXIsICJOb3ZlbGwgTmV0d2FyZSBTTVMgUGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg2NzoKKwlzdHJsY3B5KGJ1ZmZlciwgIk5vdmVsbCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4Njg6CisJc3RybGNweShidWZmZXIsICJOb3ZlbGwiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDY5OgorCXN0cmxjcHkoYnVmZmVyLCAiTm92ZWxsIE5ldHdhcmUgNSssIE5vdmVsbCBOZXR3YXJlIE5TUyBQYXJ0aXRpb24iLAorCQlidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDcwOgorCXN0cmxjcHkoYnVmZmVyLCAiRGlza1NlY3VyZSBNdWx0aS1Cb290IiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg3MToKKwlzdHJsY3B5KGJ1ZmZlciwgIlJlc2VydmVkIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg3MjoKKwlzdHJsY3B5KGJ1ZmZlciwgIlY3L3g4NiIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4NzM6CisJc3RybGNweShidWZmZXIsICJSZXNlcnZlZCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4NzQ6CisJLy9zdHJsY3B5KGJ1ZmZlciwgIlJlc2VydmVkIiwgYnVmZmVyX3NpemUpOworCXN0cmxjcHkoYnVmZmVyLCAiU2NyYW1kaXNrIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisgICAgY2FzZSAweDc1OgorCXN0cmxjcHkoYnVmZmVyLCAiSUJNIFBDL0lYIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg3NjoKKwlzdHJsY3B5KGJ1ZmZlciwgIlJlc2VydmVkIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg3NzoKKwlzdHJsY3B5KGJ1ZmZlciwgIk0yRlMvTTJDUyBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisJLy9jYXNlIDB4Nzc6IHN0cmxjcHkoYnVmZmVyLCAiVk5ESSBQYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworICAgIGNhc2UgMHg3ODoKKwlzdHJsY3B5KGJ1ZmZlciwgIlhPU0wgRlMiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDdFOgorCXN0cmxjcHkoYnVmZmVyLCAiVW51c2VkIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg4MDoKKwlzdHJsY3B5KGJ1ZmZlciwgIk1JTklYIHVudGlsIDEuNGEiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDgxOgorCXN0cmxjcHkoYnVmZmVyLCAiTUlOSVggc2luY2UgMS40YiwgZWFybHkgTGludXgiLCBidWZmZXJfc2l6ZSk7CisJLy9jYXNlIDB4ODE6IHN0cmxjcHkoYnVmZmVyLCAiTWl0YWMgZGlzayBtYW5hZ2VyIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4ODI6CisJc3RybGNweShidWZmZXIsICJMaW51eCBzd2FwIiwgYnVmZmVyX3NpemUpOworCS8vY2FzZSAweDgyOiBzdHJsY3B5KGJ1ZmZlciwgIlByaW1lIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwkvL2Nhc2UgMHg4Mjogc3RybGNweShidWZmZXIsICJTb2xhcmlzIHg4NiIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJYnJlYWs7CisgICAgY2FzZSAweDgzOgorCXN0cmxjcHkoYnVmZmVyLCAiTGludXggbmF0aXZlICh1c3VhbGx5IGV4dDJmcykiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDg0OgorCXN0cmxjcHkoYnVmZmVyLCAiT1MvMiBoaWRkZW4gQzogZHJpdmUiLCBidWZmZXJfc2l6ZSk7CisJLy9jYXNlIDB4ODQ6IHN0cmxjcHkoYnVmZmVyLCAiSGliZXJuYXRpb24gcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4ODU6CisJc3RybGNweShidWZmZXIsICJMaW51eCBleHRlbmRlZCBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDg2OgorCXN0cmxjcHkoYnVmZmVyLCAiTlRGUyB2b2x1bWUgc2V0IiwgYnVmZmVyX3NpemUpOworCS8vY2FzZSAweDg2OiBzdHJsY3B5KGJ1ZmZlciwgIk9sZCBMaW51eCBSQUlEIHBhcnRpdGlvbiBzdXBlcmJsb2NrIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4ODc6CisJc3RybGNweShidWZmZXIsICJOVEZTIHZvbHVtZSBzZXQiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDg4OgorCXN0cmxjcHkoYnVmZmVyLCAiTGludXggUGxhaW50ZXh0IiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg4YToKKwlzdHJsY3B5KGJ1ZmZlciwgIkxpbnV4IEtlcm5lbCBQYXJ0aXRpb24gKHVzZWQgYnkgQWlSLUJPT1QpIiwKKwkJYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg4YjoKKwlzdHJsY3B5KGJ1ZmZlciwgIkxlZ2FjeSBGYXVsdCBUb2xlcmFudCBGQVQzMiB2b2x1bWUiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDhjOgorCXN0cmxjcHkoYnVmZmVyLAorCQkiTGVnYWN5IEZhdWx0IFRvbGVyYW50IEZBVDMyIHZvbHVtZSB1c2luZyBCSU9TIGV4dGQgSU5UIDEzaCIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4OGQ6CisJc3RybGNweShidWZmZXIsICJGcmVlIEZESVNLIGhpZGRlbiBQcmltYXJ5IERPUyBGQVQxMiBwYXJ0aXRpdGlvbiIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4OGU6CisJc3RybGNweShidWZmZXIsICJMaW51eCBMVk0gcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg5MDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkZyZWUgRkRJU0sgaGlkZGVuIFByaW1hcnkgRE9TIEZBVDE2IHBhcnRpdGl0aW9uIiwKKwkJYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg5MToKKwlzdHJsY3B5KGJ1ZmZlciwgIkZyZWUgRkRJU0sgaGlkZGVuIERPUyBleHRlbmRlZCBwYXJ0aXRpdGlvbiIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4OTI6CisJc3RybGNweShidWZmZXIsICJGcmVlIEZESVNLIGhpZGRlbiBQcmltYXJ5IERPUyBsYXJnZSBGQVQxNiBwYXJ0aXRpdGlvbiIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4OTM6CisJc3RybGNweShidWZmZXIsICJIaWRkZW4gTGludXggbmF0aXZlIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwkvL2Nhc2UgMHg5Mzogc3RybGNweShidWZmZXIsICJBbW9lYmEiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMHg5NDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkFtb2ViYSBiYWQgYmxvY2sgdGFibGUiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDk1OgorCXN0cmxjcHkoYnVmZmVyLCAiTUlUIEVYT1BDIG5hdGl2ZSBwYXJ0aXRpb25zIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHg5NjoKKwlzdHJsY3B5KGJ1ZmZlciwgIkNIUlAgSVNPLTk2NjAgZmlsZXN5c3RlbSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4OTc6CisJc3RybGNweShidWZmZXIsICJGcmVlIEZESVNLIGhpZGRlbiBQcmltYXJ5IERPUyBGQVQzMiBwYXJ0aXRpdGlvbiIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4OTg6CisJc3RybGNweShidWZmZXIsICJGcmVlIEZESVNLIGhpZGRlbiBQcmltYXJ5IERPUyBGQVQzMiBwYXJ0aXRpdGlvbiAoTEJBKSIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4OTk6CisJc3RybGNweShidWZmZXIsICJEQ0UzNzYgbG9naWNhbCBkcml2ZSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4OWE6CisJc3RybGNweShidWZmZXIsICJGcmVlIEZESVNLIGhpZGRlbiBQcmltYXJ5IERPUyBGQVQxNiBwYXJ0aXRpdGlvbiAoTEJBKSIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4OWI6CisJc3RybGNweShidWZmZXIsICJGcmVlIEZESVNLIGhpZGRlbiBET1MgZXh0ZW5kZWQgcGFydGl0aXRpb24gKExCQSkiLAorCQlidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDllOgorCXN0cmxjcHkoYnVmZmVyLCAiRm9ydGhPUyBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweDlmOgorCXN0cmxjcHkoYnVmZmVyLCAiQlNEL09TIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhhMDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkxhcHRvcCBoaWJlcm5hdGlvbiBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGExOgorCXN0cmxjcHkoYnVmZmVyLCAiTGFwdG9wIGhpYmVybmF0aW9uIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwkvL2Nhc2UgMHhhMTogc3RybGNweShidWZmZXIsICJIUCBWb2x1bWUgRXhwYW5zaW9uIChTcGVlZFN0b3IgdmFyaWFudCkiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMHhhMzoKKwlzdHJsY3B5KGJ1ZmZlciwgIkhQIFZvbHVtZSBFeHBhbnNpb24gKFNwZWVkU3RvciB2YXJpYW50KSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YTQ6CisJc3RybGNweShidWZmZXIsICJIUCBWb2x1bWUgRXhwYW5zaW9uIChTcGVlZFN0b3IgdmFyaWFudCkiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGE1OgorCXN0cmxjcHkoYnVmZmVyLCAiQlNELzM4NiwgMzg2QlNELCBOZXRCU0QsIEZyZWVCU0QiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGE2OgorCXN0cmxjcHkoYnVmZmVyLCAiT3BlbkJTRCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YTc6CisJc3RybGNweShidWZmZXIsICJOZVhUU1RFUCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YTg6CisJc3RybGNweShidWZmZXIsICJNYWMgT1MtWCIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YTk6CisJc3RybGNweShidWZmZXIsICJOZXRCU0QiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGFhOgorCXN0cmxjcHkoYnVmZmVyLCAiT2xpdmV0dGkgRmF0IDEyIDEuNDRNYiBTZXJ2aWNlIFBhcnRpdGlvbiIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YWI6CisJc3RybGNweShidWZmZXIsICJNYWMgT1MtWCBCb290IHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwkvL2Nhc2UgMHhhYjogc3RybGNweShidWZmZXIsICJHTyEgcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4YWU6CisJc3RybGNweShidWZmZXIsICJTaGFnT1MgZmlsZXN5c3RlbSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YWY6CisJc3RybGNweShidWZmZXIsICJTaGFnT1Mgc3dhcCBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGIwOgorCXN0cmxjcHkoYnVmZmVyLCAiQm9vdFN0YXIgRHVtbXkiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGIxOgorCXN0cmxjcHkoYnVmZmVyLCAiSFAgVm9sdW1lIEV4cGFuc2lvbiAoU3BlZWRTdG9yIHZhcmlhbnQpIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhiMjoKKwlzdHJsY3B5KGJ1ZmZlciwgIlFOWCBOZXV0cmlubyBQb3dlci1TYWZlIGZpbGVzeXN0ZW0iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGIzOgorCXN0cmxjcHkoYnVmZmVyLCAiSFAgVm9sdW1lIEV4cGFuc2lvbiAoU3BlZWRTdG9yIHZhcmlhbnQpIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhiNDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkhQIFZvbHVtZSBFeHBhbnNpb24gKFNwZWVkU3RvciB2YXJpYW50KSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YjY6CisJc3RybGNweShidWZmZXIsICJIUCBWb2x1bWUgRXhwYW5zaW9uIChTcGVlZFN0b3IgdmFyaWFudCkiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGI3OgorCXN0cmxjcHkoYnVmZmVyLCAiQlNESSBCU0QvMzg2IGZpbGVzeXN0ZW0iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGI4OgorCXN0cmxjcHkoYnVmZmVyLCAiQlNESSBCU0QvMzg2IHN3YXAgcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhiYjoKKwlzdHJsY3B5KGJ1ZmZlciwgIkJvb3QgV2l6YXJkIGhpZGRlbiIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YmM6CisJc3RybGNweShidWZmZXIsICJBY3JvbmlzIGJhY2t1cCBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGJlOgorCXN0cmxjcHkoYnVmZmVyLCAiU29sYXJpcyA4IGJvb3QgcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhiZjoKKwlzdHJsY3B5KGJ1ZmZlciwgIlNvbGFyaXMgcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhjMDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkNUT1MiLCBidWZmZXJfc2l6ZSk7CisJLy9jYXNlIDB4YzA6IHN0cmxjcHkoYnVmZmVyLCAiUkVBTC8zMiBzZWN1cmUgc21hbGwgcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwkvL2Nhc2UgMHhjMDogc3RybGNweShidWZmZXIsICJOVEZUIFBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJYnJlYWs7CisgICAgY2FzZSAweGMxOgorCXN0cmxjcHkoYnVmZmVyLCAiRFJET1Mvc2VjdXJlZCAoRkFULTEyKSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YzI6CisJc3RybGNweShidWZmZXIsICJIaWRkZW4gTGludXgiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCS8vc3RybGNweShidWZmZXIsICJSZXNlcnZlZCBmb3IgRFItRE9TIDcrIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhjMzoKKwlzdHJsY3B5KGJ1ZmZlciwgIkhpZGRlbiBMaW51eCBzd2FwIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhjNDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkRSRE9TL3NlY3VyZWQgKEZBVC0xNiwgPCAzMk0pIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhjNToKKwlzdHJsY3B5KGJ1ZmZlciwgIkRSRE9TL3NlY3VyZWQgKGV4dGVuZGVkKSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4YzY6CisJc3RybGNweShidWZmZXIsICJEUkRPUy9zZWN1cmVkIChGQVQtMTYsID49IDMyTSkiLCBidWZmZXJfc2l6ZSk7CisJLy9jYXNlIDB4YzY6IHN0cmxjcHkoYnVmZmVyLCAiV2luZG93cyBOVCBjb3JydXB0ZWQgRkFUMTYgdm9sdW1lL3N0cmlwZSBzZXQiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMHhjNzoKKwlzdHJsY3B5KGJ1ZmZlciwgIldpbmRvd3MgTlQgY29ycnVwdGVkIE5URlMgdm9sdW1lL3N0cmlwZSBzZXQiLAorCQlidWZmZXJfc2l6ZSk7CisJLy9jYXNlIDB4Yzc6IHN0cmxjcHkoYnVmZmVyLCAiU3lyaW54IGJvb3QiLCBidWZmZXJfc2l6ZSk7IGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMHhjODoKKwlzdHJsY3B5KGJ1ZmZlciwgIlJlc2VydmVkIGZvciBEUi1ET1MgOC4wKyIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4Yzk6CisJc3RybGNweShidWZmZXIsICJSZXNlcnZlZCBmb3IgRFItRE9TIDguMCsiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGNhOgorCXN0cmxjcHkoYnVmZmVyLCAiUmVzZXJ2ZWQgZm9yIERSLURPUyA4LjArIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhjYjoKKwlzdHJsY3B5KGJ1ZmZlciwgInJlc2VydmVkIGZvciBEUkRPUy9zZWN1cmVkIChGQVQzMikiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGNjOgorCXN0cmxjcHkoYnVmZmVyLCAicmVzZXJ2ZWQgZm9yIERSRE9TL3NlY3VyZWQgKEZBVDMyLCBMQkEpIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhjZDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkNUT1MgTWVtZHVtcD8iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGNlOgorCXN0cmxjcHkoYnVmZmVyLCAicmVzZXJ2ZWQgZm9yIERSRE9TL3NlY3VyZWQgKEZBVDE2LCBMQkEpIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhjZjoKKwlzdHJsY3B5KGJ1ZmZlciwgIkRSLURPUyA3LjA0KyBzZWN1cmVkIEVYVCBET1MgKExCQSkiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGQwOgorCXN0cmxjcHkoYnVmZmVyLCAiUkVBTC8zMiBzZWN1cmUgYmlnIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZDE6CisJc3RybGNweShidWZmZXIsICJPbGQgTXVsdGl1c2VyIERPUyBzZWN1cmVkIEZBVDEyIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhkNDoKKwlzdHJsY3B5KGJ1ZmZlciwgIk9sZCBNdWx0aXVzZXIgRE9TIHNlY3VyZWQgRkFUMTYgPDMyTSIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZDU6CisJc3RybGNweShidWZmZXIsICJPbGQgTXVsdGl1c2VyIERPUyBzZWN1cmVkIGV4dGVuZGVkIHBhcnRpdGlvbiIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZDY6CisJc3RybGNweShidWZmZXIsICJPbGQgTXVsdGl1c2VyIERPUyBzZWN1cmVkIEZBVDE2ID49MzJNIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhkODoKKwlzdHJsY3B5KGJ1ZmZlciwgIkNQL00tODYiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGRhOgorCXN0cmxjcHkoYnVmZmVyLCAiTm9uLUZTIERhdGEiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGRiOgorCXN0cmxjcHkoYnVmZmVyLAorCQkiRGlnaXRhbCBSZXNlYXJjaCBDUC9NLCBDb25jdXJyZW50IENQL00sIENvbmN1cnJlbnQgRE9TIiwKKwkJYnVmZmVyX3NpemUpOworCS8vY2FzZSAweGRiOiBzdHJsY3B5KGJ1ZmZlciwgIkNUT1MgKENvbnZlcmdlbnQgVGVjaG5vbG9naWVzIE9TIC1VbmlzeXMpIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwkvL2Nhc2UgMHhkYjogc3RybGNweShidWZmZXIsICJLREcgVGVsZW1ldHJ5IFNDUFUgYm9vdCIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJYnJlYWs7CisgICAgY2FzZSAweGRkOgorCXN0cmxjcHkoYnVmZmVyLCAiSGlkZGVuIENUT1MgTWVtZHVtcD8iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGRlOgorCXN0cmxjcHkoYnVmZmVyLCAiRGVsbCBQb3dlckVkZ2UgU2VydmVyIHV0aWxpdGllcyAoRkFUIGZzKSIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZGY6CisJc3RybGNweShidWZmZXIsICJERy9VWCB2aXJ0dWFsIGRpc2sgbWFuYWdlciBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisJLy9jYXNlIDB4ZGY6IHN0cmxjcHkoYnVmZmVyLCAiQm9vdEl0IEVNQlJNIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKyAgICBjYXNlIDB4ZTA6CisJc3RybGNweShidWZmZXIsCisJCSJSZXNlcnZlZCBieSBTVE1pY3JvZWxlY3Ryb25pY3MgZm9yIGEgZmlsZXN5c3RlbSBjYWxsZWQgU1QgQVZGUy4iLAorCQlidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGUxOgorCXN0cmxjcHkoYnVmZmVyLCAiRE9TIGFjY2VzcyBvciBTcGVlZFN0b3IgMTItYml0IEZBVCBleHRlbmRlZCBwYXJ0aXRpb24iLAorCQlidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGUzOgorCXN0cmxjcHkoYnVmZmVyLCAiRE9TIFIvTyBvciBTcGVlZFN0b3IiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGU0OgorCXN0cmxjcHkoYnVmZmVyLCAiU3BlZWRTdG9yIDE2LWJpdCBGQVQgZXh0ZW5kZWQgcGFydGl0aW9uIDwgMTAyNCBjeWwuIiwKKwkJYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhlNToKKwlzdHJsY3B5KGJ1ZmZlciwKKwkJIlRhbmR5IERPUyB3aXRoIGxvZ2ljYWwgc2VjdG9yZWQgRkFUIChBY2NvcmRpbmcgdG8gUG93ZXJxdWVzdC4pIiwKKwkJYnVmZmVyX3NpemUpOworCS8vY2FzZSAweGU1OiBzdHJsY3B5KGJ1ZmZlciwgIlJlc2VydmVkIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwlicmVhazsKKyAgICBjYXNlIDB4ZTY6CisJc3RybGNweShidWZmZXIsICJTdG9yYWdlIERpbWVuc2lvbnMgU3BlZWRTdG9yIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhlODoKKwlzdHJsY3B5KGJ1ZmZlciwgIkxVS1MiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGViOgorCXN0cmxjcHkoYnVmZmVyLCAiQmVPUyIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZWM6CisJc3RybGNweShidWZmZXIsICJTa3lPUyBTa3lGUyIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZWQ6CisJc3RybGNweShidWZmZXIsICJSZXNlcnZlZCBmb3IgTWF0dGhpYXMgUGF1bCdzIFNwcnl0aXgiLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGVlOgorCXN0cmxjcHkoYnVmZmVyLAorCQkiR1BUIiwKKwkJYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhlZjoKKwlzdHJsY3B5KGJ1ZmZlciwgIkVGSSBmaWxlIHN5c3RlbSIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZjA6CisJc3RybGNweShidWZmZXIsICJMaW51eC9QQS1SSVNDIGJvb3QgbG9hZGVyIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhmMToKKwlzdHJsY3B5KGJ1ZmZlciwgIlNwZWVkU3RvciIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZjI6CisJc3RybGNweShidWZmZXIsCisJCSJET1MgMy4zKyBzZWNvbmRhcnkgcGFydGl0aW9uIChQb3dlcnF1ZXN0IHdyaXRlczogVW5pc3lzIERPUyB3aXRoIGxvZ2ljYWwgc2VjdG9yZWQgRkFULikiLAorCQlidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGYzOgorCXN0cmxjcHkoYnVmZmVyLAorCQkiUmVzZXJ2ZWQgKFBvd2VycXVlc3Qgd3JpdGVzOiBTdG9yYWdlIERpbWVuc2lvbnMgU3BlZWRTdG9yLikiLAorCQlidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGY0OgorCXN0cmxjcHkoYnVmZmVyLCAiU3BlZWRTdG9yIGxhcmdlIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwkvL2Nhc2UgMHhmNDogc3RybGNweShidWZmZXIsICJQcm9sb2d1ZSBzaW5nbGUtdm9sdW1lIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJYnJlYWs7CisgICAgY2FzZSAweGY1OgorCXN0cmxjcHkoYnVmZmVyLCAiUHJvbG9ndWUgbXVsdGktdm9sdW1lIHBhcnRpdGlvbiIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZjY6CisJc3RybGNweShidWZmZXIsCisJCSJSZXNlcnZlZCAoUG93ZXJxdWVzdCB3cml0ZXM6IFN0b3JhZ2UgRGltZW5zaW9ucyBTcGVlZFN0b3IuICkiLAorCQlidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGY3OgorCXN0cmxjcHkoYnVmZmVyLCAiRERSZHJpdmUgU29saWQgU3RhdGUgRmlsZSBTeXN0ZW0iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGY5OgorCXN0cmxjcHkoYnVmZmVyLCAicENhY2hlIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhmYToKKwlzdHJsY3B5KGJ1ZmZlciwgIkJvY2hzIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhmYjoKKwlzdHJsY3B5KGJ1ZmZlciwgIlZNd2FyZSBGaWxlIFN5c3RlbSBwYXJ0aXRpb24iLCBidWZmZXJfc2l6ZSk7CisJYnJlYWs7CisgICAgY2FzZSAweGZjOgorCXN0cmxjcHkoYnVmZmVyLCAiVk13YXJlIFN3YXAgcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOworCWJyZWFrOworICAgIGNhc2UgMHhmZDoKKwlzdHJsY3B5KGJ1ZmZlciwKKwkJIkxpbnV4IHJhaWQgcGFydGl0aW9uIHdpdGggYXV0b2RldGVjdCB1c2luZyBwZXJzaXN0ZW50IHN1cGVyYmxvY2sgKFBvd2VycXVlc3Qgd3JpdGVzOiBSZXNlcnZlZCBmb3IgRnJlZURPUy4gKSIsCisJCWJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZmU6CisJc3RybGNweShidWZmZXIsICJMQU5zdGVwIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwkvL3N0cmxjcHkoYnVmZmVyLCAiU3BlZWRTdG9yID4gMTAyNCBjeWwuIiwgYnVmZmVyX3NpemUpOworCS8vY2FzZSAweGZlOiBzdHJsY3B5KGJ1ZmZlciwgIklCTSBQUy8yIElNTCAoSW5pdGlhbCBNaWNyb2NvZGUgTG9hZCkgcGFydGl0aW9uLCBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRpc2suIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwkvL2Nhc2UgMHhmZTogc3RybGNweShidWZmZXIsICJXaW5kb3dzIE5UIERpc2sgQWRtaW5pc3RyYXRvciBoaWRkZW4gcGFydGl0aW9uIiwgYnVmZmVyX3NpemUpOyBicmVhazsKKwkvL2Nhc2UgMHhmZTogc3RybGNweShidWZmZXIsICJMaW51eCBMb2dpY2FsIFZvbHVtZSBNYW5hZ2VyIHBhcnRpdGlvbiAob2xkKSIsIGJ1ZmZlcl9zaXplKTsgYnJlYWs7CisJYnJlYWs7CisgICAgY2FzZSAweGZmOgorCXN0cmxjcHkoYnVmZmVyLCAiWGVuaXggQmFkIEJsb2NrIFRhYmxlICIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXN0cmxjcHkoYnVmZmVyLCAiVW5rbm93biIsIGJ1ZmZlcl9zaXplKTsKKwlicmVhazsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZGlzay9tYnJzLmMgYi9jb20zMi9ncGxsaWIvZGlzay9tYnJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1MGZjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9kaXNrL21icnMuYwpAQCAtMCwwICsxLDE0NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllcgorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgU3lzbGludXgsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZGlzay9jb21tb24uaD4KKyNpbmNsdWRlIDxkaXNrL2dlb20uaD4KKyNpbmNsdWRlIDxkaXNrL3JlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKioKKyAqIGdldF9tYnJfc3RyaW5nIC0gcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGJvb3QgY29kZQorICogQGxhYmVsOgkJZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgTUJSCisgKiBAYnVmZmVyOgkJcHJlLWFsbG9jYXRlZCBidWZmZXIKKyAqIEBidWZmZXJfc2l6ZToJQGJ1ZmZlciBzaXplCisgKiovCit2b2lkIGdldF9tYnJfc3RyaW5nKGNvbnN0IHVpbnQzMl90IGxhYmVsLCBjaGFyICpidWZmZXIsIGNvbnN0IGludCBidWZmZXJfc2l6ZSkKK3sKKyAgICAvKiAyIGJ5dGVzIGFyZSB1c3VhbGx5IGVub3VnaCB0byBpZGVudGlmeSB0aGUgTUJSICovCisgICAgdWludDE2X3Qgc19sYWJlbCA9IGxhYmVsID4+IDE2OworCisgICAgc3dpdGNoIChzX2xhYmVsKSB7CisgICAgY2FzZSAweDAwMDA6CisgICAgY2FzZSAweGZhYmU6CisJc3RybGNweShidWZmZXIsICJObyBib290bG9hZGVyIiwgYnVmZmVyX3NpemUgLSAxKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MGViZToKKwlzdHJsY3B5KGJ1ZmZlciwgIlRoaW5rUGFkIiwgYnVmZmVyX3NpemUgLSAxKTsKKwlicmVhazsKKyAgICBjYXNlIDB4MzFjMDoKKwlzdHJsY3B5KGJ1ZmZlciwgIkFjZXIgMyIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJYnJlYWs7CisgICAgY2FzZSAweDMzYzA6CisJLyogV2UgbmVlZCBtb3JlIHRoYW4gMiBieXRlcyAqLworCWlmICgoKGxhYmVsID4+IDgpICYgMHhmZikgPT0gMHg4ZSkKKwkgICAgc3RybGNweShidWZmZXIsICJXaW5kb3dzIiwgYnVmZmVyX3NpemUgLSAxKTsKKwllbHNlIGlmICgoKGxhYmVsID4+IDgpICYgMHhmZikgPT0gMHg5MCkKKwkgICAgc3RybGNweShidWZmZXIsICJEaXNrQ3J5cHRvciIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJZWxzZSBpZiAoKChsYWJlbCA+PiA4KSAmIDB4ZmYpID09IDB4ZmEpCisJICAgIHN0cmxjcHkoYnVmZmVyLCAiU3lzbGludXgiLCBidWZmZXJfc2l6ZSAtIDEpOworCWVsc2UKKwkgICAgc3RybGNweShidWZmZXIsICJVbmtub3duIG1iciIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJYnJlYWs7CisgICAgY2FzZSAweDMzZWQ6CisJc3RybGNweShidWZmZXIsICJTeXNsaW51eCBJU09oeWJyaWQiLCBidWZmZXJfc2l6ZSAtIDEpOworCWJyZWFrOworICAgIGNhc2UgMHgzM2ZmOgorCXN0cmxjcHkoYnVmZmVyLCAiSFAvR2F0ZXdheSIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJYnJlYWs7CisgICAgY2FzZSAweGI4MDA6CisJc3RybGNweShidWZmZXIsICJQbG9QIiwgYnVmZmVyX3NpemUgLSAxKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZWEwNToKKwlzdHJsY3B5KGJ1ZmZlciwgIlhPU0wiLCBidWZmZXJfc2l6ZSAtIDEpOworCWJyZWFrOworICAgIGNhc2UgMHhlYTFlOgorCXN0cmxjcHkoYnVmZmVyLCAiVHJ1ZWNyeXB0IEJvb3QgTG9hZGVyIiwgYnVmZmVyX3NpemUgLSAxKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZWIwNDoKKwlzdHJsY3B5KGJ1ZmZlciwgIlNvbGFyaXMiLCBidWZmZXJfc2l6ZSAtIDEpOworCWJyZWFrOworICAgIGNhc2UgMHhlYjMxOgorCXN0cmxjcHkoYnVmZmVyLCAiUGFyYWdvbiIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJYnJlYWs7CisgICAgY2FzZSAweGViNDg6CisJc3RybGNweShidWZmZXIsICJHcnViIiwgYnVmZmVyX3NpemUgLSAxKTsKKwlicmVhazsKKyAgICBjYXNlIDB4ZWI0YzoKKwlzdHJsY3B5KGJ1ZmZlciwgIkdydWIyICh2MS45NikiLCBidWZmZXJfc2l6ZSAtIDEpOworCWJyZWFrOworICAgIGNhc2UgMHhlYjYzOgorCXN0cmxjcHkoYnVmZmVyLCAiR3J1YjIgKHYxLjk3KSIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJYnJlYWs7CisgICAgY2FzZSAweGViNWU6CisJLyogV2UgbmVlZCBtb3JlIHRoYW4gMiBieXRlcyAqLworCWlmICgoKGxhYmVsID4+IDgpICYgMHhmZikgPT0gMHgwMCkKKwkgICAgc3RybGNweShidWZmZXIsICJmYmluc3QiLCBidWZmZXJfc2l6ZSAtIDEpOworCWVsc2UgaWYgKCgobGFiZWwgPj4gOCkgJiAweGZmKSA9PSAweDgwKQorCSAgICBzdHJsY3B5KGJ1ZmZlciwgIkdydWI0RG9zIiwgYnVmZmVyX3NpemUgLSAxKTsKKwllbHNlIGlmICgoKGxhYmVsID4+IDgpICYgMHhmZikgPT0gMHg5MCkKKwkgICAgc3RybGNweShidWZmZXIsICJXRUUiLCBidWZmZXJfc2l6ZSAtIDEpOworCWVsc2UKKwkgICAgc3RybGNweShidWZmZXIsICJVbmtub3duIG1iciIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJYnJlYWs7CisgICAgY2FzZSAweGZhMzE6CisJLyogV2UgbmVlZCBtb3JlIHRoYW4gMiBieXRlcyAqLworCWlmICgoKGxhYmVsID4+IDgpICYgMHhmZikgPT0gMHhjMCkKKwkgICAgc3RybGNweShidWZmZXIsICJTeXNsaW51eCIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJZWxzZSBpZiAoKChsYWJlbCA+PiA4KSAmIDB4ZmYpID09IDB4YzkpCisJICAgIHN0cmxjcHkoYnVmZmVyLCAiTWFzdGVyIEJvb3QgTG9hRGVSIiwgYnVmZmVyX3NpemUgLSAxKTsKKwllbHNlCisJICAgIHN0cmxjcHkoYnVmZmVyLCAiVW5rbm93biBtYnIiLCBidWZmZXJfc2l6ZSAtIDEpOworCWJyZWFrOworICAgIGNhc2UgMHhmYTMzOgorCXN0cmxjcHkoYnVmZmVyLCAiTVMtRE9TIDMuMzAgdGhyb3VnaCBXaW5kb3dzIDk1IChBKSIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJYnJlYWs7CisgICAgY2FzZSAweGZhYjg6CisJc3RybGNweShidWZmZXIsICJGcmVlRE9TIChlWHRlbmRlZCBGRGlzaykiLCBidWZmZXJfc2l6ZSAtIDEpOworCWJyZWFrOworICAgIGNhc2UgMHhmYWViOgorCXN0cmxjcHkoYnVmZmVyLCAiTGlsbyIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJYnJlYWs7CisgICAgY2FzZSAweGZjMzE6CisJc3RybGNweShidWZmZXIsICJUZXN0ZGlzayIsIGJ1ZmZlcl9zaXplIC0gMSk7CisJYnJlYWs7CisgICAgY2FzZSAweGZjMzM6CisJc3RybGNweShidWZmZXIsICJHQUciLCBidWZmZXJfc2l6ZSAtIDEpOworCWJyZWFrOworICAgIGNhc2UgMHhmY2ViOgorCXN0cmxjcHkoYnVmZmVyLCAiQm9vdElUIE5HIiwgYnVmZmVyX3NpemUgLSAxKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXN0cmxjcHkoYnVmZmVyLCAiVW5rbm93biBtYnIiLCBidWZmZXJfc2l6ZSAtIDEpOworCWJyZWFrOworICAgIH0KKworICAgIGJ1ZmZlcltidWZmZXJfc2l6ZSAtIDFdID0gJ1wwJzsKK30KKworLyoqCisgKiBnZXRfbWJyX2lkIC0gcmV0dXJuIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBNQlIKKyAqIEBkOgkJZHJpdmVpbmZvIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBkcml2ZQorICoqLwordWludDMyX3QgZ2V0X21icl9pZChjb25zdCBzdHJ1Y3QgZHJpdmVpbmZvICpkKQoreworICAgIGNoYXIgbWJyW1NFQ1RPUiAqIHNpemVvZihjaGFyKV07CisKKyAgICBpZiAocmVhZF9tYnIoZC0+ZGlzaywgJm1icikgPT0gLTEpCisJcmV0dXJuIC0xOworICAgIGVsc2UgeworCXVpbnQzMl90IG1icl9pZDsKKwkvKiBSZXZlcnNlIHRoZSBvcGNvZGVzICovCisJbWJyX2lkID0gKCoodWludDhfdCAqKSAobWJyICsgMykpOworCW1icl9pZCArPSAoKih1aW50OF90ICopIChtYnIgKyAyKSA8PCA4KTsKKwltYnJfaWQgKz0gKCoodWludDhfdCAqKSAobWJyICsgMSkgPDwgMTYpOworCW1icl9pZCArPSAoKih1aW50OF90ICopIG1icikgPDwgMjQ7CisJcmV0dXJuIG1icl9pZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZGlzay9tc2Rvcy5jIGIvY29tMzIvZ3BsbGliL2Rpc2svbXNkb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGVlNjBmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL2Rpc2svbXNkb3MuYwpAQCAtMCwwICsxLDE2MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllcgorICoKKyAqICAgU29tZSBwYXJ0cyBib3Jyb3dlZCBmcm9tIGNoYWluLmMzMjoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTeXNsaW51eCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGRpc2svY29tbW9uLmg+CisjaW5jbHVkZSA8ZGlzay9nZW9tLmg+CisjaW5jbHVkZSA8ZGlzay9tc2Rvcy5oPgorI2luY2x1ZGUgPGRpc2svcGFydGl0aW9uLmg+CisjaW5jbHVkZSA8ZGlzay9yZWFkLmg+CisKK3N0YXRpYyBpbnQgaXNfZXh0ZW5kZWRfcGFydGl0aW9uKHN0cnVjdCBwYXJ0X2VudHJ5ICpwdGFiKQoreworICAgIHJldHVybiAocHRhYi0+b3N0eXBlID09IDB4MDUgfHwKKwkgICAgcHRhYi0+b3N0eXBlID09IDB4MGYgfHwgcHRhYi0+b3N0eXBlID09IDB4ODUpOworfQorCitzdGF0aWMgaW50IG1zZG9zX21hZ2ljX3ByZXNlbnQoY29uc3QgY2hhciAqcHRhYikKK3sKKyAgICByZXR1cm4gKCoodWludDE2X3QgKikgKHB0YWIgKyAweDFmZSkgPT0gMHhhYTU1KTsKK30KKworLyoqCisgKiBwcm9jZXNzX2V4dGVuZGVkX3BhcnRpdGlvbiAtIGV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZWFjaCBwYXJ0aXRpb24gY29udGFpbmVkIGxpc3RlZCBpbiBhbiBlYnIKKyAqIEBkcml2ZV9pbmZvOgkJZHJpdmVpbmZvIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBkcml2ZQorICogQHBhcnRpdGlvbl9vZmZzZXQ6CUFic29sdXRlIHN0YXJ0IChsYmEpIG9mIHRoZSBleHRlbmRlZCBwYXJ0aXRpb24KKyAqIEBlYnJfb2Zmc2V0OgkJUmVsYXRpdmUgc3RhcnQgKGxiYSkgb2YgdGhlIGN1cnJlbnQgZWJyIHByb2Nlc3NlZCB3aXRoaW4KKyAqCQkJdGhlIGV4dGVuZGVkIHBhcnRpdGlvbgorICogQGNhbGxiYWNrOgkJQ2FsbGJhY2sgdG8gZXhlY3V0ZQorICogQGVycm9yOgkJQnVmZmVyIGZvciBJL08gZXJyb3JzCisgKiBAbmJfcGFydF9zZWVuOglOdW1iZXIgb2YgcGFydGl0aW9ucyBmb3VuZCBvbiB0aGUgZGlzayBzbyBmYXIKKyAqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19leHRlbmRlZF9wYXJ0aXRpb24oc3RydWN0IGRyaXZlaW5mbyAqZHJpdmVfaW5mbywKKwkJCQkgICAgICBjb25zdCBpbnQgcGFydGl0aW9uX29mZnNldCwKKwkJCQkgICAgICBjb25zdCBpbnQgZWJyX29mZnNldCwKKwkJCQkgICAgICBwX2NhbGxiYWNrIGNhbGxiYWNrLCBpbnQgbmJfcGFydF9zZWVuKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIC8qIFRoZSBlYnIgaXMgbG9jYXRlZCBhdCB0aGUgZmlyc3Qgc2VjdG9yIG9mIHRoZSBleHRlbmRlZCBwYXJ0aXRpb24gKi8KKyAgICBjaGFyICplYnIgPSBtYWxsb2MoU0VDVE9SICogc2l6ZW9mKGNoYXIpKTsKKworICAgIGlmIChyZWFkX3NlY3RvcnMoZHJpdmVfaW5mbywgZWJyLCBwYXJ0aXRpb25fb2Zmc2V0ICsgZWJyX29mZnNldCwgMSkgPT0gLTEpCisJZ290byBhYm9ydDsKKworICAgIC8qIENoZWNrIG1zZG9zIG1hZ2ljIHNpZ25hdHVyZSAqLworICAgIGlmICghbXNkb3NfbWFnaWNfcHJlc2VudChlYnIpKQorCWdvdG8gYWJvcnQ7CisKKyAgICBzdHJ1Y3QgcGFydF9lbnRyeSAqcHRhYiA9CisJKHN0cnVjdCBwYXJ0X2VudHJ5ICopKGViciArIFBBUlRJVElPTl9UQUJMRVNfT0ZGU0VUKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJaWYgKHN0YXR1cyA9PSAtMSkKKwkgICAgZ290byBhYm9ydDsKKworCWlmICghaXNfZXh0ZW5kZWRfcGFydGl0aW9uKCZwdGFiW2ldKSkgeworCSAgICAvKgorCSAgICAgKiBUaGlzIEVCUiBwYXJ0aXRpb24gdGFibGUgZW50cnkgcG9pbnRzIHRvIHRoZQorCSAgICAgKiBsb2dpY2FsIHBhcnRpdGlvbiBhc3NvY2lhdGVkIHRvIHRoYXQgRUJSCisJICAgICAqLworCSAgICBpbnQgbG9naWNhbF9wYXJ0aXRpb25fc3RhcnQgPSBlYnJfb2Zmc2V0ICsgcHRhYltpXS5zdGFydF9sYmE7CisKKwkgICAgLyogTGFzdCBFQlIgaW4gdGhlIGV4dGVuZGVkIHBhcnRpdGlvbj8gKi8KKwkgICAgaWYgKCFsb2dpY2FsX3BhcnRpdGlvbl9zdGFydCkKKwkJY29udGludWU7CisKKwkgICAgLyoKKwkgICAgICogQ2hlY2sgZm9yIGdhcmJhZ2U6CisJICAgICAqIDNyZCBhbmQgNHRoIGVudHJpZXMgaW4gYW4gRUJSIHNob3VsZCBiZSB6ZXJvCisJICAgICAqIFNvbWUgKG1hbGZvcm1lZCkgcGFydGl0aW9uaW5nIHNvZnR3YXJlIHN0aWxsIGFkZCBzb21lCisJICAgICAqIGRhdGEgcGFydGl0aW9ucyB0aGVyZS4KKwkgICAgICovCisJICAgIGlmIChwdGFiW2ldLnN0YXJ0X2xiYSA8PSAwIHx8IHB0YWJbaV0ubGVuZ3RoIDw9IDApCisJCWNvbnRpbnVlOworCisJICAgIG5iX3BhcnRfc2VlbisrOworCSAgICBjYWxsYmFjayhkcml2ZV9pbmZvLAorCQkgICAgICZwdGFiW2ldLAorCQkgICAgIHBhcnRpdGlvbl9vZmZzZXQgKyBsb2dpY2FsX3BhcnRpdGlvbl9zdGFydCwgbmJfcGFydF9zZWVuKTsKKwl9IGVsc2UKKwkgICAgc3RhdHVzID0gcHJvY2Vzc19leHRlbmRlZF9wYXJ0aXRpb24oZHJpdmVfaW5mbywKKwkJCQkJCXBhcnRpdGlvbl9vZmZzZXQsCisJCQkJCQlwdGFiW2ldLnN0YXJ0X2xiYSwKKwkJCQkJCWNhbGxiYWNrLCBuYl9wYXJ0X3NlZW4pOworICAgIH0KKworICAgIGZyZWUoZWJyKTsKKyAgICByZXR1cm4gMDsKKworYWJvcnQ6CisgICAgZnJlZShlYnIpOworICAgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBwcm9jZXNzX21iciAtIGV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZWFjaCBwYXJ0aXRpb24gY29udGFpbmVkIGluIGFuIHttLGV9YnIKKyAqIEBkcml2ZV9pbmZvOglkcml2ZWluZm8gc3RydWN0IGRlc2NyaWJpbmcgdGhlIGRyaXZlCisgKiBAcHRhYjoJUG9pbnRlciB0byB0aGUgcGFydGl0aW9uIHRhYmxlCisgKiBAY2FsbGJhY2s6CUNhbGxiYWNrIHRvIGV4ZWN1dGUKKyAqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19tYnIoc3RydWN0IGRyaXZlaW5mbyAqZHJpdmVfaW5mbywgc3RydWN0IHBhcnRfZW50cnkgKnB0YWIsCisJCSAgICAgICBwX2NhbGxiYWNrIGNhbGxiYWNrKQoreworICAgIGludCBzdGF0dXMgPSAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKwlpZiAoc3RhdHVzID09IC0xKQorCSAgICByZXR1cm4gLTE7CisKKwlpZiAocHRhYltpXS5zdGFydF9zZWN0ID4gMCkgeworCSAgICBpZiAoaXNfZXh0ZW5kZWRfcGFydGl0aW9uKCZwdGFiW2ldKSkgeworCQljYWxsYmFjayhkcml2ZV9pbmZvLCAmcHRhYltpXSwgcHRhYltpXS5zdGFydF9sYmEsIGkgKyAxKTsKKwkJc3RhdHVzID0KKwkJICAgIHByb2Nlc3NfZXh0ZW5kZWRfcGFydGl0aW9uKGRyaXZlX2luZm8sIHB0YWJbaV0uc3RhcnRfbGJhLCAwLAorCQkJCQkgICAgICAgY2FsbGJhY2ssIDQpOworCSAgICB9IGVsc2UKKwkJY2FsbGJhY2soZHJpdmVfaW5mbywgJnB0YWJbaV0sIHB0YWJbaV0uc3RhcnRfbGJhLCBpICsgMSk7CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIHBhcnNlX3BhcnRpdGlvbl90YWJsZSAtIGV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZWFjaCBwYXJ0aXRpb24gZW50cnkKKyAqIEBkOgkJZHJpdmVpbmZvIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBkcml2ZQorICogQGNhbGxiYWNrOglDYWxsYmFjayB0byBleGVjdXRlCisgKgorICogVGhlIHNpZ25hdHVyZSBvZiB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIHRoZSBmb2xsb3dpbmc6CisgKgorICogdm9pZCBjYWxsYmFjayhzdHJ1Y3QgZHJpdmVpbmZvICpkcml2ZV9pbmZvLAorICoJCSBzdHJ1Y3QgcGFydF9lbnRyeSAqcHRhYiwKKyAqCQkgaW50IG9mZnNldF9yb290LAorICoJCSBpbnQgbmJfcGFydF9zZWVuKQorICoqLworaW50IHBhcnNlX3BhcnRpdGlvbl90YWJsZShzdHJ1Y3QgZHJpdmVpbmZvICpkLCBwX2NhbGxiYWNrIGNhbGxiYWNrKQoreworICAgIGNoYXIgKm1iciA9IG1hbGxvYyhTRUNUT1IgKiBzaXplb2YoY2hhcikpOworCisgICAgaWYgKHJlYWRfbWJyKGQtPmRpc2ssIG1icikgPT0gLTEpCisJcmV0dXJuIC0xOworICAgIGVsc2UgeworCS8qIENoZWNrIG1zZG9zIG1hZ2ljIHNpZ25hdHVyZSAqLworCWlmICghbXNkb3NfbWFnaWNfcHJlc2VudChtYnIpKQorCSAgICByZXR1cm4gLTE7CisKKwlzdHJ1Y3QgcGFydF9lbnRyeSAqcHRhYiA9CisJICAgIChzdHJ1Y3QgcGFydF9lbnRyeSAqKShtYnIgKyBQQVJUSVRJT05fVEFCTEVTX09GRlNFVCk7CisJcmV0dXJuIHByb2Nlc3NfbWJyKGQsIHB0YWIsIGNhbGxiYWNrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZGlzay9yZWFkLmMgYi9jb20zMi9ncGxsaWIvZGlzay9yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxOTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9kaXNrL3JlYWQuYwpAQCAtMCwwICsxLDE0OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllcgorICoKKyAqICAgU29tZSBwYXJ0cyBib3Jyb3dlZCBmcm9tIGNoYWluLmMzMjoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTeXNsaW51eCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGlzay9lcnJub19kaXNrLmg+CisjaW5jbHVkZSA8ZGlzay9nZW9tLmg+CisjaW5jbHVkZSA8ZGlzay9yZWFkLmg+CisjaW5jbHVkZSA8ZGlzay91dGlsLmg+CisjaW5jbHVkZSA8ZGlzay9jb21tb24uaD4KKworLyoKKyAqIFRPRE86IGltcGxlbWVudCBmaWxlIGRlc2NyaXB0b3JzIHRvIGNhY2hlIG1ldGFkYXRhIChnZW9tZXRyeSwgLi4uKQorICovCisKKy8qKgorICogcmVhZF9tYnIgLSByZXR1cm4gYSBwb2ludGVyIHRvIGEgbWFsbG9jZWQgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG1icgorICogQGRyaXZlOglEcml2ZSBudW1iZXIKKyAqIEBidWY6CVByZS1hbGxvY2F0ZWQgYnVmZmVyIGZvciBvdXRwdXQKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZWN0b3JzIHJlYWQgb24gc3VjY2VzcyBvciAtMSBvbiBmYWlsdXJlLgorICogZXJybm9fZGlzayBjb250YWlucyB0aGUgZXJyb3IgbnVtYmVyLgorICoqLworaW50IHJlYWRfbWJyKGludCBkcml2ZSwgdm9pZCAqYnVmKQoreworICAgIHN0cnVjdCBkcml2ZWluZm8gZHJpdmVfaW5mbzsKKyAgICBkcml2ZV9pbmZvLmRpc2sgPSBkcml2ZTsKKworICAgIC8qIE1CUjogbGJhID0gMCwgMSBzZWN0b3IgKi8KKyAgICByZXR1cm4gcmVhZF9zZWN0b3JzKCZkcml2ZV9pbmZvLCBidWYsIDAsIDEpOworfQorCisvKioKKyAqIGRldl9yZWFkIC0gcmVhZCBmcm9tIGEgZHJpdmUKKyAqIEBkcml2ZToJRHJpdmUgbnVtYmVyCisgKiBAYnVmOglQcmUtYWxsb2NhdGVkIGJ1ZmZlciBmb3Igb3V0cHV0CisgKiBAbGJhOglQb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20KKyAqIEBzZWN0b3JzOglOdW1iZXIgb2Ygc2VjdG9ycyB0byByZWFkCisgKgorICogSGlnaC1sZXZlbCByb3V0aW5lIHRvIHJlYWQgZnJvbSBhIGhhcmQgZHJpdmUuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZWN0b3JzIHJlYWQgb24gc3VjY2VzcyBvciAtMSBvbiBmYWlsdXJlLgorICogZXJybm9fZGlzayBjb250YWlucyB0aGUgZXJyb3IgbnVtYmVyLgorICoqLworaW50IGRldl9yZWFkKGludCBkcml2ZSwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGJhLCBpbnQgc2VjdG9ycykKK3sKKyAgICBzdHJ1Y3QgZHJpdmVpbmZvIGRyaXZlX2luZm87CisgICAgZHJpdmVfaW5mby5kaXNrID0gZHJpdmU7CisKKyAgICByZXR1cm4gcmVhZF9zZWN0b3JzKCZkcml2ZV9pbmZvLCBidWYsIGxiYSwgc2VjdG9ycyk7Cit9CisKKy8qKgorICogcmVhZF9zZWN0b3JzIC0gcmVhZCBzZXZlcmFsIHNlY3RvcnMgZnJvbSBkaXNrCisgKiBAZHJpdmVfaW5mbzoJCWRyaXZlaW5mbyBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgZGlzaworICogQGRhdGE6CQlQcmUtYWxsb2NhdGVkIGJ1ZmZlciBmb3Igb3V0cHV0CisgKiBAbGJhOgkJUG9zaXRpb24gdG8gcmVhZAorICogQHNlY3RvcnM6CQlOdW1iZXIgb2Ygc2VjdG9ycyB0byByZWFkCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyByZWFkIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4KKyAqIGVycm5vX2Rpc2sgY29udGFpbnMgdGhlIGVycm9yIG51bWJlci4KKyAqKi8KK2ludCByZWFkX3NlY3RvcnMoc3RydWN0IGRyaXZlaW5mbyAqZHJpdmVfaW5mbywgdm9pZCAqZGF0YSwKKwkJIGNvbnN0IHVuc2lnbmVkIGludCBsYmEsIGNvbnN0IGludCBzZWN0b3JzKQoreworICAgIGNvbTMyc3lzX3QgaW5yZWcsIG91dHJlZzsKKyAgICBzdHJ1Y3QgZWJpb3NfZGFwYSAqZGFwYTsKKyAgICB2b2lkICpidWY7CisgICAgY2hhciAqYnVmcCA9IGRhdGE7CisgICAgaW50IHJ2ID0gLTE7CisKKyAgICBpZiAoZ2V0X2RyaXZlX3BhcmFtZXRlcnMoZHJpdmVfaW5mbykgPT0gLTEpCisJcmV0dXJuIC0xOworCisgICAgYnVmID0gbG1hbGxvYyhzZWN0b3JzICogU0VDVE9SKTsKKyAgICBpZiAoIWJ1ZikKKwlyZXR1cm4gLTE7CisKKyAgICBkYXBhID0gbG1hbGxvYyhzaXplb2YoKmRhcGEpKTsKKyAgICBpZiAoIWRhcGEpCisJZ290byBmYWlsOworCisgICAgbWVtc2V0KCZpbnJlZywgMCwgc2l6ZW9mIGlucmVnKTsKKworICAgIGlmIChkcml2ZV9pbmZvLT5lYmlvcykgeworCWRhcGEtPmxlbiA9IHNpemVvZigqZGFwYSk7CisJZGFwYS0+Y291bnQgPSBzZWN0b3JzOworCWRhcGEtPm9mZiA9IE9GRlMoYnVmKTsKKwlkYXBhLT5zZWcgPSBTRUcoYnVmKTsKKwlkYXBhLT5sYmEgPSBsYmE7CisKKwlpbnJlZy5lc2kud1swXSA9IE9GRlMoZGFwYSk7CisJaW5yZWcuZHMgPSBTRUcoZGFwYSk7CisJaW5yZWcuZWR4LmJbMF0gPSBkcml2ZV9pbmZvLT5kaXNrOworCWlucmVnLmVheC5iWzFdID0gMHg0MjsJLyogRXh0ZW5kZWQgcmVhZCAqLworICAgIH0gZWxzZSB7CisJdW5zaWduZWQgaW50IGMsIGgsIHM7CisKKwlpZiAoIWRyaXZlX2luZm8tPmNiaW9zKSB7CS8vIFhYWCBlcnJubworCSAgICAvKiBXZSBmYWlsZWQgdG8gZ2V0IHRoZSBnZW9tZXRyeSAqLworCSAgICBpZiAobGJhKQorCQlnb3RvIGZhaWw7CS8qIENhbiBvbmx5IHJlYWQgTUJSICovCisKKwkgICAgcyA9IDE7CisJICAgIGggPSAwOworCSAgICBjID0gMDsKKwl9IGVsc2UKKwkgICAgbGJhX3RvX2Nocyhkcml2ZV9pbmZvLCBsYmEsICZzLCAmaCwgJmMpOworCisJLy8gWFhYIGVycm5vCisJaWYgKHMgPiA2MyB8fCBoID4gMjU2IHx8IGMgPiAxMDIzKQorCSAgICBnb3RvIGZhaWw7CisKKwlpbnJlZy5lYXgud1swXSA9IDB4MDIwMTsJLyogUmVhZCBvbmUgc2VjdG9yICovCisJaW5yZWcuZWN4LmJbMV0gPSBjICYgMHhmZjsKKwlpbnJlZy5lY3guYlswXSA9IHMgKyAoYyA+PiA2KTsKKwlpbnJlZy5lZHguYlsxXSA9IGg7CisJaW5yZWcuZWR4LmJbMF0gPSBkcml2ZV9pbmZvLT5kaXNrOworCWlucmVnLmVieC53WzBdID0gT0ZGUyhidWYpOworCWlucmVnLmVzID0gU0VHKGJ1Zik7CisgICAgfQorCisgICAgLyogUGVyZm9ybSB0aGUgcmVhZCAqLworICAgIGlmIChpbnQxM19yZXRyeSgmaW5yZWcsICZvdXRyZWcpKSB7CisJZXJybm9fZGlzayA9IG91dHJlZy5lYXguYlsxXTsKKwlnb3RvIGZhaWw7CQkvKiBHaXZlIHVwICovCisgICAgfQorCisgICAgbWVtY3B5KGJ1ZnAsIGJ1Ziwgc2VjdG9ycyAqIFNFQ1RPUik7CisgICAgcnYgPSBzZWN0b3JzOworCitmYWlsOgorICAgIGxmcmVlKGRhcGEpOworICAgIGxmcmVlKGJ1Zik7CisgICAgcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsbGliL2Rpc2svc3dzdXNwLmMgYi9jb20zMi9ncGxsaWIvZGlzay9zd3N1c3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjc4MmZkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL2Rpc2svc3dzdXNwLmMKQEAgLTAsMCArMSwyNyBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGlzay9zd3N1c3AuaD4KKyNpbmNsdWRlIDxkaXNrL3JlYWQuaD4KKyNpbmNsdWRlIDxkaXNrL2dlb20uaD4KKworLyoqCisgKiBzd3N1c3BfY2hlY2sgLSBjaGVjayBpZiBhIChzd2FwKSBwYXJ0aXRpb24gY29udGFpbnMgdGhlIHN3c3VzcCBzaWduYXR1cmUKKyAqIEBkcml2ZV9pbmZvOglkcml2ZWluZm8gc3RydWN0IGRlc2NyaWJpbmcgdGhlIGRpc2sgY29udGFpbmluZyB0aGUgcGFydGl0aW9uCisgKiBAcHRhYjsJUGFydGl0aW9uIHRhYmxlIG9mIHRoZSBwYXJ0aXRpb24KKyAqKi8KK2ludCBzd3N1c3BfY2hlY2soc3RydWN0IGRyaXZlaW5mbyAqZHJpdmVfaW5mbywgc3RydWN0IHBhcnRfZW50cnkgKnB0YWIpCit7CisgICAgc3RydWN0IHN3c3VzcF9oZWFkZXIgaGVhZGVyX3A7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgZm91bmQ7CisKKyAgICAvKiBSZWFkIGZpcnN0IHBhZ2Ugb2YgdGhlIHN3YXAgZGV2aWNlICovCisgICAgb2Zmc2V0ID0gcHRhYi0+c3RhcnRfbGJhOworICAgIGlmIChyZWFkX3NlY3RvcnMoZHJpdmVfaW5mbywgJmhlYWRlcl9wLCBvZmZzZXQsIFBBR0VfU0laRSAvIFNFQ1RPUikgPT0gLTEpIHsKKwlyZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKwlmb3VuZCA9ICFtZW1jbXAoU1dTVVNQX1NJRywgaGVhZGVyX3Auc2lnLCAxMCk7CisJcmV0dXJuIGZvdW5kOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi9kaXNrL3V0aWwuYyBiL2NvbTMyL2dwbGxpYi9kaXNrL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWMwMzI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL2Rpc2svdXRpbC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIKKyAqCisgKiAgIFNvbWUgcGFydHMgYm9ycm93ZWQgZnJvbSBjaGFpbi5jMzI6CisgKgorICogICBDb3B5cmlnaHQgMjAwMy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgU3lzbGludXgsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkaXNrL2dlb20uaD4KKworI2RlZmluZSBNQVhfTkJfUkVUUklFUyA2CisKKy8qKgorICogaW50MTNfcmV0cnkgLSBpbnQxM2ggd2l0aCBlcnJvciBoYW5kbGluZworICogQGlucmVnOglpbnQxM2ggZnVuY3Rpb24gcGFyYW1ldGVycworICogQG91dHJlZzoJb3V0cHV0IHJlZ2lzdGVycworICoKKyAqIENhbGwgaW50IDEzaCwgYnV0IHdpdGggcmV0cnkgb24gZmFpbHVyZS4gIEVzcGVjaWFsbHkgZmxvcHBpZXMgbmVlZCB0aGlzLgorICoqLworaW50IGludDEzX3JldHJ5KGNvbnN0IGNvbTMyc3lzX3QgKiBpbnJlZywgY29tMzJzeXNfdCAqIG91dHJlZykKK3sKKyAgICBpbnQgcmV0cnkgPSBNQVhfTkJfUkVUUklFUzsJLyogTnVtYmVyIG9mIHJldHJpZXMgKi8KKyAgICBjb20zMnN5c190IHRtcHJlZ3M7CisKKyAgICBpZiAoIW91dHJlZykKKwlvdXRyZWcgPSAmdG1wcmVnczsKKworICAgIHdoaWxlIChyZXRyeS0tKSB7CisJX19pbnRjYWxsKDB4MTMsIGlucmVnLCBvdXRyZWcpOworCWlmICghKG91dHJlZy0+ZWZsYWdzLmwgJiBFRkxBR1NfQ0YpKQorCSAgICByZXR1cm4gMDsJCS8qIENGPTAgPT4gT0sgKi8KKyAgICB9CisKKyAgICAvKiBJZiB3ZSBnZXQgaGVyZTogZXJyb3IgKi8KKyAgICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZGlzay93cml0ZS5jIGIvY29tMzIvZ3BsbGliL2Rpc2svd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTgzYWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL2Rpc2svd3JpdGUuYwpAQCAtMCwwICsxLDEzOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllcgorICoKKyAqICAgU29tZSBwYXJ0cyBib3Jyb3dlZCBmcm9tIGNoYWluLmMzMjoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBTeXNsaW51eCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGlzay9jb21tb24uaD4KKyNpbmNsdWRlIDxkaXNrL2Vycm5vX2Rpc2suaD4KKyNpbmNsdWRlIDxkaXNrL3JlYWQuaD4KKyNpbmNsdWRlIDxkaXNrL3V0aWwuaD4KKyNpbmNsdWRlIDxkaXNrL3dyaXRlLmg+CisKKy8qKgorICogd3JpdGVfc2VjdG9ycyAtIHdyaXRlIHNldmVyYWwgc2VjdG9ycyBmcm9tIGRpc2sKKyAqIEBkcml2ZV9pbmZvOgkJZHJpdmVpbmZvIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBkaXNrCisgKiBAbGJhOgkJUG9zaXRpb24gdG8gd3JpdGUKKyAqIEBkYXRhOgkJQnVmZmVyIHRvIHdyaXRlCisgKiBAc2l6ZToJCVNpemUgb2YgdGhlIGJ1ZmZlciAobnVtYmVyIG9mIHNlY3RvcnMpCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyB3cml0ZSBvbiBzdWNjZXNzIG9yIC0xIG9uIGZhaWx1cmUuCisgKiBlcnJub19kaXNrIGNvbnRhaW5zIHRoZSBlcnJvciBudW1iZXIuCisgKiovCitpbnQgd3JpdGVfc2VjdG9ycyhjb25zdCBzdHJ1Y3QgZHJpdmVpbmZvICpkcml2ZV9pbmZvLCBjb25zdCB1bnNpZ25lZCBpbnQgbGJhLAorCQkgIGNvbnN0IHZvaWQgKmRhdGEsIGNvbnN0IGludCBzaXplKQoreworICAgIGNvbTMyc3lzX3QgaW5yZWcsIG91dHJlZzsKKyAgICBzdHJ1Y3QgZWJpb3NfZGFwYSAqZGFwYTsKKyAgICB2b2lkICpidWY7CisgICAgaW50IHJ2ID0gLTE7CisKKyAgICBidWYgPSBsbWFsbG9jKHNpemUpOworICAgIGlmICghYnVmKQorCXJldHVybiAtMTsKKworICAgIGRhcGEgPSBsbWFsbG9jKHNpemVvZigqZGFwYSkpOworICAgIGlmICghZGFwYSkKKwlnb3RvIG91dDsKKworICAgIG1lbWNweShidWYsIGRhdGEsIHNpemUpOworICAgIG1lbXNldCgmaW5yZWcsIDAsIHNpemVvZiBpbnJlZyk7CisKKyAgICBpZiAoZHJpdmVfaW5mby0+ZWJpb3MpIHsKKwlkYXBhLT5sZW4gPSBzaXplb2YoKmRhcGEpOworCWRhcGEtPmNvdW50ID0gc2l6ZTsKKwlkYXBhLT5vZmYgPSBPRkZTKGJ1Zik7CisJZGFwYS0+c2VnID0gU0VHKGJ1Zik7CisJZGFwYS0+bGJhID0gbGJhOworCisJaW5yZWcuZXNpLndbMF0gPSBPRkZTKGRhcGEpOworCWlucmVnLmRzID0gU0VHKGRhcGEpOworCWlucmVnLmVkeC5iWzBdID0gZHJpdmVfaW5mby0+ZGlzazsKKwlpbnJlZy5lYXgud1swXSA9IDB4NDMwMDsJLyogRXh0ZW5kZWQgd3JpdGUgKi8KKyAgICB9IGVsc2UgeworCXVuc2lnbmVkIGludCBjLCBoLCBzOworCisJaWYgKCFkcml2ZV9pbmZvLT5jYmlvcykgewkvLyBYWFggZXJybm8KKwkgICAgLyogV2UgZmFpbGVkIHRvIGdldCB0aGUgZ2VvbWV0cnkgKi8KKwkgICAgaWYgKGxiYSkKKwkJZ290byBvdXQ7CS8qIENhbiBvbmx5IHdyaXRlIE1CUiAqLworCisJICAgIHMgPSAxOworCSAgICBoID0gMDsKKwkgICAgYyA9IDA7CisJfSBlbHNlCisJICAgIGxiYV90b19jaHMoZHJpdmVfaW5mbywgbGJhLCAmcywgJmgsICZjKTsKKworCS8vIFhYWCBlcnJubworCWlmIChzID4gNjMgfHwgaCA+IDI1NiB8fCBjID4gMTAyMykKKwkgICAgZ290byBvdXQ7CisKKwlpbnJlZy5lYXgud1swXSA9IDB4MDMwMTsJLyogV3JpdGUgb25lIHNlY3RvciAqLworCWlucmVnLmVjeC5iWzFdID0gYyAmIDB4ZmY7CisJaW5yZWcuZWN4LmJbMF0gPSBzICsgKGMgPj4gNik7CisJaW5yZWcuZWR4LmJbMV0gPSBoOworCWlucmVnLmVkeC5iWzBdID0gZHJpdmVfaW5mby0+ZGlzazsKKwlpbnJlZy5lYngud1swXSA9IE9GRlMoYnVmKTsKKwlpbnJlZy5lcyA9IFNFRyhidWYpOworICAgIH0KKworICAgIC8qIFBlcmZvcm0gdGhlIHdyaXRlICovCisgICAgaWYgKGludDEzX3JldHJ5KCZpbnJlZywgJm91dHJlZykpIHsKKwllcnJub19kaXNrID0gb3V0cmVnLmVheC5iWzFdOwkvKiBHaXZlIHVwICovCisgICAgfSBlbHNlCisJcnYgPSBzaXplOworb3V0OgorICAgIGxmcmVlKGRhcGEpOworICAgIGxmcmVlKGJ1Zik7CisgICAgcmV0dXJuIHJ2OworfQorCisvKioKKyAqIHdyaXRlX3ZlcmlmeV9zZWN0b3JzIC0gd3JpdGUgc2V2ZXJhbCBzZWN0b3JzIGZyb20gZGlzaworICogQGRyaXZlX2luZm86CQlkcml2ZWluZm8gc3RydWN0IGRlc2NyaWJpbmcgdGhlIGRpc2sKKyAqIEBsYmE6CQlQb3NpdGlvbiB0byB3cml0ZQorICogQGRhdGE6CQlCdWZmZXIgdG8gd3JpdGUKKyAqKi8KK2ludCB3cml0ZV92ZXJpZnlfc2VjdG9yKHN0cnVjdCBkcml2ZWluZm8gKmRyaXZlX2luZm8sCisJCQljb25zdCB1bnNpZ25lZCBpbnQgbGJhLCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIHJldHVybiB3cml0ZV92ZXJpZnlfc2VjdG9ycyhkcml2ZV9pbmZvLCBsYmEsIGRhdGEsIFNFQ1RPUik7Cit9CisKKy8qKgorICogd3JpdGVfdmVyaWZ5X3NlY3RvcnMgLSB3cml0ZSBzZXZlcmFsIHNlY3RvcnMgZnJvbSBkaXNrCisgKiBAZHJpdmVfaW5mbzoJCWRyaXZlaW5mbyBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgZGlzaworICogQGxiYToJCVBvc2l0aW9uIHRvIHdyaXRlCisgKiBAZGF0YToJCUJ1ZmZlciB0byB3cml0ZQorICogQHNpemU6CQlTaXplIG9mIHRoZSBidWZmZXIgKG51bWJlciBvZiBzZWN0b3JzKQorICoqLworaW50IHdyaXRlX3ZlcmlmeV9zZWN0b3JzKHN0cnVjdCBkcml2ZWluZm8gKmRyaXZlX2luZm8sCisJCQkgY29uc3QgdW5zaWduZWQgaW50IGxiYSwKKwkJCSBjb25zdCB2b2lkICpkYXRhLCBjb25zdCBpbnQgc2l6ZSkKK3sKKyAgICBjaGFyICpyYiA9IG1hbGxvYyhTRUNUT1IgKiBzaXplICogc2l6ZW9mKGNoYXIpKTsKKyAgICBpbnQgc3RhdHVzOworCisgICAgaWYgKHdyaXRlX3NlY3RvcnMoZHJpdmVfaW5mbywgbGJhLCBkYXRhLCBzaXplKSA9PSAtMSkKKwlyZXR1cm4gLTE7CQkvKiBXcml0ZSBmYWlsdXJlICovCisKKyAgICBpZiAocmVhZF9zZWN0b3JzKGRyaXZlX2luZm8sIHJiLCBsYmEsIHNpemUpID09IC0xKQorCXJldHVybiAtMTsJCS8qIFJlYWRiYWNrIGZhaWx1cmUgKi8KKworICAgIHN0YXR1cyA9IG1lbWNtcChkYXRhLCByYiwgU0VDVE9SICogc2l6ZSk7CisgICAgZnJlZShyYik7CisgICAgcmV0dXJuIHN0YXR1cyA/IC0xIDogMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi9kbWkvZG1pLmMgYi9jb20zMi9ncGxsaWIvZG1pL2RtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODRlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvZG1pL2RtaS5jCkBAIC0wLDAgKzEsMTA0MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImRtaS9kbWkuaCIKKworY29uc3QgY2hhciAqb3V0X29mX3NwZWMgPSAiPE9VVCBPRiBTUEVDPiI7Citjb25zdCBjaGFyICpiYWRfaW5kZXggPSAiPEJBRCBJTkRFWD4iOworCisvKgorICogTWlzYy4gdXRpbCBzdHVmZgorICovCisKKy8qCisgKiAzLjMuMTEgT24gQm9hcmQgRGV2aWNlcyBJbmZvcm1hdGlvbiAoVHlwZSAxMCkKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqZG1pX29uX2JvYXJkX2RldmljZXNfdHlwZSh1aW50OF90IGNvZGUpCit7CisgICAgLyogMy4zLjExLjEgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZVtdID0geworCSJPdGhlciIsCQkvKiAweDAxICovCisJIlVua25vd24iLAorCSJWaWRlbyIsCisJIlNDU0kgQ29udHJvbGxlciIsCisJIkV0aGVybmV0IiwKKwkiVG9rZW4gUmluZyIsCisJIlNvdW5kIiwKKwkiUEFUQSBDb250cm9sbGVyIiwKKwkiU0FUQSBDb250cm9sbGVyIiwKKwkiU0FTIENvbnRyb2xsZXIiCS8qIDB4MEEgKi8KKyAgICB9OworCisgICAgaWYgKGNvZGUgPj0gMHgwMSAmJiBjb2RlIDw9IDB4MEEpCisJcmV0dXJuIHR5cGVbY29kZSAtIDB4MDFdOworICAgIHJldHVybiBvdXRfb2Zfc3BlYzsKK30KKworc3RhdGljIHZvaWQgZG1pX29uX2JvYXJkX2RldmljZXMoc3RydWN0IGRtaV9oZWFkZXIgKmgsIHNfZG1pICogZG1pKQoreworICAgIHVpbnQ4X3QgKnAgPSBoLT5kYXRhICsgNDsKKyAgICB1aW50OF90IGNvdW50ID0gKGgtPmxlbmd0aCAtIDB4MDQpIC8gMjsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7CisJIGkgPCBjb3VudAorCSAmJiBpIDwKKwkgc2l6ZW9mIGRtaS0+YmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uIC8KKwkgc2l6ZW9mICpkbWktPmJhc2VfYm9hcmQuZGV2aWNlc19pbmZvcm1hdGlvbjsgaSsrKSB7CisJc3RybGNweShkbWktPmJhc2VfYm9hcmQuZGV2aWNlc19pbmZvcm1hdGlvbltpXS50eXBlLAorCQlkbWlfb25fYm9hcmRfZGV2aWNlc190eXBlKHBbMiAqIGldICYgMHg3RiksCisJCXNpemVvZiBkbWktPmJhc2VfYm9hcmQuZGV2aWNlc19pbmZvcm1hdGlvbltpXS50eXBlKTsKKwlkbWktPmJhc2VfYm9hcmQuZGV2aWNlc19pbmZvcm1hdGlvbltpXS5zdGF0dXMgPSBwWzIgKiBpXSAmIDB4ODA7CisJc3RybGNweShkbWktPmJhc2VfYm9hcmQuZGV2aWNlc19pbmZvcm1hdGlvbltpXS5kZXNjcmlwdGlvbiwKKwkJZG1pX3N0cmluZyhoLCBwWzIgKiBpICsgMV0pLAorCQlzaXplb2YgZG1pLT5iYXNlX2JvYXJkLmRldmljZXNfaW5mb3JtYXRpb25baV0uZGVzY3JpcHRpb24pOworICAgIH0KK30KKworLyoKKyAqIDMuMy4yNCBTeXN0ZW0gUmVzZXQgKFR5cGUgMjMpCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmRtaV9zeXN0ZW1fcmVzZXRfYm9vdF9vcHRpb24odWludDhfdCBjb2RlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpvcHRpb25bXSA9IHsKKwkiT3BlcmF0aW5nIFN5c3RlbSIsCS8qIDB4MSAqLworCSJTeXN0ZW0gVXRpbGl0aWVzIiwKKwkiRG8gTm90IFJlYm9vdCIJCS8qIDB4MyAqLworICAgIH07CisKKyAgICBpZiAoY29kZSA+PSAweDEpCisJcmV0dXJuIG9wdGlvbltjb2RlIC0gMHgxXTsKKyAgICByZXR1cm4gb3V0X29mX3NwZWM7Cit9CisKK3N0YXRpYyB2b2lkIGRtaV9zeXN0ZW1fcmVzZXRfY291bnQodWludDE2X3QgY29kZSwgY2hhciAqYXJyYXkpCit7CisgICAgaWYgKGNvZGUgPT0gMHhGRkZGKQorCXN0cmxjcHkoYXJyYXksICJVbmtub3duIiwgc2l6ZW9mIGFycmF5KTsKKyAgICBlbHNlCisJc25wcmludGYoYXJyYXksIHNpemVvZiBhcnJheSwgIiV1IiwgY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtaV9zeXN0ZW1fcmVzZXRfdGltZXIodWludDE2X3QgY29kZSwgY2hhciAqYXJyYXkpCit7CisgICAgaWYgKGNvZGUgPT0gMHhGRkZGKQorCXN0cmxjcHkoYXJyYXksICJVbmtub3duIiwgc2l6ZW9mIGFycmF5KTsKKyAgICBlbHNlCisJc25wcmludGYoYXJyYXksIHNpemVvZiBhcnJheSwgIiV1IG1pbiIsIGNvZGUpOworfQorCisvKgorICogMy4zLjI1IEhhcmR3YXJlIFNlY3VyaXR5IChUeXBlIDI0KQorICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpkbWlfaGFyZHdhcmVfc2VjdXJpdHlfc3RhdHVzKHVpbnQ4X3QgY29kZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RhdHVzW10gPSB7CisJIkRpc2FibGVkIiwJCS8qIDB4MDAgKi8KKwkiRW5hYmxlZCIsCisJIk5vdCBJbXBsZW1lbnRlZCIsCisJIlVua25vd24iCQkvKiAweDAzICovCisgICAgfTsKKworICAgIHJldHVybiBzdGF0dXNbY29kZV07Cit9CisKKy8qCisgKiAzLjMuMTIgT0VNIFN0cmluZ3MgKFR5cGUgMTEpCisgKi8KKworc3RhdGljIHZvaWQgZG1pX29lbV9zdHJpbmdzKHN0cnVjdCBkbWlfaGVhZGVyICpoLCBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkgICAgc19kbWkgKiBkbWkpCit7CisgICAgdWludDhfdCAqcCA9IGgtPmRhdGEgKyA0OworICAgIHVpbnQ4X3QgY291bnQgPSBwWzB4MDBdOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMTsgaSA8PSBjb3VudDsgaSsrKQorCXNucHJpbnRmKGRtaS0+b2VtX3N0cmluZ3MsIE9FTV9TVFJJTkdTX1NJWkUsICIlcyAlcyAlc1xuIiwKKwkJIGRtaS0+b2VtX3N0cmluZ3MsIHByZWZpeCwgZG1pX3N0cmluZyhoLCBpKSk7Cit9CisKKy8qCisgKiAzLjMuMTMgU3lzdGVtIENvbmZpZ3VyYXRpb24gT3B0aW9ucyAoVHlwZSAxMikKKyAqLworc3RhdGljIHZvaWQgZG1pX3N5c3RlbV9jb25maWd1cmF0aW9uX29wdGlvbnMoc3RydWN0IGRtaV9oZWFkZXIgKmgsCisJCQkJCSAgICAgY29uc3QgY2hhciAqcHJlZml4LCBzX2RtaSAqIGRtaSkKK3sKKyAgICB1aW50OF90ICpwID0gaC0+ZGF0YSArIDQ7CisgICAgdWludDhfdCBjb3VudCA9IHBbMHgwMF07CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IGNvdW50OyBpKyspCisJc25wcmludGYoZG1pLT5zeXN0ZW0uY29uZmlndXJhdGlvbl9vcHRpb25zLAorCQkgU1lTVEVNX0NPTkZJR1VSQVRJT05fT1BUSU9OU19TSVpFLCAiJXMgJXMgJXNcbiIsCisJCSBkbWktPnN5c3RlbS5jb25maWd1cmF0aW9uX29wdGlvbnMsIHByZWZpeCwgZG1pX3N0cmluZyhoLCBpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtaV9zeXN0ZW1fYm9vdF9zdGF0dXModWludDhfdCBjb2RlLCBjaGFyICphcnJheSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RhdHVzW10gPSB7CisJIk5vIGVycm9ycyBkZXRlY3RlZCIsCS8qIDAgKi8KKwkiTm8gYm9vdGFibGUgbWVkaWEiLAorCSJPcGVyYXRpbmcgc3lzdGVtIGZhaWxlZCB0byBsb2FkIiwKKwkiRmlybXdhcmUtZGV0ZWN0ZWQgaGFyZHdhcmUgZmFpbHVyZSIsCisJIk9wZXJhdGluZyBzeXN0ZW0tZGV0ZWN0ZWQgaGFyZHdhcmUgZmFpbHVyZSIsCisJIlVzZXItcmVxdWVzdGVkIGJvb3QiLAorCSJTeXN0ZW0gc2VjdXJpdHkgdmlvbGF0aW9uIiwKKwkiUHJldmlvdXNseS1yZXF1ZXN0ZWQgaW1hZ2UiLAorCSJTeXN0ZW0gd2F0Y2hkb2cgdGltZXIgZXhwaXJlZCIJLyogOCAqLworICAgIH07CisKKyAgICBpZiAoY29kZSA8PSA4KQorCXN0cmxjcHkoYXJyYXksIHN0YXR1c1tjb2RlXSwgU1lTVEVNX0JPT1RfU1RBVFVTX1NJWkUpOworICAgIGlmIChjb2RlID49IDEyOCAmJiBjb2RlIDw9IDE5MSkKKwlzdHJsY3B5KGFycmF5LCAiT0VNLXNwZWNpZmljIiwgU1lTVEVNX0JPT1RfU1RBVFVTX1NJWkUpOworICAgIGlmIChjb2RlID49IDE5MikKKwlzdHJsY3B5KGFycmF5LCAiUHJvZHVjdC1zcGVjaWZpYyIsIFNZU1RFTV9CT09UX1NUQVRVU19TSVpFKTsKK30KKwordm9pZCBkbWlfYmlvc19ydW50aW1lX3NpemUodWludDMyX3QgY29kZSwgc19kbWkgKiBkbWkpCit7CisgICAgaWYgKGNvZGUgJiAweDAwMDAwM0ZGKSB7CisJZG1pLT5iaW9zLnJ1bnRpbWVfc2l6ZSA9IGNvZGU7CisJc3RybGNweShkbWktPmJpb3MucnVudGltZV9zaXplX3VuaXQsICJieXRlcyIsCisJCXNpemVvZihkbWktPmJpb3MucnVudGltZV9zaXplX3VuaXQpKTsKKyAgICB9IGVsc2UgeworCWRtaS0+Ymlvcy5ydW50aW1lX3NpemUgPSBjb2RlID4+IDEwOworCXN0cmxjcHkoZG1pLT5iaW9zLnJ1bnRpbWVfc2l6ZV91bml0LCAiS0IiLAorCQlzaXplb2YoZG1pLT5iaW9zLnJ1bnRpbWVfc2l6ZV91bml0KSk7CisKKyAgICB9Cit9CisKK3ZvaWQgZG1pX2Jpb3NfY2hhcmFjdGVyaXN0aWNzKHVpbnQ2NF90IGNvZGUsIHNfZG1pICogZG1pKQoreworICAgIGludCBpOworICAgIC8qCisgICAgICogVGhpcyBpc24ndCB2ZXJ5IGNsZWFyIHdoYXQgdGhpcyBiaXQgaXMgc3VwcG9zZWQgdG8gbWVhbgorICAgICAqLworICAgIC8vaWYoY29kZS5sJigxPDwzKSkKKyAgICBpZiAoY29kZSAmJiAoMSA8PCAzKSkgeworCSgoYm9vbCAqKSAoJmRtaS0+Ymlvcy5jaGFyYWN0ZXJpc3RpY3MpKVswXSA9IHRydWU7CisJcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaSA9IDQ7IGkgPD0gMzE7IGkrKykKKwkvL2lmKGNvZGUubCYoMTw8aSkpCisJaWYgKGNvZGUgJiAoMSA8PCBpKSkKKwkgICAgKChib29sICopICgmZG1pLT5iaW9zLmNoYXJhY3RlcmlzdGljcykpW2kgLSAzXSA9IHRydWU7Cit9CisKK3ZvaWQgZG1pX2Jpb3NfY2hhcmFjdGVyaXN0aWNzX3gxKHVpbnQ4X3QgY29kZSwgc19kbWkgKiBkbWkpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IDc7IGkrKykKKwlpZiAoY29kZSAmICgxIDw8IGkpKQorCSAgICAoKGJvb2wgKikgKCZkbWktPmJpb3MuY2hhcmFjdGVyaXN0aWNzX3gxKSlbaV0gPSB0cnVlOworfQorCit2b2lkIGRtaV9iaW9zX2NoYXJhY3RlcmlzdGljc194Mih1aW50OF90IGNvZGUsIHNfZG1pICogZG1pKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8PSAyOyBpKyspCisJaWYgKGNvZGUgJiAoMSA8PCBpKSkKKwkgICAgKChib29sICopICgmZG1pLT5iaW9zLmNoYXJhY3RlcmlzdGljc194MikpW2ldID0gdHJ1ZTsKK30KKwordm9pZCBkbWlfc3lzdGVtX3V1aWQodWludDhfdCAqIHAsIHNfZG1pICogZG1pKQoreworICAgIGludCBvbmx5MHhGRiA9IDEsIG9ubHkweDAwID0gMTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNiAmJiAob25seTB4MDAgfHwgb25seTB4RkYpOyBpKyspIHsKKwlpZiAocFtpXSAhPSAweDAwKQorCSAgICBvbmx5MHgwMCA9IDA7CisJaWYgKHBbaV0gIT0gMHhGRikKKwkgICAgb25seTB4RkYgPSAwOworICAgIH0KKworICAgIGlmIChvbmx5MHhGRikgeworCXNwcmludGYoZG1pLT5zeXN0ZW0udXVpZCwgIk5vdCBQcmVzZW50Iik7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAob25seTB4MDApIHsKKwlzcHJpbnRmKGRtaS0+c3lzdGVtLnV1aWQsICJOb3QgU2V0dGFibGUiKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgc3ByaW50ZihkbWktPnN5c3RlbS51dWlkLAorCSAgICAiJTAyWCUwMlglMDJYJTAyWC0lMDJYJTAyWC0lMDJYJTAyWC0lMDJYJTAyWC0lMDJYJTAyWCUwMlglMDJYJTAyWCUwMlgiLAorCSAgICBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdLCBwWzddLCBwWzhdLCBwWzldLCBwWzEwXSwKKwkgICAgcFsxMV0sIHBbMTJdLCBwWzEzXSwgcFsxNF0sIHBbMTVdKTsKK30KKwordm9pZCBkbWlfc3lzdGVtX3dha2VfdXBfdHlwZSh1aW50OF90IGNvZGUsIHNfZG1pICogZG1pKQoreworICAgIC8qIDMuMy4yLjEgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZVtdID0geworCSJSZXNlcnZlZCIsCQkvKiAweDAwICovCisJIk90aGVyIiwKKwkiVW5rbm93biIsCisJIkFQTSBUaW1lciIsCisJIk1vZGVtIFJpbmciLAorCSJMQU4gUmVtb3RlIiwKKwkiUG93ZXIgU3dpdGNoIiwKKwkiUENJIFBNRSMiLAorCSJBQyBQb3dlciBSZXN0b3JlZCIJLyogMHgwOCAqLworICAgIH07CisKKyAgICBpZiAoY29kZSA8PSAweDA4KSB7CisJc3RybGNweShkbWktPnN5c3RlbS53YWtldXBfdHlwZSwgdHlwZVtjb2RlXSwKKwkJc2l6ZW9mKGRtaS0+c3lzdGVtLndha2V1cF90eXBlKSk7CisgICAgfSBlbHNlIHsKKwlzdHJsY3B5KGRtaS0+c3lzdGVtLndha2V1cF90eXBlLCBvdXRfb2Zfc3BlYywKKwkJc2l6ZW9mKGRtaS0+c3lzdGVtLndha2V1cF90eXBlKSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgZG1pX2Jhc2VfYm9hcmRfZmVhdHVyZXModWludDhfdCBjb2RlLCBzX2RtaSAqIGRtaSkKK3sKKyAgICBpZiAoKGNvZGUgJiAweDFGKSAhPSAwKSB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDQ7IGkrKykKKwkgICAgaWYgKGNvZGUgJiAoMSA8PCBpKSkKKwkJKChib29sICopICgmZG1pLT5iYXNlX2JvYXJkLmZlYXR1cmVzKSlbaV0gPSB0cnVlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZG1pX2Jhc2VfYm9hcmRfdHlwZSh1aW50OF90IGNvZGUsIHNfZG1pICogZG1pKQoreworICAgIC8qIDMuMy4zLjIgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZVtdID0geworICAgICAgICAgICAgIlVua25vd24iLCAvKiAweDAxICovCisgICAgICAgICAgICAiT3RoZXIiLAorICAgICAgICAgICAgIlNlcnZlciBCbGFkZSIsCisgICAgICAgICAgICAiQ29ubmVjdGl2aXR5IFN3aXRjaCIsCisgICAgICAgICAgICAiU3lzdGVtIE1hbmFnZW1lbnQgTW9kdWxlIiwKKyAgICAgICAgICAgICJQcm9jZXNzb3IgTW9kdWxlIiwKKyAgICAgICAgICAgICJJL08gTW9kdWxlIiwKKyAgICAgICAgICAgICJNZW1vcnkgTW9kdWxlIiwKKyAgICAgICAgICAgICJEYXVnaHRlciBCb2FyZCIsCisgICAgICAgICAgICAiTW90aGVyYm9hcmQiLAorICAgICAgICAgICAgIlByb2Nlc3NvcitNZW1vcnkgTW9kdWxlIiwKKyAgICAgICAgICAgICJQcm9jZXNzb3IrSS9PIE1vZHVsZSIsCisgICAgICAgICAgICAiSW50ZXJjb25uZWN0IEJvYXJkIiAvKiAweDBEICovCisgICAgfTsKKworICAgIGlmIChjb2RlID49IDB4MDEgJiYgY29kZSA8PSAweDBEKSB7CisJc3RybGNweShkbWktPmJhc2VfYm9hcmQudHlwZSwgdHlwZVtjb2RlXSwKKwkJc2l6ZW9mKGRtaS0+YmFzZV9ib2FyZC50eXBlKSk7CisgICAgfSBlbHNlIHsKKwlzdHJsY3B5KGRtaS0+YmFzZV9ib2FyZC50eXBlLCBvdXRfb2Zfc3BlYywKKwkJc2l6ZW9mKGRtaS0+YmFzZV9ib2FyZC50eXBlKSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgZG1pX3Byb2Nlc3Nvcl92b2x0YWdlKHVpbnQ4X3QgY29kZSwgc19kbWkgKiBkbWkpCit7CisgICAgLyogMy4zLjUuNCAqLworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCB2b2x0YWdlW10gPSB7CisJNTAwMCwKKwkzMzAwLAorCTI5MDAKKyAgICB9OworICAgIGludCBpOworCisgICAgaWYgKGNvZGUgJiAweDgwKQorCWRtaS0+cHJvY2Vzc29yLnZvbHRhZ2VfbXYgPSAoY29kZSAmIDB4N2YpICogMTAwOworICAgIGVsc2UgeworCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKQorCSAgICBpZiAoY29kZSAmICgxIDw8IGkpKQorCQlkbWktPnByb2Nlc3Nvci52b2x0YWdlX212ID0gdm9sdGFnZVtpXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRtaV9wcm9jZXNzb3JfaWQodWludDhfdCB0eXBlLCB1aW50OF90ICogcCwgY29uc3QgY2hhciAqdmVyc2lvbiwKKwkJCSAgICAgc19kbWkgKiBkbWkpCit7CisgICAgLyoKKyAgICAgKiBFeHRyYSBmbGFncyBhcmUgbm93IHJldHVybmVkIGluIHRoZSBFQ1ggcmVnaXN0ZXIgd2hlbiBvbmUgY2FsbHMKKyAgICAgKiB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uIFRoZWlyIG1lYW5pbmcgaXMgZXhwbGFpbmVkIGluIHRhYmxlIDYsIGJ1dAorICAgICAqIERNSSBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXQuCisgICAgICovCisgICAgdWludDMyX3QgZWF4LCBlZHg7CisgICAgaW50IHNpZyA9IDA7CisKKyAgICAvKgorICAgICAqIFRoaXMgbWlnaHQgaGVscCBsZWFybiBhYm91dCBuZXcgcHJvY2Vzc29ycyBzdXBwb3J0aW5nIHRoZQorICAgICAqIENQVUlEIGluc3RydWN0aW9uIG9yIGFub3RoZXIgZm9ybSBvZiBpZGVudGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBzcHJpbnRmKGRtaS0+cHJvY2Vzc29yLmlkLCAiSUQ6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkgICAgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgcFs2XSwgcFs3XSk7CisKKyAgICBpZiAodHlwZSA9PSAweDA1KSB7CQkvKiA4MDM4NiAqLworCXVpbnQxNl90IGR4ID0gV09SRChwKTsKKwkvKgorCSAqIDgwMzg2IGhhdmUgYSBkaWZmZXJlbnQgc2lnbmF0dXJlLgorCSAqLworCWRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS50eXBlID0gKGR4ID4+IDEyKTsKKwlkbWktPnByb2Nlc3Nvci5zaWduYXR1cmUuZmFtaWx5ID0gKChkeCA+PiA4KSAmIDB4Rik7CisJZG1pLT5wcm9jZXNzb3Iuc2lnbmF0dXJlLnN0ZXBwaW5nID0gKGR4ID4+IDQpICYgMHhGOworCWRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS5taW5vcl9zdGVwcGluZyA9IChkeCAmIDB4Rik7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAodHlwZSA9PSAweDA2KSB7CQkvKiA4MDQ4NiAqLworCXVpbnQxNl90IGR4ID0gV09SRChwKTsKKwkvKgorCSAqIE5vdCBhbGwgODA0ODYgQ1BVIHN1cHBvcnQgdGhlIENQVUlEIGluc3RydWN0aW9uLCB3ZSBoYXZlIHRvIGZpbmQKKwkgKiB3ZXRoZXIgdGhlIG9uZSB3ZSBoYXZlIGhlcmUgZG9lcyBvciBub3QuIE5vdGUgdGhhdCB0aGlzIHRyaWNrCisJICogd29ya3Mgb25seSBiZWNhdXNlIHdlIGtub3cgdGhhdCA4MDQ4NiBtdXN0IGJlIGxpdHRsZS1lbmRpYW4uCisJICovCisJaWYgKChkeCAmIDB4MEYwMCkgPT0gMHgwNDAwCisJICAgICYmICgoZHggJiAweDAwRjApID09IDB4MDA0MCB8fCAoZHggJiAweDAwRjApID49IDB4MDA3MCkKKwkgICAgJiYgKChkeCAmIDB4MDAwRikgPj0gMHgwMDAzKSkKKwkgICAgc2lnID0gMTsKKwllbHNlIHsKKwkgICAgZG1pLT5wcm9jZXNzb3Iuc2lnbmF0dXJlLnR5cGUgPSAoKGR4ID4+IDEyKSAmIDB4Myk7CisJICAgIGRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS5mYW1pbHkgPSAoKGR4ID4+IDgpICYgMHhGKTsKKwkgICAgZG1pLT5wcm9jZXNzb3Iuc2lnbmF0dXJlLm1vZGVsID0gKChkeCA+PiA0KSAmIDB4Rik7CisJICAgIGRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS5zdGVwcGluZyA9IChkeCAmIDB4Rik7CisJICAgIHJldHVybjsKKwl9CisgICAgfSBlbHNlIGlmICgodHlwZSA+PSAweDBCICYmIHR5cGUgPD0gMHgxMykJLyogSW50ZWwsIEN5cml4ICovCisJICAgICAgIHx8KHR5cGUgPj0gMHhCMCAmJiB0eXBlIDw9IDB4QjMpCS8qIEludGVsICovCisJICAgICAgIHx8dHlwZSA9PSAweEI1CS8qIEludGVsICovCisJICAgICAgIHx8IHR5cGUgPT0gMHhCOSkJLyogSW50ZWwgKi8KKwlzaWcgPSAxOworICAgIGVsc2UgaWYgKCh0eXBlID49IDB4MTggJiYgdHlwZSA8PSAweDFEKQkvKiBBTUQgKi8KKwkgICAgIHx8dHlwZSA9PSAweDFGCS8qIEFNRCAqLworCSAgICAgfHwgKHR5cGUgPj0gMHhCNiAmJiB0eXBlIDw9IDB4QjcpCS8qIEFNRCAqLworCSAgICAgfHwodHlwZSA+PSAweDgzICYmIHR5cGUgPD0gMHg4NSkpCS8qIEFNRCAqLworCXNpZyA9IDI7CisgICAgZWxzZSBpZiAodHlwZSA9PSAweDAxIHx8IHR5cGUgPT0gMHgwMikgeworCS8qCisJICogU29tZSBYODYtY2xhc3MgQ1BVIGhhdmUgZmFtaWx5ICJPdGhlciIgb3IgIlVua25vd24iLiBJbiB0aGlzIGNhc2UsCisJICogd2UgdXNlIHRoZSB2ZXJzaW9uIHN0cmluZyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUga25vd24gdG8KKwkgKiBzdXBwb3J0IHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KKwkgKi8KKwlpZiAoc3RybmNtcCh2ZXJzaW9uLCAiUGVudGl1bSBJSUkgTU1YIiwgMTUpID09IDApCisJICAgIHNpZyA9IDE7CisJZWxzZSBpZiAoc3RybmNtcCh2ZXJzaW9uLCAiQU1EIEF0aGxvbihUTSkiLCAxNCkgPT0gMAorCQkgfHwgc3RybmNtcCh2ZXJzaW9uLCAiQU1EIE9wdGVyb24odG0pIiwgMTUpID09IDApCisJICAgIHNpZyA9IDI7CisJZWxzZQorCSAgICByZXR1cm47CisgICAgfSBlbHNlCQkJLyogbm90IFg4Ni1jbGFzcyAqLworCXJldHVybjsKKworICAgIGVheCA9IERXT1JEKHApOworICAgIGVkeCA9IERXT1JEKHAgKyA0KTsKKyAgICBzd2l0Y2ggKHNpZykgeworICAgIGNhc2UgMToJCQkvKiBJbnRlbCAqLworCWRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS50eXBlID0gKChlYXggPj4gMTIpICYgMHgzKTsKKwlkbWktPnByb2Nlc3Nvci5zaWduYXR1cmUuZmFtaWx5ID0KKwkgICAgKCgoZWF4ID4+IDE2KSAmIDB4RkYwKSArICgoZWF4ID4+IDgpICYgMHgwMEYpKTsKKwlkbWktPnByb2Nlc3Nvci5zaWduYXR1cmUubW9kZWwgPQorCSAgICAoKChlYXggPj4gMTIpICYgMHhGMCkgKyAoKGVheCA+PiA0KSAmIDB4MEYpKTsKKwlkbWktPnByb2Nlc3Nvci5zaWduYXR1cmUuc3RlcHBpbmcgPSAoZWF4ICYgMHhGKTsKKwlicmVhazsKKyAgICBjYXNlIDI6CQkJLyogQU1EICovCisJZG1pLT5wcm9jZXNzb3Iuc2lnbmF0dXJlLmZhbWlseSA9CisJICAgICgoKGVheCA+PiA4KSAmIDB4RikgPT0gMHhGID8gKGVheCA+PiAyMCkgJiAweEZGIDogKGVheCA+PiA4KSAmIDB4Rik7CisJZG1pLT5wcm9jZXNzb3Iuc2lnbmF0dXJlLm1vZGVsID0KKwkgICAgKCgoZWF4ID4+IDQpICYgMHhGKSA9PSAweEYgPyAoZWF4ID4+IDE2KSAmIDB4RiA6IChlYXggPj4gNCkgJiAweEYpOworCWRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS5zdGVwcGluZyA9IChlYXggJiAweEYpOworCWJyZWFrOworICAgIH0KKworICAgIGVkeCA9IERXT1JEKHAgKyA0KTsKKyAgICBpZiAoKGVkeCAmIDB4M0ZGN0ZERkYpICE9IDApIHsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9IDMxOyBpKyspCisJICAgIGlmIChjcHVfZmxhZ3Nfc3RyaW5nc1tpXSAhPSBOVUxMICYmIGVkeCAmICgxIDw8IGkpKQorCQkoKGJvb2wgKikgKCZkbWktPnByb2Nlc3Nvci5jcHVfZmxhZ3MpKVtpXSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIHRvX2RtaV9oZWFkZXIoc3RydWN0IGRtaV9oZWFkZXIgKmgsIHVpbnQ4X3QgKiBkYXRhKQoreworICAgIGgtPnR5cGUgPSBkYXRhWzBdOworICAgIGgtPmxlbmd0aCA9IGRhdGFbMV07CisgICAgaC0+aGFuZGxlID0gV09SRChkYXRhICsgMik7CisgICAgaC0+ZGF0YSA9IGRhdGE7Cit9CisKK2NvbnN0IGNoYXIgKmRtaV9zdHJpbmcoc3RydWN0IGRtaV9oZWFkZXIgKmRtLCB1aW50OF90IHMpCit7CisgICAgY2hhciAqYnAgPSAoY2hhciAqKWRtLT5kYXRhOworICAgIHNpemVfdCBpLCBsZW47CisKKyAgICBpZiAocyA9PSAwKQorCXJldHVybiAiTm90IFNwZWNpZmllZCI7CisKKyAgICBicCArPSBkbS0+bGVuZ3RoOworICAgIHdoaWxlIChzID4gMSAmJiAqYnApIHsKKwlicCArPSBzdHJsZW4oYnApOworCWJwKys7CisJcy0tOworICAgIH0KKworICAgIGlmICghKmJwKQorCXJldHVybiBiYWRfaW5kZXg7CisKKyAgICAvKiBBU0NJSSBmaWx0ZXJpbmcgKi8KKyAgICBsZW4gPSBzdHJsZW4oYnApOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwlpZiAoYnBbaV0gPCAzMiB8fCBicFtpXSA9PSAxMjcpCisJICAgIGJwW2ldID0gJy4nOworCisgICAgcmV0dXJuIGJwOworfQorCitpbnQgY2hlY2tzdW0odWludDhfdCAqIGJ1ZiwgaW50IGxlbikKK3sKKyAgICB1aW50OF90IHN1bSA9IDA7CisgICAgaW50IGE7CisKKyAgICBmb3IgKGEgPSAwOyBhIDwgbGVuOyBhKyspCisJc3VtICs9IGJ1ZlthXTsKKyAgICByZXR1cm4gKHN1bSA9PSAwKTsKK30KKworc3RhdGljIGludCBzbWJpb3NfZGVjb2RlKHNfZG1pICogZG1pLCB1aW50OF90ICogYnVmKQoreworCisgICAgZG1pLT5kbWl0YWJsZS52ZXIgPSAoYnVmWzB4MDZdIDw8IDgpICsgYnVmWzB4MDddOworICAgIC8qIFNvbWUgQklPUyByZXBvcnQgd2VpcmQgU01CSU9TIHZlcnNpb24sIGZpeCB0aGF0IHVwICovCisgICAgc3dpdGNoIChkbWktPmRtaXRhYmxlLnZlcikgeworICAgIGNhc2UgMHgwMjFGOgorCWRtaS0+ZG1pdGFibGUudmVyID0gMHgwMjAzOworCWJyZWFrOworICAgIGNhc2UgMHgwMjMzOgorCWRtaS0+ZG1pdGFibGUudmVyID0gMHgwMjA2OworCWJyZWFrOworICAgIH0KKyAgICBkbWktPmRtaXRhYmxlLm1ham9yX3ZlcnNpb24gPSBkbWktPmRtaXRhYmxlLnZlciA+PiA4OworICAgIGRtaS0+ZG1pdGFibGUubWlub3JfdmVyc2lvbiA9IGRtaS0+ZG1pdGFibGUudmVyICYgMHhGRjsKKworICAgIHJldHVybiBETUlfVEFCTEVfUFJFU0VOVDsKK30KKworc3RhdGljIGludCBsZWdhY3lfZGVjb2RlKHNfZG1pICogZG1pLCB1aW50OF90ICogYnVmKQoreworICAgIGRtaS0+ZG1pdGFibGUubnVtID0gYnVmWzEzXSA8PCA4IHwgYnVmWzEyXTsKKyAgICBkbWktPmRtaXRhYmxlLmxlbiA9IGJ1Zls3XSA8PCA4IHwgYnVmWzZdOworICAgIGRtaS0+ZG1pdGFibGUuYmFzZSA9IGJ1ZlsxMV0gPDwgMjQgfCBidWZbMTBdIDw8IDE2IHwgYnVmWzldIDw8IDggfCBidWZbOF07CisKKyAgICAvKiBWZXJzaW9uIGFscmVhZHkgZm91bmQ/ICovCisgICAgaWYgKGRtaS0+ZG1pdGFibGUudmVyID4gMCkKKwlyZXR1cm4gRE1JX1RBQkxFX1BSRVNFTlQ7CisKKyAgICBkbWktPmRtaXRhYmxlLnZlciA9IChidWZbMHgwNl0gPDwgOCkgKyBidWZbMHgwN107CisKKyAgICAvKgorICAgICAqIERNSSB2ZXJzaW9uIDAuMCBtZWFucyB0aGF0IHRoZSByZWFsIHZlcnNpb24gaXMgdGFrZW4gZnJvbQorICAgICAqIHRoZSBTTUJJT1MgdmVyc2lvbiwgd2hpY2ggd2UgZG9uJ3Qga25vdyBhdCB0aGlzIHBvaW50LgorICAgICAqLworICAgIGlmIChidWZbMTRdICE9IDApIHsKKwlkbWktPmRtaXRhYmxlLm1ham9yX3ZlcnNpb24gPSBidWZbMTRdID4+IDQ7CisJZG1pLT5kbWl0YWJsZS5taW5vcl92ZXJzaW9uID0gYnVmWzE0XSAmIDB4MEY7CisgICAgfSBlbHNlIHsKKwlkbWktPmRtaXRhYmxlLm1ham9yX3ZlcnNpb24gPSAwOworCWRtaS0+ZG1pdGFibGUubWlub3JfdmVyc2lvbiA9IDA7CisgICAgfQorICAgIHJldHVybiBETUlfVEFCTEVfUFJFU0VOVDsKK30KKworaW50IGRtaV9pdGVyYXRlKHNfZG1pICogZG1pKQoreworICAgIHVpbnQ4X3QgKnAsICpxOworICAgIGludCBmb3VuZCA9IDA7CisKKyAgICAvKiBDbGVhbmluZyBzdHJ1Y3R1cmVzICovCisgICAgbWVtc2V0KGRtaSwgMCwgc2l6ZW9mKHNfZG1pKSk7CisKKyAgICBtZW1zZXQoJmRtaS0+YmFzZV9ib2FyZCwgMCwgc2l6ZW9mKHNfYmFzZV9ib2FyZCkpOworICAgIG1lbXNldCgmZG1pLT5iYXR0ZXJ5LCAwLCBzaXplb2Yoc19iYXR0ZXJ5KSk7CisgICAgbWVtc2V0KCZkbWktPmJpb3MsIDAsIHNpemVvZihzX2Jpb3MpKTsKKyAgICBtZW1zZXQoJmRtaS0+Y2hhc3NpcywgMCwgc2l6ZW9mKHNfY2hhc3NpcykpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0RNSV9NRU1PUllfSVRFTVM7IGkrKykKKwltZW1zZXQoJmRtaS0+bWVtb3J5W2ldLCAwLCBzaXplb2Yoc19tZW1vcnkpKTsKKyAgICBtZW1zZXQoJmRtaS0+cHJvY2Vzc29yLCAwLCBzaXplb2Yoc19wcm9jZXNzb3IpKTsKKyAgICBtZW1zZXQoJmRtaS0+c3lzdGVtLCAwLCBzaXplb2Yoc19zeXN0ZW0pKTsKKworICAgIC8qIFVudGlsIHdlIGZvdW5kIHRoaXMgZWxlbWVudHMgaW4gdGhlIGRtaXRhYmxlLCB3ZSBjb25zaWRlciB0aGVtIGFzIG5vdCBmaWxsZWQgKi8KKyAgICBkbWktPmJhc2VfYm9hcmQuZmlsbGVkID0gZmFsc2U7CisgICAgZG1pLT5iYXR0ZXJ5LmZpbGxlZCA9IGZhbHNlOworICAgIGRtaS0+Ymlvcy5maWxsZWQgPSBmYWxzZTsKKyAgICBkbWktPmNoYXNzaXMuZmlsbGVkID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfRE1JX01FTU9SWV9JVEVNUzsgaSsrKQorCWRtaS0+bWVtb3J5W2ldLmZpbGxlZCA9IGZhbHNlOworICAgIGRtaS0+cHJvY2Vzc29yLmZpbGxlZCA9IGZhbHNlOworICAgIGRtaS0+c3lzdGVtLmZpbGxlZCA9IGZhbHNlOworCisgICAgcCA9ICh1aW50OF90ICopIDB4RjAwMDA7CS8qIFRoZSBzdGFydCBhZGRyZXNzIHRvIGxvb2sgYXQgdGhlIGRtaSB0YWJsZSAqLworICAgIC8qIFRoZSBhbmNob3Itc3RyaW5nIGlzIDE2LWJ5dGVzIGFsaWduZWQgKi8KKyAgICBmb3IgKHEgPSBwOyBxIDwgcCArIDB4MTAwMDA7IHEgKz0gMTYpIHsKKwkvKiBUbyB2YWxpZGF0ZSB0aGUgcHJlc2VuY2Ugb2YgU01CSU9TOgorCSAqICsgdGhlIG92ZXJhbGwgY2hlY2tzdW0gbXVzdCBiZSBjb3JyZWN0CisJICogKyB0aGUgaW50ZXJtZWRpYXRlIGFuY2hvci1zdHJpbmcgbXVzdCBiZSBfRE1JXworCSAqICsgdGhlIGludGVybWVkaWF0ZSBjaGVja3N1bSBtdXN0IGJlIGNvcnJlY3QKKwkgKi8KKwlpZiAobWVtY21wKHEsICJfU01fIiwgNCkgPT0gMCAmJgorCSAgICBjaGVja3N1bShxLCBxWzB4MDVdKSAmJgorCSAgICBtZW1jbXAocSArIDB4MTAsICJfRE1JXyIsIDUpID09IDAgJiYgY2hlY2tzdW0ocSArIDB4MTAsIDB4MEYpKSB7CisJICAgIC8qIERvIG5vdCByZXR1cm4sIGxlZ2FjeV9kZWNvZGUgd2lsbCBuZWVkIHRvIGJlIGNhbGxlZAorCSAgICAgKiBvbiB0aGUgaW50ZXJtZWRpYXRlIHN0cnVjdHVyZSB0byBnZXQgdGhlIHRhYmxlIGxlbmd0aAorCSAgICAgKiBhbmQgYWRkcmVzcworCSAgICAgKi8KKwkgICAgc21iaW9zX2RlY29kZShkbWksIHEpOworCX0gZWxzZSBpZiAobWVtY21wKHEsICJfRE1JXyIsIDUpID09IDAgJiYgY2hlY2tzdW0ocSwgMHgwRikpIHsKKwkgICAgZm91bmQgPSAxOworCSAgICBsZWdhY3lfZGVjb2RlKGRtaSwgcSk7CisJfQorICAgIH0KKworICAgIGlmIChmb3VuZCkKKwlyZXR1cm4gRE1JX1RBQkxFX1BSRVNFTlQ7CisKKyAgICBkbWktPmRtaXRhYmxlLmJhc2UgPSAwOworICAgIGRtaS0+ZG1pdGFibGUubnVtID0gMDsKKyAgICBkbWktPmRtaXRhYmxlLnZlciA9IDA7CisgICAgZG1pLT5kbWl0YWJsZS5sZW4gPSAwOworICAgIHJldHVybiAtRU5PRE1JVEFCTEU7Cit9CisKK3ZvaWQgZG1pX2RlY29kZShzdHJ1Y3QgZG1pX2hlYWRlciAqaCwgdWludDE2X3QgdmVyLCBzX2RtaSAqIGRtaSkKK3sKKyAgICB1aW50OF90ICpkYXRhID0gaC0+ZGF0YTsKKworICAgIC8qCisgICAgICogTm90ZTogRE1JIHR5cGVzIDM3LCAzOCBhbmQgMzkgYXJlIHVudGVzdGVkCisgICAgICovCisgICAgc3dpdGNoIChoLT50eXBlKSB7CisgICAgY2FzZSAwOgkJCS8qIDMuMy4xIEJJT1MgSW5mb3JtYXRpb24gKi8KKwlpZiAoaC0+bGVuZ3RoIDwgMHgxMikKKwkgICAgYnJlYWs7CisJZG1pLT5iaW9zLmZpbGxlZCA9IHRydWU7CisJc3RybGNweShkbWktPmJpb3MudmVuZG9yLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNF0pLAorCQlzaXplb2YoZG1pLT5iaW9zLnZlbmRvcikpOworCXN0cmxjcHkoZG1pLT5iaW9zLnZlcnNpb24sIGRtaV9zdHJpbmcoaCwgZGF0YVsweDA1XSksCisJCXNpemVvZihkbWktPmJpb3MudmVyc2lvbikpOworCXN0cmxjcHkoZG1pLT5iaW9zLnJlbGVhc2VfZGF0ZSwgZG1pX3N0cmluZyhoLCBkYXRhWzB4MDhdKSwKKwkJc2l6ZW9mKGRtaS0+Ymlvcy5yZWxlYXNlX2RhdGUpKTsKKwlkbWktPmJpb3MuYWRkcmVzcyA9IFdPUkQoZGF0YSArIDB4MDYpOworCWRtaV9iaW9zX3J1bnRpbWVfc2l6ZSgoMHgxMDAwMCAtIFdPUkQoZGF0YSArIDB4MDYpKSA8PCA0LCBkbWkpOworCWRtaS0+Ymlvcy5yb21fc2l6ZSA9IChkYXRhWzB4MDldICsgMSkgPDwgNjsKKwlzdHJsY3B5KGRtaS0+Ymlvcy5yb21fc2l6ZV91bml0LCAia0IiLCBzaXplb2YoZG1pLT5iaW9zLnJvbV9zaXplX3VuaXQpKTsKKwlkbWlfYmlvc19jaGFyYWN0ZXJpc3RpY3MoUVdPUkQoZGF0YSArIDB4MEEpLCBkbWkpOworCisJaWYgKGgtPmxlbmd0aCA8IDB4MTMpCisJICAgIGJyZWFrOworCWRtaV9iaW9zX2NoYXJhY3RlcmlzdGljc194MShkYXRhWzB4MTJdLCBkbWkpOworCWlmIChoLT5sZW5ndGggPCAweDE0KQorCSAgICBicmVhazsKKwlkbWlfYmlvc19jaGFyYWN0ZXJpc3RpY3NfeDIoZGF0YVsweDEzXSwgZG1pKTsKKwlpZiAoaC0+bGVuZ3RoIDwgMHgxOCkKKwkgICAgYnJlYWs7CisJaWYgKGRhdGFbMHgxNF0gIT0gMHhGRiAmJiBkYXRhWzB4MTVdICE9IDB4RkYpCisJICAgIHNucHJpbnRmKGRtaS0+Ymlvcy5iaW9zX3JldmlzaW9uLCBzaXplb2YoZG1pLT5iaW9zLmJpb3NfcmV2aXNpb24pLAorCQkgICAgICIldS4ldSIsIGRhdGFbMHgxNF0sIGRhdGFbMHgxNV0pOworCWlmIChkYXRhWzB4MTZdICE9IDB4RkYgJiYgZGF0YVsweDE3XSAhPSAweEZGKQorCSAgICBzbnByaW50ZihkbWktPmJpb3MuZmlybXdhcmVfcmV2aXNpb24sCisJCSAgICAgc2l6ZW9mKGRtaS0+Ymlvcy5maXJtd2FyZV9yZXZpc2lvbiksICIldS4ldSIsIGRhdGFbMHgxNl0sCisJCSAgICAgZGF0YVsweDE3XSk7CisJYnJlYWs7CisgICAgY2FzZSAxOgkJCS8qIDMuMy4yIFN5c3RlbSBJbmZvcm1hdGlvbiAqLworCWlmIChoLT5sZW5ndGggPCAweDA4KQorCSAgICBicmVhazsKKwlkbWktPnN5c3RlbS5maWxsZWQgPSB0cnVlOworCXN0cmxjcHkoZG1pLT5zeXN0ZW0ubWFudWZhY3R1cmVyLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNF0pLAorCQlzaXplb2YoZG1pLT5zeXN0ZW0ubWFudWZhY3R1cmVyKSk7CisJc3RybGNweShkbWktPnN5c3RlbS5wcm9kdWN0X25hbWUsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDA1XSksCisJCXNpemVvZihkbWktPnN5c3RlbS5wcm9kdWN0X25hbWUpKTsKKwlzdHJsY3B5KGRtaS0+c3lzdGVtLnZlcnNpb24sIGRtaV9zdHJpbmcoaCwgZGF0YVsweDA2XSksCisJCXNpemVvZihkbWktPnN5c3RlbS52ZXJzaW9uKSk7CisJc3RybGNweShkbWktPnN5c3RlbS5zZXJpYWwsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDA3XSksCisJCXNpemVvZihkbWktPnN5c3RlbS5zZXJpYWwpKTsKKwlpZiAoaC0+bGVuZ3RoIDwgMHgxOSkKKwkgICAgYnJlYWs7CisJZG1pX3N5c3RlbV91dWlkKGRhdGEgKyAweDA4LCBkbWkpOworCWRtaV9zeXN0ZW1fd2FrZV91cF90eXBlKGRhdGFbMHgxOF0sIGRtaSk7CisJaWYgKGgtPmxlbmd0aCA8IDB4MUIpCisJICAgIGJyZWFrOworCXN0cmxjcHkoZG1pLT5zeXN0ZW0uc2t1X251bWJlciwgZG1pX3N0cmluZyhoLCBkYXRhWzB4MTldKSwKKwkJc2l6ZW9mKGRtaS0+c3lzdGVtLnNrdV9udW1iZXIpKTsKKwlzdHJsY3B5KGRtaS0+c3lzdGVtLmZhbWlseSwgZG1pX3N0cmluZyhoLCBkYXRhWzB4MUFdKSwKKwkJc2l6ZW9mKGRtaS0+c3lzdGVtLmZhbWlseSkpOworCWJyZWFrOworCisgICAgY2FzZSAyOgkJCS8qIDMuMy4zIEJhc2UgQm9hcmQgSW5mb3JtYXRpb24gKi8KKwlpZiAoaC0+bGVuZ3RoIDwgMHgwOCkKKwkgICAgYnJlYWs7CisJZG1pLT5iYXNlX2JvYXJkLmZpbGxlZCA9IHRydWU7CisJc3RybGNweShkbWktPmJhc2VfYm9hcmQubWFudWZhY3R1cmVyLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNF0pLAorCQlzaXplb2YoZG1pLT5iYXNlX2JvYXJkLm1hbnVmYWN0dXJlcikpOworCXN0cmxjcHkoZG1pLT5iYXNlX2JvYXJkLnByb2R1Y3RfbmFtZSwgZG1pX3N0cmluZyhoLCBkYXRhWzB4MDVdKSwKKwkJc2l6ZW9mKGRtaS0+YmFzZV9ib2FyZC5wcm9kdWN0X25hbWUpKTsKKwlzdHJsY3B5KGRtaS0+YmFzZV9ib2FyZC52ZXJzaW9uLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNl0pLAorCQlzaXplb2YoZG1pLT5iYXNlX2JvYXJkLnZlcnNpb24pKTsKKwlzdHJsY3B5KGRtaS0+YmFzZV9ib2FyZC5zZXJpYWwsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDA3XSksCisJCXNpemVvZihkbWktPmJhc2VfYm9hcmQuc2VyaWFsKSk7CisJaWYgKGgtPmxlbmd0aCA8IDB4MEYpCisJICAgIGJyZWFrOworCXN0cmxjcHkoZG1pLT5iYXNlX2JvYXJkLmFzc2V0X3RhZywgZG1pX3N0cmluZyhoLCBkYXRhWzB4MDhdKSwKKwkJc2l6ZW9mKGRtaS0+YmFzZV9ib2FyZC5hc3NldF90YWcpKTsKKwlkbWlfYmFzZV9ib2FyZF9mZWF0dXJlcyhkYXRhWzB4MDldLCBkbWkpOworCXN0cmxjcHkoZG1pLT5iYXNlX2JvYXJkLmxvY2F0aW9uLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwQV0pLAorCQlzaXplb2YoZG1pLT5iYXNlX2JvYXJkLmxvY2F0aW9uKSk7CisJZG1pX2Jhc2VfYm9hcmRfdHlwZShkYXRhWzB4MERdLCBkbWkpOworCWlmIChoLT5sZW5ndGggPCAweDBGICsgZGF0YVsweDBFXSAqIHNpemVvZih1aW50MTZfdCkpCisJICAgIGJyZWFrOworCWJyZWFrOworICAgIGNhc2UgMzoJCQkvKiAzLjMuNCBDaGFzc2lzIEluZm9ybWF0aW9uICovCisJaWYgKGgtPmxlbmd0aCA8IDB4MDkpCisJICAgIGJyZWFrOworCWRtaS0+Y2hhc3Npcy5maWxsZWQgPSB0cnVlOworCXN0cmxjcHkoZG1pLT5jaGFzc2lzLm1hbnVmYWN0dXJlciwgZG1pX3N0cmluZyhoLCBkYXRhWzB4MDRdKSwKKwkJc2l6ZW9mKGRtaS0+Y2hhc3Npcy5tYW51ZmFjdHVyZXIpKTsKKwlzdHJsY3B5KGRtaS0+Y2hhc3Npcy50eXBlLCBkbWlfY2hhc3Npc190eXBlKGRhdGFbMHgwNV0gJiAweDdGKSwKKwkJc2l6ZW9mKGRtaS0+Y2hhc3Npcy50eXBlKSk7CisJc3RybGNweShkbWktPmNoYXNzaXMubG9jaywgZG1pX2NoYXNzaXNfbG9jayhkYXRhWzB4MDVdID4+IDcpLAorCQlzaXplb2YoZG1pLT5jaGFzc2lzLmxvY2spKTsKKwlzdHJsY3B5KGRtaS0+Y2hhc3Npcy52ZXJzaW9uLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNl0pLAorCQlzaXplb2YoZG1pLT5jaGFzc2lzLnZlcnNpb24pKTsKKwlzdHJsY3B5KGRtaS0+Y2hhc3Npcy5zZXJpYWwsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDA3XSksCisJCXNpemVvZihkbWktPmNoYXNzaXMuc2VyaWFsKSk7CisJc3RybGNweShkbWktPmNoYXNzaXMuYXNzZXRfdGFnLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwOF0pLAorCQlzaXplb2YoZG1pLT5jaGFzc2lzLmFzc2V0X3RhZykpOworCWlmIChoLT5sZW5ndGggPCAweDBEKQorCSAgICBicmVhazsKKwlzdHJsY3B5KGRtaS0+Y2hhc3Npcy5ib290X3VwX3N0YXRlLCBkbWlfY2hhc3Npc19zdGF0ZShkYXRhWzB4MDldKSwKKwkJc2l6ZW9mKGRtaS0+Y2hhc3Npcy5ib290X3VwX3N0YXRlKSk7CisJc3RybGNweShkbWktPmNoYXNzaXMucG93ZXJfc3VwcGx5X3N0YXRlLAorCQlkbWlfY2hhc3Npc19zdGF0ZShkYXRhWzB4MEFdKSwKKwkJc2l6ZW9mKGRtaS0+Y2hhc3Npcy5wb3dlcl9zdXBwbHlfc3RhdGUpKTsKKwlzdHJsY3B5KGRtaS0+Y2hhc3Npcy50aGVybWFsX3N0YXRlLAorCQlkbWlfY2hhc3Npc19zdGF0ZShkYXRhWzB4MEJdKSwKKwkJc2l6ZW9mKGRtaS0+Y2hhc3Npcy50aGVybWFsX3N0YXRlKSk7CisJc3RybGNweShkbWktPmNoYXNzaXMuc2VjdXJpdHlfc3RhdHVzLAorCQlkbWlfY2hhc3Npc19zZWN1cml0eV9zdGF0dXMoZGF0YVsweDBDXSksCisJCXNpemVvZihkbWktPmNoYXNzaXMuc2VjdXJpdHlfc3RhdHVzKSk7CisJaWYgKGgtPmxlbmd0aCA8IDB4MTEpCisJICAgIGJyZWFrOworCXNucHJpbnRmKGRtaS0+Y2hhc3Npcy5vZW1faW5mb3JtYXRpb24sCisJCSBzaXplb2YoZG1pLT5jaGFzc2lzLm9lbV9pbmZvcm1hdGlvbiksICIweCUwOFgiLAorCQkgRFdPUkQoZGF0YSArIDB4MEQpKTsKKwlpZiAoaC0+bGVuZ3RoIDwgMHgxNSkKKwkgICAgYnJlYWs7CisJZG1pLT5jaGFzc2lzLmhlaWdodCA9IGRhdGFbMHgxMV07CisJZG1pLT5jaGFzc2lzLm5iX3Bvd2VyX2NvcmRzID0gZGF0YVsweDEyXTsKKwlicmVhazsKKyAgICBjYXNlIDQ6CQkJLyogMy4zLjUgUHJvY2Vzc29yIEluZm9ybWF0aW9uICovCisJaWYgKGgtPmxlbmd0aCA8IDB4MUEpCisJICAgIGJyZWFrOworCWRtaS0+cHJvY2Vzc29yLmZpbGxlZCA9IHRydWU7CisJc3RybGNweShkbWktPnByb2Nlc3Nvci5zb2NrZXRfZGVzaWduYXRpb24sCisJCWRtaV9zdHJpbmcoaCwgZGF0YVsweDA0XSksCisJCXNpemVvZihkbWktPnByb2Nlc3Nvci5zb2NrZXRfZGVzaWduYXRpb24pKTsKKwlzdHJsY3B5KGRtaS0+cHJvY2Vzc29yLnR5cGUsCisJCWRtaV9wcm9jZXNzb3JfdHlwZShkYXRhWzB4MDVdKSwgc2l6ZW9mKGRtaS0+cHJvY2Vzc29yLnR5cGUpKTsKKwlzdHJsY3B5KGRtaS0+cHJvY2Vzc29yLm1hbnVmYWN0dXJlciwKKwkJZG1pX3N0cmluZyhoLCBkYXRhWzB4MDddKSwgc2l6ZW9mKGRtaS0+cHJvY2Vzc29yLm1hbnVmYWN0dXJlcikpOworCXN0cmxjcHkoZG1pLT5wcm9jZXNzb3IuZmFtaWx5LAorCQlkbWlfcHJvY2Vzc29yX2ZhbWlseShkYXRhWzB4MDZdLAorCQkJCSAgICAgZG1pLT5wcm9jZXNzb3IubWFudWZhY3R1cmVyKSwKKwkJc2l6ZW9mKGRtaS0+cHJvY2Vzc29yLmZhbWlseSkpOworCWRtaV9wcm9jZXNzb3JfaWQoZGF0YVsweDA2XSwgZGF0YSArIDgsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDEwXSksIGRtaSk7CisJc3RybGNweShkbWktPnByb2Nlc3Nvci52ZXJzaW9uLAorCQlkbWlfc3RyaW5nKGgsIGRhdGFbMHgxMF0pLCBzaXplb2YoZG1pLT5wcm9jZXNzb3IudmVyc2lvbikpOworCWRtaV9wcm9jZXNzb3Jfdm9sdGFnZShkYXRhWzB4MTFdLCBkbWkpOworCWRtaS0+cHJvY2Vzc29yLmV4dGVybmFsX2Nsb2NrID0gV09SRChkYXRhICsgMHgxMik7CisJZG1pLT5wcm9jZXNzb3IubWF4X3NwZWVkID0gV09SRChkYXRhICsgMHgxNCk7CisJZG1pLT5wcm9jZXNzb3IuY3VycmVudF9zcGVlZCA9IFdPUkQoZGF0YSArIDB4MTYpOworCWlmIChkYXRhWzB4MThdICYgKDEgPDwgNikpCisJICAgIHN0cmxjcHkoZG1pLT5wcm9jZXNzb3Iuc3RhdHVzLAorCQkgICAgZG1pX3Byb2Nlc3Nvcl9zdGF0dXMoZGF0YVsweDE4XSAmIDB4MDcpLAorCQkgICAgc2l6ZW9mKGRtaS0+cHJvY2Vzc29yLnN0YXR1cykpOworCWVsc2UKKwkgICAgc3ByaW50ZihkbWktPnByb2Nlc3Nvci5zdGF0dXMsICJVbnBvcHVsYXRlZCIpOworCXN0cmxjcHkoZG1pLT5wcm9jZXNzb3IudXBncmFkZSwKKwkJZG1pX3Byb2Nlc3Nvcl91cGdyYWRlKGRhdGFbMHgxOV0pLAorCQlzaXplb2YoZG1pLT5wcm9jZXNzb3IudXBncmFkZSkpOworCWlmIChoLT5sZW5ndGggPCAweDIwKQorCSAgICBicmVhazsKKwlkbWlfcHJvY2Vzc29yX2NhY2hlKFdPUkQoZGF0YSArIDB4MUEpLCAiTDEiLCB2ZXIsCisJCQkgICAgZG1pLT5wcm9jZXNzb3IuY2FjaGUxKTsKKwlkbWlfcHJvY2Vzc29yX2NhY2hlKFdPUkQoZGF0YSArIDB4MUMpLCAiTDIiLCB2ZXIsCisJCQkgICAgZG1pLT5wcm9jZXNzb3IuY2FjaGUyKTsKKwlkbWlfcHJvY2Vzc29yX2NhY2hlKFdPUkQoZGF0YSArIDB4MUUpLCAiTDMiLCB2ZXIsCisJCQkgICAgZG1pLT5wcm9jZXNzb3IuY2FjaGUzKTsKKwlpZiAoaC0+bGVuZ3RoIDwgMHgyMykKKwkgICAgYnJlYWs7CisJc3RybGNweShkbWktPnByb2Nlc3Nvci5zZXJpYWwsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDIwXSksCisJCXNpemVvZihkbWktPnByb2Nlc3Nvci5zZXJpYWwpKTsKKwlzdHJsY3B5KGRtaS0+cHJvY2Vzc29yLmFzc2V0X3RhZywgZG1pX3N0cmluZyhoLCBkYXRhWzB4MjFdKSwKKwkJc2l6ZW9mKGRtaS0+cHJvY2Vzc29yLmFzc2V0X3RhZykpOworCXN0cmxjcHkoZG1pLT5wcm9jZXNzb3IucGFydF9udW1iZXIsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDIyXSksCisJCXNpemVvZihkbWktPnByb2Nlc3Nvci5wYXJ0X251bWJlcikpOworICAgICAgICBkbWktPnByb2Nlc3Nvci5jb3JlX2NvdW50ID0gMDsKKyAgICAgICAgZG1pLT5wcm9jZXNzb3IuY29yZV9lbmFibGVkID0gMDsKKyAgICAgICAgZG1pLT5wcm9jZXNzb3IudGhyZWFkX2NvdW50ID0gMDsKKwlpZiAoaC0+bGVuZ3RoIDwgMHgyOCkKKwkgICAgYnJlYWs7CisgICAgICAgIGRtaS0+cHJvY2Vzc29yLmNvcmVfY291bnQgPSBkYXRhWzB4MjNdOworICAgICAgICBkbWktPnByb2Nlc3Nvci5jb3JlX2VuYWJsZWQgPSBkYXRhWzB4MjRdOworICAgICAgICBkbWktPnByb2Nlc3Nvci50aHJlYWRfY291bnQgPSBkYXRhWzB4MjVdOworCWJyZWFrOworICAgIGNhc2UgNjoJCQkvKiAzLjMuNyBNZW1vcnkgTW9kdWxlIEluZm9ybWF0aW9uICovCisJaWYgKGgtPmxlbmd0aCA8IDB4MEMpCisJICAgIGJyZWFrOworCWRtaS0+bWVtb3J5X21vZHVsZV9jb3VudCsrOworCXNfbWVtb3J5X21vZHVsZSAqbW9kdWxlID0KKwkgICAgJmRtaS0+bWVtb3J5X21vZHVsZVtkbWktPm1lbW9yeV9tb2R1bGVfY291bnQgLSAxXTsKKwlkbWktPm1lbW9yeV9tb2R1bGVbZG1pLT5tZW1vcnlfbW9kdWxlX2NvdW50IC0gMV0uZmlsbGVkID0gdHJ1ZTsKKwlzdHJsY3B5KG1vZHVsZS0+c29ja2V0X2Rlc2lnbmF0aW9uLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNF0pLAorCQlzaXplb2YobW9kdWxlLT5zb2NrZXRfZGVzaWduYXRpb24pKTsKKwlkbWlfbWVtb3J5X21vZHVsZV9jb25uZWN0aW9ucyhkYXRhWzB4MDVdLCBtb2R1bGUtPmJhbmtfY29ubmVjdGlvbnMsIHNpemVvZihtb2R1bGUtPmJhbmtfY29ubmVjdGlvbnMpKTsKKwlkbWlfbWVtb3J5X21vZHVsZV9zcGVlZChkYXRhWzB4MDZdLCBtb2R1bGUtPnNwZWVkKTsKKwlkbWlfbWVtb3J5X21vZHVsZV90eXBlcyhXT1JEKGRhdGEgKyAweDA3KSwgIiAiLCBtb2R1bGUtPnR5cGUsIHNpemVvZihtb2R1bGUtPnR5cGUpKTsKKwlkbWlfbWVtb3J5X21vZHVsZV9zaXplKGRhdGFbMHgwOV0sIG1vZHVsZS0+aW5zdGFsbGVkX3NpemUsIHNpemVvZihtb2R1bGUtPmluc3RhbGxlZF9zaXplKSk7CisJZG1pX21lbW9yeV9tb2R1bGVfc2l6ZShkYXRhWzB4MEFdLCBtb2R1bGUtPmVuYWJsZWRfc2l6ZSwgc2l6ZW9mKG1vZHVsZS0+ZW5hYmxlZF9zaXplKSk7CisJZG1pX21lbW9yeV9tb2R1bGVfZXJyb3IoZGF0YVsweDBCXSwgIlx0XHQiLCBtb2R1bGUtPmVycm9yX3N0YXR1cyk7CisJYnJlYWs7CisgICAgY2FzZSA3OgkJCS8qIDMuMy44IENhY2hlIEluZm9ybWF0aW9uICovCisJaWYgKGgtPmxlbmd0aCA8IDB4MEYpCisJICAgIGJyZWFrOworCWRtaS0+Y2FjaGVfY291bnQrKzsKKwlpZiAoZG1pLT5jYWNoZV9jb3VudCA+IE1BWF9ETUlfQ0FDSEVfSVRFTVMpCisJICAgIGJyZWFrOworCXN0cmxjcHkoZG1pLT5jYWNoZVtkbWktPmNhY2hlX2NvdW50IC0gMV0uc29ja2V0X2Rlc2lnbmF0aW9uLAorCQlkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNF0pLAorCQlzaXplb2YoZG1pLT5jYWNoZVtkbWktPmNhY2hlX2NvdW50IC0gMV0uc29ja2V0X2Rlc2lnbmF0aW9uKSk7CisJc25wcmludGYoZG1pLT5jYWNoZVtkbWktPmNhY2hlX2NvdW50IC0gMV0uY29uZmlndXJhdGlvbiwKKwkJIHNpemVvZihkbWktPmNhY2hlW2RtaS0+Y2FjaGVfY291bnQgLSAxXS5jb25maWd1cmF0aW9uKSwKKwkJICIlcywgJXMsICV1IiwKKwkJIFdPUkQoZGF0YSArIDB4MDUpICYgMHgwMDgwID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKKwkJIFdPUkQoZGF0YSArCisJCSAgICAgIDB4MDUpICYgMHgwMDA4ID8gIlNvY2tldGVkIiA6ICJOb3QgU29ja2V0ZWQiLAorCQkgKFdPUkQoZGF0YSArIDB4MDUpICYgMHgwMDA3KSArIDEpOworCXN0cmxjcHkoZG1pLT5jYWNoZVtkbWktPmNhY2hlX2NvdW50IC0gMV0ubW9kZSwKKwkJZG1pX2NhY2hlX21vZGUoKFdPUkQoZGF0YSArIDB4MDUpID4+IDgpICYgMHgwMDAzKSwKKwkJc2l6ZW9mKGRtaS0+Y2FjaGVbZG1pLT5jYWNoZV9jb3VudCAtIDFdLm1vZGUpKTsKKwlzdHJsY3B5KGRtaS0+Y2FjaGVbZG1pLT5jYWNoZV9jb3VudCAtIDFdLmxvY2F0aW9uLAorCQlkbWlfY2FjaGVfbG9jYXRpb24oKFdPUkQoZGF0YSArIDB4MDUpID4+IDUpICYgMHgwMDAzKSwKKwkJc2l6ZW9mKGRtaS0+Y2FjaGVbZG1pLT5jYWNoZV9jb3VudCAtIDFdLmxvY2F0aW9uKSk7CisJZG1pLT5jYWNoZVtkbWktPmNhY2hlX2NvdW50IC0gMV0uaW5zdGFsbGVkX3NpemUgPQorCSAgICBkbWlfY2FjaGVfc2l6ZShXT1JEKGRhdGEgKyAweDA5KSk7CisJZG1pLT5jYWNoZVtkbWktPmNhY2hlX2NvdW50IC0gMV0ubWF4X3NpemUgPQorCSAgICBkbWlfY2FjaGVfc2l6ZShXT1JEKGRhdGEgKyAweDA3KSk7CisJZG1pX2NhY2hlX3R5cGVzKFdPUkQoZGF0YSArIDB4MEIpLCAiICIsCisJCQlkbWktPmNhY2hlW2RtaS0+Y2FjaGVfY291bnQgLSAxXS5zdXBwb3J0ZWRfc3JhbV90eXBlcyk7CisJZG1pX2NhY2hlX3R5cGVzKFdPUkQoZGF0YSArIDB4MEQpLCAiICIsCisJCQlkbWktPmNhY2hlW2RtaS0+Y2FjaGVfY291bnQgLSAxXS5pbnN0YWxsZWRfc3JhbV90eXBlcyk7CisJaWYgKGgtPmxlbmd0aCA8IDB4MTMpCisJICAgIGJyZWFrOworCWRtaS0+Y2FjaGVbZG1pLT5jYWNoZV9jb3VudCAtIDFdLnNwZWVkID0gZGF0YVsweDBGXTsJLyogbnMgKi8KKwlzdHJsY3B5KGRtaS0+Y2FjaGVbZG1pLT5jYWNoZV9jb3VudCAtIDFdLmVycm9yX2NvcnJlY3Rpb25fdHlwZSwKKwkJZG1pX2NhY2hlX2VjX3R5cGUoZGF0YVsweDEwXSksCisJCXNpemVvZihkbWktPmNhY2hlW2RtaS0+Y2FjaGVfY291bnQgLSAxXS5lcnJvcl9jb3JyZWN0aW9uX3R5cGUpKTsKKwlzdHJsY3B5KGRtaS0+Y2FjaGVbZG1pLT5jYWNoZV9jb3VudCAtIDFdLnN5c3RlbV90eXBlLAorCQlkbWlfY2FjaGVfdHlwZShkYXRhWzB4MTFdKSwKKwkJc2l6ZW9mKGRtaS0+Y2FjaGVbZG1pLT5jYWNoZV9jb3VudCAtIDFdLnN5c3RlbV90eXBlKSk7CisJc3RybGNweShkbWktPmNhY2hlW2RtaS0+Y2FjaGVfY291bnQgLSAxXS5hc3NvY2lhdGl2aXR5LAorCQlkbWlfY2FjaGVfYXNzb2NpYXRpdml0eShkYXRhWzB4MTJdKSwKKwkJc2l6ZW9mKGRtaS0+Y2FjaGVbZG1pLT5jYWNoZV9jb3VudCAtIDFdLmFzc29jaWF0aXZpdHkpKTsKKwlicmVhazsKKyAgICBjYXNlIDEwOgkJCS8qIDMuMy4xMSBPbiBCb2FyZCBEZXZpY2VzIEluZm9ybWF0aW9uICovCisJZG1pX29uX2JvYXJkX2RldmljZXMoaCwgZG1pKTsKKwlicmVhazsKKyAgICBjYXNlIDExOgkJCS8qIDMuMy4xMiBPRU0gU3RyaW5ncyAqLworCWlmIChoLT5sZW5ndGggPCAweDA1KQorCSAgICBicmVhazsKKwlkbWlfb2VtX3N0cmluZ3MoaCwgIlx0IiwgZG1pKTsKKwlicmVhazsKKyAgICBjYXNlIDEyOgkJCS8qIDMuMy4xMyBTeXN0ZW0gQ29uZmlndXJhdGlvbiBPcHRpb25zICovCisJaWYgKGgtPmxlbmd0aCA8IDB4MDUpCisJICAgIGJyZWFrOworCWRtaV9zeXN0ZW1fY29uZmlndXJhdGlvbl9vcHRpb25zKGgsICJcdCIsIGRtaSk7CisJYnJlYWs7CisgICAgY2FzZSAxNzoJCQkvKiAzLjMuMTggTWVtb3J5IERldmljZSAqLworCWlmIChoLT5sZW5ndGggPCAweDE1KQorCSAgICBicmVhazsKKwlkbWktPm1lbW9yeV9jb3VudCsrOworCWlmIChkbWktPm1lbW9yeV9jb3VudCA+IE1BWF9ETUlfTUVNT1JZX0lURU1TKQorCSAgICBicmVhazsKKwlzX21lbW9yeSAqbWVtID0gJmRtaS0+bWVtb3J5W2RtaS0+bWVtb3J5X2NvdW50IC0gMV07CisJZG1pLT5tZW1vcnlbZG1pLT5tZW1vcnlfY291bnQgLSAxXS5maWxsZWQgPSB0cnVlOworCWRtaV9tZW1vcnlfYXJyYXlfZXJyb3JfaGFuZGxlKFdPUkQoZGF0YSArIDB4MDYpLCBtZW0tPmVycm9yKTsKKwlkbWlfbWVtb3J5X2RldmljZV93aWR0aChXT1JEKGRhdGEgKyAweDA4KSwgbWVtLT50b3RhbF93aWR0aCk7CisJZG1pX21lbW9yeV9kZXZpY2Vfd2lkdGgoV09SRChkYXRhICsgMHgwQSksIG1lbS0+ZGF0YV93aWR0aCk7CisJZG1pX21lbW9yeV9kZXZpY2Vfc2l6ZShXT1JEKGRhdGEgKyAweDBDKSwgbWVtLT5zaXplKTsKKwlzdHJsY3B5KG1lbS0+Zm9ybV9mYWN0b3IsCisJCWRtaV9tZW1vcnlfZGV2aWNlX2Zvcm1fZmFjdG9yKGRhdGFbMHgwRV0pLAorCQlzaXplb2YobWVtLT5mb3JtX2ZhY3RvcikpOworCWRtaV9tZW1vcnlfZGV2aWNlX3NldChkYXRhWzB4MEZdLCBtZW0tPmRldmljZV9zZXQpOworCXN0cmxjcHkobWVtLT5kZXZpY2VfbG9jYXRvciwgZG1pX3N0cmluZyhoLCBkYXRhWzB4MTBdKSwKKwkJc2l6ZW9mKG1lbS0+ZGV2aWNlX2xvY2F0b3IpKTsKKwlzdHJsY3B5KG1lbS0+YmFua19sb2NhdG9yLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgxMV0pLAorCQlzaXplb2YobWVtLT5iYW5rX2xvY2F0b3IpKTsKKwlzdHJsY3B5KG1lbS0+dHlwZSwgZG1pX21lbW9yeV9kZXZpY2VfdHlwZShkYXRhWzB4MTJdKSwKKwkJc2l6ZW9mKG1lbS0+dHlwZSkpOworCWRtaV9tZW1vcnlfZGV2aWNlX3R5cGVfZGV0YWlsKFdPUkQoZGF0YSArIDB4MTMpLCBtZW0tPnR5cGVfZGV0YWlsLCBzaXplb2YobWVtLT50eXBlX2RldGFpbCkpOworCWlmIChoLT5sZW5ndGggPCAweDE3KQorCSAgICBicmVhazsKKwlkbWlfbWVtb3J5X2RldmljZV9zcGVlZChXT1JEKGRhdGEgKyAweDE1KSwgbWVtLT5zcGVlZCk7CisJaWYgKGgtPmxlbmd0aCA8IDB4MUIpCisJICAgIGJyZWFrOworCXN0cmxjcHkobWVtLT5tYW51ZmFjdHVyZXIsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDE3XSksCisJCXNpemVvZihtZW0tPm1hbnVmYWN0dXJlcikpOworCXN0cmxjcHkobWVtLT5zZXJpYWwsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDE4XSksIHNpemVvZihtZW0tPnNlcmlhbCkpOworCXN0cmxjcHkobWVtLT5hc3NldF90YWcsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDE5XSksCisJCXNpemVvZihtZW0tPmFzc2V0X3RhZykpOworCXN0cmxjcHkobWVtLT5wYXJ0X251bWJlciwgZG1pX3N0cmluZyhoLCBkYXRhWzB4MUFdKSwKKwkJc2l6ZW9mKG1lbS0+cGFydF9udW1iZXIpKTsKKwlicmVhazsKKyAgICBjYXNlIDIyOgkJCS8qIDMuMy4yMyBQb3J0YWJsZSBCYXR0ZXJ5ICovCisJaWYgKGgtPmxlbmd0aCA8IDB4MTApCisJICAgIGJyZWFrOworCWRtaS0+YmF0dGVyeS5maWxsZWQgPSB0cnVlOworCXN0cmxjcHkoZG1pLT5iYXR0ZXJ5LmxvY2F0aW9uLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNF0pLAorCQlzaXplb2YoZG1pLT5iYXR0ZXJ5LmxvY2F0aW9uKSk7CisJc3RybGNweShkbWktPmJhdHRlcnkubWFudWZhY3R1cmVyLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNV0pLAorCQlzaXplb2YoZG1pLT5iYXR0ZXJ5Lm1hbnVmYWN0dXJlcikpOworCWlmIChkYXRhWzB4MDZdIHx8IGgtPmxlbmd0aCA8IDB4MUEpCisJICAgIHN0cmxjcHkoZG1pLT5iYXR0ZXJ5Lm1hbnVmYWN0dXJlX2RhdGUsCisJCSAgICBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwNl0pLAorCQkgICAgc2l6ZW9mKGRtaS0+YmF0dGVyeS5tYW51ZmFjdHVyZV9kYXRlKSk7CisJaWYgKGRhdGFbMHgwN10gfHwgaC0+bGVuZ3RoIDwgMHgxQSkKKwkgICAgc3RybGNweShkbWktPmJhdHRlcnkuc2VyaWFsLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwN10pLAorCQkgICAgc2l6ZW9mKGRtaS0+YmF0dGVyeS5zZXJpYWwpKTsKKwlzdHJsY3B5KGRtaS0+YmF0dGVyeS5uYW1lLCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgwOF0pLAorCQlzaXplb2YoZG1pLT5iYXR0ZXJ5Lm5hbWUpKTsKKwlpZiAoZGF0YVsweDA5XSAhPSAweDAyIHx8IGgtPmxlbmd0aCA8IDB4MUEpCisJICAgIHN0cmxjcHkoZG1pLT5iYXR0ZXJ5LmNoZW1pc3RyeSwKKwkJICAgIGRtaV9iYXR0ZXJ5X2NoZW1pc3RyeShkYXRhWzB4MDldKSwKKwkJICAgIHNpemVvZihkbWktPmJhdHRlcnkuY2hlbWlzdHJ5KSk7CisJaWYgKGgtPmxlbmd0aCA8IDB4MUEpCisJICAgIGRtaV9iYXR0ZXJ5X2NhcGFjaXR5KFdPUkQoZGF0YSArIDB4MEEpLCAxLAorCQkJCSBkbWktPmJhdHRlcnkuZGVzaWduX2NhcGFjaXR5KTsKKwllbHNlCisJICAgIGRtaV9iYXR0ZXJ5X2NhcGFjaXR5KFdPUkQoZGF0YSArIDB4MEEpLCBkYXRhWzB4MTVdLAorCQkJCSBkbWktPmJhdHRlcnkuZGVzaWduX2NhcGFjaXR5KTsKKwlkbWlfYmF0dGVyeV92b2x0YWdlKFdPUkQoZGF0YSArIDB4MEMpLCBkbWktPmJhdHRlcnkuZGVzaWduX3ZvbHRhZ2UpOworCXN0cmxjcHkoZG1pLT5iYXR0ZXJ5LnNiZHMsIGRtaV9zdHJpbmcoaCwgZGF0YVsweDBFXSksCisJCXNpemVvZihkbWktPmJhdHRlcnkuc2JkcykpOworCWRtaV9iYXR0ZXJ5X21heGltdW1fZXJyb3IoZGF0YVsweDBGXSwgZG1pLT5iYXR0ZXJ5Lm1heGltdW1fZXJyb3IpOworCWlmIChoLT5sZW5ndGggPCAweDFBKQorCSAgICBicmVhazsKKwlpZiAoZGF0YVsweDA3XSA9PSAwKQorCSAgICBzcHJpbnRmKGRtaS0+YmF0dGVyeS5zYmRzX3NlcmlhbCwgIiUwNFgiLCBXT1JEKGRhdGEgKyAweDEwKSk7CisJaWYgKGRhdGFbMHgwNl0gPT0gMCkKKwkgICAgc3ByaW50ZihkbWktPmJhdHRlcnkuc2Jkc19tYW51ZmFjdHVyZV9kYXRlLCAiJXUtJTAydS0lMDJ1IiwKKwkJICAgIDE5ODAgKyAoV09SRChkYXRhICsgMHgxMikgPj4gOSksCisJCSAgICAoV09SRChkYXRhICsgMHgxMikgPj4gNSkgJiAweDBGLCBXT1JEKGRhdGEgKyAweDEyKSAmIDB4MUYpOworCWlmIChkYXRhWzB4MDldID09IDB4MDIpCisJICAgIHN0cmxjcHkoZG1pLT5iYXR0ZXJ5LnNiZHNfY2hlbWlzdHJ5LCBkbWlfc3RyaW5nKGgsIGRhdGFbMHgxNF0pLAorCQkgICAgc2l6ZW9mKGRtaS0+YmF0dGVyeS5zYmRzX2NoZW1pc3RyeSkpOworCS8vICAgICAgc3ByaW50ZihkbWktPmJhdHRlcnkub2VtX2luZm8sIjB4JTA4WCIsRFdPUkQoaCwgZGF0YSsweDE2KSk7CisJYnJlYWs7CisgICAgY2FzZSAyMzoJCQkvKiAzLjMuMjQgU3lzdGVtIFJlc2V0ICovCisJaWYgKGgtPmxlbmd0aCA8IDB4MEQpCisJICAgIGJyZWFrOworCWRtaS0+c3lzdGVtLnN5c3RlbV9yZXNldC5maWxsZWQgPSB0cnVlOworCWRtaS0+c3lzdGVtLnN5c3RlbV9yZXNldC5zdGF0dXMgPSBkYXRhWzB4MDRdICYgKDEgPDwgMCk7CisJZG1pLT5zeXN0ZW0uc3lzdGVtX3Jlc2V0LndhdGNoZG9nID0gZGF0YVsweDA0XSAmICgxIDw8IDUpOworCWlmICghKGRhdGFbMHgwNF0gJiAoMSA8PCA1KSkpCisJICAgIGJyZWFrOworCXN0cmxjcHkoZG1pLT5zeXN0ZW0uc3lzdGVtX3Jlc2V0LmJvb3Rfb3B0aW9uLAorCQlkbWlfc3lzdGVtX3Jlc2V0X2Jvb3Rfb3B0aW9uKChkYXRhWzB4MDRdID4+IDEpICYgMHgzKSwKKwkJc2l6ZW9mIGRtaS0+c3lzdGVtLnN5c3RlbV9yZXNldC5ib290X29wdGlvbik7CisJc3RybGNweShkbWktPnN5c3RlbS5zeXN0ZW1fcmVzZXQuYm9vdF9vcHRpb25fb25fbGltaXQsCisJCWRtaV9zeXN0ZW1fcmVzZXRfYm9vdF9vcHRpb24oKGRhdGFbMHgwNF0gPj4gMykgJiAweDMpLAorCQlzaXplb2YgZG1pLT5zeXN0ZW0uc3lzdGVtX3Jlc2V0LmJvb3Rfb3B0aW9uX29uX2xpbWl0KTsKKwlkbWlfc3lzdGVtX3Jlc2V0X2NvdW50KFdPUkQoZGF0YSArIDB4MDUpLAorCQkJICAgICAgIGRtaS0+c3lzdGVtLnN5c3RlbV9yZXNldC5yZXNldF9jb3VudCk7CisJZG1pX3N5c3RlbV9yZXNldF9jb3VudChXT1JEKGRhdGEgKyAweDA3KSwKKwkJCSAgICAgICBkbWktPnN5c3RlbS5zeXN0ZW1fcmVzZXQucmVzZXRfbGltaXQpOworCWRtaV9zeXN0ZW1fcmVzZXRfdGltZXIoV09SRChkYXRhICsgMHgwOSksCisJCQkgICAgICAgZG1pLT5zeXN0ZW0uc3lzdGVtX3Jlc2V0LnRpbWVyX2ludGVydmFsKTsKKwlkbWlfc3lzdGVtX3Jlc2V0X3RpbWVyKFdPUkQoZGF0YSArIDB4MEIpLAorCQkJICAgICAgIGRtaS0+c3lzdGVtLnN5c3RlbV9yZXNldC50aW1lb3V0KTsKKwlicmVhazsKKyAgICBjYXNlIDI0OgkJCS8qIDMuMy4yNSBIYXJkd2FyZSBTZWN1cml0eSAqLworCWlmIChoLT5sZW5ndGggPCAweDA1KQorCSAgICBicmVhazsKKwlkbWktPmhhcmR3YXJlX3NlY3VyaXR5LmZpbGxlZCA9IHRydWU7CisJc3RybGNweShkbWktPmhhcmR3YXJlX3NlY3VyaXR5LnBvd2VyX29uX3Bhc3N3ZF9zdGF0dXMsCisJCWRtaV9oYXJkd2FyZV9zZWN1cml0eV9zdGF0dXMoZGF0YVsweDA0XSA+PiA2KSwKKwkJc2l6ZW9mIGRtaS0+aGFyZHdhcmVfc2VjdXJpdHkucG93ZXJfb25fcGFzc3dkX3N0YXR1cyk7CisJc3RybGNweShkbWktPmhhcmR3YXJlX3NlY3VyaXR5LmtleWJvYXJkX3Bhc3N3ZF9zdGF0dXMsCisJCWRtaV9oYXJkd2FyZV9zZWN1cml0eV9zdGF0dXMoKGRhdGFbMHgwNF0gPj4gNCkgJiAweDMpLAorCQlzaXplb2YgZG1pLT5oYXJkd2FyZV9zZWN1cml0eS5rZXlib2FyZF9wYXNzd2Rfc3RhdHVzKTsKKwlzdHJsY3B5KGRtaS0+aGFyZHdhcmVfc2VjdXJpdHkuYWRtaW5pc3RyYXRvcl9wYXNzd2Rfc3RhdHVzLAorCQlkbWlfaGFyZHdhcmVfc2VjdXJpdHlfc3RhdHVzKChkYXRhWzB4MDRdID4+IDIpICYgMHgzKSwKKwkJc2l6ZW9mIGRtaS0+aGFyZHdhcmVfc2VjdXJpdHkuYWRtaW5pc3RyYXRvcl9wYXNzd2Rfc3RhdHVzKTsKKwlzdHJsY3B5KGRtaS0+aGFyZHdhcmVfc2VjdXJpdHkuZnJvbnRfcGFuZWxfcmVzZXRfc3RhdHVzLAorCQlkbWlfaGFyZHdhcmVfc2VjdXJpdHlfc3RhdHVzKGRhdGFbMHgwNF0gJiAweDMpLAorCQlzaXplb2YgZG1pLT5oYXJkd2FyZV9zZWN1cml0eS5mcm9udF9wYW5lbF9yZXNldF9zdGF0dXMpOworCWJyZWFrOworICAgIGNhc2UgMzI6CQkJLyogMy4zLjMzIFN5c3RlbSBCb290IEluZm9ybWF0aW9uICovCisJaWYgKGgtPmxlbmd0aCA8IDB4MEIpCisJICAgIGJyZWFrOworCWRtaV9zeXN0ZW1fYm9vdF9zdGF0dXMoZGF0YVsweDBBXSwgZG1pLT5zeXN0ZW0uc3lzdGVtX2Jvb3Rfc3RhdHVzKTsKKyAgICBjYXNlIDM4OgkJCS8qIDMuMy4zOSBJUE1JIERldmljZSBJbmZvcm1hdGlvbiAqLworCWlmIChoLT5sZW5ndGggPCAweDEwKQorCSAgICBicmVhazsKKwlkbWktPmlwbWkuZmlsbGVkID0gdHJ1ZTsKKwlzbnByaW50ZihkbWktPmlwbWkuaW50ZXJmYWNlX3R5cGUsCisJCSBzaXplb2YoZG1pLT5pcG1pLmludGVyZmFjZV90eXBlKSwgIiVzIiwKKwkJIGRtaV9pcG1pX2ludGVyZmFjZV90eXBlKGRhdGFbMHgwNF0pKTsKKwlkbWktPmlwbWkubWFqb3Jfc3BlY2lmaWNhdGlvbl92ZXJzaW9uID0gZGF0YVsweDA1XSA+PiA0OworCWRtaS0+aXBtaS5taW5vcl9zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSBkYXRhWzB4MDVdICYgMHgwRjsKKwlkbWktPmlwbWkuSTJDX3NsYXZlX2FkZHJlc3MgPSBkYXRhWzB4MDZdID4+IDE7CisJaWYgKGRhdGFbMHgwN10gIT0gMHhGRikKKwkgICAgZG1pLT5pcG1pLm52X2FkZHJlc3MgPSBkYXRhWzB4MDddOworCWVsc2UKKwkgICAgZG1pLT5pcG1pLm52X2FkZHJlc3MgPSAwOwkvKiBOb3QgUHJlc2VudCAqLworCWRtaV9pcG1pX2Jhc2VfYWRkcmVzcyhkYXRhWzB4MDRdLCBkYXRhICsgMHgwOCwgJmRtaS0+aXBtaSk7CisJaWYgKGgtPmxlbmd0aCA8IDB4MTIpCisJICAgIGJyZWFrOworCWlmIChkYXRhWzB4MTFdICE9IDB4MDApIHsKKwkgICAgZG1pLT5pcG1pLmlycSA9IGRhdGFbMHgxMV07CisJfQorCWJyZWFrOworICAgIH0KK30KKwordm9pZCBwYXJzZV9kbWl0YWJsZShzX2RtaSAqIGRtaSkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgdWludDhfdCAqZGF0YSA9IE5VTEw7CisgICAgdWludDhfdCBidWZbZG1pLT5kbWl0YWJsZS5sZW5dOworICAgIG1lbWNweShidWYsIChpbnQgKilkbWktPmRtaXRhYmxlLmJhc2UsIHNpemVvZih1aW50OF90KSAqIGRtaS0+ZG1pdGFibGUubGVuKTsKKyAgICBkYXRhID0gYnVmOworICAgIGRtaS0+bWVtb3J5X2NvdW50ID0gMDsKKyAgICB3aGlsZSAoaSA8IGRtaS0+ZG1pdGFibGUubnVtICYmIGRhdGEgKyA0IDw9IGJ1ZiArIGRtaS0+ZG1pdGFibGUubGVuKSB7CS8qIDQgaXMgdGhlIGxlbmd0aCBvZiBhbiBTTUJJT1Mgc3RydWN0dXJlIGhlYWRlciAqLworCXVpbnQ4X3QgKm5leHQ7CisJc3RydWN0IGRtaV9oZWFkZXIgaDsKKwl0b19kbWlfaGVhZGVyKCZoLCBkYXRhKTsKKwkvKgorCSAqIElmIGEgc2hvcnQgZW50cnkgaXMgZm91bmQgKGxlc3MgdGhhbiA0IGJ5dGVzKSwgbm90IG9ubHkgaXQKKwkgKiBpcyBpbnZhbGlkLCBidXQgd2UgY2Fubm90IHJlbGlhYmx5IGxvY2F0ZSB0aGUgbmV4dCBlbnRyeS4KKwkgKiBCZXR0ZXIgc3RvcCBhdCB0aGlzIHBvaW50LCBhbmQgbGV0IHRoZSB1c2VyIGtub3cgaGlzL2hlcgorCSAqIHRhYmxlIGlzIGJyb2tlbi4KKwkgKi8KKwlpZiAoaC5sZW5ndGggPCA0KSB7CisJICAgIHByaW50ZgorCQkoIkludmFsaWQgZW50cnkgbGVuZ3RoICgldSkuIERNSSB0YWJsZSBpcyBicm9rZW4hIFN0b3AuXG5cbiIsCisJCSAodW5zaWduZWQgaW50KWgubGVuZ3RoKTsKKwkgICAgYnJlYWs7CisJfQorCisJLyogbG9vIGZvciB0aGUgbmV4dCBoYW5kbGUgKi8KKwluZXh0ID0gZGF0YSArIGgubGVuZ3RoOworCXdoaWxlIChuZXh0IC0gYnVmICsgMSA8IGRtaS0+ZG1pdGFibGUubGVuCisJICAgICAgICYmIChuZXh0WzBdICE9IDAgfHwgbmV4dFsxXSAhPSAwKSkKKwkgICAgbmV4dCsrOworCW5leHQgKz0gMjsKKwlpZiAobmV4dCAtIGJ1ZiA8PSBkbWktPmRtaXRhYmxlLmxlbikgeworCSAgICBkbWlfZGVjb2RlKCZoLCBkbWktPmRtaXRhYmxlLnZlciwgZG1pKTsKKwl9CisJZGF0YSA9IG5leHQ7CisJaSsrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi9kbWkvZG1pX2Jhc2VfYm9hcmQuYyBiL2NvbTMyL2dwbGxpYi9kbWkvZG1pX2Jhc2VfYm9hcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI1MzIxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL2RtaS9kbWlfYmFzZV9ib2FyZC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIFBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgdGFrZW4gZnJvbSB0aGUgZG1pZGVjb2RlIHByb2plY3QKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiAgIENvcHlyaWdodCAoQykgMjAwMi0yMDA4IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0IHRoZSAicHJlZmVycmVkIGZvcm0iIG9mIHRoaXMgY29kZSBpcyBvbmUgd2hpY2gKKyAqICAgaXMgaW4gYW4gb3BlbiB1bnBhdGVudCBlbmN1bWJlcmVkIGZvcm1hdC4gV2hlcmUgY3J5cHRvZ3JhcGhpYyBrZXkgc2lnbmluZworICogICBmb3JtcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uCisgKiAgIGluY2x1ZGluZyBrZXlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBlcXVpdmFsZW50bHkgZnVuY3Rpb25hbCBleGVjdXRhYmxlCisgKiAgIGFyZSBkZWVtZWQgdG8gYmUgcGFydCBvZiB0aGUgc291cmNlIGNvZGUuCisqLworCisjaW5jbHVkZSA8ZG1pL2RtaS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+Citjb25zdCBjaGFyICpiYXNlX2JvYXJkX2ZlYXR1cmVzX3N0cmluZ3NbXSA9IHsKKyAgICAiQm9hcmQgaXMgYSBob3N0aW5nIGJvYXJkIiwJLyogMCAqLworICAgICJCb2FyZCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgZGF1Z2h0ZXIgYm9hcmQiLAorICAgICJCb2FyZCBpcyByZW1vdmFibGUiLAorICAgICJCb2FyZCBpcyByZXBsYWNlYWJsZSIsCisgICAgIkJvYXJkIGlzIGhvdCBzd2FwcGFibGUiCS8qIDQgKi8KK307CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZG1pL2RtaV9iYXR0ZXJ5LmMgYi9jb20zMi9ncGxsaWIvZG1pL2RtaV9iYXR0ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlYWI5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9kbWkvZG1pX2JhdHRlcnkuYwpAQCAtMCwwICsxLDcyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBQcG9ydGlvbnMgb2YgdGhpcyBmaWxlIHRha2VuIGZyb20gdGhlIGRtaWRlY29kZSBwcm9qZWN0CisgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwOCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICogICBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCB0aGUgInByZWZlcnJlZCBmb3JtIiBvZiB0aGlzIGNvZGUgaXMgb25lIHdoaWNoCisgKiAgIGlzIGluIGFuIG9wZW4gdW5wYXRlbnQgZW5jdW1iZXJlZCBmb3JtYXQuIFdoZXJlIGNyeXB0b2dyYXBoaWMga2V5IHNpZ25pbmcKKyAqICAgZm9ybXMgcGFydCBvZiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIHRoZSBpbmZvcm1hdGlvbgorICogICBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5IGZ1bmN0aW9uYWwgZXhlY3V0YWJsZQorICogICBhcmUgZGVlbWVkIHRvIGJlIHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlLgorKi8KKworI2luY2x1ZGUgPGRtaS9kbWkuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorY29uc3QgY2hhciAqZG1pX2JhdHRlcnlfY2hlbWlzdHJ5KHVpbnQ4X3QgY29kZSkKK3sKKyAgICAvKiAzLjMuMjMuMSAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjaGVtaXN0cnlbXSA9IHsKKwkiT3RoZXIiLAkJLyogMHgwMSAqLworCSJVbmtub3duIiwKKwkiTGVhZCBBY2lkIiwKKwkiTmlja2VsIENhZG1pdW0iLAorCSJOaWNrZWwgTWV0YWwgSHlkcmlkZSIsCisJIkxpdGhpdW0gSW9uIiwKKwkiWmluYyBBaXIiLAorCSJMaXRoaXVtIFBvbHltZXIiCS8qIDB4MDggKi8KKyAgICB9OworCisgICAgaWYgKGNvZGUgPj0gMHgwMSAmJiBjb2RlIDw9IDB4MDgpCisJcmV0dXJuIGNoZW1pc3RyeVtjb2RlIC0gMHgwMV07CisgICAgcmV0dXJuIG91dF9vZl9zcGVjOworfQorCit2b2lkIGRtaV9iYXR0ZXJ5X2NhcGFjaXR5KHVpbnQxNl90IGNvZGUsIHVpbnQ4X3QgbXVsdGlwbGllciwgY2hhciAqY2FwYWNpdHkpCit7CisgICAgaWYgKGNvZGUgPT0gMCkKKwlzcHJpbnRmKGNhcGFjaXR5LCAiJXMiLCAiVW5rbm93biIpOworICAgIGVsc2UKKwlzcHJpbnRmKGNhcGFjaXR5LCAiJXUgbVdoIiwgY29kZSAqIG11bHRpcGxpZXIpOworfQorCit2b2lkIGRtaV9iYXR0ZXJ5X3ZvbHRhZ2UodWludDE2X3QgY29kZSwgY2hhciAqdm9sdGFnZSkKK3sKKyAgICBpZiAoY29kZSA9PSAwKQorCXNwcmludGYodm9sdGFnZSwgIiVzIiwgIlVua25vd24iKTsKKyAgICBlbHNlCisJc3ByaW50Zih2b2x0YWdlLCAiJXUgbVYiLCBjb2RlKTsKK30KKwordm9pZCBkbWlfYmF0dGVyeV9tYXhpbXVtX2Vycm9yKHVpbnQ4X3QgY29kZSwgY2hhciAqZXJyb3IpCit7CisgICAgaWYgKGNvZGUgPT0gMHhGRikKKwlzcHJpbnRmKGVycm9yLCAiJXMiLCAiVW5rbm93biIpOworICAgIGVsc2UKKwlzcHJpbnRmKGVycm9yLCAiJXUlJSIsIGNvZGUpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvZ3BsbGliL2RtaS9kbWlfYmlvcy5jIGIvY29tMzIvZ3BsbGliL2RtaS9kbWlfYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzQ4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvZG1pL2RtaV9iaW9zLmMKQEAgLTAsMCArMSw3OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgUHBvcnRpb25zIG9mIHRoaXMgZmlsZSB0YWtlbiBmcm9tIHRoZSBkbWlkZWNvZGUgcHJvamVjdAorICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDggSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICogICBpcyBpbiBhbiBvcGVuIHVucGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgKiAgIGZvcm1zIHBhcnQgb2YgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSB0aGUgaW5mb3JtYXRpb24KKyAqICAgaW5jbHVkaW5nIGtleXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVxdWl2YWxlbnRseSBmdW5jdGlvbmFsIGV4ZWN1dGFibGUKKyAqICAgYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKyovCisKKyNpbmNsdWRlIDxkbWkvZG1pLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworY29uc3QgY2hhciAqYmlvc19jaGFyYWNfc3RyaW5nc1tdID0geworICAgICJCSU9TIGNoYXJhY3RlcmlzdGljcyBub3Qgc3VwcG9ydGVkIiwJLyogMyAqLworICAgICJJU0EgaXMgc3VwcG9ydGVkIiwKKyAgICAiTUNBIGlzIHN1cHBvcnRlZCIsCisgICAgIkVJU0EgaXMgc3VwcG9ydGVkIiwKKyAgICAiUENJIGlzIHN1cHBvcnRlZCIsCisgICAgIlBDIENhcmQgKFBDTUNJQSkgaXMgc3VwcG9ydGVkIiwKKyAgICAiUE5QIGlzIHN1cHBvcnRlZCIsCisgICAgIkFQTSBpcyBzdXBwb3J0ZWQiLAorICAgICJCSU9TIGlzIHVwZ3JhZGVhYmxlIiwKKyAgICAiQklPUyBzaGFkb3dpbmcgaXMgYWxsb3dlZCIsCisgICAgIlZMQiBpcyBzdXBwb3J0ZWQiLAorICAgICJFU0NEIHN1cHBvcnQgaXMgYXZhaWxhYmxlIiwKKyAgICAiQm9vdCBmcm9tIENEIGlzIHN1cHBvcnRlZCIsCisgICAgIlNlbGVjdGFibGUgYm9vdCBpcyBzdXBwb3J0ZWQiLAorICAgICJCSU9TIFJPTSBpcyBzb2NrZXRlZCIsCisgICAgIkJvb3QgZnJvbSBQQyBDYXJkIChQQ01DSUEpIGlzIHN1cHBvcnRlZCIsCisgICAgIkVERCBpcyBzdXBwb3J0ZWQiLAorICAgICJKYXBhbmVzZSBmbG9wcHkgZm9yIE5FQyA5ODAwIDEuMiBNQiBpcyBzdXBwb3J0ZWQgKGludCAxM2gpIiwKKyAgICAiSmFwYW5lc2UgZmxvcHB5IGZvciBUb3NoaWJhIDEuMiBNQiBpcyBzdXBwb3J0ZWQgKGludCAxM2gpIiwKKyAgICAiNS4yNVwiLzM2MCBLQiBmbG9wcHkgc2VydmljZXMgYXJlIHN1cHBvcnRlZCAoaW50IDEzaCkiLAorICAgICI1LjI1XCIvMS4yIE1CIGZsb3BweSBzZXJ2aWNlcyBhcmUgc3VwcG9ydGVkIChpbnQgMTNoKSIsCisgICAgIjMuNVwiLzcyMCBLQiBmbG9wcHkgc2VydmljZXMgYXJlIHN1cHBvcnRlZCAoaW50IDEzaCkiLAorICAgICIzLjVcIi8yLjg4IE1CIGZsb3BweSBzZXJ2aWNlcyBhcmUgc3VwcG9ydGVkIChpbnQgMTNoKSIsCisgICAgIlByaW50IHNjcmVlbiBzZXJ2aWNlIGlzIHN1cHBvcnRlZCAoaW50IDVoKSIsCisgICAgIjgwNDIga2V5Ym9hcmQgc2VydmljZXMgYXJlIHN1cHBvcnRlZCAoaW50IDloKSIsCisgICAgIlNlcmlhbCBzZXJ2aWNlcyBhcmUgc3VwcG9ydGVkIChpbnQgMTRoKSIsCisgICAgIlByaW50ZXIgc2VydmljZXMgYXJlIHN1cHBvcnRlZCAoaW50IDE3aCkiLAorICAgICJDR0EvbW9ubyB2aWRlbyBzZXJ2aWNlcyBhcmUgc3VwcG9ydGVkIChpbnQgMTBoKSIsCisgICAgIk5FQyBQQy05OCIJCQkvKiAzMSAqLworfTsKKworY29uc3QgY2hhciAqYmlvc19jaGFyYWNfeDFfc3RyaW5nc1tdID0geworICAgICJBQ1BJIGlzIHN1cHBvcnRlZCIsCS8qIDAgKi8KKyAgICAiVVNCIGxlZ2FjeSBpcyBzdXBwb3J0ZWQiLAorICAgICJBR1AgaXMgc3VwcG9ydGVkIiwKKyAgICAiSTJPIGJvb3QgaXMgc3VwcG9ydGVkIiwKKyAgICAiTFMtMTIwIGJvb3QgaXMgc3VwcG9ydGVkIiwKKyAgICAiQVRBUEkgWmlwIGRyaXZlIGJvb3QgaXMgc3VwcG9ydGVkIiwKKyAgICAiSUVFRSAxMzk0IGJvb3QgaXMgc3VwcG9ydGVkIiwKKyAgICAiU21hcnQgYmF0dGVyeSBpcyBzdXBwb3J0ZWQiCS8qIDcgKi8KK307CisKK2NvbnN0IGNoYXIgKmJpb3NfY2hhcmFjX3gyX3N0cmluZ3NbXSA9IHsKKyAgICAiQklPUyBib290IHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIiwJLyogMCAqLworICAgICJGdW5jdGlvbiBrZXktaW5pdGlhdGVkIG5ldHdvcmsgYm9vdCBpcyBzdXBwb3J0ZWQiLAorICAgICJUYXJnZXRlZCBjb250ZW50IGRpc3RyaWJ1dGlvbiBpcyBzdXBwb3J0ZWQiCS8qIDIgKi8KK307CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZG1pL2RtaV9jYWNoZS5jIGIvY29tMzIvZ3BsbGliL2RtaS9kbWlfY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2E0M2QwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL2RtaS9kbWlfY2FjaGUuYwpAQCAtMCwwICsxLDEzOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllciAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFNvbWUgcGFydCBib3Jyb3dlZCBmcm9tIERNSSBEZWNvZGU6CisgKgorICogICAoQykgMjAwMC0yMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiAgIChDKSAyMDAyLTIwMDcgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGRtaS9kbWkuaD4KKyNpbmNsdWRlIDxkbWkvZG1pX2NhY2hlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIDMuMy44IENhY2hlIEluZm9ybWF0aW9uIChUeXBlIDcpCisgKi8KKworY29uc3QgY2hhciAqZG1pX2NhY2hlX21vZGUodWludDhfdCBjb2RlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICptb2RlW10gPSB7CisJIldyaXRlIFRocm91Z2giLAkvKiAweDAwICovCisJIldyaXRlIEJhY2siLAorCSJWYXJpZXMgV2l0aCBNZW1vcnkgQWRkcmVzcyIsCisJIlVua25vd24iCQkvKiAweDAzICovCisgICAgfTsKKworICAgIHJldHVybiBtb2RlW2NvZGVdOworfQorCitjb25zdCBjaGFyICpkbWlfY2FjaGVfbG9jYXRpb24odWludDhfdCBjb2RlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpsb2NhdGlvbls0XSA9IHsKKwkiSW50ZXJuYWwiLAkJLyogMHgwMCAqLworCSJFeHRlcm5hbCIsCisJIjxPVVQgT0YgU1BFQyIsCQkvKiAweDAyICovCisJIlVua25vd24iCQkvKiAweDAzICovCisgICAgfTsKKworICAgIGlmIChsb2NhdGlvbltjb2RlXSAhPSBOVUxMKQorCXJldHVybiBsb2NhdGlvbltjb2RlXTsKKyAgICByZXR1cm4gb3V0X29mX3NwZWM7Cit9CisKK3VpbnQxNl90IGRtaV9jYWNoZV9zaXplKHVpbnQxNl90IGNvZGUpCit7CisgICAgaWYgKGNvZGUgJiAweDgwMDApCisJcmV0dXJuIChjb2RlICYgMHg3RkZGKSA8PCA2OwkvKiBLQiAqLworICAgIGVsc2UKKwlyZXR1cm4gY29kZTsJCS8qIEtCICovCit9CisKK3ZvaWQgZG1pX2NhY2hlX3R5cGVzKHVpbnQxNl90IGNvZGUsIGNvbnN0IGNoYXIgKnNlcCwgY2hhciAqYXJyYXkpCit7CisgICAgLyogMy4zLjguMiAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICp0eXBlc1tdID0geworCSJPdGhlciIsCQkvKiAwICovCisJIlVua25vd24iLAorCSJOb24tYnVyc3QiLAorCSJCdXJzdCIsCisJIlBpcGVsaW5lIEJ1cnN0IiwKKwkiU3luY2hyb25vdXMiLAorCSJBc3luY2hyb25vdXMiCQkvKiA2ICovCisgICAgfTsKKworICAgIGlmICgoY29kZSAmIDB4MDA3RikgPT0gMCkKKwlzdHJjcHkoYXJyYXksICJOb25lIik7CisgICAgZWxzZSB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDY7IGkrKykKKwkgICAgaWYgKGNvZGUgJiAoMSA8PCBpKSkKKwkJc3ByaW50ZihhcnJheSwgIiVzJXMiLCBzZXAsIHR5cGVzW2ldKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKmRtaV9jYWNoZV9lY190eXBlKHVpbnQ4X3QgY29kZSkKK3sKKyAgICAvKiAzLjMuOC4zICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVbXSA9IHsKKwkiT3RoZXIiLAkJLyogMHgwMSAqLworCSJVbmtub3duIiwKKwkiTm9uZSIsCisJIlBhcml0eSIsCisJIlNpbmdsZS1iaXQgRUNDIiwKKwkiTXVsdGktYml0IEVDQyIJCS8qIDB4MDYgKi8KKyAgICB9OworCisgICAgaWYgKGNvZGUgPj0gMHgwMSAmJiBjb2RlIDw9IDB4MDYpCisJcmV0dXJuIHR5cGVbY29kZSAtIDB4MDFdOworICAgIHJldHVybiBvdXRfb2Zfc3BlYzsKK30KKworY29uc3QgY2hhciAqZG1pX2NhY2hlX3R5cGUodWludDhfdCBjb2RlKQoreworICAgIC8qIDMuMy44LjQgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZVtdID0geworCSJPdGhlciIsCQkvKiAweDAxICovCisJIlVua25vd24iLAorCSJJbnN0cnVjdGlvbiIsCisJIkRhdGEiLAorCSJVbmlmaWVkIgkJLyogMHgwNSAqLworICAgIH07CisKKyAgICBpZiAoY29kZSA+PSAweDAxICYmIGNvZGUgPD0gMHgwNSkKKwlyZXR1cm4gdHlwZVtjb2RlIC0gMHgwMV07CisgICAgcmV0dXJuIG91dF9vZl9zcGVjOworfQorCitjb25zdCBjaGFyICpkbWlfY2FjaGVfYXNzb2NpYXRpdml0eSh1aW50OF90IGNvZGUpCit7CisgICAgLyogMy4zLjguNSAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICp0eXBlW10gPSB7CisJIk90aGVyIiwJCS8qIDB4MDEgKi8KKwkiVW5rbm93biIsCisJIkRpcmVjdCBNYXBwZWQiLAorCSIyLXdheSBTZXQtYXNzb2NpYXRpdmUiLAorCSI0LXdheSBTZXQtYXNzb2NpYXRpdmUiLAorCSJGdWxseSBBc3NvY2lhdGl2ZSIsCisJIjgtd2F5IFNldC1hc3NvY2lhdGl2ZSIsCisJIjE2LXdheSBTZXQtYXNzb2NpYXRpdmUiLAkvKiAweDA4ICovCisJIjEyLXdheSBTZXQtYXNzb2NpYXRpdmUiLAorCSIyNC13YXkgU2V0LWFzc29jaWF0aXZlIiwKKwkiMzItd2F5IFNldC1hc3NvY2lhdGl2ZSIsCisJIjQ4LXdheSBTZXQtYXNzb2NpYXRpdmUiLAorCSI2NC13YXkgU2V0LWFzc29jaWF0aXZlIgkvKiAweDBEICovCisgICAgfTsKKworICAgIGlmIChjb2RlID49IDB4MDEgJiYgY29kZSA8PSAweDBEKQorCXJldHVybiB0eXBlW2NvZGUgLSAweDAxXTsKKyAgICByZXR1cm4gb3V0X29mX3NwZWM7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZG1pL2RtaV9jaGFzc2lzLmMgYi9jb20zMi9ncGxsaWIvZG1pL2RtaV9jaGFzc2lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjYTVjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9kbWkvZG1pX2NoYXNzaXMuYwpAQCAtMCwwICsxLDExMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgUHBvcnRpb25zIG9mIHRoaXMgZmlsZSB0YWtlbiBmcm9tIHRoZSBkbWlkZWNvZGUgcHJvamVjdAorICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDggSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICogICBpcyBpbiBhbiBvcGVuIHVucGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgKiAgIGZvcm1zIHBhcnQgb2YgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSB0aGUgaW5mb3JtYXRpb24KKyAqICAgaW5jbHVkaW5nIGtleXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVxdWl2YWxlbnRseSBmdW5jdGlvbmFsIGV4ZWN1dGFibGUKKyAqICAgYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKyovCisKKyNpbmNsdWRlIDxkbWkvZG1pLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworY29uc3QgY2hhciAqZG1pX2NoYXNzaXNfdHlwZSh1aW50OF90IGNvZGUpCit7CisgICAgLyogMy4zLjQuMSAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICp0eXBlW10gPSB7CisJIk90aGVyIiwJCS8qIDB4MDEgKi8KKwkiVW5rbm93biIsCisJIkRlc2t0b3AiLAorCSJMb3cgUHJvZmlsZSBEZXNrdG9wIiwKKwkiUGl6emEgQm94IiwKKwkiTWluaSBUb3dlciIsCisJIlRvd2VyIiwKKwkiUG9ydGFibGUiLAorCSJMYXB0b3AiLAorCSJOb3RlYm9vayIsCisJIkhhbmQgSGVsZCIsCisJIkRvY2tpbmcgU3RhdGlvbiIsCisJIkFsbCBJbiBPbmUiLAorCSJTdWIgTm90ZWJvb2siLAorCSJTcGFjZS1zYXZpbmciLAorCSJMdW5jaCBCb3giLAorCSJNYWluIFNlcnZlciBDaGFzc2lzIiwJLyogbWFzdGVyLm1pZiBzYXlzIFN5c3RlbSAqLworCSJFeHBhbnNpb24gQ2hhc3NpcyIsCisJIlN1YiBDaGFzc2lzIiwKKwkiQnVzIEV4cGFuc2lvbiBDaGFzc2lzIiwKKwkiUGVyaXBoZXJhbCBDaGFzc2lzIiwKKwkiUkFJRCBDaGFzc2lzIiwKKwkiUmFjayBNb3VudCBDaGFzc2lzIiwKKwkiU2VhbGVkLWNhc2UgUEMiLAorCSJNdWx0aS1zeXN0ZW0iLAkJLyogMHgxOSAqLworCSJDb21wYWN0UENJIiwKKwkiQWR2YW5jZWRUQ0EiLAorCSJCbGFkZSIsCisJIkJsYWRlIEVuY2xvc2luZyIgLyogMHgxRCAqLworICAgIH07CisKKyAgICBpZiAoY29kZSA+PSAweDAxICYmIGNvZGUgPD0gMHgxRCkKKwlyZXR1cm4gdHlwZVtjb2RlIC0gMHgwMV07CisgICAgcmV0dXJuIG91dF9vZl9zcGVjOworfQorCitjb25zdCBjaGFyICpkbWlfY2hhc3Npc19sb2NrKHVpbnQ4X3QgY29kZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqbG9ja1tdID0geworCSJOb3QgUHJlc2VudCIsCQkvKiAweDAwICovCisJIlByZXNlbnQiCQkvKiAweDAxICovCisgICAgfTsKKworICAgIHJldHVybiBsb2NrW2NvZGVdOworfQorCitjb25zdCBjaGFyICpkbWlfY2hhc3Npc19zdGF0ZSh1aW50OF90IGNvZGUpCit7CisgICAgLyogMy4zLjQuMiAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdGF0ZVtdID0geworCSJPdGhlciIsCQkvKiAweDAxICovCisJIlVua25vd24iLAorCSJTYWZlIiwJCQkvKiBtYXN0ZXIubWlmIHNheXMgT0sgKi8KKwkiV2FybmluZyIsCisJIkNyaXRpY2FsIiwKKwkiTm9uLXJlY292ZXJhYmxlIgkvKiAweDA2ICovCisgICAgfTsKKworICAgIGlmIChjb2RlID49IDB4MDEgJiYgY29kZSA8PSAweDA2KQorCXJldHVybiAoc3RhdGVbY29kZSAtIDB4MDFdKTsKKyAgICByZXR1cm4gb3V0X29mX3NwZWM7Cit9CisKK2NvbnN0IGNoYXIgKmRtaV9jaGFzc2lzX3NlY3VyaXR5X3N0YXR1cyh1aW50OF90IGNvZGUpCit7CisgICAgLyogMy4zLjQuMyAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdGF0dXNbXSA9IHsKKwkiT3RoZXIiLAkJLyogMHgwMSAqLworCSJVbmtub3duIiwKKwkiTm9uZSIsCisJIkV4dGVybmFsIEludGVyZmFjZSBMb2NrZWQgT3V0IiwKKwkiRXh0ZXJuYWwgSW50ZXJmYWNlIEVuYWJsZWQiCS8qIDB4MDUgKi8KKyAgICB9OworCisgICAgaWYgKGNvZGUgPj0gMHgwMSAmJiBjb2RlIDw9IDB4MDUpCisJcmV0dXJuIChzdGF0dXNbY29kZSAtIDB4MDFdKTsKKyAgICByZXR1cm4gb3V0X29mX3NwZWM7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZG1pL2RtaV9pcG1pLmMgYi9jb20zMi9ncGxsaWIvZG1pL2RtaV9pcG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhNDcyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9kbWkvZG1pX2lwbWkuYwpAQCAtMCwwICsxLDU1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgdGFrZW4gZnJvbSB0aGUgZG1pZGVjb2RlIHByb2plY3QKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiAgIENvcHlyaWdodCAoQykgMjAwMi0yMDA4IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0IHRoZSAicHJlZmVycmVkIGZvcm0iIG9mIHRoaXMgY29kZSBpcyBvbmUgd2hpY2gKKyAqICAgaXMgaW4gYW4gb3BlbiB1bnBhdGVudCBlbmN1bWJlcmVkIGZvcm1hdC4gV2hlcmUgY3J5cHRvZ3JhcGhpYyBrZXkgc2lnbmluZworICogICBmb3JtcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uCisgKiAgIGluY2x1ZGluZyBrZXlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBlcXVpdmFsZW50bHkgZnVuY3Rpb25hbCBleGVjdXRhYmxlCisgKiAgIGFyZSBkZWVtZWQgdG8gYmUgcGFydCBvZiB0aGUgc291cmNlIGNvZGUuCisqLworCisjaW5jbHVkZSA8ZG1pL2RtaS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2NvbnN0IGNoYXIgKmRtaV9pcG1pX2ludGVyZmFjZV90eXBlKHVpbnQ4X3QgY29kZSkKK3sKKyAgICAvKiAzLjMuMzkuMSBhbmQgSVBNSSAyLjAsIGFwcGVuZGl4IEMxLCB0YWJsZSBDMS0yICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVbXSA9IHsKKwkiVW5rbm93biIsCQkvKiAweDAwICovCisJIktDUyAoS2V5Ym9hcmQgQ29udHJvbCBTdHlsZSkiLAorCSJTTUlDIChTZXJ2ZXIgTWFuYWdlbWVudCBJbnRlcmZhY2UgQ2hpcCkiLAorCSJCVCAoQmxvY2sgVHJhbnNmZXIpIiwKKwkiU1NJRiAoU01CdXMgU3lzdGVtIEludGVyZmFjZSkiCS8qIDB4MDQgKi8KKyAgICB9OworCisgICAgaWYgKGNvZGUgPD0gMHgwNCkKKwlyZXR1cm4gdHlwZVtjb2RlXTsKKyAgICByZXR1cm4gb3V0X29mX3NwZWM7Cit9CisKK3ZvaWQgZG1pX2lwbWlfYmFzZV9hZGRyZXNzKHVpbnQ4X3QgdHlwZSwgY29uc3QgdWludDhfdCAqIHAsIHNfaXBtaSAqIGlwbWkpCit7CisgICAgaWYgKHR5cGUgPT0gMHgwNCkgewkJLyogU1NJRiAqLworCWlwbWktPmJhc2VfYWRkcmVzcyA9ICgqcCkgPj4gMTsKKyAgICB9IGVsc2UgeworCWlwbWktPmJhc2VfYWRkcmVzcyA9IFFXT1JEKHApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi9kbWkvZG1pX21lbW9yeS5jIGIvY29tMzIvZ3BsbGliL2RtaS9kbWlfbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5Mzc1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9kbWkvZG1pX21lbW9yeS5jCkBAIC0wLDAgKzEsMjY0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBQcG9ydGlvbnMgb2YgdGhpcyBmaWxlIHRha2VuIGZyb20gdGhlIGRtaWRlY29kZSBwcm9qZWN0CisgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwOCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICogICBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCB0aGUgInByZWZlcnJlZCBmb3JtIiBvZiB0aGlzIGNvZGUgaXMgb25lIHdoaWNoCisgKiAgIGlzIGluIGFuIG9wZW4gdW5wYXRlbnQgZW5jdW1iZXJlZCBmb3JtYXQuIFdoZXJlIGNyeXB0b2dyYXBoaWMga2V5IHNpZ25pbmcKKyAqICAgZm9ybXMgcGFydCBvZiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIHRoZSBpbmZvcm1hdGlvbgorICogICBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5IGZ1bmN0aW9uYWwgZXhlY3V0YWJsZQorICogICBhcmUgZGVlbWVkIHRvIGJlIHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlLgorKi8KKworI2luY2x1ZGUgPGRtaS9kbWkuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit2b2lkIGRtaV9tZW1vcnlfYXJyYXlfZXJyb3JfaGFuZGxlKHVpbnQxNl90IGNvZGUsIGNoYXIgKmFycmF5KQoreworICAgIGlmIChjb2RlID09IDB4RkZGRSkKKwlzcHJpbnRmKGFycmF5LCAiJXMiLCAiTm90IFByb3ZpZGVkIik7CisgICAgZWxzZSBpZiAoY29kZSA9PSAweEZGRkYpCisJc3ByaW50ZihhcnJheSwgIiVzIiwgIk5vIEVycm9yIik7CisgICAgZWxzZQorCXNwcmludGYoYXJyYXksICIweCUwNFgiLCBjb2RlKTsKK30KKwordm9pZCBkbWlfbWVtb3J5X2RldmljZV93aWR0aCh1aW50MTZfdCBjb2RlLCBjaGFyICp3aWR0aCkKK3sKKyAgICAvKgorICAgICAqIDMuMy4xOCBNZW1vcnkgRGV2aWNlIChUeXBlIDE3KQorICAgICAqIElmIG5vIG1lbW9yeSBtb2R1bGUgaXMgcHJlc2VudCwgd2lkdGggbWF5IGJlIDAKKyAgICAgKi8KKyAgICBpZiAoY29kZSA9PSAweEZGRkYgfHwgY29kZSA9PSAwKQorCXNwcmludGYod2lkdGgsICIlcyIsICJVbmtub3duIik7CisgICAgZWxzZQorCXNwcmludGYod2lkdGgsICIldSBiaXRzIiwgY29kZSk7Cit9CisKK3ZvaWQgZG1pX21lbW9yeV9kZXZpY2Vfc2l6ZSh1aW50MTZfdCBjb2RlLCBjaGFyICpzaXplKQoreworICAgIGlmIChjb2RlID09IDApCisJc3ByaW50ZihzaXplLCAiJXMiLCAiRnJlZSIpOworICAgIGVsc2UgaWYgKGNvZGUgPT0gMHhGRkZGKQorCXNwcmludGYoc2l6ZSwgIiVzIiwgIlVua25vd24iKTsKKyAgICBlbHNlIHsKKwlpZiAoY29kZSAmIDB4ODAwMCkKKwkgICAgc3ByaW50ZihzaXplLCAiJXUga0IiLCBjb2RlICYgMHg3RkZGKTsKKwllbHNlCisJICAgIHNwcmludGYoc2l6ZSwgIiV1IE1CIiwgY29kZSk7CisgICAgfQorfQorCitjb25zdCBjaGFyICpkbWlfbWVtb3J5X2RldmljZV9mb3JtX2ZhY3Rvcih1aW50OF90IGNvZGUpCit7CisgICAgLyogMy4zLjE4LjEgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZm9ybV9mYWN0b3JbXSA9IHsKKwkiT3RoZXIiLAkJLyogMHgwMSAqLworCSJVbmtub3duIiwKKwkiU0lNTSIsCisJIlNJUCIsCisJIkNoaXAiLAorCSJESVAiLAorCSJaSVAiLAorCSJQcm9wcmlldGFyeSBDYXJkIiwKKwkiRElNTSIsCisJIlRTT1AiLAorCSJSb3cgT2YgQ2hpcHMiLAorCSJSSU1NIiwKKwkiU09ESU1NIiwKKwkiU1JJTU0iLAorCSJGQi1ESU1NIgkJLyogMHgwRiAqLworICAgIH07CisKKyAgICBpZiAoY29kZSA+PSAweDAxICYmIGNvZGUgPD0gMHgwRikKKwlyZXR1cm4gZm9ybV9mYWN0b3JbY29kZSAtIDB4MDFdOworICAgIHJldHVybiBvdXRfb2Zfc3BlYzsKK30KKwordm9pZCBkbWlfbWVtb3J5X2RldmljZV9zZXQodWludDhfdCBjb2RlLCBjaGFyICpzZXQpCit7CisgICAgaWYgKGNvZGUgPT0gMCkKKwlzcHJpbnRmKHNldCwgIiVzIiwgIk5vbmUiKTsKKyAgICBlbHNlIGlmIChjb2RlID09IDB4RkYpCisJc3ByaW50ZihzZXQsICIlcyIsICJVbmtub3duIik7CisgICAgZWxzZQorCXNwcmludGYoc2V0LCAiJXUiLCBjb2RlKTsKK30KKworY29uc3QgY2hhciAqZG1pX21lbW9yeV9kZXZpY2VfdHlwZSh1aW50OF90IGNvZGUpCit7CisgICAgLyogMy4zLjE4LjIgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZVtdID0geworCSJPdGhlciIsCQkvKiAweDAxICovCisJIlVua25vd24iLAorCSJEUkFNIiwKKwkiRURSQU0iLAorCSJWUkFNIiwKKwkiU1JBTSIsCisJIlJBTSIsCisJIlJPTSIsCisJIkZsYXNoIiwKKwkiRUVQUk9NIiwKKwkiRkVQUk9NIiwKKwkiRVBST00iLAorCSJDRFJBTSIsCisJIjNEUkFNIiwKKwkiU0RSQU0iLAorCSJTR1JBTSIsCisJIlJEUkFNIiwKKwkiRERSIiwKKwkiRERSMiIsCisJIkREUjIgRkItRElNTSIsCQkvKiAweDE0ICovCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJIkREUjMiLAkJCS8qIDB4MTggKi8KKwkiRkJEMiIJCQkvKiAweDE5ICovCisgICAgfTsKKworICAgIGlmIChjb2RlID49IDB4MDEgJiYgY29kZSA8PSAweDE5KQorCXJldHVybiB0eXBlW2NvZGUgLSAweDAxXTsKKyAgICByZXR1cm4gb3V0X29mX3NwZWM7Cit9CisKK3ZvaWQgZG1pX21lbW9yeV9kZXZpY2VfdHlwZV9kZXRhaWwodWludDE2X3QgY29kZSwgY2hhciAqdHlwZV9kZXRhaWwsIGludCBzaXplb2ZfdHlwZV9kZXRhaWwpCit7CisgICAgLyogMy4zLjE4LjMgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZGV0YWlsW10gPSB7CisJIk90aGVyIiwJCS8qIDEgKi8KKwkiVW5rbm93biIsCisJIkZhc3QtcGFnZWQiLAorCSJTdGF0aWMgQ29sdW1uIiwKKwkiUHNldWRvLXN0YXRpYyIsCisJIlJBTUJ1cyIsCisJIlN5bmNocm9ub3VzIiwKKwkiQ01PUyIsCisJIkVETyIsCisJIldpbmRvdyBEUkFNIiwKKwkiQ2FjaGUgRFJBTSIsCisJIk5vbi1Wb2xhdGlsZSIJCS8qIDEyICovCisgICAgfTsKKworICAgIGlmICgoY29kZSAmIDB4MUZGRSkgPT0gMCkKKwlzcHJpbnRmKHR5cGVfZGV0YWlsLCAiJXMiLCAiTm9uZSIpOworICAgIGVsc2UgeworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8PSAxMjsgaSsrKQorCSAgICBpZiAoY29kZSAmICgxIDw8IGkpKQorCQlzbnByaW50Zih0eXBlX2RldGFpbCwgc2l6ZW9mX3R5cGVfZGV0YWlsLCAiJXMiLCBkZXRhaWxbaSAtIDFdKTsKKyAgICB9Cit9CisKK3ZvaWQgZG1pX21lbW9yeV9kZXZpY2Vfc3BlZWQodWludDE2X3QgY29kZSwgY2hhciAqc3BlZWQpCit7CisgICAgaWYgKGNvZGUgPT0gMCkKKwlzcHJpbnRmKHNwZWVkLCAiJXMiLCAiVW5rbm93biIpOworICAgIGVsc2UKKwlzcHJpbnRmKHNwZWVkLCAiJXUgTUh6IiwgY29kZSk7Cit9CisKKy8qCisgKiAzLjMuNyBNZW1vcnkgTW9kdWxlIEluZm9ybWF0aW9uIChUeXBlIDYpCisgKi8KKwordm9pZCBkbWlfbWVtb3J5X21vZHVsZV90eXBlcyh1aW50MTZfdCBjb2RlLCBjb25zdCBjaGFyICpzZXAsIGNoYXIgKnR5cGUsIGludCBzaXplb2ZfdHlwZSkKK3sKKyAgICAvKiAzLjMuNy4xICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVzW10gPSB7CisJIk90aGVyIiwJCS8qIDAgKi8KKwkiVW5rbm93biIsCisJIlN0YW5kYXJkIiwKKwkiRlBNIiwKKwkiRURPIiwKKwkiUGFyaXR5IiwKKwkiRUNDIiwKKwkiU0lNTSIsCisJIkRJTU0iLAorCSJCdXJzdCBFRE8iLAorCSJTRFJBTSIJCQkvKiAxMCAqLworICAgIH07CisKKyAgICBpZiAoKGNvZGUgJiAweDA3RkYpID09IDApCisJc3ByaW50Zih0eXBlLCAiJXMiLCAiTm9uZSIpOworICAgIGVsc2UgeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8PSAxMDsgaSsrKQorCSAgICBpZiAoY29kZSAmICgxIDw8IGkpKQorCQlzbnByaW50Zih0eXBlLCBzaXplb2ZfdHlwZSwgIiVzJXMlcyIsIHR5cGUsIHNlcCwgdHlwZXNbaV0pOworICAgIH0KK30KKwordm9pZCBkbWlfbWVtb3J5X21vZHVsZV9jb25uZWN0aW9ucyh1aW50OF90IGNvZGUsIGNoYXIgKmNvbm5lY3Rpb24sIGludCBzaXplb2ZfY29ubmVjdGlvbikKK3sKKyAgICBpZiAoY29kZSA9PSAweEZGKQorCXNwcmludGYoY29ubmVjdGlvbiwgIiVzIiwgIk5vbmUiKTsKKyAgICBlbHNlIHsKKwlpZiAoKGNvZGUgJiAweEYwKSAhPSAweEYwKQorCSAgICBzcHJpbnRmKGNvbm5lY3Rpb24sICIldSAiLCBjb2RlID4+IDQpOworCWlmICgoY29kZSAmIDB4MEYpICE9IDB4MEYpCisJICAgIHNucHJpbnRmKGNvbm5lY3Rpb24sIHNpemVvZl9jb25uZWN0aW9uLCAiJXMldSIsIGNvbm5lY3Rpb24sIGNvZGUgJiAweDBGKTsKKyAgICB9Cit9CisKK3ZvaWQgZG1pX21lbW9yeV9tb2R1bGVfc3BlZWQodWludDhfdCBjb2RlLCBjaGFyICpzcGVlZCkKK3sKKyAgICBpZiAoY29kZSA9PSAwKQorCXNwcmludGYoc3BlZWQsICIlcyIsICJVbmtub3duIik7CisgICAgZWxzZQorCXNwcmludGYoc3BlZWQsICIldSBucyIsIGNvZGUpOworfQorCit2b2lkIGRtaV9tZW1vcnlfbW9kdWxlX3NpemUodWludDhfdCBjb2RlLCBjaGFyICpzaXplLCBpbnQgc2l6ZW9mX3NpemUpCit7CisgICAgLyogMy4zLjcuMiAqLworICAgIHN3aXRjaCAoY29kZSAmIDB4N0YpIHsKKyAgICBjYXNlIDB4N0Q6CisJc3ByaW50ZihzaXplLCAiJXMiLCAiTm90IERldGVybWluYWJsZSIpOworCWJyZWFrOworICAgIGNhc2UgMHg3RToKKwlzcHJpbnRmKHNpemUsICIlcyIsICJEaXNhYmxlZCIpOworCWJyZWFrOworICAgIGNhc2UgMHg3RjoKKwlzcHJpbnRmKHNpemUsICIlcyIsICJOb3QgSW5zdGFsbGVkIik7CisJcmV0dXJuOworICAgIGRlZmF1bHQ6CisJc3ByaW50ZihzaXplLCAiJXUgTUIiLCAxIDw8IChjb2RlICYgMHg3RikpOworICAgIH0KKworICAgIGlmIChjb2RlICYgMHg4MCkKKwlzbnByaW50ZihzaXplLCBzaXplb2Zfc2l6ZSwgIiVzICVzIiwgc2l6ZSwgIihEb3VibGUtYmFuayBDb25uZWN0aW9uKSIpOworICAgIGVsc2UKKwlzbnByaW50ZihzaXplLCBzaXplb2Zfc2l6ZSwgIiVzICVzIiwgc2l6ZSwgIihTaW5nbGUtYmFuayBDb25uZWN0aW9uKSIpOworfQorCit2b2lkIGRtaV9tZW1vcnlfbW9kdWxlX2Vycm9yKHVpbnQ4X3QgY29kZSwgY29uc3QgY2hhciAqcHJlZml4LCBjaGFyICplcnJvcikKK3sKKyAgICBpZiAoY29kZSAmICgxIDw8IDIpKQorCXNwcmludGYoZXJyb3IsICIlcyIsICJTZWUgRXZlbnQgTG9nXG4iKTsKKyAgICBlbHNlIHsKKwlpZiAoKGNvZGUgJiAweDAzKSA9PSAwKQorCSAgICBzcHJpbnRmKGVycm9yLCAiJXMiLCAiT0tcbiIpOworCWlmIChjb2RlICYgKDEgPDwgMCkpCisJICAgIHNwcmludGYoZXJyb3IsICIlc1VuY29ycmVjdGFibGUgRXJyb3JzXG4iLCBwcmVmaXgpOworCWlmIChjb2RlICYgKDEgPDwgMSkpCisJICAgIHNwcmludGYoZXJyb3IsICIlc0NvcnJlY3RhYmxlIEVycm9yc1xuIiwgcHJlZml4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvZG1pL2RtaV9wcm9jZXNzb3IuYyBiL2NvbTMyL2dwbGxpYi9kbWkvZG1pX3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMmVmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvZG1pL2RtaV9wcm9jZXNzb3IuYwpAQCAtMCwwICsxLDQzMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgUHBvcnRpb25zIG9mIHRoaXMgZmlsZSB0YWtlbiBmcm9tIHRoZSBkbWlkZWNvZGUgcHJvamVjdAorICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDggSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICogICBpcyBpbiBhbiBvcGVuIHVucGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgKiAgIGZvcm1zIHBhcnQgb2YgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSB0aGUgaW5mb3JtYXRpb24KKyAqICAgaW5jbHVkaW5nIGtleXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVxdWl2YWxlbnRseSBmdW5jdGlvbmFsIGV4ZWN1dGFibGUKKyAqICAgYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKyovCisKKyNpbmNsdWRlIDxkbWkvZG1pLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworY29uc3QgY2hhciAqZG1pX3Byb2Nlc3Nvcl90eXBlKHVpbnQ4X3QgY29kZSkKK3sKKyAgICAvKiAzLjMuNS4xICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVbXSA9IHsKKwkiT3RoZXIiLAkJLyogMHgwMSAqLworCSJVbmtub3duIiwKKwkiQ2VudHJhbCBQcm9jZXNzb3IiLAorCSJNYXRoIFByb2Nlc3NvciIsCisJIkRTUCBQcm9jZXNzb3IiLAorCSJWaWRlbyBQcm9jZXNzb3IiCS8qIDB4MDYgKi8KKyAgICB9OworCisgICAgaWYgKGNvZGUgPj0gMHgwMSAmJiBjb2RlIDw9IDB4MDYpCisJcmV0dXJuIHR5cGVbY29kZSAtIDB4MDFdOworICAgIHJldHVybiBvdXRfb2Zfc3BlYzsKK30KKworY29uc3QgY2hhciAqZG1pX3Byb2Nlc3Nvcl9mYW1pbHkodWludDhfdCBjb2RlLCBjaGFyICptYW51ZmFjdHVyZXIpCit7CisgICAgLyogMy4zLjUuMiAqLworICAgIC8qIFRPRE8gOiBOZWVkIHRvIGltcGxlbWVudCBjb2RlL3ZhbHVlIChzZWUgZG1pZGVjb2RlKSBpbnN0ZWVkIG9mIGFycmF5IHRvIGFkZHJlc3MgbGFyZ2UgaW5kZXggKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZmFtaWx5WzI1Nl0gPSB7CisJTlVMTCwJCQkvKiAweDAwICovCisJIk90aGVyIiwKKwkiVW5rbm93biIsCisJIjgwODYiLAorCSI4MDI4NiIsCisJIjgwMzg2IiwKKwkiODA0ODYiLAorCSI4MDg3IiwKKwkiODAyODciLAorCSI4MDM4NyIsCisJIjgwNDg3IiwKKwkiUGVudGl1bSIsCisJIlBlbnRpdW0gUHJvIiwKKwkiUGVudGl1bSBJSSIsCisJIlBlbnRpdW0gTU1YIiwKKwkiQ2VsZXJvbiIsCisJIlBlbnRpdW0gSUkgWGVvbiIsCisJIlBlbnRpdW0gSUlJIiwKKwkiTTEiLAorCSJNMiIsCisJIkNlbGVyb24gTSIsCQkvKiAweDE0ICovCisJIlBlbnRpdW0gNCBIVCIsCisJTlVMTCwKKwlOVUxMLAkJCS8qIDB4MTcgKi8KKwkiRHVyb24iLAorCSJLNSIsCisJIks2IiwKKwkiSzYtMiIsCisJIks2LTMiLAorCSJBdGhsb24iLAorCSJBTUQyOTAwIiwKKwkiSzYtMisiLAorCSJQb3dlciBQQyIsCisJIlBvd2VyIFBDIDYwMSIsCisJIlBvd2VyIFBDIDYwMyIsCisJIlBvd2VyIFBDIDYwMysiLAorCSJQb3dlciBQQyA2MDQiLAorCSJQb3dlciBQQyA2MjAiLAorCSJQb3dlciBQQyB4NzA0IiwKKwkiUG93ZXIgUEMgNzUwIiwKKwkiQ29yZSAyIER1byIsCQkvKiAweDI4ICovCisJIkNvcmUgMiBEdW8gTW9iaWxlIiwKKwkiQ29yZSBTb2xvIE1vYmlsZSIsCisJIkF0b20iLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCQkJLyogMHgyRiAqLworCSJBbHBoYSIsCisJIkFscGhhIDIxMDY0IiwKKwkiQWxwaGEgMjEwNjYiLAorCSJBbHBoYSAyMTE2NCIsCisJIkFscGhhIDIxMTY0UEMiLAorCSJBbHBoYSAyMTE2NGEiLAorCSJBbHBoYSAyMTI2NCIsCisJIkFscGhhIDIxMzY0IiwKKwlOVUxMLAkJCS8qIDB4MzggKi8KKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAkJCS8qIDB4M0YgKi8KKwkiTUlQUyIsCisJIk1JUFMgUjQwMDAiLAorCSJNSVBTIFI0MjAwIiwKKwkiTUlQUyBSNDQwMCIsCisJIk1JUFMgUjQ2MDAiLAorCSJNSVBTIFIxMDAwMCIsCisJTlVMTCwJCQkvKiAweDQ2ICovCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCQkJLyogMHg0RiAqLworCSJTUEFSQyIsCisJIlN1cGVyU1BBUkMiLAorCSJNaWNyb1NQQVJDIElJIiwKKwkiTWljcm9TUEFSQyBJSWVwIiwKKwkiVWx0cmFTUEFSQyIsCisJIlVsdHJhU1BBUkMgSUkiLAorCSJVbHRyYVNQQVJDIElJaSIsCisJIlVsdHJhU1BBUkMgSUlJIiwKKwkiVWx0cmFTUEFSQyBJSUlpIiwKKwlOVUxMLAkJCS8qIDB4NTkgKi8KKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwJCQkvKiAweDVGICovCisJIjY4MDQwIiwKKwkiNjh4eHgiLAorCSI2ODAwMCIsCisJIjY4MDEwIiwKKwkiNjgwMjAiLAorCSI2ODAzMCIsCisJTlVMTCwJCQkvKiAweDY2ICovCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCQkJLyogMHg2RiAqLworCSJIb2JiaXQiLAorCU5VTEwsCQkJLyogMHg3MSAqLworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAkJCS8qIDB4NzcgKi8KKwkiQ3J1c29lIFRNNTAwMCIsCisJIkNydXNvZSBUTTMwMDAiLAorCSJFZmZpY2VvbiBUTTgwMDAiLAorCU5VTEwsCQkJLyogMHg3QiAqLworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCQkJLyogMHg3RiAqLworCSJXZWl0ZWsiLAorCU5VTEwsCQkJLyogMHg4MSAqLworCSJJdGFuaXVtIiwKKwkiQXRobG9uIDY0IiwKKwkiT3B0ZXJvbiIsCisJIlNlbXByb24iLAorCSJUdXJpb24gNjQiLAkJLyogMHg4NiAqLworCSJEdWFsLUNvcmUgT3B0ZXJvbiIsCisJIkF0bGhvbiA2NCBYMiIsCisJIlR1cmlvbiA2NCBYMiIsCisJIlF1YWQtQ29yZSBPcHRlcm9uIiwKKwkiVGhpcmQtR2VuZXJhdGlvbiBPcHRlcm9uIiwKKwkiUGhlbm9tIEZYIiwKKwkiUGhlbm9tIFg0IiwKKwkiUGhlbm9tIFgyIiwKKwkiQXRobG9uIFgyIiwJCS8qIDB4OEYgKi8KKwkiUEEtUklTQyIsCisJIlBBLVJJU0MgODUwMCIsCisJIlBBLVJJU0MgODAwMCIsCisJIlBBLVJJU0MgNzMwMExDIiwKKwkiUEEtUklTQyA3MjAwIiwKKwkiUEEtUklTQyA3MTAwTEMiLAorCSJQQS1SSVNDIDcxMDAiLAorCU5VTEwsCQkJLyogMHg5NyAqLworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwJCQkvKiAweDlGICovCisJIlYzMCIsCisJIlF1YWQtQ29yZSBYZW9uIDMyMDAiLAkvKiAweEExICovCisJIkR1YWwtQ29yZSBYZW9uIDMwMDAiLAorCSJRdWFkLUNvcmUgWGVvbiA1MzAwIiwKKwkiRHVhbC1Db3JlIFhlb24gNTEwMCIsCisJIkR1YWwtQ29yZSBYZW9uIDUwMDAiLAorCSJEdWFsLUNvcmUgWGVvbiBMViIsCisJIkR1YWwtQ29yZSBYZW9uIFVMViIsCisJIkR1YWwtQ29yZSBYZW9uIDcxMDAiLAorCSJRdWFkLUNvcmUgWGVvbiA1NDAwIiwKKwkiUXVhZC1Db3JlIFhlb24iLAkvKiAweEFBICovCisJIkR1YWwtQ29yZSBYZW9uIDUyMDAiLAorCSJEdWFsLUNvcmUgWGVvbiA3MjAwIiwKKwkiUXVhZC1Db3JlIFhlb24gNzMwMCIsCisJIlF1YWQtQ29yZSBYZW9uIDc0MDAiLAorCSJNdWx0aS1Db3JlIFhlb24gNzQwMCIsCQkJLyogMHhBRiAqLworCSJQZW50aXVtIElJSSBYZW9uIiwKKwkiUGVudGl1bSBJSUkgU3BlZWRzdGVwIiwKKwkiUGVudGl1bSA0IiwKKwkiWGVvbiIsCisJIkFTNDAwIiwKKwkiWGVvbiBNUCIsCisJIkF0aGxvbiBYUCIsCisJIkF0aGxvbiBNUCIsCisJIkl0YW5pdW0gMiIsCisJIlBlbnRpdW0gTSIsCisJIkNlbGVyb24gRCIsCQkvKiAweEJBICovCisJIlBlbnRpdW0gRCIsCisJIlBlbnRpdW0gRUUiLAorCSJDb3JlIFNvbG8iLAkJLyogMHhCRCAqLworCU5VTEwsCisJIkNvcmUgMiBEdW8iLAorCSJDb3JlIDIgU29sbyIsCisJIkNvcmUgMiBFeHRyZW1lIiwKKwkiQ29yZSAyIFF1YWQiLAorCSJDb3JlIDIgRXh0cmVtZSBNb2JpbGUiLAorCSJDb3JlIDIgRHVvIE1vYmlsZSIsCisJIkNvcmUgMiBTb2xvIE1vYmlsZSIsCisJIkNvcmUgaTciLAorCSJEdWFsLUNvcmUgQ2VsZXJvbiIsCQkvKiAweEM3ICovCisJIklCTTM5MCIsCisJIkc0IiwKKwkiRzUiLAorCSJFU0EvMzkwIEc2IiwJCS8qIDB4Q0IgKi8KKwkiei9BcmNoaXRlY3R1ciIsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwJCQkvKjB4RDAgKi8KKwlOVUxMLAorCSJDNy1NIiwKKwkiQzctRCIsCisJIkM3IiwKKwkiRWRlbiIsCisJIk11bHRpLUNvcmUgWGVvbiIsCQkJLyoweEQ2ICovCisJIkR1YWwtQ29yZSBYZW9uIDN4eHgiLAorCSJRdWFkLUNvcmUgWGVvbiAzeHh4IiwgIC8qMHhEOCAqLworCU5VTEwsCisJIkR1YWwtQ29yZSBYZW9uIDV4eHgiLCAvKjB4REEgKi8KKwkiUXVhZC1Db3JlIFhlb24gNXh4eCIsCisJTlVMTCwKKwkiRHVhbC1Db3JlIFhlb24gN3h4eCIsIC8qMHhERCAqLworCSJRdWFkLUNvcmUgWGVvbiA3eHh4IiwKKwkiTXVsdGktQ29yZSBYZW9uIDd4eHgiLAorCU5VTEwsCQkJLyoweEUwICovCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCSJFbWJlZGRlZCBPcHRlcm9uIFF1YWQtQ29yZSIsCS8qIDB4RTYgKi8KKwkiUGhlbm9tIFRyaXBsZS1Db3JlIiwKKwkiVHVyaW9uIFVsdHJhIER1YWwtQ29yZSBNb2JpbGUiLAorCSJUdXJpb24gRHVhbC1Db3JlIE1vYmlsZSIsCisJIkF0aGxvbiBEdWFsLUNvcmUiLAorCSJTZW1wcm9uIFNJIiwJCS8qMHhFQiAqLworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwJCQkvKiAweEY5ICovCisJImk4NjAiLAorCSJpOTYwIiwKKwlOVUxMLAkJCS8qIDB4RkMgKi8KKwlOVUxMLAorCU5VTEwsCisJTlVMTCwJCQkvKiAweEZGICovCisgICAgfTsKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGFtYmlndW91cyB2YWx1ZSAweEJFICovCisgICAgaWYgKGNvZGUgPT0gMHhCRSkgeworCS8qIEJlc3QgYmV0IGJhc2VkIG9uIG1hbnVmYWN0dXJlciBzdHJpbmcgKi8KKwlpZiAoc3Ryc3RyKG1hbnVmYWN0dXJlciwgIkludGVsIikgIT0gTlVMTAorCSAgICB8fCBzdHJuY2FzZWNtcChtYW51ZmFjdHVyZXIsICJJbnRlbCIsIDUpID09IDApCisJICAgIHJldHVybiAiQ29yZSAyIjsKKwlpZiAoc3Ryc3RyKG1hbnVmYWN0dXJlciwgIkFNRCIpICE9IE5VTEwKKwkgICAgfHwgc3RybmNhc2VjbXAobWFudWZhY3R1cmVyLCAiQU1EIiwgMykgPT0gMCkKKwkgICAgcmV0dXJuICJLNyI7CisJcmV0dXJuICJDb3JlIDIgb3IgSzciOworICAgIH0KKworICAgIGlmIChmYW1pbHlbY29kZV0gIT0gTlVMTCkgeworCXJldHVybiBmYW1pbHlbY29kZV07CisgICAgfQorICAgIHJldHVybiBvdXRfb2Zfc3BlYzsKK30KKworY29uc3QgY2hhciAqZG1pX3Byb2Nlc3Nvcl9zdGF0dXModWludDhfdCBjb2RlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdGF0dXNbXSA9IHsKKwkiVW5rbm93biIsCQkvKiAweDAwICovCisJIkVuYWJsZWQiLAorCSJEaXNhYmxlZCBCeSBVc2VyIiwKKwkiRGlzYWJsZWQgQnkgQklPUyIsCisJIklkbGUiLAkJCS8qIDB4MDQgKi8KKwkiPE9VVCBPRiBTUEVDPiIsCisJIjxPVVQgT0YgU1BFQz4iLAorCSJPdGhlciIJCQkvKiAweDA3ICovCisgICAgfTsKKworICAgIGlmIChjb2RlIDw9IDB4MDQpCisJcmV0dXJuIHN0YXR1c1tjb2RlXTsKKyAgICBpZiAoY29kZSA9PSAweDA3KQorCXJldHVybiBzdGF0dXNbMHgwNV07CisgICAgcmV0dXJuIG91dF9vZl9zcGVjOworfQorCitjb25zdCBjaGFyICpkbWlfcHJvY2Vzc29yX3VwZ3JhZGUodWludDhfdCBjb2RlKQoreworICAgIC8qIDMuMy41LjUgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdXBncmFkZVtdID0geworCSJPdGhlciIsCQkvKiAweDAxICovCisJIlVua25vd24iLAorCSJEYXVnaHRlciBCb2FyZCIsCisJIlpJRiBTb2NrZXQiLAorCSJSZXBsYWNlYWJsZSBQaWdneSBCYWNrIiwKKwkiTm9uZSIsCisJIkxJRiBTb2NrZXQiLAorCSJTbG90IDEiLAorCSJTbG90IDIiLAorCSIzNzAtcGluIFNvY2tldCIsCisJIlNsb3QgQSIsCisJIlNsb3QgTSIsCisJIlNvY2tldCA0MjMiLAorCSJTb2NrZXQgQSAoU29ja2V0IDQ2MikiLAorCSJTb2NrZXQgNDc4IiwKKwkiU29ja2V0IDc1NCIsCisJIlNvY2tldCA5NDAiLAorCSJTb2NrZXQgOTM5IgkJLyogMHgxMiAqLworCSJTb2NrZXQgbVBHQTYwNCIsCisJIlNvY2tldCBMR0E3NzEiLAorCSJTb2NrZXQgTEdBNzc1IiwKKwkiU29ja2V0IFMxIiwKKwkiU29ja2V0IEFNMiIsCisJIlNvY2tldCBGICgxMjA3KSIKKwkiU29ja2V0IExHQTEzNjYiCS8qIDB4MTkgKi8KKyAgICB9OworCisgICAgaWYgKGNvZGUgPj0gMHgwMSAmJiBjb2RlIDw9IDB4MTkpCisJcmV0dXJuIHVwZ3JhZGVbY29kZSAtIDB4MDFdOworICAgIHJldHVybiBvdXRfb2Zfc3BlYzsKK30KKwordm9pZCBkbWlfcHJvY2Vzc29yX2NhY2hlKHVpbnQxNl90IGNvZGUsIGNvbnN0IGNoYXIgKmxldmVsLCB1aW50MTZfdCB2ZXIsCisJCQkgY2hhciAqY2FjaGUpCit7CisgICAgaWYgKGNvZGUgPT0gMHhGRkZGKSB7CisJaWYgKHZlciA+PSAweDAyMDMpCisJICAgIHNwcmludGYoY2FjaGUsICJOb3QgUHJvdmlkZWQiKTsKKwllbHNlCisJICAgIHNwcmludGYoY2FjaGUsICJObyAlcyBDYWNoZSIsIGxldmVsKTsKKyAgICB9IGVsc2UKKwlzcHJpbnRmKGNhY2hlLCAiMHglMDRYIiwgY29kZSk7Cit9CisKKy8qIEludGVsIEFQLTQ4NSByZXZpc2lvbiAyOCwgdGFibGUgNSAqLworY29uc3QgY2hhciAqY3B1X2ZsYWdzX3N0cmluZ3NbUFJPQ0VTU09SX0ZMQUdTX0VMRU1FTlRTXSA9IHsKKyAgICAiRlBVIChGbG9hdGluZy1wb2ludCB1bml0IG9uLWNoaXApIiwJLyogMCAqLworICAgICJWTUUgKFZpcnR1YWwgbW9kZSBleHRlbnNpb24pIiwKKyAgICAiREUgKERlYnVnZ2luZyBleHRlbnNpb24pIiwKKyAgICAiUFNFIChQYWdlIHNpemUgZXh0ZW5zaW9uKSIsCisgICAgIlRTQyAoVGltZSBzdGFtcCBjb3VudGVyKSIsCisgICAgIk1TUiAoTW9kZWwgc3BlY2lmaWMgcmVnaXN0ZXJzKSIsCisgICAgIlBBRSAoUGh5c2ljYWwgYWRkcmVzcyBleHRlbnNpb24pIiwKKyAgICAiTUNFIChNYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbikiLAorICAgICJDWDggKENNUFhDSEc4IGluc3RydWN0aW9uIHN1cHBvcnRlZCkiLAorICAgICJBUElDIChPbi1jaGlwIEFQSUMgaGFyZHdhcmUgc3VwcG9ydGVkKSIsCisgICAgTlVMTCwJCQkvKiAxMCAqLworICAgICJTRVAgKEZhc3Qgc3lzdGVtIGNhbGwpIiwKKyAgICAiTVRSUiAoTWVtb3J5IHR5cGUgcmFuZ2UgcmVnaXN0ZXJzKSIsCisgICAgIlBHRSAoUGFnZSBnbG9iYWwgZW5hYmxlKSIsCisgICAgIk1DQSAoTWFjaGluZSBjaGVjayBhcmNoaXRlY3R1cmUpIiwKKyAgICAiQ01PViAoQ29uZGl0aW9uYWwgbW92ZSBpbnN0cnVjdGlvbiBzdXBwb3J0ZWQpIiwKKyAgICAiUEFUIChQYWdlIGF0dHJpYnV0ZSB0YWJsZSkiLAorICAgICJQU0UtMzYgKDM2LWJpdCBwYWdlIHNpemUgZXh0ZW5zaW9uKSIsCisgICAgIlBTTiAoUHJvY2Vzc29yIHNlcmlhbCBudW1iZXIgcHJlc2VudCBhbmQgZW5hYmxlZCkiLAorICAgICJDTEZTSCAoQ0xGTFVTSCBpbnN0cnVjdGlvbiBzdXBwb3J0ZWQpIiwKKyAgICBOVUxMLAkJCS8qIDIwICovCisgICAgIkRTIChEZWJ1ZyBzdG9yZSkiLAorICAgICJBQ1BJIChBQ1BJIHN1cHBvcnRlZCkiLAorICAgICJNTVggKE1NWCB0ZWNobm9sb2d5IHN1cHBvcnRlZCkiLAorICAgICJGWFNSIChGYXN0IGZsb2F0aW5nLXBvaW50IHNhdmUgYW5kIHJlc3RvcmUpIiwKKyAgICAiU1NFIChTdHJlYW1pbmcgU0lNRCBleHRlbnNpb25zKSIsCisgICAgIlNTRTIgKFN0cmVhbWluZyBTSU1EIGV4dGVuc2lvbnMgMikiLAorICAgICJTUyAoU2VsZi1zbm9vcCkiLAorICAgICJIVFQgKEh5cGVyLXRocmVhZGluZyB0ZWNobm9sb2d5KSIsCisgICAgIlRNIChUaGVybWFsIG1vbml0b3Igc3VwcG9ydGVkKSIsCisgICAgIklBNjQgKElBNjQgY2FwYWJpbGl0aWVzKSIsCS8qIDMwICovCisgICAgIlBCRSAoUGVuZGluZyBicmVhayBlbmFibGVkKSIJLyogMzEgKi8KK307CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvbWVtb3J5LmMgYi9jb20zMi9ncGxsaWIvbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjNzQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi9tZW1vcnkuYwpAQCAtMCwwICsxLDQ1MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllcgorICoKKyAqICAgU29tZSBwYXJ0cyBib3Jyb3dlZCBmcm9tIG1lbWluZm8uYzMyOgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFNvbWUgcGFydHMgYm9ycm93ZWQgZnJvbSBMaW51eDoKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcworICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgorICoKKyAqICAgSW50ZXJydXB0IGxpc3QgZnJvbSBSYWxmIEJyb3duIChodHRwOi8vd3d3LmNzLmNtdS5lZHUvfnJhbGYvZmlsZXMuaHRtbCkKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFN5c2xpbnV4LCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKK2NvbnN0IGNoYXIgKmNvbnN0IGU4MjBfdHlwZXNbXSA9IHsKKyAgICAidXNhYmxlIiwKKyAgICAicmVzZXJ2ZWQiLAorICAgICJBQ1BJIHJlY2xhaW0iLAorICAgICJBQ1BJIE5WUyIsCisgICAgInVudXNhYmxlIiwKK307CisKK3N0cnVjdCBlODIwX2V4dF9lbnRyeSB7CisgICAgc3RydWN0IGU4MjBlbnRyeSBzdGQ7CisgICAgdWludDMyX3QgZXh0X2ZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgU01BUAkweDUzNGQ0MTUwCS8qIEFTQ0lJICJTTUFQIiAqLworCit2b2lkIGdldF90eXBlKGludCB0eXBlLCBjaGFyICp0eXBlX3B0ciwgaW50IHR5cGVfcHRyX3N6KQoreworICAgIHVuc2lnbmVkIGludCByZWFsX3R5cGUgPSB0eXBlIC0gMTsKKyAgICBpZiAocmVhbF90eXBlIDwgc2l6ZW9mKGU4MjBfdHlwZXMpIC8gc2l6ZW9mKGU4MjBfdHlwZXNbMF0pKQorCXN0cmxjcHkodHlwZV9wdHIsIGU4MjBfdHlwZXNbcmVhbF90eXBlXSwgdHlwZV9wdHJfc3opOworfQorCisvKioKKyAqSU5UIDE1IC0gbmV3ZXIgQklPU2VzIC0gR0VUIFNZU1RFTSBNRU1PUlkgTUFQCisgKglBWCA9IEU4MjBoCisgKglFQVggPSAwMDAwRTgyMGgKKyAqCUVEWCA9IDUzNEQ0MTUwaCAoJ1NNQVAnKQorICoJRUJYID0gY29udGludWF0aW9uIHZhbHVlIG9yIDAwMDAwMDAwaCB0byBzdGFydCBhdCBiZWdpbm5pbmcgb2YgbWFwCisgKglFQ1ggPSBzaXplIG9mIGJ1ZmZlciBmb3IgcmVzdWx0LCBpbiBieXRlcyAoc2hvdWxkIGJlID49IDIwIGJ5dGVzKQorICoJRVM6REkgLT4gYnVmZmVyIGZvciByZXN1bHQgKHNlZSAjMDA1ODEpCisgKgorICogUmV0dXJuOiBDRiBjbGVhciBpZiBzdWNjZXNzZnVsCisgKgkgICAgRUFYID0gNTM0RDQxNTBoICgnU01BUCcpCisgKgkgICAgRVM6REkgYnVmZmVyIGZpbGxlZAorICoJICAgIEVCWCA9IG5leHQgb2Zmc2V0IGZyb20gd2hpY2ggdG8gY29weSBvciAwMDAwMDAwMGggaWYgYWxsIGRvbmUKKyAqCSAgICBFQ1ggPSBhY3R1YWwgbGVuZ3RoIHJldHVybmVkIGluIGJ5dGVzCisgKglDRiBzZXQgb24gZXJyb3IKKyAqCSAgICBBSCA9IGVycm9yIGNvZGUgKDg2aCkgKHNlZSAjMDA0OTYgYXQgSU5UIDE1L0FIPTgwaCkKKyAqCisgKiBOb3Rlczogb3JpZ2luYWxseSBpbnRyb2R1Y2VkIHdpdGggdGhlIFBob2VuaXggQklPUyB2NC4wLCB0aGlzIGZ1bmN0aW9uIGlzCisgKgkgIG5vdyBzdXBwb3J0ZWQgYnkgbW9zdCBuZXdlciBCSU9TZXMsIHNpbmNlIHZhcmlvdXMgdmVyc2lvbnMgb2YgV2luZG93cworICoJICBjYWxsIGl0IHRvIGZpbmQgb3V0IGFib3V0IHRoZSBzeXN0ZW0gbWVtb3J5CisgKglhIG1heGltdW0gb2YgMjAgYnl0ZXMgd2lsbCBiZSB0cmFuc2ZlcnJlZCBhdCBvbmUgdGltZSwgZXZlbiBpZiBFQ1ggaXMKKyAqCSAgaGlnaGVyOyBzb21lIEJJT1NlcyAoZS5nLiBBd2FyZCBNb2R1bGFyIEJJT1MgdjQuNTBQRykgaWdub3JlIHRoZQorICoJICB2YWx1ZSBvZiBFQ1ggb24gZW50cnksIGFuZCBhbHdheXMgY29weSAyMCBieXRlcworICoJc29tZSBCSU9TZXMgZXhwZWN0IHRoZSBoaWdoIHdvcmQgb2YgRUFYIHRvIGJlIGNsZWFyIG9uIGVudHJ5LCBpLmUuCisgKgkgIEVBWD0wMDAwRTgyMGgKKyAqCWlmIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCwgYW4gYXBwbGljYXRpb24gc2hvdWxkIGZhbGwgYmFjaworICoJICB0byBBWD1FODAyaCwgQVg9RTgwMWgsIGFuZCB0aGVuIEFIPTg4aAorICoJdGhlIEJJT1MgaXMgcGVybWl0dGVkIHRvIHJldHVybiBhIG5vbnplcm8gY29udGludWF0aW9uIHZhbHVlIGluIEVCWAorICoJICBhbmQgaW5kaWNhdGUgdGhhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZCBieQorICoJICByZXR1cm5pbmcgd2l0aCBDRiBzZXQgb24gdGhlIG5leHQgaXRlcmF0aW9uCisgKgl0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGJhc2UgbWVtb3J5IGFuZCBJU0EvUENJIG1lbW9yeSBjb250aWd1b3VzCisgKgkgIHdpdGggYmFzZSBtZW1vcnkgYXMgbm9ybWFsIG1lbW9yeSByYW5nZXM7IGl0IHdpbGwgaW5kaWNhdGUKKyAqCSAgY2hpcHNldC1kZWZpbmVkIGFkZHJlc3MgaG9sZXMgd2hpY2ggYXJlIG5vdCBpbiB1c2UgYW5kIG1vdGhlcmJvYXJkCisgKgkgIG1lbW9yeS1tYXBwZWQgZGV2aWNlcywgYW5kIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3lzdGVtIEJJT1MgYXMKKyAqCSAgcmVzZXJ2ZWQ7IHN0YW5kYXJkIFBDIGFkZHJlc3MgcmFuZ2VzIHdpbGwgbm90IGJlIHJlcG9ydGVkCisgKiovCit2b2lkIGRldGVjdF9tZW1vcnlfZTgyMChzdHJ1Y3QgZTgyMGVudHJ5ICpkZXNjLCBpbnQgc2l6ZV9tYXAsIGludCAqc2l6ZV9mb3VuZCkKK3sKKyAgICBpbnQgY291bnQgPSAwOworICAgIHN0YXRpYyBzdHJ1Y3QgZTgyMF9leHRfZW50cnkgYnVmOwkvKiBzdGF0aWMgc28gaXQgaXMgemVyb2VkICovCisgICAgdm9pZCAqYm91bmNlOworCisgICAgY29tMzJzeXNfdCBpcmVnLCBvcmVnOworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworCisgICAgYm91bmNlID0gbG1hbGxvYyhzaXplb2YgYnVmKTsKKyAgICBpZiAoIWJvdW5jZSkKKwlnb3RvIG91dDsKKworICAgIGlyZWcuZWF4LndbMF0gPSAweGU4MjA7CisgICAgaXJlZy5lZHgubCA9IFNNQVA7CisgICAgaXJlZy5lY3gubCA9IHNpemVvZihzdHJ1Y3QgZTgyMF9leHRfZW50cnkpOworICAgIGlyZWcuZWRpLndbMF0gPSBPRkZTKGJvdW5jZSk7CisgICAgaXJlZy5lcyA9IFNFRyhib3VuY2UpOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhpcyBoZXJlIHNvIHRoYXQgaWYgdGhlIEJJT1MgZG9lc24ndCBjaGFuZ2UgdGhpcyBmaWVsZAorICAgICAqIGJ1dCBzdGlsbCBkb2Vzbid0IGNoYW5nZSAlZWN4LCB3ZSdyZSBzdGlsbCBva2F5Li4uCisgICAgICovCisgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZiBidWYpOworICAgIGJ1Zi5leHRfZmxhZ3MgPSAxOworCisgICAgZG8geworCW1lbWNweShib3VuY2UsICZidWYsIHNpemVvZiBidWYpOworCisJLyogSW1wb3J0YW50OiAlZWR4IGFuZCAlZXNpIGFyZSBjbG9iYmVyZWQgYnkgc29tZSBCSU9TZXMsCisJICAgc28gdGhleSBtdXN0IGJlIGVpdGhlciB1c2VkIGZvciB0aGUgZXJyb3Igb3V0cHV0CisJICAgb3IgZXhwbGljaXRseSBtYXJrZWQgY2xvYmJlcmVkLiAgR2l2ZW4gdGhhdCwgYXNzdW1lIHRoZXJlCisJICAgaXMgc29tZXRoaW5nIG91dCB0aGVyZSBjbG9iYmVyaW5nICVlYnAgYW5kICVlZGksIHRvby4gKi8KKwlfX2ludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKKworCS8qIFNvbWUgQklPU2VzIHN0b3AgcmV0dXJuaW5nIFNNQVAgaW4gdGhlIG1pZGRsZSBvZgorCSAgIHRoZSBzZWFyY2ggbG9vcC4gIFdlIGRvbid0IGtub3cgZXhhY3RseSBob3cgdGhlIEJJT1MKKwkgICBzY3Jld2VkIHVwIHRoZSBtYXAgYXQgdGhhdCBwb2ludCwgd2UgbWlnaHQgaGF2ZSBhCisJICAgcGFydGlhbCBtYXAsIHRoZSBmdWxsIG1hcCwgb3IgY29tcGxldGUgZ2FyYmFnZSwgc28KKwkgICBqdXN0IHJldHVybiBmYWlsdXJlLiAqLworCWlmIChvcmVnLmVheC5sICE9IFNNQVApIHsKKwkgICAgY291bnQgPSAwOworCSAgICBicmVhazsKKwl9CisKKwlpZiAob3JlZy5lZmxhZ3MubCAmIEVGTEFHU19DRiB8fCBvcmVnLmVjeC5sIDwgMjApCisJICAgIGJyZWFrOworCisJbWVtY3B5KCZidWYsIGJvdW5jZSwgc2l6ZW9mIGJ1Zik7CisKKwkvKgorCSAqIEFDUEkgMy4wIGFkZGVkIHRoZSBleHRlbmRlZCBmbGFncyBzdXBwb3J0LiAgSWYgYml0IDAKKwkgKiBpbiB0aGUgZXh0ZW5kZWQgZmxhZ3MgaXMgemVybywgd2UncmUgc3VwcG9zZWQgdG8gc2ltcGx5CisJICogaWdub3JlIHRoZSBlbnRyeSAtLSBhIGJhY2t3YXJkcyBpbmNvbXBhdGlibGUgY2hhbmdlIQorCSAqLworCWlmIChvcmVnLmVjeC5sID4gMjAgJiYgIShidWYuZXh0X2ZsYWdzICYgMSkpCisJICAgIGNvbnRpbnVlOworCisJbWVtY3B5KCZkZXNjW2NvdW50XSwgJmJ1Ziwgc2l6ZW9mIGJ1Zik7CisJY291bnQrKzsKKworCS8qIFNldCBjb250aW51YXRpb24gdmFsdWUgKi8KKwlpcmVnLmVieC5sID0gb3JlZy5lYngubDsKKyAgICB9IHdoaWxlIChpcmVnLmVieC5sICYmIGNvdW50IDwgc2l6ZV9tYXApOworCitvdXQ6CisgICAgbGZyZWUoYm91bmNlKTsKKyAgICAqc2l6ZV9mb3VuZCA9IGNvdW50OworfQorCisvKioKKyAqIGRldGVjdF9tZW1vcnlfZTgwMQorICoKKyAqSU5UIDE1IC0gUGhvZW5peCBCSU9TIHY0LjAgLSBHRVQgTUVNT1JZIFNJWkUgRk9SID42NE0gQ09ORklHVVJBVElPTlMKKyAqCUFYID0gRTgwMWgKKyAqCisgKiBSZXR1cm46IENGIGNsZWFyIGlmIHN1Y2Nlc3NmdWwKKyAqCSAgICBBWCA9IGV4dGVuZGVkIG1lbW9yeSBiZXR3ZWVuIDFNIGFuZCAxNk0sIGluIEsgKG1heCAzQzAwaCA9IDE1TUIpCisgKgkgICAgQlggPSBleHRlbmRlZCBtZW1vcnkgYWJvdmUgMTZNLCBpbiA2NEsgYmxvY2tzCisgKgkgICAgQ1ggPSBjb25maWd1cmVkIG1lbW9yeSAxTSB0byAxNk0sIGluIEsKKyAqCSAgICBEWCA9IGNvbmZpZ3VyZWQgbWVtb3J5IGFib3ZlIDE2TSwgaW4gNjRLIGJsb2NrcworICoJQ0Ygc2V0IG9uIGVycm9yCisgKgorICogTm90ZXM6IHN1cHBvcnRlZCBieSB0aGUgQTAzIGxldmVsICg2LzE0Lzk0KSBhbmQgbGF0ZXIgWFBTIFA5MCBCSU9TZXMsIGFzIHdlbGwKKyAqCWFzIHRoZSBDb21wYXEgQ29udHVyYSwgMy84LzkzIERFU0tQUk8vaSwgYW5kIDcvMjYvOTMgTFRFIExpdGUgMzg2IFJPTQorICoJQklPUworICoJc3VwcG9ydGVkIGJ5IEFNSSBCSU9TZXMgZGF0ZWQgOC8yMy85NCBvciBsYXRlcgorICoJb24gc29tZSBzeXN0ZW1zLCB0aGUgQklPUyByZXR1cm5zIEFYPUJYPTAwMDBoOyBpbiB0aGlzIGNhc2UsIHVzZSBDWAorICoJICBhbmQgRFggaW5zdGVhZCBvZiBBWCBhbmQgQlgKKyAqCXRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgV2luZG93cyBOVCAzLjEsIE9TLzIgdjIuMTEvMi4yMCwgYW5kIGlzCisgKgkgIHVzZWQgYXMgYSBmYWxsLWJhY2sgYnkgbmV3ZXIgdmVyc2lvbnMgaWYgQVg9RTgyMGggaXMgbm90IHN1cHBvcnRlZAorICoJdGhpcyBmdW5jdGlvbiBpcyBub3QgdXNlZCBieSBNUy1ET1MgNi4wIEhJTUVNLlNZUyB3aGVuIGFuIEVJU0EgbWFjaGluZQorICoJICAoZm9yIGV4YW1wbGUgd2l0aCBwYXJhbWV0ZXIgL0VJU0EpIChzZWUgYWxzbyBNRU0gRjAwMGg6RkZEOWgpLCBvciBubworICoJICBDb21wYXEgbWFjaGluZSB3YXMgZGV0ZWN0ZWQsIG9yIHBhcmFtZXRlciAvTk9BQk9WRTE2IHdhcyBnaXZlbi4KKyAqKi8KK2ludCBkZXRlY3RfbWVtb3J5X2U4MDEoaW50ICptZW1fc2l6ZV9iZWxvd18xNiwgaW50ICptZW1fc2l6ZV9hYm92ZV8xNikKK3sKKyAgICBjb20zMnN5c190IGlyZWcsIG9yZWc7CisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisKKyAgICBpcmVnLmVheC53WzBdID0gMHhlODAxOworCisgICAgX19pbnRjYWxsKDB4MTUsICZpcmVnLCAmb3JlZyk7CisKKyAgICBpZiAob3JlZy5lZmxhZ3MubCAmIEVGTEFHU19DRikKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAob3JlZy5lYXgud1swXSA+IDB4M2MwMCkKKwlyZXR1cm4gLTE7CQkvKiBCb2d1cyEgKi8KKworICAgIC8qIExpbnV4IHNlZW1zIHRvIHVzZSBlY3ggYW5kIGVkeCBieSBkZWZhdWx0IGlmIHRoZXkgYXJlIGRlZmluZWQgKi8KKyAgICBpZiAob3JlZy5lYXgud1swXSB8fCBvcmVnLmVheC53WzBdKSB7CisJb3JlZy5lYXgud1swXSA9IG9yZWcuZWN4LndbMF07CisJb3JlZy5lYngud1swXSA9IG9yZWcuZWR4LndbMF07CisgICAgfQorCisgICAgKm1lbV9zaXplX2JlbG93XzE2ID0gb3JlZy5lYXgud1swXTsJLyogMUsgYmxvY2tzICovCisgICAgKm1lbV9zaXplX2Fib3ZlXzE2ID0gb3JlZy5lYngud1swXTsJLyogNjRLIGJsb2NrcyAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkZXRlY3RfbWVtb3J5Xzg4KGludCAqbWVtX3NpemUpCit7CisgICAgY29tMzJzeXNfdCBpcmVnLCBvcmVnOworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworCisgICAgaXJlZy5lYXgud1swXSA9IDB4ODgwMDsKKworICAgIF9faW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworCisgICAgaWYgKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpCisJcmV0dXJuIC0xOworCisgICAgKm1lbV9zaXplID0gb3JlZy5lYXgud1swXTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFNhbml0aXplIHRoZSBCSU9TIGU4MjAgbWFwLgorICoKKyAqIFRoaXMgY29kZSBjb21lIGZyb20gdGhlIG1lbXRlc3Q4NiBwcm9qZWN0LiBJdCBoYXZlIGJlZW4gYWRqdXN0ZWQgdG8gbWF0Y2gKKyAqIHRoZSBzeXNsaW51eCBlbnZpcm9uZW1lbnQuCisgKiBTb21lIGU4MjAgcmVzcG9uc2VzIGluY2x1ZGUgb3ZlcmxhcHBpbmcgZW50cmllcy4gIFRoZSBmb2xsb3dpbmcgCisgKiByZXBsYWNlcyB0aGUgb3JpZ2luYWwgZTgyMCBtYXAgd2l0aCBhIG5ldyBvbmUsIHJlbW92aW5nIG92ZXJsYXBzLgorICogCisgKiBUaGUgZm9sbG93aW5nIHN0dWZmIGNvdWxkIGJlIG1lcmdlIG9uY2UgdGhlIGFkZHJfdCB3aWxsIGJlIHNldCB0byA2NGJpdHMuCisgKiBzeXNsaW51eF9zY2FuX21lbW9yeSBjYW4gYmUgdXNlZCBmb3IgdGhhdCBwdXJwb3NlIAorICovCitpbnQgc2FuaXRpemVfZTgyMF9tYXAoc3RydWN0IGU4MjBlbnRyeSAqb3JpZ19tYXAsIHN0cnVjdCBlODIwZW50cnkgKm5ld19iaW9zLAorCQkgICAgICBzaG9ydCBvbGRfbnIpCit7CisgICAgc3RydWN0IGNoYW5nZV9tZW1iZXIgeworCXN0cnVjdCBlODIwZW50cnkgKnBiaW9zOwkvKiBwb2ludGVyIHRvIG9yaWdpbmFsIGJpb3MgZW50cnkgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsJLyogYWRkcmVzcyBmb3IgdGhpcyBjaGFuZ2UgcG9pbnQgKi8KKyAgICB9OworICAgIHN0cnVjdCBjaGFuZ2VfbWVtYmVyIGNoYW5nZV9wb2ludF9saXN0WzIgKiBFODIwTUFYXTsKKyAgICBzdHJ1Y3QgY2hhbmdlX21lbWJlciAqY2hhbmdlX3BvaW50WzIgKiBFODIwTUFYXTsKKyAgICBzdHJ1Y3QgZTgyMGVudHJ5ICpvdmVybGFwX2xpc3RbRTgyME1BWF07CisgICAgc3RydWN0IGU4MjBlbnRyeSBiaW9zbWFwW0U4MjBNQVhdOworICAgIHN0cnVjdCBjaGFuZ2VfbWVtYmVyICpjaGFuZ2VfdG1wOworICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90eXBlLCBsYXN0X3R5cGU7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGxhc3RfYWRkcjsKKyAgICBpbnQgY2hnaWR4LCBzdGlsbF9jaGFuZ2luZzsKKyAgICBpbnQgb3ZlcmxhcF9lbnRyaWVzOworICAgIGludCBuZXdfYmlvc19lbnRyeTsKKyAgICBpbnQgaTsKKworICAgIC8qCisgICAgICAgVmlzdWFsbHkgd2UncmUgcGVyZm9ybWluZyB0aGUgZm9sbG93aW5nICgxLDIsMyw0ID0gbWVtb3J5IHR5cGVzKS4uLgorICAgICAgIFNhbXBsZSBtZW1vcnkgbWFwICh3L292ZXJsYXBzKToKKyAgICAgICBfX19fMjJfX19fX19fX19fX19fX19fX18KKyAgICAgICBfX19fX19fX19fX19fX19fX19fX19fNF8KKyAgICAgICBfX19fMTExMV9fX19fX19fX19fX19fX18KKyAgICAgICBfNDRfX19fX19fX19fX19fX19fX19fX18KKyAgICAgICAxMTExMTExMV9fX19fX19fX19fX19fX18KKyAgICAgICBfX19fX19fX19fX19fX19fX19fXzMzX18KKyAgICAgICBfX19fX19fX19fXzQ0X19fX19fX19fX18KKyAgICAgICBfX19fX19fX19fMzMzMzNfX19fX19fX18KKyAgICAgICBfX19fX19fX19fX19fXzIyX19fX19fX18KKyAgICAgICBfX19fX19fX19fX19fX19fX19fMjIyMl8KKyAgICAgICBfX19fX19fX18xMTExMTExMTFfX19fX18KKyAgICAgICBfX19fX19fX19fX19fX19fX19fX18xMV8KKyAgICAgICBfX19fX19fX19fX19fX19fXzRfX19fX18KKworICAgICAgIFNhbml0aXplZCBlcXVpdmFsZW50IChubyBvdmVybGFwKToKKyAgICAgICAxX19fX19fX19fX19fX19fX19fX19fX18KKyAgICAgICBfNDRfX19fX19fX19fX19fX19fX19fX18KKyAgICAgICBfX18xX19fX19fX19fX19fX19fX19fX18KKyAgICAgICBfX19fMjJfX19fX19fX19fX19fX19fX18KKyAgICAgICBfX19fX18xMV9fX19fX19fX19fX19fX18KKyAgICAgICBfX19fX19fX18xX19fX19fX19fX19fX18KKyAgICAgICBfX19fX19fX19fM19fX19fX19fX19fX18KKyAgICAgICBfX19fX19fX19fXzQ0X19fX19fX19fX18KKyAgICAgICBfX19fX19fX19fX19fMzNfX19fX19fX18KKyAgICAgICBfX19fX19fX19fX19fX18yX19fX19fX18KKyAgICAgICBfX19fX19fX19fX19fX19fMV9fX19fX18KKyAgICAgICBfX19fX19fX19fX19fX19fXzRfX19fX18KKyAgICAgICBfX19fX19fX19fX19fX19fX19fMl9fX18KKyAgICAgICBfX19fX19fX19fX19fX19fX19fXzMzX18KKyAgICAgICBfX19fX19fX19fX19fX19fX19fX19fNF8KKyAgICAgKi8KKyAgICAvKiBGaXJzdCBtYWtlIGEgY29weSBvZiB0aGUgbWFwICovCisgICAgZm9yIChpID0gMDsgaSA8IG9sZF9ucjsgaSsrKSB7CisJYmlvc21hcFtpXS5hZGRyID0gb3JpZ19tYXBbaV0uYWRkcjsKKwliaW9zbWFwW2ldLnNpemUgPSBvcmlnX21hcFtpXS5zaXplOworCWJpb3NtYXBbaV0udHlwZSA9IG9yaWdfbWFwW2ldLnR5cGU7CisgICAgfQorCisgICAgLyogYmFpbCBvdXQgaWYgd2UgZmluZCBhbnkgdW5yZWFzb25hYmxlIGFkZHJlc3NlcyBpbiBiaW9zIG1hcCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBvbGRfbnI7IGkrKykgeworCWlmIChiaW9zbWFwW2ldLmFkZHIgKyBiaW9zbWFwW2ldLnNpemUgPCBiaW9zbWFwW2ldLmFkZHIpCisJICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBwb2ludGVycyBmb3IgaW5pdGlhbCBjaGFuZ2UtcG9pbnQgaW5mb3JtYXRpb24gKGZvciBzb3J0aW5nKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyICogb2xkX25yOyBpKyspCisJY2hhbmdlX3BvaW50W2ldID0gJmNoYW5nZV9wb2ludF9saXN0W2ldOworCisgICAgLyogcmVjb3JkIGFsbCBrbm93biBjaGFuZ2UtcG9pbnRzIChzdGFydGluZyBhbmQgZW5kaW5nIGFkZHJlc3NlcykgKi8KKyAgICBjaGdpZHggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBvbGRfbnI7IGkrKykgeworCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyID0gYmlvc21hcFtpXS5hZGRyOworCWNoYW5nZV9wb2ludFtjaGdpZHgrK10tPnBiaW9zID0gJmJpb3NtYXBbaV07CisJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPSBiaW9zbWFwW2ldLmFkZHIgKyBiaW9zbWFwW2ldLnNpemU7CisJY2hhbmdlX3BvaW50W2NoZ2lkeCsrXS0+cGJpb3MgPSAmYmlvc21hcFtpXTsKKyAgICB9CisKKyAgICAvKiBzb3J0IGNoYW5nZS1wb2ludCBsaXN0IGJ5IG1lbW9yeSBhZGRyZXNzZXMgKGxvdyAtPiBoaWdoKSAqLworICAgIHN0aWxsX2NoYW5naW5nID0gMTsKKyAgICB3aGlsZSAoc3RpbGxfY2hhbmdpbmcpIHsKKwlzdGlsbF9jaGFuZ2luZyA9IDA7CisJZm9yIChpID0gMTsgaSA8IDIgKiBvbGRfbnI7IGkrKykgeworCSAgICAvKiBpZiA8Y3VycmVudF9hZGRyPiA+IDxsYXN0X2FkZHI+LCBzd2FwICovCisJICAgIC8qIG9yLCBpZiBjdXJyZW50PTxzdGFydF9hZGRyPiAmIGxhc3Q9PGVuZF9hZGRyPiwgc3dhcCAqLworCSAgICBpZiAoKGNoYW5nZV9wb2ludFtpXS0+YWRkciA8IGNoYW5nZV9wb2ludFtpIC0gMV0tPmFkZHIpIHx8CisJCSgoY2hhbmdlX3BvaW50W2ldLT5hZGRyID09IGNoYW5nZV9wb2ludFtpIC0gMV0tPmFkZHIpICYmCisJCSAoY2hhbmdlX3BvaW50W2ldLT5hZGRyID09IGNoYW5nZV9wb2ludFtpXS0+cGJpb3MtPmFkZHIpICYmCisJCSAoY2hhbmdlX3BvaW50W2kgLSAxXS0+YWRkciAhPQorCQkgIGNoYW5nZV9wb2ludFtpIC0gMV0tPnBiaW9zLT5hZGRyKSkKKwkJKSB7CisJCWNoYW5nZV90bXAgPSBjaGFuZ2VfcG9pbnRbaV07CisJCWNoYW5nZV9wb2ludFtpXSA9IGNoYW5nZV9wb2ludFtpIC0gMV07CisJCWNoYW5nZV9wb2ludFtpIC0gMV0gPSBjaGFuZ2VfdG1wOworCQlzdGlsbF9jaGFuZ2luZyA9IDE7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyogY3JlYXRlIGEgbmV3IGJpb3MgbWVtb3J5IG1hcCwgcmVtb3Zpbmcgb3ZlcmxhcHMgKi8KKyAgICBvdmVybGFwX2VudHJpZXMgPSAwOwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgb3ZlcmxhcCB0YWJsZSAqLworICAgIG5ld19iaW9zX2VudHJ5ID0gMDsJCS8qIGluZGV4IGZvciBjcmVhdGluZyBuZXcgYmlvcyBtYXAgZW50cmllcyAqLworICAgIGxhc3RfdHlwZSA9IDA7CQkvKiBzdGFydCB3aXRoIHVuZGVmaW5lZCBtZW1vcnkgdHlwZSAqLworICAgIGxhc3RfYWRkciA9IDA7CQkvKiBzdGFydCB3aXRoIDAgYXMgbGFzdCBzdGFydGluZyBhZGRyZXNzICovCisgICAgLyogbG9vcCB0aHJvdWdoIGNoYW5nZS1wb2ludHMsIGRldGVybWluaW5nIGFmZmVjdCBvbiB0aGUgbmV3IGJpb3MgbWFwICovCisgICAgZm9yIChjaGdpZHggPSAwOyBjaGdpZHggPCAyICogb2xkX25yOyBjaGdpZHgrKykgeworCS8qIGtlZXAgdHJhY2sgb2YgYWxsIG92ZXJsYXBwaW5nIGJpb3MgZW50cmllcyAqLworCWlmIChjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkciA9PSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+cGJpb3MtPmFkZHIpIHsKKwkgICAgLyogYWRkIG1hcCBlbnRyeSB0byBvdmVybGFwIGxpc3QgKD4gMSBlbnRyeSBpbXBsaWVzIGFuIG92ZXJsYXApICovCisJICAgIG92ZXJsYXBfbGlzdFtvdmVybGFwX2VudHJpZXMrK10gPSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+cGJpb3M7CisJfSBlbHNlIHsKKwkgICAgLyogcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCAob3JkZXIgaW5kZXBlbmRlbnQsIHNvIHN3YXAgd2l0aCBsYXN0KSAqLworCSAgICBmb3IgKGkgPSAwOyBpIDwgb3ZlcmxhcF9lbnRyaWVzOyBpKyspIHsKKwkJaWYgKG92ZXJsYXBfbGlzdFtpXSA9PSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+cGJpb3MpCisJCSAgICBvdmVybGFwX2xpc3RbaV0gPSBvdmVybGFwX2xpc3Rbb3ZlcmxhcF9lbnRyaWVzIC0gMV07CisJICAgIH0KKwkgICAgb3ZlcmxhcF9lbnRyaWVzLS07CisJfQorCS8qIGlmIHRoZXJlIGFyZSBvdmVybGFwcGluZyBlbnRyaWVzLCBkZWNpZGUgd2hpY2ggInR5cGUiIHRvIHVzZSAqLworCS8qIChsYXJnZXIgdmFsdWUgdGFrZXMgcHJlY2VkZW5jZSAtLSAxPXVzYWJsZSwgMiwzLDQsNCs9dW51c2FibGUpICovCisJY3VycmVudF90eXBlID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgb3ZlcmxhcF9lbnRyaWVzOyBpKyspCisJICAgIGlmIChvdmVybGFwX2xpc3RbaV0tPnR5cGUgPiBjdXJyZW50X3R5cGUpCisJCWN1cnJlbnRfdHlwZSA9IG92ZXJsYXBfbGlzdFtpXS0+dHlwZTsKKwkvKiBjb250aW51ZSBidWlsZGluZyB1cCBuZXcgYmlvcyBtYXAgYmFzZWQgb24gdGhpcyBpbmZvcm1hdGlvbiAqLworCWlmIChjdXJyZW50X3R5cGUgIT0gbGFzdF90eXBlKSB7CisJICAgIGlmIChsYXN0X3R5cGUgIT0gMCkgeworCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0uc2l6ZSA9CisJCSAgICBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkciAtIGxhc3RfYWRkcjsKKwkJLyogbW92ZSBmb3J3YXJkIG9ubHkgaWYgdGhlIG5ldyBzaXplIHdhcyBub24temVybyAqLworCQlpZiAobmV3X2Jpb3NbbmV3X2Jpb3NfZW50cnldLnNpemUgIT0gMCkKKwkJICAgIGlmICgrK25ld19iaW9zX2VudHJ5ID49IEU4MjBNQVgpCisJCQlicmVhazsJLyogbm8gbW9yZSBzcGFjZSBsZWZ0IGZvciBuZXcgYmlvcyBlbnRyaWVzICovCisJICAgIH0KKwkgICAgaWYgKGN1cnJlbnRfdHlwZSAhPSAwKSB7CisJCW5ld19iaW9zW25ld19iaW9zX2VudHJ5XS5hZGRyID0gY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHI7CisJCW5ld19iaW9zW25ld19iaW9zX2VudHJ5XS50eXBlID0gY3VycmVudF90eXBlOworCQlsYXN0X2FkZHIgPSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKKwkgICAgfQorCSAgICBsYXN0X3R5cGUgPSBjdXJyZW50X3R5cGU7CisJfQorICAgIH0KKyAgICByZXR1cm4gKG5ld19iaW9zX2VudHJ5KTsKK30KKworLyogVGhlIGZvbGxvd2luZyBzdHVmZiBjb3VsZCBiZSBtZXJnZSBvbmNlIHRoZSBhZGRyX3Qgd2lsbCBiZSBzZXQgdG8gNjRiaXRzLgorICogc3lzbGludXhfc2Nhbl9tZW1vcnkgY2FuIGJlIHVzZWQgZm9yIHRoYXQgcHVycG9zZSAqLwordW5zaWduZWQgbG9uZyBkZXRlY3RfbWVtc2l6ZSh2b2lkKQoreworICAgIHVuc2lnbmVkIGxvbmcgbWVtb3J5X3NpemUgPSAwOworCisgICAgLyogVHJ5IHRvIGRldGVjdCBtZW1vcnkgdmlhIGU4MjAgKi8KKyAgICBzdHJ1Y3QgZTgyMGVudHJ5IG1hcFtFODIwTUFYXTsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGRldGVjdF9tZW1vcnlfZTgyMChtYXAsIEU4MjBNQVgsICZjb3VudCk7CisgICAgbWVtb3J5X3NpemUgPSBtZW1zaXplX2U4MjAobWFwLCBjb3VudCk7CisgICAgaWYgKG1lbW9yeV9zaXplID4gMCkKKwlyZXR1cm4gbWVtb3J5X3NpemU7CisKKyAgICAvKmU4MjAgZmFpbGVkLCBsZXQncyB0cnkgZTgwMSAqLworICAgIGludCBtZW1fbG93LCBtZW1faGlnaCA9IDA7CisgICAgaWYgKCFkZXRlY3RfbWVtb3J5X2U4MDEoJm1lbV9sb3csICZtZW1faGlnaCkpCisJcmV0dXJuIG1lbV9sb3cgKyAobWVtX2hpZ2ggPDwgNik7CisKKyAgICAvKmU4MDEgZmFpbGVkLCBsZXQncyB0cnkgZTg4ICovCisgICAgaW50IG1lbV9zaXplID0gMDsKKyAgICBpZiAoIWRldGVjdF9tZW1vcnlfODgoJm1lbV9zaXplKSkKKwlyZXR1cm4gbWVtX3NpemU7CisKKyAgICAvKiBXZSB3ZXJlIGVuYWJsZSB0byBkZXRlY3QgYW55IGtpbmQgb2YgbWVtb3J5ICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgc3R1ZmYgY291bGQgYmUgbWVyZ2Ugb25jZSB0aGUgYWRkcl90IHdpbGwgYmUgc2V0IHRvIDY0Yml0cy4KKyAqIHN5c2xpbnV4X3NjYW5fbWVtb3J5IGNhbiBiZSB1c2VkIGZvciB0aGF0IHB1cnBvc2UgKi8KK3Vuc2lnbmVkIGxvbmcgbWVtc2l6ZV9lODIwKHN0cnVjdCBlODIwZW50cnkgKmU4MjAsIGludCBlODIwX25yKQoreworICAgIGludCBpLCBuLCBucjsKKyAgICB1bnNpZ25lZCBsb25nIG1lbW9yeV9zaXplID0gMDsKKyAgICBzdHJ1Y3QgZTgyMGVudHJ5IG5tW0U4MjBNQVhdOworCisgICAgLyogQ2xlYW4gdXAsIGFkanVzdCBhbmQgY29weSB0aGUgQklPUy1zdXBwbGllZCBFODIwLW1hcC4gKi8KKyAgICBuciA9IHNhbml0aXplX2U4MjBfbWFwKGU4MjAsIG5tLCBlODIwX25yKTsKKworICAgIC8qIElmIHRoZXJlIGlzIG5vdCBhIGdvb2QgODIwIG1hcCByZXR1cm5pbmcgMCB0byBpbmRpY2F0ZSAKKyAgICAgICB0aGF0IHdlIGRvbid0IGhhdmUgYW55IGlkZWEgb2YgdGhlIGFtb3VudCBvZiByYW0gd2UgaGF2ZSAqLworICAgIGlmIChuciA8IDEgfHwgbnIgPiBFODIwTUFYKSB7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQnVpbGQgdGhlIG1lbW9yeSBtYXAgZm9yIHRlc3RpbmcgKi8KKyAgICBuID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCWlmIChubVtpXS50eXBlID09IEU4MjBfUkFNIHx8IG5tW2ldLnR5cGUgPT0gRTgyMF9BQ1BJKSB7CisJICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydDsKKwkgICAgdW5zaWduZWQgbG9uZyBsb25nIGVuZDsKKwkgICAgc3RhcnQgPSBubVtpXS5hZGRyOworCSAgICBlbmQgPSBzdGFydCArIG5tW2ldLnNpemU7CisKKwkgICAgLyogRG9uJ3QgZXZlciB1c2UgbWVtb3J5IGJldHdlZW4gNjQwIGFuZCAxMDI0ayAqLworCSAgICBpZiAoc3RhcnQgPiBSRVNfU1RBUlQgJiYgc3RhcnQgPCBSRVNfRU5EKSB7CisJCWlmIChlbmQgPCBSRVNfRU5EKSB7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlzdGFydCA9IFJFU19FTkQ7CisJICAgIH0KKwkgICAgaWYgKGVuZCA+IFJFU19TVEFSVCAmJiBlbmQgPCBSRVNfRU5EKSB7CisJCWVuZCA9IFJFU19TVEFSVDsKKwkgICAgfQorCSAgICBtZW1vcnlfc2l6ZSArPSAoZW5kID4+IDEyKSAtICgoc3RhcnQgKyA0MDk1KSA+PiAxMik7CisJICAgIG4rKzsKKwl9IGVsc2UgaWYgKG5tW2ldLnR5cGUgPT0gRTgyMF9OVlMpIHsKKwkgICAgbWVtb3J5X3NpemUgKz0gbm1baV0uc2l6ZSA+PiAxMjsKKwl9CisgICAgfQorICAgIHJldHVybiBtZW1vcnlfc2l6ZSAqIDQ7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvdnBkL3ZwZC5jIGIvY29tMzIvZ3BsbGliL3ZwZC92cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTJiMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL3ZwZC92cGQuYwpAQCAtMCwwICsxLDEwMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInZwZC92cGQuaCIKKworaW50IHZwZF9jaGVja3N1bShjaGFyICpidWYsIGludCBsZW4pCit7CisgICAgdWludDhfdCBzdW0gPSAwOworICAgIGludCBhOworCisgICAgZm9yIChhID0gMDsgYSA8IGxlbjsgYSsrKQorCXN1bSArPSBidWZbYV07CisgICAgcmV0dXJuIChzdW0gPT0gMCk7Cit9CisKK2ludCB2cGRfZGVjb2RlKHNfdnBkICogdnBkKQoreworICAgIHVpbnQ4X3QgYnVmWzE2XTsKKyAgICBjaGFyICpwLCAqcTsKKworICAgIC8qIENsZWFuaW5nIHN0cnVjdHVyZXMgKi8KKyAgICBtZW1zZXQoJnZwZC0+YmFzZV9hZGRyZXNzLCAwLCBzaXplb2YodnBkLT5iYXNlX2FkZHJlc3MpKTsKKyAgICBtZW1zZXQoJnZwZC0+Ymlvc19idWlsZF9pZCwgMCwgc2l6ZW9mKHZwZC0+Ymlvc19idWlsZF9pZCkpOworICAgIG1lbXNldCgmdnBkLT5ib3hfc2VyaWFsX251bWJlciwgMCwgc2l6ZW9mKHZwZC0+Ym94X3NlcmlhbF9udW1iZXIpKTsKKyAgICBtZW1zZXQoJnZwZC0+bW90aGVyYm9hcmRfc2VyaWFsX251bWJlciwgMCwKKwkgICBzaXplb2YodnBkLT5tb3RoZXJib2FyZF9zZXJpYWxfbnVtYmVyKSk7CisgICAgbWVtc2V0KCZ2cGQtPm1hY2hpbmVfdHlwZV9tb2RlbCwgMCwgc2l6ZW9mKHZwZC0+bWFjaGluZV90eXBlX21vZGVsKSk7CisgICAgbWVtc2V0KCZ2cGQtPmJpb3NfcmVsZWFzZV9kYXRlLCAwLCBzaXplb2YodnBkLT5iaW9zX3JlbGVhc2VfZGF0ZSkpOworICAgIG1lbXNldCgmdnBkLT5kZWZhdWx0X2ZsYXNoX2ZpbGVuYW1lLCAwLAorCSAgIHNpemVvZih2cGQtPmRlZmF1bHRfZmxhc2hfZmlsZW5hbWUpKTsKKyAgICBtZW1zZXQoJnZwZC0+Ymlvc192ZXJzaW9uLCAwLCBzaXplb2YodnBkLT5iaW9zX3ZlcnNpb24pKTsKKworICAgIC8qIFVudGlsIHdlIGZvdW5kIGVsZW1lbnRzIGluIHRoZSB2cGR0YWJsZSwgd2UgY29uc2lkZXIgdGhlbSBhcyBub3QgZmlsbGVkICovCisgICAgdnBkLT5maWxsZWQgPSBmYWxzZTsKKworICAgIHAgPSAoY2hhciAqKTB4RjAwMDA7CS8qIFRoZSBzdGFydCBhZGRyZXNzIHRvIGxvb2sgYXQgdGhlIGRtaSB0YWJsZSAqLworICAgIGZvciAocSA9IHA7IHEgPCBwICsgMHgxMDAwMDsgcSArPSA0KSB7CisJbWVtY3B5KGJ1ZiwgcSwgNSk7CisJaWYgKG1lbWNtcChidWYsICJcMjUyXDEyNVZQRCIsIDUpID09IDApIHsKKwkgICAgc25wcmludGYodnBkLT5iYXNlX2FkZHJlc3MsIHNpemVvZih2cGQtPmJhc2VfYWRkcmVzcyksICIlcCIsIHEpOworCSAgICBpZiAocVs1XSA8IDB4MzApCisJCXJldHVybiAtRU5PVlBEVEFCTEU7CisKKwkgICAgdnBkLT5maWxsZWQgPSB0cnVlOworCSAgICAvKiBYU2VyaWVzIGhhdmUgbG9uZ2VyIHJlY29yZHMsIGV4YWN0IGxlbmd0aCBzZWVtcyB0byB2YXJ5LiAqLworCSAgICBpZiAoIShxWzVdID49IDB4NDUgJiYgdnBkX2NoZWNrc3VtKHEsIHFbNV0pKQorCQkvKiBTb21lIE5ldHZpc3RhIHNlZW0gdG8gd29yayB3aXRoIHRoaXMuICovCisJCSYmICEodnBkX2NoZWNrc3VtKHEsIDB4MzApKQorCQkvKiBUaGUgVGhpbmtwYWQvVGhpbmtjZW50cmUgY2hlY2tzdW0gZG9lcyAqbm90KiBpbmNsdWRlIHRoZSBmaXJzdCAxMyBieXRlcy4gKi8KKwkJJiYgISh2cGRfY2hlY2tzdW0ocSArIDB4MEQsIDB4MzAgLSAweDBEKSkpIHsKKwkJLyogQSBmZXcgc3lzdGVtcyBoYXZlIGEgYmFkIGNoZWNrc3VtICh4U2VyaWVzIDMyNSwgMzMwLCAzMzUKKwkJICAgYW5kIDM0NSB3aXRoIGVhcmx5IEJJT1MpIGJ1dCB0aGUgcmVjb3JkIGlzIG90aGVyd2lzZQorCQkgICB2YWxpZC4gKi8KKwkJcHJpbnRmKCJWUEQ6IEJhZCBjaGVja3N1bSFcbiIpOworCSAgICB9CisKKwkgICAgc3RybGNweSh2cGQtPmJpb3NfYnVpbGRfaWQsIHEgKyAweDBELCA5KTsKKwkgICAgc3RybGNweSh2cGQtPmJveF9zZXJpYWxfbnVtYmVyLCBxICsgMHgxNiwgNyk7CisJICAgIHN0cmxjcHkodnBkLT5tb3RoZXJib2FyZF9zZXJpYWxfbnVtYmVyLCBxICsgMHgxRCwgMTEpOworCSAgICBzdHJsY3B5KHZwZC0+bWFjaGluZV90eXBlX21vZGVsLCBxICsgMHgyOCwgNyk7CisKKwkgICAgaWYgKHFbNV0gPCAweDQ0KQorCQlyZXR1cm4gVlBEX1RBQkxFX1BSRVNFTlQ7CisKKwkgICAgc3RybGNweSh2cGQtPmJpb3NfcmVsZWFzZV9kYXRlLCBxICsgMHgzMCwgOCk7CisJICAgIHN0cmxjcHkodnBkLT5kZWZhdWx0X2ZsYXNoX2ZpbGVuYW1lLCBxICsgMHgzOCwgMTIpOworCisJICAgIGlmIChxWzVdID49IDB4NDYgJiYgcVsweDQ0XSAhPSAweDAwKSB7CisJCXN0cmxjcHkodnBkLT5iaW9zX3ZlcnNpb24sIHEgKyAweDQ0LCAyNTUpOworCSAgICB9CisKKwkgICAgcmV0dXJuIFZQRF9UQUJMRV9QUkVTRU5UOworCX0KKyAgICB9CisgICAgcmV0dXJuIC1FTk9WUERUQUJMRTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi96empzb24venpqc29uX2NyZWF0ZS5jIGIvY29tMzIvZ3BsbGliL3p6anNvbi96empzb25fY3JlYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2YmQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi96empzb24venpqc29uX2NyZWF0ZS5jCkBAIC0wLDAgKzEsMjQwIEBACisvKiBKU09OIENyZWF0ZSBaWkpTT04gc3RydWN0dXJlcworICogWlpKU09OIC0gQ29weXJpZ2h0IChDKSAyMDA4IGJ5IEl2byB2YW4gUG9vcnRlbgorICogTGljZW5zZTogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xCisgKi8KKworI2luY2x1ZGUgInp6anNvbi5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWZkZWYgQ09ORklHX05PX0VSUk9SX01FU1NBR0VTCisjZGVmaW5lIEVSUk9SKHguLi4pCisjZWxzZQorI2RlZmluZSBFUlJPUih4Li4uKSAgICAgY29uZmlnLT5lcnJvcihjb25maWctPmVoYW5kbGUsICMjeCkKKyNlbmRpZgorI2RlZmluZSBNRU1FUlJPUigpICAgICAgRVJST1IoIm91dCBvZiBtZW1vcnkiKQorCitzdGF0aWMgWlpKU09OICp6empzb25fY3JlYXRlX3RlbXBsKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OX1RZUEUgdHlwZSkgeworICAgIFpaSlNPTiAqenpqc29uID0gY29uZmlnLT5jYWxsb2MoMSwgc2l6ZW9mKFpaSlNPTikpOworICAgIGlmICghenpqc29uKSBNRU1FUlJPUigpOworICAgIGVsc2UgICAgICAgICB6empzb24tPnR5cGUgPSB0eXBlOworICAgIHJldHVybiB6empzb247Cit9CisKK1paSlNPTiAqenpqc29uX2NyZWF0ZV90cnVlKFpaSlNPTl9DT05GSUcgKmNvbmZpZykgeworICAgIHJldHVybiB6empzb25fY3JlYXRlX3RlbXBsKGNvbmZpZywgWlpKU09OX1RSVUUpOworfQorCitaWkpTT04gKnp6anNvbl9jcmVhdGVfZmFsc2UoWlpKU09OX0NPTkZJRyAqY29uZmlnKSB7CisgICAgcmV0dXJuIHp6anNvbl9jcmVhdGVfdGVtcGwoY29uZmlnLCBaWkpTT05fRkFMU0UpOworfQorCitaWkpTT04gKnp6anNvbl9jcmVhdGVfbnVsbChaWkpTT05fQ09ORklHICpjb25maWcpIHsKKyAgICByZXR1cm4genpqc29uX2NyZWF0ZV90ZW1wbChjb25maWcsIFpaSlNPTl9OVUxMKTsKK30KKworWlpKU09OICp6empzb25fY3JlYXRlX251bWJlcl9kKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgZG91YmxlIGQpIHsKKyAgICBaWkpTT04gKnp6anNvbiA9IHp6anNvbl9jcmVhdGVfdGVtcGwoY29uZmlnLCBaWkpTT05fTlVNQkVSX0RPVUJMRSk7CisgICAgaWYgKHp6anNvbikKKyAgICAgICAgenpqc29uLT52YWx1ZS5udW1iZXIudmFsLmR2YWwgPSBkOworICAgIHJldHVybiB6empzb247Cit9CisKK1paSlNPTiAqenpqc29uX2NyZWF0ZV9udW1iZXJfaShaWkpTT05fQ09ORklHICpjb25maWcsIGxvbmcgbG9uZyBpKSB7CisgICAgWlpKU09OICp6empzb24gPSB6empzb25fY3JlYXRlX3RlbXBsKGNvbmZpZywgWlpKU09OX05VTUJFUl9ORUdJTlQpOworICAgIGlmICh6empzb24pIHsKKyAgICAgICAgenpqc29uLT50eXBlID0gaTwwTEwgPyBaWkpTT05fTlVNQkVSX05FR0lOVCA6IFpaSlNPTl9OVU1CRVJfUE9TSU5UOworICAgICAgICB6empzb24tPnZhbHVlLm51bWJlci52YWwuaXZhbCA9IGxsYWJzKGkpOworICAgIH0KKyAgICByZXR1cm4genpqc29uOworfQorCisvKiBzZHVwIG1pbWljcyBzdHJkdXAsIGJ1dCBhdm9pZHMgaGF2aW5nIGFub3RoZXIgZnVuY3Rpb24gcG9pbnRlciBpbiBjb25maWcgKi8KK3N0YXRpYyBjaGFyICpzZHVwKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgY2hhciAqcykgeworICAgIHNpemVfdCBzbGVuID0gc3RybGVuKHMpKzE7CisgICAgY2hhciAqc2NvcHkgPSBjb25maWctPm1hbGxvYyhzbGVuKTsKKworICAgIGlmICghc2NvcHkpIE1FTUVSUk9SKCk7CisgICAgZWxzZSAgICAgICAgbWVtY3B5KHNjb3B5LCBzLCBzbGVuKTsKKyAgICByZXR1cm4gc2NvcHk7Cit9CisKK1paSlNPTiAqenpqc29uX2NyZWF0ZV9zdHJpbmcoWlpKU09OX0NPTkZJRyAqY29uZmlnLCBjaGFyICpzKSB7CisgICAgWlpKU09OICp6empzb24gPSBOVUxMOworICAgIGNoYXIgKnNjb3B5OworICAgICAgICAKKyAgICBpZiAoIShzY29weSA9IHNkdXAoY29uZmlnLHMpKSkgcmV0dXJuIHp6anNvbjsKKworICAgIGlmICgoenpqc29uID0genpqc29uX2NyZWF0ZV90ZW1wbChjb25maWcsIFpaSlNPTl9TVFJJTkcpKSkKKyAgICAgICAgenpqc29uLT52YWx1ZS5zdHJpbmcuc3RyaW5nID0gc2NvcHk7CisgICAgZWxzZQorICAgICAgICBjb25maWctPmZyZWUoc2NvcHkpOworCisgICAgcmV0dXJuIHp6anNvbjsKK30KKworWlpKU09OICp6empzb25fY3JlYXRlX2FycmF5KFpaSlNPTl9DT05GSUcgKmNvbmZpZywgLi4uKSB7CisgICAgWlpKU09OICp6empzb24sICpyZXR2YWwsICp2YWw7CisgICAgdmFfbGlzdCBhcDsKKworICAgIGlmICghKHp6anNvbiA9IHp6anNvbl9jcmVhdGVfdGVtcGwoY29uZmlnLCBaWkpTT05fQVJSQVkpKSkgcmV0dXJuIHp6anNvbjsKKyAgICByZXR2YWwgPSB6empzb247CisKKyAgICB2YV9zdGFydChhcCwgY29uZmlnKTsKKyAgICB2YWwgPSB2YV9hcmcoYXAsIFpaSlNPTiAqKTsKKyAgICB3aGlsZSAodmFsKSB7CisgICAgICAgIHp6anNvbi0+dmFsdWUuYXJyYXkudmFsID0gdmFsOworICAgICAgICB2YWwgPSB2YV9hcmcoYXAsIFpaSlNPTiAqKTsKKworICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICBaWkpTT04gKm5leHQgPSB6empzb25fY3JlYXRlX3RlbXBsKGNvbmZpZywgWlpKU09OX0FSUkFZKTsKKyAgICAgICAgICAgIGlmICghbmV4dCkgeworICAgICAgICAgICAgICAgIHdoaWxlIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJldHZhbC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mcmVlKHJldHZhbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgenpqc29uLT5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgIHp6anNvbiA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgdmFfZW5kKGFwKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitaWkpTT04gKnp6anNvbl9jcmVhdGVfb2JqZWN0KFpaSlNPTl9DT05GSUcgKmNvbmZpZywgLi4uKSB7CisgICAgWlpKU09OICp6empzb24sICpyZXR2YWwsICp2YWw7CisgICAgY2hhciAqbGFiZWwsICpsYWJlbGNvcHk7CisgICAgdmFfbGlzdCBhcDsKKworICAgIGlmICghKHp6anNvbiA9IHp6anNvbl9jcmVhdGVfdGVtcGwoY29uZmlnLCBaWkpTT05fT0JKRUNUKSkpIHJldHVybiB6empzb247CisgICAgcmV0dmFsID0genpqc29uOworCisgICAgdmFfc3RhcnQoYXAsIGNvbmZpZyk7CisgICAgbGFiZWwgPSB2YV9hcmcoYXAsIGNoYXIgKik7CisgICAgd2hpbGUgKGxhYmVsKSB7CisgICAgICAgIHZhbCA9IHZhX2FyZyhhcCwgWlpKU09OICopOworICAgICAgICBsYWJlbGNvcHkgPSBzZHVwKGNvbmZpZywgbGFiZWwpOworCisgICAgICAgIGlmICghbGFiZWxjb3B5KSB7CisgICAgICAgICAgICB6empzb25fZnJlZShjb25maWcsIHJldHZhbCk7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB6empzb24tPnZhbHVlLm9iamVjdC5sYWJlbCAgPSBsYWJlbGNvcHk7CisgICAgICAgIHp6anNvbi0+dmFsdWUub2JqZWN0LnZhbCAgICA9IHZhbDsKKworICAgICAgICBsYWJlbCA9IHZhX2FyZyhhcCwgY2hhciAqKTsKKworICAgICAgICBpZiAobGFiZWwpIHsKKyAgICAgICAgICAgIFpaSlNPTiAqbmV4dCA9IHp6anNvbl9jcmVhdGVfdGVtcGwoY29uZmlnLCBaWkpTT05fT0JKRUNUKTsKKyAgICAgICAgICAgIGlmICghbmV4dCkgeworICAgICAgICAgICAgICAgIHdoaWxlIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJldHZhbC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mcmVlKHJldHZhbC0+dmFsdWUub2JqZWN0LmxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mcmVlKHJldHZhbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgenpqc29uLT5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgIHp6anNvbiA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgdmFfZW5kKGFwKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitaWkpTT04gKnp6anNvbl9hcnJheV9wcmVwZW5kKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICphcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaWkpTT04gKnZhbCkgeworICAgIFpaSlNPTiAqenpqc29uOworCisgICAgaWYgKCFhcnJheS0+dmFsdWUuYXJyYXkudmFsKSB7IC8qIGVtcHR5IGFycmF5ICovCisgICAgICAgIGFycmF5LT52YWx1ZS5hcnJheS52YWwgPSB2YWw7CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICB6empzb24gPSB6empzb25fY3JlYXRlX3RlbXBsKGNvbmZpZywgWlpKU09OX0FSUkFZKTsKKyAgICBpZiAoenpqc29uKSB7CisgICAgICAgIHp6anNvbi0+dmFsdWUuYXJyYXkudmFsID0gdmFsOworICAgICAgICB6empzb24tPm5leHQgPSBhcnJheTsKKyAgICB9CisgICAgcmV0dXJuIHp6anNvbjsKK30KKworWlpKU09OICp6empzb25fYXJyYXlfYXBwZW5kKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICphcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpaSlNPTiAqdmFsKSB7CisgICAgWlpKU09OICpyZXR2YWwgPSBhcnJheSwgKnp6anNvbjsKKworICAgIGlmICghYXJyYXktPnZhbHVlLmFycmF5LnZhbCkgeyAvKiBlbXB0eSBhcnJheSAqLworICAgICAgICBhcnJheS0+dmFsdWUuYXJyYXkudmFsID0gdmFsOworICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgfQorCisgICAgenpqc29uID0genpqc29uX2NyZWF0ZV90ZW1wbChjb25maWcsIFpaSlNPTl9BUlJBWSk7CisgICAgaWYgKCF6empzb24pIHJldHVybiBOVUxMOworCisgICAgd2hpbGUgKGFycmF5LT5uZXh0KSBhcnJheSA9IGFycmF5LT5uZXh0OworCisgICAgenpqc29uLT52YWx1ZS5hcnJheS52YWwgPSB2YWw7CisgICAgYXJyYXktPm5leHQgPSB6empzb247CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitaWkpTT04gKnp6anNvbl9vYmplY3RfcHJlcGVuZChaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbGFiZWwsIFpaSlNPTiAqdmFsKSB7CisgICAgWlpKU09OICp6empzb24gPSBOVUxMOworICAgIGNoYXIgKmxhYmVsY29weSA9IHNkdXAoY29uZmlnLCBsYWJlbCk7CisKKyAgICBpZiAoIWxhYmVsY29weSkgcmV0dXJuIHp6anNvbjsKKworICAgIGlmICghb2JqZWN0LT52YWx1ZS5vYmplY3QubGFiZWwpIHsgLyogZW1wdHkgb2JqZWN0ICovCisgICAgICAgIG9iamVjdC0+dmFsdWUub2JqZWN0LmxhYmVsICA9IGxhYmVsY29weTsKKyAgICAgICAgb2JqZWN0LT52YWx1ZS5vYmplY3QudmFsICAgID0gdmFsOworICAgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworICAgIHp6anNvbiA9IHp6anNvbl9jcmVhdGVfdGVtcGwoY29uZmlnLCBaWkpTT05fT0JKRUNUKTsKKyAgICBpZiAoenpqc29uKSB7CisgICAgICAgIHp6anNvbi0+dmFsdWUub2JqZWN0LmxhYmVsICA9IGxhYmVsY29weTsKKyAgICAgICAgenpqc29uLT52YWx1ZS5vYmplY3QudmFsICAgID0gdmFsOworICAgICAgICB6empzb24tPm5leHQgPSBvYmplY3Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uZmlnLT5mcmVlKGxhYmVsY29weSk7CisgICAgfQorICAgIHJldHVybiB6empzb247Cit9CisKK1paSlNPTiAqenpqc29uX29iamVjdF9hcHBlbmQoWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbGFiZWwsIFpaSlNPTiAqdmFsKSB7CisgICAgWlpKU09OICpyZXR2YWwgPSBvYmplY3QsICp6empzb24gPSBOVUxMOworICAgIGNoYXIgKmxhYmVsY29weSA9IHNkdXAoY29uZmlnLCBsYWJlbCk7CisKKyAgICBpZiAoIWxhYmVsY29weSkgcmV0dXJuIHp6anNvbjsKKworICAgIGlmICghb2JqZWN0LT52YWx1ZS5vYmplY3QubGFiZWwpIHsgLyogZW1wdHkgb2JqZWN0ICovCisgICAgICAgIG9iamVjdC0+dmFsdWUub2JqZWN0LmxhYmVsICA9IGxhYmVsY29weTsKKyAgICAgICAgb2JqZWN0LT52YWx1ZS5vYmplY3QudmFsICAgID0gdmFsOworICAgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworICAgIHp6anNvbiA9IHp6anNvbl9jcmVhdGVfdGVtcGwoY29uZmlnLCBaWkpTT05fT0JKRUNUKTsKKyAgICBpZiAoIXp6anNvbikgeworICAgICAgICBjb25maWctPmZyZWUobGFiZWxjb3B5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKG9iamVjdC0+bmV4dCkgb2JqZWN0ID0gb2JqZWN0LT5uZXh0OworCisgICAgenpqc29uLT52YWx1ZS5vYmplY3QubGFiZWwgID0gbGFiZWxjb3B5OworICAgIHp6anNvbi0+dmFsdWUub2JqZWN0LnZhbCAgICA9IHZhbDsKKyAgICBvYmplY3QtPm5leHQgPSB6empzb247CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvenpqc29uL3p6anNvbl9mcmVlLmMgYi9jb20zMi9ncGxsaWIvenpqc29uL3p6anNvbl9mcmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkZmQyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2dwbGxpYi96empzb24venpqc29uX2ZyZWUuYwpAQCAtMCwwICsxLDI5IEBACisvKiBKU09OIGZyZWUKKyAqIFpaSlNPTiAtIENvcHlyaWdodCAoQykgMjAwOCBieSBJdm8gdmFuIFBvb3J0ZW4KKyAqIExpY2Vuc2U6IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMQorICovCisKKyNpbmNsdWRlICJ6empzb24uaCIKKwordm9pZCB6empzb25fZnJlZShaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqenpqc29uKSB7CisgICAgd2hpbGUgKHp6anNvbikgeworICAgICAgICBaWkpTT04gKm5leHQ7CisgICAgICAgIHN3aXRjaCh6empzb24tPnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgWlpKU09OX09CSkVDVDoKKyAgICAgICAgICAgICAgICBjb25maWctPmZyZWUoenpqc29uLT52YWx1ZS5vYmplY3QubGFiZWwpOworICAgICAgICAgICAgICAgIHp6anNvbl9mcmVlKGNvbmZpZywgenpqc29uLT52YWx1ZS5vYmplY3QudmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWlpKU09OX0FSUkFZOgorICAgICAgICAgICAgICAgIHp6anNvbl9mcmVlKGNvbmZpZywgenpqc29uLT52YWx1ZS5hcnJheS52YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBaWkpTT05fU1RSSU5HOgorICAgICAgICAgICAgICAgIGNvbmZpZy0+ZnJlZSh6empzb24tPnZhbHVlLnN0cmluZy5zdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0genpqc29uLT5uZXh0OworICAgICAgICBjb25maWctPmZyZWUoenpqc29uKTsKKyAgICAgICAgenpqc29uID0gbmV4dDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvenpqc29uL3p6anNvbl9wYXJzZS5jIGIvY29tMzIvZ3BsbGliL3p6anNvbi96empzb25fcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2I2ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL3p6anNvbi96empzb25fcGFyc2UuYwpAQCAtMCwwICsxLDQ5MCBAQAorLyogSlNPTiBQYXJzZXIKKyAqIFpaSlNPTiAtIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IGJ5IEl2byB2YW4gUG9vcnRlbgorICogTGljZW5zZTogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xCisgKi8KKworI2luY2x1ZGUgInp6anNvbi5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgR0VUQygpICAgICAgICAgIGNvbmZpZy0+Z2V0Y2hhcihjb25maWctPmloYW5kbGUpCisjZGVmaW5lIFVOR0VUQyhjKSAgICAgICBjb25maWctPnVuZ2V0Y2hhcihjLCBjb25maWctPmloYW5kbGUpCisjZGVmaW5lIFNLSVBXUygpICAgICAgICBza2lwd3MoY29uZmlnKQorI2lmZGVmIENPTkZJR19OT19FUlJPUl9NRVNTQUdFUworI2RlZmluZSBFUlJPUih4Li4uKQorI2Vsc2UKKyNkZWZpbmUgRVJST1IoeC4uLikgICAgIGNvbmZpZy0+ZXJyb3IoY29uZmlnLT5laGFuZGxlLCAjI3gpCisjZW5kaWYKKyNkZWZpbmUgTUVNRVJST1IoKSAgICAgIEVSUk9SKCJvdXQgb2YgbWVtb3J5IikKKworI2RlZmluZSBBTExPV19FWFRSQV9DT01NQSAgICAoY29uZmlnLT5zdHJpY3RuZXNzICYgWlpKU09OX0FMTE9XX0VYVFJBX0NPTU1BKQorI2RlZmluZSBBTExPV19JTExFR0FMX0VTQ0FQRSAoY29uZmlnLT5zdHJpY3RuZXNzICYgWlpKU09OX0FMTE9XX0lMTEVHQUxfRVNDQVBFKQorI2RlZmluZSBBTExPV19DT05UUk9MX0NIQVJTICAoY29uZmlnLT5zdHJpY3RuZXNzICYgWlpKU09OX0FMTE9XX0NPTlRST0xfQ0hBUlMpCisjZGVmaW5lIEFMTE9XX0dBUkJBR0VfQVRfRU5EIChjb25maWctPnN0cmljdG5lc3MgJiBaWkpTT05fQUxMT1dfR0FSQkFHRV9BVF9FTkQpCisjZGVmaW5lIEFMTE9XX0NPTU1FTlRTICAgICAgIChjb25maWctPnN0cmljdG5lc3MgJiBaWkpTT05fQUxMT1dfQ09NTUVOVFMpCisKK3N0YXRpYyBaWkpTT04gKnBhcnNlX2FycmF5KFpaSlNPTl9DT05GSUcgKmNvbmZpZyk7CitzdGF0aWMgWlpKU09OICpwYXJzZV9vYmplY3QoWlpKU09OX0NPTkZJRyAqY29uZmlnKTsKKworc3RhdGljIHZvaWQgc2tpcHdzKFpaSlNPTl9DT05GSUcgKmNvbmZpZykgeworICAgIGludCBkLCBjID0gR0VUQygpOworbW9yZXdzOgorICAgIHdoaWxlIChpc3NwYWNlKGMpKSBjID0gR0VUQygpOworICAgIGlmICghQUxMT1dfQ09NTUVOVFMpIGdvdG8gZW5kd3M7CisgICAgaWYgKGMgIT0gJy8nKSBnb3RvIGVuZHdzOworICAgIGQgPSBHRVRDKCk7CisgICAgaWYgKGQgIT0gJyonKSBnb3RvIGVuZHdzOyAvKiBwdXNoaW5nIGJhY2sgYyB3aWxsIGdlbmVyYXRlIGEgcGFyc2UgZXJyb3IgKi8KKyAgICBjID0gR0VUQygpOworbW9yZWNvbW1lbnRzOgorICAgIHdoaWxlIChjICE9ICcqJykgeworICAgICAgICBpZiAoYyA9PSBFT0YpIGdvdG8gZW5kd3M7CisgICAgICAgIGMgPSBHRVRDKCk7CisgICAgfQorICAgIGMgPSBHRVRDKCk7CisgICAgaWYgKGMgIT0gJy8nKSBnb3RvIG1vcmVjb21tZW50czsKKyAgICBjID0gR0VUQygpOworICAgIGlmIChpc3NwYWNlKGMpIHx8IGMgPT0gJy8nKSBnb3RvIG1vcmV3czsKK2VuZHdzOgorICAgIFVOR0VUQyhjKTsKK30KKworc3RhdGljIGNoYXIgKnBhcnNlX3N0cmluZyhaWkpTT05fQ09ORklHICpjb25maWcpIHsKKyAgICB1bnNpZ25lZCBpbnQgbGVuID0gMTYsIHBvcyA9IDA7CisgICAgaW50IGM7CisgICAgY2hhciAqc3RyID0gTlVMTDsKKworICAgIFNLSVBXUygpOworICAgIGMgPSBHRVRDKCk7CisgICAgaWYgKGMgIT0gJyInKSB7CisgICAgICAgIEVSUk9SKCJzdHJpbmc6IGV4cGVjdGVkIFwiIGF0IHRoZSBzdGFydCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdHIgPSBjb25maWctPm1hbGxvYyhsZW4pOworICAgIGlmICghc3RyKSB7CisgICAgICAgIE1FTUVSUk9SKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjID0gR0VUQygpOworICAgIHdoaWxlIChjID4gMCAmJiBjICE9ICciJykgeworICAgICAgICBpZiAoIUFMTE9XX0NPTlRST0xfQ0hBUlMgJiYgYyA+PSAwICYmIGMgPD0gMzEpIHsKKyAgICAgICAgICAgIEVSUk9SKCJzdHJpbmc6IGNvbnRyb2wgY2hhcmFjdGVycyBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgYyA9IEdFVEMoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgIGNhc2UgJ2InOiBjID0gJ1xiJzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnZic6IGMgPSAnXGYnOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICduJzogYyA9ICdcbic7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3InOiBjID0gJ1xyJzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAndCc6IGMgPSAnXHQnOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICd1JzogeworICAgICAgICAgICAgICAgICAgICBVTkdFVEMoYyk7ICAgIC8qIGlnbm9yZSBcdUhISEgsIGNvcHkgdmVyYmF0aW0gKi8KKyAgICAgICAgICAgICAgICAgICAgYyA9ICdcXCc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6IGNhc2UgJy8nOiBjYXNlICciJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFBTExPV19JTExFR0FMX0VTQ0FQRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRVJST1IoInN0cmluZzogaWxsZWdhbCBlc2NhcGUgY2hhcmFjdGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm91dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cltwb3MrK10gPSBjOworICAgICAgICBpZiAocG9zID09IGxlbi0xKSB7CisgICAgICAgICAgICB2b2lkICp0bXAgPSBzdHI7CisgICAgICAgICAgICBsZW4gKj0gMjsKKyAgICAgICAgICAgIHN0ciA9IGNvbmZpZy0+cmVhbGxvYyhzdHIsIGxlbik7CisgICAgICAgICAgICBpZiAoIXN0cikgeworICAgICAgICAgICAgICAgIE1FTUVSUk9SKCk7CisgICAgICAgICAgICAgICAgc3RyID0gdG1wOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGMgPSBHRVRDKCk7CisgICAgfQorICAgIGlmIChjICE9ICciJykgeworICAgICAgICBFUlJPUigic3RyaW5nOiBleHBlY3RlZCBcIiBhdCB0aGUgZW5kIik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KKyAgICBzdHJbcG9zXSA9IDA7CisgICAgcmV0dXJuIHN0cjsKKworZXJyb3V0OgorICAgIGNvbmZpZy0+ZnJlZShzdHIpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgWlpKU09OICpwYXJzZV9zdHJpbmcyKFpaSlNPTl9DT05GSUcgKmNvbmZpZykgeworICAgIFpaSlNPTiAqenpqc29uID0gTlVMTDsKKyAgICBjaGFyICpzdHI7CisKKyAgICBzdHIgPSBwYXJzZV9zdHJpbmcoY29uZmlnKTsKKyAgICBpZiAoc3RyKSB7CisgICAgICAgIHp6anNvbiA9IGNvbmZpZy0+Y2FsbG9jKDEsIHNpemVvZihaWkpTT04pKTsKKyAgICAgICAgaWYgKCF6empzb24pIHsKKyAgICAgICAgICAgIE1FTUVSUk9SKCk7CisgICAgICAgICAgICBjb25maWctPmZyZWUoc3RyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHp6anNvbi0+dHlwZSA9IFpaSlNPTl9TVFJJTkc7CisgICAgICAgIHp6anNvbi0+dmFsdWUuc3RyaW5nLnN0cmluZyA9IHN0cjsKKyAgICB9CisgICAgcmV0dXJuIHp6anNvbjsKK30KKworc3RhdGljIFpaSlNPTiAqcGFyc2VfbnVtYmVyKFpaSlNPTl9DT05GSUcgKmNvbmZpZykgeworICAgIFpaSlNPTiAqenpqc29uOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBpdmFsID0gMCwgZXhwbyA9IDA7CisgICAgZG91YmxlIGR2YWwgPSAwLjAsIGZyYWMgPSAwLjAsIGZyYWNzaGZ0ID0gMTAuMDsKKyAgICBpbnQgYywgZGJsID0gMCwgc2lnbiA9IDEsIHNpZ25leHBvID0gMTsKKworICAgIFNLSVBXUygpOworICAgIGMgPSBHRVRDKCk7CisgICAgaWYgKGMgPT0gJy0nKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgYyA9IEdFVEMoKTsKKyAgICB9CisgICAgaWYgKGMgPT0gJzAnKSB7CisgICAgICAgIGMgPSBHRVRDKCk7CisgICAgICAgIGdvdG8gc2tpcDsKKyAgICB9CisKKyAgICBpZiAoIWlzZGlnaXQoYykpIHsKKyAgICAgICAgRVJST1IoIm51bWJlcjogZGlnaXQgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKGlzZGlnaXQoYykpIHsKKyAgICAgICAgaXZhbCAqPSAxMDsKKyAgICAgICAgaXZhbCArPSBjIC0gJzAnOworICAgICAgICBjID0gR0VUQygpOworICAgIH0KKworc2tpcDoKKyAgICBpZiAoYyAhPSAnLicpIGdvdG8gc2tpcGZyYWM7CisKKyAgICBkYmwgPSAxOworCisgICAgYyA9IEdFVEMoKTsKKyAgICBpZiAoIWlzZGlnaXQoYykpIHsKKyAgICAgICAgRVJST1IoIm51bWJlcjogZGlnaXQgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKGlzZGlnaXQoYykpIHsKKyAgICAgICAgZnJhYyArPSAoZG91YmxlKShjIC0gJzAnKSAvIGZyYWNzaGZ0OworICAgICAgICBmcmFjc2hmdCAqPSAxMC4wOworICAgICAgICBjID0gR0VUQygpOworICAgIH0KKworc2tpcGZyYWM6CisgICAgaWYgKGMgIT0gJ2UnICYmIGMgIT0gJ0UnKSBnb3RvIHNraXBleHBvOworCisgICAgZGJsID0gMTsKKworICAgIGMgPSBHRVRDKCk7CisgICAgaWYgKGMgPT0gJysnKQorICAgICAgICBjID0gR0VUQygpOworICAgIGVsc2UgaWYgKGMgPT0gJy0nKSB7CisgICAgICAgIHNpZ25leHBvID0gLTE7CisgICAgICAgIGMgPSBHRVRDKCk7CisgICAgfQorCisgICAgaWYgKCFpc2RpZ2l0KGMpKSB7CisgICAgICAgIEVSUk9SKCJudW1iZXI6IGRpZ2l0IGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHdoaWxlIChpc2RpZ2l0KGMpKSB7CisgICAgICAgIGV4cG8gKj0gMTA7CisgICAgICAgIGV4cG8gKz0gYyAtICcwJzsKKyAgICAgICAgYyA9IEdFVEMoKTsKKyAgICB9CisKK3NraXBleHBvOgorICAgIFVOR0VUQyhjKTsKKworICAgIGlmIChkYmwpIHsKKyAgICAgICAgZHZhbCA9IHNpZ24gKiAobG9uZyBsb25nKSBpdmFsOworICAgICAgICBkdmFsICs9IHNpZ24gKiBmcmFjOworICAgICAgICBkdmFsICo9IHBvdygxMC4wLCAoZG91YmxlKSBzaWduZXhwbyAqIGV4cG8pOworICAgIH0KKworICAgIHp6anNvbiA9IGNvbmZpZy0+Y2FsbG9jKDEsIHNpemVvZihaWkpTT04pKTsKKyAgICBpZiAoIXp6anNvbikgeworICAgICAgICBNRU1FUlJPUigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGRibCkgeworICAgICAgICB6empzb24tPnR5cGUgPSBaWkpTT05fTlVNQkVSX0RPVUJMRTsKKyAgICAgICAgenpqc29uLT52YWx1ZS5udW1iZXIudmFsLmR2YWwgPSBkdmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIHp6anNvbi0+dHlwZSA9IHNpZ24gPCAwID8gWlpKU09OX05VTUJFUl9ORUdJTlQgOiBaWkpTT05fTlVNQkVSX1BPU0lOVDsKKyAgICAgICAgenpqc29uLT52YWx1ZS5udW1iZXIudmFsLml2YWwgPSBpdmFsOworICAgIH0KKyAgICAKKyAgICByZXR1cm4genpqc29uOworfQorCitzdGF0aWMgWlpKU09OICpwYXJzZV9saXRlcmFsKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgY2hhciAqcywgWlpKU09OX1RZUEUgdCkgeworICAgIGNoYXIgYltzdHJsZW4ocykrMV07CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxzdHJsZW4ocyk7IGkrKykgYltpXSA9IEdFVEMoKTsKKyAgICBiW2ldID0gMDsKKworICAgIGlmICghc3RyY21wKGIscykpIHsKKyAgICAgICAgWlpKU09OICp6empzb247CisgICAgICAgIHp6anNvbiA9IGNvbmZpZy0+Y2FsbG9jKDEsIHNpemVvZihaWkpTT04pKTsKKyAgICAgICAgaWYgKCF6empzb24pIHsKKyAgICAgICAgICAgIE1FTUVSUk9SKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB6empzb24tPnR5cGUgPSB0OworICAgICAgICByZXR1cm4genpqc29uOworICAgIH0KKyAgICBFUlJPUigibGl0ZXJhbDogZXhwZWN0ZWQgJXMiLCBzKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFpaSlNPTiAqcGFyc2VfdHJ1ZShaWkpTT05fQ09ORklHICpjb25maWcpIHsKKyAgICByZXR1cm4gcGFyc2VfbGl0ZXJhbChjb25maWcsIChjaGFyICopInRydWUiLCBaWkpTT05fVFJVRSk7Cit9CisKK3N0YXRpYyBaWkpTT04gKnBhcnNlX2ZhbHNlKFpaSlNPTl9DT05GSUcgKmNvbmZpZykgeworICAgIHJldHVybiBwYXJzZV9saXRlcmFsKGNvbmZpZywgKGNoYXIgKikiZmFsc2UiLCBaWkpTT05fRkFMU0UpOworfQorCitzdGF0aWMgWlpKU09OICpwYXJzZV9udWxsKFpaSlNPTl9DT05GSUcgKmNvbmZpZykgeworICAgIHJldHVybiBwYXJzZV9saXRlcmFsKGNvbmZpZywgKGNoYXIgKikibnVsbCIsIFpaSlNPTl9OVUxMKTsKK30KKworc3RhdGljIFpaSlNPTiAqcGFyc2VfdmFsdWUoWlpKU09OX0NPTkZJRyAqY29uZmlnKSB7CisgICAgWlpKU09OICpyZXR2YWwgPSBOVUxMOworICAgIGludCBjOworCisgICAgU0tJUFdTKCk7CisgICAgYyA9IEdFVEMoKTsKKyAgICBVTkdFVEMoYyk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJyInOiAgIHJldHZhbCA9IHBhcnNlX3N0cmluZzIoY29uZmlnKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6CisgICAgICAgIGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOiBjYXNlICctJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcGFyc2VfbnVtYmVyKGNvbmZpZyk7IGJyZWFrOworICAgICAgICBjYXNlICd7JzogICByZXR2YWwgPSBwYXJzZV9vYmplY3QoY29uZmlnKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1snOiAgIHJldHZhbCA9IHBhcnNlX2FycmF5KGNvbmZpZyk7IGJyZWFrOworICAgICAgICBjYXNlICd0JzogICByZXR2YWwgPSBwYXJzZV90cnVlKGNvbmZpZyk7IGJyZWFrOworICAgICAgICBjYXNlICdmJzogICByZXR2YWwgPSBwYXJzZV9mYWxzZShjb25maWcpOyBicmVhazsKKyAgICAgICAgY2FzZSAnbic6ICAgcmV0dmFsID0gcGFyc2VfbnVsbChjb25maWcpOyBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIXJldHZhbCkgeworICAgICAgICBFUlJPUigidmFsdWU6IGludmFsaWQgdmFsdWUiKTsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgWlpKU09OICpwYXJzZV9hcnJheShaWkpTT05fQ09ORklHICpjb25maWcpIHsKKyAgICBaWkpTT04gKnJldHZhbCA9IE5VTEwsICoqbmV4dCA9ICZyZXR2YWw7CisgICAgaW50IGM7CisKKyAgICBTS0lQV1MoKTsKKyAgICBjID0gR0VUQygpOworICAgIGlmIChjICE9ICdbJykgeworICAgICAgICBFUlJPUigiYXJyYXk6IGV4cGVjdGVkICdbJyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTS0lQV1MoKTsKKyAgICBjID0gR0VUQygpOworICAgIHdoaWxlIChjID4gMCAmJiBjICE9ICddJykgeworICAgICAgICBaWkpTT04gKnp6anNvbiA9IE5VTEwsICp2YWwgPSBOVUxMOworCisgICAgICAgIFVOR0VUQyhjKTsKKworICAgICAgICBTS0lQV1MoKTsKKyAgICAgICAgdmFsID0gcGFyc2VfdmFsdWUoY29uZmlnKTsKKyAgICAgICAgaWYgKCF2YWwpIHsKKyAgICAgICAgICAgIEVSUk9SKCJhcnJheTogdmFsdWUgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3V0OworICAgICAgICB9CisKKyAgICAgICAgU0tJUFdTKCk7CisgICAgICAgIGMgPSBHRVRDKCk7CisgICAgICAgIGlmIChjICE9ICcsJyAmJiBjICE9ICddJykgeworICAgICAgICAgICAgRVJST1IoImFycmF5OiBleHBlY3RlZCAnLCcgb3IgJ10nIik7CitlcnJvdXRfd2l0aF92YWw6CisgICAgICAgICAgICB6empzb25fZnJlZShjb25maWcsIHZhbCk7CisgICAgICAgICAgICBnb3RvIGVycm91dDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnLCcpIHsKKyAgICAgICAgICAgIFNLSVBXUygpOworICAgICAgICAgICAgYyA9IEdFVEMoKTsKKyAgICAgICAgICAgIGlmIChjID09ICddJyAmJiAhQUxMT1dfRVhUUkFfQ09NTUEpIHsKKyAgICAgICAgICAgICAgICBFUlJPUigiYXJyYXk6IGV4cGVjdGVkIHZhbHVlIGFmdGVyICcsJyIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3V0X3dpdGhfdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFVOR0VUQyhjKTsKKworICAgICAgICB6empzb24gPSBjb25maWctPmNhbGxvYygxLCBzaXplb2YoWlpKU09OKSk7CisgICAgICAgIGlmICghenpqc29uKSB7CisgICAgICAgICAgICBNRU1FUlJPUigpOworICAgICAgICAgICAgenpqc29uX2ZyZWUoY29uZmlnLCB2YWwpOworICAgICAgICAgICAgZ290byBlcnJvdXRfd2l0aF92YWw7CisgICAgICAgIH0KKyAgICAgICAgenpqc29uLT50eXBlICAgICAgICAgICAgPSBaWkpTT05fQVJSQVk7CisgICAgICAgIHp6anNvbi0+dmFsdWUuYXJyYXkudmFsID0gdmFsOworICAgICAgICAqbmV4dCA9IHp6anNvbjsKKyAgICAgICAgbmV4dCA9ICZ6empzb24tPm5leHQ7CisKKyAgICAgICAgYyA9IEdFVEMoKTsKKyAgICB9CisKKyAgICBpZiAoYyAhPSAnXScpIHsKKyAgICAgICAgRVJST1IoImFycmF5OiBleHBlY3RlZCAnXSciKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQorCisgICAgaWYgKCFyZXR2YWwpIHsgIC8qIGVtcHR5IGFycmF5LCBbIF0gKi8KKyAgICAgICAgcmV0dmFsID0gY29uZmlnLT5jYWxsb2MoMSwgc2l6ZW9mKFpaSlNPTikpOworICAgICAgICBpZiAoIXJldHZhbCkgeworICAgICAgICAgICAgTUVNRVJST1IoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHZhbC0+dHlwZSA9IFpaSlNPTl9BUlJBWTsKKyAgICB9CisgICAgICAgICAgICAKKyAgICByZXR1cm4gcmV0dmFsOworCitlcnJvdXQ6CisgICAgenpqc29uX2ZyZWUoY29uZmlnLCByZXR2YWwpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgWlpKU09OICpwYXJzZV9vYmplY3QoWlpKU09OX0NPTkZJRyAqY29uZmlnKSB7CisgICAgWlpKU09OICpyZXR2YWwgPSBOVUxMOworICAgIGludCBjOworICAgIFpaSlNPTiAqKm5leHQgPSAmcmV0dmFsOworCisgICAgU0tJUFdTKCk7CisgICAgYyA9IEdFVEMoKTsKKyAgICBpZiAoYyAhPSAneycpIHsKKyAgICAgICAgRVJST1IoIm9iamVjdDogZXhwZWN0ZWQgJ3snIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFNLSVBXUygpOworICAgIGMgPSBHRVRDKCk7CisgICAgd2hpbGUgKGMgPiAwICYmIGMgIT0gJ30nKSB7CisgICAgICAgIFpaSlNPTiAqenpqc29uID0gTlVMTCwgKnZhbCA9IE5VTEw7CisgICAgICAgIGNoYXIgKnN0cjsKKworICAgICAgICBVTkdFVEMoYyk7CisKKyAgICAgICAgc3RyID0gcGFyc2Vfc3RyaW5nKGNvbmZpZyk7CisgICAgICAgIGlmICghc3RyKSB7CisgICAgICAgICAgICBFUlJPUigib2JqZWN0OiBleHBlY3RlZCBzdHJpbmciKTsKK2Vycm91dF93aXRoX3N0cjoKKyAgICAgICAgICAgIGNvbmZpZy0+ZnJlZShzdHIpOworICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgIH0KKworICAgICAgICBTS0lQV1MoKTsKKyAgICAgICAgYyA9IEdFVEMoKTsKKyAgICAgICAgaWYgKGMgIT0gJzonKSB7CisgICAgICAgICAgICBFUlJPUigib2JqZWN0OiBleHBlY3RlZCAnOiciKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3V0X3dpdGhfc3RyOworICAgICAgICB9CisKKyAgICAgICAgU0tJUFdTKCk7CisgICAgICAgIHZhbCA9IHBhcnNlX3ZhbHVlKGNvbmZpZyk7CisgICAgICAgIGlmICghdmFsKSB7CisgICAgICAgICAgICBFUlJPUigib2JqZWN0OiB2YWx1ZSBleHBlY3RlZCIpOworICAgICAgICAgICAgZ290byBlcnJvdXRfd2l0aF9zdHI7CisgICAgICAgIH0KKworICAgICAgICBTS0lQV1MoKTsKKyAgICAgICAgYyA9IEdFVEMoKTsKKyAgICAgICAgaWYgKGMgIT0gJywnICYmIGMgIT0gJ30nKSB7CisgICAgICAgICAgICBFUlJPUigib2JqZWN0OiBleHBlY3RlZCAnLCcgb3IgJ30nIik7CitlcnJvdXRfd2l0aF9zdHJfYW5kX3ZhbDoKKyAgICAgICAgICAgIHp6anNvbl9mcmVlKGNvbmZpZywgdmFsKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3V0X3dpdGhfc3RyOworICAgICAgICB9CisgICAgICAgIGlmIChjID09ICcsJykgeworICAgICAgICAgICAgU0tJUFdTKCk7CisgICAgICAgICAgICBjID0gR0VUQygpOworICAgICAgICAgICAgaWYgKGMgPT0gJ30nICYmICFBTExPV19FWFRSQV9DT01NQSkgeworICAgICAgICAgICAgICAgIEVSUk9SKCJvYmplY3Q6IGV4cGVjdGVkIHBhaXIgYWZ0ZXIgJywnIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvdXRfd2l0aF9zdHJfYW5kX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBVTkdFVEMoYyk7CisKKyAgICAgICAgenpqc29uID0gY29uZmlnLT5jYWxsb2MoMSwgc2l6ZW9mKFpaSlNPTikpOworICAgICAgICBpZiAoIXp6anNvbikgeworICAgICAgICAgICAgTUVNRVJST1IoKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3V0X3dpdGhfc3RyX2FuZF92YWw7CisgICAgICAgIH0KKyAgICAgICAgenpqc29uLT50eXBlICAgICAgICAgICAgICAgID0gWlpKU09OX09CSkVDVDsKKyAgICAgICAgenpqc29uLT52YWx1ZS5vYmplY3QubGFiZWwgID0gc3RyOworICAgICAgICB6empzb24tPnZhbHVlLm9iamVjdC52YWwgICAgPSB2YWw7CisgICAgICAgICpuZXh0ID0genpqc29uOworICAgICAgICBuZXh0ID0gJnp6anNvbi0+bmV4dDsKKworICAgICAgICBjID0gR0VUQygpOworICAgIH0KKworICAgIGlmIChjICE9ICd9JykgeworICAgICAgICBFUlJPUigib2JqZWN0OiBleHBlY3RlZCAnfSciKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQorCisgICAgaWYgKCFyZXR2YWwpIHsgIC8qIGVtcHR5IG9iamVjdCwgeyB9ICovCisgICAgICAgIHJldHZhbCA9IGNvbmZpZy0+Y2FsbG9jKDEsIHNpemVvZihaWkpTT04pKTsKKyAgICAgICAgaWYgKCFyZXR2YWwpIHsKKyAgICAgICAgICAgIE1FTUVSUk9SKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR2YWwtPnR5cGUgPSBaWkpTT05fT0JKRUNUOworICAgIH0KKyAgICAgICAgICAgIAorICAgIHJldHVybiByZXR2YWw7CisKK2Vycm91dDoKKyAgICB6empzb25fZnJlZShjb25maWcsIHJldHZhbCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1paSlNPTiAqenpqc29uX3BhcnNlKFpaSlNPTl9DT05GSUcgKmNvbmZpZykgeworICAgIFpaSlNPTiAqcmV0dmFsOworICAgIGludCBjOworCisgICAgU0tJUFdTKCk7ICAgCisgICAgYyA9IEdFVEMoKTsKKyAgICBVTkdFVEMoYyk7CisgICAgaWYgKGMgPT0gJ1snKSAgICAgICByZXR2YWwgPSBwYXJzZV9hcnJheShjb25maWcpOworICAgIGVsc2UgaWYgKGMgPT0gJ3snKSAgcmV0dmFsID0gcGFyc2Vfb2JqZWN0KGNvbmZpZyk7CisgICAgZWxzZSAgICAgICAgICAgICAgICB7IEVSUk9SKCJleHBlY3RlZCAnWycgb3IgJ3snIik7IHJldHVybiBOVUxMOyB9CisKKyAgICBpZiAoIXJldHZhbCkgcmV0dXJuIE5VTEw7CisKKyAgICBTS0lQV1MoKTsKKyAgICBjID0gR0VUQygpOworICAgIGlmIChjID49IDAgJiYgIUFMTE9XX0dBUkJBR0VfQVRfRU5EKSB7CisgICAgICAgIEVSUk9SKCJwYXJzZTogZ2FyYmFnZSBhdCBlbmQgb2YgZmlsZSIpOworICAgICAgICB6empzb25fZnJlZShjb25maWcsIHJldHZhbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9ncGxsaWIvenpqc29uL3p6anNvbl9wcmludC5jIGIvY29tMzIvZ3BsbGliL3p6anNvbi96empzb25fcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTliM2IwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvZ3BsbGliL3p6anNvbi96empzb25fcHJpbnQuYwpAQCAtMCwwICsxLDExMCBAQAorLyogSlNPTiBQcmludGVyCisgKiBaWkpTT04gLSBDb3B5cmlnaHQgKEMpIDIwMDggYnkgSXZvIHZhbiBQb29ydGVuCisgKiBMaWNlbnNlOiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqLworCisjaW5jbHVkZSAienpqc29uLmgiCisKKyNkZWZpbmUgUFJJTlQoZm10Li4uKSBpZiAoY29uZmlnLT5wcmludChjb25maWctPm9oYW5kbGUsICMjZm10KSA8IDApIHJldHVybiAtMTsKKy8vI2RlZmluZSBQVVRDKGMpICAgICAgIGlmIChjb25maWctPnB1dGNoYXIoYywgY29uZmlnLT5vaGFuZGxlKSA8IDApIHJldHVybiAtMTsKKyNkZWZpbmUgUFVUQyhjKSAgICAgICBQUklOVCgiJWMiLGMpCisjZGVmaW5lIElOQyA0CisKK3N0YXRpYyBpbnQgcHJpbnRfc3RyaW5nKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgY2hhciAqcykgeworICAgIGludCBjLCBiczsKKyAgICBpZiAoIXMpIHJldHVybiAwOworICAgIHdoaWxlICgoYyA9ICpzKyspKSB7CisgICAgICAgIGJzID0gMTsKKyAgICAgICAgc3dpdGNoIChjKSB7CisvLyAgICAgICAgICAgIGNhc2UgJy8nOiAgICAgICAgICAgICAgICAgLy8gdXNlbGVzcyBlc2NhcGUgb2YgZm9yd2FyZCBzbGFzaAorICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIGlmICgqcyA9PSAndScpIGJzID0gMDsgIC8vIGNvcHkgXHVISEhIIHZlcmJhdGltCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICciJzogICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xiJzogIGMgPSAnYic7ICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXGYnOiAgYyA9ICdmJzsgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcbic6ICBjID0gJ24nOyAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xyJzogIGMgPSAncic7ICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHQnOiAgYyA9ICd0JzsgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiAgICBicyA9IDA7ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnMpIFBVVEMoJ1xcJyk7CisgICAgICAgIFBVVEMoYyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHp6anNvbl9wcmludDIoWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKnp6anNvbiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGVudCwgdW5zaWduZWQgaW50IG9ianZhbCkgeworICAgIGNoYXIgYyA9IDAsIGQgPSAwOworICAgIGlmICghenpqc29uKSByZXR1cm4gLTE7CisKKyAgICBzd2l0Y2goenpqc29uLT50eXBlKSB7CisgICAgICAgIGNhc2UgWlpKU09OX09CSkVDVDogYyA9ICd7JzsgZCA9ICd9JzsgYnJlYWs7CisgICAgICAgIGNhc2UgWlpKU09OX0FSUkFZOiAgYyA9ICdbJzsgZCA9ICddJzsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIGlmIChjKSBQUklOVCgiJXMlKnMlYyIsIGluZGVudCA/ICJcbiIgOiAiIiwgaW5kZW50LCAiIiwgYyk7CisKKyAgICB3aGlsZSAoenpqc29uKSB7CisgICAgICAgIHN3aXRjaCh6empzb24tPnR5cGUpIHsKKyAgICAgICAgY2FzZSBaWkpTT05fT0JKRUNUOgorICAgICAgICAgICAgaWYgKHp6anNvbi0+dmFsdWUub2JqZWN0LnZhbCkgeworICAgICAgICAgICAgICAgIFBSSU5UKCJcbiUqc1wiIiwgaW5kZW50K0lOQywgIiIpOworICAgICAgICAgICAgICAgIGlmIChwcmludF9zdHJpbmcoY29uZmlnLCB6empzb24tPnZhbHVlLm9iamVjdC5sYWJlbCkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgUFJJTlQoIlwiIDoiKTsKKyAgICAgICAgICAgICAgICBpZiAoenpqc29uX3ByaW50Mihjb25maWcsIHp6anNvbi0+dmFsdWUub2JqZWN0LnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCtJTkMsIDEpIDwgMCkgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWlpKU09OX0FSUkFZOgorICAgICAgICAgICAgaWYgKHp6anNvbi0+dmFsdWUuYXJyYXkudmFsKQorICAgICAgICAgICAgICAgIGlmICh6empzb25fcHJpbnQyKGNvbmZpZywgenpqc29uLT52YWx1ZS5hcnJheS52YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQrSU5DLCAwKSA8IDApIHJldHVybiAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpaSlNPTl9TVFJJTkc6CisgICAgICAgICAgICBQUklOVChvYmp2YWwgPyAiIFwiIiA6ICJcbiUqc1wiIiwgaW5kZW50LCAiIik7CisgICAgICAgICAgICBpZiAocHJpbnRfc3RyaW5nKGNvbmZpZywgenpqc29uLT52YWx1ZS5zdHJpbmcuc3RyaW5nKTwwKSByZXR1cm4gLTE7CisgICAgICAgICAgICBQVVRDKCciJyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaWkpTT05fRkFMU0U6CisgICAgICAgICAgICBQUklOVChvYmp2YWwgPyAiIGZhbHNlIiA6ICJcbiUqc2ZhbHNlIiwgaW5kZW50LCAiIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaWkpTT05fTlVMTDoKKyAgICAgICAgICAgIFBSSU5UKG9ianZhbCA/ICIgbnVsbCIgOiAiXG4lKnNudWxsIiwgaW5kZW50LCAiIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaWkpTT05fVFJVRToKKyAgICAgICAgICAgIFBSSU5UKG9ianZhbCA/ICIgdHJ1ZSIgOiAiXG4lKnN0cnVlIiwgaW5kZW50LCAiIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaWkpTT05fTlVNQkVSX05FR0lOVDoKKyAgICAgICAgY2FzZSBaWkpTT05fTlVNQkVSX1BPU0lOVDoKKyAgICAgICAgY2FzZSBaWkpTT05fTlVNQkVSX0RPVUJMRToKKyAgICAgICAgICAgIFBSSU5UKG9ianZhbCA/ICIgIiA6ICJcbiUqcyIsIGluZGVudCwgIiIpOworICAgICAgICAgICAgaWYgKHp6anNvbi0+dHlwZSA9PSBaWkpTT05fTlVNQkVSX0RPVUJMRSkgeworICAgICAgICAgICAgICAgIFBSSU5UKCIlMTYuMTZlIiwgenpqc29uLT52YWx1ZS5udW1iZXIudmFsLmR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoenpqc29uLT50eXBlID09IFpaSlNPTl9OVU1CRVJfTkVHSU5UKSBQVVRDKCctJyk7CisgICAgICAgICAgICAgICAgUFJJTlQoIiVsbHUiLCB6empzb24tPnZhbHVlLm51bWJlci52YWwuaXZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB6empzb24gPSB6empzb24tPm5leHQ7CisgICAgICAgIGlmICh6empzb24pIFBVVEMoJywnKTsKKyAgICB9CisKKyAgICBpZiAoZCkgUFJJTlQoIlxuJSpzJWMiLCBpbmRlbnQsICIiLCBkKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgenpqc29uX3ByaW50KFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICp6empzb24pIHsKKyAgICBpbnQgcmV0dmFsID0genpqc29uX3ByaW50Mihjb25maWcsIHp6anNvbiwgMCwgMCk7CisvLyAgICBpZiAocmV0dmFsID49IDApIHJldHZhbCA9IGNvbmZpZy0+cHV0Y2hhcignXG4nLCBjb25maWctPm9oYW5kbGUpOworI2lmbmRlZiBDT05GSUdfTk9fRVJST1JfTUVTU0FHRVMKKyAgICBpZiAocmV0dmFsIDwgIDApIGNvbmZpZy0+ZXJyb3IoY29uZmlnLT5laGFuZGxlLCAicHJpbnQ6IHVuYWJsZSB0byBwcmludCIpOworI2VuZGlmCisgICAgcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2dwbGxpYi96empzb24venpqc29uX3F1ZXJ5LmMgYi9jb20zMi9ncGxsaWIvenpqc29uL3p6anNvbl9xdWVyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YmE3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9ncGxsaWIvenpqc29uL3p6anNvbl9xdWVyeS5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEpTT04gcXVlcnkKKyAqIFpaSlNPTiAtIENvcHlyaWdodCAoQykgMjAwOCBieSBJdm8gdmFuIFBvb3J0ZW4KKyAqIExpY2Vuc2U6IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMQorICovCisKKyNpbmNsdWRlICJ6empzb24uaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworWlpKU09OICp6empzb25fb2JqZWN0X2ZpbmRfbGFiZWwoWlpKU09OICp6empzb24sIGNoYXIgKmxhYmVsKSB7CisgICAgaWYgKHp6anNvbi0+dHlwZSAhPSBaWkpTT05fT0JKRUNUKSByZXR1cm4gTlVMTDsKKworICAgIHdoaWxlICh6empzb24pIHsKKyAgICAgICAgY2hhciAqc3RyaW5nID0genpqc29uLT52YWx1ZS5vYmplY3QubGFiZWw7CisKKyAgICAgICAgaWYgKHp6anNvbi0+dHlwZSAhPSBaWkpTT05fT0JKRUNUKSByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFzdHJpbmcpICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBpZiAoIXN0cmNtcChzdHJpbmcsIGxhYmVsKSkKKyAgICAgICAgICAgIHJldHVybiB6empzb24tPnZhbHVlLm9iamVjdC52YWw7CisgICAgICAgIHp6anNvbiA9IHp6anNvbi0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1paSlNPTiAqenpqc29uX29iamVjdF9maW5kX2xhYmVscyhaWkpTT04gKnp6anNvbiwgLi4uKSB7CisgICAgdmFfbGlzdCBhcDsKKyAgICBjaGFyICpsYmw7CisKKyAgICB2YV9zdGFydChhcCwgenpqc29uKTsKKyAgICBsYmwgPSB2YV9hcmcoYXAsIGNoYXIgKik7CisgICAgd2hpbGUgKGxibCkgeworICAgICAgICB6empzb24gPSB6empzb25fb2JqZWN0X2ZpbmRfbGFiZWwoenpqc29uLCBsYmwpOworICAgICAgICBpZiAoIXp6anNvbikgYnJlYWs7CisgICAgICAgIGxibCA9IHZhX2FyZyhhcCwgY2hhciAqKTsKKyAgICB9CisgICAgdmFfZW5kKGFwKTsKKworICAgIHJldHVybiB6empzb247Cit9CisKK3Vuc2lnbmVkIGludCB6empzb25fb2JqZWN0X2NvdW50KFpaSlNPTiAqenpqc29uKSB7CisgICAgdW5zaWduZWQgaW50IGNvdW50ID0gMTsKKworICAgIGlmICh6empzb24tPnR5cGUgIT0gWlpKU09OX09CSkVDVCkgcmV0dXJuIDA7CisgICAgaWYgKCF6empzb24tPnZhbHVlLm9iamVjdC5sYWJlbCkgICByZXR1cm4gMDsgLyogZW1wdHkgeyB9ICovCisKKyAgICB3aGlsZSAoKHp6anNvbiA9IHp6anNvbi0+bmV4dCkpIGNvdW50Kys7CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3Vuc2lnbmVkIGludCB6empzb25fYXJyYXlfY291bnQoWlpKU09OICp6empzb24pIHsKKyAgICB1bnNpZ25lZCBpbnQgY291bnQgPSAxOworCisgICAgaWYgKHp6anNvbi0+dHlwZSAhPSBaWkpTT05fQVJSQVkpIHJldHVybiAwOworICAgIGlmICghenpqc29uLT52YWx1ZS5hcnJheS52YWwpICAgICByZXR1cm4gMDsgLyogZW1wdHkgWyBdICovCisKKyAgICB3aGlsZSAoKHp6anNvbiA9IHp6anNvbi0+bmV4dCkpIGNvdW50Kys7CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9NYWtlZmlsZSBiL2NvbTMyL2hkdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYyZDBhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L01ha2VmaWxlCkBAIC0wLDAgKzEsMTQ5IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyMjICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMjIEhhcmR3YXJlIERldGVjdGlvbiBUb29sCisjIworCitWUEFUSCA9ICQoU1JDKQoraW5jbHVkZSAkKE1BS0VESVIpL2VsZi5taworCitMSUJTICAgICAgPSAkKG9iamRpcikvY29tMzIvbGlidXBsb2FkL2xpYmNvbTMydXBsb2FkLmEKK0NfTElCUyAgICArPSAkKG9iamRpcikvY29tMzIvY21lbnUvbGlibWVudS9saWJtZW51LmMzMgorQ0ZMQUdTICAgICs9IC1JJChjb20zMikvY21lbnUvbGlibWVudSAtSSQoY29tMzIpCisKK01PRFVMRVMJICA9IGhkdC5jMzIKK1RFU1RGSUxFUyA9CisKK09CSlMJICA9ICQoc3Vic3QgJChTUkMpLywsJChwYXRzdWJzdCAlLmMsJS5vLCQod2lsZGNhcmQgJChTUkMpLyouYykpKQorVkVSU0lPTiAgID0gJChzaGVsbCAkKFNFRCkgLW4gJ3MvXCNkZWZpbmUgVkVSU0lPTiBcIlwoLipcKVwiL1wxL3AnIGhkdC5oKQorQ09ERU5BTUUgID0gJChzaGVsbCAkKFNFRCkgLW4gJ3MvXCNkZWZpbmUgQ09ERU5BTUUgXCJcKC4qXClcIi9cMS9wJyBoZHQuaCkKK05PREFTSF9WRVJTSU9OID0gJChzaGVsbCBlY2hvICQoVkVSU0lPTikgfCAkKFNFRCkgLWUgJ3MvLS9fL2cnIHwgJChTRUQpIC1lICdzL1wuL18vZycpCitTVU1fRklMRSAgPSBoZHQtJChWRVJTSU9OKS5jaGVja3N1bXMKKworTUVNVEVTVF9VUkwgPSBodHRwOi8vbWVtdGVzdC5vcmcvZG93bmxvYWQvNC4yMC9tZW10ZXN0ODYrLTQuMjAuYmluCitNRU1URVNUICAgICA9IG1lbXRlc3QuYmluCisKK0tFUk5FTF9WRVJTSU9OICAgICAgICAgID89ICQoc2hlbGwgdW5hbWUgLXIpCitNT0RVTEVTX0FMSUFTX0ZJTEUgICAgICA/PSAvbGliL21vZHVsZXMvJChLRVJORUxfVkVSU0lPTikvbW9kdWxlcy5hbGlhcworR1pfTU9EVUxFU19BTElBU19GSUxFICAgPz0gbW9kdWxlcy5hbGlhcy5negorTU9EVUxFU19QQ0lNQVBfRklMRSAgICAgPz0gL2xpYi9tb2R1bGVzLyQoS0VSTkVMX1ZFUlNJT04pL21vZHVsZXMucGNpbWFwCitHWl9NT0RVTEVTX1BDSU1BUF9GSUxFICA/PSBtb2R1bGVzLnBjaW1hcC5negorSVNPX0RJUiAgICAgICAgICAgICAgICAgPz0gaXNvCitJU09MSU5VWF9ESVIgICAgICAgICAgICA/PSBpc29saW51eAorRkxPUFBZX0RJUgkJPz0gZmxvcHB5CitQQ0lfSURTX0ZJTEUgICAgICAgICAgICA/PSAkKFBXRCkvJChGTE9QUFlfRElSKS9wY2kuaWRzCitHWl9QQ0lfSURTX0ZJTEUgICAgICAgICA/PSAkKFBDSV9JRFNfRklMRSkuZ3oKK01FTlVfQ09NMzIgICAgICAgICAgICAgID89ICQoY29tMzIpL21lbnUvbWVudS5jMzIKK0NIQUlOX0NPTTMyICAgICAgICAgICAgID89ICQoY29tMzIpL2NoYWluL2NoYWluLmMzMgorQVJUX0RJUiAgICAgICAgICAgICAgICAgPz0gYXJ0LworUUVNVQkJCT89IHFlbXUta3ZtCisKK2FsbDogJChNT0RVTEVTKSAkKFRFU1RGSUxFUykKKworaGR0LmVsZiA6ICQoT0JKUykgJChMSUJTKSAkKENfTElCUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICReCisKK21lbXRlc3Q6CisJLVsgISAtZiAkKEZMT1BQWV9ESVIpLyQoTUVNVEVTVCkgXSAmJiAkKFdHRVQpICQoTUVNVEVTVF9VUkwpIC1PICQoRkxPUFBZX0RJUikvJChNRU1URVNUKQorCitoZHQuaW1nOiBoZHQuYzMyICQoRkxPUFBZX0RJUikvaGR0LmNmZyAkKEZMT1BQWV9ESVIpL210b29scy5jb25mICQodG9wZGlyKS9tdG9vbHMvc3lzbGludXggJChNRU5VX0NPTTMyKSBtZW10ZXN0ICQoQ0hBSU5fQ09NMzIpCisJcm0gLWYgaGR0Ki5pbWcKKwkkKFNFRCkgLWUgJ3MvJVZFUlNJT04lLyQoVkVSU0lPTikvZycgJChGTE9QUFlfRElSKS9oZHQuY2ZnIHxcCisJJChTRUQpIC1lICdzLyVDT0RFTkFNRSUvJChDT0RFTkFNRSkvZycgPiAkKEZMT1BQWV9ESVIpL3N5c2xpbnV4LmNmZworCU1UT09MU1JDPSQoUFdEKS8kKEZMT1BQWV9ESVIpL210b29scy5jb25mICQoTUZPUk1BVCkgLXYgSERUXyQoTk9EQVNIX1ZFUlNJT04pIC1mIDE0NDAgLUMgYToKKwkkKHRvcGRpcikvbXRvb2xzL3N5c2xpbnV4IGhkdC5pbWcKKwktWyAhIC1mICQoR1pfUENJX0lEU19GSUxFKSBdICYmIGNwIC91c3Ivc2hhcmUvaHdkYXRhL3BjaS5pZHMgJChQQ0lfSURTX0ZJTEUpICYmICQoR1pJUFBST0cpICQoUENJX0lEU19GSUxFKQorCS1bICEgLWYgJChHWl9QQ0lfSURTX0ZJTEUpIF0gJiYgY3AgL3Vzci9zaGFyZS9wY2kuaWRzICQoUENJX0lEU19GSUxFKSAmJiAkKEdaSVBQUk9HKSAkKFBDSV9JRFNfRklMRSkKKwktWyAtZiAkKE1PRFVMRVNfQUxJQVNfRklMRSkgXSAmJiAgY2F0ICQoTU9EVUxFU19BTElBU19GSUxFKSB8ICQoR1pJUFBST0cpIC0gLWYgfCBNVE9PTFNSQz0kKFBXRCkvJChGTE9QUFlfRElSKS9tdG9vbHMuY29uZiAkKE1DT1BZKSAtIGE6bW9kdWxlcy5hbGlhcworCS1bIC1mICQoTU9EVUxFU19QQ0lNQVBfRklMRSkgXSAmJiBjYXQgJChNT0RVTEVTX1BDSU1BUF9GSUxFKSB8ICQoR1pJUFBST0cpIC0gLWYgfCBNVE9PTFNSQz0kKFBXRCkvJChGTE9QUFlfRElSKS9tdG9vbHMuY29uZiAkKE1DT1BZKSAtIGE6bW9kdWxlcy5wY2ltYXAKKwlNVE9PTFNSQz0kKFBXRCkvJChGTE9QUFlfRElSKS9tdG9vbHMuY29uZiAkKE1DT1BZKSBoZHQuYzMyIGE6CisJTVRPT0xTUkM9JChQV0QpLyQoRkxPUFBZX0RJUikvbXRvb2xzLmNvbmYgJChNQ09QWSkgJChNRU5VX0NPTTMyKSBhOgorCU1UT09MU1JDPSQoUFdEKS8kKEZMT1BQWV9ESVIpL210b29scy5jb25mICQoTUNPUFkpICQoQ0hBSU5fQ09NMzIpIGE6CisJQCBbIC1mICQoR1pfUENJX0lEU19GSUxFKSBdICYmIE1UT09MU1JDPSQoUFdEKS8kKEZMT1BQWV9ESVIpL210b29scy5jb25mICQoTUNPUFkpICQoR1pfUENJX0lEU19GSUxFKSBhOnBjaS5pZHMgfHwgcHJpbnRmICJcblRoZSAkKEdaX1BDSV9JRFNfRklMRSkgZmlsZSBpcyBtaXNzaW5nIGFuZCBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly9wY2lpZHMuc291cmNlZm9yZ2UubmV0IGFuZCBnemlwcGVkIGluXG50aGUgLi9jb20zMi9oZHQvJChGTE9QUFlfRElSKSBkaXJlY3Rvcnkgb2YgdGhlIGV4dHJhY3RlZCBTeXNsaW51eCBzb3VyY2UuXG5cbiIKKwlNVE9PTFNSQz0kKFBXRCkvJChGTE9QUFlfRElSKS9tdG9vbHMuY29uZiAkKE1DT1BZKSAkKEZMT1BQWV9ESVIpL3N5c2xpbnV4LmNmZyBhOgorCU1UT09MU1JDPSQoUFdEKS8kKEZMT1BQWV9ESVIpL210b29scy5jb25mICQoTUNPUFkpICQoRkxPUFBZX0RJUikvJChNRU1URVNUKSBhOgorCU1UT09MU1JDPSQoUFdEKS8kKEZMT1BQWV9ESVIpL210b29scy5jb25mICQoTUNPUFkpICQoQVJUX0RJUikvYmFja2duZC5wbmcgYToKKwlNVE9PTFNSQz0kKFBXRCkvJChGTE9QUFlfRElSKS9tdG9vbHMuY29uZiAkKE1DT1BZKSAkKEFSVF9ESVIpL2Rpc3BsYXkucG5nIGE6CisJTVRPT0xTUkM9JChQV0QpLyQoRkxPUFBZX0RJUikvbXRvb2xzLmNvbmYgJChNQ09QWSkgJChBUlRfRElSKS9yZWQucG5nIGE6CisJbXYgaGR0LmltZyBoZHQtJChWRVJTSU9OKS5pbWcKKwlsbiAtc2YgaGR0LSQoVkVSU0lPTikuaW1nIGhkdC5pbWcKKworaGR0LmltZy5nejogaGR0LmltZworCXJtIC1yZiBoZHQqLmltZy5negorCSQoR1pJUFBST0cpIC1jIGhkdC0kKFZFUlNJT04pLmltZyA+aGR0LSQoVkVSU0lPTikuaW1nLmd6CisJbG4gLXNmIGhkdC0kKFZFUlNJT04pLmltZy5neiBoZHQuaW1nLmd6CisKK2hkdC5pc286IGhkdC5jMzIgJCh0b3BkaXIpL2NvcmUvaXNvbGludXguYmluICQoRkxPUFBZX0RJUikvaGR0LmNmZyBtZW10ZXN0CisJcm0gLXJmICQoSVNPX0RJUikKKwlybSAtZiBoZHQuaXNvCisJbWtkaXIgLXAgJChJU09fRElSKS8kKElTT0xJTlVYX0RJUikKKwljcCAkKHRvcGRpcikvY29yZS9pc29saW51eC5iaW4gJChJU09fRElSKS8kKElTT0xJTlVYX0RJUikKKwkkKFNFRCkgLWUgJ3MvJVZFUlNJT04lLyQoVkVSU0lPTikvZycgJChGTE9QUFlfRElSKS9oZHQuY2ZnIHxcCisJCSQoU0VEKSAtZSAncy8lQ09ERU5BTUUlLyQoQ09ERU5BTUUpL2cnID4gJChJU09fRElSKS8kKElTT0xJTlVYX0RJUikvaXNvbGludXguY2ZnCisJY3AgaGR0LmMzMiAkKElTT19ESVIpLyQoSVNPTElOVVhfRElSKQorCWNwICQoRkxPUFBZX0RJUikvJChNRU1URVNUKSAkKElTT19ESVIpLyQoSVNPTElOVVhfRElSKQorCWNwICQoTUVOVV9DT00zMikgJChJU09fRElSKS8kKElTT0xJTlVYX0RJUikKKwljcCAkKENIQUlOX0NPTTMyKSAkKElTT19ESVIpLyQoSVNPTElOVVhfRElSKQorCWNwIC1hdiAkKEFSVF9ESVIpL2JhY2tnbmQucG5nICQoSVNPX0RJUikvJChJU09MSU5VWF9ESVIpCisJY3AgLWF2ICQoQVJUX0RJUikvZGlzcGxheS5wbmcgJChJU09fRElSKS8kKElTT0xJTlVYX0RJUikKKwljcCAtYXYgJChBUlRfRElSKS9yZWQucG5nICQoSVNPX0RJUikvJChJU09MSU5VWF9ESVIpCisJLVsgISAtZiAkKEdaX1BDSV9JRFNfRklMRSkgXSAmJiBjcCAvdXNyL3NoYXJlL2h3ZGF0YS9wY2kuaWRzICQoUENJX0lEU19GSUxFKSAmJiAkKEdaSVBQUk9HKSAkKFBDSV9JRFNfRklMRSkKKwktWyAhIC1mICQoR1pfUENJX0lEU19GSUxFKSBdICYmIGNwIC91c3Ivc2hhcmUvcGNpLmlkcyAkKFBDSV9JRFNfRklMRSkgJiYgJChHWklQUFJPRykgJChQQ0lfSURTX0ZJTEUpCisJLVsgLWYgJChNT0RVTEVTX0FMSUFTX0ZJTEUpIF0gJiYgY3AgJChNT0RVTEVTX0FMSUFTX0ZJTEUpICQoSVNPX0RJUikvJChJU09MSU5VWF9ESVIpXAorCSAgICAgICAJJiYgJChHWklQUFJPRykgJChJU09fRElSKS8kKElTT0xJTlVYX0RJUikvbW9kdWxlcy5hbGlhc1wKKwkJJiYgbXYgJChJU09fRElSKS8kKElTT0xJTlVYX0RJUikvbW9kdWxlcy5hbGlhcy5neiAkKElTT19ESVIpLyQoSVNPTElOVVhfRElSKS9tb2R1bGVzLmFsaWFzCisJLVsgLWYgJChNT0RVTEVTX1BDSU1BUF9GSUxFKSBdICYmIGNwICQoTU9EVUxFU19QQ0lNQVBfRklMRSkgJChJU09fRElSKS8kKElTT0xJTlVYX0RJUilcCisJCSYmICQoR1pJUFBST0cpICQoSVNPX0RJUikvJChJU09MSU5VWF9ESVIpL21vZHVsZXMucGNpbWFwXAorCQkmJiBtdiAkKElTT19ESVIpLyQoSVNPTElOVVhfRElSKS9tb2R1bGVzLnBjaW1hcC5neiAkKElTT19ESVIpLyQoSVNPTElOVVhfRElSKS9tb2R1bGVzLnBjaW1hcAorCS1bICEgLWYgJChJU09fRElSKS8kKElTT0xJTlVYX0RJUikvcGNpLmlkcy5neiBdICYmIGNwICQoR1pfUENJX0lEU19GSUxFKSAkKElTT19ESVIpLyQoSVNPTElOVVhfRElSKS9wY2kuaWRzCisJLVsgISAtZiAkKElTT19ESVIpLyQoSVNPTElOVVhfRElSKS9wY2kuaWRzIF0gJiYgcHJpbnRmICJcblRoZSAkKEZMT1BQWV9ESVIpL3BjaS5pZHMgZmlsZSBpcyBtaXNzaW5nIGFuZCBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly9wY2lpZHMuc291cmNlZm9yZ2UubmV0IGFuZCBwdXQgaW5cbnRoZSAuL2NvbTMyL2hkdC8kKEZMT1BQWV9ESVIpIGRpcmVjdG9yeSBvZiB0aGUgZXh0cmFjdGVkIFN5c2xpbnV4IHNvdXJjZS5cblxuIgorCSQoTUtJU09GUykgLW8gaGR0LmlzbyAtYiAkKElTT0xJTlVYX0RJUikvaXNvbGludXguYmluIC1jICQoSVNPTElOVVhfRElSKS9ib290LmNhdCBcCisJCS1uby1lbXVsLWJvb3QgLWJvb3QtbG9hZC1zaXplIDQgLWJvb3QtaW5mby10YWJsZSBcCisJCSQoSVNPX0RJUikKKwltdiBoZHQuaXNvIGhkdC0kKFZFUlNJT04pLmlzbworCWxuIC1zZiBoZHQtJChWRVJTSU9OKS5pc28gaGR0LmlzbworCitoZHQtaHlicmlkLmlzbzogaGR0LmlzbyAuLi8uLi91dGlscy9pc29oeWJyaWQKKwljcCBoZHQtJChWRVJTSU9OKS5pc28gaGR0LWh5YnJpZC0kKFZFUlNJT04pLmlzbworCS4uLy4uL3V0aWxzL2lzb2h5YnJpZCAtLXBhcnRvayBoZHQtaHlicmlkLSQoVkVSU0lPTikuaXNvCisJbG4gLXNmIGhkdC1oeWJyaWQtJChWRVJTSU9OKS5pc28gaGR0LWh5YnJpZC5pc28KKworcmVsZWFzZTogc3BvdGxlc3MgaGR0LmMzMiBoZHQuaW1nIGhkdC5pbWcuZ3ogaGR0LmlzbyBoZHQtaHlicmlkLmlzbworCW12IGhkdC5jMzIgaGR0XyQoTk9EQVNIX1ZFUlNJT04pLmMzMgorCW1kNXN1bSBoZHRfJChOT0RBU0hfVkVSU0lPTikuYzMyID4kKFNVTV9GSUxFKQorCW1kNXN1bSBoZHQtJChWRVJTSU9OKS5pc28gPj4kKFNVTV9GSUxFKQorCW1kNXN1bSBoZHQtaHlicmlkLSQoVkVSU0lPTikuaXNvID4+JChTVU1fRklMRSkKKwltZDVzdW0gaGR0LSQoVkVSU0lPTikuaW1nID4+JChTVU1fRklMRSkKKwltZDVzdW0gaGR0LSQoVkVSU0lPTikuaW1nLmd6ID4+JChTVU1fRklMRSkKKwordGVzdDogaGR0LmltZworCSQoUUVNVSkgLWZkYSBoZHQuaW1nCisKK3RpZHkgZGlzdDoKKwlybSAtZiAqLm8gKi5sbyAqLmEgKi5sc3QgKi5lbGYgLiouZCAqLnRtcAorCitjbGVhbjogdGlkeQorCXJtIC1mICoubG54CisKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICoubHNzICouYzMyICouY29tIGhkdCouaW1nIGhkdCouaXNvIGhkdCouaW1nLmd6CisJcm0gLXJmICQoSVNPX0RJUikKKwlybSAtcmYgJChGTE9QUFlfRElSKS8kKE1FTVRFU1QpCisJcm0gLXJmICQoRkxPUFBZX0RJUikvcGNpLmlkcyoKKwlybSAtcmYgaGR0LSpjaGVja3N1bXMKKwlybSAtZiAqfiBcIyoKKworaW5zdGFsbDoKKworLWluY2x1ZGUgLiouZApkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L1JFQURNRSBiL2NvbTMyL2hkdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxNzE2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9SRUFETUUKQEAgLTAsMCArMSwxOSBAQAorLS0tLS0tLS0tLS0tLS0KK0NvbXBpbGluZyBIRFQKKy0tLS0tLS0tLS0tLS0tCitUbyBidWlsZCBIRFQsIHlvdSBqdXN0IGhhdmUgdG8gZG8gYSAibWFrZSIgY2FsbCBpbiB0aGlzIGRpcmVjdG9yeS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDcmVhdGluZyBhIGJvb3RhYmxlIGZsb3BweQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RvIGJ1aWxkIGEgYm9vdGFibGUgSERUIGZsb3BweSBpbWFnZSwgeW91IGNhbiBkbyBhICJtYWtlIGhkdC5pbWciIGNhbGwuCitUaGlzIHdpbGwgcmVxdWlyZXMgdGhlIG10b29scyAoaHR0cDovL210b29scy5saW51eC5sdSkgdG8gYmUgaW5zdGFsbGVkLgorVGhlIHNjcmlwdCB3aWxsIHRyeSB0byBwaWNrIHNldmVyYWwgZmlsZXMgZnJvbSB5b3VyIHN5c3RlbSA6CistIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL21vZHVsZXMuYWxpYXMKKy0gL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAvbW9kdWxlcy5wY2ltYXAKKy0gL3Vzci9zaGFyZS9wY2kuaWRzIG9yIC91c3Ivc2hhcmUvaHdkYXRhL3BjaS5pZHMKKworVGhpcyBwYXRocyBjYW4gYmUgb3ZlcnJpZGVkIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmU6CittYWtlIE1PRFVMRVNfQUxJQVNfRklMRT0kKFBXRCkvZmxvcHB5L21vZHVsZXMuYWxpYXMgTU9EVUxFU19QQ0lNQVBfRklMRT0kKFBXRCkvZmxvcHB5L21vZHVsZXMucGNpbWFwIFBDSV9JRFNfRklMRT0kKFBXRCkvZmxvcHB5L3BjaS5pZHMgaGR0LmltZworCitJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgcGNpLmlkcywgcGxlYXNlIGRvd25sb2FkIGl0IGZyb20gaHR0cDovL3BjaWlkcy5zb3VyY2Vmb3JnZS5uZXQvIGFuZCBwdXQgaXQgaW50byB0aGUgZmxvcHB5LyBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9jb20zMi9oZHQvYXJ0L0hEVC5haSBiL2NvbTMyL2hkdC9hcnQvSERULmFpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTNmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvYXJ0L0hEVC5haQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb20zMi9oZHQvYXJ0L0hEVC5zdmcgYi9jb20zMi9oZHQvYXJ0L0hEVC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyYThkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9hcnQvSERULnN2ZwpAQCAtMCwwICsxLDUzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTQuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCA0MzM2MykgIC0tPg0KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQorPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCisJIHdpZHRoPSIxMjgwcHgiIGhlaWdodD0iNzIwcHgiIHZpZXdCb3g9IjAgMCAxMjgwIDcyMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTI4MCA3MjAiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KKzxyZWN0IGZpbGw9IiMyQzMyMzgiIHdpZHRoPSIxMjgwIiBoZWlnaHQ9IjcyMCIvPg0KKzxnPg0KKwk8Zz4NCisJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTQ1LjA4NjQiIHkxPSI0ODkuNjIzIiB4Mj0iNjA2LjE5MTkiIHkyPSI0ODkuNjIzIj4NCisJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwkJPC9saW5lYXJHcmFkaWVudD4NCisJCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNNTYwLjkyNyw1MTUuNzJjMC4xMjgsMS4yODcsMC4zODYsMi4yODUsMC43NzEsMi45OTJjMC4zODYsMC43MDcsMC44MiwxLjIzOCwxLjMwMywxLjU5Mg0KKwkJCWMwLjQ4MiwwLjM1NCwwLjk3MiwwLjYxMSwxLjQ3MSwwLjc3MWMwLjQ5OSwwLjE2LDAuOTU3LDAuMzQ2LDEuMzc1LDAuNTU1YzAuNDE3LDAuMjA5LDAuNzQ3LDAuNTA2LDAuOTg5LDAuODkzDQorCQkJYzAuMjQxLDAuMzg1LDAuMzQ0LDAuOTgsMC4zMTIsMS43ODVoLTIyLjA0NGMtMC4wNjUtMC44NjksMC4wNDEtMS40OTYsMC4zMTMtMS44ODFjMC4yNzItMC4zODcsMC42NDQtMC42ODYsMS4xMS0wLjg5Mw0KKwkJCWMwLjQ2Ni0wLjIwOSwwLjk3Mi0wLjQwMiwxLjUxOS0wLjU4YzAuNTQ3LTAuMTc2LDEuMDY5LTAuNTA2LDEuNTY4LTAuOTg4YzAuNDk4LTAuNDgyLDAuOTE2LTEuMTkxLDEuMjU0LTIuMTIzDQorCQkJYzAuMzM3LTAuOTMyLDAuNTIyLTIuMjUsMC41NTUtMy45NTVoMC4wNDh2LTQ5LjY0aC0wLjA0OGMtMC4wOTctMS40NDUtMC4zMjItMi41NzEtMC42NzUtMy4zNzUNCisJCQljLTAuMzU1LTAuODA1LTAuNzY1LTEuNDA3LTEuMjMxLTEuODFjLTAuNDY2LTAuNDAxLTAuOTY1LTAuNjktMS40OTUtMC44NjdjLTAuNTMxLTAuMTc3LTEuMDEzLTAuMzYyLTEuNDQ4LTAuNTU1DQorCQkJYy0wLjQzNC0wLjE5My0wLjc4OC0wLjQ2Ny0xLjA2MS0wLjgyYy0wLjI3Mi0wLjM1NC0wLjM5My0wLjkxNy0wLjM2MS0xLjY4OGMwLTAuMDY0LDAtMC4xMiwwLTAuMTcNCisJCQljMC0wLjA0NywwLjExMi0wLjA3MSwwLjMzNy0wLjA3MWgyMS40MThjMC4xNiwwLDAuMjQ4LDAuMDMxLDAuMjY1LDAuMDk3YzAuMDE2LDAuMDY0LDAuMDIzLDAuMTI4LDAuMDIzLDAuMTkyDQorCQkJYzAsMC43NC0wLjEyOCwxLjI4Ny0wLjM4NiwxLjY0MWMtMC4yNTgsMC4zNTQtMC42MDMsMC42MjctMS4wMzcsMC44MmMtMC40MzUsMC4xOTItMC45MDEsMC4zNjktMS4zOTksMC41Mw0KKwkJCWMtMC41LDAuMTYxLTAuOTgyLDAuNDM1LTEuNDQ3LDAuODJjLTAuNDY2LDAuMzg1LTAuODg1LDAuOTU2LTEuMjU0LDEuNzEyYy0wLjM3LDAuNzU2LTAuNjAzLDEuODEtMC42OTksMy4xNmgtMC4wNDhWNTE1Ljcyeg0KKwkJCSBNNTk5LjgwNyw1MTQuOTQ4YzAuMDk3LDEuNDQ3LDAuMzIsMi41NzIsMC42NzUsMy4zNzdzMC43NjUsMS40MDgsMS4yMywxLjgwOWMwLjQ2NiwwLjQwNCwwLjk2NSwwLjY5MSwxLjQ5NSwwLjg2OQ0KKwkJCWMwLjUzLDAuMTc2LDEuMDE0LDAuMzYxLDEuNDQ3LDAuNTU1YzAuNDM1LDAuMTkzLDAuNzg4LDAuNDc1LDEuMDYxLDAuODQ0YzAuMjczLDAuMzcxLDAuNDEsMC45NDEsMC40MSwxLjcxMw0KKwkJCWMwLDAuMDMxLTAuMDA3LDAuMDgtMC4wMjMsMC4xNDVzLTAuMTM4LDAuMDk2LTAuMzYxLDAuMDk2Yy0zLjQwOSwwLTYuODM0LDAtMTAuMjc1LDBzLTcuMTU2LTAuMDE2LTExLjE0My0wLjA0Nw0KKwkJCWMtMC4xNjEsMC0wLjI1LTAuMDMzLTAuMjY1LTAuMDk2Yy0wLjAxNy0wLjA2Ni0wLjA0MS0wLjEzMS0wLjA3My0wLjE5NWMwLTAuNzM4LDAuMTM3LTEuMjg1LDAuNDEtMS42MzkNCisJCQljMC4yNzMtMC4zNTQsMC42MTktMC42MjcsMS4wMzctMC44MmMwLjQxNy0wLjE5MywwLjg4NS0wLjM2OSwxLjM5OS0wLjUzMWMwLjUxNC0wLjE2LDEuMDA0LTAuNDM0LDEuNDcxLTAuODINCisJCQlzMC44ODUtMC45NTcsMS4yNTQtMS43MTFjMC4zNjktMC43NTgsMC42MTktMS44MDksMC43NDgtMy4xNnYtMjMuNDkzSDU2NC40Yy0wLjcwOCwwLTEuMDg1LTAuMjAxLTEuMTMzLTAuNjAyDQorCQkJYy0wLjA0OC0wLjQwNCwwLjE1Mi0wLjkxLDAuNjAzLTEuNTIxYzAuNDUtMC42MTEsMS4xMDItMS4yNywxLjk1NC0xLjk3N2MwLjg1Mi0wLjcwNywxLjg0OS0xLjM3NywyLjk5MS0yLjAwMg0KKwkJCWMxLjE0MS0wLjYyNywyLjM5NS0xLjE0MywzLjc2Mi0xLjU0NWMxLjM2Ny0wLjQwMiwyLjc1Ny0wLjYwNCw0LjE3Mi0wLjYwNGMxLjU0NCwwLDIuNzksMCwzLjczOSwwczEuNzI5LDAsMi4zNCwwDQorCQkJYzAuNjEsMCwxLjEwMS0wLjAwOCwxLjQ3LTAuMDIzYzAuMzctMC4wMTgsMC43NC0wLjAzMSwxLjExLTAuMDQ3YzAuMzY5LTAuMDE4LDAuNzk2LTAuMDMzLDEuMjc4LTAuMDQ5DQorCQkJYzAuNDgyLTAuMDE4LDEuMTQxLTAuMDQxLDEuOTc5LTAuMDcyYzAuNjQzLTAuMDMzLDEuMDc3LTAuMjE3LDEuMzAyLTAuNTU3YzAuMjI0LTAuMzM2LDAuMzU0LTAuNjE3LDAuMzg3LTAuODQ0bC0wLjA0OS0xOC40MjUNCisJCQljLTAuMTYyLTEuMjg3LTAuNDI3LTIuMjg0LTAuNzk2LTIuOTkxYy0wLjM3LTAuNzA3LTAuNzk2LTEuMjQ3LTEuMjc4LTEuNjE3Yy0wLjQ4Mi0wLjM3LTAuOTgyLTAuNjI3LTEuNDk2LTAuNzcxDQorCQkJYy0wLjUxNC0wLjE0Ni0wLjk3My0wLjMyMi0xLjM3NS0wLjUzYy0wLjQwMi0wLjIxMS0wLjczMi0wLjQ5OS0wLjk4OS0wLjg2OGMtMC4yNTgtMC4zNy0wLjM1NC0wLjk3NC0wLjI5LTEuODFsMjIuMDkzLDAuMDQ5DQorCQkJYzAuMDY0LDAuODY3LTAuMDQ5LDEuNDk0LTAuMzM4LDEuODgxYy0wLjI4OSwwLjM4Ni0wLjY2OCwwLjY3NC0xLjEzMywwLjg2OGMtMC40NjcsMC4xOTMtMC45NzQsMC4zNzctMS41MjEsMC41NTQNCisJCQlzLTEuMDY4LDAuNS0xLjU2NywwLjk2NWMtMC40OTksMC40NjctMC45MTYsMS4xNjctMS4yNTQsMi4wOTljLTAuMzM4LDAuOTM0LTAuNTIzLDIuMjUyLTAuNTU1LDMuOTU2VjUxNC45NDh6Ii8+DQorCTwvZz4NCisJPGc+DQorCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzJfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjY3Ny40Mjk3IiB5MT0iNTA5LjAyNzMiIHgyPSI3MzIuNzQyNiIgeTI9IjQ1My43MTQ1Ij4NCisJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwkJPC9saW5lYXJHcmFkaWVudD4NCisJCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfMl8pIiBkPSJNNzM0LjQxMSw0NTUuNDdjMC40MzQsMC4yMjYsMC41ODcsMC41NDgsMC40NTksMC45NjVjLTAuMTI5LDAuNDE5LTAuNDk5LDAuOTI0LTEuMTA5LDEuNTIxDQorCQkJYy0wLjYxMSwwLjU5NS0xLjMyLDEuMjQ1LTIuMTIzLDEuOTUzYy0xLjQ0NywxLjIyMi0yLjk5LDIuMTcxLTQuNjMxLDIuODQ2cy0zLjIxNywwLjk4MS00LjcyOSwwLjkxOGgwLjA1aC0xNC4yNzl2NTAuNjk4DQorCQkJYzAuMDY1LDEuNjA3LDAuMjY2LDIuODQ2LDAuNjAzLDMuNzE1YzAuMzM4LDAuODY3LDAuNzQsMS41MjcsMS4yMDgsMS45NzljMC40NjQsMC40NDksMC45NjQsMC43NjIsMS40OTQsMC45MzkNCisJCQljMC41MzEsMC4xNzYsMS4wMTMsMC4zNjksMS40NDYsMC41NzhjMC40MzYsMC4yMTEsMC43ODgsMC41LDEuMDYyLDAuODY3YzAuMjcyLDAuMzcxLDAuMzc5LDAuOTksMC4zMTUsMS44NTloLTkuNDU2aC01LjU5Ng0KKwkJCWMtMC43NCwwLTEuNDY0LDAtMi4xNzEsMHMtMS4zNTktMC4wMS0xLjk1My0wLjAyNWMtMC41OTYtMC4wMTYtMS4xMDQtMC4wMjMtMS41MjEtMC4wMjNjLTAuNDE4LDAtMC42OTEsMC0wLjgxOSwwDQorCQkJYy0wLjA2Ni0wLjg2OSwwLjA0MS0xLjQ4NiwwLjMxNC0xLjg1N2MwLjI3MS0wLjM2OSwwLjYyNi0wLjY1LDEuMDYxLTAuODQ0YzAuNDM0LTAuMTkzLDAuOTA4LTAuMzc5LDEuNDIyLTAuNTU1DQorCQkJYzAuNTE0LTAuMTc4LDEuMDE0LTAuNDgyLDEuNDk2LTAuOTE2czAuODk5LTEuMDcsMS4yNTQtMS45MDZjMC4zNTQtMC44MzYsMC41NjMtMi4wNDEsMC42MjctMy42MTd2LTUwLjg5MmgtNy41MjVoLTE1Ljc3Mg0KKwkJCWMtMS4zMTksMC0yLjIwMi0wLjExMy0yLjY1NC0wLjMzOWMtMC40NDktMC4yMjUtMC42MDMtMC41NDYtMC40NTgtMC45NjRjMC4xNDUtMC40MTksMC41MjMtMC45MTYsMS4xMzQtMS40OTYNCisJCQljMC42MTEtMC41NzgsMS4zMzUtMS4yMzgsMi4xNzEtMS45NzljMS40NDYtMS4yMjIsMi45OTgtMi4xNyw0LjY1NC0yLjg0NnMzLjIyNS0wLjk4LDQuNzA0LTAuOTE2YzAuNTc4LDAsMS42ODgsMCwzLjMyOSwwDQorCQkJYzEuNjM5LDAsMy42MDEsMCw1Ljg4NSwwYzIuMjgyLDAsNC43OTksMCw3LjU0OSwwczUuNTIyLDAsOC4zMiwwaDIxLjcwOEM3MzMuMTMzLDQ1NS4xMzMsNzMzLjk3OCw0NTUuMjQ1LDczNC40MTEsNDU1LjQ3eiIvPg0KKwk8L2c+DQorCTxnPg0KKwkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8zXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI2MTQuNDIzMyIgeTE9IjQ4OS41NTY2IiB4Mj0iNjcxLjQ0MTQiIHkyPSI0ODkuNTU2NiI+DQorCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNEMEQyRDMiLz4NCisJCTwvbGluZWFyR3JhZGllbnQ+DQorCQk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzNfKSIgZD0iTTY2Ny44NzIsNDcyLjQ5NmMxLjQ0NywyLjUxLDIuNDA0LDUuMjYsMi44NjksOC4yNTJjMC40NjcsMi45OSwwLjcsNi4wNjEsMC43LDkuMjEzDQorCQkJYzAsNi4yMzctMS41MTIsMTEuOTMxLTQuNTM1LDE3LjA3NWMtMi45OSw1LjExNS03LjI2OCw5LjMxMi0xMi44MywxMi41OTJjLTIuNjA1LDEuNTEyLTUuNzA5LDIuNjU0LTkuMzExLDMuNDI2DQorCQkJYy0wLjkzMywwLjE5My0xLjk3OCwwLjM2OS0zLjEzNiwwLjUyOWMtMS4xNTgsMC4xNi0yLjI3NiwwLjI5Ny0zLjM1MywwLjQxcy0yLjAyNSwwLjIwMS0yLjg0NywwLjI2Ng0KKwkJCWMtMC44MTgsMC4wNjQtMS4zNTcsMC4wOTYtMS42MTUsMC4wOTZjLTAuNDUsMC0wLjktMC4wMDYtMS4zNTItMC4wMjNjLTAuNDQ5LTAuMDE2LTAuNjc0LTAuMjUtMC42NzQtMC42OTkNCisJCQljMC0wLjI4OSwwLjE0NS0wLjc3MywwLjQzNC0xLjQ0N2MwLjI4OS0wLjY3NiwwLjc0OC0xLjM5OCwxLjM3NS0yLjE3MmMwLjYyOC0wLjc3LDEuNDMxLTEuNTEyLDIuNDEzLTIuMjE5DQorCQkJYzAuOTc5LTAuNzA3LDIuMTc2LTEuMjM4LDMuNTkzLTEuNTkyYzEuODAxLTAuNjQzLDMuMzIxLTEuMTU2LDQuNTU5LTEuNTQzYzEuMjM4LTAuMzg1LDIuMzcxLTAuODA1LDMuNC0xLjI1NA0KKwkJCXMyLjAzMy0xLjAxNCwzLjAxNS0xLjY4OGMwLjk4LTAuNjc2LDIuMTE0LTEuNjA5LDMuNDAxLTIuNzk5YzIuNjA0LTIuNDEyLDQuNjEzLTUuMjA5LDYuMDI5LTguMzkzDQorCQkJYzEuNDE1LTMuMTg2LDIuMTIyLTYuNzM5LDIuMTIyLTEwLjY2MWMwLTEuOTk2LTAuMTA0LTMuOTQ3LTAuMzEzLTUuODYzYy0wLjIwOS0xLjkxMi0wLjU2My0zLjczLTEuMDYxLTUuNDQ5DQorCQkJYy0wLjUtMS43MjEtMS4xODItMy4zMy0yLjA1MS00LjgyNHMtMS45Ni0yLjgzOC0zLjI3OS00LjAyN2MtMS4wOTQtMS4wOTQtMi41MjQtMi4xLTQuMjkzLTMuMDE2cy0zLjY1LTEuNjg5LTUuNjQ1LTIuMzE2DQorCQkJYy0xLjk5NS0wLjYyNy00LjAwNC0xLjExNi02LjAzMS0xLjQ3MWMtMi4wMjUtMC4zNTQtMy44NTEtMC41MzgtNS40NzUtMC41NTVjLTEuNjI0LTAuMDE2LTIuOTUxLDAuMTYtMy45NzksMC41MzENCisJCQljLTEuMDMsMC4zNy0xLjU0NSwwLjk1Ny0xLjU0NSwxLjc2bDAuMDQ5LDQ4LjcyMmgwLjA0OHYxMC45NTFoLTE0LjEzM2MwLTAuNjQ1LDAuMTItMS4xMjUsMC4zNjEtMS40NDkNCisJCQljMC4yNDEtMC4zMiwwLjUzOC0wLjU3LDAuODkyLTAuNzQ2YzAuMzU1LTAuMTc4LDAuNzQxLTAuMzA1LDEuMTU5LTAuMzg3YzAuNDE3LTAuMDgsMC44MTItMC4yMDEsMS4xODEtMC4zNjENCisJCQljMC4zNy0wLjE2LDAuNjkyLTAuMzk1LDAuOTY2LTAuNjk5YzAuMjcyLTAuMzA1LDAuNDU4LTAuNzY0LDAuNTU1LTEuMzc1YzAtMS44NjUsMC00LjExNSwwLTYuNzUyDQorCQkJYzAtMi42MzktMC4wMDktNS40OTItMC4wMjQtOC41NjRjLTAuMDE4LTMuMDctMC4wMjQtNi4yNTQtMC4wMjQtOS41NTJjMC0zLjI5NSwwLTYuNTM1LDAtOS43MTlzLTAuMDA4LTYuMjE3LTAuMDIzLTkuMDk0DQorCQkJYy0wLjAxNy0yLjg3OS0wLjAyNC01LjQ0My0wLjAyNC03LjY5M2MwLTIuMjUyLDAuMDA4LTQuMDc3LDAuMDI0LTUuNDc2YzAuMDE2LTEuMzk3LDAuMDIzLTIuMjExLDAuMDIzLTIuNDM2DQorCQkJYzAuMDMyLTEuMTU3LDAuNTk2LTIuMDk5LDEuNjg4LTIuODIzYzEuMDkzLTAuNzIzLDIuNDY4LTEuMjc3LDQuMTI0LTEuNjYzczMuNDk3LTAuNjE5LDUuNTIzLTAuNjk5DQorCQkJYzIuMDI3LTAuMDgsNC4wMDQtMC4wOCw1LjkzNSwwYzEuOTI5LDAuMDgsMy43MTQsMC4yMTgsNS4zNTQsMC40MWMxLjY0MSwwLjE5MiwyLjg5NSwwLjQwMSwzLjc2MywwLjYyOA0KKwkJCWMxLjQ3OSwwLjQ0OSwzLjIsMS4wOTEsNS4xNjEsMS45MjljMS45NjEsMC44MzUsMy45NjMsMS45MjksNi4wMDYsMy4yNzljMi4wNDMsMS4zNTIsNC4wMiwyLjk2Nyw1LjkzNCw0Ljg0OQ0KKwkJCUM2NjQuODg4LDQ2Ny43OTUsNjY2LjUyMSw0NjkuOTksNjY3Ljg3Miw0NzIuNDk2eiIvPg0KKwk8L2c+DQorPC9nPg0KKzxnPg0KKwk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzRfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwNS4wNjY0IiB5MT0iNTQ0LjgwMDgiIHgyPSI1MTAuNzQxIiB5Mj0iNTQ0LjgwMDgiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzRfKSIgZD0iTTUwOS4xMzIsNTUxLjQ5OWMwLjAzMywwLjMzLDAuMDk5LDAuNTg0LDAuMTk4LDAuNzY2czAuMjEsMC4zMTgsMC4zMzQsMC40MQ0KKwkJYzAuMTI0LDAuMDksMC4yNSwwLjE1NiwwLjM3OCwwLjE5N2MwLjEyNywwLjA0MSwwLjI0NiwwLjA4OCwwLjM1MywwLjE0M2MwLjEwNywwLjA1NSwwLjE5MiwwLjEyOSwwLjI1MywwLjIyOQ0KKwkJYzAuMDYyLDAuMSwwLjA4OSwwLjI1MiwwLjA4MSwwLjQ1N2gtNS42NThjLTAuMDE3LTAuMjIxLDAuMDExLTAuMzgzLDAuMDgtMC40OGMwLjA3LTAuMSwwLjE2NS0wLjE3OCwwLjI4Ni0wLjIzDQorCQljMC4xMTktMC4wNTMsMC4yNDktMC4xMDIsMC4zOS0wLjE0OGMwLjE0LTAuMDQ1LDAuMjc0LTAuMTMxLDAuNDAyLTAuMjU0YzAuMTI3LTAuMTIzLDAuMjM1LTAuMzA1LDAuMzIyLTAuNTQzDQorCQljMC4wODYtMC4yNDIsMC4xMzQtMC41NzgsMC4xNDMtMS4wMThoMC4wMTJ2LTEyLjczOGgtMC4wMTJjLTAuMDI1LTAuMzcxLTAuMDgzLTAuNjYtMC4xNzQtMC44NjcNCisJCWMtMC4wOTEtMC4yMDUtMC4xOTYtMC4zNTktMC4zMTUtMC40NjNjLTAuMTItMC4xMDQtMC4yNDgtMC4xNzgtMC4zODQtMC4yMjNjLTAuMTM1LTAuMDQ1LTAuMjU5LTAuMDkyLTAuMzcxLTAuMTQzDQorCQljLTAuMTExLTAuMDQ5LTAuMjAyLTAuMTIxLTAuMjcyLTAuMjExYy0wLjA3LTAuMDktMC4xMDEtMC4yMzQtMC4wOTItMC40MzJjMC0wLjAxOCwwLTAuMDMzLDAtMC4wNDUNCisJCWMwLTAuMDE0LDAuMDI4LTAuMDE4LDAuMDg2LTAuMDE4aDUuNDk3YzAuMDQxLDAsMC4wNjMsMC4wMDgsMC4wNjgsMC4wMjNjMC4wMDQsMC4wMTgsMC4wMDYsMC4wMzMsMC4wMDYsMC4wNTENCisJCWMwLDAuMTg5LTAuMDMzLDAuMzMtMC4wOTksMC40MmMtMC4wNjYsMC4wOS0wLjE1NSwwLjE2Mi0wLjI2NywwLjIxMWMtMC4xMTEsMC4wNTEtMC4yMzEsMC4wOTYtMC4zNTgsMC4xMzUNCisJCWMtMC4xMjgsMC4wNDMtMC4yNTIsMC4xMTMtMC4zNzIsMC4yMTFjLTAuMTIsMC4xLTAuMjI4LDAuMjQ2LTAuMzIyLDAuNDM5Yy0wLjA5NiwwLjE5NS0wLjE1NSwwLjQ2NS0wLjE4LDAuODEyaC0wLjAxM1Y1NTEuNDk5eg0KKwkJIE01MTkuMTEsNTUxLjNjMC4wMjQsMC4zNzEsMC4wODIsMC42NiwwLjE3MywwLjg2NWMwLjA5MSwwLjIwOSwwLjE5NiwwLjM2MywwLjMxNiwwLjQ2NWMwLjExOSwwLjEwNCwwLjI0OCwwLjE3OCwwLjM4NCwwLjIyMw0KKwkJYzAuMTM3LDAuMDQ3LDAuMjYsMC4wOTQsMC4zNzEsMC4xNDNjMC4xMTIsMC4wNTEsMC4yMDIsMC4xMjMsMC4yNzIsMC4yMTdjMC4wNywwLjA5NiwwLjEwNSwwLjI0LDAuMTA1LDAuNDM5DQorCQljMCwwLjAxLTAuMDAyLDAuMDIxLTAuMDA3LDAuMDM3Yy0wLjAwMywwLjAxOC0wLjAzNSwwLjAyNS0wLjA5MiwwLjAyNWMtMC44NzUsMC0xLjc1NCwwLTIuNjM3LDBjLTAuODgzLDAtMS44MzYtMC4wMDQtMi44NTktMC4wMTQNCisJCWMtMC4wNDIsMC0wLjA2NC0wLjAwNi0wLjA2OC0wLjAyM2MtMC4wMDUtMC4wMTYtMC4wMTEtMC4wMzMtMC4wMTktMC4wNDljMC0wLjE5MSwwLjAzNS0wLjMzLDAuMTA0LTAuNDIyDQorCQljMC4wNy0wLjA5LDAuMTU5LTAuMTYsMC4yNjctMC4yMTFjMC4xMDctMC4wNDksMC4yMjctMC4wOTQsMC4zNTktMC4xMzdjMC4xMzItMC4wMzksMC4yNTgtMC4xMDksMC4zNzgtMC4yMDkNCisJCWMwLjExOS0wLjEsMC4yMjctMC4yNDYsMC4zMjItMC40MzljMC4wOTQtMC4xOTMsMC4xNTktMC40NjUsMC4xOTItMC44MTF2LTYuMDI5aC02LjY0OGMtMC4xODIsMC0wLjI3OC0wLjA1My0wLjI5Mi0wLjE1NA0KKwkJYy0wLjAxMi0wLjEwNCwwLjA0LTAuMjM0LDAuMTU1LTAuMzkxYzAuMTE1LTAuMTU4LDAuMjgyLTAuMzI2LDAuNTAxLTAuNTA4YzAuMjE4LTAuMTgyLDAuNDc0LTAuMzU0LDAuNzY4LTAuNTE0DQorCQljMC4yOTItMC4xNjIsMC42MTQtMC4yOTEsMC45NjYtMC4zOTZjMC4zNS0wLjEwNCwwLjcwOC0wLjE1NCwxLjA3LTAuMTU0YzAuMzk2LDAsMC43MTYsMCwwLjk2LDBjMC4yNDMsMCwwLjQ0MywwLDAuNiwwDQorCQlzMC4yODMtMC4wMDIsMC4zNzctMC4wMDhjMC4wOTUtMC4wMDIsMC4xOS0wLjAwNiwwLjI4Ni0wLjAxYzAuMDk0LTAuMDA0LDAuMjA0LTAuMDEsMC4zMjgtMC4wMTRzMC4yOTMtMC4wMSwwLjUwOC0wLjAyDQorCQljMC4xNjUtMC4wMDYsMC4yNzYtMC4wNTUsMC4zMzQtMC4xNDFjMC4wNTctMC4wODgsMC4wOTEtMC4xNiwwLjA5OS0wLjIxN2wtMC4wMTItNC43M2MtMC4wNDItMC4zMy0wLjExLTAuNTg2LTAuMjA1LTAuNzY4DQorCQlzLTAuMjA0LTAuMzE4LTAuMzI4LTAuNDE0Yy0wLjEyNC0wLjA5NC0wLjI1MS0wLjE2LTAuMzgzLTAuMTk3Yy0wLjEzMi0wLjAzNy0wLjI1LTAuMDg0LTAuMzU0LTAuMTM3DQorCQljLTAuMTAzLTAuMDUzLTAuMTg4LTAuMTI5LTAuMjUzLTAuMjIzcy0wLjA5MS0wLjI1LTAuMDc0LTAuNDY1bDUuNjcsMC4wMTJjMC4wMTcsMC4yMjUtMC4wMTIsMC4zODUtMC4wODYsMC40ODQNCisJCWMtMC4wNzUsMC4xLTAuMTcxLDAuMTc0LTAuMjkxLDAuMjIzYy0wLjEyMSwwLjA0OS0wLjI1LDAuMDk4LTAuMzkxLDAuMTQzYy0wLjE0LDAuMDQ1LTAuMjc0LDAuMTI3LTAuNDAyLDAuMjQ4DQorCQljLTAuMTI4LDAuMTE5LTAuMjM2LDAuMjk5LTAuMzIyLDAuNTM3Yy0wLjA4NywwLjI0LTAuMTM1LDAuNTc4LTAuMTQzLDEuMDE2VjU1MS4zeiIvPg0KKwk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzVfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUyMS40MjQ4IiB5MT0iNTQ3LjY2MDIiIHgyPSI1MzQuNzMzNCIgeTI9IjU0Ny42NjAyIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRkZGRkYiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNEMEQyRDMiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHBhdGggZmlsbD0idXJsKCNTVkdJRF81XykiIGQ9Ik01MzMuNjY5LDU1Mi44NThjMC4wNjYsMC4wNjYsMC4xNDIsMC4xMTcsMC4yMjksMC4xNDhjMC4wODYsMC4wMzMsMC4xNzcsMC4wNjIsMC4yNzIsMC4wODINCisJCWMwLjA5NCwwLjAyLDAuMTgzLDAuMDQ5LDAuMjY2LDAuMDg2YzAuMDgzLDAuMDM3LDAuMTUsMC4wOTIsMC4yMDQsMC4xNjJjMC4wNTMsMC4wNjgsMC4wODUsMC4xNzYsMC4wOTMsMC4zMTQNCisJCWMwLDAuMDMzLTAuMDE3LDAuMDQ5LTAuMDQ5LDAuMDQ5aC0zLjMxOGgtMC4wMTN2LTYuMDE2YzAtMS4yNDYtMC4zNTQtMi4yNy0xLjA2NC0zLjA2OGMtMC43MTgtMC43ODctMS42NDYtMS4xNzgtMi43ODUtMS4xNzgNCisJCWMtMS4xMjMsMC0yLjA1MSwwLjM4OS0yLjc4NiwxLjE2NGMtMC43MjcsMC43OTEtMS4wODksMS43OTEtMS4wODksMi45OTZjMCwxLjI0NiwwLjM3NSwyLjI3LDEuMTI2LDMuMDcNCisJCWMwLjc0MywwLjc5MSwxLjY5MiwxLjE4OCwyLjg0NywxLjE4OGMwLjUzNywwLDEuMDQ4LTAuMDksMS41MzUtMC4yNzFjMC4yNDgtMC4wOTIsMC40OTUtMC4yMDUsMC43NDMtMC4zNDINCisJCWMwLjI0Ny0wLjEzNSwwLjQ5OS0wLjI5OSwwLjc1NS0wLjQ4OHYyLjMyOGMtMC41MTIsMC4yNzktMS4wMzIsMC40ODYtMS41NiwwLjYxN2MtMC4yNzIsMC4wNjYtMC41NTMsMC4xMTUtMC44NDIsMC4xNDgNCisJCWMtMC4yODksMC4wMzMtMC41ODIsMC4wNTEtMC44NzksMC4wNTFjLTAuNTY5LDAtMS4xMzktMC4wODYtMS43MDgtMC4yNmMtMC41NjItMC4xODItMS4wNzMtMC40My0xLjUzNS0wLjc0Mg0KKwkJYy0wLjg2Ny0wLjYwNC0xLjUzMS0xLjM1LTEuOTk0LTIuMjQyYy0wLjQ2Mi0wLjkwNi0wLjY5My0xLjkxLTAuNjkzLTMuMDA4YzAtMS43OTksMC41Ny0zLjI4OSwxLjcwOS00LjQ2OQ0KKwkJYzEuMTM5LTEuMTcyLDIuNTg3LTEuNzU4LDQuMzQ1LTEuNzU4YzEuMTY0LDAsMi4yMjQsMC4yODksMy4xODIsMC44NjdjMC40NzksMC4yODcsMC45MDUsMC42NDMsMS4yODIsMS4wNjINCisJCWMwLjM3NSwwLjQyMiwwLjY4MywwLjg2OSwwLjkyMiwxLjMzOGMwLjExNSwwLjIzLDAuMjE5LDAuNDc1LDAuMzEsMC43MjVjMC4wOTEsMC4yNTIsMC4xNjEsMC41MSwwLjIxLDAuNzczDQorCQljMC4wOTksMC41NjIsMC4xNDgsMS4zNzksMC4xNDgsMi40NTF2My45MjRDNTMzLjU1Nyw1NTIuNjk0LDUzMy42MDMsNTUyLjc5NCw1MzMuNjY5LDU1Mi44NTh6Ii8+DQorCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTM1LjMzNSIgeTE9IjU0Ny41OTU3IiB4Mj0iNTQ1LjIyNTYiIHkyPSI1NDcuNTk1NyI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRDBEMkQzIi8+DQorCTwvbGluZWFyR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfNl8pIiBkPSJNNTQwLjI4LDU0MS44OTJjMC42MjctMC4yNDgsMS4xOTktMC4zNzksMS43MTQtMC4zOTZjMC41MTYtMC4wMTYsMC45NzQsMC4wMzUsMS4zNzUsMC4xNTQNCisJCWMwLjM5OSwwLjExOSwwLjczOCwwLjI4MSwxLjAxNSwwLjQ5YzAuMjc2LDAuMjA1LDAuNDg1LDAuNDEsMC42MjUsMC42MTFjMC4xNCwwLjIwMywwLjIxMiwwLjM3OSwwLjIxNywwLjUyNw0KKwkJYzAuMDA0LDAuMTQ4LTAuMDY4LDAuMjIxLTAuMjE3LDAuMjIxYy0wLjIwNywwLjAxLTAuMzk4LDAuMDE0LTAuNTc1LDAuMDE0Yy0wLjE3OCwwLTAuMzMzLDAtMC40NjQsMGgtMC40MzQNCisJCWMtMC4zNzIsMC0wLjczNSwwLjAxNi0xLjA4OSwwLjA0OWMtMC4zNTUsMC4wMzMtMC42OTIsMC4wOS0xLjAwOSwwLjE2OGMtMC4zMTgsMC4wOC0wLjYwNywwLjE4Ni0wLjg2NiwwLjMyMg0KKwkJYy0wLjI2MSwwLjEzNS0wLjQ3OCwwLjMwNy0wLjY1LDAuNTE0Yy0wLjMxNCwwLjM3MS0wLjU1NywwLjgzOC0wLjczLDEuMzk4cy0wLjI2LDEuMjQyLTAuMjYsMi4wNDN2My42NDENCisJCWMwLjAzMywwLjMxMiwwLjA5LDAuNTUzLDAuMTczLDAuNzI1YzAuMDgzLDAuMTY4LDAuMTgsMC4yOTUsMC4yOTEsMC4zODNjMC4xMTIsMC4wODYsMC4yMjUsMC4xNDgsMC4zNDEsMC4xODYNCisJCXMwLjIyMSwwLjA4LDAuMzE2LDAuMTI5YzAuMDk0LDAuMDUxLDAuMTY4LDAuMTE5LDAuMjIzLDAuMjExYzAuMDUzLDAuMDksMC4wNzYsMC4yMzIsMC4wNjcsMC40MmgtNS4wMDENCisJCWMtMC4wMTctMC4xOTcsMC4wMDYtMC4zNDIsMC4wNjgtMC40MzJjMC4wNjItMC4wOTIsMC4xNDMtMC4xNjIsMC4yNDEtMC4yMTFjMC4wOTktMC4wNTEsMC4yMDgtMC4wOTIsMC4zMjgtMC4xMzENCisJCWMwLjEyLTAuMDM1LDAuMjM2LTAuMTA0LDAuMzQ3LTAuMjAzYzAuMTEyLTAuMSwwLjIwNi0wLjI0NCwwLjI4NS0wLjQzNGMwLjA3OC0wLjE4OSwwLjEzLTAuNDYxLDAuMTU0LTAuODE4di05LjgyOGgxLjk5M3YxLjc4Mw0KKwkJQzUzOS4xMzcsNTQyLjcwOCw1MzkuNjQ0LDU0Mi4xOTYsNTQwLjI4LDU0MS44OTJ6Ii8+DQorCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfN18iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTQ1LjQ0MjQiIHkxPSI1NDUuMTA5NCIgeDI9IjU1Ny41ODY5IiB5Mj0iNTQ1LjEwOTQiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzdfKSIgZD0iTTU0Ni4xMzYsNTQ0LjhjMC40NjItMC44ODMsMS4xMzUtMS42MzMsMi4wMTgtMi4yNTJjMC40NTQtMC4zMDcsMC45NjUtMC41NTMsMS41MzUtMC43NDQNCisJCWMwLjU2OS0wLjE3MiwxLjE0My0wLjI1OCwxLjcyMS0wLjI1OGMwLjYxMSwwLDEuMTgsMC4wNjQsMS43MDgsMC4xOTdjMC41NDQsMC4xMzksMS4wNjUsMC4zNSwxLjU2LDAuNjMxDQorCQljLTAuMTczLDAuMjk3LTAuNCwwLjU0OS0wLjY4MSwwLjc1NmMtMC4yMzksMC4xNzItMC41NTMsMC4zMTYtMC45NDEsMC40MzJjLTAuMzg4LDAuMTE3LTAuODY3LDAuMTI1LTEuNDM2LDAuMDI1DQorCQljLTAuMjcyLTAuMDMzLTAuNTQxLTAuMDI1LTAuODA1LDAuMDJzLTAuNTE2LDAuMTE5LTAuNzU1LDAuMjIzYy0wLjIzOSwwLjEwMi0wLjQ3LDAuMjMyLTAuNjkzLDAuMzkxDQorCQljLTAuMjIzLDAuMTU0LTAuNDI1LDAuMzMtMC42MDYsMC41MThjLTAuNzM0LDAuNzctMS4xMDIsMS43NjgtMS4xMDIsMi45OThjMCwxLjI3LDAuMzU5LDIuMzAxLDEuMDc3LDMuMDk0DQorCQljMC43MTgsMC43NzUsMS42NTksMS4xNjQsMi44MjIsMS4xNjRjMS4xMzEsMCwyLjA1NS0wLjM4OSwyLjc3My0xLjE2NGMwLjcwOS0wLjc4MywxLjA2NC0xLjgwNywxLjA2NC0zLjA3di0xMC40NjENCisJCWMtMC4wNDEtMC4xODItMC4xMjQtMC4zMDEtMC4yNDgtMC4zNTljLTAuMTI0LTAuMDU5LTAuMjU0LTAuMTA0LTAuMzktMC4xMzdjLTAuMTM3LTAuMDMxLTAuMjYxLTAuMDg0LTAuMzcyLTAuMTU0DQorCQljLTAuMTEyLTAuMDY4LTAuMTcxLTAuMjA5LTAuMTgtMC40MTRjMC0wLjAzMywwLjAxNy0wLjA1MSwwLjA1LTAuMDUxaDMuMzN2MS42MjN2OWMwLDAuNTQ1LTAuMDE1LDEuMDItMC4wNDQsMS40MjQNCisJCXMtMC4wNjgsMC43NDQtMC4xMTcsMS4wMTZjLTAuMDk5LDAuNTM3LTAuMjY4LDEuMDMxLTAuNTA4LDEuNDg0Yy0wLjUyLDEuMDMzLTEuMjU4LDEuODM4LTIuMjE2LDIuNDE0DQorCQljLTAuOTY2LDAuNTk2LTIuMDM0LDAuODkzLTMuMjA3LDAuODkzYy0xLjc1LDAtMy4xOTQtMC41OTYtNC4zMzMtMS43ODNjLTEuMTQ3LTEuMTg5LTEuNzIxLTIuNjg2LTEuNzIxLTQuNDk0DQorCQlDNTQ1LjQ0Miw1NDYuNjg3LDU0NS42NzMsNTQ1LjcsNTQ2LjEzNiw1NDQuOHoiLz4NCisJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF84XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1NTguODY0NyIgeTE9IjU0Ny43NzY0IiB4Mj0iNTc4LjI5ODMiIHkyPSI1NDcuNzc2NCI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRDBEMkQzIi8+DQorCTwvbGluZWFyR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfOF8pIiBkPSJNNTc4LjIxMSw1NDEuNTY3YzAuMDI1LDAsMC4wNDUsMC4wMSwwLjA2MiwwLjAyN2MwLjAzMywwLjAzMywwLjAzMywwLjA4NiwwLDAuMTYNCisJCWMtMC4wNSwwLjExNS0wLjEyNCwwLjI5NS0wLjIyMywwLjUzOWMtMC4xLDAuMjQ0LTAuMjMxLDAuNi0wLjM5NiwxLjA3bC0yLjk4NCw4LjMxOGMtMC4yNjQsMC44MzQtMC41NTMsMS40MTItMC44NjYsMS43MzQNCisJCWMtMC4zMTQsMC4zMzgtMC43MSwwLjUwOC0xLjE4OSwwLjUwOGMtMC40ODcsMC0wLjg4Ny0wLjE3LTEuMjAxLTAuNTA4Yy0wLjE0OC0wLjE2Ni0wLjI3Mi0wLjM4OS0wLjM3MS0wLjY2OA0KKwkJYy0wLjEtMC4yODEtMC4yMTUtMC42MjktMC4zNDctMS4wNDFoLTAuMDEzbC0yLjA4LTUuNTIxbC0xLjk4MSw1LjU3Yy0wLjI2NCwwLjgyNi0wLjU1MywxLjQtMC44NjcsMS43MjMNCisJCWMtMC4zMTMsMC4zMzYtMC43MTQsMC41MDYtMS4yMDEsMC41MDZjLTAuNDc5LDAtMC44NzUtMC4xNjQtMS4xODgtMC40OTRjLTAuMTU3LTAuMTY2LTAuMjgzLTAuMzkxLTAuMzc3LTAuNjc2DQorCQljLTAuMDk2LTAuMjg1LTAuMjA5LTAuNjMzLTAuMzQxLTEuMDQ1bC0wLjAxMywwLjAxMmwtMy4wOTUtOC4yNTZjLTAuMTgyLTAuNDYzLTAuMzIyLTAuODE2LTAuNDIxLTEuMDU5DQorCQljLTAuMDk5LTAuMjQ0LTAuMTczLTAuNDI0LTAuMjIzLTAuNTM5Yy0wLjA0MS0wLjA3NC0wLjA0NS0wLjEyOS0wLjAxMi0wLjE2MmMwLjAxNy0wLjAxOCwwLjA0MS0wLjAyMywwLjA3NC0wLjAyMw0KKwkJYzAuMzk2LTAuMDE2LDAuNzg0LDAuMDUzLDEuMTY0LDAuMjA5YzAuMTU3LDAuMDY2LDAuMzIyLDAuMTU0LDAuNDk1LDAuMjY4YzAuMTc0LDAuMTExLDAuMzQxLDAuMjUyLDAuNTAxLDAuNDI2DQorCQljMC4xNjIsMC4xNzQsMC4zMTYsMC4zODEsMC40NjUsMC42MTljMC4xNDgsMC4yNCwwLjI4MSwwLjUyMSwwLjM5NiwwLjg0MmwyLjYxMiw2LjgwOWwyLjUxMy02Ljg1Nw0KKwkJYzAuMDY2LTAuMTg5LDAuMTM2LTAuMzYxLDAuMjEtMC41MTRzMC4xNTMtMC4yOTksMC4yMzUtMC40MzljMC4yNzItMC4zMywwLjU0OS0wLjUzNywwLjgyOS0wLjYxOQ0KKwkJYzAuMTI0LTAuMDMzLDAuMjUyLTAuMDM5LDAuMzg0LTAuMDE4YzAuMTMyLDAuMDIsMC4yNjksMC4wODYsMC40MDksMC4xOTdzMC4yODMsMC4yNzUsMC40MjcsMC40OTYNCisJCWMwLjE0NCwwLjIxOSwwLjI4NywwLjUwOCwwLjQyNywwLjg3MWwyLjYyNSw2LjgyMmwyLjUwMS02Ljg1OWMwLjEwNy0wLjMyLDAuMjM1LTAuNjA0LDAuMzgzLTAuODQ4DQorCQljMC4xNDktMC4yNDIsMC4zMDQtMC40NTEsMC40NjQtMC42MjVjMC4xNjEtMC4xNzQsMC4zMjgtMC4zMTYsMC41MDItMC40MzRjMC4xNzMtMC4xMTUsMC4zNDItMC4yMTEsMC41MDctMC4yODUNCisJCUM1NzcuMzk5LDU0MS42NCw1NzcuNzk5LDU0MS41NjIsNTc4LjIxMSw1NDEuNTY3eiIvPg0KKwk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzlfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjU3OS4yNTEiIHkxPSI1NDcuNjYwMiIgeDI9IjU5Mi41NTk2IiB5Mj0iNTQ3LjY2MDIiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzlfKSIgZD0iTTU5MS40OTUsNTUyLjg1OGMwLjA2NSwwLjA2NiwwLjE0MywwLjExNywwLjIyOSwwLjE0OGMwLjA4NiwwLjAzMywwLjE3NywwLjA2MiwwLjI3MiwwLjA4Mg0KKwkJYzAuMDk0LDAuMDIsMC4xODMsMC4wNDksMC4yNjYsMC4wODZzMC4xNSwwLjA5MiwwLjIwNSwwLjE2MmMwLjA1MiwwLjA2OCwwLjA4NCwwLjE3NiwwLjA5MiwwLjMxNGMwLDAuMDMzLTAuMDE3LDAuMDQ5LTAuMDUsMC4wNDkNCisJCWgtMy4zMTdoLTAuMDEzdi02LjAxNmMwLTEuMjQ2LTAuMzU0LTIuMjctMS4wNjQtMy4wNjhjLTAuNzE4LTAuNzg3LTEuNjQ2LTEuMTc4LTIuNzg2LTEuMTc4Yy0xLjEyMywwLTIuMDUxLDAuMzg5LTIuNzg2LDEuMTY0DQorCQljLTAuNzI3LDAuNzkxLTEuMDg5LDEuNzkxLTEuMDg5LDIuOTk2YzAsMS4yNDYsMC4zNzUsMi4yNywxLjEyNiwzLjA3YzAuNzQzLDAuNzkxLDEuNjkyLDEuMTg4LDIuODQ3LDEuMTg4DQorCQljMC41MzcsMCwxLjA0OC0wLjA5LDEuNTM2LTAuMjcxYzAuMjQ4LTAuMDkyLDAuNDk1LTAuMjA1LDAuNzQzLTAuMzQyYzAuMjQ3LTAuMTM1LDAuNDk5LTAuMjk5LDAuNzU1LTAuNDg4djIuMzI4DQorCQljLTAuNTEyLDAuMjc5LTEuMDMxLDAuNDg2LTEuNTYsMC42MTdjLTAuMjcyLDAuMDY2LTAuNTUzLDAuMTE1LTAuODQyLDAuMTQ4cy0wLjU4MiwwLjA1MS0wLjg3OSwwLjA1MQ0KKwkJYy0wLjU2OSwwLTEuMTM4LTAuMDg2LTEuNzA4LTAuMjZjLTAuNTYyLTAuMTgyLTEuMDc0LTAuNDMtMS41MzYtMC43NDJjLTAuODY3LTAuNjA0LTEuNTMxLTEuMzUtMS45OTQtMi4yNDINCisJCWMtMC40NjItMC45MDYtMC42OTMtMS45MS0wLjY5My0zLjAwOGMwLTEuNzk5LDAuNTctMy4yODksMS43MDktNC40NjljMS4xMzktMS4xNzIsMi41ODctMS43NTgsNC4zNDYtMS43NTgNCisJCWMxLjE2NCwwLDIuMjI0LDAuMjg5LDMuMTgyLDAuODY3YzAuNDc4LDAuMjg3LDAuOTA1LDAuNjQzLDEuMjgxLDEuMDYyYzAuMzc1LDAuNDIyLDAuNjgzLDAuODY5LDAuOTIyLDEuMzM4DQorCQljMC4xMTUsMC4yMywwLjIxOSwwLjQ3NSwwLjMxLDAuNzI1YzAuMDkxLDAuMjUyLDAuMTYxLDAuNTEsMC4yMSwwLjc3M2MwLjEsMC41NjIsMC4xNDksMS4zNzksMC4xNDksMi40NTF2My45MjQNCisJCUM1OTEuMzg0LDU1Mi42OTQsNTkxLjQyOSw1NTIuNzk0LDU5MS40OTUsNTUyLjg1OHoiLz4NCisJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTkzLjE2MTEiIHkxPSI1NDcuNTk1NyIgeDI9IjYwMy4wNTI3IiB5Mj0iNTQ3LjU5NTciPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzEwXykiIGQ9Ik01OTguMTA1LDU0MS44OTJjMC42MjgtMC4yNDgsMS4xOTktMC4zNzksMS43MTUtMC4zOTZjMC41MTYtMC4wMTYsMC45NzQsMC4wMzUsMS4zNzUsMC4xNTQNCisJCWMwLjM5OSwwLjExOSwwLjczOCwwLjI4MSwxLjAxNSwwLjQ5YzAuMjc2LDAuMjA1LDAuNDg1LDAuNDEsMC42MjUsMC42MTFjMC4xNDEsMC4yMDMsMC4yMTMsMC4zNzksMC4yMTgsMC41MjcNCisJCWMwLjAwMywwLjE0OC0wLjA2OSwwLjIyMS0wLjIxOCwwLjIyMWMtMC4yMDYsMC4wMS0wLjM5OCwwLjAxNC0wLjU3NSwwLjAxNGMtMC4xNzgsMC0wLjMzMywwLTAuNDY1LDBoLTAuNDMzDQorCQljLTAuMzcyLDAtMC43MzUsMC4wMTYtMS4wOSwwLjA0OXMtMC42OTEsMC4wOS0xLjAwOSwwLjE2OGMtMC4zMTcsMC4wOC0wLjYwNiwwLjE4Ni0wLjg2NiwwLjMyMg0KKwkJYy0wLjI2MSwwLjEzNS0wLjQ3OCwwLjMwNy0wLjY1LDAuNTE0Yy0wLjMxMywwLjM3MS0wLjU1NywwLjgzOC0wLjczLDEuMzk4cy0wLjI2LDEuMjQyLTAuMjYsMi4wNDN2My42NDENCisJCWMwLjAzMywwLjMxMiwwLjA5MSwwLjU1MywwLjE3MywwLjcyNWMwLjA4MiwwLjE2OCwwLjE4LDAuMjk1LDAuMjkxLDAuMzgzYzAuMTExLDAuMDg2LDAuMjI1LDAuMTQ4LDAuMzQxLDAuMTg2DQorCQljMC4xMTUsMC4wMzcsMC4yMjEsMC4wOCwwLjMxNSwwLjEyOWMwLjA5NSwwLjA1MSwwLjE2OSwwLjExOSwwLjIyNCwwLjIxMWMwLjA1MywwLjA5LDAuMDc1LDAuMjMyLDAuMDY3LDAuNDJoLTUuMDAyDQorCQljLTAuMDE3LTAuMTk3LDAuMDA3LTAuMzQyLDAuMDY4LTAuNDMyYzAuMDYyLTAuMDkyLDAuMTQzLTAuMTYyLDAuMjQxLTAuMjExYzAuMS0wLjA1MSwwLjIwOC0wLjA5MiwwLjMyOC0wLjEzMQ0KKwkJYzAuMTItMC4wMzUsMC4yMzUtMC4xMDQsMC4zNDctMC4yMDNjMC4xMTItMC4xLDAuMjA3LTAuMjQ0LDAuMjg1LTAuNDM0czAuMTMtMC40NjEsMC4xNTUtMC44MTh2LTkuODI4aDEuOTkydjEuNzgzDQorCQlDNTk2Ljk2Myw1NDIuNzA4LDU5Ny40NzEsNTQyLjE5Niw1OTguMTA1LDU0MS44OTJ6Ii8+DQorCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjYwMy4xNjk5IiB5MT0iNTQ3Ljc0MTIiIHgyPSI2MTUuMjQwMiIgeTI9IjU0Ny43NDEyIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRkZGRkYiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNEMEQyRDMiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHBhdGggZmlsbD0idXJsKCNTVkdJRF8xMV8pIiBkPSJNNjEyLjg4OCw1NDkuNzc2YzAuMzgtMC4zNDYsMC43MTUtMC41OTYsMS4wMDktMC43NDhjMC4yOTMtMC4xNTIsMC41MzktMC4yNTQsMC43MzYtMC4zMDMNCisJCWMwLjIzMS0wLjA1OSwwLjQzNC0wLjA3LDAuNjA3LTAuMDM5Yy0wLjA3NCwwLjQzLTAuMTcsMC44MjQtMC4yODUsMS4xODRzLTAuMjU0LDAuNjkzLTAuNDE1LDEuMDAyDQorCQljLTAuMTYxLDAuMzExLTAuMzQ2LDAuNi0wLjU1OCwwLjg3M2MtMC4yMDksMC4yNzEtMC40NTEsMC41MzMtMC43MjQsMC43ODFjLTEuMDk4LDAuOTk4LTIuNDI2LDEuNDk4LTMuOTg2LDEuNDk4DQorCQljLTAuNTM2LDAtMS4wNjQtMC4wNzYtMS41ODQtMC4yMjVjLTAuNTI5LTAuMTM5LTEuMDItMC4zNS0xLjQ3NC0wLjYzMWMtMC45NDktMC41NzgtMS42OTUtMS4zNS0yLjI0LTIuMzE0DQorCQljLTAuNTM3LTAuOTU3LTAuODA1LTIuMDAyLTAuODA1LTMuMTMzYzAtMC40MiwwLjAzOC0wLjgyOCwwLjExNi0xLjIyNWMwLjA3OS0wLjM5NiwwLjE5Mi0wLjc4NSwwLjM0MS0xLjE2Ng0KKwkJYzAuMzA2LTAuNzQ4LDAuNzUxLTEuNDMsMS4zMzgtMi4wNDFjMC41ODYtMC41OTQsMS4yNDYtMS4wNDksMS45OC0xLjM2MWMwLjc2OC0wLjMxNCwxLjU1MS0wLjQ3MSwyLjM1Mi0wLjQ3MQ0KKwkJYzEuMjIyLDAsMi4zMTUsMC4zMiwzLjI4MSwwLjk2NWMwLjk2NiwwLjY1MiwxLjc0NiwxLjU4OCwyLjM0LDIuODExbC03LjkxLDQuMzgzYy0wLjA4My0wLjM2My0wLjA3OS0wLjcyNywwLjAxMi0xLjA5DQorCQljMC4wNzQtMC4zMTIsMC4yMzYtMC42NDYsMC40ODktMS4wMDJjMC4yNTEtMC4zNTUsMC42NjItMC42ODYsMS4yMzEtMC45OWMwLjA0MS0wLjAyNSwwLjExNy0wLjA3LDAuMjI5LTAuMTM3DQorCQljMC4xMTEtMC4wNjYsMC4yNDgtMC4xNDUsMC40MDgtMC4yMzZjMC4xNjEtMC4wOSwwLjMzNy0wLjE4OSwwLjUyNi0wLjI5N3MwLjM4LTAuMjE1LDAuNTY5LTAuMzIyDQorCQljMC40NTQtMC4yNTYsMC45NDktMC41MzUsMS40ODUtMC44NGMtMC4zNTUtMC4zOTYtMC43Ni0wLjY5Ny0xLjIxMy0wLjkwNGMtMC40MzgtMC4yMDctMC45MjktMC4zMTEtMS40NzQtMC4zMTENCisJCWMtMS4wODEsMC0xLjk5MywwLjQwNC0yLjczNSwxLjIxNWMtMC43NDMsMC44MDktMS4xMTQsMS44MDctMS4xMTQsMi45OTZjMCwxLjE4OCwwLjM3MSwyLjE4MiwxLjExNCwyLjk4Mg0KKwkJYzAuNzQyLDAuODE4LDEuNjU0LDEuMjI3LDIuNzM1LDEuMjI3YzEuMDMxLDAsMS44OTEtMC4zNCwyLjU3NS0xLjAxNmMwLjIzMS0wLjE5NywwLjQxNS0wLjM5MSwwLjU1MS0wLjU3Ng0KKwkJQzYxMi41MzUsNTUwLjEzLDYxMi42OTcsNTQ5Ljk1LDYxMi44ODgsNTQ5Ljc3NnoiLz4NCisJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xMl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNjIzLjMxMTUiIHkxPSI1NDQuNzgzMiIgeDI9IjYzNy45NDQzIiB5Mj0iNTQ0Ljc4MzIiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzEyXykiIGQ9Ik02MzcuMDI4LDU0MC40MDVjMC4zNzIsMC42NDUsMC42MTcsMS4zNSwwLjczNywyLjExN2MwLjExOSwwLjc2OCwwLjE3OSwxLjU1NSwwLjE3OSwyLjM2Mw0KKwkJYzAsMS42MDItMC4zODgsMy4wNjItMS4xNjMsNC4zODVjLTAuNzY5LDEuMzExLTEuODY1LDIuMzg5LTMuMjk0LDMuMjNjLTAuNjY4LDAuMzg3LTEuNDY0LDAuNjgyLTIuMzg5LDAuODc5DQorCQljLTAuMjQsMC4wNTEtMC41MDgsMC4wOTYtMC44MDUsMC4xMzVjLTAuMjk3LDAuMDQzLTAuNTg0LDAuMDc4LTAuODU5LDAuMTA1Yy0wLjI3OCwwLjAyOS0wLjUyMSwwLjA1My0wLjczMSwwLjA2OA0KKwkJYy0wLjIxLDAuMDE4LTAuMzUsMC4wMjUtMC40MTUsMC4wMjVjLTAuMTE2LDAtMC4yMy0wLjAwMi0wLjM0Ny0wLjAwNmMtMC4xMTUtMC4wMDQtMC4xNzMtMC4wNjQtMC4xNzMtMC4xOA0KKwkJYzAtMC4wNzYsMC4wMzYtMC4xOTcsMC4xMTEtMC4zNzFjMC4wNzMtMC4xNzQsMC4xOTEtMC4zNTksMC4zNTItMC41NTdjMC4xNjMtMC4xOTksMC4zNjgtMC4zODksMC42Mi0wLjU3DQorCQljMC4yNTEtMC4xODIsMC41NTktMC4zMTgsMC45MjItMC40MWMwLjQ2Mi0wLjE2NCwwLjg1Mi0wLjI5NywxLjE3LTAuMzk1YzAuMzE4LTAuMSwwLjYwOC0wLjIwNywwLjg3My0wLjMyDQorCQljMC4yNjQtMC4xMTcsMC41MjItMC4yNjIsMC43NzMtMC40MzZjMC4yNTItMC4xNzIsMC41NDMtMC40MTIsMC44NzMtMC43MTdjMC42NjgtMC42MTksMS4xODYtMS4zMzgsMS41NDgtMi4xNTQNCisJCWMwLjM2My0wLjgxOCwwLjU0NS0xLjcyOSwwLjU0NS0yLjczNmMwLTAuNTEyLTAuMDI4LTEuMDE0LTAuMDgtMS41MDRjLTAuMDU1LTAuNDktMC4xNDYtMC45NTctMC4yNzMtMS40DQorCQljLTAuMTI3LTAuNDM5LTAuMzAzLTAuODU0LTAuNTI2LTEuMjM4Yy0wLjIyMy0wLjM4My0wLjUwMy0wLjcyNy0wLjg0MS0xLjAzM2MtMC4yODEtMC4yODEtMC42NDgtMC41MzctMS4xMDItMC43NzMNCisJCWMtMC40NTUtMC4yMzQtMC45MzgtMC40MzQtMS40NDktMC41OTRzLTEuMDI3LTAuMjg3LTEuNTQ4LTAuMzc3Yy0wLjUyLTAuMDkyLTAuOTg4LTAuMTM5LTEuNDA1LTAuMTQzcy0wLjc1OCwwLjA0MS0xLjAyMSwwLjEzNw0KKwkJcy0wLjM5NiwwLjI0NC0wLjM5NiwwLjQ1MWwwLjAxNCwxMi41MDRoMC4wMTN2Mi44MDloLTMuNjI4YzAtMC4xNjQsMC4wMzEtMC4yODcsMC4wOTMtMC4zNjlzMC4xMzktMC4xNDYsMC4yMjktMC4xOTMNCisJCWMwLjA5Mi0wLjA0NSwwLjE5LTAuMDc4LDAuMjk4LTAuMDk4YzAuMTA3LTAuMDIxLDAuMjA3LTAuMDUzLDAuMzA0LTAuMDk0YzAuMDk1LTAuMDQxLDAuMTc3LTAuMTAyLDAuMjQ4LTAuMTgNCisJCWMwLjA2OC0wLjA3NiwwLjExNi0wLjE5NSwwLjE0Mi0wLjM1NGMwLTAuNDc5LDAtMS4wNTcsMC0xLjczMmMwLTAuNjc4LTAuMDAzLTEuNDA4LTAuMDA3LTIuMTk3cy0wLjAwNS0xLjYwNC0wLjAwNS0yLjQ1MQ0KKwkJYzAtMC44NDYsMC0xLjY3OCwwLTIuNDk0YzAtMC44MTgtMC4wMDMtMS41OTYtMC4wMDctMi4zMzRjLTAuMDA2LTAuNzQtMC4wMDctMS4zOTYtMC4wMDctMS45NzVzMC4wMDEtMS4wNDUsMC4wMDctMS40MDYNCisJCWMwLjAwNC0wLjM1NywwLjAwNy0wLjU2NiwwLjAwNy0wLjYyNWMwLjAwNy0wLjI5NywwLjE1MS0wLjUzNywwLjQzMy0wLjcyM2MwLjI4LTAuMTg4LDAuNjMzLTAuMzI4LDEuMDU3LTAuNDI4DQorCQljMC40MjYtMC4wOTgsMC44OTktMC4xNTgsMS40MTktMC4xOGMwLjUyMS0wLjAyLDEuMDI3LTAuMDIsMS41MjIsMGMwLjQ5NSwwLjAyMSwwLjk1NCwwLjA1NSwxLjM3NCwwLjEwNA0KKwkJYzAuNDIyLDAuMDUxLDAuNzQzLDAuMTA1LDAuOTY2LDAuMTYyYzAuMzgsMC4xMTcsMC44MjIsMC4yODEsMS4zMjQsMC40OTZjMC41MDUsMC4yMTUsMS4wMTgsMC40OTQsMS41NDIsMC44NDINCisJCWMwLjUyMywwLjM0NiwxLjAzLDAuNzYyLDEuNTIzLDEuMjQ0QzYzNi4yNjQsNTM5LjE5OCw2MzYuNjgyLDUzOS43NjMsNjM3LjAyOCw1NDAuNDA1eiIvPg0KKwk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzEzXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI2MzkuNjc3NyIgeTE9IjU0Ny43NDEyIiB4Mj0iNjUxLjc0OCIgeTI9IjU0Ny43NDEyIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRkZGRkYiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNEMEQyRDMiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHBhdGggZmlsbD0idXJsKCNTVkdJRF8xM18pIiBkPSJNNjQ5LjM5Niw1NDkuNzc2YzAuMzc5LTAuMzQ2LDAuNzE3LTAuNTk2LDEuMDA5LTAuNzQ4YzAuMjkzLTAuMTUyLDAuNTM5LTAuMjU0LDAuNzM3LTAuMzAzDQorCQljMC4yMzEtMC4wNTksMC40MzMtMC4wNywwLjYwNi0wLjAzOWMtMC4wNzQsMC40My0wLjE2OSwwLjgyNC0wLjI4NSwxLjE4NGMtMC4xMTUsMC4zNTktMC4yNTQsMC42OTMtMC40MTUsMS4wMDINCisJCWMtMC4xNTksMC4zMTEtMC4zNDcsMC42LTAuNTU2LDAuODczYy0wLjIxMSwwLjI3MS0wLjQ1MywwLjUzMy0wLjcyNSwwLjc4MWMtMS4wOTksMC45OTgtMi40MjcsMS40OTgtMy45ODcsMS40OTgNCisJCWMtMC41MzUsMC0xLjA2My0wLjA3Ni0xLjU4NC0wLjIyNWMtMC41MjktMC4xMzktMS4wMi0wLjM1LTEuNDc0LTAuNjMxYy0wLjk0OC0wLjU3OC0xLjY5Ni0xLjM1LTIuMjQtMi4zMTQNCisJCWMtMC41MzYtMC45NTctMC44MDUtMi4wMDItMC44MDUtMy4xMzNjMC0wLjQyLDAuMDM5LTAuODI4LDAuMTE4LTEuMjI1YzAuMDc3LTAuMzk2LDAuMTktMC43ODUsMC4zMzktMS4xNjYNCisJCWMwLjMwNy0wLjc0OCwwLjc1My0xLjQzLDEuMzM3LTIuMDQxYzAuNTg4LTAuNTk0LDEuMjQ4LTEuMDQ5LDEuOTgxLTEuMzYxYzAuNzY5LTAuMzE0LDEuNTUxLTAuNDcxLDIuMzU0LTAuNDcxDQorCQljMS4yMjEsMCwyLjMxNCwwLjMyLDMuMjc5LDAuOTY1YzAuOTY2LDAuNjUyLDEuNzQ1LDEuNTg4LDIuMzQsMi44MTFsLTcuOTEsNC4zODNjLTAuMDgyLTAuMzYzLTAuMDc5LTAuNzI3LDAuMDEzLTEuMDkNCisJCWMwLjA3My0wLjMxMiwwLjIzNS0wLjY0NiwwLjQ4OC0xLjAwMmMwLjI1Mi0wLjM1NSwwLjY2Mi0wLjY4NiwxLjIzMS0wLjk5YzAuMDQyLTAuMDI1LDAuMTE3LTAuMDcsMC4yMy0wLjEzNw0KKwkJYzAuMTEtMC4wNjYsMC4yNDctMC4xNDUsMC40MDgtMC4yMzZjMC4xNi0wLjA5LDAuMzM2LTAuMTg5LDAuNTI1LTAuMjk3YzAuMTktMC4xMDcsMC4zOC0wLjIxNSwwLjU2OS0wLjMyMg0KKwkJYzAuNDU0LTAuMjU2LDAuOTQ5LTAuNTM1LDEuNDg1LTAuODRjLTAuMzU0LTAuMzk2LTAuNzU5LTAuNjk3LTEuMjEzLTAuOTA0Yy0wLjQzOC0wLjIwNy0wLjkyOS0wLjMxMS0xLjQ3NC0wLjMxMQ0KKwkJYy0xLjA4LDAtMS45OTIsMC40MDQtMi43MzUsMS4yMTVjLTAuNzQzLDAuODA5LTEuMTE0LDEuODA3LTEuMTE0LDIuOTk2YzAsMS4xODgsMC4zNzEsMi4xODIsMS4xMTQsMi45ODINCisJCWMwLjc0MywwLjgxOCwxLjY1NSwxLjIyNywyLjczNSwxLjIyN2MxLjAzMywwLDEuODkyLTAuMzQsMi41NzUtMS4wMTZjMC4yMy0wLjE5NywwLjQxNS0wLjM5MSwwLjU1Mi0wLjU3Ng0KKwkJUzY0OS4yMDcsNTQ5Ljk1LDY0OS4zOTYsNTQ5Ljc3NnoiLz4NCisJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xNF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNjUzLjkzOTUiIHkxPSI1NDUuOTM4NSIgeDI9IjY2MC4wMDU5IiB5Mj0iNTQ1LjkzODUiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzE0XykiIGQ9Ik02NTkuNzIxLDU1MC43NzhjMC4wMjQsMC4wMSwwLjAzNywwLjAyMSwwLjAzNywwLjAzOXYyLjg3MXYwLjAxMmgtMC43MTljLTAuMDksMC0wLjE3NiwwLTAuMjU5LDANCisJCWMtMC4wODIsMC0wLjE3LTAuMDA0LTAuMjYxLTAuMDEyaC0wLjAyNGMtMS40MzctMC4wNzQtMi41My0wLjQzOS0zLjI4LTEuMTAyYy0wLjg1Mi0wLjc0Mi0xLjI3NS0xLjg2My0xLjI3NS0zLjM2N3YtOC40MDZ2LTAuMDQ5DQorCQl2LTAuNDg0YzAuMDA4LTAuNDYxLDAuMTIzLTAuODMsMC4zNDctMS4xMDVjMC4yMjMtMC4yNzcsMC40Ny0wLjQ5LDAuNzQyLTAuNjM5YzAuMzE0LTAuMTc0LDAuNjczLTAuMjkzLDEuMDc3LTAuMzU5djIuOTQ1djAuNTMzDQorCQl2Ny4xODJjMCwwLjk3MywwLjIzNSwxLjY4MiwwLjcwNiwyLjEyOWMwLjQ0NSwwLjQyLDEuMTQ0LDAuNjQzLDIuMDkxLDAuNjY4YzAuMTMzLTAuMDMzLDAuMjIyLTAuMDk2LDAuMjY3LTAuMTg2DQorCQljMC4wNDUtMC4wOTIsMC4wODEtMC4xODQsMC4xMDYtMC4yNzljMC4wMjMtMC4wOTQsMC4wNjMtMC4xOCwwLjExOC0wLjI2QzY1OS40NDUsNTUwLjgzMSw2NTkuNTU3LDU1MC43ODgsNjU5LjcyMSw1NTAuNzc4eg0KKwkJIE02NTYuNyw1NDEuNTgxaDAuMjZjMC4xNTcsMC4wMSwwLjMxLDAuMDE0LDAuNDU3LDAuMDE0SDY1OGMwLjQzOCwwLjAwOCwwLjc4NywwLjExOSwxLjA1MiwwLjMzNA0KKwkJYzAuMjY0LDAuMjEzLDAuNDY3LDAuNDQ5LDAuNjA2LDAuNzA1YzAuMTY2LDAuMjk3LDAuMjgxLDAuNjM1LDAuMzQ4LDEuMDE2aC0yLjgxMWgtMC41MDhMNjU2LjcsNTQxLjU4MXoiLz4NCisJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xNV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNjYxLjQwNTMiIHkxPSI1NDcuNzQxMiIgeDI9IjY3My40NzQ2IiB5Mj0iNTQ3Ljc0MTIiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzE1XykiIGQ9Ik02NzEuMTIzLDU0OS43NzZjMC4zNzktMC4zNDYsMC43MTUtMC41OTYsMS4wMDktMC43NDhjMC4yOTItMC4xNTIsMC41MzgtMC4yNTQsMC43MzUtMC4zMDMNCisJCWMwLjIzMS0wLjA1OSwwLjQzNC0wLjA3LDAuNjA3LTAuMDM5Yy0wLjA3NCwwLjQzLTAuMTY5LDAuODI0LTAuMjg0LDEuMTg0Yy0wLjExNiwwLjM1OS0wLjI1NSwwLjY5My0wLjQxNSwxLjAwMg0KKwkJYy0wLjE2MSwwLjMxMS0wLjM0NywwLjYtMC41NTgsMC44NzNjLTAuMjEsMC4yNzEtMC40NTEsMC41MzMtMC43MjQsMC43ODFjLTEuMDk4LDAuOTk4LTIuNDI3LDEuNDk4LTMuOTg2LDEuNDk4DQorCQljLTAuNTM2LDAtMS4wNjUtMC4wNzYtMS41ODUtMC4yMjVjLTAuNTI4LTAuMTM5LTEuMDE5LTAuMzUtMS40NzQtMC42MzFjLTAuOTQ3LTAuNTc4LTEuNjk1LTEuMzUtMi4yNC0yLjMxNA0KKwkJYy0wLjUzNy0wLjk1Ny0wLjgwNC0yLjAwMi0wLjgwNC0zLjEzM2MwLTAuNDIsMC4wMzgtMC44MjgsMC4xMTYtMS4yMjVjMC4wNzktMC4zOTYsMC4xOTItMC43ODUsMC4zNDEtMS4xNjYNCisJCWMwLjMwNi0wLjc0OCwwLjc1MS0xLjQzLDEuMzM3LTIuMDQxYzAuNTg2LTAuNTk0LDEuMjQ3LTEuMDQ5LDEuOTgtMS4zNjFjMC43NjgtMC4zMTQsMS41NTItMC40NzEsMi4zNTMtMC40NzENCisJCWMxLjIyMiwwLDIuMzE0LDAuMzIsMy4yODEsMC45NjVjMC45NjUsMC42NTIsMS43NDUsMS41ODgsMi4zMzksMi44MTFsLTcuOTEsNC4zODNjLTAuMDgzLTAuMzYzLTAuMDc4LTAuNzI3LDAuMDEyLTEuMDkNCisJCWMwLjA3NC0wLjMxMiwwLjIzNy0wLjY0NiwwLjQ5LTEuMDAyYzAuMjUxLTAuMzU1LDAuNjYyLTAuNjg2LDEuMjMtMC45OWMwLjA0Mi0wLjAyNSwwLjExOC0wLjA3LDAuMjMtMC4xMzcNCisJCWMwLjExLTAuMDY2LDAuMjQ3LTAuMTQ1LDAuNDA3LTAuMjM2YzAuMTYyLTAuMDksMC4zMzctMC4xODksMC41MjctMC4yOTdjMC4xODgtMC4xMDcsMC4zOC0wLjIxNSwwLjU2OC0wLjMyMg0KKwkJYzAuNDU1LTAuMjU2LDAuOTUtMC41MzUsMS40ODUtMC44NGMtMC4zNTQtMC4zOTYtMC43NTktMC42OTctMS4yMTItMC45MDRjLTAuNDM4LTAuMjA3LTAuOTI5LTAuMzExLTEuNDc0LTAuMzExDQorCQljLTEuMDgxLDAtMS45OTIsMC40MDQtMi43MzYsMS4yMTVjLTAuNzQyLDAuODA5LTEuMTE0LDEuODA3LTEuMTE0LDIuOTk2YzAsMS4xODgsMC4zNzIsMi4xODIsMS4xMTQsMi45ODINCisJCWMwLjc0NCwwLjgxOCwxLjY1NSwxLjIyNywyLjczNiwxLjIyN2MxLjAzMSwwLDEuODktMC4zNCwyLjU3NC0xLjAxNmMwLjIzMS0wLjE5NywwLjQxNS0wLjM5MSwwLjU1Mi0wLjU3Ng0KKwkJUzY3MC45MzMsNTQ5Ljk1LDY3MS4xMjMsNTQ5Ljc3NnoiLz4NCisJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xNl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNjc1LjEwODQiIHkxPSI1NDcuNjkwNCIgeDI9IjY4My4yNzkzIiB5Mj0iNTQ3LjY5MDQiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzE2XykiIGQ9Ik02NzguNzExLDU0NC44MTNjLTAuOTA4LDAuNzMyLTEuMzYsMS42OTktMS4zNiwyLjg5NWMwLDEuMTg5LDAuNDUyLDIuMTUyLDEuMzYsMi44ODcNCisJCWMwLjAwOSwwLDAuMDIxLDAuMDA4LDAuMDM3LDAuMDIzbC0wLjA0OS0wLjA0OWMwLjIwNiwwLjE2NCwwLjQxMiwwLjMwOSwwLjYxOSwwLjQzNGMwLjY5MiwwLjM3OSwxLjUwMiwwLjU5OCwyLjQyNiwwLjY1NmgwLjM5Ng0KKwkJYzAuMTMyLTAuMDI1LDAuMjI5LTAuMDcyLDAuMjkxLTAuMTQzYzAuMDYyLTAuMDcsMC4xMDktMC4xNTIsMC4xNDItMC4yNDhjMC4wMzMtMC4wOTQsMC4wNi0wLjE5NSwwLjA4Mi0wLjMwMw0KKwkJYzAuMDItMC4xMDcsMC4wNDktMC4yMDUsMC4wODUtMC4yOTFjMC4wMzgtMC4wODYsMC4wOTItMC4xNiwwLjE2Mi0wLjIyM2MwLjA2OS0wLjA2MiwwLjE3Ni0wLjA5OCwwLjMxNC0wLjEwNQ0KKwkJYzAuMDQzLDAsMC4wNjIsMC4wMTYsMC4wNjIsMC4wNDlsLTAuMDEzLDMuMzNoLTEuMDc2aC0wLjE0OWwtMC4zOTYtMC4wMTJjLTEuOTA2LTAuMDkyLTMuNDQ2LTAuNjQxLTQuNjE4LTEuNjQ2DQorCQljLTEuMjc4LTEuMTA3LTEuOTE5LTIuNTctMS45MTktNC4zOTVjMC0wLjk5LDAuMjI5LTEuOTEyLDAuNjgxLTIuNzZjMC40NzItMC44NTIsMS4xMjItMS41NjQsMS45NTctMi4xNDMNCisJCWMwLjU5NS0wLjM5NiwxLjIyMi0wLjY4MiwxLjg4Mi0wLjg1NWMwLjM5Ni0wLjEwNSwwLjgwMi0wLjE3MiwxLjIyLTAuMTk3YzAuNDE2LTAuMDIzLDAuODYzLTAuMDQ1LDEuMzQzLTAuMDYyaDEuMDc2djIuMDY4djEuMjYyDQorCQljMCwwLjAzMy0wLjAxMiwwLjA0OS0wLjAzNywwLjA0OWMtMC4xNC0wLjAwNi0wLjI0Ny0wLjAzOS0wLjMyMS0wLjA5OGMtMC4wNzQtMC4wNTctMC4xMjctMC4xMzMtMC4xNjEtMC4yMjMNCisJCWMtMC4wMzItMC4wOTItMC4wNjEtMC4xODgtMC4wODEtMC4yOTFjLTAuMDItMC4xMDQtMC4wNDctMC4yMDEtMC4wOC0wLjI5N3MtMC4wODItMC4xOC0wLjE0OC0wLjI1NHMtMC4xNjEtMC4xMjUtMC4yODQtMC4xNDgNCisJCWMtMC43NDItMC4wMzMtMS4zOTYsMC4wNTMtMS45NTcsMC4yNlM2NzkuMTQxLDU0NC40NjYsNjc4LjcxMSw1NDQuODEzeiIvPg0KKwk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE3XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI2ODUuMzk1NSIgeTE9IjU0NS45Mzg1IiB4Mj0iNjkxLjQ2MjkiIHkyPSI1NDUuOTM4NSI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRDBEMkQzIi8+DQorCTwvbGluZWFyR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfMTdfKSIgZD0iTTY5MS4xNzgsNTUwLjc3OGMwLjAyNCwwLjAxLDAuMDM4LDAuMDIxLDAuMDM4LDAuMDM5djIuODcxdjAuMDEyaC0wLjcyYy0wLjA5LDAtMC4xNzcsMC0wLjI1OSwwDQorCQljLTAuMDgzLDAtMC4xNy0wLjAwNC0wLjI2LTAuMDEyaC0wLjAyNmMtMS40MzYtMC4wNzQtMi41MjgtMC40MzktMy4yNzktMS4xMDJjLTAuODUxLTAuNzQyLTEuMjc2LTEuODYzLTEuMjc2LTMuMzY3di04LjQwNnYtMC4wNDkNCisJCXYtMC40ODRjMC4wMS0wLjQ2MSwwLjEyNi0wLjgzLDAuMzQ3LTEuMTA1YzAuMjI1LTAuMjc3LDAuNDcyLTAuNDksMC43NDMtMC42MzljMC4zMTMtMC4xNzQsMC42NzMtMC4yOTMsMS4wNzctMC4zNTl2Mi45NDV2MC41MzMNCisJCXY3LjE4MmMwLDAuOTczLDAuMjM2LDEuNjgyLDAuNzA1LDIuMTI5YzAuNDQ2LDAuNDIsMS4xNDUsMC42NDMsMi4wOTQsMC42NjhjMC4xMzItMC4wMzMsMC4yMi0wLjA5NiwwLjI2Ni0wLjE4Ng0KKwkJYzAuMDQ1LTAuMDkyLDAuMDgtMC4xODQsMC4xMDQtMC4yNzljMC4wMjUtMC4wOTQsMC4wNjQtMC4xOCwwLjExOS0wLjI2QzY5MC45MDMsNTUwLjgzMSw2OTEuMDEzLDU1MC43ODgsNjkxLjE3OCw1NTAuNzc4eg0KKwkJIE02ODguMTU3LDU0MS41ODFoMC4yNmMwLjE1NywwLjAxLDAuMzEsMC4wMTQsMC40NTgsMC4wMTRoMC41ODJjMC40MzgsMC4wMDgsMC43ODgsMC4xMTksMS4wNTMsMC4zMzQNCisJCWMwLjI2NCwwLjIxMywwLjQ2NiwwLjQ0OSwwLjYwNywwLjcwNWMwLjE2NCwwLjI5NywwLjI4LDAuNjM1LDAuMzQ2LDEuMDE2aC0yLjgxMWgtMC41MDdMNjg4LjE1Nyw1NDEuNTgxeiIvPg0KKwk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE4XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI2OTIuOTY3OCIgeTE9IjU0NS4yODkxIiB4Mj0iNjk4LjA3ODEiIHkyPSI1NDUuMjg5MSI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRDBEMkQzIi8+DQorCTwvbGluZWFyR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfMThfKSIgZD0iTTY5Ni42MDEsNTUxLjI2M2MwLjAwOCwwLjQwNCwwLjA1MiwwLjcxNywwLjEzMSwwLjkzNmMwLjA3OCwwLjIxNywwLjE3NCwwLjM4NSwwLjI4NywwLjUNCisJCWMwLjExMiwwLjExNSwwLjIzMiwwLjE5MywwLjM2LDAuMjM2YzAuMTMsMC4wNDEsMC4yNDgsMC4wODYsMC4zNTYsMC4xMzVjMC4xMDgsMC4wNTEsMC4xOTUsMC4xMTksMC4yNjMsMC4yMTENCisJCWMwLjA2NywwLjA5LDAuMDkyLDAuMjM4LDAuMDc0LDAuNDQ1aC01LjFjLTAuMDE3LTAuMjA3LDAuMDA5LTAuMzU1LDAuMDc1LTAuNDQ1YzAuMDY1LTAuMDkyLDAuMTUzLTAuMTU4LDAuMjYyLTAuMjA1DQorCQljMC4xMDgtMC4wNDUsMC4yMjctMC4wOSwwLjM1NS0wLjEzNWMwLjEzLTAuMDQ3LDAuMjUxLTAuMTI1LDAuMzYzLTAuMjM2YzAuMTExLTAuMTExLDAuMjA4LTAuMjc1LDAuMjg3LTAuNDk0DQorCQlzMC4xMjMtMC41MjksMC4xMzEtMC45MzZ2LTkuNjE5YzAuNDI3LDAuMDEsMC44MDQsMC4xNTQsMS4xMzIsMC40MzRjMC4xMzksMC4xMjMsMC4yNzUsMC4yODEsMC40MDYsMC40NzENCisJCWMwLjEzMiwwLjE4OSwwLjI0NywwLjQyOCwwLjM0NiwwLjcxOWMwLjA5OCwwLjI4NywwLjE3MiwwLjYyOSwwLjIyMiwxLjAyMWMwLjA0OSwwLjM5MSwwLjA2NCwwLjg1LDAuMDQ5LDEuMzc5VjU1MS4yNjN6DQorCQkgTTY5Ni41NjMsNTQwLjQ5MWMtMC4zNDYtMC4wNTctMC42NTYtMC4xNTYtMC45MzYtMC4yOTdjLTAuMjQ1LTAuMTE1LTAuNDgxLTAuMjc3LTAuNzA4LTAuNDg4DQorCQljLTAuMjI2LTAuMjExLTAuMzc1LTAuNDg4LTAuNDQ5LTAuODM2di0yLjAxOGMwLjMzNi0wLjAwOCwwLjY0NiwwLjAzNywwLjkyNCwwLjEzN2MwLjEyMywwLjAzOSwwLjI0NCwwLjEwMiwwLjM2MywwLjE4DQorCQljMC4xMTcsMC4wNzgsMC4yMywwLjE3NCwwLjMzOCwwLjI4OWMwLjEwNiwwLjExNSwwLjIwMiwwLjI1OCwwLjI4MywwLjQyMmMwLjA4MSwwLjE2NiwwLjE0MywwLjM1OSwwLjE4NSwwLjU4MnYwLjEyM1Y1NDAuNDkxeiIvPg0KKwk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE5XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI2OTkuNDcxNyIgeTE9IjU0Ny42Nzg3IiB4Mj0iNzExLjY3ODciIHkyPSI1NDcuNjc4NyI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRDBEMkQzIi8+DQorCTwvbGluZWFyR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfMTlfKSIgZD0iTTY5OS40NzIsNTQ3LjY1OWMwLTAuODI0LDAuMTU3LTEuNjIxLDAuNDcxLTIuMzg5YzAuMzA2LTAuNzUsMC43Ni0xLjQzMiwxLjM2Mi0yLjA0Mw0KKwkJYzAuNTc4LTAuNTk0LDEuMjMtMS4wNDMsMS45NTYtMS4zNWMwLjcxOC0wLjMwNSwxLjQ5LTAuNDU3LDIuMzE1LTAuNDU3YzAuODQyLDAsMS42MjEsMC4xNTIsMi4zNCwwLjQ1Nw0KKwkJYzAuNzUxLDAuMzE0LDEuNDA3LDAuNzY0LDEuOTY5LDEuMzVjMC41ODUsMC42MDIsMS4wMywxLjI3OSwxLjMzNywyLjAzMWMwLjMwNSwwLjc0MiwwLjQ1NywxLjU0MywwLjQ1NywyLjQNCisJCWMwLDAuODU5LTAuMTUyLDEuNjY4LTAuNDU3LDIuNDI4Yy0wLjMxNCwwLjc3NS0wLjc2LDEuNDUxLTEuMzM3LDIuMDI5Yy0wLjU2MiwwLjU4OC0xLjIxOCwxLjAzNS0xLjk2OSwxLjM1DQorCQljLTAuNzQzLDAuMzE0LTEuNTIzLDAuNDcxLTIuMzQsMC40NzFjLTAuODAyLDAtMS41NzItMC4xNTYtMi4zMTUtMC40NzFjLTAuNzI2LTAuMzA1LTEuMzc4LTAuNzU2LTEuOTU2LTEuMzUNCisJCWMtMC42MDMtMC42MDItMS4wNTctMS4yODMtMS4zNjItMi4wNDFDNjk5LjYyOSw1NDkuMzA2LDY5OS40NzIsNTQ4LjUwMSw2OTkuNDcyLDU0Ny42NTl6IE03MDEuNzI2LDU0Ny42MzYNCisJCWMwLDEuMTYyLDAuMzc1LDIuMTUyLDEuMTI3LDIuOTcxYzAuNzYsMC44MjYsMS42NjcsMS4yMzgsMi43MjQsMS4yMzhjMS4wNjMsMCwxLjk3Mi0wLjQxMiwyLjcyNC0xLjIzOA0KKwkJYzAuNzYtMC44MDksMS4xMzktMS43OTksMS4xMzktMi45NzFjMC0xLjE1Ni0wLjM3Ni0yLjE0NS0xLjEyNy0yLjk3MWMtMC43NTktMC44MDktMS42NzItMS4yMTUtMi43MzUtMS4yMTUNCisJCWMtMS4wNTcsMC0xLjk2NCwwLjQwNi0yLjcyNCwxLjIxNUM3MDIuMTAxLDU0NS40OTEsNzAxLjcyNiw1NDYuNDc5LDcwMS43MjYsNTQ3LjYzNnoiLz4NCisJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8yMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNzEyLjMwNTciIHkxPSI1NDcuNTc5MSIgeDI9IjcyNS40NDczIiB5Mj0iNTQ3LjU3OTEiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0QwRDJEMyIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzIwXykiIGQ9Ik03MTIuMzEyLDU1My43MjZjLTAuMDE4LTAuMjA3LDAuMDA3LTAuMzUyLDAuMDcyLTAuNDM5YzAuMDY2LTAuMDg2LDAuMTQ5LTAuMTU0LDAuMjQ4LTAuMjAzDQorCQlzMC4yMTItMC4wOTYsMC4zNDItMC4xMzdjMC4xMjctMC4wNDEsMC4yNDUtMC4xMTMsMC4zNTItMC4yMTdjMC4xMDgtMC4xMDQsMC4yLTAuMjU4LDAuMjc4LTAuNDY1DQorCQljMC4wNzgtMC4yMDUsMC4xMjctMC40OTgsMC4xNDQtMC44Nzl2LTQuMjQ0YzAtMS43NSwwLjQ2OS0zLjE0MywxLjQxLTQuMTc0YzAuOTM0LTEuMDIzLDIuMTc5LTEuNTM1LDMuNzM5LTEuNTM1DQorCQljMS41NTIsMCwyLjc5NCwwLjUxMiwzLjcyNywxLjUzNWMwLjkyNSwxLjAyMywxLjM4NywyLjQxNCwxLjM4Nyw0LjE3NHY0LjI5NWMwLjAxNiwwLjM2MywwLjA2NSwwLjY0MywwLjE0OCwwLjg0Mg0KKwkJYzAuMDgyLDAuMTk3LDAuMTc3LDAuMzQ4LDAuMjg1LDAuNDUxYzAuMTA2LDAuMTA0LDAuMjIyLDAuMTc2LDAuMzQ3LDAuMjE3YzAuMTIyLDAuMDQxLDAuMjM1LDAuMDg4LDAuMzM5LDAuMTM3DQorCQljMC4xMDQsMC4wNDksMC4xODUsMC4xMTksMC4yNDIsMC4yMTFjMC4wNTgsMC4wOSwwLjA4MywwLjIzNCwwLjA3NCwwLjQzMmgtMi4yMDNoLTIuNzk5Yy0wLjAxNi0wLjE5NywwLjAwOC0wLjM0MiwwLjA2OS0wLjQzMg0KKwkJYzAuMDYxLTAuMDkyLDAuMTQyLTAuMTYyLDAuMjQtMC4yMTFzMC4yMDktMC4wOTQsMC4zMjgtMC4xMzFjMC4xMi0wLjAzNywwLjIzNS0wLjEwNSwwLjM0Ny0wLjIwMw0KKwkJYzAuMTEyLTAuMSwwLjIwNy0wLjI0NCwwLjI4NS0wLjQzNmMwLjA3Ny0wLjE4OCwwLjEyOS0wLjQ2MSwwLjE1NS0wLjgxNHYtNC43NTRjMC0wLjk1MS0wLjI3Ni0xLjcyNy0wLjgzLTIuMzI4DQorCQljLTAuNTYxLTAuNTk0LTEuMjc2LTAuODkxLTIuMTQyLTAuODkxYy0wLjg2NywwLTEuNTg0LDAuMjk3LTIuMTU1LDAuODkxYy0wLjU2MSwwLjYxMS0wLjg0MiwxLjM4Ny0wLjg0MiwyLjMyOHY0LjkxNA0KKwkJYzAuMDM0LDAuMzEyLDAuMDkzLDAuNTU3LDAuMTc1LDAuNzNjMC4wODMsMC4xNzIsMC4xOCwwLjMwMywwLjI5LDAuMzg5YzAuMTExLDAuMDg4LDAuMjI2LDAuMTQ4LDAuMzQxLDAuMTg4DQorCQljMC4xMTUsMC4wMzUsMC4yMjEsMC4wOCwwLjMxNCwwLjEyOWMwLjA5NiwwLjA0OSwwLjE3LDAuMTIxLDAuMjI1LDAuMjA5YzAuMDUzLDAuMDk0LDAuMDc1LDAuMjMyLDAuMDY4LDAuNDIySDcxMi4zMTJ6Ii8+DQorCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMjFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjczMC41NTE4IiB5MT0iNTQ0LjgyNDIiIHgyPSI3NDYuNjAxNiIgeTI9IjU0NC44MjQyIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRkZGRkYiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNEMEQyRDMiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHBhdGggZmlsbD0idXJsKCNTVkdJRF8yMV8pIiBkPSJNNzQ2LjQ3Myw1MzYuMDM2YzAuMTEsMC4wNTcsMC4xNSwwLjE0MSwwLjExNywwLjI0NmMtMC4wMzMsMC4xMDctMC4xMjcsMC4yMzgtMC4yODUsMC4zOTENCisJCWMtMC4xNTUsMC4xNTQtMC4zMzcsMC4zMi0wLjU0NSwwLjUwMmMtMC4zNywwLjMxMi0wLjc2NywwLjU1Ny0xLjE4OCwwLjcyOWMtMC40MTksMC4xNzYtMC44MjUsMC4yNTQtMS4yMTEsMC4yMzZoMC4wMTFoLTMuNjY0DQorCQl2MTMuMDEyYzAuMDE2LDAuNDEyLDAuMDY4LDAuNzMsMC4xNTUsMC45NTNjMC4wODUsMC4yMjMsMC4xODgsMC4zOTEsMC4zMDksMC41MDhjMC4xMTksMC4xMTUsMC4yNDgsMC4xOTUsMC4zODUsMC4yNA0KKwkJYzAuMTM1LDAuMDQ3LDAuMjYsMC4wOTYsMC4zNywwLjE0OGMwLjExMSwwLjA1NSwwLjIwMywwLjEyOSwwLjI3MywwLjIyM2MwLjA2OCwwLjA5NiwwLjA5OCwwLjI1NiwwLjA4LDAuNDc3aC0yLjQyNmgtMS40MzcNCisJCWMtMC4xOSwwLTAuMzc2LDAtMC41NTgsMHMtMC4zNDksMC0wLjUwMS0wLjAwNmMtMC4xNTMtMC4wMDQtMC4yODMtMC4wMDYtMC4zOTEtMC4wMDZzLTAuMTc3LDAtMC4yMTEsMA0KKwkJYy0wLjAxNi0wLjIyMywwLjAxMi0wLjM4MSwwLjA4MS0wLjQ3N2MwLjA3LTAuMDk0LDAuMTYyLTAuMTY2LDAuMjczLTAuMjE3YzAuMTEtMC4wNDksMC4yMzMtMC4wOTYsMC4zNjUtMC4xNDMNCisJCWMwLjEzMi0wLjA0NSwwLjI1OS0wLjEyMywwLjM4My0wLjIzNHMwLjIzMS0wLjI3MywwLjMyMi0wLjQ4OHMwLjE0NC0wLjUyNSwwLjE2LTAuOTNWNTM4LjE0aC0xLjkzMmgtNC4wNDcNCisJCWMtMC4zMzksMC0wLjU2NC0wLjAyNy0wLjY4MS0wLjA4NmMtMC4xMTUtMC4wNTktMC4xNTUtMC4xNDEtMC4xMTctMC4yNDhjMC4wMzctMC4xMDcsMC4xMzQtMC4yMzQsMC4yODktMC4zODUNCisJCWMwLjE1OC0wLjE0OCwwLjM0NC0wLjMxNiwwLjU1OS0wLjUwOGMwLjM3LTAuMzEyLDAuNzctMC41NTcsMS4xOTMtMC43M2MwLjQyNS0wLjE3MiwwLjgyOC0wLjI1LDEuMjA4LTAuMjMyDQorCQljMC4xNDgsMCwwLjQzNCwwLDAuODU0LDBjMC40MjIsMCwwLjkyNCwwLDEuNTExLDBjMC41ODYsMCwxLjIzMSwwLDEuOTM3LDBjMC43MDgsMCwxLjQxOSwwLDIuMTM3LDBoNS41Nw0KKwkJQzc0Ni4xNDUsNTM1Ljk1LDc0Ni4zNjEsNTM1Ljk3OCw3NDYuNDczLDUzNi4wMzZ6Ii8+DQorCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMjJfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijc0My43OTMiIHkxPSI1NDcuNjc4NyIgeDI9Ijc1NS45OTkiIHkyPSI1NDcuNjc4NyI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRDBEMkQzIi8+DQorCTwvbGluZWFyR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfMjJfKSIgZD0iTTc0My43OTMsNTQ3LjY1OWMwLTAuODI0LDAuMTU2LTEuNjIxLDAuNDctMi4zODljMC4zMDYtMC43NSwwLjc2LTEuNDMyLDEuMzYyLTIuMDQzDQorCQljMC41NzctMC41OTQsMS4yMjktMS4wNDMsMS45NTYtMS4zNWMwLjcxOC0wLjMwNSwxLjQ4OS0wLjQ1NywyLjMxNS0wLjQ1N2MwLjg0MiwwLDEuNjIxLDAuMTUyLDIuMzM5LDAuNDU3DQorCQljMC43NTEsMC4zMTQsMS40MDgsMC43NjQsMS45NjksMS4zNWMwLjU4NSwwLjYwMiwxLjAzMSwxLjI3OSwxLjMzNywyLjAzMWMwLjMwNSwwLjc0MiwwLjQ1OCwxLjU0MywwLjQ1OCwyLjQNCisJCWMwLDAuODU5LTAuMTUzLDEuNjY4LTAuNDU4LDIuNDI4Yy0wLjMxMywwLjc3NS0wLjc1OSwxLjQ1MS0xLjMzNywyLjAyOWMtMC41NjEsMC41ODgtMS4yMTgsMS4wMzUtMS45NjksMS4zNQ0KKwkJYy0wLjc0MywwLjMxNC0xLjUyMywwLjQ3MS0yLjMzOSwwLjQ3MWMtMC44MDIsMC0xLjU3My0wLjE1Ni0yLjMxNS0wLjQ3MWMtMC43MjctMC4zMDUtMS4zNzktMC43NTYtMS45NTYtMS4zNQ0KKwkJYy0wLjYwMy0wLjYwMi0xLjA1Ny0xLjI4My0xLjM2Mi0yLjA0MUM3NDMuOTQ5LDU0OS4zMDYsNzQzLjc5Myw1NDguNTAxLDc0My43OTMsNTQ3LjY1OXogTTc0Ni4wNDUsNTQ3LjYzNg0KKwkJYzAsMS4xNjIsMC4zNzUsMi4xNTIsMS4xMjgsMi45NzFjMC43NTksMC44MjYsMS42NjcsMS4yMzgsMi43MjQsMS4yMzhjMS4wNjIsMCwxLjk3MS0wLjQxMiwyLjcyNC0xLjIzOA0KKwkJYzAuNzU5LTAuODA5LDEuMTM5LTEuNzk5LDEuMTM5LTIuOTcxYzAtMS4xNTYtMC4zNzYtMi4xNDUtMS4xMjctMi45NzFjLTAuNzYtMC44MDktMS42NzMtMS4yMTUtMi43MzUtMS4yMTUNCisJCWMtMS4wNTcsMC0xLjk2NSwwLjQwNi0yLjcyNCwxLjIxNUM3NDYuNDIsNTQ1LjQ5MSw3NDYuMDQ1LDU0Ni40NzksNzQ2LjA0NSw1NDcuNjM2eiIvPg0KKwk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzIzXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI3NTcuNTg0IiB5MT0iNTQ3LjY3ODciIHgyPSI3NjkuNzkiIHkyPSI1NDcuNjc4NyI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRDBEMkQzIi8+DQorCTwvbGluZWFyR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfMjNfKSIgZD0iTTc1Ny41ODQsNTQ3LjY1OWMwLTAuODI0LDAuMTU2LTEuNjIxLDAuNDctMi4zODljMC4zMDYtMC43NSwwLjc2LTEuNDMyLDEuMzYyLTIuMDQzDQorCQljMC41NzctMC41OTQsMS4yMjktMS4wNDMsMS45NTYtMS4zNWMwLjcxOC0wLjMwNSwxLjQ4OS0wLjQ1NywyLjMxNC0wLjQ1N2MwLjg0MSwwLDEuNjIyLDAuMTUyLDIuMzQsMC40NTcNCisJCWMwLjc1MSwwLjMxNCwxLjQwNywwLjc2NCwxLjk2OCwxLjM1YzAuNTg4LDAuNjAyLDEuMDMzLDEuMjc5LDEuMzM3LDIuMDMxYzAuMzA4LDAuNzQyLDAuNDU5LDEuNTQzLDAuNDU5LDIuNA0KKwkJYzAsMC44NTktMC4xNTEsMS42NjgtMC40NTksMi40MjhjLTAuMzEzLDAuNzc1LTAuNzU5LDEuNDUxLTEuMzM3LDIuMDI5Yy0wLjU2MSwwLjU4OC0xLjIxNywxLjAzNS0xLjk2OCwxLjM1DQorCQljLTAuNzQzLDAuMzE0LTEuNTIxLDAuNDcxLTIuMzQsMC40NzFjLTAuOCwwLTEuNTcyLTAuMTU2LTIuMzE0LTAuNDcxYy0wLjcyNy0wLjMwNS0xLjM3OS0wLjc1Ni0xLjk1Ni0xLjM1DQorCQljLTAuNjAzLTAuNjAyLTEuMDU3LTEuMjgzLTEuMzYyLTIuMDQxQzc1Ny43NCw1NDkuMzA2LDc1Ny41ODQsNTQ4LjUwMSw3NTcuNTg0LDU0Ny42NTl6IE03NTkuODM2LDU0Ny42MzYNCisJCWMwLDEuMTYyLDAuMzc3LDIuMTUyLDEuMTI3LDIuOTcxYzAuNzU5LDAuODI2LDEuNjY3LDEuMjM4LDIuNzI0LDEuMjM4YzEuMDY1LDAsMS45NzQtMC40MTIsMi43MjMtMS4yMzgNCisJCWMwLjc2LTAuODA5LDEuMTQtMS43OTksMS4xNC0yLjk3MWMwLTEuMTU2LTAuMzc1LTIuMTQ1LTEuMTI2LTIuOTcxYy0wLjc2LTAuODA5LTEuNjcxLTEuMjE1LTIuNzM2LTEuMjE1DQorCQljLTEuMDU3LDAtMS45NjUsMC40MDYtMi43MjQsMS4yMTVDNzYwLjIxMyw1NDUuNDkxLDc1OS44MzYsNTQ2LjQ3OSw3NTkuODM2LDU0Ny42MzZ6Ii8+DQorCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMjRfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijc3MS4wNTk2IiB5MT0iNTQ0LjkxOTkiIHgyPSI3NzYuMDY4NCIgeTI9IjU0NC45MTk5Ij4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRkZGRkYiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNEMEQyRDMiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHBhdGggZmlsbD0idXJsKCNTVkdJRF8yNF8pIiBkPSJNNzc0LjgwNSw1NTIuMzI3YzAuMDgyLDAuMTg5LDAuMTc3LDAuMzMyLDAuMjg0LDAuNDI4YzAuMTA3LDAuMDk0LDAuMjIsMC4xNjQsMC4zNDEsMC4yMDMNCisJCWMwLjExOSwwLjA0MywwLjIyOSwwLjA4NCwwLjMyNywwLjEzMWMwLjEsMC4wNDUsMC4xNzgsMC4xMTMsMC4yMzYsMC4yMDVjMC4wNTYsMC4wOSwwLjA4MiwwLjIzNCwwLjA3MywwLjQzMmgtMi40NTENCisJCWMtMC4zMTIsMC0wLjYxOSwwLTAuOTE3LDBjLTAuMjk3LDAtMC41NjMtMC4wMDItMC43OTctMC4wMDZjLTAuMjM1LTAuMDA0LTAuNDMtMC4wMDYtMC41ODItMC4wMDZjLTAuMTUzLDAtMC4yMzgsMC0wLjI1NSwwDQorCQljLTAuMDE3LTAuMTg5LDAuMDA1LTAuMzMsMC4wNjItMC40MmMwLjA1OC0wLjA5MiwwLjEzNC0wLjE2LDAuMjI5LTAuMjA1YzAuMDk1LTAuMDQ3LDAuMi0wLjA4OCwwLjMxNS0wLjEyMw0KKwkJYzAuMTE1LTAuMDM5LDAuMjI5LTAuMSwwLjM0LTAuMTg4YzAuMTEyLTAuMDg2LDAuMjA4LTAuMjExLDAuMjkxLTAuMzc3YzAuMDgyLTAuMTY0LDAuMTQyLTAuNDA0LDAuMTc0LTAuNzE5di0xNS41NjENCisJCWMwLjQwMy0wLjAzMywwLjc2NywwLjA1OSwxLjA5LDAuMjczYzAuMTMyLDAuMDg4LDAuMjY1LDAuMjE1LDAuMzk2LDAuMzY5YzAuMTMyLDAuMTU4LDAuMjQ3LDAuMzU5LDAuMzQ2LDAuNjAyDQorCQljMC4xLDAuMjQ0LDAuMTgsMC41MzcsMC4yNDEsMC44NzlzMC4wOTMsMC43NDQsMC4wOTMsMS4yMDd2MTIuMDdDNzc0LjY2Nyw1NTEuODY4LDc3NC43MjIsNTUyLjEzOCw3NzQuODA1LDU1Mi4zMjd6Ii8+DQorPC9nPg0KKzxnPg0KKwkNCisJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMjVfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijc2NS42NDQ1IiB5MT0iMjc3LjczNjgiIHgyPSI4MDguMzgyOCIgeTI9IjI3Ny43MzY4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAgMS43NjI3IC0wLjUzMTMgMCA3NDYuMjU0OCAtOTg1Ljc4NzEpIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDY4MzgiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM4QkM1M0YiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHJlY3QgeD0iNTk2LjMwNSIgeT0iMzYzLjgxNCIgZmlsbD0idXJsKCNTVkdJRF8yNV8pIiB3aWR0aD0iNC43NzciIGhlaWdodD0iNzUuMzM0Ii8+DQorCQ0KKwkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8yNl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNzU2LjExMzMiIHkxPSIyNDcuMzAxMyIgeDI9IjgxMS4wOTE4IiB5Mj0iMjQ3LjMwMTMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMCAxLjg4MzYgLTAuNTMxMyAwIDc0Ni4yNTQ4IC0xMDkwLjYyMykiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwNjgzOCIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzhCQzUzRiIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cmVjdCB4PSI2MTEuODA3IiB5PSIzMzMuNTkyIiBmaWxsPSJ1cmwoI1NWR0lEXzI2XykiIHdpZHRoPSI2LjExMyIgaGVpZ2h0PSIxMDMuNTU3Ii8+DQorCQ0KKwkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8yN18iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNzYyLjA2NjQiIHkxPSIyMTUuNjI1IiB4Mj0iODE3LjA0NTkiIHkyPSIyMTUuNjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAgMi4zODk3IC0wLjUzMTMgMCA3NDYuMjU0OCAtMTUxNy4zNDU3KSI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDA2ODM4Ii8+DQorCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojOEJDNTNGIi8+DQorCTwvbGluZWFyR3JhZGllbnQ+DQorCTxyZWN0IHg9IjYyOC42MzciIHk9IjMwMy43NjQiIGZpbGw9InVybCgjU1ZHSURfMjdfKSIgd2lkdGg9IjYuMTEzIiBoZWlnaHQ9IjEzMS4zODUiLz4NCisJDQorCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzI4XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1NTMuNTgxMSIgeTE9IjQxMS4wNDc5IiB4Mj0iNTk5Ljg4NjciIHkyPSI0MTEuMDQ3OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjc2MDUgMCAwIDAuNTMxMyAxNDQuODY4MiAxNDcuODEzNikiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzhCQzUzRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzAwNjgzOCIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cmVjdCB4PSI1NjUuODY2IiB5PSIzNjMuODE0IiBmaWxsPSJ1cmwoI1NWR0lEXzI4XykiIHdpZHRoPSIzNS4yMTYiIGhlaWdodD0iNC43NzciLz4NCisJDQorCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzI5XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1NTcuNjIyMSIgeTE9IjM1NC44NjU3IiB4Mj0iNjEyLjYwMzUiIHkyPSIzNTQuODY1NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjk0MDggMCAwIDAuNTMxMyA0MS41ODMgMTQ3LjgxMzYpIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM4QkM1M0YiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDY4MzgiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHJlY3QgeD0iNTY2LjE5MyIgeT0iMzMzLjI5NyIgZmlsbD0idXJsKCNTVkdJRF8yOV8pIiB3aWR0aD0iNTEuNzI3IiBoZWlnaHQ9IjYuMTEzIi8+DQorCQ0KKwkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8zMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTU1LjQ2MjQiIHkxPSIyOTkuMzA0NyIgeDI9IjYxNC42ODA3IiB5Mj0iMjk5LjMwNDciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNTc3IDAgMCAwLjUzMTMgLTc2Ljg2NTIgMTQ3LjgxMzYpIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM4QkM1M0YiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDY4MzgiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHJlY3QgeD0iNTY2LjE5MyIgeT0iMzAzLjc3NyIgZmlsbD0idXJsKCNTVkdJRF8zMF8pIiB3aWR0aD0iNjguNTU3IiBoZWlnaHQ9IjYuMTEzIi8+DQorCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjYxNi43NTM5IiB5MT0iNDE2LjY5OTIiIHgyPSI2NjMuNDgxIiB5Mj0iNDYzLjQyNjMiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzhCQzUzRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzhCQzUzRiIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cGF0aCBmaWxsPSJ1cmwoI1NWR0lEXzMxXykiIGQ9Ik01OTMuMzA1LDQ0MC4xNDhjMCwwLDM2LjYwNC0xMi43MjEsNDcuMzg5LTEyLjcyMXM0My40ODQsMTEuNzUsNDYuMTE3LDEyLjVzLTQwLjE5OS01LTQ1LjUzMy01Ii8+DQorCQ0KKwkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zMl8iIGN4PSI1NzYuNTIzNCIgY3k9IjM4Mi43MDEyIiByPSIxMC41MDU5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAgMSAxIDAgMTczLjk4MDUgLTIxMC4zMjAzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMC45NjMyIiBzdHlsZT0ic3RvcC1jb2xvcjojNjdDQTMyIi8+DQorCTwvcmFkaWFsR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfMzJfKSIgZD0iTTU0Ni4xNzYsMzY2LjIwM2MwLTUuODAzLDQuNzA0LTEwLjUwNiwxMC41MDYtMTAuNTA2czEwLjUwNiw0LjcwMywxMC41MDYsMTAuNTA2DQorCQlzLTQuNzA0LDEwLjUwNi0xMC41MDYsMTAuNTA2UzU0Ni4xNzYsMzcyLjAwNiw1NDYuMTc2LDM2Ni4yMDN6IE01NTYuNjgyLDM3Mi45MDZjMS44NTEsMCwzLjUyNi0wLjc1MSw0LjczOS0xLjk2NA0KKwkJczEuOTYzLTIuODg5LDEuOTYzLTQuNzM5YzAtMy43MDItMy4wMDEtNi43MDMtNi43MDItNi43MDNjLTMuNzAyLDAtNi43MDMsMy4wMDEtNi43MDMsNi43MDMNCisJCUM1NDkuOTc5LDM2OS45MDQsNTUyLjk3OSwzNzIuOTA2LDU1Ni42ODIsMzcyLjkwNnoiLz4NCisJDQorCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzMzXyIgY3g9IjU0Ni45NDQ4IiBjeT0iMzgyLjcwMTIiIHI9IjEwLjUwNTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMCAxIDEgMCAxNzMuOTgwNSAtMjEwLjMyMDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQk8c3RvcCAgb2Zmc2V0PSIwLjk2MzIiIHN0eWxlPSJzdG9wLWNvbG9yOiM2N0NBMzIiLz4NCisJPC9yYWRpYWxHcmFkaWVudD4NCisJPHBhdGggZmlsbD0idXJsKCNTVkdJRF8zM18pIiBkPSJNNTQ2LjE3NiwzMzYuNjI0YzAtNS44MDIsNC43MDQtMTAuNTA1LDEwLjUwNi0xMC41MDVzMTAuNTA2LDQuNzAzLDEwLjUwNiwxMC41MDUNCisJCWMwLDUuODAzLTQuNzA0LDEwLjUwNi0xMC41MDYsMTAuNTA2UzU0Ni4xNzYsMzQyLjQyNyw1NDYuMTc2LDMzNi42MjR6IE01NTYuNjgyLDM0My4zMjdjMS44NTEsMCwzLjUyNi0wLjc1LDQuNzM5LTEuOTYzDQorCQlzMS45NjMtMi44ODksMS45NjMtNC43NGMwLTMuNzAyLTMuMDAxLTYuNzAzLTYuNzAyLTYuNzAzYy0zLjcwMiwwLTYuNzAzLDMuMDAxLTYuNzAzLDYuNzAzUzU1Mi45NzksMzQzLjMyNyw1NTYuNjgyLDM0My4zMjd6Ii8+DQorCQ0KKwkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zNF8iIGN4PSI1MTcuMTU0MyIgY3k9IjM4Mi43MDEyIiByPSIxMC41MDU5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAgMSAxIDAgMTczLjk4MDUgLTIxMC4zMjAzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMC45NjMyIiBzdHlsZT0ic3RvcC1jb2xvcjojNjdDQTMyIi8+DQorCTwvcmFkaWFsR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfMzRfKSIgZD0iTTU0Ni4xNzYsMzA2LjgzNGMwLTUuODAyLDQuNzA0LTEwLjUwNiwxMC41MDYtMTAuNTA2czEwLjUwNiw0LjcwNCwxMC41MDYsMTAuNTA2DQorCQljMCw1LjgwMy00LjcwNCwxMC41MDYtMTAuNTA2LDEwLjUwNlM1NDYuMTc2LDMxMi42MzcsNTQ2LjE3NiwzMDYuODM0eiBNNTU2LjY4MiwzMTMuNTM3YzEuODUxLDAsMy41MjYtMC43NTEsNC43MzktMS45NjMNCisJCWMxLjIxMy0xLjIxNCwxLjk2My0yLjg5LDEuOTYzLTQuNzRjMC0zLjcwMi0zLjAwMS02LjcwMy02LjcwMi02LjcwM2MtMy43MDIsMC02LjcwMywzLjAwMS02LjcwMyw2LjcwMw0KKwkJQzU0OS45NzksMzEwLjUzNSw1NTIuOTc5LDMxMy41MzcsNTU2LjY4MiwzMTMuNTM3eiIvPg0KKwkNCisJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMzVfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijc2NS42NDQ1IiB5MT0iMzU3LjYxMjMiIHgyPSI4MDguMzgyOCIgeTI9IjM1Ny42MTIzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAgMS43NjI3IDAuNTMxMyAwIDQ5MS4zMDc1IC05ODUuNzg3MSkiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwNjgzOCIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzhCQzUzRiIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cmVjdCB4PSI2NzguOTE4IiB5PSIzNjMuODE0IiBmaWxsPSJ1cmwoI1NWR0lEXzM1XykiIHdpZHRoPSI0Ljc3NyIgaGVpZ2h0PSI3NS4zMzQiLz4NCisJDQorCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzM2XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI3NTYuMTEzMyIgeTE9IjMyNy4xNzcyIiB4Mj0iODExLjA5MTgiIHkyPSIzMjcuMTc3MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwIDEuODgzNiAwLjUzMTMgMCA0OTEuMzA3NSAtMTA5MC42MjMpIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDY4MzgiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM4QkM1M0YiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHJlY3QgeD0iNjYyLjA4IiB5PSIzMzMuNTkyIiBmaWxsPSJ1cmwoI1NWR0lEXzM2XykiIHdpZHRoPSI2LjExMyIgaGVpZ2h0PSIxMDMuNTU3Ii8+DQorCQ0KKwkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8zN18iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNzYyLjA2NjQiIHkxPSIyOTUuNTAwNSIgeDI9IjgxNy4wNDU5IiB5Mj0iMjk1LjUwMDUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMCAyLjM4OTcgMC41MzEzIDAgNDkxLjMwNzUgLTE1MTcuMzQ1NykiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwNjgzOCIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzhCQzUzRiIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cmVjdCB4PSI2NDUuMjUiIHk9IjMwMy43NjQiIGZpbGw9InVybCgjU1ZHSURfMzdfKSIgd2lkdGg9IjYuMTEzIiBoZWlnaHQ9IjEzMS4zODUiLz4NCisJDQorCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzM4XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OTcuNzc5MyIgeTE9IjQxMS4wNDc5IiB4Mj0iNTQ0LjA4NCIgeTI9IjQxMS4wNDc5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjc2MDUgMCAwIDAuNTMxMyAxMDkyLjY5NDMgMTQ3LjgxMzYpIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM4QkM1M0YiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDY4MzgiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHJlY3QgeD0iNjc4LjkxOCIgeT0iMzYzLjgxNCIgZmlsbD0idXJsKCNTVkdJRF8zOF8pIiB3aWR0aD0iMzUuMjE1IiBoZWlnaHQ9IjQuNzc3Ii8+DQorCQ0KKwkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8zOV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTEyLjUxMzciIHkxPSIzNTQuODY1NyIgeDI9IjU2Ny40OTUxIiB5Mj0iMzU0Ljg2NTciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuOTQwOCAwIDAgMC41MzEzIDExOTUuOTc5NSAxNDcuODEzNikiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzhCQzUzRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzAwNjgzOCIvPg0KKwk8L2xpbmVhckdyYWRpZW50Pg0KKwk8cmVjdCB4PSI2NjIuMDgiIHk9IjMzMy4yOTciIGZpbGw9InVybCgjU1ZHSURfMzlfKSIgd2lkdGg9IjUxLjcyNyIgaGVpZ2h0PSI2LjExMyIvPg0KKwkNCisJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNDBfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUxOC44MDQ3IiB5MT0iMjk5LjMwNDciIHgyPSI1NzguMDIyOSIgeTI9IjI5OS4zMDQ3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0xLjE1NzcgMCAwIDAuNTMxMyAxMzE0LjQyNjggMTQ3LjgxMzYpIj4NCisJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM4QkM1M0YiLz4NCisJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDY4MzgiLz4NCisJPC9saW5lYXJHcmFkaWVudD4NCisJPHJlY3QgeD0iNjQ1LjI1IiB5PSIzMDMuNzc3IiBmaWxsPSJ1cmwoI1NWR0lEXzQwXykiIHdpZHRoPSI2OC41NTciIGhlaWdodD0iNi4xMTMiLz4NCisJDQorCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzQxXyIgY3g9IjU3Ni41MjM0IiBjeT0iMzQwLjI2MzciIHI9IjEwLjUwNTkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgMTA2My41ODIgLTIxMC4zMjAzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMC45NjMyIiBzdHlsZT0ic3RvcC1jb2xvcjojNjdDQTMyIi8+DQorCTwvcmFkaWFsR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfNDFfKSIgZD0iTTcyMy4zMTgsMzc2LjcwOWMtNS44MDMsMC0xMC41MDYtNC43MDMtMTAuNTA2LTEwLjUwNnM0LjcwMy0xMC41MDYsMTAuNTA2LTEwLjUwNg0KKwkJYzUuODAxLDAsMTAuNTA2LDQuNzAzLDEwLjUwNiwxMC41MDZTNzI5LjExOSwzNzYuNzA5LDcyMy4zMTgsMzc2LjcwOXogTTczMC4wMjEsMzY2LjIwM2MwLTMuNzAyLTMuMDAyLTYuNzAzLTYuNzAzLTYuNzAzDQorCQlzLTYuNzAzLDMuMDAxLTYuNzAzLDYuNzAzYzAsMS44NTEsMC43NSwzLjUyNiwxLjk2Myw0LjczOXMyLjg4OSwxLjk2NCw0Ljc0LDEuOTY0QzcyNy4wMiwzNzIuOTA2LDczMC4wMjEsMzY5LjkwNCw3MzAuMDIxLDM2Ni4yMDMNCisJCXoiLz4NCisJDQorCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzQyXyIgY3g9IjU0Ni45NDQ4IiBjeT0iMzQwLjI2MzciIHI9IjEwLjUwNTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgMTA2My41ODIgLTIxMC4zMjAzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPg0KKwkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIvPg0KKwkJPHN0b3AgIG9mZnNldD0iMC45NjMyIiBzdHlsZT0ic3RvcC1jb2xvcjojNjdDQTMyIi8+DQorCTwvcmFkaWFsR3JhZGllbnQ+DQorCTxwYXRoIGZpbGw9InVybCgjU1ZHSURfNDJfKSIgZD0iTTcyMy4zMTgsMzQ3LjEzYy01LjgwMywwLTEwLjUwNi00LjcwMy0xMC41MDYtMTAuNTA2YzAtNS44MDIsNC43MDMtMTAuNTA1LDEwLjUwNi0xMC41MDUNCisJCWM1LjgwMSwwLDEwLjUwNiw0LjcwMywxMC41MDYsMTAuNTA1QzczMy44MjQsMzQyLjQyNyw3MjkuMTE5LDM0Ny4xMyw3MjMuMzE4LDM0Ny4xM3ogTTczMC4wMjEsMzM2LjYyNA0KKwkJYzAtMy43MDItMy4wMDItNi43MDMtNi43MDMtNi43MDNzLTYuNzAzLDMuMDAxLTYuNzAzLDYuNzAzYzAsMS44NTIsMC43NSwzLjUyNywxLjk2Myw0Ljc0czIuODg5LDEuOTYzLDQuNzQsMS45NjMNCisJCUM3MjcuMDIsMzQzLjMyNyw3MzAuMDIxLDM0MC4zMjYsNzMwLjAyMSwzMzYuNjI0eiIvPg0KKwkNCisJCTxyYWRpYWxHcmFkaWVudCBpZD0iU1ZHSURfNDNfIiBjeD0iNTE3LjE1NDMiIGN5PSIzNDAuMjYzNyIgcj0iMTAuNTA1OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwIDEgLTEgMCAxMDYzLjU4MiAtMjEwLjMyMDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQorCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQorCQk8c3RvcCAgb2Zmc2V0PSIwLjk2MzIiIHN0eWxlPSJzdG9wLWNvbG9yOiM2N0NBMzIiLz4NCisJPC9yYWRpYWxHcmFkaWVudD4NCisJPHBhdGggZmlsbD0idXJsKCNTVkdJRF80M18pIiBkPSJNNzIzLjMxOCwzMTcuMzRjLTUuODAzLDAtMTAuNTA2LTQuNzAzLTEwLjUwNi0xMC41MDZjMC01LjgwMiw0LjcwMy0xMC41MDYsMTAuNTA2LTEwLjUwNg0KKwkJYzUuODAxLDAsMTAuNTA2LDQuNzA0LDEwLjUwNiwxMC41MDZDNzMzLjgyNCwzMTIuNjM3LDcyOS4xMTksMzE3LjM0LDcyMy4zMTgsMzE3LjM0eiBNNzMwLjAyMSwzMDYuODM0DQorCQljMC0zLjcwMi0zLjAwMi02LjcwMy02LjcwMy02LjcwM3MtNi43MDMsMy4wMDEtNi43MDMsNi43MDNjMCwxLjg1MSwwLjc1LDMuNTI2LDEuOTYzLDQuNzRjMS4yMTMsMS4yMTIsMi44ODksMS45NjMsNC43NCwxLjk2Mw0KKwkJQzcyNy4wMiwzMTMuNTM3LDczMC4wMjEsMzEwLjUzNSw3MzAuMDIxLDMwNi44MzR6Ii8+DQorPC9nPg0KKzwvc3ZnPg0KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9hcnQvYmFja2duZC5wbmcgYi9jb20zMi9oZHQvYXJ0L2JhY2tnbmQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MWVmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvYXJ0L2JhY2tnbmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9hcnQvZGlzcGxheS5wbmcgYi9jb20zMi9oZHQvYXJ0L2Rpc3BsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZmFiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvYXJ0L2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9hcnQvaGR0LWJsYWNrLnBuZyBiL2NvbTMyL2hkdC9hcnQvaGR0LWJsYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZkZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2FydC9oZHQtYmxhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9hcnQvaGR0LnBuZyBiL2NvbTMyL2hkdC9hcnQvaGR0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFkOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2FydC9oZHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9hcnQvcmVkLnBuZyBiL2NvbTMyL2hkdC9hcnQvcmVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTYxNmFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2FydC9yZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9mbG9wcHkvaGR0LmNmZyBiL2NvbTMyL2hkdC9mbG9wcHkvaGR0LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjRjNGUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2Zsb3BweS9oZHQuY2ZnCkBAIC0wLDAgKzEsMTE1IEBACitVSSBtZW51LmMzMgorREVGQVVMVCBoZHQKK1BST01QVCAwCitUSU1FT1VUIDUwCitNRU5VIFRJVExFIEhhcmR3YXJlIERldGVjdGlvbiBUb29sIChIRFQpIHZlcnNpb24gJVZFUlNJT04lICglQ09ERU5BTUUlKQorTUVOVSBNQVJHSU4gMAorTUVOVSBST1dTIDE1CitNRU5VIFRBQk1TRworTUVOVSBUQUJNU0dST1cgLTMKK01FTlUgQ01ETElORVJPVyAtMworTUVOVSBIRUxQTVNHUk9XIC00CitNRU5VIEhFTFBNU0dFTkRST1cgLTEKKworTUVOVSBDT0xPUiBTQ1JFRU4gMzc7NDAKK01FTlUgQ09MT1IgQk9SREVSIDM0OzQwCitNRU5VIENPTE9SIFRJVExFIDE7MzM7NDAKK01FTlUgQ09MT1IgU0NST0xMQkFSIDM0OzQ2CitNRU5VIENPTE9SIFNFTCAzMDs0NworTUVOVSBDT0xPUiBVTlNFTCAzNjs0MAorTUVOVSBDT0xPUiBDTURNQVJLIDM3OzQwCitNRU5VIENPTE9SIENNRExJTkUgMzc7NDAKK01FTlUgQ09MT1IgVEFCTVNHIDM3OzQwCitNRU5VIENPTE9SIERJU0FCTEVEIDM3OzQwCitNRU5VIENPTE9SIEhFTFAgMzI7NDAKKworTEFCRUwgaGR0CitNRU5VIExBQkVMIE1lbnUgbW9kZQorTUVOVSBERUZBVUxUCitURVhUIEhFTFAKKyBTdGFydHMgSERUIHVzaW5nIHRoZSBNRU5VIG1vZGUKK0VORFRFWFQKK0NPTTMyIGhkdC5jMzIKK0FQUEVORCBtb2R1bGVzX3BjaW1hcD1tb2R1bGVzLnBjaW1hcCBtb2R1bGVzX2FsaWFzPW1vZHVsZXMuYWxpYXMgcGNpaWRzPXBjaS5pZHMgcXVpZXQKKworTEFCRUwgY2xpCitNRU5VIExBQkVMIENMSSAoVkVTQSBtb2RlKQorVEVYVCBIRUxQCisgU3RhcnRzIEhEVCB1c2luZyB0aGUgQ29tbWFuZCBMaW5lIEludGVyZmFjZSAoQ0xJKQorIFZFU0EgbW9kZSBpcyBlbmFibGVkCitFTkRURVhUCitDT00zMiBoZHQuYzMyCitBUFBFTkQgbW9kdWxlc19wY2ltYXA9bW9kdWxlcy5wY2ltYXAgbW9kdWxlc19hbGlhcz1tb2R1bGVzLmFsaWFzIHBjaWlkcz1wY2kuaWRzIHF1aWV0IG5vbWVudSB2ZXNhCisKK0xBQkVMIHZlc2EKK01FTlUgTEFCRUwgQ0xJIChUZXh0IG1vZGUpCitURVhUIEhFTFAKKyBTdGFydHMgSERUIHVzaW5nIHRoZSBDb21tYW5kIExpbmUgSW50ZXJmYWNlIChDTEkpCisgVkVTQSBtb2RlIGlzIGRpc2FibGVkCitFTkRURVhUCitDT00zMiBoZHQuYzMyCitBUFBFTkQgbW9kdWxlc19wY2ltYXA9bW9kdWxlcy5wY2ltYXAgbW9kdWxlc19hbGlhcz1tb2R1bGVzLmFsaWFzIHBjaWlkcz1wY2kuaWRzIHF1aWV0IG5vbWVudQorCitMQUJFTCBzdW1tYXJ5CitNRU5VIExBQkVMIENMSSAoQXV0byBzdW1tYXJ5KQorVEVYVCBIRUxQCisgU3RhcnRzIEhEVCB1c2luZyB0aGUgQ29tbWFuZCBMaW5lIEludGVyZmFjZSAoQ0xJKSBhbmQgcnVuICdzaG93IHN1bW1hcnknCisgVkVTQSBtb2RlIGlzIGVuYWJsZWQKK0VORFRFWFQKK0NPTTMyIGhkdC5jMzIKK0FQUEVORCBtb2R1bGVzX3BjaW1hcD1tb2R1bGVzLnBjaW1hcCBtb2R1bGVzX2FsaWFzPW1vZHVsZXMuYWxpYXMgcGNpaWRzPXBjaS5pZHMgcXVpZXQgdmVzYSBub21lbnUgYXV0bz0nc2hvdyBzdW1tYXJ5JworCitMQUJFTCB2ZXJib3NlCitNRU5VIExBQkVMIENMSSAoVkVTQSBtb2RlICYgVmVyYm9zZSkKK1RFWFQgSEVMUAorIFN0YXJ0cyBIRFQgdXNpbmcgdGhlIENvbW1hbmQgTGluZSBJbnRlcmZhY2UgKENMSSkgdXNpbmcgdGhlIHZlcmJvc2UgbW9kZQorIFZFU0EgbW9kZSBpcyBlbmFibGVkCitFTkRURVhUCitDT00zMiBoZHQuYzMyCitBUFBFTkQgbW9kdWxlc19wY2ltYXA9bW9kdWxlcy5wY2ltYXAgbW9kdWxlc19hbGlhcz1tb2R1bGVzLmFsaWFzIHBjaWlkcz1wY2kuaWRzIHZlc2Egbm9tZW51IHZlcmJvc2UKKworTEFCRUwgdmVyYm9zZS10ZXh0CitNRU5VIExBQkVMIENMSSAoVGV4dCBtb2RlICYgVmVyYm9zZSkKK1RFWFQgSEVMUAorIFN0YXJ0cyBIRFQgdXNpbmcgdGhlIENvbW1hbmQgTGluZSBJbnRlcmZhY2UgKENMSSkKKyBWRVNBIG1vZGUgaXMgZGlzYWJsZWQKK0VORFRFWFQKK0NPTTMyIGhkdC5jMzIKK0FQUEVORCBtb2R1bGVzX3BjaW1hcD1tb2R1bGVzLnBjaW1hcCBtb2R1bGVzX2FsaWFzPW1vZHVsZXMuYWxpYXMgcGNpaWRzPXBjaS5pZHMgdmVyYm9zZSBub21lbnUKKworTEFCRUwgZHVtcAorTUVOVSBMQUJFTCBEdW1wIGhhcmR3YXJlIGNvbmZpZyB0byBURlRQIHNlcnZlciAKK1RFWFQgSEVMUAorIFN0YXJ0cyBIRFQgdXNpbmcgdGhlIENvbW1hbmQgTGluZSBJbnRlcmZhY2UgKENMSSkgYW5kIHJ1biAnZHVtcCcKKyBWRVNBIG1vZGUgaXMgZW5hYmxlZAorRU5EVEVYVAorQ09NMzIgaGR0LmMzMgorQVBQRU5EIG1vZHVsZXNfcGNpbWFwPW1vZHVsZXMucGNpbWFwIG1vZHVsZXNfYWxpYXM9bW9kdWxlcy5hbGlhcyBwY2lpZHM9cGNpLmlkcyBxdWlldCB2ZXNhIG5vbWVudSBhdXRvPSdkdW1wJworCitMQUJFTCBwb3N0ZXhlYworTUVOVSBMQUJFTCBEdW1wIG1lbW9yeSBpbmZvLCBzbGVlcCA1IGFuZCBzdGFydCBtZW10ZXN0IGVudHJ5IAorVEVYVCBIRUxQCisgU3RhcnRzIEhEVCB1c2luZyB0aGUgQ29tbWFuZCBMaW5lIEludGVyZmFjZSAoQ0xJKSwgc2hvdyBhbiBpdGVtLCBzYXkgYSBtZXNzYWdlIHJlYm9vdCBhbmQgc3RhcnQgbWVtdGVzdAorIFZFU0EgbW9kZSBpcyBlbmFibGVkCitFTkRURVhUCitDT00zMiBoZHQuYzMyCitBUFBFTkQgbW9kdWxlc19wY2ltYXA9bW9kdWxlcy5wY2ltYXAgbW9kdWxlc19hbGlhcz1tb2R1bGVzLmFsaWFzIHBjaWlkcz1wY2kuaWRzIHF1aWV0IHZlc2Egbm9tZW51IGF1dG89J3Nob3cgbWVtb3J5O3NheSBgIyMjIyMjIyNgO3NheSBgU3RhcnRpbmcgbWVtdGVzdCBpbiA1IHNlY2A7c2xlZXAgNTtleGl0JyBwb3N0ZXhlYz0nbWVtdGVzdCcKKworTEFCRUwgZGlzcGxheQorTUVOVSBMQUJFTCBEaXNwbGF5IGZlYXR1cmUgKFZFU0EgbW9kZSkKK1RFWFQgSEVMUAorIFN0YXJ0cyBIRFQgdXNpbmcgdGhlIENvbW1hbmQgTGluZSBJbnRlcmZhY2UgKENMSSkKKyBWRVNBIG1vZGUgaXMgZW5hYmxlZAorIEEgUGljdHVyZSBpcyBzaG93biBieSB1c2luZyB0aGUgZGlzcGxheSBjb21tYW5kCitFTkRURVhUCitDT00zMiBoZHQuYzMyCitBUFBFTkQgbW9kdWxlc19wY2ltYXA9bW9kdWxlcy5wY2ltYXAgbW9kdWxlc19hbGlhcz1tb2R1bGVzLmFsaWFzIHBjaWlkcz1wY2kuaWRzIHNpbGVudCBub21lbnUgdmVzYSBhdXRvPSdkaXNwbGF5IGRpc3BsYXkucG5nOyBzbGVlcCA1MDAwOyBkaXNwbGF5IHJlZC5wbmcnCisKK01FTlUgU0VQQVJBVE9SCisKK0xBQkVMIG1lbXRlc3QKK01FTlUgTEFCRUwgTWVtdGVzdDg2KyA0LjIwCitURVhUIEhFTFAKKyBTdGFydHMgTWVtdGVzdDg2KyA0LjIwCitFTkRURVhUCitMSU5VWCBtZW10ZXN0LmJpbgpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2Zsb3BweS9tdG9vbHMuY29uZiBiL2NvbTMyL2hkdC9mbG9wcHkvbXRvb2xzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiZTJjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9mbG9wcHkvbXRvb2xzLmNvbmYKQEAgLTAsMCArMSwyIEBACisjIEZsb3BweSBpbWFnZSBmb3IgSERUCitkcml2ZSBhOiBmaWxlPSJoZHQuaW1nIgpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1hdGEuYyBiL2NvbTMyL2hkdC9oZHQtYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhMTdiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtYXRhLmMKQEAgLTAsMCArMSwzOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8ZGlzay9nZW9tLmg+CisjaW5jbHVkZSA8ZGlzay91dGlsLmg+CisKKyNpbmNsdWRlICJjb20zMmlvLmgiCisjaW5jbHVkZSAiaGR0LWNvbW1vbi5oIgorI2luY2x1ZGUgImhkdC1hdGEuaCIKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtYXRhLmggYi9jb20zMi9oZHQvaGR0LWF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzVhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWF0YS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBERUZJTkVfSERUX0FUQV9ICisjZGVmaW5lIERFRklORV9IRFRfQVRBX0gKKyNpbmNsdWRlIDxjb20zMmlvLmg+CisKKyNpbmNsdWRlIDxkaXNrL2dlb20uaD4KKyNpbmNsdWRlICJoZHQuaCIKKworc3RydWN0IGF0YV9pZGVudGlmeV9kZXZpY2UgeworICAgIHVuc2lnbmVkIHNob3J0IHdvcmRzMDAwXzAwOVsxMF07CisgICAgdW5zaWduZWQgY2hhciBzZXJpYWxfbm9bMjBdOworICAgIHVuc2lnbmVkIHNob3J0IHdvcmRzMDIwXzAyMlszXTsKKyAgICB1bnNpZ25lZCBjaGFyIGZ3X3Jldls4XTsKKyAgICB1bnNpZ25lZCBjaGFyIG1vZGVsWzQwXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3b3JkczA0N18wNzlbMzNdOworICAgIHVuc2lnbmVkIHNob3J0IG1ham9yX3Jldl9udW07CisgICAgdW5zaWduZWQgc2hvcnQgbWlub3JfcmV2X251bTsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb21tYW5kX3NldF8xOworICAgIHVuc2lnbmVkIHNob3J0IGNvbW1hbmRfc2V0XzI7CisgICAgdW5zaWduZWQgc2hvcnQgY29tbWFuZF9zZXRfZXh0ZW5zaW9uOworICAgIHVuc2lnbmVkIHNob3J0IGNmc19lbmFibGVfMTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3b3JkMDg2OworICAgIHVuc2lnbmVkIHNob3J0IGNzZl9kZWZhdWx0OworICAgIHVuc2lnbmVkIHNob3J0IHdvcmRzMDg4XzI1NVsxNjhdOworfSBBVFRSX1BBQ0tFRDsKKworc3RydWN0IGF0YV9kcml2ZWluZm8geworICAgIHN0cnVjdCBhdGFfaWRlbnRpZnlfZGV2aWNlIGFpZDsJLyogSURFTlRJRlkgeHh4IERFVklDRSBkYXRhICovCisgICAgY2hhciBob3N0X2J1c190eXBlWzVdOworICAgIGNoYXIgaW50ZXJmYWNlX3R5cGVbOV07CisgICAgY2hhciBpbnRlcmZhY2VfcG9ydDsKK30gQVRUUl9QQUNLRUQ7CisKKy8qIFVzZWxlc3Mgc3R1ZmYgdW50aWwgSSBtYW5hZ2UgaG93IHRvIHNlbmQgYXRhIHBhY2tldHMgKi8KKyNpZmRlZiBBVEEKK2VudW0geworICAgIEFUQV9JRF9GV19SRVYgPSAyMywKKyAgICBBVEFfSURfUFJPRCA9IDI3LAorICAgIEFUQV9JRF9GV19SRVZfTEVOID0gOCwKKyAgICBBVEFfSURfUFJPRF9MRU4gPSA0MCwKK307Cit2b2lkIGF0YV9pZF9jX3N0cmluZyhjb25zdCB1aW50MTZfdCAqIGlkLCB1bnNpZ25lZCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgb2ZzLAorCQkgICAgIHVuc2lnbmVkIGludCBsZW4pOwordm9pZCBhdGFfaWRfc3RyaW5nKGNvbnN0IHVpbnQxNl90ICogaWQsIHVuc2lnbmVkIGNoYXIgKnMsIHVuc2lnbmVkIGludCBvZnMsCisJCSAgIHVuc2lnbmVkIGludCBsZW4pOwordm9pZCBwcmludHJlZ3MoY29uc3QgY29tMzJzeXNfdCAqIHIpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1jbGktYWNwaS5jIGIvY29tMzIvaGR0L2hkdC1jbGktYWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YjBjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWNsaS1hY3BpLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAiaGR0LWNsaS5oIgorI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisKKy8qIFByaW50IEFDUEkncyB0YWJsZSBoZWFkZXIgaW4gYSBkZWZpbmVkIGZvcm1hdGluZyAqLworc3RhdGljIHZvaWQgc2hvd19oZWFkZXIodm9pZCAqYWRkcmVzcywgc19hY3BpX2Rlc2NyaXB0aW9uX2hlYWRlciAqIGgpCit7CisgICAgbW9yZV9wcmludGYoIiUtNHMgdiUwM3ggJS02cyAlLThzIDB4JTA4eCAlLTdzIDB4JTA4eCBAIDB4JXBcbiIsCisJCWgtPnNpZ25hdHVyZSwgaC0+cmV2aXNpb24sIGgtPm9lbV9pZCwgaC0+b2VtX3RhYmxlX2lkLAorCQloLT5vZW1fcmV2aXNpb24sIGgtPmNyZWF0b3JfaWQsIGgtPmNyZWF0b3JfcmV2aXNpb24sIGFkZHJlc3MpCit9CisKKy8qIFRoYXQncyBhbiBoZWxwZXIgdG8gdmlzdWFsaXplIGNvbHVtbnMqLworc3RhdGljIHZvaWQgc2hvd190YWJsZV9zZXBhcmF0b3Iodm9pZCkKK3sKKyAgICBtb3JlX3ByaW50ZgorCSgiLS0tLXwtLS0tfC0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworfQorCisvKiBEaXNwbGF5IHRoZSBtYWluIGhlYWRlciBiZWZvcmUgZGlzcGxheWluZyB0aGUgQUNQSSB0YWJsZXMgKi8KK3N0YXRpYyB2b2lkIHNob3dfdGFibGVfbmFtZSh2b2lkKQoreworICAgIG1vcmVfcHJpbnRmCisJKCJBQ1BJIHJldiAgb2VtICAgIHRhYmxlX2lkIG9lbV9yZXYgICAgY3JlYXRvciBjcmVhdF9yZXYgIEAgYWRkcmVzcyBcbiIpOworICAgIHNob3dfdGFibGVfc2VwYXJhdG9yKCk7Cit9CisKKy8qIGNhbGxlZCBieSAic2hvdyBhY3BpIiAqLwordm9pZCBtYWluX3Nob3dfYWNwaShpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCSAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKworICAgIGlmIChoYXJkd2FyZS0+aXNfYWNwaV92YWxpZCA9PSBmYWxzZSkgeworCW1vcmVfcHJpbnRmKCJObyBBQ1BJIFRhYmxlcyBkZXRlY3RlZFxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIHNob3dfdGFibGVfbmFtZSgpOworCisgICAgLyogUlNEUCB0YWJsZXMgYXJlbid0IHVzaW5nIHRoZSBzYW1lIGhlYWRlcnMgYXMgdGhlIG90aGVyCisgICAgICogU28gbGV0J3MgdXNlIGEgZGVkaWNhdGVkIHJlbmRlcmluZyAqLworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5yc2RwLnZhbGlkKSB7CisJc19yc2RwICpyID0gJmhhcmR3YXJlLT5hY3BpLnJzZHA7CisJbW9yZV9wcmludGYKKwkgICAgKCJSU0RQIHYlMDN4ICUtNnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAlcFxuIiwKKwkgICAgIHItPnJldmlzaW9uLCByLT5vZW1faWQsIHItPmFkZHJlc3MpOworICAgIH0KKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5yc2R0LnZhbGlkKQorCXNob3dfaGVhZGVyKGhhcmR3YXJlLT5hY3BpLnJzZHQuYWRkcmVzcywKKwkJICAgICAgICZoYXJkd2FyZS0+YWNwaS5yc2R0LmhlYWRlcik7CisKKyAgICBpZiAoaGFyZHdhcmUtPmFjcGkueHNkdC52YWxpZCkKKwlzaG93X2hlYWRlcihoYXJkd2FyZS0+YWNwaS54c2R0LmFkZHJlc3MsCisJCSAgICAgICAmaGFyZHdhcmUtPmFjcGkueHNkdC5oZWFkZXIpOworCisgICAgaWYgKGhhcmR3YXJlLT5hY3BpLmZhZHQudmFsaWQpCisJc2hvd19oZWFkZXIoaGFyZHdhcmUtPmFjcGkuZmFkdC5hZGRyZXNzLCAmaGFyZHdhcmUtPmFjcGkuZmFkdC5oZWFkZXIpOworCisgICAgaWYgKGhhcmR3YXJlLT5hY3BpLmRzZHQudmFsaWQpCisJc2hvd19oZWFkZXIoaGFyZHdhcmUtPmFjcGkuZHNkdC5hZGRyZXNzLCAmaGFyZHdhcmUtPmFjcGkuZHNkdC5oZWFkZXIpOworCisgICAgLyogU1NEVCBpbmNsdWRlcyBtYW55IG9wdGlvbmFsIHRhYmxlcywgbGV0J3MgZGlzcGxheSB0aGVtICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYXJkd2FyZS0+YWNwaS5zc2R0X2NvdW50OyBpKyspIHsKKwlpZiAoKGhhcmR3YXJlLT5hY3BpLnNzZHRbaV0gIT0gTlVMTCkgJiYgKGhhcmR3YXJlLT5hY3BpLnNzZHRbaV0tPnZhbGlkKSkKKwkgICAgc2hvd19oZWFkZXIoaGFyZHdhcmUtPmFjcGkuc3NkdFtpXS0+YWRkcmVzcywKKwkJCSZoYXJkd2FyZS0+YWNwaS5zc2R0W2ldLT5oZWFkZXIpOworICAgIH0KKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5zYnN0LnZhbGlkKQorCXNob3dfaGVhZGVyKGhhcmR3YXJlLT5hY3BpLnNic3QuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLnNic3QuaGVhZGVyKTsKKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5lY2R0LnZhbGlkKQorCXNob3dfaGVhZGVyKGhhcmR3YXJlLT5hY3BpLmVjZHQuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLmVjZHQuaGVhZGVyKTsKKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5ocGV0LnZhbGlkKQorCXNob3dfaGVhZGVyKGhhcmR3YXJlLT5hY3BpLmhwZXQuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLmhwZXQuaGVhZGVyKTsKKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS50Y3BhLnZhbGlkKQorCXNob3dfaGVhZGVyKGhhcmR3YXJlLT5hY3BpLnRjcGEuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLnRjcGEuaGVhZGVyKTsKKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5tY2ZnLnZhbGlkKQorCXNob3dfaGVhZGVyKGhhcmR3YXJlLT5hY3BpLm1jZmcuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLm1jZmcuaGVhZGVyKTsKKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5zbGljLnZhbGlkKQorCXNob3dfaGVhZGVyKGhhcmR3YXJlLT5hY3BpLnNsaWMuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLnNsaWMuaGVhZGVyKTsKKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5ib290LnZhbGlkKQorCXNob3dfaGVhZGVyKGhhcmR3YXJlLT5hY3BpLmJvb3QuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLmJvb3QuaGVhZGVyKTsKKworICAgIC8qIEZBQ1MgaXNuJ3QgaGF2aW5nIHRoZSBzYW1lIGhlYWRlcnMsIGxldCdzIHVzZSBhIGRlZGljYXRlZCByZW5kZXJpbmcgKi8KKyAgICBpZiAoaGFyZHdhcmUtPmFjcGkuZmFjcy52YWxpZCkgeworCXNfZmFjcyAqZmEgPSAmaGFyZHdhcmUtPmFjcGkuZmFjczsKKwltb3JlX3ByaW50ZgorCSAgICAoIkZBQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAweCVwXG4iLAorCSAgICAgZmEtPmFkZHJlc3MpOworICAgIH0KKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5tYWR0LnZhbGlkKQorCXNob3dfaGVhZGVyKGhhcmR3YXJlLT5hY3BpLm1hZHQuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLm1hZHQuaGVhZGVyKTsKKworICAgIG1vcmVfcHJpbnRmKCJcbkxvY2FsIEFQSUMgYXQgMHglMDh4XG4iLCBoYXJkd2FyZS0+YWNwaS5tYWR0LmxvY2FsX2FwaWNfYWRkcmVzcyk7Cit9CisKKy8qIExldCdzIGRpc3BsYXkgdGhlIFByb2Nlc3NvciBMb2NhbCBBUElDIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyB2b2lkIHNob3dfbG9jYWxfYXBpYyhzX21hZHQgKiBtYWR0KQoreworICAgIGlmIChtYWR0LT5wcm9jZXNzb3JfbG9jYWxfYXBpY19jb3VudCA9PSAwKSB7CisJbW9yZV9wcmludGYoIk5vIFByb2Nlc3NvciBMb2NhbCBBUElDIGZvdW5kXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogRm9yIGFsbCBkZXRlY3RlZCBsb2dpY2FsIENQVSAqLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFkdC0+cHJvY2Vzc29yX2xvY2FsX2FwaWNfY291bnQ7IGkrKykgeworCXNfcHJvY2Vzc29yX2xvY2FsX2FwaWMgKnNsYSA9ICZtYWR0LT5wcm9jZXNzb3JfbG9jYWxfYXBpY1tpXTsKKwljaGFyIGJ1ZmZlcls4XTsKKwltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisJc3RyY3B5KGJ1ZmZlciwgImRpc2FibGUiKTsKKwkvKiBMZXQncyBjaGVjayBpZiB0aGUgZmxhZ3MgcmVwb3J0cyB0aGUgY3B1IGFzIGVuYWJsZWQgKi8KKwlpZiAoKHNsYS0+ZmxhZ3MgJiBQUk9DRVNTT1JfTE9DQUxfQVBJQ19FTkFCTEUpID09CisJICAgIFBST0NFU1NPUl9MT0NBTF9BUElDX0VOQUJMRSkKKwkgICAgc3RyY3B5KGJ1ZmZlciwgImVuYWJsZSIpOworCW1vcmVfcHJpbnRmKCJDUFUgIyV1LCBMQVBJQyAoYWNwaV9pZFsweCUwMnhdIGFwaWNfaWRbMHglMDJ4XSkgJXNcbiIsCisJCSAgICBzbGEtPmFwaWNfaWQsIHNsYS0+YWNwaV9pZCwgc2xhLT5hcGljX2lkLCBidWZmZXIpOworICAgIH0KK30KKworLyogRGlzcGxheSB0aGUgbG9jYWwgYXBpYyBOTUkgY29uZmlndXJhdGlvbiAqLworc3RhdGljIHZvaWQgc2hvd19sb2NhbF9hcGljX25taShzX21hZHQgKiBtYWR0KQoreworICAgIGlmIChtYWR0LT5sb2NhbF9hcGljX25taV9jb3VudCA9PSAwKSB7CisJbW9yZV9wcmludGYoIk5vIExvY2FsIEFQSUMgTk1JIGZvdW5kXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYWR0LT5sb2NhbF9hcGljX25taV9jb3VudDsgaSsrKSB7CisJc19sb2NhbF9hcGljX25taSAqc2xhbiA9ICZtYWR0LT5sb2NhbF9hcGljX25taVtpXTsKKwljaGFyIGJ1ZmZlclsyMF07CisJbW9yZV9wcmludGYoIkxBUElDX05NSSAoYWNwaV9pZFsweCUwMnhdICVzIGxpbnQoMHglMDJ4KSlcbiIsCisJCSAgICBzbGFuLT5hY3BpX3Byb2Nlc3Nvcl9pZCwgZmxhZ3NfdG9fc3RyaW5nKGJ1ZmZlciwKKwkJCQkJCQkgICAgIHNsYW4tPmZsYWdzKSwKKwkJICAgIHNsYW4tPmxvY2FsX2FwaWNfbGludCk7CisgICAgfQorfQorCisvKiBEaXNwbGF5IHRoZSBJTyBBUElDIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyB2b2lkIHNob3dfaW9fYXBpYyhzX21hZHQgKiBtYWR0KQoreworICAgIGlmIChtYWR0LT5pb19hcGljX2NvdW50ID09IDApIHsKKwltb3JlX3ByaW50ZigiTm8gSU8gQVBJQyBmb3VuZFxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEZvciBhbGwgSU8gQVBJQ1MgKi8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hZHQtPmlvX2FwaWNfY291bnQ7IGkrKykgeworCXNfaW9fYXBpYyAqc2lvID0gJm1hZHQtPmlvX2FwaWNbaV07CisJY2hhciBidWZmZXJbMTVdOworCW1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKwkvKiBHU0kgYmFzZSByZXBvcnRzIHRoZSBHU0kgY29uZmlndXJhdGlvbgorCSAqIExldCdzIGludGVycHJldCBpdCBhcyBzdHJpbmcgKi8KKwlzd2l0Y2ggKHNpby0+Z2xvYmFsX3N5c3RlbV9pbnRlcnJ1cHRfYmFzZSkgeworCWNhc2UgMDoKKwkgICAgc3RyY3B5KGJ1ZmZlciwgIkdTSSAwLTIzIik7CisJICAgIGJyZWFrOworCWNhc2UgMjQ6CisJICAgIHN0cmNweShidWZmZXIsICJHU0kgMjQtMzkiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0MDoKKwkgICAgc3RyY3B5KGJ1ZmZlciwgIkdTSSA0MC01NSIpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBzdHJjcHkoYnVmZmVyLCAiR1NJIFVua25vd24iKTsKKwkgICAgYnJlYWs7CisJfQorCisJbW9yZV9wcmludGYoIklPX0FQSUNbJWRdIDogYXBpY19pZFsweCUwMnhdIGFkZHJlc3NbMHglMDh4XSAlc1xuIiwKKwkJICAgIGksIHNpby0+aW9fYXBpY19pZCwgc2lvLT5pb19hcGljX2FkZHJlc3MsIGJ1ZmZlcik7CisgICAgfQorfQorCisvKiBEaXNwbGF5IHRoZSBpbnRlcnJ1cHQgc291cmNlIG92ZXJyaWRlIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyB2b2lkIHNob3dfaW50ZXJydXB0X3NvdXJjZV9vdmVycmlkZShzX21hZHQgKiBtYWR0KQoreworICAgIGlmIChtYWR0LT5pbnRlcnJ1cHRfc291cmNlX292ZXJyaWRlX2NvdW50ID09IDApIHsKKwltb3JlX3ByaW50ZigiTm8gaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZSBmb3VuZFxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIExldCdzIHByb2Nlc3MgZWFjaCBpbnRlcnJ1cHQgc291cmNlIG92ZXJyaWRlICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYWR0LT5pbnRlcnJ1cHRfc291cmNlX292ZXJyaWRlX2NvdW50OyBpKyspIHsKKwlzX2ludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGUgKnNpc28gPSAmbWFkdC0+aW50ZXJydXB0X3NvdXJjZV9vdmVycmlkZVtpXTsKKwljaGFyIGJ1ZmZlclsyMF07CisJY2hhciBidXNfdHlwZVsxMF07CisJbWVtc2V0KGJ1c190eXBlLCAwLCBzaXplb2YoYnVzX3R5cGUpKTsKKwkvKiBTcGVjIHJlcG9ydCBidXMgdHlwZSAwIGFzIElTQSAqLworCWlmIChzaXNvLT5idXMgPT0gMCkKKwkgICAgc3RyY3B5KGJ1c190eXBlLCAiSVNBIik7CisJZWxzZQorCSAgICBzdHJjcHkoYnVzX3R5cGUsICJ1bmtub3duIik7CisKKwltb3JlX3ByaW50ZigiSU5UX1NSQ19PVlIgKGJ1cyAlcyAoJWQpIGJ1c19pcnEgJWQgZ2xvYmFsX2lycSAlZCAlcylcbiIsCisJCSAgICBidXNfdHlwZSwgc2lzby0+YnVzLCBzaXNvLT5zb3VyY2UsCisJCSAgICBzaXNvLT5nbG9iYWxfc3lzdGVtX2ludGVycnVwdCwgZmxhZ3NfdG9fc3RyaW5nKGJ1ZmZlciwKKwkJCQkJCQkJICAgc2lzby0+CisJCQkJCQkJCSAgIGZsYWdzKSk7CisgICAgfQorfQorCisvKiBEaXNwbGF5IHRoZSBhcGljIGNvbmZpZ3VyYXRpb24KKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IGFjcGk+IHNob3cgYXBpYyAqLworc3RhdGljIHZvaWQgc2hvd19hY3BpX2FwaWMoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGlmIChoYXJkd2FyZS0+aXNfYWNwaV92YWxpZCA9PSBmYWxzZSkgeworCW1vcmVfcHJpbnRmKCJObyBBQ1BJIFRhYmxlcyBkZXRlY3RlZFxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIHNfbWFkdCAqbWFkdCA9ICZoYXJkd2FyZS0+YWNwaS5tYWR0OworCisgICAgaWYgKG1hZHQtPnZhbGlkID09IGZhbHNlKSB7CisJbW9yZV9wcmludGYoIk5vIEFQSUMgKE1BRFQpIHRhYmxlIGZvdW5kXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgbW9yZV9wcmludGYoIkxvY2FsIEFQSUMgYXQgMHglMDh4XG4iLCBtYWR0LT5sb2NhbF9hcGljX2FkZHJlc3MpOworICAgIHNob3dfbG9jYWxfYXBpYyhtYWR0KTsKKyAgICBzaG93X2xvY2FsX2FwaWNfbm1pKG1hZHQpOworICAgIHNob3dfaW9fYXBpYyhtYWR0KTsKKyAgICBzaG93X2ludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGUobWFkdCk7Cit9CisKK3N0cnVjdCBjbGlfY2FsbGJhY2tfZGVzY3IgbGlzdF9hY3BpX3Nob3dfbW9kdWxlc1tdID0geworICAgIHsKKyAgICAgLm5hbWUgPSAiYXBpYyIsCisgICAgIC5leGVjID0gc2hvd19hY3BpX2FwaWMsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBOVUxMLAorICAgICAuZXhlYyA9IE5VTEwsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorfTsKKworc3RydWN0IGNsaV9tb2R1bGVfZGVzY3IgYWNwaV9zaG93X21vZHVsZXMgPSB7CisgICAgLm1vZHVsZXMgPSBsaXN0X2FjcGlfc2hvd19tb2R1bGVzLAorICAgIC5kZWZhdWx0X2NhbGxiYWNrID0gbWFpbl9zaG93X2FjcGksCit9OworCitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgYWNwaV9tb2RlID0geworICAgIC5tb2RlID0gQUNQSV9NT0RFLAorICAgIC5uYW1lID0gQ0xJX0FDUEksCisgICAgLmRlZmF1bHRfbW9kdWxlcyA9IE5VTEwsCisgICAgLnNob3dfbW9kdWxlcyA9ICZhY3BpX3Nob3dfbW9kdWxlcywKKyAgICAuc2V0X21vZHVsZXMgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtY2xpLWNwdS5jIGIvY29tMzIvaGR0L2hkdC1jbGktY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3NjRjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtY2xpLWNwdS5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJoZHQtY2xpLmgiCisjaW5jbHVkZSAiaGR0LWNvbW1vbi5oIgorCit2b2lkIG1haW5fc2hvd19jcHUoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgY2hhciBmZWF0dXJlc1s4MV07CisgICAgLyogV2Uga25vdyB0aGUgdG90YWwgbnVtYmVyIG9mIGxvZ2ljYWwgY29yZXMgYW5kIHdlCisgICAgICoga25vdyB0aGUgbnVtYmVyIG9mIGNvcmVzIG9mIHRoZSBmaXJzdCBDUFUuIExldCdzIGNvbnNpZGVyCisgICAgICogdGhlIHN5c3RlbSBhcyBzeW1ldHJpY2FsLCBhbmQgc28gY29tcHV0ZSB0aGUgbnVtYmVyIG9mCisgICAgICogcGh5c2ljYWwgQ1BVcy4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIEFDUEkgaXMgcHJlc2VudCAqLworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5tYWR0LnByb2Nlc3Nvcl9sb2NhbF9hcGljX2NvdW50ID4gMCkgeworCW1vcmVfcHJpbnRmKCJDUFUgKCVkIGxvZ2ljYWwgLyAlZCBwaHlzKVxuIiwKKwkJICAgIGhhcmR3YXJlLT5hY3BpLm1hZHQucHJvY2Vzc29yX2xvY2FsX2FwaWNfY291bnQsCisJCSAgICBoYXJkd2FyZS0+cGh5c2ljYWxfY3B1X2NvdW50KTsKKyAgICB9IGVsc2UKKwltb3JlX3ByaW50ZigiQ1BVXG4iKTsKKyAgICBtb3JlX3ByaW50ZigiIE1hbnVmYWN0dXJlciA6ICVzIFxuIiwgaGFyZHdhcmUtPmNwdS52ZW5kb3IpOworICAgIG1vcmVfcHJpbnRmKCIgUHJvZHVjdCAgICAgIDogJXMgXG4iLCBoYXJkd2FyZS0+Y3B1Lm1vZGVsKTsKKyAgICBtb3JlX3ByaW50ZigiIENQVSBDb3JlcyAgICA6ICVkIFxuIiwgaGFyZHdhcmUtPmNwdS5udW1fY29yZXMpOworICAgIGlmIChoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci50aHJlYWRfY291bnQgIT0gMCkKKyAgICAgICAgbW9yZV9wcmludGYoIiBDUFUgVGhyZWFkcyAgOiAlZCBcbiIsIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnRocmVhZF9jb3VudCk7CisgICAgbW9yZV9wcmludGYoIiBMMiBDYWNoZSAgICAgOiAlZEtcbiIsIGhhcmR3YXJlLT5jcHUubDJfY2FjaGVfc2l6ZSk7CisKKyAgICBtZW1zZXQoZmVhdHVyZXMsIDAsIHNpemVvZihmZWF0dXJlcykpOworICAgIHNucHJpbnRmKGZlYXR1cmVzLCBzaXplb2YoZmVhdHVyZXMpLCAiIEZlYXR1cmVzICAgICA6ICVkIE1oeiA6ICIsCisJICAgICBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5jdXJyZW50X3NwZWVkKTsKKyAgICBpZiAoaGFyZHdhcmUtPmNwdS5mbGFncy5sbSkKKwlzdHJjYXQoZmVhdHVyZXMsICJ4ODZfNjQgNjRiaXQgIik7CisgICAgZWxzZQorCXN0cmNhdChmZWF0dXJlcywgIng4NiAzMmJpdCAiKTsKKyAgICBpZiAoaGFyZHdhcmUtPmNwdS5mbGFncy5zbXApCisJc3RyY2F0KGZlYXR1cmVzLCAiU01QICIpOworCisgICAgLyogVGhpcyBDUFUgaXMgZmVhdHVyaW5nIEludGVsIG9yIEFNRCBWaXJ0dWFsaXNhdGlvbiBUZWNobm9sb2d5ICovCisgICAgaWYgKGhhcmR3YXJlLT5jcHUuZmxhZ3Mudm14IHx8IGhhcmR3YXJlLT5jcHUuZmxhZ3Muc3ZtKQorCXN0cmNhdChmZWF0dXJlcywgIkh3VklSVCAiKTsKKworICAgIG1vcmVfcHJpbnRmKCIlc1xuIiwgZmVhdHVyZXMpOworfQorCisvKiBMZXQncyBjb21wdXRlIHRoZSBjcHUgZmxhZ3MgZGlzcGxheQorICogV2UgaGF2ZSB0byBtYXhpbWl6ZSB0aGUgbnVtYmVyIG9mIGZsYWdzIHBlciBsaW5lICovCitzdGF0aWMgdm9pZCBzaG93X2ZsYWcoY2hhciAqYnVmZmVyLCBib29sIGZsYWcsIGNoYXIgKmZsYWdfbmFtZSwgYm9vbCBmbHVzaCkKK3sKKyAgICBjaGFyIG91dHB1dF9idWZmZXJbODFdOworICAgIC8qIEZsdXNoIGlzIG9ubHkgc2V0IHdoZW4gbm8gbW9yZSBmbGFncyBhcmUgcHJlc2VudAorICAgICAqIFdoZW4gaXQncyBzZXQsIG9yIGlmIHRoZSBsaW5lIGlzIGNvbXBsZXRlLAorICAgICAqIHdlIGhhdmUgdG8gZW5kIHRoZSBzdHJpbmcgY29tcHV0YXRpb24gYW5kIGRpc3BsYXkgdGhlIGxpbmUuCisgICAgICogQmVmb3JlIGFkZGluZyB0aGUgZmxhZyBpbnRvIHRoZSBidWZmZXIsIGxldCdzIGNoZWNrIHRoYXQgYWRkaW5nIGl0CisgICAgICogd2lsbCBub3Qgb3ZlcmZsb3cgdGhlIHJlbmRlcmluZy4qLworICAgIGlmICgoKChzdHJsZW4oYnVmZmVyKSArIHN0cmxlbihmbGFnX25hbWUpKSA+IDY2KSAmJiBmbGFnKSB8fCBmbHVzaCkgeworCXNucHJpbnRmKG91dHB1dF9idWZmZXIsIHNpemVvZiBvdXRwdXRfYnVmZmVyLCAiRmxhZ3MgICAgIDogJXNcbiIsCisJCSBidWZmZXIpOworCW1vcmVfcHJpbnRmKCIlcyIsIG91dHB1dF9idWZmZXIpOworCW1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKwlpZiAoZmx1c2gpCisJICAgIHJldHVybjsKKyAgICB9CisgICAgLyogTGV0J3MgYWRkIHRoZSBmbGFnIG5hbWUgb25seSBpZiB0aGUgZmxhZyBpcyBwcmVzZW50ICovCisgICAgaWYgKGZsYWcpCisJc3RyY2F0KGJ1ZmZlciwgZmxhZ19uYW1lKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19jcHUoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkgICAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBjaGFyIGJ1ZmZlcls4MV07CisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICAvKiBXZSBrbm93IHRoZSB0b3RhbCBudW1iZXIgb2YgbG9naWNhbCBjb3JlcyBhbmQgd2UKKyAgICAgKiBrbm93IHRoZSBudW1iZXIgb2YgY29yZXMgb2YgdGhlIGZpcnN0IENQVS4gTGV0J3MgY29uc2lkZXIKKyAgICAgKiB0aGUgc3lzdGVtIGFzIHN5bWV0cmljYWwsIGFuZCBzbyBjb21wdXRlIHRoZSBudW1iZXIgb2YKKyAgICAgKiBwaHlzaWNhbCBDUFVzLiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgQUNQSSBpcyBwcmVzZW50Ki8KKyAgICBpZiAoaGFyZHdhcmUtPmFjcGkubWFkdC5wcm9jZXNzb3JfbG9jYWxfYXBpY19jb3VudCA+IDApIHsKKwltb3JlX3ByaW50ZigiQ1BVICglZCBsb2dpY2FsIC8gJWQgcGh5cylcbiIsCisJCSAgICBoYXJkd2FyZS0+YWNwaS5tYWR0LnByb2Nlc3Nvcl9sb2NhbF9hcGljX2NvdW50LAorCQkgICAgaGFyZHdhcmUtPmFjcGkubWFkdC5wcm9jZXNzb3JfbG9jYWxfYXBpY19jb3VudCAvCisJCSAgICBoYXJkd2FyZS0+Y3B1Lm51bV9jb3Jlcyk7CisgICAgfSBlbHNlCisJbW9yZV9wcmludGYoIkNQVVxuIik7CisgICAgbW9yZV9wcmludGYoIlZlbmRvciAgICA6ICVzXG4iLCBoYXJkd2FyZS0+Y3B1LnZlbmRvcik7CisgICAgbW9yZV9wcmludGYoIk1vZGVsICAgICA6ICVzXG4iLCBoYXJkd2FyZS0+Y3B1Lm1vZGVsKTsKKyAgICBtb3JlX3ByaW50ZigiQ1BVIENvcmVzIDogJWRcbiIsIGhhcmR3YXJlLT5jcHUubnVtX2NvcmVzKTsKKyAgICBpZiAoaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IuY29yZV9lbmFibGVkICE9IDApCisgICAgICAgIG1vcmVfcHJpbnRmKCJDUFUgRW5hYmxlOiAlZFxuIiwgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IuY29yZV9lbmFibGVkKTsKKyAgICBpZiAoaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IudGhyZWFkX2NvdW50ICE9IDApCisgICAgICAgIG1vcmVfcHJpbnRmKCJDUFUgVGhyZWFkOiAlZCBcbiIsIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnRocmVhZF9jb3VudCk7CisgICAgbW9yZV9wcmludGYoIkwxIENhY2hlICA6ICVkSyArICVkSyAoSSArIEQpIFxuIiwKKwkJaGFyZHdhcmUtPmNwdS5sMV9pbnN0cnVjdGlvbl9jYWNoZV9zaXplLAorCQloYXJkd2FyZS0+Y3B1LmwxX2RhdGFfY2FjaGVfc2l6ZSk7CisgICAgbW9yZV9wcmludGYoIkwyIENhY2hlICA6ICVkS1xuIiwgaGFyZHdhcmUtPmNwdS5sMl9jYWNoZV9zaXplKTsKKyAgICBtb3JlX3ByaW50ZigiRmFtaWx5IElEIDogJWRcbiIsIGhhcmR3YXJlLT5jcHUuZmFtaWx5KTsKKyAgICBtb3JlX3ByaW50ZigiTW9kZWwgIElEIDogJWRcbiIsIGhhcmR3YXJlLT5jcHUubW9kZWxfaWQpOworICAgIG1vcmVfcHJpbnRmKCJTdGVwcGluZyAgOiAlZFxuIiwgaGFyZHdhcmUtPmNwdS5zdGVwcGluZyk7CisgICAgaWYgKGhhcmR3YXJlLT5pc19kbWlfdmFsaWQpIHsKKwltb3JlX3ByaW50ZigiRlNCICAgICAgIDogJWQgTUh6XG4iLAorCQkgICAgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IuZXh0ZXJuYWxfY2xvY2spOworCW1vcmVfcHJpbnRmKCJDdXIuIFNwZWVkOiAlZCBNSHpcbiIsCisJCSAgICBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5jdXJyZW50X3NwZWVkKTsKKwltb3JlX3ByaW50ZigiTWF4IFNwZWVkIDogJWQgTUh6XG4iLCBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5tYXhfc3BlZWQpOworCW1vcmVfcHJpbnRmKCJVcGdyYWRlICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IudXBncmFkZSk7CisJbW9yZV9wcmludGYoIlZvbHRhZ2UgICA6ICVkLiUwMmRcbiIsCisJCSAgICBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci52b2x0YWdlX212IC8gMTAwMCwKKwkJICAgIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnZvbHRhZ2VfbXYgLQorCQkgICAgKChoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci52b2x0YWdlX212IC8gMTAwMCkgKiAxMDAwKSk7CisgICAgfQorCisgICAgaWYgKGhhcmR3YXJlLT5jcHUuZmxhZ3Muc21wKSB7CisJbW9yZV9wcmludGYoIlNNUCAgICAgICA6IHllc1xuIik7CisgICAgfSBlbHNlIHsKKwltb3JlX3ByaW50ZigiU01QICAgICAgIDogbm9cbiIpOworICAgIH0KKworICAgIGlmIChoYXJkd2FyZS0+Y3B1LmZsYWdzLmxtKSB7CisJbW9yZV9wcmludGYoIng4Nl82NCAgICA6IHllc1xuIik7CisgICAgfSBlbHNlIHsKKwltb3JlX3ByaW50ZigieDg2XzY0ICAgIDogbm9cbiIpOworICAgIH0KKworICAgIGlmIChoYXJkd2FyZS0+Y3B1LmZsYWdzLnZteCB8fCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnN2bSkgeworCW1vcmVfcHJpbnRmKCJId1ZpcnQgICAgOiB5ZXNcbiIpOworICAgIH0gZWxzZSB7CisJbW9yZV9wcmludGYoIkh3VmlydCAgICA6IG5vXG4iKTsKKyAgICB9CisKKyAgICAvKiBMZXQncyBkaXNwbGF5IHRoZSBzdXBwb3J0ZWQgY3B1IGZsYWdzICovCisgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZnB1LCAiZnB1ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnZtZSwgInZtZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5kZSwgImRlICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBzZSwgInBzZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy50c2MsICJ0c2MgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MubXNyLCAibXNyICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBhZSwgInBhZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5tY2UsICJtY2UgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuY3g4LCAiY3g4ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmFwaWMsICJhcGljICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnNlcCwgInNlcCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5tdHJyLCAibXRyciAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5wZ2UsICJwZ2UgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MubWNhLCAibWNhICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmNtb3YsICJjbW92ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBhdCwgInBhdCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5wc2VfMzYsICJwc2VfMzYgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucHNuLCAicHNuICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmNsZmxzaCwgImNsZmxzaCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5kdHMsICJkdHMgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuYWNwaSwgImFjcGkgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MubW14LCAibW14ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnNzZSwgInNzZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5zc2UyLCAic3NlMiAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5zcywgInNzICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmh0dCwgImh0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmFjYywgImFjYyAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5zeXNjYWxsLCAic3lzY2FsbCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5tcCwgIm1wICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLm54LCAibnggIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MubW14ZXh0LCAibW14ZXh0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmxtLCAibG0gIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3Mubm93ZXh0LCAiM2Rub3dleHQgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3Mubm93LCAiM2Rub3chICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnN2bSwgInN2bSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy52bXgsICJ2bXggIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucGJlLCAicGJlICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmZ4c3Jfb3B0LCAiZnhzcl9vcHQgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZ2JwYWdlcywgImdicGFnZXMgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucmR0c2NwLCAicmR0c2NwICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBuaSwgInBuaSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5wY2xtdWxxZCwgInBjbG11bHFkICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmR0ZXM2NCwgImR0ZXM2NCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5zbXgsICJzbXggIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZXN0LCAiZXN0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnRtMiwgInRtMiAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5zc2UzLCAic3NlMyAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5mbWEsICJmbWEgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuY3gxNiwgImN4MTYgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MueHRwciwgInh0cHIgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucGRjbSwgInBkY20gIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZGNhLCAiZGNhICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnhtbTRfMSwgInhtbTRfMSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy54bW00XzIsICJ4bW00XzIgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MueDJhcGljLCAieDJhcGljICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLm1vdmJlLCAibW92YmUgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucG9wY250LCAicG9wY250ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmFlcywgImFlcyAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy54c2F2ZSwgInhzYXZlICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLm9zeHNhdmUsICJvc3hzYXZlICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmF2eCwgImF2eCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5oeXBlcnZpc29yLCAiaHlwZXJ2aXNvciAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5hY2UyLCAiYWNlMiAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5hY2UyX2VuLCAiYWNlMl9lbiAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5waGUsICJwaGUgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucGhlX2VuLCAicGhlX2VuICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBtbSwgInBtbSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5wbW1fZW4sICJwbW1fZW4gIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZXh0YXBpYywgImV4dGFwaWMgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuY3I4X2xlZ2FjeSwgImNyOF9sZWdhY3kgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuYWJtLCAiYWJtICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnNzZTRhLCAic3NlNGEgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MubWlzYWxpZ25zc2UsICJtaXNhbGlnbnNzZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5ub3dwcmVmZXRjaCwgIjNkbm93cHJlZmV0Y2ggIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3Mub3N2dywgIm9zdncgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuaWJzLCAiaWJzICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnNzZTUsICJzc2U1ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnNraW5pdCwgInNraW5pdCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy53ZHQsICJ3ZHQgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuaWRhLCAiaWRhICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmFyYXQsICJhcmF0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnRwcl9zaGFkb3csICJ0cHJfc2hhZG93ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnZubWksICJ2bm1pICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcoYnVmZmVyLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmZsZXhwcmlvcml0eSwgImZsZXhwcmlvcml0eSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKGJ1ZmZlciwgaGFyZHdhcmUtPmNwdS5mbGFncy5lcHQsICJlcHQgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhidWZmZXIsIGhhcmR3YXJlLT5jcHUuZmxhZ3MudnBpZCwgInZwaWQgIiwgZmFsc2UpOworCisgICAgLyogTm8gbW9yZSBmbGFncywgbGV0J3MgZGlzcGxheSB0aGUgcmVtYWluaW5nIGZsYWdzICovCisgICAgc2hvd19mbGFnKGJ1ZmZlciwgZmFsc2UsICIiLCB0cnVlKTsKK30KKworc3RydWN0IGNsaV9tb2R1bGVfZGVzY3IgY3B1X3Nob3dfbW9kdWxlcyA9IHsKKyAgICAubW9kdWxlcyA9IE5VTEwsCisgICAgLmRlZmF1bHRfY2FsbGJhY2sgPSBzaG93X2NwdSwKK307CisKK3N0cnVjdCBjbGlfbW9kZV9kZXNjciBjcHVfbW9kZSA9IHsKKyAgICAubW9kZSA9IENQVV9NT0RFLAorICAgIC5uYW1lID0gQ0xJX0NQVSwKKyAgICAuZGVmYXVsdF9tb2R1bGVzID0gTlVMTCwKKyAgICAuc2hvd19tb2R1bGVzID0gJmNwdV9zaG93X21vZHVsZXMsCisgICAgLnNldF9tb2R1bGVzID0gTlVMTCwKK307CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LWNsaS1kaXNrLmMgYi9jb20zMi9oZHQvaGR0LWNsaS1kaXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjOTVkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtY2xpLWRpc2suYwpAQCAtMCwwICsxLDI1MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllciAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiaGR0LWNsaS5oIgorI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKyNpbmNsdWRlICJoZHQtdXRpbC5oIgorCisvKioKKyAqIHNob3dfcGFydGl0aW9uX2luZm9ybWF0aW9uIC0gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aXRpb24KKyAqIEBwdGFiOglwYXJ0X2VudHJ5IGRlc2NyaWJpbmcgdGhlIHBhcnRpdGlvbgorICogQGk6CQlQYXJ0aXRpb24gbnVtYmVyIChVSSBwdXJwb3NlcyBvbmx5KQorICogQHB0YWJfcm9vdDoJcGFydF9lbnRyeSBkZXNjcmliaW5nIHRoZSByb290IHBhcnRpdGlvbiAoZXh0ZW5kZWQgb25seSkKKyAqIEBkcml2ZV9pbmZvOglkcml2ZWluZm8gc3RydWN0IGRlc2NyaWJpbmcgdGhlIGRyaXZlIG9uIHdoaWNoIHRoZSBwYXJ0aXRpb24KKyAqCQlpcworICoKKyAqIE5vdGUgb24gb2Zmc2V0cyAoZnJvbSBocGEsIHNlZSBjaGFpbi5jMzIpOgorICoKKyAqICBUbyBtYWtlIHRoaW5ncyBleHRyYSBjb25mdXNpbmc6IGRhdGEgcGFydGl0aW9uIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHdoZXJlCisgKiAgdGhlIGRhdGEgcGFydGl0aW9uIHJlY29yZCBpcyBzdG9yZWQsIHdoZXJlYXMgZXh0ZW5kZWQgcGFydGl0aW9uIG9mZnNldHMKKyAqICBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZXh0ZW5kZWQgcGFydGl0aW9uIGFsbCB0aGUgd2F5IGJhY2sKKyAqICBhdCB0aGUgTUJSLi4uIGJ1dCBzdGlsbCBub3QgYWJzb2x1dGUhCisgKiovCitzdGF0aWMgdm9pZCBzaG93X3BhcnRpdGlvbl9pbmZvcm1hdGlvbihzdHJ1Y3QgZHJpdmVpbmZvICpkcml2ZV9pbmZvLAorCQkJCSAgICAgICBzdHJ1Y3QgcGFydF9lbnRyeSAqcHRhYiwKKwkJCQkgICAgICAgaW50IHBhcnRpdGlvbl9vZmZzZXQsCisJCQkJICAgICAgIGludCBuYl9wYXJ0aXRpb25zX3NlZW4pCit7CisgICAgY2hhciBzaXplWzExXTsKKyAgICBjaGFyIGJvb3Rsb2FkZXJfbmFtZVs5XTsKKyAgICBjaGFyICpwYXJ0dHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgc3RhcnQsIGVuZDsKKworICAgIGludCBpID0gbmJfcGFydGl0aW9uc19zZWVuOworCisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKworICAgIHN0YXJ0ID0gcGFydGl0aW9uX29mZnNldDsKKyAgICBlbmQgPSBzdGFydCArIHB0YWItPmxlbmd0aCAtIDE7CisKKyAgICBpZiAocHRhYi0+bGVuZ3RoID4gMCkKKwlzZWN0b3JzX3RvX3NpemUocHRhYi0+bGVuZ3RoLCBzaXplKTsKKyAgICBlbHNlCisJbWVtc2V0KHNpemUsIDAsIHNpemVvZiBzaXplKTsKKworICAgIGlmIChpID09IDEpCisJbW9yZV9wcmludGYoIiAjICBCICAgICAgIFN0YXJ0ICAgICAgICAgRW5kICAgIFNpemUgSWQgVHlwZVxuIik7CisKKyAgICBnZXRfbGFiZWwocHRhYi0+b3N0eXBlLCAmcGFydHR5cGUpOworICAgIG1vcmVfcHJpbnRmKCIlMmQgICVzICUxMWQgJTExZCAlcyAlMDJYICVzIiwKKwkJaSwgKHB0YWItPmFjdGl2ZV9mbGFnID09IDB4ODApID8gIngiIDogIiAiLAorCQlzdGFydCwgZW5kLCBzaXplLCBwdGFiLT5vc3R5cGUsIHBhcnR0eXBlKTsKKworICAgIC8qIEV4dHJhIGluZm8gKi8KKyAgICBpZiAocHRhYi0+b3N0eXBlID09IDB4ODIgJiYgc3dzdXNwX2NoZWNrKGRyaXZlX2luZm8sIHB0YWIpKQorCW1vcmVfcHJpbnRmKCIlcyIsICIgKFN3c3VzcCBzaWcuIGRldGVjdGVkKSIpOworCisgICAgaWYgKGdldF9ib290bG9hZGVyX3N0cmluZyhkcml2ZV9pbmZvLCBwdGFiLCBib290bG9hZGVyX25hbWUsIDkpID09IDApCisJbW9yZV9wcmludGYoIiUtNDZzICVzICVzIiwgIiAiLCAiQm9vdGxvYWRlcjoiLCBib290bG9hZGVyX25hbWUpOworCisgICAgbW9yZV9wcmludGYoIlxuIik7CisKKyAgICBmcmVlKHBhcnR0eXBlKTsKK30KKwordm9pZCBtYWluX3Nob3dfZGlzayhpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpZiAoIWFyZ2MpIHsKKwltb3JlX3ByaW50ZigiV2hpY2ggZGlzaz9cbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpbnQgZHJpdmUgPSBzdHJ0b2woYXJndlswXSwgKGNoYXIgKiopTlVMTCwgMTYpOworCisgICAgaWYgKGRyaXZlIDwgMHg4MCB8fCBkcml2ZSA+PSAweGZmKSB7CisJbW9yZV9wcmludGYoIkludmFsaWQgZGlzazogJWQuXG4iLCBkcml2ZSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGludCBpID0gZHJpdmUgLSAweDgwOworICAgIHN0cnVjdCBkcml2ZWluZm8gKmQgPSAmaGFyZHdhcmUtPmRpc2tfaW5mb1tpXTsKKyAgICBjaGFyIGRpc2tfc2l6ZVsxMV07CisgICAgY2hhciBtYnJfbmFtZVs1MF07CisKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworCisgICAgaWYgKCFoYXJkd2FyZS0+ZGlza19pbmZvW2ldLmNiaW9zKSB7CisJbW9yZV9wcmludGYoIk5vIGRpc2sgZm91bmRcbiIpOworCXJldHVybjsJCQkvKiBJbnZhbGlkIGdlb21ldHJ5ICovCisgICAgfQorCisgICAgZ2V0X21icl9zdHJpbmcoaGFyZHdhcmUtPm1icl9pZHNbaV0sICZtYnJfbmFtZSwgNTApOworCisgICAgaWYgKChpbnQpZC0+ZWRkX3BhcmFtcy5zZWN0b3JzID4gMCkKKwlzZWN0b3JzX3RvX3NpemUoKGludClkLT5lZGRfcGFyYW1zLnNlY3RvcnMsIGRpc2tfc2l6ZSk7CisgICAgZWxzZQorCW1lbXNldChkaXNrX3NpemUsIDAsIHNpemVvZiBkaXNrX3NpemUpOworCisgICAgbW9yZV9wcmludGYoIkRJU0sgMHglWDpcbiIKKwkJIiAgQy9IL1M6ICVkIGN5bGluZGVycywgJWQgaGVhZHMsICVkIHNlY3RvcnMvdHJhY2tcbiIKKwkJIiAgICBFREQ6IFZlcnNpb246ICVYXG4iCisJCSIgICAgICAgICBTaXplOiAlcywgJWQgYnl0ZXMvc2VjdG9yLCAlZCBzZWN0b3JzL3RyYWNrXG4iCisJCSIgICAgICAgICBIb3N0IGJ1czogJXMsIEludGVyZmFjZSB0eXBlOiAlc1xuIgorCQkiICAgIE1CUjogJXMgKGlkIDB4JVgpXG5cbiIsCisJCWQtPmRpc2ssCisJCWQtPmxlZ2FjeV9tYXhfY3lsaW5kZXIgKyAxLCBkLT5sZWdhY3lfbWF4X2hlYWQgKyAxLAorCQlkLT5sZWdhY3lfc2VjdG9yc19wZXJfdHJhY2ssIGQtPmVkZF92ZXJzaW9uLCBkaXNrX3NpemUsCisJCShpbnQpZC0+ZWRkX3BhcmFtcy5ieXRlc19wZXJfc2VjdG9yLAorCQkoaW50KWQtPmVkZF9wYXJhbXMuc2VjdG9yc19wZXJfdHJhY2ssCisJCXJlbW92ZV9zcGFjZXMoKGNoYXIgKilkLT5lZGRfcGFyYW1zLmhvc3RfYnVzX3R5cGUpLAorCQlyZW1vdmVfc3BhY2VzKChjaGFyICopZC0+ZWRkX3BhcmFtcy5pbnRlcmZhY2VfdHlwZSksIG1icl9uYW1lLAorCQloYXJkd2FyZS0+bWJyX2lkc1tpXSk7CisgICAgZGlzcGxheV9saW5lX25iICs9IDY7CisKKyAgICBpZiAocGFyc2VfcGFydGl0aW9uX3RhYmxlKGQsICZzaG93X3BhcnRpdGlvbl9pbmZvcm1hdGlvbikpIHsKKwlpZiAoZXJybm9fZGlzaykgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIkkvTyBlcnJvciBwYXJzaW5nIGRpc2sgMHglWFxuIiwgZC0+ZGlzayk7CisJICAgIGdldF9lcnJvcigicGFyc2VfcGFydGl0aW9uX3RhYmxlIik7CisJfSBlbHNlIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJEaXNrIDB4JVg6IHVucmVjb2duaXplZCBwYXJ0aXRpb24gbGF5b3V0XG4iLAorCQkgICAgZC0+ZGlzayk7CisJfQorCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisKKyAgICBtb3JlX3ByaW50ZigiXG4iKTsKK30KKwordm9pZCBtYWluX3Nob3dfZGlza3MoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkgICAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKworICAgIGludCBmaXJzdF9vbmUgPSAwOworICAgIGZvciAoaW50IGRyaXZlID0gMHg4MDsgZHJpdmUgPCAweGZmOyBkcml2ZSsrKSB7CisJaWYgKGhhcmR3YXJlLT5kaXNrX2luZm9bZHJpdmUgLSAweDgwXS5jYmlvcykgeworCSAgICBmb3VuZCA9IHRydWU7CisJICAgIGlmICghZmlyc3Rfb25lKSB7CisJCWZpcnN0X29uZSA9IDE7CisJICAgIH0gZWxzZSB7CisJCXBhdXNlX3ByaW50ZigpOworCSAgICB9CisJICAgIGNoYXIgYnVmWzVdID0gIiI7CisJICAgIHNwcmludGYoYnVmLCAiMHgleCIsIGRyaXZlKTsKKwkgICAgY2hhciAqYXJndlsxXSA9IHsgYnVmIH07CisJICAgIG1haW5fc2hvd19kaXNrKDEsIGFyZ3YsIGhhcmR3YXJlKTsKKwl9CisgICAgfQorCisgICAgaWYgKGZvdW5kID09IGZhbHNlKQorCW1vcmVfcHJpbnRmKCJObyBkaXNrIGZvdW5kXG4iKTsKK30KKwordm9pZCBkaXNrc19zdW1tYXJ5KGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGludCBpID0gLTE7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKworICAgIGZvciAoaW50IGRyaXZlID0gMHg4MDsgZHJpdmUgPCAweGZmOyBkcml2ZSsrKSB7CisJaSsrOworCWlmICghaGFyZHdhcmUtPmRpc2tfaW5mb1tpXS5jYmlvcykKKwkgICAgY29udGludWU7CQkvKiBJbnZhbGlkIGdlb21ldHJ5ICovCisKKwlmb3VuZCA9IHRydWU7CisJc3RydWN0IGRyaXZlaW5mbyAqZCA9ICZoYXJkd2FyZS0+ZGlza19pbmZvW2ldOworCWNoYXIgZGlza19zaXplWzExXTsKKworCWlmICgoaW50KWQtPmVkZF9wYXJhbXMuc2VjdG9ycyA+IDApCisJICAgIHNlY3RvcnNfdG9fc2l6ZSgoaW50KWQtPmVkZF9wYXJhbXMuc2VjdG9ycywgZGlza19zaXplKTsKKwllbHNlCisJICAgIG1lbXNldChkaXNrX3NpemUsIDAsIHNpemVvZiBkaXNrX3NpemUpOworCisJbW9yZV9wcmludGYoIkRJU0sgMHglWDpcbiIsIGQtPmRpc2spOworCW1vcmVfcHJpbnRmKCIgIEMvSC9TOiAlZCBjeWxpbmRlcnMsICVkIGhlYWRzLCAlZCBzZWN0b3JzL3RyYWNrXG4iLAorCQkgICAgZC0+bGVnYWN5X21heF9jeWxpbmRlciArIDEsIGQtPmxlZ2FjeV9tYXhfaGVhZCArIDEsCisJCSAgICBkLT5sZWdhY3lfc2VjdG9yc19wZXJfdHJhY2spOworCW1vcmVfcHJpbnRmKCIgIEVERDogICBWZXJzaW9uOiAlWCwgc2l6ZTogJXNcbiIsIGQtPmVkZF92ZXJzaW9uLAorCQkgICAgZGlza19zaXplKTsKKworCS8qIERvIG5vdCBwcmludCBIb3N0IEJ1cyAmIEludGVyZmFjZSBpZiBFREQgaXNuJ3QgMy4wIG9yIG1vcmUgKi8KKwlpZiAoZC0+ZWRkX3ZlcnNpb24gPj0gMHgzMCkKKwkgICAgbW9yZV9wcmludGYoIiAgICAgICAgIEhvc3QgYnVzOiAlcywgSW50ZXJmYWNlIHR5cGU6ICVzXG5cbiIsCisJCQlyZW1vdmVfc3BhY2VzKChjaGFyICopZC0+ZWRkX3BhcmFtcy5ob3N0X2J1c190eXBlKSwKKwkJCXJlbW92ZV9zcGFjZXMoKGNoYXIgKilkLT5lZGRfcGFyYW1zLmludGVyZmFjZV90eXBlKSk7CisgICAgfQorCisgICAgaWYgKGZvdW5kID09IGZhbHNlKQorCW1vcmVfcHJpbnRmKCJObyBkaXNrIGZvdW5kXG4iKTsKK30KKworc3RydWN0IGNsaV9jYWxsYmFja19kZXNjciBsaXN0X2Rpc2tfc2hvd19tb2R1bGVzW10gPSB7CisgICAgeworICAgICAubmFtZSA9ICJkaXNrcyIsCisgICAgIC5leGVjID0gbWFpbl9zaG93X2Rpc2tzLAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gImRpc2siLAorICAgICAuZXhlYyA9IG1haW5fc2hvd19kaXNrLAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gTlVMTCwKKyAgICAgLmV4ZWMgPSBOVUxMLAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKK307CisKK3N0cnVjdCBjbGlfbW9kdWxlX2Rlc2NyIGRpc2tfc2hvd19tb2R1bGVzID0geworICAgIC5tb2R1bGVzID0gbGlzdF9kaXNrX3Nob3dfbW9kdWxlcywKKyAgICAuZGVmYXVsdF9jYWxsYmFjayA9IGRpc2tzX3N1bW1hcnksCit9OworCitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgZGlza19tb2RlID0geworICAgIC5tb2RlID0gRElTS19NT0RFLAorICAgIC5uYW1lID0gQ0xJX0RJU0ssCisgICAgLmRlZmF1bHRfbW9kdWxlcyA9IE5VTEwsCisgICAgLnNob3dfbW9kdWxlcyA9ICZkaXNrX3Nob3dfbW9kdWxlcywKKyAgICAuc2V0X21vZHVsZXMgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtY2xpLWRtaS5jIGIvY29tMzIvaGR0L2hkdC1jbGktZG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiZWEwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtY2xpLWRtaS5jCkBAIC0wLDAgKzEsNzA1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJoZHQtY2xpLmgiCisjaW5jbHVkZSAiaGR0LWNvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBzaG93X2RtaV9tb2R1bGVzKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJCSAgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGNoYXIgYXZhaWxhYmxlX2RtaV9jb21tYW5kc1sxMDI0XTsKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworICAgIG1lbXNldChhdmFpbGFibGVfZG1pX2NvbW1hbmRzLCAwLCBzaXplb2YoYXZhaWxhYmxlX2RtaV9jb21tYW5kcykpOworCisgICAgbW9yZV9wcmludGYoIkF2YWlsYWJsZSBETUkgbW9kdWxlcyBvbiB5b3VyIHN5c3RlbTpcbiIpOworICAgIGlmIChoYXJkd2FyZS0+ZG1pLmJhc2VfYm9hcmQuZmlsbGVkID09IHRydWUpCisJbW9yZV9wcmludGYoIlx0JXNcbiIsIENMSV9ETUlfQkFTRV9CT0FSRCk7CisgICAgaWYgKGhhcmR3YXJlLT5kbWkuYmF0dGVyeS5maWxsZWQgPT0gdHJ1ZSkKKwltb3JlX3ByaW50ZigiXHQlc1xuIiwgQ0xJX0RNSV9CQVRURVJZKTsKKyAgICBpZiAoaGFyZHdhcmUtPmRtaS5iaW9zLmZpbGxlZCA9PSB0cnVlKQorCW1vcmVfcHJpbnRmKCJcdCVzXG4iLCBDTElfRE1JX0JJT1MpOworICAgIGlmIChoYXJkd2FyZS0+ZG1pLmNoYXNzaXMuZmlsbGVkID09IHRydWUpCisJbW9yZV9wcmludGYoIlx0JXNcbiIsIENMSV9ETUlfQ0hBU1NJUyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYXJkd2FyZS0+ZG1pLm1lbW9yeV9jb3VudDsgaSsrKSB7CisJaWYgKGhhcmR3YXJlLT5kbWkubWVtb3J5W2ldLmZpbGxlZCA9PSB0cnVlKSB7CisJICAgIG1vcmVfcHJpbnRmKCJcdGJhbmsgPG51bWJlcj5cbiIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlX2NvdW50OyBpKyspIHsKKwlpZiAoaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlW2ldLmZpbGxlZCA9PSB0cnVlKSB7CisJICAgIG1vcmVfcHJpbnRmKCJcdG1vZHVsZSA8bnVtYmVyPlxuIik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgaWYgKGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmZpbGxlZCA9PSB0cnVlKQorCW1vcmVfcHJpbnRmKCJcdCVzXG4iLCBDTElfRE1JX1BST0NFU1NPUik7CisgICAgaWYgKGhhcmR3YXJlLT5kbWkuc3lzdGVtLmZpbGxlZCA9PSB0cnVlKQorCW1vcmVfcHJpbnRmKCJcdCVzXG4iLCBDTElfRE1JX1NZU1RFTSk7CisgICAgaWYgKGhhcmR3YXJlLT5kbWkuaXBtaS5maWxsZWQgPT0gdHJ1ZSkKKwltb3JlX3ByaW50ZigiXHQlc1xuIiwgQ0xJX0RNSV9JUE1JKTsKKyAgICBpZiAoaGFyZHdhcmUtPmRtaS5jYWNoZV9jb3VudCkKKwltb3JlX3ByaW50ZigiXHQlc1xuIiwgQ0xJX0RNSV9DQUNIRSk7CisgICAgaWYgKHN0cmxlbihoYXJkd2FyZS0+ZG1pLm9lbV9zdHJpbmdzKSkKKwltb3JlX3ByaW50ZigiXHQlc1xuIiwgQ0xJX0RNSV9PRU0pOworICAgIGlmIChoYXJkd2FyZS0+ZG1pLmhhcmR3YXJlX3NlY3VyaXR5LmZpbGxlZCkKKwltb3JlX3ByaW50ZigiXHQlc1xuIiwgQ0xJX0RNSV9TRUNVUklUWSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZG1pX2Jhc2VfYm9hcmQoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJCXN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpZiAoaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLmZpbGxlZCA9PSBmYWxzZSkgeworCW1vcmVfcHJpbnRmKCJiYXNlX2JvYXJkIGluZm9ybWF0aW9uIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc2VlICIKKwkJICAgICJgc2hvdyBsaXN0JyB0byBzZWUgd2hpY2ggbW9kdWxlIGlzIGF2YWlsYWJsZS5cbiIpOworCXJldHVybjsKKyAgICB9CisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICBtb3JlX3ByaW50ZigiQmFzZSBib2FyZFxuIik7CisgICAgbW9yZV9wcmludGYoIiBNYW51ZmFjdHVyZXIgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLm1hbnVmYWN0dXJlcik7CisgICAgbW9yZV9wcmludGYoIiBQcm9kdWN0IE5hbWUgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLnByb2R1Y3RfbmFtZSk7CisgICAgbW9yZV9wcmludGYoIiBWZXJzaW9uICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLnZlcnNpb24pOworICAgIG1vcmVfcHJpbnRmKCIgU2VyaWFsICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5zZXJpYWwpOworICAgIG1vcmVfcHJpbnRmKCIgQXNzZXQgVGFnICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5hc3NldF90YWcpOworICAgIG1vcmVfcHJpbnRmKCIgTG9jYXRpb24gICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5sb2NhdGlvbik7CisgICAgbW9yZV9wcmludGYoIiBUeXBlICAgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLnR5cGUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQkFTRV9CT0FSRF9OQl9FTEVNRU5UUzsgaSsrKSB7CisJaWYgKCgoYm9vbCAqKSAoJmhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5mZWF0dXJlcykpW2ldID09IHRydWUpIHsKKwkgICAgbW9yZV9wcmludGYoIiAlc1xuIiwgYmFzZV9ib2FyZF9mZWF0dXJlc19zdHJpbmdzW2ldKTsKKwl9CisgICAgfQorCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7CisJIGkgPAorCSBzaXplb2YgaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLmRldmljZXNfaW5mb3JtYXRpb24gLworCSBzaXplb2YgKmhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uOyBpKyspIHsKKwlpZiAoc3RybGVuKGhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uW2ldLnR5cGUpKSB7CisJICAgIG1vcmVfcHJpbnRmKCJPbiBCb2FyZCBEZXZpY2UgIyV1IEluZm9ybWF0aW9uXG4iLCBpKQorCQltb3JlX3ByaW50ZigiICBUeXBlICAgICAgICA6ICVzXG4iLAorCQkJICAgIGhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uW2ldLgorCQkJICAgIHR5cGUpOworCSAgICBtb3JlX3ByaW50ZigiICBTdGF0dXMgICAgICA6ICVzXG4iLAorCQkJaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLmRldmljZXNfaW5mb3JtYXRpb25baV0uCisJCQlzdGF0dXMgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKwkgICAgbW9yZV9wcmludGYoIiAgRGVzY3JpcHRpb24gOiAlc1xuIiwKKwkJCWhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uW2ldLgorCQkJZGVzY3JpcHRpb24pOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZG1pX3N5c3RlbShpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGlmIChoYXJkd2FyZS0+ZG1pLnN5c3RlbS5maWxsZWQgPT0gZmFsc2UpIHsKKwltb3JlX3ByaW50Zigic3lzdGVtIGluZm9ybWF0aW9uIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc2VlICIKKwkJICAgICJgc2hvdyBsaXN0JyB0byBzZWUgd2hpY2ggbW9kdWxlIGlzIGF2YWlsYWJsZS5cbiIpOworCXJldHVybjsKKyAgICB9CisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICBtb3JlX3ByaW50ZigiU3lzdGVtXG4iKTsKKyAgICBtb3JlX3ByaW50ZigiIE1hbnVmYWN0dXJlciA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLnN5c3RlbS5tYW51ZmFjdHVyZXIpOworICAgIG1vcmVfcHJpbnRmKCIgUHJvZHVjdCBOYW1lIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuc3lzdGVtLnByb2R1Y3RfbmFtZSk7CisgICAgbW9yZV9wcmludGYoIiBWZXJzaW9uICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5zeXN0ZW0udmVyc2lvbik7CisgICAgbW9yZV9wcmludGYoIiBTZXJpYWwgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc2VyaWFsKTsKKyAgICBtb3JlX3ByaW50ZigiIFVVSUQgICAgICAgICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLnN5c3RlbS51dWlkKTsKKyAgICBtb3JlX3ByaW50ZigiIFdha2V1cCBUeXBlICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLnN5c3RlbS53YWtldXBfdHlwZSk7CisgICAgbW9yZV9wcmludGYoIiBTS1UgTnVtYmVyICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc2t1X251bWJlcik7CisgICAgbW9yZV9wcmludGYoIiBGYW1pbHkgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5zeXN0ZW0uZmFtaWx5KTsKKworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPmRtaS5zeXN0ZW0uY29uZmlndXJhdGlvbl9vcHRpb25zKSkgeworCW1vcmVfcHJpbnRmKCJTeXN0ZW0gQ29uZmlndXJhdGlvbiBPcHRpb25zXG4iKTsKKwltb3JlX3ByaW50ZigiJXNcbiIsIGhhcmR3YXJlLT5kbWkuc3lzdGVtLmNvbmZpZ3VyYXRpb25fb3B0aW9ucyk7CisgICAgfQorCisgICAgaWYgKGhhcmR3YXJlLT5kbWkuc3lzdGVtLnN5c3RlbV9yZXNldC5maWxsZWQpIHsKKwltb3JlX3ByaW50ZigiU3lzdGVtIFJlc2V0XG4iKTsKKwltb3JlX3ByaW50ZigiICBTdGF0dXMgICAgICAgICAgICAgICA6ICVzXG4iLAorCQkgICAgKGhhcmR3YXJlLT5kbWkuc3lzdGVtLnN5c3RlbV9yZXNldC4KKwkJICAgICBzdGF0dXMgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKSk7CisJbW9yZV9wcmludGYoIiAgV2F0Y2hkb2cgVGltZXIgICAgICAgOiAlc1xuIiwKKwkJICAgIChoYXJkd2FyZS0+ZG1pLnN5c3RlbS5zeXN0ZW1fcmVzZXQuCisJCSAgICAgd2F0Y2hkb2cgPyAiUHJlc2VudCIgOiAiTm90IFByZXNlbnQiKSk7CisJaWYgKHN0cmxlbihoYXJkd2FyZS0+ZG1pLnN5c3RlbS5zeXN0ZW1fcmVzZXQuYm9vdF9vcHRpb24pKQorCSAgICBtb3JlX3ByaW50ZigiICBCb290IE9wdGlvbiAgICAgICAgICA6ICVzXG4iLAorCQkJaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc3lzdGVtX3Jlc2V0LmJvb3Rfb3B0aW9uKTsKKwlpZiAoc3RybGVuKGhhcmR3YXJlLT5kbWkuc3lzdGVtLnN5c3RlbV9yZXNldC5ib290X29wdGlvbl9vbl9saW1pdCkpCisJICAgIG1vcmVfcHJpbnRmKCIgIEJvb3QgT3B0aW9uIE9uIExpbWl0IDogJXNcbiIsCisJCQloYXJkd2FyZS0+ZG1pLnN5c3RlbS5zeXN0ZW1fcmVzZXQuYm9vdF9vcHRpb25fb25fbGltaXQpOworCWlmIChzdHJsZW4oaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc3lzdGVtX3Jlc2V0LnJlc2V0X2NvdW50KSkKKwkgICAgbW9yZV9wcmludGYoIiAgUmVzZXQgQ291bnQgICAgICAgICAgOiAlc1xuIiwKKwkJCWhhcmR3YXJlLT5kbWkuc3lzdGVtLnN5c3RlbV9yZXNldC5yZXNldF9jb3VudCk7CisJaWYgKHN0cmxlbihoYXJkd2FyZS0+ZG1pLnN5c3RlbS5zeXN0ZW1fcmVzZXQucmVzZXRfbGltaXQpKQorCSAgICBtb3JlX3ByaW50ZigiICBSZXNldCBMaW1pdCAgICAgICAgICA6ICVzXG4iLAorCQkJaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc3lzdGVtX3Jlc2V0LnJlc2V0X2xpbWl0KTsKKwlpZiAoc3RybGVuKGhhcmR3YXJlLT5kbWkuc3lzdGVtLnN5c3RlbV9yZXNldC50aW1lcl9pbnRlcnZhbCkpCisJICAgIG1vcmVfcHJpbnRmKCIgIFRpbWVyIEludGVydmFsICAgICAgIDogJXNcbiIsCisJCQloYXJkd2FyZS0+ZG1pLnN5c3RlbS5zeXN0ZW1fcmVzZXQudGltZXJfaW50ZXJ2YWwpOworCWlmIChzdHJsZW4oaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc3lzdGVtX3Jlc2V0LnRpbWVvdXQpKQorCSAgICBtb3JlX3ByaW50ZigiICBUaW1lb3V0ICAgICAgICAgICAgICA6ICVzXG4iLAorCQkJaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc3lzdGVtX3Jlc2V0LnRpbWVvdXQpOworICAgIH0KKworICAgIG1vcmVfcHJpbnRmKCJTeXN0ZW0gQm9vdCBJbmZvcm1hdGlvblxuIik7CisgICAgbW9yZV9wcmludGYoIiBTdGF0dXMgICAgICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc3lzdGVtX2Jvb3Rfc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19kbWlfYmlvcyhpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpZiAoaGFyZHdhcmUtPmRtaS5iaW9zLmZpbGxlZCA9PSBmYWxzZSkgeworCW1vcmVfcHJpbnRmKCJiaW9zIGluZm9ybWF0aW9uIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc2VlICIKKwkJICAgICJgc2hvdyBsaXN0JyB0byBzZWUgd2hpY2ggbW9kdWxlIGlzIGF2YWlsYWJsZS5cbiIpOworCXJldHVybjsKKyAgICB9CisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICBtb3JlX3ByaW50ZigiQklPU1xuIik7CisgICAgbW9yZV9wcmludGYoIiBWZW5kb3IgICAgICAgICAgICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLmJpb3MudmVuZG9yKTsKKyAgICBtb3JlX3ByaW50ZigiIFZlcnNpb24gICAgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuYmlvcy52ZXJzaW9uKTsKKyAgICBtb3JlX3ByaW50ZigiIFJlbGVhc2UgRGF0ZSAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuYmlvcy5yZWxlYXNlX2RhdGUpOworICAgIG1vcmVfcHJpbnRmKCIgQmlvcyBSZXZpc2lvbiAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iaW9zLmJpb3NfcmV2aXNpb24pOworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPmRtaS5iaW9zLmZpcm13YXJlX3JldmlzaW9uKSkKKwltb3JlX3ByaW50ZigiIEZpcm13YXJlIFJldmlzaW9uIDogJXNcbiIsCisJCSAgICBoYXJkd2FyZS0+ZG1pLmJpb3MuZmlybXdhcmVfcmV2aXNpb24pOworICAgIG1vcmVfcHJpbnRmKCIgQWRkcmVzcyAgICAgICAgICAgOiAweCUwNFgwXG4iLCBoYXJkd2FyZS0+ZG1pLmJpb3MuYWRkcmVzcyk7CisgICAgbW9yZV9wcmludGYoIiBSdW50aW1lIGFkZHJlc3MgICA6ICV1ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLmJpb3MucnVudGltZV9zaXplLAorCQloYXJkd2FyZS0+ZG1pLmJpb3MucnVudGltZV9zaXplX3VuaXQpOworICAgIG1vcmVfcHJpbnRmKCIgUm9tIHNpemUgICAgICAgICAgOiAldSAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iaW9zLnJvbV9zaXplLAorCQloYXJkd2FyZS0+ZG1pLmJpb3Mucm9tX3NpemVfdW5pdCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJJT1NfQ0hBUl9OQl9FTEVNRU5UUzsgaSsrKSB7CisJaWYgKCgoYm9vbCAqKSAoJmhhcmR3YXJlLT5kbWkuYmlvcy5jaGFyYWN0ZXJpc3RpY3MpKVtpXSA9PSB0cnVlKSB7CisJICAgIG1vcmVfcHJpbnRmKCIgJXNcbiIsIGJpb3NfY2hhcmFjX3N0cmluZ3NbaV0pOworCX0KKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCSU9TX0NIQVJfWDFfTkJfRUxFTUVOVFM7IGkrKykgeworCWlmICgoKGJvb2wgKikgKCZoYXJkd2FyZS0+ZG1pLmJpb3MuY2hhcmFjdGVyaXN0aWNzX3gxKSlbaV0gPT0gdHJ1ZSkgeworCSAgICBtb3JlX3ByaW50ZigiICVzXG4iLCBiaW9zX2NoYXJhY194MV9zdHJpbmdzW2ldKTsKKwl9CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCSU9TX0NIQVJfWDJfTkJfRUxFTUVOVFM7IGkrKykgeworCWlmICgoKGJvb2wgKikgKCZoYXJkd2FyZS0+ZG1pLmJpb3MuY2hhcmFjdGVyaXN0aWNzX3gyKSlbaV0gPT0gdHJ1ZSkgeworCSAgICBtb3JlX3ByaW50ZigiICVzXG4iLCBiaW9zX2NoYXJhY194Ml9zdHJpbmdzW2ldKTsKKwl9CisgICAgfQorCit9CisKK3N0YXRpYyB2b2lkIHNob3dfZG1pX2NoYXNzaXMoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgaWYgKGhhcmR3YXJlLT5kbWkuY2hhc3Npcy5maWxsZWQgPT0gZmFsc2UpIHsKKwltb3JlX3ByaW50ZigiY2hhc3NpcyBpbmZvcm1hdGlvbiBub3QgZm91bmQgb24geW91ciBzeXN0ZW0sIHNlZSAiCisJCSAgICAiYHNob3cgbGlzdCcgdG8gc2VlIHdoaWNoIG1vZHVsZSBpcyBhdmFpbGFibGUuXG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgbW9yZV9wcmludGYoIkNoYXNzaXNcbiIpOworICAgIG1vcmVfcHJpbnRmKCIgTWFudWZhY3R1cmVyICAgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuY2hhc3Npcy5tYW51ZmFjdHVyZXIpOworICAgIG1vcmVfcHJpbnRmKCIgVHlwZSAgICAgICAgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuY2hhc3Npcy50eXBlKTsKKyAgICBtb3JlX3ByaW50ZigiIExvY2sgICAgICAgICAgICAgICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLmNoYXNzaXMubG9jayk7CisgICAgbW9yZV9wcmludGYoIiBWZXJzaW9uICAgICAgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5jaGFzc2lzLnZlcnNpb24pOworICAgIG1vcmVfcHJpbnRmKCIgU2VyaWFsICAgICAgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuY2hhc3Npcy5zZXJpYWwpOworICAgIG1vcmVfcHJpbnRmKCIgQXNzZXQgVGFnICAgICAgICAgIDogJXNcbiIsCisJCWRlbF9tdWx0aV9zcGFjZXMoaGFyZHdhcmUtPmRtaS5jaGFzc2lzLmFzc2V0X3RhZykpOworICAgIG1vcmVfcHJpbnRmKCIgQm9vdCB1cCBzdGF0ZSAgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuY2hhc3Npcy5ib290X3VwX3N0YXRlKTsKKyAgICBtb3JlX3ByaW50ZigiIFBvd2VyIHN1cHBseSBzdGF0ZSA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLmNoYXNzaXMucG93ZXJfc3VwcGx5X3N0YXRlKTsKKyAgICBtb3JlX3ByaW50ZigiIFRoZXJtYWwgc3RhdGUgICAgICA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLmNoYXNzaXMudGhlcm1hbF9zdGF0ZSk7CisgICAgbW9yZV9wcmludGYoIiBTZWN1cml0eSBTdGF0dXMgICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5jaGFzc2lzLnNlY3VyaXR5X3N0YXR1cyk7CisgICAgbW9yZV9wcmludGYoIiBPRU0gSW5mb3JtYXRpb24gICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5jaGFzc2lzLm9lbV9pbmZvcm1hdGlvbik7CisgICAgbW9yZV9wcmludGYoIiBIZWlnaHQgICAgICAgICAgICAgOiAldVxuIiwgaGFyZHdhcmUtPmRtaS5jaGFzc2lzLmhlaWdodCk7CisgICAgbW9yZV9wcmludGYoIiBOQiBQb3dlciBDb3JkcyAgICAgOiAldVxuIiwKKwkJaGFyZHdhcmUtPmRtaS5jaGFzc2lzLm5iX3Bvd2VyX2NvcmRzKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19kbWlfaXBtaShpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpZiAoaGFyZHdhcmUtPmRtaS5pcG1pLmZpbGxlZCA9PSBmYWxzZSkgeworCW1vcmVfcHJpbnRmKCJJUE1JIG1vZHVsZSBub3QgYXZhaWxhYmxlXG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgbW9yZV9wcmludGYoIklQTUlcbiIpOworICAgIG1vcmVfcHJpbnRmKCIgSW50ZXJmYWNlIFR5cGUgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuaXBtaS5pbnRlcmZhY2VfdHlwZSk7CisgICAgbW9yZV9wcmludGYoIiBTcGVjaWZpY2F0aW9uIFZlci4gOiAldS4ldVxuIiwKKwkJaGFyZHdhcmUtPmRtaS5pcG1pLm1ham9yX3NwZWNpZmljYXRpb25fdmVyc2lvbiwKKwkJaGFyZHdhcmUtPmRtaS5pcG1pLm1pbm9yX3NwZWNpZmljYXRpb25fdmVyc2lvbik7CisgICAgbW9yZV9wcmludGYoIiBJMkMgU2xhdmUgQWRkcmVzcyAgOiAweCUwMnhcbiIsCisJCWhhcmR3YXJlLT5kbWkuaXBtaS5JMkNfc2xhdmVfYWRkcmVzcyk7CisgICAgbW9yZV9wcmludGYoIiBOdiBTdG9yYWdlIEFkZHJlc3MgOiAldVxuIiwgaGFyZHdhcmUtPmRtaS5pcG1pLm52X2FkZHJlc3MpOworICAgIHVpbnQzMl90IGhpZ2ggPSBoYXJkd2FyZS0+ZG1pLmlwbWkuYmFzZV9hZGRyZXNzID4+IDMyOworICAgIHVpbnQzMl90IGxvdyA9IGhhcmR3YXJlLT5kbWkuaXBtaS5iYXNlX2FkZHJlc3MgJiAweEZGRkY7CisgICAgbW9yZV9wcmludGYoIiBCYXNlIEFkZHJlc3MgICAgICAgOiAlMDhYJTA4WFxuIiwgaGlnaCwgKGxvdyAmIH4xKSk7CisgICAgbW9yZV9wcmludGYoIiBJUlEgICAgICAgICAgICAgICAgOiAlZFxuIiwgaGFyZHdhcmUtPmRtaS5pcG1pLmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZG1pX2JhdHRlcnkoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgaWYgKGhhcmR3YXJlLT5kbWkuYmF0dGVyeS5maWxsZWQgPT0gZmFsc2UpIHsKKwltb3JlX3ByaW50ZigiYmF0dGVyeSBpbmZvcm1hdGlvbiBub3QgZm91bmQgb24geW91ciBzeXN0ZW0sIHNlZSAiCisJCSAgICAiYHNob3cgbGlzdCcgdG8gc2VlIHdoaWNoIG1vZHVsZSBpcyBhdmFpbGFibGUuXG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgbW9yZV9wcmludGYoIkJhdHRlcnkgXG4iKTsKKyAgICBtb3JlX3ByaW50ZigiIFZlbmRvciAgICAgICAgICAgICA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLmJhdHRlcnkubWFudWZhY3R1cmVyKTsKKyAgICBtb3JlX3ByaW50ZigiIE1hbnVmYWN0dXJlIERhdGUgICA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLmJhdHRlcnkubWFudWZhY3R1cmVfZGF0ZSk7CisgICAgbW9yZV9wcmludGYoIiBTZXJpYWwgICAgICAgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iYXR0ZXJ5LnNlcmlhbCk7CisgICAgbW9yZV9wcmludGYoIiBOYW1lICAgICAgICAgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iYXR0ZXJ5Lm5hbWUpOworICAgIG1vcmVfcHJpbnRmKCIgQ2hlbWlzdHJ5ICAgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuYmF0dGVyeS5jaGVtaXN0cnkpOworICAgIG1vcmVfcHJpbnRmKCIgRGVzaWduIENhcGFjaXR5ICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuYmF0dGVyeS5kZXNpZ25fY2FwYWNpdHkpOworICAgIG1vcmVfcHJpbnRmKCIgRGVzaWduIFZvbHRhZ2UgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuYmF0dGVyeS5kZXNpZ25fdm9sdGFnZSk7CisgICAgbW9yZV9wcmludGYoIiBTQkRTICAgICAgICAgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iYXR0ZXJ5LnNiZHMpOworICAgIG1vcmVfcHJpbnRmKCIgU0JEUyBNYW51Zi4gRGF0ZSAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuYmF0dGVyeS5zYmRzX21hbnVmYWN0dXJlX2RhdGUpOworICAgIG1vcmVfcHJpbnRmKCIgU0JEUyBDaGVtaXN0cnkgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuYmF0dGVyeS5zYmRzX2NoZW1pc3RyeSk7CisgICAgbW9yZV9wcmludGYoIiBNYXhpbXVtIEVycm9yICAgICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5iYXR0ZXJ5Lm1heGltdW1fZXJyb3IpOworICAgIG1vcmVfcHJpbnRmKCIgT0VNIEluZm8gICAgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuYmF0dGVyeS5vZW1faW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZG1pX2NwdShpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGlmIChoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5maWxsZWQgPT0gZmFsc2UpIHsKKwltb3JlX3ByaW50ZigicHJvY2Vzc29yIGluZm9ybWF0aW9uIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc2VlICIKKwkJICAgICJgc2hvdyBsaXN0JyB0byBzZWUgd2hpY2ggbW9kdWxlIGlzIGF2YWlsYWJsZS5cbiIpOworCXJldHVybjsKKyAgICB9CisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICBtb3JlX3ByaW50ZigiQ1BVXG4iKTsKKyAgICBtb3JlX3ByaW50ZigiIFNvY2tldCBEZXNpZ25hdGlvbiA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5zb2NrZXRfZGVzaWduYXRpb24pOworICAgIG1vcmVfcHJpbnRmKCIgVHlwZSAgICAgICAgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnR5cGUpOworICAgIG1vcmVfcHJpbnRmKCIgRmFtaWx5ICAgICAgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmZhbWlseSk7CisgICAgbW9yZV9wcmludGYoIiBNYW51ZmFjdHVyZXIgICAgICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IubWFudWZhY3R1cmVyKTsKKyAgICBtb3JlX3ByaW50ZigiIFZlcnNpb24gICAgICAgICAgICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci52ZXJzaW9uKTsKKyAgICBtb3JlX3ByaW50ZigiIEV4dGVybmFsIENsb2NrICAgICA6ICV1XG4iLAorCQloYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5leHRlcm5hbF9jbG9jayk7CisgICAgbW9yZV9wcmludGYoIiBNYXggU3BlZWQgICAgICAgICAgOiAldVxuIiwKKwkJaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IubWF4X3NwZWVkKTsKKyAgICBtb3JlX3ByaW50ZigiIEN1cnJlbnQgU3BlZWQgICAgICA6ICV1XG4iLAorCQloYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5jdXJyZW50X3NwZWVkKTsKKyAgICBtb3JlX3ByaW50ZigiIENwdSBUeXBlICAgICAgICAgICA6ICV1XG4iLAorCQloYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5zaWduYXR1cmUudHlwZSk7CisgICAgbW9yZV9wcmludGYoIiBDcHUgRmFtaWx5ICAgICAgICAgOiAldVxuIiwKKwkJaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3Iuc2lnbmF0dXJlLmZhbWlseSk7CisgICAgbW9yZV9wcmludGYoIiBDcHUgTW9kZWwgICAgICAgICAgOiAldVxuIiwKKwkJaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3Iuc2lnbmF0dXJlLm1vZGVsKTsKKyAgICBtb3JlX3ByaW50ZigiIENwdSBTdGVwcGluZyAgICAgICA6ICV1XG4iLAorCQloYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5zaWduYXR1cmUuc3RlcHBpbmcpOworICAgIG1vcmVfcHJpbnRmKCIgQ3B1IE1pbm9yIFN0ZXBwaW5nIDogJXVcbiIsCisJCWhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnNpZ25hdHVyZS5taW5vcl9zdGVwcGluZyk7CisgICAgbW9yZV9wcmludGYoIlZvbHRhZ2UgICAgICAgICAgICAgOiAlZC4lMDJkXG4iLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnZvbHRhZ2VfbXYgLyAxMDAwLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnZvbHRhZ2VfbXYgLQorICAgICAgICAgICAgICAgICgoaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3Iudm9sdGFnZV9tdiAvIDEwMDApICogMTAwMCkpOworICAgIG1vcmVfcHJpbnRmKCIgU3RhdHVzICAgICAgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnN0YXR1cyk7CisgICAgbW9yZV9wcmludGYoIiBVcGdyYWRlICAgICAgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IudXBncmFkZSk7CisgICAgbW9yZV9wcmludGYoIiBDYWNoZSBMMSBIYW5kbGUgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IuY2FjaGUxKTsKKyAgICBtb3JlX3ByaW50ZigiIENhY2hlIEwyIEhhbmRsZSAgICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5jYWNoZTIpOworICAgIG1vcmVfcHJpbnRmKCIgQ2FjaGUgTDMgSGFuZGxlICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmNhY2hlMyk7CisgICAgbW9yZV9wcmludGYoIiBTZXJpYWwgICAgICAgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3Iuc2VyaWFsKTsKKyAgICBtb3JlX3ByaW50ZigiIFBhcnQgTnVtYmVyICAgICAgICA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5wYXJ0X251bWJlcik7CisgICAgaWYgKGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmNvcmVfY291bnQgIT0gMCkKKyAgICAgICAgbW9yZV9wcmludGYoIiBDb3JlcyBDb3VudCAgICAgICAgOiAlZFxuIiwgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IuY29yZV9jb3VudCk7CisgICAgaWYgKGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmNvcmVfZW5hYmxlZCAhPSAwKQorICAgICAgICBtb3JlX3ByaW50ZigiIENvcmVzIEVuYWJsZWQgICAgICA6ICVkXG4iLCBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5jb3JlX2VuYWJsZWQpOworICAgIGlmIChoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci50aHJlYWRfY291bnQgIT0gMCkKKyAgICAgICAgbW9yZV9wcmludGYoIiBUaHJlYWRzIENvdW50ICAgICAgOiAlZFxuIiwgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IudGhyZWFkX2NvdW50KTsKKworICAgIG1vcmVfcHJpbnRmKCIgSUQgICAgICAgICAgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmlkKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBST0NFU1NPUl9GTEFHU19FTEVNRU5UUzsgaSsrKSB7CisJaWYgKCgoYm9vbCAqKSAoJmhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmNwdV9mbGFncykpW2ldID09IHRydWUpIHsKKwkgICAgbW9yZV9wcmludGYoIiAlc1xuIiwgY3B1X2ZsYWdzX3N0cmluZ3NbaV0pOworCX0KKyAgICB9Cit9CisKK3ZvaWQgc2hvd19kbWlfbWVtb3J5X2JhbmsoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgaW50IGJhbmsgPSAtMTsKKworICAgIC8qIFNhbml0aXplIGFyZ3VtZW50cyAqLworICAgIGlmIChhcmdjID4gMCkKKwliYW5rID0gc3RydG9sKGFyZ3ZbMF0sIChjaGFyICoqKU5VTEwsIDEwKTsKKworICAgIGlmIChlcnJubyA9PSBFUkFOR0UgfHwgYmFuayA8IDApIHsKKwltb3JlX3ByaW50ZigiVGhpcyBiYW5rIG51bWJlciBpcyBpbmNvcnJlY3RcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKGJhbmsgPj0gaGFyZHdhcmUtPmRtaS5tZW1vcnlfY291bnQpIHx8IChiYW5rIDwgMCkpIHsKKwltb3JlX3ByaW50ZigiQmFuayAlZCBudW1iZXIgZG9lc24ndCBleGlzdFxuIiwgYmFuayk7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAoaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10uZmlsbGVkID09IGZhbHNlKSB7CisJbW9yZV9wcmludGYoIkJhbmsgJWQgZG9lc24ndCBjb250YWluIGFueSBpbmZvcm1hdGlvblxuIiwgYmFuayk7CisJcmV0dXJuOworICAgIH0KKworICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgbW9yZV9wcmludGYoIk1lbW9yeSBCYW5rICVkXG4iLCBiYW5rKTsKKyAgICBtb3JlX3ByaW50ZigiIEZvcm0gRmFjdG9yICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5mb3JtX2ZhY3Rvcik7CisgICAgbW9yZV9wcmludGYoIiBUeXBlICAgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10udHlwZSk7CisgICAgbW9yZV9wcmludGYoIiBUeXBlIERldGFpbCAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10udHlwZV9kZXRhaWwpOworICAgIG1vcmVfcHJpbnRmKCIgU3BlZWQgICAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkubWVtb3J5W2JhbmtdLnNwZWVkKTsKKyAgICBtb3JlX3ByaW50ZigiIFNpemUgICAgICAgICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5zaXplKTsKKyAgICBtb3JlX3ByaW50ZigiIERldmljZSBTZXQgICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5kZXZpY2Vfc2V0KTsKKyAgICBtb3JlX3ByaW50ZigiIERldmljZSBMb2MuICA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5kZXZpY2VfbG9jYXRvcik7CisgICAgbW9yZV9wcmludGYoIiBCYW5rIExvY2F0b3IgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10uYmFua19sb2NhdG9yKTsKKyAgICBtb3JlX3ByaW50ZigiIFRvdGFsIFdpZHRoICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS50b3RhbF93aWR0aCk7CisgICAgbW9yZV9wcmludGYoIiBEYXRhIFdpZHRoICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10uZGF0YV93aWR0aCk7CisgICAgbW9yZV9wcmludGYoIiBFcnJvciAgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10uZXJyb3IpOworICAgIG1vcmVfcHJpbnRmKCIgVmVuZG9yICAgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkubWVtb3J5W2JhbmtdLm1hbnVmYWN0dXJlcik7CisgICAgbW9yZV9wcmludGYoIiBTZXJpYWwgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10uc2VyaWFsKTsKKyAgICBtb3JlX3ByaW50ZigiIEFzc2V0IFRhZyAgICA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5hc3NldF90YWcpOworICAgIG1vcmVfcHJpbnRmKCIgUGFydCBOdW1iZXIgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkubWVtb3J5W2JhbmtdLnBhcnRfbnVtYmVyKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19kbWlfY2FjaGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgaWYgKCFoYXJkd2FyZS0+ZG1pLmNhY2hlX2NvdW50KSB7CisJbW9yZV9wcmludGYoImNhY2hlIGluZm9ybWF0aW9uIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc2VlICIKKwkJICAgICJgc2hvdyBsaXN0JyB0byBzZWUgd2hpY2ggbW9kdWxlIGlzIGF2YWlsYWJsZS5cbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpbnQgY2FjaGUgPSBzdHJ0b2woYXJndlswXSwgTlVMTCwgMTApOworCisgICAgaWYgKGFyZ2MgIT0gMSB8fCBjYWNoZSA+IGhhcmR3YXJlLT5kbWkuY2FjaGVfY291bnQpIHsKKwltb3JlX3ByaW50Zigic2hvdyBjYWNoZSBbMC0lZF1cbiIsIGhhcmR3YXJlLT5kbWkuY2FjaGVfY291bnQgLSAxKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKworICAgIG1vcmVfcHJpbnRmKCJDYWNoZSBJbmZvcm1hdGlvbiAjJWRcbiIsIGNhY2hlKTsKKyAgICBtb3JlX3ByaW50ZigiICBTb2NrZXQgRGVzaWduYXRpb24gICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5jYWNoZVtjYWNoZV0uc29ja2V0X2Rlc2lnbmF0aW9uKTsKKyAgICBtb3JlX3ByaW50ZigiICBDb25maWd1cmF0aW9uICAgICAgICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5jYWNoZVtjYWNoZV0uY29uZmlndXJhdGlvbik7CisgICAgbW9yZV9wcmludGYoIiAgT3BlcmF0aW9uYWwgTW9kZSAgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuY2FjaGVbY2FjaGVdLm1vZGUpOworICAgIG1vcmVfcHJpbnRmKCIgIExvY2F0aW9uICAgICAgICAgICAgICA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5sb2NhdGlvbik7CisgICAgbW9yZV9wcmludGYoIiAgSW5zdGFsbGVkIFNpemUgICAgICAgIDogJXUgS0IiLAorCQloYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5pbnN0YWxsZWRfc2l6ZSk7CisgICAgbW9yZV9wcmludGYoIlxuIik7CisgICAgbW9yZV9wcmludGYoIiAgTWF4aW11bSBTaXplICAgICAgICAgIDogJXUgS0IiLAorCQloYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5tYXhfc2l6ZSk7CisgICAgbW9yZV9wcmludGYoIlxuIik7CisgICAgbW9yZV9wcmludGYoIiAgU3VwcG9ydGVkIFNSQU0gVHlwZXMgIDogJXMiLAorCQloYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5zdXBwb3J0ZWRfc3JhbV90eXBlcyk7CisgICAgbW9yZV9wcmludGYoIlxuIik7CisgICAgbW9yZV9wcmludGYoIiAgSW5zdGFsbGVkIFNSQU0gVHlwZSAgIDogJXMiLAorCQloYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5pbnN0YWxsZWRfc3JhbV90eXBlcyk7CisgICAgbW9yZV9wcmludGYoIlxuIik7CisgICAgbW9yZV9wcmludGYoIiAgU3BlZWQgICAgICAgICAgICAgICAgIDogJXUgbnMiLAorCQloYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5zcGVlZCk7CisgICAgbW9yZV9wcmludGYoIlxuIik7CisgICAgbW9yZV9wcmludGYoIiAgRXJyb3IgQ29ycmVjdGlvbiBUeXBlIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuY2FjaGVbY2FjaGVdLmVycm9yX2NvcnJlY3Rpb25fdHlwZSk7CisgICAgbW9yZV9wcmludGYoIiAgU3lzdGVtIFR5cGUgICAgICAgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuY2FjaGVbY2FjaGVdLnN5c3RlbV90eXBlKTsKKyAgICBtb3JlX3ByaW50ZigiICBBc3NvY2lhdGl2aXR5ICAgICAgICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5jYWNoZVtjYWNoZV0uYXNzb2NpYXRpdml0eSk7Cit9CisKK3ZvaWQgc2hvd19kbWlfbWVtb3J5X21vZHVsZShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpbnQgbW9kdWxlID0gLTE7CisKKyAgICAvKiBTYW5pdGl6ZSBhcmd1bWVudHMgKi8KKyAgICBpZiAoYXJnYyA+IDApCisJbW9kdWxlID0gc3RydG9sKGFyZ3ZbMF0sIChjaGFyICoqKU5VTEwsIDEwKTsKKworICAgIGlmIChlcnJubyA9PSBFUkFOR0UgfHwgbW9kdWxlIDwgMCkgeworCW1vcmVfcHJpbnRmKCJUaGlzIG1vZHVsZSBudW1iZXIgaXMgaW5jb3JyZWN0XG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKChtb2R1bGUgPj0gaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlX2NvdW50KSB8fCAobW9kdWxlIDwgMCkpIHsKKwltb3JlX3ByaW50ZigiTW9kdWxlIG51bWJlciAlZCBkb2Vzbid0IGV4aXN0XG4iLCBtb2R1bGUpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlW21vZHVsZV0uZmlsbGVkID09IGZhbHNlKSB7CisJbW9yZV9wcmludGYoIk1vZHVsZSAlZCBkb2Vzbid0IGNvbnRhaW4gYW55IGluZm9ybWF0aW9uXG4iLCBtb2R1bGUpOworCXJldHVybjsKKyAgICB9CisKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworICAgIG1vcmVfcHJpbnRmKCJNZW1vcnkgTW9kdWxlICVkXG4iLCBtb2R1bGUpOworICAgIG1vcmVfcHJpbnRmKCIgU29ja2V0IERlc2lnbmF0aW9uIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZVttb2R1bGVdLnNvY2tldF9kZXNpZ25hdGlvbik7CisgICAgbW9yZV9wcmludGYoIiBCYW5rIENvbm5lY3Rpb25zICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlW21vZHVsZV0uYmFua19jb25uZWN0aW9ucyk7CisgICAgbW9yZV9wcmludGYoIiBDdXJyZW50IFNwZWVkICAgICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlW21vZHVsZV0uc3BlZWQpOworICAgIG1vcmVfcHJpbnRmKCIgVHlwZSAgICAgICAgICAgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZVttb2R1bGVdLnR5cGUpOworICAgIG1vcmVfcHJpbnRmKCIgSW5zdGFsbGVkIFNpemUgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZVttb2R1bGVdLmluc3RhbGxlZF9zaXplKTsKKyAgICBtb3JlX3ByaW50ZigiIEVuYWJsZWQgU2l6ZSAgICAgICA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLm1lbW9yeV9tb2R1bGVbbW9kdWxlXS5lbmFibGVkX3NpemUpOworICAgIG1vcmVfcHJpbnRmKCIgRXJyb3IgU3RhdHVzICAgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZVttb2R1bGVdLmVycm9yX3N0YXR1cyk7Cit9CisKK3ZvaWQgbWFpbl9zaG93X2RtaShpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCSAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKworICAgIGlmIChoYXJkd2FyZS0+aXNfZG1pX3ZhbGlkID09IGZhbHNlKSB7CisJbW9yZV9wcmludGYoIk5vIHZhbGlkIERNSSB0YWJsZSBmb3VuZCwgZXhpdGluZy5cbiIpOworCXJldHVybjsKKyAgICB9CisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICBtb3JlX3ByaW50ZigiRE1JIFRhYmxlIHZlcnNpb24gJXUuJXUgZm91bmRcbiIsCisJCWhhcmR3YXJlLT5kbWkuZG1pdGFibGUubWFqb3JfdmVyc2lvbiwKKwkJaGFyZHdhcmUtPmRtaS5kbWl0YWJsZS5taW5vcl92ZXJzaW9uKTsKKworICAgIHNob3dfZG1pX21vZHVsZXMoMCwgTlVMTCwgaGFyZHdhcmUpOworfQorCit2b2lkIHNob3dfZG1pX21lbW9yeV9tb2R1bGVzKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJCSAgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIC8qIERvIHdlIGhhdmUgc28gZGlzcGxheSB1bnBvcHVsYXRlZCBiYW5rcyA/ICovCisgICAgaW50IHNob3dfZnJlZV9iYW5rcyA9IDE7CisKKyAgICBtb3JlX3ByaW50ZigiTWVtb3J5IFNpemUgICA6ICVsdSBNQiAoJWx1IEtCKVxuIiwKKwkJKGhhcmR3YXJlLT5kZXRlY3RlZF9tZW1vcnlfc2l6ZSArICgxIDw8IDkpKSA+PiAxMCwKKwkJaGFyZHdhcmUtPmRldGVjdGVkX21lbW9yeV9zaXplKTsKKworICAgIGlmICgoaGFyZHdhcmUtPmRtaS5tZW1vcnlfY291bnQgPD0gMCkKKwkmJiAoaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlX2NvdW50IDw9IDApKSB7CisJbW9yZV9wcmludGYoIk5vIG1lbW9yeSBiYW5rIGZvdW5kXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogU2FuaXRpemUgYXJndW1lbnRzICovCisgICAgaWYgKGFyZ2MgPiAwKSB7CisJLyogV2hlbiB3ZSBkaXNwbGF5IGEgc3VtbWFyeSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzaG93IHRoZSB1bnBvcHVsYXRlZCBiYW5rcworCSAqIFRoZSBmaXJzdCBhcmd2IGlzIHNldCB0byBkZWZpbmUgdGhpcyBiZWhhdmlvcgorCSAqLworCXNob3dfZnJlZV9iYW5rcyA9IHN0cnRvbChhcmd2WzBdLCBOVUxMLCAxMCk7CisJaWYgKGVycm5vID09IEVSQU5HRSB8fCBzaG93X2ZyZWVfYmFua3MgPCAwIHx8IHNob3dfZnJlZV9iYW5rcyA+IDEpCisJICAgIGdvdG8gdXNhZ2U7CisgICAgfQorCisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICAvKiBJZiB0eXBlIDE3IGlzIGF2YWlsYWJsZSAqLworICAgIGlmIChoYXJkd2FyZS0+ZG1pLm1lbW9yeV9jb3VudCA+IDApIHsKKwljaGFyIGJhbmtfbnVtYmVyWzI1NV07CisJbW9yZV9wcmludGYoIk1lbW9yeSBCYW5rc1xuIik7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBoYXJkd2FyZS0+ZG1pLm1lbW9yeV9jb3VudDsgaSsrKSB7CisJICAgIGlmIChoYXJkd2FyZS0+ZG1pLm1lbW9yeVtpXS5maWxsZWQgPT0gdHJ1ZSkgeworCQltZW1zZXQoYmFua19udW1iZXIsIDAsIHNpemVvZihiYW5rX251bWJlcikpOworCQlzbnByaW50ZihiYW5rX251bWJlciwgc2l6ZW9mKGJhbmtfbnVtYmVyKSwgIiVkICIsIGkpOworCQlpZiAoc2hvd19mcmVlX2JhbmtzID09IGZhbHNlKSB7CisJCSAgICBpZiAoc3RybmNtcChoYXJkd2FyZS0+ZG1pLm1lbW9yeVtpXS5zaXplLCAiRnJlZSIsIDQpKQorCQkJbW9yZV9wcmludGYoIiBiYW5rICUwMmQgICAgICA6ICVzICVzQCVzXG4iLAorCQkJCSAgICBpLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtpXS5zaXplLAorCQkJCSAgICBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtpXS50eXBlLAorCQkJCSAgICBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtpXS5zcGVlZCk7CisJCX0gZWxzZSB7CisJCSAgICBtb3JlX3ByaW50ZigiIGJhbmsgJTAyZCAgICAgIDogJXMgJXNAJXNcbiIsIGksCisJCQkJaGFyZHdhcmUtPmRtaS5tZW1vcnlbaV0uc2l6ZSwKKwkJCQloYXJkd2FyZS0+ZG1pLm1lbW9yeVtpXS50eXBlLAorCQkJCWhhcmR3YXJlLT5kbWkubWVtb3J5W2ldLnNwZWVkKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0gZWxzZSBpZiAoaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlX2NvdW50ID4gMCkgeworCS8qIExldCdzIHVzZSB0eXBlIDYgYXMgYSBmYWxsYmFjayBvZiB0eXBlIDE3ICovCisJbW9yZV9wcmludGYoIk1lbW9yeSBNb2R1bGVzXG4iKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZV9jb3VudDsgaSsrKSB7CisJICAgIGlmIChoYXJkd2FyZS0+ZG1pLm1lbW9yeV9tb2R1bGVbaV0uZmlsbGVkID09IHRydWUpIHsKKwkJbW9yZV9wcmludGYoIiBtb2R1bGUgJTAyZCAgICA6ICVzICVzQCVzXG4iLCBpLAorCQkJICAgIGhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZVtpXS5lbmFibGVkX3NpemUsCisJCQkgICAgaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlW2ldLnR5cGUsCisJCQkgICAgaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlW2ldLnNwZWVkKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm47CisgICAgLy9wcmludGYoIlR5cGUgJ3Nob3cgYmFuazxiYW5rX251bWJlcj4nIGZvciBtb3JlIGRldGFpbHMuXG4iKTsKKwordXNhZ2U6CisgICAgbW9yZV9wcmludGYoInNob3cgbWVtb3J5IDxjbGVhciBzY3JlZW4/IDxzaG93IGZyZWUgYmFua3M/Pj5cbiIpOworICAgIHJldHVybjsKK30KKwordm9pZCBzaG93X2RtaV9vZW1fc3RyaW5ncyhpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworCisgICAgaWYgKHN0cmxlbihoYXJkd2FyZS0+ZG1pLm9lbV9zdHJpbmdzKSkKKwltb3JlX3ByaW50ZigiT0VNIFN0cmluZ3NcbiVzIiwgaGFyZHdhcmUtPmRtaS5vZW1fc3RyaW5ncyk7Cit9CisKK3ZvaWQgc2hvd19kbWlfaGFyZHdhcmVfc2VjdXJpdHkoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJCXN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworCisgICAgaWYgKCFoYXJkd2FyZS0+ZG1pLmhhcmR3YXJlX3NlY3VyaXR5LmZpbGxlZCkKKwlyZXR1cm47CisKKyAgICBtb3JlX3ByaW50ZigiSGFyZHdhcmUgU2VjdXJpdHlcbiIpOworICAgIG1vcmVfcHJpbnRmKCIgIFBvd2VyLU9uIFBhc3N3b3JkIFN0YXR1cyAgICAgIDogJXNcbiIsCisJCWhhcmR3YXJlLT5kbWkuaGFyZHdhcmVfc2VjdXJpdHkucG93ZXJfb25fcGFzc3dkX3N0YXR1cyk7CisgICAgbW9yZV9wcmludGYoIiAgS2V5Ym9hcmQgUGFzc3dvcmQgU3RhdHVzICAgICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5oYXJkd2FyZV9zZWN1cml0eS5rZXlib2FyZF9wYXNzd2Rfc3RhdHVzKTsKKyAgICBtb3JlX3ByaW50ZigiICBBZG1pbmlzdHJhdG9yIFBhc3N3b3JkIFN0YXR1cyA6ICVzXG4iLAorCQloYXJkd2FyZS0+ZG1pLmhhcmR3YXJlX3NlY3VyaXR5LmFkbWluaXN0cmF0b3JfcGFzc3dkX3N0YXR1cyk7CisgICAgbW9yZV9wcmludGYoIiAgRnJvbnQgUGFuZWwgUmVzZXQgU3RhdHVzICAgICAgOiAlc1xuIiwKKwkJaGFyZHdhcmUtPmRtaS5oYXJkd2FyZV9zZWN1cml0eS5mcm9udF9wYW5lbF9yZXNldF9zdGF0dXMpOworfQorCitzdHJ1Y3QgY2xpX2NhbGxiYWNrX2Rlc2NyIGxpc3RfZG1pX3Nob3dfbW9kdWxlc1tdID0geworICAgIHsKKyAgICAgLm5hbWUgPSBDTElfRE1JX0JBU0VfQk9BUkQsCisgICAgIC5leGVjID0gc2hvd19kbWlfYmFzZV9ib2FyZCwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9ETUlfQklPUywKKyAgICAgLmV4ZWMgPSBzaG93X2RtaV9iaW9zLAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gQ0xJX0RNSV9CQVRURVJZLAorICAgICAuZXhlYyA9IHNob3dfZG1pX2JhdHRlcnksCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfRE1JX0NIQVNTSVMsCisgICAgIC5leGVjID0gc2hvd19kbWlfY2hhc3NpcywKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9ETUlfTUVNT1JZLAorICAgICAuZXhlYyA9IHNob3dfZG1pX21lbW9yeV9tb2R1bGVzLAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gQ0xJX0RNSV9NRU1PUllfQkFOSywKKyAgICAgLmV4ZWMgPSBzaG93X2RtaV9tZW1vcnlfYmFuaywKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9ICJtb2R1bGUiLAorICAgICAuZXhlYyA9IHNob3dfZG1pX21lbW9yeV9tb2R1bGUsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfRE1JX1BST0NFU1NPUiwKKyAgICAgLmV4ZWMgPSBzaG93X2RtaV9jcHUsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfRE1JX1NZU1RFTSwKKyAgICAgLmV4ZWMgPSBzaG93X2RtaV9zeXN0ZW0sCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfRE1JX09FTSwKKyAgICAgLmV4ZWMgPSBzaG93X2RtaV9vZW1fc3RyaW5ncywKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9ETUlfU0VDVVJJVFksCisgICAgIC5leGVjID0gc2hvd19kbWlfaGFyZHdhcmVfc2VjdXJpdHksCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfRE1JX0lQTUksCisgICAgIC5leGVjID0gc2hvd19kbWlfaXBtaSwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9ETUlfQ0FDSEUsCisgICAgIC5leGVjID0gc2hvd19kbWlfY2FjaGUsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfRE1JX0xJU1QsCisgICAgIC5leGVjID0gc2hvd19kbWlfbW9kdWxlcywKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IE5VTEwsCisgICAgIC5leGVjID0gTlVMTCwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCit9OworCitzdHJ1Y3QgY2xpX21vZHVsZV9kZXNjciBkbWlfc2hvd19tb2R1bGVzID0geworICAgIC5tb2R1bGVzID0gbGlzdF9kbWlfc2hvd19tb2R1bGVzLAorICAgIC5kZWZhdWx0X2NhbGxiYWNrID0gbWFpbl9zaG93X2RtaSwKK307CisKK3N0cnVjdCBjbGlfbW9kZV9kZXNjciBkbWlfbW9kZSA9IHsKKyAgICAubW9kZSA9IERNSV9NT0RFLAorICAgIC5uYW1lID0gQ0xJX0RNSSwKKyAgICAuZGVmYXVsdF9tb2R1bGVzID0gTlVMTCwKKyAgICAuc2hvd19tb2R1bGVzID0gJmRtaV9zaG93X21vZHVsZXMsCisgICAgLnNldF9tb2R1bGVzID0gTlVMTCwKK307CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LWNsaS1oZHQuYyBiL2NvbTMyL2hkdC9oZHQtY2xpLWhkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTcxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWNsaS1oZHQuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllciAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9yZWJvb3QuaD4KKworI2luY2x1ZGUgImhkdC1tZW51LmgiCisjaW5jbHVkZSAiaGR0LWNsaS5oIgorI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKworLyoqCisgKiBjbGlfY2xlYXJfc2NyZWVuIC0gY2xlYXIgKGVyYXNlKSB0aGUgZW50aXJlIHNjcmVlbgorICoqLworc3RhdGljIHZvaWQgY2xpX2NsZWFyX3NjcmVlbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkgICAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSBfX3VudXNlZCkKK3sKKyAgICBjbGVhcl9zY3JlZW4oKTsKK30KKworLyoqCisgKiBtYWluX3Nob3dfbW9kZXMgLSBzaG93IGF2YWlsYWJsZXMgbW9kZXMKKyAqKi8KK3N0YXRpYyB2b2lkIG1haW5fc2hvd19tb2RlcyhpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlIF9fdW51c2VkKQoreworICAgIGludCBpID0gMDsKKworICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgbW9yZV9wcmludGYoIkF2YWlsYWJsZSBtb2RlczpcbiIpOworICAgIHdoaWxlIChsaXN0X21vZGVzW2ldKSB7CisJcHJpbnRmKCIlcyAiLCBsaXN0X21vZGVzW2ldLT5uYW1lKTsKKwlpKys7CisgICAgfQorICAgIG1vcmVfcHJpbnRmKCJcbiIpOworfQorCisvKioKKyAqIGNsaV9zZXRfbW9kZSAtIHNldCB0aGUgbW9kZSBvZiB0aGUgY2xpLCBpbiB0aGUgY2xpCisgKgorICogVGhlIG1vZGUgbnVtYmVyIG11c3QgYmUgc3VwcGxpZWQgaW4gYXJndiwgcG9zaXRpb24gMC4KKyAqKi8KK3N0YXRpYyB2b2lkIGNsaV9zZXRfbW9kZShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBjbGlfbW9kZV90IG5ld19tb2RlOworCisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICBpZiAoYXJnYyA8PSAwKSB7CisJbW9yZV9wcmludGYoIldoaWNoIG1vZGU/XG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOb3RlISBhcmd2WzBdIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbW9kZSwgd2UgbmVlZCB0aGUKKyAgICAgKiBlcXVpdmFsZW50IGNsaV9tb2RlX3QgdG8gcGFzcyBpdCB0byBzZXRfbW9kZS4KKyAgICAgKi8KKyAgICBuZXdfbW9kZSA9IG1vZGVfc190b19tb2RlX3QoYXJndlswXSk7CisgICAgc2V0X21vZGUobmV3X21vZGUsIGhhcmR3YXJlKTsKK30KKworLyoqCisgKiBkb19leGl0IC0gc2hhcmVkIGhlbHBlciB0byBleGl0IGEgbW9kZQorICoqLworc3RhdGljIHZvaWQgZG9fZXhpdChpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCSAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgaW50IG5ld19tb2RlID0gSERUX01PREU7CisKKyAgICBzd2l0Y2ggKGhkdF9jbGkubW9kZSkgeworICAgIGNhc2UgSERUX01PREU6CisJbmV3X21vZGUgPSBFWElUX01PREU7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwluZXdfbW9kZSA9IEhEVF9NT0RFOworCWJyZWFrOworICAgIH0KKworICAgIGRwcmludGYoIkNMSSBERUJVRzogU3dpdGNoaW5nIGZyb20gbW9kZSAlZCB0byBtb2RlICVkXG4iLCBoZHRfY2xpLm1vZGUsCisJICAgIG5ld19tb2RlKTsKKyAgICBzZXRfbW9kZShuZXdfbW9kZSwgaGFyZHdhcmUpOworfQorCisvKioKKyAqIHNob3dfY2xpX2hlbHAgLSBzaGFyZWQgaGVscGVyIHRvIHNob3cgYXZhaWxhYmxlIGNvbW1hbmRzCisgKiovCitzdGF0aWMgdm9pZCBzaG93X2NsaV9oZWxwKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJCSAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlIF9fdW51c2VkKQoreworICAgIGludCBqID0gMDsKKyAgICBzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgKmN1cnJlbnRfbW9kZTsKKyAgICBzdHJ1Y3QgY2xpX2NhbGxiYWNrX2Rlc2NyICphc3NvY2lhdGVkX21vZHVsZSA9IE5VTEw7CisKKyAgICBmaW5kX2NsaV9tb2RlX2Rlc2NyKGhkdF9jbGkubW9kZSwgJmN1cnJlbnRfbW9kZSk7CisKKyAgICBtb3JlX3ByaW50ZigiQXZhaWxhYmxlIGNvbW1hbmRzIGFyZTpcbiIpOworCisgICAgLyogTGlzdCBmaXJzdCBkZWZhdWx0IG1vZHVsZXMgb2YgdGhlIG1vZGUgKi8KKyAgICBpZiAoY3VycmVudF9tb2RlLT5kZWZhdWx0X21vZHVsZXMgJiYgY3VycmVudF9tb2RlLT5kZWZhdWx0X21vZHVsZXMtPm1vZHVsZXMpIHsKKwl3aGlsZSAoY3VycmVudF9tb2RlLT5kZWZhdWx0X21vZHVsZXMtPm1vZHVsZXNbal0ubmFtZSkgeworCSAgICBwcmludGYoIiVzICIsIGN1cnJlbnRfbW9kZS0+ZGVmYXVsdF9tb2R1bGVzLT5tb2R1bGVzW2pdLm5hbWUpOworCSAgICBqKys7CisJfQorCXByaW50ZigiXG4iKTsKKyAgICB9CisKKyAgICAvKiBMaXN0IGZpbmFsbHkgdGhlIGRlZmF1bHQgbW9kdWxlcyBvZiB0aGUgaGR0IG1vZGUgKi8KKyAgICBpZiAoY3VycmVudF9tb2RlLT5tb2RlICE9IGhkdF9tb2RlLm1vZGUgJiYKKwloZHRfbW9kZS5kZWZhdWx0X21vZHVsZXMgJiYgaGR0X21vZGUuZGVmYXVsdF9tb2R1bGVzLT5tb2R1bGVzKSB7CisJaiA9IDA7CisJd2hpbGUgKGhkdF9tb2RlLmRlZmF1bHRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKSB7CisJICAgIC8qCisJICAgICAqIEFueSBkZWZhdWx0IGNvbW1hbmQgdGhhdCBpcyBwcmVzZW50IGluIGhkdCBtb2RlIGJ1dAorCSAgICAgKiBub3QgaW4gdGhlIGN1cnJlbnQgbW9kZSBpcyBhdmFpbGFibGUuIEEgZGVmYXVsdAorCSAgICAgKiBjb21tYW5kIGNhbiBiZSByZWRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbW9kZSB0aG91Z2guCisJICAgICAqIFRoaXMgbmV4dCBjYWxsIHRlc3QgdGhpcyB1c2UgY2FzZTogaWYgaXQgaXMKKwkgICAgICogb3ZlcndyaXR0ZW4sIGRvIG5vdCBwcmludCBpdCBhZ2Fpbi4KKwkgICAgICovCisJICAgIGZpbmRfY2xpX2NhbGxiYWNrX2Rlc2NyKGhkdF9tb2RlLmRlZmF1bHRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lLAorCQkJCSAgICBjdXJyZW50X21vZGUtPmRlZmF1bHRfbW9kdWxlcywKKwkJCQkgICAgJmFzc29jaWF0ZWRfbW9kdWxlKTsKKwkgICAgaWYgKGFzc29jaWF0ZWRfbW9kdWxlID09IE5VTEwpCisJCXByaW50ZigiJXMgIiwgaGR0X21vZGUuZGVmYXVsdF9tb2R1bGVzLT5tb2R1bGVzW2pdLm5hbWUpOworCSAgICBqKys7CisJfQorCXByaW50ZigiXG4iKTsKKyAgICB9CisKKyAgICAvKiBMaXN0IHNlY29uZGx5IHRoZSBzaG93IG1vZHVsZXMgb2YgdGhlIG1vZGUgKi8KKyAgICBpZiAoY3VycmVudF9tb2RlLT5zaG93X21vZHVsZXMgJiYgY3VycmVudF9tb2RlLT5zaG93X21vZHVsZXMtPm1vZHVsZXMpIHsKKwltb3JlX3ByaW50ZigiXG5zaG93IGNvbW1hbmRzOlxuIik7CisJaiA9IDA7CisJd2hpbGUgKGN1cnJlbnRfbW9kZS0+c2hvd19tb2R1bGVzLT5tb2R1bGVzW2pdLm5hbWUpIHsKKwkgICAgcHJpbnRmKCIlcyAiLCBjdXJyZW50X21vZGUtPnNob3dfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKTsKKwkgICAgaisrOworCX0KKwlwcmludGYoIlxuIik7CisgICAgfQorCisgICAgLyogTGlzdCB0aGlyZGx5IHRoZSBzZXQgbW9kdWxlcyBvZiB0aGUgbW9kZSAqLworICAgIGlmIChjdXJyZW50X21vZGUtPnNldF9tb2R1bGVzICYmIGN1cnJlbnRfbW9kZS0+c2V0X21vZHVsZXMtPm1vZHVsZXMpIHsKKwltb3JlX3ByaW50ZigiXG5zZXQgY29tbWFuZHM6XG4iKTsKKwlqID0gMDsKKwl3aGlsZSAoY3VycmVudF9tb2RlLT5zZXRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKSB7CisJICAgIHByaW50ZigiJXMgIiwgY3VycmVudF9tb2RlLT5zZXRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKTsKKwkgICAgaisrOworCX0KKwlwcmludGYoIlxuIik7CisgICAgfQorCisKKyAgICBwcmludGYoIlxuIik7CisgICAgbWFpbl9zaG93X21vZGVzKGFyZ2MsIGFyZ3YsIGhhcmR3YXJlKTsKK30KKworLyoqCisgKiBzaG93X2NsaV9oZWxwIC0gc2hhcmVkIGhlbHBlciB0byBzaG93IGF2YWlsYWJsZSBjb21tYW5kcworICoqLworc3RhdGljIHZvaWQgZ290b19tZW51KGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJICAgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGNoYXIgdmVyc2lvbl9zdHJpbmdbMjU2XTsKKyAgICBzbnByaW50Zih2ZXJzaW9uX3N0cmluZywgc2l6ZW9mIHZlcnNpb25fc3RyaW5nLCAiJXMgJXMgKCVzKSIsCisJICAgICBQUk9EVUNUX05BTUUsIFZFUlNJT04sIENPREVOQU1FKTsKKyAgICBzdGFydF9tZW51X21vZGUoaGFyZHdhcmUsIHZlcnNpb25fc3RyaW5nKTsKKyAgICByZXR1cm47Cit9CisKKy8qKgorICogbWFpbl9zaG93X3N1bW1hcnkgLSBnaXZlIGFuIG92ZXJ2aWV3IG9mIHRoZSBzeXN0ZW0KKyAqKi8KK3ZvaWQgbWFpbl9zaG93X3N1bW1hcnkoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkgICAgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgY2xlYXJfc2NyZWVuKCk7CisgICAgbWFpbl9zaG93X2NwdShhcmdjLCBhcmd2LCBoYXJkd2FyZSk7CisgICAgaWYgKGhhcmR3YXJlLT5pc19kbWlfdmFsaWQpIHsKKwltb3JlX3ByaW50ZigiU3lzdGVtXG4iKTsKKwltb3JlX3ByaW50ZigiIE1hbnVmYWN0dXJlciA6ICVzXG4iLCBoYXJkd2FyZS0+ZG1pLnN5c3RlbS5tYW51ZmFjdHVyZXIpOworCW1vcmVfcHJpbnRmKCIgUHJvZHVjdCBOYW1lIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuc3lzdGVtLnByb2R1Y3RfbmFtZSk7CisJbW9yZV9wcmludGYoIiBTZXJpYWwgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc2VyaWFsKTsKKwltb3JlX3ByaW50ZigiQmlvc1xuIik7CisJbW9yZV9wcmludGYoIiBWZXJzaW9uICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPmRtaS5iaW9zLnZlcnNpb24pOworCW1vcmVfcHJpbnRmKCIgUmVsZWFzZSAgICAgIDogJXNcbiIsIGhhcmR3YXJlLT5kbWkuYmlvcy5yZWxlYXNlX2RhdGUpOworCW1vcmVfcHJpbnRmKCJNZW1vcnkgU2l6ZSAgIDogJWx1IE1CICglbHUgS0IpXG4iLAorCQkgICAgKGhhcmR3YXJlLT5kZXRlY3RlZF9tZW1vcnlfc2l6ZSArICgxIDw8IDkpKSA+PiAxMCwKKwkJICAgIGhhcmR3YXJlLT5kZXRlY3RlZF9tZW1vcnlfc2l6ZSk7CisgICAgfQorICAgIG1haW5fc2hvd19wY2koYXJnYywgYXJndiwgaGFyZHdhcmUpOworCisgICAgaWYgKGhhcmR3YXJlLT5pc19weGVfdmFsaWQpCisJbWFpbl9zaG93X3B4ZShhcmdjLCBhcmd2LCBoYXJkd2FyZSk7CisKKyAgICBtYWluX3Nob3dfa2VybmVsKGFyZ2MsIGFyZ3YsIGhhcmR3YXJlKTsKK30KKwordm9pZCBtYWluX3Nob3dfaGR0KGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlIF9fdW51c2VkKQoreworICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgbW9yZV9wcmludGYoIkhEVFxuIik7CisgICAgbW9yZV9wcmludGYoIiBQcm9kdWN0ICAgICAgICA6ICVzXG4iLCBQUk9EVUNUX05BTUUpOworICAgIG1vcmVfcHJpbnRmKCIgVmVyc2lvbiAgICAgICAgOiAlcyAoJXMpXG4iLCBWRVJTSU9OLCBDT0RFTkFNRSk7CisgICAgbW9yZV9wcmludGYoIiBXZWJzaXRlICAgICAgICA6ICVzXG4iLCBXRUJTSVRFX1VSTCk7CisgICAgbW9yZV9wcmludGYoIiBJUkMgQ2hhbm5lbCAgICA6ICVzXG4iLCBJUkNfQ0hBTk5FTCk7CisgICAgbW9yZV9wcmludGYoIiBNYWlsaW5nIExpc3QgICA6ICVzXG4iLCBDT05UQUNUKTsKKyAgICBtb3JlX3ByaW50ZigiIFByb2plY3QgTGVhZGVyIDogJXNcbiIsIEFVVEhPUik7CisgICAgbW9yZV9wcmludGYoIiBDb3JlIERldmVsb3BlciA6ICVzXG4iLCBDT1JFX0RFVkVMT1BFUik7CisgICAgY2hhciAqY29udHJpYnV0b3JzW05CX0NPTlRSSUJVVE9SU10gPSBDT05UUklCVVRPUlM7CisgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBOQl9DT05UUklCVVRPUlM7IGMrKykgeworCW1vcmVfcHJpbnRmKCIgQ29udHJpYnV0b3IgICAgOiAlc1xuIiwgY29udHJpYnV0b3JzW2NdKTsKKyAgICB9Cit9CisKKy8qKgorICogZG9fcmVib290IC0gcmVib290IHRoZSBzeXN0ZW0KKyAqKi8KK3N0YXRpYyB2b2lkIGRvX3JlYm9vdChpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCSAgICAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICAodm9pZCkgaGFyZHdhcmU7CisgICAgLyogTGV0J3MgY2FsbCB0aGUgaW50ZXJuYWwgcmVib290aW5nIGNhbGwgKi8KKyAgICBzeXNsaW51eF9yZWJvb3QoMSk7Cit9CisKKy8qKgorICogZG9fZHVtcCAtIGR1bXAgaW5mbworICoqLworc3RhdGljIHZvaWQgZG9fZHVtcChpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCSAgICAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBkdW1wKGhhcmR3YXJlKTsKK30KKworLyoqCisgKiBkb19zbGVlcCAtIHNsZWVwIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICoqLyAKK3N0YXRpYyB2b2lkIGRvX3NsZWVwKGludCBhcmdjICwgY2hhciAqKmFyZ3YgLAorCQkgICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAodm9pZCkgaGFyZHdhcmU7CisgICBpZiAoYXJnYyAhPSAxKSByZXR1cm47CisgICBtb3JlX3ByaW50ZigiU2xlZXAgJWQgbWlsbGlzZWNvbmRzXG4iLGF0b2koYXJndlswXSkpOworICAgbXNsZWVwKGF0b2koYXJndlswXSkpOworfQorCisvKioKKyAqIGRvX2Rpc3BsYXkgLSBkaXNwbGF5IGFuIGltYWdlIHRvIHVzZXIKKyAqKi8KK3N0YXRpYyB2b2lkIGRvX2Rpc3BsYXkoaW50IGFyZ2MgLCBjaGFyICoqYXJndiAsCisJCSAgICAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICh2b2lkKSBoYXJkd2FyZTsKKyAgIGlmICgoYXJnYyAhPSAxKSB8fCAodmVzYW1vZGUgPT0gZmFsc2UpKSByZXR1cm47CisgICBtb3JlX3ByaW50ZigiRGlzcGxheSAlcyBmaWxlXG4iLGFyZ3ZbMF0pOworICAgdmVzYWNvbl9sb2FkX2JhY2tncm91bmQoYXJndlswXSk7Cit9CisKKy8qKgorICogZG9fc2F5IC0gc2F5IG1lc3NhZ2UgdG8gdXNlcgorICoqLworc3RhdGljIHZvaWQgZG9fc2F5KGludCBhcmdjICwgY2hhciAqKmFyZ3YgLAorCQkgICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAodm9pZCkgaGFyZHdhcmU7CisgICBpZiAoYXJnYyA9PSAwKSByZXR1cm47CisKKyAgIGNoYXIgdGV4dF90b19zYXlbMjU1XT17MH07CisgICBpbnQgYXJnPTA7CisjaWYgREVCVUcKKyAgIGZvciAoaW50IGk9MDsgaTxhcmdjO2krKykgZHByaW50ZigiU0FZOiBhcmdbJWRdPXslc31cbiIsaSxhcmd2W2ldKTsKKyNlbmRpZgorICAgY2hhciAqYXJndW1lbnQgPSBzdHJjaHIoYXJndlthcmddLCdgJyk7CisgICBpZiAoIGFyZ3VtZW50ICE9IE5VTEwpIHsKKwlhcmd1bWVudCsrOworICAgCXN0cmNhdCh0ZXh0X3RvX3NheSwgYXJndW1lbnQpOworCisgICAJd2hpbGUgKChzdHJjaHIoYXJndW1lbnQsICdgJykgPT0gTlVMTCkgJiYgKGFyZysxPGFyZ2MpKSB7CisJCWFyZysrOworCQlhcmd1bWVudCA9IChjaGFyICopYXJndlthcmddOworCQlzdHJjYXQodGV4dF90b19zYXksICIgIik7CisJCXN0cmNhdCh0ZXh0X3RvX3NheSwgYXJndW1lbnQpOworICAgCX0KKyAgICAKKwkvKiBSZW1vdmluZyBsYXN0IGAgaWYgYW55ICovCisgICAgCWNoYXIgKmxhc3RfcXVvdGUgPSBzdHJyY2hyKHRleHRfdG9fc2F5LCdgJyk7CisgICAgCWlmICggbGFzdF9xdW90ZSAhPSBOVUxMICkgeworCSpsYXN0X3F1b3RlPSdcMCc7CisJZHByaW50ZigiU0FZIENNRCA9IFslc11cbiIsdGV4dF90b19zYXkpOwkgICAKKyAgICAJfQorCisgIAltb3JlX3ByaW50ZigiJXNcbiIsdGV4dF90b19zYXkpOworICB9Cit9CisKKy8qIERlZmF1bHQgaGR0IG1vZGUgKi8KK3N0cnVjdCBjbGlfY2FsbGJhY2tfZGVzY3IgbGlzdF9oZHRfZGVmYXVsdF9tb2R1bGVzW10gPSB7CisgICAgeworICAgICAubmFtZSA9IENMSV9DTEVBUiwKKyAgICAgLmV4ZWMgPSBjbGlfY2xlYXJfc2NyZWVuLAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gQ0xJX0VYSVQsCisgICAgIC5leGVjID0gZG9fZXhpdCwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9IRUxQLAorICAgICAuZXhlYyA9IHNob3dfY2xpX2hlbHAsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfTUVOVSwKKyAgICAgLmV4ZWMgPSBnb3RvX21lbnUsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfUkVCT09ULAorICAgICAuZXhlYyA9IGRvX3JlYm9vdCwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9ISVNUT1JZLAorICAgICAuZXhlYyA9IHByaW50X2hpc3RvcnksCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfRFVNUCwKKyAgICAgLmV4ZWMgPSBkb19kdW1wLAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gQ0xJX1NBWSwKKyAgICAgLmV4ZWMgPSBkb19zYXksCisgICAgIC5ub21vZHVsZSA9IHRydWUsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9ESVNQTEFZLAorICAgICAuZXhlYyA9IGRvX2Rpc3BsYXksCisgICAgIC5ub21vZHVsZSA9IHRydWUsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9TTEVFUCwKKyAgICAgLmV4ZWMgPSBkb19zbGVlcCwKKyAgICAgLm5vbW9kdWxlID0gdHJ1ZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gTlVMTCwKKyAgICAgLmV4ZWMgPSBOVUxMLAorICAgICAubm9tb2R1bGUgPSBmYWxzZX0sCit9OworCitzdHJ1Y3QgY2xpX2NhbGxiYWNrX2Rlc2NyIGxpc3RfaGR0X3Nob3dfbW9kdWxlc1tdID0geworICAgIHsKKyAgICAgLm5hbWUgPSBDTElfU1VNTUFSWSwKKyAgICAgLmV4ZWMgPSBtYWluX3Nob3dfc3VtbWFyeSwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9QQ0ksCisgICAgIC5leGVjID0gbWFpbl9zaG93X3BjaSwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9ETUksCisgICAgIC5leGVjID0gbWFpbl9zaG93X2RtaSwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9DUFUsCisgICAgIC5leGVjID0gbWFpbl9zaG93X2NwdSwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9ESVNLLAorICAgICAuZXhlYyA9IGRpc2tzX3N1bW1hcnksCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfUFhFLAorICAgICAuZXhlYyA9IG1haW5fc2hvd19weGUsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfU1lTTElOVVgsCisgICAgIC5leGVjID0gbWFpbl9zaG93X3N5c2xpbnV4LAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gQ0xJX0tFUk5FTCwKKyAgICAgLmV4ZWMgPSBtYWluX3Nob3dfa2VybmVsLAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gQ0xJX1ZFU0EsCisgICAgIC5leGVjID0gbWFpbl9zaG93X3Zlc2EsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfSERULAorICAgICAuZXhlYyA9IG1haW5fc2hvd19oZHQsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfVlBELAorICAgICAuZXhlYyA9IG1haW5fc2hvd192cGQsCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfTUVNT1JZLAorICAgICAuZXhlYyA9IHNob3dfZG1pX21lbW9yeV9tb2R1bGVzLAorICAgICAubm9tb2R1bGUgPSBmYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gQ0xJX0FDUEksCisgICAgIC5leGVjID0gbWFpbl9zaG93X2FjcGksCisgICAgIC5ub21vZHVsZSA9IGZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSAibW9kZXMiLAorICAgICAuZXhlYyA9IG1haW5fc2hvd19tb2RlcywKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IE5VTEwsCisgICAgIC5leGVjID0gTlVMTCwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCit9OworCitzdHJ1Y3QgY2xpX2NhbGxiYWNrX2Rlc2NyIGxpc3RfaGR0X3NldF9tb2R1bGVzW10gPSB7CisgICAgeworICAgICAubmFtZSA9IENMSV9NT0RFLAorICAgICAuZXhlYyA9IGNsaV9zZXRfbW9kZSwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IE5VTEwsCisgICAgIC5leGVjID0gTlVMTCwKKyAgICAgLm5vbW9kdWxlID0gZmFsc2UsCisgICAgIH0sCit9OworCitzdHJ1Y3QgY2xpX21vZHVsZV9kZXNjciBoZHRfZGVmYXVsdF9tb2R1bGVzID0geworICAgIC5tb2R1bGVzID0gbGlzdF9oZHRfZGVmYXVsdF9tb2R1bGVzLAorfTsKKworc3RydWN0IGNsaV9tb2R1bGVfZGVzY3IgaGR0X3Nob3dfbW9kdWxlcyA9IHsKKyAgICAubW9kdWxlcyA9IGxpc3RfaGR0X3Nob3dfbW9kdWxlcywKKyAgICAuZGVmYXVsdF9jYWxsYmFjayA9IG1haW5fc2hvd19zdW1tYXJ5LAorfTsKKworc3RydWN0IGNsaV9tb2R1bGVfZGVzY3IgaGR0X3NldF9tb2R1bGVzID0geworICAgIC5tb2R1bGVzID0gbGlzdF9oZHRfc2V0X21vZHVsZXMsCit9OworCitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgaGR0X21vZGUgPSB7CisgICAgLm1vZGUgPSBIRFRfTU9ERSwKKyAgICAubmFtZSA9IENMSV9IRFQsCisgICAgLmRlZmF1bHRfbW9kdWxlcyA9ICZoZHRfZGVmYXVsdF9tb2R1bGVzLAorICAgIC5zaG93X21vZHVsZXMgPSAmaGR0X3Nob3dfbW9kdWxlcywKKyAgICAuc2V0X21vZHVsZXMgPSAmaGR0X3NldF9tb2R1bGVzLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtY2xpLWtlcm5lbC5jIGIvY29tMzIvaGR0L2hkdC1jbGkta2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2MGJlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtY2xpLWtlcm5lbC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJoZHQtY2xpLmgiCisjaW5jbHVkZSAiaGR0LWNvbW1vbi5oIgorCit2b2lkIG1haW5fc2hvd19rZXJuZWwoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkgICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgY2hhciBidWZmZXJbMTAyNF0gPSB7MH07CisgICAgc3RydWN0IHBjaV9kZXZpY2UgKnBjaV9kZXZpY2U7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGNoYXIga2VybmVsX21vZHVsZXNbTElOVVhfS0VSTkVMX01PRFVMRV9TSVpFICoKKwkJCU1BWF9LRVJORUxfTU9EVUxFU19QRVJfUENJX0RFVklDRV07CisKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworICAgIG1vcmVfcHJpbnRmKCJLZXJuZWwgbW9kdWxlc1xuIik7CisKKy8vIG1vcmVfcHJpbnRmKCIgUENJIGRldmljZSBubzogJWQgXG4iLCBwLT5wY2lfZGV2aWNlX3Bvcyk7CisKKyAgICBpZiAoKGhhcmR3YXJlLT5tb2R1bGVzX3BjaW1hcF9yZXR1cm5fY29kZSA9PSAtRU5PTU9EVUxFU1BDSU1BUCkKKwkmJiAoaGFyZHdhcmUtPm1vZHVsZXNfYWxpYXNfcmV0dXJuX2NvZGUgPT0gLUVOT01PRFVMRVNBTElBUykpIHsKKwltb3JlX3ByaW50ZigiIG1vZHVsZXMucGNpbWFwIGFuZCBtb2R1bGVzLmFsaWFzIGZpbGVzIGFyZSBtaXNzaW5nXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogRm9yIGV2ZXJ5IGRldGVjdGVkIHBjaSBkZXZpY2UsIGNvbXB1dGUgaXRzIHN1Ym1lbnUgKi8KKyAgICBmb3JfZWFjaF9wY2lfZnVuYyhwY2lfZGV2aWNlLCBoYXJkd2FyZS0+cGNpX2RvbWFpbikgeworCW1lbXNldChrZXJuZWxfbW9kdWxlcywgMCwgc2l6ZW9mIGtlcm5lbF9tb2R1bGVzKTsKKworCWZvciAoaW50IGttb2QgPSAwOworCSAgICAga21vZCA8IHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50OyBrbW9kKyspIHsKKwkgICAgaWYgKGttb2QgPiAwKSB7CisJCXN0cm5jYXQoa2VybmVsX21vZHVsZXMsICIgfCAiLCAzKTsKKwkgICAgfQorCSAgICBzdHJuY2F0KGtlcm5lbF9tb2R1bGVzLAorCQkgICAgcGNpX2RldmljZS0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVba21vZF0sCisJCSAgICBMSU5VWF9LRVJORUxfTU9EVUxFX1NJWkUgLSAxKTsKKwl9CisKKwlpZiAoKHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50ID4gMCkKKwkgICAgJiYgKCFzdHJzdHIoYnVmZmVyLCBrZXJuZWxfbW9kdWxlcykpKSB7CisJICAgIGZvdW5kID0gdHJ1ZTsKKwkgICAgaWYgKHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50ID4gMSkKKwkJc3RybmNhdChidWZmZXIsICIoIiwgMSk7CisJICAgIHN0cm5jYXQoYnVmZmVyLCBrZXJuZWxfbW9kdWxlcywgc2l6ZW9mKGtlcm5lbF9tb2R1bGVzKSk7CisJICAgIGlmIChwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudCA+IDEpCisJCXN0cm5jYXQoYnVmZmVyLCAiKSIsIDEpOworCSAgICBzdHJuY2F0KGJ1ZmZlciwgIiAjICIsIDMpOworCX0KKworICAgIH0KKyAgICBpZiAoZm91bmQgPT0gdHJ1ZSkgeworCXN0cm5jYXQoYnVmZmVyLCAiXG4iLCAxKTsKKwltb3JlX3ByaW50ZigiJXMiLCBidWZmZXIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2hvd19rZXJuZWxfbW9kdWxlcyhpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkJc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2aWNlOworICAgIGNoYXIga2VybmVsX21vZHVsZXNbTElOVVhfS0VSTkVMX01PRFVMRV9TSVpFICoKKwkJCU1BWF9LRVJORUxfTU9EVUxFU19QRVJfUENJX0RFVklDRV07CisgICAgY2hhciBtb2R1bGVzW01BWF9QQ0lfQ0xBU1NFU11bMjU2XSA9IHt7MH19OworICAgIGNoYXIgY2F0ZWdvcnlfbmFtZVtNQVhfUENJX0NMQVNTRVNdWzI1Nl0gPSB7ezB9fTsKKworICAgIGlmIChoYXJkd2FyZS0+cGNpX2lkc19yZXR1cm5fY29kZSA9PSAtRU5PUENJSURTKSB7CisJbW9yZV9wcmludGYoIiBNaXNzaW5nIHBjaS5pZHMsIHdlIGNhbid0IGNvbXB1dGUgdGhlIGxpc3RcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaGFyZHdhcmUtPm1vZHVsZXNfcGNpbWFwX3JldHVybl9jb2RlID09IC1FTk9NT0RVTEVTUENJTUFQKSB7CisJbW9yZV9wcmludGYoIiBNaXNzaW5nIG1vZHVsZXMucGNpbWFwLCB3ZSBjYW4ndCBjb21wdXRlIHRoZSBsaXN0XG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICBmb3JfZWFjaF9wY2lfZnVuYyhwY2lfZGV2aWNlLCBoYXJkd2FyZS0+cGNpX2RvbWFpbikgeworCW1lbXNldChrZXJuZWxfbW9kdWxlcywgMCwgc2l6ZW9mIGtlcm5lbF9tb2R1bGVzKTsKKworCWZvciAoaW50IGttb2QgPSAwOworCSAgICAga21vZCA8IHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50OyBrbW9kKyspIHsKKwkgICAgc3RybmNhdChrZXJuZWxfbW9kdWxlcywKKwkJICAgIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlW2ttb2RdLAorCQkgICAgTElOVVhfS0VSTkVMX01PRFVMRV9TSVpFIC0gMSk7CisJICAgIHN0cm5jYXQoa2VybmVsX21vZHVsZXMsICIgIiwgMSk7CisJfQorCisJaWYgKChwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudCA+IDApCisJICAgICYmICghc3Ryc3RyKG1vZHVsZXNbcGNpX2RldmljZS0+Y2xhc3NbMl1dLCBrZXJuZWxfbW9kdWxlcykpKSB7CisJICAgIHN0cm5jYXQobW9kdWxlc1twY2lfZGV2aWNlLT5jbGFzc1syXV0sIGtlcm5lbF9tb2R1bGVzLAorCQkgICAgc2l6ZW9mKGtlcm5lbF9tb2R1bGVzKSk7CisJICAgIHNucHJpbnRmKGNhdGVnb3J5X25hbWVbcGNpX2RldmljZS0+Y2xhc3NbMl1dLAorCQkgICAgIHNpemVvZihjYXRlZ29yeV9uYW1lW3BjaV9kZXZpY2UtPmNsYXNzWzJdXSksCisJCSAgICAgIiVzIiwgcGNpX2RldmljZS0+ZGV2X2luZm8tPmNhdGVnb3J5X25hbWUpOworCX0KKyAgICB9CisgICAgLyogUHJpbnQgdGhlIGZvdW5kIGl0ZW1zICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUENJX0NMQVNTRVM7IGkrKykgeworCWlmIChzdHJsZW4oY2F0ZWdvcnlfbmFtZVtpXSkgPiAxKSB7CisJICAgIG1vcmVfcHJpbnRmKCIlcyA6ICVzXG4iLCBjYXRlZ29yeV9uYW1lW2ldLCBtb2R1bGVzW2ldKTsKKwl9CisgICAgfQorfQorCitzdHJ1Y3QgY2xpX21vZHVsZV9kZXNjciBrZXJuZWxfc2hvd19tb2R1bGVzID0geworICAgIC5tb2R1bGVzID0gTlVMTCwKKyAgICAuZGVmYXVsdF9jYWxsYmFjayA9IHNob3dfa2VybmVsX21vZHVsZXMsCit9OworCitzdHJ1Y3QgY2xpX21vZGVfZGVzY3Iga2VybmVsX21vZGUgPSB7CisgICAgLm1vZGUgPSBLRVJORUxfTU9ERSwKKyAgICAubmFtZSA9IENMSV9LRVJORUwsCisgICAgLmRlZmF1bHRfbW9kdWxlcyA9IE5VTEwsCisgICAgLnNob3dfbW9kdWxlcyA9ICZrZXJuZWxfc2hvd19tb2R1bGVzLAorICAgIC5zZXRfbW9kdWxlcyA9IE5VTEwsCit9OwpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1jbGktbWVtb3J5LmMgYi9jb20zMi9oZHQvaGR0LWNsaS1tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDViN2NkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1jbGktbWVtb3J5LmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPG1lbW9yeS5oPgorCisjaW5jbHVkZSAiaGR0LWNsaS5oIgorI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKworc3RhdGljIHZvaWQgc2hvd19tZW1vcnlfZTgyMChpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkgICAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSBfX3VudXNlZCkKK3sKKyAgICBzdHJ1Y3QgZTgyMGVudHJ5IG1hcFtFODIwTUFYXTsKKyAgICB1bnNpZ25lZCBsb25nIG1lbXNpemUgPSAwOworICAgIGludCBjb3VudCA9IDA7CisgICAgY2hhciB0eXBlWzE0XTsKKworICAgIGRldGVjdF9tZW1vcnlfZTgyMChtYXAsIEU4MjBNQVgsICZjb3VudCk7CisgICAgbWVtc2l6ZSA9IG1lbXNpemVfZTgyMChtYXAsIGNvdW50KTsKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworICAgIG1vcmVfcHJpbnRmKCJEZXRlY3RlZCBSQU0gICAgICAgICAgICAgICAgICAgICAgIDogJWx1IE1pQiAoJWx1IEtpQilcbiIsCisJCShtZW1zaXplICsgKDEgPDwgOSkpID4+IDEwLCBtZW1zaXplKTsKKyAgICBtb3JlX3ByaW50ZigiQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gZTgyMCBtYXA6XG4iKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwlnZXRfdHlwZShtYXBbaV0udHlwZSwgdHlwZSwgMTQpOworCW1vcmVfcHJpbnRmKCIlMDE2bGx4IC0gJTAxNmxseCAlMDE2bGx4ICglcylcbiIsCisJCSAgICBtYXBbaV0uYWRkciwgbWFwW2ldLnNpemUsIG1hcFtpXS5hZGRyICsgbWFwW2ldLnNpemUsCisJCSAgICByZW1vdmVfc3BhY2VzKHR5cGUpKTsKKyAgICB9CisgICAgc3RydWN0IGU4MjBlbnRyeSBubVtFODIwTUFYXTsKKworICAgIC8qIENsZWFuIHVwLCBhZGp1c3QgYW5kIGNvcHkgdGhlIEJJT1Mtc3VwcGxpZWQgRTgyMC1tYXAuICovCisgICAgaW50IG5yID0gc2FuaXRpemVfZTgyMF9tYXAobWFwLCBubSwgY291bnQpOworCisgICAgbW9yZV9wcmludGYoIlxuIik7CisgICAgbW9yZV9wcmludGYoIlNhbml0aXplZCBlODIwIG1hcDpcbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnI7IGkrKykgeworCWdldF90eXBlKG5tW2ldLnR5cGUsIHR5cGUsIDE0KTsKKwltb3JlX3ByaW50ZigiJTAxNmxseCAtICUwMTZsbHggJTAxNmxseCAoJXMpXG4iLAorCQkgICAgbm1baV0uYWRkciwgbm1baV0uc2l6ZSwgbm1baV0uYWRkciArIG5tW2ldLnNpemUsCisJCSAgICByZW1vdmVfc3BhY2VzKHR5cGUpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbWVtb3J5X2U4MDEoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUgX191bnVzZWQpCit7CisgICAgaW50IG1lbV9sb3csIG1lbV9oaWdoID0gMDsKKworICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgaWYgKGRldGVjdF9tZW1vcnlfZTgwMSgmbWVtX2xvdywgJm1lbV9oaWdoKSkgeworCW1vcmVfcHJpbnRmKCJlODAxIGJvZ3VzIVxuIik7CisgICAgfSBlbHNlIHsKKwltb3JlX3ByaW50ZigiRGV0ZWN0ZWQgUkFNIDogJWQgTWlCKCVkIEtpQilcbiIsCisJCSAgICAobWVtX2xvdyA+PiAxMCkgKyAobWVtX2hpZ2ggPj4gNCksCisJCSAgICBtZW1fbG93ICsgKG1lbV9oaWdoIDw8IDYpKTsKKwltb3JlX3ByaW50ZigiZTgwMSBkZXRhaWxzIDogJWQgS2IgKCVkIE1pQikgLSAlZCBLYiAoJWQgTWlCKVxuIiwgbWVtX2xvdywKKwkJICAgIG1lbV9sb3cgPj4gMTAsIG1lbV9oaWdoIDw8IDYsIG1lbV9oaWdoID4+IDQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2hvd19tZW1vcnlfODgoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlIF9fdW51c2VkKQoreworICAgIGludCBtZW1fc2l6ZSA9IDA7CisKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworICAgIGlmIChkZXRlY3RfbWVtb3J5Xzg4KCZtZW1fc2l6ZSkpIHsKKwltb3JlX3ByaW50ZigiODgwMGggYm9ndXMhXG4iKTsKKyAgICB9IGVsc2UgeworCW1vcmVfcHJpbnRmKCI4ODAwaCBtZW1vcnkgc2l6ZTogJWQgS2IgKCVkIE1pQilcbiIsIG1lbV9zaXplLAorCQkgICAgbWVtX3NpemUgPj4gMTApOworICAgIH0KK30KKworc3RydWN0IGNsaV9jYWxsYmFja19kZXNjciBsaXN0X21lbW9yeV9zaG93X21vZHVsZXNbXSA9IHsKKyAgICB7CisgICAgIC5uYW1lID0gImU4MjAiLAorICAgICAuZXhlYyA9IHNob3dfbWVtb3J5X2U4MjAsCisgICAgIC5ub21vZHVsZT1mYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gImU4MDEiLAorICAgICAuZXhlYyA9IHNob3dfbWVtb3J5X2U4MDEsCisgICAgIC5ub21vZHVsZT1mYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gIjg4IiwKKyAgICAgLmV4ZWMgPSBzaG93X21lbW9yeV84OCwKKyAgICAgLm5vbW9kdWxlPWZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBDTElfRE1JX01FTU9SWV9CQU5LLAorICAgICAuZXhlYyA9IHNob3dfZG1pX21lbW9yeV9iYW5rLAorICAgICAubm9tb2R1bGU9ZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IE5VTEwsCisgICAgIC5leGVjID0gTlVMTCwKKyAgICAgLm5vbW9kdWxlPWZhbHNlLAorICAgICB9LAorfTsKKworc3RydWN0IGNsaV9tb2R1bGVfZGVzY3IgbWVtb3J5X3Nob3dfbW9kdWxlcyA9IHsKKyAgICAubW9kdWxlcyA9IGxpc3RfbWVtb3J5X3Nob3dfbW9kdWxlcywKKyAgICAuZGVmYXVsdF9jYWxsYmFjayA9IHNob3dfZG1pX21lbW9yeV9tb2R1bGVzLAorfTsKKworc3RydWN0IGNsaV9tb2RlX2Rlc2NyIG1lbW9yeV9tb2RlID0geworICAgIC5tb2RlID0gTUVNT1JZX01PREUsCisgICAgLm5hbWUgPSBDTElfTUVNT1JZLAorICAgIC5kZWZhdWx0X21vZHVsZXMgPSBOVUxMLAorICAgIC5zaG93X21vZHVsZXMgPSAmbWVtb3J5X3Nob3dfbW9kdWxlcywKKyAgICAuc2V0X21vZHVsZXMgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtY2xpLXBjaS5jIGIvY29tMzIvaGR0L2hkdC1jbGktcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmYzAwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtY2xpLXBjaS5jCkBAIC0wLDAgKzEsMjk0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiaGR0LWNsaS5oIgorI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKwordm9pZCBtYWluX3Nob3dfcGNpKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgbW9yZV9wcmludGYoIlBDSVxuIik7CisgICAgbW9yZV9wcmludGYoIiBOQiBEZXZpY2VzICAgOiAlZFxuIiwgaGFyZHdhcmUtPm5iX3BjaV9kZXZpY2VzKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19wY2lfZGV2aWNlKGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGludCBpID0gMDsKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpX2RldmljZSA9IE5VTEwsICp0ZW1wX3BjaV9kZXZpY2U7CisgICAgaW50IHBjaWRldiA9IC0xOworICAgIGJvb2wgbm9wY2lpZHMgPSBmYWxzZTsKKyAgICBib29sIG5vbW9kdWxlc3BjaW1hcCA9IGZhbHNlOworICAgIGJvb2wgbm9tb2R1bGVzYWxpYXMgPSBmYWxzZTsKKyAgICBib29sIG5vbW9kdWxlc2ZpbGVzID0gZmFsc2U7CisgICAgY2hhciBrZXJuZWxfbW9kdWxlc1tMSU5VWF9LRVJORUxfTU9EVUxFX1NJWkUgKgorCQkJTUFYX0tFUk5FTF9NT0RVTEVTX1BFUl9QQ0lfREVWSUNFXTsKKyAgICBpbnQgYnVzID0gMCwgc2xvdCA9IDAsIGZ1bmMgPSAwOworCisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKKyAgICAvKiBTYW5pdGl6ZSBhcmd1bWVudHMgKi8KKyAgICBpZiAoYXJnYyA8PSAwKSB7CisJbW9yZV9wcmludGYoInNob3cgZGV2aWNlIDxudW1iZXI+XG4iKTsKKwlyZXR1cm47CisgICAgfSBlbHNlCisJcGNpZGV2ID0gc3RydG9sKGFyZ3ZbMF0sIChjaGFyICoqKU5VTEwsIDEwKTsKKworICAgIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKwltb3JlX3ByaW50ZigiVGhpcyBQQ0kgZGV2aWNlIG51bWJlciBpcyBpbmNvcnJlY3RcbiIpOworCXJldHVybjsKKyAgICB9CisgICAgaWYgKChwY2lkZXYgPiBoYXJkd2FyZS0+bmJfcGNpX2RldmljZXMpIHx8IChwY2lkZXYgPD0gMCkpIHsKKwltb3JlX3ByaW50ZigiUENJIGRldmljZSAlZCBkb2Vzbid0IGV4aXN0XG4iLCBwY2lkZXYpOworCXJldHVybjsKKyAgICB9CisgICAgaWYgKGhhcmR3YXJlLT5wY2lfaWRzX3JldHVybl9jb2RlID09IC1FTk9QQ0lJRFMpIHsKKwlub3BjaWlkcyA9IHRydWU7CisgICAgfQorICAgIGlmIChoYXJkd2FyZS0+bW9kdWxlc19wY2ltYXBfcmV0dXJuX2NvZGUgPT0gLUVOT01PRFVMRVNQQ0lNQVApIHsKKwlub21vZHVsZXNwY2ltYXAgPSB0cnVlOworICAgIH0KKyAgICBpZiAoaGFyZHdhcmUtPm1vZHVsZXNfYWxpYXNfcmV0dXJuX2NvZGUgPT0gLUVOT01PRFVMRVNBTElBUykgeworCW5vbW9kdWxlc2FsaWFzID0gdHJ1ZTsKKyAgICB9CisgICAgbm9tb2R1bGVzZmlsZXMgPSBub21vZHVsZXNwY2ltYXAgJiYgbm9tb2R1bGVzYWxpYXM7CisgICAgZm9yX2VhY2hfcGNpX2Z1bmModGVtcF9wY2lfZGV2aWNlLCBoYXJkd2FyZS0+cGNpX2RvbWFpbikgeworCWkrKzsKKwlpZiAoaSA9PSBwY2lkZXYpIHsKKwkgICAgYnVzID0gX19wY2lfYnVzOworCSAgICBzbG90ID0gX19wY2lfc2xvdDsKKwkgICAgZnVuYyA9IF9fcGNpX2Z1bmM7CisJICAgIHBjaV9kZXZpY2UgPSB0ZW1wX3BjaV9kZXZpY2U7CisJfQorICAgIH0KKworICAgIGlmIChwY2lfZGV2aWNlID09IE5VTEwpIHsKKwltb3JlX3ByaW50ZigiV2Ugd2VyZSBlbmFibGVkIHRvIGZpbmQgUENJIGRldmljZSAlZFxuIiwgcGNpZGV2KTsKKwlyZXR1cm47CisgICAgfQorCisgICAgbWVtc2V0KGtlcm5lbF9tb2R1bGVzLCAwLCBzaXplb2Yga2VybmVsX21vZHVsZXMpOworICAgIGZvciAoaW50IGttb2QgPSAwOworCSBrbW9kIDwgcGNpX2RldmljZS0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVfY291bnQ7IGttb2QrKykgeworCWlmIChrbW9kID4gMCkgeworCSAgICBzdHJuY2F0KGtlcm5lbF9tb2R1bGVzLCAiIHwgIiwgMyk7CisJfQorCXN0cm5jYXQoa2VybmVsX21vZHVsZXMsCisJCXBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlW2ttb2RdLAorCQlMSU5VWF9LRVJORUxfTU9EVUxFX1NJWkUgLSAxKTsKKyAgICB9CisgICAgaWYgKHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50ID09IDApCisJc3RybGNweShrZXJuZWxfbW9kdWxlcywgInVua25vd24iLCA3KTsKKworICAgIG1vcmVfcHJpbnRmKCJQQ0kgRGV2aWNlICVkXG4iLCBwY2lkZXYpOworCisgICAgaWYgKG5vcGNpaWRzID09IGZhbHNlKSB7CisJbW9yZV9wcmludGYoIlZlbmRvciBOYW1lICAgOiAlc1xuIiwgcGNpX2RldmljZS0+ZGV2X2luZm8tPnZlbmRvcl9uYW1lKTsKKwltb3JlX3ByaW50ZigiUHJvZHVjdCBOYW1lICA6ICVzXG4iLCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+cHJvZHVjdF9uYW1lKTsKKwltb3JlX3ByaW50ZigiQ2xhc3MgTmFtZSAgICA6ICVzXG4iLCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+Y2xhc3NfbmFtZSk7CisgICAgfQorCisgICAgaWYgKG5vbW9kdWxlc2ZpbGVzID09IGZhbHNlKSB7CisJbW9yZV9wcmludGYoIktlcm5lbCBtb2R1bGUgOiAlc1xuIiwga2VybmVsX21vZHVsZXMpOworICAgIH0KKworICAgIG1vcmVfcHJpbnRmKCJWZW5kb3IgSUQgICAgIDogJTA0eFxuIiwgcGNpX2RldmljZS0+dmVuZG9yKTsKKyAgICBtb3JlX3ByaW50ZigiUHJvZHVjdCBJRCAgICA6ICUwNHhcbiIsIHBjaV9kZXZpY2UtPnByb2R1Y3QpOworICAgIG1vcmVfcHJpbnRmKCJTdWJWZW5kb3IgSUQgIDogJTA0eFxuIiwgcGNpX2RldmljZS0+c3ViX3ZlbmRvcik7CisgICAgbW9yZV9wcmludGYoIlN1YlByb2R1Y3QgSUQgOiAlMDR4XG4iLCBwY2lfZGV2aWNlLT5zdWJfcHJvZHVjdCk7CisgICAgbW9yZV9wcmludGYoIkNsYXNzIElEICAgICAgOiAlMDJ4LiUwMnguJTAyeFxuIiwgcGNpX2RldmljZS0+Y2xhc3NbMl0sCisJCXBjaV9kZXZpY2UtPmNsYXNzWzFdLCBwY2lfZGV2aWNlLT5jbGFzc1swXSk7CisgICAgbW9yZV9wcmludGYoIlJldmlzaW9uICAgICAgOiAlMDJ4XG4iLCBwY2lfZGV2aWNlLT5yZXZpc2lvbik7CisgICAgaWYgKChwY2lfZGV2aWNlLT5kZXZfaW5mby0+aXJxID4gMCkKKwkmJiAocGNpX2RldmljZS0+ZGV2X2luZm8tPmlycSA8IDI1NSkpCisJbW9yZV9wcmludGYoIklSUSAgICAgICAgICAgOiAlMGRcbiIsIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5pcnEpOworICAgIG1vcmVfcHJpbnRmKCJMYXRlbmN5ICAgICAgIDogJTBkXG4iLCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGF0ZW5jeSk7CisgICAgbW9yZV9wcmludGYoIlBDSSBCdXMgICAgICAgOiAlMDJkXG4iLCBidXMpOworICAgIG1vcmVfcHJpbnRmKCJQQ0kgU2xvdCAgICAgIDogJTAyZFxuIiwgc2xvdCk7CisgICAgbW9yZV9wcmludGYoIlBDSSBGdW5jICAgICAgOiAlMDJkXG4iLCBmdW5jKTsKKworICAgIGlmIChoYXJkd2FyZS0+aXNfcHhlX3ZhbGlkID09IHRydWUpIHsKKwlpZiAoKGhhcmR3YXJlLT5weGUucGNpX2RldmljZSAhPSBOVUxMKQorCSAgICAmJiAoaGFyZHdhcmUtPnB4ZS5wY2lfZGV2aWNlID09IHBjaV9kZXZpY2UpKSB7CisJICAgIG1vcmVfcHJpbnRmKCJNYWMgQWRkcmVzcyAgIDogJXNcbiIsIGhhcmR3YXJlLT5weGUubWFjX2FkZHIpOworCSAgICBtb3JlX3ByaW50ZigiUFhFICAgICAgICAgICA6IEN1cnJlbnQgYm9vdCBkZXZpY2VcbiIpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcGNpX2RldmljZXMoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgaW50IGkgPSAxOworICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2aWNlOworICAgIGNoYXIga2VybmVsX21vZHVsZXNbTElOVVhfS0VSTkVMX01PRFVMRV9TSVpFICoKKwkJCU1BWF9LRVJORUxfTU9EVUxFU19QRVJfUENJX0RFVklDRV07CisgICAgYm9vbCBub3BjaWlkcyA9IGZhbHNlOworICAgIGJvb2wgbm9tb2R1bGVzcGNpbWFwID0gZmFsc2U7CisgICAgYm9vbCBub21vZHVsZXNhbGlhcyA9IGZhbHNlOworICAgIGJvb2wgbm9tb2R1bGVzZmlsZSA9IGZhbHNlOworICAgIGNoYXIgZmlyc3RfbGluZVs4MV07CisgICAgY2hhciBzZWNvbmRfbGluZVs4MV07CisKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworICAgIG1vcmVfcHJpbnRmKCIlZCBQQ0kgZGV2aWNlcyBkZXRlY3RlZFxuIiwgaGFyZHdhcmUtPm5iX3BjaV9kZXZpY2VzKTsKKworICAgIGlmIChoYXJkd2FyZS0+cGNpX2lkc19yZXR1cm5fY29kZSA9PSAtRU5PUENJSURTKSB7CisJbm9wY2lpZHMgPSB0cnVlOworICAgIH0KKyAgICBpZiAoaGFyZHdhcmUtPm1vZHVsZXNfcGNpbWFwX3JldHVybl9jb2RlID09IC1FTk9NT0RVTEVTUENJTUFQKSB7CisJbm9tb2R1bGVzcGNpbWFwID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGhhcmR3YXJlLT5tb2R1bGVzX3BjaW1hcF9yZXR1cm5fY29kZSA9PSAtRU5PTU9EVUxFU0FMSUFTKSB7CisJbm9tb2R1bGVzYWxpYXMgPSB0cnVlOworICAgIH0KKworICAgIG5vbW9kdWxlc2ZpbGUgPSBub21vZHVsZXNwY2ltYXAgJiYgbm9tb2R1bGVzYWxpYXM7CisKKyAgICAvKiBGb3IgZXZlcnkgZGV0ZWN0ZWQgcGNpIGRldmljZSwgY29tcHV0ZSBpdHMgc3VibWVudSAqLworICAgIGZvcl9lYWNoX3BjaV9mdW5jKHBjaV9kZXZpY2UsIGhhcmR3YXJlLT5wY2lfZG9tYWluKSB7CisJbWVtc2V0KGtlcm5lbF9tb2R1bGVzLCAwLCBzaXplb2Yga2VybmVsX21vZHVsZXMpOworCWZvciAoaW50IGttb2QgPSAwOworCSAgICAga21vZCA8IHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50OyBrbW9kKyspIHsKKwkgICAgaWYgKGttb2QgPiAwKSB7CisJCXN0cm5jYXQoa2VybmVsX21vZHVsZXMsICIgfCAiLCAzKTsKKwkgICAgfQorCSAgICBzdHJuY2F0KGtlcm5lbF9tb2R1bGVzLAorCQkgICAgcGNpX2RldmljZS0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVba21vZF0sCisJCSAgICBMSU5VWF9LRVJORUxfTU9EVUxFX1NJWkUgLSAxKTsKKwl9CisJaWYgKHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50ID09IDApCisJICAgIHN0cmxjcHkoa2VybmVsX21vZHVsZXMsICJ1bmtub3duIiwgNyk7CisKKwlpZiAobm9wY2lpZHMgPT0gZmFsc2UpIHsKKwkgICAgc25wcmludGYoZmlyc3RfbGluZSwgc2l6ZW9mKGZpcnN0X2xpbmUpLAorCQkgICAgICIlMDJkOiAlcyAlcyBcbiIsIGksCisJCSAgICAgcGNpX2RldmljZS0+ZGV2X2luZm8tPnZlbmRvcl9uYW1lLAorCQkgICAgIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5wcm9kdWN0X25hbWUpOworCSAgICBpZiAobm9tb2R1bGVzZmlsZSA9PSBmYWxzZSkKKwkJc25wcmludGYoc2Vjb25kX2xpbmUsIHNpemVvZihzZWNvbmRfbGluZSksCisJCQkgIiAgICAjICUtMjVzICMgS21vZDogJXNcbiIsCisJCQkgcGNpX2RldmljZS0+ZGV2X2luZm8tPmNsYXNzX25hbWUsIGtlcm5lbF9tb2R1bGVzKTsKKwkgICAgZWxzZQorCQlzbnByaW50ZihzZWNvbmRfbGluZSwgc2l6ZW9mKHNlY29uZF9saW5lKSwKKwkJCSAiICAgICMgJS0yNXMgIyBJRDolMDR4OiUwNHhbJTA0eDolMDR4XVxuIiwKKwkJCSBwY2lfZGV2aWNlLT5kZXZfaW5mby0+Y2xhc3NfbmFtZSwKKwkJCSBwY2lfZGV2aWNlLT52ZW5kb3IsCisJCQkgcGNpX2RldmljZS0+cHJvZHVjdCwKKwkJCSBwY2lfZGV2aWNlLT5zdWJfdmVuZG9yLCBwY2lfZGV2aWNlLT5zdWJfcHJvZHVjdCk7CisKKwkgICAgbW9yZV9wcmludGYoIiVzIiwgZmlyc3RfbGluZSk7CisJICAgIG1vcmVfcHJpbnRmKCIlcyIsIHNlY29uZF9saW5lKTsKKwkgICAgbW9yZV9wcmludGYoIlxuIik7CisJfSBlbHNlIGlmIChub3BjaWlkcyA9PSB0cnVlKSB7CisJICAgIGlmIChub21vZHVsZXNmaWxlID09IHRydWUpIHsKKwkJbW9yZV9wcmludGYoIiUwMmQ6ICUwNHg6JTA0eCBbJTA0eDolMDR4XSBcbiIsCisJCQkgICAgaSwgcGNpX2RldmljZS0+dmVuZG9yLAorCQkJICAgIHBjaV9kZXZpY2UtPnByb2R1Y3QsCisJCQkgICAgcGNpX2RldmljZS0+c3ViX3ZlbmRvciwgcGNpX2RldmljZS0+c3ViX3Byb2R1Y3QpOworCSAgICB9IGVsc2UgeworCQltb3JlX3ByaW50ZgorCQkgICAgKCIlMDJkOiAlMDR4OiUwNHggWyUwNHg6JTA0eF0gS21vZDolc1xuIiwgaSwKKwkJICAgICBwY2lfZGV2aWNlLT52ZW5kb3IsIHBjaV9kZXZpY2UtPnByb2R1Y3QsCisJCSAgICAgcGNpX2RldmljZS0+c3ViX3ZlbmRvciwKKwkJICAgICBwY2lfZGV2aWNlLT5zdWJfcHJvZHVjdCwga2VybmVsX21vZHVsZXMpOworCSAgICB9CisJfQorCWkrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcGNpX2lycShpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCQkgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2aWNlOworICAgIGJvb2wgbm9wY2lpZHMgPSBmYWxzZTsKKworICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgbW9yZV9wcmludGYoIiVkIFBDSSBkZXZpY2VzIGRldGVjdGVkXG4iLCBoYXJkd2FyZS0+bmJfcGNpX2RldmljZXMpOworICAgIG1vcmVfcHJpbnRmKCJJUlEgOiBwcm9kdWN0XG4iKTsKKyAgICBtb3JlX3ByaW50ZigiLS0tLS0tLS0tLS0tLVxuIik7CisKKyAgICBpZiAoaGFyZHdhcmUtPnBjaV9pZHNfcmV0dXJuX2NvZGUgPT0gLUVOT1BDSUlEUykgeworCW5vcGNpaWRzID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBGb3IgZXZlcnkgZGV0ZWN0ZWQgcGNpIGRldmljZSwgY29tcHV0ZSBpdHMgc3VibWVudSAqLworICAgIGZvcl9lYWNoX3BjaV9mdW5jKHBjaV9kZXZpY2UsIGhhcmR3YXJlLT5wY2lfZG9tYWluKSB7CisJLyogT25seSBkaXNwbGF5IHZhbGlkIElSUXMgKi8KKwlpZiAoKHBjaV9kZXZpY2UtPmRldl9pbmZvLT5pcnEgPiAwKQorCSAgICAmJiAocGNpX2RldmljZS0+ZGV2X2luZm8tPmlycSA8IDI1NSkpIHsKKwkgICAgaWYgKG5vcGNpaWRzID09IGZhbHNlKSB7CisJCW1vcmVfcHJpbnRmKCIlMDJkICA6ICVzICVzIFxuIiwKKwkJCSAgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+aXJxLAorCQkJICAgIHBjaV9kZXZpY2UtPmRldl9pbmZvLT52ZW5kb3JfbmFtZSwKKwkJCSAgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+cHJvZHVjdF9uYW1lKTsKKwkgICAgfSBlbHNlIHsKKwkJbW9yZV9wcmludGYoIiUwMmQgIDogJTA0eDolMDR4IFslMDR4OiUwNHhdIFxuIiwKKwkJCSAgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+aXJxLAorCQkJICAgIHBjaV9kZXZpY2UtPnZlbmRvciwKKwkJCSAgICBwY2lfZGV2aWNlLT5wcm9kdWN0LAorCQkJICAgIHBjaV9kZXZpY2UtPnN1Yl92ZW5kb3IsIHBjaV9kZXZpY2UtPnN1Yl9wcm9kdWN0KTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0cnVjdCBjbGlfY2FsbGJhY2tfZGVzY3IgbGlzdF9wY2lfc2hvd19tb2R1bGVzW10gPSB7CisgICAgeworICAgICAubmFtZSA9IENMSV9JUlEsCisgICAgIC5leGVjID0gc2hvd19wY2lfaXJxLAorICAgICAubm9tb2R1bGU9ZmFsc2UsCisgICAgIH0sCisgICAgeworICAgICAubmFtZSA9IENMSV9QQ0lfREVWSUNFLAorICAgICAuZXhlYyA9IHNob3dfcGNpX2RldmljZSwKKyAgICAgLm5vbW9kdWxlPWZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBOVUxMLAorICAgICAuZXhlYyA9IE5VTEwsCisgICAgIC5ub21vZHVsZT1mYWxzZSwKKyAgICAgfSwKK307CisKK3N0cnVjdCBjbGlfbW9kdWxlX2Rlc2NyIHBjaV9zaG93X21vZHVsZXMgPSB7CisgICAgLm1vZHVsZXMgPSBsaXN0X3BjaV9zaG93X21vZHVsZXMsCisgICAgLmRlZmF1bHRfY2FsbGJhY2sgPSBzaG93X3BjaV9kZXZpY2VzLAorfTsKKworc3RydWN0IGNsaV9tb2RlX2Rlc2NyIHBjaV9tb2RlID0geworICAgIC5tb2RlID0gUENJX01PREUsCisgICAgLm5hbWUgPSBDTElfUENJLAorICAgIC5kZWZhdWx0X21vZHVsZXMgPSBOVUxMLAorICAgIC5zaG93X21vZHVsZXMgPSAmcGNpX3Nob3dfbW9kdWxlcywKKyAgICAuc2V0X21vZHVsZXMgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtY2xpLXB4ZS5jIGIvY29tMzIvaGR0L2hkdC1jbGktcHhlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwNmI5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtY2xpLXB4ZS5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9weGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxzeXMvZ3B4ZS5oPgorCisjaW5jbHVkZSAiaGR0LWNsaS5oIgorI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKwordm9pZCBtYWluX3Nob3dfcHhlKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGNoYXIgYnVmZmVyWzgxXTsKKyAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoODEpKTsKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworICAgIGlmIChoYXJkd2FyZS0+c3YtPmZpbGVzeXN0ZW0gIT0gU1lTTElOVVhfRlNfUFhFTElOVVgpIHsKKwltb3JlX3ByaW50ZigiWW91IGFyZSBub3QgY3VycmVudGx5IHVzaW5nIFBYRUxJTlVYXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgbW9yZV9wcmludGYoIlBYRVxuIik7CisgICAgaWYgKGhhcmR3YXJlLT5pc19weGVfdmFsaWQgPT0gZmFsc2UpIHsKKwltb3JlX3ByaW50ZigiIE5vIHZhbGlkIFBYRSBST00gZm91bmRcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc19weGUgKnAgPSAmaGFyZHdhcmUtPnB4ZTsKKyAgICBtb3JlX3ByaW50ZigiIFBDSSBkZXZpY2Ugbm86ICVkIFxuIiwgcC0+cGNpX2RldmljZV9wb3MpOworCisgICAgaWYgKGhhcmR3YXJlLT5wY2lfaWRzX3JldHVybl9jb2RlID09IC1FTk9QQ0lJRFMgfHwgKHAtPnBjaV9kZXZpY2UgPT0gTlVMTCkpIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorCQkgIiBQQ0kgSUQgICAgICAgOiAlMDR4OiUwNHhbJTA0eDolMDRYXSByZXYoJTAyeClcbiIsCisJCSBwLT52ZW5kb3JfaWQsIHAtPnByb2R1Y3RfaWQsIHAtPnN1YnZlbmRvcl9pZCwKKwkJIHAtPnN1YnByb2R1Y3RfaWQsIHAtPnJldik7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKwkJICIgUENJIEJ1cyBwb3MuIDogJTAyeDolMDJ4LiUwMnhcbiIsIHAtPnBjaV9idXMsCisJCSBwLT5wY2lfZGV2LCBwLT5wY2lfZnVuYyk7CisJbW9yZV9wcmludGYoIiVzIiwgYnVmZmVyKTsKKyAgICB9IGVsc2UgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIgTWFudWZhY3R1cmVyIDogJXMgXG4iLAorCQkgcC0+cGNpX2RldmljZS0+ZGV2X2luZm8tPnZlbmRvcl9uYW1lKTsKKwltb3JlX3ByaW50ZigiJXMiLCBidWZmZXIpOworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIgUHJvZHVjdCAgICAgIDogJXMgXG4iLAorCQkgcC0+cGNpX2RldmljZS0+ZGV2X2luZm8tPnByb2R1Y3RfbmFtZSk7CisJbW9yZV9wcmludGYoIiVzIiwgYnVmZmVyKTsKKyAgICB9CisgICAgbW9yZV9wcmludGYoIiBBZGRyZXNzZXMgICAgOiAlZC4lZC4lZC4lZCBAICVzXG4iLCBwLT5pcF9hZGRyWzBdLAorCQlwLT5pcF9hZGRyWzFdLCBwLT5pcF9hZGRyWzJdLCBwLT5pcF9hZGRyWzNdLCBwLT5tYWNfYWRkcik7CisKKyAgICBpZiAoaXNfZ3B4ZSgpKQorCW1vcmVfcHJpbnRmKCIgZ1BYRSBEZXRlY3RlZDogWWVzXG4iKQorICAgIGVsc2UKKwltb3JlX3ByaW50ZigiIGdQWEUgRGV0ZWN0ZWQ6IE5vXG4iKTsKK30KKworc3RydWN0IGNsaV9tb2R1bGVfZGVzY3IgcHhlX3Nob3dfbW9kdWxlcyA9IHsKKyAgICAubW9kdWxlcyA9IE5VTEwsCisgICAgLmRlZmF1bHRfY2FsbGJhY2sgPSBtYWluX3Nob3dfcHhlLAorfTsKKworc3RydWN0IGNsaV9tb2RlX2Rlc2NyIHB4ZV9tb2RlID0geworICAgIC5tb2RlID0gUFhFX01PREUsCisgICAgLm5hbWUgPSBDTElfUFhFLAorICAgIC5kZWZhdWx0X21vZHVsZXMgPSBOVUxMLAorICAgIC5zaG93X21vZHVsZXMgPSAmcHhlX3Nob3dfbW9kdWxlcywKKyAgICAuc2V0X21vZHVsZXMgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtY2xpLXN5c2xpbnV4LmMgYi9jb20zMi9oZHQvaGR0LWNsaS1zeXNsaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMmNhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWNsaS1zeXNsaW51eC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9weGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgImhkdC1jbGkuaCIKKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisKK3ZvaWQgbWFpbl9zaG93X3N5c2xpbnV4KGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJCXN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworICAgIG1vcmVfcHJpbnRmKCJTWVNMSU5VWFxuIik7CisgICAgbW9yZV9wcmludGYoIiBCb290bG9hZGVyIDogJXNcbiIsIGhhcmR3YXJlLT5zeXNsaW51eF9mcyk7CisgICAgbW9yZV9wcmludGYoIiBWZXJzaW9uICAgIDogJXNcbiIsIGhhcmR3YXJlLT5zdi0+dmVyc2lvbl9zdHJpbmcpOworICAgIG1vcmVfcHJpbnRmKCIgVmVyc2lvbiAgICA6ICV1XG4iLCBoYXJkd2FyZS0+c3YtPnZlcnNpb24pOworICAgIG1vcmVfcHJpbnRmKCIgTWF4IEFQSSAgICA6ICV1XG4iLCBoYXJkd2FyZS0+c3YtPm1heF9hcGkpOworICAgIG1vcmVfcHJpbnRmKCIgQ29weXJpZ2h0ICA6ICVzXG4iLCBoYXJkd2FyZS0+c3YtPmNvcHlyaWdodF9zdHJpbmcpOworfQorCitzdHJ1Y3QgY2xpX21vZHVsZV9kZXNjciBzeXNsaW51eF9zaG93X21vZHVsZXMgPSB7CisgICAgLm1vZHVsZXMgPSBOVUxMLAorICAgIC5kZWZhdWx0X2NhbGxiYWNrID0gbWFpbl9zaG93X3N5c2xpbnV4LAorfTsKKworc3RydWN0IGNsaV9tb2RlX2Rlc2NyIHN5c2xpbnV4X21vZGUgPSB7CisgICAgLm1vZGUgPSBTWVNMSU5VWF9NT0RFLAorICAgIC5uYW1lID0gQ0xJX1NZU0xJTlVYLAorICAgIC5kZWZhdWx0X21vZHVsZXMgPSBOVUxMLAorICAgIC5zaG93X21vZHVsZXMgPSAmc3lzbGludXhfc2hvd19tb2R1bGVzLAorICAgIC5zZXRfbW9kdWxlcyA9IE5VTEwsCit9OwpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1jbGktdmVzYS5jIGIvY29tMzIvaGR0L2hkdC1jbGktdmVzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDQ5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWNsaS12ZXNhLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAiaGR0LWNsaS5oIgorI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK3ZvaWQgbWFpbl9zaG93X3Zlc2EoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgaWYgKGhhcmR3YXJlLT5pc192ZXNhX3ZhbGlkID09IGZhbHNlKSB7CisJbW9yZV9wcmludGYoIk5vIFZFU0EgQklPUyBkZXRlY3RlZFxuIik7CisJcmV0dXJuOworICAgIH0KKyAgICBtb3JlX3ByaW50ZigiVkVTQVxuIik7CisgICAgbW9yZV9wcmludGYoIiBWZXNhIHZlcnNpb24gOiAlZC4lZFxuIiwgaGFyZHdhcmUtPnZlc2EubWFqb3JfdmVyc2lvbiwKKwkJaGFyZHdhcmUtPnZlc2EubWlub3JfdmVyc2lvbik7CisgICAgbW9yZV9wcmludGYoIiBWZW5kb3IgICAgICAgOiAlc1xuIiwgaGFyZHdhcmUtPnZlc2EudmVuZG9yKTsKKyAgICBtb3JlX3ByaW50ZigiIFByb2R1Y3QgICAgICA6ICVzXG4iLCBoYXJkd2FyZS0+dmVzYS5wcm9kdWN0KTsKKyAgICBtb3JlX3ByaW50ZigiIFByb2R1Y3QgcmV2LiA6ICVzXG4iLCBoYXJkd2FyZS0+dmVzYS5wcm9kdWN0X3JldmlzaW9uKTsKKyAgICBtb3JlX3ByaW50ZigiIFNvZnR3YXJlIHJldi46ICVkXG4iLCBoYXJkd2FyZS0+dmVzYS5zb2Z0d2FyZV9yZXYpOworICAgIG1vcmVfcHJpbnRmKCIgTWVtb3J5IChLQikgIDogJWRcbiIsIGhhcmR3YXJlLT52ZXNhLnRvdGFsX21lbW9yeSAqIDY0KTsKKyAgICBtb3JlX3ByaW50ZigiIE1vZGVzICAgICAgICA6ICVkXG4iLCBoYXJkd2FyZS0+dmVzYS52bWlfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3Zlc2FfbW9kZXMoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJICAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworICAgIGlmIChoYXJkd2FyZS0+aXNfdmVzYV92YWxpZCA9PSBmYWxzZSkgeworCW1vcmVfcHJpbnRmKCJObyBWRVNBIEJJT1MgZGV0ZWN0ZWRcbiIpOworCXJldHVybjsKKyAgICB9CisgICAgbW9yZV9wcmludGYoIiBSZXNILiB4IFJlc1YgeCBCaXRzIDogdmdhPSA6IFZlc2EgTW9kZVxuIik7CisgICAgbW9yZV9wcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYXJkd2FyZS0+dmVzYS52bWlfY291bnQ7IGkrKykgeworCXN0cnVjdCB2ZXNhX21vZGVfaW5mbyAqbWkgPSAmaGFyZHdhcmUtPnZlc2Eudm1pW2ldLm1pOworCS8qCisJICogU29tZXRpbWVzLCB2ZXNhIGJpb3MgcmVwb3J0cyAweDAgbW9kZXMuCisJICogV2UgZG9uJ3QgbmVlZCB0byBkaXNwbGF5IHRoYXQgb25lcy4KKwkgKi8KKwlpZiAoKG1pLT5oX3JlcyA9PSAwKSB8fCAobWktPnZfcmVzID09IDApKQorCSAgICBjb250aW51ZTsKKwltb3JlX3ByaW50ZigiJTV1ICU1dSAgICAlM3UgICAgICUzZCAgICAgMHglMDR4XG4iLAorCQkgICAgbWktPmhfcmVzLCBtaS0+dl9yZXMsIG1pLT5icHAsCisJCSAgICBoYXJkd2FyZS0+dmVzYS52bWlbaV0ubW9kZSArIDB4MjAwLAorCQkgICAgaGFyZHdhcmUtPnZlc2Eudm1pW2ldLm1vZGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3Zlc2EoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIHZlc2Ftb2RlID0gdHJ1ZTsKKyAgICBtYXhfY29uc29sZV9saW5lcyA9IE1BWF9WRVNBX0NMSV9MSU5FUzsKKyAgICBpbml0X2NvbnNvbGUoaGFyZHdhcmUpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX3Zlc2EoaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkLAorCQkJIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICB2ZXNhbW9kZSA9IGZhbHNlOworICAgIG1heF9jb25zb2xlX2xpbmVzID0gTUFYX0NMSV9MSU5FUzsKKyAgICBpbml0X2NvbnNvbGUoaGFyZHdhcmUpOworfQorCitzdHJ1Y3QgY2xpX2NhbGxiYWNrX2Rlc2NyIGxpc3RfdmVzYV9zaG93X21vZHVsZXNbXSA9IHsKKyAgICB7CisgICAgIC5uYW1lID0gQ0xJX01PREVTLAorICAgICAuZXhlYyA9IHNob3dfdmVzYV9tb2RlcywKKyAgICAgLm5vbW9kdWxlPWZhbHNlLAorICAgICB9LAorICAgIHsKKyAgICAgLm5hbWUgPSBOVUxMLAorICAgICAuZXhlYyA9IE5VTEwsCisgICAgIC5ub21vZHVsZT1mYWxzZSwKKyAgICAgfSwKK307CisKK3N0cnVjdCBjbGlfY2FsbGJhY2tfZGVzY3IgbGlzdF92ZXNhX2NvbW1hbmRzW10gPSB7CisgICAgeworICAgICAubmFtZSA9IENMSV9FTkFCTEUsCisgICAgIC5leGVjID0gZW5hYmxlX3Zlc2EsCisgICAgIC5ub21vZHVsZT1mYWxzZSwKKyAgICAgfSwKKyAgICB7CisgICAgIC5uYW1lID0gQ0xJX0RJU0FCTEUsCisgICAgIC5leGVjID0gZGlzYWJsZV92ZXNhLAorICAgICAubm9tb2R1bGU9ZmFsc2UsCisgICAgIH0sCisKKyAgICB7CisgICAgIC5uYW1lID0gTlVMTCwKKyAgICAgLmV4ZWMgPSBOVUxMLAorICAgICAubm9tb2R1bGU9ZmFsc2UsCisgICAgIH0sCit9OworCitzdHJ1Y3QgY2xpX21vZHVsZV9kZXNjciB2ZXNhX3Nob3dfbW9kdWxlcyA9IHsKKyAgICAubW9kdWxlcyA9IGxpc3RfdmVzYV9zaG93X21vZHVsZXMsCisgICAgLmRlZmF1bHRfY2FsbGJhY2sgPSBtYWluX3Nob3dfdmVzYSwKK307CisKK3N0cnVjdCBjbGlfbW9kdWxlX2Rlc2NyIHZlc2FfY29tbWFuZHMgPSB7CisgICAgLm1vZHVsZXMgPSBsaXN0X3Zlc2FfY29tbWFuZHMsCisgICAgLmRlZmF1bHRfY2FsbGJhY2sgPSBlbmFibGVfdmVzYSwKK307CisKK3N0cnVjdCBjbGlfbW9kZV9kZXNjciB2ZXNhX21vZGUgPSB7CisgICAgLm1vZGUgPSBWRVNBX01PREUsCisgICAgLm5hbWUgPSBDTElfVkVTQSwKKyAgICAuZGVmYXVsdF9tb2R1bGVzID0gJnZlc2FfY29tbWFuZHMsCisgICAgLnNob3dfbW9kdWxlcyA9ICZ2ZXNhX3Nob3dfbW9kdWxlcywKKyAgICAuc2V0X21vZHVsZXMgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtY2xpLXZwZC5jIGIvY29tMzIvaGR0L2hkdC1jbGktdnBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjNTgwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtY2xpLXZwZC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZwZC92cGQuaD4KKworI2luY2x1ZGUgImhkdC1jbGkuaCIKKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisKK3ZvaWQgbWFpbl9zaG93X3ZwZChpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCSAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICByZXNldF9tb3JlX3ByaW50ZigpOworCisgICAgaWYgKCFoYXJkd2FyZS0+aXNfdnBkX3ZhbGlkKSB7CisJbW9yZV9wcmludGYoIk5vIFZQRCBzdHJ1Y3R1cmUgZGV0ZWN0ZWQuXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgbW9yZV9wcmludGYoIlZQRCBwcmVzZW50IGF0IGFkZHJlc3MgOiAlc1xuIiwgaGFyZHdhcmUtPnZwZC5iYXNlX2FkZHJlc3MpOworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPnZwZC5iaW9zX2J1aWxkX2lkKSA+IDApCisJbW9yZV9wcmludGYoIkJpb3MgQnVpbGQgSUQgICAgICAgICAgICAgICAgIDogJXNcbiIsCisJCSAgICBoYXJkd2FyZS0+dnBkLmJpb3NfYnVpbGRfaWQpOworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPnZwZC5iaW9zX3JlbGVhc2VfZGF0ZSkgPiAwKQorCW1vcmVfcHJpbnRmKCJCaW9zIFJlbGVhc2UgRGF0ZSAgICAgICAgICAgICA6ICVzXG4iLAorCQkgICAgaGFyZHdhcmUtPnZwZC5iaW9zX3JlbGVhc2VfZGF0ZSk7CisgICAgaWYgKHN0cmxlbihoYXJkd2FyZS0+dnBkLmJpb3NfdmVyc2lvbikgPiAwKQorCW1vcmVfcHJpbnRmKCJCaW9zIFZlcnNpb24gICAgICAgICAgICAgICAgICA6ICVzXG4iLAorCQkgICAgaGFyZHdhcmUtPnZwZC5iaW9zX3ZlcnNpb24pOworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPnZwZC5kZWZhdWx0X2ZsYXNoX2ZpbGVuYW1lKSA+IDApCisJbW9yZV9wcmludGYoIkRlZmF1bHQgRmxhc2ggRmlsZW5hbWUgICAgICAgIDogJXNcbiIsCisJCSAgICBoYXJkd2FyZS0+dnBkLmRlZmF1bHRfZmxhc2hfZmlsZW5hbWUpOworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPnZwZC5ib3hfc2VyaWFsX251bWJlcikgPiAwKQorCW1vcmVfcHJpbnRmKCJCb3ggU2VyaWFsIE51bWJlciAgICAgICAgICAgICA6ICVzXG4iLAorCQkgICAgaGFyZHdhcmUtPnZwZC5ib3hfc2VyaWFsX251bWJlcik7CisgICAgaWYgKHN0cmxlbihoYXJkd2FyZS0+dnBkLm1vdGhlcmJvYXJkX3NlcmlhbF9udW1iZXIpID4gMCkKKwltb3JlX3ByaW50ZigiTW90aGVyYm9hcmQgU2VyaWFsIE51bWJlciAgICAgOiAlc1xuIiwKKwkJICAgIGhhcmR3YXJlLT52cGQubW90aGVyYm9hcmRfc2VyaWFsX251bWJlcik7CisgICAgaWYgKHN0cmxlbihoYXJkd2FyZS0+dnBkLm1hY2hpbmVfdHlwZV9tb2RlbCkgPiAwKQorCW1vcmVfcHJpbnRmKCJNYWNoaW5lIFR5cGUvTW9kZWwgICAgICAgICAgICA6ICVzXG4iLAorCQkgICAgaGFyZHdhcmUtPnZwZC5tYWNoaW5lX3R5cGVfbW9kZWwpOworfQorCitzdHJ1Y3QgY2xpX21vZHVsZV9kZXNjciB2cGRfc2hvd19tb2R1bGVzID0geworICAgIC5tb2R1bGVzID0gTlVMTCwKKyAgICAuZGVmYXVsdF9jYWxsYmFjayA9IG1haW5fc2hvd192cGQsCit9OworCitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgdnBkX21vZGUgPSB7CisgICAgLm1vZGUgPSBWUERfTU9ERSwKKyAgICAubmFtZSA9IENMSV9WUEQsCisgICAgLmRlZmF1bHRfbW9kdWxlcyA9IE5VTEwsCisgICAgLnNob3dfbW9kdWxlcyA9ICZ2cGRfc2hvd19tb2R1bGVzLAorICAgIC5zZXRfbW9kdWxlcyA9IE5VTEwsCit9OwpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1jbGkuYyBiL2NvbTMyL2hkdC9oZHQtY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5NWIxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtY2xpLmMKQEAgLTAsMCArMSwxMTQxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxnZXRrZXkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJoZHQtY2xpLmgiCisjaW5jbHVkZSAiaGR0LWNvbW1vbi5oIgorCitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgKmxpc3RfbW9kZXNbXSA9IHsKKyAgICAmaGR0X21vZGUsCisgICAgJmRtaV9tb2RlLAorICAgICZzeXNsaW51eF9tb2RlLAorICAgICZweGVfbW9kZSwKKyAgICAma2VybmVsX21vZGUsCisgICAgJmNwdV9tb2RlLAorICAgICZwY2lfbW9kZSwKKyAgICAmdmVzYV9tb2RlLAorICAgICZkaXNrX21vZGUsCisgICAgJnZwZF9tb2RlLAorICAgICZtZW1vcnlfbW9kZSwKKyAgICAmYWNwaV9tb2RlLAorICAgIE5VTEwsCit9OworCisvKgorICogLmFsaWFzZXMgPSB7InEiLCAicXVpdCJ9IHdvbid0IHdvcmsgc2luY2UgaXQgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMsIG5vdCBhbgorICogYXJyYXkgb2YgdmFyaWFibGVzLiBUaGVyZSBpcyBubyBlYXN5IHdheSBhcm91bmQgaXQgYmVzaWRlcyBkZWNsYXJpbmcgdGhlIGFycmF5cyBvZgorICogc3RyaW5ncyBmaXJzdC4KKyAqLworY29uc3QgY2hhciAqZXhpdF9hbGlhc2VzW10gPSB7ICJxIiwgInF1aXQiIH07Citjb25zdCBjaGFyICpoZWxwX2FsaWFzZXNbXSA9IHsgImgiLCAiPyIgfTsKKworLyogTGlzdCBvZiBhbGlhc2VzICovCitzdHJ1Y3QgY2xpX2FsaWFzIGhkdF9hbGlhc2VzW10gPSB7CisgICAgeworICAgICAuY29tbWFuZCA9IENMSV9FWElULAorICAgICAubmJfYWxpYXNlcyA9IDIsCisgICAgIC5hbGlhc2VzID0gZXhpdF9hbGlhc2VzLAorICAgICB9LAorICAgIHsKKyAgICAgLmNvbW1hbmQgPSBDTElfSEVMUCwKKyAgICAgLm5iX2FsaWFzZXMgPSAyLAorICAgICAuYWxpYXNlcyA9IGhlbHBfYWxpYXNlcywKKyAgICAgfSwKK307CisKK3N0cnVjdCBjbGlfbW9kZV9kZXNjciAqY3VycmVudF9tb2RlOworaW50IGF1dG9jb21wbGV0ZV9iYWNrbG9nOworCitzdHJ1Y3QgYXV0b2NvbXBsZXRlX2xpc3QgeworICAgIGNoYXIgYXV0b2NvbXBsZXRlX3Rva2VuW01BWF9MSU5FX1NJWkVdOworICAgIHN0cnVjdCBhdXRvY29tcGxldGVfbGlzdCAqbmV4dDsKK307CitzdHJ1Y3QgYXV0b2NvbXBsZXRlX2xpc3QgKmF1dG9jb21wbGV0ZV9oZWFkID0gTlVMTDsKK3N0cnVjdCBhdXRvY29tcGxldGVfbGlzdCAqYXV0b2NvbXBsZXRlX3RhaWwgPSBOVUxMOworc3RydWN0IGF1dG9jb21wbGV0ZV9saXN0ICphdXRvY29tcGxldGVfbGFzdF9zZWVuID0gTlVMTDsKKworc3RhdGljIHZvaWQgYXV0b2NvbXBsZXRlX2FkZF90b2tlbl90b19saXN0KGNvbnN0IGNoYXIgKnRva2VuKQoreworICAgIHN0cnVjdCBhdXRvY29tcGxldGVfbGlzdCAqbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXV0b2NvbXBsZXRlX2xpc3QpKTsKKworICAgIHN0cmxjcHkobmV3LT5hdXRvY29tcGxldGVfdG9rZW4sIHRva2VuLCBzaXplb2YobmV3LT5hdXRvY29tcGxldGVfdG9rZW4pKTsKKyAgICBuZXctPm5leHQgPSBOVUxMOworICAgIGF1dG9jb21wbGV0ZV9iYWNrbG9nKys7CisKKyAgICBpZiAoYXV0b2NvbXBsZXRlX3RhaWwgIT0gTlVMTCkKKwlhdXRvY29tcGxldGVfdGFpbC0+bmV4dCA9IG5ldzsKKyAgICBpZiAoYXV0b2NvbXBsZXRlX2hlYWQgPT0gTlVMTCkKKwlhdXRvY29tcGxldGVfaGVhZCA9IG5ldzsKKyAgICBhdXRvY29tcGxldGVfdGFpbCA9IG5ldzsKK30KKworc3RhdGljIHZvaWQgYXV0b2NvbXBsZXRlX2Rlc3Ryb3lfbGlzdCh2b2lkKQoreworICAgIHN0cnVjdCBhdXRvY29tcGxldGVfbGlzdCAqdG1wID0gTlVMTDsKKworICAgIHdoaWxlIChhdXRvY29tcGxldGVfaGVhZCAhPSBOVUxMKSB7CisJdG1wID0gYXV0b2NvbXBsZXRlX2hlYWQtPm5leHQ7CisJZnJlZShhdXRvY29tcGxldGVfaGVhZCk7CisJYXV0b2NvbXBsZXRlX2hlYWQgPSB0bXA7CisgICAgfQorICAgIGF1dG9jb21wbGV0ZV9iYWNrbG9nID0gMDsKKyAgICBhdXRvY29tcGxldGVfdGFpbCA9IE5VTEw7CisgICAgYXV0b2NvbXBsZXRlX2xhc3Rfc2VlbiA9IE5VTEw7Cit9CisKKy8qKgorICogc2V0X21vZGUgLSBzZXQgdGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgY2xpCisgKiBAbW9kZToJbW9kZSB0byBzZXQKKyAqCisgKiBVbmxpa2UgY2xpX3NldF9tb2RlLCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGJ5IHRoZSBjbGkgZGlyZWN0bHkuCisgKiovCit2b2lkIHNldF9tb2RlKGNsaV9tb2RlX3QgbW9kZSwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGludCBpID0gMDsKKworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgRVhJVF9NT0RFOgorCWhkdF9jbGkubW9kZSA9IG1vZGU7CisJYnJlYWs7CisgICAgY2FzZSBIRFRfTU9ERToKKwloZHRfY2xpLm1vZGUgPSBtb2RlOworCXNucHJpbnRmKGhkdF9jbGkucHJvbXB0LCBzaXplb2YoaGR0X2NsaS5wcm9tcHQpLCAiJXM+ICIsIENMSV9IRFQpOworCWJyZWFrOworICAgIGNhc2UgUFhFX01PREU6CisJaWYgKGhhcmR3YXJlLT5zdi0+ZmlsZXN5c3RlbSAhPSBTWVNMSU5VWF9GU19QWEVMSU5VWCkgeworCSAgICBtb3JlX3ByaW50ZigiWW91IGFyZSBub3QgY3VycmVudGx5IHVzaW5nIFBYRUxJTlVYXG4iKTsKKwkgICAgYnJlYWs7CisJfQorCWhkdF9jbGkubW9kZSA9IG1vZGU7CisJc25wcmludGYoaGR0X2NsaS5wcm9tcHQsIHNpemVvZihoZHRfY2xpLnByb21wdCksICIlcz4gIiwgQ0xJX1BYRSk7CisJYnJlYWs7CisgICAgY2FzZSBLRVJORUxfTU9ERToKKwloZHRfY2xpLm1vZGUgPSBtb2RlOworCXNucHJpbnRmKGhkdF9jbGkucHJvbXB0LCBzaXplb2YoaGR0X2NsaS5wcm9tcHQpLCAiJXM+ICIsIENMSV9LRVJORUwpOworCWJyZWFrOworICAgIGNhc2UgU1lTTElOVVhfTU9ERToKKwloZHRfY2xpLm1vZGUgPSBtb2RlOworCXNucHJpbnRmKGhkdF9jbGkucHJvbXB0LCBzaXplb2YoaGR0X2NsaS5wcm9tcHQpLCAiJXM+ICIsIENMSV9TWVNMSU5VWCk7CisJYnJlYWs7CisgICAgY2FzZSBWRVNBX01PREU6CisJaGR0X2NsaS5tb2RlID0gbW9kZTsKKwlzbnByaW50ZihoZHRfY2xpLnByb21wdCwgc2l6ZW9mKGhkdF9jbGkucHJvbXB0KSwgIiVzPiAiLCBDTElfVkVTQSk7CisJYnJlYWs7CisgICAgY2FzZSBQQ0lfTU9ERToKKwloZHRfY2xpLm1vZGUgPSBtb2RlOworCXNucHJpbnRmKGhkdF9jbGkucHJvbXB0LCBzaXplb2YoaGR0X2NsaS5wcm9tcHQpLCAiJXM+ICIsIENMSV9QQ0kpOworCWJyZWFrOworICAgIGNhc2UgQ1BVX01PREU6CisJaGR0X2NsaS5tb2RlID0gbW9kZTsKKwlzbnByaW50ZihoZHRfY2xpLnByb21wdCwgc2l6ZW9mKGhkdF9jbGkucHJvbXB0KSwgIiVzPiAiLCBDTElfQ1BVKTsKKwlicmVhazsKKyAgICBjYXNlIERNSV9NT0RFOgorCWlmICghaGFyZHdhcmUtPmlzX2RtaV92YWxpZCkgeworCSAgICBtb3JlX3ByaW50ZigiTm8gdmFsaWQgRE1JIHRhYmxlIGZvdW5kLCBleGl0aW5nLlxuIik7CisJICAgIGJyZWFrOworCX0KKwloZHRfY2xpLm1vZGUgPSBtb2RlOworCXNucHJpbnRmKGhkdF9jbGkucHJvbXB0LCBzaXplb2YoaGR0X2NsaS5wcm9tcHQpLCAiJXM+ICIsIENMSV9ETUkpOworCWJyZWFrOworICAgIGNhc2UgRElTS19NT0RFOgorCWhkdF9jbGkubW9kZSA9IG1vZGU7CisJc25wcmludGYoaGR0X2NsaS5wcm9tcHQsIHNpemVvZihoZHRfY2xpLnByb21wdCksICIlcz4gIiwgQ0xJX0RJU0spOworCWJyZWFrOworICAgIGNhc2UgVlBEX01PREU6CisJaWYgKCFoYXJkd2FyZS0+aXNfdnBkX3ZhbGlkKSB7CisJICAgIG1vcmVfcHJpbnRmKCJObyB2YWxpZCBWUEQgdGFibGUgZm91bmQsIGV4aXRpbmcuXG4iKTsKKwkgICAgYnJlYWs7CisJfQorCWhkdF9jbGkubW9kZSA9IG1vZGU7CisJc25wcmludGYoaGR0X2NsaS5wcm9tcHQsIHNpemVvZihoZHRfY2xpLnByb21wdCksICIlcz4gIiwgQ0xJX1ZQRCk7CisJYnJlYWs7CisgICAgY2FzZSBNRU1PUllfTU9ERToKKwloZHRfY2xpLm1vZGUgPSBtb2RlOworCXNucHJpbnRmKGhkdF9jbGkucHJvbXB0LCBzaXplb2YoaGR0X2NsaS5wcm9tcHQpLCAiJXM+ICIsIENMSV9NRU1PUlkpOworCWJyZWFrOworICAgIGNhc2UgQUNQSV9NT0RFOgorCWhkdF9jbGkubW9kZSA9IG1vZGU7CisJc25wcmludGYoaGR0X2NsaS5wcm9tcHQsIHNpemVvZihoZHRfY2xpLnByb21wdCksICIlcz4gIiwgQ0xJX0FDUEkpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJLyogSW52YWxpZCBtb2RlICovCisJbW9yZV9wcmludGYoIlVua25vd24gbW9kZSwgcGxlYXNlIGNob29zZSBhbW9uZzpcbiIpOworCXdoaWxlIChsaXN0X21vZGVzW2ldKSB7CisJICAgIG1vcmVfcHJpbnRmKCJcdCVzXG4iLCBsaXN0X21vZGVzW2ldLT5uYW1lKTsKKwkgICAgaSsrOworCX0KKyAgICB9CisKKyAgICBmaW5kX2NsaV9tb2RlX2Rlc2NyKGhkdF9jbGkubW9kZSwgJmN1cnJlbnRfbW9kZSk7CisgICAgLyogVGhlcmUgaXMgbm90IGNsaV9tb2RlX2Rlc2NyIHN0cnVjdCBmb3IgdGhlIGV4aXQgbW9kZSAqLworICAgIGlmIChjdXJyZW50X21vZGUgPT0gTlVMTCAmJiBoZHRfY2xpLm1vZGUgIT0gRVhJVF9NT0RFKSB7CisJLyogU2hvdWxkbid0IGdldCBoZXJlLi4uICovCisJbW9yZV9wcmludGYoIiEhISBCVUc6IE1vZGUgJyVkJyB1bmtub3duLlxuIiwgaGR0X2NsaS5tb2RlKTsKKyAgICB9Cit9CisKKy8qKgorICogbW9kZV9zX3RvX21vZGVfdCAtIGdpdmVuIGEgbW9kZSBzdHJpbmcsIHJldHVybiB0aGUgY2xpX21vZGVfdCByZXByZXNlbnRhdGlvbgorICoqLworY2xpX21vZGVfdCBtb2RlX3NfdG9fbW9kZV90KGNoYXIgKm5hbWUpCit7CisgICAgaW50IGkgPSAwOworCisgICAgd2hpbGUgKGxpc3RfbW9kZXNbaV0pIHsKKwlpZiAoIXN0cm5jbXAobmFtZSwgbGlzdF9tb2Rlc1tpXS0+bmFtZSwgc2l6ZW9mKGxpc3RfbW9kZXNbaV0tPm5hbWUpKSkKKwkgICAgYnJlYWs7CisJaSsrOworICAgIH0KKworICAgIGlmICghbGlzdF9tb2Rlc1tpXSkKKwlyZXR1cm4gSU5WQUxJRF9NT0RFOworICAgIGVsc2UKKwlyZXR1cm4gbGlzdF9tb2Rlc1tpXS0+bW9kZTsKK30KKworLyoqCisgKiBmaW5kX2NsaV9tb2RlX2Rlc2NyIC0gZmluZCB0aGUgY2xpX21vZGVfZGVzY3Igc3RydWN0IGFzc29jaWF0ZWQgdG8gYSBtb2RlCisgKiBAbW9kZToJbW9kZSB0byBsb29rIGZvcgorICogQG1vZGVfZm91bmQ6CXN0b3JlIHRoZSBtb2RlIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZQorICoKKyAqIEdpdmVuIGEgbW9kZSBuYW1lLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIGNsaV9tb2RlX2Rlc2NyCisgKiBzdHJ1Y3R1cmUuCisgKiBOb3RlOiB0aGUgY3VycmVudCBtb2RlIG5hbWUgaXMgc3RvcmVkIGluIGhkdF9jbGkubW9kZS4KKyAqKi8KK3ZvaWQgZmluZF9jbGlfbW9kZV9kZXNjcihjbGlfbW9kZV90IG1vZGUsIHN0cnVjdCBjbGlfbW9kZV9kZXNjciAqKm1vZGVfZm91bmQpCit7CisgICAgaW50IGkgPSAwOworCisgICAgd2hpbGUgKGxpc3RfbW9kZXNbaV0gJiYgbGlzdF9tb2Rlc1tpXS0+bW9kZSAhPSBtb2RlKQorCWkrKzsKKworICAgIC8qIFNob3VsZG4ndCBnZXQgaGVyZS4uLiAqLworICAgIGlmICghbGlzdF9tb2Rlc1tpXSkKKwkqbW9kZV9mb3VuZCA9IE5VTEw7CisgICAgZWxzZQorCSptb2RlX2ZvdW5kID0gbGlzdF9tb2Rlc1tpXTsKK30KKworLyoqCisgKiBleHBhbmRfYWxpYXNlcyAtIHJlc29sdmUgYWxpYXNlcyBtYXBwaW5nCisgKiBAbGluZToJY29tbWFuZCBsaW5lIHRvIHBhcnNlCisgKiBAY29tbWFuZDoJZmlyc3QgdG9rZW4gaW4gdGhlIGxpbmUKKyAqIEBtb2R1bGU6CXNlY29uZCB0b2tlbiBpbiB0aGUgbGluZQorICogQGFyZ2M6CW51bWJlciBvZiBhcmd1bWVudHMKKyAqIEBhcmd2OglhcnJheSBvZiBhcmd1bWVudHMKKyAqCisgKiBXZSBtYWludGFpbiBhIHNtYWxsIGxpc3Qgb2Ygc3RhdGljIGFsaXNlcyB0byBlbmhhbmNlIHVzZXIgZXhwZXJpZW5jZS4KKyAqIE9ubHkgY29tbWFuZHMgY2FuIGJlIGFsaWFzZWQgKGZpcnN0IHRva2VuKS4gT3RoZXJ3aXNlIGl0IGNhbiBiZWNvbWUgcmVhbGx5IGhhaXJ5Li4uCisgKiovCitzdGF0aWMgdm9pZCBleHBhbmRfYWxpYXNlcyhjaGFyICpsaW5lIF9fdW51c2VkLCBjaGFyICoqY29tbWFuZCwgY2hhciAqKm1vZHVsZSwKKwkJCSAgIGludCAqYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgc3RydWN0IGNsaV9tb2RlX2Rlc2NyICptb2RlOworICAgIGludCBpLCBqOworCisgICAgZmluZF9jbGlfbW9kZV9kZXNjcihtb2RlX3NfdG9fbW9kZV90KCpjb21tYW5kKSwgJm1vZGUpOworICAgIGlmIChtb2RlICE9IE5VTEwgJiYgKm1vZHVsZSA9PSBOVUxMKSB7CisJLyoKKwkgKiBUaGUgdXNlciBzcGVjaWZpZWQgYSBtb2RlIGluc3RlYWQgb2YgYHNldCBtb2RlLi4uJywgZS5nLgorCSAqIGBkbWknIGluc3RlYWQgb2YgYHNldCBtb2RlIGRtaScKKwkgKi8KKworCS8qICphcmd2IGlzIE5VTEwgc2luY2UgKm1vZHVsZSBpcyBOVUxMICovCisJKmFyZ2MgPSAxOworCSphcmd2ID0gbWFsbG9jKCphcmdjICogc2l6ZW9mKGNoYXIgKikpOworCWFyZ3ZbMF0gPSBtYWxsb2MoKHNpemVvZigqY29tbWFuZCkgKyAxKSAqIHNpemVvZihjaGFyKSk7CisJc3RybGNweShhcmd2WzBdLCAqY29tbWFuZCwgc2l6ZW9mKCpjb21tYW5kKSArIDEpOworCWRwcmludGYoIkNMSSBERUJVRzogQUxJQVMgJXMgIiwgKmNvbW1hbmQpOworCisJc3RybGNweSgqY29tbWFuZCwgQ0xJX1NFVCwgc2l6ZW9mKENMSV9TRVQpKTsJLyogc2V0ICovCisKKwkqbW9kdWxlID0gbWFsbG9jKHNpemVvZihDTElfTU9ERSkgKiBzaXplb2YoY2hhcikpOworCXN0cmxjcHkoKm1vZHVsZSwgQ0xJX01PREUsIHNpemVvZihDTElfTU9ERSkpOwkvKiBtb2RlICovCisKKwlkcHJpbnRmKCItLT4gJXMgJXMgJXNcbiIsICpjb21tYW5kLCAqbW9kdWxlLCBhcmd2WzBdKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBTaW1wbGUgYWxpYXNlcyBtYXBwaW5nIGEgc2luZ2xlIGNvbW1hbmQgdG8gYW5vdGhlciBvbmUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0FMSUFTRVM7IGkrKykgeworCWZvciAoaiA9IDA7IGogPCBoZHRfYWxpYXNlc1tpXS5uYl9hbGlhc2VzOyBqKyspIHsKKwkgICAgaWYgKCFzdHJuY21wKCpjb21tYW5kLCBoZHRfYWxpYXNlc1tpXS5hbGlhc2VzW2pdLAorCQkJIHNpemVvZihoZHRfYWxpYXNlc1tpXS5hbGlhc2VzW2pdKSkpIHsKKwkJZHByaW50ZigiQ0xJIERFQlVHOiBBTElBUyAlcyAiLCAqY29tbWFuZCk7CisJCXN0cmxjcHkoKmNvbW1hbmQsIGhkdF9hbGlhc2VzW2ldLmNvbW1hbmQsCisJCQlzaXplb2YoaGR0X2FsaWFzZXNbaV0uY29tbWFuZCkgKyAxKTsKKwkJZHByaW50ZigiLS0+ICVzXG4iLCAqY29tbWFuZCk7CisJCWdvdG8gb3V0OwkvKiBEb24ndCBhbGxvdyBjaGFpbmluZyBhbGlhc2VzICovCisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybjsKKworb3V0OgorICAgIGRwcmludGYoIkNMSSBERUJVRzogTmV3IHBhcmFtZXRlcnM6XG4iKTsKKyAgICBkcHJpbnRmKCJDTEkgREVCVUc6IGNvbW1hbmQgPSAlc1xuIiwgKmNvbW1hbmQpOworICAgIGRwcmludGYoIkNMSSBERUJVRzogbW9kdWxlICA9ICVzXG4iLCAqbW9kdWxlKTsKKyAgICBkcHJpbnRmKCJDTEkgREVCVUc6IGFyZ2MgICAgPSAlZFxuIiwgKmFyZ2MpOworICAgIGZvciAoaSA9IDA7IGkgPCAqYXJnYzsgaSsrKQorCWRwcmludGYoIkNMSSBERUJVRzogYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndlswXSk7CisgICAgcmV0dXJuOworfQorCisvKioKKyAqIHBhcnNlX2NvbW1hbmRfbGluZSAtIGxvdyBsZXZlbCBwYXJzZXIgZm9yIHRoZSBjb21tYW5kIGxpbmUKKyAqIEBsaW5lOgljb21tYW5kIGxpbmUgdG8gcGFyc2UKKyAqIEBjb21tYW5kOglmaXJzdCB0b2tlbiBpbiB0aGUgbGluZQorICogQG1vZHVsZToJc2Vjb25kIHRva2VuIGluIHRoZSBsaW5lCisgKiBAYXJnYzoJbnVtYmVyIG9mIGFyZ3VtZW50cworICogQGFyZ3Y6CWFycmF5IG9mIGFyZ3VtZW50cworICoKKyAqIFRoZSBmb3JtYXQgb2YgdGhlIGNvbW1hbmQgbGluZSBpczoKKyAqCTxtYWluIGNvbW1hbmQ+IFs8bW9kdWxlIG9uIHdoaWNoIHRvIG9wZXJhdGU+IFs8YXJncz5dXQorICoJY29tbWFuZCBpcyBhbHdheXMgbWFsbG9jJ2VkIChldmVuIGZvciBhbiBlbXB0eSBsaW5lKQorICoqLworc3RhdGljIHZvaWQgcGFyc2VfY29tbWFuZF9saW5lKGNoYXIgKmxpbmUsIGNoYXIgKipjb21tYW5kLCBjaGFyICoqbW9kdWxlLAorCQkJICAgICAgIGludCAqYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IGFyZ2NfaXRlciA9IDAsIGFyZ3NfcG9zID0gMCwgdG9rZW5fZm91bmQgPSAwLCB0b2tlbl9sZW4gPSAwOworICAgIGludCBhcmdzX2xlbiA9IDA7CisgICAgY2hhciAqcGNoID0gTlVMTCwgKnBjaF9uZXh0ID0gTlVMTCwgKnRtcF9wY2hfbmV4dCA9IE5VTEw7CisKKyAgICAqY29tbWFuZCA9IE5VTEw7CisgICAgKm1vZHVsZSA9IE5VTEw7CisgICAgKmFyZ2MgPSAwOworCisgICAgcGNoID0gbGluZTsKKyAgICB3aGlsZSAocGNoICE9IE5VTEwpIHsKKwlwY2hfbmV4dCA9IHN0cmNocihwY2ggKyAxLCAnICcpOworCXRtcF9wY2hfbmV4dCA9IHBjaF9uZXh0OworCisJLyoKKwkgKiBTa2lwIHdoaXRlc3BhY2VzIGlmIHRoZSB1c2VyIGVudGVyZWQKKwkgKiAnc2V0ICAgbW9kZSAgICAgICAgZm9vJyBmb3IgJ3NldCBtb2RlIGZvbycKKwkgKiAgXiAgIF4KKwkgKiAgfF9fX3xfX18gcGNoCisJICogICAgICB8X19fIHBjaF9uZXh0IDwtIHdyb25nIQorCSAqCisJICogIFdlIHN0aWxsIGtlZXAgdGhlIHBvc2l0aW9uIGludG8gdG1wX3BjaF9uZXh0IHRvIGNvbXB1dGUKKwkgKiAgdGhlIGxlbmdodCBvZiB0aGUgY3VycmVudCB0b2tlbi4KKwkgKi8KKwl3aGlsZSAocGNoX25leHQgIT0gTlVMTCAmJiAhc3RybmNtcChwY2hfbmV4dCwgQ0xJX1NQQUNFLCAxKSkKKwkgICAgcGNoX25leHQrKzsKKworCS8qIEVuZCBvZiBsaW5lIGd1YXJhbnRlZWQgdG8gYmUgemVyb2VkICovCisJaWYgKHBjaF9uZXh0ID09IE5VTEwpIHsKKwkgICAgdG9rZW5fbGVuID0gKGludCkoc3RyY2hyKHBjaCArIDEsICdcMCcpIC0gcGNoKTsKKwkgICAgYXJnc19sZW4gPSB0b2tlbl9sZW47CisJfSBlbHNlIHsKKwkgICAgdG9rZW5fbGVuID0gKGludCkodG1wX3BjaF9uZXh0IC0gcGNoKTsKKwkgICAgYXJnc19sZW4gPSAoaW50KShwY2hfbmV4dCAtIHBjaCk7CisJfQorCisJaWYgKHRva2VuX2ZvdW5kID09IDApIHsKKwkgICAgLyogTWFpbiBjb21tYW5kIHRvIGV4ZWN1dGUgKi8KKwkgICAgKmNvbW1hbmQgPSBtYWxsb2MoKHRva2VuX2xlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKKwkgICAgc3RybGNweSgqY29tbWFuZCwgcGNoLCB0b2tlbl9sZW4pOworCSAgICAoKmNvbW1hbmQpW3Rva2VuX2xlbl0gPSAnXDAnOworCSAgICBkcHJpbnRmKCJDTEkgREVCVUcgcGFyc2U6IGNvbW1hbmQgPSAlc1xuIiwgKmNvbW1hbmQpOworCSAgICBhcmdzX3BvcyArPSBhcmdzX2xlbjsKKwl9IGVsc2UgaWYgKHRva2VuX2ZvdW5kID09IDEpIHsKKwkgICAgLyogTW9kdWxlICovCisJICAgICptb2R1bGUgPSBtYWxsb2MoKHRva2VuX2xlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKKwkgICAgc3RybGNweSgqbW9kdWxlLCBwY2gsIHRva2VuX2xlbik7CisJICAgICgqbW9kdWxlKVt0b2tlbl9sZW5dID0gJ1wwJzsKKwkgICAgZHByaW50ZigiQ0xJIERFQlVHIHBhcnNlOiBtb2R1bGUgID0gJXNcbiIsICptb2R1bGUpOworCSAgICBhcmdzX3BvcyArPSBhcmdzX2xlbjsKKwl9IGVsc2UKKwkgICAgKCphcmdjKSsrOworCisJdG9rZW5fZm91bmQrKzsKKwlwY2ggPSBwY2hfbmV4dDsKKyAgICB9CisgICAgZHByaW50ZigiQ0xJIERFQlVHIHBhcnNlOiBhcmdjICAgID0gJWRcbiIsICphcmdjKTsKKworICAgIC8qIFNraXAgYXJndW1lbnRzIGhhbmRsaW5nIGlmIG5vbmUgaXMgc3VwcGxpZWQgKi8KKyAgICBpZiAoISphcmdjKQorCXJldHVybjsKKworICAgIC8qIFRyYW5zZm9ybSB0aGUgYXJndW1lbnRzIHN0cmluZyBpbnRvIGFuIGFycmF5ICovCisgICAgKmFyZ3YgPSBtYWxsb2MoKmFyZ2MgKiBzaXplb2YoY2hhciAqKSk7CisgICAgcGNoID0gc3RydG9rKGxpbmUgKyBhcmdzX3BvcywgQ0xJX1NQQUNFKTsKKyAgICB3aGlsZSAocGNoICE9IE5VTEwpIHsKKwlkcHJpbnRmKCJDTEkgREVCVUcgcGFyc2U6IGFyZ3ZbJWRdID0gJXNcbiIsIGFyZ2NfaXRlciwgcGNoKTsKKwlhcmd2W2FyZ2NfaXRlcl0gPSBtYWxsb2Moc3RybGVuKHBjaCkgKiBzaXplb2YoY2hhcikpOworCXN0cmxjcHkoYXJndlthcmdjX2l0ZXJdLCBwY2gsIHN0cmxlbihwY2gpKTsKKwlhcmdjX2l0ZXIrKzsKKwlwY2ggPSBzdHJ0b2soTlVMTCwgQ0xJX1NQQUNFKTsKKwkvKgorCSAqIHN0cnRvayhOVUxMLCBDTElfU1BBQ0UpIG92ZXIgYSBzdHJlYW0gb2Ygc3BhY2VzCisJICogd2lsbCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nCisJICovCisJd2hpbGUgKHBjaCAhPSBOVUxMICYmICFzdHJuY21wKHBjaCwgIiIsIDEpKQorCSAgICBwY2ggPSBzdHJ0b2soTlVMTCwgQ0xJX1NQQUNFKTsKKyAgICB9Cit9CisKKy8qKgorICogZmluZF9jbGlfY2FsbGJhY2tfZGVzY3IgLSBmaW5kIGEgY2FsbGJhY2sgaW4gYSBsaXN0IG9mIG1vZHVsZXMKKyAqIEBtb2R1bGVfbmFtZToJTmFtZSBvZiB0aGUgbW9kdWxlIHRvIGZpbmQKKyAqIEBtb2R1bGVzX2xpc3Q6CUxpdHMgb2YgbW9kdWxlcyBhbW9uZyB3aGljaCB0byBmaW5kIEBtb2R1bGVfbmFtZQorICogQG1vZHVsZV9mb3VuZDoJUG9pbnRlciB0byB0aGUgbWF0Y2hlZCBtb2R1bGUsIE5VTEwgaWYgbm90IGZvdW5kCisgKgorICogR2l2ZW4gYSBtb2R1bGUgbmFtZSBhbmQgYSBsaXN0IG9mIHBvc3NpYmxlIG1vZHVsZXMsIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIG1vZHVsZSBzdHJ1Y3R1cmUgdGhhdCBtYXRjaGVzIHRoZSBtb2R1bGUgbmFtZSBhbmQgc3RvcmUgaXQgaW4gQG1vZHVsZV9mb3VuZC4KKyAqKi8KK3ZvaWQgZmluZF9jbGlfY2FsbGJhY2tfZGVzY3IoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCisJCQkgICAgIHN0cnVjdCBjbGlfbW9kdWxlX2Rlc2NyICptb2R1bGVzX2xpc3QsCisJCQkgICAgIHN0cnVjdCBjbGlfY2FsbGJhY2tfZGVzY3IgKiptb2R1bGVfZm91bmQpCit7CisgICAgaW50IG1vZHVsZXNfaXRlciA9IDA7CisKKyAgICBpZiAobW9kdWxlc19saXN0ID09IE5VTEwpCisJZ290byBub3RfZm91bmQ7CisKKyAgICAvKiBGaW5kIHRoZSBjYWxsYmFjayB0byBleGVjdXRlICovCisgICAgd2hpbGUgKG1vZHVsZXNfbGlzdC0+bW9kdWxlc1ttb2R1bGVzX2l0ZXJdLm5hbWUgJiYKKwkgICBzdHJjbXAobW9kdWxlX25hbWUsIG1vZHVsZXNfbGlzdC0+bW9kdWxlc1ttb2R1bGVzX2l0ZXJdLm5hbWUpICE9IDApCisJbW9kdWxlc19pdGVyKys7CisKKyAgICBpZiAobW9kdWxlc19saXN0LT5tb2R1bGVzW21vZHVsZXNfaXRlcl0ubmFtZSkgeworCSptb2R1bGVfZm91bmQgPSAmKG1vZHVsZXNfbGlzdC0+bW9kdWxlc1ttb2R1bGVzX2l0ZXJdKTsKKwlkcHJpbnRmKCJDTEkgREVCVUc6IG1vZHVsZSAlcyBmb3VuZFxuIiwgKCptb2R1bGVfZm91bmQpLT5uYW1lKTsKKwlyZXR1cm47CisgICAgfQorCitub3RfZm91bmQ6CisgICAgKm1vZHVsZV9mb3VuZCA9IE5VTEw7CisgICAgcmV0dXJuOworfQorCisvKioKKyAqIGF1dG9jb21wbGV0ZV9jb21tYW5kIC0gcHJpbnQgbWF0Y2hpbmcgY29tbWFuZHMKKyAqIEBjb21tYW5kOglCZWdpbm5pbmcgb2YgdGhlIGNvbW1hbmQKKyAqCisgKiBHaXZlbiBhIHN0cmluZyBAY29tbWFuZCwgcHJpbnQgYWxsIGF2YWlsYWJsZXMgY29tbWFuZHMgc3RhcnRpbmcgd2l0aAorICogQGNvbW1hbmQuIENvbW1hbmRzIGFyZSBmb3VuZCB3aXRoaW4gdGhlIGxpc3Qgb2YgY29tbWFuZHMgZm9yIHRoZSBjdXJyZW50CisgKiBtb2RlIGFuZCB0aGUgaGR0IG1vZGUgKGlmIHRoZSBjdXJyZW50IG1vZGUgaXMgbm90IGhkdCkuCisgKiovCitzdGF0aWMgdm9pZCBhdXRvY29tcGxldGVfY29tbWFuZChjaGFyICpjb21tYW5kKQoreworICAgIGludCBqID0gMDsKKyAgICBzdHJ1Y3QgY2xpX2NhbGxiYWNrX2Rlc2NyICphc3NvY2lhdGVkX21vZHVsZSA9IE5VTEw7CisKKyAgICAvKiBGaXJzdCB0YWtlIGNhcmUgb2YgdGhlIHR3byBzcGVjaWFsIGNvbW1hbmRzOiAnc2hvdycgYW5kICdzZXQnICovCisgICAgaWYgKHN0cm5jbXAoQ0xJX1NIT1csIGNvbW1hbmQsIHN0cmxlbihjb21tYW5kKSkgPT0gMCkgeworCXByaW50ZigiJXNcbiIsIENMSV9TSE9XKTsKKwlhdXRvY29tcGxldGVfYWRkX3Rva2VuX3RvX2xpc3QoQ0xJX1NIT1cpOworICAgIH0KKyAgICBpZiAoc3RybmNtcChDTElfU0VULCBjb21tYW5kLCBzdHJsZW4oY29tbWFuZCkpID09IDApIHsKKwlwcmludGYoIiVzXG4iLCBDTElfU0VUKTsKKwlhdXRvY29tcGxldGVfYWRkX3Rva2VuX3RvX2xpc3QoQ0xJX1NFVCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGVuLCBnbyB0aHJvdWdoIHRoZSBtb2RlcyBmb3IgdGhlIHNwZWNpYWwgY2FzZQorICAgICAqICAgICAgJzxtb2RlPicgLT4gJ3NldCBtb2RlIDxtb2RlPicKKyAgICAgKi8KKyAgICB3aGlsZSAobGlzdF9tb2Rlc1tqXSkgeworCWlmIChzdHJuY21wKGxpc3RfbW9kZXNbal0tPm5hbWUsIGNvbW1hbmQsIHN0cmxlbihjb21tYW5kKSkgPT0gMCkgeworCSAgICBwcmludGYoIiVzXG4iLCBsaXN0X21vZGVzW2pdLT5uYW1lKTsKKwkgICAgYXV0b2NvbXBsZXRlX2FkZF90b2tlbl90b19saXN0KGxpc3RfbW9kZXNbal0tPm5hbWUpOworCX0KKwlqKys7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMZXQncyBnbyBub3cgdGhyb3VnaCB0aGUgbGlzdCBvZiBkZWZhdWx0X21vZHVsZXMgZm9yIHRoZSBjdXJyZW50IG1vZGUKKyAgICAgKiAoc2luZ2xlIHRva2VuIGNvbW1hbmRzIGZvciB0aGUgY3VycmVudF9tb2RlKQorICAgICAqLworICAgIGogPSAwOworICAgIGlmIChjdXJyZW50X21vZGUtPmRlZmF1bHRfbW9kdWxlcyAmJiBjdXJyZW50X21vZGUtPmRlZmF1bHRfbW9kdWxlcy0+bW9kdWxlcykgeworCXdoaWxlIChjdXJyZW50X21vZGUtPmRlZmF1bHRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKSB7CisJICAgIGlmIChzdHJuY21wKGN1cnJlbnRfbW9kZS0+ZGVmYXVsdF9tb2R1bGVzLT5tb2R1bGVzW2pdLm5hbWUsCisJCQljb21tYW5kLCBzdHJsZW4oY29tbWFuZCkpID09IDApIHsKKwkJcHJpbnRmKCIlc1xuIiwgY3VycmVudF9tb2RlLT5kZWZhdWx0X21vZHVsZXMtPm1vZHVsZXNbal0ubmFtZSk7CisJCWF1dG9jb21wbGV0ZV9hZGRfdG9rZW5fdG9fbGlzdChjdXJyZW50X21vZGUtPmRlZmF1bHRfbW9kdWxlcy0+CisJCQkJCSAgICAgICBtb2R1bGVzW2pdLm5hbWUpOworCSAgICB9CisJICAgIGorKzsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaW5hbGx5LCBpZiB0aGUgY3VycmVudF9tb2RlIGlzIG5vdCBoZHQsIGxpc3QgdGhlIGF2YWlsYWJsZQorICAgICAqIGRlZmF1bHRfbW9kdWxlcyBvZiBoZHQgKHRoZXNlIGFyZSBhbHdheXMgYXZhaWxhYmxlIGZyb20gYW55IG1vZGUpLgorICAgICAqLworICAgIGlmIChjdXJyZW50X21vZGUtPm1vZGUgPT0gSERUX01PREUpCisJcmV0dXJuOworCisgICAgaWYgKCFoZHRfbW9kZS5kZWZhdWx0X21vZHVsZXMgfHwgIWhkdF9tb2RlLmRlZmF1bHRfbW9kdWxlcy0+bW9kdWxlcykKKwlyZXR1cm47CisKKyAgICBqID0gMDsKKyAgICB3aGlsZSAoaGR0X21vZGUuZGVmYXVsdF9tb2R1bGVzICYmCisJICAgaGR0X21vZGUuZGVmYXVsdF9tb2R1bGVzLT5tb2R1bGVzW2pdLm5hbWUpIHsKKwkvKgorCSAqIEFueSBkZWZhdWx0IGNvbW1hbmQgdGhhdCBpcyBwcmVzZW50IGluIGhkdCBtb2RlIGJ1dAorCSAqIG5vdCBpbiB0aGUgY3VycmVudCBtb2RlIGlzIGF2YWlsYWJsZS4gQSBkZWZhdWx0CisJICogY29tbWFuZCBjYW4gYmUgcmVkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1vZGUgdGhvdWdoLgorCSAqIFRoaXMgbmV4dCBjYWxsIHRlc3RzIHRoaXMgdXNlIGNhc2U6IGlmIGl0IGlzCisJICogb3ZlcndyaXR0ZW4sIGRvIG5vdCBwcmludCBpdCBhZ2Fpbi4KKwkgKi8KKwlmaW5kX2NsaV9jYWxsYmFja19kZXNjcihoZHRfbW9kZS5kZWZhdWx0X21vZHVsZXMtPm1vZHVsZXNbal0ubmFtZSwKKwkJCQljdXJyZW50X21vZGUtPmRlZmF1bHRfbW9kdWxlcywKKwkJCQkmYXNzb2NpYXRlZF9tb2R1bGUpOworCWlmIChhc3NvY2lhdGVkX21vZHVsZSA9PSBOVUxMICYmCisJICAgIHN0cm5jbXAoY29tbWFuZCwKKwkJICAgIGhkdF9tb2RlLmRlZmF1bHRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lLAorCQkgICAgc3RybGVuKGNvbW1hbmQpKSA9PSAwKSB7CisJICAgIHByaW50ZigiJXNcbiIsIGhkdF9tb2RlLmRlZmF1bHRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKTsKKwkgICAgYXV0b2NvbXBsZXRlX2FkZF90b2tlbl90b19saXN0KGhkdF9tb2RlLmRlZmF1bHRfbW9kdWxlcy0+bW9kdWxlc1tqXS4KKwkJCQkJICAgbmFtZSk7CisJfQorCWorKzsKKyAgICB9Cit9CisKKy8qKgorICogYXV0b2NvbXBsZXRlX21vZHVsZSAtIHByaW50IG1hdGNoaW5nIG1vZHVsZXMKKyAqIEBjb21tYW5kOglDb21tYW5kIG9uIHRoZSBjb21tYW5kIGxpbmUgKG5vdCBOVUxMKQorICogQG1vZHVsZToJQmVnaW5uaW5nIG9mIHRoZSBtb2R1bGUKKyAqCisgKiBHaXZlbiBhIGNvbW1hbmQgQGNvbW1hbmQgYW5kIGEgc3RyaW5nIEBtb2R1bGUsIHByaW50IGFsbCBhdmFpbGFibGVzIG1vZHVsZXMKKyAqIHN0YXJ0aW5nIHdpdGggQG1vZHVsZSBmb3IgY29tbWFuZCBAY29tbWFuZC4gQ29tbWFuZHMgYXJlIGZvdW5kIHdpdGhpbiB0aGUKKyAqIGxpc3Qgb2YgY29tbWFuZHMgZm9yIHRoZSBjdXJyZW50IG1vZGUgYW5kIHRoZSBoZHQgbW9kZSAoaWYgdGhlIGN1cnJlbnQgbW9kZQorICogaXMgbm90IGhkdCkuCisgKiovCitzdGF0aWMgdm9pZCBhdXRvY29tcGxldGVfbW9kdWxlKGNoYXIgKmNvbW1hbmQsIGNoYXIgKm1vZHVsZSkKK3sKKyAgICBpbnQgaiA9IDA7CisgICAgY2hhciBhdXRvY29tcGxldGVfZnVsbF9saW5lW01BWF9MSU5FX1NJWkVdOworCisgICAgaWYgKHN0cm5jbXAoQ0xJX1NIT1csIGNvbW1hbmQsIHN0cmxlbihjb21tYW5kKSkgPT0gMCkgeworCWlmICghY3VycmVudF9tb2RlLT5zaG93X21vZHVsZXMgfHwgIWN1cnJlbnRfbW9kZS0+c2hvd19tb2R1bGVzLT5tb2R1bGVzKQorCSAgICByZXR1cm47CisKKwl3aGlsZSAoY3VycmVudF9tb2RlLT5zaG93X21vZHVsZXMtPm1vZHVsZXNbal0ubmFtZSkgeworCSAgICBpZiAoc3RybmNtcChjdXJyZW50X21vZGUtPnNob3dfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lLAorCQkJbW9kdWxlLCBzdHJsZW4obW9kdWxlKSkgPT0gMCkgeworCQlwcmludGYoIiVzXG4iLCBjdXJyZW50X21vZGUtPnNob3dfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKTsKKwkJc3ByaW50ZihhdXRvY29tcGxldGVfZnVsbF9saW5lLCAiJXMgJXMiLAorCQkJQ0xJX1NIT1csIGN1cnJlbnRfbW9kZS0+c2hvd19tb2R1bGVzLT5tb2R1bGVzW2pdLm5hbWUpOworCQlhdXRvY29tcGxldGVfYWRkX3Rva2VuX3RvX2xpc3QoYXV0b2NvbXBsZXRlX2Z1bGxfbGluZSk7CisJICAgIH0KKwkgICAgaisrOworCX0KKyAgICB9IGVsc2UgaWYgKHN0cm5jbXAoQ0xJX1NFVCwgY29tbWFuZCwgc3RybGVuKGNvbW1hbmQpKSA9PSAwKSB7CisJaiA9IDA7CisJaWYgKCFjdXJyZW50X21vZGUtPnNldF9tb2R1bGVzIHx8ICFjdXJyZW50X21vZGUtPnNldF9tb2R1bGVzLT5tb2R1bGVzKQorCSAgICByZXR1cm47CisKKwl3aGlsZSAoY3VycmVudF9tb2RlLT5zZXRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKSB7CisJICAgIGlmIChzdHJuY21wKGN1cnJlbnRfbW9kZS0+c2V0X21vZHVsZXMtPm1vZHVsZXNbal0ubmFtZSwKKwkJCW1vZHVsZSwgc3RybGVuKG1vZHVsZSkpID09IDApIHsKKwkJcHJpbnRmKCIlc1xuIiwgY3VycmVudF9tb2RlLT5zZXRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKTsKKwkJc3ByaW50ZihhdXRvY29tcGxldGVfZnVsbF9saW5lLCAiJXMgJXMiLAorCQkJQ0xJX1NFVCwgY3VycmVudF9tb2RlLT5zZXRfbW9kdWxlcy0+bW9kdWxlc1tqXS5uYW1lKTsKKwkJYXV0b2NvbXBsZXRlX2FkZF90b2tlbl90b19saXN0KGF1dG9jb21wbGV0ZV9mdWxsX2xpbmUpOworCSAgICB9CisJICAgIGorKzsKKwl9CisgICAgfQorfQorCisvKioKKyAqIGF1dG9jb21wbGV0ZSAtIGZpbmQgcG9zc2libGUgbWF0Y2hlcyBmb3IgYSBjb21tYW5kIGxpbmUKKyAqIEBsaW5lOgljb21tYW5kIGxpbmUgdG8gcGFyc2UKKyAqKi8KK3N0YXRpYyB2b2lkIGF1dG9jb21wbGV0ZShjaGFyICpsaW5lKQoreworICAgIGludCBpOworICAgIGludCBhcmdjID0gMDsKKyAgICBjaGFyICpjb21tYW5kID0gTlVMTCwgKm1vZHVsZSA9IE5VTEw7CisgICAgY2hhciAqKmFyZ3YgPSBOVUxMOworCisgICAgcGFyc2VfY29tbWFuZF9saW5lKGxpbmUsICZjb21tYW5kLCAmbW9kdWxlLCAmYXJnYywgYXJndik7CisKKyAgICBkcHJpbnRmKCJDTEkgREVCVUcgYXV0b2NvbXBsZXRlOiBiZWZvcmUgY2hlY2tpbmcgYXJnc1xuIik7CisgICAgLyogSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFyZ3VtZW50cywgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gY29tcGxldGUgKi8KKyAgICBpZiAoYXJnYyAhPSAwKQorCWdvdG8gb3V0OworCisgICAgLyogTm8gYXJndW1lbnQsICh0aGUgc3RhcnQgb2YpIGEgbW9kdWxlIGhhcyBiZWVuIHNwZWNpZmllZCAqLworICAgIGlmIChtb2R1bGUgIT0gTlVMTCkgeworCWF1dG9jb21wbGV0ZV9tb2R1bGUoY29tbWFuZCwgbW9kdWxlKTsKKwlmcmVlKG1vZHVsZSk7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgLyogTm8gYXJndW1lbnQsIG5vIG1vZHVsZSwgKHRoZSBzdGFydCBvZikgYSBjb21tYW5kIGhhcyBiZWVuIHNwZWNpZmllZCAqLworICAgIGlmIChjb21tYW5kICE9IE5VTEwpIHsKKwlhdXRvY29tcGxldGVfY29tbWFuZChjb21tYW5kKTsKKwlmcmVlKGNvbW1hbmQpOworCWdvdG8gb3V0OworICAgIH0KKworb3V0OgorICAgIC8qIExldCdzIG5vdCBmb3JnZXQgdG8gY2xlYW4gb3Vyc2VsdmVzICovCisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKwlmcmVlKGFyZ3ZbaV0pOworICAgIGlmIChhcmdjID4gMCkKKwlmcmVlKGFyZ3YpOworICAgIHJldHVybjsKK30KKworLyoqCisgKiBleGVjX2NvbW1hbmQgLSBtYWluIGxvZ2ljIHRvIG1hcCB0aGUgY29tbWFuZCBsaW5lIHRvIGNhbGxiYWNrcworICoqLworc3RhdGljIHZvaWQgZXhlY19jb21tYW5kKGNoYXIgKmxpbmUsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpbnQgYXJnYywgaSA9IDA7CisgICAgY2hhciAqY29tbWFuZCA9IE5VTEwsICptb2R1bGUgPSBOVUxMOworICAgIGNoYXIgKiphcmd2ID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2xpX2NhbGxiYWNrX2Rlc2NyICpjdXJyZW50X21vZHVsZSA9IE5VTEw7CisKKyAgICAvKiBUaGlzIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGZvciBjb21tYW5kIGFuZCBtb2R1bGUgKi8KKyAgICBwYXJzZV9jb21tYW5kX2xpbmUobGluZSwgJmNvbW1hbmQsICZtb2R1bGUsICZhcmdjLCBhcmd2KTsKKworICAgIGRwcmludGYoIkNMSSBERUJVRyBleGVjOiBDaGVja2luZyBmb3IgYWxpYXNlc1xuIik7CisgICAgLyoKKyAgICAgKiBFeHBhbmQgc2hvcnRjdXRzLCBpZiBuZWVkZWQKKyAgICAgKiBUaGlzIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGZvciBhcmdjL2FyZ3YKKyAgICAgKi8KKyAgICBleHBhbmRfYWxpYXNlcyhsaW5lLCAmY29tbWFuZCwgJm1vZHVsZSwgJmFyZ2MsIGFyZ3YpOworICAgIAorICAgIGZpbmRfY2xpX2NhbGxiYWNrX2Rlc2NyKGNvbW1hbmQsIGN1cnJlbnRfbW9kZS0+ZGVmYXVsdF9tb2R1bGVzLAorCQkJCSZjdXJyZW50X21vZHVsZSk7CisKKyAgICBpZiAoKG1vZHVsZSA9PSBOVUxMKSB8fCAoY3VycmVudF9tb2R1bGUtPm5vbW9kdWxlID09IHRydWUpKSB7CisJZHByaW50ZigiQ0xJIERFQlVHIGV4ZWMgOiBzaW5nbGUgY29tbWFuZCBkZXRlY3RlZFxuIik7CisJLyoKKwkgKiBBIHNpbmdsZSB3b3JkIHdhcyBzcGVjaWZpZWQ6IGxvb2sgYXQgdGhlIGxpc3Qgb2YgZGVmYXVsdAorCSAqIGNvbW1hbmRzIGluIHRoZSBjdXJyZW50IG1vZGUgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2guCisJICogSWYgbm90LCBpdCBtYXkgYmUgYSBnZW5lcmljIGZ1bmN0aW9uIChleGl0LCBoZWxwLCAuLi4pLiBUaGVzZQorCSAqIGFyZSBzdG9yZWQgaW4gdGhlIGxpc3Qgb2YgZGVmYXVsdCBjb21tYW5kcyBvZiB0aGUgaGR0IG1vZGUuCisJICovCisKKwkvKiBGaXJzdCBvZiBhbGwgaXQgdGhlIGNvbW1hbmQgZG9lc24ndCBuZWVkIG1vZHVsZSwgbGV0J3MgcmV3b3JrIHRoZSBhcmd1bWVudHMgKi8KKwlpZiAoKGN1cnJlbnRfbW9kdWxlLT5ub21vZHVsZSA9PSB0cnVlKSAmJiAoIG1vZHVsZSAhPSBOVUxMKSkgeworCQlkcHJpbnRmKCJDTElfREVCVUcgZXhlYzogUmV3b3JraW5nIGFyZ3VtZW50cyB3aXRoIGFyZ2M9JWRcbiIsYXJnYyk7CisJCWNoYXIgKipuZXdfYXJndj1OVUxMOworICAgIAkJbmV3X2FyZ3Y9bWFsbG9jKChhcmdjICsgMikqc2l6ZW9mKGNoYXIgKikpOworCQlmb3IgKGludCBhcmdjX2l0ZXI9MDsgYXJnY19pdGVyPGFyZ2M7IGFyZ2NfaXRlcisrKSB7CisJCQlkcHJpbnRmKCJDTElfREVCVUcgZXhlYyByZXdvcmsgOiBjb3B5ICVkIHRvICVkICglcylcbiIsYXJnY19pdGVyLGFyZ2NfaXRlcisxLGFyZ3ZbYXJnY19pdGVyXSk7CisJCQluZXdfYXJndlthcmdjX2l0ZXIrMV0gPSBtYWxsb2Moc3RybGVuKGFyZ3ZbYXJnY19pdGVyXSkpOworCQkJc3RybGNweShuZXdfYXJndlthcmdjX2l0ZXIrMV0sIGFyZ3ZbYXJnY19pdGVyXSwgc3RybGVuKGFyZ3ZbYXJnY19pdGVyXSkpOworCQkJZnJlZShhcmd2W2FyZ2NfaXRlcl0pOworCQl9CisJCW5ld19hcmd2WzBdID0gbWFsbG9jKHN0cmxlbihtb2R1bGUpKnNpemVvZihjaGFyKSk7CisJCXN0cmxjcHkobmV3X2FyZ3ZbMF0sIG1vZHVsZSwgc3RybGVuKG1vZHVsZSkpOworCQlhcmdjKys7CisJCWZyZWUoYXJndik7CisJCWFyZ3Y9bmV3X2FyZ3Y7CisJfQorCisJaWYgKGN1cnJlbnRfbW9kdWxlICE9IE5VTEwpCisJICAgIGN1cnJlbnRfbW9kdWxlLT5leGVjKGFyZ2MsIGFyZ3YsIGhhcmR3YXJlKTsKKwllbHNlIGlmICghc3RybmNtcChjb21tYW5kLCBDTElfU0hPVywgc2l6ZW9mKENMSV9TSE9XKSAtIDEpICYmCisJCSBjdXJyZW50X21vZGUtPnNob3dfbW9kdWxlcyAhPSBOVUxMICYmCisJCSBjdXJyZW50X21vZGUtPnNob3dfbW9kdWxlcy0+ZGVmYXVsdF9jYWxsYmFjayAhPSBOVUxMKQorCSAgICBjdXJyZW50X21vZGUtPnNob3dfbW9kdWxlcy0+ZGVmYXVsdF9jYWxsYmFjayhhcmdjLCBhcmd2LCBoYXJkd2FyZSk7CisJZWxzZSBpZiAoIXN0cm5jbXAoY29tbWFuZCwgQ0xJX1NFVCwgc2l6ZW9mKENMSV9TRVQpIC0gMSkgJiYKKwkJIGN1cnJlbnRfbW9kZS0+c2V0X21vZHVsZXMgIT0gTlVMTCAmJgorCQkgY3VycmVudF9tb2RlLT5zZXRfbW9kdWxlcy0+ZGVmYXVsdF9jYWxsYmFjayAhPSBOVUxMKQorCSAgICBjdXJyZW50X21vZGUtPnNldF9tb2R1bGVzLT5kZWZhdWx0X2NhbGxiYWNrKGFyZ2MsIGFyZ3YsIGhhcmR3YXJlKTsKKwllbHNlIHsKKwkgICAgZmluZF9jbGlfY2FsbGJhY2tfZGVzY3IoY29tbWFuZCwgaGR0X21vZGUuZGVmYXVsdF9tb2R1bGVzLAorCQkJCSAgICAmY3VycmVudF9tb2R1bGUpOworCSAgICBpZiAoY3VycmVudF9tb2R1bGUgIT0gTlVMTCkKKwkJY3VycmVudF9tb2R1bGUtPmV4ZWMoYXJnYywgYXJndiwgaGFyZHdhcmUpOworCSAgICBlbHNlCisJCW1vcmVfcHJpbnRmKCJ1bmtub3duIGNvbW1hbmQ6ICclcydcbiIsIGNvbW1hbmQpOworCX0KKyAgICB9IGVsc2UgeworCS8qCisJICogQSBtb2R1bGUgaGFzIGJlZW4gc3BlY2lmaWVkISBXZSBub3cgbmVlZCB0byBmaW5kIHRoZSB0eXBlIG9mIGNvbW1hbmQuCisJICoKKwkgKiBUaGUgc3ludGF4IG9mIHRoZSBjbGkgaXMgdGhlIGZvbGxvd2luZzoKKwkgKiAgICA8dHlwZSBvZiBjb21tYW5kPiA8bW9kdWxlIG9uIHdoaWNoIHRvIG9wZXJhdGU+IDxhcmdzPgorCSAqIGUuZy4KKwkgKiAgICBkbWk+IHNob3cgc3lzdGVtCisJICogICAgZG1pPiBzaG93IGJhbmsgMQorCSAqICAgIGRtaT4gc2hvdyBtZW1vcnkgMCAxCisJICogICAgcGNpPiBzaG93IGRldmljZSAxMgorCSAqICAgIGhkdD4gc2V0IG1vZGUgZG1pCisJICovCisJaWYgKCFzdHJuY21wKGNvbW1hbmQsIENMSV9TSE9XLCBzaXplb2YoQ0xJX1NIT1cpIC0gMSkpIHsKKwkgICAgZHByaW50ZigiQ0xJIERFQlVHIGV4ZWM6ICVzIGNvbW1hbmQgZGV0ZWN0ZWRcbiIsIENMSV9TSE9XKTsKKwkgICAgLyogTG9vayBmaXJzdCBmb3IgYSAnc2hvdycgY2FsbGJhY2sgaW4gdGhlIGN1cnJlbnQgbW9kZSAqLworCSAgICBmaW5kX2NsaV9jYWxsYmFja19kZXNjcihtb2R1bGUsIGN1cnJlbnRfbW9kZS0+c2hvd19tb2R1bGVzLAorCQkJCSAgICAmY3VycmVudF9tb2R1bGUpOworCSAgICAvKiBFeGVjdXRlIHRoZSBjYWxsYmFjaywgaWYgZm91bmQgKi8KKwkgICAgaWYgKGN1cnJlbnRfbW9kdWxlICE9IE5VTEwpCisJCWN1cnJlbnRfbW9kdWxlLT5leGVjKGFyZ2MsIGFyZ3YsIGhhcmR3YXJlKTsKKwkgICAgZWxzZSB7CisJCWRwcmludGYoIkNMSSBERUJVRyBleGVjOiBMb29raW5nIGZvciBjYWxsYmFja1xuIik7CisJCS8qIExvb2sgbm93IGZvciBhICdzaG93JyBjYWxsYmFjayBpbiB0aGUgaGR0IG1vZGUgKi8KKwkJZmluZF9jbGlfY2FsbGJhY2tfZGVzY3IobW9kdWxlLCBoZHRfbW9kZS5zaG93X21vZHVsZXMsCisJCQkJCSZjdXJyZW50X21vZHVsZSk7CisJCS8qIEV4ZWN1dGUgdGhlIGNhbGxiYWNrLCBpZiBmb3VuZCAqLworCQlpZiAoY3VycmVudF9tb2R1bGUgIT0gTlVMTCkKKwkJICAgIGN1cnJlbnRfbW9kdWxlLT5leGVjKGFyZ2MsIGFyZ3YsIGhhcmR3YXJlKTsKKwkJZWxzZQorCQkgICAgcHJpbnRmKCJ1bmtub3duIG1vZHVsZTogJyVzJ1xuIiwgbW9kdWxlKTsKKwkgICAgfQorCX0gZWxzZSBpZiAoIXN0cm5jbXAoY29tbWFuZCwgQ0xJX1NFVCwgc2l6ZW9mKENMSV9TRVQpIC0gMSkpIHsKKwkgICAgZHByaW50ZigiQ0xJIERFQlVHIGV4ZWMgOiAlcyBjb21tYW5kIGRldGVjdGVkXG4iLCBDTElfU0VUKTsKKwkgICAgLyogTG9vayBub3cgZm9yIGEgJ3NldCcgY2FsbGJhY2sgaW4gdGhlIGhkdCBtb2RlICovCisJICAgIGZpbmRfY2xpX2NhbGxiYWNrX2Rlc2NyKG1vZHVsZSwgY3VycmVudF9tb2RlLT5zZXRfbW9kdWxlcywKKwkJCQkgICAgJmN1cnJlbnRfbW9kdWxlKTsKKwkgICAgLyogRXhlY3V0ZSB0aGUgY2FsbGJhY2ssIGlmIGZvdW5kICovCisJICAgIGlmIChjdXJyZW50X21vZHVsZSAhPSBOVUxMKQorCQljdXJyZW50X21vZHVsZS0+ZXhlYyhhcmdjLCBhcmd2LCBoYXJkd2FyZSk7CisJICAgIGVsc2UgeworCQkvKiBMb29rIG5vdyBmb3IgYSAnc2V0JyBjYWxsYmFjayBpbiB0aGUgaGR0IG1vZGUgKi8KKwkJZmluZF9jbGlfY2FsbGJhY2tfZGVzY3IobW9kdWxlLCBoZHRfbW9kZS5zZXRfbW9kdWxlcywKKwkJCQkJJmN1cnJlbnRfbW9kdWxlKTsKKwkJLyogRXhlY3V0ZSB0aGUgY2FsbGJhY2ssIGlmIGZvdW5kICovCisJCWlmIChjdXJyZW50X21vZHVsZSAhPSBOVUxMKQorCQkgICAgY3VycmVudF9tb2R1bGUtPmV4ZWMoYXJnYywgYXJndiwgaGFyZHdhcmUpOworCQllbHNlCisJCSAgICBwcmludGYoInVua25vd24gbW9kdWxlOiAnJXMnXG4iLCBtb2R1bGUpOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIExldCdzIG5vdCBmb3JnZXQgdG8gY2xlYW4gb3Vyc2VsdmVzICovCisgICAgaWYgKGNvbW1hbmQgIT0gTlVMTCkKKwlmcmVlKGNvbW1hbmQpOworICAgIGlmIChtb2R1bGUgIT0gTlVMTCkKKwlmcmVlKG1vZHVsZSk7CisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKwlmcmVlKGFyZ3ZbaV0pOworICAgIGlmIChhcmdjID4gMCkKKwlmcmVlKGFyZ3YpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9wcm9tcHQodm9pZCkKK3sKKyAgICAvKiBObyBuZWVkIHRvIGRpc3BsYXkgdGhlIHByb21wdCBpZiB3ZSBleGl0ICovCisgICAgaWYgKGhkdF9jbGkubW9kZSAhPSBFWElUX01PREUpIHsKKwlwcmludGYoIiVzIiwgaGR0X2NsaS5wcm9tcHQpOworCS8qIFJlc2V0IHRoZSBsaW5lICovCisJaGR0X2NsaS5jdXJzb3JfcG9zID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgc3RhcnRfYXV0b19tb2RlKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBjaGFyICpteXBjaDsKKyAgICBpbnQgbmJfY29tbWFuZHMgPSAwOworICAgIGNoYXIgKmNvbW1hbmRzW01BWF9OQl9BVVRPX0NPTU1BTkRTXTsKKworICAgIG1vcmVfcHJpbnRmKCJcbkVudGVyaW5nIEF1dG8gbW9kZVxuIik7CisKKyAgICAvKiBQcm90ZWN0aW5nIHRoZSBhdXRvX2xhYmVsIGZyb20gdGhlIHN0cnRvayBtb2RpZmljYXRpb25zICovCisgICAgY2hhciAqdGVtcCA9IHN0cmR1cChoYXJkd2FyZS0+YXV0b19sYWJlbCk7CisKKyAgICAvKiBTZWFyY2hpbmcgJiBzYXZpbmcgYWxsIGNvbW1hbmRzICovCisgICAgbXlwY2ggPSBzdHJ0b2sodGVtcCwgQVVUT19TRVBBUkFUT1IpOworICAgIHdoaWxlIChteXBjaCAhPSBOVUxMKSB7CisJaWYgKChzdHJsZW4ocmVtb3ZlX3NwYWNlcyhteXBjaCkpID4gMCkgJiYKKwkgICAgKHJlbW92ZV9zcGFjZXMobXlwY2gpWzBdICE9IEFVVE9fU0VQQVJBVE9SWzBdKSkgeworCSAgICBuYl9jb21tYW5kcysrOworCSAgICBpZiAoKGNvbW1hbmRzW25iX2NvbW1hbmRzXSA9IG1hbGxvYyhBVVRPX0NPTU1BTkRfU0laRSkpICE9IE5VTEwpIHsKKwkJc3ByaW50Zihjb21tYW5kc1tuYl9jb21tYW5kc10sICIlcyIsIHJlbW92ZV9zcGFjZXMobXlwY2gpKTsKKwkgICAgfSBlbHNlCisJCW5iX2NvbW1hbmRzLS07CisJfQorCW15cGNoID0gc3RydG9rKE5VTEwsIEFVVE9fU0VQQVJBVE9SKTsKKyAgICB9CisKKyAgICBmcmVlKHRlbXApOworCisgICAgLyogRXhlY3V0aW5nIGZvdW5kIGNvbW1hbmRzICovCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbmJfY29tbWFuZHM7IGkrKykgeworCWlmIChjb21tYW5kc1tpXSkgeworCSAgICBpZiAoIXF1aWV0KQorCQltb3JlX3ByaW50ZigiJXMlc1xuIiwgaGR0X2NsaS5wcm9tcHQsIGNvbW1hbmRzW2ldKTsKKwkgICAgZXhlY19jb21tYW5kKGNvbW1hbmRzW2ldLCBoYXJkd2FyZSk7CisJICAgIGZyZWUoY29tbWFuZHNbaV0pOworCX0KKyAgICB9CisKKyAgICBpZiAoIXF1aWV0KQorCW1vcmVfcHJpbnRmKCJcbkV4aXRpbmcgQXV0byBtb2RlXG4iKTsKKworICAgIG1vcmVfcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHByaW50X2hpc3RvcnkoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqIGhhcmR3YXJlKQoreworICAgICh2b2lkKWFyZ2M7CisgICAgKHZvaWQpYXJndjsKKyAgICAodm9pZCloYXJkd2FyZTsKKworICAgIHJlc2V0X21vcmVfcHJpbnRmKCk7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTUFYX0hJU1RPUllfU0laRTsgaSsrKSB7CisJaWYgKGkgPT0gaGR0X2NsaS5oaXN0b3J5X3BvcykgeworCSAgICBtb3JlX3ByaW50ZigiKiVkOiclcydcbiIsIGksIGhkdF9jbGkuaGlzdG9yeVtpXSk7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoc3RybGVuKGhkdF9jbGkuaGlzdG9yeVtpXSkgPT0gMCkKKwkgICAgY29udGludWU7CisJbW9yZV9wcmludGYoIiAlZDonJXMnXG4iLCBpLCBoZHRfY2xpLmhpc3RvcnlbaV0pOworICAgIH0KK30KKworLyogQ29kZSB0aGF0IG1hbmFnZXMgdGhlIGNsaSBtb2RlICovCit2b2lkIHN0YXJ0X2NsaV9tb2RlKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpbnQgY3VycmVudF9rZXkgPSAwOworICAgIGludCBmdXR1cmVfaGlzdG9yeV9wb3MgPSAxOwkvKiBwb3NpdGlvbiBvZiB0aGUgbmV4dCBwb3NpdGlvbiBpbiB0aGUgaGlzdG9yeSAqLworICAgIGludCBjdXJyZW50X2Z1dHVyZV9oaXN0b3J5X3BvcyA9IDE7CS8qIFRlbXAgdmFyaWFibGUgKi8KKyAgICBib29sIGRpc3BsYXlfaGlzdG9yeSA9IHRydWU7CS8qIFRlbXAgVmFyaWFibGUgKi8KKyAgICBjaGFyIHRlbXBfY29tbWFuZFtNQVhfTElORV9TSVpFXTsKKworICAgIGhkdF9jbGkuY3Vyc29yX3BvcyA9IDA7CisgICAgbWVtc2V0KGhkdF9jbGkuaGlzdG9yeSwgMCwgc2l6ZW9mKGhkdF9jbGkuaGlzdG9yeSkpOworICAgIGhkdF9jbGkuaGlzdG9yeV9wb3MgPSAxOworICAgIGhkdF9jbGkubWF4X2hpc3RvcnlfcG9zID0gMTsKKworICAgIC8qIEZpbmQgdGhlIG1vZGUgc2VsZWN0ZWQgKi8KKyAgICBzZXRfbW9kZShIRFRfTU9ERSwgaGFyZHdhcmUpOworICAgIGZpbmRfY2xpX21vZGVfZGVzY3IoaGR0X2NsaS5tb2RlLCAmY3VycmVudF9tb2RlKTsKKyAgICBpZiAoY3VycmVudF9tb2RlID09IE5VTEwpIHsKKwkvKiBTaG91bGRuJ3QgZ2V0IGhlcmUuLi4gKi8KKwltb3JlX3ByaW50ZigiISEhIEJVRzogTW9kZSAnJWQnIHVua25vd24uXG4iLCBoZHRfY2xpLm1vZGUpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBTdGFydCB0aGUgYXV0byBtb2RlIGlmIHRoZSBjb21tYW5kIGxpbmUgaXMgc2V0ICovCisgICAgaWYgKHN0cmxlbihoYXJkd2FyZS0+YXV0b19sYWJlbCkgPiAwKSB7CisJc3RhcnRfYXV0b19tb2RlKGhhcmR3YXJlKTsKKyAgICB9CisKKyAgICBtb3JlX3ByaW50ZigiRW50ZXJpbmcgQ0xJIG1vZGVcbiIpOworCisgICAgcmVzZXRfcHJvbXB0KCk7CisKKyAgICB3aGlsZSAoaGR0X2NsaS5tb2RlICE9IEVYSVRfTU9ERSkgeworCisJLyogRGlzcGxheSB0aGUgY3Vyc29yICovCisJZGlzcGxheV9jdXJzb3IodHJ1ZSk7CisKKwkvKiBMZXQncyBwdXQgdGhlIGN1cnNvciBibGlua2luZyB1bnRpbCB3ZSBnZXQgYW4gaW5wdXQgKi8KKwlzZXRfY3Vyc29yX2JsaW5rKHRydWUpOworCisJLyogV2Ugd2FpdCBlbmRsZXNzbHkgZm9yIGEga2V5Ym9hcmQgaW5wdXQgKi8KKwljdXJyZW50X2tleSA9IGdldF9rZXkoc3RkaW4sIDApOworCisJLyogV2UgaGF2ZSB0byBjYW5jZWwgdGhlIGJsaW5raW5nIG1vZGUgdG8gcHJldmVudAorCSAqIGlucHV0IHRleHQgdG8gYmxpbmsgKi8KKwlzZXRfY3Vyc29yX2JsaW5rKGZhbHNlKTsKKworCS8qIFJlc2V0IGF1dG9jb21wbGV0ZSBidWZmZXIgdW5sZXNzIFRBQiBpcyBwcmVzc2VkICovCisJaWYgKGN1cnJlbnRfa2V5ICE9IEtFWV9UQUIpCisJICAgIGF1dG9jb21wbGV0ZV9kZXN0cm95X2xpc3QoKTsKKworCXN3aXRjaCAoY3VycmVudF9rZXkpIHsKKwkgICAgLyogY2xlYXIgdW50aWwgdGhlbiBlbmQgb2YgbGluZSAqLworCWNhc2UgS0VZX0NUUkwoJ2snKToKKwkgICAgLyogQ2xlYXIgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworCSAgICBjbGVhcl9lbmRfb2ZfbGluZSgpOworCSAgICBtZW1zZXQoJklOUFVUW2hkdF9jbGkuY3Vyc29yX3Bvc10sIDAsCisJCSAgIHN0cmxlbihJTlBVVCkgLSBoZHRfY2xpLmN1cnNvcl9wb3MpOworCSAgICBicmVhazsKKworCWNhc2UgS0VZX0NUUkwoJ2MnKToKKwkgICAgcHJpbnRmKCJcbiIpOworCSAgICByZXNldF9wcm9tcHQoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9MRUZUOgorCSAgICBpZiAoaGR0X2NsaS5jdXJzb3JfcG9zID4gMCkgeworCQltb3ZlX2N1cnNvcl9sZWZ0KDEpOworCQloZHRfY2xpLmN1cnNvcl9wb3MtLTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX1JJR0hUOgorCSAgICBpZiAoaGR0X2NsaS5jdXJzb3JfcG9zIDwgKGludClzdHJsZW4oSU5QVVQpKSB7CisJCW1vdmVfY3Vyc29yX3JpZ2h0KDEpOworCQloZHRfY2xpLmN1cnNvcl9wb3MrKzsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX0NUUkwoJ2UnKToKKwljYXNlIEtFWV9FTkQ6CisJICAgIC8qIENhbGxpbmcgd2l0aCBhIDAgdmFsdWUgd2lsbCBtYWtlIHRoZSBjdXJzb3IgbW92ZSAqLworCSAgICAvKiBTbywgbGV0J3MgbW92ZSB0aGUgY3Vyc29yIG9ubHkgaWYgbmVlZGVkICovCisJICAgIGlmICgoc3RybGVuKElOUFVUKSAtIGhkdF9jbGkuY3Vyc29yX3BvcykgPiAwKSB7CisJCS8qIFJldHVybiB0byB0aGUgYmVnaW5pbmcgb2YgbGluZSAqLworCQltb3ZlX2N1cnNvcl9yaWdodChzdHJsZW4oSU5QVVQpIC0gaGR0X2NsaS5jdXJzb3JfcG9zKTsKKwkJaGR0X2NsaS5jdXJzb3JfcG9zID0gc3RybGVuKElOUFVUKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX0NUUkwoJ2EnKToKKwljYXNlIEtFWV9IT01FOgorCSAgICAvKiBDYWxsaW5nIHdpdGggYSAwIHZhbHVlIHdpbGwgbWFrZSB0aGUgY3Vyc29yIG1vdmUgKi8KKwkgICAgLyogU28sIGxldCdzIG1vdmUgdGhlIGN1cnNvciBvbmx5IGlmIG5lZWRlZCAqLworCSAgICBpZiAoaGR0X2NsaS5jdXJzb3JfcG9zID4gMCkgeworCQkvKiBSZXR1cm4gdG8gdGhlIGJlZ2luaW5nIG9mIGxpbmUgKi8KKwkJbW92ZV9jdXJzb3JfbGVmdChoZHRfY2xpLmN1cnNvcl9wb3MpOworCQloZHRfY2xpLmN1cnNvcl9wb3MgPSAwOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfVVA6CisKKwkgICAgLyogU2F2aW5nIGZ1dHVyZSBwb3NpdGlvbiAqLworCSAgICBjdXJyZW50X2Z1dHVyZV9oaXN0b3J5X3BvcyA9IGZ1dHVyZV9oaXN0b3J5X3BvczsKKworCSAgICAvKiBXZSBoYXZlIHRvIGNvbXB1dGUgdGhlIG5leHQgcG9zaXRpb24gKi8KKwkgICAgaWYgKGZ1dHVyZV9oaXN0b3J5X3BvcyA9PSAxKSB7CisJCWZ1dHVyZV9oaXN0b3J5X3BvcyA9IE1BWF9ISVNUT1JZX1NJWkU7CisJICAgIH0gZWxzZSB7CisJCWZ1dHVyZV9oaXN0b3J5X3Bvcy0tOworCSAgICB9CisKKwkgICAgLyogRG9lcyB0aGUgbmV4dCBwb3NpdGlvbiBpcyB2YWxpZCAqLworCSAgICBpZiAoc3RybGVuKGhkdF9jbGkuaGlzdG9yeVtmdXR1cmVfaGlzdG9yeV9wb3NdKSA9PSAwKSB7CisJCS8qIFBvc2l0aW9uIGlzIGludmFsaWQsIHJlc3RvcmluZyBwb3NpdGlvbiAqLworCQlmdXR1cmVfaGlzdG9yeV9wb3MgPSBjdXJyZW50X2Z1dHVyZV9oaXN0b3J5X3BvczsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICAvKiBMZXQncyBtYWtlIHRoYXQgZnV0dXJlIHBvc2l0aW9uIHRoZSBvbmUgd2UgdXNlICovCisJICAgIG1lbXNldChJTlBVVCwgMCwgc2l6ZW9mKElOUFVUKSk7CisJICAgIHN0cmxjcHkoSU5QVVQsIGhkdF9jbGkuaGlzdG9yeVtmdXR1cmVfaGlzdG9yeV9wb3NdLCBzaXplb2YoSU5QVVQpKTsKKworCSAgICAvKiBDbGVhciB0aGUgbGluZSAqLworCSAgICBjbGVhcl9saW5lKCk7CisKKwkgICAgLyogTW92ZSB0byB0aGUgYmVnaW5pbmcgb2YgbGluZSAqLworCSAgICBtb3ZlX2N1cnNvcl90b19jb2x1bW4oMCk7CisKKwkgICAgcmVzZXRfcHJvbXB0KCk7CisJICAgIHByaW50ZigiJXMiLCBJTlBVVCk7CisJICAgIGhkdF9jbGkuY3Vyc29yX3BvcyA9IHN0cmxlbihJTlBVVCk7CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfRE9XTjoKKwkgICAgZGlzcGxheV9oaXN0b3J5ID0gdHJ1ZTsKKworCSAgICAvKiBTYXZpbmcgZnV0dXJlIHBvc2l0aW9uICovCisJICAgIGN1cnJlbnRfZnV0dXJlX2hpc3RvcnlfcG9zID0gZnV0dXJlX2hpc3RvcnlfcG9zOworCisJICAgIGlmIChmdXR1cmVfaGlzdG9yeV9wb3MgPT0gTUFYX0hJU1RPUllfU0laRSkgeworCQlmdXR1cmVfaGlzdG9yeV9wb3MgPSAxOworCSAgICB9IGVsc2UgeworCQlmdXR1cmVfaGlzdG9yeV9wb3MrKzsKKwkgICAgfQorCisJICAgIC8qIERvZXMgdGhlIG5leHQgcG9zaXRpb24gaXMgdmFsaWQgKi8KKwkgICAgaWYgKHN0cmxlbihoZHRfY2xpLmhpc3RvcnlbZnV0dXJlX2hpc3RvcnlfcG9zXSkgPT0gMCkKKwkJZGlzcGxheV9oaXN0b3J5ID0gZmFsc2U7CisKKwkgICAgLyogQW4gZXhjZXB0aW9uIGlzIG1hZGUgdG8gcmVhY2ggdGhlIGxhc3QgZW1wdHkgbGluZSAqLworCSAgICBpZiAoZnV0dXJlX2hpc3RvcnlfcG9zID09IGhkdF9jbGkubWF4X2hpc3RvcnlfcG9zKQorCQlkaXNwbGF5X2hpc3RvcnkgPSB0cnVlOworCisJICAgIGlmIChkaXNwbGF5X2hpc3RvcnkgPT0gZmFsc2UpIHsKKwkJLyogUG9zaXRpb24gaXMgaW52YWxpZCwgcmVzdG9yaW5nIHBvc2l0aW9uICovCisJCWZ1dHVyZV9oaXN0b3J5X3BvcyA9IGN1cnJlbnRfZnV0dXJlX2hpc3RvcnlfcG9zOworCQlicmVhazsKKwkgICAgfQorCisJICAgIC8qIExldCdzIG1ha2UgdGhhdCBmdXR1cmUgcG9zaXRpb24gdGhlIG9uZSB3ZSB1c2UgKi8KKwkgICAgbWVtc2V0KElOUFVULCAwLCBzaXplb2YoSU5QVVQpKTsKKwkgICAgc3RybGNweShJTlBVVCwgaGR0X2NsaS5oaXN0b3J5W2Z1dHVyZV9oaXN0b3J5X3Bvc10sIHNpemVvZihJTlBVVCkpOworCisJICAgIC8qIENsZWFyIHRoZSBsaW5lICovCisJICAgIGNsZWFyX2xpbmUoKTsKKworCSAgICAvKiBNb3ZlIHRvIHRoZSBiZWdpbmluZyBvZiBsaW5lICovCisJICAgIG1vdmVfY3Vyc29yX3RvX2NvbHVtbigwKTsKKworCSAgICByZXNldF9wcm9tcHQoKTsKKwkgICAgcHJpbnRmKCIlcyIsIElOUFVUKTsKKwkgICAgaGR0X2NsaS5jdXJzb3JfcG9zID0gc3RybGVuKElOUFVUKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9UQUI6CisJICAgIGlmIChhdXRvY29tcGxldGVfYmFja2xvZykgeworCQljbGVhcl9saW5lKCk7CisJCS8qIE1vdmUgdG8gdGhlIGJlZ2luaW5nIG9mIGxpbmUgKi8KKwkJbW92ZV9jdXJzb3JfdG9fY29sdW1uKDApOworCQlyZXNldF9wcm9tcHQoKTsKKwkJcHJpbnRmKCIlcyIsIGF1dG9jb21wbGV0ZV9sYXN0X3NlZW4tPmF1dG9jb21wbGV0ZV90b2tlbik7CisJCXN0cmxjcHkoSU5QVVQsCisJCQlhdXRvY29tcGxldGVfbGFzdF9zZWVuLT5hdXRvY29tcGxldGVfdG9rZW4sCisJCQlzaXplb2YoSU5QVVQpKTsKKwkJaGR0X2NsaS5jdXJzb3JfcG9zID0gc3RybGVuKElOUFVUKTsKKworCQkvKiBDeWNsZSB0aHJvdWdoIHRoZSBsaXN0ICovCisJCWF1dG9jb21wbGV0ZV9sYXN0X3NlZW4gPSBhdXRvY29tcGxldGVfbGFzdF9zZWVuLT5uZXh0OworCQlpZiAoYXV0b2NvbXBsZXRlX2xhc3Rfc2VlbiA9PSBOVUxMKQorCQkgICAgYXV0b2NvbXBsZXRlX2xhc3Rfc2VlbiA9IGF1dG9jb21wbGV0ZV9oZWFkOworCSAgICB9IGVsc2UgeworCQlwcmludGYoIlxuIik7CisJCWF1dG9jb21wbGV0ZShza2lwX3NwYWNlcyhJTlBVVCkpOworCQlhdXRvY29tcGxldGVfbGFzdF9zZWVuID0gYXV0b2NvbXBsZXRlX2hlYWQ7CisKKwkJcHJpbnRmKCIlcyVzIiwgaGR0X2NsaS5wcm9tcHQsIElOUFVUKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX0VOVEVSOgorCSAgICBwcmludGYoIlxuIik7CisJICAgIGlmIChzdHJsZW4ocmVtb3ZlX3NwYWNlcyhJTlBVVCkpIDwgMSkgeworCQlyZXNldF9wcm9tcHQoKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZXhlY19jb21tYW5kKHJlbW92ZV9zcGFjZXMoSU5QVVQpLCBoYXJkd2FyZSk7CisJICAgIGhkdF9jbGkuaGlzdG9yeV9wb3MrKzsKKworCSAgICAvKiBEaWQgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSA/Ki8KKwkgICAgaWYgKGhkdF9jbGkuaGlzdG9yeV9wb3MgPiBNQVhfSElTVE9SWV9TSVpFKSB7CisJCS8qIExldCdzIHJldHVybiBhdCB0aGUgYmVnaW5uaW5nICovICAgIAorCQloZHRfY2xpLmhpc3RvcnlfcG9zID0gMTsKKwkgICAgfQorCisJICAgIC8qIERvZXMgdGhlIG5leHQgcG9zaXRpb24gaXMgYWxyZWFkeSB1c2VkID8KKwkgICAgICogSWYgeWVzLCB3ZSBhcmUgY3ljbGluZyBpbiBoaXN0b3J5ICovCisJICAgIGlmIChzdHJsZW4oSU5QVVQpID4gMCkgeworCQkvKiBMZXQncyBjbGVhbiB0aGF0IGVudHJ5ICovCisJCW1lbXNldCgmSU5QVVQsMCxzaXplb2YoSU5QVVQpKTsKKwkgICAgfQorCisJICAgIGZ1dHVyZV9oaXN0b3J5X3BvcyA9IGhkdF9jbGkuaGlzdG9yeV9wb3M7CisJICAgIGlmIChoZHRfY2xpLmhpc3RvcnlfcG9zID4gaGR0X2NsaS5tYXhfaGlzdG9yeV9wb3MpCisJCWhkdF9jbGkubWF4X2hpc3RvcnlfcG9zID0gaGR0X2NsaS5oaXN0b3J5X3BvczsKKwkgICAgcmVzZXRfcHJvbXB0KCk7CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfQ1RSTCgnZCcpOgorCWNhc2UgS0VZX0RFTEVURToKKwkgICAgLyogTm8gbmVlZCB0byBkZWxldGUgd2hlbiBpbnB1dCBpcyBlbXB0eSAqLworCSAgICBpZiAoc3RybGVuKElOUFVUKSA9PSAwKQorCQlicmVhazsKKwkgICAgLyogRG9uJ3QgZGVsZXRlIHdoZW4gY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKwkgICAgaWYgKGhkdF9jbGkuY3Vyc29yX3BvcyA+PSBzdHJsZW4oSU5QVVQpKQorCQlicmVhazsKKworCSAgICBmb3IgKGludCBjID0gaGR0X2NsaS5jdXJzb3JfcG9zOyBjIDwgKGludClzdHJsZW4oSU5QVVQpIC0gMTsgYysrKQorCQlJTlBVVFtjXSA9IElOUFVUW2MgKyAxXTsKKwkgICAgSU5QVVRbc3RybGVuKElOUFVUKSAtIDFdID0gJ1wwJzsKKworCSAgICAvKiBDbGVhciB0aGUgZW5kIG9mIHRoZSBsaW5lICovCisJICAgIGNsZWFyX2VuZF9vZl9saW5lKCk7CisKKwkgICAgLyogUHJpbnQgdGhlIHJlc3VsdGluZyBidWZmZXIgKi8KKwkgICAgcHJpbnRmKCIlcyIsIElOUFVUICsgaGR0X2NsaS5jdXJzb3JfcG9zKTsKKworCSAgICAvKiBSZXBsYWNlIHRoZSBjdXJzb3IgYXQgdGhlIHByb3BlciBwbGFjZSAqLworCSAgICBpZiAoc3RybGVuKElOUFVUICsgaGR0X2NsaS5jdXJzb3JfcG9zKSA+IDApCisJCW1vdmVfY3Vyc29yX2xlZnQoc3RybGVuKElOUFVUICsgaGR0X2NsaS5jdXJzb3JfcG9zKSk7CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfREVMOgorCWNhc2UgS0VZX0JBQ0tTUEFDRToKKwkgICAgLyogRG9uJ3QgZGVsZXRlIHByb21wdCAqLworCSAgICBpZiAoaGR0X2NsaS5jdXJzb3JfcG9zID09IDApCisJCWJyZWFrOworCisJICAgIGZvciAoaW50IGMgPSBoZHRfY2xpLmN1cnNvcl9wb3MgLSAxOworCQkgYyA8IChpbnQpc3RybGVuKElOUFVUKSAtIDE7IGMrKykKKwkJSU5QVVRbY10gPSBJTlBVVFtjICsgMV07CisJICAgIElOUFVUW3N0cmxlbihJTlBVVCkgLSAxXSA9ICdcMCc7CisKKwkgICAgLyogR2V0IG9uZSBjaGFyIGJhY2sgKi8KKwkgICAgbW92ZV9jdXJzb3JfbGVmdCgxKTsKKworCSAgICAvKiBDbGVhciB0aGUgZW5kIG9mIHRoZSBsaW5lICovCisJICAgIGNsZWFyX2VuZF9vZl9saW5lKCk7CisKKwkgICAgLyogUHJpbnQgdGhlIHJlc3VsdGluZyBidWZmZXIgKi8KKwkgICAgcHJpbnRmKCIlcyIsIElOUFVUICsgaGR0X2NsaS5jdXJzb3JfcG9zIC0gMSk7CisKKwkgICAgLyogUmVhbGluZyB0byBhIGNoYXIgYmVmb3JlIHRoZSBwbGFjZSB3ZSB3ZXJlICovCisJICAgIGhkdF9jbGkuY3Vyc29yX3Bvcy0tOworCSAgICBtb3ZlX2N1cnNvcl90b19jb2x1bW4oc3RybGVuKGhkdF9jbGkucHJvbXB0KSArIGhkdF9jbGkuY3Vyc29yX3BvcyArCisJCQkJICAxKTsKKworCSAgICBicmVhazsKKworCWNhc2UgS0VZX0YxOgorCSAgICBwcmludGYoIlxuIik7CisJICAgIGV4ZWNfY29tbWFuZChDTElfSEVMUCwgaGFyZHdhcmUpOworCSAgICByZXNldF9wcm9tcHQoKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBpZiAoKGN1cnJlbnRfa2V5IDwgMHgyMCkgfHwgKGN1cnJlbnRfa2V5ID4gMHg3ZSkpCisJCWJyZWFrOworCSAgICAvKiBQcmV2ZW50IG92ZXJmbG93ICovCisJICAgIGlmIChoZHRfY2xpLmN1cnNvcl9wb3MgPiBNQVhfTElORV9TSVpFIC0gMikKKwkJYnJlYWs7CisJICAgIC8qIElmIHdlIGFyZW4ndCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBsaW5lLCBsZXQncyBpbnNlcnQgKi8KKwkgICAgaWYgKGhkdF9jbGkuY3Vyc29yX3BvcyA8IChpbnQpc3RybGVuKElOUFVUKSkgeworCQljaGFyIGtleVsyXTsKKwkJaW50IHRyYWlsaW5nX2NoYXJzID0gc3RybGVuKElOUFVUKSAtIGhkdF9jbGkuY3Vyc29yX3BvczsKKwkJbWVtc2V0KHRlbXBfY29tbWFuZCwgMCwgc2l6ZW9mKHRlbXBfY29tbWFuZCkpOworCQlzdHJsY3B5KHRlbXBfY29tbWFuZCwgSU5QVVQsIGhkdF9jbGkuY3Vyc29yX3Bvcyk7CisJCXNwcmludGYoa2V5LCAiJWMiLCBjdXJyZW50X2tleSk7CisJCXN0cm5jYXQodGVtcF9jb21tYW5kLCBrZXksIDEpOworCQlzdHJuY2F0KHRlbXBfY29tbWFuZCwKKwkJCUlOUFVUICsgaGR0X2NsaS5jdXJzb3JfcG9zLCB0cmFpbGluZ19jaGFycyk7CisJCW1lbXNldChJTlBVVCwgMCwgc2l6ZW9mKElOUFVUKSk7CisJCXNucHJpbnRmKElOUFVULCBzaXplb2YoSU5QVVQpLCAiJXMiLCB0ZW1wX2NvbW1hbmQpOworCisJCS8qIENsZWFyIHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKwkJY2xlYXJfZW5kX29mX2xpbmUoKTsKKworCQkvKiBQcmludCB0aGUgcmVzdWx0aW5nIGJ1ZmZlciAqLworCQlwcmludGYoIiVzIiwgSU5QVVQgKyBoZHRfY2xpLmN1cnNvcl9wb3MpOworCisJCS8qIFJldHVybiB3aGVyZSB3ZSBtdXN0IHB1dCB0aGUgbmV3IGNoYXIgKi8KKwkJbW92ZV9jdXJzb3JfbGVmdCh0cmFpbGluZ19jaGFycyk7CisKKwkgICAgfSBlbHNlIHsKKwkJcHV0Y2hhcihjdXJyZW50X2tleSk7CisJCUlOUFVUW2hkdF9jbGkuY3Vyc29yX3Bvc10gPSBjdXJyZW50X2tleTsKKwkgICAgfQorCSAgICBoZHRfY2xpLmN1cnNvcl9wb3MrKzsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtY2xpLmggYi9jb20zMi9oZHQvaGR0LWNsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYTRmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWNsaS5oCkBAIC0wLDAgKzEsMjE2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgREVGSU5FX0hEVF9DTElfSAorI2RlZmluZSBERUZJTkVfSERUX0NMSV9ICisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnZXRrZXkuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisKKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisKKyNkZWZpbmUgTUFYX0xJTkVfU0laRSAyNTYKKworI2RlZmluZSBDTElfU1BBQ0UgIiAiCisjZGVmaW5lIENMSV9MRiAiXG4iCisjZGVmaW5lIENMSV9NRU5VICJtZW51IgorI2RlZmluZSBDTElfQ0xFQVIgImNsZWFyIgorI2RlZmluZSBDTElfRVhJVCAiZXhpdCIKKyNkZWZpbmUgQ0xJX0hFTFAgImhlbHAiCisjZGVmaW5lIENMSV9SRUJPT1QgInJlYm9vdCIKKyNkZWZpbmUgQ0xJX1NIT1cgInNob3ciCisjZGVmaW5lIENMSV9TRVQgInNldCIKKyNkZWZpbmUgQ0xJX01PREUgIm1vZGUiCisjZGVmaW5lIENMSV9IRFQgICJoZHQiCisjZGVmaW5lIENMSV9QQ0kgICJwY2kiCisjZGVmaW5lIENMSV9QWEUgICJweGUiCisjZGVmaW5lIENMSV9LRVJORUwgImtlcm5lbCIKKyNkZWZpbmUgQ0xJX1NZU0xJTlVYICJzeXNsaW51eCIKKyNkZWZpbmUgQ0xJX1ZFU0EgInZlc2EiCisjZGVmaW5lIENMSV9TVU1NQVJZICJzdW1tYXJ5IgorI2RlZmluZSBDTElfQ09NTUFORFMgImNvbW1hbmRzIgorI2RlZmluZSBDTElfRE1JICAiZG1pIgorI2RlZmluZSBDTElfQ1BVICAiY3B1IgorI2RlZmluZSBDTElfRElTSyAgImRpc2siCisjZGVmaW5lIENMSV9TSE9XX0xJU1QgImxpc3QiCisjZGVmaW5lIENMSV9JUlEgImlycSIKKyNkZWZpbmUgQ0xJX01PREVTICJtb2RlcyIKKyNkZWZpbmUgQ0xJX1ZQRCAgInZwZCIKKyNkZWZpbmUgQ0xJX01FTU9SWSAgIm1lbW9yeSIKKyNkZWZpbmUgQ0xJX0FDUEkgImFjcGkiCisjZGVmaW5lIENMSV9FTkFCTEUgImVuYWJsZSIKKyNkZWZpbmUgQ0xJX0RJU0FCTEUgImRpc2FibGUiCisjZGVmaW5lIENMSV9EVU1QICJkdW1wIgorI2RlZmluZSBDTElfU0FZICJzYXkiCisjZGVmaW5lIENMSV9ESVNQTEFZICJkaXNwbGF5IgorI2RlZmluZSBDTElfU0xFRVAgInNsZWVwIgorCit0eXBlZGVmIGVudW0geworICAgIElOVkFMSURfTU9ERSwKKyAgICBFWElUX01PREUsCisgICAgSERUX01PREUsCisgICAgUENJX01PREUsCisgICAgRE1JX01PREUsCisgICAgQ1BVX01PREUsCisgICAgUFhFX01PREUsCisgICAgS0VSTkVMX01PREUsCisgICAgU1lTTElOVVhfTU9ERSwKKyAgICBWRVNBX01PREUsCisgICAgRElTS19NT0RFLAorICAgIFZQRF9NT0RFLAorICAgIE1FTU9SWV9NT0RFLAorICAgIEFDUElfTU9ERQorfSBjbGlfbW9kZV90OworCisjZGVmaW5lIFBST01QVF9TSVpFIDMyCisjZGVmaW5lIE1BWF9ISVNUT1JZX1NJWkUgMzIKKyNkZWZpbmUgSU5QVVQgaGR0X2NsaS5oaXN0b3J5W2hkdF9jbGkuaGlzdG9yeV9wb3NdCitzdHJ1Y3Qgc19jbGkgeworICAgIGNsaV9tb2RlX3QgbW9kZTsKKyAgICBjaGFyIHByb21wdFtQUk9NUFRfU0laRV07CisgICAgdWludDhfdCBjdXJzb3JfcG9zOworICAgIGNoYXIgaGlzdG9yeVtNQVhfSElTVE9SWV9TSVpFKzFdW01BWF9MSU5FX1NJWkVdOworICAgIGludCBoaXN0b3J5X3BvczsKKyAgICBpbnQgbWF4X2hpc3RvcnlfcG9zOworfTsKK3N0cnVjdCBzX2NsaSBoZHRfY2xpOworCisvKiBEZXNjcmliZSBhIGNsaSBtb2RlICovCitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgeworICAgIGNvbnN0IHVuc2lnbmVkIGludCBtb2RlOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgLyogSGFuZGxlIDEtdG9rZW4gY29tbWFuZHMgKi8KKyAgICBzdHJ1Y3QgY2xpX21vZHVsZV9kZXNjciAqZGVmYXVsdF9tb2R1bGVzOworICAgIC8qIEhhbmRsZSBzaG93IDxtb2R1bGU+IDxhcmdzPiAqLworICAgIHN0cnVjdCBjbGlfbW9kdWxlX2Rlc2NyICpzaG93X21vZHVsZXM7CisgICAgLyogSGFuZGxlIHNldCA8bW9kdWxlPiA8YXJncz4gKi8KKyAgICBzdHJ1Y3QgY2xpX21vZHVsZV9kZXNjciAqc2V0X21vZHVsZXM7Cit9OworCisvKiBEZXNjcmliZSBhIHN1YnNldCBvZiBjb21tYW5kcyBpbiBhIG1vZHVsZSAoZGVmYXVsdCwgc2hvdywgc2V0LCAuLi4pICovCitzdHJ1Y3QgY2xpX21vZHVsZV9kZXNjciB7CisgICAgc3RydWN0IGNsaV9jYWxsYmFja19kZXNjciAqbW9kdWxlczsKKyAgICB2b2lkICgqZGVmYXVsdF9jYWxsYmFjaykgKGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSAgICAgIHN0cnVjdCBzX2hhcmR3YXJlICogaGFyZHdhcmUpOworfTsKKworLyogRGVzY3JpYmUgYSBjYWxsYmFjayAoYmVsb25ncyB0byBhIG1vZGUgYW5kIGEgbW9kdWxlKSAqLworc3RydWN0IGNsaV9jYWxsYmFja19kZXNjciB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB2b2lkICgqZXhlYykgKGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHNfaGFyZHdhcmUgKiBoYXJkd2FyZSk7CisgICAgYm9vbCBub21vZHVsZTsKK307CisKKy8qIE1hbmFnZSBhbGlhc2VzICovCisjZGVmaW5lIE1BWF9BTElBU0VTIDIKK3N0cnVjdCBjbGlfYWxpYXMgeworICAgIGNvbnN0IGNoYXIgKmNvbW1hbmQ7CS8qIE9yaWdpbmFsIGNvbW1hbmQgKi8KKyAgICBjb25zdCBpbnQgbmJfYWxpYXNlczsJLyogU2l6ZSBvZiBhbGlhc2VzIGFycmF5ICovCisgICAgY29uc3QgY2hhciAqKmFsaWFzZXM7CS8qIExpc3Qgb2YgYWxpYXNlcyAqLworfTsKKworLyogTGlzdCBvZiBpbXBsZW1lbnRlZCBtb2RlcyAqLworZXh0ZXJuIHN0cnVjdCBjbGlfbW9kZV9kZXNjciAqbGlzdF9tb2Rlc1tdOworc3RydWN0IGNsaV9tb2RlX2Rlc2NyIGhkdF9tb2RlOworc3RydWN0IGNsaV9tb2RlX2Rlc2NyIGRtaV9tb2RlOworc3RydWN0IGNsaV9tb2RlX2Rlc2NyIHN5c2xpbnV4X21vZGU7CitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgcHhlX21vZGU7CitzdHJ1Y3QgY2xpX21vZGVfZGVzY3Iga2VybmVsX21vZGU7CitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgY3B1X21vZGU7CitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgcGNpX21vZGU7CitzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgdmVzYV9tb2RlOworc3RydWN0IGNsaV9tb2RlX2Rlc2NyIGRpc2tfbW9kZTsKK3N0cnVjdCBjbGlfbW9kZV9kZXNjciB2cGRfbW9kZTsKK3N0cnVjdCBjbGlfbW9kZV9kZXNjciBtZW1vcnlfbW9kZTsKK3N0cnVjdCBjbGlfbW9kZV9kZXNjciBhY3BpX21vZGU7CisKKy8qIGNsaSBoZWxwZXJzICovCit2b2lkIGZpbmRfY2xpX21vZGVfZGVzY3IoY2xpX21vZGVfdCBtb2RlLCBzdHJ1Y3QgY2xpX21vZGVfZGVzY3IgKiptb2RlX2ZvdW5kKTsKK3ZvaWQgZmluZF9jbGlfY2FsbGJhY2tfZGVzY3IoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCisJCQkgICAgIHN0cnVjdCBjbGlfbW9kdWxlX2Rlc2NyICptb2R1bGVzX2xpc3QsCisJCQkgICAgIHN0cnVjdCBjbGlfY2FsbGJhY2tfZGVzY3IgKiptb2R1bGVfZm91bmQpOworY2xpX21vZGVfdCBtb2RlX3NfdG9fbW9kZV90KGNoYXIgKm5hbWUpOworCit2b2lkIHNldF9tb2RlKGNsaV9tb2RlX3QgbW9kZSwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKK3ZvaWQgc3RhcnRfY2xpX21vZGUoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKK3ZvaWQgc3RhcnRfYXV0b19tb2RlKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7Cit2b2lkIG1haW5fc2hvdyhjaGFyICppdGVtLCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworCisjZGVmaW5lIENMSV9ISVNUT1JZICJoaXN0b3J5Igordm9pZCBwcmludF9oaXN0b3J5KGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHNfaGFyZHdhcmUgKiBoYXJkd2FyZSk7CisKKy8vIERNSSBTVFVGRgorI2RlZmluZSBDTElfRE1JX0JBU0VfQk9BUkQgImJhc2VfYm9hcmQiCisjZGVmaW5lIENMSV9ETUlfQkFUVEVSWSAiYmF0dGVyeSIKKyNkZWZpbmUgQ0xJX0RNSV9CSU9TICJiaW9zIgorI2RlZmluZSBDTElfRE1JX0NIQVNTSVMgImNoYXNzaXMiCisjZGVmaW5lIENMSV9ETUlfTUVNT1JZICJtZW1vcnkiCisjZGVmaW5lIENMSV9ETUlfTUVNT1JZX0JBTksgImJhbmsiCisjZGVmaW5lIENMSV9ETUlfUFJPQ0VTU09SICJjcHUiCisjZGVmaW5lIENMSV9ETUlfU1lTVEVNICJzeXN0ZW0iCisjZGVmaW5lIENMSV9ETUlfSVBNSSAiaXBtaSIKKyNkZWZpbmUgQ0xJX0RNSV9DQUNIRSAiY2FjaGUiCisjZGVmaW5lIENMSV9ETUlfT0VNICJvZW0iCisjZGVmaW5lIENMSV9ETUlfU0VDVVJJVFkgInNlY3VyaXR5IgorI2RlZmluZSBDTElfRE1JX0xJU1QgQ0xJX1NIT1dfTElTVAordm9pZCBtYWluX3Nob3dfZG1pKGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKK3ZvaWQgc2hvd19kbWlfbWVtb3J5X21vZHVsZXMoaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOwordm9pZCBzaG93X2RtaV9tZW1vcnlfYmFuayhpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7CisKKy8vIFBDSSBTVFVGRgorI2RlZmluZSBDTElfUENJX0RFVklDRSAiZGV2aWNlIgordm9pZCBtYWluX3Nob3dfcGNpKGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKKworLy8gQ1BVIFNUVUZGCit2b2lkIG1haW5fc2hvd19jcHUoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworCisvLyBESVNLIFNUVUZGCit2b2lkIGRpc2tzX3N1bW1hcnkoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworCisvLyBQWEUgU1RVRkYKK3ZvaWQgbWFpbl9zaG93X3B4ZShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7CisKKy8vIEtFUk5FTCBTVFVGRgordm9pZCBtYWluX3Nob3dfa2VybmVsKGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKKworLy8gU1lTTElOVVggU1RVRkYKK3ZvaWQgbWFpbl9zaG93X3N5c2xpbnV4KGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKKworLy8gVkVTQSBTVFVGRgordm9pZCBtYWluX3Nob3dfdmVzYShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7CisKKy8vIFZQRCBTVFVGRgordm9pZCBtYWluX3Nob3dfdnBkKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCwKKwkJICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKKworLy8gQUNQSSBTVFVGRgordm9pZCBtYWluX3Nob3dfYWNwaShpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQsCisJCSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LWNvbW1vbi5jIGIvY29tMzIvaGR0L2hkdC1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmI4Yzk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1jb21tb24uYwpAQCAtMCwwICsxLDc5MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdldGtleS5oPgorI2luY2x1ZGUgInN5c2xpbnV4L2NvbmZpZy5oIgorI2luY2x1ZGUgIi4uL2xpYi9zeXMvdmVzYS92ZXNhLmgiCisjaW5jbHVkZSAiaGR0LWNvbW1vbi5oIgorI2luY2x1ZGUgPGRpc2svdXRpbC5oPgorI2luY2x1ZGUgPGRpc2svbWJycy5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorCisvKiBJU09saW51eCByZXF1aXJlcyBhIDguMyBmb3JtYXQgKi8KK3ZvaWQgY29udmVydF9pc29saW51eF9maWxlbmFtZShjaGFyICpmaWxlbmFtZSwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIC8qIEV4aXQgaWYgd2UgYXJlIG5vdCBydW5uaW5nIElTT0xJTlVYICovCisgICAgaWYgKGhhcmR3YXJlLT5zdi0+ZmlsZXN5c3RlbSAhPSBTWVNMSU5VWF9GU19JU09MSU5VWCkKKwlyZXR1cm47CisgICAgLyogU2VhcmNoaW5nIHRoZSBkb3QgKi8KKyAgICBjaGFyICpkb3QgPSBzdHJjaHIoZmlsZW5hbWUsICcuJyk7CisgICAgLyogRXhpdGluZyBpZiBubyBkb3QgZXhpc3RzIGluIHRoYXQgc3RyaW5nICovCisgICAgaWYgKGRvdCA9PSBOVUxMKQorCXJldHVybjsKKyAgICAvKiBFeGl0aW5nIGlmIHRoZSBleHRlbnNpb24gaXMgMyBjaGFyIG9yIGxlc3MgKi8KKyAgICBpZiAoc3RybGVuKGRvdCkgPD0gNCkKKwlyZXR1cm47CisKKyAgICAvKiBXZSBoYXZlIGFuIGV4dGVuc2lvbiBiaWdnZXIgdGhhbiAuYmxhaAorICAgICAqIHNvIHdlIGhhdmUgdG8gc2hvcnRlbiBpdCB0byAzKi8KKyAgICBkb3RbNF0gPSAnXDAnOworfQorCit2b2lkIGRldGVjdF9wYXJhbWV0ZXJzKGNvbnN0IGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10sCisJCSAgICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgLyogUXVpZXQgbW9kZSAtIG1ha2UgdGhlIG91dHB1dCBtb3JlIHF1aWV0ICovCisgICAgcXVpZXQgPSB0cnVlOworCisgICAgLyogU2lsZW50IG1vZGUgLSBtYWtlIG5vdCBvdXRwdXQgYXQgYWxsICovCisgICAgc2lsZW50ID0gZmFsc2U7CisKKyAgICAvKiBWZXNhIG1vZGUgaXNuJ3Qgc2V0IHVudGlsIHdlIGV4cGxpY3RseSBjYWxsIGl0ICovCisgICAgdmVzYW1vZGUgPSBmYWxzZTsKKworICAgIC8qIEF1dG9tb2RlIGlzbid0IHRoZSBkZWZhdWx0Ki8KKyAgICBhdXRvbW9kZSA9IGZhbHNlOworCisgICAgLyogTWVudSBtb2RlIGlzIHRoZSBkZWZhdWx0Ki8KKyAgICBtZW51bW9kZSA9IHRydWU7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCWlmICghc3RybmNtcChhcmd2W2ldLCAicXVpZXQiLCA1KSkgeworCSAgICBxdWlldCA9IHRydWU7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAic2lsZW50IiwgNikpIHsKKwkgICAgc2lsZW50ID0gdHJ1ZTsKKwl9IGVsc2UJaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJ2ZXJib3NlIiwgNykpIHsKKwkgICAgcXVpZXQgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJtb2R1bGVzX3BjaW1hcD0iLCAxNSkpIHsKKwkgICAgc3RybGNweShoYXJkd2FyZS0+bW9kdWxlc19wY2ltYXBfcGF0aCwgYXJndltpXSArIDE1LAorCQkgICAgc2l6ZW9mKGhhcmR3YXJlLT5tb2R1bGVzX3BjaW1hcF9wYXRoKSk7CisJICAgIGNvbnZlcnRfaXNvbGludXhfZmlsZW5hbWUoaGFyZHdhcmUtPm1vZHVsZXNfcGNpbWFwX3BhdGgsIGhhcmR3YXJlKTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJwY2lpZHM9IiwgNykpIHsKKwkgICAgc3RybGNweShoYXJkd2FyZS0+cGNpaWRzX3BhdGgsIGFyZ3ZbaV0gKyA3LAorCQkgICAgc2l6ZW9mKGhhcmR3YXJlLT5wY2lpZHNfcGF0aCkpOworCSAgICBjb252ZXJ0X2lzb2xpbnV4X2ZpbGVuYW1lKGhhcmR3YXJlLT5wY2lpZHNfcGF0aCwgaGFyZHdhcmUpOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIm1vZHVsZXNfYWxpYXM9IiwgMTQpKSB7CisJICAgIHN0cmxjcHkoaGFyZHdhcmUtPm1vZHVsZXNfYWxpYXNfcGF0aCwgYXJndltpXSArIDE0LAorCQkgICAgc2l6ZW9mKGhhcmR3YXJlLT5tb2R1bGVzX2FsaWFzX3BhdGgpKTsKKwkgICAgY29udmVydF9pc29saW51eF9maWxlbmFtZShoYXJkd2FyZS0+bW9kdWxlc19hbGlhc19wYXRoLCBoYXJkd2FyZSk7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAibWVtdGVzdD0iLCA4KSkgeworCSAgICBzdHJsY3B5KGhhcmR3YXJlLT5tZW10ZXN0X2xhYmVsLCBhcmd2W2ldICsgOCwKKwkJICAgIHNpemVvZihoYXJkd2FyZS0+bWVtdGVzdF9sYWJlbCkpOworCSAgICBjb252ZXJ0X2lzb2xpbnV4X2ZpbGVuYW1lKGhhcmR3YXJlLT5tZW10ZXN0X2xhYmVsLCBoYXJkd2FyZSk7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAidmVzYSIsIDQpKSB7CisJICAgIHZlc2Ftb2RlID0gdHJ1ZTsKKwkgICAgbWF4X2NvbnNvbGVfbGluZXMgPSBNQVhfVkVTQV9DTElfTElORVM7CisJICAgIC8qIElmIHRoZSB1c2VyIGRlZmluZXMgYSBiYWNrZ3JvdW5kIGltYWdlICovCisJICAgIGlmICghc3RybmNtcChhcmd2W2ldLCAidmVzYT0iLCA1KSkgeworCQlzdHJsY3B5KGhhcmR3YXJlLT52ZXNhX2JhY2tncm91bmQsIGFyZ3ZbaV0gKyA1LAorCQkJc2l6ZW9mKGhhcmR3YXJlLT52ZXNhX2JhY2tncm91bmQpKTsKKwkgICAgfQorCX0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIm5vdmVzYSIsIDYpKSB7CisJICAgIHZlc2Ftb2RlID0gZmFsc2U7CisJICAgIG1heF9jb25zb2xlX2xpbmVzID0gTUFYX0NMSV9MSU5FUzsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJub21lbnUiLCA2KSkgeworCSAgICBtZW51bW9kZSA9IGZhbHNlOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgImR1bXBfZmlsZW5hbWU9IiwgMTQpKSB7CisJICAgIHN0cmxjcHkoaGFyZHdhcmUtPmR1bXBfZmlsZW5hbWUsIGFyZ3ZbaV0gKyAxNCwKKwkJICAgIHNpemVvZihoYXJkd2FyZS0+ZHVtcF9maWxlbmFtZSkpOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgImR1bXBfcGF0aD0iLCAxMCkpIHsKKwkgICAgc3RybGNweShoYXJkd2FyZS0+ZHVtcF9wYXRoLCBhcmd2W2ldICsgMTAsCisJCSAgICBzaXplb2YoaGFyZHdhcmUtPmR1bXBfcGF0aCkpOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgInRmdHBfaXA9IiwgOCkpIHsKKwkgICAgc3RybGNweShoYXJkd2FyZS0+dGZ0cF9pcCwgYXJndltpXSArIDgsCisJCSAgICBzaXplb2YoaGFyZHdhcmUtPnRmdHBfaXApKTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJwb3N0ZXhlYz0iLCA5KSkgeworCSAgICAvKiBUaGUgcG9zdGV4ZWM9IHBhcmFtZXRlciBpcyBzZXBhcmF0ZWQgaW4gc2V2ZXJhbCBhcmd2W10KKwkgICAgICogYXMgaXQgY2FuIGNvbnRhaW5zIHNwYWNlcy4KKwkgICAgICogV2UgdXNlIHRoZSBBVVRPX0RFTElNSVRFUiBjaGFyIHRvIGRlZmluZSB0aGUgbGltaXRzCisJICAgICAqIG9mIHRoaXMgcGFyYW1ldGVyLgorCSAgICAgKiBpLmUgcG9zdGV4ZWM9J2xpbnV4IG1lbXRlc3QuYmluJworCSAgICAgKi8KKworCSAgICBjaGFyICphcmd1bWVudCA9IChjaGFyKilhcmd2W2ldKzEwOworCSAgICAvKiBFeHRyYWN0aW5nIHRoZSBmaXJzdCBwYXJhbWV0ZXIgKi8KKwkgICAgc3RyY3B5KGhhcmR3YXJlLT5wb3N0ZXhlYywgYXJndW1lbnQpOworCisJICAgIC8qIFdoaWxlIHdlIGNhbid0IGZpbmQgdGhlIG90aGVyIEFVVE9fREVMSU1JVEVSLCBsZXQncyBwcm9jZXNzIHRoZSBhcmd2W10gKi8KKwkgICAgd2hpbGUgKChzdHJjaHIoYXJndW1lbnQsIEFVVE9fREVMSU1JVEVSKSA9PSBOVUxMKSAmJiAoaSsxPGFyZ2MpKSB7CisJCWkrKzsKKwkgICAgCWFyZ3VtZW50ID0gKGNoYXIgKilhcmd2W2ldOworCQlzdHJjYXQoaGFyZHdhcmUtPnBvc3RleGVjLCAiICIpOworCQlzdHJjYXQoaGFyZHdhcmUtPnBvc3RleGVjLCBhcmd1bWVudCk7CisJICAgIH0gCisJCisJICAgICBoYXJkd2FyZS0+cG9zdGV4ZWNbc3RybGVuKGhhcmR3YXJlLT5wb3N0ZXhlYykgLSAxXSA9IDA7CisJfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiYXV0bz0iLCA1KSkgeworCSAgICAvKiBUaGUgYXV0bz0gcGFyYW1ldGVyIGlzIHNlcGFyYXRlZCBpbiBzZXZlcmFsIGFyZ3ZbXQorCSAgICAgKiBhcyBpdCBjYW4gY29udGFpbnMgc3BhY2VzLgorCSAgICAgKiBXZSB1c2UgdGhlIEFVVE9fREVMSU1JVEVSIGNoYXIgdG8gZGVmaW5lIHRoZSBsaW1pdHMKKwkgICAgICogb2YgdGhpcyBwYXJhbWV0ZXIuCisJICAgICAqIGkuZSBhdXRvPSdzaG93IGRtaTsgc2hvdyBwY2knCisJICAgICAqLworCisJICAgIGF1dG9tb2RlPXRydWU7CisJICAgIGNoYXIgKmFyZ3VtZW50ID0gKGNoYXIqKWFyZ3ZbaV0rNjsKKwkgICAgLyogRXh0cmFjdGluZyB0aGUgZmlyc3QgcGFyYW1ldGVyICovCisJICAgIHN0cmNweShoYXJkd2FyZS0+YXV0b19sYWJlbCwgYXJndW1lbnQpOworCisJICAgIC8qIFdoaWxlIHdlIGNhbid0IGZpbmQgdGhlIG90aGVyIEFVVE9fREVMSU1JVEVSLCBsZXQncyBwcm9jZXNzIHRoZSBhcmd2W10gKi8KKwkgICAgd2hpbGUgKChzdHJjaHIoYXJndW1lbnQsIEFVVE9fREVMSU1JVEVSKSA9PSBOVUxMKSAmJiAoaSsxPGFyZ2MpKSB7CisJCWkrKzsKKwkgICAgCWFyZ3VtZW50ID0gKGNoYXIgKilhcmd2W2ldOworCQlzdHJjYXQoaGFyZHdhcmUtPmF1dG9fbGFiZWwsICIgIik7CisJCXN0cmNhdChoYXJkd2FyZS0+YXV0b19sYWJlbCwgYXJndW1lbnQpOworCSAgICB9IAorCisJICAgICBoYXJkd2FyZS0+YXV0b19sYWJlbFtzdHJsZW4oaGFyZHdhcmUtPmF1dG9fbGFiZWwpIC0gMV0gPSAwOworCX0KKyAgICB9Cit9CisKK3ZvaWQgZGV0ZWN0X3N5c2xpbnV4KHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBoYXJkd2FyZS0+c3YgPSBzeXNsaW51eF92ZXJzaW9uKCk7CisgICAgc3dpdGNoIChoYXJkd2FyZS0+c3YtPmZpbGVzeXN0ZW0pIHsKKyAgICBjYXNlIFNZU0xJTlVYX0ZTX1NZU0xJTlVYOgorCXN0cmxjcHkoaGFyZHdhcmUtPnN5c2xpbnV4X2ZzLCAiU1lTbGludXgiLCA5KTsKKwlicmVhazsKKyAgICBjYXNlIFNZU0xJTlVYX0ZTX1BYRUxJTlVYOgorCXN0cmxjcHkoaGFyZHdhcmUtPnN5c2xpbnV4X2ZzLCAiUFhFbGludXgiLCA5KTsKKwlicmVhazsKKyAgICBjYXNlIFNZU0xJTlVYX0ZTX0lTT0xJTlVYOgorCXN0cmxjcHkoaGFyZHdhcmUtPnN5c2xpbnV4X2ZzLCAiSVNPbGludXgiLCA5KTsKKwlicmVhazsKKyAgICBjYXNlIFNZU0xJTlVYX0ZTX0VYVExJTlVYOgorCXN0cmxjcHkoaGFyZHdhcmUtPnN5c2xpbnV4X2ZzLCAiRVhUbGludXgiLCA5KTsKKwlicmVhazsKKyAgICBjYXNlIFNZU0xJTlVYX0ZTX1VOS05PV046CisgICAgZGVmYXVsdDoKKwlzdHJsY3B5KGhhcmR3YXJlLT5zeXNsaW51eF9mcywgIlVua25vd24gQm9vdGxvYWRlciIsCisJCXNpemVvZiBoYXJkd2FyZS0+c3lzbGludXhfZnMpOworCWJyZWFrOworICAgIH0KK30KKwordm9pZCBpbml0X2hhcmR3YXJlKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBoYXJkd2FyZS0+cGNpX2lkc19yZXR1cm5fY29kZSA9IDA7CisgICAgaGFyZHdhcmUtPm1vZHVsZXNfcGNpbWFwX3JldHVybl9jb2RlID0gMDsKKyAgICBoYXJkd2FyZS0+bW9kdWxlc19hbGlhc19yZXR1cm5fY29kZSA9IDA7CisgICAgaGFyZHdhcmUtPmNwdV9kZXRlY3Rpb24gPSBmYWxzZTsKKyAgICBoYXJkd2FyZS0+cGNpX2RldGVjdGlvbiA9IGZhbHNlOworICAgIGhhcmR3YXJlLT5kaXNrX2RldGVjdGlvbiA9IGZhbHNlOworICAgIGhhcmR3YXJlLT5kaXNrc19jb3VudCA9IDA7CisgICAgaGFyZHdhcmUtPmRtaV9kZXRlY3Rpb24gPSBmYWxzZTsKKyAgICBoYXJkd2FyZS0+cHhlX2RldGVjdGlvbiA9IGZhbHNlOworICAgIGhhcmR3YXJlLT52ZXNhX2RldGVjdGlvbiA9IGZhbHNlOworICAgIGhhcmR3YXJlLT52cGRfZGV0ZWN0aW9uID0gZmFsc2U7CisgICAgaGFyZHdhcmUtPm1lbW9yeV9kZXRlY3Rpb24gPSBmYWxzZTsKKyAgICBoYXJkd2FyZS0+YWNwaV9kZXRlY3Rpb24gPSBmYWxzZTsKKyAgICBoYXJkd2FyZS0+bmJfcGNpX2RldmljZXMgPSAwOworICAgIGhhcmR3YXJlLT5pc19kbWlfdmFsaWQgPSBmYWxzZTsKKyAgICBoYXJkd2FyZS0+aXNfcHhlX3ZhbGlkID0gZmFsc2U7CisgICAgaGFyZHdhcmUtPmlzX3ZwZF92YWxpZCA9IGZhbHNlOworICAgIGhhcmR3YXJlLT5pc19hY3BpX3ZhbGlkID0gZmFsc2U7CisgICAgaGFyZHdhcmUtPnBjaV9kb21haW4gPSBOVUxMOworICAgIGhhcmR3YXJlLT5kZXRlY3RlZF9tZW1vcnlfc2l6ZSA9IDA7CisgICAgaGFyZHdhcmUtPnBoeXNpY2FsX2NwdV9jb3VudCA9MTsgLyogd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY3B1ICovCisKKyAgICAvKiBDbGVhbmluZyBzdHJ1Y3R1cmVzICovCisgICAgbWVtc2V0KGhhcmR3YXJlLT5kaXNrX2luZm8sIDAsIHNpemVvZihoYXJkd2FyZS0+ZGlza19pbmZvKSk7CisgICAgbWVtc2V0KGhhcmR3YXJlLT5tYnJfaWRzLCAwLCBzaXplb2YoaGFyZHdhcmUtPm1icl9pZHMpKTsKKyAgICBtZW1zZXQoJmhhcmR3YXJlLT5kbWksIDAsIHNpemVvZihzX2RtaSkpOworICAgIG1lbXNldCgmaGFyZHdhcmUtPmNwdSwgMCwgc2l6ZW9mKHNfY3B1KSk7CisgICAgbWVtc2V0KCZoYXJkd2FyZS0+cHhlLCAwLCBzaXplb2Yoc3RydWN0IHNfcHhlKSk7CisgICAgbWVtc2V0KCZoYXJkd2FyZS0+dmVzYSwgMCwgc2l6ZW9mKHN0cnVjdCBzX3Zlc2EpKTsKKyAgICBtZW1zZXQoJmhhcmR3YXJlLT52cGQsIDAsIHNpemVvZihzX3ZwZCkpOworICAgIG1lbXNldCgmaGFyZHdhcmUtPmFjcGksIDAsIHNpemVvZihzX2FjcGkpKTsKKyAgICBtZW1zZXQoaGFyZHdhcmUtPnN5c2xpbnV4X2ZzLCAwLCBzaXplb2YgaGFyZHdhcmUtPnN5c2xpbnV4X2ZzKTsKKyAgICBtZW1zZXQoaGFyZHdhcmUtPnBjaWlkc19wYXRoLCAwLCBzaXplb2YgaGFyZHdhcmUtPnBjaWlkc19wYXRoKTsKKyAgICBtZW1zZXQoaGFyZHdhcmUtPm1vZHVsZXNfcGNpbWFwX3BhdGgsIDAsCisJICAgc2l6ZW9mIGhhcmR3YXJlLT5tb2R1bGVzX3BjaW1hcF9wYXRoKTsKKyAgICBtZW1zZXQoaGFyZHdhcmUtPm1vZHVsZXNfYWxpYXNfcGF0aCwgMCwKKwkgICBzaXplb2YgaGFyZHdhcmUtPm1vZHVsZXNfYWxpYXNfcGF0aCk7CisgICAgbWVtc2V0KGhhcmR3YXJlLT5tZW10ZXN0X2xhYmVsLCAwLCBzaXplb2YgaGFyZHdhcmUtPm1lbXRlc3RfbGFiZWwpOworICAgIG1lbXNldChoYXJkd2FyZS0+YXV0b19sYWJlbCwgMCwgc2l6ZW9mIGhhcmR3YXJlLT5hdXRvX2xhYmVsKTsKKyAgICBtZW1zZXQoaGFyZHdhcmUtPmR1bXBfcGF0aCwgMCwgc2l6ZW9mIGhhcmR3YXJlLT5kdW1wX3BhdGgpOworICAgIG1lbXNldChoYXJkd2FyZS0+ZHVtcF9maWxlbmFtZSwgMCwgc2l6ZW9mIGhhcmR3YXJlLT5kdW1wX2ZpbGVuYW1lKTsKKyAgICBtZW1zZXQoaGFyZHdhcmUtPnZlc2FfYmFja2dyb3VuZCwgMCwgc2l6ZW9mIGhhcmR3YXJlLT52ZXNhX2JhY2tncm91bmQpOworICAgIG1lbXNldChoYXJkd2FyZS0+dGZ0cF9pcCwgMCwgc2l6ZW9mIGhhcmR3YXJlLT50ZnRwX2lwKTsKKyAgICBtZW1zZXQoaGFyZHdhcmUtPnBvc3RleGVjLCAwLCBzaXplb2YgaGFyZHdhcmUtPnBvc3RleGVjKTsKKyAgICBzdHJjYXQoaGFyZHdhcmUtPmR1bXBfcGF0aCwgImhkdCIpOworICAgIHN0cmNhdChoYXJkd2FyZS0+ZHVtcF9maWxlbmFtZSwgIiV7bX0rJXtwfSsle3Z9Iik7CisgICAgc3RyY2F0KGhhcmR3YXJlLT5wY2lpZHNfcGF0aCwgInBjaS5pZHMiKTsKKyAgICBzdHJjYXQoaGFyZHdhcmUtPm1vZHVsZXNfcGNpbWFwX3BhdGgsICJtb2R1bGVzLnBjaW1hcCIpOworICAgIHN0cmNhdChoYXJkd2FyZS0+bW9kdWxlc19hbGlhc19wYXRoLCAibW9kdWxlcy5hbGlhcyIpOworICAgIHN0cmNhdChoYXJkd2FyZS0+bWVtdGVzdF9sYWJlbCwgIm1lbXRlc3QiKTsKKyAgICBzdHJsY3B5KGhhcmR3YXJlLT52ZXNhX2JhY2tncm91bmQsIENMSV9ERUZBVUxUX0JBQ0tHUk9VTkQsCisJICAgIHNpemVvZihoYXJkd2FyZS0+dmVzYV9iYWNrZ3JvdW5kKSk7Cit9CisKKy8qCisgKiBEZXRlY3RpbmcgaWYgYSBETUkgdGFibGUgZXhpc3QKKyAqIGlmIHllcywgbGV0J3MgcGFyc2UgaXQKKyAqLworaW50IGRldGVjdF9kbWkoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGlmIChoYXJkd2FyZS0+ZG1pX2RldGVjdGlvbiA9PSB0cnVlKQorCXJldHVybiAtMTsKKyAgICBoYXJkd2FyZS0+ZG1pX2RldGVjdGlvbiA9IHRydWU7CisgICAgaWYgKGRtaV9pdGVyYXRlKCZoYXJkd2FyZS0+ZG1pKSA9PSAtRU5PRE1JVEFCTEUpIHsKKwloYXJkd2FyZS0+aXNfZG1pX3ZhbGlkID0gZmFsc2U7CisJcmV0dXJuIC1FTk9ETUlUQUJMRTsKKyAgICB9CisKKyAgICBwYXJzZV9kbWl0YWJsZSgmaGFyZHdhcmUtPmRtaSk7CisgICAgaGFyZHdhcmUtPmlzX2RtaV92YWxpZCA9IHRydWU7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZXRlY3RpbmcgQUNQSQorICogaWYgeWVzLCBsZXQncyBwYXJzZSBpdAorICovCitpbnQgZGV0ZWN0X2FjcGkoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGludCByZXR2YWw7CisgICAgaWYgKGhhcmR3YXJlLT5hY3BpX2RldGVjdGlvbiA9PSB0cnVlKQorCXJldHVybiAtMTsKKyAgICBoYXJkd2FyZS0+YWNwaV9kZXRlY3Rpb24gPSB0cnVlOworICAgIGlmICgocmV0dmFsPXBhcnNlX2FjcGkoJmhhcmR3YXJlLT5hY3BpKSkgIT0gQUNQSV9GT1VORCkgeworCWhhcmR3YXJlLT5pc19hY3BpX3ZhbGlkID0gZmFsc2U7CisJcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICBoYXJkd2FyZS0+aXNfYWNwaV92YWxpZCA9IHRydWU7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB2cGRfZGV0ZWN0aW9uIC0gcG9wdWxhdGUgdGhlIFZQRCBzdHJ1Y3R1cmUKKyAqCisgKiBWUEQgaXMgYSBzdHJ1Y3R1cmUgYXZhaWxhYmxlIG9uIElCTSBtYWNoaW5lcy4KKyAqIEl0IGlzIGRvY3VtZW50ZWQgYXQ6CisgKiAgICBodHRwOi8vd3d3LnBjLmlibS5jb20vcXRlY2hpbmZvL01JR1ItNDUxMjAuaHRtbAorICogKFhYWCB0aGUgcGFnZSBzZWVtcyB0byBiZSBnb25lKQorICoqLworaW50IGRldGVjdF92cGQoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGlmIChoYXJkd2FyZS0+dnBkX2RldGVjdGlvbikKKwlyZXR1cm4gLTE7CisgICAgZWxzZQorCWhhcmR3YXJlLT52cGRfZGV0ZWN0aW9uID0gdHJ1ZTsKKworICAgIGlmICh2cGRfZGVjb2RlKCZoYXJkd2FyZS0+dnBkKSA9PSAtRU5PVlBEVEFCTEUpIHsKKwloYXJkd2FyZS0+aXNfdnBkX3ZhbGlkID0gZmFsc2U7CisJcmV0dXJuIC1FTk9WUERUQUJMRTsKKyAgICB9IGVsc2UgeworCWhhcmR3YXJlLT5pc192cGRfdmFsaWQgPSB0cnVlOworCXJldHVybiAwOworICAgIH0KK30KKworLyogRGV0ZWN0aW9uIHZlc2Egc3R1ZmYqLworaW50IGRldGVjdF92ZXNhKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBzdGF0aWMgY29tMzJzeXNfdCBybTsKKyAgICBzdHJ1Y3QgdmVzYV9nZW5lcmFsX2luZm8gKmdpOworICAgIHN0cnVjdCB2ZXNhX21vZGVfaW5mbyAqbWk7CisgICAgdWludDE2X3QgbW9kZSwgKm1vZGVfcHRyOworICAgIGNoYXIgKm9lbV9wdHI7CisgICAgaW50IHJ2ID0gLTE7CisKKyAgICBpZiAoaGFyZHdhcmUtPnZlc2FfZGV0ZWN0aW9uID09IHRydWUpCisJcmV0dXJuIC0xOworCisgICAgaGFyZHdhcmUtPnZlc2FfZGV0ZWN0aW9uID0gdHJ1ZTsKKyAgICBoYXJkd2FyZS0+aXNfdmVzYV92YWxpZCA9IGZhbHNlOworCisgICAgZ2kgPSBsbWFsbG9jKHNpemVvZigqZ2kpKTsKKyAgICBpZiAoIWdpKQorCXJldHVybiAtMTsKKworICAgIG1pID0gbG1hbGxvYyhzaXplb2YoKm1pKSk7CisgICAgaWYgKCFtaSkKKwlnb3RvIG91dDsKKworICAgIGdpLT5zaWduYXR1cmUgPSBWQkUyX01BR0lDOwkvKiBHZXQgVkJFMiBleHRlbmRlZCBkYXRhICovCisgICAgbWVtc2V0KCZybSwgMCwgc2l6ZW9mIHJtKTsKKyAgICBybS5lYXgud1swXSA9IDB4NEYwMDsJLyogR2V0IFNWR0EgZ2VuZXJhbCBpbmZvcm1hdGlvbiAqLworICAgIHJtLmVkaS53WzBdID0gT0ZGUyhnaSk7CisgICAgcm0uZXMgPSBTRUcoZ2kpOworICAgIF9faW50Y2FsbCgweDEwLCAmcm0sICZybSk7CisKKyAgICBpZiAocm0uZWF4LndbMF0gIT0gMHgwMDRGKSB7CisJZ290byBvdXQ7CisgICAgfTsKKworICAgIG1vZGVfcHRyID0gR0VUX1BUUihnaS0+dmlkZW9fbW9kZV9wdHIpOworICAgIG9lbV9wdHIgPSBHRVRfUFRSKGdpLT5vZW1fdmVuZG9yX25hbWVfcHRyKTsKKyAgICBzdHJsY3B5KGhhcmR3YXJlLT52ZXNhLnZlbmRvciwgb2VtX3B0ciwgc2l6ZW9mKGhhcmR3YXJlLT52ZXNhLnZlbmRvcikpOworICAgIG9lbV9wdHIgPSBHRVRfUFRSKGdpLT5vZW1fcHJvZHVjdF9uYW1lX3B0cik7CisgICAgc3RybGNweShoYXJkd2FyZS0+dmVzYS5wcm9kdWN0LCBvZW1fcHRyLCBzaXplb2YoaGFyZHdhcmUtPnZlc2EucHJvZHVjdCkpOworICAgIG9lbV9wdHIgPSBHRVRfUFRSKGdpLT5vZW1fcHJvZHVjdF9yZXZfcHRyKTsKKyAgICBzdHJsY3B5KGhhcmR3YXJlLT52ZXNhLnByb2R1Y3RfcmV2aXNpb24sIG9lbV9wdHIsCisJICAgIHNpemVvZihoYXJkd2FyZS0+dmVzYS5wcm9kdWN0X3JldmlzaW9uKSk7CisKKyAgICBoYXJkd2FyZS0+dmVzYS5tYWpvcl92ZXJzaW9uID0gKGdpLT52ZXJzaW9uID4+IDgpICYgMHhmZjsKKyAgICBoYXJkd2FyZS0+dmVzYS5taW5vcl92ZXJzaW9uID0gZ2ktPnZlcnNpb24gJiAweGZmOworICAgIGhhcmR3YXJlLT52ZXNhLnRvdGFsX21lbW9yeSA9IGdpLT50b3RhbF9tZW1vcnk7CisgICAgaGFyZHdhcmUtPnZlc2Euc29mdHdhcmVfcmV2ID0gZ2ktPm9lbV9zb2Z0d2FyZV9yZXY7CisKKyAgICBoYXJkd2FyZS0+dmVzYS52bWlfY291bnQgPSAwOworCisgICAgd2hpbGUgKChtb2RlID0gKm1vZGVfcHRyKyspICE9IDB4RkZGRikgeworCisgICAgICAgIG1lbXNldCgmcm0sIDAsIHNpemVvZiBybSk7CisJcm0uZWF4LndbMF0gPSAweDRGMDE7CS8qIEdldCBTVkdBIG1vZGUgaW5mb3JtYXRpb24gKi8KKwlybS5lY3gud1swXSA9IG1vZGU7CisJcm0uZWRpLndbMF0gPSBPRkZTKG1pKTsKKwlybS5lcyA9IFNFRyhtaSk7CisJX19pbnRjYWxsKDB4MTAsICZybSwgJnJtKTsKKworCS8qIE11c3QgYmUgYSBzdXBwb3J0ZWQgbW9kZSAqLworCWlmIChybS5lYXgud1swXSAhPSAweDAwNGYpCisJICAgIGNvbnRpbnVlOworCisJLyogU2F2aW5nIGRldGVjdGVkIHZhbHVlcyAqLworCW1lbWNweSgmaGFyZHdhcmUtPnZlc2Eudm1pW2hhcmR3YXJlLT52ZXNhLnZtaV9jb3VudF0ubWksIG1pLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHZlc2FfbW9kZV9pbmZvKSk7CisJaGFyZHdhcmUtPnZlc2Eudm1pW2hhcmR3YXJlLT52ZXNhLnZtaV9jb3VudF0ubW9kZSA9IG1vZGU7CisKKwloYXJkd2FyZS0+dmVzYS52bWlfY291bnQrKzsKKyAgICB9CisgICAgaGFyZHdhcmUtPmlzX3Zlc2FfdmFsaWQgPSB0cnVlOworCisgICAgcnYgPSAwOworb3V0OgorICAgIGxmcmVlKG1pKTsKKyAgICBsZnJlZShnaSk7CisgICAgcmV0dXJuIHJ2OworfQorCisvKiBUcnkgdG8gZGV0ZWN0IGRpc2tzIGZyb20gcG9ydCAweDgwIHRvIDB4ZmYgKi8KK3ZvaWQgZGV0ZWN0X2Rpc2tzKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpbnQgaSA9IC0xOworICAgIGludCBlcnI7CisKKyAgICBpZiAoaGFyZHdhcmUtPmRpc2tfZGV0ZWN0aW9uKQorCXJldHVybjsKKworICAgIGhhcmR3YXJlLT5kaXNrX2RldGVjdGlvbiA9IHRydWU7CisgICAgZm9yIChpbnQgZHJpdmUgPSAweDgwOyBkcml2ZSA8IDB4ZmY7IGRyaXZlKyspIHsKKwlpKys7CisJaGFyZHdhcmUtPmRpc2tfaW5mb1tpXS5kaXNrID0gZHJpdmU7CisJZXJyID0gZ2V0X2RyaXZlX3BhcmFtZXRlcnMoJmhhcmR3YXJlLT5kaXNrX2luZm9baV0pOworCisJLyoKKwkgKiBEbyBub3QgcHJpbnQgb3V0cHV0IHdoZW4gZHJpdmUgZG9lcyBub3QgZXhpc3Qgb3IKKwkgKiBkb2Vzbid0IHN1cHBvcnQgaW50MTMgKGNkcm9tLCAuLi4pCisJICovCisJaWYgKGVyciA9PSAtMSB8fCAhaGFyZHdhcmUtPmRpc2tfaW5mb1tpXS5jYmlvcykKKwkgICAgY29udGludWU7CisKKwkvKiBEZXRlY3QgTUJSICovCisJaGFyZHdhcmUtPm1icl9pZHNbaV0gPSBnZXRfbWJyX2lkKCZoYXJkd2FyZS0+ZGlza19pbmZvW2ldKTsKKworCWhhcmR3YXJlLT5kaXNrc19jb3VudCsrOworICAgIH0KK30KKworaW50IGRldGVjdF9weGUoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIHZvaWQgKmRoY3BkYXRhOworCisgICAgc2l6ZV90IGRoY3BsZW47CisgICAgdF9QWEVOVl9VTkRJX0dFVF9OSUNfVFlQRSBnbnQ7CisKKyAgICBpZiAoaGFyZHdhcmUtPnB4ZV9kZXRlY3Rpb24gPT0gdHJ1ZSkKKwlyZXR1cm4gLTE7CisgICAgaGFyZHdhcmUtPnB4ZV9kZXRlY3Rpb24gPSB0cnVlOworICAgIGhhcmR3YXJlLT5pc19weGVfdmFsaWQgPSBmYWxzZTsKKyAgICBtZW1zZXQoJmdudCwgMCwgc2l6ZW9mKHRfUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUpKTsKKyAgICBtZW1zZXQoJmhhcmR3YXJlLT5weGUsIDAsIHNpemVvZihzdHJ1Y3Qgc19weGUpKTsKKworICAgIC8qIFRoaXMgY29kZSBjYW4gb25seSB3b3JrIGlmIHB4ZWxpbnV4IGlzIGxvYWRlZCAqLworICAgIGlmIChoYXJkd2FyZS0+c3YtPmZpbGVzeXN0ZW0gIT0gU1lTTElOVVhfRlNfUFhFTElOVVgpIHsKKwlyZXR1cm4gLTE7CisgICAgfQorLy8gcHJpbnRmKCJQWEU6IFBYRWxpbnV4IGRldGVjdGVkXG4iKTsKKyAgICBpZiAoIXB4ZV9nZXRfY2FjaGVkX2luZm8oUFhFTlZfUEFDS0VUX1RZUEVfREhDUF9BQ0ssICZkaGNwZGF0YSwgJmRoY3BsZW4pKSB7CisJcHhlX2Jvb3RwX3QgKmRoY3AgPSAmaGFyZHdhcmUtPnB4ZS5kaGNwZGF0YTsKKwltZW1jcHkoJmhhcmR3YXJlLT5weGUuZGhjcGRhdGEsIGRoY3BkYXRhLAorCSAgICAgICBzaXplb2YoaGFyZHdhcmUtPnB4ZS5kaGNwZGF0YSkpOworCXNucHJpbnRmKGhhcmR3YXJlLT5weGUubWFjX2FkZHIsIHNpemVvZihoYXJkd2FyZS0+cHhlLm1hY19hZGRyKSwKKwkJICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIGRoY3AtPkNBZGRyWzBdLAorCQkgZGhjcC0+Q0FkZHJbMV0sIGRoY3AtPkNBZGRyWzJdLCBkaGNwLT5DQWRkclszXSwKKwkJIGRoY3AtPkNBZGRyWzRdLCBkaGNwLT5DQWRkcls1XSk7CisKKwkvKiBTYXZpbmcgb3VyIElQIGFkZHJlc3MgaW4gYSBlYXN5IGZvcm1hdCAqLworCWhhcmR3YXJlLT5weGUuaXBfYWRkclswXSA9IGhhcmR3YXJlLT5weGUuZGhjcGRhdGEueWlwICYgMHhmZjsKKwloYXJkd2FyZS0+cHhlLmlwX2FkZHJbMV0gPSBoYXJkd2FyZS0+cHhlLmRoY3BkYXRhLnlpcCA+PiA4ICYgMHhmZjsKKwloYXJkd2FyZS0+cHhlLmlwX2FkZHJbMl0gPSBoYXJkd2FyZS0+cHhlLmRoY3BkYXRhLnlpcCA+PiAxNiAmIDB4ZmY7CisJaGFyZHdhcmUtPnB4ZS5pcF9hZGRyWzNdID0gaGFyZHdhcmUtPnB4ZS5kaGNwZGF0YS55aXAgPj4gMjQgJiAweGZmOworCisJaWYgKCFweGVfZ2V0X25pY190eXBlKCZnbnQpKSB7CisJICAgIHN3aXRjaCAoZ250Lk5pY1R5cGUpIHsKKwkgICAgY2FzZSBQQ0lfTklDOgorCQloYXJkd2FyZS0+aXNfcHhlX3ZhbGlkID0gdHJ1ZTsKKwkJaGFyZHdhcmUtPnB4ZS52ZW5kb3JfaWQgPSBnbnQuaW5mby5wY2kuVmVuZG9yX0lEOworCQloYXJkd2FyZS0+cHhlLnByb2R1Y3RfaWQgPSBnbnQuaW5mby5wY2kuRGV2X0lEOworCQloYXJkd2FyZS0+cHhlLnN1YnZlbmRvcl9pZCA9IGdudC5pbmZvLnBjaS5TdWJWZW5kb3JfSUQ7CisJCWhhcmR3YXJlLT5weGUuc3VicHJvZHVjdF9pZCA9CisJCSAgICBnbnQuaW5mby5wY2kuU3ViRGV2aWNlX0lELAorCQkgICAgaGFyZHdhcmUtPnB4ZS5yZXYgPSBnbnQuaW5mby5wY2kuUmV2OworCQloYXJkd2FyZS0+cHhlLnBjaV9idXMgPSAoZ250LmluZm8ucGNpLkJ1c0RldkZ1bmMgPj4gOCkgJiAweGZmOworCQloYXJkd2FyZS0+cHhlLnBjaV9kZXYgPSAoZ250LmluZm8ucGNpLkJ1c0RldkZ1bmMgPj4gMykgJiAweDc7CisJCWhhcmR3YXJlLT5weGUucGNpX2Z1bmMgPSBnbnQuaW5mby5wY2kuQnVzRGV2RnVuYyAmIDB4MDM7CisJCWhhcmR3YXJlLT5weGUuYmFzZV9jbGFzcyA9IGdudC5pbmZvLnBjaS5CYXNlX0NsYXNzOworCQloYXJkd2FyZS0+cHhlLnN1Yl9jbGFzcyA9IGdudC5pbmZvLnBjaS5TdWJfQ2xhc3M7CisJCWhhcmR3YXJlLT5weGUucHJvZ19pbnRmID0gZ250LmluZm8ucGNpLlByb2dfSW50ZjsKKwkJaGFyZHdhcmUtPnB4ZS5uaWN0eXBlID0gZ250Lk5pY1R5cGU7CisJCWJyZWFrOworCSAgICBjYXNlIENhcmRCdXNfTklDOgorCQloYXJkd2FyZS0+aXNfcHhlX3ZhbGlkID0gdHJ1ZTsKKwkJaGFyZHdhcmUtPnB4ZS52ZW5kb3JfaWQgPSBnbnQuaW5mby5jYXJkYnVzLlZlbmRvcl9JRDsKKwkJaGFyZHdhcmUtPnB4ZS5wcm9kdWN0X2lkID0gZ250LmluZm8uY2FyZGJ1cy5EZXZfSUQ7CisJCWhhcmR3YXJlLT5weGUuc3VidmVuZG9yX2lkID0gZ250LmluZm8uY2FyZGJ1cy5TdWJWZW5kb3JfSUQ7CisJCWhhcmR3YXJlLT5weGUuc3VicHJvZHVjdF9pZCA9CisJCSAgICBnbnQuaW5mby5jYXJkYnVzLlN1YkRldmljZV9JRCwKKwkJICAgIGhhcmR3YXJlLT5weGUucmV2ID0gZ250LmluZm8uY2FyZGJ1cy5SZXY7CisJCWhhcmR3YXJlLT5weGUucGNpX2J1cyA9CisJCSAgICAoZ250LmluZm8uY2FyZGJ1cy5CdXNEZXZGdW5jID4+IDgpICYgMHhmZjsKKwkJaGFyZHdhcmUtPnB4ZS5wY2lfZGV2ID0KKwkJICAgIChnbnQuaW5mby5jYXJkYnVzLkJ1c0RldkZ1bmMgPj4gMykgJiAweDc7CisJCWhhcmR3YXJlLT5weGUucGNpX2Z1bmMgPSBnbnQuaW5mby5jYXJkYnVzLkJ1c0RldkZ1bmMgJiAweDAzOworCQloYXJkd2FyZS0+cHhlLmJhc2VfY2xhc3MgPSBnbnQuaW5mby5jYXJkYnVzLkJhc2VfQ2xhc3M7CisJCWhhcmR3YXJlLT5weGUuc3ViX2NsYXNzID0gZ250LmluZm8uY2FyZGJ1cy5TdWJfQ2xhc3M7CisJCWhhcmR3YXJlLT5weGUucHJvZ19pbnRmID0gZ250LmluZm8uY2FyZGJ1cy5Qcm9nX0ludGY7CisJCWhhcmR3YXJlLT5weGUubmljdHlwZSA9IGdudC5OaWNUeXBlOworCQlicmVhazsKKwkgICAgY2FzZSBQblBfTklDOgorCSAgICBkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgLyogVGhlIGZpcnQgcGFzcyB0cnkgdG8gZmluZCB0aGUgZXhhY3QgcGNpIGRldmljZSAqLworCSAgICBoYXJkd2FyZS0+cHhlLnBjaV9kZXZpY2UgPSBOVUxMOworCSAgICBoYXJkd2FyZS0+cHhlLnBjaV9kZXZpY2VfcG9zID0gMDsKKwkgICAgc3RydWN0IHBjaV9kZXZpY2UgKnBjaV9kZXZpY2U7CisJICAgIGludCBwY2lfbnVtYmVyID0gMDsKKwkgICAgZm9yX2VhY2hfcGNpX2Z1bmMocGNpX2RldmljZSwgaGFyZHdhcmUtPnBjaV9kb21haW4pIHsKKwkJcGNpX251bWJlcisrOworCQlpZiAoKF9fcGNpX2J1cyA9PSBoYXJkd2FyZS0+cHhlLnBjaV9idXMpICYmCisJCSAgICAoX19wY2lfc2xvdCA9PSBoYXJkd2FyZS0+cHhlLnBjaV9kZXYpICYmCisJCSAgICAoX19wY2lfZnVuYyA9PSBoYXJkd2FyZS0+cHhlLnBjaV9mdW5jKSAmJgorCQkgICAgKHBjaV9kZXZpY2UtPnZlbmRvciA9PSBoYXJkd2FyZS0+cHhlLnZlbmRvcl9pZCkKKwkJICAgICYmIChwY2lfZGV2aWNlLT5wcm9kdWN0ID09IGhhcmR3YXJlLT5weGUucHJvZHVjdF9pZCkpIHsKKwkJICAgIGhhcmR3YXJlLT5weGUucGNpX2RldmljZSA9IHBjaV9kZXZpY2U7CisJCSAgICBoYXJkd2FyZS0+cHhlLnBjaV9kZXZpY2VfcG9zID0gcGNpX251bWJlcjsKKwkJICAgIHJldHVybiAwOworCQl9CisJICAgIH0KKworCSAgICAvKiBJZiB3ZSByZWFjaCB0aGF0IHBhcnQsIGl0IG1lYW5zIHRoZSBwY2kgZGV2aWNlIHBvaW50ZWQgYnkKKwkgICAgICogdGhlIHB4ZSByb20gd2Fzbid0IGZvdW5kIGluIG91ciBsaXN0LgorCSAgICAgKiBMZXQncyB0cnkgdG8gZmluZCB0aGUgZGV2aWNlIG9ubHkgYnkgaXRzIHBjaSBpZHMuCisJICAgICAqIFRoZSBwY2kgZGV2aWNlIHdlJ2xsIG1hdGNoIGlzIG1heWJlIG5vdCBleGFjdGx5IHRoZSBnb29kIG9uZQorCSAgICAgKiBhcyB3ZSBjYW4gaGF2ZSB0aGUgc2FtZSBwY2kgaWQgc2V2ZXJhbCB0aW1lcy4KKwkgICAgICogQXQgbGVhc3QsIHRoZSBwY2kgaWQsIHRoZSB2ZW5kb3IvcHJvZHVjdCB3aWxsIGJlIHJpZ2h0LgorCSAgICAgKiBUaGF0J3MgY2xlYXJseSBhIHdvcmthcm91bmQgZm9yIHNvbWUgd2VpcmQgY2FzZXMuCisJICAgICAqIFRoaXMgc2hvdWxkIGhhcHBlbmQgdmVyeSB1bmxpa2VseSAqLworCSAgICBoYXJkd2FyZS0+cHhlLnBjaV9kZXZpY2UgPSBOVUxMOworCSAgICBoYXJkd2FyZS0+cHhlLnBjaV9kZXZpY2VfcG9zID0gMDsKKwkgICAgcGNpX251bWJlciA9IDA7CisJICAgIGZvcl9lYWNoX3BjaV9mdW5jKHBjaV9kZXZpY2UsIGhhcmR3YXJlLT5wY2lfZG9tYWluKSB7CisJCXBjaV9udW1iZXIrKzsKKwkJaWYgKChwY2lfZGV2aWNlLT52ZW5kb3IgPT0gaGFyZHdhcmUtPnB4ZS52ZW5kb3JfaWQpCisJCSAgICAmJiAocGNpX2RldmljZS0+cHJvZHVjdCA9PSBoYXJkd2FyZS0+cHhlLnByb2R1Y3RfaWQpKSB7CisJCSAgICBoYXJkd2FyZS0+cHhlLnBjaV9kZXZpY2UgPSBwY2lfZGV2aWNlOworCQkgICAgaGFyZHdhcmUtPnB4ZS5wY2lfZGV2aWNlX3BvcyA9IHBjaV9udW1iZXI7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCSAgICB9CisKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIGRldGVjdF9tZW1vcnkoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKSB7CisgICAgIGlmIChoYXJkd2FyZS0+bWVtb3J5X2RldGVjdGlvbiA9PSBmYWxzZSkgeworCSAgICAgaGFyZHdhcmUtPm1lbW9yeV9kZXRlY3Rpb24gPSB0cnVlOworICAgICBoYXJkd2FyZS0+ZGV0ZWN0ZWRfbWVtb3J5X3NpemUgPSBkZXRlY3RfbWVtc2l6ZSgpOworICAgICB9Cit9CisKK3ZvaWQgZGV0ZWN0X3BjaShzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgaWYgKGhhcmR3YXJlLT5wY2lfZGV0ZWN0aW9uID09IHRydWUpCisJcmV0dXJuOworICAgIGhhcmR3YXJlLT5wY2lfZGV0ZWN0aW9uID0gdHJ1ZTsKKworICAgIGhhcmR3YXJlLT5uYl9wY2lfZGV2aWNlcyA9IDA7CisKKyAgICAvKiBTY2FubmluZyB0byBkZXRlY3QgcGNpIGJ1c2VzIGFuZCBkZXZpY2VzICovCisgICAgaGFyZHdhcmUtPnBjaV9kb21haW4gPSBwY2lfc2NhbigpOworCisgICAgaWYgKCFoYXJkd2FyZS0+cGNpX2RvbWFpbikKKwlyZXR1cm47CisKKyAgICAvKiBHYXRoZXJpbmcgYWRkdGlvbmFsIGluZm9ybWF0aW9uICovCisgICAgZ2F0aGVyX2FkZGl0aW9uYWxfcGNpX2NvbmZpZyhoYXJkd2FyZS0+cGNpX2RvbWFpbik7CisKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpX2RldmljZTsKKyAgICBmb3JfZWFjaF9wY2lfZnVuYyhwY2lfZGV2aWNlLCBoYXJkd2FyZS0+cGNpX2RvbWFpbikgeworCWhhcmR3YXJlLT5uYl9wY2lfZGV2aWNlcysrOworICAgIH0KKworICAgIGlmICghcXVpZXQpIHsKKwltb3JlX3ByaW50ZigiUENJOiAlZCBkZXZpY2VzIGRldGVjdGVkXG4iLCBoYXJkd2FyZS0+bmJfcGNpX2RldmljZXMpOworCW1vcmVfcHJpbnRmKCJQQ0k6IFJlc29sdmluZyBuYW1lc1xuIik7CisgICAgfQorICAgIC8qIEFzc2lnbmluZyBwcm9kdWN0ICYgdmVuZG9yIG5hbWUgZm9yIGVhY2ggZGV2aWNlICovCisgICAgaGFyZHdhcmUtPnBjaV9pZHNfcmV0dXJuX2NvZGUgPQorCWdldF9uYW1lX2Zyb21fcGNpX2lkcyhoYXJkd2FyZS0+cGNpX2RvbWFpbiwgaGFyZHdhcmUtPnBjaWlkc19wYXRoKTsKKworICAgIGlmICghcXVpZXQpCisJbW9yZV9wcmludGYoIlBDSTogUmVzb2x2aW5nIGNsYXNzIG5hbWVzXG4iKTsKKyAgICAvKiBBc3NpZ25pbmcgY2xhc3MgbmFtZSBmb3IgZWFjaCBkZXZpY2UgKi8KKyAgICBoYXJkd2FyZS0+cGNpX2lkc19yZXR1cm5fY29kZSA9CisJZ2V0X2NsYXNzX25hbWVfZnJvbV9wY2lfaWRzKGhhcmR3YXJlLT5wY2lfZG9tYWluLAorCQkJCSAgICBoYXJkd2FyZS0+cGNpaWRzX3BhdGgpOworCisgICAgaWYgKCFxdWlldCkKKwltb3JlX3ByaW50ZigiUENJOiBSZXNvbHZpbmcgbW9kdWxlIG5hbWVzXG4iKTsKKyAgICAvKiBEZXRlY3Rpbmcgd2hpY2gga2VybmVsIG1vZHVsZSBzaG91bGQgbWF0Y2ggZWFjaCBkZXZpY2UgdXNpbmcgbW9kdWxlcy5wY2ltYXAgKi8KKyAgICBoYXJkd2FyZS0+bW9kdWxlc19wY2ltYXBfcmV0dXJuX2NvZGUgPQorCWdldF9tb2R1bGVfbmFtZV9mcm9tX3BjaW1hcChoYXJkd2FyZS0+cGNpX2RvbWFpbiwKKwkJCQkgICAgaGFyZHdhcmUtPm1vZHVsZXNfcGNpbWFwX3BhdGgpOworCisgICAgLyogRGV0ZWN0aW5nIHdoaWNoIGtlcm5lbCBtb2R1bGUgc2hvdWxkIG1hdGNoIGVhY2ggZGV2aWNlIHVzaW5nIG1vZHVsZXMuYWxpYXMgKi8KKyAgICBoYXJkd2FyZS0+bW9kdWxlc19hbGlhc19yZXR1cm5fY29kZSA9CisJZ2V0X21vZHVsZV9uYW1lX2Zyb21fYWxpYXMoaGFyZHdhcmUtPnBjaV9kb21haW4sCisJCQkJICAgaGFyZHdhcmUtPm1vZHVsZXNfYWxpYXNfcGF0aCk7CisKK30KKwordm9pZCBjcHVfZGV0ZWN0KHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpZiAoaGFyZHdhcmUtPmNwdV9kZXRlY3Rpb24gPT0gdHJ1ZSkKKwlyZXR1cm47CisgICAgZGV0ZWN0X2NwdSgmaGFyZHdhcmUtPmNwdSk7CisgICAgLyogT2xkIHByb2Nlc3NvcnMgZG9lc24ndCBtYW5hZ2UgdGhlIGlkZW50aWZ5IGNvbW1hbmRzIAorICAgICAqIExldCdzIHVzZSB0aGUgZG1pIHZhbHVlIGluIHRoYXQgY2FzZSAqLworICAgIGlmIChzdHJsZW4ocmVtb3ZlX3NwYWNlcyhoYXJkd2FyZS0+Y3B1Lm1vZGVsKSkgPT0gMCkKKwlzdHJsY3B5KGhhcmR3YXJlLT5jcHUubW9kZWwsIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnZlcnNpb24sCisJCXNpemVvZihoYXJkd2FyZS0+Y3B1Lm1vZGVsKSk7CisKKyAgICAvKiBTb21lIENQVXMgbGlrZSB0byBwdXQgbWFueSBzcGFjZXMgaW4gdGhlIG1vZGVsIG5hbWUKKyAgICAgKiBUaGF0IG1ha2VzIHNvbWUgd2VpcmQgZGlzcGxheSBpbiBjb25zb2xlL21lbnUKKyAgICAgKiBMZXQncyByZW1vdmUgdGhhdCBtdWxpdHBsZSBzcGFjZXMgKi8KKyAgICBzdHJsY3B5KGhhcmR3YXJlLT5jcHUubW9kZWwsZGVsX211bHRpX3NwYWNlcyhoYXJkd2FyZS0+Y3B1Lm1vZGVsKSxzaXplb2YoaGFyZHdhcmUtPmNwdS5tb2RlbCkpOworCisgICAgaWYgKChoYXJkd2FyZS0+aXNfYWNwaV92YWxpZCkgJiYgKGhhcmR3YXJlLT5hY3BpLm1hZHQudmFsaWQpKSB7CisgICAgCWhhcmR3YXJlLT5waHlzaWNhbF9jcHVfY291bnQ9aGFyZHdhcmUtPmFjcGkubWFkdC5wcm9jZXNzb3JfbG9jYWxfYXBpY19jb3VudCAvIGhhcmR3YXJlLT5jcHUubnVtX2NvcmVzOworICAgIH0KKyAgICBoYXJkd2FyZS0+Y3B1X2RldGVjdGlvbiA9IHRydWU7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBsYXN0IGluc3RhbmNlIG9mIGEgcGFydGljdWxhciBjb21tYW5kIGxpbmUgYXJndW1lbnQKKyAqICh3aGljaCBzaG91bGQgaW5jbHVkZSB0aGUgZmluYWwgPTsgZG8gbm90IHVzZSBmb3IgYm9vbGVhbiBhcmd1bWVudHMpCisgKi8KK2NvbnN0IGNoYXIgKmZpbmRfYXJndW1lbnQoY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKmFyZ3VtZW50KQoreworICAgIGludCBsYSA9IHN0cmxlbihhcmd1bWVudCk7CisgICAgY29uc3QgY2hhciAqKmFyZzsKKyAgICBjb25zdCBjaGFyICpwdHIgPSBOVUxMOworCisgICAgZm9yIChhcmcgPSBhcmd2OyAqYXJnOyBhcmcrKykgeworCWlmICghbWVtY21wKCphcmcsIGFyZ3VtZW50LCBsYSkpCisJICAgIHB0ciA9ICphcmcgKyBsYTsKKyAgICB9CisKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkIGNsZWFyX3NjcmVlbih2b2lkKQoreworICAgIG1vdmVfY3Vyc29yX3RvX25leHRfbGluZSgpOworICAgIGRpc2FibGVfdXRmOCgpOworICAgIHNldF9nMV9zcGVjaWFsX2NoYXIoKTsKKyAgICBzZXRfdXNfZzBfY2hhcnNldCgpOworICAgIGRpc3BsYXlfY3Vyc29yKGZhbHNlKTsKKyAgICBjbGVhcl9lbnRpcmVfc2NyZWVuKCk7CisgICAgZ290b3h5KDAsMCk7CisgICAgcmVzZXRfbW9yZV9wcmludGYoKTsKK30KKworLyogcmVtb3ZlIGJlZ2luaW5nIHNwYWNlcyAqLworY2hhciAqc2tpcF9zcGFjZXMoY2hhciAqcCkKK3sKKyAgICB3aGlsZSAoKnAgJiYgKnAgPD0gJyAnKSB7CisJcCsrOworICAgIH0KKworICAgIHJldHVybiBwOworfQorCisvKiByZW1vdmUgdHJhaWxpbmcgJiBiZWdpbmluZyBzcGFjZXMgKi8KK2NoYXIgKnJlbW92ZV9zcGFjZXMoY2hhciAqcCkKK3sKKyAgICBjaGFyICpzYXZlID0gcDsKKyAgICBwICs9IHN0cmxlbihwKSAtIDE7CisgICAgd2hpbGUgKCpwICYmICpwIDw9ICcgJykgeworCSpwID0gJ1wwJzsKKwlwLS07CisgICAgfQorICAgIHAgPSBzYXZlOworICAgIHdoaWxlICgqcCAmJiAqcCA8PSAnICcpIHsKKwlwKys7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKKy8qIHJlbW92ZSB0cmFpbGluZyBMRiAqLworY2hhciAqcmVtb3ZlX3RyYWlsaW5nX2xmKGNoYXIgKnApCit7CisgICAgY2hhciAqc2F2ZSA9IHA7CisgICAgcCArPSBzdHJsZW4ocCkgLSAxOworICAgIHdoaWxlICgqcCAmJiAqcCA9PSAxMCkgeworCSpwID0gJ1wwJzsKKwlwLS07CisgICAgfQorICAgIHAgPSBzYXZlOworCisgICAgcmV0dXJuIHA7Cit9CisKKy8qIGRlbGV0ZSBtdWx0aXBsZSBzcGFjZXMsIG9uZSBpcyBlbm91Z2ggKi8KK2NoYXIgKmRlbF9tdWx0aV9zcGFjZXMoY2hhciAqcCkKK3sKKyAgICAvKiBTYXZpbmcgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi8KKyAgICBjaGFyICpzYXZlID0gcDsKKworICAgIC8qIExldCdzIHBhcnNlIHRoZSBjb21wbGV0ZSBzdHJpbmcKKyAgICAgKiBBcyB3ZSBzZWFyY2ggZm9yIGEgZG91YmxlIHNwYWNpbmcKKyAgICAgKiB3ZSBoYXZlIHRvIGJlIHN1cmUgdGhlbiBzdHJpbmcgaXMKKyAgICAgKiBsb25nIGVub3VnaCB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICB3aGlsZSAoKnAgJiYgKihwICsgMSkpIHsKKworCS8qIElmIHdlIGhhdmUgdHdvIGNvbnNlY3V0aXZlIHNwYWNlcyAqLworCWlmICgoKnAgPT0gJyAnKSAmJiAoKihwICsgMSkgPT0gJyAnKSkgeworCisJICAgIC8qIExldCdzIGNvcHkgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24KKwkgICAgICogdGhlIGNvbnRlbnQgZnJvbSB0aGUgc2Vjb25kIHNwYWNlKi8KKwkgICAgc3RybGNweShwLCBwICsgMSwgc3RybGVuKHAgKyAxKSk7CisKKwkgICAgLyogRG9uJ3QgaW5jcmVtZW50IHRoZSBwb2ludGVyIGFzIHdlCisJICAgICAqIGNoYW5nZWQgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24qLworCSAgICBjb250aW51ZTsKKwl9CisKKwkvKiBOb3RoaW5nIGFzIGJlZW4gZm91bmQsIGxldCdzIHNlZSBvbiB0aGUgbmV4dCBjaGFyICovCisJcCsrOworICAgIH0KKyAgICAvKiBSZXR1cm5pbmcgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi8KKyAgICByZXR1cm4gc2F2ZTsKK30KKworLyogUmVzZXQgdGhlIG1vcmVfcHJpbnRmIGNvdW50ZXIgKi8KK3ZvaWQgcmVzZXRfbW9yZV9wcmludGYodm9pZCkKK3sKKyAgICBkaXNwbGF5X2xpbmVfbmIgPSAwOworfQorCitpbnQgZHJhd19iYWNrZ3JvdW5kKGNvbnN0IGNoYXIgKndoYXQpCit7CisgICAgaWYgKCF3aGF0KQorCXJldHVybiB2ZXNhY29uX2RlZmF1bHRfYmFja2dyb3VuZCgpOworICAgIGVsc2UKKwlyZXR1cm4gdmVzYWNvbl9sb2FkX2JhY2tncm91bmQod2hhdCk7Cit9CisKK3ZvaWQgaW5pdF9jb25zb2xlKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBpZiAodmVzYW1vZGUpIHsKKwlvcGVuY29uc29sZSgmZGV2X3Jhd2Nvbl9yLCAmZGV2X3Zlc2FzZXJpYWxfdyk7CisJZHJhd19iYWNrZ3JvdW5kKGhhcmR3YXJlLT52ZXNhX2JhY2tncm91bmQpOworICAgIH0gZWxzZQorCWNvbnNvbGVfYW5zaV9yYXcoKTsKK30KKwordm9pZCBkZXRlY3RfaGFyZHdhcmUoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGlmICghcXVpZXQpCisgICAgICAgIG1vcmVfcHJpbnRmKCJBQ1BJOiBEZXRlY3RpbmdcbiIpOworICAgIGRldGVjdF9hY3BpKGhhcmR3YXJlKTsKKworICAgIGlmICghcXVpZXQpCisgICAgICAgIG1vcmVfcHJpbnRmKCJNRU1PUlk6IERldGVjdGluZ1xuIik7CisgICAgZGV0ZWN0X21lbW9yeShoYXJkd2FyZSk7CisKKyAgICBpZiAoIXF1aWV0KQorICAgICAgICBtb3JlX3ByaW50ZigiRE1JOiBEZXRlY3RpbmcgVGFibGVcbiIpOworICAgIGlmIChkZXRlY3RfZG1pKGhhcmR3YXJlKSA9PSAtRU5PRE1JVEFCTEUpIHsKKyAgICAgICAgbW9yZV9wcmludGYoIkRNSTogRVJST1IgISBUYWJsZSBub3QgZm91bmQgISBcbiIpOworICAgICAgICBtb3JlX3ByaW50ZigiRE1JOiBNYW55IGhhcmR3YXJlIGNvbXBvbmVudHMgd2lsbCBub3QgYmUgZGV0ZWN0ZWQgISBcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICBtb3JlX3ByaW50ZigiRE1JOiBUYWJsZSBmb3VuZCAhICh2ZXJzaW9uICV1LiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlLT5kbWkuZG1pdGFibGUubWFqb3JfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlLT5kbWkuZG1pdGFibGUubWlub3JfdmVyc2lvbik7CisgICAgfQorCisgICAgaWYgKCFxdWlldCkKKyAgICAgICAgbW9yZV9wcmludGYoIkNQVTogRGV0ZWN0aW5nXG4iKTsKKyAgICBjcHVfZGV0ZWN0KGhhcmR3YXJlKTsKKworICAgIGlmICghcXVpZXQpCisgICAgICAgIG1vcmVfcHJpbnRmKCJESVNLUzogRGV0ZWN0aW5nXG4iKTsKKyAgICBkZXRlY3RfZGlza3MoaGFyZHdhcmUpOworCisgICAgaWYgKCFxdWlldCkKKyAgICAgICAgbW9yZV9wcmludGYoIlZQRDogRGV0ZWN0aW5nXG4iKTsKKyAgICBkZXRlY3RfdnBkKGhhcmR3YXJlKTsKKworICAgIGRldGVjdF9wY2koaGFyZHdhcmUpOworICAgIGlmICghcXVpZXQpCisgICAgICAgIG1vcmVfcHJpbnRmKCJQQ0k6ICVkIERldmljZXMgRm91bmRcbiIsIGhhcmR3YXJlLT5uYl9wY2lfZGV2aWNlcyk7CisgCisgICBpZiAoIXF1aWV0KQorICAgICAgICBtb3JlX3ByaW50ZigiUFhFOiBEZXRlY3RpbmdcbiIpOworICAgIGRldGVjdF9weGUoaGFyZHdhcmUpOworCisgICAgaWYgKCFxdWlldCkKKyAgICAgICAgbW9yZV9wcmludGYoIlZFU0E6IERldGVjdGluZ1xuIik7CisgICAgZGV0ZWN0X3Zlc2EoaGFyZHdhcmUpOworfQorCmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LWNvbW1vbi5oIGIvY29tMzIvaGR0L2hkdC1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FhNDNlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1jb21tb24uaApAQCAtMCwwICsxLDI1MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIERFRklORV9IRFRfQ09NTU9OX0gKKyNkZWZpbmUgREVGSU5FX0hEVF9DT01NT05fSAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzbGludXgvcHhlLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGNvbnNvbGVzLmg+CisjaW5jbHVkZSA8c3lzbGludXgvdmVzYWNvbi5oPgorI2luY2x1ZGUgInN5cy9wY2kuaCIKKworI2luY2x1ZGUgPGRpc2svYm9vdGxvYWRlcnMuaD4KKyNpbmNsdWRlIDxkaXNrL2Vycm5vX2Rpc2suaD4KKyNpbmNsdWRlIDxkaXNrL2Vycm9yLmg+CisjaW5jbHVkZSA8ZGlzay9nZW9tLmg+CisjaW5jbHVkZSA8ZGlzay9tYnJzLmg+CisjaW5jbHVkZSA8ZGlzay9tc2Rvcy5oPgorI2luY2x1ZGUgPGRpc2svcGFydGl0aW9uLmg+CisjaW5jbHVkZSA8ZGlzay9zd3N1c3AuaD4KKyNpbmNsdWRlIDxkaXNrL3JlYWQuaD4KKworI2luY2x1ZGUgImNwdWlkLmgiCisjaW5jbHVkZSAiZG1pL2RtaS5oIgorI2luY2x1ZGUgImhkdC1hdGEuaCIKKyNpbmNsdWRlIDxsaWIvc3lzL3Zlc2EvdmVzYS5oPgorI2luY2x1ZGUgPHZwZC92cGQuaD4KKyNpbmNsdWRlIDxsaWJhbnNpLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSA8bGlidXBsb2FkL3VwbG9hZF9iYWNrZW5kLmg+CisKKy8qIFRoaXMgdHdvIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3dpdGNoaW5nIGZvciB0aGUgbWVudSB0byB0aGUgQ0xJIG1vZGUgKi8KKyNkZWZpbmUgSERUX1NXSVRDSF9UT19DTEkgImhkdF9zd2l0Y2hfdG9fY2xpIgorI2RlZmluZSBIRFRfRFVNUCAiaGR0X2R1bXAiCisjZGVmaW5lIEhEVF9SRVRVUk5fVE9fQ0xJIDEwMAorI2RlZmluZSBNQVhfVkVTQV9NT0RFUyAyNTUKKworLyogVGhpcyB2YWx1ZSBpcyB1c2VkIGZvciByZWJvb3RpbmcgZnJvbSB0aGUgbWVudSBtb2RlICovCisjZGVmaW5lIEhEVF9SRUJPT1QgImhkdF9yZWJvb3QiCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21tYW5kcyB3ZSBjYW4gcHJvY2VzcyAqLworI2RlZmluZSBNQVhfTkJfQVVUT19DT01NQU5EUyAyNTUKKy8qIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBjb21tYW5kICovCisjZGVmaW5lIEFVVE9fQ09NTUFORF9TSVpFIDI1NQorLyogVGhlIGNoYXIgdGhhdCBzZXBhcmF0ZSB0d28gY29tbWFuZHMgKi8KKyNkZWZpbmUgQVVUT19TRVBBUkFUT1IgIjsiCisvKiBUaGUgY2hhciB0aGF0IHN1cnJvdW5kIHRoZSBsaXN0IG9mIGNvbW1hbmRzICovCisjZGVmaW5lIEFVVE9fREVMSU1JVEVSICdcJycgCisKKy8qIEdyYXBoaWMgdG8gbG9hZCBpbiBiYWNrZ3JvdW5kIHdoZW4gdXNpbmcgdGhlIHZlc2EgbW9kZSAqLworI2RlZmluZSBDTElfREVGQVVMVF9CQUNLR1JPVU5EICJiYWNrZ25kLnBuZyIKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzICovCisjZGVmaW5lIE1BWF9DTElfTElORVMgMjAKKyNkZWZpbmUgTUFYX1ZFU0FfQ0xJX0xJTkVTIDI0CisKK3N0cnVjdCB1cGxvYWRfYmFja2VuZCAqdXBsb2FkOworCisvKiBEZWZpbmVzIGlmIHRoZSBjbGkgaXMgcXVpZXQqLworYm9vbCBxdWlldDsKKworLyogRGVmaW5lcyBpZiB0aGUgY2xpIGlzIHRvdGFsbHkgc2lsZW50Ki8KK2Jvb2wgc2lsZW50OworCisvKiBEZWZpbmVzIGlmIHdlIG11c3QgdXNlIHRoZSB2ZXNhIG1vZGUgKi8KK2Jvb2wgdmVzYW1vZGU7CisKKy8qIERlZmluZXMgaWYgd2UgbXVzdCB1c2UgdGhlIG1lbnUgbW9kZSAqLworYm9vbCBtZW51bW9kZTsKKworLyogRGVmaW5lcyBpZiB3ZSBhcmUgcnVubmluZyB0aGUgYXV0byBtb2RlICovCitib29sIGF1dG9tb2RlOworCisvKiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGNvbnNvbGUKKyAqIERlZmF1bHQgaXMgMjAgZm9yIGEgc3RkIGNvbnNvbGUgKi8KK2V4dGVybiBpbnQgbWF4X2NvbnNvbGVfbGluZXM7CisKK2V4dGVybiBpbnQgZGlzcGxheV9saW5lX25iOworZXh0ZXJuIGJvb2wgZGlzYWJsZV9tb3JlX3ByaW50ZjsKKworI2RlZmluZSBwYXVzZV9wcmludGYoKSBkbyB7XAorICAgICAgIHByaW50ZigiLS1Nb3JlLS0iKTtcCisgICAgICAgZ2V0X2tleShzdGRpbiwgMCk7XAorICAgICAgIHByaW50ZigiXDAzM1syS1wwMzNbMUdcMDMzWzFGXG4iKTtcCit9IHdoaWxlICgwKTsKKworLyogVGhlIGJyb2tlbmVzcyBvZiB0aGF0IG1hY3JvIGlzIHRoYXQKKyAqIGl0IGFzc3VtZXMgdGhhdCBfX1ZBX0FSR1NfXyBjb250YWlucworICogb25lIFxuIChhbmQgb25seSBvbmUpCisgKi8KKyNkZWZpbmUgbW9yZV9wcmludGYoLi4uKSBkbyB7XAorIGlmIChfX2xpa2VseSghc2lsZW50KSkge1wKKyAgaWYgKF9fbGlrZWx5KCFkaXNhYmxlX21vcmVfcHJpbnRmKSkge1wKKyAgIGlmIChkaXNwbGF5X2xpbmVfbmIgPT0gbWF4X2NvbnNvbGVfbGluZXMpIHtcCisgICAgZGlzcGxheV9saW5lX25iPTA7XAorICAgIHByaW50ZigiXG4tLU1vcmUtLSIpO1wKKyAgICBnZXRfa2V5KHN0ZGluLCAwKTtcCisgICAgcHJpbnRmKCJcMDMzWzJLXDAzM1sxR1wwMzNbMUYiKTtcCisgICB9XAorICAgZGlzcGxheV9saW5lX25iKys7XAorICB9XAorICBwcmludGYoX19WQV9BUkdTX18pO1wKKyB9XAorfSB3aGlsZSAoMCk7CisKKy8qIERpc3BsYXkgQ1BVIHJlZ2lzdGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRyZWdzKGNvbnN0IGNvbTMyc3lzX3QgKiByKQoreworICAgIHByaW50ZigiZWZsYWdzID0gJTA4eCAgZHMgPSAlMDR4ICBlcyA9ICUwNHggIGZzID0gJTA0eCAgZ3MgPSAlMDR4XG4iCisJICAgImVheCA9ICUwOHggIGVieCA9ICUwOHggIGVjeCA9ICUwOHggIGVkeCA9ICUwOHhcbiIKKwkgICAiZWJwID0gJTA4eCAgZXNpID0gJTA4eCAgZWRpID0gJTA4eCAgZXNwID0gJTA4eFxuIiwKKwkgICByLT5lZmxhZ3MubCwgci0+ZHMsIHItPmVzLCByLT5mcywgci0+Z3MsCisJICAgci0+ZWF4LmwsIHItPmVieC5sLCByLT5lY3gubCwgci0+ZWR4LmwsCisJICAgci0+ZWJwLmwsIHItPmVzaS5sLCByLT5lZGkubCwgci0+X3VudXNlZF9lc3AubCk7Cit9CisKK3N0cnVjdCBzX3B4ZSB7CisgICAgdWludDE2X3QgdmVuZG9yX2lkOworICAgIHVpbnQxNl90IHByb2R1Y3RfaWQ7CisgICAgdWludDE2X3Qgc3VidmVuZG9yX2lkOworICAgIHVpbnQxNl90IHN1YnByb2R1Y3RfaWQ7CisgICAgdWludDhfdCByZXY7CisgICAgdWludDhfdCBwY2lfYnVzOworICAgIHVpbnQ4X3QgcGNpX2RldjsKKyAgICB1aW50OF90IHBjaV9mdW5jOworICAgIHVpbnQ4X3QgYmFzZV9jbGFzczsKKyAgICB1aW50OF90IHN1Yl9jbGFzczsKKyAgICB1aW50OF90IHByb2dfaW50ZjsKKyAgICB1aW50OF90IG5pY3R5cGU7CisgICAgY2hhciBtYWNfYWRkclsxOF07CQkvKiBUaGUgY3VycmVudCBtYWMgYWRkcmVzcyAqLworICAgIHVpbnQ4X3QgaXBfYWRkcls0XTsKKyAgICBweGVfYm9vdHBfdCBkaGNwZGF0YTsJLyogVGhlIGRoY3AgYW5zd2VyICovCisgICAgc3RydWN0IHBjaV9kZXZpY2UgKnBjaV9kZXZpY2U7CS8qIFRoZSBtYXRjaGluZyBwY2kgZGV2aWNlICovCisgICAgdWludDhfdCBwY2lfZGV2aWNlX3BvczsJLyogSXQgcG9zaXRpb24gaW4gb3VyIHBjaSBzb3J0ZWQgbGlzdCAqLworfTsKKworc3RydWN0IHNfdmVzYV9tb2RlX2luZm8geworICAgIHN0cnVjdCB2ZXNhX21vZGVfaW5mbyBtaTsKKyAgICB1aW50MTZfdCBtb2RlOworfTsKKworc3RydWN0IHNfdmVzYSB7CisgICAgdWludDhfdCBtYWpvcl92ZXJzaW9uOworICAgIHVpbnQ4X3QgbWlub3JfdmVyc2lvbjsKKyAgICBzdHJ1Y3Qgc192ZXNhX21vZGVfaW5mbyB2bWlbTUFYX1ZFU0FfTU9ERVNdOworICAgIHVpbnQ4X3Qgdm1pX2NvdW50OworICAgIHVpbnQxNl90IHRvdGFsX21lbW9yeTsKKyAgICBjaGFyIHZlbmRvclsyNTZdOworICAgIGNoYXIgcHJvZHVjdFsyNTZdOworICAgIGNoYXIgcHJvZHVjdF9yZXZpc2lvblsyNTZdOworICAgIHVpbnQxNl90IHNvZnR3YXJlX3JldjsKK307CisKK3N0cnVjdCBzX2hhcmR3YXJlIHsKKyAgICBzX2RtaSBkbWk7CQkJLyogRE1JIHRhYmxlICovCisgICAgc19jcHUgY3B1OwkJCS8qIENQVSBpbmZvcm1hdGlvbiAqLworICAgIHVpbnQ4X3QgcGh5c2ljYWxfY3B1X2NvdW50OyAvKiBOdW1iZXIgb2YgcGh5c2ljYWwgY3B1ICovCisgICAgc192cGQgdnBkOwkJCS8qIFZQRCBpbmZvcm1hdGlvbiAqLworICAgIHNfYWNwaSBhY3BpOworICAgIHN0cnVjdCBwY2lfZG9tYWluICpwY2lfZG9tYWluOwkvKiBQQ0kgRGV2aWNlcyAqLworICAgIHN0cnVjdCBkcml2ZWluZm8gZGlza19pbmZvWzI1Nl07CS8qIERpc2sgSW5mb3JtYXRpb24gKi8KKyAgICB1aW50MzJfdCBtYnJfaWRzWzI1Nl07CS8qIE1CUiBpZHMgKi8KKyAgICBpbnQgZGlza3NfY291bnQ7CQkvKiBOdW1iZXIgb2YgZGV0ZWN0ZWQgZGlza3MgKi8KKyAgICBzdHJ1Y3Qgc19weGUgcHhlOworICAgIHN0cnVjdCBzX3Zlc2EgdmVzYTsKKyAgICB1bnNpZ25lZCBsb25nIGRldGVjdGVkX21lbW9yeV9zaXplOwkvKiBUaGUgZGV0ZWN0ZWQgbWVtb3J5IHNpemUgKGluIEtCKSAqLworCisgICAgaW50IHBjaV9pZHNfcmV0dXJuX2NvZGU7CisgICAgaW50IG1vZHVsZXNfcGNpbWFwX3JldHVybl9jb2RlOworICAgIGludCBtb2R1bGVzX2FsaWFzX3JldHVybl9jb2RlOworICAgIGludCBuYl9wY2lfZGV2aWNlczsKKyAgICBib29sIGlzX2RtaV92YWxpZDsKKyAgICBib29sIGlzX3B4ZV92YWxpZDsKKyAgICBib29sIGlzX3Zlc2FfdmFsaWQ7CisgICAgYm9vbCBpc192cGRfdmFsaWQ7CisgICAgYm9vbCBpc19hY3BpX3ZhbGlkOworCisgICAgYm9vbCBkbWlfZGV0ZWN0aW9uOwkJLyogRG9lcyB0aGUgZG1pIHN0dWZmIGhhcyBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQ/ICovCisgICAgYm9vbCBwY2lfZGV0ZWN0aW9uOwkJLyogRG9lcyB0aGUgcGNpIHN0dWZmIGhhcyBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQ/ICovCisgICAgYm9vbCBjcHVfZGV0ZWN0aW9uOwkJLyogRG9lcyB0aGUgY3B1IHN0dWZmIGhhcyBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQ/ICovCisgICAgYm9vbCBkaXNrX2RldGVjdGlvbjsJLyogRG9lcyB0aGUgZGlzayBzdHVmZiBoYXMgYWxyZWFkeSBiZWVuIGRldGVjdGVkPyAqLworICAgIGJvb2wgcHhlX2RldGVjdGlvbjsJCS8qIERvZXMgdGhlIHB4ZSBzdHVmZiBoYXMgYWxyZWFkeSBiZWVuIGRldGVjdGVkPyAqLworICAgIGJvb2wgdmVzYV9kZXRlY3Rpb247CS8qIERvZXMgdGhlIHZlc2Egc3V0ZmYgaGF2ZSBiZWVuIGFscmVhZHkgZGV0ZWN0ZWQ/ICovCisgICAgYm9vbCB2cGRfZGV0ZWN0aW9uOwkJLyogRG9lcyB0aGUgdnBkIHN0dWZmIGhhcyBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQ/ICovCisgICAgYm9vbCBtZW1vcnlfZGV0ZWN0aW9uOwkvKiBEb2VzIHRoZSBtZW1vcnkgc2l6ZSBnb3QgZGV0ZWN0ZWQgPyovCisgICAgYm9vbCBhY3BpX2RldGVjdGlvbjsJLyogRG9lcyB0aGUgYWNwaSBnb3QgZGV0ZWN0ZWQgPyovCisKKyAgICBjaGFyIHN5c2xpbnV4X2ZzWzIyXTsKKyAgICBjb25zdCBzdHJ1Y3Qgc3lzbGludXhfdmVyc2lvbiAqc3Y7CisgICAgY2hhciBtb2R1bGVzX3BjaW1hcF9wYXRoWzI1NV07CisgICAgY2hhciBtb2R1bGVzX2FsaWFzX3BhdGhbMjU1XTsKKyAgICBjaGFyIHBjaWlkc19wYXRoWzI1NV07CisgICAgY2hhciBkdW1wX3BhdGhbMjU1XTsgLyogRHVtcCBwYXRoIG9uIHRoZSB0ZnRwIHNlcnZlciAqLworICAgIGNoYXIgZHVtcF9maWxlbmFtZVsyNTVdOyAvKiBEdW1wIGZpbGVuYW1lIG9uIHRoZSB0ZnRwIHNlcnZlciAqLworICAgIGNoYXIgdGZ0cF9pcFsyNTVdOyAgIC8qIElQIGFkZHJlc3Mgb2YgdGZ0cCBzZXJ2ZXIgKGR1bXAgbW9kZSkgKi8KKyAgICBjaGFyIG1lbXRlc3RfbGFiZWxbMjU1XTsKKyAgICBjaGFyIGF1dG9fbGFiZWxbQVVUT19DT01NQU5EX1NJWkVdOworICAgIGNoYXIgdmVzYV9iYWNrZ3JvdW5kWzI1NV07CisgICAgY2hhciBwb3N0ZXhlY1syNTVdOworfTsKKwordm9pZCByZXNldF9tb3JlX3ByaW50Zih2b2lkKTsKK2NvbnN0IGNoYXIgKmZpbmRfYXJndW1lbnQoY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKmFyZ3VtZW50KTsKK2NoYXIgKnJlbW92ZV9zcGFjZXMoY2hhciAqcCk7CitjaGFyICpyZW1vdmVfdHJhaWxpbmdfbGYoY2hhciAqcCk7CitjaGFyICpza2lwX3NwYWNlcyhjaGFyICpwKTsKK2NoYXIgKmRlbF9tdWx0aV9zcGFjZXMoY2hhciAqcCk7CitpbnQgZGV0ZWN0X2RtaShzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworaW50IGRldGVjdF92cGQoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKK3ZvaWQgZGV0ZWN0X2Rpc2tzKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7Cit2b2lkIGRldGVjdF9wY2koc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKK3ZvaWQgY3B1X2RldGVjdChzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworaW50IGRldGVjdF9weGUoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKK3ZvaWQgaW5pdF9oYXJkd2FyZShzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOwordm9pZCBjbGVhcl9zY3JlZW4odm9pZCk7Cit2b2lkIGRldGVjdF9zeXNsaW51eChzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworaW50IGRldGVjdF9hY3BpKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7Cit2b2lkIGRldGVjdF9wYXJhbWV0ZXJzKGNvbnN0IGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10sCisJCSAgICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworaW50IGRldGVjdF92ZXNhKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7Cit2b2lkIGRldGVjdF9tZW1vcnkoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKK3ZvaWQgaW5pdF9jb25zb2xlKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7Cit2b2lkIGRldGVjdF9oYXJkd2FyZShzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOwordm9pZCBkdW1wKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtZHVtcC1hY3BpLmMgYi9jb20zMi9oZHQvaGR0LWR1bXAtYWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYmFmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWR1bXAtYWNwaS5jCkBAIC0wLDAgKzEsNjAwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisjaW5jbHVkZSAiaGR0LWR1bXAuaCIKKwordm9pZCBzaG93X2hlYWRlcihjaGFyICpuYW1lLCB2b2lkICphZGRyZXNzLCBzX2FjcGlfZGVzY3JpcHRpb25faGVhZGVyICpoLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pCit7CisJY2hhciBzaWduYXR1cmVbMTBdPXswfTsKKwljaGFyIHJldmlzaW9uWzEwXT17MH07CisJY2hhciBzX2FkZHJlc3NbMTZdPXswfTsKKwljaGFyIG9lbV9pZFsxNl09ezB9OworCWNoYXIgb2VtX3RhYmxlX2lkWzE2XT17MH07CisJY2hhciBvZW1fcmV2aXNpb25bMTZdPXswfTsKKwljaGFyIGNyZWF0b3JfcmV2aXNpb25bMTZdPXswfTsKKwljaGFyIGNyZWF0b3JfaWRbMTZdPXswfTsKKwlzbnByaW50ZihzaWduYXR1cmUsc2l6ZW9mKHNpZ25hdHVyZSksIiVzIixoLT5zaWduYXR1cmUpOworCXNucHJpbnRmKHJldmlzaW9uLHNpemVvZihyZXZpc2lvbiksIjB4JTAzeCIsaC0+cmV2aXNpb24pOworCXNucHJpbnRmKG9lbV9pZCxzaXplb2Yob2VtX2lkKSwiJXMiLGgtPm9lbV9pZCk7CisJc25wcmludGYob2VtX3RhYmxlX2lkLHNpemVvZihvZW1fdGFibGVfaWQpLCIlcyIsaC0+b2VtX3RhYmxlX2lkKTsKKwlzbnByaW50ZihjcmVhdG9yX2lkLHNpemVvZihjcmVhdG9yX2lkKSwiJXMiLGgtPmNyZWF0b3JfaWQpOworCXNucHJpbnRmKG9lbV9yZXZpc2lvbixzaXplb2Yob2VtX3JldmlzaW9uKSwiMHglMDh4IixoLT5vZW1fcmV2aXNpb24pOworCXNucHJpbnRmKGNyZWF0b3JfcmV2aXNpb24sc2l6ZW9mKGNyZWF0b3JfcmV2aXNpb24pLCIweCUwOHgiLGgtPmNyZWF0b3JfcmV2aXNpb24pOworCXNucHJpbnRmKHNfYWRkcmVzcyxzaXplb2Yoc19hZGRyZXNzKSwiJXAiLGFkZHJlc3MpOworCisJY2hhciBhZGRyZXNzX25hbWVbMzJdPXswfTsKKwljaGFyIHNpZ25hdHVyZV9uYW1lWzMyXT17MH07CisJY2hhciByZXZpc2lvbl9uYW1lWzMyXT17MH07CisJY2hhciBvZW1faWRfbmFtZVszMl09ezB9OworCWNoYXIgb2VtX3RhYmxlX2lkX25hbWVbMzJdPXswfTsKKwljaGFyIG9lbV9yZXZpc2lvbl9uYW1lWzMyXT17MH07CisJY2hhciBjcmVhdG9yX3JldmlzaW9uX25hbWVbMzJdPXswfTsKKwljaGFyIGNyZWF0b3JfaWRfbmFtZVszMl09ezB9OworCXNucHJpbnRmKHNpZ25hdHVyZV9uYW1lLHNpemVvZihzaWduYXR1cmVfbmFtZSksImFjcGkuJXMuc2lnbmF0dXJlIixuYW1lKTsKKwlzbnByaW50ZihyZXZpc2lvbl9uYW1lLHNpemVvZihyZXZpc2lvbl9uYW1lKSwiYWNwaS4lcy5yZXZpc2lvbiIsbmFtZSk7CisJc25wcmludGYoYWRkcmVzc19uYW1lLHNpemVvZihhZGRyZXNzX25hbWUpLCJhY3BpLiVzLmFkZHJlc3MiLG5hbWUpOworCXNucHJpbnRmKG9lbV9pZF9uYW1lLHNpemVvZihvZW1faWRfbmFtZSksImFjcGkuJXMub2VtX2lkIixuYW1lKTsKKwlzbnByaW50ZihvZW1fdGFibGVfaWRfbmFtZSxzaXplb2Yob2VtX3RhYmxlX2lkX25hbWUpLCJhY3BpLiVzLm9lbV90YWJsZV9pZCIsbmFtZSk7CisJc25wcmludGYob2VtX3JldmlzaW9uX25hbWUsc2l6ZW9mKG9lbV9yZXZpc2lvbl9uYW1lKSwiYWNwaS4lcy5vZW1fcmV2aXNpb24iLG5hbWUpOworCXNucHJpbnRmKGNyZWF0b3JfcmV2aXNpb25fbmFtZSxzaXplb2YoY3JlYXRvcl9yZXZpc2lvbl9uYW1lKSwiYWNwaS4lcy5jcmVhdG9yX3JldmlzaW9uIixuYW1lKTsKKwlzbnByaW50ZihjcmVhdG9yX2lkX25hbWUsc2l6ZW9mKGNyZWF0b3JfaWRfbmFtZSksImFjcGkuJXMuY3JlYXRvcl9pZCIsbmFtZSk7CisKKwlBUFBFTkRfQVJSQVkKKwkJYWRkX2FzKHNpZ25hdHVyZV9uYW1lLHNpZ25hdHVyZSkKKwkJYWRkX2FzKHJldmlzaW9uX25hbWUscmV2aXNpb24pCisJCWFkZF9hcyhvZW1faWRfbmFtZSxvZW1faWQpCisJCWFkZF9hcyhvZW1fdGFibGVfaWRfbmFtZSxvZW1fdGFibGVfaWQpCisJCWFkZF9hcyhvZW1fcmV2aXNpb25fbmFtZSxvZW1fcmV2aXNpb24pCisJCWFkZF9hcyhjcmVhdG9yX2lkX25hbWUsY3JlYXRvcl9pZCkKKwkJYWRkX2FzKGNyZWF0b3JfcmV2aXNpb25fbmFtZSxjcmVhdG9yX3JldmlzaW9uKQorCQlhZGRfYXMoYWRkcmVzc19uYW1lLHNfYWRkcmVzcykKKwlFTkRfT0ZfQVBQRU5EOworCisJRkxVU0hfT0JKRUNUOworCit9CisKK3ZvaWQgZHVtcF9yc2R0KHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+cnNkdC52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwicnNkdCIpCisJCWFkZF9hcygiYWNwaS5yc2R0LmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPnJzZHQudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJyc2R0IixhY3BpLT5yc2R0LmFkZHJlc3MsICZhY3BpLT5yc2R0LmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKK3ZvaWQgZHVtcF94c2R0KHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+eHNkdC52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwieHNkdCIpCisJCWFkZF9hcygiYWNwaS54c2R0LmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPnhzZHQudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJ4c2R0IixhY3BpLT54c2R0LmFkZHJlc3MsICZhY3BpLT54c2R0LmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKK3ZvaWQgZHVtcF9mYWR0KHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+cnNkdC52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwiZmFkdCIpCisJCWFkZF9hcygiYWNwaS5mYWR0LmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPmZhZHQudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJmYWR0IixhY3BpLT5mYWR0LmFkZHJlc3MsICZhY3BpLT5mYWR0LmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKK3ZvaWQgZHVtcF9kc2R0KHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+ZHNkdC52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwiZHNkdCIpCisJCWFkZF9hcygiYWNwaS5kc2R0LmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPmRzZHQudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJkc2R0IixhY3BpLT5kc2R0LmFkZHJlc3MsICZhY3BpLT5kc2R0LmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKK3ZvaWQgZHVtcF9zYnN0KHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+c2JzdC52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwic2JzdCIpCisJCWFkZF9hcygiYWNwaS5zYnN0LmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPnNic3QudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJzYnN0IixhY3BpLT5zYnN0LmFkZHJlc3MsICZhY3BpLT5zYnN0LmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKK3ZvaWQgZHVtcF9lY2R0KHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+ZWNkdC52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwiZWNkdCIpCisJCWFkZF9hcygiYWNwaS5lY2R0LmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPmVjZHQudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJlY2R0IixhY3BpLT5lY2R0LmFkZHJlc3MsICZhY3BpLT5lY2R0LmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKK3ZvaWQgZHVtcF9ocGV0KHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+aHBldC52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwiaHBldCIpCisJCWFkZF9hcygiYWNwaS5ocGV0LmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPmhwZXQudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJocGV0IixhY3BpLT5ocGV0LmFkZHJlc3MsICZhY3BpLT5ocGV0LmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKK3ZvaWQgZHVtcF90Y3BhKHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+dGNwYS52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwidGNwYSIpCisJCWFkZF9hcygiYWNwaS50Y3BhLmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPnRjcGEudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJ0Y3BhIixhY3BpLT50Y3BhLmFkZHJlc3MsICZhY3BpLT50Y3BhLmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKK3ZvaWQgZHVtcF9tY2ZnKHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+bWNmZy52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwibWNmZyIpCisJCWFkZF9hcygiYWNwaS5tY2ZnLmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPm1jZmcudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJtY2ZnIixhY3BpLT5tY2ZnLmFkZHJlc3MsICZhY3BpLT5tY2ZnLmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKK3ZvaWQgZHVtcF9zbGljKHNfYWNwaSAqIGFjcGksIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworCWNoYXIgdmFsaWRbOF09ezB9OworCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwiZmFsc2UiKTsKKwlpZiAoYWNwaS0+c2xpYy52YWxpZCkgeworCQlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsInRydWUiKTsKKwl9CisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiYWNwaS5pdGVtIiwic2xpYyIpCisJCWFkZF9hcygiYWNwaS5zbGljLmlzX3ZhbGlkIix2YWxpZCkKKwlFTkRfT0ZfQVJSQVk7CisJCisJaWYgKGFjcGktPnNsaWMudmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJzbGljIixhY3BpLT5zbGljLmFkZHJlc3MsICZhY3BpLT5zbGljLmhlYWRlciwgY29uZmlnLCBpdGVtKTsJCit9CisKKwordm9pZCBkdW1wX2Jvb3Qoc19hY3BpICogYWNwaSwgWlpKU09OX0NPTkZJRyAqIGNvbmZpZywgWlpKU09OICoqIGl0ZW0pCit7CisJY2hhciB2YWxpZFs4XT17MH07CisJc25wcmludGYodmFsaWQsc2l6ZW9mKHZhbGlkKSwiJXMiLCJmYWxzZSIpOworCWlmIChhY3BpLT5ib290LnZhbGlkKSB7CisJCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwidHJ1ZSIpOworCX0KKwlDUkVBVEVfQVJSQVkKKwkJYWRkX2FzKCJhY3BpLml0ZW0iLCJib290IikKKwkJYWRkX2FzKCJhY3BpLmJvb3QuaXNfdmFsaWQiLHZhbGlkKQorCUVORF9PRl9BUlJBWTsKKwkKKwlpZiAoYWNwaS0+Ym9vdC52YWxpZD09ZmFsc2UpIHsKKwkJRkxVU0hfT0JKRUNUOworCQlyZXR1cm47CisJfQorCisJc2hvd19oZWFkZXIoImJvb3QiLGFjcGktPmJvb3QuYWRkcmVzcywgJmFjcGktPmJvb3QuaGVhZGVyLCBjb25maWcsIGl0ZW0pOwkKK30KKwordm9pZCBkdW1wX21hZHQoc19hY3BpICogYWNwaSwgWlpKU09OX0NPTkZJRyAqIGNvbmZpZywgWlpKU09OICoqIGl0ZW0pCit7CisJY2hhciB2YWxpZFs4XT17MH07CisJc25wcmludGYodmFsaWQsc2l6ZW9mKHZhbGlkKSwiJXMiLCJmYWxzZSIpOworCWlmIChhY3BpLT5tYWR0LnZhbGlkKSB7CisJCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwidHJ1ZSIpOworCX0KKwlDUkVBVEVfQVJSQVkKKwkJYWRkX2FzKCJhY3BpLml0ZW0iLCJtYWR0IikKKwkJYWRkX2FzKCJhY3BpLm1hZHQuaXNfdmFsaWQiLHZhbGlkKQorCUVORF9PRl9BUlJBWTsKKwkKKwlpZiAoYWNwaS0+bWFkdC52YWxpZD09ZmFsc2UpIHsKKwkJRkxVU0hfT0JKRUNUOworCQlyZXR1cm47CisJfQorCisJc2hvd19oZWFkZXIoIm1hZHQiLGFjcGktPm1hZHQuYWRkcmVzcywgJmFjcGktPm1hZHQuaGVhZGVyLCBjb25maWcsIGl0ZW0pOwkKK30KKwordm9pZCBkdW1wX3NzZHQoc19zc2R0ICpzc2R0LCBaWkpTT05fQ09ORklHICogY29uZmlnLCBaWkpTT04gKiogaXRlbSkKK3sKKwljaGFyIHZhbGlkWzhdPXswfTsKKwlzbnByaW50Zih2YWxpZCxzaXplb2YodmFsaWQpLCIlcyIsImZhbHNlIik7CisJaWYgKHNzZHQtPnZhbGlkKSB7CisJCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwidHJ1ZSIpOworCX0KKwlDUkVBVEVfQVJSQVkKKwkJYWRkX2FzKCJhY3BpLml0ZW0iLCJzc2R0IikKKwkJYWRkX2FzKCJhY3BpLnNzZHQuaXNfdmFsaWQiLHZhbGlkKQorCUVORF9PRl9BUlJBWTsKKwkKKwlpZiAoc3NkdC0+dmFsaWQ9PWZhbHNlKSB7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCXNob3dfaGVhZGVyKCJzc2R0Iixzc2R0LT5hZGRyZXNzLCAmc3NkdC0+aGVhZGVyLCBjb25maWcsIGl0ZW0pOwkKK30KKwordm9pZCBkdW1wX3JzZHAoc19hY3BpICogYWNwaSwgWlpKU09OX0NPTkZJRyAqIGNvbmZpZywgWlpKU09OICoqIGl0ZW0pCit7CisJY2hhciB2YWxpZFs4XT17MH07CisJc25wcmludGYodmFsaWQsc2l6ZW9mKHZhbGlkKSwiJXMiLCJmYWxzZSIpOworCWlmIChhY3BpLT5yc2RwLnZhbGlkKSB7CisJCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwidHJ1ZSIpOworCX0KKwlDUkVBVEVfQVJSQVkKKwkJYWRkX2FzKCJhY3BpLml0ZW0iLCJyc2RwIikKKwkJYWRkX2FzKCJhY3BpLnJzZHAuaXNfdmFsaWQiLHZhbGlkKQorCUVORF9PRl9BUlJBWTsKKwkKKwlpZiAoYWNwaS0+cnNkcC52YWxpZD09ZmFsc2UpIHsKKwkJRkxVU0hfT0JKRUNUOworCQlyZXR1cm47CisJfQorCisJc19yc2RwICpyID0gJmFjcGktPnJzZHA7CisJY2hhciByZXZpc2lvblsxMF09ezB9OworCWNoYXIgYWRkcmVzc1sxNl09ezB9OworCWNoYXIgb2VtX2lkWzE2XT17MH07CisJc25wcmludGYocmV2aXNpb24sc2l6ZW9mKHJldmlzaW9uKSwiMHglMDN4IixyLT5yZXZpc2lvbik7CisJc25wcmludGYoYWRkcmVzcyxzaXplb2YoYWRkcmVzcyksIiVwIixyLT5hZGRyZXNzKTsKKwlzbnByaW50ZihvZW1faWQsc2l6ZW9mKG9lbV9pZCksIiVzIixyLT5vZW1faWQpOworCUFQUEVORF9BUlJBWQorCQlhZGRfYXMoImFjcGkucnNkcC5yZXZpc2lvbiIscmV2aXNpb24pCisJCWFkZF9hcygiYWNwaS5yc2RwLm9lbV9pZCIsb2VtX2lkKQorCQlhZGRfYXMoImFjcGkucnNkcC5hZGRyZXNzIixhZGRyZXNzKQorCUVORF9PRl9BUFBFTkQ7CisKKwlGTFVTSF9PQkpFQ1Q7CisKK30KKwordm9pZCBkdW1wX2ZhY3Moc19hY3BpICogYWNwaSwgWlpKU09OX0NPTkZJRyAqIGNvbmZpZywgWlpKU09OICoqIGl0ZW0pCit7CisJY2hhciB2YWxpZFs4XT17MH07CisJc25wcmludGYodmFsaWQsc2l6ZW9mKHZhbGlkKSwiJXMiLCJmYWxzZSIpOworCWlmIChhY3BpLT5mYWNzLnZhbGlkKSB7CisJCXNucHJpbnRmKHZhbGlkLHNpemVvZih2YWxpZCksIiVzIiwidHJ1ZSIpOworCX0KKwlDUkVBVEVfQVJSQVkKKwkJYWRkX2FzKCJhY3BpLml0ZW0iLCJmYWNzIikKKwkJYWRkX2FzKCJhY3BpLmZhY3MuaXNfdmFsaWQiLHZhbGlkKQorCUVORF9PRl9BUlJBWTsKKwkKKwlpZiAoYWNwaS0+ZmFjcy52YWxpZD09ZmFsc2UpIHsKKwkJRkxVU0hfT0JKRUNUOworCQlyZXR1cm47CisJfQorCisJc19mYWNzICpmYSA9ICZhY3BpLT5mYWNzOworCWNoYXIgYWRkcmVzc1sxNl09ezB9OworCXNucHJpbnRmKGFkZHJlc3Msc2l6ZW9mKGFkZHJlc3MpLCIlcCIsZmEtPmFkZHJlc3MpOworCUFQUEVORF9BUlJBWQorCQlhZGRfYXMoImFjcGkuZmFjcy5hZGRyZXNzIixhZGRyZXNzKQorCUVORF9PRl9BUFBFTkQ7CisKKwlGTFVTSF9PQkpFQ1Q7CisKK30KKwordm9pZCBkdW1wX2ludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGUoc19tYWR0ICogbWFkdCwgWlpKU09OX0NPTkZJRyAqIGNvbmZpZywgWlpKU09OICoqIGl0ZW0pCit7CisgICAgQ1JFQVRFX0FSUkFZCisJYWRkX2FzKCJhY3BpLml0ZW0iLCJpbnRlcnJ1cHRfc291cmNlX292ZXJyaWRlIikKKyAgICAJYWRkX2FpKCJhY3BpLmludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGUuY291bnQiLCBtYWR0LT5pbnRlcnJ1cHRfc291cmNlX292ZXJyaWRlX2NvdW50KQorICAgIEVORF9PRl9BUlJBWTsKKworICAgIGlmIChtYWR0LT5pbnRlcnJ1cHRfc291cmNlX292ZXJyaWRlX2NvdW50ID09IDApIHsKKyAgICAJICAgIEZMVVNIX09CSkVDVDsKKwkgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIExldCdzIHByb2Nlc3MgZWFjaCBpbnRlcnJ1cHQgc291cmNlIG92ZXJyaWRlICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYWR0LT5pbnRlcnJ1cHRfc291cmNlX292ZXJyaWRlX2NvdW50OyBpKyspIHsKKwlzX2ludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGUgKnNpc28gPSAmbWFkdC0+aW50ZXJydXB0X3NvdXJjZV9vdmVycmlkZVtpXTsKKwljaGFyIGJ1ZmZlclsyMF0gPSB7MH07CisJY2hhciBidXNfdHlwZVsxMF09IHswfTsKKwkKKwkvKiBTcGVjIHJlcG9ydCBidXMgdHlwZSAwIGFzIElTQSAqLworCWlmIChzaXNvLT5idXMgPT0gMCkKKwkgICAgc3RyY3B5KGJ1c190eXBlLCAiSVNBIik7CisJZWxzZQorCSAgICBzdHJjcHkoYnVzX3R5cGUsICJ1bmtub3duIik7CisKKwlBUFBFTkRfQVJSQVkKKwkJYWRkX2FzKCJhY3BpLmludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGUuYnVzX3R5cGUiLGJ1c190eXBlKQorCQlhZGRfYWkoImFjcGkuaW50ZXJydXB0X3NvdXJjZV9vdmVycmlkZS5idXMiLHNpc28tPmJ1cykKKwkJYWRkX2FpKCJhY3BpLmludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGUuYnVzX2lycSIsc2lzby0+c291cmNlKQorCQlhZGRfYWkoImFjcGkuaW50ZXJydXB0X3NvdXJjZV9vdmVycmlkZS5nbG9iYWxfaXJxIixzaXNvLT5nbG9iYWxfc3lzdGVtX2ludGVycnVwdCkKKwkJYWRkX2FzKCJhY3BpLmludGVycnVwdF9zb3VyY2Vfb3ZlcnJpZGUuZmxhZ3MiLGZsYWdzX3RvX3N0cmluZyhidWZmZXIsc2lzby0+ZmxhZ3MpKQorCUVORF9PRl9BUFBFTkQ7CisgICAgfQorICAgIEZMVVNIX09CSkVDVDsKK30KKwordm9pZCBkdW1wX2lvX2FwaWMoc19tYWR0ICogbWFkdCwgWlpKU09OX0NPTkZJRyAqIGNvbmZpZywgWlpKU09OICoqIGl0ZW0pCit7CisgICAgQ1JFQVRFX0FSUkFZCisJYWRkX2FzKCJhY3BpLml0ZW0iLCJpb19hcGljIikKKyAgICAJYWRkX2FpKCJhY3BpLmlvX2FwaWMuY291bnQiLCBtYWR0LT5pb19hcGljX2NvdW50KQorICAgIEVORF9PRl9BUlJBWTsKKworICAgIGlmIChtYWR0LT5pb19hcGljX2NvdW50ID09IDApIHsKKyAgICAJICAgIEZMVVNIX09CSkVDVDsKKwkgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEZvciBhbGwgSU8gQVBJQ1MgKi8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hZHQtPmlvX2FwaWNfY291bnQ7IGkrKykgeworCXNfaW9fYXBpYyAqc2lvID0gJm1hZHQtPmlvX2FwaWNbaV07CisJY2hhciBidWZmZXJbMTVdPXswfTsKKwltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisJLyogR1NJIGJhc2UgcmVwb3J0cyB0aGUgR1NJIGNvbmZpZ3VyYXRpb24KKwkgKiBMZXQncyBpbnRlcnByZXQgaXQgYXMgc3RyaW5nICovCisJc3dpdGNoIChzaW8tPmdsb2JhbF9zeXN0ZW1faW50ZXJydXB0X2Jhc2UpIHsKKwljYXNlIDA6CisJICAgIHN0cmNweShidWZmZXIsICIwLTIzIik7CisJICAgIGJyZWFrOworCWNhc2UgMjQ6CisJICAgIHN0cmNweShidWZmZXIsIjI0LTM5Iik7CisJICAgIGJyZWFrOworCWNhc2UgNDA6CisJICAgIHN0cmNweShidWZmZXIsICI0MC01NSIpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBzdHJjcHkoYnVmZmVyLCJVbmtub3duIik7CisJICAgIGJyZWFrOworCX0KKworCWNoYXIgYXBpY19pZFsxNl0gPSB7IDAgfTsKKwljaGFyIGFkZHJlc3NbMTZdID0geyAwIH07CisJc25wcmludGYoYXBpY19pZCxzaXplb2YoYXBpY19pZCksIjB4JTAyeCIsc2lvLT5pb19hcGljX2lkKTsKKwlzbnByaW50ZihhZGRyZXNzLHNpemVvZihhZGRyZXNzKSwiMHglMDh4IixzaW8tPmlvX2FwaWNfYWRkcmVzcyk7CisJQVBQRU5EX0FSUkFZCisJCWFkZF9haSgiYWNwaS5pb19hcGljLm51bWJlciIsaSkKKwkJYWRkX2FzKCJhY3BpLmlvX2FwaWMuYXBpY19pZCIsYXBpY19pZCkKKwkJYWRkX2FzKCJhY3BpLmlvX2FwaWMuYWRyZXNzIixhZGRyZXNzKQorCQlhZGRfYXMoImFjcGkuaW9fYXBpYy5nc2kiLGJ1ZmZlcikKKwlFTkRfT0ZfQVBQRU5EOworICAgIH0KKyAgICBGTFVTSF9PQkpFQ1Q7Cit9CisKK3ZvaWQgZHVtcF9sb2NhbF9hcGljX25taShzX21hZHQgKiBtYWR0LCBaWkpTT05fQ09ORklHICogY29uZmlnLCBaWkpTT04gKiogaXRlbSkKK3sKKyAgICBDUkVBVEVfQVJSQVkKKwlhZGRfYXMoImFjcGkuaXRlbSIsImxvY2FsX2FwaWNfbm1pIikKKyAgICAJYWRkX2FpKCJhY3BpLmxvY2FsX2FwaWNfbm1pLmNvdW50IiwgbWFkdC0+bG9jYWxfYXBpY19ubWlfY291bnQpCisgICAgRU5EX09GX0FSUkFZOworCisgICAgaWYgKG1hZHQtPmxvY2FsX2FwaWNfbm1pX2NvdW50ID09IDApIHsKKyAgICAJICAgIEZMVVNIX09CSkVDVDsKKwkgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFkdC0+bG9jYWxfYXBpY19ubWlfY291bnQ7IGkrKykgeworCXNfbG9jYWxfYXBpY19ubWkgKnNsYW4gPSAmbWFkdC0+bG9jYWxfYXBpY19ubWlbaV07CisJY2hhciBidWZmZXJbMjBdPXswfTsKKwljaGFyIGFjcGlfaWRbMTZdID0geyAwIH07CisJY2hhciBsb2NhbF9hcGljX2xpbnRbMTZdID0geyAwIH07CisJc25wcmludGYoYWNwaV9pZCwgc2l6ZW9mKGFjcGlfaWQpLCAiMHglMDJ4Iiwgc2xhbi0+YWNwaV9wcm9jZXNzb3JfaWQpOworCXNucHJpbnRmKGxvY2FsX2FwaWNfbGludCwgc2l6ZW9mKGxvY2FsX2FwaWNfbGludCksICIweCUwMngiLCBzbGFuLT5sb2NhbF9hcGljX2xpbnQpOworCUFQUEVORF9BUlJBWQorCQlhZGRfYXMoImFjcGkucHJvY2Vzc29yX2lkIiwgYWNwaV9pZCkKKwkJYWRkX2FzKCJhY3BpLmxvY2FsX2FwaWNfbm1pLmZsYWdzIiwgZmxhZ3NfdG9fc3RyaW5nKGJ1ZmZlcixzbGFuLT5mbGFncykpCisJCWFkZF9hcygiYWNwaS5sb2NhbF9hcGljX25taS5saW50Iixsb2NhbF9hcGljX2xpbnQpCisJRU5EX09GX0FQUEVORDsKKyAgICB9CisKKyAgICBGTFVTSF9PQkpFQ1Q7Cit9CisKK3ZvaWQgZHVtcF9sb2NhbF9hcGljKHNfbWFkdCAqIG1hZHQsIFpaSlNPTl9DT05GSUcgKiBjb25maWcsIFpaSlNPTiAqKiBpdGVtKQoreworICAgIGNoYXIgYnVmZmVyWzE2XSA9IHsgMCB9OworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIweCUwOHgiLCBtYWR0LT5sb2NhbF9hcGljX2FkZHJlc3MpOworCisgICAgQ1JFQVRFX0FSUkFZCisJYWRkX2FzKCJhY3BpLml0ZW0iLCJsb2NhbF9hcGljIikKKyAgICAJYWRkX2FzKCJhY3BpLmxvY2FsX2FwaWMuYWRkcmVzcyIsIGJ1ZmZlcikKKyAgICAJYWRkX2FpKCJhY3BpLnByb2Nlc3Nvcl9sb2NhbF9hcGljLmNvdW50IiwgbWFkdC0+cHJvY2Vzc29yX2xvY2FsX2FwaWNfY291bnQpCisgICAgRU5EX09GX0FSUkFZOworCisgICAgaWYgKG1hZHQtPnByb2Nlc3Nvcl9sb2NhbF9hcGljX2NvdW50ID09MCkgeworICAgICAgICBGTFVTSF9PQkpFQ1Q7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEZvciBhbGwgZGV0ZWN0ZWQgbG9naWNhbCBDUFUgKi8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hZHQtPnByb2Nlc3Nvcl9sb2NhbF9hcGljX2NvdW50OyBpKyspIHsKKwlzX3Byb2Nlc3Nvcl9sb2NhbF9hcGljICpzbGEgPSAmbWFkdC0+cHJvY2Vzc29yX2xvY2FsX2FwaWNbaV07CisJY2hhciBsYXBpY19zdGF0dXNbMTZdID0geyAwIH07CisJY2hhciBhY3BpX2lkWzE2XSA9IHsgMCB9OworCWNoYXIgYXBpY19pZFsxNl0gPSB7IDAgfTsKKworCXNucHJpbnRmKGxhcGljX3N0YXR1cyxzaXplb2YobGFwaWNfc3RhdHVzKSwiJXMiLCJkaXNhYmxlZCIpOworCS8qIExldCdzIGNoZWNrIGlmIHRoZSBmbGFncyByZXBvcnRzIHRoZSBjcHUgYXMgZW5hYmxlZCAqLworCWlmICgoc2xhLT5mbGFncyAmIFBST0NFU1NPUl9MT0NBTF9BUElDX0VOQUJMRSkgPT0KKwkgICAgUFJPQ0VTU09SX0xPQ0FMX0FQSUNfRU5BQkxFKQorCSAgICBzbnByaW50ZihsYXBpY19zdGF0dXMsc2l6ZW9mKGxhcGljX3N0YXR1cyksIiVzIiwiZW5hYmxlZCIpOworCXNucHJpbnRmKGFjcGlfaWQsIHNpemVvZihhY3BpX2lkKSwgIjB4JTAyeCIsIHNsYS0+YWNwaV9pZCk7CisJc25wcmludGYoYXBpY19pZCwgc2l6ZW9mKGFwaWNfaWQpLCAiMHglMDJ4Iiwgc2xhLT5hcGljX2lkKTsKKwlBUFBFTkRfQVJSQVkKKwkJYWRkX2FpKCJhY3BpLmNwdS5hcGljX2lkIiwgc2xhLT5hcGljX2lkKQorCQlhZGRfYXMoImFjcGkuY3B1LmFwaWNfaWQgKGhleCkiLCBhcGljX2lkKQorCQlhZGRfYXMoImFjcGkuY3B1LmFjcGlfaWQgKGhleCkiLCBhY3BpX2lkKQorCQlhZGRfYXMoImFjcGkubGFwaWMuZW5hYmxlZCIsIGxhcGljX3N0YXR1cykKKwlFTkRfT0ZfQVBQRU5EOworICAgIH0KKyAgICBGTFVTSF9PQkpFQ1Q7Cit9CisKK3ZvaWQgZHVtcF9hY3BpKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqIGNvbmZpZywKKwkgICAgICAgWlpKU09OICoqIGl0ZW0pCit7CisgICAgQ1JFQVRFX05FV19PQkpFQ1Q7CisgICAgYWRkX2hiKGlzX2FjcGlfdmFsaWQpOworICAgIGlmIChoYXJkd2FyZS0+aXNfYWNwaV92YWxpZCA9PSBmYWxzZSkKKwlnb3RvIGV4aXQ7CisKKyAgICBzX21hZHQgKm1hZHQgPSAmaGFyZHdhcmUtPmFjcGkubWFkdDsKKyAgICBhZGRfYigiYWNwaS5hcGljLmRldGVjdGVkIiwgbWFkdC0+dmFsaWQpOworICAgIGlmIChtYWR0LT52YWxpZCA9PSBmYWxzZSkgeworCWdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBGTFVTSF9PQkpFQ1Q7CisKKyAgICBkdW1wX2xvY2FsX2FwaWMobWFkdCwgY29uZmlnLCBpdGVtKTsKKyAgICBkdW1wX2xvY2FsX2FwaWNfbm1pKG1hZHQsIGNvbmZpZywgaXRlbSk7CisgICAgZHVtcF9pb19hcGljKG1hZHQsIGNvbmZpZywgaXRlbSk7CisgICAgZHVtcF9pbnRlcnJ1cHRfc291cmNlX292ZXJyaWRlKG1hZHQsIGNvbmZpZywgaXRlbSk7CisKKyAgICBkdW1wX3JzZHAoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX3JzZHQoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX3hzZHQoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX2ZhZHQoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX2RzZHQoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX3Nic3QoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX2VjZHQoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX2hwZXQoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX3RjcGEoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX21jZmcoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX3NsaWMoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX2Jvb3QoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBkdW1wX21hZHQoJmhhcmR3YXJlLT5hY3BpLGNvbmZpZyxpdGVtKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhcmR3YXJlLT5hY3BpLnNzZHRfY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKChoYXJkd2FyZS0+YWNwaS5zc2R0W2ldICE9IE5VTEwpICYmIChoYXJkd2FyZS0+YWNwaS5zc2R0W2ldLT52YWxpZCkpCisJCSAgICBkdW1wX3NzZHQoaGFyZHdhcmUtPmFjcGkuc3NkdFtpXSwgY29uZmlnLCBpdGVtKTsKKyAgICB9CisgICAgZHVtcF9mYWNzKCZoYXJkd2FyZS0+YWNwaSxjb25maWcsaXRlbSk7CisKK2V4aXQ6CisgICAgdG9fY3BpbygiYWNwaSIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1kdW1wLWNwdS5jIGIvY29tMzIvaGR0L2hkdC1kdW1wLWNwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDU2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWR1bXAtY3B1LmMKQEAgLTAsMCArMSw1MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTEgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAiaGR0LWNvbW1vbi5oIgorI2luY2x1ZGUgImhkdC1kdW1wLmgiCisKK3ZvaWQgZHVtcF9jcHUoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pIHsKKworICAgICAgICBDUkVBVEVfTkVXX09CSkVDVDsKKwlhZGRfaHMoY3B1LnZlbmRvcik7CisJYWRkX2hzKGNwdS5tb2RlbCk7CisJYWRkX2hpKGNwdS52ZW5kb3JfaWQpOworCWFkZF9oaShjcHUuZmFtaWx5KTsKKwlhZGRfaGkoY3B1Lm1vZGVsX2lkKTsKKwlhZGRfaGkoY3B1LnN0ZXBwaW5nKTsKKwlhZGRfaGkoY3B1Lm51bV9jb3Jlcyk7CisJYWRkX2hpKGNwdS5sMV9kYXRhX2NhY2hlX3NpemUpOworCWFkZF9oaShjcHUubDFfaW5zdHJ1Y3Rpb25fY2FjaGVfc2l6ZSk7CisJYWRkX2hpKGNwdS5sMl9jYWNoZV9zaXplKTsKKwlzaXplX3QgaTsKKwlmb3IgKGkgPSAwOyBpIDwgY3B1X2ZsYWdzX2NvdW50OyBpKyspIHsKKwkJY2hhciB0ZW1wWzEyOF09ezB9OworCQlzbnByaW50Zih0ZW1wLHNpemVvZih0ZW1wKSwiY3B1LmZsYWdzLiVzIixjcHVfZmxhZ3NfbmFtZXNbaV0pOworCQlhZGRfYih0ZW1wLGdldF9jcHVfZmxhZ192YWx1ZV9mcm9tX25hbWUoJmhhcmR3YXJlLT5jcHUsY3B1X2ZsYWdzX25hbWVzW2ldKSk7CisJfQorCUZMVVNIX09CSkVDVDsKKwl0b19jcGlvKCJjcHUiKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtZHVtcC1kaXNrcy5jIGIvY29tMzIvaGR0L2hkdC1kdW1wLWRpc2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3NDRiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtZHVtcC1kaXNrcy5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisjaW5jbHVkZSAiaGR0LWR1bXAuaCIKKyNpbmNsdWRlICJoZHQtdXRpbC5oIgorCitaWkpTT05fQ09ORklHICpjb25maWc7CitaWkpTT04gKippdGVtOworCitzdGF0aWMgdm9pZCBzaG93X3BhcnRpdGlvbl9pbmZvcm1hdGlvbihzdHJ1Y3QgZHJpdmVpbmZvICpkcml2ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBhcnRfZW50cnkgKnB0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFydGl0aW9uX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9wYXJ0aXRpb25zX3NlZW4pIHsKKyAgICBjaGFyIHNpemVbMTFdID0gezB9OworICAgIGNoYXIgYm9vdGxvYWRlcl9uYW1lWzldID0gezB9OworICAgIGNoYXIgb3N0eXBlWzY0XT17MH07CisgICAgY2hhciAqcGFydHR5cGU7CisgICAgdW5zaWduZWQgaW50IHN0YXJ0LCBlbmQ7CisgICAgY2hhciBib290YWJsZVs2XSA9IHswfTsKKworICAgIGludCBpID0gbmJfcGFydGl0aW9uc19zZWVuOworICAgIHN0YXJ0ID0gcGFydGl0aW9uX29mZnNldDsKKyAgICBlbmQgPSBzdGFydCArIHB0YWItPmxlbmd0aCAtIDE7CisKKyAgICBpZiAocHRhYi0+bGVuZ3RoID4gMCkKKyAgICAgICAgc2VjdG9yc190b19zaXplKHB0YWItPmxlbmd0aCwgc2l6ZSk7CisKKyAgICBnZXRfbGFiZWwocHRhYi0+b3N0eXBlLCAmcGFydHR5cGUpOworICAgIGdldF9ib290bG9hZGVyX3N0cmluZyhkcml2ZV9pbmZvLCBwdGFiLCBib290bG9hZGVyX25hbWUsIDkpOworICAgIGlmIChwdGFiLT5hY3RpdmVfZmxhZyA9PSAweDgwKQorICAgIAlzbnByaW50Zihib290YWJsZSxzaXplb2YoYm9vdGFibGUpLCIlcyIsInRydWUiKTsKKyAgICBlbHNlCisJc25wcmludGYoYm9vdGFibGUsc2l6ZW9mKGJvb3RhYmxlKSwiJXMiLCJmYWxzZSIpOworCisgICAgc25wcmludGYob3N0eXBlLHNpemVvZihvc3R5cGUpLCIlMDJYIixwdGFiLT5vc3R5cGUpOworCisgICAgQVBQRU5EX0FSUkFZCisJICAgIGFkZF9haSgicGFydGl0aW9uLT5udW1iZXIiLGkpCisJICAgIGFkZF9haSgicGFydGl0aW9uLT5zZWN0b3Jfc3RhcnQiLHN0YXJ0KQorCSAgICBhZGRfYWkoInBhcnRpdGlvbi0+c2VjdG9yX2VuZCIsZW5kKQorCSAgICBhZGRfYXMoInBhcnRpdGlvbi0+c2l6ZSIsc2l6ZSkKKwkgICAgYWRkX2FzKCJwYXJ0aXRpb24tPnR5cGUiLHBhcnR0eXBlKQorCSAgICBhZGRfYXMoInBhcnRpdGlvbi0+b3NfdHlwZSIsb3N0eXBlKQorCSAgICBhZGRfYXMoInBhcnRpdGlvbi0+Ym9vdF9mbGFnIixib290YWJsZSkKKyAgICBFTkRfT0ZfQVBQRU5EOworICAgIGZyZWUocGFydHR5cGUpOworfQorCisKKwordm9pZCBzaG93X2Rpc2soc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25mLCBaWkpTT04gKippdCwgaW50IGRyaXZlKSB7CisJY29uZmlnPWNvbmY7CisJaXRlbT1pdDsKKwlpbnQgaSA9IGRyaXZlIC0gMHg4MDsKKwlzdHJ1Y3QgZHJpdmVpbmZvICpkID0gJmhhcmR3YXJlLT5kaXNrX2luZm9baV07CisJY2hhciBtYnJfbmFtZVs1MF09ezB9OworCWNoYXIgZGlza19zaXplWzExXT17MH07CisKKwlnZXRfbWJyX3N0cmluZyhoYXJkd2FyZS0+bWJyX2lkc1tpXSwgJm1icl9uYW1lLHNpemVvZihtYnJfbmFtZSkpOworCWlmICgoaW50KWQtPmVkZF9wYXJhbXMuc2VjdG9ycyA+IDApCisJCXNlY3RvcnNfdG9fc2l6ZSgoaW50KWQtPmVkZF9wYXJhbXMuc2VjdG9ycywgZGlza19zaXplKTsKKworCWNoYXIgZGlza1s1XT17MH07CisJY2hhciBlZGRfdmVyc2lvbls1XT17MH07CisJc25wcmludGYoZGlzayxzaXplb2YoZGlzayksIjB4JVgiLGQtPmRpc2spOworCXNucHJpbnRmKGVkZF92ZXJzaW9uLHNpemVvZihlZGRfdmVyc2lvbiksIiVYIixkLT5lZGRfdmVyc2lvbik7CisJenpqc29uX3ByaW50KGNvbmZpZywgKml0ZW0pOworCXp6anNvbl9mcmVlKGNvbmZpZywgKml0ZW0pOworCisJQ1JFQVRFX0FSUkFZCisJCWFkZF9hcygiZGlzay0+bnVtYmVyIixkaXNrKSAKKwkJYWRkX2FpKCJkaXNrLT5jeWxpbmRlcnMiLGQtPmxlZ2FjeV9tYXhfY3lsaW5kZXIgKzEpIAorCQlhZGRfYWkoImRpc2stPmhlYWRzIixkLT5sZWdhY3lfbWF4X2hlYWQgKzEpCisJCWFkZF9haSgiZGlzay0+c2VjdG9yc19wZXJfdHJhY2siLGQtPmxlZ2FjeV9zZWN0b3JzX3Blcl90cmFjaykKKwkJYWRkX2FzKCJkaXNrLT5lZGRfdmVyc2lvbiIsZWRkX3ZlcnNpb24pCisJCWFkZF9hcygiZGlzay0+c2l6ZSIsZGlza19zaXplKQorCQlhZGRfYWkoImRpc2stPmJ5dGVzX3Blcl9zZWN0b3IiLChpbnQpZC0+ZWRkX3BhcmFtcy5ieXRlc19wZXJfc2VjdG9yKQorCQlhZGRfYWkoImRpc2stPnNlY3RvcnNfcGVyX3RyYWNrIiwoaW50KWQtPmVkZF9wYXJhbXMuc2VjdG9yc19wZXJfdHJhY2spCisJCWFkZF9hcygiZGlzay0+aG9zdF9idXMiLHJlbW92ZV9zcGFjZXMoKGNoYXIgKilkLT5lZGRfcGFyYW1zLmhvc3RfYnVzX3R5cGUpKQorCQlhZGRfYXMoImRpc2stPmludGVyZmFjZV90eXBlIixyZW1vdmVfc3BhY2VzKChjaGFyICopZC0+ZWRkX3BhcmFtcy5pbnRlcmZhY2VfdHlwZSkpCisJCWFkZF9hcygiZGlzay0+bWJyX25hbWUiLG1icl9uYW1lKQorCQlhZGRfYWkoImRpc2stPm1icl9pZCIsaGFyZHdhcmUtPm1icl9pZHNbaV0pCisJRU5EX09GX0FSUkFZOworCisJaWYgKHBhcnNlX3BhcnRpdGlvbl90YWJsZShkLCAmc2hvd19wYXJ0aXRpb25faW5mb3JtYXRpb24pKSB7CisJICAgICAgICBpZiAoZXJybm9fZGlzaykgeyAKKwkJCUFQUEVORF9BUlJBWQorCQkJCWFkZF9hcygiZGlzay0+ZXJyb3IiLCAiSU8gRXJyb3IiKQorCQkJRU5EX09GX0FQUEVORDsKKwkJfSBlbHNlICB7CisJCQlBUFBFTkRfQVJSQVkKKwkJCQlhZGRfYXMoImRpc2stPmVycm9yIiwgIlVucmVjb2duaXplZCBQYXJ0aXRpb24gTGF5b3V0IikKKwkJCUVORF9PRl9BUFBFTkQ7CisJCX0KKwl9Cit9CisKK3ZvaWQgZHVtcF9kaXNrcyhzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSkgeworCWJvb2wgZm91bmQ9ZmFsc2U7CisKKyAJaWYgKGhhcmR3YXJlLT5kaXNrc19jb3VudCA+IDApICAKKwkgICAgZm9yIChpbnQgZHJpdmUgPSAweDgwOyBkcml2ZSA8IDB4ZmY7IGRyaXZlKyspIHsKKwkgICAgICAgIGlmIChoYXJkd2FyZS0+ZGlza19pbmZvW2RyaXZlIC0gMHg4MF0uY2Jpb3MpIHsKKwkJCWlmIChmb3VuZD09ZmFsc2UpIHsKKwkJCQlDUkVBVEVfTkVXX09CSkVDVDsKKwkJCQlhZGRfYigiZGlza3MtPmlzX3ZhbGlkIix0cnVlKTsKKyAgICAgICAJCQkJZm91bmQ9dHJ1ZTsKKwkJCX0KKwkJCXNob3dfZGlzayhoYXJkd2FyZSwgY29uZmlnLCBpdGVtLCBkcml2ZSk7CisJCX0KKwl9CisKKwlpZiAoZm91bmQ9PWZhbHNlKSB7CisJCUNSRUFURV9ORVdfT0JKRUNUOworCQlhZGRfYigiZGlza3MtPmlzX3ZhbGlkIixmYWxzZSk7CisJfQorCUZMVVNIX09CSkVDVDsKKwl0b19jcGlvKCJkaXNrcyIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1kdW1wLWRtaS5jIGIvY29tMzIvaGR0L2hkdC1kdW1wLWRtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWMxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWR1bXAtZG1pLmMKQEAgLTAsMCArMSw0NDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKyNpbmNsdWRlICJoZHQtZHVtcC5oIgorCit2b2lkIGR1bXBfaGFyZHdhcmVfc2VjdXJpdHkoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pIHsKKwlpZiAoIWhhcmR3YXJlLT5kbWkuaGFyZHdhcmVfc2VjdXJpdHkuZmlsbGVkKSB7CisJCQlDUkVBVEVfTkVXX09CSkVDVDsKKwkJCQlhZGRfcygiZG1pLndhcm5pbmciLCJObyBoYXJkd2FyZSBzZWN1cml0eSBzdHJ1Y3R1cmUgZm91bmQiKTsKKwkJCUZMVVNIX09CSkVDVDsKKwkJCXJldHVybjsKKwl9CisJCisJQ1JFQVRFX05FV19PQkpFQ1Q7CisJCWFkZF9zKCJkbWkuaXRlbSIsImhhcmR3YXJlX3NlY3VyaXR5Iik7CisJCWFkZF9ocyhkbWkuaGFyZHdhcmVfc2VjdXJpdHkucG93ZXJfb25fcGFzc3dkX3N0YXR1cyk7CisJCWFkZF9ocyhkbWkuaGFyZHdhcmVfc2VjdXJpdHkua2V5Ym9hcmRfcGFzc3dkX3N0YXR1cyk7CisJCWFkZF9ocyhkbWkuaGFyZHdhcmVfc2VjdXJpdHkuYWRtaW5pc3RyYXRvcl9wYXNzd2Rfc3RhdHVzKTsKKwkJYWRkX2hzKGRtaS5oYXJkd2FyZV9zZWN1cml0eS5mcm9udF9wYW5lbF9yZXNldF9zdGF0dXMpOworCUZMVVNIX09CSkVDVDsKK30KKwordm9pZCBkdW1wX29lbV9zdHJpbmdzKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisJaWYgKHN0cmxlbihoYXJkd2FyZS0+ZG1pLm9lbV9zdHJpbmdzKSA9PSAwKSB7CisJCQlDUkVBVEVfTkVXX09CSkVDVDsKKwkJCQlhZGRfcygiZG1pLndhcm5pbmciLCJObyBPRU0gc3RydWN0dXJlIGZvdW5kIik7CisJCQlGTFVTSF9PQkpFQ1Q7CisJCQlyZXR1cm47CisJfQorCUNSRUFURV9ORVdfT0JKRUNUOworCQlhZGRfcygiZG1pLml0ZW0iLCJPRU0iKTsKKwkJYWRkX2hzKGRtaS5vZW1fc3RyaW5ncyk7CisJRkxVU0hfT0JKRUNUOworfQorCit2b2lkIGR1bXBfbWVtb3J5X3NpemUoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pIHsKKwlDUkVBVEVfTkVXX09CSkVDVDsKKwkJYWRkX3MoImRtaS5pdGVtIiwibWVtb3J5IHNpemUiKTsKKwkJYWRkX2koImRtaS5tZW1vcnlfc2l6ZSAoS0IpIixoYXJkd2FyZS0+ZGV0ZWN0ZWRfbWVtb3J5X3NpemUpOworCQlhZGRfaSgiZG1pLm1lbW9yeV9zaXplIChNQikiLChoYXJkd2FyZS0+ZGV0ZWN0ZWRfbWVtb3J5X3NpemUgKyAoMSA8PCA5KSkgPj4gMTApOworCUZMVVNIX09CSkVDVDsKK30KKwordm9pZCBkdW1wX21lbW9yeV9tb2R1bGVzKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisKKwlpZiAoaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlX2NvdW50ID09IDApIHsKKwkJCUNSRUFURV9ORVdfT0JKRUNUOworCQkJCWFkZF9zKCJkbWkud2FybmluZyIsIk5vIG1lbW9yeSBtb2R1bGUgc3RydWN0dXJlIGZvdW5kIik7CisJCQlGTFVTSF9PQkpFQ1Q7CisJCQlyZXR1cm47CisJfQorCisJZm9yIChpbnQgbW9kdWxlPTA7IG1vZHVsZTxoYXJkd2FyZS0+ZG1pLm1lbW9yeV9tb2R1bGVfY291bnQ7bW9kdWxlKyspIHsKKwkJaWYgKGhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZVttb2R1bGVdLmZpbGxlZCA9PSBmYWxzZSkgeworCQkJY2hhciBtc2dbNjRdPXswfTsKKwkJCXNucHJpbnRmKG1zZyxzaXplb2YobXNnKSwiTW9kdWxlICVkIGRvZXNuJ3QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24iLCBtb2R1bGUpOworCisJCQlDUkVBVEVfTkVXX09CSkVDVDsKKwkJCQlhZGRfcygiZG1pLndhcm5pbmciLG1zZyk7CisJCQlGTFVTSF9PQkpFQ1Q7CisJCQljb250aW51ZTsKKwkJfQorCisJCUNSRUFURV9ORVdfT0JKRUNUOworCQlhZGRfaSgiTWVtb3J5IG1vZHVsZSIsIG1vZHVsZSk7CisJCWFkZF9zKCJkbWkubWVtb3J5X21vZHVsZS5zb2NrZXRfZGVzaWduYXRpb24iLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeV9tb2R1bGVbbW9kdWxlXS5zb2NrZXRfZGVzaWduYXRpb24pOworCQlhZGRfcygiZG1pLm1lbW9yeV9tb2R1bGUuYmFua19jb25uZWN0aW9ucyIsIGhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZVttb2R1bGVdLmJhbmtfY29ubmVjdGlvbnMpOworCQlhZGRfcygiZG1pLm1lbW9yeV9tb2R1bGUuc3BlZWQiLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeV9tb2R1bGVbbW9kdWxlXS5zcGVlZCk7CisJCWFkZF9zKCJkbWkubWVtb3J5X21vZHVsZS50eXBlIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlfbW9kdWxlW21vZHVsZV0udHlwZSk7CisJCWFkZF9zKCJkbWkubWVtb3J5X21vZHVsZS5pbnN0YWxsZWRfc2l6ZSIsIGhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZVttb2R1bGVdLmluc3RhbGxlZF9zaXplKTsKKwkJYWRkX3MoImRtaS5tZW1vcnlfbW9kdWxlLmVuYWJsZWRfc2l6ZSIsIGhhcmR3YXJlLT5kbWkubWVtb3J5X21vZHVsZVttb2R1bGVdLmVuYWJsZWRfc2l6ZSk7CisJCWFkZF9zKCJkbWkubWVtb3J5X21vZHVsZS5lcnJvcl9zdGF0dXMiLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeV9tb2R1bGVbbW9kdWxlXS5lcnJvcl9zdGF0dXMpOworCQlGTFVTSF9PQkpFQ1Q7CisJfQorfQorCQordm9pZCBkdW1wX2NhY2hlKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisKKwlpZiAoaGFyZHdhcmUtPmRtaS5jYWNoZV9jb3VudCA9PSAwKSB7CisJCQlDUkVBVEVfTkVXX09CSkVDVDsKKwkJCQlhZGRfcygiZG1pLndhcm5pbmciLCJObyBjYWNoZSBzdHJ1Y3R1cmUgZm91bmQiKTsKKwkJCUZMVVNIX09CSkVDVDsKKwkJCXJldHVybjsKKwl9CisKKwlmb3IgKGludCBjYWNoZT0wOyBjYWNoZTxoYXJkd2FyZS0+ZG1pLmNhY2hlX2NvdW50O2NhY2hlKyspIHsKKwkJQ1JFQVRFX05FV19PQkpFQ1Q7CisJCWFkZF9pKCJDYWNoZSIsIGNhY2hlKTsKKwkJYWRkX3MoImRtaS5jYWNoZS5zb2NrZXRfZGVzaWduYXRpb24iLCBoYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5zb2NrZXRfZGVzaWduYXRpb24pOworCQlhZGRfcygiZG1pLmNhY2hlLmNvbmZpZ3VyYXRpb24iLCBoYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5jb25maWd1cmF0aW9uKTsKKwkJYWRkX3MoImRtaS5jYWNoZS5tb2RlIiwgaGFyZHdhcmUtPmRtaS5jYWNoZVtjYWNoZV0ubW9kZSk7CisJCWFkZF9zKCJkbWkuY2FjaGUubG9jYXRpb24iLCBoYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5sb2NhdGlvbik7CisJCWFkZF9pKCJkbWkuY2FjaGUuaW5zdGFsbGVkX3NpemUgKEtCKSIsIGhhcmR3YXJlLT5kbWkuY2FjaGVbY2FjaGVdLmluc3RhbGxlZF9zaXplKTsKKwkJYWRkX2koImRtaS5jYWNoZS5tYXhfc2l6ZSAoS0IpIiwgaGFyZHdhcmUtPmRtaS5jYWNoZVtjYWNoZV0ubWF4X3NpemUpOworCQlhZGRfcygiZG1pLmNhY2hlLnN1cHBvcnRlZF9zcmFtX3R5cGVzIiwgaGFyZHdhcmUtPmRtaS5jYWNoZVtjYWNoZV0uc3VwcG9ydGVkX3NyYW1fdHlwZXMpOworCQlhZGRfcygiZG1pLmNhY2hlLmluc3RhbGxlZF9zcmFtX3R5cGVzIiwgaGFyZHdhcmUtPmRtaS5jYWNoZVtjYWNoZV0uaW5zdGFsbGVkX3NyYW1fdHlwZXMpOworCQlhZGRfaSgiZG1pLmNhY2hlLnNwZWVkIChucykiLCBoYXJkd2FyZS0+ZG1pLmNhY2hlW2NhY2hlXS5zcGVlZCk7CisJCWFkZF9zKCJkbWkuY2FjaGUuZXJyb3JfY29ycmVjdGlvbl90eXBlIiwgaGFyZHdhcmUtPmRtaS5jYWNoZVtjYWNoZV0uZXJyb3JfY29ycmVjdGlvbl90eXBlKTsKKwkJYWRkX3MoImRtaS5jYWNoZS5zeXN0ZW1fdHlwZSIsIGhhcmR3YXJlLT5kbWkuY2FjaGVbY2FjaGVdLnN5c3RlbV90eXBlKTsKKwkJYWRkX3MoImRtaS5jYWNoZS5hc3NvY2lhdGl2aXR5IiwgaGFyZHdhcmUtPmRtaS5jYWNoZVtjYWNoZV0uYXNzb2NpYXRpdml0eSk7CisJCUZMVVNIX09CSkVDVDsKKwl9Cit9Cit2b2lkIGR1bXBfbWVtb3J5X2JhbmtzKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisKKwlpZiAoaGFyZHdhcmUtPmRtaS5tZW1vcnlfY291bnQgPT0gMCkgeworCQkJQ1JFQVRFX05FV19PQkpFQ1Q7CisJCQkJYWRkX3MoImRtaS53YXJuaW5nIiwiTm8gbWVtb3J5IGJhbmsgc3RydWN0dXJlIGZvdW5kIik7CisJCQlGTFVTSF9PQkpFQ1Q7CisJCQlyZXR1cm47CisJfQorCisJZm9yIChpbnQgYmFuaz0wOyBiYW5rPGhhcmR3YXJlLT5kbWkubWVtb3J5X2NvdW50O2JhbmsrKykgeworCisJCWlmIChoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5maWxsZWQgPT0gZmFsc2UpIHsKKwkJCWNoYXIgbXNnWzY0XT17MH07CisJCQlzbnByaW50Zihtc2csc2l6ZW9mKG1zZyksIkJhbmsgJWQgZG9lc24ndCBjb250YWluIGFueSBpbmZvcm1hdGlvbiIsIGJhbmspOworCisJCQlDUkVBVEVfTkVXX09CSkVDVDsKKwkJCQlhZGRfcygiZG1pLndhcm5pbmciLG1zZyk7CisJCQlGTFVTSF9PQkpFQ1Q7CisJCQljb250aW51ZTsKKwkJfQorCisJCUNSRUFURV9ORVdfT0JKRUNUOworCQlhZGRfaSgiTWVtb3J5IEJhbmsiLCBiYW5rKTsKKwkJYWRkX3MoImRtaS5tZW1vcnkuZm9ybV9mYWN0b3IiLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5mb3JtX2ZhY3Rvcik7CisJCWFkZF9zKCJkbWkubWVtb3J5LnR5cGUiLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS50eXBlKTsKKwkJYWRkX3MoImRtaS5tZW1vcnkudHlwZV9kZXRhaWwiLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS50eXBlX2RldGFpbCk7CisJCWFkZF9zKCJkbWkubWVtb3J5LnNwZWVkIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10uc3BlZWQpOworCQlhZGRfcygiZG1pLm1lbW9yeS5zaXplIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10uc2l6ZSk7CisJCWFkZF9zKCJkbWkubWVtb3J5LmRldmljZV9zZXQiLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5kZXZpY2Vfc2V0KTsKKwkJYWRkX3MoImRtaS5tZW1vcnkuZGV2aWNlX2xvY2F0b3IiLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5kZXZpY2VfbG9jYXRvcik7CisJCWFkZF9zKCJkbWkubWVtb3J5LmJhbmtfbG9jYXRvciIsIGhhcmR3YXJlLT5kbWkubWVtb3J5W2JhbmtdLmJhbmtfbG9jYXRvcik7CisJCWFkZF9zKCJkbWkubWVtb3J5LnRvdGFsX3dpZHRoIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10udG90YWxfd2lkdGgpOworCQlhZGRfcygiZG1pLm1lbW9yeS5kYXRhX3dpZHRoIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10uZGF0YV93aWR0aCk7CisJCWFkZF9zKCJkbWkubWVtb3J5LmVycm9yIiwgaGFyZHdhcmUtPmRtaS5tZW1vcnlbYmFua10uZXJyb3IpOworCQlhZGRfcygiZG1pLm1lbW9yeS52ZW5kb3IiLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5tYW51ZmFjdHVyZXIpOworCQlhZGRfcygiZG1pLm1lbW9yeS5zZXJpYWwiLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5zZXJpYWwpOworCQlhZGRfcygiZG1pLm1lbW9yeS5hc3NldF90YWciLCBoYXJkd2FyZS0+ZG1pLm1lbW9yeVtiYW5rXS5hc3NldF90YWcpOworCQlhZGRfcygiZG1pLm1lbW9yeS5wYXJ0X251bWJlciIsIGhhcmR3YXJlLT5kbWkubWVtb3J5W2JhbmtdLnBhcnRfbnVtYmVyKTsKKwkJRkxVU0hfT0JKRUNUOworCX0KK30KKwordm9pZCBkdW1wX3Byb2Nlc3NvcihzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSkgeworCWlmIChoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5maWxsZWQgPT0gZmFsc2UpIHsKKwkJQ1JFQVRFX05FV19PQkpFQ1Q7CisJCQlhZGRfcygiZG1pLndhcm5pbmciLCJubyBwcm9jZXNzb3Igc3RydWN0dXJlIGZvdW5kIik7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCWNoYXIgdm9sdGFnZVsxNl09ezB9OworCXNucHJpbnRmKHZvbHRhZ2Usc2l6ZW9mKHZvbHRhZ2UpLCIlZC4lMDJkIiwKKwkJaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3Iudm9sdGFnZV9tdiAvIDEwMDAsCisJCWhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnZvbHRhZ2VfbXYgLSAoKGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnZvbHRhZ2VfbXYgLyAxMDAwKSAqIDEwMDApKTsKKworCUNSRUFURV9ORVdfT0JKRUNUOworCWFkZF9zKCJkbWkuaXRlbSIsInByb2Nlc3NvciIpOworCWFkZF9ocyhkbWkucHJvY2Vzc29yLnNvY2tldF9kZXNpZ25hdGlvbik7CisJYWRkX2hzKGRtaS5wcm9jZXNzb3IudHlwZSk7CisJYWRkX2hzKGRtaS5wcm9jZXNzb3IuZmFtaWx5KTsKKwlhZGRfaHMoZG1pLnByb2Nlc3Nvci5tYW51ZmFjdHVyZXIpOworCWFkZF9ocyhkbWkucHJvY2Vzc29yLnZlcnNpb24pOworCWFkZF9oaShkbWkucHJvY2Vzc29yLmV4dGVybmFsX2Nsb2NrKTsKKwlhZGRfaGkoZG1pLnByb2Nlc3Nvci5tYXhfc3BlZWQpOworCWFkZF9oaShkbWkucHJvY2Vzc29yLmN1cnJlbnRfc3BlZWQpOworCWFkZF9oaShkbWkucHJvY2Vzc29yLnNpZ25hdHVyZS50eXBlKTsKKwlhZGRfaGkoZG1pLnByb2Nlc3Nvci5zaWduYXR1cmUuZmFtaWx5KTsKKwlhZGRfaGkoZG1pLnByb2Nlc3Nvci5zaWduYXR1cmUubW9kZWwpOworCWFkZF9oaShkbWkucHJvY2Vzc29yLnNpZ25hdHVyZS5zdGVwcGluZyk7CisJYWRkX2hpKGRtaS5wcm9jZXNzb3Iuc2lnbmF0dXJlLm1pbm9yX3N0ZXBwaW5nKTsKKwlhZGRfcygiZG1pLnByb2Nlc3Nvci52b2x0YWdlIix2b2x0YWdlKTsKKwlhZGRfaHMoZG1pLnByb2Nlc3Nvci5zdGF0dXMpOworCWFkZF9ocyhkbWkucHJvY2Vzc29yLnVwZ3JhZGUpOworCWFkZF9ocyhkbWkucHJvY2Vzc29yLmNhY2hlMSk7CisJYWRkX2hzKGRtaS5wcm9jZXNzb3IuY2FjaGUyKTsKKwlhZGRfaHMoZG1pLnByb2Nlc3Nvci5jYWNoZTMpOworCWFkZF9ocyhkbWkucHJvY2Vzc29yLnNlcmlhbCk7CisJYWRkX2hzKGRtaS5wcm9jZXNzb3IucGFydF9udW1iZXIpOworCWFkZF9oaShkbWkucHJvY2Vzc29yLmNvcmVfY291bnQpOworCWFkZF9oaShkbWkucHJvY2Vzc29yLmNvcmVfZW5hYmxlZCk7CisJYWRkX2hpKGRtaS5wcm9jZXNzb3IudGhyZWFkX2NvdW50KTsKKwlhZGRfaHMoZG1pLnByb2Nlc3Nvci5pZCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBQUk9DRVNTT1JfRkxBR1NfRUxFTUVOVFM7IGkrKykgeworCSAgICAgICAgaWYgKCgoYm9vbCAqKSAoJmhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmNwdV9mbGFncykpW2ldID09IHRydWUpIHsKKwkgICAgICAgICAgICBhZGRfcygiZG1pLnByb2Nlc3Nvci5mbGFnIiwoY2hhciAqKWNwdV9mbGFnc19zdHJpbmdzW2ldKTsKKwkJfQorCX0KKwlGTFVTSF9PQkpFQ1Q7Cit9CisKK3ZvaWQgZHVtcF9iYXR0ZXJ5KHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisJaWYgKGhhcmR3YXJlLT5kbWkuYmF0dGVyeS5maWxsZWQgPT0gZmFsc2UpIHsKKwkJQ1JFQVRFX05FV19PQkpFQ1Q7CisJCQlhZGRfcygiZG1pLndhcm5pbmciLCJubyBiYXR0ZXJ5IHN0cnVjdHVyZSBmb3VuZCIpOworCQlGTFVTSF9PQkpFQ1Q7CisJCXJldHVybjsKKwl9CisKKwlDUkVBVEVfTkVXX09CSkVDVDsKKwlhZGRfcygiZG1pLml0ZW0iLCJiYXR0ZXJ5Iik7CisJYWRkX2hzKGRtaS5iYXR0ZXJ5Lm1hbnVmYWN0dXJlcik7CisJYWRkX2hzKGRtaS5iYXR0ZXJ5Lm1hbnVmYWN0dXJlX2RhdGUpOworCWFkZF9ocyhkbWkuYmF0dGVyeS5zZXJpYWwpOworCWFkZF9ocyhkbWkuYmF0dGVyeS5uYW1lKTsKKwlhZGRfaHMoZG1pLmJhdHRlcnkuY2hlbWlzdHJ5KTsKKwlhZGRfaHMoZG1pLmJhdHRlcnkuZGVzaWduX2NhcGFjaXR5KTsKKwlhZGRfaHMoZG1pLmJhdHRlcnkuZGVzaWduX3ZvbHRhZ2UpOworCWFkZF9ocyhkbWkuYmF0dGVyeS5zYmRzKTsKKwlhZGRfaHMoZG1pLmJhdHRlcnkuc2Jkc19tYW51ZmFjdHVyZV9kYXRlKTsKKwlhZGRfaHMoZG1pLmJhdHRlcnkuc2Jkc19jaGVtaXN0cnkpOworCWFkZF9ocyhkbWkuYmF0dGVyeS5tYXhpbXVtX2Vycm9yKTsKKwlhZGRfaHMoZG1pLmJhdHRlcnkub2VtX2luZm8pOworCUZMVVNIX09CSkVDVDsKK30KKwordm9pZCBkdW1wX2lwbWkoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pIHsKKwlpZiAoaGFyZHdhcmUtPmRtaS5pcG1pLmZpbGxlZCA9PSBmYWxzZSkgeworCQlDUkVBVEVfTkVXX09CSkVDVDsKKwkJCWFkZF9zKCJkbWkud2FybmluZyIsIm5vIElQTUkgc3RydWN0dXJlIGZvdW5kIik7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCWNoYXIgc3BlY192ZXJbMTZdPXswfTsKKwljaGFyIGkyY1sxNl09ezB9OworCWNoYXIgYmFzZVsxNl09ezB9OworCXNucHJpbnRmKHNwZWNfdmVyLHNpemVvZihzcGVjX3ZlciksIiV1LiV1IiwKKwkJCWhhcmR3YXJlLT5kbWkuaXBtaS5tYWpvcl9zcGVjaWZpY2F0aW9uX3ZlcnNpb24sCisJCQloYXJkd2FyZS0+ZG1pLmlwbWkubWlub3Jfc3BlY2lmaWNhdGlvbl92ZXJzaW9uKTsKKworCXNucHJpbnRmKGkyYyxzaXplb2YoaTJjKSwiMHglMDJ4IiwgaGFyZHdhcmUtPmRtaS5pcG1pLkkyQ19zbGF2ZV9hZGRyZXNzKTsKKwlzbnByaW50ZihiYXNlLHNpemVvZihiYXNlKSwiJTA4WCUwOFgiLAorCQkJKHVpbnQzMl90KShoYXJkd2FyZS0+ZG1pLmlwbWkuYmFzZV9hZGRyZXNzID4+IDMyKSwKKwkJCSh1aW50MzJfdCkoKGhhcmR3YXJlLT5kbWkuaXBtaS5iYXNlX2FkZHJlc3MgJiAweEZGRkYpICYgfjEpKTsKKworCUNSRUFURV9ORVdfT0JKRUNUOworCWFkZF9zKCJkbWkuaXRlbSIsImlwbWkiKTsKKwlhZGRfaHMoZG1pLmlwbWkuaW50ZXJmYWNlX3R5cGUpOworCWFkZF9zKCJkbWkuaXBtaS5zcGVjX3ZlcnNpb24iLHNwZWNfdmVyKTsKKwlhZGRfaGkoZG1pLmlwbWkuSTJDX3NsYXZlX2FkZHJlc3MpOworCWFkZF9oaShkbWkuaXBtaS5udl9hZGRyZXNzKTsKKwlhZGRfcygiZG1pLmlwbWkuYmFzZV9hZGRyZXNzIixiYXNlKTsKKwlhZGRfaGkoZG1pLmlwbWkuaXJxKTsKKwlGTFVTSF9PQkpFQ1Q7Cit9CisKK3ZvaWQgZHVtcF9jaGFzc2lzKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisJaWYgKGhhcmR3YXJlLT5kbWkuY2hhc3Npcy5maWxsZWQgPT0gZmFsc2UpIHsKKwkJQ1JFQVRFX05FV19PQkpFQ1Q7CisJCQlhZGRfcygiZG1pLndhcm5pbmciLCJubyBjaGFzc2lzIHN0cnVjdHVyZSBmb3VuZCIpOworCQlGTFVTSF9PQkpFQ1Q7CisJCXJldHVybjsKKwl9CisKKwlDUkVBVEVfTkVXX09CSkVDVDsKKwlhZGRfcygiZG1pLml0ZW0iLCJiaW9zIik7CisJYWRkX2hzKGRtaS5jaGFzc2lzLm1hbnVmYWN0dXJlcik7CisJYWRkX2hzKGRtaS5jaGFzc2lzLnR5cGUpOworCWFkZF9ocyhkbWkuY2hhc3Npcy5sb2NrKTsKKwlhZGRfaHMoZG1pLmNoYXNzaXMudmVyc2lvbik7CisJYWRkX2hzKGRtaS5jaGFzc2lzLnNlcmlhbCk7CisJYWRkX3MoImRtaS5jaGFzc2lzLmFzc2V0X3RhZyIsZGVsX211bHRpX3NwYWNlcyhoYXJkd2FyZS0+ZG1pLmNoYXNzaXMuYXNzZXRfdGFnKSk7CisJYWRkX2hzKGRtaS5jaGFzc2lzLmJvb3RfdXBfc3RhdGUpOworCWFkZF9ocyhkbWkuY2hhc3Npcy5wb3dlcl9zdXBwbHlfc3RhdGUpOworCWFkZF9ocyhkbWkuY2hhc3Npcy50aGVybWFsX3N0YXRlKTsKKwlhZGRfaHMoZG1pLmNoYXNzaXMuc2VjdXJpdHlfc3RhdHVzKTsKKwlhZGRfaHMoZG1pLmNoYXNzaXMub2VtX2luZm9ybWF0aW9uKTsKKwlhZGRfaGkoZG1pLmNoYXNzaXMuaGVpZ2h0KTsKKwlhZGRfaGkoZG1pLmNoYXNzaXMubmJfcG93ZXJfY29yZHMpOworCUZMVVNIX09CSkVDVDsKK30KKwordm9pZCBkdW1wX2Jpb3Moc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pIHsKKwlpZiAoaGFyZHdhcmUtPmRtaS5iaW9zLmZpbGxlZCA9PSBmYWxzZSkgeworCQlDUkVBVEVfTkVXX09CSkVDVDsKKwkJCWFkZF9zKCJkbWkud2FybmluZyIsIm5vIGJpb3Mgc3RydWN0dXJlIGZvdW5kIik7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKwljaGFyIGFkZHJlc3NbMTZdPXswfTsKKwljaGFyIHJ1bnRpbWVbMTZdPXswfTsKKwljaGFyIHJvbVsxNl09ezB9OworCXNucHJpbnRmKGFkZHJlc3Msc2l6ZW9mKGFkZHJlc3MpLCIweCUwNFgwIixoYXJkd2FyZS0+ZG1pLmJpb3MuYWRkcmVzcyk7CisJc25wcmludGYocnVudGltZSxzaXplb2YocnVudGltZSksIiV1ICVzIixoYXJkd2FyZS0+ZG1pLmJpb3MucnVudGltZV9zaXplLCBoYXJkd2FyZS0+ZG1pLmJpb3MucnVudGltZV9zaXplX3VuaXQpOworCXNucHJpbnRmKHJvbSxzaXplb2Yocm9tKSwiJXUgJXMiLGhhcmR3YXJlLT5kbWkuYmlvcy5yb21fc2l6ZSwgaGFyZHdhcmUtPmRtaS5iaW9zLnJvbV9zaXplX3VuaXQpOworCisJQ1JFQVRFX05FV19PQkpFQ1Q7CisJYWRkX3MoImRtaS5pdGVtIiwiYmlvcyIpOworCWFkZF9ocyhkbWkuYmlvcy52ZW5kb3IpOworCWFkZF9ocyhkbWkuYmlvcy52ZXJzaW9uKTsKKwlhZGRfaHMoZG1pLmJpb3MucmVsZWFzZV9kYXRlKTsKKwlhZGRfaHMoZG1pLmJpb3MuYmlvc19yZXZpc2lvbik7CisJYWRkX2hzKGRtaS5iaW9zLmZpcm13YXJlX3JldmlzaW9uKTsKKwlhZGRfcygiZG1pLmJpb3MuYWRkcmVzcyIsYWRkcmVzcyk7CisJYWRkX3MoImRtaS5iaW9zLnJ1bnRpbWVfc2l6ZSIscnVudGltZSk7CisJYWRkX3MoImRtaS5iaW9zLnJvbV9zaXplIixyb20pOworCWZvciAoaW50IGkgPSAwOyBpIDwgQklPU19DSEFSX05CX0VMRU1FTlRTOyBpKyspIHsKKwkgICAgICAgIGlmICgoKGJvb2wgKikgKCZoYXJkd2FyZS0+ZG1pLmJpb3MuY2hhcmFjdGVyaXN0aWNzKSlbaV0gPT0gdHJ1ZSkgeworCQkJYWRkX3MoImRtaS5iaW9zLmNoYXJhY3RlcmlzdGljcyIsKGNoYXIgKiliaW9zX2NoYXJhY19zdHJpbmdzW2ldKTsKKwkJfQorCX0KKwkKKwlmb3IgKGludCBpID0gMDsgaSA8IEJJT1NfQ0hBUl9YMV9OQl9FTEVNRU5UUzsgaSsrKSB7CisJICAgICAgICBpZiAoKChib29sICopICgmaGFyZHdhcmUtPmRtaS5iaW9zLmNoYXJhY3RlcmlzdGljc194MSkpW2ldID09IHRydWUpIHsKKwkJCWFkZF9zKCJkbWkuYmlvcy5jaGFyYWN0ZXJpc3RpY3MiLChjaGFyICopYmlvc19jaGFyYWNfeDFfc3RyaW5nc1tpXSk7CisJCX0KKwl9CisKKwlmb3IgKGludCBpID0gMDsgaSA8IEJJT1NfQ0hBUl9YMl9OQl9FTEVNRU5UUzsgaSsrKSB7CisJICAgICAgICBpZiAoKChib29sICopICgmaGFyZHdhcmUtPmRtaS5iaW9zLmNoYXJhY3RlcmlzdGljc194MikpW2ldID09IHRydWUpIHsKKwkJCWFkZF9zKCJkbWkuYmlvcy5jaGFyYWN0ZXJpc3RpY3MiLChjaGFyICopYmlvc19jaGFyYWNfeDJfc3RyaW5nc1tpXSk7CisJCX0KKwl9CisJRkxVU0hfT0JKRUNUOworfQorCit2b2lkIGR1bXBfc3lzdGVtKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisKKwlpZiAoaGFyZHdhcmUtPmRtaS5zeXN0ZW0uZmlsbGVkID09IGZhbHNlKSB7CisJCUNSRUFURV9ORVdfT0JKRUNUOworCQkJYWRkX3MoImRtaS53YXJuaW5nIiwibm8gc3lzdGVtIHN0cnVjdHVyZSBmb3VuZCIpOworCQlGTFVTSF9PQkpFQ1Q7CisJCXJldHVybjsKKwl9CisJY2hhciBzeXN0ZW1fcmVzZXRfc3RhdHVzWzEwXT17MH07CisJY2hhciB3YXRjaGRvZ190aW1lclsxNV09ezB9OworCXNucHJpbnRmKHN5c3RlbV9yZXNldF9zdGF0dXMsc2l6ZW9mKHN5c3RlbV9yZXNldF9zdGF0dXMpLCIlcyIsIChoYXJkd2FyZS0+ZG1pLnN5c3RlbS5zeXN0ZW1fcmVzZXQuc3RhdHVzID8gIkVuYWJsZWQiIDoiRGlzYWJsZWQiKSk7CisJc25wcmludGYod2F0Y2hkb2dfdGltZXIsc2l6ZW9mKHdhdGNoZG9nX3RpbWVyKSwiJXMiLCAoaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc3lzdGVtX3Jlc2V0LndhdGNoZG9nID8gIlByZXNlbnQiIDoiTm90IFByZXNlbnQiKSk7CisKKwlDUkVBVEVfTkVXX09CSkVDVDsKKwlhZGRfcygiZG1pLml0ZW0iLCJzeXN0ZW0iKTsKKwlhZGRfaHMoZG1pLnN5c3RlbS5tYW51ZmFjdHVyZXIpOworCWFkZF9ocyhkbWkuc3lzdGVtLnByb2R1Y3RfbmFtZSk7CisJYWRkX2hzKGRtaS5zeXN0ZW0udmVyc2lvbik7CisJYWRkX2hzKGRtaS5zeXN0ZW0uc2VyaWFsKTsKKwlhZGRfaHMoZG1pLnN5c3RlbS51dWlkKTsKKwlhZGRfaHMoZG1pLnN5c3RlbS53YWtldXBfdHlwZSk7CisJYWRkX2hzKGRtaS5zeXN0ZW0uc2t1X251bWJlcik7CisJYWRkX2hzKGRtaS5zeXN0ZW0uZmFtaWx5KTsKKwlhZGRfaHMoZG1pLnN5c3RlbS5jb25maWd1cmF0aW9uX29wdGlvbnMpOworCWFkZF9zKCJkbWkuc3lzdGVtLnN5c3RlbV9yZXNldC5zdGF0dXMiLHN5c3RlbV9yZXNldF9zdGF0dXMpOworCWFkZF9zKCJkbWkuc3lzdGVtLnN5c3RlbV9yZXNldC53YXRjaGRvZyIsd2F0Y2hkb2dfdGltZXIpOworCWFkZF9ocyhkbWkuc3lzdGVtLnN5c3RlbV9yZXNldC5ib290X29wdGlvbik7CisJYWRkX2hzKGRtaS5zeXN0ZW0uc3lzdGVtX3Jlc2V0LmJvb3Rfb3B0aW9uX29uX2xpbWl0KTsKKwlhZGRfaHMoZG1pLnN5c3RlbS5zeXN0ZW1fcmVzZXQucmVzZXRfY291bnQpOworCWFkZF9ocyhkbWkuc3lzdGVtLnN5c3RlbV9yZXNldC5yZXNldF9saW1pdCk7CisJYWRkX2hzKGRtaS5zeXN0ZW0uc3lzdGVtX3Jlc2V0LnRpbWVyX2ludGVydmFsKTsKKwlhZGRfaHMoZG1pLnN5c3RlbS5zeXN0ZW1fcmVzZXQudGltZW91dCk7CisJYWRkX2hzKGRtaS5zeXN0ZW0uc3lzdGVtX2Jvb3Rfc3RhdHVzKTsKKwlGTFVTSF9PQkpFQ1Q7Cit9CisKK3ZvaWQgZHVtcF9iYXNlX2JvYXJkKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisKKwlpZiAoaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLmZpbGxlZCA9PSBmYWxzZSkgeworCQlDUkVBVEVfTkVXX09CSkVDVDsKKwkJCWFkZF9zKCJkbWkud2FybmluZyIsIm5vIGJhc2VfYm9hcmQgc3RydWN0dXJlIGZvdW5kIik7CisJCUZMVVNIX09CSkVDVDsKKwkJcmV0dXJuOworCX0KKworCUNSRUFURV9ORVdfT0JKRUNUOworCWFkZF9zKCJkbWkuaXRlbSIsImJhc2VfYm9hcmQiKTsKKwlhZGRfaHMoZG1pLmJhc2VfYm9hcmQubWFudWZhY3R1cmVyKTsKKwlhZGRfaHMoZG1pLmJhc2VfYm9hcmQucHJvZHVjdF9uYW1lKTsKKwlhZGRfaHMoZG1pLmJhc2VfYm9hcmQudmVyc2lvbik7CisJYWRkX2hzKGRtaS5iYXNlX2JvYXJkLnNlcmlhbCk7CisJYWRkX2hzKGRtaS5iYXNlX2JvYXJkLmFzc2V0X3RhZyk7CisJYWRkX2hzKGRtaS5iYXNlX2JvYXJkLmxvY2F0aW9uKTsKKwlhZGRfaHMoZG1pLmJhc2VfYm9hcmQudHlwZSk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFX0JPQVJEX05CX0VMRU1FTlRTOyBpKyspIHsKKwkJaWYgKCgoYm9vbCAqKSAoJmhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5mZWF0dXJlcykpW2ldID09IHRydWUpIHsKKwkJCWFkZF9zKCJkbWkuYmFzZV9ib2FyZC5mZWF0dXJlcyIsKGNoYXIgKiliYXNlX2JvYXJkX2ZlYXR1cmVzX3N0cmluZ3NbaV0pOworCQl9CisJfQorCisJZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzaXplb2YgaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLmRldmljZXNfaW5mb3JtYXRpb24gLworCQkgICAgICAgICBzaXplb2YgKmhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uOyBpKyspIHsKKwkgICAgICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLmRldmljZXNfaW5mb3JtYXRpb25baV0udHlwZSkpIHsKKwkJCWFkZF9zKCJkbWkuYmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uLnR5cGUiLCBoYXJkd2FyZS0+ZG1pLmJhc2VfYm9hcmQuZGV2aWNlc19pbmZvcm1hdGlvbltpXS50eXBlKTsKKwkJCWFkZF9pKCJkbWkuYmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uLnN0YXR1cyIsIGhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uW2ldLnN0YXR1cyk7CisJCQlhZGRfcygiZG1pLmJhc2VfYm9hcmQuZGV2aWNlc19pbmZvcm1hdGlvbi5kZXNjcmlwdGlvbiIsIGhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5kZXZpY2VzX2luZm9ybWF0aW9uW2ldLmRlc2NyaXB0aW9uKTsKKwkJfQorCX0KKwlGTFVTSF9PQkpFQ1Q7Cit9CisKK3ZvaWQgZHVtcF9kbWkoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pIHsKKworCUNSRUFURV9ORVdfT0JKRUNUOworCWFkZF9oYihpc19kbWlfdmFsaWQpOworCisJaWYgKGhhcmR3YXJlLT5pc19kbWlfdmFsaWQgPT0gZmFsc2UpIHsKKwkJRkxVU0hfT0JKRUNUOworCQlnb3RvIGV4aXQ7CisJfSBlbHNlIHsKKwkJY2hhciBidWZmZXJbOF09ezB9OworCQlzbnByaW50ZihidWZmZXIsc2l6ZW9mKGJ1ZmZlciksIiVkLiVkIixoYXJkd2FyZS0+ZG1pLmRtaXRhYmxlLm1ham9yX3ZlcnNpb24sIGhhcmR3YXJlLT5kbWkuZG1pdGFibGUubWlub3JfdmVyc2lvbik7CisJCWFkZF9zKCJkbWkudmVyc2lvbiIsYnVmZmVyKTsKKwkJRkxVU0hfT0JKRUNUOworCX0KKworCWR1bXBfYmFzZV9ib2FyZChoYXJkd2FyZSxjb25maWcsaXRlbSk7CisJZHVtcF9zeXN0ZW0oaGFyZHdhcmUsY29uZmlnLGl0ZW0pOworCWR1bXBfYmlvcyhoYXJkd2FyZSxjb25maWcsaXRlbSk7CisJZHVtcF9jaGFzc2lzKGhhcmR3YXJlLGNvbmZpZyxpdGVtKTsKKwlkdW1wX2lwbWkoaGFyZHdhcmUsY29uZmlnLGl0ZW0pOworCWR1bXBfYmF0dGVyeShoYXJkd2FyZSxjb25maWcsaXRlbSk7CisJZHVtcF9wcm9jZXNzb3IoaGFyZHdhcmUsY29uZmlnLGl0ZW0pOworCWR1bXBfY2FjaGUoaGFyZHdhcmUsY29uZmlnLGl0ZW0pOworCWR1bXBfbWVtb3J5X2JhbmtzKGhhcmR3YXJlLGNvbmZpZyxpdGVtKTsKKwlkdW1wX21lbW9yeV9tb2R1bGVzKGhhcmR3YXJlLGNvbmZpZyxpdGVtKTsKKwlkdW1wX21lbW9yeV9zaXplKGhhcmR3YXJlLGNvbmZpZyxpdGVtKTsKKwlkdW1wX29lbV9zdHJpbmdzKGhhcmR3YXJlLGNvbmZpZyxpdGVtKTsKKwlkdW1wX2hhcmR3YXJlX3NlY3VyaXR5KGhhcmR3YXJlLGNvbmZpZyxpdGVtKTsKK2V4aXQ6CisJdG9fY3BpbygiZG1pIik7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LWR1bXAtaGR0LmMgYi9jb20zMi9oZHQvaGR0LWR1bXAtaGR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4MWViZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtZHVtcC1oZHQuYwpAQCAtMCwwICsxLDUwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisjaW5jbHVkZSAiaGR0LWR1bXAuaCIKKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKwordm9pZCBkdW1wX2hkdChzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSkgeworCisJKHZvaWQpIGhhcmR3YXJlOworCUNSRUFURV9ORVdfT0JKRUNUOworCWFkZF9zKCJoZHQucHJvZHVjdF9uYW1lIixQUk9EVUNUX05BTUUpOworCWFkZF9zKCJoZHQudmVyc2lvbiIsVkVSU0lPTik7CisJYWRkX3MoImhkdC5jb2RlX25hbWUiLENPREVOQU1FKTsKKwlhZGRfcygiaGR0LmF1dGhvciIsIEFVVEhPUik7CisJYWRkX3MoImhkdC5jb3JlX2RldmVsb3BlciIsIENPUkVfREVWRUxPUEVSKTsKKwljaGFyICpjb250cmlidXRvcnNbTkJfQ09OVFJJQlVUT1JTXSA9IENPTlRSSUJVVE9SUzsKKwlmb3IgKGludCBjID0gMDsgYyA8IE5CX0NPTlRSSUJVVE9SUzsgYysrKSB7CisJCWFkZF9zKCJoZHQuY29udHJpYnV0b3IiLCBjb250cmlidXRvcnNbY10pOworCX0KKwlhZGRfcygiaGR0LndlYnNpdGUiLFdFQlNJVEVfVVJMKTsKKwlhZGRfcygiaGR0LmlyY19jaGFubmVsIixJUkNfQ0hBTk5FTCk7CisJRkxVU0hfT0JKRUNUCisJdG9fY3BpbygiaGR0Iik7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LWR1bXAta2VybmVsLmMgYi9jb20zMi9oZHQvaGR0LWR1bXAta2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkZjgzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtZHVtcC1rZXJuZWwuYwpAQCAtMCwwICsxLDY5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisjaW5jbHVkZSAiaGR0LWR1bXAuaCIKKwordm9pZCBkdW1wX2tlcm5lbChzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKiBjb25maWcsCisJCSBaWkpTT04gKiogaXRlbSkKK3sKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpX2RldmljZSA9IE5VTEw7CisgICAgQ1JFQVRFX0FSUkFZCisJICAgIGFkZF9hcygiTGludXggS2VybmVsIG1vZHVsZXMiLCAiIikKKyAgICBFTkRfT0ZfQVJSQVk7CisKKyAgICBpZiAoaGFyZHdhcmUtPnBjaV9pZHNfcmV0dXJuX2NvZGUgPT0gLUVOT1BDSUlEUykgeworCUFQUEVORF9BUlJBWSAKKwkJYWRkX2FzKCJFcnJvciIsICJObyBwY2kuaWRzIGZpbGUiKQorCUVORF9PRl9BUFBFTkQgRkxVU0hfT0JKRUNUOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKGhhcmR3YXJlLT5tb2R1bGVzX3BjaW1hcF9yZXR1cm5fY29kZSA9PSAtRU5PTU9EVUxFU1BDSU1BUCkKKwkmJihoYXJkd2FyZS0+bW9kdWxlc19wY2ltYXBfcmV0dXJuX2NvZGUgPT0gLUVOT01PRFVMRVNBTElBUykpIHsKKwlBUFBFTkRfQVJSQVkKKwkJYWRkX2FzKCJFcnJvciIsICJObyBtb2R1bGVzLnBjaW1hcCBvciBtb2R1bGVzLmFsaWFzIGZpbGUiKQorCUVORF9PRl9BUFBFTkQgRkxVU0hfT0JKRUNUOworCXJldHVybjsKKworCX0KKworICAgIC8qIEZvciBldmVyeSBkZXRlY3RlZCBwY2kgZGV2aWNlLCBjb21wdXRlIGl0cyBzdWJtZW51ICovCisgICAgZm9yX2VhY2hfcGNpX2Z1bmMocGNpX2RldmljZSwgaGFyZHdhcmUtPnBjaV9kb21haW4pIHsKKwlpZiAocGNpX2RldmljZSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwlmb3IgKGludCBrbW9kID0gMDsKKwkgICAgIGttb2QgPCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudDsga21vZCsrKSB7CisJICAgIEFQUEVORF9BUlJBWQorCQkgICAgYWRkX2FzKHBjaV9kZXZpY2UtPmRldl9pbmZvLT5jYXRlZ29yeV9uYW1lLCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZVtrbW9kXSkKKwkgICAgRU5EX09GX0FQUEVORDsKKwl9CisgICAgfQorICAgIEZMVVNIX09CSkVDVDsKKyAgICB0b19jcGlvKCJrZXJuZWwiKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtZHVtcC1tZW1vcnkuYyBiL2NvbTMyL2hkdC9oZHQtZHVtcC1tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDk1ZDNjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1kdW1wLW1lbW9yeS5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisjaW5jbHVkZSAiaGR0LWR1bXAuaCIKKwordm9pZCBkdW1wXzg4KHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisKKwkodm9pZCkgaGFyZHdhcmU7CisJaW50IG1lbV9zaXplID0gMDsKKwlDUkVBVEVfTkVXX09CSkVDVDsKKwlpZiAoZGV0ZWN0X21lbW9yeV84OCgmbWVtX3NpemUpKSB7CisJCWFkZF9zKCJtZW1vcnkuZXJyb3IiLCI4ODAwaCBtZW1vcnkgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIik7CisJCUZMVVNIX09CSkVDVAorCQlyZXR1cm47CisJfQorCisJYWRkX3MoImRtaS5pdGVtIiwibWVtb3J5IHZpYSA4OCIpOworCWFkZF9pKCJtZW1vcnkuc2l6ZSAoS2lCKSIsIG1lbV9zaXplKTsKKwlhZGRfaSgibWVtb3J5LnNpemUgKE1pQikiLCBtZW1fc2l6ZSA+PiAxMCk7CisJRkxVU0hfT0JKRUNUOworfQorCit2b2lkIGR1bXBfZTgwMShzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSkgeworCisJKHZvaWQpIGhhcmR3YXJlOworCWludCBtZW1fbG93LCBtZW1faGlnaCA9IDA7CisJQ1JFQVRFX05FV19PQkpFQ1Q7CisJaWYgKGRldGVjdF9tZW1vcnlfZTgwMSgmbWVtX2xvdywmbWVtX2hpZ2gpKSB7CisJCWFkZF9zKCJtZW1vcnkuZXJyb3IiLCJlODAxIG1lbW9yeSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQiKTsKKwkJRkxVU0hfT0JKRUNUOworCQlyZXR1cm47CisJfQorCisJYWRkX3MoImRtaS5pdGVtIiwibWVtb3J5IHZpYSBlODAxIik7CisJYWRkX2koIm1lbW9yeS50b3RhbC5zaXplIChLaUIpIiwgbWVtX2xvdyArIChtZW1faGlnaCA8PCA2KSk7CisJYWRkX2koIm1lbW9yeS50b3RhbC5zaXplIChNaUIpIiwgKG1lbV9sb3cgPj4gMTApICsgKG1lbV9oaWdoID4+IDQpKTsKKwlhZGRfaSgibWVtb3J5Lmxvdy5zaXplIChLaUIpIiwgbWVtX2xvdyApOworCWFkZF9pKCJtZW1vcnkubG93LnNpemUgKE1pQikiLCBtZW1fbG93ID4+IDEwKTsKKwlhZGRfaSgibWVtb3J5LmhpZ2guc2l6ZSAoS2lCKSIsIG1lbV9oaWdoIDw8IDYpOworCWFkZF9pKCJtZW1vcnkuaGlnaC5zaXplIChNaUIpIiwgbWVtX2hpZ2ggPj4gNCk7CisJRkxVU0hfT0JKRUNUOworCit9Cit2b2lkIGR1bXBfZTgyMChzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSkgeworICAgIAorCSh2b2lkKSBoYXJkd2FyZTsKKwlzdHJ1Y3QgZTgyMGVudHJ5IG1hcFtFODIwTUFYXTsKKwlzdHJ1Y3QgZTgyMGVudHJ5IG5tW0U4MjBNQVhdOworCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZSA9IDA7CisJaW50IGNvdW50ID0gMDsKKwljaGFyIHR5cGVbMTRdID0gezB9OworCQorCWRldGVjdF9tZW1vcnlfZTgyMChtYXAsIEU4MjBNQVgsICZjb3VudCk7CisgCW1lbXNpemUgPSBtZW1zaXplX2U4MjAobWFwLCBjb3VudCk7CisJCisJQ1JFQVRFX05FV19PQkpFQ1Q7CisJCWFkZF9zKCJkbWkuaXRlbSIsIm1lbW9yeSB2aWEgZTgyMCIpOworCQlhZGRfaSgibWVtb3J5LnRvdGFsLnNpemUgKEtpQikiLCBtZW1zaXplKTsKKwkJYWRkX2koIm1lbW9yeS50b3RhbC5zaXplIChNaUIpIiwgKG1lbXNpemUgKyAoMSA8PCA5KSkgPj4gMTApOworCUZMVVNIX09CSkVDVDsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlnZXRfdHlwZShtYXBbaV0udHlwZSwgdHlwZSwgc2l6ZW9mKHR5cGUpKTsKKwkJY2hhciBiZWdpblsyNF09ezB9OworCQljaGFyIHNpemVbMjRdPXswfTsKKwkJY2hhciBlbmRbMjRdPXswfTsKKwkJc25wcmludGYoYmVnaW4sc2l6ZW9mKGJlZ2luKSwiMHglMDE2bGx4IixtYXBbaV0uYWRkcik7CisJCXNucHJpbnRmKHNpemUsc2l6ZW9mKHNpemUpLCIweCUwMTZsbHgiLG1hcFtpXS5zaXplKTsKKwkJc25wcmludGYoZW5kLHNpemVvZihlbmQpLCIweCUwMTZsbHgiLG1hcFtpXS5hZGRyK21hcFtpXS5zaXplKTsKKwkJQ1JFQVRFX05FV19PQkpFQ1Q7CisJCQlhZGRfcygibWVtb3J5LnNlZ21lbnQuc3RhcnQiLGJlZ2luKTsKKwkJCWFkZF9zKCJtZW1vcnkuc2VnbWVudC5zaXplICIsc2l6ZSk7CisJCQlhZGRfcygibWVtb3J5LnNlZ21lbnQuZW5kICAiLGVuZCk7CisJCQlhZGRfcygibWVtb3J5LnNlZ21lbnQudHlwZSAiLHJlbW92ZV9zcGFjZXModHlwZSkpOworCQlGTFVTSF9PQkpFQ1Q7CisJfQorCisJaW50IG5yID0gc2FuaXRpemVfZTgyMF9tYXAobWFwLCBubSwgY291bnQpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQlnZXRfdHlwZShubVtpXS50eXBlLCB0eXBlLCBzaXplb2YodHlwZSkpOworCQljaGFyIGJlZ2luWzI0XT17MH07CisJCWNoYXIgc2l6ZVsyNF09ezB9OworCQljaGFyIGVuZFsyNF09ezB9OworCQlzbnByaW50ZihiZWdpbixzaXplb2YoYmVnaW4pLCIweCUwMTZsbHgiLG5tW2ldLmFkZHIpOworCQlzbnByaW50ZihzaXplLHNpemVvZihzaXplKSwiMHglMDE2bGx4IixubVtpXS5zaXplKTsKKwkJc25wcmludGYoZW5kLHNpemVvZihlbmQpLCIweCUwMTZsbHgiLG5tW2ldLmFkZHIrbm1baV0uc2l6ZSk7CisJCUNSRUFURV9ORVdfT0JKRUNUOworCQkJYWRkX3MoInNhbml0aXplZF9tZW1vcnkuc2VnbWVudC5zdGFydCIsYmVnaW4pOworCQkJYWRkX3MoInNhbml0aXplZF9tZW1vcnkuc2VnbWVudC5zaXplICIsc2l6ZSk7CisJCQlhZGRfcygic2FuaXRpemVkX21lbW9yeS5zZWdtZW50LmVuZCAgIixlbmQpOworCQkJYWRkX3MoInNhbml0aXplZF9tZW1vcnkuc2VnbWVudC50eXBlICIscmVtb3ZlX3NwYWNlcyh0eXBlKSk7CisJCUZMVVNIX09CSkVDVDsKKwl9Cit9CisKK3ZvaWQgZHVtcF9tZW1vcnkoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pIHsKKworCUNSRUFURV9ORVdfT0JKRUNUOworCQlhZGRfcygiTWVtb3J5IGNvbmZpZ3VyYXRpb24iLCJ0cnVlIik7CisJRkxVU0hfT0JKRUNUOworCisJZHVtcF84OChoYXJkd2FyZSxjb25maWcsaXRlbSk7CisJZHVtcF9lODAxKGhhcmR3YXJlLGNvbmZpZyxpdGVtKTsKKwlkdW1wX2U4MjAoaGFyZHdhcmUsY29uZmlnLGl0ZW0pOworCXRvX2NwaW8oIm1lbW9yeSIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1kdW1wLXBjaS5jIGIvY29tMzIvaGR0L2hkdC1kdW1wLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjE4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWR1bXAtcGNpLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKyNpbmNsdWRlICJoZHQtZHVtcC5oIgorCit2b2lkIGR1bXBfcGNpKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqIGNvbmZpZywKKwkgICAgICBaWkpTT04gKiogaXRlbSkKK3sKKyAgICBpbnQgaSA9IDE7CisgICAgc3RydWN0IHBjaV9kZXZpY2UgKnBjaV9kZXZpY2U9TlVMTDsKKyAgICBjaGFyIGtlcm5lbF9tb2R1bGVzW0xJTlVYX0tFUk5FTF9NT0RVTEVfU0laRSAqCisJCQlNQVhfS0VSTkVMX01PRFVMRVNfUEVSX1BDSV9ERVZJQ0VdOworICAgIGJvb2wgbm9wY2lpZHMgPSBmYWxzZTsKKyAgICBib29sIG5vbW9kdWxlc3BjaW1hcCA9IGZhbHNlOworICAgIGJvb2wgbm9tb2R1bGVzYWxpYXMgPSBmYWxzZTsKKyAgICBib29sIG5vbW9kdWxlc2ZpbGUgPSBmYWxzZTsKKyAgICBpbnQgYnVzID0gMCwgc2xvdCA9IDAsIGZ1bmMgPSAwOworICAgIAorICAgIGlmIChoYXJkd2FyZS0+cGNpX2lkc19yZXR1cm5fY29kZSA9PSAtRU5PUENJSURTKSB7CisJbm9wY2lpZHMgPSB0cnVlOworICAgIH0KKyAgICBpZiAoaGFyZHdhcmUtPm1vZHVsZXNfcGNpbWFwX3JldHVybl9jb2RlID09IC1FTk9NT0RVTEVTUENJTUFQKSB7CisJbm9tb2R1bGVzcGNpbWFwID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGhhcmR3YXJlLT5tb2R1bGVzX3BjaW1hcF9yZXR1cm5fY29kZSA9PSAtRU5PTU9EVUxFU0FMSUFTKSB7CisJbm9tb2R1bGVzYWxpYXMgPSB0cnVlOworICAgIH0KKworICAgIG5vbW9kdWxlc2ZpbGUgPSBub21vZHVsZXNwY2ltYXAgJiYgbm9tb2R1bGVzYWxpYXM7CisKKyAgICBDUkVBVEVfTkVXX09CSkVDVDsKKworICAgIGFkZF9pKCJwY2lfZGV2aWNlLmNvdW50IiwgaGFyZHdhcmUtPm5iX3BjaV9kZXZpY2VzKTsKKworICAgIEZMVVNIX09CSkVDVDsKKyAgICAvKiBGb3IgZXZlcnkgZGV0ZWN0ZWQgcGNpIGRldmljZSwgY29tcHV0ZSBpdHMgc3VibWVudSAqLworICAgIGZvcl9lYWNoX3BjaV9mdW5jKHBjaV9kZXZpY2UsIGhhcmR3YXJlLT5wY2lfZG9tYWluKSB7CisJaWYgKHBjaV9kZXZpY2UgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisJY2hhciB2WzEwXSA9IHsgMCB9OworCWNoYXIgc3ZbMTBdID0geyAwIH07CisJY2hhciBwWzEwXSA9IHsgMCB9OworCWNoYXIgc3BbMTBdID0geyAwIH07CisJY2hhciBjWzEwXSA9IHsgMCB9OworCWNoYXIgclsxMF0gPSB7IDAgfTsKKworCUNSRUFURV9ORVdfT0JKRUNUOworCWJ1cyA9IF9fcGNpX2J1czsKKwlzbG90ID0gX19wY2lfc2xvdDsKKwlmdW5jID0gX19wY2lfZnVuYzsKKworCW1lbXNldChrZXJuZWxfbW9kdWxlcywgMCwgc2l6ZW9mIGtlcm5lbF9tb2R1bGVzKTsKKwlmb3IgKGludCBrbW9kID0gMDsKKwkgICAgIGttb2QgPCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudDsga21vZCsrKSB7CisJICAgIGlmIChrbW9kID4gMCkgeworCQlzdHJuY2F0KGtlcm5lbF9tb2R1bGVzLCAiIHwgIiwgMyk7CisJICAgIH0KKwkgICAgc3RybmNhdChrZXJuZWxfbW9kdWxlcywKKwkJICAgIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlW2ttb2RdLAorCQkgICAgTElOVVhfS0VSTkVMX01PRFVMRV9TSVpFIC0gMSk7CisJfQorCWlmIChwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudCA9PSAwKQorCSAgICBzdHJsY3B5KGtlcm5lbF9tb2R1bGVzLCAidW5rbm93biIsIDcpOworCisJYWRkX2koInBjaV9kZXZpY2UubnVtYmVyIiwgaSk7CisJaWYgKG5vcGNpaWRzID09IGZhbHNlKSB7CisJICAgIGFkZF9zKCJwY2lfZGV2aWNlLnZlbmRvcl9uYW1lIiwgcGNpX2RldmljZS0+ZGV2X2luZm8tPnZlbmRvcl9uYW1lKTsKKwkgICAgYWRkX3MoInBjaV9kZXZpY2UucHJvZHVjdF9uYW1lIiwKKwkJICAgcGNpX2RldmljZS0+ZGV2X2luZm8tPnByb2R1Y3RfbmFtZSk7CisJfQorCWlmIChub21vZHVsZXNmaWxlID09IGZhbHNlKSB7CisJICAgIGFkZF9zKCJwY2lfZGV2aWNlLmNsYXNzX25hbWUiLCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+Y2xhc3NfbmFtZSk7CisJICAgIGFkZF9zKCJwY2lfZGV2aWNlLmtlcm5lbF9tb2R1bGUiLCBrZXJuZWxfbW9kdWxlcyk7CisJfQorCisJc25wcmludGYodiwgc2l6ZW9mKHYpLCAiJTA0eCIsIHBjaV9kZXZpY2UtPnZlbmRvcik7CisJc25wcmludGYocCwgc2l6ZW9mKHApLCAiJTA0eCIsIHBjaV9kZXZpY2UtPnByb2R1Y3QpOworCXNucHJpbnRmKHN2LCBzaXplb2Yoc3YpLCAiJTA0eCIsIHBjaV9kZXZpY2UtPnN1Yl92ZW5kb3IpOworCXNucHJpbnRmKHNwLCBzaXplb2Yoc3ApLCAiJTA0eCIsIHBjaV9kZXZpY2UtPnN1Yl9wcm9kdWN0KTsKKwlzbnByaW50ZihjLCBzaXplb2YoYyksICIlMDJ4LiUwMnguJTAyeCIsCisJCSBwY2lfZGV2aWNlLT5jbGFzc1syXSwKKwkJIHBjaV9kZXZpY2UtPmNsYXNzWzFdLCBwY2lfZGV2aWNlLT5jbGFzc1swXSk7CisJc25wcmludGYociwgc2l6ZW9mKHIpLCAiJTAyeCIsIHBjaV9kZXZpY2UtPnJldmlzaW9uKTsKKwlhZGRfcygicGNpX2RldmljZS52ZW5kb3JfaWQiLCB2KTsKKwlhZGRfcygicGNpX2RldmljZS5wcm9kdWN0X2lkIiwgcCk7CisJYWRkX3MoInBjaV9kZXZpY2Uuc3ViX3ZlbmRvcl9pZCIsIHN2KTsKKwlhZGRfcygicGNpX2RldmljZS5zdWJfcHJvZHVjdF9pZCIsIHNwKTsKKwlhZGRfcygicGNpX2RldmljZS5jbGFzc19pZCIsIGMpOworCWFkZF9zKCJwY2lfZGV2aWNlLnJldmlzaW9uIiwgcik7CisJaWYgKChwY2lfZGV2aWNlLT5kZXZfaW5mby0+aXJxID4gMCkKKwkgICAgJiYgKHBjaV9kZXZpY2UtPmRldl9pbmZvLT5pcnEgPCAyNTUpKQorCSAgICBhZGRfaSgicGNpX2RldmljZS5pcnEiLCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+aXJxKTsKKworCWFkZF9pKCJwY2lfZGV2aWNlLmxhdGVuY3kiLCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGF0ZW5jeSk7CisJYWRkX2koInBjaV9kZXZpY2UuYnVzIiwgYnVzKTsKKwlhZGRfaSgicGNpX2RldmljZS5zbG90Iiwgc2xvdCk7CisJYWRkX2koInBjaV9kZXZpY2UuZnVuYyIsIGZ1bmMpOworCisJaWYgKGhhcmR3YXJlLT5pc19weGVfdmFsaWQgPT0gdHJ1ZSkgeworCSAgICBpZiAoKGhhcmR3YXJlLT5weGUucGNpX2RldmljZSAhPSBOVUxMKQorCQkmJiAoaGFyZHdhcmUtPnB4ZS5wY2lfZGV2aWNlID09IHBjaV9kZXZpY2UpKSB7CisJCWFkZF9ocyhweGUubWFjX2FkZHIpOworCQlhZGRfcygicHhlIiwgIkN1cnJlbnQgYm9vdCBkZXZpY2UiKTsKKwkgICAgfQorCX0KKwlpKys7CisJRkxVU0hfT0JKRUNUOworICAgIH0KKyAgICB0b19jcGlvKCJwY2kiKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtZHVtcC1weGUuYyBiL2NvbTMyL2hkdC9oZHQtZHVtcC1weGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI1Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1kdW1wLXB4ZS5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKyNpbmNsdWRlICJoZHQtZHVtcC5oIgorI2luY2x1ZGUgPHN5cy9ncHhlLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCit2b2lkIGR1bXBfcHhlKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKSB7CisJc3RydWN0IGluX2FkZHIgaW47CisKKwlDUkVBVEVfTkVXX09CSkVDVDsKKwlhZGRfaGIoaXNfcHhlX3ZhbGlkKTsKKwlpZiAoaGFyZHdhcmUtPmlzX3B4ZV92YWxpZCkgeworCQljaGFyIGJ1ZmZlclszMl0gPSB7MH07CisJCXNucHJpbnRmKGJ1ZmZlcixzaXplb2YoYnVmZmVyKSwiMHgleCIsaGFyZHdhcmUtPnB4ZS52ZW5kb3JfaWQpOworCQlhZGRfcygicHhlLnZlbmRvcl9pZCIsYnVmZmVyKTsKKwkJc25wcmludGYoYnVmZmVyLHNpemVvZihidWZmZXIpLCIweCV4IixoYXJkd2FyZS0+cHhlLnByb2R1Y3RfaWQpOworCQlhZGRfcygicHhlLnByb2R1Y3RfaWQiLGJ1ZmZlcik7CisJCXNucHJpbnRmKGJ1ZmZlcixzaXplb2YoYnVmZmVyKSwiMHgleCIsaGFyZHdhcmUtPnB4ZS5zdWJ2ZW5kb3JfaWQpOworCQlhZGRfcygicHhlLnN1YnZlbmRvcl9pZCIsYnVmZmVyKTsKKwkJc25wcmludGYoYnVmZmVyLHNpemVvZihidWZmZXIpLCIweCV4IixoYXJkd2FyZS0+cHhlLnN1YnByb2R1Y3RfaWQpOworCQlhZGRfcygicHhlLnN1YnByb2R1Y3RfaWQiLGJ1ZmZlcik7CisKKwkJaWYgKGhhcmR3YXJlLT5wY2lfaWRzX3JldHVybl9jb2RlID09IC1FTk9QQ0lJRFMgfHwgKGhhcmR3YXJlLT5weGUucGNpX2RldmljZSA9PSBOVUxMKSkgeyAKKwkJCWFkZF9zKCJNYW51ZmFjdHVyZXJfbmFtZSIsIm5vX3BjaV9pZHNfZmlsZSBvciBubyBkZXZpY2UgZm91bmQiKTsKKwkJCWFkZF9zKCJQcm9kdWN0X25hbWUiLCJub19wY2lfaWRzX2ZpbGUgb3Igbm8gZGV2aWNlIGZvdW5kIik7CisJCX0gZWxzZSB7CisJCQlhZGRfcygiTWFudWZhY3R1cmVyX25hbWUiLCBoYXJkd2FyZS0+cHhlLnBjaV9kZXZpY2UtPmRldl9pbmZvLT52ZW5kb3JfbmFtZSk7CisJCQlhZGRfcygiUHJvZHVjdF9uYW1lIiwgaGFyZHdhcmUtPnB4ZS5wY2lfZGV2aWNlLT5kZXZfaW5mby0+cHJvZHVjdF9uYW1lKTsKKwkJfQorCisJCWFkZF9oaShweGUucmV2KTsKKwkJYWRkX2hpKHB4ZS5wY2lfYnVzKTsKKwkJYWRkX2hpKHB4ZS5wY2lfZGV2KTsKKwkJYWRkX2hpKHB4ZS5wY2lfZnVuYyk7CisJCWFkZF9oaShweGUuYmFzZV9jbGFzcyk7CisJCWFkZF9oaShweGUuc3ViX2NsYXNzKTsKKwkJYWRkX2hpKHB4ZS5wcm9nX2ludGYpOworCQlhZGRfaGkocHhlLm5pY3R5cGUpOworCQlhZGRfaHMocHhlLm1hY19hZGRyKTsKKwkKKwkJaW4uc19hZGRyID0gaGFyZHdhcmUtPnB4ZS5kaGNwZGF0YS5jaXA7CisJCWFkZF9zKCJweGUuY2xpZW50X2lwIiwgaW5ldF9udG9hKGluKSk7CisJCWluLnNfYWRkciA9IGhhcmR3YXJlLT5weGUuZGhjcGRhdGEuc2lwOworCQlhZGRfcygicHhlLm5leHRfc2VydmVyX2lwIixpbmV0X250b2EoaW4pKTsKKwkJaW4uc19hZGRyID0gaGFyZHdhcmUtPnB4ZS5kaGNwZGF0YS5naXA7CisJCWFkZF9zKCJweGUucmVsYXlfYWdlbnRfaXAiLGluZXRfbnRvYShpbikpOworCQltZW1jcHkoJmluLCBoYXJkd2FyZS0+cHhlLmlwX2FkZHIsIHNpemVvZiBpbik7CisJCWFkZF9zKCJweGUuaXBhZGRyIixpbmV0X250b2EoaW4pKTsKKwkJYWRkX2IoImdweGVfZGV0ZWN0ZWQiLGlzX2dweGUoKSk7CisJfQorCUZMVVNIX09CSkVDVDsKKwl0b19jcGlvKCJweGUiKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtZHVtcC1zeXNsaW51eC5jIGIvY29tMzIvaGR0L2hkdC1kdW1wLXN5c2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlZjkyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtZHVtcC1zeXNsaW51eC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKyNpbmNsdWRlICJoZHQtZHVtcC5oIgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorCit2b2lkIGR1bXBfc3lzbGludXgoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pIHsKKworCUNSRUFURV9ORVdfT0JKRUNUOworCWFkZF9ocyhzeXNsaW51eF9mcyk7CisJYWRkX2hzKHN2LT52ZXJzaW9uX3N0cmluZyk7CisJYWRkX2hpKHN2LT52ZXJzaW9uKTsKKwlhZGRfaGkoc3YtPm1heF9hcGkpOworCWFkZF9ocyhzdi0+Y29weXJpZ2h0X3N0cmluZyk7CisJRkxVU0hfT0JKRUNUCisJdG9fY3Bpbygic3lzbGludXgiKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtZHVtcC12ZXNhLmMgYi9jb20zMi9oZHQvaGR0LWR1bXAtdmVzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDU2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWR1bXAtdmVzYS5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKyNpbmNsdWRlICJoZHQtZHVtcC5oIgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorCit2b2lkIGR1bXBfdmVzYShzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSkgeworCisJQ1JFQVRFX05FV19PQkpFQ1Q7CisJYWRkX2hiKGlzX3Zlc2FfdmFsaWQpOworCWlmIChoYXJkd2FyZS0+aXNfdmVzYV92YWxpZCkgeworCQljaGFyIGJ1ZmZlcls2NF09ezB9OworCQlzbnByaW50ZihidWZmZXIsc2l6ZW9mKGJ1ZmZlciksIiVkLiVkIiwgaGFyZHdhcmUtPnZlc2EubWFqb3JfdmVyc2lvbiwgaGFyZHdhcmUtPnZlc2EubWlub3JfdmVyc2lvbik7CisJCWFkZF9zKCJ2ZXNhLnZlcnNpb24iLGJ1ZmZlcik7CisJCWFkZF9ocyh2ZXNhLnZlbmRvcik7CisJCWFkZF9ocyh2ZXNhLnByb2R1Y3QpOworCQlhZGRfaHModmVzYS5wcm9kdWN0X3JldmlzaW9uKTsKKwkJYWRkX2hpKHZlc2Euc29mdHdhcmVfcmV2KTsKKwkJbWVtc2V0KGJ1ZmZlciwwLHNpemVvZihidWZmZXIpKTsKKwkJc25wcmludGYoYnVmZmVyLHNpemVvZihidWZmZXIpLCIlZCBLQiIsaGFyZHdhcmUtPnZlc2EudG90YWxfbWVtb3J5KjY0KTsKKwkJYWRkX3MoInZlc2EubWVtb3J5IixidWZmZXIpOworCQlhZGRfaSgidmVzYS5tb2RlcyIsaGFyZHdhcmUtPnZlc2Eudm1pX2NvdW50KTsKKwkJRkxVU0hfT0JKRUNUOworCQlmb3IgKGludCBpID0gMDsgaSA8IGhhcmR3YXJlLT52ZXNhLnZtaV9jb3VudDsgaSsrKSB7CisJCSAgICAgICAgc3RydWN0IHZlc2FfbW9kZV9pbmZvICptaSA9ICZoYXJkd2FyZS0+dmVzYS52bWlbaV0ubWk7CisJCSAgICAgICAgaWYgKChtaS0+aF9yZXMgPT0gMCkgfHwgKG1pLT52X3JlcyA9PSAwKSkKKwkJCQljb250aW51ZTsKKwkJCUNSRUFURV9ORVdfT0JKRUNUOworCQkJbWVtc2V0KGJ1ZmZlciwwLHNpemVvZihidWZmZXIpKTsKKwkJCXNucHJpbnRmKGJ1ZmZlcixzaXplb2YoYnVmZmVyKSwiMHglMDR4IixoYXJkd2FyZS0+dmVzYS52bWlbaV0ubW9kZSArIDB4MjAwKTsKKwkJCWFkZF9zKCJ2ZXNhLmtlcm5lbF9tb2RlIixidWZmZXIpOworCQkJYWRkX2koInZlc2EuaHJlcyIsbWktPmhfcmVzKTsKKwkJCWFkZF9pKCJ2ZXNhLnZyZXMiLG1pLT52X3Jlcyk7CisJCQlhZGRfaSgidmVzYS5icHAiLG1pLT5icHApOworCQkJRkxVU0hfT0JKRUNUOworCQl9CisJfSBlbHNlIHsKKwkJRkxVU0hfT0JKRUNUOworCX0KKwl0b19jcGlvKCJ2ZXNhIik7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LWR1bXAtdnBkLmMgYi9jb20zMi9oZHQvaGR0LWR1bXAtdnBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0NTFjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtZHVtcC12cGQuYwpAQCAtMCwwICsxLDQ3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisjaW5jbHVkZSAiaGR0LWR1bXAuaCIKKwordm9pZCBkdW1wX3ZwZChzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSkgeworCisJQ1JFQVRFX05FV19PQkpFQ1Q7CisJYWRkX2hiKGlzX3ZwZF92YWxpZCk7CisgICAgCWlmIChoYXJkd2FyZS0+aXNfdnBkX3ZhbGlkKSB7CisJCWFkZF9ocyh2cGQuYmlvc19idWlsZF9pZCk7CisJCWFkZF9ocyh2cGQuYmlvc19yZWxlYXNlX2RhdGUpOworCQlhZGRfaHModnBkLmJpb3NfdmVyc2lvbik7CisJCWFkZF9ocyh2cGQuZGVmYXVsdF9mbGFzaF9maWxlbmFtZSk7CisJCWFkZF9ocyh2cGQuYm94X3NlcmlhbF9udW1iZXIpOworCQlhZGRfaHModnBkLm1vdGhlcmJvYXJkX3NlcmlhbF9udW1iZXIpOworCQlhZGRfaHModnBkLm1hY2hpbmVfdHlwZV9tb2RlbCk7CisJfQorCUZMVVNIX09CSkVDVDsKKwl0b19jcGlvKCJ2cGQiKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtZHVtcC5jIGIvY29tMzIvaGR0L2hkdC1kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3NDhjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtZHVtcC5jCkBAIC0wLDAgKzEsMjI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8Z2V0a2V5Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiaGR0LWNvbW1vbi5oIgorI2luY2x1ZGUgImhkdC1kdW1wLmgiCisKK3N0cnVjdCBwcmludF9idWYgcF9idWY7CisKK3N0cnVjdCBkdW1wX29wdGlvbiB7CisgICAgY2hhciAqZmxhZzsKKyAgICBjaGFyICppdGVtOworfTsKKworY2hhciAqZ2V0X3ZhbHVlX2Zyb21fb3B0aW9uKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgY2hhciAqb3B0aW9uKQoreworICAgIHN0cnVjdCBkdW1wX29wdGlvbiBkdW1wX29wdGlvbnNbMTBdOworICAgIGR1bXBfb3B0aW9uc1swXS5mbGFnID0gIiV7bX0iOworICAgIGR1bXBfb3B0aW9uc1swXS5pdGVtID0gaGFyZHdhcmUtPnB4ZS5tYWNfYWRkcjsKKworICAgIGR1bXBfb3B0aW9uc1sxXS5mbGFnID0gIiV7dn0iOworICAgIGR1bXBfb3B0aW9uc1sxXS5pdGVtID0gaGFyZHdhcmUtPmRtaS5zeXN0ZW0ubWFudWZhY3R1cmVyOworCisgICAgZHVtcF9vcHRpb25zWzJdLmZsYWcgPSAiJXtwfSI7CisgICAgZHVtcF9vcHRpb25zWzJdLml0ZW0gPSBoYXJkd2FyZS0+ZG1pLnN5c3RlbS5wcm9kdWN0X25hbWU7CisKKyAgICBkdW1wX29wdGlvbnNbM10uZmxhZyA9ICIle2JhfSI7CisgICAgZHVtcF9vcHRpb25zWzNdLml0ZW0gPSBoYXJkd2FyZS0+ZG1pLmJhc2VfYm9hcmQuYXNzZXRfdGFnOworCisgICAgZHVtcF9vcHRpb25zWzRdLmZsYWcgPSAiJXtic30iOworICAgIGR1bXBfb3B0aW9uc1s0XS5pdGVtID0gaGFyZHdhcmUtPmRtaS5iYXNlX2JvYXJkLnNlcmlhbDsKKworICAgIGR1bXBfb3B0aW9uc1s1XS5mbGFnID0gIiV7Y2F9IjsKKyAgICBkdW1wX29wdGlvbnNbNV0uaXRlbSA9IGhhcmR3YXJlLT5kbWkuY2hhc3Npcy5hc3NldF90YWc7CisKKyAgICBkdW1wX29wdGlvbnNbNl0uZmxhZyA9ICIle2NzfSI7CisgICAgZHVtcF9vcHRpb25zWzZdLml0ZW0gPSBoYXJkd2FyZS0+ZG1pLmNoYXNzaXMuc2VyaWFsOworCisgICAgZHVtcF9vcHRpb25zWzddLmZsYWcgPSAiJXtza30iOworICAgIGR1bXBfb3B0aW9uc1s3XS5pdGVtID0gaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc2t1X251bWJlcjsKKworICAgIGR1bXBfb3B0aW9uc1s4XS5mbGFnID0gIiV7c3N9IjsKKyAgICBkdW1wX29wdGlvbnNbOF0uaXRlbSA9IGhhcmR3YXJlLT5kbWkuc3lzdGVtLnNlcmlhbDsKKworICAgIGR1bXBfb3B0aW9uc1s5XS5mbGFnID0gTlVMTDsKKyAgICBkdW1wX29wdGlvbnNbOV0uaXRlbSA9IE5VTEw7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgeworCWlmIChzdHJjbXAob3B0aW9uLCBkdW1wX29wdGlvbnNbaV0uZmxhZykgPT0gMCkgeworCSAgICByZXR1cm4gcmVtb3ZlX3NwYWNlcyhkdW1wX29wdGlvbnNbaV0uaXRlbSk7CisJfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitjaGFyICpjb21wdXRlX2ZpbGVuYW1lKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKworICAgIGNoYXIgKmZpbGVuYW1lID0gbWFsbG9jKDUxMik7CisgICAgc25wcmludGYoZmlsZW5hbWUsIDUxMiwgIiVzLyVzIiwgaGFyZHdhcmUtPmR1bXBfcGF0aCwKKwkgICAgIGhhcmR3YXJlLT5kdW1wX2ZpbGVuYW1lKTsKKworICAgIC8qIFVudGlsIHdlIGZvdW5kIHNvbWUgZHVtcCBwYXJhbWV0ZXJzICovCisgICAgY2hhciAqYnVmZmVyOworICAgIHdoaWxlICgoYnVmZmVyID0gc3Ryc3RyKGZpbGVuYW1lLCAiJXsiKSkpIHsKKwkvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIHBhcmFtZXRlcgorCWNoYXIgKmJ1ZmZlcl9lbmQgPSBzdHJzdHIoYnVmZmVyLCAifSIpOworCisJLy8gRXh0cmFjdGluZyB0aGUgcGFyYW1ldGVyIGJldHdlZW4gJXsgYW5kIH0KKwljaGFyIG9wdGlvbls4XSA9IHsgMCB9OworCXN0cm5jcHkob3B0aW9uLCBidWZmZXIsIGJ1ZmZlcl9lbmQgLSBidWZmZXIgKyAxKTsKKworCS8qIFJlcGxhY2UgdGhpcyBvcHRpb24gYnkgaXRzIHZhbHVlIGluIHRoZSBmaWxlbmFtZSAKKwkgKiBGaWxlbmFtZSBpcyBsb25nZXIgdGhhbiB0aGUgcHJldmlvdXMgZmlsZW5hbWUgd2UgaGFkCisJICogc28gbGV0J3MgcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KKwlmaWxlbmFtZSA9CisJICAgIHN0cnJlcGxhY2UoZmlsZW5hbWUsIG9wdGlvbiwKKwkJICAgICAgIGdldF92YWx1ZV9mcm9tX29wdGlvbihoYXJkd2FyZSwgb3B0aW9uKSk7CisgICAgfQorCisgICAgLyogV2UgcmVwbGFjZSB0aGUgIjoiIGluIHRoZSBmaWxlbmFtZSBieSBzb21lICItIgorICAgICAqIFRoaXMgd2lsbCBhdm9pZCBNaWNyb3NvZnQgRlMgdHVybmluZyBjcmF6eSAqLworICAgIGNocnJlcGxhY2UoZmlsZW5hbWUsICc6JywgJy0nKTsKKworICAgIC8qIEF2b2lkIHNwYWNlIHRvIG1ha2UgZmlsZW5hbWUgZWFzaWVyIHRvIG1hbmlwdWxhdGUgKi8KKyAgICBjaHJyZXBsYWNlKGZpbGVuYW1lLCAnICcsICdfJyk7CisKKyAgICByZXR1cm4gZmlsZW5hbWU7Cit9CisKK2ludCBkdW1wcHJpbnRmKEZJTEUgKiBwLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIGludCBydjsKKworICAgICh2b2lkKXA7CisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgcnYgPSB2YnVmcHJpbnRmKCZwX2J1ZiwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICByZXR1cm4gcnY7Cit9CisKK3ZvaWQgdG9fY3BpbyhjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBjcGlvX3dyaXRlZmlsZSh1cGxvYWQsIGZpbGVuYW1lLCBwX2J1Zi5idWYsIHBfYnVmLmxlbik7CisgICAgaWYgKChwX2J1Zi5idWYpICYmIChwX2J1Zi5sZW4gPiAwKSkgeworCW1lbXNldChwX2J1Zi5idWYsIDAsIHBfYnVmLmxlbik7CisJZnJlZShwX2J1Zi5idWYpOworCXBfYnVmLmJ1ZiA9IE5VTEw7CisJcF9idWYuc2l6ZSA9IDA7CisJcF9idWYubGVuID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgZmx1c2goWlpKU09OX0NPTkZJRyAqIGNvbmZpZywgWlpKU09OICoqIGl0ZW0pCit7CisgICAgenpqc29uX3ByaW50KGNvbmZpZywgKml0ZW0pOworICAgIHp6anNvbl9mcmVlKGNvbmZpZywgKml0ZW0pOworICAgICppdGVtID0gTlVMTDsKK30KKworLyoqCisgKiBkdW1wIC0gZHVtcCBpbmZvCisgKiovCit2b2lkIGR1bXAoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGlmIChoYXJkd2FyZS0+aXNfcHhlX3ZhbGlkID09IGZhbHNlKSB7CisJbW9yZV9wcmludGYoIlBYRSBzdGFjayB3YXMgbm90IGRldGVjdGVkLCBEdW1wIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZVxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHVuaW9uIHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbyAqc2RpID0gc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvKCk7CisgICAgaW50IGVyciA9IDA7CisgICAgWlpKU09OICpqc29uID0gTlVMTDsKKyAgICBaWkpTT05fQ09ORklHIGNvbmZpZyA9IHsgWlpKU09OX1ZFUllfU1RSSUNULCBOVUxMLAorCShpbnQgKCopKHZvaWQgKikpZmdldGMsCisJTlVMTCwKKwltYWxsb2MsIGNhbGxvYywgZnJlZSwgcmVhbGxvYywKKwlzdGRlcnIsIE5VTEwsIHN0ZG91dCwKKwkoaW50ICgqKSh2b2lkICosIGNvbnN0IGNoYXIgKiwuLi4pKWR1bXBwcmludGYsCisJKGludCAoKikoaW50LCB2b2lkICopKWZwdXRjCisgICAgfTsKKworICAgIG1lbXNldCgmcF9idWYsIDAsIHNpemVvZihwX2J1ZikpOworCisgICAgLyogQnkgbm93LCB3ZSBvbmx5IHN1cHBvcnQgVEZUUCByZXBvcnRpbmcgKi8KKyAgICB1cGxvYWQgPSAmdXBsb2FkX3RmdHA7CisgICAgdXBsb2FkLT5uYW1lID0gInRmdHAiOworCisgICAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiB0aGUgcmVwb3J0aW5nICovCisgICAgY2hhciAqYXJnWzY0XTsKKyAgICBjaGFyICpmaWxlbmFtZSA9IGNvbXB1dGVfZmlsZW5hbWUoaGFyZHdhcmUpOworCisgICAgLyogVGhlIGZpbGVuYW1lICovCisgICAgYXJnWzBdID0gZmlsZW5hbWU7CisgICAgLyogVGhlIHNlcnZlciB0byB1cGxvYWQgdGhlIGZpbGUgKi8KKyAgICBpZiAoc3RybGVuKGhhcmR3YXJlLT50ZnRwX2lwKSAhPSAwKSB7CisJYXJnWzFdID0gaGFyZHdhcmUtPnRmdHBfaXA7CisJYXJnWzJdID0gTlVMTDsKKyAgICB9IGVsc2UgeworCWFyZ1sxXSA9IE5VTEw7CisJc25wcmludGYoaGFyZHdhcmUtPnRmdHBfaXAsIHNpemVvZihoYXJkd2FyZS0+dGZ0cF9pcCksCisJCSAiJXUuJXUuJXUuJXUiLAorCQkgKCh1aW50OF90ICopICYgc2RpLT5weGUuaXBpbmZvLT5zZXJ2ZXJpcClbMF0sCisJCSAoKHVpbnQ4X3QgKikgJiBzZGktPnB4ZS5pcGluZm8tPnNlcnZlcmlwKVsxXSwKKwkJICgodWludDhfdCAqKSAmIHNkaS0+cHhlLmlwaW5mby0+c2VydmVyaXApWzJdLAorCQkgKCh1aW50OF90ICopICYgc2RpLT5weGUuaXBpbmZvLT5zZXJ2ZXJpcClbM10pOworCisgICAgfQorCisgICAgLyogV2UgaW5pdGlhdGUgdGhlIGNwaW8gdG8gc2VuZCAqLworICAgIGNwaW9faW5pdCh1cGxvYWQsIChjb25zdCBjaGFyICoqKWFyZyk7CisKKyAgICBkdW1wX2NwdShoYXJkd2FyZSwgJmNvbmZpZywgJmpzb24pOworICAgIGR1bXBfcHhlKGhhcmR3YXJlLCAmY29uZmlnLCAmanNvbik7CisgICAgZHVtcF9zeXNsaW51eChoYXJkd2FyZSwgJmNvbmZpZywgJmpzb24pOworICAgIGR1bXBfdnBkKGhhcmR3YXJlLCAmY29uZmlnLCAmanNvbik7CisgICAgZHVtcF92ZXNhKGhhcmR3YXJlLCAmY29uZmlnLCAmanNvbik7CisgICAgZHVtcF9kaXNrcyhoYXJkd2FyZSwgJmNvbmZpZywgJmpzb24pOworICAgIGR1bXBfZG1pKGhhcmR3YXJlLCAmY29uZmlnLCAmanNvbik7CisgICAgZHVtcF9tZW1vcnkoaGFyZHdhcmUsICZjb25maWcsICZqc29uKTsKKyAgICBkdW1wX3BjaShoYXJkd2FyZSwgJmNvbmZpZywgJmpzb24pOworICAgIGR1bXBfYWNwaShoYXJkd2FyZSwgJmNvbmZpZywgJmpzb24pOworICAgIGR1bXBfa2VybmVsKGhhcmR3YXJlLCAmY29uZmlnLCAmanNvbik7CisgICAgZHVtcF9oZHQoaGFyZHdhcmUsICZjb25maWcsICZqc29uKTsKKworICAgIC8qIFdlIGNsb3NlICYgZmx1c2ggdGhlIGZpbGUgdG8gc2VuZCAqLworICAgIGNwaW9fY2xvc2UodXBsb2FkKTsKKworICAgIGlmICgoZXJyID0gZmx1c2hfZGF0YSh1cGxvYWQpKSAhPSBURlRQX09LKSB7CisJLyogQXMgd2UgbWFuYWdlIGEgdGZ0cCBjb25uZWN0aW9uLCBsZXQncyBkaXNwbGF5IHRoZSBhc3NvY2lhdGVkIGVycm9yIG1lc3NhZ2UgKi8KKwltb3JlX3ByaW50ZigiRHVtcCBmYWlsZWQgIVxuIik7CisJbW9yZV9wcmludGYoIlRGVFAgRVJST1Igb24gIDogJXM6LyVzIFxuIiwgaGFyZHdhcmUtPnRmdHBfaXAsIGZpbGVuYW1lKTsKKwltb3JlX3ByaW50ZigiVEZUUCBFUlJPUiBtc2cgOiAlcyBcbiIsIHRmdHBfc3RyaW5nX2Vycm9yX21lc3NhZ2VbLWVycl0pOworICAgIH0gZWxzZSB7CisJbW9yZV9wcmludGYoIkR1bXAgZmlsZSBzZW50IGF0ICVzOi8lc1xuIiwgaGFyZHdhcmUtPnRmdHBfaXAsIGZpbGVuYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LWR1bXAuaCBiL2NvbTMyL2hkdC9oZHQtZHVtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjY5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LWR1bXAuaApAQCAtMCwwICsxLDg1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMTEgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGJ1ZnByaW50Zi5oPgorI2luY2x1ZGUgPHp6anNvbi96empzb24uaD4KKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisKKy8vIE1hY3JvcyB0byBtYW5pcHVsYXRlIEFycmF5cworI2RlZmluZSBBUFBFTkRfQVJSQVkgWlpKU09OICp0ZW1wX2FycmF5OyB0ZW1wX2FycmF5ID0genpqc29uX2FycmF5X2FwcGVuZChjb25maWcsICppdGVtLCB6empzb25fY3JlYXRlX29iamVjdChjb25maWcsCisjZGVmaW5lIEFQUEVORF9PQkpFQ1RfQVJSQVkodmFsdWUpIFpaSlNPTiAqdGVtcF9hcjsgdGVtcF9hciA9IHp6anNvbl9hcnJheV9hcHBlbmQoY29uZmlnLCAqaXRlbSwgdmFsdWUpOyAqaXRlbT10ZW1wX2FyOyAKKyNkZWZpbmUgQ1JFQVRFX0FSUkFZICppdGVtID0genpqc29uX2NyZWF0ZV9hcnJheShjb25maWcsIHp6anNvbl9jcmVhdGVfb2JqZWN0KGNvbmZpZywgCisjZGVmaW5lIGFkZF9haShuYW1lLHZhbHVlKSBuYW1lLHp6anNvbl9jcmVhdGVfbnVtYmVyX2koY29uZmlnLHZhbHVlKSwKKyNkZWZpbmUgYWRkX2FoaSh2YWx1ZSkgYWRkX2FpKCN2YWx1ZSxoYXJkd2FyZS0+dmFsdWUpCisjZGVmaW5lIGFkZF9hcyhuYW1lLHZhbHVlKSBuYW1lLHp6anNvbl9jcmVhdGVfc3RyaW5nKGNvbmZpZyx2YWx1ZSksCisjZGVmaW5lIGFkZF9haHModmFsdWUpIGFkZF9hcygjdmFsdWUsaGFyZHdhcmUtPnZhbHVlKQorI2RlZmluZSBFTkRfT0ZfQVJSQVkgTlVMTCksTlVMTCkKKyNkZWZpbmUgRU5EX09GX0FQUEVORCBOVUxMKSk7ICppdGVtPXRlbXBfYXJyYXk7CisKKy8vIE1hY3JvcyB0byBtYW5pcHVsYXRlIG9iamVjdHMKKyNkZWZpbmUgQ1JFQVRFX05FV19PQkpFQ1QgICAqaXRlbSA9IHp6anNvbl9jcmVhdGVfb2JqZWN0KGNvbmZpZywgTlVMTCk7CisjZGVmaW5lIEZMVVNIX09CSkVDVCBmbHVzaChjb25maWcsIGl0ZW0pOyAKKworLy8gTWFjcm9zIHRvIG1hbmlwdWxhdGUgaW50ZWdlcnMgYXMgb2JqZWN0cworI2RlZmluZSBhZGRfaShuYW1lLHZhbHVlKSAqaXRlbSA9IHp6anNvbl9vYmplY3RfYXBwZW5kKGNvbmZpZywgKml0ZW0sIG5hbWUsIHp6anNvbl9jcmVhdGVfbnVtYmVyX2koY29uZmlnLCB2YWx1ZSkpCisjZGVmaW5lIGFkZF9oaSh2YWx1ZSkgYWRkX2koI3ZhbHVlLGhhcmR3YXJlLT52YWx1ZSkKKworLy8gTWFjcm9zIHRvIG1hbmlwdWxhdGUgc3RyaW5ncyBhcyBvYmplY3RzCisjZGVmaW5lIGFkZF9zKG5hbWUsdmFsdWUpICppdGVtID0genpqc29uX29iamVjdF9hcHBlbmQoY29uZmlnLCAqaXRlbSwgbmFtZSwgenpqc29uX2NyZWF0ZV9zdHJpbmcoY29uZmlnLCB2YWx1ZSkpCisjZGVmaW5lIGFkZF9ocyh2YWx1ZSkgYWRkX3MoI3ZhbHVlLChjaGFyICopaGFyZHdhcmUtPnZhbHVlKQorCisvLyBNYWNyb3MgdG8gbWFuaXB1bGF0ZSBib29sIGFzIG9iamVjdHMKKyNkZWZpbmUgYWRkX2Jvb2xfdHJ1ZShuYW1lKSAqaXRlbSA9IHp6anNvbl9vYmplY3RfYXBwZW5kKGNvbmZpZywgKml0ZW0sIChjaGFyICopbmFtZSwgenpqc29uX2NyZWF0ZV90cnVlKGNvbmZpZykpCisjZGVmaW5lIGFkZF9ib29sX2ZhbHNlKG5hbWUpICppdGVtID0genpqc29uX29iamVjdF9hcHBlbmQoY29uZmlnLCAqaXRlbSwgKGNoYXIqKW5hbWUsIHp6anNvbl9jcmVhdGVfZmFsc2UoY29uZmlnKSkKKyNkZWZpbmUgYWRkX2IobmFtZSx2YWx1ZSkgaWYgKHZhbHVlPT10cnVlKSB7YWRkX2Jvb2xfdHJ1ZShuYW1lKTt9IGVsc2Uge2FkZF9ib29sX2ZhbHNlKG5hbWUpO30KKyNkZWZpbmUgYWRkX2hiKHZhbHVlKSBhZGRfYigjdmFsdWUsaGFyZHdhcmUtPnZhbHVlKQorCitleHRlcm4gc3RydWN0IHByaW50X2J1ZiBwX2J1ZjsKKwordm9pZCBwcmludF9hbmRfZmx1c2goWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKTsKK2ludCBkdW1wcHJpbnRmKEZJTEUgKnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK3ZvaWQgZmx1c2ggKFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqIGl0ZW0pOwordm9pZCB0b19jcGlvKGNoYXIgKmZpbGVuYW1lKTsKKwordm9pZCBkdW1wX2NwdShzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSk7Cit2b2lkIGR1bXBfcHhlKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKTsKK3ZvaWQgZHVtcF9zeXNsaW51eChzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSk7Cit2b2lkIGR1bXBfdnBkKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKTsKK3ZvaWQgZHVtcF92ZXNhKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKTsKK3ZvaWQgZHVtcF9kaXNrcyhzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSk7Cit2b2lkIGR1bXBfZG1pKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKTsKK3ZvaWQgZHVtcF9tZW1vcnkoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pOwordm9pZCBkdW1wX3BjaShzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSk7Cit2b2lkIGR1bXBfYWNwaShzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUsIFpaSlNPTl9DT05GSUcgKmNvbmZpZywgWlpKU09OICoqaXRlbSk7Cit2b2lkIGR1bXBfa2VybmVsKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwgWlpKU09OX0NPTkZJRyAqY29uZmlnLCBaWkpTT04gKippdGVtKTsKK3ZvaWQgZHVtcF9oZHQoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBaWkpTT05fQ09ORklHICpjb25maWcsIFpaSlNPTiAqKml0ZW0pOwordm9pZCBkdW1wKHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LW1lbnUtYWJvdXQuYyBiL2NvbTMyL2hkdC9oZHQtbWVudS1hYm91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGUzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LW1lbnUtYWJvdXQuYwpAQCAtMCwwICsxLDkyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJoZHQtbWVudS5oIgorCisvKiBDb21wdXRpbmcgQWJvdXQgbWVudSovCit2b2lkIGNvbXB1dGVfYWJvdXRtZW51KHN0cnVjdCBzX215X21lbnUgKm1lbnUpCit7CisgICAgY2hhciBidWZmZXJbU1VCTUVOVUxFTiArIDFdOworICAgIGNoYXIgc3RhdGJ1ZmZlcltTVEFUTEVOICsgMV07CisKKyAgICBtZW51LT5tZW51ID0gYWRkX21lbnUoIiBBYm91dCAiLCAtMSk7CisgICAgbWVudS0+aXRlbXNfY291bnQgPSAwOworCisgICAgc2V0X21lbnVfcG9zKFNVQk1FTlVfWSwgU1VCTUVOVV9YKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlByb2R1Y3QgICAgICAgIDogJXMiLCBQUk9EVUNUX05BTUUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiUHJvZHVjdCA6ICVzIiwgUFJPRFVDVF9OQU1FKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlZlcnNpb24gICAgICAgIDogJXMgKCVzKSIsIFZFUlNJT04sCisJICAgICBDT0RFTkFNRSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJWZXJzaW9uIDogJXMgKCVzKSIsIFZFUlNJT04sCisJICAgICBDT0RFTkFNRSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJXZWJzaXRlICAgICAgICA6ICVzIiwgV0VCU0lURV9VUkwpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiV2Vic2l0ZSA6ICVzIixXRUJTSVRFX1VSTCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJJUkMgQ2hhbm5lbCAgICA6ICVzIiwgSVJDX0NIQU5ORUwpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiSVJDIENoYW5uZWwgOiAlcyIsSVJDX0NIQU5ORUwpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTWFpbGluZyBMaXN0ICAgOiAlcyIsIENPTlRBQ1QpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTWFpbGluZyBMaXN0OiAlcyIsIENPTlRBQ1QpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgYWRkX2l0ZW0oIiIsICIiLCBPUFRfU0VQLCAiIiwgMCk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJQcm9qZWN0IExlYWRlciA6ICVzIiwgQVVUSE9SKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlByb2plY3QgTGVhZGVyICA6ICVzIiwgQVVUSE9SKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkNvcmUgRGV2ZWxvcGVyIDogJXMiLCBDT1JFX0RFVkVMT1BFUik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJDb3JlIERldmVsb3BlciAgOiAlcyIsCisJICAgICBDT1JFX0RFVkVMT1BFUik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBjaGFyICpjb250cmlidXRvcnNbTkJfQ09OVFJJQlVUT1JTXSA9IENPTlRSSUJVVE9SUzsKKyAgICBmb3IgKGludCBjID0gMDsgYyA8IE5CX0NPTlRSSUJVVE9SUzsgYysrKSB7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiQ29udHJpYnV0b3IgICAgOiAlcyIsIGNvbnRyaWJ1dG9yc1tjXSk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJDb250cmlidXRvciA6ICVzIiwKKwkJIGNvbnRyaWJ1dG9yc1tjXSk7CisJYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCW1lbnUtPml0ZW1zX2NvdW50Kys7CisgICAgfQorCisgICAgcHJpbnRmKCJNRU5VOiBBYm91dCBtZW51IGRvbmUgKCVkIGl0ZW1zKVxuIiwgbWVudS0+aXRlbXNfY291bnQpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1tZW51LWFjcGkuYyBiL2NvbTMyL2hkdC9oZHQtbWVudS1hY3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwYmExOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtbWVudS1hY3BpLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAiaGR0LW1lbnUuaCIKKwordm9pZCBjb21wdXRlX3RhYmxlKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHZvaWQgKmFkZHJlc3MsIHNfYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgKiBoKSB7CisgICAgY2hhciBidWZmZXJbU1VCTUVOVUxFTiArIDFdID0geyAwIH07CisgICAgY2hhciBzdGF0YnVmZmVyW1NUQVRMRU4gKyAxXSA9IHsgMCB9OworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiJS00cyB2JTAzeCAlLTZzICUtOHMgJS03cyAlMDh4IiwgCisJCSAgICBoLT5zaWduYXR1cmUsIGgtPnJldmlzaW9uLCBoLT5vZW1faWQsIGgtPm9lbV90YWJsZV9pZCwgaC0+Y3JlYXRvcl9pZCwgaC0+Y3JlYXRvcl9yZXZpc2lvbik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICIlLTRzIHYlMDN4ICUtNnMgJS03cyAweCUwOHggJS00cyAgICAweCUwOHggQCAweCVwIiwgCisJCSAgICBoLT5zaWduYXR1cmUsIGgtPnJldmlzaW9uLCBoLT5vZW1faWQsIGgtPm9lbV90YWJsZV9pZCwKKwkJICAgIGgtPm9lbV9yZXZpc2lvbiwgaC0+Y3JlYXRvcl9pZCwgaC0+Y3JlYXRvcl9yZXZpc2lvbiwgYWRkcmVzcyk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKK30KKworLyogU3VibWVudSBmb3IgdGhlIHZlc2EgY2FyZCAqLworc3RhdGljIHZvaWQgY29tcHV0ZV9hY3BpX3RhYmxlcyhzdHJ1Y3Qgc19teV9tZW51ICptZW51LAorCQkJICAgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIG1lbnUtPm1lbnUgPSBhZGRfbWVudSgiIEFDUEkgVGFibGVzICIsIC0xKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCA9IDA7CisgICAgc2V0X21lbnVfcG9zKFNVQk1FTlVfWSwgU1VCTUVOVV9YKTsKKworICAgIGNoYXIgYnVmZmVyW1NVQk1FTlVMRU4gKyAxXSA9IHsgMCB9OworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiJS00cyAlLTRzICUtNnMgJS04cyAlLTdzICUtOHMiLCAKKwkJICAgICJBQ1BJIiwgInJldiIsICJvZW0iLCAidGFibGVfaWQiLCAiY3JlYXRvciIsICJjcmVhdG9yX3JldiIpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgIkRlc2NyaXB0aW9uIiwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgYWRkX2l0ZW0oIiIsICIiLCBPUFRfU0VQLCAiIiwgMCk7CisKKyAgICBpZiAoaGFyZHdhcmUtPmFjcGkucnNkdC52YWxpZCkKKyAgICAgICAgY29tcHV0ZV90YWJsZShtZW51LGhhcmR3YXJlLT5hY3BpLnJzZHQuYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgJmhhcmR3YXJlLT5hY3BpLnJzZHQuaGVhZGVyKTsKKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS54c2R0LnZhbGlkKQorICAgICAgICBjb21wdXRlX3RhYmxlKG1lbnUsaGFyZHdhcmUtPmFjcGkueHNkdC5hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAmaGFyZHdhcmUtPmFjcGkueHNkdC5oZWFkZXIpOworCisgICAgaWYgKGhhcmR3YXJlLT5hY3BpLmZhZHQudmFsaWQpCisgICAgICAgIGNvbXB1dGVfdGFibGUobWVudSxoYXJkd2FyZS0+YWNwaS5mYWR0LmFkZHJlc3MsICZoYXJkd2FyZS0+YWNwaS5mYWR0LmhlYWRlcik7CisKKyAgICBpZiAoaGFyZHdhcmUtPmFjcGkuZHNkdC52YWxpZCkKKyAgICAgICAgY29tcHV0ZV90YWJsZShtZW51LGhhcmR3YXJlLT5hY3BpLmRzZHQuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLmRzZHQuaGVhZGVyKTsKKworICAgIC8qIFNTRFQgaW5jbHVkZXMgbWFueSBvcHRpb25hbCB0YWJsZXMsIGxldCdzIGRpc3BsYXkgdGhlbSAqLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFyZHdhcmUtPmFjcGkuc3NkdF9jb3VudDsgaSsrKSB7CisgICAgICAgIGlmICgoaGFyZHdhcmUtPmFjcGkuc3NkdFtpXSAhPSBOVUxMKSAmJiAoaGFyZHdhcmUtPmFjcGkuc3NkdFtpXS0+dmFsaWQpKQorICAgICAgICAgICAgY29tcHV0ZV90YWJsZShtZW51LGhhcmR3YXJlLT5hY3BpLnNzZHRbaV0tPmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAmaGFyZHdhcmUtPmFjcGkuc3NkdFtpXS0+aGVhZGVyKTsKKyAgICB9CisKKyAgICBpZiAoaGFyZHdhcmUtPmFjcGkuc2JzdC52YWxpZCkKKyAgICAgICAgY29tcHV0ZV90YWJsZShtZW51LGhhcmR3YXJlLT5hY3BpLnNic3QuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLnNic3QuaGVhZGVyKTsKKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5lY2R0LnZhbGlkKQorICAgICAgICBjb21wdXRlX3RhYmxlKG1lbnUsaGFyZHdhcmUtPmFjcGkuZWNkdC5hZGRyZXNzLCAmaGFyZHdhcmUtPmFjcGkuZWNkdC5oZWFkZXIpOworCisgICAgaWYgKGhhcmR3YXJlLT5hY3BpLmhwZXQudmFsaWQpCisgICAgICAgIGNvbXB1dGVfdGFibGUobWVudSxoYXJkd2FyZS0+YWNwaS5ocGV0LmFkZHJlc3MsICZoYXJkd2FyZS0+YWNwaS5ocGV0LmhlYWRlcik7CisKKyAgICBpZiAoaGFyZHdhcmUtPmFjcGkudGNwYS52YWxpZCkKKyAgICAgICAgY29tcHV0ZV90YWJsZShtZW51LGhhcmR3YXJlLT5hY3BpLnRjcGEuYWRkcmVzcywgJmhhcmR3YXJlLT5hY3BpLnRjcGEuaGVhZGVyKTsKKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5tY2ZnLnZhbGlkKQorICAgICAgICBjb21wdXRlX3RhYmxlKG1lbnUsaGFyZHdhcmUtPmFjcGkubWNmZy5hZGRyZXNzLCAmaGFyZHdhcmUtPmFjcGkubWNmZy5oZWFkZXIpOworICAgIAorICAgIGlmIChoYXJkd2FyZS0+YWNwaS5zbGljLnZhbGlkKQorICAgICAgICBjb21wdXRlX3RhYmxlKG1lbnUsaGFyZHdhcmUtPmFjcGkuc2xpYy5hZGRyZXNzLCAmaGFyZHdhcmUtPmFjcGkuc2xpYy5oZWFkZXIpOworCisgICAgaWYgKGhhcmR3YXJlLT5hY3BpLmJvb3QudmFsaWQpCisgICAgICAgIGNvbXB1dGVfdGFibGUobWVudSxoYXJkd2FyZS0+YWNwaS5ib290LmFkZHJlc3MsICZoYXJkd2FyZS0+YWNwaS5ib290LmhlYWRlcik7CisKKyAgICAvKiBGQUNTIGlzbid0IGhhdmluZyB0aGUgc2FtZSBoZWFkZXJzLCBsZXQncyB1c2UgYSBkZWRpY2F0ZWQgcmVuZGVyaW5nICovCisgICAgaWYgKGhhcmR3YXJlLT5hY3BpLmZhY3MudmFsaWQpIHsKKwlzX2ZhY3MgKmZhID0gJmhhcmR3YXJlLT5hY3BpLmZhY3M7CisgICAgICAgIGNoYXIgYnVmZmVyW1NVQk1FTlVMRU4gKyAxXSA9IHsgMCB9OworICAgICAgICBjaGFyIHN0YXRidWZmZXJbU1RBVExFTiArIDFdID0geyAwIH07CisKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICIlLTRzIiwgZmEtPnNpZ25hdHVyZSk7IAorCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiJS00cyBAIDB4JXAiLCBmYS0+c2lnbmF0dXJlLCBmYS0+YWRkcmVzcyk7CisJYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIAltZW51LT5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIGlmIChoYXJkd2FyZS0+YWNwaS5tYWR0LnZhbGlkKQorICAgICAgICBjb21wdXRlX3RhYmxlKG1lbnUsaGFyZHdhcmUtPmFjcGkubWFkdC5hZGRyZXNzLCAmaGFyZHdhcmUtPmFjcGkubWFkdC5oZWFkZXIpOworCit9CisKKy8qIE1haW4gQUNQSSBNZW51Ki8KK2ludCBjb21wdXRlX0FDUEkoc3RydWN0IHNfaGR0X21lbnUgKmhkdF9tZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgY29tcHV0ZV9hY3BpX3RhYmxlcygmaGR0X21lbnUtPmFjcGlfdGFibGVzX21lbnUsIGhhcmR3YXJlKTsKKyAgICBoZHRfbWVudS0+YWNwaV9tZW51Lm1lbnUgPSBhZGRfbWVudSgiIEFDUEkgIiwgLTEpOworICAgIGhkdF9tZW51LT5hY3BpX21lbnUuaXRlbXNfY291bnQgPSAwOworCisgICAgYWRkX2l0ZW0oIlRhYmxlcyIsICJUYWJsZXMiLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkgICAgIGhkdF9tZW51LT5hY3BpX3RhYmxlc19tZW51Lm1lbnUpOworICAgIGhkdF9tZW51LT5hY3BpX21lbnUuaXRlbXNfY291bnQrKzsKKyAgICBwcmludGYoIk1FTlU6IEFDUEkgbWVudSBkb25lICglZCBpdGVtcylcbiIsCisJICAgaGR0X21lbnUtPmFjcGlfbWVudS5pdGVtc19jb3VudCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LW1lbnUtZGlzay5jIGIvY29tMzIvaGR0L2hkdC1tZW51LWRpc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzE2YjQzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1tZW51LWRpc2suYwpAQCAtMCwwICsxLDI2NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJoZHQtbWVudS5oIgorI2luY2x1ZGUgImhkdC11dGlsLmgiCisKK3N0YXRpYyBpbnQgZG47CisKK3N0YXRpYyB2b2lkIHNob3dfcGFydGl0aW9uX2luZm9ybWF0aW9uKHN0cnVjdCBkcml2ZWluZm8gKmRyaXZlX2luZm8sCisJCQkJICAgICAgIHN0cnVjdCBwYXJ0X2VudHJ5ICpwdGFiIF9fdW51c2VkLAorCQkJCSAgICAgICBpbnQgcGFydGl0aW9uX29mZnNldCBfX3VudXNlZCwKKwkJCQkgICAgICAgaW50IG5iX3BhcnRpdGlvbnNfc2VlbikKK3sKKyAgICBjaGFyIG1lbnVfdGl0bGVbTUVOVUxFTiArIDFdOworICAgIGNoYXIgbWVudV90aXRsZV9yZWZbTUVOVUxFTiArIDFdOworCisgICAgaWYgKG5iX3BhcnRpdGlvbnNfc2VlbiA9PSAxKQorCWFkZF9zZXAoKTsKKworICAgIG1lbXNldChtZW51X3RpdGxlLCAwLCBzaXplb2YgbWVudV90aXRsZSk7CisgICAgbWVtc2V0KG1lbnVfdGl0bGVfcmVmLCAwLCBzaXplb2YgbWVudV90aXRsZV9yZWYpOworICAgIHNucHJpbnRmKG1lbnVfdGl0bGVfcmVmLCBzaXplb2YgbWVudV90aXRsZV9yZWYsICJkaXNrXyV4X3BhcnRfJWQiLAorCSAgICAgZHJpdmVfaW5mb1tkbl0uZGlzaywgbmJfcGFydGl0aW9uc19zZWVuKTsKKyAgICBzbnByaW50ZihtZW51X3RpdGxlLCBzaXplb2YgbWVudV90aXRsZSwgIlBhcnRpdGlvbiAlZCIsIG5iX3BhcnRpdGlvbnNfc2Vlbik7CisKKyAgICBhZGRfaXRlbShtZW51X3RpdGxlLAorCSAgICAgIlBhcnRpdGlvbiBpbmZvcm1hdGlvbiAoc3RhcnQsIGVuZCwgbGVuZ3RoLCB0eXBlLCAuLi4pIiwKKwkgICAgIE9QVF9TVUJNRU5VLCBtZW51X3RpdGxlX3JlZiwgMCk7Cit9CisKKy8qKgorICogY29tcHV0ZV9wYXJ0aXRpb25faW5mb3JtYXRpb24gLSBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpdGlvbgorICogQHB0YWI6ICAgICAgIHBhcnRfZW50cnkgZGVzY3JpYmluZyB0aGUgcGFydGl0aW9uCisgKiBAaTogICAgICAgICAgUGFydGl0aW9uIG51bWJlciAoVUkgcHVycG9zZXMgb25seSkKKyAqIEBwdGFiX3Jvb3Q6ICBwYXJ0X2VudHJ5IGRlc2NyaWJpbmcgdGhlIHJvb3QgcGFydGl0aW9uIChleHRlbmRlZCBvbmx5KQorICogQGRyaXZlX2luZm86IGRyaXZlaW5mbyBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgZHJpdmUgb24gd2hpY2ggdGhlIHBhcnRpdGlvbgorICogICAgICAgICAgICAgIGlzCisgKgorICogTm90ZSBvbiBvZmZzZXRzIChmcm9tIGhwYSwgc2VlIGNoYWluLmMzMik6CisgKgorICogIFRvIG1ha2UgdGhpbmdzIGV4dHJhIGNvbmZ1c2luZzogZGF0YSBwYXJ0aXRpb24gb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gd2hlcmUKKyAqICB0aGUgZGF0YSBwYXJ0aXRpb24gcmVjb3JkIGlzIHN0b3JlZCwgd2hlcmVhcyBleHRlbmRlZCBwYXJ0aXRpb24gb2Zmc2V0cworICogIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBleHRlbmRlZCBwYXJ0aXRpb24gYWxsIHRoZSB3YXkgYmFjaworICogIGF0IHRoZSBNQlIuLi4gYnV0IHN0aWxsIG5vdCBhYnNvbHV0ZSEKKyAqKi8KK3N0YXRpYyB2b2lkIGNvbXB1dGVfcGFydGl0aW9uX2luZm9ybWF0aW9uKHN0cnVjdCBkcml2ZWluZm8gKmRyaXZlX2luZm8sCisJCQkJCSAgc3RydWN0IHBhcnRfZW50cnkgKnB0YWIsCisJCQkJCSAgaW50IHBhcnRpdGlvbl9vZmZzZXQsCisJCQkJCSAgaW50IG5iX3BhcnRpdGlvbnNfc2VlbikKK3sKKyAgICBjaGFyIHNpemVbMTFdOworICAgIGNoYXIgYm9vdGxvYWRlcl9uYW1lWzldOworICAgIGNoYXIgKnBhcnR0eXBlOworICAgIHVuc2lnbmVkIGludCBzdGFydCwgZW5kOworICAgIGNoYXIgYnVmZmVyW1NVQk1FTlVMRU4gKyAxXTsKKyAgICBjaGFyIHN0YXRidWZmZXJbU1RBVExFTiArIDFdOworICAgIGNoYXIgbWVudV90aXRsZVtNRU5VTEVOICsgMV07CisgICAgY2hhciBtZW51X3RpdGxlX3JlZltNRU5VTEVOICsgMV07CisKKyAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YgYnVmZmVyKTsKKyAgICBtZW1zZXQoc3RhdGJ1ZmZlciwgMCwgc2l6ZW9mIHN0YXRidWZmZXIpOworICAgIG1lbXNldChtZW51X3RpdGxlLCAwLCBzaXplb2YgbWVudV90aXRsZSk7CisgICAgbWVtc2V0KG1lbnVfdGl0bGVfcmVmLCAwLCBzaXplb2YgbWVudV90aXRsZV9yZWYpOworICAgIHNucHJpbnRmKG1lbnVfdGl0bGVfcmVmLCBzaXplb2YgbWVudV90aXRsZV9yZWYsICJkaXNrXyV4X3BhcnRfJWQiLAorCSAgICAgZHJpdmVfaW5mb1tkbl0uZGlzaywgbmJfcGFydGl0aW9uc19zZWVuKTsKKyAgICBzbnByaW50ZihtZW51X3RpdGxlLCBzaXplb2YgbWVudV90aXRsZSwgIlBhcnRpdGlvbiAlZCIsIG5iX3BhcnRpdGlvbnNfc2Vlbik7CisKKyAgICBhZGRfbmFtZWRfbWVudShtZW51X3RpdGxlX3JlZiwgbWVudV90aXRsZSwgLTEpOworICAgIHNldF9tZW51X3BvcyhTVUJNRU5VX1ksIFNVQk1FTlVfWCk7CisKKyAgICBzdGFydCA9IHBhcnRpdGlvbl9vZmZzZXQ7CisgICAgZW5kID0gc3RhcnQgKyBwdGFiLT5sZW5ndGggLSAxOworCisgICAgaWYgKHB0YWItPmxlbmd0aCA+IDApCisJc2VjdG9yc190b19zaXplKHB0YWItPmxlbmd0aCwgc2l6ZSk7CisgICAgZWxzZQorCW1lbXNldChzaXplLCAwLCBzaXplb2Ygc2l6ZSk7CisKKyAgICBnZXRfbGFiZWwocHRhYi0+b3N0eXBlLCAmcGFydHR5cGUpOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiU2l6ZSAgICAgICAgOiAlcyIsIHJlbW92ZV9zcGFjZXMoc2l6ZSkpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiU2l6ZSA6ICVzIiwgcmVtb3ZlX3NwYWNlcyhzaXplKSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVHlwZSAgICAgICAgOiAlcyIsIHBhcnR0eXBlKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlR5cGU6ICVzIiwgcGFydHR5cGUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKworICAgIGlmIChnZXRfYm9vdGxvYWRlcl9zdHJpbmcoZHJpdmVfaW5mbywgcHRhYiwgYm9vdGxvYWRlcl9uYW1lLCA5KSA9PSAwKSB7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiQm9vdGxvYWRlciAgOiAlcyIsIGJvb3Rsb2FkZXJfbmFtZSk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJCb290bG9hZGVyOiAlcyIsCisJCSBib290bG9hZGVyX25hbWUpOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJCb290IEZsYWcgICA6ICVzIiwKKwkgICAgIChwdGFiLT5hY3RpdmVfZmxhZyA9PSAweDgwKSA/ICJZZXMiIDogIk5vIik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJCb290IEZsYWc6ICVzIiwKKwkgICAgIChwdGFiLT5hY3RpdmVfZmxhZyA9PSAweDgwKSA/ICJZZXMiIDogIk5vIik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiU3RhcnQgICAgICAgOiAlZCIsIHN0YXJ0KTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlN0YXJ0OiAlZCIsIHN0YXJ0KTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJFbmQgICAgICAgICA6ICVkIiwgZW5kKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkVuZDogJWQiLCBlbmQpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIklkICAgICAgICAgIDogJVgiLCBwdGFiLT5vc3R5cGUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiSWQ6ICVYIiwgcHRhYi0+b3N0eXBlKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisKKyAgICBmcmVlKHBhcnR0eXBlKTsKKworICAgIC8qIEV4dHJhIGluZm8gKi8KKyAgICBpZiAocHRhYi0+b3N0eXBlID09IDB4ODIgJiYgc3dzdXNwX2NoZWNrKGRyaXZlX2luZm8sIHB0YWIpICE9IC0xKSB7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiJXMiLCAiU3dzdXNwIHNpZyAgOiBkZXRlY3RlZCIpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiJXMiLCAiU3dzdXNwIHNpZyAgOiBkZXRlY3RlZCIpOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICB9Cit9CisKKy8qIENvbXB1dGUgdGhlIGRpc2sgc3VibWVudSAqLworc3RhdGljIGludCBjb21wdXRlX2Rpc2tfbW9kdWxlKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIGludCBuYl9zdWJfZGlza19tZW51LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSwKKwkJCSAgICAgICBpbnQgZGlza19udW1iZXIpCit7CisgICAgY2hhciBidWZmZXJbTUVOVUxFTiArIDFdOworICAgIGNoYXIgc3RhdGJ1ZmZlcltTVEFUTEVOICsgMV07CisgICAgY2hhciBtYnJfbmFtZVs1MF07CisgICAgc3RydWN0IGRyaXZlaW5mbyAqZCA9IChzdHJ1Y3QgZHJpdmVpbmZvICopaGFyZHdhcmUtPmRpc2tfaW5mbzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIiBEaXNrIDwweCVYPiAoRUREICVYKSIsCisJICAgICBkW2Rpc2tfbnVtYmVyXS5kaXNrLCBkW2Rpc2tfbnVtYmVyXS5lZGRfdmVyc2lvbik7CisgICAgbWVudVtuYl9zdWJfZGlza19tZW51XS5tZW51ID0gYWRkX21lbnUoYnVmZmVyLCAtMSk7CisgICAgbWVudVtuYl9zdWJfZGlza19tZW51XS5pdGVtc19jb3VudCA9IDA7CisKKyAgICBpbnQgcHJldmlvdXNfc2l6ZSwgc2l6ZTsKKyAgICBjaGFyIHByZXZpb3VzX3VuaXRbM10sIHVuaXRbM107CS8vIEdCCisgICAgY2hhciBzaXplX2llY1sxMV07CQkvLyBHaUIKKyAgICBjaGFyIHNpemVfZGVjWzExXTsJCS8vIEdCCisgICAgc2VjdG9yc190b19zaXplX2RlYyhwcmV2aW91c191bml0LCAmcHJldmlvdXNfc2l6ZSwgdW5pdCwgJnNpemUsCisJCQlkW2Rpc2tfbnVtYmVyXS5lZGRfcGFyYW1zLnNlY3RvcnMpOworICAgIHNlY3RvcnNfdG9fc2l6ZShkW2Rpc2tfbnVtYmVyXS5lZGRfcGFyYW1zLnNlY3RvcnMsIHNpemVfaWVjKTsKKyAgICBzZWN0b3JzX3RvX3NpemVfZGVjMihkW2Rpc2tfbnVtYmVyXS5lZGRfcGFyYW1zLnNlY3RvcnMsIHNpemVfZGVjKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlNpemUgICAgICAgICAgICAgIDogJXMvJXMgKCVkICVzKSIsCisJICAgICByZW1vdmVfc3BhY2VzKHNpemVfaWVjKSwgcmVtb3ZlX3NwYWNlcyhzaXplX2RlYyksIHByZXZpb3VzX3NpemUsCisJICAgICBwcmV2aW91c191bml0KTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlNpemU6ICVzLyVzICglZCAlcykiLAorCSAgICAgcmVtb3ZlX3NwYWNlcyhzaXplX2llYyksIHJlbW92ZV9zcGFjZXMoc2l6ZV9kZWMpLCBwcmV2aW91c19zaXplLAorCSAgICAgcHJldmlvdXNfdW5pdCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnVbbmJfc3ViX2Rpc2tfbWVudV0uaXRlbXNfY291bnQrKzsKKworICAgIC8qIERvIG5vdCBwcmludCBIb3N0IEJ1cyAmIEludGVyZmFjZSBpZiBFREQgaXNuJ3QgMy4wIG9yIG1vcmUgKi8KKyAgICBpZiAoZFtkaXNrX251bWJlcl0uZWRkX3ZlcnNpb24gPj0gMHgzMCkgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkhvc3QgQnVzL0ludGVyZmFjZTogJXMgLyAlcyIsCisJCSByZW1vdmVfc3BhY2VzKChjaGFyICopZFtkaXNrX251bWJlcl0uZWRkX3BhcmFtcy5ob3N0X2J1c190eXBlKSwKKwkJIGRbZGlza19udW1iZXJdLmVkZF9wYXJhbXMuaW50ZXJmYWNlX3R5cGUpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiSG9zdCBCdXMgLyBJbnRlcmZhY2U6ICVzIC8gJXMiLAorCQkgcmVtb3ZlX3NwYWNlcygoY2hhciAqKWRbZGlza19udW1iZXJdLmVkZF9wYXJhbXMuaG9zdF9idXNfdHlwZSksCisJCSBkW2Rpc2tfbnVtYmVyXS5lZGRfcGFyYW1zLmludGVyZmFjZV90eXBlKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudVtuYl9zdWJfZGlza19tZW51XS5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkMgLyBIIC8gUyAgICAgICAgIDogJWQgLyAlZCAvICVkIiwKKwkgICAgIGRbZGlza19udW1iZXJdLmxlZ2FjeV9tYXhfY3lsaW5kZXIgKyAxLAorCSAgICAgZFtkaXNrX251bWJlcl0ubGVnYWN5X21heF9oZWFkICsgMSwKKwkgICAgIChpbnQpZFtkaXNrX251bWJlcl0uZWRkX3BhcmFtcy5zZWN0b3JzKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwKKwkgICAgICJDeWxpbmRlcnMgLyBIZWFkcyAvIFNlY3RvcnM6ICVkIC8gJWQgLyAlZCIsCisJICAgICBkW2Rpc2tfbnVtYmVyXS5sZWdhY3lfbWF4X2N5bGluZGVyICsgMSwKKwkgICAgIGRbZGlza19udW1iZXJdLmxlZ2FjeV9tYXhfaGVhZCArIDEsCisJICAgICAoaW50KWRbZGlza19udW1iZXJdLmVkZF9wYXJhbXMuc2VjdG9ycyk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnVbbmJfc3ViX2Rpc2tfbWVudV0uaXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlNlY3RvcnMvVHJhY2sgICAgIDogJWQiLAorCSAgICAgZFtkaXNrX251bWJlcl0ubGVnYWN5X3NlY3RvcnNfcGVyX3RyYWNrKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlNlY3RvcnMgcGVyIFRyYWNrOiAlZCIsCisJICAgICBkW2Rpc2tfbnVtYmVyXS5sZWdhY3lfc2VjdG9yc19wZXJfdHJhY2spOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51W25iX3N1Yl9kaXNrX21lbnVdLml0ZW1zX2NvdW50Kys7CisKKyAgICBnZXRfbWJyX3N0cmluZyhoYXJkd2FyZS0+bWJyX2lkc1tkaXNrX251bWJlcl0sICZtYnJfbmFtZSwgNTApOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTUJSICAgICAgICAgICAgICAgOiAlcyAoMHglWCkiLAorCSAgICAgcmVtb3ZlX3NwYWNlcyhtYnJfbmFtZSksIGhhcmR3YXJlLT5tYnJfaWRzW2Rpc2tfbnVtYmVyXSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJNQlI6ICVzIChpZCAweCVYKSIsCisJICAgICByZW1vdmVfc3BhY2VzKG1icl9uYW1lKSwgaGFyZHdhcmUtPm1icl9pZHNbZGlza19udW1iZXJdKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudVtuYl9zdWJfZGlza19tZW51XS5pdGVtc19jb3VudCsrOworCisgICAgZG4gPSBkaXNrX251bWJlcjsKKworICAgIHBhcnNlX3BhcnRpdGlvbl90YWJsZSgmZFtkaXNrX251bWJlcl0sICZzaG93X3BhcnRpdGlvbl9pbmZvcm1hdGlvbik7CisgICAgaWYgKCFwYXJzZV9wYXJ0aXRpb25fdGFibGUoJmRbZGlza19udW1iZXJdLCAmY29tcHV0ZV9wYXJ0aXRpb25faW5mb3JtYXRpb24pKSB7CisJZ2V0X2Vycm9yKCJwYXJzZV9wYXJ0aXRpb25fdGFibGUiKTsKKwltZW51W25iX3N1Yl9kaXNrX21lbnVdLml0ZW1zX2NvdW50Kys7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIENvbXB1dGUgdGhlIERpc2tzIG1lbnUgKi8KK3ZvaWQgY29tcHV0ZV9kaXNrcyhzdHJ1Y3Qgc19oZHRfbWVudSAqbWVudSwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGNoYXIgYnVmZmVyW01FTlVMRU4gKyAxXTsKKyAgICBpbnQgbmJfc3ViX2Rpc2tfbWVudSA9IDA7CisKKyAgICAvKiBObyBuZWVkIHRvIGNvbXB1dGUgdGhhdCBtZW51IGlmIG5vIGRpc2tzIHdlcmUgZGV0ZWN0ZWQgKi8KKyAgICBtZW51LT5kaXNrX21lbnUuaXRlbXNfY291bnQgPSAwOworICAgIGlmIChoYXJkd2FyZS0+ZGlza3NfY291bnQgPT0gMCkKKwlyZXR1cm47CisKKyAgICBmb3IgKGludCBkcml2ZSA9IDB4ODA7IGRyaXZlIDwgMHhmZjsgZHJpdmUrKykgeworCWlmICghaGFyZHdhcmUtPmRpc2tfaW5mb1tkcml2ZSAtIDB4ODBdLmNiaW9zKQorCSAgICBjb250aW51ZTsJCS8qIEludmFsaWQgZ2VvbWV0cnkgKi8KKwljb21wdXRlX2Rpc2tfbW9kdWxlCisJICAgICgoc3RydWN0IHNfbXlfbWVudSAqKSYobWVudS0+ZGlza19zdWJfbWVudSksIG5iX3N1Yl9kaXNrX21lbnUsCisJICAgICBoYXJkd2FyZSwgZHJpdmUgLSAweDgwKTsKKwluYl9zdWJfZGlza19tZW51Kys7CisgICAgfQorCisgICAgbWVudS0+ZGlza19tZW51Lm1lbnUgPSBhZGRfbWVudSgiIERpc2tzICIsIC0xKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmJfc3ViX2Rpc2tfbWVudTsgaSsrKSB7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiIERpc2sgPCVkPiAiLCBpICsgMSk7CisJYWRkX2l0ZW0oYnVmZmVyLCAiRGlzayIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCQkgbWVudS0+ZGlza19zdWJfbWVudVtpXS5tZW51KTsKKwltZW51LT5kaXNrX21lbnUuaXRlbXNfY291bnQrKzsKKyAgICB9CisgICAgcHJpbnRmKCJNRU5VOiBEaXNrcyBtZW51IGRvbmUgKCVkIGl0ZW1zKVxuIiwgbWVudS0+ZGlza19tZW51Lml0ZW1zX2NvdW50KTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtbWVudS1kbWkuYyBiL2NvbTMyL2hkdC9oZHQtbWVudS1kbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQxM2ExCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1tZW51LWRtaS5jCkBAIC0wLDAgKzEsMzgxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJoZHQtbWVudS5oIgorCisvKiBDb21wdXRlIFN5c3RlbSBtYWluIG1lbnUgKi8KK3ZvaWQgY29tcHV0ZV9zeXN0ZW0oc3RydWN0IHNfbXlfbWVudSAqbWVudSwgc19kbWkgKiBkbWkpCit7CisgICAgY2hhciBidWZmZXJbU1VCTUVOVUxFTiArIDFdOworICAgIGNoYXIgc3RhdGJ1ZmZlcltTVEFUTEVOICsgMV07CisKKyAgICBtZW51LT5tZW51ID0gYWRkX21lbnUoIiBTeXN0ZW0gIiwgLTEpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBzZXRfbWVudV9wb3MoU1VCTUVOVV9ZLCBTVUJNRU5VX1gpOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVmVuZG9yICAgIDogJXMiLCBkbWktPnN5c3RlbS5tYW51ZmFjdHVyZXIpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVmVuZG9yOiAlcyIsCisJICAgICBkbWktPnN5c3RlbS5tYW51ZmFjdHVyZXIpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiUHJvZHVjdCAgIDogJXMiLCBkbWktPnN5c3RlbS5wcm9kdWN0X25hbWUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiUHJvZHVjdCBOYW1lOiAlcyIsCisJICAgICBkbWktPnN5c3RlbS5wcm9kdWN0X25hbWUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVmVyc2lvbiAgIDogJXMiLCBkbWktPnN5c3RlbS52ZXJzaW9uKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlZlcnNpb246ICVzIiwgZG1pLT5zeXN0ZW0udmVyc2lvbik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJTZXJpYWwgICAgOiAlcyIsIGRtaS0+c3lzdGVtLnNlcmlhbCk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJTZXJpYWwgTnVtYmVyOiAlcyIsCisJICAgICBkbWktPnN5c3RlbS5zZXJpYWwpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVVVJRCAgICAgIDogJXMiLCBkbWktPnN5c3RlbS51dWlkKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlVVSUQ6ICVzIiwgZG1pLT5zeXN0ZW0udXVpZCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJXYWtldXAgICAgOiAlcyIsIGRtaS0+c3lzdGVtLndha2V1cF90eXBlKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIldha2V1cCBUeXBlOiAlcyIsCisJICAgICBkbWktPnN5c3RlbS53YWtldXBfdHlwZSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJTS1UgTnVtYmVyOiAlcyIsIGRtaS0+c3lzdGVtLnNrdV9udW1iZXIpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiU0tVIE51bWJlcjogJXMiLAorCSAgICAgZG1pLT5zeXN0ZW0uc2t1X251bWJlcik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJGYW1pbHkgICAgOiAlcyIsIGRtaS0+c3lzdGVtLmZhbWlseSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJGYW1pbHk6ICVzIiwgZG1pLT5zeXN0ZW0uZmFtaWx5KTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHByaW50ZigiTUVOVTogU3lzdGVtIG1lbnUgZG9uZSAoJWQgaXRlbXMpXG4iLCBtZW51LT5pdGVtc19jb3VudCk7Cit9CisKKy8qIENvbXB1dGUgQ2hhc3NpcyBtZW51ICovCit2b2lkIGNvbXB1dGVfY2hhc3NpcyhzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzX2RtaSAqIGRtaSkKK3sKKyAgICBjaGFyIGJ1ZmZlcltTVUJNRU5VTEVOICsgMV07CisgICAgY2hhciBzdGF0YnVmZmVyW1NUQVRMRU4gKyAxXTsKKyAgICBtZW51LT5tZW51ID0gYWRkX21lbnUoIiBDaGFzc2lzICIsIC0xKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCA9IDA7CisgICAgc2V0X21lbnVfcG9zKFNVQk1FTlVfWSwgU1VCTUVOVV9YKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlZlbmRvciAgICA6ICVzIiwKKwkgICAgIGRtaS0+Y2hhc3Npcy5tYW51ZmFjdHVyZXIpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVmVuZG9yOiAlcyIsCisJICAgICBkbWktPmNoYXNzaXMubWFudWZhY3R1cmVyKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlR5cGUgICAgICA6ICVzIiwgZG1pLT5jaGFzc2lzLnR5cGUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVHlwZTogJXMiLCBkbWktPmNoYXNzaXMudHlwZSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJWZXJzaW9uICAgOiAlcyIsIGRtaS0+Y2hhc3Npcy52ZXJzaW9uKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlZlcnNpb246ICVzIiwKKwkgICAgIGRtaS0+Y2hhc3Npcy52ZXJzaW9uKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlNlcmlhbCAgICA6ICVzIiwgZG1pLT5jaGFzc2lzLnNlcmlhbCk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJTZXJpYWwgTnVtYmVyOiAlcyIsCisJICAgICBkbWktPmNoYXNzaXMuc2VyaWFsKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkFzc2V0IFRhZyA6ICVzIiwKKwkgICAgIGRlbF9tdWx0aV9zcGFjZXMoZG1pLT5jaGFzc2lzLmFzc2V0X3RhZykpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiQXNzZXQgVGFnOiAlcyIsCisJICAgICBkZWxfbXVsdGlfc3BhY2VzKGRtaS0+Y2hhc3Npcy5hc3NldF90YWcpKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkxvY2sgICAgICA6ICVzIiwgZG1pLT5jaGFzc2lzLmxvY2spOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTG9jazogJXMiLCBkbWktPmNoYXNzaXMubG9jayk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBwcmludGYoIk1FTlU6IENoYXNzaXMgbWVudSBkb25lICglZCBpdGVtcylcbiIsIG1lbnUtPml0ZW1zX2NvdW50KTsKK30KKworLyogQ29tcHV0ZSBCSU9TIG1lbnUgKi8KK3ZvaWQgY29tcHV0ZV9iaW9zKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHNfZG1pICogZG1pKQoreworICAgIGNoYXIgYnVmZmVyW1NVQk1FTlVMRU4gKyAxXTsKKyAgICBjaGFyIHN0YXRidWZmZXJbU1RBVExFTiArIDFdOworCisgICAgbWVudS0+bWVudSA9IGFkZF9tZW51KCIgQklPUyAiLCAtMSk7CisgICAgbWVudS0+aXRlbXNfY291bnQgPSAwOworICAgIHNldF9tZW51X3BvcyhTVUJNRU5VX1ksIFNVQk1FTlVfWCk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJWZW5kb3IgICAgOiAlcyIsIGRtaS0+Ymlvcy52ZW5kb3IpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVmVuZG9yOiAlcyIsIGRtaS0+Ymlvcy52ZW5kb3IpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVmVyc2lvbiAgIDogJXMiLCBkbWktPmJpb3MudmVyc2lvbik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJWZXJzaW9uOiAlcyIsIGRtaS0+Ymlvcy52ZXJzaW9uKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlJlbGVhc2UgICA6ICVzIiwgZG1pLT5iaW9zLnJlbGVhc2VfZGF0ZSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJSZWxlYXNlIERhdGU6ICVzIiwKKwkgICAgIGRtaS0+Ymlvcy5yZWxlYXNlX2RhdGUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiQmlvcyBSZXYuIDogJXMiLCBkbWktPmJpb3MuYmlvc19yZXZpc2lvbik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJCaW9zIFJldmlzaW9uOiAlcyIsCisJICAgICBkbWktPmJpb3MuYmlvc19yZXZpc2lvbik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJGdy4gIFJldi4gOiAlcyIsCisJICAgICBkbWktPmJpb3MuZmlybXdhcmVfcmV2aXNpb24pOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiRmlybXdhcmUgUmV2aXNpb24gOiAlcyIsCisJICAgICBkbWktPmJpb3MuZmlybXdhcmVfcmV2aXNpb24pOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKworICAgIHByaW50ZigiTUVOVTogQklPUyBtZW51IGRvbmUgKCVkIGl0ZW1zKVxuIiwgbWVudS0+aXRlbXNfY291bnQpOworfQorCisvKiBDb21wdXRlIE1vdGhlcmJvYXJkIG1haW4gbWVudSAqLwordm9pZCBjb21wdXRlX21vdGhlcmJvYXJkKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHNfZG1pICogZG1pKQoreworICAgIGNoYXIgYnVmZmVyW1NVQk1FTlVMRU4gKyAxXTsKKyAgICBjaGFyIHN0YXRidWZmZXJbU1RBVExFTiArIDFdOworCisgICAgbWVudS0+bWVudSA9IGFkZF9tZW51KCIgTW90aGVyYm9hcmQgIiwgLTEpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBzZXRfbWVudV9wb3MoU1VCTUVOVV9ZLCBTVUJNRU5VX1gpOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVmVuZG9yICAgIDogJXMiLAorCSAgICAgZG1pLT5iYXNlX2JvYXJkLm1hbnVmYWN0dXJlcik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJWZW5kb3I6ICVzIiwKKwkgICAgIGRtaS0+YmFzZV9ib2FyZC5tYW51ZmFjdHVyZXIpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiUHJvZHVjdCAgIDogJXMiLAorCSAgICAgZG1pLT5iYXNlX2JvYXJkLnByb2R1Y3RfbmFtZSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJQcm9kdWN0IE5hbWU6ICVzIiwKKwkgICAgIGRtaS0+YmFzZV9ib2FyZC5wcm9kdWN0X25hbWUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVmVyc2lvbiAgIDogJXMiLCBkbWktPmJhc2VfYm9hcmQudmVyc2lvbik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJWZXJzaW9uOiAlcyIsCisJICAgICBkbWktPmJhc2VfYm9hcmQudmVyc2lvbik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJTZXJpYWwgICAgOiAlcyIsIGRtaS0+YmFzZV9ib2FyZC5zZXJpYWwpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiU2VyaWFsIE51bWJlcjogJXMiLAorCSAgICAgZG1pLT5iYXNlX2JvYXJkLnNlcmlhbCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJBc3NldCBUYWcgOiAlcyIsCisJICAgICBkbWktPmJhc2VfYm9hcmQuYXNzZXRfdGFnKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkFzc2V0IFRhZzogJXMiLAorCSAgICAgZG1pLT5iYXNlX2JvYXJkLmFzc2V0X3RhZyk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJMb2NhdGlvbiAgOiAlcyIsIGRtaS0+YmFzZV9ib2FyZC5sb2NhdGlvbik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJMb2NhdGlvbjogJXMiLAorCSAgICAgZG1pLT5iYXNlX2JvYXJkLmxvY2F0aW9uKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlR5cGUgICAgICA6ICVzIiwgZG1pLT5iYXNlX2JvYXJkLnR5cGUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVHlwZTogJXMiLCBkbWktPmJhc2VfYm9hcmQudHlwZSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBwcmludGYoIk1FTlU6IE1vdGhlcmJvYXJkIG1lbnUgZG9uZSAoJWQgaXRlbXMpXG4iLCBtZW51LT5pdGVtc19jb3VudCk7Cit9CisKKy8qIENvbXB1dGUgTWFpbiBJUE1JIG1lbnUgKi8KK3ZvaWQgY29tcHV0ZV9pcG1pKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHNfZG1pICogZG1pKQoreworICAgIGNoYXIgYnVmZmVyW1NVQk1FTlVMRU4gKyAxXTsKKyAgICBjaGFyIHN0YXRidWZmZXJbU1RBVExFTiArIDFdOworICAgIG1lbnUtPm1lbnUgPSBhZGRfbWVudSgiIElQTUkgIiwgLTEpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBzZXRfbWVudV9wb3MoU1VCTUVOVV9ZLCBTVUJNRU5VX1gpOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiSW50ZXJmYWNlIFR5cGUgIDogJXMiLAorCSAgICAgZG1pLT5pcG1pLmludGVyZmFjZV90eXBlKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkludGVyZmFjZSBUeXBlOiAlcyIsCisJICAgICBkbWktPmlwbWkuaW50ZXJmYWNlX3R5cGUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiU3BlYy4gVmVyc2lvbiAgIDogJXUuJXUiLAorCSAgICAgZG1pLT5pcG1pLm1ham9yX3NwZWNpZmljYXRpb25fdmVyc2lvbiwKKwkgICAgIGRtaS0+aXBtaS5taW5vcl9zcGVjaWZpY2F0aW9uX3ZlcnNpb24pOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiU3BlY2lmaWNhdGlvbiBWZXJzaW9uOiAldS4ldSIsCisJICAgICBkbWktPmlwbWkubWFqb3Jfc3BlY2lmaWNhdGlvbl92ZXJzaW9uLAorCSAgICAgZG1pLT5pcG1pLm1pbm9yX3NwZWNpZmljYXRpb25fdmVyc2lvbik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJJMkMgU2xhdmUgQCAgICAgOiAweCUwMngiLAorCSAgICAgZG1pLT5pcG1pLkkyQ19zbGF2ZV9hZGRyZXNzKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkkyQyBTbGF2ZSBBZGRyZXNzOiAweCUwMngiLAorCSAgICAgZG1pLT5pcG1pLkkyQ19zbGF2ZV9hZGRyZXNzKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIk5WIFN0b3JhZ2UgQCAgICA6ICV1IiwKKwkgICAgIGRtaS0+aXBtaS5udl9hZGRyZXNzKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIk5WIFN0b3JhZ2UgQWRkcmVzczogJXUiLAorCSAgICAgZG1pLT5pcG1pLm52X2FkZHJlc3MpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgdWludDMyX3QgaGlnaCA9IGRtaS0+aXBtaS5iYXNlX2FkZHJlc3MgPj4gMzI7CisgICAgdWludDMyX3QgbG93ID0gZG1pLT5pcG1pLmJhc2VfYWRkcmVzcyAmIDB4RkZGRjsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkJhc2UgQWRkcmVzcyAgICA6ICUwOFglMDhYIiwKKwkgICAgIGhpZ2gsIChsb3cgJiB+MSkpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiQmFzZSBBZGRyZXNzIDogJTA4WCUwOFgiLAorCSAgICAgaGlnaCwgKGxvdyAmIH4xKSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJJUlEgICAgICAgICAgICAgOiAlZCIsIGRtaS0+aXBtaS5pcnEpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiSVJRIDogJWQiLCBkbWktPmlwbWkuaXJxKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHByaW50ZigiTUVOVTogSVBNSSBtZW51IGRvbmUgKCVkIGl0ZW1zKVxuIiwgbWVudS0+aXRlbXNfY291bnQpOworfQorCisvKiBDb21wdXRlIE1haW4gQmF0dGVyeSBtZW51ICovCit2b2lkIGNvbXB1dGVfYmF0dGVyeShzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzX2RtaSAqIGRtaSkKK3sKKyAgICBjaGFyIGJ1ZmZlcltTVUJNRU5VTEVOICsgMV07CisgICAgY2hhciBzdGF0YnVmZmVyW1NUQVRMRU4gKyAxXTsKKyAgICBtZW51LT5tZW51ID0gYWRkX21lbnUoIiBCYXR0ZXJ5ICIsIC0xKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCA9IDA7CisgICAgc2V0X21lbnVfcG9zKFNVQk1FTlVfWSwgU1VCTUVOVV9YKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlZlbmRvciAgICAgICAgICA6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5tYW51ZmFjdHVyZXIpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVmVuZG9yOiAlcyIsCisJICAgICBkbWktPmJhdHRlcnkubWFudWZhY3R1cmVyKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIk1hbnVmYWN0dXJlIERhdGU6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5tYW51ZmFjdHVyZV9kYXRlKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIk1hbnVmYWN0dXJlIERhdGU6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5tYW51ZmFjdHVyZV9kYXRlKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlNlcmlhbCAgICAgICAgICA6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5zZXJpYWwpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiU2VyaWFsOiAlcyIsIGRtaS0+YmF0dGVyeS5zZXJpYWwpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTmFtZSAgICAgICAgICAgIDogJXMiLCBkbWktPmJhdHRlcnkubmFtZSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJOYW1lOiAlcyIsIGRtaS0+YmF0dGVyeS5uYW1lKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkNoZW1pc3RyeSAgICAgICA6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5jaGVtaXN0cnkpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiQ2hlbWlzdHJ5OiAlcyIsCisJICAgICBkbWktPmJhdHRlcnkuY2hlbWlzdHJ5KTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkRlc2lnbiBDYXBhY2l0eSA6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5kZXNpZ25fY2FwYWNpdHkpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiRGVzaWduIENhcGFjaXR5OiAlcyIsCisJICAgICBkbWktPmJhdHRlcnkuZGVzaWduX2NhcGFjaXR5KTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkRlc2lnbiBWb2x0YWdlICA6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5kZXNpZ25fdm9sdGFnZSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJEZXNpZ24gVm9sdGFnZSA6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5kZXNpZ25fdm9sdGFnZSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJTQkRTICAgICAgICAgICAgOiAlcyIsIGRtaS0+YmF0dGVyeS5zYmRzKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlNCRFM6ICVzIiwgZG1pLT5iYXR0ZXJ5LnNiZHMpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiU0JEUyBNYW51Zi4gRGF0ZTogJXMiLAorCSAgICAgZG1pLT5iYXR0ZXJ5LnNiZHNfbWFudWZhY3R1cmVfZGF0ZSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJTQkRTIE1hbnVmYWN0dXJlIERhdGU6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5zYmRzX21hbnVmYWN0dXJlX2RhdGUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiU0JEUyBDaGVtaXN0cnkgIDogJXMiLAorCSAgICAgZG1pLT5iYXR0ZXJ5LnNiZHNfY2hlbWlzdHJ5KTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlNCRFMgQ2hlbWlzdHJ5IDogJXMiLAorCSAgICAgZG1pLT5iYXR0ZXJ5LnNiZHNfY2hlbWlzdHJ5KTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIk1heGltdW0gRXJyb3IgICA6ICVzIiwKKwkgICAgIGRtaS0+YmF0dGVyeS5tYXhpbXVtX2Vycm9yKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIk1heGltdW0gRXJyb3IgKHBlcmNlbnQpIDogJXMiLAorCSAgICAgZG1pLT5iYXR0ZXJ5Lm1heGltdW1fZXJyb3IpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiT0VNIEluZm8gICAgICAgIDogJXMiLAorCSAgICAgZG1pLT5iYXR0ZXJ5Lm9lbV9pbmZvKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIk9FTSBJbmZvOiAlcyIsCisJICAgICBkbWktPmJhdHRlcnkub2VtX2luZm8pOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgcHJpbnRmKCJNRU5VOiBCYXR0ZXJ5IG1lbnUgZG9uZSAoJWQgaXRlbXMpXG4iLCBtZW51LT5pdGVtc19jb3VudCk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LW1lbnUta2VybmVsLmMgYi9jb20zMi9oZHQvaGR0LW1lbnUta2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlNTIwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtbWVudS1rZXJuZWwuYwpAQCAtMCwwICsxLDg3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJoZHQtbWVudS5oIgorCisvKiBNYWluIEtlcm5lbCBtZW51ICovCit2b2lkIGNvbXB1dGVfa2VybmVsKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBjaGFyIGJ1ZmZlcltTVUJNRU5VTEVOICsgMV07CisgICAgY2hhciBpbmZvYmFyW1NUQVRMRU4gKyAxXTsKKyAgICBjaGFyIGtlcm5lbF9tb2R1bGVzW0xJTlVYX0tFUk5FTF9NT0RVTEVfU0laRSAqCisJCQlNQVhfS0VSTkVMX01PRFVMRVNfUEVSX1BDSV9ERVZJQ0VdOworICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2aWNlOworCisgICAgbWVudS0+bWVudSA9IGFkZF9tZW51KCIgS2VybmVsIE1vZHVsZXMgIiwgLTEpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBzZXRfbWVudV9wb3MoU1VCTUVOVV9ZLCBTVUJNRU5VX1gpOworCisgICAgaWYgKChoYXJkd2FyZS0+bW9kdWxlc19wY2ltYXBfcmV0dXJuX2NvZGUgPT0gLUVOT01PRFVMRVNQQ0lNQVApICYmCisJKGhhcmR3YXJlLT5tb2R1bGVzX2FsaWFzX3JldHVybl9jb2RlID09IC1FTk9NT0RVTEVTQUxJQVMpKSB7CisJYWRkX2l0ZW0oIlRoZSBtb2R1bGVzLntwY2ltYXB8YWxpYXN9IGZpbGUgaXMgbWlzc2luZyIsCisJCSAiTWlzc2luZyBtb2R1bGVzLntwY2ltYXB8YWxpYXN9IGZpbGUiLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCWFkZF9pdGVtKCJLZXJuZWwgbW9kdWxlcyBjYW4ndCBiZSBjb21wdXRlZC4iLAorCQkgIk1pc3NpbmcgbW9kdWxlcy57cGNpbWFwfGFsaWFzfSBmaWxlIiwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwlhZGRfaXRlbSgiUGxlYXNlIHB1dCBvbmUgb2YgdGhlbSBpbiBzYW1lIGRpciBhcyBoZHQiLAorCQkgIk1pc3NpbmcgbW9kdWxlcy57cGNpbWFwfGFsaWFzfSBmaWxlIiwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwlhZGRfaXRlbSgiIiwgIiIsIE9QVF9TRVAsICIiLCAwKTsKKyAgICB9IGVsc2UgeworCS8qCisJICogRm9yIGV2ZXJ5IGRldGVjdGVkIHBjaSBkZXZpY2UsIGdyYWIgaXRzIGtlcm5lbCBtb2R1bGUgdG8KKwkgKiBjb21wdXRlIHRoaXMgc3VibWVudQorCSAqLworCWZvcl9lYWNoX3BjaV9mdW5jKHBjaV9kZXZpY2UsIGhhcmR3YXJlLT5wY2lfZG9tYWluKSB7CisJICAgIG1lbXNldChrZXJuZWxfbW9kdWxlcywgMCwgc2l6ZW9mIGtlcm5lbF9tb2R1bGVzKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7CisJCSBpIDwgcGNpX2RldmljZS0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVfY291bnQ7IGkrKykgeworCQlpZiAoaSA+IDApIHsKKwkJICAgIHN0cm5jYXQoa2VybmVsX21vZHVsZXMsICIgfCAiLCAzKTsKKwkJfQorCQlzdHJuY2F0KGtlcm5lbF9tb2R1bGVzLAorCQkJcGNpX2RldmljZS0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVbaV0sCisJCQlMSU5VWF9LRVJORUxfTU9EVUxFX1NJWkUgLSAxKTsKKwkgICAgfQorCSAgICAvKiBObyBuZWVkIHRvIGFkZCB1bmtub3duIGtlcm5lbCBtb2R1bGVzICovCisJICAgIGlmIChzdHJsZW4oa2VybmVsX21vZHVsZXMpID4gMCkgeworCQlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICIlcyAoJXMpIiwKKwkJCSBrZXJuZWxfbW9kdWxlcywgcGNpX2RldmljZS0+ZGV2X2luZm8tPmNsYXNzX25hbWUpOworCQlzbnByaW50ZihpbmZvYmFyLCBzaXplb2YgaW5mb2JhciwKKwkJCSAiJTA0eDolMDR4ICVzIDogJXMiLAorCQkJIHBjaV9kZXZpY2UtPnZlbmRvciwKKwkJCSBwY2lfZGV2aWNlLT5wcm9kdWN0LAorCQkJIHBjaV9kZXZpY2UtPmRldl9pbmZvLT52ZW5kb3JfbmFtZSwKKwkJCSBwY2lfZGV2aWNlLT5kZXZfaW5mby0+cHJvZHVjdF9uYW1lKTsKKworCQlhZGRfaXRlbShidWZmZXIsIGluZm9iYXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJCW1lbnUtPml0ZW1zX2NvdW50Kys7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHJpbnRmKCJNRU5VOiBLZXJuZWwgbWVudSBkb25lICglZCBpdGVtcylcbiIsIG1lbnUtPml0ZW1zX2NvdW50KTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtbWVudS1tZW1vcnkuYyBiL2NvbTMyL2hkdC9oZHQtbWVudS1tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ3NDFkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1tZW51LW1lbW9yeS5jCkBAIC0wLDAgKzEsMzgyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlICJoZHQtbWVudS5oIgorI2RlZmluZSBFODIwTUFYIDEyOAorCisvKiBDb21wdXRlIHRoZSBlODIwIHN1Ym1lbnUgKi8KK3N0YXRpYyB2b2lkIGNvbXB1dGVfZTgyMChzdHJ1Y3Qgc19teV9tZW51ICptZW51KQoreworICAgIGNoYXIgYnVmZmVyW01FTlVMRU4gKyAxXTsKKyAgICBjaGFyIHN0YXRidWZmZXJbU1RBVExFTiArIDFdOworCisgICAgc3ByaW50ZihidWZmZXIsICIgZTgyMCBpbmZvcm1hdGlvbiAiKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCA9IDA7CisgICAgbWVudS0+bWVudSA9IGFkZF9tZW51KGJ1ZmZlciwgLTEpOworCisgICAgc3RydWN0IGU4MjBlbnRyeSBtYXBbRTgyME1BWF07CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBjaGFyIHR5cGVbMTRdOworCisgICAgZGV0ZWN0X21lbW9yeV9lODIwKG1hcCwgRTgyME1BWCwgJmNvdW50KTsKKyAgICB1bnNpZ25lZCBsb25nIG1lbW9yeV9zaXplID0gbWVtc2l6ZV9lODIwKG1hcCwgY291bnQpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkRldGVjdGVkIE1lbW9yeSAgLSAlbHUgTWlCICglbHUgS2lCKSIsCisJICAgICBtZW1vcnlfc2l6ZSA+PiAxMCwgbWVtb3J5X3NpemUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLAorCSAgICAgIkRldGVjdGVkIE1lbW9yeSA6ICVsdSBNaUIgKCVsdSBLaUIpIiwgbWVtb3J5X3NpemUgPj4gMTAsCisJICAgICBtZW1vcnlfc2l6ZSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIGFkZF9pdGVtKCIiLCAiIiwgT1BUX1NFUCwgIiIsIDApOworCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJZ2V0X3R5cGUobWFwW2pdLnR5cGUsIHR5cGUsIDE0KTsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsCisJCSAiJTAxNmxseCAtICUwMTZsbHggKCVzKSIsCisJCSBtYXBbal0uYWRkciwgbWFwW2pdLnNpemUsIHJlbW92ZV9zcGFjZXModHlwZSkpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLAorCQkgIiUwMTZsbHggLSAlMDE2bGx4ICglcykiLAorCQkgbWFwW2pdLmFkZHIsIG1hcFtqXS5zaXplLCByZW1vdmVfc3BhY2VzKHR5cGUpKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKyAgICB9Cit9CisKKy8qIENvbXB1dGUgdGhlIGU4MDEgc3VibWVudSAqLworc3RhdGljIHZvaWQgY29tcHV0ZV9lODAxKHN0cnVjdCBzX215X21lbnUgKm1lbnUpCit7CisgICAgY2hhciBidWZmZXJbTUVOVUxFTiArIDFdOworICAgIGNoYXIgc3RhdGJ1ZmZlcltTVEFUTEVOICsgMV07CisKKyAgICBzcHJpbnRmKGJ1ZmZlciwgIiBlODAxIGluZm9ybWF0aW9uICIpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBtZW51LT5tZW51ID0gYWRkX21lbnUoYnVmZmVyLCAtMSk7CisKKyAgICBpbnQgbWVtX2xvdywgbWVtX2hpZ2ggPSAwOworICAgIGlmIChkZXRlY3RfbWVtb3J5X2U4MDEoJm1lbV9sb3csICZtZW1faGlnaCkpIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICIlcyIsICJlODAxIG91dHB1dCBpcyBib2d1cyIpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiJXMiLCAiZTgwMSBvdXRwdXQgaXMgYm9ndXMiKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKyAgICB9IGVsc2UgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkRldGVjdGVkIE1lbW9yeSAgOiAlZCBNaUIgKCVkIEtpQikiLAorCQkgKG1lbV9oaWdoID4+IDQpICsgKG1lbV9sb3cgPj4gMTApLCBtZW1fbG93ICsgKG1lbV9oaWdoIDw8IDYpKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwKKwkJICJEZXRlY3RlZCBNZW1vcnkgOiAlZCBNaUIgKCVkIEtpQikiLAorCQkgKG1lbV9oaWdoID4+IDQpICsgKG1lbV9sb3cgPj4gMTApLCBtZW1fbG93ICsgKG1lbV9oaWdoIDw8IDYpKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisKKwlhZGRfaXRlbSgiIiwgIiIsIE9QVF9TRVAsICIiLCAwKTsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJMb3cgTWVtb3J5ICAgICAgIDogJWQgS2lCICglZCBNaUIpIiwKKwkJIG1lbV9sb3csIG1lbV9sb3cgPj4gMTApOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTG93IE1lbW9yeSA6ICVkIEtpQiAoJWQgTWlCKSIsCisJCSBtZW1fbG93LCBtZW1fbG93ID4+IDEwKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJIaWdoIE1lbW9yeSAgICAgIDogJWQgS2lCICglZCBNaUIpIiwKKwkJIG1lbV9oaWdoIDw8IDYsIG1lbV9oaWdoID4+IDQpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiSGlnaCBNZW1vcnkgOiAlZCBLaUIgKCVkIE1pQikiLAorCQkgbWVtX2hpZ2ggPDwgNiwgbWVtX2hpZ2ggPj4gNCk7CisJYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCisgICAgfQorICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7Cit9CisKKy8qIENvbXB1dGUgdGhlIDg4IHN1Ym1lbnUgKi8KK3N0YXRpYyB2b2lkIGNvbXB1dGVfODgoc3RydWN0IHNfbXlfbWVudSAqbWVudSkKK3sKKyAgICBjaGFyIGJ1ZmZlcltNRU5VTEVOICsgMV07CisgICAgY2hhciBzdGF0YnVmZmVyW1NUQVRMRU4gKyAxXTsKKworICAgIHNwcmludGYoYnVmZmVyLCAiIDg4IGluZm9ybWF0aW9uICIpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBtZW51LT5tZW51ID0gYWRkX21lbnUoYnVmZmVyLCAtMSk7CisKKyAgICBpbnQgbWVtX3NpemUgPSAwOworICAgIGlmIChkZXRlY3RfbWVtb3J5Xzg4KCZtZW1fc2l6ZSkpIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICIlcyIsICI4OCBvdXRwdXQgaXMgYm9ndXMiKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIiVzIiwgIjg4IG91dHB1dCBpcyBib2d1cyIpOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworICAgIH0gZWxzZSB7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiRGV0ZWN0ZWQgTWVtb3J5IDogJWQgTWlCICglZCBLaUIpIiwKKwkJIG1lbV9zaXplID4+IDEwLCBtZW1fc2l6ZSk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsCisJCSAiRGV0ZWN0ZWQgTWVtb3J5IDogJWQgTWlCICglZCBLaUIpIiwgbWVtX3NpemUgPj4gMTAsIG1lbV9zaXplKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgfQorICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7Cit9CisKKy8qIENvbXB1dGUgdGhlIE1lbW9yeSBzdWJtZW51ICovCitzdGF0aWMgdm9pZCBjb21wdXRlX21lbW9yeV9tb2R1bGUoc3RydWN0IHNfbXlfbWVudSAqbWVudSwgc19kbWkgKiBkbWksCisJCQkJICBpbnQgc2xvdF9udW1iZXIpCit7CisgICAgaW50IGkgPSBzbG90X251bWJlcjsKKyAgICBjaGFyIGJ1ZmZlcltNRU5VTEVOICsgMV07CisgICAgY2hhciBzdGF0YnVmZmVyW1NUQVRMRU4gKyAxXTsKKworICAgIHNwcmludGYoYnVmZmVyLCAiIEJhbmsgPCVkPiAiLCBpKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCA9IDA7CisgICAgbWVudS0+bWVudSA9IGFkZF9tZW51KGJ1ZmZlciwgLTEpOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiRm9ybSBGYWN0b3IgIDogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlbaV0uZm9ybV9mYWN0b3IpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiRm9ybSBGYWN0b3I6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5W2ldLmZvcm1fZmFjdG9yKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlR5cGUgICAgICAgICA6ICVzIiwgZG1pLT5tZW1vcnlbaV0udHlwZSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJUeXBlOiAlcyIsIGRtaS0+bWVtb3J5W2ldLnR5cGUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVHlwZSBEZXRhaWxzIDogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlbaV0udHlwZV9kZXRhaWwpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVHlwZSBEZXRhaWxzOiAlcyIsCisJICAgICBkbWktPm1lbW9yeVtpXS50eXBlX2RldGFpbCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJTcGVlZCAgICAgICAgOiAlcyIsIGRtaS0+bWVtb3J5W2ldLnNwZWVkKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlNwZWVkIChNaHopOiAlcyIsCisJICAgICBkbWktPm1lbW9yeVtpXS5zcGVlZCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJTaXplICAgICAgICAgOiAlcyIsIGRtaS0+bWVtb3J5W2ldLnNpemUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiU2l6ZTogJXMiLCBkbWktPm1lbW9yeVtpXS5zaXplKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkRldmljZSBTZXQgICA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5W2ldLmRldmljZV9zZXQpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiRGV2aWNlIFNldDogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlbaV0uZGV2aWNlX3NldCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJEZXZpY2UgTG9jLiAgOiAlcyIsCisJICAgICBkbWktPm1lbW9yeVtpXS5kZXZpY2VfbG9jYXRvcik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJEZXZpY2UgTG9jYXRpb246ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5W2ldLmRldmljZV9sb2NhdG9yKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkJhbmsgTG9jYXRvciA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5W2ldLmJhbmtfbG9jYXRvcik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJCYW5rIExvY2F0b3I6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5W2ldLmJhbmtfbG9jYXRvcik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJUb3RhbCBXaWR0aCAgOiAlcyIsCisJICAgICBkbWktPm1lbW9yeVtpXS50b3RhbF93aWR0aCk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJUb3RhbCBiaXQgV2lkdGg6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5W2ldLnRvdGFsX3dpZHRoKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkRhdGEgV2lkdGggICA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5W2ldLmRhdGFfd2lkdGgpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiRGF0YSBiaXQgV2lkdGg6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5W2ldLmRhdGFfd2lkdGgpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiRXJyb3IgICAgICAgIDogJXMiLCBkbWktPm1lbW9yeVtpXS5lcnJvcik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJFcnJvcjogJXMiLCBkbWktPm1lbW9yeVtpXS5lcnJvcik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJWZW5kb3IgICAgICAgOiAlcyIsCisJICAgICBkbWktPm1lbW9yeVtpXS5tYW51ZmFjdHVyZXIpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVmVuZG9yOiAlcyIsCisJICAgICBkbWktPm1lbW9yeVtpXS5tYW51ZmFjdHVyZXIpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiU2VyaWFsICAgICAgIDogJXMiLCBkbWktPm1lbW9yeVtpXS5zZXJpYWwpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiU2VyaWFsOiAlcyIsCisJICAgICBkbWktPm1lbW9yeVtpXS5zZXJpYWwpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiQXNzZXQgVGFnICAgIDogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlbaV0uYXNzZXRfdGFnKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkFzc2V0IFRhZzogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlbaV0uYXNzZXRfdGFnKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlBhcnQgTnVtYmVyICA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5W2ldLnBhcnRfbnVtYmVyKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlBhcnQgTnVtYmVyOiAlcyIsCisJICAgICBkbWktPm1lbW9yeVtpXS5wYXJ0X251bWJlcik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKK30KKworLyogQ29tcHV0ZSB0aGUgTWVtb3J5IHN1Ym1lbnUgd2hlbiB0eXBlIDYgaXMgdXNlZCovCitzdGF0aWMgdm9pZCBjb21wdXRlX21lbW9yeV9tb2R1bGVfdHlwZTYoc3RydWN0IHNfbXlfbWVudSAqbWVudSwgc19kbWkgKiBkbWksCisJCQkJCWludCBzbG90X251bWJlcikKK3sKKyAgICBpbnQgaSA9IHNsb3RfbnVtYmVyOworICAgIGNoYXIgYnVmZmVyW01FTlVMRU4gKyAxXTsKKyAgICBjaGFyIHN0YXRidWZmZXJbU1RBVExFTiArIDFdOworCisgICAgc3ByaW50ZihidWZmZXIsICIgQmFuayA8JWQ+ICIsIGkpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBtZW51LT5tZW51ID0gYWRkX21lbnUoYnVmZmVyLCAtMSk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJTb2NrZXQgRGVzaWduYXRpb24gOiAlcyIsCisJICAgICBkbWktPm1lbW9yeV9tb2R1bGVbaV0uc29ja2V0X2Rlc2lnbmF0aW9uKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlNvY2tldCBEZXNpZ25hdGlvbiA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5X21vZHVsZVtpXS5zb2NrZXRfZGVzaWduYXRpb24pOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiQmFuayBDb25uZWN0aW9ucyAgIDogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlfbW9kdWxlW2ldLmJhbmtfY29ubmVjdGlvbnMpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiQmFuayBDb25uZWN0aW9uczogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlfbW9kdWxlW2ldLmJhbmtfY29ubmVjdGlvbnMpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVHlwZSAgICAgICAgICAgICAgIDogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlfbW9kdWxlW2ldLnR5cGUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVHlwZSA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5X21vZHVsZVtpXS50eXBlKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkN1cnJlbnQgU3BlZWQgICAgICA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5X21vZHVsZVtpXS5zcGVlZCk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJDdXJyZW50IFNwZWVkIDogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlfbW9kdWxlW2ldLnNwZWVkKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkluc3RhbGxlZCBTaXplICAgICA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5X21vZHVsZVtpXS5pbnN0YWxsZWRfc2l6ZSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJJbnN0YWxsZWQgU2l6ZSA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5X21vZHVsZVtpXS5pbnN0YWxsZWRfc2l6ZSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJFbmFibGVkIFNpemUgICAgICAgOiAlcyIsCisJICAgICBkbWktPm1lbW9yeV9tb2R1bGVbaV0uZW5hYmxlZF9zaXplKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkVuYWJsZWQgU2l6ZSA6ICVzIiwKKwkgICAgIGRtaS0+bWVtb3J5X21vZHVsZVtpXS5lbmFibGVkX3NpemUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiRXJyb3IgU3RhdHVzICAgICAgIDogJXMiLAorCSAgICAgZG1pLT5tZW1vcnlfbW9kdWxlW2ldLmVycm9yX3N0YXR1cyk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJFcnJvciBTdGF0dXMgOiAlcyIsCisJICAgICBkbWktPm1lbW9yeV9tb2R1bGVbaV0uZXJyb3Jfc3RhdHVzKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworfQorCisvKiBDb21wdXRlIHRoZSBNZW1vcnkgbWVudSAqLwordm9pZCBjb21wdXRlX21lbW9yeShzdHJ1Y3Qgc19oZHRfbWVudSAqbWVudSwgc19kbWkgKiBkbWksCisJCSAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgY2hhciBidWZmZXJbTUVOVUxFTiArIDFdOworICAgIGludCBpID0gMDsKKyAgICBpbnQgbWVtb3J5X2NvdW50ID0gMDsKKworICAgIC8qIElmIG1lbW9yeSB0eXBlIDE3IGlzIGF2YWlsYWJsZSAqLworICAgIGlmIChkbWktPm1lbW9yeV9jb3VudCA+IDApIHsKKwltZW1vcnlfY291bnQgPSBkbWktPm1lbW9yeV9jb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgZG1pLT5tZW1vcnlfY291bnQ7IGkrKykgeworCSAgICBjb21wdXRlX21lbW9yeV9tb2R1bGUoJihtZW51LT5tZW1vcnlfc3ViX21lbnVbaV0pLCBkbWksIGkpOworCX0KKyAgICB9IGVsc2UgaWYgKGRtaS0+bWVtb3J5X21vZHVsZV9jb3VudCA+IDApIHsKKwltZW1vcnlfY291bnQgPSBkbWktPm1lbW9yeV9tb2R1bGVfY291bnQ7CisJLyogTWVtb3J5IFR5cGUgMTcgaXNuJ3QgYXZhaWxhYmxlLCBsZXQncyBmYWxsYmFjayBvbiB0eXBlIDYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZG1pLT5tZW1vcnlfbW9kdWxlX2NvdW50OyBpKyspIHsKKwkgICAgY29tcHV0ZV9tZW1vcnlfbW9kdWxlX3R5cGU2KCYobWVudS0+bWVtb3J5X3N1Yl9tZW51W2ldKSwgZG1pLCBpKTsKKwl9CisgICAgfQorCisgICAgY29tcHV0ZV9lODIwKCYobWVudS0+bWVtb3J5X3N1Yl9tZW51WysraV0pKTsKKyAgICBjb21wdXRlX2U4MDEoJihtZW51LT5tZW1vcnlfc3ViX21lbnVbKytpXSkpOworICAgIGNvbXB1dGVfODgoJihtZW51LT5tZW1vcnlfc3ViX21lbnVbKytpXSkpOworCisgICAgbWVudS0+bWVtb3J5X21lbnUubWVudSA9IGFkZF9tZW51KCIgTWVtb3J5ICIsIC0xKTsKKyAgICBtZW51LT5tZW1vcnlfbWVudS5pdGVtc19jb3VudCA9IDA7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiICVsdSBNQiBkZXRlY3RlZCAiLAorCSAgICAgKGhhcmR3YXJlLT5kZXRlY3RlZF9tZW1vcnlfc2l6ZSArICgxIDw8IDkpKSA+PiAxMCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCAiRGV0ZWN0ZWQgTWVtb3J5IiwgT1BUX0lOQUNUSVZFLCBOVUxMLAorCSAgICAgbWVudS0+bWVtb3J5X3N1Yl9tZW51WzBdLm1lbnUpOworICAgIG1lbnUtPm1lbW9yeV9tZW51Lml0ZW1zX2NvdW50Kys7CisKKyAgICBhZGRfaXRlbSgiIiwgIiIsIE9QVF9TRVAsICIiLCAwKTsKKworICAgIGlmIChtZW1vcnlfY291bnQgPT0gMCkgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIiBObyBtZW1vcnkgYmFuayBkZXRlY3RlZCAiKTsKKwlhZGRfaXRlbShidWZmZXIsICJNZW1vcnkgQmFuayIsIE9QVF9JTkFDVElWRSwgTlVMTCwKKwkJIG1lbnUtPm1lbW9yeV9zdWJfbWVudVsxXS5tZW51KTsKKwltZW51LT5tZW1vcnlfbWVudS5pdGVtc19jb3VudCsrOworICAgIH0gZWxzZQorCWZvciAoaSA9IDA7IGkgPCBtZW1vcnlfY291bnQ7IGkrKykgeworCSAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICIgQmFuayA8JWQ+ICIsIGkpOworCSAgICBhZGRfaXRlbShidWZmZXIsICJNZW1vcnkgQmFuayIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCQkgICAgIG1lbnUtPm1lbW9yeV9zdWJfbWVudVtpXS5tZW51KTsKKwkgICAgbWVudS0+bWVtb3J5X21lbnUuaXRlbXNfY291bnQrKzsKKwl9CisKKyAgICBhZGRfaXRlbSgiIiwgIiIsIE9QVF9TRVAsICIiLCAwKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIiBlODIwICIpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgImU4MjAgbWFwcGluZyIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCSAgICAgbWVudS0+bWVtb3J5X3N1Yl9tZW51WysraV0ubWVudSk7CisgICAgbWVudS0+bWVtb3J5X21lbnUuaXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIiBlODAxICIpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgImU4MDEgaW5mb3JtYXRpb24iLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkgICAgIG1lbnUtPm1lbW9yeV9zdWJfbWVudVsrK2ldLm1lbnUpOworICAgIG1lbnUtPm1lbW9yeV9tZW51Lml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICIgODggIik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCAiODggaW5mb3JtYXRpb24iLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkgICAgIG1lbnUtPm1lbW9yeV9zdWJfbWVudVsrK2ldLm1lbnUpOworICAgIG1lbnUtPm1lbW9yeV9tZW51Lml0ZW1zX2NvdW50Kys7CisKKyAgICBhZGRfaXRlbSgiIiwgIiIsIE9QVF9TRVAsICIiLCAwKTsKKyAgICBwcmludGYoIk1FTlU6IE1lbW9yeSBtZW51IGRvbmUgKCVkIGl0ZW1zKVxuIiwKKwkgICBtZW51LT5tZW1vcnlfbWVudS5pdGVtc19jb3VudCk7CisgICAgYWRkX2l0ZW0oIlJ1biBUZXN0IiwgIlJ1biBUZXN0IiwgT1BUX1JVTiwgaGFyZHdhcmUtPm1lbXRlc3RfbGFiZWwsIDApOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1tZW51LXBjaS5jIGIvY29tMzIvaGR0L2hkdC1tZW51LXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNGI3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LW1lbnUtcGNpLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImhkdC1tZW51LmgiCisKKy8qIER5bmFtaWMgc3VibWVudSBmb3IgcGNpIGRldmljZXMgKi8KK3N0YXRpYyB2b2lkIGNvbXB1dGVfcGNpX2RldmljZShzdHJ1Y3Qgc19teV9tZW51ICptZW51LAorCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2aWNlLAorCQkJICAgICAgIGludCBwY2lfYnVzLCBpbnQgcGNpX3Nsb3QsIGludCBwY2lfZnVuYywKKwkJCSAgICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgY2hhciBidWZmZXJbNTZdOworICAgIGNoYXIgc3RhdGJ1ZmZlcltTVEFUTEVOXTsKKyAgICBjaGFyIGtlcm5lbF9tb2R1bGVzW0xJTlVYX0tFUk5FTF9NT0RVTEVfU0laRSAqCisJCQlNQVhfS0VSTkVMX01PRFVMRVNfUEVSX1BDSV9ERVZJQ0VdOworCisgICAgbWVudS0+bWVudSA9IGFkZF9tZW51KCIgRGV0YWlscyAiLCAtMSk7CisgICAgbWVudS0+aXRlbXNfY291bnQgPSAwOworICAgIHNldF9tZW51X3Bvcyg1LCAxNyk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJWZW5kb3IgIDogJXMiLAorCSAgICAgcGNpX2RldmljZS0+ZGV2X2luZm8tPnZlbmRvcl9uYW1lKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlZlbmRvciBOYW1lOiAlcyIsCisJICAgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+dmVuZG9yX25hbWUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiUHJvZHVjdCA6ICVzIiwKKwkgICAgIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5wcm9kdWN0X25hbWUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiUHJvZHVjdCBOYW1lICAlcyIsCisJICAgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+cHJvZHVjdF9uYW1lKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkNsYXNzICAgOiAlcyIsCisJICAgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+Y2xhc3NfbmFtZSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJDbGFzcyBOYW1lOiAlcyIsCisJICAgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+Y2xhc3NfbmFtZSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJMb2NhdGlvbjogJTAyeDolMDJ4LiUwMXgiLCBwY2lfYnVzLAorCSAgICAgcGNpX3Nsb3QsIHBjaV9mdW5jKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwKKwkgICAgICJMb2NhdGlvbiBvbiB0aGUgUENJIEJ1czogJTAyeDolMDJ4LiUwMXgiLCBwY2lfYnVzLCBwY2lfc2xvdCwKKwkgICAgIHBjaV9mdW5jKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlBDSSBJRCAgOiAlMDR4OiUwNHhbJTA0eDolMDR4XSIsCisJICAgICBwY2lfZGV2aWNlLT52ZW5kb3IsIHBjaV9kZXZpY2UtPnByb2R1Y3QsCisJICAgICBwY2lfZGV2aWNlLT5zdWJfdmVuZG9yLCBwY2lfZGV2aWNlLT5zdWJfcHJvZHVjdCk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsCisJICAgICAidmVuZG9yOnByb2R1Y3Rbc3ViX3ZlbmRvcjpzdWJfcHJvZHVjdF0gOiAlMDR4OiUwNHhbJTA0eDolMDR4XSIsCisJICAgICBwY2lfZGV2aWNlLT52ZW5kb3IsIHBjaV9kZXZpY2UtPnByb2R1Y3QsCisJICAgICBwY2lfZGV2aWNlLT5zdWJfdmVuZG9yLCBwY2lfZGV2aWNlLT5zdWJfcHJvZHVjdCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBpZiAoKHBjaV9kZXZpY2UtPmRldl9pbmZvLT5pcnEgPiAwKSAmJiAocGNpX2RldmljZS0+ZGV2X2luZm8tPmlycSA8IDI1NSkpIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJJUlEgICAgIDogJWQiLAorCQkgcGNpX2RldmljZS0+ZGV2X2luZm8tPmlycSk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJJUlEgOiAlZCIsCisJCSBwY2lfZGV2aWNlLT5kZXZfaW5mby0+aXJxKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJMYXRlbmN5IDogJWQiLAorCSAgICAgcGNpX2RldmljZS0+ZGV2X2luZm8tPmxhdGVuY3kpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTGF0ZW5jeSA6ICVkIiwKKwkgICAgIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5sYXRlbmN5KTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIG1lbXNldChrZXJuZWxfbW9kdWxlcywgMCwgc2l6ZW9mKGtlcm5lbF9tb2R1bGVzKSk7CisKKyAgICBpZiAocGNpX2RldmljZS0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVfY291bnQgPiAxKSB7CisJZm9yIChpbnQgaSA9IDA7CisJICAgICBpIDwgcGNpX2RldmljZS0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVfY291bnQ7IGkrKykgeworCSAgICBpZiAoaSA+IDApIHsKKwkJc3RybmNhdChrZXJuZWxfbW9kdWxlcywgIiB8ICIsIDMpOworCSAgICB9CisJICAgIHN0cm5jYXQoa2VybmVsX21vZHVsZXMsCisJCSAgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZVtpXSwKKwkJICAgIExJTlVYX0tFUk5FTF9NT0RVTEVfU0laRSAtIDEpOworCX0KKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJNb2R1bGVzIDogJXMiLCBrZXJuZWxfbW9kdWxlcyk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJLZXJuZWwgTW9kdWxlczogJXMiLAorCQkga2VybmVsX21vZHVsZXMpOworICAgIH0gZWxzZSB7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTW9kdWxlICA6ICVzIiwKKwkJIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlWzBdKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIktlcm5lbCBNb2R1bGU6ICVzIiwKKwkJIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlWzBdKTsKKyAgICB9CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBpZiAoaGFyZHdhcmUtPmlzX3B4ZV92YWxpZCA9PSB0cnVlKSB7CisJaWYgKChoYXJkd2FyZS0+cHhlLnBjaV9kZXZpY2UgIT0gTlVMTCkKKwkgICAgJiYgKGhhcmR3YXJlLT5weGUucGNpX2RldmljZSA9PSBwY2lfZGV2aWNlKSkgeworCisJICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIk1BQyBBZGRyOiAlcyIsCisJCSAgICAgaGFyZHdhcmUtPnB4ZS5tYWNfYWRkcik7CisJICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTUFDIEFkZHJlc3MgOiAlcyIsCisJCSAgICAgaGFyZHdhcmUtPnB4ZS5tYWNfYWRkcik7CisJICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwkgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworCSAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJQWEUgICAgIDogJXMiLAorCQkgICAgICJDdXJyZW50IEJvb3QgZGV2aWNlIik7CisJICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiUFhFIDogJXMiLAorCQkgICAgICJDdXJyZW50IEJvb3QgZGV2aWNlIik7CisJICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwkgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKwl9CisgICAgfQorfQorCisvKiBNYWluIFBDSSBtZW51ICovCitpbnQgY29tcHV0ZV9QQ0koc3RydWN0IHNfaGR0X21lbnUgKmhkdF9tZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgaW50IGkgPSAwOworICAgIGNoYXIgbWVudW5hbWVbMjU1XVtNRU5VTEVOICsgMV07CisgICAgY2hhciBpbmZvYmFyWzI1NV1bU1RBVExFTiArIDFdOworICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2aWNlOworICAgIGNoYXIga2VybmVsX21vZHVsZXNbTElOVVhfS0VSTkVMX01PRFVMRV9TSVpFICoKKwkJCU1BWF9LRVJORUxfTU9EVUxFU19QRVJfUENJX0RFVklDRV07CisKKyAgICAvKiBGb3IgZXZlcnkgZGV0ZWN0ZWQgcGNpIGRldmljZSwgY29tcHV0ZSBpdHMgc3VibWVudSAqLworICAgIGZvcl9lYWNoX3BjaV9mdW5jKHBjaV9kZXZpY2UsIGhhcmR3YXJlLT5wY2lfZG9tYWluKSB7CisJbWVtc2V0KGtlcm5lbF9tb2R1bGVzLCAwLCBzaXplb2Yga2VybmVsX21vZHVsZXMpOworCWZvciAoaW50IGttb2QgPSAwOworCSAgICAga21vZCA8IHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50OyBrbW9kKyspIHsKKwkgICAgaWYgKGttb2QgPiAwKSB7CisJCXN0cm5jYXQoa2VybmVsX21vZHVsZXMsICIgfCAiLCAzKTsKKwkgICAgfQorCSAgICBzdHJuY2F0KGtlcm5lbF9tb2R1bGVzLAorCQkgICAgcGNpX2RldmljZS0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVba21vZF0sCisJCSAgICBMSU5VWF9LRVJORUxfTU9EVUxFX1NJWkUgLSAxKTsKKwl9CisJaWYgKHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50ID09IDApCisJICAgIHN0cmxjcHkoa2VybmVsX21vZHVsZXMsICJ1bmtub3duIiwgNyk7CisKKwljb21wdXRlX3BjaV9kZXZpY2UoJihoZHRfbWVudS0+cGNpX3N1Yl9tZW51W2ldKSwgcGNpX2RldmljZSwKKwkJCSAgIF9fcGNpX2J1cywgX19wY2lfc2xvdCwgX19wY2lfZnVuYywgaGFyZHdhcmUpOworCXNucHJpbnRmKG1lbnVuYW1lW2ldLCA1OSwgIiVzfCVzIiwKKwkJIHBjaV9kZXZpY2UtPmRldl9pbmZvLT52ZW5kb3JfbmFtZSwKKwkJIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5wcm9kdWN0X25hbWUpOworCXNucHJpbnRmKGluZm9iYXJbaV0sIFNUQVRMRU4sCisJCSAiJTAyeDolMDJ4LiUwMXggIyAlcyAjIElEOiUwNHg6JTA0eFslMDR4OiUwNHhdICMgS21vZDolcyIsCisJCSBfX3BjaV9idXMsIF9fcGNpX3Nsb3QsIF9fcGNpX2Z1bmMsCisJCSBwY2lfZGV2aWNlLT5kZXZfaW5mby0+Y2xhc3NfbmFtZSwgcGNpX2RldmljZS0+dmVuZG9yLAorCQkgcGNpX2RldmljZS0+cHJvZHVjdCwgcGNpX2RldmljZS0+c3ViX3ZlbmRvciwKKwkJIHBjaV9kZXZpY2UtPnN1Yl9wcm9kdWN0LCBrZXJuZWxfbW9kdWxlcyk7CisJaSsrOworICAgIH0KKworICAgIGhkdF9tZW51LT5wY2lfbWVudS5tZW51ID0gYWRkX21lbnUoIiBQQ0kgRGV2aWNlcyAiLCAtMSk7CisgICAgaGR0X21lbnUtPnBjaV9tZW51Lml0ZW1zX2NvdW50ID0gMDsKKyAgICBpZiAoaGFyZHdhcmUtPnBjaV9pZHNfcmV0dXJuX2NvZGUgPT0gLUVOT1BDSUlEUykgeworCWFkZF9pdGVtKCJUaGUgcGNpLmlkcyBmaWxlIGlzIG1pc3NpbmciLCAiTWlzc2luZyBwY2kuaWRzIGZpbGUiLAorCQkgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwlhZGRfaXRlbSgiUENJIERldmljZSBuYW1lcyAgY2FuJ3QgYmUgY29tcHV0ZWQuIiwKKwkJICJNaXNzaW5nIHBjaS5pZHMgZmlsZSIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJYWRkX2l0ZW0oIlBsZWFzZSBwdXQgb25lIGluIHNhbWUgZGlyIGFzIGhkdCIsCisJCSAiTWlzc2luZyBwY2kuaWRzIGZpbGUiLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCWFkZF9pdGVtKCIiLCAiIiwgT1BUX1NFUCwgIiIsIDApOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgeworCWFkZF9pdGVtKG1lbnVuYW1lW2pdLCBpbmZvYmFyW2pdLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkJIGhkdF9tZW51LT5wY2lfc3ViX21lbnVbal0ubWVudSk7CisJaGR0X21lbnUtPnBjaV9tZW51Lml0ZW1zX2NvdW50Kys7CisgICAgfQorICAgIHByaW50ZigiTUVOVTogUENJIG1lbnUgZG9uZSAoJWQgaXRlbXMpXG4iLCBoZHRfbWVudS0+cGNpX21lbnUuaXRlbXNfY291bnQpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1tZW51LXByb2Nlc3Nvci5jIGIvY29tMzIvaGR0L2hkdC1tZW51LXByb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODgzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LW1lbnUtcHJvY2Vzc29yLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImhkdC1tZW51LmgiCisKK3N0YXRpYyB2b2lkIHNob3dfZmxhZyhzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBjaGFyICpidWZmZXIsIGJvb2wgZmxhZywKKwkJICAgICAgY2hhciAqZmxhZ19uYW1lLCBib29sIGZsdXNoKQoreworICAgIGNoYXIgb3V0cHV0X2J1ZmZlcltTVUJNRU5VTEVOICsgMV07CisgICAgY2hhciBzdGF0YnVmZmVyW1NVQk1FTlVMRU4gKyAxXTsKKyAgICBpZiAoKCgoc3RybGVuKGJ1ZmZlcikgKyBzdHJsZW4oZmxhZ19uYW1lKSkgPiAzNSkgJiYgZmxhZykgfHwgZmx1c2gpIHsKKwlzbnByaW50ZihvdXRwdXRfYnVmZmVyLCBzaXplb2Ygb3V0cHV0X2J1ZmZlciwgIkZsYWdzICAgICA6ICVzIiwgYnVmZmVyKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkZsYWdzOiAlcyIsIGJ1ZmZlcik7CisJYWRkX2l0ZW0ob3V0cHV0X2J1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworCisJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworCWlmIChmbHVzaCkKKwkgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZmxhZykKKwlzdHJjYXQoYnVmZmVyLCBmbGFnX25hbWUpOworfQorCisvKiBDb21wdXRlIFByb2Nlc3NvciBtZW51ICovCit2b2lkIGNvbXB1dGVfcHJvY2Vzc29yKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBjaGFyIGJ1ZmZlcltTVUJNRU5VTEVOICsgMV07CisgICAgY2hhciBidWZmZXIxW1NVQk1FTlVMRU4gKyAxXTsKKyAgICBjaGFyIHN0YXRidWZmZXJbU1RBVExFTiArIDFdOworCisgICAgaWYgKGhhcmR3YXJlLT5hY3BpLm1hZHQucHJvY2Vzc29yX2xvY2FsX2FwaWNfY291bnQgPiAwKSB7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLAorCQkgIiBNYWluIFByb2Nlc3NvcnMgKCVkIGxvZ2ljYWwgLyAlZCBwaHlzLiApICIsCisJCSBoYXJkd2FyZS0+YWNwaS5tYWR0LnByb2Nlc3Nvcl9sb2NhbF9hcGljX2NvdW50LAorCQkgaGFyZHdhcmUtPnBoeXNpY2FsX2NwdV9jb3VudCk7CisJbWVudS0+bWVudSA9IGFkZF9tZW51KGJ1ZmZlciwgLTEpOworCW1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKwlzZXRfbWVudV9wb3MoU1VCTUVOVV9ZLCBTVUJNRU5VX1gpOworICAgIH0gZWxzZSB7CisJbWVudS0+bWVudSA9IGFkZF9tZW51KCIgTWFpbiBQcm9jZXNzb3IgIiwgLTEpOworCW1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKwlzZXRfbWVudV9wb3MoU1VCTUVOVV9ZLCBTVUJNRU5VX1gpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlZlbmRvciAgICA6ICVzIiwgaGFyZHdhcmUtPmNwdS52ZW5kb3IpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVmVuZG9yOiAlcyIsIGhhcmR3YXJlLT5jcHUudmVuZG9yKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIk1vZGVsICAgICA6ICVzIiwgaGFyZHdhcmUtPmNwdS5tb2RlbCk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJNb2RlbDogJXMiLCBoYXJkd2FyZS0+Y3B1Lm1vZGVsKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkNQVSBDb3JlcyA6ICVkIiwgaGFyZHdhcmUtPmNwdS5udW1fY29yZXMpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTnVtYmVyIG9mIENQVSBjb3JlczogJWQiLAorCSAgICAgaGFyZHdhcmUtPmNwdS5udW1fY29yZXMpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgaWYgKGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmNvcmVfZW5hYmxlZCAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkNQVSBFbmFibGU6ICVkIiwgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IuY29yZV9lbmFibGVkKTsKKyAgICAgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJOdW1iZXIgb2YgQ1BVIEVuYWJsZWQgOiAlZCIsCisJICAgICBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5jb3JlX2VuYWJsZWQpOworICAgICAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisgICAgfQorCisgICAgaWYgKGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnRocmVhZF9jb3VudCAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkNQVSBUaHJlYWQ6ICVkIiwgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IudGhyZWFkX2NvdW50KTsKKyAgICAgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJOdW1iZXIgb2YgQ1BVIFRocmVhZHMgOiAlZCIsCisJICAgICBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci50aHJlYWRfY291bnQpOworICAgICAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTDEgQ2FjaGUgIDogJWRLICsgJWRLIChJK0QpIiwKKwkgICAgIGhhcmR3YXJlLT5jcHUubDFfaW5zdHJ1Y3Rpb25fY2FjaGVfc2l6ZSwKKwkgICAgIGhhcmR3YXJlLT5jcHUubDFfZGF0YV9jYWNoZV9zaXplKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwKKwkgICAgICJMMSBDYWNoZSBTaXplOiAlZEsgKyAlZEsgKEluc3RydWN0aW9uICsgRGF0YSkiLAorCSAgICAgaGFyZHdhcmUtPmNwdS5sMV9pbnN0cnVjdGlvbl9jYWNoZV9zaXplLAorCSAgICAgaGFyZHdhcmUtPmNwdS5sMV9kYXRhX2NhY2hlX3NpemUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTDIgQ2FjaGUgIDogJWRLIiwKKwkgICAgIGhhcmR3YXJlLT5jcHUubDJfY2FjaGVfc2l6ZSk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJMMiBDYWNoZSBTaXplOiAlZEsiLAorCSAgICAgaGFyZHdhcmUtPmNwdS5sMl9jYWNoZV9zaXplKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkZhbWlseSBJRCA6ICVkIiwgaGFyZHdhcmUtPmNwdS5mYW1pbHkpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiRmFtaWx5IElEOiAlZCIsCisJICAgICBoYXJkd2FyZS0+Y3B1LmZhbWlseSk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJNb2RlbCAgSUQgOiAlZCIsIGhhcmR3YXJlLT5jcHUubW9kZWxfaWQpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTW9kZWwgIElEOiAlZCIsCisJICAgICBoYXJkd2FyZS0+Y3B1Lm1vZGVsX2lkKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlN0ZXBwaW5nICA6ICVkIiwgaGFyZHdhcmUtPmNwdS5zdGVwcGluZyk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJTdGVwcGluZzogJWQiLAorCSAgICAgaGFyZHdhcmUtPmNwdS5zdGVwcGluZyk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBpZiAoaGFyZHdhcmUtPmlzX2RtaV92YWxpZCkgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkZTQiAgICAgICA6ICVkIiwKKwkJIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLmV4dGVybmFsX2Nsb2NrKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwKKwkJICJGcm9udCBTaWRlIEJ1cyAoTUh6KTogJWQiLAorCQkgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IuZXh0ZXJuYWxfY2xvY2spOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworCisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiQ3VyLiBTcGVlZDogJWQiLAorCQkgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IuY3VycmVudF9zcGVlZCk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsCisJCSAiQ3VycmVudCBTcGVlZCAoTUh6KTogJWQiLAorCQkgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IuY3VycmVudF9zcGVlZCk7CisJYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCW1lbnUtPml0ZW1zX2NvdW50Kys7CisKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJNYXggU3BlZWQgOiAlZCIsCisJCSBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5tYXhfc3BlZWQpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTWF4IFNwZWVkIChNSHopOiAlZCIsCisJCSBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci5tYXhfc3BlZWQpOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworCisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVXBncmFkZSAgIDogJXMiLAorCQkgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3IudXBncmFkZSk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJVcGdyYWRlOiAlcyIsCisJCSBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci51cGdyYWRlKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlZvbHRhZ2UgICA6ICVkLiUwMmQiLAorCQkgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3Iudm9sdGFnZV9tdiAvIDEwMDAsCisJCSBoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci52b2x0YWdlX212IC0KKwkJICgoaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3Iudm9sdGFnZV9tdiAvIDEwMDApICogMTAwMCkpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiVm9sdGFnZSAoVikgOiAlZC4lMDJkIiwKKwkJIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnZvbHRhZ2VfbXYgLyAxMDAwLAorCQkgaGFyZHdhcmUtPmRtaS5wcm9jZXNzb3Iudm9sdGFnZV9tdiAtCisJCSAoKGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnZvbHRhZ2VfbXYgLyAxMDAwKSAqIDEwMDApKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoaGFyZHdhcmUtPmNwdS5mbGFncy5zbXApIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJTTVAgICAgICAgOiBZZXMiKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlNNUDogWWVzIik7CisgICAgfSBlbHNlIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJTTVAgICAgICAgOiBObyIpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiU01QOiBObyIpOworICAgIH0KKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIGlmIChoYXJkd2FyZS0+Y3B1LmZsYWdzLmxtKSB7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAieDg2XzY0ICAgIDogWWVzIik7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsCisJCSAieDg2XzY0IGNvbXBhdGlibGUgcHJvY2Vzc29yOiBZZXMiKTsKKyAgICB9IGVsc2UgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlg4Nl82NCAgICA6IE5vIik7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsCisJCSAiWDg2XzY0IGNvbXBhdGlibGUgcHJvY2Vzc29yOiBObyIpOworICAgIH0KKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIGlmICgoaGFyZHdhcmUtPmNwdS5mbGFncy52bXgpIHx8IChoYXJkd2FyZS0+Y3B1LmZsYWdzLnN2bSkpIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJIdyBWaXJ0LiAgOiBZZXMiKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwKKwkJICJIYXJkd2FyZSBWaXJ0dWFsaXNhdGlvbiBDYXBhYmxlOiBZZXMiKTsKKyAgICB9IGVsc2UgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkh3IFZpcnQuICA6IE5vIik7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsCisJCSAiSGFyZHdhcmUgVmlydHVhbGlzYXRpb24gQ2FwYWJhYmxlIDogTm8iKTsKKyAgICB9CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBtZW1zZXQoYnVmZmVyMSwgMCwgc2l6ZW9mKGJ1ZmZlcjEpKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5mcHUsICJmcHUgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnZtZSwgInZtZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZGUsICJkZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucHNlLCAicHNlICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy50c2MsICJ0c2MgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLm1zciwgIm1zciAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucGFlLCAicGFlICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5tY2UsICJtY2UgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmN4OCwgImN4OCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuYXBpYywgImFwaWMgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnNlcCwgInNlcCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MubXRyciwgIm10cnIgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBnZSwgInBnZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MubWNhLCAibWNhICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5jbW92LCAiY21vdiAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucGF0LCAicGF0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5wc2VfMzYsICJwc2VfMzYgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBzbiwgInBzbiAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuY2xmbHNoLCAiY2xmbHNoICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5kdHMsICJkdHMgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmFjcGksICJhY3BpICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5tbXgsICJtbXggIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnNzZSwgInNzZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3Muc3NlMiwgInNzZTIgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnNzLCAic3MgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmh0dCwgImh0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5hY2MsICJhY2MgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnN5c2NhbGwsICJzeXNjYWxsICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5tcCwgIm1wICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5ueCwgIm54ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5tbXhleHQsICJtbXhleHQgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmxtLCAibG0gIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLm5vd2V4dCwgIjNkbm93ZXh0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5ub3csICIzZG5vdyEgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnN2bSwgInN2bSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3Mudm14LCAidm14ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5wYmUsICJwYmUgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmZ4c3Jfb3B0LCAiZnhzcl9vcHQgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmdicGFnZXMsICJnYnBhZ2VzICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5yZHRzY3AsICJyZHRzY3AgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBuaSwgInBuaSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucGNsbXVscWQsICJwY2xtdWxxZCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZHRlczY0LCAiZHRlczY0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5zbXgsICJzbXggIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmVzdCwgImVzdCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MudG0yLCAidG0yICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5zc2UzLCAic3NlMyAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZm1hLCAiZm1hICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5jeDE2LCAiY3gxNiAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MueHRwciwgInh0cHIgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBkY20sICJwZGNtICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5kY2EsICJkY2EgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnhtbTRfMSwgInhtbTRfMSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MueG1tNF8yLCAieG1tNF8yICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy54MmFwaWMsICJ4MmFwaWMgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLm1vdmJlLCAibW92YmUgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBvcGNudCwgInBvcGNudCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuYWVzLCAiYWVzICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy54c2F2ZSwgInhzYXZlICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5vc3hzYXZlLCAib3N4c2F2ZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuYXZ4LCAiYXZ4ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5oeXBlcnZpc29yLCAiaHlwZXJ2aXNvciAiLAorCSAgICAgIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5hY2UyLCAiYWNlMiAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuYWNlMl9lbiwgImFjZTJfZW4gIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBoZSwgInBoZSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MucGhlX2VuLCAicGhlX2VuICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5wbW0sICJwbW0gIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnBtbV9lbiwgInBtbV9lbiAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZXh0YXBpYywgImV4dGFwaWMgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmNyOF9sZWdhY3ksICJjcjhfbGVnYWN5ICIsCisJICAgICAgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmFibSwgImFibSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3Muc3NlNGEsICJzc2U0YSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MubWlzYWxpZ25zc2UsICJtaXNhbGlnbnNzZSAiLAorCSAgICAgIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5ub3dwcmVmZXRjaCwgIjNkbm93cHJlZmV0Y2ggIiwKKwkgICAgICBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3Mub3N2dywgIm9zdncgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmlicywgImlicyAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3Muc3NlNSwgInNzZTUgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLnNraW5pdCwgInNraW5pdCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3Mud2R0LCAid2R0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy5pZGEsICJpZGEgIiwgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmFyYXQsICJhcmF0ICIsIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy50cHJfc2hhZG93LCAidHByX3NoYWRvdyAiLAorCSAgICAgIGZhbHNlKTsKKyAgICBzaG93X2ZsYWcobWVudSwgYnVmZmVyMSwgaGFyZHdhcmUtPmNwdS5mbGFncy52bm1pLCAidm5taSAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MuZmxleHByaW9yaXR5LCAiZmxleHByaW9yaXR5ICIsCisJICAgICAgZmFsc2UpOworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBoYXJkd2FyZS0+Y3B1LmZsYWdzLmVwdCwgImVwdCAiLCBmYWxzZSk7CisgICAgc2hvd19mbGFnKG1lbnUsIGJ1ZmZlcjEsIGhhcmR3YXJlLT5jcHUuZmxhZ3MudnBpZCwgInZwaWQgIiwgZmFsc2UpOworCisgICAgLyogTGV0J3MgZmx1c2ggdGhlIHJlbWFpbmluZyBmbGFncyAqLworICAgIHNob3dfZmxhZyhtZW51LCBidWZmZXIxLCBmYWxzZSwgIiIsIHRydWUpOworCisgICAgcHJpbnRmKCJNRU5VOiBQcm9jZXNzb3IgbWVudSBkb25lICglZCBpdGVtcylcbiIsIG1lbnUtPml0ZW1zX2NvdW50KTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtbWVudS1weGUuYyBiL2NvbTMyL2hkdC9oZHQtbWVudS1weGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ4YjExCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1tZW51LXB4ZS5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJoZHQtbWVudS5oIgorI2luY2x1ZGUgPHN5cy9ncHhlLmg+CisKKy8qIE1haW4gS2VybmVsIG1lbnUgKi8KK3ZvaWQgY29tcHV0ZV9QWEUoc3RydWN0IHNfbXlfbWVudSAqbWVudSwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGNoYXIgYnVmZmVyW1NVQk1FTlVMRU4gKyAxXTsKKyAgICBjaGFyIGluZm9iYXJbU1RBVExFTiArIDFdOworICAgIGNoYXIgZ3B4ZVs0XT17MH07CisKKyAgICBpZiAoaGFyZHdhcmUtPmlzX3B4ZV92YWxpZCA9PSBmYWxzZSkKKwlyZXR1cm47CisKKyAgICBtZW51LT5tZW51ID0gYWRkX21lbnUoIiBQWEUgIiwgLTEpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBzZXRfbWVudV9wb3MoU1VCTUVOVV9ZLCBTVUJNRU5VX1gpOworCisgICAgc3RydWN0IHNfcHhlICpwID0gJmhhcmR3YXJlLT5weGU7CisKKyAgICBpZiAoKGhhcmR3YXJlLT5wY2lfaWRzX3JldHVybl9jb2RlID09IC1FTk9QQ0lJRFMpCisJfHwgKHAtPnBjaV9kZXZpY2UgPT0gTlVMTCkpIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJQQ0kgVmVuZG9yICAgIDogJWQiLCBwLT52ZW5kb3JfaWQpOworCXNucHJpbnRmKGluZm9iYXIsIHNpemVvZiBpbmZvYmFyLCAiUENJIFZlbmRvciAgICA6ICVkIiwgcC0+dmVuZG9yX2lkKTsKKwlhZGRfaXRlbShidWZmZXIsIGluZm9iYXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlBDSSBQcm9kdWN0ICAgOiAlZCIsIHAtPnZlbmRvcl9pZCk7CisJc25wcmludGYoaW5mb2Jhciwgc2l6ZW9mIGluZm9iYXIsICJQQ0kgUHJvZHVjdCAgIDogJWQiLCBwLT52ZW5kb3JfaWQpOworCWFkZF9pdGVtKGJ1ZmZlciwgaW5mb2JhciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworCisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiUENJIFN1YlZlbmRvciAgOiAlZCIsIHAtPnN1YnZlbmRvcl9pZCk7CisJc25wcmludGYoaW5mb2Jhciwgc2l6ZW9mIGluZm9iYXIsICJQQ0kgU3ViVmVuZG9yICA6ICVkIiwKKwkJIHAtPnN1YnZlbmRvcl9pZCk7CisJYWRkX2l0ZW0oYnVmZmVyLCBpbmZvYmFyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCW1lbnUtPml0ZW1zX2NvdW50Kys7CisKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJQQ0kgU3ViUHJvZHVjdCA6ICVkIiwKKwkJIHAtPnN1YnByb2R1Y3RfaWQpOworCXNucHJpbnRmKGluZm9iYXIsIHNpemVvZiBpbmZvYmFyLCAiUENJIFN1YlByb2R1Y3QgOiAlZCIsCisJCSBwLT5zdWJwcm9kdWN0X2lkKTsKKwlhZGRfaXRlbShidWZmZXIsIGluZm9iYXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlBDSSBSZXZpc2lvbiAgIDogJWQiLCBwLT5yZXYpOworCXNucHJpbnRmKGluZm9iYXIsIHNpemVvZiBpbmZvYmFyLCAiUENJIFJldmlzaW9uICAgOiAlZCIsIHAtPnJldik7CisJYWRkX2l0ZW0oYnVmZmVyLCBpbmZvYmFyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCW1lbnUtPml0ZW1zX2NvdW50Kys7CisKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsCisJCSAiUENJIEJ1cyBQb3MuICAgOiAlMDJ4OiUwMnguJTAyeCIsIHAtPnBjaV9idXMsCisJCSBwLT5wY2lfZGV2LCBwLT5wY2lfZnVuYyk7CisJc25wcmludGYoaW5mb2Jhciwgc2l6ZW9mIGluZm9iYXIsCisJCSAiUENJIEJ1cyBQb3MuICAgOiAlMDJ4OiUwMnguJTAyeCIsIHAtPnBjaV9idXMsCisJCSBwLT5wY2lfZGV2LCBwLT5wY2lfZnVuYyk7CisJYWRkX2l0ZW0oYnVmZmVyLCBpbmZvYmFyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCW1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICB9IGVsc2UgeworCisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTWFudWZhY3R1cmVyIDogJXMiLAorCQkgcC0+cGNpX2RldmljZS0+ZGV2X2luZm8tPnZlbmRvcl9uYW1lKTsKKwlzbnByaW50ZihpbmZvYmFyLCBzaXplb2YgaW5mb2JhciwgIk1hbnVmYWN0dXJlciA6ICVzIiwKKwkJIHAtPnBjaV9kZXZpY2UtPmRldl9pbmZvLT52ZW5kb3JfbmFtZSk7CisJYWRkX2l0ZW0oYnVmZmVyLCBpbmZvYmFyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCW1lbnUtPml0ZW1zX2NvdW50Kys7CisKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJQcm9kdWN0ICAgICAgOiAlcyIsCisJCSBwLT5wY2lfZGV2aWNlLT5kZXZfaW5mby0+cHJvZHVjdF9uYW1lKTsKKwlzbnByaW50ZihpbmZvYmFyLCBzaXplb2YgaW5mb2JhciwgIlByb2R1Y3QgICAgICA6ICVzIiwKKwkJIHAtPnBjaV9kZXZpY2UtPmRldl9pbmZvLT5wcm9kdWN0X25hbWUpOworCWFkZF9pdGVtKGJ1ZmZlciwgaW5mb2JhciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIk1BQyBBZGRyZXNzICA6ICVzIiwgcC0+bWFjX2FkZHIpOworICAgIHNucHJpbnRmKGluZm9iYXIsIHNpemVvZiBpbmZvYmFyLCAiTUFDIEFkZHJlc3MgIDogJXMiLCBwLT5tYWNfYWRkcik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBpbmZvYmFyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJJUCBBZGRyZXNzICAgOiAlZC4lZC4lZC4lZCIsCisJICAgICBwLT5pcF9hZGRyWzBdLCBwLT5pcF9hZGRyWzFdLCBwLT5pcF9hZGRyWzJdLCBwLT5pcF9hZGRyWzNdKTsKKyAgICBzbnByaW50ZihpbmZvYmFyLCBzaXplb2YgaW5mb2JhciwgIklQIEFkZHJlc3MgICA6ICVkLiVkLiVkLiVkIiwKKwkgICAgIHAtPmlwX2FkZHJbMF0sIHAtPmlwX2FkZHJbMV0sIHAtPmlwX2FkZHJbMl0sIHAtPmlwX2FkZHJbM10pOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgaW5mb2JhciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgaWYgKGlzX2dweGUoKSkgc25wcmludGYoZ3B4ZSxzaXplb2YoZ3B4ZSksIiVzIiwiWWVzIik7CisgICAgZWxzZSBzbnByaW50ZiAoZ3B4ZSwgc2l6ZW9mKGdweGUpLCAiJXMiLCAiTm8iKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgImdQWEUgRGV0ZWN0ZWQ6ICVzIiwgZ3B4ZSk7CisgICAgc25wcmludGYoaW5mb2Jhciwgc2l6ZW9mIGluZm9iYXIsICJnUFhFIERldGVjdGVkOiAlcyIsIGdweGUpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgaW5mb2JhciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgcHJpbnRmKCJNRU5VOiBQWEUgbWVudSBkb25lICglZCBpdGVtcylcbiIsIG1lbnUtPml0ZW1zX2NvdW50KTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtbWVudS1zdW1tYXJ5LmMgYi9jb20zMi9oZHQvaGR0LW1lbnUtc3VtbWFyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjdlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LW1lbnUtc3VtbWFyeS5jCkBAIC0wLDAgKzEsMTk3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgImhkdC1tZW51LmgiCisKKy8qIENvbXB1dGluZyBTdW1tYXJ5IG1lbnUgKi8KK3ZvaWQgY29tcHV0ZV9zdW1tYXJ5bWVudShzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgY2hhciBidWZmZXJbU1VCTUVOVUxFTiArIDFdOworICAgIGNoYXIgc3RhdGJ1ZmZlcltTVEFUTEVOICsgMV07CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiIFN1bW1hcnkgKCVkIENQVSkgIiwgaGFyZHdhcmUtPnBoeXNpY2FsX2NwdV9jb3VudCk7CisgICAgbWVudS0+bWVudSA9IGFkZF9tZW51KGJ1ZmZlciwgLTEpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKworICAgIHNldF9tZW51X3BvcyhTVUJNRU5VX1ksIFNVQk1FTlVfWCk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJDUFUgVmVuZG9yICAgIDogJXMiLCBoYXJkd2FyZS0+Y3B1LnZlbmRvcik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJDUFUgVmVuZG9yOiAlcyIsCisJICAgICBoYXJkd2FyZS0+Y3B1LnZlbmRvcik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJDUFUgTW9kZWwgICAgIDogJXMiLCBoYXJkd2FyZS0+Y3B1Lm1vZGVsKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkNQVSBNb2RlbDogJXMiLAorCSAgICAgaGFyZHdhcmUtPmNwdS5tb2RlbCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBjaGFyIGZlYXR1cmVzWzI1NV09ezB9OworICAgIGlmIChoYXJkd2FyZS0+ZG1pLnByb2Nlc3Nvci50aHJlYWRfY291bnQgIT0gMCkKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICIsICVkIHRocmVhZCIsIGhhcmR3YXJlLT5kbWkucHJvY2Vzc29yLnRocmVhZF9jb3VudCk7CisgICAgZWxzZQorICAgICAgICBidWZmZXJbMF0gPSAweDAwOworICAgIHNwcmludGYoZmVhdHVyZXMsICIlZCBjb3JlJXMsICVkSyBMMiBDYWNoZSIsIGhhcmR3YXJlLT5jcHUubnVtX2NvcmVzLAorICAgICAgICBidWZmZXIsIGhhcmR3YXJlLT5jcHUubDJfY2FjaGVfc2l6ZSk7CisgICAgaWYgKGhhcmR3YXJlLT5jcHUuZmxhZ3MubG0pCisJc3RyY2F0KGZlYXR1cmVzLCAiLCA2NGJpdCIpOworICAgIGVsc2UKKwlzdHJjYXQoZmVhdHVyZXMsICIsIDMyYml0Iik7CisgICAgaWYgKGhhcmR3YXJlLT5jcHUuZmxhZ3Muc21wKQorCXN0cmNhdChmZWF0dXJlcywgIiwgU01QIik7CisgICAgaWYgKGhhcmR3YXJlLT5jcHUuZmxhZ3Mudm14IHx8IGhhcmR3YXJlLT5jcHUuZmxhZ3Muc3ZtKQorCXN0cmNhdChmZWF0dXJlcywgIiwgSHdWSVJUIik7CisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiJXMiLCBmZWF0dXJlcyk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJGZWF0dXJlcyA6ICVzIiwgZmVhdHVyZXMpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgYWRkX2l0ZW0oIiIsICIiLCBPUFRfU0VQLCAiIiwgMCk7CisgICAgaWYgKGhhcmR3YXJlLT5pc19kbWlfdmFsaWQgPT0gdHJ1ZSkgeworCisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiU3lzdGVtIFZlbmRvciA6ICVzIiwKKwkJIGhhcmR3YXJlLT5kbWkuc3lzdGVtLm1hbnVmYWN0dXJlcik7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJTeXN0ZW0gVmVuZG9yOiAlcyIsCisJCSBoYXJkd2FyZS0+ZG1pLnN5c3RlbS5tYW51ZmFjdHVyZXIpOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworCisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiU3lzdGVtIFByb2R1Y3Q6ICVzIiwKKwkJIGhhcmR3YXJlLT5kbWkuc3lzdGVtLnByb2R1Y3RfbmFtZSk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsCisJCSAiU3lzdGVtIFByb2R1Y3QgTmFtZTogJXMiLCBoYXJkd2FyZS0+ZG1pLnN5c3RlbS5wcm9kdWN0X25hbWUpOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworCisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiU3lzdGVtIFNlcmlhbCA6ICVzIiwKKwkJIGhhcmR3YXJlLT5kbWkuc3lzdGVtLnNlcmlhbCk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsCisJCSAiU3lzdGVtIFNlcmlhbCBOdW1iZXI6ICVzIiwgaGFyZHdhcmUtPmRtaS5zeXN0ZW0uc2VyaWFsKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKworCWFkZF9pdGVtKCIiLCAiIiwgT1BUX1NFUCwgIiIsIDApOworCisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiQmlvcyBWZXJzaW9uICA6ICVzIiwKKwkJIGhhcmR3YXJlLT5kbWkuYmlvcy52ZXJzaW9uKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkJpb3MgVmVyc2lvbjogJXMiLAorCQkgaGFyZHdhcmUtPmRtaS5iaW9zLnZlcnNpb24pOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworCisJc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiQmlvcyBSZWxlYXNlICA6ICVzIiwKKwkJIGhhcmR3YXJlLT5kbWkuYmlvcy5yZWxlYXNlX2RhdGUpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiQmlvcyBSZWxlYXNlIERhdGU6ICVzIiwKKwkJIGhhcmR3YXJlLT5kbWkuYmlvcy5yZWxlYXNlX2RhdGUpOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIGFkZF9pdGVtKCIiLCAiIiwgT1BUX1NFUCwgIiIsIDApOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTWVtb3J5IFNpemUgICA6ICVsdSBNaUIgKCVsdSBLaUIpIiwKKwkgICAgIChoYXJkd2FyZS0+ZGV0ZWN0ZWRfbWVtb3J5X3NpemUgKyAoMSA8PCA5KSkgPj4gMTAsCisJICAgICBoYXJkd2FyZS0+ZGV0ZWN0ZWRfbWVtb3J5X3NpemUpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLAorCSAgICAgIkRldGVjdGVkIE1lbW9yeSBTaXplOiAlbHUgTWlCICglbHUgS2lCKSIsCisJICAgICAoaGFyZHdhcmUtPmRldGVjdGVkX21lbW9yeV9zaXplICsgKDEgPDwgOSkpID4+IDEwLAorCSAgICAgaGFyZHdhcmUtPmRldGVjdGVkX21lbW9yeV9zaXplKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIGFkZF9pdGVtKCIiLCAiIiwgT1BUX1NFUCwgIiIsIDApOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTmIgUENJIERldmljZXM6ICVkIiwKKwkgICAgIGhhcmR3YXJlLT5uYl9wY2lfZGV2aWNlcyk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJOdW1iZXIgb2YgUENJIERldmljZXM6ICVkIiwKKwkgICAgIGhhcmR3YXJlLT5uYl9wY2lfZGV2aWNlcyk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBpZiAoaGFyZHdhcmUtPmlzX3B4ZV92YWxpZCA9PSB0cnVlKSB7CisJYWRkX2l0ZW0oIiIsICIiLCBPUFRfU0VQLCAiIiwgMCk7CisKKwlzdHJ1Y3Qgc19weGUgKnAgPSAmaGFyZHdhcmUtPnB4ZTsKKworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlBYRSBNQUMgQWRkcmVzczogJXMiLCBwLT5tYWNfYWRkcik7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJQWEUgTUFDIEFkZHJlc3M6ICVzIiwKKwkJIHAtPm1hY19hZGRyKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlBYRSBJUCBBZGRyZXNzIDogJWQuJWQuJWQuJWQiLAorCQkgcC0+aXBfYWRkclswXSwgcC0+aXBfYWRkclsxXSwgcC0+aXBfYWRkclsyXSwgcC0+aXBfYWRkclszXSk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsCisJCSAiUFhFIElQIEFkZHJlc3M6ICVkLiVkLiVkLiVkIiwgcC0+aXBfYWRkclswXSwKKwkJIHAtPmlwX2FkZHJbMV0sIHAtPmlwX2FkZHJbMl0sIHAtPmlwX2FkZHJbM10pOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIGlmIChoYXJkd2FyZS0+bW9kdWxlc19wY2ltYXBfcmV0dXJuX2NvZGUgIT0gLUVOT01PRFVMRVNQQ0lNQVApIHsKKwlhZGRfaXRlbSgiIiwgIiIsIE9QVF9TRVAsICIiLCAwKTsKKworCXN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2aWNlOworCWNoYXIga2VybmVsX21vZHVsZXNbTElOVVhfS0VSTkVMX01PRFVMRV9TSVpFICoKKwkJCSAgICBNQVhfS0VSTkVMX01PRFVMRVNfUEVSX1BDSV9ERVZJQ0VdOworCisJLyoKKwkgKiBGb3IgZXZlcnkgZGV0ZWN0ZWQgcGNpIGRldmljZSwgZ3JhYiBpdHMga2VybmVsIG1vZHVsZSB0byBjb21wdXRlCisJICogdGhpcyBzdWJtZW51CisJICovCisJZm9yX2VhY2hfcGNpX2Z1bmMocGNpX2RldmljZSwgaGFyZHdhcmUtPnBjaV9kb21haW4pIHsKKwkgICAgbWVtc2V0KGtlcm5lbF9tb2R1bGVzLCAwLCBzaXplb2Yga2VybmVsX21vZHVsZXMpOworCSAgICBmb3IgKGludCBpID0gMDsKKwkJIGkgPCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudDsgaSsrKSB7CisJCWlmIChpID4gMCkgeworCQkgICAgc3RybmNhdChrZXJuZWxfbW9kdWxlcywgIiB8ICIsIDMpOworCQl9CisJCXN0cm5jYXQoa2VybmVsX21vZHVsZXMsCisJCQlwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZVtpXSwKKwkJCUxJTlVYX0tFUk5FTF9NT0RVTEVfU0laRSAtIDEpOworCSAgICB9CisJICAgIC8qIE5vIG5lZWQgdG8gYWRkIHVua25vd24ga2VybmVsIG1vZHVsZXMgKi8KKwkgICAgaWYgKHN0cmxlbihrZXJuZWxfbW9kdWxlcykgPiAwKSB7CisJCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIiVzICglcykiLAorCQkJIGtlcm5lbF9tb2R1bGVzLCBwY2lfZGV2aWNlLT5kZXZfaW5mby0+Y2xhc3NfbmFtZSk7CisJCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLAorCQkJICIlMDR4OiUwNHggJXMgOiAlcyIsCisJCQkgcGNpX2RldmljZS0+dmVuZG9yLAorCQkJIHBjaV9kZXZpY2UtPnByb2R1Y3QsCisJCQkgcGNpX2RldmljZS0+ZGV2X2luZm8tPnZlbmRvcl9uYW1lLAorCQkJIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5wcm9kdWN0X25hbWUpOworCisJCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwkJbWVudS0+aXRlbXNfY291bnQrKzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwcmludGYoIk1FTlU6IFN1bW1hcnkgbWVudSBkb25lICglZCBpdGVtcylcbiIsIG1lbnUtPml0ZW1zX2NvdW50KTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtbWVudS1zeXNsaW51eC5jIGIvY29tMzIvaGR0L2hkdC1tZW51LXN5c2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkZGYxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtbWVudS1zeXNsaW51eC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgInN5c2xpbnV4L2NvbmZpZy5oIgorI2luY2x1ZGUgImhkdC1tZW51LmgiCisKKy8qIENvbXB1dGluZyBTeXNsaW51eCBtZW51ICovCit2b2lkIGNvbXB1dGVfc3lzbGludXhtZW51KHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBjaGFyIHN5c2xpbnV4X2ZzX21lbnVbMjRdOworICAgIGNoYXIgYnVmZmVyW1NVQk1FTlVMRU4gKyAxXTsKKyAgICBjaGFyIHN0YXRidWZmZXJbU1RBVExFTiArIDFdOworCisgICAgbWVtc2V0KHN5c2xpbnV4X2ZzX21lbnUsIDAsIHNpemVvZiBzeXNsaW51eF9mc19tZW51KTsKKworICAgIHNucHJpbnRmKHN5c2xpbnV4X2ZzX21lbnUsIHNpemVvZiBzeXNsaW51eF9mc19tZW51LCAiICVzICIsCisJICAgICBoYXJkd2FyZS0+c3lzbGludXhfZnMpOworICAgIG1lbnUtPm1lbnUgPSBhZGRfbWVudShzeXNsaW51eF9mc19tZW51LCAtMSk7CisgICAgbWVudS0+aXRlbXNfY291bnQgPSAwOworICAgIHNldF9tZW51X3BvcyhTVUJNRU5VX1ksIFNVQk1FTlVfWCk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJCb290bG9hZGVyIDogJXMiLCBoYXJkd2FyZS0+c3lzbGludXhfZnMpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiQm9vdGxvYWRlcjogJXMiLAorCSAgICAgaGFyZHdhcmUtPnN5c2xpbnV4X2ZzKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlZlcnNpb24gICAgOiAlcyIsCisJICAgICBoYXJkd2FyZS0+c3YtPnZlcnNpb25fc3RyaW5nKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlZlcnNpb246ICVzIiwKKwkgICAgIGhhcmR3YXJlLT5zdi0+dmVyc2lvbl9zdHJpbmcpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVmVyc2lvbiAgICA6ICV1IiwgaGFyZHdhcmUtPnN2LT52ZXJzaW9uKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlZlcnNpb246ICV1IiwKKwkgICAgIGhhcmR3YXJlLT5zdi0+dmVyc2lvbik7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJNYXggQVBJICAgIDogJXUiLCBoYXJkd2FyZS0+c3YtPm1heF9hcGkpOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTWF4IEFQSTogJXUiLAorCSAgICAgaGFyZHdhcmUtPnN2LT5tYXhfYXBpKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIGFkZF9pdGVtKCIiLCAiIiwgT1BUX1NFUCwgIiIsIDApOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiJXMiLCBoYXJkd2FyZS0+c3YtPmNvcHlyaWdodF9zdHJpbmcpOworICAgIC8qIFJlbW92ZSB0aGUgdHJhaWxpbmcgTEYgaW4gdGhlIGNvcHlyaWdodCBzdHJpbmcgdG8gYXZvaWQgc2Nyb2xsaW5nICovCisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICIlcyIsCisJICAgICByZW1vdmVfdHJhaWxpbmdfbGYoKGNoYXIgKiloYXJkd2FyZS0+c3YtPmNvcHlyaWdodF9zdHJpbmcpKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHByaW50ZigiTUVOVTogU3lzbGludXggbWVudSBkb25lICglZCBpdGVtcylcbiIsIG1lbnUtPml0ZW1zX2NvdW50KTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtbWVudS12ZXNhLmMgYi9jb20zMi9oZHQvaGR0LW1lbnUtdmVzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZTA2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LW1lbnUtdmVzYS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgImhkdC1tZW51LmgiCisKKy8qIFN1Ym1lbnUgZm9yIHRoZSB2ZXNhIGNhcmQgKi8KK3N0YXRpYyB2b2lkIGNvbXB1dGVfdmVzYV9jYXJkKHN0cnVjdCBzX215X21lbnUgKm1lbnUsCisJCQkgICAgICBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgY2hhciBidWZmZXJbU1VCTUVOVUxFTiArIDFdOworICAgIGNoYXIgc3RhdGJ1ZmZlcltTVEFUTEVOICsgMV07CisKKyAgICBtZW51LT5tZW51ID0gYWRkX21lbnUoIiBWRVNBIEJpb3MgIiwgLTEpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBzZXRfbWVudV9wb3MoU1VCTUVOVV9ZLCBTVUJNRU5VX1gpOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVkVTQSBWZXJzaW9uOiAlZC4lZCIsCisJICAgICBoYXJkd2FyZS0+dmVzYS5tYWpvcl92ZXJzaW9uLCBoYXJkd2FyZS0+dmVzYS5taW5vcl92ZXJzaW9uKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlZlcnNpb246ICVkLiVkIiwKKwkgICAgIGhhcmR3YXJlLT52ZXNhLm1ham9yX3ZlcnNpb24sIGhhcmR3YXJlLT52ZXNhLm1pbm9yX3ZlcnNpb24pOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiVmVuZG9yICAgICAgOiAlcyIsIGhhcmR3YXJlLT52ZXNhLnZlbmRvcik7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJWZW5kb3IgTmFtZTogJXMiLAorCSAgICAgaGFyZHdhcmUtPnZlc2EudmVuZG9yKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlByb2R1Y3QgICAgIDogJXMiLCBoYXJkd2FyZS0+dmVzYS5wcm9kdWN0KTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlByb2R1Y3QgTmFtZTogJXMiLAorCSAgICAgaGFyZHdhcmUtPnZlc2EucHJvZHVjdCk7CisgICAgYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworICAgIG1lbnUtPml0ZW1zX2NvdW50Kys7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJQcm9kdWN0IFJldi46ICVzIiwKKwkgICAgIGhhcmR3YXJlLT52ZXNhLnByb2R1Y3RfcmV2aXNpb24pOworICAgIHNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiUHJvZHV0IFJldmlzaW9uOiAlcyIsCisJICAgICBoYXJkd2FyZS0+dmVzYS5wcm9kdWN0X3JldmlzaW9uKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIlNvZnR3YXJlIFJldjogJWQiLAorCSAgICAgaGFyZHdhcmUtPnZlc2Euc29mdHdhcmVfcmV2KTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIlNvZnR3YXJlIFJldmlzaW9uOiAlZCIsCisJICAgICBoYXJkd2FyZS0+dmVzYS5zb2Z0d2FyZV9yZXYpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAiTWVtb3J5IChLQikgOiAlZCIsCisJICAgICBoYXJkd2FyZS0+dmVzYS50b3RhbF9tZW1vcnkgKiA2NCk7CisgICAgc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJNZW1vcnkgKEtCKTogJWQiLAorCSAgICAgaGFyZHdhcmUtPnZlc2EudG90YWxfbWVtb3J5ICogNjQpOworICAgIGFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCsrOworfQorCisvKiBTdWJtZW51IGZvciB0aGUgdmVzYSBjYXJkICovCit2b2lkIGNvbXB1dGVfdmVzYV9tb2RlcyhzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisgICAgY2hhciBidWZmZXJbNTZdOworICAgIGNoYXIgc3RhdGJ1ZmZlcltTVEFUTEVOXTsKKworICAgIG1lbnUtPm1lbnUgPSBhZGRfbWVudSgiIFZFU0EgTW9kZXMgIiwgLTEpOworICAgIG1lbnUtPml0ZW1zX2NvdW50ID0gMDsKKyAgICBzZXRfbWVudV9wb3MoU1VCTUVOVV9ZLCBTVUJNRU5VX1gpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFyZHdhcmUtPnZlc2Eudm1pX2NvdW50OyBpKyspIHsKKwlzdHJ1Y3QgdmVzYV9tb2RlX2luZm8gKm1pID0gJmhhcmR3YXJlLT52ZXNhLnZtaVtpXS5taTsKKwkvKiBTb21ldGltZXMsIHZlc2EgYmlvcyByZXBvcnRzIDB4MCBtb2RlcworCSAqIFdlIGRvbid0IG5lZWQgdG8gZGlzcGxheSB0aGF0IG9uZXMgKi8KKwlpZiAoKG1pLT5oX3JlcyA9PSAwKSB8fCAobWktPnZfcmVzID09IDApKQorCSAgICBjb250aW51ZTsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICIlNHUgeCAlNHUgeCAlMnViaXRzIHZnYT0lM2QiLAorCQkgbWktPmhfcmVzLCBtaS0+dl9yZXMsIG1pLT5icHAsCisJCSBoYXJkd2FyZS0+dmVzYS52bWlbaV0ubW9kZSArIDB4MjAwKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIiU0dXglNHV4JTJ1Yml0cyB2Z2E9JTNkIiwKKwkJIG1pLT5oX3JlcywgbWktPnZfcmVzLCBtaS0+YnBwLAorCQkgaGFyZHdhcmUtPnZlc2Eudm1pW2ldLm1vZGUgKyAweDIwMCk7CisJYWRkX2l0ZW0oYnVmZmVyLCBzdGF0YnVmZmVyLCBPUFRfSU5BQ1RJVkUsIE5VTEwsIDApOworCW1lbnUtPml0ZW1zX2NvdW50Kys7CisgICAgfQorfQorCisvKiBNYWluIFZFU0EgTWVudSovCitpbnQgY29tcHV0ZV9WRVNBKHN0cnVjdCBzX2hkdF9tZW51ICpoZHRfbWVudSwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGNoYXIgYnVmZmVyWzE1XTsKKyAgICBjb21wdXRlX3Zlc2FfY2FyZCgmaGR0X21lbnUtPnZlc2FfY2FyZF9tZW51LCBoYXJkd2FyZSk7CisgICAgY29tcHV0ZV92ZXNhX21vZGVzKCZoZHRfbWVudS0+dmVzYV9tb2Rlc19tZW51LCBoYXJkd2FyZSk7CisgICAgaGR0X21lbnUtPnZlc2FfbWVudS5tZW51ID0gYWRkX21lbnUoIiBWRVNBICIsIC0xKTsKKyAgICBoZHRfbWVudS0+dmVzYV9tZW51Lml0ZW1zX2NvdW50ID0gMDsKKworICAgIGFkZF9pdGVtKCJWRVNBIEJpb3MiLCAiVkVTQSBCaW9zIiwgT1BUX1NVQk1FTlUsIE5VTEwsCisJICAgICBoZHRfbWVudS0+dmVzYV9jYXJkX21lbnUubWVudSk7CisgICAgaGR0X21lbnUtPnZlc2FfbWVudS5pdGVtc19jb3VudCsrOworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIiVzICglZCkiLCAiTW9kZXMiLAorCSAgICAgaGFyZHdhcmUtPnZlc2Eudm1pX2NvdW50KTsKKyAgICBhZGRfaXRlbShidWZmZXIsICJWRVNBIE1vZGVzIiwgT1BUX1NVQk1FTlUsIE5VTEwsCisJICAgICBoZHRfbWVudS0+dmVzYV9tb2Rlc19tZW51Lm1lbnUpOworICAgIGhkdF9tZW51LT52ZXNhX21lbnUuaXRlbXNfY291bnQrKzsKKyAgICBwcmludGYoIk1FTlU6IFZFU0EgbWVudSBkb25lICglZCBpdGVtcylcbiIsCisJICAgaGR0X21lbnUtPnZlc2FfbWVudS5pdGVtc19jb3VudCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LW1lbnUtdnBkLmMgYi9jb20zMi9oZHQvaGR0LW1lbnUtdnBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3YTgyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtbWVudS12cGQuYwpAQCAtMCwwICsxLDExNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllciAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAiaGR0LW1lbnUuaCIKKworLyoqCisgKiBjb21wdXRlX3ZwZCAtIGdlbmVyYXRlIHZwZCBtZW51CisgKiovCit2b2lkIGNvbXB1dGVfdnBkKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKyAgICBjaGFyIGJ1ZmZlcltTVUJNRU5VTEVOICsgMV07CisgICAgY2hhciBzdGF0YnVmZmVyW1NUQVRMRU4gKyAxXTsJLyogU3RhdHVzIGJhciAqLworCisgICAgbWVudS0+bWVudSA9IGFkZF9tZW51KCIgVlBEICIsIC0xKTsKKyAgICBtZW51LT5pdGVtc19jb3VudCA9IDA7CisgICAgc2V0X21lbnVfcG9zKFNVQk1FTlVfWSwgU1VCTUVOVV9YKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkFkZHJlc3MgICAgICAgICAgICAgICAgICA6ICVzIiwKKwkgICAgIGhhcmR3YXJlLT52cGQuYmFzZV9hZGRyZXNzKTsKKyAgICBzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkFkZHJlc3M6ICVzIiwKKwkgICAgIGhhcmR3YXJlLT5jcHUudmVuZG9yKTsKKyAgICBhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisgICAgbWVudS0+aXRlbXNfY291bnQrKzsKKworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPnZwZC5iaW9zX2J1aWxkX2lkKSA+IDApIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJCaW9zIEJ1aWxkIElEICAgICAgICAgICAgOiAlcyIsCisJCSBoYXJkd2FyZS0+dnBkLmJpb3NfYnVpbGRfaWQpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiQmlvcyBCdWlsZCBJRDogJXMiLAorCQkgaGFyZHdhcmUtPnZwZC5iaW9zX2J1aWxkX2lkKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoc3RybGVuKGhhcmR3YXJlLT52cGQuYmlvc19yZWxlYXNlX2RhdGUpID4gMCkgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkJpb3MgUmVsZWFzZSBEYXRlICAgICAgICA6ICVzIiwKKwkJIGhhcmR3YXJlLT52cGQuYmlvc19yZWxlYXNlX2RhdGUpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiQmlvcyBSZWxlYXNlIERhdGU6ICVzIiwKKwkJIGhhcmR3YXJlLT52cGQuYmlvc19yZWxlYXNlX2RhdGUpOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPnZwZC5iaW9zX3ZlcnNpb24pID4gMCkgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkJpb3MgVmVyc2lvbiAgICAgICAgICAgICA6ICVzIiwKKwkJIGhhcmR3YXJlLT52cGQuYmlvc192ZXJzaW9uKTsKKwlzbnByaW50ZihzdGF0YnVmZmVyLCBzaXplb2Ygc3RhdGJ1ZmZlciwgIkJpb3MgVmVyc2lvbjogJXMiLAorCQkgaGFyZHdhcmUtPnZwZC5iaW9zX3ZlcnNpb24pOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPnZwZC5kZWZhdWx0X2ZsYXNoX2ZpbGVuYW1lKSA+IDApIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJEZWZhdWx0IEZsYXNoIEZpbGVuYW1lICAgOiAlcyIsCisJCSBoYXJkd2FyZS0+dnBkLmRlZmF1bHRfZmxhc2hfZmlsZW5hbWUpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiRGVmYXVsdCBGbGFzaCBGaWxlbmFtZTogJXMiLAorCQkgaGFyZHdhcmUtPnZwZC5kZWZhdWx0X2ZsYXNoX2ZpbGVuYW1lKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoc3RybGVuKGhhcmR3YXJlLT52cGQuYm94X3NlcmlhbF9udW1iZXIpID4gMCkgeworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIkJveCBTZXJpYWwgTnVtYmVyICAgICAgICA6ICVzIiwKKwkJIGhhcmR3YXJlLT52cGQuYm94X3NlcmlhbF9udW1iZXIpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiQm94IFNlcmlhbCBOdW1iZXI6ICVzIiwKKwkJIGhhcmR3YXJlLT52cGQuYm94X3NlcmlhbF9udW1iZXIpOworCWFkZF9pdGVtKGJ1ZmZlciwgc3RhdGJ1ZmZlciwgT1BUX0lOQUNUSVZFLCBOVUxMLCAwKTsKKwltZW51LT5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUtPnZwZC5tb3RoZXJib2FyZF9zZXJpYWxfbnVtYmVyKSA+IDApIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJNb3RoZXJib2FyZCBTZXJpYWwgTnVtYmVyOiAlcyIsCisJCSBoYXJkd2FyZS0+dnBkLm1vdGhlcmJvYXJkX3NlcmlhbF9udW1iZXIpOworCXNucHJpbnRmKHN0YXRidWZmZXIsIHNpemVvZiBzdGF0YnVmZmVyLCAiTW90aGVyYm9hcmQgU2VyaWFsIE51bWJlcjogJXMiLAorCQkgaGFyZHdhcmUtPnZwZC5tb3RoZXJib2FyZF9zZXJpYWxfbnVtYmVyKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoc3RybGVuKGhhcmR3YXJlLT52cGQubWFjaGluZV90eXBlX21vZGVsKSA+IDApIHsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJNYWNoaW5lIFR5cGUvTW9kZWwgICAgICAgOiAlcyIsCisJCSBoYXJkd2FyZS0+dnBkLm1hY2hpbmVfdHlwZV9tb2RlbCk7CisJc25wcmludGYoc3RhdGJ1ZmZlciwgc2l6ZW9mIHN0YXRidWZmZXIsICJNYWNoaW5lIFR5cGUvTW9kZWw6ICVzIiwKKwkJIGhhcmR3YXJlLT52cGQubWFjaGluZV90eXBlX21vZGVsKTsKKwlhZGRfaXRlbShidWZmZXIsIHN0YXRidWZmZXIsIE9QVF9JTkFDVElWRSwgTlVMTCwgMCk7CisJbWVudS0+aXRlbXNfY291bnQrKzsKKyAgICB9CisKKyAgICBwcmludGYoIk1FTlU6IFZQRCBtZW51IGRvbmUgKCVkIGl0ZW1zKVxuIiwgbWVudS0+aXRlbXNfY291bnQpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC1tZW51LmMgYi9jb20zMi9oZHQvaGR0LW1lbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIzZWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC1tZW51LmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgImhkdC1tZW51LmgiCisKK2ludCBzdGFydF9tZW51X21vZGUoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBjaGFyICp2ZXJzaW9uX3N0cmluZykKK3sKKyAgICBzdHJ1Y3Qgc19oZHRfbWVudSBoZHRfbWVudTsKKworICAgIG1lbXNldCgmaGR0X21lbnUsIDAsIHNpemVvZihoZHRfbWVudSkpOworCisgICAgLyogU2V0dXAgdGhlIG1lbnUgc3lzdGVtICovCisgICAgc2V0dXBfbWVudSh2ZXJzaW9uX3N0cmluZyk7CisKKyAgICAvKiBDb21wdXRlIGFsbCBzdWJtZW51cyAqLworICAgIGNvbXB1dGVfc3VibWVudXMoJmhkdF9tZW51LCBoYXJkd2FyZSk7CisKKyAgICAvKiBDb21wdXRlIHRoZSBtYWluIG1lbnUgKi8KKyAgICBjb21wdXRlX21haW5fbWVudSgmaGR0X21lbnUsIGhhcmR3YXJlKTsKKworI2lmZGVmIFdJVEhfTUVOVV9ESVNQTEFZCisgICAgdF9tZW51aXRlbSAqY3VycjsKKyAgICBjaGFyIGNtZFsxNjBdOworCisgICAgaWYgKCFxdWlldCkKKwltb3JlX3ByaW50ZigiU3RhcnRpbmcgTWVudSAoJWQgbWVudXMpXG4iLCBoZHRfbWVudS50b3RhbF9tZW51X2NvdW50KTsKKyAgICBjdXJyID0gc2hvd21lbnVzKGhkdF9tZW51Lm1haW5fbWVudS5tZW51KTsKKyAgICAvKiBXaGVuIHdlIGV4aXQgdGhlIG1lbnUsIGRvIHdlIGhhdmUgc29tZXRoaW5nIHRvIGRvPyAqLworICAgIGlmIChjdXJyKSB7CisJLyogV2hlbiB3YW50IHRvIGV4ZWN1dGUgc29tZXRoaW5nICovCisJaWYgKGN1cnItPmFjdGlvbiA9PSBPUFRfUlVOKSB7CisJICAgIC8qIFR3ZWFrLCB3ZSB3YW50IHRvIHN3aXRjaCB0byB0aGUgY2xpICovCisJICAgIGlmICghc3RybmNtcAorCQkoY3Vyci0+ZGF0YSwgSERUX1NXSVRDSF9UT19DTEksIHNpemVvZihIRFRfU1dJVENIX1RPX0NMSSkpKSB7CisJCXJldHVybiBIRFRfUkVUVVJOX1RPX0NMSTsKKwkgICAgfQorCSAgICAvKiBUd2Vhaywgd2Ugd2FudCB0byBzdGFydCB0aGUgZHVtcCBtb2RlICovCisJICAgIGlmICghc3RybmNtcAorCQkoY3Vyci0+ZGF0YSwgSERUX0RVTVAsIHNpemVvZihIRFRfRFVNUCkpKSB7CisJCSAgICBkdW1wKGhhcmR3YXJlKTsKKwkgICAgICAgIHJldHVybiAwOworCSAgICB9CisJICAgIGlmICghc3RybmNtcAorCQkoY3Vyci0+ZGF0YSwgSERUX1JFQk9PVCwgc2l6ZW9mKEhEVF9SRUJPT1QpKSkgeworCQlzeXNsaW51eF9yZWJvb3QoMSk7CisJICAgIH0KKwkgICAgc3RyY3B5KGNtZCwgY3Vyci0+ZGF0YSk7CisKKwkgICAgLyogVXNlIHNwZWNpZmljIHN5c2xpbnV4IGNhbGwgaWYgbmVlZGVkICovCisJICAgIGlmIChpc3N5c2xpbnV4KCkpCisJCXJ1bnN5c2xpbnV4Y21kKGNtZCk7CisJICAgIGVsc2UKKwkJY3NwcmludChjbWQsIDB4MDcpOworCSAgICByZXR1cm4gMTsJCS8vIFNob3VsZCBub3QgaGFwcGVuIHdoZW4gcnVuIGZyb20gU1lTTElOVVgKKwl9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEluIHRoZSBtZW51IHN5c3RlbSwgd2hhdCB0byBkbyBvbiBrZXlib2FyZCB0aW1lb3V0ICovCitUSU1FT1VUQ09ERSBvbnRpbWVvdXQodm9pZCkKK3sKKyAgICAvLyBiZWVwKCk7CisgICAgcmV0dXJuIENPREVfV0FJVDsKK30KKworLyogS2V5Ym9hcmQgaGFuZGxlciBmb3IgdGhlIG1lbnUgc3lzdGVtICovCit2b2lkIGtleXNfaGFuZGxlcih0X21lbnVzeXN0ZW0gKiBtcworCQkgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgdF9tZW51aXRlbSAqIG1pLCBpbnQgc2NhbmNvZGUpCit7CisgICAgaW50IG5yLCBuYzsKKworICAgIC8qIDB4RkZGRiBpcyBhbiBpbnZhbGlkIGhlbHBpZCAqLworICAgIGlmIChzY2FuY29kZSA9PSBLRVlfRjEgJiYgbWktPmhlbHBpZCAhPSAweEZGRkYpIHsKKwlydW5oZWxwc3lzdGVtKG1pLT5oZWxwaWQpOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgdXNlciBoaXQgVEFCLCBhbmQgaXRlbSBpcyBhbiAiZXhlY3V0YWJsZSIgaXRlbQorICAgICAqIGFuZCB1c2VyIGhhcyBwcml2aWxlZ2VzIHRvIGVkaXQgaXQsIGVkaXQgaXQgaW4gcGxhY2UuCisgICAgICovCisgICAgaWYgKChzY2FuY29kZSA9PSBLRVlfVEFCKSAmJiAobWktPmFjdGlvbiA9PSBPUFRfUlVOKSkgeworLy8oaXNhbGxvd2VkKHVzZXJuYW1lLCJlZGl0Y21kIikgfHwgaXNhbGxvd2VkKHVzZXJuYW1lLCJyb290IikpKSB7CisJaWYgKGdldHNjcmVlbnNpemUoMSwgJm5yLCAmbmMpKSB7CisJICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisJICAgIG5jID0gODA7CisJICAgIG5yID0gMjQ7CisJfQorCS8qIFVzZXIgdHlwZWQgVEFCIGFuZCBoYXMgcGVybWlzc2lvbnMgdG8gZWRpdCBjb21tYW5kIGxpbmUgKi8KKwlnb3RveHkoRURJVFBST01QVCwgMSk7CisJY3NwcmludCgiQ29tbWFuZCBsaW5lOiIsIDB4MDcpOworCWVkaXRzdHJpbmcobWktPmRhdGEsIEFDVElPTkxFTik7CisJZ290b3h5KEVESVRQUk9NUFQsIDEpOworCWNwcmludCgnICcsIDB4MDcsIG5jIC0gMSk7CisgICAgfQorfQorCisvKiBTZXR1cCB0aGUgTWVudSBzeXN0ZW0gKi8KK3ZvaWQgc2V0dXBfbWVudShjaGFyICp2ZXJzaW9uKQoreworICAgIC8qIENyZWF0aW5nIHRoZSBtZW51ICovCisgICAgaW5pdF9tZW51c3lzdGVtKHZlcnNpb24pOworICAgIHNldF93aW5kb3dfc2l6ZSgwLCAwLCAyNSwgODApOworCisgICAgLyogRG8gbm90IHVzZSBpbmFjdGl2ZSBhdHRyaWJ1dGVzIC0gdGhleSBtYWtlIGxpdHRsZSBzZW5zZSBmb3IgSERUICovCisgICAgc2V0X25vcm1hbF9hdHRyKC0xLCAtMSwgMHgxNywgMHgxRik7CisKKyAgICAvKiBSZWdpc3RlciB0aGUgbWVudXN5c3RlbSBoYW5kbGVyICovCisgICAgLy8gcmVnX2hhbmRsZXIoSERMUl9TQ1JFRU4sJm1zeXNfaGFuZGxlcik7CisgICAgcmVnX2hhbmRsZXIoSERMUl9LRVlTLCAma2V5c19oYW5kbGVyKTsKKworICAgIC8qIFJlZ2lzdGVyIHRoZSBvbnRpbWVvdXQgaGFuZGxlciwgd2l0aCBhIHRpbWUgb3V0IG9mIDEwIHNlY29uZHMgKi8KKyAgICByZWdfb250aW1lb3V0KG9udGltZW91dCwgMTAwMCwgMCk7Cit9CisKKy8qIENvbXB1dGUgTWFpbicgc3VibWVudXMgKi8KK3ZvaWQgY29tcHV0ZV9zdWJtZW51cyhzdHJ1Y3Qgc19oZHRfbWVudSAqaGR0X21lbnUsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSkKK3sKKworICAgIC8qIENvbXB1dGUgdGhpcyBtZW51IGlmIGEgRE1JIHRhYmxlIGV4aXN0cyAqLworICAgIGlmIChoYXJkd2FyZS0+aXNfZG1pX3ZhbGlkKSB7CisJaWYgKGhhcmR3YXJlLT5kbWkuaXBtaS5maWxsZWQgPT0gdHJ1ZSkKKwkgICAgY29tcHV0ZV9pcG1pKCZoZHRfbWVudS0+aXBtaV9tZW51LCAmaGFyZHdhcmUtPmRtaSk7CisJaWYgKGhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5maWxsZWQgPT0gdHJ1ZSkKKwkgICAgY29tcHV0ZV9tb3RoZXJib2FyZCgmKGhkdF9tZW51LT5tb2JvX21lbnUpLCAmKGhhcmR3YXJlLT5kbWkpKTsKKwlpZiAoaGFyZHdhcmUtPmRtaS5jaGFzc2lzLmZpbGxlZCA9PSB0cnVlKQorCSAgICBjb21wdXRlX2NoYXNzaXMoJihoZHRfbWVudS0+Y2hhc3Npc19tZW51KSwgJihoYXJkd2FyZS0+ZG1pKSk7CisJaWYgKGhhcmR3YXJlLT5kbWkuc3lzdGVtLmZpbGxlZCA9PSB0cnVlKQorCSAgICBjb21wdXRlX3N5c3RlbSgmKGhkdF9tZW51LT5zeXN0ZW1fbWVudSksICYoaGFyZHdhcmUtPmRtaSkpOworCWNvbXB1dGVfbWVtb3J5KGhkdF9tZW51LCAmKGhhcmR3YXJlLT5kbWkpLCBoYXJkd2FyZSk7CisJaWYgKGhhcmR3YXJlLT5kbWkuYmlvcy5maWxsZWQgPT0gdHJ1ZSkKKwkgICAgY29tcHV0ZV9iaW9zKCYoaGR0X21lbnUtPmJpb3NfbWVudSksICYoaGFyZHdhcmUtPmRtaSkpOworCWlmIChoYXJkd2FyZS0+ZG1pLmJhdHRlcnkuZmlsbGVkID09IHRydWUpCisJICAgIGNvbXB1dGVfYmF0dGVyeSgmKGhkdF9tZW51LT5iYXR0ZXJ5X21lbnUpLCAmKGhhcmR3YXJlLT5kbWkpKTsKKyAgICB9CisKKyAgICBjb21wdXRlX3Byb2Nlc3NvcigmKGhkdF9tZW51LT5jcHVfbWVudSksIGhhcmR3YXJlKTsKKyAgICBjb21wdXRlX3ZwZCgmKGhkdF9tZW51LT52cGRfbWVudSksIGhhcmR3YXJlKTsKKyAgICBjb21wdXRlX2Rpc2tzKGhkdF9tZW51LCBoYXJkd2FyZSk7CisKKyAgICBjb21wdXRlX1BDSShoZHRfbWVudSwgaGFyZHdhcmUpOworICAgIGNvbXB1dGVfUFhFKCYoaGR0X21lbnUtPnB4ZV9tZW51KSwgaGFyZHdhcmUpOworICAgIGNvbXB1dGVfa2VybmVsKCYoaGR0X21lbnUtPmtlcm5lbF9tZW51KSwgaGFyZHdhcmUpOworICAgIAorICAgIGNvbXB1dGVfc3VtbWFyeW1lbnUoJihoZHRfbWVudS0+c3VtbWFyeV9tZW51KSwgaGFyZHdhcmUpOworICAgIGNvbXB1dGVfc3lzbGludXhtZW51KCYoaGR0X21lbnUtPnN5c2xpbnV4X21lbnUpLCBoYXJkd2FyZSk7CisgICAgY29tcHV0ZV9WRVNBKGhkdF9tZW51LCBoYXJkd2FyZSk7CisgICAgY29tcHV0ZV9BQ1BJKGhkdF9tZW51LCBoYXJkd2FyZSk7CisgICAgY29tcHV0ZV9hYm91dG1lbnUoJihoZHRfbWVudS0+YWJvdXRfbWVudSkpOworfQorCit2b2lkIGNvbXB1dGVfbWFpbl9tZW51KHN0cnVjdCBzX2hkdF9tZW51ICpoZHRfbWVudSwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKQoreworICAgIGNoYXIgbWVudV9pdGVtWzY0XTsKKyAgICAvKiBMZXQncyBjb3VudCB0aGUgbnVtYmVyIG9mIG1lbnVzIHdlIGhhdmUgKi8KKyAgICBoZHRfbWVudS0+dG90YWxfbWVudV9jb3VudCA9IDA7CisgICAgaGR0X21lbnUtPm1haW5fbWVudS5pdGVtc19jb3VudCA9IDA7CisKKyAgICBoZHRfbWVudS0+bWFpbl9tZW51Lm1lbnUgPSBhZGRfbWVudSgiIE1haW4gTWVudSAiLCAtMSk7CisgICAgc2V0X2l0ZW1fb3B0aW9ucygtMSwgMjQpOworCisgICAgc25wcmludGYobWVudV9pdGVtLCBzaXplb2YobWVudV9pdGVtKSwgIlBDPEk+IERldmljZXMoJTJkKVxuIiwKKwkgICAgIGhhcmR3YXJlLT5uYl9wY2lfZGV2aWNlcyk7CisgICAgYWRkX2l0ZW0obWVudV9pdGVtLCAiUENJIERldmljZXMgTWVudSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCSAgICAgaGR0X21lbnUtPnBjaV9tZW51Lm1lbnUpOworICAgIGhkdF9tZW51LT5tYWluX21lbnUuaXRlbXNfY291bnQrKzsKKyAgICBoZHRfbWVudS0+dG90YWxfbWVudV9jb3VudCArPSBoZHRfbWVudS0+cGNpX21lbnUuaXRlbXNfY291bnQ7CisgICAgCisgICAgaWYgKGhkdF9tZW51LT5kaXNrX21lbnUuaXRlbXNfY291bnQgPiAwKSB7CisJc25wcmludGYobWVudV9pdGVtLCBzaXplb2YobWVudV9pdGVtKSwgIjxEPmlza3MgICAgICAoJTJkKVxuIiwKKwkJIGhkdF9tZW51LT5kaXNrX21lbnUuaXRlbXNfY291bnQpOworCWFkZF9pdGVtKG1lbnVfaXRlbSwgIkRpc2tzIE1lbnUiLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkJIGhkdF9tZW51LT5kaXNrX21lbnUubWVudSk7CisJaGR0X21lbnUtPm1haW5fbWVudS5pdGVtc19jb3VudCsrOworCWhkdF9tZW51LT50b3RhbF9tZW51X2NvdW50ICs9IGhkdF9tZW51LT5kaXNrX21lbnUuaXRlbXNfY291bnQ7CisgICAgfQorCisgICAgc25wcmludGYobWVudV9pdGVtLCBzaXplb2YobWVudV9pdGVtKSwgIjxNPmVtb3J5XG4iKTsKKyAgICBhZGRfaXRlbShtZW51X2l0ZW0sICJNZW1vcnkgTWVudSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCSAgICAgaGR0X21lbnUtPm1lbW9yeV9tZW51Lm1lbnUpOworICAgIGhkdF9tZW51LT5tYWluX21lbnUuaXRlbXNfY291bnQrKzsKKyAgICBoZHRfbWVudS0+dG90YWxfbWVudV9jb3VudCArPSBoZHRfbWVudS0+bWVtb3J5X21lbnUuaXRlbXNfY291bnQ7CisKKyAgICBhZGRfaXRlbSgiPFA+cm9jZXNzb3IiLCAiTWFpbiBQcm9jZXNzb3IgTWVudSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCSAgICAgaGR0X21lbnUtPmNwdV9tZW51Lm1lbnUpOworICAgIGhkdF9tZW51LT5tYWluX21lbnUuaXRlbXNfY291bnQrKzsKKworICAgIGlmIChoYXJkd2FyZS0+aXNfZG1pX3ZhbGlkKSB7CisJaWYgKGhhcmR3YXJlLT5kbWkuYmFzZV9ib2FyZC5maWxsZWQgPT0gdHJ1ZSkgeworCSAgICBhZGRfaXRlbSgiTTxvPnRoZXJib2FyZCIsICJNb3RoZXJib2FyZCBNZW51IiwKKwkJICAgICBPUFRfU1VCTUVOVSwgTlVMTCwgaGR0X21lbnUtPm1vYm9fbWVudS5tZW51KTsKKwkgICAgaGR0X21lbnUtPm1haW5fbWVudS5pdGVtc19jb3VudCsrOworCX0KKworCWlmIChoYXJkd2FyZS0+ZG1pLmJpb3MuZmlsbGVkID09IHRydWUpIHsKKwkgICAgYWRkX2l0ZW0oIjxCPmlvcyIsICJCaW9zIE1lbnUiLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkJICAgICBoZHRfbWVudS0+Ymlvc19tZW51Lm1lbnUpOworCSAgICBoZHRfbWVudS0+bWFpbl9tZW51Lml0ZW1zX2NvdW50Kys7CisJfQorCisJaWYgKGhhcmR3YXJlLT5kbWkuY2hhc3Npcy5maWxsZWQgPT0gdHJ1ZSkgeworCSAgICBhZGRfaXRlbSgiPEM+aGFzc2lzIiwgIkNoYXNzaXMgTWVudSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCQkgICAgIGhkdF9tZW51LT5jaGFzc2lzX21lbnUubWVudSk7CisJICAgIGhkdF9tZW51LT5tYWluX21lbnUuaXRlbXNfY291bnQrKzsKKwl9CisKKwlpZiAoaGFyZHdhcmUtPmRtaS5zeXN0ZW0uZmlsbGVkID09IHRydWUpIHsKKwkgICAgYWRkX2l0ZW0oIjxTPnlzdGVtIiwgIlN5c3RlbSBNZW51IiwgT1BUX1NVQk1FTlUsIE5VTEwsCisJCSAgICAgaGR0X21lbnUtPnN5c3RlbV9tZW51Lm1lbnUpOworCSAgICBoZHRfbWVudS0+bWFpbl9tZW51Lml0ZW1zX2NvdW50Kys7CisJfQorCisJaWYgKGhhcmR3YXJlLT5kbWkuYmF0dGVyeS5maWxsZWQgPT0gdHJ1ZSkgeworCSAgICBhZGRfaXRlbSgiQmE8dD50ZXJ5IiwgIkJhdHRlcnkgTWVudSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCQkgICAgIGhkdF9tZW51LT5iYXR0ZXJ5X21lbnUubWVudSk7CisJICAgIGhkdF9tZW51LT5tYWluX21lbnUuaXRlbXNfY291bnQrKzsKKwl9CisJaWYgKGhhcmR3YXJlLT5kbWkuaXBtaS5maWxsZWQgPT0gdHJ1ZSkgeworCSAgICBhZGRfaXRlbSgiSTxQPk1JIiwgIklQTUkgTWVudSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCQkgICAgIGhkdF9tZW51LT5pcG1pX21lbnUubWVudSk7CisJICAgIGhkdF9tZW51LT5tYWluX21lbnUuaXRlbXNfY291bnQrKzsKKwl9CisgICAgfQorCisgICAgaWYgKGhhcmR3YXJlLT5pc192cGRfdmFsaWQgPT0gdHJ1ZSkgeworCWFkZF9pdGVtKCI8Vj5QRCIsICJWUEQgSW5mb3JtYXRpb24gTWVudSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCQkgaGR0X21lbnUtPnZwZF9tZW51Lm1lbnUpOworCWhkdF9tZW51LT5tYWluX21lbnUuaXRlbXNfY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoaGFyZHdhcmUtPmlzX3B4ZV92YWxpZCA9PSB0cnVlKSB7CisJYWRkX2l0ZW0oIlA8WD5FIiwgIlBYRSBJbmZvcm1hdGlvbiBNZW51IiwgT1BUX1NVQk1FTlUsIE5VTEwsCisJCSBoZHRfbWVudS0+cHhlX21lbnUubWVudSk7CisJaGR0X21lbnUtPm1haW5fbWVudS5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIGlmIChoYXJkd2FyZS0+aXNfdmVzYV92YWxpZCA9PSB0cnVlKSB7CisJYWRkX2l0ZW0oIjxWPkVTQSIsICJWRVNBIEluZm9ybWF0aW9uIE1lbnUiLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkJIGhkdF9tZW51LT52ZXNhX21lbnUubWVudSk7CisJaGR0X21lbnUtPm1haW5fbWVudS5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIGlmIChoYXJkd2FyZS0+aXNfYWNwaV92YWxpZCA9PSB0cnVlKSB7CisJYWRkX2l0ZW0oIjxBPkNQSSIsICJBQ1BJIE1lbnUiLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkJIGhkdF9tZW51LT5hY3BpX21lbnUubWVudSk7CisJaGR0X21lbnUtPm1haW5fbWVudS5pdGVtc19jb3VudCsrOworICAgIH0KKworICAgIGFkZF9pdGVtKCIiLCAiIiwgT1BUX1NFUCwgIiIsIDApOworICAgIAorICAgIGlmICgoaGFyZHdhcmUtPm1vZHVsZXNfcGNpbWFwX3JldHVybl9jb2RlICE9IC1FTk9NT0RVTEVTUENJTUFQKSB8fAorCShoYXJkd2FyZS0+bW9kdWxlc19hbGlhc19yZXR1cm5fY29kZSAhPSAtRU5PTU9EVUxFU0FMSUFTKSkgeworCWFkZF9pdGVtKCI8Sz5lcm5lbCBNb2R1bGVzIiwgIktlcm5lbCBNb2R1bGVzIE1lbnUiLCBPUFRfU1VCTUVOVSwKKwkJIE5VTEwsIGhkdF9tZW51LT5rZXJuZWxfbWVudS5tZW51KTsKKwloZHRfbWVudS0+bWFpbl9tZW51Lml0ZW1zX2NvdW50Kys7CisgICAgfQorICAgIAorICAgIGFkZF9pdGVtKCJTPHk+c2xpbnV4IiwgIlN5c2xpbnV4IEluZm9ybWF0aW9uIE1lbnUiLCBPUFRfU1VCTUVOVSwgTlVMTCwKKwkgICAgIGhkdF9tZW51LT5zeXNsaW51eF9tZW51Lm1lbnUpOworICAgIGhkdF9tZW51LT5tYWluX21lbnUuaXRlbXNfY291bnQrKzsKKyAgICBhZGRfaXRlbSgiUzx1Pm1tYXJ5IiwgIlN1bW1hcnkgSW5mb3JtYXRpb24gTWVudSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCSAgICAgaGR0X21lbnUtPnN1bW1hcnlfbWVudS5tZW51KTsKKyAgICBoZHRfbWVudS0+bWFpbl9tZW51Lml0ZW1zX2NvdW50Kys7CisKKyAgICBhZGRfaXRlbSgiIiwgIiIsIE9QVF9TRVAsICIiLCAwKTsKKworICAgIGFkZF9pdGVtKCJTPHc+aXRjaCB0byBDTEkiLCAiU3dpdGNoIHRvIENvbW1hbmQgTGluZSIsIE9QVF9SVU4sCisJICAgICBIRFRfU1dJVENIX1RPX0NMSSwgMCk7CisKKyAgICBpZiAoaGFyZHdhcmUtPmlzX3B4ZV92YWxpZCA9PSB0cnVlKSB7CisgICAgYWRkX2l0ZW0oIjxEPnVtcCB0byB0ZnRwIiwgIkR1bXAgdG8gdGZ0cCIsIE9QVF9SVU4sCisJICAgICBIRFRfRFVNUCwgMCk7CisgICAgfQorCisgICAgYWRkX2l0ZW0oIjxBPmJvdXQiLCAiQWJvdXQgTWVudSIsIE9QVF9TVUJNRU5VLCBOVUxMLAorCSAgICAgaGR0X21lbnUtPmFib3V0X21lbnUubWVudSk7CisgICAgYWRkX2l0ZW0oIjxSPmVib290IiwgIlJlYm9vdCIsIE9QVF9SVU4sIEhEVF9SRUJPT1QsIDApOworICAgIGFkZF9pdGVtKCJFPHg+aXQiLCAiRXhpdCIsIE9QVF9FWElUTUVOVSwgTlVMTCwgMCk7CisgICAgaGR0X21lbnUtPm1haW5fbWVudS5pdGVtc19jb3VudCsrOworCisgICAgaGR0X21lbnUtPnRvdGFsX21lbnVfY291bnQgKz0gaGR0X21lbnUtPm1haW5fbWVudS5pdGVtc19jb3VudDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQtbWVudS5oIGIvY29tMzIvaGR0L2hkdC1tZW51LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyMDNkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQtbWVudS5oCkBAIC0wLDAgKzEsMTQwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgREVGSU5FX0hEVF9NRU5VX0gKKyNkZWZpbmUgREVGSU5FX0hEVF9NRU5VX0gKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdldGtleS5oPgorCisjaW5jbHVkZSAibWVudS5oIgorI2luY2x1ZGUgImhlbHAuaCIKKy8vI2luY2x1ZGUgImNwdWlkLmgiCisjaW5jbHVkZSAic3lzL3BjaS5oIgorI2luY2x1ZGUgImhkdC1jb21tb24uaCIKKyNpbmNsdWRlICJkbWkvZG1pLmgiCisjaW5jbHVkZSAiaGR0LWF0YS5oIgorCisjZGVmaW5lIEVESVRQUk9NUFQgMjEKKworI2RlZmluZSBTVUJNRU5VTEVOIDQ2CisKKyNkZWZpbmUgU1VCTUVOVV9ZIDMKKyNkZWZpbmUgU1VCTUVOVV9YIDI5CisKKyNkZWZpbmUgTUFYX1BDSV9TVUJfTUVOVSAxMjgKKyNkZWZpbmUgTUFYX01FTU9SWV9TVUJfTUVOVSAzMgorI2RlZmluZSBNQVhfRElTS19TVUJfTUVOVSAzMgorCitzdHJ1Y3Qgc19teV9tZW51IHsKKyAgICB1bnNpZ25lZCBjaGFyIG1lbnU7CisgICAgaW50IGl0ZW1zX2NvdW50OworfTsKKworc3RydWN0IHNfaGR0X21lbnUgeworICAgIHN0cnVjdCBzX215X21lbnUgbWFpbl9tZW51OworICAgIHN0cnVjdCBzX215X21lbnUgY3B1X21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBtb2JvX21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBjaGFzc2lzX21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBiaW9zX21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBpcG1pX21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBzeXN0ZW1fbWVudTsKKyAgICBzdHJ1Y3Qgc19teV9tZW51IHBjaV9tZW51OworICAgIHN0cnVjdCBzX215X21lbnUgcGNpX3N1Yl9tZW51W01BWF9QQ0lfU1VCX01FTlVdOworICAgIHN0cnVjdCBzX215X21lbnUga2VybmVsX21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBtZW1vcnlfbWVudTsKKyAgICBzdHJ1Y3Qgc19teV9tZW51IG1lbW9yeV9zdWJfbWVudVtNQVhfTUVNT1JZX1NVQl9NRU5VXTsKKyAgICBzdHJ1Y3Qgc19teV9tZW51IGRpc2tfbWVudTsKKyAgICBzdHJ1Y3Qgc19teV9tZW51IGRpc2tfc3ViX21lbnVbTUFYX0RJU0tfU1VCX01FTlVdOworICAgIHN0cnVjdCBzX215X21lbnUgYmF0dGVyeV9tZW51OworICAgIHN0cnVjdCBzX215X21lbnUgc3lzbGludXhfbWVudTsKKyAgICBzdHJ1Y3Qgc19teV9tZW51IGFib3V0X21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBzdW1tYXJ5X21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBweGVfbWVudTsKKyAgICBzdHJ1Y3Qgc19teV9tZW51IHZlc2FfbWVudTsKKyAgICBzdHJ1Y3Qgc19teV9tZW51IHZlc2FfY2FyZF9tZW51OworICAgIHN0cnVjdCBzX215X21lbnUgdmVzYV9tb2Rlc19tZW51OworICAgIHN0cnVjdCBzX215X21lbnUgdnBkX21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBhY3BpX21lbnU7CisgICAgc3RydWN0IHNfbXlfbWVudSBhY3BpX2FwaWNfbWVudTsKKyAgICBzdHJ1Y3Qgc19teV9tZW51IGFjcGlfdGFibGVzX21lbnU7CisgICAgaW50IHRvdGFsX21lbnVfY291bnQ7CS8vIFN1bSBvZiBhbGwgbWVudXMgd2UgaGF2ZQorfTsKKworVElNRU9VVENPREUgb250aW1lb3V0KHZvaWQpOwordm9pZCBrZXlzX2hhbmRsZXIodF9tZW51c3lzdGVtICogbXMKKwkJICBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIHRfbWVudWl0ZW0gKiBtaSwgaW50IHNjYW5jb2RlKTsKKworLy8gUENJIFN0dWZmCitpbnQgY29tcHV0ZV9QQ0koc3RydWN0IHNfaGR0X21lbnUgKmhkdF9tZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworCisvLyBLRVJORUwgU3R1ZmYKK3ZvaWQgY29tcHV0ZV9rZXJuZWwoc3RydWN0IHNfbXlfbWVudSAqbWVudSwgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKKworLy8gRGlzayBTdHVmZgordm9pZCBjb21wdXRlX2Rpc2tzKHN0cnVjdCBzX2hkdF9tZW51ICptZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworCisvLyBETUkgU3R1ZmYKK3ZvaWQgY29tcHV0ZV9tb3RoZXJib2FyZChzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzX2RtaSAqIGRtaSk7Cit2b2lkIGNvbXB1dGVfYmF0dGVyeShzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzX2RtaSAqIGRtaSk7Cit2b2lkIGNvbXB1dGVfc3lzdGVtKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHNfZG1pICogZG1pKTsKK3ZvaWQgY29tcHV0ZV9jaGFzc2lzKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHNfZG1pICogZG1pKTsKK3ZvaWQgY29tcHV0ZV9iaW9zKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHNfZG1pICogZG1pKTsKK3ZvaWQgY29tcHV0ZV9tZW1vcnkoc3RydWN0IHNfaGR0X21lbnUgKm1lbnUsIHNfZG1pICogZG1pLAorCQkgICAgc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlKTsKK3ZvaWQgY29tcHV0ZV9pcG1pKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHNfZG1pICogZG1pKTsKKworLy8gVlBEIFN0dWZmCit2b2lkIGNvbXB1dGVfdnBkKHN0cnVjdCBzX215X21lbnUgKm1lbnUsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7CisKKy8vIFByb2Nlc3NvciBTdHVmZgordm9pZCBjb21wdXRlX3Byb2Nlc3NvcihzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworCisvLyBTeXNsaW51eCBzdHVmZgordm9pZCBjb21wdXRlX3N5c2xpbnV4bWVudShzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworCisvLyBBYm91dCBtZW51Cit2b2lkIGNvbXB1dGVfYWJvdXRtZW51KHN0cnVjdCBzX215X21lbnUgKm1lbnUpOworCisvLyBTdW1tYXJ5IG1lbnUKK3ZvaWQgY29tcHV0ZV9zdW1tYXJ5bWVudShzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworCisvLyBQWEUgbWVudQordm9pZCBjb21wdXRlX1BYRShzdHJ1Y3Qgc19teV9tZW51ICptZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworCisvL1ZFU0EgbWVudQoraW50IGNvbXB1dGVfVkVTQShzdHJ1Y3Qgc19oZHRfbWVudSAqaGR0X21lbnUsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7CisKKy8vIEFDUEkgbWVudQoraW50IGNvbXB1dGVfQUNQSShzdHJ1Y3Qgc19oZHRfbWVudSAqaGR0X21lbnUsIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7CisKK2ludCBzdGFydF9tZW51X21vZGUoc3RydWN0IHNfaGFyZHdhcmUgKmhhcmR3YXJlLCBjaGFyICp2ZXJzaW9uX3N0cmluZyk7Cit2b2lkIHNldHVwX21lbnUoY2hhciAqdmVyc2lvbik7Cit2b2lkIGNvbXB1dGVfbWFpbl9tZW51KHN0cnVjdCBzX2hkdF9tZW51ICpoZHRfbWVudSwKKwkJICAgICAgIHN0cnVjdCBzX2hhcmR3YXJlICpoYXJkd2FyZSk7Cit2b2lkIGNvbXB1dGVfc3VibWVudXMoc3RydWN0IHNfaGR0X21lbnUgKmhkdF9tZW51LCBzdHJ1Y3Qgc19oYXJkd2FyZSAqaGFyZHdhcmUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LXV0aWwuYyBiL2NvbTMyL2hkdC9oZHQtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZDc0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9oZHQvaGR0LXV0aWwuYwpAQCAtMCwwICsxLDk2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBQaWVycmUtQWxleGFuZHJlIE1leWVyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBDb21wdXRpbmcgZGl2KHgseSkgKi8KKyNkZWZpbmUgc3ViKHZhbCkgKCgodmFsJTEwMjQpKjEwMCk+PjEwKQorI2RlZmluZSBzdWJfZGVjKHZhbCkgKCgodmFsJTEwMDApKjEwMCkvMTAwMCkKKwordm9pZCBzZWN0b3JzX3RvX3NpemUoaW50IHNlY3RvcnMsIGNoYXIgKmJ1ZmZlcikKK3sKKyAgICBpbnQgYiA9IChzZWN0b3JzIC8gMik7CisgICAgaW50IG1pYiA9IGIgPj4gMTA7CisgICAgaW50IGdpYiA9IG1pYiA+PiAxMDsKKyAgICBpbnQgdGliID0gZ2liID4+IDEwOworCisgICAgaWYgKHRpYiA+IDApCisJc3ByaW50ZihidWZmZXIsICIlM2QuJTAyZCBUaUIiLCB0aWIsc3ViKGdpYikpOworICAgIGVsc2UgaWYgKGdpYiA+IDApCisJc3ByaW50ZihidWZmZXIsICIlM2QuJTAyZCBHaUIiLCBnaWIsc3ViKG1pYikpOworICAgIGVsc2UgaWYgKG1pYiA+IDApCisJc3ByaW50ZihidWZmZXIsICIlM2QuJTAyZCBNaUIiLCBtaWIsc3ViKGIpKTsKKyAgICBlbHNlCisJc3ByaW50ZihidWZmZXIsICIlZCBCIiwgYik7Cit9CisKK3ZvaWQgc2VjdG9yc190b19zaXplX2RlYyhjaGFyICpwcmV2aW91c191bml0LCBpbnQgKnByZXZpb3VzX3NpemUsIGNoYXIgKnVuaXQsCisJCQkgaW50ICpzaXplLCBpbnQgc2VjdG9ycykKK3sKKyAgICAqc2l6ZSA9IHNlY3RvcnMgLyAyOwkvLyBDb252ZXJ0aW5nIHRvIGJ5dGVzCisgICAgc3RybGNweSh1bml0LCAiS0IiLCAyKTsKKyAgICBzdHJsY3B5KHByZXZpb3VzX3VuaXQsIHVuaXQsIDIpOworICAgICpwcmV2aW91c19zaXplID0gKnNpemU7CisgICAgaWYgKCpzaXplID4gMTAwMCkgeworCSpzaXplID0gKnNpemUgLyAxMDAwOworCXN0cmxjcHkodW5pdCwgIk1CIiwgMik7CisJaWYgKCpzaXplID4gMTAwMCkgeworCSAgICAqcHJldmlvdXNfc2l6ZSA9ICpzaXplOworCSAgICAqc2l6ZSA9ICpzaXplIC8gMTAwMDsKKwkgICAgc3RybGNweShwcmV2aW91c191bml0LCB1bml0LCAyKTsKKwkgICAgc3RybGNweSh1bml0LCAiR0IiLCAyKTsKKwkgICAgaWYgKCpzaXplID4gMTAwMCkgeworCQkqcHJldmlvdXNfc2l6ZSA9ICpzaXplOworCQkqc2l6ZSA9ICpzaXplIC8gMTAwMDsKKwkJc3RybGNweShwcmV2aW91c191bml0LCB1bml0LCAyKTsKKwkJc3RybGNweSh1bml0LCAiVEIiLCAyKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgaHVtYW4gcmVhZGFibGUgc2l6ZSBvZiBkZXZpY2UKKyAqIFRoaXMgZnVuY3Rpb24gYXZvaWQgZGlzaydzIHNpemUgcm91bmRpbmcgd2hpbGUKKyAqIG5vdCB1c2luZyBmbG9hdCBhcyB0aGV5IGFyZW4ndCBjdXJyZW50bHkgc3VwcG9ydGVkICovCit2b2lkIHNlY3RvcnNfdG9fc2l6ZV9kZWMyKGludCBzZWN0b3JzLCBjaGFyICpidWZmZXIpCit7CisgICAgaW50IGIgPSAoc2VjdG9ycyAvIDIpOworICAgIGludCBtaWIgPSBiIC8gMTAwMDsKKyAgICBpbnQgZ2liID0gbWliIC8gMTAwMDsKKyAgICBpbnQgdGliID0gZ2liIC8gMTAwMDsKKworICAgIGlmICh0aWIgPiAwKQorCXNwcmludGYoYnVmZmVyLCAiJTNkLiUwMmQgVEIiLCB0aWIsc3ViX2RlYyhnaWIpKTsKKyAgICBlbHNlIGlmIChnaWIgPiAwKQorCXNwcmludGYoYnVmZmVyLCAiJTNkLiUwMmQgR0IiLCBnaWIsc3ViX2RlYyhtaWIpKTsKKyAgICBlbHNlIGlmIChtaWIgPiAwKQorCXNwcmludGYoYnVmZmVyLCAiJTNkLiUwMmQgTUIiLCBtaWIsc3ViX2RlYyhiKSk7CisgICAgZWxzZQorCXNwcmludGYoYnVmZmVyLCAiJWQgQiIsIGIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaGR0L2hkdC11dGlsLmggYi9jb20zMi9oZHQvaGR0LXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTM3NjllCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC11dGlsLmgKQEAgLTAsMCArMSwzNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllciAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIERFRklORV9IRFRfVVRJTF9ICisjZGVmaW5lIERFRklORV9IRFRfVVRJTF9ICit2b2lkIHNlY3RvcnNfdG9fc2l6ZShpbnQsIGNoYXIgKik7Cit2b2lkIHNlY3RvcnNfdG9fc2l6ZV9kZWMoY2hhciAqLCBpbnQgKiwgY2hhciAqLCBpbnQgKiwgaW50KTsKK3ZvaWQgc2VjdG9yc190b19zaXplX2RlYzIoaW50IHNlY3RvcnMsIGNoYXIgKmJ1ZmZlcik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2hkdC9oZHQuYyBiL2NvbTMyL2hkdC9oZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2IzYWIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaGR0L2hkdC5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIGhkdC5jCisgKgorICogQW4gSGFyZHdhcmUgRGV0ZWN0aW9uIFRvb2wKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJoZHQuaCIKKyNpbmNsdWRlICJoZHQtY2xpLmgiCisjaW5jbHVkZSAiaGR0LW1lbnUuaCIKKyNpbmNsdWRlICJoZHQtY29tbW9uLmgiCisKK2ludCBkaXNwbGF5X2xpbmVfbmIgPSAwOworYm9vbCBkaXNhYmxlX21vcmVfcHJpbnRmID0gZmFsc2U7CisKKy8qIERlZmluZXMgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgY29uc29sZQorICogRGVmYXVsdCBpcyAyMCBmb3IgYSBzdGQgY29uc29sZSAqLworaW50IG1heF9jb25zb2xlX2xpbmVzID0gTUFYX0NMSV9MSU5FUzsKKworaW50IG1haW4oY29uc3QgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBjaGFyIHZlcnNpb25fc3RyaW5nWzI1Nl07CisgICAgc3RhdGljIHN0cnVjdCBzX2hhcmR3YXJlIGhhcmR3YXJlOworCisgICAgc25wcmludGYodmVyc2lvbl9zdHJpbmcsIHNpemVvZiB2ZXJzaW9uX3N0cmluZywgIiVzICVzICglcykiLAorCSAgICAgUFJPRFVDVF9OQU1FLCBWRVJTSU9OLCBDT0RFTkFNRSk7CisKKyAgICAvKiBDbGVhbmluZyBzdHJ1Y3R1cmVzICovCisgICAgaW5pdF9oYXJkd2FyZSgmaGFyZHdhcmUpOworCisgICAgLyogRGV0ZWN0aW5nIFN5c2xpbnV4IHZlcnNpb24gKi8KKyAgICBkZXRlY3Rfc3lzbGludXgoJmhhcmR3YXJlKTsKKworICAgIC8qIERldGVjdGluZyBwYXJhbWV0ZXJzICovCisgICAgZGV0ZWN0X3BhcmFtZXRlcnMoYXJnYywgYXJndiwgJmhhcmR3YXJlKTsKKworICAgIC8qIE9wZW5pbmcgdGhlIFN5c2xpbnV4IGNvbnNvbGUgKi8KKyAgICBpbml0X2NvbnNvbGUoJmhhcmR3YXJlKTsKKworICAgIC8qIERldGVjdCBoYXJkd2FyZSAqLworICAgIGRldGVjdF9oYXJkd2FyZSgmaGFyZHdhcmUpOworCisgICAgLyogQ2xlYXIgdGhlIHNjcmVlbiBhbmQgcmVzZXQgcG9zaXRpb24gb2YgdGhlIGN1cnNvciAqLworICAgIGNsZWFyX3NjcmVlbigpOworICAgIHByaW50ZigiXDAzM1sxOzFIIik7CisKKyAgICBtb3JlX3ByaW50ZigiJXNcbiIsIHZlcnNpb25fc3RyaW5nKTsKKworICAgIGludCByZXR1cm5fY29kZSA9IDA7CisKKyAgICBpZiAoIW1lbnVtb2RlIHx8IGF1dG9tb2RlKQorCXN0YXJ0X2NsaV9tb2RlKCZoYXJkd2FyZSk7CisgICAgZWxzZSB7CisJcmV0dXJuX2NvZGUgPSBzdGFydF9tZW51X21vZGUoJmhhcmR3YXJlLCB2ZXJzaW9uX3N0cmluZyk7CisJaWYgKHJldHVybl9jb2RlID09IEhEVF9SRVRVUk5fVE9fQ0xJKQorCSAgICBzdGFydF9jbGlfbW9kZSgmaGFyZHdhcmUpOworICAgIH0KKworICAgIC8qIERvIHdlIGdvdCByZXF1ZXN0IHRvIGRvIHNvbWV0aGluZyBhdCBleGl0IHRpbWUgPyAqLworICAgIGlmIChzdHJsZW4oaGFyZHdhcmUucG9zdGV4ZWMpPjApIHsKKwkgICAgbW9yZV9wcmludGYoIkV4ZWN1dGluZyBwb3N0ZXhlYyBpbnN0cnVjdGlvbnMgOiAlc1xuIixoYXJkd2FyZS5wb3N0ZXhlYyk7CisJICAgIHJ1bnN5c2xpbnV4Y21kKGhhcmR3YXJlLnBvc3RleGVjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dXJuX2NvZGU7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9oZHQvaGR0LmggYi9jb20zMi9oZHQvaGR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4NTQxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2hkdC9oZHQuaApAQCAtMCwwICsxLDQ3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgREVGSU5FX0hEVF9ICisjZGVmaW5lIERFRklORV9IRFRfSAorCisjZGVmaW5lIFBST0RVQ1RfTkFNRSAiSGFyZHdhcmUgRGV0ZWN0aW9uIFRvb2wiCisjZGVmaW5lIEFVVEhPUiAiRXJ3YW4gVmVsdSIKKyNkZWZpbmUgQ09SRV9ERVZFTE9QRVIgIlBpZXJyZS1BbGV4YW5kcmUgTWV5ZXIiCisjZGVmaW5lIENPTlRBQ1QgImhkdEB6eXRvci5jb20iCisjZGVmaW5lIFZFUlNJT04gIjAuNS4yIgorI2RlZmluZSBDT0RFTkFNRSAiTWFub24iCisjZGVmaW5lIE5CX0NPTlRSSUJVVE9SUyAzCisjZGVmaW5lIENPTlRSSUJVVE9SUyB7IlNlYmFzdGllbiBHb256YWx2ZSAoUGF0Y2hlcykiLCAiR2VydCBIdWxzZWxtYW5zIChUZXN0cykiLCAiQWxleGFuZGVyIEFuZGlubyAoRGVzaWduKSJ9CisjZGVmaW5lIFdFQlNJVEVfVVJMICJodHRwOi8vaGR0LXByb2plY3Qub3JnIgorI2RlZmluZSBJUkNfQ0hBTk5FTCAiI2hkdCBvbiBmcmVlbm9kZSIKKworI2RlZmluZSBBVFRSX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorCisjZGVmaW5lIFdJVEhfTUVOVV9ESVNQTEFZIDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2FsbG9jYS5oIGIvY29tMzIvaW5jbHVkZS9hbGxvY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQwNjdmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9hbGxvY2EuaApAQCAtMCwwICsxLDEyIEBACisvKgorICogYWxsb2NhLmgKKyAqCisgKiBKdXN0IGNhbGwgdGhlIGJ1aWx0aW4gYWxsb2NhKCkgZnVuY3Rpb24KKyAqLworCisjaWZuZGVmIF9BTExPQ0FfSAorI2RlZmluZSBfQUxMT0NBX0gKKworI2RlZmluZSBhbGxvY2Eoc2l6ZSkgX19idWlsdGluX2FsbG9jYShzaXplKQorCisjZW5kaWYgLyogX0FMTE9DQV9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2Fzc2VydC5oIGIvY29tMzIvaW5jbHVkZS9hc3NlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzAzYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9hc3NlcnQuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX0FTU0VSVF9ICisjZGVmaW5lIF9BU1NFUlRfSAorCisvKiBBc3NlcnQgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgYXNzZXJ0KFgpICgodm9pZCkwKQorCisjZW5kaWYgLyogX0FTU0VSVF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2JpdHNpemUvbGltaXRzLmggYi9jb20zMi9pbmNsdWRlL2JpdHNpemUvbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyOWM0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZS9saW1pdHMuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogYml0czMyL2xpbWl0cy5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRV9MSU1JVFNfSAorI2RlZmluZSBfQklUU0laRV9MSU1JVFNfSAorCisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKyNpbmNsdWRlIDxiaXRzaXplMzIvbGltaXRzLmg+CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAorI2luY2x1ZGUgPGJpdHNpemU2NC9saW1pdHMuaD4KKyNlbHNlCisjZXJyb3IgIlVuYWJsZSB0byBidWlsZCBmb3IgdG8tYmUtZGVmaW5lZCBhcmNoaXRlY3R1cmUgdHlwZSIKKyNlbmRpZgorCisjZW5kaWYgLyogX0JJVFNJWkVfTElNSVRTX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvYml0c2l6ZS9zdGRkZWYuaCBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZS9zdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQxOGEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9iaXRzaXplL3N0ZGRlZi5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBJbmNsdWRlIHN0ZGRlZi5oIGFzIGFwcHJvcHJpYXRlIGZvciBhcmNoaXRlY3R1cmUKKyAqLworCisjaWZuZGVmIF9CSVRTSVpFX1NURERFRl9ICisjZGVmaW5lIF9CSVRTSVpFX1NURERFRl9ICisKKyNpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gNAorI2luY2x1ZGUgPGJpdHNpemUzMi9zdGRkZWYuaD4KKyNlbGlmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA4CisjaW5jbHVkZSA8Yml0c2l6ZTY0L3N0ZGRlZi5oPgorI2Vsc2UKKyNlcnJvciAiVW5hYmxlIHRvIGJ1aWxkIGZvciB0by1iZS1kZWZpbmVkIGFyY2hpdGVjdHVyZSB0eXBlIgorI2VuZGlmCisKKyNlbmRpZiAvKiBfQklUU0laRV9TVERERUZfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9iaXRzaXplL3N0ZGludC5oIGIvY29tMzIvaW5jbHVkZS9iaXRzaXplL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2IyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2JpdHNpemUvc3RkaW50LmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGJpdHMzMi9zdGRpbnQuaAorICovCisKKyNpZm5kZWYgX0JJVFNJWkVfU1RESU5UX0gKKyNkZWZpbmUgX0JJVFNJWkVfU1RESU5UX0gKKwordHlwZWRlZiBzaWduZWQgY2hhcgkJaW50OF90OwordHlwZWRlZiBzaG9ydCBpbnQJCWludDE2X3Q7Cit0eXBlZGVmIGludAkJCWludDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50CXVpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnQzMl90OworCisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKyNpbmNsdWRlIDxiaXRzaXplMzIvc3RkaW50Lmg+CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAorI2luY2x1ZGUgPGJpdHNpemU2NC9zdGRpbnQuaD4KKyNlbHNlCisjZXJyb3IgIlVuYWJsZSB0byBidWlsZCBmb3IgdG8tYmUtZGVmaW5lZCBhcmNoaXRlY3R1cmUgdHlwZSIKKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9CSVRTSVpFX1NURElOVF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2JpdHNpemUvc3RkaW50Y29uc3QuaCBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZS9zdGRpbnRjb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjMxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2JpdHNpemUvc3RkaW50Y29uc3QuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogYml0c2l6ZS9zdGRpbnRjb25zdC5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRV9TVERJTlRDT05TVF9ICisjZGVmaW5lIF9CSVRTSVpFX1NURElOVENPTlNUX0gKKworI2lmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA0CisjaW5jbHVkZSA8Yml0c2l6ZTMyL3N0ZGludGNvbnN0Lmg+CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAorI2luY2x1ZGUgPGJpdHNpemU2NC9zdGRpbnRjb25zdC5oPgorI2Vsc2UKKyNlcnJvciAiVW5hYmxlIHRvIGJ1aWxkIGZvciB0by1iZS1kZWZpbmVkIGFyY2hpdGVjdHVyZSB0eXBlIgorI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfQklUU0laRV9TVERJTlRDT05TVF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2JpdHNpemUvc3RkaW50bGltaXRzLmggYi9jb20zMi9pbmNsdWRlL2JpdHNpemUvc3RkaW50bGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0MmM0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZS9zdGRpbnRsaW1pdHMuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogYml0c2l6ZS9zdGRpbnRsaW1pdHMuaAorICovCisKKyNpZm5kZWYgX0JJVFNJWkVfU1RESU5UTElNSVRTX0gKKyNkZWZpbmUgX0JJVFNJWkVfU1RESU5UTElNSVRTX0gKKworI2lmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA0CisjaW5jbHVkZSA8Yml0c2l6ZTMyL3N0ZGludGxpbWl0cy5oPgorI2VsaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDgKKyNpbmNsdWRlIDxiaXRzaXplNjQvc3RkaW50bGltaXRzLmg+CisjZWxzZQorI2Vycm9yICJVbmFibGUgdG8gYnVpbGQgZm9yIHRvLWJlLWRlZmluZWQgYXJjaGl0ZWN0dXJlIHR5cGUiCisjZW5kaWYKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX1NURElOVExJTUlUU19IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2JpdHNpemUzMi9saW1pdHMuaCBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZTMyL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTIwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2JpdHNpemUzMi9saW1pdHMuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYml0czMyL2xpbWl0cy5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRTMyX0xJTUlUU19ICisjZGVmaW5lIF9CSVRTSVpFMzJfTElNSVRTX0gKKworI2RlZmluZSBMT05HX0JJVAkzMgorCisjZGVmaW5lIExPTkdfTUlOCSgtMjE0NzQ4MzY0N0wtMSkKKyNkZWZpbmUgTE9OR19NQVgJMjE0NzQ4MzY0N0wKKyNkZWZpbmUgVUxPTkdfTUFYCTQyOTQ5NjcyOTVVTAorCisjZW5kaWYJCQkJLyogX0JJVFNJWkVfTElNSVRTX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvYml0c2l6ZTMyL3N0ZGRlZi5oIGIvY29tMzIvaW5jbHVkZS9iaXRzaXplMzIvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0YzY3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZTMyL3N0ZGRlZi5oCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIGJpdHMzMi9zdGRkZWYuaAorICovCisKKyNkZWZpbmUgX1NJWkVfVAordHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OworCisjZGVmaW5lIF9QVFJESUZGX1QKK3R5cGVkZWYgc2lnbmVkIGxvbmcgcHRyZGlmZl90OwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9iaXRzaXplMzIvc3RkaW50LmggYi9jb20zMi9pbmNsdWRlL2JpdHNpemUzMi9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM2OTcwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9iaXRzaXplMzIvc3RkaW50LmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIGJpdHMzMi9zdGRpbnQuaAorICovCisKKwordHlwZWRlZiBsb25nIGxvbmcgaW50CQlpbnQ2NF90OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJdWludDY0X3Q7CisKK3R5cGVkZWYgaW50CQkJaW50X2Zhc3QxNl90OwordHlwZWRlZiBpbnQJCQlpbnRfZmFzdDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnRfZmFzdDMyX3Q7CisKK3R5cGVkZWYgaW50CQkJaW50cHRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludHB0cl90OworCisjZGVmaW5lIF9fSU5UNjRfQyhjKSAgIGMgIyMgTEwKKyNkZWZpbmUgX19VSU5UNjRfQyhjKSAgYyAjIyBVTEwKKworI2RlZmluZSBfX1BSSTY0X1JBTksgICAibGwiCisjZGVmaW5lIF9fUFJJRkFTVF9SQU5LICIiCisjZGVmaW5lIF9fUFJJUFRSX1JBTksgICIiCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2JpdHNpemUzMi9zdGRpbnRjb25zdC5oIGIvY29tMzIvaW5jbHVkZS9iaXRzaXplMzIvc3RkaW50Y29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVjZTQyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9iaXRzaXplMzIvc3RkaW50Y29uc3QuaApAQCAtMCwwICsxLDEzIEBACisvKgorICogYml0czMyL3N0ZGludGNvbnN0LmgKKyAqLworCisjZGVmaW5lIElOVF9GQVNUMTZfQyhjKQkgSU5UMzJfQyhjKQorI2RlZmluZSBJTlRfRkFTVDMyX0MoYykgIElOVDMyX0MoYykKKworI2RlZmluZSBVSU5UX0ZBU1QxNl9DKGMpIFVJTlQzMl9DKGMpCisjZGVmaW5lIFVJTlRfRkFTVDMyX0MoYykgVUlOVDMyX0MoYykKKworI2RlZmluZSBJTlRQVFJfQyhjKQkgSU5UMzJfQyhjKQorI2RlZmluZSBVSU5UUFRSX0MoYykJIFVJTlQzMl9DKGMpCisjZGVmaW5lIFBUUkRJRkZfQyhjKSAgICAgSU5UMzJfQyhjKQpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9iaXRzaXplMzIvc3RkaW50bGltaXRzLmggYi9jb20zMi9pbmNsdWRlL2JpdHNpemUzMi9zdGRpbnRsaW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzVjZGNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9iaXRzaXplMzIvc3RkaW50bGltaXRzLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGJpdHMzMi9zdGRpbnRsaW1pdHMuaAorICovCisKKyNkZWZpbmUgSU5UX0ZBU1QxNl9NSU4JSU5UMzJfTUlOCisjZGVmaW5lIElOVF9GQVNUMzJfTUlOCUlOVDMyX01JTgorI2RlZmluZSBJTlRfRkFTVDE2X01BWAlJTlQzMl9NQVgKKyNkZWZpbmUgSU5UX0ZBU1QzMl9NQVgJSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDE2X01BWCBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDMyX01BWCBVSU5UMzJfTUFYCisKKyNkZWZpbmUgSU5UUFRSX01JTglJTlQzMl9NSU4KKyNkZWZpbmUgSU5UUFRSX01BWAlJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVFBUUl9NQVgJVUlOVDMyX01BWAorCisjZGVmaW5lIFBUUkRJRkZfTUlOCUlOVDMyX01JTgorI2RlZmluZSBQVFJESUZGX01BWAlJTlQzMl9NQVgKKworLyogc2lnX2F0b21pY190IGxpbWl0ICovCisjIGRlZmluZSBTSUdfQVRPTUlDX01JTiAgICAgICAgIElOVDMyX01JTiAvLygtMjE0NzQ4MzY0Ny0xKQorIyBkZWZpbmUgU0lHX0FUT01JQ19NQVggICAgICAgICBJTlQzMl9NQVggLy8oMjE0NzQ4MzY0NykKKy8qIHNpemVfdCBsaW1pdCAqLworIyBkZWZpbmUgU0laRV9NQVgJCVVJTlQzMl9NQVggLy8oNDI5NDk2NzI5NVUpCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9saW1pdHMuaCBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZTY0L2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhY2IxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9saW1pdHMuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYml0czY0L2xpbWl0cy5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRTY0X0xJTUlUU19ICisjZGVmaW5lIF9CSVRTSVpFNjRfTElNSVRTX0gKKworI2RlZmluZSBMT05HX0JJVAk2NAorCisjZGVmaW5lIExPTkdfTUlOCSgtOTIyMzM3MjAzNjg1NDc3NTgwN0wtMSkKKyNkZWZpbmUgTE9OR19NQVgJOTIyMzM3MjAzNjg1NDc3NTgwN0wKKyNkZWZpbmUgVUxPTkdfTUFYCTE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX0xJTUlUU19IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9zdGRkZWYuaCBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZTY0L3N0ZGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWJmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9zdGRkZWYuaApAQCAtMCwwICsxLDEwIEBACisvKgorICogYml0czY0L3N0ZGRlZi5oCisgKi8KKworI2RlZmluZSBfU0laRV9UCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2l6ZV90OworCisjZGVmaW5lIF9QVFJESUZGX1QKK3R5cGVkZWYgc2lnbmVkIGxvbmcgcHRyZGlmZl90OworCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9zdGRpbnQuaCBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZTY0L3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTMwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9zdGRpbnQuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogYml0czY0L3N0ZGludC5oCisgKi8KKworCit0eXBlZGVmIGxvbmcgaW50CQlpbnQ2NF90OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnQ2NF90OworCit0eXBlZGVmIGxvbmcgaW50CQlpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGxvbmcgaW50CQlpbnRfZmFzdDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludF9mYXN0MzJfdDsKKwordHlwZWRlZiBsb25nIGludAkJaW50cHRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnRwdHJfdDsKKworI2RlZmluZSBfX0lOVDY0X0MoYykgIGMgIyMgTAorI2RlZmluZSBfX1VJTlQ2NF9DKGMpIGMgIyMgVUwKKworI2RlZmluZSBfX1BSSTY0X1JBTksJImwiCisjZGVmaW5lIF9fUFJJRkFTVF9SQU5LICAibCIKKyNkZWZpbmUgX19QUklQVFJfUkFOSwkibCIKZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvYml0c2l6ZTY0L3N0ZGludGNvbnN0LmggYi9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9zdGRpbnRjb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOWFiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9zdGRpbnRjb25zdC5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBiaXRzNjQvc3RkaW50Y29uc3QuaAorICovCisKKyNkZWZpbmUgSU5UX0ZBU1QxNl9DKGMpCSBJTlQ2NF9DKGMpCisjZGVmaW5lIElOVF9GQVNUMzJfQyhjKSAgSU5UNjRfQyhjKQorCisjZGVmaW5lIFVJTlRfRkFTVDE2X0MoYykgVUlOVDY0X0MoYykKKyNkZWZpbmUgVUlOVF9GQVNUMzJfQyhjKSBVSU5UNjRfQyhjKQorCisjZGVmaW5lIElOVFBUUl9DKGMpCSBJTlQ2NF9DKGMpCisjZGVmaW5lIFVJTlRQVFJfQyhjKQkgVUlOVDY0X0MoYykKKyNkZWZpbmUgUFRSRElGRl9DKGMpICAgICBJTlQ2NF9DKGMpCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9zdGRpbnRsaW1pdHMuaCBiL2NvbTMyL2luY2x1ZGUvYml0c2l6ZTY0L3N0ZGludGxpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NzVhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2JpdHNpemU2NC9zdGRpbnRsaW1pdHMuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogYml0czY0L3N0ZGludGxpbWl0cy5oCisgKi8KKworI2RlZmluZSBJTlRfRkFTVDE2X01JTglJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UX0ZBU1QzMl9NSU4JSU5UNjRfTUlOCisjZGVmaW5lIElOVF9GQVNUMTZfTUFYCUlOVDY0X01BWAorI2RlZmluZSBJTlRfRkFTVDMyX01BWAlJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUMTZfTUFYIFVJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUMzJfTUFYIFVJTlQ2NF9NQVgKKworI2RlZmluZSBJTlRQVFJfTUlOCUlOVDY0X01JTgorI2RlZmluZSBJTlRQVFJfTUFYCUlOVDY0X01BWAorI2RlZmluZSBVSU5UUFRSX01BWAlVSU5UNjRfTUFYCisKKyNkZWZpbmUgUFRSRElGRl9NSU4JSU5UNjRfTUlOCisjZGVmaW5lIFBUUkRJRkZfTUFYCUlOVDY0X01BWAorCisvKiBzaWdfYXRvbWljX3QgbGltaXQgKi8KKyMgZGVmaW5lIFNJR19BVE9NSUNfTUFYICAgICAgICAgSU5UMzJfTUFYIC8vKDIxNDc0ODM2NDcpCisjIGRlZmluZSBTSUdfQVRPTUlDX01JTiAgICAgICAgICgtU0lHX0FUT01JQ19NQVgtMSkgLy8oLTIxNDc0ODM2NDctMSkKKy8qIHNpemVfdCBsaW1pdCAqLworIyBkZWZpbmUgU0laRV9NQVgJCVVJTlQ2NF9NQVgKZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvYnVmcHJpbnRmLmggYi9jb20zMi9pbmNsdWRlL2J1ZnByaW50Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYmVhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2J1ZnByaW50Zi5oCkBAIC0wLDAgKzEsMTAgQEAKKyNkZWZpbmUgQlVGUEFECTQwOTYKKworc3RydWN0IHByaW50X2J1ZiB7CisgICAgY2hhciAqYnVmOworICAgIHNpemVfdCBsZW47CisgICAgc2l6ZV90IHNpemU7Cit9OworCitpbnQgdmJ1ZnByaW50ZihzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CitpbnQgYnVmcHJpbnRmKHN0cnVjdCBwcmludF9idWYgKmJ1ZiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9ieXRlc3dhcC5oIGIvY29tMzIvaW5jbHVkZS9ieXRlc3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjJjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2J5dGVzd2FwLmgKQEAgLTAsMCArMSwxODAgQEAKKyNpZm5kZWYgX0JZVEVTV0FQX0gKKyNkZWZpbmUgX0JZVEVTV0FQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGtsaWJjL2VuZGlhbi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisKKy8qIFRoaXMgYXNzdW1lcyBhbiBpMzg2IHBsYXRmb3JtICovCisKKyNkZWZpbmUgX19ic3dhcF8xNl9tYWNybyh2KSAoKHVpbnQxNl90KQkJICAJCQlcCisJCQkgICAgICgoKHVpbnQxNl90KSh2KSA8PCA4KSB8IAkJCVwKKwkJCSAgICAgICgodWludDE2X3QpKHYpID4+IDgpKSkKKworc3RhdGljIGlubGluZSBfX2NvbnN0ZnVuYyB1aW50MTZfdCBfX2Jzd2FwXzE2KHVpbnQxNl90IHYpCit7CisgICAgcmV0dXJuIF9fYnN3YXBfMTZfbWFjcm8odik7Cit9CisKKyNkZWZpbmUgYnN3YXBfMTYoeCkgKF9fYnVpbHRpbl9jb25zdGFudF9wKHgpID8JCQkJXAorCQkJX19ic3dhcF8xNl9tYWNybyh4KSA6IF9fYnN3YXBfMTYoeCkpCisKKyNkZWZpbmUgX19ic3dhcF8zMl9tYWNybyh2KSAoKHVpbnQzMl90KQkJCQkJXAorCQkJICAgICAoKCgodWludDMyX3QpKHYpICYgMHgwMDAwMDBmZikgPDwgMjQpIHwJXAorCQkJICAgICAgKCgodWludDMyX3QpKHYpICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwJXAorCQkJICAgICAoKCh1aW50MzJfdCkodikgJiAweDAwZmYwMDAwKSA+PiA4KSAgfAlcCisJCQkgICAgICAoKCh1aW50MzJfdCkodikgJiAweGZmMDAwMDAwKSA+PiAyNCkpKQorCitzdGF0aWMgaW5saW5lIF9fY29uc3RmdW5jIHVpbnQzMl90IF9fYnN3YXBfMzIodWludDMyX3QgdikKK3sKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisgICAgYXNtKCJic3dhcCAlMCIgOiAiK3IiICh2KSk7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorICAgIGFzbSgieGNoZ2IgJWgwLCViMCA7IHJvbGwgJDE2LCUwIDsgeGNoZ2IgJWgwLCViMCIKKwk6ICIrcSIgKHYpKTsKKyNlbHNlCisgICAgdiA9IF9fYnN3YXBfMzJfbWFjcm8odik7CisjZW5kaWYKKyAgICByZXR1cm4gdjsKK30KKworI2RlZmluZSBic3dhcF8zMih4KSAoX19idWlsdGluX2NvbnN0YW50X3AoeCkgPwkJCQlcCisJCQkgX19ic3dhcF8zMl9tYWNybyh4KSA6IF9fYnN3YXBfMzIoeCkpCisKKworI2RlZmluZSBfX2Jzd2FwXzY0X21hY3JvKHYpICgodWludDY0X3QpCQkJCQlcCisgICAgKCgodWludDY0X3QpX19ic3dhcF8zMl9tYWNybygodWludDMyX3QpKHYpKSA8PCAzMikgfAkJXAorICAgICAoX19ic3dhcF8zMl9tYWNybygodWludDMyX3QpKCh1aW50NjRfdCkodikgPj4gMzIpKSkpKQorCitzdGF0aWMgaW5saW5lIF9fY29uc3RmdW5jIHVpbnQ2NF90IF9fYnN3YXBfNjQodWludDY0X3QgdikKK3sKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisgICAgYXNtKCJic3dhcCAlMCIgOiAiK3IiICh2KSk7CisjZWxzZQorICAgIHYgPSAoKHVpbnQ2NF90KV9fYnN3YXBfMzIodikgPDwgMzIpIHwgX19ic3dhcF8zMih2ID4+IDMyKTsKKyNlbmRpZgorICAgIHJldHVybiB2OworfQorCisjZGVmaW5lIGJzd2FwXzY0KHgpIChfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSA/IAkJCQlcCisJCQlfX2Jzd2FwXzY0X21hY3JvKHgpIDogIF9fYnN3YXBfNjQoeCkpCisKKy8qIFRoaXMgaXMgZ2VuZXJpYyAqLworCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCisjZGVmaW5lIGJlMTZfdG9fY3B1KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIGNwdV90b19iZTE2KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIGNwdV90b19iZTMyKHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIGJlNjRfdG9fY3B1KHgpIGJzd2FwXzY0KHgpCisjZGVmaW5lIGNwdV90b19iZTY0KHgpIGJzd2FwXzY0KHgpCisKKyNkZWZpbmUgbGUxNl90b19jcHUoeCkgKHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpICh4KQorI2RlZmluZSBsZTMyX3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMzIoeCkgKHgpCisjZGVmaW5lIGxlNjRfdG9fY3B1KHgpICh4KQorI2RlZmluZSBjcHVfdG9fbGU2NCh4KSAoeCkKKworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCisjZGVmaW5lIGxlMTZfdG9fY3B1KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIGxlMzJfdG9fY3B1KHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIGNwdV90b19sZTMyKHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIGxlNjRfdG9fY3B1KHgpIGJzd2FwXzY0KHgpCisjZGVmaW5lIGNwdV90b19sZTY0KHgpIGJzd2FwXzY0KHgpCisKKyNkZWZpbmUgYmUxNl90b19jcHUoeCkgKHgpCisjZGVmaW5lIGNwdV90b19iZTE2KHgpICh4KQorI2RlZmluZSBiZTMyX3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgY3B1X3RvX2JlMzIoeCkgKHgpCisjZGVmaW5lIGJlNjRfdG9fY3B1KHgpICh4KQorI2RlZmluZSBjcHVfdG9fYmU2NCh4KSAoeCkKKworI2Vsc2UKKworI2Vycm9yICJVbmtub3duIGJ5dGUgb3JkZXIhIgorCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeyB1aW50MTZfdCB4OyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIF9fdWFfdWludDE2X3Q7Cit0eXBlZGVmIHN0cnVjdCB7IHVpbnQzMl90IHg7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgX191YV91aW50MzJfdDsKK3R5cGVkZWYgc3RydWN0IHsgdWludDY0X3QgeDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBfX3VhX3VpbnQ2NF90OworCisvKiBUaGVzZSBhcmUgZ3VhcmFudGVlZCB0byBzdXBwb3J0IHVuYWxpZ25lZCBhY2Nlc3NlcyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdCBnZXRfbGUxNihjb25zdCB1aW50MTZfdCAqcCkKK3sKKyAgICBjb25zdCBfX3VhX3VpbnQxNl90ICp1cCA9IChjb25zdCBfX3VhX3VpbnQxNl90ICopcDsKKyAgICByZXR1cm4gbGUxNl90b19jcHUodXAtPngpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF9sZTMyKGNvbnN0IHVpbnQzMl90ICpwKQoreworICAgIGNvbnN0IF9fdWFfdWludDMyX3QgKnVwID0gKGNvbnN0IF9fdWFfdWludDMyX3QgKilwOworICAgIHJldHVybiBsZTMyX3RvX2NwdSh1cC0+eCk7Cit9ICAgIAorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGdldF9sZTY0KGNvbnN0IHVpbnQ2NF90ICpwKQoreworICAgIGNvbnN0IF9fdWFfdWludDY0X3QgKnVwID0gKGNvbnN0IF9fdWFfdWludDY0X3QgKilwOworICAgIHJldHVybiBsZTY0X3RvX2NwdSh1cC0+eCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgZ2V0X2JlMTYoY29uc3QgdWludDE2X3QgKnApCit7CisgICAgY29uc3QgX191YV91aW50MTZfdCAqdXAgPSAoY29uc3QgX191YV91aW50MTZfdCAqKXA7CisgICAgcmV0dXJuIGJlMTZfdG9fY3B1KHVwLT54KTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfYmUzMihjb25zdCB1aW50MzJfdCAqcCkKK3sKKyAgICBjb25zdCBfX3VhX3VpbnQzMl90ICp1cCA9IChjb25zdCBfX3VhX3VpbnQzMl90ICopcDsKKyAgICByZXR1cm4gYmUzMl90b19jcHUodXAtPngpOworfSAgICAKKworc3RhdGljIGlubGluZSB1aW50NjRfdCBnZXRfYmU2NChjb25zdCB1aW50NjRfdCAqcCkKK3sKKyAgICBjb25zdCBfX3VhX3VpbnQ2NF90ICp1cCA9IChjb25zdCBfX3VhX3VpbnQ2NF90ICopcDsKKyAgICByZXR1cm4gYmU2NF90b19jcHUodXAtPngpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2xlMTYodWludDE2X3QgdiwgdWludDE2X3QgKnApCit7CisgICAgX191YV91aW50MTZfdCAqdXAgPSAoX191YV91aW50MTZfdCAqKXA7CisgICAgdXAtPnggPSBjcHVfdG9fbGUxNih2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9sZTMyKHVpbnQzMl90IHYsIHVpbnQzMl90ICpwKQoreworICAgIF9fdWFfdWludDMyX3QgKnVwID0gKF9fdWFfdWludDMyX3QgKilwOworICAgIHVwLT54ID0gY3B1X3RvX2xlMzIodik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbGU2NCh1aW50NjRfdCB2LCB1aW50NjRfdCAqcCkKK3sKKyAgICBfX3VhX3VpbnQ2NF90ICp1cCA9IChfX3VhX3VpbnQ2NF90ICopcDsKKyAgICB1cC0+eCA9IGNwdV90b19sZTY0KHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2JlMTYodWludDE2X3QgdiwgdWludDE2X3QgKnApCit7CisgICAgX191YV91aW50MTZfdCAqdXAgPSAoX191YV91aW50MTZfdCAqKXA7CisgICAgdXAtPnggPSBjcHVfdG9fYmUxNih2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9iZTMyKHVpbnQzMl90IHYsIHVpbnQzMl90ICpwKQoreworICAgIF9fdWFfdWludDMyX3QgKnVwID0gKF9fdWFfdWludDMyX3QgKilwOworICAgIHVwLT54ID0gY3B1X3RvX2JlMzIodik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfYmU2NCh1aW50NjRfdCB2LCB1aW50NjRfdCAqcCkKK3sKKyAgICBfX3VhX3VpbnQ2NF90ICp1cCA9IChfX3VhX3VpbnQ2NF90ICopcDsKKyAgICB1cC0+eCA9IGNwdV90b19iZTY0KHYpOworfQorCisjZW5kaWYgLyogX0JZVEVTV0FQX0ggKi8KKwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9jbGkuaCBiL2NvbTMyL2luY2x1ZGUvY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlNDU3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvY2xpLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBDTElfSAorI2RlZmluZSBDTElfSAorCisjZGVmaW5lIE1BWF9DTURfSElTVE9SWSA2NAorI2RlZmluZSBDT01NQU5EX0RFTElNCQkiIFx0XG4iCS8vIFdoaXRlc3BhY2UgZGVsaW1pdGVycworI2RlZmluZSBNQVhfQ09NTUFORF9BUkdTCTQwCisKK3N0cnVjdCBjbGlfY29tbWFuZCB7CisgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworICAgIGNoYXIgKmNvbW1hbmQ7Cit9OworCitleHRlcm4gdm9pZCBjbGVhcl9zY3JlZW4odm9pZCk7CitleHRlcm4gaW50IG15Z2V0a2V5KGNsb2NrX3QgdGltZW91dCk7CitleHRlcm4gY29uc3QgY2hhciAqZWRpdF9jbWRsaW5lKGNvbnN0IGNoYXIgKmlucHV0LCBpbnQgdG9wIC8qLCBpbnQgd2lkdGggKi8gLAorCQkJCWludCAoKnBEcmF3X01lbnUpIChpbnQsIGludCwgaW50KSwKKwkJCQl2b2lkICgqc2hvd19ma2V5KSAoaW50KSwgYm9vbCAqKTsKKworZXh0ZXJuIHN0cnVjdCBtZW51ICpyb290X21lbnUsICpzdGFydF9tZW51LCAqaGlkZV9tZW51LCAqbWVudV9saXN0LCAqZGVmYXVsdF9tZW51OworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2NvbG9ydGJsLmggYi9jb20zMi9pbmNsdWRlL2NvbG9ydGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmMGExMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvY29sb3J0YmwuaApAQCAtMCwwICsxLDUzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNi0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9DT0xPUlRCTF9ICisjZGVmaW5lIF9DT0xPUlRCTF9ICisKKy8qIEF0dHJpYnV0ZS9jb2xvciB0YWJsZSB1c2VkIGJ5IGFuc2ljb24gYW5kIHZlc2Fjb24gdG8gYWJzdHJhY3QKKyAgIG91dCB0aGUgY29sb3Igc2VsZWN0aW9uLiAqLworCisvKiBOb3RlOiB2ZXNhY29uIHJlbGllcyBvbiB0aGUgZW5jb2Rpbmcgb2YgdGhlc2UgbnVtYmVycyAqLworZW51bSBjb2xvcl90YWJsZV9zaGFkb3cgeworICAgIFNIQURPV19OT05FID0gMCwKKyAgICBTSEFET1dfQUxMID0gMSwKKyAgICBTSEFET1dfTk9STUFMID0gMiwKKyAgICBTSEFET1dfUkVWRVJTRSA9IDMsCit9OworCitzdHJ1Y3QgY29sb3JfdGFibGUgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBBdHRyaWJ1dGUgbmFtZSAodXNlZCBmb3IgY3VzdG9taXphdGlvbikgKi8KKyAgICBjb25zdCBjaGFyICphbnNpOwkJLyogQU5TSSBhdHRyaWJ1dGUgKi8KKyAgICB1bnNpZ25lZCBpbnQgYXJnYl9mZzsJLyogQVJHQiBmb3IgZm9yZWdyb3VuZCAqLworICAgIHVuc2lnbmVkIGludCBhcmdiX2JnOwkvKiBBUkdCIGZvciBiYWNrZ3JvdW5kICovCisgICAgZW51bSBjb2xvcl90YWJsZV9zaGFkb3cgc2hhZG93OwkvKiBTaGFkb3cgbW9kZSAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBjb2xvcl90YWJsZSAqY29uc29sZV9jb2xvcl90YWJsZTsKK2V4dGVybiBpbnQgY29uc29sZV9jb2xvcl90YWJsZV9zaXplOworCisjZW5kaWYgLyogX0NPTE9SVEJMX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvY29tMzIuaCBiL2NvbTMyL2luY2x1ZGUvY29tMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGVmNzEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9jb20zMi5oCkBAIC0wLDAgKzEsMjExIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMi0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjb20zMi5oCisgKgorICogQ29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgY29tMzIgcHJvZ3JhbXMuCisgKi8KKworI2lmbmRlZiBfQ09NMzJfSAorI2RlZmluZSBfQ09NMzJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CS8qIEZvciBfX2NkZWNsICovCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSByZWdpc3RlciBmcmFtZSB1c2VkIGJ5IHRoZQorICogc3lzdGVtIGNhbGwgaW50ZXJmYWNlLgorICoKKyAqIFRoZSBzeXNjYWxsIGludGVyZmFjZSBpczoKKyAqCisgKiBfX2ludGNhbGwoaW50ZXJydXB0XyMsIHNvdXJjZV9yZWdzLCByZXR1cm5fcmVncykKKyAqIF9fZmFyY2FsbChzZWcsIG9mZnMsIHNvdXJjZV9yZWdzLCByZXR1cm5fcmVncykKKyAqLwordHlwZWRlZiB1bmlvbiB7CisgICAgdWludDMyX3QgbDsKKyAgICB1aW50MTZfdCB3WzJdOworICAgIHVpbnQ4X3QgYls0XTsKK30gcmVnMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IGdzOwkJLyogT2Zmc2V0ICAwICovCisgICAgdWludDE2X3QgZnM7CQkvKiBPZmZzZXQgIDIgKi8KKyAgICB1aW50MTZfdCBlczsJCS8qIE9mZnNldCAgNCAqLworICAgIHVpbnQxNl90IGRzOwkJLyogT2Zmc2V0ICA2ICovCisKKyAgICByZWczMl90IGVkaTsJCS8qIE9mZnNldCAgOCAqLworICAgIHJlZzMyX3QgZXNpOwkJLyogT2Zmc2V0IDEyICovCisgICAgcmVnMzJfdCBlYnA7CQkvKiBPZmZzZXQgMTYgKi8KKyAgICByZWczMl90IF91bnVzZWRfZXNwOwkvKiBPZmZzZXQgMjAgKi8KKyAgICByZWczMl90IGVieDsJCS8qIE9mZnNldCAyNCAqLworICAgIHJlZzMyX3QgZWR4OwkJLyogT2Zmc2V0IDI4ICovCisgICAgcmVnMzJfdCBlY3g7CQkvKiBPZmZzZXQgMzIgKi8KKyAgICByZWczMl90IGVheDsJCS8qIE9mZnNldCAzNiAqLworCisgICAgcmVnMzJfdCBlZmxhZ3M7CQkvKiBPZmZzZXQgNDAgKi8KK30gY29tMzJzeXNfdDsKKworLyogRUZMQUdTIGRlZmluaXRpb25zICovCisjZGVmaW5lIEVGTEFHU19DRgkJMHgwMDAwMDAwMQorI2RlZmluZSBFRkxBR1NfUEYJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRUZMQUdTX0FGCQkweDAwMDAwMDEwCisjZGVmaW5lIEVGTEFHU19aRgkJMHgwMDAwMDA0MAorI2RlZmluZSBFRkxBR1NfU0YJCTB4MDAwMDAwODAKKyNkZWZpbmUgRUZMQUdTX1RGCQkweDAwMDAwMTAwCisjZGVmaW5lIEVGTEFHU19JRgkJMHgwMDAwMDIwMAorI2RlZmluZSBFRkxBR1NfREYJCTB4MDAwMDA0MDAKKyNkZWZpbmUgRUZMQUdTX09GCQkweDAwMDAwODAwCisjZGVmaW5lIEVGTEFHU19JT1BMCQkweDAwMDAzMDAwCisjZGVmaW5lIEVGTEFHU19OVAkJMHgwMDAwNDAwMAorI2RlZmluZSBFRkxBR1NfUkYJCTB4MDAwMTAwMDAKKyNkZWZpbmUgRUZMQUdTX1ZNCQkweDAwMDIwMDAwCisjZGVmaW5lIEVGTEFHU19BQwkJMHgwMDA0MDAwMAorI2RlZmluZSBFRkxBR1NfVklGCQkweDAwMDgwMDAwCisjZGVmaW5lIEVGTEFHU19WSVAJCTB4MDAxMDAwMDAKKyNkZWZpbmUgRUZMQUdTX0lECQkweDAwMjAwMDAwCisKK3N0cnVjdCBjb20zMl9wbWFwaTsKKworZXh0ZXJuIHN0cnVjdCBjb20zMl9zeXNfYXJncyB7CisgICAgdWludDMyX3QgY3Nfc3lzYXJnczsKKyAgICBjaGFyICpjc19jbWRsaW5lOworICAgIHZvaWQgX19jZGVjbCAoKmNzX2ludGNhbGwpKHVpbnQ4X3QsIGNvbnN0IGNvbTMyc3lzX3QgKiwgY29tMzJzeXNfdCAqKTsKKyAgICB2b2lkICpjc19ib3VuY2U7CisgICAgdWludDMyX3QgY3NfYm91bmNlX3NpemU7CisgICAgdm9pZCBfX2NkZWNsICgqY3NfZmFyY2FsbCkodWludDMyX3QsIGNvbnN0IGNvbTMyc3lzX3QgKiwgY29tMzJzeXNfdCAqKTsKKyAgICBpbnQgX19jZGVjbCAoKmNzX2NmYXJjYWxsKSh1aW50MzJfdCwgY29uc3Qgdm9pZCAqLCB1aW50MzJfdCk7CisgICAgdWludDMyX3QgY3NfbWVtc2l6ZTsKKyAgICBjb25zdCBjaGFyICpjc19uYW1lOworICAgIGNvbnN0IHN0cnVjdCBjb20zMl9wbWFwaSAqY3NfcG07Cit9IF9fY29tMzI7CisKKy8qCisgKiBTeXN0ZW0gY2FsbCB3cmFwcGVyIGZ1bmN0aW9ucworICovCit2b2lkIF9faW50Y2FsbCh1aW50OF90IF9faSwgY29uc3QgY29tMzJzeXNfdCAqIF9fc3IsIGNvbTMyc3lzX3QgKiBfX2RyKTsKK3ZvaWQgX19mYXJjYWxsKHVpbnQxNl90IF9fY3MsIHVpbnQxNl90IF9faXAsCisJICAgICAgIGNvbnN0IGNvbTMyc3lzX3QgKiBfX3NyLCBjb20zMnN5c190ICogX19kcik7CitpbnQgX19jZmFyY2FsbCh1aW50MTZfdCBfX2NzLCB1aW50MTZfdCBfX2lwLAorCSAgICAgICBjb25zdCB2b2lkICpfX3N0YWNrLCB1aW50MzJfdCBfX3N0YWNrX3NpemUpOworZXh0ZXJuIGNvbnN0IGNvbTMyc3lzX3QgX19jb20zMl96ZXJvX3JlZ3M7CisKKy8qCisgKiBMb3dtZW0gYWxsb2NhdGlvbiBmdW5jdGlvbnMKKyAqLwordm9pZCAqbG1hbGxvYyhzaXplX3QpOwordm9pZCAqbHphbGxvYyhzaXplX3QpOwordm9pZCBsZnJlZSh2b2lkICopOworY2hhciAqbHN0cmR1cChjb25zdCBjaGFyICopOworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgYmV0d2VlbiBsaW5lYXIgcG9pbnRlcnMgaW4gdGhlIHJhbmdlCisgKiAwLi4weEZGRkZGIGFuZCByZWFsLW1vZGUgc3R5bGUgU0VHOk9GRlMgcG9pbnRlcnMuICBOb3RlIHRoYXQgYQorICogMzItYml0IGxpbmVhciBwb2ludGVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggYSBTRUc6T0ZGUyBwb2ludGVyCisgKiBzdG9yZWQgaW4gdHdvIGNvbnNlY3V0aXZlIDE2LWJpdCB3b3Jkcy4KKyAqCisgKiBVc2UgT0ZGU19XUlQoKSBpZiB5b3Ugd2FudCB0byBjb21wdXRlIGFuIG9mZnNldCByZWxhdGl2ZSB0byBhCisgKiBzcGVjaWZpYyBzZWdtZW50LiAgT0ZGU19WQUxJRCgpIHdpbGwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZQorICogcG9pbnRlciBpcyBhY3R1YWxseSByZWFjaGFibGUgZnJvbSB0aGUgdGFyZ2V0IHNlZ21lbnQuCisgKi8KKyNpZiBkZWZpbmVkKENPUkVfREVCVUcpICYmIChkZWZpbmVkKF9fQ09NMzJfXykgfHwgZGVmaW5lZChfX1NZU0xJTlVYX0NPUkVfXykpCitfX25vcmV0dXJuIF9fYmFkX1NFRyhjb25zdCB2b2xhdGlsZSB2b2lkICopOworCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IFNFRyhjb25zdCB2b2xhdGlsZSB2b2lkICpfX3ApCit7CisgICAgaWYgKF9fdW5saWtlbHkoKHVpbnRwdHJfdClfX3AgPiAweGZmZmZmKSkKKwlfX2JhZF9TRUcoX19wKTsKKworICAgIHJldHVybiAodWludDE2X3QpICgoKHVpbnRwdHJfdCkgX19wKSA+PiA0KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IFNFRyhjb25zdCB2b2xhdGlsZSB2b2lkICpfX3ApCit7CisgICAgcmV0dXJuICh1aW50MTZfdCkgKCgodWludHB0cl90KSBfX3ApID4+IDQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgT0ZGUyhjb25zdCB2b2xhdGlsZSB2b2lkICpfX3ApCit7CisgICAgLyogVGhlIGRvdWJsZSBjYXN0IGhlcmUgaXMgdG8gc2h1dCB1cCBnY2MgKi8KKyAgICByZXR1cm4gKHVpbnQxNl90KSAodWludHB0cl90KSBfX3AgJiAweDAwMEY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgT0ZGU19XUlQoY29uc3Qgdm9sYXRpbGUgdm9pZCAqX19wLCB1aW50MTZfdCBfX3NlZykKK3sKKyAgICByZXR1cm4gKHVpbnQxNl90KSAoKHVpbnRwdHJfdCkgX19wIC0gKCh1aW50cHRyX3QpIF9fc2VnIDw8IDQpKTsKK30KKworI2RlZmluZSBPRkZTX1ZBTElEKHAscykgX09GRlNfVkFMSUQoKHApLCBzaXplb2YgKihwKSwgKHMpKQorCitzdGF0aWMgaW5saW5lIGJvb2wgX09GRlNfVkFMSUQoY29uc3Qgdm9sYXRpbGUgdm9pZCAqX19wLCBzaXplX3QgX19zLAorCQkJICAgICAgIHVpbnQxNl90IF9fc2VnKQoreworICAgIHVpbnRwdHJfdCBfX3NlZ3N0YXJ0ID0gKHVpbnRwdHJfdClfX3NlZyA8PCA0OworICAgIHVpbnRwdHJfdCBfX29mZnMgID0gKHVpbnRwdHJfdClfX3AgLSBfX3NlZ3N0YXJ0OworCisgICAgcmV0dXJuIF9fb2ZmcyA8PSAweDEwMDAwLV9fczsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpNS19QVFIodWludDE2X3QgX19zZWcsIHVpbnQxNl90IF9fb2ZmcykKK3sKKyAgICByZXR1cm4gKHZvaWQgKikodW5zaWduZWQgbG9uZykoKF9fc2VnIDw8IDQpICsgX19vZmZzKTsKK30KKworLyogU29tZSB0b29scyB0byBoYW5kbGUgMTY6MTYgZmFyIHBvaW50ZXJzIGluIG1lbW9yeSAqLworCitzdHJ1Y3QgX19mYXJfcHRyIHsKKyAgICB1bmlvbiB7CisJdWludDMyX3QgcHRyOworCXN0cnVjdCB7CisJICAgIHVpbnQxNl90IG9mZnMsIHNlZzsKKwl9OworICAgIH07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgX19mYXJfcHRyIGZhcl9wdHJfdDsKKworc3RhdGljIGlubGluZSB2b2lkICpHRVRfUFRSKGZhcl9wdHJfdCBfX2ZwdHIpCit7CisgICAgcmV0dXJuIE1LX1BUUihfX2ZwdHIuc2VnLCBfX2ZwdHIub2Zmcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZmFyX3B0cl90IEZBUl9QVFIodm9pZCAqX19wdHIpCit7CisgICAgZmFyX3B0cl90IF9fZnB0cjsKKworICAgIF9fZnB0ci5vZmZzID0gT0ZGUyhfX3B0cik7CisgICAgX19mcHRyLnNlZyAgPSBTRUcoX19wdHIpOworICAgIHJldHVybiBfX2ZwdHI7Cit9CisKK2V4dGVybiBjb25zdCBjaGFyICpjb20zMl9jbWRsaW5lKHZvaWQpOworCisjZW5kaWYgLyogX0NPTTMyX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvY29uc29sZS5oIGIvY29tMzIvaW5jbHVkZS9jb25zb2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmZmI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvY29uc29sZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjb25zb2xlLmgKKyAqCisgKiBBbHRlcm5hdGl2ZSBjb25zb2xlcworICovCisKKyNpZm5kZWYgX0NPTlNPTEVfSAorI2RlZmluZSBfQ09OU09MRV9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGRldi5oPgorCitfX2V4dGVybiBpbnQgb3BlbmNvbnNvbGUoY29uc3Qgc3RydWN0IGlucHV0X2RldiAqLCBjb25zdCBzdHJ1Y3Qgb3V0cHV0X2RldiAqKTsKKworLyogU3RhbmRhcmQgbGluZS1vcmllbnRlZCBjb25zb2xlICovCitleHRlcm4gY29uc3Qgc3RydWN0IGlucHV0X2RldiBkZXZfc3RkY29uX3I7CitleHRlcm4gY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgZGV2X3N0ZGNvbl93OworLyogUmF3IGNoYXJhY3Rlci1vcmllbnRlZCBjb25zb2xlICovCitleHRlcm4gY29uc3Qgc3RydWN0IGlucHV0X2RldiBkZXZfcmF3Y29uX3I7CitleHRlcm4gY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgZGV2X3Jhd2Nvbl93OworCisvKiBUaGVzZSBhcmUgb3V0cHV0LW9ubHkgY29uc29sZXM7IGNvbWJpbmUgd2l0aCBvbmUgb2YgdGhlIGlucHV0IG1ldGhvZHMgKi8KKworLyogU2VyaWFsIHBvcnQgb25seSAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvdXRwdXRfZGV2IGRldl9zZXJpYWxfdzsKKy8qIEFOU0kgY29uc29sZSAob3V0cHV0IG9ubHk7IGNvbWJpbmUgd2l0aCBvbmUgb2YgdGhlIGlucHV0IG1ldGhvZHMpICovCitleHRlcm4gY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgZGV2X2Fuc2ljb25fdzsKKy8qIEFOU0kgcGx1cyBzZXJpYWwgcG9ydCAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvdXRwdXRfZGV2IGRldl9hbnNpc2VyaWFsX3c7CisKKy8qIFZFU0EgZ3JhcGhpY3MgY29uc29sZSAob3V0cHV0IG9ubHkpICovCitleHRlcm4gY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgZGV2X3Zlc2Fjb25fdzsKKy8qIFZFU0EgcGx1cyBzZXJpYWwgcG9ydCAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvdXRwdXRfZGV2IGRldl92ZXNhc2VyaWFsX3c7CisKKyNlbmRpZiAvKiBfQ09OU09MRV9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2NwdWZlYXR1cmUuaCBiL2NvbTMyL2luY2x1ZGUvY3B1ZmVhdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjYzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2NwdWZlYXR1cmUuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIGNwdWZlYXR1cmUuaAorICoKKyAqIERlZmluZXMgeDg2IENQVSBmZWF0dXJlIGJpdHMKKyAqLworCisjaWZuZGVmIF9fQVNNX0kzODZfQ1BVRkVBVFVSRV9ICisjZGVmaW5lIF9fQVNNX0kzODZfQ1BVRkVBVFVSRV9ICisKKyNkZWZpbmUgTkNBUElOVFMJOQkvKiBOIDMyLWJpdCB3b3JkcyB3b3J0aCBvZiBpbmZvICovCisKKy8qIEludGVsLWRlZmluZWQgQ1BVIGZlYXR1cmVzLCBDUFVJRCBsZXZlbCAweDAwMDAwMDAxIChlZHgpLCB3b3JkIDAgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRlBVCQkoMCozMisgMCkJLyogT25ib2FyZCBGUFUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfVk1FCQkoMCozMisgMSkJLyogVmlydHVhbCBNb2RlIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfREUJCSgwKjMyKyAyKQkvKiBEZWJ1Z2dpbmcgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QU0UgCSgwKjMyKyAzKQkvKiBQYWdlIFNpemUgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9UU0MJCSgwKjMyKyA0KQkvKiBUaW1lIFN0YW1wIENvdW50ZXIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTVNSCQkoMCozMisgNSkJLyogTW9kZWwtU3BlY2lmaWMgUmVnaXN0ZXJzLCBSRE1TUiwgV1JNU1IgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUEFFCQkoMCozMisgNikJLyogUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01DRQkJKDAqMzIrIDcpCS8qIE1hY2hpbmUgQ2hlY2sgQXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYOAkJKDAqMzIrIDgpCS8qIENNUFhDSEc4IGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FQSUMJKDAqMzIrIDkpCS8qIE9uYm9hcmQgQVBJQyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TRVAJCSgwKjMyKzExKQkvKiBTWVNFTlRFUi9TWVNFWElUICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01UUlIJKDAqMzIrMTIpCS8qIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QR0UJCSgwKjMyKzEzKQkvKiBQYWdlIEdsb2JhbCBFbmFibGUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTUNBCQkoMCozMisxNCkJLyogTWFjaGluZSBDaGVjayBBcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ01PVgkoMCozMisxNSkJLyogQ01PViBpbnN0cnVjdGlvbiAoRkNNT1ZDQyBhbmQgRkNPTUkgdG9vIGlmIEZQVSBwcmVzZW50KSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QQVQJCSgwKjMyKzE2KQkvKiBQYWdlIEF0dHJpYnV0ZSBUYWJsZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QU0UzNgkoMCozMisxNykJLyogMzYtYml0IFBTRXMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUE4JCSgwKjMyKzE4KQkvKiBQcm9jZXNzb3Igc2VyaWFsIG51bWJlciAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DTEZMU0gJKDAqMzIrMTkpCS8qIFN1cHBvcnRzIHRoZSBDTEZMVVNIIGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0RURVMJKDAqMzIrMjEpCS8qIERlYnVnIFRyYWNlIFN0b3JlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FDUEkJKDAqMzIrMjIpCS8qIEFDUEkgdmlhIE1TUiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NTVgJCSgwKjMyKzIzKQkvKiBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRlhTUgkoMCozMisyNCkJLyogRlhTQVZFIGFuZCBGWFJTVE9SIGluc3RydWN0aW9ucyAoZmFzdCBzYXZlIGFuZCByZXN0b3JlICovCisJCQkJCSAgLyogb2YgRlBVIGNvbnRleHQpLCBhbmQgQ1I0Lk9TRlhTUiBhdmFpbGFibGUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NCQkoMCozMisyNSkJLyogU3RyZWFtaW5nIFNJTUQgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9YTU0yCSgwKjMyKzI2KQkvKiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zLTIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfU0VMRlNOT09QCSgwKjMyKzI3KQkvKiBDUFUgc2VsZiBzbm9vcCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9IVAkJKDAqMzIrMjgpCS8qIEh5cGVyLVRocmVhZGluZyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BQ0MJCSgwKjMyKzI5KQkvKiBBdXRvbWF0aWMgY2xvY2sgY29udHJvbCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9JQTY0CSgwKjMyKzMwKQkvKiBJQS02NCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUEJFICAgICAgICAgKDAqMzIrMzEpCS8qIFBlbmRpbmcgQnJlYWsgRW5hYmxlICovCisKKy8qIEFNRC1kZWZpbmVkIENQVSBmZWF0dXJlcywgQ1BVSUQgbGV2ZWwgMHg4MDAwMDAwMSwgd29yZCAxICovCisvKiBEb24ndCBkdXBsaWNhdGUgZmVhdHVyZSBmbGFncyB3aGljaCBhcmUgcmVkdW5kYW50IHdpdGggSW50ZWwhICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NZU0NBTEwJKDEqMzIrMTEpCS8qIFNZU0NBTEwvU1lTUkVUICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01QCQkoMSozMisxOSkJLyogTVAgQ2FwYWJsZS4gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTlgJCSgxKjMyKzIwKQkvKiBFeGVjdXRlIERpc2FibGUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTU1YRVhUCSgxKjMyKzIyKQkvKiBBTUQgTU1YIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRlhTUl9PUFQgICAgKDEqMzIrMjUpCS8qIEZYU0FWRS9GWFJTVE9SIG9wdGltaXphdGlvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfR0JQQUdFUyAgICAgKDEqMzIrMjYpCS8qICJwZHBlMWdiIiBHQiBwYWdlcyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9SRFRTQ1AgICAgICAoMSozMisyNykJLyogUkRUU0NQICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0xNCQkoMSozMisyOSkJLyogTG9uZyBNb2RlICh4ODYtNjQpICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFXzNETk9XRVhUCSgxKjMyKzMwKQkvKiBBTUQgM0ROb3chIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfM0ROT1cJKDEqMzIrMzEpCS8qIDNETm93ISAqLworCisvKiBUcmFuc21ldGEtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4ODA4NjAwMDEsIHdvcmQgMiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9SRUNPVkVSWQkoMiozMisgMCkJLyogQ1BVIGluIHJlY292ZXJ5IG1vZGUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTE9OR1JVTgkoMiozMisgMSkJLyogTG9uZ3J1biBwb3dlciBjb250cm9sICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0xSVEkJKDIqMzIrIDMpCS8qIExvbmdSdW4gdGFibGUgaW50ZXJmYWNlICovCisKKy8qIE90aGVyIGZlYXR1cmVzLCBMaW51eC1kZWZpbmVkIG1hcHBpbmcsIHdvcmQgMyAqLworLyogVGhpcyByYW5nZSBpcyB1c2VkIGZvciBmZWF0dXJlIGJpdHMgd2hpY2ggY29uZmxpY3Qgb3IgYXJlIHN5bnRoZXNpemVkICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYTU1YCSgzKjMyKyAwKQkvKiBDeXJpeCBNTVggZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9LNl9NVFJSCSgzKjMyKyAxKQkvKiBBTUQgSzYgbm9uc3RhbmRhcmQgTVRSUnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSCSgzKjMyKyAyKQkvKiBDeXJpeCBBUlJzICg9IE1UUlJzKSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DRU5UQVVSX01DUgkoMyozMisgMykJLyogQ2VudGF1ciBNQ1JzICg9IE1UUlJzKSAqLworLyogY3B1IHR5cGVzIGZvciBzcGVjaWZpYyB0dW5pbmdzOiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9LOAkJKDMqMzIrIDQpCS8qIE9wdGVyb24sIEF0aGxvbjY0ICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0s3CQkoMyozMisgNSkJLyogQXRobG9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1AzCQkoMyozMisgNikJLyogUDMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUDQJCSgzKjMyKyA3KQkvKiBQNCAqLworCisvKiBJbnRlbC1kZWZpbmVkIENQVSBmZWF0dXJlcywgQ1BVSUQgbGV2ZWwgMHgwMDAwMDAwMSAoZWN4KSwgd29yZCA0ICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTTMJKDQqMzIrIDApCS8qIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMtMyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QQ0xNVUxRRFEgICAoNCozMisgMSkJLyogUENMTVVMUURRIGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0RURVM2NCAgICAgICg0KjMyKyAyKQkvKiA2NC1iaXQgRGVidWcgU3RvcmUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTVdBSVQJKDQqMzIrIDMpCS8qIE1vbml0b3IvTXdhaXQgc3VwcG9ydCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9EU0NQTAkoNCozMisgNCkJLyogQ1BMIFF1YWxpZmllZCBEZWJ1ZyBTdG9yZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9WTVgJCSg0KjMyKyA1KQkvKiBIYXJkd2FyZSB2aXJ0dWFsaXphdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TTVggICAgICAgICAoNCozMisgNikJLyogU2FmZXIgbW9kZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9FU1QJCSg0KjMyKyA3KQkvKiBFbmhhbmNlZCBTcGVlZFN0ZXAgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfVE0yCQkoNCozMisgOCkJLyogVGhlcm1hbCBNb25pdG9yIDIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfU1NFMyAgICAgICAgKDQqMzIrIDkpCS8qIFN1cHBsZW1lbnRhbCBTU0UtMyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DSUQJCSg0KjMyKzEwKQkvKiBDb250ZXh0IElEICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZNQSAgICAgICAgICg0KjMyKzEyKQkvKiBGdXNlZCBtdWx0aXBseS1hZGQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ1gxNiAgICAgICAgKDQqMzIrMTMpCS8qIENNUFhDSEcxNkIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWFRQUgkoNCozMisxNCkJLyogU2VuZCBUYXNrIFByaW9yaXR5IE1lc3NhZ2VzICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1BEQ00gICAgICAgICg0KjMyKzE1KQkvKiBQZXJmb3JtYW5jZSBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRENBICAgICAgICAgKDQqMzIrMTgpCS8qIERpcmVjdCBDYWNoZSBBY2Nlc3MgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NNF8xICAgICAgKDQqMzIrMTkpCS8qICJzc2U0XzEiIFNTRS00LjEgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NNF8yICAgICAgKDQqMzIrMjApCS8qICJzc2U0XzIiIFNTRS00LjIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWDJBUElDICAgICAgKDQqMzIrMjEpCS8qIHgyQVBJQyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NT1ZCRSAgICAgICAoNCozMisyMikJLyogTU9WQkUgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUE9QQ05UICAgICAgKDQqMzIrMjMpCS8qIFBPUENOVCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BRVMgICAgICAgICAoNCozMisyNSkJLyogQUVTIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9YU0FWRSAgICAgICAoNCozMisyNikJLyogWFNBVkUvWFJTVE9SL1hTRVRCVi9YR0VUQlYgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfT1NYU0FWRSAgICAgKDQqMzIrMjcpCS8qICIiIFhTQVZFIGVuYWJsZWQgaW4gdGhlIE9TICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWCAgICAgICAgICg0KjMyKzI4KQkvKiBBZHZhbmNlZCBWZWN0b3IgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9IWVBFUlZJU09SICAoNCozMiszMSkJLyogUnVubmluZyBvbiBhIGh5cGVydmlzb3IgKi8KKworLyogVklBL0N5cml4L0NlbnRhdXItZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4QzAwMDAwMDEsIHdvcmQgNSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9YU1RPUkUJKDUqMzIrIDIpCS8qIG9uLUNQVSBSTkcgcHJlc2VudCAoeHN0b3JlIGluc24pICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hTVE9SRV9FTgkoNSozMisgMykJLyogb24tQ1BVIFJORyBlbmFibGVkICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hDUllQVAkoNSozMisgNikJLyogb24tQ1BVIGNyeXB0byAoeGNyeXB0IGluc24pICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hDUllQVF9FTgkoNSozMisgNykJLyogb24tQ1BVIGNyeXB0byBlbmFibGVkICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FDRTIgICAgICAgICg1KjMyKyA4KQkvKiBBZHZhbmNlZCBDcnlwdG9ncmFwaHkgRW5naW5lIHYyICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FDRTJfRU4gICAgICg1KjMyKyA5KQkvKiBBQ0UgdjIgZW5hYmxlZCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QSEUgICAgICAgICAoNSozMisxMCkJLyogUGFkTG9jayBIYXNoIEVuZ2luZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QSEVfRU4gICAgICAoNSozMisxMSkJLyogUEhFIGVuYWJsZWQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUE1NICAgICAgICAgKDUqMzIrMTIpCS8qIFBhZExvY2sgTW9udGdvbWVyeSBNdWx0aXBsaWVyICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1BNTV9FTiAgICAgICg1KjMyKzEzKQkvKiBQTU0gZW5hYmxlZCAqLworCisvKiBNb3JlIGV4dGVuZGVkIEFNRCBmbGFnczogQ1BVSUQgbGV2ZWwgMHg4MDAwMDAwMSwgZWN4LCB3b3JkIDYgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTEFIRl9MTQkoNiozMisgMCkJLyogTEFIRi9TQUhGIGluIGxvbmcgbW9kZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DTVBfTEVHQUNZCSg2KjMyKyAxKQkvKiBJZiB5ZXMgSHlwZXJUaHJlYWRpbmcgbm90IHZhbGlkICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NWTQkJKDYqMzIrIDIpCS8qIFNlY3VyZSB2aXJ0dWFsIG1hY2hpbmUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRVhUQVBJQyAgICAgKDYqMzIrIDMpCS8qIEV4dGVuZGVkIEFQSUMgc3BhY2UgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ1I4X0xFR0FDWSAgKDYqMzIrIDQpCS8qIENSOCBpbiAzMi1iaXQgbW9kZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BQk0gICAgICAgICAoNiozMisgNSkJLyogQWR2YW5jZWQgYml0IG1hbmlwdWxhdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TU0U0QSAgICAgICAoNiozMisgNikJLyogU1NFLTRBICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01JU0FMSUdOU1NFICg2KjMyKyA3KQkvKiBNaXNhbGlnbmVkIFNTRSBtb2RlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFXzNETk9XUFJFRkVUQ0ggKDYqMzIrIDgpCS8qIDNETm93IHByZWZldGNoIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9PU1ZXICAgICAgICAoNiozMisgOSkJLyogT1MgVmlzaWJsZSBXb3JrYXJvdW5kICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0lCUyAgICAgICAgICg2KjMyKzEwKQkvKiBJbnN0cnVjdGlvbiBCYXNlZCBTYW1wbGluZyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TU0U1ICAgICAgICAoNiozMisxMSkJLyogU1NFLTUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfU0tJTklUICAgICAgKDYqMzIrMTIpCS8qIFNLSU5JVC9TVEdJIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9XRFQgICAgICAgICAoNiozMisxMykJLyogV2F0Y2hkb2cgdGltZXIgKi8KKworLyoKKyAqICAqIEF1eGlsaWFyeSBmbGFnczogTGludXggZGVmaW5lZCAtIEZvciBmZWF0dXJlcyBzY2F0dGVyZWQgaW4gdmFyaW91cworICogICAqIENQVUlEIGxldmVscyBsaWtlIDB4NiwgMHhBIGV0YworICogICAgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfSURBICAgICAgICAgKDcqMzIrIDApCS8qIEludGVsIER5bmFtaWMgQWNjZWxlcmF0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FSQVQgICAgICAgICg3KjMyKyAxKQkvKiBBbHdheXMgUnVubmluZyBBUElDIFRpbWVyICovCisKKy8qIFZpcnR1YWxpemF0aW9uIGZsYWdzOiBMaW51eCBkZWZpbmVkICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1RQUl9TSEFET1cgICg4KjMyKyAwKQkvKiBJbnRlbCBUUFIgU2hhZG93ICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1ZOTUkgICAgICAgICg4KjMyKyAxKQkvKiBJbnRlbCBWaXJ0dWFsIE5NSSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9GTEVYUFJJT1JJVFkgKDgqMzIrIDIpCS8qIEludGVsIEZsZXhQcmlvcml0eSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9FUFQgICAgICAgICAoOCozMisgMykJLyogSW50ZWwgRXh0ZW5kZWQgUGFnZSBUYWJsZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9WUElEICAgICAgICAoOCozMisgNCkJLyogSW50ZWwgVmlydHVhbCBQcm9jZXNzb3IgSUQgKi8KKworI2VuZGlmIC8qIF9fQVNNX0kzODZfQ1BVRkVBVFVSRV9IICovCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOmMKKyAqIGNvbW1lbnQtY29sdW1uOjQyCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvY3R5cGUuaCBiL2NvbTMyL2luY2x1ZGUvY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTA2NDVlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9jdHlwZS5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogY3R5cGUuaAorICoKKyAqIFRoaXMgYXNzdW1lcyBJU08gODg1OS0xLCBiZWluZyBhIHJlYXNvbmFibGUgc3VwZXJzZXQgb2YgQVNDSUkuCisgKi8KKworI2lmbmRlZiBfQ1RZUEVfSAorI2RlZmluZSBfQ1RZUEVfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisKKyNpZm5kZWYgX19DVFlQRV9OT19JTkxJTkUKKyMgZGVmaW5lIF9fY3R5cGVfaW5saW5lIHN0YXRpYyBfX2lubGluZV9fCisjZWxzZQorIyBkZWZpbmUgX19jdHlwZV9pbmxpbmUKKyNlbmRpZgorCisvKgorICogVGhpcyByZWxpZXMgb24gdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAqCisgKiBjbnRybCA9ICFwcmludAorICogYWxwaGEgPSB1cHBlcnxsb3dlcgorICogZ3JhcGggPSBwdW5jdHxhbHBoYXxkaWdpdAorICogYmxhbmsgPSAnXHQnIHx8ICcgJyAocGVyIFBPU0lYIHJlcXVpcmVtZW50KQorICovCitlbnVtIHsKKyAgICBfX2N0eXBlX3VwcGVyID0gKDEgPDwgMCksCisgICAgX19jdHlwZV9sb3dlciA9ICgxIDw8IDEpLAorICAgIF9fY3R5cGVfZGlnaXQgPSAoMSA8PCAyKSwKKyAgICBfX2N0eXBlX3hkaWdpdCA9ICgxIDw8IDMpLAorICAgIF9fY3R5cGVfc3BhY2UgPSAoMSA8PCA0KSwKKyAgICBfX2N0eXBlX3ByaW50ID0gKDEgPDwgNSksCisgICAgX19jdHlwZV9wdW5jdCA9ICgxIDw8IDYpLAorICAgIF9fY3R5cGVfY250cmwgPSAoMSA8PCA3KSwKK307CisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIF9fY3R5cGVzW107CisKK19fY3R5cGVfaW5saW5lIGludCBpc2FsbnVtKGludCBfX2MpCit7CisgICAgcmV0dXJuIF9fY3R5cGVzW19fYyArIDFdICYgKF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX2xvd2VyIHwgX19jdHlwZV9kaWdpdCk7Cit9CisKK19fY3R5cGVfaW5saW5lIGludCBpc2FscGhhKGludCBfX2MpCit7CisgICAgcmV0dXJuIF9fY3R5cGVzW19fYyArIDFdICYgKF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX2xvd2VyKTsKK30KKworX19jdHlwZV9pbmxpbmUgaW50IGlzYXNjaWkoaW50IF9fYykKK3sKKyAgICByZXR1cm4gIShfX2MgJiB+MHg3Zik7Cit9CisKK19fY3R5cGVfaW5saW5lIGludCBpc2JsYW5rKGludCBfX2MpCit7CisgICAgcmV0dXJuIChfX2MgPT0gJ1x0JykgfHwgKF9fYyA9PSAnICcpOworfQorCitfX2N0eXBlX2lubGluZSBpbnQgaXNjbnRybChpbnQgX19jKQoreworICAgIHJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmIF9fY3R5cGVfY250cmw7Cit9CisKK19fY3R5cGVfaW5saW5lIGludCBpc2RpZ2l0KGludCBfX2MpCit7CisgICAgcmV0dXJuICgodW5zaWduZWQpX19jIC0gJzAnKSA8PSA5OworfQorCitfX2N0eXBlX2lubGluZSBpbnQgaXNncmFwaChpbnQgX19jKQoreworICAgIHJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmCisJKF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX2xvd2VyIHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfcHVuY3QpOworfQorCitfX2N0eXBlX2lubGluZSBpbnQgaXNsb3dlcihpbnQgX19jKQoreworICAgIHJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmIF9fY3R5cGVfbG93ZXI7Cit9CisKK19fY3R5cGVfaW5saW5lIGludCBpc3ByaW50KGludCBfX2MpCit7CisgICAgcmV0dXJuIF9fY3R5cGVzW19fYyArIDFdICYgX19jdHlwZV9wcmludDsKK30KKworX19jdHlwZV9pbmxpbmUgaW50IGlzcHVuY3QoaW50IF9fYykKK3sKKyAgICByZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJiBfX2N0eXBlX3B1bmN0OworfQorCitfX2N0eXBlX2lubGluZSBpbnQgaXNzcGFjZShpbnQgX19jKQoreworICAgIHJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmIF9fY3R5cGVfc3BhY2U7Cit9CisKK19fY3R5cGVfaW5saW5lIGludCBpc3VwcGVyKGludCBfX2MpCit7CisgICAgcmV0dXJuIF9fY3R5cGVzW19fYyArIDFdICYgX19jdHlwZV91cHBlcjsKK30KKworX19jdHlwZV9pbmxpbmUgaW50IGlzeGRpZ2l0KGludCBfX2MpCit7CisgICAgcmV0dXJuIF9fY3R5cGVzW19fYyArIDFdICYgX19jdHlwZV94ZGlnaXQ7Cit9CisKKy8qIE5vdGU6IHRoaXMgaXMgZGVjaW1hbCwgbm90IGhleCwgdG8gYXZvaWQgYWNjaWRlbnRhbCBwcm9tb3Rpb24gdG8gdW5zaWduZWQgKi8KKyNkZWZpbmUgX3RvdXBwZXIoX19jKSAoKF9fYykgJiB+MzIpCisjZGVmaW5lIF90b2xvd2VyKF9fYykgKChfX2MpIHwgMzIpCisKK19fY3R5cGVfaW5saW5lIGludCB0b3VwcGVyKGludCBfX2MpCit7CisgICAgcmV0dXJuIGlzbG93ZXIoX19jKSA/IF90b3VwcGVyKF9fYykgOiBfX2M7Cit9CisKK19fY3R5cGVfaW5saW5lIGludCB0b2xvd2VyKGludCBfX2MpCit7CisgICAgcmV0dXJuIGlzdXBwZXIoX19jKSA/IF90b2xvd2VyKF9fYykgOiBfX2M7Cit9CisKK19fZXh0ZXJuIGNoYXIgKnNraXBzcGFjZShjb25zdCBjaGFyICpwKTsKK19fZXh0ZXJuIHZvaWQgY2hycmVwbGFjZShjaGFyICpzb3VyY2UsIGNoYXIgb2xkLCBjaGFyIG5ldyk7CisKKyNlbmRpZiAvKiBfQ1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9kZXYuaCBiL2NvbTMyL2luY2x1ZGUvZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3YTBlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvZGV2LmgKQEAgLTAsMCArMSw1NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNvbnNvbGUuaAorICoKKyAqIEFsdGVybmF0aXZlIGNvbnNvbGVzCisgKi8KKworI2lmbmRlZiBfREVWX0gKKyNkZWZpbmUgX0RFVl9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworc3RydWN0IGlucHV0X2RldjsKK3N0cnVjdCBvdXRwdXRfZGV2OworCitfX2V4dGVybiBpbnQgb3BlbmRldihjb25zdCBzdHJ1Y3QgaW5wdXRfZGV2ICosIGNvbnN0IHN0cnVjdCBvdXRwdXRfZGV2ICosIGludCk7CitfX2V4dGVybiBpbnQgb3Blbm1lbShjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKKworLyogQ29tbW9uIGdlbmVyaWMgZGV2aWNlcyAqLworCisvKiBOdWxsIGRldmljZSAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbnB1dF9kZXYgZGV2X251bGxfcjsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb3V0cHV0X2RldiBkZXZfbnVsbF93OworCisvKiBFcnJvciBkZXZpY2UgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5wdXRfZGV2IGRldl9lcnJvcl9yOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvdXRwdXRfZGV2IGRldl9lcnJvcl93OworCisjZW5kaWYgLyogX0RFVl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2RoY3AuaCBiL2NvbTMyL2luY2x1ZGUvZGhjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZWY5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2RoY3AuaApAQCAtMCwwICsxLDQwIEBACisjaWZuZGVmIERIQ1BfSAorI2RlZmluZSBESENQX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3N0cnVjdCBkaGNwX29wdGlvbiB7CisJdm9pZCAqZGF0YTsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IGRoY3BfcGFja2V0IHsKKwl1aW50OF90IG9wOwkJLyogICAwICovCisJdWludDhfdCBodHlwZTsJCS8qICAgMSAqLworCXVpbnQ4X3QgaGxlbjsJCS8qICAgMiAqLworCXVpbnQ4X3QgaG9wczsJCS8qICAgMyAqLworCXVpbnQzMl90IHhpZDsJCS8qICAgNCAqLworCXVpbnQxNl90IHNlY3M7CQkvKiAgIDggKi8KKwl1aW50MTZfdCBmbGFnczsJCS8qICAxMCAqLworCXVpbnQzMl90IGNpYWRkcjsJLyogIDEyICovCisJdWludDMyX3QgeWlhZGRyOwkvKiAgMTYgKi8KKwl1aW50MzJfdCBzaWFkZHI7CS8qICAyMCAqLworCXVpbnQzMl90IGdpYWRkcjsJLyogIDI0ICovCisJdWludDhfdCBjaGFkZHJbMTZdOwkvKiAgMjggKi8KKwl1aW50OF90IHNuYW1lWzY0XTsJLyogIDQ0ICovCisJdWludDhfdCBmaWxlWzEyOF07CS8qIDEwOCAqLworCXVpbnQzMl90IG1hZ2ljOwkJLyogMjM2ICovCisJdWludDhfdCBvcHRpb25zWzRdOwkvKiAyNDAgKi8KK307CisKKyNkZWZpbmUgREhDUF9WRU5ET1JfTUFHSUMJMHg2MzgyNTM2MworCitpbnQgZGhjcF9wYWNrX3BhY2tldCh2b2lkICpwYWNrZXQsIHNpemVfdCAqbGVuLAorCQkgICAgIGNvbnN0IHN0cnVjdCBkaGNwX29wdGlvbiBvcHRbMjU2XSk7CisKK2ludCBkaGNwX3VucGFja19wYWNrZXQoY29uc3Qgdm9pZCAqcGFja2V0LCBzaXplX3QgbGVuLAorCQkgICAgICAgc3RydWN0IGRoY3Bfb3B0aW9uIG9wdFsyNTZdKTsKKworI2VuZGlmIC8qIERIQ1BfSCAqLworICAKKwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9kaXJlbnQuaCBiL2NvbTMyL2luY2x1ZGUvZGlyZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhY2E0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvZGlyZW50LmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIGRpcmVudC5oCisgKi8KKworI2lmbmRlZiBfRElSRU5UX0gKKyNkZWZpbmUgX0RJUkVOVF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzL2RpcmVudC5oPgorCitfX2V4dGVybiBESVIgKm9wZW5kaXIoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIHN0cnVjdCBkaXJlbnQgKnJlYWRkaXIoRElSICopOworX19leHRlcm4gaW50IGNsb3NlZGlyKERJUiAqKTsKK19fZXh0ZXJuIERJUiAqZmRvcGVuZGlyKGludCk7CisKKyNlbmRpZiAvKiBOb3QgX0RJUkVOVF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2RwcmludGYuaCBiL2NvbTMyL2luY2x1ZGUvZHByaW50Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjFiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2RwcmludGYuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogZHByaW50Zi5oCisgKi8KKworI2lmbmRlZiBfRFBSSU5URl9ICisjZGVmaW5lIF9EUFJJTlRGX0gKKworI2luY2x1ZGUgPHN5c2xpbnV4L2RlYnVnLmg+CisKKyNpZiAhZGVmaW5lZChERUJVR19QT1JUKSAmJiAhZGVmaW5lZChERUJVR19TVERJTykKKyMgdW5kZWYgQ09SRV9ERUJVRworI2VuZGlmCisKKyNpZmRlZiBDT1JFX0RFQlVHCisKKyMgaW5jbHVkZSA8c3RkaW8uaD4KKworIyBpZmRlZiBERUJVR19TVERJTworIyAgZGVmaW5lIGRwcmludGYgIHByaW50ZgorIyAgZGVmaW5lIHZkcHJpbnRmIHZwcmludGYKKyMgIGRlZmluZSBkZHByaW50ZiBkcHJpbnRmCisjIGVsc2UKK3ZvaWQgZHByaW50Zihjb25zdCBjaGFyICosIC4uLik7Cit2b2lkIHZkcHJpbnRmKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisjICBkZWZpbmUgZGRwcmludGYoLi4uKQl7IHByaW50ZihfX1ZBX0FSR1NfXyk7IGRwcmludGYoX19WQV9BUkdTX18pOyB9CisjIGVuZGlmCisKKyNlbHNlCisKKyNkZWZpbmUgZHByaW50ZiguLi4pIFwKKyAgICBpZiAoc3lzbGludXhfZGVidWdfZW5hYmxlZCkgXAorICAgICAgICBwcmludGYoX19WQV9BUkdTX18pCisjZGVmaW5lIHZkcHJpbnRmKGZtdCwgYXApIFwKKyAgICBpZiAoc3lzbGludXhfZGVidWdfZW5hYmxlZCkgXAorICAgICAgICB2cHJpbnRmKGZtdCwgYXApCisjZGVmaW5lIGRkcHJpbnRmCXByaW50ZgorCisjZW5kaWYgLyogQ09SRV9ERUJVRyAqLworCisjIGlmIENPUkVfREVCVUcgPj0gMgorLyogUmVhbGx5IHZlcmJvc2UgZGVidWdnaW5nLi4uICovCisjICBkZWZpbmUgZHByaW50ZjIgIGRwcmludGYKKyMgIGRlZmluZSB2ZHByaW50ZjIgdmRwcmludGYKKyMgZWxzZQorIyAgZGVmaW5lIGRwcmludGYyKGZtdCwgLi4uKQkoKHZvaWQpKDApKQorIyAgZGVmaW5lIHZkcHJpbnRmMihmbXQsIGFwKQkoKHZvaWQpKDApKQorIyBlbmRpZgorCisjZW5kaWYgLyogX0RQUklOVEZfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9lbGYuaCBiL2NvbTMyL2luY2x1ZGUvZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwNzUzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvZWxmLmgKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIGVsZi5oCisgKi8KKworI2lmbmRlZiBfRUxGX0gKKyNkZWZpbmUgX0VMRl9ICisKKyNpbmNsdWRlIDxzeXMvZWxmMzIuaD4KKyNpbmNsdWRlIDxzeXMvZWxmNjQuaD4KKworI2VuZGlmIC8qIF9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9lbmRpYW4uaCBiL2NvbTMyL2luY2x1ZGUvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1YjFiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvZW5kaWFuLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGVuZGlhbi5oCisgKi8KKworI2lmbmRlZiBfRU5ESUFOX0gKKyNkZWZpbmUgX0VORElBTl9ICisKKyNpbmNsdWRlIDxrbGliYy9lbmRpYW4uaD4KKworI2RlZmluZSBMSVRUTEVfRU5ESUFOCV9fTElUVExFX0VORElBTgorI2RlZmluZSBCSUdfRU5ESUFOCV9fQklHX0VORElBTgorI2RlZmluZSBQRFBfRU5ESUFOCV9fUERQX0VORElBTgorI2RlZmluZSBCWVRFX09SREVSCV9fQllURV9PUkRFUgorCisjZW5kaWYgLyogX0VORElBTl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2Vycm5vLmggYi9jb20zMi9pbmNsdWRlL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiZjJlYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvZXJybm8uaApAQCAtMCwwICsxLDE1NSBAQAorI2lmbmRlZiBfRVJSTk9fSAorI2RlZmluZSBfRVJSTk9fSAorCitleHRlcm4gaW50IGVycm5vOworCisjZGVmaW5lCUVQRVJNCQkgMQkvKiBPcGVyYXRpb24gbm90IHBlcm1pdHRlZCAqLworI2RlZmluZQlFTk9FTlQJCSAyCS8qIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRVNSQ0gJCSAzCS8qIE5vIHN1Y2ggcHJvY2VzcyAqLworI2RlZmluZQlFSU5UUgkJIDQJLyogSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUJRUlPCQkgNQkvKiBJL08gZXJyb3IgKi8KKyNkZWZpbmUJRU5YSU8JCSA2CS8qIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MgKi8KKyNkZWZpbmUJRTJCSUcJCSA3CS8qIEFyZyBsaXN0IHRvbyBsb25nICovCisjZGVmaW5lCUVOT0VYRUMJCSA4CS8qIEV4ZWMgZm9ybWF0IGVycm9yICovCisjZGVmaW5lCUVCQURGCQkgOQkvKiBCYWQgZmlsZSBudW1iZXIgKi8KKyNkZWZpbmUJRUNISUxECQkxMAkvKiBObyBjaGlsZCBwcm9jZXNzZXMgKi8KKyNkZWZpbmUJRUFHQUlOCQkxMQkvKiBUcnkgYWdhaW4gKi8KKyNkZWZpbmUJRU5PTUVNCQkxMgkvKiBPdXQgb2YgbWVtb3J5ICovCisjZGVmaW5lCUVBQ0NFUwkJMTMJLyogUGVybWlzc2lvbiBkZW5pZWQgKi8KKyNkZWZpbmUJRUZBVUxUCQkxNAkvKiBCYWQgYWRkcmVzcyAqLworI2RlZmluZQlFTk9UQkxLCQkxNQkvKiBCbG9jayBkZXZpY2UgcmVxdWlyZWQgKi8KKyNkZWZpbmUJRUJVU1kJCTE2CS8qIERldmljZSBvciByZXNvdXJjZSBidXN5ICovCisjZGVmaW5lCUVFWElTVAkJMTcJLyogRmlsZSBleGlzdHMgKi8KKyNkZWZpbmUJRVhERVYJCTE4CS8qIENyb3NzLWRldmljZSBsaW5rICovCisjZGVmaW5lCUVOT0RFVgkJMTkJLyogTm8gc3VjaCBkZXZpY2UgKi8KKyNkZWZpbmUJRU5PVERJUgkJMjAJLyogTm90IGEgZGlyZWN0b3J5ICovCisjZGVmaW5lCUVJU0RJUgkJMjEJLyogSXMgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRUlOVkFMCQkyMgkvKiBJbnZhbGlkIGFyZ3VtZW50ICovCisjZGVmaW5lCUVORklMRQkJMjMJLyogRmlsZSB0YWJsZSBvdmVyZmxvdyAqLworI2RlZmluZQlFTUZJTEUJCTI0CS8qIFRvbyBtYW55IG9wZW4gZmlsZXMgKi8KKyNkZWZpbmUJRU5PVFRZCQkyNQkvKiBOb3QgYSB0eXBld3JpdGVyICovCisjZGVmaW5lCUVUWFRCU1kJCTI2CS8qIFRleHQgZmlsZSBidXN5ICovCisjZGVmaW5lCUVGQklHCQkyNwkvKiBGaWxlIHRvbyBsYXJnZSAqLworI2RlZmluZQlFTk9TUEMJCTI4CS8qIE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlICovCisjZGVmaW5lCUVTUElQRQkJMjkJLyogSWxsZWdhbCBzZWVrICovCisjZGVmaW5lCUVST0ZTCQkzMAkvKiBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUJRU1MSU5LCQkzMQkvKiBUb28gbWFueSBsaW5rcyAqLworI2RlZmluZQlFUElQRQkJMzIJLyogQnJva2VuIHBpcGUgKi8KKyNkZWZpbmUJRURPTQkJMzMJLyogTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmMgKi8KKyNkZWZpbmUJRVJBTkdFCQkzNAkvKiBNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSAqLworI2RlZmluZQlFREVBRExLCQkzNQkvKiBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1ciAqLworI2RlZmluZQlFTkFNRVRPT0xPTkcJMzYJLyogRmlsZSBuYW1lIHRvbyBsb25nICovCisjZGVmaW5lCUVOT0xDSwkJMzcJLyogTm8gcmVjb3JkIGxvY2tzIGF2YWlsYWJsZSAqLworI2RlZmluZQlFTk9TWVMJCTM4CS8qIEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZQlFTk9URU1QVFkJMzkJLyogRGlyZWN0b3J5IG5vdCBlbXB0eSAqLworI2RlZmluZQlFTE9PUAkJNDAJLyogVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQgKi8KKyNkZWZpbmUJRVdPVUxEQkxPQ0sJRUFHQUlOCS8qIE9wZXJhdGlvbiB3b3VsZCBibG9jayAqLworI2RlZmluZQlFTk9NU0cJCTQyCS8qIE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlICovCisjZGVmaW5lCUVJRFJNCQk0MwkvKiBJZGVudGlmaWVyIHJlbW92ZWQgKi8KKyNkZWZpbmUJRUNIUk5HCQk0NAkvKiBDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UgKi8KKyNkZWZpbmUJRUwyTlNZTkMJNDUJLyogTGV2ZWwgMiBub3Qgc3luY2hyb25pemVkICovCisjZGVmaW5lCUVMM0hMVAkJNDYJLyogTGV2ZWwgMyBoYWx0ZWQgKi8KKyNkZWZpbmUJRUwzUlNUCQk0NwkvKiBMZXZlbCAzIHJlc2V0ICovCisjZGVmaW5lCUVMTlJORwkJNDgJLyogTGluayBudW1iZXIgb3V0IG9mIHJhbmdlICovCisjZGVmaW5lCUVVTkFUQ0gJCTQ5CS8qIFByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQgKi8KKyNkZWZpbmUJRU5PQ1NJCQk1MAkvKiBObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSAqLworI2RlZmluZQlFTDJITFQJCTUxCS8qIExldmVsIDIgaGFsdGVkICovCisjZGVmaW5lCUVCQURFCQk1MgkvKiBJbnZhbGlkIGV4Y2hhbmdlICovCisjZGVmaW5lCUVCQURSCQk1MwkvKiBJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvciAqLworI2RlZmluZQlFWEZVTEwJCTU0CS8qIEV4Y2hhbmdlIGZ1bGwgKi8KKyNkZWZpbmUJRU5PQU5PCQk1NQkvKiBObyBhbm9kZSAqLworI2RlZmluZQlFQkFEUlFDCQk1NgkvKiBJbnZhbGlkIHJlcXVlc3QgY29kZSAqLworI2RlZmluZQlFQkFEU0xUCQk1NwkvKiBJbnZhbGlkIHNsb3QgKi8KKworI2RlZmluZQlFREVBRExPQ0sJRURFQURMSworCisjZGVmaW5lCUVCRk9OVAkJNTkJLyogQmFkIGZvbnQgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUJRU5PU1RSCQk2MAkvKiBEZXZpY2Ugbm90IGEgc3RyZWFtICovCisjZGVmaW5lCUVOT0RBVEEJCTYxCS8qIE5vIGRhdGEgYXZhaWxhYmxlICovCisjZGVmaW5lCUVUSU1FCQk2MgkvKiBUaW1lciBleHBpcmVkICovCisjZGVmaW5lCUVOT1NSCQk2MwkvKiBPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMgKi8KKyNkZWZpbmUJRU5PTkVUCQk2NAkvKiBNYWNoaW5lIGlzIG5vdCBvbiB0aGUgbmV0d29yayAqLworI2RlZmluZQlFTk9QS0cJCTY1CS8qIFBhY2thZ2Ugbm90IGluc3RhbGxlZCAqLworI2RlZmluZQlFUkVNT1RFCQk2NgkvKiBPYmplY3QgaXMgcmVtb3RlICovCisjZGVmaW5lCUVOT0xJTksJCTY3CS8qIExpbmsgaGFzIGJlZW4gc2V2ZXJlZCAqLworI2RlZmluZQlFQURWCQk2OAkvKiBBZHZlcnRpc2UgZXJyb3IgKi8KKyNkZWZpbmUJRVNSTU5UCQk2OQkvKiBTcm1vdW50IGVycm9yICovCisjZGVmaW5lCUVDT01NCQk3MAkvKiBDb21tdW5pY2F0aW9uIGVycm9yIG9uIHNlbmQgKi8KKyNkZWZpbmUJRVBST1RPCQk3MQkvKiBQcm90b2NvbCBlcnJvciAqLworI2RlZmluZQlFTVVMVElIT1AJNzIJLyogTXVsdGlob3AgYXR0ZW1wdGVkICovCisjZGVmaW5lCUVET1RET1QJCTczCS8qIFJGUyBzcGVjaWZpYyBlcnJvciAqLworI2RlZmluZQlFQkFETVNHCQk3NAkvKiBOb3QgYSBkYXRhIG1lc3NhZ2UgKi8KKyNkZWZpbmUJRU9WRVJGTE9XCTc1CS8qIFZhbHVlIHRvbyBsYXJnZSBmb3IgZGVmaW5lZCBkYXRhIHR5cGUgKi8KKyNkZWZpbmUJRU5PVFVOSVEJNzYJLyogTmFtZSBub3QgdW5pcXVlIG9uIG5ldHdvcmsgKi8KKyNkZWZpbmUJRUJBREZECQk3NwkvKiBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlICovCisjZGVmaW5lCUVSRU1DSEcJCTc4CS8qIFJlbW90ZSBhZGRyZXNzIGNoYW5nZWQgKi8KKyNkZWZpbmUJRUxJQkFDQwkJNzkJLyogQ2FuIG5vdCBhY2Nlc3MgYSBuZWVkZWQgc2hhcmVkIGxpYnJhcnkgKi8KKyNkZWZpbmUJRUxJQkJBRAkJODAJLyogQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5ICovCisjZGVmaW5lCUVMSUJTQ04JCTgxCS8qIC5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWQgKi8KKyNkZWZpbmUJRUxJQk1BWAkJODIJLyogQXR0ZW1wdGluZyB0byBsaW5rIGluIHRvbyBtYW55IHNoYXJlZCBsaWJyYXJpZXMgKi8KKyNkZWZpbmUJRUxJQkVYRUMJODMJLyogQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSAqLworI2RlZmluZQlFSUxTRVEJCTg0CS8qIElsbGVnYWwgYnl0ZSBzZXF1ZW5jZSAqLworI2RlZmluZQlFUkVTVEFSVAk4NQkvKiBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBzaG91bGQgYmUgcmVzdGFydGVkICovCisjZGVmaW5lCUVTVFJQSVBFCTg2CS8qIFN0cmVhbXMgcGlwZSBlcnJvciAqLworI2RlZmluZQlFVVNFUlMJCTg3CS8qIFRvbyBtYW55IHVzZXJzICovCisjZGVmaW5lCUVOT1RTT0NLCTg4CS8qIFNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCAqLworI2RlZmluZQlFREVTVEFERFJSRVEJODkJLyogRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCAqLworI2RlZmluZQlFTVNHU0laRQk5MAkvKiBNZXNzYWdlIHRvbyBsb25nICovCisjZGVmaW5lCUVQUk9UT1RZUEUJOTEJLyogUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0ICovCisjZGVmaW5lCUVOT1BST1RPT1BUCTkyCS8qIFByb3RvY29sIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRVBST1RPTk9TVVBQT1JUCTkzCS8qIFByb3RvY29sIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJRVNPQ0tUTk9TVVBQT1JUCTk0CS8qIFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJRU9QTk9UU1VQUAk5NQkvKiBPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQgKi8KKyNkZWZpbmUJRVBGTk9TVVBQT1JUCTk2CS8qIFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCUVBRk5PU1VQUE9SVAk5NwkvKiBBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sICovCisjZGVmaW5lCUVBRERSSU5VU0UJOTgJLyogQWRkcmVzcyBhbHJlYWR5IGluIHVzZSAqLworI2RlZmluZQlFQUREUk5PVEFWQUlMCTk5CS8qIENhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MgKi8KKyNkZWZpbmUJRU5FVERPV04JMTAwCS8qIE5ldHdvcmsgaXMgZG93biAqLworI2RlZmluZQlFTkVUVU5SRUFDSAkxMDEJLyogTmV0d29yayBpcyB1bnJlYWNoYWJsZSAqLworI2RlZmluZQlFTkVUUkVTRVQJMTAyCS8qIE5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgcmVzZXQgKi8KKyNkZWZpbmUJRUNPTk5BQk9SVEVECTEwMwkvKiBTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydCAqLworI2RlZmluZQlFQ09OTlJFU0VUCTEwNAkvKiBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIgKi8KKyNkZWZpbmUJRU5PQlVGUwkJMTA1CS8qIE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRUlTQ09OTgkJMTA2CS8qIFRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCAqLworI2RlZmluZQlFTk9UQ09OTgkxMDcJLyogVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUJRVNIVVRET1dOCTEwOAkvKiBDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24gKi8KKyNkZWZpbmUJRVRPT01BTllSRUZTCTEwOQkvKiBUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlICovCisjZGVmaW5lCUVUSU1FRE9VVAkxMTAJLyogQ29ubmVjdGlvbiB0aW1lZCBvdXQgKi8KKyNkZWZpbmUJRUNPTk5SRUZVU0VECTExMQkvKiBDb25uZWN0aW9uIHJlZnVzZWQgKi8KKyNkZWZpbmUJRUhPU1RET1dOCTExMgkvKiBIb3N0IGlzIGRvd24gKi8KKyNkZWZpbmUJRUhPU1RVTlJFQUNICTExMwkvKiBObyByb3V0ZSB0byBob3N0ICovCisjZGVmaW5lCUVBTFJFQURZCTExNAkvKiBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlFSU5QUk9HUkVTUwkxMTUJLyogT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlFU1RBTEUJCTExNgkvKiBTdGFsZSBORlMgZmlsZSBoYW5kbGUgKi8KKyNkZWZpbmUJRVVDTEVBTgkJMTE3CS8qIFN0cnVjdHVyZSBuZWVkcyBjbGVhbmluZyAqLworI2RlZmluZQlFTk9UTkFNCQkxMTgJLyogTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlICovCisjZGVmaW5lCUVOQVZBSUwJCTExOQkvKiBObyBYRU5JWCBzZW1hcGhvcmVzIGF2YWlsYWJsZSAqLworI2RlZmluZQlFSVNOQU0JCTEyMAkvKiBJcyBhIG5hbWVkIHR5cGUgZmlsZSAqLworI2RlZmluZQlFUkVNT1RFSU8JMTIxCS8qIFJlbW90ZSBJL08gZXJyb3IgKi8KKyNkZWZpbmUJRURRVU9UCQkxMjIJLyogUXVvdGEgZXhjZWVkZWQgKi8KKworI2RlZmluZQlFTk9NRURJVU0JMTIzCS8qIE5vIG1lZGl1bSBmb3VuZCAqLworI2RlZmluZQlFTUVESVVNVFlQRQkxMjQJLyogV3JvbmcgbWVkaXVtIHR5cGUgKi8KKworLyogbHdJUCBuYW1lc2VydmVyIHF1ZXJ5IHJldHVybiBjb2RlcyAqLworI2RlZmluZSBFTlNST0sgICAgMCAvKiBETlMgc2VydmVyIHJldHVybmVkIGFuc3dlciB3aXRoIG5vIGRhdGEgKi8KKyNkZWZpbmUgRU5TUk5PREFUQSAgMTYwIC8qIEROUyBzZXJ2ZXIgcmV0dXJuZWQgYW5zd2VyIHdpdGggbm8gZGF0YSAqLworI2RlZmluZSBFTlNSRk9STUVSUiAxNjEgLyogRE5TIHNlcnZlciBjbGFpbXMgcXVlcnkgd2FzIG1pc2Zvcm1hdHRlZCAqLworI2RlZmluZSBFTlNSU0VSVkZBSUwgMTYyICAvKiBETlMgc2VydmVyIHJldHVybmVkIGdlbmVyYWwgZmFpbHVyZSAqLworI2RlZmluZSBFTlNSTk9URk9VTkQgMTYzICAvKiBEb21haW4gbmFtZSBub3QgZm91bmQgKi8KKyNkZWZpbmUgRU5TUk5PVElNUCAgMTY0IC8qIEROUyBzZXJ2ZXIgZG9lcyBub3QgaW1wbGVtZW50IHJlcXVlc3RlZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRU5TUlJFRlVTRUQgMTY1IC8qIEROUyBzZXJ2ZXIgcmVmdXNlZCBxdWVyeSAqLworI2RlZmluZSBFTlNSQkFEUVVFUlkgMTY2ICAvKiBNaXNmb3JtYXR0ZWQgRE5TIHF1ZXJ5ICovCisjZGVmaW5lIEVOU1JCQUROQU1FIDE2NyAvKiBNaXNmb3JtYXR0ZWQgZG9tYWluIG5hbWUgKi8KKyNkZWZpbmUgRU5TUkJBREZBTUlMWSAxNjggLyogVW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkgKi8KKyNkZWZpbmUgRU5TUkJBRFJFU1AgMTY5IC8qIE1pc2Zvcm1hdHRlZCBETlMgcmVwbHkgKi8KKyNkZWZpbmUgRU5TUkNPTk5SRUZVU0VEIDE3MCAvKiBDb3VsZCBub3QgY29udGFjdCBETlMgc2VydmVycyAqLworI2RlZmluZSBFTlNSVElNRU9VVCAxNzEgLyogVGltZW91dCB3aGlsZSBjb250YWN0aW5nIEROUyBzZXJ2ZXJzICovCisjZGVmaW5lIEVOU1JPRiAgICAxNzIgLyogRW5kIG9mIGZpbGUgKi8KKyNkZWZpbmUgRU5TUkZJTEUgIDE3MyAvKiBFcnJvciByZWFkaW5nIGZpbGUgKi8KKyNkZWZpbmUgRU5TUk5PTUVNIDE3NCAvKiBPdXQgb2YgbWVtb3J5ICovCisjZGVmaW5lIEVOU1JERVNUUlVDVElPTiAxNzUgLyogQXBwbGljYXRpb24gdGVybWluYXRlZCBsb29rdXAgKi8KKyNkZWZpbmUgRU5TUlFVRVJZRE9NQUlOVE9PTE9ORyAgMTc2IC8qIERvbWFpbiBuYW1lIGlzIHRvbyBsb25nICovCisjZGVmaW5lIEVOU1JDTkFNRUxPT1AgMTc3IC8qIERvbWFpbiBuYW1lIGlzIHRvbyBsb25nICovCisKKyNlbmRpZiAvKiBfRVJSTk9fSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9mY250bC5oIGIvY29tMzIvaW5jbHVkZS9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTljYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2ZjbnRsLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIGZjbnRsLmgKKyAqLworCisjaWZuZGVmIF9GQ05UTF9ICisjZGVmaW5lIF9GQ05UTF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBOb25lIG9mIHRoZXNlIGFyZSBhY3R1YWxseSBzdXBwb3J0ZWQsIGFsdGhvdWdoIE9fUkRPTkxZIHdvcmtzICovCisvKiBOb3RlIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzaWNhbCBVbml4IHdheSBvZiBkb2luZyBpdCAqLworI2RlZmluZQlPX1JET05MWQkxCisjZGVmaW5lIE9fV1JPTkxZCTIKKyNkZWZpbmUgT19SRFdSCQkzCisjZGVmaW5lIE9fRElSRUNUT1JZCTAxMAorI2RlZmluZSBPX0NSRUFUCQkwMTAwCisjZGVmaW5lIE9fRVhDTAkJMDIwMAorI2RlZmluZSBPX1RSVU5DCQkwMTAwMAorI2RlZmluZSBPX0FQUEVORAkwMjAwMAorCitfX2V4dGVybiBpbnQgb3Blbihjb25zdCBjaGFyICosIGludCwgLi4uKTsKKworI2VuZGlmIC8qIF9GQ05UTF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2dldG9wdC5oIGIvY29tMzIvaW5jbHVkZS9nZXRvcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWM0MWNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9nZXRvcHQuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9HRVRPUFRfSAorI2RlZmluZSBfR0VUT1BUX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorCitzdHJ1Y3Qgb3B0aW9uIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBoYXNfYXJnOworCWludCAqZmxhZzsKKwlpbnQgdmFsOworfTsKKworZW51bSB7CisJbm9fYXJndW1lbnQJICA9IDAsCisJcmVxdWlyZWRfYXJndW1lbnQgPSAxLAorCW9wdGlvbmFsX2FyZ3VtZW50ID0gMiwKK307CisKK19fZXh0ZXJuIGludCBnZXRvcHRfbG9uZyhpbnQsIGNoYXIgKmNvbnN0ICosIGNvbnN0IGNoYXIgKiwKKwkJCSBjb25zdCBzdHJ1Y3Qgb3B0aW9uICosIGludCAqKTsKKworI2VuZGlmIC8qIF9HRVRPUFRfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9ody92Z2EuaCBiL2NvbTMyL2luY2x1ZGUvaHcvdmdhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZDJlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvaHcvdmdhLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDEyIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX0hXX1ZHQV9ICisjZGVmaW5lIF9IV19WR0FfSCAxCisKKyNpbmNsdWRlIDxzeXMvaW8uaD4KKworLyogVGhlc2UgYXJlIHJlbGF0aXZlIHRvIHRoZSBDUlRDIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBWR0FfQ1JUQ19BRERSCQkJMHg0CisjZGVmaW5lIFZHQV9DUlRDX0RBVEEJCQkweDUKKyNkZWZpbmUgVkdBX0NSVENfSVhfSE9SSVpfVE9UQUwJCTB4MDAKKyNkZWZpbmUgVkdBX0NSVENfSVhfRU5EX0hPUklaX0RJU1BMQVkJMHgwMQorI2RlZmluZSBWR0FfQ1JUQ19JWF9TVEFSVF9IT1JJWl9CTEFOSwkweDAyCisjZGVmaW5lIFZHQV9DUlRDX0lYX0VORF9IT1JJWl9CTEFOSwkweDAzCisjZGVmaW5lIFZHQV9DUlRDX0lYX1NUQVJUX0hPUklaX1JFVFIJMHgwNAorI2RlZmluZSBWR0FfQ1JUQ19JWF9FTkRfSE9SSVpfUkVUUgkweDA1CisjZGVmaW5lIFZHQV9DUlRDX0lYX1ZFUlRfVE9UQUwJCTB4MDYKKyNkZWZpbmUgVkdBX0NSVENfSVhfT1ZFUkZMT1cJCTB4MDcKKyNkZWZpbmUgVkdBX0NSVENfSVhfUFJFU0VUX1JPV19TQ0FOCTB4MDgKKyNkZWZpbmUgVkdBX0NSVENfSVhfTUFYX1NDQU5fTElORQkweDA5CisjZGVmaW5lIFZHQV9DUlRDX0lYX0NVUlNPUl9TVEFSVAkweDBhCisjZGVmaW5lIFZHQV9DUlRDX0lYX0NVUlNPUl9FTkQJCTB4MGIKKyNkZWZpbmUgVkdBX0NSVENfSVhfU1RBUlRfQUREUl9ISUdICTB4MGMKKyNkZWZpbmUgVkdBX0NSVENfSVhfU1RBUlRfQUREUl9MT1cJMHgwZAorI2RlZmluZSBWR0FfQ1JUQ19JWF9DVVJTT1JfUE9TX0hJR0gJMHgwZQorI2RlZmluZSBWR0FfQ1JUQ19JWF9DVVJTT1JfUE9TX0xPVwkweDBmCisjZGVmaW5lIFZHQV9DUlRDX0lYX1NUQVJUX1ZFUlRfUkVUUgkweDEwCisjZGVmaW5lIFZHQV9DUlRDX0lYX0VORF9WRVJUX1JFVFIJMHgxMQorI2RlZmluZSBWR0FfQ1JUQ19JWF9FTkRfVkVSVF9ESVNQTEFZCTB4MTIKKyNkZWZpbmUgVkdBX0NSVENfSVhfT0ZGU0VUCQkweDEzCisjZGVmaW5lIFZHQV9DUlRDX0lYX1VOREVSTElORQkJMHgxNAorI2RlZmluZSBWR0FfQ1JUQ19JWF9TVEFSVF9WRVJUX0JMQU5LCTB4MTUKKyNkZWZpbmUgVkdBX0NSVENfSVhfRU5EX1ZFUlRfQkxBTksJMHgxNgorI2RlZmluZSBWR0FfQ1JUQ19JWF9NT0RFX0NPTlRST0wJMHgxNworI2RlZmluZSBWR0FfQ1JUQ19JWF9MSU5FX0NPTVBBUkUJMHgxOAorI2RlZmluZSBWR0FfQ1JUQ19JTlBVVF9TVEFUVVNfMQkJMHhhCisjZGVmaW5lIFZHQV9DUlRDX0ZFQVRVUkVfQ09OVFJPTF9XUklURQkweGEKKworI2RlZmluZSBWR0FfQVRUUl9BRERSX0RBVEEJCTB4M2MwCisjZGVmaW5lIFZHQV9BVFRSX0RBVEFfUkVBRAkJMHgzYzEKKy8qIDB4MDAtMHgwZiBhcmUgMTYtPjY0IHBhbGV0dGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFZHQV9BVFRSX0lYX01PREVfQ09OVFJPTAkweDEwCisjZGVmaW5lIFZHQV9BVFRSX0lYX09WRVJTQ0FOCQkweDExCisjZGVmaW5lIFZHQV9BVFRSX0lYX0NPTE9SX1BMQU5FX0VOQUJMRQkweDEyCisjZGVmaW5lIFZHQV9BVFRSX0lYX0hPUklaX1BJWEVMX1BBTgkweDEzCisjZGVmaW5lIFZHQV9BRERSX0lYX0NPTE9SX1NFTEVDVAkweDE0CisjZGVmaW5lIFZHQV9JTlBVVF9TVEFUVVNfMAkJMHgzYzIKKyNkZWZpbmUgVkdBX01JU0NfT1VUUFVUX1dSSVRFCQkweDNjMgorI2RlZmluZSBWR0FfU0VRX0FERFIJCQkweDNjNAorI2RlZmluZSBWR0FfU0VRX0RBVEEJCQkweDNjNQorI2RlZmluZSBWR0FfU0VRX0lYX1JFU0VUCQkwCisjZGVmaW5lIFZHQV9TRVFfSVhfQ0xPQ0tNT0RFCQkxCisjZGVmaW5lIFZHQV9TRVFfSVhfTUFQX01BU0sJCTIKKyNkZWZpbmUgVkdBX1NFUV9JWF9DSEFSX01BUAkJMworI2RlZmluZSBWR0FfU0VRX0lYX1NFUV9NRU1fTU9ERQkJNAorI2RlZmluZSBWR0FfREFDX1NUQVRFCQkJMHgzYzcKKyNkZWZpbmUgVkdBX0RBQ19BRERSX1JFQURfTU9ERQkJMHgzYzcKKyNkZWZpbmUgVkdBX0RBQ19BRERSX1dSSVRFX01PREUJCTB4M2M4CisjZGVmaW5lIFZHQV9EQUNfREFUQQkJCTB4M2M5CisjZGVmaW5lIFZHQV9GRUFUVVJFX0NPTlRST0xfUkVBRAkweDNjYQorI2RlZmluZSBWR0FfTUlTQ19PVVRQVVRfUkVBRAkJMHgzY2MKKyNkZWZpbmUgVkdBX0dDX0FERFIJCQkweDNjZQorI2RlZmluZSBWR0FfR0NfREFUQQkJCTB4M2NmCisjZGVmaW5lIFZHQV9HQ19JWF9TRVRfUkVTRVQJCTAKKyNkZWZpbmUgVkdBX0dDX0lYX0VOQUJMRV9TRVRfUkVTRVQJMQorI2RlZmluZSBWR0FfR0NfSVhfQ09MT1JfQ09NUEFSRQkJMgorI2RlZmluZSBWR0FfR0NfSVhfREFUQV9ST1RBVEUJCTMKKyNkZWZpbmUgVkdBX0dDX0lYX1JFQURfTUFQX1NFTEVDVAk0CisjZGVmaW5lIFZHQV9HQ19JWF9HUkFQSElDU19NT0RFCQk1CisjZGVmaW5lIFZHQV9HQ19JWF9NSVNDX0dSQVBISUNTCQk2CisjZGVmaW5lIFZHQV9HQ19JWF9DT0xPUl9ET05UX0NBUkUJNworI2RlZmluZSBWR0FfR0NfSVhfQklUX01BU0sJCTgKKworc3RhdGljIGlubGluZSB1aW50MTZfdCB2Z2FfY3J0Y19iYXNlKHZvaWQpCit7CisgICAgcmV0dXJuIDB4M2IwICsgKChpbmIoVkdBX01JU0NfT1VUUFVUX1JFQUQpICYgMSkgPDwgNSk7Cit9CisKKyNlbmRpZiAvKiBfSFdfVkdBX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvaWxvZzIuaCBiL2NvbTMyL2luY2x1ZGUvaWxvZzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWE1MDU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9pbG9nMi5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX0lMT0cyX0gKKyNkZWZpbmUgX0lMT0cyX0gKKworLyoKKyAqIENvbXB1dGVzIGZsb29yKGxvZzIoeCkpIC0tIHVuZGVmaW5lZCBmb3IgeCA9IDAuCisgKi8KKworI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0YXRpYyBpbmxpbmUgX19jb25zdGZ1bmMgdWludDMyX3QgaWxvZzIodWludDMyX3QgX192KQoreworIyBpZiBfX0dOVUNfXyA+PSA0CisgICAgcmV0dXJuIF9fYnVpbHRpbl9jbHooX192KSBeIDMxOworIyBlbHNlCisgICAgYXNtKCJic3JsICUxLCUwIiA6ICI9ciIgKF9fdikgOiAicm0iIChfX3YpKTsKKyAgICByZXR1cm4gX192OworIyBlbmRpZgorfQorCisjZW5kaWYgLyogX0lMT0cyX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvaW50dHlwZXMuaCBiL2NvbTMyL2luY2x1ZGUvaW50dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODYzMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9pbnR0eXBlcy5oCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogaW50dHlwZXMuaAorICovCisKKyNpZm5kZWYgX0lOVFRZUEVTX0gKKyNkZWZpbmUgX0lOVFRZUEVTX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitzdGF0aWMgX19pbmxpbmVfXyBpbnRtYXhfdCBpbWF4YWJzKGludG1heF90IF9fbikKK3sKKyAgICByZXR1cm4gKF9fbiA8IChpbnRtYXhfdCkgMCkgPyAtX19uIDogX19uOworfQorCitfX2V4dGVybiBpbnRtYXhfdCBzdHJ0b2ltYXgoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOworX19leHRlcm4gdWludG1heF90IHN0cnRvdW1heChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CisKKy8qIGV4dGVuc2lvbnMgKi8KK19fZXh0ZXJuIGludG1heF90IHN0cm50b2ltYXgoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQsIHNpemVfdCk7CitfX2V4dGVybiB1aW50bWF4X3Qgc3RybnRvdW1heChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCwgc2l6ZV90KTsKKworI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fU1REQ19GT1JNQVRfTUFDUk9TKQorCisjZGVmaW5lIFBSSWQ4CSJkIgorI2RlZmluZSBQUklkMTYJImQiCisjZGVmaW5lIFBSSWQzMgkiZCIKKyNkZWZpbmUgUFJJZDY0CV9fUFJJNjRfUkFOSyAiZCIKKworI2RlZmluZSBQUklkTEVBU1Q4CSJkIgorI2RlZmluZSBQUklkTEVBU1QxNgkiZCIKKyNkZWZpbmUgUFJJZExFQVNUMzIJImQiCisjZGVmaW5lIFBSSWRMRUFTVDY0CV9fUFJJNjRfUkFOSyAiZCIKKworI2RlZmluZSBQUklkRkFTVDgJImQiCisjZGVmaW5lIFBSSWRGQVNUMTYJX19QUklGQVNUX1JBTksgImQiCisjZGVmaW5lIFBSSWRGQVNUMzIJX19QUklGQVNUX1JBTksgImQiCisjZGVmaW5lIFBSSWRGQVNUNjQJX19QUkk2NF9SQU5LICJkIgorCisjZGVmaW5lIFBSSWRNQVgJIF9fUFJJNjRfUkFOSyAiZCIKKyNkZWZpbmUgUFJJZFBUUiAgX19QUklQVFJfUkFOSyAiZCIKKworI2RlZmluZSBQUklpOAkiaSIKKyNkZWZpbmUgUFJJaTE2CSJpIgorI2RlZmluZSBQUklpMzIJImkiCisjZGVmaW5lIFBSSWk2NAlfX1BSSTY0X1JBTksgImkiCisKKyNkZWZpbmUgUFJJaUxFQVNUOAkiaSIKKyNkZWZpbmUgUFJJaUxFQVNUMTYJImkiCisjZGVmaW5lIFBSSWlMRUFTVDMyCSJpIgorI2RlZmluZSBQUklpTEVBU1Q2NAlfX1BSSTY0X1JBTksgImkiCisKKyNkZWZpbmUgUFJJaUZBU1Q4CSJpIgorI2RlZmluZSBQUklpRkFTVDE2CV9fUFJJRkFTVF9SQU5LICJpIgorI2RlZmluZSBQUklpRkFTVDMyCV9fUFJJRkFTVF9SQU5LICJpIgorI2RlZmluZSBQUklpRkFTVDY0CV9fUFJJNjRfUkFOSyAiaSIKKworI2RlZmluZSBQUklpTUFYCSBfX1BSSTY0X1JBTksgImkiCisjZGVmaW5lIFBSSWlQVFIgIF9fUFJJUFRSX1JBTksgImkiCisKKyNkZWZpbmUgUFJJbzgJIm8iCisjZGVmaW5lIFBSSW8xNgkibyIKKyNkZWZpbmUgUFJJbzMyCSJvIgorI2RlZmluZSBQUklvNjQJX19QUkk2NF9SQU5LICJvIgorCisjZGVmaW5lIFBSSW9MRUFTVDgJIm8iCisjZGVmaW5lIFBSSW9MRUFTVDE2CSJvIgorI2RlZmluZSBQUklvTEVBU1QzMgkibyIKKyNkZWZpbmUgUFJJb0xFQVNUNjQJX19QUkk2NF9SQU5LICJvIgorCisjZGVmaW5lIFBSSW9GQVNUOAkibyIKKyNkZWZpbmUgUFJJb0ZBU1QxNglfX1BSSUZBU1RfUkFOSyAibyIKKyNkZWZpbmUgUFJJb0ZBU1QzMglfX1BSSUZBU1RfUkFOSyAibyIKKyNkZWZpbmUgUFJJb0ZBU1Q2NAlfX1BSSTY0X1JBTksgIm8iCisKKyNkZWZpbmUgUFJJb01BWAkgX19QUkk2NF9SQU5LICJvIgorI2RlZmluZSBQUklvUFRSICBfX1BSSVBUUl9SQU5LICJvIgorCisjZGVmaW5lIFBSSXU4CSJ1IgorI2RlZmluZSBQUkl1MTYJInUiCisjZGVmaW5lIFBSSXUzMgkidSIKKyNkZWZpbmUgUFJJdTY0CV9fUFJJNjRfUkFOSyAidSIKKworI2RlZmluZSBQUkl1TEVBU1Q4CSJ1IgorI2RlZmluZSBQUkl1TEVBU1QxNgkidSIKKyNkZWZpbmUgUFJJdUxFQVNUMzIJInUiCisjZGVmaW5lIFBSSXVMRUFTVDY0CV9fUFJJNjRfUkFOSyAidSIKKworI2RlZmluZSBQUkl1RkFTVDgJInUiCisjZGVmaW5lIFBSSXVGQVNUMTYJX19QUklGQVNUX1JBTksgInUiCisjZGVmaW5lIFBSSXVGQVNUMzIJX19QUklGQVNUX1JBTksgInUiCisjZGVmaW5lIFBSSXVGQVNUNjQJX19QUkk2NF9SQU5LICJ1IgorCisjZGVmaW5lIFBSSXVNQVgJIF9fUFJJNjRfUkFOSyAidSIKKyNkZWZpbmUgUFJJdVBUUiAgX19QUklQVFJfUkFOSyAidSIKKworI2RlZmluZSBQUkl4OAkieCIKKyNkZWZpbmUgUFJJeDE2CSJ4IgorI2RlZmluZSBQUkl4MzIJIngiCisjZGVmaW5lIFBSSXg2NAlfX1BSSTY0X1JBTksgIngiCisKKyNkZWZpbmUgUFJJeExFQVNUOAkieCIKKyNkZWZpbmUgUFJJeExFQVNUMTYJIngiCisjZGVmaW5lIFBSSXhMRUFTVDMyCSJ4IgorI2RlZmluZSBQUkl4TEVBU1Q2NAlfX1BSSTY0X1JBTksgIngiCisKKyNkZWZpbmUgUFJJeEZBU1Q4CSJ4IgorI2RlZmluZSBQUkl4RkFTVDE2CV9fUFJJRkFTVF9SQU5LICJ4IgorI2RlZmluZSBQUkl4RkFTVDMyCV9fUFJJRkFTVF9SQU5LICJ4IgorI2RlZmluZSBQUkl4RkFTVDY0CV9fUFJJNjRfUkFOSyAieCIKKworI2RlZmluZSBQUkl4TUFYCSBfX1BSSTY0X1JBTksgIngiCisjZGVmaW5lIFBSSXhQVFIgIF9fUFJJUFRSX1JBTksgIngiCisKKyNkZWZpbmUgUFJJWDgJIlgiCisjZGVmaW5lIFBSSVgxNgkiWCIKKyNkZWZpbmUgUFJJWDMyCSJYIgorI2RlZmluZSBQUklYNjQJX19QUkk2NF9SQU5LICJYIgorCisjZGVmaW5lIFBSSVhMRUFTVDgJIlgiCisjZGVmaW5lIFBSSVhMRUFTVDE2CSJYIgorI2RlZmluZSBQUklYTEVBU1QzMgkiWCIKKyNkZWZpbmUgUFJJWExFQVNUNjQJX19QUkk2NF9SQU5LICJYIgorCisjZGVmaW5lIFBSSVhGQVNUOAkiWCIKKyNkZWZpbmUgUFJJWEZBU1QxNglfX1BSSUZBU1RfUkFOSyAiWCIKKyNkZWZpbmUgUFJJWEZBU1QzMglfX1BSSUZBU1RfUkFOSyAiWCIKKyNkZWZpbmUgUFJJWEZBU1Q2NAlfX1BSSTY0X1JBTksgIlgiCisKKyNkZWZpbmUgUFJJWE1BWAkgX19QUkk2NF9SQU5LICJYIgorI2RlZmluZSBQUklYUFRSICBfX1BSSVBUUl9SQU5LICJYIgorCisjZGVmaW5lIFNDTmQ4CSJoaGQiCisjZGVmaW5lIFNDTmQxNgkiaGQiCisjZGVmaW5lIFNDTmQzMgkiZCIKKyNkZWZpbmUgU0NOZDY0CV9fUFJJNjRfUkFOSyAiZCIKKworI2RlZmluZSBTQ05kTEVBU1Q4CSJoaGQiCisjZGVmaW5lIFNDTmRMRUFTVDE2CSJoZCIKKyNkZWZpbmUgU0NOZExFQVNUMzIJImQiCisjZGVmaW5lIFNDTmRMRUFTVDY0CV9fUFJJNjRfUkFOSyAiZCIKKworI2RlZmluZSBTQ05kRkFTVDgJImhoZCIKKyNkZWZpbmUgU0NOZEZBU1QxNglfX1BSSUZBU1RfUkFOSyAiZCIKKyNkZWZpbmUgU0NOZEZBU1QzMglfX1BSSUZBU1RfUkFOSyAiZCIKKyNkZWZpbmUgU0NOZEZBU1Q2NAlfX1BSSTY0X1JBTksgImQiCisKKyNkZWZpbmUgU0NOZE1BWAkgX19QUkk2NF9SQU5LICJkIgorI2RlZmluZSBTQ05kUFRSICBfX1BSSVBUUl9SQU5LICJkIgorCisjZGVmaW5lIFNDTmk4CSJoaGkiCisjZGVmaW5lIFNDTmkxNgkiaGkiCisjZGVmaW5lIFNDTmkzMgkiaSIKKyNkZWZpbmUgU0NOaTY0CV9fUFJJNjRfUkFOSyAiaSIKKworI2RlZmluZSBTQ05pTEVBU1Q4CSJoaGkiCisjZGVmaW5lIFNDTmlMRUFTVDE2CSJoaSIKKyNkZWZpbmUgU0NOaUxFQVNUMzIJImkiCisjZGVmaW5lIFNDTmlMRUFTVDY0CV9fUFJJNjRfUkFOSyAiaSIKKworI2RlZmluZSBTQ05pRkFTVDgJImhoaSIKKyNkZWZpbmUgU0NOaUZBU1QxNglfX1BSSUZBU1RfUkFOSyAiaSIKKyNkZWZpbmUgU0NOaUZBU1QzMglfX1BSSUZBU1RfUkFOSyAiaSIKKyNkZWZpbmUgU0NOaUZBU1Q2NAlfX1BSSTY0X1JBTksgImkiCisKKyNkZWZpbmUgU0NOaU1BWAkgX19QUkk2NF9SQU5LICJpIgorI2RlZmluZSBTQ05pUFRSICBfX1BSSVBUUl9SQU5LICJpIgorCisjZGVmaW5lIFNDTm84CSJoaG8iCisjZGVmaW5lIFNDTm8xNgkiaG8iCisjZGVmaW5lIFNDTm8zMgkibyIKKyNkZWZpbmUgU0NObzY0CV9fUFJJNjRfUkFOSyAibyIKKworI2RlZmluZSBTQ05vTEVBU1Q4CSJoaG8iCisjZGVmaW5lIFNDTm9MRUFTVDE2CSJobyIKKyNkZWZpbmUgU0NOb0xFQVNUMzIJIm8iCisjZGVmaW5lIFNDTm9MRUFTVDY0CV9fUFJJNjRfUkFOSyAibyIKKworI2RlZmluZSBTQ05vRkFTVDgJImhobyIKKyNkZWZpbmUgU0NOb0ZBU1QxNglfX1BSSUZBU1RfUkFOSyAibyIKKyNkZWZpbmUgU0NOb0ZBU1QzMglfX1BSSUZBU1RfUkFOSyAibyIKKyNkZWZpbmUgU0NOb0ZBU1Q2NAlfX1BSSTY0X1JBTksgIm8iCisKKyNkZWZpbmUgU0NOb01BWAkgX19QUkk2NF9SQU5LICJvIgorI2RlZmluZSBTQ05vUFRSICBfX1BSSVBUUl9SQU5LICJvIgorCisjZGVmaW5lIFNDTnU4CSJoaHUiCisjZGVmaW5lIFNDTnUxNgkiaHUiCisjZGVmaW5lIFNDTnUzMgkidSIKKyNkZWZpbmUgU0NOdTY0CV9fUFJJNjRfUkFOSyAidSIKKworI2RlZmluZSBTQ051TEVBU1Q4CSJoaHUiCisjZGVmaW5lIFNDTnVMRUFTVDE2CSJodSIKKyNkZWZpbmUgU0NOdUxFQVNUMzIJInUiCisjZGVmaW5lIFNDTnVMRUFTVDY0CV9fUFJJNjRfUkFOSyAidSIKKworI2RlZmluZSBTQ051RkFTVDgJImhodSIKKyNkZWZpbmUgU0NOdUZBU1QxNglfX1BSSUZBU1RfUkFOSyAidSIKKyNkZWZpbmUgU0NOdUZBU1QzMglfX1BSSUZBU1RfUkFOSyAidSIKKyNkZWZpbmUgU0NOdUZBU1Q2NAlfX1BSSTY0X1JBTksgInUiCisKKyNkZWZpbmUgU0NOdU1BWAkgX19QUkk2NF9SQU5LICJ1IgorI2RlZmluZSBTQ051UFRSICBfX1BSSVBUUl9SQU5LICJ1IgorCisjZGVmaW5lIFNDTng4CSJoaHgiCisjZGVmaW5lIFNDTngxNgkiaHgiCisjZGVmaW5lIFNDTngzMgkieCIKKyNkZWZpbmUgU0NOeDY0CV9fUFJJNjRfUkFOSyAieCIKKworI2RlZmluZSBTQ054TEVBU1Q4CSJoaHgiCisjZGVmaW5lIFNDTnhMRUFTVDE2CSJoeCIKKyNkZWZpbmUgU0NOeExFQVNUMzIJIngiCisjZGVmaW5lIFNDTnhMRUFTVDY0CV9fUFJJNjRfUkFOSyAieCIKKworI2RlZmluZSBTQ054RkFTVDgJImhoeCIKKyNkZWZpbmUgU0NOeEZBU1QxNglfX1BSSUZBU1RfUkFOSyAieCIKKyNkZWZpbmUgU0NOeEZBU1QzMglfX1BSSUZBU1RfUkFOSyAieCIKKyNkZWZpbmUgU0NOeEZBU1Q2NAlfX1BSSTY0X1JBTksgIngiCisKKyNkZWZpbmUgU0NOeE1BWAkgX19QUkk2NF9SQU5LICJ4IgorI2RlZmluZSBTQ054UFRSICBfX1BSSVBUUl9SQU5LICJ4IgorCisjZW5kaWYKKworI2VuZGlmIC8qIF9JTlRUWVBFU19IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaCBiL2NvbTMyL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZGVmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogYXJjaC9pMzg2L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisgICAgdW5zaWduZWQgaW50IF9fZWJ4OworICAgIHVuc2lnbmVkIGludCBfX2VzcDsKKyAgICB1bnNpZ25lZCBpbnQgX19lYnA7CisgICAgdW5zaWduZWQgaW50IF9fZXNpOworICAgIHVuc2lnbmVkIGludCBfX2VkaTsKKyAgICB1bnNpZ25lZCBpbnQgX19laXA7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmIC8qIF9TRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9rbGliYy9jb21waWxlci5oIGIvY29tMzIvaW5jbHVkZS9rbGliYy9jb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTQ4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2tsaWJjL2NvbXBpbGVyLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBrbGliYy9jb21waWxlci5oCisgKgorICogVmFyaW91cyBjb21waWxlciBmZWF0dXJlcworICovCisKKyNpZm5kZWYgX0tMSUJDX0NPTVBJTEVSX0gKKyNkZWZpbmUgX0tMSUJDX0NPTVBJTEVSX0gKKworI2RlZmluZSBfX3VzZXIKKworLyogU3BlY2lmaWMgY2FsbGluZyBjb252ZW50aW9ucyAqLworLyogX19jZGVjbCBpcyB1c2VkIHdoZW4gd2Ugd2FudCB2YXJhZGljIGFuZCBub24tdmFyYWRpYyBmdW5jdGlvbnMgdG8gaGF2ZQorICAgdGhlIHNhbWUgYmluYXJ5IGNhbGxpbmcgY29udmVudGlvbi4gKi8KKyNpZmRlZiBfX2kzODZfXworIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9fY2RlY2wgX19hdHRyaWJ1dGVfXygoY2RlY2wscmVncGFybSgwKSkpCisjIGVsc2UKKyAgLyogTW9zdCBvdGhlciBDIGNvbXBpbGVycyBoYXZlIF9fY2RlY2wgYXMgYSBrZXl3b3JkICovCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgX19jZGVjbAkJLyogTWVhbmluZ2xlc3Mgb24gbm9uLWkzODYgKi8KKyNlbmRpZgorCisvKiBIb3cgdG8gZGVjbGFyZSBhIGZ1bmN0aW9uIHRoYXQgKm11c3QqIGJlIGlubGluZWQgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBpZiBfX0dOVUNfTUFKT1JfXyA+PSAzCisjICBkZWZpbmUgX19tdXN0X2lubGluZSBzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyMgZWxzZQorIyAgZGVmaW5lIF9fbXVzdF9pbmxpbmUgZXh0ZXJuIF9faW5saW5lX18KKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBfX211c3RfaW5saW5lIGlubGluZQkvKiBKdXN0IGhvcGUgdGhpcyB3b3Jrcy4uLiAqLworI2VuZGlmCisKKy8qIEhvdyB0byBkZWNsYXJlIGEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCByZXR1cm4gKi8KKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgX19ub3JldHVybiB2b2lkIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyNlbHNlCisjIGRlZmluZSBfX25vcmV0dXJuIHZvaWQKKyNlbmRpZgorCisvKiAiY29uc3QiIGZ1bmN0aW9uOgorCisgICAgIE1hbnkgZnVuY3Rpb25zIGRvIG5vdCBleGFtaW5lIGFueSB2YWx1ZXMgZXhjZXB0IHRoZWlyIGFyZ3VtZW50cywKKyAgICAgYW5kIGhhdmUgbm8gZWZmZWN0cyBleGNlcHQgdGhlIHJldHVybiB2YWx1ZS4gIEJhc2ljYWxseSB0aGlzIGlzCisgICAgIGp1c3Qgc2xpZ2h0bHkgbW9yZSBzdHJpY3QgY2xhc3MgdGhhbiB0aGUgYHB1cmUnIGF0dHJpYnV0ZSBhYm92ZSwKKyAgICAgc2luY2UgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgdG8gcmVhZCBnbG9iYWwgbWVtb3J5LgorCisgICAgIE5vdGUgdGhhdCBhIGZ1bmN0aW9uIHRoYXQgaGFzIHBvaW50ZXIgYXJndW1lbnRzIGFuZCBleGFtaW5lcyB0aGUKKyAgICAgZGF0YSBwb2ludGVkIHRvIG11c3QgX25vdF8gYmUgZGVjbGFyZWQgYGNvbnN0Jy4gIExpa2V3aXNlLCBhCisgICAgIGZ1bmN0aW9uIHRoYXQgY2FsbHMgYSBub24tYGNvbnN0JyBmdW5jdGlvbiB1c3VhbGx5IG11c3Qgbm90IGJlCisgICAgIGBjb25zdCcuICBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIGZvciBhIGBjb25zdCcgZnVuY3Rpb24gdG8gcmV0dXJuCisgICAgIGB2b2lkJy4KKyovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIF9fY29uc3RmdW5jIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKKyNlbHNlCisjIGRlZmluZSBfX2NvbnN0ZnVuYworI2VuZGlmCisjdW5kZWYgX19hdHRyaWJ1dGVfY29uc3RfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fY29uc3RmdW5jCisKKy8qICJwdXJlIiBmdW5jdGlvbjoKKworICAgICBNYW55IGZ1bmN0aW9ucyBoYXZlIG5vIGVmZmVjdHMgZXhjZXB0IHRoZSByZXR1cm4gdmFsdWUgYW5kIHRoZWlyCisgICAgIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9ubHkgb24gdGhlIHBhcmFtZXRlcnMgYW5kL29yIGdsb2JhbAorICAgICB2YXJpYWJsZXMuICBTdWNoIGEgZnVuY3Rpb24gY2FuIGJlIHN1YmplY3QgdG8gY29tbW9uIHN1YmV4cHJlc3Npb24KKyAgICAgZWxpbWluYXRpb24gYW5kIGxvb3Agb3B0aW1pemF0aW9uIGp1c3QgYXMgYW4gYXJpdGhtZXRpYyBvcGVyYXRvcgorICAgICB3b3VsZCBiZS4gIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgd2l0aCB0aGUgYXR0cmlidXRlCisgICAgIGBwdXJlJy4KKyovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIF9fcHVyZWZ1bmMgX19hdHRyaWJ1dGVfXygocHVyZSkpCisjZWxzZQorIyBkZWZpbmUgX19wdXJlZnVuYworI2VuZGlmCisjdW5kZWYgX19hdHRyaWJ1dGVfcHVyZV9fCisjZGVmaW5lIF9fYXR0cmlidXRlX3B1cmVfXyBfX3B1cmVmdW5jCisKKy8qIEZvcm1hdCBhdHRyaWJ1dGUgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgX19mb3JtYXRmdW5jKHQsZixhKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQodCxmLGEpKSkKKyNlbHNlCisjIGRlZmluZSBfX2Zvcm1hdGZ1bmModCxmLGEpCisjZW5kaWYKKworLyogbWFsbG9jKCkgZnVuY3Rpb24gKHJldHVybnMgdW5hbGlhc2VkIHBvaW50ZXIpICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19NQUpPUl9fID49IDMpCisjIGRlZmluZSBfX21hbGxvY2Z1bmMgX19hdHRyaWJ1dGVfXygobWFsbG9jKSkKKyNlbHNlCisjIGRlZmluZSBfX21hbGxvY2Z1bmMKKyNlbmRpZgorCisvKiBsaWtlbHkvdW5saWtlbHkgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX01BSk9SX18gPiAyIHx8IChfX0dOVUNfTUFKT1JfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk1KSkKKyMgZGVmaW5lIF9fbGlrZWx5KHgpICAgX19idWlsdGluX2V4cGVjdCghISh4KSwgMSkKKyMgZGVmaW5lIF9fdW5saWtlbHkoeCkgX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpa2VseSh4KSAgICghISh4KSkKKyMgZGVmaW5lIF9fdW5saWtlbHkoeCkgKCEhKHgpKQorI2VuZGlmCisKKy8qIFBvc3NpYmx5IHVudXNlZCBmdW5jdGlvbiAqLworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBfX3VudXNlZGZ1bmMJX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjIGRlZmluZSBfX3VudXNlZGZ1bmMKKyNlbmRpZgorCisvKiBEZWNsYXJlIGEgdmFyaWFibGUgb3IgZGF0YSBzdHJ1Y3R1cmUgYXMgdW51c2VkLiAqLworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBfX3VudXNlZAlfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UKKyMgZGVmaW5lIF9fdW51c2VkCisjZW5kaWYKKworLyogVXNlZCBzeW1ib2wgKi8KKyNkZWZpbmUgX191c2VkCQkJCV9fYXR0cmlidXRlX18oKHVzZWQpKQorCisvKiBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzICovCisjZGVmaW5lIF9fY29uc3RydWN0b3IJX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKQorI2RlZmluZSBfX2Rlc3RydWN0b3IJX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpCisKKy8qIFBhY2tlZCBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIF9fcGFja2VkCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisKKy8qIFdlYWsgc3ltYm9scyAqLworI2RlZmluZSBfX3dlYWsgICAgICAgICAgX19hdHRyaWJ1dGVfXygod2VhaykpCisKKy8qIEFsaWdubWVudCAqLworI2RlZmluZSBfX2FsaWduZWQoeCkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCh4KSkpCisjZGVmaW5lIF9fYWxpZ25hcyh4KQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKF9fYWxpZ25vZl9fKHgpKSkpCisKKy8qIEhhbmRsaW5nIG9mIGNvbW1vbiAoYWZmZWN0IGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycykgKi8KKyNkZWZpbmUgX19jb21tb24JX19hdHRyaWJ1dGVfXygoY29tbW9uKSkKKyNkZWZpbmUgX19ub2NvbW1vbglfX2F0dHJpYnV0ZV9fKChub2NvbW1vbikpCisKKy8qIFdlYWsgc3ltYm9scyAqLworI2RlZmluZSBfX3dlYWsJCQlfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKKworI2RlZmluZSBfX2V4cG9ydAkJX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2tsaWJjL2RpdmVyci5oIGIvY29tMzIvaW5jbHVkZS9rbGliYy9kaXZlcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDZmMDYyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9rbGliYy9kaXZlcnIuaApAQCAtMCwwICsxLDQgQEAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RpdmlkZV9lcnJvcih2b2lkKQoreworICAgIGFzbSB2b2xhdGlsZSAoImludCAkMCIpOwkvKiBEaXZpZGUgYnkgemVybyAqLworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9rbGliYy9lbmRpYW4uaCBiL2NvbTMyL2luY2x1ZGUva2xpYmMvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2NjQyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUva2xpYmMvZW5kaWFuLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIGtsaWJjL2VuZGlhbi5oCisgKgorICogTGlrZSA8ZW5kaWFuLmg+LCBidXQgZXhwb3J0IG9ubHkgZG91YmxlLXVuZGVyc2NvcmUgc3ltYm9scworICovCisKKyNpZm5kZWYgX0tMSUJDX0VORElBTl9ICisjZGVmaW5lIF9LTElCQ19FTkRJQU5fSAorCisjZGVmaW5lIF9fTElUVExFX0VORElBTgkJLyogd2UncmUgb24gaTM4NiwgbGl0dGxlZW5kaWFuICovCisKKy8qIExpbnV4JyBhc20vYnl0ZW9yZGVyLmggZGVmaW5lcyBlaXRoZXIgX19MSVRUTEVfRU5ESUFOIG9yCisgICBfX0JJR19FTkRJQU4sIGJ1dCB0aGUgZ2xpYmMvQlNELWlzaCBtYWNyb3MgZXhwZWN0IGJvdGggdG8gYmUKKyAgIGRlZmluZWQgd2l0aCBfX0JZVEVfT1JERVIgZGVmaW5pbmcgd2hpY2ggaXMgYWN0dWFsbHkgdXNlZC4uLiAqLworCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjIHVuZGVmICBfX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0CisjIGRlZmluZSBfX0JJR19FTkRJQU4gICAgNDMyMQorIyBkZWZpbmUgX19QRFBfRU5ESUFOICAgIDM0MTIKKyMgZGVmaW5lIF9fQllURV9PUkRFUiAgICBfX0xJVFRMRV9FTkRJQU4KKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorIyB1bmRlZiAgX19CSUdfRU5ESUFOCisjIGRlZmluZSBfX0xJVFRMRV9FTkRJQU4gMTIzNAorIyBkZWZpbmUgX19CSUdfRU5ESUFOICAgIDQzMjEKKyMgZGVmaW5lIF9fUERQX0VORElBTiAgICAzNDEyCisjIGRlZmluZSBfX0JZVEVfT1JERVIgICAgX19CSUdfRU5ESUFOCisjZWxpZiBkZWZpbmVkKF9fUERQX0VORElBTikKKyMgdW5kZWYgIF9fUERQX0VORElBTgorIyBkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEyMzQKKyMgZGVmaW5lIF9fQklHX0VORElBTiAgICA0MzIxCisjIGRlZmluZSBfX1BEUF9FTkRJQU4gICAgMzQxMgorIyBkZWZpbmUgX19CWVRFX09SREVSICAgIF9fUERQX0VORElBTgorI2Vsc2UKKyMgZXJyb3IgIlVua25vd24gYnl0ZSBvcmRlciEiCisjZW5kaWYKKworI2VuZGlmIC8qIF9LTElCQ19FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9rbGliYy9leHRlcm4uaCBiL2NvbTMyL2luY2x1ZGUva2xpYmMvZXh0ZXJuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljMzQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUva2xpYmMvZXh0ZXJuLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGtsaWJjL2V4dGVybi5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfRVhURVJOX0gKKyNkZWZpbmUgX0tMSUJDX0VYVEVSTl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBfX2V4dGVybiBleHRlcm4gIkMiCisjZWxzZQorI2RlZmluZSBfX2V4dGVybiBleHRlcm4KKyNlbmRpZgorCisjZW5kaWYgLyogX0tMSUJDX0VYVEVSTl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2tsaWJjL2kzODYvYXJjaHNldGptcC5oIGIvY29tMzIvaW5jbHVkZS9rbGliYy9pMzg2L2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRlZjZhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9rbGliYy9pMzg2L2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogYXJjaC9pMzg2L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisgICAgdW5zaWduZWQgaW50IF9fZWJ4OworICAgIHVuc2lnbmVkIGludCBfX2VzcDsKKyAgICB1bnNpZ25lZCBpbnQgX19lYnA7CisgICAgdW5zaWduZWQgaW50IF9fZXNpOworICAgIHVuc2lnbmVkIGludCBfX2VkaTsKKyAgICB1bnNpZ25lZCBpbnQgX19laXA7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmIC8qIF9TRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBiL2NvbTMyL2luY2x1ZGUva2xpYmMvc3lzY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhYWFmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUva2xpYmMvc3lzY29uZmlnLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGtsaWJjL3N5c2NvbmZpZy5oCisgKgorICogQWxsb3dzIGZvciBkZWZpbml0aW9ucyBvZiBzb21lIHRoaW5ncyB3aGljaCBtYXkgYmUgc3lzdGVtLWRlcGVuZGVudAorICovCisKKyNpZm5kZWYgX0tMSUJDX1NZU0NPTkZJR19ICisjZGVmaW5lIF9LTElCQ19TWVNDT05GSUdfSAorCisvKgorICogRGVmaW5lIHRoaXMgdG8gb2J0YWluIG1lbW9yeSB1c2luZyBzYnJrKCkgaW5zdGVhZAorICogb2YgbW1hcCgpLiAgVGhpcyBzaG91bGQgbWFrZSBpdCBmcmllbmRsaWVyIG9uCisgKiBub24tTU1VIGFyY2hpdGVjdHVyZXMuICBUaGlzIHNob3VsZCBiZWNvbWUgYQorICogcGVyLWFyY2hpdGVjdHVyZSBjb25maWd1cmFibGUuCisgKi8KKyNkZWZpbmUgTUFMTE9DX1VTSU5HX1NCUksKKworLyoKKyAqIFRoaXMgaXMgdGhlIG1pbmltdW0gY2h1bmsgc2l6ZSB3ZSB3aWxsIGFzayB0aGUga2VybmVsIGZvciB1c2luZworICogbWFsbG9jKCk7IHRoaXMgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZSBvbiBhbGwKKyAqIGFyY2hpdGVjdHVyZXMuCisgKi8KKyNkZWZpbmUgTUFMTE9DX0NIVU5LX1NJWkUJNDA5NgorI2RlZmluZSBNQUxMT0NfQ0hVTktfTUFTSyAgICAgICAoTUFMTE9DX0NIVU5LX1NJWkUtMSkKKworLyoKKyAqIFRoaXMgaXMgdGhlIG1pbmltdW0gYWxpZ25tZW50IGZvciB0aGUgbWVtb3J5IHJldHVybmVkIGJ5IHNicmsoKS4KKyAqIEl0IG11c3QgYmUgYSBwb3dlciBvZiAyLiAgSWYgTUFMTE9DX1VTSU5HX1NCUksgaXMgZGVmaW5lZCBpdCBzaG91bGQKKyAqIGJlIG5vIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiBzdHJ1Y3QgYXJlbmFfaGVhZGVyIGluIG1hbGxvYy5oICg0CisgKiBwb2ludGVycy4pCisgKi8KKyNkZWZpbmUgU0JSS19BTElHTk1FTlQJCTMyCisKKyNlbmRpZiAvKiBfS0xJQkNfU1lTQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUva2xpYmMveDg2XzY0L2FyY2hzZXRqbXAuaCBiL2NvbTMyL2luY2x1ZGUva2xpYmMveDg2XzY0L2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRmYzYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9rbGliYy94ODZfNjQvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBhcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVuc2lnbmVkIGxvbmcgX19yYng7CisJdW5zaWduZWQgbG9uZyBfX3JzcDsKKwl1bnNpZ25lZCBsb25nIF9fcmJwOworCXVuc2lnbmVkIGxvbmcgX19yMTI7CisJdW5zaWduZWQgbG9uZyBfX3IxMzsKKwl1bnNpZ25lZCBsb25nIF9fcjE0OworCXVuc2lnbmVkIGxvbmcgX19yMTU7CisJdW5zaWduZWQgbG9uZyBfX3JpcDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2xpYmFuc2kuaCBiL2NvbTMyL2luY2x1ZGUvbGliYW5zaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTNmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2xpYmFuc2kuaApAQCAtMCwwICsxLDEwMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIERFRklORV9MSUJfQU5TSV9ICisjZGVmaW5lIERFRklORV9MSUJfQU5TSV9ICisKKyNkZWZpbmUgQ1NJICJcZVsiCisKK3ZvaWQgZGlzcGxheV9jdXJzb3IoYm9vbCBzdGF0dXMpOwordm9pZCBjbGVhcl9lbmRfb2ZfbGluZSh2b2lkKTsKK3ZvaWQgbW92ZV9jdXJzb3JfbGVmdChpbnQgY291bnQpOwordm9pZCBtb3ZlX2N1cnNvcl9yaWdodChpbnQgY291bnQpOwordm9pZCBjbGVhcl9saW5lKHZvaWQpOwordm9pZCBjbGVhcl9iZWdpbm5pbmdfb2ZfbGluZSh2b2lkKTsKK3ZvaWQgbW92ZV9jdXJzb3JfdG9fY29sdW1uKGludCBjb3VudCk7Cit2b2lkIG1vdmVfY3Vyc29yX3RvX25leHRfbGluZSh2b2lkKTsKK3ZvaWQgZGlzYWJsZV91dGY4KHZvaWQpOwordm9pZCBzZXRfZzFfc3BlY2lhbF9jaGFyKHZvaWQpOwordm9pZCBzZXRfdXNfZzBfY2hhcnNldCh2b2lkKTsKK3ZvaWQgY2xlYXJfZW50aXJlX3NjcmVlbih2b2lkKTsKK3ZvaWQgc2V0X2N1cnNvcl9ibGluayhib29sIHN0YXR1cyk7Cit2b2lkIG1vdmVfY3Vyc29yX3RvX25leHRfbGluZSh2b2lkKTsKK3ZvaWQgZGlzYWJsZV91dGY4KHZvaWQpOwordm9pZCBzZXRfZzFfc3BlY2lhbF9jaGFyKHZvaWQpOwordm9pZCBzZXRfdXNfZzBfY2hhcnNldCh2b2lkKTsKK3ZvaWQgY2xlYXJfZW50aXJlX3NjcmVlbih2b2lkKTsKK3ZvaWQgY2xlYXJ3aW5kb3coY29uc3QgY2hhciB0b3AsIGNvbnN0IGNoYXIgbGVmdCwgY29uc3QgY2hhciBib3QsCisJCSBjb25zdCBjaGFyIHJpZ2h0LCBjb25zdCBjaGFyIGZpbGxjaGFyLCBjb25zdCBjaGFyIGZpbGxhdHRyKTsKKworc3RhdGljIGlubGluZSB2b2lkIGJlZXAodm9pZCkKK3sKKwlmcHV0cygiXDAwNyIsIHN0ZG91dCk7Cit9CisKK3ZvaWQgcmVzZXRfY29sb3JzKHZvaWQpOworCisvKiBQcmludCBhIHN0cmluZyAqLwordm9pZCBjc3ByaW50KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhcik7CisKKy8qIFByaW50IG9uZSBjaGFyYWN0ZXIsIG9uZSBvciBtb3JlIHRpbWVzICovCit2b2lkIGNwcmludChjb25zdCBjaGFyLCBjb25zdCBjaGFyLCB1bnNpZ25lZCBpbnQpOworCisvKiBQcmludCBvbmUgY2hhcmFjdGVyLCBvbmNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0Y2goY29uc3QgY2hhciB4LCBjaGFyIGF0dHIpCit7CisJY3ByaW50KHgsIGF0dHIsIDEpOworfQorCit2b2lkIGNscyh2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIGN1cnNvcm9mZih2b2lkKQoreworICBkaXNwbGF5X2N1cnNvcihmYWxzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdXJzb3Jvbih2b2lkKQoreworICBkaXNwbGF5X2N1cnNvcih0cnVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjcm9sbHVwKGludCB0aW1lcykKK3sKKyAgICBpZiAodGltZXMgPiAwKQorICAgICAgICBwcmludGYoQ1NJICIlZFMiLCB0aW1lcyk7Cit9CisKKy8qIFNjcm9sbCB1cCBkaXNwbGF5IHNjcmVlbiBieSBvbmUgbGluZSAqLworc3RhdGljIGlubGluZSB2b2lkIHNjcm9sbHVwX29uY2Uodm9pZCkKK3sKKwlwcmludGYoQ1NJICJTIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnb3RveHkoY29uc3QgY2hhciByb3csIGNvbnN0IGNoYXIgY29sKQoreworCXByaW50ZihDU0kgIiVkOyVkSCIsIHJvdyArIDEsIGNvbCArIDEpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvbGltaXRzLmggYi9jb20zMi9pbmNsdWRlL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWY5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2xpbWl0cy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBsaW1pdHMuaAorICovCisKKyNpZm5kZWYgX0xJTUlUU19ICisjZGVmaW5lIF9MSU1JVFNfSAorCisjZGVmaW5lIENIQVJfQklUCTgKKyNkZWZpbmUgU0hSVF9CSVQJMTYKKyNkZWZpbmUgSU5UX0JJVAkJMzIKKyNkZWZpbmUgTE9OR0xPTkdfQklUCTY0CisKKyNkZWZpbmUgU0NIQVJfTUlOCSgtMTI4KQorI2RlZmluZSBTQ0hBUl9NQVgJMTI3CisjZGVmaW5lIFVDSEFSX01BWAkyNTUKKworI2lmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisjIGRlZmluZSBDSEFSX01JTiAwCisjIGRlZmluZSBDSEFSX01BWCBVQ0hBUl9NQVgKKyNlbHNlCisjIGRlZmluZSBDSEFSX01JTiBTQ0hBUl9NSU4KKyMgZGVmaW5lIENIQVJfTUFYIFNDSEFSX01BWAorI2VuZGlmCisKKyNkZWZpbmUgU0hSVF9NSU4JKC0zMjc2OCkKKyNkZWZpbmUgU0hSVF9NQVgJMzI3NjcKKyNkZWZpbmUgVVNIUlRfTUFYCTY1NTM1CisKKyNkZWZpbmUgSU5UX01JTgkJKC0yMTQ3NDgzNjQ3LTEpCisjZGVmaW5lIElOVF9NQVgJCTIxNDc0ODM2NDcKKyNkZWZpbmUgVUlOVF9NQVgJNDI5NDk2NzI5NVUKKworI2RlZmluZSBMT05HTE9OR19NSU4JKC05MjIzMzcyMDM2ODU0Nzc1ODA3TEwtMSkKKyNkZWZpbmUgTE9OR0xPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorI2RlZmluZSBVTE9OR0xPTkdfTUFYCTE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMCisKKyNpbmNsdWRlIDxiaXRzaXplL2xpbWl0cy5oPgorCisjZW5kaWYgLyogX0xJTUlUU19IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL2NvbTMyL2luY2x1ZGUvbGludXgvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1N2RlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL2xpbnV4L2xpc3QuaApAQCAtMCwwICsxLDQ2NCBAQAorLy8gVGhpcyBsaXN0IHN0cnVjdHVyZSBpbXBsZW1lbnRhdGlvbiBpcyBhZGFwdGVkIGZyb20gdGhlIGxpc3QgaW1wbGVtZW50YXRpb24KKy8vIG9uIHRoZSBMaW51eCBrZXJuZWwuCisKKy8vIE9yaWdpbmFsIHNvdXJjZToKKy8vIGh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L3N0YWJsZS9saW51eC0yLjYuMjUueS5naXQ7YT1ibG9iX3BsYWluO2Y9aW5jbHVkZS9saW51eC9saXN0Lmg7aGI9SEVBRAorCisjaWZuZGVmIF9MSU5VWF9MSVNUX0gKKyNkZWZpbmUgX0xJTlVYX0xJU1RfSAorCisvKgorICogU2ltcGxlIGRvdWJseSBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBTb21lIG9mIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKCJfX3h4eCIpIGFyZSB1c2VmdWwgd2hlbgorICogbWFuaXB1bGF0aW5nIHdob2xlIGxpc3RzIHJhdGhlciB0aGFuIHNpbmdsZSBlbnRyaWVzLCBhcworICogc29tZXRpbWVzIHdlIGFscmVhZHkga25vdyB0aGUgbmV4dC9wcmV2IGVudHJpZXMgYW5kIHdlIGNhbgorICogZ2VuZXJhdGUgYmV0dGVyIGNvZGUgYnkgdXNpbmcgdGhlbSBkaXJlY3RseSByYXRoZXIgdGhhbgorICogdXNpbmcgdGhlIGdlbmVyaWMgc2luZ2xlLWVudHJ5IHJvdXRpbmVzLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworc3RydWN0IGxpc3RfaGVhZCB7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCwgKnByZXY7Cit9OworCisjZGVmaW5lIExJU1RfSEVBRF9JTklUKG5hbWUpIHsgJihuYW1lKSwgJihuYW1lKSB9CisKKyNkZWZpbmUgTElTVF9IRUFEKG5hbWUpIFwKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWUgPSBMSVNUX0hFQURfSU5JVChuYW1lKQorCitzdGF0aWMgaW5saW5lIHZvaWQgSU5JVF9MSVNUX0hFQUQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlsaXN0LT5uZXh0ID0gbGlzdDsKKwlsaXN0LT5wcmV2ID0gbGlzdDsKK30KKworLyoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBiZXR3ZWVuIHR3byBrbm93biBjb25zZWN1dGl2ZSBlbnRyaWVzLgorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGlzdCBtYW5pcHVsYXRpb24gd2hlcmUgd2Uga25vdworICogdGhlIHByZXYvbmV4dCBlbnRyaWVzIGFscmVhZHkhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKm5ldywKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnByZXYsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0KQoreworCW5leHQtPnByZXYgPSBuZXc7CisJbmV3LT5uZXh0ID0gbmV4dDsKKwluZXctPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXc7Cit9CisKKy8qKgorICogbGlzdF9hZGQgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBuZXc6IG5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6IGxpc3QgaGVhZCB0byBhZGQgaXQgYWZ0ZXIKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBoZWFkLgorICogVGhpcyBpcyBnb29kIGZvciBpbXBsZW1lbnRpbmcgc3RhY2tzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqbmV3LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQobmV3LCBoZWFkLCBoZWFkLT5uZXh0KTsKK30KKworCisKKy8qKgorICogbGlzdF9hZGRfdGFpbCAtIGFkZCBhIG5ldyBlbnRyeQorICogQG5ldzogbmV3IGVudHJ5IHRvIGJlIGFkZGVkCisgKiBAaGVhZDogbGlzdCBoZWFkIHRvIGFkZCBpdCBiZWZvcmUKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYmVmb3JlIHRoZSBzcGVjaWZpZWQgaGVhZC4KKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgcXVldWVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGRfdGFpbChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJX19saXN0X2FkZChuZXcsIGhlYWQtPnByZXYsIGhlYWQpOworfQorCisKKy8qCisgKiBEZWxldGUgYSBsaXN0IGVudHJ5IGJ5IG1ha2luZyB0aGUgcHJldi9uZXh0IGVudHJpZXMKKyAqIHBvaW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqIHByZXYsIHN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KQoreworCW5leHQtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXh0OworfQorCisvKioKKyAqIGxpc3RfZGVsIC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxpc3QuCisgKiBAZW50cnk6IHRoZSBlbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsaXN0LgorICogTm90ZTogbGlzdF9lbXB0eSgpIG9uIGVudHJ5IGRvZXMgbm90IHJldHVybiB0cnVlIGFmdGVyIHRoaXMsIHRoZSBlbnRyeSBpcworICogaW4gYW4gdW5kZWZpbmVkIHN0YXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19saXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworCWVudHJ5LT5uZXh0ID0gTlVMTDsKKwllbnRyeS0+cHJldiA9IE5VTEw7Cit9CisKKy8qKgorICogbGlzdF9yZXBsYWNlIC0gcmVwbGFjZSBvbGQgZW50cnkgYnkgbmV3IG9uZQorICogQG9sZCA6IHRoZSBlbGVtZW50IHRvIGJlIHJlcGxhY2VkCisgKiBAbmV3IDogdGhlIG5ldyBlbGVtZW50IHRvIGluc2VydAorICoKKyAqIElmIEBvbGQgd2FzIGVtcHR5LCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9yZXBsYWNlKHN0cnVjdCBsaXN0X2hlYWQgKm9sZCwKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXcpCit7CisJbmV3LT5uZXh0ID0gb2xkLT5uZXh0OworCW5ldy0+bmV4dC0+cHJldiA9IG5ldzsKKwluZXctPnByZXYgPSBvbGQtPnByZXY7CisJbmV3LT5wcmV2LT5uZXh0ID0gbmV3OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9yZXBsYWNlX2luaXQoc3RydWN0IGxpc3RfaGVhZCAqb2xkLAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXcpCit7CisJbGlzdF9yZXBsYWNlKG9sZCwgbmV3KTsKKwlJTklUX0xJU1RfSEVBRChvbGQpOworfQorCisvKioKKyAqIGxpc3RfZGVsX2luaXQgLSBkZWxldGVzIGVudHJ5IGZyb20gbGlzdCBhbmQgcmVpbml0aWFsaXplIGl0LgorICogQGVudHJ5OiB0aGUgZWxlbWVudCB0byBkZWxldGUgZnJvbSB0aGUgbGlzdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfZGVsX2luaXQoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19saXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworCUlOSVRfTElTVF9IRUFEKGVudHJ5KTsKK30KKworLyoqCisgKiBsaXN0X21vdmUgLSBkZWxldGUgZnJvbSBvbmUgbGlzdCBhbmQgYWRkIGFzIGFub3RoZXIncyBoZWFkCisgKiBAbGlzdDogdGhlIGVudHJ5IHRvIG1vdmUKKyAqIEBoZWFkOiB0aGUgaGVhZCB0aGF0IHdpbGwgcHJlY2VkZSBvdXIgZW50cnkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9kZWwobGlzdC0+cHJldiwgbGlzdC0+bmV4dCk7CisJbGlzdF9hZGQobGlzdCwgaGVhZCk7Cit9CisKKy8qKgorICogbGlzdF9tb3ZlX3RhaWwgLSBkZWxldGUgZnJvbSBvbmUgbGlzdCBhbmQgYWRkIGFzIGFub3RoZXIncyB0YWlsCisgKiBAbGlzdDogdGhlIGVudHJ5IHRvIG1vdmUKKyAqIEBoZWFkOiB0aGUgaGVhZCB0aGF0IHdpbGwgZm9sbG93IG91ciBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9tb3ZlX3RhaWwoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJX19saXN0X2RlbChsaXN0LT5wcmV2LCBsaXN0LT5uZXh0KTsKKwlsaXN0X2FkZF90YWlsKGxpc3QsIGhlYWQpOworfQorCisvKioKKyAqIGxpc3RfaXNfbGFzdCAtIHRlc3RzIHdoZXRoZXIgQGxpc3QgaXMgdGhlIGxhc3QgZW50cnkgaW4gbGlzdCBAaGVhZAorICogQGxpc3Q6IHRoZSBlbnRyeSB0byB0ZXN0CisgKiBAaGVhZDogdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqLworc3RhdGljIGlubGluZSBpbnQgbGlzdF9pc19sYXN0KGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gbGlzdC0+bmV4dCA9PSBoZWFkOworfQorCisvKioKKyAqIGxpc3RfZW1wdHkgLSB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eQorICogQGhlYWQ6IHRoZSBsaXN0IHRvIHRlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gaGVhZC0+bmV4dCA9PSBoZWFkOworfQorCisvKioKKyAqIGxpc3RfZW1wdHlfY2FyZWZ1bCAtIHRlc3RzIHdoZXRoZXIgYSBsaXN0IGlzIGVtcHR5IGFuZCBub3QgYmVpbmcgbW9kaWZpZWQKKyAqIEBoZWFkOiB0aGUgbGlzdCB0byB0ZXN0CisgKgorICogRGVzY3JpcHRpb246CisgKiB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eSBfYW5kXyBjaGVja3MgdGhhdCBubyBvdGhlciBDUFUgbWlnaHQgYmUKKyAqIGluIHRoZSBwcm9jZXNzIG9mIG1vZGlmeWluZyBlaXRoZXIgbWVtYmVyIChuZXh0IG9yIHByZXYpCisgKgorICogTk9URTogdXNpbmcgbGlzdF9lbXB0eV9jYXJlZnVsKCkgd2l0aG91dCBzeW5jaHJvbml6YXRpb24KKyAqIGNhbiBvbmx5IGJlIHNhZmUgaWYgdGhlIG9ubHkgYWN0aXZpdHkgdGhhdCBjYW4gaGFwcGVuCisgKiB0byB0aGUgbGlzdCBlbnRyeSBpcyBsaXN0X2RlbF9pbml0KCkuIEVnLiBpdCBjYW5ub3QgYmUgdXNlZAorICogaWYgYW5vdGhlciBDUFUgY291bGQgcmUtbGlzdF9hZGQoKSBpdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbGlzdF9lbXB0eV9jYXJlZnVsKGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IGhlYWQtPm5leHQ7CisJcmV0dXJuIChuZXh0ID09IGhlYWQpICYmIChuZXh0ID09IGhlYWQtPnByZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X3NwbGljZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0ID0gbGlzdC0+bmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0ID0gbGlzdC0+cHJldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICphdCA9IGhlYWQtPm5leHQ7CisKKwlmaXJzdC0+cHJldiA9IGhlYWQ7CisJaGVhZC0+bmV4dCA9IGZpcnN0OworCisJbGFzdC0+bmV4dCA9IGF0OworCWF0LT5wcmV2ID0gbGFzdDsKK30KKworLyoqCisgKiBsaXN0X3NwbGljZSAtIGpvaW4gdHdvIGxpc3RzCisgKiBAbGlzdDogdGhlIG5ldyBsaXN0IHRvIGFkZC4KKyAqIEBoZWFkOiB0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlpZiAoIWxpc3RfZW1wdHkobGlzdCkpCisJCV9fbGlzdF9zcGxpY2UobGlzdCwgaGVhZCk7Cit9CisKKy8qKgorICogbGlzdF9zcGxpY2VfaW5pdCAtIGpvaW4gdHdvIGxpc3RzIGFuZCByZWluaXRpYWxpc2UgdGhlIGVtcHRpZWQgbGlzdC4KKyAqIEBsaXN0OiB0aGUgbmV3IGxpc3QgdG8gYWRkLgorICogQGhlYWQ6IHRoZSBwbGFjZSB0byBhZGQgaXQgaW4gdGhlIGZpcnN0IGxpc3QuCisgKgorICogVGhlIGxpc3QgYXQgQGxpc3QgaXMgcmVpbml0aWFsaXNlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2VfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCWlmICghbGlzdF9lbXB0eShsaXN0KSkgeworCQlfX2xpc3Rfc3BsaWNlKGxpc3QsIGhlYWQpOworCQlJTklUX0xJU1RfSEVBRChsaXN0KTsKKwl9Cit9CisKKy8qKgorICogbGlzdF9lbnRyeSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGlzIGVudHJ5CisgKiBAcHRyOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgcG9pbnRlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCWNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikKKworLyoqCisgKiBsaXN0X2ZpcnN0X2VudHJ5IC0gZ2V0IHRoZSBmaXJzdCBlbGVtZW50IGZyb20gYSBsaXN0CisgKiBAcHRyOgl0aGUgbGlzdCBoZWFkIHRvIHRha2UgdGhlIGVsZW1lbnQgZnJvbS4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogTm90ZSwgdGhhdCBsaXN0IGlzIGV4cGVjdGVkIHRvIGJlIG5vdCBlbXB0eS4KKyAqLworI2RlZmluZSBsaXN0X2ZpcnN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJbGlzdF9lbnRyeSgocHRyKS0+bmV4dCwgdHlwZSwgbWVtYmVyKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBcCisgICAgICAgIAlwb3MgPSBwb3MtPm5leHQpCisKKy8qKgorICogX19saXN0X2Zvcl9lYWNoCS0JaXRlcmF0ZSBvdmVyIGEgbGlzdAorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKgorICogVGhpcyB2YXJpYW50IGRpZmZlcnMgZnJvbSBsaXN0X2Zvcl9lYWNoKCkgaW4gdGhhdCBpdCdzIHRoZQorICogc2ltcGxlc3QgcG9zc2libGUgbGlzdCBpdGVyYXRpb24gY29kZSwgbm8gcHJlZmV0Y2hpbmcgaXMgZG9uZS4KKyAqIFVzZSB0aGlzIGZvciBjb2RlIHRoYXQga25vd3MgdGhlIGxpc3QgdG8gYmUgdmVyeSBzaG9ydCAoZW1wdHkKKyAqIG9yIDEgZW50cnkpIG1vc3Qgb2YgdGhlIHRpbWUuCisgKi8KKyNkZWZpbmUgX19saXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBwb3MgPSBwb3MtPm5leHQpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9wcmV2CS0JaXRlcmF0ZSBvdmVyIGEgbGlzdCBiYWNrd2FyZHMKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfcHJldihwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+cHJldjsgcG9zICE9IChoZWFkKTsgXAorICAgICAgICAJcG9zID0gcG9zLT5wcmV2KQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfc2FmZSAtIGl0ZXJhdGUgb3ZlciBhIGxpc3Qgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeQorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0LCBuID0gcG9zLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBcCisJCXBvcyA9IG4sIG4gPSBwb3MtPm5leHQpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9wcmV2X3NhZmUgLSBpdGVyYXRlIG92ZXIgYSBsaXN0IGJhY2t3YXJkcyBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbjoJCWFub3RoZXIgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX3ByZXZfc2FmZShwb3MsIG4sIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+cHJldiwgbiA9IHBvcy0+cHJldjsgXAorCSAgICAgcG9zICE9IChoZWFkKTsgXAorCSAgICAgcG9zID0gbiwgbiA9IHBvcy0+cHJldikKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5CS0JaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpCQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgLSBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlIHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkKKyogQHBvczogICAgICAgIHRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisqIEBuOiAgICAgICAgICBhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyogQGhlYWQ6ICAgICAgIHRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisqIEBtZW1iZXI6ICAgICB0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCBoZWFkLCBtZW1iZXIpICAgICAgICAgICAgICAgICAgXAorCWZvciAocG9zID0gbGlzdF9lbnRyeSgoaGVhZCktPm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwgICAgICBcCisJCW4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsgXAorICAgICAgICAgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7CQkJCQlcCisgICAgICAgICAgICAgcG9zID0gbiwgbiA9IGxpc3RfZW50cnkobi0+bWVtYmVyLm5leHQsIHR5cGVvZigqbiksIG1lbWJlcikpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlIC0gaXRlcmF0ZSBiYWNrd2FyZHMgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUuCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBvcywgaGVhZCwgbWVtYmVyKQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5wcmV2LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X3ByZXBhcmVfZW50cnkgLSBwcmVwYXJlIGEgcG9zIGVudHJ5IGZvciB1c2UgaW4gbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSgpCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIHN0YXJ0IHBvaW50CisgKiBAaGVhZDoJdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBQcmVwYXJlcyBhIHBvcyBlbnRyeSBmb3IgdXNlIGFzIGEgc3RhcnQgcG9pbnQgaW4gbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSgpLgorICovCisjZGVmaW5lIGxpc3RfcHJlcGFyZV9lbnRyeShwb3MsIGhlYWQsIG1lbWJlcikgXAorCSgocG9zKSA/IDogbGlzdF9lbnRyeShoZWFkLCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSAtIGNvbnRpbnVlIGl0ZXJhdGlvbiBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIENvbnRpbnVlIHRvIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUsIGNvbnRpbnVpbmcgYWZ0ZXIKKyAqIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocG9zLCBoZWFkLCBtZW1iZXIpIAkJXAorCWZvciAocG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7CVwKKwkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZSAtIGl0ZXJhdGUgYmFja3dhcmRzIGZyb20gdGhlIGdpdmVuIHBvaW50CisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogU3RhcnQgdG8gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBiYWNrd2FyZHMsIGNvbnRpbnVpbmcgYWZ0ZXIKKyAqIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZShwb3MsIGhlYWQsIG1lbWJlcikJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIucHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOwlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20gLSBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBJdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLCBjb250aW51aW5nIGZyb20gY3VycmVudCBwb3NpdGlvbi4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20ocG9zLCBoZWFkLCBtZW1iZXIpIAkJCVwKKwlmb3IgKDsgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJXAorCSAgICAgcG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIC0gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sIGhlYWQsIG1lbWJlcikJCQlcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCW4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogSXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgY29udGludWluZyBhZnRlciBjdXJyZW50IHBvaW50LAorICogc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeS4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUocG9zLCBuLCBoZWFkLCBtZW1iZXIpIAkJXAorCWZvciAocG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksIAkJXAorCQluID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CQlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwkJCQkJCVwKKwkgICAgIHBvcyA9IG4sIG4gPSBsaXN0X2VudHJ5KG4tPm1lbWJlci5uZXh0LCB0eXBlb2YoKm4pLCBtZW1iZXIpKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9mcm9tCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIEl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgZnJvbSBjdXJyZW50IHBvaW50LCBzYWZlIGFnYWluc3QKKyAqIHJlbW92YWwgb2YgbGlzdCBlbnRyeS4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbShwb3MsIG4sIGhlYWQsIG1lbWJlcikgCQkJXAorCWZvciAobiA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOwkJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBuOgkJYW5vdGhlciB0eXBlICogdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBJdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgc2FmZSBhZ2FpbnN0IHJlbW92YWwKKyAqIG9mIGxpc3QgZW50cnkuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocG9zLCBuLCBoZWFkLCBtZW1iZXIpCQlcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+cHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCW4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIucHJldiwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvbWF0aC5oIGIvY29tMzIvaW5jbHVkZS9tYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkMjQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvbWF0aC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX01BVEhfSAorI2RlZmluZSBfTUFUSF9ICisKKyNpZm5kZWYgX19EQkxfTUlOX0VYUF9fCisjIGRlZmluZSBfX0RCTF9NSU5fRVhQX18gKC0xMDIxKQorI2VuZGlmCisjaWZuZGVmIF9fREJMX01BWF9FWFBfXworIyBkZWZpbmUgX19EQkxfTUFYX0VYUF9fIDEwMjQKKyNlbmRpZgorCitkb3VibGUgcG93KGRvdWJsZSwgZG91YmxlKTsKK2RvdWJsZSBmYWJzKGRvdWJsZSk7Citkb3VibGUgc3RydG9kKGNvbnN0IGNoYXIgKiwgY2hhciAqKik7CisKKyNlbmRpZiAvKiBfTUFUSF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL21lbnUuaCBiL2NvbTMyL2luY2x1ZGUvbWVudS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMDE4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL21lbnUuaApAQCAtMCwwICsxLDIzNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1lbnUuaAorICoKKyAqIEhlYWRlciBmaWxlIGZvciB0aGUgc2ltcGxlIG1lbnUgc3lzdGVtCisgKi8KKworI2lmbmRlZiBNRU5VX0gKKyNkZWZpbmUgTUVOVV9ICisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGNvbG9ydGJsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPGdldGtleS5oPgorI2luY2x1ZGUgInJlZnN0ci5oIgorCisvKiAjZGVmaW5lIERFQlVHIDEgKi8KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisKKyNpZm5kZWYgQ0xLX1RDSworIyBkZWZpbmUgQ0xLX1RDSyBzeXNjb25mKF9TQ19DTEtfVENLKQorI2VuZGlmCisKK3N0cnVjdCBtZW51OworCisvKiBOb3RlOiB0aGUgX1VOUkVTIHZhcmlhbnRzIG11c3QgYWx3YXlzIGJlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZWlyCisgICAibm9ybWFsIiB2ZXJzaW9ucy4gKi8KK2VudW0gbWVudV9hY3Rpb24geworICAgIE1BX05PTkUsCQkJLyogVW5kZWZpbmVkIHZhbHVlICovCisgICAgTUFfQ01ELAkJCS8qIEV4ZWN1dGUgYSBjb21tYW5kICovCisgICAgTUFfRElTQUJMRUQsCQkvKiBEaXNhYmxlZCBtZW51IGVudHJ5ICovCisgICAgTUFfU1VCTUVOVSwJCQkvKiBUaGlzIGlzIGEgc3VibWVudSBlbnRyeSAqLworICAgIE1BX0dPVE8sCQkJLyogR28gdG8gYW5vdGhlciBtZW51ICovCisgICAgTUFfR09UT19VTlJFUywJCS8qIFVucmVzb2x2ZWQgZ28gdG8gKi8KKyAgICBNQV9RVUlULAkJCS8qIFF1aXQgdG8gQ0xJICovCisgICAgTUFfRVhJVCwJCQkvKiBFeGl0IHRvIGhpZ2hlci1sZXZlbCBtZW51ICovCisgICAgTUFfRVhJVF9VTlJFUywJCS8qIFVucmVzb2x2ZWQgZXhpdCAqLworICAgIE1BX0hFTFAsCQkJLyogU2hvdyBoZWxwIHRleHQgKi8KK307CisKK3N0cnVjdCBtZW51X2VudHJ5IHsKKyAgICBzdHJ1Y3QgbWVudSAqbWVudTsJCS8qIFBhcmVudCBtZW51ICovCisgICAgY29uc3QgY2hhciAqZGlzcGxheW5hbWU7CisgICAgY29uc3QgY2hhciAqbGFiZWw7CisgICAgY29uc3QgY2hhciAqcGFzc3dkOworICAgIGNoYXIgKmhlbHB0ZXh0OworICAgIGNvbnN0IGNoYXIgKmNtZGxpbmU7CisgICAgY29uc3QgY2hhciAqYmFja2dyb3VuZDsKKyAgICBzdHJ1Y3QgbWVudSAqc3VibWVudTsKKyAgICBzdHJ1Y3QgbWVudV9lbnRyeSAqbmV4dDsJLyogTGlua2VkIGxpc3Qgb2YgYWxsIGxhYmVscyBhY3Jvc3MgbWVudXMgKi8KKyAgICBpbnQgZW50cnk7CQkJLyogRW50cnkgbnVtYmVyIGluc2lkZSBtZW51ICovCisgICAgZW51bSBtZW51X2FjdGlvbiBhY3Rpb247CisgICAgdW5zaWduZWQgY2hhciBob3RrZXk7CisgICAgYm9vbCBpbW1lZGlhdGU7CQkvKiBIb3RrZXkgYWN0aW9uIGRvZXMgbm90IHJlcXVpcmUgRW50ZXIgKi8KKyAgICBib29sIHNhdmU7CQkJLyogU2F2ZSB0aGlzIGVudHJ5IGlmIHNlbGVjdGVkICovCit9OworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZGlzYWJsZWQoc3RydWN0IG1lbnVfZW50cnkgKm1lKQoreworICAgIHJldHVybiBtZS0+YWN0aW9uID09IE1BX0RJU0FCTEVEOworfQorCitlbnVtIGtlcm5lbF90eXBlIHsKKyAgICAvKiBNZXRhLXR5cGVzIGZvciBpbnRlcm5hbCB1c2UgKi8KKyAgICBLVF9OT05FLAorICAgIEtUX0xPQ0FMQk9PVCwKKworICAgIC8qIFRoZSBvbmVzIHdlIGNhbiBwYXNzIG9mZiB0byBTWVNMSU5VWCwgaW4gb3JkZXIgKi8KKyAgICBLVF9LRVJORUwsCQkJLyogVW5kZWZpbmVkIHR5cGUgKi8KKyAgICBLVF9MSU5VWCwJCQkvKiBMaW51eCBrZXJuZWwgKi8KKyAgICBLVF9CT09ULAkJCS8qIEJvb3RzdHJhcCBwcm9ncmFtICovCisgICAgS1RfQlNTLAkJCS8qIEJvb3Qgc2VjdG9yIHdpdGggcGF0Y2ggKi8KKyAgICBLVF9QWEUsCQkJLyogUFhFIE5CUCAqLworICAgIEtUX0ZESU1BR0UsCQkJLyogRmxvcHB5IGRpc2sgaW1hZ2UgKi8KKyAgICBLVF9DT00zMiwJCQkvKiBDT00zMiBpbWFnZSAqLworICAgIEtUX0NPTkZJRywJCQkvKiBDb25maWd1cmF0aW9uIGZpbGUgKi8KK307CisKKy8qIENvbmZpZ3VyYWJsZSBpbnRlZ2VyIHBhcmFtZXRlcnMgKi8KK2VudW0gcGFyYW1ldGVyX251bWJlciB7CisgICAgUF9XSURUSCwKKyAgICBQX01BUkdJTiwKKyAgICBQX1BBU1NXRF9NQVJHSU4sCisgICAgUF9NRU5VX1JPV1MsCisgICAgUF9UQUJNU0dfUk9XLAorICAgIFBfQ01ETElORV9ST1csCisgICAgUF9FTkRfUk9XLAorICAgIFBfUEFTU1dEX1JPVywKKyAgICBQX1RJTUVPVVRfUk9XLAorICAgIFBfSEVMUE1TR19ST1csCisgICAgUF9IRUxQTVNHRU5EX1JPVywKKyAgICBQX0hTSElGVCwKKyAgICBQX1ZTSElGVCwKKyAgICBQX0hJRERFTl9ST1csCisKKyAgICBOUEFSQU1TCit9OworCisvKiBDb25maWd1cmFibGUgbWVzc2FnZXMgKi8KK2VudW0gbWVzc2FnZV9udW1iZXIgeworICAgIE1TR19USVRMRSwKKyAgICBNU0dfQVVUT0JPT1QsCisgICAgTVNHX1RBQiwKKyAgICBNU0dfTk9UQUIsCisgICAgTVNHX1BBU1NQUk9NUFQsCisKKyAgICBNU0dfQ09VTlQKK307CisKK3N0cnVjdCBtZXNzYWdlcyB7CisgICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIE1lc3NhZ2UgY29uZmlndXJhdGlvbiBuYW1lICovCisgICAgY29uc3QgY2hhciAqZGVmbXNnOwkJLyogRGVmYXVsdCBtZXNzYWdlIHRleHQgKi8KK307CisKK3N0cnVjdCBtZW51X3BhcmFtZXRlciB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgdmFsdWU7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IG1lbnVfcGFyYW1ldGVyIG1wYXJtW05QQVJBTVNdOworCitzdHJ1Y3QgZmtleV9oZWxwIHsKKyAgICBjb25zdCBjaGFyICp0ZXh0bmFtZTsKKyAgICBjb25zdCBjaGFyICpiYWNrZ3JvdW5kOworfTsKKworc3RydWN0IG1lbnUgeworICAgIHN0cnVjdCBtZW51ICpuZXh0OwkJLyogTGlua2VkIGxpc3Qgb2YgYWxsIG1lbnVzICovCisgICAgY29uc3QgY2hhciAqbGFiZWw7CQkvKiBHb3RvIGxhYmVsIGZvciB0aGlzIG1lbnUgKi8KKyAgICBzdHJ1Y3QgbWVudSAqcGFyZW50OworICAgIHN0cnVjdCBtZW51X2VudHJ5ICpwYXJlbnRfZW50cnk7CS8qIEVudHJ5IGZvciBzZWxmIGluIHBhcmVudCAqLworCisgICAgc3RydWN0IG1lbnVfZW50cnkgKiptZW51X2VudHJpZXM7CisgICAgc3RydWN0IG1lbnVfZW50cnkgKm1lbnVfaG90a2V5c1syNTZdOworCisgICAgY29uc3QgY2hhciAqbWVzc2FnZXNbTVNHX0NPVU5UXTsKKyAgICBpbnQgbXBhcm1bTlBBUkFNU107CisKKyAgICBpbnQgbmVudHJpZXM7CisgICAgaW50IG5lbnRyaWVzX3NwYWNlOworICAgIGludCBkZWZlbnRyeTsKKyAgICBpbnQgdGltZW91dDsKKworICAgIGJvb2wgYWxsb3dlZGl0OworICAgIGJvb2wgaW1tZWRpYXRlOwkJLyogTUVOVSBJTU1FRElBVEUgZGVmYXVsdCBmb3IgdGhpcyBtZW51ICovCisgICAgYm9vbCBzYXZlOwkJCS8qIE1FTlUgU0FWRSBkZWZhdWx0IGZvciB0aGlzIG1lbnUgKi8KKworICAgIGludCBjdXJlbnRyeTsKKyAgICBpbnQgY3VydG9wOworCisgICAgY29uc3QgY2hhciAqdGl0bGU7CisgICAgY29uc3QgY2hhciAqb250aW1lb3V0OworICAgIGNvbnN0IGNoYXIgKm9uZXJyb3I7CisgICAgY29uc3QgY2hhciAqbWVudV9tYXN0ZXJfcGFzc3dkOworICAgIGNvbnN0IGNoYXIgKm1lbnVfYmFja2dyb3VuZDsKKworICAgIHN0cnVjdCBjb2xvcl90YWJsZSAqY29sb3JfdGFibGU7CisKKyAgICBzdHJ1Y3QgZmtleV9oZWxwIGZrZXloZWxwWzEyXTsKK307CisKK2V4dGVybiBzdHJ1Y3QgbWVudSAqcm9vdF9tZW51LCAqc3RhcnRfbWVudSwgKmhpZGVfbWVudSwgKm1lbnVfbGlzdDsKKworLyogMjA0OCBpcyB0aGUgY3VycmVudCBkZWZpbml0aW9uIGluc2lkZSBzeXNsaW51eCAqLworI2RlZmluZSBNQVhfQ01ETElORV9MRU4JIDIwNDgKKworLyogVGhlc2UgYXJlIGdsb2JhbCBwYXJhbWV0ZXJzIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbWVudSB3ZSdyZSBkaXNwbGF5aW5nICovCitleHRlcm4gaW50IHNoaWZ0a2V5OworZXh0ZXJuIGludCBoaWRkZW5tZW51OworZXh0ZXJuIGludCBjbGVhcm1lbnU7CitleHRlcm4gbG9uZyBsb25nIHRvdGFsdGltZW91dDsKK2V4dGVybiBjbG9ja190IGtiZHRpbWVvdXQ7CitleHRlcm4gY29uc3QgY2hhciAqaGlkZV9rZXlbS0VZX01BWF07CisKK3ZvaWQgcGFyc2VfY29uZmlncyhjaGFyICoqYXJndik7CitpbnQgZHJhd19iYWNrZ3JvdW5kKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3ZvaWQgc2V0X3Jlc29sdXRpb24oaW50IHgsIGludCB5KTsKK3ZvaWQgc3RhcnRfY29uc29sZSh2b2lkKTsKK3ZvaWQgbG9jYWxfY3Vyc29yX2VuYWJsZShib29sKTsKKworc3RhdGljIGlubGluZSBpbnQgbXlfaXNzcGFjZShjaGFyIGMpCit7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKWMgPD0gJyAnOworfQorCitpbnQgbXlfaXN4ZGlnaXQoY2hhciBjKTsKK3Vuc2lnbmVkIGludCBoZXh2YWwoY2hhciBjKTsKK3Vuc2lnbmVkIGludCBoZXh2YWwyKGNvbnN0IGNoYXIgKnApOwordWludDMyX3QgcGFyc2VfYXJnYihjaGFyICoqcCk7CisKK2V4dGVybiBjb25zdCBpbnQgbWVzc2FnZV9iYXNlX2NvbG9yLCBtZW51X2NvbG9yX3RhYmxlX3NpemU7CitpbnQgbXlnZXRrZXkoY2xvY2tfdCB0aW1lb3V0KTsKK2ludCBzaG93X21lc3NhZ2VfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqYmFja2dyb3VuZCk7CisKKy8qIHBhc3N3ZC5jICovCitpbnQgcGFzc3dkX2NvbXBhcmUoY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCBjaGFyICplbnRyeSk7CisKKy8qIGNvbG9ycy5jICovCisjZGVmaW5lIE1TR19DT0xPUlNfREVGX0ZHCTB4OTBmZmZmZmYKKyNkZWZpbmUgTVNHX0NPTE9SU19ERUZfQkcJMHg4MGZmZmZmZgorI2RlZmluZSBNU0dfQ09MT1JTX0RFRl9TSEFET1cJU0hBRE9XX05PUk1BTAordm9pZCBzZXRfbXNnX2NvbG9yc19nbG9iYWwoc3RydWN0IGNvbG9yX3RhYmxlICp0YmwsCisJCQkgICB1bnNpZ25lZCBpbnQgZmcsIHVuc2lnbmVkIGludCBiZywKKwkJCSAgIGVudW0gY29sb3JfdGFibGVfc2hhZG93IHNoYWRvdyk7CitzdHJ1Y3QgY29sb3JfdGFibGUgKmRlZmF1bHRfY29sb3JfdGFibGUodm9pZCk7CitzdHJ1Y3QgY29sb3JfdGFibGUgKmNvcHlfY29sb3JfdGFibGUoY29uc3Qgc3RydWN0IGNvbG9yX3RhYmxlICptYXN0ZXIpOworZXh0ZXJuIGNvbnN0IGludCBtZXNzYWdlX2Jhc2VfY29sb3I7CisKKy8qIGJhY2tncm91bmQuYyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmN1cnJlbnRfYmFja2dyb3VuZDsKK3ZvaWQgc2V0X2JhY2tncm91bmQoY29uc3QgY2hhciAqbmV3X2JhY2tncm91bmQpOworCisvKiBkcmFpbi5jICovCit2b2lkIGRyYWluX2tleWJvYXJkKHZvaWQpOworCisvKiBjaGFpbmJvb3QuYyAqLwordm9pZCBjaGFpbmJvb3RfZmlsZShjb25zdCBjaGFyICpmaWxlLCBlbnVtIGtlcm5lbF90eXBlIHR5cGUpOworCisjZW5kaWYgLyogTUVOVV9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL21pbm1heC5oIGIvY29tMzIvaW5jbHVkZS9taW5tYXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjZlMzlhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9taW5tYXguaApAQCAtMCwwICsxLDQyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9NSU5NQVhfSAorI2RlZmluZSBfTUlOTUFYX0gKKworLyoKKyAqIG1pbm1heC5oOiBUeXBlLWluZGVwZW5kZW50IHNhZmUgbWluL21heCBtYWNyb3MKKyAqLworCisjZGVmaW5lIG1pbih4LHkpICh7IF9fdHlwZW9mKHgpIHh4ID0gKHgpOyBcCisgICAgICAgICAgICAgICAgICAgIF9fdHlwZW9mKHkpIHl5ID0gKHkpOyBcCisgICAgICAgICAgICAgICAgICAgIHh4IDwgeXkgPyB4eCA6IHl5OyB9KQorI2RlZmluZSBtYXgoeCx5KSAoeyBfX3R5cGVvZih4KSB4eCA9ICh4KTsgXAorICAgICAgICAgICAgICAgICAgICBfX3R5cGVvZih5KSB5eSA9ICh5KTsgXAorICAgICAgICAgICAgICAgICAgICB4eCA+IHl5ID8geHggOiB5eTsgfSkKKworI2VuZGlmIC8qIF9NSU5NQVhfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9uZXRpbmV0L2luLmggYi9jb20zMi9pbmNsdWRlL25ldGluZXQvaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTAwNDlmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9uZXRpbmV0L2luLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfTkVUSU5FVF9JTl9ICisjZGVmaW5lIF9ORVRJTkVUX0lOX0gKKworLyogQ09NMzIgd2lsbCBiZSBydW5uaW5nIG9uIGFuIGkzODYgcGxhdGZvcm0gKi8KKworI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKworI2RlZmluZSBodG9ucyh4KSBjcHVfdG9fYmUxNih4KQorI2RlZmluZSBudG9ocyh4KSBiZTE2X3RvX2NwdSh4KQorI2RlZmluZSBodG9ubCh4KSBjcHVfdG9fYmUzMih4KQorI2RlZmluZSBudG9obCh4KSBiZTMyX3RvX2NwdSh4KQorI2RlZmluZSBodG9ucSh4KSBjcHVfdG9fYmU2NCh4KQorI2RlZmluZSBudG9ocSh4KSBiZTY0X3RvX2NwdSh4KQorCit0eXBlZGVmIHVpbnQzMl90IGluX2FkZHJfdDsKK3R5cGVkZWYgdWludDE2X3QgaW5fcG9ydF90OworCitzdHJ1Y3QgaW5fYWRkciB7CisgICAgaW5fYWRkcl90IHNfYWRkcjsKK307CisKK19fZXh0ZXJuIGNoYXIgKmluZXRfbnRvYShzdHJ1Y3QgaW5fYWRkcik7CisKKyNlbmRpZiAvKiBfTkVUSU5FVF9JTl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3BuZy5oIGIvY29tMzIvaW5jbHVkZS9wbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzE5MTVkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9wbmcuaApAQCAtMCwwICsxLDM3ODggQEAKKy8qIHBuZy5oIC0gaGVhZGVyIGZpbGUgZm9yIFBORyByZWZlcmVuY2UgbGlicmFyeQorICoKKyAqIGxpYnBuZyB2ZXJzaW9uIDEuMi40NCAtIEp1bmUgMjYsIDIwMTAKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZSAoU2VlIExJQ0VOU0UsIGJlbG93KQorICoKKyAqIEF1dGhvcnMgYW5kIG1haW50YWluZXJzOgorICogIGxpYnBuZyB2ZXJzaW9ucyAwLjcxLCBNYXkgMTk5NSwgdGhyb3VnaCAwLjg4LCBKYW51YXJ5IDE5OTY6IEd1eSBTY2hhbG5hdAorICogIGxpYnBuZyB2ZXJzaW9ucyAwLjg5YywgSnVuZSAxOTk2LCB0aHJvdWdoIDAuOTYsIE1heSAxOTk3OiBBbmRyZWFzIERpbGdlcgorICogIGxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS4yLjQ0IC0gSnVuZSAyNiwgMjAxMDogR2xlbm4KKyAqICBTZWUgYWxzbyAiQ29udHJpYnV0aW5nIEF1dGhvcnMiLCBiZWxvdy4KKyAqCisgKiBOb3RlIGFib3V0IGxpYnBuZyB2ZXJzaW9uIG51bWJlcnM6CisgKgorICogICAgRHVlIHRvIHZhcmlvdXMgbWlzY29tbXVuaWNhdGlvbnMsIHVuZm9yZXNlZW4gY29kZSBpbmNvbXBhdGliaWxpdGllcworICogICAgYW5kIG9jY2FzaW9uYWwgZmFjdG9ycyBvdXRzaWRlIHRoZSBhdXRob3JzJyBjb250cm9sLCB2ZXJzaW9uIG51bWJlcmluZworICogICAgb24gdGhlIGxpYnJhcnkgaGFzIG5vdCBhbHdheXMgYmVlbiBjb25zaXN0ZW50IGFuZCBzdHJhaWdodGZvcndhcmQuCisgKiAgICBUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgbWF0dGVycyBzaW5jZSB2ZXJzaW9uIDAuODljLCB3aGljaCB3YXMKKyAqICAgIHRoZSBmaXJzdCB3aWRlbHkgdXNlZCByZWxlYXNlOgorICoKKyAqICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgcG5nLmggIHBuZy5oICBzaGFyZWQtbGliCisgKiAgICB2ZXJzaW9uICAgICAgICAgICAgICAgIHN0cmluZyAgIGludCAgdmVyc2lvbgorICogICAgLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0gLS0tLS0gIC0tLS0tLS0tLS0KKyAqICAgIDAuODljICIxLjAgYmV0YSAzIiAgICAgMC44OSAgICAgIDg5ICAxLjAuODkKKyAqICAgIDAuOTAgICIxLjAgYmV0YSA0IiAgICAgMC45MCAgICAgIDkwICAwLjkwICBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTBdCisgKiAgICAwLjk1ICAiMS4wIGJldGEgNSIgICAgIDAuOTUgICAgICA5NSAgMC45NSAgW3Nob3VsZCBoYXZlIGJlZW4gMi4wLjk1XQorICogICAgMC45NiAgIjEuMCBiZXRhIDYiICAgICAwLjk2ICAgICAgOTYgIDAuOTYgIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45Nl0KKyAqICAgIDAuOTdiICIxLjAwLjk3IGJldGEgNyIgMS4wMC45NyAgIDk3ICAxLjAuMSBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTddCisgKiAgICAwLjk3YyAgICAgICAgICAgICAgICAgIDAuOTcgICAgICA5NyAgMi4wLjk3CisgKiAgICAwLjk4ICAgICAgICAgICAgICAgICAgIDAuOTggICAgICA5OCAgMi4wLjk4CisgKiAgICAwLjk5ICAgICAgICAgICAgICAgICAgIDAuOTkgICAgICA5OCAgMi4wLjk5CisgKiAgICAwLjk5YS1tICAgICAgICAgICAgICAgIDAuOTkgICAgICA5OSAgMi4wLjk5CisgKiAgICAxLjAwICAgICAgICAgICAgICAgICAgIDEuMDAgICAgIDEwMCAgMi4xLjAgWzEwMCBzaG91bGQgYmUgMTAwMDBdCisgKiAgICAxLjAuMCAgICAgIChmcm9tIGhlcmUgb24sIHRoZSAgIDEwMCAgMi4xLjAgWzEwMCBzaG91bGQgYmUgMTAwMDBdCisgKiAgICAxLjAuMSAgICAgICBwbmcuaCBzdHJpbmcgaXMgICAxMDAwMSAgMi4xLjAKKyAqICAgIDEuMC4xYS1lICAgIGlkZW50aWNhbCB0byB0aGUgIDEwMDAyICBmcm9tIGhlcmUgb24sIHRoZSBzaGFyZWQgbGlicmFyeQorICogICAgMS4wLjIgICAgICAgc291cmNlIHZlcnNpb24pICAgMTAwMDIgIGlzIDIuViB3aGVyZSBWIGlzIHRoZSBzb3VyY2UgY29kZQorICogICAgMS4wLjJhLWIgICAgICAgICAgICAgICAgICAgICAgMTAwMDMgIHZlcnNpb24sIGV4Y2VwdCBhcyBub3RlZC4KKyAqICAgIDEuMC4zICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAzCisgKiAgICAxLjAuM2EtZCAgICAgICAgICAgICAgICAgICAgICAxMDAwNAorICogICAgMS4wLjQgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDQKKyAqICAgIDEuMC40YS1mICAgICAgICAgICAgICAgICAgICAgIDEwMDA1CisgKiAgICAxLjAuNSAoKyAyIHBhdGNoZXMpICAgICAgICAgICAxMDAwNQorICogICAgMS4wLjVhLWQgICAgICAgICAgICAgICAgICAgICAgMTAwMDYKKyAqICAgIDEuMC41ZS1yICAgICAgICAgICAgICAgICAgICAgIDEwMTAwIChub3Qgc291cmNlIGNvbXBhdGlibGUpCisgKiAgICAxLjAuNXMtdiAgICAgICAgICAgICAgICAgICAgICAxMDAwNiAobm90IGJpbmFyeSBjb21wYXRpYmxlKQorICogICAgMS4wLjYgKCsgMyBwYXRjaGVzKSAgICAgICAgICAgMTAwMDYgKHN0aWxsIGJpbmFyeSBpbmNvbXBhdGlibGUpCisgKiAgICAxLjAuNmQtZiAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAoc3RpbGwgYmluYXJ5IGluY29tcGF0aWJsZSkKKyAqICAgIDEuMC42ZyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3CisgKiAgICAxLjAuNmggICAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmggKHRlc3RpbmcgeHkueiBzby1udW1iZXJpbmcpCisgKiAgICAxLjAuNmkgICAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmkKKyAqICAgIDEuMC42aiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3ICAyLjEuMC42aiAoaW5jb21wYXRpYmxlIHdpdGggMS4wLjApCisgKiAgICAxLjAuN2JldGExMS0xNCAgICAgICAgRExMTlVNICAxMDAwNyAgMi4xLjAuN2JldGExMS0xNCAoYmluYXJ5IGNvbXBhdGlibGUpCisgKiAgICAxLjAuN2JldGExNS0xOCAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuN2JldGExNS0xOCAoYmluYXJ5IGNvbXBhdGlibGUpCisgKiAgICAxLjAuN3JjMS0yICAgICAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuN3JjMS0yIChiaW5hcnkgY29tcGF0aWJsZSkKKyAqICAgIDEuMC43ICAgICAgICAgICAgICAgICAgICAxICAgIDEwMDA3ICAoc3RpbGwgY29tcGF0aWJsZSkKKyAqICAgIDEuMC44YmV0YTEtNCAgICAgICAgICAgICAxICAgIDEwMDA4ICAyLjEuMC44YmV0YTEtNAorICogICAgMS4wLjhyYzEgICAgICAgICAgICAgICAgIDEgICAgMTAwMDggIDIuMS4wLjhyYzEKKyAqICAgIDEuMC44ICAgICAgICAgICAgICAgICAgICAxICAgIDEwMDA4ICAyLjEuMC44CisgKiAgICAxLjAuOWJldGExLTYgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOWJldGExLTYKKyAqICAgIDEuMC45cmMxICAgICAgICAgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45cmMxCisgKiAgICAxLjAuOWJldGE3LTEwICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOWJldGE3LTEwCisgKiAgICAxLjAuOXJjMiAgICAgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOXJjMgorICogICAgMS4wLjkgICAgICAgICAgICAgICAgICAgIDEgICAgMTAwMDkgIDIuMS4wLjkKKyAqICAgIDEuMC4xMGJldGExICAgICAgICAgICAgICAxICAgIDEwMDEwICAyLjEuMC4xMGJldGExCisgKiAgICAxLjAuMTByYzEgICAgICAgICAgICAgICAgMSAgICAxMDAxMCAgMi4xLjAuMTByYzEKKyAqICAgIDEuMC4xMCAgICAgICAgICAgICAgICAgICAxICAgIDEwMDEwICAyLjEuMC4xMAorICogICAgMS4wLjExYmV0YTEtMyAgICAgICAgICAgIDEgICAgMTAwMTEgIDIuMS4wLjExYmV0YTEtMworICogICAgMS4wLjExcmMxICAgICAgICAgICAgICAgIDEgICAgMTAwMTEgIDIuMS4wLjExcmMxCisgKiAgICAxLjAuMTEgICAgICAgICAgICAgICAgICAgMSAgICAxMDAxMSAgMi4xLjAuMTEKKyAqICAgIDEuMC4xMmJldGExLTIgICAgICAgICAgICAyICAgIDEwMDEyICAyLjEuMC4xMmJldGExLTIKKyAqICAgIDEuMC4xMnJjMSAgICAgICAgICAgICAgICAyICAgIDEwMDEyICAyLjEuMC4xMnJjMQorICogICAgMS4wLjEyICAgICAgICAgICAgICAgICAgIDIgICAgMTAwMTIgIDIuMS4wLjEyCisgKiAgICAxLjEuMGEtZiAgICAgICAgICAgICAgICAgLSAgICAxMDEwMCAgMi4xLjEuMGEtZiAoYnJhbmNoIGFiYW5kb25lZCkKKyAqICAgIDEuMi4wYmV0YTEtMiAgICAgICAgICAgICAyICAgIDEwMjAwICAyLjEuMi4wYmV0YTEtMgorICogICAgMS4yLjBiZXRhMy01ICAgICAgICAgICAgIDMgICAgMTAyMDAgIDMuMS4yLjBiZXRhMy01CisgKiAgICAxLjIuMHJjMSAgICAgICAgICAgICAgICAgMyAgICAxMDIwMCAgMy4xLjIuMHJjMQorICogICAgMS4yLjAgICAgICAgICAgICAgICAgICAgIDMgICAgMTAyMDAgIDMuMS4yLjAKKyAqICAgIDEuMi4xYmV0YTEtNCAgICAgICAgICAgICAzICAgIDEwMjAxICAzLjEuMi4xYmV0YTEtNAorICogICAgMS4yLjFyYzEtMiAgICAgICAgICAgICAgIDMgICAgMTAyMDEgIDMuMS4yLjFyYzEtMgorICogICAgMS4yLjEgICAgICAgICAgICAgICAgICAgIDMgICAgMTAyMDEgIDMuMS4yLjEKKyAqICAgIDEuMi4yYmV0YTEtNiAgICAgICAgICAgIDEyICAgIDEwMjAyICAxMi5zby4wLjEuMi4yYmV0YTEtNgorICogICAgMS4wLjEzYmV0YTEgICAgICAgICAgICAgMTAgICAgMTAwMTMgIDEwLnNvLjAuMS4wLjEzYmV0YTEKKyAqICAgIDEuMC4xM3JjMSAgICAgICAgICAgICAgIDEwICAgIDEwMDEzICAxMC5zby4wLjEuMC4xM3JjMQorICogICAgMS4yLjJyYzEgICAgICAgICAgICAgICAgMTIgICAgMTAyMDIgIDEyLnNvLjAuMS4yLjJyYzEKKyAqICAgIDEuMC4xMyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDEzICAxMC5zby4wLjEuMC4xMworICogICAgMS4yLjIgICAgICAgICAgICAgICAgICAgMTIgICAgMTAyMDIgIDEyLnNvLjAuMS4yLjIKKyAqICAgIDEuMi4zcmMxLTYgICAgICAgICAgICAgIDEyICAgIDEwMjAzICAxMi5zby4wLjEuMi4zcmMxLTYKKyAqICAgIDEuMi4zICAgICAgICAgICAgICAgICAgIDEyICAgIDEwMjAzICAxMi5zby4wLjEuMi4zCisgKiAgICAxLjIuNGJldGExLTMgICAgICAgICAgICAxMyAgICAxMDIwNCAgMTIuc28uMC4xLjIuNGJldGExLTMKKyAqICAgIDEuMC4xNHJjMSAgICAgICAgICAgICAgIDEzICAgIDEwMDE0ICAxMC5zby4wLjEuMC4xNHJjMQorICogICAgMS4yLjRyYzEgICAgICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjRyYzEKKyAqICAgIDEuMC4xNCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE0ICAxMC5zby4wLjEuMC4xNAorICogICAgMS4yLjQgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjQKKyAqICAgIDEuMi41YmV0YTEtMiAgICAgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41YmV0YTEtMgorICogICAgMS4wLjE1cmMxLTMgICAgICAgICAgICAgMTAgICAgMTAwMTUgIDEwLnNvLjAuMS4wLjE1cmMxLTMKKyAqICAgIDEuMi41cmMxLTMgICAgICAgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41cmMxLTMKKyAqICAgIDEuMC4xNSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE1ICAxMC5zby4wLjEuMC4xNQorICogICAgMS4yLjUgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDUgIDEyLnNvLjAuMS4yLjUKKyAqICAgIDEuMi42YmV0YTEtNCAgICAgICAgICAgIDEzICAgIDEwMjA2ICAxMi5zby4wLjEuMi42YmV0YTEtNAorICogICAgMS4wLjE2ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMTYgIDEwLnNvLjAuMS4wLjE2CisgKiAgICAxLjIuNiAgICAgICAgICAgICAgICAgICAxMyAgICAxMDIwNiAgMTIuc28uMC4xLjIuNgorICogICAgMS4yLjdiZXRhMS0yICAgICAgICAgICAgMTMgICAgMTAyMDcgIDEyLnNvLjAuMS4yLjdiZXRhMS0yCisgKiAgICAxLjAuMTdyYzEgICAgICAgICAgICAgICAxMCAgICAxMDAxNyAgMTAuc28uMC4xLjAuMTdyYzEKKyAqICAgIDEuMi43cmMxICAgICAgICAgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43cmMxCisgKiAgICAxLjAuMTcgICAgICAgICAgICAgICAgICAxMCAgICAxMDAxNyAgMTAuc28uMC4xLjAuMTcKKyAqICAgIDEuMi43ICAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43CisgKiAgICAxLjIuOGJldGExLTUgICAgICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOGJldGExLTUKKyAqICAgIDEuMC4xOHJjMS01ICAgICAgICAgICAgIDEwICAgIDEwMDE4ICAxMC5zby4wLjEuMC4xOHJjMS01CisgKiAgICAxLjIuOHJjMS01ICAgICAgICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOHJjMS01CisgKiAgICAxLjAuMTggICAgICAgICAgICAgICAgICAxMCAgICAxMDAxOCAgMTAuc28uMC4xLjAuMTgKKyAqICAgIDEuMi44ICAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjA4ICAxMi5zby4wLjEuMi44CisgKiAgICAxLjIuOWJldGExLTMgICAgICAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC4xLjIuOWJldGExLTMKKyAqICAgIDEuMi45YmV0YTQtMTEgICAgICAgICAgIDEzICAgIDEwMjA5ICAxMi5zby4wLjlbLjBdCisgKiAgICAxLjIuOXJjMSAgICAgICAgICAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC45Wy4wXQorICogICAgMS4yLjkgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDkgIDEyLnNvLjAuOVsuMF0KKyAqICAgIDEuMi4xMGJldGExLTggICAgICAgICAgIDEzICAgIDEwMjEwICAxMi5zby4wLjEwWy4wXQorICogICAgMS4yLjEwcmMxLTMgICAgICAgICAgICAgMTMgICAgMTAyMTAgIDEyLnNvLjAuMTBbLjBdCisgKiAgICAxLjIuMTAgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxMCAgMTIuc28uMC4xMFsuMF0KKyAqICAgIDEuMi4xMWJldGExLTQgICAgICAgICAgIDEzICAgIDEwMjExICAxMi5zby4wLjExWy4wXQorICogICAgMS4wLjE5cmMxLTUgICAgICAgICAgICAgMTAgICAgMTAwMTkgIDEwLnNvLjAuMTlbLjBdCisgKiAgICAxLjIuMTFyYzEtNSAgICAgICAgICAgICAxMyAgICAxMDIxMSAgMTIuc28uMC4xMVsuMF0KKyAqICAgIDEuMC4xOSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE5ICAxMC5zby4wLjE5Wy4wXQorICogICAgMS4yLjExICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMTEgIDEyLnNvLjAuMTFbLjBdCisgKiAgICAxLjAuMjAgICAgICAgICAgICAgICAgICAxMCAgICAxMDAyMCAgMTAuc28uMC4yMFsuMF0KKyAqICAgIDEuMi4xMiAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjEyICAxMi5zby4wLjEyWy4wXQorICogICAgMS4yLjEzYmV0YTEgICAgICAgICAgICAgMTMgICAgMTAyMTMgIDEyLnNvLjAuMTNbLjBdCisgKiAgICAxLjAuMjEgICAgICAgICAgICAgICAgICAxMCAgICAxMDAyMSAgMTAuc28uMC4yMVsuMF0KKyAqICAgIDEuMi4xMyAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjEzICAxMi5zby4wLjEzWy4wXQorICogICAgMS4yLjE0YmV0YTEtMiAgICAgICAgICAgMTMgICAgMTAyMTQgIDEyLnNvLjAuMTRbLjBdCisgKiAgICAxLjAuMjJyYzEgICAgICAgICAgICAgICAxMCAgICAxMDAyMiAgMTAuc28uMC4yMlsuMF0KKyAqICAgIDEuMi4xNHJjMSAgICAgICAgICAgICAgIDEzICAgIDEwMjE0ICAxMi5zby4wLjE0Wy4wXQorICogICAgMS4wLjIyICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMjIgIDEwLnNvLjAuMjJbLjBdCisgKiAgICAxLjIuMTQgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxNCAgMTIuc28uMC4xNFsuMF0KKyAqICAgIDEuMi4xNWJldGExLTYgICAgICAgICAgIDEzICAgIDEwMjE1ICAxMi5zby4wLjE1Wy4wXQorICogICAgMS4wLjIzcmMxLTUgICAgICAgICAgICAgMTAgICAgMTAwMjMgIDEwLnNvLjAuMjNbLjBdCisgKiAgICAxLjIuMTVyYzEtNSAgICAgICAgICAgICAxMyAgICAxMDIxNSAgMTIuc28uMC4xNVsuMF0KKyAqICAgIDEuMC4yMyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDIzICAxMC5zby4wLjIzWy4wXQorICogICAgMS4yLjE1ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMTUgIDEyLnNvLjAuMTVbLjBdCisgKiAgICAxLjIuMTZiZXRhMS0yICAgICAgICAgICAxMyAgICAxMDIxNiAgMTIuc28uMC4xNlsuMF0KKyAqICAgIDEuMi4xNnJjMSAgICAgICAgICAgICAgIDEzICAgIDEwMjE2ICAxMi5zby4wLjE2Wy4wXQorICogICAgMS4wLjI0ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMjQgIDEwLnNvLjAuMjRbLjBdCisgKiAgICAxLjIuMTYgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxNiAgMTIuc28uMC4xNlsuMF0KKyAqICAgIDEuMi4xN2JldGExLTIgICAgICAgICAgIDEzICAgIDEwMjE3ICAxMi5zby4wLjE3Wy4wXQorICogICAgMS4wLjI1cmMxICAgICAgICAgICAgICAgMTAgICAgMTAwMjUgIDEwLnNvLjAuMjVbLjBdCisgKiAgICAxLjIuMTdyYzEtMyAgICAgICAgICAgICAxMyAgICAxMDIxNyAgMTIuc28uMC4xN1suMF0KKyAqICAgIDEuMC4yNSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDI1ICAxMC5zby4wLjI1Wy4wXQorICogICAgMS4yLjE3ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMTcgIDEyLnNvLjAuMTdbLjBdCisgKiAgICAxLjAuMjYgICAgICAgICAgICAgICAgICAxMCAgICAxMDAyNiAgMTAuc28uMC4yNlsuMF0KKyAqICAgIDEuMi4xOCAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjE4ICAxMi5zby4wLjE4Wy4wXQorICogICAgMS4yLjE5YmV0YTEtMzEgICAgICAgICAgMTMgICAgMTAyMTkgIDEyLnNvLjAuMTlbLjBdCisgKiAgICAxLjAuMjdyYzEtNiAgICAgICAgICAgICAxMCAgICAxMDAyNyAgMTAuc28uMC4yN1suMF0KKyAqICAgIDEuMi4xOXJjMS02ICAgICAgICAgICAgIDEzICAgIDEwMjE5ICAxMi5zby4wLjE5Wy4wXQorICogICAgMS4wLjI3ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMjcgIDEwLnNvLjAuMjdbLjBdCisgKiAgICAxLjIuMTkgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxOSAgMTIuc28uMC4xOVsuMF0KKyAqICAgIDEuMi4yMGJldGEwMS0wNCAgICAgICAgIDEzICAgIDEwMjIwICAxMi5zby4wLjIwWy4wXQorICogICAgMS4wLjI4cmMxLTYgICAgICAgICAgICAgMTAgICAgMTAwMjggIDEwLnNvLjAuMjhbLjBdCisgKiAgICAxLjIuMjByYzEtNiAgICAgICAgICAgICAxMyAgICAxMDIyMCAgMTIuc28uMC4yMFsuMF0KKyAqICAgIDEuMC4yOCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDI4ICAxMC5zby4wLjI4Wy4wXQorICogICAgMS4yLjIwICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjAgIDEyLnNvLjAuMjBbLjBdCisgKiAgICAxLjIuMjFiZXRhMS0yICAgICAgICAgICAxMyAgICAxMDIyMSAgMTIuc28uMC4yMVsuMF0KKyAqICAgIDEuMi4yMXJjMS0zICAgICAgICAgICAgIDEzICAgIDEwMjIxICAxMi5zby4wLjIxWy4wXQorICogICAgMS4wLjI5ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMjkgIDEwLnNvLjAuMjlbLjBdCisgKiAgICAxLjIuMjEgICAgICAgICAgICAgICAgICAxMyAgICAxMDIyMSAgMTIuc28uMC4yMVsuMF0KKyAqICAgIDEuMi4yMmJldGExLTQgICAgICAgICAgIDEzICAgIDEwMjIyICAxMi5zby4wLjIyWy4wXQorICogICAgMS4wLjMwcmMxICAgICAgICAgICAgICAgMTAgICAgMTAwMzAgIDEwLnNvLjAuMzBbLjBdCisgKiAgICAxLjIuMjJyYzEgICAgICAgICAgICAgICAxMyAgICAxMDIyMiAgMTIuc28uMC4yMlsuMF0KKyAqICAgIDEuMC4zMCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDMwICAxMC5zby4wLjMwWy4wXQorICogICAgMS4yLjIyICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjIgIDEyLnNvLjAuMjJbLjBdCisgKiAgICAxLjIuMjNiZXRhMDEtMDUgICAgICAgICAxMyAgICAxMDIyMyAgMTIuc28uMC4yM1suMF0KKyAqICAgIDEuMi4yM3JjMDEgICAgICAgICAgICAgIDEzICAgIDEwMjIzICAxMi5zby4wLjIzWy4wXQorICogICAgMS4yLjIzICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjMgIDEyLnNvLjAuMjNbLjBdCisgKiAgICAxLjIuMjRiZXRhMDEtMDIgICAgICAgICAxMyAgICAxMDIyNCAgMTIuc28uMC4yNFsuMF0KKyAqICAgIDEuMi4yNHJjMDEgICAgICAgICAgICAgIDEzICAgIDEwMjI0ICAxMi5zby4wLjI0Wy4wXQorICogICAgMS4yLjI0ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjQgIDEyLnNvLjAuMjRbLjBdCisgKiAgICAxLjIuMjViZXRhMDEtMDYgICAgICAgICAxMyAgICAxMDIyNSAgMTIuc28uMC4yNVsuMF0KKyAqICAgIDEuMi4yNXJjMDEtMDIgICAgICAgICAgIDEzICAgIDEwMjI1ICAxMi5zby4wLjI1Wy4wXQorICogICAgMS4wLjMxICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMzEgIDEwLnNvLjAuMzFbLjBdCisgKiAgICAxLjIuMjUgICAgICAgICAgICAgICAgICAxMyAgICAxMDIyNSAgMTIuc28uMC4yNVsuMF0KKyAqICAgIDEuMi4yNmJldGEwMS0wNiAgICAgICAgIDEzICAgIDEwMjI2ICAxMi5zby4wLjI2Wy4wXQorICogICAgMS4yLjI2cmMwMSAgICAgICAgICAgICAgMTMgICAgMTAyMjYgIDEyLnNvLjAuMjZbLjBdCisgKiAgICAxLjIuMjYgICAgICAgICAgICAgICAgICAxMyAgICAxMDIyNiAgMTIuc28uMC4yNlsuMF0KKyAqICAgIDEuMC4zMiAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDMyICAxMC5zby4wLjMyWy4wXQorICogICAgMS4yLjI3YmV0YTAxLTA2ICAgICAgICAgMTMgICAgMTAyMjcgIDEyLnNvLjAuMjdbLjBdCisgKiAgICAxLjIuMjdyYzAxICAgICAgICAgICAgICAxMyAgICAxMDIyNyAgMTIuc28uMC4yN1suMF0KKyAqICAgIDEuMC4zMyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDMzICAxMC5zby4wLjMzWy4wXQorICogICAgMS4yLjI3ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjcgIDEyLnNvLjAuMjdbLjBdCisgKiAgICAxLjAuMzQgICAgICAgICAgICAgICAgICAxMCAgICAxMDAzNCAgMTAuc28uMC4zNFsuMF0KKyAqICAgIDEuMi4yOCAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjI4ICAxMi5zby4wLjI4Wy4wXQorICogICAgMS4yLjI5YmV0YTAxLTAzICAgICAgICAgMTMgICAgMTAyMjkgIDEyLnNvLjAuMjlbLjBdCisgKiAgICAxLjIuMjlyYzAxICAgICAgICAgICAgICAxMyAgICAxMDIyOSAgMTIuc28uMC4yOVsuMF0KKyAqICAgIDEuMC4zNSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDM1ICAxMC5zby4wLjM1Wy4wXQorICogICAgMS4yLjI5ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjkgIDEyLnNvLjAuMjlbLjBdCisgKiAgICAxLjAuMzcgICAgICAgICAgICAgICAgICAxMCAgICAxMDAzNyAgMTAuc28uMC4zN1suMF0KKyAqICAgIDEuMi4zMGJldGEwMS0wNCAgICAgICAgIDEzICAgIDEwMjMwICAxMi5zby4wLjMwWy4wXQorICogICAgMS4wLjM4cmMwMS0wOCAgICAgICAgICAgMTAgICAgMTAwMzggIDEwLnNvLjAuMzhbLjBdCisgKiAgICAxLjIuMzByYzAxLTA4ICAgICAgICAgICAxMyAgICAxMDIzMCAgMTIuc28uMC4zMFsuMF0KKyAqICAgIDEuMC4zOCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDM4ICAxMC5zby4wLjM4Wy4wXQorICogICAgMS4yLjMwICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMzAgIDEyLnNvLjAuMzBbLjBdCisgKiAgICAxLjAuMzlyYzAxLTAzICAgICAgICAgICAxMCAgICAxMDAzOSAgMTAuc28uMC4zOVsuMF0KKyAqICAgIDEuMi4zMXJjMDEtMDMgICAgICAgICAgIDEzICAgIDEwMjMxICAxMi5zby4wLjMxWy4wXQorICogICAgMS4wLjM5ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMzkgIDEwLnNvLjAuMzlbLjBdCisgKiAgICAxLjIuMzEgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzMSAgMTIuc28uMC4zMVsuMF0KKyAqICAgIDEuMi4zMmJldGEwMS0wMiAgICAgICAgIDEzICAgIDEwMjMyICAxMi5zby4wLjMyWy4wXQorICogICAgMS4wLjQwcmMwMSAgICAgICAgICAgICAgMTAgICAgMTAwNDAgIDEwLnNvLjAuNDBbLjBdCisgKiAgICAxLjIuMzJyYzAxICAgICAgICAgICAgICAxMyAgICAxMDIzMiAgMTIuc28uMC4zMlsuMF0KKyAqICAgIDEuMC40MCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDQwICAxMC5zby4wLjQwWy4wXQorICogICAgMS4yLjMyICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMzIgIDEyLnNvLjAuMzJbLjBdCisgKiAgICAxLjIuMzNiZXRhMDEtMDIgICAgICAgICAxMyAgICAxMDIzMyAgMTIuc28uMC4zM1suMF0KKyAqICAgIDEuMi4zM3JjMDEtMDIgICAgICAgICAgIDEzICAgIDEwMjMzICAxMi5zby4wLjMzWy4wXQorICogICAgMS4wLjQxcmMwMSAgICAgICAgICAgICAgMTAgICAgMTAwNDEgIDEwLnNvLjAuNDFbLjBdCisgKiAgICAxLjIuMzMgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzMyAgMTIuc28uMC4zM1suMF0KKyAqICAgIDEuMC40MSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDQxICAxMC5zby4wLjQxWy4wXQorICogICAgMS4yLjM0YmV0YTAxLTA3ICAgICAgICAgMTMgICAgMTAyMzQgIDEyLnNvLjAuMzRbLjBdCisgKiAgICAxLjAuNDJyYzAxICAgICAgICAgICAgICAxMCAgICAxMDA0MiAgMTAuc28uMC40MlsuMF0KKyAqICAgIDEuMi4zNHJjMDEgICAgICAgICAgICAgIDEzICAgIDEwMjM0ICAxMi5zby4wLjM0Wy4wXQorICogICAgMS4wLjQyICAgICAgICAgICAgICAgICAgMTAgICAgMTAwNDIgIDEwLnNvLjAuNDJbLjBdCisgKiAgICAxLjIuMzQgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzNCAgMTIuc28uMC4zNFsuMF0KKyAqICAgIDEuMi4zNWJldGEwMS0wMyAgICAgICAgIDEzICAgIDEwMjM1ICAxMi5zby4wLjM1Wy4wXQorICogICAgMS4wLjQzcmMwMS0wMiAgICAgICAgICAgMTAgICAgMTAwNDMgIDEwLnNvLjAuNDNbLjBdCisgKiAgICAxLjIuMzVyYzAxLTAyICAgICAgICAgICAxMyAgICAxMDIzNSAgMTIuc28uMC4zNVsuMF0KKyAqICAgIDEuMC40MyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDQzICAxMC5zby4wLjQzWy4wXQorICogICAgMS4yLjM1ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMzUgIDEyLnNvLjAuMzVbLjBdCisgKiAgICAxLjIuMzZiZXRhMDEtMDUgICAgICAgICAxMyAgICAxMDIzNiAgMTIuc28uMC4zNlsuMF0KKyAqICAgIDEuMi4zNnJjMDEgICAgICAgICAgICAgIDEzICAgIDEwMjM2ICAxMi5zby4wLjM2Wy4wXQorICogICAgMS4wLjQ0ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwNDQgIDEwLnNvLjAuNDRbLjBdCisgKiAgICAxLjIuMzYgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzNiAgMTIuc28uMC4zNlsuMF0KKyAqICAgIDEuMi4zN2JldGEwMS0wMyAgICAgICAgIDEzICAgIDEwMjM3ICAxMi5zby4wLjM3Wy4wXQorICogICAgMS4yLjM3cmMwMSAgICAgICAgICAgICAgMTMgICAgMTAyMzcgIDEyLnNvLjAuMzdbLjBdCisgKiAgICAxLjIuMzcgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzNyAgMTIuc28uMC4zN1suMF0KKyAqICAgIDEuMi40NSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDQ1ICAxMi5zby4wLjQ1Wy4wXQorICogICAgMS4wLjQ2ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwNDYgIDEwLnNvLjAuNDZbLjBdCisgKiAgICAxLjIuMzhiZXRhMDEgICAgICAgICAgICAxMyAgICAxMDIzOCAgMTIuc28uMC4zOFsuMF0KKyAqICAgIDEuMi4zOHJjMDEtMDMgICAgICAgICAgIDEzICAgIDEwMjM4ICAxMi5zby4wLjM4Wy4wXQorICogICAgMS4wLjQ3ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwNDcgIDEwLnNvLjAuNDdbLjBdCisgKiAgICAxLjIuMzggICAgICAgICAgICAgICAgICAxMyAgICAxMDIzOCAgMTIuc28uMC4zOFsuMF0KKyAqICAgIDEuMi4zOWJldGEwMS0wNSAgICAgICAgIDEzICAgIDEwMjM5ICAxMi5zby4wLjM5Wy4wXQorICogICAgMS4yLjM5cmMwMSAgICAgICAgICAgICAgMTMgICAgMTAyMzkgIDEyLnNvLjAuMzlbLjBdCisgKiAgICAxLjAuNDggICAgICAgICAgICAgICAgICAxMCAgICAxMDA0OCAgMTAuc28uMC40OFsuMF0KKyAqICAgIDEuMi4zOSAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjM5ICAxMi5zby4wLjM5Wy4wXQorICogICAgMS4yLjQwYmV0YTAxICAgICAgICAgICAgMTMgICAgMTAyNDAgIDEyLnNvLjAuNDBbLjBdCisgKiAgICAxLjIuNDByYzAxICAgICAgICAgICAgICAxMyAgICAxMDI0MCAgMTIuc28uMC40MFsuMF0KKyAqICAgIDEuMC40OSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDQ5ICAxMC5zby4wLjQ5Wy4wXQorICogICAgMS4yLjQwICAgICAgICAgICAgICAgICAgMTMgICAgMTAyNDAgIDEyLnNvLjAuNDBbLjBdCisgKiAgICAxLjIuNDFiZXRhMDEtMTggICAgICAgICAxMyAgICAxMDI0MSAgMTIuc28uMC40MVsuMF0KKyAqICAgIDEuMC41MXJjMDEgICAgICAgICAgICAgIDEwICAgIDEwMDUxICAxMC5zby4wLjUxWy4wXQorICogICAgMS4yLjQxcmMwMS0wMyAgICAgICAgICAgMTMgICAgMTAyNDEgIDEyLnNvLjAuNDFbLjBdCisgKiAgICAxLjAuNTEgICAgICAgICAgICAgICAgICAxMCAgICAxMDA1MSAgMTAuc28uMC41MVsuMF0KKyAqICAgIDEuMi40MSAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjQxICAxMi5zby4wLjQxWy4wXQorICogICAgMS4yLjQyYmV0YTAxLTAyICAgICAgICAgMTMgICAgMTAyNDIgIDEyLnNvLjAuNDJbLjBdCisgKiAgICAxLjIuNDJyYzAxLTA1ICAgICAgICAgICAxMyAgICAxMDI0MiAgMTIuc28uMC40MlsuMF0KKyAqICAgIDEuMC41MiAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDUyICAxMC5zby4wLjUyWy4wXQorICogICAgMS4yLjQyICAgICAgICAgICAgICAgICAgMTMgICAgMTAyNDIgIDEyLnNvLjAuNDJbLjBdCisgKiAgICAxLjIuNDNiZXRhMDEtMDUgICAgICAgICAxMyAgICAxMDI0MyAgMTIuc28uMC40M1suMF0KKyAqICAgIDEuMC41M3JjMDEtMDIgICAgICAgICAgIDEwICAgIDEwMDUzICAxMC5zby4wLjUzWy4wXQorICogICAgMS4yLjQzcmMwMS0wMiAgICAgICAgICAgMTMgICAgMTAyNDMgIDEyLnNvLjAuNDNbLjBdCisgKiAgICAxLjAuNTMgICAgICAgICAgICAgICAgICAxMCAgICAxMDA1MyAgMTAuc28uMC41M1suMF0KKyAqICAgIDEuMi40MyAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjQzICAxMi5zby4wLjQzWy4wXQorICogICAgMS4yLjQ0YmV0YTAxLTAzICAgICAgICAgMTMgICAgMTAyNDQgIDEyLnNvLjAuNDRbLjBdCisgKiAgICAxLjIuNDRyYzAxLTAzICAgICAgICAgICAxMyAgICAxMDI0NCAgMTIuc28uMC40NFsuMF0KKyAqICAgIDEuMi40NCAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjQ0ICAxMi5zby4wLjQ0Wy4wXQorICoKKyAqICAgIEhlbmNlZm9ydGggdGhlIHNvdXJjZSB2ZXJzaW9uIHdpbGwgbWF0Y2ggdGhlIHNoYXJlZC1saWJyYXJ5IG1ham9yCisgKiAgICBhbmQgbWlub3IgbnVtYmVyczsgdGhlIHNoYXJlZC1saWJyYXJ5IG1ham9yIHZlcnNpb24gbnVtYmVyIHdpbGwgYmUKKyAqICAgIHVzZWQgZm9yIGNoYW5nZXMgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYXMgaXQgaXMgaW50ZW5kZWQuICBUaGUKKyAqICAgIFBOR19MSUJQTkdfVkVSIG1hY3JvLCB3aGljaCBpcyBub3QgdXNlZCB3aXRoaW4gbGlicG5nIGJ1dCBpcyBhdmFpbGFibGUKKyAqICAgIGZvciBhcHBsaWNhdGlvbnMsIGlzIGFuIHVuc2lnbmVkIGludGVnZXIgb2YgdGhlIGZvcm0geHl5enogY29ycmVzcG9uZGluZworICogICAgdG8gdGhlIHNvdXJjZSB2ZXJzaW9uIHgueS56IChsZWFkaW5nIHplcm9zIGluIHkgYW5kIHopLiAgQmV0YSB2ZXJzaW9ucworICogICAgd2VyZSBnaXZlbiB0aGUgcHJldmlvdXMgcHVibGljIHJlbGVhc2UgbnVtYmVyIHBsdXMgYSBsZXR0ZXIsIHVudGlsCisgKiAgICB2ZXJzaW9uIDEuMC42ajsgZnJvbSB0aGVuIG9uIHRoZXkgd2VyZSBnaXZlbiB0aGUgdXBjb21pbmcgcHVibGljCisgKiAgICByZWxlYXNlIG51bWJlciBwbHVzICJiZXRhTk4iIG9yICJyY05OIi4KKyAqCisgKiAgICBCaW5hcnkgaW5jb21wYXRpYmlsaXR5IGV4aXN0cyBvbmx5IHdoZW4gYXBwbGljYXRpb25zIG1ha2UgZGlyZWN0IGFjY2VzcworICogICAgdG8gdGhlIGluZm9fcHRyIG9yIHBuZ19wdHIgbWVtYmVycyB0aHJvdWdoIHBuZy5oLCBhbmQgdGhlIGNvbXBpbGVkCisgKiAgICBhcHBsaWNhdGlvbiBpcyBsb2FkZWQgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorICoKKyAqICAgIERMTE5VTSB3aWxsIGNoYW5nZSBlYWNoIHRpbWUgdGhlcmUgYXJlIGZvcndhcmQgb3IgYmFja3dhcmQgY2hhbmdlcworICogICAgaW4gYmluYXJ5IGNvbXBhdGliaWxpdHkgKGUuZy4sIHdoZW4gYSBuZXcgZmVhdHVyZSBpcyBhZGRlZCkuCisgKgorICogU2VlIGxpYnBuZy50eHQgb3IgbGlicG5nLjMgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBUaGUgUE5HIHNwZWNpZmljYXRpb24KKyAqIGlzIGF2YWlsYWJsZSBhcyBhIFczQyBSZWNvbW1lbmRhdGlvbiBhbmQgYXMgYW4gSVNPIFNwZWNpZmljYXRpb24sCisgKiA8aHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9SRUMtUE5HLTIwMDMxMTEwLworICovCisKKy8qCisgKiBDT1BZUklHSFQgTk9USUNFLCBESVNDTEFJTUVSLCBhbmQgTElDRU5TRToKKyAqCisgKiBJZiB5b3UgbW9kaWZ5IGxpYnBuZyB5b3UgbWF5IGluc2VydCBhZGRpdGlvbmFsIG5vdGljZXMgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgKiB0aGlzIHNlbnRlbmNlLgorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKgorICogbGlicG5nIHZlcnNpb25zIDEuMi42LCBBdWd1c3QgMTUsIDIwMDQsIHRocm91Z2ggMS4yLjQ0LCBKdW5lIDI2LCAyMDEwLCBhcmUKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNi0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorICogZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMi41CisgKiB3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbCBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKKyAqCisgKiAgICBDb3NtaW4gVHJ1dGEKKyAqCisgKiBsaWJwbmcgdmVyc2lvbnMgMS4wLjcsIEp1bHkgMSwgMjAwMCwgdGhyb3VnaCAxLjIuNSwgT2N0b2JlciAzLCAyMDAyLCBhcmUKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorICogZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMC42CisgKiB3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisgKgorICogICAgU2ltb24tUGllcnJlIENhZGlldXgKKyAqICAgIEVyaWMgUy4gUmF5bW9uZAorICogICAgR2lsbGVzIFZvbGxhbnQKKyAqCisgKiBhbmQgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB0byB0aGUgZGlzY2xhaW1lcjoKKyAqCisgKiAgICBUaGVyZSBpcyBubyB3YXJyYW50eSBhZ2FpbnN0IGludGVyZmVyZW5jZSB3aXRoIHlvdXIgZW5qb3ltZW50IG9mIHRoZQorICogICAgbGlicmFyeSBvciBhZ2FpbnN0IGluZnJpbmdlbWVudC4gIFRoZXJlIGlzIG5vIHdhcnJhbnR5IHRoYXQgb3VyCisgKiAgICBlZmZvcnRzIG9yIHRoZSBsaWJyYXJ5IHdpbGwgZnVsZmlsbCBhbnkgb2YgeW91ciBwYXJ0aWN1bGFyIHB1cnBvc2VzCisgKiAgICBvciBuZWVkcy4gIFRoaXMgbGlicmFyeSBpcyBwcm92aWRlZCB3aXRoIGFsbCBmYXVsdHMsIGFuZCB0aGUgZW50aXJlCisgKiAgICByaXNrIG9mIHNhdGlzZmFjdG9yeSBxdWFsaXR5LCBwZXJmb3JtYW5jZSwgYWNjdXJhY3ksIGFuZCBlZmZvcnQgaXMgd2l0aAorICogICAgdGhlIHVzZXIuCisgKgorICogbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZQorICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorICogZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuOTYsCisgKiB3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisgKgorICogICAgVG9tIExhbmUKKyAqICAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogICAgV2lsbGVtIHZhbiBTY2hhaWsKKyAqCisgKiBsaWJwbmcgdmVyc2lvbnMgMC44OSwgSnVuZSAxOTk2LCB0aHJvdWdoIDAuOTYsIE1heSAxOTk3LCBhcmUKKyAqIENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgorICogRGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuODgsCisgKiB3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisgKgorICogICAgSm9obiBCb3dsZXIKKyAqICAgIEtldmluIEJyYWNleQorICogICAgU2FtIEJ1c2hlbGwKKyAqICAgIE1hZ251cyBIb2xtZ3JlbgorICogICAgR3JlZyBSb2Vsb2ZzCisgKiAgICBUb20gVGFubmVyCisgKgorICogbGlicG5nIHZlcnNpb25zIDAuNSwgTWF5IDE5OTUsIHRocm91Z2ggMC44OCwgSmFudWFyeSAxOTk2LCBhcmUKKyAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKyAqCisgKiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgY29weXJpZ2h0IGFuZCBsaWNlbnNlLCAiQ29udHJpYnV0aW5nIEF1dGhvcnMiCisgKiBpcyBkZWZpbmVkIGFzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGluZGl2aWR1YWxzOgorICoKKyAqICAgIEFuZHJlYXMgRGlsZ2VyCisgKiAgICBEYXZlIE1hcnRpbmRhbGUKKyAqICAgIEd1eSBFcmljIFNjaGFsbmF0CisgKiAgICBQYXVsIFNjaG1pZHQKKyAqICAgIFRpbSBXZWduZXIKKyAqCisgKiBUaGUgUE5HIFJlZmVyZW5jZSBMaWJyYXJ5IGlzIHN1cHBsaWVkICJBUyBJUyIuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMKKyAqIGFuZCBHcm91cCA0MiwgSW5jLiBkaXNjbGFpbSBhbGwgd2FycmFudGllcywgZXhwcmVzc2VkIG9yIGltcGxpZWQsCisgKiBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBvZgorICogZml0bmVzcyBmb3IgYW55IHB1cnBvc2UuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuCisgKiBhc3N1bWUgbm8gbGlhYmlsaXR5IGZvciBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCisgKiBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHdoaWNoIG1heSByZXN1bHQgZnJvbSB0aGUgdXNlIG9mIHRoZSBQTkcKKyAqIFJlZmVyZW5jZSBMaWJyYXJ5LCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvdXJjZSBjb2RlLCBvciBwb3J0aW9ucyBoZXJlb2YsIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZC4KKyAqCisgKiAyLiBBbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCBhbmQKKyAqIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb3VyY2UuCisgKgorICogMy4gVGhpcyBDb3B5cmlnaHQgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20KKyAqICAgIGFueSBzb3VyY2Ugb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4gc3BlY2lmaWNhbGx5IHBlcm1pdCwgd2l0aG91dAorICogZmVlLCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBhcyBhIGNvbXBvbmVudCB0bworICogc3VwcG9ydGluZyB0aGUgUE5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMKKyAqIHNvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgaXMgbm90IHJlcXVpcmVkIGJ1dCB3b3VsZCBiZQorICogYXBwcmVjaWF0ZWQuCisgKi8KKworLyoKKyAqIEEgInBuZ19nZXRfY29weXJpZ2h0IiBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIGZvciBjb252ZW5pZW50IHVzZSBpbiAiYWJvdXQiCisgKiBib3hlcyBhbmQgdGhlIGxpa2U6CisgKgorICogcHJpbnRmKCIlcyIscG5nX2dldF9jb3B5cmlnaHQoTlVMTCkpOworICoKKyAqIEFsc28sIHRoZSBQTkcgbG9nbyAoaW4gUE5HIGZvcm1hdCwgb2YgY291cnNlKSBpcyBzdXBwbGllZCBpbiB0aGUKKyAqIGZpbGVzICJwbmdiYXIucG5nIiBhbmQgInBuZ2Jhci5qcGcgKDg4eDMxKSBhbmQgInBuZ25vdy5wbmciICg5OHgzMSkuCisgKi8KKworLyoKKyAqIExpYnBuZyBpcyBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIFNvZnR3YXJlLiAgT1NJIENlcnRpZmllZCBpcyBhCisgKiBjZXJ0aWZpY2F0aW9uIG1hcmsgb2YgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisgKi8KKworLyoKKyAqIFRoZSBjb250cmlidXRpbmcgYXV0aG9ycyB3b3VsZCBsaWtlIHRvIHRoYW5rIGFsbCB0aG9zZSB3aG8gaGVscGVkCisgKiB3aXRoIHRlc3RpbmcsIGJ1ZyBmaXhlcywgYW5kIHBhdGllbmNlLiAgVGhpcyB3b3VsZG4ndCBoYXZlIGJlZW4KKyAqIHBvc3NpYmxlIHdpdGhvdXQgYWxsIG9mIHlvdS4KKyAqCisgKiBUaGFua3MgdG8gRnJhbmsgSi4gVC4gV29qY2lrIGZvciBoZWxwaW5nIHdpdGggdGhlIGRvY3VtZW50YXRpb24uCisgKi8KKworLyoKKyAqIFkySyBjb21wbGlhbmNlIGluIGxpYnBuZzoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiAgICBKdW5lIDI2LCAyMDEwCisgKgorICogICAgU2luY2UgdGhlIFBORyBEZXZlbG9wbWVudCBncm91cCBpcyBhbiBhZC1ob2MgYm9keSwgd2UgY2FuJ3QgbWFrZQorICogICAgYW4gb2ZmaWNpYWwgZGVjbGFyYXRpb24uCisgKgorICogICAgVGhpcyBpcyB5b3VyIHVub2ZmaWNpYWwgYXNzdXJhbmNlIHRoYXQgbGlicG5nIGZyb20gdmVyc2lvbiAwLjcxIGFuZAorICogICAgdXB3YXJkIHRocm91Z2ggMS4yLjQ0IGFyZSBZMksgY29tcGxpYW50LiAgSXQgaXMgbXkgYmVsaWVmIHRoYXQgZWFybGllcgorICogICAgdmVyc2lvbnMgd2VyZSBhbHNvIFkySyBjb21wbGlhbnQuCisgKgorICogICAgTGlicG5nIG9ubHkgaGFzIHRocmVlIHllYXIgZmllbGRzLiAgT25lIGlzIGEgMi1ieXRlIHVuc2lnbmVkIGludGVnZXIKKyAqICAgIHRoYXQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDY1NTM1LiAgVGhlIG90aGVyIHR3byBob2xkIHRoZSBkYXRlIGluIHRleHQKKyAqICAgIGZvcm1hdCwgYW5kIHdpbGwgaG9sZCB5ZWFycyB1cCB0byA5OTk5LgorICoKKyAqICAgIFRoZSBpbnRlZ2VyIGlzCisgKiAgICAgICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KKyAqCisgKiAgICBUaGUgc3RyaW5ncyBhcmUKKyAqICAgICAgICAicG5nX2NoYXJwIHRpbWVfYnVmZmVyIiBpbiBwbmdfc3RydWN0IGFuZAorICogICAgICAgICJuZWFyX3RpbWVfYnVmZmVyIiwgd2hpY2ggaXMgYSBsb2NhbCBjaGFyYWN0ZXIgc3RyaW5nIGluIHBuZy5jLgorICoKKyAqICAgIFRoZXJlIGFyZSBzZXZlbiB0aW1lLXJlbGF0ZWQgZnVuY3Rpb25zOgorICogICAgICAgIHBuZy5jOiBwbmdfY29udmVydF90b19yZmNfMTEyMygpIGluIHBuZy5jCisgKiAgICAgICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExNTIoKSBpbiBlcnJvcikKKyAqICAgICAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCisgKiAgICAgICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBpbiBwbmd3cml0ZS5jCisgKiAgICAgICAgcG5nX2dldF90SU1FKCkgaW4gcG5nZ2V0LmMKKyAqICAgICAgICBwbmdfaGFuZGxlX3RJTUUoKSBpbiBwbmdydXRpbC5jLCBjYWxsZWQgaW4gcG5ncmVhZC5jCisgKiAgICAgICAgcG5nX3NldF90SU1FKCkgaW4gcG5nc2V0LmMKKyAqICAgICAgICBwbmdfd3JpdGVfdElNRSgpIGluIHBuZ3d1dGlsLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCisgKgorICogICAgQWxsIGhhbmRsZSBkYXRlcyBwcm9wZXJseSBpbiBhIFkySyBlbnZpcm9ubWVudC4gIFRoZQorICogICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmdW5jdGlvbiBjYWxscyBnbXRpbWUoKSB0byBjb252ZXJ0IGZyb20gc3lzdGVtCisgKiAgICBjbG9jayB0aW1lLCB3aGljaCByZXR1cm5zICh5ZWFyIC0gMTkwMCksIHdoaWNoIHdlIHByb3Blcmx5IGNvbnZlcnQgdG8KKyAqICAgIHRoZSBmdWxsIDQtZGlnaXQgeWVhci4gIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhcHBsaWNhdGlvbnMgdXNpbmcKKyAqICAgIGxpYnBuZyBhcmUgbm90IHBhc3NpbmcgNC1kaWdpdCB5ZWFycyBpbnRvIHRoZSBwbmdfY29udmVydF90b19yZmNfMTEyMygpCisgKiAgICBmdW5jdGlvbiwgb3IgdGhhdCB0aGV5IGFyZSBpbmNvcnJlY3RseSBwYXNzaW5nIG9ubHkgYSAyLWRpZ2l0IHllYXIKKyAqICAgIGluc3RlYWQgb2YgInllYXIgLSAxOTAwIiBpbnRvIHRoZSBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZ1bmN0aW9uLAorICogICAgYnV0IHRoaXMgaXMgbm90IHVuZGVyIG91ciBjb250cm9sLiAgVGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uIGhhcyBhbHdheXMKKyAqICAgIHN0YXRlZCB0aGF0IGl0IHdvcmtzIHdpdGggNC1kaWdpdCB5ZWFycywgYW5kIHRoZSBBUElzIGhhdmUgYmVlbgorICogICAgZG9jdW1lbnRlZCBhcyBzdWNoLgorICoKKyAqICAgIFRoZSB0SU1FIGNodW5rIGl0c2VsZiBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCB1c2VzIGEgMi1ieXRlIHVuc2lnbmVkCisgKiAgICBpbnRlZ2VyIHRvIGhvbGQgdGhlIHllYXIsIGFuZCBjYW4gaG9sZCB5ZWFycyBhcyBsYXJnZSBhcyA2NTUzNS4KKyAqCisgKiAgICB6bGliLCB1cG9uIHdoaWNoIGxpYnBuZyBkZXBlbmRzLCBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCBjb250YWlucworICogICAgbm8gZGF0ZS1yZWxhdGVkIGNvZGUuCisgKgorICogICAgICAgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAgICAgICBsaWJwbmcgbWFpbnRhaW5lcgorICogICAgICAgUE5HIERldmVsb3BtZW50IEdyb3VwCisgKi8KKworI2lmbmRlZiBQTkdfSAorI2RlZmluZSBQTkdfSAorCisvKiBUaGlzIGlzIG5vdCB0aGUgcGxhY2UgdG8gbGVhcm4gaG93IHRvIHVzZSBsaWJwbmcuICBUaGUgZmlsZSBsaWJwbmcudHh0CisgKiBkZXNjcmliZXMgaG93IHRvIHVzZSBsaWJwbmcsIGFuZCB0aGUgZmlsZSBleGFtcGxlLmMgc3VtbWFyaXplcyBpdAorICogd2l0aCBzb21lIGNvZGUgb24gd2hpY2ggdG8gYnVpbGQuICBUaGlzIGZpbGUgaXMgdXNlZnVsIGZvciBsb29raW5nCisgKiBhdCB0aGUgYWN0dWFsIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmUgY29tcG9uZW50cy4KKyAqLworCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBwbmcuaCAtIHRoaXMgc2hvdWxkIG1hdGNoIHRoZSB2ZXJzaW9uIGluIHBuZy5jICovCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX1NUUklORyAiMS4yLjQ0IgorI2RlZmluZSBQTkdfSEVBREVSX1ZFUlNJT05fU1RSSU5HIFwKKyAgICIgbGlicG5nIHZlcnNpb24gMS4yLjQ0IC0gSnVuZSAyNiwgMjAxMFxuIgorCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX1NPTlVNICAgMAorI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9ETExOVU0gIDEzCisKKy8qIFRoZXNlIHNob3VsZCBtYXRjaCB0aGUgZmlyc3QgMyBjb21wb25lbnRzIG9mIFBOR19MSUJQTkdfVkVSX1NUUklORzogKi8KKyNkZWZpbmUgUE5HX0xJQlBOR19WRVJfTUFKT1IgICAxCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX01JTk9SICAgMgorI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9SRUxFQVNFIDQ0CisvKiBUaGlzIHNob3VsZCBtYXRjaCB0aGUgbnVtZXJpYyBwYXJ0IG9mIHRoZSBmaW5hbCBjb21wb25lbnQgb2YKKyAqIFBOR19MSUJQTkdfVkVSX1NUUklORywgb21pdHRpbmcgYW55IGxlYWRpbmcgemVybzoKKyAqLworCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX0JVSUxEICAwCisKKy8qIFJlbGVhc2UgU3RhdHVzICovCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfQUxQSEEgICAgMQorI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX0JFVEEgICAgIDIKKyNkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9SQyAgICAgICAzCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFICAgNAorI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1JFTEVBU0VfU1RBVFVTX01BU0sgNworCisvKiBSZWxlYXNlLVNwZWNpZmljIEZsYWdzICovCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfUEFUQ0ggICAgOCAvKiBDYW4gYmUgT1InZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0xJQlBOR19CVUlMRF9TVEFCTEUgb25seSAqLworI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEUgMTYgLyogQ2Fubm90IGJlIE9SJ2VkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTCAqLworI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUwgMzIgLyogQ2Fubm90IGJlIE9SJ2VkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSAqLworCisjZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFCisKKy8qIENhcmVmdWwgaGVyZS4gIEF0IG9uZSB0aW1lLCBHdXkgd2FudGVkIHRvIHVzZSAwODIsIGJ1dCB0aGF0IHdvdWxkIGJlIG9jdGFsLgorICogV2UgbXVzdCBub3QgaW5jbHVkZSBsZWFkaW5nIHplcm9zLgorICogVmVyc2lvbnMgMC43IHRocm91Z2ggMS4wLjAgd2VyZSBpbiB0aGUgcmFuZ2UgMCB0byAxMDAgaGVyZSAob25seQorICogdmVyc2lvbiAxLjAuMCB3YXMgbWlzLW51bWJlcmVkIDEwMCBpbnN0ZWFkIG9mIDEwMDAwKS4gIEZyb20KKyAqIHZlcnNpb24gMS4wLjEgaXQncyAgICB4eHl5enosIHdoZXJlIHg9bWFqb3IsIHk9bWlub3IsIHo9cmVsZWFzZQorICovCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSIDEwMjQ0IC8qIDEuMi40NCAqLworCisjaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQorLyogSW5jbHVkZSB0aGUgY29tcHJlc3Npb24gbGlicmFyeSdzIGhlYWRlciAqLworI2luY2x1ZGUgInpsaWIuaCIKKyNlbmRpZgorCisvKiBJbmNsdWRlIGFsbCB1c2VyIGNvbmZpZ3VyYWJsZSBpbmZvLCBpbmNsdWRpbmcgb3B0aW9uYWwgYXNzZW1ibGVyIHJvdXRpbmVzICovCisjaW5jbHVkZSAicG5nY29uZi5oIgorCisvKgorICogQWRkZWQgYXQgbGlicG5nLTEuMi44ICovCisvKiBSZWYgTVNETjogUHJpdmF0ZSBhcyBwcmlvcml0eSBvdmVyIFNwZWNpYWwKKyAqIFZTX0ZGX1BSSVZBVEVCVUlMRCBGaWxlICp3YXMgbm90KiBidWlsdCB1c2luZyBzdGFuZGFyZCByZWxlYXNlCisgKiBwcm9jZWR1cmVzLiBJZiB0aGlzIHZhbHVlIGlzIGdpdmVuLCB0aGUgU3RyaW5nRmlsZUluZm8gYmxvY2sgbXVzdAorICogY29udGFpbiBhIFByaXZhdGVCdWlsZCBzdHJpbmcuCisgKgorICogVlNfRkZfU1BFQ0lBTEJVSUxEIEZpbGUgKndhcyogYnVpbHQgYnkgdGhlIG9yaWdpbmFsIGNvbXBhbnkgdXNpbmcKKyAqIHN0YW5kYXJkIHJlbGVhc2UgcHJvY2VkdXJlcyBidXQgaXMgYSB2YXJpYXRpb24gb2YgdGhlIHN0YW5kYXJkCisgKiBmaWxlIG9mIHRoZSBzYW1lIHZlcnNpb24gbnVtYmVyLiBJZiB0aGlzIHZhbHVlIGlzIGdpdmVuLCB0aGUKKyAqIFN0cmluZ0ZpbGVJbmZvIGJsb2NrIG11c3QgY29udGFpbiBhIFNwZWNpYWxCdWlsZCBzdHJpbmcuCisgKi8KKworI2lmZGVmIFBOR19VU0VSX1BSSVZBVEVCVUlMRAorIyAgZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfVFlQRSBcCisgICAgICAgICAgKFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFIHwgUE5HX0xJQlBOR19CVUlMRF9QUklWQVRFKQorI2Vsc2UKKyMgIGlmZGVmIFBOR19MSUJQTkdfU1BFQ0lBTEJVSUxECisjICAgIGRlZmluZSBQTkdfTElCUE5HX0JVSUxEX1RZUEUgXAorICAgICAgICAgICAgKFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFIHwgUE5HX0xJQlBOR19CVUlMRF9TUEVDSUFMKQorIyAgZWxzZQorIyAgICBkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9UWVBFIChQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBQTkdfVkVSU0lPTl9JTkZPX09OTFkKKworLyogSW5oaWJpdCBDKysgbmFtZS1tYW5nbGluZyBmb3IgbGlicG5nIGZ1bmN0aW9ucyBidXQgbm90IGZvciBzeXN0ZW0gY2FsbHMuICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qIFRoaXMgZmlsZSBpcyBhcnJhbmdlZCBpbiBzZXZlcmFsIHNlY3Rpb25zLiAgVGhlIGZpcnN0IHNlY3Rpb24gY29udGFpbnMKKyAqIHN0cnVjdHVyZSBhbmQgdHlwZSBkZWZpbml0aW9ucy4gIFRoZSBzZWNvbmQgc2VjdGlvbiBjb250YWlucyB0aGUgZXh0ZXJuYWwKKyAqIGxpYnJhcnkgZnVuY3Rpb25zLCB3aGlsZSB0aGUgdGhpcmQgaGFzIHRoZSBpbnRlcm5hbCBsaWJyYXJ5IGZ1bmN0aW9ucywKKyAqIHdoaWNoIGFwcGxpY2F0aW9ucyBhcmVuJ3QgZXhwZWN0ZWQgdG8gdXNlIGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgUE5HX05PX1RZUEVDQVNUX05VTEwKKyNkZWZpbmUgaW50X3BfTlVMTCAgICAgICAgICAgICAgICAoaW50ICopTlVMTAorI2RlZmluZSBwbmdfYnl0ZXBfTlVMTCAgICAgICAgICAgIChwbmdfYnl0ZXApTlVMTAorI2RlZmluZSBwbmdfYnl0ZXBwX05VTEwgICAgICAgICAgIChwbmdfYnl0ZXBwKU5VTEwKKyNkZWZpbmUgcG5nX2RvdWJsZXBfTlVMTCAgICAgICAgICAocG5nX2RvdWJsZXApTlVMTAorI2RlZmluZSBwbmdfZXJyb3JfcHRyX05VTEwgICAgICAgIChwbmdfZXJyb3JfcHRyKU5VTEwKKyNkZWZpbmUgcG5nX2ZsdXNoX3B0cl9OVUxMICAgICAgICAocG5nX2ZsdXNoX3B0cilOVUxMCisjZGVmaW5lIHBuZ19mcmVlX3B0cl9OVUxMICAgICAgICAgKHBuZ19mcmVlX3B0cilOVUxMCisjZGVmaW5lIHBuZ19pbmZvcHBfTlVMTCAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTAorI2RlZmluZSBwbmdfbWFsbG9jX3B0cl9OVUxMICAgICAgIChwbmdfbWFsbG9jX3B0cilOVUxMCisjZGVmaW5lIHBuZ19yZWFkX3N0YXR1c19wdHJfTlVMTCAgKHBuZ19yZWFkX3N0YXR1c19wdHIpTlVMTAorI2RlZmluZSBwbmdfcndfcHRyX05VTEwgICAgICAgICAgIChwbmdfcndfcHRyKU5VTEwKKyNkZWZpbmUgcG5nX3N0cnVjdHBfTlVMTCAgICAgICAgICAocG5nX3N0cnVjdHApTlVMTAorI2RlZmluZSBwbmdfdWludF8xNnBfTlVMTCAgICAgICAgIChwbmdfdWludF8xNnApTlVMTAorI2RlZmluZSBwbmdfdm9pZHBfTlVMTCAgICAgICAgICAgIChwbmdfdm9pZHApTlVMTAorI2RlZmluZSBwbmdfd3JpdGVfc3RhdHVzX3B0cl9OVUxMIChwbmdfd3JpdGVfc3RhdHVzX3B0cilOVUxMCisjZWxzZQorI2RlZmluZSBpbnRfcF9OVUxMICAgICAgICAgICAgICAgIE5VTEwKKyNkZWZpbmUgcG5nX2J5dGVwX05VTEwgICAgICAgICAgICBOVUxMCisjZGVmaW5lIHBuZ19ieXRlcHBfTlVMTCAgICAgICAgICAgTlVMTAorI2RlZmluZSBwbmdfZG91YmxlcF9OVUxMICAgICAgICAgIE5VTEwKKyNkZWZpbmUgcG5nX2Vycm9yX3B0cl9OVUxMICAgICAgICBOVUxMCisjZGVmaW5lIHBuZ19mbHVzaF9wdHJfTlVMTCAgICAgICAgTlVMTAorI2RlZmluZSBwbmdfZnJlZV9wdHJfTlVMTCAgICAgICAgIE5VTEwKKyNkZWZpbmUgcG5nX2luZm9wcF9OVUxMICAgICAgICAgICBOVUxMCisjZGVmaW5lIHBuZ19tYWxsb2NfcHRyX05VTEwgICAgICAgTlVMTAorI2RlZmluZSBwbmdfcmVhZF9zdGF0dXNfcHRyX05VTEwgIE5VTEwKKyNkZWZpbmUgcG5nX3J3X3B0cl9OVUxMICAgICAgICAgICBOVUxMCisjZGVmaW5lIHBuZ19zdHJ1Y3RwX05VTEwgICAgICAgICAgTlVMTAorI2RlZmluZSBwbmdfdWludF8xNnBfTlVMTCAgICAgICAgIE5VTEwKKyNkZWZpbmUgcG5nX3ZvaWRwX05VTEwgICAgICAgICAgICBOVUxMCisjZGVmaW5lIHBuZ193cml0ZV9zdGF0dXNfcHRyX05VTEwgTlVMTAorI2VuZGlmCisKKy8qIFZhcmlhYmxlcyBkZWNsYXJlZCBpbiBwbmcuYyAtIG9ubHkgaXQgbmVlZHMgdG8gZGVmaW5lIFBOR19OT19FWFRFUk4gKi8KKyNpZiAhZGVmaW5lZChQTkdfTk9fRVhURVJOKSB8fCBkZWZpbmVkKFBOR19BTFdBWVNfRVhURVJOKQorLyogVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgQyBmaWxlcywgc3RvcmVkIGluIHBuZy5jLiAgVGhpcyBoYWQgYmV0dGVyIG1hdGNoCisgKiB0aGUgdmVyc2lvbiBhYm92ZS4KKyAqLworI2lmZGVmIFBOR19VU0VfR0xPQkFMX0FSUkFZUworUE5HX0VYUE9SVF9WQVIgKFBOR19DT05TVCBjaGFyKSBwbmdfbGlicG5nX3ZlclsxOF07CisgIC8qIE5lZWQgcm9vbSBmb3IgOTkuOTkuOTliZXRhOTl6ICovCisjZWxzZQorI2RlZmluZSBwbmdfbGlicG5nX3ZlciBwbmdfZ2V0X2hlYWRlcl92ZXIoTlVMTCkKKyNlbmRpZgorCisjaWZkZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCisvKiBUaGlzIHdhcyByZW1vdmVkIGluIHZlcnNpb24gMS4wLjVjICovCisvKiBTdHJ1Y3R1cmVzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZy4gIFNlZSBwbmcuYyBmb3IgbW9yZSBkZXRhaWxzICovCitQTkdfRVhQT1JUX1ZBUiAoUE5HX0NPTlNUIGludCBGQVJEQVRBKSBwbmdfcGFzc19zdGFydFs3XTsKK1BOR19FWFBPUlRfVkFSIChQTkdfQ09OU1QgaW50IEZBUkRBVEEpIHBuZ19wYXNzX2luY1s3XTsKK1BOR19FWFBPUlRfVkFSIChQTkdfQ09OU1QgaW50IEZBUkRBVEEpIHBuZ19wYXNzX3lzdGFydFs3XTsKK1BOR19FWFBPUlRfVkFSIChQTkdfQ09OU1QgaW50IEZBUkRBVEEpIHBuZ19wYXNzX3lpbmNbN107CitQTkdfRVhQT1JUX1ZBUiAoUE5HX0NPTlNUIGludCBGQVJEQVRBKSBwbmdfcGFzc19tYXNrWzddOworUE5HX0VYUE9SVF9WQVIgKFBOR19DT05TVCBpbnQgRkFSREFUQSkgcG5nX3Bhc3NfZHNwX21hc2tbN107CisvKiBUaGlzIGlzbid0IGN1cnJlbnRseSB1c2VkLiAgSWYgeW91IG5lZWQgaXQsIHNlZSBwbmcuYyBmb3IgbW9yZSBkZXRhaWxzLgorUE5HX0VYUE9SVF9WQVIgKFBOR19DT05TVCBpbnQgRkFSREFUQSkgcG5nX3Bhc3NfaGVpZ2h0WzddOworKi8KKyNlbmRpZgorCisjZW5kaWYgLyogUE5HX05PX0VYVEVSTiAqLworCisvKiBUaHJlZSBjb2xvciBkZWZpbml0aW9ucy4gIFRoZSBvcmRlciBvZiB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUsIChhbmQgdGhlCisgKiBleGFjdCBzaXplKSBpcyBub3QgaW1wb3J0YW50LCBhbHRob3VnaCB0aGUgc2l6ZSBvZiB0aGUgZmllbGRzIG5lZWQgdG8KKyAqIGJlIHBuZ19ieXRlIG9yIHBuZ191aW50XzE2IChhcyBkZWZpbmVkIGJlbG93KS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbG9yX3N0cnVjdAoreworICAgcG5nX2J5dGUgcmVkOworICAgcG5nX2J5dGUgZ3JlZW47CisgICBwbmdfYnl0ZSBibHVlOworfSBwbmdfY29sb3I7Cit0eXBlZGVmIHBuZ19jb2xvciBGQVIgKiBwbmdfY29sb3JwOwordHlwZWRlZiBwbmdfY29sb3IgRkFSICogRkFSICogcG5nX2NvbG9ycHA7CisKK3R5cGVkZWYgc3RydWN0IHBuZ19jb2xvcl8xNl9zdHJ1Y3QKK3sKKyAgIHBuZ19ieXRlIGluZGV4OyAgICAvKiB1c2VkIGZvciBwYWxldHRlIGZpbGVzICovCisgICBwbmdfdWludF8xNiByZWQ7ICAgLyogZm9yIHVzZSBpbiByZWQgZ3JlZW4gYmx1ZSBmaWxlcyAqLworICAgcG5nX3VpbnRfMTYgZ3JlZW47CisgICBwbmdfdWludF8xNiBibHVlOworICAgcG5nX3VpbnRfMTYgZ3JheTsgIC8qIGZvciB1c2UgaW4gZ3JheXNjYWxlIGZpbGVzICovCit9IHBuZ19jb2xvcl8xNjsKK3R5cGVkZWYgcG5nX2NvbG9yXzE2IEZBUiAqIHBuZ19jb2xvcl8xNnA7Cit0eXBlZGVmIHBuZ19jb2xvcl8xNiBGQVIgKiBGQVIgKiBwbmdfY29sb3JfMTZwcDsKKwordHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbG9yXzhfc3RydWN0Cit7CisgICBwbmdfYnl0ZSByZWQ7ICAgLyogZm9yIHVzZSBpbiByZWQgZ3JlZW4gYmx1ZSBmaWxlcyAqLworICAgcG5nX2J5dGUgZ3JlZW47CisgICBwbmdfYnl0ZSBibHVlOworICAgcG5nX2J5dGUgZ3JheTsgIC8qIGZvciB1c2UgaW4gZ3JheXNjYWxlIGZpbGVzICovCisgICBwbmdfYnl0ZSBhbHBoYTsgLyogZm9yIGFscGhhIGNoYW5uZWwgZmlsZXMgKi8KK30gcG5nX2NvbG9yXzg7Cit0eXBlZGVmIHBuZ19jb2xvcl84IEZBUiAqIHBuZ19jb2xvcl84cDsKK3R5cGVkZWYgcG5nX2NvbG9yXzggRkFSICogRkFSICogcG5nX2NvbG9yXzhwcDsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdHdvIHN0cnVjdHVyZXMgYXJlIHVzZWQgZm9yIHRoZSBpbi1jb3JlIHJlcHJlc2VudGF0aW9uCisgKiBvZiBzUExUIGNodW5rcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcG5nX3NQTFRfZW50cnlfc3RydWN0Cit7CisgICBwbmdfdWludF8xNiByZWQ7CisgICBwbmdfdWludF8xNiBncmVlbjsKKyAgIHBuZ191aW50XzE2IGJsdWU7CisgICBwbmdfdWludF8xNiBhbHBoYTsKKyAgIHBuZ191aW50XzE2IGZyZXF1ZW5jeTsKK30gcG5nX3NQTFRfZW50cnk7Cit0eXBlZGVmIHBuZ19zUExUX2VudHJ5IEZBUiAqIHBuZ19zUExUX2VudHJ5cDsKK3R5cGVkZWYgcG5nX3NQTFRfZW50cnkgRkFSICogRkFSICogcG5nX3NQTFRfZW50cnlwcDsKKworLyogIFdoZW4gdGhlIGRlcHRoIG9mIHRoZSBzUExUIHBhbGV0dGUgaXMgOCBiaXRzLCB0aGUgY29sb3IgYW5kIGFscGhhIHNhbXBsZXMKKyAqICBvY2N1cHkgdGhlIExTQiBvZiB0aGVpciByZXNwZWN0aXZlIG1lbWJlcnMsIGFuZCB0aGUgTVNCIG9mIGVhY2ggbWVtYmVyCisgKiAgaXMgemVyby1maWxsZWQuICBUaGUgZnJlcXVlbmN5IG1lbWJlciBhbHdheXMgb2NjdXBpZXMgdGhlIGZ1bGwgMTYgYml0cy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBwbmdfc1BMVF9zdHJ1Y3QKK3sKKyAgIHBuZ19jaGFycCBuYW1lOyAgICAgICAgICAgLyogcGFsZXR0ZSBuYW1lICovCisgICBwbmdfYnl0ZSBkZXB0aDsgICAgICAgICAgIC8qIGRlcHRoIG9mIHBhbGV0dGUgc2FtcGxlcyAqLworICAgcG5nX3NQTFRfZW50cnlwIGVudHJpZXM7ICAvKiBwYWxldHRlIGVudHJpZXMgKi8KKyAgIHBuZ19pbnRfMzIgbmVudHJpZXM7ICAgICAgLyogbnVtYmVyIG9mIHBhbGV0dGUgZW50cmllcyAqLworfSBwbmdfc1BMVF90OwordHlwZWRlZiBwbmdfc1BMVF90IEZBUiAqIHBuZ19zUExUX3RwOwordHlwZWRlZiBwbmdfc1BMVF90IEZBUiAqIEZBUiAqIHBuZ19zUExUX3RwcDsKKworI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorLyogcG5nX3RleHQgaG9sZHMgdGhlIGNvbnRlbnRzIG9mIGEgdGV4dC96dHh0L2l0eHQgY2h1bmsgaW4gYSBQTkcgZmlsZSwKKyAqIGFuZCB3aGV0aGVyIHRoYXQgY29udGVudHMgaXMgY29tcHJlc3NlZCBvciBub3QuICBUaGUgImtleSIgZmllbGQKKyAqIHBvaW50cyB0byBhIHJlZ3VsYXIgemVyby10ZXJtaW5hdGVkIEMgc3RyaW5nLiAgVGhlICJ0ZXh0IiwgImxhbmciLCBhbmQKKyAqICJsYW5nX2tleSIgZmllbGRzIGNhbiBiZSByZWd1bGFyIEMgc3RyaW5ncywgZW1wdHkgc3RyaW5ncywgb3IgTlVMTCBwb2ludGVycy4KKyAqIEhvd2V2ZXIsIHRoZSAqIHN0cnVjdHVyZSByZXR1cm5lZCBieSBwbmdfZ2V0X3RleHQoKSB3aWxsIGFsd2F5cyBjb250YWluCisgKiByZWd1bGFyIHplcm8tdGVybWluYXRlZCBDIHN0cmluZ3MgKHBvc3NpYmx5IGVtcHR5KSwgbmV2ZXIgTlVMTCBwb2ludGVycywKKyAqIHNvIHRoZXkgY2FuIGJlIHNhZmVseSB1c2VkIGluIHByaW50ZigpIGFuZCBvdGhlciBzdHJpbmctaGFuZGxpbmcgZnVuY3Rpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfdGV4dF9zdHJ1Y3QKK3sKKyAgIGludCAgY29tcHJlc3Npb247ICAgICAgIC8qIGNvbXByZXNzaW9uIHZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTogdEVYdCwgbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogelRYdCwgZGVmbGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogaVRYdCwgbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogaVRYdCwgZGVmbGF0ZSAgKi8KKyAgIHBuZ19jaGFycCBrZXk7ICAgICAgICAgIC8qIGtleXdvcmQsIDEtNzkgY2hhcmFjdGVyIGRlc2NyaXB0aW9uIG9mICJ0ZXh0IiAqLworICAgcG5nX2NoYXJwIHRleHQ7ICAgICAgICAgLyogY29tbWVudCwgbWF5IGJlIGFuIGVtcHR5IHN0cmluZyAoaWUgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIE5VTEwgcG9pbnRlciAqLworICAgcG5nX3NpemVfdCB0ZXh0X2xlbmd0aDsgLyogbGVuZ3RoIG9mIHRoZSB0ZXh0IHN0cmluZyAqLworI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorICAgcG5nX3NpemVfdCBpdHh0X2xlbmd0aDsgLyogbGVuZ3RoIG9mIHRoZSBpdHh0IHN0cmluZyAqLworICAgcG5nX2NoYXJwIGxhbmc7ICAgICAgICAgLyogbGFuZ3VhZ2UgY29kZSwgMC03OSBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIE5VTEwgcG9pbnRlciAqLworICAgcG5nX2NoYXJwIGxhbmdfa2V5OyAgICAgLyoga2V5d29yZCB0cmFuc2xhdGVkIFVURi04IHN0cmluZywgMCBvciBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycyBvciBhIE5VTEwgcG9pbnRlciAqLworI2VuZGlmCit9IHBuZ190ZXh0OwordHlwZWRlZiBwbmdfdGV4dCBGQVIgKiBwbmdfdGV4dHA7Cit0eXBlZGVmIHBuZ190ZXh0IEZBUiAqIEZBUiAqIHBuZ190ZXh0cHA7CisjZW5kaWYKKworLyogU3VwcG9ydGVkIGNvbXByZXNzaW9uIHR5cGVzIGZvciB0ZXh0IGluIFBORyBmaWxlcyAodEVYdCwgYW5kIHpUWHQpLgorICogVGhlIHZhbHVlcyBvZiB0aGUgUE5HX1RFWFRfQ09NUFJFU1NJT05fIGRlZmluZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLgorICovCisjZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1IgLTMKKyNkZWZpbmUgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiAtMgorI2RlZmluZSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FICAgIC0xCisjZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQgICAgIDAKKyNkZWZpbmUgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORSAgICAgMQorI2RlZmluZSBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0ICAgICAyCisjZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX0xBU1QgICAgIDMgIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIHBuZ190aW1lIGlzIGEgd2F5IHRvIGhvbGQgdGhlIHRpbWUgaW4gYW4gbWFjaGluZSBpbmRlcGVuZGVudCB3YXkuCisgKiBUd28gY29udmVyc2lvbnMgYXJlIHByb3ZpZGVkLCBib3RoIGZyb20gdGltZV90IGFuZCBzdHJ1Y3QgdG0uICBUaGVyZQorICogaXMgbm8gcG9ydGFibGUgd2F5IHRvIGNvbnZlcnQgdG8gZWl0aGVyIG9mIHRoZXNlIHN0cnVjdHVyZXMsIGFzIGZhcgorICogYXMgSSBrbm93LiAgSWYgeW91IGtub3cgb2YgYSBwb3J0YWJsZSB3YXksIHNlbmQgaXQgdG8gbWUuICBBcyBhIHNpZGUKKyAqIG5vdGUgLSBQTkcgaGFzIGFsd2F5cyBiZWVuIFllYXIgMjAwMCBjb21wbGlhbnQhCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ190aW1lX3N0cnVjdAoreworICAgcG5nX3VpbnRfMTYgeWVhcjsgLyogZnVsbCB5ZWFyLCBhcyBpbiwgMTk5NSAqLworICAgcG5nX2J5dGUgbW9udGg7ICAgLyogbW9udGggb2YgeWVhciwgMSAtIDEyICovCisgICBwbmdfYnl0ZSBkYXk7ICAgICAvKiBkYXkgb2YgbW9udGgsIDEgLSAzMSAqLworICAgcG5nX2J5dGUgaG91cjsgICAgLyogaG91ciBvZiBkYXksIDAgLSAyMyAqLworICAgcG5nX2J5dGUgbWludXRlOyAgLyogbWludXRlIG9mIGhvdXIsIDAgLSA1OSAqLworICAgcG5nX2J5dGUgc2Vjb25kOyAgLyogc2Vjb25kIG9mIG1pbnV0ZSwgMCAtIDYwIChmb3IgbGVhcCBzZWNvbmRzKSAqLworfSBwbmdfdGltZTsKK3R5cGVkZWYgcG5nX3RpbWUgRkFSICogcG5nX3RpbWVwOwordHlwZWRlZiBwbmdfdGltZSBGQVIgKiBGQVIgKiBwbmdfdGltZXBwOworCisjaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKSB8fCBcCisgZGVmaW5lZChQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEKQorLyogcG5nX3Vua25vd25fY2h1bmsgaXMgYSBzdHJ1Y3R1cmUgdG8gaG9sZCBxdWV1ZWQgY2h1bmtzIGZvciB3aGljaCB0aGVyZSBpcworICogbm8gc3BlY2lmaWMgc3VwcG9ydC4gIFRoZSBpZGVhIGlzIHRoYXQgd2UgY2FuIHVzZSB0aGlzIHRvIHF1ZXVlCisgKiB1cCBwcml2YXRlIGNodW5rcyBmb3Igb3V0cHV0IGV2ZW4gdGhvdWdoIHRoZSBsaWJyYXJ5IGRvZXNuJ3QgYWN0dWFsbHkKKyAqIGtub3cgYWJvdXQgdGhlaXIgc2VtYW50aWNzLgorICovCisjZGVmaW5lIFBOR19DSFVOS19OQU1FX0xFTkdUSCA1Cit0eXBlZGVmIHN0cnVjdCBwbmdfdW5rbm93bl9jaHVua190Cit7CisgICAgcG5nX2J5dGUgbmFtZVtQTkdfQ0hVTktfTkFNRV9MRU5HVEhdOworICAgIHBuZ19ieXRlICpkYXRhOworICAgIHBuZ19zaXplX3Qgc2l6ZTsKKworICAgIC8qIGxpYnBuZy11c2luZyBhcHBsaWNhdGlvbnMgc2hvdWxkIE5PVCBkaXJlY3RseSBtb2RpZnkgdGhpcyBieXRlLiAqLworICAgIHBuZ19ieXRlIGxvY2F0aW9uOyAvKiBtb2RlIG9mIG9wZXJhdGlvbiBhdCByZWFkIHRpbWUgKi8KK30KK3BuZ191bmtub3duX2NodW5rOwordHlwZWRlZiBwbmdfdW5rbm93bl9jaHVuayBGQVIgKiBwbmdfdW5rbm93bl9jaHVua3A7Cit0eXBlZGVmIHBuZ191bmtub3duX2NodW5rIEZBUiAqIEZBUiAqIHBuZ191bmtub3duX2NodW5rcHA7CisjZW5kaWYKKworLyogcG5nX2luZm8gaXMgYSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gaW4gYSBQTkcgZmlsZSBzbworICogdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIGZpbmQgb3V0IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGltYWdlLgorICogSWYgeW91IGFyZSByZWFkaW5nIHRoZSBmaWxlLCB0aGlzIHN0cnVjdHVyZSB3aWxsIHRlbGwgeW91IHdoYXQgaXMKKyAqIGluIHRoZSBQTkcgZmlsZS4gIElmIHlvdSBhcmUgd3JpdGluZyB0aGUgZmlsZSwgZmlsbCBpbiB0aGUgaW5mb3JtYXRpb24KKyAqIHlvdSB3YW50IHRvIHB1dCBpbnRvIHRoZSBQTkcgZmlsZSwgdGhlbiBjYWxsIHBuZ193cml0ZV9pbmZvKCkuCisgKiBUaGUgbmFtZXMgY2hvc2VuIHNob3VsZCBiZSB2ZXJ5IGNsb3NlIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgc28KKyAqIGNvbnN1bHQgdGhhdCBkb2N1bWVudCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lYW5pbmcgb2YgZWFjaCBmaWVsZC4KKyAqCisgKiBXaXRoIGxpYnBuZyA8IDAuOTUsIGl0IHdhcyBvbmx5IHBvc3NpYmxlIHRvIGRpcmVjdGx5IHNldCBhbmQgcmVhZCB0aGUKKyAqIHRoZSB2YWx1ZXMgaW4gdGhlIHBuZ19pbmZvX3N0cnVjdCwgd2hpY2ggbWVhbnQgdGhhdCB0aGUgY29udGVudHMgYW5kCisgKiBvcmRlciBvZiB0aGUgdmFsdWVzIGhhZCB0byByZW1haW4gZml4ZWQuICBXaXRoIGxpYnBuZyAwLjk1IGFuZCBsYXRlciwKKyAqIGhvd2V2ZXIsIHRoZXJlIGFyZSBub3cgZnVuY3Rpb25zIHRoYXQgYWJzdHJhY3QgdGhlIGNvbnRlbnRzIG9mCisgKiBwbmdfaW5mb19zdHJ1Y3QgZnJvbSB0aGUgYXBwbGljYXRpb24sIHNvIHRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZQorICogbGlicG5nIHdpdGggZHluYW1pYyBsaWJyYXJpZXMsIGFuZCBldmVuIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZQorICogbGlicmFyaWVzIHRoYXQgZG9uJ3QgaGF2ZSBhbGwgb2YgdGhlIGxpYnBuZyBhbmNpbGxhcnkgY2h1bmstaGFuZGluZworICogZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBJbiBhbnkgY2FzZSwgdGhlIG9yZGVyIG9mIHRoZSBwYXJhbWV0ZXJzIGluIHBuZ19pbmZvX3N0cnVjdCBzaG91bGQgTk9UCisgKiBiZSBjaGFuZ2VkIGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIHRvIGtlZXAgY29tcGF0aWJpbGl0eSB3aXRoIGFwcGxpY2F0aW9ucworICogdGhhdCB1c2UgdGhlIG9sZCBkaXJlY3QtYWNjZXNzIG1ldGhvZCB3aXRoIHBuZ19pbmZvX3N0cnVjdC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIG1lbWJlcnMgbWF5IGhhdmUgYWxsb2NhdGVkIHN0b3JhZ2UgYXR0YWNoZWQgdGhhdCBzaG91bGQgYmUKKyAqIGNsZWFuZWQgdXAgYmVmb3JlIHRoZSBzdHJ1Y3R1cmUgaXMgZGlzY2FyZGVkOiBwYWxldHRlLCB0cmFucywgdGV4dCwKKyAqIHBjYWxfcHVycG9zZSwgcGNhbF91bml0cywgcGNhbF9wYXJhbXMsIGhpc3QsIGljY3BfbmFtZSwgaWNjcF9wcm9maWxlLAorICogc3BsdF9wYWxldHRlcywgc2NhbF91bml0LCByb3dfcG9pbnRlcnMsIGFuZCB1bmtub3ducy4gICBCeSBkZWZhdWx0LCB0aGVzZQorICogYXJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbiB0aGUgaW5mbyBzdHJ1Y3R1cmUgaXMgZGVhbGxvY2F0ZWQsIGlmIHRoZXkgd2VyZQorICogYWxsb2NhdGVkIGludGVybmFsbHkgYnkgbGlicG5nLiAgVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBieSBtZWFucworICogb2YgdGhlIHBuZ19kYXRhX2ZyZWVyKCkgZnVuY3Rpb24uCisgKgorICogTW9yZSBhbGxvY2F0aW9uIGRldGFpbHM6IGFsbCB0aGUgY2h1bmstcmVhZGluZyBmdW5jdGlvbnMgdGhhdAorICogY2hhbmdlIHRoZXNlIG1lbWJlcnMgZ28gdGhyb3VnaCB0aGUgY29ycmVzcG9uZGluZyBwbmdfc2V0XyoKKyAqIGZ1bmN0aW9ucy4gIEEgZnVuY3Rpb24gdG8gY2xlYXIgdGhlc2UgbWVtYmVycyBpcyBhdmFpbGFibGU6IHNlZQorICogcG5nX2ZyZWVfZGF0YSgpLiAgVGhlIHBuZ19zZXRfKiBmdW5jdGlvbnMgZG8gbm90IGRlcGVuZCBvbiBiZWluZworICogYWJsZSB0byBwb2ludCBpbmZvIHN0cnVjdHVyZSBtZW1iZXJzIHRvIGFueSBvZiB0aGUgc3RvcmFnZSB0aGV5IGFyZQorICogcGFzc2VkICh0aGV5IG1ha2UgdGhlaXIgb3duIGNvcGllcyksIEVYQ0VQVCB0aGF0IHRoZSBwbmdfc2V0X3RleHQKKyAqIGZ1bmN0aW9ucyB1c2UgdGhlIHNhbWUgc3RvcmFnZSBwYXNzZWQgdG8gdGhlbSBpbiB0aGUgdGV4dF9wdHIgb3IKKyAqIGl0eHRfcHRyIHN0cnVjdHVyZSBhcmd1bWVudCwgYW5kIHRoZSBwbmdfc2V0X3Jvd3MgYW5kIHBuZ19zZXRfdW5rbm93bnMKKyAqIGZ1bmN0aW9ucyBkbyBub3QgbWFrZSB0aGVpciBvd24gY29waWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfaW5mb19zdHJ1Y3QKK3sKKyAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG5lY2Vzc2FyeSBmb3IgZXZlcnkgUE5HIGZpbGUgKi8KKyAgIHBuZ191aW50XzMyIHdpZHRoIFBOR19ERVBTVFJVQ1Q7ICAgICAgIC8qIHdpZHRoIG9mIGltYWdlIGluIHBpeGVscyAoZnJvbSBJSERSKSAqLworICAgcG5nX3VpbnRfMzIgaGVpZ2h0IFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscyAoZnJvbSBJSERSKSAqLworICAgcG5nX3VpbnRfMzIgdmFsaWQgUE5HX0RFUFNUUlVDVDsgICAgICAgLyogdmFsaWQgY2h1bmsgZGF0YSAoc2VlIFBOR19JTkZPXyBiZWxvdykgKi8KKyAgIHBuZ191aW50XzMyIHJvd2J5dGVzIFBOR19ERVBTVFJVQ1Q7ICAgIC8qIGJ5dGVzIG5lZWRlZCB0byBob2xkIGFuIHVudHJhbnNmb3JtZWQgcm93ICovCisgICBwbmdfY29sb3JwIHBhbGV0dGUgUE5HX0RFUFNUUlVDVDsgICAgICAvKiBhcnJheSBvZiBjb2xvciB2YWx1ZXMgKHZhbGlkICYgUE5HX0lORk9fUExURSkgKi8KKyAgIHBuZ191aW50XzE2IG51bV9wYWxldHRlIFBOR19ERVBTVFJVQ1Q7IC8qIG51bWJlciBvZiBjb2xvciBlbnRyaWVzIGluICJwYWxldHRlIiAoUExURSkgKi8KKyAgIHBuZ191aW50XzE2IG51bV90cmFucyBQTkdfREVQU1RSVUNUOyAgIC8qIG51bWJlciBvZiB0cmFuc3BhcmVudCBwYWxldHRlIGNvbG9yICh0Uk5TKSAqLworICAgcG5nX2J5dGUgYml0X2RlcHRoIFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogMSwgMiwgNCwgOCwgb3IgMTYgYml0cy9jaGFubmVsIChmcm9tIElIRFIpICovCisgICBwbmdfYnl0ZSBjb2xvcl90eXBlIFBOR19ERVBTVFJVQ1Q7ICAgICAvKiBzZWUgUE5HX0NPTE9SX1RZUEVfIGJlbG93IChmcm9tIElIRFIpICovCisgICAvKiBUaGUgZm9sbG93aW5nIHRocmVlIHNob3VsZCBoYXZlIGJlZW4gbmFtZWQgKl9tZXRob2Qgbm90ICpfdHlwZSAqLworICAgcG5nX2J5dGUgY29tcHJlc3Npb25fdHlwZSBQTkdfREVQU1RSVUNUOyAvKiBtdXN0IGJlIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgKElIRFIpICovCisgICBwbmdfYnl0ZSBmaWx0ZXJfdHlwZSBQTkdfREVQU1RSVUNUOyAgICAvKiBtdXN0IGJlIFBOR19GSUxURVJfVFlQRV9CQVNFIChmcm9tIElIRFIpICovCisgICBwbmdfYnl0ZSBpbnRlcmxhY2VfdHlwZSBQTkdfREVQU1RSVUNUOyAvKiBPbmUgb2YgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfSU5URVJMQUNFX0FEQU03ICovCisKKyAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgaW5mb3JtYXRpb25hbCBvbmx5IG9uIHJlYWQsIGFuZCBub3QgdXNlZCBvbiB3cml0ZXMuICovCisgICBwbmdfYnl0ZSBjaGFubmVscyBQTkdfREVQU1RSVUNUOyAgICAgICAvKiBudW1iZXIgb2YgZGF0YSBjaGFubmVscyBwZXIgcGl4ZWwgKDEsIDIsIDMsIDQpICovCisgICBwbmdfYnl0ZSBwaXhlbF9kZXB0aCBQTkdfREVQU1RSVUNUOyAgICAvKiBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgKi8KKyAgIHBuZ19ieXRlIHNwYXJlX2J5dGUgUE5HX0RFUFNUUlVDVDsgICAgIC8qIHRvIGFsaWduIHRoZSBkYXRhLCBhbmQgZm9yIGZ1dHVyZSB1c2UgKi8KKyAgIHBuZ19ieXRlIHNpZ25hdHVyZVs4XSBQTkdfREVQU1RSVUNUOyAgIC8qIG1hZ2ljIGJ5dGVzIHJlYWQgYnkgbGlicG5nIGZyb20gc3RhcnQgb2YgZmlsZSAqLworCisgICAvKiBUaGUgcmVzdCBvZiB0aGUgZGF0YSBpcyBvcHRpb25hbC4gIElmIHlvdSBhcmUgcmVhZGluZywgY2hlY2sgdGhlCisgICAgKiB2YWxpZCBmaWVsZCB0byBzZWUgaWYgdGhlIGluZm9ybWF0aW9uIGluIHRoZXNlIGFyZSB2YWxpZC4gIElmIHlvdQorICAgICogYXJlIHdyaXRpbmcsIHNldCB0aGUgdmFsaWQgZmllbGQgdG8gdGhvc2UgY2h1bmtzIHlvdSB3YW50IHdyaXR0ZW4sCisgICAgKiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGJlbG93LgorICAgICovCisKKyNpZiBkZWZpbmVkKFBOR19nQU1BX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQorICAgLyogVGhlIGdBTUEgY2h1bmsgZGVzY3JpYmVzIHRoZSBnYW1tYSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHN5c3RlbQorICAgICogb24gd2hpY2ggdGhlIGltYWdlIHdhcyBjcmVhdGVkLCBub3JtYWxseSBpbiB0aGUgcmFuZ2UgWzEuMCwgMi41XS4KKyAgICAqIERhdGEgaXMgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fZ0FNQSkgaXMgbm9uLXplcm8uCisgICAgKi8KKyAgIGZsb2F0IGdhbW1hIFBOR19ERVBTVFJVQ1Q7IC8qIGdhbW1hIHZhbHVlIG9mIGltYWdlLCBpZiAodmFsaWQgJiBQTkdfSU5GT19nQU1BKSAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKKyAgICAvKiBHUi1QLCAwLjk2YSAqLworICAgIC8qIERhdGEgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fc1JHQikgbm9uLXplcm8uICovCisgICBwbmdfYnl0ZSBzcmdiX2ludGVudCBQTkdfREVQU1RSVUNUOyAvKiBzUkdCIHJlbmRlcmluZyBpbnRlbnQgWzAsIDEsIDIsIG9yIDNdICovCisjZW5kaWYKKworI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorICAgLyogVGhlIHRFWHQsIGFuZCB6VFh0IGNodW5rcyBjb250YWluIGh1bWFuLXJlYWRhYmxlIHRleHR1YWwgZGF0YSBpbgorICAgICogdW5jb21wcmVzc2VkLCBjb21wcmVzc2VkLCBhbmQgb3B0aW9uYWxseSBjb21wcmVzc2VkIGZvcm1zLCByZXNwZWN0aXZlbHkuCisgICAgKiBUaGUgZGF0YSBpbiAidGV4dCIgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdW5jb21wcmVzc2VkLAorICAgICogbnVsbC10ZXJtaW5hdGVkIEMgc3RyaW5ncy4gRWFjaCBjaHVuayBoYXMgYSBrZXl3b3JkIHRoYXQgZGVzY3JpYmVzIHRoZQorICAgICogdGV4dHVhbCBkYXRhIGNvbnRhaW5lZCBpbiB0aGF0IGNodW5rLiAgS2V5d29yZHMgYXJlIG5vdCByZXF1aXJlZCB0byBiZQorICAgICogdW5pcXVlLCBhbmQgdGhlIHRleHQgc3RyaW5nIG1heSBiZSBlbXB0eS4gIEFueSBudW1iZXIgb2YgdGV4dCBjaHVua3MgbWF5CisgICAgKiBiZSBpbiBhbiBpbWFnZS4KKyAgICAqLworICAgaW50IG51bV90ZXh0IFBOR19ERVBTVFJVQ1Q7IC8qIG51bWJlciBvZiBjb21tZW50cyByZWFkL3RvIHdyaXRlICovCisgICBpbnQgbWF4X3RleHQgUE5HX0RFUFNUUlVDVDsgLyogY3VycmVudCBzaXplIG9mIHRleHQgYXJyYXkgKi8KKyAgIHBuZ190ZXh0cCB0ZXh0IFBOR19ERVBTVFJVQ1Q7IC8qIGFycmF5IG9mIGNvbW1lbnRzIHJlYWQvdG8gd3JpdGUgKi8KKyNlbmRpZiAvKiBQTkdfVEVYVF9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRAorICAgLyogVGhlIHRJTUUgY2h1bmsgaG9sZHMgdGhlIGxhc3QgdGltZSB0aGUgZGlzcGxheWVkIGltYWdlIGRhdGEgd2FzCisgICAgKiBtb2RpZmllZC4gIFNlZSB0aGUgcG5nX3RpbWUgc3RydWN0IGZvciB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3QuCisgICAgKi8KKyAgIHBuZ190aW1lIG1vZF90aW1lIFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKworI2lmZGVmIFBOR19zQklUX1NVUFBPUlRFRAorICAgLyogVGhlIHNCSVQgY2h1bmsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgaGlnaC1vcmRlciBiaXRzCisgICAgKiBpbiB0aGUgcGl4ZWwgZGF0YS4gIFZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIFsxLCBiaXRfZGVwdGhdLCBhbmQgYXJlCisgICAgKiBvbmx5IHNwZWNpZmllZCBmb3IgdGhlIGNoYW5uZWxzIGluIHRoZSBwaXhlbCBkYXRhLiAgVGhlIGNvbnRlbnRzIG9mCisgICAgKiB0aGUgbG93LW9yZGVyIGJpdHMgaXMgbm90IHNwZWNpZmllZC4gIERhdGEgaXMgdmFsaWQgaWYKKyAgICAqICh2YWxpZCAmIFBOR19JTkZPX3NCSVQpIGlzIG5vbi16ZXJvLgorICAgICovCisgICBwbmdfY29sb3JfOCBzaWdfYml0IFBOR19ERVBTVFJVQ1Q7IC8qIHNpZ25pZmljYW50IGJpdHMgaW4gY29sb3IgY2hhbm5lbHMgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfdFJOU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkgfHwgXAorZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKKyAgIC8qIFRoZSB0Uk5TIGNodW5rIHN1cHBsaWVzIHRyYW5zcGFyZW5jeSBkYXRhIGZvciBwYWxldHRlZCBpbWFnZXMgYW5kCisgICAgKiBvdGhlciBpbWFnZSB0eXBlcyB0aGF0IGRvbid0IG5lZWQgYSBmdWxsIGFscGhhIGNoYW5uZWwuICBUaGVyZSBhcmUKKyAgICAqICJudW1fdHJhbnMiIHRyYW5zcGFyZW5jeSB2YWx1ZXMgZm9yIGEgcGFsZXR0ZWQgaW1hZ2UsIHN0b3JlZCBpbiB0aGUKKyAgICAqIHNhbWUgb3JkZXIgYXMgdGhlIHBhbGV0dGUgY29sb3JzLCBzdGFydGluZyBmcm9tIGluZGV4IDAuICBWYWx1ZXMKKyAgICAqIGZvciB0aGUgZGF0YSBhcmUgaW4gdGhlIHJhbmdlIFswLCAyNTVdLCByYW5naW5nIGZyb20gZnVsbHkgdHJhbnNwYXJlbnQKKyAgICAqIHRvIGZ1bGx5IG9wYXF1ZSwgcmVzcGVjdGl2ZWx5LiAgRm9yIG5vbi1wYWxldHRlZCBpbWFnZXMsIHRoZXJlIGlzIGEKKyAgICAqIHNpbmdsZSBjb2xvciBzcGVjaWZpZWQgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBmdWxseSB0cmFuc3BhcmVudC4KKyAgICAqIERhdGEgaXMgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fdFJOUykgaXMgbm9uLXplcm8uCisgICAgKi8KKyAgIHBuZ19ieXRlcCB0cmFucyBQTkdfREVQU1RSVUNUOyAvKiB0cmFuc3BhcmVudCB2YWx1ZXMgZm9yIHBhbGV0dGVkIGltYWdlICovCisgICBwbmdfY29sb3JfMTYgdHJhbnNfdmFsdWVzIFBOR19ERVBTVFJVQ1Q7IC8qIHRyYW5zcGFyZW50IGNvbG9yIGZvciBub24tcGFsZXR0ZSBpbWFnZSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19iS0dEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKKyAgIC8qIFRoZSBiS0dEIGNodW5rIGdpdmVzIHRoZSBzdWdnZXN0ZWQgaW1hZ2UgYmFja2dyb3VuZCBjb2xvciBpZiB0aGUKKyAgICAqIGRpc3BsYXkgcHJvZ3JhbSBkb2VzIG5vdCBoYXZlIGl0cyBvd24gYmFja2dyb3VuZCBjb2xvciBhbmQgdGhlIGltYWdlCisgICAgKiBpcyBuZWVkcyB0byBjb21wb3NpdGVkIG9udG8gYSBiYWNrZ3JvdW5kIGJlZm9yZSBkaXNwbGF5LiAgVGhlIGNvbG9ycworICAgICogaW4gImJhY2tncm91bmQiIGFyZSBub3JtYWxseSBpbiB0aGUgc2FtZSBjb2xvciBzcGFjZS9kZXB0aCBhcyB0aGUKKyAgICAqIHBpeGVsIGRhdGEuICBEYXRhIGlzIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX2JLR0QpIGlzIG5vbi16ZXJvLgorICAgICovCisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZCBQTkdfREVQU1RSVUNUOworI2VuZGlmCisKKyNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKKyAgIC8qIFRoZSBvRkZzIGNodW5rIGdpdmVzIHRoZSBvZmZzZXQgaW4gIm9mZnNldF91bml0X3R5cGUiIHVuaXRzIHJpZ2h0d2FyZHMKKyAgICAqIGFuZCBkb3dud2FyZHMgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBkaXNwbGF5LCBwYWdlLCBvciBvdGhlcgorICAgICogYXBwbGljYXRpb24tc3BlY2lmaWMgY28tb3JkaW5hdGUgc3BhY2UuICBTZWUgdGhlIFBOR19PRkZTRVRfIGRlZmluZXMKKyAgICAqIGJlbG93IGZvciB0aGUgdW5pdCB0eXBlcy4gIFZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX29GRnMpIG5vbi16ZXJvLgorICAgICovCisgICBwbmdfaW50XzMyIHhfb2Zmc2V0IFBOR19ERVBTVFJVQ1Q7IC8qIHggb2Zmc2V0IG9uIHBhZ2UgKi8KKyAgIHBuZ19pbnRfMzIgeV9vZmZzZXQgUE5HX0RFUFNUUlVDVDsgLyogeSBvZmZzZXQgb24gcGFnZSAqLworICAgcG5nX2J5dGUgb2Zmc2V0X3VuaXRfdHlwZSBQTkdfREVQU1RSVUNUOyAvKiBvZmZzZXQgdW5pdHMgdHlwZSAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKKyAgIC8qIFRoZSBwSFlzIGNodW5rIGdpdmVzIHRoZSBwaHlzaWNhbCBwaXhlbCBkZW5zaXR5IG9mIHRoZSBpbWFnZSBmb3IKKyAgICAqIGRpc3BsYXkgb3IgcHJpbnRpbmcgaW4gInBoeXNfdW5pdF90eXBlIiB1bml0cyAoc2VlIFBOR19SRVNPTFVUSU9OXworICAgICogZGVmaW5lcyBiZWxvdykuICBEYXRhIGlzIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX3BIWXMpIGlzIG5vbi16ZXJvLgorICAgICovCisgICBwbmdfdWludF8zMiB4X3BpeGVsc19wZXJfdW5pdCBQTkdfREVQU1RSVUNUOyAvKiBob3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KKyAgIHBuZ191aW50XzMyIHlfcGl4ZWxzX3Blcl91bml0IFBOR19ERVBTVFJVQ1Q7IC8qIHZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KKyAgIHBuZ19ieXRlIHBoeXNfdW5pdF90eXBlIFBOR19ERVBTVFJVQ1Q7IC8qIHJlc29sdXRpb24gdHlwZSAoc2VlIFBOR19SRVNPTFVUSU9OXyBiZWxvdykgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX2hJU1RfU1VQUE9SVEVECisgICAvKiBUaGUgaElTVCBjaHVuayBjb250YWlucyB0aGUgcmVsYXRpdmUgZnJlcXVlbmN5IG9yIGltcG9ydGFuY2Ugb2YgdGhlCisgICAgKiB2YXJpb3VzIHBhbGV0dGUgZW50cmllcywgc28gdGhhdCBhIHZpZXdlciBjYW4gaW50ZWxsaWdlbnRseSBzZWxlY3QgYQorICAgICogcmVkdWNlZC1jb2xvciBwYWxldHRlLCBpZiByZXF1aXJlZC4gIERhdGEgaXMgYW4gYXJyYXkgb2YgIm51bV9wYWxldHRlIgorICAgICogdmFsdWVzIGluIHRoZSByYW5nZSBbMCw2NTUzNV0uIERhdGEgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9faElTVCkKKyAgICAqIGlzIG5vbi16ZXJvLgorICAgICovCisgICBwbmdfdWludF8xNnAgaGlzdCBQTkdfREVQU1RSVUNUOworI2VuZGlmCisKKyNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKKyAgIC8qIFRoZSBjSFJNIGNodW5rIGRlc2NyaWJlcyB0aGUgQ0lFIGNvbG9yIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgbW9uaXRvcgorICAgICogb24gd2hpY2ggdGhlIFBORyB3YXMgY3JlYXRlZC4gIFRoaXMgZGF0YSBhbGxvd3MgdGhlIHZpZXdlciB0byBkbyBnYW11dAorICAgICogbWFwcGluZyBvZiB0aGUgaW5wdXQgaW1hZ2UgdG8gZW5zdXJlIHRoYXQgdGhlIHZpZXdlciBzZWVzIHRoZSBzYW1lCisgICAgKiBjb2xvcnMgaW4gdGhlIGltYWdlIGFzIHRoZSBjcmVhdG9yLiAgVmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UKKyAgICAqIFswLjAsIDAuOF0uICBEYXRhIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX2NIUk0pIG5vbi16ZXJvLgorICAgICovCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgZmxvYXQgeF93aGl0ZSBQTkdfREVQU1RSVUNUOworICAgZmxvYXQgeV93aGl0ZSBQTkdfREVQU1RSVUNUOworICAgZmxvYXQgeF9yZWQgUE5HX0RFUFNUUlVDVDsKKyAgIGZsb2F0IHlfcmVkIFBOR19ERVBTVFJVQ1Q7CisgICBmbG9hdCB4X2dyZWVuIFBOR19ERVBTVFJVQ1Q7CisgICBmbG9hdCB5X2dyZWVuIFBOR19ERVBTVFJVQ1Q7CisgICBmbG9hdCB4X2JsdWUgUE5HX0RFUFNUUlVDVDsKKyAgIGZsb2F0IHlfYmx1ZSBQTkdfREVQU1RSVUNUOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAorICAgLyogVGhlIHBDQUwgY2h1bmsgZGVzY3JpYmVzIGEgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiB0aGUgc3RvcmVkIHBpeGVsCisgICAgKiB2YWx1ZXMgYW5kIG9yaWdpbmFsIHBoeXNpY2FsIGRhdGEgdmFsdWVzIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZS4KKyAgICAqIFRoZSBpbnRlZ2VyIHJhbmdlIFswLCAyXmJpdF9kZXB0aCAtIDFdIG1hcHMgdG8gdGhlIGZsb2F0aW5nLXBvaW50CisgICAgKiByYW5nZSBnaXZlbiBieSBbcGNhbF9YMCwgcGNhbF9YMV0sIGFuZCBhcmUgZnVydGhlciB0cmFuc2Zvcm1lZCBieSBhCisgICAgKiAocG9zc2libHkgbm9uLWxpbmVhcikgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gZ2l2ZW4gYnkgInBjYWxfdHlwZSIKKyAgICAqIGFuZCAicGNhbF9wYXJhbXMiIGludG8gInBjYWxfdW5pdHMiLiAgUGxlYXNlIHNlZSB0aGUgUE5HX0VRVUFUSU9OXworICAgICogZGVmaW5lcyBiZWxvdywgYW5kIHRoZSBQTkctR3JvdXAncyBQTkcgZXh0ZW5zaW9ucyBkb2N1bWVudCBmb3IgYQorICAgICogY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBhbmQgaG93IHRoZXkgc2hvdWxkIGJlCisgICAgKiBpbXBsZW1lbnRlZCwgYW5kIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBBU0NJSSBwYXJhbWV0ZXIgc3RyaW5ncy4KKyAgICAqIERhdGEgdmFsdWVzIGFyZSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19wQ0FMKSBub24temVyby4KKyAgICAqLworICAgcG5nX2NoYXJwIHBjYWxfcHVycG9zZSBQTkdfREVQU1RSVUNUOyAgLyogcENBTCBjaHVuayBkZXNjcmlwdGlvbiBzdHJpbmcgKi8KKyAgIHBuZ19pbnRfMzIgcGNhbF9YMCBQTkdfREVQU1RSVUNUOyAgICAgIC8qIG1pbmltdW0gdmFsdWUgKi8KKyAgIHBuZ19pbnRfMzIgcGNhbF9YMSBQTkdfREVQU1RSVUNUOyAgICAgIC8qIG1heGltdW0gdmFsdWUgKi8KKyAgIHBuZ19jaGFycCBwY2FsX3VuaXRzIFBOR19ERVBTVFJVQ1Q7ICAgIC8qIExhdGluLTEgc3RyaW5nIGdpdmluZyBwaHlzaWNhbCB1bml0cyAqLworICAgcG5nX2NoYXJwcCBwY2FsX3BhcmFtcyBQTkdfREVQU1RSVUNUOyAgLyogQVNDSUkgc3RyaW5ncyBjb250YWluaW5nIHBhcmFtZXRlciB2YWx1ZXMgKi8KKyAgIHBuZ19ieXRlIHBjYWxfdHlwZSBQTkdfREVQU1RSVUNUOyAgICAgIC8qIGVxdWF0aW9uIHR5cGUgKHNlZSBQTkdfRVFVQVRJT05fIGJlbG93KSAqLworICAgcG5nX2J5dGUgcGNhbF9ucGFyYW1zIFBOR19ERVBTVFJVQ1Q7ICAgLyogbnVtYmVyIG9mIHBhcmFtZXRlcnMgZ2l2ZW4gaW4gcGNhbF9wYXJhbXMgKi8KKyNlbmRpZgorCisvKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4wLjYgKi8KKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgIHBuZ191aW50XzMyIGZyZWVfbWUgUE5HX0RFUFNUUlVDVDsgICAgIC8qIGZsYWdzIGl0ZW1zIGxpYnBuZyBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpIHx8IFwKKyBkZWZpbmVkKFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQpCisgICAvKiBTdG9yYWdlIGZvciB1bmtub3duIGNodW5rcyB0aGF0IHRoZSBsaWJyYXJ5IGRvZXNuJ3QgcmVjb2duaXplLiAqLworICAgcG5nX3Vua25vd25fY2h1bmtwIHVua25vd25fY2h1bmtzIFBOR19ERVBTVFJVQ1Q7CisgICBwbmdfc2l6ZV90IHVua25vd25fY2h1bmtzX251bSBQTkdfREVQU1RSVUNUOworI2VuZGlmCisKKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKKyAgIC8qIGlDQ1AgY2h1bmsgZGF0YS4gKi8KKyAgIHBuZ19jaGFycCBpY2NwX25hbWUgUE5HX0RFUFNUUlVDVDsgICAgIC8qIHByb2ZpbGUgbmFtZSAqLworICAgcG5nX2NoYXJwIGljY3BfcHJvZmlsZSBQTkdfREVQU1RSVUNUOyAgLyogSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIHByb2ZpbGUgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGUgdG8gbWFpbnRhaW5lcjogc2hvdWxkIGJlIHBuZ19ieXRlcCAqLworICAgcG5nX3VpbnRfMzIgaWNjcF9wcm9mbGVuIFBOR19ERVBTVFJVQ1Q7ICAvKiBJQ0MgcHJvZmlsZSBkYXRhIGxlbmd0aCAqLworICAgcG5nX2J5dGUgaWNjcF9jb21wcmVzc2lvbiBQTkdfREVQU1RSVUNUOyAvKiBBbHdheXMgemVybyAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKKyAgIC8qIERhdGEgb24gc1BMVCBjaHVua3MgKHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lKS4gKi8KKyAgIHBuZ19zUExUX3RwIHNwbHRfcGFsZXR0ZXMgUE5HX0RFUFNUUlVDVDsKKyAgIHBuZ191aW50XzMyIHNwbHRfcGFsZXR0ZXNfbnVtIFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKworI2lmZGVmIFBOR19zQ0FMX1NVUFBPUlRFRAorICAgLyogVGhlIHNDQUwgY2h1bmsgZGVzY3JpYmVzIHRoZSBhY3R1YWwgcGh5c2ljYWwgZGltZW5zaW9ucyBvZiB0aGUKKyAgICAqIHN1YmplY3QgbWF0dGVyIG9mIHRoZSBncmFwaGljLiAgVGhlIGNodW5rIGNvbnRhaW5zIGEgdW5pdCBzcGVjaWZpY2F0aW9uCisgICAgKiBhIGJ5dGUgdmFsdWUsIGFuZCB0d28gQVNDSUkgc3RyaW5ncyByZXByZXNlbnRpbmcgZmxvYXRpbmctcG9pbnQKKyAgICAqIHZhbHVlcy4gIFRoZSB2YWx1ZXMgYXJlIHdpZHRoIGFuZCBoZWlnaHQgY29ycmVzcG9uc2luZyB0byBvbmUgcGl4ZWwKKyAgICAqIGluIHRoZSBpbWFnZS4gIFRoaXMgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gaXMgY29udmVydGVkIHRvIGRvdWJsZQorICAgICogaGVyZS4gIERhdGEgdmFsdWVzIGFyZSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19zQ0FMKSBpcyBub24temVyby4KKyAgICAqLworICAgcG5nX2J5dGUgc2NhbF91bml0IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogdW5pdCBvZiBwaHlzaWNhbCBzY2FsZSAqLworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIGRvdWJsZSBzY2FsX3BpeGVsX3dpZHRoIFBOR19ERVBTVFJVQ1Q7ICAgIC8qIHdpZHRoIG9mIG9uZSBwaXhlbCAqLworICAgZG91YmxlIHNjYWxfcGl4ZWxfaGVpZ2h0IFBOR19ERVBTVFJVQ1Q7ICAgLyogaGVpZ2h0IG9mIG9uZSBwaXhlbCAqLworI2VuZGlmCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorICAgcG5nX2NoYXJwIHNjYWxfc193aWR0aCBQTkdfREVQU1RSVUNUOyAgICAgLyogc3RyaW5nIGNvbnRhaW5pbmcgaGVpZ2h0ICovCisgICBwbmdfY2hhcnAgc2NhbF9zX2hlaWdodCBQTkdfREVQU1RSVUNUOyAgICAvKiBzdHJpbmcgY29udGFpbmluZyB3aWR0aCAqLworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAorICAgLyogTWVtb3J5IGhhcyBiZWVuIGFsbG9jYXRlZCBpZiAodmFsaWQgJiBQTkdfQUxMT0NBVEVEX0lORk9fUk9XUykgbm9uLXplcm8gKi8KKyAgIC8qIERhdGEgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fSURBVCkgbm9uLXplcm8gKi8KKyAgIHBuZ19ieXRlcHAgcm93X3BvaW50ZXJzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiB0aGUgaW1hZ2UgYml0cyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX2dBTUFfU1VQUE9SVEVEKQorICAgcG5nX2ZpeGVkX3BvaW50IGludF9nYW1tYSBQTkdfREVQU1RSVUNUOyAvKiBnYW1tYSBvZiBpbWFnZSwgaWYgKHZhbGlkICYgUE5HX0lORk9fZ0FNQSkgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfY0hSTV9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRCkKKyAgIHBuZ19maXhlZF9wb2ludCBpbnRfeF93aGl0ZSBQTkdfREVQU1RSVUNUOworICAgcG5nX2ZpeGVkX3BvaW50IGludF95X3doaXRlIFBOR19ERVBTVFJVQ1Q7CisgICBwbmdfZml4ZWRfcG9pbnQgaW50X3hfcmVkIFBOR19ERVBTVFJVQ1Q7CisgICBwbmdfZml4ZWRfcG9pbnQgaW50X3lfcmVkIFBOR19ERVBTVFJVQ1Q7CisgICBwbmdfZml4ZWRfcG9pbnQgaW50X3hfZ3JlZW4gUE5HX0RFUFNUUlVDVDsKKyAgIHBuZ19maXhlZF9wb2ludCBpbnRfeV9ncmVlbiBQTkdfREVQU1RSVUNUOworICAgcG5nX2ZpeGVkX3BvaW50IGludF94X2JsdWUgUE5HX0RFUFNUUlVDVDsKKyAgIHBuZ19maXhlZF9wb2ludCBpbnRfeV9ibHVlIFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKworfSBwbmdfaW5mbzsKKwordHlwZWRlZiBwbmdfaW5mbyBGQVIgKiBwbmdfaW5mb3A7Cit0eXBlZGVmIHBuZ19pbmZvIEZBUiAqIEZBUiAqIHBuZ19pbmZvcHA7CisKKy8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciB1c2VkIGluIFBORyBpcyAoMl4zMSktMSAqLworI2RlZmluZSBQTkdfVUlOVF8zMV9NQVggKChwbmdfdWludF8zMikweDdmZmZmZmZmTCkKKyNkZWZpbmUgUE5HX1VJTlRfMzJfTUFYICgocG5nX3VpbnRfMzIpKC0xKSkKKyNkZWZpbmUgUE5HX1NJWkVfTUFYICgocG5nX3NpemVfdCkoLTEpKQorI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkIChQTkdfMV8yX1gpCisvKiBQTkdfTUFYX1VJTlQgaXMgZGVwcmVjYXRlZDsgdXNlIFBOR19VSU5UXzMxX01BWCBpbnN0ZWFkLiAqLworI2RlZmluZSBQTkdfTUFYX1VJTlQgUE5HX1VJTlRfMzFfTUFYCisjZW5kaWYKKworLyogVGhlc2UgZGVzY3JpYmUgdGhlIGNvbG9yX3R5cGUgZmllbGQgaW4gcG5nX2luZm8uICovCisvKiBjb2xvciB0eXBlIG1hc2tzICovCisjZGVmaW5lIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUgICAgMQorI2RlZmluZSBQTkdfQ09MT1JfTUFTS19DT0xPUiAgICAgIDIKKyNkZWZpbmUgUE5HX0NPTE9SX01BU0tfQUxQSEEgICAgICA0CisKKy8qIGNvbG9yIHR5cGVzLiAgTm90ZSB0aGF0IG5vdCBhbGwgY29tYmluYXRpb25zIGFyZSBsZWdhbCAqLworI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9HUkFZIDAKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAgKFBOR19DT0xPUl9NQVNLX0NPTE9SIHwgUE5HX0NPTE9SX01BU0tfUEFMRVRURSkKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfUkdCICAgICAgICAoUE5HX0NPTE9SX01BU0tfQ09MT1IpCisjZGVmaW5lIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSAgKFBOR19DT0xPUl9NQVNLX0NPTE9SIHwgUE5HX0NPTE9SX01BU0tfQUxQSEEpCisjZGVmaW5lIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEgKFBOR19DT0xPUl9NQVNLX0FMUEhBKQorLyogYWxpYXNlcyAqLworI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9SR0JBICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfR0EgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKKworLyogVGhpcyBpcyBmb3IgY29tcHJlc3Npb24gdHlwZS4gUE5HIDEuMC0xLjIgb25seSBkZWZpbmUgdGhlIHNpbmdsZSB0eXBlLiAqLworI2RlZmluZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIDAgLyogRGVmbGF0ZSBtZXRob2QgOCwgMzJLIHdpbmRvdyAqLworI2RlZmluZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UKKworLyogVGhpcyBpcyBmb3IgZmlsdGVyIHR5cGUuIFBORyAxLjAtMS4yIG9ubHkgZGVmaW5lIHRoZSBzaW5nbGUgdHlwZS4gKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9UWVBFX0JBU0UgICAgICAwIC8qIFNpbmdsZSByb3cgcGVyLWJ5dGUgZmlsdGVyaW5nICovCisjZGVmaW5lIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyA2NCAvKiBVc2VkIG9ubHkgaW4gTU5HIGRhdGFzdHJlYW1zICovCisjZGVmaW5lIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUICAgUE5HX0ZJTFRFUl9UWVBFX0JBU0UKKworLyogVGhlc2UgYXJlIGZvciB0aGUgaW50ZXJsYWNpbmcgdHlwZS4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCisjZGVmaW5lIFBOR19JTlRFUkxBQ0VfTk9ORSAgICAgICAgMCAvKiBOb24taW50ZXJsYWNlZCBpbWFnZSAqLworI2RlZmluZSBQTkdfSU5URVJMQUNFX0FEQU03ICAgICAgIDEgLyogQWRhbTcgaW50ZXJsYWNpbmcgKi8KKyNkZWZpbmUgUE5HX0lOVEVSTEFDRV9MQVNUICAgICAgICAyIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIFRoZXNlIGFyZSBmb3IgdGhlIG9GRnMgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLworI2RlZmluZSBQTkdfT0ZGU0VUX1BJWEVMICAgICAgICAgIDAgLyogT2Zmc2V0IGluIHBpeGVscyAqLworI2RlZmluZSBQTkdfT0ZGU0VUX01JQ1JPTUVURVIgICAgIDEgLyogT2Zmc2V0IGluIG1pY3JvbWV0ZXJzICgxLzEwXjYgbWV0ZXIpICovCisjZGVmaW5lIFBOR19PRkZTRVRfTEFTVCAgICAgICAgICAgMiAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLworCisvKiBUaGVzZSBhcmUgZm9yIHRoZSBwQ0FMIGNodW5rLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KKyNkZWZpbmUgUE5HX0VRVUFUSU9OX0xJTkVBUiAgICAgICAwIC8qIExpbmVhciB0cmFuc2Zvcm1hdGlvbiAqLworI2RlZmluZSBQTkdfRVFVQVRJT05fQkFTRV9FICAgICAgIDEgLyogRXhwb25lbnRpYWwgYmFzZSBlIHRyYW5zZm9ybSAqLworI2RlZmluZSBQTkdfRVFVQVRJT05fQVJCSVRSQVJZICAgIDIgLyogQXJiaXRyYXJ5IGJhc2UgZXhwb25lbnRpYWwgdHJhbnNmb3JtICovCisjZGVmaW5lIFBOR19FUVVBVElPTl9IWVBFUkJPTElDICAgMyAvKiBIeXBlcmJvbGljIHNpbmUgdHJhbnNmb3JtYXRpb24gKi8KKyNkZWZpbmUgUE5HX0VRVUFUSU9OX0xBU1QgICAgICAgICA0IC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIFRoZXNlIGFyZSBmb3IgdGhlIHNDQUwgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLworI2RlZmluZSBQTkdfU0NBTEVfVU5LTk9XTiAgICAgICAgIDAgLyogdW5rbm93biB1bml0IChpbWFnZSBzY2FsZSkgKi8KKyNkZWZpbmUgUE5HX1NDQUxFX01FVEVSICAgICAgICAgICAxIC8qIG1ldGVycyBwZXIgcGl4ZWwgKi8KKyNkZWZpbmUgUE5HX1NDQUxFX1JBRElBTiAgICAgICAgICAyIC8qIHJhZGlhbnMgcGVyIHBpeGVsICovCisjZGVmaW5lIFBOR19TQ0FMRV9MQVNUICAgICAgICAgICAgMyAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLworCisvKiBUaGVzZSBhcmUgZm9yIHRoZSBwSFlzIGNodW5rLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KKyNkZWZpbmUgUE5HX1JFU09MVVRJT05fVU5LTk9XTiAgICAwIC8qIHBpeGVscy91bmtub3duIHVuaXQgKGFzcGVjdCByYXRpbykgKi8KKyNkZWZpbmUgUE5HX1JFU09MVVRJT05fTUVURVIgICAgICAxIC8qIHBpeGVscy9tZXRlciAqLworI2RlZmluZSBQTkdfUkVTT0xVVElPTl9MQVNUICAgICAgIDIgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KKworLyogVGhlc2UgYXJlIGZvciB0aGUgc1JHQiBjaHVuay4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCisjZGVmaW5lIFBOR19zUkdCX0lOVEVOVF9QRVJDRVBUVUFMIDAKKyNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX1JFTEFUSVZFICAgMQorI2RlZmluZSBQTkdfc1JHQl9JTlRFTlRfU0FUVVJBVElPTiAyCisjZGVmaW5lIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSAgIDMKKyNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX0xBU1QgICAgICAgNCAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLworCisvKiBUaGlzIGlzIGZvciB0ZXh0IGNodW5rcyAqLworI2RlZmluZSBQTkdfS0VZV09SRF9NQVhfTEVOR1RIICAgICA3OQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGluIFBMVEUvc1BMVC90Uk5TIGFycmF5cyAqLworI2RlZmluZSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIICAgIDI1NgorCisvKiBUaGVzZSBkZXRlcm1pbmUgaWYgYW4gYW5jaWxsYXJ5IGNodW5rJ3MgZGF0YSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVhZAorICogZnJvbSB0aGUgUE5HIGhlYWRlciwgb3IgaWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBmaWxsZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGRhdGEgaW4gdGhlIGluZm9fc3RydWN0IHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0IGZpbGUuICBUaGUgdmFsdWVzCisgKiBvZiB0aGUgUE5HX0lORk9fPGNodW5rPiBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4KKyAqLworI2RlZmluZSBQTkdfSU5GT19nQU1BIDB4MDAwMQorI2RlZmluZSBQTkdfSU5GT19zQklUIDB4MDAwMgorI2RlZmluZSBQTkdfSU5GT19jSFJNIDB4MDAwNAorI2RlZmluZSBQTkdfSU5GT19QTFRFIDB4MDAwOAorI2RlZmluZSBQTkdfSU5GT190Uk5TIDB4MDAxMAorI2RlZmluZSBQTkdfSU5GT19iS0dEIDB4MDAyMAorI2RlZmluZSBQTkdfSU5GT19oSVNUIDB4MDA0MAorI2RlZmluZSBQTkdfSU5GT19wSFlzIDB4MDA4MAorI2RlZmluZSBQTkdfSU5GT19vRkZzIDB4MDEwMAorI2RlZmluZSBQTkdfSU5GT190SU1FIDB4MDIwMAorI2RlZmluZSBQTkdfSU5GT19wQ0FMIDB4MDQwMAorI2RlZmluZSBQTkdfSU5GT19zUkdCIDB4MDgwMCAgIC8qIEdSLVAsIDAuOTZhICovCisjZGVmaW5lIFBOR19JTkZPX2lDQ1AgMHgxMDAwICAgLyogRVNSLCAxLjAuNiAqLworI2RlZmluZSBQTkdfSU5GT19zUExUIDB4MjAwMCAgIC8qIEVTUiwgMS4wLjYgKi8KKyNkZWZpbmUgUE5HX0lORk9fc0NBTCAweDQwMDAgICAvKiBFU1IsIDEuMC42ICovCisjZGVmaW5lIFBOR19JTkZPX0lEQVQgMHg4MDAwTCAgLyogRVNSLCAxLjAuNiAqLworCisvKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcywgYXMgc29tZSBvZiB0aGVtCisgKiBjaGFuZ2UgdGhlc2UgdmFsdWVzIGZvciB0aGUgcm93LiAgSXQgYWxzbyBzaG91bGQgZW5hYmxlIHVzaW5nCisgKiB0aGUgcm91dGluZXMgZm9yIG90aGVyIHB1cnBvc2VzLgorICovCit0eXBlZGVmIHN0cnVjdCBwbmdfcm93X2luZm9fc3RydWN0Cit7CisgICBwbmdfdWludF8zMiB3aWR0aDsgLyogd2lkdGggb2Ygcm93ICovCisgICBwbmdfdWludF8zMiByb3dieXRlczsgLyogbnVtYmVyIG9mIGJ5dGVzIGluIHJvdyAqLworICAgcG5nX2J5dGUgY29sb3JfdHlwZTsgLyogY29sb3IgdHlwZSBvZiByb3cgKi8KKyAgIHBuZ19ieXRlIGJpdF9kZXB0aDsgLyogYml0IGRlcHRoIG9mIHJvdyAqLworICAgcG5nX2J5dGUgY2hhbm5lbHM7IC8qIG51bWJlciBvZiBjaGFubmVscyAoMSwgMiwgMywgb3IgNCkgKi8KKyAgIHBuZ19ieXRlIHBpeGVsX2RlcHRoOyAvKiBiaXRzIHBlciBwaXhlbCAoZGVwdGggKiBjaGFubmVscykgKi8KK30gcG5nX3Jvd19pbmZvOworCit0eXBlZGVmIHBuZ19yb3dfaW5mbyBGQVIgKiBwbmdfcm93X2luZm9wOwordHlwZWRlZiBwbmdfcm93X2luZm8gRkFSICogRkFSICogcG5nX3Jvd19pbmZvcHA7CisKKy8qIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb24gdHlwZXMgZm9yIHRoZSBJL08gZnVuY3Rpb25zIGFuZCBmb3IgdGhlIGZ1bmN0aW9ucworICogdGhhdCBhbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBJL08gZnVuY3Rpb25zIHdpdGggaGlzIG9yIGhlcgorICogb3duLiAgVGhlIHBuZ19lcnJvcl9wdHIgdHlwZSBzaG91bGQgbWF0Y2ggdGhhdCBvZiB1c2VyLXN1cHBsaWVkIHdhcm5pbmcKKyAqIGFuZCBlcnJvciBmdW5jdGlvbnMsIHdoaWxlIHRoZSBwbmdfcndfcHRyIHR5cGUgc2hvdWxkIG1hdGNoIHRoYXQgb2YgdGhlCisgKiB1c2VyIHJlYWQvd3JpdGUgZGF0YSBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBuZ19zdHJ1Y3RfZGVmIHBuZ19zdHJ1Y3Q7Cit0eXBlZGVmIHBuZ19zdHJ1Y3QgRkFSICogcG5nX3N0cnVjdHA7CisKK3R5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfZXJyb3JfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfY29uc3RfY2hhcnApKTsKK3R5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfcndfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfYnl0ZXAsIHBuZ19zaXplX3QpKTsKK3R5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfZmx1c2hfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwKSk7Cit0eXBlZGVmIHZvaWQgKFBOR0FQSSAqcG5nX3JlYWRfc3RhdHVzX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCwgcG5nX3VpbnRfMzIsCisgICBpbnQpKTsKK3R5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfd3JpdGVfc3RhdHVzX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCwgcG5nX3VpbnRfMzIsCisgICBpbnQpKTsKKworI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAordHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ19wcm9ncmVzc2l2ZV9pbmZvX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCwgcG5nX2luZm9wKSk7Cit0eXBlZGVmIHZvaWQgKFBOR0FQSSAqcG5nX3Byb2dyZXNzaXZlX2VuZF9wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsIHBuZ19pbmZvcCkpOwordHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfYnl0ZXAsCisgICBwbmdfdWludF8zMiwgaW50KSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfTEVHQUNZX1NVUFBPUlRFRCkKK3R5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfdXNlcl90cmFuc2Zvcm1fcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLAorICAgIHBuZ19yb3dfaW5mb3AsIHBuZ19ieXRlcCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVVNFUl9DSFVOS1NfU1VQUE9SVEVECit0eXBlZGVmIGludCAoUE5HQVBJICpwbmdfdXNlcl9jaHVua19wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsIHBuZ191bmtub3duX2NodW5rcCkpOworI2VuZGlmCisjaWZkZWYgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAordHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ191bmtub3duX2NodW5rX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCkpOworI2VuZGlmCisKKy8qIFRyYW5zZm9ybSBtYXNrcyBmb3IgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fSURFTlRJVFkgICAgICAgMHgwMDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICAgMHgwMDAxICAgIC8qIHJlYWQgb25seSAqLworI2RlZmluZSBQTkdfVFJBTlNGT1JNX1NUUklQX0FMUEhBICAgIDB4MDAwMiAgICAvKiByZWFkIG9ubHkgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgICAweDAwMDQgICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgICAweDAwMDggICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9FWFBBTkQgICAgICAgICAweDAwMTAgICAgLyogcmVhZCBvbmx5ICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICAgMHgwMDIwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU0hJRlQgICAgICAgICAgMHgwMDQwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICAgMHgwMDgwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICAgMHgwMTAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICAgMHgwMjAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICAgMHgwNDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSICAgMHgwODAwICAgIC8qIHdyaXRlIG9ubHksIGRlcHJlY2F0ZWQgKi8KKy8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuMzQgKi8KKyNkZWZpbmUgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIDB4MDgwMCAgLyogd3JpdGUgb25seSAqLworI2RlZmluZSBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9BRlRFUiAgMHgxMDAwICAvKiB3cml0ZSBvbmx5ICovCisvKiBBZGRlZCB0byBsaWJwbmctMS4yLjQxICovCisjZGVmaW5lIFBOR19UUkFOU0ZPUk1fR1JBWV9UT19SR0IgICAweDIwMDAgICAgICAvKiByZWFkIG9ubHkgKi8KKworLyogRmxhZ3MgZm9yIE1ORyBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KKyNkZWZpbmUgUE5HX0ZMQUdfTU5HX0VNUFRZX1BMVEUgICAgIDB4MDEKKyNkZWZpbmUgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCAgICAgIDB4MDQKKyNkZWZpbmUgUE5HX0FMTF9NTkdfRkVBVFVSRVMgICAgICAgIDB4MDUKKwordHlwZWRlZiBwbmdfdm9pZHAgKCpwbmdfbWFsbG9jX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCwgcG5nX3NpemVfdCkpOwordHlwZWRlZiB2b2lkICgqcG5nX2ZyZWVfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfdm9pZHApKTsKKworLyogVGhlIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBpbmZvcm1hdGlvbiB0byByZWFkIGFuZCB3cml0ZSBQTkcgZmlsZXMuCisgKiBUaGUgb25seSBwZW9wbGUgd2hvIG5lZWQgdG8gY2FyZSBhYm91dCB3aGF0IGlzIGluc2lkZSBvZiB0aGlzIGFyZSB0aGUKKyAqIHBlb3BsZSB3aG8gd2lsbCBiZSBtb2RpZnlpbmcgdGhlIGxpYnJhcnkgZm9yIHRoZWlyIG93biBzcGVjaWFsIG5lZWRzLgorICogSXQgc2hvdWxkIE5PVCBiZSBhY2Nlc3NlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbiwgZXhjZXB0IHRvIHN0b3JlCisgKiB0aGUgam1wX2J1Zi4KKyAqLworCitzdHJ1Y3QgcG5nX3N0cnVjdF9kZWYKK3sKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgam1wX2J1ZiBqbXBidWY7ICAgICAgICAgICAgLyogdXNlZCBpbiBwbmdfZXJyb3IgKi8KKyNlbmRpZgorICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiBQTkdfREVQU1RSVUNUOyAgICAvKiBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgZXJyb3JzIGFuZCBhYm9ydGluZyAqLworICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuIFBOR19ERVBTVFJVQ1Q7ICAvKiBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgd2FybmluZ3MgKi8KKyAgIHBuZ192b2lkcCBlcnJvcl9wdHIgUE5HX0RFUFNUUlVDVDsgICAgICAgLyogdXNlciBzdXBwbGllZCBzdHJ1Y3QgZm9yIGVycm9yIGZ1bmN0aW9ucyAqLworICAgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuIFBOR19ERVBTVFJVQ1Q7ICAvKiBmdW5jdGlvbiBmb3Igd3JpdGluZyBvdXRwdXQgZGF0YSAqLworICAgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4gUE5HX0RFUFNUUlVDVDsgICAvKiBmdW5jdGlvbiBmb3IgcmVhZGluZyBpbnB1dCBkYXRhICovCisgICBwbmdfdm9pZHAgaW9fcHRyIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIHB0ciB0byBhcHBsaWNhdGlvbiBzdHJ1Y3QgZm9yIEkvTyBmdW5jdGlvbnMgKi8KKworI2lmZGVmIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciByZWFkX3VzZXJfdHJhbnNmb3JtX2ZuIFBOR19ERVBTVFJVQ1Q7IC8qIHVzZXIgcmVhZCB0cmFuc2Zvcm0gKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciB3cml0ZV91c2VyX3RyYW5zZm9ybV9mbiBQTkdfREVQU1RSVUNUOyAvKiB1c2VyIHdyaXRlIHRyYW5zZm9ybSAqLworI2VuZGlmCisKKy8qIFRoZXNlIHdlcmUgYWRkZWQgaW4gbGlicG5nLTEuMC4yICovCisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKKyAgIHBuZ192b2lkcCB1c2VyX3RyYW5zZm9ybV9wdHIgUE5HX0RFUFNUUlVDVDsgLyogdXNlciBzdXBwbGllZCBzdHJ1Y3QgZm9yIHVzZXIgdHJhbnNmb3JtICovCisgICBwbmdfYnl0ZSB1c2VyX3RyYW5zZm9ybV9kZXB0aCBQTkdfREVQU1RSVUNUOyAgICAvKiBiaXQgZGVwdGggb2YgdXNlciB0cmFuc2Zvcm1lZCBwaXhlbHMgKi8KKyAgIHBuZ19ieXRlIHVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzIFBOR19ERVBTVFJVQ1Q7IC8qIGNoYW5uZWxzIGluIHVzZXIgdHJhbnNmb3JtZWQgcGl4ZWxzICovCisjZW5kaWYKKyNlbmRpZgorCisgICBwbmdfdWludF8zMiBtb2RlIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIHRlbGxzIHVzIHdoZXJlIHdlIGFyZSBpbiB0aGUgUE5HIGZpbGUgKi8KKyAgIHBuZ191aW50XzMyIGZsYWdzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogZmxhZ3MgaW5kaWNhdGluZyB2YXJpb3VzIHRoaW5ncyB0byBsaWJwbmcgKi8KKyAgIHBuZ191aW50XzMyIHRyYW5zZm9ybWF0aW9ucyBQTkdfREVQU1RSVUNUOyAvKiB3aGljaCB0cmFuc2Zvcm1hdGlvbnMgdG8gcGVyZm9ybSAqLworCisgICB6X3N0cmVhbSB6c3RyZWFtIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZGVjb21wcmVzc2lvbiBzdHJ1Y3R1cmUgKGJlbG93KSAqLworICAgcG5nX2J5dGVwIHpidWYgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgICAvKiBidWZmZXIgZm9yIHpsaWIgKi8KKyAgIHBuZ19zaXplX3QgemJ1Zl9zaXplIFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogc2l6ZSBvZiB6YnVmICovCisgICBpbnQgemxpYl9sZXZlbCBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgKi8KKyAgIGludCB6bGliX21ldGhvZCBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBtZXRob2QgKi8KKyAgIGludCB6bGliX3dpbmRvd19iaXRzIFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiB3aW5kb3cgYml0cyAqLworICAgaW50IHpsaWJfbWVtX2xldmVsIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIG1lbW9yeSBsZXZlbCAqLworICAgaW50IHpsaWJfc3RyYXRlZ3kgUE5HX0RFUFNUUlVDVDsgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIHN0cmF0ZWd5ICovCisKKyAgIHBuZ191aW50XzMyIHdpZHRoIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogd2lkdGggb2YgaW1hZ2UgaW4gcGl4ZWxzICovCisgICBwbmdfdWludF8zMiBoZWlnaHQgUE5HX0RFUFNUUlVDVDsgICAgICAgIC8qIGhlaWdodCBvZiBpbWFnZSBpbiBwaXhlbHMgKi8KKyAgIHBuZ191aW50XzMyIG51bV9yb3dzIFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogbnVtYmVyIG9mIHJvd3MgaW4gY3VycmVudCBwYXNzICovCisgICBwbmdfdWludF8zMiB1c3Jfd2lkdGggUE5HX0RFUFNUUlVDVDsgICAgIC8qIHdpZHRoIG9mIHJvdyBhdCBzdGFydCBvZiB3cml0ZSAqLworICAgcG5nX3VpbnRfMzIgcm93Ynl0ZXMgUE5HX0RFUFNUUlVDVDsgICAgICAvKiBzaXplIG9mIHJvdyBpbiBieXRlcyAqLworI2lmIDAgLyogUmVwbGFjZWQgd2l0aCB0aGUgZm9sbG93aW5nIGluIGxpYnBuZy0xLjIuNDMgKi8KKyAgIHBuZ19zaXplX3QgaXJvd2J5dGVzIFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKy8qIEFkZGVkIGluIGxpYnBuZy0xLjIuNDMgKi8KKyNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICAvKiBBZGRlZCBpbiBsaWJwbmctMS40LjA6IFRvdGFsIG51bWJlciBvZiBzUExULCB0ZXh0LCBhbmQgdW5rbm93bgorICAgICogY2h1bmtzIHRoYXQgY2FuIGJlIHN0b3JlZCAoMCBtZWFucyB1bmxpbWl0ZWQpLgorICAgICovCisgICBwbmdfdWludF8zMiB1c2VyX2NodW5rX2NhY2hlX21heCBQTkdfREVQU1RSVUNUOworI2VuZGlmCisgICBwbmdfdWludF8zMiBpd2lkdGggUE5HX0RFUFNUUlVDVDsgICAgICAgIC8qIHdpZHRoIG9mIGN1cnJlbnQgaW50ZXJsYWNlZCByb3cgaW4gcGl4ZWxzICovCisgICBwbmdfdWludF8zMiByb3dfbnVtYmVyIFBOR19ERVBTVFJVQ1Q7ICAgIC8qIGN1cnJlbnQgcm93IGluIGludGVybGFjZSBwYXNzICovCisgICBwbmdfYnl0ZXAgcHJldl9yb3cgUE5HX0RFUFNUUlVDVDsgICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlIHByZXZpb3VzICh1bmZpbHRlcmVkKSByb3cgKi8KKyAgIHBuZ19ieXRlcCByb3dfYnVmIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgY3VycmVudCAodW5maWx0ZXJlZCkgcm93ICovCisjaWZuZGVmIFBOR19OT19XUklURV9GSUxURVIKKyAgIHBuZ19ieXRlcCBzdWJfcm93IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgInN1YiIgcm93IHdoZW4gZmlsdGVyaW5nICovCisgICBwbmdfYnl0ZXAgdXBfcm93IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlICJ1cCIgcm93IHdoZW4gZmlsdGVyaW5nICovCisgICBwbmdfYnl0ZXAgYXZnX3JvdyBQTkdfREVQU1RSVUNUOyAgICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlICJhdmciIHJvdyB3aGVuIGZpbHRlcmluZyAqLworICAgcG5nX2J5dGVwIHBhZXRoX3JvdyBQTkdfREVQU1RSVUNUOyAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAiUGFldGgiIHJvdyB3aGVuIGZpbHRlcmluZyAqLworI2VuZGlmCisgICBwbmdfcm93X2luZm8gcm93X2luZm8gUE5HX0RFUFNUUlVDVDsgICAgIC8qIHVzZWQgZm9yIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzICovCisKKyAgIHBuZ191aW50XzMyIGlkYXRfc2l6ZSBQTkdfREVQU1RSVUNUOyAgICAgLyogY3VycmVudCBJREFUIHNpemUgZm9yIHJlYWQgKi8KKyAgIHBuZ191aW50XzMyIGNyYyBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgLyogY3VycmVudCBjaHVuayBDUkMgdmFsdWUgKi8KKyAgIHBuZ19jb2xvcnAgcGFsZXR0ZSBQTkdfREVQU1RSVUNUOyAgICAgICAgLyogcGFsZXR0ZSBmcm9tIHRoZSBpbnB1dCBmaWxlICovCisgICBwbmdfdWludF8xNiBudW1fcGFsZXR0ZSBQTkdfREVQU1RSVUNUOyAgIC8qIG51bWJlciBvZiBjb2xvciBlbnRyaWVzIGluIHBhbGV0dGUgKi8KKyAgIHBuZ191aW50XzE2IG51bV90cmFucyBQTkdfREVQU1RSVUNUOyAgICAgLyogbnVtYmVyIG9mIHRyYW5zcGFyZW5jeSB2YWx1ZXMgKi8KKyAgIHBuZ19ieXRlIGNodW5rX25hbWVbNV0gUE5HX0RFUFNUUlVDVDsgICAgLyogbnVsbC10ZXJtaW5hdGVkIG5hbWUgb2YgY3VycmVudCBjaHVuayAqLworICAgcG5nX2J5dGUgY29tcHJlc3Npb24gUE5HX0RFUFNUUlVDVDsgICAgICAvKiBmaWxlIGNvbXByZXNzaW9uIHR5cGUgKGFsd2F5cyAwKSAqLworICAgcG5nX2J5dGUgZmlsdGVyIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAvKiBmaWxlIGZpbHRlciB0eXBlIChhbHdheXMgMCkgKi8KKyAgIHBuZ19ieXRlIGludGVybGFjZWQgUE5HX0RFUFNUUlVDVDsgICAgICAgLyogUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfSU5URVJMQUNFX0FEQU03ICovCisgICBwbmdfYnl0ZSBwYXNzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAgIC8qIGN1cnJlbnQgaW50ZXJsYWNlIHBhc3MgKDAgLSA2KSAqLworICAgcG5nX2J5dGUgZG9fZmlsdGVyIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiByb3cgZmlsdGVyIGZsYWdzIChzZWUgUE5HX0ZJTFRFUl8gYmVsb3cgKSAqLworICAgcG5nX2J5dGUgY29sb3JfdHlwZSBQTkdfREVQU1RSVUNUOyAgICAgICAvKiBjb2xvciB0eXBlIG9mIGZpbGUgKi8KKyAgIHBuZ19ieXRlIGJpdF9kZXB0aCBQTkdfREVQU1RSVUNUOyAgICAgICAgLyogYml0IGRlcHRoIG9mIGZpbGUgKi8KKyAgIHBuZ19ieXRlIHVzcl9iaXRfZGVwdGggUE5HX0RFUFNUUlVDVDsgICAgLyogYml0IGRlcHRoIG9mIHVzZXJzIHJvdyAqLworICAgcG5nX2J5dGUgcGl4ZWxfZGVwdGggUE5HX0RFUFNUUlVDVDsgICAgICAvKiBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgKi8KKyAgIHBuZ19ieXRlIGNoYW5uZWxzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIGluIGZpbGUgKi8KKyAgIHBuZ19ieXRlIHVzcl9jaGFubmVscyBQTkdfREVQU1RSVUNUOyAgICAgLyogY2hhbm5lbHMgYXQgc3RhcnQgb2Ygd3JpdGUgKi8KKyAgIHBuZ19ieXRlIHNpZ19ieXRlcyBQTkdfREVQU1RSVUNUOyAgICAgICAgLyogbWFnaWMgYnl0ZXMgcmVhZC93cml0dGVuIGZyb20gc3RhcnQgb2YgZmlsZSAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKQorI2lmZGVmIFBOR19MRUdBQ1lfU1VQUE9SVEVECisgICBwbmdfYnl0ZSBmaWxsZXIgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgIC8qIGZpbGxlciBieXRlIGZvciBwaXhlbCBleHBhbnNpb24gKi8KKyNlbHNlCisgICBwbmdfdWludF8xNiBmaWxsZXIgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgIC8qIGZpbGxlciBieXRlcyBmb3IgcGl4ZWwgZXhwYW5zaW9uICovCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX2JLR0RfU1VQUE9SVEVECisgICBwbmdfYnl0ZSBiYWNrZ3JvdW5kX2dhbW1hX3R5cGUgUE5HX0RFUFNUUlVDVDsKKyMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIGZsb2F0IGJhY2tncm91bmRfZ2FtbWEgUE5HX0RFUFNUUlVDVDsKKyMgIGVuZGlmCisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZCBQTkdfREVQU1RSVUNUOyAgIC8qIGJhY2tncm91bmQgY29sb3IgaW4gc2NyZWVuIGdhbW1hIHNwYWNlICovCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZF8xIFBOR19ERVBTVFJVQ1Q7IC8qIGJhY2tncm91bmQgbm9ybWFsaXplZCB0byBnYW1tYSAxLjAgKi8KKyNlbmRpZgorI2VuZGlmIC8qIFBOR19iS0dEX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorICAgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm4gUE5HX0RFUFNUUlVDVDsgLyogRnVuY3Rpb24gZm9yIGZsdXNoaW5nIG91dHB1dCAqLworICAgcG5nX3VpbnRfMzIgZmx1c2hfZGlzdCBQTkdfREVQU1RSVUNUOyAgICAvKiBob3cgbWFueSByb3dzIGFwYXJ0IHRvIGZsdXNoLCAwIC0gbm8gZmx1c2ggKi8KKyAgIHBuZ191aW50XzMyIGZsdXNoX3Jvd3MgUE5HX0RFUFNUUlVDVDsgICAgLyogbnVtYmVyIG9mIHJvd3Mgd3JpdHRlbiBzaW5jZSBsYXN0IGZsdXNoICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQorICAgaW50IGdhbW1hX3NoaWZ0IFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogbnVtYmVyIG9mICJpbnNpZ25pZmljYW50IiBiaXRzIDE2LWJpdCBnYW1tYSAqLworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIGZsb2F0IGdhbW1hIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIGZpbGUgZ2FtbWEgdmFsdWUgKi8KKyAgIGZsb2F0IHNjcmVlbl9nYW1tYSBQTkdfREVQU1RSVUNUOyAgIC8qIHNjcmVlbiBnYW1tYSB2YWx1ZSAoZGlzcGxheV9leHBvbmVudCkgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKKyAgIHBuZ19ieXRlcCBnYW1tYV90YWJsZSBQTkdfREVQU1RSVUNUOyAgICAgLyogZ2FtbWEgdGFibGUgZm9yIDgtYml0IGRlcHRoIGZpbGVzICovCisgICBwbmdfYnl0ZXAgZ2FtbWFfZnJvbV8xIFBOR19ERVBTVFJVQ1Q7ICAgIC8qIGNvbnZlcnRzIGZyb20gMS4wIHRvIHNjcmVlbiAqLworICAgcG5nX2J5dGVwIGdhbW1hX3RvXzEgUE5HX0RFUFNUUlVDVDsgICAgICAvKiBjb252ZXJ0cyBmcm9tIGZpbGUgdG8gMS4wICovCisgICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X3RhYmxlIFBOR19ERVBTVFJVQ1Q7IC8qIGdhbW1hIHRhYmxlIGZvciAxNi1iaXQgZGVwdGggZmlsZXMgKi8KKyAgIHBuZ191aW50XzE2cHAgZ2FtbWFfMTZfZnJvbV8xIFBOR19ERVBTVFJVQ1Q7IC8qIGNvbnZlcnRzIGZyb20gMS4wIHRvIHNjcmVlbiAqLworICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90b18xIFBOR19ERVBTVFJVQ1Q7IC8qIGNvbnZlcnRzIGZyb20gZmlsZSB0byAxLjAgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3NCSVRfU1VQUE9SVEVEKQorICAgcG5nX2NvbG9yXzggc2lnX2JpdCBQTkdfREVQU1RSVUNUOyAgICAgICAvKiBzaWduaWZpY2FudCBiaXRzIGluIGVhY2ggYXZhaWxhYmxlIGNoYW5uZWwgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCkKKyAgIHBuZ19jb2xvcl84IHNoaWZ0IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgLyogc2hpZnQgZm9yIHNpZ25pZmljYW50IGJpdCB0cmFuZm9ybWF0aW9uICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX3RSTlNfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSBcCisgfHwgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQorICAgcG5nX2J5dGVwIHRyYW5zIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAvKiB0cmFuc3BhcmVuY3kgdmFsdWVzIGZvciBwYWxldHRlZCBmaWxlcyAqLworICAgcG5nX2NvbG9yXzE2IHRyYW5zX3ZhbHVlcyBQTkdfREVQU1RSVUNUOyAvKiB0cmFuc3BhcmVuY3kgdmFsdWVzIGZvciBub24tcGFsZXR0ZWQgZmlsZXMgKi8KKyNlbmRpZgorCisgICBwbmdfcmVhZF9zdGF0dXNfcHRyIHJlYWRfcm93X2ZuIFBOR19ERVBTVFJVQ1Q7ICAgLyogY2FsbGVkIGFmdGVyIGVhY2ggcm93IGlzIGRlY29kZWQgKi8KKyAgIHBuZ193cml0ZV9zdGF0dXNfcHRyIHdyaXRlX3Jvd19mbiBQTkdfREVQU1RSVUNUOyAvKiBjYWxsZWQgYWZ0ZXIgZWFjaCByb3cgaXMgZW5jb2RlZCAqLworI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAorICAgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIGluZm9fZm4gUE5HX0RFUFNUUlVDVDsgLyogY2FsbGVkIGFmdGVyIGhlYWRlciBkYXRhIGZ1bGx5IHJlYWQgKi8KKyAgIHBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyIHJvd19mbiBQTkdfREVQU1RSVUNUOyAgIC8qIGNhbGxlZCBhZnRlciBlYWNoIHByb2cuIHJvdyBpcyBkZWNvZGVkICovCisgICBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBlbmRfZm4gUE5HX0RFUFNUUlVDVDsgICAvKiBjYWxsZWQgYWZ0ZXIgaW1hZ2UgaXMgY29tcGxldGUgKi8KKyAgIHBuZ19ieXRlcCBzYXZlX2J1ZmZlcl9wdHIgUE5HX0RFUFNUUlVDVDsgICAgICAgIC8qIGN1cnJlbnQgbG9jYXRpb24gaW4gc2F2ZV9idWZmZXIgKi8KKyAgIHBuZ19ieXRlcCBzYXZlX2J1ZmZlciBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcHJldmlvdXNseSByZWFkIGRhdGEgKi8KKyAgIHBuZ19ieXRlcCBjdXJyZW50X2J1ZmZlcl9wdHIgUE5HX0RFUFNUUlVDVDsgICAgIC8qIGN1cnJlbnQgbG9jYXRpb24gaW4gY3VycmVudF9idWZmZXIgKi8KKyAgIHBuZ19ieXRlcCBjdXJyZW50X2J1ZmZlciBQTkdfREVQU1RSVUNUOyAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcmVjZW50bHkgdXNlZCBkYXRhICovCisgICBwbmdfdWludF8zMiBwdXNoX2xlbmd0aCBQTkdfREVQU1RSVUNUOyAgICAgICAgICAvKiBzaXplIG9mIGN1cnJlbnQgaW5wdXQgY2h1bmsgKi8KKyAgIHBuZ191aW50XzMyIHNraXBfbGVuZ3RoIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgIC8qIGJ5dGVzIHRvIHNraXAgaW4gaW5wdXQgZGF0YSAqLworICAgcG5nX3NpemVfdCBzYXZlX2J1ZmZlcl9zaXplIFBOR19ERVBTVFJVQ1Q7ICAgICAgLyogYW1vdW50IG9mIGRhdGEgbm93IGluIHNhdmVfYnVmZmVyICovCisgICBwbmdfc2l6ZV90IHNhdmVfYnVmZmVyX21heCBQTkdfREVQU1RSVUNUOyAgICAgICAvKiB0b3RhbCBzaXplIG9mIHNhdmVfYnVmZmVyICovCisgICBwbmdfc2l6ZV90IGJ1ZmZlcl9zaXplIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAvKiB0b3RhbCBhbW91bnQgb2YgYXZhaWxhYmxlIGlucHV0IGRhdGEgKi8KKyAgIHBuZ19zaXplX3QgY3VycmVudF9idWZmZXJfc2l6ZSBQTkdfREVQU1RSVUNUOyAgIC8qIGFtb3VudCBvZiBkYXRhIG5vdyBpbiBjdXJyZW50X2J1ZmZlciAqLworICAgaW50IHByb2Nlc3NfbW9kZSBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgICAgICAgLyogd2hhdCBwdXNoIGxpYnJhcnkgaXMgY3VycmVudGx5IGRvaW5nICovCisgICBpbnQgY3VyX3BhbGV0dGUgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHB1c2ggbGlicmFyeSBwYWxldHRlIGluZGV4ICovCisKKyMgIGlmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorICAgICBwbmdfc2l6ZV90IGN1cnJlbnRfdGV4dF9zaXplIFBOR19ERVBTVFJVQ1Q7ICAgLyogY3VycmVudCBzaXplIG9mIHRleHQgaW5wdXQgZGF0YSAqLworICAgICBwbmdfc2l6ZV90IGN1cnJlbnRfdGV4dF9sZWZ0IFBOR19ERVBTVFJVQ1Q7ICAgLyogaG93IG11Y2ggdGV4dCBsZWZ0IHRvIHJlYWQgaW4gaW5wdXQgKi8KKyAgICAgcG5nX2NoYXJwIGN1cnJlbnRfdGV4dCBQTkdfREVQU1RSVUNUOyAgICAgICAgIC8qIGN1cnJlbnQgdGV4dCBjaHVuayBidWZmZXIgKi8KKyAgICAgcG5nX2NoYXJwIGN1cnJlbnRfdGV4dF9wdHIgUE5HX0RFUFNUUlVDVDsgICAgIC8qIGN1cnJlbnQgbG9jYXRpb24gaW4gY3VycmVudF90ZXh0ICovCisjICBlbmRpZiAvKiBQTkdfVEVYVF9TVVBQT1JURUQgKi8KKyNlbmRpZiAvKiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQgKi8KKworI2lmIGRlZmluZWQoX19UVVJCT0NfXykgJiYgIWRlZmluZWQoX1dpbmRvd3MpICYmICFkZWZpbmVkKF9fRkxBVF9fKQorLyogZm9yIHRoZSBCb3JsYW5kIHNwZWNpYWwgNjRLIHNlZ21lbnQgaGFuZGxlciAqLworICAgcG5nX2J5dGVwcCBvZmZzZXRfdGFibGVfcHRyIFBOR19ERVBTVFJVQ1Q7CisgICBwbmdfYnl0ZXAgb2Zmc2V0X3RhYmxlIFBOR19ERVBTVFJVQ1Q7CisgICBwbmdfdWludF8xNiBvZmZzZXRfdGFibGVfbnVtYmVyIFBOR19ERVBTVFJVQ1Q7CisgICBwbmdfdWludF8xNiBvZmZzZXRfdGFibGVfY291bnQgUE5HX0RFUFNUUlVDVDsKKyAgIHBuZ191aW50XzE2IG9mZnNldF90YWJsZV9jb3VudF9mcmVlIFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQKKyAgIHBuZ19ieXRlcCBwYWxldHRlX2xvb2t1cCBQTkdfREVQU1RSVUNUOyAgICAgICAgIC8qIGxvb2t1cCB0YWJsZSBmb3IgZGl0aGVyaW5nICovCisgICBwbmdfYnl0ZXAgZGl0aGVyX2luZGV4IFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAvKiBpbmRleCB0cmFuc2xhdGlvbiBmb3IgcGFsZXR0ZSBmaWxlcyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX2hJU1RfU1VQUE9SVEVEKQorICAgcG5nX3VpbnRfMTZwIGhpc3QgUE5HX0RFUFNUUlVDVDsgICAgICAgICAgICAgICAgLyogaGlzdG9ncmFtICovCisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECisgICBwbmdfYnl0ZSBoZXVyaXN0aWNfbWV0aG9kIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiBoZXVyaXN0aWMgZm9yIHJvdyBmaWx0ZXIgc2VsZWN0aW9uICovCisgICBwbmdfYnl0ZSBudW1fcHJldl9maWx0ZXJzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiBudW1iZXIgb2Ygd2VpZ2h0cyBmb3IgcHJldmlvdXMgcm93cyAqLworICAgcG5nX2J5dGVwIHByZXZfZmlsdGVycyBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgLyogZmlsdGVyIHR5cGUocykgb2YgcHJldmlvdXMgcm93KHMpICovCisgICBwbmdfdWludF8xNnAgZmlsdGVyX3dlaWdodHMgUE5HX0RFUFNUUlVDVDsgICAgICAvKiB3ZWlnaHQocykgZm9yIHByZXZpb3VzIGxpbmUocykgKi8KKyAgIHBuZ191aW50XzE2cCBpbnZfZmlsdGVyX3dlaWdodHMgUE5HX0RFUFNUUlVDVDsgIC8qIDEvd2VpZ2h0KHMpIGZvciBwcmV2aW91cyBsaW5lKHMpICovCisgICBwbmdfdWludF8xNnAgZmlsdGVyX2Nvc3RzIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAvKiByZWxhdGl2ZSBmaWx0ZXIgY2FsY3VsYXRpb24gY29zdCAqLworICAgcG5nX3VpbnRfMTZwIGludl9maWx0ZXJfY29zdHMgUE5HX0RFUFNUUlVDVDsgICAgLyogMS9yZWxhdGl2ZSBmaWx0ZXIgY2FsY3VsYXRpb24gY29zdCAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAorICAgcG5nX2NoYXJwIHRpbWVfYnVmZmVyIFBOR19ERVBTVFJVQ1Q7ICAgICAgICAgICAgLyogU3RyaW5nIHRvIGhvbGQgUkZDIDExMjMgdGltZSB0ZXh0ICovCisjZW5kaWYKKworLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC42ICovCisKKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgIHBuZ191aW50XzMyIGZyZWVfbWUgUE5HX0RFUFNUUlVDVDsgICAvKiBmbGFncyBpdGVtcyBsaWJwbmcgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgKi8KKyNlbmRpZgorCisjaWZkZWYgUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAorICAgcG5nX3ZvaWRwIHVzZXJfY2h1bmtfcHRyIFBOR19ERVBTVFJVQ1Q7CisgICBwbmdfdXNlcl9jaHVua19wdHIgcmVhZF91c2VyX2NodW5rX2ZuIFBOR19ERVBTVFJVQ1Q7IC8qIHVzZXIgcmVhZCBjaHVuayBoYW5kbGVyICovCisjZW5kaWYKKworI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKKyAgIGludCBudW1fY2h1bmtfbGlzdCBQTkdfREVQU1RSVUNUOworICAgcG5nX2J5dGVwIGNodW5rX2xpc3QgUE5HX0RFUFNUUlVDVDsKKyNlbmRpZgorCisvKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4wLjMgKi8KKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKKyAgIHBuZ19ieXRlIHJnYl90b19ncmF5X3N0YXR1cyBQTkdfREVQU1RSVUNUOworICAgLyogVGhlc2Ugd2VyZSBjaGFuZ2VkIGZyb20gcG5nX2J5dGUgaW4gbGlicG5nLTEuMC42ICovCisgICBwbmdfdWludF8xNiByZ2JfdG9fZ3JheV9yZWRfY29lZmYgUE5HX0RFUFNUUlVDVDsKKyAgIHBuZ191aW50XzE2IHJnYl90b19ncmF5X2dyZWVuX2NvZWZmIFBOR19ERVBTVFJVQ1Q7CisgICBwbmdfdWludF8xNiByZ2JfdG9fZ3JheV9ibHVlX2NvZWZmIFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKworLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjQgKHJlbmFtZWQgaW4gMS4wLjkpICovCisjaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1JFQURfRU1QVFlfUExURV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9FTVBUWV9QTFRFX1NVUFBPUlRFRCkKKy8qIENoYW5nZWQgZnJvbSBwbmdfYnl0ZSB0byBwbmdfdWludF8zMiBhdCB2ZXJzaW9uIDEuMi4wICovCisjaWZkZWYgUE5HXzFfMF9YCisgICBwbmdfYnl0ZSBtbmdfZmVhdHVyZXNfcGVybWl0dGVkIFBOR19ERVBTVFJVQ1Q7CisjZWxzZQorICAgcG5nX3VpbnRfMzIgbW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCBQTkdfREVQU1RSVUNUOworI2VuZGlmIC8qIFBOR18xXzBfWCAqLworI2VuZGlmCisKKy8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC43ICovCisjaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCisgICBwbmdfZml4ZWRfcG9pbnQgaW50X2dhbW1hIFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKworLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjksIGlmZGVmJ2VkIG91dCBpbiAxLjAuMTIsIGVuYWJsZWQgaW4gMS4yLjAgKi8KKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorICAgcG5nX2J5dGUgZmlsdGVyX3R5cGUgUE5HX0RFUFNUUlVDVDsKKyNlbmRpZgorCisjaWZkZWYgUE5HXzFfMF9YCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjAuMTAsIGlmZGVmJ2VkIG91dCBpbiAxLjIuMCAqLworICAgcG5nX3VpbnRfMzIgcm93X2J1Zl9zaXplIFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKworLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMi4wICovCisjaWZkZWYgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRAorIyAgaWZuZGVmIFBOR18xXzBfWAorIyAgICBpZmRlZiBQTkdfTU1YX0NPREVfU1VQUE9SVEVECisgICBwbmdfYnl0ZSAgICAgbW14X2JpdGRlcHRoX3RocmVzaG9sZCBQTkdfREVQU1RSVUNUOworICAgcG5nX3VpbnRfMzIgIG1teF9yb3dieXRlc190aHJlc2hvbGQgUE5HX0RFUFNUUlVDVDsKKyMgICAgZW5kaWYKKyAgIHBuZ191aW50XzMyICBhc21fZmxhZ3MgUE5HX0RFUFNUUlVDVDsKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC4yIGJ1dCBmaXJzdCBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gMS4yLjAgKi8KKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBwbmdfdm9pZHAgbWVtX3B0ciBQTkdfREVQU1RSVUNUOyAgICAgICAgICAgIC8qIHVzZXIgc3VwcGxpZWQgc3RydWN0IGZvciBtZW0gZnVuY3Rpb25zICovCisgICBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4gUE5HX0RFUFNUUlVDVDsgICAgIC8qIGZ1bmN0aW9uIGZvciBhbGxvY2F0aW5nIG1lbW9yeSAqLworICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm4gUE5HX0RFUFNUUlVDVDsgICAgICAgICAvKiBmdW5jdGlvbiBmb3IgZnJlZWluZyBtZW1vcnkgKi8KKyNlbmRpZgorCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjAuMTMgYW5kIDEuMi4wICovCisgICBwbmdfYnl0ZXAgYmlnX3Jvd19idWYgUE5HX0RFUFNUUlVDVDsgICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlIGN1cnJlbnQgKHVuZmlsdGVyZWQpIHJvdyAqLworCisjaWZkZWYgUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRAorLyogVGhlIGZvbGxvd2luZyB0aHJlZSBtZW1iZXJzIHdlcmUgYWRkZWQgYXQgdmVyc2lvbiAxLjAuMTQgYW5kIDEuMi40ICovCisgICBwbmdfYnl0ZXAgZGl0aGVyX3NvcnQgUE5HX0RFUFNUUlVDVDsgICAgICAgIC8qIHdvcmtpbmcgc29ydCBhcnJheSAqLworICAgcG5nX2J5dGVwIGluZGV4X3RvX3BhbGV0dGUgUE5HX0RFUFNUUlVDVDsgICAvKiB3aGVyZSB0aGUgb3JpZ2luYWwgaW5kZXggY3VycmVudGx5IGlzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiB0aGUgcGFsZXR0ZSAqLworICAgcG5nX2J5dGVwIHBhbGV0dGVfdG9faW5kZXggUE5HX0RFUFNUUlVDVDsgICAvKiB3aGljaCBvcmlnaW5hbCBpbmRleCBwb2ludHMgdG8gdGhpcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFsZXR0ZSBjb2xvciAqLworI2VuZGlmCisKKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMTYgYW5kIDEuMi42ICovCisgICBwbmdfYnl0ZSBjb21wcmVzc2lvbl90eXBlIFBOR19ERVBTVFJVQ1Q7CisKKyNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICBwbmdfdWludF8zMiB1c2VyX3dpZHRoX21heCBQTkdfREVQU1RSVUNUOworICAgcG5nX3VpbnRfMzIgdXNlcl9oZWlnaHRfbWF4IFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKworLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjI1IGFuZCAxLjIuMTcgKi8KKyNpZmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICAvKiBTdG9yYWdlIGZvciB1bmtub3duIGNodW5rIHRoYXQgdGhlIGxpYnJhcnkgZG9lc24ndCByZWNvZ25pemUuICovCisgICBwbmdfdW5rbm93bl9jaHVuayB1bmtub3duX2NodW5rIFBOR19ERVBTVFJVQ1Q7CisjZW5kaWYKKworLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMi4yNiAqLworICBwbmdfdWludF8zMiBvbGRfYmlnX3Jvd19idWZfc2l6ZSBQTkdfREVQU1RSVUNUOworICBwbmdfdWludF8zMiBvbGRfcHJldl9yb3dfc2l6ZSBQTkdfREVQU1RSVUNUOworCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjIuMzAgKi8KKyAgcG5nX2NoYXJwIGNodW5rZGF0YSBQTkdfREVQU1RSVUNUOyAgLyogYnVmZmVyIGZvciByZWFkaW5nIGNodW5rIGRhdGEgKi8KKworCit9OworCisKKy8qIFRoaXMgdHJpZ2dlcnMgYSBjb21waWxlciBlcnJvciBpbiBwbmcuYywgaWYgcG5nLmMgYW5kIHBuZy5oCisgKiBkbyBub3QgYWdyZWUgdXBvbiB0aGUgdmVyc2lvbiBudW1iZXIuCisgKi8KK3R5cGVkZWYgcG5nX3N0cnVjdHAgdmVyc2lvbl8xXzJfNDQ7CisKK3R5cGVkZWYgcG5nX3N0cnVjdCBGQVIgKiBGQVIgKiBwbmdfc3RydWN0cHA7CisKKy8qIEhlcmUgYXJlIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBtb3N0IGNvbW1vbmx5IHVzZWQuICBUaGlzIGlzIG5vdAorICogdGhlIHBsYWNlIHRvIGZpbmQgb3V0IGhvdyB0byB1c2UgbGlicG5nLiAgU2VlIGxpYnBuZy50eHQgZm9yIHRoZQorICogZnVsbCBleHBsYW5hdGlvbiwgc2VlIGV4YW1wbGUuYyBmb3IgdGhlIHN1bW1hcnkuICBUaGlzIGp1c3QgcHJvdmlkZXMKKyAqIGEgc2ltcGxlIG9uZSBsaW5lIGRlc2NyaXB0aW9uIG9mIHRoZSB1c2Ugb2YgZWFjaCBmdW5jdGlvbi4KKyAqLworCisvKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicmFyeSAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcikgUE5HQVJHKCh2b2lkKSk7CisKKy8qIFRlbGwgbGliIHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBmaXJzdCA8bnVtX2J5dGVzPiBtYWdpYyBieXRlcy4KKyAqIEhhbmRsaW5nIG1vcmUgdGhhbiA4IGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBpcyBhbiBlcnJvci4KKyAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3NpZ19ieXRlcykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgaW50IG51bV9ieXRlcykpOworCisvKiBDaGVjayBzaWdbc3RhcnRdIHRocm91Z2ggc2lnW3N0YXJ0ICsgbnVtX3RvX2NoZWNrIC0gMV0gdG8gc2VlIGlmIGl0J3MgYQorICogUE5HIGZpbGUuICBSZXR1cm5zIHplcm8gaWYgdGhlIHN1cHBsaWVkIGJ5dGVzIG1hdGNoIHRoZSA4LWJ5dGUgUE5HCisgKiBzaWduYXR1cmUsIGFuZCBub24temVybyBvdGhlcndpc2UuICBIYXZpbmcgbnVtX3RvX2NoZWNrID09IDAgb3IKKyAqIHN0YXJ0ID4gNyB3aWxsIGFsd2F5cyBmYWlsIChpZSByZXR1cm4gbm9uLXplcm8pLgorICovCitleHRlcm4gUE5HX0VYUE9SVChpbnQscG5nX3NpZ19jbXApIFBOR0FSRygocG5nX2J5dGVwIHNpZywgcG5nX3NpemVfdCBzdGFydCwKKyAgIHBuZ19zaXplX3QgbnVtX3RvX2NoZWNrKSk7CisKKy8qIFNpbXBsZSBzaWduYXR1cmUgY2hlY2tpbmcgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKKyAqIHBuZ19jaGVja19zaWcoc2lnLCBuKSA6PSAhcG5nX3NpZ19jbXAoc2lnLCAwLCBuKS4KKyAqLworZXh0ZXJuIFBOR19FWFBPUlQoaW50LHBuZ19jaGVja19zaWcpIFBOR0FSRygocG5nX2J5dGVwIHNpZywgaW50IG51bSkpIFBOR19ERVBSRUNBVEVEOworCisvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwbmdfcHRyIHN0cnVjdCBmb3IgcmVhZGluZywgYW5kIGFueSBvdGhlciBtZW1vcnkuICovCitleHRlcm4gUE5HX0VYUE9SVChwbmdfc3RydWN0cCxwbmdfY3JlYXRlX3JlYWRfc3RydWN0KQorICAgUE5HQVJHKChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAorICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKSkgUE5HX0FMTE9DQVRFRDsKKworLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3QgZm9yIHdyaXRpbmcsIGFuZCBhbnkgb3RoZXIgbWVtb3J5ICovCitleHRlcm4gUE5HX0VYUE9SVChwbmdfc3RydWN0cCxwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCkKKyAgIFBOR0FSRygocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwKKyAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2Fybl9mbikpIFBOR19BTExPQ0FURUQ7CisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKQorICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSkKKyAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2l6ZSkpOworI2VuZGlmCisKKy8qIFJlc2V0IHRoZSBjb21wcmVzc2lvbiBzdHJlYW0gKi8KK2V4dGVybiBQTkdfRVhQT1JUKGludCxwbmdfcmVzZXRfenN0cmVhbSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisKKy8qIE5ldyBmdW5jdGlvbnMgYWRkZWQgaW4gbGlicG5nLTEuMC4yIChub3QgZW5hYmxlZCBieSBkZWZhdWx0IHVudGlsIDEuMi4wKSAqLworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19zdHJ1Y3RwLHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMikKKyAgIFBOR0FSRygocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwKKyAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIsCisgICBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4sIHBuZ19mcmVlX3B0ciBmcmVlX2ZuKSkgUE5HX0FMTE9DQVRFRDsKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19zdHJ1Y3RwLHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIpCisgICBQTkdBUkcoKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCisgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sIHBuZ192b2lkcCBtZW1fcHRyLAorICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbikpIFBOR19BTExPQ0FURUQ7CisjZW5kaWYKKworLyogV3JpdGUgYSBQTkcgY2h1bmsgLSBzaXplLCB0eXBlLCAob3B0aW9uYWwpIGRhdGEsIENSQy4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2NodW5rKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfYnl0ZXAgY2h1bmtfbmFtZSwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKSk7CisKKy8qIFdyaXRlIHRoZSBzdGFydCBvZiBhIFBORyBjaHVuayAtIGxlbmd0aCBhbmQgY2h1bmsgbmFtZS4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2NodW5rX3N0YXJ0KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfYnl0ZXAgY2h1bmtfbmFtZSwgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7CisKKy8qIFdyaXRlIHRoZSBkYXRhIG9mIGEgUE5HIGNodW5rIHN0YXJ0ZWQgd2l0aCBwbmdfd3JpdGVfY2h1bmtfc3RhcnQoKS4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2NodW5rX2RhdGEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkpOworCisvKiBGaW5pc2ggYSBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkgKGluY2x1ZGVzIENSQykuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9jaHVua19lbmQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworCisvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19pbmZvcCxwbmdfY3JlYXRlX2luZm9fc3RydWN0KQorICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX0FMTE9DQVRFRDsKKworI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkIChQTkdfMV8yX1gpCisvKiBJbml0aWFsaXplIHRoZSBpbmZvIHN0cnVjdHVyZSAob2xkIGludGVyZmFjZSAtIERFUFJFQ0FURUQpICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19pbmZvX2luaXQpIFBOR0FSRygocG5nX2luZm9wIGluZm9fcHRyKSkKKyAgICBQTkdfREVQUkVDQVRFRDsKKyN1bmRlZiBwbmdfaW5mb19pbml0CisjZGVmaW5lIHBuZ19pbmZvX2luaXQoaW5mb19wdHIpIHBuZ19pbmZvX2luaXRfMygmaW5mb19wdHIsXAorICAgIHBuZ19zaXplb2YocG5nX2luZm8pKTsKKyNlbmRpZgorCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19pbmZvX2luaXRfMykgUE5HQVJHKChwbmdfaW5mb3BwIGluZm9fcHRyLAorICAgIHBuZ19zaXplX3QgcG5nX2luZm9fc3RydWN0X3NpemUpKTsKKworLyogV3JpdGVzIGFsbCB0aGUgUE5HIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgaW1hZ2UuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2luZm8pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOworCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIFJlYWQgdGhlIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX2luZm8pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQocG5nX2NoYXJwLHBuZ19jb252ZXJ0X3RvX3JmYzExMjMpCisgICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ190aW1lcCBwdGltZSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRAorLyogQ29udmVydCBmcm9tIGEgc3RydWN0IHRtIHRvIHBuZ190aW1lICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKSBQTkdBUkcoKHBuZ190aW1lcCBwdGltZSwKKyAgIHN0cnVjdCB0bSBGQVIgKiB0dGltZSkpOworCisvKiBDb252ZXJ0IGZyb20gdGltZV90IHRvIHBuZ190aW1lLiAgVXNlcyBnbXRpbWUoKSAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfY29udmVydF9mcm9tX3RpbWVfdCkgUE5HQVJHKChwbmdfdGltZXAgcHRpbWUsCisgICB0aW1lX3QgdHRpbWUpKTsKKyNlbmRpZiAvKiBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAorLyogRXhwYW5kIGRhdGEgdG8gMjQtYml0IFJHQiwgb3IgOC1iaXQgZ3JheXNjYWxlLCB3aXRoIGFscGhhIGlmIGF2YWlsYWJsZS4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9leHBhbmQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworI2lmbmRlZiBQTkdfMV8wX1gKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCisgIHBuZ19wdHIpKTsKKyNlbmRpZgorZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF90Uk5TX3RvX2FscGhhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZCAoUE5HXzFfMl9YKQorLyogRGVwcmVjYXRlZCAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCkgUE5HQVJHKChwbmdfc3RydWN0cAorICAgIHBuZ19wdHIpKSBQTkdfREVQUkVDQVRFRDsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpCisvKiBVc2UgYmx1ZSwgZ3JlZW4sIHJlZCBvcmRlciBmb3IgcGl4ZWxzLiAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2JncikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorLyogRXhwYW5kIHRoZSBncmF5c2NhbGUgdG8gMjQtYml0IFJHQiBpZiBuZWNlc3NhcnkuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZ3JheV90b19yZ2IpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKKy8qIFJlZHVjZSBSR0IgdG8gZ3JheXNjYWxlLiAqLworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9yZ2JfdG9fZ3JheSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgaW50IGVycm9yX2FjdGlvbiwgZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuICkpOworI2VuZGlmCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIGludCBlcnJvcl9hY3Rpb24sIHBuZ19maXhlZF9wb2ludCByZWQsIHBuZ19maXhlZF9wb2ludCBncmVlbiApKTsKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19ieXRlLHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCisgICBwbmdfcHRyKSk7CisjZW5kaWYKKworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUpIFBOR0FSRygoaW50IGJpdF9kZXB0aCwKKyAgIHBuZ19jb2xvcnAgcGFsZXR0ZSkpOworCisjaWZkZWYgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc3RyaXBfYWxwaGEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQpCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc3dhcF9hbHBoYSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfaW52ZXJ0X2FscGhhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKQorLyogQWRkIGEgZmlsbGVyIGJ5dGUgdG8gOC1iaXQgR3JheSBvciAyNC1iaXQgUkdCIGltYWdlcy4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9maWxsZXIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ191aW50XzMyIGZpbGxlciwgaW50IGZsYWdzKSk7CisvKiBUaGUgdmFsdWVzIG9mIHRoZSBQTkdfRklMTEVSXyBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZCAqLworI2RlZmluZSBQTkdfRklMTEVSX0JFRk9SRSAwCisjZGVmaW5lIFBOR19GSUxMRVJfQUZURVIgMQorLyogQWRkIGFuIGFscGhhIGJ5dGUgdG8gOC1iaXQgR3JheSBvciAyNC1iaXQgUkdCIGltYWdlcy4gKi8KKyNpZm5kZWYgUE5HXzFfMF9YCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfYWRkX2FscGhhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfdWludF8zMiBmaWxsZXIsIGludCBmbGFncykpOworI2VuZGlmCisjZW5kaWYgLyogUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpCisvKiBTd2FwIGJ5dGVzIGluIDE2LWJpdCBkZXB0aCBmaWxlcy4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zd2FwKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpCisvKiBVc2UgMSBieXRlIHBlciBwaXhlbCBpbiAxLCAyLCBvciA0LWJpdCBkZXB0aCBmaWxlcy4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9wYWNraW5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkKKy8qIFN3YXAgcGFja2luZyBvcmRlciBvZiBwaXhlbHMgaW4gYnl0ZXMuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcGFja3N3YXApIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKQorLyogQ29udmVydHMgZmlsZXMgdG8gbGVnYWwgYml0IGRlcHRocy4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zaGlmdCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2NvbG9yXzhwIHRydWVfYml0cykpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkKKy8qIEhhdmUgdGhlIGNvZGUgaGFuZGxlIHRoZSBpbnRlcmxhY2luZy4gIFJldHVybnMgdGhlIG51bWJlciBvZiBwYXNzZXMuICovCitleHRlcm4gUE5HX0VYUE9SVChpbnQscG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQpCisvKiBJbnZlcnQgbW9ub2Nocm9tZSBmaWxlcyAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2ludmVydF9tb25vKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKy8qIEhhbmRsZSBhbHBoYSBhbmQgdFJOUyBieSByZXBsYWNpbmcgd2l0aCBhIGJhY2tncm91bmQgY29sb3IuICovCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2JhY2tncm91bmQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZF9jb2xvciwgaW50IGJhY2tncm91bmRfZ2FtbWFfY29kZSwKKyAgIGludCBuZWVkX2V4cGFuZCwgZG91YmxlIGJhY2tncm91bmRfZ2FtbWEpKTsKKyNlbmRpZgorI2RlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTktOT1dOIDAKKyNkZWZpbmUgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOICAxCisjZGVmaW5lIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUgICAgMgorI2RlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUUgIDMKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQKKy8qIFN0cmlwIHRoZSBzZWNvbmQgYnl0ZSBvZiBpbmZvcm1hdGlvbiBmcm9tIGEgMTYtYml0IGRlcHRoIGZpbGUuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc3RyaXBfMTYpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVECisvKiBUdXJuIG9uIGRpdGhlcmluZywgYW5kIHJlZHVjZSB0aGUgcGFsZXR0ZSB0byB0aGUgbnVtYmVyIG9mIGNvbG9ycyBhdmFpbGFibGUuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZGl0aGVyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfY29sb3JwIHBhbGV0dGUsIGludCBudW1fcGFsZXR0ZSwgaW50IG1heGltdW1fY29sb3JzLAorICAgcG5nX3VpbnRfMTZwIGhpc3RvZ3JhbSwgaW50IGZ1bGxfZGl0aGVyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorLyogSGFuZGxlIGdhbW1hIGNvcnJlY3Rpb24uIFNjcmVlbl9nYW1tYT0oZGlzcGxheV9leHBvbmVudCkgKi8KKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZ2FtbWEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIGRvdWJsZSBzY3JlZW5fZ2FtbWEsIGRvdWJsZSBkZWZhdWx0X2ZpbGVfZ2FtbWEpKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZCAoUE5HXzFfMl9YKQorI2lmIGRlZmluZWQoUE5HX1JFQURfRU1QVFlfUExURV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9FTVBUWV9QTFRFX1NVUFBPUlRFRCkKKy8qIFBlcm1pdCBvciBkaXNhbGxvdyBlbXB0eSBQTFRFICgwOiBub3QgcGVybWl0dGVkLCAxOiBwZXJtaXR0ZWQpICovCisvKiBEZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuICBVc2UgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMoKSBpbnN0ZWFkLiAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfcGVybWl0X2VtcHR5X3BsdGUpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIGludCBlbXB0eV9wbHRlX3Blcm1pdHRlZCkpIFBOR19ERVBSRUNBVEVEOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKKy8qIFNldCBob3cgbWFueSBsaW5lcyBiZXR3ZWVuIG91dHB1dCBmbHVzaGVzIC0gMCBmb3Igbm8gZmx1c2hpbmcgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9mbHVzaCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbnJvd3MpKTsKKy8qIEZsdXNoIHRoZSBjdXJyZW50IFBORyBvdXRwdXQgYnVmZmVyICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9mbHVzaCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisjZW5kaWYKKworLyogT3B0aW9uYWwgdXBkYXRlIHBhbGV0dGUgd2l0aCByZXF1ZXN0ZWQgdHJhbnNmb3JtYXRpb25zICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zdGFydF9yZWFkX2ltYWdlKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKKworLyogT3B0aW9uYWwgY2FsbCB0byB1cGRhdGUgdGhlIHVzZXJzIGluZm8gc3RydWN0dXJlICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX3VwZGF0ZV9pbmZvKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKKworI2lmbmRlZiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCBvbmUgb3IgbW9yZSByb3dzIG9mIGltYWdlIGRhdGEuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX3Jvd3MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19ieXRlcHAgcm93LCBwbmdfYnl0ZXBwIGRpc3BsYXlfcm93LCBwbmdfdWludF8zMiBudW1fcm93cykpOworI2VuZGlmCisKKyNpZm5kZWYgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIFJlYWQgYSByb3cgb2YgZGF0YS4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3JlYWRfcm93KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfYnl0ZXAgcm93LAorICAgcG5nX2J5dGVwIGRpc3BsYXlfcm93KSk7CisjZW5kaWYKKworI2lmbmRlZiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCB0aGUgd2hvbGUgaW1hZ2UgaW50byBtZW1vcnkgYXQgb25jZS4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3JlYWRfaW1hZ2UpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19ieXRlcHAgaW1hZ2UpKTsKKyNlbmRpZgorCisvKiBXcml0ZSBhIHJvdyBvZiBpbWFnZSBkYXRhICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9yb3cpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19ieXRlcCByb3cpKTsKKworLyogV3JpdGUgYSBmZXcgcm93cyBvZiBpbWFnZSBkYXRhICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9yb3dzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfYnl0ZXBwIHJvdywgcG5nX3VpbnRfMzIgbnVtX3Jvd3MpKTsKKworLyogV3JpdGUgdGhlIGltYWdlIGRhdGEgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2ltYWdlKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfYnl0ZXBwIGltYWdlKSk7CisKKy8qIFdyaXRlcyB0aGUgZW5kIG9mIHRoZSBQTkcgZmlsZS4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2VuZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyKSk7CisKKyNpZm5kZWYgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIFJlYWQgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX2VuZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyKSk7CisjZW5kaWYKKworLyogRnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG5nX2luZm9fc3RydWN0ICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19kZXN0cm95X2luZm9fc3RydWN0KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikpOworCisvKiBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbmdfc3RydWN0IGFuZCB0aGUgcG5nX2luZm9fc3RydWN0cyAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCkgUE5HQVJHKChwbmdfc3RydWN0cHAKKyAgIHBuZ19wdHJfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0ciwgcG5nX2luZm9wcCBlbmRfaW5mb19wdHJfcHRyKSk7CisKKy8qIEZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSByZWFkIChvbGQgbWV0aG9kIC0gTk9UIERMTCBFWFBPUlRFRCkgKi8KK2V4dGVybiB2b2lkIHBuZ19yZWFkX2Rlc3Ryb3kgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfaW5mb3AgZW5kX2luZm9fcHRyKSkgUE5HX0RFUFJFQ0FURUQ7CisKKy8qIEZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHBuZ19zdHJ1Y3QgYW5kIHRoZSBwbmdfaW5mb19zdHJ1Y3RzICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCkKKyAgIFBOR0FSRygocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikpOworCisvKiBGcmVlIGFueSBtZW1vcnkgdXNlZCBpbiBwbmdfcHRyIHN0cnVjdCAob2xkIG1ldGhvZCAtIE5PVCBETEwgRVhQT1JURUQpICovCitleHRlcm4gdm9pZCBwbmdfd3JpdGVfZGVzdHJveSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKSBQTkdfREVQUkVDQVRFRDsKKworLyogU2V0IHRoZSBsaWJwbmcgbWV0aG9kIG9mIGhhbmRsaW5nIGNodW5rIENSQyBlcnJvcnMgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jcmNfYWN0aW9uKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBpbnQgY3JpdF9hY3Rpb24sIGludCBhbmNpbF9hY3Rpb24pKTsKKworLyogVmFsdWVzIGZvciBwbmdfc2V0X2NyY19hY3Rpb24oKSB0byBzYXkgaG93IHRvIGhhbmRsZSBDUkMgZXJyb3JzIGluCisgKiBhbmNpbGxhcnkgYW5kIGNyaXRpY2FsIGNodW5rcywgYW5kIHdoZXRoZXIgdG8gdXNlIHRoZSBkYXRhIGNvbnRhaW5lZAorICogdGhlcmVpbi4gIE5vdGUgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvICJkaXNjYXJkIiBkYXRhIGluIGEgY3JpdGljYWwKKyAqIGNodW5rLiAgRm9yIHZlcnNpb25zIHByaW9yIHRvIDAuOTAsIHRoZSBhY3Rpb24gd2FzIGFsd2F5cyBlcnJvci9xdWl0LAorICogd2hlcmVhcyBpbiB2ZXJzaW9uIDAuOTAgYW5kIGxhdGVyLCB0aGUgYWN0aW9uIGZvciBDUkMgZXJyb3JzIGluIGFuY2lsbGFyeQorICogY2h1bmtzIGlzIHdhcm4vZGlzY2FyZC4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuCisgKgorICogICAgICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOmNyaXRpY2FsICAgICBhY3Rpb246YW5jaWxsYXJ5CisgKi8KKyNkZWZpbmUgUE5HX0NSQ19ERUZBVUxUICAgICAgIDAgIC8qIGVycm9yL3F1aXQgICAgICAgICAgd2Fybi9kaXNjYXJkIGRhdGEgKi8KKyNkZWZpbmUgUE5HX0NSQ19FUlJPUl9RVUlUICAgIDEgIC8qIGVycm9yL3F1aXQgICAgICAgICAgZXJyb3IvcXVpdCAgICAgICAgKi8KKyNkZWZpbmUgUE5HX0NSQ19XQVJOX0RJU0NBUkQgIDIgIC8qIChJTlZBTElEKSAgICAgICAgICAgd2Fybi9kaXNjYXJkIGRhdGEgKi8KKyNkZWZpbmUgUE5HX0NSQ19XQVJOX1VTRSAgICAgIDMgIC8qIHdhcm4vdXNlIGRhdGEgICAgICAgd2Fybi91c2UgZGF0YSAgICAgKi8KKyNkZWZpbmUgUE5HX0NSQ19RVUlFVF9VU0UgICAgIDQgIC8qIHF1aWV0L3VzZSBkYXRhICAgICAgcXVpZXQvdXNlIGRhdGEgICAgKi8KKyNkZWZpbmUgUE5HX0NSQ19OT19DSEFOR0UgICAgIDUgIC8qIHVzZSBjdXJyZW50IHZhbHVlICAgdXNlIGN1cnJlbnQgdmFsdWUgKi8KKworLyogVGhlc2UgZnVuY3Rpb25zIGdpdmUgdGhlIHVzZXIgY29udHJvbCBvdmVyIHRoZSBzY2FuLWxpbmUgZmlsdGVyaW5nIGluCisgKiBsaWJwbmcgYW5kIHRoZSBjb21wcmVzc2lvbiBtZXRob2RzIHVzZWQgYnkgemxpYi4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAqIG1haW5seSB1c2VmdWwgZm9yIHRlc3RpbmcsIGFzIHRoZSBkZWZhdWx0cyBzaG91bGQgd29yayB3aXRoIG1vc3QgdXNlcnMuCisgKiBUaG9zZSB1c2VycyB3aG8gYXJlIHRpZ2h0IG9uIG1lbW9yeSBvciB3YW50IGZhc3RlciBwZXJmb3JtYW5jZSBhdCB0aGUKKyAqIGV4cGVuc2Ugb2YgY29tcHJlc3Npb24gY2FuIG1vZGlmeSB0aGVtLiAgU2VlIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBoZWFkZXIgZmlsZSAoemxpYi5oKSBmb3IgYW4gZXhwbGluYXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9ucy4KKyAqLworCisvKiBTZXQgdGhlIGZpbHRlcmluZyBtZXRob2QocykgdXNlZCBieSBsaWJwbmcuICBDdXJyZW50bHksIHRoZSBvbmx5IHZhbGlkCisgKiB2YWx1ZSBmb3IgIm1ldGhvZCIgaXMgMC4KKyAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2ZpbHRlcikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbWV0aG9kLAorICAgaW50IGZpbHRlcnMpKTsKKworLyogRmxhZ3MgZm9yIHBuZ19zZXRfZmlsdGVyKCkgdG8gc2F5IHdoaWNoIGZpbHRlcnMgdG8gdXNlLiAgVGhlIGZsYWdzCisgKiBhcmUgY2hvc2VuIHNvIHRoYXQgdGhleSBkb24ndCBjb25mbGljdCB3aXRoIHJlYWwgZmlsdGVyIHR5cGVzCisgKiBiZWxvdywgaW4gY2FzZSB0aGV5IGFyZSBzdXBwbGllZCBpbnN0ZWFkIG9mIHRoZSAjZGVmaW5lZCBjb25zdGFudHMuCisgKiBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLgorICovCisjZGVmaW5lIFBOR19OT19GSUxURVJTICAgICAweDAwCisjZGVmaW5lIFBOR19GSUxURVJfTk9ORSAgICAweDA4CisjZGVmaW5lIFBOR19GSUxURVJfU1VCICAgICAweDEwCisjZGVmaW5lIFBOR19GSUxURVJfVVAgICAgICAweDIwCisjZGVmaW5lIFBOR19GSUxURVJfQVZHICAgICAweDQwCisjZGVmaW5lIFBOR19GSUxURVJfUEFFVEggICAweDgwCisjZGVmaW5lIFBOR19BTExfRklMVEVSUyAoUE5HX0ZJTFRFUl9OT05FIHwgUE5HX0ZJTFRFUl9TVUIgfCBQTkdfRklMVEVSX1VQIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GSUxURVJfQVZHIHwgUE5HX0ZJTFRFUl9QQUVUSCkKKworLyogRmlsdGVyIHZhbHVlcyAobm90IGZsYWdzKSAtIHVzZWQgaW4gcG5nd3JpdGUuYywgcG5nd3V0aWwuYyBmb3Igbm93LgorICogVGhlc2UgZGVmaW5lcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuCisgKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9OT05FICAwCisjZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfU1VCICAgMQorI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX1VQICAgIDIKKyNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9BVkcgICAzCisjZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfUEFFVEggNAorI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX0xBU1QgIDUKKworI2lmIGRlZmluZWQoUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQpIC8qIEVYUEVSSU1FTlRBTCAqLworLyogVGhlICJoZXVyaXN0aWNfbWV0aG9kIiBpcyBnaXZlbiBieSBvbmUgb2YgdGhlIFBOR19GSUxURVJfSEVVUklTVElDXworICogZGVmaW5lcywgZWl0aGVyIHRoZSBkZWZhdWx0IChtaW5pbXVtLXN1bS1vZi1hYnNvbHV0ZS1kaWZmZXJlbmNlcyksIG9yCisgKiB0aGUgZXhwZXJpbWVudGFsIG1ldGhvZCAod2VpZ2h0ZWQtbWluaW11bS1zdW0tb2YtYWJzb2x1dGUtZGlmZmVyZW5jZXMpLgorICoKKyAqIFdlaWdodHMgYXJlIGZhY3RvcnMgPj0gMS4wLCBpbmRpY2F0aW5nIGhvdyBpbXBvcnRhbnQgaXQgaXMgdG8ga2VlcCB0aGUKKyAqIGZpbHRlciB0eXBlIGNvbnNpc3RlbnQgYmV0d2VlbiByb3dzLiAgTGFyZ2VyIG51bWJlcnMgbWVhbiB0aGUgY3VycmVudAorICogZmlsdGVyIGlzIHRoYXQgbWFueSB0aW1lcyBhcyBsaWtlbHkgdG8gYmUgdGhlIHNhbWUgYXMgdGhlICJudW1fd2VpZ2h0cyIKKyAqIHByZXZpb3VzIGZpbHRlcnMuICBUaGlzIGlzIGN1bXVsYXRpdmUgZm9yIGVhY2ggcHJldmlvdXMgcm93IHdpdGggYSB3ZWlnaHQuCisgKiBUaGVyZSBuZWVkcyB0byBiZSAibnVtX3dlaWdodHMiIHZhbHVlcyBpbiAiZmlsdGVyX3dlaWdodHMiLCBvciBpdCBjYW4gYmUKKyAqIE5VTEwgaWYgdGhlIHdlaWdodHMgYXJlbid0IGJlaW5nIHNwZWNpZmllZC4gIFdlaWdodHMgaGF2ZSBubyBpbmZsdWVuY2Ugb24KKyAqIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGZpcnN0IHJvdyBmaWx0ZXIuICBXZWxsIGNob3NlbiB3ZWlnaHRzIGNhbiAoaW4gdGhlb3J5KQorICogaW1wcm92ZSB0aGUgY29tcHJlc3Npb24gZm9yIGEgZ2l2ZW4gaW1hZ2UuCisgKgorICogQ29zdHMgYXJlIGZhY3RvcnMgPj0gMS4wIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIGRlY29kaW5nIGNvc3RzIG9mIGEKKyAqIGZpbHRlciB0eXBlLiAgSGlnaGVyIGNvc3RzIGluZGljYXRlIG1vcmUgZGVjb2RpbmcgZXhwZW5zZSwgYW5kIGFyZQorICogdGhlcmVmb3JlIGxlc3MgbGlrZWx5IHRvIGJlIHNlbGVjdGVkIG92ZXIgYSBmaWx0ZXIgd2l0aCBsb3dlciBjb21wdXRhdGlvbmFsCisgKiBjb3N0cy4gIFRoZXJlIG5lZWRzIHRvIGJlIGEgdmFsdWUgaW4gImZpbHRlcl9jb3N0cyIgZm9yIGVhY2ggdmFsaWQgZmlsdGVyCisgKiB0eXBlIChnaXZlbiBieSBQTkdfRklMVEVSX1ZBTFVFX0xBU1QpLCBvciBpdCBjYW4gYmUgTlVMTCBpZiB5b3UgYXJlbid0CisgKiBzZXR0aW5nIHRoZSBjb3N0cy4gIENvc3RzIHRyeSB0byBpbXByb3ZlIHRoZSBzcGVlZCBvZiBkZWNvbXByZXNzaW9uIHdpdGhvdXQKKyAqIHVuZHVseSBpbmNyZWFzaW5nIHRoZSBjb21wcmVzc2VkIGltYWdlIHNpemUuCisgKgorICogQSBuZWdhdGl2ZSB3ZWlnaHQgb3IgY29zdCBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdG8gYmUgdXNlZCwgYW5kCisgKiB2YWx1ZXMgaW4gdGhlIHJhbmdlIFswLjAsIDEuMCkgaW5kaWNhdGUgdGhlIHZhbHVlIGlzIHRvIHJlbWFpbiB1bmNoYW5nZWQuCisgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGJvdGggd2VpZ2h0cyBhbmQgY29zdHMgYXJlIGN1cnJlbnRseSAxLjAsIGJ1dCBtYXkKKyAqIGNoYW5nZSBpZiBnb29kIGdlbmVyYWwgd2VpZ2h0aW5nL2Nvc3QgaGV1cmlzdGljcyBjYW4gYmUgZm91bmQuICBJZiBib3RoCisgKiB0aGUgd2VpZ2h0cyBhbmQgY29zdHMgYXJlIHNldCB0byAxLjAsIHRoaXMgZGVnZW5lcmF0ZXMgdGhlIFdFSUdIVEVEIG1ldGhvZAorICogdG8gdGhlIFVOV0VJR0hURUQgbWV0aG9kLCBidXQgd2l0aCBhZGRlZCBlbmNvZGluZyB0aW1lL2NvbXB1dGF0aW9uLgorICovCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBpbnQgaGV1cmlzdGljX21ldGhvZCwgaW50IG51bV93ZWlnaHRzLCBwbmdfZG91YmxlcCBmaWx0ZXJfd2VpZ2h0cywKKyAgIHBuZ19kb3VibGVwIGZpbHRlcl9jb3N0cykpOworI2VuZGlmCisjZW5kaWYgLyogIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEICovCisKKy8qIEhldXJpc3RpYyB1c2VkIGZvciByb3cgZmlsdGVyIHNlbGVjdGlvbi4gIFRoZXNlIGRlZmluZXMgc2hvdWxkIE5PVCBiZQorICogY2hhbmdlZC4KKyAqLworI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19ERUZBVUxUICAgIDAgIC8qIEN1cnJlbnRseSAiVU5XRUlHSFRFRCIgKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfVU5XRUlHSFRFRCAxICAvKiBVc2VkIGJ5IGxpYnBuZyA8IDAuOTUgKi8KKyNkZWZpbmUgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQgICAyICAvKiBFeHBlcmltZW50YWwgZmVhdHVyZSAqLworI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19MQVNUICAgICAgIDMgIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCisKKy8qIFNldCB0aGUgbGlicmFyeSBjb21wcmVzc2lvbiBsZXZlbC4gIEN1cnJlbnRseSwgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20KKyAqIDAgLSA5LCBjb3JyZXNwb25kaW5nIGRpcmVjdGx5IHRvIHRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVscyAwIC0gOQorICogKDAgLSBubyBjb21wcmVzc2lvbiwgOSAtICJtYXhpbWFsIiBjb21wcmVzc2lvbikuICBOb3RlIHRoYXQgdGVzdHMgaGF2ZQorICogc2hvd24gdGhhdCB6bGliIGNvbXByZXNzaW9uIGxldmVscyAzLTYgdXN1YWxseSBwZXJmb3JtIGFzIHdlbGwgYXMgbGV2ZWwgOQorICogZm9yIFBORyBpbWFnZXMsIGFuZCBkbyBjb25zaWRlcmFibHkgZmV3ZXIgY2FjbHVsYXRpb25zLiAgSW4gdGhlIGZ1dHVyZSwKKyAqIHRoZXNlIHZhbHVlcyBtYXkgbm90IGNvcnJlc3BvbmQgZGlyZWN0bHkgdG8gdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWxzLgorICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIGludCBsZXZlbCkpOworCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKQorICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbWVtX2xldmVsKSk7CisKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneSkKKyAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IHN0cmF0ZWd5KSk7CisKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cykKKyAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IHdpbmRvd19iaXRzKSk7CisKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIGludCBtZXRob2QpKTsKKworLyogVGhlc2UgbmV4dCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmb3IgaW5wdXQvb3V0cHV0LCBtZW1vcnksIGFuZCBlcnJvcgorICogaGFuZGxpbmcuICBUaGV5IGFyZSBpbiB0aGUgZmlsZSBwbmdyaW8uYywgcG5nd2lvLmMsIGFuZCBwbmdlcnJvci5jLAorICogYW5kIGNhbGwgc3RhbmRhcmQgQyBJL08gcm91dGluZXMgc3VjaCBhcyBmcmVhZCgpLCBmd3JpdGUoKSwgYW5kCisgKiBmcHJpbnRmKCkuICBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIG1hZGUgdG8gdXNlIG90aGVyIEkvTyByb3V0aW5lcworICogYXQgcnVuIHRpbWUgZm9yIHRob3NlIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gaGFuZGxlIEkvTyBpbiBhCisgKiBkaWZmZXJlbnQgbWFubmVyIGJ5IGNhbGxpbmcgcG5nX3NldF8/Pz9fZm4oKS4gIFNlZSBsaWJwbmcudHh0IGZvcgorICogbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorLyogSW5pdGlhbGl6ZSB0aGUgaW5wdXQvb3V0cHV0IGZvciB0aGUgUE5HIGZpbGUgdG8gdGhlIGRlZmF1bHQgZnVuY3Rpb25zLiAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfaW5pdF9pbykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfRklMRV9wIGZwKSk7CisjZW5kaWYKKworLyogUmVwbGFjZSB0aGUgKGVycm9yIGFuZCBhYm9ydCksIGFuZCB3YXJuaW5nIGZ1bmN0aW9ucyB3aXRoIHVzZXIKKyAqIHN1cHBsaWVkIGZ1bmN0aW9ucy4gIElmIG5vIG1lc3NhZ2VzIGFyZSB0byBiZSBwcmludGVkIHlvdSBtdXN0IHN0aWxsCisgKiB3cml0ZSBhbmQgdXNlIHJlcGxhY2VtZW50IGZ1bmN0aW9ucy4gVGhlIHJlcGxhY2VtZW50IGVycm9yX2ZuIHNob3VsZAorICogc3RpbGwgZG8gYSBsb25nam1wIHRvIHRoZSBsYXN0IHNldGptcCBsb2NhdGlvbiBpZiB5b3UgYXJlIHVzaW5nIHRoaXMKKyAqIG1ldGhvZCBvZiBlcnJvciBoYW5kbGluZy4gIElmIGVycm9yX2ZuIG9yIHdhcm5pbmdfZm4gaXMgTlVMTCwgdGhlCisgKiBkZWZhdWx0IGZ1bmN0aW9uIHdpbGwgYmUgdXNlZC4KKyAqLworCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZXJyb3JfZm4pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbikpOworCisvKiBSZXR1cm4gdGhlIHVzZXIgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yIGZ1bmN0aW9ucyAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19nZXRfZXJyb3JfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKKworLyogUmVwbGFjZSB0aGUgZGVmYXVsdCBkYXRhIG91dHB1dCBmdW5jdGlvbnMgd2l0aCBhIHVzZXIgc3VwcGxpZWQgb25lKHMpLgorICogSWYgYnVmZmVyZWQgb3V0cHV0IGlzIG5vdCB1c2VkLCB0aGVuIG91dHB1dF9mbHVzaF9mbiBjYW4gYmUgc2V0IHRvIE5VTEwuCisgKiBJZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIGF0IGxpYnBuZyBjb21waWxlIHRpbWUKKyAqIG91dHB1dF9mbHVzaF9mbiB3aWxsIGJlIGlnbm9yZWQgKGFuZCB0aHVzIGNhbiBiZSBOVUxMKS4KKyAqIEl0IGlzIHByb2JhYmx5IGEgbWlzdGFrZSB0byB1c2UgTlVMTCBmb3Igb3V0cHV0X2ZsdXNoX2ZuIGlmCisgKiB3cml0ZV9kYXRhX2ZuIGlzIG5vdCBhbHNvIE5VTEwgdW5sZXNzIHlvdSBoYXZlIGJ1aWx0IGxpYnBuZyB3aXRoCisgKiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEIHVuZGVmaW5lZCwgYmVjYXVzZSBpbiB0aGlzIGNhc2UgbGlicG5nJ3MKKyAqIGRlZmF1bHQgZmx1c2ggZnVuY3Rpb24sIHdoaWNoIHVzZXMgdGhlIHN0YW5kYXJkICpGSUxFIHN0cnVjdHVyZSwgd2lsbAorICogYmUgdXNlZC4KKyAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3dyaXRlX2ZuKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfdm9pZHAgaW9fcHRyLCBwbmdfcndfcHRyIHdyaXRlX2RhdGFfZm4sIHBuZ19mbHVzaF9wdHIgb3V0cHV0X2ZsdXNoX2ZuKSk7CisKKy8qIFJlcGxhY2UgdGhlIGRlZmF1bHQgZGF0YSBpbnB1dCBmdW5jdGlvbiB3aXRoIGEgdXNlciBzdXBwbGllZCBvbmUuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcmVhZF9mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX3ZvaWRwIGlvX3B0ciwgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pKTsKKworLyogUmV0dXJuIHRoZSB1c2VyIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBJL08gZnVuY3Rpb25zICovCitleHRlcm4gUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX2dldF9pb19wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19yZWFkX3N0YXR1c19wdHIgcmVhZF9yb3dfZm4pKTsKKworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3dyaXRlX3N0YXR1c19mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX3dyaXRlX3N0YXR1c19wdHIgd3JpdGVfcm93X2ZuKSk7CisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisvKiBSZXBsYWNlIHRoZSBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyB3aXRoIHVzZXIgc3VwcGxpZWQgb25lKHMpLiAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X21lbV9mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX3ZvaWRwIG1lbV9wdHIsIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pKTsKKy8qIFJldHVybiB0aGUgdXNlciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtb3J5IGZ1bmN0aW9ucyAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19nZXRfbWVtX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfTEVHQUNZX1NVUFBPUlRFRCkKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCisgICBwbmdfcHRyLCBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIHJlYWRfdXNlcl90cmFuc2Zvcm1fZm4pKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfTEVHQUNZX1NVUFBPUlRFRCkKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbikgUE5HQVJHKChwbmdfc3RydWN0cAorICAgcG5nX3B0ciwgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciB3cml0ZV91c2VyX3RyYW5zZm9ybV9mbikpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX0xFR0FDWV9TVVBQT1JURUQpCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbykgUE5HQVJHKChwbmdfc3RydWN0cAorICAgcG5nX3B0ciwgcG5nX3ZvaWRwIHVzZXJfdHJhbnNmb3JtX3B0ciwgaW50IHVzZXJfdHJhbnNmb3JtX2RlcHRoLAorICAgaW50IHVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzKSk7CisvKiBSZXR1cm4gdGhlIHVzZXIgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdHJhbnNmb3JtIGZ1bmN0aW9ucyAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKQorICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ192b2lkcCB1c2VyX2NodW5rX3B0ciwgcG5nX3VzZXJfY2h1bmtfcHRyIHJlYWRfdXNlcl9jaHVua19mbikpOworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19nZXRfdXNlcl9jaHVua19wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAKKyAgIHBuZ19wdHIpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVECisvKiBTZXRzIHRoZSBmdW5jdGlvbiBjYWxsYmFja3MgZm9yIHRoZSBwdXNoIHJlYWRlciwgYW5kIGEgcG9pbnRlciB0byBhCisgKiB1c2VyLWRlZmluZWQgc3RydWN0dXJlIGF2YWlsYWJsZSB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zLgorICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX3ZvaWRwIHByb2dyZXNzaXZlX3B0ciwKKyAgIHBuZ19wcm9ncmVzc2l2ZV9pbmZvX3B0ciBpbmZvX2ZuLCBwbmdfcHJvZ3Jlc3NpdmVfcm93X3B0ciByb3dfZm4sCisgICBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBlbmRfZm4pKTsKKworLyogUmV0dXJucyB0aGUgdXNlciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHVzaCByZWFkIGZ1bmN0aW9ucyAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKQorICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisKKy8qIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGRhdGEgYmVjb21lcyBhdmFpbGFibGUgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3Byb2Nlc3NfZGF0YSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGJ1ZmZlcl9zaXplKSk7CisKKy8qIEZ1bmN0aW9uIHRoYXQgY29tYmluZXMgcm93cy4gIE5vdCB2ZXJ5IG11Y2ggZGlmZmVyZW50IHRoYW4gdGhlCisgKiBwbmdfY29tYmluZV9yb3coKSBjYWxsLiAgSXMgdGhpcyBldmVuIHVzZWQ/Pz8/PworICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2J5dGVwIG9sZF9yb3csIHBuZ19ieXRlcCBuZXdfcm93KSk7CisjZW5kaWYgLyogUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICovCisKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ192b2lkcCxwbmdfbWFsbG9jKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfdWludF8zMiBzaXplKSkgUE5HX0FMTE9DQVRFRDsKKworI2lmZGVmIFBOR18xXzBfWAorIyAgZGVmaW5lIHBuZ19tYWxsb2Nfd2FybiBwbmdfbWFsbG9jCisjZWxzZQorLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjQgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHBuZ192b2lkcCxwbmdfbWFsbG9jX3dhcm4pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ191aW50XzMyIHNpemUpKSBQTkdfQUxMT0NBVEVEOworI2VuZGlmCisKKy8qIEZyZWVzIGEgcG9pbnRlciBhbGxvY2F0ZWQgYnkgcG5nX21hbGxvYygpICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19mcmVlKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpKTsKKworI2lmZGVmIFBOR18xXzBfWAorLyogRnVuY3Rpb24gdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB6bGliLiAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZHBmLHBuZ196YWxsb2MpIFBOR0FSRygodm9pZHBmIHBuZ19wdHIsIHVJbnQgaXRlbXMsCisgICB1SW50IHNpemUpKTsKKworLyogRnVuY3Rpb24gdG8gZnJlZSBtZW1vcnkgZm9yIHpsaWIgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3pmcmVlKSBQTkdBUkcoKHZvaWRwZiBwbmdfcHRyLCB2b2lkcGYgcHRyKSk7CisjZW5kaWYKKworLyogRnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBpbnRlcm5hbGx5ICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19mcmVlX2RhdGEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgZnJlZV9tZSwgaW50IG51bSkpOworI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorLyogUmVhc3NpZ24gcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgZXhpc3RpbmcgZGF0YSwgd2hldGhlciBhbGxvY2F0ZWQKKyAqIGJ5IGxpYnBuZyBvciBieSB0aGUgYXBwbGljYXRpb24KKyAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfZGF0YV9mcmVlcikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgZnJlZXIsIHBuZ191aW50XzMyIG1hc2spKTsKKyNlbmRpZgorLyogQXNzaWdubWVudHMgZm9yIHBuZ19kYXRhX2ZyZWVyICovCisjZGVmaW5lIFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBIDEKKyNkZWZpbmUgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQSAxCisjZGVmaW5lIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBIDIKKy8qIEZsYWdzIGZvciBwbmdfcHRyLT5mcmVlX21lIGFuZCBpbmZvX3B0ci0+ZnJlZV9tZSAqLworI2RlZmluZSBQTkdfRlJFRV9ISVNUIDB4MDAwOAorI2RlZmluZSBQTkdfRlJFRV9JQ0NQIDB4MDAxMAorI2RlZmluZSBQTkdfRlJFRV9TUExUIDB4MDAyMAorI2RlZmluZSBQTkdfRlJFRV9ST1dTIDB4MDA0MAorI2RlZmluZSBQTkdfRlJFRV9QQ0FMIDB4MDA4MAorI2RlZmluZSBQTkdfRlJFRV9TQ0FMIDB4MDEwMAorI2RlZmluZSBQTkdfRlJFRV9VTktOIDB4MDIwMAorI2RlZmluZSBQTkdfRlJFRV9MSVNUIDB4MDQwMAorI2RlZmluZSBQTkdfRlJFRV9QTFRFIDB4MTAwMAorI2RlZmluZSBQTkdfRlJFRV9UUk5TIDB4MjAwMAorI2RlZmluZSBQTkdfRlJFRV9URVhUIDB4NDAwMAorI2RlZmluZSBQTkdfRlJFRV9BTEwgIDB4N2ZmZgorI2RlZmluZSBQTkdfRlJFRV9NVUwgIDB4NDIyMCAvKiBQTkdfRlJFRV9TUExUfFBOR19GUkVFX1RFWFR8UE5HX0ZSRUVfVU5LTiAqLworCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19tYWxsb2NfZGVmYXVsdCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX3VpbnRfMzIgc2l6ZSkpIFBOR19BTExPQ0FURUQ7CitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19mcmVlX2RlZmF1bHQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ192b2lkcCBwdHIpKTsKKyNlbmRpZgorCitleHRlcm4gUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX21lbWNweV9jaGVjaykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX3ZvaWRwIHMxLCBwbmdfdm9pZHAgczIsIHBuZ191aW50XzMyIHNpemUpKSBQTkdfREVQUkVDQVRFRDsKKworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19tZW1zZXRfY2hlY2spIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ192b2lkcCBzMSwgaW50IHZhbHVlLCBwbmdfdWludF8zMiBzaXplKSkgUE5HX0RFUFJFQ0FURUQ7CisKKyNpZiBkZWZpbmVkKFVTRV9GQVJfS0VZV09SRCkgIC8qIG1lbW9yeSBtb2RlbCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCitleHRlcm4gdm9pZCAqcG5nX2Zhcl90b19uZWFyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cixwbmdfdm9pZHAgcHRyLAorICAgaW50IGNoZWNrKSk7CisjZW5kaWYgLyogVVNFX0ZBUl9LRVlXT1JEICovCisKKyNpZm5kZWYgUE5HX05PX0VSUk9SX1RFWFQKKy8qIEZhdGFsIGVycm9yIGluIFBORyBpbWFnZSBvZiBsaWJwbmcgLSBjYW4ndCBjb250aW51ZSAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfZXJyb3IpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSkgUE5HX05PUkVUVVJOOworCisvKiBUaGUgc2FtZSwgYnV0IHRoZSBjaHVuayBuYW1lIGlzIHByZXBlbmRlZCB0byB0aGUgZXJyb3Igc3RyaW5nLiAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfY2h1bmtfZXJyb3IpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSkgUE5HX05PUkVUVVJOOworI2Vsc2UKKy8qIEZhdGFsIGVycm9yIGluIFBORyBpbWFnZSBvZiBsaWJwbmcgLSBjYW4ndCBjb250aW51ZSAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfZXJyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKSBQTkdfTk9SRVRVUk47CisjZW5kaWYKKworI2lmbmRlZiBQTkdfTk9fV0FSTklOR1MKKy8qIE5vbi1mYXRhbCBlcnJvciBpbiBsaWJwbmcuICBDYW4gY29udGludWUsIGJ1dCBtYXkgaGF2ZSBhIHByb2JsZW0uICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193YXJuaW5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKy8qIE5vbi1mYXRhbCBlcnJvciBpbiBsaWJwbmcsIGNodW5rIG5hbWUgaXMgcHJlcGVuZGVkIHRvIG1lc3NhZ2UuICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19jaHVua193YXJuaW5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7CisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCisjZW5kaWYgLyogUE5HX05PX1dBUk5JTkdTICovCisKKy8qIFRoZSBwbmdfc2V0XzxjaHVuaz4gZnVuY3Rpb25zIGFyZSBmb3Igc3RvcmluZyB2YWx1ZXMgaW4gdGhlIHBuZ19pbmZvX3N0cnVjdC4KKyAqIFNpbWlsYXJseSwgdGhlIHBuZ19nZXRfPGNodW5rPiBjYWxscyBhcmUgdXNlZCB0byByZWFkIHZhbHVlcyBmcm9tIHRoZQorICogcG5nX2luZm9fc3RydWN0LCBlaXRoZXIgc3RvcmluZyB0aGUgcGFyYW1ldGVycyBpbiB0aGUgcGFzc2VkIHZhcmlhYmxlcywgb3IKKyAqIHNldHRpbmcgcG9pbnRlcnMgaW50byB0aGUgcG5nX2luZm9fc3RydWN0IHdoZXJlIHRoZSBkYXRhIGlzIHN0b3JlZC4gIFRoZQorICogcG5nX2dldF88Y2h1bms+IGZ1bmN0aW9ucyByZXR1cm4gYSBub24temVybyB2YWx1ZSBpZiB0aGUgZGF0YSB3YXMgYXZhaWxhYmxlCisgKiBpbiBpbmZvX3B0ciwgb3IgcmV0dXJuIHplcm8gYW5kIGRvIG5vdCBjaGFuZ2UgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlmIHRoZQorICogZGF0YSB3YXMgbm90IGF2YWlsYWJsZS4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgcG5nX2luZm8KKyAqIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggZnV0dXJlIGNoYW5nZXMgaW4gdGhlIHNpemUgYW5kIGludGVybmFsIGxheW91dCBvZgorICogcG5nX2luZm9fc3RydWN0LgorICovCisvKiBSZXR1cm5zICJmbGFnIiBpZiBjaHVuayBkYXRhIGlzIHZhbGlkIGluIGluZm9fcHRyLiAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF92YWxpZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBmbGFnKSk7CisKKy8qIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBob2xkIGEgdHJhbnNmb3JtZWQgcm93LiAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9yb3dieXRlcykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorcG5nX2luZm9wIGluZm9fcHRyKSk7CisKKyNpZmRlZiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQKKy8qIFJldHVybnMgcm93X3BvaW50ZXJzLCB3aGljaCBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBzY2FubGluZXMgdGhhdCB3YXMKKyAqIHJldHVybmVkIGZyb20gcG5nX3JlYWRfcG5nKCkuCisgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19ieXRlcHAscG5nX2dldF9yb3dzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCitwbmdfaW5mb3AgaW5mb19wdHIpKTsKKy8qIFNldCByb3dfcG9pbnRlcnMsIHdoaWNoIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNjYW5saW5lcyBmb3IgdXNlCisgKiBieSBwbmdfd3JpdGVfcG5nKCkuCisgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9yb3dzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19ieXRlcHAgcm93X3BvaW50ZXJzKSk7CisjZW5kaWYKKworLyogUmV0dXJucyBudW1iZXIgb2YgY29sb3IgY2hhbm5lbHMgaW4gaW1hZ2UuICovCitleHRlcm4gUE5HX0VYUE9SVChwbmdfYnl0ZSxwbmdfZ2V0X2NoYW5uZWxzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCitwbmdfaW5mb3AgaW5mb19wdHIpKTsKKworI2lmZGVmIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQKKy8qIFJldHVybnMgaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzLiAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIsIHBuZ19nZXRfaW1hZ2Vfd2lkdGgpIFBOR0FSRygocG5nX3N0cnVjdHAKK3BuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGhlaWdodCBpbiBwaXhlbHMuICovCitleHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMiwgcG5nX2dldF9pbWFnZV9oZWlnaHQpIFBOR0FSRygocG5nX3N0cnVjdHAKK3BuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGJpdF9kZXB0aC4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19ieXRlLCBwbmdfZ2V0X2JpdF9kZXB0aCkgUE5HQVJHKChwbmdfc3RydWN0cAorcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7CisKKy8qIFJldHVybnMgaW1hZ2UgY29sb3JfdHlwZS4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19ieXRlLCBwbmdfZ2V0X2NvbG9yX3R5cGUpIFBOR0FSRygocG5nX3N0cnVjdHAKK3BuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGZpbHRlcl90eXBlLiAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX2J5dGUsIHBuZ19nZXRfZmlsdGVyX3R5cGUpIFBOR0FSRygocG5nX3N0cnVjdHAKK3BuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGludGVybGFjZV90eXBlLiAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX2J5dGUsIHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUpIFBOR0FSRygocG5nX3N0cnVjdHAKK3BuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOworCisvKiBSZXR1cm5zIGltYWdlIGNvbXByZXNzaW9uX3R5cGUuICovCitleHRlcm4gUE5HX0VYUE9SVChwbmdfYnl0ZSwgcG5nX2dldF9jb21wcmVzc2lvbl90eXBlKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCitwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpKTsKKworLyogUmV0dXJucyBpbWFnZSByZXNvbHV0aW9uIGluIHBpeGVscyBwZXIgbWV0ZXIsIGZyb20gcEhZcyBjaHVuayBkYXRhLiAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIsIHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcikgUE5HQVJHKChwbmdfc3RydWN0cAorcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7CitleHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMiwgcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIpIFBOR0FSRygocG5nX3N0cnVjdHAKK3BuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIsIHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCitwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpKTsKKworLyogUmV0dXJucyBwaXhlbCBhc3BlY3QgcmF0aW8sIGNvbXB1dGVkIGZyb20gcEhZcyBjaHVuayBkYXRhLiAgKi8KKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVChmbG9hdCwgcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8pIFBOR0FSRygocG5nX3N0cnVjdHAKK3BuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOworI2VuZGlmCisKKy8qIFJldHVybnMgaW1hZ2UgeCwgeSBvZmZzZXQgaW4gcGl4ZWxzIG9yIG1pY3JvbnMsIGZyb20gb0ZGcyBjaHVuayBkYXRhLiAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX2ludF8zMiwgcG5nX2dldF94X29mZnNldF9waXhlbHMpIFBOR0FSRygocG5nX3N0cnVjdHAKK3BuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOworZXh0ZXJuIFBOR19FWFBPUlQocG5nX2ludF8zMiwgcG5nX2dldF95X29mZnNldF9waXhlbHMpIFBOR0FSRygocG5nX3N0cnVjdHAKK3BuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOworZXh0ZXJuIFBOR19FWFBPUlQocG5nX2ludF8zMiwgcG5nX2dldF94X29mZnNldF9taWNyb25zKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCitwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpKTsKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19pbnRfMzIsIHBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucykgUE5HQVJHKChwbmdfc3RydWN0cAorcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7CisKKyNlbmRpZiAvKiBQTkdfRUFTWV9BQ0NFU1NfU1VQUE9SVEVEICovCisKKy8qIFJldHVybnMgcG9pbnRlciB0byBzaWduYXR1cmUgc3RyaW5nIHJlYWQgZnJvbSBQTkcgaGVhZGVyICovCitleHRlcm4gUE5HX0VYUE9SVChwbmdfYnl0ZXAscG5nX2dldF9zaWduYXR1cmUpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKK3BuZ19pbmZvcCBpbmZvX3B0cikpOworCisjaWZkZWYgUE5HX2JLR0RfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2JLR0QpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbG9yXzE2cCAqYmFja2dyb3VuZCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfYktHRF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9iS0dEKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2NIUk0pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgZG91YmxlICp3aGl0ZV94LCBkb3VibGUgKndoaXRlX3ksIGRvdWJsZSAqcmVkX3gsCisgICBkb3VibGUgKnJlZF95LCBkb3VibGUgKmdyZWVuX3gsIGRvdWJsZSAqZ3JlZW5feSwgZG91YmxlICpibHVlX3gsCisgICBkb3VibGUgKmJsdWVfeSkpOworI2VuZGlmCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9jSFJNX2ZpeGVkKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19maXhlZF9wb2ludCAqaW50X3doaXRlX3gsIHBuZ19maXhlZF9wb2ludAorICAgKmludF93aGl0ZV95LCBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfeCwgcG5nX2ZpeGVkX3BvaW50ICppbnRfcmVkX3ksCisgICBwbmdfZml4ZWRfcG9pbnQgKmludF9ncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgKmludF9ncmVlbl95LCBwbmdfZml4ZWRfcG9pbnQKKyAgICppbnRfYmx1ZV94LCBwbmdfZml4ZWRfcG9pbnQgKmludF9ibHVlX3kpKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfY0hSTSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBkb3VibGUgd2hpdGVfeCwgZG91YmxlIHdoaXRlX3ksIGRvdWJsZSByZWRfeCwKKyAgIGRvdWJsZSByZWRfeSwgZG91YmxlIGdyZWVuX3gsIGRvdWJsZSBncmVlbl95LCBkb3VibGUgYmx1ZV94LCBkb3VibGUgYmx1ZV95KSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfY0hSTV9maXhlZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfZml4ZWRfcG9pbnQgaW50X3doaXRlX3gsIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeSwKKyAgIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX3gsIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX3ksIHBuZ19maXhlZF9wb2ludAorICAgaW50X2dyZWVuX3gsIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5feSwgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX3gsCisgICBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfeSkpOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfZ0FNQSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBkb3VibGUgKmZpbGVfZ2FtbWEpKTsKKyNlbmRpZgorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9nQU1BX2ZpeGVkKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19maXhlZF9wb2ludCAqaW50X2ZpbGVfZ2FtbWEpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX2dBTUFfU1VQUE9SVEVECisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2dBTUEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgZG91YmxlIGZpbGVfZ2FtbWEpKTsKKyNlbmRpZgorZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2dBTUFfZml4ZWQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2ZpeGVkX3BvaW50IGludF9maWxlX2dhbW1hKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9oSVNUKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzE2cCAqaGlzdCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfaElTVF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9oSVNUKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzE2cCBoaXN0KSk7CisjZW5kaWYKKworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9JSERSKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyICp3aWR0aCwgcG5nX3VpbnRfMzIgKmhlaWdodCwKKyAgIGludCAqYml0X2RlcHRoLCBpbnQgKmNvbG9yX3R5cGUsIGludCAqaW50ZXJsYWNlX21ldGhvZCwKKyAgIGludCAqY29tcHJlc3Npb25fbWV0aG9kLCBpbnQgKmZpbHRlcl9tZXRob2QpKTsKKworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X0lIRFIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwgaW50IGJpdF9kZXB0aCwKKyAgIGludCBjb2xvcl90eXBlLCBpbnQgaW50ZXJsYWNlX21ldGhvZCwgaW50IGNvbXByZXNzaW9uX21ldGhvZCwKKyAgIGludCBmaWx0ZXJfbWV0aG9kKSk7CisKKyNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfb0ZGcykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfaW50XzMyICpvZmZzZXRfeCwgcG5nX2ludF8zMiAqb2Zmc2V0X3ksCisgICBpbnQgKnVuaXRfdHlwZSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9vRkZzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19pbnRfMzIgb2Zmc2V0X3gsIHBuZ19pbnRfMzIgb2Zmc2V0X3ksCisgICBpbnQgdW5pdF90eXBlKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9wQ0FMKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jaGFycCAqcHVycG9zZSwgcG5nX2ludF8zMiAqWDAsIHBuZ19pbnRfMzIgKlgxLAorICAgaW50ICp0eXBlLCBpbnQgKm5wYXJhbXMsIHBuZ19jaGFycCAqdW5pdHMsIHBuZ19jaGFycHAgKnBhcmFtcykpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfcENBTF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9wQ0FMKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jaGFycCBwdXJwb3NlLCBwbmdfaW50XzMyIFgwLCBwbmdfaW50XzMyIFgxLAorICAgaW50IHR5cGUsIGludCBucGFyYW1zLCBwbmdfY2hhcnAgdW5pdHMsIHBuZ19jaGFycHAgcGFyYW1zKSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9wSFlzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyICpyZXNfeCwgcG5nX3VpbnRfMzIgKnJlc195LCBpbnQgKnVuaXRfdHlwZSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9wSFlzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIHJlc194LCBwbmdfdWludF8zMiByZXNfeSwgaW50IHVuaXRfdHlwZSkpOworI2VuZGlmCisKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfUExURSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY29sb3JwICpwYWxldHRlLCBpbnQgKm51bV9wYWxldHRlKSk7CisKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9QTFRFKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKSk7CisKKyNpZmRlZiBQTkdfc0JJVF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfc0JJVCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY29sb3JfOHAgKnNpZ19iaXQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NCSVRfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc0JJVCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY29sb3JfOHAgc2lnX2JpdCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfc1JHQikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgKmludGVudCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zUkdCKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBpbnRlbnQpKTsKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IGludGVudCkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfaUNDUCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY2hhcnBwIG5hbWUsIGludCAqY29tcHJlc3Npb25fdHlwZSwKKyAgIHBuZ19jaGFycHAgcHJvZmlsZSwgcG5nX3VpbnRfMzIgKnByb2ZsZW4pKTsKKyAgIC8qIE5vdGUgdG8gbWFpbnRhaW5lcjogcHJvZmlsZSBzaG91bGQgYmUgcG5nX2J5dGVwcCAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9pQ0NQKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jaGFycCBuYW1lLCBpbnQgY29tcHJlc3Npb25fdHlwZSwKKyAgIHBuZ19jaGFycCBwcm9maWxlLCBwbmdfdWludF8zMiBwcm9mbGVuKSk7CisgICAvKiBOb3RlIHRvIG1haW50YWluZXI6IHByb2ZpbGUgc2hvdWxkIGJlIHBuZ19ieXRlcCAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfc1BMVCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfc1BMVF90cHAgZW50cmllcykpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zUExUKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19zUExUX3RwIGVudHJpZXMsIGludCBuZW50cmllcykpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKKy8qIHBuZ19nZXRfdGV4dCBhbHNvIHJldHVybnMgdGhlIG51bWJlciBvZiB0ZXh0IGNodW5rcyBpbiAqbnVtX3RleHQgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfdGV4dCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGV4dHAgKnRleHRfcHRyLCBpbnQgKm51bV90ZXh0KSk7CisjZW5kaWYKKworLyoKKyAqICBOb3RlIHdoaWxlIHBuZ19zZXRfdGV4dCgpIHdpbGwgYWNjZXB0IGEgc3RydWN0dXJlIHdob3NlIHRleHQsCisgKiAgbGFuZ3VhZ2UsIGFuZCAgdHJhbnNsYXRlZCBrZXl3b3JkcyBhcmUgTlVMTCBwb2ludGVycywgdGhlIHN0cnVjdHVyZQorICogIHJldHVybmVkIGJ5IHBuZ19nZXRfdGV4dCB3aWxsIGFsd2F5cyBjb250YWluIHJlZ3VsYXIKKyAqICB6ZXJvLXRlcm1pbmF0ZWQgQyBzdHJpbmdzLiAgVGhleSBtaWdodCBiZSBlbXB0eSBzdHJpbmdzIGJ1dAorICogIHRoZXkgd2lsbCBuZXZlciBiZSBOVUxMIHBvaW50ZXJzLgorICovCisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF90ZXh0KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190ZXh0cCB0ZXh0X3B0ciwgaW50IG51bV90ZXh0KSk7CisjZW5kaWYKKworI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF90SU1FKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190aW1lcCAqbW9kX3RpbWUpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3RJTUVfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfdElNRSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGltZXAgbW9kX3RpbWUpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3RSTlMpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2J5dGVwICp0cmFucywgaW50ICpudW1fdHJhbnMsCisgICBwbmdfY29sb3JfMTZwICp0cmFuc192YWx1ZXMpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfdFJOUykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfYnl0ZXAgdHJhbnMsIGludCBudW1fdHJhbnMsCisgICBwbmdfY29sb3JfMTZwIHRyYW5zX3ZhbHVlcykpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfdFJOU19TVVBQT1JURUQKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9zQ0FMKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIGludCAqdW5pdCwgZG91YmxlICp3aWR0aCwgZG91YmxlICpoZWlnaHQpKTsKKyNlbHNlCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9zQ0FMX3MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50ICp1bml0LCBwbmdfY2hhcnBwIHN3aWR0aCwgcG5nX2NoYXJwcCBzaGVpZ2h0KSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8qIFBOR19zQ0FMX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3NDQUwpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IHVuaXQsIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkpOworI2Vsc2UKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc0NBTF9zKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIGludCB1bml0LCBwbmdfY2hhcnAgc3dpZHRoLCBwbmdfY2hhcnAgc2hlaWdodCkpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfc0NBTF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX3NDQUxfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECisvKiBQcm92aWRlIGEgbGlzdCBvZiBjaHVua3MgYW5kIGhvdyB0aGV5IGFyZSB0byBiZSBoYW5kbGVkLCBpZiB0aGUgYnVpbHQtaW4KKyAgIGhhbmRsaW5nIG9yIGRlZmF1bHQgdW5rbm93biBjaHVuayBoYW5kbGluZyBpcyBub3QgZGVzaXJlZC4gIEFueSBjaHVua3Mgbm90CisgICBsaXN0ZWQgd2lsbCBiZSBoYW5kbGVkIGluIHRoZSBkZWZhdWx0IG1hbm5lci4gIFRoZSBJSERSIGFuZCBJRU5EIGNodW5rcworICAgbXVzdCBub3QgYmUgbGlzdGVkLgorICAgICAga2VlcCA9IDA6IGZvbGxvdyBkZWZhdWx0IGJlaGF2aW91cgorICAgICAgICAgICA9IDE6IGRvIG5vdCBrZWVwCisgICAgICAgICAgID0gMjoga2VlcCBvbmx5IGlmIHNhZmUtdG8tY29weQorICAgICAgICAgICA9IDM6IGtlZXAgZXZlbiBpZiB1bnNhZmUtdG8tY29weQorKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQsIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcykgUE5HQVJHKChwbmdfc3RydWN0cAorICAgcG5nX3B0ciwgaW50IGtlZXAsIHBuZ19ieXRlcCBjaHVua19saXN0LCBpbnQgbnVtX2NodW5rcykpOworUE5HX0VYUE9SVChpbnQscG5nX2hhbmRsZV9hc191bmtub3duKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcAorICAgY2h1bmtfbmFtZSkpOworI2VuZGlmCisjaWZkZWYgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQodm9pZCwgcG5nX3NldF91bmtub3duX2NodW5rcykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdW5rbm93bl9jaHVua3AgdW5rbm93bnMsIGludCBudW1fdW5rbm93bnMpKTsKK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQsIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbikKKyAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgY2h1bmssIGludCBsb2NhdGlvbikpOworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF91bmtub3duX2NodW5rcykgUE5HQVJHKChwbmdfc3RydWN0cAorICAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdW5rbm93bl9jaHVua3BwIGVudHJpZXMpKTsKKyNlbmRpZgorCisvKiBQbmdfZnJlZV9kYXRhKCkgd2lsbCB0dXJuIG9mZiB0aGUgInZhbGlkIiBmbGFnIGZvciBhbnl0aGluZyBpdCBmcmVlcy4KKyAqIElmIHlvdSBuZWVkIHRvIHR1cm4gaXQgb2ZmIGZvciBhIGNodW5rIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBoYXMgZnJlZWQsCisgKiB5b3UgY2FuIHVzZSBwbmdfc2V0X2ludmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX0NITkspOworICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLCBwbmdfc2V0X2ludmFsaWQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IG1hc2spKTsKKworI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAorLyogVGhlICJwYXJhbXMiIHBvaW50ZXIgaXMgY3VycmVudGx5IG5vdCB1c2VkIGFuZCBpcyBmb3IgZnV0dXJlIGV4cGFuc2lvbi4gKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQsIHBuZ19yZWFkX3BuZykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2luZm9wIGluZm9fcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdm9pZHAgcGFyYW1zKSk7CitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLCBwbmdfd3JpdGVfcG5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfaW5mb3AgaW5mb19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNmb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ192b2lkcCBwYXJhbXMpKTsKKyNlbmRpZgorCisvKiBEZWZpbmUgUE5HX0RFQlVHIGF0IGNvbXBpbGUgdGltZSBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSGlnaGVyCisgKiBudW1iZXJzIGZvciBQTkdfREVCVUcgbWVhbiBtb3JlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaGFzCisgKiBvbmx5IGJlZW4gYWRkZWQgc2luY2UgdmVyc2lvbiAwLjk1IHNvIGl0IGlzIG5vdCBpbXBsZW1lbnRlZCB0aHJvdWdob3V0CisgKiBsaWJwbmcgeWV0LCBidXQgbW9yZSBzdXBwb3J0IHdpbGwgYmUgYWRkZWQgYXMgbmVlZGVkLgorICovCisjaWZkZWYgUE5HX0RFQlVHCisjaWYgKFBOR19ERUJVRyA+IDApCisjaWYgIWRlZmluZWQoUE5HX0RFQlVHX0ZJTEUpICYmIGRlZmluZWQoX01TQ19WRVIpCisjaW5jbHVkZSA8Y3J0ZGJnLmg+CisjaWYgKFBOR19ERUJVRyA+IDEpCisjaWZuZGVmIF9ERUJVRworIyAgZGVmaW5lIF9ERUJVRworI2VuZGlmCisjaWZuZGVmIHBuZ19kZWJ1ZworI2RlZmluZSBwbmdfZGVidWcobCxtKSAgX1JQVDAoX0NSVF9XQVJOLG0gUE5HX1NUUklOR19ORVdMSU5FKQorI2VuZGlmCisjaWZuZGVmIHBuZ19kZWJ1ZzEKKyNkZWZpbmUgcG5nX2RlYnVnMShsLG0scDEpICBfUlBUMShfQ1JUX1dBUk4sbSBQTkdfU1RSSU5HX05FV0xJTkUscDEpCisjZW5kaWYKKyNpZm5kZWYgcG5nX2RlYnVnMgorI2RlZmluZSBwbmdfZGVidWcyKGwsbSxwMSxwMikgX1JQVDIoX0NSVF9XQVJOLG0gUE5HX1NUUklOR19ORVdMSU5FLHAxLHAyKQorI2VuZGlmCisjZW5kaWYKKyNlbHNlIC8qIFBOR19ERUJVR19GSUxFIHx8ICFfTVNDX1ZFUiAqLworI2lmbmRlZiBQTkdfREVCVUdfRklMRQorI2RlZmluZSBQTkdfREVCVUdfRklMRSBzdGRlcnIKKyNlbmRpZiAvKiBQTkdfREVCVUdfRklMRSAqLworCisjaWYgKFBOR19ERUJVRyA+IDEpCisvKiBOb3RlOiBbIiVzIm0gUE5HX1NUUklOR19ORVdMSU5FXSBwcm9iYWJseSBkb2VzIG5vdCB3b3JrIG9uIG5vbi1JU08KKyAqIGNvbXBpbGVycy4KKyAqLworIyAgaWZkZWYgX19TVERDX18KKyMgICAgaWZuZGVmIHBuZ19kZWJ1ZworIyAgICAgIGRlZmluZSBwbmdfZGVidWcobCxtKSBcCisgICAgICAgeyBcCisgICAgICAgaW50IG51bV90YWJzPWw7IFwKKyAgICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLCIlcyJtIFBOR19TVFJJTkdfTkVXTElORSwobnVtX3RhYnM9PTEgPyAiXHQiIDogXAorICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSkpOyBcCisgICAgICAgfQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgcG5nX2RlYnVnMQorIyAgICAgIGRlZmluZSBwbmdfZGVidWcxKGwsbSxwMSkgXAorICAgICAgIHsgXAorICAgICAgIGludCBudW1fdGFicz1sOyBcCisgICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSwiJXMibSBQTkdfU1RSSU5HX05FV0xJTkUsKG51bV90YWJzPT0xID8gIlx0IiA6IFwKKyAgICAgICAgIChudW1fdGFicz09MiA/ICJcdFx0IjoobnVtX3RhYnM+MiA/ICJcdFx0XHQiOiIiKSkpLHAxKTsgXAorICAgICAgIH0KKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIHBuZ19kZWJ1ZzIKKyMgICAgICBkZWZpbmUgcG5nX2RlYnVnMihsLG0scDEscDIpIFwKKyAgICAgICB7IFwKKyAgICAgICBpbnQgbnVtX3RhYnM9bDsgXAorICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsIiVzIm0gUE5HX1NUUklOR19ORVdMSU5FLChudW1fdGFicz09MSA/ICJcdCIgOiBcCisgICAgICAgICAobnVtX3RhYnM9PTIgPyAiXHRcdCI6KG51bV90YWJzPjIgPyAiXHRcdFx0IjoiIikpKSxwMSxwMik7IFwKKyAgICAgICB9CisjICAgIGVuZGlmCisjICBlbHNlIC8qIF9fU1REQyBfXyAqLworIyAgICBpZm5kZWYgcG5nX2RlYnVnCisjICAgICAgZGVmaW5lIHBuZ19kZWJ1ZyhsLG0pIFwKKyAgICAgICB7IFwKKyAgICAgICBpbnQgbnVtX3RhYnM9bDsgXAorICAgICAgIGNoYXIgZm9ybWF0WzI1Nl07IFwKKyAgICAgICBzbnByaW50Zihmb3JtYXQsMjU2LCIlcyVzJXMiLChudW1fdGFicz09MSA/ICJcdCIgOiBcCisgICAgICAgICAobnVtX3RhYnM9PTIgPyAiXHRcdCI6KG51bV90YWJzPjIgPyAiXHRcdFx0IjoiIikpKSwgXAorICAgICAgICAgbSxQTkdfU1RSSU5HX05FV0xJTkUpOyBcCisgICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSxmb3JtYXQpOyBcCisgICAgICAgfQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgcG5nX2RlYnVnMQorIyAgICAgIGRlZmluZSBwbmdfZGVidWcxKGwsbSxwMSkgXAorICAgICAgIHsgXAorICAgICAgIGludCBudW1fdGFicz1sOyBcCisgICAgICAgY2hhciBmb3JtYXRbMjU2XTsgXAorICAgICAgIHNucHJpbnRmKGZvcm1hdCwyNTYsIiVzJXMlcyIsKG51bV90YWJzPT0xID8gIlx0IiA6IFwKKyAgICAgICAgIChudW1fdGFicz09MiA/ICJcdFx0IjoobnVtX3RhYnM+MiA/ICJcdFx0XHQiOiIiKSkpLCBcCisgICAgICAgICBtLFBOR19TVFJJTkdfTkVXTElORSk7IFwKKyAgICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLGZvcm1hdCxwMSk7IFwKKyAgICAgICB9CisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBwbmdfZGVidWcyCisjICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzIobCxtLHAxLHAyKSBcCisgICAgICAgeyBcCisgICAgICAgaW50IG51bV90YWJzPWw7IFwKKyAgICAgICBjaGFyIGZvcm1hdFsyNTZdOyBcCisgICAgICAgc25wcmludGYoZm9ybWF0LDI1NiwiJXMlcyVzIiwobnVtX3RhYnM9PTEgPyAiXHQiIDogXAorICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSksIFwKKyAgICAgICAgIG0sUE5HX1NUUklOR19ORVdMSU5FKTsgXAorICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsZm9ybWF0LHAxLHAyKTsgXAorICAgICAgIH0KKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qIF9fU1REQyBfXyAqLworI2VuZGlmIC8qIChQTkdfREVCVUcgPiAxKSAqLworCisjZW5kaWYgLyogX01TQ19WRVIgKi8KKyNlbmRpZiAvKiAoUE5HX0RFQlVHID4gMCkgKi8KKyNlbmRpZiAvKiBQTkdfREVCVUcgKi8KKyNpZm5kZWYgcG5nX2RlYnVnCisjZGVmaW5lIHBuZ19kZWJ1ZyhsLCBtKQorI2VuZGlmCisjaWZuZGVmIHBuZ19kZWJ1ZzEKKyNkZWZpbmUgcG5nX2RlYnVnMShsLCBtLCBwMSkKKyNlbmRpZgorI2lmbmRlZiBwbmdfZGVidWcyCisjZGVmaW5lIHBuZ19kZWJ1ZzIobCwgbSwgcDEsIHAyKQorI2VuZGlmCisKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19jaGFycCxwbmdfZ2V0X2NvcHlyaWdodCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CitleHRlcm4gUE5HX0VYUE9SVChwbmdfY2hhcnAscG5nX2dldF9oZWFkZXJfdmVyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19jaGFycCxwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19jaGFycCxwbmdfZ2V0X2xpYnBuZ192ZXIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworCisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCisgICBwbmdfcHRyLCBwbmdfdWludF8zMiBtbmdfZmVhdHVyZXNfcGVybWl0dGVkKSk7CisjZW5kaWYKKworLyogRm9yIHVzZSBpbiBwbmdfc2V0X2tlZXBfdW5rbm93biwgYWRkZWQgdG8gdmVyc2lvbiAxLjIuNiAqLworI2RlZmluZSBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgICAwCisjZGVmaW5lIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgICAgICAgIDEKKyNkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgorI2RlZmluZSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyAgICAgICAzCisKKy8qIEFkZGVkIHRvIHZlcnNpb24gMS4yLjAgKi8KKyNpZmRlZiBQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVECisjaWZkZWYgUE5HX01NWF9DT0RFX1NVUFBPUlRFRAorI2RlZmluZSBQTkdfQVNNX0ZMQUdfTU1YX1NVUFBPUlRfQ09NUElMRUQgIDB4MDEgIC8qIG5vdCB1c2VyLXNldHRhYmxlICovCisjZGVmaW5lIFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9JTl9DUFUgICAgMHgwMiAgLyogbm90IHVzZXItc2V0dGFibGUgKi8KKyNkZWZpbmUgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0NPTUJJTkVfUk9XICAweDA0CisjZGVmaW5lIFBOR19BU01fRkxBR19NTVhfUkVBRF9JTlRFUkxBQ0UgICAgMHgwOAorI2RlZmluZSBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1NVQiAgIDB4MTAKKyNkZWZpbmUgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9VUCAgICAweDIwCisjZGVmaW5lIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfQVZHICAgMHg0MAorI2RlZmluZSBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1BBRVRIIDB4ODAKKyNkZWZpbmUgUE5HX0FTTV9GTEFHU19JTklUSUFMSVpFRCAgICAgICAgICAweDgwMDAwMDAwICAvKiBub3QgdXNlci1zZXR0YWJsZSAqLworCisjZGVmaW5lIFBOR19NTVhfUkVBRF9GTEFHUyAoIFBOR19BU01fRkxBR19NTVhfUkVBRF9DT01CSU5FX1JPVyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9TVUIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfVVAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9QQUVUSCApCisjZGVmaW5lIFBOR19NTVhfV1JJVEVfRkxBR1MgKCAwICkKKworI2RlZmluZSBQTkdfTU1YX0ZMQUdTICggUE5HX0FTTV9GTEFHX01NWF9TVVBQT1JUX0NPTVBJTEVEIFwKKyAgICAgICAgICAgICAgICAgICAgICB8IFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9JTl9DUFUgICBcCisgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfTU1YX1JFQURfRkxBR1MgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHwgUE5HX01NWF9XUklURV9GTEFHUyApCisKKyNkZWZpbmUgUE5HX1NFTEVDVF9SRUFEICAgMQorI2RlZmluZSBQTkdfU0VMRUNUX1dSSVRFICAyCisjZW5kaWYgLyogUE5HX01NWF9DT0RFX1NVUFBPUlRFRCAqLworCisjaWZuZGVmIFBOR18xXzBfWAorLyogcG5nZ2V0LmMgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfbW14X2ZsYWdtYXNrKQorICAgUE5HQVJHKChpbnQgZmxhZ19zZWxlY3QsIGludCAqY29tcGlsZXJJRCkpOworCisvKiBwbmdnZXQuYyAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9hc21fZmxhZ21hc2spCisgICBQTkdBUkcoKGludCBmbGFnX3NlbGVjdCkpOworCisvKiBwbmdnZXQuYyAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9hc21fZmxhZ3MpCisgICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKKworLyogcG5nZ2V0LmMgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHBuZ19ieXRlLHBuZ19nZXRfbW14X2JpdGRlcHRoX3RocmVzaG9sZCkKKyAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOworCisvKiBwbmdnZXQuYyAqLworZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9tbXhfcm93Ynl0ZXNfdGhyZXNob2xkKQorICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisKKy8qIHBuZ3NldC5jICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfYXNtX2ZsYWdzKQorICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBhc21fZmxhZ3MpKTsKKworLyogcG5nc2V0LmMgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9tbXhfdGhyZXNob2xkcykKKyAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGUgbW14X2JpdGRlcHRoX3RocmVzaG9sZCwKKyAgIHBuZ191aW50XzMyIG1teF9yb3dieXRlc190aHJlc2hvbGQpKTsKKworI2VuZGlmIC8qIFBOR18xXzBfWCAqLworCisjaWZuZGVmIFBOR18xXzBfWAorLyogcG5nLmMsIHBuZ2djY3JkLmMsIG9yIHBuZ3ZjcmQuYyAqLworZXh0ZXJuIFBOR19FWFBPUlQoaW50LHBuZ19tbXhfc3VwcG9ydCkgUE5HQVJHKCh2b2lkKSk7CisjZW5kaWYgLyogUE5HXzFfMF9YICovCisjZW5kaWYgLyogUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRCAqLworCisvKiBTdHJpcCB0aGUgcHJlcGVuZGVkIGVycm9yIG51bWJlcnMgKCIjbm5uICIpIGZyb20gZXJyb3IgYW5kIHdhcm5pbmcKKyAqIG1lc3NhZ2VzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGVycm9yIG9yIHdhcm5pbmcgaGFuZGxlci4KKyAqLworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMpIFBOR0FSRygocG5nX3N0cnVjdHAKKyAgIHBuZ19wdHIsIHBuZ191aW50XzMyIHN0cmlwX21vZGUpKTsKKyNlbmRpZgorCisvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjYgKi8KKyNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3VzZXJfbGltaXRzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCisgICBwbmdfcHRyLCBwbmdfdWludF8zMiB1c2VyX3dpZHRoX21heCwgcG5nX3VpbnRfMzIgdXNlcl9oZWlnaHRfbWF4KSk7CitleHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCisgICBwbmdfcHRyKSk7CitleHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heCkgUE5HQVJHKChwbmdfc3RydWN0cAorICAgcG5nX3B0cikpOworI2VuZGlmCisvKiBNYWludGFpbmVyOiBQdXQgbmV3IHB1YmxpYyBwcm90b3R5cGVzIGhlcmUgXiwgaW4gbGlicG5nLjMsIGFuZCBpbgorICogcHJvamVjdCBkZWZzCisgKi8KKworI2lmZGVmIFBOR19SRUFEX0NPTVBPU0lURV9OT0RJVl9TVVBQT1JURUQKKy8qIFdpdGggdGhlc2Ugcm91dGluZXMgd2UgYXZvaWQgYW4gaW50ZWdlciBkaXZpZGUsIHdoaWNoIHdpbGwgYmUgc2xvd2VyIG9uCisgKiBtb3N0IG1hY2hpbmVzLiAgSG93ZXZlciwgaXQgZG9lcyB0YWtlIG1vcmUgb3BlcmF0aW9ucyB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCisgKiBkaXZpZGUgbWV0aG9kLCBzbyBpdCBtYXkgYmUgc2xvd2VyIG9uIGEgZmV3IFJJU0Mgc3lzdGVtcy4gIFRoZXJlIGFyZSB0d28KKyAqIHNoaWZ0cyAoYnkgOCBvciAxNiBiaXRzKSBhbmQgYW4gYWRkaXRpb24sIHZlcnN1cyBhIHNpbmdsZSBpbnRlZ2VyIGRpdmlkZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHJvdW5kaW5nIGZhY3RvcnMgYXJlIE5PVCBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSEgIDEyOCBhbmQKKyAqIDMyNzY4IGFyZSBjb3JyZWN0IGZvciB0aGUgTk9ESVYgY29kZTsgMTI3IGFuZCAzMjc2NyBhcmUgY29ycmVjdCBmb3IgdGhlCisgKiBzdGFuZGFyZCBtZXRob2QuCisgKgorICogW09wdGltaXplZCBjb2RlIGJ5IEdyZWcgUm9lbG9mcyBhbmQgTWFyayBBZGxlci4uLmJsYW1lIHVzIGZvciBidWdzLiA6LSkgXQorICovCisKKyAvKiBmZyBhbmQgYmcgc2hvdWxkIGJlIGluIGBnYW1tYSAxLjAnIHNwYWNlOyBhbHBoYSBpcyB0aGUgb3BhY2l0eSAgICAgICAgICAqLworCisjICBkZWZpbmUgcG5nX2NvbXBvc2l0ZShjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyBwbmdfdWludF8xNiB0ZW1wID0gKHBuZ191aW50XzE2KSgocG5nX3VpbnRfMTYpKGZnKSAqIChwbmdfdWludF8xNikoYWxwaGEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgICAgICAgIChwbmdfdWludF8xNikoYmcpKihwbmdfdWludF8xNikoMjU1IC0gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKHBuZ191aW50XzE2KShhbHBoYSkpICsgKHBuZ191aW50XzE2KTEyOCk7ICAgICAgICAgICBcCisgICAgICAgKGNvbXBvc2l0ZSkgPSAocG5nX2J5dGUpKCh0ZW1wICsgKHRlbXAgPj4gOCkpID4+IDgpOyB9CisKKyMgIGRlZmluZSBwbmdfY29tcG9zaXRlXzE2KGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7IHBuZ191aW50XzMyIHRlbXAgPSAocG5nX3VpbnRfMzIpKChwbmdfdWludF8zMikoZmcpICogKHBuZ191aW50XzMyKShhbHBoYSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgKyAocG5nX3VpbnRfMzIpKGJnKSoocG5nX3VpbnRfMzIpKDY1NTM1TCAtICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKGFscGhhKSkgKyAocG5nX3VpbnRfMzIpMzI3NjhMKTsgICAgICAgIFwKKyAgICAgICAoY29tcG9zaXRlKSA9IChwbmdfdWludF8xNikoKHRlbXAgKyAodGVtcCA+PiAxNikpID4+IDE2KTsgfQorCisjZWxzZSAgLyogU3RhbmRhcmQgbWV0aG9kIHVzaW5nIGludGVnZXIgZGl2aXNpb24gKi8KKworIyAgZGVmaW5lIHBuZ19jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChjb21wb3NpdGUpID0gKHBuZ19ieXRlKSgoKHBuZ191aW50XzE2KShmZykgKiAocG5nX3VpbnRfMTYpKGFscGhhKSArICAgIFwKKyAgICAgICAocG5nX3VpbnRfMTYpKGJnKSAqIChwbmdfdWludF8xNikoMjU1IC0gKHBuZ191aW50XzE2KShhbHBoYSkpICsgICAgICAgXAorICAgICAgIChwbmdfdWludF8xNikxMjcpIC8gMjU1KQorCisjICBkZWZpbmUgcG5nX2NvbXBvc2l0ZV8xNihjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKGNvbXBvc2l0ZSkgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMzIpKGZnKSAqIChwbmdfdWludF8zMikoYWxwaGEpICsgXAorICAgICAgIChwbmdfdWludF8zMikoYmcpKihwbmdfdWludF8zMikoNjU1MzVMIC0gKHBuZ191aW50XzMyKShhbHBoYSkpICsgICAgICBcCisgICAgICAgKHBuZ191aW50XzMyKTMyNzY3KSAvIChwbmdfdWludF8zMik2NTUzNUwpCisKKyNlbmRpZiAvKiBQTkdfUkVBRF9DT01QT1NJVEVfTk9ESVZfU1VQUE9SVEVEICovCisKKy8qIElubGluZSBtYWNyb3MgdG8gZG8gZGlyZWN0IHJlYWRzIG9mIGJ5dGVzIGZyb20gdGhlIGlucHV0IGJ1ZmZlci4gIFRoZXNlCisgKiByZXF1aXJlIHRoYXQgeW91IGFyZSB1c2luZyBhbiBhcmNoaXRlY3R1cmUgdGhhdCB1c2VzIFBORyBieXRlIG9yZGVyaW5nCisgKiAoTVNCIGZpcnN0KSBhbmQgc3VwcG9ydHMgdW5hbGlnbmVkIGRhdGEgc3RvcmFnZS4gIEkgdGhpbmsgdGhhdCBQb3dlclBDCisgKiBpbiBiaWctZW5kaWFuIG1vZGUgYW5kIDY4MHgwIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgd2lsbCBzdXBwb3J0IHRoaXMuCisgKiBUaGUgeDg2IGxpbmUgb2YgcHJvY2Vzc29ycyBkZWZpbml0ZWx5IGRvIG5vdC4gIFRoZSBwbmdfZ2V0X2ludF8zMigpCisgKiByb3V0aW5lIGFsc28gYXNzdW1lcyB3ZSBhcmUgdXNpbmcgdHdvJ3MgY29tcGxlbWVudCBmb3JtYXQgZm9yIG5lZ2F0aXZlCisgKiB2YWx1ZXMsIHdoaWNoIGlzIGFsbW9zdCBjZXJ0YWlubHkgdHJ1ZS4KKyAqLworI2lmZGVmIFBOR19SRUFEX0JJR19FTkRJQU5fU1VQUE9SVEVECisjICBkZWZpbmUgcG5nX2dldF91aW50XzMyKGJ1ZikgKCAqKChwbmdfdWludF8zMnApIChidWYpKSkKKyMgIGRlZmluZSBwbmdfZ2V0X3VpbnRfMTYoYnVmKSAoICooKHBuZ191aW50XzE2cCkgKGJ1ZikpKQorIyAgZGVmaW5lIHBuZ19nZXRfaW50XzMyKGJ1ZikgICggKigocG5nX2ludF8zMnApICAoYnVmKSkpCisjZWxzZQorZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF91aW50XzMyKSBQTkdBUkcoKHBuZ19ieXRlcCBidWYpKTsKK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzE2LHBuZ19nZXRfdWludF8xNikgUE5HQVJHKChwbmdfYnl0ZXAgYnVmKSk7CitleHRlcm4gUE5HX0VYUE9SVChwbmdfaW50XzMyLHBuZ19nZXRfaW50XzMyKSBQTkdBUkcoKHBuZ19ieXRlcCBidWYpKTsKKyNlbmRpZiAvKiAhUE5HX1JFQURfQklHX0VORElBTl9TVVBQT1JURUQgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfdWludF8zMSkKKyAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmKSk7CisvKiBObyBwbmdfZ2V0X2ludF8xNiAtLSBtYXkgYmUgYWRkZWQgaWYgdGhlcmUncyBhIHJlYWwgbmVlZCBmb3IgaXQuICovCisKKy8qIFBsYWNlIGEgMzItYml0IG51bWJlciBpbnRvIGEgYnVmZmVyIGluIFBORyBieXRlIG9yZGVyIChiaWctZW5kaWFuKS4KKyAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2F2ZV91aW50XzMyKQorICAgUE5HQVJHKChwbmdfYnl0ZXAgYnVmLCBwbmdfdWludF8zMiBpKSk7CitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zYXZlX2ludF8zMikKKyAgIFBOR0FSRygocG5nX2J5dGVwIGJ1ZiwgcG5nX2ludF8zMiBpKSk7CisKKy8qIFBsYWNlIGEgMTYtYml0IG51bWJlciBpbnRvIGEgYnVmZmVyIGluIFBORyBieXRlIG9yZGVyLgorICogVGhlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCB1bnNpZ25lZCBpbnQsIG5vdCBwbmdfdWludF8xNiwKKyAqIGp1c3QgdG8gYXZvaWQgcG90ZW50aWFsIHByb2JsZW1zIG9uIHByZS1BTlNJIEMgY29tcGlsZXJzLgorICovCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zYXZlX3VpbnRfMTYpCisgICBQTkdBUkcoKHBuZ19ieXRlcCBidWYsIHVuc2lnbmVkIGludCBpKSk7CisvKiBObyBwbmdfc2F2ZV9pbnRfMTYgLS0gbWF5IGJlIGFkZGVkIGlmIHRoZXJlJ3MgYSByZWFsIG5lZWQgZm9yIGl0LiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIFRoZXNlIG5leHQgZnVuY3Rpb25zIGFyZSB1c2VkIGludGVybmFsbHkgaW4gdGhlIGNvZGUuICBUaGV5IGdlbmVyYWxseQorICogc2hvdWxkbid0IGJlIHVzZWQgdW5sZXNzIHlvdSBhcmUgd3JpdGluZyBjb2RlIHRvIGFkZCBvciByZXBsYWNlIHNvbWUKKyAqIGZ1bmN0aW9uYWxpdHkgaW4gbGlicG5nLiAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBtb3N0IGZ1bmN0aW9ucyBjYW4KKyAqIGJlIGZvdW5kIGluIHRoZSBmaWxlcyB3aGVyZSB0aGUgZnVuY3Rpb25zIGFyZSBsb2NhdGVkLgorICovCisKKworLyogVmFyaW91cyBtb2RlcyBvZiBvcGVyYXRpb24sIHRoYXQgYXJlIHZpc2libGUgdG8gYXBwbGljYXRpb25zIGJlY2F1c2UKKyAqIHRoZXkgYXJlIHVzZWQgZm9yIHVua25vd24gY2h1bmsgbG9jYXRpb24uCisgKi8KKyNkZWZpbmUgUE5HX0hBVkVfSUhEUiAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUE5HX0hBVkVfUExURSAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUE5HX0hBVkVfSURBVCAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUE5HX0FGVEVSX0lEQVQgICAgICAgICAgICAgIDB4MDggLyogSGF2ZSBjb21wbGV0ZSB6bGliIGRhdGFzdHJlYW0gKi8KKyNkZWZpbmUgUE5HX0hBVkVfSUVORCAgICAgICAgICAgICAgIDB4MTAKKworI2lmZGVmIFBOR19JTlRFUk5BTAorCisvKiBNb3JlIG1vZGVzIG9mIG9wZXJhdGlvbi4gIE5vdGUgdGhhdCBhZnRlciBhbiBpbml0LCBtb2RlIGlzIHNldCB0bworICogemVybyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHN0cnVjdHVyZSBpcyBjcmVhdGVkLgorICovCisjZGVmaW5lIFBOR19IQVZFX2dBTUEgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIFBOR19IQVZFX2NIUk0gICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFBOR19IQVZFX3NSR0IgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFBOR19IQVZFX0NIVU5LX0hFQURFUiAgICAgIDB4MTAwCisjZGVmaW5lIFBOR19XUk9URV90SU1FICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIFBOR19XUk9URV9JTkZPX0JFRk9SRV9QTFRFIDB4NDAwCisjZGVmaW5lIFBOR19CQUNLR1JPVU5EX0lTX0dSQVkgICAgIDB4ODAwCisjZGVmaW5lIFBOR19IQVZFX1BOR19TSUdOQVRVUkUgICAgMHgxMDAwCisjZGVmaW5lIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQgMHgyMDAwIC8qIEhhdmUgYW5vdGhlciBjaHVuayBhZnRlciBJREFUICovCisKKy8qIEZsYWdzIGZvciB0aGUgdHJhbnNmb3JtYXRpb25zIHRoZSBQTkcgbGlicmFyeSBkb2VzIG9uIHRoZSBpbWFnZSBkYXRhICovCisjZGVmaW5lIFBOR19CR1IgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBOR19JTlRFUkxBQ0UgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBOR19QQUNLICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFBOR19TSElGVCAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFBOR19TV0FQX0JZVEVTICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFBOR19JTlZFUlRfTU9OTyAgICAgICAgMHgwMDIwCisjZGVmaW5lIFBOR19ESVRIRVIgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFBOR19CQUNLR1JPVU5EICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFBOR19CQUNLR1JPVU5EX0VYUEFORCAgMHgwMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMHgwMjAwIHVudXNlZCAqLworI2RlZmluZSBQTkdfMTZfVE9fOCAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBQTkdfUkdCQSAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBQTkdfRVhQQU5EICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBQTkdfR0FNTUEgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBQTkdfR1JBWV9UT19SR0IgICAgICAgIDB4NDAwMAorI2RlZmluZSBQTkdfRklMTEVSICAgICAgICAgICAgIDB4ODAwMEwKKyNkZWZpbmUgUE5HX1BBQ0tTV0FQICAgICAgICAgIDB4MTAwMDBMCisjZGVmaW5lIFBOR19TV0FQX0FMUEhBICAgICAgICAweDIwMDAwTAorI2RlZmluZSBQTkdfU1RSSVBfQUxQSEEgICAgICAgMHg0MDAwMEwKKyNkZWZpbmUgUE5HX0lOVkVSVF9BTFBIQSAgICAgIDB4ODAwMDBMCisjZGVmaW5lIFBOR19VU0VSX1RSQU5TRk9STSAgIDB4MTAwMDAwTAorI2RlZmluZSBQTkdfUkdCX1RPX0dSQVlfRVJSICAweDIwMDAwMEwKKyNkZWZpbmUgUE5HX1JHQl9UT19HUkFZX1dBUk4gMHg0MDAwMDBMCisjZGVmaW5lIFBOR19SR0JfVE9fR1JBWSAgICAgIDB4NjAwMDAwTCAgLyogdHdvIGJpdHMsIFJHQl9UT19HUkFZX0VSUnxXQVJOICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDB4ODAwMDAwTCAgICAgVW51c2VkICovCisjZGVmaW5lIFBOR19BRERfQUxQSEEgICAgICAgMHgxMDAwMDAwTCAgLyogQWRkZWQgdG8gbGlicG5nLTEuMi43ICovCisjZGVmaW5lIFBOR19FWFBBTkRfdFJOUyAgICAgMHgyMDAwMDAwTCAgLyogQWRkZWQgdG8gbGlicG5nLTEuMi45ICovCisjZGVmaW5lIFBOR19QUkVNVUxUSVBMWV9BTFBIQSAweDQwMDAwMDBMICAvKiBBZGRlZCB0byBsaWJwbmctMS4yLjQxICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBieSB2b2xrZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDgwMDAwMDBMICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4MTAwMDAwMDBMICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4MjAwMDAwMDBMICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4NDAwMDAwMDBMICB1bnVzZWQgKi8KKworLyogRmxhZ3MgZm9yIHBuZ19jcmVhdGVfc3RydWN0ICovCisjZGVmaW5lIFBOR19TVFJVQ1RfUE5HICAgMHgwMDAxCisjZGVmaW5lIFBOR19TVFJVQ1RfSU5GTyAgMHgwMDAyCisKKy8qIFNjYWxpbmcgZmFjdG9yIGZvciBmaWx0ZXIgaGV1cmlzdGljIHdlaWdodGluZyBjYWxjdWxhdGlvbnMgKi8KKyNkZWZpbmUgUE5HX1dFSUdIVF9TSElGVCA4CisjZGVmaW5lIFBOR19XRUlHSFRfRkFDVE9SICgxPDwoUE5HX1dFSUdIVF9TSElGVCkpCisjZGVmaW5lIFBOR19DT1NUX1NISUZUIDMKKyNkZWZpbmUgUE5HX0NPU1RfRkFDVE9SICgxPDwoUE5HX0NPU1RfU0hJRlQpKQorCisvKiBGbGFncyBmb3IgdGhlIHBuZ19wdHItPmZsYWdzIHJhdGhlciB0aGFuIGRlY2xhcmluZyBhIGJ5dGUgZm9yIGVhY2ggb25lICovCisjZGVmaW5lIFBOR19GTEFHX1pMSUJfQ1VTVE9NX1NUUkFURUdZICAgICAweDAwMDEKKyNkZWZpbmUgUE5HX0ZMQUdfWkxJQl9DVVNUT01fTEVWRUwgICAgICAgIDB4MDAwMgorI2RlZmluZSBQTkdfRkxBR19aTElCX0NVU1RPTV9NRU1fTEVWRUwgICAgMHgwMDA0CisjZGVmaW5lIFBOR19GTEFHX1pMSUJfQ1VTVE9NX1dJTkRPV19CSVRTICAweDAwMDgKKyNkZWZpbmUgUE5HX0ZMQUdfWkxJQl9DVVNUT01fTUVUSE9EICAgICAgIDB4MDAxMAorI2RlZmluZSBQTkdfRkxBR19aTElCX0ZJTklTSEVEICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFBOR19GTEFHX1JPV19JTklUICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUE5HX0ZMQUdfRklMTEVSX0FGVEVSICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSAgICAgICAgMHgwMTAwCisjZGVmaW5lIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOICAgICAweDAyMDAKKyNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX1VTRSAgICAgICAgIDB4MDQwMAorI2RlZmluZSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFICAgICAgMHgwODAwCisjZGVmaW5lIFBOR19GTEFHX0ZSRUVfUExURSAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgUE5HX0ZMQUdfRlJFRV9UUk5TICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBQTkdfRkxBR19GUkVFX0hJU1QgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFBOR19GTEFHX0tFRVBfVU5LTk9XTl9DSFVOS1MgICAgICAweDgwMDBMCisjZGVmaW5lIFBOR19GTEFHX0tFRVBfVU5TQUZFX0NIVU5LUyAgICAgICAweDEwMDAwTAorI2RlZmluZSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIICAgICAgICAgMHgyMDAwMEwKKyNkZWZpbmUgUE5HX0ZMQUdfU1RSSVBfRVJST1JfTlVNQkVSUyAgICAgIDB4NDAwMDBMCisjZGVmaW5lIFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQgICAgICAgICAweDgwMDAwTAorI2RlZmluZSBQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0sgICAgICAgMHgxMDAwMDBMCisjZGVmaW5lIFBOR19GTEFHX0FERF9BTFBIQSAgICAgICAgICAgICAgICAweDIwMDAwMEwgIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuOCAqLworI2RlZmluZSBQTkdfRkxBR19TVFJJUF9BTFBIQSAgICAgICAgICAgICAgMHg0MDAwMDBMICAvKiBBZGRlZCB0byBsaWJwbmctMS4yLjggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIDB4ODAwMDAwTCAgdW51c2VkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgIDB4MTAwMDAwMEwgIHVudXNlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAweDIwMDAwMDBMICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgMHg0MDAwMDAwTCAgdW51c2VkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgIDB4ODAwMDAwMEwgIHVudXNlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDB4MTAwMDAwMDBMICB1bnVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAweDIwMDAwMDAwTCAgdW51c2VkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMHg0MDAwMDAwMEwgIHVudXNlZCAqLworCisjZGVmaW5lIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSyAoUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4pCisKKyNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX01BU0sgIChQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkUpCisKKyNkZWZpbmUgUE5HX0ZMQUdfQ1JDX01BU0sgICAgICAgICAgIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX01BU0spCisKKy8qIFNhdmUgdHlwaW5nIGFuZCBtYWtlIGNvZGUgZWFzaWVyIHRvIHVuZGVyc3RhbmQgKi8KKworI2RlZmluZSBQTkdfQ09MT1JfRElTVChjMSwgYzIpIChhYnMoKGludCkoKGMxKS5yZWQpIC0gKGludCkoKGMyKS5yZWQpKSArIFwKKyAgIGFicygoaW50KSgoYzEpLmdyZWVuKSAtIChpbnQpKChjMikuZ3JlZW4pKSArIFwKKyAgIGFicygoaW50KSgoYzEpLmJsdWUpIC0gKGludCkoKGMyKS5ibHVlKSkpCisKKy8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuNiBKQiAqLworI2RlZmluZSBQTkdfUk9XQllURVMocGl4ZWxfYml0cywgd2lkdGgpIFwKKyAgICAoKHBpeGVsX2JpdHMpID49IDggPyBcCisgICAgKCh3aWR0aCkgKiAoKChwbmdfdWludF8zMikocGl4ZWxfYml0cykpID4+IDMpKSA6IFwKKyAgICAoKCAoKHdpZHRoKSAqICgocG5nX3VpbnRfMzIpKHBpeGVsX2JpdHMpKSkgKyA3KSA+PiAzKSApCisKKy8qIFBOR19PVVRfT0ZfUkFOR0UgcmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlCisgKiBpZGVhbC1kZWx0YS4uaWRlYWwrZGVsdGEuICBFYWNoIGFyZ3VtZW50IGlzIGV2YWx1YXRlZCB0d2ljZS4KKyAqICJpZGVhbCIgYW5kICJkZWx0YSIgc2hvdWxkIGJlIGNvbnN0YW50cywgbm9ybWFsbHkgc2ltcGxlCisgKiBpbnRlZ2VycywgInZhbHVlIiBhIHZhcmlhYmxlLiBBZGRlZCB0byBsaWJwbmctMS4yLjYgSkIKKyAqLworI2RlZmluZSBQTkdfT1VUX09GX1JBTkdFKHZhbHVlLCBpZGVhbCwgZGVsdGEpIFwKKyAgICAgICAgKCAodmFsdWUpIDwgKGlkZWFsKS0oZGVsdGEpIHx8ICh2YWx1ZSkgPiAoaWRlYWwpKyhkZWx0YSkgKQorCisvKiBWYXJpYWJsZXMgZGVjbGFyZWQgaW4gcG5nLmMgLSBvbmx5IGl0IG5lZWRzIHRvIGRlZmluZSBQTkdfTk9fRVhURVJOICovCisjaWYgIWRlZmluZWQoUE5HX05PX0VYVEVSTikgfHwgZGVmaW5lZChQTkdfQUxXQVlTX0VYVEVSTikKKy8qIFBsYWNlIHRvIGhvbGQgdGhlIHNpZ25hdHVyZSBzdHJpbmcgZm9yIGEgUE5HIGZpbGUuICovCisjaWZkZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCisgICBQTkdfRVhQT1JUX1ZBUiAoUE5HX0NPTlNUIHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19zaWdbOF07CisjZWxzZQorI2VuZGlmCisjZW5kaWYgLyogUE5HX05PX0VYVEVSTiAqLworCisvKiBDb25zdGFudCBzdHJpbmdzIGZvciBrbm93biBjaHVuayB0eXBlcy4gIElmIHlvdSBuZWVkIHRvIGFkZCBhIGNodW5rLAorICogZGVmaW5lIHRoZSBuYW1lIGhlcmUsIGFuZCBhZGQgYW4gaW52b2NhdGlvbiBvZiB0aGUgbWFjcm8gaW4gcG5nLmMgYW5kCisgKiB3aGVyZXZlciBpdCdzIG5lZWRlZC4KKyAqLworI2RlZmluZSBQTkdfSUhEUiBwbmdfYnl0ZSBwbmdfSUhEUls1XSA9IHsgNzMsICA3MiwgIDY4LCAgODIsICdcMCd9CisjZGVmaW5lIFBOR19JREFUIHBuZ19ieXRlIHBuZ19JREFUWzVdID0geyA3MywgIDY4LCAgNjUsICA4NCwgJ1wwJ30KKyNkZWZpbmUgUE5HX0lFTkQgcG5nX2J5dGUgcG5nX0lFTkRbNV0gPSB7IDczLCAgNjksICA3OCwgIDY4LCAnXDAnfQorI2RlZmluZSBQTkdfUExURSBwbmdfYnl0ZSBwbmdfUExURVs1XSA9IHsgODAsICA3NiwgIDg0LCAgNjksICdcMCd9CisjZGVmaW5lIFBOR19iS0dEIHBuZ19ieXRlIHBuZ19iS0dEWzVdID0geyA5OCwgIDc1LCAgNzEsICA2OCwgJ1wwJ30KKyNkZWZpbmUgUE5HX2NIUk0gcG5nX2J5dGUgcG5nX2NIUk1bNV0gPSB7IDk5LCAgNzIsICA4MiwgIDc3LCAnXDAnfQorI2RlZmluZSBQTkdfZ0FNQSBwbmdfYnl0ZSBwbmdfZ0FNQVs1XSA9IHsxMDMsICA2NSwgIDc3LCAgNjUsICdcMCd9CisjZGVmaW5lIFBOR19oSVNUIHBuZ19ieXRlIHBuZ19oSVNUWzVdID0gezEwNCwgIDczLCAgODMsICA4NCwgJ1wwJ30KKyNkZWZpbmUgUE5HX2lDQ1AgcG5nX2J5dGUgcG5nX2lDQ1BbNV0gPSB7MTA1LCAgNjcsICA2NywgIDgwLCAnXDAnfQorI2RlZmluZSBQTkdfaVRYdCBwbmdfYnl0ZSBwbmdfaVRYdFs1XSA9IHsxMDUsICA4NCwgIDg4LCAxMTYsICdcMCd9CisjZGVmaW5lIFBOR19vRkZzIHBuZ19ieXRlIHBuZ19vRkZzWzVdID0gezExMSwgIDcwLCAgNzAsIDExNSwgJ1wwJ30KKyNkZWZpbmUgUE5HX3BDQUwgcG5nX2J5dGUgcG5nX3BDQUxbNV0gPSB7MTEyLCAgNjcsICA2NSwgIDc2LCAnXDAnfQorI2RlZmluZSBQTkdfc0NBTCBwbmdfYnl0ZSBwbmdfc0NBTFs1XSA9IHsxMTUsICA2NywgIDY1LCAgNzYsICdcMCd9CisjZGVmaW5lIFBOR19wSFlzIHBuZ19ieXRlIHBuZ19wSFlzWzVdID0gezExMiwgIDcyLCAgODksIDExNSwgJ1wwJ30KKyNkZWZpbmUgUE5HX3NCSVQgcG5nX2J5dGUgcG5nX3NCSVRbNV0gPSB7MTE1LCAgNjYsICA3MywgIDg0LCAnXDAnfQorI2RlZmluZSBQTkdfc1BMVCBwbmdfYnl0ZSBwbmdfc1BMVFs1XSA9IHsxMTUsICA4MCwgIDc2LCAgODQsICdcMCd9CisjZGVmaW5lIFBOR19zUkdCIHBuZ19ieXRlIHBuZ19zUkdCWzVdID0gezExNSwgIDgyLCAgNzEsICA2NiwgJ1wwJ30KKyNkZWZpbmUgUE5HX3RFWHQgcG5nX2J5dGUgcG5nX3RFWHRbNV0gPSB7MTE2LCAgNjksICA4OCwgMTE2LCAnXDAnfQorI2RlZmluZSBQTkdfdElNRSBwbmdfYnl0ZSBwbmdfdElNRVs1XSA9IHsxMTYsICA3MywgIDc3LCAgNjksICdcMCd9CisjZGVmaW5lIFBOR190Uk5TIHBuZ19ieXRlIHBuZ190Uk5TWzVdID0gezExNiwgIDgyLCAgNzgsICA4MywgJ1wwJ30KKyNkZWZpbmUgUE5HX3pUWHQgcG5nX2J5dGUgcG5nX3pUWHRbNV0gPSB7MTIyLCAgODQsICA4OCwgMTE2LCAnXDAnfQorCisjaWZkZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX0lIRFJbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX0lEQVRbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX0lFTkRbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX1BMVEVbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX2JLR0RbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX2NIUk1bNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX2dBTUFbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX2hJU1RbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX2lDQ1BbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX2lUWHRbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX29GRnNbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3BDQUxbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3NDQUxbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3BIWXNbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3NCSVRbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3NQTFRbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3NSR0JbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3RFWHRbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3RJTUVbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3RSTlNbNV07CitQTkdfRVhQT1JUX1ZBUiAocG5nX2J5dGUgRkFSREFUQSkgcG5nX3pUWHRbNV07CisjZW5kaWYgLyogUE5HX1VTRV9HTE9CQUxfQVJSQVlTICovCisKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZCAoUE5HXzFfMl9YKQorLyogSW5pdGlhbGl6ZSBwbmdfcHRyIHN0cnVjdCBmb3IgcmVhZGluZywgYW5kIGFsbG9jYXRlIGFueSBvdGhlciBtZW1vcnkuCisgKiAob2xkIGludGVyZmFjZSAtIERFUFJFQ0FURUQgLSB1c2UgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCBpbnN0ZWFkKS4KKyAqLworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfcmVhZF9pbml0KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKQorICAgIFBOR19ERVBSRUNBVEVEOworI3VuZGVmIHBuZ19yZWFkX2luaXQKKyNkZWZpbmUgcG5nX3JlYWRfaW5pdChwbmdfcHRyKSBwbmdfcmVhZF9pbml0XzMoJnBuZ19wdHIsIFwKKyAgICBQTkdfTElCUE5HX1ZFUl9TVFJJTkcsICBwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpKTsKKyNlbmRpZgorCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX2luaXRfMykgUE5HQVJHKChwbmdfc3RydWN0cHAgcHRyX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfc2l6ZV90IHBuZ19zdHJ1Y3Rfc2l6ZSkpOworI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkIChQTkdfMV8yX1gpCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX2luaXRfMikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgIHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ19zaXplX3QgcG5nX3N0cnVjdF9zaXplLCBwbmdfc2l6ZV90CisgICAgcG5nX2luZm9fc2l6ZSkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZCAoUE5HXzFfMl9YKQorLyogSW5pdGlhbGl6ZSBwbmdfcHRyIHN0cnVjdCBmb3Igd3JpdGluZywgYW5kIGFsbG9jYXRlIGFueSBvdGhlciBtZW1vcnkuCisgKiAob2xkIGludGVyZmFjZSAtIERFUFJFQ0FURUQgLSB1c2UgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgaW5zdGVhZCkuCisgKi8KK2V4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2luaXQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpCisgICAgUE5HX0RFUFJFQ0FURUQ7CisjdW5kZWYgcG5nX3dyaXRlX2luaXQKKyNkZWZpbmUgcG5nX3dyaXRlX2luaXQocG5nX3B0cikgcG5nX3dyaXRlX2luaXRfMygmcG5nX3B0ciwgXAorICAgIFBOR19MSUJQTkdfVkVSX1NUUklORywgcG5nX3NpemVvZihwbmdfc3RydWN0KSk7CisjZW5kaWYKKworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfaW5pdF8zKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwcCBwdHJfcHRyLAorICAgIHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ19zaXplX3QgcG5nX3N0cnVjdF9zaXplKSk7CitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9pbml0XzIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfc2l6ZV90IHBuZ19zdHJ1Y3Rfc2l6ZSwgcG5nX3NpemVfdAorICAgIHBuZ19pbmZvX3NpemUpKTsKKworLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBpbnRlcm5hbCBsaWJwbmcgc3RydWN0ICovCitQTkdfRVhURVJOIHBuZ192b2lkcCBwbmdfY3JlYXRlX3N0cnVjdCBQTkdBUkcoKGludCB0eXBlKSkgUE5HX1BSSVZBVEU7CisKKy8qIEZyZWUgbWVtb3J5IGZyb20gaW50ZXJuYWwgbGlicG5nIHN0cnVjdCAqLworUE5HX0VYVEVSTiB2b2lkIHBuZ19kZXN0cm95X3N0cnVjdCBQTkdBUkcoKHBuZ192b2lkcCBzdHJ1Y3RfcHRyKSkgUE5HX1BSSVZBVEU7CisKK1BOR19FWFRFUk4gcG5nX3ZvaWRwIHBuZ19jcmVhdGVfc3RydWN0XzIgUE5HQVJHKChpbnQgdHlwZSwgcG5nX21hbGxvY19wdHIKKyAgbWFsbG9jX2ZuLCBwbmdfdm9pZHAgbWVtX3B0cikpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19kZXN0cm95X3N0cnVjdF8yIFBOR0FSRygocG5nX3ZvaWRwIHN0cnVjdF9wdHIsCisgICBwbmdfZnJlZV9wdHIgZnJlZV9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIpKSBQTkdfUFJJVkFURTsKKworLyogRnJlZSBhbnkgbWVtb3J5IHRoYXQgaW5mb19wdHIgcG9pbnRzIHRvIGFuZCByZXNldCBzdHJ1Y3QuICovCitQTkdfRVhURVJOIHZvaWQgcG5nX2luZm9fZGVzdHJveSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIpKSBQTkdfUFJJVkFURTsKKworI2lmbmRlZiBQTkdfMV8wX1gKKy8qIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgemxpYi4gKi8KK1BOR19FWFRFUk4gdm9pZHBmIHBuZ196YWxsb2MgUE5HQVJHKCh2b2lkcGYgcG5nX3B0ciwgdUludCBpdGVtcywKKyAgIHVJbnQgc2l6ZSkpIFBOR19QUklWQVRFOworCisvKiBGdW5jdGlvbiB0byBmcmVlIG1lbW9yeSBmb3IgemxpYiAqLworUE5HX0VYVEVSTiB2b2lkIHBuZ196ZnJlZSBQTkdBUkcoKHZvaWRwZiBwbmdfcHRyLCB2b2lkcGYgcHRyKSkgUE5HX1BSSVZBVEU7CisKKyNpZmRlZiBQTkdfU0laRV9UCisvKiBGdW5jdGlvbiB0byBjb252ZXJ0IGEgc2l6ZW9mIGFuIGl0ZW0gdG8gcG5nX3NpemVvZiBpdGVtICovCisgICBQTkdfRVhURVJOIHBuZ19zaXplX3QgUE5HQVBJIHBuZ19jb252ZXJ0X3NpemUgUE5HQVJHKChzaXplX3Qgc2l6ZSkpCisgICAgICBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisvKiBOZXh0IGZvdXIgZnVuY3Rpb25zIGFyZSB1c2VkIGludGVybmFsbHkgYXMgY2FsbGJhY2tzLiAgUE5HQVBJIGlzIHJlcXVpcmVkCisgKiBidXQgbm90IFBOR19FWFBPUlQuICBQTkdBUEkgYWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjMuCisgKi8KKworUE5HX0VYVEVSTiB2b2lkIFBOR0FQSSBwbmdfZGVmYXVsdF9yZWFkX2RhdGEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisKKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBQTkdBUEkgcG5nX3B1c2hfZmlsbF9idWZmZXIgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBsZW5ndGgpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCitQTkdfRVhURVJOIHZvaWQgUE5HQVBJIHBuZ19kZWZhdWx0X3dyaXRlX2RhdGEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisKKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIFBOR0FQSSBwbmdfZGVmYXVsdF9mbHVzaCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKQorICAgUE5HX1BSSVZBVEU7CisjZW5kaWYKKyNlbmRpZgorI2Vsc2UgLyogUE5HXzFfMF9YICovCisjaWZkZWYgUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfZmlsbF9idWZmZXIgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBsZW5ndGgpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorI2VuZGlmIC8qIFBOR18xXzBfWCAqLworCisvKiBSZXNldCB0aGUgQ1JDIHZhcmlhYmxlICovCitQTkdfRVhURVJOIHZvaWQgcG5nX3Jlc2V0X2NyYyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKSBQTkdfUFJJVkFURTsKKworLyogV3JpdGUgdGhlICJkYXRhIiBidWZmZXIgdG8gd2hhdGV2ZXIgb3V0cHV0IHlvdSBhcmUgdXNpbmcuICovCitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2RhdGEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwKKyAgIHBuZ19zaXplX3QgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisKKy8qIFJlYWQgZGF0YSBmcm9tIHdoYXRldmVyIGlucHV0IHlvdSBhcmUgdXNpbmcgaW50byB0aGUgImRhdGEiIGJ1ZmZlciAqLworUE5HX0VYVEVSTiB2b2lkIHBuZ19yZWFkX2RhdGEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwKKyAgIHBuZ19zaXplX3QgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisKKy8qIFJlYWQgYnl0ZXMgaW50byBidWYsIGFuZCB1cGRhdGUgcG5nX3B0ci0+Y3JjICovCitQTkdfRVhURVJOIHZvaWQgcG5nX2NyY19yZWFkIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZiwKKyAgIHBuZ19zaXplX3QgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisKKy8qIERlY29tcHJlc3MgZGF0YSBpbiBhIGNodW5rIHRoYXQgdXNlcyBjb21wcmVzc2lvbiAqLworI2lmIGRlZmluZWQoUE5HX3pUWHRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19pVFh0X1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX2lDQ1BfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19zUExUX1NVUFBPUlRFRCkKK1BOR19FWFRFUk4gdm9pZCBwbmdfZGVjb21wcmVzc19jaHVuayBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBpbnQgY29tcF90eXBlLCBwbmdfc2l6ZV90IGNodW5rbGVuZ3RoLAorICAgcG5nX3NpemVfdCBwcmVmaXhfbGVuZ3RoLCBwbmdfc2l6ZV90ICpkYXRhX2xlbmd0aCkpIFBOR19QUklWQVRFOworI2VuZGlmCisKKy8qIFJlYWQgInNraXAiIGJ5dGVzLCByZWFkIHRoZSBmaWxlIGNyYywgYW5kIChvcHRpb25hbGx5KSB2ZXJpZnkgcG5nX3B0ci0+Y3JjICovCitQTkdfRVhURVJOIGludCBwbmdfY3JjX2ZpbmlzaCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNraXApCisgICBQTkdfUFJJVkFURSk7CisKKy8qIFJlYWQgdGhlIENSQyBmcm9tIHRoZSBmaWxlIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBsaWJwbmcgY2FsY3VsYXRlZCBDUkMgKi8KK1BOR19FWFRFUk4gaW50IHBuZ19jcmNfZXJyb3IgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX1BSSVZBVEU7CisKKy8qIENhbGN1bGF0ZSB0aGUgQ1JDIG92ZXIgYSBzZWN0aW9uIG9mIGRhdGEuICBOb3RlIHRoYXQgd2UgYXJlIG9ubHkKKyAqIHBhc3NpbmcgYSBtYXhpbXVtIG9mIDY0SyBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSB0aGlzIGFzIGEgbWVtb3J5IGxpbWl0LAorICogc2luY2UgdGhpcyBpcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSB3ZSBjYW4gc3BlY2lmeS4KKyAqLworUE5HX0VYVEVSTiB2b2lkIHBuZ19jYWxjdWxhdGVfY3JjIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHB0ciwKKyAgIHBuZ19zaXplX3QgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisKKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2ZsdXNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpIFBOR19QUklWQVRFOworI2VuZGlmCisKKy8qIFNpbXBsZSBmdW5jdGlvbiB0byB3cml0ZSB0aGUgc2lnbmF0dXJlICovCitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX3NpZyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKSBQTkdfUFJJVkFURTsKKworLyogV3JpdGUgdmFyaW91cyBjaHVua3MgKi8KKworLyogV3JpdGUgdGhlIElIRFIgY2h1bmssIGFuZCB1cGRhdGUgdGhlIHBuZ19zdHJ1Y3Qgd2l0aCB0aGUgbmVjZXNzYXJ5CisgKiBpbmZvcm1hdGlvbi4KKyAqLworUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9JSERSIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgd2lkdGgsCisgICBwbmdfdWludF8zMiBoZWlnaHQsCisgICBpbnQgYml0X2RlcHRoLCBpbnQgY29sb3JfdHlwZSwgaW50IGNvbXByZXNzaW9uX21ldGhvZCwgaW50IGZpbHRlcl9tZXRob2QsCisgICBpbnQgaW50ZXJsYWNlX21ldGhvZCkpIFBOR19QUklWQVRFOworCitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX1BMVEUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29sb3JwIHBhbGV0dGUsCisgICBwbmdfdWludF8zMiBudW1fcGFsKSkgUE5HX1BSSVZBVEU7CisKK1BOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfSURBVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLAorICAgcG5nX3NpemVfdCBsZW5ndGgpKSBQTkdfUFJJVkFURTsKKworUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9JRU5EIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpIFBOR19QUklWQVRFOworCisjaWZkZWYgUE5HX1dSSVRFX2dBTUFfU1VQUE9SVEVECisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9nQU1BIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgZG91YmxlIGZpbGVfZ2FtbWEpKQorICAgIFBOR19QUklWQVRFOworI2VuZGlmCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9nQU1BX2ZpeGVkIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICBwbmdfZml4ZWRfcG9pbnQgZmlsZV9nYW1tYSkpIFBOR19QUklWQVRFOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zQklUX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zQklUIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbG9yXzhwIHNiaXQsCisgICBpbnQgY29sb3JfdHlwZSkpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2NIUk0gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgZG91YmxlIHdoaXRlX3gsIGRvdWJsZSB3aGl0ZV95LAorICAgZG91YmxlIHJlZF94LCBkb3VibGUgcmVkX3ksIGRvdWJsZSBncmVlbl94LCBkb3VibGUgZ3JlZW5feSwKKyAgIGRvdWJsZSBibHVlX3gsIGRvdWJsZSBibHVlX3kpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfY0hSTV9maXhlZCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfZml4ZWRfcG9pbnQgaW50X3doaXRlX3gsIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeSwKKyAgIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX3gsIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX3ksIHBuZ19maXhlZF9wb2ludAorICAgaW50X2dyZWVuX3gsIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5feSwgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX3gsCisgICBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfeSkpIFBOR19QUklWQVRFOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zUkdCIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIGludCBpbnRlbnQpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2lDQ1AgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2NoYXJwIG5hbWUsIGludCBjb21wcmVzc2lvbl90eXBlLAorICAgcG5nX2NoYXJwIHByb2ZpbGUsIGludCBwcm9mbGVuKSkgUE5HX1BSSVZBVEU7CisgICAvKiBOb3RlIHRvIG1haW50YWluZXI6IHByb2ZpbGUgc2hvdWxkIGJlIHBuZ19ieXRlcCAqLworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfc1BMVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfc1BMVF90cCBwYWxldHRlKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV90Uk5TIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHRyYW5zLAorICAgcG5nX2NvbG9yXzE2cCB2YWx1ZXMsIGludCBudW1iZXIsIGludCBjb2xvcl90eXBlKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9iS0dEIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcl8xNnAgdmFsdWVzLCBpbnQgY29sb3JfdHlwZSkpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfaElTVF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfaElTVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzE2cCBoaXN0LAorICAgaW50IG51bV9oaXN0KSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9zUExUX1NVUFBPUlRFRCkKK1BOR19FWFRFUk4gcG5nX3NpemVfdCBwbmdfY2hlY2tfa2V5d29yZCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfY2hhcnAga2V5LCBwbmdfY2hhcnBwIG5ld19rZXkpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX3RFWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAga2V5LAorICAgcG5nX2NoYXJwIHRleHQsIHBuZ19zaXplX3QgdGV4dF9sZW4pKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX3pUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAga2V5LAorICAgcG5nX2NoYXJwIHRleHQsIHBuZ19zaXplX3QgdGV4dF9sZW4sIGludCBjb21wcmVzc2lvbikpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfaVRYdCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBpbnQgY29tcHJlc3Npb24sIHBuZ19jaGFycCBrZXksIHBuZ19jaGFycCBsYW5nLCBwbmdfY2hhcnAgbGFuZ19rZXksCisgICBwbmdfY2hhcnAgdGV4dCkpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQgIC8qIEFkZGVkIGF0IHZlcnNpb24gMS4wLjE0IGFuZCAxLjIuNCAqLworUE5HX0VYVEVSTiBpbnQgcG5nX3NldF90ZXh0XzIgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGV4dHAgdGV4dF9wdHIsIGludCBudW1fdGV4dCkpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfb0ZGcyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW50XzMyIHhfb2Zmc2V0LCBwbmdfaW50XzMyIHlfb2Zmc2V0LCBpbnQgdW5pdF90eXBlKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9wQ0FMIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIHB1cnBvc2UsCisgICBwbmdfaW50XzMyIFgwLCBwbmdfaW50XzMyIFgxLCBpbnQgdHlwZSwgaW50IG5wYXJhbXMsCisgICBwbmdfY2hhcnAgdW5pdHMsIHBuZ19jaGFycHAgcGFyYW1zKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9wSFlzIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ191aW50XzMyIHhfcGl4ZWxzX3Blcl91bml0LCBwbmdfdWludF8zMiB5X3BpeGVsc19wZXJfdW5pdCwKKyAgIGludCB1bml0X3R5cGUpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX3RJTUUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX3RpbWVwIG1vZF90aW1lKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRAorI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX05PX1NURElPKQorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zQ0FMIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIGludCB1bml0LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpKSBQTkdfUFJJVkFURTsKKyNlbHNlCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zQ0FMX3MgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgaW50IHVuaXQsIHBuZ19jaGFycCB3aWR0aCwgcG5nX2NoYXJwIGhlaWdodCkpIFBOR19QUklWQVRFOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiBDYWxsZWQgd2hlbiBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgcm93IG9mIGRhdGEgKi8KK1BOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfZmluaXNoX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKSBQTkdfUFJJVkFURTsKKworLyogSW50ZXJuYWwgdXNlIG9ubHkuICAgQ2FsbGVkIGJlZm9yZSBmaXJzdCByb3cgb2YgZGF0YSAqLworUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9zdGFydF9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX1BSSVZBVEU7CisKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfYnVpbGRfZ2FtbWFfdGFibGUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworLyogQ29tYmluZSBhIHJvdyBvZiBkYXRhLCBkZWFsaW5nIHdpdGggYWxwaGEsIGV0Yy4gaWYgcmVxdWVzdGVkICovCitQTkdfRVhURVJOIHZvaWQgcG5nX2NvbWJpbmVfcm93IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHJvdywKKyAgIGludCBtYXNrKSkgUE5HX1BSSVZBVEU7CisKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKy8qIEV4cGFuZCBhbiBpbnRlcmxhY2VkIHJvdyAqLworLyogT0xEIHByZS0xLjAuOSBpbnRlcmZhY2U6CitQTkdfRVhURVJOIHZvaWQgcG5nX2RvX3JlYWRfaW50ZXJsYWNlIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKKyAgIHBuZ19ieXRlcCByb3csIGludCBwYXNzLCBwbmdfdWludF8zMiB0cmFuc2Zvcm1hdGlvbnMpKSBQTkdfUFJJVkFURTsKKyAqLworUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX2ludGVybGFjZSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisvKiBHUlIgVE8gRE8gKDIuMCBvciB3aGVuZXZlcik6ICBzaW1wbGlmeSBvdGhlciBpbnRlcm5hbCBjYWxsaW5nIGludGVyZmFjZXMgKi8KKworI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKy8qIEdyYWIgcGl4ZWxzIG91dCBvZiBhIHJvdyBmb3IgYW4gaW50ZXJsYWNlZCBwYXNzICovCitQTkdfRVhURVJOIHZvaWQgcG5nX2RvX3dyaXRlX2ludGVybGFjZSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICBwbmdfYnl0ZXAgcm93LCBpbnQgcGFzcykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKy8qIFVuZmlsdGVyIGEgcm93ICovCitQTkdfRVhURVJOIHZvaWQgcG5nX3JlYWRfZmlsdGVyX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfYnl0ZXAgcHJldl9yb3csCisgICBpbnQgZmlsdGVyKSkgUE5HX1BSSVZBVEU7CisKKy8qIENob29zZSB0aGUgYmVzdCBmaWx0ZXIgdG8gdXNlIGFuZCBmaWx0ZXIgdGhlIHJvdyBkYXRhICovCitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2ZpbmRfZmlsdGVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pKSBQTkdfUFJJVkFURTsKKworLyogV3JpdGUgb3V0IHRoZSBmaWx0ZXJlZCByb3cuICovCitQTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2ZpbHRlcmVkX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfYnl0ZXAgZmlsdGVyZWRfcm93KSkgUE5HX1BSSVZBVEU7CisvKiBGaW5pc2ggYSByb3cgd2hpbGUgcmVhZGluZywgZGVhbGluZyB3aXRoIGludGVybGFjaW5nIHBhc3NlcywgZXRjLiAqLworUE5HX0VYVEVSTiB2b2lkIHBuZ19yZWFkX2ZpbmlzaF9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7CisKKy8qIEluaXRpYWxpemUgdGhlIHJvdyBidWZmZXJzLCBldGMuICovCitQTkdfRVhURVJOIHZvaWQgcG5nX3JlYWRfc3RhcnRfcm93IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpIFBOR19QUklWQVRFOworLyogT3B0aW9uYWwgY2FsbCB0byB1cGRhdGUgdGhlIHVzZXJzIGluZm8gc3RydWN0dXJlICovCitQTkdfRVhURVJOIHZvaWQgcG5nX3JlYWRfdHJhbnNmb3JtX2luZm8gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyKSkgUE5HX1BSSVZBVEU7CisKKy8qIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgZG8gdGhlIHRyYW5zZm9ybWF0aW9ucyAqLworI2lmZGVmIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfZG9fcmVhZF9maWxsZXIgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAorICAgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgZmlsbGVyLCBwbmdfdWludF8zMiBmbGFncykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX3N3YXBfYWxwaGEgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAorICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfZG9fd3JpdGVfc3dhcF9hbHBoYSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICBwbmdfYnl0ZXAgcm93KSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfZG9fcmVhZF9pbnZlcnRfYWxwaGEgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAorICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19kb193cml0ZV9pbnZlcnRfYWxwaGEgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAorICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQpCitQTkdfRVhURVJOIHZvaWQgcG5nX2RvX3N0cmlwX2ZpbGxlciBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBmbGFncykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkKK1BOR19FWFRFUk4gdm9pZCBwbmdfZG9fc3dhcCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEKQorUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19wYWNrc3dhcCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKK1BOR19FWFRFUk4gaW50IHBuZ19kb19yZ2JfdG9fZ3JheSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3AKKyAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19ncmF5X3RvX3JnYiBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICBwbmdfYnl0ZXAgcm93KSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2RvX3VucGFjayBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfZG9fdW5zaGlmdCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICBwbmdfY29sb3JfOHAgc2lnX2JpdHMpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQorUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19pbnZlcnQgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAorICAgIHBuZ19ieXRlcCByb3cpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfZG9fY2hvcCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2RvX2RpdGhlciBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICBwbmdfYnl0ZXAgcm93LCBwbmdfYnl0ZXAgcGFsZXR0ZV9sb29rdXAsCisgICAgcG5nX2J5dGVwIGRpdGhlcl9sb29rdXApKSBQTkdfUFJJVkFURTsKKworIyAgaWZkZWYgUE5HX0NPUlJFQ1RfUEFMRVRURV9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfY29ycmVjdF9wYWxldHRlIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKSkgUE5HX1BSSVZBVEU7CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpCitQTkdfRVhURVJOIHZvaWQgcG5nX2RvX2JnciBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfZG9fcGFjayBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBiaXRfZGVwdGgpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19zaGlmdCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICBwbmdfY29sb3JfOHAgYml0X2RlcHRoKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2RvX2JhY2tncm91bmQgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAorICAgcG5nX2NvbG9yXzE2cCB0cmFuc192YWx1ZXMsIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZCwKKyAgIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZF8xLAorICAgcG5nX2J5dGVwIGdhbW1hX3RhYmxlLCBwbmdfYnl0ZXAgZ2FtbWFfZnJvbV8xLCBwbmdfYnl0ZXAgZ2FtbWFfdG9fMSwKKyAgIHBuZ191aW50XzE2cHAgZ2FtbWFfMTYsIHBuZ191aW50XzE2cHAgZ2FtbWFfMTZfZnJvbV8xLAorICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90b18xLCBpbnQgZ2FtbWFfc2hpZnQpKSBQTkdfUFJJVkFURTsKKyNlbHNlCitQTkdfRVhURVJOIHZvaWQgcG5nX2RvX2JhY2tncm91bmQgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAorICAgcG5nX2NvbG9yXzE2cCB0cmFuc192YWx1ZXMsIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZCkpIFBOR19QUklWQVRFOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19nYW1tYSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICBwbmdfYnl0ZXAgZ2FtbWFfdGFibGUsIHBuZ191aW50XzE2cHAgZ2FtbWFfMTZfdGFibGUsCisgICBpbnQgZ2FtbWFfc2hpZnQpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19leHBhbmRfcGFsZXR0ZSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCisgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29sb3JwIHBhbGV0dGUsIHBuZ19ieXRlcCB0cmFucywKKyAgIGludCBudW1fdHJhbnMpKSBQTkdfUFJJVkFURTsKK1BOR19FWFRFUk4gdm9pZCBwbmdfZG9fZXhwYW5kIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKKyAgIHBuZ19ieXRlcCByb3csIHBuZ19jb2xvcl8xNnAgdHJhbnNfdmFsdWUpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGRlY29kZXMgdGhlIGFwcHJvcHJpYXRlIGNodW5rcywgYW5kIGRvZXMgZXJyb3IgY29ycmVjdGlvbiwKKyAqIHRoZW4gY2FsbHMgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrIGZvciB0aGUgY2h1bmsgaWYgaXQgaXMgdmFsaWQuCisgKi8KKworLyogRGVjb2RlIHRoZSBJSERSIGNodW5rICovCitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9JSERSIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9QTFRFIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7CitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9JRU5EIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7CisKKyNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfYktHRCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgIHBuZ191aW50XzMyIGxlbmd0aCkpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfY0hSTSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgIHBuZ191aW50XzMyIGxlbmd0aCkpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfZ0FNQSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgIHBuZ191aW50XzMyIGxlbmd0aCkpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfaElTVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgIHBuZ191aW50XzMyIGxlbmd0aCkpIFBOR19QUklWQVRFOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAorZXh0ZXJuIHZvaWQgcG5nX2hhbmRsZV9pQ0NQIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7CisjZW5kaWYgLyogUE5HX1JFQURfaUNDUF9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9pVFh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX29GRnNfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9vRkZzIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9wQ0FMIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3BIWXNfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9wSFlzIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9zQklUIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9zQ0FMIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECitleHRlcm4gdm9pZCBwbmdfaGFuZGxlX3NQTFQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfdWludF8zMiBsZW5ndGgpKSBQTkdfUFJJVkFURTsKKyNlbmRpZiAvKiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3NSR0IgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfdWludF8zMiBsZW5ndGgpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3RFWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfdWludF8zMiBsZW5ndGgpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3RJTUUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfdWludF8zMiBsZW5ndGgpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3RSTlMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfdWludF8zMiBsZW5ndGgpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3pUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfdWludF8zMiBsZW5ndGgpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCitQTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV91bmtub3duIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CisKK1BOR19FWFRFUk4gdm9pZCBwbmdfY2hlY2tfY2h1bmtfbmFtZSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfYnl0ZXAgY2h1bmtfbmFtZSkpIFBOR19QUklWQVRFOworCisvKiBIYW5kbGUgdGhlIHRyYW5zZm9ybWF0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLworUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucworICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX1BSSVZBVEU7CitQTkdfRVhURVJOIHZvaWQgcG5nX2RvX3dyaXRlX3RyYW5zZm9ybWF0aW9ucworICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX1BSSVZBVEU7CisKK1BOR19FWFRFUk4gdm9pZCBwbmdfaW5pdF9yZWFkX3RyYW5zZm9ybWF0aW9ucworICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX1BSSVZBVEU7CisKKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9yZWFkX2NodW5rIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cikpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfc2lnIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cikpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX2NoZWNrX2NyYyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKSBQTkdfUFJJVkFURTsKK1BOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9jcmNfc2tpcCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfdWludF8zMiBsZW5ndGgpKSBQTkdfUFJJVkFURTsKK1BOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9jcmNfZmluaXNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3NhdmVfYnVmZmVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCkpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfSURBVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKSBQTkdfUFJJVkFURTsKK1BOR19FWFRFUk4gdm9pZCBwbmdfcHJvY2Vzc19JREFUX2RhdGEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CitQTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfcHJvY2Vzc19yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX1BSSVZBVEU7CitQTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGFuZGxlX3Vua25vd24gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpKSBQTkdfUFJJVkFURTsKK1BOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9oYXZlX2luZm8gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyKSkgUE5HX1BSSVZBVEU7CitQTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGF2ZV9lbmQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyKSkgUE5HX1BSSVZBVEU7CitQTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGF2ZV9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfZW5kIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cikpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19wcm9jZXNzX3NvbWVfZGF0YSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIpKSBQTkdfUFJJVkFURTsKK1BOR19FWFRFUk4gdm9pZCBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cKKyAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpIFBOR19QUklWQVRFOworI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVECitQTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGFuZGxlX3RFWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpKSBQTkdfUFJJVkFURTsKK1BOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9yZWFkX3RFWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX2hhbmRsZV96VFh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSkgUE5HX1BSSVZBVEU7CitQTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfcmVhZF96VFh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cikpIFBOR19QUklWQVRFOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKK1BOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9oYW5kbGVfaVRYdCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfaVRYdCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfaW5mb3AgaW5mb19wdHIpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjZW5kaWYgLyogUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX2ludHJhcGl4ZWwgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAorICAgcG5nX2J5dGVwIHJvdykpIFBOR19QUklWQVRFOworUE5HX0VYVEVSTiB2b2lkIHBuZ19kb193cml0ZV9pbnRyYXBpeGVsIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKKyAgIHBuZ19ieXRlcCByb3cpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRAorI2lmZGVmIFBOR19NTVhfQ09ERV9TVVBQT1JURUQKKy8qIHBuZy5jICovIC8qIFBSSVZBVEUgKi8KK1BOR19FWFRFUk4gdm9pZCBwbmdfaW5pdF9tbXhfZmxhZ3MgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKyNlbmRpZgorCisKKy8qIFRoZSBmb2xsb3dpbmcgc2l4IGZ1bmN0aW9ucyB3aWxsIGJlIGV4cG9ydGVkIGluIGxpYnBuZy0xLjQuMC4gKi8KKyNpZiBkZWZpbmVkKFBOR19JTkNIX0NPTlZFUlNJT05TKSAmJiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCitQTkdfRVhURVJOIHBuZ191aW50XzMyIHBuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKK3BuZ19pbmZvcCBpbmZvX3B0cikpOworCitQTkdfRVhURVJOIHBuZ191aW50XzMyIHBuZ19nZXRfeF9waXhlbHNfcGVyX2luY2ggUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorcG5nX2luZm9wIGluZm9fcHRyKSk7CisKK1BOR19FWFRFUk4gcG5nX3VpbnRfMzIgcG5nX2dldF95X3BpeGVsc19wZXJfaW5jaCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCitwbmdfaW5mb3AgaW5mb19wdHIpKTsKKworUE5HX0VYVEVSTiBmbG9hdCBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCitwbmdfaW5mb3AgaW5mb19wdHIpKTsKKworUE5HX0VYVEVSTiBmbG9hdCBwbmdfZ2V0X3lfb2Zmc2V0X2luY2hlcyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCitwbmdfaW5mb3AgaW5mb19wdHIpKTsKKworI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorUE5HX0VYVEVSTiBwbmdfdWludF8zMiBwbmdfZ2V0X3BIWXNfZHBpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKK3BuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgKnJlc194LCBwbmdfdWludF8zMiAqcmVzX3ksIGludCAqdW5pdF90eXBlKSk7CisjZW5kaWYgLyogUE5HX3BIWXNfU1VQUE9SVEVEICovCisjZW5kaWYgIC8qIFBOR19JTkNIX0NPTlZFUlNJT05TICYmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgKi8KKworLyogUmVhZCB0aGUgY2h1bmsgaGVhZGVyIChsZW5ndGggKyB0eXBlIG5hbWUpICovCitQTkdfRVhURVJOIHBuZ191aW50XzMyIHBuZ19yZWFkX2NodW5rX2hlYWRlcgorICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSkgUE5HX1BSSVZBVEU7CisKKy8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuMi4zNCAqLworI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRAorUE5HX0VYVEVSTiBpbnQgcG5nX2NoZWNrX2NIUk1fZml4ZWQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2ZpeGVkX3BvaW50IGludF93aGl0ZV94LCBwbmdfZml4ZWRfcG9pbnQgaW50X3doaXRlX3ksCisgICBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF94LCBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF95LCBwbmdfZml4ZWRfcG9pbnQKKyAgIGludF9ncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgaW50X2dyZWVuX3ksIHBuZ19maXhlZF9wb2ludCBpbnRfYmx1ZV94LAorICAgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX3kpKSBQTkdfUFJJVkFURTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECisjaWZkZWYgUE5HX0NIRUNLX2NIUk1fU1VQUE9SVEVECisvKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuMzQgKi8KK1BOR19FWFRFUk4gdm9pZCBwbmdfNjRiaXRfcHJvZHVjdCBQTkdBUkcoKGxvbmcgdjEsIGxvbmcgdjIsCisgICB1bnNpZ25lZCBsb25nICpoaV9wcm9kdWN0LCB1bnNpZ25lZCBsb25nICpsb19wcm9kdWN0KSkgUE5HX1BSSVZBVEU7CisjZW5kaWYKKyNlbmRpZgorCisvKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuNDEgKi8KK1BOR19FWFRFUk4gdm9pZCBwbmdfY2hlY2tfSUhEUiBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLAorICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfdHlwZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCisgICBpbnQgZmlsdGVyX3R5cGUpKSBQTkdfUFJJVkFURTsKKworLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjQxICovCitQTkdfRVhURVJOIHBuZ192b2lkcCBwbmdfY2FsbG9jIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ191aW50XzMyIHNpemUpKTsKKworLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwcml2YXRlIHByb3RvdHlwZXMgaGVyZSBeIGFuZCBpbiBsaWJwbmdwZi4zICovCisKKyNlbmRpZiAvKiBQTkdfSU5URVJOQUwgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBOR19WRVJTSU9OX0lORk9fT05MWSAqLworLyogRG8gbm90IHB1dCBhbnl0aGluZyBwYXN0IHRoaXMgbGluZSAqLworI2VuZGlmIC8qIFBOR19IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3BuZ2NvbmYuaCBiL2NvbTMyL2luY2x1ZGUvcG5nY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZmMxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3BuZ2NvbmYuaApAQCAtMCwwICsxLDE2NjUgQEAKKworLyogcG5nY29uZi5oIC0gbWFjaGluZSBjb25maWd1cmFibGUgZmlsZSBmb3IgbGlicG5nCisgKgorICogbGlicG5nIHZlcnNpb24gMS4yLjQ0IC0gSnVuZSAyNiwgMjAxMAorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqLworCisvKiBBbnkgbWFjaGluZSBzcGVjaWZpYyBjb2RlIGlzIG5lYXIgdGhlIGZyb250IG9mIHRoaXMgZmlsZSwgc28gaWYgeW91CisgKiBhcmUgY29uZmlndXJpbmcgbGlicG5nIGZvciBhIG1hY2hpbmUsIHlvdSBtYXkgd2FudCB0byByZWFkIHRoZSBzZWN0aW9uCisgKiBzdGFydGluZyBoZXJlIGRvd24gdG8gd2hlcmUgaXQgc3RhcnRzIHRvIHR5cGVkZWYgcG5nX2NvbG9yLCBwbmdfdGV4dCwKKyAqIGFuZCBwbmdfaW5mby4KKyAqLworCisjaWZuZGVmIFBOR0NPTkZfSAorI2RlZmluZSBQTkdDT05GX0gKKworI2RlZmluZSBQTkdfMV8yX1gKKworLyoKKyAqIFBOR19VU0VSX0NPTkZJRyBoYXMgdG8gYmUgZGVmaW5lZCBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lLiBUaGlzCisgKiBpbmNsdWRlcyB0aGUgcmVzb3VyY2UgY29tcGlsZXIgZm9yIFdpbmRvd3MgRExMIGNvbmZpZ3VyYXRpb25zLgorICovCisjaWZkZWYgUE5HX1VTRVJfQ09ORklHCisjICBpZm5kZWYgUE5HX1VTRVJfUFJJVkFURUJVSUxECisjICAgIGRlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQKKyMgIGVuZGlmCisjaW5jbHVkZSAicG5ndXNyLmgiCisjZW5kaWYKKworLyogUE5HX0NPTkZJR1VSRV9MSUJQTkcgaXMgc2V0IGJ5IHRoZSAiY29uZmlndXJlIiBzY3JpcHQuICovCisjaWZkZWYgUE5HX0NPTkZJR1VSRV9MSUJQTkcKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNlbmRpZgorCisvKgorICogQWRkZWQgYXQgbGlicG5nLTEuMi44CisgKgorICogSWYgeW91IGNyZWF0ZSBhIHByaXZhdGUgRExMIHlvdSBuZWVkIHRvIGRlZmluZSBpbiAicG5ndXNyLmgiIHRoZSBmb2xsb3dpbmdzOgorICogI2RlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgPERlc2NyaWJlcyBieSB3aG9tIGFuZCB3aHkgdGhpcyB2ZXJzaW9uIG9mCisgKiAgICAgICAgdGhlIERMTCB3YXMgYnVpbHQ+CisgKiAgZS5nLiAjZGVmaW5lIFBOR19VU0VSX1BSSVZBVEVCVUlMRCAiQnVpbGQgYnkgTXlDb21wYW55IGZvciB4eXogcmVhc29ucy4iCisgKiAjZGVmaW5lIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVggPHR3by1sZXR0ZXIgcG9zdGZpeCB0aGF0IHNlcnZlIHRvCisgKiAgICAgICAgZGlzdGluZ3Vpc2ggeW91ciBETEwgZnJvbSB0aG9zZSBvZiB0aGUgb2ZmaWNpYWwgcmVsZWFzZS4gVGhlc2UKKyAqICAgICAgICBjb3JyZXNwb25kIHRvIHRoZSB0cmFpbGluZyBsZXR0ZXJzIHRoYXQgY29tZSBhZnRlciB0aGUgdmVyc2lvbgorICogICAgICAgIG51bWJlciBhbmQgbXVzdCBtYXRjaCB5b3VyIHByaXZhdGUgRExMIG5hbWU+CisgKiAgZS5nLiAvLyBwcml2YXRlIERMTCAibGlicG5nMTNneC5kbGwiCisgKiAgICAgICAjZGVmaW5lIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVggImd4IgorICoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBhbHNvIGF0IHlvdXIgZGlzcG9zYWwgaWYgeW91IHdhbnQgdG8gY29tcGxldGUgdGhlCisgKiBETEwgVkVSU0lPTklORk8gc3RydWN0dXJlLgorICogLSBQTkdfVVNFUl9WRVJTSU9OSU5GT19DT01NRU5UUworICogLSBQTkdfVVNFUl9WRVJTSU9OSU5GT19DT01QQU5ZTkFNRQorICogLSBQTkdfVVNFUl9WRVJTSU9OSU5GT19MRUdBTFRSQURFTUFSS1MKKyAqLworCisjaWZkZWYgX19TVERDX18KKyNpZmRlZiBTUEVDSUFMQlVJTEQKKyMgIHByYWdtYSBtZXNzYWdlKCJQTkdfTElCUE5HX1NQRUNJQUxCVUlMRCAoYW5kIGRlcHJlY2F0ZWQgU1BFQ0lBTEJVSUxEKVwKKyBhcmUgbm93IExJQlBORyByZXNlcnZlZCBtYWNyb3MuIFVzZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgaW5zdGVhZC4iKQorI2VuZGlmCisKKyNpZmRlZiBQUklWQVRFQlVJTEQKKyMgcHJhZ21hIG1lc3NhZ2UoIlBSSVZBVEVCVUlMRCBpcyBkZXByZWNhdGVkLlwKKyBVc2UgUE5HX1VTRVJfUFJJVkFURUJVSUxEIGluc3RlYWQuIikKKyMgZGVmaW5lIFBOR19VU0VSX1BSSVZBVEVCVUlMRCBQUklWQVRFQlVJTEQKKyNlbmRpZgorI2VuZGlmIC8qIF9fU1REQ19fICovCisKKyNpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZCisKKy8qIEVuZCBvZiBtYXRlcmlhbCBhZGRlZCB0byBsaWJwbmctMS4yLjggKi8KKworLyogQWRkZWQgYXQgbGlicG5nLTEuMi4xOSwgcmVtb3ZlZCBhdCBsaWJwbmctMS4yLjIwIGJlY2F1c2UgaXQgY2F1c2VkIHRyb3VibGUKKyAgIFJlc3RvcmVkIGF0IGxpYnBuZy0xLjIuMjEgKi8KKyNpZiAhZGVmaW5lZChQTkdfTk9fV0FSTl9VTklOSVRJQUxJWkVEX1JPVykgJiYgXAorICAgICFkZWZpbmVkKFBOR19XQVJOX1VOSU5JVElBTElaRURfUk9XKQorIyAgZGVmaW5lIFBOR19XQVJOX1VOSU5JVElBTElaRURfUk9XIDEKKyNlbmRpZgorLyogRW5kIG9mIG1hdGVyaWFsIGFkZGVkIGF0IGxpYnBuZy0xLjIuMTkvMS4yLjIxICovCisKKy8qIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGJ1ZmZlciwgYW5kIHRodXMgdGhlIHNpemUgb2YKKyAqIGFuIElEQVQgY2h1bmsuICBNYWtlIHRoaXMgd2hhdGV2ZXIgc2l6ZSB5b3UgZmVlbCBpcyBiZXN0IGZvciB5b3VyCisgKiBtYWNoaW5lLiAgT25lIG9mIHRoZXNlIHdpbGwgYmUgYWxsb2NhdGVkIHBlciBwbmdfc3RydWN0LiAgV2hlbiB0aGlzCisgKiBpcyBmdWxsLCBpdCB3cml0ZXMgdGhlIGRhdGEgdG8gdGhlIGRpc2ssIGFuZCBkb2VzIHNvbWUgb3RoZXIKKyAqIGNhbGN1bGF0aW9ucy4gIE1ha2luZyB0aGlzIGFuIGV4dHJlbWVseSBzbWFsbCBzaXplIHdpbGwgc2xvdworICogdGhlIGxpYnJhcnkgZG93biwgYnV0IHlvdSBtYXkgd2FudCB0byBleHBlcmltZW50IHRvIGRldGVybWluZQorICogd2hlcmUgaXQgYmVjb21lcyBzaWduaWZpY2FudCwgaWYgeW91IGFyZSBjb25jZXJuZWQgd2l0aCBtZW1vcnkKKyAqIHVzYWdlLiAgTm90ZSB0aGF0IHpsaWIgYWxsb2NhdGVzIGF0IGxlYXN0IDMyS2IgYWxzby4gIEZvciByZWFkZXJzLAorICogdGhpcyBkZXNjcmliZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBhdmFpbGFibGUgdG8gcmVhZCB0aGUgZGF0YSBpbi4KKyAqIFVubGVzcyB0aGlzIGdldHMgc21hbGxlciB0aGFuIHRoZSBzaXplIG9mIGEgcm93IChjb21wcmVzc2VkKSwKKyAqIGl0IHNob3VsZCBub3QgbWFrZSBtdWNoIGRpZmZlcmVuY2UgaG93IGJpZyB0aGlzIGlzLgorICovCisKKyNpZm5kZWYgUE5HX1pCVUZfU0laRQorIyAgZGVmaW5lIFBOR19aQlVGX1NJWkUgODE5MgorI2VuZGlmCisKKy8qIEVuYWJsZSBpZiB5b3Ugd2FudCBhIHdyaXRlLW9ubHkgbGlicG5nICovCisKKyNpZm5kZWYgUE5HX05PX1JFQURfU1VQUE9SVEVECisjICBkZWZpbmUgUE5HX1JFQURfU1VQUE9SVEVECisjZW5kaWYKKworLyogRW5hYmxlIGlmIHlvdSB3YW50IGEgcmVhZC1vbmx5IGxpYnBuZyAqLworCisjaWZuZGVmIFBOR19OT19XUklURV9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfV1JJVEVfU1VQUE9SVEVECisjZW5kaWYKKworLyogRW5hYmxlZCBpbiAxLjIuNDEuICovCisjaWZkZWYgUE5HX0FMTE9XX0JFTklHTl9FUlJPUlMKKyMgIGRlZmluZSBwbmdfYmVuaWduX2Vycm9yIHBuZ193YXJuaW5nCisjICBkZWZpbmUgcG5nX2NodW5rX2Jlbmlnbl9lcnJvciBwbmdfY2h1bmtfd2FybmluZworI2Vsc2UKKyMgIGlmbmRlZiBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQKKyMgICAgZGVmaW5lIHBuZ19iZW5pZ25fZXJyb3IgcG5nX2Vycm9yCisjICAgIGRlZmluZSBwbmdfY2h1bmtfYmVuaWduX2Vycm9yIHBuZ19jaHVua19lcnJvcgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBBZGRlZCBpbiBsaWJwbmctMS4yLjQxICovCisjaWYgIWRlZmluZWQoUE5HX05PX1dBUk5JTkdTKSAmJiAhZGVmaW5lZChQTkdfV0FSTklOR1NfU1VQUE9SVEVEKQorIyAgZGVmaW5lIFBOR19XQVJOSU5HU19TVVBQT1JURUQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUE5HX05PX0VSUk9SX1RFWFQpICYmICFkZWZpbmVkKFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRCkKKyMgIGRlZmluZSBQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUE5HX05PX0NIRUNLX2NIUk0pICYmICFkZWZpbmVkKFBOR19DSEVDS19jSFJNX1NVUFBPUlRFRCkKKyMgIGRlZmluZSBQTkdfQ0hFQ0tfY0hSTV9TVVBQT1JURUQKKyNlbmRpZgorCisvKiBFbmFibGVkIGJ5IGRlZmF1bHQgaW4gMS4yLjAuICBZb3UgY2FuIGRpc2FibGUgdGhpcyBpZiB5b3UgZG9uJ3QgbmVlZCB0bworICogc3VwcG9ydCBQTkdzIHRoYXQgYXJlIGVtYmVkZGVkIGluIE1ORyBkYXRhc3RyZWFtcworICovCisjaWYgIWRlZmluZWQoUE5HXzFfMF9YKSAmJiAhZGVmaW5lZChQTkdfTk9fTU5HX0ZFQVRVUkVTKQorIyAgaWZuZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFBOR19OT19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisKKy8qIElmIHlvdSBhcmUgcnVubmluZyBvbiBhIG1hY2hpbmUgd2hlcmUgeW91IGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0SyBvZiBtZW1vcnkgYXQgb25jZSwgdW5jb21tZW50IHRoaXMuICBXaGlsZSBsaWJwbmcgd2lsbCBub3QKKyAqIG5vcm1hbGx5IG5lZWQgdGhhdCBtdWNoIG1lbW9yeSBpbiBhIGNodW5rICh1bmxlc3MgeW91IGxvYWQgdXAgYSB2ZXJ5CisgKiBsYXJnZSBmaWxlKSwgemxpYiBuZWVkcyB0byBrbm93IGhvdyBiaWcgb2YgYSBjaHVuayBpdCBjYW4gdXNlLCBhbmQKKyAqIGxpYnBuZyB0aHVzIG1ha2VzIHN1cmUgdG8gY2hlY2sgYW55IG1lbW9yeSBhbGxvY2F0aW9uIHRvIHZlcmlmeSBpdAorICogd2lsbCBmaXQgaW50byBtZW1vcnkuCisjZGVmaW5lIFBOR19NQVhfTUFMTE9DXzY0SworICovCisjaWYgZGVmaW5lZChNQVhTRUdfNjRLKSAmJiAhZGVmaW5lZChQTkdfTUFYX01BTExPQ182NEspCisjICBkZWZpbmUgUE5HX01BWF9NQUxMT0NfNjRLCisjZW5kaWYKKworLyogU3BlY2lhbCBtdW5naW5nIHRvIHN1cHBvcnQgZG9pbmcgdGhpbmdzIHRoZSAnY3lnd2luJyB3YXk6CisgKiAnTm9ybWFsJyBwbmctb24td2luMzIgZGVmaW5lcy9kZWZhdWx0czoKKyAqICAgUE5HX0JVSUxEX0RMTCAtLSBidWlsZGluZyBkbGwKKyAqICAgUE5HX1VTRV9ETEwgICAtLSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiwgbGlua2luZyB0byBkbGwKKyAqICAgKG5vIGRlZmluZSkgICAtLSBidWlsZGluZyBzdGF0aWMgbGlicmFyeSwgb3IgYnVpbGRpbmcgYW4KKyAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhbmQgbGlua2luZyB0byB0aGUgc3RhdGljIGxpYgorICogJ0N5Z3dpbicgZGVmaW5lcy9kZWZhdWx0czoKKyAqICAgUE5HX0JVSUxEX0RMTCAtLSAoaWdub3JlZCkgYnVpbGRpbmcgdGhlIGRsbAorICogICAobm8gZGVmaW5lKSAgIC0tIChpZ25vcmVkKSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiwgbGlua2luZyB0byB0aGUgZGxsCisgKiAgIFBOR19TVEFUSUMgICAgLS0gKGlnbm9yZWQpIGJ1aWxkaW5nIHRoZSBzdGF0aWMgbGliLCBvciBidWlsZGluZyBhbgorICogICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHRoYXQgbGlua3MgdG8gdGhlIHN0YXRpYyBsaWIuCisgKiAgIEFMTF9TVEFUSUMgICAgLS0gKGlnbm9yZWQpIGJ1aWxkaW5nIHZhcmlvdXMgc3RhdGljIGxpYnMsIG9yIGJ1aWxkaW5nIGFuCisgKiAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gdGhhdCBsaW5rcyB0byB0aGUgc3RhdGljIGxpYnMuCisgKiBUaHVzLAorICogYSBjeWd3aW4gdXNlciBzaG91bGQgZGVmaW5lIGVpdGhlciBQTkdfQlVJTERfRExMIG9yIFBOR19TVEFUSUMsIGFuZAorICogdGhpcyBiaXQgb2YgI2lmZGVmcyB3aWxsIGRlZmluZSB0aGUgJ2NvcnJlY3QnIGNvbmZpZyB2YXJpYWJsZXMgYmFzZWQgb24KKyAqIHRoYXQuIElmIGEgY3lnd2luIHVzZXIgKndhbnRzKiB0byBkZWZpbmUgJ1BOR19VU0VfRExMJyB0aGF0J3Mgb2theSwgYnV0CisgKiB1bm5lY2Vzc2FyeS4KKyAqCisgKiBBbHNvLCB0aGUgcHJlY2VkZW5jZSBvcmRlciBpczoKKyAqICAgQUxMX1NUQVRJQyAoc2luY2Ugd2UgY2FuJ3QgI3VuZGVmIHNvbWV0aGluZyBvdXRzaWRlIG91ciBuYW1lc3BhY2UpCisgKiAgIFBOR19CVUlMRF9ETEwKKyAqICAgUE5HX1NUQVRJQworICogICAobm90aGluZykgPT0gUE5HX1VTRV9ETEwKKyAqCisgKiBDWUdXSU4gKDIwMDItMDEtMjApOiBUaGUgcHJlY2VkaW5nIGlzIG5vdyBvYnNvbGV0ZS4gV2l0aCB0aGUgYWR2ZW50CisgKiAgIG9mIGF1dG8taW1wb3J0IGluIGJpbnV0aWxzLCB3ZSBubyBsb25nZXIgbmVlZCB0byB3b3JyeSBhYm91dAorICogICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgLyBfX2RlY2xzcGVjKGRsbGltcG9ydCkgYW5kIGZyaWVuZHMuICBUaGVyZWZvcmUsCisgKiAgIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgUE5HX1NUQVRJQyBvciBBTExfU1RBVElDIHdoZW4gaXQgY29tZXMKKyAqICAgdG8gX19kZWNsc3BlYygpIHN0dWZmLiAgSG93ZXZlciwgd2UgRE8gbmVlZCB0byB3b3JyeSBhYm91dAorICogICBQTkdfQlVJTERfRExMIGFuZCBQTkdfU1RBVElDIGJlY2F1c2UgdGhvc2UgY2hhbmdlIHNvbWUgZGVmYXVsdHMKKyAqICAgc3VjaCBhcyBDT05TT0xFX0lPIGFuZCB3aGV0aGVyIEdMT0JBTF9BUlJBWVMgYXJlIGFsbG93ZWQuCisgKi8KKyNpZmRlZiBfX0NZR1dJTl9fCisjICBpZmRlZiBBTExfU1RBVElDCisjICAgIGlmZGVmIFBOR19CVUlMRF9ETEwKKyMgICAgICB1bmRlZiBQTkdfQlVJTERfRExMCisjICAgIGVuZGlmCisjICAgIGlmZGVmIFBOR19VU0VfRExMCisjICAgICAgdW5kZWYgUE5HX1VTRV9ETEwKKyMgICAgZW5kaWYKKyMgICAgaWZkZWYgUE5HX0RMTAorIyAgICAgIHVuZGVmIFBOR19ETEwKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIFBOR19TVEFUSUMKKyMgICAgICBkZWZpbmUgUE5HX1NUQVRJQworIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZmRlZiBQTkdfQlVJTERfRExMCisjICAgICAgaWZkZWYgUE5HX1NUQVRJQworIyAgICAgICAgdW5kZWYgUE5HX1NUQVRJQworIyAgICAgIGVuZGlmCisjICAgICAgaWZkZWYgUE5HX1VTRV9ETEwKKyMgICAgICAgIHVuZGVmIFBOR19VU0VfRExMCisjICAgICAgZW5kaWYKKyMgICAgICBpZm5kZWYgUE5HX0RMTAorIyAgICAgICAgZGVmaW5lIFBOR19ETEwKKyMgICAgICBlbmRpZgorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUE5HX1NUQVRJQworIyAgICAgICAgaWZkZWYgUE5HX1VTRV9ETEwKKyMgICAgICAgICAgdW5kZWYgUE5HX1VTRV9ETEwKKyMgICAgICAgIGVuZGlmCisjICAgICAgICBpZmRlZiBQTkdfRExMCisjICAgICAgICAgIHVuZGVmIFBOR19ETEwKKyMgICAgICAgIGVuZGlmCisjICAgICAgZWxzZQorIyAgICAgICAgaWZuZGVmIFBOR19VU0VfRExMCisjICAgICAgICAgIGRlZmluZSBQTkdfVVNFX0RMTAorIyAgICAgICAgZW5kaWYKKyMgICAgICAgIGlmbmRlZiBQTkdfRExMCisjICAgICAgICAgIGRlZmluZSBQTkdfRExMCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoaXMgcHJvdGVjdHMgdXMgYWdhaW5zdCBjb21waWxlcnMgdGhhdCBydW4gb24gYSB3aW5kb3dpbmcgc3lzdGVtCisgKiBhbmQgdGh1cyBkb24ndCBoYXZlIG9yIHdvdWxkIHJhdGhlciB1cyBub3QgdXNlIHRoZSBzdGRpbyB0eXBlczoKKyAqIHN0ZGluLCBzdGRvdXQsIGFuZCBzdGRlcnIuICBUaGUgb25seSBvbmUgY3VycmVudGx5IHVzZWQgaXMgc3RkZXJyCisgKiBpbiBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKS4gICNkZWZpbmluZyBQTkdfTk9fQ09OU09MRV9JTyB3aWxsCisgKiBwcmV2ZW50IHRoZXNlIGZyb20gYmVpbmcgY29tcGlsZWQgYW5kIHVzZWQuICNkZWZpbmluZyBQTkdfTk9fU1RESU8KKyAqIHdpbGwgYWxzbyBwcmV2ZW50IHRoZXNlLCBwbHVzIHdpbGwgcHJldmVudCB0aGUgZW50aXJlIHNldCBvZiBzdGRpbworICogbWFjcm9zIGFuZCBmdW5jdGlvbnMgKEZJTEUgKiwgcHJpbnRmLCBldGMuKSBmcm9tIGJlaW5nIGNvbXBpbGVkIGFuZCB1c2VkLAorICogdW5sZXNzIChQTkdfREVCVUcgPiAwKSBoYXMgYmVlbiAjZGVmaW5lZC4KKyAqCisgKiAjZGVmaW5lIFBOR19OT19DT05TT0xFX0lPCisgKiAjZGVmaW5lIFBOR19OT19TVERJTworICovCisKKyNpZiAhZGVmaW5lZChQTkdfTk9fU1RESU8pICYmICFkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpCisjICBkZWZpbmUgUE5HX1NURElPX1NVUFBPUlRFRAorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzJfV0NFCisjICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAvKiBDb25zb2xlIEkvTyBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93c0NFICovCisjICBkZWZpbmUgUE5HX05PX0NPTlNPTEVfSU8KKyAgIC8qIGFib3J0KCkgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgb24gc29tZS9hbGwgV2luZG93cyBDRSBwbGF0Zm9ybXMgKi8KKyMgIGRlZmluZSBQTkdfQUJPUlQoKSBleGl0KC0xKQorIyAgaWZkZWYgUE5HX0RFQlVHCisjICAgIHVuZGVmIFBOR19ERUJVRworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX0JVSUxEX0RMTAorIyAgaWZuZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAorIyAgICBpZm5kZWYgUE5HX05PX0NPTlNPTEVfSU8KKyMgICAgICBkZWZpbmUgUE5HX05PX0NPTlNPTEVfSU8KKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworIyAgaWZkZWYgUE5HX05PX1NURElPCisjICAgIGlmbmRlZiBQTkdfTk9fQ09OU09MRV9JTworIyAgICAgIGRlZmluZSBQTkdfTk9fQ09OU09MRV9JTworIyAgICBlbmRpZgorIyAgICBpZmRlZiBQTkdfREVCVUcKKyMgICAgICBpZiAoUE5HX0RFQlVHID4gMCkKKyMgICAgICAgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWZuZGVmIF9XSU4zMl9XQ0UKKy8qICJzdGRpby5oIiBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93c0NFICovCisjICAgICAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgICAgZW5kaWYKKyMgIGVuZGlmCisKKyNpZiAhKGRlZmluZWQgUE5HX05PX0NPTlNPTEVfSU8pICYmICFkZWZpbmVkKFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRCkKKyMgIGRlZmluZSBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQKKyNlbmRpZgorCisvKiBUaGlzIG1hY3JvIHByb3RlY3RzIHVzIGFnYWluc3QgbWFjaGluZXMgdGhhdCBkb24ndCBoYXZlIGZ1bmN0aW9uCisgKiBwcm90b3R5cGVzIChpZSBLJlIgc3R5bGUgaGVhZGVycykuICBJZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IGhhbmRsZQorICogZnVuY3Rpb24gcHJvdG90eXBlcywgZGVmaW5lIHRoaXMgbWFjcm8gYW5kIHVzZSB0aGUgaW5jbHVkZWQgYW5zaTJrbnIuCisgKiBJJ3ZlIGFsd2F5cyBiZWVuIGFibGUgdG8gdXNlIF9OT19QUk9UTyBhcyB0aGUgaW5kaWNhdG9yLCBidXQgeW91IG1heQorICogbmVlZCB0byBkcmFnIHRoZSBlbXB0eSBkZWNsYXJhdGlvbiBvdXQgaW4gZnJvbnQgb2YgaGVyZSwgb3IgY2hhbmdlIHRoZQorICogaWZkZWYgdG8gc3VpdCB5b3VyIG93biBuZWVkcy4KKyAqLworI2lmbmRlZiBQTkdBUkcKKworI2lmZGVmIE9GIC8qIHpsaWIgcHJvdG90eXBlIG11bmdlciAqLworIyAgZGVmaW5lIFBOR0FSRyhhcmdsaXN0KSBPRihhcmdsaXN0KQorI2Vsc2UKKworI2lmZGVmIF9OT19QUk9UTworIyAgZGVmaW5lIFBOR0FSRyhhcmdsaXN0KSAoKQorIyAgaWZuZGVmIFBOR19UWVBFQ0FTVF9OVUxMCisjICAgICBkZWZpbmUgUE5HX1RZUEVDQVNUX05VTEwKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIFBOR0FSRyhhcmdsaXN0KSBhcmdsaXN0CisjZW5kaWYgLyogX05PX1BST1RPICovCisKKworI2VuZGlmIC8qIE9GICovCisKKyNlbmRpZiAvKiBQTkdBUkcgKi8KKworLyogVHJ5IHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY29tcGlsaW5nIG9uIGEgTWFjLiAgTm90ZSB0aGF0IHRlc3RpbmcgZm9yCisgKiBqdXN0IF9fTVdFUktTX18gaXMgbm90IGdvb2QgZW5vdWdoLCBiZWNhdXNlIHRoZSBDb2Rld2FycmlvciBpcyBub3cgdXNlZAorICogb24gbm9uLU1hYyBwbGF0Zm9ybXMuCisgKi8KKyNpZm5kZWYgTUFDT1MKKyMgIGlmIChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQobWFjaW50b3NoKSkgfHwgZGVmaW5lZChhcHBsZWMpIHx8IFwKKyAgICAgIGRlZmluZWQoVEhJTktfQykgfHwgZGVmaW5lZChfX1NDX18pIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKKyMgICAgZGVmaW5lIE1BQ09TCisjICBlbmRpZgorI2VuZGlmCisKKy8qIGVub3VnaCBwZW9wbGUgbmVlZCB0aGlzIGZvciB2YXJpb3VzIHJlYXNvbnMgdG8gaW5jbHVkZSBpdCBoZXJlICovCisjaWYgIWRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKFJJU0NPUykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19OT19TRVRKTVBfU1VQUE9SVEVEKQorIyAgZGVmaW5lIFBOR19TRVRKTVBfU1VQUE9SVEVECisjZW5kaWYKKworI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisvKiBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gZm9yY2UgYSBzaW5nbGUgc2V0am1wIGJlaGF2aW91ciBvbiBMaW51eC4gIElmCisgKiB0aGUgWCBjb25maWcgc3R1ZmYgZGlkbid0IGRlZmluZSBfQlNEX1NPVVJDRSB3ZSB3b3VsZG4ndCBuZWVkIHRoaXMuCisgKgorICogWW91IGNhbiBieXBhc3MgdGhpcyB0ZXN0IGlmIHlvdSBrbm93IHRoYXQgeW91ciBhcHBsaWNhdGlvbiB1c2VzIGV4YWN0bHkKKyAqIHRoZSBzYW1lIHNldGptcC5oIHRoYXQgd2FzIGluY2x1ZGVkIHdoZW4gbGlicG5nIHdhcyBidWlsdC4gIE9ubHkgZGVmaW5lCisgKiBQTkdfU0tJUF9TRVRKTVBfQ0hFQ0sgd2hpbGUgYnVpbGRpbmcgeW91ciBhcHBsaWNhdGlvbiwgcHJpb3IgdG8gdGhlCisgKiBhcHBsaWNhdGlvbidzICcjaW5jbHVkZSAicG5nLmgiJy4gRG9uJ3QgZGVmaW5lIFBOR19TS0lQX1NFVEpNUF9DSEVDSworICogd2hpbGUgYnVpbGRpbmcgYSBzZXBhcmF0ZSBsaWJwbmcgbGlicmFyeSBmb3IgZ2VuZXJhbCB1c2UuCisgKi8KKworIyAgaWZuZGVmIFBOR19TS0lQX1NFVEpNUF9DSEVDSworIyAgICBpZmRlZiBfX2xpbnV4X18KKyMgICAgICBpZmRlZiBfQlNEX1NPVVJDRQorIyAgICAgICAgZGVmaW5lIFBOR19TQVZFX0JTRF9TT1VSQ0UKKyMgICAgICAgIHVuZGVmIF9CU0RfU09VUkNFCisjICAgICAgZW5kaWYKKyMgICAgICBpZmRlZiBfU0VUSk1QX0gKKyAgICAgICAvKiBJZiB5b3UgZW5jb3VudGVyIGEgY29tcGlsZXIgZXJyb3IgaGVyZSwgc2VlIHRoZSBleHBsYW5hdGlvbgorICAgICAgICAqIG5lYXIgdGhlIGVuZCBvZiBJTlNUQUxMLgorICAgICAgICAqLworICAgICAgICAgICBfX3BuZ2NvbmYuaF9fIGluIGxpYnBuZyBhbHJlYWR5IGluY2x1ZGVzIHNldGptcC5oOworICAgICAgICAgICBfX2RvbnRfXyBpbmNsdWRlIGl0IGFnYWluLjsKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZiAvKiBfX2xpbnV4X18gKi8KKyMgIGVuZGlmIC8qIFBOR19TS0lQX1NFVEpNUF9DSEVDSyAqLworCisgICAvKiBpbmNsdWRlIHNldGptcC5oIGZvciBlcnJvciBoYW5kbGluZyAqLworIyAgaW5jbHVkZSA8c2V0am1wLmg+CisKKyMgIGlmZGVmIF9fbGludXhfXworIyAgICBpZmRlZiBQTkdfU0FWRV9CU0RfU09VUkNFCisjICAgICAgaWZuZGVmIF9CU0RfU09VUkNFCisjICAgICAgICBkZWZpbmUgX0JTRF9TT1VSQ0UKKyMgICAgICBlbmRpZgorIyAgICAgIHVuZGVmIFBOR19TQVZFX0JTRF9TT1VSQ0UKKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qIF9fbGludXhfXyAqLworI2VuZGlmIC8qIFBOR19TRVRKTVBfU1VQUE9SVEVEICovCisKKyNpZmRlZiBCU0QKKyMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbHNlCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisvKiBPdGhlciBkZWZpbmVzIGZvciB0aGluZ3MgbGlrZSBtZW1vcnkgYW5kIHRoZSBsaWtlIGNhbiBnbyBoZXJlLiAgKi8KKyNpZmRlZiBQTkdfSU5URVJOQUwKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBUaGUgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFBOR19FWFRFUk4gYXJlIFBOR19JTlRFUk5BTCBmdW5jdGlvbnMsIHdoaWNoCisgKiBhcmVuJ3QgdXN1YWxseSB1c2VkIG91dHNpZGUgdGhlIGxpYnJhcnkgKGFzIGZhciBhcyBJIGtub3cpLCBzbyBpdCBpcworICogZGViYXRhYmxlIGlmIHRoZXkgc2hvdWxkIGJlIGV4cG9ydGVkIGF0IGFsbC4gIEluIHRoZSBmdXR1cmUsIHdoZW4gaXQgaXMKKyAqIHBvc3NpYmxlIHRvIGhhdmUgcnVuLXRpbWUgcmVnaXN0cnkgb2YgY2h1bmstaGFuZGxpbmcgZnVuY3Rpb25zLCBzb21lIG9mCisgKiB0aGVzZSB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGFnYWluLgorI2RlZmluZSBQTkdfRVhURVJOIGV4dGVybgorICovCisjZGVmaW5lIFBOR19FWFRFUk4KKworLyogT3RoZXIgZGVmaW5lcyBzcGVjaWZpYyB0byBjb21waWxlcnMgY2FuIGdvIGhlcmUuICBUcnkgdG8ga2VlcAorICogdGhlbSBpbnNpZGUgYW4gYXBwcm9wcmlhdGUgaWZkZWYvZW5kaWYgcGFpciBmb3IgcG9ydGFiaWxpdHkuCisgKi8KKworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyMgIGlmZGVmIE1BQ09TCisgICAgIC8qIFdlIG5lZWQgdG8gY2hlY2sgdGhhdCA8bWF0aC5oPiBoYXNuJ3QgYWxyZWFkeSBiZWVuIGluY2x1ZGVkIGVhcmxpZXIKKyAgICAgICogYXMgaXQgc2VlbXMgaXQgZG9lc24ndCBhZ3JlZSB3aXRoIDxmcC5oPiwgeWV0IHdlIHNob3VsZCByZWFsbHkgdXNlCisgICAgICAqIDxmcC5oPiBpZiBwb3NzaWJsZS4KKyAgICAgICovCisjICAgIGlmICFkZWZpbmVkKF9fTUFUSF9IX18pICYmICFkZWZpbmVkKF9fTUFUSF9IKSAmJiAhZGVmaW5lZChfX2NtYXRoX18pCisjICAgICAgaW5jbHVkZSA8ZnAuaD4KKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaW5jbHVkZSA8bWF0aC5oPgorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoX0FNSUdBKSAmJiBkZWZpbmVkKF9fU0FTQykgJiYgZGVmaW5lZChfTTY4ODgxKQorICAgICAvKiBBbWlnYSBTQVMvQzogV2UgbXVzdCBpbmNsdWRlIGJ1aWx0aW4gRlBVIGZ1bmN0aW9ucyB3aGVuIGNvbXBpbGluZyB1c2luZworICAgICAgKiBNQVRIPTY4ODgxCisgICAgICAqLworIyAgICBpbmNsdWRlIDxtNjg4ODEuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworLyogQ29kZXdhcnJpb3Igb24gTlQgaGFzIGxpbmtpbmcgcHJvYmxlbXMgd2l0aG91dCB0aGlzLiAqLworI2lmIChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoV0lOMzIpKSB8fCBkZWZpbmVkKF9fU1REQ19fKQorIyAgZGVmaW5lIFBOR19BTFdBWVNfRVhURVJOCisjZW5kaWYKKworLyogVGhpcyBwcm92aWRlcyB0aGUgbm9uLUFOU0kgKGZhcikgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuICovCisjaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiBkZWZpbmVkKF9fTVNET1NfXykKKyMgIGluY2x1ZGUgPG1lbS5oPgorIyAgaW5jbHVkZSA8YWxsb2MuaD4KKyNlbmRpZgorCisvKiBJIGhhdmUgbm8gaWRlYSB3aHkgaXMgdGhpcyBuZWNlc3NhcnkuLi4gKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV2luZG93cykgfHwgXAorICAgIGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorCisvKiBUaGlzIGNvbnRyb2xzIGhvdyBmaW5lIHRoZSBkaXRoZXJpbmcgZ2V0cy4gIEFzIHRoaXMgYWxsb2NhdGVzCisgKiBhIGxhcmdpc2ggY2h1bmsgb2YgbWVtb3J5ICgzMkspLCB0aG9zZSB3aG8gYXJlIG5vdCBhcyBjb25jZXJuZWQKKyAqIHdpdGggZGl0aGVyaW5nIHF1YWxpdHkgY2FuIGRlY3JlYXNlIHNvbWUgb3IgYWxsIG9mIHRoZXNlLgorICovCisjaWZuZGVmIFBOR19ESVRIRVJfUkVEX0JJVFMKKyMgIGRlZmluZSBQTkdfRElUSEVSX1JFRF9CSVRTIDUKKyNlbmRpZgorI2lmbmRlZiBQTkdfRElUSEVSX0dSRUVOX0JJVFMKKyMgIGRlZmluZSBQTkdfRElUSEVSX0dSRUVOX0JJVFMgNQorI2VuZGlmCisjaWZuZGVmIFBOR19ESVRIRVJfQkxVRV9CSVRTCisjICBkZWZpbmUgUE5HX0RJVEhFUl9CTFVFX0JJVFMgNQorI2VuZGlmCisKKy8qIFRoaXMgY29udHJvbHMgaG93IGZpbmUgdGhlIGdhbW1hIGNvcnJlY3Rpb24gYmVjb21lcyB3aGVuIHlvdQorICogYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiA4IGJpdHMgYW55d2F5LiAgSW5jcmVhc2luZyB0aGlzIHZhbHVlCisgKiByZXN1bHRzIGluIG1vcmUgbWVtb3J5IGJlaW5nIHVzZWQsIGFuZCBtb3JlIHBvdygpIGZ1bmN0aW9ucworICogYmVpbmcgY2FsbGVkIHRvIGZpbGwgaW4gdGhlIGdhbW1hIHRhYmxlcy4gIERvbid0IHNldCB0aGlzIHZhbHVlCisgKiBsZXNzIHRoZW4gOCwgYW5kIGV2ZW4gdGhhdCBtYXkgbm90IHdvcmsgKEkgaGF2ZW4ndCB0ZXN0ZWQgaXQpLgorICovCisKKyNpZm5kZWYgUE5HX01BWF9HQU1NQV84CisjICBkZWZpbmUgUE5HX01BWF9HQU1NQV84IDExCisjZW5kaWYKKworLyogVGhpcyBjb250cm9scyBob3cgbXVjaCBhIGRpZmZlcmVuY2UgaW4gZ2FtbWEgd2UgY2FuIHRvbGVyYXRlIGJlZm9yZQorICogd2UgYWN0dWFsbHkgc3RhcnQgZG9pbmcgZ2FtbWEgY29udmVyc2lvbi4KKyAqLworI2lmbmRlZiBQTkdfR0FNTUFfVEhSRVNIT0xECisjICBkZWZpbmUgUE5HX0dBTU1BX1RIUkVTSE9MRCAwLjA1CisjZW5kaWYKKworI2VuZGlmIC8qIFBOR19JTlRFUk5BTCAqLworCisvKiBUaGUgZm9sbG93aW5nIHVzZXMgY29uc3QgY2hhciAqIGluc3RlYWQgb2YgY2hhciAqIGZvciBlcnJvcgorICogYW5kIHdhcm5pbmcgbWVzc2FnZSBmdW5jdGlvbnMsIHNvIHNvbWUgY29tcGlsZXJzIHdvbid0IGNvbXBsYWluLgorICogSWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSBjb25zdCwgZGVmaW5lIFBOR19OT19DT05TVCBoZXJlLgorICovCisKKyNpZm5kZWYgUE5HX05PX0NPTlNUCisjICBkZWZpbmUgUE5HX0NPTlNUIGNvbnN0CisjZWxzZQorIyAgZGVmaW5lIFBOR19DT05TVAorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBnaXZlIHlvdSB0aGUgYWJpbGl0eSB0byByZW1vdmUgY29kZSBmcm9tIHRoZQorICogbGlicmFyeSB0aGF0IHlvdSB3aWxsIG5vdCBiZSB1c2luZy4gIEkgd2lzaCBJIGNvdWxkIGZpZ3VyZSBvdXQgaG93IHRvCisgKiBhdXRvbWF0ZSB0aGlzLCBidXQgSSBjYW4ndCBkbyB0aGF0IHdpdGhvdXQgbWFraW5nIGl0IHNlcmlvdXNseSBoYXJkCisgKiBvbiB0aGUgdXNlcnMuICBTbyBpZiB5b3UgYXJlIG5vdCB1c2luZyBhbiBhYmlsaXR5LCBjaGFuZ2UgdGhlICNkZWZpbmUKKyAqIHRvIGFuZCAjdW5kZWYsIGFuZCB0aGF0IHBhcnQgb2YgdGhlIGxpYnJhcnkgd2lsbCBub3QgYmUgY29tcGlsZWQuICBJZgorICogeW91ciBsaW5rZXIgY2FuJ3QgZmluZCBhIGZ1bmN0aW9uLCB5b3UgbWF5IHdhbnQgdG8gbWFrZSBzdXJlIHRoZQorICogYWJpbGl0eSBpcyBkZWZpbmVkIGhlcmUuICBTb21lIG9mIHRoZXNlIGRlcGVuZCB1cG9uIHNvbWUgb3RoZXJzIGJlaW5nCisgKiBkZWZpbmVkLiAgSSBoYXZlbid0IGZpZ3VyZWQgb3V0IGFsbCB0aGUgaW50ZXJhY3Rpb25zIGhlcmUsIHNvIHlvdSBtYXkKKyAqIGhhdmUgdG8gZXhwZXJpbWVudCBhd2hpbGUgdG8gZ2V0IGV2ZXJ5dGhpbmcgdG8gY29tcGlsZS4gIElmIHlvdSBhcmUKKyAqIGNyZWF0aW5nIG9yIHVzaW5nIGEgc2hhcmVkIGxpYnJhcnksIHlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdG91Y2ggdGhpcywKKyAqIGFzIGl0IHdpbGwgYWZmZWN0IHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmVzLCBhbmQgdGhpcyB3aWxsIGNhdXNlIGJhZAorICogdGhpbmdzIHRvIGhhcHBlbiBpZiB0aGUgbGlicmFyeSBhbmQvb3IgYXBwbGljYXRpb24gZXZlciBjaGFuZ2UuCisgKi8KKworLyogQW55IGZlYXR1cmVzIHlvdSB3aWxsIG5vdCBiZSB1c2luZyBjYW4gYmUgdW5kZWYnZWQgaGVyZSAqLworCisvKiBHUi1QLCAwLjk2YTogU2V0ICIqVFJBTlNGT1JNU19TVVBQT1JURUQgYXMgZGVmYXVsdCBidXQgYWxsb3cgdXNlcgorICogdG8gdHVybiBpdCBvZmYgd2l0aCAiKlRSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCIgb3IgKlBOR19OT18qX1RSQU5TRk9STVMKKyAqIG9uIHRoZSBjb21waWxlIGxpbmUsIHRoZW4gcGljayBhbmQgY2hvb3NlIHdoaWNoIG9uZXMgdG8gZGVmaW5lIHdpdGhvdXQKKyAqIGhhdmluZyB0byBlZGl0IHRoaXMgZmlsZS4gSXQgaXMgc2FmZSB0byB1c2UgdGhlICpUUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQKKyAqIGlmIHlvdSBvbmx5IHdhbnQgdG8gaGF2ZSBhIHBuZy1jb21wbGlhbnQgcmVhZGVyL3dyaXRlciBidXQgZG9uJ3QgbmVlZAorICogYW55IG9mIHRoZSBleHRyYSB0cmFuc2Zvcm1hdGlvbnMuICBUaGlzIHNhdmVzIGFib3V0IDgwIGtieXRlcyBpbiBhCisgKiB0eXBpY2FsIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4gKFBOR19OT18qIGZvcm0gYWRkZWQgaW4gdmVyc2lvbgorICogMS4wLjFjLCBmb3IgY29uc2lzdGVuY3kpCisgKi8KKworLyogVGhlIHNpemUgb2YgdGhlIHBuZ190ZXh0IHN0cnVjdHVyZSBjaGFuZ2VkIGluIGxpYnBuZy0xLjAuNiB3aGVuCisgKiBpVFh0IHN1cHBvcnQgd2FzIGFkZGVkLiAgaVRYdCBzdXBwb3J0IHdhcyB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQgdGhyb3VnaAorICogbGlicG5nLTEuMi54LCB0byBzdXBwb3J0IG9sZCBhcHBzIHRoYXQgbWFsbG9jIHRoZSBwbmdfdGV4dCBzdHJ1Y3R1cmUKKyAqIGluc3RlYWQgb2YgY2FsbGluZyBwbmdfc2V0X3RleHQoKSBhbmQgbGV0dGluZyBsaWJwbmcgbWFsbG9jIGl0LiAgSXQKKyAqIHdpbGwgYmUgdHVybmVkIG9uIGJ5IGRlZmF1bHQgaW4gbGlicG5nLTEuNC4wLgorICovCisKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZCAoUE5HXzFfMl9YKQorIyAgaWZuZGVmIFBOR19OT19pVFh0X1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX05PX2lUWHRfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19OT19SRUFEX2lUWHQKKyMgICAgZGVmaW5lIFBOR19OT19SRUFEX2lUWHQKKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX05PX1dSSVRFX2lUWHQKKyMgICAgZGVmaW5lIFBOR19OT19XUklURV9pVFh0CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQTkdfTk9faVRYdF9TVVBQT1JURUQpCisjICBpZiAhZGVmaW5lZChQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX05PX1JFQURfaVRYdCkKKyMgICAgZGVmaW5lIFBOR19SRUFEX2lUWHQKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19OT19XUklURV9pVFh0KQorIyAgICBkZWZpbmUgUE5HX1dSSVRFX2lUWHQKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBzdXBwb3J0LCBhZGRlZCBhZnRlciB2ZXJzaW9uIDEuMC4wLCBjYW4gYmUgdHVybmVkIG9mZiBoZXJlIGVuCisgKiBtYXNzZSBieSBkZWZpbmluZyBQTkdfTEVHQUNZX1NVUFBPUlRFRCBpbiBjYXNlIHlvdSBuZWVkIGJpbmFyeSBjb21wYXRpYmlsaXR5CisgKiB3aXRoIG9sZCBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIHRoZSBsZW5ndGggb2YgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8KKyAqIHRvIHJlbWFpbiB1bmNoYW5nZWQuCisgKi8KKworI2lmZGVmIFBOR19MRUdBQ1lfU1VQUE9SVEVECisjICBkZWZpbmUgUE5HX05PX0ZSRUVfTUUKKyMgIGRlZmluZSBQTkdfTk9fUkVBRF9VTktOT1dOX0NIVU5LUworIyAgZGVmaW5lIFBOR19OT19XUklURV9VTktOT1dOX0NIVU5LUworIyAgZGVmaW5lIFBOR19OT19IQU5ETEVfQVNfVU5LTk9XTgorIyAgZGVmaW5lIFBOR19OT19SRUFEX1VTRVJfQ0hVTktTCisjICBkZWZpbmUgUE5HX05PX1JFQURfaUNDUAorIyAgZGVmaW5lIFBOR19OT19XUklURV9pQ0NQCisjICBkZWZpbmUgUE5HX05PX1JFQURfaVRYdAorIyAgZGVmaW5lIFBOR19OT19XUklURV9pVFh0CisjICBkZWZpbmUgUE5HX05PX1JFQURfc0NBTAorIyAgZGVmaW5lIFBOR19OT19XUklURV9zQ0FMCisjICBkZWZpbmUgUE5HX05PX1JFQURfc1BMVAorIyAgZGVmaW5lIFBOR19OT19XUklURV9zUExUCisjICBkZWZpbmUgUE5HX05PX0lORk9fSU1BR0UKKyMgIGRlZmluZSBQTkdfTk9fUkVBRF9SR0JfVE9fR1JBWQorIyAgZGVmaW5lIFBOR19OT19SRUFEX1VTRVJfVFJBTlNGT1JNCisjICBkZWZpbmUgUE5HX05PX1dSSVRFX1VTRVJfVFJBTlNGT1JNCisjICBkZWZpbmUgUE5HX05PX1VTRVJfTUVNCisjICBkZWZpbmUgUE5HX05PX1JFQURfRU1QVFlfUExURQorIyAgZGVmaW5lIFBOR19OT19NTkdfRkVBVFVSRVMKKyMgIGRlZmluZSBQTkdfTk9fRklYRURfUE9JTlRfU1VQUE9SVEVECisjZW5kaWYKKworLyogSWdub3JlIGF0dGVtcHQgdG8gdHVybiBvZmYgYm90aCBmbG9hdGluZyBhbmQgZml4ZWQgcG9pbnQgc3VwcG9ydCAqLworI2lmICFkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpIHx8IFwKKyAgICAhZGVmaW5lZChQTkdfTk9fRklYRURfUE9JTlRfU1VQUE9SVEVEKQorIyAgZGVmaW5lIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyNlbmRpZgorCisjaWZuZGVmIFBOR19OT19GUkVFX01FCisjICBkZWZpbmUgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAorCisjaWYgIWRlZmluZWQoUE5HX1JFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVEKSAmJiBcCisgICAgICAhZGVmaW5lZChQTkdfTk9fUkVBRF9UUkFOU0ZPUk1TKQorIyAgZGVmaW5lIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX05PX1JFQURfRVhQQU5ECisjICAgIGRlZmluZSBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19OT19SRUFEX1NISUZUCisjICAgIGRlZmluZSBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQKKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX05PX1JFQURfUEFDSworIyAgICBkZWZpbmUgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX05PX1JFQURfQkdSCisjICAgIGRlZmluZSBQTkdfUkVBRF9CR1JfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19OT19SRUFEX1NXQVAKKyMgICAgZGVmaW5lIFBOR19SRUFEX1NXQVBfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19OT19SRUFEX1BBQ0tTV0FQCisjICAgIGRlZmluZSBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX05PX1JFQURfSU5WRVJUCisjICAgIGRlZmluZSBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19OT19SRUFEX0RJVEhFUgorIyAgICBkZWZpbmUgUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fUkVBRF9CQUNLR1JPVU5ECisjICAgIGRlZmluZSBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fUkVBRF8xNl9UT184CisjICAgIGRlZmluZSBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fUkVBRF9GSUxMRVIKKyMgICAgZGVmaW5lIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQKKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX05PX1JFQURfR0FNTUEKKyMgICAgZGVmaW5lIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fUkVBRF9HUkFZX1RPX1JHQgorIyAgICBkZWZpbmUgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19OT19SRUFEX1NXQVBfQUxQSEEKKyMgICAgZGVmaW5lIFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19OT19SRUFEX0lOVkVSVF9BTFBIQQorIyAgICBkZWZpbmUgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fUkVBRF9TVFJJUF9BTFBIQQorIyAgICBkZWZpbmUgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19OT19SRUFEX1VTRVJfVFJBTlNGT1JNCisjICAgIGRlZmluZSBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX05PX1JFQURfUkdCX1RPX0dSQVkKKyMgICAgZGVmaW5lIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZiAvKiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLworCisvKiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9OT1RfU1VQUE9SVEVEIGlzIGRlcHJlY2F0ZWQuICovCisjaWYgIWRlZmluZWQoUE5HX05PX1BST0dSRVNTSVZFX1JFQUQpICYmIFwKKyAhZGVmaW5lZChQTkdfUFJPR1JFU1NJVkVfUkVBRF9OT1RfU1VQUE9SVEVEKSAgLyogaWYgeW91IGRvbid0IGRvIHByb2dyZXNzaXZlICovCisjICBkZWZpbmUgUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICAgICAvKiByZWFkaW5nLiAgVGhpcyBpcyBub3QgdGFsa2luZyAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFib3V0IGludGVybGFjaW5nIGNhcGFiaWxpdHkhICBZb3UnbGwgKi8KKyAgICAgICAgICAgIC8qIHN0aWxsIGhhdmUgaW50ZXJsYWNpbmcgdW5sZXNzIHlvdSBjaGFuZ2UgdGhlIGZvbGxvd2luZyBkZWZpbmU6ICovCisjZGVmaW5lIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAvKiByZXF1aXJlZCBmb3IgUE5HLWNvbXBsaWFudCBkZWNvZGVycyAqLworCisvKiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCBpcyBkZXByZWNhdGVkLiAqLworI2lmICFkZWZpbmVkKFBOR19OT19TRVFVRU5USUFMX1JFQUQpICYmIFwKKyAgICAhZGVmaW5lZChQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCkgJiYgXAorICAgICFkZWZpbmVkKFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEKQorIyAgZGVmaW5lIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECisjZW5kaWYKKworI2RlZmluZSBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgLyogcmVxdWlyZWQgaW4gUE5HLWNvbXBsaWFudCBkZWNvZGVycyAqLworCisjaWZuZGVmIFBOR19OT19SRUFEX0NPTVBPU0lURV9OT0RJVgorIyAgaWZuZGVmIFBOR19OT19SRUFEX0NPTVBPU0lURURfTk9ESVYgIC8qIGxpYnBuZy0xLjAueCBtaXNzcGVsbGluZyAqLworIyAgICBkZWZpbmUgUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRCAgLyogd2VsbCB0ZXN0ZWQgb24gSW50ZWwsIFNHSSAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfMV8wX1gpIHx8IGRlZmluZWQgKFBOR18xXzJfWCkKKy8qIERlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHZlcnNpb24gMi4wLjAuCisgICBVc2UgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgaW5zdGVhZC4gKi8KKyNpZm5kZWYgUE5HX05PX1JFQURfRU1QVFlfUExURQorIyAgZGVmaW5lIFBOR19SRUFEX0VNUFRZX1BMVEVfU1VQUE9SVEVECisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisKKyMgaWYgIWRlZmluZWQoUE5HX1dSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCkgJiYgXAorICAgICFkZWZpbmVkKFBOR19OT19XUklURV9UUkFOU0ZPUk1TKQorIyAgZGVmaW5lIFBOR19XUklURV9UUkFOU0ZPUk1TX1NVUFBPUlRFRAorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfVFJBTlNGT1JNU19TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfU0hJRlQKKyMgICAgZGVmaW5lIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQKKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX05PX1dSSVRFX1BBQ0sKKyMgICAgZGVmaW5lIFBOR19XUklURV9QQUNLX1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfQkdSCisjICAgIGRlZmluZSBQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfU1dBUAorIyAgICBkZWZpbmUgUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19OT19XUklURV9QQUNLU1dBUAorIyAgICBkZWZpbmUgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfSU5WRVJUCisjICAgIGRlZmluZSBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfRklMTEVSCisjICAgIGRlZmluZSBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCAgIC8qIHNhbWUgYXMgV1JJVEVfU1RSSVBfQUxQSEEgKi8KKyMgIGVuZGlmCisjICBpZm5kZWYgUE5HX05PX1dSSVRFX1NXQVBfQUxQSEEKKyMgICAgZGVmaW5lIFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNpZm5kZWYgUE5HXzFfMF9YCisjICBpZm5kZWYgUE5HX05PX1dSSVRFX0lOVkVSVF9BTFBIQQorIyAgICBkZWZpbmUgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYKKyMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfVVNFUl9UUkFOU0ZPUk0KKyMgICAgZGVmaW5lIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYgLyogUE5HX1dSSVRFX1RSQU5TRk9STVNfU1VQUE9SVEVEICovCisKKyNpZiAhZGVmaW5lZChQTkdfTk9fV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEKSAmJiBcCisgICAgIWRlZmluZWQoUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkKKyNkZWZpbmUgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAgLyogbm90IHJlcXVpcmVkIGZvciBQTkctY29tcGxpYW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXJzLCBidXQgY2FuIGNhdXNlIHRyb3VibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVmdCB1bmRlZmluZWQgKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUE5HX05PX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUikgJiYgXAorICAgICFkZWZpbmVkKFBOR19XUklURV9XRUlHSFRFRF9GSUxURVIpICYmIFwKKyAgICAgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQorIyAgZGVmaW5lIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECisjZW5kaWYKKworI2lmbmRlZiBQTkdfTk9fV1JJVEVfRkxVU0gKKyMgIGRlZmluZSBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkIChQTkdfMV8yX1gpCisvKiBEZXByZWNhdGVkLCBzZWUgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQsIGFib3ZlICovCisjaWZuZGVmIFBOR19OT19XUklURV9FTVBUWV9QTFRFCisjICBkZWZpbmUgUE5HX1dSSVRFX0VNUFRZX1BMVEVfU1VQUE9SVEVECisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLworCisjaWZuZGVmIFBOR18xXzBfWAorIyAgaWZuZGVmIFBOR19OT19FUlJPUl9OVU1CRVJTCisjICAgIGRlZmluZSBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYgLyogUE5HXzFfMF9YICovCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKKyMgIGlmbmRlZiBQTkdfTk9fVVNFUl9UUkFOU0ZPUk1fUFRSCisjICAgIGRlZmluZSBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFBOR19OT19TVERJTworIyAgZGVmaW5lIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECisjZW5kaWYKKworLyogVGhpcyBhZGRzIGV4dHJhIGZ1bmN0aW9ucyBpbiBwbmdnZXQuYyBmb3IgYWNjZXNzaW5nIGRhdGEgZnJvbSB0aGUKKyAqIGluZm8gcG9pbnRlciAoYWRkZWQgaW4gdmVyc2lvbiAwLjk5KQorICogcG5nX2dldF9pbWFnZV93aWR0aCgpCisgKiBwbmdfZ2V0X2ltYWdlX2hlaWdodCgpCisgKiBwbmdfZ2V0X2JpdF9kZXB0aCgpCisgKiBwbmdfZ2V0X2NvbG9yX3R5cGUoKQorICogcG5nX2dldF9jb21wcmVzc2lvbl90eXBlKCkKKyAqIHBuZ19nZXRfZmlsdGVyX3R5cGUoKQorICogcG5nX2dldF9pbnRlcmxhY2VfdHlwZSgpCisgKiBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbygpCisgKiBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIoKQorICogcG5nX2dldF94X29mZnNldF9waXhlbHMoKQorICogcG5nX2dldF95X29mZnNldF9waXhlbHMoKQorICogcG5nX2dldF94X29mZnNldF9taWNyb25zKCkKKyAqIHBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucygpCisgKi8KKyNpZiAhZGVmaW5lZChQTkdfTk9fRUFTWV9BQ0NFU1MpICYmICFkZWZpbmVkKFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQpCisjICBkZWZpbmUgUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRAorI2VuZGlmCisKKy8qIFBOR19BU1NFTUJMRVJfQ09ERSB3YXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIHZlcnNpb24gMS4yLjAKKyAqIGFuZCByZW1vdmVkIGZyb20gdmVyc2lvbiAxLjIuMjAuICBUaGUgZm9sbG93aW5nIHdpbGwgYmUgcmVtb3ZlZAorICogZnJvbSBsaWJwbmctMS40LjAKKyovCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX05PX09QVElNSVpFRF9DT0RFKQorIyAgaWZuZGVmIFBOR19PUFRJTUlaRURfQ09ERV9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19PUFRJTUlaRURfQ09ERV9TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfTk9fQVNTRU1CTEVSX0NPREUpCisjICBpZm5kZWYgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRAorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAoX19HTlVDX18gPCA0KQorICAgICAvKiB3b3JrIGFyb3VuZCA2NC1iaXQgZ2NjIGNvbXBpbGVyIGJ1Z3MgaW4gZ2NjLTMueCAqLworIyAgICBpZiAhZGVmaW5lZChQTkdfTU1YX0NPREVfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfTk9fTU1YX0NPREUpCisjICAgICAgZGVmaW5lIFBOR19OT19NTVhfQ09ERQorIyAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWZkZWYgX19BUFBMRV9fCisjICAgIGlmICFkZWZpbmVkKFBOR19NTVhfQ09ERV9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19OT19NTVhfQ09ERSkKKyMgICAgICBkZWZpbmUgUE5HX05PX01NWF9DT0RFCisjICAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZiAoZGVmaW5lZChfX01XRVJLU19fKSAmJiAoKF9fTVdFUktTX18gPCAweDA5MDApIHx8IG1hY2ludG9zaCkpCisjICAgIGlmICFkZWZpbmVkKFBOR19NTVhfQ09ERV9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19OT19NTVhfQ09ERSkKKyMgICAgICBkZWZpbmUgUE5HX05PX01NWF9DT0RFCisjICAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZChQTkdfTU1YX0NPREVfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfTk9fTU1YX0NPREUpCisjICAgIGRlZmluZSBQTkdfTU1YX0NPREVfU1VQUE9SVEVECisjICBlbmRpZgorCisjZW5kaWYKKy8qIGVuZCBvZiBvYnNvbGV0ZSBjb2RlIHRvIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS40LjAgKi8KKworLyogQWRkZWQgYXQgbGlicG5nLTEuMi4wICovCisjaWZuZGVmIFBOR18xXzBfWAorI2lmICFkZWZpbmVkKFBOR19OT19VU0VSX01FTSkgJiYgIWRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkKKyMgIGRlZmluZSBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfMV8wX1ggKi8KKworLyogQWRkZWQgYXQgbGlicG5nLTEuMi42ICovCisjaWZuZGVmIFBOR18xXzBfWAorIyAgaWZuZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisjICAgIGlmbmRlZiBQTkdfTk9fU0VUX1VTRVJfTElNSVRTCisjICAgICAgZGVmaW5lIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmIC8qIFBOR18xXzBfWCAqLworCisvKiBBZGRlZCBhdCBsaWJwbmctMS4wLjUzIGFuZCAxLjIuNDMgKi8KKyNpZm5kZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorIyAgaWZuZGVmIFBOR19OT19VU0VSX0xJTUlUUworIyAgICBkZWZpbmUgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBBZGRlZCBhdCBsaWJwbmctMS4wLjE2IGFuZCAxLjIuNi4gIFRvIGFjY2VwdCBhbGwgdmFsaWQgUE5HUyBubyBtYXR0ZXIKKyAqIGhvdyBsYXJnZSwgc2V0IHRoZXNlIGxpbWl0cyB0byAweDdmZmZmZmZmTAorICovCisjaWZuZGVmIFBOR19VU0VSX1dJRFRIX01BWAorIyAgZGVmaW5lIFBOR19VU0VSX1dJRFRIX01BWCAxMDAwMDAwTAorI2VuZGlmCisjaWZuZGVmIFBOR19VU0VSX0hFSUdIVF9NQVgKKyMgIGRlZmluZSBQTkdfVVNFUl9IRUlHSFRfTUFYIDEwMDAwMDBMCisjZW5kaWYKKworLyogQWRkZWQgYXQgbGlicG5nLTEuMi40My4gIFRvIGFjY2VwdCBhbGwgdmFsaWQgUE5HcyBubyBtYXR0ZXIKKyAqIGhvdyBsYXJnZSwgc2V0IHRoZXNlIHR3byBsaW1pdHMgdG8gMC4KKyAqLworI2lmbmRlZiBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVgKKyMgIGRlZmluZSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVggMAorI2VuZGlmCisKKy8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNDMgKi8KKyNpZm5kZWYgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWAorIyAgZGVmaW5lIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggMAorI2VuZGlmCisKKyNpZm5kZWYgUE5HX0xJVEVSQUxfU0hBUlAKKyMgIGRlZmluZSBQTkdfTElURVJBTF9TSEFSUCAweDIzCisjZW5kaWYKKyNpZm5kZWYgUE5HX0xJVEVSQUxfTEVGVF9TUVVBUkVfQlJBQ0tFVAorIyAgZGVmaW5lIFBOR19MSVRFUkFMX0xFRlRfU1FVQVJFX0JSQUNLRVQgMHg1YgorI2VuZGlmCisjaWZuZGVmIFBOR19MSVRFUkFMX1JJR0hUX1NRVUFSRV9CUkFDS0VUCisjICBkZWZpbmUgUE5HX0xJVEVSQUxfUklHSFRfU1FVQVJFX0JSQUNLRVQgMHg1ZAorI2VuZGlmCisKKy8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuMzQgKi8KKyNpZm5kZWYgUE5HX1NUUklOR19ORVdMSU5FCisjZGVmaW5lIFBOR19TVFJJTkdfTkVXTElORSAiXG4iCisjZW5kaWYKKworLyogVGhlc2UgYXJlIGN1cnJlbnRseSBleHBlcmltZW50YWwgZmVhdHVyZXMsIGRlZmluZSB0aGVtIGlmIHlvdSB3YW50ICovCisKKy8qIHZlcnkgbGl0dGxlIHRlc3RpbmcgKi8KKy8qCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19SRUFEXzE2X1RPXzhfQUNDVVJBVEVfU0NBTEVfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisqLworCisvKiBUaGlzIGlzIG9ubHkgZm9yIFBvd2VyUEMgYmlnLWVuZGlhbiBhbmQgNjgweDAgc3lzdGVtcyAqLworLyogc29tZSB0ZXN0aW5nICovCisvKgorI2lmbmRlZiBQTkdfUkVBRF9CSUdfRU5ESUFOX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19SRUFEX0JJR19FTkRJQU5fU1VQUE9SVEVECisjZW5kaWYKKyovCisKKy8qIEJ1Z2d5IGNvbXBpbGVycyAoZS5nLiwgZ2NjIDIuNy4yLjIpIG5lZWQgdGhpcyAqLworLyoKKyNkZWZpbmUgUE5HX05PX1BPSU5URVJfSU5ERVhJTkcKKyovCisKKyNpZiAhZGVmaW5lZChQTkdfTk9fUE9JTlRFUl9JTkRFWElORykgJiYgXAorICAgICFkZWZpbmVkKFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRCkKKyMgIGRlZmluZSBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKKyNlbmRpZgorCisvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdCwgYXMgdGhleSB3aWxsIGJlIHBoYXNlZCBvdXQuICovCisvKgorI2RlZmluZSAgUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVECisjZGVmaW5lICBQTkdfQ09SUkVDVF9QQUxFVFRFX1NVUFBPUlRFRAorKi8KKworLyogQW55IGNodW5rcyB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluLCB5b3UgY2FuIHVuZGVmIGhlcmUuICBUaGUKKyAqIG9uZXMgdGhhdCBhbGxvY2F0ZSBtZW1vcnkgbWF5IGJlIGV4cGVjaWFsbHkgaW1wb3J0YW50IChoSVNULAorICogdEVYdCwgelRYdCwgdFJOUywgcENBTCkuICBPdGhlcnMgd2lsbCBqdXN0IHNhdmUgdGltZSBhbmQgbWFrZSBwbmdfaW5mbworICogYSBiaXQgc21hbGxlci4KKyAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpICYmIFwKKyAgICAhZGVmaW5lZChQTkdfUkVBRF9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQpICYmIFwKKyAgICAhZGVmaW5lZChQTkdfTk9fUkVBRF9BTkNJTExBUllfQ0hVTktTKQorIyAgZGVmaW5lIFBOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfU1VQUE9SVEVECisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgJiYgXAorICAgICFkZWZpbmVkKFBOR19XUklURV9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQpICYmIFwKKyAgICAhZGVmaW5lZChQTkdfTk9fV1JJVEVfQU5DSUxMQVJZX0NIVU5LUykKKyMgIGRlZmluZSBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQKKworI2lmZGVmIFBOR19OT19SRUFEX1RFWFQKKyMgIGRlZmluZSBQTkdfTk9fUkVBRF9pVFh0CisjICBkZWZpbmUgUE5HX05PX1JFQURfdEVYdAorIyAgZGVmaW5lIFBOR19OT19SRUFEX3pUWHQKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fUkVBRF9iS0dECisjICBkZWZpbmUgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfYktHRF9TVVBQT1JURUQKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fUkVBRF9jSFJNCisjICBkZWZpbmUgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfY0hSTV9TVVBQT1JURUQKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fUkVBRF9nQU1BCisjICBkZWZpbmUgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfZ0FNQV9TVVBQT1JURUQKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fUkVBRF9oSVNUCisjICBkZWZpbmUgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfaElTVF9TVVBQT1JURUQKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fUkVBRF9pQ0NQCisjICBkZWZpbmUgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKKyMgIGRlZmluZSBQTkdfaUNDUF9TVVBQT1JURUQKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fUkVBRF9pVFh0CisjICBpZm5kZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVECisjICBlbmRpZgorIyAgaWZuZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX2lUWHRfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX29GRnMKKyMgIGRlZmluZSBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19vRkZzX1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3BDQUwKKyMgIGRlZmluZSBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19wQ0FMX1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3NDQUwKKyMgIGRlZmluZSBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19zQ0FMX1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3BIWXMKKyMgIGRlZmluZSBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19wSFlzX1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3NCSVQKKyMgIGRlZmluZSBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19zQklUX1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3NQTFQKKyMgIGRlZmluZSBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19zUExUX1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3NSR0IKKyMgIGRlZmluZSBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR19zUkdCX1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3RFWHQKKyMgIGRlZmluZSBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR190RVh0X1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3RJTUUKKyMgIGRlZmluZSBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR190SU1FX1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3RSTlMKKyMgIGRlZmluZSBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR190Uk5TX1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX3pUWHQKKyMgIGRlZmluZSBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorIyAgZGVmaW5lIFBOR196VFh0X1NVUFBPUlRFRAorI2VuZGlmCisjaWZuZGVmIFBOR19OT19SRUFEX09QVF9QTFRFCisjICBkZWZpbmUgUE5HX1JFQURfT1BUX1BMVEVfU1VQUE9SVEVEIC8qIG9ubHkgYWZmZWN0cyBzdXBwb3J0IG9mIHRoZSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgIC8qIG9wdGlvbmFsIFBMVEUgY2h1bmsgaW4gUkdCIGFuZCBSR0JBIGltYWdlcyAqLworI2lmIGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfdEVYdF9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEKQorIyAgZGVmaW5lIFBOR19SRUFEX1RFWFRfU1VQUE9SVEVECisjICBkZWZpbmUgUE5HX1RFWFRfU1VQUE9SVEVECisjZW5kaWYKKworI2VuZGlmIC8qIFBOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfU1VQUE9SVEVEICovCisKKyNpZm5kZWYgUE5HX05PX1JFQURfVU5LTk9XTl9DSFVOS1MKKyMgIGRlZmluZSBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoUE5HX05PX1JFQURfVVNFUl9DSFVOS1MpICYmIFwKKyAgICAgZGVmaW5lZChQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCisjICBkZWZpbmUgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisjICBkZWZpbmUgUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAorIyAgaWZkZWYgUE5HX05PX1JFQURfVU5LTk9XTl9DSFVOS1MKKyMgICAgdW5kZWYgUE5HX05PX1JFQURfVU5LTk9XTl9DSFVOS1MKKyMgIGVuZGlmCisjICBpZmRlZiBQTkdfTk9fSEFORExFX0FTX1VOS05PV04KKyMgICAgdW5kZWYgUE5HX05PX0hBTkRMRV9BU19VTktOT1dOCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUE5HX05PX0hBTkRMRV9BU19VTktOT1dOCisjICBpZm5kZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorI2lmZGVmIFBOR19XUklURV9BTkNJTExBUllfQ0hVTktTX1NVUFBPUlRFRAorCisjaWZkZWYgUE5HX05PX1dSSVRFX1RFWFQKKyMgIGRlZmluZSBQTkdfTk9fV1JJVEVfaVRYdAorIyAgZGVmaW5lIFBOR19OT19XUklURV90RVh0CisjICBkZWZpbmUgUE5HX05PX1dSSVRFX3pUWHQKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fV1JJVEVfYktHRAorIyAgZGVmaW5lIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRAorIyAgaWZuZGVmIFBOR19iS0dEX1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX2JLR0RfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFBOR19OT19XUklURV9jSFJNCisjICBkZWZpbmUgUE5HX1dSSVRFX2NIUk1fU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX2NIUk1fU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfY0hSTV9TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgUE5HX05PX1dSSVRFX2dBTUEKKyMgIGRlZmluZSBQTkdfV1JJVEVfZ0FNQV9TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfZ0FNQV9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19nQU1BX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fV1JJVEVfaElTVAorIyAgZGVmaW5lIFBOR19XUklURV9oSVNUX1NVUFBPUlRFRAorIyAgaWZuZGVmIFBOR19oSVNUX1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX2hJU1RfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFBOR19OT19XUklURV9pQ0NQCisjICBkZWZpbmUgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX2lDQ1BfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfaUNDUF9TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgUE5HX05PX1dSSVRFX2lUWHQKKyMgIGlmbmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19XUklURV9pVFh0X1NVUFBPUlRFRAorIyAgZW5kaWYKKyMgIGlmbmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19pVFh0X1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fV1JJVEVfb0ZGcworIyAgZGVmaW5lIFBOR19XUklURV9vRkZzX1NVUFBPUlRFRAorIyAgaWZuZGVmIFBOR19vRkZzX1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX29GRnNfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFBOR19OT19XUklURV9wQ0FMCisjICBkZWZpbmUgUE5HX1dSSVRFX3BDQUxfU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX3BDQUxfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfcENBTF9TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgUE5HX05PX1dSSVRFX3NDQUwKKyMgIGRlZmluZSBQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfc0NBTF9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19zQ0FMX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fV1JJVEVfcEhZcworIyAgZGVmaW5lIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAorIyAgaWZuZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX3BIWXNfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFBOR19OT19XUklURV9zQklUCisjICBkZWZpbmUgUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX3NCSVRfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfc0JJVF9TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgUE5HX05PX1dSSVRFX3NQTFQKKyMgIGRlZmluZSBQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19zUExUX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fV1JJVEVfc1JHQgorIyAgZGVmaW5lIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRAorIyAgaWZuZGVmIFBOR19zUkdCX1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX3NSR0JfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFBOR19OT19XUklURV90RVh0CisjICBkZWZpbmUgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX3RFWHRfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfdEVYdF9TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgUE5HX05PX1dSSVRFX3RJTUUKKyMgIGRlZmluZSBQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfdElNRV9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR190SU1FX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBQTkdfTk9fV1JJVEVfdFJOUworIyAgZGVmaW5lIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAorIyAgaWZuZGVmIFBOR190Uk5TX1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX3RSTlNfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFBOR19OT19XUklURV96VFh0CisjICBkZWZpbmUgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX3pUWHRfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfelRYdF9TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKFBOR19XUklURV9pVFh0X1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfdEVYdF9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV96VFh0X1NVUFBPUlRFRCkKKyMgIGRlZmluZSBQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19URVhUX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX05PX0NPTlZFUlRfdElNRQorIyAgICBpZm5kZWYgX1dJTjMyX1dDRQorLyogICBUaGUgInRtIiBzdHJ1Y3R1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzQ0UgKi8KKyMgICAgICBpZm5kZWYgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQKKyMgICAgICAgIGRlZmluZSBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRAorIyAgICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIFBOR19XUklURV9BTkNJTExBUllfQ0hVTktTX1NVUFBPUlRFRCAqLworCisjaWYgIWRlZmluZWQoUE5HX05PX1dSSVRFX0ZJTFRFUikgJiYgIWRlZmluZWQoUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQpCisjICBkZWZpbmUgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKKyNlbmRpZgorCisjaWZuZGVmIFBOR19OT19XUklURV9VTktOT1dOX0NIVU5LUworIyAgZGVmaW5lIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisjICAgIGRlZmluZSBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUE5HX05PX0hBTkRMRV9BU19VTktOT1dOCisjICBpZm5kZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorIyAgICBkZWZpbmUgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorIyAgZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8qIFBOR19XUklURV9TVVBQT1JURUQgKi8KKworLyogVHVybiB0aGlzIG9mZiB0byBkaXNhYmxlIHBuZ19yZWFkX3BuZygpIGFuZAorICogcG5nX3dyaXRlX3BuZygpIGFuZCBsZWF2ZSB0aGUgcm93X3BvaW50ZXJzIG1lbWJlcgorICogb3V0IG9mIHRoZSBpbmZvIHN0cnVjdHVyZS4KKyAqLworI2lmbmRlZiBQTkdfTk9fSU5GT19JTUFHRQorIyAgZGVmaW5lIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAorI2VuZGlmCisKKy8qIE5lZWQgdGhlIHRpbWUgaW5mb3JtYXRpb24gZm9yIGNvbnZlcnRpbmcgdElNRSBjaHVua3MgKi8KKyNpZmRlZiBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRAorICAgICAvKiAidGltZS5oIiBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93c0NFICovCisjICAgIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisvKiBTb21lIHR5cGVkZWZzIHRvIGdldCB1cyBzdGFydGVkLiAgVGhlc2Ugc2hvdWxkIGJlIHNhZmUgb24gbW9zdCBvZiB0aGUKKyAqIGNvbW1vbiBwbGF0Zm9ybXMuICBUaGUgdHlwZWRlZnMgc2hvdWxkIGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZQorICogbnVtYmVycyBzdWdnZXN0IChhIHBuZ191aW50XzMyIG11c3QgYmUgYXQgbGVhc3QgMzIgYml0cyBsb25nKSwgYnV0IHRoZXkKKyAqIGRvbid0IGhhdmUgdG8gYmUgZXhhY3RseSB0aGF0IHNpemUuICBTb21lIGNvbXBpbGVycyBkaXNsaWtlIHBhc3NpbmcKKyAqIHVuc2lnbmVkIHNob3J0cyBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzLCBzbyB5b3UgbWF5IGJlIGJldHRlciBvZmYgdXNpbmcKKyAqIHVuc2lnbmVkIGludCBmb3IgcG5nX3VpbnRfMTYuICBMaWtld2lzZSwgZm9yIDY0LWJpdCBzeXN0ZW1zLCB5b3UgbWF5CisgKiB3YW50IHRvIGhhdmUgdW5zaWduZWQgaW50IGZvciBwbmdfdWludF8zMiBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBuZ191aW50XzMyOwordHlwZWRlZiBsb25nIHBuZ19pbnRfMzI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHBuZ191aW50XzE2OwordHlwZWRlZiBzaG9ydCBwbmdfaW50XzE2OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHBuZ19ieXRlOworCisvKiBUaGlzIGlzIHVzdWFsbHkgc2l6ZV90LiAgSXQgaXMgdHlwZWRlZidlZCBqdXN0IGluIGNhc2UgeW91IG5lZWQgaXQgdG8KKyAgIGNoYW5nZSAoSSdtIG5vdCBzdXJlIGlmIHlvdSB3aWxsIG9yIG5vdCwgc28gSSB0aG91Z2h0IEknZCBiZSBzYWZlKSAqLworI2lmZGVmIFBOR19TSVpFX1QKKyAgIHR5cGVkZWYgUE5HX1NJWkVfVCBwbmdfc2l6ZV90OworIyAgZGVmaW5lIHBuZ19zaXplb2YoeCkgcG5nX2NvbnZlcnRfc2l6ZShzaXplb2YoeCkpCisjZWxzZQorICAgdHlwZWRlZiBzaXplX3QgcG5nX3NpemVfdDsKKyMgIGRlZmluZSBwbmdfc2l6ZW9mKHgpIHNpemVvZih4KQorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgbmVlZGVkIGZvciBtZWRpdW0gbW9kZWwgc3VwcG9ydC4gIEl0IGNhbm5vdCBiZSBpbiB0aGUKKyAqIFBOR19JTlRFUk5BTCBzZWN0aW9uLiAgTmVlZHMgbW9kaWZpY2F0aW9uIGZvciBvdGhlciBjb21waWxlcnMgYmVzaWRlcworICogTVNDLiAgTW9kZWwgaW5kZXBlbmRlbnQgc3VwcG9ydCBkZWNsYXJlcyBhbGwgYXJyYXlzIGFuZCBwb2ludGVycyB0byBiZQorICogbGFyZ2UgdXNpbmcgdGhlIGZhciBrZXl3b3JkLiAgVGhlIHpsaWIgdmVyc2lvbiB1c2VkIG11c3QgYWxzbyBzdXBwb3J0CisgKiBtb2RlbCBpbmRlcGVuZGVudCBkYXRhLiAgQXMgb2YgdmVyc2lvbiB6bGliIDEuMC40LCB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMKKyAqIGhhdmUgYmVlbiBtYWRlIGluIHpsaWIuICBUaGUgVVNFX0ZBUl9LRVlXT1JEIGRlZmluZSB0cmlnZ2VycyBvdGhlcgorICogY2hhbmdlcyB0aGF0IGFyZSBuZWVkZWQuIChUaW0gV2VnbmVyKQorICovCisKKy8qIFNlcGFyYXRlIGNvbXBpbGVyIGRlcGVuZGVuY2llcyAocHJvYmxlbSBoZXJlIGlzIHRoYXQgemxpYi5oIGFsd2F5cworICAgZGVmaW5lcyBGQVIuIChTSlQpICovCisjaWZkZWYgX19CT1JMQU5EQ19fCisjICBpZiBkZWZpbmVkKF9fTEFSR0VfXykgfHwgZGVmaW5lZChfX0hVR0VfXykgfHwgZGVmaW5lZChfX0NPTVBBQ1RfXykKKyMgICAgZGVmaW5lIExEQVRBIDEKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExEQVRBIDAKKyMgIGVuZGlmCisgICAvKiBHUlI6ICB3aHkgaXMgQ3lnd2luIGluIGhlcmU/ICBDeWd3aW4gaXMgbm90IEJvcmxhbmQgQy4uLiAqLworIyAgaWYgIWRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyMgICAgZGVmaW5lIFBOR19NQVhfTUFMTE9DXzY0SworIyAgICBpZiAoTERBVEEgIT0gMSkKKyMgICAgICBpZm5kZWYgRkFSCisjICAgICAgICBkZWZpbmUgRkFSIF9fZmFyCisjICAgICAgZW5kaWYKKyMgICAgICBkZWZpbmUgVVNFX0ZBUl9LRVlXT1JECisjICAgIGVuZGlmICAgLyogTERBVEEgIT0gMSAqLworICAgICAvKiBQb3NzaWJseSB1c2VmdWwgZm9yIG1vdmluZyBkYXRhIG91dCBvZiBkZWZhdWx0IHNlZ21lbnQuCisgICAgICAqIFVuY29tbWVudCBpdCBpZiB5b3Ugd2FudC4gQ291bGQgYWxzbyBkZWZpbmUgRkFSREFUQSBhcworICAgICAgKiBjb25zdCBpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIGl0LiAoU0pUKQorIyAgICBkZWZpbmUgRkFSREFUQSBGQVIKKyAgICAgICovCisjICBlbmRpZiAgLyogX19XSU4zMl9fLCBfX0ZMQVRfXywgX19DWUdXSU5fXyAqLworI2VuZGlmICAgLyogX19CT1JMQU5EQ19fICovCisKKworLyogU3VnZ2VzdCB0ZXN0aW5nIGZvciBzcGVjaWZpYyBjb21waWxlciBmaXJzdCBiZWZvcmUgdGVzdGluZyBmb3IKKyAqIEZBUi4gIFRoZSBXYXRjb20gY29tcGlsZXIgZGVmaW5lcyBib3RoIF9fTUVESVVNX18gYW5kIE1fSTg2TU0sCisgKiBtYWtpbmcgcmVsaWFuY2Ugb25jZXJ0YWluIGtleXdvcmRzIHN1c3BlY3QuIChTSlQpCisgKi8KKworLyogTVNDIE1lZGl1bSBtb2RlbCAqLworI2lmZGVmIEZBUgorIyAgaWZkZWYgTV9JODZNTQorIyAgICBkZWZpbmUgVVNFX0ZBUl9LRVlXT1JECisjICAgIGRlZmluZSBGQVJEQVRBIEZBUgorIyAgICBpbmNsdWRlIDxkb3MuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworLyogU0pUOiBkZWZhdWx0IGNhc2UgKi8KKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworLyogQXQgdGhpcyBwb2ludCBGQVIgaXMgYWx3YXlzIGRlZmluZWQgKi8KKyNpZm5kZWYgRkFSREFUQQorIyAgZGVmaW5lIEZBUkRBVEEKKyNlbmRpZgorCisvKiBUeXBlZGVmIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzIHRoYXQgYXJlIGNvbnZlcnRlZAorICAgdG8gZml4ZWQtcG9pbnQgd2l0aCBhIG11bHRpcGxlIG9mIDEwMCwwMDAsIGUuZy4sIGludF9nYW1tYSAqLwordHlwZWRlZiBwbmdfaW50XzMyIHBuZ19maXhlZF9wb2ludDsKKworLyogQWRkIHR5cGVkZWZzIGZvciBwb2ludGVycyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICAgRkFSICogcG5nX3ZvaWRwOwordHlwZWRlZiBwbmdfYnl0ZSAgICAgICAgRkFSICogcG5nX2J5dGVwOwordHlwZWRlZiBwbmdfdWludF8zMiAgICAgRkFSICogcG5nX3VpbnRfMzJwOwordHlwZWRlZiBwbmdfaW50XzMyICAgICAgRkFSICogcG5nX2ludF8zMnA7Cit0eXBlZGVmIHBuZ191aW50XzE2ICAgICBGQVIgKiBwbmdfdWludF8xNnA7Cit0eXBlZGVmIHBuZ19pbnRfMTYgICAgICBGQVIgKiBwbmdfaW50XzE2cDsKK3R5cGVkZWYgUE5HX0NPTlNUIGNoYXIgIEZBUiAqIHBuZ19jb25zdF9jaGFycDsKK3R5cGVkZWYgY2hhciAgICAgICAgICAgIEZBUiAqIHBuZ19jaGFycDsKK3R5cGVkZWYgcG5nX2ZpeGVkX3BvaW50IEZBUiAqIHBuZ19maXhlZF9wb2ludF9wOworCisjaWZuZGVmIFBOR19OT19TVERJTworI2lmZGVmIF9XSU4zMl9XQ0UKK3R5cGVkZWYgSEFORExFICAgICAgICAgICAgICAgIHBuZ19GSUxFX3A7CisjZWxzZQordHlwZWRlZiBGSUxFICAgICAgICAgICAgICAgICogcG5nX0ZJTEVfcDsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECit0eXBlZGVmIGRvdWJsZSAgICAgICAgICBGQVIgKiBwbmdfZG91YmxlcDsKKyNlbmRpZgorCisvKiBQb2ludGVycyB0byBwb2ludGVyczsgaS5lLiBhcnJheXMgKi8KK3R5cGVkZWYgcG5nX2J5dGUgICAgICAgIEZBUiAqIEZBUiAqIHBuZ19ieXRlcHA7Cit0eXBlZGVmIHBuZ191aW50XzMyICAgICBGQVIgKiBGQVIgKiBwbmdfdWludF8zMnBwOwordHlwZWRlZiBwbmdfaW50XzMyICAgICAgRkFSICogRkFSICogcG5nX2ludF8zMnBwOwordHlwZWRlZiBwbmdfdWludF8xNiAgICAgRkFSICogRkFSICogcG5nX3VpbnRfMTZwcDsKK3R5cGVkZWYgcG5nX2ludF8xNiAgICAgIEZBUiAqIEZBUiAqIHBuZ19pbnRfMTZwcDsKK3R5cGVkZWYgUE5HX0NPTlNUIGNoYXIgIEZBUiAqIEZBUiAqIHBuZ19jb25zdF9jaGFycHA7Cit0eXBlZGVmIGNoYXIgICAgICAgICAgICBGQVIgKiBGQVIgKiBwbmdfY2hhcnBwOwordHlwZWRlZiBwbmdfZml4ZWRfcG9pbnQgRkFSICogRkFSICogcG5nX2ZpeGVkX3BvaW50X3BwOworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK3R5cGVkZWYgZG91YmxlICAgICAgICAgIEZBUiAqIEZBUiAqIHBuZ19kb3VibGVwcDsKKyNlbmRpZgorCisvKiBQb2ludGVycyB0byBwb2ludGVycyB0byBwb2ludGVyczsgaS5lLiwgcG9pbnRlciB0byBhcnJheSAqLwordHlwZWRlZiBjaGFyICAgICAgICAgICAgRkFSICogRkFSICogRkFSICogcG5nX2NoYXJwcHA7CisKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZChQTkdfMV8yX1gpCisvKiBTUEMgLSAgSXMgdGhpcyBzdHVmZiBkZXByZWNhdGVkPyAqLworLyogSXQnbGwgYmUgcmVtb3ZlZCBhcyBvZiBsaWJwbmctMS40LjAgLSBHUi1QICovCisvKiBsaWJwbmcgdHlwZWRlZnMgZm9yIHR5cGVzIGluIHpsaWIuIElmIHpsaWIgY2hhbmdlcworICogb3IgYW5vdGhlciBjb21wcmVzc2lvbiBsaWJyYXJ5IGlzIHVzZWQsIHRoZW4gY2hhbmdlIHRoZXNlLgorICogRWxpbWluYXRlcyBuZWVkIHRvIGNoYW5nZSBhbGwgdGhlIHNvdXJjZSBmaWxlcy4KKyAqLwordHlwZWRlZiBjaGFyZiAqICAgICAgICAgcG5nX3pjaGFycDsKK3R5cGVkZWYgY2hhcmYgKiBGQVIgKiAgIHBuZ196Y2hhcnBwOwordHlwZWRlZiB6X3N0cmVhbSBGQVIgKiAgcG5nX3pzdHJlYW1wOworI2VuZGlmIC8qIChQTkdfMV8wX1gpIHx8IGRlZmluZWQoUE5HXzFfMl9YKSAqLworCisvKgorICogRGVmaW5lIFBOR19CVUlMRF9ETEwgaWYgdGhlIG1vZHVsZSBiZWluZyBidWlsdCBpcyBhIFdpbmRvd3MKKyAqIExJQlBORyBETEwuCisgKgorICogRGVmaW5lIFBOR19VU0VfRExMIGlmIHlvdSB3YW50IHRvICpsaW5rKiB0byB0aGUgV2luZG93cyBMSUJQTkcgRExMLgorICogSXQgaXMgZXF1aXZhbGVudCB0byBNaWNyb3NvZnQgcHJlZGVmaW5lZCBtYWNybyBfRExMIHRoYXQgaXMKKyAqIGF1dG9tYXRpY2FsbHkgZGVmaW5lZCB3aGVuIHlvdSBjb21waWxlIHVzaW5nIHRoZSBzaGFyZQorICogdmVyc2lvbiBvZiB0aGUgQ1JUIChDIFJ1bi1UaW1lIGxpYnJhcnkpCisgKgorICogVGhlIGN5Z3dpbiBtb2RzIG1ha2UgdGhpcyBiZWhhdmlvciBhIGxpdHRsZSBkaWZmZXJlbnQ6CisgKiBEZWZpbmUgUE5HX0JVSUxEX0RMTCBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgZGxsIGZvciB1c2Ugd2l0aCBjeWd3aW4KKyAqIERlZmluZSBQTkdfU1RBVElDIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBzdGF0aWMgbGlicmFyeSBmb3IgdXNlIHdpdGggY3lnd2luLAorICogICAtb3ItIGlmIHlvdSBhcmUgYnVpbGRpbmcgYW4gYXBwbGljYXRpb24gdGhhdCB5b3Ugd2FudCB0byBsaW5rIHRvIHRoZQorICogICBzdGF0aWMgbGlicmFyeS4KKyAqIFBOR19VU0VfRExMIGlzIGRlZmluZWQgYnkgZGVmYXVsdCAobm8gdXNlciBhY3Rpb24gbmVlZGVkKSB1bmxlc3Mgb25lIG9mCisgKiAgIHRoZSBvdGhlciBmbGFncyBpcyBkZWZpbmVkLgorICovCisKKyNpZiAhZGVmaW5lZChQTkdfRExMKSAmJiAoZGVmaW5lZChQTkdfQlVJTERfRExMKSB8fCBkZWZpbmVkKFBOR19VU0VfRExMKSkKKyMgIGRlZmluZSBQTkdfRExMCisjZW5kaWYKKy8qIElmIENZR1dJTiwgdGhlbiBkaXNhbGxvdyBHTE9CQUwgQVJSQVlTIHVubGVzcyBidWlsZGluZyBhIHN0YXRpYyBsaWIuCisgKiBXaGVuIGJ1aWxkaW5nIGEgc3RhdGljIGxpYiwgZGVmYXVsdCB0byBubyBHTE9CQUwgQVJSQVlTLCBidXQgYWxsb3cKKyAqIGNvbW1hbmQtbGluZSBvdmVycmlkZQorICovCisjaWZkZWYgX19DWUdXSU5fXworIyAgaWZuZGVmIFBOR19TVEFUSUMKKyMgICAgaWZkZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCisjICAgICAgdW5kZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworIyAgICAgIGRlZmluZSBQTkdfVVNFX0xPQ0FMX0FSUkFZUworIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZiBkZWZpbmVkKFBOR19VU0VfTE9DQUxfQVJSQVlTKSB8fCBkZWZpbmVkKFBOR19OT19HTE9CQUxfQVJSQVlTKQorIyAgICAgIGlmZGVmIFBOR19VU0VfR0xPQkFMX0FSUkFZUworIyAgICAgICAgdW5kZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChQTkdfVVNFX0xPQ0FMX0FSUkFZUykgJiYgIWRlZmluZWQoUE5HX1VTRV9HTE9CQUxfQVJSQVlTKQorIyAgICBkZWZpbmUgUE5HX1VTRV9MT0NBTF9BUlJBWVMKKyMgIGVuZGlmCisjZW5kaWYKKworLyogRG8gbm90IHVzZSBnbG9iYWwgYXJyYXlzIChoZWxwcyB3aXRoIGJ1aWxkaW5nIERMTCdzKQorICogVGhleSBhcmUgbm8gbG9uZ2VyIHVzZWQgaW4gbGlicG5nIGl0c2VsZiwgc2luY2UgdmVyc2lvbiAxLjAuNWMsCisgKiBidXQgbWlnaHQgYmUgcmVxdWlyZWQgZm9yIHNvbWUgcHJlLTEuMC41YyBhcHBsaWNhdGlvbnMuCisgKi8KKyNpZiAhZGVmaW5lZChQTkdfVVNFX0xPQ0FMX0FSUkFZUykgJiYgIWRlZmluZWQoUE5HX1VTRV9HTE9CQUxfQVJSQVlTKQorIyAgaWYgZGVmaW5lZChQTkdfTk9fR0xPQkFMX0FSUkFZUykgfHwgXAorICAgICAgKGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoUE5HX0RMTCkpIHx8IGRlZmluZWQoX01TQ19WRVIpCisjICAgIGRlZmluZSBQTkdfVVNFX0xPQ0FMX0FSUkFZUworIyAgZWxzZQorIyAgICBkZWZpbmUgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0NZR1dJTl9fCisjICB1bmRlZiBQTkdBUEkKKyMgIGRlZmluZSBQTkdBUEkgX19jZGVjbAorIyAgdW5kZWYgUE5HX0lNUEVYUAorIyAgZGVmaW5lIFBOR19JTVBFWFAKKyNlbmRpZgorCisvKiBJZiB5b3UgZGVmaW5lIFBOR0FQSSwgZS5nLiwgd2l0aCBjb21waWxlciBvcHRpb24gIi1EUE5HQVBJPV9fc3RkY2FsbCIsCisgKiB5b3UgbWF5IGdldCB3YXJuaW5ncyByZWdhcmRpbmcgdGhlIGxpbmthZ2Ugb2YgcG5nX3phbGxvYyBhbmQgcG5nX3pmcmVlLgorICogRG9uJ3QgaWdub3JlIHRob3NlIHdhcm5pbmdzOyB5b3UgbXVzdCBhbHNvIHJlc2V0IHRoZSBkZWZhdWx0IGNhbGxpbmcKKyAqIGNvbnZlbnRpb24gaW4geW91ciBjb21waWxlciB0byBtYXRjaCB5b3VyIFBOR0FQSSwgYW5kIHlvdSBtdXN0IGJ1aWxkCisgKiB6bGliIGFuZCB5b3VyIGFwcGxpY2F0aW9ucyB0aGUgc2FtZSB3YXkgeW91IGJ1aWxkIGxpYnBuZy4KKyAqLworCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgIWRlZmluZWQoUE5HX01PRFVMRURFRikKKyMgIGlmbmRlZiBQTkdfTk9fTU9EVUxFREVGCisjICAgIGRlZmluZSBQTkdfTk9fTU9EVUxFREVGCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQTkdfSU1QRVhQKSAmJiBkZWZpbmVkKFBOR19CVUlMRF9ETEwpICYmICFkZWZpbmVkKFBOR19OT19NT0RVTEVERUYpCisjICBkZWZpbmUgUE5HX0lNUEVYUAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19ETEwpIHx8IGRlZmluZWQoX0RMTCkgfHwgZGVmaW5lZChfX0RMTF9fICkgfHwgXAorICAgICgoIGRlZmluZWQoX1dpbmRvd3MpIHx8IGRlZmluZWQoX1dJTkRPV1MpIHx8IFwKKyAgICAgICBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pICkpCisKKyMgIGlmbmRlZiBQTkdBUEkKKyMgICAgIGlmIGRlZmluZWQoX19HTlVDX18pIHx8IChkZWZpbmVkIChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDgwMCkpCisjICAgICAgICBkZWZpbmUgUE5HQVBJIF9fY2RlY2wKKyMgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBQTkdBUEkgX2NkZWNsCisjICAgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQoUE5HX0lNUEVYUCkgJiYgKCFkZWZpbmVkKFBOR19ETEwpIHx8IFwKKyAgICAgICAwIC8qIFdJTkNPTVBJTEVSX1dJVEhfTk9fU1VQUE9SVF9GT1JfREVDTElNUEVYUCAqLykKKyMgICAgIGRlZmluZSBQTkdfSU1QRVhQCisjICBlbmRpZgorCisjICBpZm5kZWYgUE5HX0lNUEVYUAorCisjICAgICBkZWZpbmUgUE5HX0VYUE9SVF9UWVBFMSh0eXBlLHN5bWJvbCkgIFBOR19JTVBFWFAgdHlwZSBQTkdBUEkgc3ltYm9sCisjICAgICBkZWZpbmUgUE5HX0VYUE9SVF9UWVBFMih0eXBlLHN5bWJvbCkgIHR5cGUgUE5HX0lNUEVYUCBQTkdBUEkgc3ltYm9sCisKKyAgICAgIC8qIEJvcmxhbmQvTWljcm9zb2Z0ICovCisjICAgICBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyMgICAgICAgIGlmIChfTVNDX1ZFUiA+PSA4MDApIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApCisjICAgICAgICAgICBkZWZpbmUgUE5HX0VYUE9SVCBQTkdfRVhQT1JUX1RZUEUxCisjICAgICAgICBlbHNlCisjICAgICAgICAgICBkZWZpbmUgUE5HX0VYUE9SVCBQTkdfRVhQT1JUX1RZUEUyCisjICAgICAgICAgICBpZmRlZiBQTkdfQlVJTERfRExMCisjICAgICAgICAgICAgICBkZWZpbmUgUE5HX0lNUEVYUCBfX2V4cG9ydAorIyAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgZGVmaW5lIFBOR19JTVBFWFAgLypfX2ltcG9ydCAqLyAvKiBkb2Vzbid0IGV4aXN0IEFGQUlLIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkMrKyAqLworIyAgICAgICAgICAgZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4aXN0cyBpbiBCb3JsYW5kIEMrKyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKysgY2xhc3NlcyAoPT0gaHVnZSkgKi8KKyMgICAgICAgIGVuZGlmCisjICAgICBlbmRpZgorCisjICAgICBpZm5kZWYgUE5HX0lNUEVYUAorIyAgICAgICAgaWZkZWYgUE5HX0JVSUxEX0RMTAorIyAgICAgICAgICAgZGVmaW5lIFBOR19JTVBFWFAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgICBlbHNlCisjICAgICAgICAgICBkZWZpbmUgUE5HX0lNUEVYUCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICAgIGVuZGlmCisjICAgICBlbmRpZgorIyAgZW5kaWYgIC8qIFBOR19JTVBFWFAgKi8KKyNlbHNlIC8qICEoRExMIHx8IG5vbi1jeWd3aW4gV0lORE9XUykgKi8KKyMgICBpZiAoZGVmaW5lZChfX0lCTUNfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKSkgJiYgZGVmaW5lZChfX09TMl9fKQorIyAgICAgIGlmbmRlZiBQTkdBUEkKKyMgICAgICAgICBkZWZpbmUgUE5HQVBJIF9TeXN0ZW0KKyMgICAgICBlbmRpZgorIyAgIGVsc2UKKyMgICAgICBpZiAwIC8qIC4uLiBvdGhlciBwbGF0Zm9ybXMsIHdpdGggb3RoZXIgbWVhbmluZ3MgKi8KKyMgICAgICBlbmRpZgorIyAgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBQTkdBUEkKKyMgIGRlZmluZSBQTkdBUEkKKyNlbmRpZgorI2lmbmRlZiBQTkdfSU1QRVhQCisjICBkZWZpbmUgUE5HX0lNUEVYUAorI2VuZGlmCisKKyNpZmRlZiBQTkdfQlVJTERTWU1TCisjICBpZm5kZWYgUE5HX0VYUE9SVAorIyAgICBkZWZpbmUgUE5HX0VYUE9SVCh0eXBlLHN5bWJvbCkgUE5HX0ZVTkNUSU9OX0VYUE9SVCBzeW1ib2wgRU5ECisjICBlbmRpZgorIyAgaWZkZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCisjICAgIGlmbmRlZiBQTkdfRVhQT1JUX1ZBUgorIyAgICAgIGRlZmluZSBQTkdfRVhQT1JUX1ZBUih0eXBlKSBQTkdfREFUQV9FWFBPUlQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBQTkdfRVhQT1JUCisjICBkZWZpbmUgUE5HX0VYUE9SVCh0eXBlLHN5bWJvbCkgUE5HX0lNUEVYUCB0eXBlIFBOR0FQSSBzeW1ib2wKKyNlbmRpZgorCisjaWZkZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCisjICBpZm5kZWYgUE5HX0VYUE9SVF9WQVIKKyMgICAgZGVmaW5lIFBOR19FWFBPUlRfVkFSKHR5cGUpIGV4dGVybiBQTkdfSU1QRVhQIHR5cGUKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19QRURBTlRJQ19XQVJOSU5HUworIyAgaWZuZGVmIFBOR19QRURBTlRJQ19XQVJOSU5HU19TVVBQT1JURUQKKyMgICAgZGVmaW5lIFBOR19QRURBTlRJQ19XQVJOSU5HU19TVVBQT1JURUQKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19QRURBTlRJQ19XQVJOSU5HU19TVVBQT1JURUQKKy8qIFN1cHBvcnQgZm9yIGNvbXBpbGVyIHNwZWNpZmljIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICBUaGVzZSBhcmUgdXNlZAorICogc28gdGhhdCB3aGVyZSBjb21waWxlciBzdXBwb3J0IGlzIGF2YWlsYWJsZSBpbmNvcnJlY3QgdXNlIG9mIEFQSQorICogZnVuY3Rpb25zIGluIHBuZy5oIHdpbGwgZ2VuZXJhdGUgY29tcGlsZXIgd2FybmluZ3MuICBBZGRlZCBhdCBsaWJwbmcKKyAqIHZlcnNpb24gMS4yLjQxLgorICovCisjICBpZmRlZiBfX0dOVUNfXworIyAgICBpZm5kZWYgUE5HX1VTRV9SRVNVTFQKKyMgICAgICBkZWZpbmUgUE5HX1VTRV9SRVNVTFQgX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBQTkdfTk9SRVRVUk4KKyMgICAgICBkZWZpbmUgUE5HX05PUkVUVVJOICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIFBOR19BTExPQ0FURUQKKyMgICAgICBkZWZpbmUgUE5HX0FMTE9DQVRFRCAgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpCisjICAgIGVuZGlmCisKKyAgICAvKiBUaGlzIHNwZWNpZmljYWxseSBwcm90ZWN0cyBzdHJ1Y3R1cmUgbWVtYmVycyB0aGF0IHNob3VsZCBvbmx5IGJlCisgICAgICogYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIGxpYnJhcnksIHRoZXJlZm9yZSBzaG91bGQgYmUgZW1wdHkgZHVyaW5nCisgICAgICogYSBsaWJyYXJ5IGJ1aWxkLgorICAgICAqLworIyAgICBpZm5kZWYgUE5HX0RFUFJFQ0FURUQKKyMgICAgICBkZWZpbmUgUE5HX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18pKQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgUE5HX0RFUFNUUlVDVAorIyAgICAgIGRlZmluZSBQTkdfREVQU1RSVUNUICBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXykpCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBQTkdfUFJJVkFURQorIyAgICAgIGlmIDAgLyogRG9lc24ndCB3b3JrIHNvIHdlIHVzZSBkZXByZWNhdGVkIGluc3RlYWQqLworIyAgICAgICAgZGVmaW5lIFBOR19QUklWQVRFIFwKKyAgICAgICAgICBfX2F0dHJpYnV0ZV9fKCh3YXJuaW5nKCJUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBvcnRlZCBieSBsaWJwbmcuIikpKQorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBQTkdfUFJJVkFURSBcCisgICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18pKQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmIC8qIFBOR19QUklWQVRFICovCisjICBlbmRpZiAvKiBfX0dOVUNfXyAqLworI2VuZGlmIC8qIFBOR19QRURBTlRJQ19XQVJOSU5HUyAqLworCisjaWZuZGVmIFBOR19ERVBSRUNBVEVECisjICBkZWZpbmUgUE5HX0RFUFJFQ0FURUQgIC8qIFVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgKi8KKyNlbmRpZgorI2lmbmRlZiBQTkdfVVNFX1JFU1VMVAorIyAgZGVmaW5lIFBOR19VU0VfUkVTVUxUICAvKiBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjaGVja2VkICovCisjZW5kaWYKKyNpZm5kZWYgUE5HX05PUkVUVVJOCisjICBkZWZpbmUgUE5HX05PUkVUVVJOICAgIC8qIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuICovCisjZW5kaWYKKyNpZm5kZWYgUE5HX0FMTE9DQVRFRAorIyAgZGVmaW5lIFBOR19BTExPQ0FURUQgICAvKiBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBpcyBuZXcgbWVtb3J5ICovCisjZW5kaWYKKyNpZm5kZWYgUE5HX0RFUFNUUlVDVAorIyAgZGVmaW5lIFBOR19ERVBTVFJVQ1QgICAvKiBBY2Nlc3MgdG8gdGhpcyBzdHJ1Y3QgbWVtYmVyIGlzIGRlcHJlY2F0ZWQgKi8KKyNlbmRpZgorI2lmbmRlZiBQTkdfUFJJVkFURQorIyAgZGVmaW5lIFBOR19QUklWQVRFICAgICAvKiBUaGlzIGlzIGEgcHJpdmF0ZSBsaWJwbmcgZnVuY3Rpb24gKi8KKyNlbmRpZgorCisvKiBVc2VyIG1heSB3YW50IHRvIHVzZSB0aGVzZSBzbyB0aGV5IGFyZSBub3QgaW4gUE5HX0lOVEVSTkFMLiBBbnkgbGlicmFyeQorICogZnVuY3Rpb25zIHRoYXQgYXJlIHBhc3NlZCBmYXIgZGF0YSBtdXN0IGJlIG1vZGVsIGluZGVwZW5kZW50LgorICovCisKKyNpZm5kZWYgUE5HX0FCT1JUCisjICBkZWZpbmUgUE5HX0FCT1JUKCkgYWJvcnQoKQorI2VuZGlmCisKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgKChwbmdfcHRyKS0+am1wYnVmKQorI2Vsc2UKKyMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpIFwKKyAgIChMSUJQTkdfV0FTX0NPTVBJTEVEX1dJVEhfX1BOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCkKKyNlbmRpZgorCisjaWZkZWYgVVNFX0ZBUl9LRVlXT1JEICAvKiBtZW1vcnkgbW9kZWwgaW5kZXBlbmRlbnQgZm5zICovCisvKiBVc2UgdGhpcyB0byBtYWtlIGZhci10by1uZWFyIGFzc2lnbm1lbnRzICovCisjICBkZWZpbmUgQ0hFQ0sgICAxCisjICBkZWZpbmUgTk9DSEVDSyAwCisjICBkZWZpbmUgQ1ZUX1BUUihwdHIpIChwbmdfZmFyX3RvX25lYXIocG5nX3B0cixwdHIsQ0hFQ0spKQorIyAgZGVmaW5lIENWVF9QVFJfTk9DSEVDSyhwdHIpIChwbmdfZmFyX3RvX25lYXIocG5nX3B0cixwdHIsTk9DSEVDSykpCisjICBkZWZpbmUgcG5nX3NucHJpbnRmIF9mc25wcmludGYgICAvKiBBZGRlZCB0byB2IDEuMi4xOSAqLworIyAgZGVmaW5lIHBuZ19zdHJsZW4gIF9mc3RybGVuCisjICBkZWZpbmUgcG5nX21lbWNtcCAgX2ZtZW1jbXAgICAgLyogU0pUOiBhZGRlZCAqLworIyAgZGVmaW5lIHBuZ19tZW1jcHkgIF9mbWVtY3B5CisjICBkZWZpbmUgcG5nX21lbXNldCAgX2ZtZW1zZXQKKyNlbHNlIC8qIFVzZSB0aGUgdXN1YWwgZnVuY3Rpb25zICovCisjICBkZWZpbmUgQ1ZUX1BUUihwdHIpICAgICAgICAgKHB0cikKKyMgIGRlZmluZSBDVlRfUFRSX05PQ0hFQ0socHRyKSAocHRyKQorIyAgaWZuZGVmIFBOR19OT19TTlBSSU5URgorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBwbmdfc25wcmludGYgX3NucHJpbnRmICAgLyogQWRkZWQgdG8gdiAxLjIuMTkgKi8KKyMgICAgICBkZWZpbmUgcG5nX3NucHJpbnRmMiBfc25wcmludGYKKyMgICAgICBkZWZpbmUgcG5nX3NucHJpbnRmNiBfc25wcmludGYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBwbmdfc25wcmludGYgc25wcmludGYgICAvKiBBZGRlZCB0byB2IDEuMi4xOSAqLworIyAgICAgIGRlZmluZSBwbmdfc25wcmludGYyIHNucHJpbnRmCisjICAgICAgZGVmaW5lIHBuZ19zbnByaW50ZjYgc25wcmludGYKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyAgICAgLyogWW91IGRvbid0IGhhdmUgb3IgZG9uJ3Qgd2FudCB0byB1c2Ugc25wcmludGYoKS4gIENhdXRpb246IFVzaW5nCisgICAgICAqIHNwcmludGYgaW5zdGVhZCBvZiBzbnByaW50ZiBleHBvc2VzIHlvdXIgYXBwbGljYXRpb24gdG8gYWNjaWRlbnRhbAorICAgICAgKiBvciBtYWxldm9sZW50IGJ1ZmZlciBvdmVyZmxvd3MuICBJZiB5b3UgZG9uJ3QgaGF2ZSBzbnByaW50ZigpCisgICAgICAqIGFzIGEgZ2VuZXJhbCBydWxlIHlvdSBzaG91bGQgcHJvdmlkZSBvbmUgKHlvdSBjYW4gZ2V0IG9uZSBmcm9tCisgICAgICAqIFBvcnRhYmxlIE9wZW5TU0gpLgorICAgICAgKi8KKyMgICAgZGVmaW5lIHBuZ19zbnByaW50ZihzMSxuLGZtdCx4MSkgc3ByaW50ZihzMSxmbXQseDEpCisjICAgIGRlZmluZSBwbmdfc25wcmludGYyKHMxLG4sZm10LHgxLHgyKSBzcHJpbnRmKHMxLGZtdCx4MSx4MikKKyMgICAgZGVmaW5lIHBuZ19zbnByaW50ZjYoczEsbixmbXQseDEseDIseDMseDQseDUseDYpIFwKKyAgICAgICAgc3ByaW50ZihzMSxmbXQseDEseDIseDMseDQseDUseDYpCisjICBlbmRpZgorIyAgZGVmaW5lIHBuZ19zdHJsZW4gIHN0cmxlbgorIyAgZGVmaW5lIHBuZ19tZW1jbXAgIG1lbWNtcCAgICAgIC8qIFNKVDogYWRkZWQgKi8KKyMgIGRlZmluZSBwbmdfbWVtY3B5ICBtZW1jcHkKKyMgIGRlZmluZSBwbmdfbWVtc2V0ICBtZW1zZXQKKyNlbmRpZgorLyogRW5kIG9mIG1lbW9yeSBtb2RlbCBpbmRlcGVuZGVudCBzdXBwb3J0ICovCisKKy8qIEp1c3QgYSBsaXR0bGUgY2hlY2sgdGhhdCBzb21lb25lIGhhc24ndCB0cmllZCB0byBkZWZpbmUgc29tZXRoaW5nCisgKiBjb250cmFkaWN0b3J5LgorICovCisjaWYgKFBOR19aQlVGX1NJWkUgPiA2NTUzNkwpICYmIGRlZmluZWQoUE5HX01BWF9NQUxMT0NfNjRLKQorIyAgdW5kZWYgUE5HX1pCVUZfU0laRQorIyAgZGVmaW5lIFBOR19aQlVGX1NJWkUgNjU1MzZMCisjZW5kaWYKKworLyogQWRkZWQgYXQgbGlicG5nLTEuMi44ICovCisjZW5kaWYgLyogUE5HX1ZFUlNJT05fSU5GT19PTkxZICovCisKKyNlbmRpZiAvKiBQTkdDT05GX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvcmVmc3RyLmggYi9jb20zMi9pbmNsdWRlL3JlZnN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMDFkNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3JlZnN0ci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmVmc3RyLmgKKyAqCisgKiBTaW1wbGUgcmVmZXJlbmNlLWNvdW50ZWQgc3RyaW5ncworICovCisKKyNpZm5kZWYgUkVGU1RSX0gKKyNkZWZpbmUgUkVGU1RSX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKChhbHdheXNfaW5saW5lKSkKK2NvbnN0IGNoYXIgKnJlZnN0cl9nZXQoY29uc3QgY2hhciAqcikKK3sKKyAgICBpZiAocikKKwkoKHVuc2lnbmVkIGludCAqKXIpWy0xXSsrOworICAgIHJldHVybiByOworfQorCit2b2lkIHJlZnN0cl9wdXQoY29uc3QgY2hhciAqKTsKK2NoYXIgKnJlZnN0cl9hbGxvYyhzaXplX3QpOworY29uc3QgY2hhciAqcmVmc3RyZHVwKGNvbnN0IGNoYXIgKik7Citjb25zdCBjaGFyICpyZWZzdHJuZHVwKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK2ludCByc3ByaW50Zihjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICosIC4uLik7CitpbnQgdnJzcHJpbnRmKGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zZXRqbXAuaCBiL2NvbTMyL2luY2x1ZGUvc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwOTA5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc2V0am1wLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfU0VUSk1QX0gKKyNkZWZpbmUgX1NFVEpNUF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKyNpbmNsdWRlIDxrbGliYy9pMzg2L2FyY2hzZXRqbXAuaD4KKyNlbGlmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA4CisjaW5jbHVkZSA8a2xpYmMveDg2XzY0L2FyY2hzZXRqbXAuaD4KKyNlbHNlCisjZXJyb3IgInVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSIKKyNlbmRpZgorCitfX2V4dGVybiBpbnQgc2V0am1wKGptcF9idWYpOworX19leHRlcm4gX19ub3JldHVybiBsb25nam1wKGptcF9idWYsIGludCk7CisKK3R5cGVkZWYgam1wX2J1ZiBzaWdqbXBfYnVmOworCisjZGVmaW5lIHNpZ3NldGptcChfX2VudiwgX19zYXZlKSBzZXRqbXAoX19lbnYpCisjZGVmaW5lIHNpZ2xvbmdqbXAoX19lbnYsIF9fdmFsKSBsb25nam1wKF9fZW52LCBfX3ZhbCkKKworI2VuZGlmIC8qIF9TRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zb3J0LmggYi9jb20zMi9pbmNsdWRlL3NvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQ5NTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zb3J0LmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIHNvcnQuaCAtIFF1aWNrIHNvcnQgbW9kdWxlIEFQSSBkZWZpbml0aW9ucworICoKKyAqICBDcmVhdGVkIG9uOiBBdWcgMTEsIDIwMDgKKyAqICAgICAgQXV0aG9yOiBTdGVmYW4gQnVjdXIgPHN0ZWZhbmJAenl0b3IuY29tPgorICovCisKKyNpZm5kZWYgU09SVF9IXworI2RlZmluZSBTT1JUX0hfCisKKy8qKgorICogcXVpY2tfc29ydCAtIEluIHBsYWNlIHNvcnQgb2YgYW4gYXJyYXkgb2YgbnVtYmVycy4KKyAqIEBudW1zOiBQb2ludGVyIHRvIHRoZSBhcnJheQorICogQGNvdW50OiBUaGUgbnVtYmVyIGNvdW50IGluIHRoZSBhcnJheQorICovCitleHRlcm4gdm9pZCBxdWlja19zb3J0KGludCAqbnVtcywgaW50IGNvdW50KTsKKworI2VuZGlmIC8qIFNPUlRfSF8gKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3RkYXJnLmggYi9jb20zMi9pbmNsdWRlL3N0ZGFyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzI0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N0ZGFyZy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBzdGRhcmcuaAorICoKKyAqIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgZm9yIHRoZSBnY2Mgb25lLCBidXQgZGVmaW5lcyB2YV9jb3B5KCkKKyAqIGV2ZW4gaWYgZ2NjIGRvZXNuJ3QuCisgKi8KKworLyogTm90ZTogdGhlIF9TVERBUkdfSCBtYWNybyBiZWxvbmdzIHRvIHRoZSBnY2MgaGVhZGVyLi4uICovCisjaW5jbHVkZV9uZXh0IDxzdGRhcmcuaD4KKworLyogT2xkZXIgZ2NjIGNvbnNpZGVycyB0aGlzIGFuIGV4dGVuc2lvbiwgc28gaXQncyBkb3VibGUgdW5kZXJiYXIgb25seSAqLworI2lmbmRlZiB2YV9jb3B5CisjZGVmaW5lIHZhX2NvcHkoZCxzKSBfX3ZhX2NvcHkoZCxzKQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N0ZGJvb2wuaCBiL2NvbTMyL2luY2x1ZGUvc3RkYm9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxY2IwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N0ZGJvb2wuaApAQCAtMCwwICsxLDMyIEBACisvKgorICoKKyAqIHN0ZGJvb2wuaAorICovCisKKyNpZm5kZWYgX1NUREJPT0xfSAorI2RlZmluZSBfU1REQk9PTF9ICisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2lmICFkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pIHx8IChfX1NURENfVkVSU0lPTl9fIDwgMTk5OTAxTCkKKyMgaWYgIWRlZmluZWQoX19HTlVDX18pIHx8KF9fR05VQ19fIDwgMykKK3R5cGVkZWYgY2hhciBfQm9vbDsJCS8qIEZvciBDIGNvbXBpbGVycyB3aXRob3V0IF9Cb29sICovCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBib29sICBfQm9vbAorI2RlZmluZSB0cnVlICAxCisjZGVmaW5lIGZhbHNlIDAKKworI2Vsc2UKKworLyogQysrICovCisjZGVmaW5lIGJvb2wgIGJvb2wKKyNkZWZpbmUgdHJ1ZSAgdHJ1ZQorI2RlZmluZSBmYWxzZSBmYWxzZQorCisjZW5kaWYKKworI2RlZmluZSBfX2Jvb2xfdHJ1ZV9mYWxzZV9hcmVfZGVmaW5lZCAxCisKKyNlbmRpZiAvKiBfU1REQk9PTF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N0ZGRlZi5oIGIvY29tMzIvaW5jbHVkZS9zdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTJkNjJmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zdGRkZWYuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogc3RkZGVmLmgKKyAqLworCisjaWZuZGVmIF9TVERERUZfSAorI2RlZmluZSBfU1REREVGX0gKKworI2lmbmRlZiBfX0tMSUJDX18KKyMgZGVmaW5lIF9fS0xJQkNfXyAxCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHNpemUvc3RkZGVmLmg+CisKKyN1bmRlZiBOVUxMCisjaWZkZWYgX19jcGx1c3BsdXMKKyMgZGVmaW5lIE5VTEwgMAorI2Vsc2UKKyMgZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKyNlbmRpZgorCisjdW5kZWYgb2Zmc2V0b2YKKyNkZWZpbmUgb2Zmc2V0b2YodCxtKSAoKHNpemVfdCkmKCh0ICopMCktPm0pCisKKyN1bmRlZiBjb250YWluZXJfb2YKKy8qCisgKiBUaGUgY29udGFpbmVyX29mIGNvbnN0cnVjdDogaWYgcCBpcyBhIHBvaW50ZXIgdG8gbWVtYmVyIG0gb2YKKyAqIGNvbnRhaW5lciBjbGFzcyBjLCB0aGVuIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5lciBvZiB3aGljaAorICogKnAgaXMgYSBtZW1iZXIuCisgKi8KKyNkZWZpbmUgY29udGFpbmVyX29mKHAsIGMsIG0pICgoYyAqKSgoY2hhciAqKShwKSAtIG9mZnNldG9mKGMsbSkpKQorCisjZW5kaWYgLyogX1NURERFRl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N0ZGludC5oIGIvY29tMzIvaW5jbHVkZS9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRmMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zdGRpbnQuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIHN0ZGludC5oCisgKi8KKworI2lmbmRlZiBfU1RESU5UX0gKKyNkZWZpbmUgX1NURElOVF9ICisKKyNpbmNsdWRlIDxiaXRzaXplL3N0ZGludC5oPgorCit0eXBlZGVmIGludDhfdAkJaW50X2xlYXN0OF90OwordHlwZWRlZiBpbnQxNl90CQlpbnRfbGVhc3QxNl90OwordHlwZWRlZiBpbnQzMl90CQlpbnRfbGVhc3QzMl90OwordHlwZWRlZiBpbnQ2NF90CQlpbnRfbGVhc3Q2NF90OworCit0eXBlZGVmIHVpbnQ4X3QJCXVpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIHVpbnQxNl90CXVpbnRfbGVhc3QxNl90OwordHlwZWRlZiB1aW50MzJfdAl1aW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgdWludDY0X3QJdWludF9sZWFzdDY0X3Q7CisKK3R5cGVkZWYgaW50OF90CQlpbnRfZmFzdDhfdDsKK3R5cGVkZWYgaW50NjRfdAkJaW50X2Zhc3Q2NF90OworCit0eXBlZGVmIHVpbnQ4X3QJCXVpbnRfZmFzdDhfdDsKK3R5cGVkZWYgdWludDY0X3QJdWludF9mYXN0NjRfdDsKKwordHlwZWRlZiBpbnQ2NF90CQlpbnRtYXhfdDsKK3R5cGVkZWYgdWludDY0X3QJdWludG1heF90OworCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERDX0xJTUlUX01BQ1JPUykKKworI2RlZmluZSBJTlQ4X01JTgkoLTEyOCkKKyNkZWZpbmUgSU5UMTZfTUlOCSgtMzI3NjgpCisjZGVmaW5lIElOVDMyX01JTgkoLTIxNDc0ODM2NDctMSkKKyNkZWZpbmUgSU5UNjRfTUlOCShfX0lOVDY0X0MoLTkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisKKyNkZWZpbmUgSU5UOF9NQVgJKDEyNykKKyNkZWZpbmUgSU5UMTZfTUFYCSgzMjc2NykKKyNkZWZpbmUgSU5UMzJfTUFYCSgyMTQ3NDgzNjQ3KQorI2RlZmluZSBJTlQ2NF9NQVgJKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKworI2RlZmluZSBVSU5UOF9NQVgJKDI1NVUpCisjZGVmaW5lIFVJTlQxNl9NQVgJKDY1NTM1VSkKKyNkZWZpbmUgVUlOVDMyX01BWAkoNDI5NDk2NzI5NVUpCisjZGVmaW5lIFVJTlQ2NF9NQVgJKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisjZGVmaW5lIElOVF9MRUFTVDhfTUlOCUlOVDhfTUlOCisjZGVmaW5lIElOVF9MRUFTVDE2X01JTglJTlQxNl9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUMzJfTUlOCUlOVDMyX01JTgorI2RlZmluZSBJTlRfTEVBU1Q2NF9NSU4JSU5UNjRfTUlOCisKKyNkZWZpbmUgSU5UX0xFQVNUOF9NQVgJSU5UOF9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUMTZfTUFYCUlOVDE2X01BWAorI2RlZmluZSBJTlRfTEVBU1QzMl9NQVgJSU5UMzJfTUFYCisjZGVmaW5lIElOVF9MRUFTVDY0X01BWAlJTlQ2NF9NQVgKKworI2RlZmluZSBVSU5UX0xFQVNUOF9NQVgJIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UX0xFQVNUMTZfTUFYIFVJTlQxNl9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDMyX01BWCBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1Q2NF9NQVggVUlOVDY0X01BWAorCisjZGVmaW5lIElOVF9GQVNUOF9NSU4JSU5UOF9NSU4KKyNkZWZpbmUgSU5UX0ZBU1Q2NF9NSU4JSU5UNjRfTUlOCisKKyNkZWZpbmUgSU5UX0ZBU1Q4X01BWAlJTlQ4X01BWAorI2RlZmluZSBJTlRfRkFTVDY0X01BWAlJTlQ2NF9NQVgKKworI2RlZmluZSBVSU5UX0ZBU1Q4X01BWAlVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUNjRfTUFYIFVJTlQ2NF9NQVgKKworI2RlZmluZSBJTlRNQVhfTUlOCUlOVDY0X01JTgorI2RlZmluZSBJTlRNQVhfTUFYCUlOVDY0X01BWAorI2RlZmluZSBVSU5UTUFYX01BWAlVSU5UNjRfTUFYCisKKyNpbmNsdWRlIDxiaXRzaXplL3N0ZGludGxpbWl0cy5oPgorCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fU1REQ19DT05TVEFOVF9NQUNST1MpCisKKyNkZWZpbmUgSU5UOF9DKGMpCWMKKyNkZWZpbmUgSU5UMTZfQyhjKQljCisjZGVmaW5lIElOVDMyX0MoYykJYworI2RlZmluZSBJTlQ2NF9DKGMpCV9fSU5UNjRfQyhjKQorCisjZGVmaW5lIFVJTlQ4X0MoYykJYyAjIyBVCisjZGVmaW5lIFVJTlQxNl9DKGMpCWMgIyMgVQorI2RlZmluZSBVSU5UMzJfQyhjKQljICMjIFUKKyNkZWZpbmUgVUlOVDY0X0MoYykJX19VSU5UNjRfQyhjKQorCisjZGVmaW5lIElOVF9MRUFTVDhfQyhjKQkgSU5UOF9DKGMpCisjZGVmaW5lIElOVF9MRUFTVDE2X0MoYykgSU5UMTZfQyhjKQorI2RlZmluZSBJTlRfTEVBU1QzMl9DKGMpIElOVDMyX0MoYykKKyNkZWZpbmUgSU5UX0xFQVNUNjRfQyhjKSBJTlQ2NF9DKGMpCisKKyNkZWZpbmUgVUlOVF9MRUFTVDhfQyhjKSAgVUlOVDhfQyhjKQorI2RlZmluZSBVSU5UX0xFQVNUMTZfQyhjKSBVSU5UMTZfQyhjKQorI2RlZmluZSBVSU5UX0xFQVNUMzJfQyhjKSBVSU5UMzJfQyhjKQorI2RlZmluZSBVSU5UX0xFQVNUNjRfQyhjKSBVSU5UNjRfQyhjKQorCisjZGVmaW5lIElOVF9GQVNUOF9DKGMpCUlOVDhfQyhjKQorI2RlZmluZSBJTlRfRkFTVDY0X0MoYykgSU5UNjRfQyhjKQorCisjZGVmaW5lIFVJTlRfRkFTVDhfQyhjKSAgVUlOVDhfQyhjKQorI2RlZmluZSBVSU5UX0ZBU1Q2NF9DKGMpIFVJTlQ2NF9DKGMpCisKKyNkZWZpbmUgSU5UTUFYX0MoYykJSU5UNjRfQyhjKQorI2RlZmluZSBVSU5UTUFYX0MoYykJVUlOVDY0X0MoYykKKworI2luY2x1ZGUgPGJpdHNpemUvc3RkaW50Y29uc3QuaD4KKworI2VuZGlmCisKKy8qIEtlZXAgdGhlIGtlcm5lbCBmcm9tIHRyeWluZyB0byBkZWZpbmUgdGhlc2UgdHlwZXMuLi4gKi8KKyNkZWZpbmUgX19CSVRfVFlQRVNfREVGSU5FRF9fCisKKyNlbmRpZgkJCQkvKiBfU1RESU5UX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3RkaW8uaCBiL2NvbTMyL2luY2x1ZGUvc3RkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTNhMGVkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zdGRpby5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogc3RkaW8uaAorICovCisKKyNpZm5kZWYgX1NURElPX0gKKyNkZWZpbmUgX1NURElPX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBUaGlzIHN0cnVjdHVyZSBkb2Vzbid0IHJlYWxseSBleGlzdCwgYnV0IGl0IGdpdmVzIHVzIHNvbWV0aGluZworICAgdG8gZGVmaW5lIEZJTEUgKiB3aXRoICovCitzdHJ1Y3QgX0lPX2ZpbGU7Cit0eXBlZGVmIHN0cnVjdCBfSU9fZmlsZSBGSUxFOworCisjaWZuZGVmIEVPRgorIyBkZWZpbmUgRU9GICgtMSkKKyNlbmRpZgorCisjaWZuZGVmIEJVRlNJWgorIyBkZWZpbmUgQlVGU0laIDQwOTYKKyNlbmRpZgorCisjZGVmaW5lIFNFRUtfU0VUIDAKKyNkZWZpbmUgU0VFS19DVVIgMQorI2RlZmluZSBTRUVLX0VORCAyCisKKy8qCisgKiBDb252ZXJ0IGJldHdlZW4gYSBGSUxFICogYW5kIGEgZmlsZSBkZXNjcmlwdG9yLiAgV2UgZG9uJ3QgYWN0dWFsbHkKKyAqIGhhdmUgYW55IGluLW1lbW9yeSBkYXRhLCBzbyB3ZSBqdXN0IGFidXNlIHRoZSBwb2ludGVyIGl0c2VsZiB0bworICogaG9sZCB0aGUgZGF0YS4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgZm9yIGZpbGUgZGVzY3JpcHRvcnMsIC0xIGlzCisgKiBlcnJvciBhbmQgMCBpcyBhIHZhbGlkIHZhbHVlOyBmb3IgRklMRSAqLCBOVUxMICgwKSBpcyBlcnJvciBhbmQKKyAqIG5vbi1OVUxMIGFyZSB2YWxpZC4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IGZpbGVubyhGSUxFICogX19mKQoreworICAgIC8qIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBpbnRwdHJfdCwgYnV0IHNpemVfdCBzaG91bGQgYmUgdGhlIHNhbWUgc2l6ZSAqLworICAgIHJldHVybiAoaW50KShzaXplX3QpIF9fZiAtIDE7Cit9CisKKy8qIFRoaXMgaXMgYSBtYWNybyBzbyBpdCBjYW4gYmUgdXNlZCBhcyBpbml0aWFsaXplciAqLworI2RlZmluZSBfX2NyZWF0ZV9maWxlKF9fZmQpICgoRklMRSAqKShzaXplX3QpKChfX2ZkKSArIDEpKQorCisjZGVmaW5lIHN0ZGluICBfX2NyZWF0ZV9maWxlKDApCisjZGVmaW5lIHN0ZG91dCBfX2NyZWF0ZV9maWxlKDEpCisjZGVmaW5lIHN0ZGVyciBfX2NyZWF0ZV9maWxlKDIpCisKK19fZXh0ZXJuIEZJTEUgKmZvcGVuKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3N0cnVjdCBkZXZfaW5mbzsKK19fZXh0ZXJuIEZJTEUgKmZvcGVuZGV2KGNvbnN0IHN0cnVjdCBkZXZfaW5mbyAqLCBjb25zdCBjaGFyICopOworCitzdGF0aWMgX19pbmxpbmVfXyBGSUxFICpmZG9wZW4oaW50IF9fZmQsIGNvbnN0IGNoYXIgKl9fbSkKK3sKKyAgICAodm9pZClfX207CisgICAgcmV0dXJuIF9fY3JlYXRlX2ZpbGUoX19mZCk7Cit9CisKK19fZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqIF9fZik7CitfX2V4dGVybiBpbnQgZnB1dHMoY29uc3QgY2hhciAqLCBGSUxFICopOworX19leHRlcm4gaW50IHB1dHMoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBmcHV0YyhpbnQsIEZJTEUgKik7CisjZGVmaW5lIHB1dGMoYyxmKSAgZnB1dGMoKGMpLChmKSkKKyNkZWZpbmUgcHV0Y2hhcihjKSBmcHV0YygoYyksc3Rkb3V0KQorCitfX2V4dGVybiBpbnQgZmdldGMoRklMRSAqKTsKK19fZXh0ZXJuIGNoYXIgKmZnZXRzKGNoYXIgKiwgaW50LCBGSUxFICopOworI2RlZmluZSBnZXRjKGYpIGZnZXRjKGYpCisKK19fZXh0ZXJuIHNpemVfdCBfZnJlYWQodm9pZCAqLCBzaXplX3QsIEZJTEUgKik7CitfX2V4dGVybiBzaXplX3QgX2Z3cml0ZShjb25zdCB2b2lkICosIHNpemVfdCwgRklMRSAqKTsKKworX19leHRlcm4gc2l6ZV90IGZyZWFkKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIEZJTEUgKik7CitfX2V4dGVybiBzaXplX3QgZndyaXRlKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIEZJTEUgKik7CisKKyNpZm5kZWYgX19OT19GUkVBRF9GV1JJVEVfSU5MSU5FUworI2RlZmluZSBmcmVhZChfX3AsIF9fcywgX19uLCBfX2YpCQkJCQlcCisgICggKF9fYnVpbHRpbl9jb25zdGFudF9wKF9fcykgJiYgX19zID09IDEpCQkJCVwKKyAgICA/IF9mcmVhZChfX3AsIF9fbiwgX19mKQkJCQkJCVwKKyAgICA6IGZyZWFkKF9fcCxfX3MsX19uLF9fZikgKQorCisjZGVmaW5lIGZ3cml0ZShfX3AsIF9fcywgX19uLCBfX2YpCQkJCQlcCisgICggKF9fYnVpbHRpbl9jb25zdGFudF9wKF9fcykgJiYgX19zID09IDEpCQkJCVwKKyAgICA/IF9md3JpdGUoX19wLCBfX24sIF9fZikJCQkJCQlcCisgICAgOiBmd3JpdGUoX19wLF9fcyxfX24sX19mKSApCisjZW5kaWYKKworLyogTm8gc2VlaywgYnV0IHdlIGNhbiB0ZWxsICovCitfX2V4dGVybiBsb25nIGZ0ZWxsKEZJTEUgKik7CisKK19fZXh0ZXJuIGludCBwcmludGYoY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IHZwcmludGYoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK19fZXh0ZXJuIGludCBmcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IHZmcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK19fZXh0ZXJuIGludCBzcHJpbnRmKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IHZzcHJpbnRmKGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK19fZXh0ZXJuIGludCBzbnByaW50ZihjaGFyICosIHNpemVfdCBuLCBjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiBpbnQgdnNucHJpbnRmKGNoYXIgKiwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKK19fZXh0ZXJuIGludCBhc3ByaW50ZihjaGFyICoqLCBjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiBpbnQgdmFzcHJpbnRmKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyNkZWZpbmUgbXAoZiwgeC4uLikgXAorICAgICAgICBwcmludGYoIlslcygpXTogIiBmICJcbiIsIF9fZnVuY19fLCMjeCkKKyNkZWZpbmUgbXBpKCkJbXAoImVudGVyIikKKyNkZWZpbmUgbXBvKCkJbXAoImV4aXQiKQorCisvKiBObyBidWZmZXJpbmcsIHNvIG5vIGZsdXNoaW5nIG5lZWRlZCAqLworc3RhdGljIF9faW5saW5lX18gaW50IGZmbHVzaChGSUxFICogX19mKQoreworICAgICh2b2lkKV9fZjsKKyAgICByZXR1cm4gMDsKK30KKworX19leHRlcm4gaW50IHNzY2FuZihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK19fZXh0ZXJuIGludCB2c3NjYW5mKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworX19leHRlcm4gdm9pZCBwZXJyb3IoY29uc3QgY2hhciAqKTsKKworX19leHRlcm4gaW50IHJlbmFtZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKy8qCisgKiB1bmhleGNoYXI6IENvbnZlcnQgYSBoZXhhZGVjaW1hbCBkaWdpdCB0byB0aGUgZXF1aXZhbGVudCBudW1iZXIKKyAqCisgKiBSZXR1cm5zIDAgaWYgJ2RhdGEnIHdhcyBjb252ZXJ0ZWQgc3VjY2VzZnVsbHksIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdW5oZXhjaGFyKHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisJdW5zaWduZWQgY2hhciBudW0gPSAqZGF0YTsKKworCWlmIChudW0gPj0gJzAnICYmIG51bSA8PSAnOScpIHsKKwkJKmRhdGEgPSBudW0gLSAnMCc7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCW51bSB8PSAweDIwOwkvKiB1cHBlciBjYXNlIC0+IGxvd2VyIGNhc2UgKi8KKwkJaWYgKG51bSA+PSAnYScgJiYgbnVtIDw9ICdmJykgeworCQkJKmRhdGEgPSBudW0gLSAnYScgKyAxMDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogX1NURElPX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3RkbGliLmggYi9jb20zMi9pbmNsdWRlL3N0ZGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOWYwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N0ZGxpYi5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogc3RkbGliLmgKKyAqLworCisjaWZuZGVmIF9TVERMSUJfSAorI2RlZmluZSBfU1RETElCX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNkZWZpbmUgRVhJVF9GQUlMVVJFIDEKKyNkZWZpbmUgRVhJVF9TVUNDRVNTIDAKKworX19leHRlcm4gX19ub3JldHVybiBhYm9ydCh2b2lkKTsKK3N0YXRpYyBfX2lubGluZV9fIGludCBhYnMoaW50IF9fbikKK3sKKyAgICByZXR1cm4gKF9fbiA8IDApID8gLV9fbiA6IF9fbjsKK30KKworX19leHRlcm4gaW50IGF0ZXhpdCh2b2lkICgqKSh2b2lkKSk7CitfX2V4dGVybiBpbnQgb25fZXhpdCh2b2lkICgqKShpbnQsIHZvaWQgKiksIHZvaWQgKik7CitfX2V4dGVybiBpbnQgYXRvaShjb25zdCBjaGFyICopOworX19leHRlcm4gbG9uZyBhdG9sKGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBsb25nIGxvbmcgYXRvbGwoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIF9fbm9yZXR1cm4gZXhpdChpbnQpOworX19leHRlcm4gX19ub3JldHVybiBfRXhpdChpbnQpOworX19leHRlcm4gdm9pZCBmcmVlKHZvaWQgKik7CitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGxhYnMobG9uZyBfX24pCit7CisgICAgcmV0dXJuIChfX24gPCAwTCkgPyAtX19uIDogX19uOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGxvbmcgbGxhYnMobG9uZyBsb25nIF9fbikKK3sKKyAgICByZXR1cm4gKF9fbiA8IDBMTCkgPyAtX19uIDogX19uOworfQorCitfX2V4dGVybiBfX21hbGxvY2Z1bmMgdm9pZCAqbWFsbG9jKHNpemVfdCk7CitfX2V4dGVybiBfX21hbGxvY2Z1bmMgdm9pZCAqemFsbG9jKHNpemVfdCk7CitfX2V4dGVybiBfX21hbGxvY2Z1bmMgdm9pZCAqY2FsbG9jKHNpemVfdCwgc2l6ZV90KTsKK19fZXh0ZXJuIF9fbWFsbG9jZnVuYyB2b2lkICpyZWFsbG9jKHZvaWQgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIGxvbmcgc3RydG9sKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKK19fZXh0ZXJuIGxvbmcgbG9uZyBzdHJ0b2xsKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKK19fZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3RydG91bChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CitfX2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgc3RydG91bGwoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOworCitzdGF0aWMgX19pbmxpbmVfXyBjaGFyICpnZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICAodm9pZCluYW1lOworICAgIHJldHVybiBOVUxMOworfQorCitfX2V4dGVybiBpbnQgcHV0ZW52KGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgc2V0ZW52KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworX19leHRlcm4gaW50IHVuc2V0ZW52KGNvbnN0IGNoYXIgKik7CisKK19fZXh0ZXJuIHZvaWQgcXNvcnQodm9pZCAqLCBzaXplX3QsIHNpemVfdCwKKwkJICAgIGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKKworX19leHRlcm4gbG9uZyBqcmFuZDQ4KHVuc2lnbmVkIHNob3J0ICopOworX19leHRlcm4gbG9uZyBtcmFuZDQ4KHZvaWQpOworX19leHRlcm4gbG9uZyBucmFuZDQ4KHVuc2lnbmVkIHNob3J0ICopOworX19leHRlcm4gbG9uZyBscmFuZDQ4KHZvaWQpOworX19leHRlcm4gdW5zaWduZWQgc2hvcnQgKnNlZWQ0OChjb25zdCB1bnNpZ25lZCBzaG9ydCAqKTsKK19fZXh0ZXJuIHZvaWQgc3JhbmQ0OChsb25nKTsKKworI2RlZmluZSBSQU5EX01BWCAweDdmZmZmZmZmCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFuZCh2b2lkKQoreworICAgIHJldHVybiAoaW50KWxyYW5kNDgoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBzcmFuZCh1bnNpZ25lZCBpbnQgX19zKQoreworICAgIHNyYW5kNDgoX19zKTsKK30KKworc3RhdGljIF9faW5saW5lX18gbG9uZyByYW5kb20odm9pZCkKK3sKKyAgICByZXR1cm4gbHJhbmQ0OCgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNyYW5kb20odW5zaWduZWQgaW50IF9fcykKK3sKKyAgICBzcmFuZDQ4KF9fcyk7Cit9CisKKy8qIEJhc2ljIFBUWSBmdW5jdGlvbnMuICBUaGVzZSBvbmx5IHdvcmsgaWYgZGV2cHRzIGlzIG1vdW50ZWQhICovCisKK19fZXh0ZXJuIGludCB1bmxvY2twdChpbnQpOworX19leHRlcm4gY2hhciAqcHRzbmFtZShpbnQpOworX19leHRlcm4gaW50IGdldHB0KHZvaWQpOworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZ3JhbnRwdChpbnQgX19mZCkKK3sKKyAgICAodm9pZClfX2ZkOworICAgIHJldHVybiAwOwkJCS8qIGRldnB0cyBkb2VzIHRoaXMgYWxsIGZvciB1cyEgKi8KK30KKworI2VuZGlmIC8qIF9TVERMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zdHJpbmcuaCBiL2NvbTMyL2luY2x1ZGUvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0NzQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3RyaW5nLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIHN0cmluZy5oCisgKi8KKworI2lmbmRlZiBfU1RSSU5HX0gKKyNkZWZpbmUgX1NUUklOR19ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworX19leHRlcm4gdm9pZCAqbWVtY2NweSh2b2lkICosIGNvbnN0IHZvaWQgKiwgaW50LCBzaXplX3QpOworX19leHRlcm4gdm9pZCAqbWVtY2hyKGNvbnN0IHZvaWQgKiwgaW50LCBzaXplX3QpOworX19leHRlcm4gaW50IG1lbWNtcChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIHZvaWQgKm1lbWNweSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIHZvaWQgKm1lbXBjcHkodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiB2b2lkICptZW1tb3ZlKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworX19leHRlcm4gdm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBzaXplX3QpOworX19leHRlcm4gdm9pZCAqbWVtbWVtKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBjb25zdCB2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiB2b2lkIG1lbXN3YXAodm9pZCAqLCB2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiBpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgc3RybmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBjaGFyICpzdHJjYXQoY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3RyY2hyKGNvbnN0IGNoYXIgKiwgaW50KTsKK19fZXh0ZXJuIGludCBzdHJjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3RyY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIHNpemVfdCBzdHJjc3BuKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKnN0cmR1cChjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3RybmR1cChjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBjaGFyICpzdHJlcnJvcihpbnQpOworX19leHRlcm4gc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICopOworX19leHRlcm4gc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gY2hhciAqc3RybmNhdChjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIHNpemVfdCBzdHJsY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gaW50IHN0cm5jbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBjaGFyICpzdHJuY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gY2hhciAqc3RwY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKnN0cG5jcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBzaXplX3Qgc3RybGNweShjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIGNoYXIgKnN0cnBicmsoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3RycmNocihjb25zdCBjaGFyICosIGludCk7CitfX2V4dGVybiBjaGFyICpzdHJzZXAoY2hhciAqKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIHNpemVfdCBzdHJzcG4oY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3Ryc3RyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKnN0cnRvayhjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBjaGFyICpzdHJyZXBsYWNlKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisjZW5kaWYgLyogX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N1ZmZpeF9udW1iZXIuaCBiL2NvbTMyL2luY2x1ZGUvc3VmZml4X251bWJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzQ5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N1ZmZpeF9udW1iZXIuaApAQCAtMCwwICsxLDQxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3VmZml4X251bWJlci5oCisgKgorICogRGVmaW5pdGlvbnMgdXNlZCB0byBjb252ZXJ0IGEgc3RyaW5nIG9mIGEgbnVtYmVyIHdpdGggcG90ZW50aWFsIFNJIHN1ZmZpeAorICogdG8gaW50LXR5cGUuCisgKi8KKworI2lmbmRlZiBMSUJVVElMX1NVRkZJWF9OVU1CRVJfSAorI2RlZmluZSBMSUJVVElMX1NVRkZJWF9OVU1CRVJfSAorCit1bnNpZ25lZCBsb25nIGxvbmcgc3VmZml4X251bWJlcihjb25zdCBjaGFyICopOworCisjZW5kaWYgLyogTElCVVRJTF9TVUZGSVhfTlVNQkVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXMvYml0b3BzLmggYi9jb20zMi9pbmNsdWRlL3N5cy9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTMwZDkzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXMvYml0b3BzLmgKQEAgLTAsMCArMSw0NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogICAKKyAqICAgQ29weXJpZ2h0IDIwMTAtMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKiAgIAorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqICAgCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYml0b3BzLmgKKyAqCisgKiBTaW1wbGUgYml0d2lzZSBvcGVyYXRpb25zCisgKi8KKworI2lmbmRlZiBfQklUT1BTX0gKKyNkZWZpbmUgX0JJVE9QU19ICisKKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorCisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKyNpbmNsdWRlIDxpMzg2L2JpdG9wcy5oPgorI2VsaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDgKKyNpbmNsdWRlIDx4ODZfNjQvYml0b3BzLmg+CisjZWxzZQorI2Vycm9yICJVbmFibGUgdG8gYnVpbGQgZm9yIHRvLWJlLWRlZmluZWQgYXJjaGl0ZWN0dXJlIHR5cGUiCisjZW5kaWYKKyNlbmRpZiAvKiBfQklUT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzL2NwdS5oIGIvY29tMzIvaW5jbHVkZS9zeXMvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNDVkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzL2NwdS5oCkBAIC0wLDAgKzEsNTcgQEAKKyNpZm5kZWYgX0NQVV9ICisjZGVmaW5lIF9DUFVfSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisKKyNpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gNAorI2luY2x1ZGUgPGkzODYvY3B1Lmg+CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAorI2luY2x1ZGUgPHg4Nl82NC9jcHUuaD4KKyNlbHNlIAorI2Vycm9yICJ1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUiCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGlycV9zdGF0ZV90OworCitzdGF0aWMgaW5saW5lIGlycV9zdGF0ZV90IGlycV9zdGF0ZSh2b2lkKQoreworICAgIGlycV9zdGF0ZV90IF9fc3Q7CisKKyAgICBhc20gdm9sYXRpbGUoInB1c2hmIDsgcG9wICUwIiA6ICI9cm0iIChfX3N0KSA6IDogIm1lbW9yeSIpOworICAgIHJldHVybiBfX3N0OworfQorCitzdGF0aWMgaW5saW5lIGlycV9zdGF0ZV90IGlycV9zYXZlKHZvaWQpCit7CisgICAgaXJxX3N0YXRlX3QgX19zdCA9IGlycV9zdGF0ZSgpOworICAgIGNsaSgpOworICAgIHJldHVybiBfX3N0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxX3Jlc3RvcmUoaXJxX3N0YXRlX3QgX19zdCkKK3sKKyAgICBhc20gdm9sYXRpbGUoInB1c2ggJTAgOyBwb3BmIiA6IDogInJtIiAoX19zdCkgOiAibWVtb3J5Iik7Cit9CisKKy8qIFN0YW5kYXJkIG1hY3JvIHRvIHNlZSBpZiBhIHNwZWNpZmljIGZsYWcgaXMgY2hhbmdlYWJsZSAqLworc3RhdGljIGlubGluZSBfX2NvbnN0ZnVuYyBib29sIGNwdV9oYXNfZWZsYWcodW5zaWduZWQgbG9uZyBmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgZjAsIGYxOworCWFzbSgicHVzaGYgOyAiCisJICAgICJwdXNoZiA7ICIKKwkgICAgInBvcCAlMCA7ICIKKwkgICAgIm1vdiAlMCwlMSA7ICIKKwkgICAgInhvciAlMiwlMSA7ICIKKwkgICAgInB1c2ggJTEgOyAiCisJICAgICJwb3BmIDsgIgorCSAgICAicHVzaGYgOyAiCisJICAgICJwb3AgJTEgOyAiCisJICAgICJwb3BmIgorCSAgICA6ICI9JnIiIChmMCksICI9JnIiIChmMSkKKwkgICAgOiAicmkiIChmbGFnKSk7CisJcmV0dXJuICEhKChmMF5mMSkgJiBmbGFnKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5cy9kaXJlbnQuaCBiL2NvbTMyL2luY2x1ZGUvc3lzL2RpcmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNWU1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5cy9kaXJlbnQuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogc3lzL2RpcmVudC5oCisgKi8KKworI2lmbmRlZiBESVJFTlRfSAorI2RlZmluZSBESVJFTlRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZm5kZWYgTkFNRV9NQVgKKyNkZWZpbmUgTkFNRV9NQVggMjU1CisjZW5kaWYKKworc3RydWN0IGRpcmVudCB7CisgICAgdWludDMyX3QgZF9pbm87CisgICAgdWludDMyX3QgZF9vZmY7CisgICAgdWludDE2X3QgZF9yZWNsZW47CisgICAgdWludDE2X3QgZF90eXBlOworICAgIGNoYXIgZF9uYW1lW05BTUVfTUFYICsgMV07Cit9OworCitlbnVtIGRpcmVudF90eXBlIHsKKyAgICBEVF9VTktOT1dOCT0gIDAsCisgICAgRFRfRklGTwk9ICAxLAorICAgIERUX0NIUgk9ICAyLAorICAgIERUX0RJUgk9ICA0LAorICAgIERUX0JMSwk9ICA2LAorICAgIERUX1JFRwk9ICA4LAorICAgIERUX0xOSwk9IDEwLAorICAgIERUX1NPQ0sJPSAxMiwKKyAgICBEVF9XSFQJPSAxNCwKK307CisKKy8qCisgKiBDb252ZXJ0IGJldHdlZW4gc3RhdCBzdHJ1Y3R1cmUgbW9kZSB0eXBlcyBhbmQgZGlyZWN0b3J5IHR5cGVzLgorICogVGhlIHN0YXQgc3RydWN0dXJlIG1vZGUgdHlwZXMgYXJlIHRoZSBzYW1lIGFzIGluIExpbnV4LgorICovCisjZGVmaW5lIElGVE9EVChtb2RlKQkoKChtb2RlKSAmIDAxNzAwMDApID4+IDEyKQorI2RlZmluZSBEVFRPSUYoZHQpCSgoZHQpIDw8IDEyKQorCitzdHJ1Y3QgX0RJUl87Cit0eXBlZGVmIHN0cnVjdCBfRElSXyBESVI7CisKKyNlbmRpZiAvKiBzeXMvZGlyZW50LmggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzL2VsZjMyLmggYi9jb20zMi9pbmNsdWRlL3N5cy9lbGYzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGMyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5cy9lbGYzMi5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogc3lzL2VsZjMyLmgKKyAqLworCisjaWZuZGVmIF9TWVNfRUxGMzJfSAorI2RlZmluZSBfU1lTX0VMRjMyX0gKKworI2luY2x1ZGUgPHN5cy9lbGZjb21tb24uaD4KKworLyogRUxGIHN0YW5kYXJkIHR5cGVkZWZzICh5ZXQgbW9yZSBwcm9vZiB0aGF0IDxzdGRpbnQuaD4gd2FzIHdheSBvdmVyZHVlKSAqLwordHlwZWRlZiB1aW50MTZfdCBFbGYzMl9IYWxmOwordHlwZWRlZiBpbnQxNl90IEVsZjMyX1NIYWxmOwordHlwZWRlZiB1aW50MzJfdCBFbGYzMl9Xb3JkOwordHlwZWRlZiBpbnQzMl90IEVsZjMyX1N3b3JkOwordHlwZWRlZiB1aW50NjRfdCBFbGYzMl9Yd29yZDsKK3R5cGVkZWYgaW50NjRfdCBFbGYzMl9TeHdvcmQ7CisKK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfT2ZmOwordHlwZWRlZiB1aW50MzJfdCBFbGYzMl9BZGRyOwordHlwZWRlZiB1aW50MTZfdCBFbGYzMl9TZWN0aW9uOworCisvKiBEeW5hbWljIGhlYWRlciAqLworCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9keW4geworICAgIEVsZjMyX1N3b3JkIGRfdGFnOworICAgIHVuaW9uIHsKKwlFbGYzMl9Td29yZCBkX3ZhbDsKKwlFbGYzMl9BZGRyIGRfcHRyOworICAgIH0gZF91bjsKK30gRWxmMzJfRHluOworCisvKiBSZWxvY2F0aW9ucyAqLworCisjZGVmaW5lIEVMRjMyX1JfU1lNKHgpCSgoeCkgPj4gOCkKKyNkZWZpbmUgRUxGMzJfUl9UWVBFKHgpCSgoeCkgJiAweGZmKQorCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9yZWwgeworICAgIEVsZjMyX0FkZHIgcl9vZmZzZXQ7CisgICAgRWxmMzJfV29yZCByX2luZm87Cit9IEVsZjMyX1JlbDsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfcmVsYSB7CisgICAgRWxmMzJfQWRkciByX29mZnNldDsKKyAgICBFbGYzMl9Xb3JkIHJfaW5mbzsKKyAgICBFbGYzMl9Td29yZCByX2FkZGVuZDsKK30gRWxmMzJfUmVsYTsKKworLyogU3ltYm9sICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3N5bSB7CisgICAgRWxmMzJfV29yZCBzdF9uYW1lOworICAgIEVsZjMyX0FkZHIgc3RfdmFsdWU7CisgICAgRWxmMzJfV29yZCBzdF9zaXplOworICAgIHVuc2lnbmVkIGNoYXIgc3RfaW5mbzsKKyAgICB1bnNpZ25lZCBjaGFyIHN0X290aGVyOworICAgIEVsZjMyX0hhbGYgc3Rfc2huZHg7Cit9IEVsZjMyX1N5bTsKKworLyogTWFpbiBmaWxlIGhlYWRlciAqLworCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9oZHIgeworICAgIHVuc2lnbmVkIGNoYXIgZV9pZGVudFtFSV9OSURFTlRdOworICAgIEVsZjMyX0hhbGYgZV90eXBlOworICAgIEVsZjMyX0hhbGYgZV9tYWNoaW5lOworICAgIEVsZjMyX1dvcmQgZV92ZXJzaW9uOworICAgIEVsZjMyX0FkZHIgZV9lbnRyeTsKKyAgICBFbGYzMl9PZmYgZV9waG9mZjsKKyAgICBFbGYzMl9PZmYgZV9zaG9mZjsKKyAgICBFbGYzMl9Xb3JkIGVfZmxhZ3M7CisgICAgRWxmMzJfSGFsZiBlX2Voc2l6ZTsKKyAgICBFbGYzMl9IYWxmIGVfcGhlbnRzaXplOworICAgIEVsZjMyX0hhbGYgZV9waG51bTsKKyAgICBFbGYzMl9IYWxmIGVfc2hlbnRzaXplOworICAgIEVsZjMyX0hhbGYgZV9zaG51bTsKKyAgICBFbGYzMl9IYWxmIGVfc2hzdHJuZHg7Cit9IEVsZjMyX0VoZHI7CisKKy8qIFByb2dyYW0gaGVhZGVyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3BoZHIgeworICAgIEVsZjMyX1dvcmQgcF90eXBlOworICAgIEVsZjMyX09mZiBwX29mZnNldDsKKyAgICBFbGYzMl9BZGRyIHBfdmFkZHI7CisgICAgRWxmMzJfQWRkciBwX3BhZGRyOworICAgIEVsZjMyX1dvcmQgcF9maWxlc3o7CisgICAgRWxmMzJfV29yZCBwX21lbXN6OworICAgIEVsZjMyX1dvcmQgcF9mbGFnczsKKyAgICBFbGYzMl9Xb3JkIHBfYWxpZ247Cit9IEVsZjMyX1BoZHI7CisKKy8qIFNlY3Rpb24gaGVhZGVyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3NoZHIgeworICAgIEVsZjMyX1dvcmQgc2hfbmFtZTsKKyAgICBFbGYzMl9Xb3JkIHNoX3R5cGU7CisgICAgRWxmMzJfV29yZCBzaF9mbGFnczsKKyAgICBFbGYzMl9BZGRyIHNoX2FkZHI7CisgICAgRWxmMzJfT2ZmIHNoX29mZnNldDsKKyAgICBFbGYzMl9Xb3JkIHNoX3NpemU7CisgICAgRWxmMzJfV29yZCBzaF9saW5rOworICAgIEVsZjMyX1dvcmQgc2hfaW5mbzsKKyAgICBFbGYzMl9Xb3JkIHNoX2FkZHJhbGlnbjsKKyAgICBFbGYzMl9Xb3JkIHNoX2VudHNpemU7Cit9IEVsZjMyX1NoZHI7CisKKy8qIE5vdGUgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9ub3RlIHsKKyAgICBFbGYzMl9Xb3JkIG5fbmFtZXN6OwkvKiBOYW1lIHNpemUgKi8KKyAgICBFbGYzMl9Xb3JkIG5fZGVzY3N6OwkvKiBDb250ZW50IHNpemUgKi8KKyAgICBFbGYzMl9Xb3JkIG5fdHlwZTsJCS8qIENvbnRlbnQgdHlwZSAqLworfSBFbGYzMl9OaGRyOworCisjZW5kaWYgLyogX1NZU19FTEYzMl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5cy9lbGY2NC5oIGIvY29tMzIvaW5jbHVkZS9zeXMvZWxmNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzZmYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXMvZWxmNjQuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIHN5cy9lbGY2NC5oCisgKi8KKworI2lmbmRlZiBfU1lTX0VMRjY0X0gKKyNkZWZpbmUgX1NZU19FTEY2NF9ICisKKyNpbmNsdWRlIDxzeXMvZWxmY29tbW9uLmg+CisKKy8qIEVMRiBzdGFuZGFyZCB0eXBlZGVmcyAoeWV0IG1vcmUgcHJvb2YgdGhhdCA8c3RkaW50Lmg+IHdhcyB3YXkgb3ZlcmR1ZSkgKi8KK3R5cGVkZWYgdWludDE2X3QgRWxmNjRfSGFsZjsKK3R5cGVkZWYgaW50MTZfdCBFbGY2NF9TSGFsZjsKK3R5cGVkZWYgdWludDMyX3QgRWxmNjRfV29yZDsKK3R5cGVkZWYgaW50MzJfdCBFbGY2NF9Td29yZDsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfWHdvcmQ7Cit0eXBlZGVmIGludDY0X3QgRWxmNjRfU3h3b3JkOworCit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X09mZjsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfQWRkcjsKK3R5cGVkZWYgdWludDE2X3QgRWxmNjRfU2VjdGlvbjsKKworLyogRHluYW1pYyBoZWFkZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfZHluIHsKKyAgICBFbGY2NF9TeHdvcmQgZF90YWc7CisgICAgdW5pb24geworCUVsZjY0X1h3b3JkIGRfdmFsOworCUVsZjY0X0FkZHIgZF9wdHI7CisgICAgfSBkX3VuOworfSBFbGY2NF9EeW47CisKKy8qIFJlbG9jYXRpb25zICovCisKKyNkZWZpbmUgRUxGNjRfUl9TWU0oeCkJKCh4KSA+PiAzMikKKyNkZWZpbmUgRUxGNjRfUl9UWVBFKHgpCSgoeCkgJiAweGZmZmZmZmZmKQorCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9yZWwgeworICAgIEVsZjY0X0FkZHIgcl9vZmZzZXQ7CisgICAgRWxmNjRfWHdvcmQgcl9pbmZvOworfSBFbGY2NF9SZWw7CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3JlbGEgeworICAgIEVsZjY0X0FkZHIgcl9vZmZzZXQ7CisgICAgRWxmNjRfWHdvcmQgcl9pbmZvOworICAgIEVsZjY0X1N4d29yZCByX2FkZGVuZDsKK30gRWxmNjRfUmVsYTsKKworLyogU3ltYm9sICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3N5bSB7CisgICAgRWxmNjRfV29yZCBzdF9uYW1lOworICAgIHVuc2lnbmVkIGNoYXIgc3RfaW5mbzsKKyAgICB1bnNpZ25lZCBjaGFyIHN0X290aGVyOworICAgIEVsZjY0X0hhbGYgc3Rfc2huZHg7CisgICAgRWxmNjRfQWRkciBzdF92YWx1ZTsKKyAgICBFbGY2NF9Yd29yZCBzdF9zaXplOworfSBFbGY2NF9TeW07CisKKy8qIE1haW4gZmlsZSBoZWFkZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfaGRyIHsKKyAgICB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbRUlfTklERU5UXTsKKyAgICBFbGY2NF9IYWxmIGVfdHlwZTsKKyAgICBFbGY2NF9IYWxmIGVfbWFjaGluZTsKKyAgICBFbGY2NF9Xb3JkIGVfdmVyc2lvbjsKKyAgICBFbGY2NF9BZGRyIGVfZW50cnk7CisgICAgRWxmNjRfT2ZmIGVfcGhvZmY7CisgICAgRWxmNjRfT2ZmIGVfc2hvZmY7CisgICAgRWxmNjRfV29yZCBlX2ZsYWdzOworICAgIEVsZjY0X0hhbGYgZV9laHNpemU7CisgICAgRWxmNjRfSGFsZiBlX3BoZW50c2l6ZTsKKyAgICBFbGY2NF9IYWxmIGVfcGhudW07CisgICAgRWxmNjRfSGFsZiBlX3NoZW50c2l6ZTsKKyAgICBFbGY2NF9IYWxmIGVfc2hudW07CisgICAgRWxmNjRfSGFsZiBlX3Noc3RybmR4OworfSBFbGY2NF9FaGRyOworCisvKiBQcm9ncmFtIGhlYWRlciAqLworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9waGRyIHsKKyAgICBFbGY2NF9Xb3JkIHBfdHlwZTsKKyAgICBFbGY2NF9Xb3JkIHBfZmxhZ3M7CisgICAgRWxmNjRfT2ZmIHBfb2Zmc2V0OworICAgIEVsZjY0X0FkZHIgcF92YWRkcjsKKyAgICBFbGY2NF9BZGRyIHBfcGFkZHI7CisgICAgRWxmNjRfWHdvcmQgcF9maWxlc3o7CisgICAgRWxmNjRfWHdvcmQgcF9tZW1zejsKKyAgICBFbGY2NF9Yd29yZCBwX2FsaWduOworfSBFbGY2NF9QaGRyOworCisvKiBTZWN0aW9uIGhlYWRlciAqLworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9zaGRyIHsKKyAgICBFbGY2NF9Xb3JkIHNoX25hbWU7CisgICAgRWxmNjRfV29yZCBzaF90eXBlOworICAgIEVsZjY0X1h3b3JkIHNoX2ZsYWdzOworICAgIEVsZjY0X0FkZHIgc2hfYWRkcjsKKyAgICBFbGY2NF9PZmYgc2hfb2Zmc2V0OworICAgIEVsZjY0X1h3b3JkIHNoX3NpemU7CisgICAgRWxmNjRfV29yZCBzaF9saW5rOworICAgIEVsZjY0X1dvcmQgc2hfaW5mbzsKKyAgICBFbGY2NF9Yd29yZCBzaF9hZGRyYWxpZ247CisgICAgRWxmNjRfWHdvcmQgc2hfZW50c2l6ZTsKK30gRWxmNjRfU2hkcjsKKworLyogTm90ZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGVsZjY0X25vdGUgeworICAgIEVsZjY0X1dvcmQgbl9uYW1lc3o7CS8qIE5hbWUgc2l6ZSAqLworICAgIEVsZjY0X1dvcmQgbl9kZXNjc3o7CS8qIENvbnRlbnQgc2l6ZSAqLworICAgIEVsZjY0X1dvcmQgbl90eXBlOwkJLyogQ29udGVudCB0eXBlICovCit9IEVsZjY0X05oZHI7CisKKyNlbmRpZiAvKiBfU1lTX0VMRjY0X0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzL2VsZmNvbW1vbi5oIGIvY29tMzIvaW5jbHVkZS9zeXMvZWxmY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliNWFkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzL2VsZmNvbW1vbi5oCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogc3lzL2VsZmNvbW1vbi5oCisgKi8KKworI2lmbmRlZiBfU1lTX0VMRkNPTU1PTl9ICisjZGVmaW5lIF9TWVNfRUxGQ09NTU9OX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBTZWdtZW50IHR5cGVzICovCisjZGVmaW5lIFBUX05VTEwJCTAKKyNkZWZpbmUgUFRfTE9BRAkJMQorI2RlZmluZSBQVF9EWU5BTUlDCTIKKyNkZWZpbmUgUFRfSU5URVJQCTMKKyNkZWZpbmUgUFRfTk9URQkJNAorI2RlZmluZSBQVF9TSExJQgk1CisjZGVmaW5lIFBUX1BIRFIJCTYKKyNkZWZpbmUgUFRfTE9PUwkJMHg2MDAwMDAwMAorI2RlZmluZSBQVF9ISU9TCQkweDZmZmZmZmZmCisjZGVmaW5lIFBUX0xPUFJPQwkweDcwMDAwMDAwCisjZGVmaW5lIFBUX0hJUFJPQwkweDdmZmZmZmZmCisjZGVmaW5lIFBUX0dOVV9FSF9GUkFNRQkweDY0NzRlNTUwCS8qIEV4dGVuc2lvbiwgZWg/ICovCisKKy8qIEVMRiBmaWxlIHR5cGVzICovCisjZGVmaW5lIEVUX05PTkUJCTAKKyNkZWZpbmUgRVRfUkVMCQkxCisjZGVmaW5lIEVUX0VYRUMJCTIKKyNkZWZpbmUgRVRfRFlOCQkzCisjZGVmaW5lIEVUX0NPUkUJCTQKKyNkZWZpbmUgRVRfTE9QUk9DCTB4ZmYwMAorI2RlZmluZSBFVF9ISVBST0MJMHhmZmZmCisKKy8qIEVMRiBtYWNoaW5lIHR5cGVzICovCisjZGVmaW5lIEVNX05PTkUJCTAKKyNkZWZpbmUgRU1fTTMyCQkxCisjZGVmaW5lIEVNX1NQQVJDCTIKKyNkZWZpbmUgRU1fMzg2CQkzCisjZGVmaW5lIEVNXzY4SwkJNAorI2RlZmluZSBFTV84OEsJCTUKKyNkZWZpbmUgRU1fNDg2CQk2CS8qIE5vdCB1c2VkIGluIExpbnV4IGF0IGxlYXN0ICovCisjZGVmaW5lIEVNXzg2MAkJNworI2RlZmluZSBFTV9NSVBTICAgICAgICAgOAkvKiBSM2ssIGJpZ2VuZGlhbig/KSAqLworI2RlZmluZSBFTV9NSVBTX1JTNF9CRQkxMAkvKiBSNGsgQkUgKi8KKyNkZWZpbmUgRU1fUEFSSVNDCTE1CisjZGVmaW5lIEVNX1NQQVJDMzJQTFVTCTE4CisjZGVmaW5lIEVNX1BQQwkJMjAKKyNkZWZpbmUgRU1fUFBDNjQJMjEKKyNkZWZpbmUgRU1fUzM5MCAgICAgICAgIDIyCisjZGVmaW5lIEVNX1NICQk0MgorI2RlZmluZSBFTV9TUEFSQ1Y5CTQzCS8qIHY5ID0gU1BBUkM2NCAqLworI2RlZmluZSBFTV9IOF8zMDBIICAgICAgNDcKKyNkZWZpbmUgRU1fSDhTICAgICAgICAgIDQ4CisjZGVmaW5lIEVNX0lBXzY0ICAgICAgICA1MAkvKiBJdGFuaWMgKi8KKyNkZWZpbmUgRU1fWDg2XzY0ICAgICAgIDYyCisjZGVmaW5lIEVNX0NSSVMgICAgICAgICA3NgorI2RlZmluZSBFTV9WODUwICAgICAgICAgODcKKyNkZWZpbmUgRU1fQUxQSEEgICAgICAgIDB4OTAyNgkvKiBJbnRlcnJpbSBBbHBoYSB0aGF0IHN0dWNrIGFyb3VuZCAqLworI2RlZmluZSBFTV9DWUdOVVNfVjg1MCAgMHg5MDgwCS8qIE9sZCB2ODUwIElEIHVzZWQgYnkgQ3lnbnVzICovCisjZGVmaW5lIEVNX1MzOTBfT0xEICAgICAweEEzOTAJLyogT2Jzb2xldGUgaW50ZXJyaW0gdmFsdWUgZm9yIFMvMzkwICovCisKKy8qIER5bmFtaWMgdHlwZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRFRfTlVMTAkJMAkJLyogTWFya3MgZW5kIG9mIGR5bmFtaWMgc2VjdGlvbiAqLworI2RlZmluZSBEVF9ORUVERUQJMQkJLyogTmFtZSBvZiBuZWVkZWQgbGlicmFyeSAqLworI2RlZmluZSBEVF9QTFRSRUxTWgkyCQkvKiBTaXplIGluIGJ5dGVzIG9mIFBMVCByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUExUR09UCTMJCS8qIFByb2Nlc3NvciBkZWZpbmVkIHZhbHVlICovCisjZGVmaW5lIERUX0hBU0gJCTQJCS8qIEFkZHJlc3Mgb2Ygc3ltYm9sIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgRFRfU1RSVEFCCTUJCS8qIEFkZHJlc3Mgb2Ygc3RyaW5nIHRhYmxlICovCisjZGVmaW5lIERUX1NZTVRBQgk2CQkvKiBBZGRyZXNzIG9mIHN5bWJvbCB0YWJsZSAqLworI2RlZmluZSBEVF9SRUxBCQk3CQkvKiBBZGRyZXNzIG9mIFJlbGEgcmVsb2NzICovCisjZGVmaW5lIERUX1JFTEFTWgk4CQkvKiBUb3RhbCBzaXplIG9mIFJlbGEgcmVsb2NzICovCisjZGVmaW5lIERUX1JFTEFFTlQJOQkJLyogU2l6ZSBvZiBvbmUgUmVsYSByZWxvYyAqLworI2RlZmluZSBEVF9TVFJTWgkxMAkJLyogU2l6ZSBvZiBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgRFRfU1lNRU5UCTExCQkvKiBTaXplIG9mIG9uZSBzeW1ib2wgdGFibGUgZW50cnkgKi8KKyNkZWZpbmUgRFRfSU5JVAkJMTIJCS8qIEFkZHJlc3Mgb2YgaW5pdCBmdW5jdGlvbiAqLworI2RlZmluZSBEVF9GSU5JCQkxMwkJLyogQWRkcmVzcyBvZiB0ZXJtaW5hdGlvbiBmdW5jdGlvbiAqLworI2RlZmluZSBEVF9TT05BTUUJMTQJCS8qIE5hbWUgb2Ygc2hhcmVkIG9iamVjdCAqLworI2RlZmluZSBEVF9SUEFUSAkxNQkJLyogTGlicmFyeSBzZWFyY2ggcGF0aCAoZGVwcmVjYXRlZCkgKi8KKyNkZWZpbmUgRFRfU1lNQk9MSUMJMTYJCS8qIFN0YXJ0IHN5bWJvbCBzZWFyY2ggaGVyZSAqLworI2RlZmluZSBEVF9SRUwJCTE3CQkvKiBBZGRyZXNzIG9mIFJlbCByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUkVMU1oJMTgJCS8qIFRvdGFsIHNpemUgb2YgUmVsIHJlbG9jcyAqLworI2RlZmluZSBEVF9SRUxFTlQJMTkJCS8qIFNpemUgb2Ygb25lIFJlbCByZWxvYyAqLworI2RlZmluZSBEVF9QTFRSRUwJMjAJCS8qIFR5cGUgb2YgcmVsb2MgaW4gUExUICovCisjZGVmaW5lIERUX0RFQlVHCTIxCQkvKiBGb3IgZGVidWdnaW5nOyB1bnNwZWNpZmllZCAqLworI2RlZmluZSBEVF9URVhUUkVMCTIyCQkvKiBSZWxvYyBtaWdodCBtb2RpZnkgLnRleHQgKi8KKyNkZWZpbmUgRFRfSk1QUkVMCTIzCQkvKiBBZGRyZXNzIG9mIFBMVCByZWxvY3MgKi8KKyNkZWZpbmUJRFRfQklORF9OT1cJMjQJCS8qIFByb2Nlc3MgcmVsb2NhdGlvbnMgb2Ygb2JqZWN0ICovCisjZGVmaW5lCURUX0lOSVRfQVJSQVkJMjUJCS8qIEFycmF5IHdpdGggYWRkcmVzc2VzIG9mIGluaXQgZmN0ICovCisjZGVmaW5lCURUX0ZJTklfQVJSQVkJMjYJCS8qIEFycmF5IHdpdGggYWRkcmVzc2VzIG9mIGZpbmkgZmN0ICovCisjZGVmaW5lCURUX0lOSVRfQVJSQVlTWgkyNwkJLyogU2l6ZSBpbiBieXRlcyBvZiBEVF9JTklUX0FSUkFZICovCisjZGVmaW5lCURUX0ZJTklfQVJSQVlTWgkyOAkJLyogU2l6ZSBpbiBieXRlcyBvZiBEVF9GSU5JX0FSUkFZICovCisjZGVmaW5lIERUX1JVTlBBVEgJMjkJCS8qIExpYnJhcnkgc2VhcmNoIHBhdGggKi8KKyNkZWZpbmUgRFRfRkxBR1MJMzAJCS8qIEZsYWdzIGZvciB0aGUgb2JqZWN0IGJlaW5nIGxvYWRlZCAqLworI2RlZmluZSBEVF9FTkNPRElORwkzMgkJLyogU3RhcnQgb2YgZW5jb2RlZCByYW5nZSAqLworI2RlZmluZSBEVF9QUkVJTklUX0FSUkFZIDMyCQkvKiBBcnJheSB3aXRoIGFkZHJlc3NlcyBvZiBwcmVpbml0IGZjdCovCisjZGVmaW5lIERUX1BSRUlOSVRfQVJSQVlTWiAzMwkJLyogc2l6ZSBpbiBieXRlcyBvZiBEVF9QUkVJTklUX0FSUkFZICovCisjZGVmaW5lCURUX05VTQkJMzQJCS8qIE51bWJlciB1c2VkICovCisjZGVmaW5lIERUX0xPT1MJCTB4NjAwMDAwMGQJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgRFRfSElPUwkJMHg2ZmZmZjAwMAkvKiBFbmQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgRFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIERUX0hJUFJPQwkweDdmZmZmZmZmCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKworI2RlZmluZSBEVF9WQUxSTkdMTwkweDZmZmZmZDAwCisjZGVmaW5lIERUX0dOVV9QUkVMSU5LRUQgMHg2ZmZmZmRmNQkvKiBQcmVsaW5raW5nIHRpbWVzdGFtcCAqLworI2RlZmluZSBEVF9HTlVfQ09ORkxJQ1RTWiAweDZmZmZmZGY2CS8qIFNpemUgb2YgY29uZmxpY3Qgc2VjdGlvbiAqLworI2RlZmluZSBEVF9HTlVfTElCTElTVFNaIDB4NmZmZmZkZjcJLyogU2l6ZSBvZiBsaWJyYXJ5IGxpc3QgKi8KKyNkZWZpbmUgRFRfQ0hFQ0tTVU0JMHg2ZmZmZmRmOAorI2RlZmluZSBEVF9QTFRQQURTWgkweDZmZmZmZGY5CisjZGVmaW5lIERUX01PVkVFTlQJMHg2ZmZmZmRmYQorI2RlZmluZSBEVF9NT1ZFU1oJMHg2ZmZmZmRmYgorI2RlZmluZSBEVF9GRUFUVVJFXzEJMHg2ZmZmZmRmYwkvKiBGZWF0dXJlIHNlbGVjdGlvbiAoRFRGXyopLiAgKi8KKyNkZWZpbmUgRFRfUE9TRkxBR18xCTB4NmZmZmZkZmQJLyogRmxhZ3MgZm9yIERUXyogZW50cmllcywgZWZmZWN0aW5nCisJCQkJCSAgIHRoZSBmb2xsb3dpbmcgRFRfKiBlbnRyeS4gICovCisjZGVmaW5lIERUX1NZTUlOU1oJMHg2ZmZmZmRmZQkvKiBTaXplIG9mIHN5bWluZm8gdGFibGUgKGluIGJ5dGVzKSAqLworI2RlZmluZSBEVF9TWU1JTkVOVAkweDZmZmZmZGZmCS8qIEVudHJ5IHNpemUgb2Ygc3ltaW5mbyAqLworI2RlZmluZSBEVF9WQUxSTkdISQkweDZmZmZmZGZmCisjZGVmaW5lIERUX1ZBTFRBR0lEWCh0YWcpCShEVF9WQUxSTkdISSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLworI2RlZmluZSBEVF9WQUxOVU0gMTIKKworLyogRFRfKiBlbnRyaWVzIHdoaWNoIGZhbGwgYmV0d2VlbiBEVF9BRERSUk5HSEkgJiBEVF9BRERSUk5HTE8gdXNlIHRoZQorICAgRHluLmRfdW4uZF9wdHIgZmllbGQgb2YgdGhlIEVsZipfRHluIHN0cnVjdHVyZS4KKworICAgSWYgYW55IGFkanVzdG1lbnQgaXMgbWFkZSB0byB0aGUgRUxGIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbgorICAgYnVpbHQgdGhlc2UgZW50cmllcyB3aWxsIG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLworI2RlZmluZSBEVF9BRERSUk5HTE8JMHg2ZmZmZmUwMAorI2RlZmluZSBEVF9HTlVfSEFTSAkweDZmZmZmZWY1CS8qIEdOVS1zdHlsZSBoYXNoIHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfVExTREVTQ19QTFQJMHg2ZmZmZmVmNgorI2RlZmluZSBEVF9UTFNERVNDX0dPVAkweDZmZmZmZWY3CisjZGVmaW5lIERUX0dOVV9DT05GTElDVAkweDZmZmZmZWY4CS8qIFN0YXJ0IG9mIGNvbmZsaWN0IHNlY3Rpb24gKi8KKyNkZWZpbmUgRFRfR05VX0xJQkxJU1QJMHg2ZmZmZmVmOQkvKiBMaWJyYXJ5IGxpc3QgKi8KKyNkZWZpbmUgRFRfQ09ORklHCTB4NmZmZmZlZmEJLyogQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIERUX0RFUEFVRElUCTB4NmZmZmZlZmIJLyogRGVwZW5kZW5jeSBhdWRpdGluZy4gICovCisjZGVmaW5lIERUX0FVRElUCTB4NmZmZmZlZmMJLyogT2JqZWN0IGF1ZGl0aW5nLiAgKi8KKyNkZWZpbmUJRFRfUExUUEFECTB4NmZmZmZlZmQJLyogUExUIHBhZGRpbmcuICAqLworI2RlZmluZQlEVF9NT1ZFVEFCCTB4NmZmZmZlZmUJLyogTW92ZSB0YWJsZS4gICovCisjZGVmaW5lIERUX1NZTUlORk8JMHg2ZmZmZmVmZgkvKiBTeW1pbmZvIHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfQUREUlJOR0hJCTB4NmZmZmZlZmYKKyNkZWZpbmUgRFRfQUREUlRBR0lEWCh0YWcpCShEVF9BRERSUk5HSEkgLSAodGFnKSkJLyogUmV2ZXJzZSBvcmRlciEgKi8KKyNkZWZpbmUgRFRfQUREUk5VTSAxMQorCisvKiBUaGUgdmVyc2lvbmluZyBlbnRyeSB0eXBlcy4gIFRoZSBuZXh0IGFyZSBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlCisgICBHTlUgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgRFRfVkVSU1lNCTB4NmZmZmZmZjAKKworI2RlZmluZSBEVF9SRUxBQ09VTlQJMHg2ZmZmZmZmOQorI2RlZmluZSBEVF9SRUxDT1VOVAkweDZmZmZmZmZhCisKKy8qIFRoZXNlIHdlcmUgY2hvc2VuIGJ5IFN1bi4gICovCisjZGVmaW5lIERUX0ZMQUdTXzEJMHg2ZmZmZmZmYgkvKiBTdGF0ZSBmbGFncywgc2VlIERGXzFfKiBiZWxvdy4gICovCisjZGVmaW5lCURUX1ZFUkRFRgkweDZmZmZmZmZjCS8qIEFkZHJlc3Mgb2YgdmVyc2lvbiBkZWZpbml0aW9uCisJCQkJCSAgIHRhYmxlICovCisjZGVmaW5lCURUX1ZFUkRFRk5VTQkweDZmZmZmZmZkCS8qIE51bWJlciBvZiB2ZXJzaW9uIGRlZmluaXRpb25zICovCisjZGVmaW5lCURUX1ZFUk5FRUQJMHg2ZmZmZmZmZQkvKiBBZGRyZXNzIG9mIHRhYmxlIHdpdGggbmVlZGVkCisJCQkJCSAgIHZlcnNpb25zICovCisjZGVmaW5lCURUX1ZFUk5FRUROVU0JMHg2ZmZmZmZmZgkvKiBOdW1iZXIgb2YgbmVlZGVkIHZlcnNpb25zICovCisjZGVmaW5lIERUX1ZFUlNJT05UQUdJRFgodGFnKQkoRFRfVkVSTkVFRE5VTSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLworI2RlZmluZSBEVF9WRVJTSU9OVEFHTlVNIDE2CisKKy8qIFN1biBhZGRlZCB0aGVzZSBtYWNoaW5lLWluZGVwZW5kZW50IGV4dGVuc2lvbnMgaW4gdGhlICJwcm9jZXNzb3Itc3BlY2lmaWMiCisgICByYW5nZS4gIEJlIGNvbXBhdGlibGUuICAqLworI2RlZmluZSBEVF9BVVhJTElBUlkgICAgMHg3ZmZmZmZmZCAgICAgIC8qIFNoYXJlZCBvYmplY3QgdG8gbG9hZCBiZWZvcmUgc2VsZiAqLworI2RlZmluZSBEVF9GSUxURVIgICAgICAgMHg3ZmZmZmZmZiAgICAgIC8qIFNoYXJlZCBvYmplY3QgdG8gZ2V0IHZhbHVlcyBmcm9tICovCisjZGVmaW5lIERUX0VYVFJBVEFHSURYKHRhZykJKChFbGYzMl9Xb3JkKS0oKEVsZjMyX1N3b3JkKSAodGFnKSA8PDE+PjEpLTEpCisjZGVmaW5lIERUX0VYVFJBTlVNCTMKKworLyogQXV4aWxsaWFyeSB0YWJsZSBlbnRyaWVzICovCisjZGVmaW5lIEFUX05VTEwJCTAJLyogZW5kIG9mIHZlY3RvciAqLworI2RlZmluZSBBVF9JR05PUkUJMQkvKiBlbnRyeSBzaG91bGQgYmUgaWdub3JlZCAqLworI2RlZmluZSBBVF9FWEVDRkQJMgkvKiBmaWxlIGRlc2NyaXB0b3Igb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9QSERSCQkzCS8qIHByb2dyYW0gaGVhZGVycyBmb3IgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9QSEVOVAk0CS8qIHNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgKi8KKyNkZWZpbmUgQVRfUEhOVU0JNQkvKiBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzICovCisjZGVmaW5lIEFUX1BBR0VTWgk2CS8qIHN5c3RlbSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgQVRfQkFTRQkJNwkvKiBiYXNlIGFkZHJlc3Mgb2YgaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgQVRfRkxBR1MJOAkvKiBmbGFncyAqLworI2RlZmluZSBBVF9FTlRSWQk5CS8qIGVudHJ5IHBvaW50IG9mIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfTk9URUxGCTEwCS8qIHByb2dyYW0gaXMgbm90IEVMRiAqLworI2RlZmluZSBBVF9VSUQJCTExCS8qIHJlYWwgdWlkICovCisjZGVmaW5lIEFUX0VVSUQJCTEyCS8qIGVmZmVjdGl2ZSB1aWQgKi8KKyNkZWZpbmUgQVRfR0lECQkxMwkvKiByZWFsIGdpZCAqLworI2RlZmluZSBBVF9FR0lECQkxNAkvKiBlZmZlY3RpdmUgZ2lkICovCisjZGVmaW5lIEFUX1BMQVRGT1JNCTE1CS8qIHN0cmluZyBpZGVudGlmeWluZyBDUFUgZm9yIG9wdGltaXphdGlvbnMgKi8KKyNkZWZpbmUgQVRfSFdDQVAJMTYJLyogYXJjaCBkZXBlbmRlbnQgaGludHMgYXQgQ1BVIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBBVF9DTEtUQ0sJMTcJLyogZnJlcXVlbmN5IGF0IHdoaWNoIHRpbWVzKCkgaW5jcmVtZW50cyAqLworLyogMTguLjIyID0gPyAqLworI2RlZmluZSBBVF9TRUNVUkUJMjMJLyogc2VjdXJlIG1vZGUgYm9vbGVhbiAqLworCisvKiBQcm9ncmFtIGhlYWRlciBwZXJtaXNzaW9uIGZsYWdzICovCisjZGVmaW5lIFBGX1ggICAgICAgICAgICAweDEKKyNkZWZpbmUgUEZfVyAgICAgICAgICAgIDB4MgorI2RlZmluZSBQRl9SICAgICAgICAgICAgMHg0CisKKy8qIFNlY3Rpb24gaGVhZGVyIHR5cGVzICovCisjZGVmaW5lIFNIVF9OVUxMICAgICAgICAwCisjZGVmaW5lIFNIVF9QUk9HQklUUyAgICAxCisjZGVmaW5lIFNIVF9TWU1UQUIgICAgICAyCisjZGVmaW5lIFNIVF9TVFJUQUIgICAgICAzCisjZGVmaW5lIFNIVF9SRUxBICAgICAgICA0CisjZGVmaW5lIFNIVF9IQVNIICAgICAgICA1CisjZGVmaW5lIFNIVF9EWU5BTUlDICAgICA2CisjZGVmaW5lIFNIVF9OT1RFICAgICAgICA3CisjZGVmaW5lIFNIVF9OT0JJVFMgICAgICA4CisjZGVmaW5lIFNIVF9SRUwgICAgICAgICA5CisjZGVmaW5lIFNIVF9TSExJQiAgICAgICAxMAorI2RlZmluZSBTSFRfRFlOU1lNICAgICAgMTEKKyNkZWZpbmUgU0hUX05VTSAgICAgICAgIDEyCisjZGVmaW5lIFNIVF9MT1BST0MgICAgICAweDcwMDAwMDAwCisjZGVmaW5lIFNIVF9ISVBST0MgICAgICAweDdmZmZmZmZmCisjZGVmaW5lIFNIVF9MT1VTRVIgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFNIVF9ISVVTRVIgICAgICAweGZmZmZmZmZmCisKKy8qIFNlY3Rpb24gaGVhZGVyIGZsYWdzICovCisjZGVmaW5lIFNIRl9XUklURSAgICAgICAweDEKKyNkZWZpbmUgU0hGX0FMTE9DICAgICAgIDB4MgorI2RlZmluZSBTSEZfRVhFQ0lOU1RSICAgMHg0CisjZGVmaW5lIFNIRl9NQVNLUFJPQyAgICAweGYwMDAwMDAwCisKKy8qIFNwZWNpYWwgc2VjdGlvbiBudW1iZXJzICovCisjZGVmaW5lIFNITl9VTkRFRiAgICAgICAwCisjZGVmaW5lIFNITl9MT1JFU0VSVkUgICAweGZmMDAKKyNkZWZpbmUgU0hOX0xPUFJPQyAgICAgIDB4ZmYwMAorI2RlZmluZSBTSE5fSElQUk9DICAgICAgMHhmZjFmCisjZGVmaW5lIFNITl9BQlMgICAgICAgICAweGZmZjEKKyNkZWZpbmUgU0hOX0NPTU1PTiAgICAgIDB4ZmZmMgorI2RlZmluZSBTSE5fSElSRVNFUlZFICAgMHhmZmZmCisKKy8qIFN5bWJvbCB0YWJsZSBkZWZpbml0aW9ucyAqLworCisvKiBIb3cgdG8gZXh0cmFjdCBhbmQgaW5zZXJ0IGluZm9ybWF0aW9uIGhlbGQgaW4gdGhlIHN0X2luZm8gZmllbGQuICAqLworCisjZGVmaW5lIEVMRjMyX1NUX0JJTkQodmFsKQkJKCgodW5zaWduZWQgY2hhcikgKHZhbCkpID4+IDQpCisjZGVmaW5lIEVMRjMyX1NUX1RZUEUodmFsKQkJKCh2YWwpICYgMHhmKQorI2RlZmluZSBFTEYzMl9TVF9JTkZPKGJpbmQsIHR5cGUpCSgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4ZikpCisKKy8qIEJvdGggRWxmMzJfU3ltIGFuZCBFbGY2NF9TeW0gdXNlIHRoZSBzYW1lIG9uZS1ieXRlIHN0X2luZm8gZmllbGQuICAqLworI2RlZmluZSBFTEY2NF9TVF9CSU5EKHZhbCkJCUVMRjMyX1NUX0JJTkQgKHZhbCkKKyNkZWZpbmUgRUxGNjRfU1RfVFlQRSh2YWwpCQlFTEYzMl9TVF9UWVBFICh2YWwpCisjZGVmaW5lIEVMRjY0X1NUX0lORk8oYmluZCwgdHlwZSkJRUxGMzJfU1RfSU5GTyAoKGJpbmQpLCAodHlwZSkpCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgU1RfQklORCBzdWJmaWVsZCBvZiBzdF9pbmZvIChzeW1ib2wgYmluZGluZykuICAqLworCisjZGVmaW5lIFNUQl9MT0NBTAkwCQkvKiBMb2NhbCBzeW1ib2wgKi8KKyNkZWZpbmUgU1RCX0dMT0JBTAkxCQkvKiBHbG9iYWwgc3ltYm9sICovCisjZGVmaW5lIFNUQl9XRUFLCTIJCS8qIFdlYWsgc3ltYm9sICovCisjZGVmaW5lCVNUQl9OVU0JCTMJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzLiAgKi8KKyNkZWZpbmUgU1RCX0xPT1MJMTAJCS8qIFN0YXJ0IG9mIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFNUQl9ISU9TCTEyCQkvKiBFbmQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RCX0xPUFJPQwkxMwkJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIFNUQl9ISVBST0MJMTUJCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBTVF9UWVBFIHN1YmZpZWxkIG9mIHN0X2luZm8gKHN5bWJvbCB0eXBlKS4gICovCisKKyNkZWZpbmUgU1RUX05PVFlQRQkwCQkvKiBTeW1ib2wgdHlwZSBpcyB1bnNwZWNpZmllZCAqLworI2RlZmluZSBTVFRfT0JKRUNUCTEJCS8qIFN5bWJvbCBpcyBhIGRhdGEgb2JqZWN0ICovCisjZGVmaW5lIFNUVF9GVU5DCTIJCS8qIFN5bWJvbCBpcyBhIGNvZGUgb2JqZWN0ICovCisjZGVmaW5lIFNUVF9TRUNUSU9OCTMJCS8qIFN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uICovCisjZGVmaW5lIFNUVF9GSUxFCTQJCS8qIFN5bWJvbCdzIG5hbWUgaXMgZmlsZSBuYW1lICovCisjZGVmaW5lIFNUVF9DT01NT04JNQkJLyogU3ltYm9sIGlzIGEgY29tbW9uIGRhdGEgb2JqZWN0ICovCisjZGVmaW5lIFNUVF9UTFMJCTYJCS8qIFN5bWJvbCBpcyB0aHJlYWQtbG9jYWwgZGF0YSBvYmplY3QqLworI2RlZmluZQlTVFRfTlVNCQk3CQkvKiBOdW1iZXIgb2YgZGVmaW5lZCB0eXBlcy4gICovCisjZGVmaW5lIFNUVF9MT09TCTEwCQkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTVFRfSElPUwkxMgkJLyogRW5kIG9mIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFNUVF9MT1BST0MJMTMJCS8qIFN0YXJ0IG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTVFRfSElQUk9DCTE1CQkvKiBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisKKworLyogU3ltYm9sIHRhYmxlIGluZGljZXMgYXJlIGZvdW5kIGluIHRoZSBoYXNoIGJ1Y2tldHMgYW5kIGNoYWluIHRhYmxlCisgICBvZiBhIHN5bWJvbCBoYXNoIHRhYmxlIHNlY3Rpb24uICBUaGlzIHNwZWNpYWwgaW5kZXggdmFsdWUgaW5kaWNhdGVzCisgICB0aGUgZW5kIG9mIGEgY2hhaW4sIG1lYW5pbmcgbm8gZnVydGhlciBzeW1ib2xzIGFyZSBmb3VuZCBpbiB0aGF0IGJ1Y2tldC4gICovCisKKyNkZWZpbmUgU1ROX1VOREVGCTAJCS8qIEVuZCBvZiBhIGNoYWluLiAgKi8KKworLyogTGVuZ2h0IG9mIG1hZ2ljIGF0IHRoZSBzdGFydCBvZiBhIGZpbGUgKi8KKyNkZWZpbmUgRUlfTklERU5UCTE2CisKKy8qIE1hZ2ljIG51bWJlciBjb25zdGFudHMuLi4gKi8KKyNkZWZpbmUgRUlfTUFHMCAgICAgICAgIDAJLyogZV9pZGVudFtdIGluZGV4ZXMgKi8KKyNkZWZpbmUgRUlfTUFHMSAgICAgICAgIDEKKyNkZWZpbmUgRUlfTUFHMiAgICAgICAgIDIKKyNkZWZpbmUgRUlfTUFHMyAgICAgICAgIDMKKyNkZWZpbmUgRUlfQ0xBU1MgICAgICAgIDQKKyNkZWZpbmUgRUlfREFUQSAgICAgICAgIDUKKyNkZWZpbmUgRUlfVkVSU0lPTiAgICAgIDYKKyNkZWZpbmUgRUlfT1NBQkkgICAgICAgIDcKKyNkZWZpbmUgRUlfUEFEICAgICAgICAgIDgKKworI2RlZmluZSBFTEZNQUcwICAgICAgICAgMHg3ZgkvKiBFSV9NQUcgKi8KKyNkZWZpbmUgRUxGTUFHMSAgICAgICAgICdFJworI2RlZmluZSBFTEZNQUcyICAgICAgICAgJ0wnCisjZGVmaW5lIEVMRk1BRzMgICAgICAgICAnRicKKyNkZWZpbmUgRUxGTUFHICAgICAgICAgICJcMTc3RUxGIgorI2RlZmluZSBTRUxGTUFHICAgICAgICAgNAorCisjZGVmaW5lIEVMRkNMQVNTTk9ORSAgICAwCS8qIEVJX0NMQVNTICovCisjZGVmaW5lIEVMRkNMQVNTMzIgICAgICAxCisjZGVmaW5lIEVMRkNMQVNTNjQgICAgICAyCisjZGVmaW5lIEVMRkNMQVNTTlVNICAgICAzCisKKyNkZWZpbmUgRUxGREFUQU5PTkUgICAgIDAJLyogZV9pZGVudFtFSV9EQVRBXSAqLworI2RlZmluZSBFTEZEQVRBMkxTQiAgICAgMQorI2RlZmluZSBFTEZEQVRBMk1TQiAgICAgMgorCisjZGVmaW5lIEVWX05PTkUgICAgICAgICAwCS8qIGVfdmVyc2lvbiwgRUlfVkVSU0lPTiAqLworI2RlZmluZSBFVl9DVVJSRU5UICAgICAgMQorI2RlZmluZSBFVl9OVU0gICAgICAgICAgMgorCisjZGVmaW5lIEVMRk9TQUJJX05PTkUgICAwCisjZGVmaW5lIEVMRk9TQUJJX0xJTlVYICAzCisKKy8qIEludGVsIDgwMzg2IHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogaTM4NiByZWxvY3MuICAqLworCisjZGVmaW5lIFJfMzg2X05PTkUJICAgMAkJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl8zODZfMzIJICAgMQkJLyogRGlyZWN0IDMyIGJpdCAgKi8KKyNkZWZpbmUgUl8zODZfUEMzMgkgICAyCQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl8zODZfR09UMzIJICAgMwkJLyogMzIgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSXzM4Nl9QTFQzMgkgICA0CQkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl8zODZfQ09QWQkgICA1CQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfMzg2X0dMT0JfREFUCSAgIDYJCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl8zODZfSk1QX1NMT1QJICAgNwkJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworI2RlZmluZSBSXzM4Nl9SRUxBVElWRQkgICA4CQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfMzg2X0dPVE9GRgkgICA5CQkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSXzM4Nl9HT1RQQwkgICAxMAkJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl8zODZfMzJQTFQJICAgMTEKKyNkZWZpbmUgUl8zODZfVExTX1RQT0ZGCSAgIDE0CQkvKiBPZmZzZXQgaW4gc3RhdGljIFRMUyBibG9jayAqLworI2RlZmluZSBSXzM4Nl9UTFNfSUUJICAgMTUJCS8qIEFkZHJlc3Mgb2YgR09UIGVudHJ5IGZvciBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrIG9mZnNldCAqLworI2RlZmluZSBSXzM4Nl9UTFNfR09USUUJICAgMTYJCS8qIEdPVCBlbnRyeSBmb3Igc3RhdGljIFRMUyBibG9jaworCQkJCQkgICBvZmZzZXQgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xFCSAgIDE3CQkvKiBPZmZzZXQgcmVsYXRpdmUgdG8gc3RhdGljIFRMUworCQkJCQkgICBibG9jayAqLworI2RlZmluZSBSXzM4Nl9UTFNfR0QJICAgMTgJCS8qIERpcmVjdCAzMiBiaXQgZm9yIEdOVSB2ZXJzaW9uIG9mCisJCQkJCSAgIGdlbmVyYWwgZHluYW1pYyB0aHJlYWQgbG9jYWwgZGF0YSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERNCSAgIDE5CQkvKiBEaXJlY3QgMzIgYml0IGZvciBHTlUgdmVyc2lvbiBvZgorCQkJCQkgICBsb2NhbCBkeW5hbWljIHRocmVhZCBsb2NhbCBkYXRhCisJCQkJCSAgIGluIExFIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfMTYJICAgMjAKKyNkZWZpbmUgUl8zODZfUEMxNgkgICAyMQorI2RlZmluZSBSXzM4Nl84CQkgICAyMgorI2RlZmluZSBSXzM4Nl9QQzgJICAgMjMKKyNkZWZpbmUgUl8zODZfVExTX0dEXzMyCSAgIDI0CQkvKiBEaXJlY3QgMzIgYml0IGZvciBnZW5lcmFsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgKi8KKyNkZWZpbmUgUl8zODZfVExTX0dEX1BVU0ggIDI1CQkvKiBUYWcgZm9yIHB1c2hsIGluIEdEIFRMUyBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19HRF9DQUxMICAyNgkJLyogUmVsb2NhdGlvbiBmb3IgY2FsbCB0bworCQkJCQkgICBfX3Rsc19nZXRfYWRkcigpICovCisjZGVmaW5lIFJfMzg2X1RMU19HRF9QT1AgICAyNwkJLyogVGFnIGZvciBwb3BsIGluIEdEIFRMUyBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE1fMzIgICAyOAkJLyogRGlyZWN0IDMyIGJpdCBmb3IgbG9jYWwgZHluYW1pYworCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YSBpbiBMRSBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE1fUFVTSCAyOQkJLyogVGFnIGZvciBwdXNobCBpbiBMRE0gVExTIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xETV9DQUxMIDMwCQkvKiBSZWxvY2F0aW9uIGZvciBjYWxsIHRvCisJCQkJCSAgIF9fdGxzX2dldF9hZGRyKCkgaW4gTERNIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xETV9QT1AgIDMxCQkvKiBUYWcgZm9yIHBvcGwgaW4gTERNIFRMUyBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE9fMzIgICAzMgkJLyogT2Zmc2V0IHJlbGF0aXZlIHRvIFRMUyBibG9jayAqLworI2RlZmluZSBSXzM4Nl9UTFNfSUVfMzIJICAgMzMJCS8qIEdPVCBlbnRyeSBmb3IgbmVnYXRlZCBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrIG9mZnNldCAqLworI2RlZmluZSBSXzM4Nl9UTFNfTEVfMzIJICAgMzQJCS8qIE5lZ2F0ZWQgb2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXRpYworCQkJCQkgICBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl8zODZfVExTX0RUUE1PRDMyIDM1CQkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wgKi8KKyNkZWZpbmUgUl8zODZfVExTX0RUUE9GRjMyIDM2CQkvKiBPZmZzZXQgaW4gVExTIGJsb2NrICovCisjZGVmaW5lIFJfMzg2X1RMU19UUE9GRjMyICAzNwkJLyogTmVnYXRlZCBvZmZzZXQgaW4gc3RhdGljIFRMUyBibG9jayAqLworLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl8zODZfTlVNCSAgIDM4CisKKy8qIEFNRCB4ODYtNjQgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBSX1g4Nl82NF9OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfWDg2XzY0XzY0CQkxCS8qIERpcmVjdCA2NCBiaXQgICovCisjZGVmaW5lIFJfWDg2XzY0X1BDMzIJCTIJLyogUEMgcmVsYXRpdmUgMzIgYml0IHNpZ25lZCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1QzMgkJMwkvKiAzMiBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X1BMVDMyCQk0CS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSX1g4Nl82NF9DT1BZCQk1CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl9YODZfNjRfR0xPQl9EQVQJNgkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X0pVTVBfU0xPVAk3CS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfUkVMQVRJVkUJOAkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFBDUkVMCTkJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZQorCQkJCQkgICBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfWDg2XzY0XzMyCQkxMAkvKiBEaXJlY3QgMzIgYml0IHplcm8gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMzJTCQkxMQkvKiBEaXJlY3QgMzIgYml0IHNpZ24gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMTYJCTEyCS8qIERpcmVjdCAxNiBiaXQgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF9QQzE2CQkxMwkvKiAxNiBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLworI2RlZmluZSBSX1g4Nl82NF84CQkxNAkvKiBEaXJlY3QgOCBiaXQgc2lnbiBleHRlbmRlZCAgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEM4CQkxNQkvKiA4IGJpdCBzaWduIGV4dGVuZGVkIHBjIHJlbGF0aXZlICovCisjZGVmaW5lIFJfWDg2XzY0X0RUUE1PRDY0CTE2CS8qIElEIG9mIG1vZHVsZSBjb250YWluaW5nIHN5bWJvbCAqLworI2RlZmluZSBSX1g4Nl82NF9EVFBPRkY2NAkxNwkvKiBPZmZzZXQgaW4gbW9kdWxlJ3MgVExTIGJsb2NrICovCisjZGVmaW5lIFJfWDg2XzY0X1RQT0ZGNjQJMTgJLyogT2Zmc2V0IGluIGluaXRpYWwgVExTIGJsb2NrICovCisjZGVmaW5lIFJfWDg2XzY0X1RMU0dECQkxOQkvKiAzMiBiaXQgc2lnbmVkIFBDIHJlbGF0aXZlIG9mZnNldAorCQkJCQkgICB0byB0d28gR09UIGVudHJpZXMgZm9yIEdEIHN5bWJvbCAqLworI2RlZmluZSBSX1g4Nl82NF9UTFNMRAkJMjAJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZSBvZmZzZXQKKwkJCQkJICAgdG8gdHdvIEdPVCBlbnRyaWVzIGZvciBMRCBzeW1ib2wgKi8KKyNkZWZpbmUgUl9YODZfNjRfRFRQT0ZGMzIJMjEJLyogT2Zmc2V0IGluIFRMUyBibG9jayAqLworI2RlZmluZSBSX1g4Nl82NF9HT1RUUE9GRgkyMgkvKiAzMiBiaXQgc2lnbmVkIFBDIHJlbGF0aXZlIG9mZnNldAorCQkJCQkgICB0byBHT1QgZW50cnkgZm9yIElFIHN5bWJvbCAqLworI2RlZmluZSBSX1g4Nl82NF9UUE9GRjMyCTIzCS8qIE9mZnNldCBpbiBpbml0aWFsIFRMUyBibG9jayAqLworI2RlZmluZSBSX1g4Nl82NF9QQzY0CQkyNAkvKiBQQyByZWxhdGl2ZSA2NCBiaXQgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UT0ZGNjQJMjUJLyogNjQgYml0IG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UUEMzMgkyNgkvKiAzMiBiaXQgc2lnbmVkIHBjIHJlbGF0aXZlCisJCQkJCSAgIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UNjQJCTI3CS8qIDY0LWJpdCBHT1QgZW50cnkgb2Zmc2V0ICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFBDUkVMNjQJMjgJLyogNjQtYml0IFBDIHJlbGF0aXZlIG9mZnNldAorCQkJCQkgICB0byBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UUEM2NAkyOQkvKiA2NC1iaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1RQTFQ2NAkzMCAJLyogbGlrZSBHT1Q2NCwgc2F5cyBQTFQgZW50cnkgbmVlZGVkICovCisjZGVmaW5lIFJfWDg2XzY0X1BMVE9GRjY0CTMxCS8qIDY0LWJpdCBHT1QgcmVsYXRpdmUgb2Zmc2V0CisJCQkJCSAgIHRvIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1g4Nl82NF9TSVpFMzIJCTMyCS8qIFNpemUgb2Ygc3ltYm9sIHBsdXMgMzItYml0IGFkZGVuZCAqLworI2RlZmluZSBSX1g4Nl82NF9TSVpFNjQJCTMzCS8qIFNpemUgb2Ygc3ltYm9sIHBsdXMgNjQtYml0IGFkZGVuZCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1RQQzMyX1RMU0RFU0MgMzQJLyogR09UIG9mZnNldCBmb3IgVExTIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBSX1g4Nl82NF9UTFNERVNDX0NBTEwgICAzNQkvKiBNYXJrZXIgZm9yIGNhbGwgdGhyb3VnaCBUTFMKKwkJCQkJICAgZGVzY3JpcHRvci4gICovCisjZGVmaW5lIFJfWDg2XzY0X1RMU0RFU0MgICAgICAgIDM2CS8qIFRMUyBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgUl9YODZfNjRfSVJFTEFUSVZFCTM3CS8qIEFkanVzdCBpbmRpcmVjdGx5IGJ5IHByb2dyYW0gYmFzZSAqLworCisjZGVmaW5lIFJfWDg2XzY0X05VTQkJMzgKKworI2VuZGlmCQkJCS8qIF9TWVNfRUxGQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzL2V4ZWMuaCBiL2NvbTMyL2luY2x1ZGUvc3lzL2V4ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDU1OWQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXMvZXhlYy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBleGVjLmgKKyAqCisgKiAgQ3JlYXRlZCBvbjogQXVnIDE0LCAyMDA4CisgKiAgICAgIEF1dGhvcjogU3RlZmFuIEJ1Y3VyIDxzdGVmYW5iQHp5dG9yLmNvbT4KKyAqLworCisjaWZuZGVmIEVYRUNfSF8KKyNkZWZpbmUgRVhFQ19IXworCisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKioKKyAqIEVYRUNfUk9PVF9OQU1FIC0gVGhlIG5hbWUgb2YgdGhlIEVMRiBtb2R1bGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBDT00zMiBtb2R1bGUuCisgKgorICogVGhpcyBpcyBhIHNoYWxsb3cgRUxGIG1vZHVsZSwgdGhhdCBjb250YWlucyBvbmx5IHRoZSBzeW1ib2wgdGFibGUgZm9yCisgKiB0aGUgY29kZSBhbmQgZGF0YSBzZWN0aW9ucyBvZiB0aGUgbG9hZGVkIENPTTMyIHJvb3QgbW9kdWxlLgorICovCisjZGVmaW5lIEVYRUNfUk9PVF9OQU1FCQkJIl9yb290Xy5jMzIiCisKKy8qKgorICogc3Bhd25fbG9hZCAtIExvYWQgYSBsaWJyYXJ5IG1vZHVsZSBvciBleGVjdXRlcyBhbiBleGVjdXRhYmxlIG9uZQorICogQG5hbWUJdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkvZXhlY3V0YWJsZSB0byB1c2UsIGluY2x1ZGluZyB0aGUgZXh0ZW5zaW9uCisgKiAJCQkoZS5nLiAnc29ydC5jMzInKQorICogQGFyZ2M6CXRoZSBudW1iZXIgb2Ygc3RyaW5nIGFyZ3VtZW50cyBpbiBAYXJndgorICogQGFyZ3Y6CWEgTlVMTC10ZXJtaW5hdGVkIHZlY3RvciBvZiBzdHJpbmcgYXJndW1lbnRzLCBzdGFydGluZyB3aXRoCisgKiAJCQl0aGUgcHJvZ3JhbSBuYW1lLgorICoKKyAqIFRoaXMgcHJvY2VkdXJlIGluIGVzc2VuY2UgbG9hZHMgdGFrZXMgdGhlIG5hbWUgb2YgYSBtb2R1bGUgYW5kIGNoZWNrcyB0byBzZWUgd2hhdAorICoga2luZCBvZiBtb2R1bGUgaXQgaXMgKCBleGVjdXRhYmxlIG9yIGxpYnJhcnkgKSwgYWZ0ZXIgd2hpY2ggaXMgcGVyZm9ybXMgdGhlCisgKiBhcHByb3ByaWF0ZSBhY3Rpb24sIGVpdGhlciBzcGF3bmluZyBvciBzaW1wbHkgbG9hZGluZyB0aGUgbW9kdWxlIGludG8gbWVtb3J5LgorICovCitleHRlcm4gaW50IHNwYXduX2xvYWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworLyoqCisgKiBzcGF3bnYgLSBFeGVjdXRlcyBhIHByb2dyYW0gaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCisgKiBAbmFtZToJdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gc3Bhd24sIGluY2x1ZGluZyB0aGUgZXh0ZW5zaW9uCisgKiAJCQkoZS5nLiAnaGVsbG8uYzMyJykKKyAqIEBhcmd2OglhIE5VTEwtdGVybWluYXRlZCB2ZWN0b3Igb2Ygc3RyaW5nIGFyZ3VtZW50cywgc3RhcnRpbmcgd2l0aAorICogCQkJdGhlIHByb2dyYW0gbmFtZS4KKyAqCisgKiBBIHByb2dyYW0gaXMgYW4gRUxGIG1vZHVsZSB0aGF0IGNvbnRhaW5zIGEgbWFpbiByb3V0aW5lLiBBIHByb2dyYW0gaXMKKyAqIGxvYWRlZCBpbnRvIG1lbW9yeSwgZXhlY3V0ZWQsIHRoZW4gdW5sb2FkZWQsIHRodXMgcmVtYWluaW5nIGluIG1lbW9yeSBvbmx5CisgKiB3aGlsZSB0aGUgbWFpbigpIGZ1bmN0aW9uIGlzIGV4ZWN1dGluZy4gQSBwcm9ncmFtIGFsc28gZGVmaW5lcyBhCisgKiBtZW1vcnkgYWxsb2NhdGlvbiBjb250ZXh0LCBhbmQgYSBzaW1wbGUgZ2FyYmFnZSBjb2xsZWN0aW9uIG1lY2hhbmlzbQorICogaXQgdGh1cyBwcm92aWRlZC4gVGhpcyBpcyBkb25lIGJ5IGludGVybmFsbHkgYXNzb2NpYXRpbmcgd2l0aCB0aGUgcHJvZ3JhbQorICogbW9kdWxlIGVhY2ggcG9pbnRlciByZXR1cm5lZCBieSBtYWxsb2MoKS4gQWZ0ZXIgdGhlIHByb2dyYW0gZmluaXNoZXMKKyAqIGl0cyBleGVjdXRpb24sIGFsbCB0aGUgdW5hbGxvY2F0ZWQgbWVtb3J5IHBlcnRhaW5pbmcgdG8gdGhlIHByb2dyYW0KKyAqIGlzIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cC4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBhc3NvY2lhdGlvbiB0YWtlcyBwbGFjZSBib3RoIGZvciB0aGUgYWxsb2NhdGlvbnMgaGFwcGVuaW5nCisgKiBkaXJlY3RseSBpbiB0aGUgcHJvZ3JhbSwgb3IgaW5kaXJlY3RseSB0aHJvdWdoIGEgbGlicmFyeSBmdW5jdGlvbi4gTGlicmFyaWVzCisgKiBkbyBub3QgY3JlYXRlIGFsbG9jYXRpb24gY29udGV4dHMsIHRodXMgZWFjaCBhbGxvY2F0aW9uIHRoZXkgbWFkZSBiZWxvbmcKKyAqIHRvIHRoZSBpbm5lcm1vc3QgY2FsbGluZyBwcm9ncmFtLgorICovCitleHRlcm4gaW50IHNwYXdudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXJndik7CisKKy8qKgorICogc3Bhd25sIC0gRXhlY3V0ZXMgYSBwcm9ncmFtIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LgorICogQG5hbWU6CXRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHNwYXduLCBpbmNsdWRpbmcgdGhlIGV4dGVuc2lvbgorICogCQkJKGUuZy4gJ2hlbGxvLmMzMicpCisgKiBAYXJnOgl0aGUgZmlyc3QgYXJndW1lbnQgKGFyZ3ZbMF0pIHRvIGJlIHBhc3NlZCB0byB0aGUgbWFpbiBmdW5jdGlvbgorICogCQkJb2YgdGhlIHByb2dyYW0KKyAqIEAuLi46CW9wdGlvbmFsIHN1YnNlcXVlbnQgYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCBvIHRoZSBtYWluIGZ1bmN0aW9uCisgKiAJCQlvZiB0aGUgcHJvZ3JhbQorICoKKyAqIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIHRoZSBzcGF3biByb3V0aW5lLiBQbGVhc2Ugc2VlICdzcGF3bnYnIGZvcgorICogYSBmdWxsIHByZXNlbnRhdGlvbi4KKyAqLworZXh0ZXJuIGludCBzcGF3bmwoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJnLCAuLi4pOworCisvKioKKyAqIGV4ZWNfdGVybSAtIFJlbGVhc2VzIHRoZSByZXNvdXJjZXMgb2YgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4KKyAqLworZXh0ZXJuIHZvaWQgZXhlY190ZXJtKHZvaWQpOworCisKKyNlbmRpZiAvKiBFWEVDX0hfICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5cy9mcHUuaCBiL2NvbTMyL2luY2x1ZGUvc3lzL2ZwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNGFlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5cy9mcHUuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX1NZU19GUFVfSAorI2RlZmluZSBfU1lTX0ZQVV9ICisKK2V4dGVybiBpbnQgeDg2X2luaXRfZnB1KHZvaWQpOworCisjZW5kaWYgLyogX1NZU19GUFVfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXMvZ3B4ZS5oIGIvY29tMzIvaW5jbHVkZS9zeXMvZ3B4ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYmJlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5cy9ncHhlLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfR1BYRV9ICisjZGVmaW5lIF9HUFhFX0gKKworI2luY2x1ZGUgPGNvbTMyLmg+CisKK3N0cnVjdCBzX1BYRU5WX0ZJTEVfQ0hFQ0tfQVBJIHsKKyAgICB1aW50MTZfdCBTdGF0dXM7CisgICAgdWludDE2X3QgU2l6ZTsKKyAgICB1aW50MzJfdCBNYWdpYzsKKyAgICB1aW50MzJfdCBQcm92aWRlcjsKKyAgICB1aW50MzJfdCBBUElNYXNrOworICAgIHVpbnQzMl90IEZsYWdzOworfTsKKworYm9vbCBpc19ncHhlKHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5cy9pMzg2L2JpdG9wcy5oIGIvY29tMzIvaW5jbHVkZS9zeXMvaTM4Ni9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjNiMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXMvaTM4Ni9iaXRvcHMuaApAQCAtMCwwICsxLDU0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgIAorICogICBDb3B5cmlnaHQgMjAxMC0yMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqICAgCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogICAKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpMzg2IGJpdG9wcy5oCisgKgorICogU2ltcGxlIGJpdHdpc2Ugb3BlcmF0aW9ucworICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdChsb25nIF9fYml0LCB2b2lkICpfX2JpdG1hcCkKK3sKKyAgICBhc20gdm9sYXRpbGUoImJ0c2wgJTEsJTAiCisJCSA6ICIrbSIgKCoodW5zaWduZWQgY2hhciAqKV9fYml0bWFwKQorCQkgOiAiSXIiIChfX2JpdCkgOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbHJfYml0KGxvbmcgX19iaXQsIHZvaWQgKl9fYml0bWFwKQoreworICAgIGFzbSB2b2xhdGlsZSgiYnRjbCAlMSwlMCIKKwkJIDogIittIiAoKih1bnNpZ25lZCBjaGFyICopX19iaXRtYXApCisJCSA6ICJJciIgKF9fYml0KSA6ICJtZW1vcnkiKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19wdXJlZnVuYyB0ZXN0X2JpdChsb25nIF9fYml0LCBjb25zdCB2b2lkICpfX2JpdG1hcCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIF9fcjsKKyAgICBhc20oImJ0bCAlMiwlMTsgc2V0YyAlMCIKKwk6ICI9cW0iIChfX3IpCisJOiAibSIgKCooY29uc3QgdW5zaWduZWQgY2hhciAqKV9fYml0bWFwKSwgIklyIiAoX19iaXQpKTsKKyAgICByZXR1cm4gX19yOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXMvaTM4Ni9jcHUuaCBiL2NvbTMyL2luY2x1ZGUvc3lzL2kzODYvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjZWRmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzL2kzODYvY3B1LmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qIGkzODYgY3B1LmggKi8KKworc3RhdGljIGlubGluZSB1aW50NjRfdCByZHRzYyh2b2lkKQoreworICAgIHVpbnQ2NF90IHY7CisgICAgYXNtIHZvbGF0aWxlKCJyZHRzYyIgOiAiPUEiICh2KSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgcmR0c2NsKHZvaWQpCit7CisgICAgdWludDMyX3QgdjsKKyAgICBhc20gdm9sYXRpbGUoInJkdHNjIiA6ICI9YSIgKHYpIDogOiAiZWR4Iik7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVpZF9jb3VudCh1aW50MzJfdCBvcCwgdWludDMyX3QgY250LAorCQkJICAgICAgIHVpbnQzMl90ICogZWF4LCB1aW50MzJfdCAqIGVieCwKKwkJCSAgICAgICB1aW50MzJfdCAqIGVjeCwgdWludDMyX3QgKiBlZHgpCit7CisgICAgYXNtIHZvbGF0aWxlKCJtb3ZsICUlZWJ4LCUxIDsgIgorCQkgImNwdWlkIDsgIgorCQkgInhjaGdsICUxLCUlZWJ4IgorCQkgOiAiPWEiICgqZWF4KSwgIj1TRCIgKCplYngpLCAiPWMiICgqZWN4KSwgIj1kIiAoKmVkeCkKKwkJIDogImEiKG9wKSwgImMiKGNudCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1aWQodWludDMyX3Qgb3AsIHVpbnQzMl90ICogZWF4LCB1aW50MzJfdCAqIGVieCwKKwkJCSB1aW50MzJfdCAqIGVjeCwgdWludDMyX3QgKiBlZHgpCit7CisgICAgY3B1aWRfY291bnQob3AsIDAsIGVheCwgZWJ4LCBlY3gsIGVkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19jb25zdGZ1bmMgdWludDMyX3QgY3B1aWRfZWF4KHVpbnQzMl90IGxldmVsKQoreworICAgIHVpbnQzMl90IHY7CisKKyAgICBhc20gdm9sYXRpbGUoInB1c2hsICUlZWJ4IDsgIgorCQkgImNwdWlkIDsgIgorCQkgInBvcGwgJSVlYngiCisJCSA6ICI9YSIgKHYpCisJCSA6ICJhIihsZXZlbCkKKwkJIDogImVjeCIsICJlZHgiKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSBfX2NvbnN0ZnVuYyB1aW50MzJfdCBjcHVpZF9lYngodWludDMyX3QgbGV2ZWwpCit7CisgICAgdWludDMyX3QgdjsKKworICAgIGFzbSB2b2xhdGlsZSgibW92bCAlJWVieCwlMCA7ICIKKwkJICJjcHVpZCA7ICIKKwkJICJ4Y2hnbCAlMCwlJWVieCIKKwkJIDogIj1TRCIgKHYpLCAiK2EiIChsZXZlbCkKKwkJIDogOiAiZWN4IiwgImVkeCIpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIF9fY29uc3RmdW5jIHVpbnQzMl90IGNwdWlkX2VjeCh1aW50MzJfdCBsZXZlbCkKK3sKKyAgICB1aW50MzJfdCB2OworCisgICAgYXNtIHZvbGF0aWxlKCJwdXNobCAlJWVieCA7ICIKKwkJICJjcHVpZCA7ICIKKwkJICJwb3BsICUlZWJ4IgorCQkgOiAiPWMiICh2KSwgIithIiAobGV2ZWwpCisJCSA6IDogImVkeCIpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIF9fY29uc3RmdW5jIHVpbnQzMl90IGNwdWlkX2VkeCh1aW50MzJfdCBsZXZlbCkKK3sKKyAgICB1aW50MzJfdCB2OworCisgICAgYXNtIHZvbGF0aWxlKCJwdXNobCAlJWVieCA7ICIKKwkJICJjcHVpZCA7ICIKKwkJICJwb3BsICUlZWJ4IgorCQkgOiAiPWQiICh2KSwgIithIiAobGV2ZWwpCisJCSA6IDogImVjeCIpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHJkbXNyKHVpbnQzMl90IG1zcikKK3sKKyAgICB1aW50NjRfdCB2OworCisgICAgYXNtIHZvbGF0aWxlKCJyZG1zciIgOiAiPUEiICh2KSA6ICJjIihtc3IpKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdybXNyKHVpbnQ2NF90IHYsIHVpbnQzMl90IG1zcikKK3sKKyAgICBhc20gdm9sYXRpbGUoIndybXNyIiA6IDogIkEiICh2KSwgImMiIChtc3IpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwdV9yZWxheCh2b2lkKQoreworICAgIGFzbSB2b2xhdGlsZSgicmVwIDsgbm9wIiA6IDogOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBobHQodm9pZCkKK3sKKyAgICBhc20gdm9sYXRpbGUoImhsdCIgOiA6IDogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xpKHZvaWQpCit7CisgICAgYXNtIHZvbGF0aWxlKCJjbGkiIDogOiA6ICJtZW1vcnkiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0aSh2b2lkKQoreworICAgIGFzbSB2b2xhdGlsZSgic3RpIiA6IDogOiAibWVtb3J5Iik7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5cy9pMzg2L21vZHVsZS5oIGIvY29tMzIvaW5jbHVkZS9zeXMvaTM4Ni9tb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTk4OGVhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXMvaTM4Ni9tb2R1bGUuaApAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIHN5c2xpbnV4L21vZHVsZS5oCisgKgorICogRHluYW1pYyBFTEYgbW9kdWxlcyBkZWZpbml0aW9ucyBhbmQgc2VydmljZXMuCisgKi8KKworI2lmbmRlZiBJMzg2X01PRFVMRV9IXworI2RlZmluZSBJMzg2X01PRFVMRV9IXworCisjaW5jbHVkZSA8ZWxmLmg+CisKKy8qCisgKiBBY2NlcHRlZCB2YWx1ZXMgZm9yIHZhcmlvdXMgRUxGIGhlYWRlciBwYXJhbWV0ZXJzIGZvdW5kIGluIGFuIEVMRiBkeW5hbWljCisgKiBvYmplY3QuCisgKi8KKyNkZWZpbmUgTU9EVUxFX0VMRl9DTEFTUwkJRUxGQ0xBU1MzMgkJLy8gMzItYml0IG1vZHVsZXMKKyNkZWZpbmUgTU9EVUxFX0VMRl9DTEFTU19TSVpFCQkzMgkJCS8vIFNpemUgb2YgYSB3b3JkIHZhbHVlCisjZGVmaW5lIE1PRFVMRV9FTEZfREFUQQkJCUVMRkRBVEEyTFNCCQkvLyBXb3JkIGVuZGlhbmVzcworI2RlZmluZSBNT0RVTEVfRUxGX1ZFUlNJT04JCUVWX0NVUlJFTlQJCS8vIE9iamVjdCB2ZXJzaW9uCisjZGVmaW5lIE1PRFVMRV9FTEZfVFlQRQkJCUVUX0RZTgkJCS8vIEV4ZWN1dGFibGUgdHlwZSAoc2hhcmVkIG9iamVjdCAtIC5zbykKKyNkZWZpbmUgTU9EVUxFX0VMRl9NQUNISU5FCQlFTV8zODYJCQkvLyBUYXJnZXQgYXJjaGl0ZWN0dXJlCisKKyNkZWZpbmUgRUxGX01PRF9TWVMJCSIzMiBiaXQiCisKK3R5cGVkZWYgRWxmMzJfQWRkcgkJRWxmX0FkZHI7Cit0eXBlZGVmIEVsZjMyX0R5bgkJRWxmX0R5bjsKK3R5cGVkZWYgRWxmMzJfV29yZAkJRWxmX1dvcmQ7Cit0eXBlZGVmIEVsZjMyX09mZgkJRWxmX09mZjsKK3R5cGVkZWYgRWxmMzJfU3ltCQlFbGZfU3ltOwordHlwZWRlZiBFbGYzMl9FaGRyCQlFbGZfRWhkcjsKK3R5cGVkZWYgRWxmMzJfUGhkcgkJRWxmX1BoZHI7Cit0eXBlZGVmIEVsZjMyX1JlbAkJRWxmX1JlbDsKK3R5cGVkZWYgRWxmMzJfV29yZAkJRWxmX0J3b3JkOworCisjZW5kaWYgLy8gSTM4Nl9NT0RVTEVfSF8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzL2lvLmggYi9jb20zMi9pbmNsdWRlL3N5cy9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Zjg5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5cy9pby5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgX1NZU19JT19ICisjZGVmaW5lIF9TWVNfSU9fSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworc3RhdGljIGlubGluZSB1aW50OF90IGluYih1aW50MTZfdCBwKQoreworICAgIHVpbnQ4X3QgdjsKKyAgICBhc20gdm9sYXRpbGUgKCJpbmIgJTEsJTAiOiI9YSIgKHYpOiJOZCIocCkpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGludyh1aW50MTZfdCBwKQoreworICAgIHVpbnQxNl90IHY7CisgICAgYXNtIHZvbGF0aWxlICgiaW53ICUxLCUwIjoiPWEiICh2KToiTmQiKHApKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBpbmwodWludDE2X3QgcCkKK3sKKyAgICB1aW50MzJfdCB2OworICAgIGFzbSB2b2xhdGlsZSAoImlubCAlMSwlMCI6Ij1hIiAodik6Ik5kIihwKSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRiKHVpbnQ4X3QgdiwgdWludDE2X3QgcCkKK3sKKyAgICBhc20gdm9sYXRpbGUgKCJvdXRiICUwLCUxIjo6ImEiICh2KSwgIk5kIihwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXR3KHVpbnQxNl90IHYsIHVpbnQxNl90IHApCit7CisgICAgYXNtIHZvbGF0aWxlICgib3V0dyAlMCwlMSI6OiJhIiAodiksICJOZCIocCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0bCh1aW50MzJfdCB2LCB1aW50MTZfdCBwKQoreworICAgIGFzbSB2b2xhdGlsZSAoIm91dGwgJTAsJTEiOjoiYSIgKHYpLCAiTmQiKHApKTsKK30KKworI2VuZGlmIC8qIF9TWVNfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXMvbW9kdWxlLmggYi9jb20zMi9pbmNsdWRlL3N5cy9tb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVhOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXMvbW9kdWxlLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qKgorICogc3lzbGludXgvbW9kdWxlLmgKKyAqCisgKiBEeW5hbWljIEVMRiBtb2R1bGVzIGRlZmluaXRpb25zIGFuZCBzZXJ2aWNlcy4KKyAqLworCisjaWZuZGVmIE1PRFVMRV9IXworI2RlZmluZSBNT0RVTEVfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2lmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA0CisjaW5jbHVkZSA8aTM4Ni9tb2R1bGUuaD4KKyNlbGlmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA4CisjaW5jbHVkZSA8eDg2XzY0L21vZHVsZS5oPgorI2Vsc2UKKyNlcnJvciAidW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIgorI2VuZGlmCisKKy8qCisgKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG1vZHVsZSBmaWxlIG5hbWUgKGluY2x1ZGluZyBwYXRoKSwgc3RvcmVkCisgKiBpbiB0aGUgc3RydWN0IG1vZHVsZSBkZXNjcmlwdG9yLgorICovCisjZGVmaW5lIE1PRFVMRV9OQU1FX1NJWkUJCTI1NgorCisvKgorICogU29tZSBjb21tb24gaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBraW5kIG9mIG1vZHVsZXMgd2UncmUgZGVhbGluZyB3aXRoCisgKi8KKyNkZWZpbmUgRVhFQ19NT0RVTEUJCQkwCQkKKyNkZWZpbmUgTElCX01PRFVMRQkJCTEKKworI2RlZmluZSBNQVhfTlJfREVQUwkJCTY0CisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBhbmQgZmluYWxpemF0aW9uIGZ1bmN0aW9uIHNpZ25hdHVyZXMKKyAqLworCisvKioKKyAqIG1vZHVsZV9tYWluX3QgLSBwb2ludGVyIHRvIGFuIGVudHJ5IHJvdXRpbmUKKyAqCisgKiBUaGUgZW50cnkgcm91dGluZSBpcyBwcmVzZW50IG9ubHkgaW4gZXhlY3V0YWJsZSBtb2R1bGVzLCBhbmQgcmVwcmVzZW50cworICogdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgcHJvZ3JhbS4KKyAqLwordHlwZWRlZiBpbnQgKCptb2R1bGVfbWFpbl90KShpbnQsIGNoYXIqKik7CisKKy8qKgorICogbW9kdWxlX2N0b3JfdCAtIHBvaW50ZXIgdG8gYSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIHJvdXRpbmUKKyAqCisgKiBBIG1vZHVsZSBtYXkgaGF2ZSBtdWx0aXBsZSByb3V0aW5lcyB0aGF0IG5lZWQgdG8gYmUgZXhlY3V0ZWQgYmVmb3JlCisgKiBvciBhZnRlciB0aGUgbWFpbiByb3V0aW5lLiBUaGVzZSBhcmUgdGhlIGNvbnN0cnVjdG9ycyBhbmQKKyAqIGRlc3RydWN0b3JzLCByZXNwZWN0aXZlbHkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKm1vZHVsZV9jdG9yX3QpICh2b2lkKTsKKworLyoqCisgKiBzdHJ1Y3QgZWxmX21vZHVsZSAtIHN0cnVjdHVyZSBlbmNhcHN1bGF0aW5nIGEgbW9kdWxlIGxvYWRlZCBpbiBtZW1vcnkuCisgKgorICogRWFjaCBTWVNMSU5VWCBFTEYgbW9kdWxlIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIHN0cnVjdCBlbGZfbW9kdWxlIGRlc2NyaXB0b3IKKyAqIHRoYXQga2VlcHMgdHJhY2sgb2YgbWVtb3J5IGFsbG9jYXRpb25zLCBzeW1ib2wgaW5mb3JtYXRpb24sIGFuZCB2YXJpb3VzIG90aGVyCisgKiByZXNvdXJjZXMgbmVlZGVkIGJ5IHRoZSBtb2R1bGUgaXRzZWxmIG9yIGJ5IG90aGVyIG1vZHVsZXMgdGhhdCBkZXBlbmQgb24gaXQuCisgKgorICogVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBtb2R1bGVzOgorICogIC0gcmVndWxhciBtb2R1bGVzLCB3aGljaCBhcmUgYWN0dWFsIG1lbW9yeSBpbWFnZXMgb2YgYSBsb2FkZWQgJiBsaW5rZWQgc2hhcmVkCisgKiAgb2JqZWN0IChFTEYgZmlsZSkuIE1lbW9yeSBpcyByZXNlcnZlZCBmb3IgdGhlIHN0cnVjdCBlbGZfbW9kdWxlIHN0cnVjdHVyZSBpdHNlbGYKKyAqICBhbmQgZm9yIHRoZSBvYmplY3QgbG9hZGFibGUgc2VjdGlvbnMgcmVhZCBmcm9tIHRoZSBmaWxlLgorICogIC0gc2hhbGxvdyBtb2R1bGVzLCB3aGljaCBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBFTEYgc2hhcmVkIG9iamVjdCwgYnV0IGNvbnRhaW4KKyAqICBtZXRhaW5mb3JtYXRpb24gYWJvdXQgYSBtZW1vcnkgcmVnaW9uIGFscmVhZHkgcHJlc2VudCBhbmQgY29udGFpbmluZyB0aGUKKyAqICBhY3R1YWwgY29kZSBhbmQgZGF0YS4gT25lIHBhcnRpY3VsYXIgdXNhZ2Ugb2Ygc2hhbGxvdyBtb2R1bGVzIGlzIHRvIGFjY2VzcworICogIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSByb290IENPTTMyIG1vZHVsZSBsb2FkZWQgYnkgdGhlIFNZU0xJTlVYIGNvcmUuCisgKiAgQXMgdGhlaXIgbmFtZSBzdWdnZXN0cywgbWVtb3J5IGlzIHJlc2VydmVkIG9ubHkgZm9yIHRoZSBlbGZfbW9kdWxlIHN0cnVjdHVyZQorICogIGl0c2VsZiBhbmQgb3B0aW9uYWxseSBmb3IgYSB1c3VhbGx5IHNtYWxsIG1lbW9yeSByZWdpb24gY29udGFpbmluZyBtZXRhaW5mb3JtYXRpb24KKyAqICAoc3ltYm9sIGluZm9ybWF0aW9uKS4KKyAqCisgKiAgTW9kdWxlIGRlc2NyaXB0b3JzIGFyZSByZWxhdGVkIHRvIGVhY2ggb3RoZXIgdGhyb3VnaCBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLiBBIG1vZHVsZQorICogIGNhbiBkZXBlbmQgb24gc3ltYm9scyBmcm9tIG90aGVyIG1vZHVsZXMsIGFuZCBpbiB0dXJuIGl0IGNhbiBwcm92aWRlIHN5bWJvbHMgdXNlZAorICogIGJ5IG90aGVyIGRlcGVuZGFudCBtb2R1bGVzLiBUaGlzIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVzY3JpYmVkIGFzIGEgZGlyZWN0ZWQKKyAqICBhY3ljbGljIGdyYXBoIChEQUcpLiBUaGUgZ3JhcGggaXMgc3RvcmVkIHVzaW5nIGRvdWJsZSBsaW5rZWQgbGlzdHMgb2YKKyAqICBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuIFRoZXJlIGlzIGFsc28gYSBnbG9iYWwgbGlua2VkIGxpc3QgY29udGFpbmluZyBhbGwKKyAqICB0aGUgbW9kdWxlcyBjdXJyZW50bHkgbG9hZGVkLgorICovCitzdHJ1Y3QgYXRleGl0Oworc3RydWN0IGVsZl9tb2R1bGUgeworCWNoYXIJCQkJbmFtZVtNT0RVTEVfTkFNRV9TSVpFXTsgCQkvLyBUaGUgbW9kdWxlIG5hbWUKKworCWJvb2wJCQlzaGFsbG93OwkvLyBXaGV0aGVyIHRoZSBtb2R1bGUgY29udGFpbnMgYW55IGNvZGUKKworCXN0cnVjdCBsaXN0X2hlYWQJcmVxdWlyZWQ7CQkvLyBIZWFkIG9mIHRoZSByZXF1aXJlZCBtb2R1bGVzIGxpc3QKKwlzdHJ1Y3QgbGlzdF9oZWFkCWRlcGVuZGFudHM7CQkvLyBIZWFkIG9mIG1vZHVsZSBkZXBlbmRhbnRzIGxpc3QKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CQkvLyBUaGUgbGlzdCBlbnRyeSBpbiB0aGUgbW9kdWxlIGxpc3QKKworCW1vZHVsZV9jdG9yX3QJCSpjdG9yczsJCS8vIG1vZHVsZSBjb25zdHJ1Y3RvcnMKKwltb2R1bGVfY3Rvcl90CQkqZHRvcnM7CQkvLyBtb2R1bGUgZGVzdHJ1Y3RvcnMKKwltb2R1bGVfbWFpbl90CQltYWluX2Z1bmM7IC8vIFRoZSBtYWluIGZ1bmN0aW9uIChmb3IgZXhlY3V0YWJsZSBtb2R1bGVzKQorCisJdm9pZAkJCQkqbW9kdWxlX2FkZHI7IC8vIFRoZSBtb2R1bGUgbG9jYXRpb24gaW4gdGhlIG1lbW9yeQorCUVsZl9BZGRyCQkJYmFzZV9hZGRyOwkvLyBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtb2R1bGUKKwlFbGZfV29yZAkJCW1vZHVsZV9zaXplOyAvLyBUaGUgbW9kdWxlIHNpemUgaW4gbWVtb3J5CisKKwlFbGZfV29yZAkJCSpoYXNoX3RhYmxlOwkvLyBUaGUgc3ltYm9sIGhhc2ggdGFibGUKKwlFbGZfV29yZAkJCSpnaGFzaF90YWJsZTsJLy8gVGhlIEdOVSBzdHlsZSBoYXNoIHRhYmxlCisJY2hhcgkJCQkqc3RyX3RhYmxlOwkJLy8gVGhlIHN0cmluZyB0YWJsZQorCXZvaWQgCQkJCSpzeW1fdGFibGU7CQkvLyBUaGUgc3ltYm9sIHRhYmxlCisJdm9pZAkJCQkqZ290OwkJCS8vIFRoZSBHbG9iYWwgT2Zmc2V0IFRhYmxlCisJRWxmX0R5bgkJCSpkeW5fdGFibGU7CQkvLyBEeW5hbWljIGxvYWRpbmcgaW5mb3JtYXRpb24gdGFibGUKKworCUVsZl9Xb3JkCQkJc3RydGFibGVfc2l6ZTsJLy8gVGhlIHNpemUgb2YgdGhlIHN0cmluZyB0YWJsZQorCUVsZl9Xb3JkCQkJc3ltZW50X3NpemU7CS8vIFRoZSBzaXplIG9mIGEgc3ltYm9sIGVudHJ5CisJRWxmX1dvcmQJCQlzeW10YWJsZV9zaXplOwkvLyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlCisKKworCXVuaW9uIHsKKwkJLy8gVHJhbnNpZW50IC0gRGF0YSBhdmFpbGFibGUgd2hpbGUgdGhlIG1vZHVsZSBpcyBsb2FkaW5nCisJCXN0cnVjdCB7CisJCQlGSUxFCQkqX2ZpbGU7CQkvLyBUaGUgZmlsZSBvYmplY3Qgb2YgdGhlIG9wZW4gZmlsZQorCQkJRWxmX09mZglfY3Jfb2Zmc2V0OwkvLyBUaGUgY3VycmVudCBvZmZzZXQgaW4gdGhlIG9wZW4gZmlsZQorCQl9IGw7CisKKwkJLy8gUHJvY2VzcyBleGVjdXRpb24gZGF0YQorCQlzdHJ1Y3QgeworCQkJam1wX2J1ZgkJcHJvY2Vzc19leGl0OwkvLyBFeGl0IHN0YXRlCisJCQlzdHJ1Y3QgYXRleGl0ICAqYXRleGl0X2xpc3Q7CS8vIGF0ZXhpdCgpIGNoYWluCisJCX0geDsKKwl9IHU7CisKKwkvLyBFTEYgRFRfTkVFREVEIGVudHJpZXMgZm9yIHRoaXMgbW9kdWxlCisJaW50CQkJCW5yX25lZWRlZDsKKwlFbGZfV29yZAkJCW5lZWRlZFtNQVhfTlJfREVQU107Cit9OworCisvKioKKyAqIHN0cnVjdCBtb2R1bGVfZGVwIC0gc3RydWN0dXJlIGVuY2Fwc3VsYXRpbmcgYSBtb2R1bGUgZGVwZW5kZW5jeSBuZWVkCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhbiBpdGVtIGluIGEgZG91YmxlIGxpbmtlZCBsaXN0IG9mIHByZWRlY2Vzc29ycyBvcgorICogc3VjY2Vzc29ycy4gVGhlIGl0ZW0gY29udGVudHMgaXMgYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSBkZXNjcmlwdG9yLgorICovCitzdHJ1Y3QgbW9kdWxlX2RlcCB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwkJLy8gVGhlIGxpc3QgZW50cnkgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdAorCisJc3RydWN0IGVsZl9tb2R1bGUJKm1vZHVsZTsJLy8gVGhlIHRhcmdldCBtb2R1bGUgZGVzY3JpcHRvcgorfTsKKworCisvKioKKyAqIFVubG9hZCBhbGwgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgc2luY2UgQG5hbWUuCisgKgorICogUmV0dXJucyB0aGUgc3RydWN0IGVsZl9tb2R1bGUgKiBmb3IgQG5hbWUgb3IgJU5VTEwgaWYgbm8gbW9kdWxlcworICogaGF2ZSBiZWVuIGxvYWRlZCBzaW5jZSBAbmFtZS4KKyAqLworZXh0ZXJuIHN0cnVjdCBlbGZfbW9kdWxlICp1bmxvYWRfbW9kdWxlc19zaW5jZShjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIEZJTEUgKmZpbmRwYXRoKGNoYXIgKm5hbWUpOworCisKKy8qKgorICogTmFtZXMgb2Ygc3ltYm9scyB3aXRoIHNwZWNpYWwgbWVhbmluZyAodHJlYXRlZCBhcyBzcGVjaWFsIGNhc2VzIGF0IGxpbmtpbmcpCisgKi8KKyNkZWZpbmUgTU9EVUxFX0VMRl9JTklUX1BUUgkJIl9fbW9kdWxlX2luaXRfcHRyIgkvLyBJbml0aWFsaXphdGlvbiBwb2ludGVyIHN5bWJvbCBuYW1lCisjZGVmaW5lIE1PRFVMRV9FTEZfRVhJVF9QVFIJCSJfX21vZHVsZV9leGl0X3B0ciIJLy8gRmluYWxpemF0aW9uIHBvaW50ZXIgc3ltYm9sIG5hbWUKKyNkZWZpbmUgTU9EVUxFX0VMRl9NQUlOX1BUUgkJIl9fbW9kdWxlX21haW5fcHRyIiAvLyBFbnRyeSBwb2ludGVyIHN5bWJvbCBuYW1lCisKKy8qKgorICogbW9kdWxlc19oZWFkIC0gQSBnbG9iYWwgbGlua2VkIGxpc3QgY29udGFpbmluZyBhbGwgdGhlIGxvYWRlZCBtb2R1bGVzLgorICovCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVzX2hlYWQ7CisKKworLyoqCisgKiBmb3JfZWFjaF9tb2R1bGUgLSBpdGVyYXRvciBsb29wIHRocm91Z2ggdGhlIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMuCisgKi8KKyNkZWZpbmUgZm9yX2VhY2hfbW9kdWxlKG0pCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJm1vZHVsZXNfaGVhZCwgbGlzdCkKKworLyoqCisgKiBmb3JfZWFjaF9tb2R1bGVfc2FmZSAtIGl0ZXJhdG9yIGxvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBsb2FkZWQgbW9kdWxlcyBzYWZlIGFnYWluc3QgcmVtb3ZhbC4KKyAqLworI2RlZmluZSBmb3JfZWFjaF9tb2R1bGVfc2FmZShtLCBuKQkJCQlcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG0sIG4sICZtb2R1bGVzX2hlYWQsIGxpc3QpCisKKy8qKgorICogbW9kdWxlX2N1cnJlbnQgLSByZXR1cm4gdGhlIG1vZHVsZSBhdCB0aGUgaGVhZCBvZiB0aGUgbW9kdWxlIGxpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZV9jdXJyZW50KHZvaWQpCit7CisJc3RydWN0IGVsZl9tb2R1bGUgKmhlYWQ7CisKKwloZWFkID0gbGlzdF9lbnRyeSgoJm1vZHVsZXNfaGVhZCktPm5leHQsIHR5cGVvZigqaGVhZCksIGxpc3QpOworCXJldHVybiBoZWFkOworfQorCisvKioKKyAqIG1vZHVsZXNfaW5pdCAtIGluaXRpYWxpemUgdGhlIG1vZHVsZSBzdWJzeXN0ZW0uCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG1vZHVsZSBvcGVyYXRpb24gaXMgdG8gYmUgcGVyZm9ybWVkLgorICovCitleHRlcm4gaW50IG1vZHVsZXNfaW5pdCh2b2lkKTsKKworCisvKioKKyAqIG1vZHVsZXNfdGVybSAtIHJlbGVhc2VzIGFsbCByZXNvdXJjZXMgcGVydGFpbmluZyB0byB0aGUgbW9kdWxlIHN1YnN5c3RlbS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIG1vZHVsZSBvcGVyYXRpb25zLgorICovCitleHRlcm4gdm9pZCBtb2R1bGVzX3Rlcm0odm9pZCk7CisKKworLyoqCisgKiBtb2R1bGVfYWxsb2MgLSByZXNlcnZlcyBzcGFjZSBmb3IgYSBuZXcgbW9kdWxlIGRlc2NyaXB0b3IuCisgKiBAbmFtZTogCXRoZSBmaWxlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBiZSBsb2FkZWQuCisgKgorICogVGhlIGZ1bmN0aW9uIHNpbXBseSBhbGxvY2F0ZXMgYSBuZXcgbW9kdWxlIGRlc2NyaXB0b3IgYW5kIGluaXRpYWxpemVzIGl0cyBmaWVsZHMKKyAqIGluIG9yZGVyIHRvIGJlIHVzZWQgYnkgc3Vic2VxdWVudCBsb2FkaW5nIG9wZXJhdGlvbnMuCisgKi8KK2V4dGVybiBzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpOworCisKKy8qKgorICogbW9kdWxlX2xvYWQgLSBsb2FkcyBhIHJlZ3VsYXIgRUxGIG1vZHVsZSBpbnRvIG1lbW9yeS4KKyAqIEBtb2R1bGU6CXRoZSBtb2R1bGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBtb2R1bGVfYWxsb2MuCisgKgorICogVGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBtb2R1bGUgZmlsZSwgY2hlY2tzIHdoZXRoZXIgdGhlIGZpbGUgaGFzIGEKKyAqIHZhbGlkIHN0cnVjdHVyZSwgdGhlbiBsb2FkcyBpbnRvIG1lbW9yeSB0aGUgY29kZSBhbmQgdGhlIGRhdGEgYW5kIHBlcmZvcm1zCisgKiBhbnkgc3ltYm9sIHJlbG9jYXRpb25zLiBBIG1vZHVsZSBkZXBlbmRlbmN5IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZQorICogcmVsb2NhdGVkIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IG1vZHVsZS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyAwIGlmIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgYW5kCisgKiBhIG5vbi16ZXJvIHZhbHVlIGlmIGFuIGVycm9yIG9jY3Vycy4gUG9zc2libGUgZXJyb3JzIGluY2x1ZGUgaW52YWxpZCBtb2R1bGUKKyAqIHN0cnVjdHVyZSwgbWlzc2luZyBzeW1ib2wgZGVmaW5pdGlvbnMgKHVuc2F0aXNmaWVkIGRlcGVuZGVuY2llcykgYW5kIG1lbW9yeQorICogYWxsb2NhdGlvbiBpc3N1ZXMuCisgKi8KK2V4dGVybiBpbnQgbW9kdWxlX2xvYWQoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CisKKworLyoqCisgKiBtb2R1bGVfdW5sb2FkIC0gdW5sb2FkcyB0aGUgbW9kdWxlIGZyb20gdGhlIHN5c3RlbS4KKyAqIEBtb2R1bGU6IHRoZSBtb2R1bGUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisgKgorICogVGhlIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgd2hldGhlciB0aGUgbW9kdWxlIGNhbiBiZSBzYWZlbHkKKyAqIHJlbW92ZWQsIHRoZW4gaXQgZXhlY3V0ZXMgYW55IGRlc3RydWN0b3JzIGFuZCByZWxlYXNlcyBhbGwgdGhlCisgKiBhc3NvY2lhdGVkIG1lbW9yeS4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgYXBwbGllZCBib3RoIGZvciBzdGFuZGFyZAorICogbW9kdWxlcyBhbmQgZm9yIHNoYWxsb3cgbW9kdWxlcy4KKyAqCisgKiBBIG1vZHVsZSBjYW4gYmUgc2FmZWx5IHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtIHdoZW4gbm8gb3RoZXIgbW9kdWxlcyByZWZlcmVuY2UKKyAqIHN5bWJvbHMgZnJvbSBpdC4KKyAqLworZXh0ZXJuIGludCBtb2R1bGVfdW5sb2FkKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpOworCisvKioKKyAqIF9tb2R1bGVfdW5sb2FkIC0gdW5sb2FkcyB0aGUgbW9kdWxlIHdpdGhvdXQgcnVubmluZyBkZXN0cnVjdG9ycworICogQG1vZHVsZTogdGhlIG1vZHVsZSBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIG1vZHVsZV91bmxvYWQoKSwgZXhjZXB0IHRoYXQgdGhlCisgKiBtb2R1bGUncyBkZXN0cnVjdG9ycyBhcmUgbm90IGV4ZWN1dGVkLgorICovCitleHRlcm4gaW50IF9tb2R1bGVfdW5sb2FkKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpOworCisvKioKKyAqIGdldF9tb2R1bGVfdHlwZSAtIGdldCB0eXBlIG9mIHRoZSBtb2R1bGUKKyAqIEBtb2R1bGU6IHRoZSBtb2R1bGUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0eXBlIG9mIG1vZHVsZSB3ZSdyZSBkZWFsaW5nIHdpdGgKKyAqIGVpdGhlciBhIGxpYnJhcnkgbW9kdWxlICggTElCX01PRFVMRSApLCBleGVjdXRhYmxlIG1vZHVsZSAoIEVYRUNfTU9EVUxFICksCisgKiBvciBhbiBlcnJvciAoIFVOS05PV05fTU9EVUxFICkuIFRoZSB3YXkgaXQgY2hlY2tzIHRlaCB0eXBlIGlzIGJ5IGNoZWNraW5nIHRvIHNlZQorICogaWYgdGhlIG1vZHVsZSBoYXMgaXRzIG1haW5fZnVuYyBzZXQgKCBpbiB3aGljaCBjYXNlIGl0J3MgYW4gZXhlY3V0YWJsZSApLiBJbiBjYXNlCisgKiBpdCBkb2Vzbid0IGl0IHRoZW4gY2hlY2tzIHRvIHNlZSBpZiBpbml0X2Z1bmMgaXMgc2V0ICggaW4gd2hpY2ggY2FzZSBpdCdzIGEKKyAqIGxpYnJhcnkgbW9kdWxlLiBJZiB0aGlzIGlzbid0IHRoZSBjYXNlIGVpdGhlciB3ZSBkb24ndCBrbm93IHdoYXQgaXQgaXMgc28gYmFpbCBvdXQKKyAqLworZXh0ZXJuIGludCBnZXRfbW9kdWxlX3R5cGUoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CisKKy8qKgorICogbW9kdWxlX3VubG9hZGFibGUgLSBjaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZSB1bmxvYWRlZC4KKyAqIEBtb2R1bGU6IHRoZSBtb2R1bGUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUKKyAqCisgKiBBIG1vZHVsZSBjYW4gYmUgdW5sb2FkZWQgZnJvbSB0aGUgc3lzdGVtIHdoZW4gbm8gb3RoZXIgbW9kdWxlcyBkZXBlbmQgb24gaXQsCisgKiB0aGF0IGlzLCBubyBzeW1ib2xzIGFyZSByZWZlcmVuY2VkIGZyb20gaXQuCisgKi8KK2V4dGVybiBpbnQgbW9kdWxlX3VubG9hZGFibGUoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CisKKy8qKgorICogbW9kdWxlX2ZpbmQgLSBzZWFyY2hlcyBmb3IgYSBtb2R1bGUgYnkgaXRzIG5hbWUuCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgYXMgaXQgd2FzIHNwZWNpZmllZCBpbiBtb2R1bGVfYWxsb2MuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtb2R1bGUgZGVzY3JpcHRvciwgaWYgZm91bmQsIG9yCisgKiBOVUxMIG90aGVyd2lzZS4KKyAqLworZXh0ZXJuIHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGVfZmluZChjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBtb2R1bGVfZmluZF9zeW1ib2wgLSBzZWFyY2hlcyBmb3IgYSBzeW1ib2wgZGVmaW5pdGlvbiBpbiBhIGdpdmVuIG1vZHVsZS4KKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIGJlIGZvdW5kLgorICogQG1vZHVsZTogdGhlIG1vZHVsZSBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIG1vZHVsZSBzeW1ib2wgdGFibGUgZm9yIGEgc3ltYm9sIG1hdGNoaW5nIGV4YWN0bHkKKyAqIHRoZSBuYW1lIHByb3ZpZGVkLiBUaGUgb3BlcmF0aW9uIHVzZXMgdGhlIGZvbGxvd2luZyBzZWFyY2ggYWxnb3JpdGhtcywgaW4gdGhpcworICogb3JkZXI6CisgKiAgLSBJZiBhIEdOVSBoYXNoIHRhYmxlIGlzIHByZXNlbnQgaW4gdGhlIG1vZHVsZSwgaXQgaXMgdXNlZCB0byBmaW5kIHRoZSBzeW1ib2wuCisgKiAgLSBJZiB0aGUgc3ltYm9sIGNhbm5vdCBiZSBmb3VuZCB3aXRoIHRoZSBmaXJzdCBtZXRob2QgKGVpdGhlciB0aGUgaGFzaCB0YWJsZQorICogIGlzIG5vdCBwcmVzZW50IG9yIHRoZSBzeW1ib2wgaXMgbm90IGZvdW5kKSBhbmQgaWYgYSByZWd1bGFyIChTeXNWKSBoYXNoIHRhYmxlCisgKiAgaXMgcHJlc2VudCwgYSBzZWFyY2ggaXMgcGVyZm9ybWVkIG9uIHRoZSBTeXNWIGhhc2ggdGFibGUuIElmIHRoZSBzeW1ib2wgaXMgbm90CisgKiAgZm91bmQsIE5VTEwgaXMgcmV0dXJuZWQuCisgKiAgLSBJZiB0aGUgc2Vjb25kIG1ldGhvZCBjYW5ub3QgYmUgYXBwbGllZCwgYSBsaW5lYXIgc2VhcmNoIGlzIHBlcmZvcm1lZCBieQorICogIGluc3BlY3RpbmcgZXZlcnkgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUuCisgKgorICogIElmIHRoZSBzeW1ib2wgaXMgZm91bmQsIGEgcG9pbnRlciB0byBpdHMgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQsIGFuZAorICogIE5VTEwgb3RoZXJ3aXNlLgorICovCitleHRlcm4gRWxmX1N5bSAqbW9kdWxlX2ZpbmRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpOworCisvKioKKyAqIGdsb2JhbF9maW5kX3N5bWJvbCAtIHNlYXJjaGVzIGZvciBhIHN5bWJvbCBkZWZpbml0aW9uIGluIHRoZSBlbnRpcmUgbW9kdWxlIG5hbWVzcGFjZS4KKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIGJlIGZvdW5kLgorICogQG1vZHVsZTogYW4gb3B0aW9uYWwgKG1heSBiZSBOVUxMKSBwb2ludGVyIHRvIGEgbW9kdWxlIGRlc2NyaXB0b3IgdmFyaWFibGUgdGhhdAorICogd2lsbCBob2xkIHRoZSBtb2R1bGUgd2hlcmUgdGhlIHN5bWJvbCB3YXMgZm91bmQuCisgKgorICogVGhlIGZ1bmN0aW9uIHNlYXJjaCBmb3IgdGhlIGdpdmVuIHN5bWJvbCBuYW1lIGluIGFsbCB0aGUgbW9kdWxlcyBjdXJyZW50bHkKKyAqIGxvYWRlZCBpbiB0aGUgc3lzdGVtLCBpbiB0aGUgcmV2ZXJzZSBtb2R1bGUgbG9hZGluZyBvcmRlci4gVGhhdCBpcywgdGhlIG1vc3QKKyAqIHJlY2VudGx5IGxvYWRlZCBtb2R1bGUgaXMgc2VhcmNoZWQgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBwcmV2aW91cyBvbmUsIHVudGlsCisgKiB0aGUgZmlyc3QgbG9hZGVkIG1vZHVsZSBpcyByZWFjaGVkLgorICoKKyAqIElmIG5vIG1vZHVsZSBjb250YWlucyB0aGUgc3ltYm9sLCBOVUxMIGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHJldHVybiB2YWx1ZSBpcworICogYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuIElmIHRoZSBtb2R1bGUgcGFyYW1ldGVyIGlzIG5vdCBOVUxMLAorICogaXQgaXMgZmlsbGVkIHdpdGggdGhlIGFkZHJlc3Mgb2YgdGhlIG1vZHVsZSBkZXNjcmlwdG9yIHdoZXJlIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4KKyAqLworZXh0ZXJuIEVsZl9TeW0gKmdsb2JhbF9maW5kX3N5bWJvbChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZWxmX21vZHVsZSAqKm1vZHVsZSk7CisKKy8qKgorICogbW9kdWxlX2dldF9hYnNvbHV0ZSAtIGNvbnZlcnRzIGFuIG1lbW9yeSBhZGRyZXNzIHJlbGF0aXZlIHRvIGEgbW9kdWxlIGJhc2UgYWRkcmVzcworICogdG8gaXRzIGFic29sdXRlIHZhbHVlIGluIFJBTS4KKyAqIEBhZGRyOiB0aGUgcmVsYXRpdmUgYWRkcmVzcyB0byBjb252ZXJ0LgorICogQG1vZHVsZTogdGhlIG1vZHVsZSB3aG9zZSBiYXNlIGFkZHJlc3MgaXMgdXNlZCBmb3IgdGhlIGNvbnZlcnNpb24uCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhYnNvbHV0ZSBtZW1vcnkgYWRkcmVzcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICptb2R1bGVfZ2V0X2Fic29sdXRlKEVsZl9BZGRyIGFkZHIsIHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpIHsKKwlyZXR1cm4gKHZvaWQqKShtb2R1bGUtPmJhc2VfYWRkciArIGFkZHIpOworfQorCisvKioKKyAqIHN5c2xpbnV4X2N1cnJlbnQgLSBnZXQgdGhlIGN1cnJlbnQgbW9kdWxlIHByb2Nlc3MKKyAqLworZXh0ZXJuIHN0cnVjdCBlbGZfbW9kdWxlICpfX3N5c2xpbnV4X2N1cnJlbnQ7CitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBlbGZfbW9kdWxlICpzeXNsaW51eF9jdXJyZW50KHZvaWQpCit7CisJcmV0dXJuIF9fc3lzbGludXhfY3VycmVudDsKK30KKworCisjZW5kaWYgLy8gTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5cy9wY2kuaCBiL2NvbTMyL2luY2x1ZGUvc3lzL3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5cy9wY2kuaApAQCAtMCwwICsxLDE1MyBAQAorI2lmbmRlZiBfU1lTX1BDSV9ICisjZGVmaW5lIF9TWVNfUENJX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvLmg+CisKKyNkZWZpbmUgTUFYX1BDSV9GVU5DCQkgIDgKKyNkZWZpbmUgTUFYX1BDSV9ERVZJQ0VTCQkgMzIKKyNkZWZpbmUgTUFYX1BDSV9CVVNFUwkJMjU2CisjZGVmaW5lIExJTlVYX0tFUk5FTF9NT0RVTEVfU0laRSA2NAorI2RlZmluZSBQQ0lfVkVORE9SX05BTUVfU0laRQkyNTYKKyNkZWZpbmUgUENJX1BST0RVQ1RfTkFNRV9TSVpFCTI1NgorI2RlZmluZSBQQ0lfQ0xBU1NfTkFNRV9TSVpFCTI1NgorI2RlZmluZSBNQVhfS0VSTkVMX01PRFVMRVNfUEVSX1BDSV9ERVZJQ0UgMTAKKyNkZWZpbmUgTUFYX1BDSV9DTEFTU0VTCQkyNTYKKwordHlwZWRlZiB1aW50MzJfdCBwY2lhZGRyX3Q7CisKK2VudW0geworCUVOT1BDSUlEUyA9IDEwMCwKKwlFTk9NT0RVTEVTUENJTUFQLAorCUVOT01PRFVMRVNBTElBUworfTsKKworLyogYSBzdHJ1Y3R1cmUgZm9yIGV4dGVuZGVkIHBjaSBpbmZvcm1hdGlvbiAqLworLyogWFhYOiB1c2UgcG9pbnRlcnMgZm9yIHRoZXNlPyAqLworc3RydWN0IHBjaV9kZXZfaW5mbyB7CisgICAgY2hhciB2ZW5kb3JfbmFtZVtQQ0lfVkVORE9SX05BTUVfU0laRV07CisgICAgY2hhciBwcm9kdWN0X25hbWVbUENJX1BST0RVQ1RfTkFNRV9TSVpFXTsKKyAgICBjaGFyIGxpbnV4X2tlcm5lbF9tb2R1bGVbTElOVVhfS0VSTkVMX01PRFVMRV9TSVpFXQorCVtNQVhfS0VSTkVMX01PRFVMRVNfUEVSX1BDSV9ERVZJQ0VdOworICAgIGludCBsaW51eF9rZXJuZWxfbW9kdWxlX2NvdW50OworICAgIGNoYXIgY2xhc3NfbmFtZVtQQ0lfQ0xBU1NfTkFNRV9TSVpFXTsJLyogVGhlIG1vc3QgcHJlY2lzZSBjbGFzcyBuYW1lICovCisgICAgY2hhciBjYXRlZ29yeV9uYW1lW1BDSV9DTEFTU19OQU1FX1NJWkVdOwkvKlRoZSBnZW5lcmFsIGNhdGVnb3J5ICovCisgICAgdWludDhfdCBpcnE7CisgICAgdWludDhfdCBsYXRlbmN5OworfTsKKworLyogUENJIGRldmljZSAocmVhbGx5LCBmdW5jdGlvbikgKi8KK3N0cnVjdCBwY2lfZGV2aWNlIHsKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdWludDE2X3QgdmVuZG9yOworCSAgICB1aW50MTZfdCBwcm9kdWN0OworCSAgICB1aW50MTZfdCBzdWJfdmVuZG9yOworCSAgICB1aW50MTZfdCBzdWJfcHJvZHVjdDsKKwkgICAgdWludDhfdCByZXZpc2lvbjsKKwkgICAgdWludDhfdCBjbGFzc1szXTsKKwl9OworCXN0cnVjdCB7CisJICAgIHVpbnQzMl90IHZpZF9kaWQ7CisJICAgIHVpbnQzMl90IHN2aWRfc2RpZDsKKwkgICAgdWludDMyX3QgcmlkX2NsYXNzOworCX07CisgICAgfTsKKyAgICBzdHJ1Y3QgcGNpX2Rldl9pbmZvICpkZXZfaW5mbzsKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSAqbmV4dDsKK307CisKKy8qIFBDSSBkZXZpY2UgKCJzbG90Iikgc3RydWN0dXJlICovCitzdHJ1Y3QgcGNpX3Nsb3QgeworICAgIHN0cnVjdCBwY2lfZGV2aWNlICpmdW5jW01BWF9QQ0lfRlVOQ107Cit9OworCisvKiBQQ0kgYnVzIHN0cnVjdHVyZSAqLworc3RydWN0IHBjaV9idXMgeworICAgIHN0cnVjdCBwY2lfc2xvdCAqc2xvdFtNQVhfUENJX0RFVklDRVNdOworfTsKKworLyogUENJIGRvbWFpbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBwY2lfZG9tYWluIHsKKyAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzW01BWF9QQ0lfQlVTRVNdOworfTsKKworLyogSXRlcmF0ZSBvdmVyIGEgUENJIGRvbWFpbiAqLworI2RlZmluZSBmb3JfZWFjaF9wY2lfZnVuYyhmdW5jcCwgZG9tYWluKSBcCisgIGZvciAoaW50IF9fcGNpX2J1cyA9IDA7IF9fcGNpX2J1cyA8IE1BWF9QQ0lfQlVTRVM7IF9fcGNpX2J1cysrKSBcCisgICAgaWYgKChkb21haW4pLT5idXNbX19wY2lfYnVzXSkgXAorICAgICAgZm9yIChpbnQgX19wY2lfc2xvdCA9IDA7IF9fcGNpX3Nsb3QgPCBNQVhfUENJX0RFVklDRVM7IF9fcGNpX3Nsb3QrKykgXAorCWlmICgoZG9tYWluKS0+YnVzW19fcGNpX2J1c10tPnNsb3RbX19wY2lfc2xvdF0pIFwKKwkgIGZvciAoaW50IF9fcGNpX2Z1bmMgPSAwOyBfX3BjaV9mdW5jIDwgTUFYX1BDSV9GVU5DOyBfX3BjaV9mdW5jKyspIFwKKwkgICAgaWYgKCgoZnVuY3ApID0gKGRvbWFpbiktPmJ1c1tfX3BjaV9idXNdLT5zbG90W19fcGNpX3Nsb3RdLT4gXAorCQkgZnVuY1tfX3BjaV9mdW5jXSkpCisKKyNkZWZpbmUgZm9yX2VhY2hfcGNpX2Z1bmMzKGZ1bmNwLCBkb21haW4sIGFkZHIpIFwKKyAgZm9yIChpbnQgX19wY2lfYnVzID0gMDsgX19wY2lfYnVzIDwgTUFYX1BDSV9CVVNFUzsgX19wY2lfYnVzKyspIFwKKyAgICBpZiAoKGRvbWFpbiktPmJ1c1tfX3BjaV9idXNdKSBcCisgICAgICBmb3IgKGludCBfX3BjaV9zbG90ID0gMDsgX19wY2lfc2xvdCA8IE1BWF9QQ0lfREVWSUNFUzsgX19wY2lfc2xvdCsrKSBcCisJaWYgKChkb21haW4pLT5idXNbX19wY2lfYnVzXS0+c2xvdFtfX3BjaV9zbG90XSkgXAorCSAgZm9yIChpbnQgX19wY2lfZnVuYyA9IDA7IF9fcGNpX2Z1bmMgPCBNQVhfUENJX0ZVTkM7IF9fcGNpX2Z1bmMrKykgXAorCSAgICBpZiAoKChhZGRyKSA9IHBjaV9ta2FkZHIoX19wY2lfYnVzLCBfX3BjaV9zbG90LCBfX3BjaV9mdW5jLCAwKSksIFwKKwkJKChmdW5jcCkgPSAoZG9tYWluKS0+YnVzW19fcGNpX2J1c10tPnNsb3RbX19wY2lfc2xvdF0tPiBcCisJCSBmdW5jW19fcGNpX2Z1bmNdKSkKKworc3RydWN0IG1hdGNoIHsKKyAgICBzdHJ1Y3QgbWF0Y2ggKm5leHQ7CisgICAgdWludDMyX3QgZGlkOworICAgIHVpbnQzMl90IGRpZF9tYXNrOworICAgIHVpbnQzMl90IHNpZDsKKyAgICB1aW50MzJfdCBzaWRfbWFzazsKKyAgICB1aW50OF90IHJpZF9taW4sIHJpZF9tYXg7CisgICAgY2hhciAqZmlsZW5hbWU7Cit9OworCitzdGF0aWMgaW5saW5lIHBjaWFkZHJfdCBwY2lfbWthZGRyKHVpbnQzMl90IGJ1cywgdWludDMyX3QgZGV2LAorCQkJCSAgIHVpbnQzMl90IGZ1bmMsIHVpbnQzMl90IHJlZykKK3sKKyAgICByZXR1cm4gMHg4MDAwMDAwMCB8ICgoYnVzICYgMHhmZikgPDwgMTYpIHwgKChkZXYgJiAweDFmKSA8PCAxMSkgfAorCSgoZnVuYyAmIDB4MDcpIDw8IDgpIHwgKHJlZyAmIDB4ZmYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwY2lfYnVzKHBjaWFkZHJfdCBhZGRyKQoreworICAgIHJldHVybiAoYWRkciA+PiAxNikgJiAweGZmOworfQorCitzdGF0aWMgaW5saW5lIGludCBwY2lfZGV2KHBjaWFkZHJfdCBhZGRyKQoreworICAgIHJldHVybiAoYWRkciA+PiAxMSkgJiAweDFmOworfQorCitzdGF0aWMgaW5saW5lIGludCBwY2lfZnVuYyhwY2lhZGRyX3QgYWRkcikKK3sKKyAgICByZXR1cm4gKGFkZHIgPj4gOCkgJiAweDA3OworfQorCitlbnVtIHBjaV9jb25maWdfdHlwZSB7CisgICAgUENJX0NGR19OT05FID0gLTEsCQkvKiBiYWRuZXNzICovCisgICAgUENJX0NGR19BVVRPID0gMCwJCS8qIGF1dG9kZXRlY3QgKi8KKyAgICBQQ0lfQ0ZHX1RZUEUxID0gMSwKKyAgICBQQ0lfQ0ZHX1RZUEUyID0gMiwKKyAgICBQQ0lfQ0ZHX0JJT1MgPSAzLAorfTsKKworZW51bSBwY2lfY29uZmlnX3R5cGUgcGNpX3NldF9jb25maWdfdHlwZShlbnVtIHBjaV9jb25maWdfdHlwZSk7CisKK3VpbnQ4X3QgcGNpX3JlYWRiKHBjaWFkZHJfdCk7Cit1aW50MTZfdCBwY2lfcmVhZHcocGNpYWRkcl90KTsKK3VpbnQzMl90IHBjaV9yZWFkbChwY2lhZGRyX3QpOwordm9pZCBwY2lfd3JpdGViKHVpbnQ4X3QsIHBjaWFkZHJfdCk7Cit2b2lkIHBjaV93cml0ZXcodWludDE2X3QsIHBjaWFkZHJfdCk7Cit2b2lkIHBjaV93cml0ZWwodWludDMyX3QsIHBjaWFkZHJfdCk7CisKK3N0cnVjdCBwY2lfZG9tYWluICpwY2lfc2Nhbih2b2lkKTsKK3ZvaWQgZnJlZV9wY2lfZG9tYWluKHN0cnVjdCBwY2lfZG9tYWluICpkb21haW4pOworc3RydWN0IG1hdGNoICpmaW5kX3BjaV9kZXZpY2UoY29uc3Qgc3RydWN0IHBjaV9kb21haW4gKnBjaV9kb21haW4sCisJCQkgICAgICBzdHJ1Y3QgbWF0Y2ggKmxpc3QpOworaW50IGdldF9uYW1lX2Zyb21fcGNpX2lkcyhzdHJ1Y3QgcGNpX2RvbWFpbiAqcGNpX2RvbWFpbiwgY2hhciAqcGNpaWRzX3BhdGgpOworaW50IGdldF9tb2R1bGVfbmFtZV9mcm9tX3BjaW1hcChzdHJ1Y3QgcGNpX2RvbWFpbiAqcGNpX2RvbWFpbiwgY2hhciAqbW9kdWxlc19wY2ltYXBfcGF0aCk7CitpbnQgZ2V0X21vZHVsZV9uYW1lX2Zyb21fYWxpYXMoc3RydWN0IHBjaV9kb21haW4gKnBjaV9kb21haW4sIGNoYXIgKm1vZHVsZXNfYWxpYXNfcGF0aCk7CitpbnQgZ2V0X2NsYXNzX25hbWVfZnJvbV9wY2lfaWRzKHN0cnVjdCBwY2lfZG9tYWluICpwY2lfZG9tYWluLCBjaGFyICpwY2lpZHNfcGF0aCk7Cit2b2lkIGdhdGhlcl9hZGRpdGlvbmFsX3BjaV9jb25maWcoc3RydWN0IHBjaV9kb21haW4gKmRvbWFpbik7CisjZW5kaWYgLyogX1NZU19QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXMvc3RhdC5oIGIvY29tMzIvaW5jbHVkZS9zeXMvc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxY2RmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5cy9zdGF0LmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIHN5cy9zdGF0LmgKKyAqLworCisjaWZuZGVmIF9TWVNfU1RBVF9ICisjZGVmaW5lIF9TWVNfU1RBVF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogV2UgZG9uJ3QgdXNlIHRoaXMsIGJ1dCBpdCdzIHRoZXJlIGZvciBjb21wYXRpYmlsaXR5ICovCisKKyNkZWZpbmUgU19JRk1UICAwMDE3MDAwMAorI2RlZmluZSBTX0lGU09DSyAwMTQwMDAwCisjZGVmaW5lIFNfSUZMTksgIDAxMjAwMDAKKyNkZWZpbmUgU19JRlJFRyAgMDEwMDAwMAorI2RlZmluZSBTX0lGQkxLICAwMDYwMDAwCisjZGVmaW5lIFNfSUZESVIgIDAwNDAwMDAKKyNkZWZpbmUgU19JRkNIUiAgMDAyMDAwMAorI2RlZmluZSBTX0lGSUZPICAwMDEwMDAwCisjZGVmaW5lIFNfSVNVSUQgIDAwMDQwMDAKKyNkZWZpbmUgU19JU0dJRCAgMDAwMjAwMAorI2RlZmluZSBTX0lTVlRYICAwMDAxMDAwCisjZGVmaW5lIFNfSVNMTksobSkgICAgICAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKKyNkZWZpbmUgU19JU1JFRyhtKSAgICAgICgoKG0pICYgU19JRk1UKSA9PSBTX0lGUkVHKQorI2RlZmluZSBTX0lTRElSKG0pICAgICAgKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjZGVmaW5lIFNfSVNDSFIobSkgICAgICAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkNIUikKKyNkZWZpbmUgU19JU0JMSyhtKSAgICAgICgoKG0pICYgU19JRk1UKSA9PSBTX0lGQkxLKQorI2RlZmluZSBTX0lTRklGTyhtKSAgICAgKCgobSkgJiBTX0lGTVQpID09IFNfSUZJRk8pCisjZGVmaW5lIFNfSVNTT0NLKG0pICAgICAoKChtKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCisjZGVmaW5lIFNfSVJXWFUgMDA3MDAKKyNkZWZpbmUgU19JUlVTUiAwMDQwMAorI2RlZmluZSBTX0lXVVNSIDAwMjAwCisjZGVmaW5lIFNfSVhVU1IgMDAxMDAKKyNkZWZpbmUgU19JUldYRyAwMDA3MAorI2RlZmluZSBTX0lSR1JQIDAwMDQwCisjZGVmaW5lIFNfSVdHUlAgMDAwMjAKKyNkZWZpbmUgU19JWEdSUCAwMDAxMAorI2RlZmluZSBTX0lSV1hPIDAwMDA3CisjZGVmaW5lIFNfSVJPVEggMDAwMDQKKyNkZWZpbmUgU19JV09USCAwMDAwMgorI2RlZmluZSBTX0lYT1RIIDAwMDAxCisKKy8qIFRoZXNlIGFyZSB0aGUgb25seSBmaWVsZHMgaW4gc3RydWN0IHN0YXQgd2UgZW11bGF0ZSAqLworc3RydWN0IHN0YXQgeworICAgIG1vZGVfdCBzdF9tb2RlOworICAgIG9mZl90IHN0X3NpemU7Cit9OworCisvKiBPbmx5IGZzdGF0KCkgc3VwcG9ydGVkICovCitpbnQgZnN0YXQoaW50LCBzdHJ1Y3Qgc3RhdCAqKTsKKworI2VuZGlmIC8qIF9TWVNfU1RBVF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5cy90aW1lLmggYi9jb20zMi9pbmNsdWRlL3N5cy90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViZmYwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzL3RpbWUuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX1NZU19USU1FX0gKKyNkZWZpbmUgX1NZU19USU1FX0gKKworLyogZW1wdHkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5cy90aW1lcy5oIGIvY29tMzIvaW5jbHVkZS9zeXMvdGltZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRhMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXMvdGltZXMuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogc3lzL3RpbWVzLmgKKyAqLworCisjaWZuZGVmIF9TWVNfVElNRVNfSAorI2RlZmluZSBfU1lTX1RJTUVTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdHJ1Y3QgdG1zIHsKKyAgICAvKiBFbXB0eSAqLworfTsKKworI2RlZmluZSBIWgkJMTAwMAorI2RlZmluZSBDTEtfVENLCQlIWgorCit0eXBlZGVmIHVpbnQzMl90IGNsb2NrX3Q7CisKK2V4dGVybiB2b2xhdGlsZSB1aW50MzJfdCBfX21zX3RpbWVyOworCitzdGF0aWMgaW5saW5lIGNsb2NrX3QgdGltZXMoc3RydWN0IHRtcyAqYnVmKQoreworICAgICh2b2lkKWJ1ZjsKKyAgICByZXR1cm4gX19tc190aW1lcjsKK30KKworI2VuZGlmIC8qIF9TWVNfVElNRVNfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXMvdHlwZXMuaCBiL2NvbTMyL2luY2x1ZGUvc3lzL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3OWE0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzL3R5cGVzLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIHN5cy90eXBlcy5oCisgKi8KKworI2lmbmRlZiBfU1lTX1RZUEVTX0gKKyNkZWZpbmUgX1NZU19UWVBFU19ICisKKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHB0cmRpZmZfdCBzc2l6ZV90OwordHlwZWRlZiBpbnQgbW9kZV90OwordHlwZWRlZiBzaXplX3Qgb2ZmX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXMveDg2XzY0L2JpdG9wcy5oIGIvY29tMzIvaW5jbHVkZS9zeXMveDg2XzY0L2JpdG9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWNjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5cy94ODZfNjQvYml0b3BzLmgKQEAgLTAsMCArMSw1NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogICAKKyAqICAgQ29weXJpZ2h0IDIwMTAtMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKiAgIAorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqICAgCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYml0b3BzLmggLSBpMzg2CisgKgorICogU2ltcGxlIGJpdHdpc2Ugb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYml0KGxvbmcgX19iaXQsIHZvaWQgKl9fYml0bWFwKQoreworICAgIGFzbSB2b2xhdGlsZSgiYnRzICUxLCUwIgorCQkgOiAiK20iICgqKHVuc2lnbmVkIGNoYXIgKilfX2JpdG1hcCkKKwkJIDogIklyIiAoX19iaXQpIDogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xyX2JpdChsb25nIF9fYml0LCB2b2lkICpfX2JpdG1hcCkKK3sKKyAgICBhc20gdm9sYXRpbGUoImJ0Y2wgJTEsJTAiCisJCSA6ICIrbSIgKCoodW5zaWduZWQgY2hhciAqKV9fYml0bWFwKQorCQkgOiAiSXIiIChfX2JpdCkgOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcHVyZWZ1bmMgdGVzdF9iaXQobG9uZyBfX2JpdCwgY29uc3Qgdm9pZCAqX19iaXRtYXApCit7CisgICAgdW5zaWduZWQgY2hhciBfX3I7CisgICAgYXNtKCJidCAlMiwlMTsgc2V0YyAlMCIKKwk6ICI9cW0iIChfX3IpCisJOiAibSIgKCooY29uc3QgdW5zaWduZWQgY2hhciAqKV9fYml0bWFwKSwgIklyIiAoX19iaXQpKTsKKyAgICByZXR1cm4gX19yOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXMveDg2XzY0L2NwdS5oIGIvY29tMzIvaW5jbHVkZS9zeXMveDg2XzY0L2NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZTk2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5cy94ODZfNjQvY3B1LmgKQEAgLTAsMCArMSwxMjggQEAKKyNpZm5kZWYgX0NQVV9YODZfNjRfSAorI2RlZmluZSBfQ1BVX1g4Nl82NF9ICisKKy8qIHg4Nl82NCBjcHUuaCAgKi8KKworc3RhdGljIGlubGluZSB1aW50NjRfdCByZHRzYyh2b2lkKQoreworICAgIHVpbnQ2NF90IHY7CisgICAgYXNtIHZvbGF0aWxlKCJyZHRzYyIgOiAiPUEiICh2KSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgcmR0c2NsKHZvaWQpCit7CisgICAgdWludDMyX3QgdjsKKyAgICBhc20gdm9sYXRpbGUoInJkdHNjIiA6ICI9YSIgKHYpIDogOiAiZWR4Iik7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfY3B1aWQodW5zaWduZWQgaW50ICplYXgsIHVuc2lnbmVkIGludCAqZWJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmVjeCwgdW5zaWduZWQgaW50ICplZHgpCit7CisgICAgICAgIC8qIGVjeCBpcyBvZnRlbiBhbiBpbnB1dCBhcyB3ZWxsIGFzIGFuIG91dHB1dC4gKi8KKyAgICAgICAgYXNtIHZvbGF0aWxlKCJjcHVpZCIKKyAgICAgICAgICAgIDogIj1hIiAoKmVheCksCisgICAgICAgICAgICAgICI9YiIgKCplYngpLAorICAgICAgICAgICAgICAiPWMiICgqZWN4KSwKKyAgICAgICAgICAgICAgIj1kIiAoKmVkeCkKKyAgICAgICAgICAgIDogIjAiICgqZWF4KSwgIjIiICgqZWN4KQorICAgICAgICAgICAgOiAibWVtb3J5Iik7Cit9CisvKgorICogR2VuZXJpYyBDUFVJRCBmdW5jdGlvbgorICogY2xlYXIgJWVjeCBzaW5jZSBzb21lIGNwdXMgKEN5cml4IE1JSSkgZG8gbm90IHNldCBvciBjbGVhciAlZWN4CisgKiByZXN1bHRpbmcgaW4gc3RhbGUgcmVnaXN0ZXIgY29udGVudHMgYmVpbmcgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVpZCh1aW50MzJfdCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZWF4LCB1aW50MzJfdCAqZWJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplY3gsIHVpbnQzMl90ICplZHgpCit7CisgICAgICAgICplYXggPSBvcDsKKyAgICAgICAgKmVjeCA9IDA7CisgICAgICAgIG5hdGl2ZV9jcHVpZChlYXgsIGVieCwgZWN4LCBlZHgpOworfQorCisvKgorICogQ1BVSUQgZnVuY3Rpb25zIHJldHVybmluZyBhIHNpbmdsZSBkYXR1bQorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNwdWlkX2VheCh1aW50MzJfdCBvcCkKK3sKKyAgICAgICAgdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4OworCisgICAgICAgIGNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworICAgICAgICByZXR1cm4gZWF4OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNwdWlkX2VieCh1aW50MzJfdCBvcCkKK3sKKyAgICAgICAgdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4OworCisgICAgICAgIGNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworICAgICAgICByZXR1cm4gZWJ4OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNwdWlkX2VjeCh1aW50MzJfdCBvcCkKK3sKKyAgICAgICAgdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4OworCisgICAgICAgIGNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworICAgICAgICByZXR1cm4gZWN4OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNwdWlkX2VkeCh1aW50MzJfdCBvcCkKK3sKKyAgICAgICAgdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4OworCisgICAgICAgIGNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworICAgICAgICByZXR1cm4gZWR4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1aWRfY291bnQodWludDMyX3Qgb3AsIHVpbnQzMl90IGNudCwKKwkJCSAgICAgICB1aW50MzJfdCAqIGVheCwgdWludDMyX3QgKiBlYngsCisJCQkgICAgICAgdWludDMyX3QgKiBlY3gsIHVpbnQzMl90ICogZWR4KQoreworICAgIGFzbSB2b2xhdGlsZSgibW92bCAlJWVieCwlMSA7ICIKKwkJICJjcHVpZCA7ICIKKwkJICJ4Y2hnbCAlMSwlJWVieCIKKwkJIDogIj1hIiAoKmVheCksICI9U0QiICgqZWJ4KSwgIj1jIiAoKmVjeCksICI9ZCIgKCplZHgpCisJCSA6ICJhIihvcCksICJjIihjbnQpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCByZG1zcih1aW50MzJfdCBtc3IpCit7CisgICAgdWludDY0X3QgdjsKKworICAgIGFzbSB2b2xhdGlsZSgicmRtc3IiIDogIj1BIiAodikgOiAiYyIobXNyKSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cm1zcih1aW50NjRfdCB2LCB1aW50MzJfdCBtc3IpCit7CisgICAgYXNtIHZvbGF0aWxlKCJ3cm1zciIgOiA6ICJBIiAodiksICJjIiAobXNyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcmVsYXgodm9pZCkKK3sKKyAgICBhc20gdm9sYXRpbGUoInJlcCA7IG5vcCIgOiA6IDogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGx0KHZvaWQpCit7CisgICAgYXNtIHZvbGF0aWxlKCJobHQiIDogOiA6ICJtZW1vcnkiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsaSh2b2lkKQoreworICAgIGFzbSB2b2xhdGlsZSgiY2xpIiA6IDogOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGkodm9pZCkKK3sKKyAgICBhc20gdm9sYXRpbGUoInN0aSIgOiA6IDogIm1lbW9yeSIpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5cy94ODZfNjQvbW9kdWxlLmggYi9jb20zMi9pbmNsdWRlL3N5cy94ODZfNjQvbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzYTZjZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzL3g4Nl82NC9tb2R1bGUuaApAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIHN5c2xpbnV4L21vZHVsZS5oCisgKgorICogRHluYW1pYyBFTEY2NCBtb2R1bGVzIGRlZmluaXRpb25zIGFuZCBzZXJ2aWNlcy4KKyAqLworCisjaWZuZGVmIF9YODZfNjRfTU9EVUxFX0hfCisjZGVmaW5lIF9YODZfNjRfTU9EVUxFX0hfCisKKyNpbmNsdWRlIDxlbGYuaD4KKworLyoKKyAqIEFjY2VwdGVkIHZhbHVlcyBmb3IgdmFyaW91cyBFTEYgaGVhZGVyIHBhcmFtZXRlcnMgZm91bmQgaW4gYW4gRUxGIGR5bmFtaWMKKyAqIG9iamVjdC4KKyAqLworI2RlZmluZSBNT0RVTEVfRUxGX0NMQVNTCQlFTEZDTEFTUzY0CQkvLyA2NC1iaXQgbW9kdWxlcworI2RlZmluZSBNT0RVTEVfRUxGX0NMQVNTX1NJWkUJCTY0CQkJLy8gU2l6ZSBvZiBhIHdvcmQgdmFsdWUKKyNkZWZpbmUgTU9EVUxFX0VMRl9EQVRBCQkJRUxGREFUQTJMU0IJCS8vIFdvcmQgZW5kaWFuZXNzCisjZGVmaW5lIE1PRFVMRV9FTEZfVkVSU0lPTgkJRVZfQ1VSUkVOVAkJLy8gT2JqZWN0IHZlcnNpb24KKyNkZWZpbmUgTU9EVUxFX0VMRl9UWVBFCQkJRVRfRFlOCQkJLy8gRXhlY3V0YWJsZSB0eXBlIChzaGFyZWQgb2JqZWN0IC0gLnNvKQorI2RlZmluZSBNT0RVTEVfRUxGX01BQ0hJTkUJCUVNX1g4Nl82NAkJLy8gVGFyZ2V0IGFyY2hpdGVjdHVyZQorCisjZGVmaW5lIEVMRl9NT0RfU1lTCQkiNjQgYml0IgorCit0eXBlZGVmIEVsZjY0X0FkZHIJCUVsZl9BZGRyOwordHlwZWRlZiBFbGY2NF9EeW4JCUVsZl9EeW47Cit0eXBlZGVmIEVsZjY0X1dvcmQJCUVsZl9Xb3JkOwordHlwZWRlZiBFbGY2NF9PZmYJCUVsZl9PZmY7Cit0eXBlZGVmIEVsZjY0X1N5bQkJRWxmX1N5bTsKK3R5cGVkZWYgRWxmNjRfRWhkcgkJRWxmX0VoZHI7Cit0eXBlZGVmIEVsZjY0X1BoZHIJCUVsZl9QaGRyOwordHlwZWRlZiBFbGY2NF9SZWwJCUVsZl9SZWw7Cit0eXBlZGVmIEVsZjY0X1h3b3JkCQlFbGZfQndvcmQ7CisKKyNlbmRpZiAvLyBfWDg2XzY0X01PRFVMRV9IXwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9hZHYuaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvYWR2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkMzZiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvYWR2LmgKQEAgLTAsMCArMSw1NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4L2Fkdi5oCisgKi8KKworI2lmbmRlZiBfU1lTTElOVVhfQURWX0gKKyNkZWZpbmUgX1NZU0xJTlVYX0FEVl9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9hZHZjb25zdC5oPgorCitfX2V4dGVybiB2b2lkICpfX3N5c2xpbnV4X2Fkdl9wdHI7CitfX2V4dGVybiBzaXplX3QgX19zeXNsaW51eF9hZHZfc2l6ZTsKKworc3RhdGljIGlubGluZSB2b2lkICpzeXNsaW51eF9hZHZfcHRyKHZvaWQpCit7CisgICAgcmV0dXJuIF9fc3lzbGludXhfYWR2X3B0cjsKK30KKworc3RhdGljIGlubGluZSBzaXplX3Qgc3lzbGludXhfYWR2X3NpemUodm9pZCkKK3sKKyAgICByZXR1cm4gX19zeXNsaW51eF9hZHZfc2l6ZTsKK30KKworX19leHRlcm4gaW50IHN5c2xpbnV4X2Fkdl93cml0ZSh2b2lkKTsKKworX19leHRlcm4gaW50IHN5c2xpbnV4X3NldGFkdihpbnQsIHNpemVfdCwgY29uc3Qgdm9pZCAqKTsKK19fZXh0ZXJuIGNvbnN0IHZvaWQgKnN5c2xpbnV4X2dldGFkdihpbnQsIHNpemVfdCAqKTsKKworI2VuZGlmIC8qIF9TWVNMSU5VWF9BRFZfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9hZHZjb25zdC5oIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9hZHZjb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Yzc3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2FkdmNvbnN0LmgKQEAgLTAsMCArMSw0NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4L2FkdmNvbnN0LmgKKyAqCisgKiBBRFYgZGVmaW5lZCBjb25zdGFudHMKKyAqCisgKiBEZWZpbmVkIGluIGEgc2VwYXJhdGUgZmlsZSBzbyBpdCBjYW4gYmUgdXNlZCBieSBub24tQ09NMzIgY29kZS4KKyAqIFNvbWUgb2YgdGhlc2UgY29uc3RhbnRzIGFyZSBhbHNvIGRlZmluZWQgaW4gYWR2LmluYywgdGhleSBiZXR0ZXIgbWF0Y2guLi4KKyAqLworCisjaWZuZGVmIF9TWVNMSU5VWF9BRFZDT05TVF9ICisjZGVmaW5lIF9TWVNMSU5VWF9BRFZDT05TVF9ICisKKyNkZWZpbmUgQURWX0VORAkJMAorI2RlZmluZSBBRFZfQk9PVE9OQ0UJMQorI2RlZmluZSBBRFZfTUVOVVNBVkUJMgorCisjZW5kaWYgLyogX1NZU0xJTlVYX0FEVkNPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvYWxpZ24uaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvYWxpZ24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRmOTdmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9hbGlnbi5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfU1lTTElOVVhfQUxJR05fSAorI2RlZmluZSBfU1lTTElOVVhfQUxJR05fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0YXRpYyBpbmxpbmUgdWludHB0cl90IF9fYWxpZ25fZG93bih1aW50cHRyX3QgX19wLCB1aW50cHRyX3QgX19hKQoreworICAgIHJldHVybiBfX3AgJiB+KF9fYSAtIDEpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnRwdHJfdCBfX2FsaWduX3VwKHVpbnRwdHJfdCBfX3AsIHVpbnRwdHJfdCBfX2EpCit7CisgICAgcmV0dXJuIChfX3AgKyBfX2EgLSAxKSAmIH4oX19hIC0gMSk7Cit9CisKKyNkZWZpbmUgQUxJR05fVVAocCxhKSAoKF9fdHlwZW9mX18ocCkpX19hbGlnbl91cCgodWludHB0cl90KShwKSwgKGEpKSkKKyNkZWZpbmUgQUxJR05fRE9XTihwLGEpICgoX190eXBlb2ZfXyhwKSlfX2FsaWduX2Rvd24oKHVpbnRwdHJfdCkocCksIChhKSkpCisjZGVmaW5lIEFMSUdOX1VQX0ZPUihwLHQpIEFMSUdOX1VQKHAsc2l6ZW9mKHQpKQorI2RlZmluZSBBTElHTl9ET1dOX0ZPUihwLHQpIEFMSUdOX0RPV04ocCxzaXplb2YodCkpCisKKyNlbmRpZiAvKiBfU1lTTElOVVhfQUxJR05fSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9ib290LmggYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2Jvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDc5ZTdjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9ib290LmgKQEAgLTAsMCArMSw3NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4L2Jvb3QuaAorICoKKyAqIFNZU0xJTlVYIGJvb3QgQVBJIGludm9jYXRpb24KKyAqLworCisjaWZuZGVmIF9TWVNMSU5VWF9CT09UX0gKKyNkZWZpbmUgX1NZU0xJTlVYX0JPT1RfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworaW50IHN5c2xpbnV4X3J1bl9jb21tYW5kKGNvbnN0IGNoYXIgKik7CitfX25vcmV0dXJuIHN5c2xpbnV4X3J1bl9kZWZhdWx0KHZvaWQpOworCit2b2lkIHN5c2xpbnV4X2xvY2FsX2Jvb3QoaW50MTZfdCBmbGFncyk7CisKK3ZvaWQgc3lzbGludXhfZmluYWxfY2xlYW51cCh1aW50MTZfdCBmbGFncyk7CisKK3ZvaWQgc3lzbGludXhfY2hhaW5fYm9vdHN0cmFwKHVpbnQxNl90IGZsYWdzLCBjb25zdCB2b2lkICpib290c3RyYXAsCisJCQkgICAgICB1aW50MzJfdCBib290c3RyYXBfbGVuLCB1aW50MzJfdCBlZHgsCisJCQkgICAgICB1aW50MzJfdCBlc2ksIHVpbnQxNl90IGRzKTsKKwordm9pZCBiaW9zX2RvX3NodWZmbGVfYW5kX2Jvb3QodWludDE2X3QgYm9vdGZsYWdzLCB1aW50MzJfdCBkZXNjYWRkciwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmRlc2NidWYsIHVpbnQzMl90IGRzaXplKTsKKworc3RydWN0IGltYWdlX3R5cGVzIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHVpbnQzMl90IHR5cGU7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IGltYWdlX3R5cGVzIGltYWdlX2Jvb3RfdHlwZXNbXTsKKworI2RlZmluZSBJTUFHRV9UWVBFX0tFUk5FTAkwCisjZGVmaW5lIElNQUdFX1RZUEVfTElOVVgJMQorI2RlZmluZSBJTUFHRV9UWVBFX0JPT1QJCTIKKyNkZWZpbmUgSU1BR0VfVFlQRV9CU1MJCTMKKyNkZWZpbmUgSU1BR0VfVFlQRV9QWEUJCTQKKyNkZWZpbmUgSU1BR0VfVFlQRV9GRElNQUdFCTUKKyNkZWZpbmUgSU1BR0VfVFlQRV9DT00zMgk3CisjZGVmaW5lIElNQUdFX1RZUEVfQ09ORklHCTgKKyNkZWZpbmUgSU1BR0VfVFlQRV9MT0NBTEJPT1QJOQorCit1aW50MzJfdCBwYXJzZV9pbWFnZV90eXBlKGNvbnN0IGNoYXIgKmNtZGxpbmUpOwordm9pZCBzeXNsaW51eF9ydW5fa2VybmVsX2ltYWdlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpjbWRsaW5lLAorCQkJICAgICAgIHVpbnQzMl90IGlwYXBwZW5kX2ZsYWdzLCB1aW50MzJfdCB0eXBlKTsKKworI2VuZGlmIC8qIF9TWVNMSU5VWF9CT09UX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvYm9vdHBtLmggYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2Jvb3RwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Y2EyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2Jvb3RwbS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC9ib290cG0uaAorICoKKyAqIERhdGEgc3RydWN0dXJlcyBmb3Igc2h1ZmZsZSBhbmQgYm9vdCB0byBwcm90ZWN0ZWQgbW9kZQorICovCisKKyNpZm5kZWYgX1NZU0xJTlVYX0JPT1RQTV9ICisjZGVmaW5lIF9TWVNMSU5VWF9CT09UUE1fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvbW92ZWJpdHMuaD4KKworc3RydWN0IHN5c2xpbnV4X3BtX3JlZ3MgeworICAgIHVpbnQzMl90IGVheDsJCS8qIE9mZnNldCAgMCAqLworICAgIHVpbnQzMl90IGVjeDsJCS8qIE9mZnNldCAgNCAqLworICAgIHVpbnQzMl90IGVkeDsJCS8qIE9mZnNldCAgOCAqLworICAgIHVpbnQzMl90IGVieDsJCS8qIE9mZnNldCAxMiAqLworICAgIHVpbnQzMl90IGVzcDsJCS8qIE9mZnNldCAxNiAqLworICAgIHVpbnQzMl90IGVicDsJCS8qIE9mZnNldCAyMCAqLworICAgIHVpbnQzMl90IGVzaTsJCS8qIE9mZnNldCAyNCAqLworICAgIHVpbnQzMl90IGVkaTsJCS8qIE9mZnNldCAyOCAqLworCisgICAgdWludDMyX3QgZWlwOwkJLyogT2Zmc2V0IDMyICovCit9OworCitpbnQgc3lzbGludXhfc2h1ZmZsZV9ib290X3BtKHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqZnJhZ2xpc3QsCisJCQkgICAgIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKm1lbW1hcCwKKwkJCSAgICAgdWludDE2X3QgYm9vdGZsYWdzLCBzdHJ1Y3Qgc3lzbGludXhfcG1fcmVncyAqcmVncyk7CisKKyNlbmRpZiAvKiBfU1lTTElOVVhfQk9PVFBNX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvYm9vdHJtLmggYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2Jvb3RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDc0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2Jvb3RybS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC9ib290cm0uaAorICoKKyAqIERhdGEgc3RydWN0dXJlcyBmb3Igc2h1ZmZsZSBhbmQgYm9vdCB0byBwcm90ZWN0ZWQgbW9kZQorICovCisKKyNpZm5kZWYgX1NZU0xJTlVYX0JPT1RSTV9ICisjZGVmaW5lIF9TWVNMSU5VWF9CT09UUk1fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbW92ZWJpdHMuaD4KKworLyogVGhpcyByZWdpc3RlciBzZXQgaXMgdXNlZCBieSB0aGUgc2h1ZmZsZSBhbmQgYm9vdCBpbnRlcmZhY2UuICBJdCBpcworICAgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzdHJ1Y3R1cmUgZnJvbSB3aGF0IHRoZSBfX2ludGNhbGwoKSBhbmQKKyAgIF9fZmFyY2FsbCgpIGludGVyZmFjZXMgdXNlISAqLworc3RydWN0IHN5c2xpbnV4X3JtX3JlZ3MgeworICAgIHVpbnQxNl90IGVzOwkJLyogT2Zmc2V0ICAwICovCisgICAgdWludDE2X3QgX3VudXNlZF9jczsJLyogT2Zmc2V0ICAyICovCisgICAgdWludDE2X3Qgc3M7CQkvKiBPZmZzZXQgIDQgKi8KKyAgICB1aW50MTZfdCBkczsJCS8qIE9mZnNldCAgNiAqLworICAgIHVpbnQxNl90IGZzOwkJLyogT2Zmc2V0ICA4ICovCisgICAgdWludDE2X3QgZ3M7CQkvKiBPZmZzZXQgMTAgKi8KKworICAgIHJlZzMyX3QgZWF4OwkJLyogT2Zmc2V0IDEyICovCisgICAgcmVnMzJfdCBlY3g7CQkvKiBPZmZzZXQgMTYgKi8KKyAgICByZWczMl90IGVkeDsJCS8qIE9mZnNldCAyMCAqLworICAgIHJlZzMyX3QgZWJ4OwkJLyogT2Zmc2V0IDI0ICovCisgICAgcmVnMzJfdCBlc3A7CQkvKiBPZmZzZXQgMjggKi8KKyAgICByZWczMl90IGVicDsJCS8qIE9mZnNldCAzMiAqLworICAgIHJlZzMyX3QgZXNpOwkJLyogT2Zmc2V0IDM2ICovCisgICAgcmVnMzJfdCBlZGk7CQkvKiBPZmZzZXQgNDAgKi8KKworICAgIHVpbnQxNl90IGlwOwkJLyogT2Zmc2V0IDQ0ICovCisgICAgdWludDE2X3QgY3M7CQkvKiBPZmZzZXQgNDYgKi8KKworICAgIGJvb2wgc3RpOwkJCS8qIE9mZnNldCA0OCAqLworfTsKKworaW50IHN5c2xpbnV4X3NodWZmbGVfYm9vdF9ybShzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKmZyYWdsaXN0LAorCQkJICAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptZW1tYXAsCisJCQkgICAgIHVpbnQxNl90IGJvb3RmbGFncywgc3RydWN0IHN5c2xpbnV4X3JtX3JlZ3MgKnJlZ3MpOworCisjZW5kaWYgLyogX1NZU0xJTlVYX0JPT1RSTV9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2NvbmZpZy5oIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzFkN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9jb25maWcuaApAQCAtMCwwICsxLDE5MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4L2NvbmZpZy5oCisgKgorICogUXVlcnkgc3lzbGludXggY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworCisjaWZuZGVmIF9TWVNMSU5VWF9DT05GSUdfSAorI2RlZmluZSBfU1lTTElOVVhfQ09ORklHX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisKK2VudW0gc3lzbGludXhfZmlsZXN5c3RlbSB7CisgICAgU1lTTElOVVhfRlNfVU5LTk9XTiAgPSAweDMwLAorICAgIFNZU0xJTlVYX0ZTX1NZU0xJTlVYID0gMHgzMSwKKyAgICBTWVNMSU5VWF9GU19QWEVMSU5VWCA9IDB4MzIsCisgICAgU1lTTElOVVhfRlNfSVNPTElOVVggPSAweDMzLAorICAgIFNZU0xJTlVYX0ZTX0VYVExJTlVYID0gMHgzNCwKK307CisKK3N0cnVjdCBzeXNsaW51eF92ZXJzaW9uIHsKKyAgICB1aW50MTZfdCB2ZXJzaW9uOwkJLyogKG1ham9yIDw8IDgpK21pbm9yICovCisgICAgdWludDE2X3QgbWF4X2FwaTsKKyAgICBlbnVtIHN5c2xpbnV4X2ZpbGVzeXN0ZW0gZmlsZXN5c3RlbTsKKyAgICBjb25zdCBjaGFyICp2ZXJzaW9uX3N0cmluZzsKKyAgICBjb25zdCBjaGFyICpjb3B5cmlnaHRfc3RyaW5nOworfTsKKworc3RydWN0IHN5c2xpbnV4X2lwaW5mbyB7CisgICAgdWludDMyX3QgaXB2ZXI7CisgICAgdWludDMyX3QgbXlpcDsKKyAgICB1aW50MzJfdCBzZXJ2ZXJpcDsKKyAgICB1aW50MzJfdCBnYXRld2F5OworICAgIHVpbnQzMl90IG5ldG1hc2s7Cit9OworCitleHRlcm4gX19ub2NvbW1vbiBzdHJ1Y3Qgc3lzbGludXhfdmVyc2lvbiBfX3N5c2xpbnV4X3ZlcnNpb247CitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBzeXNsaW51eF92ZXJzaW9uICpzeXNsaW51eF92ZXJzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuICZfX3N5c2xpbnV4X3ZlcnNpb247Cit9CisKK3VuaW9uIHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbyB7CisgICAgc3RydWN0IHsKKwljb20zMnN5c190IHI7CisJY29uc3Qgdm9pZCAqZXNieDsKKwljb25zdCB2b2lkICpmc3NpOworCWNvbnN0IHZvaWQgKmdzZGk7CisgICAgfSBycjsJCQkvKiByZWFsIHJhdyAqLworICAgIHN0cnVjdCB7CisJdWludDE2X3QgX3BhZDFbNF07CisJdWludDMyX3QgX3BhZDJbN107CisJdWludDhfdCBmaWxlc3lzdGVtOworCXVpbnQ4X3QgYWg7CisJdWludDE2X3QgYXhoOworICAgIH0gYzsJCQkvKiBjb21tb24gKi8KKyAgICBzdHJ1Y3QgeworCXVpbnQxNl90IGdzOworCXVpbnQxNl90IGZzOworCXVpbnQxNl90IGVzOworCXVpbnQxNl90IGRzOworCXVpbnQxNl90IGRpLCBkaWg7CisJdWludDE2X3Qgc2ksIHNpaDsKKwl1aW50MTZfdCBicCwgYnBoOworCXVpbnQxNl90IHNwLCBzcGg7CisJdWludDE2X3QgYngsIGJ4aDsKKwl1aW50MTZfdCBkeCwgZHhoOworCXVpbnQxNl90IGN4LCBjeGg7CisJdWludDE2X3QgYXgsIGF4aDsKKwl1aW50MzJfdCBlZmxhZ3M7CisJY29uc3Qgdm9pZCAqZXNieDsKKwljb25zdCB2b2lkICpmc3NpOworCWNvbnN0IHZvaWQgKmdzZGk7CisgICAgfSByOwkJCS8qIHJhdyAqLworICAgIHN0cnVjdCB7CisJdWludDE2X3QgX2dzLCBfZnMsIF9lcywgX2RzOworCXVpbnQzMl90IF9lZGksIF9lc2ksIF9lYnAsIF9lc3AsIF9lYng7CisJdWludDhfdCBkcml2ZV9udW1iZXIsIGRoOworCXVpbnQxNl90IF9keGg7CisJdWludDhfdCBzZWN0b3Jfc2hpZnQsIGNoOworCXVpbnQxNl90IF9jeGg7CisJdWludDhfdCBmaWxlc3lzdGVtLCBhaDsKKwl1aW50MTZfdCBfYXhoOworCXVpbnQzMl90IF9lZmxhZ3M7CisJY29uc3Qgdm9pZCAqcHRhYl9wdHI7CisJY29uc3QgdWludDMyX3QgKmVzZGlfcHRyOworCWNvbnN0IHVpbnQ2NF90ICpwYXJ0b2Zmc2V0OworICAgIH0gZGlzazsJCQkvKiBzeXNsaW51eC9leHRsaW51eCAqLworICAgIHN0cnVjdCB7CisJdWludDE2X3QgX2dzLCBzdGFja19zZWcsIHB4ZW52X3NlZywgX2RzOworCXVpbnQzMl90IF9lZGksIHN0YWNrX29mZnMsIF9lYnAsIF9lc3AsIHB4ZW52X29mZnM7CisJdWludDE2X3QgYXBpdmVyOworCXVpbnQxNl90IF9keGg7CisJdWludDMyX3QgbXlpcDsKKwl1aW50OF90IGZpbGVzeXN0ZW0sIGFoOworCXVpbnQxNl90IF9heGg7CisJdWludDMyX3QgX2VmbGFnczsKKwljb25zdCB2b2lkICpweGVudnB0cjsKKwljb25zdCB2b2lkICpzdGFjazsKKwljb25zdCBzdHJ1Y3Qgc3lzbGludXhfaXBpbmZvICppcGluZm87CisgICAgfSBweGU7CQkJLyogcHhlbGludXggKi8KKyAgICBzdHJ1Y3QgeworCXVpbnQxNl90IF9ncywgX2ZzLCBfZXMsIF9kczsKKwl1aW50MzJfdCBfZWRpLCBfZXNpLCBfZWJwLCBfZXNwLCBfZWJ4OworCXVpbnQ4X3QgZHJpdmVfbnVtYmVyLCBkaDsKKwl1aW50MTZfdCBfZHhoOworCXVpbnQ4X3Qgc2VjdG9yX3NoaWZ0LCBjZF9tb2RlOworCXVpbnQxNl90IF9jeGg7CisJdWludDhfdCBmaWxlc3lzdGVtLCBhaDsKKwl1aW50MTZfdCBfYXhoOworCXVpbnQzMl90IF9lZmxhZ3M7CisJY29uc3Qgdm9pZCAqc3BlY19wYWNrZXQ7CisJY29uc3QgdWludDMyX3QgKmVzZGlfcHRyOworCWNvbnN0IHVpbnQ2NF90ICpwYXJ0b2Zmc2V0OworICAgIH0gaXNvOwkJCS8qIGlzb2xpbnV4ICovCit9OworCitleHRlcm4gX19ub2NvbW1vbiB1bmlvbiBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8gX19zeXNsaW51eF9kZXJpdmF0aXZlX2luZm87CitzdGF0aWMgaW5saW5lIGNvbnN0IHVuaW9uIHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbworICAgICpzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8odm9pZCkKK3sKKyAgICByZXR1cm4gJl9fc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvOworfQorCitzdHJ1Y3Qgc3lzbGludXhfc2VyaWFsX2NvbnNvbGVfaW5mbyB7CisgICAgdWludDE2X3QgaW9iYXNlOworICAgIHVpbnQxNl90IGRpdmlzb3I7CisgICAgdWludDE2X3QgZmxvd2N0bDsKK307CisKK2V4dGVybiB2b2lkIF9fc3lzbGludXhfc2V0X3NlcmlhbF9jb25zb2xlX2luZm8odm9pZCk7CisKK2V4dGVybiBfX25vY29tbW9uIHN0cnVjdCBzeXNsaW51eF9zZXJpYWxfY29uc29sZV9pbmZvCisgICAgX19zeXNsaW51eF9zZXJpYWxfY29uc29sZV9pbmZvOworc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3Qgc3lzbGludXhfc2VyaWFsX2NvbnNvbGVfaW5mbworICAgICpzeXNsaW51eF9zZXJpYWxfY29uc29sZV9pbmZvKHZvaWQpCit7CisgICAgcmV0dXJuICZfX3N5c2xpbnV4X3NlcmlhbF9jb25zb2xlX2luZm87Cit9CisKK2V4dGVybiBjaGFyIENvbmZpZ05hbWVbXTsKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqc3lzbGludXhfY29uZmlnX2ZpbGUodm9pZCkKK3sKKyAgICByZXR1cm4gQ29uZmlnTmFtZTsKK30KKworc3RydWN0IHN5c2xpbnV4X2lwYXBwZW5kX3N0cmluZ3MgeworICAgIGludCBjb3VudDsKKyAgICBjb25zdCBjaGFyICpjb25zdCAqcHRyOworfTsKK2V4dGVybiBfX25vY29tbW9uIHN0cnVjdCBzeXNsaW51eF9pcGFwcGVuZF9zdHJpbmdzIF9fc3lzbGludXhfaXBhcHBlbmRfc3RyaW5nczsKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHN5c2xpbnV4X2lwYXBwZW5kX3N0cmluZ3MKKyAgICAqc3lzbGludXhfaXBhcHBlbmRfc3RyaW5ncyh2b2lkKQoreworICAgIHJldHVybiAmX19zeXNsaW51eF9pcGFwcGVuZF9zdHJpbmdzOworfQorCitzdGF0aWMgaW5saW5lIGVudW0gc3lzbGludXhfZmlsZXN5c3RlbSBzeXNsaW51eF9maWxlc3lzdGVtKHZvaWQpCit7CisgICAgcmV0dXJuIHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbygpLT5jLmZpbGVzeXN0ZW07Cit9CisKK2V4dGVybiB2b2lkIGdldF9kZXJpdmF0aXZlX2luZm8odW5pb24gc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvICpkaSk7CisKKyNlbmRpZiAvKiBfU1lTTElOVVhfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvZGVidWcuaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU2ZmRiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9kZWJ1Zy5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgREVCVUdfSAorI2RlZmluZSBERUJVR19ICisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpZmRlZiBEWU5BTUlDX0RFQlVHCisjZGVmaW5lIHN5c2xpbnV4X2RlYnVnX2VuYWJsZWQJX19zeXNsaW51eF9kZWJ1Z19lbmFibGVkKF9fZnVuY19fKQorZXh0ZXJuIGJvb2wgX19zeXNsaW51eF9kZWJ1Z19lbmFibGVkKGNvbnN0IGNoYXIgKmZ1bmMpOworI2Vsc2UKKyNkZWZpbmUgc3lzbGludXhfZGVidWdfZW5hYmxlZAkoMCkKKyNlbmRpZiAvKiBEWU5BTUlDX0RFQlVHICovCisKK2V4dGVybiBpbnQgc3lzbGludXhfZGVidWcoY29uc3QgY2hhciAqc3RyLCBib29sIGVuYWJsZSk7CisKKyNlbmRpZiAvKiBERUJVR19IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2Rpc2suaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvZGlzay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzYxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2Rpc2suaApAQCAtMCwwICsxLDE4NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICogICBDb3B5cmlnaHQgKEMpIDIwMTAgU2hhbyBNaWxsZXIKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBAZmlsZSBzeXNsaW51eC9kaXNrLmgKKyAqCisgKiBEZWFsIHdpdGggZGlza3MgYW5kIHBhcnRpdGlvbnMKKyAqLworCisjaWZuZGVmIF9TWVNMSU5VWF9ESVNLX0gKKyNkZWZpbmUgX1NZU0xJTlVYX0RJU0tfSAorCisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBTRUNUT1IgNTEydQkJLyogYnl0ZXMvc2VjdG9yICovCisKK2VudW0gZGlza19vcF9jb2RlcyB7CisgICAgRUJJT1NfUkVBRF9DT0RFID0gMHg0MiwgLyogRXh0ZW5kZWQgcmVhZCAqLworICAgIEVCSU9TX1dSSVRFX0NPREUgPSAweDQzLCAvKiBFeHRlbmRlZCB3cml0ZSAqLworICAgIENIU19SRUFEX0NPREUgPSAweDAyLAorICAgIENIU19XUklURV9DT0RFID0gMHgwMywKK307CisKK3N0cnVjdCBkaXNrX2luZm8geworICAgIGludCBkaXNrOworICAgIGludCBlYmlvczsJCQkvKiBFQklPUyBzdXBwb3J0ZWQgb24gdGhpcyBkaXNrICovCisgICAgaW50IGNiaW9zOwkJCS8qIENIUyBnZW9tZXRyeSBpcyB2YWxpZCAqLworICAgIHVpbnQzMl90IGJwczsJCS8qIGJ5dGVzIHBlciBzZWN0b3IgKi8KKyAgICB1aW50NjRfdCBsYmFjbnQ7CQkvKiB0b3RhbCBhbW91bnQgb2Ygc2VjdG9ycyAqLworICAgIHVpbnQzMl90IGN5bDsKKyAgICB1aW50MzJfdCBoZWFkOworICAgIHVpbnQzMl90IHNwdDsKK307CisKK3N0cnVjdCBkaXNrX2ViaW9zX2RhcGEgeworICAgIHVpbnQxNl90IGxlbjsKKyAgICB1aW50MTZfdCBjb3VudDsKKyAgICB1aW50MTZfdCBvZmY7CisgICAgdWludDE2X3Qgc2VnOworICAgIHVpbnQ2NF90IGxiYTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZGlza19lYmlvc19lcGFyYW0geworICAgIHVpbnQxNl90IGxlbjsKKyAgICB1aW50MTZfdCBpbmZvOworICAgIHVpbnQzMl90IGN5bDsKKyAgICB1aW50MzJfdCBoZWFkOworICAgIHVpbnQzMl90IHNwdDsKKyAgICB1aW50NjRfdCBsYmFjbnQ7CisgICAgdWludDE2X3QgYnBzOwkvKiBieXRlcyBwZXIgc2VjdG9yICovCisgICAgdWludDMyX3QgZWRkOworICAgIHVpbnQxNl90IGRwaV9zaWc7CisgICAgdWludDhfdCAgZHBpX2xlbjsKKyAgICBjaGFyICAgICByZXNlcnZlZDFbM107CisgICAgY2hhciAgICAgaG9zdGJ1c1s0XTsKKyAgICBjaGFyICAgICBpZl90eXBlWzhdOworICAgIGNoYXIgICAgIGlmX3BhdGhbOF07CisgICAgY2hhciAgICAgZGV2X3BhdGhbOF07CisgICAgY2hhciAgICAgcmVzZXJ2ZWQyOworICAgIHVpbnQ4X3QgIGNoZWNrc3VtOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogQ0hTIChjeWxpbmRlciwgaGVhZCwgc2VjdG9yKSB2YWx1ZSBleHRyYWN0aW9uIG1hY3Jvcy4KKyAqIFRha2VuIGZyb20gV2luVkJsb2NrLiAgTm9uZSBleHBhbmQgdG8gYW4gbHZhbHVlLgorKi8KKyNkZWZpbmUgICAgIGNoc19oZWFkKGNocykgY2hzWzBdCisjZGVmaW5lICAgY2hzX3NlY3RvcihjaHMpIChjaHNbMV0gJiAweDNGKQorI2RlZmluZSBjaHNfY3lsX2hpZ2goY2hzKSAoKCh1aW50MTZfdCkoY2hzWzFdICYgMHhDMCkpIDw8IDIpCisjZGVmaW5lICBjaHNfY3lsX2xvdyhjaHMpICgodWludDE2X3QpY2hzWzJdKQorI2RlZmluZSBjaHNfY3lsaW5kZXIoY2hzKSAoY2hzX2N5bF9oaWdoKGNocykgfCBjaHNfY3lsX2xvdyhjaHMpKQordHlwZWRlZiB1aW50OF90IGRpc2tfY2hzWzNdOworCisvKiBBIERPUyBwYXJ0aXRpb24gdGFibGUgZW50cnkgKi8KK3N0cnVjdCBkaXNrX2Rvc19wYXJ0X2VudHJ5IHsKKyAgICB1aW50OF90IGFjdGl2ZV9mbGFnOwkvKiAweDgwIGlmICJhY3RpdmUiICovCisgICAgZGlza19jaHMgc3RhcnQ7CisgICAgdWludDhfdCBvc3R5cGU7CisgICAgZGlza19jaHMgZW5kOworICAgIHVpbnQzMl90IHN0YXJ0X2xiYTsKKyAgICB1aW50MzJfdCBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQSBET1MgTUJSICovCitzdHJ1Y3QgZGlza19kb3NfbWJyIHsKKyAgICBjaGFyIGNvZGVbNDQwXTsKKyAgICB1aW50MzJfdCBkaXNrX3NpZzsKKyAgICBjaGFyIHBhZFsyXTsKKyAgICBzdHJ1Y3QgZGlza19kb3NfcGFydF9lbnRyeSB0YWJsZVs0XTsKKyAgICB1aW50MTZfdCBzaWc7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNkZWZpbmUgZGlza19tYnJfc2lnX21hZ2ljIDB4QUE1NQorCisvKioKKyAqIEEgR1BUIGRpc2svcGFydGl0aW9uIEdVSUQKKyAqCisgKiBCZSBjYXJlZnVsIHdpdGggZW5kaWFubmVzcywgeW91IG11c3QgYWRqdXN0IGl0IHlvdXJzZWxmCisgKiBpZmYgeW91IGFyZSBkaXJlY3RseSB1c2luZyB0aGUgZm91cnRoIGRhdGEgY2h1bmsuCisgKiBUaGVyZSBtaWdodCBiZSBhIGJldHRlciBoZWFkZXIgZm9yIHRoaXMuLi4KKyAqLworc3RydWN0IGd1aWQgeworICAgIHVpbnQzMl90IGRhdGExOworICAgIHVpbnQxNl90IGRhdGEyOworICAgIHVpbnQxNl90IGRhdGEzOworICAgIHVpbnQ2NF90IGRhdGE0OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEEgR1BUIHBhcnRpdGlvbiAqLworc3RydWN0IGRpc2tfZ3B0X3BhcnRfZW50cnkgeworICAgIHN0cnVjdCBndWlkIHR5cGU7CisgICAgc3RydWN0IGd1aWQgdWlkOworICAgIHVpbnQ2NF90IGxiYV9maXJzdDsKKyAgICB1aW50NjRfdCBsYmFfbGFzdDsKKyAgICB1aW50NjRfdCBhdHRyaWJzOworICAgIGNoYXIgbmFtZVs3Ml07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQSBHUFQgaGVhZGVyICovCitzdHJ1Y3QgZGlza19ncHRfaGVhZGVyIHsKKyAgICBjaGFyIHNpZ1s4XTsKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdWludDE2X3QgbWlub3I7CisJICAgIHVpbnQxNl90IG1ham9yOworCX0gZmllbGRzIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1aW50MzJfdCB1aW50MzI7CisJY2hhciByYXdbNF07CisgICAgfSByZXYgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgIHVpbnQzMl90IGhkcl9zaXplOworICAgIHVpbnQzMl90IGNoa3N1bTsKKyAgICBjaGFyIHJlc2VydmVkMVs0XTsKKyAgICB1aW50NjRfdCBsYmFfY3VyOworICAgIHVpbnQ2NF90IGxiYV9hbHQ7CisgICAgdWludDY0X3QgbGJhX2ZpcnN0X3VzYWJsZTsKKyAgICB1aW50NjRfdCBsYmFfbGFzdF91c2FibGU7CisgICAgc3RydWN0IGd1aWQgZGlza19ndWlkOworICAgIHVpbnQ2NF90IGxiYV90YWJsZTsKKyAgICB1aW50MzJfdCBwYXJ0X2NvdW50OworICAgIHVpbnQzMl90IHBhcnRfc2l6ZTsKKyAgICB1aW50MzJfdCB0YWJsZV9jaGtzdW07CisgICAgY2hhciByZXNlcnZlZDJbMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK3N0YXRpYyBjb25zdCBjaGFyIGRpc2tfZ3B0X3NpZ19tYWdpY1tdID0gIkVGSSBQQVJUIjsKKworZXh0ZXJuIGludCBkaXNrX2ludDEzX3JldHJ5KGNvbnN0IGNvbTMyc3lzX3QgKiBpbnJlZywgY29tMzJzeXNfdCAqIG91dHJlZyk7CitleHRlcm4gaW50IGRpc2tfZ2V0X3BhcmFtcyhpbnQgZGlzaywgc3RydWN0IGRpc2tfaW5mbyAqY29uc3QgZGlza2luZm8pOworZXh0ZXJuIHZvaWQgKmRpc2tfcmVhZF9zZWN0b3JzKGNvbnN0IHN0cnVjdCBkaXNrX2luZm8gKmNvbnN0IGRpc2tpbmZvLAorCQkJICAgICAgIHVpbnQ2NF90IGxiYSwgdWludDhfdCBjb3VudCk7CitleHRlcm4gaW50IGRpc2tfd3JpdGVfc2VjdG9ycyhjb25zdCBzdHJ1Y3QgZGlza19pbmZvICpjb25zdCBkaXNraW5mbywKKwkJCSAgICAgIHVpbnQ2NF90IGxiYSwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDhfdCBjb3VudCk7CitleHRlcm4gaW50IGRpc2tfd3JpdGVfdmVyaWZ5X3NlY3RvcnMoY29uc3Qgc3RydWN0IGRpc2tfaW5mbyAqY29uc3QgZGlza2luZm8sCisJCQkJICAgICB1aW50NjRfdCBsYmEsIGNvbnN0IHZvaWQgKmJ1ZiwgdWludDhfdCBjb3VudCk7CitleHRlcm4gdm9pZCBkaXNrX2Rvc19wYXJ0X2R1bXAoY29uc3Qgc3RydWN0IGRpc2tfZG9zX3BhcnRfZW50cnkgKmNvbnN0IHBhcnQpOworZXh0ZXJuIHZvaWQgZ3VpZF90b19zdHIoY2hhciAqYnVmLCBjb25zdCBzdHJ1Y3QgZ3VpZCAqY29uc3QgaWQpOworZXh0ZXJuIGludCBzdHJfdG9fZ3VpZChjb25zdCBjaGFyICpidWYsIHN0cnVjdCBndWlkICpjb25zdCBpZCk7CitleHRlcm4gdm9pZCBkaXNrX2dwdF9wYXJ0X2R1bXAoY29uc3Qgc3RydWN0IGRpc2tfZ3B0X3BhcnRfZW50cnkgKmNvbnN0CisJCQkgICAgICAgZ3B0X3BhcnQpOworZXh0ZXJuIHZvaWQgZGlza19ncHRfaGVhZGVyX2R1bXAoY29uc3Qgc3RydWN0IGRpc2tfZ3B0X2hlYWRlciAqY29uc3QgZ3B0KTsKKworI2VuZGlmIC8qIF9TWVNMSU5VWF9ESVNLX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvZmlybXdhcmUuaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTc4YWY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9maXJtd2FyZS5oCkBAIC0wLDAgKzEsNzIgQEAKKyNpZm5kZWYgX1NZU0xJTlVYX0ZJUk1XQVJFX0gKKyNkZWZpbmUgX1NZU0xJTlVYX0ZJUk1XQVJFX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitzdHJ1Y3QgdGVybV9zdGF0ZTsKKworc3RydWN0IG91dHB1dF9vcHMgeworCXZvaWQgKCplcmFzZSkgKGludCwgaW50LCBpbnQsIGludCwgdWludDhfdCk7CisJdm9pZCAoKndyaXRlX2NoYXIpICh1aW50OF90LCB1aW50OF90KTsKKwl2b2lkICgqc2hvd2N1cnNvcikgKGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICopOworCXZvaWQgKCpzY3JvbGxfdXApICh1aW50OF90LCB1aW50OF90LCB1aW50OF90KTsKKwl2b2lkICgqc2V0X2N1cnNvcikgKGludCwgaW50LCBib29sKTsKKwl2b2lkICgqYmVlcCkgKHZvaWQpOworCXZvaWQgKCpnZXRfbW9kZSkoaW50ICosIGludCAqKTsKKwl2b2lkICgqdGV4dF9tb2RlKSh2b2lkKTsKKwl2b2lkICgqZ2V0X2N1cnNvcikodWludDhfdCAqLCB1aW50OF90ICopOworfTsKKworc3RydWN0IGlucHV0X29wcyB7CisJY2hhciAoKmdldGNoYXIpKGNoYXIgKik7CisJaW50ICgqcG9sbGNoYXIpKHZvaWQpOworCXVpbnQ4X3QgKCpzaGlmdGZsYWdzKSh2b2lkKTsKK307CisKK3N0cnVjdCBhZHZfb3BzIHsKKwl2b2lkICgqaW5pdCkodm9pZCk7CisJaW50ICgqd3JpdGUpKHZvaWQpOworfTsKKworc3RydWN0IHZlc2FfaW5mbzsKK2VudW0gdmVzYV9waXhlbF9mb3JtYXQ7CitzdHJ1Y3Qgd2luX2luZm87CisKK3N0cnVjdCB2ZXNhX29wcyB7CisJaW50ICgqc2V0X21vZGUpKHN0cnVjdCB2ZXNhX2luZm8gKiwgaW50ICosIGludCAqLCBlbnVtIHZlc2FfcGl4ZWxfZm9ybWF0ICopOworCXZvaWQgKCpzY3JlZW5jcHkpKHNpemVfdCwgY29uc3QgdWludDMyX3QgKiwgc2l6ZV90LCBzdHJ1Y3Qgd2luX2luZm8gKik7CisJaW50ICgqZm9udF9xdWVyeSkodWludDhfdCAqKik7Cit9OworCitlbnVtIGhlYXA7CitzdHJ1Y3QgbWVtX29wcyB7CisJdm9pZCAqKCptYWxsb2MpKHNpemVfdCwgZW51bSBoZWFwLCBzaXplX3QpOworCXZvaWQgKigqcmVhbGxvYykodm9pZCAqLCBzaXplX3QpOworCXZvaWQgKCpmcmVlKSh2b2lkICopOworfTsKKworc3RydWN0IGluaXRyYW1mczsKK3N0cnVjdCBzZXR1cF9kYXRhOworCitzdHJ1Y3QgZmlybXdhcmUgeworCXZvaWQgKCppbml0KSh2b2lkKTsKKwl2b2lkICgqYWRqdXN0X3NjcmVlbikodm9pZCk7CisJdm9pZCAoKmNsZWFudXApKHZvaWQpOworCXN0cnVjdCBkaXNrICooKmRpc2tfaW5pdCkodm9pZCAqKTsKKwlzdHJ1Y3Qgb3V0cHV0X29wcyAqb19vcHM7CisJc3RydWN0IGlucHV0X29wcyAqaV9vcHM7CisJdm9pZCAoKmdldF9zZXJpYWxfY29uc29sZV9pbmZvKSh1aW50MTZfdCAqLCB1aW50MTZfdCAqLCB1aW50MTZfdCAqKTsKKwlzdHJ1Y3QgYWR2X29wcyAqYWR2X29wczsKKwlpbnQgKCpib290X2xpbnV4KSh2b2lkICosIHNpemVfdCwgc3RydWN0IGluaXRyYW1mcyAqLAorCQkJICBzdHJ1Y3Qgc2V0dXBfZGF0YSAqLCBjaGFyICopOworCXN0cnVjdCB2ZXNhX29wcyAqdmVzYTsKKwlzdHJ1Y3QgbWVtX29wcyAqbWVtOworfTsKKworZXh0ZXJuIHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmU7CisKK2V4dGVybiB2b2lkIHN5c2xpbnV4X3JlZ2lzdGVyX2Jpb3Modm9pZCk7CitleHRlcm4gdm9pZCBpbml0KHZvaWQpOworCisjZW5kaWYgLyogX1NZU0xJTlVYX0ZJUk1XQVJFX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvaWRsZS5oIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9pZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0NTIzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvaWRsZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA1LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC9pZGxlLmgKKyAqLworCisjaWZuZGVmIF9TWVNMSU5VWF9JRExFX0gKKyNkZWZpbmUgX1NZU0xJTlVYX0lETEVfSAorCit2b2lkIHN5c2xpbnV4X2lkbGUodm9pZCk7Cit2b2lkIHN5c2xpbnV4X3Jlc2V0X2lkbGUodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9pby5oIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTM3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2lvLmgKQEAgLTAsMCArMSwzOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4L2lvLmgKKyAqCisgKiBTWVNMSU5VWCBsb3ctbGV2ZWwgSS9PIGZ1bmN0aW9ucworICovCisKKyNpZm5kZWYgX1NZU0xJTlVYX0lPX0gKKyNkZWZpbmUgX1NZU0xJTlVYX0lPX0gKKworaW50IHN5c2xpbnV4X3JlYWRfZGlzayh2b2lkICpidWYsIHVpbnQzMl90IHNlY3RvciwgdWludDE2X3QgY291bnQpOworCisjZW5kaWYgLyogX1NZU0xJTlVYX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzbGludXgva2V5Ym9hcmQuaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgva2V5Ym9hcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTkyNWUzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9rZXlib2FyZC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC9rZXlib2FyZC5oCisgKgorICogUXVlcnkgc3lzbGludXgga2V5Ym9hcmQgbWFwLgorICovCisKKyNpZm5kZWYgX1NZU0xJTlVYX0tFWUJPQVJEX0gKKyNkZWZpbmUgX1NZU0xJTlVYX0tFWUJPQVJEX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdHJ1Y3Qgc3lzbGludXhfa2V5Ym9hcmRfbWFwIHsKKyAgICB1aW50MTZfdCB2ZXJzaW9uOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICB2b2lkICptYXA7Cit9OworCitleHRlcm4gc3RydWN0IHN5c2xpbnV4X2tleWJvYXJkX21hcCBfX3N5c2xpbnV4X2tleWJvYXJkX21hcDsKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHN5c2xpbnV4X2tleWJvYXJkX21hcCAqc3lzbGludXhfa2V5Ym9hcmRfbWFwKHZvaWQpCit7CisgICAgcmV0dXJuICZfX3N5c2xpbnV4X2tleWJvYXJkX21hcDsKK30KKworI2VuZGlmIC8qIF9TWVNMSU5VWF9LRVlCT0FSRF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2xpbnV4LmggYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2xpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwYWM5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvbGludXguaApAQCAtMCwwICsxLDIwNiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMTIgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4L2xpbnV4LmgKKyAqCisgKiBEZWZpbml0aW9ucyB1c2VkIHRvIGJvb3QgYSBMaW51eCBrZXJuZWwKKyAqLworCisjaWZuZGVmIF9TWVNMSU5VWF9MSU5VWF9ICisjZGVmaW5lIF9TWVNMSU5VWF9MSU5VWF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorCisvKiBBIGNodW5rIG9mIGFuIGluaXRyYW1mcy4gIFRoZXNlIGFyZSBrZXB0IGFzIGEgZG91Ymx5LWxpbmtlZAorICAgY2lyY3VsYXIgbGlzdCB3aXRoIGhlYWRub2RlOyB0aGUgaGVhZG5vZGUgaXMgZGlzdGluZ3Vpc2hlZCBieQorICAgaGF2aW5nIGxlbiA9PSAwLiAgVGhlIGRhdGEgcG9pbnRlciBjYW4gYmUgTlVMTCBpZiBkYXRhX2xlbiBpcyB6ZXJvOworICAgaWYgZGF0YV9sZW4gPCBsZW4gdGhlbiB0aGUgYmFsYW5jZSBvZiB0aGUgcmVnaW9uIGlzIHplcm9lZC4gKi8KKworc3RydWN0IGluaXRyYW1mcyB7CisgICAgc3RydWN0IGluaXRyYW1mcyAqcHJldiwgKm5leHQ7CisgICAgc2l6ZV90IGxlbjsKKyAgICBzaXplX3QgYWxpZ247CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3QgZGF0YV9sZW47Cit9OworI2RlZmluZSBJTklUUkFNRlNfTUFYX0FMSUdOCTQwOTYKKworc3RydWN0IHNldHVwX2RhdGFfaGVhZGVyIHsKKwl1aW50NjRfdCBuZXh0OworCXVpbnQzMl90IHR5cGU7CisJdWludDMyX3QgbGVuOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNldHVwX2RhdGEgeworICAgIHN0cnVjdCBzZXR1cF9kYXRhICpwcmV2LCAqbmV4dDsKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHN0cnVjdCBzZXR1cF9kYXRhX2hlYWRlciBoZHI7Cit9OworCisjZGVmaW5lIFNFVFVQX05PTkUJMAorI2RlZmluZSBTRVRVUF9FODIwX0VYVAkxCisjZGVmaW5lIFNFVFVQX0RUQgkyCisKKyNkZWZpbmUgWExGX0tFUk5FTF82NAkJCSgxIDw8IDApCisjZGVmaW5lIFhMRl9DQU5fQkVfTE9BREVEX0FCT1ZFXzRHCSgxIDw8IDEpCisjZGVmaW5lIFhMRl9FRklfSEFORE9WRVJfMzIJCSgxIDw8IDIpCisjZGVmaW5lIFhMRl9FRklfSEFORE9WRVJfNjQJCSgxIDw8IDMpCisKK3N0cnVjdCBsaW51eF9oZWFkZXIgeworICAgIHVpbnQ4X3QgYm9vdF9zZWN0b3JfMVsweDAwMjBdOworICAgIHVpbnQxNl90IG9sZF9jbWRfbGluZV9tYWdpYzsKKyAgICB1aW50MTZfdCBvbGRfY21kX2xpbmVfb2Zmc2V0OworICAgIHVpbnQ4X3QgYm9vdF9zZWN0b3JfMlsweDAxZjEgLSAweDAwMjRdOworICAgIHVpbnQ4X3Qgc2V0dXBfc2VjdHM7CisgICAgdWludDE2X3Qgcm9vdF9mbGFnczsKKyAgICB1aW50MzJfdCBzeXNzaXplOworICAgIHVpbnQxNl90IHJhbV9zaXplOworICAgIHVpbnQxNl90IHZpZF9tb2RlOworICAgIHVpbnQxNl90IHJvb3RfZGV2OworICAgIHVpbnQxNl90IGJvb3RfZmxhZzsKKyAgICB1aW50MTZfdCBqdW1wOworICAgIHVpbnQzMl90IGhlYWRlcjsKKyAgICB1aW50MTZfdCB2ZXJzaW9uOworICAgIHVpbnQzMl90IHJlYWxtb2RlX3N3dGNoOworICAgIHVpbnQxNl90IHN0YXJ0X3N5czsKKyAgICB1aW50MTZfdCBrZXJuZWxfdmVyc2lvbjsKKyAgICB1aW50OF90IHR5cGVfb2ZfbG9hZGVyOworICAgIHVpbnQ4X3QgbG9hZGZsYWdzOworICAgIHVpbnQxNl90IHNldHVwX21vdmVfc2l6ZTsKKyAgICB1aW50MzJfdCBjb2RlMzJfc3RhcnQ7CisgICAgdWludDMyX3QgcmFtZGlza19pbWFnZTsKKyAgICB1aW50MzJfdCByYW1kaXNrX3NpemU7CisgICAgdWludDMyX3QgYm9vdHNlY3Rfa2x1ZGdlOworICAgIHVpbnQxNl90IGhlYXBfZW5kX3B0cjsKKyAgICB1aW50MTZfdCBwYWQxOworICAgIHVpbnQzMl90IGNtZF9saW5lX3B0cjsKKyAgICB1aW50MzJfdCBpbml0cmRfYWRkcl9tYXg7CisgICAgdWludDMyX3Qga2VybmVsX2FsaWdubWVudDsKKyAgICB1aW50OF90IHJlbG9jYXRhYmxlX2tlcm5lbDsKKyAgICB1aW50OF90IG1pbl9hbGlnbm1lbnQ7CisgICAgdWludDE2X3QgeGxvYWRmbGFnczsKKyAgICB1aW50MzJfdCBjbWRsaW5lX21heF9sZW47CisgICAgdWludDMyX3QgaGFyZHdhcmVfc3ViYXJjaDsKKyAgICB1aW50NjRfdCBoYXJkd2FyZV9zdWJhcmNoX2RhdGE7CisgICAgdWludDMyX3QgcGF5bG9hZF9vZmZzZXQ7CisgICAgdWludDMyX3QgcGF5bG9hZF9sZW5ndGg7CisgICAgdWludDY0X3Qgc2V0dXBfZGF0YTsKKyAgICB1aW50NjRfdCBwcmVmX2FkZHJlc3M7CisgICAgdWludDMyX3QgaW5pdF9zaXplOworICAgIHVpbnQzMl90IGhhbmRvdmVyX29mZnNldDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzY3JlZW5faW5mbyB7CisJdWludDhfdCAgb3JpZ194OwkJLyogMHgwMCAqLworCXVpbnQ4X3QgIG9yaWdfeTsJCS8qIDB4MDEgKi8KKwl1aW50MTZfdCBleHRfbWVtX2s7CS8qIDB4MDIgKi8KKwl1aW50MTZfdCBvcmlnX3ZpZGVvX3BhZ2U7CS8qIDB4MDQgKi8KKwl1aW50OF90ICBvcmlnX3ZpZGVvX21vZGU7CS8qIDB4MDYgKi8KKwl1aW50OF90ICBvcmlnX3ZpZGVvX2NvbHM7CS8qIDB4MDcgKi8KKwl1aW50OF90ICBmbGFnczsJCS8qIDB4MDggKi8KKwl1aW50OF90ICB1bnVzZWQyOwkJLyogMHgwOSAqLworCXVpbnQxNl90IG9yaWdfdmlkZW9fZWdhX2J4Oy8qIDB4MGEgKi8KKwl1aW50MTZfdCB1bnVzZWQzOwkJLyogMHgwYyAqLworCXVpbnQ4X3QgIG9yaWdfdmlkZW9fbGluZXM7CS8qIDB4MGUgKi8KKwl1aW50OF90ICBvcmlnX3ZpZGVvX2lzVkdBOwkvKiAweDBmICovCisJdWludDE2X3Qgb3JpZ192aWRlb19wb2ludHM7LyogMHgxMCAqLworCisJLyogVkVTQSBncmFwaGljIG1vZGUgLS0gbGluZWFyIGZyYW1lIGJ1ZmZlciAqLworCXVpbnQxNl90IGxmYl93aWR0aDsJLyogMHgxMiAqLworCXVpbnQxNl90IGxmYl9oZWlnaHQ7CS8qIDB4MTQgKi8KKwl1aW50MTZfdCBsZmJfZGVwdGg7CS8qIDB4MTYgKi8KKwl1aW50MzJfdCBsZmJfYmFzZTsJCS8qIDB4MTggKi8KKwl1aW50MzJfdCBsZmJfc2l6ZTsJCS8qIDB4MWMgKi8KKwl1aW50MTZfdCBjbF9tYWdpYywgY2xfb2Zmc2V0OyAvKiAweDIwICovCisJdWludDE2X3QgbGZiX2xpbmVsZW5ndGg7CS8qIDB4MjQgKi8KKwl1aW50OF90ICByZWRfc2l6ZTsJCS8qIDB4MjYgKi8KKwl1aW50OF90ICByZWRfcG9zOwkJLyogMHgyNyAqLworCXVpbnQ4X3QgIGdyZWVuX3NpemU7CS8qIDB4MjggKi8KKwl1aW50OF90ICBncmVlbl9wb3M7CS8qIDB4MjkgKi8KKwl1aW50OF90ICBibHVlX3NpemU7CS8qIDB4MmEgKi8KKwl1aW50OF90ICBibHVlX3BvczsJCS8qIDB4MmIgKi8KKwl1aW50OF90ICByc3ZkX3NpemU7CS8qIDB4MmMgKi8KKwl1aW50OF90ICByc3ZkX3BvczsJCS8qIDB4MmQgKi8KKwl1aW50MTZfdCB2ZXNhcG1fc2VnOwkvKiAweDJlICovCisJdWludDE2X3QgdmVzYXBtX29mZjsJLyogMHgzMCAqLworCXVpbnQxNl90IHBhZ2VzOwkJLyogMHgzMiAqLworCXVpbnQxNl90IHZlc2FfYXR0cmlidXRlczsJLyogMHgzNCAqLworCXVpbnQzMl90IGNhcGFiaWxpdGllczsgICAgIC8qIDB4MzYgKi8KKwl1aW50OF90ICBfcmVzZXJ2ZWRbNl07CS8qIDB4M2EgKi8KK30gX19wYWNrZWQ7CisKK2ludCBzeXNsaW51eF9ib290X2xpbnV4KHZvaWQgKmtlcm5lbF9idWYsIHNpemVfdCBrZXJuZWxfc2l6ZSwKKwkJCXN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mcywKKwkJCXN0cnVjdCBzZXR1cF9kYXRhICpzZXR1cF9kYXRhLAorCQkJY2hhciAqY21kbGluZSk7CisKKy8qIEluaXRyYW1mcyBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCisKK3N0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mc19pbml0KHZvaWQpOworaW50IGluaXRyYW1mc19hZGRfZGF0YShzdHJ1Y3QgaW5pdHJhbWZzICppaGVhZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJICAgICAgIHNpemVfdCBkYXRhX2xlbiwgc2l6ZV90IGxlbiwgc2l6ZV90IGFsaWduKTsKK2ludCBpbml0cmFtZnNfbWtub2Qoc3RydWN0IGluaXRyYW1mcyAqaWhlYWQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkgICAgaW50IGRvX21rZGlyLAorCQkgICAgdWludDE2X3QgbW9kZSwgc2l6ZV90IGxlbiwgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yKTsKK2ludCBpbml0cmFtZnNfYWRkX2ZpbGUoc3RydWN0IGluaXRyYW1mcyAqaWhlYWQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgICBzaXplX3QgZGF0YV9sZW4sIHNpemVfdCBsZW4sCisJCSAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX21rZGlyLCB1aW50MzJfdCBtb2RlKTsKK2ludCBpbml0cmFtZnNfbG9hZF9maWxlKHN0cnVjdCBpbml0cmFtZnMgKmloZWFkLCBjb25zdCBjaGFyICpzcmNfZmlsZW5hbWUsCisJCQljb25zdCBjaGFyICpkc3RfZmlsZW5hbWUsIGludCBkb19ta2RpciwgdWludDMyX3QgbW9kZSk7CitpbnQgaW5pdHJhbWZzX2FkZF90cmFpbGVyKHN0cnVjdCBpbml0cmFtZnMgKmloZWFkKTsKK2ludCBpbml0cmFtZnNfbG9hZF9hcmNoaXZlKHN0cnVjdCBpbml0cmFtZnMgKmloZWFkLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKy8qIEdldCB0aGUgY29tYmluZWQgc2l6ZSBvZiB0aGUgaW5pdHJhbWZzICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGluaXRyYW1mc19zaXplKHN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mcykKK3sKKyAgICBzdHJ1Y3QgaW5pdHJhbWZzICppcDsKKyAgICB1aW50MzJfdCBzaXplID0gMDsKKworICAgIGlmICghaW5pdHJhbWZzKQorCXJldHVybiAwOworCisgICAgZm9yIChpcCA9IGluaXRyYW1mcy0+bmV4dDsgaXAtPmxlbjsgaXAgPSBpcC0+bmV4dCkgeworCXNpemUgPSAoc2l6ZSArIGlwLT5hbGlnbiAtIDEpICYgfihpcC0+YWxpZ24gLSAxKTsJLyogQWxpZ25tZW50ICovCisJc2l6ZSArPSBpcC0+bGVuOworICAgIH0KKworICAgIHJldHVybiBzaXplOworfQorCisvKiBTZXR1cCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KKworc3RydWN0IHNldHVwX2RhdGEgKnNldHVwX2RhdGFfaW5pdCh2b2lkKTsKK2ludCBzZXR1cF9kYXRhX2FkZChzdHJ1Y3Qgc2V0dXBfZGF0YSAqaGVhZCwgdWludDMyX3QgdHlwZSwKKwkJICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKTsKK2ludCBzZXR1cF9kYXRhX2xvYWQoc3RydWN0IHNldHVwX2RhdGEgKmhlYWQsIHVpbnQzMl90IHR5cGUsCisJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyNlbmRpZiAvKiBfU1lTTElOVVhfTElOVVhfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9sb2FkZmlsZS5oIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9sb2FkZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDRjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L2xvYWRmaWxlLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBMSUJVVElMX0xPQURGSUxFX0gKKyNkZWZpbmUgTElCVVRJTF9MT0FERklMRV9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBsb2FkZmlsZSgpIHJldHVybnMgdGhlIHRydWUgc2l6ZSBvZiB0aGUgZmlsZSwgYnV0IHdpbGwgZ3VhcmFudGVlIHZhbGlkLAorICAgemVyby1wYWRkZWQgbWVtb3J5IG91dCB0byB0aGlzIGJvdW5kYXJ5LiAqLworI2RlZmluZSBMT0FERklMRV9aRVJPX1BBRAk2NAorCitpbnQgbG9hZGZpbGUoY29uc3QgY2hhciAqLCB2b2lkICoqLCBzaXplX3QgKik7CitpbnQgemxvYWRmaWxlKGNvbnN0IGNoYXIgKiwgdm9pZCAqKiwgc2l6ZV90ICopOworaW50IGZsb2FkZmlsZShGSUxFICosIHZvaWQgKiosIHNpemVfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9tZW1zY2FuLmggYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L21lbXNjYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjc4ZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9tZW1zY2FuLmgKQEAgLTAsMCArMSw0NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfU1lTTElOVVhfTUVNU0NBTl9ICisjZGVmaW5lIF9TWVNMSU5VWF9NRU1TQ0FOX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgkvKiBhZGRyX3QgKi8KKwordHlwZWRlZiBpbnQgKCpzY2FuX21lbW9yeV9jYWxsYmFja190KSAodm9pZCAqLCBhZGRyX3QsIGFkZHJfdCwKKwkJCQkgICAgICAgZW51bSBzeXNsaW51eF9tZW1tYXBfdHlwZXMgdHlwZSk7CisKK3N0cnVjdCBzeXNsaW51eF9tZW1zY2FuIHsKKyAgICBpbnQgKCpmdW5jKShzY2FuX21lbW9yeV9jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICpkYXRhKTsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7Cit9OworCit2b2lkIHN5c2xpbnV4X21lbXNjYW5fYWRkKHN0cnVjdCBzeXNsaW51eF9tZW1zY2FuICplbnRyeSk7CitpbnQgc3lzbGludXhfbWVtc2Nhbl9uZXcoaW50ICgqZnVuYykoc2Nhbl9tZW1vcnlfY2FsbGJhY2tfdCBjYiwgdm9pZCAqZGF0YSkpOworaW50IHN5c2xpbnV4X3NjYW5fbWVtb3J5KHNjYW5fbWVtb3J5X2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpOworCisjZW5kaWYgLyogX1NZU0xJTlVYX01FTVNDQU5fSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9tb3ZlYml0cy5oIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9tb3ZlYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNGNlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L21vdmViaXRzLmgKQEAgLTAsMCArMSwxMTAgQEAKKyNpZm5kZWYgX1NZU0xJTlVYX01PVkVCSVRTX0gKKyNkZWZpbmUgX1NZU0xJTlVYX01PVkVCSVRTX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK3R5cGVkZWYgdWludDMyX3QgYWRkcl90OworCisvKgorICogQSBzeXNsaW51eF9tb3ZlbGlzdCBpcyBhIGxpbmtlZCBsaXN0IG9mIG1vdmUgb3BlcmF0aW9ucy4gIFRoZSBvcmRlcmluZworICogaXMgaW1wb3J0YW50LCBzbyBubyBzb3J0aW5nIHJlcXVpcmVtZW50IGNhbiBiZSBpbXBvc2VkLgorICovCitzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgeworICAgIGFkZHJfdCBkc3Q7CisgICAgYWRkcl90IHNyYzsKKyAgICBhZGRyX3QgbGVuOworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqbmV4dDsKK307CisKKy8qCisgKiBBIHN5c2xpbnV4X21lbW1hcCBpcyBhIHNvcnRlZCwgbGlua2VkIGxpc3Qgb2YgbWVtb3J5IHJlZ2lvbnMsCisgKiBndWFyYW50ZWVkIHRvIHNhdGlzZnkgdGhlIGNvbnN0cmFpbnQgdGhhdCBubyBhZGphY2VudCB6b25lcyBoYXZlCisgKiB0aGUgc2FtZSB0eXBlLiAgVW5kZWZpbmVkIG1lbW9yeSByYW5nZXMgYXJlIHJlcHJlc2VudGVkIHdpdGggZW50cmllczsKKyAqIHRoZXkgaGF2ZSB0eXBlIFNNVF9VTkRFRklORUQuCisgKgorICogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGxlbmd0aCBmaWVsZC4gIFRoZSBsZW5ndGggb2YgYSByZWdpb24gaXMgb2J0YWluZWQKKyAqIGJ5IGxvb2tpbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjaGFpbi4KKyAqLworZW51bSBzeXNsaW51eF9tZW1tYXBfdHlwZXMgeworICAgIFNNVF9FUlJPUiA9IC0yLAkJLyogSW50ZXJuYWwgZXJyb3IgdG9rZW4gKi8KKyAgICBTTVRfRU5EID0gLTEsCQkvKiBFbmQgb2YgbGlzdCAqLworICAgIFNNVF9VTkRFRklORUQgPSAwLAkJLyogVW5rbm93biByYW5nZSAqLworICAgIFNNVF9GUkVFID0gMSwJCS8qIEF2YWlsYWJsZSBtZW1vcnkgKi8KKyAgICBTTVRfUkVTRVJWRUQsCQkvKiBVbnVzYWJsZSBtZW1vcnkgKi8KKyAgICBTTVRfQUxMT0MsCQkJLyogTWVtb3J5IGFsbG9jYXRlZCBieSB1c2VyICovCisgICAgU01UX1pFUk8sCQkJLyogTWVtb3J5IHRoYXQgc2hvdWxkIGJlIHplcm9lZCAqLworICAgIFNNVF9URVJNSU5BTCwJCS8qIE1lbW9yeSB0byBiZSB1c2VkIGFzIGEgbGFzdCByZXNvcnQgKi8KK307CisKK3N0cnVjdCBzeXNsaW51eF9tZW1tYXAgeworICAgIGFkZHJfdCBzdGFydDsKKyAgICBlbnVtIHN5c2xpbnV4X21lbW1hcF90eXBlcyB0eXBlOworICAgIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKm5leHQ7Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wgdmFsaWRfdGVybWluYWxfdHlwZShlbnVtIHN5c2xpbnV4X21lbW1hcF90eXBlcyB0eXBlKQoreworICAgIHJldHVybiAodHlwZSA9PSBTTVRfRlJFRSkgfHwgKHR5cGUgPT0gU01UX1RFUk1JTkFMKTsKK30KKworLyoKKyAqIG1vdmVzIGlzIGNvbXB1dGVkIGZyb20gImZyYWdsaXN0IiBhbmQgIm1lbW1hcCIuICBBcmVhcyB0aGF0IGFyZQorICogdG8gYmUgemVyb2VkIHNob3VsZCBiZSBtYXJrZWQgYXMgc3VjaCBpbiB0aGUgbWVtbWFwLCBub3QgaW4gdGhlCisgKiBmcmFnbGlzdC4KKyAqLworCitpbnQgc3lzbGludXhfY29tcHV0ZV9tb3ZlbGlzdChzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKiptb3ZlbGlzdCwKKwkJCSAgICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqZnJhZ2xpc3QsCisJCQkgICAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptZW1tYXApOworCitzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICpzeXNsaW51eF9tZW1vcnlfbWFwKHZvaWQpOwordm9pZCBzeXNsaW51eF9mcmVlX21vdmVsaXN0KHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqKTsKK2ludCBzeXNsaW51eF9hZGRfbW92ZWxpc3Qoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICoqLAorCQkJICBhZGRyX3QgZHN0LCBhZGRyX3Qgc3JjLCBhZGRyX3QgbGVuKTsKK2ludCBzeXNsaW51eF9hbGxvY2F0ZV9mcm9tX2xpc3Qoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICoqZnJlZWxpc3QsCisJCQkJYWRkcl90IGRzdCwgYWRkcl90IGxlbik7CitpbnQgc3lzbGludXhfZG9fc2h1ZmZsZShzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKmZyYWdsaXN0LAorCQkJc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbWVtbWFwLAorCQkJYWRkcl90IGVudHJ5X3BvaW50LCBhZGRyX3QgZW50cnlfdHlwZSwKKwkJCXVpbnQxNl90IGJvb3RmbGFncyk7CitzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICpzeXNsaW51eF90YXJnZXRfbWVtbWFwKHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdAorCQkJCQkgICAgICAgKmZyYWdsaXN0LAorCQkJCQkgICAgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbWVtbWFwKTsKKworLyogT3BlcmF0b25zIG9uIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKi8KK3N0cnVjdCBzeXNsaW51eF9tZW1tYXAgKnN5c2xpbnV4X2luaXRfbWVtbWFwKHZvaWQpOworaW50IHN5c2xpbnV4X2FkZF9tZW1tYXAoc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqKmxpc3QsCisJCQlhZGRyX3Qgc3RhcnQsIGFkZHJfdCBsZW4sCisJCQllbnVtIHN5c2xpbnV4X21lbW1hcF90eXBlcyB0eXBlKTsKK2VudW0gc3lzbGludXhfbWVtbWFwX3R5cGVzIHN5c2xpbnV4X21lbW1hcF90eXBlKHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmxpc3QsCisJCQkJCQlhZGRyX3Qgc3RhcnQsIGFkZHJfdCBsZW4pOworaW50IHN5c2xpbnV4X21lbW1hcF9sYXJnZXN0KHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmxpc3QsCisJCQkgICAgZW51bSBzeXNsaW51eF9tZW1tYXBfdHlwZXMgdHlwZSwKKwkJCSAgICBhZGRyX3QgKiBzdGFydCwgYWRkcl90ICogbGVuKTsKK2ludCBzeXNsaW51eF9tZW1tYXBfaGlnaGVzdChjb25zdCBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICpsaXN0LAorCQkJICAgIGVudW0gc3lzbGludXhfbWVtbWFwX3R5cGVzIHR5cGVzLAorCQkJICAgIGFkZHJfdCAqc3RhcnQsIGFkZHJfdCBsZW4sCisJCQkgICAgYWRkcl90IGNlaWxpbmcsIGFkZHJfdCBhbGlnbik7Cit2b2lkIHN5c2xpbnV4X2ZyZWVfbWVtbWFwKHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmxpc3QpOworc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqc3lzbGludXhfZHVwX21lbW1hcChzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICpsaXN0KTsKK2ludCBzeXNsaW51eF9tZW1tYXBfZmluZF90eXBlKHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmxpc3QsCisJCQkgICAgICBlbnVtIHN5c2xpbnV4X21lbW1hcF90eXBlcyB0eXBlLAorCQkJICAgICAgYWRkcl90ICogc3RhcnQsIGFkZHJfdCAqIGxlbiwgYWRkcl90IGFsaWduKTsKK2ludCBzeXNsaW51eF9tZW1tYXBfZmluZChzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptbWFwLAorCQkJIGFkZHJfdCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkgYm9vbCByZWxvY2F0ZSwgc2l6ZV90IGFsaWduLAorCQkJIGFkZHJfdCBzdGFydF9taW4sIGFkZHJfdCBzdGFydF9tYXgsCisJCQkgYWRkcl90IGVuZF9taW4sIGFkZHJfdCBlbmRfbWF4KTsKKworLyogRGVidWdnaW5nIGZ1bmN0aW9ucyAqLworI2lmZGVmIERFQlVHCit2b2lkIHN5c2xpbnV4X2R1bXBfbW92ZWxpc3Qoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICptbCk7Cit2b2lkIHN5c2xpbnV4X2R1bXBfbWVtbWFwKHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKm1lbW1hcCk7CisjZWxzZQorI2RlZmluZSBzeXNsaW51eF9kdW1wX21vdmVsaXN0KHgpICgodm9pZCkwKQorI2RlZmluZSBzeXNsaW51eF9kdW1wX21lbW1hcCh4KQkgICgodm9pZCkwKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1lTTElOVVhfTU9WRUJJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9wbWFwaS5oIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9wbWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTJjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3BtYXBpLmgKQEAgLTAsMCArMSw4MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDItMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHBtYXBpLmgKKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIFN5c2xpbnV4IDQgcHJvdGVjdGVkLW1vZGUgQUJJCisgKi8KKworI2lmbmRlZiBfU1lTTElOVVhfUE1BUElfSAorI2RlZmluZSBfU1lTTElOVVhfUE1BUElfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworLyoKKyAqIE5vdGU6IGFkZCBuZXcgbWVtYmVycyB0byB0aGlzIHN0cnVjdHVyZSBvbmx5IGF0IHRoZSBlbmQuCisgKiBUaGUgcG9zaXRpb24gb2YgZWxlbWVudHMgaW4gdGhpcyBzdHJ1Y3R1cmUgaXMgYW4gQUJJLgorICovCitzdHJ1Y3QgX0RJUl87CitzdHJ1Y3QgZGlyZW50OworCitzdHJ1Y3QgY29tMzJfZmlsZWRhdGEgeworICAgIHNpemVfdCBzaXplOwkJLyogRmlsZSBzaXplICovCisgICAgaW50IGJsb2NrbGcyOwkJLyogbG9nMihibG9jayBzaXplKSAqLworICAgIHVpbnQxNl90IGhhbmRsZTsJCS8qIEZpbGUgaGFuZGxlICovCit9OworCitzdHJ1Y3QgY29tMzJfcG1hcGkgeworICAgIHNpemVfdCBfX3BtYXBpX3NpemU7CisKKyAgICB2b2lkICooKmxtYWxsb2MpKHNpemVfdCk7CisgICAgdm9pZCAoKmxmcmVlKSh2b2lkICopOworCisgICAgaW50ICgqb3Blbl9maWxlKShjb25zdCBjaGFyICosIGludCwgc3RydWN0IGNvbTMyX2ZpbGVkYXRhICopOworICAgIHNpemVfdCAoKnJlYWRfZmlsZSkodWludDE2X3QgKiwgdm9pZCAqLCBzaXplX3QpOworICAgIHZvaWQgKCpjbG9zZV9maWxlKSh1aW50MTZfdCk7CisKKyAgICBzdHJ1Y3QgX0RJUl8gKigqb3BlbmRpcikoY29uc3QgY2hhciAqKTsKKyAgICBzdHJ1Y3QgZGlyZW50ICooKnJlYWRkaXIpKHN0cnVjdCBfRElSXyAqKTsKKyAgICBpbnQgKCpjbG9zZWRpcikoc3RydWN0IF9ESVJfICopOworCisgICAgdm9pZCAoKmlkbGUpKHZvaWQpOworICAgIHZvaWQgKCpyZXNldF9pZGxlKSh2b2lkKTsKKworICAgIGludCAoKmNoZGlyKShjb25zdCBjaGFyICopOworICAgIGNoYXIgKigqZ2V0Y3dkKShjaGFyICosIHNpemVfdCk7CisKKyAgICAvKiBTaG91bGQgYmUgImNvbnN0IHZvbGF0aWxlIiwgYnV0IGdjYyBtaXNjb21waWxlcyB0aGF0IHNvbWV0aW1lcyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90ICpqaWZmaWVzOworICAgIHZvbGF0aWxlIHVpbnQzMl90ICptc190aW1lcjsKKworICAgIGNvbnN0IGludCBzeXNhcHBlbmRfY291bnQ7CisgICAgY29uc3QgY2hhciAqIGNvbnN0ICpzeXNhcHBlbmRfc3RyaW5nczsKK307CisKKyNlbmRpZiAvKiBfU1lTTElOVVhfUE1BUElfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9weGUuaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvcHhlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4YTMzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvcHhlLmgKQEAgLTAsMCArMSw0NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4L3B4ZS5oCisgKgorICogUFhFIGRlZmluaXRpb25zIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBTWVNMSU5VWAorICovCisKKyNpZm5kZWYgX1NZU0xJTlVYX1BYRV9ICisjZGVmaW5lIF9TWVNMSU5VWF9QWEVfSAorCisjaW5jbHVkZSA8c3lzbGludXgvcHhlX2FwaS5oPgorCisvKiBTWVNMSU5VWC1kZWZpbmVkIFBYRSB1dGlsaXR5IGZ1bmN0aW9ucyAqLworaW50IHB4ZV9nZXRfY2FjaGVkX2luZm8oaW50IGxldmVsLCB2b2lkICoqYnVmLCBzaXplX3QgKmxlbik7CitpbnQgcHhlX2dldF9uaWNfdHlwZSh0X1BYRU5WX1VORElfR0VUX05JQ19UWVBFICogZ250KTsKK3VpbnQzMl90IHB4ZV9kbnMoY29uc3QgY2hhciAqaG9zdG5hbWUpOworCisjZW5kaWYgLyogX1NZU0xJTlVYX1BYRV9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3B4ZV9hcGkuaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvcHhlX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTk0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3B4ZV9hcGkuaApAQCAtMCwwICsxLDU5NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4L3B4ZV9hcGkuaAorICoKKyAqIFBYRSB0eXBlIGFuZCBjb25zdGFudCBkZWZpbml0aW9ucyBmb3IgU1lTTElOVVgKKyAqLworCisjaWZuZGVmIF9TWVNMSU5VWF9QWEVfQVBJX0gKKyNkZWZpbmUgX1NZU0xJTlVYX1BYRV9BUElfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKworLyogUFhFIHNwZWMgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMuICBUaGVzZSBtb3N0bHkgZm9sbG93IHRoZSBQWEUKKyAgIHNwZWMsIGV4Y2VwdCB3aGVuIHRoZSBQWEUgc3BlYyBpcyB1bm5lY2Vzc2FyaWx5IHN0dXBpZC4gIE9mIGNvdXJzZSwKKyAgIHRoYXQgaXMgbW9zdCBvZiB0aGUgdGltZS4gKi8KKworLyogQmFzaWMgdHlwZXM7IHVzZSBVbml4LWxpa2UgX3QgY29udmVudGlvbiBpbnN0ZWFkIG9mIFNDUkVBTUlORzsgYWxzbworICAgcmUtdXNlIHR5cGVzIHdlIGFscmVhZHkgaGF2ZSwgbGlrZSBpbl9hZGRyX3QuICovCisKK3R5cGVkZWYgdWludDE2X3QgcHhlbnZfc3RhdHVzX3Q7CisKKyNkZWZpbmUgTUFDX0FERFJfTEVOCTE2Cit0eXBlZGVmIHVpbnQ4X3QgbWFjX2FkZHJfdFtNQUNfQUREUl9MRU5dOworCisvKiAiUHJvdGVjdGVkIG1vZGUgc2VnbWVudCBkZXNjcmlwdG9yIiBhY2NvcmRpbmcgdG8gUFhFLi4uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3Qgc2VsOworICAgIHVpbnQzMl90IGJhc2U7CisgICAgdWludDE2X3Qgc2l6ZTsKK30gX19wYWNrZWQgcHhlX3NlZ2Rlc2NfdDsKKwordHlwZWRlZiBmYXJfcHRyX3Qgc2Vnb2ZmMTZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3Qgb3Bjb2RlOworI2RlZmluZSBCT09UUF9SRVEgMQorI2RlZmluZSBCT09UUF9SRVAgMgorICAgIHVpbnQ4X3QgSGFyZHdhcmU7CisgICAgdWludDhfdCBIYXJkbGVuOworICAgIHVpbnQ4X3QgR2F0ZWhvcHM7CisgICAgdWludDMyX3QgaWRlbnQ7CisgICAgdWludDE2X3Qgc2Vjb25kczsKKyAgICB1aW50MTZfdCBGbGFnczsKKyNkZWZpbmUgQk9PVFBfQkNBU1QgMHg4MDAwCisgICAgaW5fYWRkcl90IGNpcDsJCS8qIENsaWVudCBJUCBhZGRyZXNzICovCisgICAgaW5fYWRkcl90IHlpcDsJCS8qIFlvdSBJUCBhZGRyZXNzICovCisgICAgaW5fYWRkcl90IHNpcDsJCS8qIG5leHQgc2VydmVyIElQIGFkZHJlc3MgKi8KKyAgICBpbl9hZGRyX3QgZ2lwOwkJLypyZWxheSBhZ2VudCBJUCBhZGRyZXNzICovCisgICAgbWFjX2FkZHJfdCBDQWRkcjsKKyAgICB1aW50OF90IFNuYW1lWzY0XTsKKyAgICB1aW50OF90IGJvb3RmaWxlWzEyOF07CisgICAgdW5pb24geworI2RlZmluZSBCT09UUF9ESENQVkVORCAxMDI0CisJdWludDhfdCBkW0JPT1RQX0RIQ1BWRU5EXTsKKwlzdHJ1Y3QgeworCSAgICB1aW50OF90IG1hZ2ljWzRdOworI2RlZmluZSBWTV9SRkMxMDQ4IDB4NjM4MjUzNjNMCisJICAgIHVpbnQzMl90IGZsYWdzOworCSAgICB1aW50OF90IHBhZFs1Nl07CisJfSB2OworICAgIH0gdmVuZG9yOworfSBfX3BhY2tlZCBweGVfYm9vdHBfdDsKKworLyogRnVuY3Rpb24gY2FsbGluZyBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9HRVRfQ0FDSEVEX0lORk8geworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKKyAgICB1aW50MTZfdCBQYWNrZXRUeXBlOworI2RlZmluZSBQWEVOVl9QQUNLRVRfVFlQRV9ESENQX0RJU0NPVkVSIDEKKyNkZWZpbmUgUFhFTlZfUEFDS0VUX1RZUEVfREhDUF9BQ0sgMgorI2RlZmluZSBQWEVOVl9QQUNLRVRfVFlQRV9DQUNIRURfUkVQTFkgMworICAgIHVpbnQxNl90IEJ1ZmZlclNpemU7CisgICAgc2Vnb2ZmMTZfdCBCdWZmZXI7CisgICAgdWludDE2X3QgQnVmZmVyTGltaXQ7Cit9IF9fcGFja2VkIHRfUFhFTlZfR0VUX0NBQ0hFRF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1NUQVJUX1VOREkgeworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKKyAgICB1aW50MTZfdCBBWDsKKyAgICB1aW50MTZfdCBCWDsKKyAgICB1aW50MTZfdCBEWDsKKyAgICB1aW50MTZfdCBESTsKKyAgICB1aW50MTZfdCBFUzsKK30gX19wYWNrZWQgdF9QWEVOVl9TVEFSVF9VTkRJOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1NUT1BfVU5ESSB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworfSBfX3BhY2tlZCB0X1BYRU5WX1NUT1BfVU5ESTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9TVEFSVF9CQVNFIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7Cit9IF9fcGFja2VkIHRfUFhFTlZfU1RBUlRfQkFTRTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9TVE9QX0JBU0UgeworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKK30gX19wYWNrZWQgdF9QWEVOVl9TVE9QX0JBU0U7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVEZUUF9PUEVOIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7CisgICAgaW5fYWRkcl90IFNlcnZlcklQQWRkcmVzczsKKyAgICBpbl9hZGRyX3QgR2F0ZXdheUlQQWRkcmVzczsKKyAgICB1aW50OF90IEZpbGVOYW1lWzEyOF07CisgICAgaW5fcG9ydF90IFRGVFBQb3J0OworICAgIHVpbnQxNl90IFBhY2tldFNpemU7Cit9IF9fcGFja2VkIHRfUFhFTlZfVEZUUF9PUEVOOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1RGVFBfQ0xPU0UgeworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKK30gX19wYWNrZWQgdF9QWEVOVl9URlRQX0NMT1NFOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1RGVFBfUkVBRCB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHVpbnQxNl90IFBhY2tldE51bWJlcjsKKyAgICB1aW50MTZfdCBCdWZmZXJTaXplOworICAgIHNlZ29mZjE2X3QgQnVmZmVyOworfSBfX3BhY2tlZCB0X1BYRU5WX1RGVFBfUkVBRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9URlRQX1JFQURfRklMRSB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHVpbnQ4X3QgRmlsZU5hbWVbMTI4XTsKKyAgICB1aW50MzJfdCBCdWZmZXJTaXplOworICAgIHZvaWQgKkJ1ZmZlcjsKKyAgICBpbl9hZGRyX3QgU2VydmVySVBBZGRyZXNzOworICAgIGluX2FkZHJfdCBHYXRld2F5SVBBZGRyZXNzOworICAgIGluX2FkZHJfdCBNY2FzdElQQWRkcmVzczsKKyAgICBpbl9wb3J0X3QgVEZUUENsbnRQb3J0OworICAgIGluX3BvcnRfdCBURlRQU3J2UG9ydDsKKyAgICB1aW50MTZfdCBURlRQT3BlblRpbWVPdXQ7CisgICAgdWludDE2X3QgVEZUUFJlb3BlbkRlbGF5OworfSBfX3BhY2tlZCB0X1BYRU5WX1RGVFBfUkVBRF9GSUxFOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1RGVFBfR0VUX0ZTSVpFIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7CisgICAgaW5fYWRkcl90IFNlcnZlcklQQWRkcmVzczsKKyAgICBpbl9hZGRyX3QgR2F0ZXdheUlQQWRkcmVzczsKKyAgICB1aW50OF90IEZpbGVOYW1lWzEyOF07CisgICAgdWludDMyX3QgRmlsZVNpemU7Cit9IF9fcGFja2VkIHRfUFhFTlZfVEZUUF9HRVRfRlNJWkU7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVURQX09QRU4geworICAgIHB4ZW52X3N0YXR1c190IHN0YXR1czsKKyAgICBpbl9hZGRyX3Qgc3JjX2lwOworfSBfX3BhY2tlZCB0X1BYRU5WX1VEUF9PUEVOOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VEUF9DTE9TRSB7CisgICAgcHhlbnZfc3RhdHVzX3Qgc3RhdHVzOworfSBfX3BhY2tlZCB0X1BYRU5WX1VEUF9DTE9TRTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VRFBfV1JJVEUgeworICAgIHB4ZW52X3N0YXR1c190IHN0YXR1czsKKyAgICBpbl9hZGRyX3QgaXA7CisgICAgaW5fYWRkcl90IGd3OworICAgIGluX3BvcnRfdCBzcmNfcG9ydDsKKyAgICBpbl9wb3J0X3QgZHN0X3BvcnQ7CisgICAgdWludDE2X3QgYnVmZmVyX3NpemU7CisgICAgc2Vnb2ZmMTZfdCBidWZmZXI7Cit9IF9fcGFja2VkIHRfUFhFTlZfVURQX1dSSVRFOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VEUF9SRUFEIHsKKyAgICBweGVudl9zdGF0dXNfdCBzdGF0dXM7CisgICAgaW5fYWRkcl90IHNyY19pcDsKKyAgICBpbl9hZGRyX3QgZGVzdF9pcDsKKyAgICBpbl9wb3J0X3Qgc19wb3J0OworICAgIGluX3BvcnRfdCBkX3BvcnQ7CisgICAgdWludDE2X3QgYnVmZmVyX3NpemU7CisgICAgc2Vnb2ZmMTZfdCBidWZmZXI7Cit9IF9fcGFja2VkIHRfUFhFTlZfVURQX1JFQUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9TVEFSVFVQIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7Cit9IF9fcGFja2VkIHRfUFhFTlZfVU5ESV9TVEFSVFVQOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfQ0xFQU5VUCB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfQ0xFQU5VUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0lOSVRJQUxJWkUgeworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKKyAgICB2b2lkICpQcm90b2NvbEluaTsKKyAgICB1aW50OF90IHJlc2VydmVkWzhdOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfSU5JVElBTElaRTsKKworI2RlZmluZSBNQVhOVU1fTUNBRERSIDgKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9NQ0FTVF9BRERSRVNTIHsKKyAgICB1aW50MTZfdCBNQ2FzdEFkZHJDb3VudDsKKyAgICBtYWNfYWRkcl90IE1jYXN0QWRkcltNQVhOVU1fTUNBRERSXTsKK30gX19wYWNrZWQgdF9QWEVOVl9VTkRJX01DQVNUX0FERFJFU1M7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9SRVNFVCB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHRfUFhFTlZfVU5ESV9NQ0FTVF9BRERSRVNTIFJfTWNhc3RfQnVmOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfUkVTRVQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9TSFVURE9XTiB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfU0hVVERPV047CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9PUEVOIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7CisgICAgdWludDE2X3QgT3BlbkZsYWc7CisgICAgdWludDE2X3QgUGt0RmlsdGVyOworI2RlZmluZSBGTFRSX0RJUkVDVEVEIDB4MDAwMQorI2RlZmluZSBGTFRSX0JSRENTVCAweDAwMDIKKyNkZWZpbmUgRkxUUl9QUk1TQ1MgMHgwMDA0CisjZGVmaW5lIEZMVFJfU1JDX1JURyAweDAwMDgKKyAgICAgdF9QWEVOVl9VTkRJX01DQVNUX0FERFJFU1MgUl9NY2FzdF9CdWY7Cit9IF9fcGFja2VkIHRfUFhFTlZfVU5ESV9PUEVOOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfQ0xPU0UgeworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKK30gX19wYWNrZWQgdF9QWEVOVl9VTkRJX0NMT1NFOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfVFJBTlNNSVQgeworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKKyAgICB1aW50OF90IFByb3RvY29sOworI2RlZmluZSBQX1VOS05PV04gMAorI2RlZmluZSBQX0lQIDEKKyNkZWZpbmUgUF9BUlAgMgorI2RlZmluZSBQX1JBUlAgMworICAgIHVpbnQ4X3QgWG1pdEZsYWc7CisjZGVmaW5lIFhNVF9ERVNUQUREUiAweDAwMDAKKyNkZWZpbmUgWE1UX0JST0FEQ0FTVCAweDAwMDEKKyAgICBzZWdvZmYxNl90IERlc3RBZGRyOworICAgIHNlZ29mZjE2X3QgVEJEOworICAgIHVpbnQzMl90IFJlc2VydmVkWzJdOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfVFJBTlNNSVQ7CisjZGVmaW5lIE1BWF9EQVRBX0JMS1MgOAordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1RCRCB7CisgICAgdWludDE2X3QgSW1tZWRMZW5ndGg7CisgICAgc2Vnb2ZmMTZfdCBYbWl0OworICAgIHVpbnQxNl90IERhdGFCbGtDb3VudDsKKyAgICBzdHJ1Y3QgRGF0YUJsayB7CisJdWludDhfdCBURFB0clR5cGU7CisJdWludDhfdCBURFJzdmRCeXRlOworCXVpbnQxNl90IFRERGF0YUxlbjsKKwlzZWdvZmYxNl90IFRERGF0YVB0cjsKKyAgICB9IERhdGFCbG9ja1tNQVhfREFUQV9CTEtTXTsKK30gX19wYWNrZWQgdF9QWEVOVl9VTkRJX1RCRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9NQ0FTVF9BRERSRVNTIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7CisgICAgIHRfUFhFTlZfVU5ESV9NQ0FTVF9BRERSRVNTIFJfTWNhc3RfQnVmOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfU0VUX01DQVNUX0FERFI7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9TRVRfU1RBVElPTl9BRERSRVNTIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7CisgICAgbWFjX2FkZHJfdCBTdGF0aW9uQWRkcmVzczsKK30gX19wYWNrZWQgdF9QWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFI7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9TRVRfUEFDS0VUX0ZJTFRFUiB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHVpbnQ4X3QgZmlsdGVyOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfU0VUX1BBQ0tFVF9GSUxURVI7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT04geworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKKyAgICB1aW50MTZfdCBCYXNlSW87CisgICAgdWludDE2X3QgSW50TnVtYmVyOworICAgIHVpbnQxNl90IE1heFRyYW5Vbml0OworICAgIHVpbnQxNl90IEh3VHlwZTsKKyNkZWZpbmUgRVRIRVJfVFlQRSAxCisjZGVmaW5lIEVYUF9FVEhFUl9UWVBFIDIKKyNkZWZpbmUgSUVFRV9UWVBFIDYKKyNkZWZpbmUgQVJDTkVUX1RZUEUgNworICAgIHVpbnQxNl90IEh3QWRkckxlbjsKKyAgICBtYWNfYWRkcl90IEN1cnJlbnROb2RlQWRkcmVzczsKKyAgICBtYWNfYWRkcl90IFBlcm1Ob2RlQWRkcmVzczsKKyAgICB1aW50MTZfdCBST01BZGRyZXNzOworICAgIHVpbnQxNl90IFJ4QnVmQ3Q7CisgICAgdWludDE2X3QgVHhCdWZDdDsKK30gX19wYWNrZWQgdF9QWEVOVl9VTkRJX0dFVF9JTkZPUk1BVElPTjsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9TVEFUSVNUSUNTIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7CisgICAgdWludDMyX3QgWG10R29vZEZyYW1lczsKKyAgICB1aW50MzJfdCBSY3ZHb29kRnJhbWVzOworICAgIHVpbnQzMl90IFJjdkNSQ0Vycm9yczsKKyAgICB1aW50MzJfdCBSY3ZSZXNvdXJjZUVycm9yczsKK30gX19wYWNrZWQgdF9QWEVOVl9VTkRJX0dFVF9TVEFUSVNUSUNTOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfQ0xFQVJfU1RBVElTVElDUyB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfQ0xFQVJfU1RBVElTVElDUzsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0lOSVRJQVRFX0RJQUdTIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7Cit9IF9fcGFja2VkIHRfUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUzsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVCB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfRk9SQ0VfSU5URVJSVVBUOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX01DQVNUX0FERFJFU1MgeworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKKyAgICBpbl9hZGRyX3QgSW5ldEFkZHI7CisgICAgbWFjX2FkZHJfdCBNZWRpYUFkZHI7Cit9IF9fcGFja2VkIHRfUFhFTlZfVU5ESV9HRVRfTUNBU1RfQUREUjsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9OSUNfVFlQRSB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHVpbnQ4X3QgTmljVHlwZTsKKyNkZWZpbmUgUENJX05JQyAyCisjZGVmaW5lIFBuUF9OSUMgMworI2RlZmluZSBDYXJkQnVzX05JQyA0CisgICAgdW5pb24geworCXN0cnVjdCB7CisJICAgIHVpbnQxNl90IFZlbmRvcl9JRDsKKwkgICAgdWludDE2X3QgRGV2X0lEOworCSAgICB1aW50OF90IEJhc2VfQ2xhc3M7CisJICAgIHVpbnQ4X3QgU3ViX0NsYXNzOworCSAgICB1aW50OF90IFByb2dfSW50ZjsKKwkgICAgdWludDhfdCBSZXY7CisJICAgIHVpbnQxNl90IEJ1c0RldkZ1bmM7CisJICAgIHVpbnQxNl90IFN1YlZlbmRvcl9JRDsKKwkgICAgdWludDE2X3QgU3ViRGV2aWNlX0lEOworCX0gcGNpLCBjYXJkYnVzOworCXN0cnVjdCB7CisJICAgIHVpbnQzMl90IEVJU0FfRGV2X0lEOworCSAgICB1aW50OF90IEJhc2VfQ2xhc3M7CisJICAgIHVpbnQ4X3QgU3ViX0NsYXNzOworCSAgICB1aW50OF90IFByb2dfSW50ZjsKKwkgICAgdWludDE2X3QgQ2FyZFNlbE51bTsKKwl9IF9fcGFja2VkIHBucDsKKyAgICB9IF9fcGFja2VkIGluZm87Cit9IF9fcGFja2VkIHRfUFhFTlZfVU5ESV9HRVRfTklDX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GTyB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHVpbnQ4X3QgSWZhY2VUeXBlWzE2XTsKKyAgICB1aW50MzJfdCBMaW5rU3BlZWQ7CisgICAgdWludDMyX3QgU2VydmljZUZsYWdzOworICAgIHVpbnQzMl90IFJlc2VydmVkWzRdOworfSBfX3BhY2tlZCB0X1BYRU5WX1VORElfR0VUX0lGQUNFX0lORk87CisjZGVmaW5lIFBYRV9VTkRJX0lGQUNFX0ZMQUdfQkNBU1QJMHgwMDAwMDAwMQorI2RlZmluZSBQWEVfVU5ESV9JRkFDRV9GTEFHX01DQVNUCTB4MDAwMDAwMDIKKyNkZWZpbmUgUFhFX1VORElfSUZBQ0VfRkxBR19HUk9VUAkweDAwMDAwMDA0CisjZGVmaW5lIFBYRV9VTkRJX0lGQUNFX0ZMQUdfUFJPTUlTQwkweDAwMDAwMDA4CisjZGVmaW5lIFBYRV9VTkRJX0lGQUNFX0ZMQUdfU09GVE1BQwkweDAwMDAwMDEwCisjZGVmaW5lIFBYRV9VTkRJX0lGQUNFX0ZMQUdfU1RBVFMJMHgwMDAwMDAyMAorI2RlZmluZSBQWEVfVU5ESV9JRkFDRV9GTEFHX0RJQUdTCTB4MDAwMDAwNDAKKyNkZWZpbmUgUFhFX1VORElfSUZBQ0VfRkxBR19MT09QQkFDSwkweDAwMDAwMDgwCisjZGVmaW5lIFBYRV9VTkRJX0lGQUNFX0ZMQUdfUkNWQ0hBSU4JMHgwMDAwMDEwMAorI2RlZmluZSBQWEVfVU5ESV9JRkFDRV9GTEFHX0lCTVNSQ1JUCTB4MDAwMDAyMDAKKyNkZWZpbmUgUFhFX1VORElfSUZBQ0VfRkxBR19SRVNFVAkweDAwMDAwNDAwCisjZGVmaW5lIFBYRV9VTkRJX0lGQUNFX0ZMQUdfT1BFTgkweDAwMDAwODAwCisjZGVmaW5lIFBYRV9VTkRJX0lGQUNFX0ZMQUdfSVJRCQkweDAwMDAxMDAwCisjZGVmaW5lIFBYRV9VTkRJX0lGQUNFX0ZMQUdfU1JDUlQJMHgwMDAwMjAwMAorI2RlZmluZSBQWEVfVU5ESV9JRkFDRV9GTEFHX0dEVFZJUlQJMHgwMDAwNDAwMAorI2RlZmluZSBQWEVfVU5ESV9JRkFDRV9GTEFHX01VTFRJCTB4MDAwMDgwMDAKKyNkZWZpbmUgUFhFX1VORElfSUZBQ0VfRkxBR19MS0ZJU1oJMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX1NUQVRFIHsKKyNkZWZpbmUgUFhFX1VORElfR0VUX1NUQVRFX1NUQVJURUQgMQorI2RlZmluZSBQWEVfVU5ESV9HRVRfU1RBVEVfSU5JVElBTElaRUQgMgorI2RlZmluZSBQWEVfVU5ESV9HRVRfU1RBVEVfT1BFTkVEIDMKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7CisgICAgdWludDhfdCBVTkRJc3RhdGU7Cit9IF9fcGFja2VkIHRfUFhFTlZfVU5ESV9HRVRfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9JU1IgeworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKKyAgICB1aW50MTZfdCBGdW5jRmxhZzsKKyAgICB1aW50MTZfdCBCdWZmZXJMZW5ndGg7CisgICAgdWludDE2X3QgRnJhbWVMZW5ndGg7CisgICAgdWludDE2X3QgRnJhbWVIZWFkZXJMZW5ndGg7CisgICAgc2Vnb2ZmMTZfdCBGcmFtZTsKKyAgICB1aW50OF90IFByb3RUeXBlOworICAgIHVpbnQ4X3QgUGt0VHlwZTsKK30gX19wYWNrZWQgdF9QWEVOVl9VTkRJX0lTUjsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0FQSV9DSEVDSyB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHVpbnQxNl90IFNpemU7CisgICAgdWludDMyX3QgTWFnaWM7CisgICAgdWludDMyX3QgUHJvdmlkZXI7CisgICAgdWludDMyX3QgQVBJTWFzazsKKyAgICB1aW50MzJfdCBGbGFnczsKK30gX19wYWNrZWQgdF9QWEVOVl9GSUxFX0FQSV9DSEVDSzsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9GSUxFX1JFQUQgeworICAgIHB4ZW52X3N0YXR1c190IFN0YXR1czsKKyAgICB1aW50MTZfdCBGaWxlSGFuZGxlOworICAgIHVpbnQxNl90IEJ1ZmZlclNpemU7CisgICAgc2Vnb2ZmMTZfdCBCdWZmZXI7Cit9IF9fcGFja2VkIHRfUFhFTlZfRklMRV9SRUFEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX0ZJTEVfT1BFTiB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHVpbnQxNl90IEZpbGVIYW5kbGU7CisgICAgc2Vnb2ZmMTZfdCBGaWxlTmFtZTsKKyAgICB1aW50MzJfdCBSZXNlcnZlZDsKK30gX19wYWNrZWQgdF9QWEVOVl9GSUxFX09QRU47CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfRklMRV9DTE9TRSB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHVpbnQxNl90IEZpbGVIYW5kbGU7Cit9IF9fcGFja2VkIHRfUFhFTlZfRklMRV9DTE9TRTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9HRVRfRklMRV9TSVpFIHsKKyAgICBweGVudl9zdGF0dXNfdCBTdGF0dXM7CisgICAgdWludDE2X3QgRmlsZUhhbmRsZTsKKyAgICB1aW50MzJfdCBGaWxlU2l6ZTsKK30gX19wYWNrZWQgdF9QWEVOVl9HRVRfRklMRV9TSVpFOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VOTE9BRF9TVEFDSyB7CisgICAgcHhlbnZfc3RhdHVzX3QgU3RhdHVzOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMTBdOworfSBfX3BhY2tlZCB0X1BYRU5WX1VOTE9BRF9TVEFDSzsKKyAgICAKKyNkZWZpbmUgUFhFTlZfVU5ESV9JU1JfSU5fU1RBUlQgMQorI2RlZmluZSBQWEVOVl9VTkRJX0lTUl9JTl9QUk9DRVNTIDIKKyNkZWZpbmUgUFhFTlZfVU5ESV9JU1JfSU5fR0VUX05FWFQgMworLyogT25lIG9mIHRoZXNlIHdpbGwgYmUgcmV0dXJuZWQgZm9yCisgICBQWEVOVl9VTkRJX0lTUl9JTl9TVEFSVCAqLworI2RlZmluZSBQWEVOVl9VTkRJX0lTUl9PVVRfT1VSUyAwCisjZGVmaW5lIFBYRU5WX1VORElfVVNSX09VVF9OT1RfT1VSUyAxCisvKiBPbmUgb2YgdGhlc2Ugd2lsbCBiZSByZXR1cm5lZCBmb3IKKyAgIFBYRU5WX1VORElfSVNSX0lOX1BST0NFU1MgYW5kCisgICBQWEVOVl9VTkRJX0lTUl9JTl9HRVRfTkVYVCAqLworI2RlZmluZSBQWEVOVl9VTkRJX0lTUl9PVVRfRE9ORSAwCisjZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9UUkFOU01JVCAyCisjZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9SRUNFSVZFIDMKKyNkZWZpbmUgUFhFTlZfVU5ESV9JU1JfT1VUX0JVU1kgNAorCisvKiBGdW5jdGlvbiBudW1iZXJzIGFuZCBlcnJvciBjb2RlcyAqLworCisjZGVmaW5lIFBYRU5WX1RGVFBfT1BFTgkJCTB4MDAyMAorI2RlZmluZSBQWEVOVl9URlRQX0NMT1NFCQkweDAwMjEKKyNkZWZpbmUgUFhFTlZfVEZUUF9SRUFECQkJMHgwMDIyCisjZGVmaW5lIFBYRU5WX1RGVFBfUkVBRF9GSUxFCQkweDAwMjMKKyNkZWZpbmUgUFhFTlZfVEZUUF9SRUFEX0ZJTEVfUE1PREUJMHgwMDI0CisjZGVmaW5lIFBYRU5WX1RGVFBfR0VUX0ZTSVpFCQkweDAwMjUKKworI2RlZmluZSBQWEVOVl9VRFBfT1BFTgkJCTB4MDAzMAorI2RlZmluZSBQWEVOVl9VRFBfQ0xPU0UJCQkweDAwMzEKKyNkZWZpbmUgUFhFTlZfVURQX1JFQUQJCQkweDAwMzIKKyNkZWZpbmUgUFhFTlZfVURQX1dSSVRFCQkJMHgwMDMzCisKKyNkZWZpbmUgUFhFTlZfU1RBUlRfVU5ESQkJMHgwMDAwCisjZGVmaW5lIFBYRU5WX1VORElfU1RBUlRVUAkJMHgwMDAxCisjZGVmaW5lIFBYRU5WX1VORElfQ0xFQU5VUAkJMHgwMDAyCisjZGVmaW5lIFBYRU5WX1VORElfSU5JVElBTElaRQkJMHgwMDAzCisjZGVmaW5lIFBYRU5WX1VORElfUkVTRVRfTklDCQkweDAwMDQKKyNkZWZpbmUgUFhFTlZfVU5ESV9TSFVURE9XTgkJMHgwMDA1CisjZGVmaW5lIFBYRU5WX1VORElfT1BFTgkJCTB4MDAwNgorI2RlZmluZSBQWEVOVl9VTkRJX0NMT1NFCQkweDAwMDcKKyNkZWZpbmUgUFhFTlZfVU5ESV9UUkFOU01JVAkJMHgwMDA4CisjZGVmaW5lIFBYRU5WX1VORElfU0VUX01DQVNUX0FERFIJMHgwMDA5CisjZGVmaW5lIFBYRU5WX1VORElfU0VUX1NUQVRJT05fQUREUgkweDAwMEEKKyNkZWZpbmUgUFhFTlZfVU5ESV9TRVRfUEFDS0VUX0ZJTFRFUgkweDAwMEIKKyNkZWZpbmUgUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT04JMHgwMDBDCisjZGVmaW5lIFBYRU5WX1VORElfR0VUX1NUQVRJU1RJQ1MJMHgwMDBECisjZGVmaW5lIFBYRU5WX1VORElfQ0xFQVJfU1RBVElTVElDUwkweDAwMEUKKyNkZWZpbmUgUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUwkweDAwMEYKKyNkZWZpbmUgUFhFTlZfVU5ESV9GT1JDRV9JTlRFUlJVUFQJMHgwMDEwCisjZGVmaW5lIFBYRU5WX1VORElfR0VUX01DQVNUX0FERFIJMHgwMDExCisjZGVmaW5lIFBYRU5WX1VORElfR0VUX05JQ19UWVBFCQkweDAwMTIKKyNkZWZpbmUgUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GTwkweDAwMTMKKyNkZWZpbmUgUFhFTlZfVU5ESV9JU1IJCQkweDAwMTQKKyNkZWZpbmUJUFhFTlZfU1RPUF9VTkRJCQkJMHgwMDE1CS8qIE92ZXJsYXAuLi4/ICovCisjZGVmaW5lIFBYRU5WX1VORElfR0VUX1NUQVRFCQkweDAwMTUJLyogT3ZlcmxhcC4uLj8gKi8KKworI2RlZmluZSBQWEVOVl9VTkxPQURfU1RBQ0sJCTB4MDA3MAorI2RlZmluZSBQWEVOVl9HRVRfQ0FDSEVEX0lORk8JCTB4MDA3MQorI2RlZmluZSBQWEVOVl9SRVNUQVJUX0RIQ1AJCTB4MDA3MgorI2RlZmluZSBQWEVOVl9SRVNUQVJUX1RGVFAJCTB4MDA3MworI2RlZmluZSBQWEVOVl9NT0RFX1NXSVRDSAkJMHgwMDc0CisjZGVmaW5lIFBYRU5WX1NUQVJUX0JBU0UJCTB4MDA3NQorI2RlZmluZSBQWEVOVl9TVE9QX0JBU0UJCQkweDAwNzYKKworLyogZ1BYRSBleHRlbnNpb25zLi4uICovCisjZGVmaW5lIFBYRU5WX0ZJTEVfT1BFTgkJCTB4MDBlMAorI2RlZmluZSBQWEVOVl9GSUxFX0NMT1NFCQkweDAwZTEKKyNkZWZpbmUgUFhFTlZfRklMRV9TRUxFQ1QJCTB4MDBlMgorI2RlZmluZSBQWEVOVl9GSUxFX1JFQUQJCQkweDAwZTMKKyNkZWZpbmUgUFhFTlZfR0VUX0ZJTEVfU0laRQkJMHgwMGU0CisjZGVmaW5lIFBYRU5WX0ZJTEVfRVhFQwkJCTB4MDBlNQorI2RlZmluZSBQWEVOVl9GSUxFX0FQSV9DSEVDSwkJMHgwMGU2CisKKy8qIEV4aXQgY29kZXMgKi8KKyNkZWZpbmUgUFhFTlZfRVhJVF9TVUNDRVNTCQkJCSAweDAwMDAKKyNkZWZpbmUgUFhFTlZfRVhJVF9GQUlMVVJFCQkJCSAweDAwMDEKKworLyogU3RhdHVzIGNvZGVzICovCisjZGVmaW5lIFBYRU5WX1NUQVRVU19TVUNDRVNTCQkJCSAweDAwCisjZGVmaW5lIFBYRU5WX1NUQVRVU19GQUlMVVJFCQkJCSAweDAxCisjZGVmaW5lIFBYRU5WX1NUQVRVU19CQURfRlVOQwkJCQkgMHgwMgorI2RlZmluZSBQWEVOVl9TVEFUVVNfVU5TVVBQT1JURUQJCQkgMHgwMworI2RlZmluZSBQWEVOVl9TVEFUVVNfS0VFUF9VTkRJCQkJCSAweDA0CisjZGVmaW5lIFBYRU5WX1NUQVRVU19LRUVQX0FMTAkJCQkgMHgwNQorI2RlZmluZSBQWEVOVl9TVEFUVVNfT1VUX09GX1JFU09VUkNFUwkJCSAweDA2CisjZGVmaW5lIFBYRU5WX1NUQVRVU19BUlBfVElNRU9VVAkJCSAweDExCisjZGVmaW5lIFBYRU5WX1NUQVRVU19VRFBfQ0xPU0VECQkJCSAweDE4CisjZGVmaW5lIFBYRU5WX1NUQVRVU19VRFBfT1BFTgkJCQkgMHgxOQorI2RlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9DTE9TRUQJCQkgMHgxYQorI2RlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9PUEVOCQkJCSAweDFiCisjZGVmaW5lIFBYRU5WX1NUQVRVU19NQ09QWV9QUk9CTEVNCQkJIDB4MjAKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0JJU19JTlRFR1JJVFlfRkFJTFVSRQkJIDB4MjEKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0JJU19WQUxJREFURV9GQUlMVVJFCQkgMHgyMgorI2RlZmluZSBQWEVOVl9TVEFUVVNfQklTX0lOSVRfRkFJTFVSRQkJCSAweDIzCisjZGVmaW5lIFBYRU5WX1NUQVRVU19CSVNfU0hVVERPV05fRkFJTFVSRQkJIDB4MjQKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0JJU19HQk9BX0ZBSUxVUkUJCQkgMHgyNQorI2RlZmluZSBQWEVOVl9TVEFUVVNfQklTX0ZSRUVfRkFJTFVSRQkJCSAweDI2CisjZGVmaW5lIFBYRU5WX1NUQVRVU19CSVNfR1NJX0ZBSUxVUkUJCQkgMHgyNworI2RlZmluZSBQWEVOVl9TVEFUVVNfQklTX0JBRF9DS1NVTQkJCSAweDI4CisjZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX0NBTk5PVF9BUlBfQUREUkVTUwkJIDB4MzAKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX1RGVFBfT1BFTl9USU1FT1VUCQkJIDB4MzIKKworI2RlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9VTktOT1dOX09QQ09ERQkJIDB4MzMKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX1RGVFBfUkVBRF9USU1FT1VUCQkJIDB4MzUKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX1RGVFBfRVJST1JfT1BDT0RFCQkJIDB4MzYKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX1RGVFBfQ0FOTk9UX09QRU5fQ09OTkVDVElPTgkgMHgzOAorI2RlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9DQU5OT1RfUkVBRF9GUk9NX0NPTk5FQ1RJT04JIDB4MzkKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX1RGVFBfVE9PX01BTllfUEFDS0FHRVMJCSAweDNhCisjZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX0ZJTEVfTk9UX0ZPVU5ECQkgMHgzYgorI2RlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9BQ0NFU1NfVklPTEFUSU9OCQkgMHgzYworI2RlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9OT19NQ0FTVF9BRERSRVNTCQkgMHgzZAorI2RlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9OT19GSUxFU0laRQkJCSAweDNlCisjZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX0lOVkFMSURfUEFDS0VUX1NJWkUJCSAweDNmCisjZGVmaW5lIFBYRU5WX1NUQVRVU19ESENQX1RJTUVPVVQJCQkgMHg1MQorI2RlZmluZSBQWEVOVl9TVEFUVVNfREhDUF9OT19JUF9BRERSRVNTCQkJIDB4NTIKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0RIQ1BfTk9fQk9PVEZJTEVfTkFNRQkJIDB4NTMKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0RIQ1BfQkFEX0lQX0FERFJFU1MJCSAweDU0CisjZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX0lOVkFMSURfRlVOQ1RJT04JCSAweDYwCisjZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX01FRElBVEVTVF9GQUlMRUQJCSAweDYxCisjZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9JTklUX05JQ19GT1JfTUNBU1QJIDB4NjIKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX1VORElfQ0FOTk9UX0lOSVRJQUxJWkVfTklDCQkgMHg2MworI2RlZmluZSBQWEVOVl9TVEFUVVNfVU5ESV9DQU5OT1RfSU5JVElBTElaRV9QSFkJCSAweDY0CisjZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9SRUFEX0NPTkZJR19EQVRBCSAweDY1CisjZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9SRUFEX0lOSVRfREFUQQkJIDB4NjYKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX1VORElfQkFEX01BQ19BRERSRVNTCQkgMHg2NworI2RlZmluZSBQWEVOVl9TVEFUVVNfVU5ESV9CQURfRUVQUk9NX0NIRUNLU1VNCQkgMHg2OAorI2RlZmluZSBQWEVOVl9TVEFUVVNfVU5ESV9FUlJPUl9TRVRUSU5HX0lTUgkJIDB4NjkKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX1VORElfSU5WQUxJRF9TVEFURQkJCSAweDZhCisjZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX1RSQU5TTUlUX0VSUk9SCQkgMHg2YgorI2RlZmluZSBQWEVOVl9TVEFUVVNfVU5ESV9JTlZBTElEX1BBUkFNRVRFUgkJIDB4NmMKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0JTVFJBUF9QUk9NUFRfTUVOVQkJCSAweDc0CisjZGVmaW5lIFBYRU5WX1NUQVRVU19CU1RSQVBfTUNBU1RfQUREUgkJCSAweDc2CisjZGVmaW5lIFBYRU5WX1NUQVRVU19CU1RSQVBfTUlTU0lOR19MSVNUCQkgMHg3NworI2RlZmluZSBQWEVOVl9TVEFUVVNfQlNUUkFQX05PX1JFU1BPTlNFCQkJIDB4NzgKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0JTVFJBUF9GSUxFX1RPT19CSUcJCSAweDc5CisjZGVmaW5lIFBYRU5WX1NUQVRVU19CSU5MX0NBTkNFTEVEX0JZX0tFWVNUUk9LRQkJIDB4YTAKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0JJTkxfTk9fUFhFX1NFUlZFUgkJCSAweGExCisjZGVmaW5lIFBYRU5WX1NUQVRVU19OT1RfQVZBSUxBQkxFX0lOX1BNT0RFCQkgMHhhMgorI2RlZmluZSBQWEVOVl9TVEFUVVNfTk9UX0FWQUlMQUJMRV9JTl9STU9ERQkJIDB4YTMKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0JVU0RfREVWSUNFX05PVF9TVVBQT1JURUQJCSAweGIwCisjZGVmaW5lIFBYRU5WX1NUQVRVU19MT0FERVJfTk9fRlJFRV9CQVNFX01FTU9SWQkJIDB4YzAKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0xPQURFUl9OT19CQ19ST01JRAkJCSAweGMxCisjZGVmaW5lIFBYRU5WX1NUQVRVU19MT0FERVJfQkFEX0JDX1JPTUlECQkgMHhjMgorI2RlZmluZSBQWEVOVl9TVEFUVVNfTE9BREVSX0JBRF9CQ19SVU5USU1FX0lNQUdFCSAweGMzCisjZGVmaW5lIFBYRU5WX1NUQVRVU19MT0FERVJfTk9fVU5ESV9ST01JRAkJIDB4YzQKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0xPQURFUl9CQURfVU5ESV9ST01JRAkJIDB4YzUKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0xPQURFUl9CQURfVU5ESV9EUklWRVJfSU1BR0UJIDB4YzYKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0xPQURFUl9OT19QWEVfU1RSVUNUCQkgMHhjOAorI2RlZmluZSBQWEVOVl9TVEFUVVNfTE9BREVSX05PX1BYRU5WX1NUUlVDVAkJIDB4YzkKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0xPQURFUl9VTkRJX1NUQVJUCQkJIDB4Y2EKKyNkZWZpbmUgUFhFTlZfU1RBVFVTX0xPQURFUl9CQ19TVEFSVAkJCSAweGNiCisKK2ludCBfX3dlYWsgcHhlX2NhbGwoaW50LCB2b2lkICopOwordm9pZCBfX3dlYWsgdW5sb2FkX3B4ZSh1aW50MTZfdCBmbGFncyk7Cit1aW50MzJfdCBfX3dlYWsgZG5zX3Jlc29sdihjb25zdCBjaGFyICopOworCitleHRlcm4gdWludDMyX3QgX193ZWFrIFNlbmRDb29raWVzOwordm9pZCBfX3dlYWsgaHR0cF9iYWtlX2Nvb2tpZXModm9pZCk7CisKKyNlbmRpZiAvKiBfU1lTTElOVVhfUFhFX0FQSV9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3JlYm9vdC5oIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9yZWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTg5OTgyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS9zeXNsaW51eC9yZWJvb3QuaApAQCAtMCwwICsxLDQxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbGludXgvcmVib290LmgKKyAqCisgKiBSZWJvb3QgdGhlIHN5c3RlbQorICovCisKKyNpZm5kZWYgX1NZU0xJTlVYX1JFQk9PVF9ICisjZGVmaW5lIF9TWVNMSU5VWF9SRUJPT1RfSAorCisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworX19ub3JldHVybiBzeXNsaW51eF9yZWJvb3QoaW50IHdhcm0pOworCisjZW5kaWYgLyogX1NZU0xJTlVYX1JFQk9PVF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3Jlc29sdmUuaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvcmVzb2x2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ODljMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3Jlc29sdmUuaApAQCAtMCwwICsxLDQxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbGludXgvcmVzb2x2ZS5oCisgKgorICogSW50ZXJmYWNlIHRvIHRoZSBzeXNsaW51eCBETlMgcXVlcnkgQVBJCisgKi8KKworI2lmbmRlZiBfU1lTTElOVVhfUkVTT0xWRV9ICisjZGVmaW5lIF9TWVNMSU5VWF9SRVNPTFZFX0gKKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworaW5fYWRkcl90IHN5c2xpbnV4X3Jlc29sdmVfaG9zdG5hbWUoY29uc3QgY2hhciAqKTsKKworI2VuZGlmIC8qIF9TWVNMSU5VWF9SRVNPTFZFX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvc3lzYXBwZW5kLmggYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3N5c2FwcGVuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmViM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3N5c2FwcGVuZC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC9zeXNhcHBlbmQuaAorICoKKyAqIExpc3Qgb2YgdGhlIFN5c2xpbnV4IHN5c2FwcGVuZCBzdHJpbmdzCisgKi8KKworI2lmbmRlZiBfU1lTTElOVVhfU1lTQVBQRU5EX0gKKyNkZWZpbmUgX1NZU0xJTlVYX1NZU0FQUEVORF9ICisKK2VudW0gc3lzbGludXhfc3lzYXBwZW5kIHsKKyAgICBTWVNBUFBFTkRfSVAsCQkvKiBQWEVMSU5VWDogaXA9IGFkZHJlc3MgKi8KKyAgICBTWVNBUFBFTkRfQk9PVElGLAkJLyogUFhFTElOVVg6IEJPT1RJRj0gYWRkcmVzcyAqLworICAgIFNZU0FQUEVORF9TWVNVVUlELAkJLyogU3lzdGVtIFVVSUQgZnJvbSBQWEUgb3IgRE1JICovCisgICAgU1lTQVBQRU5EX0NQVSwJCS8qIENQVSBmZWF0dXJlcyAqLworICAgIFNZU0FQUEVORF9TWVNWRU5ET1IsCS8qIFN5c3RlbSBvciBNQiB2ZW5kb3IgZnJvbSBETUkgKi8KKyAgICBTWVNBUFBFTkRfU1lTUFJPRFVDVCwJLyogU3lzdGVtIG9yIE1CIHByb2R1Y3QgZnJvbSBETUkgKi8KKyAgICBTWVNBUFBFTkRfU1lTVkVSU0lPTiwJLyogU3lzdGVtIG9yIE1CIHZlcnNpb24gZnJvbSBETUkgKi8KKyAgICBTWVNBUFBFTkRfU1lTU0VSSUFMLAkvKiBTeXN0ZW0gb3IgTUIgc2VyaWFsIGZyb20gRE1JICovCisgICAgU1lTQVBQRU5EX1NZU1NLVSwJCS8qIFN5c3RlbSBTS1UgZnJvbSBETUkgKi8KKyAgICBTWVNBUFBFTkRfU1lTRkFNSUxZLAkvKiBTeXN0ZW0gZmFtaWx5IGZyb20gRE1JICovCisgICAgU1lTQVBQRU5EX01CVkVORE9SLAkJLyogU3lzdGVtIG9yIE1CIHZlbmRvciBmcm9tIERNSSAqLworICAgIFNZU0FQUEVORF9NQlBST0RVQ1QsCS8qIFN5c3RlbSBvciBNQiBwcm9kdWN0IGZyb20gRE1JICovCisgICAgU1lTQVBQRU5EX01CVkVSU0lPTiwJLyogU3lzdGVtIG9yIE1CIHZlcnNpb24gZnJvbSBETUkgKi8KKyAgICBTWVNBUFBFTkRfTUJTRVJJQUwsCQkvKiBTeXN0ZW0gb3IgTUIgc2VyaWFsIGZyb20gRE1JICovCisgICAgU1lTQVBQRU5EX01CQVNTRVQsCQkvKiBNQiBhc3NldCB0YWcgZnJvbSBETUkgKi8KKyAgICBTWVNBUFBFTkRfQklPU1ZFTkRPUiwJLyogQklPUyB2ZW5kb3IgKi8KKyAgICBTWVNBUFBFTkRfQklPU1ZFUlNJT04sCS8qIEJJT1MgdmVyc2lvbiBzdHJpbmcgKi8KKyAgICBTWVNBUFBFTkRfU1lTRkYsCQkvKiBTeXN0ZW0gZm9ybSBmYWN0b3IgKi8KKyAgICBTWVNBUFBFTkRfRlNVVUlELAkJLyogQm9vdCBmaWxlc3lzdGVtIFVVSUQgKi8KKyAgICBTWVNBUFBFTkRfTUFYCQkvKiBUb3RhbCBudW1iZXIgb2Ygc3RyaW5ncyAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3ZlcnNpb24uaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmRiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3ZlcnNpb24uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX1NZU0xJTlVYX1ZFUlNJT05fSAorI2RlZmluZSBfU1lTTElOVVhfVkVSU0lPTl9ICisKKyNkZWZpbmUgX19TVERDX1ZFUlNJT05fXyAyMDAwMDBMCisKKyNlbmRpZiAvKiBfU1lTTElOVVhfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3Zlc2Fjb24uaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvdmVzYWNvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OWU2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3Zlc2Fjb24uaApAQCAtMCwwICsxLDM5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9TWVNMSU5VWF9WRVNBQ09OX0gKKyNkZWZpbmUgX1NZU0xJTlVYX1ZFU0FDT05fSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitpbnQgdmVzYWNvbl9kZWZhdWx0X2JhY2tncm91bmQodm9pZCk7Cit2b2lkIHZlc2Fjb25fc2V0X3Jlc29sdXRpb24oaW50LCBpbnQpOworaW50IHZlc2Fjb25fbG9hZF9iYWNrZ3JvdW5kKGNvbnN0IGNoYXIgKik7CitpbnQgdmVzYWNvbl9zZXRfYmFja2dyb3VuZCh1bnNpZ25lZCBpbnQpOwordm9pZCB2ZXNhY29uX2N1cnNvcl9lbmFibGUoYm9vbCk7CisKKyNlbmRpZiAvKiBfU1lTTElOVVhfVkVTQUNPTl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3ZpZGVvLmggYi9jb20zMi9pbmNsdWRlL3N5c2xpbnV4L3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyODI4YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvdmlkZW8uaApAQCAtMCwwICsxLDQzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbGludXgvdmlkZW8uaAorICoKKyAqIFNZU0xJTlVYIHZpZGVvIEFQSSBmdW5jdGlvbnMuCisgKi8KKworI2lmbmRlZiBfU1lTTElOVVhfVklERU9fSAorI2RlZmluZSBfU1lTTElOVVhfVklERU9fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgc3lzbGludXhfZm9yY2VfdGV4dF9tb2RlKHZvaWQpOwordm9pZCBzeXNsaW51eF9yZXBvcnRfdmlkZW9fbW9kZSh1aW50MTZfdCBmbGFncywgdWludDE2X3QgeHNpemUsIHVpbnQxNl90IHlzaXplKTsKK2ludCBzeXNsaW51eF9mb250X3F1ZXJ5KHVpbnQ4X3QgKipmb250KTsKKworI2VuZGlmIC8qIF9TWVNMSU5VWF9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS9zeXNsaW51eC96aW8uaCBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvemlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5OTFlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvemlvLmgKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIDxzeXNsaW51eC96aW8uaD4KKyAqLworCisjaWZuZGVmIF9TWVNMSU5VWF9aSU9fSAorI2RlZmluZSBfU1lTTElOVVhfWklPX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCB6b3Blbihjb25zdCBjaGFyICosIGludCwgLi4uKTsKK0ZJTEUgKnpmb3Blbihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKyNlbmRpZiAvKiBfU1lTTElOVVhfWklPX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2luY2x1ZGUvdGltZS5oIGIvY29tMzIvaW5jbHVkZS90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5Mzg2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvdGltZS5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfVElNRV9ICisjZGVmaW5lIF9USU1FX0gKKworLyogZW1wdHkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3RpbnlqcGVnLmggYi9jb20zMi9pbmNsdWRlL3RpbnlqcGVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4ZDA5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvdGlueWpwZWcuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogU21hbGwganBlZyBkZWNvZGVyIGxpYnJhcnkgKGhlYWRlciBmaWxlKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgTHVjIFNhaWxsYXJkIDxsdWNAc2FpbGxhcmQub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQorICogIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworCisjaWZuZGVmIF9fSlBFR0RFQ19IX18KKyNkZWZpbmUgX19KUEVHREVDX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBqZGVjX3ByaXZhdGU7CisKKy8qIEZsYWdzIHRoYXQgY2FuIGJlIHNldCBieSBhbnkgYXBwbGljYXRpb25zICovCisjZGVmaW5lIFRJTllKUEVHX0ZMQUdTX01KUEVHX1RBQkxFCSgxPDwxKQorCisvKiBGb3JtYXQgYWNjZXB0ZWQgaW4gb3V0b3V0ICovCitzdHJ1Y3QgdGlueWpwZWdfY29sb3JzcGFjZTsKK3R5cGVkZWYgY29uc3Qgc3RydWN0IHRpbnlqcGVnX2NvbG9yc3BhY2UgKnRpbnlqcGVnX2NvbG9yc3BhY2VfdDsKKworZXh0ZXJuIGNvbnN0IHRpbnlqcGVnX2NvbG9yc3BhY2VfdCBUSU5ZSlBFR19GTVRfR1JFWSwgVElOWUpQRUdfRk1UX0JHUjI0LAorICBUSU5ZSlBFR19GTVRfUkdCMjQsIFRJTllKUEVHX0ZNVF9ZVVY0MjBQLCBUSU5ZSlBFR19GTVRfQkdSQTMyLAorICBUSU5ZSlBFR19GTVRfUkdCQTMyOworCitzdHJ1Y3QgamRlY19wcml2YXRlICp0aW55anBlZ19pbml0KHZvaWQpOwordm9pZCB0aW55anBlZ19mcmVlKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYpOworCitpbnQgdGlueWpwZWdfcGFyc2VfaGVhZGVyKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpOworaW50IHRpbnlqcGVnX2RlY29kZShzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCB0aW55anBlZ19jb2xvcnNwYWNlX3QgcGl4ZWxfZm9ybWF0KTsKK2NvbnN0IGNoYXIgKnRpbnlqcGVnX2dldF9lcnJvcnN0cmluZyhzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2KTsKK3ZvaWQgdGlueWpwZWdfZ2V0X3NpemUoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgaW50ICp3aWR0aCwgdW5zaWduZWQgaW50ICpoZWlnaHQpOworaW50IHRpbnlqcGVnX2dldF9jb21wb25lbnRzKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGNoYXIgKipjb21wb25lbnRzLCB1bnNpZ25lZCBpbnQgbmNvbXBvbmVudHMpOworaW50IHRpbnlqcGVnX3NldF9jb21wb25lbnRzKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGNoYXIgKiBjb25zdCAqY29tcG9uZW50cywgdW5zaWduZWQgaW50IG5jb21wb25lbnRzKTsKK2ludCB0aW55anBlZ19nZXRfYnl0ZXNfcGVyX3JvdyhzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCB1bnNpZ25lZCBpbnQgKmJ5dGVzLCB1bnNpZ25lZCBpbnQgbmNvbXBvbmVudHMpOworaW50IHRpbnlqcGVnX3NldF9ieXRlc19wZXJfcm93KHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGNvbnN0IHVuc2lnbmVkIGludCAqYnl0ZXMsIHVuc2lnbmVkIGludCBuY29tcG9uZW50cyk7CitpbnQgdGlueWpwZWdfc2V0X2ZsYWdzKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBmbGFncyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS91bmlzdGQuaCBiL2NvbTMyL2luY2x1ZGUvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxMzM4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvdW5pc3RkLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIHVuaXN0ZC5oCisgKi8KKworI2lmbmRlZiBfVU5JU1REX0gKKyNkZWZpbmUgX1VOSVNURF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX2V4dGVybiBfX25vcmV0dXJuIF9leGl0KGludCk7CisKK19fZXh0ZXJuIGludCBvcGVuKGNvbnN0IGNoYXIgKiwgaW50LCAuLi4pOworX19leHRlcm4gaW50IGNsb3NlKGludCk7CisKK19fZXh0ZXJuIHNzaXplX3QgcmVhZChpbnQsIHZvaWQgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIHNzaXplX3Qgd3JpdGUoaW50LCBjb25zdCB2b2lkICosIHNpemVfdCk7CisKK19fZXh0ZXJuIGludCBpc2F0dHkoaW50KTsKKworX19leHRlcm4gaW50IGdldHNjcmVlbnNpemUoaW50LCBpbnQgKiwgaW50ICopOworCitfX2V4dGVybiBjaGFyICpnZXRjd2QoY2hhciAqLCBpbnQpOworX19leHRlcm4gaW50IGNoZGlyKGNvbnN0IGNoYXIgKik7CisKK19fZXh0ZXJuIHVuc2lnbmVkIGludCBzbGVlcCh1bnNpZ25lZCBpbnQpOworX19leHRlcm4gdW5zaWduZWQgaW50IG1zbGVlcCh1bnNpZ25lZCBpbnQpOworCitfX2V4dGVybiBpbnQgZ2V0b3B0KGludCwgY2hhciAqY29uc3QgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKm9wdGFyZzsKK19fZXh0ZXJuIGludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OworCisvKiBTdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3IgbnVtYmVycy4gKi8KKyNkZWZpbmUgU1RESU5fRklMRU5PCTAKKyNkZWZpbmUgU1RET1VUX0ZJTEVOTwkxCisjZGVmaW5lIFNUREVSUl9GSUxFTk8JMgorCisjZW5kaWYgLyogX1VOSVNURF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9pbmNsdWRlL3pjb25mLmggYi9jb20zMi9pbmNsdWRlL3pjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjZTU2YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2luY2x1ZGUvemNvbmYuaApAQCAtMCwwICsxLDQyOCBAQAorLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEwIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpZm5kZWYgWkNPTkZfSAorI2RlZmluZSBaQ09ORl9ICisKKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqIEV2ZW4gYmV0dGVyIHRoYW4gY29tcGlsaW5nIHdpdGggLURaX1BSRUZJWCB3b3VsZCBiZSB0byB1c2UgY29uZmlndXJlIHRvIHNldAorICogdGhpcyBwZXJtYW5lbnRseSBpbiB6Y29uZi5oIHVzaW5nICIuL2NvbmZpZ3VyZSAtLXpwcmVmaXgiLgorICovCisjaWZkZWYgWl9QUkVGSVggICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKworLyogYWxsIGxpbmtlZCBzeW1ib2xzICovCisjICBkZWZpbmUgX2Rpc3RfY29kZSAgICAgICAgICAgIHpfX2Rpc3RfY29kZQorIyAgZGVmaW5lIF9sZW5ndGhfY29kZSAgICAgICAgICB6X19sZW5ndGhfY29kZQorIyAgZGVmaW5lIF90cl9hbGlnbiAgICAgICAgICAgICB6X190cl9hbGlnbgorIyAgZGVmaW5lIF90cl9mbHVzaF9ibG9jayAgICAgICB6X190cl9mbHVzaF9ibG9jaworIyAgZGVmaW5lIF90cl9pbml0ICAgICAgICAgICAgICB6X190cl9pbml0CisjICBkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayAgICAgIHpfX3RyX3N0b3JlZF9ibG9jaworIyAgZGVmaW5lIF90cl90YWxseSAgICAgICAgICAgICB6X190cl90YWxseQorIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKKyMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgICAgICAgel9hZGxlcjMyX2NvbWJpbmUKKyMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmU2NCAgICAgel9hZGxlcjMyX2NvbWJpbmU2NAorIyAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCisjICBkZWZpbmUgY29tcHJlc3MyICAgICAgICAgICAgIHpfY29tcHJlc3MyCisjICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAorIyAgZGVmaW5lIGNyYzMyICAgICAgICAgICAgICAgICB6X2NyYzMyCisjICBkZWZpbmUgY3JjMzJfY29tYmluZSAgICAgICAgIHpfY3JjMzJfY29tYmluZQorIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmU2NCAgICAgICB6X2NyYzMyX2NvbWJpbmU2NAorIyAgZGVmaW5lIGRlZmxhdGUgICAgICAgICAgICAgICB6X2RlZmxhdGUKKyMgIGRlZmluZSBkZWZsYXRlQm91bmQgICAgICAgICAgel9kZWZsYXRlQm91bmQKKyMgIGRlZmluZSBkZWZsYXRlQ29weSAgICAgICAgICAgel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVFbmQgICAgICAgICAgICB6X2RlZmxhdGVFbmQKKyMgIGRlZmluZSBkZWZsYXRlSW5pdDJfICAgICAgICAgel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZUluaXRfICAgICAgICAgIHpfZGVmbGF0ZUluaXRfCisjICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyAgICAgICAgIHpfZGVmbGF0ZVBhcmFtcworIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQorIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAorIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgZGVmbGF0ZVNldEhlYWRlciAgICAgIHpfZGVmbGF0ZVNldEhlYWRlcgorIyAgZGVmaW5lIGRlZmxhdGVUdW5lICAgICAgICAgICB6X2RlZmxhdGVUdW5lCisjICBkZWZpbmUgZGVmbGF0ZV9jb3B5cmlnaHQgICAgIHpfZGVmbGF0ZV9jb3B5cmlnaHQKKyMgIGRlZmluZSBnZXRfY3JjX3RhYmxlICAgICAgICAgel9nZXRfY3JjX3RhYmxlCisjICBkZWZpbmUgZ3pfZXJyb3IgICAgICAgICAgICAgIHpfZ3pfZXJyb3IKKyMgIGRlZmluZSBnel9pbnRtYXggICAgICAgICAgICAgel9nel9pbnRtYXgKKyMgIGRlZmluZSBnel9zdHJ3aW5lcnJvciAgICAgICAgel9nel9zdHJ3aW5lcnJvcgorIyAgZGVmaW5lIGd6YnVmZmVyICAgICAgICAgICAgICB6X2d6YnVmZmVyCisjICBkZWZpbmUgZ3pjbGVhcmVyciAgICAgICAgICAgIHpfZ3pjbGVhcmVycgorIyAgZGVmaW5lIGd6Y2xvc2UgICAgICAgICAgICAgICB6X2d6Y2xvc2UKKyMgIGRlZmluZSBnemNsb3NlX3IgICAgICAgICAgICAgel9nemNsb3NlX3IKKyMgIGRlZmluZSBnemNsb3NlX3cgICAgICAgICAgICAgel9nemNsb3NlX3cKKyMgIGRlZmluZSBnemRpcmVjdCAgICAgICAgICAgICAgel9nemRpcmVjdAorIyAgZGVmaW5lIGd6ZG9wZW4gICAgICAgICAgICAgICB6X2d6ZG9wZW4KKyMgIGRlZmluZSBnemVvZiAgICAgICAgICAgICAgICAgel9nemVvZgorIyAgZGVmaW5lIGd6ZXJyb3IgICAgICAgICAgICAgICB6X2d6ZXJyb3IKKyMgIGRlZmluZSBnemZsdXNoICAgICAgICAgICAgICAgel9nemZsdXNoCisjICBkZWZpbmUgZ3pnZXRjICAgICAgICAgICAgICAgIHpfZ3pnZXRjCisjICBkZWZpbmUgZ3pnZXRzICAgICAgICAgICAgICAgIHpfZ3pnZXRzCisjICBkZWZpbmUgZ3pvZmZzZXQgICAgICAgICAgICAgIHpfZ3pvZmZzZXQKKyMgIGRlZmluZSBnem9mZnNldDY0ICAgICAgICAgICAgel9nem9mZnNldDY0CisjICBkZWZpbmUgZ3pvcGVuICAgICAgICAgICAgICAgIHpfZ3pvcGVuCisjICBkZWZpbmUgZ3pvcGVuNjQgICAgICAgICAgICAgIHpfZ3pvcGVuNjQKKyMgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgorIyAgZGVmaW5lIGd6cHV0YyAgICAgICAgICAgICAgICB6X2d6cHV0YworIyAgZGVmaW5lIGd6cHV0cyAgICAgICAgICAgICAgICB6X2d6cHV0cworIyAgZGVmaW5lIGd6cmVhZCAgICAgICAgICAgICAgICB6X2d6cmVhZAorIyAgZGVmaW5lIGd6cmV3aW5kICAgICAgICAgICAgICB6X2d6cmV3aW5kCisjICBkZWZpbmUgZ3pzZWVrICAgICAgICAgICAgICAgIHpfZ3pzZWVrCisjICBkZWZpbmUgZ3pzZWVrNjQgICAgICAgICAgICAgIHpfZ3pzZWVrNjQKKyMgIGRlZmluZSBnenNldHBhcmFtcyAgICAgICAgICAgel9nenNldHBhcmFtcworIyAgZGVmaW5lIGd6dGVsbCAgICAgICAgICAgICAgICB6X2d6dGVsbAorIyAgZGVmaW5lIGd6dGVsbDY0ICAgICAgICAgICAgICB6X2d6dGVsbDY0CisjICBkZWZpbmUgZ3p1bmdldGMgICAgICAgICAgICAgIHpfZ3p1bmdldGMKKyMgIGRlZmluZSBnendyaXRlICAgICAgICAgICAgICAgel9nendyaXRlCisjICBkZWZpbmUgaW5mbGF0ZSAgICAgICAgICAgICAgIHpfaW5mbGF0ZQorIyAgZGVmaW5lIGluZmxhdGVCYWNrICAgICAgICAgICB6X2luZmxhdGVCYWNrCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgICAgICAgIHpfaW5mbGF0ZUJhY2tFbmQKKyMgIGRlZmluZSBpbmZsYXRlQmFja0luaXRfICAgICAgel9pbmZsYXRlQmFja0luaXRfCisjICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgaW5mbGF0ZUdldEhlYWRlciAgICAgIHpfaW5mbGF0ZUdldEhlYWRlcgorIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlTWFyayAgICAgICAgICAgel9pbmZsYXRlTWFyaworIyAgZGVmaW5lIGluZmxhdGVQcmltZSAgICAgICAgICB6X2luZmxhdGVQcmltZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGluZmxhdGVSZXNldDIgICAgICAgICB6X2luZmxhdGVSZXNldDIKKyMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCisjICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAorIyAgZGVmaW5lIGluZmxhdGVVbmRlcm1pbmUgICAgICB6X2luZmxhdGVVbmRlcm1pbmUKKyMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAorIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKKyMgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCisjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisjICBkZWZpbmUgemNhbGxvYyAgICAgICAgICAgICAgIHpfemNhbGxvYworIyAgZGVmaW5lIHpjZnJlZSAgICAgICAgICAgICAgICB6X3pjZnJlZQorIyAgZGVmaW5lIHpsaWJDb21waWxlRmxhZ3MgICAgICB6X3psaWJDb21waWxlRmxhZ3MKKyMgIGRlZmluZSB6bGliVmVyc2lvbiAgICAgICAgICAgel96bGliVmVyc2lvbgorCisvKiBhbGwgemxpYiB0eXBlZGVmcyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCisjICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCisjICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKKyMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKKyMgIGRlZmluZSBnekZpbGUgICAgICAgICAgICAgICAgel9nekZpbGUKKyMgIGRlZmluZSBnel9oZWFkZXIgICAgICAgICAgICAgel9nel9oZWFkZXIKKyMgIGRlZmluZSBnel9oZWFkZXJwICAgICAgICAgICAgel9nel9oZWFkZXJwCisjICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYworIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYworIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKKyMgIGRlZmluZSB2b2lkcGMgICAgICAgICAgICAgICAgel92b2lkcGMKKyMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKKworLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGRlZmluZSBnel9oZWFkZXJfcyAgICAgICAgICAgel9nel9oZWFkZXJfcworIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQorIyAgZGVmaW5lIE1TRE9TCisjZW5kaWYKKyNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCisjICBkZWZpbmUgT1MyCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQorIyAgZGVmaW5lIFdJTkRPV1MKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorIyAgaWZuZGVmIFdJTjMyCisjICAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCisjICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCisjICAgIGlmbmRlZiBTWVMxNkJJVAorIyAgICAgIGRlZmluZSBTWVMxNkJJVAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKgorICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKKyAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBkZWZpbmUgTUFYU0VHXzY0SworI2VuZGlmCisjaWZkZWYgTVNET1MKKyMgIGRlZmluZSBVTkFMSUdORURfT0sKKyNlbmRpZgorCisjaWZkZWYgX19TVERDX1ZFUlNJT05fXworIyAgaWZuZGVmIFNUREMKKyMgICAgZGVmaW5lIFNUREMKKyMgIGVuZGlmCisjICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICAgaWZuZGVmIFNUREM5OQorIyAgICAgIGRlZmluZSBTVERDOTkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZm5kZWYgU1REQworIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLworIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogU29tZSBNYWMgY29tcGlsZXJzIG1lcmdlIGFsbCAuaCBmaWxlcyBpbmNvcnJlY3RseTogKi8KKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pfHxkZWZpbmVkKGFwcGxlYyl8fGRlZmluZWQoVEhJTktfQyl8fGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIE5PX0RVTU1ZX0RFQ0wKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KKyNpZm5kZWYgTUFYX01FTV9MRVZFTAorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA4CisjICBlbHNlCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3Igd2luZG93Qml0cyBpbiBkZWZsYXRlSW5pdDIgYW5kIGluZmxhdGVJbml0Mi4KKyAqIFdBUk5JTkc6IHJlZHVjaW5nIE1BWF9XQklUUyBtYWtlcyBtaW5pZ3ppcCB1bmFibGUgdG8gZXh0cmFjdCAuZ3ogZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZ3ppcC4gKEZpbGVzIGNyZWF0ZWQgYnkgbWluaWd6aXAgY2FuIHN0aWxsIGJlIGV4dHJhY3RlZCBieQorICogZ3ppcC4pCisgKi8KKyNpZm5kZWYgTUFYX1dCSVRTCisjICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCisjZW5kaWYKKworLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CisgICAgICAgICAgICAoMSA8PCAod2luZG93Qml0cysyKSkgKyAgKDEgPDwgKG1lbUxldmVsKzkpKQorIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHM9MTUgICsgIDEyOEsgZm9yIG1lbUxldmVsID0gOCAgKGRlZmF1bHQgdmFsdWVzKQorIHBsdXMgYSBmZXcga2lsb2J5dGVzIGZvciBzbWFsbCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVkdWNlCisgdGhlIGRlZmF1bHQgbWVtb3J5IHJlcXVpcmVtZW50cyBmcm9tIDI1NksgdG8gMTI4SywgY29tcGlsZSB3aXRoCisgICAgIG1ha2UgQ0ZMQUdTPSItTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NyIKKyBPZiBjb3Vyc2UgdGhpcyB3aWxsIGdlbmVyYWxseSBkZWdyYWRlIGNvbXByZXNzaW9uICh0aGVyZSdzIG5vIGZyZWUgbHVuY2gpLgorCisgICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5mbGF0ZSBhcmUgKGluIGJ5dGVzKSAxIDw8IHdpbmRvd0JpdHMKKyB0aGF0IGlzLCAzMksgZm9yIHdpbmRvd0JpdHM9MTUgKGRlZmF1bHQgdmFsdWUpIHBsdXMgYSBmZXcga2lsb2J5dGVzCisgZm9yIHNtYWxsIG9iamVjdHMuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE9GIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyMgIGlmZGVmIFNUREMKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBPRihhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKKyAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKKyAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKKyAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKKyAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9NU0NfVkVSCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKKyAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCisgICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQorIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmICAvKiBaTElCX0RMTCAqLworICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCisgICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCisgICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9XSU5BUEkKKyMgICAgaWZkZWYgRkFSCisjICAgICAgdW5kZWYgRkFSCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCisgICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCisjICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQorIyAgICBpZmRlZiBXSU4zMgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaRVhURVJOCisjICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0ggICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfSEFWRV9VTklTVERfSAorI2VuZGlmCisKKyNpZmRlZiBTVERDCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgLyogZm9yIG9mZl90ICovCisjZW5kaWYKKworLyogYSBsaXR0bGUgdHJpY2sgdG8gYWNjb21tb2RhdGUgYm90aCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQKKyAqICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMSIgYXMgcmVxdWVzdGluZyA2NC1iaXQgb3BlcmF0aW9ucywgKGV2ZW4KKyAqIHRob3VnaCB0aGUgZm9ybWVyIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExGUyBkb2N1bWVudCksIGJ1dCBjb25zaWRlcmluZworICogYm90aCAiI3VuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDAiIGFzCisgKiBlcXVpdmFsZW50bHkgcmVxdWVzdGluZyBubyA2NC1iaXQgb3BlcmF0aW9ucworICovCisjaWYgLV9MQVJHRUZJTEU2NF9TT1VSQ0UgLSAtMSA9PSAxCisjICB1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjZW5kaWYKKworI2lmIGRlZmluZWQoWl9IQVZFX1VOSVNURF9IKSB8fCBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpCisjICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KKyMgIGlmZGVmIFZNUworIyAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAgIC8qIGZvciBvZmZfdCAqLworIyAgZW5kaWYKKyMgIGlmbmRlZiB6X29mZl90CisjICAgIGRlZmluZSB6X29mZl90IG9mZl90CisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU0VFS19TRVQKKyMgIGRlZmluZSBTRUVLX1NFVCAgICAgICAgMCAgICAgICAvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworIyAgZGVmaW5lIFNFRUtfQ1VSICAgICAgICAxICAgICAgIC8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgIGRlZmluZSBTRUVLX0VORCAgICAgICAgMiAgICAgICAvKiBTZXQgZmlsZSBwb2ludGVyIHRvIEVPRiBwbHVzICJvZmZzZXQiICovCisjZW5kaWYKKworI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgel9vZmZfdCBsb25nCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgX0xGUzY0X0xBUkdFRklMRS0wCisjICBkZWZpbmUgel9vZmY2NF90IG9mZjY0X3QKKyNlbHNlCisjICBkZWZpbmUgel9vZmY2NF90IHpfb2ZmX3QKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgIGRlZmluZSBOT192c25wcmludGYKKyNlbmRpZgorCisvKiBNVlMgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgbmFtZXMgbGFyZ2VyIHRoYW4gOCBieXRlcyAqLworI2lmIGRlZmluZWQoX19NVlNfXykKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorICAjcHJhZ21hIG1hcChkZWZsYXRlRW5kLCJERUVORCIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorICAjcHJhZ21hIG1hcChpbmZsYXRlSW5pdDJfLCJJTklOMiIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlU2V0RGljdGlvbmFyeSwiSU5TRURJIikKKyAgI3ByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKKyNlbmRpZgorCisjZW5kaWYgLyogWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvaW5jbHVkZS96bGliLmggYi9jb20zMi9pbmNsdWRlL3psaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmJiYTgzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvaW5jbHVkZS96bGliLmgKQEAgLTAsMCArMSwxNjEzIEBACisvKiB6bGliLmggLS0gaW50ZXJmYWNlIG9mIHRoZSAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAgdmVyc2lvbiAxLjIuNSwgQXByaWwgMTl0aCwgMjAxMAorCisgIENvcHlyaWdodCAoQykgMTk5NS0yMDEwIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgorICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgorICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dAorICAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpIGFuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLgorKi8KKworI2lmbmRlZiBaTElCX0gKKyNkZWZpbmUgWkxJQl9ICisKKyNpbmNsdWRlICJ6Y29uZi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuNSIKKyNkZWZpbmUgWkxJQl9WRVJOVU0gMHgxMjUwCisjZGVmaW5lIFpMSUJfVkVSX01BSk9SIDEKKyNkZWZpbmUgWkxJQl9WRVJfTUlOT1IgMgorI2RlZmluZSBaTElCX1ZFUl9SRVZJU0lPTiA1CisjZGVmaW5lIFpMSUJfVkVSX1NVQlJFVklTSU9OIDAKKworLyoKKyAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAorICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kIChkZWZsYXRpb24pCisgIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZSBzdHJlYW0KKyAgaW50ZXJmYWNlLgorCisgICAgQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UgZW5vdWdoLAorICBvciBjYW4gYmUgZG9uZSBieSByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uICBJbiB0aGUgbGF0dGVyCisgIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CisgIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisKKyAgICBUaGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGluLW1lbW9yeSBmdW5jdGlvbnMgaXMKKyAgdGhlIHpsaWIgZm9ybWF0LCB3aGljaCBpcyBhIHpsaWIgd3JhcHBlciBkb2N1bWVudGVkIGluIFJGQyAxOTUwLCB3cmFwcGVkCisgIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLCB3aGljaCBpcyBpdHNlbGYgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MS4KKworICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAorICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8gdXNpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0CisgIHdpdGggImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEKKyAgZ3ppcCB3cmFwcGVyLCBkb2N1bWVudGVkIGluIFJGQyAxOTUyLCB3cmFwcGVkIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLgorCisgICAgVGhpcyBsaWJyYXJ5IGNhbiBvcHRpb25hbGx5IHJlYWQgYW5kIHdyaXRlIGd6aXAgc3RyZWFtcyBpbiBtZW1vcnkgYXMgd2VsbC4KKworICAgIFRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQgdG8gYmUgY29tcGFjdCBhbmQgZmFzdCBmb3IgdXNlIGluIG1lbW9yeQorICBhbmQgb24gY29tbXVuaWNhdGlvbnMgY2hhbm5lbHMuICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIGZvciBzaW5nbGUtCisgIGZpbGUgY29tcHJlc3Npb24gb24gZmlsZSBzeXN0ZW1zLCBoYXMgYSBsYXJnZXIgaGVhZGVyIHRoYW4gemxpYiB0byBtYWludGFpbgorICBkaXJlY3RvcnkgaW5mb3JtYXRpb24sIGFuZCB1c2VzIGEgZGlmZmVyZW50LCBzbG93ZXIgY2hlY2sgbWV0aG9kIHRoYW4gemxpYi4KKworICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiAgVGhlIGRlY29kZXIgY2hlY2tzCisgIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIgY3Jhc2gKKyAgZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KKyovCisKK3R5cGVkZWYgdm9pZHBmICgqYWxsb2NfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOwordHlwZWRlZiB2b2lkICAgKCpmcmVlX2Z1bmMpICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIGFkZHJlc3MpKTsKKworc3RydWN0IGludGVybmFsX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB6X3N0cmVhbV9zIHsKKyAgICBCeXRlZiAgICAqbmV4dF9pbjsgIC8qIG5leHQgaW5wdXQgYnl0ZSAqLworICAgIHVJbnQgICAgIGF2YWlsX2luOyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICovCisgICAgdUxvbmcgICAgdG90YWxfaW47ICAvKiB0b3RhbCBuYiBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLworCisgICAgQnl0ZWYgICAgKm5leHRfb3V0OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KKyAgICB1SW50ICAgICBhdmFpbF9vdXQ7IC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0ICovCisgICAgdUxvbmcgICAgdG90YWxfb3V0OyAvKiB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCisKKyAgICBjaGFyICAgICAqbXNnOyAgICAgIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqLworICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKnN0YXRlOyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KKworICAgIGFsbG9jX2Z1bmMgemFsbG9jOyAgLyogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICBmcmVlX2Z1bmMgIHpmcmVlOyAgIC8qIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICB2b2lkcGYgICAgIG9wYXF1ZTsgIC8qIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUgKi8KKworICAgIGludCAgICAgZGF0YV90eXBlOyAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqLworICAgIHVMb25nICAgYWRsZXI7ICAgICAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgICB1TG9uZyAgIHJlc2VydmVkOyAgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9IHpfc3RyZWFtOworCit0eXBlZGVmIHpfc3RyZWFtIEZBUiAqel9zdHJlYW1wOworCisvKgorICAgICBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gYW5kIGZyb20gemxpYiByb3V0aW5lcy4gIFNlZSBSRkMgMTk1MgorICBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBtZWFuaW5ncyBvZiB0aGVzZSBmaWVsZHMuCisqLwordHlwZWRlZiBzdHJ1Y3QgZ3pfaGVhZGVyX3MgeworICAgIGludCAgICAgdGV4dDsgICAgICAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqLworICAgIHVMb25nICAgdGltZTsgICAgICAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KKyAgICBpbnQgICAgIHhmbGFnczsgICAgIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCisgICAgaW50ICAgICBvczsgICAgICAgICAvKiBvcGVyYXRpbmcgc3lzdGVtICovCisgICAgQnl0ZWYgICAqZXh0cmE7ICAgICAvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovCisgICAgdUludCAgICBleHRyYV9sZW47ICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi8KKyAgICB1SW50ICAgIGV4dHJhX21heDsgIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisgICAgQnl0ZWYgICAqbmFtZTsgICAgICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovCisgICAgdUludCAgICBuYW1lX21heDsgICAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisgICAgQnl0ZWYgICAqY29tbWVudDsgICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqLworICAgIHVJbnQgICAgY29tbV9tYXg7ICAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworICAgIGludCAgICAgaGNyYzsgICAgICAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi8KKyAgICBpbnQgICAgIGRvbmU7ICAgICAgIC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCit9IGd6X2hlYWRlcjsKKwordHlwZWRlZiBnel9oZWFkZXIgRkFSICpnel9oZWFkZXJwOworCisvKgorICAgICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4gd2hlbiBhdmFpbF9pbiBoYXMgZHJvcHBlZAorICAgdG8gemVyby4gIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQgaGFzIGRyb3BwZWQKKyAgIHRvIHplcm8uICBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBiZWZvcmUKKyAgIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uICBBbGwgb3RoZXIgZmllbGRzIGFyZSBzZXQgYnkgdGhlIGNvbXByZXNzaW9uCisgICBsaWJyYXJ5IGFuZCBtdXN0IG5vdCBiZSB1cGRhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKworICAgICBUaGUgb3BhcXVlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QKKyAgIHBhcmFtZXRlciBmb3IgY2FsbHMgb2YgemFsbG9jIGFuZCB6ZnJlZS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3VzdG9tCisgICBtZW1vcnkgbWFuYWdlbWVudC4gIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCisgICBvcGFxdWUgdmFsdWUuCisKKyAgICAgemFsbG9jIG11c3QgcmV0dXJuIFpfTlVMTCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG9iamVjdC4KKyAgIElmIHpsaWIgaXMgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUKKyAgIHRocmVhZCBzYWZlLgorCisgICAgIE9uIDE2LWJpdCBzeXN0ZW1zLCB0aGUgZnVuY3Rpb25zIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZSBhYmxlIHRvIGFsbG9jYXRlCisgICBleGFjdGx5IDY1NTM2IGJ5dGVzLCBidXQgd2lsbCBub3QgYmUgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMgaWYKKyAgIHRoZSBzeW1ib2wgTUFYU0VHXzY0SyBpcyBkZWZpbmVkIChzZWUgemNvbmYuaCkuICBXQVJOSU5HOiBPbiBNU0RPUywgcG9pbnRlcnMKKyAgIHJldHVybmVkIGJ5IHphbGxvYyBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KiBoYXZlIHRoZWlyCisgICBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiAgVGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbiBwcm92aWRlZCBieSB0aGlzCisgICBsaWJyYXJ5IGVuc3VyZXMgdGhpcyAoc2VlIHp1dGlsLmMpLiAgVG8gcmVkdWNlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIGF2b2lkCisgICBhbnkgYWxsb2NhdGlvbiBvZiA2NEsgb2JqZWN0cywgYXQgdGhlIGV4cGVuc2Ugb2YgY29tcHJlc3Npb24gcmF0aW8sIGNvbXBpbGUKKyAgIHRoZSBsaWJyYXJ5IHdpdGggLURNQVhfV0JJVFM9MTQgKHNlZSB6Y29uZi5oKS4KKworICAgICBUaGUgZmllbGRzIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IgcHJvZ3Jlc3MKKyAgIHJlcG9ydHMuICBBZnRlciBjb21wcmVzc2lvbiwgdG90YWxfaW4gaG9sZHMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBhbmQgbWF5IGJlIHNhdmVkIGZvciB1c2UgaW4gdGhlIGRlY29tcHJlc3NvciAocGFydGljdWxhcmx5CisgICBpZiB0aGUgZGVjb21wcmVzc29yIHdhbnRzIHRvIGRlY29tcHJlc3MgZXZlcnl0aGluZyBpbiBhIHNpbmdsZSBzdGVwKS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50cyAqLworCisjZGVmaW5lIFpfTk9fRkxVU0ggICAgICAwCisjZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxCisjZGVmaW5lIFpfU1lOQ19GTFVTSCAgICAyCisjZGVmaW5lIFpfRlVMTF9GTFVTSCAgICAzCisjZGVmaW5lIFpfRklOSVNIICAgICAgICA0CisjZGVmaW5lIFpfQkxPQ0sgICAgICAgICA1CisjZGVmaW5lIFpfVFJFRVMgICAgICAgICA2CisvKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9PSyAgICAgICAgICAgIDAKKyNkZWZpbmUgWl9TVFJFQU1fRU5EICAgIDEKKyNkZWZpbmUgWl9ORUVEX0RJQ1QgICAgIDIKKyNkZWZpbmUgWl9FUlJOTyAgICAgICAgKC0xKQorI2RlZmluZSBaX1NUUkVBTV9FUlJPUiAoLTIpCisjZGVmaW5lIFpfREFUQV9FUlJPUiAgICgtMykKKyNkZWZpbmUgWl9NRU1fRVJST1IgICAgKC00KQorI2RlZmluZSBaX0JVRl9FUlJPUiAgICAoLTUpCisjZGVmaW5lIFpfVkVSU0lPTl9FUlJPUiAoLTYpCisvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzCisgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuCisgKi8KKworI2RlZmluZSBaX05PX0NPTVBSRVNTSU9OICAgICAgICAgMAorI2RlZmluZSBaX0JFU1RfU1BFRUQgICAgICAgICAgICAgMQorI2RlZmluZSBaX0JFU1RfQ09NUFJFU1NJT04gICAgICAgOQorI2RlZmluZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04gICgtMSkKKy8qIGNvbXByZXNzaW9uIGxldmVscyAqLworCisjZGVmaW5lIFpfRklMVEVSRUQgICAgICAgICAgICAxCisjZGVmaW5lIFpfSFVGRk1BTl9PTkxZICAgICAgICAyCisjZGVmaW5lIFpfUkxFICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFpfRklYRUQgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpfREVGQVVMVF9TVFJBVEVHWSAgICAwCisvKiBjb21wcmVzc2lvbiBzdHJhdGVneTsgc2VlIGRlZmxhdGVJbml0MigpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9CSU5BUlkgICAwCisjZGVmaW5lIFpfVEVYVCAgICAgMQorI2RlZmluZSBaX0FTQ0lJICAgIFpfVEVYVCAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4yLjIgYW5kIGVhcmxpZXIgKi8KKyNkZWZpbmUgWl9VTktOT1dOICAyCisvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovCisKKyNkZWZpbmUgWl9ERUZMQVRFRCAgIDgKKy8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAodGhlIG9ubHkgb25lIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24pICovCisKKyNkZWZpbmUgWl9OVUxMICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIHphbGxvYywgemZyZWUsIG9wYXF1ZSAqLworCisjZGVmaW5lIHpsaWJfdmVyc2lvbiB6bGliVmVyc2lvbigpCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIDwgMS4wLjIgKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KKworWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCB6bGliVmVyc2lvbiBPRigodm9pZCkpOworLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJWZXJzaW9uIGFuZCBaTElCX1ZFUlNJT04gZm9yIGNvbnNpc3RlbmN5LgorICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMgbm90CisgICBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2hlY2sKKyAgIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQuCisgKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgbGV2ZWwpKTsKKworICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBjb21wcmVzc2lvbi4gIFRoZSBmaWVsZHMKKyAgIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUgY2FsbGVyLiAgSWYKKyAgIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGRlZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0byB1c2UgZGVmYXVsdAorICAgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgICAgVGhlIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBvciBiZXR3ZWVuIDAgYW5kIDk6CisgICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdCBhbGwKKyAgICh0aGUgaW5wdXQgZGF0YSBpcyBzaW1wbHkgY29waWVkIGEgYmxvY2sgYXQgYSB0aW1lKS4gIFpfREVGQVVMVF9DT01QUkVTU0lPTgorICAgcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQgY29tcHJlc3Npb24gKGN1cnJlbnRseQorICAgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KKworICAgICBkZWZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgbGV2ZWwgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbGV2ZWwsIG9yCisgICBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICh6bGliX3ZlcnNpb24pIGlzIGluY29tcGF0aWJsZQorICAgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuICBtc2cgaXMgc2V0IHRvIG51bGwKKyAgIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdCBkb2VzIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjoKKyAgIHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CisvKgorICAgIGRlZmxhdGUgY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuICBJdCBtYXkgaW50cm9kdWNlCisgIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgZm9yY2VkIHRvIGZsdXNoLgorCisgICAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gQ29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KKyAgICBhY2NvcmRpbmdseS4gIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKKyAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gYW5kIGF2YWlsX2luIGFyZSB1cGRhdGVkIGFuZAorICAgIHByb2Nlc3Npbmcgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCisKKyAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAorICAgIGFjY29yZGluZ2x5LiAgVGhpcyBhY3Rpb24gaXMgZm9yY2VkIGlmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgbm9uIHplcm8uCisgICAgRm9yY2luZyBmbHVzaCBmcmVxdWVudGx5IGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbywgc28gdGhpcyBwYXJhbWV0ZXIKKyAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuICBTb21lCisgICAgb3V0cHV0IG1heSBiZSBwcm92aWRlZCBldmVuIGlmIGZsdXNoIGlzIG5vdCBzZXQuCisKKyAgICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CisgIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZyBtb3JlCisgIG91dHB1dCwgYW5kIHVwZGF0aW5nIGF2YWlsX2luIG9yIGF2YWlsX291dCBhY2NvcmRpbmdseTsgYXZhaWxfb3V0IHNob3VsZAorICBuZXZlciBiZSB6ZXJvIGJlZm9yZSB0aGUgY2FsbC4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgY29tcHJlc3NlZAorICBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQKKyAgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiBkZWZsYXRlKCkuICBJZiBkZWZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aAorICB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dAorICBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgorCisgICAgTm9ybWFsbHkgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9OT19GTFVTSCwgd2hpY2ggYWxsb3dzIGRlZmxhdGUgdG8KKyAgZGVjaWRlIGhvdyBtdWNoIGRhdGEgdG8gYWNjdW11bGF0ZSBiZWZvcmUgcHJvZHVjaW5nIG91dHB1dCwgaW4gb3JkZXIgdG8KKyAgbWF4aW1pemUgY29tcHJlc3Npb24uCisKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX1NZTkNfRkxVU0gsIGFsbCBwZW5kaW5nIG91dHB1dCBpcworICBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0aGUgb3V0cHV0IGlzIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBzbworICB0aGF0IHRoZSBkZWNvbXByZXNzb3IgY2FuIGdldCBhbGwgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAgKEluCisgIHBhcnRpY3VsYXIgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuCisgIHByb3ZpZGVkIGJlZm9yZSB0aGUgY2FsbC4pIEZsdXNoaW5nIG1heSBkZWdyYWRlIGNvbXByZXNzaW9uIGZvciBzb21lCisgIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgYW5kIHNvIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuICBUaGlzCisgIGNvbXBsZXRlcyB0aGUgY3VycmVudCBkZWZsYXRlIGJsb2NrIGFuZCBmb2xsb3dzIGl0IHdpdGggYW4gZW1wdHkgc3RvcmVkIGJsb2NrCisgIHRoYXQgaXMgdGhyZWUgYml0cyBwbHVzIGZpbGxlciBiaXRzIHRvIHRoZSBuZXh0IGJ5dGUsIGZvbGxvd2VkIGJ5IGZvdXIgYnl0ZXMKKyAgKDAwIDAwIGZmIGZmKS4KKworICAgIElmIGZsdXNoIGlzIHNldCB0byBaX1BBUlRJQUxfRkxVU0gsIGFsbCBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIHRvIHRoZQorICBvdXRwdXQgYnVmZmVyLCBidXQgdGhlIG91dHB1dCBpcyBub3QgYWxpZ25lZCB0byBhIGJ5dGUgYm91bmRhcnkuICBBbGwgb2YgdGhlCisgIGlucHV0IGRhdGEgc28gZmFyIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBkZWNvbXByZXNzb3IsIGFzIGZvciBaX1NZTkNfRkxVU0guCisgIFRoaXMgY29tcGxldGVzIHRoZSBjdXJyZW50IGRlZmxhdGUgYmxvY2sgYW5kIGZvbGxvd3MgaXQgd2l0aCBhbiBlbXB0eSBmaXhlZAorICBjb2RlcyBibG9jayB0aGF0IGlzIDEwIGJpdHMgbG9uZy4gIFRoaXMgYXNzdXJlcyB0aGF0IGVub3VnaCBieXRlcyBhcmUgb3V0cHV0CisgIGluIG9yZGVyIGZvciB0aGUgZGVjb21wcmVzc29yIHRvIGZpbmlzaCB0aGUgYmxvY2sgYmVmb3JlIHRoZSBlbXB0eSBmaXhlZCBjb2RlCisgIGJsb2NrLgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfQkxPQ0ssIGEgZGVmbGF0ZSBibG9jayBpcyBjb21wbGV0ZWQgYW5kIGVtaXR0ZWQsIGFzCisgIGZvciBaX1NZTkNfRkxVU0gsIGJ1dCB0aGUgb3V0cHV0IGlzIG5vdCBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgYW5kIHVwIHRvCisgIHNldmVuIGJpdHMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgYXJlIGhlbGQgdG8gYmUgd3JpdHRlbiBhcyB0aGUgbmV4dCBieXRlIGFmdGVyCisgIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgaXMgY29tcGxldGVkLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGVjb21wcmVzc29yIG1heSBub3QKKyAgYmUgcHJvdmlkZWQgZW5vdWdoIGJpdHMgYXQgdGhpcyBwb2ludCBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIG9mCisgIHRoZSBkYXRhIHByb3ZpZGVkIHNvIGZhciB0byB0aGUgY29tcHJlc3Nvci4gIEl0IG1heSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0CisgIGJsb2NrIHRvIGJlIGVtaXR0ZWQuICBUaGlzIGlzIGZvciBhZHZhbmNlZCBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGNvbnRyb2wKKyAgdGhlIGVtaXNzaW9uIG9mIGRlZmxhdGUgYmxvY2tzLgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfRlVMTF9GTFVTSCwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKKyAgWl9TWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KKyAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKKyAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiAgVXNpbmcgWl9GVUxMX0ZMVVNIIHRvbyBvZnRlbiBjYW4gc2VyaW91c2x5IGRlZ3JhZGUKKyAgY29tcHJlc3Npb24uCisKKyAgICBJZiBkZWZsYXRlIHJldHVybnMgd2l0aCBhdmFpbF9vdXQgPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgorICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCisgIGF2YWlsX291dCksIHVudGlsIHRoZSBmbHVzaCBpcyBjb21wbGV0ZSAoZGVmbGF0ZSByZXR1cm5zIHdpdGggbm9uLXplcm8KKyAgYXZhaWxfb3V0KS4gIEluIHRoZSBjYXNlIG9mIGEgWl9GVUxMX0ZMVVNIIG9yIFpfU1lOQ19GTFVTSCwgbWFrZSBzdXJlIHRoYXQKKyAgYXZhaWxfb3V0IGlzIGdyZWF0ZXIgdGhhbiBzaXggdG8gYXZvaWQgcmVwZWF0ZWQgZmx1c2ggbWFya2VycyBkdWUgdG8KKyAgYXZhaWxfb3V0ID09IDAgb24gcmV0dXJuLgorCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9GSU5JU0gsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkLAorICBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIGFuZCBkZWZsYXRlIHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgaWYgdGhlcmUgd2FzCisgIGVub3VnaCBvdXRwdXQgc3BhY2U7IGlmIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfT0ssIHRoaXMgZnVuY3Rpb24gbXVzdCBiZQorICBjYWxsZWQgYWdhaW4gd2l0aCBaX0ZJTklTSCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQgYXZhaWxfb3V0KSBidXQgbm8KKyAgbW9yZSBpbnB1dCBkYXRhLCB1bnRpbCBpdCByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIG9yIGFuIGVycm9yLiAgQWZ0ZXIKKyAgZGVmbGF0ZSBoYXMgcmV0dXJuZWQgWl9TVFJFQU1fRU5ELCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZSBzdHJlYW0KKyAgYXJlIGRlZmxhdGVSZXNldCBvciBkZWZsYXRlRW5kLgorCisgICAgWl9GSU5JU0ggY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQgaWYgYWxsIHRoZSBjb21wcmVzc2lvbgorICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuICBJbiB0aGlzIGNhc2UsIGF2YWlsX291dCBtdXN0IGJlIGF0IGxlYXN0IHRoZQorICB2YWx1ZSByZXR1cm5lZCBieSBkZWZsYXRlQm91bmQgKHNlZSBiZWxvdykuICBJZiBkZWZsYXRlIGRvZXMgbm90IHJldHVybgorICBaX1NUUkVBTV9FTkQsIHRoZW4gaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgorCisgICAgZGVmbGF0ZSgpIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIGlucHV0IHJlYWQKKyAgc28gZmFyICh0aGF0IGlzLCB0b3RhbF9pbiBieXRlcykuCisKKyAgICBkZWZsYXRlKCkgbWF5IHVwZGF0ZSBzdHJtLT5kYXRhX3R5cGUgaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0CisgIHRoZSBpbnB1dCBkYXRhIHR5cGUgKFpfQklOQVJZIG9yIFpfVEVYVCkuICBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAorICBiaW5hcnkuICBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QgdGhlCisgIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgorCisgICAgZGVmbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKKyAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIGFsbCBpbnB1dCBoYXMgYmVlbgorICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bworICBaX0ZJTklTSCksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKKyAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuICBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90CisgIGZhdGFsLCBhbmQgZGVmbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dAorICBzcGFjZSB0byBjb250aW51ZSBjb21wcmVzc2luZy4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICAgb3V0cHV0LgorCisgICAgIGRlZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAorICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiAgSW4gdGhlIGVycm9yIGNhc2UsIG1zZworICAgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQorICAgZGVhbGxvY2F0ZWQpLgorKi8KKworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKworICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiAgVGhlIGZpZWxkcworICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQorICAgdGhlIGNhbGxlci4gIElmIG5leHRfaW4gaXMgbm90IFpfTlVMTCBhbmQgYXZhaWxfaW4gaXMgbGFyZ2UgZW5vdWdoICh0aGUKKyAgIGV4YWN0IHZhbHVlIGRlcGVuZHMgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCksIGluZmxhdGVJbml0IGRldGVybWluZXMgdGhlCisgICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCisgICBhY2NvcmRpbmdseTsgb3RoZXJ3aXNlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKKyAgIGluZmxhdGUuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBpbmZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KKyAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorCisgICAgIGluZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQorICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCisgICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgorICAgYXBhcnQgZnJvbSBwb3NzaWJseSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiBhY3R1YWwgZGVjb21wcmVzc2lvbgorICAgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dAorICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgb2YgaW5mbGF0ZUluaXQoKSBkb2VzIG5vdCBwcm9jZXNzIGFueSBoZWFkZXIgaW5mb3JtYXRpb24gLS0gdGhhdCBpcyBkZWZlcnJlZAorICAgdW50aWwgaW5mbGF0ZSgpIGlzIGNhbGxlZC4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CisvKgorICAgIGluZmxhdGUgZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gIEl0IG1heSBpbnRyb2R1Y2UKKyAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgorICBmb3JjZWQgdG8gZmx1c2guCisKKyAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nIHdpbGwKKyAgICByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCisKKyAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAorICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZSBpcworICAgIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cgYWJvdXQKKyAgICB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KKworICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nIG1vcmUKKyAgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuICBUaGUKKyAgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUKKyAgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZgorICBpbmZsYXRlKCkuICBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZQorICBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZQorICBtb3JlIG91dHB1dCBwZW5kaW5nLgorCisgICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwgWl9GSU5JU0gsCisgIFpfQkxPQ0ssIG9yIFpfVFJFRVMuICBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAorICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuICBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpCisgIHN0b3AgaWYgYW5kIHdoZW4gaXQgZ2V0cyB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiAgV2hlbiBkZWNvZGluZworICB0aGUgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkKKyAgYWZ0ZXIgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwKKyAgaW5mbGF0ZSgpIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdAorICBnZXRzIHRvIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgorCisgICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCisgIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQgaWYKKyAgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sIHBsdXMKKyAgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sgY29kZSBvcgorICBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBkZWZsYXRlCisgIHN0cmVhbS4gIFRoZSBlbmQtb2YtYmxvY2sgd2lsbCBub3QgYmUgaW5kaWNhdGVkIHVudGlsIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkCisgIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gdG8gc3RybS0+bmV4dF9vdXQuICBUaGUgbnVtYmVyIG9mCisgIHVudXNlZCBiaXRzIG1heSBpbiBnZW5lcmFsIGJlIGdyZWF0ZXIgdGhhbiBzZXZlbiwgZXhjZXB0IHdoZW4gYml0IDcgb2YKKyAgZGF0YV90eXBlIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIHdpbGwgYmUgbGVzcyB0aGFuCisgIGVpZ2h0LiAgZGF0YV90eXBlIGlzIHNldCBhcyBub3RlZCBoZXJlIGV2ZXJ5IHRpbWUgaW5mbGF0ZSgpIHJldHVybnMgZm9yIGFsbAorICBmbHVzaCBvcHRpb25zLCBhbmQgc28gY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgY3VycmVudGx5CisgIGNvbnN1bWVkIGlucHV0IGluIGJpdHMuCisKKyAgICBUaGUgWl9UUkVFUyBvcHRpb24gYmVoYXZlcyBhcyBaX0JMT0NLIGRvZXMsIGJ1dCBpdCBhbHNvIHJldHVybnMgd2hlbiB0aGUKKyAgZW5kIG9mIGVhY2ggZGVmbGF0ZSBibG9jayBoZWFkZXIgaXMgcmVhY2hlZCwgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpbiB0aGF0CisgIGJsb2NrIGlzIGRlY29kZWQuICBUaGlzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZQorICBkZWZsYXRlIGJsb2NrIGhlYWRlciBmb3IgbGF0ZXIgdXNlIGluIHJhbmRvbSBhY2Nlc3Mgd2l0aGluIGEgZGVmbGF0ZSBibG9jay4KKyAgMjU2IGlzIGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiBzdHJtLT5kYXRhX3R5cGUgd2hlbiBpbmZsYXRlKCkgcmV0dXJucworICBpbW1lZGlhdGVseSBhZnRlciByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIGJsb2NrIGhlYWRlci4KKworICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCisgIGVycm9yLiAgSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcCAoYQorICBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvIFpfRklOSVNILiAgSW4KKyAgdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQ7CisgIGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUgdW5jb21wcmVzc2VkIGRhdGEuICAoVGhlIHNpemUKKyAgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4gc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMKKyAgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0IGJlIGluZmxhdGVFbmQgdG8gZGVhbGxvY2F0ZQorICB0aGUgZGVjb21wcmVzc2lvbiBzdGF0ZS4gIFRoZSB1c2Ugb2YgWl9GSU5JU0ggaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUKKyAgdXNlZCB0byBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlCisgIGluZmxhdGUoKSBjYWxsLgorCisgICAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGluZmxhdGUoKSBhbHdheXMgZmx1c2hlcyBhcyBtdWNoIG91dHB1dCBhcworICBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIGFsd2F5cyB1c2VzIHRoZSBmYXN0ZXIgYXBwcm9hY2ggb24gdGhlCisgIGZpcnN0IGNhbGwuICBTbyB0aGUgb25seSBlZmZlY3Qgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisgIGlzIG9uIHRoZSByZXR1cm4gdmFsdWUgb2YgaW5mbGF0ZSgpLCBhcyBub3RlZCBiZWxvdywgb3Igd2hlbiBpdCByZXR1cm5zIGVhcmx5CisgIGJlY2F1c2UgWl9CTE9DSyBvciBaX1RSRUVTIGlzIHVzZWQuCisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsIChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlIGRpY3Rpb25hcnkKKyAgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfTkVFRF9ESUNUOyBvdGhlcndpc2UgaXQgc2V0cworICBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKKyAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKKyAgYmVsb3cuICBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKSBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMgorICBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfU1RSRUFNX0VORAorICBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgorCisgICAgaW5mbGF0ZSgpIGNhbiBkZWNvbXByZXNzIGFuZCBjaGVjayBlaXRoZXIgemxpYi13cmFwcGVkIG9yIGd6aXAtd3JhcHBlZAorICBkZWZsYXRlIGRhdGEuICBUaGUgaGVhZGVyIHR5cGUgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSwgaWYgcmVxdWVzdGVkIHdoZW4KKyAgaW5pdGlhbGl6aW5nIHdpdGggaW5mbGF0ZUluaXQyKCkuICBBbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBnemlwCisgIGhlYWRlciBpcyBub3QgcmV0YWluZWQsIHNvIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdGhhdCBpbmZvcm1hdGlvbiBzaG91bGQKKyAgaW5zdGVhZCB1c2UgcmF3IGluZmxhdGUsIHNlZSBpbmZsYXRlSW5pdDIoKSBiZWxvdywgb3IgaW5mbGF0ZUJhY2soKSBhbmQKKyAgcGVyZm9ybSB0aGVpciBvd24gcHJvY2Vzc2luZyBvZiB0aGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIuCisKKyAgICBpbmZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dCBwcm9jZXNzZWQKKyAgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcworICBiZWVuIHJlYWNoZWQgYW5kIGFsbCB1bmNvbXByZXNzZWQgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkLCBaX05FRURfRElDVCBpZiBhCisgIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzCisgIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QgY2hlY2sKKyAgdmFsdWUpLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBaX05VTEwpLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnksCisgIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlIG9yIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlCisgIG91dHB1dCBidWZmZXIgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiAgTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCisgIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgdG8KKyAgY29udGludWUgZGVjb21wcmVzc2luZy4gIElmIFpfREFUQV9FUlJPUiBpcyByZXR1cm5lZCwgdGhlIGFwcGxpY2F0aW9uIG1heQorICB0aGVuIGNhbGwgaW5mbGF0ZVN5bmMoKSB0byBsb29rIGZvciBhIGdvb2QgY29tcHJlc3Npb24gYmxvY2sgaWYgYSBwYXJ0aWFsCisgIHJlY292ZXJ5IG9mIHRoZSBkYXRhIGlzIGRlc2lyZWQuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55IHBlbmRpbmcKKyAgIG91dHB1dC4KKworICAgICBpbmZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlCisgICB3YXMgaW5jb25zaXN0ZW50LiAgSW4gdGhlIGVycm9yIGNhc2UsIG1zZyBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhCisgICBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZSBkZWFsbG9jYXRlZCkuCisqLworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIGZ1bmN0aW9ucyAqLworCisvKgorICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgb25seSBpbiBzb21lIHNwZWNpYWwgYXBwbGljYXRpb25zLgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgc3RyYXRlZ3kpKTsKKworICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBkZWZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gIFRoZQorICAgZmllbGRzIG5leHRfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUKKyAgIGNhbGxlci4KKworICAgICBUaGUgbWV0aG9kIHBhcmFtZXRlciBpcyB0aGUgY29tcHJlc3Npb24gbWV0aG9kLiAgSXQgbXVzdCBiZSBaX0RFRkxBVEVEIGluCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplCisgICAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKKyAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBMYXJnZXIgdmFsdWVzIG9mIHRoaXMgcGFyYW1ldGVyIHJlc3VsdCBpbiBiZXR0ZXIKKyAgIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmCisgICBkZWZsYXRlSW5pdCBpcyB1c2VkIGluc3RlYWQuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgZGVmbGF0ZS4gIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiAgZGVmbGF0ZSgpIHdpbGwgdGhlbiBnZW5lcmF0ZSByYXcgZGVmbGF0ZSBkYXRhCisgICB3aXRoIG5vIHpsaWIgaGVhZGVyIG9yIHRyYWlsZXIsIGFuZCB3aWxsIG5vdCBjb21wdXRlIGFuIGFkbGVyMzIgY2hlY2sgdmFsdWUuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZW5jb2RpbmcuICBBZGQKKyAgIDE2IHRvIHdpbmRvd0JpdHMgdG8gd3JpdGUgYSBzaW1wbGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIgYXJvdW5kIHRoZQorICAgY29tcHJlc3NlZCBkYXRhIGluc3RlYWQgb2YgYSB6bGliIHdyYXBwZXIuICBUaGUgZ3ppcCBoZWFkZXIgd2lsbCBoYXZlIG5vCisgICBmaWxlIG5hbWUsIG5vIGV4dHJhIGRhdGEsIG5vIGNvbW1lbnQsIG5vIG1vZGlmaWNhdGlvbiB0aW1lIChzZXQgdG8gemVybyksIG5vCisgICBoZWFkZXIgY3JjLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBiZSBzZXQgdG8gMjU1ICh1bmtub3duKS4gIElmIGEKKyAgIGd6aXAgc3RyZWFtIGlzIGJlaW5nIHdyaXR0ZW4sIHN0cm0tPmFkbGVyIGlzIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgorCisgICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCisgICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiAgbWVtTGV2ZWw9MSB1c2VzIG1pbmltdW0gbWVtb3J5IGJ1dCBpcworICAgc2xvdyBhbmQgcmVkdWNlcyBjb21wcmVzc2lvbiByYXRpbzsgbWVtTGV2ZWw9OSB1c2VzIG1heGltdW0gbWVtb3J5IGZvcgorICAgb3B0aW1hbCBzcGVlZC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguICBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5IHVzYWdlCisgICBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLgorCisgICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uICBVc2UgdGhlCisgICB2YWx1ZSBaX0RFRkFVTFRfU1RSQVRFR1kgZm9yIG5vcm1hbCBkYXRhLCBaX0ZJTFRFUkVEIGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEKKyAgIGZpbHRlciAob3IgcHJlZGljdG9yKSwgWl9IVUZGTUFOX09OTFkgdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubworICAgc3RyaW5nIG1hdGNoKSwgb3IgWl9STEUgdG8gbGltaXQgbWF0Y2ggZGlzdGFuY2VzIHRvIG9uZSAocnVuLWxlbmd0aAorICAgZW5jb2RpbmcpLiAgRmlsdGVyZWQgZGF0YSBjb25zaXN0cyBtb3N0bHkgb2Ygc21hbGwgdmFsdWVzIHdpdGggYSBzb21ld2hhdAorICAgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcyB0dW5lZCB0bworICAgY29tcHJlc3MgdGhlbSBiZXR0ZXIuICBUaGUgZWZmZWN0IG9mIFpfRklMVEVSRUQgaXMgdG8gZm9yY2UgbW9yZSBIdWZmbWFuCisgICBjb2RpbmcgYW5kIGxlc3Mgc3RyaW5nIG1hdGNoaW5nOyBpdCBpcyBzb21ld2hhdCBpbnRlcm1lZGlhdGUgYmV0d2VlbgorICAgWl9ERUZBVUxUX1NUUkFURUdZIGFuZCBaX0hVRkZNQU5fT05MWS4gIFpfUkxFIGlzIGRlc2lnbmVkIHRvIGJlIGFsbW9zdCBhcworICAgZmFzdCBhcyBaX0hVRkZNQU5fT05MWSwgYnV0IGdpdmUgYmV0dGVyIGNvbXByZXNzaW9uIGZvciBQTkcgaW1hZ2UgZGF0YS4gIFRoZQorICAgc3RyYXRlZ3kgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cyB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUKKyAgIGNvcnJlY3RuZXNzIG9mIHRoZSBjb21wcmVzc2VkIG91dHB1dCBldmVuIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS4KKyAgIFpfRklYRUQgcHJldmVudHMgdGhlIHVzZSBvZiBkeW5hbWljIEh1ZmZtYW4gY29kZXMsIGFsbG93aW5nIGZvciBhIHNpbXBsZXIKKyAgIGRlY29kZXIgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zLgorCisgICAgIGRlZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYW55IHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKKyAgIG1ldGhvZCksIG9yIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKHpsaWJfdmVyc2lvbikgaXMKKyAgIGluY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4gIG1zZyBpcworICAgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0MiBkb2VzIG5vdCBwZXJmb3JtIGFueQorICAgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVNldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CisvKgorICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCisgICB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCwgZGVmbGF0ZUluaXQyIG9yIGRlZmxhdGVSZXNldCwgYmVmb3JlIGFueSBjYWxsCisgICBvZiBkZWZsYXRlLiAgVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCisgICBkaWN0aW9uYXJ5IChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkpLgorCisgICAgIFRoZSBkaWN0aW9uYXJ5IHNob3VsZCBjb25zaXN0IG9mIHN0cmluZ3MgKGJ5dGUgc2VxdWVuY2VzKSB0aGF0IGFyZSBsaWtlbHkKKyAgIHRvIGJlIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkKKyAgIHVzZWQgc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuICBVc2luZyBhCisgICBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuIGJlCisgICBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5OyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlciB0aGFuCisgICB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuCisKKyAgICAgRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiBkYXRhIHN0cnVjdHVyZXMgc2VsZWN0ZWQgYnkKKyAgIGRlZmxhdGVJbml0IG9yIGRlZmxhdGVJbml0MiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKKyAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplCisgICBwcm92aWRlZCBpbiBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIuICBUaHVzIHRoZSBzdHJpbmdzIG1vc3QgbGlrZWx5IHRvIGJlCisgICB1c2VmdWwgc2hvdWxkIGJlIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LCBub3QgYXQgdGhlIGZyb250LiAgSW4KKyAgIGFkZGl0aW9uLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkZWZsYXRlIHdpbGwgdXNlIGF0IG1vc3QgdGhlIHdpbmRvdworICAgc2l6ZSBtaW51cyAyNjIgYnl0ZXMgb2YgdGhlIHByb3ZpZGVkIGRpY3Rpb25hcnkuCisKKyAgICAgVXBvbiByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbiwgc3RybS0+YWRsZXIgaXMgc2V0IHRvIHRoZSBhZGxlcjMyIHZhbHVlCisgICBvZiB0aGUgZGljdGlvbmFyeTsgdGhlIGRlY29tcHJlc3NvciBtYXkgbGF0ZXIgdXNlIHRoaXMgdmFsdWUgdG8gZGV0ZXJtaW5lCisgICB3aGljaCBkaWN0aW9uYXJ5IGhhcyBiZWVuIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuICAoVGhlIGFkbGVyMzIgdmFsdWUKKyAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCisgICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLikgSWYgYSByYXcgZGVmbGF0ZSB3YXMgcmVxdWVzdGVkLCB0aGVuIHRoZQorICAgYWRsZXIzMiB2YWx1ZSBpcyBub3QgY29tcHV0ZWQgYW5kIHN0cm0tPmFkbGVyIGlzIG5vdCBzZXQuCisKKyAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIGEKKyAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChlLmcuICBkaWN0aW9uYXJ5IGJlaW5nIFpfTlVMTCkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiBkZWZsYXRlIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQorICAgb3IgaWYgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBic29ydCkuICBkZWZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgT0YoKHpfc3RyZWFtcCBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9zdHJlYW1wIHNvdXJjZSkpOworLyoKKyAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBzZXZlcmFsIGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMgd2lsbCBiZQorICAgdHJpZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgd2F5cyBvZiBwcmUtcHJvY2Vzc2luZyB0aGUgaW5wdXQKKyAgIGRhdGEgd2l0aCBhIGZpbHRlci4gIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKKyAgIGJ5IGNhbGxpbmcgZGVmbGF0ZUVuZC4gIE5vdGUgdGhhdCBkZWZsYXRlQ29weSBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAorICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kIGNhbgorICAgY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KKworICAgICBkZWZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAorICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCisgICBkZXN0aW5hdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRlZmxhdGVFbmQgZm9sbG93ZWQgYnkgZGVmbGF0ZUluaXQsCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiAgVGhlCisgICBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcyB0aGF0CisgICBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCisKKyAgICAgZGVmbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVBhcmFtcyBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5KSk7CisvKgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQorICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIGRlZmxhdGVJbml0Mi4gIFRoaXMgY2FuIGJlCisgICB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzdHJhaWdodCBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLCBvcgorICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQgc3RyYXRlZ3kuCisgICBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIgaXMKKyAgIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwgdGFrZQorICAgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCisKKyAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGVQYXJhbXMsIHRoZSBzdHJlYW0gc3RhdGUgbXVzdCBiZSBzZXQgYXMgZm9yCisgICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0byBiZQorICAgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gIEluIHBhcnRpY3VsYXIsIHN0cm0tPmF2YWlsX291dCBtdXN0IGJlIG5vbi16ZXJvLgorCisgICAgIGRlZmxhdGVQYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCBaX0JVRl9FUlJPUiBpZgorICAgc3RybS0+YXZhaWxfb3V0IHdhcyB6ZXJvLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlVHVuZSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ29vZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2xhenksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmljZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NoYWluKSk7CisvKgorICAgICBGaW5lIHR1bmUgZGVmbGF0ZSdzIGludGVybmFsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICBUaGlzIHNob3VsZCBvbmx5IGJlCisgICB1c2VkIGJ5IHNvbWVvbmUgd2hvIHVuZGVyc3RhbmRzIHRoZSBhbGdvcml0aG0gdXNlZCBieSB6bGliJ3MgZGVmbGF0ZSBmb3IKKyAgIHNlYXJjaGluZyBmb3IgdGhlIGJlc3QgbWF0Y2hpbmcgc3RyaW5nLCBhbmQgZXZlbiB0aGVuIG9ubHkgYnkgdGhlIG1vc3QKKyAgIGZhbmF0aWMgb3B0aW1pemVyIHRyeWluZyB0byBzcXVlZXplIG91dCB0aGUgbGFzdCBjb21wcmVzc2VkIGJpdCBmb3IgdGhlaXIKKyAgIHNwZWNpZmljIGlucHV0IGRhdGEuICBSZWFkIHRoZSBkZWZsYXRlLmMgc291cmNlIGNvZGUgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZQorICAgbWF4X2xhenksIGdvb2RfbGVuZ3RoLCBuaWNlX2xlbmd0aCwgYW5kIG1heF9jaGFpbiBwYXJhbWV0ZXJzLgorCisgICAgIGRlZmxhdGVUdW5lKCkgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpIG9yIGRlZmxhdGVJbml0MigpLCBhbmQKKyAgIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBmb3IgYW4gaW52YWxpZCBkZWZsYXRlIHN0cmVhbS4KKyAqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgZGVmbGF0ZUJvdW5kIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgZGVmbGF0ZUJvdW5kKCkgcmV0dXJucyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplIGFmdGVyCisgICBkZWZsYXRpb24gb2Ygc291cmNlTGVuIGJ5dGVzLiAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmbGF0ZUluaXQoKSBvcgorICAgZGVmbGF0ZUluaXQyKCksIGFuZCBhZnRlciBkZWZsYXRlU2V0SGVhZGVyKCksIGlmIHVzZWQuICBUaGlzIHdvdWxkIGJlIHVzZWQKKyAgIHRvIGFsbG9jYXRlIGFuIG91dHB1dCBidWZmZXIgZm9yIGRlZmxhdGlvbiBpbiBhIHNpbmdsZSBwYXNzLCBhbmQgc28gd291bGQgYmUKKyAgIGNhbGxlZCBiZWZvcmUgZGVmbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOworLyoKKyAgICAgZGVmbGF0ZVByaW1lKCkgaW5zZXJ0cyBiaXRzIGluIHRoZSBkZWZsYXRlIG91dHB1dCBzdHJlYW0uICBUaGUgaW50ZW50CisgICBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCBvZmYgdGhlIGRlZmxhdGUgb3V0cHV0IHdpdGggdGhlIGJpdHMKKyAgIGxlZnRvdmVyIGZyb20gYSBwcmV2aW91cyBkZWZsYXRlIHN0cmVhbSB3aGVuIGFwcGVuZGluZyB0byBpdC4gIEFzIHN1Y2gsIHRoaXMKKyAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHJhdyBkZWZsYXRlLCBhbmQgbXVzdCBiZSB1c2VkIGJlZm9yZSB0aGUgZmlyc3QKKyAgIGRlZmxhdGUoKSBjYWxsIGFmdGVyIGEgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUgbGVzcworICAgdGhhbiBvciBlcXVhbCB0byAxNiwgYW5kIHRoYXQgbWFueSBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB2YWx1ZQorICAgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgb3V0cHV0LgorCisgICAgIGRlZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKKy8qCisgICAgIGRlZmxhdGVTZXRIZWFkZXIoKSBwcm92aWRlcyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3Igd2hlbiBhIGd6aXAKKyAgIHN0cmVhbSBpcyByZXF1ZXN0ZWQgYnkgZGVmbGF0ZUluaXQyKCkuICBkZWZsYXRlU2V0SGVhZGVyKCkgbWF5IGJlIGNhbGxlZAorICAgYWZ0ZXIgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZgorICAgZGVmbGF0ZSgpLiAgVGhlIHRleHQsIHRpbWUsIG9zLCBleHRyYSBmaWVsZCwgbmFtZSwgYW5kIGNvbW1lbnQgaW5mb3JtYXRpb24KKyAgIGluIHRoZSBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlIGFyZSB3cml0dGVuIHRvIHRoZSBnemlwIGhlYWRlciAoeGZsYWcgaXMKKyAgIGlnbm9yZWQgLS0gdGhlIGV4dHJhIGZsYWdzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBjb21wcmVzc2lvbiBsZXZlbCkuICBUaGUKKyAgIGNhbGxlciBtdXN0IGFzc3VyZSB0aGF0LCBpZiBub3QgWl9OVUxMLCBuYW1lIGFuZCBjb21tZW50IGFyZSB0ZXJtaW5hdGVkIHdpdGgKKyAgIGEgemVybyBieXRlLCBhbmQgdGhhdCBpZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGF0IGV4dHJhX2xlbiBieXRlcyBhcmUKKyAgIGF2YWlsYWJsZSB0aGVyZS4gIElmIGhjcmMgaXMgdHJ1ZSwgYSBnemlwIGhlYWRlciBjcmMgaXMgaW5jbHVkZWQuICBOb3RlIHRoYXQKKyAgIHRoZSBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSBjb21tYW5kLWxpbmUgdmVyc2lvbiBvZiBnemlwICh1cCB0aHJvdWdoIHZlcnNpb24KKyAgIDEuMy54KSBkbyBub3Qgc3VwcG9ydCBoZWFkZXIgY3JjJ3MsIGFuZCB3aWxsIHJlcG9ydCB0aGF0IGl0IGlzIGEgIm11bHRpLXBhcnQKKyAgIGd6aXAgZmlsZSIgYW5kIGdpdmUgdXAuCisKKyAgICAgSWYgZGVmbGF0ZVNldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlIGRlZmF1bHQgZ3ppcCBoZWFkZXIgaGFzIHRleHQgZmFsc2UsCisgICB0aGUgdGltZSBzZXQgdG8gemVybywgYW5kIG9zIHNldCB0byAyNTUsIHdpdGggbm8gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQKKyAgIGZpZWxkcy4gIFRoZSBnemlwIGhlYWRlciBpcyByZXR1cm5lZCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBkZWZsYXRlUmVzZXQoKS4KKworICAgICBkZWZsYXRlU2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzKSk7CisKKyAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgaW5mbGF0ZUluaXQgd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuICBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQKKyAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdworICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkCisgICBpbnN0ZWFkLiAgd2luZG93Qml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgd2luZG93Qml0cyB2YWx1ZQorICAgcHJvdmlkZWQgdG8gZGVmbGF0ZUluaXQyKCkgd2hpbGUgY29tcHJlc3NpbmcsIG9yIGl0IG11c3QgYmUgZXF1YWwgdG8gMTUgaWYKKyAgIGRlZmxhdGVJbml0MigpIHdhcyBub3QgdXNlZC4gIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cKKyAgIHNpemUgaXMgZ2l2ZW4gYXMgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlCisgICBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgemVybyB0byByZXF1ZXN0IHRoYXQgaW5mbGF0ZSB1c2UgdGhlIHdpbmRvdyBzaXplIGluCisgICB0aGUgemxpYiBoZWFkZXIgb2YgdGhlIGNvbXByZXNzZWQgc3RyZWFtLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGluZmxhdGUuICBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCisgICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gIGluZmxhdGUoKSB3aWxsIHRoZW4gcHJvY2VzcyByYXcgZGVmbGF0ZSBkYXRhLAorICAgbm90IGxvb2tpbmcgZm9yIGEgemxpYiBvciBnemlwIGhlYWRlciwgbm90IGdlbmVyYXRpbmcgYSBjaGVjayB2YWx1ZSwgYW5kIG5vdAorICAgbG9va2luZyBmb3IgYW55IGNoZWNrIHZhbHVlcyBmb3IgY29tcGFyaXNvbiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICBUaGlzCisgICBpcyBmb3IgdXNlIHdpdGggb3RoZXIgZm9ybWF0cyB0aGF0IHVzZSB0aGUgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0CisgICBzdWNoIGFzIHppcC4gIFRob3NlIGZvcm1hdHMgcHJvdmlkZSB0aGVpciBvd24gY2hlY2sgdmFsdWVzLiAgSWYgYSBjdXN0b20KKyAgIGZvcm1hdCBpcyBkZXZlbG9wZWQgdXNpbmcgdGhlIHJhdyBkZWZsYXRlIGZvcm1hdCBmb3IgY29tcHJlc3NlZCBkYXRhLCBpdCBpcworICAgcmVjb21tZW5kZWQgdGhhdCBhIGNoZWNrIHZhbHVlIHN1Y2ggYXMgYW4gYWRsZXIzMiBvciBhIGNyYzMyIGJlIGFwcGxpZWQgdG8KKyAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBkb25lIGluIHRoZSB6bGliLCBnemlwLCBhbmQgemlwIGZvcm1hdHMuICBGb3IKKyAgIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgemxpYiBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgYXMgaXMuICBOb3RlIHRoYXQgY29tbWVudHMKKyAgIGFib3ZlIG9uIHRoZSB1c2UgaW4gZGVmbGF0ZUluaXQyKCkgYXBwbGllcyB0byB0aGUgbWFnbml0dWRlIG9mIHdpbmRvd0JpdHMuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZGVjb2RpbmcuICBBZGQKKyAgIDMyIHRvIHdpbmRvd0JpdHMgdG8gZW5hYmxlIHpsaWIgYW5kIGd6aXAgZGVjb2Rpbmcgd2l0aCBhdXRvbWF0aWMgaGVhZGVyCisgICBkZXRlY3Rpb24sIG9yIGFkZCAxNiB0byBkZWNvZGUgb25seSB0aGUgZ3ppcCBmb3JtYXQgKHRoZSB6bGliIGZvcm1hdCB3aWxsCisgICByZXR1cm4gYSBaX0RBVEFfRVJST1IpLiAgSWYgYSBnemlwIHN0cmVhbSBpcyBiZWluZyBkZWNvZGVkLCBzdHJtLT5hZGxlciBpcyBhCisgICBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCisKKyAgICAgaW5mbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQorICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCisgICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQyIGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KKyAgIGFwYXJ0IGZyb20gcG9zc2libHkgcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogYWN0dWFsIGRlY29tcHJlc3Npb24KKyAgIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQKKyAgIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVudXNlZCBhbmQgdW5jaGFuZ2VkLikgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KKyAgIG9mIGluZmxhdGVJbml0MigpIGRvZXMgbm90IHByb2Nlc3MgYW55IGhlYWRlciBpbmZvcm1hdGlvbiAtLSB0aGF0IGlzCisgICBkZWZlcnJlZCB1bnRpbCBpbmZsYXRlKCkgaXMgY2FsbGVkLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKKy8qCisgICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKKyAgIHNlcXVlbmNlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZSwKKyAgIGlmIHRoYXQgY2FsbCByZXR1cm5lZCBaX05FRURfRElDVC4gIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgorICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgYWRsZXIzMiB2YWx1ZSByZXR1cm5lZCBieSB0aGF0IGNhbGwgb2YgaW5mbGF0ZS4KKyAgIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZSBkaWN0aW9uYXJ5IChzZWUKKyAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5KS4gIEZvciByYXcgaW5mbGF0ZSwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBhZnRlciBpbmZsYXRlSW5pdDIoKSBvciBpbmZsYXRlUmVzZXQoKSBhbmQgYmVmb3JlIGFueSBjYWxsIG9mCisgICBpbmZsYXRlKCkgdG8gc2V0IHRoZSBkaWN0aW9uYXJ5LiAgVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5zdXJlIHRoYXQgdGhlCisgICBkaWN0aW9uYXJ5IHRoYXQgd2FzIHVzZWQgZm9yIGNvbXByZXNzaW9uIGlzIHByb3ZpZGVkLgorCisgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoZS5nLiAgZGljdGlvbmFyeSBiZWluZyBaX05VTEwpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKKyAgIGluY29uc2lzdGVudCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBnaXZlbiBkaWN0aW9uYXJ5IGRvZXNuJ3QgbWF0Y2ggdGhlCisgICBleHBlY3RlZCBvbmUgKGluY29ycmVjdCBhZGxlcjMyIHZhbHVlKS4gIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCisgICBpbmZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTeW5jIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUgdGhlCisgICBkZXNjcmlwdGlvbiBvZiBkZWZsYXRlIHdpdGggWl9GVUxMX0ZMVVNIKSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAorICAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuICBObyBvdXRwdXQgaXMgcHJvdmlkZWQuCisKKyAgICAgaW5mbGF0ZVN5bmMgcmV0dXJucyBaX09LIGlmIGEgZnVsbCBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwgWl9CVUZfRVJST1IKKyAgIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCBaX0RBVEFfRVJST1IgaWYgbm8gZmx1c2ggcG9pbnQgaGFzIGJlZW4KKyAgIGZvdW5kLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50LiAgSW4gdGhlCisgICBzdWNjZXNzIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mIHRvdGFsX2luCisgICB3aGljaCBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gIEluIHRoZSBlcnJvciBjYXNlLAorICAgdGhlIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgaW5mbGF0ZVN5bmMsIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2gKKyAgIHRpbWUsIHVudGlsIHN1Y2Nlc3Mgb3IgZW5kIG9mIHRoZSBpbnB1dCBkYXRhLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQ29weSBPRigoel9zdHJlYW1wIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7CisvKgorICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgorCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHJhbmRvbWx5IGFjY2Vzc2luZyBhIGxhcmdlIHN0cmVhbS4gIFRoZQorICAgZmlyc3QgcGFzcyB0aHJvdWdoIHRoZSBzdHJlYW0gY2FuIHBlcmlvZGljYWxseSByZWNvcmQgdGhlIGluZmxhdGUgc3RhdGUsCisgICBhbGxvd2luZyByZXN0YXJ0aW5nIGluZmxhdGUgYXQgdGhvc2UgcG9pbnRzIHdoZW4gcmFuZG9tbHkgYWNjZXNzaW5nIHRoZQorICAgc3RyZWFtLgorCisgICAgIGluZmxhdGVDb3B5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50CisgICAoc3VjaCBhcyB6YWxsb2MgYmVpbmcgWl9OVUxMKS4gIG1zZyBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKKyAgIGRlc3RpbmF0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gaW5mbGF0ZUVuZCBmb2xsb3dlZCBieSBpbmZsYXRlSW5pdCwKKyAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiBzdGF0ZS4gIFRoZQorICAgc3RyZWFtIHdpbGwga2VlcCBhdHRyaWJ1dGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgaW5mbGF0ZUluaXQyLgorCisgICAgIGluZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVSZXNldDIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cykpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBpbmZsYXRlUmVzZXQsIGJ1dCBpdCBhbHNvIHBlcm1pdHMgY2hhbmdpbmcKKyAgIHRoZSB3cmFwIGFuZCB3aW5kb3cgc2l6ZSByZXF1ZXN0cy4gIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyBpbnRlcnByZXRlZAorICAgdGhlIHNhbWUgYXMgaXQgaXMgZm9yIGluZmxhdGVJbml0Mi4KKworICAgICBpbmZsYXRlUmVzZXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKSwgb3IgaWYKKyAgIHRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGJpdHMgaW4gdGhlIGluZmxhdGUgaW5wdXQgc3RyZWFtLiAgVGhlIGludGVudCBpcworICAgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgaW5mbGF0aW5nIGF0IGEgYml0IHBvc2l0aW9uIGluIHRoZQorICAgbWlkZGxlIG9mIGEgYnl0ZS4gIFRoZSBwcm92aWRlZCBiaXRzIHdpbGwgYmUgdXNlZCBiZWZvcmUgYW55IGJ5dGVzIGFyZSB1c2VkCisgICBmcm9tIG5leHRfaW4uICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCByYXcgaW5mbGF0ZSwgYW5kCisgICBzaG91bGQgYmUgdXNlZCBiZWZvcmUgdGhlIGZpcnN0IGluZmxhdGUoKSBjYWxsIGFmdGVyIGluZmxhdGVJbml0MigpIG9yCisgICBpbmZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlCisgICBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHZhbHVlIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIGlucHV0LgorCisgICAgIElmIGJpdHMgaXMgbmVnYXRpdmUsIHRoZW4gdGhlIGlucHV0IHN0cmVhbSBiaXQgYnVmZmVyIGlzIGVtcHRpZWQuICBUaGVuCisgICBpbmZsYXRlUHJpbWUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHRvIHB1dCBiaXRzIGluIHRoZSBidWZmZXIuICBUaGlzIGlzIHVzZWQKKyAgIHRvIGNsZWFyIG91dCBiaXRzIGxlZnRvdmVyIGFmdGVyIGZlZWRpbmcgaW5mbGF0ZSBhIGJsb2NrIGRlc2NyaXB0aW9uIHByaW9yCisgICB0byBmZWVkaW5nIGluZmxhdGUgY29kZXMuCisKKyAgICAgaW5mbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKK1pFWFRFUk4gbG9uZyBaRVhQT1JUIGluZmxhdGVNYXJrIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR3byB2YWx1ZXMsIG9uZSBpbiB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgcmV0dXJuCisgICB2YWx1ZSwgYW5kIHRoZSBvdGhlciBpbiB0aGUgcmVtYWluaW5nIHVwcGVyIGJpdHMsIG9idGFpbmVkIGJ5IHNoaWZ0aW5nIHRoZQorICAgcmV0dXJuIHZhbHVlIGRvd24gMTYgYml0cy4gIElmIHRoZSB1cHBlciB2YWx1ZSBpcyAtMSBhbmQgdGhlIGxvd2VyIHZhbHVlIGlzCisgICB6ZXJvLCB0aGVuIGluZmxhdGUoKSBpcyBjdXJyZW50bHkgZGVjb2RpbmcgaW5mb3JtYXRpb24gb3V0c2lkZSBvZiBhIGJsb2NrLgorICAgSWYgdGhlIHVwcGVyIHZhbHVlIGlzIC0xIGFuZCB0aGUgbG93ZXIgdmFsdWUgaXMgbm9uLXplcm8sIHRoZW4gaW5mbGF0ZSBpcyBpbgorICAgdGhlIG1pZGRsZSBvZiBhIHN0b3JlZCBibG9jaywgd2l0aCB0aGUgbG93ZXIgdmFsdWUgZXF1YWxpbmcgdGhlIG51bWJlciBvZgorICAgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgcmVtYWluaW5nIHRvIGNvcHkuICBJZiB0aGUgdXBwZXIgdmFsdWUgaXMgbm90IC0xLCB0aGVuCisgICBpdCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgYmFjayBmcm9tIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgb2YKKyAgIHRoZSBjb2RlIChsaXRlcmFsIG9yIGxlbmd0aC9kaXN0YW5jZSBwYWlyKSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgSW4KKyAgIHRoYXQgY2FzZSB0aGUgbG93ZXIgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhbHJlYWR5IGVtaXR0ZWQgZm9yIHRoYXQKKyAgIGNvZGUuCisKKyAgICAgQSBjb2RlIGlzIGJlaW5nIHByb2Nlc3NlZCBpZiBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIG1vcmUgaW5wdXQgdG8gY29tcGxldGUKKyAgIGRlY29kaW5nIG9mIHRoZSBjb2RlLCBvciBpZiBpdCBoYXMgY29tcGxldGVkIGRlY29kaW5nIGJ1dCBpcyB3YWl0aW5nIGZvcgorICAgbW9yZSBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgdGhlIGxpdGVyYWwgb3IgbWF0Y2ggZGF0YS4KKworICAgICBpbmZsYXRlTWFyaygpIGlzIHVzZWQgdG8gbWFyayBsb2NhdGlvbnMgaW4gdGhlIGlucHV0IGRhdGEgZm9yIHJhbmRvbQorICAgYWNjZXNzLCB3aGljaCBtYXkgYmUgYXQgYml0IHBvc2l0aW9ucywgYW5kIHRvIG5vdGUgdGhvc2UgY2FzZXMgd2hlcmUgdGhlCisgICBvdXRwdXQgb2YgYSBjb2RlIG1heSBzcGFuIGJvdW5kYXJpZXMgb2YgcmFuZG9tIGFjY2VzcyBibG9ja3MuICBUaGUgY3VycmVudAorICAgbG9jYXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbSBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIGF2YWlsX2luIGFuZCBkYXRhX3R5cGUKKyAgIGFzIG5vdGVkIGluIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIFpfQkxPQ0sgZmx1c2ggcGFyYW1ldGVyIGZvciBpbmZsYXRlLgorCisgICAgIGluZmxhdGVNYXJrIHJldHVybnMgdGhlIHZhbHVlIG5vdGVkIGFib3ZlIG9yIC0xIDw8IDE2IGlmIHRoZSBwcm92aWRlZAorICAgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlR2V0SGVhZGVyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3pfaGVhZGVycCBoZWFkKSk7CisvKgorICAgICBpbmZsYXRlR2V0SGVhZGVyKCkgcmVxdWVzdHMgdGhhdCBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBiZSBzdG9yZWQgaW4gdGhlCisgICBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlLiAgaW5mbGF0ZUdldEhlYWRlcigpIG1heSBiZSBjYWxsZWQgYWZ0ZXIKKyAgIGluZmxhdGVJbml0MigpIG9yIGluZmxhdGVSZXNldCgpLCBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mIGluZmxhdGUoKS4KKyAgIEFzIGluZmxhdGUoKSBwcm9jZXNzZXMgdGhlIGd6aXAgc3RyZWFtLCBoZWFkLT5kb25lIGlzIHplcm8gdW50aWwgdGhlIGhlYWRlcgorICAgaXMgY29tcGxldGVkLCBhdCB3aGljaCB0aW1lIGhlYWQtPmRvbmUgaXMgc2V0IHRvIG9uZS4gIElmIGEgemxpYiBzdHJlYW0gaXMKKyAgIGJlaW5nIGRlY29kZWQsIHRoZW4gaGVhZC0+ZG9uZSBpcyBzZXQgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSB3aWxsIGJlCisgICBubyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3J0aGNvbWluZy4gIE5vdGUgdGhhdCBaX0JMT0NLIG9yIFpfVFJFRVMgY2FuIGJlCisgICB1c2VkIHRvIGZvcmNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIgaGVhZGVyIHByb2Nlc3NpbmcgaXMKKyAgIGNvbXBsZXRlIGFuZCBiZWZvcmUgYW55IGFjdHVhbCBkYXRhIGlzIGRlY29tcHJlc3NlZC4KKworICAgICBUaGUgdGV4dCwgdGltZSwgeGZsYWdzLCBhbmQgb3MgZmllbGRzIGFyZSBmaWxsZWQgaW4gd2l0aCB0aGUgZ3ppcCBoZWFkZXIKKyAgIGNvbnRlbnRzLiAgaGNyYyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGVyZSBpcyBhIGhlYWRlciBDUkMuICAoVGhlIGhlYWRlciBDUkMKKyAgIHdhcyB2YWxpZCBpZiBkb25lIGlzIHNldCB0byBvbmUuKSBJZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGVuIGV4dHJhX21heAorICAgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIGV4dHJhLiAgT25jZSBkb25lIGlzIHRydWUsCisgICBleHRyYV9sZW4gY29udGFpbnMgdGhlIGFjdHVhbCBleHRyYSBmaWVsZCBsZW5ndGgsIGFuZCBleHRyYSBjb250YWlucyB0aGUKKyAgIGV4dHJhIGZpZWxkLCBvciB0aGF0IGZpZWxkIHRydW5jYXRlZCBpZiBleHRyYV9tYXggaXMgbGVzcyB0aGFuIGV4dHJhX2xlbi4KKyAgIElmIG5hbWUgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBuYW1lX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAorICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gbmFtZV9tYXguICBJZgorICAgY29tbWVudCBpcyBub3QgWl9OVUxMLCB0aGVuIHVwIHRvIGNvbW1fbWF4IGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhlcmUsCisgICB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIHVubGVzcyB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBjb21tX21heC4gIFdoZW4gYW55CisgICBvZiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCBhcmUgbm90IFpfTlVMTCBhbmQgdGhlIHJlc3BlY3RpdmUgZmllbGQgaXMgbm90CisgICBwcmVzZW50IGluIHRoZSBoZWFkZXIsIHRoZW4gdGhhdCBmaWVsZCBpcyBzZXQgdG8gWl9OVUxMIHRvIHNpZ25hbCBpdHMKKyAgIGFic2VuY2UuICBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIGRlZmxhdGVTZXRIZWFkZXIoKSB3aXRoIHRoZSByZXR1cm5lZAorICAgc3RydWN0dXJlIHRvIGR1cGxpY2F0ZSB0aGUgaGVhZGVyLiAgSG93ZXZlciBpZiB0aG9zZSBmaWVsZHMgYXJlIHNldCB0bworICAgYWxsb2NhdGVkIG1lbW9yeSwgdGhlbiB0aGUgYXBwbGljYXRpb24gd2lsbCBuZWVkIHRvIHNhdmUgdGhvc2UgcG9pbnRlcnMKKyAgIGVsc2V3aGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGV2ZW50dWFsbHkgZnJlZWQuCisKKyAgICAgSWYgaW5mbGF0ZUdldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlbiB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHNpbXBseQorICAgZGlzY2FyZGVkLiAgVGhlIGhlYWRlciBpcyBhbHdheXMgY2hlY2tlZCBmb3IgdmFsaWRpdHksIGluY2x1ZGluZyB0aGUgaGVhZGVyCisgICBDUkMgaWYgcHJlc2VudC4gIGluZmxhdGVSZXNldCgpIHdpbGwgcmVzZXQgdGhlIHByb2Nlc3MgdG8gZGlzY2FyZCB0aGUgaGVhZGVyCisgICBpbmZvcm1hdGlvbi4gIFRoZSBhcHBsaWNhdGlvbiB3b3VsZCBuZWVkIHRvIGNhbGwgaW5mbGF0ZUdldEhlYWRlcigpIGFnYWluIHRvCisgICByZXRyaWV2ZSB0aGUgaGVhZGVyIGZyb20gdGhlIG5leHQgZ3ppcCBzdHJlYW0uCisKKyAgICAgaW5mbGF0ZUdldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXQgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93KSk7CisKKyAgICAgSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uIHVzaW5nIGluZmxhdGVCYWNrKCkKKyAgIGNhbGxzLiAgVGhlIGZpZWxkcyB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgaW4gc3RybSBtdXN0IGJlIGluaXRpYWxpemVkCisgICBiZWZvcmUgdGhlIGNhbGwuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBaX05VTEwsIHRoZW4gdGhlIGRlZmF1bHQgbGlicmFyeS0KKyAgIGRlcml2ZWQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgYXJlIHVzZWQuICB3aW5kb3dCaXRzIGlzIHRoZSBiYXNlIHR3bworICAgbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZSwgaW4gdGhlIHJhbmdlIDguLjE1LiAgd2luZG93IGlzIGEgY2FsbGVyCisgICBzdXBwbGllZCBidWZmZXIgb2YgdGhhdCBzaXplLiAgRXhjZXB0IGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucyB3aGVyZSBpdCBpcworICAgYXNzdXJlZCB0aGF0IGRlZmxhdGUgd2FzIHVzZWQgd2l0aCBzbWFsbCB3aW5kb3cgc2l6ZXMsIHdpbmRvd0JpdHMgbXVzdCBiZSAxNQorICAgYW5kIGEgMzJLIGJ5dGUgd2luZG93IG11c3QgYmUgc3VwcGxpZWQgdG8gYmUgYWJsZSB0byBkZWNvbXByZXNzIGdlbmVyYWwKKyAgIGRlZmxhdGUgc3RyZWFtcy4KKworICAgICBTZWUgaW5mbGF0ZUJhY2soKSBmb3IgdGhlIHVzYWdlIG9mIHRoZXNlIHJvdXRpbmVzLgorCisgICAgIGluZmxhdGVCYWNrSW5pdCB3aWxsIHJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBvZgorICAgdGhlIHBhcmFtYXRlcnMgYXJlIGludmFsaWQsIFpfTUVNX0VSUk9SIGlmIHRoZSBpbnRlcm5hbCBzdGF0ZSBjb3VsZCBub3QgYmUKKyAgIGFsbG9jYXRlZCwgb3IgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRvZXMgbm90IG1hdGNoCisgICB0aGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyIGZpbGUuCisqLworCit0eXBlZGVmIHVuc2lnbmVkICgqaW5fZnVuYykgT0YoKHZvaWQgRkFSICosIHVuc2lnbmVkIGNoYXIgRkFSICogRkFSICopKTsKK3R5cGVkZWYgaW50ICgqb3V0X2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2Z1bmMgaW4sIHZvaWQgRkFSICppbl9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2Z1bmMgb3V0LCB2b2lkIEZBUiAqb3V0X2Rlc2MpKTsKKy8qCisgICAgIGluZmxhdGVCYWNrKCkgZG9lcyBhIHJhdyBpbmZsYXRlIHdpdGggYSBzaW5nbGUgY2FsbCB1c2luZyBhIGNhbGwtYmFjaworICAgaW50ZXJmYWNlIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGluZmxhdGUoKSBmb3IKKyAgIGZpbGUgaS9vIGFwcGxpY2F0aW9ucyBpbiB0aGF0IGl0IGF2b2lkcyBjb3B5aW5nIGJldHdlZW4gdGhlIG91dHB1dCBhbmQgdGhlCisgICBzbGlkaW5nIHdpbmRvdyBieSBzaW1wbHkgbWFraW5nIHRoZSB3aW5kb3cgaXRzZWxmIHRoZSBvdXRwdXQgYnVmZmVyLiAgVGhpcworICAgZnVuY3Rpb24gdHJ1c3RzIHRoZSBhcHBsaWNhdGlvbiB0byBub3QgY2hhbmdlIHRoZSBvdXRwdXQgYnVmZmVyIHBhc3NlZCBieQorICAgdGhlIG91dHB1dCBmdW5jdGlvbiwgYXQgbGVhc3QgdW50aWwgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgorCisgICAgIGluZmxhdGVCYWNrSW5pdCgpIG11c3QgYmUgY2FsbGVkIGZpcnN0IHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQorICAgYW5kIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIHdpdGggdGhlIHVzZXItcHJvdmlkZWQgd2luZG93IGJ1ZmZlci4KKyAgIGluZmxhdGVCYWNrKCkgbWF5IHRoZW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBpbmZsYXRlIGEgY29tcGxldGUsIHJhdworICAgZGVmbGF0ZSBzdHJlYW0gd2l0aCBlYWNoIGNhbGwuICBpbmZsYXRlQmFja0VuZCgpIGlzIHRoZW4gY2FsbGVkIHRvIGZyZWUgdGhlCisgICBhbGxvY2F0ZWQgc3RhdGUuCisKKyAgICAgQSByYXcgZGVmbGF0ZSBzdHJlYW0gaXMgb25lIHdpdGggbm8gemxpYiBvciBnemlwIGhlYWRlciBvciB0cmFpbGVyLgorICAgVGhpcyByb3V0aW5lIHdvdWxkIG5vcm1hbGx5IGJlIHVzZWQgaW4gYSB1dGlsaXR5IHRoYXQgcmVhZHMgemlwIG9yIGd6aXAKKyAgIGZpbGVzIGFuZCB3cml0ZXMgb3V0IHVuY29tcHJlc3NlZCBmaWxlcy4gIFRoZSB1dGlsaXR5IHdvdWxkIGRlY29kZSB0aGUKKyAgIGhlYWRlciBhbmQgcHJvY2VzcyB0aGUgdHJhaWxlciBvbiBpdHMgb3duLCBoZW5jZSB0aGlzIHJvdXRpbmUgZXhwZWN0cyBvbmx5CisgICB0aGUgcmF3IGRlZmxhdGUgc3RyZWFtIHRvIGRlY29tcHJlc3MuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBub3JtYWwKKyAgIGJlaGF2aW9yIG9mIGluZmxhdGUoKSwgd2hpY2ggZXhwZWN0cyBlaXRoZXIgYSB6bGliIG9yIGd6aXAgaGVhZGVyIGFuZAorICAgdHJhaWxlciBhcm91bmQgdGhlIGRlZmxhdGUgc3RyZWFtLgorCisgICAgIGluZmxhdGVCYWNrKCkgdXNlcyB0d28gc3Vicm91dGluZXMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciB0aGF0IGFyZSB0aGVuCisgICBjYWxsZWQgYnkgaW5mbGF0ZUJhY2soKSBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIGluZmxhdGVCYWNrKCkgY2FsbHMgdGhvc2UKKyAgIHJvdXRpbmVzIHVudGlsIGl0IHJlYWRzIGEgY29tcGxldGUgZGVmbGF0ZSBzdHJlYW0gYW5kIHdyaXRlcyBvdXQgYWxsIG9mIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEsIG9yIHVudGlsIGl0IGVuY291bnRlcnMgYW4gZXJyb3IuICBUaGUgZnVuY3Rpb24ncworICAgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzIGFyZSBkZWZpbmVkIGFib3ZlIGluIHRoZSBpbl9mdW5jIGFuZCBvdXRfZnVuYworICAgdHlwZWRlZnMuICBpbmZsYXRlQmFjaygpIHdpbGwgY2FsbCBpbihpbl9kZXNjLCAmYnVmKSB3aGljaCBzaG91bGQgcmV0dXJuIHRoZQorICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHByb3ZpZGVkIGlucHV0LCBhbmQgYSBwb2ludGVyIHRvIHRoYXQgaW5wdXQgaW4gYnVmLiAgSWYKKyAgIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZSwgaW4oKSBtdXN0IHJldHVybiB6ZXJvLS1idWYgaXMgaWdub3JlZCBpbiB0aGF0CisgICBjYXNlLS1hbmQgaW5mbGF0ZUJhY2soKSB3aWxsIHJldHVybiBhIGJ1ZmZlciBlcnJvci4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsCisgICBvdXQob3V0X2Rlc2MsIGJ1ZiwgbGVuKSB0byB3cml0ZSB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYnVmWzAuLmxlbi0xXS4gIG91dCgpCisgICBzaG91bGQgcmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3Igbm9uLXplcm8gb24gZmFpbHVyZS4gIElmIG91dCgpIHJldHVybnMKKyAgIG5vbi16ZXJvLCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIHdpdGggYW4gZXJyb3IuICBOZWl0aGVyIGluKCkgbm9yIG91dCgpCisgICBhcmUgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHdpbmRvdyBwcm92aWRlZCB0bworICAgaW5mbGF0ZUJhY2tJbml0KCksIHdoaWNoIGlzIGFsc28gdGhlIGJ1ZmZlciB0aGF0IG91dCgpIHVzZXMgdG8gd3JpdGUgZnJvbS4KKyAgIFRoZSBsZW5ndGggd3JpdHRlbiBieSBvdXQoKSB3aWxsIGJlIGF0IG1vc3QgdGhlIHdpbmRvdyBzaXplLiAgQW55IG5vbi16ZXJvCisgICBhbW91bnQgb2YgaW5wdXQgbWF5IGJlIHByb3ZpZGVkIGJ5IGluKCkuCisKKyAgICAgRm9yIGNvbnZlbmllbmNlLCBpbmZsYXRlQmFjaygpIGNhbiBiZSBwcm92aWRlZCBpbnB1dCBvbiB0aGUgZmlyc3QgY2FsbCBieQorICAgc2V0dGluZyBzdHJtLT5uZXh0X2luIGFuZCBzdHJtLT5hdmFpbF9pbi4gIElmIHRoYXQgaW5wdXQgaXMgZXhoYXVzdGVkLCB0aGVuCisgICBpbigpIHdpbGwgYmUgY2FsbGVkLiAgVGhlcmVmb3JlIHN0cm0tPm5leHRfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUKKyAgIGNhbGxpbmcgaW5mbGF0ZUJhY2soKS4gIElmIHN0cm0tPm5leHRfaW4gaXMgWl9OVUxMLCB0aGVuIGluKCkgd2lsbCBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGZvciBpbnB1dC4gIElmIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiBzdHJtLT5hdmFpbF9pbgorICAgbXVzdCBhbHNvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlbiBpZiBzdHJtLT5hdmFpbF9pbiBpcyBub3QgemVybywgaW5wdXQgd2lsbAorICAgaW5pdGlhbGx5IGJlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pblswIC4uICBzdHJtLT5hdmFpbF9pbiAtIDFdLgorCisgICAgIFRoZSBpbl9kZXNjIGFuZCBvdXRfZGVzYyBwYXJhbWV0ZXJzIG9mIGluZmxhdGVCYWNrKCkgaXMgcGFzc2VkIGFzIHRoZQorICAgZmlyc3QgcGFyYW1ldGVyIG9mIGluKCkgYW5kIG91dCgpIHJlc3BlY3RpdmVseSB3aGVuIHRoZXkgYXJlIGNhbGxlZC4gIFRoZXNlCisgICBkZXNjcmlwdG9ycyBjYW4gYmUgb3B0aW9uYWxseSB1c2VkIHRvIHBhc3MgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGNhbGxlci0KKyAgIHN1cHBsaWVkIGluKCkgYW5kIG91dCgpIGZ1bmN0aW9ucyBuZWVkIHRvIGRvIHRoZWlyIGpvYi4KKworICAgICBPbiByZXR1cm4sIGluZmxhdGVCYWNrKCkgd2lsbCBzZXQgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4gdG8KKyAgIHBhc3MgYmFjayBhbnkgdW51c2VkIGlucHV0IHRoYXQgd2FzIHByb3ZpZGVkIGJ5IHRoZSBsYXN0IGluKCkgY2FsbC4gIFRoZQorICAgcmV0dXJuIHZhbHVlcyBvZiBpbmZsYXRlQmFjaygpIGNhbiBiZSBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9CVUZfRVJST1IKKyAgIGlmIGluKCkgb3Igb3V0KCkgcmV0dXJuZWQgYW4gZXJyb3IsIFpfREFUQV9FUlJPUiBpZiB0aGVyZSB3YXMgYSBmb3JtYXQgZXJyb3IKKyAgIGluIHRoZSBkZWZsYXRlIHN0cmVhbSAoaW4gd2hpY2ggY2FzZSBzdHJtLT5tc2cgaXMgc2V0IHRvIGluZGljYXRlIHRoZSBuYXR1cmUKKyAgIG9mIHRoZSBlcnJvciksIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZC4KKyAgIEluIHRoZSBjYXNlIG9mIFpfQlVGX0VSUk9SLCBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgY2FuIGJlIGRpc3Rpbmd1aXNoZWQKKyAgIHVzaW5nIHN0cm0tPm5leHRfaW4gd2hpY2ggd2lsbCBiZSBaX05VTEwgb25seSBpZiBpbigpIHJldHVybmVkIGFuIGVycm9yLiAgSWYKKyAgIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiB0aGUgWl9CVUZfRVJST1Igd2FzIGR1ZSB0byBvdXQoKSByZXR1cm5pbmcKKyAgIG5vbi16ZXJvLiAgKGluKCkgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBvdXQoKSwgc28gc3RybS0+bmV4dF9pbiBpcworICAgYXNzdXJlZCB0byBiZSBkZWZpbmVkIGlmIG91dCgpIHJldHVybnMgbm9uLXplcm8uKSBOb3RlIHRoYXQgaW5mbGF0ZUJhY2soKQorICAgY2Fubm90IHJldHVybiBaX09LLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgorCisgICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KKyAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncyBPRigodm9pZCkpOworLyogUmV0dXJuIGZsYWdzIGluZGljYXRpbmcgY29tcGlsZS10aW1lIG9wdGlvbnMuCisKKyAgICBUeXBlIHNpemVzLCB0d28gYml0cyBlYWNoLCAwMCA9IDE2IGJpdHMsIDAxID0gMzIsIDEwID0gNjQsIDExID0gb3RoZXI6CisgICAgIDEuMDogc2l6ZSBvZiB1SW50CisgICAgIDMuMjogc2l6ZSBvZiB1TG9uZworICAgICA1LjQ6IHNpemUgb2Ygdm9pZHBmIChwb2ludGVyKQorICAgICA3LjY6IHNpemUgb2Ygel9vZmZfdAorCisgICAgQ29tcGlsZXIsIGFzc2VtYmxlciwgYW5kIGRlYnVnIG9wdGlvbnM6CisgICAgIDg6IERFQlVHCisgICAgIDk6IEFTTVYgb3IgQVNNSU5GIC0tIHVzZSBBU00gY29kZQorICAgICAxMDogWkxJQl9XSU5BUEkgLS0gZXhwb3J0ZWQgZnVuY3Rpb25zIHVzZSB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbgorICAgICAxMTogMCAocmVzZXJ2ZWQpCisKKyAgICBPbmUtdGltZSB0YWJsZSBidWlsZGluZyAoc21hbGxlciBjb2RlLCBidXQgbm90IHRocmVhZC1zYWZlIGlmIHRydWUpOgorICAgICAxMjogQlVJTERGSVhFRCAtLSBidWlsZCBzdGF0aWMgYmxvY2sgZGVjb2RpbmcgdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDEzOiBEWU5BTUlDX0NSQ19UQUJMRSAtLSBidWlsZCBDUkMgY2FsY3VsYXRpb24gdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDE0LDE1OiAwIChyZXNlcnZlZCkKKworICAgIExpYnJhcnkgY29udGVudCAoaW5kaWNhdGVzIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSk6CisgICAgIDE2OiBOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzICh0byBhdm9pZCBsaW5raW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmxhdGUgY29kZSB3aGVuIG5vdCBuZWVkZWQpCisgICAgIDE3OiBOT19HWklQIC0tIGRlZmxhdGUgY2FuJ3Qgd3JpdGUgZ3ppcCBzdHJlYW1zLCBhbmQgaW5mbGF0ZSBjYW4ndCBkZXRlY3QKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kZSBnemlwIHN0cmVhbXMgKHRvIGF2b2lkIGxpbmtpbmcgY3JjIGNvZGUpCisgICAgIDE4LTE5OiAwIChyZXNlcnZlZCkKKworICAgIE9wZXJhdGlvbiB2YXJpYXRpb25zIChjaGFuZ2VzIGluIGxpYnJhcnkgZnVuY3Rpb25hbGl0eSk6CisgICAgIDIwOiBQS1pJUF9CVUdfV09SS0FST1VORCAtLSBzbGlnaHRseSBtb3JlIHBlcm1pc3NpdmUgaW5mbGF0ZQorICAgICAyMTogRkFTVEVTVCAtLSBkZWZsYXRlIGFsZ29yaXRobSB3aXRoIG9ubHkgb25lLCBsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwKKyAgICAgMjIsMjM6IDAgKHJlc2VydmVkKQorCisgICAgVGhlIHNwcmludGYgdmFyaWFudCB1c2VkIGJ5IGd6cHJpbnRmICh6ZXJvIGlzIGJlc3QpOgorICAgICAyNDogMCA9IHZzKiwgMSA9IHMqIC0tIDEgbWVhbnMgbGltaXRlZCB0byAyMCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZvcm1hdAorICAgICAyNTogMCA9ICpucHJpbnRmLCAxID0gKnByaW50ZiAtLSAxIG1lYW5zIGd6cHJpbnRmKCkgbm90IHNlY3VyZSEKKyAgICAgMjY6IDAgPSByZXR1cm5zIHZhbHVlLCAxID0gdm9pZCAtLSAxIG1lYW5zIGluZmVycmVkIHN0cmluZyBsZW5ndGggcmV0dXJuZWQKKworICAgIFJlbWFpbmRlcjoKKyAgICAgMjctMzE6IDAgKHJlc2VydmVkKQorICovCisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZSBiYXNpYworICAgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gIFRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UsIHNvbWUgZGVmYXVsdCBvcHRpb25zCisgICBhcmUgYXNzdW1lZCAoY29tcHJlc3Npb24gbGV2ZWwgYW5kIG1lbW9yeSB1c2FnZSwgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24KKyAgIGZ1bmN0aW9ucykuICBUaGUgc291cmNlIGNvZGUgb2YgdGhlc2UgdXRpbGl0eSBmdW5jdGlvbnMgY2FuIGJlIG1vZGlmaWVkIGlmCisgICB5b3UgbmVlZCBzcGVjaWFsIG9wdGlvbnMuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzIE9GKChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuICBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplCisgICBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKKyAgIGNvbXByZXNzZWQgYnVmZmVyLgorCisgICAgIGNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgY29tcHJlc3MyIE9GKChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkpOworLyoKKyAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAgVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKyAgIGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCisgICBjb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICBjb21wcmVzczIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCisgICBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgY29tcHJlc3NCb3VuZCBPRigodUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBjb21wcmVzc0JvdW5kKCkgcmV0dXJucyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplIGFmdGVyCisgICBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIG9uIHNvdXJjZUxlbiBieXRlcy4gIEl0IHdvdWxkIGJlIHVzZWQgYmVmb3JlIGEKKyAgIGNvbXByZXNzKCkgb3IgY29tcHJlc3MyKCkgY2FsbCB0byBhbGxvY2F0ZSB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCB1bmNvbXByZXNzIE9GKChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgRGVjb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcworICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAgVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZQorICAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlCisgICB1bmNvbXByZXNzZWQgZGF0YS4gIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlIGJlZW4gc2F2ZWQKKyAgIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IgYnkgc29tZQorICAgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pIFVwb24gZXhpdCwgZGVzdExlbgorICAgaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgYnVmZmVyLgorCisgICAgIHVuY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZCBvciBpbmNvbXBsZXRlLgorKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBnemlwIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdCB3aXRoCisgICBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLCB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQgd2l0aAorICAgImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEgZ3ppcAorICAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KKyovCisKK3R5cGVkZWYgdm9pZHAgZ3pGaWxlOyAgICAgICAvKiBvcGFxdWUgZ3ppcCBmaWxlIGRlc2NyaXB0b3IgKi8KKworLyoKK1pFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuIE9GKChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKSk7CisKKyAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gIFRoZSBtb2RlIHBhcmFtZXRlciBpcyBhcworICAgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikgYnV0IGNhbiBhbHNvIGluY2x1ZGUgYSBjb21wcmVzc2lvbiBsZXZlbCAoIndiOSIpIG9yCisgICBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yIEh1ZmZtYW4tb25seQorICAgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLCAnUicgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcgYXMgaW4gIndiMVIiLCBvciAnRicKKyAgIGZvciBmaXhlZCBjb2RlIGNvbXByZXNzaW9uIGFzIGluICJ3YjlGIi4gIChTZWUgdGhlIGRlc2NyaXB0aW9uIG9mCisgICBkZWZsYXRlSW5pdDIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci4pIEFsc28gImEiCisgICBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mICJ3IiB0byByZXF1ZXN0IHRoYXQgdGhlIGd6aXAgc3RyZWFtIHRoYXQgd2lsbCBiZQorICAgd3JpdHRlbiBiZSBhcHBlbmRlZCB0byB0aGUgZmlsZS4gICIrIiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciwgc2luY2UgcmVhZGluZworICAgYW5kIHdyaXRpbmcgdG8gdGhlIHNhbWUgZ3ppcCBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQuCisKKyAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcworICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLgorCisgICAgIGd6b3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCwgaWYgdGhlcmUgd2FzCisgICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBnekZpbGUgc3RhdGUsIG9yIGlmIGFuIGludmFsaWQgbW9kZSB3YXMKKyAgIHNwZWNpZmllZCAoYW4gJ3InLCAndycsIG9yICdhJyB3YXMgbm90IHByb3ZpZGVkLCBvciAnKycgd2FzIHByb3ZpZGVkKS4KKyAgIGVycm5vIGNhbiBiZSBjaGVja2VkIHRvIGRldGVybWluZSBpZiB0aGUgcmVhc29uIGd6b3BlbiBmYWlsZWQgd2FzIHRoYXQgdGhlCisgICBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQuCisqLworCitaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6ZG9wZW4gT0YoKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkpOworLyoKKyAgICAgZ3pkb3BlbiBhc3NvY2lhdGVzIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gIEZpbGUgZGVzY3JpcHRvcnMKKyAgIGFyZSBvYnRhaW5lZCBmcm9tIGNhbGxzIGxpa2Ugb3BlbiwgZHVwLCBjcmVhdCwgcGlwZSBvciBmaWxlbm8gKGlmIHRoZSBmaWxlCisgICBoYXMgYmVlbiBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIGZvcGVuKS4gIFRoZSBtb2RlIHBhcmFtZXRlciBpcyBhcyBpbiBnem9wZW4uCisKKyAgICAgVGhlIG5leHQgY2FsbCBvZiBnemNsb3NlIG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZSBmaWxlCisgICBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCwgbW9kZSkpIGNsb3NlcyB0aGUgZmlsZSBkZXNjcmlwdG9yCisgICBmZC4gIElmIHlvdSB3YW50IHRvIGtlZXAgZmQgb3BlbiwgdXNlIGZkID0gZHVwKGZkX2tlZXApOyBneiA9IGd6ZG9wZW4oZmQsCisgICBtb2RlKTsuICBUaGUgZHVwbGljYXRlZCBkZXNjcmlwdG9yIHNob3VsZCBiZSBzYXZlZCB0byBhdm9pZCBhIGxlYWssIHNpbmNlCisgICBnemRvcGVuIGRvZXMgbm90IGNsb3NlIGZkIGlmIGl0IGZhaWxzLgorCisgICAgIGd6ZG9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZQorICAgZ3pGaWxlIHN0YXRlLCBpZiBhbiBpbnZhbGlkIG1vZGUgd2FzIHNwZWNpZmllZCAoYW4gJ3InLCAndycsIG9yICdhJyB3YXMgbm90CisgICBwcm92aWRlZCwgb3IgJysnIHdhcyBwcm92aWRlZCksIG9yIGlmIGZkIGlzIC0xLiAgVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QKKyAgIHVzZWQgdW50aWwgdGhlIG5leHQgZ3oqIHJlYWQsIHdyaXRlLCBzZWVrLCBvciBjbG9zZSBvcGVyYXRpb24sIHNvIGd6ZG9wZW4KKyAgIHdpbGwgbm90IGRldGVjdCBpZiBmZCBpcyBpbnZhbGlkICh1bmxlc3MgZmQgaXMgLTEpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemJ1ZmZlciBPRigoZ3pGaWxlIGZpbGUsIHVuc2lnbmVkIHNpemUpKTsKKy8qCisgICAgIFNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUgdXNlZCBieSB0aGlzIGxpYnJhcnkncyBmdW5jdGlvbnMuICBUaGUKKyAgIGRlZmF1bHQgYnVmZmVyIHNpemUgaXMgODE5MiBieXRlcy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgIGd6b3BlbigpIG9yIGd6ZG9wZW4oKSwgYW5kIGJlZm9yZSBhbnkgb3RoZXIgY2FsbHMgdGhhdCByZWFkIG9yIHdyaXRlIHRoZQorICAgZmlsZS4gIFRoZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gaXMgYWx3YXlzIGRlZmVycmVkIHRvIHRoZSBmaXJzdCByZWFkIG9yCisgICB3cml0ZS4gIFR3byBidWZmZXJzIGFyZSBhbGxvY2F0ZWQsIGVpdGhlciBib3RoIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB3aGVuCisgICB3cml0aW5nLCBvciBvbmUgb2YgdGhlIHNwZWNpZmllZCBzaXplIGFuZCB0aGUgb3RoZXIgdHdpY2UgdGhhdCBzaXplIHdoZW4KKyAgIHJlYWRpbmcuICBBIGxhcmdlciBidWZmZXIgc2l6ZSBvZiwgZm9yIGV4YW1wbGUsIDY0SyBvciAxMjhLIGJ5dGVzIHdpbGwKKyAgIG5vdGljZWFibHkgaW5jcmVhc2UgdGhlIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gKHJlYWRpbmcpLgorCisgICAgIFRoZSBuZXcgYnVmZmVyIHNpemUgYWxzbyBhZmZlY3RzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZ3pwcmludGYoKS4KKworICAgICBnemJ1ZmZlcigpIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLCBzdWNoIGFzIGJlaW5nIGNhbGxlZAorICAgdG9vIGxhdGUuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuICBTZWUgdGhlIGRlc2NyaXB0aW9uCisgICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCisKKyAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKKyAgIG9wZW5lZCBmb3Igd3JpdGluZy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pyZWFkIE9GKChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pKTsKKy8qCisgICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIElmCisgICB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCBnenJlYWQgY29waWVzIHRoZSBnaXZlbiBudW1iZXIgb2YKKyAgIGJ5dGVzIGludG8gdGhlIGJ1ZmZlci4KKworICAgICBBZnRlciByZWFjaGluZyB0aGUgZW5kIG9mIGEgZ3ppcCBzdHJlYW0gaW4gdGhlIGlucHV0LCBnenJlYWQgd2lsbCBjb250aW51ZQorICAgdG8gcmVhZCwgbG9va2luZyBmb3IgYW5vdGhlciBnemlwIHN0cmVhbSwgb3IgZmFpbGluZyB0aGF0LCByZWFkaW5nIHRoZSByZXN0CisgICBvZiB0aGUgaW5wdXQgZmlsZSBkaXJlY3RseSB3aXRob3V0IGRlY29tcHJlc3Npb24uICBUaGUgZW50aXJlIGlucHV0IGZpbGUKKyAgIHdpbGwgYmUgcmVhZCBpZiBnenJlYWQgaXMgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQKKyAgIGxlbi4KKworICAgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkLCBsZXNzIHRoYW4KKyAgIGxlbiBmb3IgZW5kIG9mIGZpbGUsIG9yIC0xIGZvciBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3p3cml0ZSBPRigoZ3pGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwYyBidWYsIHVuc2lnbmVkIGxlbikpOworLyoKKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIG9yIDAgaW4gY2FzZSBvZgorICAgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUVkEgZ3pwcmludGYgT0YoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOworLyoKKyAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiAgZ3pwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiwgb3IgMCBpbiBjYXNlIG9mIGVycm9yLiAgVGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gaXMgbGltaXRlZCB0byA4MTkxLCBvciBvbmUgbGVzcyB0aGFuIHRoZSBidWZmZXIKKyAgIHNpemUgZ2l2ZW4gdG8gZ3pidWZmZXIoKS4gIFRoZSBjYWxsZXIgc2hvdWxkIGFzc3VyZSB0aGF0IHRoaXMgbGltaXQgaXMgbm90CisgICBleGNlZWRlZC4gIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGgKKyAgIG5vdGhpbmcgd3JpdHRlbi4gIEluIHRoaXMgY2FzZSwgdGhlcmUgbWF5IGFsc28gYmUgYSBidWZmZXIgb3ZlcmZsb3cgd2l0aAorICAgdW5wcmVkaWN0YWJsZSBjb25zZXF1ZW5jZXMsIHdoaWNoIGlzIHBvc3NpYmxlIG9ubHkgaWYgemxpYiB3YXMgY29tcGlsZWQgd2l0aAorICAgdGhlIGluc2VjdXJlIGZ1bmN0aW9ucyBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBiZWNhdXNlIHRoZSBzZWN1cmUgc25wcmludGYoKQorICAgb3IgdnNucHJpbnRmKCkgZnVuY3Rpb25zIHdlcmUgbm90IGF2YWlsYWJsZS4gIFRoaXMgY2FuIGJlIGRldGVybWluZWQgdXNpbmcKKyAgIHpsaWJDb21waWxlRmxhZ3MoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOworLyoKKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZworICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgorCisgICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBjaGFyICogWkVYUE9SVCBnemdldHMgT0YoKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pKTsKKy8qCisgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvciBhCisgICBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCisgICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBJZiBhbnkgY2hhcmFjdGVycyBhcmUgcmVhZCBvciBpZiBsZW4gPT0gMSwgdGhlCisgICBzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIGEgbnVsbCBjaGFyYWN0ZXIuICBJZiBubyBjaGFyYWN0ZXJzIGFyZSByZWFkIGR1ZQorICAgdG8gYW4gZW5kLW9mLWZpbGUgb3IgbGVuIDwgMSwgdGhlbiB0aGUgYnVmZmVyIGlzIGxlZnQgdW50b3VjaGVkLgorCisgICAgIGd6Z2V0cyByZXR1cm5zIGJ1ZiB3aGljaCBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIG9yIGl0IHJldHVybnMgTlVMTAorICAgZm9yIGVuZC1vZi1maWxlIG9yIGluIGNhc2Ugb2YgZXJyb3IuICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZSBjb250ZW50cyBhdAorICAgYnVmIGFyZSBpbmRldGVybWluYXRlLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOworLyoKKyAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuICBnenB1dGMKKyAgIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0YyBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZSBvciAtMQorICAgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3p1bmdldGMgT0YoKGludCBjLCBnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUHVzaCBvbmUgY2hhcmFjdGVyIGJhY2sgb250byB0aGUgc3RyZWFtIHRvIGJlIHJlYWQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgb24gdGhlIG5leHQgcmVhZC4gIEF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgb2YgcHVzaC1iYWNrIGlzIGFsbG93ZWQuCisgICBnenVuZ2V0YygpIHJldHVybnMgdGhlIGNoYXJhY3RlciBwdXNoZWQsIG9yIC0xIG9uIGZhaWx1cmUuICBnenVuZ2V0YygpIHdpbGwKKyAgIGZhaWwgaWYgYyBpcyAtMSwgYW5kIG1heSBmYWlsIGlmIGEgY2hhcmFjdGVyIGhhcyBiZWVuIHB1c2hlZCBidXQgbm90IHJlYWQKKyAgIHlldC4gIElmIGd6dW5nZXRjIGlzIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuIG9yIGd6ZG9wZW4sIGF0IGxlYXN0IHRoZQorICAgb3V0cHV0IGJ1ZmZlciBzaXplIG9mIHB1c2hlZCBjaGFyYWN0ZXJzIGlzIGFsbG93ZWQuICAoU2VlIGd6YnVmZmVyIGFib3ZlLikKKyAgIFRoZSBwdXNoZWQgY2hhcmFjdGVyIHdpbGwgYmUgZGlzY2FyZGVkIGlmIHRoZSBzdHJlYW0gaXMgcmVwb3NpdGlvbmVkIHdpdGgKKyAgIGd6c2VlaygpIG9yIGd6cmV3aW5kKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6Zmx1c2ggT0YoKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gIFRoZSBwYXJhbWV0ZXIgZmx1c2gKKyAgIGlzIGFzIGluIHRoZSBkZWZsYXRlKCkgZnVuY3Rpb24uICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliIGVycm9yIG51bWJlcgorICAgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4gIGd6Zmx1c2ggaXMgb25seSBwZXJtaXR0ZWQgd2hlbiB3cml0aW5nLgorCisgICAgIElmIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaXMgWl9GSU5JU0gsIHRoZSByZW1haW5pbmcgZGF0YSBpcyB3cml0dGVuIGFuZCB0aGUKKyAgIGd6aXAgc3RyZWFtIGlzIGNvbXBsZXRlZCBpbiB0aGUgb3V0cHV0LiAgSWYgZ3p3cml0ZSgpIGlzIGNhbGxlZCBhZ2FpbiwgYSBuZXcKKyAgIGd6aXAgc3RyZWFtIHdpbGwgYmUgc3RhcnRlZCBpbiB0aGUgb3V0cHV0LiAgZ3pyZWFkKCkgaXMgYWJsZSB0byByZWFkIHN1Y2gKKyAgIGNvbmNhdGVudGVkIGd6aXAgc3RyZWFtcy4KKworICAgICBnemZsdXNoIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IHdpbGwKKyAgIGRlZ3JhZGUgY29tcHJlc3Npb24gaWYgY2FsbGVkIHRvbyBvZnRlbi4KKyovCisKKy8qCitaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenNlZWsgT0YoKGd6RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSkpOworCisgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KKyAgIGNvbXByZXNzZWQgZmlsZS4gIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4gIFRoZSB3aGVuY2UgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgaW4gbHNlZWsoMik7CisgICB0aGUgdmFsdWUgU0VFS19FTkQgaXMgbm90IHN1cHBvcnRlZC4KKworICAgICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgYnV0IGNhbiBiZQorICAgZXh0cmVtZWx5IHNsb3cuICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcsIG9ubHkgZm9yd2FyZCBzZWVrcyBhcmUKKyAgIHN1cHBvcnRlZDsgZ3pzZWVrIHRoZW4gY29tcHJlc3NlcyBhIHNlcXVlbmNlIG9mIHplcm9lcyB1cCB0byB0aGUgbmV3CisgICBzdGFydGluZyBwb3NpdGlvbi4KKworICAgICBnenNlZWsgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCisgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLCBpbgorICAgcGFydGljdWxhciBpZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcgYW5kIHRoZSBuZXcgc3RhcnRpbmcgcG9zaXRpb24KKyAgIHdvdWxkIGJlIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pyZXdpbmQgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXdpbmRzIHRoZSBnaXZlbiBmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGZvciByZWFkaW5nLgorCisgICAgIGd6cmV3aW5kKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludClnenNlZWsoZmlsZSwgMEwsIFNFRUtfU0VUKQorKi8KKworLyoKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUICAgIGd6dGVsbCBPRigoZ3pGaWxlIGZpbGUpKTsKKworICAgICBSZXR1cm5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlIGdpdmVuCisgICBjb21wcmVzc2VkIGZpbGUuICBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0sIGFuZCBpcyB6ZXJvIHdoZW4gc3RhcnRpbmcsIGV2ZW4gaWYgYXBwZW5kaW5nIG9yCisgICByZWFkaW5nIGEgZ3ppcCBzdHJlYW0gZnJvbSB0aGUgbWlkZGxlIG9mIGEgZmlsZSB1c2luZyBnemRvcGVuKCkuCisKKyAgICAgZ3p0ZWxsKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX0NVUikKKyovCisKKy8qCitaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnem9mZnNldCBPRigoZ3pGaWxlIGZpbGUpKTsKKworICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IG9mZnNldCBpbiB0aGUgZmlsZSBiZWluZyByZWFkIG9yIHdyaXR0ZW4uICBUaGlzIG9mZnNldAorICAgaW5jbHVkZXMgdGhlIGNvdW50IG9mIGJ5dGVzIHRoYXQgcHJlY2VkZSB0aGUgZ3ppcCBzdHJlYW0sIGZvciBleGFtcGxlIHdoZW4KKyAgIGFwcGVuZGluZyBvciB3aGVuIHVzaW5nIGd6ZG9wZW4oKSBmb3IgcmVhZGluZy4gIFdoZW4gcmVhZGluZywgdGhlIG9mZnNldAorICAgZG9lcyBub3QgaW5jbHVkZSBhcyB5ZXQgdW51c2VkIGJ1ZmZlcmVkIGlucHV0LiAgVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZAorICAgZm9yIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yLiAgT24gZXJyb3IsIGd6b2Zmc2V0KCkgcmV0dXJucyAtMS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3plb2YgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXR1cm5zIHRydWUgKDEpIGlmIHRoZSBlbmQtb2YtZmlsZSBpbmRpY2F0b3IgaGFzIGJlZW4gc2V0IHdoaWxlIHJlYWRpbmcsCisgICBmYWxzZSAoMCkgb3RoZXJ3aXNlLiAgTm90ZSB0aGF0IHRoZSBlbmQtb2YtZmlsZSBpbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlCisgICByZWFkIHRyaWVkIHRvIGdvIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIGJ1dCBjYW1lIHVwIHNob3J0LiAgVGhlcmVmb3JlLAorICAganVzdCBsaWtlIGZlb2YoKSwgZ3plb2YoKSBtYXkgcmV0dXJuIGZhbHNlIGV2ZW4gaWYgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvCisgICByZWFkLCBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgbGFzdCByZWFkIHJlcXVlc3Qgd2FzIGZvciB0aGUgZXhhY3QgbnVtYmVyIG9mCisgICBieXRlcyByZW1haW5pbmcgaW4gdGhlIGlucHV0IGZpbGUuICBUaGlzIHdpbGwgaGFwcGVuIGlmIHRoZSBpbnB1dCBmaWxlIHNpemUKKyAgIGlzIGFuIGV4YWN0IG11bHRpcGxlIG9mIHRoZSBidWZmZXIgc2l6ZS4KKworICAgICBJZiBnemVvZigpIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgcmVhZCBmdW5jdGlvbnMgd2lsbCByZXR1cm4gbm8gbW9yZSBkYXRhLAorICAgdW5sZXNzIHRoZSBlbmQtb2YtZmlsZSBpbmRpY2F0b3IgaXMgcmVzZXQgYnkgZ3pjbGVhcmVycigpIGFuZCB0aGUgaW5wdXQgZmlsZQorICAgaGFzIGdyb3duIHNpbmNlIHRoZSBwcmV2aW91cyBlbmQgb2YgZmlsZSB3YXMgZGV0ZWN0ZWQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6ZGlyZWN0IE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUmV0dXJucyB0cnVlICgxKSBpZiBmaWxlIGlzIGJlaW5nIGNvcGllZCBkaXJlY3RseSB3aGlsZSByZWFkaW5nLCBvciBmYWxzZQorICAgKDApIGlmIGZpbGUgaXMgYSBnemlwIHN0cmVhbSBiZWluZyBkZWNvbXByZXNzZWQuICBUaGlzIHN0YXRlIGNhbiBjaGFuZ2UgZnJvbQorICAgZmFsc2UgdG8gdHJ1ZSB3aGlsZSByZWFkaW5nIHRoZSBpbnB1dCBmaWxlIGlmIHRoZSBlbmQgb2YgYSBnemlwIHN0cmVhbSBpcworICAgcmVhY2hlZCwgYnV0IGlzIGZvbGxvd2VkIGJ5IGRhdGEgdGhhdCBpcyBub3QgYW5vdGhlciBnemlwIHN0cmVhbS4KKworICAgICBJZiB0aGUgaW5wdXQgZmlsZSBpcyBlbXB0eSwgZ3pkaXJlY3QoKSB3aWxsIHJldHVybiB0cnVlLCBzaW5jZSB0aGUgaW5wdXQKKyAgIGRvZXMgbm90IGNvbnRhaW4gYSBnemlwIHN0cmVhbS4KKworICAgICBJZiBnemRpcmVjdCgpIGlzIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpIGl0IHdpbGwKKyAgIGNhdXNlIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIHRvIGFsbG93IHJlYWRpbmcgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIGlmIGl0CisgICBpcyBhIGd6aXAgZmlsZS4gIFRoZXJlZm9yZSBpZiBnemJ1ZmZlcigpIGlzIHVzZWQsIGl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCisgICBnemRpcmVjdCgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnemNsb3NlIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZSBhbmQKKyAgIGRlYWxsb2NhdGVzIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuICBOb3RlIHRoYXQgb25jZSBmaWxlIGlzIGNsb3NlZCwgeW91CisgICBjYW5ub3QgY2FsbCBnemVycm9yIHdpdGggZmlsZSwgc2luY2UgaXRzIHN0cnVjdHVyZXMgaGF2ZSBiZWVuIGRlYWxsb2NhdGVkLgorICAgZ3pjbG9zZSBtdXN0IG5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgZmlsZSwganVzdCBhcyBmcmVlCisgICBtdXN0IG5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgYWxsb2NhdGlvbi4KKworICAgICBnemNsb3NlIHdpbGwgcmV0dXJuIFpfU1RSRUFNX0VSUk9SIGlmIGZpbGUgaXMgbm90IHZhbGlkLCBaX0VSUk5PIG9uIGEKKyAgIGZpbGUgb3BlcmF0aW9uIGVycm9yLCBvciBaX09LIG9uIHN1Y2Nlc3MuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6Y2xvc2VfciBPRigoZ3pGaWxlIGZpbGUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pjbG9zZV93IE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgU2FtZSBhcyBnemNsb3NlKCksIGJ1dCBnemNsb3NlX3IoKSBpcyBvbmx5IGZvciB1c2Ugd2hlbiByZWFkaW5nLCBhbmQKKyAgIGd6Y2xvc2VfdygpIGlzIG9ubHkgZm9yIHVzZSB3aGVuIHdyaXRpbmcgb3IgYXBwZW5kaW5nLiAgVGhlIGFkdmFudGFnZSB0bworICAgdXNpbmcgdGhlc2UgaW5zdGVhZCBvZiBnemNsb3NlKCkgaXMgdGhhdCB0aGV5IGF2b2lkIGxpbmtpbmcgaW4gemxpYgorICAgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBjb2RlIHRoYXQgaXMgbm90IHVzZWQgd2hlbiBvbmx5IHJlYWRpbmcgb3Igb25seQorICAgd3JpdGluZyByZXNwZWN0aXZlbHkuICBJZiBnemNsb3NlKCkgaXMgdXNlZCwgdGhlbiBib3RoIGNvbXByZXNzaW9uIGFuZAorICAgZGVjb21wcmVzc2lvbiBjb2RlIHdpbGwgYmUgaW5jbHVkZWQgdGhlIGFwcGxpY2F0aW9uIHdoZW4gbGlua2luZyB0byBhIHN0YXRpYworICAgemxpYiBsaWJyYXJ5LgorKi8KKworWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCBnemVycm9yIE9GKChnekZpbGUgZmlsZSwgaW50ICplcnJudW0pKTsKKy8qCisgICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZSBnaXZlbgorICAgY29tcHJlc3NlZCBmaWxlLiAgZXJybnVtIGlzIHNldCB0byB6bGliIGVycm9yIG51bWJlci4gIElmIGFuIGVycm9yIG9jY3VycmVkCisgICBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwgZXJybnVtIGlzIHNldCB0bworICAgWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vIHRvIGdldCB0aGUgZXhhY3QgZXJyb3IgY29kZS4KKworICAgICBUaGUgYXBwbGljYXRpb24gbXVzdCBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCBzdHJpbmcuICBGdXR1cmUgY2FsbHMgdG8KKyAgIHRoaXMgZnVuY3Rpb24gbWF5IGludmFsaWRhdGUgdGhlIHByZXZpb3VzbHkgcmV0dXJuZWQgc3RyaW5nLiAgSWYgZmlsZSBpcworICAgY2xvc2VkLCB0aGVuIHRoZSBzdHJpbmcgcHJldmlvdXNseSByZXR1cm5lZCBieSBnemVycm9yIHdpbGwgbm8gbG9uZ2VyIGJlCisgICBhdmFpbGFibGUuCisKKyAgICAgZ3plcnJvcigpIHNob3VsZCBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGVycm9ycyBmcm9tIGVuZC1vZi1maWxlIGZvciB0aG9zZQorICAgZnVuY3Rpb25zIGFib3ZlIHRoYXQgZG8gbm90IGRpc3Rpbmd1aXNoIHRob3NlIGNhc2VzIGluIHRoZWlyIHJldHVybiB2YWx1ZXMuCisqLworCitaRVhURVJOIHZvaWQgWkVYUE9SVCBnemNsZWFyZXJyIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgQ2xlYXJzIHRoZSBlcnJvciBhbmQgZW5kLW9mLWZpbGUgZmxhZ3MgZm9yIGZpbGUuICBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUKKyAgIGNsZWFyZXJyKCkgZnVuY3Rpb24gaW4gc3RkaW8uICBUaGlzIGlzIHVzZWZ1bCBmb3IgY29udGludWluZyB0byByZWFkIGEgZ3ppcAorICAgZmlsZSB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gY29uY3VycmVudGx5LgorKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja3N1bSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVsYXRlZCB0byBjb21wcmVzc2lvbiBidXQgYXJlIGV4cG9ydGVkCisgICBhbnl3YXkgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGNvbXByZXNzaW9uCisgICBsaWJyYXJ5LgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzIgT0YoKHVMb25nIGFkbGVyLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZAorICAgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiAgSWYgYnVmIGlzIFpfTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZQorICAgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgorCisgICAgIEFuIEFkbGVyLTMyIGNoZWNrc3VtIGlzIGFsbW9zdCBhcyByZWxpYWJsZSBhcyBhIENSQzMyIGJ1dCBjYW4gYmUgY29tcHV0ZWQKKyAgIG11Y2ggZmFzdGVyLgorCisgICBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGFkbGVyID0gYWRsZXIzMihhZGxlciwgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChhZGxlciAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKKyovCisKKy8qCitaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZyBhZGxlcjEsIHVMb25nIGFkbGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3QgbGVuMikpOworCisgICAgIENvbWJpbmUgdHdvIEFkbGVyLTMyIGNoZWNrc3VtcyBpbnRvIG9uZS4gIEZvciB0d28gc2VxdWVuY2VzIG9mIGJ5dGVzLCBzZXExCisgICBhbmQgc2VxMiB3aXRoIGxlbmd0aHMgbGVuMSBhbmQgbGVuMiwgQWRsZXItMzIgY2hlY2tzdW1zIHdlcmUgY2FsY3VsYXRlZCBmb3IKKyAgIGVhY2gsIGFkbGVyMSBhbmQgYWRsZXIyLiAgYWRsZXIzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YKKyAgIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBhZGxlcjEsIGFkbGVyMiwgYW5kIGxlbjIuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzIgICBPRigodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQorICAgdXBkYXRlZCBDUkMtMzIuICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkCisgICBpbml0aWFsIHZhbHVlIGZvciB0aGUgZm9yIHRoZSBjcmMuICBQcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZyAob25lJ3MKKyAgIGNvbXBsZW1lbnQpIGlzIHBlcmZvcm1lZCB3aXRoaW4gdGhpcyBmdW5jdGlvbiBzbyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBieSB0aGUKKyAgIGFwcGxpY2F0aW9uLgorCisgICBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CisqLworCisvKgorWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOworCisgICAgIENvbWJpbmUgdHdvIENSQy0zMiBjaGVjayB2YWx1ZXMgaW50byBvbmUuICBGb3IgdHdvIHNlcXVlbmNlcyBvZiBieXRlcywKKyAgIHNlcTEgYW5kIHNlcTIgd2l0aCBsZW5ndGhzIGxlbjEgYW5kIGxlbjIsIENSQy0zMiBjaGVjayB2YWx1ZXMgd2VyZQorICAgY2FsY3VsYXRlZCBmb3IgZWFjaCwgY3JjMSBhbmQgY3JjMi4gIGNyYzMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBDUkMtMzIKKyAgIGNoZWNrIHZhbHVlIG9mIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBjcmMxLCBjcmMyLCBhbmQKKyAgIGxlbjIuCisqLworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKi8KKworLyogZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgorICogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2Ygel9zdHJlYW06CisgKi8KK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLCBpbnQgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwgY29uc3QgY2hhciAqdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9zaXplKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOworI2RlZmluZSBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkgXAorICAgICAgICBkZWZsYXRlSW5pdF8oKHN0cm0pLCAobGV2ZWwpLCAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGluZmxhdGVJbml0KHN0cm0pIFwKKyAgICAgICAgaW5mbGF0ZUluaXRfKChzdHJtKSwgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSBcCisgICAgICAgIGRlZmxhdGVJbml0Ml8oKHN0cm0pLChsZXZlbCksKG1ldGhvZCksKHdpbmRvd0JpdHMpLChtZW1MZXZlbCksXAorICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSksICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGluZmxhdGVJbml0MihzdHJtLCB3aW5kb3dCaXRzKSBcCisgICAgICAgIGluZmxhdGVJbml0Ml8oKHN0cm0pLCAod2luZG93Qml0cyksIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUJhY2tJbml0KHN0cm0sIHdpbmRvd0JpdHMsIHdpbmRvdykgXAorICAgICAgICBpbmZsYXRlQmFja0luaXRfKChzdHJtKSwgKHdpbmRvd0JpdHMpLCAod2luZG93KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisKKy8qIHByb3ZpZGUgNjQtYml0IG9mZnNldCBmdW5jdGlvbnMgaWYgX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkLCBhbmQvb3IKKyAqIGNoYW5nZSB0aGUgcmVndWxhciBmdW5jdGlvbnMgdG8gNjQgYml0cyBpZiBfRklMRV9PRkZTRVRfQklUUyBpcyA2NCAoaWYKKyAqIGJvdGggYXJlIHRydWUsIHRoZSBhcHBsaWNhdGlvbiBnZXRzIHRoZSAqNjQgZnVuY3Rpb25zLCBhbmQgdGhlIHJlZ3VsYXIKKyAqIGZ1bmN0aW9ucyBhcmUgY2hhbmdlZCB0byA2NCBiaXRzKSAtLSBpbiBjYXNlIHRoZXNlIGFyZSBzZXQgb24gc3lzdGVtcworICogd2l0aG91dCBsYXJnZSBmaWxlIHN1cHBvcnQsIF9MRlM2NF9MQVJHRUZJTEUgbXVzdCBhbHNvIGJlIHRydWUKKyAqLworI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgX0xGUzY0X0xBUkdFRklMRS0wCisgICBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbjY0IE9GKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnenNlZWs2NCBPRigoZ3pGaWxlLCB6X29mZjY0X3QsIGludCkpOworICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnenRlbGw2NCBPRigoZ3pGaWxlKSk7CisgICBaRVhURVJOIHpfb2ZmNjRfdCBaRVhQT1JUIGd6b2Zmc2V0NjQgT0YoKGd6RmlsZSkpOworICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmNjRfdCkpOworICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZjY0X3QpKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWkxJQl9JTlRFUk5BTCkgJiYgX0ZJTEVfT0ZGU0VUX0JJVFMtMCA9PSA2NCAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKKyMgIGRlZmluZSBnem9wZW4gZ3pvcGVuNjQKKyMgIGRlZmluZSBnenNlZWsgZ3pzZWVrNjQKKyMgIGRlZmluZSBnenRlbGwgZ3p0ZWxsNjQKKyMgIGRlZmluZSBnem9mZnNldCBnem9mZnNldDY0CisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lIGFkbGVyMzJfY29tYmluZTY0CisjICBkZWZpbmUgY3JjMzJfY29tYmluZSBjcmMzMl9jb21iaW5lNjQKKyMgIGlmZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW42NCBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyAgICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pzZWVrNjQgT0YoKGd6RmlsZSwgel9vZmZfdCwgaW50KSk7CisgICAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6dGVsbDY0IE9GKChnekZpbGUpKTsKKyAgICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pvZmZzZXQ2NCBPRigoZ3pGaWxlKSk7CisgICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisgICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworIyAgZW5kaWYKKyNlbHNlCisgICBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlLCB6X29mZl90LCBpbnQpKTsKKyAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6dGVsbCBPRigoZ3pGaWxlKSk7CisgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnem9mZnNldCBPRigoZ3pGaWxlKSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyNlbmRpZgorCisvKiBoYWNrIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNpZiAhZGVmaW5lZChaVVRJTF9IKSAmJiAhZGVmaW5lZChOT19EVU1NWV9ERUNMKQorICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307CisjZW5kaWYKKworLyogdW5kb2N1bWVudGVkIGZ1bmN0aW9ucyAqLworWkVYVEVSTiBjb25zdCBjaGFyICAgKiBaRVhQT1JUIHpFcnJvciAgICAgICAgICAgT0YoKGludCkpOworWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQgT0YoKHpfc3RyZWFtcCkpOworWkVYVEVSTiBjb25zdCB1TG9uZ2YgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUgICAgT0YoKHZvaWQpKTsKK1pFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlVW5kZXJtaW5lIE9GKCh6X3N0cmVhbXAsIGludCkpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogWkxJQl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvTWFrZWZpbGUgYi9jb20zMi9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyNGFlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDEzNCBAQAorIworIyBPTkxZIElOQ0xVREUgTUlUIE9SIDIvMy1CU0QtTElDRU5TRUQgQ09ERSBJTiBUSElTIExJQlJBUlkKKyMKKworIyBJbmNsdWRlIGNvbmZpZ3VyYXRpb24gcnVsZXMKK05PR1BMIDo9IDEKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvbGliLm1rCisKKyMjIE9QVElPTkFMIE9CSkVDVFMsIEFWQUlMQUJMRSBBUyBEWU5BTUlDIExJTktFRCBNT0RVTEVTCisjIFBORyBsaWJyYXJ5IG9iamVjdCBmaWxlcworTElCUE5HX09CSlMgPSBcCisJbGlicG5nL3BuZy5vIGxpYnBuZy9wbmdzZXQubyBsaWJwbmcvcG5nZ2V0Lm8gbGlicG5nL3BuZ3J1dGlsLm8gIFwKKwlsaWJwbmcvcG5ndHJhbnMubyBsaWJwbmcvcG5nd3V0aWwubyBsaWJwbmcvcG5ncmVhZC5vCQlcCisJbGlicG5nL3BuZ3Jpby5vIGxpYnBuZy9wbmd3aW8ubyBsaWJwbmcvcG5nd3JpdGUubwkJXAorCWxpYnBuZy9wbmdydHJhbi5vIGxpYnBuZy9wbmd3dHJhbi5vIGxpYnBuZy9wbmdtZW0ubwkJXAorCWxpYnBuZy9wbmdlcnJvci5vIGxpYnBuZy9wbmdwcmVhZC5vCisKKyMgSlBHIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitMSUJKUEdfT0JKUyA9IFwKKwlqcGVnL3RpbnlqcGVnLm8ganBlZy9qaWRjdGZsdC5vCWpwZWcvZGVjb2RlMS5vIGpwZWcvZGVjb2RlMy5vICAgXAorCWpwZWcvcmdiMjQubyBqcGVnL2JncjI0Lm8ganBlZy95dXY0MjBwLm8ganBlZy9ncmV5Lm8JCVwKKwlqcGVnL3JnYmEzMi5vIGpwZWcvYmdyYTMyLm8JCQkJCQorCitpZmRlZiBFRklfQlVJTEQKK0k5MTVWRVNBX09CSiA9CitlbHNlCitJOTE1VkVTQV9PQkogPSBzeXMvdmVzYS9pOTE1cmVzb2x1dGlvbi5vCitlbmRpZgorCitMSUJWRVNBX09CSlMgPSBcCisJc3lzL3Zlc2Fjb25fd3JpdGUubyBzeXMvdmVzYXNlcmlhbF93cml0ZS5vCQkJXAorCXN5cy92ZXNhL2luaXR2ZXNhLm8gc3lzL3Zlc2EvZHJhd3R4dC5vCXN5cy92ZXNhL2JhY2tncm91bmQubwlcCisJc3lzL3Zlc2EvYWxwaGF0YmwubyBzeXMvdmVzYS9zY3JlZW5jcHkubyBzeXMvdmVzYS9mbXRwaXhlbC5vCVwKKwkkKEk5MTVWRVNBX09CSikKKworTElCTUlTQ19PQkpTID0gXAorCXN5cy9saWJhbnNpLm8gc3lzL2dweGUubworCitMSUJQQ0lfT0JKUyA9IFwKKwlwY2kvY2ZndHlwZS5vIHBjaS9zY2FuLm8gcGNpL2Jpb3MubwkJCQlcCisJcGNpL3JlYWRiLm8gcGNpL3JlYWR3Lm8gcGNpL3JlYWRsLm8JCQkJXAorCXBjaS93cml0ZWIubyBwY2kvd3JpdGV3Lm8gcGNpL3dyaXRlbC5vCisKK0xJQlNZU0xJTlVYX09CSlMgPSBcCisJc3lzbGludXgvcmVib290Lm8gc3lzbGludXgva2V5Ym9hcmQubwkJCQlcCisJc3lzbGludXgvdmVyc2lvbi5vCQkJCQkJXAorCXN5c2xpbnV4L3B4ZV9nZXRfY2FjaGVkLm8gc3lzbGludXgvcHhlX2dldF9uaWMubwkJXAorCXN5c2xpbnV4L3B4ZV9kbnMubwkJCQkJCVwKKwlzeXNsaW51eC92aWRlby9mb250cXVlcnkubyBzeXNsaW51eC92aWRlby9yZXBvcnRtb2RlLm8KKworRFlORU5UUllfT0JKUyA9IFwKKwlhdGV4aXQubyBvbmV4aXQubyBhYm9ydC5vCisKK01JTkxJQk9CSlMgPSBcCisJc3lzbGludXgvaXBhcHBlbmQubyBcCisJc3lzbGludXgvZHNpbmZvLm8gXAorCSQoTElCT1RIRVJfT0JKUykgXAorCSQoTElCR0NDX09CSlMpIFwKKwkkKExJQkNPTlNPTEVfT0JKUykgXAorCSQoTElCTE9BRF9PQkpTKSBcCisJJChMSUJaTElCX09CSlMpCisjCSQoTElCVkVTQV9PQkpTKQorCitEWU5MSUJPQkpTID0gXAorCSQoTElCWkxJQl9PQkpTKSBcCisJJChMSUJQTkdfT0JKUykgXAorCSQoTElCSlBHX09CSlMpIFwKKwkkKExJQlBDSV9PQkpTKSBcCisJJChMSUJWRVNBX09CSlMpIFwKKwkkKExJQlNZU0xJTlVYX09CSlMpIFwKKwkkKExJQkxPQURfT0JKUykgXAorCSQoTElCTUlTQ19PQkpTKSBcCisJJChEWU5FTlRSWV9PQkpTKQorCisKK0xJQk9CSlMgPSAkKERZTkxJQk9CSlMpCisKK0JJTkRJUiAgID0gL3Vzci9iaW4KK0xJQkRJUiAgID0gL3Vzci9saWIKK0RBVEFESVIgID0gL3Vzci9zaGFyZQorQVVYRElSICAgPSAkKERBVEFESVIpL3N5c2xpbnV4CitJTkNESVIgICA9IC91c3IvaW5jbHVkZQorQ09NMzJESVIgPSAkKEFVWERJUikvY29tMzIKKworYWxsOiBtYWtlb3V0cHV0ZGlycyBsaWJjb20zMi5jMzIgbGliY29tMzJtaW4uYSBsaWJjb20zMmNvcmUuYQorCittYWtlb3V0cHV0ZGlyczoKKwlAbWtkaXIgLXAgJChmb3JlYWNoIGIsIFwKKwkJJChhZGRwcmVmaXggJChPQkopLywkKHNvcnQgJChkaXIgJChMSUJPQkpTKSAkKE1JTkxJQk9CSlMpICQoQ09SRUxJQk9CSlMpKSkpLCQoYikpCisKK2xpYmNvbTMyLmVsZiA6ICQoTElCT0JKUykKKwlybSAtZiAkQAorCSQoTEQpIC1zaGFyZWQgJChMREZMQUdTKSAtc29uYW1lICQocGF0c3Vic3QgJS5lbGYsJS5jMzIsJChARikpIC1vICRAICReCisKK2xpYmNvbTMybWluLmEgOiAkKE1JTkxJQk9CSlMpCisJcm0gLWYgJEAKKwkkKEFSKSBjcSAkQCAkXgorCSQoUkFOTElCKSAkQAorCitsaWJjb20zMmNvcmUuYSA6ICQoQ09SRUxJQk9CSlMpCisJcm0gLWYgJEAKKwkkKEFSKSBjcSAkQCAkXgorCSQoUkFOTElCKSAkQAorCit0aWR5IGRpc3QgY2xlYW46CisJcm0gLWYgc3lzL3Zlc2EvYWxwaGF0YmwuYyBlcnJsaXN0LmMKKwlmaW5kIC4gXCggLW5hbWUgXCoubyAtbyAtbmFtZSBcKi5hIC1vIC1uYW1lIC5cKi5kIC1vIC1uYW1lIFwqLnRtcCBcKSAtcHJpbnQwIHwgXAorCQl4YXJncyAtMHIgcm0gLWYKKworc3BvdGxlc3M6IGNsZWFuCisJcm0gLWYgKi5hICouYzMyCisJcm0gLWYgKn4gXCMqICovKn4gKi9cIyoKKworaW5zdGFsbDogYWxsCisJbWtkaXIgLW0gNzU1IC1wICQoSU5TVEFMTFJPT1QpJChDT00zMkRJUikKKwlpbnN0YWxsIC1tIDY0NCAkKFNSQykvY29tMzIubGQgJChJTlNUQUxMUk9PVCkkKENPTTMyRElSKQorCS1ybSAtcmYgJChJTlNUQUxMUk9PVCkkKENPTTMyRElSKS9pbmNsdWRlCisJY3AgLXIgJChTUkMpLy4uL2luY2x1ZGUgJChJTlNUQUxMUk9PVCkkKENPTTMyRElSKQorCitlcnJsaXN0LmM6IG1ha2VlcnJsaXN0LnBsICQoU1JDKS8uLi9pbmNsdWRlL2Vycm5vLmgKKwkkKFBFUkwpICQ8ICAkKENGTEFHUykgLWVycmxpc3QgPiAkQCB8fCBybSAtZiAkQAorCisjIFRoZXNlIGZpbGVzIGFyZSBwZXJmb3JtYW5jZSBjcml0aWNhbCwgYW5kIGRvZXNuJ3QgY29tcGlsZSB3ZWxsIHdpdGggLU9zCitzeXMvdmVzYS9kcmF3dHh0Lm86IHN5cy92ZXNhL2RyYXd0eHQuYworCSQoQ0MpICQoTUFLRURFUFMpICQoQ0ZMQUdTKSAtTzMgLWMgLW8gJEAgJDwKKworc3lzL3Zlc2EvYWxwaGF0YmwuYzogc3lzL3Zlc2EvYWxwaGF0YmwucGwKKwkkKFBFUkwpICQ8ID4gJEAKKworanBlZy9qaWRjdGZsdC5vOiBqcGVnL2ppZGN0Zmx0LmMKKwkkKENDKSAkKE1BS0VERVBTKSAkKENGTEFHUykgLU8zIC1jIC1vICRAICQ8CisKKy1pbmNsdWRlIC4qLmQgKi8uKi5kICovKi8uKi5kCmRpZmYgLS1naXQgYS9jb20zMi9saWIvYWJvcnQuYyBiL2NvbTMyL2xpYi9hYm9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDhiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvYWJvcnQuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogYWJvcnQuYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwordm9pZCBhYm9ydCh2b2lkKQoreworICAgIF9leGl0KDI1NSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvYXNwcmludGYuYyBiL2NvbTMyL2xpYi9hc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjIwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvYXNwcmludGYuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogYXNwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitpbnQgYXNwcmludGYoY2hhciAqKmJ1ZnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXAsIGFwMTsKKyAgICBpbnQgcnY7CisgICAgaW50IGJ5dGVzOworICAgIGNoYXIgKnA7CisKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgICB2YV9jb3B5KGFwMSwgYXApOworCisgICAgYnl0ZXMgPSB2c25wcmludGYoTlVMTCwgMCwgZm9ybWF0LCBhcDEpICsgMTsKKyAgICB2YV9lbmQoYXAxKTsKKworICAgICpidWZwID0gcCA9IG1hbGxvYyhieXRlcyk7CisgICAgaWYgKCFwKQorCXJ2ID0gLTE7CisgICAgZWxzZQorCXJ2ID0gdnNucHJpbnRmKHAsIGJ5dGVzLCBmb3JtYXQsIGFwKTsKKworICAgIHZhX2VuZChhcCk7CisKKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvYXRleGl0LmMgYi9jb20zMi9saWIvYXRleGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0NzkwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9hdGV4aXQuYwpAQCAtMCwwICsxLDEwIEBACisvKgorICogYXRleGl0LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBhdGV4aXQodm9pZCAoKmZjdG4pICh2b2lkKSkKK3sKKyAgICByZXR1cm4gb25fZXhpdCgodm9pZCAoKikoaW50LCB2b2lkICopKWZjdG4sIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2F0ZXhpdC5oIGIvY29tMzIvbGliL2F0ZXhpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxN2JlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvYXRleGl0LmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGF0ZXhpdC5oCisgKgorICogYXRleGl0KCkvb25fZXhpdCgpIGludGVybmFsIGRlZmluaXRpb25zCisgKi8KKworI2lmbmRlZiBBVEVYSVRfSAorI2RlZmluZSBBVEVYSVRfSAorCitzdHJ1Y3QgYXRleGl0IHsKKyAgICB2b2lkICgqZmN0bikgKGludCwgdm9pZCAqKTsKKyAgICB2b2lkICphcmc7CQkJLyogb25fZXhpdCgpIHBhcmFtZXRlciAqLworICAgIHN0cnVjdCBhdGV4aXQgKm5leHQ7Cit9OworCisjZW5kaWYgLyogQVRFWElUX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9hdG9pLmMgYi9jb20zMi9saWIvYXRvaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZWMwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvYXRvaS5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIGludAorI2RlZmluZSBOQU1FIGF0b2kKKyNpbmNsdWRlICJhdG94LmMiCmRpZmYgLS1naXQgYS9jb20zMi9saWIvYXRvbC5jIGIvY29tMzIvbGliL2F0b2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU0ODRlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2F0b2wuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgVFlQRSBsb25nCisjZGVmaW5lIE5BTUUgYXRvbAorI2luY2x1ZGUgImF0b3guYyIKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9hdG9sbC5jIGIvY29tMzIvbGliL2F0b2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkZjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9hdG9sbC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIGxvbmcgbG9uZworI2RlZmluZSBOQU1FIGF0b2xsCisjaW5jbHVkZSAiYXRveC5jIgpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2F0b3guYyBiL2NvbTMyL2xpYi9hdG94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5MTdjZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9hdG94LmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGF0b3guYworICoKKyAqIGF0b2koKSwgYXRvbCgpLCBhdG9sbCgpCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworVFlQRSBOQU1FKGNvbnN0IGNoYXIgKm5wdHIpCit7CisgICAgcmV0dXJuIChUWVBFKSBzdHJudG91bWF4KG5wdHIsIChjaGFyICoqKU5VTEwsIDEwLCB+KHNpemVfdCkgMCk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvYnVmcHJpbnRmLmMgYi9jb20zMi9saWIvYnVmcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4MTIzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9idWZwcmludGYuYwpAQCAtMCwwICsxLDQ1IEBACisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxidWZwcmludGYuaD4KKworaW50IHZidWZwcmludGYoc3RydWN0IHByaW50X2J1ZiAqYnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisgICAgdmFfbGlzdCBhcDI7CisgICAgaW50IHJ2OworCisgICAgdmFfY29weShhcDIsIGFwKTsKKyAgICBydiA9IHZzbnByaW50ZihOVUxMLCAwLCBmb3JtYXQsIGFwKTsKKworICAgIC8qID49IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHNwYWNlIGZvciB0ZXJtaW5hdGluZyBudWxsICovCisgICAgaWYgKHJ2ICsgYnVmLT5sZW4gPj0gYnVmLT5zaXplKSB7CisJc2l6ZV90IG5ld3NpemUgPSBydiArIGJ1Zi0+bGVuICsgQlVGUEFEOworCWNoYXIgKm5ld2J1ZjsKKworCW5ld2J1ZiA9IHJlYWxsb2MoYnVmLT5idWYsIG5ld3NpemUpOworCWlmICghbmV3YnVmKSB7CisJICAgIHJ2ID0gLTE7CisJICAgIGdvdG8gYmFpbDsKKwl9CisKKwlidWYtPmJ1ZiA9IG5ld2J1ZjsKKwlidWYtPnNpemUgPSBuZXdzaXplOworICAgIH0KKworICAgIHJ2ID0gdnNucHJpbnRmKGJ1Zi0+YnVmICsgYnVmLT5sZW4sIGJ1Zi0+c2l6ZSAtIGJ1Zi0+bGVuLCBmb3JtYXQsIGFwMik7CisgICAgYnVmLT5sZW4gKz0gcnY7CitiYWlsOgorICAgIHZhX2VuZChhcDIpOworICAgIHJldHVybiBydjsKK30KKworaW50IGJ1ZnByaW50ZihzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgaW50IHJ2OworCisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgcnYgPSB2YnVmcHJpbnRmKGJ1ZiwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvY2FsbG9jLmMgYi9jb20zMi9saWIvY2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiM2M1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9jYWxsb2MuYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogY2FsbG9jLmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIEZJWE1FOiBUaGlzIHNob3VsZCBsb29rIGZvciBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyAqLworCit2b2lkICpjYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gemFsbG9jKHNpemUgKiBubWVtYik7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvY2hycmVwbGFjZS5jIGIvY29tMzIvbGliL2NocnJlcGxhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc4NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2NocnJlcGxhY2UuYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLyogUmVwbGFjZSBjaGFyICdvbGQnIGJ5IGNoYXIgJ25ldycgaW4gc291cmNlICovCit2b2lkIGNocnJlcGxhY2UoY2hhciAqc291cmNlLCBjaGFyIG9sZCwgY2hhciBuZXcpIAoreworICAgIHdoaWxlICgqc291cmNlKSB7IAorCXNvdXJjZSsrOworCWlmIChzb3VyY2VbMF0gPT0gb2xkKSBzb3VyY2VbMF09bmV3OworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2NvbTMyLmxkIGIvY29tMzIvbGliL2NvbTMyLmxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDBlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvY29tMzIubGQKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciBDT00zMiBiaW5hcmllcyB1c2luZyBsaWJjb20zMgorICovCisKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFWFRFUk4oX3N0YXJ0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAwOworICBISURERU4gKF9fZXhlY3V0YWJsZV9zdGFydCA9IC4pOworICBISURERU4gKF9zdGV4dCA9IC4pOworCisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBISURERU4gKF9ldGV4dCA9IC4pOworCisgIEhJRERFTiggX19yb2RhdGFfc3RhcnQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICBISURERU4oX19yb2RhdGFfZW5kID0gLik7CisKKyAgLyoKKyAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlIC5jdG9ycy8uZHRvcnMgYW5kIC5pbml0X2FycmF5Ly5maW5pX2FycmF5CisgICAqIGlzIHRoZSBvcmRlcmluZywgYnV0IHdlIGRvbid0IHVzZSBwcmlvcml0aXphdGlvbiBmb3IgbGliY29tMzIsIHNvCisgICAqIGp1c3QgbHVtcCB0aGVtIGFsbCB0b2dldGhlciBhbmQgaG9wZSB0aGF0J3Mgb2theS4KKyAgICovCisgIC4gPSBBTElHTig0KTsKKyAgLmN0b3JzICAgICAgICAgIDogeworICAgIEhJRERFTihfX2N0b3JzX3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5wcmVpbml0X2FycmF5KikpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheSopKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzKikpKQorICAgIEhJRERFTihfX2N0b3JzX2VuZCA9IC4pOworICB9CisgIC5kdG9ycyAgICAgICAgICA6IHsKKyAgICBISURERU4oX19kdG9yc19zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheSopKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzKikpKQorICAgIEhJRERFTihfX2R0b3JzX2VuZCA9IC4pOworICB9CisKKyAgLmdvdCAgICAgICAgICAgIDogeworICAgIEhJRERFTihfX2dvdF9zdGFydCA9IC4pOworICAgIEtFRVAgKCooLmdvdC5wbHQpKQorICAgIEtFRVAgKCooLmdvdCkpCisgICAgSElEREVOKF9fZ290X2VuZCA9IC4pOworICB9CisKKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgQXZvaWQgbWl4aW5nIGNvZGUgYW5kCisgICAgIGRhdGEgd2l0aGluIHNhbWUgMTI4LWJ5dGUgY2h1bmsuICovCisgIC4gPSBBTElHTigxMjgpOworCisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICBISURERU4oX3NkYXRhID0gLik7CisgICAgS0VFUCgqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICAgICooLmRhdGExKQorICAgIC4gPSBBTElHTig0KTsKKyAgICBISURERU4oX2VkYXRhID0gLik7CisgIH0KKworICBISURERU4oX19ic3Nfc3RhcnQgPSAuKTsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig0KTsKKyAgfQorICAuID0gQUxJR04oNCk7CisgIEhJRERFTihfZW5kID0gLik7CisKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9jcmVhdC5jIGIvY29tMzIvbGliL2NyZWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0ZGM2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9jcmVhdC5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiBjcmVhdC5jCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworaW50IGNyZWF0KGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBtb2RlX3QgbW9kZSkKK3sKKyAgICByZXR1cm4gb3BlbihwYXRobmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQywgbW9kZSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvY3R5cGVzLmMgYi9jb20zMi9saWIvY3R5cGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxMjVhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9jdHlwZXMuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIGN0eXBlcy5jCisgKgorICogVGhpcyBpcyB0aGUgYXJyYXkgdGhhdCBkZWZpbmVzIDxjdHlwZS5oPiBjbGFzc2VzLgorICogVGhpcyBhc3N1bWVzIElTTyA4ODU5LTEuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgX19jdHlwZXNbMjU3XSA9IHsKKyAgICAwLAkJCQkvKiBFT0YgKi8KKworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwgfCBfX2N0eXBlX3NwYWNlLAkvKiBCUyAqLworICAgIF9fY3R5cGVfY250cmwgfCBfX2N0eXBlX3NwYWNlLAkvKiBUQUIgKi8KKyAgICBfX2N0eXBlX2NudHJsIHwgX19jdHlwZV9zcGFjZSwJLyogTEYgKi8KKyAgICBfX2N0eXBlX2NudHJsIHwgX19jdHlwZV9zcGFjZSwJLyogVlQgKi8KKyAgICBfX2N0eXBlX2NudHJsIHwgX19jdHlwZV9zcGFjZSwJLyogRkYgKi8KKyAgICBfX2N0eXBlX2NudHJsIHwgX19jdHlwZV9zcGFjZSwJLyogQ1IgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfc3BhY2UsCS8qIHNwYWNlICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisKKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfZGlnaXQgfCBfX2N0eXBlX3hkaWdpdCwJLyogZGlnaXQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfZGlnaXQgfCBfX2N0eXBlX3hkaWdpdCwJLyogZGlnaXQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfZGlnaXQgfCBfX2N0eXBlX3hkaWdpdCwJLyogZGlnaXQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisKKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisKKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisgICAgX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisKKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3NwYWNlLAkvKiBOQlNQICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisKKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisgICAgX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisKKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKyAgICBfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworICAgIF9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9kaGNwcGFjay5jIGIvY29tMzIvbGliL2RoY3BwYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4NTgzYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9kaGNwcGFjay5jCkBAIC0wLDAgKzEsMTY2IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKy8vICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKy8vICNpbmNsdWRlICJkaGNwLmgiCisjaW5jbHVkZSA8ZGhjcC5oPgorCisvKgorICogUGFjayBESENQIG9wdGlvbnMgaW50byBhbiBvcHRpb24gZmllbGQsIHdpdGhvdXQgb3ZlcmxvYWQgc3VwcG9ydC4KKyAqIE9uIHJldHVybiwgbGVuIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYWN0aXZlIGJ5dGVzLCBhbmQgdGhlIGZ1bGwKKyAqIGZpZWxkIGlzIHplcm8tcGFkZGVkLgorICoKKyAqIE9wdGlvbnMgd2hpY2ggYXJlIHN1Y2Nlc3NmdWxseSBwbGFjZWQgaGF2ZSB0aGVpciBsZW5ndGggemVyb2VkIG91dC4KKyAqLworc3RhdGljIGludCBkaGNwX3BhY2tfZmllbGRfemVybyh2b2lkICpmaWVsZCwgc2l6ZV90ICpsZW4sCisJCQkJc3RydWN0IGRoY3Bfb3B0aW9uIG9wdFsyNTZdKQoreworCWludCBpOworCXNpemVfdCB4bGVuLCBwbGVuOworCWNvbnN0IHVpbnQ4X3QgKnA7CisJdWludDhfdCAqcSA9IGZpZWxkOworCXNpemVfdCBzcGMgPSAqbGVuOworCWludCBlcnIgPSAwOworCisJaWYgKCEqbGVuKQorCQlyZXR1cm4gRU5PU1BDOworCisJZm9yIChpID0gMTsgaSA8IDI1NTsgaSsrKSB7CisJCWlmIChvcHRbaV0ubGVuIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFdlIG5lZWQgdG8gaGFuZGxlIHRoZSAwIGNhc2UgYXMgd2VsbCBhcyA+IDI1NSAqLworCQlpZiAob3B0W2ldLmxlbiA8PSAyNTUpCisJCQl4bGVuID0gb3B0W2ldLmxlbiArIDI7CisJCWVsc2UKKwkJCXhsZW4gPSBvcHRbaV0ubGVuICsgMiooKG9wdFtpXS5sZW4rMjU0KS8yNTUpOworCisJCXAgPSBvcHRbaV0uZGF0YTsKKworCQlpZiAoeGxlbiA+PSBzcGMpIHsKKwkJCS8qIFRoaXMgb3B0aW9uIGRvZXNuJ3QgZml0Li4uICovCisJCQllcnIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJeGxlbiA9IG9wdFtpXS5sZW47CisJCWRvIHsKKwkJCSpxKysgPSBpOworCQkJKnErKyA9IHBsZW4gPSB4bGVuID4gMjU1ID8gMjU1IDogeGxlbjsKKwkJCWlmIChwbGVuKQorCQkJCW1lbWNweShxLCBwLCBwbGVuKTsKKwkJCXEgKz0gcGxlbjsKKwkJCXAgKz0gcGxlbjsKKwkJCXNwYyAtPSBwbGVuKzI7CisJCQl4bGVuIC09IHBsZW47CisJCX0gd2hpbGUgKHhsZW4pOworCisJCW9wdFtpXS5sZW4gPSAtMTsKKwl9CisKKwkqcSsrID0gMjU1OwkJLyogRW5kIG1hcmtlciAqLworCW1lbXNldChxLCAwLCBzcGMpOwkvKiBaZXJvLXBhZCB0aGUgcmVzdCBvZiB0aGUgZmllbGQgKi8KKwkKKwkqbGVuID0geGxlbiA9IHEgLSAodWludDhfdCAqKWZpZWxkOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBQYWNrIERIQ1Agb3B0aW9ucyBpbnRvIGFuIG9wdGlvbiBmaWVsZCwgd2l0aG91dCBvdmVybG9hZCBzdXBwb3J0LgorICogT24gcmV0dXJuLCBsZW4gY29udGFpbnMgdGhlIG51bWJlciBvZiBhY3RpdmUgYnl0ZXMsIGFuZCB0aGUgZnVsbAorICogZmllbGQgaXMgemVyby1wYWRkZWQuCisgKgorICogVXNlIHRoaXMgdG8gZW5jb2RlIGVuY2Fwc3VsYXRlZCBvcHRpb24gZmllbGRzLgorICovCitpbnQgZGhjcF9wYWNrX2ZpZWxkKHZvaWQgKmZpZWxkLCBzaXplX3QgKmxlbiwKKwkJICAgIHN0cnVjdCBkaGNwX29wdGlvbiBvcHRbMjU2XSkKK3sKKwlzdHJ1Y3QgZGhjcF9vcHRpb24gb3hbMjU2XTsKKwkKKwltZW1jcHkob3gsIG9wdCwgc2l6ZW9mIG94KTsKKwlyZXR1cm4gZGhjcF9wYWNrX2ZpZWxkX3plcm8oZmllbGQsIGxlbiwgb3gpOworfQorCisvKgorICogUGFjayBESENQIG9wdGlvbnMgaW50byBhIHBhY2tldC4KKyAqIEFwcGx5IG92ZXJsb2FkaW5nIGlmIChhbmQgb25seSBpZikgdGhlICJmaWxlIiBvciAic25hbWUiIG9wdGlvbgorICogZG9lc24ndCBmaXQgaW4gdGhlIHJlc3BlY3RpdmUgZGVkaWNhdGVkIGZpZWxkcy4KKyAqLworaW50IGRoY3BfcGFja19wYWNrZXQodm9pZCAqcGFja2V0LCBzaXplX3QgKmxlbiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgZGhjcF9vcHRpb24gb3B0WzI1Nl0pCit7CisJc3RydWN0IGRoY3BfcGFja2V0ICpwa3QgPSBwYWNrZXQ7CisJc2l6ZV90IHNwYyA9ICpsZW47CisJdWludDhfdCBvdmVybG9hZDsKKwlzdHJ1Y3QgZGhjcF9vcHRpb24gb3hbMjU2XTsKKwl1aW50OF90ICpxOworCWludCBlcnI7CisKKwlpZiAoc3BjIDwgc2l6ZW9mKHN0cnVjdCBkaGNwX3BhY2tldCkpCisJCXJldHVybiBFTk9TUEM7CS8qIEJ1ZmZlciBpbXBvc3NpYmx5IHNtYWxsICovCisJCisJcGt0LT5tYWdpYyA9IGh0b25sKERIQ1BfVkVORE9SX01BR0lDKTsKKworCW1lbWNweShveCwgb3B0LCBzaXplb2Ygb3gpOworCisJLyogRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgZG8gb3ZlcmxvYWRpbmcgb3Igbm90ICovCisJb3ZlcmxvYWQgPSAwOworCisJaWYgKG9wdFs2N10ubGVuID4gMTI4KQorCQlvdmVybG9hZCB8PSAxOworCWVsc2UKKwkJb3hbNjddLmxlbiA9IC0xOworCisJaWYgKG9wdFs2Nl0ubGVuID4gNjQpCisJCW92ZXJsb2FkIHw9IDI7CisJZWxzZQorCQlveFs2Nl0ubGVuID0gLTE7CisKKwkvKiBLaWxsIGFueSBwYXNzZWQtaW4gb3ZlcmxvYWQgb3B0aW9uICovCisJb3hbNTJdLmxlbiA9IC0xOworCisJcSA9IHBrdC0+b3B0aW9uczsKKwlzcGMgLT0gMjQwOworCisJLyogRm9yY2Ugb3B0aW9uIDUzIChESENQIHBhY2tldCB0eXBlKSBmaXJzdCAqLworCWlmIChveFs1M10ubGVuID09IDEpIHsKKwkJKnErKyA9IDUzOworCQkqcSsrID0gMTsKKwkJKnErKyA9ICoodWludDhfdCAqKW94WzUzXS5kYXRhOworCQlzcGMgLT0gMzsKKwkJb3hbNTNdLmxlbiA9IC0xOworCX0KKworCS8qIEZvbGxvdyB3aXRoIHRoZSBvdmVybG9hZCBvcHRpb24sIGlmIGFwcGxpY2FibGUgKi8KKwlpZiAob3ZlcmxvYWQpIHsKKwkJKnErKyA9IDUyOworCQkqcSsrID0gMTsKKwkJKnErKyA9IG92ZXJsb2FkOworCQlzcGMgLT0gMzsKKwl9CisKKwllcnIgPSBkaGNwX3BhY2tfZmllbGRfemVybyhxLCAmc3BjLCBveCk7CisJKmxlbiA9IHNwYyArIChxLSh1aW50OF90ICopcGFja2V0KTsKKworCWlmIChvdmVybG9hZCAmIDEpIHsKKwkJc3BjID0gMTI4OworCQllcnIgPSBkaGNwX3BhY2tfZmllbGRfemVybyhwa3QtPmZpbGUsICZzcGMsIG94KTsKKwl9IGVsc2UgeworCQltZW1zZXQocGt0LT5maWxlLCAwLCAxMjgpOworCQlpZiAob3B0WzY3XS5sZW4gPiAwKQorCQkJbWVtY3B5KHBrdC0+ZmlsZSwgb3B0WzY3XS5kYXRhLCBvcHRbNjddLmxlbik7CisJfQorCisJaWYgKG92ZXJsb2FkICYgMikgeworCQlzcGMgPSA2NDsKKwkJZXJyID0gZGhjcF9wYWNrX2ZpZWxkX3plcm8ocGt0LT5zbmFtZSwgJnNwYywgb3gpOworCX0gZWxzZSB7CisJCW1lbXNldChwa3QtPnNuYW1lLCAwLCA2NCk7CisJCWlmIChvcHRbNjZdLmxlbiA+IDApCisJCQltZW1jcHkocGt0LT5zbmFtZSwgb3B0WzY2XS5kYXRhLCBvcHRbNjZdLmxlbik7CisJfQorCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9kaGNwdW5wYWNrLmMgYi9jb20zMi9saWIvZGhjcHVucGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODE3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvZGhjcHVucGFjay5jCkBAIC0wLDAgKzEsMTE2IEBACisjZGVmaW5lIF9HTlVfU09VUkNFCQkvKiBGb3Igc3RybmxlbigpICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKy8vICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKy8vICNpbmNsdWRlICJkaGNwLmgiCisjaW5jbHVkZSA8ZGhjcC5oPgorCisvKgorICogVW5wYWNrIERIQ1Agb3B0aW9ucyBmcm9tIGEgZmllbGQuICBBc3N1bWVzIG9wdCBpcyBwcmUtaW5pdGFsaXplZAorICogKHRvIGFsbCB6ZXJvIGluIHRoZSBjb21tb24gY2FzZS4pCisgKi8KK2ludCBkaGNwX3VucGFja19maWVsZChjb25zdCB2b2lkICpmaWVsZCwgc2l6ZV90IGxlbiwKKwkJICAgICAgc3RydWN0IGRoY3Bfb3B0aW9uIG9wdFsyNTZdKQoreworCWNvbnN0IHVpbnQ4X3QgKnAgPSBmaWVsZDsKKwlpbnQgZXJyID0gMDsKKworCXdoaWxlIChsZW4gPiAxKSB7CisJCXVpbnQ4X3Qgb3A7CisJCXNpemVfdCB4bGVuOworCisJCW9wID0gKnArKzsgbGVuLS07CisJCWlmIChvcCA9PSAwKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKG9wID09IDI1NSkKKwkJCWJyZWFrOworCQkKKwkJeGxlbiA9ICpwKys7IGxlbi0tOworCQlpZiAoeGxlbiA+IGxlbikKKwkJCWJyZWFrOworCQlpZiAob3B0W29wXS5sZW4gPCAwKQorCQkJb3B0W29wXS5sZW4gPSAwOworCQlpZiAoeGxlbikgeworCQkJb3B0W29wXS5kYXRhID0gcmVhbGxvYyhvcHRbb3BdLmRhdGEsCisJCQkJCSAgICAgICBvcHRbb3BdLmxlbiArIHhsZW4gKyAxKTsKKwkJCWlmICghb3B0W29wXS5kYXRhKSB7CisJCQkJZXJyID0gRU5PTUVNOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbWVtY3B5KChjaGFyICopb3B0W29wXS5kYXRhICsgb3B0W29wXS5sZW4sIHAsIHhsZW4pOworCQkJb3B0W29wXS5sZW4gKz0geGxlbjsKKwkJCS8qIE51bGwtdGVybWluYXRlIGFzIGEgY291cnRlc3kgdG8gdXNlcnMgKi8KKwkJCSooKGNoYXIgKilvcHRbb3BdLmRhdGEgKyBvcHRbb3BdLmxlbikgPSAwOworCQkJcCArPSB4bGVuOworCQkJbGVuIC09IHhsZW47CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVW5wYWNrIGEgREhDUCBwYWNrZXQsIHdpdGggb3ZlcmxvYWQgc3VwcG9ydC4gIERvIG5vdCB1c2UgdGhpcworICogdG8gdW5wYWNrIGFuIGVuY2Fwc3VsYXRlZCBvcHRpb24gc2V0LgorICovCitpbnQgZGhjcF91bnBhY2tfcGFja2V0KGNvbnN0IHZvaWQgKnBhY2tldCwgc2l6ZV90IGxlbiwKKwkJICAgICAgIHN0cnVjdCBkaGNwX29wdGlvbiBvcHRbMjU2XSkKK3sKKwljb25zdCBzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBrdCA9IHBhY2tldDsKKwlpbnQgZXJyOworCXVpbnQ4X3Qgb3ZlcmxvYWQ7CisJaW50IGk7CisKKwlpZiAobGVuIDwgMjQwIHx8IHBrdC0+bWFnaWMgIT0gaHRvbmwoREhDUF9WRU5ET1JfTUFHSUMpKQorCQlyZXR1cm4gRUlOVkFMOwkvKiBCb2d1cyBwYWNrZXQgKi8KKwkKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJb3B0W2ldLmxlbiA9IC0xOyAvKiBPcHRpb24gbm90IHByZXNlbnQgKi8KKwkJb3B0W2ldLmRhdGEgPSBOVUxMOworCX0KKwkKKwllcnIgPSBkaGNwX3VucGFja19maWVsZChwa3QtPm9wdGlvbnMsIGxlbi0yNDAsIG9wdCk7CisKKwlvdmVybG9hZCA9IDA7CisJaWYgKG9wdFs1Ml0ubGVuID09IDEpIHsKKwkJb3ZlcmxvYWQgPSAqKHVpbnQ4X3QgKilvcHRbNTJdLmRhdGE7CisJCWZyZWUob3B0WzUyXS5kYXRhKTsKKwkJb3B0WzUyXS5sZW4gPSAtMTsKKwkJb3B0WzUyXS5kYXRhID0gTlVMTDsKKwl9CisKKwlpZiAob3ZlcmxvYWQgJiAxKSB7CisJCWVyciB8PSBkaGNwX3VucGFja19maWVsZChwa3QtPmZpbGUsIDEyOCwgb3B0KTsKKwl9IGVsc2UgeworCQlvcHRbNjddLmxlbiAgPSBzdHJubGVuKChjb25zdCBjaGFyICopcGt0LT5maWxlLCAxMjgpOworCQlpZiAob3B0WzY3XS5sZW4pIHsKKwkJCW9wdFs2N10uZGF0YSA9IG1hbGxvYyhvcHRbNjddLmxlbiArIDEpOworCQkJaWYgKG9wdFs2N10uZGF0YSkgeworCQkJCW1lbWNweShvcHRbNjddLmRhdGEsIHBrdC0+ZmlsZSwgb3B0WzY3XS5sZW4pOworCQkJCSooKGNoYXIgKilvcHRbNjddLmRhdGEgKyBvcHRbNjddLmxlbikgPSAwOworCQkJfSBlbHNlIHsKKwkJCQllcnIgfD0gRU5PTUVNOworCQkJfQorCQl9CisJfQorCisJaWYgKG92ZXJsb2FkICYgMikgeworCQllcnIgfD0gZGhjcF91bnBhY2tfZmllbGQocGt0LT5zbmFtZSwgNjQsIG9wdCk7CisJfSBlbHNlIHsKKwkJb3B0WzY2XS5sZW4gID0gc3RybmxlbigoY29uc3QgY2hhciAqKXBrdC0+c25hbWUsIDY0KTsKKwkJaWYgKG9wdFs2Nl0ubGVuKSB7CisJCQlvcHRbNjZdLmRhdGEgPSBtYWxsb2Mob3B0WzY2XS5sZW4gKyAxKTsKKwkJCWlmIChvcHRbNjZdLmRhdGEpIHsKKwkJCQltZW1jcHkob3B0WzY2XS5kYXRhLCBwa3QtPmZpbGUsIG9wdFs2Nl0ubGVuKTsKKwkJCQkqKChjaGFyICopb3B0WzY2XS5kYXRhICsgb3B0WzY2XS5sZW4pID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJZXJyIHw9IEVOT01FTTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvZHByaW50Zi5jIGIvY29tMzIvbGliL2RwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWE3N2IzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2RwcmludGYuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogZHByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBERUJVR19QT1JUCisKK3ZvaWQgdmRwcmludGYoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKwordm9pZCBkcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgICB2ZHByaW50Zihmb3JtYXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworfQorCisjZW5kaWYgLyogREVCVUdfUE9SVCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2V4aXQuYyBiL2NvbTMyL2xpYi9leGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlYzBhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9leGl0LmMKQEAgLTAsMCArMSw1OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGV4aXQuYworICoKKyAqIFRoZSByZWd1bGFyIGV4aXQKKyAqLworCisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImF0ZXhpdC5oIgorCitfX25vcmV0dXJuIGV4aXQoaW50IHJ2KQoreworCXN0cnVjdCBhdGV4aXQgKmFwOworCisgICAgZm9yIChhcCA9IF9fc3lzbGludXhfY3VycmVudC0+dS54LmF0ZXhpdF9saXN0OyBhcDsgYXAgPSBhcC0+bmV4dCkgeworCWFwLT5mY3RuKHJ2LCBhcC0+YXJnKTsJLyogVGhpcyBhc3N1bWVzIGV4dHJhIGFyZ3MgYXJlIGhhcm1sZXNzICovCisgICAgfQorCisgICAgX2V4aXQocnYpOworfSAgICAKKworX19ub3JldHVybiBfRXhpdChpbnQgcnYpCit7CisgICAgX2V4aXQocnYpOworfQorCitfX25vcmV0dXJuIF9leGl0KGludCBydikKK3sKKyAgICBsb25nam1wKF9fc3lzbGludXhfY3VycmVudC0+dS54LnByb2Nlc3NfZXhpdCwgKHVpbnQ4X3QpcnYrMSk7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9mY2xvc2UuYyBiL2NvbTMyL2xpYi9mY2xvc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTlmY2MwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2ZjbG9zZS5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBmY2xvc2UuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgZmNsb3NlKEZJTEUgKiBfX2YpCit7CisgICAgcmV0dXJuIGNsb3NlKGZpbGVubyhfX2YpKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9mZG9wZW5kaXIuYyBiL2NvbTMyL2xpYi9mZG9wZW5kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmMzMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2Zkb3BlbmRpci5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBmZG9wZW5kaXIuYworICovCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK0RJUiAqZmRvcGVuZGlyKGludCBfX2ZkKQoreworICAgICh2b2lkKV9fZmQ7CisKKyAgICBlcnJubyA9IEVOT1NZUzsKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9mZ2V0Yy5jIGIvY29tMzIvbGliL2ZnZXRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4ZTE0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9mZ2V0Yy5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBmZ2V0Yy5jCisgKgorICogRXh0cmVtZWx5IHNsb3cgZmdldGMgaW1wbGVtZW50YXRpb24sIHVzaW5nIF9mcmVhZCgpLiAgSWYgcGVvcGxlCisgKiBhY3R1YWxseSBuZWVkIGNoYXJhY3Rlci1vcmllbnRlZCBpbnB1dCB0byBiZSBmYXN0LCB3ZSBtYXkgYWN0dWFsbHkKKyAqIGhhdmUgdG8gaW1wbGVtZW50IGJ1ZmZlcmluZy4gIFNpZ2guCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworaW50IGZnZXRjKEZJTEUgKiBmKQoreworICAgIHVuc2lnbmVkIGNoYXIgY2g7CisKKyAgICByZXR1cm4gKF9mcmVhZCgmY2gsIDEsIGYpID09IDEpID8gKGludCljaCA6IEVPRjsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9mZ2V0cy5jIGIvY29tMzIvbGliL2ZnZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjMTUxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9mZ2V0cy5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBmZ2V0cy5jCisgKgorICogVGhpcyB3aWxsIGJlIHZlcnkgc2xvdyBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIGdldGMoKSwKKyAqIGJ1dCB3ZSBjYW4ndCBhZmZvcmQgdG8gZHJhaW4gY2hhcmFjdGVycyB3ZSBkb24ndCBuZWVkIGZyb20KKyAqIHRoZSBpbnB1dC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworY2hhciAqZmdldHMoY2hhciAqcywgaW50IG4sIEZJTEUgKiBmKQoreworICAgIGludCBjaDsKKyAgICBjaGFyICpwID0gczsKKworICAgIHdoaWxlIChuID4gMSkgeworCWNoID0gZ2V0YyhmKTsKKwlpZiAoY2ggPT0gRU9GKSB7CisJICAgICpwID0gJ1wwJzsKKwkgICAgcmV0dXJuIChwID09IHMpID8gTlVMTCA6IHM7CisJfQorCSpwKysgPSBjaDsKKwlpZiAoY2ggPT0gJ1xuJykKKwkgICAgYnJlYWs7CisJbi0tOworICAgIH0KKyAgICBpZiAobikKKwkqcCA9ICdcMCc7CisKKyAgICByZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9mb3Blbi5jIGIvY29tMzIvbGliL2ZvcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjMTIyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9mb3Blbi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBmb3Blbi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworRklMRSAqZm9wZW4oY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbW9kZSkKK3sKKyAgICBpbnQgZmxhZ3MgPSBPX1JET05MWTsKKyAgICBpbnQgcGx1cyA9IDA7CisgICAgaW50IGZkOworCisgICAgd2hpbGUgKCptb2RlKSB7CisJc3dpdGNoICgqbW9kZSkgeworCWNhc2UgJ3InOgorCSAgICBmbGFncyA9IE9fUkRPTkxZOworCSAgICBicmVhazsKKwljYXNlICd3JzoKKwkgICAgZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DOworCSAgICBicmVhazsKKwljYXNlICdhJzoKKwkgICAgZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0FQUEVORDsKKwkgICAgYnJlYWs7CisJY2FzZSAnKyc6CisJICAgIHBsdXMgPSAxOworCSAgICBicmVhazsKKwl9CisJbW9kZSsrOworICAgIH0KKworICAgIGlmIChwbHVzKSB7CisJZmxhZ3MgPSAoZmxhZ3MgJiB+KE9fUkRPTkxZIHwgT19XUk9OTFkpKSB8IE9fUkRXUjsKKyAgICB9CisKKyAgICBmZCA9IG9wZW4oZmlsZSwgZmxhZ3MsIDA2NjYpOworCisgICAgaWYgKGZkIDwgMCkKKwlyZXR1cm4gTlVMTDsKKyAgICBlbHNlCisJcmV0dXJuIGZkb3BlbihmZCwgbW9kZSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvZm9wZW5kZXYuYyBiL2NvbTMyL2xpYi9mb3BlbmRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMmYwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvZm9wZW5kZXYuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogZm9wZW5kZXYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK0ZJTEUgKmZvcGVuZGV2KGNvbnN0IHN0cnVjdCBkZXZfaW5mbyAqIGRldiwgY29uc3QgY2hhciAqbW9kZSkKK3sKKyAgICBpbnQgZmxhZ3MgPSBPX1JET05MWTsKKyAgICBpbnQgcGx1cyA9IDA7CisgICAgaW50IGZkOworCisgICAgd2hpbGUgKCptb2RlKSB7CisJc3dpdGNoICgqbW9kZSkgeworCWNhc2UgJ3InOgorCSAgICBmbGFncyA9IE9fUkRPTkxZOworCSAgICBicmVhazsKKwljYXNlICd3JzoKKwkgICAgZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DOworCSAgICBicmVhazsKKwljYXNlICdhJzoKKwkgICAgZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0FQUEVORDsKKwkgICAgYnJlYWs7CisJY2FzZSAnKyc6CisJICAgIHBsdXMgPSAxOworCSAgICBicmVhazsKKwl9CisJbW9kZSsrOworICAgIH0KKworICAgIGlmIChwbHVzKSB7CisJZmxhZ3MgPSAoZmxhZ3MgJiB+KE9fUkRPTkxZIHwgT19XUk9OTFkpKSB8IE9fUkRXUjsKKyAgICB9CisKKyAgICBmZCA9IG9wZW5kZXYoZmlsZSwgZmxhZ3MpOworCisgICAgaWYgKGZkIDwgMCkKKwlyZXR1cm4gTlVMTDsKKyAgICBlbHNlCisJcmV0dXJuIGZkb3BlbihmZCwgbW9kZSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvZnByaW50Zi5jIGIvY29tMzIvbGliL2ZwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI4ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2ZwcmludGYuYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogZnByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBmcHJpbnRmKEZJTEUgKiBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIGludCBydjsKKworICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICAgIHJ2ID0gdmZwcmludGYoZmlsZSwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvZnB1dGMuYyBiL2NvbTMyL2xpYi9mcHV0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWJmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvZnB1dGMuYwpAQCAtMCwwICsxLDE0IEBACisvKgorICogZnB1dGMuYworICoKKyAqIGdjYyAicHJpbnRmIGRlY29tcGlsYXRpb24iIGV4cGVjdHMgdGhpcyB0byBleGlzdC4uLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgZnB1dGMoaW50IGMsIEZJTEUgKiBmKQoreworICAgIHVuc2lnbmVkIGNoYXIgY2ggPSBjOworCisgICAgcmV0dXJuIF9md3JpdGUoJmNoLCAxLCBmKSA9PSAxID8gY2ggOiBFT0Y7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvZnB1dHMuYyBiL2NvbTMyL2xpYi9mcHV0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjBjODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvZnB1dHMuYwpAQCAtMCwwICsxLDE1IEBACisvKgorICogZnB1dHMuYworICoKKyAqIFRoaXMgaXNuJ3QgcXVpdGUgZnB1dHMoKSBpbiB0aGUgc3RkaW8gc2Vuc2UsIHNpbmNlIHdlIGRvbid0CisgKiBoYXZlIHN0ZGlvLCBidXQgaXQgdGFrZXMgYSBmaWxlIGRlc2NyaXB0b3IgYXJndW1lbnQgaW5zdGVhZAorICogb2YgdGhlIEZJTEUgKi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IGZwdXRzKGNvbnN0IGNoYXIgKnMsIEZJTEUgKiBmaWxlKQoreworICAgIHJldHVybiBfZndyaXRlKHMsIHN0cmxlbihzKSwgZmlsZSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvZnJlYWQuYyBiL2NvbTMyL2xpYi9mcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTljZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvZnJlYWQuYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogZnJlYWQuYworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3NpemVfdCBfZnJlYWQodm9pZCAqYnVmLCBzaXplX3QgY291bnQsIEZJTEUgKiBmKQoreworICAgIHNpemVfdCBieXRlcyA9IDA7CisgICAgc3NpemVfdCBydjsKKyAgICBjaGFyICpwID0gYnVmOworCisgICAgd2hpbGUgKGNvdW50KSB7CisJcnYgPSByZWFkKGZpbGVubyhmKSwgcCwgY291bnQpOworCWlmIChydiA9PSAtMSkgeworCSAgICBpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKQorCQljb250aW51ZTsKKwkgICAgZWxzZQorCQlicmVhazsKKwl9IGVsc2UgaWYgKHJ2ID09IDApIHsKKwkgICAgYnJlYWs7CisJfQorCisJcCArPSBydjsKKwlieXRlcyArPSBydjsKKwljb3VudCAtPSBydjsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXM7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvZnJlYWQyLmMgYi9jb20zMi9saWIvZnJlYWQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2MjA0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9mcmVhZDIuYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogZnJlYWQyLmMKKyAqCisgKiBUaGUgYWN0dWFsIGZyZWFkKCkgZnVuY3Rpb24gYXMgYSBub24taW5saW5lCisgKi8KKworI2RlZmluZSBfX05PX0ZSRUFEX0ZXUklURV9JTkxJTkVTCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc2l6ZV90IGZyZWFkKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBubWVtYiwgRklMRSAqIGYpCit7CisgICAgcmV0dXJuIF9mcmVhZChwdHIsIHNpemUgKiBubWVtYiwgZikgLyBzaXplOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2Z3cml0ZS5jIGIvY29tMzIvbGliL2Z3cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzFkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvZndyaXRlLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGZ3cml0ZS5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc2l6ZV90IF9md3JpdGUoY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIEZJTEUgKiBmKQoreworICAgIHNpemVfdCBieXRlcyA9IDA7CisgICAgc3NpemVfdCBydjsKKyAgICBjb25zdCBjaGFyICpwID0gYnVmOworCisgICAgd2hpbGUgKGNvdW50KSB7CisJcnYgPSB3cml0ZShmaWxlbm8oZiksIHAsIGNvdW50KTsKKwlpZiAocnYgPT0gLTEpIHsKKwkgICAgaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikKKwkJY29udGludWU7CisJICAgIGVsc2UKKwkJYnJlYWs7CisJfSBlbHNlIGlmIChydiA9PSAwKSB7CisJICAgIGJyZWFrOworCX0KKworCXAgKz0gcnY7CisJYnl0ZXMgKz0gcnY7CisJY291bnQgLT0gcnY7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2Z3cml0ZTIuYyBiL2NvbTMyL2xpYi9md3JpdGUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3MDZlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9md3JpdGUyLmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGZ3cml0ZTIuYworICoKKyAqIFRoZSBhY3R1YWwgZndyaXRlKCkgZnVuY3Rpb24gYXMgYSBub24taW5saW5lCisgKi8KKworI2RlZmluZSBfX05PX0ZSRUFEX0ZXUklURV9JTkxJTkVTCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc2l6ZV90IGZ3cml0ZShjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsIEZJTEUgKiBmKQoreworICAgIHJldHVybiBfZndyaXRlKHB0ciwgc2l6ZSAqIG5tZW1iLCBmKSAvIHNpemU7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvZ2V0Y3dkLmMgYi9jb20zMi9saWIvZ2V0Y3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmYTlkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9nZXRjd2QuYwpAQCAtMCwwICsxLDEyIEBACisvKgorICogZ2V0Y3dkLmMKKyAqLworCisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9wbWFwaS5oPgorI2luY2x1ZGUgPGZzLmg+CisKK2NoYXIgKmdldGN3ZChjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworICAgIHJldHVybiBjb3JlX2dldGN3ZChidWYsIHNpemUpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2dldG9wdC5jIGIvY29tMzIvbGliL2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjczNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvZ2V0b3B0LmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIGdldG9wdC5jCisgKgorICogU2ltcGxlIFBPU0lYIGdldG9wdCgpLCBubyBHTlUgZXh0ZW5zaW9ucy4uLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqb3B0YXJnOworaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CitzdGF0aWMgc3RydWN0IGdldG9wdF9wcml2YXRlX3N0YXRlIHsKKwljb25zdCBjaGFyICpvcHRwdHI7CisJY29uc3QgY2hhciAqbGFzdF9vcHRzdHJpbmc7CisJY2hhciAqY29uc3QgKmxhc3RfYXJndjsKK30gcHZ0OworCitpbnQgZ2V0b3B0KGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndiwgY29uc3QgY2hhciAqb3B0c3RyaW5nKQoreworCWNvbnN0IGNoYXIgKmNhcmc7CisJY29uc3QgY2hhciAqb3NwdHI7CisJaW50IG9wdDsKKworCS8qIGdldG9wdCgpIHJlbGllcyBvbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgZ2xvYmFsIHN0YXRlCisJICAgdmFyaWFibGVzLCB3aGljaCBjYW4gbWFrZSB0aGlzIHJlYWxseSBjb25mdXNpbmcgaWYgdGhlcmUgaXMKKwkgICBtb3JlIHRoYW4gb25lIHVzZSBvZiBnZXRvcHQoKSBpbiB0aGUgc2FtZSBwcm9ncmFtLiAgVGhpcworCSAgIGF0dGVtcHRzIHRvIGRldGVjdCB0aGF0IHNpdHVhdGlvbiBieSBkZXRlY3RpbmcgaWYgdGhlCisJICAgIm9wdHN0cmluZyIgb3IgImFyZ3YiIGFyZ3VtZW50IGhhdmUgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUKKwkgICB3ZSB3ZXJlIGNhbGxlZDsgaWYgc28sIHJlaW5pdGlhbGl6ZSB0aGUgcXVlcnkgc3RhdGUuICovCisKKwlpZiAob3B0c3RyaW5nICE9IHB2dC5sYXN0X29wdHN0cmluZyB8fCBhcmd2ICE9IHB2dC5sYXN0X2FyZ3YgfHwKKwkgICAgb3B0aW5kIDwgMSB8fCBvcHRpbmQgPiBhcmdjKSB7CisJCS8qIG9wdGluZCBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IHF1ZXJ5ICovCisJCXB2dC5sYXN0X29wdHN0cmluZyA9IG9wdHN0cmluZzsKKwkJcHZ0Lmxhc3RfYXJndiA9IGFyZ3Y7CisJCW9wdGluZCA9IDE7CisJCXB2dC5vcHRwdHIgPSBOVUxMOworCX0KKworCWNhcmcgPSBhcmd2W29wdGluZF07CisKKwkvKiBGaXJzdCwgZWxpbWluYXRlIGFsbCBub24tb3B0aW9uIGNhc2VzICovCisKKwlpZiAoIWNhcmcgfHwgY2FyZ1swXSAhPSAnLScgfHwgIWNhcmdbMV0pIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjYXJnWzFdID09ICctJyAmJiAhY2FyZ1syXSkgeworCQlvcHRpbmQrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICgodWludHB0cl90KSAocHZ0Lm9wdHB0ciAtIGNhcmcpID4gKHVpbnRwdHJfdCkgc3RybGVuKGNhcmcpKSB7CisJCS8qIFNvbWVvbmUgZnJvYmJlZCBvcHRpbmQsIGNoYW5nZSB0byBuZXcgb3B0LiAqLworCQlwdnQub3B0cHRyID0gY2FyZyArIDE7CisJfQorCisJb3B0ID0gKnB2dC5vcHRwdHIrKzsKKworCWlmIChvcHQgIT0gJzonICYmIChvc3B0ciA9IHN0cmNocihvcHRzdHJpbmcsIG9wdCkpKSB7CisJCWlmIChvc3B0clsxXSA9PSAnOicpIHsKKwkJCWlmICgqcHZ0Lm9wdHB0cikgeworCQkJCS8qIEFyZ3VtZW50LXRha2luZyBvcHRpb24gd2l0aCBhdHRhY2hlZAorCQkJCSAgIGFyZ3VtZW50ICovCisJCQkJb3B0YXJnID0gKGNoYXIgKilwdnQub3B0cHRyOworCQkJCW9wdGluZCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBcmd1bWVudC10YWtpbmcgb3B0aW9uIHdpdGggbm9uLWF0dGFjaGVkCisJCQkJICAgYXJndW1lbnQgKi8KKwkJCQlpZiAoYXJndltvcHRpbmQgKyAxXSkgeworCQkJCQlvcHRhcmcgPSAoY2hhciAqKWFyZ3Zbb3B0aW5kKzFdOworCQkJCQlvcHRpbmQgKz0gMjsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBNaXNzaW5nIGFyZ3VtZW50ICovCisJCQkJCW9wdGluZCsrOworCQkJCQlyZXR1cm4gKG9wdHN0cmluZ1swXSA9PSAnOicpCisJCQkJCQk/ICc6JyA6ICc/JzsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gb3B0OworCQl9IGVsc2UgeworCQkJLyogTm9uLWFyZ3VtZW50LXRha2luZyBvcHRpb24gKi8KKwkJCS8qIHB2dC5vcHRwdHIgd2lsbCByZW1lbWJlciB0aGUgZXhhY3QgcG9zaXRpb24gdG8KKwkJCSAgIHJlc3VtZSBhdCAqLworCQkJaWYgKCEqcHZ0Lm9wdHB0cikKKwkJCQlvcHRpbmQrKzsKKwkJCXJldHVybiBvcHQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBVbmtub3duIG9wdGlvbiAqLworCQlvcHRvcHQgPSBvcHQ7CisJCWlmICghKnB2dC5vcHRwdHIpCisJCQlvcHRpbmQrKzsKKwkJcmV0dXJuICc/JzsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvZ2V0b3B0X2xvbmcuYyBiL2NvbTMyL2xpYi9nZXRvcHRfbG9uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZDA2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvZ2V0b3B0X2xvbmcuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIGdldG9wdC5jCisgKgorICogZ2V0b3B0X2xvbmcoKSwgb3IgYXQgbGVhc3QgYSBjb21tb24gc3Vic2V0IHRoZXJlb2Y6CisgKgorICogLSBPcHRpb24gcmVvcmRlcmluZyBpcyBub3Qgc3VwcG9ydGVkCisgKiAtIC1XIGZvbyBpcyBub3Qgc3VwcG9ydGVkCisgKiAtIEZpcnN0IG9wdHN0cmluZyBjaGFyYWN0ZXIgIi0iIG5vdCBzdXBwb3J0ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCitjaGFyICpvcHRhcmc7CitpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKK3N0YXRpYyBzdHJ1Y3QgZ2V0b3B0X3ByaXZhdGVfc3RhdGUgeworCWNvbnN0IGNoYXIgKm9wdHB0cjsKKwljb25zdCBjaGFyICpsYXN0X29wdHN0cmluZzsKKwljaGFyICpjb25zdCAqbGFzdF9hcmd2OworfSBwdnQ7CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqb3B0aW9uX21hdGNoZXMoY29uc3QgY2hhciAqYXJnX3N0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKm9wdF9uYW1lKQoreworCXdoaWxlICgqYXJnX3N0ciAhPSAnXDAnICYmICphcmdfc3RyICE9ICc9JykgeworCQlpZiAoKmFyZ19zdHIrKyAhPSAqb3B0X25hbWUrKykKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmICgqb3B0X25hbWUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGFyZ19zdHI7Cit9CisKK2ludCBnZXRvcHRfbG9uZyhpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKm9wdHN0cmluZywKKwkJY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZGV4KQoreworCWNvbnN0IGNoYXIgKmNhcmc7CisJY29uc3QgY2hhciAqb3NwdHI7CisJaW50IG9wdDsKKworCS8qIGdldG9wdCgpIHJlbGllcyBvbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgZ2xvYmFsIHN0YXRlCisJICAgdmFyaWFibGVzLCB3aGljaCBjYW4gbWFrZSB0aGlzIHJlYWxseSBjb25mdXNpbmcgaWYgdGhlcmUgaXMKKwkgICBtb3JlIHRoYW4gb25lIHVzZSBvZiBnZXRvcHQoKSBpbiB0aGUgc2FtZSBwcm9ncmFtLiAgVGhpcworCSAgIGF0dGVtcHRzIHRvIGRldGVjdCB0aGF0IHNpdHVhdGlvbiBieSBkZXRlY3RpbmcgaWYgdGhlCisJICAgIm9wdHN0cmluZyIgb3IgImFyZ3YiIGFyZ3VtZW50IGhhdmUgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUKKwkgICB3ZSB3ZXJlIGNhbGxlZDsgaWYgc28sIHJlaW5pdGlhbGl6ZSB0aGUgcXVlcnkgc3RhdGUuICovCisKKwlpZiAob3B0c3RyaW5nICE9IHB2dC5sYXN0X29wdHN0cmluZyB8fCBhcmd2ICE9IHB2dC5sYXN0X2FyZ3YgfHwKKwkgICAgb3B0aW5kIDwgMSB8fCBvcHRpbmQgPiBhcmdjKSB7CisJCS8qIG9wdGluZCBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IHF1ZXJ5ICovCisJCXB2dC5sYXN0X29wdHN0cmluZyA9IG9wdHN0cmluZzsKKwkJcHZ0Lmxhc3RfYXJndiA9IGFyZ3Y7CisJCW9wdGluZCA9IDE7CisJCXB2dC5vcHRwdHIgPSBOVUxMOworCX0KKworCWNhcmcgPSBhcmd2W29wdGluZF07CisKKwkvKiBGaXJzdCwgZWxpbWluYXRlIGFsbCBub24tb3B0aW9uIGNhc2VzICovCisKKwlpZiAoIWNhcmcgfHwgY2FyZ1swXSAhPSAnLScgfHwgIWNhcmdbMV0pCisJCXJldHVybiAtMTsKKworCWlmIChjYXJnWzFdID09ICctJykgeworCQljb25zdCBzdHJ1Y3Qgb3B0aW9uICpsbzsKKwkJY29uc3QgY2hhciAqb3B0X2VuZCA9IE5VTEw7CisKKwkJb3B0aW5kKys7CisKKwkJLyogRWl0aGVyIGl0J3MgYSBsb25nIG9wdGlvbiwgb3IgaXQncyAtLSAqLworCQlpZiAoIWNhcmdbMl0pIHsKKwkJCS8qIEl0J3MgLS0gKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWZvciAobG8gPSBsb25nb3B0czsgbG8tPm5hbWU7IGxvKyspIHsKKwkJCWlmICgob3B0X2VuZCA9IG9wdGlvbl9tYXRjaGVzKGNhcmcrMiwgbG8tPm5hbWUpKSkKKwkJCSAgICBicmVhazsKKwkJfQorCQlpZiAoIW9wdF9lbmQpCisJCQlyZXR1cm4gJz8nOworCisJCWlmIChsb25naW5kZXgpCisJCQkqbG9uZ2luZGV4ID0gbG8tbG9uZ29wdHM7CisKKwkJaWYgKCpvcHRfZW5kID09ICc9JykgeworCQkJaWYgKGxvLT5oYXNfYXJnKQorCQkJCW9wdGFyZyA9IChjaGFyICopb3B0X2VuZCsxOworCQkJZWxzZQorCQkJCXJldHVybiAnPyc7CisJCX0gZWxzZSBpZiAobG8tPmhhc19hcmcgPT0gMSkgeworCQkJaWYgKCEob3B0YXJnID0gYXJndltvcHRpbmRdKSkKKwkJCQlyZXR1cm4gJz8nOworCQkJb3B0aW5kKys7CisJCX0KKworCQlpZiAobG8tPmZsYWcpIHsKKwkJCSpsby0+ZmxhZyA9IGxvLT52YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBsby0+dmFsOworCQl9CisJfQorCisJaWYgKCh1aW50cHRyX3QpIChwdnQub3B0cHRyIC0gY2FyZykgPiAodWludHB0cl90KSBzdHJsZW4oY2FyZykpIHsKKwkJLyogU29tZW9uZSBmcm9iYmVkIG9wdGluZCwgY2hhbmdlIHRvIG5ldyBvcHQuICovCisJCXB2dC5vcHRwdHIgPSBjYXJnICsgMTsKKwl9CisKKwlvcHQgPSAqcHZ0Lm9wdHB0cisrOworCisJaWYgKG9wdCAhPSAnOicgJiYgKG9zcHRyID0gc3RyY2hyKG9wdHN0cmluZywgb3B0KSkpIHsKKwkJaWYgKG9zcHRyWzFdID09ICc6JykgeworCQkJaWYgKCpwdnQub3B0cHRyKSB7CisJCQkJLyogQXJndW1lbnQtdGFraW5nIG9wdGlvbiB3aXRoIGF0dGFjaGVkCisJCQkJICAgYXJndW1lbnQgKi8KKwkJCQlvcHRhcmcgPSAoY2hhciAqKXB2dC5vcHRwdHI7CisJCQkJb3B0aW5kKys7CisJCQl9IGVsc2UgeworCQkJCS8qIEFyZ3VtZW50LXRha2luZyBvcHRpb24gd2l0aCBub24tYXR0YWNoZWQKKwkJCQkgICBhcmd1bWVudCAqLworCQkJCWlmIChhcmd2W29wdGluZCArIDFdKSB7CisJCQkJCW9wdGFyZyA9IChjaGFyICopYXJndltvcHRpbmQrMV07CisJCQkJCW9wdGluZCArPSAyOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE1pc3NpbmcgYXJndW1lbnQgKi8KKwkJCQkJb3B0aW5kKys7CisJCQkJCXJldHVybiAob3B0c3RyaW5nWzBdID09ICc6JykKKwkJCQkJCT8gJzonIDogJz8nOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBvcHQ7CisJCX0gZWxzZSB7CisJCQkvKiBOb24tYXJndW1lbnQtdGFraW5nIG9wdGlvbiAqLworCQkJLyogcHZ0Lm9wdHB0ciB3aWxsIHJlbWVtYmVyIHRoZSBleGFjdCBwb3NpdGlvbiB0bworCQkJICAgcmVzdW1lIGF0ICovCisJCQlpZiAoISpwdnQub3B0cHRyKQorCQkJCW9wdGluZCsrOworCQkJcmV0dXJuIG9wdDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFVua25vd24gb3B0aW9uICovCisJCW9wdG9wdCA9IG9wdDsKKwkJaWYgKCEqcHZ0Lm9wdHB0cikKKwkJCW9wdGluZCsrOworCQlyZXR1cm4gJz8nOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9pMzg2L2VsZi5sZCBiL2NvbTMyL2xpYi9pMzg2L2VsZi5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDcwNWNmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2kzODYvZWxmLmxkCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgRUxGIGR5bmFtaWMgbG9hZGVkIG1vZHVsZXMuCisgKi8KKworLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2M6IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDogeyAqKC5yZWwucGx0KSB9CisgIC5yZWxhLnBsdCAgICAgICA6IHsgKigucmVsYS5wbHQpIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgS0VFUCAoKigudGV4dC4qcGVyc29uYWxpdHkqKSkKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuID0gQUxJR04oNCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgIAlfX2N0b3JzX3N0YXJ0ID0gLjsKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgICAgS0VFUCAoKiguY3RvcnNfbW9kaW5pdCkpCisgICAgS0VFUCAoKiguY3RvcnNfbW9kbWFpbikpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKwlfX2N0b3JzX2VuZCA9IC47CisgIH0KKyAgCisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgCV9fZHRvcnNfc3RhcnQgPSAuOworICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgICBLRUVQICgqKC5kdG9yc19tb2RleGl0KSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorCV9fZHRvcnNfZW5kID0gLjsKKyAgfQorICAKKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpIH0KKyAgLyouID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMTIsIC4pOyAtPiBUaGlzIGdpdmVzIGEgImludmFsaWQgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyIiBlcnJvciAqLworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBLRUVQICgqKC5nbnUubGlua29uY2UuZC4qcGVyc29uYWxpdHkqKSkKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisgIFBST1ZJREUgKF9lZGF0YSA9IC4pOyAKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gMzIgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFIChfZW5kID0gLik7IAorICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLyouID0gREFUQV9TRUdNRU5UX0VORCAoLik7IC0+IFRoaXMgZ2l2ZXMgYSAiaW52YWxpZCBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXIiIGVycm9yICovCisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5laF9mcmFtZSkgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2kzODYvc2V0am1wLlMgYi9jb20zMi9saWIvaTM4Ni9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThkZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2kzODYvc2V0am1wLlMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIGFyY2gvaTM4Ni9zZXRqbXAuUworICoKKyAqIHNldGptcC9sb25nam1wIGZvciB0aGUgaTM4NiBhcmNoaXRlY3R1cmUKKyAqCisgKgorICoKKyAqIFRoZSBqbXBfYnVmIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nLCBpbiBvcmRlcjoKKyAqCSVlYngKKyAqCSVlc3AKKyAqCSVlYnAKKyAqCSVlc2kKKyAqCSVlZGkKKyAqCTxyZXR1cm4gYWRkcmVzcz4KKyAqLworCisJLnRleHQKKwkuYWxpZ24gNAorCisJLmdsb2JsIF9zZXRqbXAKKwkudHlwZSBfc2V0am1wLCBAZnVuY3Rpb24KK19zZXRqbXA6CQkJCSMgZ2NjIDQuMC4xIHdhbnRzIHRoaXMgYXMgYW4gYWxpYXM/CisKKwkuZ2xvYmwgc2V0am1wCisJLnR5cGUgc2V0am1wLCBAZnVuY3Rpb24KK3NldGptcDoKKyNpZmRlZiBSRUdQQVJNCisJbW92bCAlZWF4LCVlZHgKKyNlbHNlCisJbW92bCA0KCVlc3ApLCVlZHgKKyNlbmRpZgorCXBvcGwgJWVjeAkJCSMgUmV0dXJuIGFkZHJlc3MsIGFuZCBhZGp1c3QgdGhlIHN0YWNrCisJeG9ybCAlZWF4LCVlYXgJCQkjIFJldHVybiB2YWx1ZQorCW1vdmwgJWVieCwoJWVkeCkKKwltb3ZsICVlc3AsNCglZWR4KQkJIyBQb3N0LXJldHVybiAlZXNwIQorCXB1c2hsICVlY3gJCQkjIE1ha2UgdGhlIGNhbGwvcmV0dXJuIHN0YWNrIGhhcHB5CisJbW92bCAlZWJwLDgoJWVkeCkKKwltb3ZsICVlc2ksMTIoJWVkeCkKKwltb3ZsICVlZGksMTYoJWVkeCkKKwltb3ZsICVlY3gsMjAoJWVkeCkJCSMgUmV0dXJuIGFkZHJlc3MKKwlyZXQKKworCS5zaXplIHNldGptcCwuLXNldGptcAorCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBsb25nam1wCisJLnR5cGUgbG9uZ2ptcCwgQGZ1bmN0aW9uCitsb25nam1wOgorI2lmZGVmIFJFR1BBUk0KKwl4Y2hnbCAlZWF4LCVlZHgKKyNlbHNlCisJbW92bCA0KCVlc3ApLCVlZHgJCSMgam1wX3B0ciBhZGRyZXNzCisJbW92bCA4KCVlc3ApLCVlYXgJCSMgUmV0dXJuIHZhbHVlCisjZW5kaWYKKwltb3ZsICglZWR4KSwlZWJ4CisJbW92bCA0KCVlZHgpLCVlc3AKKwltb3ZsIDgoJWVkeCksJWVicAorCW1vdmwgMTIoJWVkeCksJWVzaQorCW1vdmwgMTYoJWVkeCksJWVkaQorCWptcCAqMjAoJWVkeCkKKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS9jb20zMi9saWIvaW5ldC5jIGIvY29tMzIvbGliL2luZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzM2NDVlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2luZXQuYwpAQCAtMCwwICsxLDM5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworY2hhciAqaW5ldF9udG9hKHN0cnVjdCBpbl9hZGRyIGFkZHIpCit7CisgICAgc3RhdGljIGNoYXIgYnVmWzE2XTsKKyAgICBjb25zdCB1aW50OF90ICpieXRlcyA9IChjb25zdCB1aW50OF90ICopJmFkZHIuc19hZGRyOworCisgICAgc3ByaW50ZihidWYsICIldS4ldS4ldS4ldSIsIGJ5dGVzWzBdLCBieXRlc1sxXSwgYnl0ZXNbMl0sIGJ5dGVzWzNdKTsKKyAgICByZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2pwZWcvUkVBRE1FIGIvY29tMzIvbGliL2pwZWcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGVlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvanBlZy9SRUFETUUKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIFNtYWxsIGpwZWcgZGVjb2RlciBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBMdWMgU2FpbGxhcmQgPGx1Y0BzYWlsbGFyZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisgKiAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2pwZWcvYmdyMjQuYyBiL2NvbTMyL2xpYi9qcGVnL2JncjI0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1Yjg1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9qcGVnL2JncjI0LmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisgKiBTbWFsbCBqcGVnIGRlY29kZXIgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgTHVjIFNhaWxsYXJkIDxsdWNAc2FpbGxhcmQub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQorICogIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ0aW55anBlZy5oIgorI2luY2x1ZGUgInRpbnlqcGVnLWludGVybmFsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmUKKyAqCisgKgorICogTm90ZToKKyAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKKyAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCisgKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQorICogICAgICBSID0gWSAgICAgICAgICAgICAgICArIDEuNDAyMDAgKiBDcgorICogICAgICBHID0gWSAtIDAuMzQ0MTQgKiBDYiAtIDAuNzE0MTQgKiBDcgorICogICAgICBCID0gWSArIDEuNzcyMDAgKiBDYgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgY2hhciBjbGFtcChpbnQgaSkKK3sKKyAgaWYgKGk8MCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZSBpZiAoaT4yNTUpCisgICAgcmV0dXJuIDI1NTsKKyAgZWxzZQorICAgIHJldHVybiBpOworfQorCisvKioKKyAqICBZQ3JDYiAtPiBCR1IyNCAoMXgxKQorICogIC4tLS0uCisgKiAgfCAxIHwKKyAqICBgLS0tJworICovCitzdGF0aWMgdm9pZCBZQ3JDQl90b19CR1IyNF8xeDEoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgaW50IHN4LCBpbnQgc3kpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlksICpDYiwgKkNyOworICB1bnNpZ25lZCBjaGFyICpwOworICBpbnQgaSxqOworICBpbnQgb2Zmc2V0X3RvX25leHRfcm93OworCisjZGVmaW5lIFNDQUxFQklUUyAgICAgICAxMAorI2RlZmluZSBPTkVfSEFMRiAgICAgICAgKDFVTCA8PCAoU0NBTEVCSVRTLTEpKQorI2RlZmluZSBGSVgoeCkgICAgICAgICAgKChpbnQpKCh4KSAqICgxVUw8PFNDQUxFQklUUykgKyAwLjUpKQorCisgIHAgPSBwcml2LT5wbGFuZVswXTsKKyAgWSA9IHByaXYtPlk7CisgIENiID0gcHJpdi0+Q2I7CisgIENyID0gcHJpdi0+Q3I7CisgIG9mZnNldF90b19uZXh0X3JvdyA9IHByaXYtPmJ5dGVzX3Blcl9yb3dbMF0gLSA4KjM7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaS0tKSB7CisgICAgZm9yIChqID0gc3g7IGogPiAwOyBqLS0pIHsKKworICAgICAgIGludCB5LCBjYiwgY3I7CisgICAgICAgaW50IGFkZF9yLCBhZGRfZywgYWRkX2I7CisgICAgICAgaW50IHIsIGcgLCBiOworCisgICAgICAgeSAgPSBZWzBdIDw8IFNDQUxFQklUUzsKKyAgICAgICBjYiA9ICpDYisrIC0gMTI4OworICAgICAgIGNyID0gKkNyKysgLSAxMjg7CisgICAgICAgYWRkX3IgPSBGSVgoMS40MDIwMCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9nID0gLSBGSVgoMC4zNDQxNCkgKiBjYiAtIEZJWCgwLjcxNDE0KSAqIGNyICsgT05FX0hBTEY7CisgICAgICAgYWRkX2IgPSBGSVgoMS43NzIwMCkgKiBjYiArIE9ORV9IQUxGOworCisgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoYik7CisgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoZyk7CisgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAocik7CisKKyAgICAgICBZKys7CisgICAgfQorCisgICAgcCArPSBvZmZzZXRfdG9fbmV4dF9yb3c7CisgIH0KKworI3VuZGVmIFNDQUxFQklUUworI3VuZGVmIE9ORV9IQUxGCisjdW5kZWYgRklYCisKK30KKworCisvKgorICogIFlDckNiIC0+IEJHUjI0ICgyeDEpCisgKiAgLi0tLS0tLS0uCisgKiAgfCAxIHwgMiB8CisgKiAgYC0tLS0tLS0nCisgKi8KK3N0YXRpYyB2b2lkIFlDckNCX3RvX0JHUjI0XzJ4MShzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBpbnQgc3gsIGludCBzeSkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqWSwgKkNiLCAqQ3I7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIGludCBpLGo7CisgIGludCBvZmZzZXRfdG9fbmV4dF9yb3c7CisKKyNkZWZpbmUgU0NBTEVCSVRTICAgICAgIDEwCisjZGVmaW5lIE9ORV9IQUxGICAgICAgICAoMVVMIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KSAgICAgICAgICAoKGludCkoKHgpICogKDFVTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKyAgcCA9IHByaXYtPnBsYW5lWzBdOworICBZID0gcHJpdi0+WTsKKyAgQ2IgPSBwcml2LT5DYjsKKyAgQ3IgPSBwcml2LT5DcjsKKyAgb2Zmc2V0X3RvX25leHRfcm93ID0gcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSAtIDE2KjM7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaS0tKSB7CisgICAgZm9yIChqID0gc3g7IGogPiAwOyBqIC09IDIpIHsKKworICAgICAgIGludCB5LCBjYiwgY3I7CisgICAgICAgaW50IGFkZF9yLCBhZGRfZywgYWRkX2I7CisgICAgICAgaW50IHIsIGcgLCBiOworCisgICAgICAgY2IgPSAqQ2IrKyAtIDEyODsKKyAgICAgICBjciA9ICpDcisrIC0gMTI4OworICAgICAgIGFkZF9yID0gRklYKDEuNDAyMDApICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfZyA9IC0gRklYKDAuMzQ0MTQpICogY2IgLSBGSVgoMC43MTQxNCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9iID0gRklYKDEuNzcyMDApICogY2IgKyBPTkVfSEFMRjsKKworICAgICAgIHkgID0gWVswXSA8PCBTQ0FMRUJJVFM7CisgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoYik7CisgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoZyk7CisgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAocik7CisKKyAgICAgICBpZiAoaiA+IDEpIHsKKwkgICB5ICA9IFlbMV0gPDwgU0NBTEVCSVRTOworCSAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisJICAgKnArKyA9IGNsYW1wKGIpOworCSAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisJICAgKnArKyA9IGNsYW1wKGcpOworCSAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisJICAgKnArKyA9IGNsYW1wKHIpOworICAgICAgIH0KKworICAgICAgIFkgKz0gMjsKKyAgICB9CisKKyAgICBwICs9IG9mZnNldF90b19uZXh0X3JvdzsKKyAgfQorCisjdW5kZWYgU0NBTEVCSVRTCisjdW5kZWYgT05FX0hBTEYKKyN1bmRlZiBGSVgKKworfQorCisvKgorICogIFlDckNiIC0+IEJHUjI0ICgxeDIpCisgKiAgLi0tLS4KKyAqICB8IDEgfAorICogIHwtLS18CisgKiAgfCAyIHwKKyAqICBgLS0tJworICovCitzdGF0aWMgdm9pZCBZQ3JDQl90b19CR1IyNF8xeDIoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgaW50IHN4LCBpbnQgc3kpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlksICpDYiwgKkNyOworICB1bnNpZ25lZCBjaGFyICpwLCAqcDI7CisgIGludCBpLGo7CisgIGludCBvZmZzZXRfdG9fbmV4dF9yb3c7CisKKyNkZWZpbmUgU0NBTEVCSVRTICAgICAgIDEwCisjZGVmaW5lIE9ORV9IQUxGICAgICAgICAoMVVMIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KSAgICAgICAgICAoKGludCkoKHgpICogKDFVTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKyAgcCA9IHByaXYtPnBsYW5lWzBdOworICBwMiA9IHByaXYtPnBsYW5lWzBdICsgcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXTsKKyAgWSA9IHByaXYtPlk7CisgIENiID0gcHJpdi0+Q2I7CisgIENyID0gcHJpdi0+Q3I7CisgIG9mZnNldF90b19uZXh0X3JvdyA9IDIqcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSAtIDgqMzsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpIC09IDIpIHsKKyAgICBmb3IgKGogPSBzeDsgaiA+IDAgOyBqLS0pIHsKKworICAgICAgIGludCB5LCBjYiwgY3I7CisgICAgICAgaW50IGFkZF9yLCBhZGRfZywgYWRkX2I7CisgICAgICAgaW50IHIsIGcgLCBiOworCisgICAgICAgY2IgPSAqQ2IrKyAtIDEyODsKKyAgICAgICBjciA9ICpDcisrIC0gMTI4OworICAgICAgIGFkZF9yID0gRklYKDEuNDAyMDApICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfZyA9IC0gRklYKDAuMzQ0MTQpICogY2IgLSBGSVgoMC43MTQxNCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9iID0gRklYKDEuNzcyMDApICogY2IgKyBPTkVfSEFMRjsKKworICAgICAgIHkgID0gWVswXSA8PCBTQ0FMRUJJVFM7CisgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoYik7CisgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoZyk7CisgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAocik7CisKKyAgICAgICBpZiAoaSA+IDEpIHsKKwkgICB5ICA9IFlbOF0gPDwgU0NBTEVCSVRTOworCSAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisJICAgKnAyKysgPSBjbGFtcChiKTsKKwkgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworCSAgICpwMisrID0gY2xhbXAoZyk7CisJICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKwkgICAqcDIrKyA9IGNsYW1wKHIpOworICAgICAgIH0KKworICAgICAgIFkrKzsKKyAgICB9CisgICAgWSArPSA4OworICAgIHAgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICAgIHAyICs9IG9mZnNldF90b19uZXh0X3JvdzsKKyAgfQorCisjdW5kZWYgU0NBTEVCSVRTCisjdW5kZWYgT05FX0hBTEYKKyN1bmRlZiBGSVgKKworfQorCisKKy8qCisgKiAgWUNyQ2IgLT4gQkdSMjQgKDJ4MikKKyAqICAuLS0tLS0tLS4KKyAqICB8IDEgfCAyIHwKKyAqICB8LS0tKy0tLXwKKyAqICB8IDMgfCA0IHwKKyAqICBgLS0tLS0tLScKKyAqLworc3RhdGljIHZvaWQgWUNyQ0JfdG9fQkdSMjRfMngyKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBzeCwgaW50IHN5KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpZLCAqQ2IsICpDcjsKKyAgdW5zaWduZWQgY2hhciAqcCwgKnAyOworICBpbnQgaSxqOworICBpbnQgb2Zmc2V0X3RvX25leHRfcm93OworCisjZGVmaW5lIFNDQUxFQklUUyAgICAgICAxMAorI2RlZmluZSBPTkVfSEFMRiAgICAgICAgKDFVTCA8PCAoU0NBTEVCSVRTLTEpKQorI2RlZmluZSBGSVgoeCkgICAgICAgICAgKChpbnQpKCh4KSAqICgxVUw8PFNDQUxFQklUUykgKyAwLjUpKQorCisgIHAgPSBwcml2LT5wbGFuZVswXTsKKyAgcDIgPSBwcml2LT5wbGFuZVswXSArIHByaXYtPmJ5dGVzX3Blcl9yb3dbMF07CisgIFkgPSBwcml2LT5ZOworICBDYiA9IHByaXYtPkNiOworICBDciA9IHByaXYtPkNyOworICBvZmZzZXRfdG9fbmV4dF9yb3cgPSAyKnByaXYtPmJ5dGVzX3Blcl9yb3dbMF0gLSAxNiozOworICBmb3IgKGkgPSBzeTsgaSA+IDA7IGkgLT0gMikgeworICAgIGZvciAoaiA9IHN4OyBqID4gMDsgaiAtPSAyKSB7CisKKyAgICAgICBpbnQgeSwgY2IsIGNyOworICAgICAgIGludCBhZGRfciwgYWRkX2csIGFkZF9iOworICAgICAgIGludCByLCBnICwgYjsKKworICAgICAgIGNiID0gKkNiKysgLSAxMjg7CisgICAgICAgY3IgPSAqQ3IrKyAtIDEyODsKKyAgICAgICBhZGRfciA9IEZJWCgxLjQwMjAwKSAqIGNyICsgT05FX0hBTEY7CisgICAgICAgYWRkX2cgPSAtIEZJWCgwLjM0NDE0KSAqIGNiIC0gRklYKDAuNzE0MTQpICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfYiA9IEZJWCgxLjc3MjAwKSAqIGNiICsgT05FX0hBTEY7CisKKyAgICAgICB5ICA9IFlbMF0gPDwgU0NBTEVCSVRTOworICAgICAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKGIpOworICAgICAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKGcpOworICAgICAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKHIpOworCisgICAgICAgaWYgKGogPiAxKSB7CisJICAgeSAgPSBZWzFdIDw8IFNDQUxFQklUUzsKKwkgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChiKTsKKwkgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChnKTsKKwkgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChyKTsKKyAgICAgICB9CisKKyAgICAgICBpZiAoaSA+IDEpIHsKKwkgICB5ICA9IFlbMTYrMF0gPDwgU0NBTEVCSVRTOworCSAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisJICAgKnAyKysgPSBjbGFtcChiKTsKKwkgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworCSAgICpwMisrID0gY2xhbXAoZyk7CisJICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKwkgICAqcDIrKyA9IGNsYW1wKHIpOworCisJICAgaWYgKGogPiAxKSB7CisJICAgICAgIHkgID0gWVsxNisxXSA8PCBTQ0FMRUJJVFM7CisJICAgICAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisJICAgICAgICpwMisrID0gY2xhbXAoYik7CisJICAgICAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisJICAgICAgICpwMisrID0gY2xhbXAoZyk7CisJICAgICAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisJICAgICAgICpwMisrID0gY2xhbXAocik7CisJICAgfQorICAgICAgIH0KKworICAgICAgIFkgKz0gMjsKKyAgICB9CisgICAgWSAgKz0gMTY7CisgICAgcCAgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICAgIHAyICs9IG9mZnNldF90b19uZXh0X3JvdzsKKyAgfQorCisjdW5kZWYgU0NBTEVCSVRTCisjdW5kZWYgT05FX0hBTEYKKyN1bmRlZiBGSVgKKworfQorCitzdGF0aWMgaW50IGluaXRpYWxpemVfYmdyMjQoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3Blcl9ibG9ja2xpbmVzLAorCQkJICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcGVyX21jdSkKK3sKKyAgaWYgKCFwcml2LT5ieXRlc19wZXJfcm93WzBdKQorICAgIHByaXYtPmJ5dGVzX3Blcl9yb3dbMF0gPSBwcml2LT53aWR0aCAqIDM7CisgIGlmICghcHJpdi0+Y29tcG9uZW50c1swXSkKKyAgICBwcml2LT5jb21wb25lbnRzWzBdID0gbWFsbG9jKHByaXYtPmhlaWdodCAqIHByaXYtPmJ5dGVzX3Blcl9yb3dbMF0pOworCisgIGJ5dGVzX3Blcl9ibG9ja2xpbmVzWzBdID0gcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSA8PCAzOworICBieXRlc19wZXJfbWN1WzBdID0gMyo4OworCisgIHJldHVybiAhcHJpdi0+Y29tcG9uZW50c1swXTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0aW55anBlZ19jb2xvcnNwYWNlIGZvcm1hdF9iZ3IyNCA9CisgIHsKKyAgICB7CisgICAgICBZQ3JDQl90b19CR1IyNF8xeDEsCisgICAgICBZQ3JDQl90b19CR1IyNF8xeDIsCisgICAgICBZQ3JDQl90b19CR1IyNF8yeDEsCisgICAgICBZQ3JDQl90b19CR1IyNF8yeDIsCisgICAgfSwKKyAgICB0aW55anBlZ19kZWNvZGVfbWN1XzNjb21wX3RhYmxlLAorICAgIGluaXRpYWxpemVfYmdyMjQKKyAgfTsKKworY29uc3QgdGlueWpwZWdfY29sb3JzcGFjZV90IFRJTllKUEVHX0ZNVF9CR1IyNCA9ICZmb3JtYXRfYmdyMjQ7CmRpZmYgLS1naXQgYS9jb20zMi9saWIvanBlZy9iZ3JhMzIuYyBiL2NvbTMyL2xpYi9qcGVnL2JncmEzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMWFiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvanBlZy9iZ3JhMzIuYwpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqIFNtYWxsIGpwZWcgZGVjb2RlciBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBMdWMgU2FpbGxhcmQgPGx1Y0BzYWlsbGFyZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisgKiAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInRpbnlqcGVnLmgiCisjaW5jbHVkZSAidGlueWpwZWctaW50ZXJuYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZQorICoKKyAqCisgKiBOb3RlOgorICogWUNiQ3IgaXMgZGVmaW5lZCBwZXIgQ0NJUiA2MDEtMSwgZXhjZXB0IHRoYXQgQ2IgYW5kIENyIGFyZQorICogbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSByYXRoZXIgdGhhbiAtMC41IC4uIDAuNS4KKyAqIFRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcmUgdGhlcmVmb3JlCisgKiAgICAgIFIgPSBZICAgICAgICAgICAgICAgICsgMS40MDIwMCAqIENyCisgKiAgICAgIEcgPSBZIC0gMC4zNDQxNCAqIENiIC0gMC43MTQxNCAqIENyCisgKiAgICAgIEIgPSBZICsgMS43NzIwMCAqIENiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNsYW1wKGludCBpKQoreworICBpZiAoaTwwKQorICAgIHJldHVybiAwOworICBlbHNlIGlmIChpPjI1NSkKKyAgICByZXR1cm4gMjU1OworICBlbHNlCisgICAgcmV0dXJuIGk7Cit9CisKKy8qKgorICogIFlDckNiIC0+IEJHUkEzMiAoMXgxKQorICogIC4tLS0uCisgKiAgfCAxIHwKKyAqICBgLS0tJworICovCitzdGF0aWMgdm9pZCBZQ3JDQl90b19CR1JBMzJfMXgxKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBzeCwgaW50IHN5KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpZLCAqQ2IsICpDcjsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50IGksajsKKyAgaW50IG9mZnNldF90b19uZXh0X3JvdzsKKworI2RlZmluZSBTQ0FMRUJJVFMgICAgICAgMTAKKyNkZWZpbmUgT05FX0hBTEYgICAgICAgICgxVUwgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpICAgICAgICAgICgoaW50KSgoeCkgKiAoMVVMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIFkgPSBwcml2LT5ZOworICBDYiA9IHByaXYtPkNiOworICBDciA9IHByaXYtPkNyOworICBvZmZzZXRfdG9fbmV4dF9yb3cgPSBwcml2LT5ieXRlc19wZXJfcm93WzBdIC0gOCo0OworICBmb3IgKGkgPSBzeTsgaSA+IDA7IGktLSkgeworICAgIGZvciAoaiA9IHN4OyBqID4gMDsgai0tKSB7CisKKyAgICAgICBpbnQgeSwgY2IsIGNyOworICAgICAgIGludCBhZGRfciwgYWRkX2csIGFkZF9iOworICAgICAgIGludCByLCBnICwgYiwgYTsKKworICAgICAgIHkgID0gWVswXSA8PCBTQ0FMRUJJVFM7CisgICAgICAgY2IgPSAqQ2IrKyAtIDEyODsKKyAgICAgICBjciA9ICpDcisrIC0gMTI4OworICAgICAgIGFkZF9yID0gRklYKDEuNDAyMDApICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfZyA9IC0gRklYKDAuMzQ0MTQpICogY2IgLSBGSVgoMC43MTQxNCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9iID0gRklYKDEuNzcyMDApICogY2IgKyBPTkVfSEFMRjsKKworICAgICAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKGIpOworICAgICAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKGcpOworICAgICAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKHIpOworICAgICAgIGEgPSAyNTU7CisgICAgICAgKnArKyA9IGE7CisKKyAgICAgICBZKys7CisgICAgfQorCisgICAgcCArPSBvZmZzZXRfdG9fbmV4dF9yb3c7CisgIH0KKworI3VuZGVmIFNDQUxFQklUUworI3VuZGVmIE9ORV9IQUxGCisjdW5kZWYgRklYCisKK30KKworCisvKgorICogIFlDckNiIC0+IEJHUkEzMiAoMngxKQorICogIC4tLS0tLS0tLgorICogIHwgMSB8IDIgfAorICogIGAtLS0tLS0tJworICovCitzdGF0aWMgdm9pZCBZQ3JDQl90b19CR1JBMzJfMngxKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBzeCwgaW50IHN5KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpZLCAqQ2IsICpDcjsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50IGksajsKKyAgaW50IG9mZnNldF90b19uZXh0X3JvdzsKKworI2RlZmluZSBTQ0FMRUJJVFMgICAgICAgMTAKKyNkZWZpbmUgT05FX0hBTEYgICAgICAgICgxVUwgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpICAgICAgICAgICgoaW50KSgoeCkgKiAoMVVMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIFkgPSBwcml2LT5ZOworICBDYiA9IHByaXYtPkNiOworICBDciA9IHByaXYtPkNyOworICBvZmZzZXRfdG9fbmV4dF9yb3cgPSBwcml2LT5ieXRlc19wZXJfcm93WzBdIC0gMTYqNDsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpLS0pIHsKKyAgICBmb3IgKGogPSBzeDsgaiA+IDA7IGogLT0gMikgeworICAgICAgIGludCB5LCBjYiwgY3I7CisgICAgICAgaW50IGFkZF9yLCBhZGRfZywgYWRkX2I7CisgICAgICAgaW50IHIsIGcgLCBiLCBhOworCisgICAgICAgY2IgPSAqQ2IrKyAtIDEyODsKKyAgICAgICBjciA9ICpDcisrIC0gMTI4OworICAgICAgIGFkZF9yID0gRklYKDEuNDAyMDApICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfZyA9IC0gRklYKDAuMzQ0MTQpICogY2IgLSBGSVgoMC43MTQxNCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9iID0gRklYKDEuNzcyMDApICogY2IgKyBPTkVfSEFMRjsKKworICAgICAgIHkgID0gWVswXSA8PCBTQ0FMRUJJVFM7CisgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoYik7CisgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoZyk7CisgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAocik7CisgICAgICAgYSA9IDI1NTsKKyAgICAgICAqcCsrID0gYTsKKyAgICAgICAKKyAgICAgICBpZiAoaiA+IDEpIHsKKwkgICB5ICA9IFlbMV0gPDwgU0NBTEVCSVRTOworCSAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisJICAgKnArKyA9IGNsYW1wKGIpOworCSAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisJICAgKnArKyA9IGNsYW1wKGcpOworCSAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisJICAgKnArKyA9IGNsYW1wKHIpOworCSAgIGEgPSAyNTU7CisJICAgKnArKyA9IGE7CisgICAgICAgfQorCisgICAgICAgWSArPSAyOworICAgIH0KKworICAgIHAgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICB9CisKKyN1bmRlZiBTQ0FMRUJJVFMKKyN1bmRlZiBPTkVfSEFMRgorI3VuZGVmIEZJWAorCit9CisKKy8qCisgKiAgWUNyQ2IgLT4gQkdSQTMyICgxeDIpCisgKiAgLi0tLS4KKyAqICB8IDEgfAorICogIHwtLS18CisgKiAgfCAyIHwKKyAqICBgLS0tJworICovCitzdGF0aWMgdm9pZCBZQ3JDQl90b19CR1JBMzJfMXgyKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBzeCwgaW50IHN5KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpZLCAqQ2IsICpDcjsKKyAgdW5zaWduZWQgY2hhciAqcCwgKnAyOworICBpbnQgaSxqOworICBpbnQgb2Zmc2V0X3RvX25leHRfcm93OworCisjZGVmaW5lIFNDQUxFQklUUyAgICAgICAxMAorI2RlZmluZSBPTkVfSEFMRiAgICAgICAgKDFVTCA8PCAoU0NBTEVCSVRTLTEpKQorI2RlZmluZSBGSVgoeCkgICAgICAgICAgKChpbnQpKCh4KSAqICgxVUw8PFNDQUxFQklUUykgKyAwLjUpKQorCisgIHAgPSBwcml2LT5wbGFuZVswXTsKKyAgcDIgPSBwcml2LT5wbGFuZVswXSArIHByaXYtPmJ5dGVzX3Blcl9yb3dbMF07CisgIFkgPSBwcml2LT5ZOworICBDYiA9IHByaXYtPkNiOworICBDciA9IHByaXYtPkNyOworICBvZmZzZXRfdG9fbmV4dF9yb3cgPSAyKnByaXYtPmJ5dGVzX3Blcl9yb3dbMF0gLSA4KjQ7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaSAtPSAyKSB7CisgICAgZm9yIChqID0gc3g7IGogPiAwOyBqLS0pIHsKKworICAgICAgIGludCB5LCBjYiwgY3I7CisgICAgICAgaW50IGFkZF9yLCBhZGRfZywgYWRkX2I7CisgICAgICAgaW50IHIsIGcgLCBiLCBhOworCisgICAgICAgY2IgPSAqQ2IrKyAtIDEyODsKKyAgICAgICBjciA9ICpDcisrIC0gMTI4OworICAgICAgIGFkZF9yID0gRklYKDEuNDAyMDApICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfZyA9IC0gRklYKDAuMzQ0MTQpICogY2IgLSBGSVgoMC43MTQxNCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9iID0gRklYKDEuNzcyMDApICogY2IgKyBPTkVfSEFMRjsKKworICAgICAgIHkgID0gWVswXSA8PCBTQ0FMRUJJVFM7CisgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoYik7CisgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoZyk7CisgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAocik7CisgICAgICAgYSA9IDI1NTsKKyAgICAgICAqcCsrID0gYTsKKworICAgICAgIGlmIChpID4gMSkgeworCSAgIHkgID0gWVs4XSA8PCBTQ0FMRUJJVFM7CisJICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKwkgICAqcDIrKyA9IGNsYW1wKGIpOworCSAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisJICAgKnAyKysgPSBjbGFtcChnKTsKKwkgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworCSAgICpwMisrID0gY2xhbXAocik7CisJICAgYSA9IDI1NTsKKwkgICAqcDIrKyA9IGE7CisgICAgICAgfQorCisgICAgICAgWSsrOworICAgIH0KKyAgICBZICs9IDg7CisgICAgcCArPSBvZmZzZXRfdG9fbmV4dF9yb3c7CisgICAgcDIgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICB9CisKKyN1bmRlZiBTQ0FMRUJJVFMKKyN1bmRlZiBPTkVfSEFMRgorI3VuZGVmIEZJWAorCit9CisKKworLyoKKyAqICBZQ3JDYiAtPiBCR1JBMzIgKDJ4MikKKyAqICAuLS0tLS0tLS4KKyAqICB8IDEgfCAyIHwKKyAqICB8LS0tKy0tLXwKKyAqICB8IDMgfCA0IHwKKyAqICBgLS0tLS0tLScKKyAqLworc3RhdGljIHZvaWQgWUNyQ0JfdG9fQkdSQTMyXzJ4MihzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBpbnQgc3gsIGludCBzeSkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqWSwgKkNiLCAqQ3I7CisgIHVuc2lnbmVkIGNoYXIgKnAsICpwMjsKKyAgaW50IGksajsKKyAgaW50IG9mZnNldF90b19uZXh0X3JvdzsKKworI2RlZmluZSBTQ0FMRUJJVFMgICAgICAgMTAKKyNkZWZpbmUgT05FX0hBTEYgICAgICAgICgxVUwgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpICAgICAgICAgICgoaW50KSgoeCkgKiAoMVVMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIHAyID0gcHJpdi0+cGxhbmVbMF0gKyBwcml2LT5ieXRlc19wZXJfcm93WzBdOworICBZID0gcHJpdi0+WTsKKyAgQ2IgPSBwcml2LT5DYjsKKyAgQ3IgPSBwcml2LT5DcjsKKyAgb2Zmc2V0X3RvX25leHRfcm93ID0gMipwcml2LT5ieXRlc19wZXJfcm93WzBdIC0gMTYqNDsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpIC09IDIpIHsKKyAgICBmb3IgKGogPSBzeDsgaiA+IDA7IGogLT0gMikgeworCisgICAgICAgaW50IHksIGNiLCBjcjsKKyAgICAgICBpbnQgYWRkX3IsIGFkZF9nLCBhZGRfYjsKKyAgICAgICBpbnQgciwgZyAsIGIsIGE7CisKKyAgICAgICBjYiA9ICpDYisrIC0gMTI4OworICAgICAgIGNyID0gKkNyKysgLSAxMjg7CisgICAgICAgYWRkX3IgPSBGSVgoMS40MDIwMCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9nID0gLSBGSVgoMC4zNDQxNCkgKiBjYiAtIEZJWCgwLjcxNDE0KSAqIGNyICsgT05FX0hBTEY7CisgICAgICAgYWRkX2IgPSBGSVgoMS43NzIwMCkgKiBjYiArIE9ORV9IQUxGOworCisgICAgICAgeSAgPSBZWzBdIDw8IFNDQUxFQklUUzsKKyAgICAgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChiKTsKKyAgICAgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChnKTsKKyAgICAgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChyKTsKKyAgICAgICBhID0gMjU1OworICAgICAgICpwKysgPSBhOworCisgICAgICAgaWYgKGogPiAxKSB7CisJICAgeSAgPSBZWzFdIDw8IFNDQUxFQklUUzsKKwkgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChiKTsKKwkgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChnKTsKKwkgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChyKTsKKwkgICBhID0gMjU1OworCSAgICpwKysgPSBhOworICAgICAgIH0KKworICAgICAgIGlmIChpID4gMSkgeworCSAgIHkgID0gWVsxNiswXSA8PCBTQ0FMRUJJVFM7CisJICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKwkgICAqcDIrKyA9IGNsYW1wKGIpOworCSAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisJICAgKnAyKysgPSBjbGFtcChnKTsKKwkgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworCSAgICpwMisrID0gY2xhbXAocik7CisJICAgYSA9IDI1NTsKKwkgICAqcDIrKyA9IGE7CisJICAgCisJICAgaWYgKGogPiAxKSB7CisJICAgICAgIHkgID0gWVsxNisxXSA8PCBTQ0FMRUJJVFM7CisJICAgICAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisJICAgICAgICpwMisrID0gY2xhbXAoYik7CisJICAgICAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisJICAgICAgICpwMisrID0gY2xhbXAoZyk7CisJICAgICAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisJICAgICAgICpwMisrID0gY2xhbXAocik7CisJICAgICAgIGEgPSAyNTU7CisJICAgICAgICpwMisrID0gYTsKKwkgICB9CisgICAgICAgfQorCisgICAgICAgWSArPSAyOworICAgIH0KKyAgICBZICArPSAxNjsKKyAgICBwICArPSBvZmZzZXRfdG9fbmV4dF9yb3c7CisgICAgcDIgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICB9CisKKyN1bmRlZiBTQ0FMRUJJVFMKKyN1bmRlZiBPTkVfSEFMRgorI3VuZGVmIEZJWAorCit9CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZV9iZ3JhMzIoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpieXRlc19wZXJfYmxvY2tsaW5lcywKKwkJCSAgICAgdW5zaWduZWQgaW50ICpieXRlc19wZXJfbWN1KQoreworICBpZiAoIXByaXYtPmJ5dGVzX3Blcl9yb3dbMF0pCisgICAgcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSA9IHByaXYtPndpZHRoICogNDsKKyAgaWYgKCFwcml2LT5jb21wb25lbnRzWzBdKQorICAgIHByaXYtPmNvbXBvbmVudHNbMF0gPSBtYWxsb2MocHJpdi0+aGVpZ2h0ICogcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSk7CisKKyAgYnl0ZXNfcGVyX2Jsb2NrbGluZXNbMF0gPSBwcml2LT5ieXRlc19wZXJfcm93WzBdIDw8IDM7CisgIGJ5dGVzX3Blcl9tY3VbMF0gPSA0Kjg7CisKKyAgcmV0dXJuICFwcml2LT5jb21wb25lbnRzWzBdOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRpbnlqcGVnX2NvbG9yc3BhY2UgZm9ybWF0X2JncmEzMiA9CisgIHsKKyAgICB7CisgICAgICBZQ3JDQl90b19CR1JBMzJfMXgxLAorICAgICAgWUNyQ0JfdG9fQkdSQTMyXzF4MiwKKyAgICAgIFlDckNCX3RvX0JHUkEzMl8yeDEsCisgICAgICBZQ3JDQl90b19CR1JBMzJfMngyLAorICAgIH0sCisgICAgdGlueWpwZWdfZGVjb2RlX21jdV8zY29tcF90YWJsZSwKKyAgICBpbml0aWFsaXplX2JncmEzMgorICB9OworCitjb25zdCB0aW55anBlZ19jb2xvcnNwYWNlX3QgVElOWUpQRUdfRk1UX0JHUkEzMiA9ICZmb3JtYXRfYmdyYTMyOwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2pwZWcvZGVjb2RlMS5jIGIvY29tMzIvbGliL2pwZWcvZGVjb2RlMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGY3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvanBlZy9kZWNvZGUxLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBTbWFsbCBqcGVnIGRlY29kZXIgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgTHVjIFNhaWxsYXJkIDxsdWNAc2FpbGxhcmQub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQorICogIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ0aW55anBlZy5oIgorI2luY2x1ZGUgInRpbnlqcGVnLWludGVybmFsLmgiCisKKy8qCisgKiBEZWNvZGUgYSAxeDEgZGlyZWN0bHkgaW4gMSBjb2xvcgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfTUNVXzF4MV8xcGxhbmUoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdikKK3sKKyAgLy8gWQorICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNZKTsKKyAgSURDVCgmcHJpdi0+Y29tcG9uZW50X2luZm9zW2NZXSwgcHJpdi0+WSwgOCk7CisKKyAgLy8gQ2IKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjQ2IpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY0NiXSwgcHJpdi0+Q2IsIDgpOworCisgIC8vIENyCisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY0NyKTsKKyAgSURDVCgmcHJpdi0+Y29tcG9uZW50X2luZm9zW2NDcl0sIHByaXYtPkNyLCA4KTsKK30KKworCisvKgorICogRGVjb2RlIGEgMngxCisgKiAgLi0tLS0tLS0uCisgKiAgfCAxIHwgMiB8CisgKiAgYC0tLS0tLS0nCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9NQ1VfMngxXzFwbGFuZShzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2KQoreworICAvLyBZCisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY1kpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLCBwcml2LT5ZLCAxNik7CisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY1kpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLCBwcml2LT5ZKzgsIDE2KTsKKworICAvLyBDYgorICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNDYik7CisKKyAgLy8gQ3IKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjQ3IpOworfQorCisKKy8qCisgKiBEZWNvZGUgYSAyeDIgZGlyZWN0bHkgaW4gR1JFWSBmb3JtYXQgKDhiaXRzKQorICogIC4tLS0tLS0tLgorICogIHwgMSB8IDIgfAorICogIHwtLS0rLS0tfAorICogIHwgMyB8IDQgfAorICogIGAtLS0tLS0tJworICovCitzdGF0aWMgdm9pZCBkZWNvZGVfTUNVXzJ4Ml8xcGxhbmUoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdikKK3sKKyAgLy8gWQorICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNZKTsKKyAgSURDVCgmcHJpdi0+Y29tcG9uZW50X2luZm9zW2NZXSwgcHJpdi0+WSwgMTYpOworICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNZKTsKKyAgSURDVCgmcHJpdi0+Y29tcG9uZW50X2luZm9zW2NZXSwgcHJpdi0+WSs4LCAxNik7CisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY1kpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLCBwcml2LT5ZKzY0KjIsIDE2KTsKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjWSk7CisgIElEQ1QoJnByaXYtPmNvbXBvbmVudF9pbmZvc1tjWV0sIHByaXYtPlkrNjQqMis4LCAxNik7CisKKyAgLy8gQ2IKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjQ2IpOworCisgIC8vIENyCisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY0NyKTsKK30KKworLyoKKyAqIERlY29kZSBhIDF4MiBtY3UKKyAqICAuLS0tLgorICogIHwgMSB8CisgKiAgfC0tLXwKKyAqICB8IDIgfAorICogIGAtLS0nCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9NQ1VfMXgyXzFwbGFuZShzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2KQoreworICAvLyBZCisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY1kpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLCBwcml2LT5ZLCA4KTsKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjWSk7CisgIElEQ1QoJnByaXYtPmNvbXBvbmVudF9pbmZvc1tjWV0sIHByaXYtPlkrNjQsIDgpOworCisgIC8vIENiCisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY0NiKTsKKworICAvLyBDcgorICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNDcik7Cit9CisKK2NvbnN0IGRlY29kZV9NQ1VfZmN0IHRpbnlqcGVnX2RlY29kZV9tY3VfMWNvbXBfdGFibGVbNF0gPSB7CisgICBkZWNvZGVfTUNVXzF4MV8xcGxhbmUsCisgICBkZWNvZGVfTUNVXzF4Ml8xcGxhbmUsCisgICBkZWNvZGVfTUNVXzJ4MV8xcGxhbmUsCisgICBkZWNvZGVfTUNVXzJ4Ml8xcGxhbmUsCit9OwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2pwZWcvZGVjb2RlMy5jIGIvY29tMzIvbGliL2pwZWcvZGVjb2RlMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzllYzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvanBlZy9kZWNvZGUzLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBTbWFsbCBqcGVnIGRlY29kZXIgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgTHVjIFNhaWxsYXJkIDxsdWNAc2FpbGxhcmQub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQorICogIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ0aW55anBlZy5oIgorI2luY2x1ZGUgInRpbnlqcGVnLWludGVybmFsLmgiCisKKy8qCisgKiBEZWNvZGUgYWxsIHRoZSAzIGNvbXBvbmVudHMgZm9yIDF4MQorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfTUNVXzF4MV8zcGxhbmVzKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYpCit7CisgIC8vIFkKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjWSk7CisgIElEQ1QoJnByaXYtPmNvbXBvbmVudF9pbmZvc1tjWV0sIHByaXYtPlksIDgpOworCisgIC8vIENiCisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY0NiKTsKKyAgSURDVCgmcHJpdi0+Y29tcG9uZW50X2luZm9zW2NDYl0sIHByaXYtPkNiLCA4KTsKKworICAvLyBDcgorICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNDcik7CisgIElEQ1QoJnByaXYtPmNvbXBvbmVudF9pbmZvc1tjQ3JdLCBwcml2LT5DciwgOCk7Cit9CisKKy8qCisgKiBEZWNvZGUgYSAyeDEKKyAqICAuLS0tLS0tLS4KKyAqICB8IDEgfCAyIHwKKyAqICBgLS0tLS0tLScKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX01DVV8yeDFfM3BsYW5lcyhzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2KQoreworICAvLyBZCisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY1kpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLCBwcml2LT5ZLCAxNik7CisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY1kpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLCBwcml2LT5ZKzgsIDE2KTsKKworICAvLyBDYgorICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNDYik7CisgIElEQ1QoJnByaXYtPmNvbXBvbmVudF9pbmZvc1tjQ2JdLCBwcml2LT5DYiwgOCk7CisKKyAgLy8gQ3IKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjQ3IpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY0NyXSwgcHJpdi0+Q3IsIDgpOworfQorCisvKgorICogRGVjb2RlIGEgMngyCisgKiAgLi0tLS0tLS0uCisgKiAgfCAxIHwgMiB8CisgKiAgfC0tLSstLS18CisgKiAgfCAzIHwgNCB8CisgKiAgYC0tLS0tLS0nCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9NQ1VfMngyXzNwbGFuZXMoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdikKK3sKKyAgLy8gWQorICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNZKTsKKyAgSURDVCgmcHJpdi0+Y29tcG9uZW50X2luZm9zW2NZXSwgcHJpdi0+WSwgMTYpOworICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNZKTsKKyAgSURDVCgmcHJpdi0+Y29tcG9uZW50X2luZm9zW2NZXSwgcHJpdi0+WSs4LCAxNik7CisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY1kpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLCBwcml2LT5ZKzY0KjIsIDE2KTsKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjWSk7CisgIElEQ1QoJnByaXYtPmNvbXBvbmVudF9pbmZvc1tjWV0sIHByaXYtPlkrNjQqMis4LCAxNik7CisKKyAgLy8gQ2IKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjQ2IpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY0NiXSwgcHJpdi0+Q2IsIDgpOworCisgIC8vIENyCisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY0NyKTsKKyAgSURDVCgmcHJpdi0+Y29tcG9uZW50X2luZm9zW2NDcl0sIHByaXYtPkNyLCA4KTsKK30KKworLyoKKyAqIERlY29kZSBhIDF4MiBtY3UKKyAqICAuLS0tLgorICogIHwgMSB8CisgKiAgfC0tLXwKKyAqICB8IDIgfAorICogIGAtLS0nCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9NQ1VfMXgyXzNwbGFuZXMoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdikKK3sKKyAgLy8gWQorICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNZKTsKKyAgSURDVCgmcHJpdi0+Y29tcG9uZW50X2luZm9zW2NZXSwgcHJpdi0+WSwgOCk7CisgIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQocHJpdiwgY1kpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLCBwcml2LT5ZKzY0LCA4KTsKKworICAvLyBDYgorICB0aW55anBlZ19wcm9jZXNzX0h1ZmZtYW5fZGF0YV91bml0KHByaXYsIGNDYik7CisgIElEQ1QoJnByaXYtPmNvbXBvbmVudF9pbmZvc1tjQ2JdLCBwcml2LT5DYiwgOCk7CisKKyAgLy8gQ3IKKyAgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChwcml2LCBjQ3IpOworICBJRENUKCZwcml2LT5jb21wb25lbnRfaW5mb3NbY0NyXSwgcHJpdi0+Q3IsIDgpOworfQorCitjb25zdCBkZWNvZGVfTUNVX2ZjdCB0aW55anBlZ19kZWNvZGVfbWN1XzNjb21wX3RhYmxlWzRdID0geworICAgZGVjb2RlX01DVV8xeDFfM3BsYW5lcywKKyAgIGRlY29kZV9NQ1VfMXgyXzNwbGFuZXMsCisgICBkZWNvZGVfTUNVXzJ4MV8zcGxhbmVzLAorICAgZGVjb2RlX01DVV8yeDJfM3BsYW5lcywKK307CmRpZmYgLS1naXQgYS9jb20zMi9saWIvanBlZy9ncmV5LmMgYi9jb20zMi9saWIvanBlZy9ncmV5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxMGVkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9qcGVnL2dyZXkuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIFNtYWxsIGpwZWcgZGVjb2RlciBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBMdWMgU2FpbGxhcmQgPGx1Y0BzYWlsbGFyZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisgKiAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInRpbnlqcGVnLmgiCisjaW5jbHVkZSAidGlueWpwZWctaW50ZXJuYWwuaCIKKworLyoqCisgKiAgWUNyQ2IgLT4gR3JleSAoMXgxLCAxeDIpCisgKiAgLi0tLS4KKyAqICB8IDEgfAorICogIGAtLS0nCisgKi8KK3N0YXRpYyB2b2lkIFlDckNCX3RvX0dyZXlfMXhOKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBzeCwgaW50IHN5KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICp5OworICB1bnNpZ25lZCBjaGFyICpwOworICB1bnNpZ25lZCBpbnQgaTsKKyAgaW50IG9mZnNldF90b19uZXh0X3JvdzsKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIHkgPSBwcml2LT5ZOworICBvZmZzZXRfdG9fbmV4dF9yb3cgPSBwcml2LT5ieXRlc19wZXJfcm93WzBdOworCisgIGZvciAoaSA9IHN5OyBpID4gMDsgaS0tKSB7CisgICAgIG1lbWNweShwLCB5LCBzeCk7CisgICAgIHkgKz0gODsKKyAgICAgcCArPSBvZmZzZXRfdG9fbmV4dF9yb3c7CisgIH0KK30KKworLyoqCisgKiAgWUNyQ2IgLT4gR3JleSAoMngxLCAyeDIpCisgKiAgLi0tLS0tLS0uCisgKiAgfCAxIHwgMiB8CisgKiAgYC0tLS0tLS0nCisgKi8KK3N0YXRpYyB2b2lkIFlDckNCX3RvX0dyZXlfMnhOKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBzeCwgaW50IHN5KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICp5OworICB1bnNpZ25lZCBjaGFyICpwOworICB1bnNpZ25lZCBpbnQgaTsKKyAgaW50IG9mZnNldF90b19uZXh0X3JvdzsKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIHkgPSBwcml2LT5ZOworICBvZmZzZXRfdG9fbmV4dF9yb3cgPSBwcml2LT5ieXRlc19wZXJfcm93WzBdOworCisgIGZvciAoaSA9IHN5OyBpID4gMDsgaS0tKSB7CisgICAgIG1lbWNweShwLCB5LCBzeCk7CisgICAgIHkgKz0gMTY7CisgICAgIHAgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICB9Cit9CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZV9ncmV5KHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsCisJCQkgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3Blcl9ibG9ja2xpbmVzLAorCQkJICAgdW5zaWduZWQgaW50ICpieXRlc19wZXJfbWN1KQoreworICBpZiAoIXByaXYtPmJ5dGVzX3Blcl9yb3dbMF0pCisgICAgcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSA9IHByaXYtPndpZHRoOworICBpZiAoIXByaXYtPmNvbXBvbmVudHNbMF0pCisgICAgcHJpdi0+Y29tcG9uZW50c1swXSA9IG1hbGxvYyhwcml2LT5oZWlnaHQgKiBwcml2LT5ieXRlc19wZXJfcm93WzBdKTsKKworICBieXRlc19wZXJfYmxvY2tsaW5lc1swXSA9IHByaXYtPmJ5dGVzX3Blcl9yb3dbMF0gPDwgMzsKKyAgYnl0ZXNfcGVyX21jdVswXSA9IDg7CisKKyAgcmV0dXJuICFwcml2LT5jb21wb25lbnRzWzBdOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRpbnlqcGVnX2NvbG9yc3BhY2UgZm9ybWF0X2dyZXkgPQorICB7CisgICAgeworICAgICAgWUNyQ0JfdG9fR3JleV8xeE4sCisgICAgICBZQ3JDQl90b19HcmV5XzF4TiwKKyAgICAgIFlDckNCX3RvX0dyZXlfMnhOLAorICAgICAgWUNyQ0JfdG9fR3JleV8yeE4sCisgICAgfSwKKyAgICB0aW55anBlZ19kZWNvZGVfbWN1XzFjb21wX3RhYmxlLAorICAgIGluaXRpYWxpemVfZ3JleQorICB9OworCitjb25zdCB0aW55anBlZ19jb2xvcnNwYWNlX3QgVElOWUpQRUdfRk1UX0dSRVkgPSAmZm9ybWF0X2dyZXk7CmRpZmYgLS1naXQgYS9jb20zMi9saWIvanBlZy9qaWRjdGZsdC5jIGIvY29tMzIvbGliL2pwZWcvamlkY3RmbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjBkZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2pwZWcvamlkY3RmbHQuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIGppZGN0Zmx0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICoKKyAqIFRoZSBhdXRob3JzIG1ha2UgTk8gV0FSUkFOVFkgb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsCisgKiB3aXRoIHJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZSwgaXRzIHF1YWxpdHksIGFjY3VyYWN5LCBtZXJjaGFudGFiaWxpdHksIG9yCisgKiBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTIElTIiwgYW5kIHlvdSwKKyAqIGl0cyB1c2VyLCBhc3N1bWUgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5IGFuZCBhY2N1cmFjeS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdCB0byB0aGVzZQorICogY29uZGl0aW9uczoKKyAqICgxKSBJZiBhbnkgcGFydCBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhpcworICogUkVBRE1FIGZpbGUgbXVzdCBiZSBpbmNsdWRlZCwgd2l0aCB0aGlzIGNvcHlyaWdodCBhbmQgbm8td2FycmFudHkgbm90aWNlCisgKiB1bmFsdGVyZWQ7IGFuZCBhbnkgYWRkaXRpb25zLCBkZWxldGlvbnMsIG9yIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIGZpbGVzCisgKiBtdXN0IGJlIGNsZWFybHkgaW5kaWNhdGVkIGluIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uLgorICogKDIpIElmIG9ubHkgZXhlY3V0YWJsZSBjb2RlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoZSBhY2NvbXBhbnlpbmcKKyAqIGRvY3VtZW50YXRpb24gbXVzdCBzdGF0ZSB0aGF0ICJ0aGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsgb2YKKyAqIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwIi4KKyAqICgzKSBQZXJtaXNzaW9uIGZvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIG9ubHkgaWYgdGhlIHVzZXIgYWNjZXB0cworICogZnVsbCByZXNwb25zaWJpbGl0eSBmb3IgYW55IHVuZGVzaXJhYmxlIGNvbnNlcXVlbmNlczsgdGhlIGF1dGhvcnMgYWNjZXB0CisgKiBOTyBMSUFCSUxJVFkgZm9yIGRhbWFnZXMgb2YgYW55IGtpbmQuCisgKgorICogVGhlc2UgY29uZGl0aW9ucyBhcHBseSB0byBhbnkgc29mdHdhcmUgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoZSBJSkcgY29kZSwKKyAqIG5vdCBqdXN0IHRvIHRoZSB1bm1vZGlmaWVkIGxpYnJhcnkuICBJZiB5b3UgdXNlIG91ciB3b3JrLCB5b3Ugb3VnaHQgdG8KKyAqIGFja25vd2xlZGdlIHVzLgorICoKKyAqIFBlcm1pc3Npb24gaXMgTk9UIGdyYW50ZWQgZm9yIHRoZSB1c2Ugb2YgYW55IElKRyBhdXRob3IncyBuYW1lIG9yIGNvbXBhbnkgbmFtZQorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoaXMgc29mdHdhcmUgb3IgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiBpdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MKKyAqIHNvZnR3YXJlIi4KKyAqCisgKiBXZSBzcGVjaWZpY2FsbHkgcGVybWl0IGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIHRoZSBiYXNpcyBvZgorICogY29tbWVyY2lhbCBwcm9kdWN0cywgcHJvdmlkZWQgdGhhdCBhbGwgd2FycmFudHkgb3IgbGlhYmlsaXR5IGNsYWltcyBhcmUKKyAqIGFzc3VtZWQgYnkgdGhlIHByb2R1Y3QgdmVuZG9yLgorICoKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmbG9hdGluZy1wb2ludCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCisgKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIG1vcmUgYWNjdXJhdGUgdGhhbiBlaXRoZXIgb2YgdGhlIGludGVnZXIKKyAqIElEQ1QgaW1wbGVtZW50YXRpb25zLiAgSG93ZXZlciwgaXQgbWF5IG5vdCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMgb24gYWxsCisgKiBtYWNoaW5lcyBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGluIHJvdW5kb2ZmIGJlaGF2aW9yLiAgU3BlZWQgd2lsbCBkZXBlbmQKKyAqIG9uIHRoZSBoYXJkd2FyZSdzIGZsb2F0aW5nIHBvaW50IGNhcGFjaXR5LgorICoKKyAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKKyAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAorICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQorICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKKyAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCisgKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKKyAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCisgKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KKyAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcworICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQorICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQorICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCisgKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcworICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KKyAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggYSBmaXhlZC1wb2ludAorICogaW1wbGVtZW50YXRpb24sIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAqIHNjYWxlZCBxdWFudGl6YXRpb24gdmFsdWVzLiAgSG93ZXZlciwgdGhhdCBwcm9ibGVtIGRvZXMgbm90IGFyaXNlIGlmCisgKiB3ZSB1c2UgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidGlueWpwZWctaW50ZXJuYWwuaCIKKworI2RlZmluZSBGQVNUX0ZMT0FUIGZsb2F0CisjZGVmaW5lIERDVFNJWkUJICAgOAorI2RlZmluZSBEQ1RTSVpFMiAgIChEQ1RTSVpFKkRDVFNJWkUpCisKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoRkFTVF9GTE9BVCkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisKKyNpZiAxICYmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTY4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZGVzY2FsZV9hbmRfY2xhbXAoaW50IHgsIGludCBzaGlmdCkKK3sKKyAgX19hc21fXyAoCisgICAgICAiYWRkICUzLCUxXG4iCisgICAgICAiXHRzYXIgJTIsJTFcbiIKKyAgICAgICJcdHN1YiAkLTEyOCwlMVxuIgorICAgICAgIlx0Y21vdmwgJTUsJTFcbiIJLyogVXNlIHRoZSBzdWIgdG8gY29tcGFyZSB0byAwICovCisgICAgICAiXHRjbXBsICU0LCUxXG4iCisgICAgICAiXHRjbW92ZyAlNCwlMVxuIgorICAgICAgOiAiPXIiKHgpCisgICAgICA6ICIwIih4KSwgIklyIihzaGlmdCksICJpciIoMVVMPDwoc2hpZnQtMSkpLCAiciIgKDB4ZmYpLCAiciIgKDApCisgICAgICApOworICByZXR1cm4geDsKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBkZXNjYWxlX2FuZF9jbGFtcChpbnQgeCwgaW50IHNoaWZ0KQoreworICB4ICs9ICgxVUw8PChzaGlmdC0xKSk7CisgIGlmICh4PDApCisgICAgeCA9ICh4ID4+IHNoaWZ0KSB8ICgofigwVUwpKSA8PCAoMzItKHNoaWZ0KSkpOworICBlbHNlCisgICAgeCA+Pj0gc2hpZnQ7CisgIHggKz0gMTI4OworICBpZiAoeD4yNTUpCisgICAgcmV0dXJuIDI1NTsKKyAgZWxzZSBpZiAoeDwwKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIHg7Cit9CisjZW5kaWYKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKwordm9pZAordGlueWpwZWdfaWRjdF9mbG9hdCAoc3RydWN0IGNvbXBvbmVudCAqY29tcHB0ciwgdWludDhfdCAqb3V0cHV0X2J1ZiwgaW50IHN0cmlkZSkKK3sKKyAgRkFTVF9GTE9BVCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBGQVNUX0ZMT0FUIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBGQVNUX0ZMT0FUIHo1LCB6MTAsIHoxMSwgejEyLCB6MTM7CisgIGludDE2X3QgKmlucHRyOworICBGQVNUX0ZMT0FUICpxdWFudHB0cjsKKyAgRkFTVF9GTE9BVCAqd3NwdHI7CisgIHVpbnQ4X3QgKm91dHB0cjsKKyAgaW50IGN0cjsKKyAgRkFTVF9GTE9BVCB3b3Jrc3BhY2VbRENUU0laRTJdOyAvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisKKyAgaW5wdHIgPSBjb21wcHRyLT5EQ1Q7CisgIHF1YW50cHRyID0gY29tcHB0ci0+UV90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCisKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjRdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo2XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgRkFTVF9GTE9BVCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKKworICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBxdWFudHB0cisrOworICAgICAgd3NwdHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7CisgICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOwkvKiBwaGFzZSAzICovCisgICAgdG1wMTEgPSB0bXAwIC0gdG1wMjsKKworICAgIHRtcDEzID0gdG1wMSArIHRtcDM7CS8qIHBoYXNlcyA1LTMgKi8KKyAgICB0bXAxMiA9ICh0bXAxIC0gdG1wMykgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKSAtIHRtcDEzOyAvKiAyKmM0ICovCisKKyAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOworICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHRtcDUgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHRtcDYgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHRtcDcgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworCisgICAgejEzID0gdG1wNiArIHRtcDU7CQkvKiBwaGFzZSA2ICovCisgICAgejEwID0gdG1wNiAtIHRtcDU7CisgICAgejExID0gdG1wNCArIHRtcDc7CisgICAgejEyID0gdG1wNCAtIHRtcDc7CisKKyAgICB0bXA3ID0gejExICsgejEzOwkJLyogcGhhc2UgNSAqLworICAgIHRtcDExID0gKHoxMSAtIHoxMykgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKTsgLyogMipjNCAqLworCisgICAgejUgPSAoejEwICsgejEyKSAqICgoRkFTVF9GTE9BVCkgMS44NDc3NTkwNjUpOyAvKiAyKmMyICovCisgICAgdG1wMTAgPSAoKEZBU1RfRkxPQVQpIDEuMDgyMzkyMjAwKSAqIHoxMiAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9ICgoRkFTVF9GTE9BVCkgLTIuNjEzMTI1OTMwKSAqIHoxMCArIHo1OyAvKiAtMiooYzIrYzYpICovCisKKyAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwkvKiBwaGFzZSAyICovCisgICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKKyAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OworCisgICAgd3NwdHJbRENUU0laRSowXSA9IHRtcDAgKyB0bXA3OworICAgIHdzcHRyW0RDVFNJWkUqN10gPSB0bXAwIC0gdG1wNzsKKyAgICB3c3B0cltEQ1RTSVpFKjFdID0gdG1wMSArIHRtcDY7CisgICAgd3NwdHJbRENUU0laRSo2XSA9IHRtcDEgLSB0bXA2OworICAgIHdzcHRyW0RDVFNJWkUqMl0gPSB0bXAyICsgdG1wNTsKKyAgICB3c3B0cltEQ1RTSVpFKjVdID0gdG1wMiAtIHRtcDU7CisgICAgd3NwdHJbRENUU0laRSo0XSA9IHRtcDMgKyB0bXA0OworICAgIHdzcHRyW0RDVFNJWkUqM10gPSB0bXAzIC0gdG1wNDsKKworICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgIHF1YW50cHRyKys7CisgICAgd3NwdHIrKzsKKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisgIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBvdXRwdHIgPSBvdXRwdXRfYnVmOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7CisgICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KKyAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KKyAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KKyAgICAgKiBBbmQgdGVzdGluZyBmbG9hdHMgZm9yIHplcm8gaXMgcmVsYXRpdmVseSBleHBlbnNpdmUsIHNvIHdlIGRvbid0IGJvdGhlci4KKyAgICAgKi8KKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMTAgPSB3c3B0clswXSArIHdzcHRyWzRdOworICAgIHRtcDExID0gd3NwdHJbMF0gLSB3c3B0cls0XTsKKworICAgIHRtcDEzID0gd3NwdHJbMl0gKyB3c3B0cls2XTsKKyAgICB0bXAxMiA9ICh3c3B0clsyXSAtIHdzcHRyWzZdKSAqICgoRkFTVF9GTE9BVCkgMS40MTQyMTM1NjIpIC0gdG1wMTM7CisKKyAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsKKyAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKKyAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKKyAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MTMgPSB3c3B0cls1XSArIHdzcHRyWzNdOworICAgIHoxMCA9IHdzcHRyWzVdIC0gd3NwdHJbM107CisgICAgejExID0gd3NwdHJbMV0gKyB3c3B0cls3XTsKKyAgICB6MTIgPSB3c3B0clsxXSAtIHdzcHRyWzddOworCisgICAgdG1wNyA9IHoxMSArIHoxMzsKKyAgICB0bXAxMSA9ICh6MTEgLSB6MTMpICogKChGQVNUX0ZMT0FUKSAxLjQxNDIxMzU2Mik7CisKKyAgICB6NSA9ICh6MTAgKyB6MTIpICogKChGQVNUX0ZMT0FUKSAxLjg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9ICgoRkFTVF9GTE9BVCkgMS4wODIzOTIyMDApICogejEyIC0gejU7IC8qIDIqKGMyLWM2KSAqLworICAgIHRtcDEyID0gKChGQVNUX0ZMT0FUKSAtMi42MTMxMjU5MzApICogejEwICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CisgICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKKyAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBzY2FsZSBkb3duIGJ5IGEgZmFjdG9yIG9mIDggYW5kIHJhbmdlLWxpbWl0ICovCisKKyAgICBvdXRwdHJbMF0gPSBkZXNjYWxlX2FuZF9jbGFtcCgoaW50KSh0bXAwICsgdG1wNyksIDMpOworICAgIG91dHB0cls3XSA9IGRlc2NhbGVfYW5kX2NsYW1wKChpbnQpKHRtcDAgLSB0bXA3KSwgMyk7CisgICAgb3V0cHRyWzFdID0gZGVzY2FsZV9hbmRfY2xhbXAoKGludCkodG1wMSArIHRtcDYpLCAzKTsKKyAgICBvdXRwdHJbNl0gPSBkZXNjYWxlX2FuZF9jbGFtcCgoaW50KSh0bXAxIC0gdG1wNiksIDMpOworICAgIG91dHB0clsyXSA9IGRlc2NhbGVfYW5kX2NsYW1wKChpbnQpKHRtcDIgKyB0bXA1KSwgMyk7CisgICAgb3V0cHRyWzVdID0gZGVzY2FsZV9hbmRfY2xhbXAoKGludCkodG1wMiAtIHRtcDUpLCAzKTsKKyAgICBvdXRwdHJbNF0gPSBkZXNjYWxlX2FuZF9jbGFtcCgoaW50KSh0bXAzICsgdG1wNCksIDMpOworICAgIG91dHB0clszXSA9IGRlc2NhbGVfYW5kX2NsYW1wKChpbnQpKHRtcDMgLSB0bXA0KSwgMyk7CisKKworICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICBvdXRwdHIgKz0gc3RyaWRlOworICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvanBlZy9yZ2IyNC5jIGIvY29tMzIvbGliL2pwZWcvcmdiMjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTQ4MWYzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2pwZWcvcmdiMjQuYwpAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIFNtYWxsIGpwZWcgZGVjb2RlciBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBMdWMgU2FpbGxhcmQgPGx1Y0BzYWlsbGFyZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisgKiAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInRpbnlqcGVnLmgiCisjaW5jbHVkZSAidGlueWpwZWctaW50ZXJuYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZQorICoKKyAqCisgKiBOb3RlOgorICogWUNiQ3IgaXMgZGVmaW5lZCBwZXIgQ0NJUiA2MDEtMSwgZXhjZXB0IHRoYXQgQ2IgYW5kIENyIGFyZQorICogbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSByYXRoZXIgdGhhbiAtMC41IC4uIDAuNS4KKyAqIFRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcmUgdGhlcmVmb3JlCisgKiAgICAgIFIgPSBZICAgICAgICAgICAgICAgICsgMS40MDIwMCAqIENyCisgKiAgICAgIEcgPSBZIC0gMC4zNDQxNCAqIENiIC0gMC43MTQxNCAqIENyCisgKiAgICAgIEIgPSBZICsgMS43NzIwMCAqIENiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNsYW1wKGludCBpKQoreworICBpZiAoaTwwKQorICAgIHJldHVybiAwOworICBlbHNlIGlmIChpPjI1NSkKKyAgICByZXR1cm4gMjU1OworICBlbHNlCisgICAgcmV0dXJuIGk7Cit9CisKKy8qKgorICogIFlDckNiIC0+IFJHQjI0ICgxeDEpCisgKiAgLi0tLS4KKyAqICB8IDEgfAorICogIGAtLS0nCisgKi8KK3N0YXRpYyB2b2lkIFlDckNCX3RvX1JHQjI0XzF4MShzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBpbnQgc3gsIGludCBzeSkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqWSwgKkNiLCAqQ3I7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIGludCBpLGo7CisgIGludCBvZmZzZXRfdG9fbmV4dF9yb3c7CisKKyNkZWZpbmUgU0NBTEVCSVRTICAgICAgIDEwCisjZGVmaW5lIE9ORV9IQUxGICAgICAgICAoMVVMIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KSAgICAgICAgICAoKGludCkoKHgpICogKDFVTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKyAgcCA9IHByaXYtPnBsYW5lWzBdOworICBZID0gcHJpdi0+WTsKKyAgQ2IgPSBwcml2LT5DYjsKKyAgQ3IgPSBwcml2LT5DcjsKKyAgb2Zmc2V0X3RvX25leHRfcm93ID0gcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSAtIDgqMzsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpLS0pIHsKKyAgICBmb3IgKGogPSBzeDsgaiA+IDA7IGorKykgeworICAgICAgIGludCB5LCBjYiwgY3I7CisgICAgICAgaW50IGFkZF9yLCBhZGRfZywgYWRkX2I7CisgICAgICAgaW50IHIsIGcgLCBiOworCisgICAgICAgeSAgPSBZWzBdIDw8IFNDQUxFQklUUzsKKyAgICAgICBjYiA9ICpDYisrIC0gMTI4OworICAgICAgIGNyID0gKkNyKysgLSAxMjg7CisgICAgICAgYWRkX3IgPSBGSVgoMS40MDIwMCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9nID0gLSBGSVgoMC4zNDQxNCkgKiBjYiAtIEZJWCgwLjcxNDE0KSAqIGNyICsgT05FX0hBTEY7CisgICAgICAgYWRkX2IgPSBGSVgoMS43NzIwMCkgKiBjYiArIE9ORV9IQUxGOworCisgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAocik7CisgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoZyk7CisgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoYik7CisKKyAgICAgICBZKys7CisgICAgfQorCisgICAgcCArPSBvZmZzZXRfdG9fbmV4dF9yb3c7CisgIH0KKworI3VuZGVmIFNDQUxFQklUUworI3VuZGVmIE9ORV9IQUxGCisjdW5kZWYgRklYCisKK30KKworLyoqCisgKiAgWUNyQ2IgLT4gUkdCMjQgKDJ4MSkKKyAqICAuLS0tLS0tLS4KKyAqICB8IDEgfCAyIHwKKyAqICBgLS0tLS0tLScKKyAqLworc3RhdGljIHZvaWQgWUNyQ0JfdG9fUkdCMjRfMngxKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBzeCwgaW50IHN5KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpZLCAqQ2IsICpDcjsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50IGksajsKKyAgaW50IG9mZnNldF90b19uZXh0X3JvdzsKKworI2RlZmluZSBTQ0FMRUJJVFMgICAgICAgMTAKKyNkZWZpbmUgT05FX0hBTEYgICAgICAgICgxVUwgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpICAgICAgICAgICgoaW50KSgoeCkgKiAoMVVMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIFkgPSBwcml2LT5ZOworICBDYiA9IHByaXYtPkNiOworICBDciA9IHByaXYtPkNyOworICBvZmZzZXRfdG9fbmV4dF9yb3cgPSBwcml2LT5ieXRlc19wZXJfcm93WzBdIC0gMTYqMzsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpLS0pIHsKKworICAgIGZvciAoaiA9IHN4OyBqID4gMDsgaiAtPSAyKSB7CisKKyAgICAgICBpbnQgeSwgY2IsIGNyOworICAgICAgIGludCBhZGRfciwgYWRkX2csIGFkZF9iOworICAgICAgIGludCByLCBnICwgYjsKKworICAgICAgIHkgID0gWVswXSA8PCBTQ0FMRUJJVFM7CisgICAgICAgY2IgPSAqQ2IrKyAtIDEyODsKKyAgICAgICBjciA9ICpDcisrIC0gMTI4OworICAgICAgIGFkZF9yID0gRklYKDEuNDAyMDApICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfZyA9IC0gRklYKDAuMzQ0MTQpICogY2IgLSBGSVgoMC43MTQxNCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9iID0gRklYKDEuNzcyMDApICogY2IgKyBPTkVfSEFMRjsKKworICAgICAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKHIpOworICAgICAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKGcpOworICAgICAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKGIpOworCisgICAgICAgaWYgKGogPiAxKSB7CisJICAgeSAgPSBZWzFdIDw8IFNDQUxFQklUUzsKKwkgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChyKTsKKwkgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChnKTsKKwkgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChiKTsKKyAgICAgICB9CisKKyAgICAgICBZICs9IDI7CisgICAgfQorCisgICAgcCArPSBvZmZzZXRfdG9fbmV4dF9yb3c7CisgIH0KKworI3VuZGVmIFNDQUxFQklUUworI3VuZGVmIE9ORV9IQUxGCisjdW5kZWYgRklYCisKK30KKworCisvKioKKyAqICBZQ3JDYiAtPiBSR0IyNCAoMXgyKQorICogIC4tLS0uCisgKiAgfCAxIHwKKyAqICB8LS0tfAorICogIHwgMiB8CisgKiAgYC0tLScKKyAqLworc3RhdGljIHZvaWQgWUNyQ0JfdG9fUkdCMjRfMXgyKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBzeCwgaW50IHN5KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpZLCAqQ2IsICpDcjsKKyAgdW5zaWduZWQgY2hhciAqcCwgKnAyOworICBpbnQgaSxqOworICBpbnQgb2Zmc2V0X3RvX25leHRfcm93OworCisjZGVmaW5lIFNDQUxFQklUUyAgICAgICAxMAorI2RlZmluZSBPTkVfSEFMRiAgICAgICAgKDFVTCA8PCAoU0NBTEVCSVRTLTEpKQorI2RlZmluZSBGSVgoeCkgICAgICAgICAgKChpbnQpKCh4KSAqICgxVUw8PFNDQUxFQklUUykgKyAwLjUpKQorCisgIHAgPSBwcml2LT5wbGFuZVswXTsKKyAgcDIgPSBwcml2LT5wbGFuZVswXSArIHByaXYtPmJ5dGVzX3Blcl9yb3dbMF07CisgIFkgPSBwcml2LT5ZOworICBDYiA9IHByaXYtPkNiOworICBDciA9IHByaXYtPkNyOworICBvZmZzZXRfdG9fbmV4dF9yb3cgPSAyKnByaXYtPmJ5dGVzX3Blcl9yb3dbMF0gLSA4KjM7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaSAtPSAyKSB7CisgICAgZm9yIChqID0gc3g7IGogPiAwOyBqLS0pIHsKKworICAgICAgIGludCB5LCBjYiwgY3I7CisgICAgICAgaW50IGFkZF9yLCBhZGRfZywgYWRkX2I7CisgICAgICAgaW50IHIsIGcgLCBiOworCisgICAgICAgY2IgPSAqQ2IrKyAtIDEyODsKKyAgICAgICBjciA9ICpDcisrIC0gMTI4OworICAgICAgIGFkZF9yID0gRklYKDEuNDAyMDApICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfZyA9IC0gRklYKDAuMzQ0MTQpICogY2IgLSBGSVgoMC43MTQxNCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9iID0gRklYKDEuNzcyMDApICogY2IgKyBPTkVfSEFMRjsKKworICAgICAgIHkgID0gWVswXSA8PCBTQ0FMRUJJVFM7CisgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAocik7CisgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoZyk7CisgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoYik7CisKKyAgICAgICBpZiAoaSA+IDEpIHsKKwkgICB5ICA9IFlbOF0gPDwgU0NBTEVCSVRTOworCSAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisJICAgKnAyKysgPSBjbGFtcChyKTsKKwkgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworCSAgICpwMisrID0gY2xhbXAoZyk7CisJICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKwkgICAqcDIrKyA9IGNsYW1wKGIpOworICAgICAgIH0KKworICAgICAgIFkrKzsKKyAgICB9CisgICAgWSArPSA4OworICAgIHAgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICAgIHAyICs9IG9mZnNldF90b19uZXh0X3JvdzsKKyAgfQorCisjdW5kZWYgU0NBTEVCSVRTCisjdW5kZWYgT05FX0hBTEYKKyN1bmRlZiBGSVgKKworfQorCisvKioKKyAqICBZQ3JDYiAtPiBSR0IyNCAoMngyKQorICogIC4tLS0tLS0tLgorICogIHwgMSB8IDIgfAorICogIHwtLS0rLS0tfAorICogIHwgMyB8IDQgfAorICogIGAtLS0tLS0tJworICovCitzdGF0aWMgdm9pZCBZQ3JDQl90b19SR0IyNF8yeDIoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgaW50IHN4LCBpbnQgc3kpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlksICpDYiwgKkNyOworICB1bnNpZ25lZCBjaGFyICpwLCAqcDI7CisgIGludCBpLGo7CisgIGludCBvZmZzZXRfdG9fbmV4dF9yb3c7CisKKyNkZWZpbmUgU0NBTEVCSVRTICAgICAgIDEwCisjZGVmaW5lIE9ORV9IQUxGICAgICAgICAoMVVMIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KSAgICAgICAgICAoKGludCkoKHgpICogKDFVTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKyAgcCA9IHByaXYtPnBsYW5lWzBdOworICBwMiA9IHByaXYtPnBsYW5lWzBdICsgcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXTsKKyAgWSA9IHByaXYtPlk7CisgIENiID0gcHJpdi0+Q2I7CisgIENyID0gcHJpdi0+Q3I7CisgIG9mZnNldF90b19uZXh0X3JvdyA9IDIqcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSAtIDE2KjM7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaSAtPSAyKSB7CisgICAgZm9yIChqID0gc3g7IGogPiAwOyBqIC09IDIpIHsKKworICAgICAgIGludCB5LCBjYiwgY3I7CisgICAgICAgaW50IGFkZF9yLCBhZGRfZywgYWRkX2I7CisgICAgICAgaW50IHIsIGcgLCBiOworCisgICAgICAgY2IgPSAqQ2IrKyAtIDEyODsKKyAgICAgICBjciA9ICpDcisrIC0gMTI4OworICAgICAgIGFkZF9yID0gRklYKDEuNDAyMDApICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfZyA9IC0gRklYKDAuMzQ0MTQpICogY2IgLSBGSVgoMC43MTQxNCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9iID0gRklYKDEuNzcyMDApICogY2IgKyBPTkVfSEFMRjsKKworICAgICAgIHkgID0gWVswXSA8PCBTQ0FMRUJJVFM7CisgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAocik7CisgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoZyk7CisgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKyAgICAgICAqcCsrID0gY2xhbXAoYik7CisKKyAgICAgICBpZiAoaiA+IDEpIHsKKwkgICB5ICA9IFlbMV0gPDwgU0NBTEVCSVRTOworCSAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisJICAgKnArKyA9IGNsYW1wKHIpOworCSAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisJICAgKnArKyA9IGNsYW1wKGcpOworCSAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisJICAgKnArKyA9IGNsYW1wKGIpOworICAgICAgIH0KKworICAgICAgIGlmIChpID4gMSkgeworCSAgIHkgID0gWVsxNiswXSA8PCBTQ0FMRUJJVFM7CisJICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKwkgICAqcDIrKyA9IGNsYW1wKHIpOworCSAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisJICAgKnAyKysgPSBjbGFtcChnKTsKKwkgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworCSAgICpwMisrID0gY2xhbXAoYik7CisKKwkgICBpZiAoaiA+IDEpIHsKKwkgICAgICAgeSAgPSBZWzE2KzFdIDw8IFNDQUxFQklUUzsKKwkgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKwkgICAgICAgKnAyKysgPSBjbGFtcChyKTsKKwkgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKwkgICAgICAgKnAyKysgPSBjbGFtcChnKTsKKwkgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKwkgICAgICAgKnAyKysgPSBjbGFtcChiKTsKKwkgICB9CisgICAgICAgfQorICAgICAgIAorICAgICAgIFkgKz0gMjsKKyAgICB9CisgICAgWSAgKz0gMTY7CisgICAgcCAgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICAgIHAyICs9IG9mZnNldF90b19uZXh0X3JvdzsKKyAgfQorCisjdW5kZWYgU0NBTEVCSVRTCisjdW5kZWYgT05FX0hBTEYKKyN1bmRlZiBGSVgKKworfQorCitzdGF0aWMgaW50IGluaXRpYWxpemVfcmdiMjQoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3Blcl9ibG9ja2xpbmVzLAorCQkJICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcGVyX21jdSkKK3sKKyAgaWYgKCFwcml2LT5ieXRlc19wZXJfcm93WzBdKQorICAgIHByaXYtPmJ5dGVzX3Blcl9yb3dbMF0gPSBwcml2LT53aWR0aCAqIDM7CisgIGlmIChwcml2LT5jb21wb25lbnRzWzBdID09IE5VTEwpCisgICAgcHJpdi0+Y29tcG9uZW50c1swXSA9IG1hbGxvYyhwcml2LT5oZWlnaHQgKiBwcml2LT5ieXRlc19wZXJfcm93WzBdKTsKKworICBieXRlc19wZXJfYmxvY2tsaW5lc1swXSA9IHByaXYtPmJ5dGVzX3Blcl9yb3dbMF0gPDwgMzsKKyAgYnl0ZXNfcGVyX21jdVswXSA9IDMqODsKKworICByZXR1cm4gIXByaXYtPmNvbXBvbmVudHNbMF07Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGlueWpwZWdfY29sb3JzcGFjZSBmb3JtYXRfcmdiMjQgPQorICB7CisgICAgeworICAgICAgWUNyQ0JfdG9fUkdCMjRfMXgxLAorICAgICAgWUNyQ0JfdG9fUkdCMjRfMXgyLAorICAgICAgWUNyQ0JfdG9fUkdCMjRfMngxLAorICAgICAgWUNyQ0JfdG9fUkdCMjRfMngyLAorICAgIH0sCisgICAgdGlueWpwZWdfZGVjb2RlX21jdV8zY29tcF90YWJsZSwKKyAgICBpbml0aWFsaXplX3JnYjI0CisgIH07CisKK2NvbnN0IHRpbnlqcGVnX2NvbG9yc3BhY2VfdCBUSU5ZSlBFR19GTVRfUkdCMjQgPSAmZm9ybWF0X3JnYjI0OwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2pwZWcvcmdiYTMyLmMgYi9jb20zMi9saWIvanBlZy9yZ2JhMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDRmMGYxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2pwZWcvcmdiYTMyLmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBTbWFsbCBqcGVnIGRlY29kZXIgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgTHVjIFNhaWxsYXJkIDxsdWNAc2FpbGxhcmQub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQorICogIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ0aW55anBlZy5oIgorI2luY2x1ZGUgInRpbnlqcGVnLWludGVybmFsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmUKKyAqCisgKgorICogTm90ZToKKyAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKKyAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCisgKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQorICogICAgICBSID0gWSAgICAgICAgICAgICAgICArIDEuNDAyMDAgKiBDcgorICogICAgICBHID0gWSAtIDAuMzQ0MTQgKiBDYiAtIDAuNzE0MTQgKiBDcgorICogICAgICBCID0gWSArIDEuNzcyMDAgKiBDYgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgY2hhciBjbGFtcChpbnQgaSkKK3sKKyAgaWYgKGk8MCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZSBpZiAoaT4yNTUpCisgICAgcmV0dXJuIDI1NTsKKyAgZWxzZQorICAgIHJldHVybiBpOworfQorCisvKioKKyAqICBZQ3JDYiAtPiBSR0JBMzIgKDF4MSkKKyAqICAuLS0tLgorICogIHwgMSB8CisgKiAgYC0tLScKKyAqLworc3RhdGljIHZvaWQgWUNyQ0JfdG9fUkdCQTMyXzF4MShzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBpbnQgc3gsIGludCBzeSkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqWSwgKkNiLCAqQ3I7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIGludCBpLGo7CisgIGludCBvZmZzZXRfdG9fbmV4dF9yb3c7CisKKyNkZWZpbmUgU0NBTEVCSVRTICAgICAgIDEwCisjZGVmaW5lIE9ORV9IQUxGICAgICAgICAoMVVMIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KSAgICAgICAgICAoKGludCkoKHgpICogKDFVTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKyAgcCA9IHByaXYtPnBsYW5lWzBdOworICBZID0gcHJpdi0+WTsKKyAgQ2IgPSBwcml2LT5DYjsKKyAgQ3IgPSBwcml2LT5DcjsKKyAgb2Zmc2V0X3RvX25leHRfcm93ID0gcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSAtIDgqNDsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpLS0pIHsKKyAgICBmb3IgKGogPSBzeDsgaiA+IDA7IGotLSkgeworCisgICAgICAgaW50IHksIGNiLCBjcjsKKyAgICAgICBpbnQgYWRkX3IsIGFkZF9nLCBhZGRfYjsKKyAgICAgICBpbnQgciwgZyAsIGIsIGE7CisKKyAgICAgICB5ICA9IFlbMF0gPDwgU0NBTEVCSVRTOworICAgICAgIGNiID0gKkNiKysgLSAxMjg7CisgICAgICAgY3IgPSAqQ3IrKyAtIDEyODsKKyAgICAgICBhZGRfciA9IEZJWCgxLjQwMjAwKSAqIGNyICsgT05FX0hBTEY7CisgICAgICAgYWRkX2cgPSAtIEZJWCgwLjM0NDE0KSAqIGNiIC0gRklYKDAuNzE0MTQpICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfYiA9IEZJWCgxLjc3MjAwKSAqIGNiICsgT05FX0hBTEY7CisKKyAgICAgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChyKTsKKyAgICAgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChnKTsKKyAgICAgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChiKTsKKyAgICAgICBhID0gMjU1OworICAgICAgICpwKysgPSBhOworCisgICAgICAgWSsrOworICAgIH0KKworICAgIHAgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICB9CisKKyN1bmRlZiBTQ0FMRUJJVFMKKyN1bmRlZiBPTkVfSEFMRgorI3VuZGVmIEZJWAorCit9CisKKy8qKgorICogIFlDckNiIC0+IFJHQkEzMiAoMngxKQorICogIC4tLS0tLS0tLgorICogIHwgMSB8IDIgfAorICogIGAtLS0tLS0tJworICovCitzdGF0aWMgdm9pZCBZQ3JDQl90b19SR0JBMzJfMngxKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBzeCwgaW50IHN5KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpZLCAqQ2IsICpDcjsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50IGksajsKKyAgaW50IG9mZnNldF90b19uZXh0X3JvdzsKKworI2RlZmluZSBTQ0FMRUJJVFMgICAgICAgMTAKKyNkZWZpbmUgT05FX0hBTEYgICAgICAgICgxVUwgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpICAgICAgICAgICgoaW50KSgoeCkgKiAoMVVMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIFkgPSBwcml2LT5ZOworICBDYiA9IHByaXYtPkNiOworICBDciA9IHByaXYtPkNyOworICBvZmZzZXRfdG9fbmV4dF9yb3cgPSBwcml2LT5ieXRlc19wZXJfcm93WzBdIC0gMTYqNDsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpLS0pIHsKKyAgICBmb3IgKGogPSBzeDsgaiA+IDA7IGogLT0gMikgeworCisgICAgICAgaW50IHksIGNiLCBjcjsKKyAgICAgICBpbnQgYWRkX3IsIGFkZF9nLCBhZGRfYjsKKyAgICAgICBpbnQgciwgZyAsIGIsIGE7CisKKyAgICAgICB5ICA9IFlbMF0gPDwgU0NBTEVCSVRTOworICAgICAgIGNiID0gKkNiKysgLSAxMjg7CisgICAgICAgY3IgPSAqQ3IrKyAtIDEyODsKKyAgICAgICBhZGRfciA9IEZJWCgxLjQwMjAwKSAqIGNyICsgT05FX0hBTEY7CisgICAgICAgYWRkX2cgPSAtIEZJWCgwLjM0NDE0KSAqIGNiIC0gRklYKDAuNzE0MTQpICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfYiA9IEZJWCgxLjc3MjAwKSAqIGNiICsgT05FX0hBTEY7CisKKyAgICAgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChyKTsKKyAgICAgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChnKTsKKyAgICAgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChiKTsKKyAgICAgICBhID0gMjU1OworICAgICAgICpwKysgPSBhOworCisgICAgICAgaWYgKGogPiAxKSB7CisJICAgeSAgPSBZWzFdIDw8IFNDQUxFQklUUzsKKwkgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChyKTsKKwkgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChnKTsKKwkgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChiKTsKKwkgICBhID0gMjU1OworCSAgICpwKysgPSBhOworICAgICAgIH0KKworICAgICAgIFkgKz0gMjsKKyAgICB9CisKKyAgICBwICs9IG9mZnNldF90b19uZXh0X3JvdzsKKyAgfQorCisjdW5kZWYgU0NBTEVCSVRTCisjdW5kZWYgT05FX0hBTEYKKyN1bmRlZiBGSVgKKworfQorCisKKy8qKgorICogIFlDckNiIC0+IFJHQkEzMiAoMXgyKQorICogIC4tLS0uCisgKiAgfCAxIHwKKyAqICB8LS0tfAorICogIHwgMiB8CisgKiAgYC0tLScKKyAqLworc3RhdGljIHZvaWQgWUNyQ0JfdG9fUkdCQTMyXzF4MihzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBpbnQgc3gsIGludCBzeSkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqWSwgKkNiLCAqQ3I7CisgIHVuc2lnbmVkIGNoYXIgKnAsICpwMjsKKyAgaW50IGksajsKKyAgaW50IG9mZnNldF90b19uZXh0X3JvdzsKKworI2RlZmluZSBTQ0FMRUJJVFMgICAgICAgMTAKKyNkZWZpbmUgT05FX0hBTEYgICAgICAgICgxVUwgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpICAgICAgICAgICgoaW50KSgoeCkgKiAoMVVMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIHAyID0gcHJpdi0+cGxhbmVbMF0gKyBwcml2LT5ieXRlc19wZXJfcm93WzBdOworICBZID0gcHJpdi0+WTsKKyAgQ2IgPSBwcml2LT5DYjsKKyAgQ3IgPSBwcml2LT5DcjsKKyAgb2Zmc2V0X3RvX25leHRfcm93ID0gMipwcml2LT5ieXRlc19wZXJfcm93WzBdIC0gOCo0OworICBmb3IgKGkgPSBzeTsgaSA+IDA7IGkgLT0gMikgeworICAgIGZvciAoaiA9IHN4OyBqID4gMDsgai0tKSB7CisKKyAgICAgICBpbnQgeSwgY2IsIGNyOworICAgICAgIGludCBhZGRfciwgYWRkX2csIGFkZF9iOworICAgICAgIGludCByLCBnICwgYiwgYTsKKworICAgICAgIGNiID0gKkNiKysgLSAxMjg7CisgICAgICAgY3IgPSAqQ3IrKyAtIDEyODsKKyAgICAgICBhZGRfciA9IEZJWCgxLjQwMjAwKSAqIGNyICsgT05FX0hBTEY7CisgICAgICAgYWRkX2cgPSAtIEZJWCgwLjM0NDE0KSAqIGNiIC0gRklYKDAuNzE0MTQpICogY3IgKyBPTkVfSEFMRjsKKyAgICAgICBhZGRfYiA9IEZJWCgxLjc3MjAwKSAqIGNiICsgT05FX0hBTEY7CisKKyAgICAgICB5ICA9IFlbMF0gPDwgU0NBTEVCSVRTOworICAgICAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKHIpOworICAgICAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKGcpOworICAgICAgIGIgPSAoeSArIGFkZF9iKSA+PiBTQ0FMRUJJVFM7CisgICAgICAgKnArKyA9IGNsYW1wKGIpOworICAgICAgIGEgPSAyNTU7CisgICAgICAgKnArKyA9IGE7CisKKyAgICAgICBpZiAoaSA+IDEpIHsKKwkgICB5ICA9IFlbOF0gPDwgU0NBTEVCSVRTOworCSAgIHIgPSAoeSArIGFkZF9yKSA+PiBTQ0FMRUJJVFM7CisJICAgKnAyKysgPSBjbGFtcChyKTsKKwkgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworCSAgICpwMisrID0gY2xhbXAoZyk7CisJICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKwkgICAqcDIrKyA9IGNsYW1wKGIpOworCSAgIGEgPSAyNTU7CisJICAgKnAyKysgPSBhOworICAgICAgIH0KKworICAgICAgIFkrKzsKKyAgICB9CisgICAgWSArPSA4OworICAgIHAgKz0gb2Zmc2V0X3RvX25leHRfcm93OworICAgIHAyICs9IG9mZnNldF90b19uZXh0X3JvdzsKKyAgfQorCisjdW5kZWYgU0NBTEVCSVRTCisjdW5kZWYgT05FX0hBTEYKKyN1bmRlZiBGSVgKKworfQorCisvKioKKyAqICBZQ3JDYiAtPiBSR0JBMzIgKDJ4MikKKyAqICAuLS0tLS0tLS4KKyAqICB8IDEgfCAyIHwKKyAqICB8LS0tKy0tLXwKKyAqICB8IDMgfCA0IHwKKyAqICBgLS0tLS0tLScKKyAqLworc3RhdGljIHZvaWQgWUNyQ0JfdG9fUkdCQTMyXzJ4MihzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBpbnQgc3gsIGludCBzeSkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqWSwgKkNiLCAqQ3I7CisgIHVuc2lnbmVkIGNoYXIgKnAsICpwMjsKKyAgaW50IGksajsKKyAgaW50IG9mZnNldF90b19uZXh0X3JvdzsKKworI2RlZmluZSBTQ0FMRUJJVFMgICAgICAgMTAKKyNkZWZpbmUgT05FX0hBTEYgICAgICAgICgxVUwgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpICAgICAgICAgICgoaW50KSgoeCkgKiAoMVVMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIHAyID0gcHJpdi0+cGxhbmVbMF0gKyBwcml2LT5ieXRlc19wZXJfcm93WzBdOworICBZID0gcHJpdi0+WTsKKyAgQ2IgPSBwcml2LT5DYjsKKyAgQ3IgPSBwcml2LT5DcjsKKyAgb2Zmc2V0X3RvX25leHRfcm93ID0gMipwcml2LT5ieXRlc19wZXJfcm93WzBdIC0gMTYqNDsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpIC09IDIpIHsKKyAgICBmb3IgKGogPSBzeDsgaSA+IDA7IGogLT0gMikgeworCisgICAgICAgaW50IHksIGNiLCBjcjsKKyAgICAgICBpbnQgYWRkX3IsIGFkZF9nLCBhZGRfYjsKKyAgICAgICBpbnQgciwgZyAsIGIsIGE7CisKKyAgICAgICBjYiA9ICpDYisrIC0gMTI4OworICAgICAgIGNyID0gKkNyKysgLSAxMjg7CisgICAgICAgYWRkX3IgPSBGSVgoMS40MDIwMCkgKiBjciArIE9ORV9IQUxGOworICAgICAgIGFkZF9nID0gLSBGSVgoMC4zNDQxNCkgKiBjYiAtIEZJWCgwLjcxNDE0KSAqIGNyICsgT05FX0hBTEY7CisgICAgICAgYWRkX2IgPSBGSVgoMS43NzIwMCkgKiBjYiArIE9ORV9IQUxGOworCisgICAgICAgeSAgPSBZWzBdIDw8IFNDQUxFQklUUzsKKyAgICAgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChyKTsKKyAgICAgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChnKTsKKyAgICAgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworICAgICAgICpwKysgPSBjbGFtcChiKTsKKyAgICAgICBhID0gMjU1OworICAgICAgICpwKysgPSBhOworCisgICAgICAgaWYgKGogPiAxKSB7CisJICAgeSAgPSBZWzFdIDw8IFNDQUxFQklUUzsKKwkgICByID0gKHkgKyBhZGRfcikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChyKTsKKwkgICBnID0gKHkgKyBhZGRfZykgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChnKTsKKwkgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworCSAgICpwKysgPSBjbGFtcChiKTsKKwkgICBhID0gMjU1OworCSAgICpwKysgPSBhOworICAgICAgIH0KKworICAgICAgIGlmIChpID4gMSkgeworCSAgIHkgID0gWVsxNiswXSA8PCBTQ0FMRUJJVFM7CisJICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKwkgICAqcDIrKyA9IGNsYW1wKHIpOworCSAgIGcgPSAoeSArIGFkZF9nKSA+PiBTQ0FMRUJJVFM7CisJICAgKnAyKysgPSBjbGFtcChnKTsKKwkgICBiID0gKHkgKyBhZGRfYikgPj4gU0NBTEVCSVRTOworCSAgICpwMisrID0gY2xhbXAoYik7CisJICAgYSA9IDI1NTsKKwkgICAqcDIrKyA9IGE7CisKKwkgICBpZiAoaiA+IDEpIHsKKwkgICAgICAgeSAgPSBZWzE2KzFdIDw8IFNDQUxFQklUUzsKKwkgICAgICAgciA9ICh5ICsgYWRkX3IpID4+IFNDQUxFQklUUzsKKwkgICAgICAgKnAyKysgPSBjbGFtcChyKTsKKwkgICAgICAgZyA9ICh5ICsgYWRkX2cpID4+IFNDQUxFQklUUzsKKwkgICAgICAgKnAyKysgPSBjbGFtcChnKTsKKwkgICAgICAgYiA9ICh5ICsgYWRkX2IpID4+IFNDQUxFQklUUzsKKwkgICAgICAgKnAyKysgPSBjbGFtcChiKTsKKwkgICAgICAgYSA9IDI1NTsKKwkgICAgICAgKnAyKysgPSBhOworCSAgIH0KKyAgICAgICB9CisKKyAgICAgICBZICs9IDI7CisgICAgfQorICAgIFkgICs9IDE2OworICAgIHAgICs9IG9mZnNldF90b19uZXh0X3JvdzsKKyAgICBwMiArPSBvZmZzZXRfdG9fbmV4dF9yb3c7CisgIH0KKworI3VuZGVmIFNDQUxFQklUUworI3VuZGVmIE9ORV9IQUxGCisjdW5kZWYgRklYCisKK30KKworc3RhdGljIGludCBpbml0aWFsaXplX3JnYmEzMihzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LAorCQkJICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3Blcl9ibG9ja2xpbmVzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3Blcl9tY3UpCit7CisgIGlmICghcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSkKKyAgICBwcml2LT5ieXRlc19wZXJfcm93WzBdID0gcHJpdi0+d2lkdGggKiA0OworICBpZiAoIXByaXYtPmNvbXBvbmVudHNbMF0pCisgICAgcHJpdi0+Y29tcG9uZW50c1swXSA9IG1hbGxvYyhwcml2LT5oZWlnaHQgKiBwcml2LT5ieXRlc19wZXJfcm93WzBdKTsKKworICBieXRlc19wZXJfYmxvY2tsaW5lc1swXSA9IHByaXYtPmJ5dGVzX3Blcl9yb3dbMF0gPDwgMzsKKyAgYnl0ZXNfcGVyX21jdVswXSA9IDQqODsKKworICByZXR1cm4gIXByaXYtPmNvbXBvbmVudHNbMF07Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGlueWpwZWdfY29sb3JzcGFjZSBmb3JtYXRfcmdiYTMyID0KKyAgeworICAgIHsKKyAgICAgIFlDckNCX3RvX1JHQkEzMl8xeDEsCisgICAgICBZQ3JDQl90b19SR0JBMzJfMXgyLAorICAgICAgWUNyQ0JfdG9fUkdCQTMyXzJ4MSwKKyAgICAgIFlDckNCX3RvX1JHQkEzMl8yeDIsCisgICAgfSwKKyAgICB0aW55anBlZ19kZWNvZGVfbWN1XzNjb21wX3RhYmxlLAorICAgIGluaXRpYWxpemVfcmdiYTMyCisgIH07CisKK2NvbnN0IHRpbnlqcGVnX2NvbG9yc3BhY2VfdCBUSU5ZSlBFR19GTVRfUkdCQTMyID0gJmZvcm1hdF9yZ2JhMzI7CmRpZmYgLS1naXQgYS9jb20zMi9saWIvanBlZy90aW55anBlZy1pbnRlcm5hbC5oIGIvY29tMzIvbGliL2pwZWcvdGlueWpwZWctaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTZkNGZkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2pwZWcvdGlueWpwZWctaW50ZXJuYWwuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIFNtYWxsIGpwZWcgZGVjb2RlciBsaWJyYXJ5IChJbnRlcm5hbCBoZWFkZXIpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBMdWMgU2FpbGxhcmQgPGx1Y0BzYWlsbGFyZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisgKiAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisKKyNpZm5kZWYgX19USU5ZSlBFR19JTlRFUk5BTF9IXworI2RlZmluZSBfX1RJTllKUEVHX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworI2RlZmluZSBTQU5JVFlfQ0hFQ0sgMQorCitzdHJ1Y3QgamRlY19wcml2YXRlOworCisjZGVmaW5lIEhVRkZNQU5fQklUU19TSVpFICAyNTYKKyNkZWZpbmUgSFVGRk1BTl9IQVNIX05CSVRTIDkKKyNkZWZpbmUgSFVGRk1BTl9IQVNIX1NJWkUgICgxVUw8PEhVRkZNQU5fSEFTSF9OQklUUykKKyNkZWZpbmUgSFVGRk1BTl9IQVNIX01BU0sgIChIVUZGTUFOX0hBU0hfU0laRS0xKQorCisjZGVmaW5lIEhVRkZNQU5fVEFCTEVTCSAgIDQKKyNkZWZpbmUgQ09NUE9ORU5UUwkgICAzCisjZGVmaW5lIEpQRUdfTUFYX1dJRFRICSAgIDQwOTYKKyNkZWZpbmUgSlBFR19NQVhfSEVJR0hUCSAgIDQwOTYKKworc3RydWN0IGh1ZmZtYW5fdGFibGUKK3sKKyAgLyogRmFzdCBsb29rIHVwIHRhYmxlLCB1c2luZyBIVUZGTUFOX0hBU0hfTkJJVFMgYml0cyB3ZSBjYW4gaGF2ZSBkaXJlY3RseSB0aGUgc3ltYm9sLAorICAgKiBpZiB0aGUgc3ltYm9sIGlzIDwwLCB0aGVuIHdlIG5lZWQgdG8gbG9vayBpbnRvIHRoZSB0cmVlIHRhYmxlICovCisgIHNob3J0IGludCBsb29rdXBbSFVGRk1BTl9IQVNIX1NJWkVdOworICAvKiBjb2RlIHNpemU6IGdpdmUgdGhlIG51bWJlciBvZiBiaXRzIG9mIGEgc3ltYm9sIGlzIGVuY29kZWQgKi8KKyAgdW5zaWduZWQgY2hhciBjb2RlX3NpemVbSFVGRk1BTl9IQVNIX1NJWkVdOworICAvKiBzb21lIHBsYWNlIHRvIHN0b3JlIHZhbHVlIHRoYXQgaXMgbm90IGVuY29kZWQgaW4gdGhlIGxvb2t1cCB0YWJsZQorICAgKiBGSVhNRTogQ2FsY3VsYXRlIGlmIDI1NiB2YWx1ZSBpcyBlbm91Z2ggdG8gc3RvcmUgYWxsIHZhbHVlcworICAgKi8KKyAgdWludDE2X3Qgc2xvd3RhYmxlWzE2LUhVRkZNQU5fSEFTSF9OQklUU11bMjU2XTsKK307CisKK3N0cnVjdCBjb21wb25lbnQKK3sKKyAgdW5zaWduZWQgaW50IEhmYWN0b3I7CisgIHVuc2lnbmVkIGludCBWZmFjdG9yOworICBmbG9hdCAqUV90YWJsZTsJCS8qIFBvaW50ZXIgdG8gdGhlIHF1YW50aXNhdGlvbiB0YWJsZSB0byB1c2UgKi8KKyAgc3RydWN0IGh1ZmZtYW5fdGFibGUgKkFDX3RhYmxlOworICBzdHJ1Y3QgaHVmZm1hbl90YWJsZSAqRENfdGFibGU7CisgIHNob3J0IGludCBwcmV2aW91c19EQzsJLyogUHJldmlvdXMgREMgY29lZmZpY2llbnQgKi8KKyAgc2hvcnQgaW50IERDVFs2NF07CQkvKiBEQ1QgY29lZiAqLworI2lmIFNBTklUWV9DSEVDSworICB1bnNpZ25lZCBpbnQgY2lkOworI2VuZGlmCit9OworCisKK3R5cGVkZWYgdm9pZCAoKmRlY29kZV9NQ1VfZmN0KSAoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdik7Cit0eXBlZGVmIHZvaWQgKCpjb252ZXJ0X2NvbG9yc3BhY2VfZmN0KSAoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgaW50LCBpbnQpOworCitzdHJ1Y3QgamRlY19wcml2YXRlCit7CisgIC8qIFB1YmxpYyB2YXJpYWJsZXMgKi8KKyAgdWludDhfdCAqY29tcG9uZW50c1tDT01QT05FTlRTXTsKKyAgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9yb3dbQ09NUE9ORU5UU107CisgIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OwkvKiBTaXplIG9mIHRoZSBpbWFnZSAqLworICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKyAgLyogUHJpdmF0ZSB2YXJpYWJsZXMgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyZWFtX2JlZ2luLCAqc3RyZWFtX2VuZDsKKyAgdW5zaWduZWQgaW50IHN0cmVhbV9sZW5ndGg7CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyZWFtOwkvKiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHN0cmVhbSAqLworICB1bnNpZ25lZCBpbnQgcmVzZXJ2b2lyLCBuYml0c19pbl9yZXNlcnZvaXI7CisKKyAgc3RydWN0IGNvbXBvbmVudCBjb21wb25lbnRfaW5mb3NbQ09NUE9ORU5UU107CisgIGZsb2F0IFFfdGFibGVzW0NPTVBPTkVOVFNdWzY0XTsJCS8qIHF1YW50aXphdGlvbiB0YWJsZXMgKi8KKyAgc3RydWN0IGh1ZmZtYW5fdGFibGUgSFREQ1tIVUZGTUFOX1RBQkxFU107CS8qIERDIGh1ZmZtYW4gdGFibGVzICAgKi8KKyAgc3RydWN0IGh1ZmZtYW5fdGFibGUgSFRBQ1tIVUZGTUFOX1RBQkxFU107CS8qIEFDIGh1ZmZtYW4gdGFibGVzICAgKi8KKyAgaW50IGRlZmF1bHRfaHVmZm1hbl90YWJsZV9pbml0aWFsaXplZDsKKyAgaW50IHJlc3RhcnRfaW50ZXJ2YWw7CisgIGludCByZXN0YXJ0c190b19nbzsJCQkJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworICBpbnQgbGFzdF9yc3RfbWFya2VyX3NlZW47CQkJLyogUnN0IG1hcmtlciBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgKi8KKworICAvKiBUZW1wIHNwYWNlIHVzZWQgYWZ0ZXIgdGhlIElEQ1QgdG8gc3RvcmUgZWFjaCBjb21wb25lbnRzICovCisgIHVpbnQ4X3QgWVs2NCo0XSwgQ3JbNjRdLCBDYls2NF07CisKKyAgam1wX2J1ZiBqdW1wX3N0YXRlOworICAvKiBJbnRlcm5hbCBQb2ludGVyIHVzZSBmb3IgY29sb3JzcGFjZSBjb252ZXJzaW9uLCBkbyBub3QgbW9kaWZ5IGl0ICEhISAqLworICB1aW50OF90ICpwbGFuZVtDT01QT05FTlRTXTsKKworfTsKKworI2RlZmluZSBJRENUIHRpbnlqcGVnX2lkY3RfZmxvYXQKK3ZvaWQgdGlueWpwZWdfaWRjdF9mbG9hdCAoc3RydWN0IGNvbXBvbmVudCAqY29tcHB0ciwgdWludDhfdCAqb3V0cHV0X2J1ZiwgaW50IHN0cmlkZSk7CisKK3N0cnVjdCB0aW55anBlZ19jb2xvcnNwYWNlIHsKKyAgY29udmVydF9jb2xvcnNwYWNlX2ZjdCBjb252ZXJ0X2NvbG9yc3BhY2VbNF07CisgIGNvbnN0IGRlY29kZV9NQ1VfZmN0ICpkZWNvZGVfbWN1X3RhYmxlOworICBpbnQgKCppbml0aWFsaXplKShzdHJ1Y3QgamRlY19wcml2YXRlICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKik7Cit9OworCit2b2lkIHRpbnlqcGVnX3Byb2Nlc3NfSHVmZm1hbl9kYXRhX3VuaXQoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgaW50IGNvbXBvbmVudCk7CisKK2V4dGVybiBjb25zdCBkZWNvZGVfTUNVX2ZjdCB0aW55anBlZ19kZWNvZGVfbWN1XzNjb21wX3RhYmxlWzRdOworZXh0ZXJuIGNvbnN0IGRlY29kZV9NQ1VfZmN0IHRpbnlqcGVnX2RlY29kZV9tY3VfMWNvbXBfdGFibGVbNF07CisKK2VudW0gc3RkX21hcmtlcnMgeworICAgRFFUICA9IDB4REIsIC8qIERlZmluZSBRdWFudGl6YXRpb24gVGFibGUgKi8KKyAgIFNPRiAgPSAweEMwLCAvKiBTdGFydCBvZiBGcmFtZSAoc2l6ZSBpbmZvcm1hdGlvbikgKi8KKyAgIERIVCAgPSAweEM0LCAvKiBIdWZmbWFuIFRhYmxlICovCisgICBTT0kgID0gMHhEOCwgLyogU3RhcnQgb2YgSW1hZ2UgKi8KKyAgIFNPUyAgPSAweERBLCAvKiBTdGFydCBvZiBTY2FuICovCisgICBSU1QgID0gMHhEMCwgLyogUmVzZXQgTWFya2VyIGQwIC0+IC4uICovCisgICBSU1Q3ID0gMHhENywgLyogUmVzZXQgTWFya2VyIC4uIC0+IGQ3ICovCisgICBFT0kgID0gMHhEOSwgLyogRW5kIG9mIEltYWdlICovCisgICBEUkkgID0gMHhERCwgLyogRGVmaW5lIFJlc3RhcnQgSW50ZXJ2YWwgKi8KKyAgIEFQUDAgPSAweEUwLAorfTsKKworI2RlZmluZSBjWQkwCisjZGVmaW5lIGNDYgkxCisjZGVmaW5lIGNDcgkyCisKKyNkZWZpbmUgQkxBQ0tfWSAwCisjZGVmaW5lIEJMQUNLX1UgMTI3CisjZGVmaW5lIEJMQUNLX1YgMTI3CisKKyNkZWZpbmUgU0FOSVRZX0NIRUNLIDEKKworI2lmIEpQRUdfREVCVUcKKyNkZWZpbmUgZXJyb3IoZm10LCBhcmdzLi4uKSBkbyB7IFwKKyAgIHNucHJpbnRmKGVycm9yX3N0cmluZywgc2l6ZW9mKGVycm9yX3N0cmluZyksIGZtdCwgIyMgYXJncyk7IFwKKyAgIHJldHVybiAtMTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIHRyYWNlKGZtdCwgYXJncy4uLikgZG8geyBcCisgICBmcHJpbnRmKHN0ZGVyciwgZm10LCAjIyBhcmdzKTsgXAorICAgZmZsdXNoKHN0ZGVycik7IFwKK30gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIGVycm9yKGZtdCwgYXJncy4uLikgZG8geyByZXR1cm4gLTE7IH0gd2hpbGUoMCkKKyNkZWZpbmUgdHJhY2UoZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmbmRlZiBfX2xpa2VseQorIyBkZWZpbmUgX19saWtlbHkoeCkgKCEhKHgpKQorI2VuZGlmCisjaWZuZGVmIF9fdW5saWtlbHkKKyMgZGVmaW5lIF9fdW5saWtlbHkoeCkgKCEhKHgpKQorI2VuZGlmCisKKyNkZWZpbmUgbWluKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisjZGVmaW5lIG1heCh4LCB5KSAoKHgpID4gKHkpID8gKHgpIDogKHkpKQorCisjaWYgMAorc3RhdGljIGNoYXIgKnByaW50X2JpdHModW5zaWduZWQgaW50IHZhbHVlLCBjaGFyICpiaXRzdHIpCit7CisgIGludCBpLCBqOworICBpPTMxOworICB3aGlsZSAoaT4wKQorICAgeworICAgICBpZiAodmFsdWUgJiAoMVVMPDxpKSkKKyAgICAgICBicmVhazsKKyAgICAgaS0tOworICAgfQorICBqPTA7CisgIHdoaWxlIChpPj0wKQorICAgeworICAgICBiaXRzdHJbaisrXSA9ICh2YWx1ZSAmICgxVUw8PGkpKT8nMSc6JzAnOworICAgICBpLS07CisgICB9CisgIGJpdHN0cltqXSA9IDA7CisgIHJldHVybiBiaXRzdHI7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X25leHRfMTZieXRlcyhpbnQgb2Zmc2V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzdHJlYW0pCit7CisgIHRyYWNlKCIlNC40eDogJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnhcbiIsCisJb2Zmc2V0LAorCXN0cmVhbVswXSwgc3RyZWFtWzFdLCBzdHJlYW1bMl0sIHN0cmVhbVszXSwKKwlzdHJlYW1bNF0sIHN0cmVhbVs1XSwgc3RyZWFtWzZdLCBzdHJlYW1bN10sCisJc3RyZWFtWzhdLCBzdHJlYW1bOV0sIHN0cmVhbVsxMF0sIHN0cmVhbVsxMV0sCisJc3RyZWFtWzEyXSwgc3RyZWFtWzEzXSwgc3RyZWFtWzE0XSwgc3RyZWFtWzE1XSk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9qcGVnL3RpbnlqcGVnLmMgYi9jb20zMi9saWIvanBlZy90aW55anBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzE3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvanBlZy90aW55anBlZy5jCkBAIC0wLDAgKzEsMTAzOCBAQAorLyoKKyAqIFNtYWxsIGpwZWcgZGVjb2RlciBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBMdWMgU2FpbGxhcmQgPGx1Y0BzYWlsbGFyZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisgKiAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAidGlueWpwZWcuaCIKKyNpbmNsdWRlICJ0aW55anBlZy1pbnRlcm5hbC5oIgorCisvKiBHbG9iYWwgdmFyaWFibGUgdG8gcmV0dXJuIHRoZSBsYXN0IGVycm9yIGZvdW5kIHdoaWxlIGRlY29uZGluZyAqLworc3RhdGljIGNoYXIgZXJyb3Jfc3RyaW5nWzI1Nl07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHppZ3phZ1s2NF0gPQoreworICAgMCwgIDEsICA1LCAgNiwgMTQsIDE1LCAyNywgMjgsCisgICAyLCAgNCwgIDcsIDEzLCAxNiwgMjYsIDI5LCA0MiwKKyAgIDMsICA4LCAxMiwgMTcsIDI1LCAzMCwgNDEsIDQzLAorICAgOSwgMTEsIDE4LCAyNCwgMzEsIDQwLCA0NCwgNTMsCisgIDEwLCAxOSwgMjMsIDMyLCAzOSwgNDUsIDUyLCA1NCwKKyAgMjAsIDIyLCAzMywgMzgsIDQ2LCA1MSwgNTUsIDYwLAorICAyMSwgMzQsIDM3LCA0NywgNTAsIDU2LCA1OSwgNjEsCisgIDM1LCAzNiwgNDgsIDQ5LCA1NywgNTgsIDYyLCA2MworfTsKKworLyogU2V0IHVwIHRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyAoY2YuIEpQRUcgc3RhbmRhcmQgc2VjdGlvbiBLLjMpICovCisvKiBJTVBPUlRBTlQ6IHRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbiEgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGJpdHNfZGNfbHVtaW5hbmNlWzE3XSA9Cit7CisgIDAsIDAsIDEsIDUsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB2YWxfZGNfbHVtaW5hbmNlW10gPQoreworICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGJpdHNfZGNfY2hyb21pbmFuY2VbMTddID0KK3sKKyAgMCwgMCwgMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbF9kY19jaHJvbWluYW5jZVtdID0KK3sKKyAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiaXRzX2FjX2x1bWluYW5jZVsxN10gPQoreworICAwLCAwLCAyLCAxLCAzLCAzLCAyLCA0LCAzLCA1LCA1LCA0LCA0LCAwLCAwLCAxLCAweDdkCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsX2FjX2x1bWluYW5jZVtdID0KK3sKKyAgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwKKyAgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywKKyAgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwgMHgwOCwKKyAgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwKKyAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwKKyAgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKKyAgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKKyAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwKKyAgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwKKyAgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwKKyAgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwKKyAgMHg3YSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKKyAgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwKKyAgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKKyAgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwKKyAgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwKKyAgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKKyAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwKKyAgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgMHhmOSwgMHhmYQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYml0c19hY19jaHJvbWluYW5jZVsxN10gPQoreworICAwLCAwLCAyLCAxLCAyLCA0LCA0LCAzLCA0LCA3LCA1LCA0LCA0LCAwLCAxLCAyLCAweDc3Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB2YWxfYWNfY2hyb21pbmFuY2VbXSA9Cit7CisgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsCisgIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisgIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsCisgIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsCisgIDB4MTUsIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsCisgIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjYsCisgIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsCisgIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCisgIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCisgIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsCisgIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCisgIDB4NzksIDB4N2EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisgIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsCisgIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCisgIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsCisgIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsCisgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsCisgIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsCisgIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksCisgIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgIDB4ZjksIDB4ZmEKK307CisKKworLyoKKyAqIDQgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgc3RyZWFtCisgKgorICogIGZpbGxfbmJpdHM6IHB1dCBhdCBsZWFzdCBuYml0cyBpbiB0aGUgcmVzZXJ2b2lyIG9mIGJpdHMuCisgKiAgICAgICAgICAgICAgQnV0IGNvbnZlcnQgYW55IDB4ZmYsMHgwMCBpbnRvIDB4ZmYKKyAqICBnZXRfbmJpdHM6IHJlYWQgbmJpdHMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcHV0IGl0IGluIHJlc3VsdCwKKyAqICAgICAgICAgICAgIGJpdHMgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0gYW5kIHRoZSByZXNlcnZvaXIgaXMgZmlsbGVkCisgKiAgICAgICAgICAgICBhdXRvbWF0aWNhbHkuIFRoZSByZXN1bHQgaXMgc2lnbmVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mCisgKiAgICAgICAgICAgICBiaXRzLgorICogIGxvb2tfbmJpdHM6IHJlYWQgbmJpdHMgZnJvbSB0aGUgc3RyZWFtIHdpdGhvdXQgbWFya2luZyBhcyByZWFkLgorICogIHNraXBfbmJpdHM6IHJlYWQgbmJpdHMgZnJvbSB0aGUgc3RyZWFtIGJ1dCBkbyBub3QgcmV0dXJuIHRoZSByZXN1bHQuCisgKgorICogc3RyZWFtOiBjdXJyZW50IHBvaW50ZXIgaW4gdGhlIGpwZWcgZGF0YSAocmVhZCBieXRlcyBwZXIgYnl0ZXMpCisgKiBuYml0c19pbl9yZXNlcnZvaXI6IG51bWJlciBvZiBiaXRzIGZpbGxlZCBpbnRvIHRoZSByZXNlcnZvaXIKKyAqIHJlc2Vydm9pcjogcmVnaXN0ZXIgdGhhdCBjb250YWlucyBiaXRzIGluZm9ybWF0aW9uLiBPbmx5IG5iaXRzX2luX3Jlc2Vydm9pcgorICogICAgICAgICAgICBpcyB2YWxpZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBuYml0c19pbl9yZXNlcnZvaXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgPC0tICAgIDE3IGJpdHMgICAgLS0+CisgKiAgICAgICAgICAgIEV4OiAwMDAwIDAwMDAgMTAxMCAwMDAwIDExMTEgMDAwMCAgIDw9PSByZXNlcnZvaXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgXgorICogICAgICAgICAgICAgICAgICAgICAgICBiaXQgMQorICogICAgICAgICAgICBUbyBnZXQgdHdvIGJpdHMgZnJvbSB0aGlzIGV4YW1wbGUKKyAqICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzZXJ2b2lyID4+IDE1KSAmIDMKKyAqCisgKi8KKyNkZWZpbmUgZmlsbF9uYml0cyhyZXNlcnZvaXIsbmJpdHNfaW5fcmVzZXJ2b2lyLHN0cmVhbSxuYml0c193YW50ZWQpIGRvIHsgXAorICAgd2hpbGUgKG5iaXRzX2luX3Jlc2Vydm9pcjxuYml0c193YW50ZWQpIFwKKyAgICB7IFwKKyAgICAgIHVuc2lnbmVkIGNoYXIgYzsgXAorICAgICAgaWYgKHN0cmVhbSA+PSBwcml2LT5zdHJlYW1fZW5kKSBcCisgICAgICAgIGxvbmdqbXAocHJpdi0+anVtcF9zdGF0ZSwgLUVJTyk7IFwKKyAgICAgIGMgPSAqc3RyZWFtKys7IFwKKyAgICAgIHJlc2Vydm9pciA8PD0gODsgXAorICAgICAgaWYgKGMgPT0gMHhmZiAmJiAqc3RyZWFtID09IDB4MDApIFwKKyAgICAgICAgc3RyZWFtKys7IFwKKyAgICAgIHJlc2Vydm9pciB8PSBjOyBcCisgICAgICBuYml0c19pbl9yZXNlcnZvaXIrPTg7IFwKKyAgICB9IFwKK30gIHdoaWxlKDApOworCisvKiBTaWduZWQgdmVyc2lvbiAhISEhICovCisjZGVmaW5lIGdldF9uYml0cyhyZXNlcnZvaXIsbmJpdHNfaW5fcmVzZXJ2b2lyLHN0cmVhbSxuYml0c193YW50ZWQscmVzdWx0KSBkbyB7IFwKKyAgIGZpbGxfbmJpdHMocmVzZXJ2b2lyLG5iaXRzX2luX3Jlc2Vydm9pcixzdHJlYW0sKG5iaXRzX3dhbnRlZCkpOyBcCisgICByZXN1bHQgPSAoKHJlc2Vydm9pcik+PihuYml0c19pbl9yZXNlcnZvaXItKG5iaXRzX3dhbnRlZCkpKTsgXAorICAgbmJpdHNfaW5fcmVzZXJ2b2lyIC09IChuYml0c193YW50ZWQpOyAgXAorICAgcmVzZXJ2b2lyICY9ICgoMVU8PG5iaXRzX2luX3Jlc2Vydm9pciktMSk7IFwKKyAgIGlmICgodW5zaWduZWQgaW50KXJlc3VsdCA8ICgxVUw8PCgobmJpdHNfd2FudGVkKS0xKSkpIFwKKyAgICAgICByZXN1bHQgKz0gKDB4RkZGRkZGRkZVTDw8KG5iaXRzX3dhbnRlZCkpKzE7IFwKK30gIHdoaWxlKDApOworCisjZGVmaW5lIGxvb2tfbmJpdHMocmVzZXJ2b2lyLG5iaXRzX2luX3Jlc2Vydm9pcixzdHJlYW0sbmJpdHNfd2FudGVkLHJlc3VsdCkgZG8geyBcCisgICBmaWxsX25iaXRzKHJlc2Vydm9pcixuYml0c19pbl9yZXNlcnZvaXIsc3RyZWFtLChuYml0c193YW50ZWQpKTsgXAorICAgcmVzdWx0ID0gKChyZXNlcnZvaXIpPj4obmJpdHNfaW5fcmVzZXJ2b2lyLShuYml0c193YW50ZWQpKSk7IFwKK30gIHdoaWxlKDApOworCisvKiBUbyBzcGVlZCB1cCB0aGUgZGVjb2RpbmcsIHdlIGFzc3VtZSB0aGF0IHRoZSByZXNlcnZvaXIgaGF2ZSBlbm91Z2ggYml0IAorICogc2xvdyB2ZXJzaW9uOgorICogI2RlZmluZSBza2lwX25iaXRzKHJlc2Vydm9pcixuYml0c19pbl9yZXNlcnZvaXIsc3RyZWFtLG5iaXRzX3dhbnRlZCkgZG8geyBcCisgKiAgIGZpbGxfbmJpdHMocmVzZXJ2b2lyLG5iaXRzX2luX3Jlc2Vydm9pcixzdHJlYW0sKG5iaXRzX3dhbnRlZCkpOyBcCisgKiAgIG5iaXRzX2luX3Jlc2Vydm9pciAtPSAobmJpdHNfd2FudGVkKTsgXAorICogICByZXNlcnZvaXIgJj0gKCgxVTw8bmJpdHNfaW5fcmVzZXJ2b2lyKS0xKTsgXAorICogfSAgd2hpbGUoMCk7CisgKi8KKyNkZWZpbmUgc2tpcF9uYml0cyhyZXNlcnZvaXIsbmJpdHNfaW5fcmVzZXJ2b2lyLHN0cmVhbSxuYml0c193YW50ZWQpIGRvIHsgXAorICAgbmJpdHNfaW5fcmVzZXJ2b2lyIC09IChuYml0c193YW50ZWQpOyBcCisgICByZXNlcnZvaXIgJj0gKCgxVTw8bmJpdHNfaW5fcmVzZXJ2b2lyKS0xKTsgXAorfSAgd2hpbGUoMCk7CisKKworI2RlZmluZSBiZTE2X3RvX2NwdSh4KSAoKCh4KVswXTw8OCl8KHgpWzFdKQorCitzdGF0aWMgdm9pZCByZXN5bmMoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdik7CisKKy8qKgorICogR2V0IHRoZSBuZXh0ICh2YWxpZCkgaHVmZm1hbiBjb2RlIGluIHRoZSBzdHJlYW0uCisgKgorICogVG8gc3BlZWR1cCB0aGUgcHJvY2VkdXJlLCB3ZSBsb29rIEhVRkZNQU5fSEFTSF9OQklUUyBiaXRzIGFuZCB0aGUgY29kZSBpcworICogbG93ZXIgdGhhbiBIVUZGTUFOX0hBU0hfTkJJVFMgd2UgaGF2ZSBhdXRvbWF0aWNhbHkgdGhlIGxlbmd0aCBvZiB0aGUgY29kZQorICogYW5kIHRoZSB2YWx1ZSBieSB1c2luZyB0d28gbG9va3VwIHRhYmxlLgorICogRWxzZSBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLCBqdXN0IHNlYXJjaCAobGluZWFyKSBpbnRvIGFuIGFycmF5IGZvciBlYWNoCisgKiBiaXRzIGlzIHRoZSBjb2RlIGlzIHByZXNlbnQuCisgKgorICogSWYgdGhlIGNvZGUgaXMgbm90IHByZXNlbnQgZm9yIGFueSByZWFzb24sIC0xIGlzIHJldHVybi4KKyAqLworc3RhdGljIGludCBnZXRfbmV4dF9odWZmbWFuX2NvZGUoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGh1ZmZtYW5fdGFibGUgKmh1ZmZtYW5fdGFibGUpCit7CisgIGludCB2YWx1ZSwgaGNvZGU7CisgIHVuc2lnbmVkIGludCBleHRyYV9uYml0cywgbmJpdHM7CisgIHVpbnQxNl90ICpzbG93dGFibGU7CisKKyAgbG9va19uYml0cyhwcml2LT5yZXNlcnZvaXIsIHByaXYtPm5iaXRzX2luX3Jlc2Vydm9pciwgcHJpdi0+c3RyZWFtLCBIVUZGTUFOX0hBU0hfTkJJVFMsIGhjb2RlKTsKKyAgdmFsdWUgPSBodWZmbWFuX3RhYmxlLT5sb29rdXBbaGNvZGVdOworICBpZiAoX19saWtlbHkodmFsdWUgPj0gMCkpCisgIHsKKyAgICAgdW5zaWduZWQgaW50IGNvZGVfc2l6ZSA9IGh1ZmZtYW5fdGFibGUtPmNvZGVfc2l6ZVt2YWx1ZV07CisgICAgIHNraXBfbmJpdHMocHJpdi0+cmVzZXJ2b2lyLCBwcml2LT5uYml0c19pbl9yZXNlcnZvaXIsIHByaXYtPnN0cmVhbSwgY29kZV9zaXplKTsKKyAgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgLyogRGVjb2RlIG1vcmUgYml0cyBlYWNoIHRpbWUgLi4uICovCisgIGZvciAoZXh0cmFfbmJpdHM9MDsgZXh0cmFfbmJpdHM8MTYtSFVGRk1BTl9IQVNIX05CSVRTOyBleHRyYV9uYml0cysrKQorICAgeworICAgICBuYml0cyA9IEhVRkZNQU5fSEFTSF9OQklUUyArIDEgKyBleHRyYV9uYml0czsKKworICAgICBsb29rX25iaXRzKHByaXYtPnJlc2Vydm9pciwgcHJpdi0+bmJpdHNfaW5fcmVzZXJ2b2lyLCBwcml2LT5zdHJlYW0sIG5iaXRzLCBoY29kZSk7CisgICAgIHNsb3d0YWJsZSA9IGh1ZmZtYW5fdGFibGUtPnNsb3d0YWJsZVtleHRyYV9uYml0c107CisgICAgIC8qIFNlYXJjaCBpZiB0aGUgY29kZSBpcyBpbiB0aGlzIGFycmF5ICovCisgICAgIHdoaWxlIChzbG93dGFibGVbMF0pIHsKKwlpZiAoc2xvd3RhYmxlWzBdID09IGhjb2RlKSB7CisJICAgc2tpcF9uYml0cyhwcml2LT5yZXNlcnZvaXIsIHByaXYtPm5iaXRzX2luX3Jlc2Vydm9pciwgcHJpdi0+c3RyZWFtLCBuYml0cyk7CisJICAgcmV0dXJuIHNsb3d0YWJsZVsxXTsKKwl9CisJc2xvd3RhYmxlKz0yOworICAgICB9CisgICB9CisgIHJldHVybiAwOworfQorCisKKworCisvKioKKyAqCisgKiBEZWNvZGUgYSBzaW5nbGUgYmxvY2sgdGhhdCBjb250YWlucyB0aGUgRENUIGNvZWZmaWNpZW50cy4KKyAqIFRoZSB0YWJsZSBjb2VmZmljaWVudHMgaXMgYWxyZWFkeSBkZXppZ3phZ2VkIGF0IHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvbi4KKyAqCisgKi8KK3ZvaWQgdGlueWpwZWdfcHJvY2Vzc19IdWZmbWFuX2RhdGFfdW5pdChzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBpbnQgY29tcG9uZW50KQoreworICB1bnNpZ25lZCBjaGFyIGo7CisgIHVuc2lnbmVkIGludCBodWZmX2NvZGU7CisgIHVuc2lnbmVkIGNoYXIgc2l6ZV92YWwsIGNvdW50XzA7CisKKyAgc3RydWN0IGNvbXBvbmVudCAqYyA9ICZwcml2LT5jb21wb25lbnRfaW5mb3NbY29tcG9uZW50XTsKKyAgc2hvcnQgaW50IERDVFs2NF07CisKKworICAvKiBJbml0aWFsaXplIHRoZSBEQ1QgY29lZiB0YWJsZSAqLworICBtZW1zZXQoRENULCAwLCBzaXplb2YoRENUKSk7CisKKyAgLyogREMgY29lZmZpY2llbnQgZGVjb2RpbmcgKi8KKyAgaHVmZl9jb2RlID0gZ2V0X25leHRfaHVmZm1hbl9jb2RlKHByaXYsIGMtPkRDX3RhYmxlKTsKKyAgLy90cmFjZSgiKyAleFxuIiwgaHVmZl9jb2RlKTsKKyAgaWYgKGh1ZmZfY29kZSkgeworICAgICBnZXRfbmJpdHMocHJpdi0+cmVzZXJ2b2lyLCBwcml2LT5uYml0c19pbl9yZXNlcnZvaXIsIHByaXYtPnN0cmVhbSwgaHVmZl9jb2RlLCBEQ1RbMF0pOworICAgICBEQ1RbMF0gKz0gYy0+cHJldmlvdXNfREM7CisgICAgIGMtPnByZXZpb3VzX0RDID0gRENUWzBdOworICB9IGVsc2UgeworICAgICBEQ1RbMF0gPSBjLT5wcmV2aW91c19EQzsKKyAgfQorCisgIC8qIEFDIGNvZWZmaWNpZW50IGRlY29kaW5nICovCisgIGogPSAxOworICB3aGlsZSAoajw2NCkKKyAgIHsKKyAgICAgaHVmZl9jb2RlID0gZ2V0X25leHRfaHVmZm1hbl9jb2RlKHByaXYsIGMtPkFDX3RhYmxlKTsKKyAgICAgLy90cmFjZSgiLSAleFxuIiwgaHVmZl9jb2RlKTsKKworICAgICBzaXplX3ZhbCA9IGh1ZmZfY29kZSAmIDB4RjsKKyAgICAgY291bnRfMCA9IGh1ZmZfY29kZSA+PiA0OworCisgICAgIGlmIChzaXplX3ZhbCA9PSAwKQorICAgICAgeyAvKiBSTEUgKi8KKwlpZiAoY291bnRfMCA9PSAwKQorCSAgYnJlYWs7CS8qIEVPQiBmb3VuZCwgZ28gb3V0ICovCisJZWxzZSBpZiAoY291bnRfMCA9PSAweEYpCisJICBqICs9IDE2OwkvKiBza2lwIDE2IHplcm9zICovCisgICAgICB9CisgICAgIGVsc2UKKyAgICAgIHsKKwlqICs9IGNvdW50XzA7CS8qIHNraXAgY291bnRfMCB6ZXJvZXMgKi8KKwlpZiAoX191bmxpa2VseShqID49IDY0KSkKKwkgeworCSAgIHNucHJpbnRmKGVycm9yX3N0cmluZywgc2l6ZW9mKGVycm9yX3N0cmluZyksICJCYWQgaHVmZm1hbiBkYXRhIChidWZmZXIgb3ZlcmZsb3cpIik7CisJICAgYnJlYWs7CisJIH0KKwlnZXRfbmJpdHMocHJpdi0+cmVzZXJ2b2lyLCBwcml2LT5uYml0c19pbl9yZXNlcnZvaXIsIHByaXYtPnN0cmVhbSwgc2l6ZV92YWwsIERDVFtqXSk7CisJaisrOworICAgICAgfQorICAgfQorCisgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKQorICAgIGMtPkRDVFtqXSA9IERDVFt6aWd6YWdbal1dOworfQorCisvKgorICogVGFrZXMgdHdvIGFycmF5IG9mIGJpdHMsIGFuZCBidWlsZCB0aGUgaHVmZm1hbiB0YWJsZSBmb3Igc2l6ZSwgYW5kIGNvZGUKKyAqCisgKiBsb29rdXAgd2lsbCByZXR1cm4gdGhlIHN5bWJvbCBpZiB0aGUgY29kZSBpcyBsZXNzIG9yIGVxdWFsIHRoYW4gSFVGRk1BTl9IQVNIX05CSVRTLgorICogY29kZV9zaXplIHdpbGwgYmUgdXNlZCB0byBrbm93biBob3cgbWFueSBiaXRzIHRoaXMgc3ltYm9sIGlzIGVuY29kZWQuCisgKiBzbG93dGFibGUgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIGZpcnN0IGxvb2t1cCBkaWRuJ3QgZ2l2ZSB0aGUgcmVzdWx0LgorICovCitzdGF0aWMgdm9pZCBidWlsZF9odWZmbWFuX3RhYmxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpdHMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHMsIHN0cnVjdCBodWZmbWFuX3RhYmxlICp0YWJsZSkKK3sKKyAgdW5zaWduZWQgaW50IGksIGosIGNvZGUsIGNvZGVfc2l6ZSwgdmFsLCBuYml0czsKKyAgdW5zaWduZWQgY2hhciBodWZmc2l6ZVtIVUZGTUFOX0JJVFNfU0laRSsxXSwgKmh6OworICB1bnNpZ25lZCBpbnQgaHVmZmNvZGVbSFVGRk1BTl9CSVRTX1NJWkUrMV0sICpoYzsKKworICAvKgorICAgKiBCdWlsZCBhIHRlbXAgYXJyYXkKKyAgICogICBodWZmc2l6ZVtYXSA9PiBudW1iZXJzIG9mIGJpdHMgdG8gd3JpdGUgdmFsc1tYXQorICAgKi8KKyAgaHogPSBodWZmc2l6ZTsKKyAgZm9yIChpPTE7IGk8PTE2OyBpKyspCisgICB7CisgICAgIGZvciAoaj0xOyBqPD1iaXRzW2ldOyBqKyspCisgICAgICAgKmh6KysgPSBpOworICAgfQorICAqaHogPSAwOworCisgIG1lbXNldCh0YWJsZS0+bG9va3VwLCAweGZmLCBzaXplb2YodGFibGUtPmxvb2t1cCkpOworICBmb3IgKGk9MDsgaTwoMTYtSFVGRk1BTl9IQVNIX05CSVRTKTsgaSsrKQorICAgIHRhYmxlLT5zbG93dGFibGVbaV1bMF0gPSAwOworCisgIC8qIEJ1aWxkIGEgdGVtcCBhcnJheQorICAgKiAgIGh1ZmZjb2RlW1hdID0+IGNvZGUgdXNlZCB0byB3cml0ZSB2YWxzW1hdCisgICAqLworICBjb2RlID0gMDsKKyAgaGMgPSBodWZmY29kZTsKKyAgaHogPSBodWZmc2l6ZTsKKyAgbmJpdHMgPSAqaHo7CisgIHdoaWxlICgqaHopCisgICB7CisgICAgIHdoaWxlICgqaHogPT0gbmJpdHMpCisgICAgICB7CisJKmhjKysgPSBjb2RlKys7CisJaHorKzsKKyAgICAgIH0KKyAgICAgY29kZSA8PD0gMTsKKyAgICAgbmJpdHMrKzsKKyAgIH0KKworICAvKgorICAgKiBCdWlsZCB0aGUgbG9va3VwIHRhYmxlLCBhbmQgdGhlIHNsb3d0YWJsZSBpZiBuZWVkZWQuCisgICAqLworICBmb3IgKGk9MDsgaHVmZnNpemVbaV07IGkrKykKKyAgIHsKKyAgICAgdmFsID0gdmFsc1tpXTsKKyAgICAgY29kZSA9IGh1ZmZjb2RlW2ldOworICAgICBjb2RlX3NpemUgPSBodWZmc2l6ZVtpXTsKKworICAgICB0cmFjZSgidmFsPSUyLjJ4IGNvZGU9JTguOHggY29kZXNpemU9JTIuMmRcbiIsIHZhbCwgY29kZSwgY29kZV9zaXplKTsKKworICAgICB0YWJsZS0+Y29kZV9zaXplW3ZhbF0gPSBjb2RlX3NpemU7CisgICAgIGlmIChjb2RlX3NpemUgPD0gSFVGRk1BTl9IQVNIX05CSVRTKQorICAgICAgeworCS8qCisJICogR29vZDogdmFsIGNhbiBiZSBwdXQgaW4gdGhlIGxvb2t1cCB0YWJsZSwgc28gZmlsbCBhbGwgdmFsdWUgb2YgdGhpcworCSAqIGNvbHVtbiB3aXRoIHZhbHVlIHZhbAorCSAqLworCWludCByZXBlYXQgPSAxVUw8PChIVUZGTUFOX0hBU0hfTkJJVFMgLSBjb2RlX3NpemUpOworCWNvZGUgPDw9IEhVRkZNQU5fSEFTSF9OQklUUyAtIGNvZGVfc2l6ZTsKKwl3aGlsZSAoIHJlcGVhdC0tICkKKwkgIHRhYmxlLT5sb29rdXBbY29kZSsrXSA9IHZhbDsKKworICAgICAgfQorICAgICBlbHNlCisgICAgICB7CisJLyogUGVyaGFwcyBzb3J0aW5nIHRoZSBhcnJheSB3aWxsIGJlIGFuIG9wdGltaXphdGlvbiAqLworCXVpbnQxNl90ICpzbG93dGFibGUgPSB0YWJsZS0+c2xvd3RhYmxlW2NvZGVfc2l6ZS1IVUZGTUFOX0hBU0hfTkJJVFMtMV07CisJd2hpbGUoc2xvd3RhYmxlWzBdKQorCSAgc2xvd3RhYmxlKz0yOworCXNsb3d0YWJsZVswXSA9IGNvZGU7CisJc2xvd3RhYmxlWzFdID0gdmFsOworCXNsb3d0YWJsZVsyXSA9IDA7CisJLyogVE9ETzogTkVFRCBUTyBDSEVDSyBGT1IgQU4gT1ZFUkZMT1cgT0YgVEhFIFRBQkxFICovCisgICAgICB9CisKKyAgIH0KK30KKworc3RhdGljIHZvaWQgYnVpbGRfZGVmYXVsdF9odWZmbWFuX3RhYmxlcyhzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2KQoreworICBpZiAoICAgKHByaXYtPmZsYWdzICYgVElOWUpQRUdfRkxBR1NfTUpQRUdfVEFCTEUpCisgICAgICAmJiBwcml2LT5kZWZhdWx0X2h1ZmZtYW5fdGFibGVfaW5pdGlhbGl6ZWQpCisgICAgcmV0dXJuOworCisgIGJ1aWxkX2h1ZmZtYW5fdGFibGUoYml0c19kY19sdW1pbmFuY2UsIHZhbF9kY19sdW1pbmFuY2UsICZwcml2LT5IVERDWzBdKTsKKyAgYnVpbGRfaHVmZm1hbl90YWJsZShiaXRzX2FjX2x1bWluYW5jZSwgdmFsX2FjX2x1bWluYW5jZSwgJnByaXYtPkhUQUNbMF0pOworCisgIGJ1aWxkX2h1ZmZtYW5fdGFibGUoYml0c19kY19jaHJvbWluYW5jZSwgdmFsX2RjX2Nocm9taW5hbmNlLCAmcHJpdi0+SFREQ1sxXSk7CisgIGJ1aWxkX2h1ZmZtYW5fdGFibGUoYml0c19hY19jaHJvbWluYW5jZSwgdmFsX2FjX2Nocm9taW5hbmNlLCAmcHJpdi0+SFRBQ1sxXSk7CisKKyAgcHJpdi0+ZGVmYXVsdF9odWZmbWFuX3RhYmxlX2luaXRpYWxpemVkID0gMTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmUKKyAqCisgKgorICogTm90ZToKKyAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKKyAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCisgKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQorICogICAgICBSID0gWSAgICAgICAgICAgICAgICArIDEuNDAyMDAgKiBDcgorICogICAgICBHID0gWSAtIDAuMzQ0MTQgKiBDYiAtIDAuNzE0MTQgKiBDcgorICogICAgICBCID0gWSArIDEuNzcyMDAgKiBDYgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHByaW50X1NPRihjb25zdCB1bnNpZ25lZCBjaGFyICpzdHJlYW0pCit7CisjaWYgSlBFR19ERUJVRworICBpbnQgd2lkdGgsIGhlaWdodCwgbnJfY29tcG9uZW50cywgcHJlY2lzaW9uOworICBjb25zdCBjaGFyICpucl9jb21wb25lbnRzX3RvX3N0cmluZ1tdID0geworICAgICAiPz8/PyIsCisgICAgICJHcmF5c2NhbGUiLAorICAgICAiPz8/PyIsCisgICAgICJZQ2JDciIsCisgICAgICJDWU1LIgorICB9OworCisgIHByZWNpc2lvbiA9IHN0cmVhbVsyXTsKKyAgaGVpZ2h0ID0gYmUxNl90b19jcHUoc3RyZWFtKzMpOworICB3aWR0aCAgPSBiZTE2X3RvX2NwdShzdHJlYW0rNSk7CisgIG5yX2NvbXBvbmVudHMgPSBzdHJlYW1bN107CisKKyAgdHJhY2UoIj4gU09GIG1hcmtlclxuIik7CisgIHRyYWNlKCJTaXplOiVkeCVkIG5yX2NvbXBvbmVudHM6JWQgKCVzKSAgcHJlY2lzaW9uOiVkXG4iLAorICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgIG5yX2NvbXBvbmVudHMsIG5yX2NvbXBvbmVudHNfdG9fc3RyaW5nW25yX2NvbXBvbmVudHNdLAorICAgICAgcHJlY2lzaW9uKTsKKyNlbmRpZgorICAodm9pZClzdHJlYW07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSlBFRy9KRklGIFBhcnNpbmcgZnVuY3Rpb25zCisgKgorICogTm90ZTogb25seSBhIHNtYWxsIHN1YnNldCBvZiB0aGUganBlZyBmaWxlIGZvcm1hdCBpcyBzdXBwb3J0ZWQuIE5vIG1hcmtlcnMsCisgKiBub3IgcHJvZ3Jlc3NpdmUgc3RyZWFtIGlzIHN1cHBvcnRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBidWlsZF9xdWFudGl6YXRpb25fdGFibGUoZmxvYXQgKnF0YWJsZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX3RhYmxlKQoreworICAvKiBUYWtlbiBmcm9tIGxpYmpwZWcuIENvcHlyaWdodCBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgTExNIGlkY3QuCisgICAqIEZvciBmbG9hdCBBQSZOIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCisgICAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorICAgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQorICAgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43CisgICAqIFdlIGFwcGx5IGEgZnVydGhlciBzY2FsZSBmYWN0b3Igb2YgOC4KKyAgICogV2hhdCdzIGFjdHVhbGx5IHN0b3JlZCBpcyAxL2Rpdmlzb3Igc28gdGhhdCB0aGUgaW5uZXIgbG9vcCBjYW4KKyAgICogdXNlIGEgbXVsdGlwbGljYXRpb24gcmF0aGVyIHRoYW4gYSBkaXZpc2lvbi4KKyAgICovCisgIGludCBpLCBqOworICBzdGF0aWMgY29uc3QgZG91YmxlIGFhbnNjYWxlZmFjdG9yWzhdID0geworICAgICAxLjAsIDEuMzg3MDM5ODQ1LCAxLjMwNjU2Mjk2NSwgMS4xNzU4NzU2MDIsCisgICAgIDEuMCwgMC43ODU2OTQ5NTgsIDAuNTQxMTk2MTAwLCAwLjI3NTg5OTM3OQorICB9OworICBjb25zdCB1bnNpZ25lZCBjaGFyICp6eiA9IHppZ3phZzsKKworICBmb3IgKGk9MDsgaTw4OyBpKyspIHsKKyAgICAgZm9yIChqPTA7IGo8ODsgaisrKSB7CisgICAgICAgKnF0YWJsZSsrID0gcmVmX3RhYmxlWyp6eisrXSAqIGFhbnNjYWxlZmFjdG9yW2ldICogYWFuc2NhbGVmYWN0b3Jbal07CisgICAgIH0KKyAgIH0KKworfQorCitzdGF0aWMgaW50IHBhcnNlX0RRVChzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzdHJlYW0pCit7CisgIGludCBxaTsKKyAgZmxvYXQgKnRhYmxlOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkcXRfYmxvY2tfZW5kOworCisgIHRyYWNlKCI+IERRVCBtYXJrZXJcbiIpOworICBkcXRfYmxvY2tfZW5kID0gc3RyZWFtICsgYmUxNl90b19jcHUoc3RyZWFtKTsKKyAgc3RyZWFtICs9IDI7CS8qIFNraXAgbGVuZ3RoICovCisKKyAgd2hpbGUgKHN0cmVhbSA8IGRxdF9ibG9ja19lbmQpCisgICB7CisgICAgIHFpID0gKnN0cmVhbSsrOworI2lmIFNBTklUWV9DSEVDSworICAgICBpZiAocWk+PjQpCisgICAgICAgZXJyb3IoIjE2IGJpdHMgcXVhbnRpemF0aW9uIHRhYmxlIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICBpZiAocWk+NCkKKyAgICAgICBlcnJvcigiTm8gbW9yZSA0IHF1YW50aXphdGlvbiB0YWJsZSBpcyBzdXBwb3J0ZWQgKGdvdCAlZClcbiIsIHFpKTsKKyNlbmRpZgorICAgICB0YWJsZSA9IHByaXYtPlFfdGFibGVzW3FpXTsKKyAgICAgYnVpbGRfcXVhbnRpemF0aW9uX3RhYmxlKHRhYmxlLCBzdHJlYW0pOworICAgICBzdHJlYW0gKz0gNjQ7CisgICB9CisgIHRyYWNlKCI8IERRVCBtYXJrZXJcbiIpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9TT0Yoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyZWFtKQoreworICBpbnQgaSwgd2lkdGgsIGhlaWdodCwgbnJfY29tcG9uZW50cywgY2lkLCBzYW1wbGluZ19mYWN0b3I7CisgIGludCBRX3RhYmxlOworICBzdHJ1Y3QgY29tcG9uZW50ICpjOworCisgIHRyYWNlKCI+IFNPRiBtYXJrZXJcbiIpOworICBwcmludF9TT0Yoc3RyZWFtKTsKKworICBoZWlnaHQgPSBiZTE2X3RvX2NwdShzdHJlYW0rMyk7CisgIHdpZHRoICA9IGJlMTZfdG9fY3B1KHN0cmVhbSs1KTsKKyAgbnJfY29tcG9uZW50cyA9IHN0cmVhbVs3XTsKKyNpZiBTQU5JVFlfQ0hFQ0sKKyAgaWYgKHN0cmVhbVsyXSAhPSA4KQorICAgIGVycm9yKCJQcmVjaXNpb24gb3RoZXIgdGhhbiA4IGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworICBpZiAod2lkdGg+SlBFR19NQVhfV0lEVEggfHwgaGVpZ2h0PkpQRUdfTUFYX0hFSUdIVCkKKyAgICBlcnJvcigiV2lkdGggYW5kIEhlaWdodCAoJWR4JWQpIHNlZW1zIHN1c3BpY2lvdXNcbiIsIHdpZHRoLCBoZWlnaHQpOworICBpZiAobnJfY29tcG9uZW50cyAhPSAzKQorICAgIGVycm9yKCJXZSBvbmx5IHN1cHBvcnQgWVVWIGltYWdlc1xuIik7CisjZW5kaWYKKyAgc3RyZWFtICs9IDg7CisgIGZvciAoaT0wOyBpPG5yX2NvbXBvbmVudHM7IGkrKykgeworICAgICBjaWQgPSAqc3RyZWFtKys7CisgICAgIHNhbXBsaW5nX2ZhY3RvciA9ICpzdHJlYW0rKzsKKyAgICAgUV90YWJsZSA9ICpzdHJlYW0rKzsKKyAgICAgYyA9ICZwcml2LT5jb21wb25lbnRfaW5mb3NbaV07CisjaWYgU0FOSVRZX0NIRUNLCisgICAgIGMtPmNpZCA9IGNpZDsKKyAgICAgaWYgKFFfdGFibGUgPj0gQ09NUE9ORU5UUykKKyAgICAgICBlcnJvcigiQmFkIFF1YW50aXphdGlvbiB0YWJsZSBpbmRleCAoZ290ICVkLCBtYXggYWxsb3dlZCAlZClcbiIsIFFfdGFibGUsIENPTVBPTkVOVFMtMSk7CisjZW5kaWYKKyAgICAgYy0+VmZhY3RvciA9IHNhbXBsaW5nX2ZhY3RvciYweGY7CisgICAgIGMtPkhmYWN0b3IgPSBzYW1wbGluZ19mYWN0b3I+PjQ7CisgICAgIGMtPlFfdGFibGUgPSBwcml2LT5RX3RhYmxlc1tRX3RhYmxlXTsKKyAgICAgdHJhY2UoIkNvbXBvbmVudDolZCAgZmFjdG9yOiVkeCVkICBRdWFudGl6YXRpb24gdGFibGU6JWRcbiIsCisgICAgICAgICAgIGNpZCwgYy0+SGZhY3RvciwgYy0+SGZhY3RvciwgUV90YWJsZSApOworCisgIH0KKyAgcHJpdi0+d2lkdGggPSB3aWR0aDsKKyAgcHJpdi0+aGVpZ2h0ID0gaGVpZ2h0OworCisgIHRyYWNlKCI8IFNPRiBtYXJrZXJcbiIpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX1NPUyhzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzdHJlYW0pCit7CisgIHVuc2lnbmVkIGludCBpLCBjaWQsIHRhYmxlOworICB1bnNpZ25lZCBpbnQgbnJfY29tcG9uZW50cyA9IHN0cmVhbVsyXTsKKworICB0cmFjZSgiPiBTT1MgbWFya2VyXG4iKTsKKworI2lmIFNBTklUWV9DSEVDSworICBpZiAobnJfY29tcG9uZW50cyAhPSAzKQorICAgIGVycm9yKCJXZSBvbmx5IHN1cHBvcnQgWUNiQ3IgaW1hZ2VcbiIpOworI2VuZGlmCisKKyAgc3RyZWFtICs9IDM7CisgIGZvciAoaT0wO2k8bnJfY29tcG9uZW50cztpKyspIHsKKyAgICAgY2lkID0gKnN0cmVhbSsrOworICAgICB0YWJsZSA9ICpzdHJlYW0rKzsKKyNpZiBTQU5JVFlfQ0hFQ0sKKyAgICAgaWYgKCh0YWJsZSYweGYpPj00KQorCWVycm9yKCJXZSBkbyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMiBBQyBIdWZmbWFuIHRhYmxlXG4iKTsKKyAgICAgaWYgKCh0YWJsZT4+NCk+PTQpCisJZXJyb3IoIldlIGRvIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAyIERDIEh1ZmZtYW4gdGFibGVcbiIpOworICAgICBpZiAoY2lkICE9IHByaXYtPmNvbXBvbmVudF9pbmZvc1tpXS5jaWQpCisgICAgICAgIGVycm9yKCJTT1MgY2lkIG9yZGVyICglZDolZCkgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZSBTT0YgbWFya2VyICglZDolZClcbiIsCisJICAgICAgaSwgY2lkLCBpLCBwcml2LT5jb21wb25lbnRfaW5mb3NbaV0uY2lkKTsKKyAgICAgdHJhY2UoIkNvbXBvbmVudElkOiVkICB0YWJsZUFDOiVkIHRhYmxlREM6JWRcbiIsIGNpZCwgdGFibGUmMHhmLCB0YWJsZT4+NCk7CisjZW5kaWYKKyAgICAgcHJpdi0+Y29tcG9uZW50X2luZm9zW2ldLkFDX3RhYmxlID0gJnByaXYtPkhUQUNbdGFibGUmMHhmXTsKKyAgICAgcHJpdi0+Y29tcG9uZW50X2luZm9zW2ldLkRDX3RhYmxlID0gJnByaXYtPkhURENbdGFibGU+PjRdOworICB9CisgIHByaXYtPnN0cmVhbSA9IHN0cmVhbSszOworICB0cmFjZSgiPCBTT1MgbWFya2VyXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfREhUKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0cmVhbSkKK3sKKyAgdW5zaWduZWQgaW50IGNvdW50LCBpOworICB1bnNpZ25lZCBjaGFyIGh1ZmZfYml0c1sxN107CisgIGludCBsZW5ndGgsIGluZGV4OworCisgIGxlbmd0aCA9IGJlMTZfdG9fY3B1KHN0cmVhbSkgLSAyOworICBzdHJlYW0gKz0gMjsJLyogU2tpcCBsZW5ndGggKi8KKworICB0cmFjZSgiPiBESFQgbWFya2VyIChsZW5ndGg9JWQpXG4iLCBsZW5ndGgpOworCisgIHdoaWxlIChsZW5ndGg+MCkgeworICAgICBpbmRleCA9ICpzdHJlYW0rKzsKKworICAgICAvKiBXZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzICd2YWxzJyB3aWxsIHRha2VzICovCisgICAgIGh1ZmZfYml0c1swXSA9IDA7CisgICAgIGNvdW50ID0gMDsKKyAgICAgZm9yIChpPTE7IGk8MTc7IGkrKykgeworCWh1ZmZfYml0c1tpXSA9ICpzdHJlYW0rKzsKKwljb3VudCArPSBodWZmX2JpdHNbaV07CisgICAgIH0KKyNpZiBTQU5JVFlfQ0hFQ0sKKyAgICAgaWYgKGNvdW50ID49IEhVRkZNQU5fQklUU19TSVpFKQorICAgICAgIGVycm9yKCJObyBtb3JlIHRoYW4gJWQgYnl0ZXMgaXMgYWxsb3dlZCB0byBkZXNjcmliZSBhIGh1ZmZtYW4gdGFibGUiLCBIVUZGTUFOX0JJVFNfU0laRSk7CisgICAgIGlmICggKGluZGV4ICYweGYpID49IEhVRkZNQU5fVEFCTEVTKQorICAgICAgIGVycm9yKCJObyBtb3JlIHRoYW4gJWQgSHVmZm1hbiB0YWJsZXMgaXMgc3VwcG9ydGVkIChnb3QgJWQpXG4iLCBIVUZGTUFOX1RBQkxFUywgaW5kZXgmMHhmKTsKKyAgICAgdHJhY2UoIkh1ZmZtYW4gdGFibGUgJXNbJWRdIGxlbmd0aD0lZFxuIiwgKGluZGV4JjB4ZjApPyJBQyI6IkRDIiwgaW5kZXgmMHhmLCBjb3VudCk7CisjZW5kaWYKKworICAgICBpZiAoaW5kZXggJiAweGYwICkKKyAgICAgICBidWlsZF9odWZmbWFuX3RhYmxlKGh1ZmZfYml0cywgc3RyZWFtLCAmcHJpdi0+SFRBQ1tpbmRleCYweGZdKTsKKyAgICAgZWxzZQorICAgICAgIGJ1aWxkX2h1ZmZtYW5fdGFibGUoaHVmZl9iaXRzLCBzdHJlYW0sICZwcml2LT5IVERDW2luZGV4JjB4Zl0pOworCisgICAgIGxlbmd0aCAtPSAxOworICAgICBsZW5ndGggLT0gMTY7CisgICAgIGxlbmd0aCAtPSBjb3VudDsKKyAgICAgc3RyZWFtICs9IGNvdW50OworICB9CisgIHRyYWNlKCI8IERIVCBtYXJrZXJcbiIpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9EUkkoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyZWFtKQoreworICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworCisgIHRyYWNlKCI+IERSSSBtYXJrZXJcbiIpOworCisgIGxlbmd0aCA9IGJlMTZfdG9fY3B1KHN0cmVhbSk7CisKKyNpZiBTQU5JVFlfQ0hFQ0sKKyAgaWYgKGxlbmd0aCAhPSA0KQorICAgIGVycm9yKCJMZW5ndGggb2YgRFJJIG1hcmtlciBuZWVkIHRvIGJlIDRcbiIpOworI2VuZGlmCisKKyAgcHJpdi0+cmVzdGFydF9pbnRlcnZhbCA9IGJlMTZfdG9fY3B1KHN0cmVhbSsyKTsKKworI2lmIEpQRUdfREVCVUcKKyAgdHJhY2UoIlJlc3RhcnQgaW50ZXJ2YWwgPSAlZFxuIiwgcHJpdi0+cmVzdGFydF9pbnRlcnZhbCk7CisjZW5kaWYKKworICB0cmFjZSgiPCBEUkkgbWFya2VyXG4iKTsKKworICByZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyB2b2lkIHJlc3luYyhzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2KQoreworICBpbnQgaTsKKworICAvKiBJbml0IERDIGNvZWZmaWNpZW50cyAqLworICBmb3IgKGk9MDsgaTxDT01QT05FTlRTOyBpKyspCisgICAgIHByaXYtPmNvbXBvbmVudF9pbmZvc1tpXS5wcmV2aW91c19EQyA9IDA7CisKKyAgcHJpdi0+cmVzZXJ2b2lyID0gMDsKKyAgcHJpdi0+bmJpdHNfaW5fcmVzZXJ2b2lyID0gMDsKKyAgaWYgKHByaXYtPnJlc3RhcnRfaW50ZXJ2YWwgPiAwKQorICAgIHByaXYtPnJlc3RhcnRzX3RvX2dvID0gcHJpdi0+cmVzdGFydF9pbnRlcnZhbDsKKyAgZWxzZQorICAgIHByaXYtPnJlc3RhcnRzX3RvX2dvID0gLTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9uZXh0X3JzdF9tYXJrZXIoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdikKK3sKKyAgaW50IHJzdF9tYXJrZXJfZm91bmQgPSAwOworICBpbnQgbWFya2VyOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdHJlYW0gPSBwcml2LT5zdHJlYW07CisKKyAgLyogUGFyc2UgbWFya2VyICovCisgIHdoaWxlICghcnN0X21hcmtlcl9mb3VuZCkKKyAgIHsKKyAgICAgd2hpbGUgKCpzdHJlYW0rKyAhPSAweGZmKQorICAgICAgeworCWlmIChzdHJlYW0gPj0gcHJpdi0+c3RyZWFtX2VuZCkKKwkgIGVycm9yKCJFT0Ygd2hpbGUgc2VhcmNoIGZvciBhIFJTVCBtYXJrZXIuIik7CisgICAgICB9CisgICAgIC8qIFNraXAgYW55IHBhZGRpbmcgZmYgYnl0ZSAodGhpcyBpcyBub3JtYWwpICovCisgICAgIHdoaWxlICgqc3RyZWFtID09IDB4ZmYpCisgICAgICAgc3RyZWFtKys7CisKKyAgICAgbWFya2VyID0gKnN0cmVhbSsrOworICAgICBpZiAoKFJTVCtwcml2LT5sYXN0X3JzdF9tYXJrZXJfc2VlbikgPT0gbWFya2VyKQorICAgICAgIHJzdF9tYXJrZXJfZm91bmQgPSAxOworICAgICBlbHNlIGlmIChtYXJrZXIgPj0gUlNUICYmIG1hcmtlciA8PSBSU1Q3KQorICAgICAgIGVycm9yKCJXcm9uZyBSZXNldCBtYXJrZXIgZm91bmQsIGFib3JkaW5nIik7CisgICAgIGVsc2UgaWYgKG1hcmtlciA9PSBFT0kpCisgICAgICAgcmV0dXJuIDA7CisgICB9CisgIHRyYWNlKCJSU1QgTWFya2VyICVkIGZvdW5kIGF0IG9mZnNldCAlZFxuIiwgcHJpdi0+bGFzdF9yc3RfbWFya2VyX3NlZW4sIHN0cmVhbSAtIHByaXYtPnN0cmVhbV9iZWdpbik7CisKKyAgcHJpdi0+c3RyZWFtID0gc3RyZWFtOworICBwcml2LT5sYXN0X3JzdF9tYXJrZXJfc2VlbisrOworICBwcml2LT5sYXN0X3JzdF9tYXJrZXJfc2VlbiAmPSA3OworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX0pGSUYoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyZWFtKQoreworICBpbnQgY2h1Y2tfbGVuOworICBpbnQgbWFya2VyOworICBpbnQgc29zX21hcmtlcl9mb3VuZCA9IDA7CisgIGludCBkaHRfbWFya2VyX2ZvdW5kID0gMDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqbmV4dF9jaHVuY2s7CisKKyAgLyogUGFyc2UgbWFya2VyICovCisgIHdoaWxlICghc29zX21hcmtlcl9mb3VuZCkKKyAgIHsKKyAgICAgaWYgKCpzdHJlYW0rKyAhPSAweGZmKQorICAgICAgIGdvdG8gYm9ndXNfanBlZ19mb3JtYXQ7CisgICAgIC8qIFNraXAgYW55IHBhZGRpbmcgZmYgYnl0ZSAodGhpcyBpcyBub3JtYWwpICovCisgICAgIHdoaWxlICgqc3RyZWFtID09IDB4ZmYpCisgICAgICAgc3RyZWFtKys7CisKKyAgICAgbWFya2VyID0gKnN0cmVhbSsrOworICAgICBjaHVja19sZW4gPSBiZTE2X3RvX2NwdShzdHJlYW0pOworICAgICBuZXh0X2NodW5jayA9IHN0cmVhbSArIGNodWNrX2xlbjsKKyAgICAgc3dpdGNoIChtYXJrZXIpCisgICAgICB7CisgICAgICAgY2FzZSBTT0Y6CisJIGlmIChwYXJzZV9TT0YocHJpdiwgc3RyZWFtKSA8IDApCisJICAgcmV0dXJuIC0xOworCSBicmVhazsKKyAgICAgICBjYXNlIERRVDoKKwkgaWYgKHBhcnNlX0RRVChwcml2LCBzdHJlYW0pIDwgMCkKKwkgICByZXR1cm4gLTE7CisJIGJyZWFrOworICAgICAgIGNhc2UgU09TOgorCSBpZiAocGFyc2VfU09TKHByaXYsIHN0cmVhbSkgPCAwKQorCSAgIHJldHVybiAtMTsKKwkgc29zX21hcmtlcl9mb3VuZCA9IDE7CisJIGJyZWFrOworICAgICAgIGNhc2UgREhUOgorCSBpZiAocGFyc2VfREhUKHByaXYsIHN0cmVhbSkgPCAwKQorCSAgIHJldHVybiAtMTsKKwkgZGh0X21hcmtlcl9mb3VuZCA9IDE7CisJIGJyZWFrOworICAgICAgIGNhc2UgRFJJOgorCSBpZiAocGFyc2VfRFJJKHByaXYsIHN0cmVhbSkgPCAwKQorCSAgIHJldHVybiAtMTsKKwkgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKwkgdHJhY2UoIj4gVW5rbm93biBtYXJrZXIgJTIuMnhcbiIsIG1hcmtlcik7CisJIGJyZWFrOworICAgICAgfQorCisgICAgIHN0cmVhbSA9IG5leHRfY2h1bmNrOworICAgfQorCisgIGlmICghZGh0X21hcmtlcl9mb3VuZCkgeworICAgIHRyYWNlKCJObyBIdWZmbWFuIHRhYmxlIGxvYWRlZCwgdXNpbmcgdGhlIGRlZmF1bHQgb25lXG4iKTsKKyAgICBidWlsZF9kZWZhdWx0X2h1ZmZtYW5fdGFibGVzKHByaXYpOworICB9CisKKyNpZmRlZiBTQU5JVFlfQ0hFQ0sKKyAgaWYgKCAgIChwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLkhmYWN0b3IgPCBwcml2LT5jb21wb25lbnRfaW5mb3NbY0NiXS5IZmFjdG9yKQorICAgICAgfHwgKHByaXYtPmNvbXBvbmVudF9pbmZvc1tjWV0uSGZhY3RvciA8IHByaXYtPmNvbXBvbmVudF9pbmZvc1tjQ3JdLkhmYWN0b3IpKQorICAgIGVycm9yKCJIb3Jpem9udGFsIHNhbXBsaW5nIGZhY3RvciBmb3IgWSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIGhvcml0b250YWwgc2FtcGxpbmcgZmFjdG9yIGZvciBDYiBvciBDclxuIik7CisgIGlmICggICAocHJpdi0+Y29tcG9uZW50X2luZm9zW2NZXS5WZmFjdG9yIDwgcHJpdi0+Y29tcG9uZW50X2luZm9zW2NDYl0uVmZhY3RvcikKKyAgICAgIHx8IChwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLlZmYWN0b3IgPCBwcml2LT5jb21wb25lbnRfaW5mb3NbY0NyXS5WZmFjdG9yKSkKKyAgICBlcnJvcigiVmVydGljYWwgc2FtcGxpbmcgZmFjdG9yIGZvciBZIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdmVydGljYWwgc2FtcGxpbmcgZmFjdG9yIGZvciBDYiBvciBDclxuIik7CisgIGlmICggICAocHJpdi0+Y29tcG9uZW50X2luZm9zW2NDYl0uSGZhY3RvciE9MSkKKyAgICAgIHx8IChwcml2LT5jb21wb25lbnRfaW5mb3NbY0NyXS5IZmFjdG9yIT0xKQorICAgICAgfHwgKHByaXYtPmNvbXBvbmVudF9pbmZvc1tjQ2JdLlZmYWN0b3IhPTEpCisgICAgICB8fCAocHJpdi0+Y29tcG9uZW50X2luZm9zW2NDcl0uVmZhY3RvciE9MSkpCisgICAgZXJyb3IoIlNhbXBsaW5nIG90aGVyIHRoYW4gMXgxIGZvciBDciBhbmQgQ2IgaXMgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisKKyAgcmV0dXJuIDA7Citib2d1c19qcGVnX2Zvcm1hdDoKKyAgdHJhY2UoIkJvZ3VzIGpwZWcgZm9ybWF0XG4iKTsKKyAgcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZ1bmN0aW9ucyBleHBvcnRlZCBvZiB0aGUgbGlicmFyeS4KKyAqCisgKiBOb3RlOiBTb21lIGFwcGxpY2F0aW9ucyBjYW4gYWNjZXNzIGRpcmVjdGx5IHRvIGludGVybmFsIHBvaW50ZXIgb2YgdGhlCisgKiBzdHJ1Y3R1cmUuIEl0J3MgaXMgbm90IHJlY29tbWVuZGVkLCBidXQgaWYgeW91IGhhdmUgbWFueSBpbWFnZXMgdG8KKyAqIHVuY29tcHJlc3Mgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzLCBzb21lIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIHRvIHNwZWVkdXAKKyAqIHRoZSBkZWNvZGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEFsbG9jYXRlIGEgbmV3IHRpbnlqcGVnIGRlY29kZXIgb2JqZWN0LgorICoKKyAqIEJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBmdW5jdGlvbnMsIGFuIG9iamVjdCBuZWVkIHRvIGJlIGNhbGxlZC4KKyAqLworc3RydWN0IGpkZWNfcHJpdmF0ZSAqdGlueWpwZWdfaW5pdCh2b2lkKQoreworICBzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2OworCisgIHByaXYgPSAoc3RydWN0IGpkZWNfcHJpdmF0ZSAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGpkZWNfcHJpdmF0ZSkpOworICBpZiAocHJpdiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcHJpdjsKK30KKworLyoqCisgKiBGcmVlIGEgdGlueWpwZWcgb2JqZWN0LgorICoKKyAqIE5vIG90aGVycyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGFmdGVyIHRoaXMgb25lLgorICovCit2b2lkIHRpbnlqcGVnX2ZyZWUoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdikKK3sKKyAgaW50IGk7CisgIGZvciAoaT0wOyBpPENPTVBPTkVOVFM7IGkrKykgeworICAgICBpZiAocHJpdi0+Y29tcG9uZW50c1tpXSkKKyAgICAgICBmcmVlKHByaXYtPmNvbXBvbmVudHNbaV0pOworICAgICBwcml2LT5jb21wb25lbnRzW2ldID0gTlVMTDsKKyAgfQorICBmcmVlKHByaXYpOworfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIHRpbnlqcGVnIG9iamVjdCBhbmQgcHJlcGFyZSB0aGUgZGVjb2Rpbmcgb2YgdGhlIHN0cmVhbS4KKyAqCisgKiBDaGVjayBpZiB0aGUganBlZyBjYW4gYmUgZGVjb2RlZCB3aXRoIHRoaXMganBlZyBkZWNvZGVyLgorICogRmlsbCBzb21lIHRhYmxlIHVzZWQgZm9yIHByZXByb2Nlc3NpbmcuCisgKi8KK2ludCB0aW55anBlZ19wYXJzZV9oZWFkZXIoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgaW50IHJldDsKKworICAvKiBJZGVudGlmeSB0aGUgZmlsZSAqLworICBpZiAoKGJ1ZlswXSAhPSAweEZGKSB8fCAoYnVmWzFdICE9IFNPSSkpCisgICAgZXJyb3IoIk5vdCBhIEpQRyBmaWxlID9cbiIpOworCisgIHByaXYtPnN0cmVhbV9iZWdpbiA9IGJ1ZisyOworICBwcml2LT5zdHJlYW1fbGVuZ3RoID0gc2l6ZS0yOworICBwcml2LT5zdHJlYW1fZW5kID0gcHJpdi0+c3RyZWFtX2JlZ2luICsgcHJpdi0+c3RyZWFtX2xlbmd0aDsKKworICByZXQgPSBwYXJzZV9KRklGKHByaXYsIHByaXYtPnN0cmVhbV9iZWdpbik7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBEZWNvZGUgYW5kIGNvbnZlcnQgdGhlIGpwZWcgaW1hZ2UgaW50byBAcGl4Zm10QCBpbWFnZQorICoKKyAqIE5vdGU6IGNvbXBvbmVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbHkgYWxsb2NhdGVkIGlmIG5vIG1lbW9yeSBpcyBhdHRhY2hlZC4KKyAqLworaW50IHRpbnlqcGVnX2RlY29kZShzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LAorCQkgICAgY29uc3Qgc3RydWN0IHRpbnlqcGVnX2NvbG9yc3BhY2UgKnBpeGZtdCkKK3sKKyAgaW50IHgsIHksIHN4LCBzeTsKKyAgaW50IHhzaGlmdF9ieV9tY3UsIHlzaGlmdF9ieV9tY3U7CisgIGludCB4c3RyaWRlX2J5X21jdSwgeXN0cmlkZV9ieV9tY3U7CisgIHVuc2lnbmVkIGludCBieXRlc19wZXJfYmxvY2tsaW5lc1szXSwgYnl0ZXNfcGVyX21jdVszXTsKKyAgZGVjb2RlX01DVV9mY3QgZGVjb2RlX01DVTsKKyAgY29uc3QgZGVjb2RlX01DVV9mY3QgKmRlY29kZV9tY3VfdGFibGU7CisgIGNvbnZlcnRfY29sb3JzcGFjZV9mY3QgY29udmVydF90b19waXhmbXQ7CisgIHVpbnQ4X3QgKnBwdHJbM107CisKKyAgZGVjb2RlX21jdV90YWJsZSA9IHBpeGZtdC0+ZGVjb2RlX21jdV90YWJsZTsKKworICAvKiBGaXg6IGNoZWNrIHJldHVybiB2YWx1ZSAqLworICBwaXhmbXQtPmluaXRpYWxpemUocHJpdiwgYnl0ZXNfcGVyX2Jsb2NrbGluZXMsIGJ5dGVzX3Blcl9tY3UpOworCisgIHhzaGlmdF9ieV9tY3UgPSB5c2hpZnRfYnlfbWN1ID0gMzsKKyAgaWYgKChwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLkhmYWN0b3IgfCBwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLlZmYWN0b3IpID09IDEpIHsKKyAgICAgZGVjb2RlX01DVSA9IGRlY29kZV9tY3VfdGFibGVbMF07CisgICAgIGNvbnZlcnRfdG9fcGl4Zm10ID0gcGl4Zm10LT5jb252ZXJ0X2NvbG9yc3BhY2VbMF07CisgICAgIHRyYWNlKCJVc2UgZGVjb2RlIDF4MSBzYW1wbGluZ1xuIik7CisgIH0gZWxzZSBpZiAocHJpdi0+Y29tcG9uZW50X2luZm9zW2NZXS5IZmFjdG9yID09IDEpIHsKKyAgICAgZGVjb2RlX01DVSA9IGRlY29kZV9tY3VfdGFibGVbMV07CisgICAgIGNvbnZlcnRfdG9fcGl4Zm10ID0gcGl4Zm10LT5jb252ZXJ0X2NvbG9yc3BhY2VbMV07CisgICAgIHlzaGlmdF9ieV9tY3UgPSA0OworICAgICB0cmFjZSgiVXNlIGRlY29kZSAxeDIgc2FtcGxpbmcgKG5vdCBzdXBwb3J0ZWQpXG4iKTsKKyAgfSBlbHNlIGlmIChwcml2LT5jb21wb25lbnRfaW5mb3NbY1ldLlZmYWN0b3IgPT0gMikgeworICAgICBkZWNvZGVfTUNVID0gZGVjb2RlX21jdV90YWJsZVszXTsKKyAgICAgY29udmVydF90b19waXhmbXQgPSBwaXhmbXQtPmNvbnZlcnRfY29sb3JzcGFjZVszXTsKKyAgICAgeHNoaWZ0X2J5X21jdSA9IDQ7CisgICAgIHlzaGlmdF9ieV9tY3UgPSA0OworICAgICB0cmFjZSgiVXNlIGRlY29kZSAyeDIgc2FtcGxpbmdcbiIpOworICB9IGVsc2UgeworICAgICBkZWNvZGVfTUNVID0gZGVjb2RlX21jdV90YWJsZVsyXTsKKyAgICAgY29udmVydF90b19waXhmbXQgPSBwaXhmbXQtPmNvbnZlcnRfY29sb3JzcGFjZVsyXTsKKyAgICAgeHNoaWZ0X2J5X21jdSA9IDQ7CisgICAgIHRyYWNlKCJVc2UgZGVjb2RlIDJ4MSBzYW1wbGluZ1xuIik7CisgIH0KKworICByZXN5bmMocHJpdik7CisKKyAgLyogRG9uJ3QgZm9yZ2V0IHRvIHRoYXQgYmxvY2sgY2FuIGJlIGVpdGhlciA4IG9yIDE2IGxpbmVzICovCisgIGJ5dGVzX3Blcl9ibG9ja2xpbmVzWzBdIDw8PSB5c2hpZnRfYnlfbWN1LTM7CisgIGJ5dGVzX3Blcl9ibG9ja2xpbmVzWzFdIDw8PSB5c2hpZnRfYnlfbWN1LTM7CisgIGJ5dGVzX3Blcl9ibG9ja2xpbmVzWzJdIDw8PSB5c2hpZnRfYnlfbWN1LTM7CisKKyAgYnl0ZXNfcGVyX21jdVswXSA8PD0geHNoaWZ0X2J5X21jdS0zOworICBieXRlc19wZXJfbWN1WzFdIDw8PSB4c2hpZnRfYnlfbWN1LTM7CisgIGJ5dGVzX3Blcl9tY3VbMl0gPDw9IHhzaGlmdF9ieV9tY3UtMzsKKworICB4c3RyaWRlX2J5X21jdSA9IDEgPDwgeHNoaWZ0X2J5X21jdTsKKyAgeXN0cmlkZV9ieV9tY3UgPSAxIDw8IHlzaGlmdF9ieV9tY3U7CisKKyAgcHB0clswXSA9IHByaXYtPmNvbXBvbmVudHNbMF07CisgIHBwdHJbMV0gPSBwcml2LT5jb21wb25lbnRzWzFdOworICBwcHRyWzJdID0gcHJpdi0+Y29tcG9uZW50c1syXTsKKworICB0cmFjZSgiYnBibCA9ICVkLCBicG1jdSA9ICVkXG4iLAorCWJ5dGVzX3Blcl9ibG9ja2xpbmVzWzBdLCBieXRlc19wZXJfbWN1WzBdKTsKKworICBmb3IgKHkgPSBwcml2LT5oZWlnaHQ7IHkgPiAwOyB5IC09IHlzdHJpZGVfYnlfbWN1KQorICAgeworICAgICB0cmFjZSgiRGVjb2Rpbmcgcm93ICVkXG4iLCBwcml2LT5oZWlnaHQteSk7CisgICAgIHByaXYtPnBsYW5lWzBdID0gcHB0clswXTsgIHBwdHJbMF0gKz0gYnl0ZXNfcGVyX2Jsb2NrbGluZXNbMF07CisgICAgIHByaXYtPnBsYW5lWzFdID0gcHB0clsxXTsgIHBwdHJbMV0gKz0gYnl0ZXNfcGVyX2Jsb2NrbGluZXNbMV07CisgICAgIHByaXYtPnBsYW5lWzJdID0gcHB0clsyXTsgIHBwdHJbMl0gKz0gYnl0ZXNfcGVyX2Jsb2NrbGluZXNbMl07CisKKyAgICAgc3kgPSBtaW4oeSwgeXN0cmlkZV9ieV9tY3UpOworCisgICAgIGZvciAoeCA9IHByaXYtPndpZHRoOyB4ID4gMDsgeCAtPSB4c3RyaWRlX2J5X21jdSkKKyAgICAgIHsKKwlzeCA9IG1pbih4LCB4c3RyaWRlX2J5X21jdSk7CisJdHJhY2UoIkJsb2NrIHNpemU6ICVkeCVkXG4iLCBzeCwgc3kpOworCisJZGVjb2RlX01DVShwcml2KTsKKwljb252ZXJ0X3RvX3BpeGZtdChwcml2LCBzeCwgc3kpOworCXByaXYtPnBsYW5lWzBdICs9IGJ5dGVzX3Blcl9tY3VbMF07CisJcHJpdi0+cGxhbmVbMV0gKz0gYnl0ZXNfcGVyX21jdVsxXTsKKwlwcml2LT5wbGFuZVsyXSArPSBieXRlc19wZXJfbWN1WzJdOworCWlmIChwcml2LT5yZXN0YXJ0c190b19nbz4wKQorCSB7CisJICAgcHJpdi0+cmVzdGFydHNfdG9fZ28tLTsKKwkgICBpZiAocHJpdi0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKwkgICAgeworCSAgICAgIHByaXYtPnN0cmVhbSAtPSAocHJpdi0+bmJpdHNfaW5fcmVzZXJ2b2lyLzgpOworCSAgICAgIHJlc3luYyhwcml2KTsKKwkgICAgICBpZiAoZmluZF9uZXh0X3JzdF9tYXJrZXIocHJpdikgPCAwKQorCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgfQorICAgICAgfQorICAgfQorCisgIHRyYWNlKCJJbnB1dCBmaWxlIHNpemU6ICVkXG4iLCBwcml2LT5zdHJlYW1fbGVuZ3RoKzIpOworICB0cmFjZSgiSW5wdXQgYnl0ZXMgYWN0dWFsbHkgcmVhZDogJWRcbiIsIHByaXYtPnN0cmVhbSAtIHByaXYtPnN0cmVhbV9iZWdpbiArIDIpOworCisgIHJldHVybiAwOworfQorCitjb25zdCBjaGFyICp0aW55anBlZ19nZXRfZXJyb3JzdHJpbmcoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdikKK3sKKyAgLyogRklYTUU6IHRoZSBlcnJvciBzdHJpbmcgbXVzdCBiZSBzdG9yZSBpbiB0aGUgY29udGV4dCAqLworICBwcml2ID0gcHJpdjsKKyAgcmV0dXJuIGVycm9yX3N0cmluZzsKK30KKwordm9pZCB0aW55anBlZ19nZXRfc2l6ZShzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCB1bnNpZ25lZCBpbnQgKndpZHRoLCB1bnNpZ25lZCBpbnQgKmhlaWdodCkKK3sKKyAgKndpZHRoID0gcHJpdi0+d2lkdGg7CisgICpoZWlnaHQgPSBwcml2LT5oZWlnaHQ7Cit9CisKK2ludCB0aW55anBlZ19nZXRfY29tcG9uZW50cyhzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCB1bnNpZ25lZCBjaGFyICoqY29tcG9uZW50cywgdW5zaWduZWQgaW50IG5jb21wb25lbnRzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKyAgaWYgKG5jb21wb25lbnRzID4gQ09NUE9ORU5UUykKKyAgICBuY29tcG9uZW50cyA9IENPTVBPTkVOVFM7CisgIGZvciAoaT0wOyBpPG5jb21wb25lbnRzOyBpKyspCisgICAgY29tcG9uZW50c1tpXSA9IHByaXYtPmNvbXBvbmVudHNbaV07CisgIHJldHVybiAwOworfQorCitpbnQgdGlueWpwZWdfc2V0X2NvbXBvbmVudHMoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgY2hhciAqIGNvbnN0ICpjb21wb25lbnRzLCB1bnNpZ25lZCBpbnQgbmNvbXBvbmVudHMpCit7CisgIHVuc2lnbmVkIGludCBpOworICBpZiAobmNvbXBvbmVudHMgPiBDT01QT05FTlRTKQorICAgIG5jb21wb25lbnRzID0gQ09NUE9ORU5UUzsKKyAgZm9yIChpPTA7IGk8bmNvbXBvbmVudHM7IGkrKykKKyAgICBwcml2LT5jb21wb25lbnRzW2ldID0gY29tcG9uZW50c1tpXTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCB0aW55anBlZ19nZXRfYnl0ZXNfcGVyX3JvdyhzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqYnl0ZXMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG5jb21wb25lbnRzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKyAgaWYgKG5jb21wb25lbnRzID4gQ09NUE9ORU5UUykKKyAgICBuY29tcG9uZW50cyA9IENPTVBPTkVOVFM7CisgIGZvciAoaT0wOyBpPG5jb21wb25lbnRzOyBpKyspCisgICAgYnl0ZXNbaV0gPSBwcml2LT5ieXRlc19wZXJfcm93W2ldOworICByZXR1cm4gMDsKK30KKworaW50IHRpbnlqcGVnX3NldF9ieXRlc19wZXJfcm93KHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpieXRlcywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbmNvbXBvbmVudHMpCit7CisgIHVuc2lnbmVkIGludCBpOworICBpZiAobmNvbXBvbmVudHMgPiBDT01QT05FTlRTKQorICAgIG5jb21wb25lbnRzID0gQ09NUE9ORU5UUzsKKyAgZm9yIChpPTA7IGk8bmNvbXBvbmVudHM7IGkrKykKKyAgICBwcml2LT5ieXRlc19wZXJfcm93W2ldID0gYnl0ZXNbaV07CisgIHJldHVybiAwOworfQorCitpbnQgdGlueWpwZWdfc2V0X2ZsYWdzKHN0cnVjdCBqZGVjX3ByaXZhdGUgKnByaXYsIGludCBmbGFncykKK3sKKyAgaW50IG9sZGZsYWdzID0gcHJpdi0+ZmxhZ3M7CisgIHByaXYtPmZsYWdzID0gZmxhZ3M7CisgIHJldHVybiBvbGRmbGFnczsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9qcGVnL3l1djQyMHAuYyBiL2NvbTMyL2xpYi9qcGVnL3l1djQyMHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTEyMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2pwZWcveXV2NDIwcC5jCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogU21hbGwganBlZyBkZWNvZGVyIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIEx1YyBTYWlsbGFyZCA8bHVjQHNhaWxsYXJkLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyAqICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qCisgKiB5dXY0MjBwLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInRpbnlqcGVnLmgiCisjaW5jbHVkZSAidGlueWpwZWctaW50ZXJuYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZQorICoKKyAqCisgKiBOb3RlOgorICogWUNiQ3IgaXMgZGVmaW5lZCBwZXIgQ0NJUiA2MDEtMSwgZXhjZXB0IHRoYXQgQ2IgYW5kIENyIGFyZQorICogbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSByYXRoZXIgdGhhbiAtMC41IC4uIDAuNS4KKyAqIFRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcmUgdGhlcmVmb3JlCisgKiAgICAgIFIgPSBZICAgICAgICAgICAgICAgICsgMS40MDIwMCAqIENyCisgKiAgICAgIEcgPSBZIC0gMC4zNDQxNCAqIENiIC0gMC43MTQxNCAqIENyCisgKiAgICAgIEIgPSBZICsgMS43NzIwMCAqIENiCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogIFlDckNiIC0+IFlVVjQyMFAgKDF4MSkKKyAqICAuLS0tLgorICogIHwgMSB8CisgKiAgYC0tLScKKyAqLworc3RhdGljIHZvaWQgWUNyQ0JfdG9fWVVWNDIwUF8xeDEoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgaW50IHN4LCBpbnQgc3kpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsICp5OworICB1bnNpZ25lZCBjaGFyICpwOworICBpbnQgaSxqOworCisgIHAgPSBwcml2LT5wbGFuZVswXTsKKyAgeSA9IHByaXYtPlk7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaS0tKQorICAgeworICAgICBtZW1jcHkocCwgeSwgc3gpOworICAgICBwICs9IHByaXYtPmJ5dGVzX3Blcl9yb3dbMF07CisgICAgIHkgKz0gODsKKyAgIH0KKworICBwID0gcHJpdi0+cGxhbmVbMV07CisgIHMgPSBwcml2LT5DYjsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpLS0pCisgICB7CisgICAgIGZvciAoaiA9IHN4OyBqID49IDA7IGogLT0gMikgeworICAgICAgICpwKysgPSAqczsKKyAgICAgICBzICs9IDI7CisgICAgIH0KKyAgICAgcyArPSA4OyAvKiBTa2lwIG9uZSBsaW5lICovCisgICAgIHAgKz0gcHJpdi0+Ynl0ZXNfcGVyX3Jvd1sxXSAtIDQ7CisgICB9CisKKyAgcCA9IHByaXYtPnBsYW5lWzJdOworICBzID0gcHJpdi0+Q3I7CisgIGZvciAoaT0wOyBpPDg7IGkrPTIpCisgICB7CisgICAgIGZvciAoaiA9IHN4OyBqID49IDA7IGogLT0gMikgeworICAgICAgICpwKysgPSAqczsKKyAgICAgICBzICs9IDI7CisgICAgIH0KKyAgICAgcyArPSA4OyAvKiBTa2lwIG9uZSBsaW5lICovCisgICAgIHAgKz0gcHJpdi0+Ynl0ZXNfcGVyX3Jvd1syXSAtIDQ7CisgICB9Cit9CisKKy8qKgorICogIFlDckNiIC0+IFlVVjQyMFAgKDJ4MSkKKyAqICAuLS0tLS0tLS4KKyAqICB8IDEgfCAyIHwKKyAqICBgLS0tLS0tLScKKyAqLworc3RhdGljIHZvaWQgWUNyQ0JfdG9fWVVWNDIwUF8yeDEoc3RydWN0IGpkZWNfcHJpdmF0ZSAqcHJpdiwgaW50IHN4LCBpbnQgc3kpCit7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsICp5MTsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgcCA9IHByaXYtPnBsYW5lWzBdOworICB5MSA9IHByaXYtPlk7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaS0tKQorICAgeworICAgICBtZW1jcHkocCwgeTEsIHN4KTsKKyAgICAgcCArPSBwcml2LT5ieXRlc19wZXJfcm93WzBdOworICAgICB5MSArPSAxNjsKKyAgIH0KKworICBzeCA9IChzeCsxKSA+PiAxOworCisgIHAgPSBwcml2LT5wbGFuZVsxXTsKKyAgcyA9IHByaXYtPkNiOworICBmb3IgKGkgPSBzeTsgaSA+IDA7IGkgLT0gMikKKyAgIHsKKyAgICAgbWVtY3B5KHAsIHMsIHN4KTsKKyAgICAgcyArPSAxNjsgLyogU2tpcCBvbmUgbGluZSAqLworICAgICBwICs9IHByaXYtPmJ5dGVzX3Blcl9yb3dbMV07CisgICB9CisKKyAgcCA9IHByaXYtPnBsYW5lWzJdOworICBzID0gcHJpdi0+Q3I7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaSAtPSAyKQorICAgeworICAgICBtZW1jcHkocCwgcywgc3gpOworICAgICBzICs9IDE2OyAvKiBTa2lwIG9uZSBsaW5lICovCisgICAgIHAgKz0gcHJpdi0+Ynl0ZXNfcGVyX3Jvd1syXTsKKyAgIH0KK30KKworCisvKioKKyAqICBZQ3JDYiAtPiBZVVY0MjBQICgxeDIpCisgKiAgLi0tLS4KKyAqICB8IDEgfAorICogIHwtLS18CisgKiAgfCAyIHwKKyAqICBgLS0tJworICovCitzdGF0aWMgdm9pZCBZQ3JDQl90b19ZVVY0MjBQXzF4MihzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBpbnQgc3gsIGludCBzeSkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcywgKnk7CisgIHVuc2lnbmVkIGNoYXIgKnAsICpwcjsKKyAgaW50IGksajsKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIHkgPSBwcml2LT5ZOworICBmb3IgKGkgPSBzeTsgaSA+IDA7IGkrKykKKyAgIHsKKyAgICAgbWVtY3B5KHAsIHksIHN4KTsKKyAgICAgcCs9cHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXTsKKyAgICAgeSs9ODsKKyAgIH0KKworICBwciA9IHByaXYtPnBsYW5lWzFdOworICBzID0gcHJpdi0+Q2I7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaSAtPSAyKQorICAgeworICAgICBwID0gcHI7CisgICAgIGZvciAoaiA9IHN4OyBqID4gMDsgaiAtPSAyKSB7CisgICAgICAgKnArKyA9ICpzOworICAgICAgIHMgKz0gMjsKKyAgICAgfQorICAgICBwciArPSBwcml2LT5ieXRlc19wZXJfcm93WzFdOworICAgfQorCisgIHByID0gcHJpdi0+cGxhbmVbMl07CisgIHMgPSBwcml2LT5DcjsKKyAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgeworICAgICBwID0gcHI7CisgICAgIGZvciAoaiA9IHN4OyBqID4gMDsgaiAtPSAyKSB7CisgICAgICAgKnArKyA9ICpzOworICAgICAgIHMgKz0gMjsKKyAgICAgfQorICAgICBwciArPSBwcml2LT5ieXRlc19wZXJfcm93WzJdIC0gNDsKKyAgIH0KK30KKworLyoqCisgKiAgWUNyQ2IgLT4gWVVWNDIwUCAoMngyKQorICogIC4tLS0tLS0tLgorICogIHwgMSB8IDIgfAorICogIHwtLS0rLS0tfAorICogIHwgMyB8IDQgfAorICogIGAtLS0tLS0tJworICovCitzdGF0aWMgdm9pZCBZQ3JDQl90b19ZVVY0MjBQXzJ4MihzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LCBpbnQgc3gsIGludCBzeSkKK3sKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcywgKnkxOworICB1bnNpZ25lZCBpbnQgaTsKKworICBwID0gcHJpdi0+cGxhbmVbMF07CisgIHkxID0gcHJpdi0+WTsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpLS0pCisgICB7CisgICAgIG1lbWNweShwLCB5MSwgc3gpOworICAgICBwICs9IHByaXYtPmJ5dGVzX3Blcl9yb3dbMF07CisgICAgIHkxICs9IDE2OworICAgfQorCisgIHN4ID0gKHN4KzEpID4+IDE7CisKKyAgcCA9IHByaXYtPnBsYW5lWzFdOworICBzID0gcHJpdi0+Q2I7CisgIGZvciAoaSA9IHN5OyBpID4gMDsgaSAtPSAyKQorICAgeworICAgICBtZW1jcHkocCwgcywgc3gpOworICAgICBzICs9IDg7CisgICAgIHAgKz0gcHJpdi0+Ynl0ZXNfcGVyX3Jvd1sxXTsKKyAgIH0KKworICBwID0gcHJpdi0+cGxhbmVbMl07CisgIHMgPSBwcml2LT5DcjsKKyAgZm9yIChpID0gc3k7IGkgPiAwOyBpIC09IDIpCisgICB7CisgICAgIG1lbWNweShwLCBzLCBzeCk7CisgICAgIHMgKz0gODsKKyAgICAgcCArPSBwcml2LT5ieXRlc19wZXJfcm93WzJdOworICAgfQorfQorCitzdGF0aWMgaW50IGluaXRpYWxpemVfeXV2NDIwcChzdHJ1Y3QgamRlY19wcml2YXRlICpwcml2LAorCQkJICAgICAgdW5zaWduZWQgaW50ICpieXRlc19wZXJfYmxvY2tsaW5lcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcGVyX21jdSkKK3sKKyAgaW50IGhhbGZfaGVpZ2h0ID0gKHByaXYtPmhlaWdodCArIDEpID4+IDI7CisgIGludCBoYWxmX3dpZHRoICA9IChwcml2LT53aWR0aCAgKyAxKSA+PiAyOworCisgIGlmICghcHJpdi0+Ynl0ZXNfcGVyX3Jvd1swXSkKKyAgICBwcml2LT5ieXRlc19wZXJfcm93WzBdID0gcHJpdi0+d2lkdGg7CisgIGlmICghcHJpdi0+Y29tcG9uZW50c1swXSkKKyAgICBwcml2LT5jb21wb25lbnRzWzBdID0gbWFsbG9jKHByaXYtPmhlaWdodCAqIHByaXYtPmJ5dGVzX3Blcl9yb3dbMF0pOworCisgIGlmICghcHJpdi0+Ynl0ZXNfcGVyX3Jvd1sxXSkKKyAgICBwcml2LT5ieXRlc19wZXJfcm93WzFdID0gaGFsZl93aWR0aDsKKyAgaWYgKCFwcml2LT5jb21wb25lbnRzWzFdKQorICAgIHByaXYtPmNvbXBvbmVudHNbMV0gPSBtYWxsb2MoaGFsZl9oZWlnaHQgKiBwcml2LT5ieXRlc19wZXJfcm93WzFdKTsKKworICBpZiAoIXByaXYtPmJ5dGVzX3Blcl9yb3dbMl0pCisgICAgcHJpdi0+Ynl0ZXNfcGVyX3Jvd1syXSA9IGhhbGZfd2lkdGg7CisgIGlmICghcHJpdi0+Y29tcG9uZW50c1syXSkKKyAgICBwcml2LT5jb21wb25lbnRzWzJdID0gbWFsbG9jKGhhbGZfaGVpZ2h0ICogcHJpdi0+Ynl0ZXNfcGVyX3Jvd1syXSk7CisKKyAgYnl0ZXNfcGVyX21jdVswXSA9IDg7CisgIGJ5dGVzX3Blcl9tY3VbMV0gPSA0OworICBieXRlc19wZXJfbWN1WzJdID0gNDsKKworICBieXRlc19wZXJfYmxvY2tsaW5lc1swXSA9IHByaXYtPndpZHRoIDw8IDM7CisgIGJ5dGVzX3Blcl9ibG9ja2xpbmVzWzFdID0gaGFsZl93aWR0aCA8PCAyOworICBieXRlc19wZXJfYmxvY2tsaW5lc1syXSA9IGhhbGZfd2lkdGggPDwgMjsKKworICAvKiBSZXR1cm4gbm9uemVybyBvbiBmYWlsdXJlICovCisgIHJldHVybiAhcHJpdi0+Y29tcG9uZW50c1swXSB8fCAhcHJpdi0+Y29tcG9uZW50c1sxXSB8fCAhcHJpdi0+Y29tcG9uZW50c1syXTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0aW55anBlZ19jb2xvcnNwYWNlIGZvcm1hdF95dXY0MjBwID0KKyAgeworICAgIHsKKyAgICAgIFlDckNCX3RvX1lVVjQyMFBfMXgxLAorICAgICAgWUNyQ0JfdG9fWVVWNDIwUF8xeDIsCisgICAgICBZQ3JDQl90b19ZVVY0MjBQXzJ4MSwKKyAgICAgIFlDckNCX3RvX1lVVjQyMFBfMngyLAorICAgIH0sCisgICAgdGlueWpwZWdfZGVjb2RlX21jdV8zY29tcF90YWJsZSwKKyAgICBpbml0aWFsaXplX3l1djQyMHAKKyAgfTsKKworY29uc3QgdGlueWpwZWdfY29sb3JzcGFjZV90IFRJTllKUEVHX0ZNVF9ZVVY0MjBQID0gJmZvcm1hdF95dXY0MjBwOwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYmdjYy9fX2FzaGxkaTMuUyBiL2NvbTMyL2xpYi9saWJnY2MvX19hc2hsZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjYzExYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJnY2MvX19hc2hsZGkzLlMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX19hc2hsZGkzLlMKKyAqCisgKiA2NC1iaXQgc2hsCisgKi8KKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIF9fYXNobGRpMworCS50eXBlIF9fYXNobGRpMyxAZnVuY3Rpb24KK19fYXNobGRpMzoKKyNpZm5kZWYgUkVHUEFSTQorCW1vdmwgIDQoJWVzcCksJWVheAorCW1vdmwgIDgoJWVzcCksJWVkeAorCW1vdmIgIDEyKCVlc3ApLCVjbAorI2VuZGlmCisJY21wYiAgJDMyLCVjbAorCWphZSAgIDFmCisKKwlzaGxkbCAlY2wsJWVheCwlZWR4CisJc2hsICAgJWNsLCVlYXgKKwlyZXQKKworMToKKwl4b3JsICAlZWR4LCVlZHgKKwlzaGwgICAlY2wsJWVheAorCXhjaGdsICVlZHgsJWVheAorCXJldAorCisJLnNpemUgX19hc2hsZGkzLC4tX19hc2hsZGkzCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGliZ2NjL19fYXNocmRpMy5TIGIvY29tMzIvbGliL2xpYmdjYy9fX2FzaHJkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjljNTIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYmdjYy9fX2FzaHJkaTMuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX2FzaHJkaTMuUworICoKKyAqIDY0LWJpdCBzYXIKKyAqLworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgX19hc2hyZGkzCisJLnR5cGUgX19hc2hyZGkzLEBmdW5jdGlvbgorX19hc2hyZGkzOgorI2lmbmRlZiBSRUdQQVJNCisJbW92bCAgNCglZXNwKSwlZWF4CisJbW92bCAgOCglZXNwKSwlZWR4CisJbW92YiAgMTIoJWVzcCksJWNsCisjZW5kaWYKKwljbXBiICAkMzIsJWNsCisJamFlICAgMWYKKworCXNocmRsICVjbCwlZWR4LCVlYXgKKwlzYXJsICAlY2wsJWVkeAorCXJldAorCisxOgorCXNhcmwgICVjbCwlZWR4CisJbW92bCAgJWVkeCwlZWF4CisJY2RxCisJcmV0CisKKwkuc2l6ZSBfX2FzaHJkaTMsLi1fX2FzaHJkaTMKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9saWJnY2MvX19kaXZkaTMuYyBiL2NvbTMyL2xpYi9saWJnY2MvX19kaXZkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2M3Nzk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYmdjYy9fX2RpdmRpMy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBhcmNoL2kzODYvbGliZ2NjL19fZGl2ZGkzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiB1aW50NjRfdCBfX3VkaXZtb2RkaTQodWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4sIHVpbnQ2NF90ICogcmVtKTsKKworaW50NjRfdCBfX2RpdmRpMyhpbnQ2NF90IG51bSwgaW50NjRfdCBkZW4pCit7CisgICAgaW50IG1pbnVzID0gMDsKKyAgICBpbnQ2NF90IHY7CisKKyAgICBpZiAobnVtIDwgMCkgeworCW51bSA9IC1udW07CisJbWludXMgPSAxOworICAgIH0KKyAgICBpZiAoZGVuIDwgMCkgeworCWRlbiA9IC1kZW47CisJbWludXMgXj0gMTsKKyAgICB9CisKKyAgICB2ID0gX191ZGl2bW9kZGk0KG51bSwgZGVuLCBOVUxMKTsKKyAgICBpZiAobWludXMpCisJdiA9IC12OworCisgICAgcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGliZ2NjL19fbHNocmRpMy5TIGIvY29tMzIvbGliL2xpYmdjYy9fX2xzaHJkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWUzYWFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYmdjYy9fX2xzaHJkaTMuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX2xzaHJkaTMuUworICoKKyAqIDY0LWJpdCBzaHIKKyAqLworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgX19sc2hyZGkzCisJLnR5cGUgX19sc2hyZGkzLEBmdW5jdGlvbgorX19sc2hyZGkzOgorI2lmbmRlZiBSRUdQQVJNCisJbW92bCAgNCglZXNwKSwlZWF4CisJbW92bCAgOCglZXNwKSwlZWR4CisJbW92YiAgMTIoJWVzcCksJWNsCisjZW5kaWYKKwljbXBiICAkMzIsJWNsCisJamFlICAgMWYKKworCXNocmRsICVjbCwlZWR4LCVlYXgKKwlzaHJsICAlY2wsJWVkeAorCXJldAorCisxOgorCXNocmwgICVjbCwlZWR4CisJeG9ybCAgJWVheCwlZWF4CisJeGNoZ2wgJWVkeCwlZWF4CisJcmV0CisKKwkuc2l6ZSBfX2xzaHJkaTMsLi1fX2xzaHJkaTMKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9saWJnY2MvX19tb2RkaTMuYyBiL2NvbTMyL2xpYi9saWJnY2MvX19tb2RkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM1NTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYmdjYy9fX21vZGRpMy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBhcmNoL2kzODYvbGliZ2NjL19fbW9kZGkzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiB1aW50NjRfdCBfX3VkaXZtb2RkaTQodWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4sIHVpbnQ2NF90ICogcmVtKTsKKworaW50NjRfdCBfX21vZGRpMyhpbnQ2NF90IG51bSwgaW50NjRfdCBkZW4pCit7CisgICAgaW50IG1pbnVzID0gMDsKKyAgICBpbnQ2NF90IHY7CisKKyAgICBpZiAobnVtIDwgMCkgeworCW51bSA9IC1udW07CisJbWludXMgPSAxOworICAgIH0KKyAgICBpZiAoZGVuIDwgMCkgeworCWRlbiA9IC1kZW47CisJbWludXMgXj0gMTsKKyAgICB9CisKKyAgICAodm9pZClfX3VkaXZtb2RkaTQobnVtLCBkZW4sICh1aW50NjRfdCAqKSZ2KTsKKyAgICBpZiAobWludXMpCisJdiA9IC12OworCisgICAgcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGliZ2NjL19fbXVsZGkzLlMgYi9jb20zMi9saWIvbGliZ2NjL19fbXVsZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0Nzg3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJnY2MvX19tdWxkaTMuUwpAQCAtMCwwICsxLDgzIEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX211bGRpMy5TCisgKgorICogNjQqNjQgPSA2NCBiaXQgdW5zaWduZWQgbXVsdGlwbGljYXRpb24KKyAqLworCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBfX211bGRpMworCS50eXBlIF9fbXVsZGkzLEBmdW5jdGlvbgorX19tdWxkaTM6CisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKwkvKiBpMzg2ICovCisJcHVzaCAgJWVzaQorI2lmbmRlZiBSRUdQQVJNCisJbW92bCAgOCglZXNwKSwlZWF4CisJbW92bCAgJWVheCwlZXNpCisJbW92bCAgMTYoJWVzcCksJWVjeAorCW11bGwgICVlY3gKKwlpbXVsbCAxMiglZXNwKSwlZWN4CisJaW11bGwgMjAoJWVzcCksJWVzaQorCWFkZGwgICVlY3gsJWVkeAorCWFkZGwgICVlc2ksJWVkeAorI2Vsc2UKKwltb3ZsICAlZWF4LCVlc2kKKwlwdXNoICAlZWR4CisJbXVsbCAgJWVjeAorCWltdWxsIDgoJWVzcCksJWVzaQorCWFkZGwgICVlc2ksJWVkeAorCXBvcCAgICVlc2kKKwlpbXVsbCAlZXNpLCVlY3gKKwlhZGRsICAlZWN4LCVlZHgKKyNlbmRpZgorCXBvcCAgICVlc2kKKwlyZXQKKyNlbGlmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA4CisJLyogeDg2XzY0ICovCisJcHVzaCAgJXJzaQorI2lmbmRlZiBSRUdQQVJNCisvKgorCW1vdmwgIDgoJWVzcCksJWVheAorCW1vdmwgJWVheCwlZXNpCisJbW92bCAgMTYoJWVzcCksJWVjeAorCW11bGwgICVlY3gKKwlpbXVsbCAxMiglZXNwKSwlZWN4CisJaW11bGwgMjAoJWVzcCksJWVzaQorCWFkZGwgICVlY3gsJWVkeAorCWFkZGwgICVlc2ksJWVkeAorKi8KKwltb3ZxICA4KCVyc3ApLCVyYXgKKwltb3ZxICVyYXgsJXJzaQorCW1vdnEgIDE2KCVyc3ApLCVyY3gKKwltdWxxICAlcmN4CisJaW11bHEgMTIoJXJzcCksJXJjeAorCWltdWxxIDIwKCVyc3ApLCVyc2kKKwlhZGRxICAlcmN4LCVyZHgKKwlhZGRxICAlcnNpLCVyZHgKKyNlbHNlCisvKgorCW1vdmwgICVlYXgsJWVzaQorCXB1c2ggICVlZHgKKwltdWxsICAlZWN4CisJaW11bGwgOCglZXNwKSwlZXNpCisJYWRkbCAgJWVzaSwlZWR4CisJcG9wICAgJXJzaQorCWltdWxsICVlc2ksJWVjeAorCWFkZGwgICVlY3gsJWVkeAorKi8KKwltb3ZxICAlcmF4LCVyc2kKKwlwdXNocSAgJXJkeAorCW11bHEgICVyY3gKKwlpbXVscSA4KCVyc3ApLCVyc2kKKwlhZGRxICAlcnNpLCVyZHgKKwlwb3BxICAlcnNpCisJaW11bHEgJXJzaSwlcmN4CisJYWRkcSAgJXJjeCwlcmR4CisjZW5kaWYKKwlwb3AgICAlcnNpCisJcmV0CisjZWxzZQorI2Vycm9yICJVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgZm9yIF9fbXVsZGkzLlMiCisjZW5kaWYKKwkuc2l6ZSBfX211bGRpMywuLV9fbXVsZGkzCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGliZ2NjL19fbmVnZGkyLlMgYi9jb20zMi9saWIvbGliZ2NjL19fbmVnZGkyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiMGQyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJnY2MvX19uZWdkaTIuUwpAQCAtMCwwICsxLDIxIEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX25lZ2RpMi5TCisgKgorICogNjQtYml0IG5lZ2F0aW9uCisgKi8KKworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgX19uZWdkaTIKKwkudHlwZSBfX25lZ2RpMixAZnVuY3Rpb24KK19fbmVnZGkyOgorI2lmbmRlZiBSRUdQQVJNCisJbW92bCA0KCVlc3ApLCVlYXgKKwltb3ZsIDgoJWVzcCksJWVkeAorI2VuZGlmCisJbmVnbCAlZWR4CisJbmVnbCAlZWF4CisJc2JibCAkMCwlZWR4CisJcmV0CisKKwkuc2l6ZSBfX25lZ2RpMiwuLV9fbmVnZGkyCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGliZ2NjL19fdWRpdmRpMy5jIGIvY29tMzIvbGliL2xpYmdjYy9fX3VkaXZkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjViMzU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYmdjYy9fX3VkaXZkaTMuYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX2RpdmRpMy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitleHRlcm4gdWludDY0X3QgX191ZGl2bW9kZGk0KHVpbnQ2NF90IG51bSwgdWludDY0X3QgZGVuLCB1aW50NjRfdCAqIHJlbSk7CisKK3VpbnQ2NF90IF9fdWRpdmRpMyh1aW50NjRfdCBudW0sIHVpbnQ2NF90IGRlbikKK3sKKyAgICByZXR1cm4gX191ZGl2bW9kZGk0KG51bSwgZGVuLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9saWJnY2MvX191ZGl2bW9kZGk0LmMgYi9jb20zMi9saWIvbGliZ2NjL19fdWRpdm1vZGRpNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNjAyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGliZ2NjL19fdWRpdm1vZGRpNC5jCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDxrbGliYy9kaXZlcnIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordWludDY0X3QgX191ZGl2bW9kZGk0KHVpbnQ2NF90IG51bSwgdWludDY0X3QgZGVuLCB1aW50NjRfdCAqIHJlbV9wKQoreworICAgIHVpbnQ2NF90IHF1b3QgPSAwLCBxYml0ID0gMTsKKworICAgIGlmIChkZW4gPT0gMCkgeworCV9fZGl2aWRlX2Vycm9yKCk7CisJcmV0dXJuIDA7CQkvKiBJZiB0cmFwIHJldHVybnMuLi4gKi8KKyAgICB9CisKKyAgICAvKiBMZWZ0LWp1c3RpZnkgZGVub21pbmF0b3IgYW5kIGNvdW50IHNoaWZ0ICovCisgICAgd2hpbGUgKChpbnQ2NF90KSBkZW4gPj0gMCkgeworCWRlbiA8PD0gMTsKKwlxYml0IDw8PSAxOworICAgIH0KKworICAgIHdoaWxlIChxYml0KSB7CisJaWYgKGRlbiA8PSBudW0pIHsKKwkgICAgbnVtIC09IGRlbjsKKwkgICAgcXVvdCArPSBxYml0OworCX0KKwlkZW4gPj49IDE7CisJcWJpdCA+Pj0gMTsKKyAgICB9CisKKyAgICBpZiAocmVtX3ApCisJKnJlbV9wID0gbnVtOworCisgICAgcmV0dXJuIHF1b3Q7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGliZ2NjL19fdW1vZGRpMy5jIGIvY29tMzIvbGliL2xpYmdjYy9fX3Vtb2RkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk3ZWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYmdjYy9fX3Vtb2RkaTMuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX3Vtb2RkaTMuYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworZXh0ZXJuIHVpbnQ2NF90IF9fdWRpdm1vZGRpNCh1aW50NjRfdCBudW0sIHVpbnQ2NF90IGRlbiwgdWludDY0X3QgKiByZW0pOworCit1aW50NjRfdCBfX3Vtb2RkaTModWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4pCit7CisgICAgdWludDY0X3QgdjsKKworICAgICh2b2lkKV9fdWRpdm1vZGRpNChudW0sIGRlbiwgJnYpOworICAgIHJldHVybiB2OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9BTk5PVU5DRSBiL2NvbTMyL2xpYi9saWJwbmcvQU5OT1VOQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4MjRlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvQU5OT1VOQ0UKQEAgLTAsMCArMSw1NyBAQAorCitMaWJwbmcgMS4yLjQ0IC0gSnVuZSAyNiwgMjAxMAorCitUaGlzIGlzIGEgcHVibGljIHJlbGVhc2Ugb2YgbGlicG5nLCBpbnRlbmRlZCBmb3IgdXNlIGluIHByb2R1Y3Rpb24gY29kZXMuCisKK0ZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQ6CisKK1NvdXJjZSBmaWxlcyB3aXRoIExGIGxpbmUgZW5kaW5ncyAoZm9yIFVuaXgvTGludXgpIGFuZCB3aXRoIGEKKyJjb25maWd1cmUiIHNjcmlwdAorCisgICBsaWJwbmctMS4yLjQ0LnRhci54eiAoTFpNQS1jb21wcmVzc2VkLCByZWNvbW1lbmRlZCkKKyAgIGxpYnBuZy0xLjIuNDQudGFyLmd6CisgICBsaWJwbmctMS4yLjQ0LnRhci5iejIKKworU291cmNlIGZpbGVzIHdpdGggTEYgbGluZSBlbmRpbmdzIChmb3IgVW5peC9MaW51eCkgd2l0aG91dCB0aGUKKyJjb25maWd1cmUiIHNjcmlwdAorCisgICBsaWJwbmctMS4yLjQ0LW5vLWNvbmZpZy50YXIueHogKExaTUEtY29tcHJlc3NlZCwgcmVjb21tZW5kZWQpCisgICBsaWJwbmctMS4yLjQ0LW5vLWNvbmZpZy50YXIuZ3oKKyAgIGxpYnBuZy0xLjIuNDQtbm8tY29uZmlnLnRhci5iejIKKworU291cmNlIGZpbGVzIHdpdGggQ1JMRiBsaW5lIGVuZGluZ3MgKGZvciBXaW5kb3dzKSwgd2l0aG91dCB0aGUKKyJjb25maWd1cmUiIHNjcmlwdAorCisgICBscG5nMTI0NC56aXAKKyAgIGxwbmcxMjQ0Ljd6CisgICBscG5nMTI0NC50YXIuYnoyCisKK1Byb2plY3QgZmlsZXMKKworICAgbGlicG5nLTEuMi40NC1wcm9qZWN0LW5ldHdhcmUuemlwCisgICBsaWJwbmctMS4yLjQ0LXByb2plY3Qtd2luY2UuemlwCisKK090aGVyIGluZm9ybWF0aW9uOgorCisgICBsaWJwbmctMS4yLjQ0LVJFQURNRS50eHQKKyAgIGxpYnBuZy0xLjIuNDQtS05PV05CVUdTLnR4dAorICAgbGlicG5nLTEuMi40NC1MSUNFTlNFLnR4dAorICAgbGlicG5nLTEuMi40NC1ZMkstY29tcGxpYW5jZS50eHQKKyAgIGxpYnBuZy0xLjIuNDQtW3ByZXZpb3VzIHZlcnNpb25dLWRpZmYudHh0CisKK0NoYW5nZXMgc2luY2UgdGhlIGxhc3QgcHVibGljIHJlbGVhc2UgKDEuMi40Myk6CisKK3ZlcnNpb24gMS4yLjQ0IFtKdW5lIDI2LCAyMDEwXQorCisgIFJld3JvdGUgcG5nX3Byb2Nlc3NfSURBVF9kYXRhIHRvIGNvbnNpc3RlbnRseSB0cmVhdCBleHRyYSBkYXRhIGFzIHdhcm5pbmdzCisgICAgYW5kIGhhbmRsZSBlbmQgY29uZGl0aW9ucyBtb3JlIGNsZWFubHkuCisgIFJlbW92ZWQgdGhlIG5vdy1yZWR1bmRhbnQgY2hlY2sgZm9yIG91dC1vZi1ib3VuZHMgbmV3X3JvdyBmcm9tIGV4YW1wbGUuYworCisKK1NlbmQgY29tbWVudHMvY29ycmVjdGlvbnMvY29tbWVuZGF0aW9ucyB0byBwbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zZi5uZXQKKworKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKK2h0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50Cit0byBzdWJzY3JpYmUpIG9yIHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0CisKK0dsZW5uIFItUApkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9DSEFOR0VTIGIvY29tMzIvbGliL2xpYnBuZy9DSEFOR0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTNlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGlicG5nL0NIQU5HRVMKQEAgLTAsMCArMSwyNzE0IEBACisvKgorQ0hBTkdFUyAtIGNoYW5nZXMgZm9yIGxpYnBuZworCit2ZXJzaW9uIDAuMgorICBhZGRlZCByZWFkZXIgaW50byBwbmcuaAorICBmaXhlZCBzbWFsbCBwcm9ibGVtcyBpbiBzdHViIGZpbGUKKwordmVyc2lvbiAwLjMKKyAgYWRkZWQgcHVsbCByZWFkZXIKKyAgc3BsaXQgdXAgcG5nd3JpdGUuYyB0byBzZXZlcmFsIGZpbGVzCisgIGFkZGVkIHBuZ2xpYi50eHQKKyAgYWRkZWQgZXhhbXBsZS5jCisgIGNsZWFuZWQgdXAgd3JpdGVyLCBhZGRpbmcgYSBmZXcgbmV3IHRyYW5zZm9ybWF0aW9ucworICBmaXhlZCBzb21lIGJ1Z3MgaW4gd3JpdGVyCisgIGludGVyZmFjZWQgd2l0aCB6bGliIDAuNQorICBhZGRlZCBLJlIgc3VwcG9ydAorICBhZGRlZCBjaGVjayBmb3IgNjQgS0IgYmxvY2tzIGZvciAxNiBiaXQgbWFjaGluZXMKKwordmVyc2lvbiAwLjQKKyAgY2xlYW5lZCB1cCBjb2RlIGFuZCBjb21tZW50ZWQgY29kZQorICBzaW1wbGlmaWVkIHRpbWUgaGFuZGxpbmcgaW50byBwbmdfdGltZQorICBjcmVhdGVkIHBuZ19jb2xvcl8xNiBhbmQgcG5nX2NvbG9yXzggdG8gaGFuZGxlIGNvbG9yIG5lZWRzCisgIGNsZWFuZWQgdXAgY29sb3IgdHlwZSBkZWZpbmVzCisgIGZpeGVkIHZhcmlvdXMgYnVncworICBtYWRlIHZhcmlvdXMgbmFtZXMgbW9yZSBjb25zaXN0ZW50CisgIGludGVyZmFjZWQgd2l0aCB6bGliIDAuNzEKKyAgY2xlYW5lZCB1cCB6VFh0IHJlYWRlciBhbmQgd3JpdGVyICh1c2luZyB6bGliJ3MgUmVzZXQgZnVuY3Rpb25zKQorICBzcGxpdCB0cmFuc2Zvcm1hdGlvbnMgaW50byBwbmdydHJhbi5jIGFuZCBwbmd3dHJhbi5jCisKK3ZlcnNpb24gMC41CisgIGludGVyZmFjZWQgd2l0aCB6bGliIDAuOAorICBmaXhlZCBtYW55IHJlYWRpbmcgYW5kIHdyaXRpbmcgYnVncworICBzYXZlZCB1c2luZyAzIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYnMKKwordmVyc2lvbiAwLjYKKyAgYWRkZWQgcG5nX2xhcmdlX21hbGxvYygpIGFuZCBwbmdfbGFyZ2VfZnJlZSgpCisgIGFkZGVkIHBuZ19zaXplX3QKKyAgY2xlYW5lZCB1cCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzCisgIGFkZGVkIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkKKwordmVyc2lvbiAwLjcKKyAgY2xlYW5lZCB1cCBsb3RzIG9mIGJ1Z3MKKyAgZmluaXNoZWQgZGl0aGVyaW5nIGFuZCBvdGhlciBzdHVmZgorICBhZGRlZCB0ZXN0IHByb2dyYW0KKyAgY2hhbmdlZCBuYW1lIGZyb20gcG5nbGliIHRvIGxpYnBuZworCit2ZXJzaW9uIDAuNzEgW0p1bmUsIDE5OTVdCisgIGNoYW5nZWQgcG5ndGVzdC5wbmcgZm9yIHpsaWIgMC45MworICBmaXhlZCBlcnJvciBpbiBsaWJwbmcudHh0IGFuZCBleGFtcGxlLmMKKwordmVyc2lvbiAwLjgKKyAgY2xlYW5lZCB1cCBzb21lIGJ1Z3MKKyAgYWRkZWQgcG5nX3NldF9maWxsZXIoKQorICBzcGxpdCB1cCBwbmdzdHViLmMgaW50byBwbmdtZW0uYywgcG5naW8uYywgYW5kIHBuZ2Vycm9yLmMKKyAgYWRkZWQgI2RlZmluZSdzIHRvIHJlbW92ZSB1bndhbnRlZCBjb2RlCisgIG1vdmVkIHBuZ19pbmZvX2luaXQoKSB0byBwbmcuYworICBhZGRlZCBvbGRfc2l6ZSBpbnRvIHBuZ19yZWFsbG9jKCkKKyAgYWRkZWQgZnVuY3Rpb25zIHRvIG1hbnVhbGx5IHNldCBmaWx0ZXJpbmcgYW5kIGNvbXByZXNzaW9uIGluZm8KKyAgY2hhbmdlZCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJhc2VkIG9uIGltYWdlIHR5cGUKKyAgb3B0aW1pemVkIGZpbHRlciBzZWxlY3Rpb24gY29kZQorICBhZGRlZCB2ZXJzaW9uIGluZm8KKyAgY2hhbmdlZCBleHRlcm5hbCBmdW5jdGlvbnMgcGFzc2luZyBmbG9hdHMgdG8gZG91YmxlcyAoayZyIHByb2JsZW1zPykKKyAgcHV0IGFsbCB0aGUgY29uZmlndXJhYmxlIHN0dWZmIGluIHBuZ2NvbmYuaAorICBlbmFibGVkIHBuZ19zZXRfc2hpZnQgdG8gd29yayB3aXRoIHBhbGV0dGVkIGltYWdlcyBvbiByZWFkCisgIGFkZGVkIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgLSB1cGRhdGVzIGluZm8gc3RydWN0dXJlIHdpdGgKKyAgICAgdHJhbnNmb3JtYXRpb25zCisKK3ZlcnNpb24gMC44MSBbQXVndXN0LCAxOTk1XQorICBpbmNvcnBvcmF0ZWQgVGltIFdlZ25lcidzIG1lZGl1bSBtb2RlbCBjb2RlICh0aGFua3MsIFRpbSkKKwordmVyc2lvbiAwLjgyIFtTZXB0ZW1iZXIsIDE5OTVdCisgIFt1bnNwZWNpZmllZCBjaGFuZ2VzXQorCit2ZXJzaW9uIDAuODUgW0RlY2VtYmVyLCAxOTk1XQorICBhZGRlZCBtb3JlIG1lZGl1bSBtb2RlbCBjb2RlIChhbG1vc3QgZXZlcnl0aGluZydzIGEgZmFyKQorICBhZGRlZCBpL28sIGVycm9yLCBhbmQgbWVtb3J5IGNhbGxiYWNrIGZ1bmN0aW9ucworICBmaXhlZCBzb21lIGJ1Z3MgKDE2IGJpdCwgNCBiaXQgaW50ZXJsYWNlZCwgZXRjLikKKyAgYWRkZWQgZmlyc3QgcnVuIHByb2dyZXNzaXZlIHJlYWRlciAoYmFyZWx5IHRlc3RlZCkKKwordmVyc2lvbiAwLjg2IFtKYW51YXJ5LCAxOTk2XQorICBmaXhlZCBidWdzCisgIGltcHJvdmVkIGRvY3VtZW50YXRpb24KKwordmVyc2lvbiAwLjg3IFtKYW51YXJ5LCAxOTk2XQorICBmaXhlZCBtZWRpdW0gbW9kZWwgYnVncworICBmaXhlZCBvdGhlciBidWdzIGludHJvZHVjZWQgaW4gMC44NSBhbmQgMC44NgorICBhZGRlZCBzb21lIG1pbm9yIGRvY3VtZW50YXRpb24KKwordmVyc2lvbiAwLjg4IFtKYW51YXJ5LCAxOTk2XQorICBmaXhlZCBwcm9ncmVzc2l2ZSBidWdzCisgIHJlcGxhY2VkIHRhYnMgd2l0aCBzcGFjZXMKKyAgY2xlYW5lZCB1cCBkb2N1bWVudGF0aW9uCisgIGFkZGVkIGNhbGxiYWNrcyBmb3IgcmVhZC93cml0ZSBhbmQgd2FybmluZy9lcnJvciBmdW5jdGlvbnMKKwordmVyc2lvbiAwLjg5IFtKdWx5LCAxOTk2XQorICBhZGRlZCBuZXcgaW5pdGlhbGl6YXRpb24gQVBJIHRvIG1ha2UgbGlicG5nIHdvcmsgYmV0dGVyIHdpdGggc2hhcmVkIGxpYnMKKyAgICAgd2Ugbm93IGhhdmUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpLCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpLAorICAgICBwbmdfY3JlYXRlX2luZm9fc3RydWN0KCksIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCksIGFuZAorICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSBpbnN0ZWFkIG9mIHRoZSBzZXBhcmF0ZSBjYWxscyB0bworICAgICBtYWxsb2MgYW5kIHBuZ19yZWFkX2luaXQoKSwgcG5nX2luZm9faW5pdCgpLCBhbmQgcG5nX3dyaXRlX2luaXQoKQorICBjaGFuZ2VkIHdhcm5pbmcvZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIGZpeCBidWcgLSB0aGlzIG1lYW5zIHlvdQorICAgICBzaG91bGQgdXNlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gQVBJIGlmIHlvdSB3ZXJlIHVzaW5nIHRoZSBvbGQKKyAgICAgcG5nX3NldF9tZXNzYWdlX2ZuKCkgY2FsbHMsIGFuZCB0aGF0IHRoZSBvbGQgQVBJIG5vIGxvbmdlciBleGlzdHMKKyAgICAgc28gdGhhdCBwZW9wbGUgYXJlIGF3YXJlIHRoYXQgdGhleSBuZWVkIHRvIGNoYW5nZSB0aGVpciBjb2RlCisgIGNoYW5nZWQgZmlsdGVyIHNlbGVjdGlvbiBBUEkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIG11bHRpcGxlIGZpbHRlcnMKKyAgICAgc2luY2UgaXQgZGlkbid0IHdvcmsgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgbGlicG5nIGFueXdheXMKKyAgb3B0aW1pemVkIGZpbHRlciBzZWxlY3Rpb24gY29kZQorICBmaXhlZCBwbmdfc2V0X2JhY2tncm91bmQoKSB0byBhbGxvdyB1c2luZyBhbiBhcmJpdHJhcnkgUkdCIGNvbG9yIGZvcgorICAgICBwYWxldHRlZCBpbWFnZXMKKyAgZml4ZWQgZ2FtbWEgYW5kIGJhY2tncm91bmQgY29ycmVjdGlvbiBmb3IgcGFsZXR0ZWQgaW1hZ2VzLCBzbworICAgICBwbmdfY29ycmVjdF9wYWxldHRlIGlzIG5vdCBuZWVkZWQgdW5sZXNzIHlvdSBhcmUgY29ycmVjdGluZyBhbgorICAgICBleHRlcm5hbCBwYWxldHRlICh5b3Ugd2lsbCBuZWVkIHRvICNkZWZpbmUgUE5HX0NPUlJFQ1RfUEFMRVRURV9TVVBQT1JURUQKKyAgICAgaW4gcG5nY29uZi5oKSAtIGlmIG5vYm9keSB1c2VzIHRoaXMsIGl0IG1heSBkaXNhcHBlYXIgaW4gdGhlIGZ1dHVyZS4KKyAgZml4ZWQgYnVnIHdpdGggQm9ybGFuZCA2NEsgbWVtb3J5IGFsbG9jYXRpb24gKEFsZXhhbmRlciBMZWhtYW5uKQorICBmaXhlZCBidWcgaW4gaW50ZXJsYWNlIGhhbmRsaW5nIChTbWFyYXNkZXJhZ2QsIEkgdGhpbmspCisgIGFkZGVkIG1vcmUgZXJyb3IgY2hlY2tpbmcgZm9yIHdyaXRpbmcgYW5kIGltYWdlIHRvIHJlZHVjZSBpbnZhbGlkIGZpbGVzCisgIHNlcGFyYXRlZCByZWFkIGFuZCB3cml0ZSBmdW5jdGlvbnMgc28gdGhhdCB0aGV5IHdvbid0IGJvdGggYmUgbGlua2VkCisgICAgIGludG8gYSBiaW5hcnkgd2hlbiBvbmx5IHJlYWRpbmcgb3Igd3JpdGluZyBmdW5jdGlvbmFsaXR5IGlzIHVzZWQKKyAgbmV3IHBuZ3Rlc3QgaW1hZ2UgYWxzbyBoYXMgaW50ZXJsYWNpbmcgYW5kIHpUWHQKKyAgdXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgbmV3IEFQSQorCit2ZXJzaW9uIDAuOTAgW0phbnVhcnksIDE5OTddCisgIG1hZGUgQ1JDIGVycm9ycy93YXJuaW5ncyBvbiBjcml0aWNhbCBhbmQgYW5jaWxsYXJ5IGNodW5rcyBjb25maWd1cmFibGUKKyAgbGlicG5nIHdpbGwgdXNlIHRoZSB6bGliIENSQyByb3V0aW5lcyBieSAoY29tcGlsZS10aW1lKSBkZWZhdWx0CisgIGNoYW5nZWQgRE9TIHNtYWxsL21lZGl1bSBtb2RlbCBtZW1vcnkgc3VwcG9ydCAtIG5lZWRzIHpsaWIgMS4wNCAoVGltIFdlZ25lcikKKyAgYWRkZWQgZXh0ZXJuYWwgQysrIHdyYXBwZXIgc3RhdGVtZW50cyB0byBwbmcuaCAoR2lsbGVzIERhdXBoaW4pCisgIGFsbG93IFBORyBmaWxlIHRvIGJlIHJlYWQgd2hlbiBzb21lIG9yIGFsbCBvZiBmaWxlIHNpZ25hdHVyZSBoYXMgYWxyZWFkeQorICAgICBiZWVuIHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uICAqKioqVGhpcyBhZmZlY3RzIHRoZSBzaXplCisgICAgIG9mIGluZm9fc3RydWN0IGFuZCBpbnZhbGlkYXRlcyBhbGwgcHJvZ3JhbXMgdGhhdCB1c2UgYSBzaGFyZWQgbGlicG5nKioqKgorICBmaXhlZCBwbmdfZmlsbGVyKCkgZGVjbGFyYXRpb25zCisgIGZpeGVkPyBiYWNrZ3JvdW5kIGNvbG9yIGNvbnZlcnNpb25zCisgIGZpeGVkIG9yZGVyIG9mIGVycm9yIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1hdGNoIGRvY3VtZW50YXRpb24KKyAgY3VycmVudCBjaHVuayBuYW1lIGlzIG5vdyBhdmFpbGFibGUgaW4gcG5nX3N0cnVjdCB0byByZWR1Y2UgdGhlIG51bWJlcgorICAgICBvZiBuZWFybHkgaWRlbnRpY2FsIGVycm9yIG1lc3NhZ2VzICh3aWxsIHNpbXBsaWZ5IG11bHRpLWxpbmd1YWwKKyAgICAgc3VwcG9ydCB3aGVuIGF2YWlsYWJsZSkKKyAgdHJ5IHRvIGdldCByZWFkeSBmb3IgdW5rbm93bi1jaHVuayBjYWxsYmFjayBmdW5jdGlvbnM6CisgICAgIC0gcHJldmlvdXNseSByZWFkIGNyaXRpY2FsIGNodW5rcyBhcmUgZmxhZ2dlZCwgc28gdGhlIGNodW5rIGhhbmRsaW5nCisgICAgICAgcm91dGluZXMgY2FuIGRldGVybWluZSBpZiB0aGUgY2h1bmsgaXMgaW4gdGhlIHJpZ2h0IHBsYWNlCisgICAgIC0gYWxsIGNodW5rIGhhbmRsaW5nIHJvdXRpbmVzIGhhdmUgdGhlIHNhbWUgcHJvdG90eXBlcywgc28gd2Ugd2lsbAorICAgICAgIGJlIGFibGUgdG8gaGFuZGxlIGFsbCBjaHVua3MgdmlhIGEgY2FsbGJhY2sgbWVjaGFuaXNtCisgIHRyeSB0byBmaXggTGludXggInNldGptcCIgYnVmZmVyIHNpemUgcHJvYmxlbXMKKyAgcmVtb3ZlZCBwbmdfbGFyZ2VfbWFsbG9jLCBwbmdfbGFyZ2VfZnJlZSwgYW5kIHBuZ19yZWFsbG9jIGZ1bmN0aW9ucy4KKwordmVyc2lvbiAwLjk1IFtNYXJjaCwgMTk5N10KKyAgZml4ZWQgYnVnIGluIHBuZ3d1dGlsLmMgYWxsb2NhdGluZyAidXBfcm93IiB0d2ljZSBhbmQgImF2Z19yb3ciIG5ldmVyCisgIGZpeGVkIGJ1ZyBpbiBQTkcgZmlsZSBzaWduYXR1cmUgY29tcGFyZXMgd2hlbiBzdGFydCAhPSAwCisgIGNoYW5nZWQgcGFyYW1ldGVyIHR5cGUgb2YgcG5nX3NldF9maWxsZXIoLi4uZmlsbGVyLi4uKSBmcm9tIHBuZ19ieXRlCisgICAgIHRvIHBuZ191aW50XzMyCisgIGFkZGVkIHRlc3QgZm9yIE1BQ09TIHRvIGVuc3VyZSB0aGF0IGJvdGggbWF0aC5oIGFuZCBmcC5oIGFyZSBub3QgI2luY2x1ZGVkCisgIGFkZGVkIG1hY3JvcyBmb3IgbGlicG5nIHRvIGJlIGNvbXBpbGVkIGFzIGEgV2luZG93cyBETEwgKEFuZHJlYXMgS3VwcmllcykKKyAgYWRkZWQgInBhY2tzd2FwIiB0cmFuc2Zvcm1hdGlvbiwgd2hpY2ggY2hhbmdlcyB0aGUgZW5kaWFubmVzcyBvZgorICAgICBwYWNrZWQtcGl4ZWwgYnl0ZXMgKEtldmluIEJyYWNleSkKKyAgYWRkZWQgInN0cmlwX2FscGhhIiB0cmFuc2Zvcm1hdGlvbiwgd2hpY2ggcmVtb3ZlcyB0aGUgYWxwaGEgY2hhbm5lbCBvZgorICAgICBpbnB1dCBpbWFnZXMgd2l0aG91dCB1c2luZyBpdCAobm90IG5lY2Vzc2FyaWx5IGEgZ29vZCBpZGVhKQorICBhZGRlZCAic3dhcF9hbHBoYSIgdHJhbnNmb3JtYXRpb24sIHdoaWNoIHB1dHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gZnJvbnQKKyAgICAgb2YgdGhlIGNvbG9yIGJ5dGVzIGluc3RlYWQgb2YgYWZ0ZXIKKyAgcmVtb3ZlZCBhbGwgaW1wbGljaXQgdmFyaWFibGUgdGVzdHMgd2hpY2ggYXNzdW1lIE5VTEwgPT0gMCAoSSB0aGluaykKKyAgY2hhbmdlZCBzZXZlcmFsIHZhcmlhYmxlcyB0byAicG5nX3NpemVfdCIgdG8gc2hvdyAxNi8zMi1iaXQgbGltaXRhdGlvbnMKKyAgYWRkZWQgbmV3IHBDQUwgY2h1bmsgcmVhZC93cml0ZSBzdXBwb3J0CisgIGFkZGVkIGV4cGVyaW1lbnRhbCBmaWx0ZXIgc2VsZWN0aW9uIHdlaWdodGluZyAoR3JlZyBSb2Vsb2ZzKQorICByZW1vdmVkIG9sZCBwbmdfc2V0X3JnYngoKSBhbmQgcG5nX3NldF94cmdiKCkgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuCisgICAgIG9ic29sZXRlIGZvciBhYm91dCAyIHllYXJzIG5vdyAodXNlIHBuZ19zZXRfZmlsbGVyKCkgaW5zdGVhZCkKKyAgYWRkZWQgbWFjcm9zIHRvIHJlYWQgMTYtIGFuZCAzMi1iaXQgaW50cyBkaXJlY3RseSBmcm9tIGJ1ZmZlciwgdG8gYmUKKyAgICAgdXNlZCBvbmx5IG9uIHRob3NlIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0IChuYW1lbHkgUG93ZXJQQyBhbmQgNjgweDApCisgICAgIFdpdGggc29tZSB0ZXN0aW5nLCB0aGlzIG1heSBiZWNvbWUgdGhlIGRlZmF1bHQgZm9yIE1BQ09TL1BQQyBzeXN0ZW1zLgorICBvbmx5IGNhbGN1bGF0ZSBDUkMgb24gZGF0YSBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGl0CisgIGFkZGVkIG1hY3JvcyBmb3IgelRYdCBjb21wcmVzc2lvbiB0eXBlIFBOR196VFh0X0NPTVBSRVNTSU9OXz8/PworICBhZGRlZCBtYWNyb3MgZm9yIHNpbXBsZSBsaWJwbmcgZGVidWdnaW5nIG91dHB1dCBzZWxlY3RhYmxlIGF0IGNvbXBpbGUgdGltZQorICByZW1vdmVkIFBOR19SRUFEX0VORF9NT0RFIGluIHByb2dyZXNzaXZlIHJlYWRlciAoU21hcmFzZGVyYWdkKQorICBtb3JlIGRlc2NyaXB0aW9uIG9mIGluZm9fc3RydWN0IGluIGxpYnBuZy50eHQgYW5kIHBuZy5oCisgIG1vcmUgaW5zdHJ1Y3Rpb25zIGluIGV4YW1wbGUuYworICBtb3JlIGNodW5rIHR5cGVzIHRlc3RlZCBpbiBwbmd0ZXN0LmMKKyAgcmVuYW1lZCBwbmdyY2IuYyB0byBwbmdzZXQuYywgYW5kIGFsbCBwbmdfcmVhZF88Y2h1bms+IGZ1bmN0aW9ucyB0byBiZQorICAgICBwbmdfc2V0XzxjaHVuaz4uICBXZSBub3cgaGF2ZSBjb3JyZXNwb25kaW5nIHBuZ19nZXRfPGNodW5rPgorICAgICBmdW5jdGlvbnMgaW4gcG5nZ2V0LmMgdG8gZ2V0IGluZm9ybWF0aW9uIGluIGluZm9fcHRyLiAgVGhpcyBpc29sYXRlcworICAgICB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGUgaW50ZXJuYWwgb3JnYW5pemF0aW9uIG9mIHBuZ19pbmZvX3N0cnVjdAorICAgICAoZ29vZCBmb3Igc2hhcmVkIGxpYnJhcnkgaW1wbGVtZW50YXRpb25zKS4KKwordmVyc2lvbiAwLjk2IFtNYXksIDE5OTddCisgIGZpeGVkIHNlcmlvdXMgYnVnIHdpdGggPCA4YnBwIGltYWdlcyBpbnRyb2R1Y2VkIGluIDAuOTUKKyAgZml4ZWQgMjU2LWNvbG9yIHRyYW5zcGFyZW5jeSBidWcgKEdyZWcgUm9lbG9mcykKKyAgZml4ZWQgdXAgZG9jdW1lbnRhdGlvbiAoR3JlZyBSb2Vsb2ZzLCBMYXN6bG8gTnl1bCkKKyAgZml4ZWQgImVycm9yIiBpbiBwbmdjb25mLmggZm9yIExpbnV4IHNldGptcCgpIGJlaGF2aW91cgorICBmaXhlZCBET1MgbWVkaXVtIG1vZGVsIHN1cHBvcnQgKFRpbSBXZWduZXIpCisgIGZpeGVkIHBuZ19jaGVja19rZXl3b3JkKCkgZm9yIGNhc2Ugd2l0aCBlcnJvciBpbiBzdGF0aWMgc3RyaW5nIHRleHQKKyAgYWRkZWQgcmVhZCBvZiBDUkMgYWZ0ZXIgSUVORCBjaHVuayBmb3IgZW1iZWRkZWQgUE5HcyAoTGFzemxvIE55dWwpCisgIGFkZGVkIHR5cGVjYXN0cyB0byBxdWlldCBjb21waWxlciBlcnJvcnMKKyAgYWRkZWQgbW9yZSBkZWJ1Z2dpbmcgaW5mbworCit2ZXJzaW9uIDAuOTcgW0phbnVhcnksIDE5OThdCisgIHJlbW92ZWQgUE5HX1VTRV9PV05fQ1JDIGNhcGFiaWxpdHkKKyAgcmVsb2NhdGVkIHBuZ19zZXRfY3JjX2FjdGlvbiBmcm9tIHBuZ3J1dGlsLmMgdG8gcG5ncnRyYW4uYworICBmaXhlZCB0eXBlY2FzdHMgb2YgIm5ld19rZXkiLCBldGMuIChBbmRyZWFzIERpbGdlcikKKyAgYWRkZWQgUkZDIDExNTIgW3NpY10gZGF0ZSBzdXBwb3J0CisgIGZpeGVkIGJ1ZyBpbiBnYW1tYSBoYW5kbGluZyBvZiA0LWJpdCBncmF5c2NhbGUKKyAgYWRkZWQgMi1iaXQgZ3JheXNjYWxlIGdhbW1hIGhhbmRsaW5nIChHbGVubiBSLVApCisgIGFkZGVkIG1vcmUgdHlwZWNhc3RzLiA2NTUzNkwgYmVjb21lcyAocG5nX3VpbnRfMzIpNjU1MzZMLCBldGMuIChHbGVubiBSLVApCisgIG1pbm9yIGNvcnJlY3Rpb25zIGluIGxpYnBuZy50eHQKKyAgYWRkZWQgc2ltcGxlIHNSR0Igc3VwcG9ydCAoR2xlbm4gUi1QKQorICBlYXNpZXIgY29uZGl0aW9uYWwgY29tcGlsaW5nLCBlLmcuIGRlZmluZSBQTkdfUkVBRC9XUklURV9OT1RfRlVMTFlfU1VQUE9SVEVEOworICAgICBhbGwgY29uZmlndXJhYmxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIGZyb20gY29tbWFuZC1saW5lIGluc3RlYWQKKyAgICAgb2YgaGF2aW5nIHRvIGVkaXQgcG5nY29uZi5oIChHbGVubiBSLVApCisgIGZpeGVkIG1lbW9yeSBsZWFrIGluIHBuZ3dyaXRlLmMgKGZyZWUgaW5mb19wdHItPnRleHQpIChHbGVubiBSLVApCisgIGFkZGVkIG1vcmUgY29uZGl0aW9ucyBmb3IgcG5nX2RvX2JhY2tncm91bmQsIHRvIGF2b2lkIGNoYW5naW5nCisgICAgIGJsYWNrIHBpeGVscyB0byBiYWNrZ3JvdW5kIHdoZW4gYSBiYWNrZ3JvdW5kIGlzIHN1cHBsaWVkIGFuZAorICAgICBubyBwaXhlbHMgYXJlIHRyYW5zcGFyZW50CisgIHJlcGFpcmVkIFBOR19OT19TVERJTyBiZWhhdmlvdXIKKyAgdGVzdGVkIE5PRElWIHN1cHBvcnQgYW5kIG1hZGUgaXQgZGVmYXVsdCBiZWhhdmlvdXIgKEdyZWcgUm9lbG9mcykKKyAgYWRkZWQgIi1tIiBvcHRpb24gYW5kIFBOR1RFU1RfREVCVUdfTUVNT1JZIHRvIHBuZ3Rlc3QgKEpvaG4gQm93bGVyKQorICByZWd1bGFyaXplZCB2ZXJzaW9uIG51bWJlcmluZyBzY2hlbWUgYW5kIGJ1bXBlZCBzaGFyZWQtbGlicmFyeSBtYWpvcgorICAgICB2ZXJzaW9uIG51bWJlciB0byAyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggbGlicG5nIDAuODkgYXBwcyAoR3JlZyBSb2Vsb2ZzKQorCit2ZXJzaW9uIDAuOTggW0phbnVhcnksIDE5OThdCisgIGNsZWFuZWQgdXAgc29tZSB0eXBvcyBpbiBsaWJwbmcudHh0IGFuZCBpbiBjb2RlIGRvY3VtZW50YXRpb24KKyAgZml4ZWQgbWVtb3J5IGxlYWtzIGluIHBDQUwgY2h1bmsgcHJvY2Vzc2luZyAoR2xlbm4gUi1QIGFuZCBKb2huIEJvd2xlcikKKyAgY29zbWV0aWMgY2hhbmdlICJkaXNwbGF5X2dhbW1hIiB0byAic2NyZWVuX2dhbW1hIiBpbiBwbmdydHJhbi5jCisgIGNoYW5nZWQgcmVjb21tZW5kYXRpb24gYWJvdXQgZmlsZV9nYW1tYSBmb3IgUEMgaW1hZ2VzIHRvIC41MSBmcm9tIC40NSwKKyAgICAgaW4gZXhhbXBsZS5jIGFuZCBsaWJwbmcudHh0LCBhZGRlZCBjb21tZW50cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgICAgIHNjcmVlbl9nYW1tYSwgdmlld2luZ19nYW1tYSwgYW5kIGRpc3BsYXlfZ2FtbWEuCisgIGNoYW5nZWQgYWxsIHJlZmVyZW5jZXMgdG8gUkZDMTE1MiB0byByZWFkIFJGQzExMjMgYW5kIGNoYW5nZWQgdGhlCisgICAgIFBOR19USU1FX1JGQzExNTJfU1VQUE9SVEVEIG1hY3JvIHRvIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECisgIGFkZGVkIHBuZ19pbnZlcnRfYWxwaGEgY2FwYWJpbGl0eSAoR2xlbm4gUi1QIC0tIHN1Z2dlc3Rpb24gYnkgSm9uIFZpbmNlbnQpCisgIGNoYW5nZWQgc3JnYl9pbnRlbnQgZnJvbSBwbmdfYnl0ZSB0byBpbnQgdG8gYXZvaWQgY29tcGlsZXIgYnVncworCit2ZXJzaW9uIDAuOTkgW0phbnVhcnkgMzAsIDE5OThdCisgIGZyZWUgaW5mb19wdHItPnRleHQgaW5zdGVhZCBvZiBlbmRfaW5mb19wdHItPnRleHQgaW4gcG5ncmVhZC5jIChKb2huIEJvd2xlcikKKyAgZml4ZWQgYSBsb25nc3RhbmRpbmcgInBhY2tzd2FwIiBidWcgaW4gcG5ndHJhbnMuYworICBmaXhlZCBzb21lIGluY29uc2lzdGVuY2llcyBpbiBwbmdjb25mLmggdGhhdCBwcmV2ZW50ZWQgY29tcGlsaW5nIHdpdGgKKyAgICAgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEIGFuZCBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRCB1bmRlZmluZWQKKyAgZml4ZWQgc29tZSB0eXBvcyBhbmQgbWFkZSBvdGhlciBtaW5vciByZWFycmFuZ2VtZW50IG9mIGxpYnBuZy50eHQgKEFuZHJlYXMpCisgIGNoYW5nZWQgcmVjb21tZW5kYXRpb24gYWJvdXQgZmlsZV9nYW1tYSBmb3IgUEMgaW1hZ2VzIHRvIC41MCBmcm9tIC41MSBpbgorICAgICBleGFtcGxlLmMgYW5kIGxpYnBuZy50eHQsIGFuZCBjaGFuZ2VkIGZpbGVfZ2FtbWEgZm9yIHNSR0IgaW1hZ2VzIHRvIC40NQorICBhZGRlZCBhIG51bWJlciBvZiBmdW5jdGlvbnMgdG8gYWNjZXNzIGluZm9ybWF0aW9uIGZyb20gdGhlIHBuZyBzdHJ1Y3R1cmUKKyAgICAgcG5nX2dldF9pbWFnZV9oZWlnaHQoKSwgZXRjLiAoR2xlbm4gUi1QLCBzdWdnZXN0aW9uIGJ5IEJyYWQgUGV0dGl0KQorICBhZGRlZCBUQVJHRVRfTUFDT1Mgc2ltaWxhciB0byB6bGliLTEuMC44CisgIGRlZmluZSBQTkdfQUxXQVlTX0VYVEVSTiB3aGVuIF9fTVdFUktTX18gJiYgV0lOMzIgYXJlIGRlZmluZWQKKyAgYWRkZWQgdHlwZSBjYXN0aW5nIHRvIGFsbCBwbmdfbWFsbG9jKCkgZnVuY3Rpb24gY2FsbHMKK3ZlcnNpb24gMC45OWEgW0phbnVhcnkgMzEsIDE5OThdCisgIEFkZGVkIHR5cGUgY2FzdHMgYW5kIHBhcmVudGhlc2VzIHRvIGFsbCByZXR1cm5zIHRoYXQgcmV0dXJuIGEgdmFsdWUuKFRpbSBXLikKK3ZlcnNpb24gMC45OWIgW0ZlYnJ1YXJ5IDQsIDE5OThdCisgIEFkZGVkIHR5cGUgY2FzdCBwbmdfdWludF8zMiBvbiBtYWxsb2MgZnVuY3Rpb24gY2FsbHMgd2hlcmUgbmVlZGVkLgorICBDaGFuZ2VkIHR5cGUgb2YgbnVtX2hpc3QgZnJvbSBwbmdfdWludF8zMiB0byBpbnQgKHNhbWUgYXMgbnVtX3BhbGV0dGUpLgorICBBZGRlZCBjaGVja3MgZm9yIHJvd2J5dGVzIG92ZXJmbG93LCBpbiBjYXNlIHBuZ19zaXplX3QgaXMgbGVzcyB0aGFuIDMyIGJpdHMuCisgIFJlbmFtZWQgbWFrZWZpbGUuZWxmIHRvIG1ha2VmaWxlLmxueC4KK3ZlcnNpb24gMC45OWMgW0ZlYnJ1YXJ5IDcsIDE5OThdCisgIE1vcmUgdHlwZSBjYXN0aW5nLiAgUmVtb3ZlZCBlcnJvbmVvdXMgb3ZlcmZsb3cgdGVzdCBpbiBwbmdtZW0uYy4KKyAgQWRkZWQgcG5nX2J1ZmZlcmVkX21lbWNweSgpIGFuZCBwbmdfYnVmZmVyZWRfbWVtc2V0KCksIGFwcGx5IHRoZW0gdG8gcm93Ynl0ZXMuCisgIEFkZGVkIFVOSVggbWFudWFsIHBhZ2VzIGxpYnBuZy4zIChpbmNvcnBvcmF0aW5nIGxpYnBuZy50eHQpIGFuZCAgcG5nLjUuCit2ZXJzaW9uIDAuOTlkIFtGZWJydWFyeSAxMSwgMTk5OF0KKyAgUmVuYW1lZCAiZmFyX3RvX25lYXIoKSIgInBuZ19mYXJfdG9fbmVhcigpIgorICBSZXZpc2VkIGxpYnBuZy4zCisgIFZlcnNpb24gOTljICJidWZmZXJlZCIgb3BlcmF0aW9ucyBkaWRuJ3Qgd29yayBhcyBpbnRlbmRlZC4gIFJlcGxhY2VkIHRoZW0KKyAgICB3aXRoIHBuZ19tZW1jcHlfY2hlY2soKSBhbmQgcG5nX21lbXNldF9jaGVjaygpLgorICBBZGRlZCBtYW55ICJpZiAocG5nX3B0ciA9PSBOVUxMKSByZXR1cm4iIHRvIHF1ZWxsIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0CisgICAgdW51c2VkIHBuZ19wdHIsIG1vc3RseSBpbiBwbmdnZXQuYyBhbmQgcG5nc2V0LmMuCisgIENoZWNrIGZvciBvdmVybGVuZ3RoIHRSTlMgY2h1bmsgcHJlc2VudCB3aGVuIGluZGV4ZWQtY29sb3IgUExURSBpcyByZWFkLgorICBDbGVhbmVkIHVwIHNwZWxsaW5nIGVycm9ycyBpbiBsaWJwbmcuMy9saWJwbmcudHh0CisgIENvcnJlY3RlZCBhIHByb2JsZW0gd2l0aCBwbmdfZ2V0X3RSTlMoKSB3aGljaCByZXR1cm5lZCB1bmRlZmluZWQgdHJhbnMgYXJyYXkKK3ZlcnNpb24gMC45OWUgW0ZlYnJ1YXJ5IDI4LCAxOTk4XQorICBDb3JyZWN0ZWQgcG5nX2dldF90Uk5TKCkgYWdhaW4uCisgIEFkZCBwYXJlbnRoZXNlcyBmb3IgZWFzaWVyIHJlYWRpbmcgb2YgcG5nZ2V0LmMsIGZpeGVkICJ8fCIgc2hvdWxkIGJlICImJiIuCisgIFRvdWNoZWQgdXAgZXhhbXBsZS5jIHRvIG1ha2UgbW9yZSBvZiBpdCBjb21waWxlYWJsZSwgYWx0aG91Z2ggdGhlIGVudGlyZQorICAgIGZpbGUgc3RpbGwgY2FuJ3QgYmUgY29tcGlsZWQgKFdpbGxlbSB2YW4gU2NoYWlrKQorICBGaXhlZCBhIGJ1ZyBpbiBwbmdfZG9fc2hpZnQoKSAoQnJ5YW4gVHNhaSkKKyAgQWRkZWQgYSBzcGFjZSBpbiBwbmcuaCBwcm90b3R5cGUgZm9yIHBuZ193cml0ZV9jaHVua19zdGFydCgpCisgIFJlcGxhY2VkIHBuZ3Rlc3QucG5nIHdpdGggb25lIGNyZWF0ZWQgd2l0aCB6bGliIDEuMS4xCisgIENoYW5nZWQgcG5ndGVzdCB0byByZXBvcnQgUEFTUyBldmVuIHdoZW4gZmlsZSBzaXplIGlzIGRpZmZlcmVudCAoSmVhbi1sb3VwIEcuKQorICBDb3JyZWN0ZWQgc29tZSBsb2dpYyBlcnJvcnMgaW4gcG5nX2RvX2ludmVydF9hbHBoYSgpIChDaHJpcyBQYXR0ZXJzb24pCit2ZXJzaW9uIDAuOTlmIFtNYXJjaCA1LCAxOTk4XQorICBDb3JyZWN0ZWQgYSBidWcgaW4gcG5ncHJlYWQoKSBpbnRyb2R1Y2VkIGluIHZlcnNpb24gOTljIChLZXZpbiBCcmFjZXkpCisgIE1vdmVkIG1ha2VmaWxlcyBpbnRvIGEgInNjcmlwdHMiIGRpcmVjdG9yeSwgYW5kIGFkZGVkIElOU1RBTEwgaW5zdHJ1Y3Rpb24gZmlsZQorICBBZGRlZCBtYWtlZmlsZS5vczIgYW5kIHBuZ29zMi5kZWYgKEEuIFphYm9sb3RueSkgYW5kIG1ha2VmaWxlLnMyeCAoVy4gU2Vib2spCisgIEFkZGVkIHBvaW50ZXJzIHRvICJub3RlIG9uIGxpYnBuZyB2ZXJzaW9ucyIgaW4gbWFrZWZpbGUubG54IGFuZCBSRUFETUUKKyAgQWRkZWQgcm93IGNhbGxiYWNrIGZlYXR1cmUgd2hlbiByZWFkaW5nIGFuZCB3cml0aW5nIG5vbnByb2dyZXNzaXZlIHJvd3MKKyAgICAgYW5kIGFkZGVkIGEgdGVzdCBvZiB0aGlzIGZlYXR1cmUgaW4gcG5ndGVzdC5jCisgIEFkZGVkIHVzZXIgdHJhbnNmb3JtIGNhbGxiYWNrcywgd2l0aCB0ZXN0IG9mIHRoZSBmZWF0dXJlIGluIHBuZ3Rlc3QuYwordmVyc2lvbiAwLjk5ZyBbTWFyY2ggNiwgMTk5OCwgbW9ybmluZ10KKyAgTWlub3IgY2hhbmdlcyB0byBwbmd0ZXN0LmMgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZ3MuCisgIFJlbW92ZWQgImJldGEiIGxhbmd1YWdlIGZyb20gZG9jdW1lbnRhdGlvbi4KK3ZlcnNpb24gMC45OWggW01hcmNoIDYsIDE5OTgsIGV2ZW5pbmddCisgIE1pbm9yIGNoYW5nZXMgdG8gcHJldmlvdXMgbWlub3IgY2hhbmdlcyB0byBwbmd0ZXN0LmMKKyAgQ2hhbmdlZCBQTkdfUkVBRF9OT1RfRlVMTFlfU1VQUE9SVEVEIHRvIFBOR19SRUFEX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRAorICBhbmQgYWRkZWQgUE5HX1BST0dSRVNTSVZFX1JFQURfTk9UX1NVUFBPUlRFRCBtYWNybworICBBZGRlZCB1c2VyIHRyYW5zZm9ybSBjYXBhYmlsaXR5CisKK3ZlcnNpb24gMS4wMCBbTWFyY2ggNywgMTk5OF0KKyAgQ2hhbmdlZCBzZXZlcmFsIHR5cGVkZWZzIGluIHBuZ3J1dGlsLmMKKyAgQWRkZWQgbWFrZWZpbGUud2F0IChQYXdlbCBNcm9jaGVuKSwgdXBkYXRlZCBtYWtlZmlsZS50YzMgKFdpbGxlbSB2YW4gU2NoYWlrKQorICByZXBsYWNlZCAid2hpbGUoMSkiIHdpdGggImZvcig7OykiCisgIGFkZGVkIFBOR0FSRygpIHRvIHByb3RvdHlwZXMgaW4gcG5ndGVzdC5jIGFuZCByZW1vdmVkIHNvbWUgcHJvdG90eXBlcworICB1cGRhdGVkIHNvbWUgb2YgdGhlIG1ha2VmaWxlcyAoVG9tIExhbmUpCisgIGNoYW5nZWQgc29tZSB0eXBlZGVmcyAoc19zdGFydCwgZXRjLikgaW4gcG5ncnV0aWwuYworICBmaXhlZCBkaW1lbnNpb25zIG9mICJzaG9ydF9tb250aHMiIGFycmF5IGluIHBuZ3dyaXRlLmMKKyAgUmVwbGFjZWQgYW5zaTJrbnIuYyB3aXRoIHRoZSBvbmUgZnJvbSBqcGVnLXY2CisKK3ZlcnNpb24gMS4wLjAgW01hcmNoIDgsIDE5OThdCisgIENoYW5nZWQgbmFtZSBmcm9tIDEuMDAgdG8gMS4wLjAgKEFkYW0gQ29zdGVsbG8pCisgIEFkZGVkIHNtYWtlZmlsZS5wcGMgKHdpdGggU0NPUFRJT05TLnBwYykgZm9yIEFtaWdhIFBQQyAoQW5kcmVhcyBLbGVpbmVydCkKK3ZlcnNpb24gMS4wLjBhIFtNYXJjaCA5LCAxOTk4XQorICBGaXhlZCB0aHJlZSBidWdzIGluIHBuZ3J0cmFuLmMgdG8gbWFrZSBnYW1tYStiYWNrZ3JvdW5kIGhhbmRsaW5nIGNvbnNpc3RlbnQKKyAgKEdyZWcgUm9lbG9mcykKKyAgQ2hhbmdlZCBmb3JtYXQgb2YgdGhlIFBOR19MSUJQTkdfVkVSIGludGVnZXIgdG8geHl5enogaW5zdGVhZCBvZiB4eXoKKyAgZm9yIG1ham9yLCBtaW5vciwgYW5kIGJ1Z2ZpeCByZWxlYXNlcy4gIFRoaXMgaXMgMTAwMDEuIChBZGFtIENvc3RlbGxvLAorICBUb20gTGFuZSkKKyAgTWFrZSBtb250aHMgcmFuZ2UgZnJvbSAxLTEyIGluIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMKK3ZlcnNpb24gMS4wLjBiIFtNYXJjaCAxMywgMTk5OF0KKyAgUXVpZXRlZCBjb21waWxlciBjb21wbGFpbnRzIGFib3V0IHR3byBlbXB0eSAiZm9yIiBsb29wcyBpbiBwbmdydXRpbC5jCisgIE1pbm9yIGNoYW5nZXMgdG8gbWFrZWZpbGUuczJ4CisgIFJlbW92ZWQgI2lmZGVmLyNlbmRpZiBhcm91bmQgYSBwbmdfZnJlZSgpIGluIHBuZ3JlYWQuYworCit2ZXJzaW9uIDEuMC4xIFtNYXJjaCAxNCwgMTk5OF0KKyAgQ2hhbmdlZCBtYWtlZmlsZS5zMnggdG8gcmVkdWNlIHNlY3VyaXR5IHJpc2sgb2YgdXNpbmcgYSByZWxhdGl2ZSBwYXRobmFtZQorICBGaXhlZCBzb21lIHR5cG9zIGluIHRoZSBkb2N1bWVudGF0aW9uIChHcmVnKS4KKyAgRml4ZWQgYSBwcm9ibGVtIHdpdGggdmFsdWUgb2YgImNoYW5uZWxzIiByZXR1cm5lZCBieSBwbmdfcmVhZF91cGRhdGVfaW5mbygpCit2ZXJzaW9uIDEuMC4xYSBbQXByaWwgMjEsIDE5OThdCisgIE9wdGltaXplZCBQYWV0aCBjYWxjdWxhdGlvbnMgYnkgcmVwbGFjaW5nIGFicygpIGZ1bmN0aW9uIGNhbGxzIHdpdGggaW50cmluc2ljcworICBwbHVzIG90aGVyIGxvb3Agb3B0aW1pemF0aW9ucy4gSW1wcm92ZXMgYXZnIGRlY29kaW5nIHNwZWVkIGJ5IGFib3V0IDIwJS4KKyAgQ29tbWVudGVkIG91dCBpMzg2aXN0aWMgImFsaWduIiBjb21waWxlciBmbGFncyBpbiBtYWtlZmlsZS5sbnguCisgIFJlZHVjZWQgdGhlIGRlZmF1bHQgd2FybmluZyBsZXZlbCBpbiBzb21lIG1ha2VmaWxlcywgdG8gbWFrZSB0aGVtIGNvbnNpc3RlbnQuCisgIFJlbW92ZWQgcmVmZXJlbmNlcyB0byBJSkcgYW5kIEpQRUcgaW4gdGhlIGFuc2kya25yLmMgY29weXJpZ2h0IHN0YXRlbWVudC4KKyAgRml4ZWQgYSBidWcgaW4gcG5nX2RvX3N0cmlwX2ZpbGxlciB3aXRoIFhYUlJHR0JCID0+IFJSR0dCQiB0cmFuc2Zvcm1hdGlvbi4KKyAgQWRkZWQgZ3JheXNjYWxlIGFuZCAxNi1iaXQgY2FwYWJpbGl0eSB0byBwbmdfZG9fcmVhZF9maWxsZXIoKS4KKyAgRml4ZWQgYSBidWcgaW4gcG5nc2V0LmMsIGludHJvZHVjZWQgaW4gdmVyc2lvbiAwLjk5YywgdGhhdCBzZXRzIHJvd2J5dGVzCisgICAgdG9vIGxhcmdlIHdoZW4gd3JpdGluZyBhbiBpbWFnZSB3aXRoIGJpdF9kZXB0aCA8IDggKEJvYiBEZWxsYWNhKS4KKyAgQ29ycmVjdGVkIHNvbWUgYnVncyBpbiB0aGUgZXhwZXJpbWVudGFsIHdlaWdodGVkIGZpbHRlcmluZyBoZXVyaXN0aWNzLgorICBNb3ZlZCBhIG1pc3BsYWNlZCBwbmdydXRpbCBjb2RlIGJsb2NrIHRoYXQgdHJ1bmNhdGVzIHRSTlMgaWYgaXQgaGFzIG1vcmUKKyAgICB0aGFuIG51bV9wYWxldHRlIGVudHJpZXMgLS0gdGVzdCB3YXMgZG9uZSBiZWZvcmUgbnVtX3BhbGV0dGUgd2FzIGRlZmluZWQuCisgIEZpeGVkIGEgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMygpIGJ1ZyB0aGF0IGNvbnZlcnRzIGRheSAzMSB0byAwIChTdGV2ZSBFZGRpbnMpLgorICBDaGFuZ2VkIGNvbXBpbGVyIGZsYWdzIGluIG1ha2VmaWxlLndhdCBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiAoUGF3ZWwgTXJvY2hlbikuCit2ZXJzaW9uIDEuMC4xYiBbTWF5IDIsIDE5OThdCisgIFJlbG9jYXRlZCBwbmdfZG9fZ3JheV90b19yZ2IoKSB3aXRoaW4gcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zKCkgKEdyZWcpLgorICBSZWxvY2F0ZWQgdGhlIHBuZ19jb21wb3NpdGUgbWFjcm9zIGZyb20gcG5ncnRyYW4uYyB0byBwbmcuaCAoR3JlZykuCisgIEFkZGVkIG1ha2VmaWxlLnNjbyAoY29udHJpYnV0ZWQgYnkgTWlrZSBIb3BraXJrKS4KKyAgRml4ZWQgdHdvIGJ1Z3MgKG1pc3NpbmcgZGVmaW5pdGlvbnMgb2YgImlzdG9wIikgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4wLjFhLgorICBGaXhlZCBhIGJ1ZyBpbiBwbmdydHJhbi5jIHRoYXQgd291bGQgc2V0IGNoYW5uZWxzPTUgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzLgorICBNb3JlIHdvcmsgb24gdGhlIFBhZXRoLWZpbHRlcmluZywgYWNoaWV2aW5nIGltcGVyY2VwdGlibGUgc3BlZWR1cCAoQSBLbGVpbmVydCkuCisgIE1vcmUgd29yayBvbiBsb29wIG9wdGltaXphdGlvbiB3aGljaCBtYXkgaGVscCB3aGVuIGNvbXBpbGVkIHdpdGggQysrIGNvbXBpbGVycy4KKyAgQWRkZWQgd2FybmluZ3Mgd2hlbiBwZW9wbGUgdHJ5IHRvIHVzZSB0cmFuc2Zvcm1zIHRoZXkndmUgZGVmaW5lZCBvdXQuCisgIENvbGxhcHNlZCA0ICJpIiBhbmQgImMiIGxvb3BzIGludG8gc2luZ2xlICJpIiBsb29wcyBpbiBwbmdydHJhbiBhbmQgcG5nd3RyYW4uCisgIFJldmlzZWQgcGFyYWdyYXBoIGFib3V0IHBuZ19zZXRfZXhwYW5kKCkgaW4gbGlicG5nLnR4dCBhbmQgbGlicG5nLjMgKEdyZWcpCit2ZXJzaW9uIDEuMC4xYyBbTWF5IDExLCAxOTk4XQorICBGaXhlZCBhIGJ1ZyBpbiBwbmdydHJhbi5jIChpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjAuMWEpIHdoZXJlIHRoZSBtYXNrcyBmb3IKKyAgICBmaWxsZXIgYnl0ZXMgc2hvdWxkIGhhdmUgYmVlbiAweGZmIGluc3RlYWQgb2YgMHhmLgorICBBZGRlZCBtYXhfcGl4ZWxfZGVwdGg9MzIgaW4gcG5ncnV0aWwuYyB3aGVuIHVzaW5nIEZJTExFUiB3aXRoIHBhbGV0dGUgaW1hZ2VzLgorICBNb3ZlZCBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCBhbmQgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorICAgIG91dCBvZiB0aGUgUE5HX1dSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCBibG9jayBvZiBwbmdjb25mLmgKKyAgQWRkZWQgIlBOR19OT19XUklURV9UUkFOU0ZPUk1TIiBldGMuLCBhcyBhbHRlcm5hdGl2ZXMgZm9yICpfTk9UX1NVUFBPUlRFRCwKKyAgICBmb3IgY29uc2lzdGVuY3ksIGluIHBuZ2NvbmYuaAorICBBZGRlZCBpbmRpdmlkdWFsICJpZm5kZWYgUE5HX05PX1tDQVBBQklMSVRZXSIgaW4gcG5nY29uZi5oIHRvIG1ha2UgaXQgZWFzaWVyCisgICAgdG8gcmVtb3ZlIHVud2FudGVkIGNhcGFiaWxpdGllcyB2aWEgdGhlIGNvbXBpbGUgbGluZQorICBNYWRlIHNvbWUgY29ycmVjdGlvbnMgdG8gZ3JhbW1hciAod2hpY2gsIGl0J3MpIGluIGRvY3VtZW50YXRpb24gKEdyZWcpLgorICBDb3JyZWN0ZWQgZXhhbXBsZS5jLCB1c2Ugb2Ygcm93X3BvaW50ZXJzIGluIHBuZ193cml0ZV9pbWFnZSgpLgordmVyc2lvbiAxLjAuMWQgW01heSAyNCwgMTk5OF0KKyAgQ29ycmVjdGVkIHNldmVyYWwgc3RhdGVtZW50cyB0aGF0IHVzZWQgc2lkZSBlZmZlY3RzIGlsbGVnYWxseSBpbiBwbmdydXRpbC5jCisgICAgYW5kIHBuZ3RyYW5zLmMsIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4wLjFiCisgIFJldmlzZWQgcG5nX3JlYWRfcm93cygpIHRvIGF2b2lkIHJlcGVhdGVkIGlmLXRlc3RpbmcgZm9yIE5VTEwgKEEgS2xlaW5lcnQpCisgIE1vcmUgY29ycmVjdGlvbnMgdG8gZXhhbXBsZS5jLCB1c2Ugb2Ygcm93X3BvaW50ZXJzIGluIHBuZ193cml0ZV9pbWFnZSgpCisgICAgYW5kIHBuZ19yZWFkX3Jvd3MoKS4KKyAgQWRkZWQgcG5nZGxsLm1hayBhbmQgcG5nZGVmLnBhcyB0byBzY3JpcHRzIGRpcmVjdG9yeSwgY29udHJpYnV0ZWQgYnkKKyAgICBCb2IgRGVsbGFjYSwgdG8gbWFrZSBhIHBuZzMyYmQuZGxsIHdpdGggQm9ybGFuZCBDKysgNC41CisgIEZpeGVkIGVycm9yIGluIGV4YW1wbGUuYyB3aXRoIHBuZ19zZXRfdGV4dDogbnVtX3RleHQgaXMgMywgbm90IDIgKEd1aWRvIFYuKQorICBDaGFuZ2VkIHNldmVyYWwgbG9vcHMgZnJvbSBjb3VudC1kb3duIHRvIGNvdW50LXVwLCBmb3IgY29uc2lzdGVuY3kuCit2ZXJzaW9uIDEuMC4xZSBbSnVuZSA2LCAxOTk4XQorICBSZXZpc2VkIGxpYnBuZy50eHQgYW5kIGxpYnBuZy4zIGRlc2NyaXB0aW9uIG9mIHBuZ19zZXRfcmVhZHx3cml0ZV9mbigpLCBhbmQKKyAgICBhZGRlZCB3YXJuaW5ncyB3aGVuIHBlb3BsZSB0cnkgdG8gc2V0IHBuZ19yZWFkX2ZuIGFuZCBwbmdfd3JpdGVfZm4gaW4KKyAgICB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisgIEFkZGVkIGEgdGVzdCBzdWNoIHRoYXQgcG5nX2RvX2dhbW1hIHdpbGwgYmUgZG9uZSB3aGVuIG51bV90cmFucz09MAorICAgIGZvciB0cnVlY29sb3IgaW1hZ2VzIHRoYXQgaGF2ZSBkZWZpbmVkIGEgYmFja2dyb3VuZC4gIFRoaXMgY29ycmVjdHMgYW4KKyAgICBlcnJvciB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0wLjkwIHRoYXQgY2FuIGNhdXNlIGdhbW1hIHByb2Nlc3NpbmcKKyAgICB0byBiZSBza2lwcGVkLgorICBBZGRlZCB0ZXN0cyBpbiBwbmcuaCB0byBpbmNsdWRlICJ0cmFucyIgYW5kICJ0cmFuc192YWx1ZXMiIGluIHN0cnVjdHVyZXMKKyAgICB3aGVuIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEIG9yIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgaXMgZGVmaW5lZC4KKyAgQWRkIHBuZ19mcmVlKHBuZ19wdHItPnRpbWVfYnVmZmVyKSBpbiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpCisgIE1vdmVkIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkgZnJvbSBwbmd3cml0ZS5jIHRvIHBuZy5jCisgIEFkZGVkIGNhcGFiaWxpdHkgZm9yIHVzZXItcHJvdmlkZWQgbWFsbG9jX2ZuKCkgYW5kIGZyZWVfZm4oKSBmdW5jdGlvbnMsCisgICAgYW5kIHJldmlzZWQgcG5ndGVzdC5jIHRvIGRlbW9uc3RyYXRlIHRoZWlyIHVzZSwgcmVwbGFjaW5nIHRoZQorICAgIFBOR1RFU1RfREVCVUdfTUVNIGZlYXR1cmUuCisgIEFkZGVkIG1ha2VmaWxlLnczMiwgZm9yIE1pY3Jvc29mdCBDKysgNC4wIGFuZCBsYXRlciAoVGltIFdlZ25lcikuCisKK3ZlcnNpb24gMS4wLjIgW0p1bmUgMTQsIDE5OThdCisgIEZpeGVkIHR3byBidWdzIGluIG1ha2VmaWxlLmJvciAuCit2ZXJzaW9uIDEuMC4yYSBbRGVjZW1iZXIgMzAsIDE5OThdCisgIFJlcGxhY2VkIGFuZCBleHRlbmRlZCBjb2RlIHRoYXQgd2FzIHJlbW92ZWQgZnJvbSBwbmdfc2V0X2ZpbGxlcigpIGluIDEuMC4xYS4KKyAgRml4ZWQgYSBidWcgaW4gcG5nX2RvX2ZpbGxlcigpIHRoYXQgbWFkZSBpdCBmYWlsIHRvIHdyaXRlIGZpbGxlciBieXRlcyBpbgorICAgIHRoZSBsZWZ0LW1vc3QgcGl4ZWwgb2YgZWFjaCByb3cgKEtldmluIEJyYWNleSkuCisgIENoYW5nZWQgInN0YXRpYyBwbmdjaGFycCB0SU1FX3N0cmluZyIgdG8gInN0YXRpYyBjaGFyIHRJTUVfc3RyaW5nWzMwXSIKKyAgICBpbiBwbmd0ZXN0LmMgKER1bmNhbiBTaW1wc29uKS4KKyAgRml4ZWQgYSBidWcgaW4gcG5ndGVzdC5jIHRoYXQgY2F1c2VkIHBuZ3Rlc3QgdG8gdHJ5IHRvIHdyaXRlIGEgdElNRSBjaHVuaworICAgIGV2ZW4gd2hlbiBubyB0SU1FIGNodW5rIHdhcyBwcmVzZW50IGluIHRoZSBzb3VyY2UgZmlsZS4KKyAgRml4ZWQgYSBwcm9ibGVtIGluIHBuZ3J1dGlsLmM6IGdyYXlfdG9fcmdiIGRpZG4ndCBhbHdheXMgd29yayB3aXRoIDE2LWJpdC4KKyAgRml4ZWQgYSBwcm9ibGVtIGluIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdygpLCB3aGljaCB3b3VsZCBub3Qgc2tpcCBzb21lCisgICAgcGFzc2VzIHRoYXQgaXQgc2hvdWxkIHNraXAsIGZvciBpbWFnZXMgdGhhdCBhcmUgbGVzcyB0aGFuIDMgcGl4ZWxzIGhpZ2guCisgIEludGVyY2hhbmdlZCB0aGUgb3JkZXIgb2YgY2FsbHMgdG8gcG5nX2RvX3N3YXAoKSBhbmQgcG5nX2RvX3NoaWZ0KCkKKyAgICBpbiBwbmd3dHJhbi5jIChKb2huIENyb21lcikuCisgIEFkZGVkICNpZmRlZiBQTkdfREVCVUcvI2VuZGlmIHN1cnJvdW5kaW5nIHVzZSBvZiBQTkdfREVCVUcgaW4gcG5nLmggLgorICBDaGFuZ2VkICJiYWQgYWRhcHRpdmUgZmlsdGVyIHR5cGUiIGZyb20gZXJyb3IgdG8gd2FybmluZyBpbiBwbmdydXRpbC5jIC4KKyAgRml4ZWQgYSBkb2N1bWVudGF0aW9uIGVycm9yIGFib3V0IGRlZmF1bHQgZmlsdGVyaW5nIHdpdGggOC1iaXQgaW5kZXhlZC1jb2xvci4KKyAgU2VwYXJhdGVkIHRoZSBQTkdfTk9fU1RESU8gbWFjcm8gaW50byBQTkdfTk9fU1RESU8gYW5kIFBOR19OT19DT05TT0xFX0lPCisgICAgKEwuIFBldGVyIERldXRzY2gpLgorICBBZGRlZCBwbmdfc2V0X3JnYl90b19ncmF5KCkgYW5kIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKCkgZnVuY3Rpb25zLgorICBBZGRlZCBwbmdfZ2V0X2NvcHlyaWdodCgpIGFuZCBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKCkgZnVuY3Rpb25zLgorICBSZXZpc2VkIGNvbW1lbnRzIG9uIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpIGluIGxpYnBuZy50eHQgYW5kIGV4YW1wbGUuYworICBBZGRlZCBpbmZvcm1hdGlvbiBhYm91dCBkZWJ1Z2dpbmcgaW4gbGlicG5nLnR4dCBhbmQgbGlicG5nLjMgLgorICBDaGFuZ2VkICJsbiAtc2YiIHRvICJsbiAtcyAtZiIgaW4gbWFrZWZpbGUuczJ4LCBtYWtlZmlsZS5sbngsIGFuZCBtYWtlZmlsZS5zY28uCisgIFJlbW92ZWQgbGluZXMgYWZ0ZXIgRHluYW1pYyBEZXBlbmRlbmNpZXMiIGluIG1ha2VmaWxlLmFjbyAuCisgIFJldmlzZWQgbWFrZWZpbGUuZGVjIHRvIG1ha2UgYSBzaGFyZWQgbGlicmFyeSAoSmVyZW1pZSBQZXRpdCkuCisgIFJlbW92ZWQgdHJhaWxpbmcgYmxhbmtzIGZyb20gYWxsIGZpbGVzLgordmVyc2lvbiAxLjAuMmEgW0phbnVhcnkgNiwgMTk5OV0KKyAgUmVtb3ZlZCBtaXNwbGFjZWQgI2VuZGlmIGFuZCAjaWZkZWYgUE5HX05PX0VYVEVSTiBuZWFyIHRoZSBlbmQgb2YgcG5nLmgKKyAgQWRkZWQgImlmIiB0ZXN0cyB0byBzaWxlbmNlIGNvbXBsYWludHMgYWJvdXQgdW51c2VkIHBuZ19wdHIgaW4gcG5nLmggYW5kIHBuZy5jCisgIENoYW5nZWQgImNoZWNrX2lmX3BuZyIgZnVuY3Rpb24gaW4gZXhhbXBsZS5jIHRvIHJldHVybiB0cnVlIChub256ZXJvKSBpZiBQTkcuCisgIENoYW5nZWQgbGlicG5nLnR4dCB0byBkZW1vbnN0cmF0ZSBwbmdfc2lnX2NtcCgpIGluc3RlYWQgb2YgcG5nX2NoZWNrX3NpZygpCisgICAgd2hpY2ggaXMgb2Jzb2xldGUuCisKK3ZlcnNpb24gMS4wLjMgW0phbnVhcnkgMTQsIDE5OTldCisgIEFkZGVkIG1ha2VmaWxlLmh1eCwgZm9yIEhld2xldHQgUGFja2FyZCBIUFVYIDEwLjIwIGFuZCAxMS4wMCAoSmltIFJpY2UpCisgIEFkZGVkIGEgc3RhdGVtZW50IG9mIFkySyBjb21wbGlhbmNlIGluIHBuZy5oLCBsaWJwbmcuMywgYW5kIFkyS0lORk8uCit2ZXJzaW9uIDEuMC4zYSBbQXVndXN0IDEyLCAxOTk5XQorICBBZGRlZCBjaGVjayBmb3IgUE5HX1JFQURfSU5URVJMQUNFX1NVUFBPUlRFRCBpbiBwbmdyZWFkLmM7IGlzc3VlIGEgd2FybmluZworICAgICBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVhZCBhbiBpbnRlcmxhY2VkIGltYWdlIHdoZW4gaXQncyBub3Qgc3VwcG9ydGVkLgorICBBZGRlZCBjaGVjayBpZiBwbmdfcHRyLT50cmFucyBpcyBkZWZpbmVkIGJlZm9yZSBmcmVlaW5nIGl0IGluIHBuZ3JlYWQuYworICBNb2RpZmllZCB0aGUgWTJLIHN0YXRlbWVudCB0byBpbmNsdWRlIHZlcnNpb25zIGJhY2sgdG8gdmVyc2lvbiAwLjcxCisgIEZpeGVkIGEgYnVnIGluIHRoZSBjaGVjayBmb3IgdmFsaWQgSUhEUiBiaXRfZGVwdGgvY29sb3JfdHlwZXMgaW4gcG5ncnV0aWwuYworICBNb2RpZmllZCBtYWtlZmlsZS53YXQgKGFkZGVkIC16cDggZmxhZywgIi5zeW1ib2xpYyIsIGNoYW5nZWQgc29tZSBjb21tZW50cykKKyAgUmVwbGFjZWQgbGVhZGluZyBibGFua3Mgd2l0aCB0YWIgY2hhcmFjdGVycyBpbiBtYWtlZmlsZS5odXgKKyAgQ2hhbmdlZCAiZHdvcmtpbi53dXN0bC5lZHUiIHRvICJjY3JjLnd1c3RsLmVkdSIgaW4gdmFyaW91cyBkb2N1bWVudHMuCisgIENoYW5nZWQgKGZsb2F0KXJlZCBhbmQgKGZsb2F0KWdyZWVuIHRvIChkb3VibGUpcmVkLCAoZG91YmxlKWdyZWVuCisgICAgIGluIHBuZ19zZXRfcmdiX3RvX2dyYXkoKSB0byBhdm9pZCAicHJvbW90aW9uIiBwcm9ibGVtcyBpbiBBSVguCisgIEZpeGVkIGEgYnVnIGluIHBuZ2NvbmYuaCB0aGF0IG9taXR0ZWQgPHN0ZGlvLmg+IHdoZW4gUE5HX0RFQlVHPT0wIChLIEJyYWNleSkuCisgIFJlZm9ybWF0dGVkIGxpYnBuZy4zIGFuZCBsaWJwbmdwZi4zIHdpdGggcHJvcGVyIGZvbnRzIChzY3JpcHQgYnkgSi4gdmFuWmFuZHQpLgorICBVcGRhdGVkIGRvY3VtZW50YXRpb24gdG8gcmVmZXIgdG8gdGhlIFBORy0xLjIgc3BlY2lmaWNhdGlvbi4KKyAgUmVtb3ZlZCBhbnNpMmtuci5jIGFuZCBsZWZ0IHBvaW50ZXJzIHRvIHRoZSBsYXRlc3Qgc291cmNlIGZvciBhbnNpMmtuci5jCisgICAgaW4gbWFrZWZpbGUua25yLCBJTlNUQUxMLCBhbmQgUkVBRE1FIChMLiBQZXRlciBEZXV0c2NoKQorICBGaXhlZCBidWdzIGluIGNhbGN1bGF0aW9uIG9mIHRoZSBsZW5ndGggb2Ygcm93Ynl0ZXMgd2hlbiBhZGRpbmcgYWxwaGEKKyAgICBjaGFubmVscyB0byAxNi1iaXQgaW1hZ2VzLCBpbiBwbmdydHJhbi5jIChDaHJpcyBOb2tsZWJlcmcpCisgIEFkZGVkIGZ1bmN0aW9uIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbygpIHRvIHN0b3JlIHVzZXJfdHJhbnNmb3JtX3B0ciwKKyAgICB1c2VyX2RlcHRoLCBhbmQgdXNlcl9jaGFubmVscyBpbnRvIHRoZSBwbmdfc3RydWN0LCBhbmQgYSBmdW5jdGlvbgorICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKCkgdG8gcmV0cmlldmUgdGhlIHBvaW50ZXIgKENocmlzIE5va2xlYmVyZykKKyAgQWRkZWQgZnVuY3Rpb24gcG5nX3NldF9lbXB0eV9wbHRlX3Blcm1pdHRlZCgpIHRvIG1ha2UgbGlicG5nIHVzZWFibGUKKyAgICBpbiBNTkcgYXBwbGljYXRpb25zLgorICBDb3JyZWN0ZWQgdGhlIHR5cGVkZWYgZm9yIHBuZ19mcmVlX3B0ciBpbiBwbmcuaCAoSmVzc2UgSm9uZXMpLgorICBDb3JyZWN0IGdhbW1hIHdpdGggc3JnYiBpcyA0NTQ1NSBpbnN0ZWFkIG9mIDQ1MDAwIGluIHBuZ3J1dGlsLmMsIHRvIGJlCisgICAgY29uc2lzdGVudCB3aXRoIFBORy0xLjIsIGFuZCBhbGxvdyB2YXJpYW5jZSBvZiA1MDAgYmVmb3JlIGNvbXBsYWluaW5nLgorICBBZGRlZCBhc3NlbWJsZXIgY29kZSBjb250cmlidXRlZCBieSBJbnRlbCBpbiBmaWxlIHBuZ3ZjcmQuYyBhbmQgbW9kaWZpZWQKKyAgICBtYWtlZmlsZS53MzIgdG8gdXNlIGl0IChOaXJhdiBDaGhhdHJhcGF0aSwgSU5URUwgQ29ycG9yYXRpb24sIEdpbGxlcyBWb2xsYW50KQorICBDaGFuZ2VkICJsbiAtcyAtZiIgdG8gImxuIC1mIC1zIiBpbiB0aGUgbWFrZWZpbGVzIHRvIG1ha2UgU29sYXJpcyBoYXBweS4KKyAgQWRkZWQgc29tZSBhbGlhc2VzIGZvciBwbmdfc2V0X2V4cGFuZCgpIGluIHBuZ3J0cmFuLmMsIG5hbWVseQorICAgIHBuZ19zZXRfZXhwYW5kX1BMVEUoKSwgcG5nX3NldF9leHBhbmRfZGVwdGgoKSwgYW5kIHBuZ19zZXRfZXhwYW5kX3RSTlMoKQorICAgIChHcmVnIFJvZWxvZnMsIGluICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIikuCisgIEFkZGVkIG1ha2VmaWxlLmJlbyBmb3IgQkVPUyBvbiBYODYsIGNvbnRyaWJ1dGVkIGJ5IFNhbmRlciBTdG9rLgordmVyc2lvbiAxLjAuM2IgW0F1Z3VzdCAyNiwgMTk5OV0KKyAgUmVwbGFjZWQgMjE0NzQ4MzY0N0wgc2V2ZXJhbCBwbGFjZXMgd2l0aCBQTkdfTUFYX1VJTlQgbWFjcm8sIGRlZmluZWQgaW4gcG5nLmgKKyAgQ2hhbmdlZCBsZWFkaW5nIGJsYW5rcyB0byB0YWJzIGluIGFsbCBtYWtlZmlsZXMuCisgIERlZmluZSBQTkdfVVNFX1BOR1ZDUkQgaW4gbWFrZWZpbGUudzMyLCB0byBnZXQgTU1YIGFzc2VtYmxlciBjb2RlLgorICBNYWRlIGFsdGVybmF0ZSB2ZXJzaW9ucyBvZiAgcG5nX3NldF9leHBhbmQoKSBpbiBwbmdydHJhbi5jLCBuYW1lbHkKKyAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCwgcG5nX3NldF9wYWxldHRlX3RvX3JnYiwgYW5kIHBuZ19zZXRfdFJOU190b19hbHBoYQorICAgIChHcmVnIFJvZWxvZnMsIGluICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIikuICBEZWxldGVkIHRoZSAxLjAuM2EgYWxpYXNlcy4KKyAgUmVsb2NhdGVkIHN0YXJ0IG9mICdleHRlcm4gIkMiJyBibG9jayBpbiBwbmcuaCBzbyBpdCBkb2Vzbid0IGluY2x1ZGUgcG5nY29uZi5oCisgIFJldmlzZWQgY2FsY3VsYXRpb24gb2YgbnVtX2Jsb2NrcyBpbiBwbmdtZW0uYyB0byBhdm9pZCBhIHBvdGVudGlhbGx5CisgICAgbmVnYXRpdmUgc2hpZnQgZGlzdGFuY2UsIHdob3NlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpbiB0aGUgQyBsYW5ndWFnZS4KKyAgQWRkZWQgYSBjaGVjayBpbiBwbmdzZXQuYyB0byBwcmV2ZW50IHdyaXRpbmcgbXVsdGlwbGUgdElNRSBjaHVua3MuCisgIEFkZGVkIGEgY2hlY2sgaW4gcG5nd3JpdGUuYyB0byBkZXRlY3QgaW52YWxpZCBzbWFsbCB3aW5kb3dfYml0cyBzaXplcy4KK3ZlcnNpb24gMS4wLjNkIFtTZXB0ZW1iZXIgNCwgMTk5OV0KKyAgRml4ZWQgdHlwZSBjYXN0aW5nIG9mIGlnYW1tYSBpbiBwbmdydXRpbC5jCisgIEFkZGVkIG5ldyBwbmdfZXhwYW5kIGZ1bmN0aW9ucyB0byBzY3JpcHRzL3BuZ2RlZi5wYXMgYW5kIHBuZ29zMi5kZWYKKyAgQWRkZWQgYSBkZW1vIHJlYWRfdXNlcl90cmFuc2Zvcm1fZm4gdGhhdCBleGFtaW5lcyB0aGUgcm93IGZpbHRlcnMgaW4gcG5ndGVzdC5jCisKK3ZlcnNpb24gMS4wLjQgW1NlcHRlbWJlciAyNCwgMTk5OV0KKyAgRGVmaW5lIFBOR19BTFdBWVNfRVhURVJOIGluIHBuZ2NvbmYuaCBpZiBfX1NURENfXyBpcyBkZWZpbmVkCisgIERlbGV0ZSAjZGVmaW5lIFBOR19JTlRFUk5BTCBhbmQgaW5jbHVkZSAicG5nLmgiIGZyb20gcG5nYXNtcmQuaAorICBNYWRlIHNldmVyYWwgbWlub3IgY29ycmVjdGlvbnMgdG8gcG5ndGVzdC5jCisgIFJlbmFtZWQgdGhlIG1ha2VmaWxlcyB3aXRoIGxvbmdlciBidXQgbW9yZSB1c2VyIGZyaWVuZGx5IGV4dGVuc2lvbnMuCisgIENvcGllZCB0aGUgUE5HIGNvcHlyaWdodCBhbmQgbGljZW5zZSB0byBhIHNlcGFyYXRlIExJQ0VOU0UgZmlsZS4KKyAgUmV2aXNlZCBkb2N1bWVudGF0aW9uLCBwbmcuaCwgYW5kIGV4YW1wbGUuYyB0byByZW1vdmUgcmVmZXJlbmNlIHRvCisgICAgInZpZXdpbmdfZ2FtbWEiIHdoaWNoIG5vIGxvbmdlciBhcHBlYXJzIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbi4KKyAgUmV2aXNlZCBwbmd2Y3JkLmMgdG8gdXNlIE1NWCBjb2RlIGZvciBpbnRlcmxhY2luZyBvbmx5IG9uIHRoZSBmaW5hbCBwYXNzLgorICBVcGRhdGVkIHBuZ3ZjcmQuYyB0byB1c2UgdGhlIGZhc3RlciBDIGZpbHRlciBhbGdvcml0aG1zIGZyb20gbGlicG5nLTEuMC4xYQorICBTcGxpdCBtYWtlZmlsZS53aW4zMnZjIGludG8gdHdvIHZlcnNpb25zLCBtYWtlZmlsZS52Y2F3aW4zMiAodXNlcyBNTVgKKyAgICBhc3NlbWJsZXIgY29kZSkgYW5kIG1ha2VmaWxlLnZjd2luMzIgKGRvZXNuJ3QpLgorICBBZGRlZCBhIENQVSB0aW1pbmcgcmVwb3J0IHRvIHBuZ3Rlc3QuYyAoZW5hYmxlZCBieSBkZWZpbmluZyBQTkdURVNUX1RJTUlORykKKyAgQWRkZWQgYSBjb3B5IG9mIHBuZ25vdy5wbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbi4KK3ZlcnNpb24gMS4wLjRhIFtTZXB0ZW1iZXIgMjUsIDE5OTldCisgIEluY3JlYXNlIG1heF9waXhlbF9kZXB0aCBpbiBwbmdydXRpbC5jIGlmIGEgdXNlciB0cmFuc2Zvcm0gbmVlZHMgaXQuCisgIENoYW5nZWQgc2V2ZXJhbCBkaXZpc2lvbiBvcGVyYXRpb25zIHRvIHJpZ2h0LXNoaWZ0cyBpbiBwbmd2Y3JkLmMKK3ZlcnNpb24gMS4wLjRiIFtTZXB0ZW1iZXIgMzAsIDE5OTldCisgIEFkZGVkIHBhcmVudGhlc2VzIGluIGxpbmUgMzczMiBvZiBwbmd2Y3JkLmMKKyAgQWRkZWQgYSBjb21tZW50IGluIG1ha2VmaWxlLmxpbnV4IHdhcm5pbmcgYWJvdXQgYnVnZ3kgLU8zIGluIHBnY2MgMi45NS4xCit2ZXJzaW9uIDEuMC40YyBbT2N0b2JlciAxLCAxOTk5XQorICBBZGRlZCBhICJwbmdfY2hlY2tfdmVyc2lvbiIgZnVuY3Rpb24gaW4gcG5nLmMgYW5kIHBuZ3Rlc3QuYyB0aGF0IHdpbGwgZ2VuZXJhdGUKKyAgICBhIGhlbHBmdWwgY29tcGlsZXIgZXJyb3IgaWYgYW4gb2xkIHBuZy5oIGlzIGZvdW5kIGluIHRoZSBzZWFyY2ggcGF0aC4KKyAgQ2hhbmdlZCB0eXBlIG9mIHBuZ191c2VyX3RyYW5zZm9ybV9kZXB0aHxjaGFubmVscyBmcm9tIGludCB0byBwbmdfYnl0ZS4KK3ZlcnNpb24gMS4wLjRkIFtPY3RvYmVyIDYsIDE5OTldCisgIENoYW5nZWQgMC40NSB0byAwLjQ1NDU1IGluIHBuZ19zZXRfc1JHQigpCisgIFJlbW92ZWQgdW51c2VkIFBMVEUgZW50cmllcyBmcm9tIHBuZ25vdy5wbmcKKyAgUmUtZW5hYmxlZCBzb21lIHBhcnRzIG9mIHBuZ3ZjcmQuYyAocG5nX2NvbWJpbmVfcm93KSB0aGF0IHdvcmsgcHJvcGVybHkuCit2ZXJzaW9uIDEuMC40ZSBbT2N0b2JlciAxMCwgMTk5OV0KKyAgRml4ZWQgc2lnbiBlcnJvciBpbiBwbmd2Y3JkLmMgKEdyZWcgUm9lbG9mcykKKyAgUmVwbGFjZWQgc29tZSBpbnN0YW5jZXMgb2YgbWVtY3B5IHdpdGggc2ltcGxlIGFzc2lnbm1lbnRzIGluIHBuZ3ZjcmQgKEdSLVApCit2ZXJzaW9uIDEuMC40ZiBbT2N0b2JlciAxNSwgMTk5OV0KKyAgU3Vycm91bmRlZCBleGFtcGxlLmMgY29kZSB3aXRoICNpZiAwIC4uICNlbmRpZiB0byBwcmV2ZW50IHBlb3BsZSBmcm9tCisgICAgaW5hZHZlcnRlbnRseSB0cnlpbmcgdG8gY29tcGlsZSBpdC4KKyAgQ2hhbmdlZCBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKCkgZnJvbSBhIGZ1bmN0aW9uIHRvIGEgbWFjcm8gaW4gcG5nLmgKKyAgQWRkZWQgdHlwZSBjYXN0aW5nIG1vc3RseSBpbiBwbmdydHJhbi5jIGFuZCBwbmd3dHJhbi5jCisgIFJlbW92ZWQgc29tZSBwb2ludGxlc3MgInB0ciA9IE5VTEwiIGluIHBuZ21lbS5jCisgIEFkZGVkIGEgImNvbnRyaWIiIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2UgY29kZSBmcm9tIEdyZWcncyBib29rLgorCit2ZXJzaW9uIDEuMC41IFtPY3RvYmVyIDE1LCAxOTk5XQorICBNaW5vciBlZGl0aW5nIG9mIHRoZSBJTlNUQUxMIGFuZCBSRUFETUUgZmlsZXMuCit2ZXJzaW9uIDEuMC41YSBbT2N0b2JlciAyMywgMTk5OV0KKyAgQWRkZWQgY29udHJpYi9wbmdzdWl0ZSBhbmQgY29udHJpYi9wbmdtaW51cyAoV2lsbGVtIHZhbiBTY2hhaWspCisgIEZpeGVkIGEgdHlwbyBpbiB0aGUgcG5nX3NldF9zUkdCKCkgZnVuY3Rpb24gY2FsbCBpbiBleGFtcGxlLmMgKEphbiBOaWp0bWFucykKKyAgRnVydGhlciBvcHRpbWl6YXRpb24gYW5kIGJ1Z2ZpeCBvZiBwbmd2Y3JkLmMKKyAgUmV2aXNlZCBwbmdzZXQuYyBzbyB0aGF0IGl0IGRvZXMgbm90IGFsbG9jYXRlIG9yIGZyZWUgbWVtb3J5IGluIHRoZSB1c2VyJ3MKKyAgICB0ZXh0X3B0ciBzdHJ1Y3R1cmUuICBJbnN0ZWFkLCBpdCBtYWtlcyBpdHMgb3duIGNvcHkuCisgIENyZWF0ZWQgc2VwYXJhdGUgd3JpdGVfZW5kX2luZm9fc3RydWN0IGluIHBuZ3Rlc3QuYyBmb3IgYSBtb3JlIHNldmVyZSB0ZXN0LgorICBBZGRlZCBjb2RlIGluIHBuZ3dyaXRlLmMgdG8gZnJlZSBpbmZvX3B0ci0+dGV4dFtpXS5rZXkgdG8gc3RvcCBhIG1lbW9yeSBsZWFrLgordmVyc2lvbiAxLjAuNWIgW05vdmVtYmVyIDIzLCAxOTk5XQorICBNb3ZlZCBQTkdfRkxBR19IQVZFX0NIVU5LX0hFQURFUiwgUE5HX0ZMQUdfQkFDS0dST1VORF9JU19HUkFZIGFuZAorICAgIFBOR19GTEFHX1dST1RFX3RJTUUgZnJvbSBmbGFncyB0byBtb2RlLgorICBBZGRlZCBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSgpIGZ1bmN0aW9uLgorICBGaXhlZCBzb21lIHR5cGVjYXN0aW5nIGluIGNvbnRyaWIvZ3JlZ2Jvb2svKi5jCisgIFVwZGF0ZWQgc2NyaXB0cy9tYWtldm1zLmNvbSBhbmQgYWRkZWQgbWFrZXZtcy5jb20gdG8gY29udHJpYi9ncmVnYm9vaworICAgIGFuZCBjb250cmliL3BuZ21pbnVzIChNYXJ0aW4gWmluc2VyKQordmVyc2lvbiAxLjAuNWMgW05vdmVtYmVyIDI2LCAxOTk5XQorICBNb3ZlZCBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uIGZyb20gcG5nLmggdG8gcG5nLmMsIHRvIGFjY29tbW9kYXRlIGFuc2kya25yLgorICBSZW1vdmVkIGFsbCBnbG9iYWwgYXJyYXlzIChhY2NvcmRpbmcgdG8gUE5HX05PX0dMT0JBTF9BUlJBWVMgbWFjcm8pLCB0bworICAgIGFjY29tbW9kYXRlIG1ha2luZyBETEwnczogTW92ZWQgdXNyX3BuZ192ZXIgZnJvbSBnbG9iYWwgdmFyaWFibGUgdG8gZnVuY3Rpb24KKyAgICBwbmdfZ2V0X2hlYWRlcl92ZXIoKSBpbiBwbmcuYy4gIE1vdmVkIHBuZ19zaWcgdG8gcG5nX3NpZ19ieXRlcyBpbiBwbmcuYyBhbmQKKyAgICBlbGltaW5hdGVkIHVzZSBvZiBwbmdfc2lnIGluIHBuZ3d1dGlsLmMuICBNb3ZlZCB0aGUgdmFyaW91cyBwbmdfQ0hOSyBhcnJheXMKKyAgICBpbnRvIHBuZ3R5cGVzLmguICBFbGltaW5hdGVkIHVzZSBvZiBnbG9iYWwgcG5nX3Bhc3MgYXJyYXlzLiAgRGVjbGFyZWQgdGhlCisgICAgcG5nX0NITksgYW5kIHBuZ19wYXNzIGFycmF5cyB0byBiZSAiY29uc3QiLiAgTWFkZSB0aGUgZ2xvYmFsIGFycmF5cworICAgIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgKGFsdGhvdWdoIG5vbmUgYXJlIHVzZWQgaW4gbGlicG5nIGl0c2VsZikgd2hlbgorICAgIFBOR19OT19HTE9CQUxfQVJSQVlTIGlzIG5vdCBkZWZpbmVkIG9yIHdoZW4gUE5HX0dMT0JBTF9BUlJBWVMgaXMgZGVmaW5lZC4KKyAgUmVtb3ZlZCBzb21lIGV4dHJhbmVvdXMgIi1JIiBmcm9tIGNvbnRyaWIvcG5nbWludXMvbWFrZWZpbGUuc3RkCisgIENoYW5nZWQgdGhlIFBOR19zUkdCX0lOVEVOVCBtYWNyb3MgaW4gcG5nLmggdG8gYmUgY29uc2lzdGVudCB3aXRoIFBORy0xLjIuCisgIENoYW5nZSBQTkdfU1JHQl9JTlRFTlQgdG8gUE5HX3NSR0JfSU5URU5UIGluIGxpYnBuZy50eHQgYW5kIGxpYnBuZy4zCit2ZXJzaW9uIDEuMC41ZCBbTm92ZW1iZXIgMjksIDE5OTldCisgIEFkZCB0eXBlIGNhc3QgKHBuZ19jb25zdF9jaGFycCkgdHdvIHBsYWNlcyBpbiBwbmcuYworICBFbGltaW5hdGVkIHBuZ3R5cGVzLmg7IHVzZSBtYWNyb3MgaW5zdGVhZCB0byBkZWNsYXJlIFBOR19DSE5LIGFycmF5cy4KKyAgUmVuYW1lZCAiUE5HX0dMT0JBTF9BUlJBWVMiIHRvICJQTkdfVVNFX0dMT0JBTF9BUlJBWVMiIGFuZCBtYWRlIGF2YWlsYWJsZQorICAgIHRvIGFwcGxpY2F0aW9ucyBhIG1hY3JvICJQTkdfVVNFX0xPQ0FMX0FSUkFZUyIuCisgIFJlbW92ZSBhbGwgdGhlIG5ldyBkZWNsYXJhdGlvbnMgd2l0aCAjaWZkZWYvI2VuZGlmIHdoZW4KKyAgICBQTkdfVVNFX0dMT0JBTF9BUlJBWVMgaXMgZGVmaW5lZC4KKyAgQWRkZWQgUE5HX0VYUE9SVF9WQVIgbWFjcm8gdG8gYWNjb21tb2RhdGUgbWFraW5nIERMTCdzLgordmVyc2lvbiAxLjAuNWUgW05vdmVtYmVyIDMwLCAxOTk5XQorICBBZGRlZCBpQ0NQLCBpVFh0LCBhbmQgc1BMVCBzdXBwb3J0OyBhZGRlZCAibGFuZyIgbWVtYmVyIHRvIHRoZSBwbmdfdGV4dAorICAgIHN0cnVjdHVyZTsgcmVmYWN0b3JlZCB0aGUgaW5mbGF0ZS9kZWZsYXRlIHN1cHBvcnQgdG8gbWFrZSBhZGRpbmcgbmV3IGNodW5rcworICAgIHdpdGggdHJhaWxpbmcgY29tcHJlc3NlZCBwYXJ0cyBlYXNpZXIgaW4gdGhlIGZ1dHVyZSwgYW5kIGFkZGVkIG5ldyBmdW5jdGlvbnMKKyAgICBwbmdfZnJlZV9pQ0NQLCBwbmdfZnJlZV9wQ0FMLCBwbmdfZnJlZV9zUExULCBwbmdfZnJlZV90ZXh0LCBwbmdfZ2V0X2lDQ1AsCisgICAgcG5nX2dldF9zcGFsZXR0ZXMsIHBuZ19zZXRfaUNDUCwgcG5nX3NldF9zcGFsZXR0ZXMgKEVyaWMgUy4gUmF5bW9uZCkuCisgIE5PVEU6IEFwcGxpY2F0aW9ucyB0aGF0IHdyaXRlIHRleHQgY2h1bmtzIE1VU1QgZGVmaW5lIHBuZ190ZXh0LT5sYW5nCisgICAgYmVmb3JlIGNhbGxpbmcgcG5nX3NldF90ZXh0KCkuIEl0IG11c3QgYmUgc2V0IHRvIE5VTEwgaWYgeW91IHdhbnQgdG8KKyAgICB3cml0ZSB0RVh0IG9yIHpUWHQgY2h1bmtzLiAgSWYgeW91IHdhbnQgeW91ciBhcHBsaWNhdGlvbiB0byBiZSBhYmxlIHRvCisgICAgcnVuIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgbGlicG5nLCB1c2UKKworICAgICAgI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorICAgICAgICAgcG5nX3RleHRbaV0ubGFuZyA9IE5VTEw7CisgICAgICAjZW5kaWYKKworICBDaGFuZ2VkIHBuZ19nZXRfb0ZGcygpIGFuZCBwbmdfc2V0X29GRnMoKSB0byB1c2Ugc2lnbmVkIHJhdGhlciB0aGFuIHVuc2lnbmVkCisgICAgb2Zmc2V0cyAoRXJpYyBTLiBSYXltb25kKS4KKyAgQ29tYmluZWQgUE5HX1JFQURfY0hOS19TVVBQT1JURUQgYW5kIFBOR19XUklURV9jSE5LX1NVUFBPUlRFRCBtYWNyb3MgaW50bworICAgIFBOR19jSE5LX1NVUFBPUlRFRCBhbmQgY29tYmluZWQgdGhlIHRocmVlIHR5cGVzIG9mIFBOR190ZXh0X1NVUFBPUlRFRAorICAgIG1hY3JvcywgbGVhdmluZyB0aGUgc2VwYXJhdGUgbWFjcm9zIGFsc28gYXZhaWxhYmxlLgorICBSZW1vdmVkIGNvbW1lbnRzIG9uICNlbmRpZnMgYXQgdGhlIGVuZCBvZiBtYW55IHNob3J0LCBub24tbmVzdGVkICNpZi1ibG9ja3MuCit2ZXJzaW9uIDEuMC41ZiBbRGVjZW1iZXIgNiwgMTk5OV0KKyAgQ2hhbmdlZCBtYWtlZmlsZS5zb2xhcmlzIHRvIGlzc3VlIGEgd2FybmluZyBhYm91dCBwb3RlbnRpYWwgcHJvYmxlbXMgd2hlbgorICAgIHRoZSB1Y2IgImxkIiBpcyBpbiB0aGUgcGF0aCBhaGVhZCBvZiB0aGUgY2NzICJsZCIuCisgIFJlbW92ZWQgIi0gW2RhdGVdIiBmcm9tIHRoZSAic3lub3BzaXMiIGxpbmUgaW4gbGlicG5nLjMgYW5kIGxpYnBuZ3BmLjMuCisgIEFkZGVkIHNDQUwgY2h1bmsgc3VwcG9ydCAoRXJpYyBTLiBSYXltb25kKS4KK3ZlcnNpb24gMS4wLjVnIFtEZWNlbWJlciA3LCAxOTk5XQorICBGaXhlZCAicG5nX2ZyZWVfc3BhbGxldHRlcyIgdHlwbyBpbiBwbmcuaAorICBBZGRlZCBjb2RlIHRvIGhhbmRsZSBuZXcgY2h1bmtzIGluIHBuZ3ByZWFkLmMKKyAgTW92ZWQgUE5HX0NITksgc3RyaW5nIG1hY3JvIGRlZmluaXRpb25zIG91dHNpZGUgb2YgUE5HX05PX0VYVEVSTiBibG9jaworICBBZGRlZCAidHJhbnNsYXRlZF9rZXkiIHRvIHBuZ190ZXh0IHN0cnVjdHVyZSBhbmQgcG5nX3dyaXRlX2lUWHQoKS4KKyAgQWRkZWQgY29kZSBpbiBwbmd3cml0ZS5jIHRvIHdvcmsgYXJvdW5kIGEgbmV3bHkgZGlzY292ZXJlZCB6bGliIGJ1Zy4KK3ZlcnNpb24gMS4wLjVoIFtEZWNlbWJlciAxMCwgMTk5OV0KKyAgTk9URTogcmVnYXJkaW5nIHRoZSBub3RlIGZvciB2ZXJzaW9uIDEuMC41ZSwgdGhlIGZvbGxvd2luZyBtdXN0IGFsc28KKyAgICBiZSBpbmNsdWRlZCBpbiB5b3VyIGNvZGU6CisgICAgICAgIHBuZ190ZXh0W2ldLnRyYW5zbGF0ZWRfa2V5ID0gTlVMTDsKKyAgVW5rbm93biBjaHVuayBoYW5kbGluZyBpcyBub3cgc3VwcG9ydGVkLgorICBPcHRpb24gdG8gZWxpbWluYXRlIGFsbCBmbG9hdGluZyBwb2ludCBzdXBwb3J0IHdhcyBhZGRlZC4gIFNvbWUgbmV3CisgICAgZml4ZWQtcG9pbnQgZnVuY3Rpb25zIHN1Y2ggYXMgcG5nX3NldF9nQU1BX2ZpeGVkKCkgd2VyZSBhZGRlZC4KKyAgRXhwYW5kZWQgdGFicyBhbmQgcmVtb3ZlZCB0cmFpbGluZyBibGFua3MgaW4gc291cmNlIGZpbGVzLgordmVyc2lvbiAxLjAuNWkgW0RlY2VtYmVyIDEzLCAxOTk5XQorICBBZGRlZCBzb21lIHR5cGUgY2FzdHMgdG8gc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncy4KKyAgUmVuYW1lZCAicG5nX2ZyZWVfc3BhbGV0dGUiIHRvICJwbmdfZnJlZV9zcGFsZXR0ZXMiIGZvciBjb25zaXN0ZW5jeS4KKyAgUmVtb3ZlZCBsZWFkaW5nIGJsYW5rcyBmcm9tIGEgI2RlZmluZSBpbiBwbmd2Y3JkLmMKKyAgQWRkZWQgc29tZSBwYXJhbWV0ZXJzIHRvIHRoZSBuZXcgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkgZnVuY3Rpb24uCisgIEFkZGVkIGEgdGVzdCBmb3IgdXAtPmxvY2F0aW9uICE9IDAgaW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHdyaXRpbmcKKyAgICB1bmtub3duIGNodW5rcyBpbiBwbmd3cml0ZS5jCisgIENoYW5nZWQgIm51bSIgdG8gImkiIGluIHBuZ19mcmVlX3NwYWxldHRlcygpIGFuZCBwbmdfZnJlZV91bmtub3ducygpIHRvCisgICAgcHJldmVudCByZWN1cnNpb24uCisgIEFkZGVkIHBuZ19mcmVlX2hJU1QoKSBmdW5jdGlvbi4KKyAgVmFyaW91cyBwYXRjaGVzIHRvIGZpeCBidWdzIGluIHRoZSBzQ0FMIGFuZCBpbnRlZ2VyIGNIUk0gcHJvY2Vzc2luZywKKyAgICBhbmQgdG8gYWRkIHNvbWUgY29udmVuaWVuY2UgbWFjcm9zIGZvciB1c2Ugd2l0aCBzQ0FMLgordmVyc2lvbiAxLjAuNWogW0RlY2VtYmVyIDIxLCAxOTk5XQorICBDaGFuZ2VkICJ1bml0IiBwYXJhbWV0ZXIgb2YgcG5nX3dyaXRlX3NDQUwgZnJvbSBwbmdfYnl0ZSB0byBpbnQsIHRvIHdvcmsKKyAgICBhcm91bmQgYnVnZ3kgY29tcGlsZXJzLgorICBBZGRlZCBuZXcgdHlwZSAicG5nX2ZpeGVkX3BvaW50IiBmb3IgaW50ZWdlcnMgdGhhdCBob2xkIGZsb2F0KjEwMDAwMCB2YWx1ZXMKKyAgUmVzdG9yZWQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvZiB0RVh0L3pUWHQgY2h1bmsgcHJvY2Vzc2luZzoKKyAgICBSZXN0b3JlZCB0aGUgZmlyc3QgZm91ciBtZW1iZXJzIG9mIHBuZ190ZXh0IHRvIHRoZSBzYW1lIG9yZGVyIGFzIHYuMS4wLjVkLgorICAgIEFkZGVkIG1lbWJlcnMgImxhbmdfa2V5IiBhbmQgIml0eHRfbGVuZ3RoIiB0byBwbmdfdGV4dCBzdHJ1Y3QuICBTZXQKKyAgICB0ZXh0X2xlbmd0aD0wIHdoZW4gInRleHQiIGNvbnRhaW5zIGlUWHQgZGF0YS4gIFVzZSB0aGUgImNvbXByZXNzaW9uIgorICAgIG1lbWJlciB0byBkaXN0aW5ndWlzaCBhbW9uZyB0RVh0L3pUWHQvaVRYdCB0eXBlcy4gIEFkZGVkCisgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORSAoMSkgYW5kIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQoMikgbWFjcm9zLgorICAgIFRoZSAiTm90ZSIgYWJvdmUsIGFib3V0IGJhY2t3YXJkIGluY29tcGF0aWJpbGl0eSBvZiBsaWJwbmctMS4wLjVlLCBubworICAgIGxvbmdlciBhcHBsaWVzLgorICBGaXhlZCBwbmdfcmVhZHx3cml0ZV9pVFh0KCkgdG8gcmVhZHx3cml0ZSBwYXJhbWV0ZXJzIGluIHRoZSByaWdodCBvcmRlciwKKyAgICBhbmQgdG8gd3JpdGUgdGhlIGlUWHQgY2h1bmsgYWZ0ZXIgSURBVCBpZiBpdCBhcHBlYXJzIGluIHRoZSBlbmRfcHRyLgorICBBZGRlZCBwbmdnY2NyZC5jLCB2ZXJzaW9uIG9mIHBuZ3ZjcmQuYyBJbnRlbCBhc3NlbWJsZXIgZm9yIGdjYyAoR3JlZyBSb2Vsb2ZzKQorICBSZXZlcnNlZCB0aGUgb3JkZXIgb2YgdHJ5aW5nIHRvIHdyaXRlIGZsb2F0aW5nLXBvaW50IGFuZCBmaXhlZC1wb2ludCBnQU1BLgordmVyc2lvbiAxLjAuNWsgW0RlY2VtYmVyIDI3LCAxOTk5XQorICBBZGRlZCBtYW55IHBhcmVudGhlc2VzLCBlLmcuLCAiaWYgKGEgJiYgYiAmIGMpIiBiZWNvbWVzICJpZiAoYSAmJiAoYiAmIGMpKSIKKyAgQWRkZWQgcG5nX2hhbmRsZV9hc191bmtub3duKCkgZnVuY3Rpb24gKEdsZW5uKQorICBBZGRlZCBwbmdfZnJlZV9jaHVua19saXN0KCkgZnVuY3Rpb24gYW5kIGNodW5rX2xpc3QgYW5kIG51bV9jaHVua19saXN0IG1lbWJlcnMKKyAgICBvZiBwbmdfcHRyLgorICBFbGltaW5hdGVkIGVycm9uZW91cyB3YXJuaW5ncyBhYm91dCBtdWx0aXBsZSBzUExUIGNodW5rcyBhbmQgc1BMVC1hZnRlci1QTFRFLgorICBGaXhlZCBhIGxpYnBuZy0xLjAuNWggYnVnIGluIHBuZ3J1dGlsLmMgdGhhdCB3YXMgaXNzdWluZyBlcnJvbmVvdXMgd2FybmluZ3MKKyAgICBhYm91dCBpZ25vcmluZyBpbmNvcnJlY3QgZ0FNQSB3aXRoIHNSR0IgKGdBTUEgd2FzIGluIGZhY3Qgbm90IGlnbm9yZWQpCisgIEFkZGVkIHBuZ19mcmVlX3RSTlMoKTsgcG5nX3NldF90Uk5TKCkgbm93IG1hbGxvYydzIGl0cyBvd24gdHJhbnMgYXJyYXkgKEVTUikuCisgIERlZmluZSBwbmdfZ2V0X2ludF8zMiB3aGVuIG9GRnMgY2h1bmsgaXMgc3VwcG9ydGVkIGFzIHdlbGwgYXMgd2hlbiBwQ0FMIGlzLgorICBDaGFuZ2VkIHR5cGUgb2YgcHJvZmxlbiBmcm9tIHBuZ19pbnRfMzIgdG8gcG5nX3VpbnRfMzIgaW4gcG5nX2dldF9pQ0NQKCkuCit2ZXJzaW9uIDEuMC41bCBbSmFudWFyeSAxLCAyMDAwXQorICBBZGRlZCBmdW5jdGlvbnMgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4oKSBhbmQgcG5nX2dldF91c2VyX2NodW5rX3B0cigpCisgICAgZm9yIHNldHRpbmcgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdW5rbm93biBjaHVua3MgYW5kIGZvcgorICAgIHJldHJpZXZpbmcgdGhlIGFzc29jaWF0ZWQgdXNlciBwb2ludGVyIChHbGVubikuCit2ZXJzaW9uIDEuMC41bSBbSmFudWFyeSA3LCAyMDAwXQorICBBZGRlZCBoaWdoLWxldmVsIGZ1bmN0aW9ucyBwbmdfcmVhZF9wbmcoKSwgcG5nX3dyaXRlX3BuZygpLCBwbmdfZnJlZV9waXhlbHMoKS4KK3ZlcnNpb24gMS4wLjVuIFtKYW51YXJ5IDksIDIwMDBdCisgIEFkZGVkIHBuZ19mcmVlX1BMVEUoKSBmdW5jdGlvbiwgYW5kIG1vZGlmaWVkIHBuZ19zZXRfUExURSgpIHRvIG1hbGxvYyBpdHMKKyAgICBvd24gbWVtb3J5IGZvciBpbmZvX3B0ci0+cGFsZXR0ZS4gIFRoaXMgbWFrZXMgaXQgc2FmZSBmb3IgdGhlIGNhbGxpbmcKKyAgICBhcHBsaWNhdGlvbiB0byBmcmVlIGl0cyBjb3B5IG9mIHRoZSBwYWxldHRlIGFueSB0aW1lIGFmdGVyIGl0IGNhbGxzCisgICAgcG5nX3NldF9QTFRFKCkuCit2ZXJzaW9uIDEuMC41byBbSmFudWFyeSAyMCwgMjAwMF0KKyAgQ29zbWV0aWMgY2hhbmdlcyBvbmx5IChyZW1vdmVkIHNvbWUgdHJhaWxpbmcgYmxhbmtzIGFuZCBUQUJzKQordmVyc2lvbiAxLjAuNXAgW0phbnVhcnkgMzEsIDIwMDBdCisgIFJlbmFtZWQgcG5nZGxsLm1hayB0byBtYWtlZmlsZS5iZDMyCisgIENvc21ldGljIGNoYW5nZXMgaW4gcG5ndGVzdC5jCit2ZXJzaW9uIDEuMC41cSBbRmVicnVhcnkgNSwgMjAwMF0KKyAgUmVsb2NhdGVkIHRoZSBtYWtlZmlsZS5zb2xhcmlzIHdhcm5pbmcgYWJvdXQgUEFUSCBwcm9ibGVtcy4KKyAgRml4ZWQgcG5ndmNyZC5jIGJ1ZyBieSBwdXNoaW5nL3BvcHBpbmcgcmVnaXN0ZXJzIGluIG1teHN1cHBvcnQgKEJydWNlIE9iZXJnKQorICBSZXZpc2VkIG1ha2VmaWxlLmdjbW14CisgIEFkZGVkIFBOR19TRVRKTVBfU1VQUE9SVEVELCBQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQsIGFuZCBQTkdfQUJPUlQoKSBtYWNyb3MKK3ZlcnNpb24gMS4wLjVyIFtGZWJydWFyeSA3LCAyMDAwXQorICBSZW1vdmVkIHN1cGVyZmx1b3VzIHByb3RvdHlwZSBmb3IgcG5nX2dldF9pdHh0IGZyb20gcG5nLmgKKyAgRml4ZWQgYSBidWcgaW4gcG5ncnRyYW4uYyB0aGF0IGltcHJvcGVybHkgZXhwYW5kZWQgdGhlIGJhY2tncm91bmQgY29sb3IuCisgIFJldHVybiAqbnVtX3RleHQ9MCBmcm9tIHBuZ19nZXRfdGV4dCgpIHdoZW4gYXBwcm9wcmlhdGUsIGFuZCBmaXggZG9jdW1lbnRhdGlvbgorICAgIG9mIHBuZ19nZXRfdGV4dCgpIGluIGxpYnBuZy50eHQvbGlicG5nLjMuCit2ZXJzaW9uIDEuMC41cyBbRmVicnVhcnkgMTgsIDIwMDBdCisgIEFkZGVkICJwbmdfam1wX2VudigpIiBtYWNybyB0byBwbmdjb25mLmgsIHRvIGhlbHAgcGVvcGxlIG1pZ3JhdGUgdG8gdGhlCisgICAgbmV3IGVycm9yIGhhbmRsZXIgdGhhdCdzIHBsYW5uZWQgZm9yIHRoZSBuZXh0IGxpYnBuZyByZWxlYXNlLCBhbmQgY2hhbmdlZAorICAgIGV4YW1wbGUuYywgcG5ndGVzdC5jLCBhbmQgY29udHJpYiBwcm9ncmFtcyB0byB1c2UgdGhpcyBtYWNyby4KKyAgUmV2aXNlZCBzb21lIG9mIHRoZSBETEwtZXhwb3J0IG1hY3JvcyBpbiBwbmdjb25mLmggKEdyZWcgUm9lbG9mcykKKyAgRml4ZWQgYSBidWcgaW4gcG5nX3JlYWRfcG5nKCkgdGhhdCBjYXVzZWQgaXQgdG8gZmFpbCB0byBleHBhbmQgc29tZSBpbWFnZXMKKyAgICB0aGF0IGl0IHNob3VsZCBoYXZlIGV4cGFuZGVkLgorICBGaXhlZCBzb21lIG1pc3Rha2VzIGluIHRoZSB1bnVzZWQgYW5kIHVuZG9jdW1lbnRlZCBJTkNIX0NPTlZFUlNJT05TIGZ1bmN0aW9ucworICAgIGluIHBuZ2dldC5jCisgIENoYW5nZWQgdGhlIGFsbG9jYXRpb24gb2YgcGFsZXR0ZSwgaGlzdG9yeSwgYW5kIHRyYW5zIGFycmF5cyBiYWNrIHRvCisgICAgdGhlIHZlcnNpb24gMS4wLjUgbWV0aG9kIChsaW5raW5nIGluc3RlYWQgb2YgY29weWluZykgd2hpY2ggcmVzdG9yZXMKKyAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbiAxLjAuNS4gIEFkZGVkIHNvbWUgcmVtYXJrcyBhYm91dAorICAgIHRoYXQgaW4gZXhhbXBsZS5jLiAgQWRkZWQgImZyZWVfbWUiIG1lbWJlciB0byBpbmZvX3B0ciBhbmQgcG5nX3B0cgorICAgIGFuZCBhZGRlZCBwbmdfZnJlZV9kYXRhKCkgZnVuY3Rpb24uCisgIFVwZGF0ZWQgbWFrZWZpbGUubGludXggYW5kIG1ha2VmaWxlLmdjY21teCB0byBtYWtlIGRpcmVjdG9yaWVzIGNvbmRpdGlvbmFsbHkuCisgIE1hZGUgY29zbWV0aWMgY2hhbmdlcyB0byBwbmdhc21yZC5oCisgIEFkZGVkIHBuZ19zZXRfcm93cygpIGFuZCBwbmdfZ2V0X3Jvd3MoKSwgZm9yIHVzZSB3aXRoIHBuZ19yZWFkfHdyaXRlX3BuZygpLgorICBNb2RpZmllZCBwbmdfcmVhZF9wbmcoKSB0byBhbGxvY2F0ZSBpbmZvX3B0ci0+cm93X3BvaW50ZXJzIG9ubHkgaWYgaXQKKyAgICBoYXNuJ3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4KK3ZlcnNpb24gMS4wLjV0IFtNYXJjaCA0LCAyMDAwXQorICBDaGFuZ2VkIHBuZ19qbXBfZW52KCkgbWlncmF0aW9uIGFpZGluZyBtYWNybyB0byBwbmdfam1wYnVmKCkuCisgIEZpeGVkICJpbnRlcmxhY2UiIHR5cG8gKHNob3VsZCBiZSAiaW50ZXJsYWNlZCIpIGluIGNvbnRyaWIvZ3JlZ2Jvb2svcmVhZDIteC5jCisgIEZpeGVkIGJ1ZyB3aXRoIHVzZSBvZiBQTkdfQkVGT1JFX0lIRFIgYml0IGluIHBuZ19wdHItPm1vZGUsIGludHJvZHVjZWQgd2hlbgorICAgIFBOR19GTEFHX0hBVkVfQ0hVTktfSEVBREVSIHdhcyBtb3ZlZCBpbnRvIHBuZ19wdHItPm1vZGUgaW4gdmVyc2lvbiAxLjAuNWIKKyAgRmlsZXMgaW4gY29udHJpYi9ncmVnYm9vayB3ZXJlIHJldmlzZWQgdG8gdXNlIHBuZ19qbXBidWYoKSBhbmQgdG8gc2VsZWN0CisgICAgYSAyNC1iaXQgdmlzdWFsIGlmIG9uZSBpcyBhdmFpbGFibGUsIGFuZCB0byBhbGxvdyBhYmJyZXZpYXRlZCBvcHRpb25zLgorICBGaWxlcyBpbiBjb250cmliL3BuZ21pbnVzIHdlcmUgcmV2aXNlZCB0byB1c2UgdGhlIHBuZ19qbXBidWYoKSBtYWNyby4KKyAgUmVtb3ZlZCBzcGFjZXMgaW4gbWFrZWZpbGUubGludXggYW5kIG1ha2VmaWxlLmdjbW14LCBpbnRyb2R1Y2VkIGluIDEuMC41cwordmVyc2lvbiAxLjAuNXUgW01hcmNoIDUsIDIwMDBdCisgIFNpbXBsaWZpZWQgdGhlIGNvZGUgdGhhdCBkZXRlY3RzIG9sZCBwbmcuaCBpbiBwbmcuYyBhbmQgcG5ndGVzdC5jCisgIFJlbmFtZWQgcG5nX3NwYWxldHRlIChfcCwgX3BwKSB0byBwbmdfc1BMVF90IChfdHAsIF90cHApCisgIEluY3JlYXNlZCBwcmVjaXNpb24gb2YgcmdiX3RvX2dyYXkgY2FsY3VsYXRpb25zIGZyb20gOCB0byAxNSBiaXRzIGFuZAorICAgIGFkZGVkIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQoKSBmdW5jdGlvbi4KKyAgQWRkZWQgbWFrZWZpbGUuYmMzMiAoMzItYml0IEJvcmxhbmQgQysrLCBDIG1vZGUpCit2ZXJzaW9uIDEuMC41diBbTWFyY2ggMTEsIDIwMDBdCisgIEFkZGVkIHNvbWUgcGFyZW50aGVzZXMgdG8gdGhlIHBuZ19qbXBidWYgbWFjcm8gZGVmaW5pdGlvbi4KKyAgVXBkYXRlZCByZWZlcmVuY2VzIHRvIHRoZSB6bGliIGhvbWUgcGFnZSwgd2hpY2ggaGFzIG1vdmVkIHRvIGZyZWVzb2Z0d2FyZS5jb20uCisgIENvcnJlY3RlZCBidWdzIGluIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIHBuZ19yZWFkX3JvdygpIGFuZCBwbmdfd3JpdGVfcm93KCkuCisgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBvZiBwbmdfcmdiX3RvX2dyYXkgY2FsY3VsYXRpb25zIGluIGxpYnBuZy4zL2xpYnBuZy50eHQuCisgIFJlbmFtZWQgbWFrZWZpbGUuYm9ybGFuZCx0dXJib2MzIGJhY2sgdG8gbWFrZWZpbGUuYm9yLHRjMyBhcyBpbiB2ZXJzaW9uIDEuMC4zLAorICAgIHJldmlzZWQgYm9ybGFuZCBtYWtlZmlsZXM7IGFkZGVkIG1ha2VmaWxlLmlibXZhYzMgYW5kIG1ha2VmaWxlLmdjYyAoQ29zbWluKQorCit2ZXJzaW9uIDEuMC42IFtNYXJjaCAyMCwgMjAwMF0KKyAgTWlub3IgcmV2aXNpb25zIG9mIG1ha2VmaWxlLmJvciwgbGlicG5nLnR4dCwgYW5kIGdyZWdib29rL3JwbmcyLXdpbi5jCisgIEFkZGVkIG1ha2VmaWxlLnNnZ2NjIChTR0kgSVJJWCB3aXRoIGdjYykKK3ZlcnNpb24gMS4wLjZkIFtBcHJpbCA3LCAyMDAwXQorICBDaGFuZ2VkIHNwcmludGYoKSB0byBzdHJjcHkoKSBpbiBwbmdfd3JpdGVfc0NBTF9zKCkgdG8gd29yayB3aXRob3V0IFNURElPCisgIEFkZGVkIGRhdGFfbGVuZ3RoIHBhcmFtZXRlciB0byBwbmdfZGVjb21wcmVzc19jaHVuaygpIGZ1bmN0aW9uCisgIFJldmlzZWQgZG9jdW1lbnRhdGlvbiB0byByZW1vdmUgcmVmZXJlbmNlIHRvIGFiYW5kb25lZCBwbmdfZnJlZV9jaG5rIGZ1bmN0aW9ucworICBGaXhlZCBhbiBlcnJvciBpbiBwbmdfcmdiX3RvX2dyYXlfZml4ZWQoKQorICBSZXZpc2VkIGV4YW1wbGUuYywgdXNhZ2Ugb2YgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkuCisgIFJlbmFtZWQgbWFrZWZpbGUuaWJtdmFjMyB0byBtYWtlZmlsZS5pYm1jLCBhZGRlZCBsaWJwbmcuaWNjIElCTSBwcm9qZWN0IGZpbGUKKyAgQWRkZWQgYSBjaGVjayBmb3IgaW5mb19wdHItPmZyZWVfbWUmUE5HX0ZSRUVfVEVYVCB3aGVuIGZyZWVpbmcgdGV4dCBpbiBwbmcuYworICBTaW1wbGlmeSBwbmdfc2lnX2J5dGVzKCkgZnVuY3Rpb24gdG8gcmVtb3ZlIHVzZSBvZiBub24tSVNPLUMgc3RyZHVwKCkuCit2ZXJzaW9uIDEuMC42ZSBbQXByaWwgOSwgMjAwMF0KKyAgQWRkZWQgcG5nX2RhdGFfZnJlZXIoKSBmdW5jdGlvbi4KKyAgSW4gdGhlIGNvZGUgdGhhdCBjaGVja3MgZm9yIG92ZXItbGVuZ3RoIHRSTlMgY2h1bmtzLCBhZGRlZCBjaGVjayBvZgorICAgIGluZm9fcHRyLT5udW1fdHJhbnMgYXMgd2VsbCBhcyBwbmdfcHRyLT5udW1fdHJhbnMgKE1hdHRoaWFzIEJlbmNrbWFubikKKyAgTWlub3IgcmV2aXNpb25zIG9mIGxpYnBuZy50eHQvbGlicG5nLjMuCisgIENoZWNrIGZvciBleGlzdGluZyBkYXRhIGFuZCBmcmVlIGl0IGlmIHRoZSBmcmVlX21lIGZsYWcgaXMgc2V0LCBpbiBwbmdfc2V0XyooKQorICAgIGFuZCBwbmdfaGFuZGxlXyooKS4KKyAgT25seSBkZWZpbmUgUE5HX1dFSUdIVEVEX0ZJTFRFUlNfU1VQUE9SVEVEIHdoZW4gUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgIGlzIGRlZmluZWQuCisgIENoYW5nZWQgc2V2ZXJhbCBpbnN0YW5jZXMgb2YgUE5HX05PX0NPTlNPTEVfSUQgdG8gUE5HX05PX1NURElPIGluIHBuZ3J1dGlsLmMKKyAgICBhbmQgbWVudGlvbmVkIHRoZSBwdXJwb3NlcyBvZiB0aGUgdHdvIG1hY3JvcyBpbiBsaWJwbmcudHh0L2xpYnBuZy4zLgordmVyc2lvbiAxLjAuNmYgW0FwcmlsIDE0LCAyMDAwXQorICBSZXZpc2VkIHBuZ19zZXRfaUNDUCgpIGFuZCBwbmdfc2V0X3Jvd3MoKSB0byBhdm9pZCBwcmVtYXR1cmVseSBmcmVlaW5nIGRhdGEuCisgIEFkZCBjaGVja3MgaW4gcG5nX3NldF90ZXh0KCkgZm9yIE5VTEwgbWVtYmVycyBvZiB0aGUgaW5wdXQgdGV4dCBzdHJ1Y3R1cmUuCisgIFJldmlzZWQgbGlicG5nLnR4dC9saWJwbmcuMy4KKyAgUmVtb3ZlZCBzdXBlcmZsdW91cyBwcm90b3R5cGUgZm9yIHBuZ19zZXRfaXR4dCBmcm9tIHBuZy5oCisgIFJlbW92ZWQgImVsc2UiIGZyb20gcG5ncmVhZC5jLCBhZnRlciBwbmdfZXJyb3IoKSwgYW5kIGNoYW5nZWQgIjAiIHRvICJsZW5ndGgiLgorICBDaGFuZ2VkIHNldmVyYWwgcG5nX2Vycm9ycyBhYm91dCBtYWxmb3JtZWQgYW5jaWxsYXJ5IGNodW5rcyB0byBwbmdfd2FybmluZ3MuCit2ZXJzaW9uIDEuMC42ZyBbQXByaWwgMjQsIDIwMDBdCisgIEFkZGVkIHBuZ19wYXNzLSogYXJyYXlzIHRvIHBuZ2djY3JkLmMgd2hlbiBQTkdfVVNFX0xPQ0FMX0FSUkFZUyBpcyBkZWZpbmVkLgorICBSZWxvY2F0ZWQgcGFyYWdyYXBoIGFib3V0IHBuZ19zZXRfYmFja2dyb3VuZCgpIGluIGxpYnBuZy4zL2xpYnBuZy50eHQKKyAgICBhbmQgb3RoZXIgcmV2aXNpb25zIChNYXR0aGlhcyBCZW5ja21hbm4pCisgIFJlbG9jYXRlZCBpbmZvX3B0ci0+ZnJlZV9tZSwgcG5nX3B0ci0+ZnJlZV9tZSwgYW5kIG90aGVyIGluZm9fcHRyIGFuZAorICAgIHBuZ19wdHIgbWVtYmVycyB0byByZXN0b3JlIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggbGlicG5nLTEuMC41CisgICAgKGJyZWFrcyBjb21wYXRpYmlsaXR5IHdpdGggbGlicG5nLTEuMC42KS4KK3ZlcnNpb24gMS4wLjZoIFtBcHJpbCAyNCwgMjAwMF0KKyAgQ2hhbmdlZCBzaGFyZWQgbGlicmFyeSBzby1udW1iZXIgcGF0dGVybiBmcm9tIDIueC55LnogdG8geHkueiAodGhpcyBidWlsZHMKKyAgICBsaWJwbmcuc28uMTAgJiBsaWJwbmcuc28uMTAuNmggaW5zdGVhZCBvZiBsaWJwbmcuc28uMiAmIGxpYnBuZy5zby4yLjEuMC42aCkKKyAgICBUaGlzIGlzIGEgdGVtcG9yYXJ5IGNoYW5nZSBmb3IgdGVzdCBwdXJwb3Nlcy4KK3ZlcnNpb24gMS4wLjZpIFtNYXkgMiwgMjAwMF0KKyAgUmVhcnJhbmdlZCBzb21lIG1lbWJlcnMgYXQgdGhlIGVuZCBvZiBwbmdfaW5mbyBhbmQgcG5nX3N0cnVjdCwgdG8gcHV0CisgICAgdW5rbm93bl9jaHVua3NfbnVtIGFuZCBmcmVlX21lIHdpdGhpbiB0aGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgcG5nX3N0cnVjdHMKKyAgICBhbmQgZnJlZV9tZSwgcG5nX3JlYWRfdXNlcl9mbiwgYW5kIHBuZ19mcmVlX2ZuIHdpdGhpbiB0aGUgb3JpZ2luYWwgcG5nX2luZm8sCisgICAgYmVjYXVzZSBzb21lIG9sZCBhcHBsaWNhdGlvbnMgYWxsb2NhdGUgdGhlIHN0cnVjdHMgZGlyZWN0bHkgaW5zdGVhZCBvZgorICAgIHVzaW5nIHBuZ19jcmVhdGVfKigpLgorICBBZGRlZCBkb2N1bWVudGF0aW9uIG9mIHVzZXIgbWVtb3J5IGZ1bmN0aW9ucyBpbiBsaWJwbmcudHh0L2xpYnBuZy4zCisgIE1vZGlmaWVkIHBuZ19yZWFkX3BuZyBzbyB0aGF0IGl0IHdpbGwgdXNlIHVzZXJfYWxsb2NhdGVkIHJvd19wb2ludGVycworICAgIGlmIHByZXNlbnQsIHVubGVzcyBmcmVlX21lIGRpcmVjdHMgdGhhdCBpdCBiZSBmcmVlZCwgYW5kIGFkZGVkIGRlc2NyaXB0aW9uCisgICAgb2YgdGhlIHVzZSBvZiBwbmdfc2V0X3Jvd3MoKSBhbmQgcG5nX2dldF9yb3dzKCkgaW4gbGlicG5nLnR4dC9saWJwbmcuMy4KKyAgQWRkZWQgUE5HX0xFR0FDWV9TVVBQT1JURUQgbWFjcm8sIGFuZCAjaWZkZWYgb3V0IGFsbCBuZXcgKHNpbmNlIHZlcnNpb24KKyAgICAxLjAwKSBtZW1iZXJzIG9mIHBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvLCB0byByZWdhaW4gYmluYXJ5IGNvbXBhdGliaWxpdHkKKyAgICB3aGVuIHlvdSBkZWZpbmUgdGhpcyBtYWNyby4gIENhcGFiaWxpdGllcyBsb3N0IGluIHRoaXMgZXZlbnQKKyAgICBhcmUgdXNlciB0cmFuc2Zvcm1zIChuZXcgaW4gdmVyc2lvbiAxLjAuMCksdGhlIHVzZXIgdHJhbnNmb3JtIHBvaW50ZXIKKyAgICAobmV3IGluIHZlcnNpb24gMS4wLjIpLCByZ2JfdG9fZ3JheSAobmV3IGluIDEuMC41KSwgaUNDUCwgc0NBTCwgc1BMVCwKKyAgICB0aGUgaGlnaC1sZXZlbCBpbnRlcmZhY2UsIGFuZCB1bmtub3duIGNodW5rcyBzdXBwb3J0IChhbGwgbmV3IGluIDEuMC42KS4KKyAgICBUaGlzIHdhcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiBvbGQgYXBwbGljYXRpb25zIHRoYXQgYWxsb2NhdGUgdGhlIHN0cnVjdHMKKyAgICBkaXJlY3RseSBhcyBhdXRob3JzIHdlcmUgaW5zdHJ1Y3RlZCB0byBkbyBpbiBsaWJwbmctMC44OCBhbmQgZWFybGllciwKKyAgICBpbnN0ZWFkIG9mIHVzaW5nIHBuZ19jcmVhdGVfKigpLgorICBBZGRlZCBtb2RlcyBQTkdfQ1JFQVRFRF9SRUFEX1NUUlVDVCBhbmQgUE5HX0NSRUFURURfV1JJVEVfU1RSVUNUIHdoaWNoCisgICAgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IGNvZGVzIHRoYXQgZGlyZWN0bHkgYWxsb2NhdGUgdGhlIHN0cnVjdHMsIGFuZAorICAgIGNvZGUgdG8gY2hlY2sgdGhlc2UgbW9kZXMgaW4gcG5nX3JlYWRfaW5pdCgpIGFuZCBwbmdfd3JpdGVfaW5pdCgpIGFuZAorICAgIGdlbmVyYXRlIGEgbGlicG5nIGVycm9yIGlmIHRoZSBtb2RlcyBhcmVuJ3Qgc2V0IGFuZCBQTkdfTEVHQUNZX1NVUFBPUlRFRAorICAgIHdhcyBub3QgZGVmaW5lZC4KKyAgQWRkZWQgbWFrZWZpbGUuaW50ZWwgYW5kIHVwZGF0ZWQgbWFrZWZpbGUud2F0Y29tIChQYXdlbCBNcm9jaGVuKQordmVyc2lvbiAxLjAuNmogW01heSAzLCAyMDAwXQorICBPdmVybG9hZGVkIHBuZ19yZWFkX2luaXQoKSBhbmQgcG5nX3dyaXRlX2luaXQoKSB3aXRoIG1hY3JvcyB0aGF0IGNvbnZlcnQKKyAgICBjYWxscyB0byBwbmdfcmVhZF9pbml0XzIoKSBvciBwbmdfd3JpdGVfaW5pdF8yKCkgdGhhdCBjaGVjayB0aGUgdmVyc2lvbgorICAgIGFuZCBzdHJ1Y3R1cmUgc2l6ZXMuCit2ZXJzaW9uIDEuMC43YmV0YTExIFtNYXkgNywgMjAwMF0KKyAgUmVtb3ZlZCB0aGUgbmV3IFBOR19DUkVBVEVEX1JFQURfU1RSVUNUIGFuZCBQTkdfQ1JFQVRFRF9XUklURV9TVFJVQ1QgbW9kZXMKKyAgICB3aGljaCBhcmUgbm8gbG9uZ2VyIHVzZWQuCisgIEVsaW1pbmF0ZWQgdGhlIHRocmVlIG5ldyBtZW1iZXJzIG9mIHBuZ190ZXh0IHdoZW4gUE5HX0xFR0FDWV9TVVBQT1JURUQgaXMKKyAgICBkZWZpbmVkIG9yIHdoZW4gbmVpdGhlciBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRCBub3IgUE5HX1dSSVRFX2lUWFRfU1VQUE9SVEVECisgICAgaXMgZGVmaW5lZC4KKyAgTWFkZSBQTkdfTk9fUkVBRHxXUklURV9pVFh0IHRoZSBkZWZhdWx0IHNldHRpbmcsIHRvIGF2b2lkIG1lbW9yeQorICAgIG92ZXJydW4gd2hlbiBvbGQgYXBwbGljYXRpb25zIGZpbGwgdGhlIGluZm9fcHRyLT50ZXh0IHN0cnVjdHVyZSBkaXJlY3RseS4KKyAgQWRkZWQgUE5HQVBJIG1hY3JvLCBhbmQgYWRkZWQgaXQgdG8gdGhlIGRlZmluaXRpb25zIG9mIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMuCisgIFJlbG9jYXRlZCB2ZXJzaW9uIG1hY3JvIGRlZmluaXRpb25zIGFoZWFkIG9mIHRoZSBpbmNsdWRlcyBvZiB6bGliLmggYW5kCisgICAgcG5nY29uZi5oIGluIHBuZy5oLgordmVyc2lvbiAxLjAuN2JldGExMiBbTWF5IDEyLCAyMDAwXQorICBSZXZpc2VkIHBuZ3NldC5jIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIGV4cGFuZGluZyB0aGUgcG5nX2RlYnVnIG1hY3JvLgorICBEZWxldGVkIHNvbWUgZXh0cmFuZW91cyBkZWZpbmVzIGZyb20gcG5nY29uZi5oCisgIE1hZGUgUE5HX05PX0NPTlNPTEVfSU8gdGhlIGRlZmF1bHQgY29uZGl0aW9uIHdoZW4gUE5HX0JVSUxEX0RMTCBpcyBkZWZpbmVkLgorICBVc2UgTVNDIF9SUFRuIGRlYnVnZ2luZyBpbnN0ZWFkIG9mIGZwcmludGYgaWYgX01TQ19WRVIgaXMgZGVmaW5lZC4KKyAgQWRkZWQgcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcigpIGZ1bmN0aW9uLgorICBDaGVjayBmb3IgbWFzayZQTkdfRlJFRV9DSE5LIChmb3IgVEVYVCwgU0NBTCwgUENBTCkgaW4gcG5nX2ZyZWVfZGF0YSgpLgorICBFeHBhbmRlZCBsaWJwbmcuMy9saWJwbmcudHh0IGluZm9ybWF0aW9uIGFib3V0IHBuZ19kYXRhX2ZyZWVyKCkuCit2ZXJzaW9uIDEuMC43YmV0YTE0IFtNYXkgMTcsIDIwMDBdIChiZXRhMTMgd2FzIG5vdCBwdWJsaXNoZWQpCisgIENoYW5nZWQgcG5nZ2NjcmQuYyBhbmQgcG5ndmNyZC5jIHRvIGhhbmRsZSBiYWQgYWRhcHRpdmUgZmlsdGVyIHR5cGVzIGFzCisgICAgd2FybmluZ3MgaW5zdGVhZCBvZiBlcnJvcnMsIGFzIHBuZ3J1dGlsLmMgZG9lcy4KKyAgU2V0IHRoZSBQTkdfSU5GT19JREFUIHZhbGlkIGZsYWcgaW4gcG5nX3NldF9yb3dzKCkgc28gcG5nX3dyaXRlX3BuZygpCisgICAgd2lsbCBhY3R1YWxseSB3cml0ZSBJREFUcy4KKyAgTWFkZSB0aGUgZGVmYXVsdCBQTkdfVVNFX0xPQ0FMX0FSUkFZUyBkZXBlbmQgb24gUE5HX0RMTCBpbnN0ZWFkIG9mIFdJTjMyLgorICBNYWtlIHBuZ19mcmVlX2RhdGEoKSBpZ25vcmUgaXRzIGZpbmFsIHBhcmFtZXRlciBleGNlcHQgd2hlbiBmcmVlaW5nIGRhdGEKKyAgICB0aGF0IGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyAodGV4dCwgc1BMVCwgdW5rbm93bnMpLgorICBGaXhlZCBhIG5ldyBidWcgaW4gcG5nX3NldF9yb3dzKCkuCisgIFJlbW92ZWQgaW5mb19wdHItPnZhbGlkIHRlc3RzIGZyb20gcG5nX2ZyZWVfZGF0YSgpLCBhcyBpbiB2ZXJzaW9uIDEuMC41LgorICBBZGRlZCBwbmdfc2V0X2ludmFsaWQoKSBmdW5jdGlvbi4KKyAgRml4ZWQgaW5jb3JyZWN0IGlsbHVzdHJhdGlvbnMgb2YgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgaW4gZXhhbXBsZS5jLgordmVyc2lvbiAxLjAuN2JldGExNSBbTWF5IDMwLCAyMDAwXQorICBSZXZpc2VkIHRoZSBkZWxpYmVyYXRlbHkgZXJyb25lb3VzIExpbnV4IHNldGptcCBjb2RlIGluIHBuZ2NvbmYuaCB0byBwcm9kdWNlCisgICAgZmV3ZXIgZXJyb3IgbWVzc2FnZXMuCisgIFJlYXJyYW5nZWQgY2hlY2tzIGZvciBaX09LIHRvIGNoZWNrIHRoZSBtb3N0IGxpa2VseSBwYXRoIGZpcnN0IGluIHBuZ3ByZWFkLmMKKyAgICBhbmQgcG5nd3V0aWwuYy4KKyAgQWRkZWQgY2hlY2tzIGluIHBuZ3Rlc3QuYyBmb3IgcG5nX2NyZWF0ZV8qKCkgcmV0dXJuaW5nIE5VTEwsIGFuZCBtZW50aW9uZWQKKyAgICBpbiBsaWJwbmcudHh0L2xpYnBuZy4zIHRoZSBuZWVkIGZvciBhcHBsaWNhdGlvbnMgdG8gY2hlY2sgdGhpcy4KKyAgQ2hhbmdlZCBuYW1lcyBvZiBwbmdfZGVmYXVsdF8qKCkgZnVuY3Rpb25zIGluIHBuZ3Rlc3QgdG8gcG5ndGVzdF8qKCkuCisgIENoYW5nZWQgcmV0dXJuIHR5cGUgb2YgcG5nX2dldF94fHlfb2Zmc2V0XyooKSBmcm9tIHBuZ191aW50XzMyIHRvIHBuZ19pbnRfMzIuCisgIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgdW51c2VkIFBOR19JTkNIX0NPTlZFUlNJT05TIGZ1bmN0aW9ucyBpbiBwbmdnZXQuYworICBTZXQgZWFjaCBwb2ludGVyIHRvIE5VTEwgYWZ0ZXIgZnJlZWluZyBpdCBpbiBwbmdfZnJlZV9kYXRhKCkuCisgIFdvcmtlZCBhcm91bmQgYSBwcm9ibGVtIGluIHBuZ2NvbmYuaDsgQUlYJ3Mgc3RyaW5ncy5oIGRlZmluZXMgYW4gImluZGV4IgorICAgIG1hY3JvIHRoYXQgY29uZmxpY3RzIHdpdGggbGlicG5nJ3MgcG5nX2NvbG9yXzE2LmluZGV4LiAoRGltaXRyaSBQYXBhZGFwb3Vsb3MpCisgIEFkZGVkICJtc3ZjIiBkaXJlY3Rvcnkgd2l0aCBNU1ZDKysgcHJvamVjdCBmaWxlcyAoU2ltb24tUGllcnJlIENhZGlldXgpLgordmVyc2lvbiAxLjAuN2JldGExNiBbSnVuZSA0LCAyMDAwXQorICBSZXZpc2VkIHRoZSB3b3JrYXJvdW5kIG9mIEFJWCBzdHJpbmcuaCAiaW5kZXgiIGJ1Zy4KKyAgQWRkZWQgYSBjaGVjayBmb3Igb3Zlcmxlbmd0aCBQTFRFIGNodW5rIGluIHBuZ3J1dGlsLmMuCisgIEFkZGVkIFBOR19OT19QT0lOVEVSX0lOREVYSU5HIG1hY3JvIHRvIHVzZSBhcnJheS1pbmRleGluZyBpbnN0ZWFkIG9mIHBvaW50ZXIKKyAgICBpbmRleGluZyBpbiBwbmdydXRpbC5jIGFuZCBwbmd3dXRpbC5jIHRvIGFjY29tbW9kYXRlIGEgYnVnZ3kgY29tcGlsZXIuCisgIEFkZGVkIGEgd2FybmluZyBpbiBwbmdfZGVjb21wcmVzc19jaHVuaygpIHdoZW4gaXQgcnVucyBvdXQgb2YgZGF0YSwgZS5nLgorICAgIHdoZW4gaXQgdHJpZXMgdG8gcmVhZCBhbiBlcnJvbmVvdXMgUGhvdG9TaG9wIGlDQ1AgY2h1bmsuCisgIEFkZGVkIFBOR19VU0VfRExMIG1hY3JvLgorICBSZXZpc2VkIHRoZSBjb3B5cmlnaHQvZGlzY2xhaW1lci9saWNlbnNlIG5vdGljZS4KKyAgQWRkZWQgY29udHJpYi9tc3ZjdGVzdCBkaXJlY3RvcnkKK3ZlcnNpb24gMS4wLjdyYzEgW0p1bmUgOSwgMjAwMF0KKyAgQ29ycmVjdGVkIHRoZSBkZWZpbml0aW9uIG9mIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICAoMHgwNDAwIG5vdCAweDAyMDApCisgIEFkZGVkIGNvbnRyaWIvdmlzdXBuZyBkaXJlY3RvcnkgKFdpbGxlbSB2YW4gU2NoYWlrKQordmVyc2lvbiAxLjAuN2JldGExOCBbSnVuZSAyMywgMjAwMF0KKyAgUmV2aXNlZCBQTkdBUEkgZGVmaW5pdGlvbiwgYW5kIHBuZ3ZjcmQuYyB0byB3b3JrIHdpdGggX19HQ0NfXworICAgIGFuZCBkbyBub3QgcmVkZWZpbmUgUE5HQVBJIGlmIGl0IGlzIHBhc3NlZCBpbiB2aWEgYSBjb21waWxlciBkaXJlY3RpdmUuCisgIFJldmlzZWQgdmlzdXBuZy9QbmdGaWxlLmMgdG8gcmVtb3ZlIHJldHVybnMgZnJvbSB3aXRoaW4gdGhlIFRyeSBibG9jay4KKyAgUmVtb3ZlZCBsZWFkaW5nIHVuZGVyc2NvcmVzIGZyb20gIl9QTkdfSCIgYW5kICJfUE5HX1NBVkVfQlNEX1NPVVJDRSIgbWFjcm9zLgorICBVcGRhdGVkIGNvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmggdG8gdmVyc2lvbiAxLjAuMC4KKyAgRml4ZWQgYnVncyBpbiBwbmd3cml0ZS5jIGFuZCBwbmd3dXRpbC5jIHRoYXQgcHJldmVudGVkIHdyaXRpbmcgaUNDUCBjaHVua3MuCit2ZXJzaW9uIDEuMC43cmMyIFtKdW5lIDI4LCAyMDAwXQorICBVcGRhdGVkIGxpY2Vuc2UgdG8gaW5jbHVkZSBkaXNjbGFpbWVycyByZXF1aXJlZCBieSBVQ0lUQS4KKyAgRml4ZWQgIkRKQlBQIiB0eXBvIGluIHBuZ2djY3JkLmMgaW50cm9kdWNlZCBpbiBiZXRhMTguCisKK3ZlcnNpb24gMS4wLjcgW0p1bHkgMSwgMjAwMF0KKyAgUmV2aXNlZCB0aGUgZGVmaW5pdGlvbiBvZiAidHJhbnNfdmFsdWVzIiBpbiBsaWJwbmcuMy9saWJwbmcudHh0Cit2ZXJzaW9uIDEuMC44YmV0YTEgW0p1bHkgOCwgMjAwMF0KKyAgQWRkZWQgcG5nX2ZyZWUocG5nX3B0ciwga2V5KSB0d28gcGxhY2VzIGluIHBuZ3ByZWFkLmMgdG8gc3RvcCBtZW1vcnkgbGVha3MuCisgIENoYW5nZWQgUE5HX05PX1NURElPIHRvIFBOR19OT19DT05TT0xFX0lPLCBzZXZlcmFsIHBsYWNlcyBpbiBwbmdydXRpbC5jIGFuZAorICAgICBwbmd3dXRpbC5jLgorICBDaGFuZ2VkIFBOR19FWFBPUlRfVkFSIHRvIHVzZSBQTkdfSU1QRVhQLCBpbiBwbmdjb25mLmguCisgIFJlbW92ZWQgdW51c2VkICIjaW5jbHVkZSA8YXNzZXJ0Lmg+IiBmcm9tIHBuZy5jCisgIEFkZGVkIFdpbmRvd3NDRSBzdXBwb3J0LgorICBSZXZpc2VkIHBuZ2djY3JkLmMgdG8gd29yayB3aXRoIGdjYy0yLjk1LjIgYW5kIGluIHRoZSBDeWd3aW4gZW52aXJvbm1lbnQuCit2ZXJzaW9uIDEuMC44YmV0YTIgW0p1bHkgMTAsIDIwMDBdCisgIEFkZGVkIHByb2plY3QgZmlsZXMgdG8gdGhlIHdpbmNlIGRpcmVjdG9yeSBhbmQgbWFkZSBmdXJ0aGVyIHJldmlzaW9ucworICAgICBvZiBwbmd0ZXN0LmMsIHBuZ3Jpby5jLCBhbmQgcG5nd2lvLmMgaW4gc3VwcG9ydCBvZiBXaW5kb3dzQ0UuCit2ZXJzaW9uIDEuMC44YmV0YTMgW0p1bHkgMTEsIDIwMDBdCisgIE9ubHkgc2V0IHRoZSBQTkdfRkxBR19GUkVFX1RSTlMgb3IgUE5HX0ZSRUVfVFJOUyBmbGFnIGluIHBuZ19oYW5kbGVfdFJOUygpCisgICAgIGZvciBpbmRleGVkLWNvbG9yIGlucHV0IGZpbGVzIHRvIGF2b2lkIHBvdGVudGlhbCBkb3VibGUtZnJlZWluZyB0cmFucyBhcnJheQorICAgICB1bmRlciBzb21lIHVudXN1YWwgY29uZGl0aW9uczsgcHJvYmxlbSB3YXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuMC42Zi4KKyAgRnVydGhlciByZXZpc2lvbnMgdG8gcG5ndGVzdC5jIGFuZCBmaWxlcyBpbiB0aGUgd2luY2Ugc3ViZGlyZWN0b3J5LgordmVyc2lvbiAxLjAuOGJldGE0IFtKdWx5IDE0LCAyMDAwXQorICBBZGRlZCB0aGUgZmlsZXMgcG5nYmFyLnBuZyBhbmQgcG5nYmFyLmpwZyB0byB0aGUgZGlzdHJpYnV0aW9uLgorICBBZGRlZCBtYWtlZmlsZS5jeWd3aW4sIGFuZCBjeWd3aW4gc3VwcG9ydCBpbiBwbmdjb25mLmgKKyAgQWRkZWQgUE5HX05PX1pBTExPQ19aRVJPIG1hY3JvIChtYWtlcyBwbmdfemFsbG9jIHNraXAgemVyb2luZyBtZW1vcnkpCit2ZXJzaW9uIDEuMC44cmMxIFtKdWx5IDE2LCAyMDAwXQorICBSZXZpc2VkIHBuZ19kZWJ1ZygpIG1hY3JvcyBhbmQgc3RhdGVtZW50cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCisKK3ZlcnNpb24gMS4wLjggW0p1bHkgMjQsIDIwMDBdCisgIEFkZGVkIHBuZ19mbHVzaCgpIGluIHBuZ3dyaXRlLmMsIGFmdGVyIHBuZ193cml0ZV9JRU5EKCkuCisgIFVwZGF0ZWQgbWFrZWZpbGUuaHB1eCB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5LgordmVyc2lvbiAxLjAuOWJldGExIFtOb3ZlbWJlciAxMCwgMjAwMF0KKyAgRml4ZWQgdHlwbyBpbiBzY3JpcHRzL21ha2VmaWxlLmhwdXgKKyAgVXBkYXRlZCBtYWtldm1zLmNvbSBpbiBzY3JpcHRzIGFuZCBjb250cmliLyogYW5kIGNvbnRyaWIvKiAoTWFydGluIFppbnNlcikKKyAgRml4ZWQgc2VxZW5jZS1wb2ludCBidWcgaW4gY29udHJpYi9wbmdtaW51cy9wbmcycG5tIChNYXJ0aW4gWmluc2VyKQorICBDaGFuZ2VkICJjZHJvbS5jb20iIGluIGRvY3VtZW50YXRpb24gdG8gImxpYnBuZy5vcmciCisgIFJldmlzZWQgcG5nZ2NjcmQuYyB0byBnZXQgaXQgYWxsIHdvcmtpbmcsIGFuZCB1cGRhdGVkIG1ha2VmaWxlLmdjbW14IChHcmVnKS4KKyAgQ2hhbmdlZCB0eXBlIG9mICJwYXJhbXMiIGZyb20gdm9pZHAgdG8gcG5nX3ZvaWRwIGluIHBuZ19yZWFkfHdyaXRlX3BuZygpLgorICBNYWtlIHN1cmUgUE5HQVBJIGFuZCBQTkdfSU1QRVhQIGFyZSBkZWZpbmVkIGluIHBuZ2NvbmYuaC4KKyAgUmV2aXNlZCB0aGUgMyBpbnN0YW5jZXMgb2YgV1JJVEVGSUxFIGluIHBuZ3Rlc3QuYy4KKyAgUmVsb2NhdGVkICJtc3ZjIiBhbmQgIndpbmNlIiBwcm9qZWN0IHN1YmRpcmVjdG9yaWVzIGludG8gImRsbCIgc3ViZGlyZWN0b3J5LgorICBVcGRhdGVkIHBuZy5yYyBpbiBkbGwvbXN2YyBwcm9qZWN0CisgIFJldmlzZWQgbWFrZWZpbGUuZGVjIHRvIGRlZmluZSBhbmQgdXNlIExJQlBBVEggYW5kIElOQ1BBVEgKKyAgSW5jcmVhc2VkIHNpemUgb2YgZ2xvYmFsIHBuZ19saWJwbmdfdmVyW10gYXJyYXkgZnJvbSAxMiB0byAxOCBjaGFycy4KKyAgTWFkZSBnbG9iYWwgcG5nX2xpYnBuZ192ZXJbXSwgcG5nX3NpZ1tdIGFuZCBwbmdfcGFzc18qW10gYXJyYXlzIGNvbnN0LgorICBSZW1vdmVkIGR1cGxpY2F0ZSBwbmdfY3JjX2ZpbmlzaCgpIGZyb20gcG5nX2hhbmRsZV9iS0dEKCkgZnVuY3Rpb24uCisgIEFkZGVkIGEgd2FybmluZyB3aGVuIGFwcGxpY2F0aW9uIGNhbGxzIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgbXVsdGlwbGUgdGltZXMuCisgIFJldmlzZWQgbWFrZWZpbGUuY3lnd2luCisgIEZpeGVkIGJ1Z3MgaW4gaUNDUCBzdXBwb3J0IGluIHBuZ3J1dGlsLmMgYW5kIHBuZ3d1dGlsLmMuCisgIFJlcGxhY2VkIHBuZ19zZXRfZW1wdHlfcGx0ZV9wZXJtaXR0ZWQoKSB3aXRoIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkuCit2ZXJzaW9uIDEuMC45YmV0YTIgW05vdmVtYmVyIDE5LCAyMDAwXQorICBSZW5hbWVkIHRoZSAiZGxsIiBzdWJkaXJlY3RvcnkgInByb2plY3RzIi4KKyAgQWRkZWQgYm9ybGFuZCBwcm9qZWN0IGZpbGVzIHRvICJwcm9qZWN0cyIgc3ViZGlyZWN0b3J5LgorICBTZXQgVlNfRkZfUFJFUkVMRUFTRSBhbmQgVlNfRkZfUEFUQ0hFRCBmbGFncyBpbiBtc3ZjL3BuZy5yYyB3aGVuIGFwcHJvcHJpYXRlLgorICBBZGQgZXJyb3IgbWVzc2FnZSBpbiBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKCkgd2hlbiBtYWxsb2MgZmFpbHMuCit2ZXJzaW9uIDEuMC45YmV0YTMgW05vdmVtYmVyIDIzLCAyMDAwXQorICBSZXZpc2VkIFBOR19MSUJQTkdfQlVJTERfVFlQRSBtYWNybyBpbiBwbmcuaCwgdXNlZCBpbiB0aGUgbXN2YyBwcm9qZWN0LgorICBSZW1vdmVkIHRoZSBwbmdfZmx1c2goKSBpbiBwbmd3cml0ZS5jIHRoYXQgY3Jhc2hlcyBzb21lIGFwcGxpY2F0aW9ucworICAgIHRoYXQgZG9uJ3Qgc2V0IHBuZ19vdXRwdXRfZmx1c2hfZm4uCisgIEFkZGVkIG1ha2VmaWxlLm1hY29zeCBhbmQgbWFrZWZpbGUuYWl4IHRvIHNjcmlwdHMgZGlyZWN0b3J5LgordmVyc2lvbiAxLjAuOWJldGE0IFtEZWNlbWJlciAxLCAyMDAwXQorICBDaGFuZ2UgcG5nX2NodW5rX3dhcm5pbmcgdG8gcG5nX3dhcm5pbmcgaW4gcG5nX2NoZWNrX2tleXdvcmQoKS4KKyAgSW5jcmVhc2VkIHRoZSBmaXJzdCBwYXJ0IG9mIG1zZyBidWZmZXIgZnJvbSAxNiB0byAxOCBpbiBwbmdfY2h1bmtfZXJyb3IoKS4KK3ZlcnNpb24gMS4wLjliZXRhNSBbRGVjZW1iZXIgMTUsIDIwMDBdCisgIEFkZGVkIHN1cHBvcnQgZm9yIGZpbHRlciBtZXRob2QgNjQgKGZvciBQTkcgZGF0YXN0cmVhbXMgZW1iZWRkZWQgaW4gTU5HKS4KK3ZlcnNpb24gMS4wLjliZXRhNiBbRGVjZW1iZXIgMTgsIDIwMDBdCisgIFJldmlzZWQgcG5nX3NldF9maWx0ZXIoKSB0byBhY2NlcHQgZmlsdGVyIG1ldGhvZCA2NCB3aGVuIGFwcHJvcHJpYXRlLgorICBBZGRlZCBuZXcgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSBiaXQgdG8gcG5nX3B0ci0+bW9kZSBhbmQgdXNlIGl0IHRvCisgICAgaGVscCBwcmV2ZW50IGFwcGxpY2F0aW9ucyBmcm9tIHVzaW5nIE1ORyBmZWF0dXJlcyBpbiBQTkcgZGF0YXN0cmVhbXMuCisgIEFkZGVkIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkgZnVuY3Rpb24uCisgIFJldmlzZWQgbGlicG5nLjMvbGlicG5nLnR4dC4gIENoYW5nZWQgImZpbHRlciB0eXBlIiB0byAiZmlsdGVyIG1ldGhvZCIuCit2ZXJzaW9uIDEuMC45cmMxIFtEZWNlbWJlciAyMywgMjAwMF0KKyAgUmV2aXNlZCB0ZXN0IGZvciBQTkdfSEFWRV9QTkdfU0lHTkFUVVJFIGluIHBuZ3J1dGlsLmMKKyAgRml4ZWQgZXJyb3IgaGFuZGxpbmcgb2YgdW5rbm93biBjb21wcmVzc2lvbiB0eXBlIGluIHBuZ19kZWNvbXByZXNzX2NodW5rKCkuCisgIEluIHBuZ2NvbmYuaCwgZGVmaW5lIF9fY2RlY2wgd2hlbiBfTVNDX1ZFUiBpcyBkZWZpbmVkLgordmVyc2lvbiAxLjAuOWJldGE3IFtEZWNlbWJlciAyOCwgMjAwMF0KKyAgQ2hhbmdlZCBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0IHRvIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0Ugc2V2ZXJhbCBwbGFjZXMuCisgIFJldmlzZWQgbWVtb3J5IG1hbmFnZW1lbnQgaW4gcG5nX3NldF9oSVNUIGFuZCBwbmdfaGFuZGxlX2hJU1QgaW4gYSBiYWNrd2FyZAorICAgIGNvbXBhdGlibGUgbWFubmVyLiAgUExURSBhbmQgdFJOUyB3ZXJlIHJldmlzZWQgc2ltaWxhcmx5LgorICBSZXZpc2VkIHRoZSBpQ0NQIGNodW5rIHJlYWRlciB0byBpZ25vcmUgdHJhaWxpbmcgZ2FyYmFnZS4KK3ZlcnNpb24gMS4wLjliZXRhOCBbSmFudWFyeSAxMiwgMjAwMV0KKyAgTW92ZWQgcG5nYXNtcmQuaCBpbnRvIHBuZ2NvbmYuaC4KKyAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygb3V0LW9mLXNwZWMgZ2FyYmFnZSBpQ0NQIGNodW5rcyBnZW5lcmF0ZWQgYnkgUGhvdG9TaG9wLgordmVyc2lvbiAxLjAuOWJldGE5IFtKYW51YXJ5IDE1LCAyMDAxXQorICBBZGRlZCBwbmdfc2V0X2ludmFsaWQsIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzLCBhbmQgcG5nX21teF9zdXBwb3J0ZWQgdG8KKyAgICB3aW5jZSBhbmQgbXN2YyBwcm9qZWN0IG1vZHVsZSBkZWZpbml0aW9uIGZpbGVzLgorICBNaW5vciByZXZpc2lvbiBvZiBtYWtlZmlsZS5jeWd3aW4uCisgIEZpeGVkIGJ1ZyB3aXRoIHByb2dyZXNzaXZlIHJlYWRpbmcgb2YgbmFycm93IGludGVybGFjZWQgaW1hZ2VzIGluIHBuZ3ByZWFkLmMKK3ZlcnNpb24gMS4wLjliZXRhMTAgW0phbnVhcnkgMTYsIDIwMDFdCisgIERvIG5vdCB0eXBlZGVmIHBuZ19GSUxFX3AgaW4gcG5nY29uZi5oIHdoZW4gUE5HX05PX1NURElPIGlzIGRlZmluZWQuCisgIEZpeGVkICJwbmdfbW14X3N1cHBvcnRlZCIgdHlwbyBpbiBwcm9qZWN0IGRlZmluaXRpb24gZmlsZXMuCit2ZXJzaW9uIDEuMC45YmV0YTExIFtKYW51YXJ5IDE5LCAyMDAxXQorICBVcGRhdGVkIG1ha2VmaWxlLnNnaSB0byBtYWtlIHNoYXJlZCBsaWJyYXJ5LgorICBSZW1vdmVkIHBuZ19tbXhfc3VwcG9ydCgpIGZ1bmN0aW9uIGFuZCBkaXNhYmxlZCBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorICAgIGJ5IGRlZmF1bHQsIGZvciB0aGUgYmVuZWZpdCBvZiBETEwgZm9yd2FyZCBjb21wYXRpYmlsaXR5LiAgVGhlc2Ugd2lsbAorICAgIGJlIHJlLWVuYWJsZWQgaW4gdmVyc2lvbiAxLjIuMC4KK3ZlcnNpb24gMS4wLjlyYzIgW0phbnVhcnkgMjIsIDIwMDFdCisgIFJldmlzZWQgY3lnd2luIHN1cHBvcnQuCisKK3ZlcnNpb24gMS4wLjkgW0phbnVhcnkgMzEsIDIwMDFdCisgIEFkZGVkIGNoZWNrIG9mIGN5Z3dpbidzIEFMTF9TVEFUSUMgaW4gcG5nY29uZi5oCisgIEFkZGVkICItbm9tbXgiIHBhcmFtZXRlciB0byBjb250cmliL2dyZWdib29rL3JwbmcyLXdpbiBhbmQgcnBuZzIteCBkZW1vcy4KK3ZlcnNpb24gMS4wLjEwYmV0YTEgW01hcmNoIDE0LCAyMDAxXQorICBSZXZpc2VkIG1ha2VmaWxlLmRlYywgbWFrZWZpbGUuc2dpLCBhbmQgbWFrZWZpbGUuc2dnY2M7IGFkZGVkIG1ha2VmaWxlLmhwZ2NjLgorICBSZWZvcm1hdHRlZCBsaWJwbmcuMyB0byBlbGltaW5hdGUgYmFkIGxpbmUgYnJlYWtzLgorICBBZGRlZCBjaGVja3MgZm9yIF9tbXhfc3VwcG9ydGVkIGluIHRoZSByZWFkX2ZpbHRlcl9yb3cgZnVuY3Rpb24gb2YgcG5nZ2NjcmQuYworICBBZGRlZCBwcm90b3R5cGUgZm9yIHBuZ19tbXhfc3VwcG9ydCgpIG5lYXIgdGhlIHRvcCBvZiBwbmdnY2NyZC5jCisgIE1vdmVkIHNvbWUgZXJyb3IgY2hlY2tpbmcgZnJvbSBwbmdfaGFuZGxlX0lIRFIgdG8gcG5nX3NldF9JSERSLgorICBBZGRlZCBQTkdfTk9fUkVBRF9TVVBQT1JURUQgYW5kIFBOR19OT19XUklURV9TVVBQT1JURUQgbWFjcm9zLgorICBSZXZpc2VkIHBuZ19tbXhfc3VwcG9ydCgpIGZ1bmN0aW9uIGluIHBuZ2djY3JkLmMKKyAgUmVzdG9yZWQgdmVyc2lvbiAxLjAuOCBQTkdfV1JJVEVfRU1QVFlfUExURV9TVVBQT1JURUQgYmVoYXZpb3IgaW4gcG5nd3V0aWwuYworICBGaXhlZCBtZW1vcnkgbGVhayBpbiBjb250cmliL3Zpc3VwbmcvUG5nRmlsZS5jCisgIEZpeGVkIGJ1Z3MgaW4gcG5nX2NvbWJpbmVfcm93KCkgaW4gcG5nZ2NjcmQuYyBhbmQgcG5ndmNyZC5jIChDIHZlcnNpb24pCisgIEFkZGVkIHdhcm5pbmdzIHdoZW4gcmV0cmlldmluZyBvciBzZXR0aW5nIGdhbW1hPTAuCisgIEluY3JlYXNlZCB0aGUgZmlyc3QgcGFydCBvZiBtc2cgYnVmZmVyIGZyb20gMTYgdG8gMTggaW4gcG5nX2NodW5rX3dhcm5pbmcoKS4KK3ZlcnNpb24gMS4wLjEwcmMxIFtNYXJjaCAyMywgMjAwMV0KKyAgQ2hhbmdlZCBhbGwgaW5zdGFuY2VzIG9mIG1lbWNweSwgc3RyY3B5LCBhbmQgc3RybGVuIHRvIHBuZ19tZW1jcHksIHBuZ19zdHJjcHksCisgICAgYW5kIHBuZ19zdHJsZW4uCisgIFJldmlzZWQgcG5nX21teF9zdXBwb3J0ZWQoKSBmdW5jdGlvbiBpbiBwbmdnY2NyZC5jIHRvIHJldHVybiBwcm9wZXIgdmFsdWUuCisgIEZpeGVkIGJ1ZyBpbiBwcm9ncmVzc2l2ZSByZWFkaW5nIChwbmdwcmVhZC5jKSB3aXRoIHNtYWxsIGltYWdlcyAoaGVpZ2h0IDwgOCkuCisKK3ZlcnNpb24gMS4wLjEwIFtNYXJjaCAzMCwgMjAwMV0KKyAgRGVsZXRlZCBleHRyYW5lb3VzIHNwYWNlIChpbnRyb2R1Y2VkIGluIDEuMC45KSBmcm9tIGxpbmUgNDIgb2YgbWFrZWZpbGUuY3lnd2luCisgIEFkZGVkIGJlb3MgcHJvamVjdCBmaWxlcyAoQ2hyaXMgSGVyYm9ydGgpCit2ZXJzaW9uIDEuMC4xMWJldGExIFtBcHJpbCAzLCAyMDAxXQorICBBZGRlZCB0eXBlIGNhc3RzIG9uIHNldmVyYWwgcG5nX21hbGxvYygpIGNhbGxzIChEaW1pdHJpIFBhcGFkYXBvdWxvcykuCisgIFJlbW92ZWQgYSBuby1sb25nZXIgbmVlZGVkIEFJWCB3b3JrLWFyb3VuZCBmcm9tIHBuZ2NvbmYuaAorICBDaGFuZ2VkIHNldmVyYWwgIi8vIiBzaW5nbGUtbGluZSBjb21tZW50cyB0byBDLXN0eWxlIGluIHBuZ2djY3JkLmMKK3ZlcnNpb24gMS4wLjExYmV0YTIgW0FwcmlsIDExLCAyMDAxXQorICBSZW1vdmVkIFBOR0FQSSBmcm9tIHNldmVyYWwgZnVuY3Rpb25zIHdob3NlIHByb3RvdHlwZXMgZGlkIG5vdCBoYXZlIFBOR0FQSS4KKyAgVXBkYXRlZCBzY3JpcHRzL3BuZ29zMi5kZWYKK3ZlcnNpb24gMS4wLjExYmV0YTMgW0FwcmlsIDE0LCAyMDAxXQorICBBZGRlZCBjaGVja2luZyB0aGUgcmVzdWx0cyBvZiBtYW55IGluc3RhbmNlcyBvZiBwbmdfbWFsbG9jKCkgZm9yIE5VTEwKK3ZlcnNpb24gMS4wLjExYmV0YTQgW0FwcmlsIDIwLCAyMDAxXQorICBVbmRpZCB0aGUgY2hhbmdlcyBmcm9tIHZlcnNpb24gMS4wLjExYmV0YTMuICBBZGRlZCBhIGNoZWNrIGZvciBOVUxMIHJldHVybgorICAgIGZyb20gdXNlcidzIG1hbGxvY19mbigpLgorICBSZW1vdmVkIHNvbWUgdXNlbGVzcyB0eXBlIGNhc3RzIG9mIHRoZSBOVUxMIHBvaW50ZXIuCisgIEFkZGVkIG1ha2VmaWxlLm5ldGJzZAorCit2ZXJzaW9uIDEuMC4xMSBbQXByaWwgMjcsIDIwMDFdCisgIFJldmlzZWQgbWFrZWZpbGUubmV0YnNkCit2ZXJzaW9uIDEuMC4xMmJldGExIFtNYXkgMTQsIDIwMDFdCisgIFRlc3QgZm9yIFdpbmRvd3MgcGxhdGZvcm0gaW4gcG5nY29uZi5oIHdoZW4gaW5jbHVkaW5nIG1hbGxvYy5oIChFbW1hbnVlbCBCbG90KQorICBVcGRhdGVkIG1ha2VmaWxlLmN5Z3dpbiBhbmQgaGFuZGxpbmcgb2YgQ3lnd2luJ3MgQUxMX1NUQVRJQyBpbiBwbmdjb25mLmgKKyAgQWRkZWQgc29tZSBuZXZlci10by1iZS1leGVjdXRlZCBjb2RlIGluIHBuZ2djY3JkLmMgdG8gcXVpZXQgY29tcGlsZXIgd2FybmluZ3MuCisgIEVsaW1pbmF0ZWQgdGhlIHBuZ19lcnJvciBhYm91dCBhcHBzIHVzaW5nIHBuZ19yZWFkfHdyaXRlX2luaXQoKS4gIEluc3RlYWQsCisgICAgbGlicG5nIHdpbGwgcmVhbGxvY2F0ZSB0aGUgcG5nX3N0cnVjdCBhbmQgaW5mb19zdHJ1Y3QgaWYgdGhleSBhcmUgdG9vIHNtYWxsLgorICAgIFRoaXMgcmV0YWlucyBmdXR1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgZm9yIG9sZCBhcHBsaWNhdGlvbnMgd3JpdHRlbiBmb3IKKyAgICBsaWJwbmctMC44OCBhbmQgZWFybGllci4KK3ZlcnNpb24gMS4yLjBiZXRhMSBbTWF5IDYsIDIwMDFdCisgIEJ1bXBlZCBETExOVU0gdG8gMi4KKyAgUmUtZW5hYmxlZCBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCBhbmQgZW5hYmxlZCBQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVECisgICAgYnkgZGVmYXVsdC4KKyAgQWRkZWQgcnVudGltZSBzZWxlY3Rpb24gb2YgTU1YIGZlYXR1cmVzLgorICBBZGRlZCBwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMgZnVuY3Rpb24gYW5kIHJlbGF0ZWQgbWFjcm9zLgordmVyc2lvbiAxLjIuMGJldGEyIFtNYXkgNywgMjAwMV0KKyAgRmluaXNoZWQgbWVyZ2luZyAxLjIuMGJldGExIHdpdGggdmVyc2lvbiAxLjAuMTEKKyAgQWRkZWQgYSBjaGVjayBmb3IgYXR0ZW1wdHMgdG8gcmVhZCBvciB3cml0ZSBQTFRFIGluIGdyYXlzY2FsZSBQTkcgZGF0YXN0cmVhbXMuCit2ZXJzaW9uIDEuMi4wYmV0YTMgW01heSAxNywgMjAwMV0KKyAgRW5hYmxlZCB1c2VyIG1lbW9yeSBmdW5jdGlvbiBieSBkZWZhdWx0LgorICBNb2RpZmllZCBwbmdfY3JlYXRlX3N0cnVjdCBzbyBpdCBwYXNzZXMgdXNlciBtZW1fcHRyIHRvIHVzZXIgbWVtb3J5IGFsbG9jYXRvci4KKyAgSW5jcmVhc2VkIHBuZ19tbmdfZmVhdHVyZXMgZmxhZyBmcm9tIHBuZ19ieXRlIHRvIHBuZ191aW50XzMyLgorICBCdW1wZWQgc2hhcmVkLWxpYnJhcnkgKHNvLW51bWJlcikgYW5kIGRsbC1udW1iZXIgdG8gMy4KK3ZlcnNpb24gMS4yLjBiZXRhNCBbSnVuZSAyMywgMjAwMV0KKyAgQ2hlY2sgZm9yIG1pc3NpbmcgcHJvZmlsZSBsZW5ndGggZmllbGQgaW4gaUNDUCBjaHVuayBhbmQgZnJlZSBjaHVua19kYXRhCisgICAgIGluIGNhc2Ugb2YgdHJ1bmNhdGVkIGlDQ1AgY2h1bmsuCisgIEJ1bXBlZCBzaGFyZWQtbGlicmFyeSBudW1iZXIgdG8gMyBpbiBtYWtlZmlsZS5zZ2kgYW5kIG1ha2VmaWxlLnNnZ2NjCisgIEJ1bXBlZCBkbGwtbnVtYmVyIGZyb20gMiB0byAzIGluIG1ha2VmaWxlLmN5Z3dpbgorICBSZXZpc2VkIGNvbnRyaWIvZ3JlZ2Jvb2svcnBuZyoteC5jIHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsgYW5kIHRvIGV4aXQgY2xlYW5seQorICAgICBpZiB1c2VyIGF0dGVtcHRzIHRvIHJ1biBpdCBvbiBhbiA4LWJpdCBkaXNwbGF5LgorICBVcGRhdGVkIGNvbnRyaWIvZ3JlZ2Jvb2sKKyAgVXNlIHBuZ19tYWxsb2MgaW5zdGVhZCBvZiBwbmdfemFsbG9jIHRvIGFsbG9jYXRlIHBhbGV0dGUgaW4gcG5nc2V0LmMKKyAgVXBkYXRlZCBtYWtlZmlsZS5pYm1jCisgIEFkZGVkIHNvbWUgdHlwZWNhc3RzIHRvIGVsaW1pbmF0ZSBnY2MgMy4wIHdhcm5pbmdzLiAgQ2hhbmdlZCBwcm90b3R5cGVzCisgICAgIG9mIHBuZ193cml0ZV9vRkZTIHdpZHRoIGFuZCBoZWlnaHQgZnJvbSBwbmdfdWludF8zMiB0byBwbmdfaW50XzMyLgorICBVcGRhdGVkIGV4YW1wbGUuYworICBSZXZpc2VkIHByb3RvdHlwZXMgZm9yIHBuZ19kZWJ1Z19tYWxsb2MgYW5kIHBuZ19kZWJ1Z19mcmVlIGluIHBuZ3Rlc3QuYwordmVyc2lvbiAxLjIuMGJldGE1IFtBdWd1c3QgOCwgMjAwMV0KKyAgUmV2aXNlZCBjb250cmliL2dyZWdib29rCisgIFJldmlzZWQgbWFrZWZpbGUuZ2NtbXgKKyAgUmV2aXNlZCBwbmdnY2NyZC5jIHRvIGNvbmRpdGlvbmFsbHkgY29tcGlsZSBzb21lIHRocmVhZC11bnNhZmUgY29kZSBvbmx5CisgICAgIHdoZW4gUE5HX1RIUkVBRF9VTlNBRkVfT0sgaXMgZGVmaW5lZC4KKyAgQWRkZWQgdGVzdHMgdG8gcHJldmVudCBwbmd3dXRpbC5jIGZyb20gd3JpdGluZyBhIGJLR0Qgb3IgdFJOUyBjaHVuayB3aXRoCisgICAgIHZhbHVlIGV4Y2VlZGluZyAyXmJpdF9kZXB0aC0xCisgIFJldmlzZWQgbWFrZWZpbGUuc2dpIGFuZCBtYWtlZmlsZS5zZ2djYworICBSZXBsYWNlZCBjYWxscyB0byBmcHJpbnRmKHN0ZGVyciwuLi4pIHdpdGggcG5nX3dhcm5pbmcoKSBpbiBwbmdnY2NyZC5jCisgIFJlbW92ZWQgcmVzdHJpY3Rpb24gdGhhdCBkb19pbnZlcnRfbW9ubyBvbmx5IG9wZXJhdGUgb24gMS1iaXQgb3BhcXVlIGZpbGVzCisKK3ZlcnNpb24gMS4yLjAgW1NlcHRlbWJlciAxLCAyMDAxXQorICBDaGFuZ2VkIGEgcG5nX3dhcm5pbmcoKSB0byBwbmdfZGVidWcoKSBpbiBwbmdnY2NyZC5jCisgIEZpeGVkIGNvbnRyaWIvZ3JlZ2Jvb2svcnBuZy14LmMsIHJwbmcyLXguYyB0byBhdm9pZCBjcmFzaCB3aXRoIFhGcmVlR0MoKS4KK3ZlcnNpb24gMS4yLjFiZXRhMSBbT2N0b2JlciAxOSwgMjAwMV0KKyAgUmV2aXNlZCBtYWtlZmlsZS5zdGQgaW4gY29udHJpYi9wbmdtaW51cworICBJbmNsdWRlIGJhY2tncm91bmRfMSBpbiBwbmdfc3RydWN0IHJlZ2FyZGxlc3Mgb2YgZ2FtbWEgc3VwcG9ydC4KKyAgUmV2aXNlZCBtYWtlZmlsZS5uZXRic2QgYW5kIG1ha2VmaWxlLm1hY29zeCwgYWRkZWQgbWFrZWZpbGUuZGFyd2luLgorICBSZXZpc2VkIGV4YW1wbGUuYyB0byBwcm92aWRlIG1vcmUgZGV0YWlscyBhYm91dCB1c2luZyByb3dfY2FsbGJhY2soKS4KK3ZlcnNpb24gMS4yLjFiZXRhMiBbT2N0b2JlciAyNSwgMjAwMV0KKyAgQWRkZWQgdHlwZSBjYXN0IHRvIGVhY2ggTlVMTCBhcHBlYXJpbmcgaW4gYSBmdW5jdGlvbiBjYWxsLCBleGNlcHQgZm9yCisgICAgV0lOQ0UgZnVuY3Rpb25zLgorICBBZGRlZCBtYWtlZmlsZS5zbzkuCit2ZXJzaW9uIDEuMi4xYmV0YTMgW09jdG9iZXIgMjcsIDIwMDFdCisgIFJlbW92ZWQgdHlwZSBjYXN0cyBmcm9tIGFsbCBOVUxMcy4KKyAgU2ltcGxpZmllZCBwbmdfY3JlYXRlX3N0cnVjdF8yKCkuCit2ZXJzaW9uIDEuMi4xYmV0YTQgW05vdmVtYmVyIDcsIDIwMDFdCisgIFJldmlzZWQgcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCgpIGFuZCBwbmdfY3JlYXRfc3RydWN0XzIoKS4KKyAgQWRkZWQgZXJyb3IgbWVzc2FnZSBpZiBwbmdfd3JpdGVfaW5mbygpIHdhcyBvbWl0dGVkLgorICBUeXBlIGNhc3QgTlVMTHMgYXBwZWFyaW5nIGluIGZ1bmN0aW9uIGNhbGxzIHdoZW4gX05PX1BST1RPIG9yCisgICAgUE5HX1RZUEVDQVNUX05VTEwgaXMgZGVmaW5lZC4KK3ZlcnNpb24gMS4yLjFyYzEgW05vdmVtYmVyIDI0LCAyMDAxXQorICBUeXBlIGNhc3QgTlVMTHMgYXBwZWFyaW5nIGluIGZ1bmN0aW9uIGNhbGxzIGV4Y2VwdCB3aGVuIFBOR19OT19UWVBFQ0FTVF9OVUxMCisgICAgaXMgZGVmaW5lZC4KKyAgQ2hhbmdlZCB0eXBlY2FzdCBvZiAic2l6ZSIgYXJndW1lbnQgdG8gcG5nX3NpemVfdCBpbiBwbmdtZW0uYyBjYWxscyB0bworICAgIHRoZSB1c2VyIG1hbGxvY19mbiwgdG8gYWdyZWUgd2l0aCB0aGUgcHJvdG90eXBlIGluIHBuZy5oCisgIEFkZGVkIGEgcG9wL3B1c2ggb3BlcmF0aW9uIHRvIHBuZ2djY3JkLmMsIHRvIHByZXNlcnZlIEVmbGFnIChNYXhpbSBTb2JvbGV2KQorICBVcGRhdGVkIG1ha2VmaWxlLnNnaSB0byByZWNvZ25pemUgTElCUEFUSCBhbmQgSU5DUEFUSC4KKyAgVXBkYXRlZCB2YXJpb3VzIG1ha2VmaWxlcyBzbyAibWFrZSBjbGVhbiIgZG9lcyBub3QgcmVtb3ZlIHByZXZpb3VzIG1ham9yCisgICAgdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCit2ZXJzaW9uIDEuMi4xcmMyIFtEZWNlbWJlciA0LCAyMDAxXQorICBBbHdheXMgYWxsb2NhdGUgMjU2LWVudHJ5IGludGVybmFsIHBhbGV0dGUsIGhpc3QsIGFuZCB0cmFucyBhcnJheXMsIHRvCisgICAgYXZvaWQgb3V0LW9mLWJvdW5kcyBtZW1vcnkgcmVmZXJlbmNlIGNhdXNlZCBieSBpbnZhbGlkIFBORyBkYXRhc3RyZWFtcy4KKyAgQWRkZWQgYSBjaGVjayBmb3IgcHJlZml4X2xlbmd0aCA+IGRhdGFfbGVuZ3RoIGluIGlDQ1AgY2h1bmsgaGFuZGxlci4KKwordmVyc2lvbiAxLjIuMSBbRGVjZW1iZXIgNywgMjAwMV0KKyAgTm9uZS4KK3ZlcnNpb24gMS4yLjJiZXRhMSBbRmVicnVhcnkgMjIsIDIwMDJdCisgIEZpeGVkIGEgYnVnIHdpdGggcmVhZGluZyB0aGUgbGVuZ3RoIG9mIGlDQ1AgcHJvZmlsZXMgKExhcnJ5IFJlZXZlcykuCisgIFJldmlzZWQgbWFrZWZpbGUubGludXgsIG1ha2VmaWxlLmdjbW14LCBhbmQgbWFrZWZpbGUuc2dpIHRvIGdlbmVyYXRlCisgICAgbGlicG5nLmEsIGxpYnBuZzEyLnNvIChub3QgbGlicG5nLnNvLjMpLCBhbmQgbGlicG5nMTIvcG5nLmgKKyAgUmV2aXNlZCBtYWtlZmlsZS5kYXJ3aW4gdG8gcmVtb3ZlICItdW5kZWZpbmVkIHN1cHByZXNzIiBvcHRpb24uCisgIEFkZGVkIGNoZWNrcyBmb3IgZ2FtbWEgYW5kIGNocm9tYXRpY2l0eSB2YWx1ZXMgb3ZlciAyMTQ3NC44Mywgd2hpY2ggZXhjZWVkCisgICAgdGhlIGxpbWl0IGZvciBQTkcgdW5zaWduZWQgMzItYml0IGludGVnZXJzIHdoZW4gZW5jb2RlZC4KKyAgUmV2aXNlZCBjYWxscyB0byBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCkgYW5kIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCkKKyAgICBmb3Igc2ltcGxlciBkZWJ1Z2dpbmcuCisgIFJldmlzZWQgcG5nX3phbGxvYygpIHNvIHpsaWIgaGFuZGxlcyBlcnJvcnMgKHVzZXMgUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKQordmVyc2lvbiAxLjIuMmJldGEyIFtGZWJydWFyeSAyMywgMjAwMl0KKyAgQ2hlY2sgY2h1bmtfbGVuZ3RoIGFuZCBpZGF0X3NpemUgZm9yIGludmFsaWQgKG92ZXIgUE5HX01BWF9VSU5UKSBsZW5ndGhzLgorICBDaGVjayBmb3IgaW52YWxpZCBpbWFnZSBkaW1lbnNpb25zIGluIHBuZ19nZXRfSUhEUi4KKyAgQWRkZWQgbWlzc2luZyAiZmk7IiBpbiB0aGUgaW5zdGFsbCB0YXJnZXQgb2YgdGhlIFNHSSBtYWtlZmlsZXMuCisgIEFkZGVkIGluc3RhbGwtc3RhdGljIHRvIGFsbCBtYWtlZmlsZXMgdGhhdCBtYWtlIHNoYXJlZCBsaWJyYXJpZXMuCisgIEFsd2F5cyBkbyBnYW1tYSBjb21wZW5zYXRpb24gd2hlbiBpbWFnZSBpcyBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQuCit2ZXJzaW9uIDEuMi4yYmV0YTMgW01hcmNoIDcsIDIwMDJdCisgIENvbXB1dGUgYmFja2dyb3VuZC5ncmF5IGFuZCBiYWNrZ3JvdW5kXzEuZ3JheSBldmVuIHdoZW4gY29sb3JfdHlwZSBpcyBSR0IKKyAgICBpbiBjYXNlIGltYWdlIGdldHMgcmVkdWNlZCB0byBncmF5IGxhdGVyLgorICBNb2RpZmllZCBzaGFyZWQtbGlicmFyeSBtYWtlZmlsZXMgdG8gaW5zdGFsbCBwa2djb25maWcvbGlicG5nTk4ucGMuCisgIEV4cG9ydCAod2l0aCBQTkdBUEkpIHBuZ196YWxsb2MsIHBuZ196ZnJlZSwgYW5kIHBuZ19oYW5kbGVfYXNfdW5rbm93bgorICBSZW1vdmVkIHVudXNlZCBwbmdfd3JpdGVfZGVzdHJveV9pbmZvIHByb3RvdHlwZSBmcm9tIHBuZy5oCisgIEVsaW1pbmF0ZWQgaW5jb3JyZWN0IHVzZSBvZiB3aWR0aF9tbXggZnJvbSBwbmdnY2NyZC5jIGluIHBpeGVsX2J5dGVzID09IDggY2FzZQorICBBZGRlZCBpbnN0YWxsLXNoYXJlZCB0YXJnZXQgdG8gYWxsIG1ha2VmaWxlcyB0aGF0IG1ha2Ugc2hhcmVkIGxpYnJhcmllcy4KKyAgU3RvcHBlZCBhIGRvdWJsZSBmcmVlIG9mIHBhbGV0dGUsIGhpc3QsIGFuZCB0cmFucyB3aGVuIG5vdCB1c2luZyBmcmVlX21lLgorICBBZGRlZCBtYWtlZmlsZS4zMnN1bnUgZm9yIFN1biBVbHRyYSAzMiBhbmQgbWFrZWZpbGUuNjRzdW51IGZvciBTdW4gVWx0cmEgNjQuCit2ZXJzaW9uIDEuMi4yYmV0YTQgW01hcmNoIDgsIDIwMDJdCisgIENvbXB1dGUgYmFja2dyb3VuZC5ncmF5IGFuZCBiYWNrZ3JvdW5kXzEuZ3JheSBldmVuIHdoZW4gY29sb3JfdHlwZSBpcyBSR0IKKyAgICBpbiBjYXNlIGltYWdlIGdldHMgcmVkdWNlZCB0byBncmF5IGxhdGVyIChKYXNvbiBTdW1tZXJzKS4KKyAgUmVsb2NhdGVkIGEgbWlzcGxhY2VkIC9iaW4vcm0gaW4gdGhlICJpbnN0YWxsLXNoYXJlZCIgbWFrZWZpbGUgdGFyZ2V0cworICBBZGRlZCBQTkdfMV8wX1ggbWFjcm8gd2hpY2ggY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSAxLjAueC1jb21wYXRpYmxlIGxpYnJhcnkuCit2ZXJzaW9uIDEuMi4yYmV0YTUgW01hcmNoIDI2LCAyMDAyXQorICBBZGRlZCBtaXNzaW5nIFBOR0FQSSB0byBzZXZlcmFsIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorICBDaGVjayBmb3IgaW52YWxpZCBiaXRfZGVwdGggb3IgY29sb3JfdHlwZSBpbiBwbmdfZ2V0X0lIRFIoKSwgYW5kCisgICAgY2hlY2sgZm9yIG1pc3NpbmcgUExURSBvciBJSERSIGluIHBuZ19wdXNoX3JlYWRfY2h1bmsoKSAoTWF0dGhpYXMgQ2xhc2VuKS4KKyAgUmV2aXNlZCBpVFh0IHN1cHBvcnQgdG8gYWNjZXB0IE5VTEwgZm9yIGxhbmcgYW5kIGxhbmdfa2V5LgorICBDb21wdXRlIGdhbW1hIGZvciBjb2xvciBjb21wb25lbnRzIG9mIGJhY2tncm91bmQgZXZlbiB3aGVuIGNvbG9yX3R5cGUgaXMgZ3JheS4KKyAgQ2hhbmdlZCAiKCkiIHRvICJ7fSIgaW4gc2NyaXB0cy9saWJwbmcucGMuaW4uCisgIFJldmlzZWQgbWFrZWZpbGVzIHRvIHB1dCBwbmcuaCBhbmQgcG5nY29uZi5oIG9ubHkgaW4gJHByZWZpeC9pbmNsdWRlL2xpYnBuZ05OCisgIFJldmlzZWQgbWFrZWZpbGVzIHRvIG1ha2Ugc3ltbGluayB0byBsaWJwbmcuc28uTk4gaW4gYWRkaXRpb24gdG8gbGlicG5nTk4uc28KK3ZlcnNpb24gMS4yLjJiZXRhNiBbTWFyY2ggMzEsIDIwMDJdCit2ZXJzaW9uIDEuMC4xM2JldGExIFtNYXJjaCAzMSwgMjAwMl0KKyAgUHJldmVudCBwbmdfemFsbG9jKCkgZnJvbSB0cnlpbmcgdG8gbWVtc2V0IG1lbW9yeSB0aGF0IGl0IGZhaWxlZCB0byBhY3F1aXJlLgorICBBZGQgdHlwZWNhc3RzIG9mIFBOR19NQVhfVUlOVCBpbiBwbmdzZXRfY0hSTV9maXhlZCgpIChNYXR0IEhvbGdhdGUpLgorICBFbnN1cmUgdGhhdCB0aGUgcmlnaHQgZnVuY3Rpb24gKHVzZXIgb3IgZGVmYXVsdCkgaXMgdXNlZCB0byBmcmVlIHRoZQorICAgIHBuZ19zdHJ1Y3QgYWZ0ZXIgYW4gZXJyb3IgaW4gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkuCit2ZXJzaW9uIDEuMi4ycmMxIFtBcHJpbCA3LCAyMDAyXQordmVyc2lvbiAxLjAuMTNyYzEgW0FwcmlsIDcsIDIwMDJdCisgIFNhdmUgdGhlIGVieCByZWdpc3RlciBpbiBwbmdnY2NyZC5jIChTYW1pIEZhcmluKQorICBBZGQgIm1lbV9wdHIgPSBwbmdfcHRyLT5tZW1fcHRyIiBpbiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSAoUGF1bCBHYXJkbmVyKS4KKyAgVXBkYXRlZCBtYWtlZmlsZXMgdG8gcHV0IGhlYWRlcnMgaW4gaW5jbHVkZS9saWJwbmcgYW5kIHJlbW92ZSBvbGQgaW5jbHVkZS8qLmguCisKK3ZlcnNpb24gMS4yLjIgW0FwcmlsIDE1LCAyMDAyXQordmVyc2lvbiAxLjAuMTMgW0FwcmlsIDE1LCAyMDAyXQorICBSZXZpc2VkIGRlc2NyaXB0aW9uIG9mIHBuZ19zZXRfZmlsdGVyKCkgaW4gbGlicG5nLjMvbGlicG5nLnR4dC4KKyAgUmV2aXNlZCBtYWtlZmlsZS5uZXRic2QgYW5kIGFkZGVkIG1ha2VmaWxlLm5lTk5ic2QgYW5kIG1ha2VmaWxlLmZyZWVic2QKK3ZlcnNpb24gMS4wLjEzcGF0Y2gwMSBbQXByaWwgMTcsIDIwMDJdCit2ZXJzaW9uIDEuMi4ycGF0Y2gwMSBbQXByaWwgMTcsIDIwMDJdCisgIENoYW5nZWQgJHtQTkdNQUp9LiR7UE5HVkVSfSBidWcgdG8gJHtQTkdWRVJ9IGluIG1ha2VmaWxlLnNnaSBhbmQgbWFrZWZpbGUuc2dnY2MKKyAgRml4ZWQgVkVSIC0+IFBOR1ZFUiB0eXBvIGluIG1ha2VmaWxlLm1hY29zeCBhbmQgYWRkZWQgaW5zdGFsbC1zdGF0aWMgdG8gaW5zdGFsbAorICBBZGRlZCBpbnN0YWxsOiB0YXJnZXQgdG8gbWFrZWZpbGUuMzJzdW51IGFuZCBtYWtlZmlsZS42NHN1bnUKK3ZlcnNpb24gMS4wLjEzcGF0Y2gwMyBbQXByaWwgMTgsIDIwMDJdCit2ZXJzaW9uIDEuMi4ycGF0Y2gwMyBbQXByaWwgMTgsIDIwMDJdCisgIFJldmlzZWQgMTUgbWFrZWZpbGVzIHRvIGxpbmsgbGlicG5nLmEgdG8gbGlicG5nTk4uYSBhbmQgdGhlIGluY2x1ZGUgbGlicG5nCisgIHN1YmRpcmVjdG9yeSB0byBsaWJwbmdOTiBzdWJkaXJlY3Rvcnkgd2l0aG91dCB0aGUgZnVsbCBwYXRobmFtZS4KKyAgTW92ZWQgZ2VuZXJhdGlvbiBvZiBsaWJwbmcucGMgZnJvbSAiaW5zdGFsbCIgdG8gImFsbCIgaW4gMTUgbWFrZWZpbGVzLgordmVyc2lvbiAxLjIuM3JjMSBbQXByaWwgMjgsIDIwMDJdCisgIEFkZGVkIGluc3RhbGwtbWFuIHRhcmdldCB0byAxNSBtYWtlZmlsZXMgKERpbWl0cmkgUGFwYWRvcG9sb3VzLU9yZmFub3MpLgorICBBZGRlZCAkKERFU1RESVIpIGZlYXR1cmUgdG8gMjQgbWFrZWZpbGVzIChUaW0gTW9vbmV5KQorICBGaXhlZCBidWcgd2l0aCAkcHJlZml4LCBzaG91bGQgYmUgJChwcmVmaXgpIGluIG1ha2VmaWxlLmhwdXguCisgIFVwZGF0ZWQgY3lnd2luLXNwZWNpZmljIHBvcnRpb24gb2YgcG5nY29uZi5oIGFuZCByZXZpc2VkIG1ha2VmaWxlLmN5Z3dpbgorICBBZGRlZCBhIGxpbmsgZnJvbSBsaWJwbmdOTi5wYyB0byBsaWJwbmcucGMgaW4gMTUgbWFrZWZpbGVzLgorICBBZGRlZCBsaW5rcyBmcm9tIGluY2x1ZGUvbGlicG5nTk4vKi5oIHRvIGluY2x1ZGUvKi5oIGluIDI0IG1ha2VmaWxlcy4KKyAgUmV2aXNlZCBtYWtlZmlsZS5kYXJ3aW4gdG8gbWFrZSByZWxhdGl2ZSBsaW5rcyB3aXRob3V0IGZ1bGwgcGF0aG5hbWUuCisgIEFkZGVkIHNldGptcCgpIGF0IHRoZSBlbmQgb2YgcG5nX2NyZWF0ZV8qX3N0cnVjdF8yKCkgaW4gY2FzZSB1c2VyIGZvcmdldHMKKyAgICB0byBwdXQgb25lIGluIHRoZWlyIGFwcGxpY2F0aW9uLgorICBSZXN0b3JlZCBwbmdfemFsbG9jKCkgYW5kIHBuZ196ZnJlZSgpIHByb3RvdHlwZXMgdG8gdmVyc2lvbiAxLjIuMSBhbmQKKyAgICByZW1vdmVkIHRoZW0gZnJvbSBtb2R1bGUgZGVmaW5pdGlvbiBmaWxlcy4KK3ZlcnNpb24gMS4yLjNyYzIgW01heSAxLCAyMDAyXQorICBGaXhlZCBidWcgaW4gcmVwb3J0aW5nIG51bWJlciBvZiBjaGFubmVscyBpbiBwbmdnZXQuYyBhbmQgcG5nc2V0LmMsCisgICAgdGhhdCB3YXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuMi4yYmV0YTUuCisgIEV4cG9ydGVkIHBuZ196YWxsb2MoKSwgcG5nX3pmcmVlKCksIHBuZ19kZWZhdWx0X3JlYWQoKSwgcG5nX2RlZmF1bHRfd3JpdGUoKSwKKyAgICBwbmdfZGVmYXVsdF9mbHVzaCgpLCBhbmQgcG5nX3B1c2hfZmlsbF9idWZmZXIoKSBhbmQgaW5jbHVkZWQgdGhlbSBpbgorICAgIG1vZHVsZSBkZWZpbml0aW9uIGZpbGVzLgorICBBZGRlZCAibGlicG5nLnBjIiBkZXBlbmRlbmN5IHRvIHRoZSAiaW5zdGFsbC1zaGFyZWQiIHRhcmdldCBpbiAxNSBtYWtlZmlsZXMuCit2ZXJzaW9uIDEuMi4zcmMzIFtNYXkgMSwgMjAwMl0KKyAgUmV2aXNlZCBwcm90b3R5cGUgZm9yIHBuZ19kZWZhdWx0X2ZsdXNoKCkKKyAgUmVtb3ZlIG9sZCBsaWJwbmcucGMgYW5kIGxpYnBuZ05OLnBjIGJlZm9yZSBpbnN0YWxsaW5nIG5ldyBvbmVzLgordmVyc2lvbiAxLjIuM3JjNCBbTWF5IDIsIDIwMDJdCisgIFR5cG9zIGluICouZGVmIGZpbGVzIChwbmdfZGVmYXVsdF9yZWFkfHdyaXRlIC0+IHBuZ19kZWZhdWx0X3JlYWR8d3JpdGVfZGF0YSkKKyAgSW4gbWFrZWZpbGVzLCBjaGFuZ2VkIHJtIGxpYnBuZy5OTi5wYyB0byBybSBsaWJwbmdOTi5wYworICBBZGRlZCBsaWJwbmctY29uZmlnIGFuZCBsaWJwbmdOTi1jb25maWcgYW5kIG1vZGlmaWVkIG1ha2VmaWxlcyB0byBpbnN0YWxsIHRoZW0uCisgIENoYW5nZWQgJChNQU5QQVRIKSB0byAkKERFU1RESVIpJChNQU5QQVRIKSBpbiBtYWtlZmlsZXMKKyAgQWRkZWQgIldpbjMyIERMTCBWQiIgY29uZmlndXJhdGlvbiB0byBwcm9qZWN0cy9tc3ZjL2xpYnBuZy5kc3AKK3ZlcnNpb24gMS4yLjNyYzUgW01heSAxMSwgMjAwMl0KKyAgQ2hhbmdlZCAiZXJyb3IiIGFuZCAibWVzc2FnZSIgaW4gcHJvdG90eXBlcyB0byAiZXJyb3JfbWVzc2FnZSIgYW5kCisgICAgIndhcm5pbmdfbWVzc2FnZSIgdG8gYXZvaWQgbmFtZXNwYWNlIGNvbmZsaWN0LgorICBSZXZpc2VkIDE1IG1ha2VmaWxlcyB0byBidWlsZCBsaWJwbmctY29uZmlnIGZyb20gbGlicG5nLWNvbmZpZy0qLmluCisgIE9uY2UgbW9yZSByZXN0b3JlZCBwbmdfemFsbG9jIGFuZCBwbmdfemZyZWUgdG8gcmVndWxhciBub25leHBvcnRlZCBmb3JtLgorICBSZXN0b3JlZCBwbmdfZGVmYXVsdF9yZWFkfHdyaXRlX2RhdGEsIHBuZ19kZWZhdWx0X2ZsdXNoLCBwbmdfcmVhZF9maWxsX2J1ZmZlcgorICAgIHRvIG5vbmV4cG9ydGVkIGZvcm0sIGJ1dCB3aXRoIFBOR0FQSSwgYW5kIHJlbW92ZWQgdGhlbSBmcm9tIG1vZHVsZSBkZWYgZmlsZXMuCit2ZXJzaW9uIDEuMi4zcmM2IFtNYXkgMTQsIDIwMDJdCisgIFJlbW92ZWQgIlBOR0FQSSIgZnJvbSBwbmdfemFsbG9jKCkgYW5kIHBuZ196ZnJlZSgpIGluIHBuZy5jCisgIENoYW5nZWQgIkd6IiB0byAiR2QiIGluIHByb2plY3RzL21zdmMvbGlicG5nLmRzcCBhbmQgemxpYi5kc3AuCisgIFJlbW92ZWQgbGVmdG92ZXIgbGlicG5nLWNvbmZpZyAic2VkIiBzY3JpcHQgZnJvbSBmb3VyIG1ha2VmaWxlcy4KKyAgUmV2aXNlZCBsaWJwbmctY29uZmlnIGNyZWF0aW5nIHNjcmlwdCBpbiAxNiBtYWtlZmlsZXMuCisKK3ZlcnNpb24gMS4yLjMgW01heSAyMiwgMjAwMl0KKyAgUmV2aXNlZCBsaWJwbmctY29uZmlnIHRhcmdldCBpbiBtYWtlZmlsZS5jeWd3aW4uCisgIFJlbW92ZWQgZGVzY3JpcHRpb24gb2YgcG5nX3NldF9tZW1fZm4oKSBmcm9tIGRvY3VtZW50YXRpb24uCisgIFJldmlzZWQgbWFrZWZpbGUuZnJlZWJzZC4KKyAgTWlub3IgY29zbWV0aWMgY2hhbmdlcyB0byAxNSBtYWtlZmlsZXMsIGUuZy4sICQoREkpID0gJChERVNURElSKS8kKElOQ0RJUikuCisgIFJldmlzZWQgcHJvamVjdHMvbXN2Yy9SRUFETUUudHh0CisgIENoYW5nZWQgLWxwbmcgdG8gLWxwbmdOTiBpbiBMREZMQUdTIGluIHNldmVyYWwgbWFrZWZpbGVzLgordmVyc2lvbiAxLjIuNGJldGExIFtNYXkgMjQsIDIwMDJdCisgIEFkZGVkIGxpYnBuZy5wYyBhbmQgbGlicG5nLWNvbmZpZyB0byAiYWxsOiIgdGFyZ2V0IGluIDE2IG1ha2VmaWxlcy4KKyAgRml4ZWQgYnVnIGluIDE2IG1ha2VmaWxlczogJChERVNURElSKS8kKExJQlBBVEgpIHRvICQoREVTVERJUikkKExJQlBBVEgpCisgIEFkZGVkIG1pc3NpbmcgIlwiIGJlZm9yZSBjbG9zaW5nIGRvdWJsZSBxdW90ZSBpbiBtYWtlZmlsZS5nY21teC4KKyAgUGx1Z2dlZCB2YXJpb3VzIG1lbW9yeSBsZWFrczsgYWRkZWQgcG5nX21hbGxvY193YXJuKCkgYW5kIHBuZ19zZXRfdGV4dF8yKCkKKyAgICBmdW5jdGlvbnMuCit2ZXJzaW9uIDEuMi40YmV0YTIgW0p1bmUgMjUsIDIwMDJdCisgIFBsdWdnZWQgbWVtb3J5IGxlYWsgb2YgcG5nX3B0ci0+Y3VycmVudF90ZXh0IChNYXR0IEhvbGdhdGUpLgorICBDaGVjayBmb3IgYnVmZmVyIG92ZXJmbG93IGJlZm9yZSByZWFkaW5nIENSQyBpbiBwbmdwcmVhZC5jIChXYXJ3aWNrIEFsbGlzb24pCisgIEFkZGVkIC1zb25hbWUgdG8gdGhlIGxvYWRlciBmbGFncyBpbiBtYWtlZmlsZS5kZWMsIG1ha2VmaWxlLnNnaSwgYW5kCisgICAgbWFrZWZpbGUuc2dnY2MuCisgIEFkZGVkICJ0ZXN0LWluc3RhbGxlZCIgdGFyZ2V0IHRvIG1ha2VmaWxlLmxpbnV4LCBtYWtlZmlsZS5nY21teCwKKyAgICBtYWtlZmlsZS5zZ2ksIGFuZCBtYWtlZmlsZS5zZ2djYy4KK3ZlcnNpb24gMS4yLjRiZXRhMyBbSnVuZSAyOCwgMjAwMl0KKyAgUGx1Z2dlZCBtZW1vcnkgbGVhayBvZiByb3dfYnVmIGluIHBuZ3Rlc3QuYyB3aGVuIHRoZXJlIGlzIGEgcG5nX2Vycm9yKCkuCisgIERldGVjdCBidWZmZXIgb3ZlcmZsb3cgaW4gcG5ncHJlYWQuYyB3aGVuIElEQVQgaXMgY29ycnVwdGVkIHdpdGggZXh0cmEgZGF0YS4KKyAgQWRkZWQgInRlc3QtaW5zdGFsbGVkIiB0YXJnZXQgdG8gbWFrZWZpbGUuMzJzdW51LCBtYWtlZmlsZS42NHN1bnUsCisgICAgbWFrZWZpbGUuYmVvcywgbWFrZWZpbGUuZGFyd2luLCBtYWtlZmlsZS5kZWMsIG1ha2VmaWxlLm1hY29zeCwKKyAgICBtYWtlZmlsZS5zb2xhcmlzLCBtYWtlZmlsZS5ocHV4LCBtYWtlZmlsZS5ocGdjYywgYW5kIG1ha2VmaWxlLnNvOS4KK3ZlcnNpb24gMS4yLjRyYzEgYW5kIDEuMC4xNHJjMSBbSnVseSAyLCAyMDAyXQorICBBZGRlZCAidGVzdC1pbnN0YWxsZWQiIHRhcmdldCB0byBtYWtlZmlsZS5jeWd3aW4gYW5kIG1ha2VmaWxlLnNjby4KKyAgUmV2aXNlZCBwbmdnY2NyZC5jIHRvIGJlIGFibGUgdG8gYmFjayBvdXQgdmVyc2lvbiAxLjAueCB2aWEgUE5HXzFfMF9YIG1hY3JvLgorCit2ZXJzaW9uIDEuMi40IGFuZCAxLjAuMTQgW0p1bHkgOCwgMjAwMl0KKyAgQ2hhbmdlZCBwbmdfd2FybmluZygpIHRvIHBuZ19lcnJvcigpIHdoZW4gd2lkdGggaXMgdG9vIGxhcmdlIHRvIHByb2Nlc3MuCit2ZXJzaW9uIDEuMi40cGF0Y2gwMSBbSnVseSAyMCwgMjAwMl0KKyAgUmV2aXNlZCBtYWtlZmlsZS5jeWd3aW4gdG8gdXNlIERMTCBudW1iZXIgMTIgaW5zdGVhZCBvZiAxMy4KK3ZlcnNpb24gMS4yLjViZXRhMSBbQXVndXN0IDYsIDIwMDJdCisgIEFkZGVkIGNvZGUgdG8gY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jIHRvIGlnbm9yZSB1bnVzZWQgY2h1bmtzLgorICBSZXBsYWNlZCB0b3VjYW4ucG5nIGluIGNvbnRyaWIvZ3JlZ2Jvb2sgKGl0IGhhcyBiZWVuIGNvcnJ1cHQgc2luY2UgMS4wLjExKQorICBSZW1vdmVkIHNvbWUgc3RyYXkgKi5vIGZpbGVzIGZyb20gY29udHJpYi9ncmVnYm9vay4KKyAgQ2hhbmdlZCBwbmdfZXJyb3IoKSB0byBwbmdfd2FybmluZygpIGFib3V0ICJUb28gbXVjaCBkYXRhIiBpbiBwbmdwcmVhZC5jCisgICAgYW5kIGFib3V0ICJFeHRyYSBjb21wcmVzc2VkIGRhdGEiIGluIHBuZ3J1dGlsLmMuCisgIFByZXZlbnQgcG5nX3B0ci0+cGFzcyBmcm9tIGV4Y2VlZGluZyA3IGluIHBuZ19wdXNoX2ZpbmlzaF9yb3coKS4KKyAgVXBkYXRlZCBtYWtlZmlsZS5ocGdjYworICBVcGRhdGVkIHBuZy5jIGFuZCBwbmdnY2NyZC5jIGhhbmRsaW5nIG9mIHJldHVybiBmcm9tIHBuZ19tbXhfc3VwcG9ydCgpCit2ZXJzaW9uIDEuMi41YmV0YTIgW0F1Z3VzdCAxNSwgMjAwMl0KKyAgT25seSBpc3N1ZSBwbmdfd2FybmluZygpIGFib3V0ICJUb28gbXVjaCBkYXRhIiBpbiBwbmdwcmVhZC5jIHdoZW4gYXZhaWxfaW4KKyAgICBpcyBub256ZXJvLgorICBVcGRhdGVkIG1ha2VmaWxlcyB0byBpbnN0YWxsIGEgc2VwYXJhdGUgbGlicG5nLnNvLjMgd2l0aCBpdHMgb3duIHJwYXRoLgordmVyc2lvbiAxLjIuNXJjMSBhbmQgMS4wLjE1cmMxIFtBdWd1c3QgMjQsIDIwMDJdCisgIFJldmlzZWQgbWFrZWZpbGVzIHRvIG5vdCByZW1vdmUgcHJldmlvdXMgbWlub3IgdmVyc2lvbnMgb2Ygc2hhcmVkIGxpYnJhcmllcy4KK3ZlcnNpb24gMS4yLjVyYzIgYW5kIDEuMC4xNXJjMiBbU2VwdGVtYmVyIDE2LCAyMDAyXQorICBSZXZpc2VkIDEzIG1ha2VmaWxlcyB0byByZW1vdmUgIi1seiIgYW5kICItTCQoWkxJQkxJQikiLCBldGMuLCBmcm9tIHNoYXJlZAorICAgIGxpYnJhcnkgbG9hZGVyIGRpcmVjdGl2ZS4KKyAgQWRkZWQgbWlzc2luZyAiJE9CSlNETEwiIGxpbmUgdG8gbWFrZWZpbGUuZ2NtbXguCisgIEFkZGVkIG1pc3NpbmcgIjsgZmkiIHRvIG1ha2VmaWxlLjMyc3VudS4KK3ZlcnNpb24gMS4yLjVyYzMgYW5kIDEuMC4xNXJjMyBbU2VwdGVtYmVyIDE4LCAyMDAyXQorICBSZXZpc2VkIGxpYnBuZy1jb25maWcgc2NyaXB0LgorCit2ZXJzaW9uIDEuMi41IGFuZCAxLjAuMTUgW09jdG9iZXIgMywgMjAwMl0KKyAgUmV2aXNlZCBtYWtlZmlsZS5tYWNvc3gsIG1ha2VmaWxlLmRhcndpbiwgbWFrZWZpbGUuaHBnY2MsIGFuZCBtYWtlZmlsZS5ocHV4LAorICAgIGFuZCBtYWtlZmlsZS5haXguCisgIFJlbG9jYXRlZCB0d28gbWlzcGxhY2VkIFBOR0FQSSBsaW5lcyBpbiBwbmd0ZXN0LmMKK3ZlcnNpb24gMS4yLjZiZXRhMSBbT2N0b2JlciAyMiwgMjAwMl0KKyAgQ29tbWVudGVkIG91dCB3YXJuaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQgbW14X3N1cHBvcnQgaW4gcG5nZ2NjcmQuYy4KKyAgQ2hhbmdlZCAiSUJNQ1BQX18iIGZsYWcgdG8gIl9fSUJNQ1BQX18iIGluIHBuZ2NvbmYuaC4KKyAgUmVsb2NhdGVkIHR3byBtb3JlIG1pc3BsYWNlZCBQTkdBUEkgbGluZXMgaW4gcG5ndGVzdC5jCisgIEZpeGVkIG1lbW9yeSBvdmVycnVuIGJ1ZyBpbiBwbmdfZG9fcmVhZF9maWxsZXIoKSB3aXRoIDE2LWJpdCBkYXRhc3RyZWFtcywKKyAgICBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4wLjIuCisgIFJldmlzZWQgbWFrZWZpbGUubWFjb3N4LCBtYWtlZmlsZS5kZWMsIG1ha2VmaWxlLmFpeCwgYW5kIG1ha2VmaWxlLjMyc3VudS4KK3ZlcnNpb24gMS4yLjZiZXRhMiBbTm92ZW1iZXIgMSwgMjAwMl0KKyAgQWRkZWQgbGlicG5nLWNvbmZpZyAiLS1sZG9wdHMiIG91dHB1dC4KKyAgQWRkZWQgIkFSPWFyIiBhbmQgIkFSRkxBR1M9cmMiIGFuZCBjaGFuZ2VkICJhciByYyIgdG8gIiQoQVIpICQoQVJGTEFHUykiCisgICAgaW4gbWFrZWZpbGVzLgordmVyc2lvbiAxLjIuNmJldGEzIFtKdWx5IDE4LCAyMDA0XQorICBSZXZlcnRlZCBtYWtlZmlsZSBjaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjIuNmJldGEyIGFuZCBzb21lIG9mIHRoZSBjaGFuZ2VzCisgICAgZnJvbSB2ZXJzaW9uIDEuMi42YmV0YTE7IHRoZXNlIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIHZlcnNpb24gMS4yLjcuCisgICAgVmVyc2lvbiAxLjIuNiBpcyBnb2luZyB0byBiZSBhIHNpbXBsZSBidWdmaXggcmVsZWFzZS4KKyAgQ2hhbmdlZCB0aGUgb25lIGluc3RhbmNlIG9mICJsbiAtc2YiIHRvICJsbiAtZiAtcyIgaW4gZWFjaCBTdW4gbWFrZWZpbGUuCisgIEZpeGVkIHBvdGVudGlhbCBvdmVycnVuIGluIHBuZ2Vycm9yLmMgYnkgdXNpbmcgc3RybmNweSBpbnN0ZWFkIG9mIG1lbWNweS4KKyAgQWRkZWQgIiMhL2Jpbi9zaCIgYXQgdGhlIHRvcCBvZiBjb25maWd1cmUsIGZvciByZWNvZ25pdGlvbiBvZiB0aGUKKyAgICAneCcgZmxhZyB1bmRlciBDeWd3aW4gKENvc21pbikuCisgIE9wdGltaXplZCB2YWN1b3VzIHRlc3RzIHRoYXQgc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncywgaW4gcG5nLmMgKENvc21pbikuCisgIEFkZGVkIHN1cHBvcnQgZm9yIFBOR19VU0VSX0NPTkZJRywgaW4gcG5nY29uZi5oIChDb3NtaW4pLgorICBGaXhlZCB0aGUgc3BlY2lhbCBtZW1vcnkgaGFuZGxlciBmb3IgQm9ybGFuZCBDIHVuZGVyIERPUywgaW4gcG5nbWVtLmMKKyAgICAoQ29zbWluKS4KKyAgUmVtb3ZlZCBzb21lIHNwdXJpb3VzIGFzc2lnbm1lbnRzIGluIHBuZ3J1dGlsLmMgKENvc21pbikuCisgIFJlcGxhY2VkIDY1NTM2IHdpdGggNjU1MzZMLCBhbmQgMHhmZmZmIHdpdGggMHhmZmZmTCwgdG8gc2lsZW5jZSB3YXJuaW5ncworICAgIG9uIDE2LWJpdCBwbGF0Zm9ybXMgKENvc21pbikuCisgIEVuY2xvc2VkIHNoaWZ0IG9wIGV4cHJlc3Npb25zIGluIHBhcmVudGhlc2VzLCB0byBzaWxlbmNlIHdhcm5pbmdzIChDb3NtaW4pLgorICBVc2VkIHByb3BlciB0eXBlIHBuZ19maXhlZF9wb2ludCwgdG8gYXZvaWQgcHJvYmxlbXMgb24gMTYtYml0IHBsYXRmb3JtcywKKyAgICBpbiBwbmdfaGFuZGxlX3NSR0IoKSAoQ29zbWluKS4KKyAgQWRkZWQgY29tcHJlc3Npb25fdHlwZSB0byBwbmdfc3RydWN0LCBhbmQgb3B0aW1pemVkIHRoZSB3aW5kb3cgc2l6ZQorICAgIGluc2lkZSB0aGUgZGVmbGF0ZSBzdHJlYW0gKENvc21pbikuCisgIEZpeGVkIGRlZmluaXRpb24gb2YgaXNub25hbHBoYSgpLCBpbiBwbmdlcnJvci5jIGFuZCBwbmdydXRpbC5jIChDb3NtaW4pLgorICBGaXhlZCBoYW5kbGluZyBvZiB1bmtub3duIGNodW5rcyB0aGF0IGNvbWUgYWZ0ZXIgSURBVCAoQ29zbWluKS4KKyAgQWxsb3dlZCBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKSB0byB3b3JrIGV2ZW4gaWYgcG5nX3B0ciA9PSBOVUxMCisgICAgKENvc21pbikuCisgIFJlcGxhY2VkIHJvd19pbmZvLT5yb3dieXRlcyB3aXRoIHJvd19ieXRlcyBpbiBwbmdfd3JpdGVfZmluZF9maWx0ZXIoKQorICAgIChDb3NtaW4pLgorICBGaXhlZCBkZWZpbml0aW9uIG9mIFBOR19MSUJQTkdfVkVSX0RMTE5VTSAoU2ltb24tUGllcnJlKS4KKyAgVXNlZCBQTkdfTElCUE5HX1ZFUiBhbmQgUE5HX0xJQlBOR19WRVJfU1RSSU5HIGluc3RlYWQgb2YgdGhlIGhhcmRjb2RlZAorICAgIHZhbHVlcyBpbiBwbmcuYyAoU2ltb24tUGllcnJlLCBDb3NtaW4pLgorICBJbml0aWFsaXplZCBwbmdfbGlicG5nX3ZlcltdIHdpdGggUE5HX0xJQlBOR19WRVJfU1RSSU5HIChTaW1vbi1QaWVycmUpLgorICBSZXBsYWNlZCBQTkdfTElCUE5HX1ZFUl9NQUpPUiB3aXRoIFBOR19MSUJQTkdfVkVSX0RMTE5VTSBpbiBwbmcucmMKKyAgICAoU2ltb24tUGllcnJlKS4KKyAgTW92ZWQgdGhlIGRlZmluaXRpb24gb2YgUE5HX0hFQURFUl9WRVJTSU9OX1NUUklORyBuZWFyIHRoZSBkZWZpbml0aW9ucworICAgIG9mIHRoZSBvdGhlciBQTkdfTElCUE5HX1ZFUl8uLi4gc3ltYm9scyBpbiBwbmcuaCAoQ29zbWluKS4KKyAgUmVsb2NhdGVkICNpZm5kZWYgUE5HQVBJIGd1YXJkcyBpbiBwbmdjb25mLmggKFNpbW9uLVBpZXJyZSwgQ29zbWluKS4KKyAgVXBkYXRlZCBzY3JpcHRzL21ha2VmaWxlLnZjKGEpd2luMzIgKENvc21pbikuCisgIFVwZGF0ZWQgdGhlIE1TVkMgcHJvamVjdCAoU2ltb24tUGllcnJlLCBDb3NtaW4pLgorICBVcGRhdGVkIHRoZSBCb3JsYW5kIEMrKyBCdWlsZGVyIHByb2plY3QgKENvc21pbikuCisgIEF2b2lkZWQgYWNjZXNzIHRvIGFzbV9mbGFncyBpbiBwbmd2Y3JkLmMsIGlmIFBOR18xXzBfWCBpcyBkZWZpbmVkIChDb3NtaW4pLgorICBDb21tZW50ZWQgb3V0IHdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZCBtbXhfc3VwcG9ydCBpbiBwbmd2Y3JkLmMgKENvc21pbikuCisgIFJlbW92ZWQgc2NyaXB0cy9tYWtlZmlsZS5iZDMyIGFuZCBzY3JpcHRzL3BuZ2RlZi5wYXMgKENvc21pbikuCisgIEFkZGVkIGV4dHJhIGd1YXJkIGFyb3VuZCBpbmNsdXNpb24gb2YgVHVyYm8gQyBtZW1vcnkgaGVhZGVycywgaW4gcG5nY29uZi5oCisgICAgKENvc21pbikuCisgIFJlbmFtZWQgcHJvamVjdHMvbXN2Yy8gdG8gcHJvamVjdHMvdmlzdWFsYzYvLCBhbmQgcHJvamVjdHMvYm9ybGFuZC8gdG8KKyAgICBwcm9qZWN0cy9jYnVpbGRlcjUvIChDb3NtaW4pLgorICBNb3ZlZCBwcm9qZWN0cy92aXN1YWxjNi9wbmczMm1zLmRlZiB0byBzY3JpcHRzL3BuZ3czMi5kZWYsCisgICAgYW5kIHByb2plY3RzL3Zpc3VhbGM2L3BuZy5yYyB0byBzY3JpcHRzL3BuZ3czMi5yYyAoQ29zbWluKS4KKyAgQWRkZWQgcHJvamVjdHMvdmlzdWFsYzYvcG5ndGVzdC5kc3A7IHJlbW92ZWQgY29udHJpYi9tc3ZjdGVzdC8gKENvc21pbikuCisgIENoYW5nZWQgbGluZSBlbmRpbmdzIHRvIERPUyBzdHlsZSBpbiBjYnVpbGRlcjUgYW5kIHZpc3VhbGM2IGZpbGVzLCBldmVuCisgICAgaW4gdGhlIHRhci4qIGRpc3RyaWJ1dGlvbnMgKENvc21pbikuCisgIFVwZGF0ZWQgY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5kc3AgKENvc21pbikuCisgIFVwZGF0ZWQgY29udHJpYi92aXN1cG5nL2NleGNlcHQuaCB0byB2ZXJzaW9uIDIuMC4wIChDb3NtaW4pLgorICBBZGRlZCBhIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiB3aXRoICJjb25maWd1cmUiIGFuZCBzdXBwb3J0aW5nIGZpbGVzIChKdW5pY2hpKS4KK3ZlcnNpb24gMS4yLjZiZXRhNCBbSnVseSAyOCwgMjAwNF0KKyAgQWRkZWQgdXNlciBhYmlsaXR5IHRvIGNoYW5nZSBwbmdfc2l6ZV90IHZpYSBhIFBOR19TSVpFX1QgbWFjcm8uCisgIEFkZGVkIHBuZ19zaXplb2YoKSBhbmQgcG5nX2NvbnZlcnRfc2l6ZSgpIGZ1bmN0aW9ucy4KKyAgQWRkZWQgUE5HX1NJWkVfTUFYIChtYXhpbXVtIHZhbHVlIG9mIGEgcG5nX3NpemVfdCB2YXJpYWJsZS4KKyAgQWRkZWQgY2hlY2sgaW4gcG5nX21hbGxvY19kZWZhdWx0KCkgZm9yIChzaXplX3Qpc2l6ZSAhPSAocG5nX3VpbnRfMzIpc2l6ZQorICAgIHdoaWNoIHdvdWxkIGluZGljYXRlIGFuIG92ZXJmbG93LgorICBDaGFuZ2VkIHNQTFQgZmFpbHVyZSBhY3Rpb24gZnJvbSBwbmdfZXJyb3IgdG8gcG5nX3dhcm5pbmcgYW5kIGFiYW5kb24gY2h1bmsuCisgIENoYW5nZWQgc0NBTCBhbmQgaUNDUCBmYWlsdXJlcyBmcm9tIHBuZ19lcnJvciB0byBwbmdfd2FybmluZyBhbmQgYWJhbmRvbi4KKyAgQWRkZWQgcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGJ1ZikgZnVuY3Rpb24uCisgIEFkZGVkIFBOR19VSU5UXzMyX01BWCBtYWNyby4KKyAgUmVuYW1lZCBQTkdfTUFYX1VJTlQgdG8gUE5HX1VJTlRfMzFfTUFYLgorICBNYWRlIHBuZ196YWxsb2MoKSBpc3N1ZSBhIHBuZ193YXJuaW5nIGFuZCByZXR1cm4gTlVMTCBvbiBwb3RlbnRpYWwKKyAgICBvdmVyZmxvdy4KKyAgVHVybiBvbiBQTkdfTk9fWkFMTE9DX1pFUk8gYnkgZGVmYXVsdCBpbiB2ZXJzaW9uIDEuMi54CisgIFJldmlzZWQgImNsb2JiZXIgbGlzdCIgaW4gcG5nZ2NjcmQuYyBzbyBpdCB3aWxsIGNvbXBpbGUgdW5kZXIgZ2NjLTMuNC4KKyAgUmV2aXNlZCBCb3JsYW5kIHBvcnRpb24gb2YgcG5nX21hbGxvYygpIHRvIHJldHVybiBOVUxMIG9yIGlzc3VlCisgICAgcG5nX2Vycm9yKCkgYWNjb3JkaW5nIHRvIHNldHRpbmcgb2YgUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LLgorICBBZGRlZCBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCBtYWNybyB0byBjb25kaXRpb25hbGx5IHJlbW92ZQorICAgIHNlcXVlbnRpYWwgcmVhZCBzdXBwb3J0LgorICBBZGRlZCBzb21lICIjaWYgUE5HX1dSSVRFX1NVUFBPUlRFRCIgYmxvY2tzLgorICBSZW1vdmVkIHNvbWUgcmVkdW5kYW5jeSB3aXRoICNpZmRlZi8jZW5kaWYgaW4gcG5nX21hbGxvY19kZWZhdWx0KCkuCisgIFVzZSBwbmdfbWFsbG9jIGluc3RlYWQgb2YgcG5nX3phbGxvYyB0byBhbGxvY2F0ZSB0aGUgcGFsbGV0ZS4KK3ZlcnNpb24gMS4wLjE2cmMxIGFuZCAxLjIuNnJjMSBbQXVndXN0IDQsIDIwMDRdCisgIEZpeGVkIGJ1ZmZlciBvdmVyZmxvdyB2dWxuZXJhYmlsaXR5IGluIHBuZ19oYW5kbGVfdFJOUygpCisgIEZpeGVkIGludGVnZXIgYXJpdGhtZXRpYyBvdmVyZmxvdyB2dWxuZXJhYmlsaXR5IGluIHBuZ19yZWFkX3BuZygpLgorICBGaXhlZCBzb21lIGhhcm1sZXNzIGJ1Z3MgaW4gcG5nX2hhbmRsZV9zQklULCBldGMsIHRoYXQgd291bGQgY2F1c2UKKyAgICBkdXBsaWNhdGUgY2h1bmsgdHlwZXMgdG8gZ28gdW5kZXRlY3RlZC4KKyAgRml4ZWQgc29tZSB0aW1lc3RhbXBzIGluIHRoZSAtY29uZmlnIHZlcnNpb24KKyAgUmVhcnJhbmdlZCBvcmRlciBvZiBwcm9jZXNzaW5nIG9mIGNvbG9yIHR5cGVzIGluIHBuZ19oYW5kbGVfdFJOUygpLgorICBBZGRlZCBST1dCWVRFUyBtYWNybyB0byBjYWxjdWxhdGUgcm93Ynl0ZXMgd2l0aG91dCBpbnRlZ2VyIG92ZXJmbG93LgorICBVcGRhdGVkIG1ha2VmaWxlLmRhcndpbiBhbmQgcmVtb3ZlZCBtYWtlZmlsZS5tYWNvc3ggZnJvbSBzY3JpcHRzIGRpcmVjdG9yeS4KKyAgSW1wb3NlZCBkZWZhdWx0IG9uZSBtaWxsaW9uIGNvbHVtbiwgb25lLW1pbGxpb24gcm93IGxpbWl0cyBvbiB0aGUgaW1hZ2UKKyAgICBkaW1lbnNpb25zLCBhbmQgYWRkZWQgcG5nX3NldF91c2VyX2xpbWl0cygpIGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoZW0uCisgIFJldmlzZWQgdXNlIG9mIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVEIG1hY3JvLgorICBGaXhlZCB3cm9uZyBjYXN0IG9mIHJldHVybnMgZnJvbSBwbmdfZ2V0X3VzZXJfd2lkdGh8aGVpZ2h0X21heCgpLgorICBDaGFuZ2VkIHNvbWUgImtlZXAgdGhlIGNvbXBpbGVyIGhhcHB5IiBmcm9tIGVtcHR5IHN0YXRlbWVudHMgdG8gcmV0dXJucywKKyAgUmV2aXNlZCBsaWJwbmcudHh0IHRvIHJlbW92ZSAxLjIueCBzdHVmZiBmcm9tIHRoZSAxLjAueCBkaXN0cmlidXRpb24KK3ZlcnNpb24gMS4wLjE2cmMyIGFuZCAxLjIuNnJjMiBbQXVndXN0IDcsIDIwMDRdCisgIFJldmlzZWQgbWFrZWZpbGUuZGFyd2luIGFuZCBtYWtlZmlsZS5zb2xhcmlzLiAgUmVtb3ZlZCBtYWtlZmlsZS5tYWNvc3guCisgIFJldmlzZWQgcG5ndGVzdCdzIHBuZ19kZWJ1Z19tYWxsb2MoKSB0byB1c2UgcG5nX21hbGxvYygpIGluc3RlYWQgb2YKKyAgICBwbmdfbWFsbG9jX2RlZmF1bHQoKSB3aGljaCBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgZXhwb3J0ZWQuCisgIEZpeGVkIG9mZi1ieS1vbmUgZXJyb3IgaW4gb25lIG9mIHRoZSBjb252ZXJzaW9ucyB0byBQTkdfUk9XQllURVMoKSBpbgorICAgIHBuZ3ByZWFkLmMuICBCdWcgd2FzIGludHJvZHVjZWQgaW4gMS4yLjZyYzEuCisgIEZpeGVkIGJ1ZyBpbiBSR0IgdG8gUkdCWCB0cmFuc2Zvcm1hdGlvbiBpbnRyb2R1Y2VkIGluIDEuMi42cmMxLgorICBGaXhlZCBvbGQgYnVnIGluIFJHQiB0byBHcmF5IHRyYW5zZm9ybWF0aW9uLgorICBGaXhlZCBwcm9ibGVtIHdpdGggNjQtYml0IGNvbXBpbGVycyBieSBjYXN0aW5nIGFyZ3VtZW50cyB0byBhYnMoKQorICAgIHRvIHBuZ19pbnRfMzIuCisgIENoYW5nZWQgImxuIC1zZiIgdG8gImxuIC1mIC1zIiBpbiB0aHJlZSBtYWtlZmlsZXMgKHNvbGFyaXMsIHNjbywgc285KS4KKyAgQ2hhbmdlZCAiSEFORExFX0NIVU5LXyoiIHRvICJQTkdfSEFORExFX0NIVU5LXyoiIChDb3NtaW4pCisgIEFkZGVkICItQC9iaW4vcm0gLWYgJChETCkvJChMSUJOQU1FKS5zby4kKFBOR01BSikiIHRvIDE1ICpOSVggbWFrZWZpbGVzLgorICBBZGRlZCBjb2RlIHRvIHVwZGF0ZSB0aGUgcm93X2luZm8tPmNvbG9ydHlwZSBpbiBwbmdfZG9fcmVhZF9maWxsZXIoKSAoTVNCKS4KK3ZlcnNpb24gMS4wLjE2cmMzIGFuZCAxLjIuNnJjMyBbQXVndXN0IDksIDIwMDRdCisgIEVsaW1pbmF0ZWQgdXNlIG9mICJhYnMoKSIgaW4gdGVzdGluZyBjSFJNIGFuZCBnQU1BIHZhbHVlcywgdG8gYXZvaWQKKyAgICB0cm91YmxlIHdpdGggc29tZSA2NC1iaXQgY29tcGlsZXJzLiAgQ3JlYXRlZCBQTkdfT1VUX09GX1JBTkdFKCkgbWFjcm8uCisgIFJldmlzZWQgZG9jdW1lbnRhdGlvbiBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKS4KKyAgQ2hlY2sgaGFuZGxlX2FzX3Vua25vd24gc3RhdHVzIGluIHBuZ3ByZWFkLmMsIGFzIGluIHBuZ3JlYWQuYyBwcmV2aW91c2x5LgorICBNb3ZlZCAgIlBOR19IQU5ETEVfQ0hVTktfKiIgbWFjcm9zIG91dCBvZiBQTkdfSU5URVJOQUwgc2VjdGlvbiBvZiBwbmcuaAorICBBZGRlZCAicmltIiBkZWZpbml0aW9ucyBmb3IgQ09OU1Q0IGFuZCBDT05TVDYgaW4gcG5nZ2NjcmQuYwordmVyc2lvbiAxLjAuMTZyYzQgYW5kIDEuMi42cmM0IFtBdWd1c3QgMTAsIDIwMDRdCisgIEZpeGVkIG1pc3Rha2UgaW4gcG5ndGVzdC5jIGludHJvZHVjZWQgaW4gMS4yLjZyYzIgKGRlY2xhcmF0aW9uIG9mCisgICAgInBpbmZvIiB3YXMgb3V0IG9mIHBsYWNlKS4KK3ZlcnNpb24gMS4wLjE2cmM1IGFuZCAxLjIuNnJjNSBbQXVndXN0IDEwLCAyMDA0XQorICBNb3ZlZCAgIlBOR19IQU5ETEVfQ0hVTktfKiIgbWFjcm9zIG91dCBvZiBQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVECisgICAgIHNlY3Rpb24gb2YgcG5nLmggd2hlcmUgdGhleSB3ZXJlIGluYWR2ZXJ0ZW50bHkgcGxhY2VkIGluIHZlcnNpb24gcmMzLgorCit2ZXJzaW9uIDEuMi42IGFuZCAxLjAuMTYgW0F1Z3VzdCAxNSwgMjAwNF0KKyAgUmV2aXNlZCBwbmd0ZXN0IHNvIG1lbW9yeSBhbGxvY2F0aW9uIHRlc3RpbmcgaXMgb25seSBkb25lIHdoZW4gUE5HX0RFQlVHPT0xLgordmVyc2lvbiAxLjIuN2JldGExIFtBdWd1c3QgMjYsIDIwMDRdCisgIFJlbW92ZWQgdW51c2VkIHBuZ2FzbXJkLmggZmlsZS4KKyAgUmVtb3ZlZCByZWZlcmVuY2VzIHRvIHV1Lm5ldCBmb3IgYXJjaGl2ZWQgZmlsZXMuICBBZGRlZCByZWZlcmVuY2VzIHRvCisgICAgUE5HIFNwZWMgKHNlY29uZCBlZGl0aW9uKSBhbmQgdGhlIFBORyBJU08vSUVDIFN0YW5kYXJkLgorICBBZGRlZCAidGVzdC1kZCIgdGFyZ2V0IGluIDE1IG1ha2VmaWxlcywgdG8gcnVuIHBuZ3Rlc3QgaW4gREVTVERJUi4KKyAgRml4ZWQgYnVnIHdpdGggIm9wdGltaXplZCB3aW5kb3cgc2l6ZSIgaW4gdGhlIElEQVQgZGF0YXN0cmVhbSwgdGhhdAorICAgIGNhdXNlcyBsaWJwbmcgdG8gd3JpdGUgUE5HIGZpbGVzIHdpdGggaW5jb3JyZWN0IHpsaWIgaGVhZGVyIGJ5dGVzLgordmVyc2lvbiAxLjIuN2JldGEyIFtBdWd1c3QgMjgsIDIwMDRdCisgIEZpeGVkIGJ1ZyB3aXRoIHNDQUwgY2h1bmsgYW5kIGJpZy1lbmRpYW4gbWFjaGluZXMgKERhdmlkIE11bnJvKS4KKyAgVW5kaWQgbmV3IGNvZGUgYWRkZWQgaW4gMS4yLjZyYzIgdG8gdXBkYXRlIHRoZSBjb2xvcl90eXBlIGluCisgICAgcG5nX3NldF9maWxsZXIoKS4KKyAgQWRkZWQgcG5nX3NldF9hZGRfYWxwaGEoKSB0aGF0IHVwZGF0ZXMgY29sb3IgdHlwZS4KK3ZlcnNpb24gMS4wLjE3cmMxIGFuZCAxLjIuN3JjMSBbU2VwdGVtYmVyIDQsIDIwMDRdCisgIFJldmlzZWQgcG5nX3NldF9zdHJpcF9maWxsZXIoKSB0byBub3QgcmVtb3ZlIGFscGhhIGlmIGNvbG9yX3R5cGUgaGFzIGFscGhhLgorCit2ZXJzaW9uIDEuMi43IGFuZCAxLjAuMTcgW1NlcHRlbWJlciAxMiwgMjAwNF0KKyAgQWRkZWQgbWFrZWZpbGUuaHA2NAorICBDaGFuZ2VkIHByb2plY3RzL21zdmMvcG5nMzJtcy5kZWYgdG8gc2NyaXB0cy9wbmczMm1zLmRlZiBpbiBtYWtlZmlsZS5jeWd3aW4KK3ZlcnNpb24gMS4yLjhiZXRhMSBbTm92ZW1iZXIgMSwgMjAwNF0KKyAgRml4ZWQgYnVnIGluIHBuZ190ZXh0X2NvbXByZXNzKCkgdGhhdCB3b3VsZCBmYWlsIHRvIGNvbXBsZXRlIGEgbGFyZ2UgYmxvY2suCisgIEZpeGVkIGJ1ZywgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjcsIHRoYXQgb3ZlcnJ1bnMgYSBidWZmZXIgZHVyaW5nCisgICAgc3RyaXAgYWxwaGEgb3BlcmF0aW9uIGluIHBuZ19kb19zdHJpcF9maWxsZXIoKS4KKyAgQWRkZWQgUE5HXzFfMl9YIGRlZmluaXRpb24gaW4gcG5nY29uZi5oCisgIENvbW1lbnQgb3V0IHdpdGggI2lmZGVmLyNlbmRpZiBwbmdfaW5mb19pbml0IGluIHBuZy5jIGFuZCBwbmdfcmVhZF9pbml0CisgICAgaW4gcG5ncmVhZC5jIChhcyBvZiAxLjMuMCkKK3ZlcnNpb24gMS4yLjhiZXRhMiBbTm92ZW1iZXIgMiwgMjAwNF0KKyAgUmVkdWNlIGNvbG9yX3R5cGUgdG8gYSBub25hbHBoYSB0eXBlIGFmdGVyIHN0cmlwIGFscGhhIG9wZXJhdGlvbiBpbgorICAgIHBuZ19kb19zdHJpcF9maWxsZXIoKS4KK3ZlcnNpb24gMS4yLjhiZXRhMyBbTm92ZW1iZXIgMywgMjAwNF0KKyAgUmV2aXNlZCBkZWZpbml0aW9ucyBvZiBQTkdfTUFYX1VJTlRfMzIsIFBOR19NQVhfU0laRSwgYW5kIFBOR19NQVhTVU0KK3ZlcnNpb24gMS4yLjhiZXRhNCBbTm92ZW1iZXIgMTIsIDIwMDRdCisgIEZpeGVkIChhZ2FpbikgZGVmaW5pdGlvbiBvZiBQTkdfTElCUE5HX1ZFUl9ETExOVU0gaW4gcG5nLmggKENvc21pbikuCisgIEFkZGVkIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSBpbiBwbmcuaCAoQ29zbWluKS4KKyAgU2V0IHBuZ19wdHItPnpzdHJlYW0uZGF0YV90eXBlIHRvIFpfQklOQVJZLCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBkZXRlY3Rpb24KKyAgICBvZiBkYXRhIHR5cGUgaW4gZGVmbGF0ZSAoQ29zbWluKS4KKyAgRGVwcmVjYXRlZCBidXQgY29udGludWUgdG8gc3VwcG9ydCBTUEVDSUFMQlVJTEQgYW5kIFBSSVZBVEVCVUlMRCBpbiBmYXZvciBvZgorICAgIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTF9TVFJJTkcgYW5kIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURV9TVFJJTkcuCit2ZXJzaW9uIDEuMi44YmV0YTUgW05vdmVtYmVyIDIwLCAyMDA0XQorICBVc2UgcG5nX3B0ci0+ZmxhZ3MgaW5zdGVhZCBvZiBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgdG8gcGFzcworICAgIFBOR19TVFJJUF9BTFBIQSBpbmZvIHRvIHBuZ19kb19zdHJpcF9maWxsZXIoKSwgdG8gcHJlc2VydmUgQUJJCisgICAgY29tcGF0aWJpbGl0eS4KKyAgUmV2aXNlZCBoYW5kbGluZyBvZiBTUEVDSUFMQlVJTEQsIFBSSVZBVEVCVUlMRCwKKyAgICBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUxfU1RSSU5HIGFuZCBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEVfU1RSSU5HLgordmVyc2lvbiAxLjIuOHJjMSBbTm92ZW1iZXIgMjQsIDIwMDRdCisgIE1vdmVkIGhhbmRsaW5nIG9mIEJVSUxEIG1hY3JvcyBmcm9tIHBuZ2NvbmYuaCB0byBwbmcuaAorICBBZGRlZCBkZWZpbml0aW9uIG9mIFBOR19MSUJQTkdfQkFTRV9UWVBFIGluIHBuZy5oLCBpbmFkdmVydGVudGx5CisgICAgb21pdHRlZCBmcm9tIGJldGE1LgorICBSZXZpc2VkIHNjcmlwdHMvcG5ndzMyLnJjCisgIERlc3BhbW1lZCBtYWlsaW5nIGFkZHJlc3NlcyBieSBtYXNraW5nICJAIiB3aXRoICJhdCIuCisgIEluYWR2ZXJ0ZW50bHkgaW5zdGFsbGVkIGEgc3VwcG9zZWRseSBmYXN0ZXIgdGVzdCB2ZXJzaW9uIG9mIHBuZ3J1dGlsLmMKK3ZlcnNpb24gMS4yLjhyYzIgW05vdmVtYmVyIDI2LCAyMDA0XQorICBBZGRlZCB0d28gbWlzc2luZyAiXCIgaW4gcG5nLmgKKyAgQ2hhbmdlIHRlc3RzIGluIHBuZ3JlYWQuYyBhbmQgcG5ncHJlYWQuYyB0bworICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfHwgKHBuZ19wdHItPmZsYWdzJlBOR19GTEFHX1NUUklQX0FMUEhBKSkKKyAgICAgICBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7Cit2ZXJzaW9uIDEuMi44cmMzIFtOb3ZlbWJlciAyOCwgMjAwNF0KKyAgUmV2ZXJ0ZWQgcG5ncnV0aWwuYyB0byB2ZXJzaW9uIGxpYnBuZy0xLjIuOGJldGE1LgorICBBZGRlZCBzY3JpcHRzL21ha2VmaWxlLmVsZiB3aXRoIHN1cHBvcnRpbmcgY29kZSBpbiBwbmdjb25mLmggZm9yIHN5bWJvbAorICAgIHZlcnNpb25pbmcgKEpvaG4gQm93bGVyKS4KK3ZlcnNpb24gMS4yLjhyYzQgW05vdmVtYmVyIDI5LCAyMDA0XQorICBBZGRlZCBwcm9qZWN0cy92aXN1YWxjNyAoU2ltb24tcGllcnJlKS4KK3ZlcnNpb24gMS4yLjhyYzUgW05vdmVtYmVyIDI5LCAyMDA0XQorICBGaXhlZCBuZXcgdHlwbyBpbiBzY3JpcHRzL3BuZ3czMi5yYworCit2ZXJzaW9uIDEuMi44IFtEZWNlbWJlciAzLCAyMDA0XQorICBSZW1vdmVkIHByb2plY3RzL3Zpc3VhbGM3LCBhZGRlZCBwcm9qZWN0cy92aXN1YWxjNzEuCisKK3ZlcnNpb24gMS4yLjliZXRhMSBbRmVicnVhcnkgMjEsIDIwMDZdCisKKyAgSW5pdGlhbGl6ZWQgc29tZSBzdHJ1Y3R1cmUgbWVtYmVycyBpbiBwbmd3dXRpbC5jIHRvIGF2b2lkIGdjYy00LjAuMCBjb21wbGFpbnRzCisgIFJldmlzZWQgbWFuIHBhZ2UgYW5kIGxpYnBuZy50eHQgdG8gbWFrZSBpdCBjbGVhciB0aGF0IG9uZSBzaG91bGQgbm90IGNhbGwKKyAgICBwbmdfcmVhZF9lbmQgb3IgcG5nX3dyaXRlX2VuZCBhZnRlciBwbmdfcmVhZF9wbmcgb3IgcG5nX3dyaXRlX3BuZy4KKyAgVXBkYXRlZCByZWZlcmVuY2VzIHRvIHBuZy1tbmctaW1wbGVtZW50IG1haWxpbmcgbGlzdC4KKyAgRml4ZWQgYW4gaW5jb3JyZWN0IHR5cGVjYXN0IGluIHBuZ3J1dGlsLmMKKyAgQWRkZWQgUE5HX05PX1JFQURfU1VQUE9SVEVEIGNvbmRpdGlvbmFsIGZvciBtYWtpbmcgYSB3cml0ZS1vbmx5IGxpYnJhcnkuCisgIEFkZGVkIFBOR19OT19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQgY29uZGl0aW9uYWwuCisgIE9wdGltaXplZCBhbHBoYS1pbnZlcnNpb24gbG9vcHMgaW4gcG5nd3RyYW4uYworICBNb3ZlZCB0ZXN0IGZvciBub256ZXJvIGdhbW1hIG91dHNpZGUgb2YgcG5nX2J1aWxkX2dhbW1hX3RhYmxlKCkgaW4gcG5ncnRyYW4uYworICBNYWtlIHN1cmUgbnVtX3RyYW5zIGlzIDw9IDI1NiBiZWZvcmUgY29weWluZyBkYXRhIGluIHBuZ19zZXRfdFJOUygpLgorICBNYWtlIHN1cmUgbnVtX3BhbGV0dGUgaXMgPD0gMjU2IGJlZm9yZSBjb3B5aW5nIGRhdGEgaW4gcG5nX3NldF9QTFRFKCkuCisgIEludGVyY2hhbmdlZCBvcmRlciBvZiB3cml0ZV9zd2FwX2FscGhhIGFuZCB3cml0ZV9pbnZlcnRfYWxwaGEgdHJhbnNmb3Jtcy4KKyAgQWRkZWQgcGFyZW50aGVzZXMgaW4gdGhlIGRlZmluaXRpb24gb2YgUE5HX0xJQlBOR19CVUlMRF9UWVBFIChDb3NtaW4pLgorICBPcHRpbWl6ZWQgemxpYiB3aW5kb3cgZmxhZyAoQ0lORk8pIGluIGNvbnRyaWIvcG5nc3VpdGUvKi5wbmcgKENvc21pbikuCisgIFVwZGF0ZWQgc2NyaXB0cy9tYWtlZmlsZS5iYzMyIGZvciBCb3JsYW5kIEMrKyA1LjYgKENvc21pbikuCisgIEV4cG9ydGVkIHBuZ19nZXRfdWludF8zMiwgcG5nX3NhdmVfdWludF8zMiwgcG5nX2dldF91aW50XzE2LCBwbmdfc2F2ZV91aW50XzE2LAorICAgIHBuZ19nZXRfaW50XzMyLCBwbmdfc2F2ZV9pbnRfMzIsIHBuZ19nZXRfdWludF8zMSAoQ29zbWluKS4KKyAgQWRkZWQgdHlwZSBjYXN0IChwbmdfYnl0ZSkgaW4gcG5nX3dyaXRlX3NDQUwoKSAoQ29zbWluKS4KKyAgRml4ZWQgc2NyaXB0cy9tYWtlZmlsZS5jeWd3aW4gKENocmlzdGlhbiBCaWVzaW5nZXIsIENvc21pbikuCisgIERlZmF1bHQgaVRYdCBzdXBwb3J0IHdhcyBpbmFkdmVydGVudGx5IGVuYWJsZWQuCisKK3ZlcnNpb24gMS4yLjliZXRhMiBbRmVicnVhcnkgMjEsIDIwMDZdCisKKyAgQ2hlY2sgZm9yIHBuZ19yZ2JfdG9fZ3JheSBhbmQgcG5nX2dyYXlfdG9fcmdiIHJlYWQgdHJhbnNmb3JtYXRpb25zIGJlZm9yZQorICAgIGNoZWNraW5nIGZvciBwbmdfcmVhZF9kaXRoZXIgaW4gcG5ncnRyYW4uYworICBSZXZpc2VkIGNoZWNraW5nIG9mIGNocm9tYXRpY2l0eSBsaW1pdHMgdG8gYWNjb21tb2RhdGUgZXh0ZW5kZWQgUkdCCisgICAgY29sb3JzcGFjZSAoSm9obiBEZW5rZXIpLgorICBDaGFuZ2VkIGxpbmUgZW5kaW5ncyBpbiBzb21lIG9mIHRoZSBwcm9qZWN0IGZpbGVzIHRvIENSTEYsIGV2ZW4gaW4gdGhlCisgICAgIlVuaXgiIHRhciBkaXN0cmlidXRpb25zIChDb3NtaW4pLgorICBNYWRlIHBuZ19nZXRfaW50XzMyIGFuZCBwbmdfc2F2ZV9pbnRfMzIgYWx3YXlzIGF2YWlsYWJsZSAoQ29zbWluKS4KKyAgVXBkYXRlZCBzY3JpcHRzL3BuZ29zMi5kZWYsIHNjcmlwdHMvcG5ndzMyLmRlZiBhbmQgcHJvamVjdHMvd2luY2UvcG5nMzJjZS5kZWYKKyAgICB3aXRoIHRoZSBuZXdseSBleHBvcnRlZCBmdW5jdGlvbnMuCisgIEVsaW1pbmF0ZWQgZGlzdHJpYnV0aW9ucyB3aXRob3V0IHRoZSAiY29uZmlndXJlIiBzY3JpcHQuCisgIFVwZGF0ZWQgSU5TVEFMTCBpbnN0cnVjdGlvbnMuCisKK3ZlcnNpb24gMS4yLjliZXRhMyBbRmVicnVhcnkgMjQsIDIwMDZdCisKKyAgRml4ZWQgQ1JDUkxGIGxpbmUgZW5kaW5ncyBpbiBjb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcAorICBNYWRlIGxpYnBuZy5wYyByZXNwZWN0IEVYRUNfUFJFRklYIChELiBQLiBLcmVpbCwgSi4gQm93bGVyKQorICBSZW1vdmVkIHJlZmVyZW5jZSB0byBwbmdhc21yZC5oIGZyb20gTWFrZWZpbGUuYW0KKyAgUmVuYW1lZCBDSEFOR0VTIHRvIENoYW5nZUxvZy4KKyAgUmVuYW1lZCBMSUNFTlNFIHRvIENPUFlJTkcuCisgIFJlbmFtZWQgQU5OT1VOQ0UgdG8gTkVXUy4KKyAgQ3JlYXRlZCBBVVRIT1JTIGZpbGUuCisKK3ZlcnNpb24gMS4yLjliZXRhNCBbTWFyY2ggMywgMjAwNl0KKworICBDaGFuZ2VkIGRlZmluaXRpb24gb2YgUEtHQ09ORklHIGZyb20gJHByZWZpeC9saWIgdG8gJGxpYmRpciBpbiBjb25maWd1cmUuYWMKKyAgUmV2ZXJ0ZWQgdG8gZmlsZW5hbWVzIExJQ0VOU0UgYW5kIEFOTk9VTkNFOyByZW1vdmVkIEFVVEhPUlMgYW5kIENPUFlJTkcuCisgIFJlbW92ZWQgbmV3bGluZSBmcm9tIHRoZSBlbmQgb2Ygc29tZSBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcy4KKyAgUmVtb3ZlZCB0ZXN0IGZvciBzcXJ0KCkgZnJvbSBjb25maWd1cmUuYWMgYW5kIGNvbmZpZ3VyZS4KKyAgTWFkZSBzd2FwIHRhYmxlcyBpbiBwbmd0cmFucy5jIFBOR19DT05TVCAoQ2FybG8gQnJhbWl4KS4KKyAgRGlzYWJsZWQgZGVmYXVsdCBpVFh0IHN1cHBvcnQgdGhhdCB3YXMgaW5hZHZlcnRlbnRseSBlbmFibGVkIGluCisgICAgbGlicG5nLTEuMi45YmV0YTEuCisgIEFkZGVkICJPUzIiIHRvIGxpc3Qgb2Ygc3lzdGVtcyB0aGF0IGRvbid0IG5lZWQgdW5kZXJzY29yZXMsIGluIHBuZ2djY3JkLmMKKyAgUmVtb3ZlZCBsaWJwbmcgdmVyc2lvbiBhbmQgZGF0ZSBmcm9tICouYyBmaWxlcy4KKwordmVyc2lvbiAxLjIuOWJldGE1IFtNYXJjaCA0LCAyMDA2XQorICBSZW1vdmVkIHRyYWlsaW5nIGJsYW5rcyBmcm9tIHNvdXJjZSBmaWxlcy4KKyAgUHV0IHZlcnNpb24gYW5kIGRhdGUgb2YgbGF0ZXN0IGNoYW5nZSBpbiBlYWNoIHNvdXJjZSBmaWxlLCBhbmQgY2hhbmdlZAorICAgIGNvcHlyaWdodCB5ZWFyIGFjY29yZGluZ2x5LgorICBNb3JlIGNsZWFudXAgb2YgY29uZmlndXJlLmFjLCBNYWtlZmlsZS5hYywgYW5kIGFzc29jaWF0ZWQgc2NyaXB0cy4KKyAgUmVzdG9yZWQgc2NyaXB0cy9tYWtlZmlsZS5lbGYgd2hpY2ggd2FzIGluYWR2ZXJ0ZW50bHkgZGVsZXRlZC4KKwordmVyc2lvbiAxLjIuOWJldGE2IFtNYXJjaCA2LCAyMDA2XQorICBGaXhlZCB0eXBvIChSRUxFQVNFKSBpbiBjb25maWd1cmF0aW9uIGZpbGVzLgorCit2ZXJzaW9uIDEuMi45YmV0YTcgW01hcmNoIDcsIDIwMDZdCisgIFJlbW92ZWQgbGlicG5nLnZlcnMgYW5kIGxpYnBuZy5zeW0gZnJvbSBsaWJwbmcxMl9sYV9TT1VSQ0VTIGluIE1ha2VmaWxlLmFtCisgIEZpeGVkIGluY29uc2lzdGVudCAjaWZkZWYncyBhcm91bmQgcG5nX3NpZ19ieXRlcygpIGFuZCBwbmdfc2V0X3NDQUxfcygpCisgICAgaW4gcG5nLmguCisgIFVwZGF0ZWQgbWFrZWZpbGUuZWxmIGFzIHN1Z2dlc3RlZCBieSBkZWJpYW4uCisgIE1hZGUgY29zbWV0aWMgY2hhbmdlcyB0byBzb21lIG1ha2VmaWxlcywgYWRkaW5nIExOX1NGIGFuZCBvdGhlciBtYWNyb3MuCisgIE1hZGUgc29tZSBtYWtlZmlsZXMgYWNjZXB0ICJleGVjX3ByZWZpeCIuCisKK3ZlcnNpb24gMS4yLjliZXRhOCBbTWFyY2ggOSwgMjAwNl0KKyAgRml4ZWQgc29tZSAiI2lmIGRlZmluZWQgKC4uLiIgd2hpY2ggc2hvdWxkIGJlICIjaWYgZGVmaW5lZCguLi4iCisgICAgQnVnIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi44LgorICBGaXhlZCBpbmNvbnNpc3RlbmN5IGluIGRlZmluaXRpb24gb2YgcG5nX2RlZmF1bHRfcmVhZF9kYXRhKCkKKyAgUmVzdG9yZWQgYmxhbmsgdGhhdCB3YXMgbG9zdCBmcm9tIG1ha2VmaWxlLnNnZ2NjICJjbGVhbiIgdGFyZ2V0IGluIGJldGE3LgorICBSZXZpc2VkIGNhbGN1bGF0aW9uIG9mICJjdXJyZW50IiBhbmQgIm1ham9yIiBmb3IgaXJpeCBpbiBsdG1haW4uc2gKKyAgQ2hhbmdlZCAibWtkaXIiIHRvICJNS0RJUl9QIiBpbiBzb21lIG1ha2VmaWxlcy4KKyAgU2VwYXJhdGVkIFBOR19FWFBBTkQgYW5kIFBOR19FWFBBTkRfdFJOUy4KKyAgQWRkZWQgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgYW5kIGRlcHJlY2F0ZWQKKyAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIHdoaWNoIGFsc28gZXhwYW5kcyB0Uk5TIHRvIGFscGhhLgorCit2ZXJzaW9uIDEuMi45YmV0YTkgW01hcmNoIDEwLCAyMDA2XQorICBJbmNsdWRlICJjb25maWcuaCIgaW4gcG5nY29uZi5oIHdoZW4gYXZhaWxhYmxlLgorICBBZGRlZCBzb21lIGNoZWNrcyBmb3IgTlVMTCBwbmdfcHRyIG9yIE5VTEwgaW5mb19wdHIgKHRpbWVsZXNzKQorCit2ZXJzaW9uIDEuMi45YmV0YTEwIFtNYXJjaCAyMCwgMjAwNl0KKyAgUmVtb3ZlZCBleHRyYSBDUiBmcm9tIGNvbnRyaWIvdmlzdWFscG5nL1Zpc3VhbFBuZy5kc3cgKENvc21pbikKKyAgTWFkZSBwbmdnY2NyZC5jIFBJQy1jb21wbGlhbnQgKENocmlzdGlhbiBBaWNoaW5nZXIpLgorICBBZGRlZCBtYWtlZmlsZS5taW5ndyAoV29sZmdhbmcgR2xhcykuCisgIFJldmlzZWQgcG5nY29uZi5oIE1NWCBjaGVja2luZy4KKwordmVyc2lvbiAxLjIuOWJldGExMSBbTWFyY2ggMjIsIDIwMDZdCisgIEZpeGVkIG91dC1vZi1vcmRlciBkZWNsYXJhdGlvbiBpbiBwbmd3cml0ZS5jIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gYmV0YTkKKyAgU2ltcGxpZmllZCBzb21lIG1ha2VmaWxlcyBieSB1c2luZyBMSUJTTywgTElCU09NQUosIGFuZCBMSUJTT1ZFUiBtYWNyb3MuCisKK3ZlcnNpb24gMS4yLjlyYzEgW01hcmNoIDMxLCAyMDA2XQorICBEZWZpbmVkIFBOR19VU0VSX1BSSVZBVEVCVUlMRCB3aGVuIGluY2x1ZGluZyAicG5ndXNyLmgiIChDb3NtaW4pLgorICBSZW1vdmVkIG5vbnNlbnNpY2FsIGFzc2VydGlvbiBjaGVjayBmcm9tIHBuZ3Rlc3QuYyAoQ29zbWluKS4KKwordmVyc2lvbiAxLjIuOSBbQXByaWwgMTQsIDIwMDZdCisgIFJldmlzZWQgbWFrZWZpbGUuYmVvcyBhbmQgYWRkZWQgIm5vbmUiIHNlbGVjdG9yIGluIGx0bWFpbi5zaAorCit2ZXJzaW9uIDEuMi4xMGJldGExIFtBcHJpbCAxNSwgMjAwNl0KKyAgUmVuYW1lZCAiY29uZmlnLmgiIHRvICJwbmdfY29uZi5oIiBhbmQgcmV2aXNlZCBNYWtlZmlsZS5hbSB0byBhZGQKKyAgICAtRFBOR19CVUlMRElOR19MSUJQTkcgdG8gY29tcGlsZSBkaXJlY3RpdmUsIGFuZCBtb2RpZmllZCBwbmdjb25mLmgKKyAgICB0byBpbmNsdWRlIHBuZ19jb25mLmggb25seSB3aGVuIFBOR19CVUlMRElOR19MSUJQTkcgaXMgZGVmaW5lZC4KKwordmVyc2lvbiAxLjIuMTBiZXRhMiBbQXByaWwgMTUsIDIwMDZdCisgIE1hbnVhbGx5IHVwZGF0ZWQgTWFrZWZpbGUuaW4gYW5kIGNvbmZpZ3VyZS4gIENoYW5nZWQgcG5nX2NvbmYuaC5pbgorICAgIGJhY2sgdG8gY29uZmlnLmguCisKK3ZlcnNpb24gMS4yLjEwYmV0YTMgW0FwcmlsIDE1LCAyMDA2XQorICBDaGFuZ2UgcG5nX2NvbmYuaCBiYWNrIHRvIGNvbmZpZy5oIGluIHBuZ2NvbmYuaC4KKwordmVyc2lvbiAxLjIuMTBiZXRhNCBbQXByaWwgMTYsIDIwMDZdCisgIENoYW5nZSBQTkdfQlVJTERJTkdfTElCUE5HIHRvIFBOR19DT05GSUdVUkVfTElCUE5HIGluIGNvbmZpZy9NYWtlZmlsZSouCisKK3ZlcnNpb24gMS4yLjEwYmV0YTUgW0FwcmlsIDE2LCAyMDA2XQorICBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgY29tcGlsaW5nIGFzc2VtYmxlciBjb2RlIGluIHBuZ2djY3JkLmMKKwordmVyc2lvbiAxLjIuMTBiZXRhNiBbQXByaWwgMTcsIDIwMDZdCisgIFJldmlzZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgcG5nZ2NjcmQuYworICBNb3ZlZCAtRFBOR19DT05GSUdVUkVfTElCUE5HIGludG8gQExJQlBOR19ERUZJTkVTQAorICBBZGRlZCBATElCUE5HX0RFRklORVNAIHRvIGFyZ3VtZW50cyB3aGVuIGJ1aWxkaW5nIGxpYnBuZy5zeW0KKwordmVyc2lvbiAxLjIuMTBiZXRhNyBbQXByaWwgMTgsIDIwMDZdCisgIENoYW5nZSAiZXhlY19wcmVmaXg9JHByZWZpeCIgdG8gImV4ZWNfcHJlZml4PSQocHJlZml4KSIgaW4gbWFrZWZpbGVzLgorCit2ZXJzaW9uIDEuMi4xMHJjMSBbQXByaWwgMTksIDIwMDZdCisgIEVuc3VyZSBwbmdjb25mLmggZG9lc24ndCBkZWZpbmUgYm90aCBQTkdfVVNFX1BOR0dDQ1JEIGFuZCBQTkdfVVNFX1BOR1ZDUkQKKyAgRml4ZWQgIkxOX0ZTIiB0eXBvIGluIG1ha2VmaWxlLnNjbyBhbmQgbWFrZWZpbGUuc29sYXJpcy4KKwordmVyc2lvbiAxLjIuMTByYzIgW0FwcmlsIDIwLCAyMDA2XQorICBBZGRlZCBhIGJhY2tzbGFzaCBiZXR3ZWVuIC1EUE5HX0NPTkZJR1VSRV9MSUJQTkcgYW5kIC1EUE5HX05PX0FTU0VNQkxFUl9DT0RFCisgICBpbiBjb25maWd1cmUuYWMgYW5kIGNvbmZpZ3VyZQorICBNYWRlIHRoZSBjb25maWd1cmUgd2FybmluZyBhYm91dCB2ZXJzaW9uZWQgc3ltYm9scyBsZXNzIGFycm9nYW50LgorCit2ZXJzaW9uIDEuMi4xMHJjMyBbQXByaWwgMjEsIDIwMDZdCisgIEFkZGVkIGEgbm90ZSBpbiBsaWJwbmcudHh0IHRoYXQgcG5nX3NldF9zaWdfYnl0ZXMoOCkgY2FuIGJlIHVzZWQgd2hlbgorICAgIHdyaXRpbmcgYW4gZW1iZWRkZWQgUE5HIHdpdGhvdXQgdGhlIDgtYnl0ZSBzaWduYXR1cmUuCisgIFJldmlzZWQgbWFrZWZpbGVzIGFuZCBjb25maWd1cmUgdG8gYXZvaWQgbWFraW5nIGxpbmtzIHRvIGxpYnBuZy5zby4qCisKK3ZlcnNpb24gMS4yLjEwIFtBcHJpbCAyMywgMjAwNl0KKyAgUmV2ZXJ0ZWQgY29uZmlndXJlIHRvICJyYzIiIHN0YXRlLgorCit2ZXJzaW9uIDEuMi4xMWJldGExIFtNYXkgMzEsIDIwMDZdCisgIHNjcmlwdHMvbGlicG5nLnBjLmluIGNvbnRhaW5lZCAiY29uZmlndXJlIiBzdHlsZSB2ZXJzaW9uIGluZm8gYW5kIHdvdWxkCisgICAgbm90IHdvcmsgd2l0aCBtYWtlZmlsZXMuCisgIFRoZSBzaGFyZWQtbGlicmFyeSBtYWtlZmlsZXMgd2VyZSBsaW5raW5nIHRvIGxpYnBuZy5zby4wIGluc3RlYWQgb2YKKyAgICBsaWJwbmcuc28uMyBjb21wYXRpYmlsaXR5IGFzIHRoZSBsaWJyYXJ5LgorCit2ZXJzaW9uIDEuMi4xMWJldGEyIFtKdW5lIDIsIDIwMDZdCisgIEluY3JlYXNlZCBzcHJpbnRmIGJ1ZmZlciBmcm9tIDUwIHRvIDUyIGNoYXJzIGluIHBuZ3J1dGlsLmMgdG8gYXZvaWQKKyAgICBidWZmZXIgb3ZlcmZsb3cuCisgIEZpeGVkIGJ1ZyBpbiBleGFtcGxlLmMgKHBuZ19zZXRfcGFsZXR0ZV9yZ2IgLT4gcG5nX3NldF9wYWxldHRlX3RvX3JnYikKKwordmVyc2lvbiAxLjIuMTFiZXRhMyBbSnVuZSA1LCAyMDA2XQorICBQcmVwZW5kZWQgIiMhIC9iaW4vc2giIHRvIGx0bWFpbC5zaCBhbmQgY29udHJpYi9wbmdtaW51cy8qLnNoIChDb3NtaW4pLgorICBSZW1vdmVkIHRoZSBhY2NpZGVudGFsIGxlZnRvdmVyIE1ha2VmaWxlLmlufiAoQ29zbWluKS4KKyAgQXZvaWRlZCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IGFuZCBvcHRpbWl6ZWQgYnVmZmVyIGluCisgICAgcG5nX3dyaXRlX3NDQUwoKSwgcG5nX3dyaXRlX3NDQUxfcygpIChDb3NtaW4pLgorICBSZW1vdmVkIHRoZSBpbmNsdWRlIGRpcmVjdG9yaWVzIGFuZCBsaWJyYXJpZXMgZnJvbSBDRkxBR1MgYW5kIExERkxBR1MKKyAgICBpbiBzY3JpcHRzL21ha2VmaWxlLmdjYyAoTmVsc29uIEEuIGRlIE9saXZlaXJhLCBDb3NtaW4pLgorCit2ZXJzaW9uIDEuMi4xMWJldGE0IFtKdW5lIDYsIDIwMDZdCisgIEFsbG93IHplcm8tbGVuZ3RoIElEQVQgY2h1bmtzIGFmdGVyIHRoZSBlbnRpcmUgemxpYiBkYXRhc3RyZWFtLCBidXQgbm90CisgICAgYWZ0ZXIgYW5vdGhlciBpbnRlcnZlbmluZyBjaHVuayB0eXBlLgorCit2ZXJzaW9uIDEuMC4xOXJjMSwgMS4yLjExcmMxIFtKdW5lIDEzLCAyMDA2XQorICBEZWxldGVkIGV4dHJhbmVvdXMgc3F1YXJlIGJyYWNrZXRzIGZyb20gW2NvbmZpZy5oXSBpbiBjb25maWd1cmUuYWMKKwordmVyc2lvbiAxLjAuMTlyYzIsIDEuMi4xMXJjMiBbSnVuZSAxNCwgMjAwNl0KKyAgQWRkZWQgcHJvdG90eXBlcyBmb3IgUE5HX0lOQ0hfQ09OVkVSU0lPTlMgZnVuY3Rpb25zIHRvIHBuZy5oCisgIFJldmlzZWQgSU5TVEFMTCBhbmQgYXV0b2dlbi5zaAorICBGaXhlZCB0eXBvIGluIHNldmVyYWwgbWFrZWZpbGVzICgtVzEgc2hvdWxkIGJlIC1XbCkKKyAgQWRkZWQgdHlwZWRlZiBmb3IgcG5nX2ludF8zMiBhbmQgcG5nX3VpbnRfMzIgb24gNjQtYml0IHN5c3RlbXMuCisKK3ZlcnNpb24gMS4wLjE5cmMzLCAxLjIuMTFyYzMgW0p1bmUgMTUsIDIwMDZdCisgIFJlbW92ZWQgdGhlIG5ldyB0eXBlZGVmcyBmb3IgNjQtYml0IHN5c3RlbXMgKGRlbGF5IHVudGlsIHZlcnNpb24gMS40LjApCisgIEFkZGVkIG9uZSB6ZXJvIGVsZW1lbnQgdG8gcG5nX2dhbW1hX3NoaWZ0W10gYXJyYXkgaW4gcG5ncnRyYW4uYyB0byBhdm9pZAorICAgIHJlYWRpbmcgb3V0IG9mIGJvdW5kcy4KKwordmVyc2lvbiAxLjAuMTlyYzQsIDEuMi4xMXJjNCBbSnVuZSAxNSwgMjAwNl0KKyAgUmVhbGx5IHJlbW92ZWQgdGhlIG5ldyB0eXBlZGVmcyBmb3IgNjQtYml0IHN5c3RlbXMuCisKK3ZlcnNpb24gMS4wLjE5cmM1LCAxLjIuMTFyYzUgW0p1bmUgMjIsIDIwMDZdCisgIFJlbW92ZWQgcG5nX3NpZ19ieXRlcyBlbnRyeSBmcm9tIHNjcmlwdHMvcG5ndzMyLmRlZgorCit2ZXJzaW9uIDEuMC4xOSwgMS4yLjExIFtKdW5lIDI2LCAyMDA2XQorICBOb25lLgorCit2ZXJzaW9uIDEuMC4yMCwgMS4yLjEyIFtKdW5lIDI3LCAyMDA2XQorICBSZWFsbHkgaW5jcmVhc2VkIHNwcmludGYgYnVmZmVyIGZyb20gNTAgdG8gNTIgY2hhcnMgaW4gcG5ncnV0aWwuYyB0byBhdm9pZAorICAgIGJ1ZmZlciBvdmVyZmxvdy4KKwordmVyc2lvbiAxLjIuMTNiZXRhMSBbT2N0b2JlciAyLCAyMDA2XQorICBSZW1vdmVkIEFDX0ZVTkNfTUFMTE9DIGZyb20gY29uZmlndXJlLmFjCisgIFdvcmsgYXJvdW5kIEludGVsLU1hYyBjb21waWxlciBidWcgYnkgc2V0dGluZyBQTkdfTk9fTU1YX0NPREUgaW4gcG5nY29uZi5oCisgIENoYW5nZSAibG9naWNhbCIgdG8gImJpdHdpc2UiIHRocm91Z2hvdXQgZG9jdW1lbnRhdGlvbi4KKyAgRGV0ZWN0IGFuZCBmaXggYXR0ZW1wdCB0byB3cml0ZSB3cm9uZyBpQ0NQIHByb2ZpbGUgbGVuZ3RoLgorCit2ZXJzaW9uIDEuMC4yMSwgMS4yLjEzIFtOb3ZlbWJlciAxNCwgMjAwNl0KKyAgRml4IHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgaW4gc1BMVCBjaHVuayBoYW5kbGVyLgorICBGaXggTWFrZWZpbGUuYW0gdG8gbm90IHRyeSB0byBsaW5rIHRvIG5vZXhpc3RlbnQgZmlsZXMuCisgIENoZWNrIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgZm9yIE5VTEwgcG5nX3B0ci4KKwordmVyc2lvbiAxLjIuMTRiZXRhMSBbTm92ZW1iZXIgMTcsIDIwMDZdCisgIFJlbG9jYXRlZCB0aHJlZSBtaXNwbGFjZWQgdGVzdHMgZm9yIE5VTEwgcG5nX3B0ci4KKyAgQnVpbHQgTWFrZWZpbGUuaW4gd2l0aCBhdXRvbWFrZS0xLjkuNiBpbnN0ZWFkIG9mIDEuOS4yLgorICBCdWlsZCBjb25maWd1cmUgd2l0aCBhdXRvY29uZi0yLjYwIGluc3RlYWQgb2YgMi41OQorCit2ZXJzaW9uIDEuMi4xNGJldGEyIFtOb3ZlbWJlciAxNywgMjAwNl0KKyAgQWRkZWQgc29tZSB0eXBlY2FzdHMgaW4gcG5nX3phbGxvYygpLgorCit2ZXJzaW9uIDEuMi4xNHJjMSBbTm92ZW1iZXIgMjAsIDIwMDZdCisgIENoYW5nZWQgInN0cnRvZCIgdG8gInBuZ19zdHJ0b2QiIGluIHBuZ3J1dGlsLmMKKwordmVyc2lvbiAxLjAuMjIsIDEuMi4xNCAgICBbTm92ZW1iZXIgMjcsIDIwMDZdCisgIEFkZGVkIG1pc3NpbmcgIiQoc3JjZGlyKSIgaW4gTWFrZWZpbGUuYW0gYW5kIE1ha2VmaWxlLmluCisKK3ZlcnNpb24gMS4yLjE1YmV0YTEgW0RlY2VtYmVyIDMsIDIwMDZdCisgIEdlbmVyYXRlZCBjb25maWd1cmUgd2l0aCBhdXRvY29uZi0yLjYxIGluc3RlYWQgb2YgMi42MAorICBSZXZpc2VkIGNvbmZpZ3VyZS5hYyB0byB1cGRhdGUgbGlicG5nLnBjIGFuZCBsaWJwbmctY29uZmlnLgorCit2ZXJzaW9uIDEuMi4xNWJldGEyIFtEZWNlbWJlciAzLCAyMDA2XQorICBBbHdheXMgZXhwb3J0IE1NWCBhc20gZnVuY3Rpb25zLCBqdXN0IHN0dWJzIGlmIG5vdCBidWlsZGluZyBwbmdnY2NyZC5jCisKK3ZlcnNpb24gMS4yLjE1YmV0YTMgW0RlY2VtYmVyIDQsIDIwMDZdCisgIEFkZCAicG5nX2J5dGVwIiB0eXBlY2FzdCB0byBwcm9maWxlIHdoaWxlIGNhbGN1bGF0aW5nIGxlbmd0aCBpbiBwbmd3dXRpbC5jCisKK3ZlcnNpb24gMS4yLjE1YmV0YTQgW0RlY2VtYmVyIDcsIDIwMDZdCisgIEFkZGVkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKKyAgQ2hhbmdlZCBQTkdfTk9fQVNTRU1CTEVSX0NPREUgdG8gUE5HX05PX01NWF9DT0RFIGluIHNjcmlwdHMsIGxpa2UgMS40LjBiZXRhCisKK3ZlcnNpb24gMS4yLjE1YmV0YTUgW0RlY2VtYmVyIDcsIDIwMDZdCisgIENoYW5nZWQgc29tZSBpbnN0YW5jZXMgb2YgUE5HX0FTU0VNQkxFUl8qIHRvIFBOR19NTVhfKiBpbiBwbmdnY2NyZC5jCisgIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAorCit2ZXJzaW9uIDEuMi4xNWJldGE2IFtEZWNlbWJlciAxMywgMjAwNl0KKyAgUmV2aXNlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0IGFuZCBjb25maWd1cmUuYWMKKwordmVyc2lvbiAxLjIuMTVyYzEgW0RlY2VtYmVyIDE4LCAyMDA2XQorICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKKwordmVyc2lvbiAxLjIuMTVyYzIgW0RlY2VtYmVyIDIxLCAyMDA2XQorICBBZGRlZCBjb25kaXRpb25hbCAjdW5kZWYgam1wYnVmIGluIHBuZ3Rlc3QuYyB0byB1bmRvICNkZWZpbmUgaW4gQUlYIGhlYWRlcnMuCisgIEFkZGVkIHNjcmlwdHMvbWFrZWZpbGUubm9tbXgKKwordmVyc2lvbiAxLjIuMTVyYzMgW0RlY2VtYmVyIDI1LCAyMDA2XQorICBGaXhlZCBzaGFyZWQgbGlicmFyeSBudW1iZXJpbmcgZXJyb3IgdGhhdCB3YXMgaW50cm9kdWNlZCBpbiAxLjIuMTViZXRhNi4KKwordmVyc2lvbiAxLjIuMTVyYzQgW0RlY2VtYmVyIDI3LCAyMDA2XQorICBGaXhlZCBoYW5kbGluZyBvZiByZ2JfdG9fZ3JheSB3aGVuIHBuZ19wdHItPmNvbG9yLmdyYXkgaXNuJ3Qgc2V0LgorCit2ZXJzaW9uIDEuMi4xNXJjNSBbRGVjZW1iZXIgMzEsIDIwMDZdCisgIFJldmlzZWQgaGFuZGxpbmcgb2YgcmdiX3RvX2dyYXkuCisKK3ZlcnNpb24gMS4wLjIzLCAxLjIuMTUgW0phbnVhcnkgNSwgMjAwN10KKyAgQWRkZWQgc29tZSAodW5zaWduZWQgbG9uZykgdHlwZWNhc3RzIGluIHBuZ3Rlc3QuYyB0byBhdm9pZCBwcmludGluZyBlcnJvcnMuCisKK3ZlcnNpb24gMS4yLjE2YmV0YTEgW0phbnVhcnkgNiwgMjAwN10KKyAgRml4IGJ1Z3MgaW4gbWFrZWZpbGUubm9tbXgKKwordmVyc2lvbiAxLjIuMTZiZXRhMiBbSmFudWFyeSAxNiwgMjAwN10KKyAgUmV2aXNlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0CisKK3ZlcnNpb24gMS4wLjI0LCAxLjIuMTYgW0phbnVhcnkgMzEsIDIwMDddCisgIE5vIGNoYW5nZXMuCisKK3ZlcnNpb24gMS4yLjE3YmV0YTEgW01hcmNoIDYsIDIwMDddCisgIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dCB0byBpbnN0YWxsIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzLgorICBEZWxldGVkIGEgcmVkdW5kYW50IGxpbmUgZnJvbSBwbmdzZXQuYy4KKwordmVyc2lvbiAxLjIuMTdiZXRhMiBbQXByaWwgMjYsIDIwMDddCisgIFJlbG9jYXRlZCBtaXNwbGFjZWQgdGVzdCBmb3IgcG5nX3B0ciA9PSBOVUxMIGluIHBuZ3ByZWFkLmMKKyAgQ2hhbmdlICI9PSIgdG8gIiYiIGZvciB0ZXN0aW5nIFBOR19SR0JfVE9fR1JBWV9FUlIgJiBQTkdfUkdCX1RPX0dSQVlfV0FSTgorICAgIGZsYWdzLgorICBDaGFuZ2VkIHJlbWFpbmluZyBpbnN0YW5jZXMgb2YgUE5HX0FTU0VNQkxFUl8qIHRvIFBOR19NTVhfKgorICBBZGRlZCBwbmdlcnJvcigpIHdoZW4gd3JpdGVfSUhEUiBmYWlscyBpbiBkZWZsYXRlSW5pdDIoKS4KKyAgQWRkZWQgImNvbnN0IiB0byBzb21lIGFycmF5IGRlY2xhcmF0aW9ucy4KKyAgTWVudGlvbiBleGFtcGxlcyBvZiBsaWJwbmcgdXNhZ2UgaW4gdGhlIGxpYnBuZyoudHh0IGFuZCBsaWJwbmcuMyBkb2N1bWVudHMuCisKK3ZlcnNpb24gMS4yLjE3cmMxIFtNYXkgNCwgMjAwN10KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjIuMTdyYzIgW01heSA4LCAyMDA3XQorICBNb3ZlZCBzZXZlcmFsIFBOR19IQVZFXyogbWFjcm9zIG91dCBvZiBQTkdfSU5URVJOQUwgYmVjYXVzZSBhcHBsaWNhdGlvbnMKKyAgICBjYWxsaW5nIHNldF91bmtub3duX2NodW5rX2xvY2F0aW9uKCkgbmVlZCB0aGVtLgorICBDaGFuZ2VkIHRyYW5zZm9ybWF0aW9uIGZsYWcgZnJvbSBQTkdfRVhQQU5EX3RSTlMgdG8gUE5HX0VYUEFORCBpbgorICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpLgorICBBZGRlZCBwbmdfcHRyLT51bmtub3duX2NodW5rIHRvIGhvbGQgd29ya2luZyB1bmtub3duIGNodW5rIGRhdGEsIHNvIGl0CisgICAgY2FuIGJlIGZyZWUnZWQgaW4gY2FzZSBvZiBlcnJvci4gIFJldmlzZWQgdW5rbm93biBjaHVuayBoYW5kbGluZyBpbgorICAgIHBuZ3J1dGlsLmMgYW5kIHBuZ3ByZWFkLmMgdG8gdXNlIHRoaXMgc3RydWN0dXJlLgorCit2ZXJzaW9uIDEuMi4xN3JjMyBbTWF5IDgsIDIwMDddCisgIFJldmlzZWQgc3ltYm9sLWhhbmRsaW5nIGluIGNvbmZpZ3VyZSBzY3JpcHQuCisKK3ZlcnNpb24gMS4yLjE3cmM0IFtNYXkgMTAsIDIwMDddCisgIFJldmlzZWQgdW5rbm93biBjaHVuayBoYW5kbGluZyB0byBhdm9pZCBzdG9yaW5nIHVua25vd24gY3JpdGljYWwgY2h1bmtzLgorCit2ZXJzaW9uIDEuMC4yNSBbTWF5IDE1LCAyMDA3XQordmVyc2lvbiAxLjIuMTcgW01heSAxNSwgMjAwN10KKyAgQWRkZWQgInBuZ19wdHItPm51bV90cmFucz0wIiBiZWZvcmUgZXJyb3IgcmV0dXJuIGluIHBuZ19oYW5kbGVfdFJOUywKKyAgICB0byBlbGltaW5hdGUgYSB2dWxuZXJhYmlsaXR5IChDVkUtMjAwNy0yNDQ1LCBDRVJUIFZVIzY4NDY2NCkKKwordmVyc2lvbiAxLjAuMjYgW01heSAxNSwgMjAwN10KK3ZlcnNpb24gMS4yLjE4IFtNYXkgMTUsIDIwMDddCisgIFJldmVydGVkIHRoZSBsaWJwbmctMS4yLjE3cmMzIGNoYW5nZSB0byBzeW1ib2wtaGFuZGxpbmcgaW4gY29uZmlndXJlIHNjcmlwdAorCit2ZXJzaW9uIDEuMi4xOWJldGExIFtNYXkgMTgsIDIwMDddCisgIENoYW5nZWQgImNvbnN0IHN0YXRpYyIgdG8gInN0YXRpYyBQTkdfQ09OU1QiIGV2ZXJ5d2hlcmUsIG1vc3RseSB1bmRvaW5nCisgICAgY2hhbmdlIG9mIGxpYnBuZy0xLjIuMTdiZXRhMi4gIENoYW5nZWQgb3RoZXIgImNvbnN0IiB0byAiUE5HX0NPTlNUIgorICBDaGFuZ2VkIHNvbWUgaGFuZGxpbmcgb2YgdW51c2VkIHBhcmFtZXRlcnMsIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgorICAgICJpZiAodW51c2VkID09IE5VTEwpIHJldHVybjsiIGJlY29tZXMgInVudXNlZCA9IHVudXNlZCIuCisKK3ZlcnNpb24gMS4yLjE5YmV0YTIgW01heSAxOCwgMjAwN10KKyAgT25seSB1c2UgdGhlIHZhbGlkIGJpdHMgb2YgdFJOUyB2YWx1ZSBpbiBwbmdfZG9fZXhwYW5kKCkgKEJyaWFuIENhcnRpZXIpCisKK3ZlcnNpb24gMS4yLjE5YmV0YTMgW01heSAxOSwgMjAwN10KKyAgQWRkIHNvbWUgInBuZ19ieXRlIiB0eXBlY2FzdHMgaW4gcG5nX2NoZWNrX2tleXdvcmQoKSBhbmQgd3JpdGUgbmV3X2tleQorICBpbnN0ZWFkIG9mIGtleSBpbiB6VFh0IGNodW5rIChLZXZpbiBSeWRlKS4KKwordmVyc2lvbiAxLjIuMTliZXRhNCBbTWF5IDIxLCAyMDA3XQorICBBZGQgcG5nX3NucHJpbnRmKCkgZnVuY3Rpb24gYW5kIHVzZSBpdCBpbiBwbGFjZSBvZiBzcHJpbnQoKSBmb3IgaW1wcm92ZWQKKyAgICBkZWZlbnNlIGFnYWluc3QgYnVmZmVyIG92ZXJmbG93cy4KKwordmVyc2lvbiAxLjIuMTliZXRhNSBbTWF5IDIxLCAyMDA3XQorICBGaXhlZCBwbmdfaGFuZGxlX3RSTlMoKSB0byBvbmx5IHVzZSB0aGUgdmFsaWQgYml0cyBvZiB0Uk5TIHZhbHVlLgorICBDaGFuZ2VkIGhhbmRsaW5nIG9mIG1vcmUgdW51c2VkIHBhcmFtZXRlcnMsIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgorICBSZW1vdmVkIHNvbWUgUE5HX0NPTlNUIGluIHBuZ3d1dGlsLmMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCisKK3ZlcnNpb24gMS4yLjE5YmV0YTYgW01heSAyMiwgMjAwN10KKyAgQWRkZWQgc29tZSAjaWZkZWYgUE5HX01NWF9DT0RFX1NVUFBPUlRFRCB3aGVyZSBuZWVkZWQgaW4gcG5ndmNyZC5jCisgIEFkZGVkIGEgc3BlY2lhbCAiX01TQ19WRVIiIGNhc2UgdGhhdCBkZWZpbmVzIHBuZ19zbnByaW50ZiB0byBfc25wcmludGYKKwordmVyc2lvbiAxLjIuMTliZXRhNyBbTWF5IDIyLCAyMDA3XQorICBTcXVlbGNoZWQgcG5nX3NxdWVsY2hfd2FybmluZ3MoKSBpbiBwbmdnY2NyZC5jIGFuZCBhZGRlZAorICAgIGFuICNpZmRlZiBQTkdfTU1YX0NPREVfU1VQUE9SVEVELyNlbmRpZiBibG9jayBhcm91bmQgdGhlIGRlY2xhcmF0aW9ucworICAgIHRoYXQgY2F1c2VkIHRoZSB3YXJuaW5ncyB0aGF0IHBuZ19zcXVlbGNoX3dhcm5pbmdzIHdhcyBzcXVlbGNoaW5nLgorCit2ZXJzaW9uIDEuMi4xOWJldGE4IFtNYXkgMjIsIDIwMDddCisgIFJlbW92ZWQgX19NTVhfXyBmcm9tIHRlc3QgaW4gcG5nY29uZi5oLgorCit2ZXJzaW9uIDEuMi4xOWJldGE5IFtNYXkgMjMsIDIwMDddCisgIE1hZGUgcG5nX3NxdWVsY2hfd2FybmluZ3MoKSBhdmFpbGFibGUgdmlhIFBOR19TUVVFTENIX1dBUk5JTkdTIG1hY3JvLgorICBSZXZpc2VkIHBuZ19zcXVlbGNoX3dhcm5pbmdzKCkgc28gaXQgbWlnaHQgd29yay4KKyAgVXBkYXRlZCBtYWtlZmlsZS5zZ2NjIGFuZCBtYWtlZmlsZS5zb2xhcmlzOyBhZGRlZCBtYWtlZmlsZS5zb2xhcmlzLXg4Ni4KKwordmVyc2lvbiAxLjIuMTliZXRhMTAgW01heSAyNCwgMjAwN10KKyAgUmVzcXVlbGNoZWQgcG5nX3NxdWVsY2hfd2FybmluZ3MoKSwgdXNlICJfX2F0dHJpYnV0ZV9fKCh1c2VkKSkiIGluc3RlYWQuCisKK3ZlcnNpb24gMS4yLjE5YmV0YTExIFtNYXkgMjgsIDIwMDddCisgIFJldHVybiAwIGZyb20gcG5nX2dldF9zUExUKCkgYW5kIHBuZ19nZXRfdW5rbm93bl9jaHVua3MoKSBpZiBwbmdfcHRyIGlzIE5VTEw7CisgICAgY2hhbmdlZCB0aHJlZSByZW1haW5pbmcgaW5zdGFuY2VzIG9mIHBuZ19zdHJjcHkoKSB0byBwbmdfc3RybmNweSgpIChEYXZpZAorICAgIEhpbGwpLgorICBNYWtlIHRlc3QgZm9yIE5VTEwgcm93X2J1ZiBhdCB0aGUgYmVnaW5uaW5nIG9mIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucworICAgIHVuY29uZGl0aW9uYWwuCisKK3ZlcnNpb24gMS4yLjE5YmV0YTEyIFtNYXkgMjgsIDIwMDddCisgIFJldmlzZWQgcG5nZ2NjcmQuYy4KKwordmVyc2lvbiAxLjIuMTliZXRhMTMgW0p1bmUgMTQsIDIwMDddCisgIFByZWZlciBQTkdfVVNFX1BOR1ZDUkQgd2hlbiBfTVNDX1ZFUiBpcyBkZWZpbmVkIGluIHBuZ2NvbmYuaAorCit2ZXJzaW9uIDEuMi4xOWJldGExNCBbSnVuZSAxNiwgMjAwN10KKyAgRml4IGJ1ZyB3aXRoIGhhbmRsaW5nIG9mIDE2LWJpdCB0cmFuc3BhcmVuY3ksIGludHJvZHVjZWQgaW4gMS4yLjE5YmV0YTIKKwordmVyc2lvbiAxLjIuMTliZXRhMTUgW0p1bmUgMTcsIDIwMDddCisgIFJldmlzZWQgcG5nZ2NjcmQuYy4KKwordmVyc2lvbiAxLjIuMTliZXRhMTYgW0p1bmUgMTgsIDIwMDddCisgIFJldmlzZWQgcG5nZ2NjcmQuYyBhZ2Fpbi4KKyAgVXBkYXRlZCBjb250cmliL2dyZWdib29rLgorICBDaGFuZ2VkICcjaW5jbHVkZSAicG5nZ2NjcmQuYyInIHRvICdpbmNsdWRlICIkc3JjZGlyL3BuZ2djY3JkLmMiJworICAgIGluIGNvbmZpZ3VyZS5hYworCit2ZXJzaW9uIDEuMi4xOWJldGExNyBbSnVuZSAxOSwgMjAwN10KKyAgUmV2aXNlZCBtYW55IG9mIHRoZSBtYWtlZmlsZXMsIHRvIHNldCAtRFBOR19OT19NTVhfQ09ERSB3aGVyZSBuZWVkZWQKKyAgICBhbmQgdG8gbm90IHVzZSAtTzMgdW5sZXNzIC1EUE5HX05PX01NWF9DT0RFIGlzIGFsc28gc2V0LgorCit2ZXJzaW9uIDEuMi4xOWJldGExOCBbSnVuZSAyMywgMjAwN10KKyAgUmVwbGFjZWQgc29tZSBDKysgc3R5bGUgY29tbWVudHMgd2l0aCBDIHN0eWxlIGNvbW1lbnRzIGluIHBuZ2djY3JkLmMuCisgIENvcGllZCBvcHRpbWl6ZWQgQyBjb2RlIGZyb20gcG5nZ2NjcmQuYyB0byBwbmdydXRpbC5jLCByZW1vdmVkIGRlcGVuZGVuY3kKKyAgICBvbiBwbmdnY2NyZC5vIGZyb20gbWFueSBtYWtlZmlsZXMuCisgIEFkZGVkIHNsIGFuZCBkeWxpYiB0byBsaXN0IG9mIGV4dGVuc2lvbnMgYmUgaW5zdGFsbGVkIGJ5IE1ha2VmaWxlLmFtCisKK3ZlcnNpb24gMS4yLjE5YmV0YTE5IFtKdW5lIDI4LCAyMDA3XQorICBGaXhlZCB0ZXN0aW5nIFBOR19SR0JfVE9fR1JBWV9FUlIgJiBQTkdfUkdCX1RPX0dSQVlfV0FSTiBpbiBwbmdydHJhbi5jCisgIE1vcmUgY2xlYW51cCBvZiBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMKKwordmVyc2lvbiAxLjIuMTliZXRhMjAgW0p1bmUgMjksIDIwMDddCisgIFJlYnVpbHQgTWFrZWZpbGUuaW4gYW5kIGNvbmZpZ3VyZSB1c2luZyBsaWJ0b29sLTEuNS4yNC4KKyAgRml4ZWQgdHlwbyBpbiBwbmdnY2NyZC5jCisKK3ZlcnNpb24gMS4yLjE5YmV0YTIxIFtKdW5lIDMwLCAyMDA3XQorICBNb3JlIHJldmlzaW9uIG9mIHBuZ2djY3JkLmMKKyAgQWRkZWQgInRlc3QiIHRhcmdldCB0byBNYWtlZmlsZS5pbiBhbmQgTWFrZWZpbGUuYW0KKwordmVyc2lvbiAxLjIuMTliZXRhMjIgW0p1bHkgMywgMjAwN10KKyAgQWRkZWQgaW5mbyBhYm91dCBwbmdydXRpbC9wbmdnY2NyZC9wbmd2Y3JkIHRvIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24oKQorICBGaXggdHlwZSBkZWZpbml0aW9uIG9mIGR1bW15X3ZhbHVlX2EsIGIgaW4gcG5nZ2NjcmQuYworCit2ZXJzaW9uIDEuMi4xOWJldGEyMyBbSnVseSAxMCwgMjAwN10KKyAgUmV2ZXJ0IGNoYW5nZSB0byB0eXBlIGRlZmluaXRpb24gb2YgZHVtbXlfdmFsdWVfYSwgYiBpbiBwbmdnY2NyZC5jCisgIE1ha2Ugc3VyZSBfX1BJQ19fIGlzIGRlZmluZWQgaW4gcG5nZ2NjcmQuYyB3aGVuIFBJQyBpcyBkZWZpbmVkLgorICBSZXF1aXJlIGdjYy00LjEgb3IgYmV0dGVyIHRvIHVzZSBQTkdfSEFWRV9NTVhfRklMVEVSX1JPVyBvbiB4ODZfNjQgcGxhdGZvcm1zCisKK3ZlcnNpb24gMS4yLjE5YmV0YTI0IFtKdWx5IDE0LCAyMDA3XQorICBBZGRlZCBQTkdfTk9fUkVBRF9GSUxURVIsIFBOR19OT19XUklURV9GSUxURVIsIFBOR19OT19XQVJOSU5HIG1hY3Jvcy4KKyAgQWRkZWQgY29udHJpYi9wbmdtaW5pbSB0byBkZW1vbnN0cmF0ZSBidWlsZGluZyBtaW5pbWFsIGVuY29kZXIgYW5kIGRlY29kZXIKKwordmVyc2lvbiAxLjIuMTliZXRhMjUgW0p1bHkgMTUsIDIwMDddCisgIFJlbW92ZWQgdGhlIG5ldyBQTkdfTk9fUkVBRF9GSUxURVIgbWFjcm8gc2luY2UgaXQgd291bGQgbWFrZSB0aGUgbGlicmFyeQorICAgIHVuYWJsZSB0byByZWFkIHZhbGlkIFBORyBmaWxlcywgYW5kIGZpbHRlcmluZyBpcyBhdCB0aGUgaGVhcnQgb2YgdGhlCisgICAgUE5HIGZvcm1hdC4KKwordmVyc2lvbiAxLjIuMTliZXRhMjYgW0p1bHkgMTYsIDIwMDddCisgIENoYW5nZWQgInBuZ19mcmVlKHN0cikiIHRvICJwbmdfZnJlZShwbmdfcHRyLHN0cikiIGluIHBuZ3J1dGlsLmMgV2luQ0UKKyAgICBjb2RlIChZdmVzIFBpZ3VldCkuICBUaGlzIGJ1ZyB3YXMgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjE0LgorICBVcGRhdGVkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKKyAgUmVsb2NhdGVkIGEgbWlzcGxhY2VkICNlbmRpZiBpbiBwbmdnY2NyZC5jCisKK3ZlcnNpb24gMS4yLjE5YmV0YTI3IFtKdWx5IDE3LCAyMDA3XQorICBGaXhlZCBpbmNvcnJlY3Qgc3RyaWRlIGFuZCBudW1iZXIgb2YgYnl0ZXMgY29waWVkICh3YXMgNCBpbnN0ZWFkIG9mCisgICAgNiBieXRlcykgaW4gdGhlIGNsZWFudXAgbG9vcCBvZiBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMgZm9yIGhhbmRsaW5nCisgICAgdGhlIGVuZCBvZiA0OC1iaXQgaW50ZXJsYWNlZCByb3dzIChHbGVubiBSLVApLgorCit2ZXJzaW9uIDEuMi4xOWJldGEyOCBbSnVseSAxOSwgMjAwN10KKyAgUmVtb3ZlZCByZXF1aXJlbWVudCBmb3IgZ2NjLTQuMSBvciBiZXR0ZXIgdG8gdXNlIFBOR19IQVZFX01NWF9GSUxURVJfUk9XCisgICAgb24geDg2XzY0IHBsYXRmb3JtcworICBBZGRlZCBwbmdfd2FybmluZygpIGluIHBuZ3J1dGlsLmMgZm9yIHNob3J0IGlDQ1AsIGlUWHQsIHNQTFQsIG9yIHpUWFQgY2h1bmtzLgorICBSZXZpc2VkIHBuZ3Rlc3QuYyBzbyB3YXJuaW5ncyBhcmUgZGlzcGxheWVkIHJlZ2FyZGxlc3Mgb2YgUE5HX05PX1NURElPLgorCit2ZXJzaW9uIDEuMi4xOWJldGEyOSBbSnVseSAyMCwgMjAwN10KKyAgRml4IHR5cG8gaW4gcG5nZ2NjcmQuYyAoJSVlYXggc2hvdWxkIGJlICUlYXggaW4gc2Vjb25kbG9vcDQ4KQorCit2ZXJzaW9uIDEuMi4xOWJldGEzMCBbSnVseSAyNiwgMjAwN10KKyAgUmV2aXNlZCBwbmdnY2NyZC5jCisKK3ZlcnNpb24gMS4yLjE5YmV0YTMxIFtKdWx5IDI3LCAyMDA3XQorICBGaXggdHlwb3MgaW4gcG5nZ2NjcmQuYworCit2ZXJzaW9uIDEuMC4yN3JjMSBhbmQgMS4yLjE5cmMxIFtKdWx5IDMxLCAyMDA3XQorICBEaXNhYmxlIFBOR19NTVhfQ09ERV9TVVBQT1JURUQgd2hlbiBQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVEIGlzIG9mZi4KKyAgRW5hYmxlIFBOR19NTVhfUkVBRF9GSUxURVJfKiBieSBkZWZhdWx0LCBleGNlcHQgd2hlbiBnY2MtMy54IGlzIGJlaW5nCisgICAgdXNlZCAodGhleSB3ZXJlIGluYWR2ZXJ0ZW50bHkgZGlzYWJsZWQgaW4gbGlicG5nLTEuMi4xOWJldGEyMykuCisgIEZpeCBzb21lIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIGluIHBuZ2djY3JkLmMgYW5kIHBuZ3J1dGlsLmMKKyAgQWRkZWQgaW5mb3JtYXRpb24gYWJvdXQgZGlzYWJsaW5nIHRoZSBNTVggY29kZSBpbiBsaWJwbmcgZG9jdW1lbnRhdGlvbi4KKwordmVyc2lvbiAxLjAuMjdyYzIgYW5kIDEuMi4xOXJjMiBbQXVndXN0IDQsIDIwMDddCisgIFJlbW92ZWQgc29tZSAiI2lmIDAiIGJsb2Nrcy4KKyAgTWFkZSBhIGdsb2JhbCBzdHJ1Y3QgbG9jYWwgaW4gcG5ndmNyZC5jIHRvIG1ha2UgaXQgdGhyZWFkIHNhZmUuCisgIElzc3VlIGEgcG5nX2Vycm9yKCkgaWYgYXBwbGljYXRpb24gYXR0ZW1wdHMgdG8gdHJhbnNmb3JtIGEgcm93IHRodAorICAgIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4KKwordmVyc2lvbiAxLjAuMjdyYzMgYW5kIDEuMi4xOXJjMyBbQXVndXN0IDksIDIwMDddCisgIFNsaWdodGx5IHJldmlzZWQgcG5ndmNyZC5jCisKK3ZlcnNpb24gMS4wLjI3cmM0IGFuZCAxLjIuMTlyYzQgW0F1Z3VzdCA5LCAyMDA3XQorICBSZXZpc2VkIHBuZ2djY3JkLmMgZGVidWdnaW5nIGNoYW5nZSBvZiByYzEsIHdoaWNoIHdhcyBicm9rZW4uCisgIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAorICBDaGFuZ2UgZGVmYXVsdCB0byBQTkdfTk9fR0xPQkFMX0FSUkFZUyBmb3IgTVNWQy4KKyAgVHVybiBvZmYgUE5HX0ZMQUdfUk9XX0lOSVQgZmxhZyB3aGVuIHNldHRpbmcgdHJhbnNmb3JtcyB0aGF0IGV4cGFuZCBwaXhlbHMuCisKK3ZlcnNpb24gMS4wLjI3cmM1IGFuZCAxLjIuMTlyYzUgW0F1Z3VzdCAxMCwgMjAwN10KKyAgRml4IHR5cG8gKG1pc3NpbmcgJyInKSBpbiBwbmdnY2NyZC5jCisgIFJldmlzZSBoYW5kbGluZyBvZiBwbmdfc3RydG9kIGluIHJlY2VudCB2ZXJzaW9ucyBvZiBXSU5DRQorCit2ZXJzaW9uIDEuMC4yN3JjNiBhbmQgMS4yLjE5cmM2IFtBdWd1c3QgMTUsIDIwMDddCisgIEZpeCB0eXBvIChtaXNzaW5nICcsJykgaW4gY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jCisgIFVuZGlkIHJvdyBpbml0aWFsaXphdGlvbiBlcnJvciBleGl0IGFkZGVkIHRvIHJjMiBhbmQgcmM0LgorCit2ZXJzaW9uIDEuMC4yNyBhbmQgMS4yLjE5IFtBdWd1c3QgMTgsIDIwMDddCisgIENvbmRpdGlvbmFsbHkgcmVzdG9yZWQgcm93IGluaXRpYWxpemF0aW9uIGVycm9yIGV4aXQuCisKK3ZlcnNpb24gMS4yLjIwYmV0YTAxIFtBdWd1c3QgMTksIDIwMDddCisgIEZpeGVkIHByb2JsZW0gd2l0aCBjb21waWxpbmcgcG5nZ2NjcmQuYyBvbiBJbnRlbC1BcHBsZSBwbGF0Zm9ybXMuCisgIENoYW5nZWQgcG5nX21hbGxvYygpIHRvIHBuZ19tYWxsb2Nfd2FybigpIGluIHBuZ19zZXRfc1BMVCgpLgorICBBZGRlZCBQTkdfTk9fRVJST1JfVEVYVCBmZWF0dXJlLCB3aXRoIGRlbW8gaW4gY29udHJpYi9wbmdtaW5pbQorICBSZW1vdmVkIGRlZmluZSBQTkdfV0FSTl9VTklOSVRJQUxJWkVEX1JPVyAxIC8qIDA6IHdhcm5pbmc7IDE6IGVycm9yICovCisgICAgYmVjYXVzZSBpdCBjYXVzZWQgc29tZSB0cm91YmxlLgorCit2ZXJzaW9uIDEuMi4yMGJldGEwMiBbQXVndXN0IDIwLCAyMDA3XQorICBBdm9pZCBjb21waWxpbmcgcG5nZ2NjcmQuYyBvbiBJbnRlbC1BcHBsZSBwbGF0Zm9ybXMuCisKK3ZlcnNpb24gMS4yLjIwYmV0YTAzIFtBdWd1c3QgMjAsIDIwMDddCisgIEFkZGVkICIvRCBQTkdfTk9fTU1YX0NPREUiIHRvIHRoZSBub24tbW14IGJ1aWxkcyBvZiBwcm9qZWN0cy92aXN1YWxjNgorICAgIGFuZCB2aXN1YWxjNzEuCisKK3ZlcnNpb24gMS4yLjIwYmV0YTA0IFtBdWd1c3QgMjEsIDIwMDddCisgIFJldmlzZWQgcG5ndmNyZC5jIGZvciBpbXByb3ZlZCBlZmZpY2llbmN5IChTdGV2ZSBTbnlkZXIpLgorCit2ZXJzaW9uIDEuMi4yMHJjMSBbQXVndXN0IDIzLCAyMDA3XQorICBSZXZpc2VkIHBuZ2NvbmYuaCB0byBzZXQgUE5HX05PX01NWF9DT0RFIGZvciBnY2MtMy54IGNvbXBpbGVycy4KKwordmVyc2lvbiAxLjIuMjByYzIgW0F1Z3VzdCAyNywgMjAwN10KKyAgUmV2aXNlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0CisgIFJldmlzZWQgI2lmZGVmcyB0byBlbnN1cmUgb25lIGFuZCBvbmx5IG9uZSBvZiBwbmdnY2NyZC5jLCBwbmd2Y3JkLmMsCisgICAgb3IgcGFydCBvZiBwbmdydXRpbC5jIGlzIHNlbGVjdGVkLgorCit2ZXJzaW9uIDEuMi4yMHJjMyBbQXVndXN0IDMwLCAyMDA3XQorICBSZW1vdmUgYSBsaXR0bGUgbW9yZSBjb2RlIGluIHBuZ3d1dGlsLmMgd2hlbiBQTkdfTk9fV1JJVEVfRklMVEVSIGlzIHNlbGVjdGVkLgorICBBZGRlZCAvRCBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyB0byB2aXN1YWw2YyBhbmQgdmlzdWFsYzcxIHByb2plY3RzLgorICBDb21waWxlIHBuZ19tbXhfc3VwcG9ydCgpIGluIHBuZy5jIGV2ZW4gd2hlbiBQTkdfTk9fTU1YX0NPREUgaXMgZGVmaW5lZC4KKyAgUmVzdG9yZWQgYSAic3VwZXJmbHVvdXMiICNpZmRlZiB0aGF0IHdhcyByZW1vdmVkIGZyb20gMS4yLjIwcmMyIHBuZ2djY3JkLmMsCisgICAgYnJlYWtpbmcgdGhlIHBuZ19tbXhfc3VwcG9ydCgpIGZ1bmN0aW9uLgorCit2ZXJzaW9uIDEuMi4yMHJjNCBbU2VwdGVtYmVyIDEsIDIwMDddCisgIFJlbW92ZWQgSW50ZWwgY29udHJpYnV0aW9ucyAoTU1YLCBPcHRpbWl6ZWQgQykuCisKK3ZlcnNpb24gMS4yLjIwcmM1IFtTZXB0ZW1iZXIgMiwgMjAwN10KKyAgUmVzdG9yZWQgY29uZmlndXJlIGFuZCBNYWtlZmlsZS5pbiB0byByYzMgYW5kIHB1dCBhIHNuaXBwZXQgb2YgY29kZSBpbgorICAgIHBuZ2djY3JkLmMsIHRvIGVuc3VyZSBjb25maWd1cmUgbWFrZXMgdGhlIHNhbWUgUE5HX05PX01NWF9DT0RFIHNlbGVjdGlvbgorCit2ZXJzaW9uIDEuMi4yMHJjNiBbU2VwdGVtYmVyIDIsIDIwMDddCisgIEZpeGVkIGJ1Z3MgaW4gc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAorICBSZW1vdmVkIHBuZ3ZjcmQuYyByZWZlcmVuY2VzIGZyb20gbXN2YyBwcm9qZWN0cy4KKwordmVyc2lvbiAxLjAuMjggYW5kIDEuMi4yMCBbU2VwdGVtYmVyIDgsIDIwMDddCisgIFJlbW92ZWQgIihOTyBSRUFEIFNVUFBPUlQpIiBmcm9tIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24oKSBzdHJpbmcuCisKK3ZlcnNpb24gMS4yLjIxYmV0YTEgW1NlcHRlbWJlciAxNCwgMjAwN10KKyAgRml4ZWQgdmFyaW91cyBtaXN0YWtlcyByZXBvcnRlZCBieSBHZW9yZ2UgQ29vayBhbmQgSmVmZiBQaGlsbGlwczoKKyAgbG9naWNhbCB2cyBiaXR3aXNlIE5PVCBpbiBwbmdydHJhbi5jLCBidWcgaW50cm9kdWNlZCBpbiAxLjIuMTlyYzIKKyAgMTYtYml0IGNoZWFwIHRyYW5zcGFyZW5jeSBleHBhbnNpb24sIGJ1ZyBpbnRyb2R1Y2VkIGluIDEuMi4xOWJldGEyCisgIGVycm9ycyB3aXRoIHNpemVvZih1bmtub3duX2NodW5rLm5hbWUpLCBidWdzIGludHJvZHVjZWQgaW4gMS4yLjE5YmV0YTExCisgIDw9IGNvbXBhcmUgd2l0aCB1bnNpZ25lZCB2YXIgaW4gcG5nc2V0LmMsIHNob3VsZCBiZSA9PS4KKwordmVyc2lvbiAxLjIuMjFiZXRhMiBbU2VwdGVtYmVyIDE4LCAyMDA3XQorICBSZW1vdmVkIHNvbWUgZXh0cmFuZW91cyB0eXBlY2FzdHMuCisKK3ZlcnNpb24gMS4yLjIxcmMxIFtTZXB0ZW1iZXIgMjUsIDIwMDddCisgIEZpeGVkIHBvdGVudGlhbCBvdXQtb2YtYm91bmRzIHJlYWRzIGluIHBuZ19oYW5kbGVfcENBTCgpIGFuZAorICAgIHBuZ19oYW5kbGVfenRYdCgpICgiZmxheWVyIiByZXN1bHRzIHJlcG9ydGVkIGJ5IFRhdmlzIE9ybWFuZHkpLgorCit2ZXJzaW9uIDEuMi4yMXJjMiBbU2VwdGVtYmVyIDI2LCAyMDA3XQorICBGaXhlZCBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyByZWFkcyBpbiBwbmdfaGFuZGxlX3NDQUwoKSwKKyAgICBwbmdfaGFuZGxlX2lUWHQoKSwgYW5kIHBuZ19wdXNoX3JlYWRfdEVYdCgpLgorICBSZW1vdmUgc29tZSBQTkdfQ09OU1QgZGVjbGFyYXRpb25zIGZyb20gcG5nd3V0aWwuYyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncworICBSZXZpc2VkIG1ha2VmaWxlcyB0byB1cGRhdGUgcGF0aHMgaW4gbGlicG5nLnBjIHByb3Blcmx5LgorCit2ZXJzaW9uIDEuMi4yMXJjMyBbU2VwdGVtYmVyIDI3LCAyMDA3XQorICBSZXZpc2VkIG1ha2VmaWxlcyB0byB1cGRhdGUgIkxpYnMiIGluIGxpYnBuZy5wYyBwcm9wZXJseS4KKwordmVyc2lvbiAxLjAuMjkgYW5kIDEuMi4yMXJjMyBbT2N0b2JlciA0LCAyMDA3XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMi4yMmJldGExIFtPY3RvYmVyIDQsIDIwMDddCisgIEFnYWluLCBmaXhlZCBsb2dpY2FsIHZzIGJpdHdpc2UgTk9UIGluIHBuZ3J0cmFuLmMsIGJ1ZyBpbnRyb2R1Y2VkCisgICAgaW4gMS4yLjE5cmMyCisKK3ZlcnNpb24gMS4yLjIyYmV0YTIgW09jdG9iZXIgNSwgMjAwN10KKyAgRml4ZWQgc3RyaW5nIGxlbmd0aCBlcnJvciBpbiBwbmdzZXQuYyAoY2F1c2VkIGNyYXNoZXMgd2hpbGUgZGVjb2RpbmcgaUNDUCkKKyAgQWRkIHRlcm1pbmF0aW5nIE5VTEwgYWZ0ZXIgZWFjaCBpbnN0YW5jZSBvZiBwbmdfc3RybmNweSgpLgorCit2ZXJzaW9uIDEuMi4yMmJldGEzIFtPY3RvYmVyIDYsIDIwMDddCisgIEZpeCB0d28gb2ZmLWJ5LW9uZSB0ZXJtaW5hdGluZyBOVUxMIGFmdGVyIHBuZ19zdHJuY3B5KCkuCisKK3ZlcnNpb24gMS4yLjIyYmV0YTQgW09jdG9iZXIgNywgMjAwN10KKyAgQ2hhbmdlZCBzb21lIDAgdG8gJ1wwJy4KKwordmVyc2lvbiAxLjAuMzByYzEgYW5kIDEuMi4yMnJjMSBbT2N0b2JlciA4LCAyMDA3XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMC4zMCBhbmQgMS4yLjIyIFtPY3RvYmVyIDEzLCAyMDA3XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMi4yM2JldGEwMSBbT2N0b2JlciAxNSwgMjAwN10KKyAgUmVkdWNlZCBudW1iZXIgb2YgaW52b2NhdGlvbnMgb2YgcG5nX3N0cmxlbigpIGluIHBuZ3NldC5jLgorICBDaGFuZ2VkIFthekFaMDlfXSB0byBbX2FiY2RlLi4uODldIGluIE1ha2VmaWxlLmFtIGZvciBiZXR0ZXIgbG9jYWxpemF0aW9uLgorCit2ZXJzaW9uIDEuMi4yM2JldGEwMiBbT2N0b2JlciAxNiwgMjAwN10KKyAgRWxpbWluYXRlZCBwbmdfc3RybmNweSgpIGFuZCBwbmdfc3RyY3B5KCkgKFBpZXJyZSBQb2lzc2luZ2VyKQorICBDaGFuZ2VkICRBTiB0byAkKEFOKSBpbiBNYWtlZmlsZS5hbS4KKwordmVyc2lvbiAxLjIuMjNiZXRhMDMgW09jdG9iZXIgMTYsIDIwMDddCisgIEZpeGVkIG9mZi1ieS1vbmUgZXJyb3IgaW4gcG5nc2V0LmMKKyAgUmVzdG9yZSBzdGF0ZW1lbnQgdG8gc2V0IGxhc3QgY2hhcmFjdGVyIG9mIGJ1ZmZlciB0byBcMCBpbiBwbmdlcnJvci5jCisKK3ZlcnNpb24gMS4yLjIzYmV0YTA0IFtPY3RvYmVyIDIzLCAyMDA3XQorICBSZWplY3QgYXR0ZW1wdCB0byBzZXQgYWxsLXplcm8gY0hSTSB2YWx1ZXMuCisKK3ZlcnNpb24gMS4yLjIzYmV0YTA1IFtPY3RvYmVyIDI2LCAyMDA3XQorICBBZGQgbWlzc2luZyBxdW90ZXMgaW4gcHJvamVjdHMvdmlzdWFsYzYsIGxvc3QgaW4gdmVyc2lvbiAxLjIuMjByYzMKKwordmVyc2lvbiAxLjIuMjNyYzAxIFtOb3ZlbWJlciAyLCAyMDA3XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMi4yMyBbTm92ZW1iZXIgNiwgMjAwN10KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjIuMjRiZXRhMDEgW05vdmVtYmVyIDE5LCAyMDA3XQorICBNb3ZlZCBtaXNwbGFjZWQgdGVzdCBmb3IgbWFsbG9jIGZhaWx1cmUgaW4gcG5nX3NldF9zUExUKCkuICBUaGlzIGJ1ZyB3YXMKKyAgICBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMjBiZXRhMDEuCisgIElmZGVmIG91dCBhdmdfcm93IGV0YyBmcm9tIHBuZy5oIGFuZCBwbmd3cml0ZS5jIHdoZW4gUE5HX05PX1dSSVRFX0ZJTFRFUgorICBEbyBub3QgdXNlIHBuZ19wdHItPmZyZWVfZm4gYW5kIHBuZ19wdHItPm1lbV9mbiBpbiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpCisgICAgd2hlbiBwbmdfcHRyIGlzIE5VTEwgKE1hcnNoYWxsIENsb3cpLgorICBVcGRhdGVkIGhhbmRsaW5nIG9mIHN5bWJvbCBwcmVmaXhlcyBpbiBNYWtlZmlsZS5hbSBhbmQgY29uZmlndXJlLmFjIChNaWtlCisgICAgRnJ5c2luZ2VyKS4KKwordmVyc2lvbiAxLjIuMjRiZXRhMDIgW05vdmVtYmVyIDMwLCAyMDA3XQorICBSZW1vdmVkIGEgdXNlbGVzcyB0ZXN0IGFuZCBmaXhlZCBpbmNvcnJlY3QgdGVzdCBpbiBwbmdfc2V0X2NIUk1fZml4ZWQoKQorICAgIChEYXZpZCBIaWxsKS4KKwordmVyc2lvbiAxLjIuMjRyYzAxIFtEZWNlbWJlciA3LCAyMDA3XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMi4yNCAgICAgW0RlY2VtYmVyIDE0LCAyMDA3XQorICBNYWtlIHN1cmUgbm90IHRvIHJlZGVmaW5lIF9CU0RfU09VUkNFIGluIHBuZ2NvbmYuaAorICBSZXZpc2VkIGdhdGhlci5zaCBhbmQgbWFrZWZpbGUuc3RkIGluIGNvbnRyaWIvcG5nbWluaW0gdG8gYXZvaWQgY29tcGlsaW5nCisgICAgdW51c2VkIGZpbGVzLgorCit2ZXJzaW9uIDEuMi4yNWJldGEwMSBbSmFudWFyeSA3LCAyMDA4XQorICBGaXhlZCBidWcgd2l0aCB1bmtub3duIGNodW5rIGhhbmRsaW5nLCBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4yLjE3cmMyCisKK3ZlcnNpb24gMS4yLjI1YmV0YTAyIFtKYW51YXJ5IDEwLCAyMDA4XQorICBQcmV2ZW50IGdhbW1hIGZyb20gYmVpbmcgYXBwbGllZCB0d2ljZS4KKwordmVyc2lvbiAxLjIuMjVyYzAxIFtKYW51YXJ5IDE3LCAyMDA4XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMi4yNWJldGEwMyBbSmFudWFyeSAyMiwgMjAwOF0KKyAgRml4ZWQgc29tZSBjb250aW51ZS1hZnRlci1tYWxsb2MtZmFpbHVyZSBlcnJvcnMgaW4gcG5nc2V0LmMgKERhdmlkIEhpbGwpCisgIENoZWNrIGZvciBpbmZvX3B0ciA9PSBOVUxMIGluIHBuZ19yZWFkX2luZm8oKSBhbmQgcG5nX3Byb2Nlc3NfZGF0YSgpLgorICBDaGVjayBmb3IgcG9zc2libGUgdXNlIG9mIE5VTEwgdXNlcl9wbmdfdmVyW10gaW4gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpLgorICBDaGFuZ2UgImlmIChzd2lkdGggPT0gTlVMTCkiIHRvICJpZiAoc2hlaWdodCA9PSBOVUxMKSIgaW4gcG5nX2hhbmRsZV9zQ0FMCisgICAgKGJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuNC8xLjAuMTMpLgorICBSZXR1cm4gZnJvbSBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpIGlmIHBuZ19wdHJfcHRyIGlzIE5VTEwuCisgIEZpeCBvdmVyZmxvdyBvZiAibXNnIiBpbiBwbmdfZGVjb21wcmVzc19jaHVuaygpLgorCit2ZXJzaW9uIDEuMi4yNWJldGEwNCBbSmFudWFyeSAyNiwgMjAwOF0KKyAgV29yayBhcm91bmQgQ292ZXJpdHkgYnVnIHJlcG9ydCBieSBzbGlnaHRseSByZWZhY3RvcmluZworICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdygpCisKK3ZlcnNpb24gMS4yLjI1YmV0YTA1IFtKYW51YXJ5IDMxLCAyMDA4XQorICBBZGRlZCBsaWJwbmctMS4yLjI1YmV0YTA1LnRhci5sem1hIHRvIGRpc3RyaWJ1dGlvbi4gIEdldCB0aGUgbHptYSBjb2RlYworICAgIGZyb20gPGh0dHA6Ly90dWthYW5pLm9yZy9sem1hPi4KKyAgQWRkZWQgbHAxMjI1YjA1Ljd6IHRvIGRpc3RyaWJ1dGlvbi4gIEdldCB0aGUgNy16aXAgZGVjb2RlciBmcm9tCisgICAgZnJvbSA8aHR0cDovL3d3dy43LXppcC5vcmc+LgorICBGaXhlZCBzb21lIGJyb2tlbiBsaW5rcyBpbiB0aGUgUkVBRE1FIGZpbGUuCisKK3ZlcnNpb24gMS4yLjI1YmV0YTA2IFtGZWJydWFyeSA2LCAyMDA4XQorICBSZWZhY3RvcmVkIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdygpIGFnYWluLCB0cnlpbmcgdG8gc2F0aXNmeSBDb3Zlcml0eS4KKyAgRml4ZWQgcG90ZW50aWFsIE5VTEwgZGVyZWZlcmVuY2Ugb2YgcG5nX3B0ciBpbiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKTsKKyAgY2xhcmlmaWVkIHBvdGVudGlhbCBOVUxMIGRlcmVmZXJlbmNlIG9mIHBuZ19wdHIgaW4gcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKTsKKyAgZml4ZWQgcG90ZW50aWFsIE5VTEwgZGVyZWZlcmVuY2Ugb2YgaW5mb19wdHIgaW4gcG5nX2hhbmRsZV9iS0dEKCk7CisgIGZpeGVkIHBvdGVudGlhbCBOVUxMIGRlcmVmZXJlbmNlIG9mIHVzZXJfcG5nX3ZlcltdIGluCisgICAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpLiAoQ292ZXJpdHkpCisKK3ZlcnNpb24gMS4yLjI1cmMwMiBbRmVicnVhcnkgMTAsIDIwMDhdCisgIFJlc2V0IHBuZ19wdHItPnBhc3MgaW4gcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KCkgYmVmb3JlIGJyZWFrLgorICBDaGFuZ2VkICJwYXNzIiBmcm9tIHBuZ19ieXRlIHRvIGludC4KKwordmVyc2lvbiAxLjIuMjUgYW5kIDEuMC4zMSBbRmVicnVhcnkgMTgsIDIwMDhdCisgIE5vIGNoYW5nZXMuCisKK3ZlcnNpb24gMS4yLjI2YmV0YTAxIFtGZWJydWFyeSAyMSwgMjAwOF0KKyAgQWRkZWQgbWlzc2luZyAiKCIgaW4gcG5nbWVtLmMuICBCdWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjIvMS4wLjEzCisKK3ZlcnNpb24gMS4yLjI2YmV0YTAyIFtNYXJjaCAxMiwgMjAwOF0KKyAgUmVmaW5lZCBlcnJvciBtZXNzYWdlIHJldHVybmVkIGZyb20gZGVmbGF0ZUluaXQyIGluIHBuZ3d1dGlsLmMKKyAgQ2hlY2sgSUhEUiBsZW5ndGggaW4gcG5nX3B1c2hfcmVhZF9jaHVuaygpIGJlZm9yZSBzYXZpbmcgaXQuCisKK3ZlcnNpb24gMS4yLjI2YmV0YTAzIFtNYXJjaCAxNiwgMjAwOF0KKyAgUmV2aXNlZCBjb250cmliL2dyZWdib29rIHRvIGhhbmRsZSBwcmVtYXR1cmUgZW5kLW9mLWZpbGUgYW5kIGZpbGUKKyAgICByZWFkIGVycm9ycyBjb3JyZWN0bHkuCisKK3ZlcnNpb24gMS4yLjI2YmV0YTA0IFtNYXJjaCAxOCwgMjAwOF0KKyAgRnJlZSBwbmdfcHRyLT5iaWdfcm93X2J1ZiBhbmQgcG5nX3B0ci0+cHJldl9yb3cgYmVmb3JlIGFsbG9jYXRpbmcKKyAgICBuZXcgY29waWVzIGluIHBuZ19yZWFkX3N0YXJ0X3JvdygpLiAgQnVnIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi4yMi4KKwordmVyc2lvbiAxLjIuMjZiZXRhMDUgW01hcmNoIDE5LCAyMDA4XQorICBSZW1vdmVkIGV4dHJhIHBuZ19mcmVlKCkgYWRkZWQgaW4gbGlicG5nLTEuMi4yNmJldGEwNC4KKwordmVyc2lvbiAxLjIuMjZiZXRhMDYgW01hcmNoIDE5LCAyMDA4XQorICBBdm9pZCByZWFsbG9jYXRpbmcgYmlnX3Jvd19idWYgYW5kIHByZXZfcm93IHdoZW4gdGhlIHNpemUgZG9lcyBub3QgaW5jcmVhc2UuCisKK3ZlcnNpb24gMS4yLjI2cmMwMSBbTWFyY2ggMjYsIDIwMDhdCisgIElmZGVmIG91dCBzb21lIGNvZGUgdGhhdCBpcyB1bnVzZWQgd2hlbiBpbnRlcmxhY2luZyBpcyBub3Qgc3VwcG9ydGVkLgorCit2ZXJzaW9ucyAxLjAuMzIgYW5kIDEuMi4yNiBbQXByaWwgMiwgMjAwOF0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjIuMjdiZXRhMDEgW0FwcmlsIDEyLCAyMDA4XQorICBGaXhlZCBidWcgKGludHJvZHVjZWQgaW4gbGlicG5nLTEuMC41aCkgd2l0aCBoYW5kbGluZyB6ZXJvLWxlbmd0aAorICAgIHVua25vd24gY2h1bmtzLgorICBBZGRlZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpIHRvIHRoZQorICAgIGRvY3VtZW50YXRpb24uCisgIFJlamVjdCB0Uk5TIGNodW5rIHdpdGggb3V0LW9mLXJhbmdlIHNhbXBsZXMgaW5zdGVhZCBvZiBtYXNraW5nIG9mZgorICAgIHRoZSBpbnZhbGlkIGhpZ2ggYml0cyBhcyBkb25lIGluIHNpbmNlIGxpYnBuZy0xLjIuMTliZXRhNS4KKwordmVyc2lvbiAxLjIuMjdiZXRhMDIgW0FwcmlsIDEzLCAyMDA4XQorICBSZXZpc2VkIGRvY3VtZW50YXRpb24gYWJvdXQgdW5rbm93biBjaHVuayBhbmQgdXNlciBjaHVuayBoYW5kbGluZy4KKyAgS2VlcCB0Uk5TIGNodW5rIHdpdGggb3V0LW9mLXJhbmdlIHNhbXBsZXMgYW5kIGlzc3VlIGEgcG5nX3dhcm5pbmcoKS4KKwordmVyc2lvbiAxLjIuMjdiZXRhMDMgW0FwcmlsIDE0LCAyMDA4XQorICBBZGRlZCBjaGVjayBmb3IgTlVMTCBwdHIgaW4gVFVSQk9DIHZlcnNpb24gb2YgcG5nX2ZyZWVfZGVmYXVsdCgpLgorICBSZW1vdmVkIHNldmVyYWwgdW5uZWNlc3NhcnkgY2hlY2tzIGZvciBOVUxMIGJlZm9yZSBjYWxsaW5nIHBuZ19mcmVlKCkuCisgIFJldmlzZWQgcG5nX3NldF90Uk5TKCkgc28gdGhhdCBjYWxsaW5nIGl0IHR3aWNlIHJlbW92ZXMgYW5kIGludmFsaWRhdGVzCisgICAgdGhlIHByZXZpb3VzIGNhbGwuCisgIFJldmlzZWQgcG5ndGVzdCB0byBjaGVjayBmb3Igb3V0LW9mLXJhbmdlIHRSTlMgc2FtcGxlcy4KKwordmVyc2lvbiAxLjIuMjdiZXRhMDQgW0FwcmlsIDE4LCAyMDA4XQorICBBZGRlZCBBQ19MSUJUT09MX1dJTjMyX0RMTCB0byBjb25maWd1cmUuYWMKKyAgUmVidWlsdCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCwgYW5kIGNvbmZpZ3VyZSB3aXRoIGF1dG9jb25mLTIuNjIKKwordmVyc2lvbiAxLjIuMjdiZXRhMDUgW0FwcmlsIDE5LCAyMDA4XQorICBBZGRlZCBNQUlOVEFJTkVSQ0xFQU5GSUxFUyB2YXJpYWJsZSB0byBNYWtlZmlsZS5hbQorCit2ZXJzaW9uIDEuMi4yN2JldGEwNiBbQXByaWwgMjEsIDIwMDhdCisgIEF2b2lkIGNoYW5naW5nIGNvbG9yX3R5cGUgZnJvbSBHUkFZIHRvIFJHQiBieQorICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpLgorCit2ZXJzaW9uIDEuMi4yN3JjMDEgW0FwcmlsIDIzLCAyMDA4XQorICBGaXggYnJva2VuIFVSTCBmb3IgcmZjMjA4MyBpbiBwbmcuNSBhbmQgbGlicG5nLSoudHh0CisKK3ZlcnNpb24gMS4wLjMzIGFuZCAxLjIuMjcgW0FwcmlsIDMwLCAyMDA4XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMC4zNCBhbmQgMS4yLjI4IFtBcHJpbCAzMCwgMjAwOF0KKyAgUmVidWlsdCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCwgYW5kIGNvbmZpZ3VyZSB3aXRoIGF1dG9jb25mLTIuNjEKKyAgICBkdWUgdG8gYmFja3dhcmQgaW5jb21wYXRpYmlsaXRpZXMuCisgIFJlbW92ZWQgYSBzdHJheSBvYmplY3QgZmlsZSBmcm9tIGNvbnRyaWIvZ3JlZ2Jvb2sKKwordmVyc2lvbiAxLjIuMjliZXRhMDEgW01heSAxLCAyMDA4XQorICBSZW1vdmVkIHNvbWUgc3RyYXkgKi5kaWZmIGFuZCAqLm9yaWcgZmlsZXMKKwordmVyc2lvbiAxLjIuMjliZXRhMDIgW01heSAxLCAyMDA4XQorICBSZXZlcnRlZCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCwgYW5kIGNvbmZpZ3VyZSB0byB0aGUgbGlicG5nLTEuMi4yNgorICAgIHZlcnNpb25zLgorCit2ZXJzaW9uIDEuMi4yOWJldGEwMyBbTWF5IDIsIDIwMDhdCisgIEFkZGVkIC0tZm9yY2UgdG8gYXV0b2dlbiBsaWJ0b29saXplIG9wdGlvbnMgYW5kIC0tZm9yY2UtbWlzc2luZyB0bworICAgIGF1dG9tYWtlIG9wdGlvbnMuCisgIENoYW5nZWQgJChFQ0hPKSB0byBlY2hvIGluIE1ha2VmaWxlLmFtIGFuZCBNYWtlZmlsZS5pbgorICBVcGRhdGVkIGFsbCBjb25maWd1cmUgZmlsZXMgdG8gYXV0b2NvbmYtMi42MgorICBDb21tZW50IG91dCBwbmdnY3JkLmMgY29kZSB3aXRoICNpZmRlZi8jZW5kaWYgaWYgdXNpbmcgTVNDX1ZFUgorCit2ZXJzaW9uIDEuMi4yOXJjMDEgW01heSA0LCAyMDA4XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMC4zNSBhbmQgMS4yLjI5IFtNYXkgOCwgMjAwOF0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjAuMzcgW01heSA5LCAyMDA4XQorICBVcGRhdGVkIE1ha2VmaWxlLmluIGFuZCBjb25maWd1cmUgKG9taXR0ZWQgdmVyc2lvbiAxLjAuMzYpLgorCit2ZXJzaW9uIDEuMi4zMGJldGEwMSBbTWF5IDI5LCAyMDA4XQorICBVcGRhdGVkIGxpYnBuZy5wYy1jb25maWd1cmUuaW4gYW5kIGxpYnBuZy1jb25maWcuaW4gcGVyIGRlYmlhbiBidWcgcmVwb3J0cy4KKwordmVyc2lvbiAxLjIuMzBiZXRhMDIgW0p1bmUgMjUsIDIwMDhdCisgIFJlc3RvcmVkIHBuZ19mbHVzaChwbmdfcHRyKSBhdCB0aGUgZW5kIG9mIHBuZ193cml0ZV9lbmQoKSwgdGhhdCB3YXMKKyAgICByZW1vdmVkIGZyb20gbGlicG5nLTEuMC45YmV0YTAzLgorCit2ZXJzaW9uIDEuMi4zMGJldGEwMyBbSnVseSA2LCAyMDA4XQorICBNZXJnZWQgc29tZSBjb3NtZXRpYyB3aGl0ZXNwYWNlIGNoYW5nZXMgZnJvbSBsaWJwbmctMS40LjBiZXRhMTkuCisgIElubGluZSBjYWxsIG9mIHBuZ19nZXRfdWludF8zMigpIGluIHBuZ19nZXRfdWludF8zMSgpLCBhcyBpbiAxLjQuMGJldGExOS4KKyAgQWRkZWQgZGVtbyBvZiBkZWNvZGluZyB2cEFnIGFuZCBzVEVSIGNodW5rcyB0byBwbmd0ZXN0LmMsIGZyb20gMS40LjBiZXRhMTkuCisgIENoYW5nZWQgUE5HTUFKIGZyb20gMCB0byAxMiBpbiBtYWtlZmlsZS5kYXJ3aW4sIHdoaWNoIGRvZXMgbm90IGxpa2UgMC4KKyAgQWRkZWQgbmV3IHByaXZhdGUgZnVuY3Rpb24gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKCkgZnJvbSAxLjQuMGJldGExOS4KKyAgTWVyZ2UgcmVhZGluZyBvZiBjaHVuayBsZW5ndGggYW5kIGNodW5rIHR5cGUgaW50byBhIHNpbmdsZSA4LWJ5dGUgcmVhZC4KKyAgTWVyZ2Ugd3JpdGluZyBvZiBjaHVuayBsZW5ndGggYW5kIGNodW5rIHR5cGUgaW50byBhIHNpbmdsZSA4LWJ5dGUgd3JpdGUuCisKK3ZlcnNpb24gMS4yLjMwYmV0YTA0IFtKdWx5IDEwLCAyMDA4XQorICBNZXJnZWQgbW9yZSBjb3NtZXRpYyB3aGl0ZXNwYWNlIGNoYW5nZXMgZnJvbSBsaWJwbmctMS40LjBiZXRhMTkuCisKK3ZlcnNpb24gMS4wLjM4cmMwMSwgMS4yLjMwcmMwMSBbSnVseSAxOCwgMjAwOF0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjAuMzhyYzAyLCAxLjIuMzByYzAyIFtKdWx5IDIxLCAyMDA4XQorICBNb3ZlZCBsb2NhbCBhcnJheSAiY2h1bmtkYXRhIiBmcm9tIHBuZ3J1dGlsLmMgdG8gdGhlIHBuZ19zdHJ1Y3QsIHNvCisgICAgaXQgd2lsbCBiZSBmcmVlZCBieSBwbmdfcmVhZF9kZXN0cm95KCkgaW4gY2FzZSBvZiBhIHJlYWQgZXJyb3IgKEt1cnQKKyAgICBDaHJpc3RlbnNlbikuCisKK3ZlcnNpb24gMS4wLjM4cmMwMywgMS4yLjMwcmMwMyBbSnVseSAyMSwgMjAwOF0KKyAgQ2hhbmdlZCAicHVycG9zZSIgYW5kICJidWZmZXIiIHRvIHBuZ19wdHItPmNodW5rZGF0YSB0byBhdm9pZCBtZW1vcnkgbGVha2luZy4KKwordmVyc2lvbiAxLjAuMzhyYzA0LCAxLjIuMzByYzA0IFtKdWx5IDIyLCAyMDA4XQorICBDaGFuZ2VkICJjaHVua2RhdGEgPSBOVUxMIiB0byAicG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTCIgc2V2ZXJhbCBwbGFjZXMgaW4KKyAgICBwbmdfZGVjb21wcmVzc19jaHVuaygpLgorCit2ZXJzaW9uIDEuMC4zOHJjMDUsIDEuMi4zMHJjMDUgW0p1bHkgMjUsIDIwMDhdCisgIENoYW5nZWQgYWxsIHJlbWFpbmluZyAiY2h1bmtkYXRhIiB0byAicG5nX3B0ci0+Y2h1bmtkYXRhIiBpbgorICAgIHBuZ19kZWNvbXByZXNzX2NodW5rKCkgYW5kIHJlbW92ZSBjaHVua2RhdGEgZnJvbSBwYXJhbWV0ZXIgbGlzdC4KKyAgUHV0IGEgY2FsbCB0byBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIGluIHBuZ19yZWFkX2NodW5rX2hlYWRlcigpLgorICBSZXZpc2VkIHBuZ19jaGVja19jaHVua19uYW1lKCkgdG8gcmVqZWN0IGEgbmFtZSB3aXRoIGEgbG93ZXJjYXNlIDNyZCBieXRlLgorICBSZW1vdmVkIHR3byBjYWxscyB0byBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIG9jY3VyaW5nIGxhdGVyIGluIHRoZSBwcm9jZXNzLgorCit2ZXJzaW9uIDEuMC4zOHJjMDYsIDEuMi4zMHJjMDYgW0p1bHkgMjksIDIwMDhdCisgIEFkZGVkIGEgY2FsbCB0byBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIGluIHBuZ3ByZWFkLmMKKyAgUmV2ZXJ0ZWQgcG5nX2NoZWNrX2NodW5rX25hbWUoKSB0byBhY2NlcHQgYSBuYW1lIHdpdGggYSBsb3dlcmNhc2UgM3JkIGJ5dGUuCisKK3ZlcnNpb24gMS4wLjM4cjA3LCAxLjIuMzByMDcgW0F1Z3VzdCAyLCAyMDA4XQorICBDaGFuZ2VkICItV2FsbCIgdG8gIi1XIC1XYWxsIiBpbiB0aGUgQ0ZMQUdTIGluIGFsbCBtYWtlZmlsZXMgKENvc21pbiBUcnV0YSkKKyAgRGVjbGFyZWQgcG5nX3B0ciAidm9sYXRpbGUiIGluIHBuZ3JlYWQuYyBhbmQgcG5nd3JpdGUuYyB0byBhdm9pZCB3YXJuaW5ncy4KKyAgQWRkZWQgY29kZSBpbiBwbmdzZXQuYyB0byBxdWlldCBjb21waWxlciB3YXJuaW5ncy4KKyAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIHRvIHZlcnNpb24gMi4wLjEKKyAgUmVsb2NhdGVkIGEgbWlzcGxhY2VkICIjZW5kaWYgLyogUE5HX05PX1dSSVRFX0ZJTFRFUiAqLyIgaW4gcG5nd3V0aWwuYworCit2ZXJzaW9uIDEuMC4zOHIwOCwgMS4yLjMwcjA4IFtBdWd1c3QgMiwgMjAwOF0KKyAgRW5jbG9zZSAidm9sYXRpbGUiIGRlY2xhcmF0aW9ucyBpbiAjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQgKENvc21pbikuCisKK3ZlcnNpb24gMS4wLjM4LCAxLjIuMzAgW0F1Z3VzdCAxNCwgMjAwOF0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjIuMzFyYzAxIFtBdWd1c3QgMTksIDIwMDhdCisgIFJlbW92ZWQgZXh0cmEgY3JjIGNoZWNrIGF0IHRoZSBlbmQgb2YgcG5nX2hhbmRsZV9jSFJNKCkuICBCdWcgaW50cm9kdWNlZAorICAgIGluIGxpYnBuZy0xLjIuMzBiZXRhMDMgKEhlaWtvIE5pdHpzY2hlKS4KKwordmVyc2lvbiAxLjIuMzFyYzAyIFtBdWd1c3QgMTksIDIwMDhdCisgIEFkZGVkIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgYmxvY2sgYXJvdW5kIG5ldyBwbmdfZmx1c2goKSBjYWxsLgorCit2ZXJzaW9uIDEuMi4zMXJjMDMgW0F1Z3VzdCAxOSwgMjAwOF0KKyAgQWRkZWQgUE5HX1dSSVRFX0ZMVVNIX0FGVEVSX0lFTkRfU1VQUE9SVEVEIGJsb2NrLCBvZmYgYnkgZGVmYXVsdCwgYXJvdW5kCisgICAgbmV3IHBuZ19mbHVzaCgpLgorCit2ZXJzaW9uIDEuMC4zOSwgMS4yLjMxIFtBdWd1c3QgMjEsIDIwMDhdCisgIE5vIGNoYW5nZXMuCisKK3ZlcnNpb24gMS4yLjMyYmV0YTAxIFtTZXB0ZW1iZXIgNiwgMjAwOF0KKyAgU2hvcnRlbmVkIHRJTUVfc3RyaW5nIHRvIDI5IGJ5dGVzIGluIHBuZ3Rlc3QuYyAoYnVnIGludHJvZHVjZWQgaW4KKyAgICBsaWJwbmctMS4yLjIyKS4KKyAgRml4ZWQgb2ZmLWJ5LW9uZSBlcnJvciBpbnRyb2R1Y2VkIGluIHBuZ19wdXNoX3JlYWRfelRYdCgpIGZ1bmN0aW9uIGluCisgICAgbGlicG5nLTEuMi4zMGJldGEwNC9wbmdwcmVhZC5jIChIYXJhbGQgdmFuIERpamspCisgIFRoZXNlIGJ1Z3MgaGF2ZSBiZWVuIGdpdmVuIHRoZSB2dWxuZXJhYmlsaXR5IGlkIENWRS0yMDA4LTM5NjQuCisKK3ZlcnNpb24gMS4wLjQwLCAxLjIuMzIgW1NlcHRlbWJlciAxOCwgMjAwOF0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjIuMzNiZXRhMDEgW09jdG9iZXIgNiwgMjAwOF0KKyAgUmV2aXNlZCBtYWtlZmlsZS5kYXJ3aW4gdG8gZml4IHNoYXJlZCBsaWJyYXJ5IG51bWJlcmluZy4KKyAgQ2hhbmdlIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkgdG8gcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkKKyAgICBpbiBleGFtcGxlLmMgKGRlYmlhbiBidWcgcmVwb3J0KQorCit2ZXJzaW9uIDEuMi4zM3JjMDEgW09jdG9iZXIgMTUsIDIwMDhdCisgIE5vIGNoYW5nZXMuCisKK3ZlcnNpb24gMS4wLjQxcmMwMSwgdmVyc2lvbiAxLjIuMzNyYzAyIFtPY3RvYmVyIDIzLCAyMDA4XQorICBDaGFuZ2VkIHJlbWFpbmluZyAia2V5IiB0byAicG5nX3B0ci0+Y2h1bmtkYXRhIiBpbiBwbmdfaGFuZGxlX3RFWHQoKQorICAgIHRvIGF2b2lkIG1lbW9yeSBsZWFrIGFmdGVyIG1lbW9yeSBmYWlsdXJlIHdoaWxlIHJlYWRpbmcgdEVYdCBjaHVuay5gCisKK3ZlcnNpb24gMS4yLjMzIFtPY3RvYmVyIDMxLCAyMDA4XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMi4zNGJldGEwMSBbTm92ZW1iZXIgMjcsIDIwMDhdCisgIFJldmlzZWQgcG5nX3dhcm5pbmcoKSB0byB3cml0ZSBpdHMgbWVzc2FnZSBvbiBzdGFuZGFyZCBvdXRwdXQgYnkgZGVmYXVsdAorICAgIHdoZW4gd2FybmluZ19mbiBpcyBOVUxMLiBUaGlzIHdhcyB0aGUgYmVoYXZpb3IgcHJpb3IgdG8gbGlicG5nLTEuMi45YmV0YTkuCisgIEZpeGVkIHN0cmluZyB2cyBwb2ludGVyLXRvLXN0cmluZyBlcnJvciBpbiBwbmdfY2hlY2tfa2V5d29yZCgpLgorICBBZGRlZCBwbmdfY2hlY2tfY0hSTV9maXhlZCgpIGluIHBuZy5jIGFuZCBtb3ZlZCBjaGVja2luZyBmcm9tIHBuZ2dldC5jLAorICAgIHBuZ3J1dGlsLmMsIGFuZCBwbmd3cml0ZS5jLCBhbmQgZWxpbWluYXRlZCBmbG9hdGluZyBwb2ludCBjSFJNIGNoZWNraW5nLgorICBBZGRlZCBjaGVjayBmb3IgemVyby1hcmVhIFJHQiBjSFJNIHRyaWFuZ2xlIGluIHBuZ19jaGVja19jSFJNX2ZpeGVkKCkuCisgIEluIHBuZ19jaGVja19jSFJNX2ZpeGVkKCksIGVuc3VyZSB3aGl0ZV95IGlzID4gMCwgYW5kIHJlbW92ZWQgcmVkdW5kYW50CisgICAgY2hlY2sgZm9yIGFsbC16ZXJvIGNvb3JkaW5hdGVzIHRoYXQgaXMgZGV0ZWN0ZWQgYnkgdGhlIHRyaWFuZ2xlIGNoZWNrLgorICBSZXZpc2VkIHBuZ193YXJuaW5nKCkgdG8gd3JpdGUgaXRzIG1lc3NhZ2Ugb24gc3RhbmRhcmQgb3V0cHV0IGJ5IGRlZmF1bHQKKyAgICB3aGVuIHdhcm5pbmdfZm4gaXMgTlVMTC4KKwordmVyc2lvbiAxLjIuMzRiZXRhMDIgW05vdmVtYmVyIDI4LCAyMDA4XQorICBDb3JyZWN0ZWQgb2ZmLWJ5LW9uZSBlcnJvciBpbiBiS0dEIHZhbGlkaXR5IGNoZWNrIGluIHBuZ193cml0ZV9iS0dEKCkKKyAgICBhbmQgaW4gcG5nX2hhbmRsZV9iS0dEKCkuCisKK3ZlcnNpb24gMS4yLjM0YmV0YTAzIFtEZWNlbWJlciAxLCAyMDA4XQorICBSZXZpc2VkIGJLR0QgdmFsaWRpdHkgY2hlY2sgdG8gdXNlID49IHggaW5zdGVhZCBvZiA+IHggKyAxCisgIE1lcmdlZCB3aXRoIHBuZ19kZWJ1ZyBmcm9tIGxpYnBuZy0xLjQuMCB0byByZW1vdmUgbmV3bGluZXMuCisKK3ZlcnNpb24gMS4yLjM0YmV0YTA0IFtEZWNlbWJlciAyLCAyMDA4XQorICBNb3JlIG1lcmdpbmcgd2l0aCBwbmdfZGVidWcgZnJvbSBsaWJwbmctMS40LjAgdG8gcmVtb3ZlIG5ld2xpbmVzLgorCit2ZXJzaW9uIDEuMi4zNGJldGEwNSBbRGVjZW1iZXIgNSwgMjAwOF0KKyAgUmVtb3ZlZCByZWR1bmRhbnQgY2hlY2sgZm9yIGtleT09TlVMTCBiZWZvcmUgY2FsbGluZyBwbmdfY2hlY2tfa2V5d29yZCgpCisgICAgdG8gZW5zdXJlIHRoYXQgbmV3X2tleSBnZXRzIGluaXRpYWxpemVkIGFuZCByZW1vdmVkIGV4dHJhIHdhcm5pbmcKKyAgICAoQXJ2YW4gUHJpdGNoYXJkKS4KKwordmVyc2lvbiAxLjIuMzRiZXRhMDYgW0RlY2VtYmVyIDksIDIwMDhdCisgIEluIHBuZ193cml0ZV9wbmcoKSwgcmVzcGVjdCB0aGUgcGxhY2VtZW50IG9mIHRoZSBmaWxsZXIgYnl0ZXMgaW4gYW4gZWFybGllcgorICAgIGNhbGwgdG8gcG5nX3NldF9maWxsZXIoKSAoSmltIEJhcnJ5KS4KKwordmVyc2lvbiAxLjIuMzRiZXRhMDcgW0RlY2VtYmVyIDksIDIwMDhdCisgIFVuZGlkIHByZXZpb3VzIGNoYW5nZSBhbmQgYWRkZWQgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIGFuZAorICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSIGNvbmRpdGlvbmFscyBhbmQgZGVwcmVjYXRlZAorICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSIChKaW0gQmFycnkpLgorCit2ZXJzaW9uIDEuMC40MnJjMDEsIDEuMi4zNHJjMDEgW0RlY2VtYmVyIDExLCAyMDA4XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMC40MiwgMS4yLjM0IFtEZWNlbWJlciAxOCwgMjAwOF0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjIuMzViZXRhMDEgW0ZlYnJ1YXJ5IDQsIDIwMDldCisgIFplcm8gb3V0IHNvbWUgYXJyYXlzIG9mIHBvaW50ZXJzIGFmdGVyIHBuZ19tYWxsb2MoKS4gKFRhdmlzIE9ybWFuZHkpCisKK3ZlcnNpb24gMS4yLjM1YmV0YTAyIFtGZWJydWFyeSA0LCAyMDA5XQorICBaZXJvIG91dCBtb3JlIGFycmF5cyBvZiBwb2ludGVycyBhZnRlciBwbmdfbWFsbG9jKCkuCisKK3ZlcnNpb24gMS4yLjM1YmV0YTAzIFtGZWJydWFyeSA1LCAyMDA5XQorICBVc2UgcG5nX21lbXNldCgpIGluc3RlYWQgb2YgYSBsb29wIHRvIGludGlhbGl6ZSBwb2ludGVycy4gIFdlIHJlYWxpemUKKyAgICB0aGlzIHdpbGwgbm90IHdvcmsgb24gcGxhdGZvcm1zIHdoZXJlIHRoZSBOVUxMIHBvaW50ZXIgaXMgbm90IGFsbCB6ZXJvZXMuCisKK3ZlcnNpb24gMS4yLjM1cmMwMSBbRmVicnVhcnkgMTEsIDIwMDldCisgIE5vIGNoYW5nZXMuCisKK3ZlcnNpb24gMS4yLjM1cmMwMiBbRmVicnVhcnkgMTIsIDIwMDldCisgIEZpeCB0eXBvIGluIG5ldyBwbmdfbWVtc2V0IGNhbGwgaW4gcG5nc2V0LmMgKHBuZ19jb2xvciBzaG91bGQgYmUgcG5nX2NoYXJwKQorCit2ZXJzaW9uIDEuMC40MyBhbmQgMS4yLjM1IFtGZWJydWFyeSAxNCwgMjAwOV0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjIuMzZiZXRhMDEgW0ZlYnJ1YXJ5IDI4LCAyMDA5XQorICBSZXZpc2VkIGNvbW1lbnRzIGluIHBuZ19zZXRfcmVhZF9mbigpIGFuZCBwbmdfc2V0X3dyaXRlX2ZuKCkuCisgIFJldmlzZWQgb3JkZXIgb2YgI2lmZGVmJ3MgYW5kIGluZGVudGF0aW9uIGluIHBuZ19kZWJ1ZyBkZWZpbml0aW9ucyBvZiBwbmcuaAorICAgIGJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMzQuCisKK3ZlcnNpb24gMS4yLjM2YmV0YTAyIFtNYXJjaCAyMSwgMjAwOV0KKyAgVXNlIHBuZ19tZW1zZXQoKSBhZnRlciBwbmdfbWFsbG9jKCkgb2YgYmlnX3Jvd19idWYgd2hlbiByZWFkaW5nIGFuCisgICAgaW50ZXJsYWNlZCBmaWxlLCB0byBhdm9pZCBhIHBvc3NpYmxlIFVNUi4KKyAgVW5kaWQgcmVjZW50IHJldmlzaW9uIG9mIFBOR19OT19TVERJTyB2ZXJzaW9uIG9mIHBuZ193cml0ZV9mbHVzaCgpLiAgVXNlcnMKKyAgICBoYXZpbmcgdHJvdWJsZSB3aXRoIGZmbHVzaCgpIGNhbiBidWlsZCB3aXRoIFBOR19OT19XUklURV9GTFVTSCBkZWZpbmVkLgorICBSZXZpc2VkIGxpYnBuZyoudHh0IGRvY3VtZW50YXRpb24gYWJvdXQgdXNlIG9mIHBuZ193cml0ZV9mbHVzaCgpLgorICBSZW1vdmVkIGZmbHVzaCgpIGZyb20gcG5ndGVzdC5jLgorICBBZGRlZCAiI2RlZmluZSBQTkdfTk9fV1JJVEVfRkxVU0giIHRvIGNvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaAorCit2ZXJzaW9uIDEuMi4zNmJldGEwMyBbTWFyY2ggMjcsIDIwMDldCisgIFJlbG9jYXRlZCBtaXNwbGFjZWQgUE5HXzFfMF9YIGRlZmluZSBpbiBwbmcuaCB0aGF0IGNhdXNlZCB0aGUgcHJvdG90eXBlCisgICAgZm9yIHBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycygpIHRvIGJlIG9taXR0ZWQgZnJvbSBQTkdfTk9fQVNTRU1CTEVSX0NPREUKKyAgICBidWlsZHMuICBUaGlzIGJ1ZyB3YXMgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjE1YmV0YTQuCisgIEFkZGVkIGEgc2VjdGlvbiBvbiBkaWZmZXJlbmNlcyBiZXR3ZWVuIDEuMC54IGFuZCAxLjIueCB0byBsaWJwbmcuMy9saWJwbmcudHh0CisKK3ZlcnNpb24gMS4yLjM2YmV0YTA0IFtBcHJpbCA1LCAyMDA5XQorICBGaXhlZCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgb2YgIm5ld19uYW1lIiBpbiBwbmdfd3JpdGVfaUNDUCgpIChSYWxwaCBHaWxlcykKKwordmVyc2lvbiAxLjIuMzZiZXRhMDUgW0FwcmlsIDI0LCAyMDA5XQorICBBZGRlZCAiaWZuZGVmIFBOR19TS0lQX1NFVEpNUF9DSEVDSyIgYmxvY2sgaW4gcG5nY29uZi5oIHRvIGFsbG93CisgICAgYXBwbGljYXRpb24gY29kZSB3cml0ZXJzIHRvIGJ5cGFzcyB0aGUgY2hlY2sgZm9yIG11bHRpcGxlIGluY2x1c2lvbgorICAgIG9mIHNldGptcC5oIHdoZW4gdGhleSBrbm93IHRoYXQgaXQgaXMgc2FmZSB0byBpZ25vcmUgdGhlIHNpdHVhdGlvbi4KKyAgTWFkZSBzb21lIGNvc21ldGljIGNoYW5nZXMgdG8gd2hpdGVzcGFjZSBpbiBwbmd0ZXN0IG91dHB1dC4KKyAgUmVuYW1lZCAidXNlcl9jaHVua19kYXRhIiB0byAibXlfdXNlcl9jaHVua19kYXRhIiBpbiBwbmd0ZXN0LmMgdG8gc3VwcHJlc3MKKyAgICAic2hhZG93ZWQgZGVjbGFyYXRpb24iIHdhcm5pbmcgZnJvbSBnY2MtNC4zLjMuCisgIFJlbmFtZWQgImdhbW1hIiB0byAicG5nX2dhbW1hIiBpbiBwbmdzZXQuYyB0byBhdm9pZCAic2hhZG93ZWQgZGVjbGFyYXRpb24iCisgICAgd2FybmluZyBhYm91dCBhIGdsb2JhbCAiZ2FtbWEiIHZhcmlhYmxlIGluIG1hdGguaCBvbiBzb21lIHBsYXRmb3Jtcy4KKwordmVyc2lvbiAxLjIuMzZyYzAxIFtBcHJpbCAzMCwgMjAwOV0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjAuNDQgYW5kIDEuMi4zNiBbTWF5IDcsIDIwMDldCisgIE5vIGNoYW5nZXMuCisKK3ZlcnNpb24gMS4yLjM3YmV0YTAxIFtNYXkgMTQsIDIwMDldCisgIEZpeGVkIGluY29uc2lzdGVuY3kgaW4gcG5ncnV0aWwuYywgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjM2LiAgVGhlCisgICAgbWVtc2V0KCkgd2FzIHVzaW5nICJwbmdfcHRyLT5yb3dieXRlcyIgaW5zdGVhZCBvZiAicm93X2J5dGVzIiwgd2hpY2gKKyAgICB0aGUgY29ycmVzcG9uZGluZyBwbmdfbWFsbG9jKCkgdXNlcyAoSm9lIERyZXcpLgorICBDbGFyaWZpZWQgdXNhZ2Ugb2Ygc2lnX2JpdCB2ZXJzdXMgc2lnX2JpdF9wIGluIGV4YW1wbGUuYyAoVmluY2VudCBUb3JyaSkKKyAgVXBkYXRlZCBzb21lIG9mIHRoZSBtYWtlZmlsZXMgaW4gdGhlIHNjcmlwdHMgZGlyZWN0b3J5IChtZXJnZWQgd2l0aAorICAgIHRob3NlIGluIGxpYnBuZy0xLjQuMGJldGE1NykuCisKK3ZlcnNpb24gMS4yLjM3YmV0YTAyIFtNYXkgMTksIDIwMDldCisgIEZpeGVkIHR5cG8gaW4gbGlicG5nIGRvY3VtZW50YXRpb24gKEZJTFRFUl9BVkUgc2hvdWxkIGJlIEZJTFRFUl9BVkcpCisgIFJlbG9jYXRlZCBtaXNwbGFjZWQgI2VuZGlmIGluIHBuZ3dyaXRlLmMsIHNDQUwgY2h1bmsgaGFuZGxlci4KKyAgQ29uZGl0aW9uYWxseSBjb21waWxlIHBuZ19yZWFkX2ZpbmlzaF9yb3coKSB3aGljaCBpcyBub3QgdXNlZCBieQorICAgIHByb2dyZXNzaXZlIHJlYWRlcnMuCisgIEFkZGVkIGNvbnRyaWIvcG5nbWluaW0vcHJlYWRlciB0byBkZW1vbnN0cmF0ZSBidWlsZGluZyBtaW5pbWFsIHByb2dyZXNzaXZlCisgICAgZGVjb2RlciwgYmFzZWQgb24gY29udHJpYi9ncmVnYm9vayB3aXRoIGVtYmVkZGVkIGxpYnBuZyBhbmQgemxpYi4KKwordmVyc2lvbiAxLjIuMzdiZXRhMDMgW01heSAyMCwgMjAwOV0KKyAgSW4gY29udHJpYi9wbmdtaW5pbS8qLCByZW5hbWVkICJtYWtlZmlsZS5zdGQiIHRvICJtYWtlZmlsZSIsIHNpbmNlIHRoZXJlCisgICAgaXMgb25seSBvbmUgbWFrZWZpbGUgaW4gdGhvc2UgZGlyZWN0b3JpZXMsIGFuZCByZXZpc2VkIHRoZSBSRUFETUUgZmlsZXMKKyAgICBhY2NvcmRpbmdseS4KKyAgUmVmb3JtYXRlZCBzb3VyY2VzIGluIGxpYnBuZyBzdHlsZSAoMy1zcGFjZSBpbmRlbnRhdGlvbiwgY29tbWVudCBmb3JtYXQpCisKK3ZlcnNpb24gMS4yLjM3cmMwMSBbTWF5IDI3LCAyMDA5XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9ucyAxLjIuMzcgYW5kIDEuMC40NSBbSnVuZSA0LCAyMDA5XQorICBSZWZvcm1hdHRlZCBzZXZlcmFsIHJlbWFpbmluZyAiZWxzZSBzdGF0ZW1lbnQ7IiBhbmQgImlmICgpIHN0YXRlbWVudDsiIGludG8KKyAgICB0d28gbGluZXMuCisgIEFkZGVkICIjZGVmaW5lIFBOR19OT19XUklURV9TV0FQIiB0byBjb250cmliL3BuZ21pbmltL2VuY29kZXIvcG5ndXNyLmgKKyAgICBhbmQgImRlZmluZSBQTkdfTk9fUkVBRF9TV0FQIiB0byBkZWNvZGVyL3BuZ3Vzci5oIGFuZCBwcmVhZGVyL3BuZ3Vzci5oCisgIEFkZGVkIHNlY3Rpb25zIGFib3V0IHRoZSBnaXQgcmVwb3NpdG9yeSBhbmQgb3VyIGNvZGluZyBzdHlsZSB0byB0aGUKKyAgICBkb2N1bWVudGF0aW9uIChtZXJnZWQgZnJvbSBsaWJwbmctMS40LjBiZXRhNjIpCisgIEFkZGVkIGEgc2VjdGlvbiB0byB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24gYWJvdXQgdXNpbmcgcG5nX2dldF9pb19wdHIoKQorICAgIGluIGNvbmZpZ3VyZSBzY3JpcHRzIHRvIGRldGVjdCB0aGUgcHJlc2VuY2Ugb2YgbGlicG5nLgorCit2ZXJzaW9uIDEuMi4zOGJldGEwMSBbSnVuZSAxNywgMjAwOV0KKyAgUmV2aXNlZCBsaWJwbmcqLnR4dCBhbmQgbGlicG5nLjMgdG8gbWVudGlvbiBjYWxsaW5nIHBuZ19zZXRfSUhEUigpCisgICAgbXVsdGlwbGUgdGltZXMgYW5kIHRvIHNwZWNpZnkgdGhlIHNhbXBsZSBvcmRlciBpbiB0aGUgdFJOUyBjaHVuaywKKyAgICBiZWNhdXNlIHRoZSBJU08gUE5HIHNwZWNpZmljYXRpb24gaGFzIGEgdHlwbyBpbiB0aGUgdFJOUyB0YWJsZS4KKyAgQ2hhbmdlZCBzZXZlcmFsIFBOR19VTktOT1dOX0NIVU5LX1NVUFBPUlRFRCB0bworICAgIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQsIHRvIG1ha2UgdGhlIHBuZ19zZXRfa2VlcCBtZWNoYW5pc20KKyAgICBhdmFpbGFibGUgZm9yIGlnbm9yaW5nIGtub3duIGNodW5rcyBldmVuIHdoZW4gbm90IHNhdmluZyB1bmtub3duIGNodW5rcy4KKyAgQWRvcHRlZCBwcmVmZXJlbmNlIGZvciBjb25zaXN0ZW50IHVzZSBvZiAiI2lmZGVmIiBhbmQgIiNpZm5kZWYiIHZlcnN1cworICAgICIjaWYgZGVmaW5lZCgpIiBhbmQgImlmICFkZWZpbmVkKCkiIHdoZXJlIHBvc3NpYmxlLgorICBBZGRlZCBQTkdfTk9fSEFORExFX0FTX1VOS05PV04gaW4gdGhlIFBOR19MRUdBQ1lfU1VQUE9SVEVEIGJsb2NrIG9mCisgICAgcG5nY29uZi5oLCBhbmQgbW92ZWQgdGhlIHZhcmlvdXMgdW5rbm93biBjaHVuayBtYWNybyBkZWZpbml0aW9ucworICAgIG91dHNpZGUgb2YgdGhlIFBOR19SRUFEfFdSSVRFX0FOQ0lMTEFSWV9DSFVOS19TVVBQT1JURUQgYmxvY2tzLgorCit2ZXJzaW9uIDEuMC40NiBbSnVuZSAxOCwgMjAwOV0KKyAgUmVtb3ZlZCBzb21lIGVkaXRpbmcgY3J1ZnQgZnJvbSBzY3JpcHRzL2xpYnBuZy5wYy5pbiBhbmQgc29tZSBtYWtlZmlsZXMuCisKK3ZlcnNpb24gMS4yLjM4cmMwMSBbSnVuZSAyNCwgMjAwOV0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjIuMzhyYzAyIFtKdW5lIDI5LCAyMDA5XQorICBBZGRlZCBhIHJlZmVyZW5jZSB0byB0aGUgbGlicG5nIGxpY2Vuc2UgaW4gZWFjaCBzb3VyY2UgZmlsZS4KKwordmVyc2lvbiAxLjIuMzhyYzAzIFtKdWx5IDExLCAyMDA5XQorICBSZXZpc2VkIHJlZmVyZW5jZXMgdG8gdGhlIGxpYnBuZyBsaWNlbnNlIGluIHBuZ2NvbmYuaCBhbmQgY29udHJpYi92aXN1cG5nCisgICAgc291cmNlIGZpbGVzLgorICBSZWJ1aWx0IGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b2NvbmYtMi42My4KKwordmVyc2lvbiAxLjAuNDcgYW5kIDEuMi4zOCBbSnVseSAxNiwgMjAwOV0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjIuMzliZXRhMDEgW0p1bHkgMjUsIDIwMDldCisgIEFkZGVkIGEgcHJvdG90eXBlIGZvciBwbmdfNjRiaXRfcHJvZHVjdCgpIGluIHBuZy5jCisKK3ZlcnNpb24gMS4yLjM5YmV0YTAyIFtKdWx5IDI3LCAyMDA5XQorICBBdm9pZCBhIHBvc3NpYmxlIE5VTEwgZGVyZWZlcmVuY2UgaW4gZGVidWcgYnVpbGQsIGluIHBuZ19zZXRfdGV4dF8yKCkuCisgICAgKGJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0wLjk1LCBkaXNjb3ZlcmVkIGJ5IEV2YW4gUm91YXVsdCkKKwordmVyc2lvbiAxLjIuMzliZXRhMDMgW0p1bHkgMjksIDIwMDldCisgIFJlbG9jYXRlZCBuZXcgcG5nXzY0X2JpdF9wcm9kdWN0KCkgcHJvdG90eXBlIGludG8gcG5nLmgKKyAgRXhwYW5kZWQgdGhlIGluZm9ybWF0aW9uIGFib3V0IHByb3RvdHlwZXMgaW4gdGhlIGxpYnBuZyBzdHlsZSBzZWN0aW9uIG9mCisgICAgdGhlIGRvY3VtZW50YXRpb24uCisgIFJlYnVpbHQgY29uZmlndXJlIHNjcmlwdHMgd2l0aCBhdXRvY29uZi0yLjY0LgorCit2ZXJzaW9uIDEuMi4zOWJldGEwNCBbQXVndXN0IDEsIDIwMDldCisgIFJlcGxhY2VkICoudGFyLmx6bWEgd2l0aCAqLnR4eiBpbiBkaXN0cmlidXRpb24uICBHZXQgdGhlIHh6IGNvZGVjCisgICAgZnJvbSA8aHR0cDovL3R1a2Fhbmkub3JnL3h6Pi4KKwordmVyc2lvbiAxLjIuMzliZXRhMDUgW0F1Z3VzdCAxLCAyMDA5XQorICBSZWplY3QgYXR0ZW1wdCB0byB3cml0ZSBpQ0NQIGNodW5rIHdpdGggbmVnYXRpdmUgZW1iZWRkZWQgcHJvZmlsZSBsZW5ndGgKKyAgICAoSkQgQ2hlbikKKwordmVyc2lvbiAxLjIuMzljMDEgW0F1Z3VzdCA2LCAyMDA5XQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMi4zOSBhbmQgMS4wLjQ4IFtBdWd1c3QgMTMsIDIwMDldCisgIE5vIGNoYW5nZXMuCisKK3ZlcnNpb24gMS4yLjQwYmV0YTAxIFtBdWd1c3QgMjAsIDIwMDldCisgIFJlbW92ZWQgYW4gZXh0cmEgcG5nX2RlYnVnKCkgcmVjZW50bHkgYWRkZWQgdG8gcG5nX3dyaXRlX2ZpbmRfZmlsdGVyKCkuCisgIEZpeGVkIGluY29ycmVjdCAjaWZkZWYgaW4gcG5nc2V0LmMgcmVnYXJkaW5nIHVua25vd24gY2h1bmsgc3VwcG9ydC4KKwordmVyc2lvbiAxLjIuNDByYzAxIFtTZXB0ZW1iZXIgMiwgMjAwOV0KKyAgVmFyaW91cyBidWdmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIENNYWtlTGlzdHMudHh0IChQaGlsaXAgTG93bWFuKQorCit2ZXJzaW9uIDEuMi40MCBhbmQgMS4wLjQ5IFtTZXB0ZW1iZXIgMiwgMjAwOV0KKyAgTm8gY2hhbmdlcy4KKwordmVyc2lvbiAxLjAuNTAgW1NlcHRlbWJlciAxMCwgMjAwOV0KKyAgUmVtb3ZlZCBzb21lIGVkaXRpbmcgY3J1ZnQgZnJvbSBwbmdzZXQuYyBhbmQgcG5nd3V0aWwuYy4KKwordmVyc2lvbiAxLjIuNDFiZXRhMDEgW1NlcHRlbWJlciAyNSwgMjAwOV0KKyAgTW92ZWQgcmVkdW5kYW50IElIRFIgY2hlY2tpbmcgaW50byBuZXcgcG5nX2NoZWNrX0lIRFIoKSBpbiBwbmcuYworICAgIGFuZCByZXBvcnQgYWxsIGVycm9ycyBmb3VuZCBpbiB0aGUgSUhEUiBkYXRhLgorICBFbGltaW5hdGVkIHVzZWxlc3MgY2FsbCB0byBwbmdfY2hlY2tfY0hSTSgpIGZyb20gcG5nc2V0LmMKKyAgRXhwYW5kZWQgVEFCIGNoYXJhY3RlcnMgaW4gcG5ncnRyYW4uYworCit2ZXJzaW9uIDEuMi40MWJldGEwMiBbU2VwdGVtYmVyIDMwLCAyMDA5XQorICBSZXZpc2VkIHBuZ19jaGVja19JSERSKCkuCisKK3ZlcnNpb24gMS4yLjQxYmV0YTAzIFtPY3RvYmVyIDEsIDIwMDldCisgIFJldmlzZWQgcG5nX2NoZWNrX0lIRFIoKSBhZ2FpbiwgdG8gY2hlY2sgaW5mb19wdHIgbWVtYmVycyBpbnN0ZWFkIG9mCisgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXR1cm5lZCBwYXJhbWV0ZXJzLgorCit2ZXJzaW9uIDEuMi40MWJldGEwNCBbT2N0b2JlciA3LCAyMDA5XQorICBBZGRlZCAieGNvZGUiIHByb2plY3Qgc2ltaWxhciBvbmUgYWxyZWFkeSBpbiBsaWJwbmctMS40LjBiZXRhIChBbGFtIEFyaWFzKS4KKyAgUG9ydGVkIHNvbWUgY29zbWV0aWMgY2hhbmdlcyBmcm9tIGxpYnBuZy0xLjQuMGJldGE4Ni4KKyAgRWxpbWluYXRlZCBhIHNoYWRvd2VkIGRlY2xhcmF0aW9uIG9mICJwcCIgaW4gcG5nX2hhbmRsZV9zUExUKCkuCisKK3ZlcnNpb24gMS4yLjQxYmV0YTA1IFtPY3RvYmVyIDE3LCAyMDA5XQorICBSZXZpc2VkIHBuZ2NvbmYuaCB0byBtYWtlIGl0IGVhc2llciB0byBlbmFibGUgaVRYdCBzdXBwb3J0LiAgRnJvbSBsaWJwbmcKKyAgICB2ZXJzaW9uIDEuMi45IHRocm91Z2ggMS4yLjQwLCBkZWZpbmluZyBQTkdfaVRYdF9TVVBQT1JURUQgZGlkIG5vdCB3b3JrCisgICAgYXMgZXhwZWN0ZWQuCisgIFBvcnRlZCBzb21lIGNvc21ldGljIGNoYW5nZXMgZnJvbSBsaWJwbmctMS40LjBiZXRhODcsIGNoYW5naW5nCisgICAgbWFueSAiI2lmIGRlZmluZWQoeCkiIHRvICIjaWZkZWYgeCIuCisKK3ZlcnNpb24gMS4yLjQxYmV0YTA2IFtPY3RvYmVyIDE4LCAyMDA5XQorICBSZXN0b3JlZCBQTkdfVVNFX0xPQ0FMX0FSUkFZUyBjb2RlIGluIHBuZ3JlYWQuYyB0aGF0IHdhcyBpbmFkdmVydGVudGx5CisgICAgZGVsZXRlZCBpbiBsaWJwbmctMS4yLjQxYmV0YTA1LgorICBDb252ZXJ0ZWQgYWxsIFBOR19OT18qIHRlc3RzIHRvIFBOR18qX1NVUFBPUlRFRCBldmVyeXdoZXJlIGV4Y2VwdCBwbmdjb25mLmgKKyAgICBhcyBpbiBsaWJwbmctMS40LjBiZXRhNzggYW5kIGxhdGVyLgorCit2ZXJzaW9uIDEuMi40MWJldGEwNyBbT2N0b2JlciAyMSwgMjAwOV0KKyAgUG9ydGVkIHNvbWUgY29zbWV0aWMgY2hhbmdlcyBmcm9tIGxpYnBuZy0xLjQuMHJjMDEsIGNoYW5naW5nCisgICAgbWFueSAiI2lmIGRlZmluZWQoeCkiIHRvICIjaWZkZWYgeCIgaW4gcG5nLmggYW5kIHBuZ2NvbmYuaC4KKwordmVyc2lvbiAxLjIuNDFiZXRhMDggW09jdG9iZXIgMzAsIDIwMDldCisgIFBvcnRlZCBmcm9tIGxpYnBuZy0xLjQuMHJjMDE6IHBuZ19jYWxsb2MoKSwgcG5nX2dldF9pb19jaHVua19uYW1lKCksCisgICAgcG5nX2dldF9pb19zdGF0ZSgpLCBwbmdfc2V0X3VzZXJfY2FjaGVfbWF4KCksIHBuZ19nZXRfdXNlcl9jYWNoZV9tYXgoKSwKKyAgICBwbmdfc2V0X3ByZW11bHRpcGx5X2FscGhhLCBhbmQgcG5nX2RvX3JlYWRfcHJlbXVsdGlwbHlfYWxwaGEoKS4KKyAgUmVsb2NhdGVkIHBuZ19kb19jaG9wKCkgYWhlYWQgb2YgYnVpbGRpbmcgZ2FtbWEgdGFibGVzIGluIHBuZ3J0cmFuLmMKKyAgICBUaGlzIGF2b2lkcyBidWlsZGluZyAxNi1iaXQgZ2FtbWEgdGFibGVzIHVubmVjZXNzYXJpbHkuCisKK3ZlcnNpb24gMS4yLjQxYmV0YTA5IFtOb3ZlbWJlciAxLCAyMDA5XQorICBSZW1vdmVkIGEgaGFybWxlc3MgZXh0cmEgcG5nX3NldF9pbnZlcnRfYWxwaGEoKSBmcm9tIHBuZ3dyaXRlLmMKKyAgTW9yZSBidWdmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIENNYWtlTGlzdHMudHh0IChQaGlsaXAgTG93bWFuKQorICBNb3ZlZCBDTWFrZUxpc3RzLnR4dCBmcm9tIHNjcmlwdHMgaW50byB0aGUgbWFpbiBsaWJwbmcgZGlyZWN0b3J5LgorICBBcHBseSBwbmdfdXNlcl9jaHVua19jYWNoZV9tYXggd2l0aGluIHBuZ19kZWNvbXByZXNzX2NodW5rKCkuCisgIE1lcmdlZCBsaWJwbmctMS4yLjQxLnR4dCB3aXRoIGxpYnBuZy0xLjQuMC50eHQgd2hlcmUgYXBwcm9wcmlhdGUuCisKK3ZlcnNpb24gMS4yLjQxYmV0YTEwIFtOb3ZlbWJlciAxLCAyMDA5XQorICBFbmFibGVkIGlUWHQgc3VwcG9ydCBieSBkZWZhdWx0LiBUbyBlbnN1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aAorICAgIHByZXZpb3VzIHZlcnNpb25zLCB0aGUgImxhbmciIGFuZCAibGFuZ19rZXkiIG1lbWJlcnMgd2lsbCBiZSBhc3N1bWVkCisgICAgdG8gYmUgb21pdHRlZCBmcm9tIHByZXZpb3VzIHZlcnNpb25zIHVubGVzcyB0aGUgY3VycmVudCBsaWJwbmcKKyAgICB2ZXJzaW9uIHdhcyBidWlsdCB3aXRoIFBOR19pVFh0X1NVUFBPUlRFRCAod2hpY2ggaXMgb3RoZXJ3aXNlIG5vCisgICAgbG9uZ2VyIG5lY2Vzc2FyeSB0byBnYWluIGlUWHQgc3VwcG9ydCksIGFzIGEgc2lnbmFsIHRoYXQgdGhlIHVzZXIgaGFzCisgICAgYmVlbiBidWlsZGluZyBwcmV2aW91cyB2ZXJzaW9ucyB3aXRoIFBOR19pVFh0X1NVUFBPUlRFRCBhcyB3ZWxsLgorCit2ZXJzaW9uIDEuMi40MWJldGExMSBbTm92ZW1iZXIgMiwgMjAwOV0KKyAgU3RvcmUgdXNlcidzIHVzZXJfcG5nX3ZlciBpbiBuZXcgcG5nX3B0ci0+dXNlcl9wbmdfdmVyIGVsZW1lbnQuCisgIFJldmlzZWQgaVRYdCBzdXBwb3J0LiBUbyBlbnN1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aAorICAgIHByZXZpb3VzIHZlcnNpb25zLCB0aGUgImxhbmciIGFuZCAibGFuZ19rZXkiIG1lbWJlcnMgd2lsbCBiZSBhc3N1bWVkCisgICAgdG8gYmUgb21pdHRlZCBmcm9tIHZlcnNpb25zIHByaW9yIHRvIDEuMi40MWJldGExMSB3aGVuZXZlciB0aGVyZSBpcyBhCisgICAgbGlicmFyeSBtaXNtYXRjaC4KKwordmVyc2lvbiAxLjIuNDFiZXRhMTIgW05vdmVtYmVyIDIsIDIwMDldCisgIEZyZWUgcG5nX3B0ci0+dXNlcl9wbmdfdmVyIHdoZW4gZGVzdHJveWluZyBwbmdfcHRyLgorCit2ZXJzaW9uIDEuMi40MWJldGExMyBbTm92ZW1iZXIgMywgMjAwOV0KKyAgVXBkYXRlZCBzY3JpcHRzL3BuZ3czMi5kZWYgYW5kIHByb2plY3RzL3dpbmNlL3BuZzMyY2UuZGVmCisgIENvcGllZCBwcm9qZWN0cy93aW5jZS9wbmczMmNlLmRlZiB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkuCisgIEFkZGVkIHNjcmlwdHMvbWFrZWZpbGUud2NlCisgIFBhdGNoZWQgbHRtYWluLnNoIGZvciB3aW5jZSBzdXBwb3J0LgorICBBZGRlZCBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRCBtYWNyby4KKwordmVyc2lvbiAxLjIuNDFiZXRhMTQgW05vdmVtYmVyIDgsIDIwMDldCisgIHZlcnNpb25zIDEuMi40MWJldGEwNSB0aHJvdWdoIDEuMi40MWJldGExMyB3ZXJlIGFiYW5kb25lZC4KKyAgVGhlIDEuMC54LzEuMi54IHNlcmllcyB3aWxsIG9ubHkgcmVjZWl2ZSBzZWN1cml0eSB1cGRhdGVzIGZyb20gbm93IG9uLgorICBNYWtlIGluY2x1c2lvbiBvZiB0aW1lLmggaW4gcG5nY29uZi5oIGRlcGVuZCBvbiBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRAorICBNYWtlICNkZWZpbmUgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQgZGVwZW5kIG9uIFBOR19XUklURV90SU1FX1NVUFBPUlRFRAorICBSZXZlcnRlZCBpVFh0IGNvbXBhdGliaWxpdHkgc3R1ZmYgZnJvbSAxLjIuNDFiZXRhMDUsIDEuMi40MWJldGExMSwgYW5kCisgICAgMS4yLjQxYmV0YTEyLgorICBSZXZlcnRlZCBJT1NUQVRFIGZlYXR1cmUsIHVzZXJfY2FjaGVfbWF4LCBhbmQgcHJlbXVsdGlwbHlfYWxwaGEgZmVhdHVyZXMKKyAgICBmcm9tIDEuMi40MWJldGEwOC4KKyAgUmV0YWluZWQgcG5nX2NhbGxvYygpIGZyb20gMS4yLjQxYmV0YTA4IGJ1dCBhcyBhIG5vbi1leHBvcnRlZCBmdW5jdGlvbiwKKyAgICBhbmQgcmVtb3ZlZCByZWZlcmVuY2UgdG8gcG5nX2NhbGxvYyBmcm9tIHNjcmlwdHMvKi5kZWYKKwordmVyc2lvbiAxLjIuNDFiZXRhMTUgW05vdmVtYmVyIDgsIDIwMDldCisgIEFkZGVkIFBOR19ERVBTVFJVQ1QsIFBOR19ERVBSRUNBVEVELCBQTkdfVVNFX1JFU1VMVCwgUE5HX05PUkVUVVJOLCBhbmQKKyAgICBQTkdfQUxMT0NBVEVEIG1hY3JvcyB0byBkZXRlY3QgZGVwcmVjYXRlZCBkaXJlY3QgYWNjZXNzIHRvIHRoZQorICAgIHBuZ19zdHJ1Y3Qgb3IgaW5mb19zdHJ1Y3QgbWVtYmVycyBhbmQgb3RoZXIgZGVwcmVjYXRlZCB1c2FnZSBpbgorICAgIGFwcGxpY2F0aW9ucyAoSm9obiBCb3dsZXIpLgorICBVcGRhdGVkIHNjcmlwdHMvbWFrZWZpbGUqIHRvIGFkZCAiLURQTkdfQ09ORklHVVJFX0xJQlBORyIgdG8gQ0ZMQUdTLAorICAgIHRvIHByZXZlbnQgd2FybmluZ3MgYWJvdXQgZGlyZWN0IGFjY2VzcyB0byBwbmcgc3RydWN0cyBieSBsaWJwbmcKKyAgICBmdW5jdGlvbnMgd2hpbGUgYnVpbGRpbmcgbGlicG5nLiAgVGhleSBuZWVkIHRvIGJlIHRlc3RlZCwgZXNwZWNpYWxseQorICAgIHRob3NlIHVzaW5nIGNvbXBpbGVycyBvdGhlciB0aGFuIGdjYy4KKyAgVXBkYXRlZCBwcm9qZWN0cy92aXN1YWxjNiBhbmQgdmlzdWFsYzcxIHdpdGggIi9kIFBOR19DT05GSUdVUkVfTElCUE5HIi4KKwordmVyc2lvbiAxLjIuNDFiZXRhMTYgW05vdmVtYmVyIDksIDIwMDldCisgIFJlbW92ZWQgdGhyZWUgZGlyZWN0IHJlZmVyZW5jZXMgdG8gcmVhZF9pbmZvX3B0ciBtZW1iZXJzIGluIHBuZ3Rlc3QuYworICAgIHRoYXQgd2VyZSBkZXRlY3RlZCBieSB0aGUgbmV3IFBOR19ERVBTVFJVQ1QgbWFjcm8uCisgIE9ubHkgI2RlZmluZSBQTkdfREVQU1RSVUNULCBldGMuIGluIHBuZ2NvbmYuaCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorCit2ZXJzaW9uIDEuMi40MWJldGExNyBbTm92ZW1iZXIgMTAsIDIwMDldCisgIFVwZGF0ZWQgQ01ha2VMaXN0cy50eHQgdG8gYWRkICItRFBOR19DT05GSUdVUkVfTElCUE5HIiB0byB0aGUgZGVmaW5pdGlvbnMuCisgIE1hcmtlZCBkZXByZWNhdGVkIGZ1bmN0aW9uIHByb3RvdHlwZXMgd2l0aCBQTkdfREVQUkVDQVRFRC4KKyAgTWFya2VkIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uIHByb3RvdHlwZXMgd2l0aCBQTkdfQUxMT0NBVEVELgorICBDaGFuZ2VkIHBuZ19jaGVja19zaWcoKSB0byAhcG5nX3NpZ19jbXAoKSBpbiBjb250cmliIHByb2dyYW1zLgorICBDb3JyZWN0ZWQgdGhlIHBuZ19nZXRfSUhEUigpIGNhbGwgaW4gY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jCisgIEFkZGVkICItRFBOR19DT05GSUdVUkVfTElCUE5HIiB0byB0aGUgY29udHJpYi9wbmdtaW51bSBtYWtlZmlsZXMuCisKK3ZlcnNpb24gMS4yLjQxYmV0YTE4IFtOb3ZlbWJlciAxMSwgMjAwOV0KKyAgUmVuYW1lZCBzY3JpcHRzL21ha2VmaWxlLndjZSB0byBzY3JpcHRzL21ha2VmaWxlLmNlZ2NjCisgIE1hcmtlZCBub25leHBvcnRlZCBmdW5jdGlvbnMgd2l0aCBQTkdfUFJJVkFURSBtYWNyby4KKwordmVyc2lvbiAxLjIuNDFyYzAxIGFuZCAxLjAuNTFyYzAxIFtOb3ZlbWJlciAxOCwgMjAwOV0KKyAgUmV2aXNlZCBzY3JpcHRzLyouZGVmIHRvIHJlZmxlY3QgZnVuY3Rpb25zIGFjdHVhbGx5IGV4cG9ydGVkIGJ5IGxpYnBuZy4KKyAgVXBkYXRlZCB0aGUgY29weXJpZ2h0IHllYXIgaW4gc2NyaXB0cy9wbmd3MzIucmMgZnJvbSAyMDA0IHRvIDIwMDkuCisgIE1vdmVkIGRlc2NyaXB0aW9ucyBvZiBtYWtlZmlsZXMgYW5kIG90aGVyIHNjcmlwdHMgb3V0IG9mIElOU1RBTEwgaW50bworICAgIHNjcmlwdHMvUkVBRE1FLnR4dAorCit2ZXJzaW9uIDEuMi40MXJjMDIgW05vdmVtYmVyIDIyLCAyMDA5XQorICBSZWJ1aWx0IHRoZSBjb25maWd1cmUgc2NyaXB0cyB3aXRoIGF1dG9jb25mLTIuNjUKKwordmVyc2lvbiAxLjIuNDFyYzAzIFtOb3ZlbWJlciAyNSwgMjAwOV0KKyAgRGlzYWJsZWQgdGhlIG5ldyBwZWRhbnRpYyB3YXJuaW5ncyBhYm91dCBkZXByZWNhdGVkIGZ1bmN0aW9uIHVzZQorICAgIGFuZCBkZXByZWNhdGVkIHN0cnVjdHVyZSBhY2Nlc3MgdW5sZXNzIHRoZSB1c2VyIGRlZmluZXMKKyAgICBQTkdfUEVEQU5USUNfV0FSTklOR1MuCisgIEFkZGVkICIjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUyIgaW4gdGhlIGxpYnBuZyBzb3VyY2UgZmlsZXMuCisgIFJlbW92ZWQgIi1EUE5HX0NPTkZJR1VSRV9MSUJQTkciIGZyb20gdGhlIG1ha2VmaWxlcyBhbmQgcHJvamVjdHMuCisKK3ZlcnNpb24gMS4yLjQxIGFuZCAxLjAuNTEgW0RlY2VtYmVyIDMsIDIwMDldCisgIFVwZGF0ZWQgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIG1hZGUgc29tZSBjb3NtZXRpYyBjaGFuZ2VzIGluIFJFQURNRS4KKwordmVyc2lvbiAxLjIuNDJiZXRhMDEgW0RlY2VtYmVyIDQsIDIwMDldCisgIFJlbW92ZWQgIiNkZWZpbmUgUE5HX05PX0VSUk9SX05VTUJFUlMiIHRoYXQgd2FzIGluYWR2ZXJ0ZW50bHkgYWRkZWQKKyAgICB0byBwbmdjb25mLmggaW4gdmVyc2lvbiAxLjIuNDEuCisgIFJldmlzZWQgc2NyaXB0cy9tYWtlZmlsZS5uZXRic2QsIG1ha2VmaWxlLm9wZW5ic2QsIGFuZCBtYWtlZmlsZS5zY28KKyAgICB0byBwdXQgcG5nLmggYW5kIHBuZ2NvbmYuaCBpbiAkcHJlZml4L2luY2x1ZGUsIGxpa2UgdGhlIG90aGVyIHNjcmlwdHMsCisgICAgaW5zdGVhZCBvZiBpbiAkcHJlZml4L2luY2x1ZGUvbGlicG5nLiAgQWxzbyByZXZpc2VkIG1ha2VmaWxlLnNjbworICAgIHRvIHB1dCB0aGVtIGluICRwcmVmaXgvaW5jbHVkZS9saWJwbmcxMiBpbnN0ZWFkIG9mIGluCisgICAgJHByZWZpeC9pbmNsdWRlL2xpYnBuZy9saWJwbmcxMi4KKyAgUmVtb3ZlZCBsZWZ0b3ZlciAiLURQTkdfQ09ORklHVVJFX0xJQlBORyIgZnJvbSBzY3JpcHRzL21ha2VmaWxlLmRhcndpbgorCit2ZXJzaW9uIDEuMi40MmJldGEwMiBbRGVjZW1iZXIgMTEsIDIwMDldCisgIFJlbW92ZWQgbGVmdG92ZXIgIi1EUE5HX0NPTkZJR1VSRV9MSUJQTkciIGZyb20gY29udHJpYi9wbmdtaW5pbS8qL21ha2VmaWxlCisgIFJlbG9jYXRlZCBwbmdfZG9fY2hvcCgpIHRvIGl0cyBvcmlnaW5hbCBwb3NpdGlvbiBpbiBwbmdydHJhbi5jLiBUaGUKKyAgICBjaGFuZ2UgaW4gdmVyc2lvbiAxLjIuNDFiZXRhMDggY2F1c2VkIHRyYW5zcGFyZW5jeSB0byBiZSBoYW5kbGVkIHdyb25nCisgICAgaW4gc29tZSAxNi1iaXQgZGF0YXN0cmVhbXMgKFl1c2FrdSBTdWdhaSkuCisKK3ZlcnNpb24gMS4yLjQycmMwMSBbRGVjZW1iZXIgMTcsIDIwMDldCisgIE5vIGNoYW5nZXMuCisKK3ZlcnNpb24gMS4yLjQycmMwMiBbRGVjZW1iZXIgMjIsIDIwMDldCisgIFJlbmFtZWQgbGlicG5nLXBjLmluIGJhY2sgdG8gbGlicG5nLnBjLmluIGFuZCByZXZpc2VkIENNYWtlTGlzdHMudHh0CisgICAgKHJldmlzaW5nIGNoYW5nZXMgbWFkZSBpbiAxLjIuNDFiZXRhMTcgYW5kIDEuMi40MXJjMDEpCisKK3ZlcnNpb24gMS4yLjQycmMwMyBbRGVjZW1iZXIgMjUsIDIwMDldCisgIFN3YXBwZWQgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCBhbmQgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgIGluIHBuZ3NldC5jIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBjaGFuZ2VzIGluIHZlcnNpb24gMS4yLjM4LgorCit2ZXJzaW9uIDEuMi40MnJjMDQgW0phbnVhcnkgMSwgMjAxMF0KKyAgTWFya2VkIHBuZ19tZW1jcHlfY2hlY2soKSBhbmQgcG5nX21lbXNldF9jaGVjaygpIFBOR19ERVBSRUNBVEVELgorICBVcGRhdGVkIGNvcHlyaWdodCB5ZWFyLgorCit2ZXJzaW9uIDEuMi40MnJjMDUgW0phbnVhcnkgMiwgMjAxMF0KKyAgQXZvaWQgZGVwcmVjYXRlZCByZWZlcmVuY2VzIHRvIHBuZ19wdHItaW9fcHRyIGFuZCBwbmdfcHRyLT5lcnJvcl9wdHIKKyAgICBpbiBwbmd0ZXN0LmMKKwordmVyc2lvbiAxLjIuNDIgYW5kIDEuMC41MiBbSmFudWFyeSAzLCAyMDEwXQorICBObyBjaGFuZ2VzLgorCit2ZXJzaW9uIDEuMi40M2JldGEwMSBbSmFudWFyeSAyNywgMjAxMF0KKyAgVXBkYXRlZCBDTWFrZUxpc3RzLnR4dCBmb3IgY29uc2lzdGVudCBpbmRlbnRhdGlvbiBhbmQgdG8gYXZvaWQgYW4KKyAgICB1bmNsb3NlZCBpZi1zdGF0ZW1lbnQgd2FybmluZyAoUGhpbGlwIExvd21hbikuCisgIFJlbW92ZWQgIiNpZmRlZiBQTkdfMV8wX1ggLyAjZW5kaWYiIHN1cnJvdW5kaW5nCisgICAgUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQgYW5kIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorICAgIGluIHBuZ2NvbmYuaC4gIFRoZXNlIHdlcmUgYWRkZWQgaW4gbGlicG5nLTEuMi40MWJldGEwOCBhbmQgbGlicG5nLTEuMC41MSwKKyAgICB3aGljaCBpbnRyb2R1Y2VkIGEgYmluYXJ5IGluY29tcGF0aWJpbGl0eSB3aXRoIGxpYnBuZy0xLjAuNTAuCisgIEJhY2twb3J0ZWQgbmV3IHBuZ19kZWNvbXByZXNzX2NodW5rKCkgYWxnb3JpdGhtIGZyb20gbGlicG5nLTEuNC4xLgorCit2ZXJzaW9uIDEuMi40M2JldGEwMiBbRmVicnVhcnkgMSwgMjAxMF0KKyAgQmFja3BvcnRlZCB0d28tcGFzcyBwbmdfZGVjb21wcmVzc19jaHVuaygpIGFsZ29yaXRobSBmcm9tIGxpYnBuZy0xLjQuMS4KKwordmVyc2lvbiAxLjIuNDNiZXRhMDMgW0ZlYnJ1YXJ5IDYsIDIwMTBdCisgIEJhY2twb3J0ZWQgZmFzdCBwbmdfcHVzaF9zYXZlX2J1ZmZlcigpIGFsZ29yaXRobSBmcm9tIGxpYnBuZy0xLjQuMS4KKyAgQmFja3BvcnRlZCBzb21lIGNvc21ldGljIGNoYW5nZXMgZnJvbSBsaWJwbmctMS40LjEuCisKK3ZlcnNpb24gMS4yLjQzYmV0YTA0IFtGZWJydWFyeSA4LCAyMDEwXQorICBSZXZlcnRlZCByZWNlbnQgY2hhbmdlcyB0byBwbmdfcHVzaF9zYXZlLWJ1ZmZlcigpLgorICBSZW1vdmVkIFBOR0FQSSBkZWNsYXJhdGlvbiBvZiBwbmdfY2FsbG9jKCkgYW5kIHBuZ193cml0ZV9zaWcoKSBpbgorICAgIDFpYnBuZy0xLjIuWCwgaW50cm9kdWNlZCBieSBtaXN0YWtlIGluIGxpYnBuZy0xLjIuNDEuCisgIFJldHVybiBhbGxvY2F0ZWQgIm9sZF9idWZmZXIiIGluIHBuZ19wdXNoX3NhdmVfYnVmZmVyKCkgYmVmb3JlIHBuZ19lcnJvcigpCisgICAgdG8gYXZvaWQgYSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCisKK3ZlcnNpb24gMS4yLjQzYmV0YTA1IFtGZWJydWFyeSA4LCAyMDEwXQorICBQb3J0ZWQgcmV3cml0dGVuIHBuZ19kZWNvbXByZXNzX2NodW5rKCkgYnkgSm9obiBCb3dsZXIgZnJvbSBsaWJwbmctMS40LjEuCisKK3ZlcnNpb24gMS4wLjUzcmMwMSBhbmQgMS4yLjQzcmMwMSBbRmVicnVhcnkgMTgsIDIwMTBdCisgIE5vIGNoYW5nZXMuCisKK3ZlcnNpb24gMS4wLjUzcmMwMiBhbmQgMS4yLjQzcmMwMiBbRmVicnVhcnkgMTksIDIwMTBdCisgIERlZmluZSBfQUxMX1NPVVJDRSBpbiBjb25maWd1cmUuYWMsIG1ha2VmaWxlLmFpeCwgYW5kIENNYWtlTGlzdHMudHh0CisgICAgd2hlbiB1c2luZyBBSVggY29tcGlsZXIuCisKK3ZlcnNpb24gMS4wLjUzIGFuZCAxLjIuNDMgW0ZlYnJ1YXJ5IDI1LCAyMDEwXQorICBSZW1vdmVkIHVudXNlZCBnemlvLmMgZnJvbSBjb250cmliL3BuZ21pbmltIGdhdGhlciBhbmQgbWFrZWZpbGUgc2NyaXB0cworCit2ZXJzaW9uIDEuMi40NGJldGEwMSBbSnVuZSAxOCwgMjAxMF0KKyAgSW4gcG5ncHJlYWQuYzogcG5nX3B1c2hfaGF2ZV9yb3coKSBhZGQgY2hlY2sgZm9yIG5ld19yb3cgPiBoZWlnaHQKKyAgUmVtb3ZlZCB0aGUgbm93LXJlZHVuZGFudCBjaGVjayBmb3Igb3V0LW9mLWJvdW5kcyBuZXdfcm93IGZyb20gZXhhbXBsZS5jCisKK3ZlcnNpb24gMS4yLjQ0YmV0YTAyIFtKdW5lIDE5LCAyMDEwXQorICBJbiBwbmdwcmVhZC5jOiBwbmdfcHVzaF9wcm9jZXNzX3JvdygpIGFkZCBjaGVjayBmb3IgdG9vIG1hbnkgcm93cy4KKyAgUmVtb3ZlZCB0aGUgbm93LXJlZHVuZGFudCBjaGVjayBmb3IgbmV3X3JvdyA+IGhlaWdodCBpbiBwbmdfcHVzaF9oYXZlX3JvdygpLgorCit2ZXJzaW9uIDEuMi40NGJldGEwMyBbSnVuZSAyMCwgMjAxMF0KKyAgUmV3cm90ZSBwbmdfcHJvY2Vzc19JREFUX2RhdGEoKSB0byBjb25zaXN0ZW50bHkgdHJlYXQgZXh0cmEgZGF0YSBhcyB3YXJuaW5ncworICAgIGFuZCBoYW5kbGUgZW5kIGNvbmRpdGlvbnMgbW9yZSBjbGVhbmx5LgorICBSZW1vdmVkIHRoZSBuZXcgKGJldGEwMikgY2hlY2sgaW4gcG5nX3B1c2hfcHJvY2Vzc19yb3coKS4KKwordmVyc2lvbiAxLjIuNDRyYzAxIFtKdW5lIDIxLCAyMDEwXQorICBSZXZpc2VkIHNvbWUgY29tbWVudHMgaW4gcG5nX3Byb2Nlc3NfSURBVF9kYXRhKCkuCisKK3ZlcnNpb24gMS4yLjQ0cmMwMiBbSnVuZSAyMiwgMjAxMF0KKyAgU3RvcCBtZW1vcnkgbGVhayB3aGVuIHJlYWRpbmcgYSBtYWxmb3JtZWQgc0NBTCBjaHVuay4KKwordmVyc2lvbiAxLjIuNDRyYzAzIFtKdW5lIDIzLCAyMDEwXQorICBSZXZpc2VkIHBuZ3ByZWFkLmMgcGF0Y2ggb2YgYmV0YTA1IHRvIGF2b2lkIGFuIGVuZGxlc3MgbG9vcC4KKwordmVyc2lvbiAxLjIuNDQgW0p1bmUgMjYsIDIwMTBdCisgIFVwZGF0ZWQgc29tZSBvZiB0aGUgImxhc3QgY2hhbmdlZCIgZGF0ZXMuCisKK1NlbmQgY29tbWVudHMvY29ycmVjdGlvbnMvY29tbWVuZGF0aW9ucyB0byBwbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zZi5uZXQKKyhzdWJzY3JpcHRpb24gcmVxdWlyZWQ7IHZpc2l0CitodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9wbmctbW5nLWltcGxlbWVudAordG8gc3Vic2NyaWJlKQorb3IgdG8gZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKworR2xlbm4gUi1QCisqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9LTk9XTkJVRyBiL2NvbTMyL2xpYi9saWJwbmcvS05PV05CVUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmNzI2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvS05PV05CVUcKQEAgLTAsMCArMSwyOSBAQAorCitLbm93biBidWdzIGluIGxpYnBuZyB2ZXJzaW9uIDEuMi40NAorCisxLiBEZWNlbWJlciA0LCAyMDA5OiBUaGUgUE5HX05PX0VSUk9SX05VTUJFUlMgbWFjcm8gd2FzIGluYWR2ZXJ0ZW50bHkKKyAgIGRlZmluZWQgaW4gbGlicG5nLTEuMi40MS9wbmdjb25mLmgsIHdoaWNoIG1heSBjYXVzZSBhIHByb2JsZW0gd2l0aAorICAgYnVpbGRpbmcgYSBiaW5hcnktY29tcGF0aWJsZSBsaWJyYXJ5LgorCisgICBTVEFUVVM6IFRoaXMgd2lsbCBiZSBmaXhlZCBpbiBsaWJwbmctMS4yLjQyLiAgSW4gdGhlIG1lYW50aW1lLCBzaW1wbHkKKyAgIGRlbGV0ZSB0aGUgZGVmaW5pdGlvbiBmcm9tIGxpbmUgOgorCisyLiBGZWJydWFyeSAyMywgMjAwNjogVGhlIGN1c3RvbSBtYWtlZmlsZXMgZG9uJ3QgYnVpbGQgbGlicG5nIHdpdGggLWx6LgorCisgICBTVEFUVVM6IFRoaXMgaXMgYSBzdWJqZWN0IG9mIGRlYmF0ZS4gVGhlIGNoYW5nZSB3aWxsIHByb2JhYmx5IGJlIG1hZGUKKyAgIGFzIGEgcGFydCBvZiBhIG1ham9yIG92ZXJoYXVsIG9mIHRoZSBtYWtlZmlsZXMgaW4gbGlicG5nIHZlcnNpb24gMS40LjAuCisKKzMuIEZlYnJ1YXJ5IDI0LCAyMDA2OiBUaGUgTWFrZWZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSAiY29uZmlndXJlIiBzY3JpcHQKKyAgIGZhaWxzIHRvIGluc3RhbGwgc3ltYm9saWMgbGlua3MKKyAgIGxpYnBuZzEyLnNvID0+IGxpYnBuZzEyLnNvLjAuMS4yLjliZXRhTgorICAgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBjdXN0b20gbWFrZWZpbGVzLgorCis0LiBTZXB0ZW1iZXIgNCwgMjAwNzogIFRoZXJlIGlzIGEgcmVwb3J0IHRoYXQgcG5ndGVzdCBjcmFzaGVzIG9uIE1hY09TIDEwLgorCisgICBTVEFUVVM6IHdvcmthcm91bmRzIGFyZQorICAgICAgMSkgQ29tcGlsZSB3aXRob3V0IG9wdGltaXphdGlvbiAoY3Jhc2hlcyBhcmUgb2JzZXJ2ZWQgd2l0aAorICAgICAgICAgLWFyY2ggaTM4NiBhbmQgLU8yIG9yIC1PMywgdXNpbmcgZ2NjLTQuMC4xKS4KKyAgICAgIDIpIENvbXBpbGUgcG5ndGVzdC5jIHdpdGggUE5HX0RFQlVHIGRlZmluZWQgKHRoZSBidWcgZ29lcyBhd2F5IGlmCisgICAgICAgICB5b3UgdHJ5IHRvIGxvb2sgYXQgaXQpLgorICAgICAgMykgSWdub3JlIHRoZSBjcmFzaC4gIFRoZSBsaWJyYXJ5IGl0c2VsZiBzZWVtcyB0byBiZSBPSy4KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9MSUNFTlNFIGIvY29tMzIvbGliL2xpYnBuZy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTYxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGlicG5nL0xJQ0VOU0UKQEAgLTAsMCArMSwxMTEgQEAKKworVGhpcyBjb3B5IG9mIHRoZSBsaWJwbmcgbm90aWNlcyBpcyBwcm92aWRlZCBmb3IgeW91ciBjb252ZW5pZW5jZS4gIEluIGNhc2Ugb2YKK2FueSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoaXMgY29weSBhbmQgdGhlIG5vdGljZXMgaW4gdGhlIGZpbGUgcG5nLmggdGhhdCBpcworaW5jbHVkZWQgaW4gdGhlIGxpYnBuZyBkaXN0cmlidXRpb24sIHRoZSBsYXR0ZXIgc2hhbGwgcHJldmFpbC4KKworQ09QWVJJR0hUIE5PVElDRSwgRElTQ0xBSU1FUiwgYW5kIExJQ0VOU0U6CisKK0lmIHlvdSBtb2RpZnkgbGlicG5nIHlvdSBtYXkgaW5zZXJ0IGFkZGl0aW9uYWwgbm90aWNlcyBpbW1lZGlhdGVseSBmb2xsb3dpbmcKK3RoaXMgc2VudGVuY2UuCisKK1RoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisKK2xpYnBuZyB2ZXJzaW9ucyAxLjIuNiwgQXVndXN0IDE1LCAyMDA0LCB0aHJvdWdoIDEuMi40NCwgSnVuZSAyNiwgMjAxMCwgYXJlCitDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKK2Rpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjIuNQord2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKKworICAgQ29zbWluIFRydXRhCisKK2xpYnBuZyB2ZXJzaW9ucyAxLjAuNywgSnVseSAxLCAyMDAwLCB0aHJvdWdoIDEuMi41IC0gT2N0b2JlciAzLCAyMDAyLCBhcmUKK0NvcHlyaWdodCAoYykgMjAwMC0yMDAyIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMC42Cit3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKKworICAgU2ltb24tUGllcnJlIENhZGlldXgKKyAgIEVyaWMgUy4gUmF5bW9uZAorICAgR2lsbGVzIFZvbGxhbnQKKworYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6CisKKyAgIFRoZXJlIGlzIG5vIHdhcnJhbnR5IGFnYWluc3QgaW50ZXJmZXJlbmNlIHdpdGggeW91ciBlbmpveW1lbnQgb2YgdGhlCisgICBsaWJyYXJ5IG9yIGFnYWluc3QgaW5mcmluZ2VtZW50LiAgVGhlcmUgaXMgbm8gd2FycmFudHkgdGhhdCBvdXIKKyAgIGVmZm9ydHMgb3IgdGhlIGxpYnJhcnkgd2lsbCBmdWxmaWxsIGFueSBvZiB5b3VyIHBhcnRpY3VsYXIgcHVycG9zZXMKKyAgIG9yIG5lZWRzLiAgVGhpcyBsaWJyYXJ5IGlzIHByb3ZpZGVkIHdpdGggYWxsIGZhdWx0cywgYW5kIHRoZSBlbnRpcmUKKyAgIHJpc2sgb2Ygc2F0aXNmYWN0b3J5IHF1YWxpdHksIHBlcmZvcm1hbmNlLCBhY2N1cmFjeSwgYW5kIGVmZm9ydCBpcyB3aXRoCisgICB0aGUgdXNlci4KKworbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuOTYsCit3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisKKyAgIFRvbSBMYW5lCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAgIFdpbGxlbSB2YW4gU2NoYWlrCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjg5LCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTcsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCitEaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMC44OCwKK3dpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKKworICAgSm9obiBCb3dsZXIKKyAgIEtldmluIEJyYWNleQorICAgU2FtIEJ1c2hlbGwKKyAgIE1hZ251cyBIb2xtZ3JlbgorICAgR3JlZyBSb2Vsb2ZzCisgICBUb20gVGFubmVyCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjUsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NiwgYXJlCitDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCisKK0ZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UsICJDb250cmlidXRpbmcgQXV0aG9ycyIKK2lzIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZyBzZXQgb2YgaW5kaXZpZHVhbHM6CisKKyAgIEFuZHJlYXMgRGlsZ2VyCisgICBEYXZlIE1hcnRpbmRhbGUKKyAgIEd1eSBFcmljIFNjaGFsbmF0CisgICBQYXVsIFNjaG1pZHQKKyAgIFRpbSBXZWduZXIKKworVGhlIFBORyBSZWZlcmVuY2UgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzCithbmQgR3JvdXAgNDIsIEluYy4gZGlzY2xhaW0gYWxsIHdhcnJhbnRpZXMsIGV4cHJlc3NlZCBvciBpbXBsaWVkLAoraW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgb2YKK2ZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLgorYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCB3aGljaCBtYXkgcmVzdWx0IGZyb20gdGhlIHVzZSBvZiB0aGUgUE5HCitSZWZlcmVuY2UgTGlicmFyeSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc291cmNlIGNvZGUsIG9yIHBvcnRpb25zIGhlcmVvZiwgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdAordG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKzEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZC4KKworMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kIG11c3Qgbm90CisgICBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLgorCiszLiBUaGlzIENvcHlyaWdodCBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkKKyAgIHNvdXJjZSBvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb24uCisKK1RoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4gc3BlY2lmaWNhbGx5IHBlcm1pdCwgd2l0aG91dAorZmVlLCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBhcyBhIGNvbXBvbmVudCB0bworc3VwcG9ydGluZyB0aGUgUE5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMKK3NvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgaXMgbm90IHJlcXVpcmVkIGJ1dCB3b3VsZCBiZQorYXBwcmVjaWF0ZWQuCisKKworQSAicG5nX2dldF9jb3B5cmlnaHQiIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgZm9yIGNvbnZlbmllbnQgdXNlIGluICJhYm91dCIKK2JveGVzIGFuZCB0aGUgbGlrZToKKworICAgcHJpbnRmKCIlcyIscG5nX2dldF9jb3B5cmlnaHQoTlVMTCkpOworCitBbHNvLCB0aGUgUE5HIGxvZ28gKGluIFBORyBmb3JtYXQsIG9mIGNvdXJzZSkgaXMgc3VwcGxpZWQgaW4gdGhlCitmaWxlcyAicG5nYmFyLnBuZyIgYW5kICJwbmdiYXIuanBnICg4OHgzMSkgYW5kICJwbmdub3cucG5nIiAoOTh4MzEpLgorCitMaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgaXMgYQorY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCitHbGVubiBSYW5kZXJzLVBlaHJzb24KK2dsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0CitKdW5lIDI2LCAyMDEwCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL1JFQURNRSBiL2NvbTMyL2xpYi9saWJwbmcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmN2FjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGlicG5nL1JFQURNRQpAQCAtMCwwICsxLDI3NSBAQAorUkVBRE1FIGZvciBsaWJwbmcgdmVyc2lvbiAxLjIuNDQgLSBKdW5lIDI2LCAyMDEwIChzaGFyZWQgbGlicmFyeSAxMi4wKQorU2VlIHRoZSBub3RlIGFib3V0IHZlcnNpb24gbnVtYmVycyBuZWFyIHRoZSB0b3Agb2YgcG5nLmgKKworU2VlIElOU1RBTEwgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gaW5zdGFsbCBsaWJwbmcuCisKK0xpYnBuZyBjb21lcyBpbiBzZXZlcmFsIGRpc3RyaWJ1dGlvbiBmb3JtYXRzLiAgR2V0IGxpYnBuZy0qLnRhci5neiwKK2xpYnBuZy0qLnRhci54eiwgb3IgbGlicG5nLSoudGFyLmJ6MiBpZiB5b3Ugd2FudCBVTklYLXN0eWxlIGxpbmUKK2VuZGluZ3MgaW4gdGhlIHRleHQgZmlsZXMsIG9yIGxwbmcqLjd6IG9yIGxwbmcqLnppcCBpZiB5b3Ugd2FudCBET1Mtc3R5bGUKK2xpbmUgZW5kaW5ncy4gIFlvdSBjYW4gZ2V0IFVOSVgtc3R5bGUgbGluZSBlbmRpbmdzIGZyb20gdGhlICouemlwIGZpbGUKK2J5IHVzaW5nICJ1bnppcCAtYSIgYnV0IHRoZXJlIHNlZW1zIHRvIGJlIG5vIHNpbXBsZSB3YXkgdG8gcmVjb3ZlcgorVU5JWC1zdHlsZSBsaW5lIGVuZGluZ3MgZnJvbSB0aGUgKi43eiBmaWxlLiAgVGhlICoudGFyLnh6IGZpbGUgaXMKK3JlY29tbWVuZGVkIGZvciAqTklYIHVzZXJzIGluc3RlYWQuCisKK1ZlcnNpb24gMC44OSB3YXMgdGhlIGZpcnN0IG9mZmljaWFsIHJlbGVhc2Ugb2YgbGlicG5nLiAgRG9uJ3QgbGV0IHRoZQorZmFjdCB0aGF0IGl0J3MgdGhlIGZpcnN0IHJlbGVhc2UgZm9vbCB5b3UuICBUaGUgbGlicG5nIGxpYnJhcnkgaGFzIGJlZW4gaW4KK2V4dGVuc2l2ZSB1c2UgYW5kIHRlc3Rpbmcgc2luY2UgbWlkLTE5OTUuICBCeSBsYXRlIDE5OTcgaXQgaGFkCitmaW5hbGx5IGdvdHRlbiB0byB0aGUgc3RhZ2Ugd2hlcmUgdGhlcmUgaGFkbid0IGJlZW4gc2lnbmlmaWNhbnQKK2NoYW5nZXMgdG8gdGhlIEFQSSBpbiBzb21lIHRpbWUsIGFuZCBwZW9wbGUgaGF2ZSBhIGJhZCBmZWVsaW5nIGFib3V0CitsaWJyYXJpZXMgd2l0aCB2ZXJzaW9ucyA8IDEuMC4gIFZlcnNpb24gMS4wLjAgd2FzIHJlbGVhc2VkIGluCitNYXJjaCAxOTk4LgorCisqKioqCitOb3RlIHRoYXQgc29tZSBvZiB0aGUgY2hhbmdlcyB0byB0aGUgcG5nX2luZm8gc3RydWN0dXJlIHJlbmRlciB0aGlzCit2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBsaWJwbmctMC44OSBvcgorZWFybGllciB2ZXJzaW9ucyBpZiB5b3UgYXJlIHVzaW5nIGEgc2hhcmVkIGxpYnJhcnkuICBUaGUgdHlwZSBvZiB0aGUKKyJmaWxsZXIiIHBhcmFtZXRlciBmb3IgcG5nX3NldF9maWxsZXIoKSBoYXMgY2hhbmdlZCBmcm9tIHBuZ19ieXRlIHRvCitwbmdfdWludF8zMiwgd2hpY2ggd2lsbCBhZmZlY3Qgc2hhcmVkLWxpYnJhcnkgYXBwbGljYXRpb25zIHRoYXQgdXNlCit0aGlzIGZ1bmN0aW9uLgorCitUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIGNoYW5nZXMgdG8gdGhlIGludGVybmFscyBvZiBwbmdfaW5mb19zdHJ1Y3QsCituZXcgQVBJcyBoYXZlIGJlZW4gbWFkZSBhdmFpbGFibGUgaW4gMC45NSB0byBhdm9pZCBkaXJlY3QgYXBwbGljYXRpb24KK2FjY2VzcyB0byBpbmZvX3B0ci4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlIHBuZ19zZXRfPGNodW5rPiBhbmQKK3BuZ19nZXRfPGNodW5rPiBmdW5jdGlvbnMuICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgd2hlbgorYWNjZXNzaW5nL3N0b3JpbmcgdGhlIGluZm9fc3RydWN0IGRhdGEsIHJhdGhlciB0aGFuIG1hbmlwdWxhdGluZyBpdAorZGlyZWN0bHksIHRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMgaW4gdGhlIGZ1dHVyZS4KKworSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgQVBJcyBkbyBub3QgbWFrZSBjdXJyZW50IHByb2dyYW1zCit0aGF0IGFjY2VzcyB0aGUgaW5mbyBzdHJ1Y3QgZGlyZWN0bHkgaW5jb21wYXRpYmxlIHdpdGggdGhlIG5ldworbGlicmFyeS4gIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0IG5ldyBwcm9ncmFtcyB1c2UKK3RoZSBuZXcgQVBJcyAoYXMgc2hvd24gaW4gZXhhbXBsZS5jIGFuZCBwbmd0ZXN0LmMpLCBhbmQgb2xkZXIgcHJvZ3JhbXMKK2JlIGNvbnZlcnRlZCB0byB0aGUgbmV3IGZvcm1hdCwgdG8gZmFjaWxpdGF0ZSB1cGdyYWRlcyBpbiB0aGUgZnV0dXJlLgorKioqKgorCitBZGRpdGlvbnMgc2luY2UgMC45MCBpbmNsdWRlIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgbGlicG5nIGFzIGEKK1dpbmRvd3MgRExMLCBhbmQgbmV3IEFQSXMgZm9yIGFjY2Vzc2luZyBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdC4KK0V4cGVyaW1lbnRhbCBmdW5jdGlvbnMgaW5jbHVkZSB0aGUgYWJpbGl0eSB0byBzZXQgd2VpZ2h0aW5nIGFuZCBjb3N0CitmYWN0b3JzIGZvciByb3cgZmlsdGVyIHNlbGVjdGlvbiwgZGlyZWN0IHJlYWRzIG9mIGludGVnZXJzIGZyb20gYnVmZmVycworb24gYmlnLWVuZGlhbiBwcm9jZXNzb3JzIHRoYXQgc3VwcG9ydCBtaXNhbGlnbmVkIGRhdGEgYWNjZXNzLCBmYXN0ZXIKK21ldGhvZHMgb2YgZG9pbmcgYWxwaGEgY29tcG9zaXRpb24sIGFuZCBtb3JlIGFjY3VyYXRlIDE2LT44IGJpdCBjb2xvcgorY29udmVyc2lvbi4KKworVGhlIGFkZGl0aW9ucyBzaW5jZSAwLjg5IGluY2x1ZGUgdGhlIGFiaWxpdHkgdG8gcmVhZCBmcm9tIGEgUE5HIHN0cmVhbQord2hpY2ggaGFzIGhhZCBzb21lIChvciBhbGwpIG9mIHRoZSBzaWduYXR1cmUgYnl0ZXMgcmVhZCBieSB0aGUgY2FsbGluZworYXBwbGljYXRpb24uICBUaGlzIGFsc28gYWxsb3dzIHRoZSByZWFkaW5nIG9mIGVtYmVkZGVkIFBORyBzdHJlYW1zIHRoYXQKK2RvIG5vdCBoYXZlIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUuICBBcyB3ZWxsLCBpdCBpcyBub3cgcG9zc2libGUgdG8gc2V0Cit0aGUgbGlicmFyeSBhY3Rpb24gb24gdGhlIGRldGVjdGlvbiBvZiBjaHVuayBDUkMgZXJyb3JzLiAgSXQgaXMgcG9zc2libGUKK3RvIHNldCBkaWZmZXJlbnQgYWN0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBDUkMgZXJyb3Igb2NjdXJyZWQgaW4gYQorY3JpdGljYWwgb3IgYW4gYW5jaWxsYXJ5IGNodW5rLgorCitUaGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBsaWJyYXJ5LCBhbmQgYnVncyBmaXhlZCBhcmUgYmFzZWQgb24gZGlzY3Vzc2lvbnMKK29uIHRoZSBwbmctbW5nLWltcGxlbWVudCBtYWlsaW5nIGxpc3QgYW5kIG5vdCBvbiBtYXRlcmlhbCBzdWJtaXR0ZWQKK3ByaXZhdGVseSB0byBHdXksIEFuZHJlYXMsIG9yIEdsZW5uLiAgVGhleSB3aWxsIGZvcndhcmQgYW55IGdvb2QKK3N1Z2dlc3Rpb25zIHRvIHRoZSBsaXN0LgorCitGb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiB1c2luZyBsaWJwbmcsIHJlYWQgbGlicG5nLnR4dC4gIEZvcgorZXhhbXBsZXMgb2YgbGlicG5nIGluIGEgcHJvZ3JhbSwgc2VlIGV4YW1wbGUuYyBhbmQgcG5ndGVzdC5jLiAgRm9yIHVzYWdlCitpbmZvcm1hdGlvbiBhbmQgcmVzdHJpY3Rpb25zICh3aGF0IGxpdHRsZSB0aGV5IGFyZSkgb24gbGlicG5nLCBzZWUKK3BuZy5oLiAgRm9yIGEgZGVzY3JpcHRpb24gb24gdXNpbmcgemxpYiAodGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgdXNlZCBieQorbGlicG5nKSBhbmQgemxpYidzIHJlc3RyaWN0aW9ucywgc2VlIHpsaWIuaAorCitJIGhhdmUgaW5jbHVkZWQgYSBnZW5lcmFsIG1ha2VmaWxlLCBhcyB3ZWxsIGFzIHNldmVyYWwgbWFjaGluZSBhbmQKK2NvbXBpbGVyIHNwZWNpZmljIG9uZXMsIGJ1dCB5b3UgbWF5IGhhdmUgdG8gbW9kaWZ5IG9uZSBmb3IgeW91ciBvd24gbmVlZHMuCisKK1lvdSBzaG91bGQgdXNlIHpsaWIgMS4wLjQgb3IgbGF0ZXIgdG8gcnVuIHRoaXMsIGJ1dCBpdCBNQVkgd29yayB3aXRoCit2ZXJzaW9ucyBhcyBvbGQgYXMgemxpYiAwLjk1LiAgRXZlbiBzbywgdGhlcmUgYXJlIGJ1Z3MgaW4gb2xkZXIgemxpYgordmVyc2lvbnMgd2hpY2ggY2FuIGNhdXNlIHRoZSBvdXRwdXQgb2YgaW52YWxpZCBjb21wcmVzc2lvbiBzdHJlYW1zIGZvcgorc29tZSBpbWFnZXMuICBZb3Ugd2lsbCBkZWZpbml0ZWx5IG5lZWQgemxpYiAxLjAuNCBvciBsYXRlciBpZiB5b3UgYXJlCit0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBNUy1ET1MgImZhciIgc3RydWN0dXJlIGFsbG9jYXRpb24gZm9yIHRoZSBzbWFsbAorYW5kIG1lZGl1bSBtZW1vcnkgbW9kZWxzLiAgWW91IHNob3VsZCBhbHNvIG5vdGUgdGhhdCB6bGliIGlzIGEKK2NvbXByZXNzaW9uIGxpYnJhcnkgdGhhdCBpcyB1c2VmdWwgZm9yIG1vcmUgdGhpbmdzIHRoYW4ganVzdCBQTkcgZmlsZXMuCitZb3UgY2FuIHVzZSB6bGliIGFzIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgZnJlYWQoKSBhbmQgZndyaXRlKCkgaWYKK3lvdSBhcmUgc28gaW5jbGluZWQuCisKK3psaWIgc2hvdWxkIGJlIGF2YWlsYWJsZSBhdCB0aGUgc2FtZSBwbGFjZSB0aGF0IGxpYnBuZyBpcywgb3IgYXQKK2Z0cDovL2Z0cC5zaW1wbGVzeXN0ZW1zLm9yZy9wdWIvcG5nL3NyYy8KKworWW91IG1heSBhbHNvIHdhbnQgYSBjb3B5IG9mIHRoZSBQTkcgc3BlY2lmaWNhdGlvbi4gIEl0IGlzIGF2YWlsYWJsZQorYXMgYW4gUkZDLCBhIFczQyBSZWNvbW1lbmRhdGlvbiwgYW5kIGFuIElTTy9JRUMgU3RhbmRhcmQuICBZb3UgY2FuIGZpbmQKK3RoZXNlIGF0IGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL3BuZ2RvY3MuaHRtbAorCitUaGlzIGNvZGUgaXMgY3VycmVudGx5IGJlaW5nIGFyY2hpdmVkIGF0IGxpYnBuZy5zZi5uZXQgaW4gdGhlCitbRE9XTkxPQURdIGFyZWEsIGFuZCBvbiBDb21wdVNlcnZlLCBMaWIgMjAgKFBORyBTVVBQT1JUKQorYXQgR08gR1JBUEhTVVAuICBJZiB5b3UgY2FuJ3QgZmluZCBpdCBpbiBhbnkgb2YgdGhvc2UgcGxhY2VzLAorZS1tYWlsIG1lLCBhbmQgSSdsbCBoZWxwIHlvdSBmaW5kIGl0LgorCitJZiB5b3UgaGF2ZSBhbnkgY29kZSBjaGFuZ2VzLCByZXF1ZXN0cywgcHJvYmxlbXMsIGV0Yy4sIHBsZWFzZSBlLW1haWwKK3RoZW0gdG8gbWUuICBBbHNvLCBJJ2QgYXBwcmVjaWF0ZSBhbnkgbWFrZSBmaWxlcyBvciBwcm9qZWN0IGZpbGVzLAorYW5kIGFueSBtb2RpZmljYXRpb25zIHlvdSBuZWVkZWQgdG8gbWFrZSB0byBnZXQgbGlicG5nIHRvIGNvbXBpbGUsCithbG9uZyB3aXRoIGEgI2RlZmluZSB2YXJpYWJsZSB0byB0ZWxsIHdoYXQgY29tcGlsZXIvc3lzdGVtIHlvdSBhcmUgb24uCitJZiB5b3UgbmVlZGVkIHRvIGFkZCB0cmFuc2Zvcm1hdGlvbnMgdG8gbGlicG5nLCBvciB3aXNoIGxpYnBuZyB3b3VsZAorcHJvdmlkZSB0aGUgaW1hZ2UgaW4gYSBkaWZmZXJlbnQgd2F5LCBkcm9wIG1lIGEgbm90ZSAoYW5kIGNvZGUsIGlmCitwb3NzaWJsZSksIHNvIEkgY2FuIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHRyYW5zZm9ybWF0aW9uLgorRmluYWxseSwgaWYgeW91IGdldCBhbnkgd2FybmluZyBtZXNzYWdlcyB3aGVuIGNvbXBpbGluZyBsaWJwbmcKKyhub3RlOiBub3QgemxpYiksIGFuZCB0aGV5IGFyZSBlYXN5IHRvIGZpeCwgSSdkIGFwcHJlY2lhdGUgdGhlCitmaXguICBQbGVhc2UgbWVudGlvbiAibGlicG5nIiBzb21ld2hlcmUgaW4gdGhlIHN1YmplY3QgbGluZS4gIFRoYW5rcy4KKworVGhpcyByZWxlYXNlIHdhcyBjcmVhdGVkIGFuZCB3aWxsIGJlIHN1cHBvcnRlZCBieSBteXNlbGYgKG9mIGNvdXJzZQorYmFzZWQgaW4gYSBsYXJnZSB3YXkgb24gR3V5J3MgYW5kIEFuZHJlYXMnIGVhcmxpZXIgd29yayksIGFuZCB0aGUgUE5HCitkZXZlbG9wbWVudCBncm91cC4KKworU2VuZCBjb21tZW50cy9jb3JyZWN0aW9ucy9jb21tZW5kYXRpb25zIHRvIHBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldAorKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQgCitodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9wbmctbW5nLWltcGxlbWVudAordG8gc3Vic2NyaWJlKSBvciB0byBnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorCitZb3UgY2FuJ3QgcmVhY2ggR3V5LCB0aGUgb3JpZ2luYWwgbGlicG5nIGF1dGhvciwgYXQgdGhlIGFkZHJlc3NlcworZ2l2ZW4gaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBkb2N1bWVudC4gIEhlIGFuZCBBbmRyZWFzIHdpbGwKK3JlYWQgbWFpbCBhZGRyZXNzZWQgdG8gdGhlIHBuZy1tbmctaW1wbGVtZW50IGxpc3QsIGhvd2V2ZXIuCisKK1BsZWFzZSBkbyBub3Qgc2VuZCBnZW5lcmFsIHF1ZXN0aW9ucyBhYm91dCBQTkcuICBTZW5kIHRoZW0gdG8KK3RoZSAocG5nLW1uZy1taXNjIGF0IGxpc3RzLnNvdXJjZWZvcmdlLm5ldCwgc3Vic2NyaXB0aW9uIHJlcXVpcmVkLCB2aXNpdAoraHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vcG5nLW1uZy1taXNjIHRvCitzdWJzY3JpYmUpLiBPbiB0aGUgb3RoZXIgaGFuZCwgcGxlYXNlIGRvIG5vdCBzZW5kIGxpYnBuZyBxdWVzdGlvbnMgdG8KK3RoYXQgYWRkcmVzcywgc2VuZCB0aGVtIHRvIG1lIG9yIHRvIHRoZSBwbmctbW5nLWltcGxlbWVudCBsaXN0LiAgSSdsbAorZ2V0IHRoZW0gaW4gdGhlIGVuZCBhbnl3YXkuICBJZiB5b3UgaGF2ZSBhIHF1ZXN0aW9uIGFib3V0IHNvbWV0aGluZworaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgcmVsYXRlZCB0byB1c2luZyBsaWJwbmcsIHNlbmQgaXQKK3RvIG1lLiAgU2VuZCBtZSBhbnkgcXVlc3Rpb25zIHRoYXQgc3RhcnQgd2l0aCAiSSB3YXMgdXNpbmcgbGlicG5nLAorYW5kIC4uLiIuICBJZiBpbiBkb3VidCwgc2VuZCBxdWVzdGlvbnMgdG8gbWUuICBJJ2xsIGJvdW5jZSB0aGVtCit0byBvdGhlcnMsIGlmIG5lY2Vzc2FyeS4KKworUGxlYXNlIGRvIG5vdCBzZW5kIHN1Z2dlc3Rpb25zIG9uIGhvdyB0byBjaGFuZ2UgUE5HLiAgV2UgaGF2ZQorYmVlbiBkaXNjdXNzaW5nIFBORyBmb3IgdHdlbHZlIHllYXJzIG5vdywgYW5kIGl0IGlzIG9mZmljaWFsIGFuZAorZmluaXNoZWQuICBJZiB5b3UgaGF2ZSBzdWdnZXN0aW9ucyBmb3IgbGlicG5nLCBob3dldmVyLCBJJ2xsCitnbGFkbHkgbGlzdGVuLiAgRXZlbiBpZiB5b3VyIHN1Z2dlc3Rpb24gaXMgbm90IHVzZWQgaW1tZWRpYXRlbHksCitpdCBtYXkgYmUgdXNlZCBsYXRlci4KKworRmlsZXMgaW4gdGhpcyBkaXN0cmlidXRpb246CisKKyAgICAgIEFOTk9VTkNFICAgICAgPT4gIEFubm91bmNlbWVudCBvZiB0aGlzIHZlcnNpb24sIHdpdGggcmVjZW50IGNoYW5nZXMKKyAgICAgIENIQU5HRVMgICAgICAgPT4gIERlc2NyaXB0aW9uIG9mIGNoYW5nZXMgYmV0d2VlbiBsaWJwbmcgdmVyc2lvbnMKKyAgICAgIEtOT1dOQlVHICAgICAgPT4gIExpc3Qgb2Yga25vd24gYnVncyBhbmQgZGVmaWNpZW5jaWVzCisgICAgICBMSUNFTlNFICAgICAgID0+ICBMaWNlbnNlIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIGxpYnBuZworICAgICAgUkVBRE1FICAgICAgICA9PiAgVGhpcyBmaWxlCisgICAgICBUT0RPICAgICAgICAgID0+ICBUaGluZ3Mgbm90IGltcGxlbWVudGVkIGluIHRoZSBjdXJyZW50IGxpYnJhcnkKKyAgICAgIFkyS0lORk8gICAgICAgPT4gIFN0YXRlbWVudCBvZiBZMksgY29tcGxpYW5jZQorICAgICAgZXhhbXBsZS5jICAgICA9PiAgRXhhbXBsZSBjb2RlIGZvciB1c2luZyBsaWJwbmcgZnVuY3Rpb25zCisgICAgICBsaWJwbmctKi0qLWRpZmYudHh0ID0+IERpZmYgZnJvbSBwcmV2aW91cyByZWxlYXNlCisgICAgICBsaWJwbmcuMyAgICAgID0+ICBtYW51YWwgcGFnZSBmb3IgbGlicG5nIChpbmNsdWRlcyBsaWJwbmcudHh0KQorICAgICAgbGlicG5nLnR4dCAgICA9PiAgRGVzY3JpcHRpb24gb2YgbGlicG5nIGFuZCBpdHMgZnVuY3Rpb25zCisgICAgICBsaWJwbmdwZi4zICAgID0+ICBtYW51YWwgcGFnZSBmb3IgbGlicG5nJ3MgcHJpdmF0ZSBmdW5jdGlvbnMKKyAgICAgIHBuZy41ICAgICAgICAgPT4gIG1hbnVhbCBwYWdlIGZvciB0aGUgUE5HIGZvcm1hdAorICAgICAgcG5nLmMgICAgICAgICA9PiAgQmFzaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucyBjb21tb24gdG8gbGlicmFyeQorICAgICAgcG5nLmggICAgICAgICA9PiAgTGlicmFyeSBmdW5jdGlvbiBhbmQgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucworICAgICAgcG5nY29uZi5oICAgICA9PiAgU3lzdGVtIHNwZWNpZmljIGxpYnJhcnkgY29uZmlndXJhdGlvbgorICAgICAgcG5nZXJyb3IuYyAgICA9PiAgRXJyb3Ivd2FybmluZyBtZXNzYWdlIEkvTyBmdW5jdGlvbnMKKyAgICAgIHBuZ2dldC5jICAgICAgPT4gIEZ1bmN0aW9ucyBmb3IgcmV0cmlldmluZyBpbmZvIGZyb20gc3RydWN0CisgICAgICBwbmdtZW0uYyAgICAgID0+ICBNZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgICAgICBwbmdiYXIucG5nICAgID0+ICBQTkcgbG9nbywgODh4MzEKKyAgICAgIHBuZ25vdy5wbmcgICAgPT4gIFBORyBsb2dvLCA5OHgzMQorICAgICAgcG5ncHJlYWQuYyAgICA9PiAgUHJvZ3Jlc3NpdmUgcmVhZGluZyBmdW5jdGlvbnMKKyAgICAgIHBuZ3JlYWQuYyAgICAgPT4gIFJlYWQgZGF0YS9oZWxwZXIgaGlnaC1sZXZlbCBmdW5jdGlvbnMKKyAgICAgIHBuZ3Jpby5jICAgICAgPT4gIExvd2VzdC1sZXZlbCBkYXRhIHJlYWQgSS9PIGZ1bmN0aW9ucworICAgICAgcG5ncnRyYW4uYyAgICA9PiAgUmVhZCBkYXRhIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucworICAgICAgcG5ncnV0aWwuYyAgICA9PiAgUmVhZCBkYXRhIHV0aWxpdHkgZnVuY3Rpb25zCisgICAgICBwbmdzZXQuYyAgICAgID0+ICBGdW5jdGlvbnMgZm9yIHN0b3JpbmcgZGF0YSBpbnRvIHRoZSBpbmZvX3N0cnVjdAorICAgICAgcG5ndGVzdC5jICAgICA9PiAgTGlicmFyeSB0ZXN0IHByb2dyYW0KKyAgICAgIHBuZ3Rlc3QucG5nICAgPT4gIExpYnJhcnkgdGVzdCBzYW1wbGUgaW1hZ2UKKyAgICAgIHBuZ3RyYW5zLmMgICAgPT4gIENvbW1vbiBkYXRhIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucworICAgICAgcG5nd2lvLmMgICAgICA9PiAgTG93ZXN0LWxldmVsIHdyaXRlIEkvTyBmdW5jdGlvbnMKKyAgICAgIHBuZ3dyaXRlLmMgICAgPT4gIEhpZ2gtbGV2ZWwgd3JpdGUgZnVuY3Rpb25zCisgICAgICBwbmd3dHJhbi5jICAgID0+ICBXcml0ZSBkYXRhIHRyYW5zZm9ybWF0aW9ucworICAgICAgcG5nd3V0aWwuYyAgICA9PiAgV3JpdGUgdXRpbGl0eSBmdW5jdGlvbnMKKyAgICAgIGNvbnRyaWIgICAgICAgPT4gIENvbnRyaWJ1dGlvbnMKKyAgICAgICBncmVnYm9vayAgICAgICAgID0+ICBzb3VyY2UgY29kZSBmb3IgUE5HIHJlYWRpbmcgYW5kIHdyaXRpbmcsIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmVnIFJvZWxvZnMnICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPJ1JlaWxseSwgMTk5OQorICAgICAgIG1zdmN0ZXN0ICAgICA9PiAgQnVpbGRzIGFuZCBydW5zIHBuZ3Rlc3QgdXNpbmcgYSBNU1ZDIHdvcmtzcGFjZQorICAgICAgIHBuZ21pbmltICAgICA9PiAgU2ltcGxlIHBubTJwbmdtIGFuZCBwbmcycG5tbSBwcm9ncmFtcworICAgICAgIHBuZ21pbnVzICAgICA9PiAgU2ltcGxlIHBubTJwbmcgYW5kIHBuZzJwbm0gcHJvZ3JhbXMKKyAgICAgICBwbmdzdWl0ZSAgICAgPT4gIFRlc3QgaW1hZ2VzCisgICAgICAgdmlzdXBuZyAgICAgID0+ICBDb250YWlucyBhIE1TVkMgd29ya3NwYWNlIGZvciBWaXN1YWxQbmcKKyAgICAgIHByb2plY3RzICAgICAgPT4gIENvbnRhaW5zIHByb2plY3QgZmlsZXMgYW5kIHdvcmtzcGFjZXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGluZyBhIERMTAorICAgICAgIGJlb3MgICAgICAgICAgICAgPT4gIENvbnRhaW5zIGEgQmVvcyB3b3Jrc3BhY2UgZm9yIGJ1aWxkaW5nIGxpYnBuZworICAgICAgIGM1YnVpbGRlciAgICAgICAgPT4gIENvbnRhaW5zIGEgQm9ybGFuZCB3b3Jrc3BhY2UgZm9yIGJ1aWxkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicG5nIGFuZCB6bGliCisgICAgICAgbmV0d2FyZS50eHQgICAgICA9PiAgQ29udGFpbnMgaW5zdHJ1Y3Rpb25zIGZvciBkb3dubG9hZGluZyBhIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHByb2plY3QgZmlsZXMgZm9yIGJ1aWxkaW5nIGxpYnBuZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliIG9uIE5ldHdhcmUuCisgICAgICAgdmlzdWFsYzYgICAgICAgICA9PiAgQ29udGFpbnMgYSBNaWNyb3NvZnQgVmlzdWFsIEMrKyAoTVNWQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc3BhY2UgZm9yIGJ1aWxkaW5nIGxpYnBuZyBhbmQgemxpYgorICAgICAgIHdpbmNlLnR4dCAgICAgICAgPT4gIENvbnRhaW5zIGluc3RydWN0aW9ucyBmb3IgZG93bmxvYWRpbmcgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIChXaW5kb3dzIENEIFRvb2xraXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlIGZvciBidWlsZGluZyBsaWJwbmcgYW5kIHpsaWIgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dzQ0UKKyAgICAgICB4Y29kZSAgICAgICAgICAgID0+ICBDb250YWlucyB4Y29kZSBwcm9qZWN0IGZpbGVzCisgICAgICBzY3JpcHRzICAgICAgID0+ICBEaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzIGZvciBidWlsZGluZyBsaWJwbmc6CisgICAgICAgZGVzY3JpcC5tbXMgICAgICA9PiAgVk1TIG1ha2VmaWxlIGZvciBNTVMgb3IgTU1LCisgICAgICAgbWFrZWZpbGUuc3RkICAgICA9PiAgR2VuZXJpYyBVTklYIG1ha2VmaWxlIChjYywgY3JlYXRlcyBzdGF0aWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJwbmcuYSkKKyAgICAgICBtYWtlZmlsZS5lbGYgICAgID0+ICBMaW51eC9FTEYgZ2NjIG1ha2VmaWxlIHN5bWJvbCB2ZXJzaW9uaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgbGlicG5nMTIuc28uMC4xLjIuNDQpCisgICAgICAgbWFrZWZpbGUubGludXggICA9PiAgTGludXgvRUxGIG1ha2VmaWxlIChnY2MsIGNyZWF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJwbmcxMi5zby4wLjEuMi40NCkKKyAgICAgICBtYWtlZmlsZS5nY21teCAgID0+ICBMaW51eC9FTEYgbWFrZWZpbGUgKGdjYywgY3JlYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBuZzEyLnNvLjAuMS4yLjQ0LCBwcmV2aW91c2x5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBhc3NlbWJsZXIgY29kZSB0dW5lZCBmb3IgSW50ZWwgTU1YCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0pCisgICAgICAgbWFrZWZpbGUuZ2NjICAgICA9PiAgR2VuZXJpYyBtYWtlZmlsZSAoZ2NjLCBjcmVhdGVzIHN0YXRpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBuZy5hKQorICAgICAgIG1ha2VmaWxlLmtuciAgICAgPT4gIEFyY2hhaWMgVU5JWCBNYWtlZmlsZSB0aGF0IGNvbnZlcnRzIGZpbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbnNpMmtuciAoUmVxdWlyZXMgYW5zaTJrbnIuYyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwOi8vZnRwLmNzLndpc2MuZWR1L2dob3N0KQorICAgICAgIG1ha2VmaWxlLmFpeCAgICAgPT4gIEFJWCBtYWtlZmlsZQorICAgICAgIG1ha2VmaWxlLmN5Z3dpbiAgPT4gIEN5Z3dpbi9nY2MgbWFrZWZpbGUKKyAgICAgICBtYWtlZmlsZS5kYXJ3aW4gID0+ICBEYXJ3aW4gbWFrZWZpbGUKKyAgICAgICBtYWtlZmlsZS5kZWMgICAgID0+ICBERUMgQWxwaGEgVU5JWCBtYWtlZmlsZQorICAgICAgIG1ha2VmaWxlLmZyZWVic2QgPT4gIEZyZWVCU0QgbWFrZWZpbGUKKyAgICAgICBtYWtlZmlsZS5ocGdjYyAgID0+ICBIUFVYIG1ha2VmaWxlIHVzaW5nIGdjYworICAgICAgIG1ha2VmaWxlLmhwdXggICAgPT4gIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgbWFrZWZpbGUKKyAgICAgICBtYWtlZmlsZS5ocDY0ICAgID0+ICBIUFVYICgxMC4yMCBhbmQgMTEuMDApIG1ha2VmaWxlLCA2NCBiaXQKKyAgICAgICBtYWtlZmlsZS5pYm1jICAgID0+ICBJQk0gQy9DKysgdmVyc2lvbiAzLnggZm9yIFdpbjMyIGFuZCBPUy8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpYykKKyAgICAgICBtYWtlZmlsZS5pbnRlbCAgID0+ICBJbnRlbCBDL0MrKyB2ZXJzaW9uIDQuMCBhbmQgbGF0ZXIKKyAgICAgICBsaWJwbmcuaWNjICAgICAgID0+ICBQcm9qZWN0IGZpbGUsIElCTSBWaXN1YWxBZ2UvQysrIDQuMCBvciBsYXRlcgorICAgICAgIG1ha2VmaWxlLm5ldGJzZCAgPT4gIE5ldEJTRC9jYyBtYWtlZmlsZSwgbWFrZXMgbGlicG5nLnNvLgorICAgICAgIG1ha2VmaWxlLm5lMTJic2QgID0+ICBOZXRCU0QvY2MgbWFrZWZpbGUsIG1ha2VzIGxpYnBuZzEyLnNvCisgICAgICAgbWFrZWZpbGUub3BlbmJzZCA9PiAgT3BlbkJTRCBtYWtlZmlsZQorICAgICAgIG1ha2VmaWxlLnNnaSAgICAgPT4gIFNpbGljb24gR3JhcGhpY3MgSVJJWCAoY2MsIGNyZWF0ZXMgc3RhdGljIGxpYikKKyAgICAgICBtYWtlZmlsZS5zZ2djYyAgID0+ICBTaWxpY29uIEdyYXBoaWNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjYywgY3JlYXRlcyBsaWJwbmcxMi5zby4wLjEuMi40NCkKKyAgICAgICBtYWtlZmlsZS5zdW5vcyAgID0+ICBTdW4gbWFrZWZpbGUKKyAgICAgICBtYWtlZmlsZS5zb2xhcmlzID0+ICBTb2xhcmlzIDIuWCBtYWtlZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnY2MsIGNyZWF0ZXMgbGlicG5nMTIuc28uMC4xLjIuNDQpCisgICAgICAgbWFrZWZpbGUuc285ICAgICA9PiAgU29sYXJpcyA5IG1ha2VmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjYywgY3JlYXRlcyBsaWJwbmcxMi5zby4wLjEuMi40NCkKKyAgICAgICBtYWtlZmlsZS4zMnN1bnUgID0+ICBTdW4gVWx0cmEgMzItYml0IG1ha2VmaWxlCisgICAgICAgbWFrZWZpbGUuNjRzdW51ICA9PiAgU3VuIFVsdHJhIDY0LWJpdCBtYWtlZmlsZQorICAgICAgIG1ha2VmaWxlLnNjbyAgICAgPT4gIEZvciBTQ08gT1NyNSAgRUxGIGFuZCBVbml4d2FyZSA3IHdpdGggTmF0aXZlIGNjCisgICAgICAgbWFrZWZpbGUubWlwcyAgICA9PiAgTUlQUyBtYWtlZmlsZQorICAgICAgIG1ha2VmaWxlLmFjb3JuICAgPT4gIEFjb3JuIG1ha2VmaWxlCisgICAgICAgbWFrZWZpbGUuYW1pZ2EgICA9PiAgQW1pZ2EgbWFrZWZpbGUKKyAgICAgICBzbWFrZWZpbGUucHBjICAgID0+ICBBTUlHQSBzbWFrZWZpbGUgZm9yIFNBUyBDIFY2LjU4LzcuMDAgUFBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIgKFJlcXVpcmVzIFNDT1BUSU9OUywgY29waWVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzL1NDT1BUSU9OUy5wcGMpCisgICAgICAgbWFrZWZpbGUuYXRhcmkgICA9PiAgQXRhcmkgbWFrZWZpbGUKKyAgICAgICBtYWtlZmlsZS5iZW9zICAgID0+ICBCRU9TIG1ha2VmaWxlIGZvciBYODYKKyAgICAgICBtYWtlZmlsZS5ib3IgICAgID0+ICBCb3JsYW5kIG1ha2VmaWxlICh1c2VzIGJjYykKKyAgICAgICBtYWtlZmlsZS5iYzMyICAgID0+ICAzMi1iaXQgQm9ybGFuZCBDKysgKGFsbCBtb2R1bGVzIGNvbXBpbGVkIGluIEMgbW9kZSkKKyAgICAgICBtYWtlZmlsZS50YzMgICAgID0+ICBUdXJibyBDIDMuMCBtYWtlZmlsZQorICAgICAgIG1ha2VmaWxlLmRqMiAgICAgPT4gIERKR1BQIDIgbWFrZWZpbGUKKyAgICAgICBtYWtlZmlsZS5tc2MgICAgID0+ICBNaWNyb3NvZnQgQyBtYWtlZmlsZQorICAgICAgIG1ha2VmaWxlLnZjYXdpbjMyPT4gIG1ha2VmaWxlIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyA1LjAgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXIgKHByZXZpb3VzbHkgdXNlZCBhc3NlbWJsZXIgY29kZSB0dW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBJbnRlbCBNTVggcGxhdGZvcm0pCisgICAgICAgbWFrZWZpbGUudmN3aW4zMiA9PiAgbWFrZWZpbGUgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIDQuMCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlciAoZG9lcyBub3QgdXNlIGFzc2VtYmxlciBjb2RlKQorICAgICAgIG1ha2VmaWxlLm9zMiAgICAgPT4gIE9TLzIgTWFrZWZpbGUgKGdjYyBhbmQgZW14LCByZXF1aXJlcyBwbmdvczIuZGVmKQorICAgICAgIHBuZ29zMi5kZWYgICAgICAgPT4gIE9TLzIgbW9kdWxlIGRlZmluaXRpb24gZmlsZSB1c2VkIGJ5IG1ha2VmaWxlLm9zMgorICAgICAgIG1ha2VmaWxlLndhdGNvbSAgPT4gIFdhdGNvbSAxMGErIE1ha2VmaWxlLCAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwKKyAgICAgICBtYWtldm1zLmNvbSAgICAgID0+ICBWTVMgYnVpbGQgc2NyaXB0CisgICAgICAgU0NPUFRJT05TLnBwYyAgICA9PiAgVXNlZCB3aXRoIHNtYWtlZmlsZS5wcGMKKworR29vZCBsdWNrLCBhbmQgaGFwcHkgY29kaW5nLgorCistR2xlbm4gUmFuZGVycy1QZWhyc29uIChjdXJyZW50IG1haW50YWluZXIsIHNpbmNlIDE5OTgpCisgSW50ZXJuZXQ6IGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0CisKKy1BbmRyZWFzIEVyaWMgRGlsZ2VyIChmb3JtZXIgbWFpbnRhaW5lciwgMTk5Ni0xOTk3KQorIEludGVybmV0OiBhZGlsZ2VyIGF0IGVuZWwudWNhbGdhcnkuY2EKKyBXZWI6IGh0dHA6Ly9tZW1iZXJzLnNoYXcuY2EvYWRpbGdlci8KKworLUd1eSBFcmljIFNjaGFsbmF0IChvcmlnaW5hbCBhdXRob3IgYW5kIGZvcm1lciBtYWludGFpbmVyLCAxOTk1LTE5OTYpCisgKGZvcm1lcmx5IG9mIEdyb3VwIDQyLCBJbmMpCisgSW50ZXJuZXQ6IGdzY2hhbCBhdCBpbmZpbmV0LmNvbQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9UT0RPIGIvY29tMzIvbGliL2xpYnBuZy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2U3NjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGlicG5nL1RPRE8KQEAgLTAsMCArMSwyNSBAQAorVE9ETyAtIGxpc3Qgb2YgdGhpbmdzIHRvIGRvIGZvciBsaWJwbmc6CisKK0ZpbmFsIGJ1ZyBmaXhlcy4KK0ltcHJvdmUgQVBJIGJ5IGhpZGluZyB0aGUgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gc3RydWN0cy4KK0ZpbmlzaCB3b3JrIG9uIHRoZSBuby1mbG9hdGluZy1wb2ludCB2ZXJzaW9uIChpbmNsdWRpbmcgZ2FtbWEgY29tcGVuc2F0aW9uKQorQmV0dGVyIEMrKyB3cmFwcGVyL2Z1bGwgQysrIGltcGxlbWVudGF0aW9uPworRml4IHByb2JsZW0gd2l0aCBDKysgYW5kIEVYVEVSTiAiQyIuCitjSFJNIHRyYW5zZm9ybWF0aW9uLgorSW1wcm92ZSBzZXRqbXAvbG9uZ2ptcCB1c2FnZSBvciByZW1vdmUgaXQgaW4gZmF2b3Igb2YgcmV0dXJuaW5nIGVycm9yIGNvZGVzLgorQWRkICJncmF5c2NhbGUtPnBhbGV0dGUiIHRyYW5zZm9ybWF0aW9uIGFuZCAicGFsZXR0ZS0+Z3JheXNjYWxlIiBkZXRlY3Rpb24uCitJbXByb3ZlZCBkaXRoZXJpbmcuCitNdWx0aS1saW5ndWFsIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2Ugc3VwcG9ydC4KK0NvbXBsZXRlIHNSR0IgdHJhbnNmb3JtYXRpb24gKHByZXNlbnRseSBpdCBzaW1wbHkgdXNlcyBnYW1tYT0wLjQ1NDU1KS4KK01hbiBwYWdlcyBmb3IgZnVuY3Rpb24gY2FsbHMuCitCZXR0ZXIgZG9jdW1lbnRhdGlvbi4KK0JldHRlciBmaWx0ZXIgc2VsZWN0aW9uCisgICAoY291bnRpbmcgaHVmZm1hbiBiaXRzL3ByZWNvbXByZXNzaW9uPyAgZmlsdGVyIGluZXJ0aWE/ICBmaWx0ZXIgY29zdHM/KS4KK0hpc3RvZ3JhbSBjcmVhdGlvbi4KK1RleHQgY29udmVyc2lvbiBiZXR3ZWVuIGRpZmZlcmVudCBjb2RlIHBhZ2VzIChMYXRpbi0xIC0+IE1hYyBhbmQgRE9TKS4KK1Nob3VsZCB3ZSBhbHdheXMgbWFsbG9jIDJeYml0X2RlcHRoIFBMVEUvdFJOUy9oSVNUIGVudHJpZXMgZm9yIHNhZmV0eT8KK0J1aWxkIGdhbW1hIHRhYmxlcyB1c2luZyBmaXhlZCBwb2ludCAoYW5kIGRvIGF3YXkgd2l0aCBmbG9hdGluZyBwb2ludCBlbnRpcmVseSkuCitVc2UgZ3JlYXRlciBwcmVjaXNpb24gd2hlbiBjaGFuZ2luZyB0byBsaW5lYXIgZ2FtbWEgZm9yIGNvbXBvc2l0aW5nIGFnYWluc3QKKyAgYmFja2dyb3VuZCBhbmQgZG9pbmcgcmdiLXRvLWdyYXkgdHJhbnNmb3JtYXRpb24uCitJbnZlc3RpZ2F0ZSBwcmUtaW5jcmVtZW50ZWQgbG9vcCBjb3VudGVycyBhbmQgb3RoZXIgbG9vcCBjb25zdHJ1Y3Rpb25zLgorQWRkIGludGVycG9sYXRlZCBtZXRob2Qgb2YgaGFuZGxpbmcgaW50ZXJsYWNpbmcuCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL1kyS0lORk8gYi9jb20zMi9saWIvbGlicG5nL1kyS0lORk8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmM2EwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvWTJLSU5GTwpAQCAtMCwwICsxLDU1IEBACisgICBZMksgY29tcGxpYW5jZSBpbiBsaWJwbmc6CisgICA9PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgIEp1bmUgMjYsIDIwMTAKKworICAgICAgU2luY2UgdGhlIFBORyBEZXZlbG9wbWVudCBncm91cCBpcyBhbiBhZC1ob2MgYm9keSwgd2UgY2FuJ3QgbWFrZQorICAgICAgYW4gb2ZmaWNpYWwgZGVjbGFyYXRpb24uCisKKyAgICAgIFRoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKKyAgICAgIHVwd2FyZCB0aHJvdWdoIDEuMi40NCBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0IGVhcmxpZXIKKyAgICAgIHZlcnNpb25zIHdlcmUgYWxzbyBZMksgY29tcGxpYW50LgorCisgICAgICBMaWJwbmcgb25seSBoYXMgdGhyZWUgeWVhciBmaWVsZHMuICBPbmUgaXMgYSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlcgorICAgICAgdGhhdCB3aWxsIGhvbGQgeWVhcnMgdXAgdG8gNjU1MzUuICBUaGUgb3RoZXIgdHdvIGhvbGQgdGhlIGRhdGUgaW4gdGV4dAorICAgICAgZm9ybWF0LCBhbmQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDk5OTkuCisKKyAgICAgIFRoZSBpbnRlZ2VyIGlzCisgICAgICAgICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KKworICAgICAgVGhlIHN0cmluZ3MgYXJlCisgICAgICAgICAgInBuZ19jaGFycCB0aW1lX2J1ZmZlciIgaW4gcG5nX3N0cnVjdCBhbmQKKyAgICAgICAgICAibmVhcl90aW1lX2J1ZmZlciIsIHdoaWNoIGlzIGEgbG9jYWwgY2hhcmFjdGVyIHN0cmluZyBpbiBwbmcuYy4KKworICAgICAgVGhlcmUgYXJlIHNldmVuIHRpbWUtcmVsYXRlZCBmdW5jdGlvbnM6CisKKyAgICAgICAgICBwbmdfY29udmVydF90b19yZmNfMTEyMygpIGluIHBuZy5jCisgICAgICAgICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExNTIoKSBpbiBlcnJvcikKKyAgICAgICAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCisgICAgICAgICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBpbiBwbmd3cml0ZS5jCisgICAgICAgICAgcG5nX2dldF90SU1FKCkgaW4gcG5nZ2V0LmMKKyAgICAgICAgICBwbmdfaGFuZGxlX3RJTUUoKSBpbiBwbmdydXRpbC5jLCBjYWxsZWQgaW4gcG5ncmVhZC5jCisgICAgICAgICAgcG5nX3NldF90SU1FKCkgaW4gcG5nc2V0LmMKKyAgICAgICAgICBwbmdfd3JpdGVfdElNRSgpIGluIHBuZ3d1dGlsLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCisKKyAgICAgIEFsbCBhcHBlYXIgdG8gaGFuZGxlIGRhdGVzIHByb3Blcmx5IGluIGEgWTJLIGVudmlyb25tZW50LiAgVGhlCisgICAgICBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZ1bmN0aW9uIGNhbGxzIGdtdGltZSgpIHRvIGNvbnZlcnQgZnJvbSBzeXN0ZW0KKyAgICAgIGNsb2NrIHRpbWUsIHdoaWNoIHJldHVybnMgKHllYXIgLSAxOTAwKSwgd2hpY2ggd2UgcHJvcGVybHkgY29udmVydCB0bworICAgICAgdGhlIGZ1bGwgNC1kaWdpdCB5ZWFyLiAgVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGFwcGxpY2F0aW9ucyB1c2luZworICAgICAgbGlicG5nIGFyZSBub3QgcGFzc2luZyA0LWRpZ2l0IHllYXJzIGludG8gdGhlIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkKKyAgICAgIGZ1bmN0aW9uLCBvciB0aGF0IHRoZXkgYXJlIGluY29ycmVjdGx5IHBhc3Npbmcgb25seSBhIDItZGlnaXQgeWVhcgorICAgICAgaW5zdGVhZCBvZiAieWVhciAtIDE5MDAiIGludG8gdGhlIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgZnVuY3Rpb24sCisgICAgICBidXQgdGhpcyBpcyBub3QgdW5kZXIgb3VyIGNvbnRyb2wuICBUaGUgbGlicG5nIGRvY3VtZW50YXRpb24gaGFzIGFsd2F5cworICAgICAgc3RhdGVkIHRoYXQgaXQgd29ya3Mgd2l0aCA0LWRpZ2l0IHllYXJzLCBhbmQgdGhlIEFQSXMgaGF2ZSBiZWVuCisgICAgICBkb2N1bWVudGVkIGFzIHN1Y2guCisKKyAgICAgIFRoZSB0SU1FIGNodW5rIGl0c2VsZiBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCB1c2VzIGEgMi1ieXRlIHVuc2lnbmVkCisgICAgICBpbnRlZ2VyIHRvIGhvbGQgdGhlIHllYXIsIGFuZCBjYW4gaG9sZCB5ZWFycyBhcyBsYXJnZSBhcyA2NTUzNS4KKworICAgICAgemxpYiwgdXBvbiB3aGljaCBsaWJwbmcgZGVwZW5kcywgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgY29udGFpbnMKKyAgICAgIG5vIGRhdGUtcmVsYXRlZCBjb2RlLgorCisKKyAgICAgICAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICAgICAgICAgbGlicG5nIG1haW50YWluZXIKKyAgICAgICAgIFBORyBEZXZlbG9wbWVudCBHcm91cApkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9leGFtcGxlLmMgYi9jb20zMi9saWIvbGlicG5nL2V4YW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWI4NzI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9leGFtcGxlLmMKQEAgLTAsMCArMSw4MzIgQEAKKworI2lmIDAgLyogaW4gY2FzZSBzb21lb25lIGFjdHVhbGx5IHRyaWVzIHRvIGNvbXBpbGUgdGhpcyAqLworCisvKiBleGFtcGxlLmMgLSBhbiBleGFtcGxlIG9mIHVzaW5nIGxpYnBuZworICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgdGhlIGF1dGhvcnMuCisgKiBNYWludGFpbmVkIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIE1haW50YWluZWQgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIFdyaXR0ZW4gMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKi8KKworLyogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgbGlicG5nIHRvIHJlYWQgYW5kIHdyaXRlIFBORyBmaWxlcy4KKyAqIFRoZSBmaWxlIGxpYnBuZy50eHQgaXMgbXVjaCBtb3JlIHZlcmJvc2UgdGhlbiB0aGlzLiAgSWYgeW91IGhhdmUgbm90CisgKiByZWFkIGl0LCBkbyBzbyBmaXJzdC4gIFRoaXMgd2FzIGRlc2lnbmVkIHRvIGJlIGEgc3RhcnRpbmcgcG9pbnQgb2YgYW4KKyAqIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBub3Qgb2ZmaWNpYWxseSBwYXJ0IG9mIGxpYnBuZywgaXMgaGVyZWJ5IHBsYWNlZAorICogaW4gdGhlIHB1YmxpYyBkb21haW4sIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgcmVxdWlyZSBhIGNvcHlyaWdodCBub3RpY2UuCisgKgorICogVGhpcyBmaWxlIGRvZXMgbm90IGN1cnJlbnRseSBjb21waWxlLCBiZWNhdXNlIGl0IGlzIG1pc3NpbmcgY2VydGFpbgorICogcGFydHMsIGxpa2UgYWxsb2NhdGluZyBtZW1vcnkgdG8gaG9sZCBhbiBpbWFnZS4gIFlvdSB3aWxsIGhhdmUgdG8KKyAqIHN1cHBseSB0aGVzZSBwYXJ0cyB0byBnZXQgaXQgdG8gY29tcGlsZS4gIEZvciBhbiBleGFtcGxlIG9mIGEgbWluaW1hbAorICogd29ya2luZyBQTkcgcmVhZGVyL3dyaXRlciwgc2VlIHBuZ3Rlc3QuYywgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb247CisgKiBzZWUgYWxzbyB0aGUgcHJvZ3JhbXMgaW4gdGhlIGNvbnRyaWIgZGlyZWN0b3J5LgorICovCisKKyNpbmNsdWRlICJwbmcuaCIKKworIC8qIFRoZSBwbmdfam1wYnVmKCkgbWFjcm8sIHVzZWQgaW4gZXJyb3IgaGFuZGxpbmcsIGJlY2FtZSBhdmFpbGFibGUgaW4KKyAgKiBsaWJwbmcgdmVyc2lvbiAxLjAuNi4gIElmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcnVuIHlvdXIgY29kZSB3aXRoIG9sZGVyCisgICogdmVyc2lvbnMgb2YgbGlicG5nLCB5b3UgbXVzdCBkZWZpbmUgdGhlIG1hY3JvIHlvdXJzZWxmIChidXQgb25seSBpZiBpdAorICAqIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQgYnkgbGlicG5nISkuCisgICovCisKKyNpZm5kZWYgcG5nX2ptcGJ1ZgorIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgKChwbmdfcHRyKS0+am1wYnVmKQorI2VuZGlmCisKKy8qIENoZWNrIHRvIHNlZSBpZiBhIGZpbGUgaXMgYSBQTkcgZmlsZSB1c2luZyBwbmdfc2lnX2NtcCgpLiAgcG5nX3NpZ19jbXAoKQorICogcmV0dXJucyB6ZXJvIGlmIHRoZSBpbWFnZSBpcyBhIFBORyBhbmQgbm9uemVybyBpZiBpdCBpc24ndCBhIFBORy4KKyAqCisgKiBUaGUgZnVuY3Rpb24gY2hlY2tfaWZfcG5nKCkgc2hvd24gaGVyZSwgYnV0IG5vdCB1c2VkLCByZXR1cm5zIG5vbnplcm8gKHRydWUpCisgKiBpZiB0aGUgZmlsZSBjYW4gYmUgb3BlbmVkIGFuZCBpcyBhIFBORywgMCAoZmFsc2UpIG90aGVyd2lzZS4KKyAqCisgKiBJZiB0aGlzIGNhbGwgaXMgc3VjY2Vzc2Z1bCwgYW5kIHlvdSBhcmUgZ29pbmcgdG8ga2VlcCB0aGUgZmlsZSBvcGVuLAorICogeW91IHNob3VsZCBjYWxsIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIFBOR19CWVRFU19UT19DSEVDSyk7IG9uY2UKKyAqIHlvdSBoYXZlIGNyZWF0ZWQgdGhlIHBuZ19wdHIsIHNvIHRoYXQgbGlicG5nIGtub3dzIHlvdXIgYXBwbGljYXRpb24KKyAqIGhhcyByZWFkIHRoYXQgbWFueSBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIE1ha2Ugc3VyZSB5b3UKKyAqIGRvbid0IGNhbGwgcG5nX3NldF9zaWdfYnl0ZXMoKSB3aXRoIG1vcmUgdGhhbiA4IGJ5dGVzIHJlYWQgb3IgZ2l2ZSBpdAorICogYW4gaW5jb3JyZWN0IG51bWJlciBvZiBieXRlcyByZWFkLCBvciB5b3Ugd2lsbCBlaXRoZXIgaGF2ZSByZWFkIHRvbworICogbWFueSBieXRlcyAoeW91ciBmYXVsdCksIG9yIHlvdSBhcmUgdGVsbGluZyBsaWJwbmcgdG8gcmVhZCB0aGUgd3JvbmcKKyAqIG51bWJlciBvZiBtYWdpYyBieXRlcyAoYWxzbyB5b3VyIGZhdWx0KS4KKyAqCisgKiBNYW55IGFwcGxpY2F0aW9ucyBhbHJlYWR5IHJlYWQgdGhlIGZpcnN0IDIgb3IgNCBieXRlcyBmcm9tIHRoZSBzdGFydAorICogb2YgdGhlIGltYWdlIHRvIGRldGVybWluZSB0aGUgZmlsZSB0eXBlLCBzbyBpdCB3b3VsZCBiZSBlYXNpZXN0IGp1c3QKKyAqIHRvIHBhc3MgdGhlIGJ5dGVzIHRvIHBuZ19zaWdfY21wKCkgb3IgZXZlbiBza2lwIHRoYXQgaWYgeW91IGtub3cKKyAqIHlvdSBoYXZlIGEgUE5HIGZpbGUsIGFuZCBjYWxsIHBuZ19zZXRfc2lnX2J5dGVzKCkuCisgKi8KKyNkZWZpbmUgUE5HX0JZVEVTX1RPX0NIRUNLIDQKK2ludCBjaGVja19pZl9wbmcoY2hhciAqZmlsZV9uYW1lLCBGSUxFICoqZnApCit7CisgICBjaGFyIGJ1ZltQTkdfQllURVNfVE9fQ0hFQ0tdOworCisgICAvKiBPcGVuIHRoZSBwcm9zcGVjdGl2ZSBQTkcgZmlsZS4gKi8KKyAgIGlmICgoKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAicmIiKSkgPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworCisgICAvKiBSZWFkIGluIHNvbWUgb2YgdGhlIHNpZ25hdHVyZSBieXRlcyAqLworICAgaWYgKGZyZWFkKGJ1ZiwgMSwgUE5HX0JZVEVTX1RPX0NIRUNLLCAqZnApICE9IFBOR19CWVRFU19UT19DSEVDSykKKyAgICAgIHJldHVybiAwOworCisgICAvKiBDb21wYXJlIHRoZSBmaXJzdCBQTkdfQllURVNfVE9fQ0hFQ0sgYnl0ZXMgb2YgdGhlIHNpZ25hdHVyZS4KKyAgICAgIFJldHVybiBub256ZXJvICh0cnVlKSBpZiB0aGV5IG1hdGNoICovCisKKyAgIHJldHVybighcG5nX3NpZ19jbXAoYnVmLCAocG5nX3NpemVfdCkwLCBQTkdfQllURVNfVE9fQ0hFQ0spKTsKK30KKworLyogUmVhZCBhIFBORyBmaWxlLiAgWW91IG1heSB3YW50IHRvIHJldHVybiBhbiBlcnJvciBjb2RlIGlmIHRoZSByZWFkCisgKiBmYWlscyAoZGVwZW5kaW5nIHVwb24gdGhlIGZhaWx1cmUpLiAgVGhlcmUgYXJlIHR3byAicHJvdG90eXBlcyIgZ2l2ZW4KKyAqIGhlcmUgLSBvbmUgd2hlcmUgd2UgYXJlIGdpdmVuIHRoZSBmaWxlbmFtZSwgYW5kIHdlIG5lZWQgdG8gb3BlbiB0aGUKKyAqIGZpbGUsIGFuZCB0aGUgb3RoZXIgd2hlcmUgd2UgYXJlIGdpdmVuIGFuIG9wZW4gZmlsZSAocG9zc2libHkgd2l0aAorICogc29tZSBvciBhbGwgb2YgdGhlIG1hZ2ljIGJ5dGVzIHJlYWQgLSBzZWUgY29tbWVudHMgYWJvdmUpLgorICovCisjaWZkZWYgb3Blbl9maWxlIC8qIHByb3RvdHlwZSAxICovCit2b2lkIHJlYWRfcG5nKGNoYXIgKmZpbGVfbmFtZSkgIC8qIFdlIG5lZWQgdG8gb3BlbiB0aGUgZmlsZSAqLworeworICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKKyAgIHVuc2lnbmVkIGludCBzaWdfcmVhZCA9IDA7CisgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OworICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgaW50ZXJsYWNlX3R5cGU7CisgICBGSUxFICpmcDsKKworICAgaWYgKChmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIikpID09IE5VTEwpCisgICAgICByZXR1cm4gKEVSUk9SKTsKKworI2Vsc2Ugbm9fb3Blbl9maWxlIC8qIHByb3RvdHlwZSAyICovCit2b2lkIHJlYWRfcG5nKEZJTEUgKmZwLCB1bnNpZ25lZCBpbnQgc2lnX3JlYWQpICAvKiBGaWxlIGlzIGFscmVhZHkgb3BlbiAqLworeworICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKKyAgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7CisgICBpbnQgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZTsKKyNlbmRpZiBub19vcGVuX2ZpbGUgLyogT25seSB1c2Ugb25lIHByb3RvdHlwZSEgKi8KKworICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgorICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAorICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gc3VwcGx5IHRoZQorICAgICogdGhlIGNvbXBpbGVyIGhlYWRlciBmaWxlIHZlcnNpb24sIHNvIHRoYXQgd2Uga25vdyBpZiB0aGUgYXBwbGljYXRpb24KKyAgICAqIHdhcyBjb21waWxlZCB3aXRoIGEgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgUkVRVUlSRUQKKyAgICAqLworICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgcG5nX3ZvaWRwIHVzZXJfZXJyb3JfcHRyLCB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgeworICAgICAgZmNsb3NlKGZwKTsKKyAgICAgIHJldHVybiAoRVJST1IpOworICAgfQorCisgICAvKiBBbGxvY2F0ZS9pbml0aWFsaXplIHRoZSBtZW1vcnkgZm9yIGltYWdlIGluZm9ybWF0aW9uLiAgUkVRVUlSRUQuICovCisgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICBpZiAoaW5mb19wdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgcG5nX2luZm9wcF9OVUxMLCBwbmdfaW5mb3BwX05VTEwpOworICAgICAgcmV0dXJuIChFUlJPUik7CisgICB9CisKKyAgIC8qIFNldCBlcnJvciBoYW5kbGluZyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBzZXRqbXAvbG9uZ2ptcCBtZXRob2QgKHRoaXMgaXMKKyAgICAqIHRoZSBub3JtYWwgbWV0aG9kIG9mIGRvaW5nIHRoaW5ncyB3aXRoIGxpYnBuZykuICBSRVFVSVJFRCB1bmxlc3MgeW91CisgICAgKiBzZXQgdXAgeW91ciBvd24gZXJyb3IgaGFuZGxlcnMgaW4gdGhlIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKSBlYXJsaWVyLgorICAgICovCisKKyAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCisgICB7CisgICAgICAvKiBGcmVlIGFsbCBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG5nX3B0ciBhbmQgaW5mb19wdHIgKi8KKyAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIHBuZ19pbmZvcHBfTlVMTCk7CisgICAgICBmY2xvc2UoZnApOworICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGhhZCBhIHByb2JsZW0gcmVhZGluZyB0aGUgZmlsZSAqLworICAgICAgcmV0dXJuIChFUlJPUik7CisgICB9CisKKyAgIC8qIE9uZSBvZiB0aGUgZm9sbG93aW5nIEkvTyBpbml0aWFsaXphdGlvbiBtZXRob2RzIGlzIFJFUVVJUkVEICovCisjaWZkZWYgc3RyZWFtcyAvKiBQTkcgZmlsZSBJL08gbWV0aG9kIDEgKi8KKyAgIC8qIFNldCB1cCB0aGUgaW5wdXQgY29udHJvbCBpZiB5b3UgYXJlIHVzaW5nIHN0YW5kYXJkIEMgc3RyZWFtcyAqLworICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOworCisjZWxzZSBub19zdHJlYW1zIC8qIFBORyBmaWxlIEkvTyBtZXRob2QgMiAqLworICAgLyogSWYgeW91IGFyZSB1c2luZyByZXBsYWNlbWVudCByZWFkIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBjYWxsaW5nCisgICAgKiBwbmdfaW5pdF9pbygpIGhlcmUgeW91IHdvdWxkIGNhbGw6CisgICAgKi8KKyAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfaW9fcHRyLCB1c2VyX3JlYWRfZm4pOworICAgLyogd2hlcmUgdXNlcl9pb19wdHIgaXMgYSBzdHJ1Y3R1cmUgeW91IHdhbnQgYXZhaWxhYmxlIHRvIHRoZSBjYWxsYmFja3MgKi8KKyNlbmRpZiBub19zdHJlYW1zIC8qIFVzZSBvbmx5IG9uZSBJL08gbWV0aG9kISAqLworCisgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBzb21lIG9mIHRoZSBzaWduYXR1cmUgKi8KKyAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIHNpZ19yZWFkKTsKKworI2lmZGVmIGhpbGV2ZWwKKyAgIC8qCisgICAgKiBJZiB5b3UgaGF2ZSBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgaW4gdGhlIGVudGlyZSBpbWFnZSBhdCBvbmNlLAorICAgICogYW5kIHlvdSBuZWVkIHRvIHNwZWNpZnkgb25seSB0cmFuc2Zvcm1zIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKKyAgICAqIHdpdGggb25lIG9mIHRoZSBQTkdfVFJBTlNGT1JNXyogYml0cyAodGhpcyBwcmVzZW50bHkgZXhjbHVkZXMKKyAgICAqIGRpdGhlcmluZywgZmlsbGluZywgc2V0dGluZyBiYWNrZ3JvdW5kLCBhbmQgZG9pbmcgZ2FtbWEKKyAgICAqIGFkanVzdG1lbnQpLCB0aGVuIHlvdSBjYW4gcmVhZCB0aGUgZW50aXJlIGltYWdlIChpbmNsdWRpbmcKKyAgICAqIHBpeGVscykgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUgd2l0aCB0aGlzIGNhbGw6CisgICAgKi8KKyAgIHBuZ19yZWFkX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIHBuZ192b2lkcF9OVUxMKTsKKworI2Vsc2UKKyAgIC8qIE9LLCB5b3UncmUgZG9pbmcgaXQgdGhlIGhhcmQgd2F5LCB3aXRoIHRoZSBsb3dlci1sZXZlbCBmdW5jdGlvbnMgKi8KKworICAgLyogVGhlIGNhbGwgdG8gcG5nX3JlYWRfaW5mbygpIGdpdmVzIHVzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAgICAqIFBORyBmaWxlIGJlZm9yZSB0aGUgZmlyc3QgSURBVCAoaW1hZ2UgZGF0YSBjaHVuaykuICBSRVFVSVJFRAorICAgICovCisgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLAorICAgICAgICZpbnRlcmxhY2VfdHlwZSwgaW50X3BfTlVMTCwgaW50X3BfTlVMTCk7CisKKyAgIC8qIFNldCB1cCB0aGUgZGF0YSB0cmFuc2Zvcm1hdGlvbnMgeW91IHdhbnQuICBOb3RlIHRoYXQgdGhlc2UgYXJlIGFsbAorICAgICogb3B0aW9uYWwuICBPbmx5IGNhbGwgdGhlbSBpZiB5b3Ugd2FudC9uZWVkIHRoZW0uICBNYW55IG9mIHRoZQorICAgICogdHJhbnNmb3JtYXRpb25zIG9ubHkgd29yayBvbiBzcGVjaWZpYyB0eXBlcyBvZiBpbWFnZXMsIGFuZCBtYW55CisgICAgKiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICovCisKKyAgIC8qIFRlbGwgbGlicG5nIHRvIHN0cmlwIDE2IGJpdC9jb2xvciBmaWxlcyBkb3duIHRvIDggYml0cy9jb2xvciAqLworICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKKworICAgLyogU3RyaXAgYWxwaGEgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgZGF0YSB3aXRob3V0IGNvbWJpbmluZyB3aXRoIHRoZQorICAgICogYmFja2dyb3VuZCAobm90IHJlY29tbWVuZGVkKS4KKyAgICAqLworICAgcG5nX3NldF9zdHJpcF9hbHBoYShwbmdfcHRyKTsKKworICAgLyogRXh0cmFjdCBtdWx0aXBsZSBwaXhlbHMgd2l0aCBiaXQgZGVwdGhzIG9mIDEsIDIsIGFuZCA0IGZyb20gYSBzaW5nbGUKKyAgICAqIGJ5dGUgaW50byBzZXBhcmF0ZSBieXRlcyAodXNlZnVsIGZvciBwYWxldHRlZCBhbmQgZ3JheXNjYWxlIGltYWdlcykuCisgICAgKi8KKyAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKKworICAgLyogQ2hhbmdlIHRoZSBvcmRlciBvZiBwYWNrZWQgcGl4ZWxzIHRvIGxlYXN0IHNpZ25pZmljYW50IGJpdCBmaXJzdAorICAgICogKG5vdCB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBwbmdfc2V0X3BhY2tpbmcpLiAqLworICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKKworICAgLyogRXhwYW5kIHBhbGV0dGVkIGNvbG9ycyBpbnRvIHRydWUgUkdCIHRyaXBsZXRzICovCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfcHRyKTsKKworICAgLyogRXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgdG8gdGhlIGZ1bGwgOCBiaXRzIGZyb20gMSwgMiwgb3IgNCBiaXRzL3BpeGVsICovCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpCisgICAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3B0cik7CisKKyAgIC8qIEV4cGFuZCBwYWxldHRlZCBvciBSR0IgaW1hZ2VzIHdpdGggdHJhbnNwYXJlbmN5IHRvIGZ1bGwgYWxwaGEgY2hhbm5lbHMKKyAgICAqIHNvIHRoZSBkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIGFzIFJHQkEgcXVhcnRldHMuCisgICAgKi8KKyAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKKyAgICAgIHBuZ19zZXRfdFJOU190b19hbHBoYShwbmdfcHRyKTsKKworICAgLyogU2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIGRyYXcgdHJhbnNwYXJlbnQgYW5kIGFscGhhIGltYWdlcyBvdmVyLgorICAgICogSXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjb21wb25lbnRzIGRpcmVjdGx5CisgICAgKiBmb3IgcGFsZXR0ZWQgaW1hZ2VzIGluc3RlYWQgb2Ygc3VwcGx5aW5nIGEgcGFsZXR0ZSBpbmRleC4gIE5vdGUgdGhhdAorICAgICogZXZlbiBpZiB0aGUgUE5HIGZpbGUgc3VwcGxpZXMgYSBiYWNrZ3JvdW5kLCB5b3UgYXJlIG5vdCByZXF1aXJlZCB0bworICAgICogdXNlIGl0IC0geW91IHNob3VsZCB1c2UgdGhlIChzb2xpZCkgYXBwbGljYXRpb24gYmFja2dyb3VuZCBpZiBpdCBoYXMgb25lLgorICAgICovCisKKyAgIHBuZ19jb2xvcl8xNiBteV9iYWNrZ3JvdW5kLCAqaW1hZ2VfYmFja2dyb3VuZDsKKworICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpKQorICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsIGltYWdlX2JhY2tncm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSwgMSwgMS4wKTsKKyAgIGVsc2UKKyAgICAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCAmbXlfYmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAsIDEuMCk7CisKKyAgIC8qIFNvbWUgc3VnZ2VzdGlvbnMgYXMgdG8gaG93IHRvIGdldCBhIHNjcmVlbiBnYW1tYSB2YWx1ZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBzY3JlZW4gZ2FtbWEgaXMgdGhlIGRpc3BsYXlfZXhwb25lbnQsIHdoaWNoIGluY2x1ZGVzCisgICAgKiB0aGUgQ1JUX2V4cG9uZW50IGFuZCBhbnkgY29ycmVjdGlvbiBmb3Igdmlld2luZyBjb25kaXRpb25zCisgICAgKi8KKyAgIGlmICgvKiBXZSBoYXZlIGEgdXNlci1kZWZpbmVkIHNjcmVlbiBnYW1tYSB2YWx1ZSAqLykKKyAgIHsKKyAgICAgIHNjcmVlbl9nYW1tYSA9IHVzZXItZGVmaW5lZCBzY3JlZW5fZ2FtbWE7CisgICB9CisgICAvKiBUaGlzIGlzIG9uZSB3YXkgdGhhdCBhcHBsaWNhdGlvbnMgc2hhcmUgdGhlIHNhbWUgc2NyZWVuIGdhbW1hIHZhbHVlICovCisgICBlbHNlIGlmICgoZ2FtbWFfc3RyID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHNjcmVlbl9nYW1tYSA9IGF0b2YoZ2FtbWFfc3RyKTsKKyAgIH0KKyAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW5vdGhlciB2YWx1ZSAqLworICAgZWxzZQorICAgeworICAgICAgc2NyZWVuX2dhbW1hID0gMi4yOyAgLyogQSBnb29kIGd1ZXNzIGZvciBhIFBDIG1vbml0b3IgaW4gYSBkaW1seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0IHJvb20gKi8KKyAgICAgIHNjcmVlbl9nYW1tYSA9IDEuNyBvciAxLjA7ICAvKiBBIGdvb2QgZ3Vlc3MgZm9yIE1hYyBzeXN0ZW1zICovCisgICB9CisKKyAgIC8qIFRlbGwgbGlicG5nIHRvIGhhbmRsZSB0aGUgZ2FtbWEgY29udmVyc2lvbiBmb3IgeW91LiAgVGhlIGZpbmFsIGNhbGwKKyAgICAqIGlzIGEgZ29vZCBndWVzcyBmb3IgUEMgZ2VuZXJhdGVkIGltYWdlcywgYnV0IGl0IHNob3VsZCBiZSBjb25maWd1cmFibGUKKyAgICAqIGJ5IHRoZSB1c2VyIGF0IHJ1biB0aW1lIGJ5IHRoZSB1c2VyLiAgSXQgaXMgc3Ryb25nbHkgc3VnZ2VzdGVkIHRoYXQKKyAgICAqIHlvdXIgYXBwbGljYXRpb24gc3VwcG9ydCBnYW1tYSBjb3JyZWN0aW9uLgorICAgICovCisKKyAgIGludCBpbnRlbnQ7CisKKyAgIGlmIChwbmdfZ2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsICZpbnRlbnQpKQorICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIDAuNDU0NTUpOworICAgZWxzZQorICAgeworICAgICAgZG91YmxlIGltYWdlX2dhbW1hOworICAgICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2dhbW1hKSkKKyAgICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCBpbWFnZV9nYW1tYSk7CisgICAgICBlbHNlCisgICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgMC40NTQ1NSk7CisgICB9CisKKyAgIC8qIERpdGhlciBSR0IgZmlsZXMgZG93biB0byA4IGJpdCBwYWxldHRlIG9yIHJlZHVjZSBwYWxldHRlcworICAgICogdG8gdGhlIG51bWJlciBvZiBjb2xvcnMgYXZhaWxhYmxlIG9uIHlvdXIgc2NyZWVuLgorICAgICovCisgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQorICAgeworICAgICAgaW50IG51bV9wYWxldHRlOworICAgICAgcG5nX2NvbG9ycCBwYWxldHRlOworCisgICAgICAvKiBUaGlzIHJlZHVjZXMgdGhlIGltYWdlIHRvIHRoZSBhcHBsaWNhdGlvbiBzdXBwbGllZCBwYWxldHRlICovCisgICAgICBpZiAoLyogV2UgaGF2ZSBvdXIgb3duIHBhbGV0dGUgKi8pCisgICAgICB7CisgICAgICAgICAvKiBBbiBhcnJheSBvZiBjb2xvcnMgdG8gd2hpY2ggdGhlIGltYWdlIHNob3VsZCBiZSBkaXRoZXJlZCAqLworICAgICAgICAgcG5nX2NvbG9yIHN0ZF9jb2xvcl9jdWJlW01BWF9TQ1JFRU5fQ09MT1JTXTsKKworICAgICAgICAgcG5nX3NldF9kaXRoZXIocG5nX3B0ciwgc3RkX2NvbG9yX2N1YmUsIE1BWF9TQ1JFRU5fQ09MT1JTLAorICAgICAgICAgICAgTUFYX1NDUkVFTl9DT0xPUlMsIHBuZ191aW50XzE2cF9OVUxMLCAwKTsKKyAgICAgIH0KKyAgICAgIC8qIFRoaXMgcmVkdWNlcyB0aGUgaW1hZ2UgdG8gdGhlIHBhbGV0dGUgc3VwcGxpZWQgaW4gdGhlIGZpbGUgKi8KKyAgICAgIGVsc2UgaWYgKHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsICZudW1fcGFsZXR0ZSkpCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8xNnAgaGlzdG9ncmFtID0gTlVMTDsKKworICAgICAgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdG9ncmFtKTsKKworICAgICAgICAgcG5nX3NldF9kaXRoZXIocG5nX3B0ciwgcGFsZXR0ZSwgbnVtX3BhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2NyZWVuX2NvbG9ycywgaGlzdG9ncmFtLCAwKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgdG8gaGF2ZSAwIGFzIHdoaXRlIGFuZCAxIGFzIGJsYWNrICovCisgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOworCisgICAvKiBJZiB5b3Ugd2FudCB0byBzaGlmdCB0aGUgcGl4ZWwgdmFsdWVzIGZyb20gdGhlIHJhbmdlIFswLDI1NV0gb3IKKyAgICAqIFswLDY1NTM1XSB0byB0aGUgb3JpZ2luYWwgWzAsN10gb3IgWzAsMzFdLCBvciB3aGF0ZXZlciByYW5nZSB0aGUKKyAgICAqIGNvbG9ycyB3ZXJlIG9yaWdpbmFsbHkgaW46CisgICAgKi8KKyAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT19zQklUKSkKKyAgIHsKKyAgICAgIHBuZ19jb2xvcl84cCBzaWdfYml0X3A7CisKKyAgICAgIHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXRfcCk7CisgICAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsIHNpZ19iaXRfcCk7CisgICB9CisKKyAgIC8qIEZsaXAgdGhlIFJHQiBwaXhlbHMgdG8gQkdSIChvciBSR0JBIHRvIEJHUkEpICovCisgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQorICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7CisKKyAgIC8qIFN3YXAgdGhlIFJHQkEgb3IgR0EgZGF0YSB0byBBUkdCIG9yIEFHIChvciBCR1JBIHRvIEFCR1IpICovCisgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7CisKKyAgIC8qIFN3YXAgYnl0ZXMgb2YgMTYgYml0IGZpbGVzIHRvIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KKyAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKworICAgLyogQWRkIGZpbGxlciAob3IgYWxwaGEpIGJ5dGUgKGJlZm9yZS9hZnRlciBlYWNoIFJHQiB0cmlwbGV0KSAqLworICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgMHhmZiwgUE5HX0ZJTExFUl9BRlRFUik7CisKKyAgIC8qIFR1cm4gb24gaW50ZXJsYWNlIGhhbmRsaW5nLiAgUkVRVUlSRUQgaWYgeW91IGFyZSBub3QgdXNpbmcKKyAgICAqIHBuZ19yZWFkX2ltYWdlKCkuICBUbyBzZWUgaG93IHRvIGhhbmRsZSBpbnRlcmxhY2luZyBwYXNzZXMsCisgICAgKiBzZWUgdGhlIHBuZ19yZWFkX3JvdygpIG1ldGhvZCBiZWxvdzoKKyAgICAqLworICAgbnVtYmVyX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworCisgICAvKiBPcHRpb25hbCBjYWxsIHRvIGdhbW1hIGNvcnJlY3QgYW5kIGFkZCB0aGUgYmFja2dyb3VuZCB0byB0aGUgcGFsZXR0ZQorICAgICogYW5kIHVwZGF0ZSBpbmZvIHN0cnVjdHVyZS4gIFJFUVVJUkVEIGlmIHlvdSBhcmUgZXhwZWN0aW5nIGxpYnBuZyB0bworICAgICogdXBkYXRlIHRoZSBwYWxldHRlIGZvciB5b3UgKGllIHlvdSBzZWxlY3RlZCBzdWNoIGEgdHJhbnNmb3JtIGFib3ZlKS4KKyAgICAqLworICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IHRvIGhvbGQgdGhlIGltYWdlIHVzaW5nIHRoZSBmaWVsZHMgb2YgaW5mb19wdHIuICovCisKKyAgIC8qIFRoZSBlYXNpZXN0IHdheSB0byByZWFkIHRoZSBpbWFnZTogKi8KKyAgIHBuZ19ieXRlcCByb3dfcG9pbnRlcnNbaGVpZ2h0XTsKKworICAgLyogQ2xlYXIgdGhlIHBvaW50ZXIgYXJyYXkgKi8KKyAgIGZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykKKyAgICAgIHJvd19wb2ludGVyc1tyb3ddID0gTlVMTDsKKworICAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKQorICAgICAgcm93X3BvaW50ZXJzW3Jvd10gPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwKKyAgICAgICAgIGluZm9fcHRyKSk7CisKKyAgIC8qIE5vdyBpdCdzIHRpbWUgdG8gcmVhZCB0aGUgaW1hZ2UuICBPbmUgb2YgdGhlc2UgbWV0aG9kcyBpcyBSRVFVSVJFRCAqLworI2lmZGVmIGVudGlyZSAvKiBSZWFkIHRoZSBlbnRpcmUgaW1hZ2UgaW4gb25lIGdvICovCisgICBwbmdfcmVhZF9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOworCisjZWxzZSBub19lbnRpcmUgLyogUmVhZCB0aGUgaW1hZ2Ugb25lIG9yIG1vcmUgc2NhbmxpbmVzIGF0IGEgdGltZSAqLworICAgLyogVGhlIG90aGVyIHdheSB0byByZWFkIGltYWdlcyAtIGRlYWwgd2l0aCBpbnRlcmxhY2luZzogKi8KKworICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IG51bWJlcl9wYXNzZXM7IHBhc3MrKykKKyAgIHsKKyNpZmRlZiBzaW5nbGUgLyogUmVhZCB0aGUgaW1hZ2UgYSBzaW5nbGUgcm93IGF0IGEgdGltZSAqLworICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgICAgeworICAgICAgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCAmcm93X3BvaW50ZXJzW3ldLCBwbmdfYnl0ZXBwX05VTEwsIDEpOworICAgICAgfQorCisjZWxzZSBub19zaW5nbGUgLyogUmVhZCB0aGUgaW1hZ2Ugc2V2ZXJhbCByb3dzIGF0IGEgdGltZSAqLworICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSBudW1iZXJfb2Zfcm93cykKKyAgICAgIHsKKyNpZmRlZiBzcGFya2xlIC8qIFJlYWQgdGhlIGltYWdlIHVzaW5nIHRoZSAic3BhcmtsZSIgZWZmZWN0LiAqLworICAgICAgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCAmcm93X3BvaW50ZXJzW3ldLCBwbmdfYnl0ZXBwX05VTEwsCisgICAgICAgICAgICBudW1iZXJfb2Zfcm93cyk7CisjZWxzZSBub19zcGFya2xlIC8qIFJlYWQgdGhlIGltYWdlIHVzaW5nIHRoZSAicmVjdGFuZ2xlIiBlZmZlY3QgKi8KKyAgICAgICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcG5nX2J5dGVwcF9OVUxMLCAmcm93X3BvaW50ZXJzW3ldLAorICAgICAgICAgICAgbnVtYmVyX29mX3Jvd3MpOworI2VuZGlmIG5vX3NwYXJrbGUgLyogVXNlIG9ubHkgb25lIG9mIHRoZXNlIHR3byBtZXRob2RzICovCisgICAgICB9CisKKyAgICAgIC8qIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgdGhlIGltYWdlIGFmdGVyIGV2ZXJ5IHBhc3MsIGRvIHNvIGhlcmUgKi8KKyNlbmRpZiBub19zaW5nbGUgLyogVXNlIG9ubHkgb25lIG9mIHRoZXNlIHR3byBtZXRob2RzICovCisgICB9CisjZW5kaWYgbm9fZW50aXJlIC8qIFVzZSBvbmx5IG9uZSBvZiB0aGVzZSB0d28gbWV0aG9kcyAqLworCisgICAvKiBSZWFkIHJlc3Qgb2YgZmlsZSwgYW5kIGdldCBhZGRpdGlvbmFsIGNodW5rcyBpbiBpbmZvX3B0ciAtIFJFUVVJUkVEICovCisgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworI2VuZGlmIGhpbGV2ZWwKKworICAgLyogQXQgdGhpcyBwb2ludCB5b3UgaGF2ZSByZWFkIHRoZSBlbnRpcmUgaW1hZ2UgKi8KKworICAgLyogQ2xlYW4gdXAgYWZ0ZXIgdGhlIHJlYWQsIGFuZCBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkIC0gUkVRVUlSRUQgKi8KKyAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIHBuZ19pbmZvcHBfTlVMTCk7CisKKyAgIC8qIENsb3NlIHRoZSBmaWxlICovCisgICBmY2xvc2UoZnApOworCisgICAvKiBUaGF0J3MgaXQgKi8KKyAgIHJldHVybiAoT0spOworfQorCisvKiBQcm9ncmVzc2l2ZWx5IHJlYWQgYSBmaWxlICovCisKK2ludAoraW5pdGlhbGl6ZV9wbmdfcmVhZGVyKHBuZ19zdHJ1Y3RwICpwbmdfcHRyLCBwbmdfaW5mb3AgKmluZm9fcHRyKQoreworICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgorICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAorICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gY2hlY2sgdGhhdAorICAgICogdGhlIGxpYnJhcnkgdmVyc2lvbiBpcyBjb21wYXRpYmxlIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGR5bmFtaWNhbGx5CisgICAgKiBsaW5rZWQgbGlicmFyaWVzLgorICAgICovCisgICAqcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgIHBuZ192b2lkcCB1c2VyX2Vycm9yX3B0ciwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKKworICAgaWYgKCpwbmdfcHRyID09IE5VTEwpCisgICB7CisgICAgICAqaW5mb19wdHIgPSBOVUxMOworICAgICAgcmV0dXJuIChFUlJPUik7CisgICB9CisKKyAgICppbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisKKyAgIGlmICgqaW5mb19wdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfaW5mb3BwX05VTEwpOworICAgICAgcmV0dXJuIChFUlJPUik7CisgICB9CisKKyAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZigoKnBuZ19wdHIpKSkpCisgICB7CisgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX2luZm9wcF9OVUxMKTsKKyAgICAgIHJldHVybiAoRVJST1IpOworICAgfQorCisgICAvKiBUaGlzIG9uZSdzIG5ldy4gIFlvdSB3aWxsIG5lZWQgdG8gcHJvdmlkZSBhbGwgdGhyZWUKKyAgICAqIGZ1bmN0aW9uIGNhbGxiYWNrcywgZXZlbiBpZiB5b3UgYXJlbid0IHVzaW5nIHRoZW0gYWxsLgorICAgICogSWYgeW91IGFyZW4ndCB1c2luZyBhbGwgZnVuY3Rpb25zLCB5b3UgY2FuIHNwZWNpZnkgTlVMTAorICAgICogcGFyYW1ldGVycy4gIEV2ZW4gd2hlbiBhbGwgdGhyZWUgZnVuY3Rpb25zIGFyZSBOVUxMLAorICAgICogeW91IG5lZWQgdG8gY2FsbCBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4KKyAgICAqIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGRuJ3QgYmUgZGVwZW5kZW50IG9uIGdsb2JhbCBvcgorICAgICogc3RhdGljIHZhcmlhYmxlcyBpZiB5b3UgYXJlIGRlY29kaW5nIHNldmVyYWwgaW1hZ2VzCisgICAgKiBzaW11bHRhbmVvdXNseS4gIFlvdSBzaG91bGQgc3RvcmUgc3RyZWFtIHNwZWNpZmljIGRhdGEKKyAgICAqIGluIGEgc2VwYXJhdGUgc3RydWN0LCBnaXZlbiBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciwKKyAgICAqIGFuZCByZXRyaWV2ZSB0aGUgcG9pbnRlciBmcm9tIGluc2lkZSB0aGUgY2FsbGJhY2tzIHVzaW5nCisgICAgKiB0aGUgZnVuY3Rpb24gcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cikuCisgICAgKi8KKyAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigqcG5nX3B0ciwgKHZvaWQgKilzdHJlYW1fZGF0YSwKKyAgICAgIGluZm9fY2FsbGJhY2ssIHJvd19jYWxsYmFjaywgZW5kX2NhbGxiYWNrKTsKKworICAgcmV0dXJuIChPSyk7Cit9CisKK2ludAorcHJvY2Vzc19kYXRhKHBuZ19zdHJ1Y3RwICpwbmdfcHRyLCBwbmdfaW5mb3AgKmluZm9fcHRyLAorICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgaWYgKHNldGptcChwbmdfam1wYnVmKCgqcG5nX3B0cikpKSkKKyAgIHsKKyAgICAgIC8qIEZyZWUgdGhlIHBuZ19wdHIgYW5kIGluZm9fcHRyIG1lbW9yeSBvbiBlcnJvciAqLworICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19pbmZvcHBfTlVMTCk7CisgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgIH0KKworICAgLyogVGhpcyBvbmUncyBuZXcgYWxzby4gIFNpbXBseSBnaXZlIGl0IGNodW5rcyBvZiBkYXRhIGFzCisgICAgKiB0aGV5IGFycml2ZSBmcm9tIHRoZSBkYXRhIHN0cmVhbSAoaW4gb3JkZXIsIG9mIGNvdXJzZSkuCisgICAgKiBPbiBzZWdtZW50ZWQgbWFjaGluZXMsIGRvbid0IGdpdmUgaXQgYW55IG1vcmUgdGhhbiA2NEsuCisgICAgKiBUaGUgbGlicmFyeSBzZWVtcyB0byBydW4gZmluZSB3aXRoIHNpemVzIG9mIDRLLCBhbHRob3VnaAorICAgICogeW91IGNhbiBnaXZlIGl0IG11Y2ggbGVzcyBpZiBuZWNlc3NhcnkgKEkgYXNzdW1lIHlvdSBjYW4KKyAgICAqIGdpdmUgaXQgY2h1bmtzIG9mIDEgYnl0ZSwgYnV0IEkgaGF2ZW4ndCB0cmllZCB3aXRoIGxlc3MKKyAgICAqIHRoYW4gMjU2IGJ5dGVzIHlldCkuICBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgeW91IG1heQorICAgICogd2FudCB0byBkaXNwbGF5IGFueSByb3dzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgaW4gdGhlIHJvdworICAgICogY2FsbGJhY2ssIGlmIHlvdSBhcmVuJ3QgYWxyZWFkeSBkaXNwbGF5aW5nIHRoZW0gdGhlcmUuCisgICAgKi8KKyAgIHBuZ19wcm9jZXNzX2RhdGEoKnBuZ19wdHIsICppbmZvX3B0ciwgYnVmZmVyLCBsZW5ndGgpOworICAgcmV0dXJuIChPSyk7Cit9CisKK2luZm9fY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCit7CisgICAvKiBEbyBhbnkgc2V0dXAgaGVyZSwgaW5jbHVkaW5nIHNldHRpbmcgYW55IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMKKyAgICAqIG1lbnRpb25lZCBpbiB0aGUgUmVhZGluZyBQTkcgZmlsZXMgc2VjdGlvbi4gIEZvciBub3csIHlvdSBfbXVzdF8KKyAgICAqIGNhbGwgZWl0aGVyIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8oKQorICAgICogYWZ0ZXIgYWxsIHRoZSB0cmFuc2Zvcm1hdGlvbnMgYXJlIHNldCAoZXZlbiBpZiB5b3UgZG9uJ3Qgc2V0CisgICAgKiBhbnkpLiAgWW91IG1heSBzdGFydCBnZXR0aW5nIHJvd3MgYmVmb3JlIHBuZ19wcm9jZXNzX2RhdGEoKQorICAgICogcmV0dXJucywgc28gdGhpcyBpcyB5b3VyIGxhc3QgY2hhbmNlIHRvIHByZXBhcmUgZm9yIHRoYXQuCisgICAgKi8KK30KKworcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAorICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpCit7CisgICAvKgorICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiB0aGUgaW1hZ2UuICBJZiB0aGUKKyAgICAqIGltYWdlIGlzIGludGVybGFjZWQsIGFuZCB5b3UgdHVybmVkIG9uIHRoZSBpbnRlcmxhY2UgaGFuZGxlciwKKyAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiBldmVyeSBwYXNzLgorICAgICoKKyAgICAqIEluIHRoaXMgZnVuY3Rpb24geW91IHdpbGwgcmVjZWl2ZSBhIHBvaW50ZXIgdG8gbmV3IHJvdyBkYXRhIGZyb20KKyAgICAqIGxpYnBuZyBjYWxsZWQgbmV3X3JvdyB0aGF0IGlzIHRvIHJlcGxhY2UgYSBjb3JyZXNwb25kaW5nIHJvdyAob2YKKyAgICAqIHRoZSBzYW1lIGRhdGEgZm9ybWF0KSBpbiBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgeW91ciBhcHBsaWNhdGlvbi4KKyAgICAqCisgICAgKiBUaGUgbmV3IHJvdyBkYXRhIHBvaW50ZXIgIm5ld19yb3ciIG1heSBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoZXJlIGlzCisgICAgKiBubyBuZXcgZGF0YSB0byBiZSByZXBsYWNlZCAoaW4gY2FzZXMgb2YgaW50ZXJsYWNlIGxvYWRpbmcpLgorICAgICoKKyAgICAqIElmIG5ld19yb3cgaXMgbm90IE5VTEwgdGhlbiB5b3UgbmVlZCB0byBjYWxsCisgICAgKiBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKSB0byByZXBsYWNlIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBhcworICAgICogc2hvd24gYmVsb3c6CisgICAgKi8KKworICAgLyogR2V0IHBvaW50ZXIgdG8gY29ycmVzcG9uZGluZyByb3cgaW4gb3VyCisgICAgKiBQTkcgcmVhZCBidWZmZXIuCisgICAgKi8KKyAgIHBuZ19ieXRlcCBvbGRfcm93ID0gKChwbmdfYnl0ZXAgKilvdXJfZGF0YSlbcm93X251bV07CisKKyAgIC8qIElmIGJvdGggcm93cyBhcmUgYWxsb2NhdGVkIHRoZW4gY29weSB0aGUgbmV3IHJvdworICAgICogZGF0YSB0byB0aGUgY29ycmVzcG9uZGluZyByb3cgZGF0YS4KKyAgICAqLworICAgaWYgKChvbGRfcm93ICE9IE5VTEwpICYmIChuZXdfcm93ICE9IE5VTEwpKQorICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csIG5ld19yb3cpOworCisgICAvKgorICAgICogVGhlIHJvd3MgYW5kIHBhc3NlcyBhcmUgY2FsbGVkIGluIG9yZGVyLCBzbyB5b3UgZG9uJ3QgcmVhbGx5CisgICAgKiBuZWVkIHRoZSByb3dfbnVtIGFuZCBwYXNzLCBidXQgSSdtIHN1cHBseWluZyB0aGVtIGJlY2F1c2UgaXQKKyAgICAqIG1heSBtYWtlIHlvdXIgbGlmZSBlYXNpZXIuCisgICAgKgorICAgICogRm9yIHRoZSBub24tTlVMTCByb3dzIG9mIGludGVybGFjZWQgaW1hZ2VzLCB5b3UgbXVzdCBjYWxsCisgICAgKiBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKSBwYXNzaW5nIGluIHRoZSBuZXcgcm93IGFuZCB0aGUKKyAgICAqIG9sZCByb3csIGFzIGRlbW9uc3RyYXRlZCBhYm92ZS4gIFlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvcgorICAgICogTlVMTCByb3dzIChpdCB3aWxsIGp1c3QgcmV0dXJuKSBhbmQgZm9yIG5vbi1pbnRlcmxhY2VkIGltYWdlcworICAgICogKGl0IGp1c3QgZG9lcyB0aGUgcG5nX21lbWNweSBmb3IgeW91KSBpZiBpdCB3aWxsIG1ha2UgdGhlIGNvZGUKKyAgICAqIGVhc2llci4gIFRodXMsIHlvdSBjYW4ganVzdCBkbyB0aGlzIGZvciBhbGwgY2FzZXM6CisgICAgKi8KKworICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csIG5ld19yb3cpOworCisgICAvKiB3aGVyZSBvbGRfcm93IGlzIHdoYXQgd2FzIGRpc3BsYXllZCBmb3IgcHJldmlvdXMgcm93cy4gIE5vdGUKKyAgICAqIHRoYXQgdGhlIGZpcnN0IHBhc3MgKHBhc3MgPT0gMCByZWFsbHkpIHdpbGwgY29tcGxldGVseSBjb3ZlcgorICAgICogdGhlIG9sZCByb3csIHNvIHRoZSByb3dzIGRvIG5vdCBoYXZlIHRvIGJlIGluaXRpYWxpemVkLiAgQWZ0ZXIKKyAgICAqIHRoZSBmaXJzdCBwYXNzIChhbmQgb25seSBmb3IgaW50ZXJsYWNlZCBpbWFnZXMpLCB5b3Ugd2lsbCBoYXZlCisgICAgKiB0byBwYXNzIHRoZSBjdXJyZW50IHJvdyBhcyBuZXdfcm93LCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgY29tYmluZQorICAgICogdGhlIG9sZCByb3cgYW5kIHRoZSBuZXcgcm93LgorICAgICovCit9CisKK2VuZF9jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKK3sKKyAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHdob2xlIGltYWdlIGhhcyBiZWVuIHJlYWQsCisgICAgKiBpbmNsdWRpbmcgYW55IGNodW5rcyBhZnRlciB0aGUgaW1hZ2UgKHVwIHRvIGFuZCBpbmNsdWRpbmcKKyAgICAqIHRoZSBJRU5EKS4gIFlvdSB3aWxsIHVzdWFsbHkgaGF2ZSB0aGUgc2FtZSBpbmZvIGNodW5rIGFzIHlvdQorICAgICogaGFkIGluIHRoZSBoZWFkZXIsIGFsdGhvdWdoIHNvbWUgZGF0YSBtYXkgaGF2ZSBiZWVuIGFkZGVkCisgICAgKiB0byB0aGUgY29tbWVudHMgYW5kIHRpbWUgZmllbGRzLgorICAgICoKKyAgICAqIE1vc3QgcGVvcGxlIHdvbid0IGRvIG11Y2ggaGVyZSwgcGVyaGFwcyBzZXR0aW5nIGEgZmxhZyB0aGF0CisgICAgKiBtYXJrcyB0aGUgaW1hZ2UgYXMgZmluaXNoZWQuCisgICAgKi8KK30KKworLyogV3JpdGUgYSBwbmcgZmlsZSAqLwordm9pZCB3cml0ZV9wbmcoY2hhciAqZmlsZV9uYW1lIC8qICwgLi4uIG90aGVyIGltYWdlIGluZm9ybWF0aW9uIC4uLiAqLykKK3sKKyAgIEZJTEUgKmZwOworICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKKyAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKKyAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsKKworICAgLyogT3BlbiB0aGUgZmlsZSAqLworICAgZnAgPSBmb3BlbihmaWxlX25hbWUsICJ3YiIpOworICAgaWYgKGZwID09IE5VTEwpCisgICAgICByZXR1cm4gKEVSUk9SKTsKKworICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgorICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAorICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gY2hlY2sgdGhhdAorICAgICogdGhlIGxpYnJhcnkgdmVyc2lvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9uZSB1c2VkIGF0IGNvbXBpbGUgdGltZSwKKyAgICAqIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJpZXMuICBSRVFVSVJFRC4KKyAgICAqLworICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywKKyAgICAgIHBuZ192b2lkcCB1c2VyX2Vycm9yX3B0ciwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgIH0KKworICAgLyogQWxsb2NhdGUvaW5pdGlhbGl6ZSB0aGUgaW1hZ2UgaW5mb3JtYXRpb24gZGF0YS4gIFJFUVVJUkVEICovCisgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICBpZiAoaW5mb19wdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICBwbmdfaW5mb3BwX05VTEwpOworICAgICAgcmV0dXJuIChFUlJPUik7CisgICB9CisKKyAgIC8qIFNldCBlcnJvciBoYW5kbGluZy4gIFJFUVVJUkVEIGlmIHlvdSBhcmVuJ3Qgc3VwcGx5aW5nIHlvdXIgb3duCisgICAgKiBlcnJvciBoYW5kbGluZyBmdW5jdGlvbnMgaW4gdGhlIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCkgY2FsbC4KKyAgICAqLworICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgIHsKKyAgICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBoYWQgYSBwcm9ibGVtIHdyaXRpbmcgdGhlIGZpbGUgKi8KKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgIH0KKworICAgLyogT25lIG9mIHRoZSBmb2xsb3dpbmcgSS9PIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBpcyBSRVFVSVJFRCAqLworCisjaWZkZWYgc3RyZWFtcyAvKiBJL08gaW5pdGlhbGl6YXRpb24gbWV0aG9kIDEgKi8KKyAgIC8qIFNldCB1cCB0aGUgb3V0cHV0IGNvbnRyb2wgaWYgeW91IGFyZSB1c2luZyBzdGFuZGFyZCBDIHN0cmVhbXMgKi8KKyAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKKworI2Vsc2Ugbm9fc3RyZWFtcyAvKiBJL08gaW5pdGlhbGl6YXRpb24gbWV0aG9kIDIgKi8KKyAgIC8qIElmIHlvdSBhcmUgdXNpbmcgcmVwbGFjZW1lbnQgd3JpdGUgZnVuY3Rpb25zLCBpbnN0ZWFkIG9mIGNhbGxpbmcKKyAgICAqIHBuZ19pbml0X2lvKCkgaGVyZSB5b3Ugd291bGQgY2FsbAorICAgICovCisgICBwbmdfc2V0X3dyaXRlX2ZuKHBuZ19wdHIsICh2b2lkICopdXNlcl9pb19wdHIsIHVzZXJfd3JpdGVfZm4sCisgICAgICB1c2VyX0lPX2ZsdXNoX2Z1bmN0aW9uKTsKKyAgIC8qIHdoZXJlIHVzZXJfaW9fcHRyIGlzIGEgc3RydWN0dXJlIHlvdSB3YW50IGF2YWlsYWJsZSB0byB0aGUgY2FsbGJhY2tzICovCisjZW5kaWYgbm9fc3RyZWFtcyAvKiBPbmx5IHVzZSBvbmUgaW5pdGlhbGl6YXRpb24gbWV0aG9kICovCisKKyNpZmRlZiBoaWxldmVsCisgICAvKiBUaGlzIGlzIHRoZSBlYXN5IHdheS4gIFVzZSBpdCBpZiB5b3UgYWxyZWFkeSBoYXZlIGFsbCB0aGUKKyAgICAqIGltYWdlIGluZm8gbGl2aW5nIGluIHRoZSBzdHJ1Y3R1cmUuICBZb3UgY291bGQgInwiIG1hbnkKKyAgICAqIFBOR19UUkFOU0ZPUk0gZmxhZ3MgaW50byB0aGUgcG5nX3RyYW5zZm9ybXMgaW50ZWdlciBoZXJlLgorICAgICovCisgICBwbmdfd3JpdGVfcG5nKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfdHJhbnNmb3JtcywgcG5nX3ZvaWRwX05VTEwpOworCisjZWxzZQorICAgLyogVGhpcyBpcyB0aGUgaGFyZCB3YXkgKi8KKworICAgLyogU2V0IHRoZSBpbWFnZSBpbmZvcm1hdGlvbiBoZXJlLiAgV2lkdGggYW5kIGhlaWdodCBhcmUgdXAgdG8gMl4zMSwKKyAgICAqIGJpdF9kZXB0aCBpcyBvbmUgb2YgMSwgMiwgNCwgOCwgb3IgMTYsIGJ1dCB2YWxpZCB2YWx1ZXMgYWxzbyBkZXBlbmQgb24KKyAgICAqIHRoZSBjb2xvcl90eXBlIHNlbGVjdGVkLiBjb2xvcl90eXBlIGlzIG9uZSBvZiBQTkdfQ09MT1JfVFlQRV9HUkFZLAorICAgICogUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSwgUE5HX0NPTE9SX1RZUEVfUEFMRVRURSwgUE5HX0NPTE9SX1RZUEVfUkdCLAorICAgICogb3IgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBLiAgaW50ZXJsYWNlIGlzIGVpdGhlciBQTkdfSU5URVJMQUNFX05PTkUgb3IKKyAgICAqIFBOR19JTlRFUkxBQ0VfQURBTTcsIGFuZCB0aGUgY29tcHJlc3Npb25fdHlwZSBhbmQgZmlsdGVyX3R5cGUgTVVTVAorICAgICogY3VycmVudGx5IGJlIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgYW5kIFBOR19GSUxURVJfVFlQRV9CQVNFLiBSRVFVSVJFRAorICAgICovCisgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgUE5HX0NPTE9SX1RZUEVfPz8/LAorICAgICAgUE5HX0lOVEVSTEFDRV8/Pz8/LCBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7CisKKyAgIC8qIFNldCB0aGUgcGFsZXR0ZSBpZiB0aGVyZSBpcyBvbmUuICBSRVFVSVJFRCBmb3IgaW5kZXhlZC1jb2xvciBpbWFnZXMgKi8KKyAgIHBhbGV0dGUgPSAocG5nX2NvbG9ycClwbmdfbWFsbG9jKHBuZ19wdHIsIFBOR19NQVhfUEFMRVRURV9MRU5HVEgKKyAgICAgICAgICAgICAqIHBuZ19zaXplb2YocG5nX2NvbG9yKSk7CisgICAvKiAuLi4gU2V0IHBhbGV0dGUgY29sb3JzIC4uLiAqLworICAgcG5nX3NldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwYWxldHRlLCBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKTsKKyAgIC8qIFlvdSBtdXN0IG5vdCBmcmVlIHBhbGV0dGUgaGVyZSwgYmVjYXVzZSBwbmdfc2V0X1BMVEUgb25seSBtYWtlcyBhIGxpbmsgdG8KKyAgICAqIHRoZSBwYWxldHRlIHRoYXQgeW91IG1hbGxvY2VkLiAgV2FpdCB1bnRpbCB5b3UgYXJlIGFib3V0IHRvIGRlc3Ryb3kKKyAgICAqIHRoZSBwbmcgc3RydWN0dXJlLgorICAgICovCisKKyAgIC8qIE9wdGlvbmFsIHNpZ25pZmljYW50IGJpdCAoc0JJVCkgY2h1bmsgKi8KKyAgIHBuZ19jb2xvcl84IHNpZ19iaXQ7CisgICAvKiBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgZ3JheXNjYWxlIGltYWdlIHRoZW4gKi8KKyAgIHNpZ19iaXQuZ3JheSA9IHRydWVfYml0X2RlcHRoOworICAgLyogT3RoZXJ3aXNlLCBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgY29sb3IgaW1hZ2UgdGhlbiAqLworICAgc2lnX2JpdC5yZWQgPSB0cnVlX3JlZF9iaXRfZGVwdGg7CisgICBzaWdfYml0LmdyZWVuID0gdHJ1ZV9ncmVlbl9iaXRfZGVwdGg7CisgICBzaWdfYml0LmJsdWUgPSB0cnVlX2JsdWVfYml0X2RlcHRoOworICAgLyogSWYgdGhlIGltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsIHRoZW4gKi8KKyAgIHNpZ19iaXQuYWxwaGEgPSB0cnVlX2FscGhhX2JpdF9kZXB0aDsKKyAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOworCisKKyAgIC8qIE9wdGlvbmFsIGdhbW1hIGNodW5rIGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCBpZiB5b3UgaGF2ZSBhbnkgZ3Vlc3MKKyAgICAqIGFzIHRvIHRoZSBjb3JyZWN0IGdhbW1hIG9mIHRoZSBpbWFnZS4KKyAgICAqLworICAgcG5nX3NldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBnYW1tYSk7CisKKyAgIC8qIE9wdGlvbmFsbHkgd3JpdGUgY29tbWVudHMgaW50byB0aGUgaW1hZ2UgKi8KKyAgIHRleHRfcHRyWzBdLmtleSA9ICJUaXRsZSI7CisgICB0ZXh0X3B0clswXS50ZXh0ID0gIk1vbmEgTGlzYSI7CisgICB0ZXh0X3B0clswXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICB0ZXh0X3B0clsxXS5rZXkgPSAiQXV0aG9yIjsKKyAgIHRleHRfcHRyWzFdLnRleHQgPSAiTGVvbmFyZG8gRGFWaW5jaSI7CisgICB0ZXh0X3B0clsxXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICB0ZXh0X3B0clsyXS5rZXkgPSAiRGVzY3JpcHRpb24iOworICAgdGV4dF9wdHJbMl0udGV4dCA9ICI8bG9uZyB0ZXh0PiI7CisgICB0ZXh0X3B0clsyXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQ7CisjaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECisgICB0ZXh0X3B0clswXS5sYW5nID0gTlVMTDsKKyAgIHRleHRfcHRyWzFdLmxhbmcgPSBOVUxMOworICAgdGV4dF9wdHJbMl0ubGFuZyA9IE5VTEw7CisjZW5kaWYKKyAgIHBuZ19zZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIDMpOworCisgICAvKiBPdGhlciBvcHRpb25hbCBjaHVua3MgbGlrZSBjSFJNLCBiS0dELCB0Uk5TLCB0SU1FLCBvRkZzLCBwSFlzICovCisKKyAgIC8qIE5vdGUgdGhhdCBpZiBzUkdCIGlzIHByZXNlbnQgdGhlIGdBTUEgYW5kIGNIUk0gY2h1bmtzIG11c3QgYmUgaWdub3JlZAorICAgICogb24gcmVhZCBhbmQsIGlmIHlvdXIgYXBwbGljYXRpb24gY2hvb3NlcyB0byB3cml0ZSB0aGVtLCB0aGV5IG11c3QKKyAgICAqIGJlIHdyaXR0ZW4gaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBzUkdCIHByb2ZpbGUKKyAgICAqLworCisgICAvKiBXcml0ZSB0aGUgZmlsZSBoZWFkZXIgaW5mb3JtYXRpb24uICBSRVFVSVJFRCAqLworICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAvKiBJZiB5b3Ugd2FudCwgeW91IGNhbiB3cml0ZSB0aGUgaW5mbyBpbiB0d28gc3RlcHMsIGluIGNhc2UgeW91IG5lZWQgdG8KKyAgICAqIHdyaXRlIHlvdXIgcHJpdmF0ZSBjaHVuayBhaGVhZCBvZiBQTFRFOgorICAgICoKKyAgICAqICAgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0cik7CisgICAgKiAgIHdyaXRlX215X2NodW5rKCk7CisgICAgKiAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICAqCisgICAgKiBIb3dldmVyLCBnaXZlbiB0aGUgbGV2ZWwgb2Yga25vd24tIGFuZCB1bmtub3duLWNodW5rIHN1cHBvcnQgaW4gMS4yLjAKKyAgICAqIGFuZCB1cCwgdGhpcyBzaG91bGQgbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeS4KKyAgICAqLworCisgICAvKiBPbmNlIHdlIHdyaXRlIG91dCB0aGUgaGVhZGVyLCB0aGUgY29tcHJlc3Npb24gdHlwZSBvbiB0aGUgdGV4dAorICAgICogY2h1bmtzIGdldHMgY2hhbmdlZCB0byBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FX1dSIG9yCisgICAgKiBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSLCBzbyBpdCBkb2Vzbid0IGdldCB3cml0dGVuIG91dCBhZ2FpbgorICAgICogYXQgdGhlIGVuZC4KKyAgICAqLworCisgICAvKiBTZXQgdXAgdGhlIHRyYW5zZm9ybWF0aW9ucyB5b3Ugd2FudC4gIE5vdGUgdGhhdCB0aGVzZSBhcmUKKyAgICAqIGFsbCBvcHRpb25hbC4gIE9ubHkgY2FsbCB0aGVtIGlmIHlvdSB3YW50IHRoZW0uCisgICAgKi8KKworICAgLyogSW52ZXJ0IG1vbm9jaHJvbWUgcGl4ZWxzICovCisgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOworCisgICAvKiBTaGlmdCB0aGUgcGl4ZWxzIHVwIHRvIGEgbGVnYWwgYml0IGRlcHRoIGFuZCBmaWxsIGluCisgICAgKiBhcyBhcHByb3ByaWF0ZSB0byBjb3JyZWN0bHkgc2NhbGUgdGhlIGltYWdlLgorICAgICovCisgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsICZzaWdfYml0KTsKKworICAgLyogUGFjayBwaXhlbHMgaW50byBieXRlcyAqLworICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOworCisgICAvKiBTd2FwIGxvY2F0aW9uIG9mIGFscGhhIGJ5dGVzIGZyb20gQVJHQiB0byBSR0JBICovCisgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7CisKKyAgIC8qIEdldCByaWQgb2YgZmlsbGVyIChPUiBBTFBIQSkgYnl0ZXMsIHBhY2sgWFJHQi9SR0JYL0FSR0IvUkdCQSBpbnRvCisgICAgKiBSR0IgKDQgY2hhbm5lbHMgLT4gMyBjaGFubmVscykuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLgorICAgICovCisgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAwLCBQTkdfRklMTEVSX0JFRk9SRSk7CisKKyAgIC8qIEZsaXAgQkdSIHBpeGVscyB0byBSR0IgKi8KKyAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOworCisgICAvKiBTd2FwIGJ5dGVzIG9mIDE2LWJpdCBmaWxlcyB0byBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KKyAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKworICAgLyogU3dhcCBiaXRzIG9mIDEsIDIsIDQgYml0IHBhY2tlZCBwaXhlbCBmb3JtYXRzICovCisgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOworCisgICAvKiBUdXJuIG9uIGludGVybGFjZSBoYW5kbGluZyBpZiB5b3UgYXJlIG5vdCB1c2luZyBwbmdfd3JpdGVfaW1hZ2UoKSAqLworICAgaWYgKGludGVybGFjaW5nKQorICAgICAgbnVtYmVyX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworICAgZWxzZQorICAgICAgbnVtYmVyX3Bhc3NlcyA9IDE7CisKKyAgIC8qIFRoZSBlYXNpZXN0IHdheSB0byB3cml0ZSB0aGUgaW1hZ2UgKHlvdSBtYXkgaGF2ZSBhIGRpZmZlcmVudCBtZW1vcnkKKyAgICAqIGxheW91dCwgaG93ZXZlciwgc28gY2hvb3NlIHdoYXQgZml0cyB5b3VyIG5lZWRzIGJlc3QpLiAgWW91IG5lZWQgdG8KKyAgICAqIHVzZSB0aGUgZmlyc3QgbWV0aG9kIGlmIHlvdSBhcmVuJ3QgaGFuZGxpbmcgaW50ZXJsYWNpbmcgeW91cnNlbGYuCisgICAgKi8KKyAgIHBuZ191aW50XzMyIGssIGhlaWdodCwgd2lkdGg7CisgICBwbmdfYnl0ZSBpbWFnZVtoZWlnaHRdW3dpZHRoKmJ5dGVzX3Blcl9waXhlbF07CisgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07CisKKyAgIGlmIChoZWlnaHQgPiBQTkdfVUlOVF8zMl9NQVgvcG5nX3NpemVvZihwbmdfYnl0ZXApKQorICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsICJJbWFnZSBpcyB0b28gdGFsbCB0byBwcm9jZXNzIGluIG1lbW9yeSIpOworCisgICBmb3IgKGsgPSAwOyBrIDwgaGVpZ2h0OyBrKyspCisgICAgIHJvd19wb2ludGVyc1trXSA9IGltYWdlICsgayp3aWR0aCpieXRlc19wZXJfcGl4ZWw7CisKKyAgIC8qIE9uZSBvZiB0aGUgZm9sbG93aW5nIG91dHB1dCBtZXRob2RzIGlzIFJFUVVJUkVEICovCisKKyNpZmRlZiBlbnRpcmUgLyogV3JpdGUgb3V0IHRoZSBlbnRpcmUgaW1hZ2UgZGF0YSBpbiBvbmUgY2FsbCAqLworICAgcG5nX3dyaXRlX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7CisKKyAgIC8qIFRoZSBvdGhlciB3YXkgdG8gd3JpdGUgdGhlIGltYWdlIC0gZGVhbCB3aXRoIGludGVybGFjaW5nICovCisKKyNlbHNlIG5vX2VudGlyZSAvKiBXcml0ZSBvdXQgdGhlIGltYWdlIGRhdGEgYnkgb25lIG9yIG1vcmUgc2NhbmxpbmVzICovCisKKyAgIC8qIFRoZSBudW1iZXIgb2YgcGFzc2VzIGlzIGVpdGhlciAxIGZvciBub24taW50ZXJsYWNlZCBpbWFnZXMsCisgICAgKiBvciA3IGZvciBpbnRlcmxhY2VkIGltYWdlcy4KKyAgICAqLworICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IG51bWJlcl9wYXNzZXM7IHBhc3MrKykKKyAgIHsKKyAgICAgIC8qIFdyaXRlIGEgZmV3IHJvd3MgYXQgYSB0aW1lLiAqLworICAgICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgJnJvd19wb2ludGVyc1tmaXJzdF9yb3ddLCBudW1iZXJfb2Zfcm93cyk7CisKKyAgICAgIC8qIElmIHlvdSBhcmUgb25seSB3cml0aW5nIG9uZSByb3cgYXQgYSB0aW1lLCB0aGlzIHdvcmtzICovCisgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgICAgICBwbmdfd3JpdGVfcm93cyhwbmdfcHRyLCAmcm93X3BvaW50ZXJzW3ldLCAxKTsKKyAgIH0KKyNlbmRpZiBub19lbnRpcmUgLyogVXNlIG9ubHkgb25lIG91dHB1dCBtZXRob2QgKi8KKworICAgLyogWW91IGNhbiB3cml0ZSBvcHRpb25hbCBjaHVua3MgbGlrZSB0RVh0LCB6VFh0LCBhbmQgdElNRSBhdCB0aGUgZW5kCisgICAgKiBhcyB3ZWxsLiAgU2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBpbiAxLjIuMCBhbmQgdXAgYXMgYWxsIHRoZSBwdWJsaWMKKyAgICAqIGNodW5rcyBhcmUgc3VwcG9ydGVkIGFuZCB5b3UgY2FuIHVzZSBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkgdG8KKyAgICAqIHJlZ2lzdGVyIHVua25vd24gY2h1bmtzIGludG8gdGhlIGluZm8gc3RydWN0dXJlIHRvIGJlIHdyaXR0ZW4gb3V0LgorICAgICovCisKKyAgIC8qIEl0IGlzIFJFUVVJUkVEIHRvIGNhbGwgdGhpcyB0byBmaW5pc2ggd3JpdGluZyB0aGUgcmVzdCBvZiB0aGUgZmlsZSAqLworICAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7CisjZW5kaWYgaGlsZXZlbAorCisgICAvKiBJZiB5b3UgcG5nX21hbGxvY2VkIGEgcGFsZXR0ZSwgZnJlZSBpdCBoZXJlIChkb24ndCBmcmVlIGluZm9fcHRyLT5wYWxldHRlLAorICAgICogYXMgcmVjb21tZW5kZWQgaW4gdmVyc2lvbnMgMS4wLjVtIGFuZCBlYXJsaWVyIG9mIHRoaXMgZXhhbXBsZTsgaWYKKyAgICAqIGxpYnBuZyBtYWxsb2NzIGluZm9fcHRyLT5wYWxldHRlLCBsaWJwbmcgd2lsbCBmcmVlIGl0KS4gIElmIHlvdQorICAgICogYWxsb2NhdGVkIGl0IHdpdGggbWFsbG9jKCkgaW5zdGVhZCBvZiBwbmdfbWFsbG9jKCksIHVzZSBmcmVlKCkgaW5zdGVhZAorICAgICogb2YgcG5nX2ZyZWUoKS4KKyAgICAqLworICAgcG5nX2ZyZWUocG5nX3B0ciwgcGFsZXR0ZSk7CisgICBwYWxldHRlID0gTlVMTDsKKworICAgLyogU2ltaWxhcmx5LCBpZiB5b3UgcG5nX21hbGxvY2VkIGFueSBkYXRhIHRoYXQgeW91IHBhc3NlZCBpbiB3aXRoCisgICAgKiBwbmdfc2V0X3NvbWV0aGluZygpLCBzdWNoIGFzIGEgaGlzdCBvciB0cmFucyBhcnJheSwgZnJlZSBpdCBoZXJlLAorICAgICogd2hlbiB5b3UgY2FuIGJlIHN1cmUgdGhhdCBsaWJwbmcgaXMgdGhyb3VnaCB3aXRoIGl0LgorICAgICovCisgICBwbmdfZnJlZShwbmdfcHRyLCB0cmFucyk7CisgICB0cmFucyA9IE5VTEw7CisgICAvKiBXaGVuZXZlciB5b3UgdXNlIHBuZ19mcmVlKCkgaXQgaXMgYSBnb29kIGlkZWEgdG8gc2V0IHRoZSBwb2ludGVyIHRvCisgICAgKiBOVUxMIGluIGNhc2UgeW91ciBhcHBsaWNhdGlvbiBpbmFkdmVydGVudGx5IHRyaWVzIHRvIHBuZ19mcmVlKCkgaXQKKyAgICAqIGFnYWluLiAgV2hlbiBwbmdfZnJlZSgpIHNlZXMgYSBOVUxMIGl0IHJldHVybnMgd2l0aG91dCBhY3Rpb24sIHRodXMKKyAgICAqIGF2b2lkaW5nIHRoZSBkb3VibGUtZnJlZSBzZWN1cml0eSBwcm9ibGVtLgorICAgICovCisKKyAgIC8qIENsZWFuIHVwIGFmdGVyIHRoZSB3cml0ZSwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgKi8KKyAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKworICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KKyAgIGZjbG9zZShmcCk7CisKKyAgIC8qIFRoYXQncyBpdCAqLworICAgcmV0dXJuIChPSyk7Cit9CisKKyNlbmRpZiAvKiBpZiAwICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL2xpYnBuZy4zIGIvY29tMzIvbGliL2xpYnBuZy9saWJwbmcuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzEzOWE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9saWJwbmcuMwpAQCAtMCwwICsxLDQ0OTAgQEAKKy5USCBMSUJQTkcgMyAiSnVuZSAyNiwgMjAxMCIKKy5TSCBOQU1FCitsaWJwbmcgXC0gUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKSBSZWZlcmVuY2UgTGlicmFyeSAxLjIuNDQKKy5TSCBTWU5PUFNJUworXGZJXGZCCisKK1xmQiNpbmNsdWRlIDxwbmcuaD5cZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIgXGZJKHZvaWRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCaW50IHBuZ19jaGVja19zaWcgKHBuZ19ieXRlcCBcZlBcZklzaWdcZlBcZkIsIGludCBcZkludW1cZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfY2h1bmtfZXJyb3IgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZkllcnJvclxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19jaHVua193YXJuaW5nIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJbWVzc2FnZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtIChwbmdfdGltZXAgXGZQXGZJcHRpbWVcZlBcZkIsIHN0cnVjdCB0bSBGQVIgKiBcZkl0dGltZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90IChwbmdfdGltZXAgXGZQXGZJcHRpbWVcZlBcZkIsIHRpbWVfdCBcZkl0dGltZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfY2hhcnAgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3RpbWVwIFxmSXB0aW1lXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19pbmZvcCBwbmdfY3JlYXRlX2luZm9fc3RydWN0IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19zdHJ1Y3RwIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QgKHBuZ19jb25zdF9jaGFycCBcZlBcZkl1c2VyX3BuZ192ZXJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZkllcnJvcl9wdHJcZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZQXGZJZXJyb3JfZm5cZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZJd2Fybl9mblxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfc3RydWN0cCBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIocG5nX2NvbnN0X2NoYXJwIFxmUFxmSXVzZXJfcG5nX3ZlclxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSWVycm9yX3B0clxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkllcnJvcl9mblxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkl3YXJuX2ZuXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJbWVtX3B0clxmUFxmQiwgcG5nX21hbGxvY19wdHIgXGZQXGZJbWFsbG9jX2ZuXGZQXGZCLCBwbmdfZnJlZV9wdHIgXGZJZnJlZV9mblxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfc3RydWN0cCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCAocG5nX2NvbnN0X2NoYXJwIFxmUFxmSXVzZXJfcG5nX3ZlclxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSWVycm9yX3B0clxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkllcnJvcl9mblxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZkl3YXJuX2ZuXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19zdHJ1Y3RwIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIocG5nX2NvbnN0X2NoYXJwIFxmUFxmSXVzZXJfcG5nX3ZlclxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSWVycm9yX3B0clxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkllcnJvcl9mblxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkl3YXJuX2ZuXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJbWVtX3B0clxmUFxmQiwgcG5nX21hbGxvY19wdHIgXGZQXGZJbWFsbG9jX2ZuXGZQXGZCLCBwbmdfZnJlZV9wdHIgXGZJZnJlZV9mblxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJpbnQgcG5nX2RlYnVnKGludCBcZlBcZklsZXZlbFxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSW1lc3NhZ2VcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCaW50IHBuZ19kZWJ1ZzEoaW50IFxmUFxmSWxldmVsXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZQXGZJbWVzc2FnZVxmUFxmQiwgXGZJcDFcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCaW50IHBuZ19kZWJ1ZzIoaW50IFxmUFxmSWxldmVsXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZQXGZJbWVzc2FnZVxmUFxmQiwgXGZQXGZJcDFcZlBcZkIsIFxmSXAyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcHAgXGZJaW5mb19wdHJfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgKHBuZ19zdHJ1Y3RwcCBcZlBcZklwbmdfcHRyX3B0clxmUFxmQiwgcG5nX2luZm9wcCBcZlBcZklpbmZvX3B0cl9wdHJcZlBcZkIsIHBuZ19pbmZvcHAgXGZJZW5kX2luZm9fcHRyX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAocG5nX3N0cnVjdHBwIFxmUFxmSXBuZ19wdHJfcHRyXGZQXGZCLCBwbmdfaW5mb3BwIFxmSWluZm9fcHRyX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19lcnJvciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSWVycm9yXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2ZyZWUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZklwdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZnJlZV9jaHVua19saXN0IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2ZyZWVfZGVmYXVsdChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZJcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2ZyZWVfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZJbnVtXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfYml0X2RlcHRoIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9iS0dEIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZJKmJhY2tncm91bmRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX2J5dGUgcG5nX2dldF9jaGFubmVscyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfY0hSTSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBkb3VibGUgXGZQXGZJKndoaXRlX3hcZlBcZkIsIGRvdWJsZSBcZlBcZkkqd2hpdGVfeVxmUFxmQiwgZG91YmxlIFxmUFxmSSpyZWRfeFxmUFxmQiwgZG91YmxlIFxmUFxmSSpyZWRfeVxmUFxmQiwgZG91YmxlIFxmUFxmSSpncmVlbl94XGZQXGZCLCBkb3VibGUgXGZQXGZJKmdyZWVuX3lcZlBcZkIsIGRvdWJsZSBcZlBcZkkqYmx1ZV94XGZQXGZCLCBkb3VibGUgXGZJKmJsdWVfeVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NIUk1fZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKndoaXRlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSp3aGl0ZV95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqcmVkX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpyZWRfeVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKmdyZWVuX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpncmVlbl95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqYmx1ZV94XGZQXGZCLCBwbmdfdWludF8zMiBcZkkqYmx1ZV95XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfY29sb3JfdHlwZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfY29weXJpZ2h0IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ192b2lkcCBwbmdfZ2V0X2Vycm9yX3B0ciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfYnl0ZSBwbmdfZ2V0X2ZpbHRlcl90eXBlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9nQU1BIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGRvdWJsZSBcZkkqZmlsZV9nYW1tYVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2dBTUFfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJKmludF9maWxlX2dhbW1hXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfaGVhZGVyX3ZlciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfYnl0ZSBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfaElTVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8xNnAgXGZJKmhpc3RcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9pQ0NQIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jaGFycHAgXGZQXGZJbmFtZVxmUFxmQiwgaW50IFxmUFxmSSpjb21wcmVzc2lvbl90eXBlXGZQXGZCLCBwbmdfY2hhcnBwIFxmUFxmSXByb2ZpbGVcZlBcZkIsIHBuZ191aW50XzMyIFxmSSpwcm9mbGVuXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfSUhEUiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqd2lkdGhcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpoZWlnaHRcZlBcZkIsIGludCBcZlBcZkkqYml0X2RlcHRoXGZQXGZCLCBpbnQgXGZQXGZJKmNvbG9yX3R5cGVcZlBcZkIsIGludCBcZlBcZkkqaW50ZXJsYWNlX3R5cGVcZlBcZkIsIGludCBcZlBcZkkqY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgaW50IFxmSSpmaWx0ZXJfdHlwZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X2ltYWdlX2hlaWdodCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfaW1hZ2Vfd2lkdGggKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkIjaWYgXGZJIWRlZmluZWQoUE5HXzFfMF9YKQorCitcZkJwbmdfaW50XzMyIHBuZ19nZXRfaW50XzMyIChwbmdfYnl0ZXAgXGZJYnVmXGZQXGZCKTtcZlAKKworXGZJXGZCI2VuZGlmCisKK1xmSVxmQgorCitcZkJwbmdfYnl0ZSBwbmdfZ2V0X2ludGVybGFjZV90eXBlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX3ZvaWRwIHBuZ19nZXRfaW9fcHRyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19ieXRlIHBuZ19nZXRfbGlicG5nX3ZlciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdm9pZHAgcG5nX2dldF9tZW1fcHRyKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9vRkZzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpvZmZzZXRfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKm9mZnNldF95XGZQXGZCLCBpbnQgXGZJKnVuaXRfdHlwZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3BDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSSpwdXJwb3NlXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSSpYMFxmUFxmQiwgcG5nX2ludF8zMiBcZlBcZkkqWDFcZlBcZkIsIGludCBcZlBcZkkqdHlwZVxmUFxmQiwgaW50IFxmUFxmSSpucGFyYW1zXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJKnVuaXRzXGZQXGZCLCBwbmdfY2hhcnBwIFxmSSpwYXJhbXNcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9wSFlzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpyZXNfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlc195XGZQXGZCLCBpbnQgXGZJKnVuaXRfdHlwZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJmbG9hdCBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ192b2lkcCBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0ciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X1BMVEUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9ycCBcZlBcZkkqcGFsZXR0ZVxmUFxmQiwgaW50IFxmSSpudW1fcGFsZXR0ZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfYnl0ZSBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0cikKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9yb3dieXRlcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19ieXRlcHAgcG5nX2dldF9yb3dzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9zQklUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcl84cCBcZkkqc2lnX2JpdFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfYnl0ZXAgcG5nX2dldF9zaWduYXR1cmUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3NQTFQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3NwYWxldHRlX3AgXGZJKnNwbHRfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfc1JHQiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZJKmludGVudFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3RleHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RleHRwIFxmUFxmSSp0ZXh0X3B0clxmUFxmQiwgaW50IFxmSSpudW1fdGV4dFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3RJTUUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RpbWVwIFxmSSptb2RfdGltZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3RSTlMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSSp0cmFuc1xmUFxmQiwgaW50IFxmUFxmSSpudW1fdHJhbnNcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZJKnRyYW5zX3ZhbHVlc1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkIjaWYgXGZJIWRlZmluZWQoUE5HXzFfMF9YKQorCitcZkJwbmdfdWludF8xNiBwbmdfZ2V0X3VpbnRfMTYgKHBuZ19ieXRlcCBcZklidWZcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF91aW50XzMxIChwbmdfYnl0ZXAgXGZJYnVmXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfdWludF8zMiAocG5nX2J5dGVwIFxmSWJ1ZlxmUFxmQik7XGZQCisKK1xmSVxmQiNlbmRpZgorCitcZklcZkIKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF91bmtub3duX2NodW5rcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdW5rbm93bl9jaHVua3BwIFxmSXVua25vd25zXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ192b2lkcCBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4KCBwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ192b2lkcCBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0ciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfdmFsaWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJZmxhZ1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfaW50XzMyIHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19pbnRfMzIgcG5nX2dldF94X29mZnNldF9waXhlbHMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ19pbnRfMzIgcG5nX2dldF95X29mZnNldF9taWNyb25zIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX2ludF8zMiBwbmdfZ2V0X3lfb2Zmc2V0X3BpeGVscyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ191aW50XzMyIHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJpbnQgcG5nX2hhbmRsZV9hc191bmtub3duIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZJY2h1bmtfbmFtZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19pbml0X2lvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBGSUxFIFxmSSpmcFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJERVBSRUNBVEVEOiB2b2lkIHBuZ19pbmZvX2luaXQgKHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJERVBSRUNBVEVEOiB2b2lkIHBuZ19pbmZvX2luaXRfMiAocG5nX2luZm9wcCBcZlBcZklwdHJfcHRyXGZQXGZCLCBwbmdfc2l6ZV90IFxmSXBuZ19pbmZvX3N0cnVjdF9zaXplXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ192b2lkcCBwbmdfbWFsbG9jIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklzaXplXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ192b2lkcCBwbmdfbWFsbG9jX2RlZmF1bHQocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJc2l6ZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkcCBwbmdfbWVtY3B5IChwbmdfdm9pZHAgXGZQXGZJczFcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklzMlxmUFxmQiwgcG5nX3NpemVfdCBcZklzaXplXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ192b2lkcCBwbmdfbWVtY3B5X2NoZWNrIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJczFcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklzMlxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJc2l6ZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkcCBwbmdfbWVtc2V0IChwbmdfdm9pZHAgXGZQXGZJczFcZlBcZkIsIGludCBcZlBcZkl2YWx1ZVxmUFxmQiwgcG5nX3NpemVfdCBcZklzaXplXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnBuZ192b2lkcCBwbmdfbWVtc2V0X2NoZWNrIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJczFcZlBcZkIsIGludCBcZlBcZkl2YWx1ZVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJc2l6ZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJERVBSRUNBVEVEOiB2b2lkIHBuZ19wZXJtaXRfZW1wdHlfcGx0ZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSWVtcHR5X3BsdGVfcGVybWl0dGVkXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3Byb2Nlc3NfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJYnVmZmVyXGZQXGZCLCBwbmdfc2l6ZV90IFxmSWJ1ZmZlcl9zaXplXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJb2xkX3Jvd1xmUFxmQiwgcG5nX2J5dGVwIFxmSW5ld19yb3dcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcmVhZF9kZXN0cm95IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZkllbmRfaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcmVhZF9lbmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19yZWFkX2ltYWdlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXBwIFxmSWltYWdlXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQkRFUFJFQ0FURUQ6IHZvaWQgcG5nX3JlYWRfaW5pdCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJERVBSRUNBVEVEOiB2b2lkIHBuZ19yZWFkX2luaXRfMiAocG5nX3N0cnVjdHBwIFxmUFxmSXB0cl9wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZlBcZkl1c2VyX3BuZ192ZXJcZlBcZkIsIHBuZ19zaXplX3QgXGZQXGZJcG5nX3N0cnVjdF9zaXplXGZQXGZCLCBwbmdfc2l6ZV90IFxmSXBuZ19pbmZvX3NpemVcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcmVhZF9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcmVhZF9wbmcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSXRyYW5zZm9ybXNcZlBcZkIsIHBuZ192b2lkcCBcZklwYXJhbXNcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcmVhZF9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcCBcZklkaXNwbGF5X3Jvd1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19yZWFkX3Jvd3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZQXGZJcm93XGZQXGZCLCBwbmdfYnl0ZXBwIFxmUFxmSWRpc3BsYXlfcm93XGZQXGZCLCBwbmdfdWludF8zMiBcZkludW1fcm93c1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCI2lmIFxmSSFkZWZpbmVkKFBOR18xXzBfWCkKKworXGZCcG5nX3NhdmVfaW50XzMyIChwbmdfYnl0ZXAgXGZQXGZJYnVmXGZQXGZCLCBwbmdfaW50XzMyIFxmSWlcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2F2ZV91aW50XzE2IChwbmdfYnl0ZXAgXGZQXGZJYnVmXGZQXGZCLCB1bnNpZ25lZCBpbnQgXGZJaVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zYXZlX3VpbnRfMzIgKHBuZ19ieXRlcCBcZlBcZklidWZcZlBcZkIsIHBuZ191aW50XzMyIFxmSWlcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2FkZF9hbHBoYSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZmlsbGVyXGZQXGZCLCBpbnQgXGZJZmxhZ3NcZlBcZkIpO1xmUAorCitcZklcZkIjZW5kaWYKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9iYWNrZ3JvdW5kIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmUFxmSWJhY2tncm91bmRfY29sb3JcZlBcZkIsIGludCBcZlBcZkliYWNrZ3JvdW5kX2dhbW1hX2NvZGVcZlBcZkIsIGludCBcZlBcZkluZWVkX2V4cGFuZFxmUFxmQiwgZG91YmxlIFxmSWJhY2tncm91bmRfZ2FtbWFcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2JnciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfYktHRCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmSWJhY2tncm91bmRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2NIUk0gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgZG91YmxlIFxmUFxmSXdoaXRlX3hcZlBcZkIsIGRvdWJsZSBcZlBcZkl3aGl0ZV95XGZQXGZCLCBkb3VibGUgXGZQXGZJcmVkX3hcZlBcZkIsIGRvdWJsZSBcZlBcZklyZWRfeVxmUFxmQiwgZG91YmxlIFxmUFxmSWdyZWVuX3hcZlBcZkIsIGRvdWJsZSBcZlBcZklncmVlbl95XGZQXGZCLCBkb3VibGUgXGZQXGZJYmx1ZV94XGZQXGZCLCBkb3VibGUgXGZJYmx1ZV95XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9jSFJNX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdoaXRlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdoaXRlX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXJlZF94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklyZWRfeVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZ3JlZW5feFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZ3JlZW5feVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJYmx1ZV94XGZQXGZCLCBwbmdfdWludF8zMiBcZklibHVlX3lcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbGV2ZWxcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSW1lbV9sZXZlbFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbWV0aG9kXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSXN0cmF0ZWd5XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSXdpbmRvd19iaXRzXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9jcmNfYWN0aW9uIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJY3JpdF9hY3Rpb25cZlBcZkIsIGludCBcZklhbmNpbF9hY3Rpb25cZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2RpdGhlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbG9ycCBcZlBcZklwYWxldHRlXGZQXGZCLCBpbnQgXGZQXGZJbnVtX3BhbGV0dGVcZlBcZkIsIGludCBcZlBcZkltYXhpbXVtX2NvbG9yc1xmUFxmQiwgcG5nX3VpbnRfMTZwIFxmUFxmSWhpc3RvZ3JhbVxmUFxmQiwgaW50IFxmSWZ1bGxfZGl0aGVyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9lcnJvcl9mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSWVycm9yX3B0clxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkllcnJvcl9mblxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZkl3YXJuaW5nX2ZuXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9leHBhbmQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfZmlsbGVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklmaWxsZXJcZlBcZkIsIGludCBcZklmbGFnc1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfZmlsdGVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJbWV0aG9kXGZQXGZCLCBpbnQgXGZJZmlsdGVyc1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZkloZXVyaXN0aWNfbWV0aG9kXGZQXGZCLCBpbnQgXGZQXGZJbnVtX3dlaWdodHNcZlBcZkIsIHBuZ19kb3VibGVwIFxmUFxmSWZpbHRlcl93ZWlnaHRzXGZQXGZCLCBwbmdfZG91YmxlcCBcZklmaWx0ZXJfY29zdHNcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2ZsdXNoIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbnJvd3NcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2dhbW1hIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBkb3VibGUgXGZQXGZJc2NyZWVuX2dhbW1hXGZQXGZCLCBkb3VibGUgXGZJZGVmYXVsdF9maWxlX2dhbW1hXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9nQU1BIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGRvdWJsZSBcZklmaWxlX2dhbW1hXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9nQU1BX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWZpbGVfZ2FtbWFcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9ncmF5X3RvX3JnYiAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfaElTVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8xNnAgXGZJaGlzdFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfaUNDUCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJbmFtZVxmUFxmQiwgaW50IFxmUFxmSWNvbXByZXNzaW9uX3R5cGVcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklwcm9maWxlXGZQXGZCLCBwbmdfdWludF8zMiBcZklwcm9mbGVuXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQmludCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfaW52YWxpZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZJbWFza1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfaW52ZXJ0X2FscGhhIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9pbnZlcnRfbW9ubyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfSUhEUiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl3aWR0aFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJaGVpZ2h0XGZQXGZCLCBpbnQgXGZQXGZJYml0X2RlcHRoXGZQXGZCLCBpbnQgXGZQXGZJY29sb3JfdHlwZVxmUFxmQiwgaW50IFxmUFxmSWludGVybGFjZV90eXBlXGZQXGZCLCBpbnQgXGZQXGZJY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgaW50IFxmSWZpbHRlcl90eXBlXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJa2VlcFxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWNodW5rX2xpc3RcZlBcZkIsIGludCBcZkludW1fY2h1bmtzXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9tZW1fZm4ocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSW1lbV9wdHJcZlBcZkIsIHBuZ19tYWxsb2NfcHRyIFxmUFxmSW1hbGxvY19mblxmUFxmQiwgcG5nX2ZyZWVfcHRyIFxmSWZyZWVfZm5cZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X29GRnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJb2Zmc2V0X3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSW9mZnNldF95XGZQXGZCLCBpbnQgXGZJdW5pdF90eXBlXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9wYWNraW5nIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9wYWNrc3dhcCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfcENBTCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJcHVycG9zZVxmUFxmQiwgcG5nX2ludF8zMiBcZlBcZklYMFxmUFxmQiwgcG5nX2ludF8zMiBcZlBcZklYMVxmUFxmQiwgaW50IFxmUFxmSXR5cGVcZlBcZkIsIGludCBcZlBcZklucGFyYW1zXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJdW5pdHNcZlBcZkIsIHBuZ19jaGFycHAgXGZJcGFyYW1zXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9wSFlzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXJlc194XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklyZXNfeVxmUFxmQiwgaW50IFxmSXVuaXRfdHlwZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSXByb2dyZXNzaXZlX3B0clxmUFxmQiwgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIFxmUFxmSWluZm9fZm5cZlBcZkIsIHBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyIFxmUFxmSXJvd19mblxmUFxmQiwgcG5nX3Byb2dyZXNzaXZlX2VuZF9wdHIgXGZJZW5kX2ZuXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9QTFRFIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcnAgXGZQXGZJcGFsZXR0ZVxmUFxmQiwgaW50IFxmSW51bV9wYWxldHRlXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9yZWFkX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJaW9fcHRyXGZQXGZCLCBwbmdfcndfcHRyIFxmSXJlYWRfZGF0YV9mblxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19yZWFkX3N0YXR1c19wdHIgXGZJcmVhZF9yb3dfZm5cZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgXGZJcmVhZF91c2VyX3RyYW5zZm9ybV9mblxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfcmdiX3RvX2dyYXkgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZkllcnJvcl9hY3Rpb25cZlBcZkIsIGRvdWJsZSBcZlBcZklyZWRcZlBcZkIsIGRvdWJsZSBcZklncmVlblxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBlcnJvcl9hY3Rpb24gcG5nX2ZpeGVkX3BvaW50IFxmUFxmSXJlZFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmSWdyZWVuXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9yb3dzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZJcm93X3BvaW50ZXJzXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9zQklUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcl84cCBcZklzaWdfYml0XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9zQ0FMIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl1bml0XGZQXGZCLCBkb3VibGUgXGZQXGZJd2lkdGhcZlBcZkIsIGRvdWJsZSBcZkloZWlnaHRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3NoaWZ0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JfOHAgXGZJdHJ1ZV9iaXRzXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9zaWdfYnl0ZXMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZkludW1fYnl0ZXNcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3NQTFQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3NwYWxldHRlX3AgXGZQXGZJc3BsdF9wdHJcZlBcZkIsIGludCBcZkludW1fc3BhbGV0dGVzXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9zUkdCIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZklpbnRlbnRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZJaW50ZW50XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF9zdHJpcF8xNiAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfc3RyaXBfYWxwaGEgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3N3YXAgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3N3YXBfYWxwaGEgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3RleHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RleHRwIFxmUFxmSXRleHRfcHRyXGZQXGZCLCBpbnQgXGZJbnVtX3RleHRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3RJTUUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RpbWVwIFxmSW1vZF90aW1lXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF90Uk5TIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkl0cmFuc1xmUFxmQiwgaW50IFxmUFxmSW51bV90cmFuc1xmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZkl0cmFuc192YWx1ZXNcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3RSTlNfdG9fYWxwaGEocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfc2V0X3Vua25vd25fY2h1bmtzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191bmtub3duX2NodW5rcCBcZlBcZkl1bmtub3duc1xmUFxmQiwgaW50IFxmUFxmSW51bVxmUFxmQiwgaW50IFxmSWxvY2F0aW9uXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSWNodW5rXGZQXGZCLCBpbnQgXGZJbG9jYXRpb25cZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSXVzZXJfY2h1bmtfcHRyXGZQXGZCLCBwbmdfdXNlcl9jaHVua19wdHIgXGZJcmVhZF91c2VyX2NodW5rX2ZuXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF91c2VyX2xpbWl0cyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJdXNlcl93aWR0aF9tYXhcZlBcZkIsIHBuZ191aW50XzMyIFxmSXVzZXJfaGVpZ2h0X21heFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSXVzZXJfdHJhbnNmb3JtX3B0clxmUFxmQiwgaW50IFxmUFxmSXVzZXJfdHJhbnNmb3JtX2RlcHRoXGZQXGZCLCBpbnQgXGZJdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHNcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X3dyaXRlX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJaW9fcHRyXGZQXGZCLCBwbmdfcndfcHRyIFxmUFxmSXdyaXRlX2RhdGFfZm5cZlBcZkIsIHBuZ19mbHVzaF9wdHIgXGZJb3V0cHV0X2ZsdXNoX2ZuXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ193cml0ZV9zdGF0dXNfcHRyIFxmSXdyaXRlX3Jvd19mblxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgXGZJd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm5cZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSXNpemVcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCaW50IHBuZ19zaWdfY21wIChwbmdfYnl0ZXAgXGZQXGZJc2lnXGZQXGZCLCBwbmdfc2l6ZV90IFxmUFxmSXN0YXJ0XGZQXGZCLCBwbmdfc2l6ZV90IFxmSW51bV90b19jaGVja1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19zdGFydF9yZWFkX2ltYWdlIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dhcm5pbmcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZkltZXNzYWdlXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX2NodW5rIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJY2h1bmtfbmFtZVxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX2NodW5rX2RhdGEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklkYXRhXGZQXGZCLCBwbmdfc2l6ZV90IFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9jaHVua19lbmQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfY2h1bmtfc3RhcnQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkljaHVua19uYW1lXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfZGVzdHJveSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9lbmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9mbHVzaCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9pbWFnZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZklpbWFnZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJERVBSRUNBVEVEOiB2b2lkIHBuZ193cml0ZV9pbml0IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQkRFUFJFQ0FURUQ6IHZvaWQgcG5nX3dyaXRlX2luaXRfMiAocG5nX3N0cnVjdHBwIFxmUFxmSXB0cl9wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZlBcZkl1c2VyX3BuZ192ZXJcZlBcZkIsIHBuZ19zaXplX3QgXGZQXGZJcG5nX3N0cnVjdF9zaXplXGZQXGZCLCBwbmdfc2l6ZV90IFxmSXBuZ19pbmZvX3NpemVcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfaW5mbyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9wbmcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSXRyYW5zZm9ybXNcZlBcZkIsIHBuZ192b2lkcCBcZklwYXJhbXNcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfcm93IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX3Jvd3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZQXGZJcm93XGZQXGZCLCBwbmdfdWludF8zMiBcZkludW1fcm93c1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkcGYgcG5nX3phbGxvYyAodm9pZHBmIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHVJbnQgXGZQXGZJaXRlbXNcZlBcZkIsIHVJbnQgXGZJc2l6ZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ196ZnJlZSAodm9pZHBmIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHZvaWRwZiBcZklwdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworLlNIIERFU0NSSVBUSU9OCitUaGUKKy5JIGxpYnBuZworbGlicmFyeSBzdXBwb3J0cyBlbmNvZGluZywgZGVjb2RpbmcsIGFuZCB2YXJpb3VzIG1hbmlwdWxhdGlvbnMgb2YKK3RoZSBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIGZvcm1hdCBpbWFnZSBmaWxlcy4gIEl0IHVzZXMgdGhlCisuSVIgemxpYigzKQorY29tcHJlc3Npb24gbGlicmFyeS4KK0ZvbGxvd2luZyBpcyBhIGNvcHkgb2YgdGhlIGxpYnBuZy50eHQgZmlsZSB0aGF0IGFjY29tcGFuaWVzIGxpYnBuZy4KKy5TSCBMSUJQTkcuVFhUCitsaWJwbmcudHh0IC0gQSBkZXNjcmlwdGlvbiBvbiBob3cgdG8gdXNlIGFuZCBtb2RpZnkgbGlicG5nCisKKyBsaWJwbmcgdmVyc2lvbiAxLjIuNDQgLSBKdW5lIDI2LCAyMDEwCisgVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgPGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgorIENvcHlyaWdodCAoYykgMTk5OC0yMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorCisgVGhpcyBkb2N1bWVudCBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorIGFuZCBsaWNlbnNlIGluIHBuZy5oCisKKyBCYXNlZCBvbjoKKworIGxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS4yLjQ0IC0gSnVuZSAyNiwgMjAxMAorIFVwZGF0ZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIENvcHlyaWdodCAoYykgMTk5OC0yMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorCisgbGlicG5nIDEuMCBiZXRhIDYgIHZlcnNpb24gMC45NiBNYXkgMjgsIDE5OTcKKyBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBBbmRyZWFzIERpbGdlcgorIENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgorCisgbGlicG5nIDEuMCBiZXRhIDIgLSB2ZXJzaW9uIDAuODggIEphbnVhcnkgMjYsIDE5OTYKKyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodAorIG5vdGljZSBpbiBwbmcuaC4gQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljCisgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCisKKyBVcGRhdGVkL3Jld3JpdHRlbiBwZXIgcmVxdWVzdCBpbiB0aGUgbGlicG5nIEZBUQorIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBGcmFuayBKLiBULiBXb2pjaWsKKyBEZWNlbWJlciAxOCwgMTk5NSAmIEphbnVhcnkgMjAsIDE5OTYKKworLlNIIEkuIEludHJvZHVjdGlvbgorCitUaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byB1c2UgYW5kIG1vZGlmeSB0aGUgUE5HIHJlZmVyZW5jZSBsaWJyYXJ5Cisoa25vd24gYXMgbGlicG5nKSBmb3IgeW91ciBvd24gdXNlLiAgVGhlcmUgYXJlIGZpdmUgc2VjdGlvbnMgdG8gdGhpcworZmlsZTogaW50cm9kdWN0aW9uLCBzdHJ1Y3R1cmVzLCByZWFkaW5nLCB3cml0aW5nLCBhbmQgbW9kaWZpY2F0aW9uIGFuZAorY29uZmlndXJhdGlvbiBub3RlcyBmb3IgdmFyaW91cyBzcGVjaWFsIHBsYXRmb3Jtcy4gIEluIGFkZGl0aW9uIHRvIHRoaXMKK2ZpbGUsIGV4YW1wbGUuYyBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVzaW5nIHRoZSBsaWJyYXJ5LCBhcworaXQgaXMgaGVhdmlseSBjb21tZW50ZWQgYW5kIHNob3VsZCBpbmNsdWRlIGV2ZXJ5dGhpbmcgbW9zdCBwZW9wbGUKK3dpbGwgbmVlZC4gIFdlIGFzc3VtZSB0aGF0IGxpYnBuZyBpcyBhbHJlYWR5IGluc3RhbGxlZDsgc2VlIHRoZQorSU5TVEFMTCBmaWxlIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGluc3RhbGwgbGlicG5nLgorCitGb3IgZXhhbXBsZXMgb2YgbGlicG5nIHVzYWdlLCBzZWUgdGhlIGZpbGVzICJleGFtcGxlLmMiLCAicG5ndGVzdC5jIiwKK2FuZCB0aGUgZmlsZXMgaW4gdGhlICJjb250cmliIiBkaXJlY3RvcnksIGFsbCBvZiB3aGljaCBhcmUgaW5jbHVkZWQgaW4KK3RoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLgorCitMaWJwbmcgd2FzIHdyaXR0ZW4gYXMgYSBjb21wYW5pb24gdG8gdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBhcyBhIHdheQorb2YgcmVkdWNpbmcgdGhlIGFtb3VudCBvZiB0aW1lIGFuZCBlZmZvcnQgaXQgdGFrZXMgdG8gc3VwcG9ydCB0aGUgUE5HCitmaWxlIGZvcm1hdCBpbiBhcHBsaWNhdGlvbiBwcm9ncmFtcy4KKworVGhlIFBORyBzcGVjaWZpY2F0aW9uIChzZWNvbmQgZWRpdGlvbiksIE5vdmVtYmVyIDIwMDMsIGlzIGF2YWlsYWJsZSBhcworYSBXM0MgUmVjb21tZW5kYXRpb24gYW5kIGFzIGFuIElTTyBTdGFuZGFyZCAoSVNPL0lFQyAxNTk0ODoyMDAzIChFKSkgYXQKKzxodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1JFQy1QTkctMjAwMzExMTAvCitUaGUgVzNDIGFuZCBJU08gZG9jdW1lbnRzIGhhdmUgaWRlbnRpY2FsIHRlY2huaWNhbCBjb250ZW50LgorCitUaGUgUE5HLTEuMiBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSBhdAorPGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2RvY3VtZW50cy8+LiAgSXQgaXMgdGVjaG5pY2FsbHkgZXF1aXZhbGVudAordG8gdGhlIFBORyBzcGVjaWZpY2F0aW9uIChzZWNvbmQgZWRpdGlvbikgYnV0IGhhcyBzb21lIGFkZGl0aW9uYWwgbWF0ZXJpYWwuCisKK1RoZSBQTkctMS4wIHNwZWNpZmljYXRpb24gaXMgYXZhaWxhYmxlCithcyBSRkMgMjA4MyA8aHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvZG9jdW1lbnRzLz4gYW5kIGFzIGEKK1czQyBSZWNvbW1lbmRhdGlvbiA8aHR0cDovL3d3dy53My5vcmcvVFIvUkVDLnBuZy5odG1sPi4KKworU29tZSBhZGRpdGlvbmFsIGNodW5rcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzcGVjaWFsLXB1cnBvc2UgcHVibGljIGNodW5rcworZG9jdW1lbnRzIGF0IDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9kb2N1bWVudHMvPi4KKworT3RoZXIgaW5mb3JtYXRpb24KK2Fib3V0IFBORywgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBsaWJwbmcsIGNhbiBiZSBmb3VuZCBhdCB0aGUgUE5HIGhvbWUKK3BhZ2UsIDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy8+LgorCitNb3N0IHVzZXJzIHdpbGwgbm90IGhhdmUgdG8gbW9kaWZ5IHRoZSBsaWJyYXJ5IHNpZ25pZmljYW50bHk7IGFkdmFuY2VkCit1c2VycyBtYXkgd2FudCB0byBtb2RpZnkgaXQgbW9yZS4gIEFsbCBhdHRlbXB0cyB3ZXJlIG1hZGUgdG8gbWFrZSBpdCBhcworY29tcGxldGUgYXMgcG9zc2libGUsIHdoaWxlIGtlZXBpbmcgdGhlIGNvZGUgZWFzeSB0byB1bmRlcnN0YW5kLgorQ3VycmVudGx5LCB0aGlzIGxpYnJhcnkgb25seSBzdXBwb3J0cyBDLiAgU3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCitpcyBiZWluZyBjb25zaWRlcmVkLgorCitMaWJwbmcgaGFzIGJlZW4gZGVzaWduZWQgdG8gaGFuZGxlIG11bHRpcGxlIHNlc3Npb25zIGF0IG9uZSB0aW1lLAordG8gYmUgZWFzaWx5IG1vZGlmaWFibGUsIHRvIGJlIHBvcnRhYmxlIHRvIHRoZSB2YXN0IG1ham9yaXR5IG9mCittYWNoaW5lcyAoQU5TSSwgSyZSLCAxNi0sIDMyLSwgYW5kIDY0LWJpdCkgYXZhaWxhYmxlLCBhbmQgdG8gYmUgZWFzeQordG8gdXNlLiAgVGhlIHVsdGltYXRlIGdvYWwgb2YgbGlicG5nIGlzIHRvIHByb21vdGUgdGhlIGFjY2VwdGFuY2Ugb2YKK3RoZSBQTkcgZmlsZSBmb3JtYXQgaW4gd2hhdGV2ZXIgd2F5IHBvc3NpYmxlLiAgV2hpbGUgdGhlcmUgaXMgc3RpbGwKK3dvcmsgdG8gYmUgZG9uZSAoc2VlIHRoZSBUT0RPIGZpbGUpLCBsaWJwbmcgc2hvdWxkIGNvdmVyIHRoZQorbWFqb3JpdHkgb2YgdGhlIG5lZWRzIG9mIGl0cyB1c2Vycy4KKworTGlicG5nIHVzZXMgemxpYiBmb3IgaXRzIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9mIFBORyBmaWxlcy4KK0Z1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgemxpYiwgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliLCBjYW4KK2JlIGZvdW5kIGF0IHRoZSB6bGliIGhvbWUgcGFnZSwgPGh0dHA6Ly93d3cuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL3psaWIvPi4KK1RoZSB6bGliIGNvbXByZXNzaW9uIHV0aWxpdHkgaXMgYSBnZW5lcmFsIHB1cnBvc2UgdXRpbGl0eSB0aGF0IGlzCit1c2VmdWwgZm9yIG1vcmUgdGhhbiBQTkcgZmlsZXMsIGFuZCBjYW4gYmUgdXNlZCB3aXRob3V0IGxpYnBuZy4KK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBkZWxpdmVyZWQgd2l0aCB6bGliIGZvciBtb3JlIGRldGFpbHMuCitZb3UgY2FuIHVzdWFsbHkgZmluZCB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgemxpYiB1dGlsaXR5IHdoZXJldmVyIHlvdQorZmluZCB0aGUgbGlicG5nIHNvdXJjZSBmaWxlcy4KKworTGlicG5nIGlzIHRocmVhZCBzYWZlLCBwcm92aWRlZCB0aGUgdGhyZWFkcyBhcmUgdXNpbmcgZGlmZmVyZW50CitpbnN0YW5jZXMgb2YgdGhlIHN0cnVjdHVyZXMuICBFYWNoIHRocmVhZCBzaG91bGQgaGF2ZSBpdHMgb3duCitwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBpbnN0YW5jZXMsIGFuZCB0aHVzIGl0cyBvd24gaW1hZ2UuCitMaWJwbmcgZG9lcyBub3QgcHJvdGVjdCBpdHNlbGYgYWdhaW5zdCB0d28gdGhyZWFkcyB1c2luZyB0aGUKK3NhbWUgaW5zdGFuY2Ugb2YgYSBzdHJ1Y3R1cmUuCisKKy5TSCBJSS4gU3RydWN0dXJlcworCitUaGVyZSBhcmUgdHdvIG1haW4gc3RydWN0dXJlcyB0aGF0IGFyZSBpbXBvcnRhbnQgdG8gbGlicG5nLCBwbmdfc3RydWN0CithbmQgcG5nX2luZm8uICBUaGUgZmlyc3QsIHBuZ19zdHJ1Y3QsIGlzIGFuIGludGVybmFsIHN0cnVjdHVyZSB0aGF0Cit3aWxsIG5vdCwgZm9yIHRoZSBtb3N0IHBhcnQsIGJlIHVzZWQgYnkgYSB1c2VyIGV4Y2VwdCBhcyB0aGUgZmlyc3QKK3ZhcmlhYmxlIHBhc3NlZCB0byBldmVyeSBsaWJwbmcgZnVuY3Rpb24gY2FsbC4KKworVGhlIHBuZ19pbmZvIHN0cnVjdHVyZSBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZQorUE5HIGZpbGUuICBBdCBvbmUgdGltZSwgdGhlIGZpZWxkcyBvZiBwbmdfaW5mbyB3ZXJlIGludGVuZGVkIHRvIGJlCitkaXJlY3RseSBhY2Nlc3NpYmxlIHRvIHRoZSB1c2VyLiAgSG93ZXZlciwgdGhpcyB0ZW5kZWQgdG8gY2F1c2UgcHJvYmxlbXMKK3dpdGggYXBwbGljYXRpb25zIHVzaW5nIGR5bmFtaWNhbGx5IGxvYWRlZCBsaWJyYXJpZXMsIGFuZCBhcyBhIHJlc3VsdAorYSBzZXQgb2YgaW50ZXJmYWNlIGZ1bmN0aW9ucyBmb3IgcG5nX2luZm8gKHRoZSBwbmdfZ2V0XyooKSBhbmQgcG5nX3NldF8qKCkKK2Z1bmN0aW9ucykgd2FzIGRldmVsb3BlZC4gIFRoZSBmaWVsZHMgb2YgcG5nX2luZm8gYXJlIHN0aWxsIGF2YWlsYWJsZSBmb3IKK29sZGVyIGFwcGxpY2F0aW9ucywgYnV0IGl0IGlzIHN1Z2dlc3RlZCB0aGF0IGFwcGxpY2F0aW9ucyB1c2UgdGhlIG5ldworaW50ZXJmYWNlcyBpZiBhdCBhbGwgcG9zc2libGUuCisKK0FwcGxpY2F0aW9ucyB0aGF0IGRvIG1ha2UgZGlyZWN0IGFjY2VzcyB0byB0aGUgbWVtYmVycyBvZiBwbmdfc3RydWN0IChleGNlcHQKK2ZvciBwbmdfcHRyLT5qbXBidWYpIG11c3QgYmUgcmVjb21waWxlZCB3aGVuZXZlciB0aGUgbGlicmFyeSBpcyB1cGRhdGVkLAorYW5kIGFwcGxpY2F0aW9ucyB0aGF0IG1ha2UgZGlyZWN0IGFjY2VzcyB0byB0aGUgbWVtYmVycyBvZiBwbmdfaW5mbyBtdXN0CitiZSByZWNvbXBpbGVkIGlmIHRoZXkgd2VyZSBjb21waWxlZCBvciBsb2FkZWQgd2l0aCBsaWJwbmcgdmVyc2lvbiAxLjAuNiwKK2luIHdoaWNoIHRoZSBtZW1iZXJzIHdlcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXIuICBJbiB2ZXJzaW9uIDEuMC43LCB0aGUKK21lbWJlcnMgb2YgdGhlIHBuZ19pbmZvIHN0cnVjdHVyZSByZXZlcnRlZCB0byB0aGUgb2xkIG9yZGVyLCBhcyB0aGV5IHdlcmUKK2luIHZlcnNpb25zIDAuOTdjIHRocm91Z2ggMS4wLjUuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4wLjAsIGJvdGgKK3N0cnVjdHVyZXMgYXJlIGdvaW5nIHRvIGJlIGhpZGRlbiwgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgc3RydWN0dXJlcyB3aWxsCitvbmx5IGJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgcG5nX2dldC9wbmdfc2V0IGZ1bmN0aW9ucy4KKworVGhlIHBuZy5oIGhlYWRlciBmaWxlIGlzIGFuIGludmFsdWFibGUgcmVmZXJlbmNlIGZvciBwcm9ncmFtbWluZyB3aXRoIGxpYnBuZy4KK0FuZCB3aGlsZSBJJ20gb24gdGhlIHRvcGljLCBtYWtlIHN1cmUgeW91IGluY2x1ZGUgdGhlIGxpYnBuZyBoZWFkZXIgZmlsZToKKworI2luY2x1ZGUgPHBuZy5oPgorCisuU0ggSUlJLiBSZWFkaW5nCisKK1dlJ2xsIG5vdyB3YWxrIHlvdSB0aHJvdWdoIHRoZSBwb3NzaWJsZSBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIHJlYWRpbmcKK2luIGEgUE5HIGZpbGUgc2VxdWVudGlhbGx5LCBicmllZmx5IGV4cGxhaW5pbmcgdGhlIHN5bnRheCBhbmQgcHVycG9zZQorb2YgZWFjaCBvbmUuICBTZWUgZXhhbXBsZS5jIGFuZCBwbmcuaCBmb3IgbW9yZSBkZXRhaWwuICBXaGlsZQorcHJvZ3Jlc3NpdmUgcmVhZGluZyBpcyBjb3ZlcmVkIGluIHRoZSBuZXh0IHNlY3Rpb24sIHlvdSB3aWxsIHN0aWxsCituZWVkIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBkaXNjdXNzZWQgaW4gdGhpcyBzZWN0aW9uIHRvIHJlYWQgYSBQTkcKK2ZpbGUuCisKKy5TUyBTZXR1cAorCitZb3Ugd2lsbCB3YW50IHRvIGRvIHRoZSBJL08gaW5pdGlhbGl6YXRpb24oKikgYmVmb3JlIHlvdSBnZXQgaW50byBsaWJwbmcsCitzbyBpZiBpdCBkb2Vzbid0IHdvcmssIHlvdSBkb24ndCBoYXZlIG11Y2ggdG8gdW5kby4gIE9mIGNvdXJzZSwgeW91Cit3aWxsIGFsc28gd2FudCB0byBpbnN1cmUgdGhhdCB5b3UgYXJlLCBpbiBmYWN0LCBkZWFsaW5nIHdpdGggYSBQTkcKK2ZpbGUuICBMaWJwbmcgcHJvdmlkZXMgYSBzaW1wbGUgY2hlY2sgdG8gc2VlIGlmIGEgZmlsZSBpcyBhIFBORyBmaWxlLgorVG8gdXNlIGl0LCBwYXNzIGluIHRoZSBmaXJzdCAxIHRvIDggYnl0ZXMgb2YgdGhlIGZpbGUgdG8gdGhlIGZ1bmN0aW9uCitwbmdfc2lnX2NtcCgpLCBhbmQgaXQgd2lsbCByZXR1cm4gMCAoZmFsc2UpIGlmIHRoZSBieXRlcyBtYXRjaCB0aGUKK2NvcnJlc3BvbmRpbmcgYnl0ZXMgb2YgdGhlIFBORyBzaWduYXR1cmUsIG9yIG5vbnplcm8gKHRydWUpIG90aGVyd2lzZS4KK09mIGNvdXJzZSwgdGhlIG1vcmUgYnl0ZXMgeW91IHBhc3MgaW4sIHRoZSBncmVhdGVyIHRoZSBhY2N1cmFjeSBvZiB0aGUKK3ByZWRpY3Rpb24uCisKK0lmIHlvdSBhcmUgaW50ZW5kaW5nIHRvIGtlZXAgdGhlIGZpbGUgcG9pbnRlciBvcGVuIGZvciB1c2UgaW4gbGlicG5nLAoreW91IG11c3QgZW5zdXJlIHlvdSBkb24ndCByZWFkIG1vcmUgdGhhbiA4IGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZworb2YgdGhlIGZpbGUsIGFuZCB5b3UgYWxzbyBoYXZlIHRvIG1ha2UgYSBjYWxsIHRvIHBuZ19zZXRfc2lnX2J5dGVzX3JlYWQoKQord2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSByZWFkIGZyb20gdGhlIGJlZ2lubmluZy4gIExpYnBuZyB3aWxsCit0aGVuIG9ubHkgY2hlY2sgdGhlIGJ5dGVzIChpZiBhbnkpIHRoYXQgeW91ciBwcm9ncmFtIGRpZG4ndCByZWFkLgorCisoKik6IElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkCit0byByZXBsYWNlIHRoZW0gd2l0aCBjdXN0b20gZnVuY3Rpb25zLiAgU2VlIHRoZSBkaXNjdXNzaW9uIHVuZGVyCitDdXN0b21pemluZyBsaWJwbmcuCisKKworICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAicmIiKTsKKyAgICBpZiAoIWZwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorICAgIGZyZWFkKGhlYWRlciwgMSwgbnVtYmVyLCBmcCk7CisgICAgaXNfcG5nID0gIXBuZ19zaWdfY21wKGhlYWRlciwgMCwgbnVtYmVyKTsKKyAgICBpZiAoIWlzX3BuZykKKyAgICB7CisgICAgICAgIHJldHVybiAoTk9UX1BORyk7CisgICAgfQorCisKK05leHQsIHBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZC4gIEluCitvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgc2l6ZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIGNvcnJlY3QgZXZlbiB3aXRoIGEKK2R5bmFtaWNhbGx5IGxpbmtlZCBsaWJwbmcsIHRoZXJlIGFyZSBmdW5jdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQKK2FsbG9jYXRlIHRoZSBzdHJ1Y3R1cmVzLiAgV2UgYWxzbyBwYXNzIHRoZSBsaWJyYXJ5IHZlcnNpb24sIG9wdGlvbmFsCitwb2ludGVycyB0byBlcnJvciBoYW5kbGluZyBmdW5jdGlvbnMsIGFuZCBhIHBvaW50ZXIgdG8gYSBkYXRhIHN0cnVjdCBmb3IKK3VzZSBieSB0aGUgZXJyb3IgZnVuY3Rpb25zLCBpZiBuZWNlc3NhcnkgKHRoZSBwb2ludGVyIGFuZCBmdW5jdGlvbnMgY2FuCitiZSBOVUxMIGlmIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXJzIGFyZSB0byBiZSB1c2VkKS4gIFNlZSB0aGUgc2VjdGlvbgorb24gQ2hhbmdlcyB0byBMaWJwbmcgYmVsb3cgcmVnYXJkaW5nIHRoZSBvbGQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorVGhlIHN0cnVjdHVyZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBxdWlldGx5IHJldHVybiBOVUxMIGlmIHRoZXkgZmFpbCB0bworY3JlYXRlIHRoZSBzdHJ1Y3R1cmUsIHNvIHlvdXIgYXBwbGljYXRpb24gc2hvdWxkIGNoZWNrIGZvciB0aGF0LgorCisgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QKKyAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAorICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOworICAgIGlmICghcG5nX3B0cikKKyAgICAgICAgcmV0dXJuIChFUlJPUik7CisKKyAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworICAgIGlmICghaW5mb19wdHIpCisgICAgeworICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwKKyAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCwgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworICAgIHBuZ19pbmZvcCBlbmRfaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICAgaWYgKCFlbmRfaW5mbykKKyAgICB7CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCisgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworSWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgb3duIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLAorZGVmaW5lIFBOR19VU0VSX01FTV9TVVBQT1JURUQgYW5kIHVzZQorcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCk6CisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yCisgICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKKyAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuLCAocG5nX3ZvaWRwKQorICAgICAgICB1c2VyX21lbV9wdHIsIHVzZXJfbWFsbG9jX2ZuLCB1c2VyX2ZyZWVfZm4pOworCitUaGUgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgcGFzc2VkIHRvIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKQorYW5kIHRoZSBtZW1vcnkgYWxsb2MvZnJlZSByb3V0aW5lcyBwYXNzZWQgdG8gcG5nX2NyZWF0ZV9zdHJ1Y3RfMigpCithcmUgb25seSBuZWNlc3NhcnkgaWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIGxpYnBuZyBzdXBwbGllZCBlcnJvcgoraGFuZGxpbmcgYW5kIG1lbW9yeSBhbGxvYy9mcmVlIGZ1bmN0aW9ucy4KKworV2hlbiBsaWJwbmcgZW5jb3VudGVycyBhbiBlcnJvciwgaXQgZXhwZWN0cyB0byBsb25nam1wIGJhY2sKK3RvIHlvdXIgcm91dGluZS4gIFRoZXJlZm9yZSwgeW91IHdpbGwgbmVlZCB0byBjYWxsIHNldGptcCBhbmQgcGFzcworeW91ciBwbmdfam1wYnVmKHBuZ19wdHIpLiAgSWYgeW91IHJlYWQgdGhlIGZpbGUgZnJvbSBkaWZmZXJlbnQKK3JvdXRpbmVzLCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgam1wYnVmIGZpZWxkIGV2ZXJ5IHRpbWUgeW91IGVudGVyCithIG5ldyByb3V0aW5lIHRoYXQgd2lsbCBjYWxsIGEgcG5nXyooKSBmdW5jdGlvbi4KKworU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcCBmb3IgeW91ciBjb21waWxlciBmb3IgbW9yZQoraW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yCitoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nIHNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24KK29uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuICBJZiBhbiBlcnJvciBvY2N1cnMsIGFuZCBsaWJwbmcgbG9uZ2ptcCdzCitiYWNrIHRvIHlvdXIgc2V0am1wLCB5b3Ugd2lsbCB3YW50IHRvIGNhbGwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSB0bworZnJlZSBhbnkgbWVtb3J5LgorCisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgICB7CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCisgICAgICAgICAgICZlbmRfaW5mbyk7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworSWYgeW91IHdvdWxkIHJhdGhlciBhdm9pZCB0aGUgY29tcGxleGl0eSBvZiBzZXRqbXAvbG9uZ2ptcCBpc3N1ZXMsCit5b3UgY2FuIGNvbXBpbGUgbGlicG5nIHdpdGggUE5HX1NFVEpNUF9OT1RfU1VQUE9SVEVELCBpbiB3aGljaCBjYXNlCitlcnJvcnMgd2lsbCByZXN1bHQgaW4gYSBjYWxsIHRvIFBOR19BQk9SVCgpIHdoaWNoIGRlZmF1bHRzIHRvIGFib3J0KCkuCisKK05vdyB5b3UgbmVlZCB0byBzZXQgdXAgdGhlIGlucHV0IGNvZGUuICBUaGUgZGVmYXVsdCBmb3IgbGlicG5nIGlzIHRvCit1c2UgdGhlIEMgZnVuY3Rpb24gZnJlYWQoKS4gIElmIHlvdSB1c2UgdGhpcywgeW91IHdpbGwgbmVlZCB0byBwYXNzIGEKK3ZhbGlkIEZJTEUgKiBpbiB0aGUgZnVuY3Rpb24gcG5nX2luaXRfaW8oKS4gIEJlIHN1cmUgdGhhdCB0aGUgZmlsZSBpcworb3BlbmVkIGluIGJpbmFyeSBtb2RlLiAgSWYgeW91IHdpc2ggdG8gaGFuZGxlIHJlYWRpbmcgZGF0YSBpbiBhbm90aGVyCit3YXksIHlvdSBuZWVkIG5vdCBjYWxsIHRoZSBwbmdfaW5pdF9pbygpIGZ1bmN0aW9uLCBidXQgeW91IG11c3QgdGhlbgoraW1wbGVtZW50IHRoZSBsaWJwbmcgSS9PIG1ldGhvZHMgZGlzY3Vzc2VkIGluIHRoZSBDdXN0b21pemluZyBMaWJwbmcKK3NlY3Rpb24gYmVsb3cuCisKKyAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7CisKK0lmIHlvdSBoYWQgcHJldmlvdXNseSBvcGVuZWQgdGhlIGZpbGUgYW5kIHJlYWQgYW55IG9mIHRoZSBzaWduYXR1cmUgZnJvbQordGhlIGJlZ2lubmluZyBpbiBvcmRlciB0byBzZWUgaWYgdGhpcyB3YXMgYSBQTkcgZmlsZSwgeW91IG5lZWQgdG8gbGV0CitsaWJwbmcga25vdyB0aGF0IHRoZXJlIGFyZSBzb21lIGJ5dGVzIG1pc3NpbmcgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCisKKyAgICBwbmdfc2V0X3NpZ19ieXRlcyhwbmdfcHRyLCBudW1iZXIpOworCisuU1MgU2V0dGluZyB1cCBjYWxsYmFjayBjb2RlCisKK1lvdSBjYW4gc2V0IHVwIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGFueSB1bmtub3duIGNodW5rcyBpbiB0aGUKK2lucHV0IHN0cmVhbS4gWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgorCisgICAgcmVhZF9jaHVua19jYWxsYmFjayhwbmdfcHRyIHB0ciwKKyAgICAgICAgIHBuZ191bmtub3duX2NodW5rcCBjaHVuayk7CisgICAgeworICAgICAgIC8qIFRoZSB1bmtub3duIGNodW5rIHN0cnVjdHVyZSBjb250YWlucyB5b3VyCisgICAgICAgICAgY2h1bmsgZGF0YSwgYWxvbmcgd2l0aCBzaW1pbGFyIGRhdGEgZm9yIGFueSBvdGhlcgorICAgICAgICAgIHVua25vd24gY2h1bmtzOiAqLworCisgICAgICAgICAgIHBuZ19ieXRlIG5hbWVbNV07CisgICAgICAgICAgIHBuZ19ieXRlICpkYXRhOworICAgICAgICAgICBwbmdfc2l6ZV90IHNpemU7CisKKyAgICAgICAvKiBOb3RlIHRoYXQgbGlicG5nIGhhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YKKyAgICAgICAgICB0aGUgQ1JDIGhhbmRsaW5nICovCisKKyAgICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUuICBTZWFyY2ggZm9yIHlvdXIgY2h1bmsgaW4gdGhlCisgICAgICAgICAgdW5rbm93biBjaHVuayBzdHJ1Y3R1cmUsIHByb2Nlc3MgaXQsIGFuZCByZXR1cm4gb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZzogKi8KKworICAgICAgIHJldHVybiAoLW4pOyAvKiBjaHVuayBoYWQgYW4gZXJyb3IgKi8KKyAgICAgICByZXR1cm4gKDApOyAvKiBkaWQgbm90IHJlY29nbml6ZSAqLworICAgICAgIHJldHVybiAobik7IC8qIHN1Y2Nlc3MgKi8KKyAgICB9CisKKyhZb3UgY2FuIGdpdmUgeW91ciBmdW5jdGlvbiBhbm90aGVyIG5hbWUgdGhhdCB5b3UgbGlrZSBpbnN0ZWFkIG9mCisicmVhZF9jaHVua19jYWxsYmFjayIpCisKK1RvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCisKKyAgICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihwbmdfcHRyLCB1c2VyX2NodW5rX3B0ciwKKyAgICAgICAgcmVhZF9jaHVua19jYWxsYmFjayk7CisKK1RoaXMgbmFtZXMgbm90IG9ubHkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCBidXQgYWxzbyBhIHVzZXIgcG9pbnRlciB0aGF0Cit5b3UgY2FuIHJldHJpZXZlIHdpdGgKKworICAgIHBuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX3B0cik7CisKK0lmIHlvdSBjYWxsIHRoZSBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbigpIGZ1bmN0aW9uLCB0aGVuIGFsbCB1bmtub3duCitjaHVua3Mgd2lsbCBiZSBzYXZlZCB3aGVuIHJlYWQsIGluIGNhc2UgeW91ciBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIG5lZWQKK29uZSBvciBtb3JlIG9mIHRoZW0uICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlCitwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbiwgZGVzY3JpYmVkIGJlbG93LgorCitBdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQorY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHJlYWQsIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKK2EgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCitZb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgorCisgICAgdm9pZCByZWFkX3Jvd19jYWxsYmFjayhwbmdfcHRyIHB0ciwgcG5nX3VpbnRfMzIgcm93LAorICAgICAgIGludCBwYXNzKTsKKyAgICB7CisgICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUgKi8KKyAgICB9CisKKyhZb3UgY2FuIGdpdmUgaXQgYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZiAicmVhZF9yb3dfY2FsbGJhY2siKQorCitUbyBpbmZvcm0gbGlicG5nIGFib3V0IHlvdXIgZnVuY3Rpb24sIHVzZQorCisgICAgcG5nX3NldF9yZWFkX3N0YXR1c19mbihwbmdfcHRyLCByZWFkX3Jvd19jYWxsYmFjayk7CisKKy5TUyBVbmtub3duLWNodW5rIGhhbmRsaW5nCisKK05vdyB5b3UgZ2V0IHRvIHNldCB0aGUgd2F5IHRoZSBsaWJyYXJ5IHByb2Nlc3NlcyB1bmtub3duIGNodW5rcyBpbiB0aGUKK2lucHV0IFBORyBzdHJlYW0uIEJvdGgga25vd24gYW5kIHVua25vd24gY2h1bmtzIHdpbGwgYmUgcmVhZC4gIE5vcm1hbAorYmVoYXZpb3IgaXMgdGhhdCBrbm93biBjaHVua3Mgd2lsbCBiZSBwYXJzZWQgaW50byBpbmZvcm1hdGlvbiBpbgordmFyaW91cyBpbmZvX3B0ciBtZW1iZXJzIHdoaWxlIHVua25vd24gY2h1bmtzIHdpbGwgYmUgZGlzY2FyZGVkLiBUaGlzCitiZWhhdmlvciBjYW4gYmUgd2FzdGVmdWwgaWYgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIHVzZSBzb21lIGtub3duCitjaHVuayB0eXBlcy4gVG8gY2hhbmdlIHRoaXMsIHlvdSBjYW4gY2FsbDoKKworICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBrZWVwLAorICAgICAgICBjaHVua19saXN0LCBudW1fY2h1bmtzKTsKKyAgICBrZWVwICAgICAgIC0gMDogZGVmYXVsdCB1bmtub3duIGNodW5rIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgIDE6IGlnbm9yZTsgZG8gbm90IGtlZXAKKyAgICAgICAgICAgICAgICAgMjoga2VlcCBvbmx5IGlmIHNhZmUtdG8tY29weQorICAgICAgICAgICAgICAgICAzOiBrZWVwIGV2ZW4gaWYgdW5zYWZlLXRvLWNvcHkKKyAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZXNlIGRlZmluaXRpb25zOgorICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgICAwCisgICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgorICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyAgICAgICAzCisgICAgY2h1bmtfbGlzdCAtIGxpc3Qgb2YgY2h1bmtzIGFmZmVjdGVkIChhIGJ5dGUgc3RyaW5nLAorICAgICAgICAgICAgICAgICBmaXZlIGJ5dGVzIHBlciBjaHVuaywgTlVMTCBvciAnXDAnIGlmCisgICAgICAgICAgICAgICAgIG51bV9jaHVua3MgaXMgMCkKKyAgICBudW1fY2h1bmtzIC0gbnVtYmVyIG9mIGNodW5rcyBhZmZlY3RlZDsgaWYgMCwgYWxsCisgICAgICAgICAgICAgICAgIHVua25vd24gY2h1bmtzIGFyZSBhZmZlY3RlZC4gIElmIG5vbnplcm8sCisgICAgICAgICAgICAgICAgIG9ubHkgdGhlIGNodW5rcyBpbiB0aGUgbGlzdCBhcmUgYWZmZWN0ZWQKKworVW5rbm93biBjaHVua3MgZGVjbGFyZWQgaW4gdGhpcyB3YXkgd2lsbCBiZSBzYXZlZCBhcyByYXcgZGF0YSBvbnRvIGEKK2xpc3Qgb2YgcG5nX3Vua25vd25fY2h1bmsgc3RydWN0dXJlcy4gIElmIGEgY2h1bmsgdGhhdCBpcyBub3JtYWxseQora25vd24gdG8gbGlicG5nIGlzIG5hbWVkIGluIHRoZSBsaXN0LCBpdCB3aWxsIGJlIGhhbmRsZWQgYXMgdW5rbm93biwKK2FjY29yZGluZyB0byB0aGUgImtlZXAiIGRpcmVjdGl2ZS4gIElmIGEgY2h1bmsgaXMgbmFtZWQgaW4gc3VjY2Vzc2l2ZQoraW5zdGFuY2VzIG9mIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpLCB0aGUgZmluYWwgaW5zdGFuY2Ugd2lsbAordGFrZSBwcmVjZWRlbmNlLiAgVGhlIElIRFIgYW5kIElFTkQgY2h1bmtzIHNob3VsZCBub3QgYmUgbmFtZWQgaW4KK2NodW5rX2xpc3Q7IGlmIHRoZXkgYXJlLCBsaWJwbmcgd2lsbCBwcm9jZXNzIHRoZW0gbm9ybWFsbHkgYW55d2F5LgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHVzYWdlIG9mIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpLAord2hlcmUgdGhlIHByaXZhdGUgInZwQWciIGNodW5rIHdpbGwgbGF0ZXIgYmUgcHJvY2Vzc2VkIGJ5IGEgdXNlciBjaHVuaworY2FsbGJhY2sgZnVuY3Rpb246CisKKyAgICBwbmdfYnl0ZSB2cEFnWzVdPXsxMTgsIDExMiwgIDY1LCAxMDMsIChwbmdfYnl0ZSkgJ1wwJ307CisKKyAgICAjaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQorICAgICAgcG5nX2J5dGUgdW51c2VkX2NodW5rc1tdPQorICAgICAgeworICAgICAgICAxMDQsICA3MywgIDgzLCAgODQsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBoSVNUICovCisgICAgICAgIDEwNSwgIDg0LCAgODgsIDExNiwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIGlUWHQgKi8KKyAgICAgICAgMTEyLCAgNjcsICA2NSwgIDc2LCAocG5nX2J5dGUpICdcMCcsICAgLyogcENBTCAqLworICAgICAgICAxMTUsICA2NywgIDY1LCAgNzYsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBzQ0FMICovCisgICAgICAgIDExNSwgIDgwLCAgNzYsICA4NCwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHNQTFQgKi8KKyAgICAgICAgMTE2LCAgNzMsICA3NywgIDY5LCAocG5nX2J5dGUpICdcMCcsICAgLyogdElNRSAqLworICAgICAgfTsKKyAgICAjZW5kaWYKKworICAgIC4uLgorCisgICAgI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKKyAgICAgIC8qIGlnbm9yZSBhbGwgdW5rbm93biBjaHVua3M6ICovCisgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDEsIE5VTEwsIDApOworICAgICAgLyogZXhjZXB0IGZvciB2cEFnOiAqLworICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCAyLCB2cEFnLCAxKTsKKyAgICAgIC8qIGFsc28gaWdub3JlIHVudXNlZCBrbm93biBjaHVua3M6ICovCisgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDEsIHVudXNlZF9jaHVua3MsCisgICAgICAgICAoaW50KXNpemVvZih1bnVzZWRfY2h1bmtzKS81KTsKKyAgICAjZW5kaWYKKworLlNTIFVzZXIgbGltaXRzCisKK1RoZSBQTkcgc3BlY2lmaWNhdGlvbiBhbGxvd3MgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYW4gaW1hZ2UgdG8gYmUgYXMKK2xhcmdlIGFzIDJeMzEtMSAoMHg3ZmZmZmZmZiksIG9yIGFib3V0IDIuMTQ3IGJpbGxpb24gcm93cyBhbmQgY29sdW1ucy4KK1NpbmNlIHZlcnkgZmV3IGFwcGxpY2F0aW9ucyByZWFsbHkgbmVlZCB0byBwcm9jZXNzIHN1Y2ggbGFyZ2UgaW1hZ2VzLAord2UgaGF2ZSBpbXBvc2VkIGFuIGFyYml0cmFyeSAxLW1pbGxpb24gbGltaXQgb24gcm93cyBhbmQgY29sdW1ucy4KK0xhcmdlciBpbWFnZXMgd2lsbCBiZSByZWplY3RlZCBpbW1lZGlhdGVseSB3aXRoIGEgcG5nX2Vycm9yKCkgY2FsbC4gSWYKK3lvdSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbGltaXQsIHlvdSBjYW4gdXNlCisKKyAgIHBuZ19zZXRfdXNlcl9saW1pdHMocG5nX3B0ciwgd2lkdGhfbWF4LCBoZWlnaHRfbWF4KTsKKwordG8gc2V0IHlvdXIgb3duIGxpbWl0cywgb3IgdXNlIHdpZHRoX21heCA9IGhlaWdodF9tYXggPSAweDdmZmZmZmZmTAordG8gYWxsb3cgYWxsIHZhbGlkIGRpbWVuc2lvbnMgKGxpYnBuZyBtYXkgcmVqZWN0IHNvbWUgdmVyeSBsYXJnZSBpbWFnZXMKK2FueXdheSBiZWNhdXNlIG9mIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgY29uZGl0aW9ucykuCisKK1lvdSBzaG91bGQgcHV0IHRoaXMgc3RhdGVtZW50IGFmdGVyIHlvdSBjcmVhdGUgdGhlIFBORyBzdHJ1Y3R1cmUgYW5kCitiZWZvcmUgY2FsbGluZyBwbmdfcmVhZF9pbmZvKCksIHBuZ19yZWFkX3BuZygpLCBvciBwbmdfcHJvY2Vzc19kYXRhKCkuCitJZiB5b3UgbmVlZCB0byByZXRyaWV2ZSB0aGUgbGltaXRzIHRoYXQgYXJlIGJlaW5nIGFwcGxpZWQsIHVzZQorCisgICB3aWR0aF9tYXggPSBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4KHBuZ19wdHIpOworICAgaGVpZ2h0X21heCA9IHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4KHBuZ19wdHIpOworCitUaGUgUE5HIHNwZWNpZmljYXRpb24gc2V0cyBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGFuY2lsbGFyeSBjaHVua3MKK2FsbG93ZWQgaW4gYSBQTkcgZGF0YXN0cmVhbS4gIFlvdSBjYW4gaW1wb3NlIGEgbGltaXQgb24gdGhlIHRvdGFsIG51bWJlcgorb2Ygc1BMVCwgdEVYdCwgaVRYdCwgelRYdCwgYW5kIHVua25vd24gY2h1bmtzIHRoYXQgd2lsbCBiZSBzdG9yZWQsIHdpdGgKKworICAgcG5nX3NldF9jaHVua19jYWNoZV9tYXgocG5nX3B0ciwgdXNlcl9jaHVua19jYWNoZV9tYXgpOworCit3aGVyZSAweDdmZmZmZmZmTCBtZWFucyB1bmxpbWl0ZWQuICBZb3UgY2FuIHJldHJpZXZlIHRoaXMgbGltaXQgd2l0aAorCisgICBjaHVua19jYWNoZV9tYXggPSBwbmdfZ2V0X2NodW5rX2NhY2hlX21heChwbmdfcHRyKTsKKworVGhpcyBsaW1pdCBhbHNvIGFwcGxpZXMgdG8gdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZAorYnkgcG5nX2RlY29tcHJlc3NfY2h1bmsoKSB3aGlsZSBkZWNvbXByZXNzaW5nIGlUWHQsIHpUWHQsIGFuZCBpQ0NQIGNodW5rcy4KKworLlNTIFRoZSBoaWdoLWxldmVsIHJlYWQgaW50ZXJmYWNlCisKK0F0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKK3JlYWQgaW50ZXJmYWNlLCBvciB0aHJvdWdoIGEgc2VxdWVuY2Ugb2YgbG93LWxldmVsIHJlYWQgb3BlcmF0aW9ucy4KK1lvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiAoYSkgeW91IGFyZSB3aWxsaW5nIHRvIHJlYWQKK3RoZSBlbnRpcmUgaW1hZ2UgaW50byBtZW1vcnksIGFuZCAoYikgdGhlIGlucHV0IHRyYW5zZm9ybWF0aW9ucworeW91IHdhbnQgdG8gZG8gYXJlIGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBzZXQ6CisKKyAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KKyAgICBQTkdfVFJBTlNGT1JNX1NUUklQXzE2ICAgICAgU3RyaXAgMTYtYml0IHNhbXBsZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCBiaXRzCisgICAgUE5HX1RSQU5TRk9STV9TVFJJUF9BTFBIQSAgIERpc2NhcmQgdGhlIGFscGhhIGNoYW5uZWwKKyAgICBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcgICAgICAgRXhwYW5kIDEsIDIgYW5kIDQtYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgdG8gYnl0ZXMKKyAgICBQTkdfVFJBTlNGT1JNX1BBQ0tTV0FQICAgICAgQ2hhbmdlIG9yZGVyIG9mIHBhY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMgdG8gTFNCIGZpcnN0CisgICAgUE5HX1RSQU5TRk9STV9FWFBBTkQgICAgICAgIFBlcmZvcm0gc2V0X2V4cGFuZCgpCisgICAgUE5HX1RSQU5TRk9STV9JTlZFUlRfTU9OTyAgIEludmVydCBtb25vY2hyb21lIGltYWdlcworICAgIFBOR19UUkFOU0ZPUk1fU0hJRlQgICAgICAgICBOb3JtYWxpemUgcGl4ZWxzIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQklUIGRlcHRoCisgICAgUE5HX1RSQU5TRk9STV9CR1IgICAgICAgICAgIEZsaXAgUkdCIHRvIEJHUiwgUkdCQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBCR1JBCisgICAgUE5HX1RSQU5TRk9STV9TV0FQX0FMUEhBICAgIEZsaXAgUkdCQSB0byBBUkdCIG9yIEdBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFHCisgICAgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEgIENoYW5nZSBhbHBoYSBmcm9tIG9wYWNpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdHJhbnNwYXJlbmN5CisgICAgUE5HX1RSQU5TRk9STV9TV0FQX0VORElBTiAgIEJ5dGUtc3dhcCAxNi1iaXQgc2FtcGxlcworICAgIFBOR19UUkFOU0ZPUk1fR1JBWV9UT19SR0IgICBFeHBhbmQgZ3JheXNjYWxlIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gUkdCIChvciBHQSB0byBSR0JBKQorCisoVGhpcyBleGNsdWRlcyBzZXR0aW5nIGEgYmFja2dyb3VuZCBjb2xvciwgZG9pbmcgZ2FtbWEgdHJhbnNmb3JtYXRpb24sCitkaXRoZXJpbmcsIGFuZCBzZXR0aW5nIGZpbGxlci4pICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBzaW1wbHkgZG8gdGhpczoKKworICAgIHBuZ19yZWFkX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpCisKK3doZXJlIHBuZ190cmFuc2Zvcm1zIGlzIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBzb21lCitzZXQgb2YgdHJhbnNmb3JtYXRpb24gZmxhZ3MuICBUaGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0byBwbmdfcmVhZF9pbmZvKCksCitmb2xsb3dlZCB0aGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHRyYW5zZm9ybSBtYXNrLAordGhlbiBwbmdfcmVhZF9pbWFnZSgpLCBhbmQgZmluYWxseSBwbmdfcmVhZF9lbmQoKS4KKworKFRoZSBmaW5hbCBwYXJhbWV0ZXIgb2YgdGhpcyBjYWxsIGlzIG5vdCB5ZXQgdXNlZC4gIFNvbWVkYXkgaXQgbWlnaHQgcG9pbnQKK3RvIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgc29tZSBmdXR1cmUgaW5wdXQgdHJhbnNmb3JtLikKKworWW91IG11c3QgdXNlIHBuZ190cmFuc2Zvcm1zIGFuZCBub3QgY2FsbCBhbnkgcG5nX3NldF90cmFuc2Zvcm0oKSBmdW5jdGlvbnMKK3doZW4geW91IHVzZSBwbmdfcmVhZF9wbmcoKS4KKworQWZ0ZXIgeW91IGhhdmUgY2FsbGVkIHBuZ19yZWFkX3BuZygpLCB5b3UgY2FuIHJldHJpZXZlIHRoZSBpbWFnZSBkYXRhCit3aXRoCisKKyAgIHJvd19wb2ludGVycyA9IHBuZ19nZXRfcm93cyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK3doZXJlIHJvd19wb2ludGVycyBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgcGl4ZWwgZGF0YSBmb3IgZWFjaCByb3c6CisKKyAgIHBuZ19ieXRlcCByb3dfcG9pbnRlcnNbaGVpZ2h0XTsKKworSWYgeW91IGtub3cgeW91ciBpbWFnZSBzaXplIGFuZCBwaXhlbCBzaXplIGFoZWFkIG9mIHRpbWUsIHlvdSBjYW4gYWxsb2NhdGUKK3Jvd19wb2ludGVycyBwcmlvciB0byBjYWxsaW5nIHBuZ19yZWFkX3BuZygpIHdpdGgKKworICAgaWYgKGhlaWdodCA+IFBOR19VSU5UXzMyX01BWC9wbmdfc2l6ZW9mKHBuZ19ieXRlKSkKKyAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKKyAgICAgICAgICJJbWFnZSBpcyB0b28gdGFsbCB0byBwcm9jZXNzIGluIG1lbW9yeSIpOworICAgaWYgKHdpZHRoID4gUE5HX1VJTlRfMzJfTUFYL3BpeGVsX3NpemUpCisgICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsCisgICAgICAgICAiSW1hZ2UgaXMgdG9vIHdpZGUgdG8gcHJvY2VzcyBpbiBtZW1vcnkiKTsKKyAgIHJvd19wb2ludGVycyA9IHBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgIGhlaWdodCpwbmdfc2l6ZW9mKHBuZ19ieXRlcCkpOworICAgZm9yIChpbnQgaT0wOyBpPGhlaWdodCwgaSsrKQorICAgICAgcm93X3BvaW50ZXJzW2ldPU5VTEw7ICAvKiBzZWN1cml0eSBwcmVjYXV0aW9uICovCisgICBmb3IgKGludCBpPTA7IGk8aGVpZ2h0LCBpKyspCisgICAgICByb3dfcG9pbnRlcnNbaV09cG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgd2lkdGgqcGl4ZWxfc2l6ZSk7CisgICBwbmdfc2V0X3Jvd3MocG5nX3B0ciwgaW5mb19wdHIsICZyb3dfcG9pbnRlcnMpOworCitBbHRlcm5hdGl2ZWx5IHlvdSBjb3VsZCBhbGxvY2F0ZSB5b3VyIGltYWdlIGluIG9uZSBiaWcgYmxvY2sgYW5kIGRlZmluZQorcm93X3BvaW50ZXJzW2ldIHRvIHBvaW50IGludG8gdGhlIHByb3BlciBwbGFjZXMgaW4geW91ciBibG9jay4KKworSWYgeW91IHVzZSBwbmdfc2V0X3Jvd3MoKSwgdGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nCityb3dfcG9pbnRlcnMgKGFuZCByb3dfcG9pbnRlcnNbaV0sIGlmIHRoZXkgd2VyZSBzZXBhcmF0ZWx5IGFsbG9jYXRlZCkuCisKK0lmIHlvdSBkb24ndCBhbGxvY2F0ZSByb3dfcG9pbnRlcnMgYWhlYWQgb2YgdGltZSwgcG5nX3JlYWRfcG5nKCkgd2lsbAorZG8gaXQsIGFuZCBpdCdsbCBiZSBmcmVlJ2VkIHdoZW4geW91IGNhbGwgcG5nX2Rlc3Ryb3lfKigpLgorCisuU1MgVGhlIGxvdy1sZXZlbCByZWFkIGludGVyZmFjZQorCitJZiB5b3UgYXJlIGdvaW5nIHRoZSBsb3ctbGV2ZWwgcm91dGUsIHlvdSBhcmUgbm93IHJlYWR5IHRvIHJlYWQgYWxsCit0aGUgZmlsZSBpbmZvcm1hdGlvbiB1cCB0byB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICBZb3UgZG8gdGhpcyB3aXRoIGEKK2NhbGwgdG8gcG5nX3JlYWRfaW5mbygpLgorCisgICAgcG5nX3JlYWRfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK1RoaXMgd2lsbCBwcm9jZXNzIGFsbCBjaHVua3MgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGltYWdlIGRhdGEuCisKKy5TUyBRdWVyeWluZyB0aGUgaW5mbyBzdHJ1Y3R1cmUKKworRnVuY3Rpb25zIGFyZSB1c2VkIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5mb19wdHIgb25jZSBpdAoraGFzIGJlZW4gcmVhZC4gIE5vdGUgdGhhdCB0aGVzZSBmaWVsZHMgbWF5IG5vdCBiZSBjb21wbGV0ZWx5IGZpbGxlZAoraW4gdW50aWwgcG5nX3JlYWRfZW5kKCkgaGFzIHJlYWQgdGhlIGNodW5rIGRhdGEgZm9sbG93aW5nIHRoZSBpbWFnZS4KKworICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LAorICAgICAgICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLCAmaW50ZXJsYWNlX3R5cGUsCisgICAgICAgJmNvbXByZXNzaW9uX3R5cGUsICZmaWx0ZXJfbWV0aG9kKTsKKworICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KKyAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgorICAgIGJpdF9kZXB0aCAgICAgIC0gaG9sZHMgdGhlIGJpdCBkZXB0aCBvZiBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICBpbWFnZSBjaGFubmVscy4gICh2YWxpZCB2YWx1ZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAxLCAyLCA0LCA4LCAxNiBhbmQgZGVwZW5kIGFsc28gb24KKyAgICAgICAgICAgICAgICAgICAgIHRoZSBjb2xvcl90eXBlLiAgU2VlIGFsc28KKyAgICAgICAgICAgICAgICAgICAgIHNpZ25pZmljYW50IGJpdHMgKHNCSVQpIGJlbG93KS4KKyAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYSBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBwcmVzZW50LgorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCwgMTYpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyA4LCAxNikKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0IKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKKworICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfUEFMRVRURQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQ09MT1IKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0FMUEhBCisKKyAgICBmaWx0ZXJfbWV0aG9kICAtIChtdXN0IGJlIFBOR19GSUxURVJfVFlQRV9CQVNFCisgICAgICAgICAgICAgICAgICAgICBmb3IgUE5HIDEuMCwgYW5kIGNhbiBhbHNvIGJlCisgICAgICAgICAgICAgICAgICAgICBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcgaWYKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBQTkcgZGF0YXN0cmVhbSBpcyBlbWJlZGRlZCBpbgorICAgICAgICAgICAgICAgICAgICAgYSBNTkctMS4wIGRhdGFzdHJlYW0pCisgICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UKKyAgICAgICAgICAgICAgICAgICAgIGZvciBQTkcgMS4wKQorICAgIGludGVybGFjZV90eXBlIC0gKFBOR19JTlRFUkxBQ0VfTk9ORSBvcgorICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNykKKworICAgIEFueSBvciBhbGwgb2YgaW50ZXJsYWNlX3R5cGUsIGNvbXByZXNzaW9uX3R5cGUsIG9yCisgICAgZmlsdGVyX21ldGhvZCBjYW4gYmUgTlVMTCBpZiB5b3UgYXJlCisgICAgbm90IGludGVyZXN0ZWQgaW4gdGhlaXIgdmFsdWVzLgorCisgICAgTm90ZSB0aGF0IHBuZ19nZXRfSUhEUigpIHJldHVybnMgMzItYml0IGRhdGEgaW50bworICAgIHRoZSBhcHBsaWNhdGlvbidzIHdpZHRoIGFuZCBoZWlnaHQgdmFyaWFibGVzLgorICAgIFRoaXMgaXMgYW4gdW5zYWZlIHNpdHVhdGlvbiBpZiB0aGVzZSBhcmUgMTYtYml0CisgICAgdmFyaWFibGVzLiAgSW4gc3VjaCBzaXR1YXRpb25zLCB0aGUKKyAgICBwbmdfZ2V0X2ltYWdlX3dpZHRoKCkgYW5kIHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KCkKKyAgICBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IGFyZSBzYWZlci4KKworICAgIHdpZHRoICAgICAgICAgICAgPSBwbmdfZ2V0X2ltYWdlX3dpZHRoKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworICAgIGhlaWdodCAgICAgICAgICAgPSBwbmdfZ2V0X2ltYWdlX2hlaWdodChwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKKyAgICBiaXRfZGVwdGggICAgICAgID0gcG5nX2dldF9iaXRfZGVwdGgocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7CisgICAgY29sb3JfdHlwZSAgICAgICA9IHBuZ19nZXRfY29sb3JfdHlwZShwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKKyAgICBmaWx0ZXJfbWV0aG9kICAgID0gcG5nX2dldF9maWx0ZXJfdHlwZShwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKKyAgICBjb21wcmVzc2lvbl90eXBlID0gcG5nX2dldF9jb21wcmVzc2lvbl90eXBlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworICAgIGludGVybGFjZV90eXBlICAgPSBwbmdfZ2V0X2ludGVybGFjZV90eXBlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworCisgICAgY2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICBjaGFubmVscyAgICAgICAtIG51bWJlciBvZiBjaGFubmVscyBvZiBpbmZvIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGNvbG9yIHR5cGUgKHZhbGlkIHZhbHVlcyBhcmUgMSAoR1JBWSwKKyAgICAgICAgICAgICAgICAgICAgIFBBTEVUVEUpLCAyIChHUkFZX0FMUEhBKSwgMyAoUkdCKSwKKyAgICAgICAgICAgICAgICAgICAgIDQgKFJHQl9BTFBIQSBvciBSR0IgKyBmaWxsZXIgYnl0ZSkpCisgICAgcm93Ynl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICByb3dieXRlcyAgICAgICAtIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhIHJvdworCisgICAgc2lnbmF0dXJlID0gcG5nX2dldF9zaWduYXR1cmUocG5nX3B0ciwgaW5mb19wdHIpOworICAgIHNpZ25hdHVyZSAgICAgIC0gaG9sZHMgdGhlIHNpZ25hdHVyZSByZWFkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICBmaWxlIChpZiBhbnkpLiAgVGhlIGRhdGEgaXMga2VwdCBpbgorICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgb2Zmc2V0IGl0IHdvdWxkIGJlIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAgd2hvbGUgc2lnbmF0dXJlIHdlcmUgcmVhZCAoaS5lLiBpZiBhbgorICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gaGFkIGFscmVhZHkgcmVhZCBpbiA0CisgICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiBzaWduYXR1cmUgYmVmb3JlIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgICAgICBsaWJwbmcsIHRoZSByZW1haW5pbmcgNCBieXRlcyB3b3VsZAorICAgICAgICAgICAgICAgICAgICAgYmUgaW4gc2lnbmF0dXJlWzRdIHRocm91Z2ggc2lnbmF0dXJlWzddCisgICAgICAgICAgICAgICAgICAgICAoc2VlIHBuZ19zZXRfc2lnX2J5dGVzKCkpKS4KKworVGhlc2UgYXJlIGFsc28gaW1wb3J0YW50LCBidXQgdGhlaXIgdmFsaWRpdHkgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBjaHVuaworaGFzIGJlZW4gcmVhZC4gIFRoZSBwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT188Y2h1bms+KSBhbmQKK3BuZ19nZXRfPGNodW5rPihwbmdfcHRyLCBpbmZvX3B0ciwgLi4uKSBmdW5jdGlvbnMgcmV0dXJuIG5vbi16ZXJvIGlmIHRoZQorZGF0YSBoYXMgYmVlbiByZWFkLCBvciB6ZXJvIGlmIGl0IGlzIG1pc3NpbmcuICBUaGUgcGFyYW1ldGVycyB0byB0aGUKK3BuZ19nZXRfPGNodW5rPiBhcmUgc2V0IGRpcmVjdGx5IGlmIHRoZXkgYXJlIHNpbXBsZSBkYXRhIHR5cGVzLCBvciBhCitwb2ludGVyIGludG8gdGhlIGluZm9fcHRyIGlzIHJldHVybmVkIGZvciBhbnkgY29tcGxleCB0eXBlcy4KKworICAgIHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAmbnVtX3BhbGV0dGUpOworICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQorICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKKworICAgIHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmdhbW1hKTsKKyAgICBnYW1tYSAgICAgICAgICAtIHRoZSBnYW1tYSB0aGUgZmlsZSBpcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICBhdCAoUE5HX0lORk9fZ0FNQSkKKworICAgIHBuZ19nZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgJnNyZ2JfaW50ZW50KTsKKyAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50IChQTkdfSU5GT19zUkdCKQorICAgICAgICAgICAgICAgICAgICAgVGhlIHByZXNlbmNlIG9mIHRoZSBzUkdCIGNodW5rCisgICAgICAgICAgICAgICAgICAgICBtZWFucyB0aGF0IHRoZSBwaXhlbCBkYXRhIGlzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgc1JHQiBjb2xvciBzcGFjZS4gIFRoaXMgY2h1bmsgYWxzbworICAgICAgICAgICAgICAgICAgICAgaW1wbGllcyBzcGVjaWZpYyB2YWx1ZXMgb2YgZ0FNQSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIGNIUk0uCisKKyAgICBwbmdfZ2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsICZuYW1lLAorICAgICAgICZjb21wcmVzc2lvbl90eXBlLCAmcHJvZmlsZSwgJnByb2ZsZW4pOworICAgIG5hbWUgICAgICAgICAgICAtIFRoZSBwcm9maWxlIG5hbWUuCisgICAgY29tcHJlc3Npb24gICAgIC0gVGhlIGNvbXByZXNzaW9uIHR5cGU7IGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgZm9yIFBORyAxLjAuCisgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBnaXZlIE5VTEwgdG8gdGhpcyBhcmd1bWVudCB0bworICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSBpdC4KKyAgICBwcm9maWxlICAgICAgICAgLSBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIGRhdGEuIE1heSBjb250YWluIE5VTHMuCisgICAgcHJvZmxlbiAgICAgICAgIC0gbGVuZ3RoIG9mIHByb2ZpbGUgZGF0YSBpbiBieXRlcy4KKworICAgIHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOworICAgIHNpZ19iaXQgICAgICAgIC0gdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGZvcgorICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NCSVQpIGVhY2ggb2YgdGhlIGdyYXksCisgICAgICAgICAgICAgICAgICAgICByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgIHdoaWNoZXZlciBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gY29sb3IgdHlwZSAocG5nX2NvbG9yXzE2KQorCisgICAgcG5nX2dldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCAmdHJhbnMsICZudW1fdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAmdHJhbnNfdmFsdWVzKTsKKyAgICB0cmFucyAgICAgICAgICAtIGFycmF5IG9mIHRyYW5zcGFyZW50CisgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzIGZvciBwYWxldHRlIChQTkdfSU5GT190Uk5TKQorICAgIHRyYW5zX3ZhbHVlcyAgIC0gZ3JheWxldmVsIG9yIGNvbG9yIHNhbXBsZSB2YWx1ZXMgb2YKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZWQgaW1hZ2VzIChQTkdfSU5GT190Uk5TKQorICAgIG51bV90cmFucyAgICAgIC0gbnVtYmVyIG9mIHRyYW5zcGFyZW50IGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT190Uk5TKQorCisgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9faElTVCkKKyAgICBoaXN0ICAgICAgICAgICAtIGhpc3RvZ3JhbSBvZiBwYWxldHRlIChhcnJheSBvZgorICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYpCisKKyAgICBwbmdfZ2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2RfdGltZSk7CisgICAgbW9kX3RpbWUgICAgICAgLSB0aW1lIGltYWdlIHdhcyBsYXN0IG1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgIChQTkdfVkFMSURfdElNRSkKKworICAgIHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmJhY2tncm91bmQpOworICAgIGJhY2tncm91bmQgICAgIC0gYmFja2dyb3VuZCBjb2xvciAoUE5HX1ZBTElEX2JLR0QpCisgICAgICAgICAgICAgICAgICAgICB2YWxpZCAxNi1iaXQgcmVkLCBncmVlbiBhbmQgYmx1ZQorICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCByZWdhcmRsZXNzIG9mIGNvbG9yX3R5cGUKKworICAgIG51bV9jb21tZW50cyAgID0gcG5nX2dldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICAgICAgICAgICAgICAgJnRleHRfcHRyLCAmbnVtX3RleHQpOworICAgIG51bV9jb21tZW50cyAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzCisgICAgdGV4dF9wdHIgICAgICAgLSBhcnJheSBvZiBwbmdfdGV4dCBob2xkaW5nIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBjb21tZW50cworICAgIHRleHRfcHRyW2ldLmNvbXByZXNzaW9uIC0gdHlwZSBvZiBjb21wcmVzc2lvbiB1c2VkCisgICAgICAgICAgICAgICAgIG9uICJ0ZXh0IiBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0CisgICAgdGV4dF9wdHJbaV0ua2V5ICAgLSBrZXl3b3JkIGZvciBjb21tZW50LiAgTXVzdCBjb250YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgorICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgZW1wdHkuCisgICAgdGV4dF9wdHJbaV0udGV4dF9sZW5ndGggLSBsZW5ndGggb2YgdGV4dCBzdHJpbmcsCisgICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIGlUWHQKKyAgICB0ZXh0X3B0cltpXS5pdHh0X2xlbmd0aCAtIGxlbmd0aCBvZiBpdHh0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgdEVYdC96VFh0CisgICAgdGV4dF9wdHJbaV0ubGFuZyAgLSBsYW5ndWFnZSBvZiBjb21tZW50IChlbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmb3IgdW5rbm93bikuCisgICAgdGV4dF9wdHJbaV0ubGFuZ19rZXkgIC0ga2V5d29yZCBpbiBVVEYtOAorICAgICAgICAgICAgICAgICAgICAgICAgIChlbXB0eSBzdHJpbmcgZm9yIHVua25vd24pLgorICAgIE5vdGUgdGhhdCB0aGUgaXR4dF9sZW5ndGgsIGxhbmcsIGFuZCBsYW5nX2tleQorICAgIG1lbWJlcnMgb2YgdGhlIHRleHRfcHRyIHN0cnVjdHVyZSBvbmx5IGV4aXN0CisgICAgd2hlbiB0aGUgbGlicmFyeSBpcyBidWlsdCB3aXRoIGlUWHQgY2h1bmsgc3VwcG9ydC4KKworICAgIG51bV90ZXh0ICAgICAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzIChzYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICBudW1fY29tbWVudHM7IHlvdSBjYW4gcHV0IE5VTEwgaGVyZQorICAgICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIGR1cGxpY2F0aW9uKQorICAgIE5vdGUgd2hpbGUgcG5nX3NldF90ZXh0KCkgd2lsbCBhY2NlcHQgdGV4dCwgbGFuZ3VhZ2UsCisgICAgYW5kIHRyYW5zbGF0ZWQga2V5d29yZHMgdGhhdCBjYW4gYmUgTlVMTCBwb2ludGVycywgdGhlCisgICAgc3RydWN0dXJlIHJldHVybmVkIGJ5IHBuZ19nZXRfdGV4dCB3aWxsIGFsd2F5cyBjb250YWluCisgICAgcmVndWxhciB6ZXJvLXRlcm1pbmF0ZWQgQyBzdHJpbmdzLiAgVGhleSBtaWdodCBiZQorICAgIGVtcHR5IHN0cmluZ3MgYnV0IHRoZXkgd2lsbCBuZXZlciBiZSBOVUxMIHBvaW50ZXJzLgorCisgICAgbnVtX3NwYWxldHRlcyA9IHBuZ19nZXRfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICAmcGFsZXR0ZV9wdHIpOworICAgIHBhbGV0dGVfcHRyICAgIC0gYXJyYXkgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIGhvbGRpbmcKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzIG9mIG9uZSBvciBtb3JlIHNQTFQgY2h1bmtzCisgICAgICAgICAgICAgICAgICAgICByZWFkLgorICAgIG51bV9zcGFsZXR0ZXMgIC0gbnVtYmVyIG9mIHNQTFQgY2h1bmtzIHJlYWQuCisKKyAgICBwbmdfZ2V0X29GRnMocG5nX3B0ciwgaW5mb19wdHIsICZvZmZzZXRfeCwgJm9mZnNldF95LAorICAgICAgICZ1bml0X3R5cGUpOworICAgIG9mZnNldF94ICAgICAgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIGxlZnQgZWRnZQorICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNjcmVlbgorICAgIG9mZnNldF95ICAgICAgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIHRvcCBlZGdlCisgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuCisgICAgdW5pdF90eXBlICAgICAgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKKworICAgIHBuZ19nZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnJlc194LCAmcmVzX3ksCisgICAgICAgJnVuaXRfdHlwZSk7CisgICAgcmVzX3ggICAgICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uIGluCisgICAgICAgICAgICAgICAgICAgICB4IGRpcmVjdGlvbgorICAgIHJlc195ICAgICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgeCBkaXJlY3Rpb24KKyAgICB1bml0X3R5cGUgICAgICAtIFBOR19SRVNPTFVUSU9OX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICBQTkdfUkVTT0xVVElPTl9NRVRFUgorCisgICAgcG5nX2dldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5pdCwgJndpZHRoLAorICAgICAgICZoZWlnaHQpCisgICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKKyAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCisgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQorCisgICAgcG5nX2dldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsICZ1bml0LCAmd2lkdGgsCisgICAgICAgJmhlaWdodCkKKyAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQorICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cworICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIHN0cmluZ3MgbGlrZSAiMi41NCIpCisKKyAgICBudW1fdW5rbm93bl9jaHVua3MgPSBwbmdfZ2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIsICZ1bmtub3ducykKKyAgICB1bmtub3ducyAgICAgICAgICAtIGFycmF5IG9mIHBuZ191bmtub3duX2NodW5rCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGhvbGRpbmcgdW5rbm93biBjaHVua3MKKyAgICB1bmtub3duc1tpXS5uYW1lICAtIG5hbWUgb2YgdW5rbm93biBjaHVuaworICAgIHVua25vd25zW2ldLmRhdGEgIC0gZGF0YSBvZiB1bmtub3duIGNodW5rCisgICAgdW5rbm93bnNbaV0uc2l6ZSAgLSBzaXplIG9mIHVua25vd24gY2h1bmsncyBkYXRhCisgICAgdW5rbm93bnNbaV0ubG9jYXRpb24gLSBwb3NpdGlvbiBvZiBjaHVuayBpbiBmaWxlCisKKyAgICBUaGUgdmFsdWUgb2YgImkiIGNvcnJlc3BvbmRzIHRvIHRoZSBvcmRlciBpbiB3aGljaCB0aGUKKyAgICBjaHVua3Mgd2VyZSByZWFkIGZyb20gdGhlIFBORyBmaWxlIG9yIGluc2VydGVkIHdpdGggdGhlCisgICAgcG5nX3NldF91bmtub3duX2NodW5rcygpIGZ1bmN0aW9uLgorCitUaGUgZGF0YSBmcm9tIHRoZSBwSFlzIGNodW5rIGNhbiBiZSByZXRyaWV2ZWQgaW4gc2V2ZXJhbCBjb252ZW5pZW50Citmb3JtczoKKworICAgIHJlc194ID0gcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKyAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisgICAgcmVzX3hfYW5kX3kgPSBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKyAgICByZXNfeCA9IHBuZ19nZXRfeF9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKyAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKyAgICByZXNfeF9hbmRfeSA9IHBuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisgICAgYXNwZWN0X3JhdGlvID0gcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8ocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKworICAgKEVhY2ggb2YgdGhlc2UgcmV0dXJucyAwIFtzaWduaWZ5aW5nICJ1bmtub3duIl0gaWYKKyAgICAgICB0aGUgZGF0YSBpcyBub3QgcHJlc2VudCBvciBpZiByZXNfeCBpcyAwOworICAgICAgIHJlc194X2FuZF95IGlzIDAgaWYgcmVzX3ggIT0gcmVzX3kpCisKK1RoZSBkYXRhIGZyb20gdGhlIG9GRnMgY2h1bmsgY2FuIGJlIHJldHJpZXZlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQKK2Zvcm1zOgorCisgICAgeF9vZmZzZXQgPSBwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpOworICAgIHlfb2Zmc2V0ID0gcG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICB4X29mZnNldCA9IHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICB5X29mZnNldCA9IHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgKEVhY2ggb2YgdGhlc2UgcmV0dXJucyAwIFtzaWduaWZ5aW5nICJ1bmtub3duIiBpZiBib3RoCisgICAgICAgeCBhbmQgeSBhcmUgMF0gaWYgdGhlIGRhdGEgaXMgbm90IHByZXNlbnQgb3IgaWYgdGhlCisgICAgICAgY2h1bmsgaXMgcHJlc2VudCBidXQgdGhlIHVuaXQgaXMgdGhlIHBpeGVsKQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBwbmdfaW5mbyBkZWZpbml0aW9uIGluIHBuZy5oIGFuZCB0aGUKK1BORyBzcGVjaWZpY2F0aW9uIGZvciBjaHVuayBjb250ZW50cy4gIEJlIGNhcmVmdWwgd2l0aCB0cnVzdGluZworcm93Ynl0ZXMsIGFzIHNvbWUgb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBjb3VsZCBpbmNyZWFzZSB0aGUgc3BhY2UKK25lZWRlZCB0byBob2xkIGEgcm93IChleHBhbmQsIGZpbGxlciwgZ3JheV90b19yZ2IsIGV0Yy4pLgorU2VlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCksIGJlbG93LgorCitBIHF1aWNrIHdvcmQgYWJvdXQgdGV4dF9wdHIgYW5kIG51bV90ZXh0LiAgUE5HIHN0b3JlcyBjb21tZW50cyBpbgora2V5d29yZC90ZXh0IHBhaXJzLCBvbmUgcGFpciBwZXIgY2h1bmssIHdpdGggbm8gbGltaXQgb24gdGhlIG51bWJlcgorb2YgdGV4dCBjaHVua3MsIGFuZCBhIDJeMzEgYnl0ZSBsaW1pdCBvbiB0aGVpciBzaXplLiAgV2hpbGUgdGhlcmUgYXJlCitzdWdnZXN0ZWQga2V5d29yZHMsIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIHJlc3RyaWN0IHRoZSB1c2UgdG8gdGhlc2UKK3N0cmluZ3MuICBJdCBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdCBrZXl3b3JkcyBhbmQgdGV4dCBiZSBzZW5zaWJsZQordG8gaHVtYW5zICh0aGF0J3MgdGhlIHBvaW50KSwgc28gZG9uJ3QgdXNlIGFiYnJldmlhdGlvbnMuICBOb24tcHJpbnRpbmcKK3N5bWJvbHMgYXJlIG5vdCBhbGxvd2VkLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorVGhlcmUgaXMgYWxzbyBubyByZXF1aXJlbWVudCB0byBoYXZlIHRleHQgYWZ0ZXIgdGhlIGtleXdvcmQuCisKK0tleXdvcmRzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDc5IExhdGluLTEgY2hhcmFjdGVycyB3aXRob3V0IGxlYWRpbmcgb3IKK3RyYWlsaW5nIHNwYWNlcywgYnV0IG5vbi1jb25zZWN1dGl2ZSBzcGFjZXMgYXJlIGFsbG93ZWQgd2l0aGluIHRoZQora2V5d29yZC4gIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNhbWUga2V5d29yZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgorVGhlIHRleHRfcHRyIGlzIGFuIGFycmF5IG9mIHBuZ190ZXh0IHN0cnVjdHVyZXMsIGVhY2ggaG9sZGluZyBhCitwb2ludGVyIHRvIGEgbGFuZ3VhZ2Ugc3RyaW5nLCBhIHBvaW50ZXIgdG8gYSBrZXl3b3JkIGFuZCBhIHBvaW50ZXIgdG8KK2EgdGV4dCBzdHJpbmcuICBUaGUgdGV4dCBzdHJpbmcsIGxhbmd1YWdlIGNvZGUsIGFuZCB0cmFuc2xhdGVkCitrZXl3b3JkIG1heSBiZSBlbXB0eSBvciBOVUxMIHBvaW50ZXJzLiAgVGhlIGtleXdvcmQvdGV4dAorcGFpcnMgYXJlIHB1dCBpbnRvIHRoZSBhcnJheSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZWNlaXZlZC4KK0hvd2V2ZXIsIHNvbWUgb3IgYWxsIG9mIHRoZSB0ZXh0IGNodW5rcyBtYXkgYmUgYWZ0ZXIgdGhlIGltYWdlLCBzbywgdG8KK21ha2Ugc3VyZSB5b3UgaGF2ZSByZWFkIGFsbCB0aGUgdGV4dCBjaHVua3MsIGRvbid0IG1lc3Mgd2l0aCB0aGVzZQordW50aWwgYWZ0ZXIgeW91IHJlYWQgdGhlIHN0dWZmIGFmdGVyIHRoZSBpbWFnZS4gIFRoaXMgd2lsbCBiZQorbWVudGlvbmVkIGFnYWluIGJlbG93IGluIHRoZSBkaXNjdXNzaW9uIHRoYXQgZ29lcyB3aXRoIHBuZ19yZWFkX2VuZCgpLgorCisuU1MgSW5wdXQgdHJhbnNmb3JtYXRpb25zCisKK0FmdGVyIHlvdSd2ZSByZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24sIHlvdSBjYW4gc2V0IHVwIHRoZSBsaWJyYXJ5Cit0byBoYW5kbGUgYW55IHNwZWNpYWwgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBpbWFnZSBkYXRhLiAgVGhlIHZhcmlvdXMKK3dheXMgdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkKK3Nob3VsZCBvY2N1ci4gIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBzb21lIG9mIHRoZXNlIGNoYW5nZSB0aGUgY29sb3IKK3R5cGUgYW5kL29yIGJpdCBkZXB0aCBvZiB0aGUgZGF0YSwgYW5kIHNvbWUgb3RoZXJzIG9ubHkgd29yayBvbgorY2VydGFpbiBjb2xvciB0eXBlcyBhbmQgYml0IGRlcHRocy4gIEV2ZW4gdGhvdWdoIGVhY2ggdHJhbnNmb3JtYXRpb24KK2NoZWNrcyB0byBzZWUgaWYgaXQgaGFzIGRhdGEgdGhhdCBpdCBjYW4gZG8gc29tZXRoaW5nIHdpdGgsIHlvdSBzaG91bGQKK21ha2Ugc3VyZSB0byBvbmx5IGVuYWJsZSBhIHRyYW5zZm9ybWF0aW9uIGlmIGl0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZQorZGF0YS4gIEZvciBleGFtcGxlLCBkb24ndCBzd2FwIHJlZCBhbmQgYmx1ZSBvbiBncmF5c2NhbGUgZGF0YS4KKworVGhlIGNvbG9ycyB1c2VkIGZvciB0aGUgYmFja2dyb3VuZCBhbmQgdHJhbnNwYXJlbmN5IHZhbHVlcyBzaG91bGQgYmUKK3N1cHBsaWVkIGluIHRoZSBzYW1lIGZvcm1hdC9kZXB0aCBhcyB0aGUgY3VycmVudCBpbWFnZSBkYXRhLiAgVGhleQorYXJlIHN0b3JlZCBpbiB0aGUgc2FtZSBmb3JtYXQvZGVwdGggYXMgdGhlIGltYWdlIGRhdGEgaW4gYSBiS0dEIG9yIHRSTlMKK2NodW5rLCBzbyB0aGlzIGlzIHdoYXQgbGlicG5nIGV4cGVjdHMgZm9yIHRoaXMgZGF0YS4gIFRoZSBjb2xvcnMgYXJlCit0cmFuc2Zvcm1lZCB0byBrZWVwIGluIHN5bmMgd2l0aCB0aGUgaW1hZ2UgZGF0YSB3aGVuIGFuIGFwcGxpY2F0aW9uCitjYWxscyB0aGUgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSByb3V0aW5lIChzZWUgYmVsb3cpLgorCitEYXRhIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBzdXBwbGllZCByb3cgYnVmZmVycyBwYWNrZWQgaW50byBieXRlcwordW5sZXNzIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIHRvbGQgdG8gdHJhbnNmb3JtIGl0IGludG8gYW5vdGhlciBmb3JtYXQuCitGb3IgZXhhbXBsZSwgNCBiaXQvcGl4ZWwgcGFsZXR0ZWQgb3IgZ3JheXNjYWxlIGRhdGEgd2lsbCBiZSByZXR1cm5lZAorMiBwaXhlbHMvYnl0ZSB3aXRoIHRoZSBsZWZ0bW9zdCBwaXhlbCBpbiB0aGUgaGlnaC1vcmRlciBiaXRzIG9mIHRoZQorYnl0ZSwgdW5sZXNzIHBuZ19zZXRfcGFja2luZygpIGlzIGNhbGxlZC4gIDgtYml0IFJHQiBkYXRhIHdpbGwgYmUgc3RvcmVkCitpbiBSR0IgUkdCIFJHQiBmb3JtYXQgdW5sZXNzIHBuZ19zZXRfZmlsbGVyKCkgb3IgcG5nX3NldF9hZGRfYWxwaGEoKQoraXMgY2FsbGVkIHRvIGluc2VydCBmaWxsZXIgYnl0ZXMsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgZWFjaCBSR0IgdHJpcGxldC4KKzE2LWJpdCBSR0IgZGF0YSB3aWxsIGJlIHJldHVybmVkIFJSR0dCQiBSUkdHQkIsIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKK2J5dGUgb2YgdGhlIGNvbG9yIHZhbHVlIGZpcnN0LCB1bmxlc3MgcG5nX3NldF9zdHJpcF8xNigpIGlzIGNhbGxlZCB0bwordHJhbnNmb3JtIGl0IHRvIHJlZ3VsYXIgUkdCIFJHQiB0cmlwbGV0cywgb3IgcG5nX3NldF9maWxsZXIoKSBvcgorcG5nX3NldF9hZGQgYWxwaGEoKSBpcyBjYWxsZWQgdG8gaW5zZXJ0IGZpbGxlciBieXRlcywgZWl0aGVyIGJlZm9yZSBvcgorYWZ0ZXIgZWFjaCBSUkdHQkIgdHJpcGxldC4gIFNpbWlsYXJseSwgOC1iaXQgb3IgMTYtYml0IGdyYXlzY2FsZSBkYXRhIGNhbgorYmUgbW9kaWZpZWQgd2l0aAorcG5nX3NldF9maWxsZXIoKSwgcG5nX3NldF9hZGRfYWxwaGEoKSwgb3IgcG5nX3NldF9zdHJpcF8xNigpLgorCitUaGUgZm9sbG93aW5nIGNvZGUgdHJhbnNmb3JtcyBncmF5c2NhbGUgaW1hZ2VzIG9mIGxlc3MgdGhhbiA4IHRvIDggYml0cywKK2NoYW5nZXMgcGFsZXR0ZWQgaW1hZ2VzIHRvIFJHQiwgYW5kIGFkZHMgYSBmdWxsIGFscGhhIGNoYW5uZWwgaWYgdGhlcmUgaXMKK3RyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiBpbiBhIHRSTlMgY2h1bmsuICBUaGlzIGlzIG1vc3QgdXNlZnVsIG9uCitncmF5c2NhbGUgaW1hZ2VzIHdpdGggYml0IGRlcHRocyBvZiAyIG9yIDQgb3IgaWYgdGhlcmUgaXMgYSBtdWx0aXBsZS1pbWFnZQordmlld2luZyBhcHBsaWNhdGlvbiB0aGF0IHdpc2hlcyB0byB0cmVhdCBhbGwgaW1hZ2VzIGluIHRoZSBzYW1lIHdheS4KKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICAgIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3B0cik7CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmCisgICAgICAgIGJpdF9kZXB0aCA8IDgpIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsKKworICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICBQTkdfSU5GT190Uk5TKSkgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOworCitUaGVzZSB0aHJlZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGFsaWFzZXMgZm9yIHBuZ19zZXRfZXhwYW5kKCksIGFkZGVkCitpbiBsaWJwbmcgdmVyc2lvbiAxLjAuNCwgd2l0aCB0aGUgZnVuY3Rpb24gbmFtZXMgZXhwYW5kZWQgdG8gaW1wcm92ZSBjb2RlCityZWFkYWJpbGl0eS4gIEluIHNvbWUgZnV0dXJlIHZlcnNpb24gdGhleSBtYXkgYWN0dWFsbHkgZG8gZGlmZmVyZW50Cit0aGluZ3MuCisKK0FzIG9mIGxpYnBuZyB2ZXJzaW9uIDEuMi45LCBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSB3YXMKK2FkZGVkLiAgSXQgZXhwYW5kcyB0aGUgc2FtcGxlIGRlcHRoIHdpdGhvdXQgY2hhbmdpbmcgdFJOUyB0byBhbHBoYS4KKworQXMgb2YgbGlicG5nIHZlcnNpb24gMS4yLjQ0LCBub3QgYWxsIHBvc3NpYmxlIGV4cGFuc2lvbnMgYXJlIHN1cHBvcnRlZC4KKworSW4gdGhlIGZvbGxvd2luZyB0YWJsZSwgdGhlIDAxIG1lYW5zIGdyYXlzY2FsZSB3aXRoIGRlcHRoPDgsIDMxIG1lYW5zCitpbmRleGVkIHdpdGggZGVwdGg8OCwgb3RoZXIgbnVtZXJhbHMgcmVwcmVzZW50IHRoZSBjb2xvciB0eXBlLCAiVCIgbWVhbnMKK3RoZSB0Uk5TIGNodW5rIGlzIHByZXNlbnQsIEEgbWVhbnMgYW4gYWxwaGEgY2hhbm5lbCBpcyBwcmVzZW50LCBhbmQgTworbWVhbnMgdFJOUyBvciBhbHBoYSBpcyBwcmVzZW50IGJ1dCBhbGwgcGl4ZWxzIGluIHRoZSBpbWFnZSBhcmUgb3BhcXVlLgorCisgIEZST00gIDAxICAzMSAgIDAgIDBUICAwTyAgIDIgIDJUICAyTyAgIDMgIDNUICAzTyAgNEEgIDRPICA2QSAgNk8gCisgICBUTworICAgMDEgICAgLSAgICAgICAgICAgICAgICAgICAKKyAgIDMxICAgICAgICAtCisgICAgMCAgICAxICAgICAgIC0gICAgICAgICAgIAorICAgMFQgICAgICAgICAgICAgICAgLQorICAgME8gICAgICAgICAgICAgICAgICAgIC0KKyAgICAyICAgICAgICAgICBHWCAgICAgICAgICAgLQorICAgMlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgMk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyAgICAzICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgM1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgM08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyAgIDRBICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgNE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgNkEgICAgICAgICAgICAgICBHWCAgICAgICAgIFRYICAgICAgICAgICBUWCAgICAgICAgICAgICAgIC0KKyAgIDZPICAgICAgICAgICAgICAgICAgIEdYICAgICAgICAgICAgICAgICAgICAgIFRYICAgICAgICAgICAgICAgLQorCitXaXRoaW4gdGhlIG1hdHJpeCwKKyAgICAgIi0iIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAiWCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfZXhwYW5kKCkuCisgICAgICIxIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKKyAgICAgICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOAorICAgICAiRyIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5CisgICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKCkuCisgICAgICJQIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKKyAgICAgICAgIHBuZ19zZXRfZXhwYW5kX3BhbGV0dGVfdG9fcmdiKCkuCisgICAgICJUIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKKyAgICAgICAgIHBuZ19zZXRfdFJOU190b19hbHBoYSgpLgorCitQTkcgY2FuIGhhdmUgZmlsZXMgd2l0aCAxNiBiaXRzIHBlciBjaGFubmVsLiAgSWYgeW91IG9ubHkgY2FuIGhhbmRsZQorOCBiaXRzIHBlciBjaGFubmVsLCB0aGlzIHdpbGwgc3RyaXAgdGhlIHBpeGVscyBkb3duIHRvIDggYml0LgorCisgICAgaWYgKGJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKKworSWYsIGZvciBzb21lIHJlYXNvbiwgeW91IGRvbid0IG5lZWQgdGhlIGFscGhhIGNoYW5uZWwgb24gYW4gaW1hZ2UsCithbmQgeW91IHdhbnQgdG8gcmVtb3ZlIGl0IHJhdGhlciB0aGFuIGNvbWJpbmluZyBpdCB3aXRoIHRoZSBiYWNrZ3JvdW5kCisoYnV0IHRoZSBpbWFnZSBhdXRob3IgY2VydGFpbmx5IGhhZCBpbiBtaW5kIHRoYXQgeW91ICp3b3VsZCogY29tYmluZQoraXQgd2l0aCB0aGUgYmFja2dyb3VuZCwgc28gdGhhdCdzIHdoYXQgeW91IHNob3VsZCBwcm9iYWJseSBkbyk6CisKKyAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQorICAgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOworCitJbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlCitpcyB0aGUgbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdSBuZWVkIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIHRvCitiZSB0aGUgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5IGluc3RlYWQgb2Ygb3BhY2l0eSwgeW91IGNhbiBpbnZlcnQgdGhlCithbHBoYSBjaGFubmVsIChvciB0aGUgdFJOUyBjaHVuayBkYXRhKSBhZnRlciBpdCdzIHJlYWQsIHNvIHRoYXQgMCBpcworZnVsbHkgb3BhcXVlIGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUgKGluIDE2LWJpdAoraW1hZ2VzKSBpcyBmdWxseSB0cmFuc3BhcmVudCwgd2l0aAorCisgICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7CisKK1RoZSBQTkcgZm9ybWF0IG9ubHkgc3VwcG9ydHMgcGl4ZWxzIHdpdGggcG9zdG11bHRpcGxpZWQgYWxwaGEuCitJZiB5b3Ugd2FudCB0byByZXBsYWNlIHRoZSBwaXhlbHMsIGFmdGVyIHJlYWRpbmcgdGhlbSwgd2l0aCBwaXhlbHMKK3RoYXQgaGF2ZSBwcmVtdWx0aXBsaWVkIGNvbG9yIHNhbXBsZXMsIHlvdSBjYW4gZG8gdGhpcyB3aXRoCisKKyAgICBwbmdfc2V0X3ByZW11bHRpcGx5X2FscGhhKHBuZ19wdHIpOworCitJZiB5b3UgZG8gdGhpcywgYW55IGlucHV0IHdpdGggYSB0Uk5TIGNodW5rIHdpbGwgYmUgZXhwYW5kZWQgdG8KK2hhdmUgYW4gYWxwaGEgY2hhbm5lbC4KKworUE5HIGZpbGVzIHBhY2sgcGl4ZWxzIG9mIGJpdCBkZXB0aHMgMSwgMiwgYW5kIDQgaW50byBieXRlcyBhcyBzbWFsbCBhcwordGhleSBjYW4sIHJlc3VsdGluZyBpbiwgZm9yIGV4YW1wbGUsIDggcGl4ZWxzIHBlciBieXRlIGZvciAxIGJpdAorZmlsZXMuICBUaGlzIGNvZGUgZXhwYW5kcyB0byAxIHBpeGVsIHBlciBieXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlCit2YWx1ZXMgb2YgdGhlIHBpeGVsczoKKworICAgIGlmIChiaXRfZGVwdGggPCA4KQorICAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7CisKK1BORyBmaWxlcyBoYXZlIHBvc3NpYmxlIGJpdCBkZXB0aHMgb2YgMSwgMiwgNCwgOCwgYW5kIDE2LiAgQWxsIHBpeGVscworc3RvcmVkIGluIGEgUE5HIGltYWdlIGhhdmUgYmVlbiAic2NhbGVkIiBvciAic2hpZnRlZCIgdXAgdG8gdGhlIG5leHQKK2hpZ2hlciBwb3NzaWJsZSBiaXQgZGVwdGggKGUuZy4gZnJvbSA1IGJpdHMvc2FtcGxlIGluIHRoZSByYW5nZSBbMCwzMV0KK3RvIDggYml0cy9zYW1wbGUgaW4gdGhlIHJhbmdlIFswLCAyNTVdKS4gIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUKK3RvIGNvbnZlcnQgdGhlIFBORyBwaXhlbCBkYXRhIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aCBvZiB0aGUKK2ltYWdlLiAgVGhpcyBjYWxsIHJlZHVjZXMgdGhlIHBpeGVscyBiYWNrIGRvd24gdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aDoKKworICAgIHBuZ19jb2xvcl84cCBzaWdfYml0OworCisgICAgaWYgKHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpKQorICAgICAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsIHNpZ19iaXQpOworCitQTkcgZmlsZXMgc3RvcmUgMy1jb2xvciBwaXhlbHMgaW4gcmVkLCBncmVlbiwgYmx1ZSBvcmRlci4gIFRoaXMgY29kZQorY2hhbmdlcyB0aGUgc3RvcmFnZSBvZiB0aGUgcGl4ZWxzIHRvIGJsdWUsIGdyZWVuLCByZWQ6CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOworCitQTkcgZmlsZXMgc3RvcmUgUkdCIHBpeGVscyBwYWNrZWQgaW50byAzIG9yIDYgYnl0ZXMuIFRoaXMgY29kZSBleHBhbmRzIHRoZW0KK2ludG8gNCBvciA4IGJ5dGVzIGZvciB3aW5kb3dpbmcgc3lzdGVtcyB0aGF0IG5lZWQgdGhlbSBpbiB0aGlzIGZvcm1hdDoKKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgICAgICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0JFRk9SRSk7CisKK3doZXJlICJmaWxsZXIiIGlzIHRoZSA4IG9yIDE2LWJpdCBudW1iZXIgdG8gZmlsbCB3aXRoLCBhbmQgdGhlIGxvY2F0aW9uIGlzCitlaXRoZXIgUE5HX0ZJTExFUl9CRUZPUkUgb3IgUE5HX0ZJTExFUl9BRlRFUiwgZGVwZW5kaW5nIHVwb24gd2hldGhlcgoreW91IHdhbnQgdGhlIGZpbGxlciBiZWZvcmUgdGhlIFJHQiBvciBhZnRlci4gIFRoaXMgdHJhbnNmb3JtYXRpb24KK2RvZXMgbm90IGFmZmVjdCBpbWFnZXMgdGhhdCBhbHJlYWR5IGhhdmUgZnVsbCBhbHBoYSBjaGFubmVscy4gIFRvIGFkZCBhbgorb3BhcXVlIGFscGhhIGNoYW5uZWwsIHVzZSBmaWxsZXI9MHhmZiBvciAweGZmZmYgYW5kIFBOR19GSUxMRVJfQUZURVIgd2hpY2gKK3dpbGwgZ2VuZXJhdGUgUkdCQSBwaXhlbHMuCisKK05vdGUgdGhhdCBwbmdfc2V0X2ZpbGxlcigpIGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgdHlwZS4gIElmIHlvdSB3YW50Cit0byBkbyB0aGF0LCB5b3UgY2FuIGFkZCBhIHRydWUgYWxwaGEgY2hhbm5lbCB3aXRoCisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgIHBuZ19zZXRfYWRkX2FscGhhKHBuZ19wdHIsIGZpbGxlciwgUE5HX0ZJTExFUl9BRlRFUik7CisKK3doZXJlICJmaWxsZXIiIGNvbnRhaW5zIHRoZSBhbHBoYSB2YWx1ZSB0byBhc3NpZ24gdG8gZWFjaCBwaXhlbC4KK1RoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIGluIGxpYnBuZy0xLjIuNy4KKworSWYgeW91IGFyZSByZWFkaW5nIGFuIGltYWdlIHdpdGggYW4gYWxwaGEgY2hhbm5lbCwgYW5kIHlvdSBuZWVkIHRoZQorZGF0YSBhcyBBUkdCIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBQTkcgZm9ybWF0IFJHQkE6CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgIHBuZ19zZXRfc3dhcF9hbHBoYShwbmdfcHRyKTsKKworRm9yIHNvbWUgdXNlcywgeW91IG1heSB3YW50IGEgZ3JheXNjYWxlIGltYWdlIHRvIGJlIHJlcHJlc2VudGVkIGFzCitSR0IuICBUaGlzIGNvZGUgd2lsbCBkbyB0aGF0IGNvbnZlcnNpb246CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8CisgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOworCitDb252ZXJzZWx5LCB5b3UgY2FuIGNvbnZlcnQgYW4gUkdCIG9yIFJHQkEgaW1hZ2UgdG8gZ3JheXNjYWxlIG9yIGdyYXlzY2FsZQord2l0aCBhbHBoYS4KKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgICAgICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBuZ19wdHIsIGVycm9yX2FjdGlvbiwKKyAgICAgICAgICAgICBpbnQgcmVkX3dlaWdodCwgaW50IGdyZWVuX3dlaWdodCk7CisKKyAgICBlcnJvcl9hY3Rpb24gPSAxOiBzaWxlbnRseSBkbyB0aGUgY29udmVyc2lvbgorICAgIGVycm9yX2FjdGlvbiA9IDI6IGlzc3VlIGEgd2FybmluZyBpZiB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoYXMgYW55IHBpeGVsIHdoZXJlCisgICAgICAgICAgICAgICAgICAgICAgcmVkICE9IGdyZWVuIG9yIHJlZCAhPSBibHVlCisgICAgZXJyb3JfYWN0aW9uID0gMzogaXNzdWUgYW4gZXJyb3IgYW5kIGFib3J0IHRoZQorICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaWYgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQorICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQorCisgICAgcmVkX3dlaWdodDogICAgICAgd2VpZ2h0IG9mIHJlZCBjb21wb25lbnQgdGltZXMgMTAwMDAwCisgICAgZ3JlZW5fd2VpZ2h0OiAgICAgd2VpZ2h0IG9mIGdyZWVuIGNvbXBvbmVudCB0aW1lcyAxMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICBJZiBlaXRoZXIgd2VpZ2h0IGlzIG5lZ2F0aXZlLCBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyAoMjEyNjgsIDcxNTE0KSBhcmUgdXNlZC4KKworSWYgeW91IGhhdmUgc2V0IGVycm9yX2FjdGlvbiA9IDEgb3IgMiwgeW91IGNhbgorbGF0ZXIgY2hlY2sgd2hldGhlciB0aGUgaW1hZ2UgcmVhbGx5IHdhcyBncmF5LCBhZnRlciBwcm9jZXNzaW5nCit0aGUgaW1hZ2Ugcm93cywgd2l0aCB0aGUgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMocG5nX3B0cikgZnVuY3Rpb24uCitJdCB3aWxsIHJldHVybiBhIHBuZ19ieXRlIHRoYXQgaXMgemVybyBpZiB0aGUgaW1hZ2Ugd2FzIGdyYXkgb3IKKzEgaWYgdGhlcmUgd2VyZSBhbnkgbm9uLWdyYXkgcGl4ZWxzLiAgYktHRCBhbmQgc0JJVCBkYXRhCit3aWxsIGJlIHNpbGVudGx5IGNvbnZlcnRlZCB0byBncmF5c2NhbGUsIHVzaW5nIHRoZSBncmVlbiBjaGFubmVsCitkYXRhLCByZWdhcmRsZXNzIG9mIHRoZSBlcnJvcl9hY3Rpb24gc2V0dGluZy4KKworV2l0aCByZWRfd2VpZ2h0K2dyZWVuX3dlaWdodDw9MTAwMDAwLAordGhlIG5vcm1hbGl6ZWQgZ3JheWxldmVsIGlzIGNvbXB1dGVkOgorCisgICAgaW50IHJ3ID0gcmVkX3dlaWdodCAqIDY1NTM2OworICAgIGludCBndyA9IGdyZWVuX3dlaWdodCAqIDY1NTM2OworICAgIGludCBidyA9IDY1NTM2IC0gKHJ3ICsgZ3cpOworICAgIGdyYXkgPSAocncqcmVkICsgZ3cqZ3JlZW4gKyBidypibHVlKS82NTUzNjsKKworVGhlIGRlZmF1bHQgdmFsdWVzIGFwcHJveGltYXRlIHRob3NlIHJlY29tbWVuZGVkIGluIHRoZSBDaGFybGVzCitQb3ludG9uJ3MgQ29sb3IgRkFRLCA8aHR0cDovL3d3dy5pbmZvcmFtcC5uZXQvfnBveW50b24vPgorQ29weXJpZ2h0IChjKSAxOTk4LTAxLTA0IENoYXJsZXMgUG95bnRvbiA8cG95bnRvbiBhdCBpbmZvcmFtcC5uZXQ+CisKKyAgICBZID0gMC4yMTI2NzEgKiBSICsgMC43MTUxNjAgKiBHICsgMC4wNzIxNjkgKiBCCisKK0xpYnBuZyBhcHByb3hpbWF0ZXMgdGhpcyB3aXRoCisKKyAgICBZID0gMC4yMTI2OCAqIFIgICAgKyAwLjcxNTEgKiBHICAgICsgMC4wNzIxNyAqIEIKKword2hpY2ggY2FuIGJlIGV4cHJlc3NlZCB3aXRoIGludGVnZXJzIGFzCisKKyAgICBZID0gKDY5NjkgKiBSICsgMjM0MzQgKiBHICsgMjM2NSAqIEIpLzMyNzY4CisKK1RoZSBjYWxjdWxhdGlvbiBpcyBkb25lIGluIGEgbGluZWFyIGNvbG9yc3BhY2UsIGlmIHRoZSBpbWFnZSBnYW1tYQoraXMga25vd24uCisKK0lmIHlvdSBoYXZlIGEgZ3JheXNjYWxlIGFuZCB5b3UgYXJlIHVzaW5nIHBuZ19zZXRfZXhwYW5kX2RlcHRoKCksCitwbmdfc2V0X2V4cGFuZCgpLCBvciBwbmdfc2V0X2dyYXlfdG9fcmdiIHRvIGNoYW5nZSB0byB0cnVlY29sb3Igb3IgdG8KK2EgaGlnaGVyIGJpdC1kZXB0aCwgeW91IG11c3QgZWl0aGVyIHN1cHBseSB0aGUgYmFja2dyb3VuZCBjb2xvciBhcyBhIGdyYXkKK3ZhbHVlIGF0IHRoZSBvcmlnaW5hbCBmaWxlIGJpdC1kZXB0aCAobmVlZF9leHBhbmQgPSAxKSBvciBlbHNlIHN1cHBseSB0aGUKK2JhY2tncm91bmQgY29sb3IgYXMgYW4gUkdCIHRyaXBsZXQgYXQgdGhlIGZpbmFsLCBleHBhbmRlZCBiaXQgZGVwdGgKKyhuZWVkX2V4cGFuZCA9IDApLiAgU2ltaWxhcmx5LCBpZiB5b3UgYXJlIHJlYWRpbmcgYSBwYWxldHRlZCBpbWFnZSwgeW91CittdXN0IGVpdGhlciBzdXBwbHkgdGhlIGJhY2tncm91bmQgY29sb3IgYXMgYSBwYWxldHRlIGluZGV4IChuZWVkX2V4cGFuZCA9IDEpCitvciBhcyBhbiBSR0IgdHJpcGxldCB0aGF0IG1heSBvciBtYXkgbm90IGJlIGluIHRoZSBwYWxldHRlIChuZWVkX2V4cGFuZCA9IDApLgorCisgICAgcG5nX2NvbG9yXzE2IG15X2JhY2tncm91bmQ7CisgICAgcG5nX2NvbG9yXzE2cCBpbWFnZV9iYWNrZ3JvdW5kOworCisgICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpKQorICAgICAgICBwbmdfc2V0X2JhY2tncm91bmQocG5nX3B0ciwgaW1hZ2VfYmFja2dyb3VuZCwKKyAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLCAxLjApOworICAgIGVsc2UKKyAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZteV9iYWNrZ3JvdW5kLAorICAgICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMCwgMS4wKTsKKworVGhlIHBuZ19zZXRfYmFja2dyb3VuZCgpIGZ1bmN0aW9uIHRlbGxzIGxpYnBuZyB0byBjb21wb3NpdGUgaW1hZ2VzCit3aXRoIGFscGhhIG9yIHNpbXBsZSB0cmFuc3BhcmVuY3kgYWdhaW5zdCB0aGUgc3VwcGxpZWQgYmFja2dyb3VuZAorY29sb3IuICBJZiB0aGUgUE5HIGZpbGUgY29udGFpbnMgYSBiS0dEIGNodW5rIChQTkdfSU5GT19iS0dEIHZhbGlkKSwKK3lvdSBtYXkgdXNlIHRoaXMgY29sb3IsIG9yIHN1cHBseSBhbm90aGVyIGNvbG9yIG1vcmUgc3VpdGFibGUgZm9yCit0aGUgY3VycmVudCBkaXNwbGF5IChlLmcuLCB0aGUgYmFja2dyb3VuZCBjb2xvciBmcm9tIGEgd2ViIHBhZ2UpLiAgWW91CituZWVkIHRvIHRlbGwgbGlicG5nIHdoZXRoZXIgdGhlIGNvbG9yIGlzIGluIHRoZSBnYW1tYSBzcGFjZSBvZiB0aGUKK2Rpc3BsYXkgKFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiBmb3IgY29sb3JzIHlvdSBzdXBwbHkpLCB0aGUgZmlsZQorKFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUgZm9yIGNvbG9ycyBmcm9tIHRoZSBiS0dEIGNodW5rKSwgb3Igb25lCit0aGF0IGlzIG5laXRoZXIgb2YgdGhlc2UgZ2FtbWFzIChQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUUgLSBJIGRvbid0Citrbm93IHdoeSBhbnlvbmUgd291bGQgdXNlIHRoaXMsIGJ1dCBpdCdzIGhlcmUpLgorCitUbyBwcm9wZXJseSBkaXNwbGF5IFBORyBpbWFnZXMgb24gYW55IGtpbmQgb2Ygc3lzdGVtLCB0aGUgYXBwbGljYXRpb24gbmVlZHMKK3RvIGtub3cgd2hhdCB0aGUgZGlzcGxheSBnYW1tYSBpcy4gIElkZWFsbHksIHRoZSB1c2VyIHdpbGwga25vdyB0aGlzLCBhbmQKK3RoZSBhcHBsaWNhdGlvbiB3aWxsIGFsbG93IHRoZW0gdG8gc2V0IGl0LiAgT25lIG1ldGhvZCBvZiBhbGxvd2luZyB0aGUgdXNlcgordG8gc2V0IHRoZSBkaXNwbGF5IGdhbW1hIHNlcGFyYXRlbHkgZm9yIGVhY2ggc3lzdGVtIGlzIHRvIGNoZWNrIGZvciBhCitTQ1JFRU5fR0FNTUEgb3IgRElTUExBWV9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2hpY2ggd2lsbCBob3BlZnVsbHkgYmUKK2NvcnJlY3RseSBzZXQuCisKK05vdGUgdGhhdCBkaXNwbGF5X2dhbW1hIGlzIHRoZSBvdmVyYWxsIGdhbW1hIGNvcnJlY3Rpb24gcmVxdWlyZWQgdG8gcHJvZHVjZQorcGxlYXNpbmcgcmVzdWx0cywgd2hpY2ggZGVwZW5kcyBvbiB0aGUgbGlnaHRpbmcgY29uZGl0aW9ucyBpbiB0aGUgc3Vycm91bmRpbmcKK2Vudmlyb25tZW50LiAgSW4gYSBkaW0gb3IgYnJpZ2h0bHkgbGl0IHJvb20sIG5vIGNvbXBlbnNhdGlvbiBvdGhlciB0aGFuCit0aGUgcGh5c2ljYWwgZ2FtbWEgZXhwb25lbnQgb2YgdGhlIG1vbml0b3IgaXMgbmVlZGVkLCB3aGlsZSBpbiBhIGRhcmsgcm9vbQorYSBzbGlnaHRseSBzbWFsbGVyIGV4cG9uZW50IGlzIGJldHRlci4KKworICAgZG91YmxlIGdhbW1hLCBzY3JlZW5fZ2FtbWE7CisKKyAgIGlmICgvKiBXZSBoYXZlIGEgdXNlci1kZWZpbmVkIHNjcmVlbgorICAgICAgIGdhbW1hIHZhbHVlICovKQorICAgeworICAgICAgc2NyZWVuX2dhbW1hID0gdXNlcl9kZWZpbmVkX3NjcmVlbl9nYW1tYTsKKyAgIH0KKyAgIC8qIE9uZSB3YXkgdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHNoYXJlIHRoZSBzYW1lCisgICAgICBzY3JlZW4gZ2FtbWEgdmFsdWUgKi8KKyAgIGVsc2UgaWYgKChnYW1tYV9zdHIgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKQorICAgICAgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHNjcmVlbl9nYW1tYSA9IChkb3VibGUpYXRvZihnYW1tYV9zdHIpOworICAgfQorICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbm90aGVyIHZhbHVlICovCisgICBlbHNlCisgICB7CisgICAgICBzY3JlZW5fZ2FtbWEgPSAyLjI7IC8qIEEgZ29vZCBndWVzcyBmb3IgYQorICAgICAgICAgICBQQyBtb25pdG9yIGluIGEgYnJpZ2h0IG9mZmljZSBvciBhIGRpbSByb29tICovCisgICAgICBzY3JlZW5fZ2FtbWEgPSAyLjA7IC8qIEEgZ29vZCBndWVzcyBmb3IgYQorICAgICAgICAgICBQQyBtb25pdG9yIGluIGEgZGFyayByb29tICovCisgICAgICBzY3JlZW5fZ2FtbWEgPSAxLjcgb3IgMS4wOyAgLyogQSBnb29kCisgICAgICAgICAgIGd1ZXNzIGZvciBNYWMgc3lzdGVtcyAqLworICAgfQorCitUaGUgcG5nX3NldF9nYW1tYSgpIGZ1bmN0aW9uIGhhbmRsZXMgZ2FtbWEgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBkYXRhLgorUGFzcyBib3RoIHRoZSBmaWxlIGdhbW1hIGFuZCB0aGUgY3VycmVudCBzY3JlZW5fZ2FtbWEuICBJZiB0aGUgZmlsZSBkb2VzCitub3QgaGF2ZSBhIGdhbW1hIHZhbHVlLCB5b3UgY2FuIHBhc3Mgb25lIGFueXdheSBpZiB5b3UgaGF2ZSBhbiBpZGVhIHdoYXQKK2l0IGlzICh1c3VhbGx5IDAuNDU0NTUgaXMgYSBnb29kIGd1ZXNzIGZvciBHSUYgaW1hZ2VzIG9uIFBDcykuICBOb3RlCit0aGF0IGZpbGUgZ2FtbWFzIGFyZSBpbnZlcnRlZCBmcm9tIHNjcmVlbiBnYW1tYXMuICBTZWUgdGhlIGRpc2N1c3Npb25zCitvbiBnYW1tYSBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24gZm9yIGFuIGV4Y2VsbGVudCBkZXNjcmlwdGlvbiBvZiB3aGF0CitnYW1tYSBpcywgYW5kIHdoeSBhbGwgYXBwbGljYXRpb25zIHNob3VsZCBzdXBwb3J0IGl0LiAgSXQgaXMgc3Ryb25nbHkKK3JlY29tbWVuZGVkIHRoYXQgUE5HIHZpZXdlcnMgc3VwcG9ydCBnYW1tYSBjb3JyZWN0aW9uLgorCisgICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpKQorICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIGdhbW1hKTsKKyAgIGVsc2UKKyAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCAwLjQ1NDU1KTsKKworSWYgeW91IG5lZWQgdG8gcmVkdWNlIGFuIFJHQiBmaWxlIHRvIGEgcGFsZXR0ZWQgZmlsZSwgb3IgaWYgYSBwYWxldHRlZAorZmlsZSBoYXMgbW9yZSBlbnRyaWVzIHRoZW4gd2lsbCBmaXQgb24geW91ciBzY3JlZW4sIHBuZ19zZXRfZGl0aGVyKCkKK3dpbGwgZG8gdGhhdC4gIE5vdGUgdGhhdCB0aGlzIGlzIGEgc2ltcGxlIG1hdGNoIGRpdGhlciB0aGF0IG1lcmVseQorZmluZHMgdGhlIGNsb3Nlc3QgY29sb3IgYXZhaWxhYmxlLiAgVGhpcyBzaG91bGQgd29yayBmYWlybHkgd2VsbCB3aXRoCitvcHRpbWl6ZWQgcGFsZXR0ZXMsIGFuZCBmYWlybHkgYmFkbHkgd2l0aCBsaW5lYXIgY29sb3IgY3ViZXMuICBJZiB5b3UKK3Bhc3MgYSBwYWxldHRlIHRoYXQgaXMgbGFyZ2VyIHRoZW4gbWF4aW11bV9jb2xvcnMsIHRoZSBmaWxlIHdpbGwKK3JlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBzbyBpdCB3aWxsIGZpdCBpbnRvCittYXhpbXVtX2NvbG9ycy4gIElmIHRoZXJlIGlzIGEgaGlzdG9ncmFtLCBpdCB3aWxsIHVzZSBpdCB0byBtYWtlCittb3JlIGludGVsbGlnZW50IGNob2ljZXMgd2hlbiByZWR1Y2luZyB0aGUgcGFsZXR0ZS4gIElmIHRoZXJlIGlzIG5vCitoaXN0b2dyYW0sIGl0IG1heSBub3QgZG8gYXMgZ29vZCBhIGpvYi4KKworICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgIHsKKyAgICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICAgUE5HX0lORk9fUExURSkpCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8xNnAgaGlzdG9ncmFtID0gTlVMTDsKKworICAgICAgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICAgICAgJmhpc3RvZ3JhbSk7CisgICAgICAgICBwbmdfc2V0X2RpdGhlcihwbmdfcHRyLCBwYWxldHRlLCBudW1fcGFsZXR0ZSwKKyAgICAgICAgICAgIG1heF9zY3JlZW5fY29sb3JzLCBoaXN0b2dyYW0sIDEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcG5nX2NvbG9yIHN0ZF9jb2xvcl9jdWJlW01BWF9TQ1JFRU5fQ09MT1JTXSA9CisgICAgICAgICAgICB7IC4uLiBjb2xvcnMgLi4uIH07CisKKyAgICAgICAgIHBuZ19zZXRfZGl0aGVyKHBuZ19wdHIsIHN0ZF9jb2xvcl9jdWJlLAorICAgICAgICAgICAgTUFYX1NDUkVFTl9DT0xPUlMsIE1BWF9TQ1JFRU5fQ09MT1JTLAorICAgICAgICAgICAgTlVMTCwwKTsKKyAgICAgIH0KKyAgIH0KKworUE5HIGZpbGVzIGRlc2NyaWJlIG1vbm9jaHJvbWUgYXMgYmxhY2sgYmVpbmcgemVybyBhbmQgd2hpdGUgYmVpbmcgb25lLgorVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV2ZXJzZSB0aGlzIChtYWtlIGJsYWNrIGJlIG9uZSBhbmQgd2hpdGUgYmUKK3plcm8pOgorCisgICBpZiAoYml0X2RlcHRoID09IDEgJiYgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKworVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIGludmVydCBncmF5c2NhbGUgYW5kIGdyYXktYWxwaGEgaW1hZ2VzOgorCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8CisgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7CisKK1BORyBmaWxlcyBzdG9yZSAxNiBiaXQgcGl4ZWxzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAoYmlnLWVuZGlhbiwKK2llLiBtb3N0IHNpZ25pZmljYW50IGJpdHMgZmlyc3QpLiAgVGhpcyBjb2RlIGNoYW5nZXMgdGhlIHN0b3JhZ2UgdG8gdGhlCitvdGhlciB3YXkgKGxpdHRsZS1lbmRpYW4sIGkuZS4gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCwgdGhlCit3YXkgUENzIHN0b3JlIHRoZW0pOgorCisgICAgaWYgKGJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgcG5nX3NldF9zd2FwKHBuZ19wdHIpOworCitJZiB5b3UgYXJlIHVzaW5nIHBhY2tlZC1waXhlbCBpbWFnZXMgKDEsIDIsIG9yIDQgYml0cy9waXhlbCksIGFuZCB5b3UKK25lZWQgdG8gY2hhbmdlIHRoZSBvcmRlciB0aGUgcGl4ZWxzIGFyZSBwYWNrZWQgaW50byBieXRlcywgeW91IGNhbiB1c2U6CisKKyAgICBpZiAoYml0X2RlcHRoIDwgOCkKKyAgICAgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOworCitGaW5hbGx5LCB5b3UgY2FuIHdyaXRlIHlvdXIgb3duIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGlmIG5vbmUgb2YKK3RoZSBleGlzdGluZyBvbmVzIG1lZXRzIHlvdXIgbmVlZHMuICBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyBhIGNhbGxiYWNrCit3aXRoCisKKyAgICBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4ocG5nX3B0ciwKKyAgICAgICByZWFkX3RyYW5zZm9ybV9mbik7CisKK1lvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KKworICAgIHZvaWQgcmVhZF90cmFuc2Zvcm1fZm4ocG5nX3B0ciBwdHIsIHJvd19pbmZvX3B0cgorICAgICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKKworU2VlIHBuZ3Rlc3QuYyBmb3IgYSB3b3JraW5nIGV4YW1wbGUuICBZb3VyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCithZnRlciBhbGwgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorCitZb3UgY2FuIGFsc28gc2V0IHVwIGEgcG9pbnRlciB0byBhIHVzZXIgc3RydWN0dXJlIGZvciB1c2UgYnkgeW91cgorY2FsbGJhY2sgZnVuY3Rpb24sIGFuZCB5b3UgY2FuIGluZm9ybSBsaWJwbmcgdGhhdCB5b3VyIHRyYW5zZm9ybQorZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIG51bWJlciBvZiBjaGFubmVscyBvciBiaXQgZGVwdGggd2l0aCB0aGUKK2Z1bmN0aW9uCisKKyAgICBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8ocG5nX3B0ciwgdXNlcl9wdHIsCisgICAgICAgdXNlcl9kZXB0aCwgdXNlcl9jaGFubmVscyk7CisKK1RoZSB1c2VyJ3MgYXBwbGljYXRpb24sIG5vdCBsaWJwbmcsIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGFuZAorZnJlZWluZyBhbnkgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgdXNlciBzdHJ1Y3R1cmUuCisKK1lvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbgorcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4gIEZvciBleGFtcGxlOgorCisgICAgdm9pZHAgcmVhZF91c2VyX3RyYW5zZm9ybV9wdHIgPQorICAgICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKHBuZ19wdHIpOworCitUaGUgbGFzdCB0aGluZyB0byBoYW5kbGUgaXMgaW50ZXJsYWNpbmc7IHRoaXMgaXMgY292ZXJlZCBpbiBkZXRhaWwgYmVsb3csCitidXQgeW91IG11c3QgY2FsbCB0aGUgZnVuY3Rpb24gaGVyZSBpZiB5b3Ugd2FudCBsaWJwbmcgdG8gaGFuZGxlIGV4cGFuc2lvbgorb2YgdGhlIGludGVybGFjZWQgaW1hZ2UuCisKKyAgICBudW1iZXJfb2ZfcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisKK0FmdGVyIHNldHRpbmcgdGhlIHRyYW5zZm9ybWF0aW9ucywgbGlicG5nIGNhbiB1cGRhdGUgeW91ciBwbmdfaW5mbworc3RydWN0dXJlIHRvIHJlZmxlY3QgYW55IHRyYW5zZm9ybWF0aW9ucyB5b3UndmUgcmVxdWVzdGVkIHdpdGggdGhpcworY2FsbC4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgdG8gdXBkYXRlIHRoZSBpbmZvIHN0cnVjdHVyZSdzIHJvd2J5dGVzCitmaWVsZCBzbyB5b3UgY2FuIHVzZSBpdCB0byBhbGxvY2F0ZSB5b3VyIGltYWdlIG1lbW9yeS4gIFRoaXMgZnVuY3Rpb24KK3dpbGwgYWxzbyB1cGRhdGUgeW91ciBwYWxldHRlIHdpdGggdGhlIGNvcnJlY3Qgc2NyZWVuX2dhbW1hIGFuZAorYmFja2dyb3VuZCBpZiB0aGVzZSBoYXZlIGJlZW4gZ2l2ZW4gd2l0aCB0aGUgY2FsbHMgYWJvdmUuCisKKyAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK0FmdGVyIHlvdSBjYWxsIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCksIHlvdSBjYW4gYWxsb2NhdGUgYW55CittZW1vcnkgeW91IG5lZWQgdG8gaG9sZCB0aGUgaW1hZ2UuICBUaGUgcm93IGRhdGEgaXMgc2ltcGx5CityYXcgYnl0ZSBkYXRhIGZvciBhbGwgZm9ybXMgb2YgaW1hZ2VzLiAgQXMgdGhlIGFjdHVhbCBhbGxvY2F0aW9uCit2YXJpZXMgYW1vbmcgYXBwbGljYXRpb25zLCBubyBleGFtcGxlIHdpbGwgYmUgZ2l2ZW4uICBJZiB5b3UKK2FyZSBhbGxvY2F0aW5nIG9uZSBsYXJnZSBjaHVuaywgeW91IHdpbGwgbmVlZCB0byBidWlsZCBhbgorYXJyYXkgb2YgcG9pbnRlcnMgdG8gZWFjaCByb3csIGFzIGl0IHdpbGwgYmUgbmVlZGVkIGZvciBzb21lCitvZiB0aGUgZnVuY3Rpb25zIGJlbG93LgorCisuU1MgUmVhZGluZyBpbWFnZSBkYXRhCisKK0FmdGVyIHlvdSd2ZSBhbGxvY2F0ZWQgbWVtb3J5LCB5b3UgY2FuIHJlYWQgdGhlIGltYWdlIGRhdGEuCitUaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgaW4gb25lIGZ1bmN0aW9uIGNhbGwuICBJZiB5b3UgYXJlCithbGxvY2F0aW5nIGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgd2hvbGUgaW1hZ2UsIHlvdSBjYW4ganVzdAorY2FsbCBwbmdfcmVhZF9pbWFnZSgpIGFuZCBsaWJwbmcgd2lsbCByZWFkIGluIGFsbCB0aGUgaW1hZ2UgZGF0YQorYW5kIHB1dCBpdCBpbiB0aGUgbWVtb3J5IGFyZWEgc3VwcGxpZWQuICBZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4KK2FuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGVhY2ggcm93LgorCitUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbnRlcmxhY2luZywgc28geW91IGRvbid0IG5lZWQKK3RvIGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBvciBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUKK3RpbWVzLCBvciBhbnkgb2YgdGhhdCBvdGhlciBzdHVmZiBuZWNlc3Nhcnkgd2l0aCBwbmdfcmVhZF9yb3dzKCkuCisKKyAgIHBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7CisKK3doZXJlIHJvd19wb2ludGVycyBpczoKKworICAgcG5nX2J5dGVwIHJvd19wb2ludGVyc1toZWlnaHRdOworCitZb3UgY2FuIHBvaW50IHRvIHZvaWQgb3IgY2hhciBvciB3aGF0ZXZlciB5b3UgdXNlIGZvciBwaXhlbHMuCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHJlYWQgaW4gdGhlIHdob2xlIGltYWdlIGF0IG9uY2UsIHlvdSBjYW4KK3VzZSBwbmdfcmVhZF9yb3dzKCkgaW5zdGVhZC4gIElmIHRoZXJlIGlzIG5vIGludGVybGFjaW5nIChjaGVjaworaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9OT05FKSwgdGhpcyBpcyBzaW1wbGU6CisKKyAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywgTlVMTCwKKyAgICAgICBudW1iZXJfb2Zfcm93cyk7CisKK3doZXJlIHJvd19wb2ludGVycyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgcG5nX3JlYWRfaW1hZ2UoKSBjYWxsLgorCitJZiB5b3UgYXJlIGRvaW5nIHRoaXMganVzdCBvbmUgcm93IGF0IGEgdGltZSwgeW91IGNhbiBkbyB0aGlzIHdpdGgKK2Egc2luZ2xlIHJvd19wb2ludGVyIGluc3RlYWQgb2YgYW4gYXJyYXkgb2Ygcm93X3BvaW50ZXJzOgorCisgICAgcG5nX2J5dGVwIHJvd19wb2ludGVyID0gcm93OworICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCByb3dfcG9pbnRlciwgTlVMTCk7CisKK0lmIHRoZSBmaWxlIGlzIGludGVybGFjZWQgKGludGVybGFjZV90eXBlICE9IDAgaW4gdGhlIElIRFIgY2h1bmspLCB0aGluZ3MKK2dldCBzb21ld2hhdCBoYXJkZXIuICBUaGUgb25seSBjdXJyZW50IChQTkcgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMikKK2ludGVybGFjaW5nIHR5cGUgZm9yIFBORyBpcyAoaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9BREFNNykKK2lzIGEgc29tZXdoYXQgY29tcGxpY2F0ZWQgMkQgaW50ZXJsYWNlIHNjaGVtZSwga25vd24gYXMgQWRhbTcsIHRoYXQKK2JyZWFrcyBkb3duIGFuIGltYWdlIGludG8gc2V2ZW4gc21hbGxlciBpbWFnZXMgb2YgdmFyeWluZyBzaXplLCBiYXNlZAorb24gYW4gOHg4IGdyaWQuCisKK2xpYnBuZyBjYW4gZmlsbCBvdXQgdGhvc2UgaW1hZ2VzIG9yIGl0IGNhbiBnaXZlIHRoZW0gdG8geW91ICJhcyBpcyIuCitJZiB5b3Ugd2FudCB0aGVtIGZpbGxlZCBvdXQsIHRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyB0aGF0LiAgVGhlIG9uZQorbWVudGlvbmVkIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBpcyB0byBleHBhbmQgZWFjaCBwaXhlbCB0byBjb3ZlcgordGhvc2UgcGl4ZWxzIHRoYXQgaGF2ZSBub3QgYmVlbiByZWFkIHlldCAodGhlICJyZWN0YW5nbGUiIG1ldGhvZCkuCitUaGlzIHJlc3VsdHMgaW4gYSBibG9ja3kgaW1hZ2UgZm9yIHRoZSBmaXJzdCBwYXNzLCB3aGljaCBncmFkdWFsbHkKK3Ntb290aHMgb3V0IGFzIG1vcmUgcGl4ZWxzIGFyZSByZWFkLiAgVGhlIG90aGVyIG1ldGhvZCBpcyB0aGUgInNwYXJrbGUiCittZXRob2QsIHdoZXJlIHBpeGVscyBhcmUgZHJhd24gb25seSBpbiB0aGVpciBmaW5hbCBsb2NhdGlvbnMsIHdpdGggdGhlCityZXN0IG9mIHRoZSBpbWFnZSByZW1haW5pbmcgd2hhdGV2ZXIgY29sb3JzIHRoZXkgd2VyZSBpbml0aWFsaXplZCB0bworYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgcmVhZC4gIFRoZSBmaXJzdCBtZXRob2QgdXN1YWxseSBsb29rcyBiZXR0ZXIsCitidXQgdGVuZHMgdG8gYmUgc2xvd2VyLCBhcyB0aGVyZSBhcmUgbW9yZSBwaXhlbHMgdG8gcHV0IGluIHRoZSByb3dzLgorCitJZiB5b3UgZG9uJ3Qgd2FudCBsaWJwbmcgdG8gaGFuZGxlIHRoZSBpbnRlcmxhY2luZyBkZXRhaWxzLCBqdXN0IGNhbGwKK3BuZ19yZWFkX3Jvd3MoKSBzZXZlbiB0aW1lcyB0byByZWFkIGluIGFsbCBzZXZlbiBpbWFnZXMuICBFYWNoIG9mIHRoZQoraW1hZ2VzIGlzIGEgdmFsaWQgaW1hZ2UgYnkgaXRzZWxmLCBvciB0aGV5IGNhbiBhbGwgYmUgY29tYmluZWQgb24gYW4KKzh4OCBncmlkIHRvIGZvcm0gYSBzaW5nbGUgaW1hZ2UgKGFsdGhvdWdoIGlmIHlvdSBpbnRlbmQgdG8gY29tYmluZSB0aGVtCit5b3Ugd291bGQgYmUgZmFyIGJldHRlciBvZmYgdXNpbmcgdGhlIGxpYnBuZyBpbnRlcmxhY2UgaGFuZGxpbmcpLgorCitUaGUgZmlyc3QgcGFzcyB3aWxsIHJldHVybiBhbiBpbWFnZSAxLzggYXMgd2lkZSBhcyB0aGUgZW50aXJlIGltYWdlCisoZXZlcnkgOHRoIGNvbHVtbiBzdGFydGluZyBpbiBjb2x1bW4gMCkgYW5kIDEvOCBhcyBoaWdoIGFzIHRoZSBvcmlnaW5hbAorKGV2ZXJ5IDh0aCByb3cgc3RhcnRpbmcgaW4gcm93IDApLCB0aGUgc2Vjb25kIHdpbGwgYmUgMS84IGFzIHdpZGUKKyhzdGFydGluZyBpbiBjb2x1bW4gNCkgYW5kIDEvOCBhcyBoaWdoIChhbHNvIHN0YXJ0aW5nIGluIHJvdyAwKS4gIFRoZQordGhpcmQgcGFzcyB3aWxsIGJlIDEvNCBhcyB3aWRlIChldmVyeSA0dGggcGl4ZWwgc3RhcnRpbmcgaW4gY29sdW1uIDApIGFuZAorMS84IGFzIGhpZ2ggKGV2ZXJ5IDh0aCByb3cgc3RhcnRpbmcgaW4gcm93IDQpLCBhbmQgdGhlIGZvdXJ0aCBwYXNzIHdpbGwKK2JlIDEvNCBhcyB3aWRlIGFuZCAxLzQgYXMgaGlnaCAoZXZlcnkgNHRoIGNvbHVtbiBzdGFydGluZyBpbiBjb2x1bW4gMiwKK2FuZCBldmVyeSA0dGggcm93IHN0YXJ0aW5nIGluIHJvdyAwKS4gIFRoZSBmaWZ0aCBwYXNzIHdpbGwgcmV0dXJuIGFuCitpbWFnZSAxLzIgYXMgd2lkZSwgYW5kIDEvNCBhcyBoaWdoIChzdGFydGluZyBhdCBjb2x1bW4gMCBhbmQgcm93IDIpLAord2hpbGUgdGhlIHNpeHRoIHBhc3Mgd2lsbCBiZSAxLzIgYXMgd2lkZSBhbmQgMS8yIGFzIGhpZ2ggYXMgdGhlIG9yaWdpbmFsCisoc3RhcnRpbmcgaW4gY29sdW1uIDEgYW5kIHJvdyAwKS4gIFRoZSBzZXZlbnRoIGFuZCBmaW5hbCBwYXNzIHdpbGwgYmUgYXMKK3dpZGUgYXMgdGhlIG9yaWdpbmFsLCBhbmQgMS8yIGFzIGhpZ2gsIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBvZGQKK251bWJlcmVkIHNjYW5saW5lcy4gIFBoZXchCisKK0lmIHlvdSB3YW50IGxpYnBuZyB0byBleHBhbmQgdGhlIGltYWdlcywgY2FsbCB0aGlzIGJlZm9yZSBjYWxsaW5nCitwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIG9yIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCk6CisKKyAgICBpZiAoaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9BREFNNykKKyAgICAgICAgbnVtYmVyX29mX3Bhc3NlcworICAgICAgICAgICA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworCitUaGlzIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFzc2VzIG5lZWRlZC4gIEN1cnJlbnRseSwgdGhpcworaXMgc2V2ZW4sIGJ1dCBtYXkgY2hhbmdlIGlmIGFub3RoZXIgaW50ZXJsYWNlIHR5cGUgaXMgYWRkZWQuCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZXZlbiBpZiB0aGUgZmlsZSBpcyBub3QgaW50ZXJsYWNlZCwKK3doZXJlIGl0IHdpbGwgcmV0dXJuIG9uZSBwYXNzLgorCitJZiB5b3UgYXJlIG5vdCBnb2luZyB0byBkaXNwbGF5IHRoZSBpbWFnZSBhZnRlciBlYWNoIHBhc3MsIGJ1dCBhcmUKK2dvaW5nIHRvIHdhaXQgdW50aWwgdGhlIGVudGlyZSBpbWFnZSBpcyByZWFkIGluLCB1c2UgdGhlIHNwYXJrbGUKK2VmZmVjdC4gIFRoaXMgZWZmZWN0IGlzIGZhc3RlciBhbmQgdGhlIGVuZCByZXN1bHQgb2YgZWl0aGVyIG1ldGhvZAoraXMgZXhhY3RseSB0aGUgc2FtZS4gIElmIHlvdSBhcmUgcGxhbm5pbmcgb24gZGlzcGxheWluZyB0aGUgaW1hZ2UKK2FmdGVyIGVhY2ggcGFzcywgdGhlICJyZWN0YW5nbGUiIGVmZmVjdCBpcyBnZW5lcmFsbHkgY29uc2lkZXJlZCB0aGUKK2JldHRlciBsb29raW5nIG9uZS4KKworSWYgeW91IG9ubHkgd2FudCB0aGUgInNwYXJrbGUiIGVmZmVjdCwganVzdCBjYWxsIHBuZ19yZWFkX3Jvd3MoKSBhcworbm9ybWFsLCB3aXRoIHRoZSB0aGlyZCBwYXJhbWV0ZXIgTlVMTC4gIE1ha2Ugc3VyZSB5b3UgbWFrZSBwYXNzIG92ZXIKK3RoZSBpbWFnZSBudW1iZXJfb2ZfcGFzc2VzIHRpbWVzLCBhbmQgeW91IGRvbid0IGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUKK3Jvd3MgYmV0d2VlbiBjYWxscy4gIFlvdSBjYW4gY2hhbmdlIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGRhdGEsIGp1c3QKK25vdCB0aGUgZGF0YS4gIEVhY2ggcGFzcyBvbmx5IHdyaXRlcyB0aGUgcGl4ZWxzIGFwcHJvcHJpYXRlIGZvciB0aGF0CitwYXNzLCBhbmQgYXNzdW1lcyB0aGUgZGF0YSBmcm9tIHByZXZpb3VzIHBhc3NlcyBpcyBzdGlsbCB2YWxpZC4KKworICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBOVUxMLAorICAgICAgIG51bWJlcl9vZl9yb3dzKTsKKworSWYgeW91IG9ubHkgd2FudCB0aGUgZmlyc3QgZWZmZWN0ICh0aGUgcmVjdGFuZ2xlcyksIGRvIHRoZSBzYW1lIGFzCitiZWZvcmUgZXhjZXB0IHBhc3MgdGhlIHJvdyBidWZmZXIgaW4gdGhlIHRoaXJkIHBhcmFtZXRlciwgYW5kIGxlYXZlCit0aGUgc2Vjb25kIHBhcmFtZXRlciBOVUxMLgorCisgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCBOVUxMLCByb3dfcG9pbnRlcnMsCisgICAgICAgbnVtYmVyX29mX3Jvd3MpOworCisuU1MgRmluaXNoaW5nIGEgc2VxdWVudGlhbCByZWFkCisKK0FmdGVyIHlvdSBhcmUgZmluaXNoZWQgcmVhZGluZyB0aGUgaW1hZ2UgdGhyb3VnaCB0aGUKK2xvdy1sZXZlbCBpbnRlcmZhY2UsIHlvdSBjYW4gZmluaXNoIHJlYWRpbmcgdGhlIGZpbGUuICBJZiB5b3UgYXJlCitpbnRlcmVzdGVkIGluIGNvbW1lbnRzIG9yIHRpbWUsIHdoaWNoIG1heSBiZSBzdG9yZWQgZWl0aGVyIGJlZm9yZSBvcgorYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHlvdSBzaG91bGQgcGFzcyB0aGUgc2VwYXJhdGUgcG5nX2luZm8gc3RydWN0IGlmCit5b3Ugd2FudCB0byBrZWVwIHRoZSBjb21tZW50cyBmcm9tIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGltYWdlCitzZXBhcmF0ZS4gIElmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQsIHlvdSBjYW4gcGFzcyBOVUxMLgorCisgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgZW5kX2luZm8pOworCitXaGVuIHlvdSBhcmUgZG9uZSwgeW91IGNhbiBmcmVlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGxpYnBuZyBsaWtlIHRoaXM6CisKKyAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCisgICAgICAgJmVuZF9pbmZvKTsKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmRpdmlkdWFsbHkgZnJlZSB0aGUgaW5mb19wdHIgbWVtYmVycyB0aGF0Citwb2ludCB0byBsaWJwbmctYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorCisgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgbWFzaywgc2VxKQorICAgIG1hc2sgLSBpZGVudGlmaWVzIGRhdGEgdG8gYmUgZnJlZWQsIGEgbWFzaworICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgorICAgICAgICAgICBtb3JlIG9mCisgICAgICAgICAgICAgUE5HX0ZSRUVfUExURSwgUE5HX0ZSRUVfVFJOUywKKyAgICAgICAgICAgICBQTkdfRlJFRV9ISVNULCBQTkdfRlJFRV9JQ0NQLAorICAgICAgICAgICAgIFBOR19GUkVFX1BDQUwsIFBOR19GUkVFX1JPV1MsCisgICAgICAgICAgICAgUE5HX0ZSRUVfU0NBTCwgUE5HX0ZSRUVfU1BMVCwKKyAgICAgICAgICAgICBQTkdfRlJFRV9URVhULCBQTkdfRlJFRV9VTktOLAorICAgICAgICAgICBvciBzaW1wbHkgUE5HX0ZSRUVfQUxMCisgICAgc2VxICAtIHNlcXVlbmNlIG51bWJlciBvZiBpdGVtIHRvIGJlIGZyZWVkCisgICAgICAgICAgICgtMSBmb3IgYWxsIGl0ZW1zKQorCitUaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIHdoZW4gdGhlIHJlbGV2YW50IHN0b3JhZ2UgaGFzCithbHJlYWR5IGJlZW4gZnJlZWQsIG9yIGhhcyBub3QgeWV0IGJlZW4gYWxsb2NhdGVkLCBvciB3YXMgYWxsb2NhdGVkCitieSB0aGUgdXNlciBhbmQgbm90IGJ5IGxpYnBuZywgIGFuZCB3aWxsIGluIHRob3NlIGNhc2VzIGRvIG5vdGhpbmcuCitUaGUgInNlcSIgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaWYgb25seSBvbmUgaXRlbSBvZiB0aGUgc2VsZWN0ZWQgZGF0YQordHlwZSwgc3VjaCBhcyBQTFRFLCBpcyBhbGxvd2VkLiAgSWYgInNlcSIgaXMgbm90IC0xLCBhbmQgbXVsdGlwbGUgaXRlbXMKK2FyZSBhbGxvd2VkIGZvciB0aGUgZGF0YSB0eXBlIGlkZW50aWZpZWQgaW4gdGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvcgorc1BMVCwgb25seSB0aGUgbid0aCBpdGVtIGluIHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCisKK1RoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG9ubHkgdG8gZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBpbnRlcm5hbGx5CitieSBsaWJwbmcuICBUaGlzIGNhbiBiZSBjaGFuZ2VkLCBzbyB0aGF0IGxpYnBuZyB3aWxsIG5vdCBmcmVlIHRoZSBkYXRhLAorb3Igc28gdGhhdCBpdCB3aWxsIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgd2l0aCBwbmdfbWFsbG9jKCkKK29yIHBuZ196YWxsb2MoKSBhbmQgcGFzc2VkIGluIHZpYSBhIHBuZ19zZXRfKigpIGZ1bmN0aW9uLCB3aXRoCisKKyAgICBwbmdfZGF0YV9mcmVlcihwbmdfcHRyLCBpbmZvX3B0ciwgZnJlZXIsIG1hc2spCisgICAgbWFzayAgIC0gd2hpY2ggZGF0YSBlbGVtZW50cyBhcmUgYWZmZWN0ZWQKKyAgICAgICAgICAgICBzYW1lIGNob2ljZXMgYXMgaW4gcG5nX2ZyZWVfZGF0YSgpCisgICAgZnJlZXIgIC0gb25lIG9mCisgICAgICAgICAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQQorICAgICAgICAgICAgICAgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQQorICAgICAgICAgICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEKKworVGhpcyBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgorWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgcmVhZGluZyB0aGUgUE5HIGRhdGEgYnV0IGJlZm9yZSBjYWxsaW5nCithbnkgcG5nX3NldF8qKCkgZnVuY3Rpb25zLCB0byBjb250cm9sIHdoZXRoZXIgdGhlIHVzZXIgb3IgdGhlIHBuZ19zZXRfKigpCitmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBhbnkgZXhpc3RpbmcgZGF0YSB0aGF0IG1pZ2h0IGJlIHByZXNlbnQsCithbmQgYWdhaW4gYWZ0ZXIgdGhlIHBuZ19zZXRfKigpIGZ1bmN0aW9ucyB0byBjb250cm9sIHdoZXRoZXIgdGhlIHVzZXIKK29yIHBuZ19kZXN0cm95XyooKSBpcyBzdXBwb3NlZCB0byBmcmVlIHRoZSBkYXRhLiAgV2hlbiB0aGUgdXNlciBhc3N1bWVzCityZXNwb25zaWJpbGl0eSBmb3IgbGlicG5nLWFsbG9jYXRlZCBkYXRhLCB0aGUgYXBwbGljYXRpb24gbXVzdCB1c2UKK3BuZ19mcmVlKCkgdG8gZnJlZSBpdCwgYW5kIHdoZW4gdGhlIHVzZXIgdHJhbnNmZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGxpYnBuZworZm9yIGRhdGEgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkLCB0aGUgdXNlciBtdXN0IGhhdmUgdXNlZCBwbmdfbWFsbG9jKCkKK29yIHBuZ196YWxsb2MoKSB0byBhbGxvY2F0ZSBpdC4KKworSWYgeW91IGFsbG9jYXRlZCB5b3VyIHJvd19wb2ludGVycyBpbiBhIHNpbmdsZSBibG9jaywgYXMgc3VnZ2VzdGVkIGFib3ZlIGluCit0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGhpZ2ggbGV2ZWwgcmVhZCBpbnRlcmZhY2UsIHlvdSBtdXN0IG5vdCB0cmFuc2ZlcgorcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgaXQgdG8gdGhlIHBuZ19zZXRfcm93cyBvciBwbmdfcmVhZF9kZXN0cm95IGZ1bmN0aW9uLAorYmVjYXVzZSB0aGV5IHdvdWxkIGFsc28gdHJ5IHRvIGZyZWUgdGhlIGluZGl2aWR1YWwgcm93X3BvaW50ZXJzW2ldLgorCitJZiB5b3UgYWxsb2NhdGVkIHRleHRfcHRyLnRleHQsIHRleHRfcHRyLmxhbmcsIGFuZCB0ZXh0X3B0ci50cmFuc2xhdGVkX2tleXdvcmQKK3NlcGFyYXRlbHksIGRvIG5vdCB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0ZXh0X3B0ciB0byBsaWJwbmcsCitiZWNhdXNlIHdoZW4gbGlicG5nIGZpbGxzIGEgcG5nX3RleHQgc3RydWN0dXJlIGl0IGNvbWJpbmVzIHRoZXNlIG1lbWJlcnMgd2l0aAordGhlIGtleSBtZW1iZXIsIGFuZCBwbmdfZnJlZV9kYXRhKCkgd2lsbCBmcmVlIG9ubHkgdGV4dF9wdHIua2V5LiAgU2ltaWxhcmx5LAoraWYgeW91IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlJ2luZyB0ZXh0X3B0ciBmcm9tIGxpYnBuZyB0byB5b3VyCithcHBsaWNhdGlvbiwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IG5vdCBzZXBhcmF0ZWx5IGZyZWUgdGhvc2UgbWVtYmVycy4KKworVGhlIHBuZ19mcmVlX2RhdGEoKSBmdW5jdGlvbiB3aWxsIHR1cm4gb2ZmIHRoZSAidmFsaWQiIGZsYWcgZm9yIGFueXRoaW5nCitpdCBmcmVlcy4gIElmIHlvdSBuZWVkIHRvIHR1cm4gdGhlIGZsYWcgb2ZmIGZvciBhIGNodW5rIHRoYXQgd2FzIGZyZWVkIGJ5Cit5b3VyIGFwcGxpY2F0aW9uIGluc3RlYWQgb2YgYnkgbGlicG5nLCB5b3UgY2FuIHVzZQorCisgICAgcG5nX3NldF9pbnZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBtYXNrKTsKKyAgICBtYXNrIC0gaWRlbnRpZmllcyB0aGUgY2h1bmtzIHRvIGJlIG1hZGUgaW52YWxpZCwKKyAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKKyAgICAgICAgICAgbW9yZSBvZgorICAgICAgICAgICAgIFBOR19JTkZPX2dBTUEsIFBOR19JTkZPX3NCSVQsCisgICAgICAgICAgICAgUE5HX0lORk9fY0hSTSwgUE5HX0lORk9fUExURSwKKyAgICAgICAgICAgICBQTkdfSU5GT190Uk5TLCBQTkdfSU5GT19iS0dELAorICAgICAgICAgICAgIFBOR19JTkZPX2hJU1QsIFBOR19JTkZPX3BIWXMsCisgICAgICAgICAgICAgUE5HX0lORk9fb0ZGcywgUE5HX0lORk9fdElNRSwKKyAgICAgICAgICAgICBQTkdfSU5GT19wQ0FMLCBQTkdfSU5GT19zUkdCLAorICAgICAgICAgICAgIFBOR19JTkZPX2lDQ1AsIFBOR19JTkZPX3NQTFQsCisgICAgICAgICAgICAgUE5HX0lORk9fc0NBTCwgUE5HX0lORk9fSURBVAorCitGb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiByZWFkaW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgorCisuU1MgUmVhZGluZyBQTkcgZmlsZXMgcHJvZ3Jlc3NpdmVseQorCitUaGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0aGVuIHRoZSBub24tcHJvZ3Jlc3NpdmUKK3JlYWRlci4gIEluc3RlYWQgb2YgY2FsbGluZyBwbmdfcmVhZF9pbmZvKCksIHBuZ19yZWFkX3Jvd3MoKSwgYW5kCitwbmdfcmVhZF9lbmQoKSwgeW91IG1ha2Ugb25lIGNhbGwgdG8gcG5nX3Byb2Nlc3NfZGF0YSgpLCB3aGljaCBjYWxscworY2FsbGJhY2tzIHdoZW4gaXQgaGFzIHRoZSBpbmZvLCBhIHJvdywgb3IgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICBZb3UKK3NldCB1cCB0aGVzZSBjYWxsYmFja3Mgd2l0aCBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4gIFlvdSBkb24ndAoraGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucyBvZiBsaWJwbmcsIGFzIHlvdSBhcmUKK2dpdmluZyB0aGUgbGlicmFyeSB0aGUgZGF0YSBkaXJlY3RseSBpbiBwbmdfcHJvY2Vzc19kYXRhKCkuICBJIHdpbGwKK2Fzc3VtZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIHNlY3Rpb24gb24gcmVhZGluZyBQTkcgZmlsZXMgYWJvdmUsCitzbyBJIHdpbGwgb25seSBoaWdobGlnaHQgdGhlIGRpZmZlcmVuY2VzIChhbHRob3VnaCBJIHdpbGwgc2hvdworYWxsIG9mIHRoZSBjb2RlKS4KKworcG5nX3N0cnVjdHAgcG5nX3B0cjsKK3BuZ19pbmZvcCBpbmZvX3B0cjsKKworIC8qICBBbiBleGFtcGxlIGNvZGUgZnJhZ21lbnQgb2YgaG93IHlvdSB3b3VsZAorICAgICBpbml0aWFsaXplIHRoZSBwcm9ncmVzc2l2ZSByZWFkZXIgaW4geW91cgorICAgICBhcHBsaWNhdGlvbi4gKi8KKyBpbnQKKyBpbml0aWFsaXplX3BuZ19yZWFkZXIoKQorIHsKKyAgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAorICAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAorICAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKKyAgICBpZiAoIXBuZ19wdHIpCisgICAgICAgIHJldHVybiAoRVJST1IpOworICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKyAgICBpZiAoIWluZm9fcHRyKQorICAgIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsIChwbmdfaW5mb3BwKU5VTEwsCisgICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOworICAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKKyAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQorICAgIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworICAgIC8qIFRoaXMgb25lJ3MgbmV3LiAgWW91IGNhbiBwcm92aWRlIGZ1bmN0aW9ucworICAgICAgIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBoZWFkZXIgaW5mbyBpcyB2YWxpZCwKKyAgICAgICB3aGVuIGVhY2ggcm93IGlzIGNvbXBsZXRlZCwgYW5kIHdoZW4gdGhlIGltYWdlCisgICAgICAgaXMgZmluaXNoZWQuICBJZiB5b3UgYXJlbid0IHVzaW5nIGFsbCBmdW5jdGlvbnMsCisgICAgICAgeW91IGNhbiBzcGVjaWZ5IE5VTEwgcGFyYW1ldGVycy4gIEV2ZW4gd2hlbiBhbGwKKyAgICAgICB0aHJlZSBmdW5jdGlvbnMgYXJlIE5VTEwsIHlvdSBuZWVkIHRvIGNhbGwKKyAgICAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4gIFlvdSBjYW4gdXNlCisgICAgICAgYW55IHN0cnVjdCBhcyB0aGUgdXNlcl9wdHIgKGNhc3QgdG8gYSB2b2lkIHBvaW50ZXIKKyAgICAgICBmb3IgdGhlIGZ1bmN0aW9uIGNhbGwpLCBhbmQgcmV0cmlldmUgdGhlIHBvaW50ZXIKKyAgICAgICBmcm9tIGluc2lkZSB0aGUgY2FsbGJhY2tzIHVzaW5nIHRoZSBmdW5jdGlvbgorCisgICAgICAgICAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7CisKKyAgICAgICB3aGljaCB3aWxsIHJldHVybiBhIHZvaWQgcG9pbnRlciwgd2hpY2ggeW91IGhhdmUKKyAgICAgICB0byBjYXN0IGFwcHJvcHJpYXRlbHkuCisgICAgICovCisgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBuZ19wdHIsICh2b2lkICopdXNlcl9wdHIsCisgICAgICAgIGluZm9fY2FsbGJhY2ssIHJvd19jYWxsYmFjaywgZW5kX2NhbGxiYWNrKTsKKworICAgIHJldHVybiAwOworIH0KKworIC8qIEEgY29kZSBmcmFnbWVudCB0aGF0IHlvdSBjYWxsIGFzIHlvdSByZWNlaXZlIGJsb2NrcworICAgb2YgZGF0YSAqLworIGludAorIHByb2Nlc3NfZGF0YShwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfdWludF8zMiBsZW5ndGgpCisgeworICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCisgICAgeworICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAorICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCisgICAgLyogVGhpcyBvbmUncyBuZXcgYWxzby4gIFNpbXBseSBnaXZlIGl0IGEgY2h1bmsKKyAgICAgICBvZiBkYXRhIGZyb20gdGhlIGZpbGUgc3RyZWFtIChpbiBvcmRlciwgb2YKKyAgICAgICBjb3Vyc2UpLiAgT24gbWFjaGluZXMgd2l0aCBzZWdtZW50ZWQgbWVtb3J5CisgICAgICAgbW9kZWxzIG1hY2hpbmVzLCBkb24ndCBnaXZlIGl0IGFueSBtb3JlIHRoYW4KKyAgICAgICA2NEsuICBUaGUgbGlicmFyeSBzZWVtcyB0byBydW4gZmluZSB3aXRoIHNpemVzCisgICAgICAgb2YgNEsuIEFsdGhvdWdoIHlvdSBjYW4gZ2l2ZSBpdCBtdWNoIGxlc3MgaWYKKyAgICAgICBuZWNlc3NhcnkgKEkgYXNzdW1lIHlvdSBjYW4gZ2l2ZSBpdCBjaHVua3Mgb2YKKyAgICAgICAxIGJ5dGUsIEkgaGF2ZW4ndCB0cmllZCBsZXNzIHRoZW4gMjU2IGJ5dGVzCisgICAgICAgeWV0KS4gIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLCB5b3UgbWF5CisgICAgICAgd2FudCB0byBkaXNwbGF5IGFueSByb3dzIHRoYXQgd2VyZSBnZW5lcmF0ZWQKKyAgICAgICBpbiB0aGUgcm93IGNhbGxiYWNrIGlmIHlvdSBkb24ndCBhbHJlYWR5IGRvCisgICAgICAgc28gdGhlcmUuCisgICAgICovCisgICAgcG5nX3Byb2Nlc3NfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgYnVmZmVyLCBsZW5ndGgpOworICAgIHJldHVybiAwOworIH0KKworIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIChhcyBzZXQgYnkKKyAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKSBhYm92ZSkgd2hlbiBlbm91Z2ggZGF0YQorICAgIGhhcyBiZWVuIHN1cHBsaWVkIHNvIGFsbCBvZiB0aGUgaGVhZGVyIGhhcyBiZWVuCisgICAgcmVhZC4KKyAqLworIHZvaWQKKyBpbmZvX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvKQorIHsKKyAgICAvKiBEbyBhbnkgc2V0dXAgaGVyZSwgaW5jbHVkaW5nIHNldHRpbmcgYW55IG9mCisgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9ucyBtZW50aW9uZWQgaW4gdGhlIFJlYWRpbmcKKyAgICAgICBQTkcgZmlsZXMgc2VjdGlvbi4gIEZvciBub3csIHlvdSBfbXVzdF8gY2FsbAorICAgICAgIGVpdGhlciBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIG9yCisgICAgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBhZnRlciBhbGwgdGhlCisgICAgICAgdHJhbnNmb3JtYXRpb25zIGFyZSBzZXQgKGV2ZW4gaWYgeW91IGRvbid0IHNldAorICAgICAgIGFueSkuICBZb3UgbWF5IHN0YXJ0IGdldHRpbmcgcm93cyBiZWZvcmUKKyAgICAgICBwbmdfcHJvY2Vzc19kYXRhKCkgcmV0dXJucywgc28gdGhpcyBpcyB5b3VyCisgICAgICAgbGFzdCBjaGFuY2UgdG8gcHJlcGFyZSBmb3IgdGhhdC4KKyAgICAgKi8KKyB9CisKKyAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGVhY2ggcm93IG9mIGltYWdlCisgICAgZGF0YSBpcyBjb21wbGV0ZSAqLworIHZvaWQKKyByb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG5ld19yb3csCisgICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpCisgeworICAgIC8qIElmIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkLCBhbmQgeW91IHR1cm5lZAorICAgICAgIG9uIHRoZSBpbnRlcmxhY2UgaGFuZGxlciwgdGhpcyBmdW5jdGlvbiB3aWxsCisgICAgICAgYmUgY2FsbGVkIGZvciBldmVyeSByb3cgaW4gZXZlcnkgcGFzcy4gIFNvbWUKKyAgICAgICBvZiB0aGVzZSByb3dzIHdpbGwgbm90IGJlIGNoYW5nZWQgZnJvbSB0aGUKKyAgICAgICBwcmV2aW91cyBwYXNzLiAgV2hlbiB0aGUgcm93IGlzIG5vdCBjaGFuZ2VkLAorICAgICAgIHRoZSBuZXdfcm93IHZhcmlhYmxlIHdpbGwgYmUgTlVMTC4gIFRoZSByb3dzCisgICAgICAgYW5kIHBhc3NlcyBhcmUgY2FsbGVkIGluIG9yZGVyLCBzbyB5b3UgZG9uJ3QKKyAgICAgICByZWFsbHkgbmVlZCB0aGUgcm93X251bSBhbmQgcGFzcywgYnV0IEknbQorICAgICAgIHN1cHBseWluZyB0aGVtIGJlY2F1c2UgaXQgbWF5IG1ha2UgeW91ciBsaWZlCisgICAgICAgZWFzaWVyLgorCisgICAgICAgRm9yIHRoZSBub24tTlVMTCByb3dzIG9mIGludGVybGFjZWQgaW1hZ2VzLAorICAgICAgIHlvdSBtdXN0IGNhbGwgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KCkKKyAgICAgICBwYXNzaW5nIGluIHRoZSByb3cgYW5kIHRoZSBvbGQgcm93LiAgWW91IGNhbgorICAgICAgIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgTlVMTCByb3dzIChpdCB3aWxsIGp1c3QKKyAgICAgICByZXR1cm4pIGFuZCBmb3Igbm9uLWludGVybGFjZWQgaW1hZ2VzIChpdCBqdXN0CisgICAgICAgZG9lcyB0aGUgbWVtY3B5IGZvciB5b3UpIGlmIGl0IHdpbGwgbWFrZSB0aGUKKyAgICAgICBjb2RlIGVhc2llci4gIFRodXMsIHlvdSBjYW4ganVzdCBkbyB0aGlzIGZvcgorICAgICAgIGFsbCBjYXNlczoKKyAgICAgKi8KKworICAgICAgICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cocG5nX3B0ciwgb2xkX3JvdywKKyAgICAgICAgICBuZXdfcm93KTsKKworICAgIC8qIHdoZXJlIG9sZF9yb3cgaXMgd2hhdCB3YXMgZGlzcGxheWVkIGZvcgorICAgICAgIHByZXZpb3VzbHkgZm9yIHRoZSByb3cuICBOb3RlIHRoYXQgdGhlIGZpcnN0CisgICAgICAgcGFzcyAocGFzcyA9PSAwLCByZWFsbHkpIHdpbGwgY29tcGxldGVseSBjb3ZlcgorICAgICAgIHRoZSBvbGQgcm93LCBzbyB0aGUgcm93cyBkbyBub3QgaGF2ZSB0byBiZQorICAgICAgIGluaXRpYWxpemVkLiAgQWZ0ZXIgdGhlIGZpcnN0IHBhc3MgKGFuZCBvbmx5CisgICAgICAgZm9yIGludGVybGFjZWQgaW1hZ2VzKSwgeW91IHdpbGwgaGF2ZSB0byBwYXNzCisgICAgICAgdGhlIGN1cnJlbnQgcm93LCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgY29tYmluZQorICAgICAgIHRoZSBvbGQgcm93IGFuZCB0aGUgbmV3IHJvdy4KKyAgICAqLworIH0KKworIHZvaWQKKyBlbmRfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCisgeworICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSB3aG9sZSBpbWFnZQorICAgICAgIGhhcyBiZWVuIHJlYWQsIGluY2x1ZGluZyBhbnkgY2h1bmtzIGFmdGVyIHRoZQorICAgICAgIGltYWdlICh1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBJRU5EKS4gIFlvdQorICAgICAgIHdpbGwgdXN1YWxseSBoYXZlIHRoZSBzYW1lIGluZm8gY2h1bmsgYXMgeW91CisgICAgICAgaGFkIGluIHRoZSBoZWFkZXIsIGFsdGhvdWdoIHNvbWUgZGF0YSBtYXkgaGF2ZQorICAgICAgIGJlZW4gYWRkZWQgdG8gdGhlIGNvbW1lbnRzIGFuZCB0aW1lIGZpZWxkcy4KKworICAgICAgIE1vc3QgcGVvcGxlIHdvbid0IGRvIG11Y2ggaGVyZSwgcGVyaGFwcyBzZXR0aW5nCisgICAgICAgYSBmbGFnIHRoYXQgbWFya3MgdGhlIGltYWdlIGFzIGZpbmlzaGVkLgorICAgICAqLworIH0KKworCisKKy5TSCBJVi4gV3JpdGluZworCitNdWNoIG9mIHRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHJlYWRpbmcuICBIb3dldmVyLCBldmVyeXRoaW5nIG9mCitpbXBvcnRhbmNlIGlzIHJlcGVhdGVkIGhlcmUsIHNvIHlvdSB3b24ndCBoYXZlIHRvIGNvbnN0YW50bHkgbG9vaworYmFjayB1cCBpbiB0aGUgcmVhZGluZyBzZWN0aW9uIHRvIHVuZGVyc3RhbmQgd3JpdGluZy4KKworLlNTIFNldHVwCisKK1lvdSB3aWxsIHdhbnQgdG8gZG8gdGhlIEkvTyBpbml0aWFsaXphdGlvbiBiZWZvcmUgeW91IGdldCBpbnRvIGxpYnBuZywKK3NvIGlmIGl0IGRvZXNuJ3Qgd29yaywgeW91IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gdW5kby4gSWYgeW91IGFyZSBub3QKK3VzaW5nIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkIHRvIHJlcGxhY2UgdGhlbSB3aXRoCitjdXN0b20gd3JpdGluZyBmdW5jdGlvbnMuICBTZWUgdGhlIGRpc2N1c3Npb24gdW5kZXIgQ3VzdG9taXppbmcgbGlicG5nLgorCisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlX25hbWUsICJ3YiIpOworICAgIGlmICghZnApCisgICAgeworICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworTmV4dCwgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLgorQXMgdGhlc2UgY2FuIGJlIGJvdGggcmVsYXRpdmVseSBsYXJnZSwgeW91IG1heSBub3Qgd2FudCB0byBzdG9yZSB0aGVzZQorb24gdGhlIHN0YWNrLCB1bmxlc3MgeW91IGhhdmUgc3RhY2sgc3BhY2UgdG8gc3BhcmUuICBPZiBjb3Vyc2UsIHlvdQord2lsbCB3YW50IHRvIGNoZWNrIGlmIHRoZXkgcmV0dXJuIE5VTEwuICBJZiB5b3UgYXJlIGFsc28gcmVhZGluZywKK3lvdSB3b24ndCB3YW50IHRvIG5hbWUgeW91ciByZWFkIHN0cnVjdHVyZSBhbmQgeW91ciB3cml0ZSBzdHJ1Y3R1cmUKK2JvdGggInBuZ19wdHIiOyB5b3UgY2FuIGNhbGwgdGhlbSBhbnl0aGluZyB5b3UgbGlrZSwgc3VjaCBhcworInJlYWRfcHRyIiBhbmQgIndyaXRlX3B0ciIuICBMb29rIGF0IHBuZ3Rlc3QuYywgZm9yIGV4YW1wbGUuCisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QKKyAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAorICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOworICAgIGlmICghcG5nX3B0cikKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKworICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICAgaWYgKCFpbmZvX3B0cikKKyAgICB7CisgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLAorICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCitJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBvd24gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMsCitkZWZpbmUgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCBhbmQgdXNlCitwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpOgorCisgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIKKyAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAorICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4sIChwbmdfdm9pZHApCisgICAgICAgIHVzZXJfbWVtX3B0ciwgdXNlcl9tYWxsb2NfZm4sIHVzZXJfZnJlZV9mbik7CisKK0FmdGVyIHlvdSBoYXZlIHRoZXNlIHN0cnVjdHVyZXMsIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHVwIHRoZQorZXJyb3IgaGFuZGxpbmcuICBXaGVuIGxpYnBuZyBlbmNvdW50ZXJzIGFuIGVycm9yLCBpdCBleHBlY3RzIHRvCitsb25nam1wKCkgYmFjayB0byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbAorc2V0am1wKCkgYW5kIHBhc3MgdGhlIHBuZ19qbXBidWYocG5nX3B0cikuICBJZiB5b3UKK3dyaXRlIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50IHJvdXRpbmVzLCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZQordGhlIHBuZ19qbXBidWYocG5nX3B0cikgZXZlcnkgdGltZSB5b3UgZW50ZXIgYSBuZXcgcm91dGluZSB0aGF0IHdpbGwKK2NhbGwgYSBwbmdfKigpIGZ1bmN0aW9uLiAgU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcAorZm9yIHlvdXIgY29tcGlsZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUKK3RoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBlcnJvciBoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nCitzZWN0aW9uIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuCisKKyAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQorICAgIHsKKyAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisgICAgLi4uCisgICAgcmV0dXJuOworCitJZiB5b3Ugd291bGQgcmF0aGVyIGF2b2lkIHRoZSBjb21wbGV4aXR5IG9mIHNldGptcC9sb25nam1wIGlzc3VlcywKK3lvdSBjYW4gY29tcGlsZSBsaWJwbmcgd2l0aCBQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQsIGluIHdoaWNoIGNhc2UKK2Vycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KKworTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgb3V0cHV0IGNvZGUuICBUaGUgZGVmYXVsdCBmb3IgbGlicG5nIGlzIHRvCit1c2UgdGhlIEMgZnVuY3Rpb24gZndyaXRlKCkuICBJZiB5b3UgdXNlIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcGFzcyBhCit2YWxpZCBGSUxFICogaW4gdGhlIGZ1bmN0aW9uIHBuZ19pbml0X2lvKCkuICBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMKK29wZW5lZCBpbiBiaW5hcnkgbW9kZS4gIEFnYWluLCBpZiB5b3Ugd2lzaCB0byBoYW5kbGUgd3JpdGluZyBkYXRhIGluCithbm90aGVyIHdheSwgc2VlIHRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBJL08gaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nCitMaWJwbmcgc2VjdGlvbiBiZWxvdy4KKworICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKKworSWYgeW91IGFyZSBlbWJlZGRpbmcgeW91ciBQTkcgaW50byBhIGRhdGFzdHJlYW0gc3VjaCBhcyBNTkcsIGFuZCBkb24ndAord2FudCBsaWJwbmcgdG8gd3JpdGUgdGhlIDgtYnl0ZSBzaWduYXR1cmUsIG9yIGlmIHlvdSBoYXZlIGFscmVhZHkKK3dyaXR0ZW4gdGhlIHNpZ25hdHVyZSBpbiB5b3VyIGFwcGxpY2F0aW9uLCB1c2UKKworICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIDgpOworCit0byBpbmZvcm0gbGlicG5nIHRoYXQgaXQgc2hvdWxkIG5vdCB3cml0ZSBhIHNpZ25hdHVyZS4KKworLlNTIFdyaXRlIGNhbGxiYWNrcworCitBdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQorY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHdyaXR0ZW4sIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKK2EgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCitZb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgorCisgICAgdm9pZCB3cml0ZV9yb3dfY2FsbGJhY2socG5nX3B0ciwgcG5nX3VpbnRfMzIgcm93LAorICAgICAgIGludCBwYXNzKTsKKyAgICB7CisgICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUgKi8KKyAgICB9CisKKyhZb3UgY2FuIGdpdmUgaXQgYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZiAid3JpdGVfcm93X2NhbGxiYWNrIikKKworVG8gaW5mb3JtIGxpYnBuZyBhYm91dCB5b3VyIGZ1bmN0aW9uLCB1c2UKKworICAgIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuKHBuZ19wdHIsIHdyaXRlX3Jvd19jYWxsYmFjayk7CisKK1lvdSBub3cgaGF2ZSB0aGUgb3B0aW9uIG9mIG1vZGlmeWluZyBob3cgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbAorcnVuLiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG1haW5seSBmb3IgdGVzdGluZywgYnV0IG1heSBiZSB1c2VmdWwKK2luIHNvbWUgY2FzZXMsIGxpa2UgaWYgeW91IG5lZWQgdG8gd3JpdGUgUE5HIGZpbGVzIGV4dHJlbWVseSBmYXN0IGFuZAorYXJlIHdpbGxpbmcgdG8gZ2l2ZSB1cCBzb21lIGNvbXByZXNzaW9uLCBvciBpZiB5b3Ugd2FudCB0byBnZXQgdGhlCittYXhpbXVtIHBvc3NpYmxlIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIHNsb3dlciB3cml0aW5nLiAgSWYgeW91CitoYXZlIG5vIHNwZWNpYWwgbmVlZHMgaW4gdGhpcyBhcmVhLCBsZXQgdGhlIGxpYnJhcnkgZG8gd2hhdCBpdCB3YW50cyBieQorbm90IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhdCBhbGwsIGFzIGl0IGhhcyBiZWVuIHR1bmVkIHRvIGRlbGl2ZXIgYSBnb29kCitzcGVlZC9jb21wcmVzc2lvbiByYXRpby4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gcG5nX3NldF9maWx0ZXIoKSBpcwordGhlIGZpbHRlciBtZXRob2QsIGZvciB3aGljaCB0aGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlIDAgKGFzIG9mIHRoZQorSnVseSAxOTk5IFBORyBzcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDEuMikgb3IgNjQgKGlmIHlvdSBhcmUgd3JpdGluZworYSBQTkcgZGF0YXN0cmVhbSB0aGF0IGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0pLiAgVGhlIHRoaXJkCitwYXJhbWV0ZXIgaXMgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGZpbHRlciB0eXBlKHMpIGFyZSB0byBiZSB0ZXN0ZWQKK2ZvciBlYWNoIHNjYW5saW5lLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgc3BlY2lmaWMKK2ZpbHRlciB0eXBlcy4KKworCisgICAgLyogdHVybiBvbiBvciBvZmYgZmlsdGVyaW5nLCBhbmQvb3IgY2hvb3NlCisgICAgICAgc3BlY2lmaWMgZmlsdGVycy4gIFlvdSBjYW4gdXNlIGVpdGhlciBhIHNpbmdsZQorICAgICAgIFBOR19GSUxURVJfVkFMVUVfTkFNRSBvciB0aGUgYml0d2lzZSBPUiBvZiBvbmUKKyAgICAgICBvciBtb3JlIFBOR19GSUxURVJfTkFNRSBtYXNrcy4gKi8KKyAgICBwbmdfc2V0X2ZpbHRlcihwbmdfcHRyLCAwLAorICAgICAgIFBOR19GSUxURVJfTk9ORSAgfCBQTkdfRklMVEVSX1ZBTFVFX05PTkUgfAorICAgICAgIFBOR19GSUxURVJfU1VCICAgfCBQTkdfRklMVEVSX1ZBTFVFX1NVQiAgfAorICAgICAgIFBOR19GSUxURVJfVVAgICAgfCBQTkdfRklMVEVSX1ZBTFVFX1VQICAgfAorICAgICAgIFBOR19GSUxURVJfQVZHICAgfCBQTkdfRklMVEVSX1ZBTFVFX0FWRyAgfAorICAgICAgIFBOR19GSUxURVJfUEFFVEggfCBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIfAorICAgICAgIFBOR19BTExfRklMVEVSUyk7CisKK0lmIGFuIGFwcGxpY2F0aW9uCit3YW50cyB0byBzdGFydCBhbmQgc3RvcCB1c2luZyBwYXJ0aWN1bGFyIGZpbHRlcnMgZHVyaW5nIGNvbXByZXNzaW9uLAoraXQgc2hvdWxkIHN0YXJ0IG91dCB3aXRoIGFsbCBvZiB0aGUgZmlsdGVycyAodG8gZW5zdXJlIHRoYXQgdGhlIHByZXZpb3VzCityb3cgb2YgcGl4ZWxzIHdpbGwgYmUgc3RvcmVkIGluIGNhc2UgaXQncyBuZWVkZWQgbGF0ZXIpLCBhbmQgdGhlbiBhZGQKK2FuZCByZW1vdmUgdGhlbSBhZnRlciB0aGUgc3RhcnQgb2YgY29tcHJlc3Npb24uCisKK0lmIHlvdSBhcmUgd3JpdGluZyBhIFBORyBkYXRhc3RyZWFtIHRoYXQgaXMgdG8gYmUgZW1iZWRkZWQgaW4gYSBNTkcKK2RhdGFzdHJlYW0sIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbiBiZSBlaXRoZXIgMCBvciA2NC4KKworVGhlIHBuZ19zZXRfY29tcHJlc3Npb25fKigpIGZ1bmN0aW9ucyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgY29tcHJlc3Npb24KK2xpYnJhcnksIGFuZCBzaG91bGQgbW9zdGx5IGJlIGlnbm9yZWQgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUKK2RvaW5nLiAgVGhlIG9ubHkgZ2VuZXJhbGx5IHVzZWZ1bCBjYWxsIGlzIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwoKQord2hpY2ggY2hhbmdlcyBob3cgbXVjaCB0aW1lIHpsaWIgc3BlbmRzIG9uIHRyeWluZyB0byBjb21wcmVzcyB0aGUgaW1hZ2UKK2RhdGEuICBTZWUgdGhlIENvbXByZXNzaW9uIExpYnJhcnkgKHpsaWIuaCBhbmQgYWxnb3JpdGhtLnR4dCwgZGlzdHJpYnV0ZWQKK3dpdGggemxpYikgZm9yIGRldGFpbHMgb24gdGhlIGNvbXByZXNzaW9uIGxldmVscy4KKworICAgIC8qIHNldCB0aGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCAqLworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwKKyAgICAgICAgWl9CRVNUX0NPTVBSRVNTSU9OKTsKKworICAgIC8qIHNldCBvdGhlciB6bGliIHBhcmFtZXRlcnMgKi8KKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCA4KTsKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCisgICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLCAxNSk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgOCk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfcHRyLCA4MTkyKQorCitleHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfemJ1Zl9zaXplKQorCisuU1MgU2V0dGluZyB0aGUgY29udGVudHMgb2YgaW5mbyBmb3Igb3V0cHV0CisKK1lvdSBub3cgbmVlZCB0byBmaWxsIGluIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBhbGwgdGhlIGRhdGEgeW91Cit3aXNoIHRvIHdyaXRlIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBvbmx5IHRoaW5nIHlvdQorYXJlIGFsbG93ZWQgdG8gd3JpdGUgYWZ0ZXIgdGhlIGltYWdlIGlzIHRoZSB0ZXh0IGNodW5rcyBhbmQgdGhlIHRpbWUKK2NodW5rIChhcyBvZiBQTkcgU3BlY2lmaWNhdGlvbiAxLjIsIGFueXdheSkuICBTZWUgcG5nX3dyaXRlX2VuZCgpIGFuZAordGhlIGxhdGVzdCBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGF0LiAgSWYgeW91Cit3aXNoIHRvIHdyaXRlIHRoZW0gYmVmb3JlIHRoZSBpbWFnZSwgZmlsbCB0aGVtIGluIG5vdywgYW5kIGZsYWcgdGhhdAorZGF0YSBhcyBiZWluZyB2YWxpZC4gIElmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRhdGEsIGRvbid0CitmaWxsIHRoZW0gdW50aWwgcG5nX3dyaXRlX2VuZCgpLiAgRm9yIGFsbCB0aGUgZmllbGRzIGluIHBuZ19pbmZvIGFuZAordGhlaXIgZGF0YSB0eXBlcywgc2VlIHBuZy5oLiAgRm9yIGV4cGxhbmF0aW9ucyBvZiB3aGF0IHRoZSBmaWVsZHMKK2NvbnRhaW4sIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24uCisKK1NvbWUgb2YgdGhlIG1vcmUgaW1wb3J0YW50IHBhcnRzIG9mIHRoZSBwbmdfaW5mbyBhcmU6CisKKyAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKKyAgICAgICBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfbWV0aG9kKQorICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KKyAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgorICAgIGJpdF9kZXB0aCAgICAgIC0gaG9sZHMgdGhlIGJpdCBkZXB0aCBvZiBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICBpbWFnZSBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICh2YWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2CisgICAgICAgICAgICAgICAgICAgICBhbmQgZGVwZW5kIGFsc28gb24gdGhlCisgICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlLiAgU2VlIGFsc28gc2lnbmlmaWNhbnQKKyAgICAgICAgICAgICAgICAgICAgIGJpdHMgKHNCSVQpIGJlbG93KS4KKyAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYQorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXJlIHByZXNlbnQuCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQorCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKKworICAgIGludGVybGFjZV90eXBlIC0gUE5HX0lOVEVSTEFDRV9OT05FIG9yCisgICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03CisgICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUKQorICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQKKyAgICAgICAgICAgICAgICAgICAgIG9yLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgdG8KKyAgICAgICAgICAgICAgICAgICAgIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZQorICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKQorCitJZiB5b3UgY2FsbCBwbmdfc2V0X0lIRFIoKSwgdGhlIGNhbGwgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBvZiB0aGUKK290aGVyIHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgYmVjYXVzZSB0aGV5IG1pZ2h0IHJlcXVpcmUgYWNjZXNzIHRvIHNvbWUgb2YKK3RoZSBJSERSIHNldHRpbmdzLiAgVGhlIHJlbWFpbmluZyBwbmdfc2V0XyooKSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZAoraW4gYW55IG9yZGVyLgorCitJZiB5b3Ugd2lzaCwgeW91IGNhbiByZXNldCB0aGUgY29tcHJlc3Npb25fdHlwZSwgaW50ZXJsYWNlX3R5cGUsIG9yCitmaWx0ZXJfbWV0aG9kIGxhdGVyIGJ5IGNhbGxpbmcgcG5nX3NldF9JSERSKCkgYWdhaW47IGlmIHlvdSBkbyB0aGlzLCB0aGUKK3dpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgYW5kIGNvbG9yX3R5cGUgbXVzdCBiZSB0aGUgc2FtZSBpbiBlYWNoIGNhbGwuCisKKyAgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsCisgICAgICAgbnVtX3BhbGV0dGUpOworICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQorICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKKworICAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZ2FtbWEpOworICAgIGdhbW1hICAgICAgICAgIC0gdGhlIGdhbW1hIHRoZSBpbWFnZSB3YXMgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAgYXQgKFBOR19JTkZPX2dBTUEpCisKKyAgICBwbmdfc2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIHNyZ2JfaW50ZW50KTsKKyAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50CisgICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc1JHQikgVGhlIHByZXNlbmNlIG9mCisgICAgICAgICAgICAgICAgICAgICB0aGUgc1JHQiBjaHVuayBtZWFucyB0aGF0IHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2h1bmsgYWxzbyBpbXBsaWVzIHNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgZ0FNQSBhbmQgY0hSTS4gIFJlbmRlcmluZworICAgICAgICAgICAgICAgICAgICAgaW50ZW50IGlzIHRoZSBDU1MtMSBwcm9wZXJ0eSB0aGF0CisgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICBDb2xvciBDb25zb3J0aXVtCisgICAgICAgICAgICAgICAgICAgICAoaHR0cDovL3d3dy5jb2xvci5vcmcpLgorICAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIG9uZSBvZgorICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1NBVFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfUEVSQ0VQVFVBTCwKKyAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSwgb3IKKyAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9SRUxBVElWRS4KKworCisgICAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICAgc3JnYl9pbnRlbnQpOworICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zUkdCKSBUaGUgcHJlc2VuY2Ugb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICBzUkdCIGNodW5rIG1lYW5zIHRoYXQgdGhlIHBpeGVsCisgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGluIHRoZSBzUkdCIGNvbG9yIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGNhdXNlcyBnQU1BIGFuZAorICAgICAgICAgICAgICAgICAgICAgY0hSTSBjaHVua3Mgd2l0aCB0aGUgc3BlY2lmaWMgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBjb25zaXN0ZW50IHdpdGggc1JHQiB0byBiZQorICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4KKworICAgIHBuZ19zZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbmFtZSwgY29tcHJlc3Npb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBwcm9mbGVuKTsKKyAgICBuYW1lICAgICAgICAgICAgLSBUaGUgcHJvZmlsZSBuYW1lLgorICAgIGNvbXByZXNzaW9uICAgICAtIFRoZSBjb21wcmVzc2lvbiB0eXBlOyBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIGZvciBQTkcgMS4wLgorICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgZ2l2ZSBOVUxMIHRvIHRoaXMgYXJndW1lbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgaXQuCisgICAgcHJvZmlsZSAgICAgICAgIC0gSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIGNvbG9yCisgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSBkYXRhLiBNYXkgY29udGFpbiBOVUxzLgorICAgIHByb2ZsZW4gICAgICAgICAtIGxlbmd0aCBvZiBwcm9maWxlIGRhdGEgaW4gYnl0ZXMuCisKKyAgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIHNpZ19iaXQpOworICAgIHNpZ19iaXQgICAgICAgIC0gdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGZvcgorICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NCSVQpIGVhY2ggb2YgdGhlIGdyYXksIHJlZCwKKyAgICAgICAgICAgICAgICAgICAgIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscywgd2hpY2hldmVyIGFyZQorICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBjb2xvciB0eXBlCisgICAgICAgICAgICAgICAgICAgICAocG5nX2NvbG9yXzE2KQorCisgICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCB0cmFucywgbnVtX3RyYW5zLAorICAgICAgIHRyYW5zX3ZhbHVlcyk7CisgICAgdHJhbnMgICAgICAgICAgLSBhcnJheSBvZiB0cmFuc3BhcmVudAorICAgICAgICAgICAgICAgICAgICAgZW50cmllcyBmb3IgcGFsZXR0ZSAoUE5HX0lORk9fdFJOUykKKyAgICB0cmFuc192YWx1ZXMgICAtIGdyYXlsZXZlbCBvciBjb2xvciBzYW1wbGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAoaW4gb3JkZXIgcmVkLCBncmVlbiwgYmx1ZSkgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZWQgaW1hZ2VzIChQTkdfSU5GT190Uk5TKQorICAgIG51bV90cmFucyAgICAgIC0gbnVtYmVyIG9mIHRyYW5zcGFyZW50IGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT190Uk5TKQorCisgICAgcG5nX3NldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCBoaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX2hJU1QpCisgICAgaGlzdCAgICAgICAgICAgLSBoaXN0b2dyYW0gb2YgcGFsZXR0ZSAoYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2KQorCisgICAgcG5nX3NldF90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCBtb2RfdGltZSk7CisgICAgbW9kX3RpbWUgICAgICAgLSB0aW1lIGltYWdlIHdhcyBsYXN0IG1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAoUE5HX1ZBTElEX3RJTUUpCisKKyAgICBwbmdfc2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsIGJhY2tncm91bmQpOworICAgIGJhY2tncm91bmQgICAgIC0gYmFja2dyb3VuZCBjb2xvciAoUE5HX1ZBTElEX2JLR0QpCisKKyAgICBwbmdfc2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsIHRleHRfcHRyLCBudW1fdGV4dCk7CisgICAgdGV4dF9wdHIgICAgICAgLSBhcnJheSBvZiBwbmdfdGV4dCBob2xkaW5nIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBjb21tZW50cworICAgIHRleHRfcHRyW2ldLmNvbXByZXNzaW9uIC0gdHlwZSBvZiBjb21wcmVzc2lvbiB1c2VkCisgICAgICAgICAgICAgICAgIG9uICJ0ZXh0IiBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0CisgICAgdGV4dF9wdHJbaV0ua2V5ICAgLSBrZXl3b3JkIGZvciBjb21tZW50LiAgTXVzdCBjb250YWluCisgICAgICAgICAgICAgICAgIDEtNzkgY2hhcmFjdGVycy4KKyAgICB0ZXh0X3B0cltpXS50ZXh0ICAtIHRleHQgY29tbWVudHMgZm9yIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLiAgQ2FuIGJlIE5VTEwgb3IgZW1wdHkuCisgICAgdGV4dF9wdHJbaV0udGV4dF9sZW5ndGggLSBsZW5ndGggb2YgdGV4dCBzdHJpbmcsCisgICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIGlUWHQKKyAgICB0ZXh0X3B0cltpXS5pdHh0X2xlbmd0aCAtIGxlbmd0aCBvZiBpdHh0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgdEVYdC96VFh0CisgICAgdGV4dF9wdHJbaV0ubGFuZyAgLSBsYW5ndWFnZSBvZiBjb21tZW50IChOVUxMIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgZm9yIHVua25vd24pLgorICAgIHRleHRfcHRyW2ldLnRyYW5zbGF0ZWRfa2V5d29yZCAgLSBrZXl3b3JkIGluIFVURi04IChOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZW1wdHkgZm9yIHVua25vd24pLgorICAgIE5vdGUgdGhhdCB0aGUgaXR4dF9sZW5ndGgsIGxhbmcsIGFuZCBsYW5nX2tleQorICAgIG1lbWJlcnMgb2YgdGhlIHRleHRfcHRyIHN0cnVjdHVyZSBvbmx5IGV4aXN0CisgICAgd2hlbiB0aGUgbGlicmFyeSBpcyBidWlsdCB3aXRoIGlUWHQgY2h1bmsgc3VwcG9ydC4KKworICAgIG51bV90ZXh0ICAgICAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzCisKKyAgICBwbmdfc2V0X3NQTFQocG5nX3B0ciwgaW5mb19wdHIsICZwYWxldHRlX3B0ciwKKyAgICAgICBudW1fc3BhbGV0dGVzKTsKKyAgICBwYWxldHRlX3B0ciAgICAtIGFycmF5IG9mIHBuZ19zUExUX3N0cnVjdCBzdHJ1Y3R1cmVzCisgICAgICAgICAgICAgICAgICAgICB0byBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBwYWxldHRlcworICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGluZm8gc3RydWN0dXJlLgorICAgIG51bV9zcGFsZXR0ZXMgIC0gbnVtYmVyIG9mIHBhbGV0dGUgc3RydWN0dXJlcyB0byBiZQorICAgICAgICAgICAgICAgICAgICAgYWRkZWQuCisKKyAgICBwbmdfc2V0X29GRnMocG5nX3B0ciwgaW5mb19wdHIsIG9mZnNldF94LCBvZmZzZXRfeSwKKyAgICAgICAgdW5pdF90eXBlKTsKKyAgICBvZmZzZXRfeCAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgbGVmdAorICAgICAgICAgICAgICAgICAgICAgZWRnZSBvZiB0aGUgc2NyZWVuCisgICAgb2Zmc2V0X3kgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIHRvcAorICAgICAgICAgICAgICAgICAgICAgZWRnZSBvZiB0aGUgc2NyZWVuCisgICAgdW5pdF90eXBlIC0gUE5HX09GRlNFVF9QSVhFTCwgUE5HX09GRlNFVF9NSUNST01FVEVSCisKKyAgICBwbmdfc2V0X3BIWXMocG5nX3B0ciwgaW5mb19wdHIsIHJlc194LCByZXNfeSwKKyAgICAgICAgdW5pdF90eXBlKTsKKyAgICByZXNfeCAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24KKyAgICAgICAgICAgICAgICAgIGluIHggZGlyZWN0aW9uCisgICAgcmVzX3kgICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgICBpbiB5IGRpcmVjdGlvbgorICAgIHVuaXRfdHlwZSAgIC0gUE5HX1JFU09MVVRJT05fVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgIFBOR19SRVNPTFVUSU9OX01FVEVSCisKKyAgICBwbmdfc2V0X3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIHVuaXQsIHdpZHRoLCBoZWlnaHQpCisgICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKKyAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCisgICAgICAgICAgICAgICAgICAod2lkdGggYW5kIGhlaWdodCBhcmUgZG91YmxlcykKKworICAgIHBuZ19zZXRfc0NBTF9zKHBuZ19wdHIsIGluZm9fcHRyLCB1bml0LCB3aWR0aCwgaGVpZ2h0KQorICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCisgICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCisgICAgaGVpZ2h0ICAgICAgLSBoZWlnaHQgb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cworICAgICAgICAgICAgICAgICAod2lkdGggYW5kIGhlaWdodCBhcmUgc3RyaW5ncyBsaWtlICIyLjU0IikKKworICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsICZ1bmtub3ducywKKyAgICAgICBudW1fdW5rbm93bnMpCisgICAgdW5rbm93bnMgICAgICAgICAgLSBhcnJheSBvZiBwbmdfdW5rbm93bl9jaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcyBob2xkaW5nIHVua25vd24gY2h1bmtzCisgICAgdW5rbm93bnNbaV0ubmFtZSAgLSBuYW1lIG9mIHVua25vd24gY2h1bmsKKyAgICB1bmtub3duc1tpXS5kYXRhICAtIGRhdGEgb2YgdW5rbm93biBjaHVuaworICAgIHVua25vd25zW2ldLnNpemUgIC0gc2l6ZSBvZiB1bmtub3duIGNodW5rJ3MgZGF0YQorICAgIHVua25vd25zW2ldLmxvY2F0aW9uIC0gcG9zaXRpb24gdG8gd3JpdGUgY2h1bmsgaW4gZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogZG8gbm90IHdyaXRlIGNodW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSEFWRV9JSERSOiBiZWZvcmUgUExURQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0hBVkVfUExURTogYmVmb3JlIElEQVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19BRlRFUl9JREFUOiBhZnRlciBJREFUCisKK1RoZSAibG9jYXRpb24iIG1lbWJlciBpcyBzZXQgYXV0b21hdGljYWxseSBhY2NvcmRpbmcgdG8KK3doYXQgcGFydCBvZiB0aGUgb3V0cHV0IGZpbGUgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgorWW91IGNhbiBjaGFuZ2UgaXRzIHZhbHVlIGFmdGVyIGNhbGxpbmcgcG5nX3NldF91bmtub3duX2NodW5rcygpCithcyBkZW1vbnN0cmF0ZWQgaW4gcG5ndGVzdC5jLiAgV2l0aGluIGVhY2ggb2YgdGhlICJsb2NhdGlvbnMiLAordGhlIGNodW5rcyBhcmUgc2VxdWVuY2VkIGFjY29yZGluZyB0byB0aGVpciBwb3NpdGlvbiBpbiB0aGUKK3N0cnVjdHVyZSAodGhhdCBpcywgdGhlIHZhbHVlIG9mICJpIiwgd2hpY2ggaXMgdGhlIG9yZGVyIGluIHdoaWNoCit0aGUgY2h1bmsgd2FzIGVpdGhlciByZWFkIGZyb20gdGhlIGlucHV0IGZpbGUgb3IgZGVmaW5lZCB3aXRoCitwbmdfc2V0X3Vua25vd25fY2h1bmtzKS4KKworQSBxdWljayB3b3JkIGFib3V0IHRleHQgYW5kIG51bV90ZXh0LiAgdGV4dCBpcyBhbiBhcnJheSBvZiBwbmdfdGV4dAorc3RydWN0dXJlcy4gIG51bV90ZXh0IGlzIHRoZSBudW1iZXIgb2YgdmFsaWQgc3RydWN0dXJlcyBpbiB0aGUgYXJyYXkuCitFYWNoIHBuZ190ZXh0IHN0cnVjdHVyZSBob2xkcyBhIGxhbmd1YWdlIGNvZGUsIGEga2V5d29yZCwgYSB0ZXh0IHZhbHVlLAorYW5kIGEgY29tcHJlc3Npb24gdHlwZS4KKworVGhlIGNvbXByZXNzaW9uIHR5cGVzIGhhdmUgdGhlIHNhbWUgdmFsaWQgbnVtYmVycyBhcyB0aGUgY29tcHJlc3Npb24KK3R5cGVzIG9mIHRoZSBpbWFnZSBkYXRhLiAgQ3VycmVudGx5LCB0aGUgb25seSB2YWxpZCBudW1iZXIgaXMgemVyby4KK0hvd2V2ZXIsIHlvdSBjYW4gc3RvcmUgdGV4dCBlaXRoZXIgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQsIHVubGlrZQoraW1hZ2VzLCB3aGljaCBhbHdheXMgaGF2ZSB0byBiZSBjb21wcmVzc2VkLiAgU28gaWYgeW91IGRvbid0IHdhbnQgdGhlCit0ZXh0IGNvbXByZXNzZWQsIHNldCB0aGUgY29tcHJlc3Npb24gdHlwZSB0byBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FLgorQmVjYXVzZSB0RVh0IGFuZCB6VFh0IGNodW5rcyBkb24ndCBoYXZlIGEgbGFuZ3VhZ2UgZmllbGQsIGlmIHlvdQorc3BlY2lmeSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FIG9yIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKK2FueSBsYW5ndWFnZSBjb2RlIG9yIHRyYW5zbGF0ZWQga2V5d29yZCB3aWxsIG5vdCBiZSB3cml0dGVuIG91dC4KKworVW50aWwgdGV4dCBnZXRzIGFyb3VuZCAxMDAwIGJ5dGVzLCBpdCBpcyBub3Qgd29ydGggY29tcHJlc3NpbmcgaXQuCitBZnRlciB0aGUgdGV4dCBoYXMgYmVlbiB3cml0dGVuIG91dCB0byB0aGUgZmlsZSwgdGhlIGNvbXByZXNzaW9uIHR5cGUKK2lzIHNldCB0byBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FX1dSIG9yIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHRfV1IsCitzbyB0aGF0IGl0IGlzbid0IHdyaXR0ZW4gb3V0IGFnYWluIGF0IHRoZSBlbmQgKGluIGNhc2UgeW91IGFyZSBjYWxsaW5nCitwbmdfd3JpdGVfZW5kKCkgd2l0aCB0aGUgc2FtZSBzdHJ1Y3QuCisKK1RoZSBrZXl3b3JkcyB0aGF0IGFyZSBnaXZlbiBpbiB0aGUgUE5HIFNwZWNpZmljYXRpb24gYXJlOgorCisgICAgVGl0bGUgICAgICAgICAgICBTaG9ydCAob25lIGxpbmUpIHRpdGxlIG9yCisgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uIGZvciBpbWFnZQorICAgIEF1dGhvciAgICAgICAgICAgTmFtZSBvZiBpbWFnZSdzIGNyZWF0b3IKKyAgICBEZXNjcmlwdGlvbiAgICAgIERlc2NyaXB0aW9uIG9mIGltYWdlIChwb3NzaWJseSBsb25nKQorICAgIENvcHlyaWdodCAgICAgICAgQ29weXJpZ2h0IG5vdGljZQorICAgIENyZWF0aW9uIFRpbWUgICAgVGltZSBvZiBvcmlnaW5hbCBpbWFnZSBjcmVhdGlvbgorICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgUkZDIDExMjMgZm9ybWF0LCBzZWUgYmVsb3cpCisgICAgU29mdHdhcmUgICAgICAgICBTb2Z0d2FyZSB1c2VkIHRvIGNyZWF0ZSB0aGUgaW1hZ2UKKyAgICBEaXNjbGFpbWVyICAgICAgIExlZ2FsIGRpc2NsYWltZXIKKyAgICBXYXJuaW5nICAgICAgICAgIFdhcm5pbmcgb2YgbmF0dXJlIG9mIGNvbnRlbnQKKyAgICBTb3VyY2UgICAgICAgICAgIERldmljZSB1c2VkIHRvIGNyZWF0ZSB0aGUgaW1hZ2UKKyAgICBDb21tZW50ICAgICAgICAgIE1pc2NlbGxhbmVvdXMgY29tbWVudDsgY29udmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgZnJvbSBvdGhlciBpbWFnZSBmb3JtYXQKKworVGhlIGtleXdvcmQtdGV4dCBwYWlycyB3b3JrIGxpa2UgdGhpcy4gIEtleXdvcmRzIHNob3VsZCBiZSBzaG9ydAorc2ltcGxlIGRlc2NyaXB0aW9ucyBvZiB3aGF0IHRoZSBjb21tZW50IGlzIGFib3V0LiAgU29tZSB0eXBpY2FsCitrZXl3b3JkcyBhcmUgZm91bmQgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBhcyBpcyBzb21lIHJlY29tbWVuZGF0aW9ucworb24ga2V5d29yZHMuICBZb3UgY2FuIHJlcGVhdCBrZXl3b3JkcyBpbiBhIGZpbGUuICBZb3UgY2FuIGV2ZW4gd3JpdGUKK3NvbWUgdGV4dCBiZWZvcmUgdGhlIGltYWdlIGFuZCBzb21lIGFmdGVyLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkgd2FudAordG8gcHV0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGltYWdlIGJlZm9yZSB0aGUgaW1hZ2UsIGJ1dCBsZWF2ZSB0aGUKK2Rpc2NsYWltZXIgdW50aWwgYWZ0ZXIsIHNvIHZpZXdlcnMgd29ya2luZyBvdmVyIG1vZGVtIGNvbm5lY3Rpb25zCitkb24ndCBoYXZlIHRvIHdhaXQgZm9yIHRoZSBkaXNjbGFpbWVyIHRvIGdvIG92ZXIgdGhlIG1vZGVtIGJlZm9yZQordGhleSBzdGFydCBzZWVpbmcgdGhlIGltYWdlLiAgRmluYWxseSwga2V5d29yZHMgc2hvdWxkIGJlIGZ1bGwKK3dvcmRzLCBub3QgYWJicmV2aWF0aW9ucy4gIEtleXdvcmRzIGFuZCB0ZXh0IGFyZSBpbiB0aGUgSVNPIDg4NTktMQorKExhdGluLTEpIGNoYXJhY3RlciBzZXQgKGEgc3VwZXJzZXQgb2YgcmVndWxhciBBU0NJSSkgYW5kIGNhbiBub3QKK2NvbnRhaW4gTlVMIGNoYXJhY3RlcnMsIGFuZCBzaG91bGQgbm90IGNvbnRhaW4gY29udHJvbCBvciBvdGhlcgordW5wcmludGFibGUgY2hhcmFjdGVycy4gIFRvIG1ha2UgdGhlIGNvbW1lbnRzIHdpZGVseSByZWFkYWJsZSwgc3RpY2sKK3dpdGggYmFzaWMgQVNDSUksIGFuZCBhdm9pZCBtYWNoaW5lIHNwZWNpZmljIGNoYXJhY3RlciBzZXQgZXh0ZW5zaW9ucworbGlrZSB0aGUgSUJNLVBDIGNoYXJhY3RlciBzZXQuICBUaGUga2V5d29yZCBtdXN0IGJlIHByZXNlbnQsIGJ1dAoreW91IGNhbiBsZWF2ZSBvZmYgdGhlIHRleHQgc3RyaW5nIG9uIG5vbi1jb21wcmVzc2VkIHBhaXJzLgorQ29tcHJlc3NlZCBwYWlycyBtdXN0IGhhdmUgYSB0ZXh0IHN0cmluZywgYXMgb25seSB0aGUgdGV4dCBzdHJpbmcKK2lzIGNvbXByZXNzZWQgYW55d2F5LCBzbyB0aGUgY29tcHJlc3Npb24gd291bGQgYmUgbWVhbmluZ2xlc3MuCisKK1BORyBzdXBwb3J0cyBtb2RpZmljYXRpb24gdGltZSB2aWEgdGhlIHBuZ190aW1lIHN0cnVjdHVyZS4gIFR3bworY29udmVyc2lvbiByb3V0aW5lcyBhcmUgcHJvdmlkZWQsIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgZm9yCit0aW1lX3QgYW5kIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgZm9yIHN0cnVjdCB0bS4gIFRoZQordGltZV90IHJvdXRpbmUgdXNlcyBnbXRpbWUoKS4gIFlvdSBkb24ndCBoYXZlIHRvIHVzZSBlaXRoZXIgb2YKK3RoZXNlLCBidXQgaWYgeW91IHdpc2ggdG8gZmlsbCBpbiB0aGUgcG5nX3RpbWUgc3RydWN0dXJlIGRpcmVjdGx5LAoreW91IHNob3VsZCBwcm92aWRlIHRoZSB0aW1lIGluIHVuaXZlcnNhbCB0aW1lIChHTVQpIGlmIHBvc3NpYmxlCitpbnN0ZWFkIG9mIHlvdXIgbG9jYWwgdGltZS4gIE5vdGUgdGhhdCB0aGUgeWVhciBudW1iZXIgaXMgdGhlIGZ1bGwKK3llYXIgKGUuZy4gMTk5OCwgcmF0aGVyIHRoYW4gOTggLSBQTkcgaXMgeWVhciAyMDAwIGNvbXBsaWFudCEpLCBhbmQKK3RoYXQgbW9udGhzIHN0YXJ0IHdpdGggMS4KKworSWYgeW91IHdhbnQgdG8gc3RvcmUgdGhlIHRpbWUgb2YgdGhlIG9yaWdpbmFsIGltYWdlIGNyZWF0aW9uLCB5b3Ugc2hvdWxkCit1c2UgYSBwbGFpbiB0RVh0IGNodW5rIHdpdGggdGhlICJDcmVhdGlvbiBUaW1lIiBrZXl3b3JkLiAgVGhpcyBpcworbmVjZXNzYXJ5IGJlY2F1c2UgdGhlICJjcmVhdGlvbiB0aW1lIiBvZiBhIFBORyBpbWFnZSBpcyBzb21ld2hhdCB2YWd1ZSwKK2RlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBtZWFuIHRoZSBQTkcgZmlsZSwgdGhlIHRpbWUgdGhlIGltYWdlIHdhcworY3JlYXRlZCBpbiBhIG5vbi1QTkcgZm9ybWF0LCBhIHN0aWxsIHBob3RvIGZyb20gd2hpY2ggdGhlIGltYWdlIHdhcworc2Nhbm5lZCwgb3IgcG9zc2libHkgdGhlIHN1YmplY3QgbWF0dGVyIGl0c2VsZi4gIEluIG9yZGVyIHRvIGZhY2lsaXRhdGUKK21hY2hpbmUtcmVhZGFibGUgZGF0ZXMsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlICJDcmVhdGlvbiBUaW1lIgordEVYdCBjaHVuayB1c2UgUkZDIDExMjMgZm9ybWF0IGRhdGVzIChlLmcuICIyMiBNYXkgMTk5NyAxODowNzoxMCBHTVQiKSwKK2FsdGhvdWdoIHRoaXMgaXNuJ3QgYSByZXF1aXJlbWVudC4gIFVubGlrZSB0aGUgdElNRSBjaHVuaywgdGhlCisiQ3JlYXRpb24gVGltZSIgdEVYdCBjaHVuayBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgYXV0b21hdGljYWxseSBjaGFuZ2VkCitieSB0aGUgc29mdHdhcmUuICBUbyBmYWNpbGl0YXRlIHRoZSB1c2Ugb2YgUkZDIDExMjMgZGF0ZXMsIGEgZnVuY3Rpb24KK3BuZ19jb252ZXJ0X3RvX3JmYzExMjMocG5nX3RpbWVwKSBpcyBwcm92aWRlZCB0byBjb252ZXJ0IGZyb20gUE5HCit0aW1lIHRvIGFuIFJGQyAxMTIzIGZvcm1hdCBzdHJpbmcuCisKKy5TUyBXcml0aW5nIHVua25vd24gY2h1bmtzCisKK1lvdSBjYW4gdXNlIHRoZSBwbmdfc2V0X3Vua25vd25fY2h1bmtzIGZ1bmN0aW9uIHRvIHF1ZXVlIHVwIGNodW5rcworZm9yIHdyaXRpbmcuICBZb3UgZ2l2ZSBpdCBhIGNodW5rIG5hbWUsIHJhdyBkYXRhLCBhbmQgYSBzaXplOyB0aGF0J3MKK2FsbCB0aGVyZSBpcyB0byBpdC4gIFRoZSBjaHVua3Mgd2lsbCBiZSB3cml0dGVuIGJ5IHRoZSBuZXh0IGZvbGxvd2luZworcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUsIHBuZ193cml0ZV9pbmZvLCBvciBwbmdfd3JpdGVfZW5kIGZ1bmN0aW9uLgorQW55IGNodW5rcyBwcmV2aW91c2x5IHJlYWQgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUncyB1bmtub3duLWNodW5rCitsaXN0IHdpbGwgYWxzbyBiZSB3cml0dGVuIG91dCBpbiBhIHNlcXVlbmNlIHRoYXQgc2F0aXNmaWVzIHRoZSBQTkcKK3NwZWNpZmljYXRpb24ncyBvcmRlcmluZyBydWxlcy4KKworLlNTIFRoZSBoaWdoLWxldmVsIHdyaXRlIGludGVyZmFjZQorCitBdCB0aGlzIHBvaW50IHRoZXJlIGFyZSB0d28gd2F5cyB0byBwcm9jZWVkOyB0aHJvdWdoIHRoZSBoaWdoLWxldmVsCit3cml0ZSBpbnRlcmZhY2UsIG9yIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBsb3ctbGV2ZWwgd3JpdGUgb3BlcmF0aW9ucy4KK1lvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiB5b3VyIGltYWdlIGRhdGEgaXMgcHJlc2VudAoraW4gdGhlIGluZm8gc3RydWN0dXJlLiAgQWxsIGRlZmluZWQgb3V0cHV0Cit0cmFuc2Zvcm1hdGlvbnMgYXJlIHBlcm1pdHRlZCwgZW5hYmxlZCBieSB0aGUgZm9sbG93aW5nIG1hc2tzLgorCisgICAgUE5HX1RSQU5TRk9STV9JREVOVElUWSAgICAgIE5vIHRyYW5zZm9ybWF0aW9uCisgICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIFBhY2sgMSwgMiBhbmQgNC1iaXQgc2FtcGxlcworICAgIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVAgICAgICBDaGFuZ2Ugb3JkZXIgb2YgcGFja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0byBMU0IgZmlyc3QKKyAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PICAgSW52ZXJ0IG1vbm9jaHJvbWUgaW1hZ2VzCisgICAgUE5HX1RSQU5TRk9STV9TSElGVCAgICAgICAgIE5vcm1hbGl6ZSBwaXhlbHMgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCSVQgZGVwdGgKKyAgICBQTkdfVFJBTlNGT1JNX0JHUiAgICAgICAgICAgRmxpcCBSR0IgdG8gQkdSLCBSR0JBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEJHUkEKKyAgICBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEgICAgRmxpcCBSR0JBIHRvIEFSR0Igb3IgR0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQUcKKyAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSAgQ2hhbmdlIGFscGhhIGZyb20gb3BhY2l0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cmFuc3BhcmVuY3kKKyAgICBQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOICAgQnl0ZS1zd2FwIDE2LWJpdCBzYW1wbGVzCisgICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVIgICAgICAgIFN0cmlwIG91dCBmaWxsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKGRlcHJlY2F0ZWQpLgorICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0JFRk9SRSBTdHJpcCBvdXQgbGVhZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZXIgYnl0ZXMKKyAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9BRlRFUiAgU3RyaXAgb3V0IHRyYWlsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlciBieXRlcworCitJZiB5b3UgaGF2ZSB2YWxpZCBpbWFnZSBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdHVyZSAoeW91IGNhbiB1c2UKK3BuZ19zZXRfcm93cygpIHRvIHB1dCBpbWFnZSBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdHVyZSksIHNpbXBseSBkbyB0aGlzOgorCisgICAgcG5nX3dyaXRlX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpCisKK3doZXJlIHBuZ190cmFuc2Zvcm1zIGlzIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBzb21lIHNldCBvZgordHJhbnNmb3JtYXRpb24gZmxhZ3MuICBUaGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0byBwbmdfd3JpdGVfaW5mbygpLAorZm9sbG93ZWQgdGhlIHNldCBvZiB0cmFuc2Zvcm1hdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSB0cmFuc2Zvcm0gbWFzaywKK3RoZW4gcG5nX3dyaXRlX2ltYWdlKCksIGFuZCBmaW5hbGx5IHBuZ193cml0ZV9lbmQoKS4KKworKFRoZSBmaW5hbCBwYXJhbWV0ZXIgb2YgdGhpcyBjYWxsIGlzIG5vdCB5ZXQgdXNlZC4gIFNvbWVkYXkgaXQgbWlnaHQgcG9pbnQKK3RvIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgc29tZSBmdXR1cmUgb3V0cHV0IHRyYW5zZm9ybS4pCisKK1lvdSBtdXN0IHVzZSBwbmdfdHJhbnNmb3JtcyBhbmQgbm90IGNhbGwgYW55IHBuZ19zZXRfdHJhbnNmb3JtKCkgZnVuY3Rpb25zCit3aGVuIHlvdSB1c2UgcG5nX3dyaXRlX3BuZygpLgorCisuU1MgVGhlIGxvdy1sZXZlbCB3cml0ZSBpbnRlcmZhY2UKKworSWYgeW91IGFyZSBnb2luZyB0aGUgbG93LWxldmVsIHJvdXRlIGluc3RlYWQsIHlvdSBhcmUgbm93IHJlYWR5IHRvCit3cml0ZSBhbGwgdGhlIGZpbGUgaW5mb3JtYXRpb24gdXAgdG8gdGhlIGFjdHVhbCBpbWFnZSBkYXRhLiAgWW91IGRvCit0aGlzIHdpdGggYSBjYWxsIHRvIHBuZ193cml0ZV9pbmZvKCkuCisKKyAgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK05vdGUgdGhhdCB0aGVyZSBpcyBvbmUgdHJhbnNmb3JtYXRpb24geW91IG1heSBuZWVkIHRvIGRvIGJlZm9yZQorcG5nX3dyaXRlX2luZm8oKS4gIEluIFBORyBmaWxlcywgdGhlIGFscGhhIGNoYW5uZWwgaW4gYW4gaW1hZ2UgaXMgdGhlCitsZXZlbCBvZiBvcGFjaXR5LiAgSWYgeW91ciBkYXRhIGlzIHN1cHBsaWVkIGFzIGEgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5LAoreW91IGNhbiBpbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgYmVmb3JlIHlvdSB3cml0ZSBpdCwgc28gdGhhdCAwIGlzCitmdWxseSB0cmFuc3BhcmVudCBhbmQgMjU1IChpbiA4LWJpdCBvciBwYWxldHRlZCBpbWFnZXMpIG9yIDY1NTM1CisoaW4gMTYtYml0IGltYWdlcykgaXMgZnVsbHkgb3BhcXVlLCB3aXRoCisKKyAgICBwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfcHRyKTsKKworVGhpcyBtdXN0IGFwcGVhciBiZWZvcmUgcG5nX3dyaXRlX2luZm8oKSBpbnN0ZWFkIG9mIGxhdGVyIHdpdGggdGhlCitvdGhlciB0cmFuc2Zvcm1hdGlvbnMgYmVjYXVzZSBpbiB0aGUgY2FzZSBvZiBwYWxldHRlZCBpbWFnZXMgdGhlIHRSTlMKK2NodW5rIGRhdGEgaGFzIHRvIGJlIGludmVydGVkIGJlZm9yZSB0aGUgdFJOUyBjaHVuayBpcyB3cml0dGVuLiAgSWYKK3lvdXIgaW1hZ2UgaXMgbm90IGEgcGFsZXR0ZWQgaW1hZ2UsIHRoZSB0Uk5TIGRhdGEgKHdoaWNoIGluIHN1Y2ggY2FzZXMKK3JlcHJlc2VudHMgYSBzaW5nbGUgY29sb3IgdG8gYmUgcmVuZGVyZWQgYXMgdHJhbnNwYXJlbnQpIHdvbid0IG5lZWQgdG8KK2JlIGNoYW5nZWQsIGFuZCB5b3UgY2FuIHNhZmVseSBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uIGFmdGVyIHlvdXIKK3BuZ193cml0ZV9pbmZvKCkgY2FsbC4KKworSWYgeW91IG5lZWQgdG8gd3JpdGUgYSBwcml2YXRlIGNodW5rIHRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlZm9yZQordGhlIFBMVEUgY2h1bmsgd2hlbiBQTFRFIGlzIHByZXNlbnQsIHlvdSBjYW4gd3JpdGUgdGhlIFBORyBpbmZvIGluCit0d28gc3RlcHMsIGFuZCBpbnNlcnQgY29kZSB0byB3cml0ZSB5b3VyIG93biBjaHVuayBiZXR3ZWVuIHRoZW06CisKKyAgICBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURShwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgLi4uKTsKKyAgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK0FmdGVyIHlvdSd2ZSB3cml0dGVuIHRoZSBmaWxlIGluZm9ybWF0aW9uLCB5b3UgY2FuIHNldCB1cCB0aGUgbGlicmFyeQordG8gaGFuZGxlIGFueSBzcGVjaWFsIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgaW1hZ2UgZGF0YS4gIFRoZSB2YXJpb3VzCit3YXlzIHRvIHRyYW5zZm9ybSB0aGUgZGF0YSB3aWxsIGJlIGRlc2NyaWJlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5CitzaG91bGQgb2NjdXIuICBUaGlzIGlzIGltcG9ydGFudCwgYXMgc29tZSBvZiB0aGVzZSBjaGFuZ2UgdGhlIGNvbG9yCit0eXBlIGFuZC9vciBiaXQgZGVwdGggb2YgdGhlIGRhdGEsIGFuZCBzb21lIG90aGVycyBvbmx5IHdvcmsgb24KK2NlcnRhaW4gY29sb3IgdHlwZXMgYW5kIGJpdCBkZXB0aHMuICBFdmVuIHRob3VnaCBlYWNoIHRyYW5zZm9ybWF0aW9uCitjaGVja3MgdG8gc2VlIGlmIGl0IGhhcyBkYXRhIHRoYXQgaXQgY2FuIGRvIHNvbWV0aGluZyB3aXRoLCB5b3Ugc2hvdWxkCittYWtlIHN1cmUgdG8gb25seSBlbmFibGUgYSB0cmFuc2Zvcm1hdGlvbiBpZiBpdCB3aWxsIGJlIHZhbGlkIGZvciB0aGUKK2RhdGEuICBGb3IgZXhhbXBsZSwgZG9uJ3Qgc3dhcCByZWQgYW5kIGJsdWUgb24gZ3JheXNjYWxlIGRhdGEuCisKK1BORyBmaWxlcyBzdG9yZSBSR0IgcGl4ZWxzIHBhY2tlZCBpbnRvIDMgb3IgNiBieXRlcy4gIFRoaXMgY29kZSB0ZWxscwordGhlIGxpYnJhcnkgdG8gc3RyaXAgaW5wdXQgZGF0YSB0aGF0IGhhcyA0IG9yIDggYnl0ZXMgcGVyIHBpeGVsIGRvd24KK3RvIDMgb3IgNiBieXRlcyAob3Igc3RyaXAgMiBvciA0LWJ5dGUgZ3JheXNjYWxlK2ZpbGxlciBkYXRhIHRvIDEgb3IgMgorYnl0ZXMgcGVyIHBpeGVsKS4KKworICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDAsIFBOR19GSUxMRVJfQkVGT1JFKTsKKword2hlcmUgdGhlIDAgaXMgdW51c2VkLCBhbmQgdGhlIGxvY2F0aW9uIGlzIGVpdGhlciBQTkdfRklMTEVSX0JFRk9SRSBvcgorUE5HX0ZJTExFUl9BRlRFUiwgZGVwZW5kaW5nIHVwb24gd2hldGhlciB0aGUgZmlsbGVyIGJ5dGUgaW4gdGhlIHBpeGVsCitpcyBzdG9yZWQgWFJHQiBvciBSR0JYLgorCitQTkcgZmlsZXMgcGFjayBwaXhlbHMgb2YgYml0IGRlcHRocyAxLCAyLCBhbmQgNCBpbnRvIGJ5dGVzIGFzIHNtYWxsIGFzCit0aGV5IGNhbiwgcmVzdWx0aW5nIGluLCBmb3IgZXhhbXBsZSwgOCBwaXhlbHMgcGVyIGJ5dGUgZm9yIDEgYml0IGZpbGVzLgorSWYgdGhlIGRhdGEgaXMgc3VwcGxpZWQgYXQgMSBwaXhlbCBwZXIgYnl0ZSwgdXNlIHRoaXMgY29kZSwgd2hpY2ggd2lsbAorY29ycmVjdGx5IHBhY2sgdGhlIHBpeGVscyBpbnRvIGEgc2luZ2xlIGJ5dGU6CisKKyAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7CisKK1BORyBmaWxlcyByZWR1Y2UgcG9zc2libGUgYml0IGRlcHRocyB0byAxLCAyLCA0LCA4LCBhbmQgMTYuICBJZiB5b3VyCitkYXRhIGlzIG9mIGFub3RoZXIgYml0IGRlcHRoLCB5b3UgY2FuIHdyaXRlIGFuIHNCSVQgY2h1bmsgaW50byB0aGUKK2ZpbGUgc28gdGhhdCBkZWNvZGVycyBjYW4gcmVjb3ZlciB0aGUgb3JpZ2luYWwgZGF0YSBpZiBkZXNpcmVkLgorCisgICAgLyogU2V0IHRoZSB0cnVlIGJpdCBkZXB0aCBvZiB0aGUgaW1hZ2UgZGF0YSAqLworICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCisgICAgeworICAgICAgICBzaWdfYml0LnJlZCA9IHRydWVfYml0X2RlcHRoOworICAgICAgICBzaWdfYml0LmdyZWVuID0gdHJ1ZV9iaXRfZGVwdGg7CisgICAgICAgIHNpZ19iaXQuYmx1ZSA9IHRydWVfYml0X2RlcHRoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzaWdfYml0LmdyYXkgPSB0cnVlX2JpdF9kZXB0aDsKKyAgICB9CisgICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKKyAgICB7CisgICAgICAgIHNpZ19iaXQuYWxwaGEgPSB0cnVlX2JpdF9kZXB0aDsKKyAgICB9CisKKyAgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzaWdfYml0KTsKKworSWYgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSByb3cgYnVmZmVyIGluIGEgYml0IGRlcHRoIG90aGVyIHRoYW4KK29uZSBzdXBwb3J0ZWQgYnkgUE5HIChlLmcuIDMgYml0IGRhdGEgaW4gdGhlIHJhbmdlIDAtNyBmb3IgYSA0LWJpdCBQTkcpLAordGhpcyB3aWxsIHNjYWxlIHRoZSB2YWx1ZXMgdG8gYXBwZWFyIHRvIGJlIHRoZSBjb3JyZWN0IGJpdCBkZXB0aCBhcworaXMgcmVxdWlyZWQgYnkgUE5HLgorCisgICAgcG5nX3NldF9zaGlmdChwbmdfcHRyLCAmc2lnX2JpdCk7CisKK1BORyBmaWxlcyBzdG9yZSAxNiBiaXQgcGl4ZWxzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAoYmlnLWVuZGlhbiwKK2llLiBtb3N0IHNpZ25pZmljYW50IGJpdHMgZmlyc3QpLiAgVGhpcyBjb2RlIHdvdWxkIGJlIHVzZWQgaWYgdGhleSBhcmUKK3N1cHBsaWVkIHRoZSBvdGhlciB3YXkgKGxpdHRsZS1lbmRpYW4sIGkuZS4gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cworZmlyc3QsIHRoZSB3YXkgUENzIHN0b3JlIHRoZW0pOgorCisgICAgaWYgKGJpdF9kZXB0aCA+IDgpCisgICAgICAgcG5nX3NldF9zd2FwKHBuZ19wdHIpOworCitJZiB5b3UgYXJlIHVzaW5nIHBhY2tlZC1waXhlbCBpbWFnZXMgKDEsIDIsIG9yIDQgYml0cy9waXhlbCksIGFuZCB5b3UKK25lZWQgdG8gY2hhbmdlIHRoZSBvcmRlciB0aGUgcGl4ZWxzIGFyZSBwYWNrZWQgaW50byBieXRlcywgeW91IGNhbiB1c2U6CisKKyAgICBpZiAoYml0X2RlcHRoIDwgOCkKKyAgICAgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOworCitQTkcgZmlsZXMgc3RvcmUgMyBjb2xvciBwaXhlbHMgaW4gcmVkLCBncmVlbiwgYmx1ZSBvcmRlci4gIFRoaXMgY29kZQord291bGQgYmUgdXNlZCBpZiB0aGV5IGFyZSBzdXBwbGllZCBhcyBibHVlLCBncmVlbiwgcmVkOgorCisgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7CisKK1BORyBmaWxlcyBkZXNjcmliZSBtb25vY2hyb21lIGFzIGJsYWNrIGJlaW5nIHplcm8gYW5kIHdoaXRlIGJlaW5nCitvbmUuIFRoaXMgY29kZSB3b3VsZCBiZSB1c2VkIGlmIHRoZSBwaXhlbHMgYXJlIHN1cHBsaWVkIHdpdGggdGhpcyByZXZlcnNlZAorKGJsYWNrIGJlaW5nIG9uZSBhbmQgd2hpdGUgYmVpbmcgemVybyk6CisKKyAgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOworCitGaW5hbGx5LCB5b3UgY2FuIHdyaXRlIHlvdXIgb3duIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGlmIG5vbmUgb2YKK3RoZSBleGlzdGluZyBvbmVzIG1lZXRzIHlvdXIgbmVlZHMuICBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyBhIGNhbGxiYWNrCit3aXRoCisKKyAgICBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19wdHIsCisgICAgICAgd3JpdGVfdHJhbnNmb3JtX2ZuKTsKKworWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgorCisgICAgdm9pZCB3cml0ZV90cmFuc2Zvcm1fZm4ocG5nX3B0ciBwdHIsIHJvd19pbmZvX3B0cgorICAgICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKKworU2VlIHBuZ3Rlc3QuYyBmb3IgYSB3b3JraW5nIGV4YW1wbGUuICBZb3VyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCitiZWZvcmUgYW55IG9mIHRoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgYXJlIHByb2Nlc3NlZC4KKworWW91IGNhbiBhbHNvIHNldCB1cCBhIHBvaW50ZXIgdG8gYSB1c2VyIHN0cnVjdHVyZSBmb3IgdXNlIGJ5IHlvdXIKK2NhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvKHBuZ19wdHIsIHVzZXJfcHRyLCAwLCAwKTsKKworVGhlIHVzZXJfY2hhbm5lbHMgYW5kIHVzZXJfZGVwdGggcGFyYW1ldGVycyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSBpZ25vcmVkCit3aGVuIHdyaXRpbmc7IHlvdSBjYW4gc2V0IHRoZW0gdG8gemVybyBhcyBzaG93bi4KKworWW91IGNhbiByZXRyaWV2ZSB0aGUgcG9pbnRlciB2aWEgdGhlIGZ1bmN0aW9uIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKCkuCitGb3IgZXhhbXBsZToKKworICAgIHZvaWRwIHdyaXRlX3VzZXJfdHJhbnNmb3JtX3B0ciA9CisgICAgICAgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIocG5nX3B0cik7CisKK0l0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbGlicG5nIGZsdXNoIGFueSBwZW5kaW5nIG91dHB1dCwgZWl0aGVyIG1hbnVhbGx5LAorb3IgYXV0b21hdGljYWxseSBhZnRlciBhIGNlcnRhaW4gbnVtYmVyIG9mIGxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLiAgVG8KK2ZsdXNoIHRoZSBvdXRwdXQgc3RyZWFtIGEgc2luZ2xlIHRpbWUgY2FsbDoKKworICAgIHBuZ193cml0ZV9mbHVzaChwbmdfcHRyKTsKKworYW5kIHRvIGhhdmUgbGlicG5nIGZsdXNoIHRoZSBvdXRwdXQgc3RyZWFtIHBlcmlvZGljYWxseSBhZnRlciBhIGNlcnRhaW4KK251bWJlciBvZiBzY2FubGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4sIGNhbGw6CisKKyAgICBwbmdfc2V0X2ZsdXNoKHBuZ19wdHIsIG5yb3dzKTsKKworTm90ZSB0aGF0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHJvd3MgaXMgZnJvbSB0aGUgbGFzdCB0aW1lIHBuZ193cml0ZV9mbHVzaCgpCit3YXMgY2FsbGVkLCBvciB0aGUgZmlyc3Qgcm93IG9mIHRoZSBpbWFnZSBpZiBpdCBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQuCitTbyBpZiB5b3Ugd3JpdGUgNTAgbGluZXMsIGFuZCB0aGVuIHBuZ19zZXRfZmx1c2ggMjUsIGl0IHdpbGwgZmx1c2ggdGhlCitvdXRwdXQgb24gdGhlIG5leHQgc2NhbmxpbmUsIGFuZCBldmVyeSAyNSBsaW5lcyB0aGVyZWFmdGVyLCB1bmxlc3MKK3BuZ193cml0ZV9mbHVzaCgpIGlzIGNhbGxlZCBiZWZvcmUgMjUgbW9yZSBsaW5lcyBoYXZlIGJlZW4gd3JpdHRlbi4KK0lmIG5yb3dzIGlzIHRvbyBzbWFsbCAobGVzcyB0aGFuIGFib3V0IDEwIGxpbmVzIGZvciBhIDY0MCBwaXhlbCB3aWRlCitSR0IgaW1hZ2UpIHRoZSBpbWFnZSBjb21wcmVzc2lvbiBtYXkgZGVjcmVhc2Ugbm90aWNlYWJseSAoYWx0aG91Z2ggdGhpcworbWF5IGJlIGFjY2VwdGFibGUgZm9yIHJlYWwtdGltZSBhcHBsaWNhdGlvbnMpLiAgSW5mcmVxdWVudCBmbHVzaGluZyB3aWxsCitvbmx5IGRlZ3JhZGUgdGhlIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlIGJ5IGEgZmV3IHBlcmNlbnQgb3ZlciBpbWFnZXMKK3RoYXQgZG8gbm90IHVzZSBmbHVzaGluZy4KKworLlNTIFdyaXRpbmcgdGhlIGltYWdlIGRhdGEKKworVGhhdCdzIGl0IGZvciB0aGUgdHJhbnNmb3JtYXRpb25zLiAgTm93IHlvdSBjYW4gd3JpdGUgdGhlIGltYWdlIGRhdGEuCitUaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgaW4gb25lIGZ1bmN0aW9uIGNhbGwuICBJZiB5b3UgaGF2ZSB0aGUKK3dob2xlIGltYWdlIGluIG1lbW9yeSwgeW91IGNhbiBqdXN0IGNhbGwgcG5nX3dyaXRlX2ltYWdlKCkgYW5kIGxpYnBuZword2lsbCB3cml0ZSB0aGUgaW1hZ2UuICBZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8KK2VhY2ggcm93LiAgVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW50ZXJsYWNpbmcsIHNvIHlvdSBkb24ndAorbmVlZCB0byBjYWxsIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgb3IgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlCit0aW1lcywgb3IgYW55IG9mIHRoYXQgb3RoZXIgc3R1ZmYgbmVjZXNzYXJ5IHdpdGggcG5nX3dyaXRlX3Jvd3MoKS4KKworICAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOworCit3aGVyZSByb3dfcG9pbnRlcnMgaXM6CisKKyAgICBwbmdfYnl0ZSAqcm93X3BvaW50ZXJzW2hlaWdodF07CisKK1lvdSBjYW4gcG9pbnQgdG8gdm9pZCBvciBjaGFyIG9yIHdoYXRldmVyIHlvdSB1c2UgZm9yIHBpeGVscy4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gd3JpdGUgdGhlIHdob2xlIGltYWdlIGF0IG9uY2UsIHlvdSBjYW4KK3VzZSBwbmdfd3JpdGVfcm93cygpIGluc3RlYWQuICBJZiB0aGUgZmlsZSBpcyBub3QgaW50ZXJsYWNlZCwKK3RoaXMgaXMgc2ltcGxlOgorCisgICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLAorICAgICAgIG51bWJlcl9vZl9yb3dzKTsKKworcm93X3BvaW50ZXJzIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBwbmdfd3JpdGVfaW1hZ2UoKSBjYWxsLgorCitJZiB5b3UgYXJlIGp1c3Qgd3JpdGluZyBvbmUgcm93IGF0IGEgdGltZSwgeW91IGNhbiBkbyB0aGlzIHdpdGgKK2Egc2luZ2xlIHJvd19wb2ludGVyIGluc3RlYWQgb2YgYW4gYXJyYXkgb2Ygcm93X3BvaW50ZXJzOgorCisgICAgcG5nX2J5dGVwIHJvd19wb2ludGVyID0gcm93OworCisgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCByb3dfcG9pbnRlcik7CisKK1doZW4gdGhlIGZpbGUgaXMgaW50ZXJsYWNlZCwgdGhpbmdzIGNhbiBnZXQgYSBnb29kIGRlYWwgbW9yZSBjb21wbGljYXRlZC4KK1RoZSBvbmx5IGN1cnJlbnRseSAoYXMgb2YgdGhlIFBORyBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLCBkYXRlZCBKdWx5CisxOTk5KSBkZWZpbmVkIGludGVybGFjaW5nIHNjaGVtZSBmb3IgUE5HIGZpbGVzIGlzIHRoZSAiQWRhbTciIGludGVybGFjZQorc2NoZW1lLCB0aGF0IGJyZWFrcyBkb3duIGFuIGltYWdlIGludG8gc2V2ZW4gc21hbGxlciBpbWFnZXMgb2YgdmFyeWluZworc2l6ZS4gIGxpYnBuZyB3aWxsIGJ1aWxkIHRoZXNlIGltYWdlcyBmb3IgeW91LCBvciB5b3UgY2FuIGRvIHRoZW0KK3lvdXJzZWxmLiAgSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlbSB5b3Vyc2VsZiwgc2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbgorZm9yIGRldGFpbHMgb2Ygd2hpY2ggcGl4ZWxzIHRvIHdyaXRlIHdoZW4uCisKK0lmIHlvdSBkb24ndCB3YW50IGxpYnBuZyB0byBoYW5kbGUgdGhlIGludGVybGFjaW5nIGRldGFpbHMsIGp1c3QKK3VzZSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIGFuZCBjYWxsIHBuZ193cml0ZV9yb3dzKCkgdGhlCitjb3JyZWN0IG51bWJlciBvZiB0aW1lcyB0byB3cml0ZSBhbGwgc2V2ZW4gc3ViLWltYWdlcy4KKworSWYgeW91IHdhbnQgbGlicG5nIHRvIGJ1aWxkIHRoZSBzdWItaW1hZ2VzLCBjYWxsIHRoaXMgYmVmb3JlIHlvdSBzdGFydAord3JpdGluZyBhbnkgcm93czoKKworICAgIG51bWJlcl9vZl9wYXNzZXMgPQorICAgICAgIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOworCitUaGlzIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFzc2VzIG5lZWRlZC4gIEN1cnJlbnRseSwgdGhpcyBpcyBzZXZlbiwKK2J1dCBtYXkgY2hhbmdlIGlmIGFub3RoZXIgaW50ZXJsYWNlIHR5cGUgaXMgYWRkZWQuCisKK1RoZW4gd3JpdGUgdGhlIGNvbXBsZXRlIGltYWdlIG51bWJlcl9vZl9wYXNzZXMgdGltZXMuCisKKyAgICBwbmdfd3JpdGVfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsCisgICAgICAgbnVtYmVyX29mX3Jvd3MpOworCitBcyBzb21lIG9mIHRoZXNlIHJvd3MgYXJlIG5vdCB1c2VkLCBhbmQgdGh1cyByZXR1cm4gaW1tZWRpYXRlbHksIHlvdSBtYXkKK3dhbnQgdG8gcmVhZCBhYm91dCBpbnRlcmxhY2luZyBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24sIGFuZCBvbmx5IHVwZGF0ZQordGhlIHJvd3MgdGhhdCBhcmUgYWN0dWFsbHkgdXNlZC4KKworLlNTIEZpbmlzaGluZyBhIHNlcXVlbnRpYWwgd3JpdGUKKworQWZ0ZXIgeW91IGFyZSBmaW5pc2hlZCB3cml0aW5nIHRoZSBpbWFnZSwgeW91IHNob3VsZCBmaW5pc2ggd3JpdGluZwordGhlIGZpbGUuICBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gd3JpdGluZyBjb21tZW50cyBvciB0aW1lLCB5b3Ugc2hvdWxkCitwYXNzIGFuIGFwcHJvcHJpYXRlbHkgZmlsbGVkIHBuZ19pbmZvIHBvaW50ZXIuICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkLAoreW91IGNhbiBwYXNzIE5VTEwuCisKKyAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKKworV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSBjYW4gZnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgbGlicG5nIGxpa2UgdGhpczoKKworICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmRpdmlkdWFsbHkgZnJlZSB0aGUgaW5mb19wdHIgbWVtYmVycyB0aGF0Citwb2ludCB0byBsaWJwbmctYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorCisgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgbWFzaywgc2VxKQorICAgIG1hc2sgIC0gaWRlbnRpZmllcyBkYXRhIHRvIGJlIGZyZWVkLCBhIG1hc2sKKyAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygb25lIG9yCisgICAgICAgICAgICBtb3JlIG9mCisgICAgICAgICAgICAgIFBOR19GUkVFX1BMVEUsIFBOR19GUkVFX1RSTlMsCisgICAgICAgICAgICAgIFBOR19GUkVFX0hJU1QsIFBOR19GUkVFX0lDQ1AsCisgICAgICAgICAgICAgIFBOR19GUkVFX1BDQUwsIFBOR19GUkVFX1JPV1MsCisgICAgICAgICAgICAgIFBOR19GUkVFX1NDQUwsIFBOR19GUkVFX1NQTFQsCisgICAgICAgICAgICAgIFBOR19GUkVFX1RFWFQsIFBOR19GUkVFX1VOS04sCisgICAgICAgICAgICBvciBzaW1wbHkgUE5HX0ZSRUVfQUxMCisgICAgc2VxICAgLSBzZXF1ZW5jZSBudW1iZXIgb2YgaXRlbSB0byBiZSBmcmVlZAorICAgICAgICAgICAgKC0xIGZvciBhbGwgaXRlbXMpCisKK1RoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSBjYWxsZWQgd2hlbiB0aGUgcmVsZXZhbnQgc3RvcmFnZSBoYXMKK2FscmVhZHkgYmVlbiBmcmVlZCwgb3IgaGFzIG5vdCB5ZXQgYmVlbiBhbGxvY2F0ZWQsIG9yIHdhcyBhbGxvY2F0ZWQKK2J5IHRoZSB1c2VyICBhbmQgbm90IGJ5IGxpYnBuZywgIGFuZCB3aWxsIGluIHRob3NlIGNhc2VzIGRvIG5vdGhpbmcuCitUaGUgInNlcSIgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaWYgb25seSBvbmUgaXRlbSBvZiB0aGUgc2VsZWN0ZWQgZGF0YQordHlwZSwgc3VjaCBhcyBQTFRFLCBpcyBhbGxvd2VkLiAgSWYgInNlcSIgaXMgbm90IC0xLCBhbmQgbXVsdGlwbGUgaXRlbXMKK2FyZSBhbGxvd2VkIGZvciB0aGUgZGF0YSB0eXBlIGlkZW50aWZpZWQgaW4gdGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvcgorc1BMVCwgb25seSB0aGUgbid0aCBpdGVtIGluIHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCisKK0lmIHlvdSBhbGxvY2F0ZWQgZGF0YSBzdWNoIGFzIGEgcGFsZXR0ZSB0aGF0IHlvdSBwYXNzZWQgaW4gdG8gbGlicG5nCit3aXRoIHBuZ19zZXRfKiwgeW91IG11c3Qgbm90IGZyZWUgaXQgdW50aWwganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8KK3BuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpLgorCitUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBvbmx5IHRvIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseQorYnkgbGlicG5nLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCwgc28gdGhhdCBsaWJwbmcgd2lsbCBub3QgZnJlZSB0aGUgZGF0YSwKK29yIHNvIHRoYXQgaXQgd2lsbCBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIHdpdGggcG5nX21hbGxvYygpCitvciBwbmdfemFsbG9jKCkgYW5kIHBhc3NlZCBpbiB2aWEgYSBwbmdfc2V0XyooKSBmdW5jdGlvbiwgd2l0aAorCisgICAgcG5nX2RhdGFfZnJlZXIocG5nX3B0ciwgaW5mb19wdHIsIGZyZWVyLCBtYXNrKQorICAgIG1hc2sgICAtIHdoaWNoIGRhdGEgZWxlbWVudHMgYXJlIGFmZmVjdGVkCisgICAgICAgICAgICAgc2FtZSBjaG9pY2VzIGFzIGluIHBuZ19mcmVlX2RhdGEoKQorICAgIGZyZWVyICAtIG9uZSBvZgorICAgICAgICAgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEKKyAgICAgICAgICAgICAgIFBOR19TRVRfV0lMTF9GUkVFX0RBVEEKKyAgICAgICAgICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBCisKK0ZvciBleGFtcGxlLCB0byB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3Igc29tZSBkYXRhIGZyb20gYSByZWFkIHN0cnVjdHVyZQordG8gYSB3cml0ZSBzdHJ1Y3R1cmUsIHlvdSBjb3VsZCB1c2UKKworICAgIHBuZ19kYXRhX2ZyZWVyKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLAorICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBLAorICAgICAgIFBOR19GUkVFX1BMVEV8UE5HX0ZSRUVfdFJOU3xQTkdfRlJFRV9oSVNUKQorICAgIHBuZ19kYXRhX2ZyZWVyKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsCisgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEsCisgICAgICAgUE5HX0ZSRUVfUExURXxQTkdfRlJFRV90Uk5TfFBOR19GUkVFX2hJU1QpCisKK3RoZXJlYnkgYnJpZWZseSByZWFzc2lnbmluZyByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0byB0aGUgdXNlciBidXQKK2ltbWVkaWF0ZWx5IGFmdGVyd2FyZHMgcmVhc3NpZ25pbmcgaXQgb25jZSBtb3JlIHRvIHRoZSB3cml0ZV9kZXN0cm95CitmdW5jdGlvbi4gIEhhdmluZyBkb25lIHRoaXMsIGl0IHdvdWxkIHRoZW4gYmUgc2FmZSB0byBkZXN0cm95IHRoZSByZWFkCitzdHJ1Y3R1cmUgYW5kIGNvbnRpbnVlIHRvIHVzZSB0aGUgUExURSwgdFJOUywgYW5kIGhJU1QgZGF0YSBpbiB0aGUgd3JpdGUKK3N0cnVjdHVyZS4KKworVGhpcyBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgorWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYWZ0ZXIgdGhlIHBuZ19zZXRfKigpIGZ1bmN0aW9ucwordG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG9yIHBuZ19kZXN0cm95XyooKSBpcyBzdXBwb3NlZCB0byBmcmVlIHRoZSBkYXRhLgorV2hlbiB0aGUgdXNlciBhc3N1bWVzIHJlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZQorYXBwbGljYXRpb24gbXVzdCB1c2UKK3BuZ19mcmVlKCkgdG8gZnJlZSBpdCwgYW5kIHdoZW4gdGhlIHVzZXIgdHJhbnNmZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGxpYnBuZworZm9yIGRhdGEgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkLCB0aGUgdXNlciBtdXN0IGhhdmUgdXNlZCBwbmdfbWFsbG9jKCkKK29yIHBuZ196YWxsb2MoKSB0byBhbGxvY2F0ZSBpdC4KKworSWYgeW91IGFsbG9jYXRlZCB0ZXh0X3B0ci50ZXh0LCB0ZXh0X3B0ci5sYW5nLCBhbmQgdGV4dF9wdHIudHJhbnNsYXRlZF9rZXl3b3JkCitzZXBhcmF0ZWx5LCBkbyBub3QgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGV4dF9wdHIgdG8gbGlicG5nLAorYmVjYXVzZSB3aGVuIGxpYnBuZyBmaWxscyBhIHBuZ190ZXh0IHN0cnVjdHVyZSBpdCBjb21iaW5lcyB0aGVzZSBtZW1iZXJzIHdpdGgKK3RoZSBrZXkgbWVtYmVyLCBhbmQgcG5nX2ZyZWVfZGF0YSgpIHdpbGwgZnJlZSBvbmx5IHRleHRfcHRyLmtleS4gIFNpbWlsYXJseSwKK2lmIHlvdSB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZSdpbmcgdGV4dF9wdHIgZnJvbSBsaWJwbmcgdG8geW91cgorYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gbXVzdCBub3Qgc2VwYXJhdGVseSBmcmVlIHRob3NlIG1lbWJlcnMuCitGb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiB3cml0aW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgorCisuU0ggVi4gTW9kaWZ5aW5nL0N1c3RvbWl6aW5nIGxpYnBuZzoKKworVGhlcmUgYXJlIHR3byBpc3N1ZXMgaGVyZS4gIFRoZSBmaXJzdCBpcyBjaGFuZ2luZyBob3cgbGlicG5nIGRvZXMKK3N0YW5kYXJkIHRoaW5ncyBsaWtlIG1lbW9yeSBhbGxvY2F0aW9uLCBpbnB1dC9vdXRwdXQsIGFuZCBlcnJvciBoYW5kbGluZy4KK1RoZSBzZWNvbmQgZGVhbHMgd2l0aCBtb3JlIGNvbXBsaWNhdGVkIHRoaW5ncyBsaWtlIGFkZGluZyBuZXcgY2h1bmtzLAorYWRkaW5nIG5ldyB0cmFuc2Zvcm1hdGlvbnMsIGFuZCBnZW5lcmFsbHkgY2hhbmdpbmcgaG93IGxpYnBuZyB3b3Jrcy4KK0JvdGggb2YgdGhvc2UgYXJlIGNvbXBpbGUtdGltZSBpc3N1ZXM7IHRoYXQgaXMsIHRoZXkgYXJlIGdlbmVyYWxseQorZGV0ZXJtaW5lZCBhdCB0aGUgdGltZSB0aGUgY29kZSBpcyB3cml0dGVuLCBhbmQgdGhlcmUgaXMgcmFyZWx5IGEgbmVlZAordG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGEgbWVhbnMgb2YgY2hhbmdpbmcgdGhlbS4KKworTWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nCisKK0FsbCBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nIGluIGxpYnBuZworZ29lcyB0aHJvdWdoIGNhbGxiYWNrcyB0aGF0IGFyZSB1c2VyLXNldHRhYmxlLiAgVGhlIGRlZmF1bHQgcm91dGluZXMgYXJlCitpbiBwbmdtZW0uYywgcG5ncmlvLmMsIHBuZ3dpby5jLCBhbmQgcG5nZXJyb3IuYywgcmVzcGVjdGl2ZWx5LiAgVG8gY2hhbmdlCit0aGVzZSBmdW5jdGlvbnMsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19zZXRfKl9mbigpIGZ1bmN0aW9uLgorCitNZW1vcnkgYWxsb2NhdGlvbiBpcyBkb25lIHRocm91Z2ggdGhlIGZ1bmN0aW9ucyBwbmdfbWFsbG9jKCksIHBuZ19jYWxsb2MoKSwKK2FuZCBwbmdfZnJlZSgpLiAgVGhlc2UgY3VycmVudGx5IGp1c3QgY2FsbCB0aGUgc3RhbmRhcmQgQyBmdW5jdGlvbnMuCitwbmdfY2FsbG9jKCkgY2FsbHMgcG5nX21hbGxvYygpIGFuZCB0aGVuIHBuZ19tZW1zZXQoKSB0byBjbGVhciB0aGUgbmV3bHkKK2FsbG9jYXRlZCBtZW1vcnkgdG8gemVyby4gIElmIHlvdXIgcG9pbnRlcnMgY2FuJ3QgYWNjZXNzIG1vcmUgdGhlbiA2NEsKK2F0IGEgdGltZSwgeW91IHdpbGwgd2FudCB0byBzZXQgTUFYU0VHXzY0SyBpbiB6bGliLmguICBTaW5jZSBpdCBpcwordW5saWtlbHkgdGhhdCB0aGUgbWV0aG9kIG9mIGhhbmRsaW5nIG1lbW9yeSBhbGxvY2F0aW9uIG9uIGEgcGxhdGZvcm0KK3dpbGwgY2hhbmdlIGJldHdlZW4gYXBwbGljYXRpb25zLCB0aGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBtb2RpZmllZCBpbgordGhlIGxpYnJhcnkgYXQgY29tcGlsZSB0aW1lLiAgSWYgeW91IHByZWZlciB0byB1c2UgYSBkaWZmZXJlbnQgbWV0aG9kCitvZiBhbGxvY2F0aW5nIGFuZCBmcmVlaW5nIGRhdGEsIHlvdSBjYW4gdXNlIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpIG9yCitwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCkgdG8gcmVnaXN0ZXIgeW91ciBvd24gZnVuY3Rpb25zIGFzIGRlc2NyaWJlZAorYWJvdmUuICBUaGVzZSBmdW5jdGlvbnMgYWxzbyBwcm92aWRlIGEgdm9pZCBwb2ludGVyIHRoYXQgY2FuIGJlIHJldHJpZXZlZAordmlhCisKKyAgICBtZW1fcHRyPXBuZ19nZXRfbWVtX3B0cihwbmdfcHRyKTsKKworWW91ciByZXBsYWNlbWVudCBtZW1vcnkgZnVuY3Rpb25zIG11c3QgaGF2ZSBwcm90b3R5cGVzIGFzIGZvbGxvd3M6CisKKyAgICBwbmdfdm9pZHAgbWFsbG9jX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgcG5nX3NpemVfdCBzaXplKTsKKyAgICB2b2lkIGZyZWVfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cik7CisKK1lvdXIgbWFsbG9jX2ZuKCkgbXVzdCByZXR1cm4gTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUuICBUaGUgcG5nX21hbGxvYygpCitmdW5jdGlvbiB3aWxsIG5vcm1hbGx5IGNhbGwgcG5nX2Vycm9yKCkgaWYgaXQgcmVjZWl2ZXMgYSBOVUxMIGZyb20gdGhlCitzeXN0ZW0gbWVtb3J5IGFsbG9jYXRvciBvciBmcm9tIHlvdXIgcmVwbGFjZW1lbnQgbWFsbG9jX2ZuKCkuCisKK1lvdXIgZnJlZV9mbigpIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIHdpdGggYSBOVUxMIHB0ciwgc2luY2UgbGlicG5nJ3MKK3BuZ19mcmVlKCkgY2hlY2tzIGZvciBOVUxMIGJlZm9yZSBjYWxsaW5nIGZyZWVfZm4oKS4KKworSW5wdXQvT3V0cHV0IGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX3JlYWQoKSBhbmQgcG5nX3dyaXRlKCksCit3aGljaCBjdXJyZW50bHkganVzdCBjYWxsIGZyZWFkKCkgYW5kIGZ3cml0ZSgpLiAgVGhlIEZJTEUgKiBpcyBzdG9yZWQgaW4KK3BuZ19zdHJ1Y3QgYW5kIGlzIGluaXRpYWxpemVkIHZpYSBwbmdfaW5pdF9pbygpLiAgSWYgeW91IHdpc2ggdG8gY2hhbmdlCit0aGUgbWV0aG9kIG9mIEkvTywgdGhlIGxpYnJhcnkgc3VwcGxpZXMgY2FsbGJhY2tzIHRoYXQgeW91IGNhbiBzZXQKK3Rocm91Z2ggdGhlIGZ1bmN0aW9uIHBuZ19zZXRfcmVhZF9mbigpIGFuZCBwbmdfc2V0X3dyaXRlX2ZuKCkgYXQgcnVuCit0aW1lLCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlIHBuZ19pbml0X2lvKCkgZnVuY3Rpb24uICBUaGVzZSBmdW5jdGlvbnMKK2Fsc28gcHJvdmlkZSBhIHZvaWQgcG9pbnRlciB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIHRoZSBmdW5jdGlvbgorcG5nX2dldF9pb19wdHIoKS4gIEZvciBleGFtcGxlOgorCisgICAgcG5nX3NldF9yZWFkX2ZuKHBuZ19zdHJ1Y3RwIHJlYWRfcHRyLAorICAgICAgICB2b2lkcCByZWFkX2lvX3B0ciwgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pCisKKyAgICBwbmdfc2V0X3dyaXRlX2ZuKHBuZ19zdHJ1Y3RwIHdyaXRlX3B0ciwKKyAgICAgICAgdm9pZHAgd3JpdGVfaW9fcHRyLCBwbmdfcndfcHRyIHdyaXRlX2RhdGFfZm4sCisgICAgICAgIHBuZ19mbHVzaF9wdHIgb3V0cHV0X2ZsdXNoX2ZuKTsKKworICAgIHZvaWRwIHJlYWRfaW9fcHRyID0gcG5nX2dldF9pb19wdHIocmVhZF9wdHIpOworICAgIHZvaWRwIHdyaXRlX2lvX3B0ciA9IHBuZ19nZXRfaW9fcHRyKHdyaXRlX3B0cik7CisKK1RoZSByZXBsYWNlbWVudCBJL08gZnVuY3Rpb25zIG11c3QgaGF2ZSBwcm90b3R5cGVzIGFzIGZvbGxvd3M6CisKKyAgICB2b2lkIHVzZXJfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCk7CisgICAgdm9pZCB1c2VyX3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICAgICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKKyAgICB2b2lkIHVzZXJfZmx1c2hfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyKTsKKworVGhlIHVzZXJfcmVhZF9kYXRhKCkgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVjdGluZyBhbmQKK2hhbmRsaW5nIGVuZC1vZi1kYXRhIGVycm9ycy4KKworU3VwcGx5aW5nIE5VTEwgZm9yIHRoZSByZWFkLCB3cml0ZSwgb3IgZmx1c2ggZnVuY3Rpb25zIHNldHMgdGhlbSBiYWNrCit0byB1c2luZyB0aGUgZGVmYXVsdCBDIHN0cmVhbSBmdW5jdGlvbnMsIHdoaWNoIGV4cGVjdCB0aGUgaW9fcHRyIHRvCitwb2ludCB0byBhIHN0YW5kYXJkICpGSUxFIHN0cnVjdHVyZS4gIEl0IGlzIHByb2JhYmx5IGEgbWlzdGFrZQordG8gdXNlIE5VTEwgZm9yIG9uZSBvZiB3cml0ZV9kYXRhX2ZuIGFuZCBvdXRwdXRfZmx1c2hfZm4gYnV0IG5vdCBib3RoCitvZiB0aGVtLCB1bmxlc3MgeW91IGhhdmUgYnVpbHQgbGlicG5nIHdpdGggUE5HX05PX1dSSVRFX0ZMVVNIIGRlZmluZWQuCitJdCBpcyBhbiBlcnJvciB0byByZWFkIGZyb20gYSB3cml0ZSBzdHJlYW0sIGFuZCB2aWNlIHZlcnNhLgorCitFcnJvciBoYW5kbGluZyBpbiBsaWJwbmcgaXMgZG9uZSB0aHJvdWdoIHBuZ19lcnJvcigpIGFuZCBwbmdfd2FybmluZygpLgorRXJyb3JzIGhhbmRsZWQgdGhyb3VnaCBwbmdfZXJyb3IoKSBhcmUgZmF0YWwsIG1lYW5pbmcgdGhhdCBwbmdfZXJyb3IoKQorc2hvdWxkIG5ldmVyIHJldHVybiB0byBpdHMgY2FsbGVyLiAgQ3VycmVudGx5LCB0aGlzIGlzIGhhbmRsZWQgdmlhCitzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpICh1bmxlc3MgeW91IGhhdmUgY29tcGlsZWQgbGlicG5nIHdpdGgKK1BOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBoYW5kbGVkIHZpYSBQTkdfQUJPUlQoKSksCitidXQgeW91IGNvdWxkIGNoYW5nZSB0aGlzIHRvIGRvIHRoaW5ncyBsaWtlIGV4aXQoKSBpZiB5b3Ugc2hvdWxkIHdpc2guCisKK09uIG5vbi1mYXRhbCBlcnJvcnMsIHBuZ193YXJuaW5nKCkgaXMgY2FsbGVkCit0byBwcmludCBhIHdhcm5pbmcgbWVzc2FnZSwgYW5kIHRoZW4gY29udHJvbCByZXR1cm5zIHRvIHRoZSBjYWxsaW5nIGNvZGUuCitCeSBkZWZhdWx0IHBuZ19lcnJvcigpIGFuZCBwbmdfd2FybmluZygpIHByaW50IGEgbWVzc2FnZSBvbiBzdGRlcnIgdmlhCitmcHJpbnRmKCkgdW5sZXNzIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggUE5HX05PX0NPTlNPTEVfSU8gZGVmaW5lZAorKGJlY2F1c2UgeW91IGRvbid0IHdhbnQgdGhlIG1lc3NhZ2VzKSBvciBQTkdfTk9fU1RESU8gZGVmaW5lZCAoYmVjYXVzZQorZnByaW50ZigpIGlzbid0IGF2YWlsYWJsZSkuICBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBlcnJvcgorZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkIHRvIHNldCB1cCB5b3VyIG93biBtZXNzYWdlIGNhbGxiYWNrcy4gIFRoZXNlCitmdW5jdGlvbnMgYXJlIG5vcm1hbGx5IHN1cHBsaWVkIGF0IHRoZSB0aW1lIHRoYXQgdGhlIHBuZ19zdHJ1Y3QgaXMgY3JlYXRlZC4KK0l0IGlzIGFsc28gcG9zc2libGUgdG8gcmVkaXJlY3QgZXJyb3JzIGFuZCB3YXJuaW5ncyB0byB5b3VyIG93biByZXBsYWNlbWVudAorZnVuY3Rpb25zIGFmdGVyIHBuZ19jcmVhdGVfKl9zdHJ1Y3QoKSBoYXMgYmVlbiBjYWxsZWQgYnkgY2FsbGluZzoKKworICAgIHBuZ19zZXRfZXJyb3JfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICAgICAgcG5nX3ZvaWRwIGVycm9yX3B0ciwgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwKKyAgICAgICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuKTsKKworICAgIHBuZ192b2lkcCBlcnJvcl9wdHIgPSBwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKTsKKworSWYgTlVMTCBpcyBzdXBwbGllZCBmb3IgZWl0aGVyIGVycm9yX2ZuIG9yIHdhcm5pbmdfZm4sIHRoZW4gdGhlIGxpYnBuZworZGVmYXVsdCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQsIGNhbGxpbmcgZnByaW50ZigpIGFuZC9vciBsb25nam1wKCkgaWYgYQorcHJvYmxlbSBpcyBlbmNvdW50ZXJlZC4gIFRoZSByZXBsYWNlbWVudCBlcnJvciBmdW5jdGlvbnMgc2hvdWxkIGhhdmUKK3BhcmFtZXRlcnMgYXMgZm9sbG93czoKKworICAgIHZvaWQgdXNlcl9lcnJvcl9mbihwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbXNnKTsKKyAgICB2b2lkIHVzZXJfd2FybmluZ19mbihwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tc2cpOworCitUaGUgbW90aXZhdGlvbiBiZWhpbmQgdXNpbmcgc2V0am1wKCkgYW5kIGxvbmdqbXAoKSBpcyB0aGUgQysrIHRocm93IGFuZAorY2F0Y2ggZXhjZXB0aW9uIGhhbmRsaW5nIG1ldGhvZHMuICBUaGlzIG1ha2VzIHRoZSBjb2RlIG11Y2ggZWFzaWVyIHRvIHdyaXRlLAorYXMgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBldmVyeSByZXR1cm4gY29kZSBvZiBldmVyeSBmdW5jdGlvbiBjYWxsLgorSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdW5jZXJ0YWludGllcyBhYm91dCB0aGUgc3RhdHVzIG9mIGxvY2FsIHZhcmlhYmxlcworYWZ0ZXIgYSBsb25nam1wLCBzbyB0aGUgdXNlciBtYXkgd2FudCB0byBiZSBjYXJlZnVsIGFib3V0IGRvaW5nIGFueXRoaW5nCithZnRlciBzZXRqbXAgcmV0dXJucyBub24temVybyBiZXNpZGVzIHJldHVybmluZyBpdHNlbGYuICBDb25zdWx0IHlvdXIKK2NvbXBpbGVyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4gIEZvciBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCwgeW91CittYXkgd2lzaCB0byB1c2UgdGhlICJjZXhjZXB0IiBmYWNpbGl0eSAoc2VlIGh0dHA6Ly9jZXhjZXB0LnNvdXJjZWZvcmdlLm5ldCkuCisKKy5TUyBDdXN0b20gY2h1bmtzCisKK0lmIHlvdSBuZWVkIHRvIHJlYWQgb3Igd3JpdGUgY3VzdG9tIGNodW5rcywgeW91IG1heSBuZWVkIHRvIGdldCBkZWVwZXIKK2ludG8gdGhlIGxpYnBuZyBjb2RlLiAgVGhlIGxpYnJhcnkgbm93IGhhcyBtZWNoYW5pc21zIGZvciBzdG9yaW5nCithbmQgd3JpdGluZyBjaHVua3Mgb2YgdW5rbm93biB0eXBlOyB5b3UgY2FuIGV2ZW4gZGVjbGFyZSBjYWxsYmFja3MKK2ZvciBjdXN0b20gY2h1bmtzLiAgSG93ZXZlciwgdGhpcyBtYXkgbm90IGJlIGdvb2QgZW5vdWdoIGlmIHRoZQorbGlicmFyeSBjb2RlIGl0c2VsZiBuZWVkcyB0byBrbm93IGFib3V0IGludGVyYWN0aW9ucyBiZXR3ZWVuIHlvdXIKK2NodW5rIGFuZCBleGlzdGluZyBgaW50cmluc2ljJyBjaHVua3MuCisKK0lmIHlvdSBuZWVkIHRvIHdyaXRlIGEgbmV3IGludHJpbnNpYyBjaHVuaywgZmlyc3QgcmVhZCB0aGUgUE5HCitzcGVjaWZpY2F0aW9uLiBBY3F1aXJlIGEgZmlyc3QgbGV2ZWwgb2YgdW5kZXJzdGFuZGluZyBvZiBob3cgaXQgd29ya3MuCitQYXkgcGFydGljdWxhciBhdHRlbnRpb24gdG8gdGhlIHNlY3Rpb25zIHRoYXQgZGVzY3JpYmUgY2h1bmsgbmFtZXMsCithbmQgbG9vayBhdCBob3cgb3RoZXIgY2h1bmtzIHdlcmUgZGVzaWduZWQsIHNvIHlvdSBjYW4gZG8gdGhpbmdzCitzaW1pbGFybHkuICBTZWNvbmQsIGNoZWNrIG91dCB0aGUgc2VjdGlvbnMgb2YgbGlicG5nIHRoYXQgcmVhZCBhbmQKK3dyaXRlIGNodW5rcy4gIFRyeSB0byBmaW5kIGEgY2h1bmsgdGhhdCBpcyBzaW1pbGFyIHRvIHlvdXJzIGFuZCB1c2UKK2l0IGFzIGEgdGVtcGxhdGUuICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBjb21tZW50cyBpbnNpZGUKK3RoZSBjb2RlLiAgSXQgaXMgYmVzdCB0byBoYW5kbGUgdW5rbm93biBjaHVua3MgaW4gYSBnZW5lcmljIG1ldGhvZCwKK3ZpYSBjYWxsYmFjayBmdW5jdGlvbnMsIGluc3RlYWQgb2YgYnkgbW9kaWZ5aW5nIGxpYnBuZyBmdW5jdGlvbnMuCisKK0lmIHlvdSB3aXNoIHRvIHdyaXRlIHlvdXIgb3duIHRyYW5zZm9ybWF0aW9uIGZvciB0aGUgZGF0YSwgbG9vayB0aHJvdWdoCit0aGUgcGFydCBvZiB0aGUgY29kZSB0aGF0IGRvZXMgdGhlIHRyYW5zZm9ybWF0aW9ucywgYW5kIGNoZWNrIG91dCBzb21lIG9mCit0aGUgc2ltcGxlciBvbmVzIHRvIGdldCBhbiBpZGVhIG9mIGhvdyB0aGV5IHdvcmsuICBUcnkgdG8gZmluZCBhIHNpbWlsYXIKK3RyYW5zZm9ybWF0aW9uIHRvIHRoZSBvbmUgeW91IHdhbnQgdG8gYWRkIGFuZCBjb3B5IG9mZiBvZiBpdC4gIE1vcmUgZGV0YWlscworY2FuIGJlIGZvdW5kIGluIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGNvZGUgaXRzZWxmLgorCisuU1MgQ29uZmlndXJpbmcgZm9yIDE2IGJpdCBwbGF0Zm9ybXMKKworWW91IHdpbGwgd2FudCB0byBsb29rIGludG8gemNvbmYuaCB0byB0ZWxsIHpsaWIgKGFuZCB0aHVzIGxpYnBuZykgdGhhdAoraXQgY2Fubm90IGFsbG9jYXRlIG1vcmUgdGhlbiA2NEsgYXQgYSB0aW1lLiAgRXZlbiBpZiB5b3UgY2FuLCB0aGUgbWVtb3J5Cit3b24ndCBiZSBhY2Nlc3NpYmxlLiAgU28gbGltaXQgemxpYiBhbmQgbGlicG5nIHRvIDY0SyBieSBkZWZpbmluZyBNQVhTRUdfNjRLLgorCisuU1MgQ29uZmlndXJpbmcgZm9yIERPUworCitGb3IgRE9TIHVzZXJzIHdobyBvbmx5IGhhdmUgYWNjZXNzIHRvIHRoZSBsb3dlciA2NDBLLCB5b3Ugd2lsbAoraGF2ZSB0byBsaW1pdCB6bGliJ3MgbWVtb3J5IHVzYWdlIHZpYSBhIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKCkKK2NhbGwuICBTZWUgemxpYi5oIG9yIHpjb25mLmggaW4gdGhlIHpsaWIgbGlicmFyeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworLlNTIENvbmZpZ3VyaW5nIGZvciBNZWRpdW0gTW9kZWwKKworTGlicG5nJ3Mgc3VwcG9ydCBmb3IgbWVkaXVtIG1vZGVsIGhhcyBiZWVuIHRlc3RlZCBvbiBtb3N0IG9mIHRoZSBwb3B1bGFyCitjb21waWxlcnMuICBNYWtlIHN1cmUgTUFYU0VHXzY0SyBnZXRzIGRlZmluZWQsIFVTRV9GQVJfS0VZV09SRCBnZXRzCitkZWZpbmVkLCBhbmQgRkFSIGdldHMgZGVmaW5lZCB0byBmYXIgaW4gcG5nY29uZi5oLCBhbmQgeW91IHNob3VsZCBiZQorYWxsIHNldC4gIEV2ZXJ5dGhpbmcgaW4gdGhlIGxpYnJhcnkgKGV4Y2VwdCBmb3IgemxpYidzIHN0cnVjdHVyZSkgaXMKK2V4cGVjdGluZyBmYXIgZGF0YS4gIFlvdSBtdXN0IHVzZSB0aGUgdHlwZWRlZnMgd2l0aCB0aGUgcCBvciBwcCBvbgordGhlIGVuZCBmb3IgcG9pbnRlcnMgKG9yIGF0IGxlYXN0IGxvb2sgYXQgdGhlbSBhbmQgYmUgY2FyZWZ1bCkuICBNYWtlCitub3RlIHRoYXQgdGhlIHJvd3Mgb2YgZGF0YSBhcmUgZGVmaW5lZCBhcyBwbmdfYnl0ZXBwLCB3aGljaCBpcyBhbgordW5zaWduZWQgY2hhciBmYXIgKiBmYXIgKi4KKworLlNTIENvbmZpZ3VyaW5nIGZvciBndWkvd2luZG93aW5nIHBsYXRmb3JtczoKKworWW91IHdpbGwgbmVlZCB0byB3cml0ZSBuZXcgZXJyb3IgYW5kIHdhcm5pbmcgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZSBHVUkKK2ludGVyZmFjZSwgYXMgZGVzY3JpYmVkIHByZXZpb3VzbHksIGFuZCBzZXQgdGhlbSB0byBiZSB0aGUgZXJyb3IgYW5kCit3YXJuaW5nIGZ1bmN0aW9ucyBhdCB0aGUgdGltZSB0aGF0IHBuZ19jcmVhdGVfKl9zdHJ1Y3QoKSBpcyBjYWxsZWQsCitpbiBvcmRlciB0byBoYXZlIHRoZW0gYXZhaWxhYmxlIGR1cmluZyB0aGUgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLgorVGhleSBjYW4gYmUgY2hhbmdlZCBsYXRlciB2aWEgcG5nX3NldF9lcnJvcl9mbigpLiAgT24gc29tZSBjb21waWxlcnMsCit5b3UgbWF5IGFsc28gaGF2ZSB0byBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0b3JzIChwbmdfbWFsbG9jLCBldGMuKS4KKworLlNTIENvbmZpZ3VyaW5nIGZvciBjb21waWxlciB4eHg6CisKK0FsbCBpbmNsdWRlcyBmb3IgbGlicG5nIGFyZSBpbiBwbmdjb25mLmguICBJZiB5b3UgbmVlZCB0byBhZGQsIGNoYW5nZQorb3IgZGVsZXRlIGFuIGluY2x1ZGUsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorVGhlIGluY2x1ZGVzIHRoYXQgYXJlIG5vdCBuZWVkZWQgb3V0c2lkZSBsaWJwbmcgYXJlIHByb3RlY3RlZCBieSB0aGUKK1BOR19JTlRFUk5BTCBkZWZpbml0aW9uLCB3aGljaCBpcyBvbmx5IGRlZmluZWQgZm9yIHRob3NlIHJvdXRpbmVzIGluc2lkZQorbGlicG5nIGl0c2VsZi4gIFRoZSBmaWxlcyBpbiBsaWJwbmcgcHJvcGVyIG9ubHkgaW5jbHVkZSBwbmcuaCwgd2hpY2gKK2luY2x1ZGVzIHBuZ2NvbmYuaC4KKworLlNTIENvbmZpZ3VyaW5nIHpsaWI6CisKK1RoZXJlIGFyZSBzcGVjaWFsIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgdGhlIGNvbXByZXNzaW9uLiAgUGVyaGFwcyB0aGUKK21vc3QgdXNlZnVsIG9uZSBjaGFuZ2VzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCwgd2hpY2ggY3VycmVudGx5IHVzZXMKK2lucHV0IGNvbXByZXNzaW9uIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMCAtIDkuICBUaGUgbGlicmFyeSBub3JtYWxseQordXNlcyB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCAoWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gNikuICBUZXN0cworaGF2ZSBzaG93biB0aGF0IGZvciBhIGxhcmdlIG1ham9yaXR5IG9mIGltYWdlcywgY29tcHJlc3Npb24gdmFsdWVzIGluCit0aGUgcmFuZ2UgMy02IGNvbXByZXNzIG5lYXJseSBhcyB3ZWxsIGFzIGhpZ2hlciBsZXZlbHMsIGFuZCBkbyBzbyBtdWNoCitmYXN0ZXIuICBGb3Igb25saW5lIGFwcGxpY2F0aW9ucyBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGhhdmUgbWF4aW11bSBzcGVlZAorKFpfQkVTVF9TUEVFRCA9IDEpLiAgV2l0aCB2ZXJzaW9ucyBvZiB6bGliIGFmdGVyIHYwLjk5LCB5b3UgY2FuIGFsc28KK3NwZWNpZnkgbm8gY29tcHJlc3Npb24gKFpfTk9fQ09NUFJFU1NJT04gPSAwKSwgYnV0IHRoaXMgd291bGQgY3JlYXRlCitmaWxlcyBsYXJnZXIgdGhhbiBqdXN0IHN0b3JpbmcgdGhlIHJhdyBiaXRtYXAuICBZb3UgY2FuIHNwZWNpZnkgdGhlCitjb21wcmVzc2lvbiBsZXZlbCBieSBjYWxsaW5nOgorCisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbChwbmdfcHRyLCBsZXZlbCk7CisKK0Fub3RoZXIgdXNlZnVsIG9uZSBpcyB0byByZWR1Y2UgdGhlIG1lbW9yeSBsZXZlbCB1c2VkIGJ5IHRoZSBsaWJyYXJ5LgorVGhlIG1lbW9yeSBsZXZlbCBkZWZhdWx0cyB0byA4LCBidXQgaXQgY2FuIGJlIGxvd2VyZWQgaWYgeW91IGFyZQorc2hvcnQgb24gbWVtb3J5IChydW5uaW5nIERPUywgZm9yIGV4YW1wbGUsIHdoZXJlIHlvdSBvbmx5IGhhdmUgNjQwSykuCitOb3RlIHRoYXQgdGhlIG1lbW9yeSBsZXZlbCBkb2VzIGhhdmUgYW4gZWZmZWN0IG9uIGNvbXByZXNzaW9uOyBhbW9uZworb3RoZXIgdGhpbmdzLCBsb3dlciBsZXZlbHMgd2lsbCByZXN1bHQgaW4gc2VjdGlvbnMgb2YgaW5jb21wcmVzc2libGUKK2RhdGEgYmVpbmcgZW1pdHRlZCBpbiBzbWFsbGVyIHN0b3JlZCBibG9ja3MsIHdpdGggYSBjb3JyZXNwb25kaW5nbHkKK2xhcmdlciByZWxhdGl2ZSBvdmVyaGVhZCBvZiB1cCB0byAxNSUgaW4gdGhlIHdvcnN0IGNhc2UuCisKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCBsZXZlbCk7CisKK1RoZSBvdGhlciBmdW5jdGlvbnMgYXJlIGZvciBjb25maWd1cmluZyB6bGliLiAgVGhleSBhcmUgbm90IHJlY29tbWVuZGVkCitmb3Igbm9ybWFsIHVzZSBhbmQgbWF5IHJlc3VsdCBpbiB3cml0aW5nIGFuIGludmFsaWQgUE5HIGZpbGUuICBTZWUKK3psaWIuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aGF0IHRoZXNlIG1lYW4uCisKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCisgICAgICAgIHN0cmF0ZWd5KTsKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzKHBuZ19wdHIsCisgICAgICAgIHdpbmRvd19iaXRzKTsKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfcHRyLCBtZXRob2QpOworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgc2l6ZSk7CisKKy5TUyBDb250cm9sbGluZyByb3cgZmlsdGVyaW5nCisKK0lmIHlvdSB3YW50IHRvIGNvbnRyb2wgd2hldGhlciBsaWJwbmcgdXNlcyBmaWx0ZXJpbmcgb3Igbm90LCB3aGljaAorZmlsdGVycyBhcmUgdXNlZCwgYW5kIGhvdyBpdCBnb2VzIGFib3V0IHBpY2tpbmcgcm93IGZpbHRlcnMsIHlvdQorY2FuIGNhbGwgb25lIG9mIHRoZXNlIGZ1bmN0aW9ucy4gIFRoZSBzZWxlY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24KK29mIHJvdyBmaWx0ZXJzIGNhbiBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBzaXplIGFuZAorZW5jb2Rpbmcgc3BlZWQgYW5kIGEgc29tZXdoYXQgbGVzc2VyIGltcGFjdCBvbiB0aGUgZGVjb2Rpbmcgc3BlZWQKK29mIGFuIGltYWdlLiAgRmlsdGVyaW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgUkdCIGFuZCBncmF5c2NhbGUKK2ltYWdlcyAod2l0aCBhbmQgd2l0aG91dCBhbHBoYSksIGJ1dCBub3QgZm9yIHBhbGV0dGVkIGltYWdlcyBub3IKK2ZvciBhbnkgaW1hZ2VzIHdpdGggYml0IGRlcHRocyBsZXNzIHRoYW4gOCBiaXRzL3BpeGVsLgorCitUaGUgJ21ldGhvZCcgcGFyYW1ldGVyIHNldHMgdGhlIG1haW4gZmlsdGVyaW5nIG1ldGhvZCwgd2hpY2ggaXMKK2N1cnJlbnRseSBvbmx5ICcwJyBpbiB0aGUgUE5HIDEuMiBzcGVjaWZpY2F0aW9uLiAgVGhlICdmaWx0ZXJzJworcGFyYW1ldGVyIHNldHMgd2hpY2ggZmlsdGVyKHMpLCBpZiBhbnksIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoCitzY2FubGluZS4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgUE5HX0FMTF9GSUxURVJTIGFuZCBQTkdfTk9fRklMVEVSUwordG8gdHVybiBmaWx0ZXJpbmcgb24gYW5kIG9mZiwgcmVzcGVjdGl2ZWx5LgorCitJbmRpdmlkdWFsIGZpbHRlciB0eXBlcyBhcmUgUE5HX0ZJTFRFUl9OT05FLCBQTkdfRklMVEVSX1NVQiwKK1BOR19GSUxURVJfVVAsIFBOR19GSUxURVJfQVZHLCBQTkdfRklMVEVSX1BBRVRILCB3aGljaCBjYW4gYmUgYml0d2lzZQorT1JlZCB0b2dldGhlciB3aXRoICd8JyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbHRlcnMgdG8gdXNlLgorVGhlc2UgZmlsdGVycyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbi4KK0lmIHlvdSBpbnRlbmQgdG8gY2hhbmdlIHRoZSBmaWx0ZXIgdHlwZSBkdXJpbmcgdGhlIGNvdXJzZSBvZiB3cml0aW5nCit0aGUgaW1hZ2UsIHlvdSBzaG91bGQgc3RhcnQgd2l0aCBmbGFncyBzZXQgZm9yIGFsbCBvZiB0aGUgZmlsdGVycworeW91IGludGVuZCB0byB1c2Ugc28gdGhhdCBsaWJwbmcgY2FuIGluaXRpYWxpemUgaXRzIGludGVybmFsCitzdHJ1Y3R1cmVzIGFwcHJvcHJpYXRlbHkgZm9yIGFsbCBvZiB0aGUgZmlsdGVyIHR5cGVzLiAgKE5vdGUgdGhhdCB0aGlzCittZWFucyB0aGUgZmlyc3Qgcm93IG11c3QgYWx3YXlzIGJlIGFkYXB0aXZlbHkgZmlsdGVyZWQsIGJlY2F1c2UgbGlicG5nCitjdXJyZW50bHkgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGZpbHRlciBidWZmZXJzIHVudGlsIHBuZ193cml0ZV9yb3coKQoraXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZS4pCisKKyAgICBmaWx0ZXJzID0gUE5HX0ZJTFRFUl9OT05FIHwgUE5HX0ZJTFRFUl9TVUIKKyAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9VUCB8IFBOR19GSUxURVJfQVZHIHwKKyAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9QQUVUSCB8IFBOR19BTExfRklMVEVSUzsKKworICAgIHBuZ19zZXRfZmlsdGVyKHBuZ19wdHIsIFBOR19GSUxURVJfVFlQRV9CQVNFLAorICAgICAgIGZpbHRlcnMpOworICAgICAgICAgICAgICBUaGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gYWxzbyBiZQorICAgICAgICAgICAgICBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcgaWYgeW91IGFyZQorICAgICAgICAgICAgICB3cml0aW5nIGEgUE5HIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HCisgICAgICAgICAgICAgIGRhdGFzdHJlYW0uICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIHRoZQorICAgICAgICAgICAgICBzYW1lIGFzIHRoZSB2YWx1ZSBvZiBmaWx0ZXJfbWV0aG9kIHVzZWQKKyAgICAgICAgICAgICAgaW4gcG5nX3NldF9JSERSKCkuCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gaW5mbHVlbmNlIGhvdyBsaWJwbmcgY2hvb3NlcyBmcm9tIGFtb25nIHRoZQorYXZhaWxhYmxlIGZpbHRlcnMuICBUaGlzIGlzIGRvbmUgaW4gb25lIG9yIGJvdGggb2YgdHdvIHdheXMgLSBieQordGVsbGluZyBpdCBob3cgaW1wb3J0YW50IGl0IGlzIHRvIGtlZXAgdGhlIHNhbWUgZmlsdGVyIGZvciBzdWNjZXNzaXZlCityb3dzLCBhbmQgYnkgdGVsbGluZyBpdCB0aGUgcmVsYXRpdmUgY29tcHV0YXRpb25hbCBjb3N0cyBvZiB0aGUgZmlsdGVycy4KKworICAgIGRvdWJsZSB3ZWlnaHRzWzNdID0gezEuNSwgMS4zLCAxLjF9LAorICAgICAgIGNvc3RzW1BOR19GSUxURVJfVkFMVUVfTEFTVF0gPQorICAgICAgIHsxLjAsIDEuMywgMS4zLCAxLjUsIDEuN307CisKKyAgICBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19wdHIsCisgICAgICAgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQsIDMsCisgICAgICAgd2VpZ2h0cywgY29zdHMpOworCitUaGUgd2VpZ2h0cyBhcmUgbXVsdGlwbHlpbmcgZmFjdG9ycyB0aGF0IGluZGljYXRlIHRvIGxpYnBuZyB0aGF0IHRoZQorcm93IGZpbHRlciBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIHN1Y2Nlc3NpdmUgcm93cyB1bmxlc3MgYW5vdGhlciByb3cgZmlsdGVyCitpcyB0aGF0IG1hbnkgdGltZXMgYmV0dGVyIHRoYW4gdGhlIHByZXZpb3VzIGZpbHRlci4gIEluIHRoZSBhYm92ZSBleGFtcGxlLAoraWYgdGhlIHByZXZpb3VzIDMgZmlsdGVycyB3ZXJlIFNVQiwgU1VCLCBOT05FLCB0aGUgU1VCIGZpbHRlciBjb3VsZCBoYXZlIGEKKyJzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMiIDEuNSB4IDEuMyB0aW1lcyBoaWdoZXIgdGhhbiBvdGhlciBmaWx0ZXJzCithbmQgc3RpbGwgYmUgY2hvc2VuLCB3aGlsZSB0aGUgTk9ORSBmaWx0ZXIgY291bGQgaGF2ZSBhIHN1bSAxLjEgdGltZXMKK2hpZ2hlciB0aGFuIG90aGVyIGZpbHRlcnMgYW5kIHN0aWxsIGJlIGNob3Nlbi4gIFVuc3BlY2lmaWVkIHdlaWdodHMgYXJlCit0YWtlbiB0byBiZSAxLjAsIGFuZCB0aGUgc3BlY2lmaWVkIHdlaWdodHMgc2hvdWxkIHByb2JhYmx5IGJlIGRlY2xpbmluZworbGlrZSB0aG9zZSBhYm92ZSBpbiBvcmRlciB0byBlbXBoYXNpemUgcmVjZW50IGZpbHRlcnMgb3ZlciBvbGRlciBmaWx0ZXJzLgorCitUaGUgZmlsdGVyIGNvc3RzIHNwZWNpZnkgZm9yIGVhY2ggZmlsdGVyIHR5cGUgYSByZWxhdGl2ZSBkZWNvZGluZyBjb3N0Cit0byBiZSBjb25zaWRlcmVkIHdoZW4gc2VsZWN0aW5nIHJvdyBmaWx0ZXJzLiAgVGhpcyBtZWFucyB0aGF0IGZpbHRlcnMKK3dpdGggaGlnaGVyIGNvc3RzIGFyZSBsZXNzIGxpa2VseSB0byBiZSBjaG9zZW4gb3ZlciBmaWx0ZXJzIHdpdGggbG93ZXIKK2Nvc3RzLCB1bmxlc3MgdGhlaXIgInN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcyIgaXMgdGhhdCBtdWNoIHNtYWxsZXIuCitUaGUgY29zdHMgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIGV4YWN0IGNvbXB1dGF0aW9uYWwgc3BlZWRzIG9mCit0aGUgdmFyaW91cyBmaWx0ZXJzLCBzaW5jZSB0aGlzIHdvdWxkIHVuZHVseSBpbmZsdWVuY2UgdGhlIGZpbmFsIGltYWdlCitzaXplLgorCitOb3RlIHRoYXQgdGhlIG51bWJlcnMgYWJvdmUgd2VyZSBpbnZlbnRlZCBwdXJlbHkgZm9yIHRoaXMgZXhhbXBsZSBhbmQKK2FyZSBnaXZlbiBvbmx5IHRvIGhlbHAgZXhwbGFpbiB0aGUgZnVuY3Rpb24gdXNhZ2UuICBMaXR0bGUgdGVzdGluZyBoYXMKK2JlZW4gZG9uZSB0byBmaW5kIG9wdGltdW0gdmFsdWVzIGZvciBlaXRoZXIgdGhlIGNvc3RzIG9yIHRoZSB3ZWlnaHRzLgorCisuU1MgUmVtb3ZpbmcgdW53YW50ZWQgb2JqZWN0IGNvZGUKKworVGhlcmUgYXJlIGEgYnVuY2ggb2YgI2RlZmluZSdzIGluIHBuZ2NvbmYuaCB0aGF0IGNvbnRyb2wgd2hhdCBwYXJ0cyBvZgorbGlicG5nIGFyZSBjb21waWxlZC4gIEFsbCB0aGUgZGVmaW5lcyBlbmQgaW4gX1NVUFBPUlRFRC4gIElmIHlvdSBhcmUKK25ldmVyIGdvaW5nIHRvIHVzZSBhIGNhcGFiaWxpdHksIHlvdSBjYW4gY2hhbmdlIHRoZSAjZGVmaW5lIHRvICN1bmRlZgorYmVmb3JlIHJlY29tcGlsaW5nIGxpYnBuZyBhbmQgc2F2ZSB5b3Vyc2VsZiBjb2RlIGFuZCBkYXRhIHNwYWNlLCBvcgoreW91IGNhbiB0dXJuIG9mZiBpbmRpdmlkdWFsIGNhcGFiaWxpdGllcyB3aXRoIGRlZmluZXMgdGhhdCBiZWdpbiB3aXRoCitQTkdfTk9fLgorCitZb3UgY2FuIGFsc28gdHVybiBhbGwgb2YgdGhlIHRyYW5zZm9ybXMgYW5kIGFuY2lsbGFyeSBjaHVuayBjYXBhYmlsaXRpZXMKK29mZiBlbiBtYXNzZSB3aXRoIGNvbXBpbGVyIGRpcmVjdGl2ZXMgdGhhdCBkZWZpbmUKK1BOR19OT19SRUFEW29yIFdSSVRFXV9UUkFOU0ZPUk1TLCBvciBQTkdfTk9fUkVBRFtvciBXUklURV1fQU5DSUxMQVJZX0NIVU5LUywKK29yIGFsbCBmb3VyLAorYWxvbmcgd2l0aCBkaXJlY3RpdmVzIHRvIHR1cm4gb24gYW55IG9mIHRoZSBjYXBhYmlsaXRpZXMgdGhhdCB5b3UgZG8KK3dhbnQuICBUaGUgUE5HX05PX1JFQURbb3IgV1JJVEVdX1RSQU5TRk9STVMgZGlyZWN0aXZlcyBkaXNhYmxlIHRoZSBleHRyYQordHJhbnNmb3JtYXRpb25zIGJ1dCBzdGlsbCBsZWF2ZSB0aGUgbGlicmFyeSBmdWxseSBjYXBhYmxlIG9mIHJlYWRpbmcKK2FuZCB3cml0aW5nIFBORyBmaWxlcyB3aXRoIGFsbCBrbm93biBwdWJsaWMgY2h1bmtzLiBVc2Ugb2YgdGhlCitQTkdfTk9fUkVBRFtvciBXUklURV1fQU5DSUxMQVJZX0NIVU5LUyBkaXJlY3RpdmUgcHJvZHVjZXMgYSBsaWJyYXJ5Cit0aGF0IGlzIGluY2FwYWJsZSBvZiByZWFkaW5nIG9yIHdyaXRpbmcgYW5jaWxsYXJ5IGNodW5rcy4gIElmIHlvdSBhcmUKK25vdCB1c2luZyB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGluZyBjYXBhYmlsaXR5LCB5b3UgY2FuIHR1cm4gdGhhdCBvZmYKK3dpdGggUE5HX05PX1BST0dSRVNTSVZFX1JFQUQgKGRvbid0IGNvbmZ1c2UgdGhpcyB3aXRoIHRoZSBJTlRFUkxBQ0lORworY2FwYWJpbGl0eSwgd2hpY2ggeW91J2xsIHN0aWxsIGhhdmUpLgorCitBbGwgdGhlIHJlYWRpbmcgYW5kIHdyaXRpbmcgc3BlY2lmaWMgY29kZSBhcmUgaW4gc2VwYXJhdGUgZmlsZXMsIHNvIHRoZQorbGlua2VyIHNob3VsZCBvbmx5IGdyYWIgdGhlIGZpbGVzIGl0IG5lZWRzLiAgSG93ZXZlciwgaWYgeW91IHdhbnQgdG8KK21ha2Ugc3VyZSwgb3IgaWYgeW91IGFyZSBidWlsZGluZyBhIHN0YW5kIGFsb25lIGxpYnJhcnksIGFsbCB0aGUKK3JlYWRpbmcgZmlsZXMgc3RhcnQgd2l0aCBwbmdyIGFuZCBhbGwgdGhlIHdyaXRpbmcgZmlsZXMgc3RhcnQgd2l0aAorcG5ndy4gIFRoZSBmaWxlcyB0aGF0IGRvbid0IG1hdGNoIGVpdGhlciAobGlrZSBwbmcuYywgcG5ndHJhbnMuYywgZXRjLikKK2FyZSB1c2VkIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcsIGFuZCBhbHdheXMgbmVlZCB0byBiZSBpbmNsdWRlZC4KK1RoZSBwcm9ncmVzc2l2ZSByZWFkZXIgaXMgaW4gcG5ncHJlYWQuYworCitJZiB5b3UgYXJlIGNyZWF0aW5nIG9yIGRpc3RyaWJ1dGluZyBhIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJ5IChhIC5zbworb3IgRExMIGZpbGUpLCB5b3Ugc2hvdWxkIG5vdCByZW1vdmUgb3IgZGlzYWJsZSBhbnkgcGFydHMgb2YgdGhlIGxpYnJhcnksCithcyB0aGlzIHdpbGwgY2F1c2UgYXBwbGljYXRpb25zIGxpbmtlZCB3aXRoIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKK2xpYnJhcnkgdG8gZmFpbCBpZiB0aGV5IGNhbGwgZnVuY3Rpb25zIG5vdCBhdmFpbGFibGUgaW4geW91ciBsaWJyYXJ5LgorVGhlIHNpemUgb2YgdGhlIGxpYnJhcnkgaXRzZWxmIHNob3VsZCBub3QgYmUgYW4gaXNzdWUsIGJlY2F1c2Ugb25seQordGhvc2Ugc2VjdGlvbnMgdGhhdCBhcmUgYWN0dWFsbHkgdXNlZCB3aWxsIGJlIGxvYWRlZCBpbnRvIG1lbW9yeS4KKworLlNTIFJlcXVlc3RpbmcgZGVidWcgcHJpbnRvdXQKKworVGhlIG1hY3JvIGRlZmluaXRpb24gUE5HX0RFQlVHIGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgZGVidWdnaW5nCitwcmludG91dC4gIFNldCBpdCB0byBhbiBpbnRlZ2VyIHZhbHVlIGluIHRoZSByYW5nZSAwIHRvIDMuICBIaWdoZXIKK251bWJlcnMgcmVzdWx0IGluIGluY3JlYXNpbmcgYW1vdW50cyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUKK2luZm9ybWF0aW9uIGlzIHByaW50ZWQgdG8gdGhlICJzdGRlcnIiIGZpbGUsIHVubGVzcyBhbm90aGVyIGZpbGUKK25hbWUgaXMgc3BlY2lmaWVkIGluIHRoZSBQTkdfREVCVUdfRklMRSBtYWNybyBkZWZpbml0aW9uLgorCitXaGVuIFBOR19ERUJVRyA+IDAsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIChtYWNyb3MpIGJlY29tZSBhdmFpbGFibGU6CisKKyAgIHBuZ19kZWJ1ZyhsZXZlbCwgbWVzc2FnZSkKKyAgIHBuZ19kZWJ1ZzEobGV2ZWwsIG1lc3NhZ2UsIHAxKQorICAgcG5nX2RlYnVnMihsZXZlbCwgbWVzc2FnZSwgcDEsIHAyKQorCitpbiB3aGljaCAibGV2ZWwiIGlzIGNvbXBhcmVkIHRvIFBOR19ERUJVRyB0byBkZWNpZGUgd2hldGhlciB0byBwcmludAordGhlIG1lc3NhZ2UsICJtZXNzYWdlIiBpcyB0aGUgZm9ybWF0dGVkIHN0cmluZyB0byBiZSBwcmludGVkLAorYW5kIHAxIGFuZCBwMiBhcmUgcGFyYW1ldGVycyB0aGF0IGFyZSB0byBiZSBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nCithY2NvcmRpbmcgdG8gcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcgZGlyZWN0aXZlcy4gIEZvciBleGFtcGxlLAorCisgICBwbmdfZGVidWcxKDIsICJmb289JWRcbiIsIGZvbyk7CisKK2lzIGV4cGFuZGVkIHRvCisKKyAgIGlmKFBOR19ERUJVRyA+IDIpCisgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsICJmb289JWRcbiIsIGZvbyk7CisKK1doZW4gUE5HX0RFQlVHIGlzIGRlZmluZWQgYnV0IGlzIHplcm8sIHRoZSBtYWNyb3MgYXJlbid0IGRlZmluZWQsIGJ1dCB5b3UKK2NhbiBzdGlsbCB1c2UgUE5HX0RFQlVHIHRvIGNvbnRyb2wgeW91ciBvd24gZGVidWdnaW5nOgorCisgICAjaWZkZWYgUE5HX0RFQlVHCisgICAgICAgZnByaW50ZihzdGRlcnIsIC4uLgorICAgI2VuZGlmCisKK1doZW4gUE5HX0RFQlVHID0gMSwgdGhlIG1hY3JvcyBhcmUgZGVmaW5lZCwgYnV0IG9ubHkgcG5nX2RlYnVnIHN0YXRlbWVudHMKK2hhdmluZyBsZXZlbCA9IDAgd2lsbCBiZSBwcmludGVkLiAgVGhlcmUgYXJlbid0IGFueSBzdWNoIHN0YXRlbWVudHMgaW4KK3RoaXMgdmVyc2lvbiBvZiBsaWJwbmcsIGJ1dCBpZiB5b3UgaW5zZXJ0IHNvbWUgdGhleSB3aWxsIGJlIHByaW50ZWQuCisKKy5TSCBWSS4gIE1ORyBzdXBwb3J0CisKK1RoZSBNTkcgc3BlY2lmaWNhdGlvbiAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvbW5nKSBhbGxvd3MKK2NlcnRhaW4gZXh0ZW5zaW9ucyB0byBQTkcgZm9yIFBORyBpbWFnZXMgdGhhdCBhcmUgZW1iZWRkZWQgaW4gTU5HIGRhdGFzdHJlYW1zLgorTGlicG5nIGNhbiBzdXBwb3J0IHNvbWUgb2YgdGhlc2UgZXh0ZW5zaW9ucy4gIFRvIGVuYWJsZSB0aGVtLCB1c2UgdGhlCitwbmdfcGVybWl0X21uZ19mZWF0dXJlcygpIGZ1bmN0aW9uOgorCisgICBmZWF0dXJlX3NldCA9IHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKHBuZ19wdHIsIG1hc2spCisgICBtYXNrIGlzIGEgcG5nX3VpbnRfMzIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiB0aGUKKyAgICAgICAgZmVhdHVyZXMgeW91IHdhbnQgdG8gZW5hYmxlLiAgVGhlc2UgaW5jbHVkZQorICAgICAgICBQTkdfRkxBR19NTkdfRU1QVFlfUExURQorICAgICAgICBQTkdfRkxBR19NTkdfRklMVEVSXzY0CisgICAgICAgIFBOR19BTExfTU5HX0ZFQVRVUkVTCisgICBmZWF0dXJlX3NldCBpcyBhIHBuZ191aW50XzMyIHRoYXQgaXMgdGhlIGJpdHdpc2UgQU5EIG9mCisgICAgICB5b3VyIG1hc2sgd2l0aCB0aGUgc2V0IG9mIE1ORyBmZWF0dXJlcyB0aGF0IGlzCisgICAgICBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgbGlicG5nIHRoYXQgeW91IGFyZSB1c2luZy4KKworSXQgaXMgYW4gZXJyb3IgdG8gdXNlIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgYSBzdGFuZGFsb25lCitQTkcgZmlsZSB3aXRoIHRoZSBQTkcgOC1ieXRlIHNpZ25hdHVyZS4gIFRoZSBQTkcgZGF0YXN0cmVhbSBtdXN0IGJlIHdyYXBwZWQKK2luIGEgTU5HIGRhdGFzdHJlYW0uICBBcyBhIG1pbmltdW0sIGl0IG11c3QgaGF2ZSB0aGUgTU5HIDgtYnl0ZSBzaWduYXR1cmUKK2FuZCB0aGUgTUhEUiBhbmQgTUVORCBjaHVua3MuICBMaWJwbmcgZG9lcyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciB0aGVzZQorb3IgYW55IG90aGVyIE1ORyBjaHVua3M7IHlvdXIgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGl0cyBvd24gc3VwcG9ydCBmb3IKK3RoZW0uICBZb3UgbWF5IHdpc2ggdG8gY29uc2lkZXIgdXNpbmcgbGlibW5nIChhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cubGlibW5nLmNvbSkgaW5zdGVhZC4KKworLlNIIFZJSS4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAwLjg4CisKK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IHZlcnNpb25zIG9mIGxpYnBuZyBsYXRlciB0aGFuIDAuOTYgYXJlIG5vdAorZGlzdHJpYnV0ZWQgYnkgdGhlIG9yaWdpbmFsIGxpYnBuZyBhdXRob3IsIEd1eSBTY2hhbG5hdCwgbm9yIGJ5CitBbmRyZWFzIERpbGdlciwgd2hvIGhhZCB0YWtlbiBvdmVyIGZyb20gR3V5IGR1cmluZyAxOTk2IGFuZCAxOTk3LCBhbmQKK2Rpc3RyaWJ1dGVkIHZlcnNpb25zIDAuODkgdGhyb3VnaCAwLjk2LCBidXQgcmF0aGVyIGJ5IGFub3RoZXIgbWVtYmVyCitvZiB0aGUgb3JpZ2luYWwgUE5HIEdyb3VwLCBHbGVubiBSYW5kZXJzLVBlaHJzb24uICBHdXkgYW5kIEFuZHJlYXMgYXJlCitzdGlsbCBhbGl2ZSBhbmQgd2VsbCwgYnV0IHRoZXkgaGF2ZSBtb3ZlZCBvbiB0byBvdGhlciB0aGluZ3MuCisKK1RoZSBvbGQgbGlicG5nIGZ1bmN0aW9ucyBwbmdfcmVhZF9pbml0KCksIHBuZ193cml0ZV9pbml0KCksCitwbmdfaW5mb19pbml0KCksIHBuZ19yZWFkX2Rlc3Ryb3koKSwgYW5kIHBuZ193cml0ZV9kZXN0cm95KCkgaGF2ZSBiZWVuCittb3ZlZCB0byBQTkdfSU5URVJOQUwgaW4gdmVyc2lvbiAwLjk1IHRvIGRpc2NvdXJhZ2UgdGhlaXIgdXNlLiAgVGhlc2UKK2Z1bmN0aW9ucyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmcgdmVyc2lvbiAyLjAuMC4KKworVGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgY3JlYXRpbmcgYW5kIGluaXRpYWxpemluZyB0aGUgbGlicG5nIHN0cnVjdHVyZXMgaXMKK3ZpYSB0aGUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpLCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpLCBhbmQKK3BuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKSBiZWNhdXNlIHRoZXkgaXNvbGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlcworZnJvbSB0aGUgYXBwbGljYXRpb24sIGFsbG93IHZlcnNpb24gZXJyb3IgY2hlY2tpbmcsIGFuZCBhbHNvIGFsbG93IHRoZQordXNlIG9mIGN1c3RvbSBlcnJvciBoYW5kbGluZyByb3V0aW5lcyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCB3aGljaAordGhlIG9sZCBmdW5jdGlvbnMgZG8gbm90LiAgVGhlIGZ1bmN0aW9ucyBwbmdfcmVhZF9kZXN0cm95KCkgYW5kCitwbmdfd3JpdGVfZGVzdHJveSgpIGRvIG5vdCBhY3R1YWxseSBmcmVlIHRoZSBtZW1vcnkgdGhhdCBsaWJwbmcKK2FsbG9jYXRlZCBmb3IgdGhlc2Ugc3RydWN0cywgYnV0IGp1c3QgcmVzZXQgdGhlIGRhdGEgc3RydWN0dXJlcywgc28gdGhleQorY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpIGFuZAorcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgaWYgeW91IGZlZWwgdGhlcmUgaXMgdG9vIG11Y2ggc3lzdGVtIG92ZXJoZWFkCithbGxvY2F0aW5nIGFuZCBmcmVlaW5nIHRoZSBwbmdfc3RydWN0IGZvciBlYWNoIGltYWdlIHJlYWQuCisKK1NldHRpbmcgdGhlIGVycm9yIGNhbGxiYWNrcyB2aWEgcG5nX3NldF9tZXNzYWdlX2ZuKCkgYmVmb3JlCitwbmdfcmVhZF9pbml0KCkgYXMgd2FzIHN1Z2dlc3RlZCBpbiBsaWJwbmctMC44OCBpcyBubyBsb25nZXIgc3VwcG9ydGVkCitiZWNhdXNlIHRoaXMgY2F1c2VkIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCB1c2UgY3VzdG9tIGVycm9yIGZ1bmN0aW9ucwordG8gZmFpbCBpZiB0aGUgcG5nX3B0ciB3YXMgbm90IGluaXRpYWxpemVkIHRvIHplcm8uICBJdCBpcyBzdGlsbCBwb3NzaWJsZQordG8gc2V0IHRoZSBlcnJvciBjYWxsYmFja3MgQUZURVIgcG5nX3JlYWRfaW5pdCgpLCBvciB0byBjaGFuZ2UgdGhlbSB3aXRoCitwbmdfc2V0X2Vycm9yX2ZuKCksIHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGZ1bmN0aW9uLCBidXQgd2l0aCBhIG5ldworbmFtZSB0byBmb3JjZSBjb21waWxhdGlvbiBlcnJvcnMgd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCB0cnkgdG8gdXNlIHRoZSBvbGQKK21ldGhvZC4KKworU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuMC43LCB5b3UgY2FuIGZpbmQgb3V0IHdoaWNoIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKK3lvdSBhcmUgdXNpbmcgYXQgcnVuLXRpbWU6CisKKyAgIHBuZ191aW50XzMyIGxpYnBuZ192biA9IHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIoKTsKKworVGhlIG51bWJlciBsaWJwbmdfdm4gaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgbWFqb3IgdmVyc2lvbiwgbWlub3IKK3ZlcnNpb24gd2l0aCBsZWFkaW5nIHplcm8sIGFuZCByZWxlYXNlIG51bWJlciB3aXRoIGxlYWRpbmcgemVybywKKyhlLmcuLCBsaWJwbmdfdm4gZm9yIHZlcnNpb24gMS4wLjcgaXMgMTAwMDcpLgorCitZb3UgY2FuIGFsc28gY2hlY2sgd2hpY2ggdmVyc2lvbiBvZiBwbmcuaCB5b3UgdXNlZCB3aGVuIGNvbXBpbGluZyB5b3VyCithcHBsaWNhdGlvbjoKKworICAgcG5nX3VpbnRfMzIgYXBwbGljYXRpb25fdm4gPSBQTkdfTElCUE5HX1ZFUjsKKworLlNIIFZJSUkuICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS4wLnggdG8gMS4yLngKKworU3VwcG9ydCBmb3IgdXNlciBtZW1vcnkgbWFuYWdlbWVudCB3YXMgZW5hYmxlZCBieSBkZWZhdWx0LiAgVG8KK2FjY29tcGxpc2ggdGhpcywgdGhlIGZ1bmN0aW9ucyBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKSwKK3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSwgcG5nX3NldF9tZW1fZm4oKSwgcG5nX2dldF9tZW1fcHRyKCksCitwbmdfbWFsbG9jX2RlZmF1bHQoKSwgYW5kIHBuZ19mcmVlX2RlZmF1bHQoKSB3ZXJlIGFkZGVkLgorCitTdXBwb3J0IGZvciB0aGUgaVRYdCBjaHVuayBoYXMgYmVlbiBlbmFibGVkIGJ5IGRlZmF1bHQgYXMgb2YKK3ZlcnNpb24gMS4yLjQxLgorCitTdXBwb3J0IGZvciBjZXJ0YWluIE1ORyBmZWF0dXJlcyB3YXMgZW5hYmxlZC4KKworU3VwcG9ydCBmb3IgbnVtYmVyZWQgZXJyb3IgbWVzc2FnZXMgd2FzIGFkZGVkLiAgSG93ZXZlciwgd2UgbmV2ZXIgZ290Cithcm91bmQgdG8gYWN0dWFsbHkgbnVtYmVyaW5nIHRoZSBlcnJvciBtZXNzYWdlcy4gIFRoZSBmdW5jdGlvbgorcG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzKCkgd2FzIGFkZGVkIChOb3RlOiB0aGUgcHJvdG90eXBlIGZvciB0aGlzCitmdW5jdGlvbiB3YXMgaW5hZHZlcnRlbnRseSByZW1vdmVkIGZyb20gcG5nLmggaW4gUE5HX05PX0FTU0VNQkxFUl9DT0RFCitidWlsZHMgb2YgbGlicG5nLTEuMi4xNS4gIEl0IHdhcyByZXN0b3JlZCBpbiBsaWJwbmctMS4yLjM2KS4KKworVGhlIHBuZ19tYWxsb2Nfd2FybigpIGZ1bmN0aW9uIHdhcyBhZGRlZCBhdCBsaWJwbmctMS4yLjMuICBUaGlzIGlzc3VlcworYSBwbmdfd2FybmluZyBhbmQgcmV0dXJucyBOVUxMIGluc3RlYWQgb2YgYWJvcnRpbmcgd2hlbiBpdCBmYWlscyB0bworYWNxdWlyZSB0aGUgcmVxdWVzdGVkIG1lbW9yeSBhbGxvY2F0aW9uLgorCitTdXBwb3J0IGZvciBzZXR0aW5nIHVzZXIgbGltaXRzIG9uIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgd2FzIGVuYWJsZWQKK2J5IGRlZmF1bHQuICBUaGUgZnVuY3Rpb25zIHBuZ19zZXRfdXNlcl9saW1pdHMoKSwgcG5nX2dldF91c2VyX3dpZHRoX21heCgpLAorYW5kIHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4KCkgd2VyZSBhZGRlZCBhdCBsaWJwbmctMS4yLjYuCisKK1RoZSBwbmdfc2V0X2FkZF9hbHBoYSgpIGZ1bmN0aW9uIHdhcyBhZGRlZCBhdCBsaWJwbmctMS4yLjcuCisKK1RoZSBmdW5jdGlvbiBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMi45LgorVW5saWtlIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCksIHRoZSBuZXcgZnVuY3Rpb24gZG9lcyBub3QgZXhwYW5kIHRoZQordFJOUyBjaHVuayB0byBhbHBoYS4gVGhlIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkgZnVuY3Rpb24gaXMKK2RlcHJlY2F0ZWQuCisKK0EgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIGluIHN1cHBvcnQgb2YgcnVudGltZSBzZWxlY3Rpb24gb2YKK2Fzc2VtYmxlciBjb2RlIGZlYXR1cmVzIChlc3BlY2lhbGx5IEludGVsIE1NWCBjb2RlIHN1cHBvcnQpIHdlcmUKK2FkZGVkIGF0IGxpYnBuZy0xLjIuMDoKKworICAgIFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9DT01QSUxFRAorICAgIFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9JTl9DUFUKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfQ09NQklORV9ST1cKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFCisgICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9TVUIKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1VQCisgICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9BVkcKKyAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1BBRVRICisgICAgUE5HX0FTTV9GTEFHU19JTklUSUFMSVpFRAorICAgIFBOR19NTVhfUkVBRF9GTEFHUworICAgIFBOR19NTVhfRkxBR1MKKyAgICBQTkdfTU1YX1dSSVRFX0ZMQUdTCisgICAgUE5HX01NWF9GTEFHUworCitXZSBhZGRlZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbiBzdXBwb3J0IG9mIHJ1bnRpbWUKK3NlbGVjdGlvbiBvZiBhc3NlbWJsZXIgY29kZSBmZWF0dXJlczoKKworICAgIHBuZ19nZXRfbW14X2ZsYWdtYXNrKCkKKyAgICBwbmdfc2V0X21teF90aHJlc2hvbGRzKCkKKyAgICBwbmdfZ2V0X2FzbV9mbGFncygpCisgICAgcG5nX2dldF9tbXhfYml0ZGVwdGhfdGhyZXNob2xkKCkKKyAgICBwbmdfZ2V0X21teF9yb3dieXRlc190aHJlc2hvbGQoKQorICAgIHBuZ19zZXRfYXNtX2ZsYWdzKCkKKworV2UgcmVwbGFjZWQgYWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aXRoIHNpbXBsZSBzdHVicyBpbiBsaWJwbmctMS4yLjIwLAord2hlbiB0aGUgSW50ZWwgYXNzZW1ibGVyIGNvZGUgd2FzIHJlbW92ZWQgZHVlIHRvIGEgbGljZW5zaW5nIGlzc3VlLgorCitUaGVzZSBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQ6CisKKyAgICBQTkdfUkVBRF9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQKKyAgICBQTkdfUFJPR1JFU1NJVkVfUkVBRF9OT1RfU1VQUE9SVEVECisgICAgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKyAgICBQTkdfV1JJVEVfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVECisgICAgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVECisgICAgUE5HX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRAorCitUaGV5IGhhdmUgYmVlbiByZXBsYWNlZCwgcmVzcGVjdGl2ZWx5LCBieToKKworICAgIFBOR19OT19SRUFEX1RSQU5TRk9STVMKKyAgICBQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRAorICAgIFBOR19OT19TRVFVRU5USUFMX1JFQUQKKyAgICBQTkdfTk9fV1JJVEVfVFJBTlNGT1JNUworICAgIFBOR19OT19SRUFEX0FOQ0lMTEFSWV9DSFVOS1MKKyAgICBQTkdfTk9fV1JJVEVfQU5DSUxMQVJZX0NIVU5LUworCitQTkdfTUFYX1VJTlQgd2FzIHJlcGxhY2VkIHdpdGggUE5HX1VJTlRfMzFfTUFYLiAgSXQgaGFzIGJlZW4KK2RlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTEuMC4xNiBhbmQgbGlicG5nLTEuMi42LgorCitUaGUgZnVuY3Rpb24KKyAgICBwbmdfY2hlY2tfc2lnKHNpZywgbnVtKQord2FzIHJlcGxhY2VkIHdpdGgKKyAgICAhcG5nX3NpZ19jbXAoc2lnLCAwLCBudW0pCitJdCBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0wLjkwLgorCitUaGUgZnVuY3Rpb24KKyAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpCit3aGljaCBhbHNvIGV4cGFuZHMgdFJOUyB0byBhbHBoYSB3YXMgcmVwbGFjZWQgd2l0aAorICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpCit3aGljaCBkb2VzIG5vdC4gSXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMS4wLjE4IGFuZCAxLjIuOS4KKworLlNIIElYLiAgKE9taXR0ZWQpCisKKworLlNIIFguIERldGVjdGluZyBsaWJwbmcKKworVGhlIHBuZ19nZXRfaW9fcHRyKCkgZnVuY3Rpb24gaGFzIGJlZW4gcHJlc2VudCBzaW5jZSBsaWJwbmctMC44OCwgaGFzIG5ldmVyCitjaGFuZ2VkLCBhbmQgaXMgdW5hZmZlY3RlZCBieSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBtYWNyb3MuICBJdCBpcyB0aGUKK2Jlc3QgY2hvaWNlIGZvciB1c2UgaW4gY29uZmlndXJlIHNjcmlwdHMgZm9yIGRldGVjdGluZyB0aGUgcHJlc2VuY2Ugb2YgYW55CitsaWJwbmcgdmVyc2lvbiBzaW5jZSAwLjg4LiAgSW4gYW4gYXV0b2NvbmYgImNvbmZpZ3VyZS5pbiIgeW91IGNvdWxkIHVzZQorCisgICAgQUNfQ0hFQ0tfTElCKHBuZywgcG5nX2dldF9pb19wdHIsIC4uLgorCisuU0ggWEkuIFNvdXJjZSBjb2RlIHJlcG9zaXRvcnkKKworU2luY2UgYWJvdXQgRmVicnVhcnkgMjAwOSwgdmVyc2lvbiAxLjIuMzQsIGxpYnBuZyBoYXMgYmVlbiB1bmRlciAiZ2l0IiBzb3VyY2UKK2NvbnRyb2wuICBUaGUgZ2l0IHJlcG9zaXRvcnkgd2FzIGJ1aWx0IGZyb20gb2xkIGxpYnBuZy14Lnkuei50YXIuZ3ogZmlsZXMKK2dvaW5nIGJhY2sgdG8gdmVyc2lvbiAwLjcwLiAgWW91IGNhbiBhY2Nlc3MgdGhlIGdpdCByZXBvc2l0b3J5IChyZWFkIG9ubHkpCithdAorCisgICAgZ2l0Oi8vbGlicG5nLmdpdC5zb3VyY2Vmb3JnZS5uZXQvZ2l0cm9vdC9saWJwbmcKKworb3IgeW91IGNhbiBicm93c2UgaXQgdmlhICJnaXR3ZWIiIGF0CisKKyAgICBodHRwOi8vbGlicG5nLmdpdC5zb3VyY2Vmb3JnZS5uZXQvZ2l0L2dpdHdlYi5jZ2k/cD1saWJwbmcKKworUGF0Y2hlcyBjYW4gYmUgc2VudCB0byBnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldCBvciB0bworcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc291cmNlZm9yZ2UubmV0IG9yIHlvdSBjYW4gdXBsb2FkIHRoZW0gdG8KK3RoZSBsaWJwbmcgYnVnIHRyYWNrZXIgYXQKKworICAgIGh0dHA6Ly9saWJwbmcuc291cmNlZm9yZ2UubmV0CisKKy5TSCBYSUkuIENvZGluZyBzdHlsZQorCitPdXIgY29kaW5nIHN0eWxlIGlzIHNpbWlsYXIgdG8gdGhlICJBbGxtYW4iIHN0eWxlLCB3aXRoIGN1cmx5CiticmFjZXMgb24gc2VwYXJhdGUgbGluZXM6CisKKyAgICBpZiAoY29uZGl0aW9uKQorICAgIHsKKyAgICAgICBhY3Rpb247CisgICAgfQorCisgICAgZWxzZSBpZiAoYW5vdGhlciBjb25kaXRpb24pCisgICAgeworICAgICAgIGFub3RoZXIgYWN0aW9uOworICAgIH0KKworVGhlIGJyYWNlcyBjYW4gYmUgb21pdHRlZCBmcm9tIHNpbXBsZSBvbmUtbGluZSBhY3Rpb25zOgorCisgICAgaWYgKGNvbmRpdGlvbikKKyAgICAgICByZXR1cm4gKDApOworCitXZSB1c2UgMy1zcGFjZSBpbmRlbnRhdGlvbiwgZXhjZXB0IGZvciBjb250aW51ZWQgc3RhdGVtZW50cyB3aGljaAorYXJlIHVzdWFsbHkgaW5kZW50ZWQgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHN0YXRlbWVudAorcGx1cyBmb3VyIG1vcmUgc3BhY2VzLgorCitGb3IgbWFjcm8gZGVmaW5pdGlvbnMgd2UgdXNlIDItc3BhY2UgaW5kZW50YXRpb24sIGFsd2F5cyBsZWF2aW5nIHRoZSAiIyIKK2luIHRoZSBmaXJzdCBjb2x1bW4uCisKKyAgICAjaWZuZGVmIFBOR19OT19GRUFUVVJFCisgICAgIyAgaWZuZGVmIFBOR19GRUFUVVJFX1NVUFBPUlRFRAorICAgICMgICAgZGVmaW5lIFBOR19GRUFUVVJFX1NVUFBPUlRFRAorICAgICMgIGVuZGlmCisgICAgI2VuZGlmCisKK0NvbW1lbnRzIGFwcGVhciB3aXRoIHRoZSBsZWFkaW5nICIvKiIgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gYXMKK3RoZSBzdGF0ZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBjb21tZW50OgorCisgICAgLyogU2luZ2xlLWxpbmUgY29tbWVudCAqLworICAgIHN0YXRlbWVudDsKKworICAgIC8qIE11bHRpcGxlLWxpbmUKKyAgICAgKiBjb21tZW50CisgICAgICovCisgICAgc3RhdGVtZW50OworCitWZXJ5IHNob3J0IGNvbW1lbnRzIGNhbiBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgc3RhdGVtZW50Cit0byB3aGljaCB0aGV5IHBlcnRhaW46CisKKyAgICBzdGF0ZW1lbnQ7ICAgIC8qIGNvbW1lbnQgKi8KKworV2UgZG9uJ3QgdXNlIEMrKyBzdHlsZSAoIi8vIikgY29tbWVudHMuIFdlIGhhdmUsIGhvd2V2ZXIsCit1c2VkIHRoZW0gaW4gdGhlIHBhc3QgaW4gc29tZSBub3ctYWJhbmRvbmVkIE1NWCBhc3NlbWJsZXIKK2NvZGUuCisKK0Z1bmN0aW9ucyBhbmQgdGhlaXIgY3VybHkgYnJhY2VzIGFyZSBub3QgaW5kZW50ZWQsIGFuZAorZXhwb3J0ZWQgZnVuY3Rpb25zIGFyZSBtYXJrZWQgd2l0aCBQTkdBUEk6CisKKyAvKiBUaGlzIGlzIGEgcHVibGljIGZ1bmN0aW9uIHRoYXQgaXMgdmlzaWJsZSB0bworICAqIGFwcGxpY2F0aW9uIHByb2dyYW1lcnMuIEl0IGRvZXMgdGh1cy1hbmQtc28uCisgICovCisgdm9pZCBQTkdBUEkKKyBwbmdfZXhwb3J0ZWRfZnVuY3Rpb24ocG5nX3B0ciwgcG5nX2luZm8sIGZvbykKKyB7CisgICAgYm9keTsKKyB9CisKK1RoZSBwcm90b3R5cGVzIGZvciBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIGFwcGVhciBpbiBwbmcuaCwKK2Fib3ZlIHRoZSBjb21tZW50IHRoYXQgc2F5cworCisgICAgLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwdWJsaWMgcHJvdG90eXBlcyBoZXJlIC4uLiAqLworCitXZSBtYXJrIGFsbCBub24tZXhwb3J0ZWQgZnVuY3Rpb25zIHdpdGggIi8qIFBSSVZBVEUgKi8iIjoKKworIHZvaWQgLyogUFJJVkFURSAqLworIHBuZ19ub25fZXhwb3J0ZWRfZnVuY3Rpb24ocG5nX3B0ciwgcG5nX2luZm8sIGZvbykKKyB7CisgICAgYm9keTsKKyB9CisKK1RoZSBwcm90b3R5cGVzIGZvciBub24tZXhwb3J0ZWQgZnVuY3Rpb25zIChleGNlcHQgZm9yIHRob3NlIGluCitwbmd0ZXN0KSBhcHBlYXIgaW4KK3RoZSBQTkdfSU5URVJOQUwgc2VjdGlvbiBvZiBwbmcuaAorYWJvdmUgdGhlIGNvbW1lbnQgdGhhdCBzYXlzCisKKyAgLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwcml2YXRlIHByb3RvdHlwZXMgaGVyZSBeIGFuZCBpbiBsaWJwbmdwZi4zICovCisKK1RoZSBuYW1lcyBvZiBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYmVnaW4KK3dpdGggICJwbmdfIiwgYW5kIGFsbCBwdWJsaWNseSB2aXNpYmxlIEMgcHJlcHJvY2Vzc29yCittYWNyb3MgYmVnaW4gd2l0aCAiUE5HXyIuCisKK1dlIHB1dCBhIHNwYWNlIGFmdGVyIGVhY2ggY29tbWEgYW5kIGFmdGVyIGVhY2ggc2VtaWNvbG9uCitpbiAiZm9yIiBzdGF0bWVudHMsIGFuZCB3ZSBwdXQgc3BhY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaAorQyBiaW5hcnkgb3BlcmF0b3IgYW5kIGFmdGVyICJmb3IiIG9yICJ3aGlsZSIuICBXZSBkb24ndAorcHV0IGEgc3BhY2UgYmV0d2VlbiBhIHR5cGVjYXN0IGFuZCB0aGUgZXhwcmVzc2lvbiBiZWluZworY2FzdCwgbm9yIGRvIHdlIHB1dCBvbmUgYmV0d2VlbiBhIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZQorbGVmdCBwYXJlbnRoZXNpcyB0aGF0IGZvbGxvd3MgaXQ6CisKKyAgICBmb3IgKGkgPSAyOyBpID4gMDsgLS1pKQorICAgICAgIHlbaV0gPSBhKHgpICsgKGludCliOworCitXZSBwcmVmZXIgI2lmZGVmIGFuZCAjaWZuZGVmIHRvICNpZiBkZWZpbmVkKCkgYW5kIGlmICFkZWZpbmVkKCkKK3doZW4gdGhlcmUgaXMgb25seSBvbmUgbWFjcm8gYmVpbmcgdGVzdGVkLgorCitXZSBkbyBub3QgdXNlIHRoZSBUQUIgY2hhcmFjdGVyIGZvciBpbmRlbnRhdGlvbiBpbiB0aGUgQyBzb3VyY2VzLgorCitMaW5lcyBkbyBub3QgZXhjZWVkIDgwIGNoYXJhY3RlcnMuCisKK090aGVyIHJ1bGVzIGNhbiBiZSBpbmZlcnJlZCBieSBpbnNwZWN0aW5nIHRoZSBsaWJwbmcgc291cmNlLgorCisuU0ggWElJSS4gWTJLIENvbXBsaWFuY2UgaW4gbGlicG5nCisKK0p1bmUgMjYsIDIwMTAKKworU2luY2UgdGhlIFBORyBEZXZlbG9wbWVudCBncm91cCBpcyBhbiBhZC1ob2MgYm9keSwgd2UgY2FuJ3QgbWFrZQorYW4gb2ZmaWNpYWwgZGVjbGFyYXRpb24uCisKK1RoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKK3Vwd2FyZCB0aHJvdWdoIDEuMi40NCBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0IGVhcmxpZXIKK3ZlcnNpb25zIHdlcmUgYWxzbyBZMksgY29tcGxpYW50LgorCitMaWJwbmcgb25seSBoYXMgdGhyZWUgeWVhciBmaWVsZHMuICBPbmUgaXMgYSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciB0aGF0Cit3aWxsIGhvbGQgeWVhcnMgdXAgdG8gNjU1MzUuICBUaGUgb3RoZXIgdHdvIGhvbGQgdGhlIGRhdGUgaW4gdGV4dAorZm9ybWF0LCBhbmQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDk5OTkuCisKK1RoZSBpbnRlZ2VyIGlzCisgICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KKworVGhlIHN0cmluZ3MgYXJlCisgICAgInBuZ19jaGFycCB0aW1lX2J1ZmZlciIgaW4gcG5nX3N0cnVjdCBhbmQKKyAgICAibmVhcl90aW1lX2J1ZmZlciIsIHdoaWNoIGlzIGEgbG9jYWwgY2hhcmFjdGVyIHN0cmluZyBpbiBwbmcuYy4KKworVGhlcmUgYXJlIHNldmVuIHRpbWUtcmVsYXRlZCBmdW5jdGlvbnM6CisKKyAgICBwbmdfY29udmVydF90b19yZmNfMTEyMygpIGluIHBuZy5jCisgICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExNTIoKSBpbiBlcnJvcikKKyAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZAorICAgICAgaW4gcG5nd3JpdGUuYworICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgaW4gcG5nd3JpdGUuYworICAgIHBuZ19nZXRfdElNRSgpIGluIHBuZ2dldC5jCisgICAgcG5nX2hhbmRsZV90SU1FKCkgaW4gcG5ncnV0aWwuYywgY2FsbGVkIGluIHBuZ3JlYWQuYworICAgIHBuZ19zZXRfdElNRSgpIGluIHBuZ3NldC5jCisgICAgcG5nX3dyaXRlX3RJTUUoKSBpbiBwbmd3dXRpbC5jLCBjYWxsZWQgaW4gcG5nd3JpdGUuYworCitBbGwgYXBwZWFyIHRvIGhhbmRsZSBkYXRlcyBwcm9wZXJseSBpbiBhIFkySyBlbnZpcm9ubWVudC4gIFRoZQorcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmdW5jdGlvbiBjYWxscyBnbXRpbWUoKSB0byBjb252ZXJ0IGZyb20gc3lzdGVtCitjbG9jayB0aW1lLCB3aGljaCByZXR1cm5zICh5ZWFyIC0gMTkwMCksIHdoaWNoIHdlIHByb3Blcmx5IGNvbnZlcnQgdG8KK3RoZSBmdWxsIDQtZGlnaXQgeWVhci4gIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhcHBsaWNhdGlvbnMgdXNpbmcKK2xpYnBuZyBhcmUgbm90IHBhc3NpbmcgNC1kaWdpdCB5ZWFycyBpbnRvIHRoZSBwbmdfY29udmVydF90b19yZmNfMTEyMygpCitmdW5jdGlvbiwgb3IgdGhhdCB0aGV5IGFyZSBpbmNvcnJlY3RseSBwYXNzaW5nIG9ubHkgYSAyLWRpZ2l0IHllYXIKK2luc3RlYWQgb2YgInllYXIgLSAxOTAwIiBpbnRvIHRoZSBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZ1bmN0aW9uLAorYnV0IHRoaXMgaXMgbm90IHVuZGVyIG91ciBjb250cm9sLiAgVGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uIGhhcyBhbHdheXMKK3N0YXRlZCB0aGF0IGl0IHdvcmtzIHdpdGggNC1kaWdpdCB5ZWFycywgYW5kIHRoZSBBUElzIGhhdmUgYmVlbgorZG9jdW1lbnRlZCBhcyBzdWNoLgorCitUaGUgdElNRSBjaHVuayBpdHNlbGYgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgdXNlcyBhIDItYnl0ZSB1bnNpZ25lZAoraW50ZWdlciB0byBob2xkIHRoZSB5ZWFyLCBhbmQgY2FuIGhvbGQgeWVhcnMgYXMgbGFyZ2UgYXMgNjU1MzUuCisKK3psaWIsIHVwb24gd2hpY2ggbGlicG5nIGRlcGVuZHMsIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IGNvbnRhaW5zCitubyBkYXRlLXJlbGF0ZWQgY29kZS4KKworCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAgIGxpYnBuZyBtYWludGFpbmVyCisgICBQTkcgRGV2ZWxvcG1lbnQgR3JvdXAKKworLlNIIE5PVEUKKworTm90ZSBhYm91dCBsaWJwbmcgdmVyc2lvbiBudW1iZXJzOgorCitEdWUgdG8gdmFyaW91cyBtaXNjb21tdW5pY2F0aW9ucywgdW5mb3Jlc2VlbiBjb2RlIGluY29tcGF0aWJpbGl0aWVzCithbmQgb2NjYXNpb25hbCBmYWN0b3JzIG91dHNpZGUgdGhlIGF1dGhvcnMnIGNvbnRyb2wsIHZlcnNpb24gbnVtYmVyaW5nCitvbiB0aGUgbGlicmFyeSBoYXMgbm90IGFsd2F5cyBiZWVuIGNvbnNpc3RlbnQgYW5kIHN0cmFpZ2h0Zm9yd2FyZC4KK1RoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyBtYXR0ZXJzIHNpbmNlIHZlcnNpb24gMC44OWMsIHdoaWNoIHdhcwordGhlIGZpcnN0IHdpZGVseSB1c2VkIHJlbGVhc2U6CisKKyBzb3VyY2UgICAgICAgICAgICAgcG5nLmggIHBuZy5oICBzaGFyZWQtbGliCisgdmVyc2lvbiAgICAgICAgICAgIHN0cmluZyAgIGludCAgdmVyc2lvbgorIC0tLS0tLS0gICAgICAgICAgICAtLS0tLS0gIC0tLS0tIC0tLS0tLS0tLS0KKyAwLjg5YyAoImJldGEgMyIpICAwLjg5ICAgICAgIDg5ICAxLjAuODkKKyAwLjkwICAoImJldGEgNCIpICAwLjkwICAgICAgIDkwICAwLjkwCisgMC45NSAgKCJiZXRhIDUiKSAgMC45NSAgICAgICA5NSAgMC45NQorIDAuOTYgICgiYmV0YSA2IikgIDAuOTYgICAgICAgOTYgIDAuOTYKKyAwLjk3YiAoImJldGEgNyIpICAxLjAwLjk3ICAgIDk3ICAxLjAuMQorIDAuOTdjICAgICAgICAgICAgIDAuOTcgICAgICAgOTcgIDIuMC45NworIDAuOTggICAgICAgICAgICAgIDAuOTggICAgICAgOTggIDIuMC45OAorIDAuOTkgICAgICAgICAgICAgIDAuOTkgICAgICAgOTggIDIuMC45OQorIDAuOTlhLW0gICAgICAgICAgIDAuOTkgICAgICAgOTkgIDIuMC45OQorIDEuMDAgICAgICAgICAgICAgIDEuMDAgICAgICAxMDAgIDIuMS4wCisgMS4wLjAgICAgICAgICAgICAgMS4wLjAgICAgIDEwMCAgMi4xLjAKKyAxLjAuMCAgIChmcm9tIGhlcmUgb24sIHRoZSAgMTAwICAyLjEuMAorIDEuMC4xICAgIHBuZy5oIHN0cmluZyBpcyAgMTAwMDEgIDIuMS4wCisgMS4wLjFhLWUgaWRlbnRpY2FsIHRvIHRoZSAxMDAwMiAgZnJvbSBoZXJlIG9uLCB0aGUKKyAxLjAuMiAgICBzb3VyY2UgdmVyc2lvbikgIDEwMDAyICBzaGFyZWQgbGlicmFyeSBpcyAyLlYKKyAxLjAuMmEtYiAgICAgICAgICAgICAgICAgIDEwMDAzICB3aGVyZSBWIGlzIHRoZSBzb3VyY2UKKyAxLjAuMSAgICAgICAgICAgICAgICAgICAgIDEwMDAxICBjb2RlIHZlcnNpb24gZXhjZXB0IGFzCisgMS4wLjFhLWUgICAgICAgICAgICAgICAgICAxMDAwMiAgMi4xLjAuMWEtZSAgIG5vdGVkLgorIDEuMC4yICAgICAgICAgICAgICAgICAgICAgMTAwMDIgIDIuMS4wLjIKKyAxLjAuMmEtYiAgICAgICAgICAgICAgICAgIDEwMDAzICAyLjEuMC4yYS1iCisgMS4wLjMgICAgICAgICAgICAgICAgICAgICAxMDAwMyAgMi4xLjAuMworIDEuMC4zYS1kICAgICAgICAgICAgICAgICAgMTAwMDQgIDIuMS4wLjNhLWQKKyAxLjAuNCAgICAgICAgICAgICAgICAgICAgIDEwMDA0ICAyLjEuMC40CisgMS4wLjRhLWYgICAgICAgICAgICAgICAgICAxMDAwNSAgMi4xLjAuNGEtZgorIDEuMC41ICgrIDIgcGF0Y2hlcykgICAgICAgMTAwMDUgIDIuMS4wLjUKKyAxLjAuNWEtZCAgICAgICAgICAgICAgICAgIDEwMDA2ICAyLjEuMC41YS1kCisgMS4wLjVlLXIgICAgICAgICAgICAgICAgICAxMDEwMCAgMi4xLjAuNWUtcgorIDEuMC41cy12ICAgICAgICAgICAgICAgICAgMTAwMDYgIDIuMS4wLjVzLXYKKyAxLjAuNiAoKyAzIHBhdGNoZXMpICAgICAgIDEwMDA2ICAyLjEuMC42CisgMS4wLjZkLWcgICAgICAgICAgICAgICAgICAxMDAwNyAgMi4xLjAuNmQtZworIDEuMC42aCAgICAgICAgICAgICAgICAgICAgMTAwMDcgIDEwLjZoCisgMS4wLjZpICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmkKKyAxLjAuNmogICAgICAgICAgICAgICAgICAgIDEwMDA3ICAyLjEuMC42agorIDEuMC43YmV0YTExLTE0ICAgIERMTE5VTSAgMTAwMDcgIDIuMS4wLjdiZXRhMTEtMTQKKyAxLjAuN2JldGExNS0xOCAgICAgICAxICAgIDEwMDA3ICAyLjEuMC43YmV0YTE1LTE4CisgMS4wLjdyYzEtMiAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuN3JjMS0yCisgMS4wLjcgICAgICAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuNworIDEuMC44YmV0YTEtNCAgICAgICAgIDEgICAgMTAwMDggIDIuMS4wLjhiZXRhMS00CisgMS4wLjhyYzEgICAgICAgICAgICAgMSAgICAxMDAwOCAgMi4xLjAuOHJjMQorIDEuMC44ICAgICAgICAgICAgICAgIDEgICAgMTAwMDggIDIuMS4wLjgKKyAxLjAuOWJldGExLTYgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45YmV0YTEtNgorIDEuMC45cmMxICAgICAgICAgICAgIDEgICAgMTAwMDkgIDIuMS4wLjlyYzEKKyAxLjAuOWJldGE3LTEwICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45YmV0YTctMTAKKyAxLjAuOXJjMiAgICAgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45cmMyCisgMS4wLjkgICAgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOQorIDEuMC4xMGJldGExICAgICAgICAgIDEgICAgMTAwMTAgIDIuMS4wLjEwYmV0YTEKKyAxLjAuMTByYzEgICAgICAgICAgICAxICAgIDEwMDEwICAyLjEuMC4xMHJjMQorIDEuMC4xMCAgICAgICAgICAgICAgIDEgICAgMTAwMTAgIDIuMS4wLjEwCisgMS4wLjExYmV0YTEtMyAgICAgICAgMSAgICAxMDAxMSAgMi4xLjAuMTFiZXRhMS0zCisgMS4wLjExcmMxICAgICAgICAgICAgMSAgICAxMDAxMSAgMi4xLjAuMTFyYzEKKyAxLjAuMTEgICAgICAgICAgICAgICAxICAgIDEwMDExICAyLjEuMC4xMQorIDEuMC4xMmJldGExLTIgICAgICAgIDIgICAgMTAwMTIgIDIuMS4wLjEyYmV0YTEtMgorIDEuMC4xMnJjMSAgICAgICAgICAgIDIgICAgMTAwMTIgIDIuMS4wLjEycmMxCisgMS4wLjEyICAgICAgICAgICAgICAgMiAgICAxMDAxMiAgMi4xLjAuMTIKKyAxLjEuMGEtZiAgICAgICAgICAgICAtICAgIDEwMTAwICAyLjEuMS4wYS1mIGFiYW5kb25lZAorIDEuMi4wYmV0YTEtMiAgICAgICAgIDIgICAgMTAyMDAgIDIuMS4yLjBiZXRhMS0yCisgMS4yLjBiZXRhMy01ICAgICAgICAgMyAgICAxMDIwMCAgMy4xLjIuMGJldGEzLTUKKyAxLjIuMHJjMSAgICAgICAgICAgICAzICAgIDEwMjAwICAzLjEuMi4wcmMxCisgMS4yLjAgICAgICAgICAgICAgICAgMyAgICAxMDIwMCAgMy4xLjIuMAorIDEuMi4xYmV0YS00ICAgICAgICAgIDMgICAgMTAyMDEgIDMuMS4yLjFiZXRhMS00CisgMS4yLjFyYzEtMiAgICAgICAgICAgMyAgICAxMDIwMSAgMy4xLjIuMXJjMS0yCisgMS4yLjEgICAgICAgICAgICAgICAgMyAgICAxMDIwMSAgMy4xLjIuMQorIDEuMi4yYmV0YTEtNiAgICAgICAgMTIgICAgMTAyMDIgIDEyLnNvLjAuMS4yLjJiZXRhMS02CisgMS4wLjEzYmV0YTEgICAgICAgICAxMCAgICAxMDAxMyAgMTAuc28uMC4xLjAuMTNiZXRhMQorIDEuMC4xM3JjMSAgICAgICAgICAgMTAgICAgMTAwMTMgIDEwLnNvLjAuMS4wLjEzcmMxCisgMS4yLjJyYzEgICAgICAgICAgICAxMiAgICAxMDIwMiAgMTIuc28uMC4xLjIuMnJjMQorIDEuMC4xMyAgICAgICAgICAgICAgMTAgICAgMTAwMTMgIDEwLnNvLjAuMS4wLjEzCisgMS4yLjIgICAgICAgICAgICAgICAxMiAgICAxMDIwMiAgMTIuc28uMC4xLjIuMgorIDEuMi4zcmMxLTYgICAgICAgICAgMTIgICAgMTAyMDMgIDEyLnNvLjAuMS4yLjNyYzEtNgorIDEuMi4zICAgICAgICAgICAgICAgMTIgICAgMTAyMDMgIDEyLnNvLjAuMS4yLjMKKyAxLjIuNGJldGExLTMgICAgICAgIDEzICAgIDEwMjA0ICAxMi5zby4wLjEuMi40YmV0YTEtMworIDEuMi40cmMxICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjRyYzEKKyAxLjAuMTQgICAgICAgICAgICAgIDEwICAgIDEwMDE0ICAxMC5zby4wLjEuMC4xNAorIDEuMi40ICAgICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjQKKyAxLjIuNWJldGExLTIgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41YmV0YTEtMgorIDEuMC4xNXJjMSAgICAgICAgICAgMTAgICAgMTAwMTUgIDEwLnNvLjAuMS4wLjE1cmMxCisgMS4wLjE1ICAgICAgICAgICAgICAxMCAgICAxMDAxNSAgMTAuc28uMC4xLjAuMTUKKyAxLjIuNSAgICAgICAgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41CisgMS4yLjZiZXRhMS00ICAgICAgICAxMyAgICAxMDIwNiAgMTIuc28uMC4xLjIuNmJldGExLTQKKyAxLjIuNnJjMS01ICAgICAgICAgIDEzICAgIDEwMjA2ICAxMi5zby4wLjEuMi42cmMxLTUKKyAxLjAuMTYgICAgICAgICAgICAgIDEwICAgIDEwMDE2ICAxMC5zby4wLjEuMC4xNgorIDEuMi42ICAgICAgICAgICAgICAgMTMgICAgMTAyMDYgIDEyLnNvLjAuMS4yLjYKKyAxLjIuN2JldGExLTIgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43YmV0YTEtMgorIDEuMC4xN3JjMSAgICAgICAgICAgMTAgICAgMTAwMTcgIDEwLnNvLjAuMS4wLjE3cmMxCisgMS4yLjdyYzEgICAgICAgICAgICAxMyAgICAxMDIwNyAgMTIuc28uMC4xLjIuN3JjMQorIDEuMC4xNyAgICAgICAgICAgICAgMTAgICAgMTAwMTcgIDEwLnNvLjAuMS4wLjE3CisgMS4yLjcgICAgICAgICAgICAgICAxMyAgICAxMDIwNyAgMTIuc28uMC4xLjIuNworIDEuMi44YmV0YTEtNSAgICAgICAgMTMgICAgMTAyMDggIDEyLnNvLjAuMS4yLjhiZXRhMS01CisgMS4wLjE4cmMxLTUgICAgICAgICAxMCAgICAxMDAxOCAgMTAuc28uMC4xLjAuMThyYzEtNQorIDEuMi44cmMxLTUgICAgICAgICAgMTMgICAgMTAyMDggIDEyLnNvLjAuMS4yLjhyYzEtNQorIDEuMC4xOCAgICAgICAgICAgICAgMTAgICAgMTAwMTggIDEwLnNvLjAuMS4wLjE4CisgMS4yLjggICAgICAgICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOAorIDEuMi45YmV0YTEtMyAgICAgICAgMTMgICAgMTAyMDkgIDEyLnNvLjAuMS4yLjliZXRhMS0zCisgMS4yLjliZXRhNC0xMSAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC45Wy4wXQorIDEuMi45cmMxICAgICAgICAgICAgMTMgICAgMTAyMDkgIDEyLnNvLjAuOVsuMF0KKyAxLjIuOSAgICAgICAgICAgICAgIDEzICAgIDEwMjA5ICAxMi5zby4wLjlbLjBdCisgMS4yLjEwYmV0YTEtOCAgICAgICAxMyAgICAxMDIxMCAgMTIuc28uMC4xMFsuMF0KKyAxLjIuMTByYzEtMyAgICAgICAgIDEzICAgIDEwMjEwICAxMi5zby4wLjEwWy4wXQorIDEuMi4xMCAgICAgICAgICAgICAgMTMgICAgMTAyMTAgIDEyLnNvLjAuMTBbLjBdCisgMS4yLjExYmV0YTEtNCAgICAgICAxMyAgICAxMDIxMSAgMTIuc28uMC4xMVsuMF0KKyAxLjAuMTlyYzEtNSAgICAgICAgIDEwICAgIDEwMDE5ICAxMC5zby4wLjE5Wy4wXQorIDEuMi4xMXJjMS01ICAgICAgICAgMTMgICAgMTAyMTEgIDEyLnNvLjAuMTFbLjBdCisgMS4wLjE5ICAgICAgICAgICAgICAxMCAgICAxMDAxOSAgMTAuc28uMC4xOVsuMF0KKyAxLjIuMTEgICAgICAgICAgICAgIDEzICAgIDEwMjExICAxMi5zby4wLjExWy4wXQorIDEuMC4yMCAgICAgICAgICAgICAgMTAgICAgMTAwMjAgIDEwLnNvLjAuMjBbLjBdCisgMS4yLjEyICAgICAgICAgICAgICAxMyAgICAxMDIxMiAgMTIuc28uMC4xMlsuMF0KKyAxLjIuMTNiZXRhMSAgICAgICAgIDEzICAgIDEwMjEzICAxMi5zby4wLjEzWy4wXQorIDEuMC4yMSAgICAgICAgICAgICAgMTAgICAgMTAwMjEgIDEwLnNvLjAuMjFbLjBdCisgMS4yLjEzICAgICAgICAgICAgICAxMyAgICAxMDIxMyAgMTIuc28uMC4xM1suMF0KKyAxLjIuMTRiZXRhMS0yICAgICAgIDEzICAgIDEwMjE0ICAxMi5zby4wLjE0Wy4wXQorIDEuMC4yMnJjMSAgICAgICAgICAgMTAgICAgMTAwMjIgIDEwLnNvLjAuMjJbLjBdCisgMS4yLjE0cmMxICAgICAgICAgICAxMyAgICAxMDIxNCAgMTIuc28uMC4xNFsuMF0KKyAxLjIuMTViZXRhMS02ICAgICAgIDEzICAgIDEwMjE1ICAxMi5zby4wLjE1Wy4wXQorIDEuMC4yM3JjMS01ICAgICAgICAgMTAgICAgMTAwMjMgIDEwLnNvLjAuMjNbLjBdCisgMS4yLjE1cmMxLTUgICAgICAgICAxMyAgICAxMDIxNSAgMTIuc28uMC4xNVsuMF0KKyAxLjAuMjMgICAgICAgICAgICAgIDEwICAgIDEwMDIzICAxMC5zby4wLjIzWy4wXQorIDEuMi4xNSAgICAgICAgICAgICAgMTMgICAgMTAyMTUgIDEyLnNvLjAuMTVbLjBdCisgMS4yLjE2YmV0YTEtMiAgICAgICAxMyAgICAxMDIxNiAgMTIuc28uMC4xNlsuMF0KKyAxLjIuMTZyYzEgICAgICAgICAgIDEzICAgIDEwMjE2ICAxMi5zby4wLjE2Wy4wXQorIDEuMC4yNCAgICAgICAgICAgICAgMTAgICAgMTAwMjQgIDEwLnNvLjAuMjRbLjBdCisgMS4yLjE2ICAgICAgICAgICAgICAxMyAgICAxMDIxNiAgMTIuc28uMC4xNlsuMF0KKyAxLjIuMTdiZXRhMS0yICAgICAgIDEzICAgIDEwMjE3ICAxMi5zby4wLjE3Wy4wXQorIDEuMC4yNXJjMSAgICAgICAgICAgMTAgICAgMTAwMjUgIDEwLnNvLjAuMjVbLjBdCisgMS4yLjE3cmMxLTMgICAgICAgICAxMyAgICAxMDIxNyAgMTIuc28uMC4xN1suMF0KKyAxLjAuMjUgICAgICAgICAgICAgIDEwICAgIDEwMDI1ICAxMC5zby4wLjI1Wy4wXQorIDEuMi4xNyAgICAgICAgICAgICAgMTMgICAgMTAyMTcgIDEyLnNvLjAuMTdbLjBdCisgMS4wLjI2ICAgICAgICAgICAgICAxMCAgICAxMDAyNiAgMTAuc28uMC4yNlsuMF0KKyAxLjIuMTggICAgICAgICAgICAgIDEzICAgIDEwMjE4ICAxMi5zby4wLjE4Wy4wXQorIDEuMi4xOWJldGExLTMxICAgICAgMTMgICAgMTAyMTkgIDEyLnNvLjAuMTlbLjBdCisgMS4wLjI3cmMxLTYgICAgICAgICAxMCAgICAxMDAyNyAgMTAuc28uMC4yN1suMF0KKyAxLjIuMTlyYzEtNiAgICAgICAgIDEzICAgIDEwMjE5ICAxMi5zby4wLjE5Wy4wXQorIDEuMC4yNyAgICAgICAgICAgICAgMTAgICAgMTAwMjcgIDEwLnNvLjAuMjdbLjBdCisgMS4yLjE5ICAgICAgICAgICAgICAxMyAgICAxMDIxOSAgMTIuc28uMC4xOVsuMF0KKyAxLjIuMjBiZXRhMDEtMDQgICAgIDEzICAgIDEwMjIwICAxMi5zby4wLjIwWy4wXQorIDEuMC4yOHJjMS02ICAgICAgICAgMTAgICAgMTAwMjggIDEwLnNvLjAuMjhbLjBdCisgMS4yLjIwcmMxLTYgICAgICAgICAxMyAgICAxMDIyMCAgMTIuc28uMC4yMFsuMF0KKyAxLjAuMjggICAgICAgICAgICAgIDEwICAgIDEwMDI4ICAxMC5zby4wLjI4Wy4wXQorIDEuMi4yMCAgICAgICAgICAgICAgMTMgICAgMTAyMjAgIDEyLnNvLjAuMjBbLjBdCisgMS4yLjIxYmV0YTEtMiAgICAgICAxMyAgICAxMDIyMSAgMTIuc28uMC4yMVsuMF0KKyAxLjIuMjFyYzEtMyAgICAgICAgIDEzICAgIDEwMjIxICAxMi5zby4wLjIxWy4wXQorIDEuMC4yOSAgICAgICAgICAgICAgMTAgICAgMTAwMjkgIDEwLnNvLjAuMjlbLjBdCisgMS4yLjIxICAgICAgICAgICAgICAxMyAgICAxMDIyMSAgMTIuc28uMC4yMVsuMF0KKyAxLjIuMjJiZXRhMS00ICAgICAgIDEzICAgIDEwMjIyICAxMi5zby4wLjIyWy4wXQorIDEuMC4zMHJjMSAgICAgICAgICAgMTMgICAgMTAwMzAgIDEwLnNvLjAuMzBbLjBdCisgMS4yLjIycmMxICAgICAgICAgICAxMyAgICAxMDIyMiAgMTIuc28uMC4yMlsuMF0KKyAxLjAuMzAgICAgICAgICAgICAgIDEwICAgIDEwMDMwICAxMC5zby4wLjMwWy4wXQorIDEuMi4yMiAgICAgICAgICAgICAgMTMgICAgMTAyMjIgIDEyLnNvLjAuMjJbLjBdCisgMS4yLjIzYmV0YTAxLTA1ICAgICAxMyAgICAxMDIyMyAgMTIuc28uMC4yM1suMF0KKyAxLjIuMjNyYzAxICAgICAgICAgIDEzICAgIDEwMjIzICAxMi5zby4wLjIzWy4wXQorIDEuMi4yMyAgICAgICAgICAgICAgMTMgICAgMTAyMjMgIDEyLnNvLjAuMjNbLjBdCisgMS4yLjI0YmV0YTAxLTAyICAgICAxMyAgICAxMDIyNCAgMTIuc28uMC4yNFsuMF0KKyAxLjIuMjRyYzAxICAgICAgICAgIDEzICAgIDEwMjI0ICAxMi5zby4wLjI0Wy4wXQorIDEuMi4yNCAgICAgICAgICAgICAgMTMgICAgMTAyMjQgIDEyLnNvLjAuMjRbLjBdCisgMS4yLjI1YmV0YTAxLTA2ICAgICAxMyAgICAxMDIyNSAgMTIuc28uMC4yNVsuMF0KKyAxLjIuMjVyYzAxLTAyICAgICAgIDEzICAgIDEwMjI1ICAxMi5zby4wLjI1Wy4wXQorIDEuMC4zMSAgICAgICAgICAgICAgMTAgICAgMTAwMzEgIDEwLnNvLjAuMzFbLjBdCisgMS4yLjI1ICAgICAgICAgICAgICAxMyAgICAxMDIyNSAgMTIuc28uMC4yNVsuMF0KKyAxLjIuMjZiZXRhMDEtMDYgICAgIDEzICAgIDEwMjI2ICAxMi5zby4wLjI2Wy4wXQorIDEuMi4yNnJjMDEgICAgICAgICAgMTMgICAgMTAyMjYgIDEyLnNvLjAuMjZbLjBdCisgMS4yLjI2ICAgICAgICAgICAgICAxMyAgICAxMDIyNiAgMTIuc28uMC4yNlsuMF0KKyAxLjAuMzIgICAgICAgICAgICAgIDEwICAgIDEwMDMyICAxMC5zby4wLjMyWy4wXQorIDEuMi4yN2JldGEwMS0wNiAgICAgMTMgICAgMTAyMjcgIDEyLnNvLjAuMjdbLjBdCisgMS4yLjI3cmMwMSAgICAgICAgICAxMyAgICAxMDIyNyAgMTIuc28uMC4yN1suMF0KKyAxLjAuMzMgICAgICAgICAgICAgIDEwICAgIDEwMDMzICAxMC5zby4wLjMzWy4wXQorIDEuMi4yNyAgICAgICAgICAgICAgMTMgICAgMTAyMjcgIDEyLnNvLjAuMjdbLjBdCisgMS4wLjM0ICAgICAgICAgICAgICAxMCAgICAxMDAzNCAgMTAuc28uMC4zNFsuMF0KKyAxLjIuMjggICAgICAgICAgICAgIDEzICAgIDEwMjI4ICAxMi5zby4wLjI4Wy4wXQorIDEuMi4yOWJldGEwMS0wMyAgICAgMTMgICAgMTAyMjkgIDEyLnNvLjAuMjlbLjBdCisgMS4yLjI5cmMwMSAgICAgICAgICAxMyAgICAxMDIyOSAgMTIuc28uMC4yOVsuMF0KKyAxLjAuMzUgICAgICAgICAgICAgIDEwICAgIDEwMDM1ICAxMC5zby4wLjM1Wy4wXQorIDEuMi4yOSAgICAgICAgICAgICAgMTMgICAgMTAyMjkgIDEyLnNvLjAuMjlbLjBdCisgMS4wLjM3ICAgICAgICAgICAgICAxMCAgICAxMDAzNyAgMTAuc28uMC4zN1suMF0KKyAxLjIuMzBiZXRhMDEtMDQgICAgIDEzICAgIDEwMjMwICAxMi5zby4wLjMwWy4wXQorIDEuMC4zOHJjMDEtMDggICAgICAgMTAgICAgMTAwMzggIDEwLnNvLjAuMzhbLjBdCisgMS4yLjMwcmMwMS0wOCAgICAgICAxMyAgICAxMDIzMCAgMTIuc28uMC4zMFsuMF0KKyAxLjAuMzggICAgICAgICAgICAgIDEwICAgIDEwMDM4ICAxMC5zby4wLjM4Wy4wXQorIDEuMi4zMCAgICAgICAgICAgICAgMTMgICAgMTAyMzAgIDEyLnNvLjAuMzBbLjBdCisgMS4wLjM5cmMwMS0wMyAgICAgICAxMCAgICAxMDAzOSAgMTAuc28uMC4zOVsuMF0KKyAxLjIuMzFyYzAxLTAzICAgICAgIDEzICAgIDEwMjMxICAxMi5zby4wLjMxWy4wXQorIDEuMC4zOSAgICAgICAgICAgICAgMTAgICAgMTAwMzkgIDEwLnNvLjAuMzlbLjBdCisgMS4yLjMxICAgICAgICAgICAgICAxMyAgICAxMDIzMSAgMTIuc28uMC4zMVsuMF0KKyAxLjIuMzJiZXRhMDEtMDIgICAgIDEzICAgIDEwMjMyICAxMi5zby4wLjMyWy4wXQorIDEuMC40MHJjMDEgICAgICAgICAgMTAgICAgMTAwNDAgIDEwLnNvLjAuNDBbLjBdCisgMS4yLjMycmMwMSAgICAgICAgICAxMyAgICAxMDIzMiAgMTIuc28uMC4zMlsuMF0KKyAxLjAuNDAgICAgICAgICAgICAgIDEwICAgIDEwMDQwICAxMC5zby4wLjQwWy4wXQorIDEuMi4zMiAgICAgICAgICAgICAgMTMgICAgMTAyMzIgIDEyLnNvLjAuMzJbLjBdCisgMS4yLjMzYmV0YTAxLTAyICAgICAxMyAgICAxMDIzMyAgMTIuc28uMC4zM1suMF0KKyAxLjIuMzNyYzAxLTAyICAgICAgIDEzICAgIDEwMjMzICAxMi5zby4wLjMzWy4wXQorIDEuMC40MXJjMDEgICAgICAgICAgMTAgICAgMTAwNDEgIDEwLnNvLjAuNDFbLjBdCisgMS4yLjMzICAgICAgICAgICAgICAxMyAgICAxMDIzMyAgMTIuc28uMC4zM1suMF0KKyAxLjAuNDEgICAgICAgICAgICAgIDEwICAgIDEwMDQxICAxMC5zby4wLjQxWy4wXQorIDEuMi4zNGJldGEwMS0wNyAgICAgMTMgICAgMTAyMzQgIDEyLnNvLjAuMzRbLjBdCisgMS4wLjQycmMwMSAgICAgICAgICAxMCAgICAxMDA0MiAgMTAuc28uMC40MlsuMF0KKyAxLjIuMzRyYzAxICAgICAgICAgIDEzICAgIDEwMjM0ICAxMi5zby4wLjM0Wy4wXQorIDEuMC40MiAgICAgICAgICAgICAgMTAgICAgMTAwNDIgIDEwLnNvLjAuNDJbLjBdCisgMS4yLjM0ICAgICAgICAgICAgICAxMyAgICAxMDIzNCAgMTIuc28uMC4zNFsuMF0KKyAxLjIuMzViZXRhMDEtMDMgICAgIDEzICAgIDEwMjM1ICAxMi5zby4wLjM1Wy4wXQorIDEuMC40M3JjMDEtMDIgICAgICAgMTAgICAgMTAwNDMgIDEwLnNvLjAuNDNbLjBdCisgMS4yLjM1cmMwMS0wMiAgICAgICAxMyAgICAxMDIzNSAgMTIuc28uMC4zNVsuMF0KKyAxLjAuNDMgICAgICAgICAgICAgIDEwICAgIDEwMDQzICAxMC5zby4wLjQzWy4wXQorIDEuMi4zNSAgICAgICAgICAgICAgMTMgICAgMTAyMzUgIDEyLnNvLjAuMzVbLjBdCisgMS4yLjM2YmV0YTAxLTA1ICAgICAxMyAgICAxMDIzNiAgMTIuc28uMC4zNlsuMF0KKyAxLjIuMzZyYzAxICAgICAgICAgIDEzICAgIDEwMjM2ICAxMi5zby4wLjM2Wy4wXQorIDEuMC40NCAgICAgICAgICAgICAgMTAgICAgMTAwNDQgIDEwLnNvLjAuNDRbLjBdCisgMS4yLjM2ICAgICAgICAgICAgICAxMyAgICAxMDIzNiAgMTIuc28uMC4zNlsuMF0KKyAxLjIuMzdiZXRhMDEtMDMgICAgIDEzICAgIDEwMjM3ICAxMi5zby4wLjM3Wy4wXQorIDEuMi4zN3JjMDEgICAgICAgICAgMTMgICAgMTAyMzcgIDEyLnNvLjAuMzdbLjBdCisgMS4yLjM3ICAgICAgICAgICAgICAxMyAgICAxMDIzNyAgMTIuc28uMC4zN1suMF0KKyAxLjIuNDUgICAgICAgICAgICAgIDEwICAgIDEwMDQ1ICAxMi5zby4wLjQ1Wy4wXQorIDEuMC40NiAgICAgICAgICAgICAgMTAgICAgMTAwNDYgIDEwLnNvLjAuNDZbLjBdCisgMS4yLjM4YmV0YTAxICAgICAgICAxMyAgICAxMDIzOCAgMTIuc28uMC4zOFsuMF0KKyAxLjIuMzhyYzAxLTAzICAgICAgIDEzICAgIDEwMjM4ICAxMi5zby4wLjM4Wy4wXQorIDEuMC40NyAgICAgICAgICAgICAgMTAgICAgMTAwNDcgIDEwLnNvLjAuNDdbLjBdCisgMS4yLjM4ICAgICAgICAgICAgICAxMyAgICAxMDIzOCAgMTIuc28uMC4zOFsuMF0KKyAxLjIuMzliZXRhMDEtMDUgICAgIDEzICAgIDEwMjM5ICAxMi5zby4wLjM5Wy4wXQorIDEuMi4zOXJjMDEgICAgICAgICAgMTMgICAgMTAyMzkgIDEyLnNvLjAuMzlbLjBdCisgMS4wLjQ4ICAgICAgICAgICAgICAxMCAgICAxMDA0OCAgMTAuc28uMC40OFsuMF0KKyAxLjIuMzkgICAgICAgICAgICAgIDEzICAgIDEwMjM5ICAxMi5zby4wLjM5Wy4wXQorIDEuMi40MGJldGEwMSAgICAgICAgMTMgICAgMTAyNDAgIDEyLnNvLjAuNDBbLjBdCisgMS4yLjQwcmMwMSAgICAgICAgICAxMyAgICAxMDI0MCAgMTIuc28uMC40MFsuMF0KKyAxLjAuNDkgICAgICAgICAgICAgIDEwICAgIDEwMDQ5ICAxMC5zby4wLjQ5Wy4wXQorIDEuMi40MCAgICAgICAgICAgICAgMTMgICAgMTAyNDAgIDEyLnNvLjAuNDBbLjBdCisgMS4wLjUwICAgICAgICAgICAgICAxMCAgICAxMDA1MCAgMTAuc28uMC41MFsuMF0KKyAxLjIuNDFiZXRhMDEtMTggICAgIDEzICAgIDEwMjQxICAxMi5zby4wLjQxWy4wXQorIDEuMC41MXJjMDEgICAgICAgICAgMTAgICAgMTAwNTEgIDEwLnNvLjAuNTFbLjBdCisgMS4yLjQxcmMwMS0wMyAgICAgICAxMyAgICAxMDI0MSAgMTIuc28uMC40MVsuMF0KKyAxLjAuNTEgICAgICAgICAgICAgIDEwICAgIDEwMDUxICAxMC5zby4wLjUxWy4wXQorIDEuMi40MSAgICAgICAgICAgICAgMTMgICAgMTAyNDEgIDEyLnNvLjAuNDFbLjBdCisgMS4yLjQyYmV0YTAxLTAyICAgICAxMyAgICAxMDI0MiAgMTIuc28uMC40MlsuMF0KKyAxLjIuNDJyYzAxLTA1ICAgICAgIDEzICAgIDEwMjQyICAxMi5zby4wLjQyWy4wXQorIDEuMC41MiAgICAgICAgICAgICAgMTAgICAgMTAwNTIgIDEwLnNvLjAuNTJbLjBdCisgMS4yLjQyICAgICAgICAgICAgICAxMyAgICAxMDI0MiAgMTIuc28uMC40MlsuMF0KKyAxLjIuNDNiZXRhMDEtMDUgICAgIDEzICAgIDEwMjQzICAxMi5zby4wLjQzWy4wXQorIDEuMC41M3JjMDEtMDIgICAgICAgMTAgICAgMTAwNTMgIDEwLnNvLjAuNTNbLjBdCisgMS4yLjQzcmMwMS0wMiAgICAgICAxMyAgICAxMDI0MyAgMTIuc28uMC40M1suMF0KKyAxLjAuNTMgICAgICAgICAgICAgIDEwICAgIDEwMDUzICAxMC5zby4wLjUzWy4wXQorIDEuMi40MyAgICAgICAgICAgICAgMTMgICAgMTAyNDMgIDEyLnNvLjAuNDNbLjBdCisgMS4yLjQ0YmV0YTAxLTAzICAgICAxMyAgICAxMDI0NCAgMTIuc28uMC40NFsuMF0KKyAxLjIuNDRyYzAxLTAzICAgICAgIDEzICAgIDEwMjQ0ICAxMi5zby4wLjQ0Wy4wXQorIDEuMi40NCAgICAgICAgICAgICAgMTMgICAgMTAyNDQgIDEyLnNvLjAuNDRbLjBdCisKK0hlbmNlZm9ydGggdGhlIHNvdXJjZSB2ZXJzaW9uIHdpbGwgbWF0Y2ggdGhlIHNoYXJlZC1saWJyYXJ5IG1pbm9yCithbmQgcGF0Y2ggbnVtYmVyczsgdGhlIHNoYXJlZC1saWJyYXJ5IG1ham9yIHZlcnNpb24gbnVtYmVyIHdpbGwgYmUKK3VzZWQgZm9yIGNoYW5nZXMgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYXMgaXQgaXMgaW50ZW5kZWQuICBUaGUKK1BOR19QTkdMSUJfVkVSIG1hY3JvLCB3aGljaCBpcyBub3QgdXNlZCB3aXRoaW4gbGlicG5nIGJ1dCBpcyBhdmFpbGFibGUKK2ZvciBhcHBsaWNhdGlvbnMsIGlzIGFuIHVuc2lnbmVkIGludGVnZXIgb2YgdGhlIGZvcm0geHl5enogY29ycmVzcG9uZGluZwordG8gdGhlIHNvdXJjZSB2ZXJzaW9uIHgueS56IChsZWFkaW5nIHplcm9zIGluIHkgYW5kIHopLiAgQmV0YSB2ZXJzaW9ucword2VyZSBnaXZlbiB0aGUgcHJldmlvdXMgcHVibGljIHJlbGVhc2UgbnVtYmVyIHBsdXMgYSBsZXR0ZXIsIHVudGlsCit2ZXJzaW9uIDEuMC42ajsgZnJvbSB0aGVuIG9uIHRoZXkgd2VyZSBnaXZlbiB0aGUgdXBjb21pbmcgcHVibGljCityZWxlYXNlIG51bWJlciBwbHVzICJiZXRhTk4iIG9yICJyY04iLgorCisuU0ggIlNFRSBBTFNPIgorLklSIGxpYnBuZ3BmKDMpICIsICIgcG5nKDUpCisuTFAKKy5JUiBsaWJwbmcgOgorLklQCitodHRwOi8vbGlicG5nLnNvdXJjZWZvcmdlLm5ldCAoZm9sbG93IHRoZSBbRE9XTkxPQURdIGxpbmspCitodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZworCisuTFAKKy5JUiB6bGliIDoKKy5JUAorKGdlbmVyYWxseSkgYXQgdGhlIHNhbWUgbG9jYXRpb24gYXMKKy5JIGxpYnBuZworb3IgYXQKKy5icgorZnRwOi8vZnRwLmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC96bGliCisKKy5MUAorLklSIFBORyBzcGVjaWZpY2F0aW9uOiBSRkMgMjA4MworLklQCisoZ2VuZXJhbGx5KSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcworLkkgbGlicG5nCitvciBhdAorLmJyCitmdHA6Ly9mdHAucmZjLWVkaXRvci5vcmc6L2luLW5vdGVzL3JmYzIwODMudHh0CisuYnIKK29yIChhcyBhIFczQyBSZWNvbW1lbmRhdGlvbikgYXQKKy5icgoraHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXBuZy5odG1sCisKKy5MUAorSW4gdGhlIGNhc2Ugb2YgYW55IGluY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgUE5HIHNwZWNpZmljYXRpb24KK2FuZCB0aGlzIGxpYnJhcnksIHRoZSBzcGVjaWZpY2F0aW9uIHRha2VzIHByZWNlZGVuY2UuCisKKy5TSCBBVVRIT1JTCitUaGlzIG1hbiBwYWdlOiBHbGVubiBSYW5kZXJzLVBlaHJzb24KKzxnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworVGhlIGNvbnRyaWJ1dGluZyBhdXRob3JzIHdvdWxkIGxpa2UgdG8gdGhhbmsgYWxsIHRob3NlIHdobyBoZWxwZWQKK3dpdGggdGVzdGluZywgYnVnIGZpeGVzLCBhbmQgcGF0aWVuY2UuICBUaGlzIHdvdWxkbid0IGhhdmUgYmVlbgorcG9zc2libGUgd2l0aG91dCBhbGwgb2YgeW91LgorCitUaGFua3MgdG8gRnJhbmsgSi4gVC4gV29qY2lrIGZvciBoZWxwaW5nIHdpdGggdGhlIGRvY3VtZW50YXRpb24uCisKK0xpYnBuZyB2ZXJzaW9uIDEuMi40NCAtIEp1bmUgMjYsIDIwMTA6CitJbml0aWFsbHkgY3JlYXRlZCBpbiAxOTk1IGJ5IEd1eSBFcmljIFNjaGFsbmF0LCB0aGVuIG9mIEdyb3VwIDQyLCBJbmMuCitDdXJyZW50bHkgbWFpbnRhaW5lZCBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24gKGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0KS4KKworU3VwcG9ydGVkIGJ5IHRoZSBQTkcgZGV2ZWxvcG1lbnQgZ3JvdXAKKy5icgorcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc2YubmV0Cisoc3Vic2NyaXB0aW9uIHJlcXVpcmVkOyB2aXNpdAorcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc291cmNlZm9yZ2UubmV0IChzdWJzY3JpcHRpb24gcmVxdWlyZWQ7IHZpc2l0CitodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9wbmctbW5nLWltcGxlbWVudAordG8gc3Vic2NyaWJlKS4KKworLlNIIENPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFOgorCisoVGhpcyBjb3B5IG9mIHRoZSBsaWJwbmcgbm90aWNlcyBpcyBwcm92aWRlZCBmb3IgeW91ciBjb252ZW5pZW5jZS4gIEluIGNhc2Ugb2YKK2FueSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoaXMgY29weSBhbmQgdGhlIG5vdGljZXMgaW4gdGhlIGZpbGUgcG5nLmggdGhhdCBpcworaW5jbHVkZWQgaW4gdGhlIGxpYnBuZyBkaXN0cmlidXRpb24sIHRoZSBsYXR0ZXIgc2hhbGwgcHJldmFpbC4pCisKK0lmIHlvdSBtb2RpZnkgbGlicG5nIHlvdSBtYXkgaW5zZXJ0IGFkZGl0aW9uYWwgbm90aWNlcyBpbW1lZGlhdGVseSBmb2xsb3dpbmcKK3RoaXMgc2VudGVuY2UuCisKK1RoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisKK2xpYnBuZyB2ZXJzaW9ucyAxLjIuNiwgQXVndXN0IDE1LCAyMDA0LCB0aHJvdWdoIDEuMi40NCwgSnVuZSAyNiwgMjAxMCwgYXJlCitDb3B5cmlnaHQgKGMpIDIwMDQsMjAwNi0yMDA4IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQorZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMi41Cit3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbCBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9ycworCisgICBDb3NtaW4gVHJ1dGEKKworbGlicG5nIHZlcnNpb25zIDEuMC43LCBKdWx5IDEsIDIwMDAsIHRocm91Z2ggMS4yLjUgLSBPY3RvYmVyIDMsIDIwMDIsIGFyZQorQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhbmQgYXJlCitkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMS4wLjYKK3dpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9ycworCisgICBTaW1vbi1QaWVycmUgQ2FkaWV1eAorICAgRXJpYyBTLiBSYXltb25kCisgICBHaWxsZXMgVm9sbGFudAorCithbmQgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB0byB0aGUgZGlzY2xhaW1lcjoKKworICAgVGhlcmUgaXMgbm8gd2FycmFudHkgYWdhaW5zdCBpbnRlcmZlcmVuY2Ugd2l0aCB5b3VyCisgICBlbmpveW1lbnQgb2YgdGhlIGxpYnJhcnkgb3IgYWdhaW5zdCBpbmZyaW5nZW1lbnQuCisgICBUaGVyZSBpcyBubyB3YXJyYW50eSB0aGF0IG91ciBlZmZvcnRzIG9yIHRoZSBsaWJyYXJ5CisgICB3aWxsIGZ1bGZpbGwgYW55IG9mIHlvdXIgcGFydGljdWxhciBwdXJwb3NlcyBvciBuZWVkcy4KKyAgIFRoaXMgbGlicmFyeSBpcyBwcm92aWRlZCB3aXRoIGFsbCBmYXVsdHMsIGFuZCB0aGUgZW50aXJlCisgICByaXNrIG9mIHNhdGlzZmFjdG9yeSBxdWFsaXR5LCBwZXJmb3JtYW5jZSwgYWNjdXJhY3ksIGFuZAorICAgZWZmb3J0IGlzIHdpdGggdGhlIHVzZXIuCisKK2xpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS4wLjYsIE1hcmNoIDIwLCAyMDAwLCBhcmUKK0NvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBHbGVubiBSYW5kZXJzLVBlaHJzb24KK0Rpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjk2LAord2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgorCisgICBUb20gTGFuZQorICAgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgICBXaWxsZW0gdmFuIFNjaGFpaworCitsaWJwbmcgdmVyc2lvbnMgMC44OSwgSnVuZSAxOTk2LCB0aHJvdWdoIDAuOTYsIE1heSAxOTk3LCBhcmUKK0NvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgorRGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuODgsCit3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CisKKyAgIEpvaG4gQm93bGVyCisgICBLZXZpbiBCcmFjZXkKKyAgIFNhbSBCdXNoZWxsCisgICBNYWdudXMgSG9sbWdyZW4KKyAgIEdyZWcgUm9lbG9mcworICAgVG9tIFRhbm5lcgorCitsaWJwbmcgdmVyc2lvbnMgMC41LCBNYXkgMTk5NSwgdGhyb3VnaCAwLjg4LCBKYW51YXJ5IDE5OTYsIGFyZQorQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgorCitGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgY29weXJpZ2h0IGFuZCBsaWNlbnNlLCAiQ29udHJpYnV0aW5nIEF1dGhvcnMiCitpcyBkZWZpbmVkIGFzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGluZGl2aWR1YWxzOgorCisgICBBbmRyZWFzIERpbGdlcgorICAgRGF2ZSBNYXJ0aW5kYWxlCisgICBHdXkgRXJpYyBTY2hhbG5hdAorICAgUGF1bCBTY2htaWR0CisgICBUaW0gV2VnbmVyCisKK1RoZSBQTkcgUmVmZXJlbmNlIExpYnJhcnkgaXMgc3VwcGxpZWQgIkFTIElTIi4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycworYW5kIEdyb3VwIDQyLCBJbmMuIGRpc2NsYWltIGFsbCB3YXJyYW50aWVzLCBleHByZXNzZWQgb3IgaW1wbGllZCwKK2luY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGUgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIG9mCitmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4KK2Fzc3VtZSBubyBsaWFiaWxpdHkgZm9yIGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgd2hpY2ggbWF5IHJlc3VsdCBmcm9tIHRoZSB1c2Ugb2YgdGhlIFBORworUmVmZXJlbmNlIExpYnJhcnksIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvdXJjZSBjb2RlLCBvciBwb3J0aW9ucyBoZXJlb2YsIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QKK3RvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQuCisKKzIuIEFsdGVyZWQgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoIGFuZAorICAgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZS4KKworMy4gVGhpcyBDb3B5cmlnaHQgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20KKyAgIGFueSBzb3VyY2Ugb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuIHNwZWNpZmljYWxseSBwZXJtaXQsIHdpdGhvdXQKK2ZlZSwgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc291cmNlIGNvZGUgYXMgYSBjb21wb25lbnQgdG8KK3N1cHBvcnRpbmcgdGhlIFBORyBmaWxlIGZvcm1hdCBpbiBjb21tZXJjaWFsIHByb2R1Y3RzLiAgSWYgeW91IHVzZSB0aGlzCitzb3VyY2UgY29kZSBpbiBhIHByb2R1Y3QsIGFja25vd2xlZGdtZW50IGlzIG5vdCByZXF1aXJlZCBidXQgd291bGQgYmUKK2FwcHJlY2lhdGVkLgorCisKK0EgInBuZ19nZXRfY29weXJpZ2h0IiBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIGZvciBjb252ZW5pZW50IHVzZSBpbiAiYWJvdXQiCitib3hlcyBhbmQgdGhlIGxpa2U6CisKKyAgIHByaW50ZigiJXMiLHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKKworQWxzbywgdGhlIFBORyBsb2dvIChpbiBQTkcgZm9ybWF0LCBvZiBjb3Vyc2UpIGlzIHN1cHBsaWVkIGluIHRoZQorZmlsZXMgInBuZ2Jhci5wbmciIGFuZCAicG5nYmFyLmpwZyAoODh4MzEpIGFuZCAicG5nbm93LnBuZyIgKDk4eDMxKS4KKworTGlicG5nIGlzIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgU29mdHdhcmUuICBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIGlzIGEKK2NlcnRpZmljYXRpb24gbWFyayBvZiB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworR2xlbm4gUmFuZGVycy1QZWhyc29uCitnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorSnVuZSAyNiwgMjAxMAorCisuXCIgZW5kIG9mIG1hbiBwYWdlCisKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9saWJwbmcvbGlicG5nLnR4dCBiL2NvbTMyL2xpYi9saWJwbmcvbGlicG5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzYwZjMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9saWJwbmcudHh0CkBAIC0wLDAgKzEsMjk1OSBAQAorbGlicG5nLnR4dCAtIEEgZGVzY3JpcHRpb24gb24gaG93IHRvIHVzZSBhbmQgbW9kaWZ5IGxpYnBuZworCisgbGlicG5nIHZlcnNpb24gMS4yLjggLSBEZWNlbWJlciAzLCAyMDA0CisgVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgPGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgorIENvcHlyaWdodCAoYykgMTk5OC0yMDA0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0Cisgbm90aWNlIGluIHBuZy5oLgorCisgYmFzZWQgb246CisKKyBsaWJwbmcgMS4wIGJldGEgNiAgdmVyc2lvbiAwLjk2IE1heSAyOCwgMTk5NworIFVwZGF0ZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IEFuZHJlYXMgRGlsZ2VyCisgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCisKKyBsaWJwbmcgMS4wIGJldGEgMiAtIHZlcnNpb24gMC44OCAgSmFudWFyeSAyNiwgMTk5NgorIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0Cisgbm90aWNlIGluIHBuZy5oLiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMKKyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KKworIFVwZGF0ZWQvcmV3cml0dGVuIHBlciByZXF1ZXN0IGluIHRoZSBsaWJwbmcgRkFRCisgQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEZyYW5rIEouIFQuIFdvamNpaworIERlY2VtYmVyIDE4LCAxOTk1ICYgSmFudWFyeSAyMCwgMTk5NgorCitJLiBJbnRyb2R1Y3Rpb24KKworVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gdXNlIGFuZCBtb2RpZnkgdGhlIFBORyByZWZlcmVuY2UgbGlicmFyeQorKGtub3duIGFzIGxpYnBuZykgZm9yIHlvdXIgb3duIHVzZS4gIFRoZXJlIGFyZSBmaXZlIHNlY3Rpb25zIHRvIHRoaXMKK2ZpbGU6IGludHJvZHVjdGlvbiwgc3RydWN0dXJlcywgcmVhZGluZywgd3JpdGluZywgYW5kIG1vZGlmaWNhdGlvbiBhbmQKK2NvbmZpZ3VyYXRpb24gbm90ZXMgZm9yIHZhcmlvdXMgc3BlY2lhbCBwbGF0Zm9ybXMuICBJbiBhZGRpdGlvbiB0byB0aGlzCitmaWxlLCBleGFtcGxlLmMgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZyB0aGUgbGlicmFyeSwgYXMKK2l0IGlzIGhlYXZpbHkgY29tbWVudGVkIGFuZCBzaG91bGQgaW5jbHVkZSBldmVyeXRoaW5nIG1vc3QgcGVvcGxlCit3aWxsIG5lZWQuICBXZSBhc3N1bWUgdGhhdCBsaWJwbmcgaXMgYWxyZWFkeSBpbnN0YWxsZWQ7IHNlZSB0aGUKK0lOU1RBTEwgZmlsZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBpbnN0YWxsIGxpYnBuZy4KKworTGlicG5nIHdhcyB3cml0dGVuIGFzIGEgY29tcGFuaW9uIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgYXMgYSB3YXkKK29mIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YgdGltZSBhbmQgZWZmb3J0IGl0IHRha2VzIHRvIHN1cHBvcnQgdGhlIFBORworZmlsZSBmb3JtYXQgaW4gYXBwbGljYXRpb24gcHJvZ3JhbXMuCisKK1RoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pLCBOb3ZlbWJlciAyMDAzLCBpcyBhdmFpbGFibGUgYXMKK2EgVzNDIFJlY29tbWVuZGF0aW9uIGFuZCBhcyBhbiBJU08gU3RhbmRhcmQgKElTTy9JRUMgMTU5NDg6MjAwMyAoRSkpIGF0Cis8aHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9SRUMtUE5HLTIwMDMxMTEwLworVGhlIFczQyBhbmQgSVNPIGRvY3VtZW50cyBoYXZlIGlkZW50aWNhbCB0ZWNobmljYWwgY29udGVudC4KKworVGhlIFBORy0xLjIgc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUgYXQKKzxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9kb2N1bWVudHMvPgorCitUaGUgUE5HLTEuMCBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZQorYXMgUkZDIDIwODMgPGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2RvY3VtZW50cy8+IGFuZCBhcyBhCitXM0MgUmVjb21tZW5kYXRpb24gPGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy5wbmcuaHRtbD4uIFNvbWUKK2FkZGl0aW9uYWwgY2h1bmtzIGFyZSBkZXNjcmliZWQgaW4gdGhlIHNwZWNpYWwtcHVycG9zZSBwdWJsaWMgY2h1bmtzCitkb2N1bWVudHMgYXQgPGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2RvY3VtZW50cy8+LgorCitPdGhlciBpbmZvcm1hdGlvbgorYWJvdXQgUE5HLCBhbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGxpYnBuZywgY2FuIGJlIGZvdW5kIGF0IHRoZSBQTkcgaG9tZQorcGFnZSwgPGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nLz4uCisKK01vc3QgdXNlcnMgd2lsbCBub3QgaGF2ZSB0byBtb2RpZnkgdGhlIGxpYnJhcnkgc2lnbmlmaWNhbnRseTsgYWR2YW5jZWQKK3VzZXJzIG1heSB3YW50IHRvIG1vZGlmeSBpdCBtb3JlLiAgQWxsIGF0dGVtcHRzIHdlcmUgbWFkZSB0byBtYWtlIGl0IGFzCitjb21wbGV0ZSBhcyBwb3NzaWJsZSwgd2hpbGUga2VlcGluZyB0aGUgY29kZSBlYXN5IHRvIHVuZGVyc3RhbmQuCitDdXJyZW50bHksIHRoaXMgbGlicmFyeSBvbmx5IHN1cHBvcnRzIEMuICBTdXBwb3J0IGZvciBvdGhlciBsYW5ndWFnZXMKK2lzIGJlaW5nIGNvbnNpZGVyZWQuCisKK0xpYnBuZyBoYXMgYmVlbiBkZXNpZ25lZCB0byBoYW5kbGUgbXVsdGlwbGUgc2Vzc2lvbnMgYXQgb25lIHRpbWUsCit0byBiZSBlYXNpbHkgbW9kaWZpYWJsZSwgdG8gYmUgcG9ydGFibGUgdG8gdGhlIHZhc3QgbWFqb3JpdHkgb2YKK21hY2hpbmVzIChBTlNJLCBLJlIsIDE2LSwgMzItLCBhbmQgNjQtYml0KSBhdmFpbGFibGUsIGFuZCB0byBiZSBlYXN5Cit0byB1c2UuICBUaGUgdWx0aW1hdGUgZ29hbCBvZiBsaWJwbmcgaXMgdG8gcHJvbW90ZSB0aGUgYWNjZXB0YW5jZSBvZgordGhlIFBORyBmaWxlIGZvcm1hdCBpbiB3aGF0ZXZlciB3YXkgcG9zc2libGUuICBXaGlsZSB0aGVyZSBpcyBzdGlsbAord29yayB0byBiZSBkb25lIChzZWUgdGhlIFRPRE8gZmlsZSksIGxpYnBuZyBzaG91bGQgY292ZXIgdGhlCittYWpvcml0eSBvZiB0aGUgbmVlZHMgb2YgaXRzIHVzZXJzLgorCitMaWJwbmcgdXNlcyB6bGliIGZvciBpdHMgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb2YgUE5HIGZpbGVzLgorRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB6bGliLCBhbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHpsaWIsIGNhbgorYmUgZm91bmQgYXQgdGhlIHpsaWIgaG9tZSBwYWdlLCA8aHR0cDovL3d3dy5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvemxpYi8+LgorVGhlIHpsaWIgY29tcHJlc3Npb24gdXRpbGl0eSBpcyBhIGdlbmVyYWwgcHVycG9zZSB1dGlsaXR5IHRoYXQgaXMKK3VzZWZ1bCBmb3IgbW9yZSB0aGFuIFBORyBmaWxlcywgYW5kIGNhbiBiZSB1c2VkIHdpdGhvdXQgbGlicG5nLgorU2VlIHRoZSBkb2N1bWVudGF0aW9uIGRlbGl2ZXJlZCB3aXRoIHpsaWIgZm9yIG1vcmUgZGV0YWlscy4KK1lvdSBjYW4gdXN1YWxseSBmaW5kIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSB6bGliIHV0aWxpdHkgd2hlcmV2ZXIgeW91CitmaW5kIHRoZSBsaWJwbmcgc291cmNlIGZpbGVzLgorCitMaWJwbmcgaXMgdGhyZWFkIHNhZmUsIHByb3ZpZGVkIHRoZSB0aHJlYWRzIGFyZSB1c2luZyBkaWZmZXJlbnQKK2luc3RhbmNlcyBvZiB0aGUgc3RydWN0dXJlcy4gIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24KK3BuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvIGluc3RhbmNlcywgYW5kIHRodXMgaXRzIG93biBpbWFnZS4KK0xpYnBuZyBkb2VzIG5vdCBwcm90ZWN0IGl0c2VsZiBhZ2FpbnN0IHR3byB0aHJlYWRzIHVzaW5nIHRoZQorc2FtZSBpbnN0YW5jZSBvZiBhIHN0cnVjdHVyZS4gIE5vdGU6IHRocmVhZCBzYWZldHkgbWF5IGJlIGRlZmVhdGVkCitieSB1c2Ugb2Ygc29tZSBvZiB0aGUgTU1YIGFzc2VtYmxlciBjb2RlIGluIHBuZ2djY3JkLmMsIHdoaWNoIGlzIG9ubHkKK2NvbXBpbGVkIHdoZW4gdGhlIHVzZXIgZGVmaW5lcyBQTkdfVEhSRUFEX1VOU0FGRV9PSy4KKworSUkuIFN0cnVjdHVyZXMKKworVGhlcmUgYXJlIHR3byBtYWluIHN0cnVjdHVyZXMgdGhhdCBhcmUgaW1wb3J0YW50IHRvIGxpYnBuZywgcG5nX3N0cnVjdAorYW5kIHBuZ19pbmZvLiAgVGhlIGZpcnN0LCBwbmdfc3RydWN0LCBpcyBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgdGhhdAord2lsbCBub3QsIGZvciB0aGUgbW9zdCBwYXJ0LCBiZSB1c2VkIGJ5IGEgdXNlciBleGNlcHQgYXMgdGhlIGZpcnN0Cit2YXJpYWJsZSBwYXNzZWQgdG8gZXZlcnkgbGlicG5nIGZ1bmN0aW9uIGNhbGwuCisKK1RoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK1BORyBmaWxlLiAgQXQgb25lIHRpbWUsIHRoZSBmaWVsZHMgb2YgcG5nX2luZm8gd2VyZSBpbnRlbmRlZCB0byBiZQorZGlyZWN0bHkgYWNjZXNzaWJsZSB0byB0aGUgdXNlci4gIEhvd2V2ZXIsIHRoaXMgdGVuZGVkIHRvIGNhdXNlIHByb2JsZW1zCit3aXRoIGFwcGxpY2F0aW9ucyB1c2luZyBkeW5hbWljYWxseSBsb2FkZWQgbGlicmFyaWVzLCBhbmQgYXMgYSByZXN1bHQKK2Egc2V0IG9mIGludGVyZmFjZSBmdW5jdGlvbnMgZm9yIHBuZ19pbmZvICh0aGUgcG5nX2dldF8qKCkgYW5kIHBuZ19zZXRfKigpCitmdW5jdGlvbnMpIHdhcyBkZXZlbG9wZWQuICBUaGUgZmllbGRzIG9mIHBuZ19pbmZvIGFyZSBzdGlsbCBhdmFpbGFibGUgZm9yCitvbGRlciBhcHBsaWNhdGlvbnMsIGJ1dCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCBhcHBsaWNhdGlvbnMgdXNlIHRoZSBuZXcKK2ludGVyZmFjZXMgaWYgYXQgYWxsIHBvc3NpYmxlLgorCitBcHBsaWNhdGlvbnMgdGhhdCBkbyBtYWtlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG1lbWJlcnMgb2YgcG5nX3N0cnVjdCAoZXhjZXB0Citmb3IgcG5nX3B0ci0+am1wYnVmKSBtdXN0IGJlIHJlY29tcGlsZWQgd2hlbmV2ZXIgdGhlIGxpYnJhcnkgaXMgdXBkYXRlZCwKK2FuZCBhcHBsaWNhdGlvbnMgdGhhdCBtYWtlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG1lbWJlcnMgb2YgcG5nX2luZm8gbXVzdAorYmUgcmVjb21waWxlZCBpZiB0aGV5IHdlcmUgY29tcGlsZWQgb3IgbG9hZGVkIHdpdGggbGlicG5nIHZlcnNpb24gMS4wLjYsCitpbiB3aGljaCB0aGUgbWVtYmVycyB3ZXJlIGluIGEgZGlmZmVyZW50IG9yZGVyLiAgSW4gdmVyc2lvbiAxLjAuNywgdGhlCittZW1iZXJzIG9mIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgcmV2ZXJ0ZWQgdG8gdGhlIG9sZCBvcmRlciwgYXMgdGhleSB3ZXJlCitpbiB2ZXJzaW9ucyAwLjk3YyB0aHJvdWdoIDEuMC41LiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMC4wLCBib3RoCitzdHJ1Y3R1cmVzIGFyZSBnb2luZyB0byBiZSBoaWRkZW4sIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZXMgd2lsbAorb25seSBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIHBuZ19nZXQvcG5nX3NldCBmdW5jdGlvbnMuCisKK1RoZSBwbmcuaCBoZWFkZXIgZmlsZSBpcyBhbiBpbnZhbHVhYmxlIHJlZmVyZW5jZSBmb3IgcHJvZ3JhbW1pbmcgd2l0aCBsaWJwbmcuCitBbmQgd2hpbGUgSSdtIG9uIHRoZSB0b3BpYywgbWFrZSBzdXJlIHlvdSBpbmNsdWRlIHRoZSBsaWJwbmcgaGVhZGVyIGZpbGU6CisKKyNpbmNsdWRlIDxwbmcuaD4KKworSUlJLiBSZWFkaW5nCisKK1dlJ2xsIG5vdyB3YWxrIHlvdSB0aHJvdWdoIHRoZSBwb3NzaWJsZSBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIHJlYWRpbmcKK2luIGEgUE5HIGZpbGUgc2VxdWVudGlhbGx5LCBicmllZmx5IGV4cGxhaW5pbmcgdGhlIHN5bnRheCBhbmQgcHVycG9zZQorb2YgZWFjaCBvbmUuICBTZWUgZXhhbXBsZS5jIGFuZCBwbmcuaCBmb3IgbW9yZSBkZXRhaWwuICBXaGlsZQorcHJvZ3Jlc3NpdmUgcmVhZGluZyBpcyBjb3ZlcmVkIGluIHRoZSBuZXh0IHNlY3Rpb24sIHlvdSB3aWxsIHN0aWxsCituZWVkIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBkaXNjdXNzZWQgaW4gdGhpcyBzZWN0aW9uIHRvIHJlYWQgYSBQTkcKK2ZpbGUuCisKK1NldHVwCisKK1lvdSB3aWxsIHdhbnQgdG8gZG8gdGhlIEkvTyBpbml0aWFsaXphdGlvbigqKSBiZWZvcmUgeW91IGdldCBpbnRvIGxpYnBuZywKK3NvIGlmIGl0IGRvZXNuJ3Qgd29yaywgeW91IGRvbid0IGhhdmUgbXVjaCB0byB1bmRvLiAgT2YgY291cnNlLCB5b3UKK3dpbGwgYWxzbyB3YW50IHRvIGluc3VyZSB0aGF0IHlvdSBhcmUsIGluIGZhY3QsIGRlYWxpbmcgd2l0aCBhIFBORworZmlsZS4gIExpYnBuZyBwcm92aWRlcyBhIHNpbXBsZSBjaGVjayB0byBzZWUgaWYgYSBmaWxlIGlzIGEgUE5HIGZpbGUuCitUbyB1c2UgaXQsIHBhc3MgaW4gdGhlIGZpcnN0IDEgdG8gOCBieXRlcyBvZiB0aGUgZmlsZSB0byB0aGUgZnVuY3Rpb24KK3BuZ19zaWdfY21wKCksIGFuZCBpdCB3aWxsIHJldHVybiAwIGlmIHRoZSBieXRlcyBtYXRjaCB0aGUgY29ycmVzcG9uZGluZworYnl0ZXMgb2YgdGhlIFBORyBzaWduYXR1cmUsIG9yIG5vbnplcm8gb3RoZXJ3aXNlLiAgT2YgY291cnNlLCB0aGUgbW9yZSBieXRlcworeW91IHBhc3MgaW4sIHRoZSBncmVhdGVyIHRoZSBhY2N1cmFjeSBvZiB0aGUgcHJlZGljdGlvbi4KKworSWYgeW91IGFyZSBpbnRlbmRpbmcgdG8ga2VlcCB0aGUgZmlsZSBwb2ludGVyIG9wZW4gZm9yIHVzZSBpbiBsaWJwbmcsCit5b3UgbXVzdCBlbnN1cmUgeW91IGRvbid0IHJlYWQgbW9yZSB0aGFuIDggYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nCitvZiB0aGUgZmlsZSwgYW5kIHlvdSBhbHNvIGhhdmUgdG8gbWFrZSBhIGNhbGwgdG8gcG5nX3NldF9zaWdfYnl0ZXNfcmVhZCgpCit3aXRoIHRoZSBudW1iZXIgb2YgYnl0ZXMgeW91IHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nLiAgTGlicG5nIHdpbGwKK3RoZW4gb25seSBjaGVjayB0aGUgYnl0ZXMgKGlmIGFueSkgdGhhdCB5b3VyIHByb2dyYW0gZGlkbid0IHJlYWQuCisKKygqKTogSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQKK3RvIHJlcGxhY2UgdGhlbSB3aXRoIGN1c3RvbSBmdW5jdGlvbnMuICBTZWUgdGhlIGRpc2N1c3Npb24gdW5kZXIKK0N1c3RvbWl6aW5nIGxpYnBuZy4KKworCisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlX25hbWUsICJyYiIpOworICAgIGlmICghZnApCisgICAgeworICAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisgICAgZnJlYWQoaGVhZGVyLCAxLCBudW1iZXIsIGZwKTsKKyAgICBpc19wbmcgPSAhcG5nX3NpZ19jbXAoaGVhZGVyLCAwLCBudW1iZXIpOworICAgIGlmICghaXNfcG5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChOT1RfUE5HKTsKKyAgICB9CisKKworTmV4dCwgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLiAgSW4KK29yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBzaXplIG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgY29ycmVjdCBldmVuIHdpdGggYQorZHluYW1pY2FsbHkgbGlua2VkIGxpYnBuZywgdGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIGFuZAorYWxsb2NhdGUgdGhlIHN0cnVjdHVyZXMuICBXZSBhbHNvIHBhc3MgdGhlIGxpYnJhcnkgdmVyc2lvbiwgb3B0aW9uYWwKK3BvaW50ZXJzIHRvIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucywgYW5kIGEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0IGZvcgordXNlIGJ5IHRoZSBlcnJvciBmdW5jdGlvbnMsIGlmIG5lY2Vzc2FyeSAodGhlIHBvaW50ZXIgYW5kIGZ1bmN0aW9ucyBjYW4KK2JlIE5VTEwgaWYgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlcnMgYXJlIHRvIGJlIHVzZWQpLiAgU2VlIHRoZSBzZWN0aW9uCitvbiBDaGFuZ2VzIHRvIExpYnBuZyBiZWxvdyByZWdhcmRpbmcgdGhlIG9sZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCitUaGUgc3RydWN0dXJlIGFsbG9jYXRpb24gZnVuY3Rpb25zIHF1aWV0bHkgcmV0dXJuIE5VTEwgaWYgdGhleSBmYWlsIHRvCitjcmVhdGUgdGhlIHN0cnVjdHVyZSwgc28geW91ciBhcHBsaWNhdGlvbiBzaG91bGQgY2hlY2sgZm9yIHRoYXQuCisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAorICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCisgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7CisgICAgaWYgKCFwbmdfcHRyKQorICAgICAgICByZXR1cm4gKEVSUk9SKTsKKworICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICAgaWYgKCFpbmZvX3B0cikKKyAgICB7CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLAorICAgICAgICAgICAocG5nX2luZm9wcClOVUxMLCAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCisgICAgcG5nX2luZm9wIGVuZF9pbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKyAgICBpZiAoIWVuZF9pbmZvKQorICAgIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCitJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBvd24gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMsCitkZWZpbmUgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCBhbmQgdXNlCitwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKSBpbnN0ZWFkIG9mIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKToKKworICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIKKyAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAorICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4sIChwbmdfdm9pZHApCisgICAgICAgIHVzZXJfbWVtX3B0ciwgdXNlcl9tYWxsb2NfZm4sIHVzZXJfZnJlZV9mbik7CisKK1RoZSBlcnJvciBoYW5kbGluZyByb3V0aW5lcyBwYXNzZWQgdG8gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpCithbmQgdGhlIG1lbW9yeSBhbGxvYy9mcmVlIHJvdXRpbmVzIHBhc3NlZCB0byBwbmdfY3JlYXRlX3N0cnVjdF8yKCkKK2FyZSBvbmx5IG5lY2Vzc2FyeSBpZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgbGlicG5nIHN1cHBsaWVkIGVycm9yCitoYW5kbGluZyBhbmQgbWVtb3J5IGFsbG9jL2ZyZWUgZnVuY3Rpb25zLgorCitXaGVuIGxpYnBuZyBlbmNvdW50ZXJzIGFuIGVycm9yLCBpdCBleHBlY3RzIHRvIGxvbmdqbXAgYmFjawordG8geW91ciByb3V0aW5lLiAgVGhlcmVmb3JlLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgc2V0am1wIGFuZCBwYXNzCit5b3VyIHBuZ19qbXBidWYocG5nX3B0cikuICBJZiB5b3UgcmVhZCB0aGUgZmlsZSBmcm9tIGRpZmZlcmVudAorcm91dGluZXMsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZSBqbXBidWYgZmllbGQgZXZlcnkgdGltZSB5b3UgZW50ZXIKK2EgbmV3IHJvdXRpbmUgdGhhdCB3aWxsIGNhbGwgYSBwbmdfKigpIGZ1bmN0aW9uLgorCitTZWUgeW91ciBkb2N1bWVudGF0aW9uIG9mIHNldGptcC9sb25nam1wIGZvciB5b3VyIGNvbXBpbGVyIGZvciBtb3JlCitpbmZvcm1hdGlvbiBvbiBzZXRqbXAvbG9uZ2ptcC4gIFNlZSB0aGUgZGlzY3Vzc2lvbiBvbiBsaWJwbmcgZXJyb3IKK2hhbmRsaW5nIGluIHRoZSBDdXN0b21pemluZyBMaWJwbmcgc2VjdGlvbiBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorb24gdGhlIGxpYnBuZyBlcnJvciBoYW5kbGluZy4gIElmIGFuIGVycm9yIG9jY3VycywgYW5kIGxpYnBuZyBsb25nam1wJ3MKK2JhY2sgdG8geW91ciBzZXRqbXAsIHlvdSB3aWxsIHdhbnQgdG8gY2FsbCBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpIHRvCitmcmVlIGFueSBtZW1vcnkuCisKKyAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQorICAgIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAgICAgJmVuZF9pbmZvKTsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCitJZiB5b3Ugd291bGQgcmF0aGVyIGF2b2lkIHRoZSBjb21wbGV4aXR5IG9mIHNldGptcC9sb25nam1wIGlzc3VlcywKK3lvdSBjYW4gY29tcGlsZSBsaWJwbmcgd2l0aCBQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQsIGluIHdoaWNoIGNhc2UKK2Vycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KKworTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgaW5wdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KK3VzZSB0aGUgQyBmdW5jdGlvbiBmcmVhZCgpLiAgSWYgeW91IHVzZSB0aGlzLCB5b3Ugd2lsbCBuZWVkIHRvIHBhc3MgYQordmFsaWQgRklMRSAqIGluIHRoZSBmdW5jdGlvbiBwbmdfaW5pdF9pbygpLiAgQmUgc3VyZSB0aGF0IHRoZSBmaWxlIGlzCitvcGVuZWQgaW4gYmluYXJ5IG1vZGUuICBJZiB5b3Ugd2lzaCB0byBoYW5kbGUgcmVhZGluZyBkYXRhIGluIGFub3RoZXIKK3dheSwgeW91IG5lZWQgbm90IGNhbGwgdGhlIHBuZ19pbml0X2lvKCkgZnVuY3Rpb24sIGJ1dCB5b3UgbXVzdCB0aGVuCitpbXBsZW1lbnQgdGhlIGxpYnBuZyBJL08gbWV0aG9kcyBkaXNjdXNzZWQgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZworc2VjdGlvbiBiZWxvdy4KKworICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKKworSWYgeW91IGhhZCBwcmV2aW91c2x5IG9wZW5lZCB0aGUgZmlsZSBhbmQgcmVhZCBhbnkgb2YgdGhlIHNpZ25hdHVyZSBmcm9tCit0aGUgYmVnaW5uaW5nIGluIG9yZGVyIHRvIHNlZSBpZiB0aGlzIHdhcyBhIFBORyBmaWxlLCB5b3UgbmVlZCB0byBsZXQKK2xpYnBuZyBrbm93IHRoYXQgdGhlcmUgYXJlIHNvbWUgYnl0ZXMgbWlzc2luZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KKworICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIG51bWJlcik7CisKK1NldHRpbmcgdXAgY2FsbGJhY2sgY29kZQorCitZb3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBhbnkgdW5rbm93biBjaHVua3MgaW4gdGhlCitpbnB1dCBzdHJlYW0uIFlvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KKworICAgIHJlYWRfY2h1bmtfY2FsbGJhY2socG5nX3B0ciBwdHIsCisgICAgICAgICBwbmdfdW5rbm93bl9jaHVua3AgY2h1bmspOworICAgIHsKKyAgICAgICAvKiBUaGUgdW5rbm93biBjaHVuayBzdHJ1Y3R1cmUgY29udGFpbnMgeW91cgorICAgICAgICAgIGNodW5rIGRhdGE6ICovCisgICAgICAgICAgIHBuZ19ieXRlIG5hbWVbNV07CisgICAgICAgICAgIHBuZ19ieXRlICpkYXRhOworICAgICAgICAgICBwbmdfc2l6ZV90IHNpemU7CisgICAgICAgLyogTm90ZSB0aGF0IGxpYnBuZyBoYXMgYWxyZWFkeSB0YWtlbiBjYXJlIG9mCisgICAgICAgICAgdGhlIENSQyBoYW5kbGluZyAqLworCisgICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlLiAgUmV0dXJuIG9uZSBvZiB0aGUKKyAgICAgICAgICBmb2xsb3dpbmc6ICovCisKKyAgICAgICByZXR1cm4gKC1uKTsgLyogY2h1bmsgaGFkIGFuIGVycm9yICovCisgICAgICAgcmV0dXJuICgwKTsgLyogZGlkIG5vdCByZWNvZ25pemUgKi8KKyAgICAgICByZXR1cm4gKG4pOyAvKiBzdWNjZXNzICovCisgICAgfQorCisoWW91IGNhbiBnaXZlIHlvdXIgZnVuY3Rpb24gYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZgorInJlYWRfY2h1bmtfY2FsbGJhY2siKQorCitUbyBpbmZvcm0gbGlicG5nIGFib3V0IHlvdXIgZnVuY3Rpb24sIHVzZQorCisgICAgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4ocG5nX3B0ciwgdXNlcl9jaHVua19wdHIsCisgICAgICAgIHJlYWRfY2h1bmtfY2FsbGJhY2spOworCitUaGlzIG5hbWVzIG5vdCBvbmx5IHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgYnV0IGFsc28gYSB1c2VyIHBvaW50ZXIgdGhhdAoreW91IGNhbiByZXRyaWV2ZSB3aXRoCisKKyAgICBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKHBuZ19wdHIpOworCitBdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQorY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHJlYWQsIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKK2EgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCitZb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgorCisgICAgdm9pZCByZWFkX3Jvd19jYWxsYmFjayhwbmdfcHRyIHB0ciwgcG5nX3VpbnRfMzIgcm93LAorICAgICAgIGludCBwYXNzKTsKKyAgICB7CisgICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUgKi8KKyAgICB9CisKKyhZb3UgY2FuIGdpdmUgaXQgYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZiAicmVhZF9yb3dfY2FsbGJhY2siKQorCitUbyBpbmZvcm0gbGlicG5nIGFib3V0IHlvdXIgZnVuY3Rpb24sIHVzZQorCisgICAgcG5nX3NldF9yZWFkX3N0YXR1c19mbihwbmdfcHRyLCByZWFkX3Jvd19jYWxsYmFjayk7CisKK1dpZHRoIGFuZCBoZWlnaHQgbGltaXRzCisKK1RoZSBQTkcgc3BlY2lmaWNhdGlvbiBhbGxvd3MgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYW4gaW1hZ2UgdG8gYmUgYXMKK2xhcmdlIGFzIDJeMzEtMSAoMHg3ZmZmZmZmZiksIG9yIGFib3V0IDIuMTQ3IGJpbGxpb24gcm93cyBhbmQgY29sdW1ucy4KK1NpbmNlIHZlcnkgZmV3IGFwcGxpY2F0aW9ucyByZWFsbHkgbmVlZCB0byBwcm9jZXNzIHN1Y2ggbGFyZ2UgaW1hZ2VzLAord2UgaGF2ZSBpbXBvc2VkIGFuIGFyYml0cmFyeSAxLW1pbGxpb24gbGltaXQgb24gcm93cyBhbmQgY29sdW1ucy4KK0xhcmdlciBpbWFnZXMgd2lsbCBiZSByZWplY3RlZCBpbW1lZGlhdGVseSB3aXRoIGEgcG5nX2Vycm9yKCkgY2FsbC4gSWYKK3lvdSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbGltaXQsIHlvdSBjYW4gdXNlCisKKyAgIHBuZ19zZXRfdXNlcl9saW1pdHMocG5nX3B0ciwgd2lkdGhfbWF4LCBoZWlnaHRfbWF4KTsKKwordG8gc2V0IHlvdXIgb3duIGxpbWl0cywgb3IgdXNlIHdpZHRoX21heCA9IGhlaWdodF9tYXggPSAweDdmZmZmZmZmTAordG8gYWxsb3cgYWxsIHZhbGlkIGRpbWVuc2lvbnMgKGxpYnBuZyBtYXkgcmVqZWN0IHNvbWUgdmVyeSBsYXJnZSBpbWFnZXMKK2FueXdheSBiZWNhdXNlIG9mIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgY29uZGl0aW9ucykuCisKK1lvdSBzaG91bGQgcHV0IHRoaXMgc3RhdGVtZW50IGFmdGVyIHlvdSBjcmVhdGUgdGhlIFBORyBzdHJ1Y3R1cmUgYW5kCitiZWZvcmUgY2FsbGluZyBwbmdfcmVhZF9pbmZvKCksIHBuZ19yZWFkX3BuZygpLCBvciBwbmdfcHJvY2Vzc19kYXRhKCkuCitJZiB5b3UgbmVlZCB0byByZXRyaWV2ZSB0aGUgbGltaXRzIHRoYXQgYXJlIGJlaW5nIGFwcGxpZWQsIHVzZQorCisgICB3aWR0aF9tYXggPSBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4KHBuZ19wdHIpOworICAgaGVpZ2h0X21heCA9IHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4KHBuZ19wdHIpOworCitVbmtub3duLWNodW5rIGhhbmRsaW5nCisKK05vdyB5b3UgZ2V0IHRvIHNldCB0aGUgd2F5IHRoZSBsaWJyYXJ5IHByb2Nlc3NlcyB1bmtub3duIGNodW5rcyBpbiB0aGUKK2lucHV0IFBORyBzdHJlYW0uIEJvdGgga25vd24gYW5kIHVua25vd24gY2h1bmtzIHdpbGwgYmUgcmVhZC4gIE5vcm1hbAorYmVoYXZpb3IgaXMgdGhhdCBrbm93biBjaHVua3Mgd2lsbCBiZSBwYXJzZWQgaW50byBpbmZvcm1hdGlvbiBpbgordmFyaW91cyBpbmZvX3B0ciBtZW1iZXJzOyB1bmtub3duIGNodW5rcyB3aWxsIGJlIGRpc2NhcmRlZC4gVG8gY2hhbmdlCit0aGlzLCB5b3UgY2FuIGNhbGw6CisKKyAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nX3B0ciwga2VlcCwKKyAgICAgICAgY2h1bmtfbGlzdCwgbnVtX2NodW5rcyk7CisgICAga2VlcCAgICAgICAtIDA6IGRvIG5vdCBoYW5kbGUgYXMgdW5rbm93bgorICAgICAgICAgICAgICAgICAxOiBkbyBub3Qga2VlcAorICAgICAgICAgICAgICAgICAyOiBrZWVwIG9ubHkgaWYgc2FmZS10by1jb3B5CisgICAgICAgICAgICAgICAgIDM6IGtlZXAgZXZlbiBpZiB1bnNhZmUtdG8tY29weQorICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgdGhlc2UgZGVmaW5pdGlvbnM6CisgICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCAgIDAKKyAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19ORVZFUiAgICAgICAgMQorICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUgICAgICAyCisgICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTICAgICAgIDMKKyAgICBjaHVua19saXN0IC0gbGlzdCBvZiBjaHVua3MgYWZmZWN0ZWQgKGEgYnl0ZSBzdHJpbmcsCisgICAgICAgICAgICAgICAgIGZpdmUgYnl0ZXMgcGVyIGNodW5rLCBOVUxMIG9yICdcMCcgaWYKKyAgICAgICAgICAgICAgICAgbnVtX2NodW5rcyBpcyAwKQorICAgIG51bV9jaHVua3MgLSBudW1iZXIgb2YgY2h1bmtzIGFmZmVjdGVkOyBpZiAwLCBhbGwKKyAgICAgICAgICAgICAgICAgdW5rbm93biBjaHVua3MgYXJlIGFmZmVjdGVkLiAgSWYgbm9uemVybywKKyAgICAgICAgICAgICAgICAgb25seSB0aGUgY2h1bmtzIGluIHRoZSBsaXN0IGFyZSBhZmZlY3RlZAorCitVbmtub3duIGNodW5rcyBkZWNsYXJlZCBpbiB0aGlzIHdheSB3aWxsIGJlIHNhdmVkIGFzIHJhdyBkYXRhIG9udG8gYQorbGlzdCBvZiBwbmdfdW5rbm93bl9jaHVuayBzdHJ1Y3R1cmVzLiAgSWYgYSBjaHVuayB0aGF0IGlzIG5vcm1hbGx5Citrbm93biB0byBsaWJwbmcgaXMgbmFtZWQgaW4gdGhlIGxpc3QsIGl0IHdpbGwgYmUgaGFuZGxlZCBhcyB1bmtub3duLAorYWNjb3JkaW5nIHRvIHRoZSAia2VlcCIgZGlyZWN0aXZlLiAgSWYgYSBjaHVuayBpcyBuYW1lZCBpbiBzdWNjZXNzaXZlCitpbnN0YW5jZXMgb2YgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCksIHRoZSBmaW5hbCBpbnN0YW5jZSB3aWxsCit0YWtlIHByZWNlZGVuY2UuICBUaGUgSUhEUiBhbmQgSUVORCBjaHVua3Mgc2hvdWxkIG5vdCBiZSBuYW1lZCBpbgorY2h1bmtfbGlzdDsgaWYgdGhleSBhcmUsIGxpYnBuZyB3aWxsIHByb2Nlc3MgdGhlbSBub3JtYWxseSBhbnl3YXkuCisKK1RoZSBoaWdoLWxldmVsIHJlYWQgaW50ZXJmYWNlCisKK0F0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKK3JlYWQgaW50ZXJmYWNlLCBvciB0aHJvdWdoIGEgc2VxdWVuY2Ugb2YgbG93LWxldmVsIHJlYWQgb3BlcmF0aW9ucy4KK1lvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiAoYSkgeW91IGFyZSB3aWxsaW5nIHRvIHJlYWQKK3RoZSBlbnRpcmUgaW1hZ2UgaW50byBtZW1vcnksIGFuZCAoYikgdGhlIGlucHV0IHRyYW5zZm9ybWF0aW9ucworeW91IHdhbnQgdG8gZG8gYXJlIGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBzZXQ6CisKKyAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KKyAgICBQTkdfVFJBTlNGT1JNX1NUUklQXzE2ICAgICAgU3RyaXAgMTYtYml0IHNhbXBsZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCBiaXRzCisgICAgUE5HX1RSQU5TRk9STV9TVFJJUF9BTFBIQSAgIERpc2NhcmQgdGhlIGFscGhhIGNoYW5uZWwKKyAgICBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcgICAgICAgRXhwYW5kIDEsIDIgYW5kIDQtYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgdG8gYnl0ZXMKKyAgICBQTkdfVFJBTlNGT1JNX1BBQ0tTV0FQICAgICAgQ2hhbmdlIG9yZGVyIG9mIHBhY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMgdG8gTFNCIGZpcnN0CisgICAgUE5HX1RSQU5TRk9STV9FWFBBTkQgICAgICAgIFBlcmZvcm0gc2V0X2V4cGFuZCgpCisgICAgUE5HX1RSQU5TRk9STV9JTlZFUlRfTU9OTyAgIEludmVydCBtb25vY2hyb21lIGltYWdlcworICAgIFBOR19UUkFOU0ZPUk1fU0hJRlQgICAgICAgICBOb3JtYWxpemUgcGl4ZWxzIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQklUIGRlcHRoCisgICAgUE5HX1RSQU5TRk9STV9CR1IgICAgICAgICAgIEZsaXAgUkdCIHRvIEJHUiwgUkdCQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBCR1JBCisgICAgUE5HX1RSQU5TRk9STV9TV0FQX0FMUEhBICAgIEZsaXAgUkdCQSB0byBBUkdCIG9yIEdBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFHCisgICAgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEgIENoYW5nZSBhbHBoYSBmcm9tIG9wYWNpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdHJhbnNwYXJlbmN5CisgICAgUE5HX1RSQU5TRk9STV9TV0FQX0VORElBTiAgIEJ5dGUtc3dhcCAxNi1iaXQgc2FtcGxlcworCisoVGhpcyBleGNsdWRlcyBzZXR0aW5nIGEgYmFja2dyb3VuZCBjb2xvciwgZG9pbmcgZ2FtbWEgdHJhbnNmb3JtYXRpb24sCitkaXRoZXJpbmcsIGFuZCBzZXR0aW5nIGZpbGxlci4pICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBzaW1wbHkgZG8gdGhpczoKKworICAgIHBuZ19yZWFkX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpCisKK3doZXJlIHBuZ190cmFuc2Zvcm1zIGlzIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgbG9naWNhbCBPUiBvZgorc29tZSBzZXQgb2YgdHJhbnNmb3JtYXRpb24gZmxhZ3MuICBUaGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0byBwbmdfcmVhZF9pbmZvKCksCitmb2xsb3dlZCB0aGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHRyYW5zZm9ybSBtYXNrLAordGhlbiBwbmdfcmVhZF9pbWFnZSgpLCBhbmQgZmluYWxseSBwbmdfcmVhZF9lbmQoKS4KKworKFRoZSBmaW5hbCBwYXJhbWV0ZXIgb2YgdGhpcyBjYWxsIGlzIG5vdCB5ZXQgdXNlZC4gIFNvbWVkYXkgaXQgbWlnaHQgcG9pbnQKK3RvIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgc29tZSBmdXR1cmUgaW5wdXQgdHJhbnNmb3JtLikKKworWW91IG11c3QgdXNlIHBuZ190cmFuc2Zvcm1zIGFuZCBub3QgY2FsbCBhbnkgcG5nX3NldF90cmFuc2Zvcm0oKSBmdW5jdGlvbnMKK3doZW4geW91IHVzZSBwbmdfcmVhZF9wbmcoKS4KKworQWZ0ZXIgeW91IGhhdmUgY2FsbGVkIHBuZ19yZWFkX3BuZygpLCB5b3UgY2FuIHJldHJpZXZlIHRoZSBpbWFnZSBkYXRhCit3aXRoCisKKyAgIHJvd19wb2ludGVycyA9IHBuZ19nZXRfcm93cyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK3doZXJlIHJvd19wb2ludGVycyBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgcGl4ZWwgZGF0YSBmb3IgZWFjaCByb3c6CisKKyAgIHBuZ19ieXRlcCByb3dfcG9pbnRlcnNbaGVpZ2h0XTsKKworSWYgeW91IGtub3cgeW91ciBpbWFnZSBzaXplIGFuZCBwaXhlbCBzaXplIGFoZWFkIG9mIHRpbWUsIHlvdSBjYW4gYWxsb2NhdGUKK3Jvd19wb2ludGVycyBwcmlvciB0byBjYWxsaW5nIHBuZ19yZWFkX3BuZygpIHdpdGgKKworICAgaWYgKGhlaWdodCA+IFBOR19VSU5UXzMyX01BWC9wbmdfc2l6ZW9mKHBuZ19ieXRlKSkKKyAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKKyAgICAgICAgICJJbWFnZSBpcyB0b28gdGFsbCB0byBwcm9jZXNzIGluIG1lbW9yeSIpOworICAgaWYgKHdpZHRoID4gUE5HX1VJTlRfMzJfTUFYL3BpeGVsX3NpemUpCisgICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsCisgICAgICAgICAiSW1hZ2UgaXMgdG9vIHdpZGUgdG8gcHJvY2VzcyBpbiBtZW1vcnkiKTsKKyAgIHJvd19wb2ludGVycyA9IHBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgIGhlaWdodCpwbmdfc2l6ZW9mKHBuZ19ieXRlcCkpOworICAgZm9yIChpbnQgaT0wOyBpPGhlaWdodCwgaSsrKQorICAgICAgcm93X3BvaW50ZXJzW2ldPXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgIHdpZHRoKnBpeGVsX3NpemUpOworICAgcG5nX3NldF9yb3dzKHBuZ19wdHIsIGluZm9fcHRyLCAmcm93X3BvaW50ZXJzKTsKKworQWx0ZXJuYXRpdmVseSB5b3UgY291bGQgYWxsb2NhdGUgeW91ciBpbWFnZSBpbiBvbmUgYmlnIGJsb2NrIGFuZCBkZWZpbmUKK3Jvd19wb2ludGVyc1tpXSB0byBwb2ludCBpbnRvIHRoZSBwcm9wZXIgcGxhY2VzIGluIHlvdXIgYmxvY2suCisKK0lmIHlvdSB1c2UgcG5nX3NldF9yb3dzKCksIHRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZworcm93X3BvaW50ZXJzIChhbmQgcm93X3BvaW50ZXJzW2ldLCBpZiB0aGV5IHdlcmUgc2VwYXJhdGVseSBhbGxvY2F0ZWQpLgorCitJZiB5b3UgZG9uJ3QgYWxsb2NhdGUgcm93X3BvaW50ZXJzIGFoZWFkIG9mIHRpbWUsIHBuZ19yZWFkX3BuZygpIHdpbGwKK2RvIGl0LCBhbmQgaXQnbGwgYmUgZnJlZSdlZCB3aGVuIHlvdSBjYWxsIHBuZ19kZXN0cm95XyooKS4KKworVGhlIGxvdy1sZXZlbCByZWFkIGludGVyZmFjZQorCitJZiB5b3UgYXJlIGdvaW5nIHRoZSBsb3ctbGV2ZWwgcm91dGUsIHlvdSBhcmUgbm93IHJlYWR5IHRvIHJlYWQgYWxsCit0aGUgZmlsZSBpbmZvcm1hdGlvbiB1cCB0byB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICBZb3UgZG8gdGhpcyB3aXRoIGEKK2NhbGwgdG8gcG5nX3JlYWRfaW5mbygpLgorCisgICAgcG5nX3JlYWRfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK1RoaXMgd2lsbCBwcm9jZXNzIGFsbCBjaHVua3MgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGltYWdlIGRhdGEuCisKK1F1ZXJ5aW5nIHRoZSBpbmZvIHN0cnVjdHVyZQorCitGdW5jdGlvbnMgYXJlIHVzZWQgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbmZvX3B0ciBvbmNlIGl0CitoYXMgYmVlbiByZWFkLiAgTm90ZSB0aGF0IHRoZXNlIGZpZWxkcyBtYXkgbm90IGJlIGNvbXBsZXRlbHkgZmlsbGVkCitpbiB1bnRpbCBwbmdfcmVhZF9lbmQoKSBoYXMgcmVhZCB0aGUgY2h1bmsgZGF0YSBmb2xsb3dpbmcgdGhlIGltYWdlLgorCisgICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsCisgICAgICAgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsICZpbnRlcmxhY2VfdHlwZSwKKyAgICAgICAmY29tcHJlc3Npb25fdHlwZSwgJmZpbHRlcl9tZXRob2QpOworCisgICAgd2lkdGggICAgICAgICAgLSBob2xkcyB0aGUgd2lkdGggb2YgdGhlIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgorICAgIGhlaWdodCAgICAgICAgIC0gaG9sZHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCisgICAgYml0X2RlcHRoICAgICAgLSBob2xkcyB0aGUgYml0IGRlcHRoIG9mIG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGltYWdlIGNoYW5uZWxzLiAgKHZhbGlkIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDQsIDgsIDE2IGFuZCBkZXBlbmQgYWxzbyBvbgorICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbG9yX3R5cGUuICBTZWUgYWxzbworICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0cyAoc0JJVCkgYmVsb3cpLgorICAgIGNvbG9yX3R5cGUgICAgIC0gZGVzY3JpYmVzIHdoaWNoIGNvbG9yL2FscGhhIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHByZXNlbnQuCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQorCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKKworICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0JBU0UKKyAgICAgICAgICAgICAgICAgICAgIGZvciBQTkcgMS4wLCBhbmQgY2FuIGFsc28gYmUKKyAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyBpZgorICAgICAgICAgICAgICAgICAgICAgdGhlIFBORyBkYXRhc3RyZWFtIGlzIGVtYmVkZGVkIGluCisgICAgICAgICAgICAgICAgICAgICBhIE1ORy0xLjAgZGF0YXN0cmVhbSkKKyAgICBjb21wcmVzc2lvbl90eXBlIC0gKG11c3QgYmUgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRQorICAgICAgICAgICAgICAgICAgICAgZm9yIFBORyAxLjApCisgICAgaW50ZXJsYWNlX3R5cGUgLSAoUE5HX0lOVEVSTEFDRV9OT05FIG9yCisgICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03KQorICAgIEFueSBvciBhbGwgb2YgaW50ZXJsYWNlX3R5cGUsIGNvbXByZXNzaW9uX3R5cGUsIG9mCisgICAgZmlsdGVyX21ldGhvZCBjYW4gYmUgTlVMTCBpZiB5b3UgYXJlCisgICAgbm90IGludGVyZXN0ZWQgaW4gdGhlaXIgdmFsdWVzLgorCisgICAgY2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICBjaGFubmVscyAgICAgICAtIG51bWJlciBvZiBjaGFubmVscyBvZiBpbmZvIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGNvbG9yIHR5cGUgKHZhbGlkIHZhbHVlcyBhcmUgMSAoR1JBWSwKKyAgICAgICAgICAgICAgICAgICAgIFBBTEVUVEUpLCAyIChHUkFZX0FMUEhBKSwgMyAoUkdCKSwKKyAgICAgICAgICAgICAgICAgICAgIDQgKFJHQl9BTFBIQSBvciBSR0IgKyBmaWxsZXIgYnl0ZSkpCisgICAgcm93Ynl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICByb3dieXRlcyAgICAgICAtIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhIHJvdworCisgICAgc2lnbmF0dXJlID0gcG5nX2dldF9zaWduYXR1cmUocG5nX3B0ciwgaW5mb19wdHIpOworICAgIHNpZ25hdHVyZSAgICAgIC0gaG9sZHMgdGhlIHNpZ25hdHVyZSByZWFkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICBmaWxlIChpZiBhbnkpLiAgVGhlIGRhdGEgaXMga2VwdCBpbgorICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgb2Zmc2V0IGl0IHdvdWxkIGJlIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAgd2hvbGUgc2lnbmF0dXJlIHdlcmUgcmVhZCAoaS5lLiBpZiBhbgorICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gaGFkIGFscmVhZHkgcmVhZCBpbiA0CisgICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiBzaWduYXR1cmUgYmVmb3JlIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgICAgICBsaWJwbmcsIHRoZSByZW1haW5pbmcgNCBieXRlcyB3b3VsZAorICAgICAgICAgICAgICAgICAgICAgYmUgaW4gc2lnbmF0dXJlWzRdIHRocm91Z2ggc2lnbmF0dXJlWzddCisgICAgICAgICAgICAgICAgICAgICAoc2VlIHBuZ19zZXRfc2lnX2J5dGVzKCkpKS4KKworCisgICAgd2lkdGggICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2Vfd2lkdGgocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7CisgICAgaGVpZ2h0ICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworICAgIGJpdF9kZXB0aCAgICAgICAgPSBwbmdfZ2V0X2JpdF9kZXB0aChwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKKyAgICBjb2xvcl90eXBlICAgICAgID0gcG5nX2dldF9jb2xvcl90eXBlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworICAgIGZpbHRlcl9tZXRob2QgICAgPSBwbmdfZ2V0X2ZpbHRlcl90eXBlKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOworICAgIGNvbXByZXNzaW9uX3R5cGUgPSBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7CisgICAgaW50ZXJsYWNlX3R5cGUgICA9IHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7CisKKworVGhlc2UgYXJlIGFsc28gaW1wb3J0YW50LCBidXQgdGhlaXIgdmFsaWRpdHkgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBjaHVuaworaGFzIGJlZW4gcmVhZC4gIFRoZSBwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT188Y2h1bms+KSBhbmQKK3BuZ19nZXRfPGNodW5rPihwbmdfcHRyLCBpbmZvX3B0ciwgLi4uKSBmdW5jdGlvbnMgcmV0dXJuIG5vbi16ZXJvIGlmIHRoZQorZGF0YSBoYXMgYmVlbiByZWFkLCBvciB6ZXJvIGlmIGl0IGlzIG1pc3NpbmcuICBUaGUgcGFyYW1ldGVycyB0byB0aGUKK3BuZ19nZXRfPGNodW5rPiBhcmUgc2V0IGRpcmVjdGx5IGlmIHRoZXkgYXJlIHNpbXBsZSBkYXRhIHR5cGVzLCBvciBhIHBvaW50ZXIKK2ludG8gdGhlIGluZm9fcHRyIGlzIHJldHVybmVkIGZvciBhbnkgY29tcGxleCB0eXBlcy4KKworICAgIHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAmbnVtX3BhbGV0dGUpOworICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQorICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKKworICAgIHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmdhbW1hKTsKKyAgICBnYW1tYSAgICAgICAgICAtIHRoZSBnYW1tYSB0aGUgZmlsZSBpcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICBhdCAoUE5HX0lORk9fZ0FNQSkKKworICAgIHBuZ19nZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgJnNyZ2JfaW50ZW50KTsKKyAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50IChQTkdfSU5GT19zUkdCKQorICAgICAgICAgICAgICAgICAgICAgVGhlIHByZXNlbmNlIG9mIHRoZSBzUkdCIGNodW5rCisgICAgICAgICAgICAgICAgICAgICBtZWFucyB0aGF0IHRoZSBwaXhlbCBkYXRhIGlzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgc1JHQiBjb2xvciBzcGFjZS4gIFRoaXMgY2h1bmsgYWxzbworICAgICAgICAgICAgICAgICAgICAgaW1wbGllcyBzcGVjaWZpYyB2YWx1ZXMgb2YgZ0FNQSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIGNIUk0uCisKKyAgICBwbmdfZ2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsICZuYW1lLAorICAgICAgICZjb21wcmVzc2lvbl90eXBlLCAmcHJvZmlsZSwgJnByb2ZsZW4pOworICAgIG5hbWUgICAgICAgICAgICAtIFRoZSBwcm9maWxlIG5hbWUuCisgICAgY29tcHJlc3Npb24gICAgIC0gVGhlIGNvbXByZXNzaW9uIHR5cGU7IGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgZm9yIFBORyAxLjAuCisgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBnaXZlIE5VTEwgdG8gdGhpcyBhcmd1bWVudCB0bworICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSBpdC4KKyAgICBwcm9maWxlICAgICAgICAgLSBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIGRhdGEuIE1heSBjb250YWluIE5VTHMuCisgICAgcHJvZmxlbiAgICAgICAgIC0gbGVuZ3RoIG9mIHByb2ZpbGUgZGF0YSBpbiBieXRlcy4KKworICAgIHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOworICAgIHNpZ19iaXQgICAgICAgIC0gdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGZvcgorICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NCSVQpIGVhY2ggb2YgdGhlIGdyYXksCisgICAgICAgICAgICAgICAgICAgICByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgIHdoaWNoZXZlciBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gY29sb3IgdHlwZSAocG5nX2NvbG9yXzE2KQorCisgICAgcG5nX2dldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCAmdHJhbnMsICZudW1fdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAmdHJhbnNfdmFsdWVzKTsKKyAgICB0cmFucyAgICAgICAgICAtIGFycmF5IG9mIHRyYW5zcGFyZW50IGVudHJpZXMgZm9yCisgICAgICAgICAgICAgICAgICAgICBwYWxldHRlIChQTkdfSU5GT190Uk5TKQorICAgIHRyYW5zX3ZhbHVlcyAgIC0gZ3JheWxldmVsIG9yIGNvbG9yIHNhbXBsZSB2YWx1ZXMgb2YKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZWQgaW1hZ2VzIChQTkdfSU5GT190Uk5TKQorICAgIG51bV90cmFucyAgICAgIC0gbnVtYmVyIG9mIHRyYW5zcGFyZW50IGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT190Uk5TKQorCisgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9faElTVCkKKyAgICBoaXN0ICAgICAgICAgICAtIGhpc3RvZ3JhbSBvZiBwYWxldHRlIChhcnJheSBvZgorICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYpCisKKyAgICBwbmdfZ2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2RfdGltZSk7CisgICAgbW9kX3RpbWUgICAgICAgLSB0aW1lIGltYWdlIHdhcyBsYXN0IG1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgIChQTkdfVkFMSURfdElNRSkKKworICAgIHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmJhY2tncm91bmQpOworICAgIGJhY2tncm91bmQgICAgIC0gYmFja2dyb3VuZCBjb2xvciAoUE5HX1ZBTElEX2JLR0QpCisgICAgICAgICAgICAgICAgICAgICB2YWxpZCAxNi1iaXQgcmVkLCBncmVlbiBhbmQgYmx1ZQorICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCByZWdhcmRsZXNzIG9mIGNvbG9yX3R5cGUKKworICAgIG51bV9jb21tZW50cyAgID0gcG5nX2dldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICAgICAgICAgICAgICAgJnRleHRfcHRyLCAmbnVtX3RleHQpOworICAgIG51bV9jb21tZW50cyAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzCisgICAgdGV4dF9wdHIgICAgICAgLSBhcnJheSBvZiBwbmdfdGV4dCBob2xkaW5nIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBjb21tZW50cworICAgIHRleHRfcHRyW2ldLmNvbXByZXNzaW9uIC0gdHlwZSBvZiBjb21wcmVzc2lvbiB1c2VkCisgICAgICAgICAgICAgICAgIG9uICJ0ZXh0IiBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0CisgICAgdGV4dF9wdHJbaV0ua2V5ICAgLSBrZXl3b3JkIGZvciBjb21tZW50LiAgTXVzdCBjb250YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgorICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgZW1wdHkuCisgICAgdGV4dF9wdHJbaV0udGV4dF9sZW5ndGggLSBsZW5ndGggb2YgdGV4dCBzdHJpbmcsCisgICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIGlUWHQKKyAgICB0ZXh0X3B0cltpXS5pdHh0X2xlbmd0aCAtIGxlbmd0aCBvZiBpdHh0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgdEVYdC96VFh0CisgICAgdGV4dF9wdHJbaV0ubGFuZyAgLSBsYW5ndWFnZSBvZiBjb21tZW50IChlbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmb3IgdW5rbm93bikuCisgICAgdGV4dF9wdHJbaV0ubGFuZ19rZXkgIC0ga2V5d29yZCBpbiBVVEYtOAorICAgICAgICAgICAgICAgICAgICAgICAgIChlbXB0eSBzdHJpbmcgZm9yIHVua25vd24pLgorICAgIG51bV90ZXh0ICAgICAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzIChzYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICBudW1fY29tbWVudHM7IHlvdSBjYW4gcHV0IE5VTEwgaGVyZQorICAgICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIGR1cGxpY2F0aW9uKQorICAgIE5vdGUgd2hpbGUgcG5nX3NldF90ZXh0KCkgd2lsbCBhY2NlcHQgdGV4dCwgbGFuZ3VhZ2UsCisgICAgYW5kIHRyYW5zbGF0ZWQga2V5d29yZHMgdGhhdCBjYW4gYmUgTlVMTCBwb2ludGVycywgdGhlCisgICAgc3RydWN0dXJlIHJldHVybmVkIGJ5IHBuZ19nZXRfdGV4dCB3aWxsIGFsd2F5cyBjb250YWluCisgICAgcmVndWxhciB6ZXJvLXRlcm1pbmF0ZWQgQyBzdHJpbmdzLiAgVGhleSBtaWdodCBiZQorICAgIGVtcHR5IHN0cmluZ3MgYnV0IHRoZXkgd2lsbCBuZXZlciBiZSBOVUxMIHBvaW50ZXJzLgorCisgICAgbnVtX3NwYWxldHRlcyA9IHBuZ19nZXRfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICAmcGFsZXR0ZV9wdHIpOworICAgIHBhbGV0dGVfcHRyICAgIC0gYXJyYXkgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIGhvbGRpbmcKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzIG9mIG9uZSBvciBtb3JlIHNQTFQgY2h1bmtzCisgICAgICAgICAgICAgICAgICAgICByZWFkLgorICAgIG51bV9zcGFsZXR0ZXMgIC0gbnVtYmVyIG9mIHNQTFQgY2h1bmtzIHJlYWQuCisKKyAgICBwbmdfZ2V0X29GRnMocG5nX3B0ciwgaW5mb19wdHIsICZvZmZzZXRfeCwgJm9mZnNldF95LAorICAgICAgICZ1bml0X3R5cGUpOworICAgIG9mZnNldF94ICAgICAgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIGxlZnQgZWRnZQorICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNjcmVlbgorICAgIG9mZnNldF95ICAgICAgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIHRvcCBlZGdlCisgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuCisgICAgdW5pdF90eXBlICAgICAgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKKworICAgIHBuZ19nZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnJlc194LCAmcmVzX3ksCisgICAgICAgJnVuaXRfdHlwZSk7CisgICAgcmVzX3ggICAgICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uIGluCisgICAgICAgICAgICAgICAgICAgICB4IGRpcmVjdGlvbgorICAgIHJlc195ICAgICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgeCBkaXJlY3Rpb24KKyAgICB1bml0X3R5cGUgICAgICAtIFBOR19SRVNPTFVUSU9OX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICBQTkdfUkVTT0xVVElPTl9NRVRFUgorCisgICAgcG5nX2dldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5pdCwgJndpZHRoLAorICAgICAgICZoZWlnaHQpCisgICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKKyAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCisgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQorCisgICAgcG5nX2dldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsICZ1bml0LCAmd2lkdGgsCisgICAgICAgJmhlaWdodCkKKyAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQorICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cworICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIHN0cmluZ3MgbGlrZSAiMi41NCIpCisKKyAgICBudW1fdW5rbm93bl9jaHVua3MgPSBwbmdfZ2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIsICZ1bmtub3ducykKKyAgICB1bmtub3ducyAgICAgICAgICAtIGFycmF5IG9mIHBuZ191bmtub3duX2NodW5rCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGhvbGRpbmcgdW5rbm93biBjaHVua3MKKyAgICB1bmtub3duc1tpXS5uYW1lICAtIG5hbWUgb2YgdW5rbm93biBjaHVuaworICAgIHVua25vd25zW2ldLmRhdGEgIC0gZGF0YSBvZiB1bmtub3duIGNodW5rCisgICAgdW5rbm93bnNbaV0uc2l6ZSAgLSBzaXplIG9mIHVua25vd24gY2h1bmsncyBkYXRhCisgICAgdW5rbm93bnNbaV0ubG9jYXRpb24gLSBwb3NpdGlvbiBvZiBjaHVuayBpbiBmaWxlCisKKyAgICBUaGUgdmFsdWUgb2YgImkiIGNvcnJlc3BvbmRzIHRvIHRoZSBvcmRlciBpbiB3aGljaCB0aGUKKyAgICBjaHVua3Mgd2VyZSByZWFkIGZyb20gdGhlIFBORyBmaWxlIG9yIGluc2VydGVkIHdpdGggdGhlCisgICAgcG5nX3NldF91bmtub3duX2NodW5rcygpIGZ1bmN0aW9uLgorCitUaGUgZGF0YSBmcm9tIHRoZSBwSFlzIGNodW5rIGNhbiBiZSByZXRyaWV2ZWQgaW4gc2V2ZXJhbCBjb252ZW5pZW50Citmb3JtczoKKworICAgIHJlc194ID0gcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKyAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisgICAgcmVzX3hfYW5kX3kgPSBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKyAgICByZXNfeCA9IHBuZ19nZXRfeF9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKyAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKyAgICByZXNfeF9hbmRfeSA9IHBuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCisgICAgICAgaW5mb19wdHIpCisgICAgYXNwZWN0X3JhdGlvID0gcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8ocG5nX3B0ciwKKyAgICAgICBpbmZvX3B0cikKKworICAgKEVhY2ggb2YgdGhlc2UgcmV0dXJucyAwIFtzaWduaWZ5aW5nICJ1bmtub3duIl0gaWYKKyAgICAgICB0aGUgZGF0YSBpcyBub3QgcHJlc2VudCBvciBpZiByZXNfeCBpcyAwOworICAgICAgIHJlc194X2FuZF95IGlzIDAgaWYgcmVzX3ggIT0gcmVzX3kpCisKK1RoZSBkYXRhIGZyb20gdGhlIG9GRnMgY2h1bmsgY2FuIGJlIHJldHJpZXZlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQKK2Zvcm1zOgorCisgICAgeF9vZmZzZXQgPSBwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpOworICAgIHlfb2Zmc2V0ID0gcG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICB4X29mZnNldCA9IHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICB5X29mZnNldCA9IHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgKEVhY2ggb2YgdGhlc2UgcmV0dXJucyAwIFtzaWduaWZ5aW5nICJ1bmtub3duIiBpZiBib3RoCisgICAgICAgeCBhbmQgeSBhcmUgMF0gaWYgdGhlIGRhdGEgaXMgbm90IHByZXNlbnQgb3IgaWYgdGhlCisgICAgICAgY2h1bmsgaXMgcHJlc2VudCBidXQgdGhlIHVuaXQgaXMgdGhlIHBpeGVsKQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBwbmdfaW5mbyBkZWZpbml0aW9uIGluIHBuZy5oIGFuZCB0aGUKK1BORyBzcGVjaWZpY2F0aW9uIGZvciBjaHVuayBjb250ZW50cy4gIEJlIGNhcmVmdWwgd2l0aCB0cnVzdGluZworcm93Ynl0ZXMsIGFzIHNvbWUgb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBjb3VsZCBpbmNyZWFzZSB0aGUgc3BhY2UKK25lZWRlZCB0byBob2xkIGEgcm93IChleHBhbmQsIGZpbGxlciwgZ3JheV90b19yZ2IsIGV0Yy4pLgorU2VlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCksIGJlbG93LgorCitBIHF1aWNrIHdvcmQgYWJvdXQgdGV4dF9wdHIgYW5kIG51bV90ZXh0LiAgUE5HIHN0b3JlcyBjb21tZW50cyBpbgora2V5d29yZC90ZXh0IHBhaXJzLCBvbmUgcGFpciBwZXIgY2h1bmssIHdpdGggbm8gbGltaXQgb24gdGhlIG51bWJlcgorb2YgdGV4dCBjaHVua3MsIGFuZCBhIDJeMzEgYnl0ZSBsaW1pdCBvbiB0aGVpciBzaXplLiAgV2hpbGUgdGhlcmUgYXJlCitzdWdnZXN0ZWQga2V5d29yZHMsIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIHJlc3RyaWN0IHRoZSB1c2UgdG8gdGhlc2UKK3N0cmluZ3MuICBJdCBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdCBrZXl3b3JkcyBhbmQgdGV4dCBiZSBzZW5zaWJsZQordG8gaHVtYW5zICh0aGF0J3MgdGhlIHBvaW50KSwgc28gZG9uJ3QgdXNlIGFiYnJldmlhdGlvbnMuICBOb24tcHJpbnRpbmcKK3N5bWJvbHMgYXJlIG5vdCBhbGxvd2VkLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorVGhlcmUgaXMgYWxzbyBubyByZXF1aXJlbWVudCB0byBoYXZlIHRleHQgYWZ0ZXIgdGhlIGtleXdvcmQuCisKK0tleXdvcmRzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDc5IExhdGluLTEgY2hhcmFjdGVycyB3aXRob3V0IGxlYWRpbmcgb3IKK3RyYWlsaW5nIHNwYWNlcywgYnV0IG5vbi1jb25zZWN1dGl2ZSBzcGFjZXMgYXJlIGFsbG93ZWQgd2l0aGluIHRoZQora2V5d29yZC4gIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNhbWUga2V5d29yZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgorVGhlIHRleHRfcHRyIGlzIGFuIGFycmF5IG9mIHBuZ190ZXh0IHN0cnVjdHVyZXMsIGVhY2ggaG9sZGluZyBhCitwb2ludGVyIHRvIGEgbGFuZ3VhZ2Ugc3RyaW5nLCBhIHBvaW50ZXIgdG8gYSBrZXl3b3JkIGFuZCBhIHBvaW50ZXIgdG8KK2EgdGV4dCBzdHJpbmcuICBUaGUgdGV4dCBzdHJpbmcsIGxhbmd1YWdlIGNvZGUsIGFuZCB0cmFuc2xhdGVkCitrZXl3b3JkIG1heSBiZSBlbXB0eSBvciBOVUxMIHBvaW50ZXJzLiAgVGhlIGtleXdvcmQvdGV4dAorcGFpcnMgYXJlIHB1dCBpbnRvIHRoZSBhcnJheSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZWNlaXZlZC4KK0hvd2V2ZXIsIHNvbWUgb3IgYWxsIG9mIHRoZSB0ZXh0IGNodW5rcyBtYXkgYmUgYWZ0ZXIgdGhlIGltYWdlLCBzbywgdG8KK21ha2Ugc3VyZSB5b3UgaGF2ZSByZWFkIGFsbCB0aGUgdGV4dCBjaHVua3MsIGRvbid0IG1lc3Mgd2l0aCB0aGVzZQordW50aWwgYWZ0ZXIgeW91IHJlYWQgdGhlIHN0dWZmIGFmdGVyIHRoZSBpbWFnZS4gIFRoaXMgd2lsbCBiZQorbWVudGlvbmVkIGFnYWluIGJlbG93IGluIHRoZSBkaXNjdXNzaW9uIHRoYXQgZ29lcyB3aXRoIHBuZ19yZWFkX2VuZCgpLgorCitJbnB1dCB0cmFuc2Zvcm1hdGlvbnMKKworQWZ0ZXIgeW91J3ZlIHJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKK3RvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cword2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQorc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgordHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCitjZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLiAgRXZlbiB0aG91Z2ggZWFjaCB0cmFuc2Zvcm1hdGlvbgorY2hlY2tzIHRvIHNlZSBpZiBpdCBoYXMgZGF0YSB0aGF0IGl0IGNhbiBkbyBzb21ldGhpbmcgd2l0aCwgeW91IHNob3VsZAorbWFrZSBzdXJlIHRvIG9ubHkgZW5hYmxlIGEgdHJhbnNmb3JtYXRpb24gaWYgaXQgd2lsbCBiZSB2YWxpZCBmb3IgdGhlCitkYXRhLiAgRm9yIGV4YW1wbGUsIGRvbid0IHN3YXAgcmVkIGFuZCBibHVlIG9uIGdyYXlzY2FsZSBkYXRhLgorCitUaGUgY29sb3JzIHVzZWQgZm9yIHRoZSBiYWNrZ3JvdW5kIGFuZCB0cmFuc3BhcmVuY3kgdmFsdWVzIHNob3VsZCBiZQorc3VwcGxpZWQgaW4gdGhlIHNhbWUgZm9ybWF0L2RlcHRoIGFzIHRoZSBjdXJyZW50IGltYWdlIGRhdGEuICBUaGV5CithcmUgc3RvcmVkIGluIHRoZSBzYW1lIGZvcm1hdC9kZXB0aCBhcyB0aGUgaW1hZ2UgZGF0YSBpbiBhIGJLR0Qgb3IgdFJOUworY2h1bmssIHNvIHRoaXMgaXMgd2hhdCBsaWJwbmcgZXhwZWN0cyBmb3IgdGhpcyBkYXRhLiAgVGhlIGNvbG9ycyBhcmUKK3RyYW5zZm9ybWVkIHRvIGtlZXAgaW4gc3luYyB3aXRoIHRoZSBpbWFnZSBkYXRhIHdoZW4gYW4gYXBwbGljYXRpb24KK2NhbGxzIHRoZSBwbmdfcmVhZF91cGRhdGVfaW5mbygpIHJvdXRpbmUgKHNlZSBiZWxvdykuCisKK0RhdGEgd2lsbCBiZSBkZWNvZGVkIGludG8gdGhlIHN1cHBsaWVkIHJvdyBidWZmZXJzIHBhY2tlZCBpbnRvIGJ5dGVzCit1bmxlc3MgdGhlIGxpYnJhcnkgaGFzIGJlZW4gdG9sZCB0byB0cmFuc2Zvcm0gaXQgaW50byBhbm90aGVyIGZvcm1hdC4KK0ZvciBleGFtcGxlLCA0IGJpdC9waXhlbCBwYWxldHRlZCBvciBncmF5c2NhbGUgZGF0YSB3aWxsIGJlIHJldHVybmVkCisyIHBpeGVscy9ieXRlIHdpdGggdGhlIGxlZnRtb3N0IHBpeGVsIGluIHRoZSBoaWdoLW9yZGVyIGJpdHMgb2YgdGhlCitieXRlLCB1bmxlc3MgcG5nX3NldF9wYWNraW5nKCkgaXMgY2FsbGVkLiAgOC1iaXQgUkdCIGRhdGEgd2lsbCBiZSBzdG9yZWQKK2luIFJHQiBSR0IgUkdCIGZvcm1hdCB1bmxlc3MgcG5nX3NldF9maWxsZXIoKSBvciBwbmdfc2V0X2FkZF9hbHBoYSgpCitpcyBjYWxsZWQgdG8gaW5zZXJ0IGZpbGxlciBieXRlcywgZWl0aGVyIGJlZm9yZSBvciBhZnRlciBlYWNoIFJHQiB0cmlwbGV0LgorMTYtYml0IFJHQiBkYXRhIHdpbGwgYmUgcmV0dXJuZWQgUlJHR0JCIFJSR0dCQiwgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorYnl0ZSBvZiB0aGUgY29sb3IgdmFsdWUgZmlyc3QsIHVubGVzcyBwbmdfc2V0X3N0cmlwXzE2KCkgaXMgY2FsbGVkIHRvCit0cmFuc2Zvcm0gaXQgdG8gcmVndWxhciBSR0IgUkdCIHRyaXBsZXRzLCBvciBwbmdfc2V0X2ZpbGxlcigpIG9yCitwbmdfc2V0X2FkZCBhbHBoYSgpIGlzIGNhbGxlZCB0byBpbnNlcnQgZmlsbGVyIGJ5dGVzLCBlaXRoZXIgYmVmb3JlIG9yCithZnRlciBlYWNoIFJSR0dCQiB0cmlwbGV0LiAgU2ltaWxhcmx5LCA4LWJpdCBvciAxNi1iaXQgZ3JheXNjYWxlIGRhdGEgY2FuCitiZSBtb2RpZmllZCB3aXRoCitwbmdfc2V0X2ZpbGxlcigpLCBwbmdfc2V0X2FkZF9hbHBoYSgpLCBvciBwbmdfc2V0X3N0cmlwXzE2KCkuCisKK1RoZSBmb2xsb3dpbmcgY29kZSB0cmFuc2Zvcm1zIGdyYXlzY2FsZSBpbWFnZXMgb2YgbGVzcyB0aGFuIDggdG8gOCBiaXRzLAorY2hhbmdlcyBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLCBhbmQgYWRkcyBhIGZ1bGwgYWxwaGEgY2hhbm5lbCBpZiB0aGVyZSBpcwordHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGluIGEgdFJOUyBjaHVuay4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgb24KK2dyYXlzY2FsZSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIG9mIDIgb3IgNCBvciBpZiB0aGVyZSBpcyBhIG11bHRpcGxlLWltYWdlCit2aWV3aW5nIGFwcGxpY2F0aW9uIHRoYXQgd2lzaGVzIHRvIHRyZWF0IGFsbCBpbWFnZXMgaW4gdGhlIHNhbWUgd2F5LgorCisgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfcHRyKTsKKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYKKyAgICAgICAgYml0X2RlcHRoIDwgOCkgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgocG5nX3B0cik7CisKKyAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICAgUE5HX0lORk9fdFJOUykpIHBuZ19zZXRfdFJOU190b19hbHBoYShwbmdfcHRyKTsKKworVGhlc2UgdGhyZWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBhbGlhc2VzIGZvciBwbmdfc2V0X2V4cGFuZCgpLCBhZGRlZAoraW4gbGlicG5nIHZlcnNpb24gMS4wLjQsIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWVzIGV4cGFuZGVkIHRvIGltcHJvdmUgY29kZQorcmVhZGFiaWxpdHkuICBJbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIHRoZXkgbWF5IGFjdHVhbGx5IGRvIGRpZmZlcmVudAordGhpbmdzLgorCitQTkcgY2FuIGhhdmUgZmlsZXMgd2l0aCAxNiBiaXRzIHBlciBjaGFubmVsLiAgSWYgeW91IG9ubHkgY2FuIGhhbmRsZQorOCBiaXRzIHBlciBjaGFubmVsLCB0aGlzIHdpbGwgc3RyaXAgdGhlIHBpeGVscyBkb3duIHRvIDggYml0LgorCisgICAgaWYgKGJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKKworSWYsIGZvciBzb21lIHJlYXNvbiwgeW91IGRvbid0IG5lZWQgdGhlIGFscGhhIGNoYW5uZWwgb24gYW4gaW1hZ2UsCithbmQgeW91IHdhbnQgdG8gcmVtb3ZlIGl0IHJhdGhlciB0aGFuIGNvbWJpbmluZyBpdCB3aXRoIHRoZSBiYWNrZ3JvdW5kCisoYnV0IHRoZSBpbWFnZSBhdXRob3IgY2VydGFpbmx5IGhhZCBpbiBtaW5kIHRoYXQgeW91ICp3b3VsZCogY29tYmluZQoraXQgd2l0aCB0aGUgYmFja2dyb3VuZCwgc28gdGhhdCdzIHdoYXQgeW91IHNob3VsZCBwcm9iYWJseSBkbyk6CisKKyAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQorICAgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOworCitJbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlCitpcyB0aGUgbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdSBuZWVkIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIHRvCitiZSB0aGUgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5IGluc3RlYWQgb2Ygb3BhY2l0eSwgeW91IGNhbiBpbnZlcnQgdGhlCithbHBoYSBjaGFubmVsIChvciB0aGUgdFJOUyBjaHVuayBkYXRhKSBhZnRlciBpdCdzIHJlYWQsIHNvIHRoYXQgMCBpcworZnVsbHkgb3BhcXVlIGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUgKGluIDE2LWJpdAoraW1hZ2VzKSBpcyBmdWxseSB0cmFuc3BhcmVudCwgd2l0aAorCisgICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7CisKK1BORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKK3RoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQKK2ZpbGVzLiAgVGhpcyBjb2RlIGV4cGFuZHMgdG8gMSBwaXhlbCBwZXIgYnl0ZSB3aXRob3V0IGNoYW5naW5nIHRoZQordmFsdWVzIG9mIHRoZSBwaXhlbHM6CisKKyAgICBpZiAoYml0X2RlcHRoIDwgOCkKKyAgICAgICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOworCitQTkcgZmlsZXMgaGF2ZSBwb3NzaWJsZSBiaXQgZGVwdGhzIG9mIDEsIDIsIDQsIDgsIGFuZCAxNi4gIEFsbCBwaXhlbHMKK3N0b3JlZCBpbiBhIFBORyBpbWFnZSBoYXZlIGJlZW4gInNjYWxlZCIgb3IgInNoaWZ0ZWQiIHVwIHRvIHRoZSBuZXh0CitoaWdoZXIgcG9zc2libGUgYml0IGRlcHRoIChlLmcuIGZyb20gNSBiaXRzL3NhbXBsZSBpbiB0aGUgcmFuZ2UgWzAsMzFdIHRvCis4IGJpdHMvc2FtcGxlIGluIHRoZSByYW5nZSBbMCwgMjU1XSkuICBIb3dldmVyLCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvCitjb252ZXJ0IHRoZSBQTkcgcGl4ZWwgZGF0YSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBiaXQgZGVwdGggb2YgdGhlIGltYWdlLgorVGhpcyBjYWxsIHJlZHVjZXMgdGhlIHBpeGVscyBiYWNrIGRvd24gdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aDoKKworICAgIHBuZ19jb2xvcl84cCBzaWdfYml0OworCisgICAgaWYgKHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpKQorICAgICAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsIHNpZ19iaXQpOworCitQTkcgZmlsZXMgc3RvcmUgMy1jb2xvciBwaXhlbHMgaW4gcmVkLCBncmVlbiwgYmx1ZSBvcmRlci4gIFRoaXMgY29kZQorY2hhbmdlcyB0aGUgc3RvcmFnZSBvZiB0aGUgcGl4ZWxzIHRvIGJsdWUsIGdyZWVuLCByZWQ6CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOworCitQTkcgZmlsZXMgc3RvcmUgUkdCIHBpeGVscyBwYWNrZWQgaW50byAzIG9yIDYgYnl0ZXMuIFRoaXMgY29kZSBleHBhbmRzIHRoZW0KK2ludG8gNCBvciA4IGJ5dGVzIGZvciB3aW5kb3dpbmcgc3lzdGVtcyB0aGF0IG5lZWQgdGhlbSBpbiB0aGlzIGZvcm1hdDoKKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgICAgICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0JFRk9SRSk7CisKK3doZXJlICJmaWxsZXIiIGlzIHRoZSA4IG9yIDE2LWJpdCBudW1iZXIgdG8gZmlsbCB3aXRoLCBhbmQgdGhlIGxvY2F0aW9uIGlzCitlaXRoZXIgUE5HX0ZJTExFUl9CRUZPUkUgb3IgUE5HX0ZJTExFUl9BRlRFUiwgZGVwZW5kaW5nIHVwb24gd2hldGhlcgoreW91IHdhbnQgdGhlIGZpbGxlciBiZWZvcmUgdGhlIFJHQiBvciBhZnRlci4gIFRoaXMgdHJhbnNmb3JtYXRpb24KK2RvZXMgbm90IGFmZmVjdCBpbWFnZXMgdGhhdCBhbHJlYWR5IGhhdmUgZnVsbCBhbHBoYSBjaGFubmVscy4gIFRvIGFkZCBhbgorb3BhcXVlIGFscGhhIGNoYW5uZWwsIHVzZSBmaWxsZXI9MHhmZiBvciAweGZmZmYgYW5kIFBOR19GSUxMRVJfQUZURVIgd2hpY2gKK3dpbGwgZ2VuZXJhdGUgUkdCQSBwaXhlbHMuCisKK05vdGUgdGhhdCBwbmdfc2V0X2ZpbGxlcigpIGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgdHlwZS4gIElmIHlvdSB3YW50Cit0byBkbyB0aGF0LCB5b3UgY2FuIGFkZCBhIHRydWUgYWxwaGEgY2hhbm5lbCB3aXRoCisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgIHBuZ19zZXRfYWRkX2FscGhhKHBuZ19wdHIsIGZpbGxlciwgUE5HX0ZJTExFUl9BRlRFUik7CisKK3doZXJlICJmaWxsZXIiIGNvbnRhaW5zIHRoZSBhbHBoYSB2YWx1ZSB0byBhc3NpZ24gdG8gZWFjaCBwaXhlbC4KK1RoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIGluIGxpYnBuZy0xLjIuNy4KKworSWYgeW91IGFyZSByZWFkaW5nIGFuIGltYWdlIHdpdGggYW4gYWxwaGEgY2hhbm5lbCwgYW5kIHlvdSBuZWVkIHRoZQorZGF0YSBhcyBBUkdCIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBQTkcgZm9ybWF0IFJHQkE6CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgIHBuZ19zZXRfc3dhcF9hbHBoYShwbmdfcHRyKTsKKworRm9yIHNvbWUgdXNlcywgeW91IG1heSB3YW50IGEgZ3JheXNjYWxlIGltYWdlIHRvIGJlIHJlcHJlc2VudGVkIGFzCitSR0IuICBUaGlzIGNvZGUgd2lsbCBkbyB0aGF0IGNvbnZlcnNpb246CisKKyAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8CisgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOworCitDb252ZXJzZWx5LCB5b3UgY2FuIGNvbnZlcnQgYW4gUkdCIG9yIFJHQkEgaW1hZ2UgdG8gZ3JheXNjYWxlIG9yIGdyYXlzY2FsZQord2l0aCBhbHBoYS4KKworICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICAgICAgICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBuZ19wdHIsIGVycm9yX2FjdGlvbiwKKyAgICAgICAgICAgICBpbnQgcmVkX3dlaWdodCwgaW50IGdyZWVuX3dlaWdodCk7CisKKyAgICBlcnJvcl9hY3Rpb24gPSAxOiBzaWxlbnRseSBkbyB0aGUgY29udmVyc2lvbgorICAgIGVycm9yX2FjdGlvbiA9IDI6IGlzc3VlIGEgd2FybmluZyBpZiB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoYXMgYW55IHBpeGVsIHdoZXJlCisgICAgICAgICAgICAgICAgICAgICAgcmVkICE9IGdyZWVuIG9yIHJlZCAhPSBibHVlCisgICAgZXJyb3JfYWN0aW9uID0gMzogaXNzdWUgYW4gZXJyb3IgYW5kIGFib3J0IHRoZQorICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaWYgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQorICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQorCisgICAgcmVkX3dlaWdodDogICAgICAgd2VpZ2h0IG9mIHJlZCBjb21wb25lbnQgdGltZXMgMTAwMDAwCisgICAgZ3JlZW5fd2VpZ2h0OiAgICAgd2VpZ2h0IG9mIGdyZWVuIGNvbXBvbmVudCB0aW1lcyAxMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICBJZiBlaXRoZXIgd2VpZ2h0IGlzIG5lZ2F0aXZlLCBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyAoMjEyNjgsIDcxNTE0KSBhcmUgdXNlZC4KKworSWYgeW91IGhhdmUgc2V0IGVycm9yX2FjdGlvbiA9IDEgb3IgMiwgeW91IGNhbgorbGF0ZXIgY2hlY2sgd2hldGhlciB0aGUgaW1hZ2UgcmVhbGx5IHdhcyBncmF5LCBhZnRlciBwcm9jZXNzaW5nCit0aGUgaW1hZ2Ugcm93cywgd2l0aCB0aGUgcG5nX2dldF9yZ2JfdG9fZ3JheV9zdGF0dXMocG5nX3B0cikgZnVuY3Rpb24uCitJdCB3aWxsIHJldHVybiBhIHBuZ19ieXRlIHRoYXQgaXMgemVybyBpZiB0aGUgaW1hZ2Ugd2FzIGdyYXkgb3IKKzEgaWYgdGhlcmUgd2VyZSBhbnkgbm9uLWdyYXkgcGl4ZWxzLiAgYktHRCBhbmQgc0JJVCBkYXRhCit3aWxsIGJlIHNpbGVudGx5IGNvbnZlcnRlZCB0byBncmF5c2NhbGUsIHVzaW5nIHRoZSBncmVlbiBjaGFubmVsCitkYXRhLCByZWdhcmRsZXNzIG9mIHRoZSBlcnJvcl9hY3Rpb24gc2V0dGluZy4KKworV2l0aCByZWRfd2VpZ2h0K2dyZWVuX3dlaWdodDw9MTAwMDAwLAordGhlIG5vcm1hbGl6ZWQgZ3JheWxldmVsIGlzIGNvbXB1dGVkOgorCisgICAgaW50IHJ3ID0gcmVkX3dlaWdodCAqIDY1NTM2OworICAgIGludCBndyA9IGdyZWVuX3dlaWdodCAqIDY1NTM2OworICAgIGludCBidyA9IDY1NTM2IC0gKHJ3ICsgZ3cpOworICAgIGdyYXkgPSAocncqcmVkICsgZ3cqZ3JlZW4gKyBidypibHVlKS82NTUzNjsKKworVGhlIGRlZmF1bHQgdmFsdWVzIGFwcHJveGltYXRlIHRob3NlIHJlY29tbWVuZGVkIGluIHRoZSBDaGFybGVzCitQb3ludG9uJ3MgQ29sb3IgRkFRLCA8aHR0cDovL3d3dy5pbmZvcmFtcC5uZXQvfnBveW50b24vPgorQ29weXJpZ2h0IChjKSAxOTk4LTAxLTA0IENoYXJsZXMgUG95bnRvbiA8cG95bnRvbiBhdCBpbmZvcmFtcC5uZXQ+CisKKyAgICBZID0gMC4yMTI2NzEgKiBSICsgMC43MTUxNjAgKiBHICsgMC4wNzIxNjkgKiBCCisKK0xpYnBuZyBhcHByb3hpbWF0ZXMgdGhpcyB3aXRoCisKKyAgICBZID0gMC4yMTI2OCAqIFIgICAgKyAwLjcxNTEgKiBHICAgICsgMC4wNzIxNyAqIEIKKword2hpY2ggY2FuIGJlIGV4cHJlc3NlZCB3aXRoIGludGVnZXJzIGFzCisKKyAgICBZID0gKDY5NjkgKiBSICsgMjM0MzQgKiBHICsgMjM2NSAqIEIpLzMyNzY4CisKK1RoZSBjYWxjdWxhdGlvbiBpcyBkb25lIGluIGEgbGluZWFyIGNvbG9yc3BhY2UsIGlmIHRoZSBpbWFnZSBnYW1tYQoraXMga25vd24uCisKK0lmIHlvdSBoYXZlIGEgZ3JheXNjYWxlIGFuZCB5b3UgYXJlIHVzaW5nIHBuZ19zZXRfZXhwYW5kX2RlcHRoKCksCitwbmdfc2V0X2V4cGFuZCgpLCBvciBwbmdfc2V0X2dyYXlfdG9fcmdiIHRvIGNoYW5nZSB0byB0cnVlY29sb3Igb3IgdG8KK2EgaGlnaGVyIGJpdC1kZXB0aCwgeW91IG11c3QgZWl0aGVyIHN1cHBseSB0aGUgYmFja2dyb3VuZCBjb2xvciBhcyBhIGdyYXkKK3ZhbHVlIGF0IHRoZSBvcmlnaW5hbCBmaWxlIGJpdC1kZXB0aCAobmVlZF9leHBhbmQgPSAxKSBvciBlbHNlIHN1cHBseSB0aGUKK2JhY2tncm91bmQgY29sb3IgYXMgYW4gUkdCIHRyaXBsZXQgYXQgdGhlIGZpbmFsLCBleHBhbmRlZCBiaXQgZGVwdGgKKyhuZWVkX2V4cGFuZCA9IDApLiAgU2ltaWxhcmx5LCBpZiB5b3UgYXJlIHJlYWRpbmcgYSBwYWxldHRlZCBpbWFnZSwgeW91CittdXN0IGVpdGhlciBzdXBwbHkgdGhlIGJhY2tncm91bmQgY29sb3IgYXMgYSBwYWxldHRlIGluZGV4IChuZWVkX2V4cGFuZCA9IDEpCitvciBhcyBhbiBSR0IgdHJpcGxldCB0aGF0IG1heSBvciBtYXkgbm90IGJlIGluIHRoZSBwYWxldHRlIChuZWVkX2V4cGFuZCA9IDApLgorCisgICAgcG5nX2NvbG9yXzE2IG15X2JhY2tncm91bmQ7CisgICAgcG5nX2NvbG9yXzE2cCBpbWFnZV9iYWNrZ3JvdW5kOworCisgICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpKQorICAgICAgICBwbmdfc2V0X2JhY2tncm91bmQocG5nX3B0ciwgaW1hZ2VfYmFja2dyb3VuZCwKKyAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLCAxLjApOworICAgIGVsc2UKKyAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZteV9iYWNrZ3JvdW5kLAorICAgICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMCwgMS4wKTsKKworVGhlIHBuZ19zZXRfYmFja2dyb3VuZCgpIGZ1bmN0aW9uIHRlbGxzIGxpYnBuZyB0byBjb21wb3NpdGUgaW1hZ2VzCit3aXRoIGFscGhhIG9yIHNpbXBsZSB0cmFuc3BhcmVuY3kgYWdhaW5zdCB0aGUgc3VwcGxpZWQgYmFja2dyb3VuZAorY29sb3IuICBJZiB0aGUgUE5HIGZpbGUgY29udGFpbnMgYSBiS0dEIGNodW5rIChQTkdfSU5GT19iS0dEIHZhbGlkKSwKK3lvdSBtYXkgdXNlIHRoaXMgY29sb3IsIG9yIHN1cHBseSBhbm90aGVyIGNvbG9yIG1vcmUgc3VpdGFibGUgZm9yCit0aGUgY3VycmVudCBkaXNwbGF5IChlLmcuLCB0aGUgYmFja2dyb3VuZCBjb2xvciBmcm9tIGEgd2ViIHBhZ2UpLiAgWW91CituZWVkIHRvIHRlbGwgbGlicG5nIHdoZXRoZXIgdGhlIGNvbG9yIGlzIGluIHRoZSBnYW1tYSBzcGFjZSBvZiB0aGUKK2Rpc3BsYXkgKFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiBmb3IgY29sb3JzIHlvdSBzdXBwbHkpLCB0aGUgZmlsZQorKFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUgZm9yIGNvbG9ycyBmcm9tIHRoZSBiS0dEIGNodW5rKSwgb3Igb25lCit0aGF0IGlzIG5laXRoZXIgb2YgdGhlc2UgZ2FtbWFzIChQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUUgLSBJIGRvbid0Citrbm93IHdoeSBhbnlvbmUgd291bGQgdXNlIHRoaXMsIGJ1dCBpdCdzIGhlcmUpLgorCitUbyBwcm9wZXJseSBkaXNwbGF5IFBORyBpbWFnZXMgb24gYW55IGtpbmQgb2Ygc3lzdGVtLCB0aGUgYXBwbGljYXRpb24gbmVlZHMKK3RvIGtub3cgd2hhdCB0aGUgZGlzcGxheSBnYW1tYSBpcy4gIElkZWFsbHksIHRoZSB1c2VyIHdpbGwga25vdyB0aGlzLCBhbmQKK3RoZSBhcHBsaWNhdGlvbiB3aWxsIGFsbG93IHRoZW0gdG8gc2V0IGl0LiAgT25lIG1ldGhvZCBvZiBhbGxvd2luZyB0aGUgdXNlcgordG8gc2V0IHRoZSBkaXNwbGF5IGdhbW1hIHNlcGFyYXRlbHkgZm9yIGVhY2ggc3lzdGVtIGlzIHRvIGNoZWNrIGZvciBhCitTQ1JFRU5fR0FNTUEgb3IgRElTUExBWV9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2hpY2ggd2lsbCBob3BlZnVsbHkgYmUKK2NvcnJlY3RseSBzZXQuCisKK05vdGUgdGhhdCBkaXNwbGF5X2dhbW1hIGlzIHRoZSBvdmVyYWxsIGdhbW1hIGNvcnJlY3Rpb24gcmVxdWlyZWQgdG8gcHJvZHVjZQorcGxlYXNpbmcgcmVzdWx0cywgd2hpY2ggZGVwZW5kcyBvbiB0aGUgbGlnaHRpbmcgY29uZGl0aW9ucyBpbiB0aGUgc3Vycm91bmRpbmcKK2Vudmlyb25tZW50LiAgSW4gYSBkaW0gb3IgYnJpZ2h0bHkgbGl0IHJvb20sIG5vIGNvbXBlbnNhdGlvbiBvdGhlciB0aGFuCit0aGUgcGh5c2ljYWwgZ2FtbWEgZXhwb25lbnQgb2YgdGhlIG1vbml0b3IgaXMgbmVlZGVkLCB3aGlsZSBpbiBhIGRhcmsgcm9vbQorYSBzbGlnaHRseSBzbWFsbGVyIGV4cG9uZW50IGlzIGJldHRlci4KKworICAgZG91YmxlIGdhbW1hLCBzY3JlZW5fZ2FtbWE7CisKKyAgIGlmICgvKiBXZSBoYXZlIGEgdXNlci1kZWZpbmVkIHNjcmVlbgorICAgICAgIGdhbW1hIHZhbHVlICovKQorICAgeworICAgICAgc2NyZWVuX2dhbW1hID0gdXNlcl9kZWZpbmVkX3NjcmVlbl9nYW1tYTsKKyAgIH0KKyAgIC8qIE9uZSB3YXkgdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHNoYXJlIHRoZSBzYW1lCisgICAgICBzY3JlZW4gZ2FtbWEgdmFsdWUgKi8KKyAgIGVsc2UgaWYgKChnYW1tYV9zdHIgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKQorICAgICAgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHNjcmVlbl9nYW1tYSA9IChkb3VibGUpYXRvZihnYW1tYV9zdHIpOworICAgfQorICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbm90aGVyIHZhbHVlICovCisgICBlbHNlCisgICB7CisgICAgICBzY3JlZW5fZ2FtbWEgPSAyLjI7IC8qIEEgZ29vZCBndWVzcyBmb3IgYQorICAgICAgICAgICBQQyBtb25pdG9yIGluIGEgYnJpZ2h0IG9mZmljZSBvciBhIGRpbSByb29tICovCisgICAgICBzY3JlZW5fZ2FtbWEgPSAyLjA7IC8qIEEgZ29vZCBndWVzcyBmb3IgYQorICAgICAgICAgICBQQyBtb25pdG9yIGluIGEgZGFyayByb29tICovCisgICAgICBzY3JlZW5fZ2FtbWEgPSAxLjcgb3IgMS4wOyAgLyogQSBnb29kCisgICAgICAgICAgIGd1ZXNzIGZvciBNYWMgc3lzdGVtcyAqLworICAgfQorCitUaGUgcG5nX3NldF9nYW1tYSgpIGZ1bmN0aW9uIGhhbmRsZXMgZ2FtbWEgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBkYXRhLgorUGFzcyBib3RoIHRoZSBmaWxlIGdhbW1hIGFuZCB0aGUgY3VycmVudCBzY3JlZW5fZ2FtbWEuICBJZiB0aGUgZmlsZSBkb2VzCitub3QgaGF2ZSBhIGdhbW1hIHZhbHVlLCB5b3UgY2FuIHBhc3Mgb25lIGFueXdheSBpZiB5b3UgaGF2ZSBhbiBpZGVhIHdoYXQKK2l0IGlzICh1c3VhbGx5IDAuNDU0NTUgaXMgYSBnb29kIGd1ZXNzIGZvciBHSUYgaW1hZ2VzIG9uIFBDcykuICBOb3RlCit0aGF0IGZpbGUgZ2FtbWFzIGFyZSBpbnZlcnRlZCBmcm9tIHNjcmVlbiBnYW1tYXMuICBTZWUgdGhlIGRpc2N1c3Npb25zCitvbiBnYW1tYSBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24gZm9yIGFuIGV4Y2VsbGVudCBkZXNjcmlwdGlvbiBvZiB3aGF0CitnYW1tYSBpcywgYW5kIHdoeSBhbGwgYXBwbGljYXRpb25zIHNob3VsZCBzdXBwb3J0IGl0LiAgSXQgaXMgc3Ryb25nbHkKK3JlY29tbWVuZGVkIHRoYXQgUE5HIHZpZXdlcnMgc3VwcG9ydCBnYW1tYSBjb3JyZWN0aW9uLgorCisgICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpKQorICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIGdhbW1hKTsKKyAgIGVsc2UKKyAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCAwLjQ1NDU1KTsKKworSWYgeW91IG5lZWQgdG8gcmVkdWNlIGFuIFJHQiBmaWxlIHRvIGEgcGFsZXR0ZWQgZmlsZSwgb3IgaWYgYSBwYWxldHRlZAorZmlsZSBoYXMgbW9yZSBlbnRyaWVzIHRoZW4gd2lsbCBmaXQgb24geW91ciBzY3JlZW4sIHBuZ19zZXRfZGl0aGVyKCkKK3dpbGwgZG8gdGhhdC4gIE5vdGUgdGhhdCB0aGlzIGlzIGEgc2ltcGxlIG1hdGNoIGRpdGhlciB0aGF0IG1lcmVseQorZmluZHMgdGhlIGNsb3Nlc3QgY29sb3IgYXZhaWxhYmxlLiAgVGhpcyBzaG91bGQgd29yayBmYWlybHkgd2VsbCB3aXRoCitvcHRpbWl6ZWQgcGFsZXR0ZXMsIGFuZCBmYWlybHkgYmFkbHkgd2l0aCBsaW5lYXIgY29sb3IgY3ViZXMuICBJZiB5b3UKK3Bhc3MgYSBwYWxldHRlIHRoYXQgaXMgbGFyZ2VyIHRoZW4gbWF4aW11bV9jb2xvcnMsIHRoZSBmaWxlIHdpbGwKK3JlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBzbyBpdCB3aWxsIGZpdCBpbnRvCittYXhpbXVtX2NvbG9ycy4gIElmIHRoZXJlIGlzIGEgaGlzdG9ncmFtLCBpdCB3aWxsIHVzZSBpdCB0byBtYWtlCittb3JlIGludGVsbGlnZW50IGNob2ljZXMgd2hlbiByZWR1Y2luZyB0aGUgcGFsZXR0ZS4gIElmIHRoZXJlIGlzIG5vCitoaXN0b2dyYW0sIGl0IG1heSBub3QgZG8gYXMgZ29vZCBhIGpvYi4KKworICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgIHsKKyAgICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICAgUE5HX0lORk9fUExURSkpCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8xNnAgaGlzdG9ncmFtID0gTlVMTDsKKworICAgICAgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgICAgICAgJmhpc3RvZ3JhbSk7CisgICAgICAgICBwbmdfc2V0X2RpdGhlcihwbmdfcHRyLCBwYWxldHRlLCBudW1fcGFsZXR0ZSwKKyAgICAgICAgICAgIG1heF9zY3JlZW5fY29sb3JzLCBoaXN0b2dyYW0sIDEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcG5nX2NvbG9yIHN0ZF9jb2xvcl9jdWJlW01BWF9TQ1JFRU5fQ09MT1JTXSA9CisgICAgICAgICAgICB7IC4uLiBjb2xvcnMgLi4uIH07CisKKyAgICAgICAgIHBuZ19zZXRfZGl0aGVyKHBuZ19wdHIsIHN0ZF9jb2xvcl9jdWJlLAorICAgICAgICAgICAgTUFYX1NDUkVFTl9DT0xPUlMsIE1BWF9TQ1JFRU5fQ09MT1JTLAorICAgICAgICAgICAgTlVMTCwwKTsKKyAgICAgIH0KKyAgIH0KKworUE5HIGZpbGVzIGRlc2NyaWJlIG1vbm9jaHJvbWUgYXMgYmxhY2sgYmVpbmcgemVybyBhbmQgd2hpdGUgYmVpbmcgb25lLgorVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV2ZXJzZSB0aGlzIChtYWtlIGJsYWNrIGJlIG9uZSBhbmQgd2hpdGUgYmUKK3plcm8pOgorCisgICBpZiAoYml0X2RlcHRoID09IDEgJiYgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKworVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIGludmVydCBncmF5c2NhbGUgYW5kIGdyYXktYWxwaGEgaW1hZ2VzOgorCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8CisgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7CisKK1BORyBmaWxlcyBzdG9yZSAxNiBiaXQgcGl4ZWxzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAoYmlnLWVuZGlhbiwKK2llLiBtb3N0IHNpZ25pZmljYW50IGJpdHMgZmlyc3QpLiAgVGhpcyBjb2RlIGNoYW5nZXMgdGhlIHN0b3JhZ2UgdG8gdGhlCitvdGhlciB3YXkgKGxpdHRsZS1lbmRpYW4sIGkuZS4gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCwgdGhlCit3YXkgUENzIHN0b3JlIHRoZW0pOgorCisgICAgaWYgKGJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgcG5nX3NldF9zd2FwKHBuZ19wdHIpOworCitJZiB5b3UgYXJlIHVzaW5nIHBhY2tlZC1waXhlbCBpbWFnZXMgKDEsIDIsIG9yIDQgYml0cy9waXhlbCksIGFuZCB5b3UKK25lZWQgdG8gY2hhbmdlIHRoZSBvcmRlciB0aGUgcGl4ZWxzIGFyZSBwYWNrZWQgaW50byBieXRlcywgeW91IGNhbiB1c2U6CisKKyAgICBpZiAoYml0X2RlcHRoIDwgOCkKKyAgICAgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOworCitGaW5hbGx5LCB5b3UgY2FuIHdyaXRlIHlvdXIgb3duIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGlmIG5vbmUgb2YKK3RoZSBleGlzdGluZyBvbmVzIG1lZXRzIHlvdXIgbmVlZHMuICBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyBhIGNhbGxiYWNrCit3aXRoCisKKyAgICBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4ocG5nX3B0ciwKKyAgICAgICByZWFkX3RyYW5zZm9ybV9mbik7CisKK1lvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KKworICAgIHZvaWQgcmVhZF90cmFuc2Zvcm1fZm4ocG5nX3B0ciBwdHIsIHJvd19pbmZvX3B0cgorICAgICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKKworU2VlIHBuZ3Rlc3QuYyBmb3IgYSB3b3JraW5nIGV4YW1wbGUuICBZb3VyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCithZnRlciBhbGwgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorCitZb3UgY2FuIGFsc28gc2V0IHVwIGEgcG9pbnRlciB0byBhIHVzZXIgc3RydWN0dXJlIGZvciB1c2UgYnkgeW91cgorY2FsbGJhY2sgZnVuY3Rpb24sIGFuZCB5b3UgY2FuIGluZm9ybSBsaWJwbmcgdGhhdCB5b3VyIHRyYW5zZm9ybQorZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIG51bWJlciBvZiBjaGFubmVscyBvciBiaXQgZGVwdGggd2l0aCB0aGUKK2Z1bmN0aW9uCisKKyAgICBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8ocG5nX3B0ciwgdXNlcl9wdHIsCisgICAgICAgdXNlcl9kZXB0aCwgdXNlcl9jaGFubmVscyk7CisKK1RoZSB1c2VyJ3MgYXBwbGljYXRpb24sIG5vdCBsaWJwbmcsIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGFuZAorZnJlZWluZyBhbnkgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgdXNlciBzdHJ1Y3R1cmUuCisKK1lvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbgorcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4gIEZvciBleGFtcGxlOgorCisgICAgdm9pZHAgcmVhZF91c2VyX3RyYW5zZm9ybV9wdHIgPQorICAgICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKHBuZ19wdHIpOworCitUaGUgbGFzdCB0aGluZyB0byBoYW5kbGUgaXMgaW50ZXJsYWNpbmc7IHRoaXMgaXMgY292ZXJlZCBpbiBkZXRhaWwgYmVsb3csCitidXQgeW91IG11c3QgY2FsbCB0aGUgZnVuY3Rpb24gaGVyZSBpZiB5b3Ugd2FudCBsaWJwbmcgdG8gaGFuZGxlIGV4cGFuc2lvbgorb2YgdGhlIGludGVybGFjZWQgaW1hZ2UuCisKKyAgICBudW1iZXJfb2ZfcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisKK0FmdGVyIHNldHRpbmcgdGhlIHRyYW5zZm9ybWF0aW9ucywgbGlicG5nIGNhbiB1cGRhdGUgeW91ciBwbmdfaW5mbworc3RydWN0dXJlIHRvIHJlZmxlY3QgYW55IHRyYW5zZm9ybWF0aW9ucyB5b3UndmUgcmVxdWVzdGVkIHdpdGggdGhpcworY2FsbC4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgdG8gdXBkYXRlIHRoZSBpbmZvIHN0cnVjdHVyZSdzIHJvd2J5dGVzCitmaWVsZCBzbyB5b3UgY2FuIHVzZSBpdCB0byBhbGxvY2F0ZSB5b3VyIGltYWdlIG1lbW9yeS4gIFRoaXMgZnVuY3Rpb24KK3dpbGwgYWxzbyB1cGRhdGUgeW91ciBwYWxldHRlIHdpdGggdGhlIGNvcnJlY3Qgc2NyZWVuX2dhbW1hIGFuZAorYmFja2dyb3VuZCBpZiB0aGVzZSBoYXZlIGJlZW4gZ2l2ZW4gd2l0aCB0aGUgY2FsbHMgYWJvdmUuCisKKyAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisKK0FmdGVyIHlvdSBjYWxsIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCksIHlvdSBjYW4gYWxsb2NhdGUgYW55CittZW1vcnkgeW91IG5lZWQgdG8gaG9sZCB0aGUgaW1hZ2UuICBUaGUgcm93IGRhdGEgaXMgc2ltcGx5CityYXcgYnl0ZSBkYXRhIGZvciBhbGwgZm9ybXMgb2YgaW1hZ2VzLiAgQXMgdGhlIGFjdHVhbCBhbGxvY2F0aW9uCit2YXJpZXMgYW1vbmcgYXBwbGljYXRpb25zLCBubyBleGFtcGxlIHdpbGwgYmUgZ2l2ZW4uICBJZiB5b3UKK2FyZSBhbGxvY2F0aW5nIG9uZSBsYXJnZSBjaHVuaywgeW91IHdpbGwgbmVlZCB0byBidWlsZCBhbgorYXJyYXkgb2YgcG9pbnRlcnMgdG8gZWFjaCByb3csIGFzIGl0IHdpbGwgYmUgbmVlZGVkIGZvciBzb21lCitvZiB0aGUgZnVuY3Rpb25zIGJlbG93LgorCitSZWFkaW5nIGltYWdlIGRhdGEKKworQWZ0ZXIgeW91J3ZlIGFsbG9jYXRlZCBtZW1vcnksIHlvdSBjYW4gcmVhZCB0aGUgaW1hZ2UgZGF0YS4KK1RoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyBpcyBpbiBvbmUgZnVuY3Rpb24gY2FsbC4gIElmIHlvdSBhcmUKK2FsbG9jYXRpbmcgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSB3aG9sZSBpbWFnZSwgeW91IGNhbiBqdXN0CitjYWxsIHBuZ19yZWFkX2ltYWdlKCkgYW5kIGxpYnBuZyB3aWxsIHJlYWQgaW4gYWxsIHRoZSBpbWFnZSBkYXRhCithbmQgcHV0IGl0IGluIHRoZSBtZW1vcnkgYXJlYSBzdXBwbGllZC4gIFlvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbgorYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZWFjaCByb3cuCisKK1RoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGludGVybGFjaW5nLCBzbyB5b3UgZG9uJ3QgbmVlZAordG8gY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIG9yIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZQordGltZXMsIG9yIGFueSBvZiB0aGF0IG90aGVyIHN0dWZmIG5lY2Vzc2FyeSB3aXRoIHBuZ19yZWFkX3Jvd3MoKS4KKworICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKKword2hlcmUgcm93X3BvaW50ZXJzIGlzOgorCisgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07CisKK1lvdSBjYW4gcG9pbnQgdG8gdm9pZCBvciBjaGFyIG9yIHdoYXRldmVyIHlvdSB1c2UgZm9yIHBpeGVscy4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gcmVhZCBpbiB0aGUgd2hvbGUgaW1hZ2UgYXQgb25jZSwgeW91IGNhbgordXNlIHBuZ19yZWFkX3Jvd3MoKSBpbnN0ZWFkLiAgSWYgdGhlcmUgaXMgbm8gaW50ZXJsYWNpbmcgKGNoZWNrCitpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX05PTkUpLCB0aGlzIGlzIHNpbXBsZToKKworICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBOVUxMLAorICAgICAgIG51bWJlcl9vZl9yb3dzKTsKKword2hlcmUgcm93X3BvaW50ZXJzIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBwbmdfcmVhZF9pbWFnZSgpIGNhbGwuCisKK0lmIHlvdSBhcmUgZG9pbmcgdGhpcyBqdXN0IG9uZSByb3cgYXQgYSB0aW1lLCB5b3UgY2FuIGRvIHRoaXMgd2l0aAorYSBzaW5nbGUgcm93X3BvaW50ZXIgaW5zdGVhZCBvZiBhbiBhcnJheSBvZiByb3dfcG9pbnRlcnM6CisKKyAgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXIgPSByb3c7CisgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJvd19wb2ludGVyLCBOVUxMKTsKKworSWYgdGhlIGZpbGUgaXMgaW50ZXJsYWNlZCAoaW50ZXJsYWNlX3R5cGUgIT0gMCBpbiB0aGUgSUhEUiBjaHVuayksIHRoaW5ncworZ2V0IHNvbWV3aGF0IGhhcmRlci4gIFRoZSBvbmx5IGN1cnJlbnQgKFBORyBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yKQoraW50ZXJsYWNpbmcgdHlwZSBmb3IgUE5HIGlzIChpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQoraXMgYSBzb21ld2hhdCBjb21wbGljYXRlZCAyRCBpbnRlcmxhY2Ugc2NoZW1lLCBrbm93biBhcyBBZGFtNywgdGhhdAorYnJlYWtzIGRvd24gYW4gaW1hZ2UgaW50byBzZXZlbiBzbWFsbGVyIGltYWdlcyBvZiB2YXJ5aW5nIHNpemUsIGJhc2VkCitvbiBhbiA4eDggZ3JpZC4KKworbGlicG5nIGNhbiBmaWxsIG91dCB0aG9zZSBpbWFnZXMgb3IgaXQgY2FuIGdpdmUgdGhlbSB0byB5b3UgImFzIGlzIi4KK0lmIHlvdSB3YW50IHRoZW0gZmlsbGVkIG91dCwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIHRoYXQuICBUaGUgb25lCittZW50aW9uZWQgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIGlzIHRvIGV4cGFuZCBlYWNoIHBpeGVsIHRvIGNvdmVyCit0aG9zZSBwaXhlbHMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlYWQgeWV0ICh0aGUgInJlY3RhbmdsZSIgbWV0aG9kKS4KK1RoaXMgcmVzdWx0cyBpbiBhIGJsb2NreSBpbWFnZSBmb3IgdGhlIGZpcnN0IHBhc3MsIHdoaWNoIGdyYWR1YWxseQorc21vb3RocyBvdXQgYXMgbW9yZSBwaXhlbHMgYXJlIHJlYWQuICBUaGUgb3RoZXIgbWV0aG9kIGlzIHRoZSAic3BhcmtsZSIKK21ldGhvZCwgd2hlcmUgcGl4ZWxzIGFyZSBkcmF3biBvbmx5IGluIHRoZWlyIGZpbmFsIGxvY2F0aW9ucywgd2l0aCB0aGUKK3Jlc3Qgb2YgdGhlIGltYWdlIHJlbWFpbmluZyB3aGF0ZXZlciBjb2xvcnMgdGhleSB3ZXJlIGluaXRpYWxpemVkIHRvCitiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSByZWFkLiAgVGhlIGZpcnN0IG1ldGhvZCB1c3VhbGx5IGxvb2tzIGJldHRlciwKK2J1dCB0ZW5kcyB0byBiZSBzbG93ZXIsIGFzIHRoZXJlIGFyZSBtb3JlIHBpeGVscyB0byBwdXQgaW4gdGhlIHJvd3MuCisKK0lmIHlvdSBkb24ndCB3YW50IGxpYnBuZyB0byBoYW5kbGUgdGhlIGludGVybGFjaW5nIGRldGFpbHMsIGp1c3QgY2FsbAorcG5nX3JlYWRfcm93cygpIHNldmVuIHRpbWVzIHRvIHJlYWQgaW4gYWxsIHNldmVuIGltYWdlcy4gIEVhY2ggb2YgdGhlCitpbWFnZXMgaXMgYSB2YWxpZCBpbWFnZSBieSBpdHNlbGYsIG9yIHRoZXkgY2FuIGFsbCBiZSBjb21iaW5lZCBvbiBhbgorOHg4IGdyaWQgdG8gZm9ybSBhIHNpbmdsZSBpbWFnZSAoYWx0aG91Z2ggaWYgeW91IGludGVuZCB0byBjb21iaW5lIHRoZW0KK3lvdSB3b3VsZCBiZSBmYXIgYmV0dGVyIG9mZiB1c2luZyB0aGUgbGlicG5nIGludGVybGFjZSBoYW5kbGluZykuCisKK1RoZSBmaXJzdCBwYXNzIHdpbGwgcmV0dXJuIGFuIGltYWdlIDEvOCBhcyB3aWRlIGFzIHRoZSBlbnRpcmUgaW1hZ2UKKyhldmVyeSA4dGggY29sdW1uIHN0YXJ0aW5nIGluIGNvbHVtbiAwKSBhbmQgMS84IGFzIGhpZ2ggYXMgdGhlIG9yaWdpbmFsCisoZXZlcnkgOHRoIHJvdyBzdGFydGluZyBpbiByb3cgMCksIHRoZSBzZWNvbmQgd2lsbCBiZSAxLzggYXMgd2lkZQorKHN0YXJ0aW5nIGluIGNvbHVtbiA0KSBhbmQgMS84IGFzIGhpZ2ggKGFsc28gc3RhcnRpbmcgaW4gcm93IDApLiAgVGhlCit0aGlyZCBwYXNzIHdpbGwgYmUgMS80IGFzIHdpZGUgKGV2ZXJ5IDR0aCBwaXhlbCBzdGFydGluZyBpbiBjb2x1bW4gMCkgYW5kCisxLzggYXMgaGlnaCAoZXZlcnkgOHRoIHJvdyBzdGFydGluZyBpbiByb3cgNCksIGFuZCB0aGUgZm91cnRoIHBhc3Mgd2lsbAorYmUgMS80IGFzIHdpZGUgYW5kIDEvNCBhcyBoaWdoIChldmVyeSA0dGggY29sdW1uIHN0YXJ0aW5nIGluIGNvbHVtbiAyLAorYW5kIGV2ZXJ5IDR0aCByb3cgc3RhcnRpbmcgaW4gcm93IDApLiAgVGhlIGZpZnRoIHBhc3Mgd2lsbCByZXR1cm4gYW4KK2ltYWdlIDEvMiBhcyB3aWRlLCBhbmQgMS80IGFzIGhpZ2ggKHN0YXJ0aW5nIGF0IGNvbHVtbiAwIGFuZCByb3cgMiksCit3aGlsZSB0aGUgc2l4dGggcGFzcyB3aWxsIGJlIDEvMiBhcyB3aWRlIGFuZCAxLzIgYXMgaGlnaCBhcyB0aGUgb3JpZ2luYWwKKyhzdGFydGluZyBpbiBjb2x1bW4gMSBhbmQgcm93IDApLiAgVGhlIHNldmVudGggYW5kIGZpbmFsIHBhc3Mgd2lsbCBiZSBhcword2lkZSBhcyB0aGUgb3JpZ2luYWwsIGFuZCAxLzIgYXMgaGlnaCwgY29udGFpbmluZyBhbGwgb2YgdGhlIG9kZAorbnVtYmVyZWQgc2NhbmxpbmVzLiAgUGhldyEKKworSWYgeW91IHdhbnQgbGlicG5nIHRvIGV4cGFuZCB0aGUgaW1hZ2VzLCBjYWxsIHRoaXMgYmVmb3JlIGNhbGxpbmcKK3BuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8oKToKKworICAgIGlmIChpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQorICAgICAgICBudW1iZXJfb2ZfcGFzc2VzCisgICAgICAgICAgID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisKK1RoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzCitpcyBzZXZlbiwgYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4KK1RoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBldmVuIGlmIHRoZSBmaWxlIGlzIG5vdCBpbnRlcmxhY2VkLAord2hlcmUgaXQgd2lsbCByZXR1cm4gb25lIHBhc3MuCisKK0lmIHlvdSBhcmUgbm90IGdvaW5nIHRvIGRpc3BsYXkgdGhlIGltYWdlIGFmdGVyIGVhY2ggcGFzcywgYnV0IGFyZQorZ29pbmcgdG8gd2FpdCB1bnRpbCB0aGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW4sIHVzZSB0aGUgc3BhcmtsZQorZWZmZWN0LiAgVGhpcyBlZmZlY3QgaXMgZmFzdGVyIGFuZCB0aGUgZW5kIHJlc3VsdCBvZiBlaXRoZXIgbWV0aG9kCitpcyBleGFjdGx5IHRoZSBzYW1lLiAgSWYgeW91IGFyZSBwbGFubmluZyBvbiBkaXNwbGF5aW5nIHRoZSBpbWFnZQorYWZ0ZXIgZWFjaCBwYXNzLCB0aGUgInJlY3RhbmdsZSIgZWZmZWN0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIHRoZQorYmV0dGVyIGxvb2tpbmcgb25lLgorCitJZiB5b3Ugb25seSB3YW50IHRoZSAic3BhcmtsZSIgZWZmZWN0LCBqdXN0IGNhbGwgcG5nX3JlYWRfcm93cygpIGFzCitub3JtYWwsIHdpdGggdGhlIHRoaXJkIHBhcmFtZXRlciBOVUxMLiAgTWFrZSBzdXJlIHlvdSBtYWtlIHBhc3Mgb3ZlcgordGhlIGltYWdlIG51bWJlcl9vZl9wYXNzZXMgdGltZXMsIGFuZCB5b3UgZG9uJ3QgY2hhbmdlIHRoZSBkYXRhIGluIHRoZQorcm93cyBiZXR3ZWVuIGNhbGxzLiAgWW91IGNhbiBjaGFuZ2UgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZGF0YSwganVzdAorbm90IHRoZSBkYXRhLiAgRWFjaCBwYXNzIG9ubHkgd3JpdGVzIHRoZSBwaXhlbHMgYXBwcm9wcmlhdGUgZm9yIHRoYXQKK3Bhc3MsIGFuZCBhc3N1bWVzIHRoZSBkYXRhIGZyb20gcHJldmlvdXMgcGFzc2VzIGlzIHN0aWxsIHZhbGlkLgorCisgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsIE5VTEwsCisgICAgICAgbnVtYmVyX29mX3Jvd3MpOworCitJZiB5b3Ugb25seSB3YW50IHRoZSBmaXJzdCBlZmZlY3QgKHRoZSByZWN0YW5nbGVzKSwgZG8gdGhlIHNhbWUgYXMKK2JlZm9yZSBleGNlcHQgcGFzcyB0aGUgcm93IGJ1ZmZlciBpbiB0aGUgdGhpcmQgcGFyYW1ldGVyLCBhbmQgbGVhdmUKK3RoZSBzZWNvbmQgcGFyYW1ldGVyIE5VTEwuCisKKyAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIE5VTEwsIHJvd19wb2ludGVycywKKyAgICAgICBudW1iZXJfb2Zfcm93cyk7CisKK0ZpbmlzaGluZyBhIHNlcXVlbnRpYWwgcmVhZAorCitBZnRlciB5b3UgYXJlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGltYWdlIHRocm91Z2ggZWl0aGVyIHRoZSBoaWdoLSBvcgorbG93LWxldmVsIGludGVyZmFjZXMsIHlvdSBjYW4gZmluaXNoIHJlYWRpbmcgdGhlIGZpbGUuICBJZiB5b3UgYXJlCitpbnRlcmVzdGVkIGluIGNvbW1lbnRzIG9yIHRpbWUsIHdoaWNoIG1heSBiZSBzdG9yZWQgZWl0aGVyIGJlZm9yZSBvcgorYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHlvdSBzaG91bGQgcGFzcyB0aGUgc2VwYXJhdGUgcG5nX2luZm8gc3RydWN0IGlmCit5b3Ugd2FudCB0byBrZWVwIHRoZSBjb21tZW50cyBmcm9tIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGltYWdlCitzZXBhcmF0ZS4gIElmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQsIHlvdSBjYW4gcGFzcyBOVUxMLgorCisgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgZW5kX2luZm8pOworCitXaGVuIHlvdSBhcmUgZG9uZSwgeW91IGNhbiBmcmVlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGxpYnBuZyBsaWtlIHRoaXM6CisKKyAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCisgICAgICAgJmVuZF9pbmZvKTsKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmRpdmlkdWFsbHkgZnJlZSB0aGUgaW5mb19wdHIgbWVtYmVycyB0aGF0Citwb2ludCB0byBsaWJwbmctYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorCisgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgbWFzaywgc2VxKQorICAgIG1hc2sgLSBpZGVudGlmaWVzIGRhdGEgdG8gYmUgZnJlZWQsIGEgbWFzaworICAgICAgICAgICBjb250YWluaW5nIHRoZSBsb2dpY2FsIE9SIG9mIG9uZSBvcgorICAgICAgICAgICBtb3JlIG9mCisgICAgICAgICAgICAgUE5HX0ZSRUVfUExURSwgUE5HX0ZSRUVfVFJOUywKKyAgICAgICAgICAgICBQTkdfRlJFRV9ISVNULCBQTkdfRlJFRV9JQ0NQLAorICAgICAgICAgICAgIFBOR19GUkVFX1BDQUwsIFBOR19GUkVFX1JPV1MsCisgICAgICAgICAgICAgUE5HX0ZSRUVfU0NBTCwgUE5HX0ZSRUVfU1BMVCwKKyAgICAgICAgICAgICBQTkdfRlJFRV9URVhULCBQTkdfRlJFRV9VTktOLAorICAgICAgICAgICBvciBzaW1wbHkgUE5HX0ZSRUVfQUxMCisgICAgc2VxICAtIHNlcXVlbmNlIG51bWJlciBvZiBpdGVtIHRvIGJlIGZyZWVkCisgICAgICAgICAgICgtMSBmb3IgYWxsIGl0ZW1zKQorCitUaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIHdoZW4gdGhlIHJlbGV2YW50IHN0b3JhZ2UgaGFzCithbHJlYWR5IGJlZW4gZnJlZWQsIG9yIGhhcyBub3QgeWV0IGJlZW4gYWxsb2NhdGVkLCBvciB3YXMgYWxsb2NhdGVkCitieSB0aGUgdXNlciBhbmQgbm90IGJ5IGxpYnBuZywgIGFuZCB3aWxsIGluIHRob3NlCitjYXNlcyBkbyBub3RoaW5nLiAgVGhlICJzZXEiIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIG9ubHkgb25lIGl0ZW0KK29mIHRoZSBzZWxlY3RlZCBkYXRhIHR5cGUsIHN1Y2ggYXMgUExURSwgaXMgYWxsb3dlZC4gIElmICJzZXEiIGlzIG5vdAorLTEsIGFuZCBtdWx0aXBsZSBpdGVtcyBhcmUgYWxsb3dlZCBmb3IgdGhlIGRhdGEgdHlwZSBpZGVudGlmaWVkIGluCit0aGUgbWFzaywgc3VjaCBhcyB0ZXh0IG9yIHNQTFQsIG9ubHkgdGhlIG4ndGggaXRlbSBpbiB0aGUgc3RydWN0dXJlCitpcyBmcmVlZCwgd2hlcmUgbiBpcyAic2VxIi4KKworVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgb25seSB0byBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGludGVybmFsbHkKK2J5IGxpYnBuZy4gIFRoaXMgY2FuIGJlIGNoYW5nZWQsIHNvIHRoYXQgbGlicG5nIHdpbGwgbm90IGZyZWUgdGhlIGRhdGEsCitvciBzbyB0aGF0IGl0IHdpbGwgZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBieSB0aGUgdXNlciB3aXRoIHBuZ19tYWxsb2MoKQorb3IgcG5nX3phbGxvYygpIGFuZCBwYXNzZWQgaW4gdmlhIGEgcG5nX3NldF8qKCkgZnVuY3Rpb24sIHdpdGgKKworICAgIHBuZ19kYXRhX2ZyZWVyKHBuZ19wdHIsIGluZm9fcHRyLCBmcmVlciwgbWFzaykKKyAgICBtYXNrICAgLSB3aGljaCBkYXRhIGVsZW1lbnRzIGFyZSBhZmZlY3RlZAorICAgICAgICAgICAgIHNhbWUgY2hvaWNlcyBhcyBpbiBwbmdfZnJlZV9kYXRhKCkKKyAgICBmcmVlciAgLSBvbmUgb2YKKyAgICAgICAgICAgICAgIFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBCisgICAgICAgICAgICAgICBQTkdfU0VUX1dJTExfRlJFRV9EQVRBCisgICAgICAgICAgICAgICBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQQorCitUaGlzIGZ1bmN0aW9uIG9ubHkgYWZmZWN0cyBkYXRhIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCitZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciByZWFkaW5nIHRoZSBQTkcgZGF0YSBidXQgYmVmb3JlIGNhbGxpbmcKK2FueSBwbmdfc2V0XyooKSBmdW5jdGlvbnMsIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgdXNlciBvciB0aGUgcG5nX3NldF8qKCkKK2Z1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGFueSBleGlzdGluZyBkYXRhIHRoYXQgbWlnaHQgYmUgcHJlc2VudCwKK2FuZCBhZ2FpbiBhZnRlciB0aGUgcG5nX3NldF8qKCkgZnVuY3Rpb25zIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgdXNlcgorb3IgcG5nX2Rlc3Ryb3lfKigpIGlzIHN1cHBvc2VkIHRvIGZyZWUgdGhlIGRhdGEuICBXaGVuIHRoZSB1c2VyIGFzc3VtZXMKK3Jlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHVzZQorcG5nX2ZyZWUoKSB0byBmcmVlIGl0LCBhbmQgd2hlbiB0aGUgdXNlciB0cmFuc2ZlcnMgcmVzcG9uc2liaWxpdHkgdG8gbGlicG5nCitmb3IgZGF0YSB0aGF0IHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQsIHRoZSB1c2VyIG11c3QgaGF2ZSB1c2VkIHBuZ19tYWxsb2MoKQorb3IgcG5nX3phbGxvYygpIHRvIGFsbG9jYXRlIGl0LgorCitJZiB5b3UgYWxsb2NhdGVkIHlvdXIgcm93X3BvaW50ZXJzIGluIGEgc2luZ2xlIGJsb2NrLCBhcyBzdWdnZXN0ZWQgYWJvdmUgaW4KK3RoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaGlnaCBsZXZlbCByZWFkIGludGVyZmFjZSwgeW91IG11c3Qgbm90IHRyYW5zZmVyCityZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyBpdCB0byB0aGUgcG5nX3NldF9yb3dzIG9yIHBuZ19yZWFkX2Rlc3Ryb3kgZnVuY3Rpb24sCitiZWNhdXNlIHRoZXkgd291bGQgYWxzbyB0cnkgdG8gZnJlZSB0aGUgaW5kaXZpZHVhbCByb3dfcG9pbnRlcnNbaV0uCisKK0lmIHlvdSBhbGxvY2F0ZWQgdGV4dF9wdHIudGV4dCwgdGV4dF9wdHIubGFuZywgYW5kIHRleHRfcHRyLnRyYW5zbGF0ZWRfa2V5d29yZAorc2VwYXJhdGVseSwgZG8gbm90IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRleHRfcHRyIHRvIGxpYnBuZywKK2JlY2F1c2Ugd2hlbiBsaWJwbmcgZmlsbHMgYSBwbmdfdGV4dCBzdHJ1Y3R1cmUgaXQgY29tYmluZXMgdGhlc2UgbWVtYmVycyB3aXRoCit0aGUga2V5IG1lbWJlciwgYW5kIHBuZ19mcmVlX2RhdGEoKSB3aWxsIGZyZWUgb25seSB0ZXh0X3B0ci5rZXkuICBTaW1pbGFybHksCitpZiB5b3UgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWUnaW5nIHRleHRfcHRyIGZyb20gbGlicG5nIHRvIHlvdXIKK2FwcGxpY2F0aW9uLCB5b3VyIGFwcGxpY2F0aW9uIG11c3Qgbm90IHNlcGFyYXRlbHkgZnJlZSB0aG9zZSBtZW1iZXJzLgorCitUaGUgcG5nX2ZyZWVfZGF0YSgpIGZ1bmN0aW9uIHdpbGwgdHVybiBvZmYgdGhlICJ2YWxpZCIgZmxhZyBmb3IgYW55dGhpbmcKK2l0IGZyZWVzLiAgSWYgeW91IG5lZWQgdG8gdHVybiB0aGUgZmxhZyBvZmYgZm9yIGEgY2h1bmsgdGhhdCB3YXMgZnJlZWQgYnkgeW91cgorYXBwbGljYXRpb24gaW5zdGVhZCBvZiBieSBsaWJwbmcsIHlvdSBjYW4gdXNlCisKKyAgICBwbmdfc2V0X2ludmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIG1hc2spOworICAgIG1hc2sgLSBpZGVudGlmaWVzIHRoZSBjaHVua3MgdG8gYmUgbWFkZSBpbnZhbGlkLAorICAgICAgICAgICBjb250YWluaW5nIHRoZSBsb2dpY2FsIE9SIG9mIG9uZSBvcgorICAgICAgICAgICBtb3JlIG9mCisgICAgICAgICAgICAgUE5HX0lORk9fZ0FNQSwgUE5HX0lORk9fc0JJVCwKKyAgICAgICAgICAgICBQTkdfSU5GT19jSFJNLCBQTkdfSU5GT19QTFRFLAorICAgICAgICAgICAgIFBOR19JTkZPX3RSTlMsIFBOR19JTkZPX2JLR0QsCisgICAgICAgICAgICAgUE5HX0lORk9faElTVCwgUE5HX0lORk9fcEhZcywKKyAgICAgICAgICAgICBQTkdfSU5GT19vRkZzLCBQTkdfSU5GT190SU1FLAorICAgICAgICAgICAgIFBOR19JTkZPX3BDQUwsIFBOR19JTkZPX3NSR0IsCisgICAgICAgICAgICAgUE5HX0lORk9faUNDUCwgUE5HX0lORk9fc1BMVCwKKyAgICAgICAgICAgICBQTkdfSU5GT19zQ0FMLCBQTkdfSU5GT19JREFUCisKK0ZvciBhIG1vcmUgY29tcGFjdCBleGFtcGxlIG9mIHJlYWRpbmcgYSBQTkcgaW1hZ2UsIHNlZSB0aGUgZmlsZSBleGFtcGxlLmMuCisKK1JlYWRpbmcgUE5HIGZpbGVzIHByb2dyZXNzaXZlbHkKKworVGhlIHByb2dyZXNzaXZlIHJlYWRlciBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdGhlbiB0aGUgbm9uLXByb2dyZXNzaXZlCityZWFkZXIuICBJbnN0ZWFkIG9mIGNhbGxpbmcgcG5nX3JlYWRfaW5mbygpLCBwbmdfcmVhZF9yb3dzKCksIGFuZAorcG5nX3JlYWRfZW5kKCksIHlvdSBtYWtlIG9uZSBjYWxsIHRvIHBuZ19wcm9jZXNzX2RhdGEoKSwgd2hpY2ggY2FsbHMKK2NhbGxiYWNrcyB3aGVuIGl0IGhhcyB0aGUgaW5mbywgYSByb3csIG9yIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAgWW91CitzZXQgdXAgdGhlc2UgY2FsbGJhY2tzIHdpdGggcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkuICBZb3UgZG9uJ3QKK2hhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGlucHV0L291dHB1dCBmdW5jdGlvbnMgb2YgbGlicG5nLCBhcyB5b3UgYXJlCitnaXZpbmcgdGhlIGxpYnJhcnkgdGhlIGRhdGEgZGlyZWN0bHkgaW4gcG5nX3Byb2Nlc3NfZGF0YSgpLiAgSSB3aWxsCithc3N1bWUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBzZWN0aW9uIG9uIHJlYWRpbmcgUE5HIGZpbGVzIGFib3ZlLAorc28gSSB3aWxsIG9ubHkgaGlnaGxpZ2h0IHRoZSBkaWZmZXJlbmNlcyAoYWx0aG91Z2ggSSB3aWxsIHNob3cKK2FsbCBvZiB0aGUgY29kZSkuCisKK3BuZ19zdHJ1Y3RwIHBuZ19wdHI7CitwbmdfaW5mb3AgaW5mb19wdHI7CisKKyAvKiAgQW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50IG9mIGhvdyB5b3Ugd291bGQKKyAgICAgaW5pdGlhbGl6ZSB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGluIHlvdXIKKyAgICAgYXBwbGljYXRpb24uICovCisgaW50CisgaW5pdGlhbGl6ZV9wbmdfcmVhZGVyKCkKKyB7CisgICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QKKyAgICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKKyAgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7CisgICAgaWYgKCFwbmdfcHRyKQorICAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7CisgICAgaWYgKCFpbmZvX3B0cikKKyAgICB7CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAocG5nX2luZm9wcClOVUxMLAorICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKKyAgICB7CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCisgICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOworICAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKKyAgICAvKiBUaGlzIG9uZSdzIG5ldy4gIFlvdSBjYW4gcHJvdmlkZSBmdW5jdGlvbnMKKyAgICAgICB0byBiZSBjYWxsZWQgd2hlbiB0aGUgaGVhZGVyIGluZm8gaXMgdmFsaWQsCisgICAgICAgd2hlbiBlYWNoIHJvdyBpcyBjb21wbGV0ZWQsIGFuZCB3aGVuIHRoZSBpbWFnZQorICAgICAgIGlzIGZpbmlzaGVkLiAgSWYgeW91IGFyZW4ndCB1c2luZyBhbGwgZnVuY3Rpb25zLAorICAgICAgIHlvdSBjYW4gc3BlY2lmeSBOVUxMIHBhcmFtZXRlcnMuICBFdmVuIHdoZW4gYWxsCisgICAgICAgdGhyZWUgZnVuY3Rpb25zIGFyZSBOVUxMLCB5b3UgbmVlZCB0byBjYWxsCisgICAgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkuICBZb3UgY2FuIHVzZQorICAgICAgIGFueSBzdHJ1Y3QgYXMgdGhlIHVzZXJfcHRyIChjYXN0IHRvIGEgdm9pZCBwb2ludGVyCisgICAgICAgZm9yIHRoZSBmdW5jdGlvbiBjYWxsKSwgYW5kIHJldHJpZXZlIHRoZSBwb2ludGVyCisgICAgICAgZnJvbSBpbnNpZGUgdGhlIGNhbGxiYWNrcyB1c2luZyB0aGUgZnVuY3Rpb24KKworICAgICAgICAgIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpOworCisgICAgICAgd2hpY2ggd2lsbCByZXR1cm4gYSB2b2lkIHBvaW50ZXIsIHdoaWNoIHlvdSBoYXZlCisgICAgICAgdG8gY2FzdCBhcHByb3ByaWF0ZWx5LgorICAgICAqLworICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfcHRyLAorICAgICAgICBpbmZvX2NhbGxiYWNrLCByb3dfY2FsbGJhY2ssIGVuZF9jYWxsYmFjayk7CisKKyAgICByZXR1cm4gMDsKKyB9CisKKyAvKiBBIGNvZGUgZnJhZ21lbnQgdGhhdCB5b3UgY2FsbCBhcyB5b3UgcmVjZWl2ZSBibG9ja3MKKyAgIG9mIGRhdGEgKi8KKyBpbnQKKyBwcm9jZXNzX2RhdGEocG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQorIHsKKyAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQorICAgIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKKyAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7CisgICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKworICAgIC8qIFRoaXMgb25lJ3MgbmV3IGFsc28uICBTaW1wbHkgZ2l2ZSBpdCBhIGNodW5rCisgICAgICAgb2YgZGF0YSBmcm9tIHRoZSBmaWxlIHN0cmVhbSAoaW4gb3JkZXIsIG9mCisgICAgICAgY291cnNlKS4gIE9uIG1hY2hpbmVzIHdpdGggc2VnbWVudGVkIG1lbW9yeQorICAgICAgIG1vZGVscyBtYWNoaW5lcywgZG9uJ3QgZ2l2ZSBpdCBhbnkgbW9yZSB0aGFuCisgICAgICAgNjRLLiAgVGhlIGxpYnJhcnkgc2VlbXMgdG8gcnVuIGZpbmUgd2l0aCBzaXplcworICAgICAgIG9mIDRLLiBBbHRob3VnaCB5b3UgY2FuIGdpdmUgaXQgbXVjaCBsZXNzIGlmCisgICAgICAgbmVjZXNzYXJ5IChJIGFzc3VtZSB5b3UgY2FuIGdpdmUgaXQgY2h1bmtzIG9mCisgICAgICAgMSBieXRlLCBJIGhhdmVuJ3QgdHJpZWQgbGVzcyB0aGVuIDI1NiBieXRlcworICAgICAgIHlldCkuICBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgeW91IG1heQorICAgICAgIHdhbnQgdG8gZGlzcGxheSBhbnkgcm93cyB0aGF0IHdlcmUgZ2VuZXJhdGVkCisgICAgICAgaW4gdGhlIHJvdyBjYWxsYmFjayBpZiB5b3UgZG9uJ3QgYWxyZWFkeSBkbworICAgICAgIHNvIHRoZXJlLgorICAgICAqLworICAgIHBuZ19wcm9jZXNzX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICByZXR1cm4gMDsKKyB9CisKKyAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAoYXMgc2V0IGJ5CisgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkgYWJvdmUpIHdoZW4gZW5vdWdoIGRhdGEKKyAgICBoYXMgYmVlbiBzdXBwbGllZCBzbyBhbGwgb2YgdGhlIGhlYWRlciBoYXMgYmVlbgorICAgIHJlYWQuCisgKi8KKyB2b2lkCisgaW5mb19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKKyB7CisgICAgLyogRG8gYW55IHNldHVwIGhlcmUsIGluY2x1ZGluZyBzZXR0aW5nIGFueSBvZgorICAgICAgIHRoZSB0cmFuc2Zvcm1hdGlvbnMgbWVudGlvbmVkIGluIHRoZSBSZWFkaW5nCisgICAgICAgUE5HIGZpbGVzIHNlY3Rpb24uICBGb3Igbm93LCB5b3UgX211c3RfIGNhbGwKKyAgICAgICBlaXRoZXIgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBvcgorICAgICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgYWZ0ZXIgYWxsIHRoZQorICAgICAgIHRyYW5zZm9ybWF0aW9ucyBhcmUgc2V0IChldmVuIGlmIHlvdSBkb24ndCBzZXQKKyAgICAgICBhbnkpLiAgWW91IG1heSBzdGFydCBnZXR0aW5nIHJvd3MgYmVmb3JlCisgICAgICAgcG5nX3Byb2Nlc3NfZGF0YSgpIHJldHVybnMsIHNvIHRoaXMgaXMgeW91cgorICAgICAgIGxhc3QgY2hhbmNlIHRvIHByZXBhcmUgZm9yIHRoYXQuCisgICAgICovCisgfQorCisgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBlYWNoIHJvdyBvZiBpbWFnZQorICAgIGRhdGEgaXMgY29tcGxldGUgKi8KKyB2b2lkCisgcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAorICAgIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKQorIHsKKyAgICAvKiBJZiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCwgYW5kIHlvdSB0dXJuZWQKKyAgICAgICBvbiB0aGUgaW50ZXJsYWNlIGhhbmRsZXIsIHRoaXMgZnVuY3Rpb24gd2lsbAorICAgICAgIGJlIGNhbGxlZCBmb3IgZXZlcnkgcm93IGluIGV2ZXJ5IHBhc3MuICBTb21lCisgICAgICAgb2YgdGhlc2Ugcm93cyB3aWxsIG5vdCBiZSBjaGFuZ2VkIGZyb20gdGhlCisgICAgICAgcHJldmlvdXMgcGFzcy4gIFdoZW4gdGhlIHJvdyBpcyBub3QgY2hhbmdlZCwKKyAgICAgICB0aGUgbmV3X3JvdyB2YXJpYWJsZSB3aWxsIGJlIE5VTEwuICBUaGUgcm93cworICAgICAgIGFuZCBwYXNzZXMgYXJlIGNhbGxlZCBpbiBvcmRlciwgc28geW91IGRvbid0CisgICAgICAgcmVhbGx5IG5lZWQgdGhlIHJvd19udW0gYW5kIHBhc3MsIGJ1dCBJJ20KKyAgICAgICBzdXBwbHlpbmcgdGhlbSBiZWNhdXNlIGl0IG1heSBtYWtlIHlvdXIgbGlmZQorICAgICAgIGVhc2llci4KKworICAgICAgIEZvciB0aGUgbm9uLU5VTEwgcm93cyBvZiBpbnRlcmxhY2VkIGltYWdlcywKKyAgICAgICB5b3UgbXVzdCBjYWxsIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdygpCisgICAgICAgcGFzc2luZyBpbiB0aGUgcm93IGFuZCB0aGUgb2xkIHJvdy4gIFlvdSBjYW4KKyAgICAgICBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIE5VTEwgcm93cyAoaXQgd2lsbCBqdXN0CisgICAgICAgcmV0dXJuKSBhbmQgZm9yIG5vbi1pbnRlcmxhY2VkIGltYWdlcyAoaXQganVzdAorICAgICAgIGRvZXMgdGhlIG1lbWNweSBmb3IgeW91KSBpZiBpdCB3aWxsIG1ha2UgdGhlCisgICAgICAgY29kZSBlYXNpZXIuICBUaHVzLCB5b3UgY2FuIGp1c3QgZG8gdGhpcyBmb3IKKyAgICAgICBhbGwgY2FzZXM6CisgICAgICovCisKKyAgICAgICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csCisgICAgICAgICAgbmV3X3Jvdyk7CisKKyAgICAvKiB3aGVyZSBvbGRfcm93IGlzIHdoYXQgd2FzIGRpc3BsYXllZCBmb3IKKyAgICAgICBwcmV2aW91c2x5IGZvciB0aGUgcm93LiAgTm90ZSB0aGF0IHRoZSBmaXJzdAorICAgICAgIHBhc3MgKHBhc3MgPT0gMCwgcmVhbGx5KSB3aWxsIGNvbXBsZXRlbHkgY292ZXIKKyAgICAgICB0aGUgb2xkIHJvdywgc28gdGhlIHJvd3MgZG8gbm90IGhhdmUgdG8gYmUKKyAgICAgICBpbml0aWFsaXplZC4gIEFmdGVyIHRoZSBmaXJzdCBwYXNzIChhbmQgb25seQorICAgICAgIGZvciBpbnRlcmxhY2VkIGltYWdlcyksIHlvdSB3aWxsIGhhdmUgdG8gcGFzcworICAgICAgIHRoZSBjdXJyZW50IHJvdywgYW5kIHRoZSBmdW5jdGlvbiB3aWxsIGNvbWJpbmUKKyAgICAgICB0aGUgb2xkIHJvdyBhbmQgdGhlIG5ldyByb3cuCisgICAgKi8KKyB9CisKKyB2b2lkCisgZW5kX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvKQorIHsKKyAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgd2hvbGUgaW1hZ2UKKyAgICAgICBoYXMgYmVlbiByZWFkLCBpbmNsdWRpbmcgYW55IGNodW5rcyBhZnRlciB0aGUKKyAgICAgICBpbWFnZSAodXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgSUVORCkuICBZb3UKKyAgICAgICB3aWxsIHVzdWFsbHkgaGF2ZSB0aGUgc2FtZSBpbmZvIGNodW5rIGFzIHlvdQorICAgICAgIGhhZCBpbiB0aGUgaGVhZGVyLCBhbHRob3VnaCBzb21lIGRhdGEgbWF5IGhhdmUKKyAgICAgICBiZWVuIGFkZGVkIHRvIHRoZSBjb21tZW50cyBhbmQgdGltZSBmaWVsZHMuCisKKyAgICAgICBNb3N0IHBlb3BsZSB3b24ndCBkbyBtdWNoIGhlcmUsIHBlcmhhcHMgc2V0dGluZworICAgICAgIGEgZmxhZyB0aGF0IG1hcmtzIHRoZSBpbWFnZSBhcyBmaW5pc2hlZC4KKyAgICAgKi8KKyB9CisKKworCitJVi4gV3JpdGluZworCitNdWNoIG9mIHRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHJlYWRpbmcuICBIb3dldmVyLCBldmVyeXRoaW5nIG9mCitpbXBvcnRhbmNlIGlzIHJlcGVhdGVkIGhlcmUsIHNvIHlvdSB3b24ndCBoYXZlIHRvIGNvbnN0YW50bHkgbG9vaworYmFjayB1cCBpbiB0aGUgcmVhZGluZyBzZWN0aW9uIHRvIHVuZGVyc3RhbmQgd3JpdGluZy4KKworU2V0dXAKKworWW91IHdpbGwgd2FudCB0byBkbyB0aGUgSS9PIGluaXRpYWxpemF0aW9uIGJlZm9yZSB5b3UgZ2V0IGludG8gbGlicG5nLAorc28gaWYgaXQgZG9lc24ndCB3b3JrLCB5b3UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byB1bmRvLiBJZiB5b3UgYXJlIG5vdAordXNpbmcgdGhlIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQgdG8gcmVwbGFjZSB0aGVtIHdpdGgKK2N1c3RvbSB3cml0aW5nIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZGlzY3Vzc2lvbiB1bmRlciBDdXN0b21pemluZyBsaWJwbmcuCisKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgIndiIik7CisgICAgaWYgKCFmcCkKKyAgICB7CisgICAgICAgcmV0dXJuIChFUlJPUik7CisgICAgfQorCitOZXh0LCBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuCitBcyB0aGVzZSBjYW4gYmUgYm90aCByZWxhdGl2ZWx5IGxhcmdlLCB5b3UgbWF5IG5vdCB3YW50IHRvIHN0b3JlIHRoZXNlCitvbiB0aGUgc3RhY2ssIHVubGVzcyB5b3UgaGF2ZSBzdGFjayBzcGFjZSB0byBzcGFyZS4gIE9mIGNvdXJzZSwgeW91Cit3aWxsIHdhbnQgdG8gY2hlY2sgaWYgdGhleSByZXR1cm4gTlVMTC4gIElmIHlvdSBhcmUgYWxzbyByZWFkaW5nLAoreW91IHdvbid0IHdhbnQgdG8gbmFtZSB5b3VyIHJlYWQgc3RydWN0dXJlIGFuZCB5b3VyIHdyaXRlIHN0cnVjdHVyZQorYm90aCAicG5nX3B0ciI7IHlvdSBjYW4gY2FsbCB0aGVtIGFueXRoaW5nIHlvdSBsaWtlLCBzdWNoIGFzCisicmVhZF9wdHIiIGFuZCAid3JpdGVfcHRyIi4gIExvb2sgYXQgcG5ndGVzdC5jLCBmb3IgZXhhbXBsZS4KKworICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdAorICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCisgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7CisgICAgaWYgKCFwbmdfcHRyKQorICAgICAgIHJldHVybiAoRVJST1IpOworCisgICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKKyAgICBpZiAoIWluZm9fcHRyKQorICAgIHsKKyAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsCisgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKKyAgICAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9CisKK0lmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKK2RlZmluZSBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEIGFuZCB1c2UKK3BuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSBpbnN0ZWFkIG9mIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCk6CisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMgorICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCisgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKKyAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKKworQWZ0ZXIgeW91IGhhdmUgdGhlc2Ugc3RydWN0dXJlcywgeW91IHdpbGwgbmVlZCB0byBzZXQgdXAgdGhlCitlcnJvciBoYW5kbGluZy4gIFdoZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8KK2xvbmdqbXAoKSBiYWNrIHRvIHlvdXIgcm91dGluZS4gIFRoZXJlZm9yZSwgeW91IHdpbGwgbmVlZCB0byBjYWxsCitzZXRqbXAoKSBhbmQgcGFzcyB0aGUgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdQord3JpdGUgdGhlIGZpbGUgZnJvbSBkaWZmZXJlbnQgcm91dGluZXMsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlCit0aGUgcG5nX2ptcGJ1ZihwbmdfcHRyKSBldmVyeSB0aW1lIHlvdSBlbnRlciBhIG5ldyByb3V0aW5lIHRoYXQgd2lsbAorY2FsbCBhIHBuZ18qKCkgZnVuY3Rpb24uICBTZWUgeW91ciBkb2N1bWVudGF0aW9uIG9mIHNldGptcC9sb25nam1wCitmb3IgeW91ciBjb21waWxlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzZXRqbXAvbG9uZ2ptcC4gIFNlZQordGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yIGhhbmRsaW5nIGluIHRoZSBDdXN0b21pemluZyBMaWJwbmcKK3NlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGxpYnBuZyBlcnJvciBoYW5kbGluZy4KKworICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCisgICAgeworICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKyAgICAgICBmY2xvc2UoZnApOworICAgICAgIHJldHVybiAoRVJST1IpOworICAgIH0KKyAgICAuLi4KKyAgICByZXR1cm47CisKK0lmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoreW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCwgaW4gd2hpY2ggY2FzZQorZXJyb3JzIHdpbGwgcmVzdWx0IGluIGEgY2FsbCB0byBQTkdfQUJPUlQoKSB3aGljaCBkZWZhdWx0cyB0byBhYm9ydCgpLgorCitOb3cgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBvdXRwdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KK3VzZSB0aGUgQyBmdW5jdGlvbiBmd3JpdGUoKS4gIElmIHlvdSB1c2UgdGhpcywgeW91IHdpbGwgbmVlZCB0byBwYXNzIGEKK3ZhbGlkIEZJTEUgKiBpbiB0aGUgZnVuY3Rpb24gcG5nX2luaXRfaW8oKS4gIEJlIHN1cmUgdGhhdCB0aGUgZmlsZSBpcworb3BlbmVkIGluIGJpbmFyeSBtb2RlLiAgQWdhaW4sIGlmIHlvdSB3aXNoIHRvIGhhbmRsZSB3cml0aW5nIGRhdGEgaW4KK2Fub3RoZXIgd2F5LCBzZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIEkvTyBoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcKK0xpYnBuZyBzZWN0aW9uIGJlbG93LgorCisgICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOworCitXcml0ZSBjYWxsYmFja3MKKworQXQgdGhpcyBwb2ludCwgeW91IGNhbiBzZXQgdXAgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUKK2NhbGxlZCBhZnRlciBlYWNoIHJvdyBoYXMgYmVlbiB3cml0dGVuLCB3aGljaCB5b3UgY2FuIHVzZSB0byBjb250cm9sCithIHByb2dyZXNzIG1ldGVyIG9yIHRoZSBsaWtlLiAgSXQncyBkZW1vbnN0cmF0ZWQgaW4gcG5ndGVzdC5jLgorWW91IG11c3Qgc3VwcGx5IGEgZnVuY3Rpb24KKworICAgIHZvaWQgd3JpdGVfcm93X2NhbGxiYWNrKHBuZ19wdHIsIHBuZ191aW50XzMyIHJvdywKKyAgICAgICBpbnQgcGFzcyk7CisgICAgeworICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlICovCisgICAgfQorCisoWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YgIndyaXRlX3Jvd19jYWxsYmFjayIpCisKK1RvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCisKKyAgICBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbihwbmdfcHRyLCB3cml0ZV9yb3dfY2FsbGJhY2spOworCitZb3Ugbm93IGhhdmUgdGhlIG9wdGlvbiBvZiBtb2RpZnlpbmcgaG93IHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwKK3J1bi4gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCBtYXkgYmUgdXNlZnVsCitpbiBzb21lIGNhc2VzLCBsaWtlIGlmIHlvdSBuZWVkIHRvIHdyaXRlIFBORyBmaWxlcyBleHRyZW1lbHkgZmFzdCBhbmQKK2FyZSB3aWxsaW5nIHRvIGdpdmUgdXAgc29tZSBjb21wcmVzc2lvbiwgb3IgaWYgeW91IHdhbnQgdG8gZ2V0IHRoZQorbWF4aW11bSBwb3NzaWJsZSBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBzbG93ZXIgd3JpdGluZy4gIElmIHlvdQoraGF2ZSBubyBzcGVjaWFsIG5lZWRzIGluIHRoaXMgYXJlYSwgbGV0IHRoZSBsaWJyYXJ5IGRvIHdoYXQgaXQgd2FudHMgYnkKK25vdCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYXQgYWxsLCBhcyBpdCBoYXMgYmVlbiB0dW5lZCB0byBkZWxpdmVyIGEgZ29vZAorc3BlZWQvY29tcHJlc3Npb24gcmF0aW8uIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHBuZ19zZXRfZmlsdGVyKCkgaXMKK3RoZSBmaWx0ZXIgbWV0aG9kLCBmb3Igd2hpY2ggdGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZSAwIChhcyBvZiB0aGUKK0p1bHkgMTk5OSBQTkcgc3BlY2lmaWNhdGlvbiwgdmVyc2lvbiAxLjIpIG9yIDY0IChpZiB5b3UgYXJlIHdyaXRpbmcKK2EgUE5HIGRhdGFzdHJlYW0gdGhhdCBpcyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORyBkYXRhc3RyZWFtKS4gIFRoZSB0aGlyZAorcGFyYW1ldGVyIGlzIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGljaCBmaWx0ZXIgdHlwZShzKSBhcmUgdG8gYmUgdGVzdGVkCitmb3IgZWFjaCBzY2FubGluZS4gIFNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIHNwZWNpZmljIGZpbHRlcgordHlwZXMuCisKKworICAgIC8qIHR1cm4gb24gb3Igb2ZmIGZpbHRlcmluZywgYW5kL29yIGNob29zZQorICAgICAgIHNwZWNpZmljIGZpbHRlcnMuICBZb3UgY2FuIHVzZSBlaXRoZXIgYSBzaW5nbGUKKyAgICAgICBQTkdfRklMVEVSX1ZBTFVFX05BTUUgb3IgdGhlIGxvZ2ljYWwgT1Igb2Ygb25lCisgICAgICAgb3IgbW9yZSBQTkdfRklMVEVSX05BTUUgbWFza3MuICovCisgICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgMCwKKyAgICAgICBQTkdfRklMVEVSX05PTkUgIHwgUE5HX0ZJTFRFUl9WQUxVRV9OT05FIHwKKyAgICAgICBQTkdfRklMVEVSX1NVQiAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9TVUIgIHwKKyAgICAgICBQTkdfRklMVEVSX1VQICAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9VUCAgIHwKKyAgICAgICBQTkdfRklMVEVSX0FWRSAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9BVkUgIHwKKyAgICAgICBQTkdfRklMVEVSX1BBRVRIIHwgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSHwKKyAgICAgICBQTkdfQUxMX0ZJTFRFUlMpOworCitJZiBhbiBhcHBsaWNhdGlvbgord2FudHMgdG8gc3RhcnQgYW5kIHN0b3AgdXNpbmcgcGFydGljdWxhciBmaWx0ZXJzIGR1cmluZyBjb21wcmVzc2lvbiwKK2l0IHNob3VsZCBzdGFydCBvdXQgd2l0aCBhbGwgb2YgdGhlIGZpbHRlcnMgKHRvIGVuc3VyZSB0aGF0IHRoZSBwcmV2aW91cworcm93IG9mIHBpeGVscyB3aWxsIGJlIHN0b3JlZCBpbiBjYXNlIGl0J3MgbmVlZGVkIGxhdGVyKSwgYW5kIHRoZW4gYWRkCithbmQgcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhlIHN0YXJ0IG9mIGNvbXByZXNzaW9uLgorCitJZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgZGF0YXN0cmVhbSB0aGF0IGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HCitkYXRhc3RyZWFtLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gYmUgZWl0aGVyIDAgb3IgNjQuCisKK1RoZSBwbmdfc2V0X2NvbXByZXNzaW9uXyooKSBmdW5jdGlvbnMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGNvbXByZXNzaW9uCitsaWJyYXJ5LCBhbmQgc2hvdWxkIG1vc3RseSBiZSBpZ25vcmVkIHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlCitkb2luZy4gIFRoZSBvbmx5IGdlbmVyYWxseSB1c2VmdWwgY2FsbCBpcyBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKCkKK3doaWNoIGNoYW5nZXMgaG93IG11Y2ggdGltZSB6bGliIHNwZW5kcyBvbiB0cnlpbmcgdG8gY29tcHJlc3MgdGhlIGltYWdlCitkYXRhLiAgU2VlIHRoZSBDb21wcmVzc2lvbiBMaWJyYXJ5ICh6bGliLmggYW5kIGFsZ29yaXRobS50eHQsIGRpc3RyaWJ1dGVkCit3aXRoIHpsaWIpIGZvciBkZXRhaWxzIG9uIHRoZSBjb21wcmVzc2lvbiBsZXZlbHMuCisKKyAgICAvKiBzZXQgdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgKi8KKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsCisgICAgICAgIFpfQkVTVF9DT01QUkVTU0lPTik7CisKKyAgICAvKiBzZXQgb3RoZXIgemxpYiBwYXJhbWV0ZXJzICovCisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgOCk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAorICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwgMTUpOworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIDgpOworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgODE5MikKKworZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3pidWZfc2l6ZSkKKworU2V0dGluZyB0aGUgY29udGVudHMgb2YgaW5mbyBmb3Igb3V0cHV0CisKK1lvdSBub3cgbmVlZCB0byBmaWxsIGluIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBhbGwgdGhlIGRhdGEgeW91Cit3aXNoIHRvIHdyaXRlIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBvbmx5IHRoaW5nIHlvdQorYXJlIGFsbG93ZWQgdG8gd3JpdGUgYWZ0ZXIgdGhlIGltYWdlIGlzIHRoZSB0ZXh0IGNodW5rcyBhbmQgdGhlIHRpbWUKK2NodW5rIChhcyBvZiBQTkcgU3BlY2lmaWNhdGlvbiAxLjIsIGFueXdheSkuICBTZWUgcG5nX3dyaXRlX2VuZCgpIGFuZAordGhlIGxhdGVzdCBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGF0LiAgSWYgeW91Cit3aXNoIHRvIHdyaXRlIHRoZW0gYmVmb3JlIHRoZSBpbWFnZSwgZmlsbCB0aGVtIGluIG5vdywgYW5kIGZsYWcgdGhhdAorZGF0YSBhcyBiZWluZyB2YWxpZC4gIElmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRhdGEsIGRvbid0CitmaWxsIHRoZW0gdW50aWwgcG5nX3dyaXRlX2VuZCgpLiAgRm9yIGFsbCB0aGUgZmllbGRzIGluIHBuZ19pbmZvIGFuZAordGhlaXIgZGF0YSB0eXBlcywgc2VlIHBuZy5oLiAgRm9yIGV4cGxhbmF0aW9ucyBvZiB3aGF0IHRoZSBmaWVsZHMKK2NvbnRhaW4sIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24uCisKK1NvbWUgb2YgdGhlIG1vcmUgaW1wb3J0YW50IHBhcnRzIG9mIHRoZSBwbmdfaW5mbyBhcmU6CisKKyAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKKyAgICAgICBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfbWV0aG9kKQorICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KKyAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCisgICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgorICAgIGJpdF9kZXB0aCAgICAgIC0gaG9sZHMgdGhlIGJpdCBkZXB0aCBvZiBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICBpbWFnZSBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICh2YWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2CisgICAgICAgICAgICAgICAgICAgICBhbmQgZGVwZW5kIGFsc28gb24gdGhlCisgICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlLiAgU2VlIGFsc28gc2lnbmlmaWNhbnQKKyAgICAgICAgICAgICAgICAgICAgIGJpdHMgKHNCSVQpIGJlbG93KS4KKyAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYQorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXJlIHByZXNlbnQuCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCisgICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKKyAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgorICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQorCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgorICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKKworICAgIGludGVybGFjZV90eXBlIC0gUE5HX0lOVEVSTEFDRV9OT05FIG9yCisgICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03CisgICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUKQorICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQKKyAgICAgICAgICAgICAgICAgICAgIG9yLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgdG8KKyAgICAgICAgICAgICAgICAgICAgIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZQorICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKQorCisgICAgcG5nX3NldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwYWxldHRlLAorICAgICAgIG51bV9wYWxldHRlKTsKKyAgICBwYWxldHRlICAgICAgICAtIHRoZSBwYWxldHRlIGZvciB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgKGFycmF5IG9mIHBuZ19jb2xvcikKKyAgICBudW1fcGFsZXR0ZSAgICAtIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwYWxldHRlCisKKyAgICBwbmdfc2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIGdhbW1hKTsKKyAgICBnYW1tYSAgICAgICAgICAtIHRoZSBnYW1tYSB0aGUgaW1hZ2Ugd2FzIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgIGF0IChQTkdfSU5GT19nQU1BKQorCisgICAgcG5nX3NldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCBzcmdiX2ludGVudCk7CisgICAgc3JnYl9pbnRlbnQgICAgLSB0aGUgcmVuZGVyaW5nIGludGVudAorICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NSR0IpIFRoZSBwcmVzZW5jZSBvZgorICAgICAgICAgICAgICAgICAgICAgdGhlIHNSR0IgY2h1bmsgbWVhbnMgdGhhdCB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgaW4gdGhlIHNSR0IgY29sb3Igc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICBUaGlzIGNodW5rIGFsc28gaW1wbGllcyBzcGVjaWZpYworICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIG9mIGdBTUEgYW5kIGNIUk0uICBSZW5kZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgIGludGVudCBpcyB0aGUgQ1NTLTEgcHJvcGVydHkgdGhhdAorICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gZGVmaW5lZCBieSB0aGUgSW50ZXJuYXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgQ29sb3IgQ29uc29ydGl1bQorICAgICAgICAgICAgICAgICAgICAgKGh0dHA6Ly93d3cuY29sb3Iub3JnKS4KKyAgICAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBvbmUgb2YKKyAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9TQVRVUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1BFUkNFUFRVQUwsCisgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfQUJTT0xVVEUsIG9yCisgICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfUkVMQVRJVkUuCisKKworICAgIHBuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgIHNyZ2JfaW50ZW50KTsKKyAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50CisgICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc1JHQikgVGhlIHByZXNlbmNlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgc1JHQiBjaHVuayBtZWFucyB0aGF0IHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBjYXVzZXMgZ0FNQSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIGNIUk0gY2h1bmtzIHdpdGggdGhlIHNwZWNpZmljIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgdGhhdCBhcmUgY29uc2lzdGVudCB3aXRoIHNSR0IgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4uCisKKyAgICBwbmdfc2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIG5hbWUsIGNvbXByZXNzaW9uX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSwgcHJvZmxlbik7CisgICAgbmFtZSAgICAgICAgICAgIC0gVGhlIHByb2ZpbGUgbmFtZS4KKyAgICBjb21wcmVzc2lvbiAgICAgLSBUaGUgY29tcHJlc3Npb24gdHlwZTsgYWx3YXlzCisgICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSBmb3IgUE5HIDEuMC4KKyAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGdpdmUgTlVMTCB0byB0aGlzIGFyZ3VtZW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgaWdub3JlIGl0LgorICAgIHByb2ZpbGUgICAgICAgICAtIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBjb2xvcgorICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgZGF0YS4gTWF5IGNvbnRhaW4gTlVMcy4KKyAgICBwcm9mbGVuICAgICAgICAgLSBsZW5ndGggb2YgcHJvZmlsZSBkYXRhIGluIGJ5dGVzLgorCisgICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCBzaWdfYml0KTsKKyAgICBzaWdfYml0ICAgICAgICAtIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBmb3IKKyAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zQklUKSBlYWNoIG9mIHRoZSBncmF5LCByZWQsCisgICAgICAgICAgICAgICAgICAgICBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMsIHdoaWNoZXZlciBhcmUKKyAgICAgICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gY29sb3IgdHlwZQorICAgICAgICAgICAgICAgICAgICAgKHBuZ19jb2xvcl8xNikKKworICAgIHBuZ19zZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgdHJhbnMsIG51bV90cmFucywKKyAgICAgICB0cmFuc192YWx1ZXMpOworICAgIHRyYW5zICAgICAgICAgIC0gYXJyYXkgb2YgdHJhbnNwYXJlbnQgZW50cmllcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgKFBOR19JTkZPX3RSTlMpCisgICAgdHJhbnNfdmFsdWVzICAgLSBncmF5bGV2ZWwgb3IgY29sb3Igc2FtcGxlIHZhbHVlcyBvZgorICAgICAgICAgICAgICAgICAgICAgdGhlIHNpbmdsZSB0cmFuc3BhcmVudCBjb2xvciBmb3IKKyAgICAgICAgICAgICAgICAgICAgIG5vbi1wYWxldHRlZCBpbWFnZXMgKFBOR19JTkZPX3RSTlMpCisgICAgbnVtX3RyYW5zICAgICAgLSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3RSTlMpCisKKyAgICBwbmdfc2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIGhpc3QpOworICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9faElTVCkKKyAgICBoaXN0ICAgICAgICAgICAtIGhpc3RvZ3JhbSBvZiBwYWxldHRlIChhcnJheSBvZgorICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYpCisKKyAgICBwbmdfc2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsIG1vZF90aW1lKTsKKyAgICBtb2RfdGltZSAgICAgICAtIHRpbWUgaW1hZ2Ugd2FzIGxhc3QgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgIChQTkdfVkFMSURfdElNRSkKKworICAgIHBuZ19zZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgYmFja2dyb3VuZCk7CisgICAgYmFja2dyb3VuZCAgICAgLSBiYWNrZ3JvdW5kIGNvbG9yIChQTkdfVkFMSURfYktHRCkKKworICAgIHBuZ19zZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIG51bV90ZXh0KTsKKyAgICB0ZXh0X3B0ciAgICAgICAtIGFycmF5IG9mIHBuZ190ZXh0IGhvbGRpbmcgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzCisgICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gLSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKKyAgICAgICAgICAgICAgICAgb24gInRleHQiIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQKKyAgICB0ZXh0X3B0cltpXS5rZXkgICAtIGtleXdvcmQgZm9yIGNvbW1lbnQuICBNdXN0IGNvbnRhaW4KKyAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgorICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgTlVMTCBvciBlbXB0eS4KKyAgICB0ZXh0X3B0cltpXS50ZXh0X2xlbmd0aCAtIGxlbmd0aCBvZiB0ZXh0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgaVRYdAorICAgIHRleHRfcHRyW2ldLml0eHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIGl0eHQgc3RyaW5nLAorICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciB0RVh0L3pUWHQKKyAgICB0ZXh0X3B0cltpXS5sYW5nICAtIGxhbmd1YWdlIG9mIGNvbW1lbnQgKE5VTEwgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBmb3IgdW5rbm93bikuCisgICAgdGV4dF9wdHJbaV0udHJhbnNsYXRlZF9rZXl3b3JkICAtIGtleXdvcmQgaW4gVVRGLTggKE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvciBlbXB0eSBmb3IgdW5rbm93bikuCisgICAgbnVtX3RleHQgICAgICAgLSBudW1iZXIgb2YgY29tbWVudHMKKworICAgIHBuZ19zZXRfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGVfcHRyLAorICAgICAgIG51bV9zcGFsZXR0ZXMpOworICAgIHBhbGV0dGVfcHRyICAgIC0gYXJyYXkgb2YgcG5nX3NQTFRfc3RydWN0IHN0cnVjdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHBhbGV0dGVzCisgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCisgICAgbnVtX3NwYWxldHRlcyAgLSBudW1iZXIgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICBhZGRlZC4KKworICAgIHBuZ19zZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgb2Zmc2V0X3gsIG9mZnNldF95LAorICAgICAgICB1bml0X3R5cGUpOworICAgIG9mZnNldF94ICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSBsZWZ0CisgICAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4KKyAgICBvZmZzZXRfeSAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgdG9wCisgICAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4KKyAgICB1bml0X3R5cGUgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKKworICAgIHBuZ19zZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgcmVzX3gsIHJlc195LAorICAgICAgICB1bml0X3R5cGUpOworICAgIHJlc194ICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbgorICAgICAgICAgICAgICAgICAgaW4geCBkaXJlY3Rpb24KKyAgICByZXNfeSAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24KKyAgICAgICAgICAgICAgICAgIGluIHkgZGlyZWN0aW9uCisgICAgdW5pdF90eXBlICAgLSBQTkdfUkVTT0xVVElPTl9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgUE5HX1JFU09MVVRJT05fTUVURVIKKworICAgIHBuZ19zZXRfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgd2lkdGgsIGhlaWdodCkKKyAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQorICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cworICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQorCisgICAgcG5nX3NldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsIHVuaXQsIHdpZHRoLCBoZWlnaHQpCisgICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKKyAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKKyAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCisgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBzdHJpbmdzIGxpa2UgIjIuNTQiKQorCisgICAgcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnVua25vd25zLAorICAgICAgIG51bV91bmtub3ducykKKyAgICB1bmtub3ducyAgICAgICAgICAtIGFycmF5IG9mIHBuZ191bmtub3duX2NodW5rCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGhvbGRpbmcgdW5rbm93biBjaHVua3MKKyAgICB1bmtub3duc1tpXS5uYW1lICAtIG5hbWUgb2YgdW5rbm93biBjaHVuaworICAgIHVua25vd25zW2ldLmRhdGEgIC0gZGF0YSBvZiB1bmtub3duIGNodW5rCisgICAgdW5rbm93bnNbaV0uc2l6ZSAgLSBzaXplIG9mIHVua25vd24gY2h1bmsncyBkYXRhCisgICAgdW5rbm93bnNbaV0ubG9jYXRpb24gLSBwb3NpdGlvbiB0byB3cml0ZSBjaHVuayBpbiBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBkbyBub3Qgd3JpdGUgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19IQVZFX0lIRFI6IGJlZm9yZSBQTFRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSEFWRV9QTFRFOiBiZWZvcmUgSURBVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0FGVEVSX0lEQVQ6IGFmdGVyIElEQVQKKworVGhlICJsb2NhdGlvbiIgbWVtYmVyIGlzIHNldCBhdXRvbWF0aWNhbGx5IGFjY29yZGluZyB0bword2hhdCBwYXJ0IG9mIHRoZSBvdXRwdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCitZb3UgY2FuIGNoYW5nZSBpdHMgdmFsdWUgYWZ0ZXIgY2FsbGluZyBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkKK2FzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuICBXaXRoaW4gZWFjaCBvZiB0aGUgImxvY2F0aW9ucyIsCit0aGUgY2h1bmtzIGFyZSBzZXF1ZW5jZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBvc2l0aW9uIGluIHRoZQorc3RydWN0dXJlICh0aGF0IGlzLCB0aGUgdmFsdWUgb2YgImkiLCB3aGljaCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKK3RoZSBjaHVuayB3YXMgZWl0aGVyIHJlYWQgZnJvbSB0aGUgaW5wdXQgZmlsZSBvciBkZWZpbmVkIHdpdGgKK3BuZ19zZXRfdW5rbm93bl9jaHVua3MpLgorCitBIHF1aWNrIHdvcmQgYWJvdXQgdGV4dCBhbmQgbnVtX3RleHQuICB0ZXh0IGlzIGFuIGFycmF5IG9mIHBuZ190ZXh0CitzdHJ1Y3R1cmVzLiAgbnVtX3RleHQgaXMgdGhlIG51bWJlciBvZiB2YWxpZCBzdHJ1Y3R1cmVzIGluIHRoZSBhcnJheS4KK0VhY2ggcG5nX3RleHQgc3RydWN0dXJlIGhvbGRzIGEgbGFuZ3VhZ2UgY29kZSwgYSBrZXl3b3JkLCBhIHRleHQgdmFsdWUsCithbmQgYSBjb21wcmVzc2lvbiB0eXBlLgorCitUaGUgY29tcHJlc3Npb24gdHlwZXMgaGF2ZSB0aGUgc2FtZSB2YWxpZCBudW1iZXJzIGFzIHRoZSBjb21wcmVzc2lvbgordHlwZXMgb2YgdGhlIGltYWdlIGRhdGEuICBDdXJyZW50bHksIHRoZSBvbmx5IHZhbGlkIG51bWJlciBpcyB6ZXJvLgorSG93ZXZlciwgeW91IGNhbiBzdG9yZSB0ZXh0IGVpdGhlciBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCwgdW5saWtlCitpbWFnZXMsIHdoaWNoIGFsd2F5cyBoYXZlIHRvIGJlIGNvbXByZXNzZWQuICBTbyBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUKK3RleHQgY29tcHJlc3NlZCwgc2V0IHRoZSBjb21wcmVzc2lvbiB0eXBlIHRvIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUuCitCZWNhdXNlIHRFWHQgYW5kIHpUWHQgY2h1bmtzIGRvbid0IGhhdmUgYSBsYW5ndWFnZSBmaWVsZCwgaWYgeW91CitzcGVjaWZ5IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgb3IgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAorYW55IGxhbmd1YWdlIGNvZGUgb3IgdHJhbnNsYXRlZCBrZXl3b3JkIHdpbGwgbm90IGJlIHdyaXR0ZW4gb3V0LgorCitVbnRpbCB0ZXh0IGdldHMgYXJvdW5kIDEwMDAgYnl0ZXMsIGl0IGlzIG5vdCB3b3J0aCBjb21wcmVzc2luZyBpdC4KK0FmdGVyIHRoZSB0ZXh0IGhhcyBiZWVuIHdyaXR0ZW4gb3V0IHRvIHRoZSBmaWxlLCB0aGUgY29tcHJlc3Npb24gdHlwZQoraXMgc2V0IHRvIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1Igb3IgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiwKK3NvIHRoYXQgaXQgaXNuJ3Qgd3JpdHRlbiBvdXQgYWdhaW4gYXQgdGhlIGVuZCAoaW4gY2FzZSB5b3UgYXJlIGNhbGxpbmcKK3BuZ193cml0ZV9lbmQoKSB3aXRoIHRoZSBzYW1lIHN0cnVjdC4KKworVGhlIGtleXdvcmRzIHRoYXQgYXJlIGdpdmVuIGluIHRoZSBQTkcgU3BlY2lmaWNhdGlvbiBhcmU6CisKKyAgICBUaXRsZSAgICAgICAgICAgIFNob3J0IChvbmUgbGluZSkgdGl0bGUgb3IKKyAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gZm9yIGltYWdlCisgICAgQXV0aG9yICAgICAgICAgICBOYW1lIG9mIGltYWdlJ3MgY3JlYXRvcgorICAgIERlc2NyaXB0aW9uICAgICAgRGVzY3JpcHRpb24gb2YgaW1hZ2UgKHBvc3NpYmx5IGxvbmcpCisgICAgQ29weXJpZ2h0ICAgICAgICBDb3B5cmlnaHQgbm90aWNlCisgICAgQ3JlYXRpb24gVGltZSAgICBUaW1lIG9mIG9yaWdpbmFsIGltYWdlIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAodXN1YWxseSBSRkMgMTEyMyBmb3JtYXQsIHNlZSBiZWxvdykKKyAgICBTb2Z0d2FyZSAgICAgICAgIFNvZnR3YXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQorICAgIERpc2NsYWltZXIgICAgICAgTGVnYWwgZGlzY2xhaW1lcgorICAgIFdhcm5pbmcgICAgICAgICAgV2FybmluZyBvZiBuYXR1cmUgb2YgY29udGVudAorICAgIFNvdXJjZSAgICAgICAgICAgRGV2aWNlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQorICAgIENvbW1lbnQgICAgICAgICAgTWlzY2VsbGFuZW91cyBjb21tZW50OyBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICBmcm9tIG90aGVyIGltYWdlIGZvcm1hdAorCitUaGUga2V5d29yZC10ZXh0IHBhaXJzIHdvcmsgbGlrZSB0aGlzLiAgS2V5d29yZHMgc2hvdWxkIGJlIHNob3J0CitzaW1wbGUgZGVzY3JpcHRpb25zIG9mIHdoYXQgdGhlIGNvbW1lbnQgaXMgYWJvdXQuICBTb21lIHR5cGljYWwKK2tleXdvcmRzIGFyZSBmb3VuZCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24sIGFzIGlzIHNvbWUgcmVjb21tZW5kYXRpb25zCitvbiBrZXl3b3Jkcy4gIFlvdSBjYW4gcmVwZWF0IGtleXdvcmRzIGluIGEgZmlsZS4gIFlvdSBjYW4gZXZlbiB3cml0ZQorc29tZSB0ZXh0IGJlZm9yZSB0aGUgaW1hZ2UgYW5kIHNvbWUgYWZ0ZXIuICBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50Cit0byBwdXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW1hZ2UgYmVmb3JlIHRoZSBpbWFnZSwgYnV0IGxlYXZlIHRoZQorZGlzY2xhaW1lciB1bnRpbCBhZnRlciwgc28gdmlld2VycyB3b3JraW5nIG92ZXIgbW9kZW0gY29ubmVjdGlvbnMKK2Rvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIGRpc2NsYWltZXIgdG8gZ28gb3ZlciB0aGUgbW9kZW0gYmVmb3JlCit0aGV5IHN0YXJ0IHNlZWluZyB0aGUgaW1hZ2UuICBGaW5hbGx5LCBrZXl3b3JkcyBzaG91bGQgYmUgZnVsbAord29yZHMsIG5vdCBhYmJyZXZpYXRpb25zLiAgS2V5d29yZHMgYW5kIHRleHQgYXJlIGluIHRoZSBJU08gODg1OS0xCisoTGF0aW4tMSkgY2hhcmFjdGVyIHNldCAoYSBzdXBlcnNldCBvZiByZWd1bGFyIEFTQ0lJKSBhbmQgY2FuIG5vdAorY29udGFpbiBOVUwgY2hhcmFjdGVycywgYW5kIHNob3VsZCBub3QgY29udGFpbiBjb250cm9sIG9yIG90aGVyCit1bnByaW50YWJsZSBjaGFyYWN0ZXJzLiAgVG8gbWFrZSB0aGUgY29tbWVudHMgd2lkZWx5IHJlYWRhYmxlLCBzdGljaword2l0aCBiYXNpYyBBU0NJSSwgYW5kIGF2b2lkIG1hY2hpbmUgc3BlY2lmaWMgY2hhcmFjdGVyIHNldCBleHRlbnNpb25zCitsaWtlIHRoZSBJQk0tUEMgY2hhcmFjdGVyIHNldC4gIFRoZSBrZXl3b3JkIG11c3QgYmUgcHJlc2VudCwgYnV0Cit5b3UgY2FuIGxlYXZlIG9mZiB0aGUgdGV4dCBzdHJpbmcgb24gbm9uLWNvbXByZXNzZWQgcGFpcnMuCitDb21wcmVzc2VkIHBhaXJzIG11c3QgaGF2ZSBhIHRleHQgc3RyaW5nLCBhcyBvbmx5IHRoZSB0ZXh0IHN0cmluZworaXMgY29tcHJlc3NlZCBhbnl3YXksIHNvIHRoZSBjb21wcmVzc2lvbiB3b3VsZCBiZSBtZWFuaW5nbGVzcy4KKworUE5HIHN1cHBvcnRzIG1vZGlmaWNhdGlvbiB0aW1lIHZpYSB0aGUgcG5nX3RpbWUgc3RydWN0dXJlLiAgVHdvCitjb252ZXJzaW9uIHJvdXRpbmVzIGFyZSBwcm92aWRlZCwgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmb3IKK3RpbWVfdCBhbmQgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0oKSBmb3Igc3RydWN0IHRtLiAgVGhlCit0aW1lX3Qgcm91dGluZSB1c2VzIGdtdGltZSgpLiAgWW91IGRvbid0IGhhdmUgdG8gdXNlIGVpdGhlciBvZgordGhlc2UsIGJ1dCBpZiB5b3Ugd2lzaCB0byBmaWxsIGluIHRoZSBwbmdfdGltZSBzdHJ1Y3R1cmUgZGlyZWN0bHksCit5b3Ugc2hvdWxkIHByb3ZpZGUgdGhlIHRpbWUgaW4gdW5pdmVyc2FsIHRpbWUgKEdNVCkgaWYgcG9zc2libGUKK2luc3RlYWQgb2YgeW91ciBsb2NhbCB0aW1lLiAgTm90ZSB0aGF0IHRoZSB5ZWFyIG51bWJlciBpcyB0aGUgZnVsbAoreWVhciAoZS5nLiAxOTk4LCByYXRoZXIgdGhhbiA5OCAtIFBORyBpcyB5ZWFyIDIwMDAgY29tcGxpYW50ISksIGFuZAordGhhdCBtb250aHMgc3RhcnQgd2l0aCAxLgorCitJZiB5b3Ugd2FudCB0byBzdG9yZSB0aGUgdGltZSBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgY3JlYXRpb24sIHlvdSBzaG91bGQKK3VzZSBhIHBsYWluIHRFWHQgY2h1bmsgd2l0aCB0aGUgIkNyZWF0aW9uIFRpbWUiIGtleXdvcmQuICBUaGlzIGlzCituZWNlc3NhcnkgYmVjYXVzZSB0aGUgImNyZWF0aW9uIHRpbWUiIG9mIGEgUE5HIGltYWdlIGlzIHNvbWV3aGF0IHZhZ3VlLAorZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IG1lYW4gdGhlIFBORyBmaWxlLCB0aGUgdGltZSB0aGUgaW1hZ2Ugd2FzCitjcmVhdGVkIGluIGEgbm9uLVBORyBmb3JtYXQsIGEgc3RpbGwgcGhvdG8gZnJvbSB3aGljaCB0aGUgaW1hZ2Ugd2FzCitzY2FubmVkLCBvciBwb3NzaWJseSB0aGUgc3ViamVjdCBtYXR0ZXIgaXRzZWxmLiAgSW4gb3JkZXIgdG8gZmFjaWxpdGF0ZQorbWFjaGluZS1yZWFkYWJsZSBkYXRlcywgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgIkNyZWF0aW9uIFRpbWUiCit0RVh0IGNodW5rIHVzZSBSRkMgMTEyMyBmb3JtYXQgZGF0ZXMgKGUuZy4gIjIyIE1heSAxOTk3IDE4OjA3OjEwIEdNVCIpLAorYWx0aG91Z2ggdGhpcyBpc24ndCBhIHJlcXVpcmVtZW50LiAgVW5saWtlIHRoZSB0SU1FIGNodW5rLCB0aGUKKyJDcmVhdGlvbiBUaW1lIiB0RVh0IGNodW5rIGlzIG5vdCBleHBlY3RlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGNoYW5nZWQKK2J5IHRoZSBzb2Z0d2FyZS4gIFRvIGZhY2lsaXRhdGUgdGhlIHVzZSBvZiBSRkMgMTEyMyBkYXRlcywgYSBmdW5jdGlvbgorcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyhwbmdfdGltZXApIGlzIHByb3ZpZGVkIHRvIGNvbnZlcnQgZnJvbSBQTkcKK3RpbWUgdG8gYW4gUkZDIDExMjMgZm9ybWF0IHN0cmluZy4KKworV3JpdGluZyB1bmtub3duIGNodW5rcworCitZb3UgY2FuIHVzZSB0aGUgcG5nX3NldF91bmtub3duX2NodW5rcyBmdW5jdGlvbiB0byBxdWV1ZSB1cCBjaHVua3MKK2ZvciB3cml0aW5nLiAgWW91IGdpdmUgaXQgYSBjaHVuayBuYW1lLCByYXcgZGF0YSwgYW5kIGEgc2l6ZTsgdGhhdCdzCithbGwgdGhlcmUgaXMgdG8gaXQuICBUaGUgY2h1bmtzIHdpbGwgYmUgd3JpdHRlbiBieSB0aGUgbmV4dCBmb2xsb3dpbmcKK3BuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFLCBwbmdfd3JpdGVfaW5mbywgb3IgcG5nX3dyaXRlX2VuZCBmdW5jdGlvbi4KK0FueSBjaHVua3MgcHJldmlvdXNseSByZWFkIGludG8gdGhlIGluZm8gc3RydWN0dXJlJ3MgdW5rbm93bi1jaHVuaworbGlzdCB3aWxsIGFsc28gYmUgd3JpdHRlbiBvdXQgaW4gYSBzZXF1ZW5jZSB0aGF0IHNhdGlzZmllcyB0aGUgUE5HCitzcGVjaWZpY2F0aW9uJ3Mgb3JkZXJpbmcgcnVsZXMuCisKK1RoZSBoaWdoLWxldmVsIHdyaXRlIGludGVyZmFjZQorCitBdCB0aGlzIHBvaW50IHRoZXJlIGFyZSB0d28gd2F5cyB0byBwcm9jZWVkOyB0aHJvdWdoIHRoZSBoaWdoLWxldmVsCit3cml0ZSBpbnRlcmZhY2UsIG9yIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBsb3ctbGV2ZWwgd3JpdGUgb3BlcmF0aW9ucy4KK1lvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiB5b3VyIGltYWdlIGRhdGEgaXMgcHJlc2VudAoraW4gdGhlIGluZm8gc3RydWN0dXJlLiAgQWxsIGRlZmluZWQgb3V0cHV0Cit0cmFuc2Zvcm1hdGlvbnMgYXJlIHBlcm1pdHRlZCwgZW5hYmxlZCBieSB0aGUgZm9sbG93aW5nIG1hc2tzLgorCisgICAgUE5HX1RSQU5TRk9STV9JREVOVElUWSAgICAgIE5vIHRyYW5zZm9ybWF0aW9uCisgICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIFBhY2sgMSwgMiBhbmQgNC1iaXQgc2FtcGxlcworICAgIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVAgICAgICBDaGFuZ2Ugb3JkZXIgb2YgcGFja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0byBMU0IgZmlyc3QKKyAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PICAgSW52ZXJ0IG1vbm9jaHJvbWUgaW1hZ2VzCisgICAgUE5HX1RSQU5TRk9STV9TSElGVCAgICAgICAgIE5vcm1hbGl6ZSBwaXhlbHMgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCSVQgZGVwdGgKKyAgICBQTkdfVFJBTlNGT1JNX0JHUiAgICAgICAgICAgRmxpcCBSR0IgdG8gQkdSLCBSR0JBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEJHUkEKKyAgICBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEgICAgRmxpcCBSR0JBIHRvIEFSR0Igb3IgR0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQUcKKyAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSAgQ2hhbmdlIGFscGhhIGZyb20gb3BhY2l0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cmFuc3BhcmVuY3kKKyAgICBQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOICAgQnl0ZS1zd2FwIDE2LWJpdCBzYW1wbGVzCisgICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVIgIFN0cmlwIG91dCBmaWxsZXIgYnl0ZXMuCisKK0lmIHlvdSBoYXZlIHZhbGlkIGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlICh5b3UgY2FuIHVzZQorcG5nX3NldF9yb3dzKCkgdG8gcHV0IGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlKSwgc2ltcGx5IGRvIHRoaXM6CisKKyAgICBwbmdfd3JpdGVfcG5nKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfdHJhbnNmb3JtcywgTlVMTCkKKword2hlcmUgcG5nX3RyYW5zZm9ybXMgaXMgYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBsb2dpY2FsIE9SIG9mIHNvbWUgc2V0IG9mCit0cmFuc2Zvcm1hdGlvbiBmbGFncy4gIFRoaXMgY2FsbCBpcyBlcXVpdmFsZW50IHRvIHBuZ193cml0ZV9pbmZvKCksCitmb2xsb3dlZCB0aGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHRyYW5zZm9ybSBtYXNrLAordGhlbiBwbmdfd3JpdGVfaW1hZ2UoKSwgYW5kIGZpbmFsbHkgcG5nX3dyaXRlX2VuZCgpLgorCisoVGhlIGZpbmFsIHBhcmFtZXRlciBvZiB0aGlzIGNhbGwgaXMgbm90IHlldCB1c2VkLiAgU29tZWRheSBpdCBtaWdodCBwb2ludAordG8gdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyByZXF1aXJlZCBieSBzb21lIGZ1dHVyZSBvdXRwdXQgdHJhbnNmb3JtLikKKworWW91IG11c3QgdXNlIHBuZ190cmFuc2Zvcm1zIGFuZCBub3QgY2FsbCBhbnkgcG5nX3NldF90cmFuc2Zvcm0oKSBmdW5jdGlvbnMKK3doZW4geW91IHVzZSBwbmdfd3JpdGVfcG5nKCkuCisKK1RoZSBsb3ctbGV2ZWwgd3JpdGUgaW50ZXJmYWNlCisKK0lmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSBpbnN0ZWFkLCB5b3UgYXJlIG5vdyByZWFkeSB0bword3JpdGUgYWxsIHRoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbwordGhpcyB3aXRoIGEgY2FsbCB0byBwbmdfd3JpdGVfaW5mbygpLgorCisgICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCitOb3RlIHRoYXQgdGhlcmUgaXMgb25lIHRyYW5zZm9ybWF0aW9uIHlvdSBtYXkgbmVlZCB0byBkbyBiZWZvcmUKK3BuZ193cml0ZV9pbmZvKCkuICBJbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIGlzIHRoZQorbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdXIgZGF0YSBpcyBzdXBwbGllZCBhcyBhIGxldmVsIG9mCit0cmFuc3BhcmVuY3ksIHlvdSBjYW4gaW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIGJlZm9yZSB5b3Ugd3JpdGUgaXQsIHNvCit0aGF0IDAgaXMgZnVsbHkgdHJhbnNwYXJlbnQgYW5kIDI1NSAoaW4gOC1iaXQgb3IgcGFsZXR0ZWQgaW1hZ2VzKSBvcgorNjU1MzUgKGluIDE2LWJpdCBpbWFnZXMpIGlzIGZ1bGx5IG9wYXF1ZSwgd2l0aAorCisgICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7CisKK1RoaXMgbXVzdCBhcHBlYXIgYmVmb3JlIHBuZ193cml0ZV9pbmZvKCkgaW5zdGVhZCBvZiBsYXRlciB3aXRoIHRoZQorb3RoZXIgdHJhbnNmb3JtYXRpb25zIGJlY2F1c2UgaW4gdGhlIGNhc2Ugb2YgcGFsZXR0ZWQgaW1hZ2VzIHRoZSB0Uk5TCitjaHVuayBkYXRhIGhhcyB0byBiZSBpbnZlcnRlZCBiZWZvcmUgdGhlIHRSTlMgY2h1bmsgaXMgd3JpdHRlbi4gIElmCit5b3VyIGltYWdlIGlzIG5vdCBhIHBhbGV0dGVkIGltYWdlLCB0aGUgdFJOUyBkYXRhICh3aGljaCBpbiBzdWNoIGNhc2VzCityZXByZXNlbnRzIGEgc2luZ2xlIGNvbG9yIHRvIGJlIHJlbmRlcmVkIGFzIHRyYW5zcGFyZW50KSB3b24ndCBuZWVkIHRvCitiZSBjaGFuZ2VkLCBhbmQgeW91IGNhbiBzYWZlbHkgZG8gdGhpcyB0cmFuc2Zvcm1hdGlvbiBhZnRlciB5b3VyCitwbmdfd3JpdGVfaW5mbygpIGNhbGwuCisKK0lmIHlvdSBuZWVkIHRvIHdyaXRlIGEgcHJpdmF0ZSBjaHVuayB0aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWZvcmUKK3RoZSBQTFRFIGNodW5rIHdoZW4gUExURSBpcyBwcmVzZW50LCB5b3UgY2FuIHdyaXRlIHRoZSBQTkcgaW5mbyBpbgordHdvIHN0ZXBzLCBhbmQgaW5zZXJ0IGNvZGUgdG8gd3JpdGUgeW91ciBvd24gY2h1bmsgYmV0d2VlbiB0aGVtOgorCisgICAgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIpOworICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsIC4uLik7CisgICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCitBZnRlciB5b3UndmUgd3JpdHRlbiB0aGUgZmlsZSBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKK3RvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cword2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQorc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgordHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCitjZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLiAgRXZlbiB0aG91Z2ggZWFjaCB0cmFuc2Zvcm1hdGlvbgorY2hlY2tzIHRvIHNlZSBpZiBpdCBoYXMgZGF0YSB0aGF0IGl0IGNhbiBkbyBzb21ldGhpbmcgd2l0aCwgeW91IHNob3VsZAorbWFrZSBzdXJlIHRvIG9ubHkgZW5hYmxlIGEgdHJhbnNmb3JtYXRpb24gaWYgaXQgd2lsbCBiZSB2YWxpZCBmb3IgdGhlCitkYXRhLiAgRm9yIGV4YW1wbGUsIGRvbid0IHN3YXAgcmVkIGFuZCBibHVlIG9uIGdyYXlzY2FsZSBkYXRhLgorCitQTkcgZmlsZXMgc3RvcmUgUkdCIHBpeGVscyBwYWNrZWQgaW50byAzIG9yIDYgYnl0ZXMuICBUaGlzIGNvZGUgdGVsbHMKK3RoZSBsaWJyYXJ5IHRvIHN0cmlwIGlucHV0IGRhdGEgdGhhdCBoYXMgNCBvciA4IGJ5dGVzIHBlciBwaXhlbCBkb3duCit0byAzIG9yIDYgYnl0ZXMgKG9yIHN0cmlwIDIgb3IgNC1ieXRlIGdyYXlzY2FsZStmaWxsZXIgZGF0YSB0byAxIG9yIDIKK2J5dGVzIHBlciBwaXhlbCkuCisKKyAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAwLCBQTkdfRklMTEVSX0JFRk9SRSk7CisKK3doZXJlIHRoZSAwIGlzIHVudXNlZCwgYW5kIHRoZSBsb2NhdGlvbiBpcyBlaXRoZXIgUE5HX0ZJTExFUl9CRUZPUkUgb3IKK1BOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgdGhlIGZpbGxlciBieXRlIGluIHRoZSBwaXhlbAoraXMgc3RvcmVkIFhSR0Igb3IgUkdCWC4KKworUE5HIGZpbGVzIHBhY2sgcGl4ZWxzIG9mIGJpdCBkZXB0aHMgMSwgMiwgYW5kIDQgaW50byBieXRlcyBhcyBzbWFsbCBhcwordGhleSBjYW4sIHJlc3VsdGluZyBpbiwgZm9yIGV4YW1wbGUsIDggcGl4ZWxzIHBlciBieXRlIGZvciAxIGJpdCBmaWxlcy4KK0lmIHRoZSBkYXRhIGlzIHN1cHBsaWVkIGF0IDEgcGl4ZWwgcGVyIGJ5dGUsIHVzZSB0aGlzIGNvZGUsIHdoaWNoIHdpbGwKK2NvcnJlY3RseSBwYWNrIHRoZSBwaXhlbHMgaW50byBhIHNpbmdsZSBieXRlOgorCisgICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOworCitQTkcgZmlsZXMgcmVkdWNlIHBvc3NpYmxlIGJpdCBkZXB0aHMgdG8gMSwgMiwgNCwgOCwgYW5kIDE2LiAgSWYgeW91cgorZGF0YSBpcyBvZiBhbm90aGVyIGJpdCBkZXB0aCwgeW91IGNhbiB3cml0ZSBhbiBzQklUIGNodW5rIGludG8gdGhlCitmaWxlIHNvIHRoYXQgZGVjb2RlcnMgY2FuIHJlY292ZXIgdGhlIG9yaWdpbmFsIGRhdGEgaWYgZGVzaXJlZC4KKworICAgIC8qIFNldCB0aGUgdHJ1ZSBiaXQgZGVwdGggb2YgdGhlIGltYWdlIGRhdGEgKi8KKyAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQorICAgIHsKKyAgICAgICAgc2lnX2JpdC5yZWQgPSB0cnVlX2JpdF9kZXB0aDsKKyAgICAgICAgc2lnX2JpdC5ncmVlbiA9IHRydWVfYml0X2RlcHRoOworICAgICAgICBzaWdfYml0LmJsdWUgPSB0cnVlX2JpdF9kZXB0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2lnX2JpdC5ncmF5ID0gdHJ1ZV9iaXRfZGVwdGg7CisgICAgfQorICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCisgICAgeworICAgICAgICBzaWdfYml0LmFscGhhID0gdHJ1ZV9iaXRfZGVwdGg7CisgICAgfQorCisgICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7CisKK0lmIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgcm93IGJ1ZmZlciBpbiBhIGJpdCBkZXB0aCBvdGhlciB0aGFuCitvbmUgc3VwcG9ydGVkIGJ5IFBORyAoZS5nLiAzIGJpdCBkYXRhIGluIHRoZSByYW5nZSAwLTcgZm9yIGEgNC1iaXQgUE5HKSwKK3RoaXMgd2lsbCBzY2FsZSB0aGUgdmFsdWVzIHRvIGFwcGVhciB0byBiZSB0aGUgY29ycmVjdCBiaXQgZGVwdGggYXMKK2lzIHJlcXVpcmVkIGJ5IFBORy4KKworICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJnNpZ19iaXQpOworCitQTkcgZmlsZXMgc3RvcmUgMTYgYml0IHBpeGVscyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4sCitpZS4gbW9zdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0KS4gIFRoaXMgY29kZSB3b3VsZCBiZSB1c2VkIGlmIHRoZXkgYXJlCitzdXBwbGllZCB0aGUgb3RoZXIgd2F5IChsaXR0bGUtZW5kaWFuLCBpLmUuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKK2ZpcnN0LCB0aGUgd2F5IFBDcyBzdG9yZSB0aGVtKToKKworICAgIGlmIChiaXRfZGVwdGggPiA4KQorICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKworSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91CituZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgorCisgICAgaWYgKGJpdF9kZXB0aCA8IDgpCisgICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKKworUE5HIGZpbGVzIHN0b3JlIDMgY29sb3IgcGl4ZWxzIGluIHJlZCwgZ3JlZW4sIGJsdWUgb3JkZXIuICBUaGlzIGNvZGUKK3dvdWxkIGJlIHVzZWQgaWYgdGhleSBhcmUgc3VwcGxpZWQgYXMgYmx1ZSwgZ3JlZW4sIHJlZDoKKworICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOworCitQTkcgZmlsZXMgZGVzY3JpYmUgbW9ub2Nocm9tZSBhcyBibGFjayBiZWluZyB6ZXJvIGFuZCB3aGl0ZSBiZWluZworb25lLiBUaGlzIGNvZGUgd291bGQgYmUgdXNlZCBpZiB0aGUgcGl4ZWxzIGFyZSBzdXBwbGllZCB3aXRoIHRoaXMgcmV2ZXJzZWQKKyhibGFjayBiZWluZyBvbmUgYW5kIHdoaXRlIGJlaW5nIHplcm8pOgorCisgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKworRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCit0aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjaword2l0aAorCisgICAgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbihwbmdfcHRyLAorICAgICAgIHdyaXRlX3RyYW5zZm9ybV9mbik7CisKK1lvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KKworICAgIHZvaWQgd3JpdGVfdHJhbnNmb3JtX2ZuKHBuZ19wdHIgcHRyLCByb3dfaW5mb19wdHIKKyAgICAgICByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpCisKK1NlZSBwbmd0ZXN0LmMgZm9yIGEgd29ya2luZyBleGFtcGxlLiAgWW91ciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAorYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIGFyZSBwcm9jZXNzZWQuCisKK1lvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCitjYWxsYmFjayBmdW5jdGlvbi4KKworICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwgMCwgMCk7CisKK1RoZSB1c2VyX2NoYW5uZWxzIGFuZCB1c2VyX2RlcHRoIHBhcmFtZXRlcnMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgaWdub3JlZAord2hlbiB3cml0aW5nOyB5b3UgY2FuIHNldCB0aGVtIHRvIHplcm8gYXMgc2hvd24uCisKK1lvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbiBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cigpLgorRm9yIGV4YW1wbGU6CisKKyAgICB2b2lkcCB3cml0ZV91c2VyX3RyYW5zZm9ybV9wdHIgPQorICAgICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKHBuZ19wdHIpOworCitJdCBpcyBwb3NzaWJsZSB0byBoYXZlIGxpYnBuZyBmbHVzaCBhbnkgcGVuZGluZyBvdXRwdXQsIGVpdGhlciBtYW51YWxseSwKK29yIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYSBjZXJ0YWluIG51bWJlciBvZiBsaW5lcyBoYXZlIGJlZW4gd3JpdHRlbi4gIFRvCitmbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBhIHNpbmdsZSB0aW1lIGNhbGw6CisKKyAgICBwbmdfd3JpdGVfZmx1c2gocG5nX3B0cik7CisKK2FuZCB0byBoYXZlIGxpYnBuZyBmbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBwZXJpb2RpY2FsbHkgYWZ0ZXIgYSBjZXJ0YWluCitudW1iZXIgb2Ygc2NhbmxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLCBjYWxsOgorCisgICAgcG5nX3NldF9mbHVzaChwbmdfcHRyLCBucm93cyk7CisKK05vdGUgdGhhdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiByb3dzIGlzIGZyb20gdGhlIGxhc3QgdGltZSBwbmdfd3JpdGVfZmx1c2goKQord2FzIGNhbGxlZCwgb3IgdGhlIGZpcnN0IHJvdyBvZiB0aGUgaW1hZ2UgaWYgaXQgaGFzIG5ldmVyIGJlZW4gY2FsbGVkLgorU28gaWYgeW91IHdyaXRlIDUwIGxpbmVzLCBhbmQgdGhlbiBwbmdfc2V0X2ZsdXNoIDI1LCBpdCB3aWxsIGZsdXNoIHRoZQorb3V0cHV0IG9uIHRoZSBuZXh0IHNjYW5saW5lLCBhbmQgZXZlcnkgMjUgbGluZXMgdGhlcmVhZnRlciwgdW5sZXNzCitwbmdfd3JpdGVfZmx1c2goKSBpcyBjYWxsZWQgYmVmb3JlIDI1IG1vcmUgbGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uCitJZiBucm93cyBpcyB0b28gc21hbGwgKGxlc3MgdGhhbiBhYm91dCAxMCBsaW5lcyBmb3IgYSA2NDAgcGl4ZWwgd2lkZQorUkdCIGltYWdlKSB0aGUgaW1hZ2UgY29tcHJlc3Npb24gbWF5IGRlY3JlYXNlIG5vdGljZWFibHkgKGFsdGhvdWdoIHRoaXMKK21heSBiZSBhY2NlcHRhYmxlIGZvciByZWFsLXRpbWUgYXBwbGljYXRpb25zKS4gIEluZnJlcXVlbnQgZmx1c2hpbmcgd2lsbAorb25seSBkZWdyYWRlIHRoZSBjb21wcmVzc2lvbiBwZXJmb3JtYW5jZSBieSBhIGZldyBwZXJjZW50IG92ZXIgaW1hZ2VzCit0aGF0IGRvIG5vdCB1c2UgZmx1c2hpbmcuCisKK1dyaXRpbmcgdGhlIGltYWdlIGRhdGEKKworVGhhdCdzIGl0IGZvciB0aGUgdHJhbnNmb3JtYXRpb25zLiAgTm93IHlvdSBjYW4gd3JpdGUgdGhlIGltYWdlIGRhdGEuCitUaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgaW4gb25lIGZ1bmN0aW9uIGNhbGwuICBJZiB5b3UgaGF2ZSB0aGUKK3dob2xlIGltYWdlIGluIG1lbW9yeSwgeW91IGNhbiBqdXN0IGNhbGwgcG5nX3dyaXRlX2ltYWdlKCkgYW5kIGxpYnBuZword2lsbCB3cml0ZSB0aGUgaW1hZ2UuICBZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8KK2VhY2ggcm93LiAgVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW50ZXJsYWNpbmcsIHNvIHlvdSBkb24ndAorbmVlZCB0byBjYWxsIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgb3IgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlCit0aW1lcywgb3IgYW55IG9mIHRoYXQgb3RoZXIgc3R1ZmYgbmVjZXNzYXJ5IHdpdGggcG5nX3dyaXRlX3Jvd3MoKS4KKworICAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOworCit3aGVyZSByb3dfcG9pbnRlcnMgaXM6CisKKyAgICBwbmdfYnl0ZSAqcm93X3BvaW50ZXJzW2hlaWdodF07CisKK1lvdSBjYW4gcG9pbnQgdG8gdm9pZCBvciBjaGFyIG9yIHdoYXRldmVyIHlvdSB1c2UgZm9yIHBpeGVscy4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gd3JpdGUgdGhlIHdob2xlIGltYWdlIGF0IG9uY2UsIHlvdSBjYW4KK3VzZSBwbmdfd3JpdGVfcm93cygpIGluc3RlYWQuICBJZiB0aGUgZmlsZSBpcyBub3QgaW50ZXJsYWNlZCwKK3RoaXMgaXMgc2ltcGxlOgorCisgICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLAorICAgICAgIG51bWJlcl9vZl9yb3dzKTsKKworcm93X3BvaW50ZXJzIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBwbmdfd3JpdGVfaW1hZ2UoKSBjYWxsLgorCitJZiB5b3UgYXJlIGp1c3Qgd3JpdGluZyBvbmUgcm93IGF0IGEgdGltZSwgeW91IGNhbiBkbyB0aGlzIHdpdGgKK2Egc2luZ2xlIHJvd19wb2ludGVyIGluc3RlYWQgb2YgYW4gYXJyYXkgb2Ygcm93X3BvaW50ZXJzOgorCisgICAgcG5nX2J5dGVwIHJvd19wb2ludGVyID0gcm93OworCisgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCByb3dfcG9pbnRlcik7CisKK1doZW4gdGhlIGZpbGUgaXMgaW50ZXJsYWNlZCwgdGhpbmdzIGNhbiBnZXQgYSBnb29kIGRlYWwgbW9yZQorY29tcGxpY2F0ZWQuICBUaGUgb25seSBjdXJyZW50bHkgKGFzIG9mIHRoZSBQTkcgU3BlY2lmaWNhdGlvbgordmVyc2lvbiAxLjIsIGRhdGVkIEp1bHkgMTk5OSkgZGVmaW5lZCBpbnRlcmxhY2luZyBzY2hlbWUgZm9yIFBORyBmaWxlcworaXMgdGhlICJBZGFtNyIgaW50ZXJsYWNlIHNjaGVtZSwgdGhhdCBicmVha3MgZG93biBhbgoraW1hZ2UgaW50byBzZXZlbiBzbWFsbGVyIGltYWdlcyBvZiB2YXJ5aW5nIHNpemUuICBsaWJwbmcgd2lsbCBidWlsZAordGhlc2UgaW1hZ2VzIGZvciB5b3UsIG9yIHlvdSBjYW4gZG8gdGhlbSB5b3Vyc2VsZi4gIElmIHlvdSB3YW50IHRvCitidWlsZCB0aGVtIHlvdXJzZWxmLCBzZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9mIHdoaWNoCitwaXhlbHMgdG8gd3JpdGUgd2hlbi4KKworSWYgeW91IGRvbid0IHdhbnQgbGlicG5nIHRvIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZGV0YWlscywganVzdAordXNlIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgYW5kIGNhbGwgcG5nX3dyaXRlX3Jvd3MoKSB0aGUKK2NvcnJlY3QgbnVtYmVyIG9mIHRpbWVzIHRvIHdyaXRlIGFsbCBzZXZlbiBzdWItaW1hZ2VzLgorCitJZiB5b3Ugd2FudCBsaWJwbmcgdG8gYnVpbGQgdGhlIHN1Yi1pbWFnZXMsIGNhbGwgdGhpcyBiZWZvcmUgeW91IHN0YXJ0Cit3cml0aW5nIGFueSByb3dzOgorCisgICAgbnVtYmVyX29mX3Bhc3NlcyA9CisgICAgICAgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisKK1RoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzCitpcyBzZXZlbiwgYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4KKworVGhlbiB3cml0ZSB0aGUgY29tcGxldGUgaW1hZ2UgbnVtYmVyX29mX3Bhc3NlcyB0aW1lcy4KKworICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywKKyAgICAgICBudW1iZXJfb2Zfcm93cyk7CisKK0FzIHNvbWUgb2YgdGhlc2Ugcm93cyBhcmUgbm90IHVzZWQsIGFuZCB0aHVzIHJldHVybiBpbW1lZGlhdGVseSwKK3lvdSBtYXkgd2FudCB0byByZWFkIGFib3V0IGludGVybGFjaW5nIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwKK2FuZCBvbmx5IHVwZGF0ZSB0aGUgcm93cyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkLgorCitGaW5pc2hpbmcgYSBzZXF1ZW50aWFsIHdyaXRlCisKK0FmdGVyIHlvdSBhcmUgZmluaXNoZWQgd3JpdGluZyB0aGUgaW1hZ2UsIHlvdSBzaG91bGQgZmluaXNoIHdyaXRpbmcKK3RoZSBmaWxlLiAgSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHdyaXRpbmcgY29tbWVudHMgb3IgdGltZSwgeW91IHNob3VsZAorcGFzcyBhbiBhcHByb3ByaWF0ZWx5IGZpbGxlZCBwbmdfaW5mbyBwb2ludGVyLiAgSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCwKK3lvdSBjYW4gcGFzcyBOVUxMLgorCisgICAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7CisKK1doZW4geW91IGFyZSBkb25lLCB5b3UgY2FuIGZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IGxpYnBuZyBsaWtlIHRoaXM6CisKKyAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7CisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gaW5kaXZpZHVhbGx5IGZyZWUgdGhlIGluZm9fcHRyIG1lbWJlcnMgdGhhdAorcG9pbnQgdG8gbGlicG5nLWFsbG9jYXRlZCBzdG9yYWdlIHdpdGggdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKKworICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIG1hc2ssIHNlcSkKKyAgICBtYXNrICAtIGlkZW50aWZpZXMgZGF0YSB0byBiZSBmcmVlZCwgYSBtYXNrCisgICAgICAgICAgICBjb250YWluaW5nIHRoZSBsb2dpY2FsIE9SIG9mIG9uZSBvcgorICAgICAgICAgICAgbW9yZSBvZgorICAgICAgICAgICAgICBQTkdfRlJFRV9QTFRFLCBQTkdfRlJFRV9UUk5TLAorICAgICAgICAgICAgICBQTkdfRlJFRV9ISVNULCBQTkdfRlJFRV9JQ0NQLAorICAgICAgICAgICAgICBQTkdfRlJFRV9QQ0FMLCBQTkdfRlJFRV9ST1dTLAorICAgICAgICAgICAgICBQTkdfRlJFRV9TQ0FMLCBQTkdfRlJFRV9TUExULAorICAgICAgICAgICAgICBQTkdfRlJFRV9URVhULCBQTkdfRlJFRV9VTktOLAorICAgICAgICAgICAgb3Igc2ltcGx5IFBOR19GUkVFX0FMTAorICAgIHNlcSAgIC0gc2VxdWVuY2UgbnVtYmVyIG9mIGl0ZW0gdG8gYmUgZnJlZWQKKyAgICAgICAgICAgICgtMSBmb3IgYWxsIGl0ZW1zKQorCitUaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIHdoZW4gdGhlIHJlbGV2YW50IHN0b3JhZ2UgaGFzCithbHJlYWR5IGJlZW4gZnJlZWQsIG9yIGhhcyBub3QgeWV0IGJlZW4gYWxsb2NhdGVkLCBvciB3YXMgYWxsb2NhdGVkCitieSB0aGUgdXNlciAgYW5kIG5vdCBieSBsaWJwbmcsICBhbmQgd2lsbCBpbiB0aG9zZQorY2FzZXMgZG8gbm90aGluZy4gIFRoZSAic2VxIiBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiBvbmx5IG9uZSBpdGVtCitvZiB0aGUgc2VsZWN0ZWQgZGF0YSB0eXBlLCBzdWNoIGFzIFBMVEUsIGlzIGFsbG93ZWQuICBJZiAic2VxIiBpcyBub3QKKy0xLCBhbmQgbXVsdGlwbGUgaXRlbXMgYXJlIGFsbG93ZWQgZm9yIHRoZSBkYXRhIHR5cGUgaWRlbnRpZmllZCBpbgordGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvciBzUExULCBvbmx5IHRoZSBuJ3RoIGl0ZW0gaW4gdGhlIHN0cnVjdHVyZQoraXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCisKK0lmIHlvdSBhbGxvY2F0ZWQgZGF0YSBzdWNoIGFzIGEgcGFsZXR0ZSB0aGF0IHlvdSBwYXNzZWQKK2luIHRvIGxpYnBuZyB3aXRoIHBuZ19zZXRfKiwgeW91IG11c3Qgbm90IGZyZWUgaXQgdW50aWwganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8KK3BuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpLgorCitUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBvbmx5IHRvIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseQorYnkgbGlicG5nLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCwgc28gdGhhdCBsaWJwbmcgd2lsbCBub3QgZnJlZSB0aGUgZGF0YSwKK29yIHNvIHRoYXQgaXQgd2lsbCBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIHdpdGggcG5nX21hbGxvYygpCitvciBwbmdfemFsbG9jKCkgYW5kIHBhc3NlZCBpbiB2aWEgYSBwbmdfc2V0XyooKSBmdW5jdGlvbiwgd2l0aAorCisgICAgcG5nX2RhdGFfZnJlZXIocG5nX3B0ciwgaW5mb19wdHIsIGZyZWVyLCBtYXNrKQorICAgIG1hc2sgICAtIHdoaWNoIGRhdGEgZWxlbWVudHMgYXJlIGFmZmVjdGVkCisgICAgICAgICAgICAgc2FtZSBjaG9pY2VzIGFzIGluIHBuZ19mcmVlX2RhdGEoKQorICAgIGZyZWVyICAtIG9uZSBvZgorICAgICAgICAgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEKKyAgICAgICAgICAgICAgIFBOR19TRVRfV0lMTF9GUkVFX0RBVEEKKyAgICAgICAgICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBCisKK0ZvciBleGFtcGxlLCB0byB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3Igc29tZSBkYXRhIGZyb20gYSByZWFkIHN0cnVjdHVyZQordG8gYSB3cml0ZSBzdHJ1Y3R1cmUsIHlvdSBjb3VsZCB1c2UKKworICAgIHBuZ19kYXRhX2ZyZWVyKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLAorICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBLAorICAgICAgIFBOR19GUkVFX1BMVEV8UE5HX0ZSRUVfdFJOU3xQTkdfRlJFRV9oSVNUKQorICAgIHBuZ19kYXRhX2ZyZWVyKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsCisgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEsCisgICAgICAgUE5HX0ZSRUVfUExURXxQTkdfRlJFRV90Uk5TfFBOR19GUkVFX2hJU1QpCisKK3RoZXJlYnkgYnJpZWZseSByZWFzc2lnbmluZyByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0byB0aGUgdXNlciBidXQKK2ltbWVkaWF0ZWx5IGFmdGVyd2FyZHMgcmVhc3NpZ25pbmcgaXQgb25jZSBtb3JlIHRvIHRoZSB3cml0ZV9kZXN0cm95CitmdW5jdGlvbi4gIEhhdmluZyBkb25lIHRoaXMsIGl0IHdvdWxkIHRoZW4gYmUgc2FmZSB0byBkZXN0cm95IHRoZSByZWFkCitzdHJ1Y3R1cmUgYW5kIGNvbnRpbnVlIHRvIHVzZSB0aGUgUExURSwgdFJOUywgYW5kIGhJU1QgZGF0YSBpbiB0aGUgd3JpdGUKK3N0cnVjdHVyZS4KKworVGhpcyBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgorWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYWZ0ZXIgdGhlIHBuZ19zZXRfKigpIGZ1bmN0aW9ucwordG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG9yIHBuZ19kZXN0cm95XyooKSBpcyBzdXBwb3NlZCB0byBmcmVlIHRoZSBkYXRhLgorV2hlbiB0aGUgdXNlciBhc3N1bWVzIHJlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZQorYXBwbGljYXRpb24gbXVzdCB1c2UKK3BuZ19mcmVlKCkgdG8gZnJlZSBpdCwgYW5kIHdoZW4gdGhlIHVzZXIgdHJhbnNmZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGxpYnBuZworZm9yIGRhdGEgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkLCB0aGUgdXNlciBtdXN0IGhhdmUgdXNlZCBwbmdfbWFsbG9jKCkKK29yIHBuZ196YWxsb2MoKSB0byBhbGxvY2F0ZSBpdC4KKworSWYgeW91IGFsbG9jYXRlZCB0ZXh0X3B0ci50ZXh0LCB0ZXh0X3B0ci5sYW5nLCBhbmQgdGV4dF9wdHIudHJhbnNsYXRlZF9rZXl3b3JkCitzZXBhcmF0ZWx5LCBkbyBub3QgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGV4dF9wdHIgdG8gbGlicG5nLAorYmVjYXVzZSB3aGVuIGxpYnBuZyBmaWxscyBhIHBuZ190ZXh0IHN0cnVjdHVyZSBpdCBjb21iaW5lcyB0aGVzZSBtZW1iZXJzIHdpdGgKK3RoZSBrZXkgbWVtYmVyLCBhbmQgcG5nX2ZyZWVfZGF0YSgpIHdpbGwgZnJlZSBvbmx5IHRleHRfcHRyLmtleS4gIFNpbWlsYXJseSwKK2lmIHlvdSB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZSdpbmcgdGV4dF9wdHIgZnJvbSBsaWJwbmcgdG8geW91cgorYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gbXVzdCBub3Qgc2VwYXJhdGVseSBmcmVlIHRob3NlIG1lbWJlcnMuCitGb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiB3cml0aW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgorCitWLiBNb2RpZnlpbmcvQ3VzdG9taXppbmcgbGlicG5nOgorCitUaGVyZSBhcmUgdGhyZWUgaXNzdWVzIGhlcmUuICBUaGUgZmlyc3QgaXMgY2hhbmdpbmcgaG93IGxpYnBuZyBkb2VzCitzdGFuZGFyZCB0aGluZ3MgbGlrZSBtZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcuCitUaGUgc2Vjb25kIGRlYWxzIHdpdGggbW9yZSBjb21wbGljYXRlZCB0aGluZ3MgbGlrZSBhZGRpbmcgbmV3IGNodW5rcywKK2FkZGluZyBuZXcgdHJhbnNmb3JtYXRpb25zLCBhbmQgZ2VuZXJhbGx5IGNoYW5naW5nIGhvdyBsaWJwbmcgd29ya3MuCitCb3RoIG9mIHRob3NlIGFyZSBjb21waWxlLXRpbWUgaXNzdWVzOyB0aGF0IGlzLCB0aGV5IGFyZSBnZW5lcmFsbHkKK2RldGVybWluZWQgYXQgdGhlIHRpbWUgdGhlIGNvZGUgaXMgd3JpdHRlbiwgYW5kIHRoZXJlIGlzIHJhcmVseSBhIG5lZWQKK3RvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCBhIG1lYW5zIG9mIGNoYW5naW5nIHRoZW0uICBUaGUgdGhpcmQgaXMgYQorcnVuLXRpbWUgaXNzdWU6ICBjaG9vc2luZyBiZXR3ZWVuIGFuZC9vciB0dW5pbmcgb25lIG9yIG1vcmUgYWx0ZXJuYXRlCit2ZXJzaW9ucyBvZiBjb21wdXRhdGlvbmFsbHkgaW50ZW5zaXZlIHJvdXRpbmVzOyBzcGVjaWZpY2FsbHksIG9wdGltaXplZAorYXNzZW1ibHktbGFuZ3VhZ2UgKGFuZCB0aGVyZWZvcmUgY29tcGlsZXItIGFuZCBwbGF0Zm9ybS1kZXBlbmRlbnQpCit2ZXJzaW9ucy4KKworTWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nCisKK0FsbCBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nIGluIGxpYnBuZworZ29lcyB0aHJvdWdoIGNhbGxiYWNrcyB0aGF0IGFyZSB1c2VyLXNldHRhYmxlLiAgVGhlIGRlZmF1bHQgcm91dGluZXMgYXJlCitpbiBwbmdtZW0uYywgcG5ncmlvLmMsIHBuZ3dpby5jLCBhbmQgcG5nZXJyb3IuYywgcmVzcGVjdGl2ZWx5LiAgVG8gY2hhbmdlCit0aGVzZSBmdW5jdGlvbnMsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19zZXRfKl9mbigpIGZ1bmN0aW9uLgorCitNZW1vcnkgYWxsb2NhdGlvbiBpcyBkb25lIHRocm91Z2ggdGhlIGZ1bmN0aW9ucyBwbmdfbWFsbG9jKCkKK2FuZCBwbmdfZnJlZSgpLiAgVGhlc2UgY3VycmVudGx5IGp1c3QgY2FsbCB0aGUgc3RhbmRhcmQgQyBmdW5jdGlvbnMuICBJZgoreW91ciBwb2ludGVycyBjYW4ndCBhY2Nlc3MgbW9yZSB0aGVuIDY0SyBhdCBhIHRpbWUsIHlvdSB3aWxsIHdhbnQgdG8gc2V0CitNQVhTRUdfNjRLIGluIHpsaWIuaC4gIFNpbmNlIGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIG1ldGhvZCBvZiBoYW5kbGluZworbWVtb3J5IGFsbG9jYXRpb24gb24gYSBwbGF0Zm9ybSB3aWxsIGNoYW5nZSBiZXR3ZWVuIGFwcGxpY2F0aW9ucywgdGhlc2UKK2Z1bmN0aW9ucyBtdXN0IGJlIG1vZGlmaWVkIGluIHRoZSBsaWJyYXJ5IGF0IGNvbXBpbGUgdGltZS4gIElmIHlvdSBwcmVmZXIKK3RvIHVzZSBhIGRpZmZlcmVudCBtZXRob2Qgb2YgYWxsb2NhdGluZyBhbmQgZnJlZWluZyBkYXRhLCB5b3UgY2FuIHVzZQorcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgb3IgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpIHRvIHJlZ2lzdGVyCit5b3VyIG93biBmdW5jdGlvbnMgYXMgZGVzY3JpYmVkIGFib3ZlLgorVGhlc2UgZnVuY3Rpb25zIGFsc28gcHJvdmlkZSBhIHZvaWQgcG9pbnRlciB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhCisKKyAgICBtZW1fcHRyPXBuZ19nZXRfbWVtX3B0cihwbmdfcHRyKTsKKworWW91ciByZXBsYWNlbWVudCBtZW1vcnkgZnVuY3Rpb25zIG11c3QgaGF2ZSBwcm90b3R5cGVzIGFzIGZvbGxvd3M6CisKKyAgICBwbmdfdm9pZHAgbWFsbG9jX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgcG5nX3NpemVfdCBzaXplKTsKKyAgICB2b2lkIGZyZWVfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cik7CisKK1lvdXIgbWFsbG9jX2ZuKCkgbXVzdCByZXR1cm4gTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUuICBUaGUgcG5nX21hbGxvYygpCitmdW5jdGlvbiB3aWxsIG5vcm1hbGx5IGNhbGwgcG5nX2Vycm9yKCkgaWYgaXQgcmVjZWl2ZXMgYSBOVUxMIGZyb20gdGhlCitzeXN0ZW0gbWVtb3J5IGFsbG9jYXRvciBvciBmcm9tIHlvdXIgcmVwbGFjZW1lbnQgbWFsbG9jX2ZuKCkuCisKK0lucHV0L091dHB1dCBpbiBsaWJwbmcgaXMgZG9uZSB0aHJvdWdoIHBuZ19yZWFkKCkgYW5kIHBuZ193cml0ZSgpLAord2hpY2ggY3VycmVudGx5IGp1c3QgY2FsbCBmcmVhZCgpIGFuZCBmd3JpdGUoKS4gIFRoZSBGSUxFICogaXMgc3RvcmVkIGluCitwbmdfc3RydWN0IGFuZCBpcyBpbml0aWFsaXplZCB2aWEgcG5nX2luaXRfaW8oKS4gIElmIHlvdSB3aXNoIHRvIGNoYW5nZQordGhlIG1ldGhvZCBvZiBJL08sIHRoZSBsaWJyYXJ5IHN1cHBsaWVzIGNhbGxiYWNrcyB0aGF0IHlvdSBjYW4gc2V0Cit0aHJvdWdoIHRoZSBmdW5jdGlvbiBwbmdfc2V0X3JlYWRfZm4oKSBhbmQgcG5nX3NldF93cml0ZV9mbigpIGF0IHJ1bgordGltZSwgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZSBwbmdfaW5pdF9pbygpIGZ1bmN0aW9uLiAgVGhlc2UgZnVuY3Rpb25zCithbHNvIHByb3ZpZGUgYSB2b2lkIHBvaW50ZXIgdGhhdCBjYW4gYmUgcmV0cmlldmVkIHZpYSB0aGUgZnVuY3Rpb24KK3BuZ19nZXRfaW9fcHRyKCkuICBGb3IgZXhhbXBsZToKKworICAgIHBuZ19zZXRfcmVhZF9mbihwbmdfc3RydWN0cCByZWFkX3B0ciwKKyAgICAgICAgdm9pZHAgcmVhZF9pb19wdHIsIHBuZ19yd19wdHIgcmVhZF9kYXRhX2ZuKQorCisgICAgcG5nX3NldF93cml0ZV9mbihwbmdfc3RydWN0cCB3cml0ZV9wdHIsCisgICAgICAgIHZvaWRwIHdyaXRlX2lvX3B0ciwgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuLAorICAgICAgICBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbik7CisKKyAgICB2b2lkcCByZWFkX2lvX3B0ciA9IHBuZ19nZXRfaW9fcHRyKHJlYWRfcHRyKTsKKyAgICB2b2lkcCB3cml0ZV9pb19wdHIgPSBwbmdfZ2V0X2lvX3B0cih3cml0ZV9wdHIpOworCitUaGUgcmVwbGFjZW1lbnQgSS9PIGZ1bmN0aW9ucyBtdXN0IGhhdmUgcHJvdG90eXBlcyBhcyBmb2xsb3dzOgorCisgICAgdm9pZCB1c2VyX3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOworICAgIHZvaWQgdXNlcl93cml0ZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCk7CisgICAgdm9pZCB1c2VyX2ZsdXNoX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0cik7CisKK1N1cHBseWluZyBOVUxMIGZvciB0aGUgcmVhZCwgd3JpdGUsIG9yIGZsdXNoIGZ1bmN0aW9ucyBzZXRzIHRoZW0gYmFjawordG8gdXNpbmcgdGhlIGRlZmF1bHQgQyBzdHJlYW0gZnVuY3Rpb25zLiAgSXQgaXMgYW4gZXJyb3IgdG8gcmVhZCBmcm9tCithIHdyaXRlIHN0cmVhbSwgYW5kIHZpY2UgdmVyc2EuCisKK0Vycm9yIGhhbmRsaW5nIGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkuCitFcnJvcnMgaGFuZGxlZCB0aHJvdWdoIHBuZ19lcnJvcigpIGFyZSBmYXRhbCwgbWVhbmluZyB0aGF0IHBuZ19lcnJvcigpCitzaG91bGQgbmV2ZXIgcmV0dXJuIHRvIGl0cyBjYWxsZXIuICBDdXJyZW50bHksIHRoaXMgaXMgaGFuZGxlZCB2aWEKK3NldGptcCgpIGFuZCBsb25nam1wKCkgKHVubGVzcyB5b3UgaGF2ZSBjb21waWxlZCBsaWJwbmcgd2l0aAorUE5HX1NFVEpNUF9OT1RfU1VQUE9SVEVELCBpbiB3aGljaCBjYXNlIGl0IGlzIGhhbmRsZWQgdmlhIFBOR19BQk9SVCgpKSwKK2J1dCB5b3UgY291bGQgY2hhbmdlIHRoaXMgdG8gZG8gdGhpbmdzIGxpa2UgZXhpdCgpIGlmIHlvdSBzaG91bGQgd2lzaC4KKworT24gbm9uLWZhdGFsIGVycm9ycywgcG5nX3dhcm5pbmcoKSBpcyBjYWxsZWQKK3RvIHByaW50IGEgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiBjb250cm9sIHJldHVybnMgdG8gdGhlIGNhbGxpbmcgY29kZS4KK0J5IGRlZmF1bHQgcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkgcHJpbnQgYSBtZXNzYWdlIG9uIHN0ZGVyciB2aWEKK2ZwcmludGYoKSB1bmxlc3MgdGhlIGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aCBQTkdfTk9fQ09OU09MRV9JTyBkZWZpbmVkCisoYmVjYXVzZSB5b3UgZG9uJ3Qgd2FudCB0aGUgbWVzc2FnZXMpIG9yIFBOR19OT19TVERJTyBkZWZpbmVkIChiZWNhdXNlCitmcHJpbnRmKCkgaXNuJ3QgYXZhaWxhYmxlKS4gIElmIHlvdSB3aXNoIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGVycm9yCitmdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHVwIHlvdXIgb3duIG1lc3NhZ2UgY2FsbGJhY2tzLiAgVGhlc2UKK2Z1bmN0aW9ucyBhcmUgbm9ybWFsbHkgc3VwcGxpZWQgYXQgdGhlIHRpbWUgdGhhdCB0aGUgcG5nX3N0cnVjdCBpcyBjcmVhdGVkLgorSXQgaXMgYWxzbyBwb3NzaWJsZSB0byByZWRpcmVjdCBlcnJvcnMgYW5kIHdhcm5pbmdzIHRvIHlvdXIgb3duIHJlcGxhY2VtZW50CitmdW5jdGlvbnMgYWZ0ZXIgcG5nX2NyZWF0ZV8qX3N0cnVjdCgpIGhhcyBiZWVuIGNhbGxlZCBieSBjYWxsaW5nOgorCisgICAgcG5nX3NldF9lcnJvcl9mbihwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICBwbmdfdm9pZHAgZXJyb3JfcHRyLCBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLAorICAgICAgICBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm4pOworCisgICAgcG5nX3ZvaWRwIGVycm9yX3B0ciA9IHBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpOworCitJZiBOVUxMIGlzIHN1cHBsaWVkIGZvciBlaXRoZXIgZXJyb3JfZm4gb3Igd2FybmluZ19mbiwgdGhlbiB0aGUgbGlicG5nCitkZWZhdWx0IGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCwgY2FsbGluZyBmcHJpbnRmKCkgYW5kL29yIGxvbmdqbXAoKSBpZiBhCitwcm9ibGVtIGlzIGVuY291bnRlcmVkLiAgVGhlIHJlcGxhY2VtZW50IGVycm9yIGZ1bmN0aW9ucyBzaG91bGQgaGF2ZQorcGFyYW1ldGVycyBhcyBmb2xsb3dzOgorCisgICAgdm9pZCB1c2VyX2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tc2cpOworICAgIHZvaWQgdXNlcl93YXJuaW5nX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21zZyk7CisKK1RoZSBtb3RpdmF0aW9uIGJlaGluZCB1c2luZyBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpIGlzIHRoZSBDKysgdGhyb3cgYW5kCitjYXRjaCBleGNlcHRpb24gaGFuZGxpbmcgbWV0aG9kcy4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgbXVjaCBlYXNpZXIgdG8gd3JpdGUsCithcyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGV2ZXJ5IHJldHVybiBjb2RlIG9mIGV2ZXJ5IGZ1bmN0aW9uIGNhbGwuCitIb3dldmVyLCB0aGVyZSBhcmUgc29tZSB1bmNlcnRhaW50aWVzIGFib3V0IHRoZSBzdGF0dXMgb2YgbG9jYWwgdmFyaWFibGVzCithZnRlciBhIGxvbmdqbXAsIHNvIHRoZSB1c2VyIG1heSB3YW50IHRvIGJlIGNhcmVmdWwgYWJvdXQgZG9pbmcgYW55dGhpbmcgYWZ0ZXIKK3NldGptcCByZXR1cm5zIG5vbi16ZXJvIGJlc2lkZXMgcmV0dXJuaW5nIGl0c2VsZi4gIENvbnN1bHQgeW91ciBjb21waWxlcgorZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgRm9yIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoLCB5b3UgbWF5IHdpc2gKK3RvIHVzZSB0aGUgImNleGNlcHQiIGZhY2lsaXR5IChzZWUgaHR0cDovL2NleGNlcHQuc291cmNlZm9yZ2UubmV0KS4KKworQ3VzdG9tIGNodW5rcworCitJZiB5b3UgbmVlZCB0byByZWFkIG9yIHdyaXRlIGN1c3RvbSBjaHVua3MsIHlvdSBtYXkgbmVlZCB0byBnZXQgZGVlcGVyCitpbnRvIHRoZSBsaWJwbmcgY29kZS4gIFRoZSBsaWJyYXJ5IG5vdyBoYXMgbWVjaGFuaXNtcyBmb3Igc3RvcmluZworYW5kIHdyaXRpbmcgY2h1bmtzIG9mIHVua25vd24gdHlwZTsgeW91IGNhbiBldmVuIGRlY2xhcmUgY2FsbGJhY2tzCitmb3IgY3VzdG9tIGNodW5rcy4gIEhvZXd2ZXIsIHRoaXMgbWF5IG5vdCBiZSBnb29kIGVub3VnaCBpZiB0aGUKK2xpYnJhcnkgY29kZSBpdHNlbGYgbmVlZHMgdG8ga25vdyBhYm91dCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB5b3VyCitjaHVuayBhbmQgZXhpc3RpbmcgYGludHJpbnNpYycgY2h1bmtzLgorCitJZiB5b3UgbmVlZCB0byB3cml0ZSBhIG5ldyBpbnRyaW5zaWMgY2h1bmssIGZpcnN0IHJlYWQgdGhlIFBORworc3BlY2lmaWNhdGlvbi4gQWNxdWlyZSBhIGZpcnN0IGxldmVsIG9mCit1bmRlcnN0YW5kaW5nIG9mIGhvdyBpdCB3b3Jrcy4gIFBheSBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byB0aGUKK3NlY3Rpb25zIHRoYXQgZGVzY3JpYmUgY2h1bmsgbmFtZXMsIGFuZCBsb29rIGF0IGhvdyBvdGhlciBjaHVua3Mgd2VyZQorZGVzaWduZWQsIHNvIHlvdSBjYW4gZG8gdGhpbmdzIHNpbWlsYXJseS4gIFNlY29uZCwgY2hlY2sgb3V0IHRoZQorc2VjdGlvbnMgb2YgbGlicG5nIHRoYXQgcmVhZCBhbmQgd3JpdGUgY2h1bmtzLiAgVHJ5IHRvIGZpbmQgYSBjaHVuawordGhhdCBpcyBzaW1pbGFyIHRvIHlvdXJzIGFuZCB1c2UgaXQgYXMgYSB0ZW1wbGF0ZS4gIE1vcmUgZGV0YWlscyBjYW4KK2JlIGZvdW5kIGluIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGNvZGUuICBJdCBpcyBiZXN0IHRvIGhhbmRsZSB1bmtub3duCitjaHVua3MgaW4gYSBnZW5lcmljIG1ldGhvZCwgdmlhIGNhbGxiYWNrIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBieQorbW9kaWZ5aW5nIGxpYnBuZyBmdW5jdGlvbnMuCisKK0lmIHlvdSB3aXNoIHRvIHdyaXRlIHlvdXIgb3duIHRyYW5zZm9ybWF0aW9uIGZvciB0aGUgZGF0YSwgbG9vayB0aHJvdWdoCit0aGUgcGFydCBvZiB0aGUgY29kZSB0aGF0IGRvZXMgdGhlIHRyYW5zZm9ybWF0aW9ucywgYW5kIGNoZWNrIG91dCBzb21lIG9mCit0aGUgc2ltcGxlciBvbmVzIHRvIGdldCBhbiBpZGVhIG9mIGhvdyB0aGV5IHdvcmsuICBUcnkgdG8gZmluZCBhIHNpbWlsYXIKK3RyYW5zZm9ybWF0aW9uIHRvIHRoZSBvbmUgeW91IHdhbnQgdG8gYWRkIGFuZCBjb3B5IG9mZiBvZiBpdC4gIE1vcmUgZGV0YWlscworY2FuIGJlIGZvdW5kIGluIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGNvZGUgaXRzZWxmLgorCitDb25maWd1cmluZyBmb3IgMTYgYml0IHBsYXRmb3JtcworCitZb3Ugd2lsbCB3YW50IHRvIGxvb2sgaW50byB6Y29uZi5oIHRvIHRlbGwgemxpYiAoYW5kIHRodXMgbGlicG5nKSB0aGF0CitpdCBjYW5ub3QgYWxsb2NhdGUgbW9yZSB0aGVuIDY0SyBhdCBhIHRpbWUuICBFdmVuIGlmIHlvdSBjYW4sIHRoZSBtZW1vcnkKK3dvbid0IGJlIGFjY2Vzc2libGUuICBTbyBsaW1pdCB6bGliIGFuZCBsaWJwbmcgdG8gNjRLIGJ5IGRlZmluaW5nIE1BWFNFR182NEsuCisKK0NvbmZpZ3VyaW5nIGZvciBET1MKKworRm9yIERPUyB1c2VycyB3aG8gb25seSBoYXZlIGFjY2VzcyB0byB0aGUgbG93ZXIgNjQwSywgeW91IHdpbGwKK2hhdmUgdG8gbGltaXQgemxpYidzIG1lbW9yeSB1c2FnZSB2aWEgYSBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbCgpCitjYWxsLiAgU2VlIHpsaWIuaCBvciB6Y29uZi5oIGluIHRoZSB6bGliIGxpYnJhcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0NvbmZpZ3VyaW5nIGZvciBNZWRpdW0gTW9kZWwKKworTGlicG5nJ3Mgc3VwcG9ydCBmb3IgbWVkaXVtIG1vZGVsIGhhcyBiZWVuIHRlc3RlZCBvbiBtb3N0IG9mIHRoZSBwb3B1bGFyCitjb21waWxlcnMuICBNYWtlIHN1cmUgTUFYU0VHXzY0SyBnZXRzIGRlZmluZWQsIFVTRV9GQVJfS0VZV09SRCBnZXRzCitkZWZpbmVkLCBhbmQgRkFSIGdldHMgZGVmaW5lZCB0byBmYXIgaW4gcG5nY29uZi5oLCBhbmQgeW91IHNob3VsZCBiZQorYWxsIHNldC4gIEV2ZXJ5dGhpbmcgaW4gdGhlIGxpYnJhcnkgKGV4Y2VwdCBmb3IgemxpYidzIHN0cnVjdHVyZSkgaXMKK2V4cGVjdGluZyBmYXIgZGF0YS4gIFlvdSBtdXN0IHVzZSB0aGUgdHlwZWRlZnMgd2l0aCB0aGUgcCBvciBwcCBvbgordGhlIGVuZCBmb3IgcG9pbnRlcnMgKG9yIGF0IGxlYXN0IGxvb2sgYXQgdGhlbSBhbmQgYmUgY2FyZWZ1bCkuICBNYWtlCitub3RlIHRoYXQgdGhlIHJvd3Mgb2YgZGF0YSBhcmUgZGVmaW5lZCBhcyBwbmdfYnl0ZXBwLCB3aGljaCBpcyBhbgordW5zaWduZWQgY2hhciBmYXIgKiBmYXIgKi4KKworQ29uZmlndXJpbmcgZm9yIGd1aS93aW5kb3dpbmcgcGxhdGZvcm1zOgorCitZb3Ugd2lsbCBuZWVkIHRvIHdyaXRlIG5ldyBlcnJvciBhbmQgd2FybmluZyBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlIEdVSQoraW50ZXJmYWNlLCBhcyBkZXNjcmliZWQgcHJldmlvdXNseSwgYW5kIHNldCB0aGVtIHRvIGJlIHRoZSBlcnJvciBhbmQKK3dhcm5pbmcgZnVuY3Rpb25zIGF0IHRoZSB0aW1lIHRoYXQgcG5nX2NyZWF0ZV8qX3N0cnVjdCgpIGlzIGNhbGxlZCwKK2luIG9yZGVyIHRvIGhhdmUgdGhlbSBhdmFpbGFibGUgZHVyaW5nIHRoZSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uCitUaGV5IGNhbiBiZSBjaGFuZ2VkIGxhdGVyIHZpYSBwbmdfc2V0X2Vycm9yX2ZuKCkuICBPbiBzb21lIGNvbXBpbGVycywKK3lvdSBtYXkgYWxzbyBoYXZlIHRvIGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRvcnMgKHBuZ19tYWxsb2MsIGV0Yy4pLgorCitDb25maWd1cmluZyBmb3IgY29tcGlsZXIgeHh4OgorCitBbGwgaW5jbHVkZXMgZm9yIGxpYnBuZyBhcmUgaW4gcG5nY29uZi5oLiAgSWYgeW91IG5lZWQgdG8gYWRkL2NoYW5nZS9kZWxldGUKK2FuIGluY2x1ZGUsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LiAgVGhlIGluY2x1ZGVzIHRoYXQgYXJlIG5vdAorbmVlZGVkIG91dHNpZGUgbGlicG5nIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIFBOR19JTlRFUk5BTCBkZWZpbml0aW9uLAord2hpY2ggaXMgb25seSBkZWZpbmVkIGZvciB0aG9zZSByb3V0aW5lcyBpbnNpZGUgbGlicG5nIGl0c2VsZi4gIFRoZQorZmlsZXMgaW4gbGlicG5nIHByb3BlciBvbmx5IGluY2x1ZGUgcG5nLmgsIHdoaWNoIGluY2x1ZGVzIHBuZ2NvbmYuaC4KKworQ29uZmlndXJpbmcgemxpYjoKKworVGhlcmUgYXJlIHNwZWNpYWwgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY29tcHJlc3Npb24uICBQZXJoYXBzIHRoZQorbW9zdCB1c2VmdWwgb25lIGNoYW5nZXMgdGhlIGNvbXByZXNzaW9uIGxldmVsLCB3aGljaCBjdXJyZW50bHkgdXNlcworaW5wdXQgY29tcHJlc3Npb24gdmFsdWVzIGluIHRoZSByYW5nZSAwIC0gOS4gIFRoZSBsaWJyYXJ5IG5vcm1hbGx5Cit1c2VzIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIChaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSA2KS4gIFRlc3RzCitoYXZlIHNob3duIHRoYXQgZm9yIGEgbGFyZ2UgbWFqb3JpdHkgb2YgaW1hZ2VzLCBjb21wcmVzc2lvbiB2YWx1ZXMgaW4KK3RoZSByYW5nZSAzLTYgY29tcHJlc3MgbmVhcmx5IGFzIHdlbGwgYXMgaGlnaGVyIGxldmVscywgYW5kIGRvIHNvIG11Y2gKK2Zhc3Rlci4gIEZvciBvbmxpbmUgYXBwbGljYXRpb25zIGl0IG1heSBiZSBkZXNpcmFibGUgdG8gaGF2ZSBtYXhpbXVtIHNwZWVkCisoWl9CRVNUX1NQRUVEID0gMSkuICBXaXRoIHZlcnNpb25zIG9mIHpsaWIgYWZ0ZXIgdjAuOTksIHlvdSBjYW4gYWxzbworc3BlY2lmeSBubyBjb21wcmVzc2lvbiAoWl9OT19DT01QUkVTU0lPTiA9IDApLCBidXQgdGhpcyB3b3VsZCBjcmVhdGUKK2ZpbGVzIGxhcmdlciB0aGFuIGp1c3Qgc3RvcmluZyB0aGUgcmF3IGJpdG1hcC4gIFlvdSBjYW4gc3BlY2lmeSB0aGUKK2NvbXByZXNzaW9uIGxldmVsIGJ5IGNhbGxpbmc6CisKKyAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKKworQW5vdGhlciB1c2VmdWwgb25lIGlzIHRvIHJlZHVjZSB0aGUgbWVtb3J5IGxldmVsIHVzZWQgYnkgdGhlIGxpYnJhcnkuCitUaGUgbWVtb3J5IGxldmVsIGRlZmF1bHRzIHRvIDgsIGJ1dCBpdCBjYW4gYmUgbG93ZXJlZCBpZiB5b3UgYXJlCitzaG9ydCBvbiBtZW1vcnkgKHJ1bm5pbmcgRE9TLCBmb3IgZXhhbXBsZSwgd2hlcmUgeW91IG9ubHkgaGF2ZSA2NDBLKS4KK05vdGUgdGhhdCB0aGUgbWVtb3J5IGxldmVsIGRvZXMgaGF2ZSBhbiBlZmZlY3Qgb24gY29tcHJlc3Npb247IGFtb25nCitvdGhlciB0aGluZ3MsIGxvd2VyIGxldmVscyB3aWxsIHJlc3VsdCBpbiBzZWN0aW9ucyBvZiBpbmNvbXByZXNzaWJsZQorZGF0YSBiZWluZyBlbWl0dGVkIGluIHNtYWxsZXIgc3RvcmVkIGJsb2Nrcywgd2l0aCBhIGNvcnJlc3BvbmRpbmdseQorbGFyZ2VyIHJlbGF0aXZlIG92ZXJoZWFkIG9mIHVwIHRvIDE1JSBpbiB0aGUgd29yc3QgY2FzZS4KKworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKKworVGhlIG90aGVyIGZ1bmN0aW9ucyBhcmUgZm9yIGNvbmZpZ3VyaW5nIHpsaWIuICBUaGV5IGFyZSBub3QgcmVjb21tZW5kZWQKK2ZvciBub3JtYWwgdXNlIGFuZCBtYXkgcmVzdWx0IGluIHdyaXRpbmcgYW4gaW52YWxpZCBQTkcgZmlsZS4gIFNlZQoremxpYi5oIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdoYXQgdGhlc2UgbWVhbi4KKworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kocG5nX3B0ciwKKyAgICAgICAgc3RyYXRlZ3kpOworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwKKyAgICAgICAgd2luZG93X2JpdHMpOworICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIG1ldGhvZCk7CisgICAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfcHRyLCBzaXplKTsKKworQ29udHJvbGxpbmcgcm93IGZpbHRlcmluZworCitJZiB5b3Ugd2FudCB0byBjb250cm9sIHdoZXRoZXIgbGlicG5nIHVzZXMgZmlsdGVyaW5nIG9yIG5vdCwgd2hpY2gKK2ZpbHRlcnMgYXJlIHVzZWQsIGFuZCBob3cgaXQgZ29lcyBhYm91dCBwaWNraW5nIHJvdyBmaWx0ZXJzLCB5b3UKK2NhbiBjYWxsIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMuICBUaGUgc2VsZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uCitvZiByb3cgZmlsdGVycyBjYW4gaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgc2l6ZSBhbmQKK2VuY29kaW5nIHNwZWVkIGFuZCBhIHNvbWV3aGF0IGxlc3NlciBpbXBhY3Qgb24gdGhlIGRlY29kaW5nIHNwZWVkCitvZiBhbiBpbWFnZS4gIEZpbHRlcmluZyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIFJHQiBhbmQgZ3JheXNjYWxlCitpbWFnZXMgKHdpdGggYW5kIHdpdGhvdXQgYWxwaGEpLCBidXQgbm90IGZvciBwYWxldHRlZCBpbWFnZXMgbm9yCitmb3IgYW55IGltYWdlcyB3aXRoIGJpdCBkZXB0aHMgbGVzcyB0aGFuIDggYml0cy9waXhlbC4KKworVGhlICdtZXRob2QnIHBhcmFtZXRlciBzZXRzIHRoZSBtYWluIGZpbHRlcmluZyBtZXRob2QsIHdoaWNoIGlzCitjdXJyZW50bHkgb25seSAnMCcgaW4gdGhlIFBORyAxLjIgc3BlY2lmaWNhdGlvbi4gIFRoZSAnZmlsdGVycycKK3BhcmFtZXRlciBzZXRzIHdoaWNoIGZpbHRlcihzKSwgaWYgYW55LCBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaAorc2NhbmxpbmUuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIFBOR19BTExfRklMVEVSUyBhbmQgUE5HX05PX0ZJTFRFUlMKK3RvIHR1cm4gZmlsdGVyaW5nIG9uIGFuZCBvZmYsIHJlc3BlY3RpdmVseS4KKworSW5kaXZpZHVhbCBmaWx0ZXIgdHlwZXMgYXJlIFBOR19GSUxURVJfTk9ORSwgUE5HX0ZJTFRFUl9TVUIsCitQTkdfRklMVEVSX1VQLCBQTkdfRklMVEVSX0FWRywgUE5HX0ZJTFRFUl9QQUVUSCwgd2hpY2ggY2FuIGJlIGJpdHdpc2UKK09SZWQgdG9nZXRoZXIgd2l0aCAnfCcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWx0ZXJzIHRvIHVzZS4KK1RoZXNlIGZpbHRlcnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24uCitJZiB5b3UgaW50ZW5kIHRvIGNoYW5nZSB0aGUgZmlsdGVyIHR5cGUgZHVyaW5nIHRoZSBjb3Vyc2Ugb2Ygd3JpdGluZwordGhlIGltYWdlLCB5b3Ugc2hvdWxkIHN0YXJ0IHdpdGggZmxhZ3Mgc2V0IGZvciBhbGwgb2YgdGhlIGZpbHRlcnMKK3lvdSBpbnRlbmQgdG8gdXNlIHNvIHRoYXQgbGlicG5nIGNhbiBpbml0aWFsaXplIGl0cyBpbnRlcm5hbAorc3RydWN0dXJlcyBhcHByb3ByaWF0ZWx5IGZvciBhbGwgb2YgdGhlIGZpbHRlciB0eXBlcy4gIChOb3RlIHRoYXQgdGhpcworbWVhbnMgdGhlIGZpcnN0IHJvdyBtdXN0IGFsd2F5cyBiZSBhZGFwdGl2ZWx5IGZpbHRlcmVkLCBiZWNhdXNlIGxpYnBuZworY3VycmVudGx5IGRvZXMgbm90IGFsbG9jYXRlIHRoZSBmaWx0ZXIgYnVmZmVycyB1bnRpbCBwbmdfd3JpdGVfcm93KCkKK2lzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuKQorCisgICAgZmlsdGVycyA9IFBOR19GSUxURVJfTk9ORSB8IFBOR19GSUxURVJfU1VCCisgICAgICAgICAgICAgIFBOR19GSUxURVJfVVAgfCBQTkdfRklMVEVSX0FWRSB8CisgICAgICAgICAgICAgIFBOR19GSUxURVJfUEFFVEggfCBQTkdfQUxMX0ZJTFRFUlM7CisKKyAgICBwbmdfc2V0X2ZpbHRlcihwbmdfcHRyLCBQTkdfRklMVEVSX1RZUEVfQkFTRSwKKyAgICAgICBmaWx0ZXJzKTsKKyAgICAgICAgICAgICAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgY2FuIGFsc28gYmUKKyAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HIGlmIHlvdSBhcmUKKyAgICAgICAgICAgICAgd3JpdGluZyBhIFBORyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORworICAgICAgICAgICAgICBkYXRhc3RyZWFtLiAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSB0aGUKKyAgICAgICAgICAgICAgc2FtZSBhcyB0aGUgdmFsdWUgb2YgZmlsdGVyX21ldGhvZCB1c2VkCisgICAgICAgICAgICAgIGluIHBuZ19zZXRfSUhEUigpLgorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGluZmx1ZW5jZSBob3cgbGlicG5nIGNob29zZXMgZnJvbSBhbW9uZyB0aGUKK2F2YWlsYWJsZSBmaWx0ZXJzLiAgVGhpcyBpcyBkb25lIGluIG9uZSBvciBib3RoIG9mIHR3byB3YXlzIC0gYnkKK3RlbGxpbmcgaXQgaG93IGltcG9ydGFudCBpdCBpcyB0byBrZWVwIHRoZSBzYW1lIGZpbHRlciBmb3Igc3VjY2Vzc2l2ZQorcm93cywgYW5kIGJ5IHRlbGxpbmcgaXQgdGhlIHJlbGF0aXZlIGNvbXB1dGF0aW9uYWwgY29zdHMgb2YgdGhlIGZpbHRlcnMuCisKKyAgICBkb3VibGUgd2VpZ2h0c1szXSA9IHsxLjUsIDEuMywgMS4xfSwKKyAgICAgICBjb3N0c1tQTkdfRklMVEVSX1ZBTFVFX0xBU1RdID0KKyAgICAgICB7MS4wLCAxLjMsIDEuMywgMS41LCAxLjd9OworCisgICAgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcyhwbmdfcHRyLAorICAgICAgIFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVELCAzLAorICAgICAgIHdlaWdodHMsIGNvc3RzKTsKKworVGhlIHdlaWdodHMgYXJlIG11bHRpcGx5aW5nIGZhY3RvcnMgdGhhdCBpbmRpY2F0ZSB0byBsaWJwbmcgdGhhdCB0aGUKK3JvdyBmaWx0ZXIgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBzdWNjZXNzaXZlIHJvd3MgdW5sZXNzIGFub3RoZXIgcm93IGZpbHRlcgoraXMgdGhhdCBtYW55IHRpbWVzIGJldHRlciB0aGFuIHRoZSBwcmV2aW91cyBmaWx0ZXIuICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwKK2lmIHRoZSBwcmV2aW91cyAzIGZpbHRlcnMgd2VyZSBTVUIsIFNVQiwgTk9ORSwgdGhlIFNVQiBmaWx0ZXIgY291bGQgaGF2ZSBhCisic3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIiAxLjUgeCAxLjMgdGltZXMgaGlnaGVyIHRoYW4gb3RoZXIgZmlsdGVycworYW5kIHN0aWxsIGJlIGNob3Nlbiwgd2hpbGUgdGhlIE5PTkUgZmlsdGVyIGNvdWxkIGhhdmUgYSBzdW0gMS4xIHRpbWVzCitoaWdoZXIgdGhhbiBvdGhlciBmaWx0ZXJzIGFuZCBzdGlsbCBiZSBjaG9zZW4uICBVbnNwZWNpZmllZCB3ZWlnaHRzIGFyZQordGFrZW4gdG8gYmUgMS4wLCBhbmQgdGhlIHNwZWNpZmllZCB3ZWlnaHRzIHNob3VsZCBwcm9iYWJseSBiZSBkZWNsaW5pbmcKK2xpa2UgdGhvc2UgYWJvdmUgaW4gb3JkZXIgdG8gZW1waGFzaXplIHJlY2VudCBmaWx0ZXJzIG92ZXIgb2xkZXIgZmlsdGVycy4KKworVGhlIGZpbHRlciBjb3N0cyBzcGVjaWZ5IGZvciBlYWNoIGZpbHRlciB0eXBlIGEgcmVsYXRpdmUgZGVjb2RpbmcgY29zdAordG8gYmUgY29uc2lkZXJlZCB3aGVuIHNlbGVjdGluZyByb3cgZmlsdGVycy4gIFRoaXMgbWVhbnMgdGhhdCBmaWx0ZXJzCit3aXRoIGhpZ2hlciBjb3N0cyBhcmUgbGVzcyBsaWtlbHkgdG8gYmUgY2hvc2VuIG92ZXIgZmlsdGVycyB3aXRoIGxvd2VyCitjb3N0cywgdW5sZXNzIHRoZWlyICJzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMiIGlzIHRoYXQgbXVjaCBzbWFsbGVyLgorVGhlIGNvc3RzIGRvIG5vdCBuZWNlc3NhcmlseSByZWZsZWN0IHRoZSBleGFjdCBjb21wdXRhdGlvbmFsIHNwZWVkcyBvZgordGhlIHZhcmlvdXMgZmlsdGVycywgc2luY2UgdGhpcyB3b3VsZCB1bmR1bHkgaW5mbHVlbmNlIHRoZSBmaW5hbCBpbWFnZQorc2l6ZS4KKworTm90ZSB0aGF0IHRoZSBudW1iZXJzIGFib3ZlIHdlcmUgaW52ZW50ZWQgcHVyZWx5IGZvciB0aGlzIGV4YW1wbGUgYW5kCithcmUgZ2l2ZW4gb25seSB0byBoZWxwIGV4cGxhaW4gdGhlIGZ1bmN0aW9uIHVzYWdlLiAgTGl0dGxlIHRlc3RpbmcgaGFzCitiZWVuIGRvbmUgdG8gZmluZCBvcHRpbXVtIHZhbHVlcyBmb3IgZWl0aGVyIHRoZSBjb3N0cyBvciB0aGUgd2VpZ2h0cy4KKworUmVtb3ZpbmcgdW53YW50ZWQgb2JqZWN0IGNvZGUKKworVGhlcmUgYXJlIGEgYnVuY2ggb2YgI2RlZmluZSdzIGluIHBuZ2NvbmYuaCB0aGF0IGNvbnRyb2wgd2hhdCBwYXJ0cyBvZgorbGlicG5nIGFyZSBjb21waWxlZC4gIEFsbCB0aGUgZGVmaW5lcyBlbmQgaW4gX1NVUFBPUlRFRC4gIElmIHlvdSBhcmUKK25ldmVyIGdvaW5nIHRvIHVzZSBhIGNhcGFiaWxpdHksIHlvdSBjYW4gY2hhbmdlIHRoZSAjZGVmaW5lIHRvICN1bmRlZgorYmVmb3JlIHJlY29tcGlsaW5nIGxpYnBuZyBhbmQgc2F2ZSB5b3Vyc2VsZiBjb2RlIGFuZCBkYXRhIHNwYWNlLCBvcgoreW91IGNhbiB0dXJuIG9mZiBpbmRpdmlkdWFsIGNhcGFiaWxpdGllcyB3aXRoIGRlZmluZXMgdGhhdCBiZWdpbiB3aXRoCitQTkdfTk9fLgorCitZb3UgY2FuIGFsc28gdHVybiBhbGwgb2YgdGhlIHRyYW5zZm9ybXMgYW5kIGFuY2lsbGFyeSBjaHVuayBjYXBhYmlsaXRpZXMKK29mZiBlbiBtYXNzZSB3aXRoIGNvbXBpbGVyIGRpcmVjdGl2ZXMgdGhhdCBkZWZpbmUKK1BOR19OT19SRUFEW29yIFdSSVRFXV9UUkFOU0ZPUk1TLCBvciBQTkdfTk9fUkVBRFtvciBXUklURV1fQU5DSUxMQVJZX0NIVU5LUywKK29yIGFsbCBmb3VyLAorYWxvbmcgd2l0aCBkaXJlY3RpdmVzIHRvIHR1cm4gb24gYW55IG9mIHRoZSBjYXBhYmlsaXRpZXMgdGhhdCB5b3UgZG8KK3dhbnQuICBUaGUgUE5HX05PX1JFQURbb3IgV1JJVEVdX1RSQU5TRk9STVMgZGlyZWN0aXZlcyBkaXNhYmxlCit0aGUgZXh0cmEgdHJhbnNmb3JtYXRpb25zIGJ1dCBzdGlsbCBsZWF2ZSB0aGUgbGlicmFyeSBmdWxseSBjYXBhYmxlIG9mIHJlYWRpbmcKK2FuZCB3cml0aW5nIFBORyBmaWxlcyB3aXRoIGFsbCBrbm93biBwdWJsaWMgY2h1bmtzCitVc2Ugb2YgdGhlIFBOR19OT19SRUFEW29yIFdSSVRFXV9BTkNJTExBUllfQ0hVTktTIGRpcmVjdGl2ZQorcHJvZHVjZXMgYSBsaWJyYXJ5IHRoYXQgaXMgaW5jYXBhYmxlIG9mIHJlYWRpbmcgb3Igd3JpdGluZyBhbmNpbGxhcnkgY2h1bmtzLgorSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIHByb2dyZXNzaXZlIHJlYWRpbmcgY2FwYWJpbGl0eSwgeW91IGNhbgordHVybiB0aGF0IG9mZiB3aXRoIFBOR19OT19QUk9HUkVTU0lWRV9SRUFEIChkb24ndCBjb25mdXNlCit0aGlzIHdpdGggdGhlIElOVEVSTEFDSU5HIGNhcGFiaWxpdHksIHdoaWNoIHlvdSdsbCBzdGlsbCBoYXZlKS4KKworQWxsIHRoZSByZWFkaW5nIGFuZCB3cml0aW5nIHNwZWNpZmljIGNvZGUgYXJlIGluIHNlcGFyYXRlIGZpbGVzLCBzbyB0aGUKK2xpbmtlciBzaG91bGQgb25seSBncmFiIHRoZSBmaWxlcyBpdCBuZWVkcy4gIEhvd2V2ZXIsIGlmIHlvdSB3YW50IHRvCittYWtlIHN1cmUsIG9yIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBzdGFuZCBhbG9uZSBsaWJyYXJ5LCBhbGwgdGhlCityZWFkaW5nIGZpbGVzIHN0YXJ0IHdpdGggcG5nciBhbmQgYWxsIHRoZSB3cml0aW5nIGZpbGVzIHN0YXJ0IHdpdGgKK3BuZ3cuICBUaGUgZmlsZXMgdGhhdCBkb24ndCBtYXRjaCBlaXRoZXIgKGxpa2UgcG5nLmMsIHBuZ3RyYW5zLmMsIGV0Yy4pCithcmUgdXNlZCBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLCBhbmQgYWx3YXlzIG5lZWQgdG8gYmUgaW5jbHVkZWQuCitUaGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGlzIGluIHBuZ3ByZWFkLmMKKworSWYgeW91IGFyZSBjcmVhdGluZyBvciBkaXN0cmlidXRpbmcgYSBkeW5hbWljYWxseSBsaW5rZWQgbGlicmFyeSAoYSAuc28KK29yIERMTCBmaWxlKSwgeW91IHNob3VsZCBub3QgcmVtb3ZlIG9yIGRpc2FibGUgYW55IHBhcnRzIG9mIHRoZSBsaWJyYXJ5LAorYXMgdGhpcyB3aWxsIGNhdXNlIGFwcGxpY2F0aW9ucyBsaW5rZWQgd2l0aCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlCitsaWJyYXJ5IHRvIGZhaWwgaWYgdGhleSBjYWxsIGZ1bmN0aW9ucyBub3QgYXZhaWxhYmxlIGluIHlvdXIgbGlicmFyeS4KK1RoZSBzaXplIG9mIHRoZSBsaWJyYXJ5IGl0c2VsZiBzaG91bGQgbm90IGJlIGFuIGlzc3VlLCBiZWNhdXNlIG9ubHkKK3Rob3NlIHNlY3Rpb25zIHRoYXQgYXJlIGFjdHVhbGx5IHVzZWQgd2lsbCBiZSBsb2FkZWQgaW50byBtZW1vcnkuCisKK1JlcXVlc3RpbmcgZGVidWcgcHJpbnRvdXQKKworVGhlIG1hY3JvIGRlZmluaXRpb24gUE5HX0RFQlVHIGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgZGVidWdnaW5nCitwcmludG91dC4gIFNldCBpdCB0byBhbiBpbnRlZ2VyIHZhbHVlIGluIHRoZSByYW5nZSAwIHRvIDMuICBIaWdoZXIKK251bWJlcnMgcmVzdWx0IGluIGluY3JlYXNpbmcgYW1vdW50cyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUKK2luZm9ybWF0aW9uIGlzIHByaW50ZWQgdG8gdGhlICJzdGRlcnIiIGZpbGUsIHVubGVzcyBhbm90aGVyIGZpbGUKK25hbWUgaXMgc3BlY2lmaWVkIGluIHRoZSBQTkdfREVCVUdfRklMRSBtYWNybyBkZWZpbml0aW9uLgorCitXaGVuIFBOR19ERUJVRyA+IDAsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIChtYWNyb3MpIGJlY29tZSBhdmFpbGFibGU6CisKKyAgIHBuZ19kZWJ1ZyhsZXZlbCwgbWVzc2FnZSkKKyAgIHBuZ19kZWJ1ZzEobGV2ZWwsIG1lc3NhZ2UsIHAxKQorICAgcG5nX2RlYnVnMihsZXZlbCwgbWVzc2FnZSwgcDEsIHAyKQorCitpbiB3aGljaCAibGV2ZWwiIGlzIGNvbXBhcmVkIHRvIFBOR19ERUJVRyB0byBkZWNpZGUgd2hldGhlciB0byBwcmludAordGhlIG1lc3NhZ2UsICJtZXNzYWdlIiBpcyB0aGUgZm9ybWF0dGVkIHN0cmluZyB0byBiZSBwcmludGVkLAorYW5kIHAxIGFuZCBwMiBhcmUgcGFyYW1ldGVycyB0aGF0IGFyZSB0byBiZSBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nCithY2NvcmRpbmcgdG8gcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcgZGlyZWN0aXZlcy4gIEZvciBleGFtcGxlLAorCisgICBwbmdfZGVidWcxKDIsICJmb289JWRcbiIsIGZvbyk7CisKK2lzIGV4cGFuZGVkIHRvCisKKyAgIGlmKFBOR19ERUJVRyA+IDIpCisgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsICJmb289JWRcbiIsIGZvbyk7CisKK1doZW4gUE5HX0RFQlVHIGlzIGRlZmluZWQgYnV0IGlzIHplcm8sIHRoZSBtYWNyb3MgYXJlbid0IGRlZmluZWQsIGJ1dCB5b3UKK2NhbiBzdGlsbCB1c2UgUE5HX0RFQlVHIHRvIGNvbnRyb2wgeW91ciBvd24gZGVidWdnaW5nOgorCisgICAjaWZkZWYgUE5HX0RFQlVHCisgICAgICAgZnByaW50ZihzdGRlcnIsIC4uLgorICAgI2VuZGlmCisKK1doZW4gUE5HX0RFQlVHID0gMSwgdGhlIG1hY3JvcyBhcmUgZGVmaW5lZCwgYnV0IG9ubHkgcG5nX2RlYnVnIHN0YXRlbWVudHMKK2hhdmluZyBsZXZlbCA9IDAgd2lsbCBiZSBwcmludGVkLiAgVGhlcmUgYXJlbid0IGFueSBzdWNoIHN0YXRlbWVudHMgaW4KK3RoaXMgdmVyc2lvbiBvZiBsaWJwbmcsIGJ1dCBpZiB5b3UgaW5zZXJ0IHNvbWUgdGhleSB3aWxsIGJlIHByaW50ZWQuCisKK1ZJLiAgUnVudGltZSBvcHRpbWl6YXRpb24KKworQSBuZXcgZmVhdHVyZSBpbiBsaWJwbmcgMS4yLjAgaXMgdGhlIGFiaWxpdHkgdG8gZHluYW1pY2FsbHkgc3dpdGNoIGJldHdlZW4KK3N0YW5kYXJkIGFuZCBvcHRpbWl6ZWQgdmVyc2lvbnMgb2Ygc29tZSByb3V0aW5lcy4gIEN1cnJlbnRseSB0aGVzZSBhcmUKK2xpbWl0ZWQgdG8gdGhyZWUgY29tcHV0YXRpb25hbGx5IGludGVuc2l2ZSB0YXNrcyB3aGVuIHJlYWRpbmcgUE5HIGZpbGVzOgorZGVjb2Rpbmcgcm93IGZpbHRlcnMsIGV4cGFuZGluZyBpbnRlcmxhY2luZywgYW5kIGNvbWJpbmluZyBpbnRlcmxhY2VkIG9yCit0cmFuc3BhcmVudCByb3cgZGF0YSB3aXRoIHByZXZpb3VzIHJvdyBkYXRhLiAgQ3VycmVudGx5IHRoZSBvcHRpbWl6ZWQKK3ZlcnNpb25zIGFyZSBhdmFpbGFibGUgb25seSBmb3IgeDg2IChJbnRlbCwgQU1ELCBldGMuKSBwbGF0Zm9ybXMgd2l0aAorTU1YIHN1cHBvcnQsIHRob3VnaCB0aGlzIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zLiAgKEZvciBleGFtcGxlLAordGhlIG5vbi1NTVggYXNzZW1ibGVyIG9wdGltaXphdGlvbnMgZm9yIHpsaWIgbWlnaHQgYmVjb21lIHNpbWlsYXJseQorcnVudGltZS1zZWxlY3RhYmxlIGluIGZ1dHVyZSByZWxlYXNlcywgaW4gd2hpY2ggY2FzZSBsaWJwbmcgY291bGQgYmUKK2V4dGVuZGVkIHRvIHN1cHBvcnQgdGhlbS4gIEFsdGVybmF0aXZlbHksIHRoZSBjb21waWxlLXRpbWUgY2hvaWNlIG9mCitmbG9hdGluZy1wb2ludCB2ZXJzdXMgaW50ZWdlciByb3V0aW5lcyBmb3IgZ2FtbWEgY29ycmVjdGlvbiBtaWdodCBiZWNvbWUKK3J1bnRpbWUtc2VsZWN0YWJsZS4pCisKK0JlY2F1c2Ugc3VjaCBvcHRpbWl6YXRpb25zIHRlbmQgdG8gYmUgdmVyeSBwbGF0Zm9ybS0gYW5kIGNvbXBpbGVyLWRlcGVuZGVudCwKK2JvdGggaW4gaG93IHRoZXkgYXJlIHdyaXR0ZW4gYW5kIGluIGhvdyB0aGV5IHBlcmZvcm0sIHRoZSBuZXcgcnVudGltZSBjb2RlCitpbiBsaWJwbmcgaGFzIGJlZW4gd3JpdHRlbiB0byBhbGxvdyBwcm9ncmFtcyB0byBxdWVyeSwgZW5hYmxlLCBhbmQgZGlzYWJsZQorZWl0aGVyIHNwZWNpZmljIG9wdGltaXphdGlvbnMgb3IgYWxsIHN1Y2ggb3B0aW1pemF0aW9ucy4gIEZvciBleGFtcGxlLCB0bworZW5hYmxlIGFsbCBwb3NzaWJsZSBvcHRpbWl6YXRpb25zIChiZWFyaW5nIGluIG1pbmQgdGhhdCBzb21lICJvcHRpbWl6YXRpb25zIgorbWF5IGFjdHVhbGx5IHJ1biBtb3JlIHNsb3dseSBpbiByYXJlIGNhc2VzKToKKworICAgICNpZiBkZWZpbmVkKFBOR19MSUJQTkdfVkVSKSAmJiAoUE5HX0xJQlBOR19WRVIgPj0gMTAyMDApCisgICAgICAgcG5nX3VpbnRfMzIgbWFzaywgZmxhZ3M7CisKKyAgICAgICBmbGFncyA9IHBuZ19nZXRfYXNtX2ZsYWdzKHBuZ19wdHIpOworICAgICAgIG1hc2sgPSBwbmdfZ2V0X2FzbV9mbGFnbWFzayhQTkdfU0VMRUNUX1JFQUQgfCBQTkdfU0VMRUNUX1dSSVRFKTsKKyAgICAgICBwbmdfc2V0X2FzbV9mbGFncyhwbmdfcHRyLCBmbGFncyB8IG1hc2spOworICAgICNlbmRpZgorCitUbyBlbmFibGUgb25seSBvcHRpbWl6YXRpb25zIHJlbGV2YW50IHRvIHJlYWRpbmcgUE5HcywgdXNlIFBOR19TRUxFQ1RfUkVBRAorYnkgaXRzZWxmIHdoZW4gY2FsbGluZyBwbmdfZ2V0X2FzbV9mbGFnbWFzaygpOyBzaW1pbGFybHkgZm9yIG9wdGltaXppbmcKK29ubHkgd3JpdGluZy4gIFRvIGRpc2FibGUgYWxsIG9wdGltaXphdGlvbnM6CisKKyAgICAjaWYgZGVmaW5lZChQTkdfTElCUE5HX1ZFUikgJiYgKFBOR19MSUJQTkdfVkVSID49IDEwMjAwKQorICAgICAgIGZsYWdzID0gcG5nX2dldF9hc21fZmxhZ3MocG5nX3B0cik7CisgICAgICAgbWFzayA9IHBuZ19nZXRfYXNtX2ZsYWdtYXNrKFBOR19TRUxFQ1RfUkVBRCB8IFBOR19TRUxFQ1RfV1JJVEUpOworICAgICAgIHBuZ19zZXRfYXNtX2ZsYWdzKHBuZ19wdHIsIGZsYWdzICYgfm1hc2spOworICAgICNlbmRpZgorCitUbyBlbmFibGUgb3IgZGlzYWJsZSBvbmx5IE1NWC1yZWxhdGVkIGZlYXR1cmVzLCB1c2UgcG5nX2dldF9tbXhfZmxhZ21hc2soKQoraW4gcGxhY2Ugb2YgcG5nX2dldF9hc21fZmxhZ21hc2soKS4gIFRoZSBtbXggdmVyc2lvbiB0YWtlcyBvbmUgYWRkaXRpb25hbAorcGFyYW1ldGVyOgorCisgICAgI2lmIGRlZmluZWQoUE5HX0xJQlBOR19WRVIpICYmIChQTkdfTElCUE5HX1ZFUiA+PSAxMDIwMCkKKyAgICAgICBpbnQgc2VsZWN0aW9uID0gUE5HX1NFTEVDVF9SRUFEIHwgUE5HX1NFTEVDVF9XUklURTsKKyAgICAgICBpbnQgY29tcGlsZXJJRDsKKworICAgICAgIG1hc2sgPSBwbmdfZ2V0X21teF9mbGFnbWFzayhzZWxlY3Rpb24sICZjb21waWxlcklEKTsKKyAgICAjZW5kaWYKKworT24gcmV0dXJuLCBjb21waWxlcklEIHdpbGwgaW5kaWNhdGUgd2hpY2ggdmVyc2lvbiBvZiB0aGUgTU1YIGFzc2VtYmxlcgorb3B0aW1pemF0aW9ucyB3YXMgY29tcGlsZWQuICBDdXJyZW50bHkgdHdvIGZsYXZvcnMgZXhpc3Q6ICBNaWNyb3NvZnQKK1Zpc3VhbCBDKysgKGNvbXBpbGVySUQgPT0gMSkgYW5kIEdOVSBDIChhLmsuYS4gZ2NjL2dhcywgY29tcGlsZXJJRCA9PSAyKS4KK09uIG5vbi14ODYgcGxhdGZvcm1zIG9yIG9uIHN5c3RlbXMgY29tcGlsZWQgd2l0aG91dCBNTVggb3B0aW1pemF0aW9ucywgYQordmFsdWUgb2YgLTEgaXMgdXNlZC4KKworTm90ZSB0aGF0IGJvdGggcG5nX2dldF9hc21fZmxhZ21hc2soKSBhbmQgcG5nX2dldF9tbXhfZmxhZ21hc2soKSByZXR1cm4KK2FsbCB2YWxpZCwgc2V0dGFibGUgb3B0aW1pemF0aW9uIGJpdHMgZm9yIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHRoYXQncworY3VycmVudGx5IGluIHVzZS4gIEluIHRoZSBjYXNlIG9mIHNoYXJlZCAoZHluYW1pY2FsbHkgbGlua2VkKSBsaWJyYXJpZXMsCit0aGlzIG1heSBpbmNsdWRlIG9wdGltaXphdGlvbnMgdGhhdCBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIHRoZSBjb2RlIHdhcword3JpdHRlbiBhbmQgY29tcGlsZWQuICBJdCBpcyBhbHNvIHBvc3NpYmxlLCBvZiBjb3Vyc2UsIHRvIGVuYWJsZSBvbmx5IGtub3duLAorc3BlY2lmaWMgb3B0aW1pemF0aW9uczsgZm9yIGV4YW1wbGU6CisKKyAgICAjaWYgZGVmaW5lZChQTkdfTElCUE5HX1ZFUikgJiYgKFBOR19MSUJQTkdfVkVSID49IDEwMjAwKQorICAgICAgIGZsYWdzID0gUE5HX0FTTV9GTEFHX01NWF9SRUFEX0NPTUJJTkVfUk9XICBcCisgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFICAgIFwKKyAgICAgICAgICAgICB8IFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfU1VCICAgXAorICAgICAgICAgICAgIHwgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9VUCAgICBcCisgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRyAgIFwKKyAgICAgICAgICAgICB8IFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfUEFFVEggOworICAgICAgIHBuZ19zZXRfYXNtX2ZsYWdzKHBuZ19wdHIsIGZsYWdzKTsKKyAgICAjZW5kaWYKKworVGhpcyBtZXRob2Qgd291bGQgZW5hYmxlIG9ubHkgdGhlIE1NWCByZWFkLW9wdGltaXphdGlvbnMgYXZhaWxhYmxlIGF0IHRoZQordGltZSBvZiBsaWJwbmcgMS4yLjAncyByZWxlYXNlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBsYXRlciB2ZXJzaW9uIG9mCit0aGUgRExMIHdlcmUgYWN0dWFsbHkgYmVpbmcgdXNlZC4gIChBbHNvIG5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgZGlkIG5vdAorZXhpc3QgaW4gdmVyc2lvbnMgb2xkZXIgdGhhbiAxLjIuMCwgc28gYW55IGF0dGVtcHQgdG8gcnVuIGEgZHluYW1pY2FsbHkKK2xpbmtlZCBhcHAgb24gc3VjaCBhbiBvbGRlciB2ZXJzaW9uIHdvdWxkIGZhaWwuKQorCitUbyBkZXRlcm1pbmUgd2hldGhlciB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIE1NWCBpbnN0cnVjdGlvbnMgYXQgYWxsLCB1c2UKK3RoZSBwbmdfbW14X3N1cHBvcnQoKSBmdW5jdGlvbjoKKworICAgICNpZiBkZWZpbmVkKFBOR19MSUJQTkdfVkVSKSAmJiAoUE5HX0xJQlBOR19WRVIgPj0gMTAyMDApCisgICAgICAgbW14c3VwcG9ydCA9IHBuZ19tbXhfc3VwcG9ydCgpOworICAgICNlbmRpZgorCitJdCByZXR1cm5zIC0xIGlmIE1NWCBzdXBwb3J0IGlzIG5vdCBjb21waWxlZCBpbnRvIGxpYnBuZywgMCBpZiBNTVggY29kZQoraXMgY29tcGlsZWQgYnV0IE1NWCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBwcm9jZXNzb3IsIG9yIDEgaWYgTU1YIHN1cHBvcnQKK2lzIGZ1bGx5IGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBwbmdfbW14X3N1cHBvcnQoKSwgcG5nX2dldF9tbXhfZmxhZ21hc2soKSwKK2FuZCBwbmdfZ2V0X2FzbV9mbGFnbWFzaygpIGFsbCBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgYWxsb2NhdGluZyBhbmQgaW5pLQordGlhbGl6aW5nIGFueSBQTkcgc3RydWN0dXJlcyAoZm9yIGV4YW1wbGUsIGFzIHBhcnQgb2YgYSB1c2FnZSBzY3JlZW4gb3IKKyJhYm91dCIgYm94KS4KKworVGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgYW4gYXBwbGljYXRpb24gZnJvbSB1c2luZyB0aGUKK3RocmVhZF91bnNhZmUgZmVhdHVyZXMsIGV2ZW4gaWYgbGlicG5nIHdhcyBidWlsdCB3aXRoIFBOR19USFJFQURfVU5TQUZFX09LCitkZWZpbmVkOgorCisjaWYgZGVmaW5lZChQTkdfVVNFX1BOR0dDQ1JEKSAmJiBkZWZpbmVkKFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQpIFwKKyAgJiYgZGVmaW5lZChQTkdfVEhSRUFEX1VOU0FGRV9PSykKKyAgICAvKiBEaXNhYmxlIHRocmVhZC11bnNhZmUgZmVhdHVyZXMgb2YgcG5nZ2NjcmQgKi8KKyAgICBpZiAocG5nX2FjY2Vzc192ZXJzaW9uKCkgPj0gMTAyMDApCisgICAgeworICAgICAgcG5nX3VpbnRfMzIgbW14X2Rpc2FibGVfbWFzayA9IDA7CisgICAgICBwbmdfdWludF8zMiBhc21fZmxhZ3M7CisKKyAgICAgIG1teF9kaXNhYmxlX21hc2sgfD0gKCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfQ09NQklORV9ST1cgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1NVQiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1BBRVRIICk7CisgICAgICBhc21fZmxhZ3MgPSBwbmdfZ2V0X2FzbV9mbGFncyhwbmdfcHRyKTsKKyAgICAgIHBuZ19zZXRfYXNtX2ZsYWdzKHBuZ19wdHIsIGFzbV9mbGFncyAmIH5tbXhfZGlzYWJsZV9tYXNrKTsKKyAgICB9CisjZW5kaWYKKworRm9yIG1vcmUgZXh0ZW5zaXZlIGV4YW1wbGVzIG9mIHJ1bnRpbWUgcXVlcnlpbmcsIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcKK29mIG9wdGltaXplZCBmZWF0dXJlcywgc2VlIGNvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYyBpbiB0aGUgbGlicG5nCitzb3VyY2UtY29kZSBkaXN0cmlidXRpb24uCisKK1ZJSS4gIE1ORyBzdXBwb3J0CisKK1RoZSBNTkcgc3BlY2lmaWNhdGlvbiAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvbW5nKSBhbGxvd3MKK2NlcnRhaW4gZXh0ZW5zaW9ucyB0byBQTkcgZm9yIFBORyBpbWFnZXMgdGhhdCBhcmUgZW1iZWRkZWQgaW4gTU5HIGRhdGFzdHJlYW1zLgorTGlicG5nIGNhbiBzdXBwb3J0IHNvbWUgb2YgdGhlc2UgZXh0ZW5zaW9ucy4gIFRvIGVuYWJsZSB0aGVtLCB1c2UgdGhlCitwbmdfcGVybWl0X21uZ19mZWF0dXJlcygpIGZ1bmN0aW9uOgorCisgICBmZWF0dXJlX3NldCA9IHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKHBuZ19wdHIsIG1hc2spCisgICBtYXNrIGlzIGEgcG5nX3VpbnRfMzIgY29udGFpbmluZyB0aGUgbG9naWNhbCBPUiBvZiB0aGUKKyAgICAgICAgZmVhdHVyZXMgeW91IHdhbnQgdG8gZW5hYmxlLiAgVGhlc2UgaW5jbHVkZQorICAgICAgICBQTkdfRkxBR19NTkdfRU1QVFlfUExURQorICAgICAgICBQTkdfRkxBR19NTkdfRklMVEVSXzY0CisgICAgICAgIFBOR19BTExfTU5HX0ZFQVRVUkVTCisgICBmZWF0dXJlX3NldCBpcyBhIHBuZ191aW50XzMyIHRoYXQgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mCisgICAgICB5b3VyIG1hc2sgd2l0aCB0aGUgc2V0IG9mIE1ORyBmZWF0dXJlcyB0aGF0IGlzCisgICAgICBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgbGlicG5nIHRoYXQgeW91IGFyZSB1c2luZy4KKworSXQgaXMgYW4gZXJyb3IgdG8gdXNlIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgYSBzdGFuZGFsb25lCitQTkcgZmlsZSB3aXRoIHRoZSBQTkcgOC1ieXRlIHNpZ25hdHVyZS4gIFRoZSBQTkcgZGF0YXN0cmVhbSBtdXN0IGJlIHdyYXBwZWQKK2luIGEgTU5HIGRhdGFzdHJlYW0uICBBcyBhIG1pbmltdW0sIGl0IG11c3QgaGF2ZSB0aGUgTU5HIDgtYnl0ZSBzaWduYXR1cmUKK2FuZCB0aGUgTUhEUiBhbmQgTUVORCBjaHVua3MuICBMaWJwbmcgZG9lcyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciB0aGVzZQorb3IgYW55IG90aGVyIE1ORyBjaHVua3M7IHlvdXIgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGl0cyBvd24gc3VwcG9ydCBmb3IKK3RoZW0uICBZb3UgbWF5IHdpc2ggdG8gY29uc2lkZXIgdXNpbmcgbGlibW5nIChhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cubGlibW5nLmNvbSkgaW5zdGVhZC4KKworVklJSS4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAwLjg4CisKK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IHZlcnNpb25zIG9mIGxpYnBuZyBsYXRlciB0aGFuIDAuOTYgYXJlIG5vdAorZGlzdHJpYnV0ZWQgYnkgdGhlIG9yaWdpbmFsIGxpYnBuZyBhdXRob3IsIEd1eSBTY2hhbG5hdCwgbm9yIGJ5CitBbmRyZWFzIERpbGdlciwgd2hvIGhhZCB0YWtlbiBvdmVyIGZyb20gR3V5IGR1cmluZyAxOTk2IGFuZCAxOTk3LCBhbmQKK2Rpc3RyaWJ1dGVkIHZlcnNpb25zIDAuODkgdGhyb3VnaCAwLjk2LCBidXQgcmF0aGVyIGJ5IGFub3RoZXIgbWVtYmVyCitvZiB0aGUgb3JpZ2luYWwgUE5HIEdyb3VwLCBHbGVubiBSYW5kZXJzLVBlaHJzb24uICBHdXkgYW5kIEFuZHJlYXMgYXJlCitzdGlsbCBhbGl2ZSBhbmQgd2VsbCwgYnV0IHRoZXkgaGF2ZSBtb3ZlZCBvbiB0byBvdGhlciB0aGluZ3MuCisKK1RoZSBvbGQgbGlicG5nIGZ1bmN0aW9ucyBwbmdfcmVhZF9pbml0KCksIHBuZ193cml0ZV9pbml0KCksCitwbmdfaW5mb19pbml0KCksIHBuZ19yZWFkX2Rlc3Ryb3koKSwgYW5kIHBuZ193cml0ZV9kZXN0cm95KCkgaGF2ZSBiZWVuCittb3ZlZCB0byBQTkdfSU5URVJOQUwgaW4gdmVyc2lvbiAwLjk1IHRvIGRpc2NvdXJhZ2UgdGhlaXIgdXNlLiAgVGhlc2UKK2Z1bmN0aW9ucyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmcgdmVyc2lvbiAyLjAuMC4KKworVGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgY3JlYXRpbmcgYW5kIGluaXRpYWxpemluZyB0aGUgbGlicG5nIHN0cnVjdHVyZXMgaXMKK3ZpYSB0aGUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpLCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpLCBhbmQKK3BuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKSBiZWNhdXNlIHRoZXkgaXNvbGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlcworZnJvbSB0aGUgYXBwbGljYXRpb24sIGFsbG93IHZlcnNpb24gZXJyb3IgY2hlY2tpbmcsIGFuZCBhbHNvIGFsbG93IHRoZQordXNlIG9mIGN1c3RvbSBlcnJvciBoYW5kbGluZyByb3V0aW5lcyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCB3aGljaAordGhlIG9sZCBmdW5jdGlvbnMgZG8gbm90LiAgVGhlIGZ1bmN0aW9ucyBwbmdfcmVhZF9kZXN0cm95KCkgYW5kCitwbmdfd3JpdGVfZGVzdHJveSgpIGRvIG5vdCBhY3R1YWxseSBmcmVlIHRoZSBtZW1vcnkgdGhhdCBsaWJwbmcKK2FsbG9jYXRlZCBmb3IgdGhlc2Ugc3RydWN0cywgYnV0IGp1c3QgcmVzZXQgdGhlIGRhdGEgc3RydWN0dXJlcywgc28gdGhleQorY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpIGFuZAorcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgaWYgeW91IGZlZWwgdGhlcmUgaXMgdG9vIG11Y2ggc3lzdGVtIG92ZXJoZWFkCithbGxvY2F0aW5nIGFuZCBmcmVlaW5nIHRoZSBwbmdfc3RydWN0IGZvciBlYWNoIGltYWdlIHJlYWQuCisKK1NldHRpbmcgdGhlIGVycm9yIGNhbGxiYWNrcyB2aWEgcG5nX3NldF9tZXNzYWdlX2ZuKCkgYmVmb3JlCitwbmdfcmVhZF9pbml0KCkgYXMgd2FzIHN1Z2dlc3RlZCBpbiBsaWJwbmctMC44OCBpcyBubyBsb25nZXIgc3VwcG9ydGVkCitiZWNhdXNlIHRoaXMgY2F1c2VkIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCB1c2UgY3VzdG9tIGVycm9yIGZ1bmN0aW9ucwordG8gZmFpbCBpZiB0aGUgcG5nX3B0ciB3YXMgbm90IGluaXRpYWxpemVkIHRvIHplcm8uICBJdCBpcyBzdGlsbCBwb3NzaWJsZQordG8gc2V0IHRoZSBlcnJvciBjYWxsYmFja3MgQUZURVIgcG5nX3JlYWRfaW5pdCgpLCBvciB0byBjaGFuZ2UgdGhlbSB3aXRoCitwbmdfc2V0X2Vycm9yX2ZuKCksIHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGZ1bmN0aW9uLCBidXQgd2l0aCBhIG5ldworbmFtZSB0byBmb3JjZSBjb21waWxhdGlvbiBlcnJvcnMgd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCB0cnkgdG8gdXNlIHRoZSBvbGQKK21ldGhvZC4KKworU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuMC43LCB5b3UgY2FuIGZpbmQgb3V0IHdoaWNoIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKK3lvdSBhcmUgdXNpbmcgYXQgcnVuLXRpbWU6CisKKyAgIHBuZ191aW50XzMyIGxpYnBuZ192biA9IHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIoKTsKKworVGhlIG51bWJlciBsaWJwbmdfdm4gaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgbWFqb3IgdmVyc2lvbiwgbWlub3IKK3ZlcnNpb24gd2l0aCBsZWFkaW5nIHplcm8sIGFuZCByZWxlYXNlIG51bWJlciB3aXRoIGxlYWRpbmcgemVybywKKyhlLmcuLCBsaWJwbmdfdm4gZm9yIHZlcnNpb24gMS4wLjcgaXMgMTAwMDcpLgorCitZb3UgY2FuIGFsc28gY2hlY2sgd2hpY2ggdmVyc2lvbiBvZiBwbmcuaCB5b3UgdXNlZCB3aGVuIGNvbXBpbGluZyB5b3VyCithcHBsaWNhdGlvbjoKKworICAgcG5nX3VpbnRfMzIgYXBwbGljYXRpb25fdm4gPSBQTkdfTElCUE5HX1ZFUjsKKworSVguIFkySyBDb21wbGlhbmNlIGluIGxpYnBuZworCitEZWNlbWJlciAzLCAyMDA0CisKK1NpbmNlIHRoZSBQTkcgRGV2ZWxvcG1lbnQgZ3JvdXAgaXMgYW4gYWQtaG9jIGJvZHksIHdlIGNhbid0IG1ha2UKK2FuIG9mZmljaWFsIGRlY2xhcmF0aW9uLgorCitUaGlzIGlzIHlvdXIgdW5vZmZpY2lhbCBhc3N1cmFuY2UgdGhhdCBsaWJwbmcgZnJvbSB2ZXJzaW9uIDAuNzEgYW5kCit1cHdhcmQgdGhyb3VnaCAxLjIuOCBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0IGVhcmxpZXIKK3ZlcnNpb25zIHdlcmUgYWxzbyBZMksgY29tcGxpYW50LgorCitMaWJwbmcgb25seSBoYXMgdGhyZWUgeWVhciBmaWVsZHMuICBPbmUgaXMgYSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciB0aGF0Cit3aWxsIGhvbGQgeWVhcnMgdXAgdG8gNjU1MzUuICBUaGUgb3RoZXIgdHdvIGhvbGQgdGhlIGRhdGUgaW4gdGV4dAorZm9ybWF0LCBhbmQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDk5OTkuCisKK1RoZSBpbnRlZ2VyIGlzCisgICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KKworVGhlIHN0cmluZ3MgYXJlCisgICAgInBuZ19jaGFycCB0aW1lX2J1ZmZlciIgaW4gcG5nX3N0cnVjdCBhbmQKKyAgICAibmVhcl90aW1lX2J1ZmZlciIsIHdoaWNoIGlzIGEgbG9jYWwgY2hhcmFjdGVyIHN0cmluZyBpbiBwbmcuYy4KKworVGhlcmUgYXJlIHNldmVuIHRpbWUtcmVsYXRlZCBmdW5jdGlvbnM6CisKKyAgICBwbmdfY29udmVydF90b19yZmNfMTEyMygpIGluIHBuZy5jCisgICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExNTIoKSBpbiBlcnJvcikKKyAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZAorICAgICAgaW4gcG5nd3JpdGUuYworICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgaW4gcG5nd3JpdGUuYworICAgIHBuZ19nZXRfdElNRSgpIGluIHBuZ2dldC5jCisgICAgcG5nX2hhbmRsZV90SU1FKCkgaW4gcG5ncnV0aWwuYywgY2FsbGVkIGluIHBuZ3JlYWQuYworICAgIHBuZ19zZXRfdElNRSgpIGluIHBuZ3NldC5jCisgICAgcG5nX3dyaXRlX3RJTUUoKSBpbiBwbmd3dXRpbC5jLCBjYWxsZWQgaW4gcG5nd3JpdGUuYworCitBbGwgYXBwZWFyIHRvIGhhbmRsZSBkYXRlcyBwcm9wZXJseSBpbiBhIFkySyBlbnZpcm9ubWVudC4gIFRoZQorcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmdW5jdGlvbiBjYWxscyBnbXRpbWUoKSB0byBjb252ZXJ0IGZyb20gc3lzdGVtCitjbG9jayB0aW1lLCB3aGljaCByZXR1cm5zICh5ZWFyIC0gMTkwMCksIHdoaWNoIHdlIHByb3Blcmx5IGNvbnZlcnQgdG8KK3RoZSBmdWxsIDQtZGlnaXQgeWVhci4gIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhcHBsaWNhdGlvbnMgdXNpbmcKK2xpYnBuZyBhcmUgbm90IHBhc3NpbmcgNC1kaWdpdCB5ZWFycyBpbnRvIHRoZSBwbmdfY29udmVydF90b19yZmNfMTEyMygpCitmdW5jdGlvbiwgb3IgdGhhdCB0aGV5IGFyZSBpbmNvcnJlY3RseSBwYXNzaW5nIG9ubHkgYSAyLWRpZ2l0IHllYXIKK2luc3RlYWQgb2YgInllYXIgLSAxOTAwIiBpbnRvIHRoZSBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZ1bmN0aW9uLAorYnV0IHRoaXMgaXMgbm90IHVuZGVyIG91ciBjb250cm9sLiAgVGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uIGhhcyBhbHdheXMKK3N0YXRlZCB0aGF0IGl0IHdvcmtzIHdpdGggNC1kaWdpdCB5ZWFycywgYW5kIHRoZSBBUElzIGhhdmUgYmVlbgorZG9jdW1lbnRlZCBhcyBzdWNoLgorCitUaGUgdElNRSBjaHVuayBpdHNlbGYgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgdXNlcyBhIDItYnl0ZSB1bnNpZ25lZAoraW50ZWdlciB0byBob2xkIHRoZSB5ZWFyLCBhbmQgY2FuIGhvbGQgeWVhcnMgYXMgbGFyZ2UgYXMgNjU1MzUuCisKK3psaWIsIHVwb24gd2hpY2ggbGlicG5nIGRlcGVuZHMsIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IGNvbnRhaW5zCitubyBkYXRlLXJlbGF0ZWQgY29kZS4KKworCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAgIGxpYnBuZyBtYWludGFpbmVyCisgICBQTkcgRGV2ZWxvcG1lbnQgR3JvdXAKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9saWJwbmcvbGlicG5ncGYuMyBiL2NvbTMyL2xpYi9saWJwbmcvbGlicG5ncGYuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmRhNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9saWJwbmdwZi4zCkBAIC0wLDAgKzEsODA2IEBACisuVEggTElCUE5HUEYgMyAiSnVuZSAyNiwgMjAxMCIKKy5TSCBOQU1FCitsaWJwbmcgXC0gUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKSBSZWZlcmVuY2UgTGlicmFyeSAxLjIuNDQKKyhwcml2YXRlIGZ1bmN0aW9ucykKKy5TSCBTWU5PUFNJUworXGZCI2luY2x1ZGUgPHBuZy5oPlxmUAorCitcZklcZkIKKworXGZCdm9pZCBwbmdfNjRiaXRfcHJvZHVjdCAobG9uZyBcZlBcZkl2MVxmUFxmQiwgbG9uZyBcZlBcZkl2MlxmUFxmQiwgdW5zaWduZWQgbG9uZyBcZkkqaGlfcHJvZHVjdCwKKworXGZCdW5zaWduZWQgbG9uZyBcZkkqbG9fcHJvZHVjdFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19idWlsZF9nYW1tYV90YWJsZSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUgKGludCBcZlBcZkliaXRfZGVwdGhcZlBcZkIsIHBuZ19jb2xvcnAgXGZJcGFsZXR0ZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfY2FsY3VsYXRlX2NyYyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXB0clxmUFxmQiwgcG5nX3NpemVfdCBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQmludCBwbmdfY2hlY2tfY0hSTV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF93aGl0ZV94XGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X3doaXRlX3lcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZklpbnRfcmVkX3hcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZklpbnRfcmVkX3lcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZklpbnRfZ3JlZW5feFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF9ncmVlbl95XGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X2JsdWVfeFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmSWludF9ibHVlX3lcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2NoZWNrX0lIRFIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkloZWlnaHRcZlBcZkIsIGludCBcZlBcZkliaXRfZGVwdGhcZlBcZkIsIGludCBcZlBcZkljb2xvcl90eXBlXGZQXGZCLCBpbnQgXGZQXGZJaW50ZXJsYWNlX3R5cGVcZlBcZkIsIGludCBcZlBcZkljb21wcmVzc2lvbl90eXBlXGZQXGZCLCBpbnQgXGZJZmlsdGVyX3R5cGVcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2NoZWNrX2NodW5rX25hbWUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZkljaHVua19uYW1lXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJwbmdfc2l6ZV90IHBuZ19jaGVja19rZXl3b3JkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJa2V5XGZQXGZCLCBwbmdfY2hhcnBwIFxmSW5ld19rZXlcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2NvbWJpbmVfcm93IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBpbnQgXGZJbWFza1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfY29ycmVjdF9wYWxldHRlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JwIFxmUFxmSXBhbGV0dGVcZlBcZkIsIGludCBcZkludW1fcGFsZXR0ZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCaW50IHBuZ19jcmNfZXJyb3IgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQmludCBwbmdfY3JjX2ZpbmlzaCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJc2tpcFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfY3JjX3JlYWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklidWZcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJwbmdfdm9pZHAgcG5nX2NyZWF0ZV9zdHJ1Y3QgKGludCBcZkl0eXBlXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJwbmdfdm9pZHAgcG5nX2NyZWF0ZV9zdHJ1Y3RfMiAoaW50IFxmUFxmSXR5cGVcZlBcZkIsIHBuZ19tYWxsb2NfcHRyIFxmUFxmSW1hbGxvY19mblxmUFxmQiwgcG5nX3ZvaWRwIFxmSW1lbV9wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2RlY29tcHJlc3NfY2h1bmsgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZkljb21wX3R5cGVcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkljaHVua2RhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZQXGZJY2h1bmtsZW5ndGhcZlBcZkIsIHBuZ19zaXplX3QgXGZQXGZJcHJlZml4X2xlbmd0aFxmUFxmQiwgcG5nX3NpemVfdCBcZkkqZGF0YV9sZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2Rlc3Ryb3lfc3RydWN0IChwbmdfdm9pZHAgXGZJc3RydWN0X3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZGVzdHJveV9zdHJ1Y3RfMiAocG5nX3ZvaWRwIFxmUFxmSXN0cnVjdF9wdHJcZlBcZkIsIHBuZ19mcmVlX3B0ciBcZlBcZklmcmVlX2ZuXGZQXGZCLCBwbmdfdm9pZHAgXGZJbWVtX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZG9fYmFja2dyb3VuZCAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZlBcZkl0cmFuc192YWx1ZXNcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZQXGZJYmFja2dyb3VuZFxmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZlBcZkliYWNrZ3JvdW5kXzFcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklnYW1tYV90YWJsZVxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWdhbW1hX2Zyb21fMVxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWdhbW1hX3RvXzFcZlBcZkIsIHBuZ191aW50XzE2cHAgXGZQXGZJZ2FtbWFfMTZcZlBcZkIsIHBuZ191aW50XzE2cHAgXGZQXGZJZ2FtbWFfMTZfZnJvbV8xXGZQXGZCLCBwbmdfdWludF8xNnBwIFxmUFxmSWdhbW1hXzE2X3RvXzFcZlBcZkIsIGludCBcZklnYW1tYV9zaGlmdFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZG9fYmdyIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb19jaG9wIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb19kaXRoZXIgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklwYWxldHRlX2xvb2t1cFxmUFxmQiwgcG5nX2J5dGVwIFxmSWRpdGhlcl9sb29rdXBcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2RvX2V4cGFuZCAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZkl0cmFuc192YWx1ZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZG9fZXhwYW5kX3BhbGV0dGUgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19jb2xvcnAgXGZQXGZJcGFsZXR0ZVxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXRyYW5zXGZQXGZCLCBpbnQgXGZJbnVtX3RyYW5zXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb19nYW1tYSAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWdhbW1hX3RhYmxlXGZQXGZCLCBwbmdfdWludF8xNnBwIFxmUFxmSWdhbW1hXzE2X3RhYmxlXGZQXGZCLCBpbnQgXGZJZ2FtbWFfc2hpZnRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2RvX2dyYXlfdG9fcmdiIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb19pbnZlcnQgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2RvX3BhY2sgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ191aW50XzMyIFxmSWJpdF9kZXB0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZG9fcGFja3N3YXAgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2RvX3JlYWRfZmlsbGVyIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklmaWxsZXJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWZsYWdzXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb19yZWFkX2ludGVybGFjZSAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgaW50IFxmUFxmSXBhc3NcZlBcZkIsIHBuZ191aW50XzMyIFxmSXRyYW5zZm9ybWF0aW9uc1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZG9fcmVhZF9pbnZlcnRfYWxwaGEgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2RvX3JlYWRfc3dhcF9hbHBoYSAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQmludCBwbmdfZG9fcmdiX3RvX2dyYXkgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2RvX3NoaWZ0IChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfY29sb3JfOHAgXGZJYml0X2RlcHRoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb19zdHJpcF9maWxsZXIgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ191aW50XzMyIFxmSWZsYWdzXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb19zd2FwIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb191bnBhY2sgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2RvX3Vuc2hpZnQgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19jb2xvcl84cCBcZklzaWdfYml0c1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZG9fd3JpdGVfaW50ZXJsYWNlIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBpbnQgXGZJcGFzc1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfZG9fd3JpdGVfaW52ZXJ0X2FscGhhIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb193cml0ZV9zd2FwX2FscGhhIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19kb193cml0ZV90cmFuc2Zvcm1hdGlvbnMgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgKnBuZ19mYXJfdG9fbmVhciAocG5nX3N0cnVjdHAgcG5nX3B0cixwbmdfdm9pZHAgXGZQXGZJcHRyXGZQXGZCLCBpbnQgXGZJY2hlY2tcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2ZsdXNoIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19oYW5kbGVfYktHRCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2hhbmRsZV9jSFJNIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfaGFuZGxlX2dBTUEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19oYW5kbGVfaElTVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2hhbmRsZV9JRU5EIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfaGFuZGxlX0lIRFIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19oYW5kbGVfaUNDUCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2hhbmRsZV9pVFh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfaGFuZGxlX29GRnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19oYW5kbGVfcENBTCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2hhbmRsZV9wSFlzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfaGFuZGxlX1BMVEUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19oYW5kbGVfc0JJVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2hhbmRsZV9zQ0FMIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfaGFuZGxlX3NQTFQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19oYW5kbGVfc1JHQiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2hhbmRsZV90RVh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfaGFuZGxlX3RJTUUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19oYW5kbGVfdFJOUyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2hhbmRsZV91bmtub3duIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfaGFuZGxlX3pUWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19pbmZvX2Rlc3Ryb3kgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfaW5pdF9tbXhfZmxhZ3MgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3Byb2Nlc3NfSURBVF9kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJYnVmZmVyXGZQXGZCLCBwbmdfc2l6ZV90IFxmSWJ1ZmZlcl9sZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3Byb2Nlc3Nfc29tZV9kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3B1c2hfY2hlY2tfY3JjIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19wdXNoX2NyY19maW5pc2ggKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3B1c2hfY3JjX3NraXAgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9maWxsX2J1ZmZlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWJ1ZmZlclxmUFxmQiwgcG5nX3NpemVfdCBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3B1c2hfaGFuZGxlX3RFWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19wdXNoX2hhbmRsZV91bmtub3duIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9oYW5kbGVfelRYdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3B1c2hfaGF2ZV9lbmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9oYXZlX2luZm8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9oYXZlX3JvdyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9wcm9jZXNzX3JvdyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9yZWFkX2NodW5rIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3B1c2hfcmVhZF9lbmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9yZWFkX0lEQVQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3B1c2hfcmVhZF9zaWcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9yZWFkX3RFWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9yZWFkX3pUWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcHVzaF9yZXN0b3JlX2J1ZmZlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWJ1ZmZlclxmUFxmQiwgcG5nX3NpemVfdCBcZklidWZmZXJfbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19wdXNoX3NhdmVfYnVmZmVyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJwbmdfdWludF8zMiBwbmdfcmVhZF9jaHVua19oZWFkZXIgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3JlYWRfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19yZWFkX2ZpbHRlcl9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklwcmV2X3Jvd1xmUFxmQiwgaW50IFxmSWZpbHRlclxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcmVhZF9maW5pc2hfcm93IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcmVhZF9zdGFydF9yb3cgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3JlYWRfdHJhbnNmb3JtX2luZm8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfcmVzZXRfY3JjIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJpbnQgcG5nX3NldF90ZXh0XzIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RleHRwIFxmUFxmSXRleHRfcHRyXGZQXGZCLCBpbnQgXGZJbnVtX3RleHRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX2NIUk0gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZkl3aGl0ZV94XGZQXGZCLCBkb3VibGUgXGZQXGZJd2hpdGVfeVxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZF94XGZQXGZCLCBkb3VibGUgXGZQXGZJcmVkX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklncmVlbl94XGZQXGZCLCBkb3VibGUgXGZQXGZJZ3JlZW5feVxmUFxmQiwgZG91YmxlIFxmUFxmSWJsdWVfeFxmUFxmQiwgZG91YmxlIFxmSWJsdWVfeVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfY0hSTV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJd2hpdGVfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJd2hpdGVfeVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJcmVkX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXJlZF95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklncmVlbl94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklncmVlbl95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklibHVlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmSWJsdWVfeVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9maWx0ZXJlZF9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZklmaWx0ZXJlZF9yb3dcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX2ZpbmRfZmlsdGVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfcm93X2luZm9wIFxmSXJvd19pbmZvXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9maW5pc2hfcm93IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9nQU1BIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBkb3VibGUgXGZJZmlsZV9nYW1tYVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfZ0FNQV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJaW50X2ZpbGVfZ2FtbWFcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX2hJU1QgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzE2cCBcZlBcZkloaXN0XGZQXGZCLCBpbnQgXGZJbnVtX2hpc3RcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX2lDQ1AgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkluYW1lXGZQXGZCLCBpbnQgXGZQXGZJY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXByb2ZpbGVcZlBcZkIsIGludCBcZklwcm9mbGVuXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9JREFUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJZGF0YVxmUFxmQiwgcG5nX3NpemVfdCBcZklsZW5ndGhcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX0lFTkQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX0lIRFIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkloZWlnaHRcZlBcZkIsIGludCBcZlBcZkliaXRfZGVwdGhcZlBcZkIsIGludCBcZlBcZkljb2xvcl90eXBlXGZQXGZCLCBpbnQgXGZQXGZJY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgaW50IFxmUFxmSWZpbHRlcl90eXBlXGZQXGZCLCBpbnQgXGZJaW50ZXJsYWNlX3R5cGVcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX2lUWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZkljb21wcmVzc2lvblxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSWtleVxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSWxhbmdcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl0cmFuc2xhdGVkX2tleVxmUFxmQiwgcG5nX2NoYXJwIFxmSXRleHRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX29GRnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXhfb2Zmc2V0XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl5X29mZnNldFxmUFxmQiwgaW50IFxmSXVuaXRfdHlwZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfcENBTCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXB1cnBvc2VcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJWDBcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJWDFcZlBcZkIsIGludCBcZlBcZkl0eXBlXGZQXGZCLCBpbnQgXGZQXGZJbnBhcmFtc1xmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXVuaXRzXGZQXGZCLCBwbmdfY2hhcnBwIFxmSXBhcmFtc1xmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfcEhZcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJeF9waXhlbHNfcGVyX3VuaXRcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXlfcGl4ZWxzX3Blcl91bml0XGZQXGZCLCBpbnQgXGZJdW5pdF90eXBlXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9QTFRFIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JwIFxmUFxmSXBhbGV0dGVcZlBcZkIsIHBuZ191aW50XzMyIFxmSW51bV9wYWxcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX3NCSVQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb2xvcl84cCBcZlBcZklzYml0XGZQXGZCLCBpbnQgXGZJY29sb3JfdHlwZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfc0NBTCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXVuaXRcZlBcZkIsIGRvdWJsZSBcZlBcZkl3aWR0aFxmUFxmQiwgZG91YmxlIFxmSWhlaWdodFxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfc0NBTF9zIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJdW5pdFxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfY2hhcnAgXGZJaGVpZ2h0XGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ193cml0ZV9zaWcgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX3NSR0IgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZklpbnRlbnRcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX3NQTFQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19zcGFsZXR0ZV9wIFxmSXBhbGV0dGVcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX3N0YXJ0X3JvdyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfdEVYdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSWtleVxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXRleHRcZlBcZkIsIHBuZ19zaXplX3QgXGZJdGV4dF9sZW5cZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX3RJTUUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ190aW1lcCBcZkltb2RfdGltZVxmUFxmQik7XGZQCisKK1xmSVxmQgorCitcZklcZkIKKworXGZCdm9pZCBwbmdfd3JpdGVfdFJOUyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXRyYW5zXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmUFxmSXZhbHVlc1xmUFxmQiwgaW50IFxmUFxmSW51bWJlclxmUFxmQiwgaW50IFxmSWNvbG9yX3R5cGVcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWQgcG5nX3dyaXRlX3pUWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklrZXlcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl0ZXh0XGZQXGZCLCBwbmdfc2l6ZV90IFxmUFxmSXRleHRfbGVuXGZQXGZCLCBpbnQgXGZJY29tcHJlc3Npb25cZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKK1xmQnZvaWRwZiBwbmdfemFsbG9jICh2b2lkcGYgXGZQXGZJcG5nX3B0clxmUFxmQiwgdUludCBcZlBcZklpdGVtc1xmUFxmQiwgdUludCBcZklzaXplXGZQXGZCKTtcZlAKKworXGZJXGZCCisKK1xmSVxmQgorCitcZkJ2b2lkIHBuZ196ZnJlZSAodm9pZHBmIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHZvaWRwZiBcZklwdHJcZlBcZkIpO1xmUAorCitcZklcZkIKKworXGZJXGZCCisKKy5TSCBERVNDUklQVElPTgorVGhlIGZ1bmN0aW9ucyBsaXN0ZWQgYWJvdmUgYXJlIHVzZWQgcHJpdmF0ZWx5IGJ5IGxpYnBuZworYW5kIGFyZSBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMuICBUaGV5IGFyZQorbm90ICJleHBvcnRlZCIgdG8gYXBwbGljYXRpb25zIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuICBUaGV5CithcmUgbGlzdGVkIGFscGhhYmV0aWNhbGx5IGhlcmUgYXMgYW4gYWlkIHRvIGxpYnBuZyBtYWludGFpbmVycy4KK1NlZSBwbmcuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBmdW5jdGlvbnMuCisKKy5TSCBTRUUgQUxTTworLklSIGxpYnBuZygzKSAiLCAiIHBuZyg1KQorLlNIIEFVVEhPUgorR2xlbm4gUmFuZGVycy1QZWhyc29uCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL3BuZy41IGIvY29tMzIvbGliL2xpYnBuZy9wbmcuNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDVjODBjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9wbmcuNQpAQCAtMCwwICsxLDc0IEBACisuVEggUE5HIDUgIkp1bmUgMjYsIDIwMTAiCisuU0ggTkFNRQorcG5nIFwtIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORykgZm9ybWF0CisuU0ggREVTQ1JJUFRJT04KK1BORyAoUG9ydGFibGUgTmV0d29yayBHcmFwaGljcykgaXMgYW4gZXh0ZW5zaWJsZSBmaWxlIGZvcm1hdCBmb3IgdGhlCitsb3NzbGVzcywgcG9ydGFibGUsIHdlbGwtY29tcHJlc3NlZCBzdG9yYWdlIG9mIHJhc3RlciBpbWFnZXMuIFBORyBwcm92aWRlcworYSBwYXRlbnQtZnJlZSByZXBsYWNlbWVudCBmb3IgR0lGIGFuZCBjYW4gYWxzbyByZXBsYWNlIG1hbnkKK2NvbW1vbiB1c2VzIG9mIFRJRkYuIEluZGV4ZWQtY29sb3IsIGdyYXlzY2FsZSwgYW5kIHRydWVjb2xvciBpbWFnZXMgYXJlCitzdXBwb3J0ZWQsIHBsdXMgYW4gb3B0aW9uYWwgYWxwaGEgY2hhbm5lbC4gU2FtcGxlIGRlcHRocyByYW5nZSBmcm9tCisxIHRvIDE2IGJpdHMuCisuYnIKKworUE5HIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2VsbCBpbiBvbmxpbmUgdmlld2luZyBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMgdGhlCitXb3JsZCBXaWRlIFdlYiwgc28gaXQgaXMgZnVsbHkgc3RyZWFtYWJsZSB3aXRoIGEgcHJvZ3Jlc3NpdmUgZGlzcGxheQorb3B0aW9uLiBQTkcgaXMgcm9idXN0LCBwcm92aWRpbmcgYm90aCBmdWxsIGZpbGUgaW50ZWdyaXR5IGNoZWNraW5nIGFuZAorZmFzdCwgc2ltcGxlIGRldGVjdGlvbiBvZiBjb21tb24gdHJhbnNtaXNzaW9uIGVycm9ycy4gQWxzbywgUE5HIGNhbiBzdG9yZQorZ2FtbWEgYW5kIGNocm9tYXRpY2l0eSBkYXRhIGZvciBpbXByb3ZlZCBjb2xvciBtYXRjaGluZyBvbiBoZXRlcm9nZW5lb3VzCitwbGF0Zm9ybXMuCisKKy5TSCAiU0VFIEFMU08iCisuSVIgbGlicG5nKDMpICIsICIgemxpYigzKSAiLCAiIGRlZmxhdGUoNSkgIiwgYW5kICIgemxpYig1KQorLkxQCitQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pLCBOb3ZlbWJlciAyMDAzOgorLklQCisuYnIKKyAgPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMC8KK1BORyAxLjIgc3BlY2lmaWNhdGlvbiwgSnVseSAxOTk5OgorLklQCisuYnIKK2h0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nCisuTFAKK1BORyAxLjAgc3BlY2lmaWNhdGlvbiwgT2N0b2JlciAxOTk2OgorLklQCisuYnIKK1JGQyAyMDgzCisuSVAKKy5icgorZnRwOi8vZnRwLnJmYy1lZGl0b3Iub3JnOi9pbi1ub3Rlcy9yZmMyMDgzLnR4dAorLmJyCitvciAoYXMgYSBXM0MgUmVjb21tZW5kYXRpb24pIGF0CisuYnIKK2h0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1wbmcuaHRtbAorLlNIIEFVVEhPUlMKK1RoaXMgbWFuIHBhZ2U6IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorLkxQCitQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gKFNlY29uZCBFZGl0aW9uKQorSW5mb3JtYXRpb24gdGVjaG5vbG9neSAtIENvbXB1dGVyIGdyYXBoaWNzIGFuZCBpbWFnZSBwcm9jZXNzaW5nIC0KK1BvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORyk6IEZ1bmN0aW9uYWwgc3BlY2lmaWNhdGlvbi4KK0lTTy9JRUMgMTU5NDg6MjAwMyAoRSkgKE5vdmVtYmVyIDEwLCAyMDAzKTogRGF2aWQgRHVjZSBhbmQgb3RoZXJzLgorLkxQCitQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gVmVyc2lvbiAxLjIgKEp1bHkgOCwgMTk5OSk6CitHbGVubiBSYW5kZXJzLVBlaHJzb24gYW5kIG90aGVycyAocG5nLWxpc3QpLgorLkxQCitQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gVmVyc2lvbiAxLjAgKE9jdG9iZXIgMSwgMTk5Nik6CitUaG9tYXMgQm91dGVsbCBhbmQgb3RoZXJzIChwbmctbGlzdCkuCisuTFAKKworCisuU0ggQ09QWVJJR0hUIE5PVElDRQorLkxQCitUaGlzIG1hbiBwYWdlIGlzIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IEdsZW5uIFJhbmRlcnMtUGVocnNvbi4gIFNlZSBwbmcuaAorZm9yIGNvbmRpdGlvbnMgb2YgdXNlIGFuZCBkaXN0cmlidXRpb24uCisuTFAKK1RoZSBQTkcgU3BlY2lmaWNhdGlvbiAoU2Vjb25kIEVkaXRpb24pIGlzCitDb3B5cmlnaHQgKGMpIDIwMDMgVzNDLiAoTUlULCBFUkNJTSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisuTFAKK1RoZSBQTkctMS4yIHNwZWNpZmljYXRpb24gaXMgY29weXJpZ2h0IChjKSAxOTk5IEdsZW5uIFJhbmRlcnMtUGVocnNvbi4KK1NlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY29uZGl0aW9ucyBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbi4KKy5MUAorVGhlIFBORy0xLjAgc3BlY2lmaWNhdGlvbiBpcyBjb3B5cmlnaHQgKGMpIDE5OTYgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKK1RlY2hub2xvZ3kuICBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGNvbmRpdGlvbnMgb2YgdXNlIGFuZCBkaXN0cmlidXRpb24uCisuTFAKKy5cIiBlbmQgb2YgbWFuIHBhZ2UKKwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9wbmcuYyBiL2NvbTMyL2xpYi9saWJwbmcvcG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkOTUzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvcG5nLmMKQEAgLTAsMCArMSwxMTAwIEBACisKKy8qIHBuZy5jIC0gbG9jYXRpb24gZm9yIGdlbmVyYWwgcHVycG9zZSBsaWJwbmcgZnVuY3Rpb25zCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuNDMgW0ZlYnJ1YXJ5IDI1LCAyMDEwXQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqLworCisjZGVmaW5lIFBOR19JTlRFUk5BTAorI2RlZmluZSBQTkdfTk9fRVhURVJOCisjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUworI2luY2x1ZGUgInBuZy5oIgorCisvKiBHZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yIGlmIHRoZXJlIGlzIGFuIG9sZCBwbmcuaCBpbiB0aGUgc2VhcmNoIHBhdGguICovCit0eXBlZGVmIHZlcnNpb25fMV8yXzQ0IFlvdXJfcG5nX2hfaXNfbm90X3ZlcnNpb25fMV8yXzQ0OworCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBDIGZpbGVzLiAgVGhpcyBoYWQgYmV0dGVyIG1hdGNoIHRoZSB2ZXJzaW9uCisgKiBzdHJpbmcgZGVmaW5lZCBpbiBwbmcuaC4KKyAqLworCisjaWZkZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCisvKiBwbmdfbGlicG5nX3ZlciB3YXMgY2hhbmdlZCB0byBhIGZ1bmN0aW9uIGluIHZlcnNpb24gMS4wLjVjICovCitQTkdfQ09OU1QgY2hhciBwbmdfbGlicG5nX3ZlclsxOF0gPSBQTkdfTElCUE5HX1ZFUl9TVFJJTkc7CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKworLyogcG5nX3NpZyB3YXMgY2hhbmdlZCB0byBhIGZ1bmN0aW9uIGluIHZlcnNpb24gMS4wLjVjICovCisvKiBQbGFjZSB0byBob2xkIHRoZSBzaWduYXR1cmUgc3RyaW5nIGZvciBhIFBORyBmaWxlLiAqLworUE5HX0NPTlNUIHBuZ19ieXRlIEZBUkRBVEEgcG5nX3NpZ1s4XSA9IHsxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwfTsKKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KKworLyogSW52b2tlIGdsb2JhbCBkZWNsYXJhdGlvbnMgZm9yIGNvbnN0YW50IHN0cmluZ3MgZm9yIGtub3duIGNodW5rIHR5cGVzICovCitQTkdfSUhEUjsKK1BOR19JREFUOworUE5HX0lFTkQ7CitQTkdfUExURTsKK1BOR19iS0dEOworUE5HX2NIUk07CitQTkdfZ0FNQTsKK1BOR19oSVNUOworUE5HX2lDQ1A7CitQTkdfaVRYdDsKK1BOR19vRkZzOworUE5HX3BDQUw7CitQTkdfc0NBTDsKK1BOR19wSFlzOworUE5HX3NCSVQ7CitQTkdfc1BMVDsKK1BOR19zUkdCOworUE5HX3RFWHQ7CitQTkdfdElNRTsKK1BOR190Uk5TOworUE5HX3pUWHQ7CisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKy8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCisKKy8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLworUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX3N0YXJ0W10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07CisKKy8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLworUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX2luY1tdID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OworCisvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCitQTkdfQ09OU1QgaW50IEZBUkRBVEEgcG5nX3Bhc3NfeXN0YXJ0W10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07CisKKy8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KK1BOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc195aW5jW10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07CisKKy8qIEhlaWdodCBvZiBpbnRlcmxhY2UgYmxvY2suICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZCAtIGlmIHlvdSBuZWVkCisgKiBpdCwgdW5jb21tZW50IGl0IGhlcmUgYW5kIGluIHBuZy5oCitQTkdfQ09OU1QgaW50IEZBUkRBVEEgcG5nX3Bhc3NfaGVpZ2h0W10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07CisqLworCisvKiBNYXNrIHRvIGRldGVybWluZSB3aGljaCBwaXhlbHMgYXJlIHZhbGlkIGluIGEgcGFzcyAqLworUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX21hc2tbXSA9CisgICAgezB4ODAsIDB4MDgsIDB4ODgsIDB4MjIsIDB4YWEsIDB4NTUsIDB4ZmZ9OworCisvKiBNYXNrIHRvIGRldGVybWluZSB3aGljaCBwaXhlbHMgdG8gb3ZlcndyaXRlIHdoaWxlIGRpc3BsYXlpbmcgKi8KK1BOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc19kc3BfbWFza1tdCisgICA9IHsweGZmLCAweDBmLCAweGZmLCAweDMzLCAweGZmLCAweDU1LCAweGZmfTsKKworI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIFBOR19VU0VfR0xPQkFMX0FSUkFZUyAqLworCisvKiBUZWxscyBsaWJwbmcgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGUgZmlyc3QgIm51bV9ieXRlcyIgYnl0ZXMKKyAqIG9mIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUuICBJZiB0aGUgUE5HIGRhdGEgaXMgZW1iZWRkZWQgaW50byBhbm90aGVyCisgKiBzdHJlYW0gd2UgY2FuIHNldCBudW1fYnl0ZXMgPSA4IHNvIHRoYXQgbGlicG5nIHdpbGwgbm90IGF0dGVtcHQgdG8gcmVhZAorICogb3Igd3JpdGUgYW55IG9mIHRoZSBtYWdpYyBieXRlcyBiZWZvcmUgaXQgc3RhcnRzIG9uIHRoZSBJSERSLgorICovCisKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NpZ19ieXRlcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbnVtX2J5dGVzKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3NpZ19ieXRlcyIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAobnVtX2J5dGVzID4gOCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVG9vIG1hbnkgYnl0ZXMgZm9yIFBORyBzaWduYXR1cmUuIik7CisKKyAgIHBuZ19wdHItPnNpZ19ieXRlcyA9IChwbmdfYnl0ZSkobnVtX2J5dGVzIDwgMCA/IDAgOiBudW1fYnl0ZXMpOworfQorCisvKiBDaGVja3Mgd2hldGhlciB0aGUgc3VwcGxpZWQgYnl0ZXMgbWF0Y2ggdGhlIFBORyBzaWduYXR1cmUuICBXZSBhbGxvdworICogY2hlY2tpbmcgbGVzcyB0aGFuIHRoZSBmdWxsIDgtYnl0ZSBzaWduYXR1cmUgc28gdGhhdCB0aG9zZSBhcHBzIHRoYXQKKyAqIGFscmVhZHkgcmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIG9mIGEgZmlsZSB0byBkZXRlcm1pbmUgdGhlIGZpbGUgdHlwZQorICogY2FuIHNpbXBseSBjaGVjayB0aGUgcmVtYWluaW5nIGJ5dGVzIGZvciBleHRyYSBhc3N1cmFuY2UuICBSZXR1cm5zCisgKiBhbiBpbnRlZ2VyIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHNpZyBpcyBmb3VuZCwKKyAqIHJlc3BlY3RpdmVseSwgdG8gYmUgbGVzcyB0aGFuLCB0byBtYXRjaCwgb3IgYmUgZ3JlYXRlciB0aGFuIHRoZSBjb3JyZWN0CisgKiBQTkcgc2lnbmF0dXJlICh0aGlzIGlzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBzdHJjbXAsIG1lbWNtcCwgZXRjKS4KKyAqLworaW50IFBOR0FQSQorcG5nX3NpZ19jbXAocG5nX2J5dGVwIHNpZywgcG5nX3NpemVfdCBzdGFydCwgcG5nX3NpemVfdCBudW1fdG9fY2hlY2spCit7CisgICBwbmdfYnl0ZSBwbmdfc2lnbmF0dXJlWzhdID0gezEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTB9OworICAgaWYgKG51bV90b19jaGVjayA+IDgpCisgICAgICBudW1fdG9fY2hlY2sgPSA4OworICAgZWxzZSBpZiAobnVtX3RvX2NoZWNrIDwgMSkKKyAgICAgIHJldHVybiAoLTEpOworCisgICBpZiAoc3RhcnQgPiA3KQorICAgICAgcmV0dXJuICgtMSk7CisKKyAgIGlmIChzdGFydCArIG51bV90b19jaGVjayA+IDgpCisgICAgICBudW1fdG9fY2hlY2sgPSA4IC0gc3RhcnQ7CisKKyAgIHJldHVybiAoKGludCkocG5nX21lbWNtcCgmc2lnW3N0YXJ0XSwgJnBuZ19zaWduYXR1cmVbc3RhcnRdLCBudW1fdG9fY2hlY2spKSk7Cit9CisKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZChQTkdfMV8yX1gpCisvKiAoT2Jzb2xldGUpIGZ1bmN0aW9uIHRvIGNoZWNrIHNpZ25hdHVyZSBieXRlcy4gIEl0IGRvZXMgbm90IGFsbG93IG9uZQorICogdG8gY2hlY2sgYSBwYXJ0aWFsIHNpZ25hdHVyZS4gIFRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgcmVtb3ZlZCBpbiB0aGUKKyAqIGZ1dHVyZSAtIHVzZSBwbmdfc2lnX2NtcCgpLiAgUmV0dXJucyB0cnVlIChub256ZXJvKSBpZiB0aGUgZmlsZSBpcyBQTkcuCisgKi8KK2ludCBQTkdBUEkKK3BuZ19jaGVja19zaWcocG5nX2J5dGVwIHNpZywgaW50IG51bSkKK3sKKyAgcmV0dXJuICgoaW50KSFwbmdfc2lnX2NtcChzaWcsIChwbmdfc2l6ZV90KTAsIChwbmdfc2l6ZV90KW51bSkpOworfQorI2VuZGlmCisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQorLyogRnVuY3Rpb24gdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB6bGliIGFuZCBjbGVhciBpdCB0byAwLiAqLworI2lmZGVmIFBOR18xXzBfWAordm9pZHBmIFBOR0FQSQorI2Vsc2UKK3ZvaWRwZiAvKiBQUklWQVRFICovCisjZW5kaWYKK3BuZ196YWxsb2Modm9pZHBmIHBuZ19wdHIsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkKK3sKKyAgIHBuZ192b2lkcCBwdHI7CisgICBwbmdfc3RydWN0cCBwPShwbmdfc3RydWN0cClwbmdfcHRyOworICAgcG5nX3VpbnRfMzIgc2F2ZV9mbGFncz1wLT5mbGFnczsKKyAgIHBuZ191aW50XzMyIG51bV9ieXRlczsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiAoTlVMTCk7CisgICBpZiAoaXRlbXMgPiBQTkdfVUlOVF8zMl9NQVgvc2l6ZSkKKyAgIHsKKyAgICAgcG5nX3dhcm5pbmcgKHAsICJQb3RlbnRpYWwgb3ZlcmZsb3cgaW4gcG5nX3phbGxvYygpIik7CisgICAgIHJldHVybiAoTlVMTCk7CisgICB9CisgICBudW1fYnl0ZXMgPSAocG5nX3VpbnRfMzIpaXRlbXMgKiBzaXplOworCisgICBwLT5mbGFnc3w9UE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LOworICAgcHRyID0gKHBuZ192b2lkcClwbmdfbWFsbG9jKChwbmdfc3RydWN0cClwbmdfcHRyLCBudW1fYnl0ZXMpOworICAgcC0+ZmxhZ3M9c2F2ZV9mbGFnczsKKworI2lmIGRlZmluZWQoUE5HXzFfMF9YKSAmJiAhZGVmaW5lZChQTkdfTk9fWkFMTE9DX1pFUk8pCisgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgcmV0dXJuICgodm9pZHBmKXB0cik7CisKKyAgIGlmIChudW1fYnl0ZXMgPiAocG5nX3VpbnRfMzIpMHg4MDAwTCkKKyAgIHsKKyAgICAgIHBuZ19tZW1zZXQocHRyLCAwLCAocG5nX3NpemVfdCkweDgwMDBMKTsKKyAgICAgIHBuZ19tZW1zZXQoKHBuZ19ieXRlcClwdHIgKyAocG5nX3NpemVfdCkweDgwMDBMLCAwLAorICAgICAgICAgKHBuZ19zaXplX3QpKG51bV9ieXRlcyAtIChwbmdfdWludF8zMikweDgwMDBMKSk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwbmdfbWVtc2V0KHB0ciwgMCwgKHBuZ19zaXplX3QpbnVtX2J5dGVzKTsKKyAgIH0KKyNlbmRpZgorICAgcmV0dXJuICgodm9pZHBmKXB0cik7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGZyZWUgbWVtb3J5IGZvciB6bGliICovCisjaWZkZWYgUE5HXzFfMF9YCit2b2lkIFBOR0FQSQorI2Vsc2UKK3ZvaWQgLyogUFJJVkFURSAqLworI2VuZGlmCitwbmdfemZyZWUodm9pZHBmIHBuZ19wdHIsIHZvaWRwZiBwdHIpCit7CisgICBwbmdfZnJlZSgocG5nX3N0cnVjdHApcG5nX3B0ciwgKHBuZ192b2lkcClwdHIpOworfQorCisvKiBSZXNldCB0aGUgQ1JDIHZhcmlhYmxlIHRvIDMyIGJpdHMgb2YgMSdzLiAgQ2FyZSBtdXN0IGJlIHRha2VuCisgKiBpbiBjYXNlIENSQyBpcyA+IDMyIGJpdHMgdG8gbGVhdmUgdGhlIHRvcCBiaXRzIDAuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3Jlc2V0X2NyYyhwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX3B0ci0+Y3JjID0gY3JjMzIoMCwgWl9OVUxMLCAwKTsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBDUkMgb3ZlciBhIHNlY3Rpb24gb2YgZGF0YS4gIFdlIGNhbiBvbmx5IHBhc3MgYXMKKyAqIG11Y2ggZGF0YSB0byB0aGlzIHJvdXRpbmUgYXMgdGhlIGxhcmdlc3Qgc2luZ2xlIGJ1ZmZlciBzaXplLiAgV2UKKyAqIGFsc28gY2hlY2sgdGhhdCB0aGlzIGRhdGEgd2lsbCBhY3R1YWxseSBiZSB1c2VkIGJlZm9yZSBnb2luZyB0byB0aGUKKyAqIHRyb3VibGUgb2YgY2FsY3VsYXRpbmcgaXQuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHB0ciwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBpbnQgbmVlZF9jcmMgPSAxOworCisgICBpZiAocG5nX3B0ci0+Y2h1bmtfbmFtZVswXSAmIDB4MjApICAgICAgICAgICAgICAgICAgICAgLyogYW5jaWxsYXJ5ICovCisgICB7CisgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLKSA9PQorICAgICAgICAgIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSB8IFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKSkKKyAgICAgICAgIG5lZWRfY3JjID0gMDsKKyAgIH0KKyAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JpdGljYWwgKi8KKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkUpCisgICAgICAgICBuZWVkX2NyYyA9IDA7CisgICB9CisKKyAgIGlmIChuZWVkX2NyYykKKyAgICAgIHBuZ19wdHItPmNyYyA9IGNyYzMyKHBuZ19wdHItPmNyYywgcHRyLCAodUludClsZW5ndGgpOworfQorCisvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBhbiBpbmZvX3N0cnVjdCBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgV2UgZG9uJ3QKKyAqIHJlYWxseSBuZWVkIHRoZSBwbmdfcHRyLCBidXQgaXQgY291bGQgcG90ZW50aWFsbHkgYmUgdXNlZnVsIGluIHRoZQorICogZnV0dXJlLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBpbiBmYXZvdXIgb2YgbWFsbG9jKHBuZ19zaXplb2YocG5nX2luZm8pKQorICogYW5kIHBuZ19pbmZvX2luaXQoKSBzbyB0aGF0IGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gdXNlIGEgc2hhcmVkCisgKiBsaWJwbmcgZG9uJ3QgaGF2ZSB0byBiZSByZWNvbXBpbGVkIGlmIHBuZ19pbmZvIGNoYW5nZXMgc2l6ZS4KKyAqLworcG5nX2luZm9wIFBOR0FQSQorcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX2luZm9wIGluZm9fcHRyOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiAoTlVMTCk7CisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBpbmZvX3B0ciA9IChwbmdfaW5mb3ApcG5nX2NyZWF0ZV9zdHJ1Y3RfMihQTkdfU1RSVUNUX0lORk8sCisgICAgICBwbmdfcHRyLT5tYWxsb2NfZm4sIHBuZ19wdHItPm1lbV9wdHIpOworI2Vsc2UKKyAgIGluZm9fcHRyID0gKHBuZ19pbmZvcClwbmdfY3JlYXRlX3N0cnVjdChQTkdfU1RSVUNUX0lORk8pOworI2VuZGlmCisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHBuZ19pbmZvX2luaXRfMygmaW5mb19wdHIsIHBuZ19zaXplb2YocG5nX2luZm8pKTsKKworICAgcmV0dXJuIChpbmZvX3B0cik7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgaW5mbyBzdHJ1Y3QuCisgKiBOb3JtYWxseSwgb25lIHdvdWxkIHVzZSBlaXRoZXIgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSBvcgorICogcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgdG8gZnJlZSBhbiBpbmZvIHN0cnVjdCwgYnV0IHRoaXMgbWF5IGJlCisgKiB1c2VmdWwgZm9yIHNvbWUgYXBwbGljYXRpb25zLgorICovCit2b2lkIFBOR0FQSQorcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wcCBpbmZvX3B0cl9wdHIpCit7CisgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kZXN0cm95X2luZm9fc3RydWN0Iik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChpbmZvX3B0cl9wdHIgIT0gTlVMTCkKKyAgICAgIGluZm9fcHRyID0gKmluZm9fcHRyX3B0cjsKKworICAgaWYgKGluZm9fcHRyICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfaW5mb19kZXN0cm95KHBuZ19wdHIsIGluZm9fcHRyKTsKKworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgICAgIHBuZ19kZXN0cm95X3N0cnVjdF8yKChwbmdfdm9pZHApaW5mb19wdHIsIHBuZ19wdHItPmZyZWVfZm4sCisgICAgICAgICAgcG5nX3B0ci0+bWVtX3B0cik7CisjZWxzZQorICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0KChwbmdfdm9pZHApaW5mb19wdHIpOworI2VuZGlmCisgICAgICAqaW5mb19wdHJfcHRyID0gTlVMTDsKKyAgIH0KK30KKworLyogSW5pdGlhbGl6ZSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzIG5vdyBhbiBpbnRlcm5hbCBmdW5jdGlvbiAoMC44OSkKKyAqIGFuZCBhcHBsaWNhdGlvbnMgdXNpbmcgaXQgYXJlIHVyZ2VkIHRvIHVzZSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KCkKKyAqIGluc3RlYWQuCisgKi8KKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZChQTkdfMV8yX1gpCisjdW5kZWYgcG5nX2luZm9faW5pdAordm9pZCBQTkdBUEkKK3BuZ19pbmZvX2luaXQocG5nX2luZm9wIGluZm9fcHRyKQoreworICAgLyogV2Ugb25seSBjb21lIGhlcmUgdmlhIHByZS0xLjAuMTItY29tcGlsZWQgYXBwbGljYXRpb25zICovCisgICBwbmdfaW5mb19pbml0XzMoJmluZm9fcHRyLCAwKTsKK30KKyNlbmRpZgorCit2b2lkIFBOR0FQSQorcG5nX2luZm9faW5pdF8zKHBuZ19pbmZvcHAgcHRyX3B0ciwgcG5nX3NpemVfdCBwbmdfaW5mb19zdHJ1Y3Rfc2l6ZSkKK3sKKyAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9ICpwdHJfcHRyOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19pbmZvX2luaXRfMyIpOworCisgICBpZiAoaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKHBuZ19zaXplb2YocG5nX2luZm8pID4gcG5nX2luZm9fc3RydWN0X3NpemUpCisgICB7CisgICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgPSAocG5nX2luZm9wKXBuZ19jcmVhdGVfc3RydWN0KFBOR19TVFJVQ1RfSU5GTyk7CisgICAgICAqcHRyX3B0ciA9IGluZm9fcHRyOworICAgfQorCisgICAvKiBTZXQgZXZlcnl0aGluZyB0byAwICovCisgICBwbmdfbWVtc2V0KGluZm9fcHRyLCAwLCBwbmdfc2l6ZW9mKHBuZ19pbmZvKSk7Cit9CisKKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfZGF0YV9mcmVlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBpbnQgZnJlZXIsIHBuZ191aW50XzMyIG1hc2spCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kYXRhX2ZyZWVyIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKGZyZWVyID09IFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBKQorICAgICAgaW5mb19wdHItPmZyZWVfbWUgfD0gbWFzazsKKyAgIGVsc2UgaWYgKGZyZWVyID09IFBOR19VU0VSX1dJTExfRlJFRV9EQVRBKQorICAgICAgaW5mb19wdHItPmZyZWVfbWUgJj0gfm1hc2s7CisgICBlbHNlCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgIlVua25vd24gZnJlZXIgcGFyYW1ldGVyIGluIHBuZ19kYXRhX2ZyZWVyLiIpOworfQorI2VuZGlmCisKK3ZvaWQgUE5HQVBJCitwbmdfZnJlZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbWFzaywKKyAgIGludCBudW0pCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19mcmVlX2RhdGEiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisgICAvKiBGcmVlIHRleHQgaXRlbSBudW0gb3IgKGlmIG51bSA9PSAtMSkgYWxsIHRleHQgaXRlbXMgKi8KKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgIGlmICgobWFzayAmIFBOR19GUkVFX1RFWFQpICYgaW5mb19wdHItPmZyZWVfbWUpCisjZWxzZQorICAgaWYgKG1hc2sgJiBQTkdfRlJFRV9URVhUKQorI2VuZGlmCisgICB7CisgICAgICBpZiAobnVtICE9IC0xKQorICAgICAgeworICAgICAgICAgaWYgKGluZm9fcHRyLT50ZXh0ICYmIGluZm9fcHRyLT50ZXh0W251bV0ua2V5KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnRleHRbbnVtXS5rZXkpOworICAgICAgICAgICAgaW5mb19wdHItPnRleHRbbnVtXS5rZXkgPSBOVUxMOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaW50IGk7CisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mb19wdHItPm51bV90ZXh0OyBpKyspCisgICAgICAgICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfVEVYVCwgaSk7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dCk7CisgICAgICAgICBpbmZvX3B0ci0+dGV4dCA9IE5VTEw7CisgICAgICAgICBpbmZvX3B0ci0+bnVtX3RleHQ9MDsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVECisgICAvKiBGcmVlIGFueSB0Uk5TIGVudHJ5ICovCisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9UUk5TKSAmIGluZm9fcHRyLT5mcmVlX21lKQorI2Vsc2UKKyAgIGlmICgobWFzayAmIFBOR19GUkVFX1RSTlMpICYmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0ZSRUVfVFJOUykpCisjZW5kaWYKKyAgIHsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT50cmFucyk7CisgICAgICBpbmZvX3B0ci0+dHJhbnMgPSBOVUxMOworICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT190Uk5TOworI2lmbmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19GUkVFX1RSTlM7CisjZW5kaWYKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECisgICAvKiBGcmVlIGFueSBzQ0FMIGVudHJ5ICovCisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9TQ0FMKSAmIGluZm9fcHRyLT5mcmVlX21lKQorI2Vsc2UKKyAgIGlmIChtYXNrICYgUE5HX0ZSRUVfU0NBTCkKKyNlbmRpZgorICAgeworI2lmIGRlZmluZWQoUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zY2FsX3Nfd2lkdGgpOworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnNjYWxfc19oZWlnaHQpOworICAgICAgaW5mb19wdHItPnNjYWxfc193aWR0aCA9IE5VTEw7CisgICAgICBpbmZvX3B0ci0+c2NhbF9zX2hlaWdodCA9IE5VTEw7CisjZW5kaWYKKyAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+UE5HX0lORk9fc0NBTDsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX3BDQUxfU1VQUE9SVEVECisgICAvKiBGcmVlIGFueSBwQ0FMIGVudHJ5ICovCisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9QQ0FMKSAmIGluZm9fcHRyLT5mcmVlX21lKQorI2Vsc2UKKyAgIGlmIChtYXNrICYgUE5HX0ZSRUVfUENBTCkKKyNlbmRpZgorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfcHVycG9zZSk7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cGNhbF91bml0cyk7CisgICAgICBpbmZvX3B0ci0+cGNhbF9wdXJwb3NlID0gTlVMTDsKKyAgICAgIGluZm9fcHRyLT5wY2FsX3VuaXRzID0gTlVMTDsKKyAgICAgIGlmIChpbmZvX3B0ci0+cGNhbF9wYXJhbXMgIT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpaW5mb19wdHItPnBjYWxfbnBhcmFtczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldKTsKKyAgICAgICAgICAgICAgIGluZm9fcHRyLT5wY2FsX3BhcmFtc1tpXSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cGNhbF9wYXJhbXMpOworICAgICAgICAgICAgaW5mb19wdHItPnBjYWxfcGFyYW1zID0gTlVMTDsKKyAgICAgICAgIH0KKyAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+UE5HX0lORk9fcENBTDsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX2lDQ1BfU1VQUE9SVEVECisgICAvKiBGcmVlIGFueSBpQ0NQIGVudHJ5ICovCisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9JQ0NQKSAmIGluZm9fcHRyLT5mcmVlX21lKQorI2Vsc2UKKyAgIGlmIChtYXNrICYgUE5HX0ZSRUVfSUNDUCkKKyNlbmRpZgorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPmljY3BfbmFtZSk7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+aWNjcF9wcm9maWxlKTsKKyAgICAgIGluZm9fcHRyLT5pY2NwX25hbWUgPSBOVUxMOworICAgICAgaW5mb19wdHItPmljY3BfcHJvZmlsZSA9IE5VTEw7CisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX2lDQ1A7CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19zUExUX1NVUFBPUlRFRAorICAgLyogRnJlZSBhIGdpdmVuIHNQTFQgZW50cnksIG9yIChpZiBudW0gPT0gLTEpIGFsbCBzUExUIGVudHJpZXMgKi8KKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgIGlmICgobWFzayAmIFBOR19GUkVFX1NQTFQpICYgaW5mb19wdHItPmZyZWVfbWUpCisjZWxzZQorICAgaWYgKG1hc2sgJiBQTkdfRlJFRV9TUExUKQorI2VuZGlmCisgICB7CisgICAgICBpZiAobnVtICE9IC0xKQorICAgICAgeworICAgICAgICAgaWYgKGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNbbnVtXS5uYW1lKTsKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzW251bV0uZW50cmllcyk7CisgICAgICAgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc1tudW1dLm5hbWUgPSBOVUxMOworICAgICAgICAgICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNbbnVtXS5lbnRyaWVzID0gTlVMTDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlmIChpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0pCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bTsgaSsrKQorICAgICAgICAgICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfU1BMVCwgaSk7CisKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzKTsKKyAgICAgICAgICAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzID0gTlVMTDsKKyAgICAgICAgICAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bSA9IDA7CisgICAgICAgICB9CisgICAgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3NQTFQ7CisgICAgICB9CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEpCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEpOworICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhID0gTlVMTDsKKyAgIH0KKworI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfVU5LTikgJiBpbmZvX3B0ci0+ZnJlZV9tZSkKKyNlbHNlCisgICBpZiAobWFzayAmIFBOR19GUkVFX1VOS04pCisjZW5kaWYKKyAgIHsKKyAgICAgIGlmIChudW0gIT0gLTEpCisgICAgICB7CisgICAgICAgICAgaWYgKGluZm9fcHRyLT51bmtub3duX2NodW5rcykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnVua25vd25fY2h1bmtzW251bV0uZGF0YSk7CisgICAgICAgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzW251bV0uZGF0YSA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaW50IGk7CisKKyAgICAgICAgIGlmIChpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtKQorICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bTsgaSsrKQorICAgICAgICAgICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfVU5LTiwgaSk7CisKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT51bmtub3duX2NodW5rcyk7CisgICAgICAgICAgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgPSBOVUxMOworICAgICAgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSA9IDA7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAorICAgLyogRnJlZSBhbnkgaElTVCBlbnRyeSAqLworI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfSElTVCkgICYgaW5mb19wdHItPmZyZWVfbWUpCisjZWxzZQorICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfSElTVCkgJiYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfRlJFRV9ISVNUKSkKKyNlbmRpZgorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPmhpc3QpOworICAgICAgaW5mb19wdHItPmhpc3QgPSBOVUxMOworICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19oSVNUOworI2lmbmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19GUkVFX0hJU1Q7CisjZW5kaWYKKyAgIH0KKyNlbmRpZgorCisgICAvKiBGcmVlIGFueSBQTFRFIGVudHJ5IHRoYXQgd2FzIGludGVybmFsbHkgYWxsb2NhdGVkICovCisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9QTFRFKSAmIGluZm9fcHRyLT5mcmVlX21lKQorI2Vsc2UKKyAgIGlmICgobWFzayAmIFBOR19GUkVFX1BMVEUpICYmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0ZSRUVfUExURSkpCisjZW5kaWYKKyAgIHsKKyAgICAgIHBuZ196ZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cGFsZXR0ZSk7CisgICAgICBpbmZvX3B0ci0+cGFsZXR0ZSA9IE5VTEw7CisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX1BMVEU7CisjaWZuZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0ZSRUVfUExURTsKKyNlbmRpZgorICAgICAgaW5mb19wdHItPm51bV9wYWxldHRlID0gMDsKKyAgIH0KKworI2lmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAorICAgLyogRnJlZSBhbnkgaW1hZ2UgYml0cyBhdHRhY2hlZCB0byB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgIGlmICgobWFzayAmIFBOR19GUkVFX1JPV1MpICYgaW5mb19wdHItPmZyZWVfbWUpCisjZWxzZQorICAgaWYgKG1hc2sgJiBQTkdfRlJFRV9ST1dTKQorI2VuZGlmCisgICB7CisgICAgICBpZiAoaW5mb19wdHItPnJvd19wb2ludGVycykKKyAgICAgIHsKKyAgICAgICAgIGludCByb3c7CisgICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IChpbnQpaW5mb19wdHItPmhlaWdodDsgcm93KyspCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzW3Jvd10pOworICAgICAgICAgICAgaW5mb19wdHItPnJvd19wb2ludGVyc1tyb3ddID0gTlVMTDsKKyAgICAgICAgIH0KKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMpOworICAgICAgICAgaW5mb19wdHItPnJvd19wb2ludGVycyA9IE5VTEw7CisgICAgICB9CisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX0lEQVQ7CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorICAgaWYgKG51bSA9PSAtMSkKKyAgICAgIGluZm9fcHRyLT5mcmVlX21lICY9IH5tYXNrOworICAgZWxzZQorICAgICAgaW5mb19wdHItPmZyZWVfbWUgJj0gfihtYXNrICYgflBOR19GUkVFX01VTCk7CisjZW5kaWYKK30KKworLyogVGhpcyBpcyBhbiBpbnRlcm5hbCByb3V0aW5lIHRvIGZyZWUgYW55IG1lbW9yeSB0aGF0IHRoZSBpbmZvIHN0cnVjdCBpcworICogcG9pbnRpbmcgdG8gYmVmb3JlIHJlLXVzaW5nIGl0IG9yIGZyZWVpbmcgdGhlIHN0cnVjdCBpdHNlbGYuICBSZWNhbGwKKyAqIHRoYXQgcG5nX2ZyZWUoKSBjaGVja3MgZm9yIE5VTEwgcG9pbnRlcnMgZm9yIHVzLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19pbmZvX2Rlc3Ryb3kocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaW5mb19kZXN0cm95Iik7CisKKyAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX0FMTCwgLTEpOworCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPm51bV9jaHVua19saXN0KQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbGlzdCk7CisgICAgICBwbmdfcHRyLT5jaHVua19saXN0ID0gTlVMTDsKKyAgICAgIHBuZ19wdHItPm51bV9jaHVua19saXN0ID0gMDsKKyAgIH0KKyNlbmRpZgorCisgICBwbmdfaW5mb19pbml0XzMoJmluZm9fcHRyLCBwbmdfc2l6ZW9mKHBuZ19pbmZvKSk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW9fcHRyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlcgorICogZnVuY3Rpb25zLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAqIHBvaW50ZXIgYmVmb3JlIHBuZ193cml0ZV9kZXN0cm95KCkgb3IgcG5nX3JlYWRfZGVzdHJveSgpIGFyZSBjYWxsZWQuCisgKi8KK3BuZ192b2lkcCBQTkdBUEkKK3BuZ19nZXRfaW9fcHRyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIChOVUxMKTsKKyAgIHJldHVybiAocG5nX3B0ci0+aW9fcHRyKTsKK30KKworI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zIGZvciB0aGUgUE5HIGZpbGUuICBJZiB5b3UKKyAqIHVzZSB5b3VyIG93biByZWFkIG9yIHdyaXRlIHJvdXRpbmVzLCB5b3UgY2FuIGNhbGwgZWl0aGVyIHBuZ19zZXRfcmVhZF9mbigpCisgKiBvciBwbmdfc2V0X3dyaXRlX2ZuKCkgaW5zdGVhZCBvZiBwbmdfaW5pdF9pbygpLiAgSWYgeW91IGhhdmUgZGVmaW5lZAorICogUE5HX05PX1NURElPLCB5b3UgbXVzdCB1c2UgYSBmdW5jdGlvbiBvZiB5b3VyIG93biBiZWNhdXNlICJGSUxFICoiIGlzbid0CisgKiBuZWNlc3NhcmlseSBhdmFpbGFibGUuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfaW5pdF9pbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfRklMRV9wIGZwKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaW5pdF9pbyIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT5pb19wdHIgPSAocG5nX3ZvaWRwKWZwOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAorLyogQ29udmVydCB0aGUgc3VwcGxpZWQgdGltZSBpbnRvIGFuIFJGQyAxMTIzIHN0cmluZyBzdWl0YWJsZSBmb3IgdXNlIGluCisgKiBhICJDcmVhdGlvbiBUaW1lIiBvciBvdGhlciB0ZXh0LWJhc2VkIHRpbWUgc3RyaW5nLgorICovCitwbmdfY2hhcnAgUE5HQVBJCitwbmdfY29udmVydF90b19yZmMxMTIzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ190aW1lcCBwdGltZSkKK3sKKyAgIHN0YXRpYyBQTkdfQ09OU1QgY2hhciBzaG9ydF9tb250aHNbMTJdWzRdID0KKyAgICAgICAgeyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMifTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiAoTlVMTCk7CisgICBpZiAocG5nX3B0ci0+dGltZV9idWZmZXIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPnRpbWVfYnVmZmVyID0gKHBuZ19jaGFycClwbmdfbWFsbG9jKHBuZ19wdHIsIChwbmdfdWludF8zMikoMjkqCisgICAgICAgICBwbmdfc2l6ZW9mKGNoYXIpKSk7CisgICB9CisKKyNpZmRlZiBfV0lOMzJfV0NFCisgICB7CisgICAgICB3Y2hhcl90IHRpbWVfYnVmWzI5XTsKKyAgICAgIHdzcHJpbnRmKHRpbWVfYnVmLCBURVhUKCIlZCAlUyAlZCAlMDJkOiUwMmQ6JTAyZCArMDAwMCIpLAorICAgICAgICAgIHB0aW1lLT5kYXkgJSAzMiwgc2hvcnRfbW9udGhzWyhwdGltZS0+bW9udGggLSAxKSAlIDEyXSwKKyAgICAgICAgcHRpbWUtPnllYXIsIHB0aW1lLT5ob3VyICUgMjQsIHB0aW1lLT5taW51dGUgJSA2MCwKKyAgICAgICAgICBwdGltZS0+c2Vjb25kICUgNjEpOworICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHRpbWVfYnVmLCAtMSwgcG5nX3B0ci0+dGltZV9idWZmZXIsCisgICAgICAgICAgMjksIE5VTEwsIE5VTEwpOworICAgfQorI2Vsc2UKKyNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKKyAgIHsKKyAgICAgIGNoYXIgbmVhcl90aW1lX2J1ZlsyOV07CisgICAgICBwbmdfc25wcmludGY2KG5lYXJfdGltZV9idWYsIDI5LCAiJWQgJXMgJWQgJTAyZDolMDJkOiUwMmQgKzAwMDAiLAorICAgICAgICAgIHB0aW1lLT5kYXkgJSAzMiwgc2hvcnRfbW9udGhzWyhwdGltZS0+bW9udGggLSAxKSAlIDEyXSwKKyAgICAgICAgICBwdGltZS0+eWVhciwgcHRpbWUtPmhvdXIgJSAyNCwgcHRpbWUtPm1pbnV0ZSAlIDYwLAorICAgICAgICAgIHB0aW1lLT5zZWNvbmQgJSA2MSk7CisgICAgICBwbmdfbWVtY3B5KHBuZ19wdHItPnRpbWVfYnVmZmVyLCBuZWFyX3RpbWVfYnVmLAorICAgICAgICAgIDI5KnBuZ19zaXplb2YoY2hhcikpOworICAgfQorI2Vsc2UKKyAgIHBuZ19zbnByaW50ZjYocG5nX3B0ci0+dGltZV9idWZmZXIsIDI5LCAiJWQgJXMgJWQgJTAyZDolMDJkOiUwMmQgKzAwMDAiLAorICAgICAgIHB0aW1lLT5kYXkgJSAzMiwgc2hvcnRfbW9udGhzWyhwdGltZS0+bW9udGggLSAxKSAlIDEyXSwKKyAgICAgICBwdGltZS0+eWVhciwgcHRpbWUtPmhvdXIgJSAyNCwgcHRpbWUtPm1pbnV0ZSAlIDYwLAorICAgICAgIHB0aW1lLT5zZWNvbmQgJSA2MSk7CisjZW5kaWYKKyNlbmRpZiAvKiBfV0lOMzJfV0NFICovCisgICByZXR1cm4gKChwbmdfY2hhcnApcG5nX3B0ci0+dGltZV9idWZmZXIpOworfQorI2VuZGlmIC8qIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKSAqLworCitwbmdfY2hhcnAgUE5HQVBJCitwbmdfZ2V0X2NvcHlyaWdodChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX3B0ciA9IHBuZ19wdHI7ICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBuZ19wdHIgKi8KKyNpZmRlZiBQTkdfU1RSSU5HX0NPUFlSSUdIVAorICAgICAgcmV0dXJuIFBOR19TVFJJTkdfQ09QWVJJR0hUCisjZWxzZQorI2lmZGVmIF9fU1REQ19fCisgICByZXR1cm4gKChwbmdfY2hhcnApIFBOR19TVFJJTkdfTkVXTElORSBcCisgICAgICJsaWJwbmcgdmVyc2lvbiAxLjIuNDQgLSBKdW5lIDI2LCAyMDEwIiBQTkdfU1RSSU5HX05FV0xJTkUgXAorICAgICAiQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uIiBQTkdfU1RSSU5HX05FV0xJTkUgXAorICAgICAiQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcgQW5kcmVhcyBEaWxnZXIiIFBOR19TVFJJTkdfTkVXTElORSBcCisgICAgICJDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4iIFwKKyAgICAgUE5HX1NUUklOR19ORVdMSU5FKTsKKyNlbHNlCisgICAgICByZXR1cm4gKChwbmdfY2hhcnApICJsaWJwbmcgdmVyc2lvbiAxLjIuNDQgLSBKdW5lIDI2LCAyMDEwXAorICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAgR2xlbm4gUmFuZGVycy1QZWhyc29uXAorICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcgQW5kcmVhcyBEaWxnZXJcCisgICAgICBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4iKTsKKyNlbmRpZgorI2VuZGlmCit9CisKKy8qIFRoZSBmb2xsb3dpbmcgcmV0dXJuIHRoZSBsaWJyYXJ5IHZlcnNpb24gYXMgYSBzaG9ydCBzdHJpbmcgaW4gdGhlCisgKiBmb3JtYXQgMS4wLjAgdGhyb3VnaCA5OS45OS45OXp6LiAgVG8gZ2V0IHRoZSB2ZXJzaW9uIG9mICouaCBmaWxlcworICogdXNlZCB3aXRoIHlvdXIgYXBwbGljYXRpb24sIHByaW50IG91dCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHdoaWNoCisgKiBpcyBkZWZpbmVkIGluIHBuZy5oLgorICogTm90ZTogbm93IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBwbmdfZ2V0X2xpYnBuZ192ZXIoKSBhbmQKKyAqIHBuZ19nZXRfaGVhZGVyX3ZlcigpLiAgRHVlIHRvIHRoZSB2ZXJzaW9uX25uX25uX25uIHR5cGVkZWYgZ3VhcmQsCisgKiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgcG5nLmMgdXNlcyB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHBuZy5oLgorICovCitwbmdfY2hhcnAgUE5HQVBJCitwbmdfZ2V0X2xpYnBuZ192ZXIocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIC8qIFZlcnNpb24gb2YgKi5jIGZpbGVzIHVzZWQgd2hlbiBidWlsZGluZyBsaWJwbmcgKi8KKyAgIHBuZ19wdHIgPSBwbmdfcHRyOyAgLyogU2lsZW5jZSBjb21waWxlciB3YXJuaW5nIGFib3V0IHVudXNlZCBwbmdfcHRyICovCisgICByZXR1cm4gKChwbmdfY2hhcnApIFBOR19MSUJQTkdfVkVSX1NUUklORyk7Cit9CisKK3BuZ19jaGFycCBQTkdBUEkKK3BuZ19nZXRfaGVhZGVyX3Zlcihwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgLyogVmVyc2lvbiBvZiAqLmggZmlsZXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGxpYnBuZyAqLworICAgcG5nX3B0ciA9IHBuZ19wdHI7ICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBuZ19wdHIgKi8KKyAgIHJldHVybiAoKHBuZ19jaGFycCkgUE5HX0xJQlBOR19WRVJfU1RSSU5HKTsKK30KKworcG5nX2NoYXJwIFBOR0FQSQorcG5nX2dldF9oZWFkZXJfdmVyc2lvbihwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgLyogUmV0dXJucyBsb25nZXIgc3RyaW5nIGNvbnRhaW5pbmcgYm90aCB2ZXJzaW9uIGFuZCBkYXRlICovCisgICBwbmdfcHRyID0gcG5nX3B0cjsgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZyBhYm91dCB1bnVzZWQgcG5nX3B0ciAqLworI2lmZGVmIF9fU1REQ19fCisgICByZXR1cm4gKChwbmdfY2hhcnApIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcKKyNpZm5kZWYgUE5HX1JFQURfU1VQUE9SVEVECisgICAiICAgICAoTk8gUkVBRCBTVVBQT1JUKSIKKyNlbmRpZgorICAgUE5HX1NUUklOR19ORVdMSU5FKTsKKyNlbHNlCisgICByZXR1cm4gKChwbmdfY2hhcnApIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQorI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKK2ludCBQTkdBUEkKK3BuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgY2h1bmtfbmFtZSkKK3sKKyAgIC8qIENoZWNrIGNodW5rX25hbWUgYW5kIHJldHVybiAia2VlcCIgdmFsdWUgaWYgaXQncyBvbiB0aGUgbGlzdCwgZWxzZSAwICovCisgICBpbnQgaTsKKyAgIHBuZ19ieXRlcCBwOworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBjaHVua19uYW1lID09IE5VTEwgfHwgcG5nX3B0ci0+bnVtX2NodW5rX2xpc3Q8PTApCisgICAgICByZXR1cm4gMDsKKyAgIHAgPSBwbmdfcHRyLT5jaHVua19saXN0ICsgcG5nX3B0ci0+bnVtX2NodW5rX2xpc3QqNSAtIDU7CisgICBmb3IgKGkgPSBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdDsgaTsgaS0tLCBwIC09IDUpCisgICAgICBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcCwgNCkpCisgICAgICAgIHJldHVybiAoKGludCkqKHAgKyA0KSk7CisgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uLCBhZGRlZCB0byBsaWJwbmctMS4wLjZnLCBpcyB1bnRlc3RlZC4gKi8KK2ludCBQTkdBUEkKK3BuZ19yZXNldF96c3RyZWFtKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgcmV0dXJuIChpbmZsYXRlUmVzZXQoJnBuZ19wdHItPnpzdHJlYW0pKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmctMS4wLjcgKi8KK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcih2b2lkKQoreworICAgLyogVmVyc2lvbiBvZiAqLmMgZmlsZXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGxpYnBuZyAqLworICAgcmV0dXJuKChwbmdfdWludF8zMikgUE5HX0xJQlBOR19WRVIpOworfQorCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVEKQorI2lmbmRlZiBQTkdfMV8wX1gKKy8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZyAxLjIuMCAqLworaW50IFBOR0FQSQorcG5nX21teF9zdXBwb3J0KHZvaWQpCit7CisgICAvKiBPYnNvbGV0ZSwgdG8gYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjQuMCAqLworICAgIHJldHVybiAtMTsKK30KKyNlbmRpZiAvKiBQTkdfMV8wX1ggKi8KKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgJiYgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRCAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKKyNpZmRlZiBQTkdfU0laRV9UCisvKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuNiAqLworICAgUE5HX0VYVEVSTiBwbmdfc2l6ZV90IFBOR0FQSSBwbmdfY29udmVydF9zaXplIFBOR0FSRygoc2l6ZV90IHNpemUpKTsKK3BuZ19zaXplX3QgUE5HQVBJCitwbmdfY29udmVydF9zaXplKHNpemVfdCBzaXplKQoreworICAgaWYgKHNpemUgPiAocG5nX3NpemVfdCktMSkKKyAgICAgIFBOR19BQk9SVCgpOyAgLyogV2UgaGF2ZW4ndCBnb3QgYWNjZXNzIHRvIHBuZ19wdHIsIHNvIG5vIHBuZ19lcnJvcigpICovCisgICByZXR1cm4gKChwbmdfc2l6ZV90KXNpemUpOworfQorI2VuZGlmIC8qIFBOR19TSVpFX1QgKi8KKworLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjM0IGFuZCAxLjQuMCAobW92ZWQgZnJvbSBwbmdzZXQuYykgKi8KKyNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKKyNpZmRlZiBQTkdfQ0hFQ0tfY0hSTV9TVVBQT1JURUQKKworLyoKKyAqICAgIE11bHRpcGx5IHR3byAzMi1iaXQgbnVtYmVycywgVjEgYW5kIFYyLCB1c2luZyAzMi1iaXQKKyAqICAgIGFyaXRobWV0aWMsIHRvIHByb2R1Y2UgYSA2NCBiaXQgcmVzdWx0IGluIHRoZSBISS9MTyB3b3Jkcy4KKyAqCisgKiAgICAgICAgICAgICAgICAgIEEgQgorICogICAgICAgICAgICAgICAgeCBDIEQKKyAqICAgICAgICAgICAgICAgLS0tLS0tCisgKiAgICAgICAgICAgICAgQUQgfHwgQkQKKyAqICAgICAgICBBQyB8fCBDQiB8fCAwCisgKgorICogICAgd2hlcmUgQSBhbmQgQiBhcmUgdGhlIGhpZ2ggYW5kIGxvdyAxNi1iaXQgd29yZHMgb2YgVjEsCisgKiAgICBDIGFuZCBEIGFyZSB0aGUgMTYtYml0IHdvcmRzIG9mIFYyLCBBRCBpcyB0aGUgcHJvZHVjdCBvZgorICogICAgQSBhbmQgRCwgYW5kIFggfHwgWSBpcyAoWCA8PCAxNikgKyBZLgorKi8KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfNjRiaXRfcHJvZHVjdCAobG9uZyB2MSwgbG9uZyB2MiwgdW5zaWduZWQgbG9uZyAqaGlfcHJvZHVjdCwKKyAgIHVuc2lnbmVkIGxvbmcgKmxvX3Byb2R1Y3QpCit7CisgICBpbnQgYSwgYiwgYywgZDsKKyAgIGxvbmcgbG8sIGhpLCB4LCB5OworCisgICBhID0gKHYxID4+IDE2KSAmIDB4ZmZmZjsKKyAgIGIgPSB2MSAmIDB4ZmZmZjsKKyAgIGMgPSAodjIgPj4gMTYpICYgMHhmZmZmOworICAgZCA9IHYyICYgMHhmZmZmOworCisgICBsbyA9IGIgKiBkOyAgICAgICAgICAgICAgICAgICAvKiBCRCAqLworICAgeCA9IGEgKiBkICsgYyAqIGI7ICAgICAgICAgICAgLyogQUQgKyBDQiAqLworICAgeSA9ICgobG8gPj4gMTYpICYgMHhmZmZmKSArIHg7CisKKyAgIGxvID0gKGxvICYgMHhmZmZmKSB8ICgoeSAmIDB4ZmZmZikgPDwgMTYpOworICAgaGkgPSAoeSA+PiAxNikgJiAweGZmZmY7CisKKyAgIGhpICs9IGEgKiBjOyAgICAgICAgICAgICAgICAgIC8qIEFDICovCisKKyAgICpoaV9wcm9kdWN0ID0gKHVuc2lnbmVkIGxvbmcpaGk7CisgICAqbG9fcHJvZHVjdCA9ICh1bnNpZ25lZCBsb25nKWxvOworfQorCitpbnQgLyogUFJJVkFURSAqLworcG5nX2NoZWNrX2NIUk1fZml4ZWQocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19maXhlZF9wb2ludCB3aGl0ZV94LCBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeSwgcG5nX2ZpeGVkX3BvaW50IHJlZF94LAorICAgcG5nX2ZpeGVkX3BvaW50IHJlZF95LCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5feCwgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3ksCisgICBwbmdfZml4ZWRfcG9pbnQgYmx1ZV94LCBwbmdfZml4ZWRfcG9pbnQgYmx1ZV95KQoreworICAgaW50IHJldCA9IDE7CisgICB1bnNpZ25lZCBsb25nIHh5X2hpLHh5X2xvLHl4X2hpLHl4X2xvOworCisgICBwbmdfZGVidWcoMSwgImluIGZ1bmN0aW9uIHBuZ19jaGVja19jSFJNX2ZpeGVkIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm4gMDsKKworICAgaWYgKHdoaXRlX3ggPCAwIHx8IHdoaXRlX3kgPD0gMCB8fAorICAgICAgICAgcmVkX3ggPCAwIHx8ICAgcmVkX3kgPCAgMCB8fAorICAgICAgIGdyZWVuX3ggPCAwIHx8IGdyZWVuX3kgPCAgMCB8fAorICAgICAgICBibHVlX3ggPCAwIHx8ICBibHVlX3kgPCAgMCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHNldCBuZWdhdGl2ZSBjaHJvbWF0aWNpdHkgdmFsdWUiKTsKKyAgICAgIHJldCA9IDA7CisgICB9CisgICBpZiAod2hpdGVfeCA+IChwbmdfZml4ZWRfcG9pbnQpIFBOR19VSU5UXzMxX01BWCB8fAorICAgICAgIHdoaXRlX3kgPiAocG5nX2ZpeGVkX3BvaW50KSBQTkdfVUlOVF8zMV9NQVggfHwKKyAgICAgICAgIHJlZF94ID4gKHBuZ19maXhlZF9wb2ludCkgUE5HX1VJTlRfMzFfTUFYIHx8CisgICAgICAgICByZWRfeSA+IChwbmdfZml4ZWRfcG9pbnQpIFBOR19VSU5UXzMxX01BWCB8fAorICAgICAgIGdyZWVuX3ggPiAocG5nX2ZpeGVkX3BvaW50KSBQTkdfVUlOVF8zMV9NQVggfHwKKyAgICAgICBncmVlbl95ID4gKHBuZ19maXhlZF9wb2ludCkgUE5HX1VJTlRfMzFfTUFYIHx8CisgICAgICAgIGJsdWVfeCA+IChwbmdfZml4ZWRfcG9pbnQpIFBOR19VSU5UXzMxX01BWCB8fAorICAgICAgICBibHVlX3kgPiAocG5nX2ZpeGVkX3BvaW50KSBQTkdfVUlOVF8zMV9NQVggKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2V0IGNocm9tYXRpY2l0eSB2YWx1ZSBleGNlZWRpbmcgMjE0NzQuODMiKTsKKyAgICAgIHJldCA9IDA7CisgICB9CisgICBpZiAod2hpdGVfeCA+IDEwMDAwMEwgLSB3aGl0ZV95KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgY0hSTSB3aGl0ZSBwb2ludCIpOworICAgICAgcmV0ID0gMDsKKyAgIH0KKyAgIGlmIChyZWRfeCA+IDEwMDAwMEwgLSByZWRfeSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gcmVkIHBvaW50Iik7CisgICAgICByZXQgPSAwOworICAgfQorICAgaWYgKGdyZWVuX3ggPiAxMDAwMDBMIC0gZ3JlZW5feSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gZ3JlZW4gcG9pbnQiKTsKKyAgICAgIHJldCA9IDA7CisgICB9CisgICBpZiAoYmx1ZV94ID4gMTAwMDAwTCAtIGJsdWVfeSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gYmx1ZSBwb2ludCIpOworICAgICAgcmV0ID0gMDsKKyAgIH0KKworICAgcG5nXzY0Yml0X3Byb2R1Y3QoZ3JlZW5feCAtIHJlZF94LCBibHVlX3kgLSByZWRfeSwgJnh5X2hpLCAmeHlfbG8pOworICAgcG5nXzY0Yml0X3Byb2R1Y3QoZ3JlZW5feSAtIHJlZF95LCBibHVlX3ggLSByZWRfeCwgJnl4X2hpLCAmeXhfbG8pOworCisgICBpZiAoeHlfaGkgPT0geXhfaGkgJiYgeHlfbG8gPT0geXhfbG8pCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2V0IGNIUk0gUkdCIHRyaWFuZ2xlIHdpdGggemVybyBhcmVhIik7CisgICAgICByZXQgPSAwOworICAgfQorCisgICByZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIFBOR19DSEVDS19jSFJNX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIFBOR19jSFJNX1NVUFBPUlRFRCAqLworCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19jaGVja19JSERSKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLAorICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfdHlwZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCisgICBpbnQgZmlsdGVyX3R5cGUpCit7CisgICBpbnQgZXJyb3IgPSAwOworCisgICAvKiBDaGVjayBmb3Igd2lkdGggYW5kIGhlaWdodCB2YWxpZCB2YWx1ZXMgKi8KKyAgIGlmICh3aWR0aCA9PSAwKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkltYWdlIHdpZHRoIGlzIHplcm8gaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorCisgICBpZiAoaGVpZ2h0ID09IDApCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW1hZ2UgaGVpZ2h0IGlzIHplcm8gaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorCisjaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgIGlmICh3aWR0aCA+IHBuZ19wdHItPnVzZXJfd2lkdGhfbWF4IHx8IHdpZHRoID4gUE5HX1VTRVJfV0lEVEhfTUFYKQorI2Vsc2UKKyAgIGlmICh3aWR0aCA+IFBOR19VU0VSX1dJRFRIX01BWCkKKyNlbmRpZgorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkltYWdlIHdpZHRoIGV4Y2VlZHMgdXNlciBsaW1pdCBpbiBJSERSIik7CisgICAgICBlcnJvciA9IDE7CisgICB9CisKKyNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorICAgaWYgKGhlaWdodCA+IHBuZ19wdHItPnVzZXJfaGVpZ2h0X21heCB8fCBoZWlnaHQgPiBQTkdfVVNFUl9IRUlHSFRfTUFYKQorI2Vsc2UKKyAgIGlmIChoZWlnaHQgPiBQTkdfVVNFUl9IRUlHSFRfTUFYKQorI2VuZGlmCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW1hZ2UgaGVpZ2h0IGV4Y2VlZHMgdXNlciBsaW1pdCBpbiBJSERSIik7CisgICAgICBlcnJvciA9IDE7CisgICB9CisKKyAgIGlmICh3aWR0aCA+IFBOR19VSU5UXzMxX01BWCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGltYWdlIHdpZHRoIGluIElIRFIiKTsKKyAgICAgIGVycm9yID0gMTsKKyAgIH0KKworICAgaWYgKCBoZWlnaHQgPiBQTkdfVUlOVF8zMV9NQVgpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBpbWFnZSBoZWlnaHQgaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorCisgICBpZiAoIHdpZHRoID4gKFBOR19VSU5UXzMyX01BWAorICAgICAgICAgICAgICAgICA+PiAzKSAgICAgIC8qIDgtYnl0ZSBSR0JBIHBpeGVscyAqLworICAgICAgICAgICAgICAgICAtIDY0ICAgICAgIC8qIGJpZ3Jvd2J1ZiBoYWNrICovCisgICAgICAgICAgICAgICAgIC0gMSAgICAgICAgLyogZmlsdGVyIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICAgLSA3KjggICAgICAvKiByb3VuZGluZyBvZiB3aWR0aCB0byBtdWx0aXBsZSBvZiA4IHBpeGVscyAqLworICAgICAgICAgICAgICAgICAtIDgpICAgICAgIC8qIGV4dHJhIG1heF9waXhlbF9kZXB0aCBwYWQgKi8KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJXaWR0aCBpcyB0b28gbGFyZ2UgZm9yIGxpYnBuZyB0byBwcm9jZXNzIHBpeGVscyIpOworCisgICAvKiBDaGVjayBvdGhlciB2YWx1ZXMgKi8KKyAgIGlmIChiaXRfZGVwdGggIT0gMSAmJiBiaXRfZGVwdGggIT0gMiAmJiBiaXRfZGVwdGggIT0gNCAmJgorICAgICAgIGJpdF9kZXB0aCAhPSA4ICYmIGJpdF9kZXB0aCAhPSAxNikKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGJpdCBkZXB0aCBpbiBJSERSIik7CisgICAgICBlcnJvciA9IDE7CisgICB9CisKKyAgIGlmIChjb2xvcl90eXBlIDwgMCB8fCBjb2xvcl90eXBlID09IDEgfHwKKyAgICAgICBjb2xvcl90eXBlID09IDUgfHwgY29sb3JfdHlwZSA+IDYpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBjb2xvciB0eXBlIGluIElIRFIiKTsKKyAgICAgIGVycm9yID0gMTsKKyAgIH0KKworICAgaWYgKCgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSAmJiBiaXRfZGVwdGggPiA4KSB8fAorICAgICAgICgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSB8fAorICAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpICYmIGJpdF9kZXB0aCA8IDgpKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgY29sb3IgdHlwZS9iaXQgZGVwdGggY29tYmluYXRpb24gaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorCisgICBpZiAoaW50ZXJsYWNlX3R5cGUgPj0gUE5HX0lOVEVSTEFDRV9MQVNUKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gaW50ZXJsYWNlIG1ldGhvZCBpbiBJSERSIik7CisgICAgICBlcnJvciA9IDE7CisgICB9CisKKyAgIGlmIChjb21wcmVzc2lvbl90eXBlICE9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gSUhEUiIpOworICAgICAgZXJyb3IgPSAxOworICAgfQorCisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyAgIC8qIEFjY2VwdCBmaWx0ZXJfbWV0aG9kIDY0IChpbnRyYXBpeGVsIGRpZmZlcmVuY2luZykgb25seSBpZgorICAgICogMS4gTGlicG5nIHdhcyBjb21waWxlZCB3aXRoIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEIGFuZAorICAgICogMi4gTGlicG5nIGRpZCBub3QgcmVhZCBhIFBORyBzaWduYXR1cmUgKHRoaXMgZmlsdGVyX21ldGhvZCBpcyBvbmx5CisgICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZAorICAgICogMy4gVGhlIGFwcGxpY2F0aW9uIGNhbGxlZCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyB3aXRoIGEgbWFzayB0aGF0CisgICAgKiAgICBpbmNsdWRlZCBQTkdfRkxBR19NTkdfRklMVEVSXzY0IGFuZAorICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kCisgICAgKiA1LiBUaGUgY29sb3JfdHlwZSBpcyBSR0Igb3IgUkdCQQorICAgICovCisgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTkdfU0lHTkFUVVJFKSAmJgorICAgICAgIHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQpCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTU5HIGZlYXR1cmVzIGFyZSBub3QgYWxsb3dlZCBpbiBhIFBORyBkYXRhc3RyZWFtIik7CisKKyAgIGlmIChmaWx0ZXJfdHlwZSAhPSBQTkdfRklMVEVSX1RZUEVfQkFTRSkKKyAgIHsKKyAgICAgIGlmICghKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgJiYKKyAgICAgICAgIChmaWx0ZXJfdHlwZSA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpICYmCisgICAgICAgICAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTkdfU0lHTkFUVVJFKSA9PSAwKSAmJgorICAgICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8CisgICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkpKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gZmlsdGVyIG1ldGhvZCBpbiBJSERSIik7CisgICAgICAgICBlcnJvciA9IDE7CisgICAgICB9CisKKyAgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGZpbHRlciBtZXRob2QgaW4gSUhEUiIpOworICAgICAgICAgZXJyb3IgPSAxOworICAgICAgfQorICAgfQorCisjZWxzZQorICAgaWYgKGZpbHRlcl90eXBlICE9IFBOR19GSUxURVJfVFlQRV9CQVNFKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gZmlsdGVyIG1ldGhvZCBpbiBJSERSIik7CisgICAgICBlcnJvciA9IDE7CisgICB9CisjZW5kaWYKKworICAgaWYgKGVycm9yID09IDEpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgSUhEUiBkYXRhIik7Cit9CisjZW5kaWYgLyogZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9saWJwbmcvcG5nZXJyb3IuYyBiL2NvbTMyL2xpYi9saWJwbmcvcG5nZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmM5OGZiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9wbmdlcnJvci5jCkBAIC0wLDAgKzEsMzg2IEBACisKKy8qIHBuZ2Vycm9yLmMgLSBzdHViIGZ1bmN0aW9ucyBmb3IgaS9vIGFuZCBtZW1vcnkgYWxsb2NhdGlvbgorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjQxIFtEZWNlbWJlciAzLCAyMDA5XQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKKyAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgorICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBsb2NhdGlvbiBmb3IgYWxsIGVycm9yIGhhbmRsaW5nLiAgVXNlcnMgd2hvCisgKiBuZWVkIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcgYXJlIGV4cGVjdGVkIHRvIHdyaXRlIHJlcGxhY2VtZW50IGZ1bmN0aW9ucworICogYW5kIHVzZSBwbmdfc2V0X2Vycm9yX2ZuKCkgdG8gdXNlIHRob3NlIGZ1bmN0aW9ucy4gIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zCisgKiBhdCBlYWNoIGZ1bmN0aW9uLgorICovCisKKyNkZWZpbmUgUE5HX0lOVEVSTkFMCisjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUworI2luY2x1ZGUgInBuZy5oIgorI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCisKK3N0YXRpYyB2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kZWZhdWx0X2Vycm9yIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpKSBQTkdfTk9SRVRVUk47CisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLworcG5nX2RlZmF1bHRfd2FybmluZyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21lc3NhZ2UpKTsKKyNlbmRpZiAvKiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGEgZmF0YWwgZXJyb3IuICBUaGlzIGZ1bmN0aW9uCisgKiBzaG91bGQgbm90IGJlIGNoYW5nZWQuICBJZiB0aGVyZSBpcyBhIG5lZWQgdG8gaGFuZGxlIGVycm9ycyBkaWZmZXJlbnRseSwKKyAqIHlvdSBzaG91bGQgc3VwcGx5IGEgcmVwbGFjZW1lbnQgZXJyb3IgZnVuY3Rpb24gYW5kIHVzZSBwbmdfc2V0X2Vycm9yX2ZuKCkKKyAqIHRvIHJlcGxhY2UgdGhlIGVycm9yIGZ1bmN0aW9uIGF0IHJ1bi10aW1lLgorICovCisjaWZkZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKQoreworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAorICAgY2hhciBtc2dbMTZdOworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgIHsKKyAgICAgaWYgKHBuZ19wdHItPmZsYWdzJgorICAgICAgIChQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTfFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpKQorICAgICB7CisgICAgICAgaWYgKCplcnJvcl9tZXNzYWdlID09IFBOR19MSVRFUkFMX1NIQVJQKQorICAgICAgIHsKKyAgICAgICAgICAgLyogU3RyaXAgIiNubm5uICIgZnJvbSBiZWdpbm5pbmcgb2YgZXJyb3IgbWVzc2FnZS4gKi8KKyAgICAgICAgICAgaW50IG9mZnNldDsKKyAgICAgICAgICAgZm9yIChvZmZzZXQgPSAxOyBvZmZzZXQ8MTU7IG9mZnNldCsrKQorICAgICAgICAgICAgICBpZiAoZXJyb3JfbWVzc2FnZVtvZmZzZXRdID09ICcgJykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9mZnNldCAtIDE7IGkrKykKKyAgICAgICAgICAgICAgICAgbXNnW2ldID0gZXJyb3JfbWVzc2FnZVtpICsgMV07CisgICAgICAgICAgICAgIG1zZ1tpIC0gMV0gPSAnXDAnOworICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gbXNnOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSArPSBvZmZzZXQ7CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICAgIGlmIChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1zZ1swXSA9ICcwJzsKKyAgICAgICAgICAgICAgbXNnWzFdID0gJ1wwJzsKKyAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9IG1zZzsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgfQorICAgfQorI2VuZGlmCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIHBuZ19wdHItPmVycm9yX2ZuICE9IE5VTEwpCisgICAgICAoKihwbmdfcHRyLT5lcnJvcl9mbikpKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOworCisgICAvKiBJZiB0aGUgY3VzdG9tIGhhbmRsZXIgZG9lc24ndCBleGlzdCwgb3IgaWYgaXQgcmV0dXJucywKKyAgICAgIHVzZSB0aGUgZGVmYXVsdCBoYW5kbGVyLCB3aGljaCB3aWxsIG5vdCByZXR1cm4uICovCisgICBwbmdfZGVmYXVsdF9lcnJvcihwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsKK30KKyNlbHNlCit2b2lkIFBOR0FQSQorcG5nX2Vycihwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBwbmdfcHRyLT5lcnJvcl9mbiAhPSBOVUxMKQorICAgICAgKCoocG5nX3B0ci0+ZXJyb3JfZm4pKShwbmdfcHRyLCAnXDAnKTsKKworICAgLyogSWYgdGhlIGN1c3RvbSBoYW5kbGVyIGRvZXNuJ3QgZXhpc3QsIG9yIGlmIGl0IHJldHVybnMsCisgICAgICB1c2UgdGhlIGRlZmF1bHQgaGFuZGxlciwgd2hpY2ggd2lsbCBub3QgcmV0dXJuLiAqLworICAgcG5nX2RlZmF1bHRfZXJyb3IocG5nX3B0ciwgJ1wwJyk7Cit9CisjZW5kaWYgLyogUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBhIG5vbi1mYXRhbCBlcnJvci4gIFRoaXMgZnVuY3Rpb24KKyAqIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gIElmIHRoZXJlIGlzIGEgbmVlZCB0byBoYW5kbGUgd2FybmluZ3MgZGlmZmVyZW50bHksCisgKiB5b3Ugc2hvdWxkIHN1cHBseSBhIHJlcGxhY2VtZW50IHdhcm5pbmcgZnVuY3Rpb24gYW5kIHVzZQorICogcG5nX3NldF9lcnJvcl9mbigpIHRvIHJlcGxhY2UgdGhlIHdhcm5pbmcgZnVuY3Rpb24gYXQgcnVuLXRpbWUuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfd2FybmluZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKQoreworICAgaW50IG9mZnNldCA9IDA7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPmZsYWdzJgorICAgICAoUE5HX0ZMQUdfU1RSSVBfRVJST1JfTlVNQkVSU3xQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUKSkKKyNlbmRpZgorICAgICB7CisgICAgICAgaWYgKCp3YXJuaW5nX21lc3NhZ2UgPT0gUE5HX0xJVEVSQUxfU0hBUlApCisgICAgICAgeworICAgICAgICAgICBmb3IgKG9mZnNldCA9IDE7IG9mZnNldCA8IDE1OyBvZmZzZXQrKykKKyAgICAgICAgICAgICAgaWYgKHdhcm5pbmdfbWVzc2FnZVtvZmZzZXRdID09ICcgJykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgICAgfQorICAgfQorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBwbmdfcHRyLT53YXJuaW5nX2ZuICE9IE5VTEwpCisgICAgICAoKihwbmdfcHRyLT53YXJuaW5nX2ZuKSkocG5nX3B0ciwgd2FybmluZ19tZXNzYWdlICsgb2Zmc2V0KTsKKyAgIGVsc2UKKyAgICAgIHBuZ19kZWZhdWx0X3dhcm5pbmcocG5nX3B0ciwgd2FybmluZ19tZXNzYWdlICsgb2Zmc2V0KTsKK30KKyNlbmRpZiAvKiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfYmVuaWduX2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKQoreworICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk4pCisgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7CisgIGVsc2UKKyAgICBwbmdfZXJyb3IocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7Cit9CisjZW5kaWYKKworLyogVGhlc2UgdXRpbGl0aWVzIGFyZSB1c2VkIGludGVybmFsbHkgdG8gYnVpbGQgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IHJlbGF0ZXMKKyAqIHRvIHRoZSBjdXJyZW50IGNodW5rLiAgVGhlIGNodW5rIG5hbWUgY29tZXMgZnJvbSBwbmdfcHRyLT5jaHVua19uYW1lLAorICogdGhpcyBpcyB1c2VkIHRvIHByZWZpeCB0aGUgbWVzc2FnZS4gIFRoZSBtZXNzYWdlIGlzIGxpbWl0ZWQgaW4gbGVuZ3RoCisgKiB0byA2MyBieXRlcywgdGhlIG5hbWUgY2hhcmFjdGVycyBhcmUgb3V0cHV0IGFzIGhleCBkaWdpdHMgd3JhcHBlZCBpbiBbXQorICogaWYgdGhlIGNoYXJhY3RlciBpcyBpbnZhbGlkLgorICovCisjZGVmaW5lIGlzbm9uYWxwaGEoYykgKChjKSA8IDY1IHx8IChjKSA+IDEyMiB8fCAoKGMpID4gOTAgJiYgKGMpIDwgOTcpKQorc3RhdGljIFBOR19DT05TVCBjaGFyIHBuZ19kaWdpdFsxNl0gPSB7CisgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCisgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnCit9OworCisjZGVmaW5lIFBOR19NQVhfRVJST1JfVEVYVCA2NAorI2lmIGRlZmluZWQoUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQpCitzdGF0aWMgdm9pZCAvKiBQUklWQVRFICovCitwbmdfZm9ybWF0X2J1ZmZlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAgYnVmZmVyLCBwbmdfY29uc3RfY2hhcnAKKyAgIGVycm9yX21lc3NhZ2UpCit7CisgICBpbnQgaW91dCA9IDAsIGlpbiA9IDA7CisKKyAgIHdoaWxlIChpaW4gPCA0KQorICAgeworICAgICAgaW50IGMgPSBwbmdfcHRyLT5jaHVua19uYW1lW2lpbisrXTsKKyAgICAgIGlmIChpc25vbmFscGhhKGMpKQorICAgICAgeworICAgICAgICAgYnVmZmVyW2lvdXQrK10gPSBQTkdfTElURVJBTF9MRUZUX1NRVUFSRV9CUkFDS0VUOworICAgICAgICAgYnVmZmVyW2lvdXQrK10gPSBwbmdfZGlnaXRbKGMgJiAweGYwKSA+PiA0XTsKKyAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gcG5nX2RpZ2l0W2MgJiAweDBmXTsKKyAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gUE5HX0xJVEVSQUxfUklHSFRfU1FVQVJFX0JSQUNLRVQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBidWZmZXJbaW91dCsrXSA9IChwbmdfYnl0ZSljOworICAgICAgfQorICAgfQorCisgICBpZiAoZXJyb3JfbWVzc2FnZSA9PSBOVUxMKQorICAgICAgYnVmZmVyW2lvdXRdID0gJ1wwJzsKKyAgIGVsc2UKKyAgIHsKKyAgICAgIGJ1ZmZlcltpb3V0KytdID0gJzonOworICAgICAgYnVmZmVyW2lvdXQrK10gPSAnICc7CisgICAgICBwbmdfbWVtY3B5KGJ1ZmZlciArIGlvdXQsIGVycm9yX21lc3NhZ2UsIFBOR19NQVhfRVJST1JfVEVYVCk7CisgICAgICBidWZmZXJbaW91dCArIFBOR19NQVhfRVJST1JfVEVYVCAtIDFdID0gJ1wwJzsKKyAgIH0KK30KKworI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19jaHVua19lcnJvcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSkKK3sKKyAgIGNoYXIgbXNnWzE4K1BOR19NQVhfRVJST1JfVEVYVF07CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICBwbmdfZXJyb3IocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7CisgICBlbHNlCisgICB7CisgICAgIHBuZ19mb3JtYXRfYnVmZmVyKHBuZ19wdHIsIG1zZywgZXJyb3JfbWVzc2FnZSk7CisgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBtc2cpOworICAgfQorfQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIFBOR19XQVJOSU5HU19TVVBQT1JURUQgfHwgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX2NodW5rX3dhcm5pbmcocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbWVzc2FnZSkKK3sKKyAgIGNoYXIgbXNnWzE4K1BOR19NQVhfRVJST1JfVEVYVF07CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCB3YXJuaW5nX21lc3NhZ2UpOworICAgZWxzZQorICAgeworICAgICBwbmdfZm9ybWF0X2J1ZmZlcihwbmdfcHRyLCBtc2csIHdhcm5pbmdfbWVzc2FnZSk7CisgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7CisgICB9Cit9CisjZW5kaWYgLyogUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisjaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX2NodW5rX2Jlbmlnbl9lcnJvcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSkKK3sKKyAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQkVOSUdOX0VSUk9SU19XQVJOKQorICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOworICBlbHNlCisgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsIGVycm9yX21lc3NhZ2UpOworfQorI2VuZGlmCisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCisKKy8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb24uICBOb3RlIHRoYXQgcmVwbGFjZW1lbnRzIGZvcgorICogdGhpcyBmdW5jdGlvbiBNVVNUIE5PVCBSRVRVUk4sIG9yIHRoZSBwcm9ncmFtIHdpbGwgbGlrZWx5IGNyYXNoLiAgVGhpcworICogZnVuY3Rpb24gaXMgdXNlZCBieSBkZWZhdWx0LCBvciBpZiB0aGUgcHJvZ3JhbSBzdXBwbGllcyBOVUxMIGZvciB0aGUKKyAqIGVycm9yIGZ1bmN0aW9uIHBvaW50ZXIgaW4gcG5nX3NldF9lcnJvcl9mbigpLgorICovCitzdGF0aWMgdm9pZCAvKiBQUklWQVRFICovCitwbmdfZGVmYXVsdF9lcnJvcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSkKK3sKKyNpZmRlZiBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQKKyNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKKyAgIGlmICgqZXJyb3JfbWVzc2FnZSA9PSBQTkdfTElURVJBTF9TSEFSUCkKKyAgIHsKKyAgICAgLyogU3RyaXAgIiNubm5uICIgZnJvbSBiZWdpbm5pbmcgb2YgZXJyb3IgbWVzc2FnZS4gKi8KKyAgICAgaW50IG9mZnNldDsKKyAgICAgY2hhciBlcnJvcl9udW1iZXJbMTZdOworICAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldDwxNTsgb2Zmc2V0KyspCisgICAgIHsKKyAgICAgICAgIGVycm9yX251bWJlcltvZmZzZXRdID0gZXJyb3JfbWVzc2FnZVtvZmZzZXQgKyAxXTsKKyAgICAgICAgIGlmIChlcnJvcl9tZXNzYWdlW29mZnNldF0gPT0gJyAnKQorICAgICAgICAgICAgIGJyZWFrOworICAgICB9CisgICAgIGlmICgob2Zmc2V0ID4gMSkgJiYgKG9mZnNldCA8IDE1KSkKKyAgICAgeworICAgICAgIGVycm9yX251bWJlcltvZmZzZXQgLSAxXSA9ICdcMCc7CisgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgZXJyb3Igbm8uICVzOiAlcyIsCisgICAgICAgICAgZXJyb3JfbnVtYmVyLCBlcnJvcl9tZXNzYWdlICsgb2Zmc2V0ICsgMSk7CisgICAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgZXJyb3I6ICVzLCBvZmZzZXQ9JWQiLAorICAgICAgICAgIGVycm9yX21lc3NhZ2UsIG9mZnNldCk7CisgICAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7CisgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyNlbmRpZgorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgZXJyb3I6ICVzIiwgZXJyb3JfbWVzc2FnZSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgUE5HX1NUUklOR19ORVdMSU5FKTsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyKQorICAgeworIyAgaWZkZWYgVVNFX0ZBUl9LRVlXT1JECisgICB7CisgICAgICBqbXBfYnVmIGptcGJ1ZjsKKyAgICAgIHBuZ19tZW1jcHkoam1wYnVmLCBwbmdfcHRyLT5qbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOworICAgICBsb25nam1wKGptcGJ1ZiwxKTsKKyAgIH0KKyMgIGVsc2UKKyAgIGxvbmdqbXAocG5nX3B0ci0+am1wYnVmLCAxKTsKKyMgIGVuZGlmCisgICB9CisjZW5kaWYKKyAgIC8qIEhlcmUgaWYgbm90IHNldGptcCBzdXBwb3J0IG9yIGlmIHBuZ19wdHIgaXMgbnVsbC4gKi8KKyAgIFBOR19BQk9SVCgpOworI2lmbmRlZiBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQKKyAgIGVycm9yX21lc3NhZ2UgPSBlcnJvcl9tZXNzYWdlOyAvKiBNYWtlIGNvbXBpbGVyIGhhcHB5ICovCisjZW5kaWYKK30KKworI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSB3YXJuaW5nLCBidXQgdGhlIGxpYnJhcnkgdGhpbmtzCisgKiBpdCBjYW4gY29udGludWUgYW55d2F5LiAgUmVwbGFjZW1lbnQgZnVuY3Rpb25zIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKKyAqIGhlcmUgaWYgeW91IGRvbid0IHdhbnQgdGhlbSB0by4gIEluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIHBuZ19wdHIgaXMKKyAqIG5vdCB1c2VkLCBidXQgaXQgaXMgcGFzc2VkIGluIGNhc2UgaXQgbWF5IGJlIHVzZWZ1bC4KKyAqLworc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLworcG5nX2RlZmF1bHRfd2FybmluZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKQoreworI2lmZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAorIyAgaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECisgICBpZiAoKndhcm5pbmdfbWVzc2FnZSA9PSBQTkdfTElURVJBTF9TSEFSUCkKKyAgIHsKKyAgICAgaW50IG9mZnNldDsKKyAgICAgY2hhciB3YXJuaW5nX251bWJlclsxNl07CisgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMTU7IG9mZnNldCsrKQorICAgICB7CisgICAgICAgIHdhcm5pbmdfbnVtYmVyW29mZnNldF0gPSB3YXJuaW5nX21lc3NhZ2Vbb2Zmc2V0ICsgMV07CisgICAgICAgIGlmICh3YXJuaW5nX21lc3NhZ2Vbb2Zmc2V0XSA9PSAnICcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgfQorICAgICBpZiAoKG9mZnNldCA+IDEpICYmIChvZmZzZXQgPCAxNSkpCisgICAgIHsKKyAgICAgICB3YXJuaW5nX251bWJlcltvZmZzZXQgKyAxXSA9ICdcMCc7CisgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgd2FybmluZyBuby4gJXM6ICVzIiwKKyAgICAgICAgICB3YXJuaW5nX251bWJlciwgd2FybmluZ19tZXNzYWdlICsgb2Zmc2V0KTsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgUE5HX1NUUklOR19ORVdMSU5FKTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyB3YXJuaW5nOiAlcyIsCisgICAgICAgICAgd2FybmluZ19tZXNzYWdlKTsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgUE5HX1NUUklOR19ORVdMSU5FKTsKKyAgICAgfQorICAgfQorICAgZWxzZQorIyAgZW5kaWYKKyAgIHsKKyAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgd2FybmluZzogJXMiLCB3YXJuaW5nX21lc3NhZ2UpOworICAgICBmcHJpbnRmKHN0ZGVyciwgUE5HX1NUUklOR19ORVdMSU5FKTsKKyAgIH0KKyNlbHNlCisgICB3YXJuaW5nX21lc3NhZ2UgPSB3YXJuaW5nX21lc3NhZ2U7IC8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKyNlbmRpZgorICAgcG5nX3B0ciA9IHBuZ19wdHI7IC8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8KK30KKyNlbmRpZiAvKiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZSBhbm90aGVyIG1ldGhvZAorICogb2YgaGFuZGxpbmcgZXJyb3JzIGFuZCB3YXJuaW5ncy4gIE5vdGUgdGhhdCB0aGUgZXJyb3IgZnVuY3Rpb24gTVVTVCBOT1QKKyAqIHJldHVybiB0byB0aGUgY2FsbGluZyByb3V0aW5lIG9yIHNlcmlvdXMgcHJvYmxlbXMgd2lsbCBvY2N1ci4gIFRoZSByZXR1cm4KKyAqIG1ldGhvZCB1c2VkIGluIHRoZSBkZWZhdWx0IHJvdXRpbmUgY2FsbHMgbG9uZ2ptcChwbmdfcHRyLT5qbXBidWYsIDEpCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCisgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm4pCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcG5nX3B0ci0+ZXJyb3JfcHRyID0gZXJyb3JfcHRyOworICAgcG5nX3B0ci0+ZXJyb3JfZm4gPSBlcnJvcl9mbjsKKyAgIHBuZ19wdHItPndhcm5pbmdfZm4gPSB3YXJuaW5nX2ZuOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVycm9yX3B0ciBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIKKyAqIGZ1bmN0aW9ucy4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBwb2ludGVyIGJlZm9yZSBwbmdfd3JpdGVfZGVzdHJveSBhbmQgcG5nX3JlYWRfZGVzdHJveSBhcmUgY2FsbGVkLgorICovCitwbmdfdm9pZHAgUE5HQVBJCitwbmdfZ2V0X2Vycm9yX3B0cihwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworICAgcmV0dXJuICgocG5nX3ZvaWRwKXBuZ19wdHItPmVycm9yX3B0cik7Cit9CisKKworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBzdHJpcF9tb2RlKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgIHsKKyAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0KKyAgICAgICAoKH4oUE5HX0ZMQUdfU1RSSVBfRVJST1JfTlVNQkVSU3xQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUKSkmc3RyaXBfbW9kZSk7CisgICB9Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9wbmdnY2NyZC5jIGIvY29tMzIvbGliL2xpYnBuZy9wbmdnY2NyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YjhhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGlicG5nL3BuZ2djY3JkLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qIHBuZ2djY3JkLmMgd2FzIHJlbW92ZWQgZnJvbSBsaWJwbmctMS4yLjIwLiAqLworCisvKiBUaGlzIGNvZGUgc25pcHBldCBpcyBmb3IgdXNlIGJ5IGNvbmZpZ3VyZSdzIGNvbXBpbGF0aW9uIHRlc3QuICovCisKKyNpZiAoIWRlZmluZWQgX01TQ19WRVIpICYmIFwKKyAgICBkZWZpbmVkKFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQpICYmIFwKKyAgICBkZWZpbmVkKFBOR19NTVhfQ09ERV9TVVBQT1JURUQpCisKK2ludCBQTkdBUEkgcG5nX2R1bW15X21teF9zdXBwb3J0KHZvaWQpOworCitzdGF0aWMgaW50IF9tbXhfc3VwcG9ydGVkID0gMjsgLy8gMDogbm8gTU1YOyAxOiBNTVggc3VwcG9ydGVkOyAyOiBub3QgdGVzdGVkCisKK2ludCBQTkdBUEkKK3BuZ19kdW1teV9tbXhfc3VwcG9ydCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOworCitpbnQgUE5HQVBJCitwbmdfZHVtbXlfbW14X3N1cHBvcnQodm9pZCkKK3sKKyAgIGludCByZXN1bHQ7CisjaWZkZWYgUE5HX01NWF9DT0RFX1NVUFBPUlRFRCAgLy8gc3VwZXJmbHVvdXMsIGJ1dCB3aGF0IHRoZSBoZWNrCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorI2lmZGVmIF9feDg2XzY0X18KKyAgICAgICAgInB1c2hxICUlcmJ4ICAgICAgICAgIFxuXHQiICAvLyByYnggZ2V0cyBjbG9iYmVyZWQgYnkgQ1BVSUQgaW5zdHJ1Y3Rpb24KKyAgICAgICAgInB1c2hxICUlcmN4ICAgICAgICAgIFxuXHQiICAvLyBzbyBkb2VzIHJjeC4uLgorICAgICAgICAicHVzaHEgJSVyZHggICAgICAgICAgXG5cdCIgIC8vIC4uLmFuZCByZHggKGJ1dCByY3ggJiByZHggc2FmZSBvbiBMaW51eCkKKyAgICAgICAgInB1c2hmcSAgICAgICAgICAgICAgIFxuXHQiICAvLyBzYXZlIEVmbGFnIHRvIHN0YWNrCisgICAgICAgICJwb3BxICUlcmF4ICAgICAgICAgICBcblx0IiAgLy8gZ2V0IEVmbGFnIGZyb20gc3RhY2sgaW50byByYXgKKyAgICAgICAgIm1vdnEgJSVyYXgsICUlcmN4ICAgIFxuXHQiICAvLyBtYWtlIGFub3RoZXIgY29weSBvZiBFZmxhZyBpbiByY3gKKyAgICAgICAgInhvcmwgJDB4MjAwMDAwLCAlJWVheCBcblx0IiAvLyB0b2dnbGUgSUQgYml0IGluIEVmbGFnIChpLmUuLCBiaXQgMjEpCisgICAgICAgICJwdXNocSAlJXJheCAgICAgICAgICBcblx0IiAgLy8gc2F2ZSBtb2RpZmllZCBFZmxhZyBiYWNrIHRvIHN0YWNrCisgICAgICAgICJwb3BmcSAgICAgICAgICAgICAgICBcblx0IiAgLy8gcmVzdG9yZSBtb2RpZmllZCB2YWx1ZSB0byBFZmxhZyByZWcKKyAgICAgICAgInB1c2hmcSAgICAgICAgICAgICAgIFxuXHQiICAvLyBzYXZlIEVmbGFnIHRvIHN0YWNrCisgICAgICAgICJwb3BxICUlcmF4ICAgICAgICAgICBcblx0IiAgLy8gZ2V0IEVmbGFnIGZyb20gc3RhY2sKKyAgICAgICAgInB1c2hxICUlcmN4ICAgICAgICAgIFxuXHQiICAvLyBzYXZlIG9yaWdpbmFsIEVmbGFnIHRvIHN0YWNrCisgICAgICAgICJwb3BmcSAgICAgICAgICAgICAgICBcblx0IiAgLy8gcmVzdG9yZSBvcmlnaW5hbCBFZmxhZworI2Vsc2UKKyAgICAgICAgInB1c2hsICUlZWJ4ICAgICAgICAgIFxuXHQiICAvLyBlYnggZ2V0cyBjbG9iYmVyZWQgYnkgQ1BVSUQgaW5zdHJ1Y3Rpb24KKyAgICAgICAgInB1c2hsICUlZWN4ICAgICAgICAgIFxuXHQiICAvLyBzbyBkb2VzIGVjeC4uLgorICAgICAgICAicHVzaGwgJSVlZHggICAgICAgICAgXG5cdCIgIC8vIC4uLmFuZCBlZHggKGJ1dCBlY3ggJiBlZHggc2FmZSBvbiBMaW51eCkKKyAgICAgICAgInB1c2hmbCAgICAgICAgICAgICAgIFxuXHQiICAvLyBzYXZlIEVmbGFnIHRvIHN0YWNrCisgICAgICAgICJwb3BsICUlZWF4ICAgICAgICAgICBcblx0IiAgLy8gZ2V0IEVmbGFnIGZyb20gc3RhY2sgaW50byBlYXgKKyAgICAgICAgIm1vdmwgJSVlYXgsICUlZWN4ICAgIFxuXHQiICAvLyBtYWtlIGFub3RoZXIgY29weSBvZiBFZmxhZyBpbiBlY3gKKyAgICAgICAgInhvcmwgJDB4MjAwMDAwLCAlJWVheCBcblx0IiAvLyB0b2dnbGUgSUQgYml0IGluIEVmbGFnIChpLmUuLCBiaXQgMjEpCisgICAgICAgICJwdXNobCAlJWVheCAgICAgICAgICBcblx0IiAgLy8gc2F2ZSBtb2RpZmllZCBFZmxhZyBiYWNrIHRvIHN0YWNrCisgICAgICAgICJwb3BmbCAgICAgICAgICAgICAgICBcblx0IiAgLy8gcmVzdG9yZSBtb2RpZmllZCB2YWx1ZSB0byBFZmxhZyByZWcKKyAgICAgICAgInB1c2hmbCAgICAgICAgICAgICAgIFxuXHQiICAvLyBzYXZlIEVmbGFnIHRvIHN0YWNrCisgICAgICAgICJwb3BsICUlZWF4ICAgICAgICAgICBcblx0IiAgLy8gZ2V0IEVmbGFnIGZyb20gc3RhY2sKKyAgICAgICAgInB1c2hsICUlZWN4ICAgICAgICAgIFxuXHQiICAvLyBzYXZlIG9yaWdpbmFsIEVmbGFnIHRvIHN0YWNrCisgICAgICAgICJwb3BmbCAgICAgICAgICAgICAgICBcblx0IiAgLy8gcmVzdG9yZSBvcmlnaW5hbCBFZmxhZworI2VuZGlmCisgICAgICAgICJ4b3JsICUlZWN4LCAlJWVheCAgICBcblx0IiAgLy8gY29tcGFyZSBuZXcgRWZsYWcgd2l0aCBvcmlnaW5hbCBFZmxhZworICAgICAgICAianogMGYgICAgICAgICAgICAgICAgXG5cdCIgIC8vIGlmIHNhbWUsIENQVUlEIGluc3RyLiBpcyBub3Qgc3VwcG9ydGVkCisKKyAgICAgICAgInhvcmwgJSVlYXgsICUlZWF4ICAgIFxuXHQiICAvLyBzZXQgZWF4IHRvIHplcm8KKy8vICAgICAgIi5ieXRlICAweDBmLCAweGEyICAgIFxuXHQiICAvLyBDUFVJRCBpbnN0cnVjdGlvbiAodHdvLWJ5dGUgb3Bjb2RlKQorICAgICAgICAiY3B1aWQgICAgICAgICAgICAgICAgXG5cdCIgIC8vIGdldCB0aGUgQ1BVIGlkZW50aWZpY2F0aW9uIGluZm8KKyAgICAgICAgImNtcGwgJDEsICUlZWF4ICAgICAgIFxuXHQiICAvLyBtYWtlIHN1cmUgZWF4IHJldHVybiBub24temVybyB2YWx1ZQorICAgICAgICAiamwgMGYgICAgICAgICAgICAgICAgXG5cdCIgIC8vIGlmIGVheCBpcyB6ZXJvLCBNTVggaXMgbm90IHN1cHBvcnRlZAorCisgICAgICAgICJ4b3JsICUlZWF4LCAlJWVheCAgICBcblx0IiAgLy8gc2V0IGVheCB0byB6ZXJvIGFuZC4uLgorICAgICAgICAiaW5jbCAlJWVheCAgICAgICAgICAgXG5cdCIgIC8vIC4uLmluY3JlbWVudCBlYXggdG8gMS4gIFRoaXMgcGFpciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhc3RlciB0aGFuIHRoZSBpbnN0cnVjdGlvbiAibW92IGVheCwgMSIKKyAgICAgICAgImNwdWlkICAgICAgICAgICAgICAgIFxuXHQiICAvLyBnZXQgdGhlIENQVSBpZGVudGlmaWNhdGlvbiBpbmZvIGFnYWluCisgICAgICAgICJhbmRsICQweDgwMDAwMCwgJSVlZHggXG5cdCIgLy8gbWFzayBvdXQgYWxsIGJpdHMgYnV0IE1NWCBiaXQgKDIzKQorICAgICAgICAiY21wbCAkMCwgJSVlZHggICAgICAgXG5cdCIgIC8vIDAgPSBNTVggbm90IHN1cHBvcnRlZAorICAgICAgICAianogMGYgICAgICAgICAgICAgICAgXG5cdCIgIC8vIG5vbi16ZXJvID0geWVzLCBNTVggSVMgc3VwcG9ydGVkCisKKyAgICAgICAgIm1vdmwgJDEsICUlZWF4ICAgICAgIFxuXHQiICAvLyBzZXQgcmV0dXJuIHZhbHVlIHRvIDEKKyAgICAgICAgImptcCAgMWYgICAgICAgICAgICAgIFxuXHQiICAvLyBET05FOiAgaGF2ZSBNTVggc3VwcG9ydAorCisgICAgIjA6ICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gLk5PVF9TVVBQT1JURUQ6IHRhcmdldCBsYWJlbCBmb3IganVtcCBpbnN0cnVjdGlvbnMKKyAgICAgICAgIm1vdmwgJDAsICUlZWF4ICAgICAgIFxuXHQiICAvLyBzZXQgcmV0dXJuIHZhbHVlIHRvIDAKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAvLyAuUkVUVVJOOiB0YXJnZXQgbGFiZWwgZm9yIGp1bXAgaW5zdHJ1Y3Rpb25zCisjaWZkZWYgX194ODZfNjRfXworICAgICAgICAicG9wcSAlJXJkeCAgICAgICAgICAgXG5cdCIgIC8vIHJlc3RvcmUgcmR4CisgICAgICAgICJwb3BxICUlcmN4ICAgICAgICAgICBcblx0IiAgLy8gcmVzdG9yZSByY3gKKyAgICAgICAgInBvcHEgJSVyYnggICAgICAgICAgIFxuXHQiICAvLyByZXN0b3JlIHJieAorI2Vsc2UKKyAgICAgICAgInBvcGwgJSVlZHggICAgICAgICAgIFxuXHQiICAvLyByZXN0b3JlIGVkeAorICAgICAgICAicG9wbCAlJWVjeCAgICAgICAgICAgXG5cdCIgIC8vIHJlc3RvcmUgZWN4CisgICAgICAgICJwb3BsICUlZWJ4ICAgICAgICAgICBcblx0IiAgLy8gcmVzdG9yZSBlYngKKyNlbmRpZgorCisvLyAgICAgICJyZXQgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gRE9ORTogIG5vIE1NWCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZhbGwgdGhyb3VnaCB0byBzdGFuZGFyZCBDICJyZXQiKQorCisgICAgICAgIDogIj1hIiAocmVzdWx0KSAgICAgICAgICAgICAgLy8gb3V0cHV0IGxpc3QKKworICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSB2YXJpYWJsZXMgdXNlZCBvbiBpbnB1dCAobm9uZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNsb2JiZXIgbGlzdAorLy8gICAgICAsICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIgICAgIC8vIEdSUjogIHdlIGhhbmRsZSB0aGVzZSBtYW51YWxseQorLy8gICAgICAsICJtZW1vcnkiICAgLy8gaWYgd3JpdGUgdG8gYSB2YXJpYWJsZSBnY2MgdGhvdWdodCB3YXMgaW4gYSByZWcKKy8vICAgICAgLCAiY2MiICAgICAgIC8vICJjb25kaXRpb24gY29kZXMiIChmbGFnIGJpdHMpCisgICAgKTsKKyAgICBfbW14X3N1cHBvcnRlZCA9IHJlc3VsdDsKKyNlbHNlCisgICAgX21teF9zdXBwb3J0ZWQgPSAwOworI2VuZGlmIC8qIFBOR19NTVhfQ09ERV9TVVBQT1JURUQgKi8KKworICAgIHJldHVybiBfbW14X3N1cHBvcnRlZDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9wbmdnZXQuYyBiL2NvbTMyL2xpYi9saWJwbmcvcG5nZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5NzMyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvcG5nZ2V0LmMKQEAgLTAsMCArMSw5NDQgQEAKKworLyogcG5nZ2V0LmMgLSByZXRyaWV2YWwgb2YgdmFsdWVzIGZyb20gaW5mbyBzdHJ1Y3QKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuMi40MyBbRmVicnVhcnkgMjUsIDIwMTBdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICoKKyAqLworCisjZGVmaW5lIFBOR19JTlRFUk5BTAorI2RlZmluZSBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MKKyNpbmNsdWRlICJwbmcuaCIKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQorCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfdmFsaWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBmbGFnKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuKGluZm9fcHRyLT52YWxpZCAmIGZsYWcpOworCisgICBlbHNlCisgICAgICByZXR1cm4oMCk7Cit9CisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9yb3dieXRlcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCisgICAgICByZXR1cm4oaW5mb19wdHItPnJvd2J5dGVzKTsKKworICAgZWxzZQorICAgICAgcmV0dXJuKDApOworfQorCisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECitwbmdfYnl0ZXBwIFBOR0FQSQorcG5nX2dldF9yb3dzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybihpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsKKworICAgZWxzZQorICAgICAgcmV0dXJuKDApOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfRUFTWV9BQ0NFU1NfU1VQUE9SVEVECisvKiBFYXN5IGFjY2VzcyB0byBpbmZvLCBhZGRlZCBpbiBsaWJwbmctMC45OSAqLworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2ltYWdlX3dpZHRoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybiBpbmZvX3B0ci0+d2lkdGg7CisKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9pbWFnZV9oZWlnaHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuIGluZm9fcHRyLT5oZWlnaHQ7CisKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ19ieXRlIFBOR0FQSQorcG5nX2dldF9iaXRfZGVwdGgocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuIGluZm9fcHRyLT5iaXRfZGVwdGg7CisKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ19ieXRlIFBOR0FQSQorcG5nX2dldF9jb2xvcl90eXBlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybiBpbmZvX3B0ci0+Y29sb3JfdHlwZTsKKworICAgcmV0dXJuICgwKTsKK30KKworcG5nX2J5dGUgUE5HQVBJCitwbmdfZ2V0X2ZpbHRlcl90eXBlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybiBpbmZvX3B0ci0+ZmlsdGVyX3R5cGU7CisKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ19ieXRlIFBOR0FQSQorcG5nX2dldF9pbnRlcmxhY2VfdHlwZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCisgICAgICByZXR1cm4gaW5mb19wdHItPmludGVybGFjZV90eXBlOworCisgICByZXR1cm4gKDApOworfQorCitwbmdfYnl0ZSBQTkdBUEkKK3BuZ19nZXRfY29tcHJlc3Npb25fdHlwZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCisgICAgICByZXR1cm4gaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGU7CisKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpCisgICB7CisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIiKTsKKworICAgICAgaWYgKGluZm9fcHRyLT5waHlzX3VuaXRfdHlwZSAhPSBQTkdfUkVTT0xVVElPTl9NRVRFUikKKyAgICAgICAgICByZXR1cm4gKDApOworCisgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIChpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQpOworICAgfQorI2Vsc2UKKyAgIHJldHVybiAoMCk7CisjZW5kaWYKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpCisgICB7CisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIiKTsKKworICAgICAgaWYgKGluZm9fcHRyLT5waHlzX3VuaXRfdHlwZSAhPSBQTkdfUkVTT0xVVElPTl9NRVRFUikKKyAgICAgICAgICByZXR1cm4gKDApOworCisgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIChpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQpOworICAgfQorI2Vsc2UKKyAgIHJldHVybiAoMCk7CisjZW5kaWYKKyAgIHJldHVybiAoMCk7Cit9CisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9waXhlbHNfcGVyX21ldGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlciIpOworCisgICAgICBpZiAoaW5mb19wdHItPnBoeXNfdW5pdF90eXBlICE9IFBOR19SRVNPTFVUSU9OX01FVEVSIHx8CisgICAgICAgICBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQgIT0gaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0KQorICAgICAgICAgIHJldHVybiAoMCk7CisKKyAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCk7CisgICB9CisjZWxzZQorICAgcmV0dXJuICgwKTsKKyNlbmRpZgorICAgcmV0dXJuICgwKTsKK30KKworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK2Zsb2F0IFBOR0FQSQorcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQorICAgeworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorCisgICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykKKyAgIHsKKyAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X2FzcGVjdF9yYXRpbyIpOworCisgICAgICBpZiAoaW5mb19wdHItPnhfcGl4ZWxzX3Blcl91bml0ID09IDApCisgICAgICAgICByZXR1cm4gKChmbG9hdCkwLjApOworCisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gKChmbG9hdCkoKGZsb2F0KWluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdAorICAgICAgICAgICAgLyhmbG9hdClpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQpKTsKKyAgIH0KKyNlbHNlCisgICAgICByZXR1cm4gKDAuMCk7CisjZW5kaWYKKyAgIHJldHVybiAoKGZsb2F0KTAuMCk7Cit9CisjZW5kaWYKKworcG5nX2ludF8zMiBQTkdBUEkKK3BuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECisKKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19vRkZzKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyIpOworCisgICAgICBpZiAoaW5mb19wdHItPm9mZnNldF91bml0X3R5cGUgIT0gUE5HX09GRlNFVF9NSUNST01FVEVSKQorICAgICAgICAgIHJldHVybiAoMCk7CisKKyAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT54X29mZnNldCk7CisgICB9CisjZWxzZQorICAgICAgcmV0dXJuICgwKTsKKyNlbmRpZgorICAgcmV0dXJuICgwKTsKK30KKworcG5nX2ludF8zMiBQTkdBUEkKK3BuZ19nZXRfeV9vZmZzZXRfbWljcm9ucyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCisKKyNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19vRkZzKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucyIpOworCisgICAgICBpZiAoaW5mb19wdHItPm9mZnNldF91bml0X3R5cGUgIT0gUE5HX09GRlNFVF9NSUNST01FVEVSKQorICAgICAgICAgIHJldHVybiAoMCk7CisKKyAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT55X29mZnNldCk7CisgICB9CisjZWxzZQorICAgcmV0dXJuICgwKTsKKyNlbmRpZgorICAgcmV0dXJuICgwKTsKK30KKworcG5nX2ludF8zMiBQTkdBUEkKK3BuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKworI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpCisgICB7CisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF94X29mZnNldF9taWNyb25zIik7CisKKyAgICAgIGlmIChpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSAhPSBQTkdfT0ZGU0VUX1BJWEVMKQorICAgICAgICAgIHJldHVybiAoMCk7CisKKyAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT54X29mZnNldCk7CisgICB9CisjZWxzZQorICAgcmV0dXJuICgwKTsKKyNlbmRpZgorICAgcmV0dXJuICgwKTsKK30KKworcG5nX2ludF8zMiBQTkdBUEkKK3BuZ19nZXRfeV9vZmZzZXRfcGl4ZWxzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKworI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpCisgICB7CisgICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF95X29mZnNldF9taWNyb25zIik7CisKKyAgICAgIGlmIChpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSAhPSBQTkdfT0ZGU0VUX1BJWEVMKQorICAgICAgICAgIHJldHVybiAoMCk7CisKKyAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT55X29mZnNldCk7CisgICB9CisjZWxzZQorICAgcmV0dXJuICgwKTsKKyNlbmRpZgorICAgcmV0dXJuICgwKTsKK30KKworI2lmIGRlZmluZWQoUE5HX0lOQ0hfQ09OVkVSU0lPTlMpICYmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9waXhlbHNfcGVyX2luY2gocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgcmV0dXJuICgocG5nX3VpbnRfMzIpKChmbG9hdClwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpCisgICAgICouMDI1NCArLjUpKTsKK30KKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9pbmNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIHJldHVybiAoKHBuZ191aW50XzMyKSgoZmxvYXQpcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpCisgICAgICouMDI1NCArLjUpKTsKK30KKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIHJldHVybiAoKHBuZ191aW50XzMyKSgoZmxvYXQpcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpCisgICAgICouMDI1NCArLjUpKTsKK30KKworZmxvYXQgUE5HQVBJCitwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICByZXR1cm4gKChmbG9hdClwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpCisgICAgICouMDAwMDM5MzcpOworfQorCitmbG9hdCBQTkdBUEkKK3BuZ19nZXRfeV9vZmZzZXRfaW5jaGVzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIHJldHVybiAoKGZsb2F0KXBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucyhwbmdfcHRyLCBpbmZvX3B0cikKKyAgICAgKi4wMDAwMzkzNyk7Cit9CisKKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9wSFlzX2RwaShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfdWludF8zMiAqcmVzX3gsIHBuZ191aW50XzMyICpyZXNfeSwgaW50ICp1bml0X3R5cGUpCit7CisgICBwbmdfdWludF8zMiByZXR2YWwgPSAwOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBIWXMiKTsKKworICAgICAgaWYgKHJlc194ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqcmVzX3ggPSBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQ7CisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKKyAgICAgIH0KKyAgICAgIGlmIChyZXNfeSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgKnJlc195ID0gaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0OworICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3BIWXM7CisgICAgICB9CisgICAgICBpZiAodW5pdF90eXBlICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqdW5pdF90eXBlID0gKGludClpbmZvX3B0ci0+cGh5c191bml0X3R5cGU7CisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKKyAgICAgICAgIGlmICgqdW5pdF90eXBlID09IDEpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVzX3ggIT0gTlVMTCkgKnJlc194ID0gKHBuZ191aW50XzMyKSgqcmVzX3ggKiAuMDI1NCArIC41MCk7CisgICAgICAgICAgICBpZiAocmVzX3kgIT0gTlVMTCkgKnJlc195ID0gKHBuZ191aW50XzMyKSgqcmVzX3kgKiAuMDI1NCArIC41MCk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICByZXR1cm4gKHJldHZhbCk7Cit9CisjZW5kaWYgLyogUE5HX3BIWXNfU1VQUE9SVEVEICovCisjZW5kaWYgIC8qIFBOR19JTkNIX0NPTlZFUlNJT05TICYmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgKi8KKworLyogcG5nX2dldF9jaGFubmVscyByZWFsbHkgYmVsb25ncyBpbiBoZXJlLCB0b28sIGJ1dCBpdCdzIGJlZW4gYXJvdW5kIGxvbmdlciAqLworCisjZW5kaWYgIC8qIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQgKi8KKworcG5nX2J5dGUgUE5HQVBJCitwbmdfZ2V0X2NoYW5uZWxzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHJldHVybihpbmZvX3B0ci0+Y2hhbm5lbHMpOworICAgZWxzZQorICAgICAgcmV0dXJuICgwKTsKK30KKworcG5nX2J5dGVwIFBOR0FQSQorcG5nX2dldF9zaWduYXR1cmUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcmV0dXJuKGluZm9fcHRyLT5zaWduYXR1cmUpOworICAgZWxzZQorICAgICAgcmV0dXJuIChOVUxMKTsKK30KKworI2lmZGVmIFBOR19iS0dEX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2JLR0QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX2NvbG9yXzE2cCAqYmFja2dyb3VuZCkKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fYktHRCkKKyAgICAgICYmIGJhY2tncm91bmQgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJiS0dEIik7CisKKyAgICAgICpiYWNrZ3JvdW5kID0gJihpbmZvX3B0ci0+YmFja2dyb3VuZCk7CisgICAgICByZXR1cm4gKFBOR19JTkZPX2JLR0QpOworICAgfQorICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2NIUk0ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgZG91YmxlICp3aGl0ZV94LCBkb3VibGUgKndoaXRlX3ksIGRvdWJsZSAqcmVkX3gsIGRvdWJsZSAqcmVkX3ksCisgICBkb3VibGUgKmdyZWVuX3gsIGRvdWJsZSAqZ3JlZW5feSwgZG91YmxlICpibHVlX3gsIGRvdWJsZSAqYmx1ZV95KQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19jSFJNKSkKKyAgIHsKKyAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJjSFJNIik7CisKKyAgICAgIGlmICh3aGl0ZV94ICE9IE5VTEwpCisgICAgICAgICAqd2hpdGVfeCA9IChkb3VibGUpaW5mb19wdHItPnhfd2hpdGU7CisgICAgICBpZiAod2hpdGVfeSAhPSBOVUxMKQorICAgICAgICAgKndoaXRlX3kgPSAoZG91YmxlKWluZm9fcHRyLT55X3doaXRlOworICAgICAgaWYgKHJlZF94ICE9IE5VTEwpCisgICAgICAgICAqcmVkX3ggPSAoZG91YmxlKWluZm9fcHRyLT54X3JlZDsKKyAgICAgIGlmIChyZWRfeSAhPSBOVUxMKQorICAgICAgICAgKnJlZF95ID0gKGRvdWJsZSlpbmZvX3B0ci0+eV9yZWQ7CisgICAgICBpZiAoZ3JlZW5feCAhPSBOVUxMKQorICAgICAgICAgKmdyZWVuX3ggPSAoZG91YmxlKWluZm9fcHRyLT54X2dyZWVuOworICAgICAgaWYgKGdyZWVuX3kgIT0gTlVMTCkKKyAgICAgICAgICpncmVlbl95ID0gKGRvdWJsZSlpbmZvX3B0ci0+eV9ncmVlbjsKKyAgICAgIGlmIChibHVlX3ggIT0gTlVMTCkKKyAgICAgICAgICpibHVlX3ggPSAoZG91YmxlKWluZm9fcHRyLT54X2JsdWU7CisgICAgICBpZiAoYmx1ZV95ICE9IE5VTEwpCisgICAgICAgICAqYmx1ZV95ID0gKGRvdWJsZSlpbmZvX3B0ci0+eV9ibHVlOworICAgICAgcmV0dXJuIChQTkdfSU5GT19jSFJNKTsKKyAgIH0KKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfY0hSTV9maXhlZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfZml4ZWRfcG9pbnQgKndoaXRlX3gsIHBuZ19maXhlZF9wb2ludCAqd2hpdGVfeSwgcG5nX2ZpeGVkX3BvaW50ICpyZWRfeCwKKyAgIHBuZ19maXhlZF9wb2ludCAqcmVkX3ksIHBuZ19maXhlZF9wb2ludCAqZ3JlZW5feCwgcG5nX2ZpeGVkX3BvaW50ICpncmVlbl95LAorICAgcG5nX2ZpeGVkX3BvaW50ICpibHVlX3gsIHBuZ19maXhlZF9wb2ludCAqYmx1ZV95KQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImNIUk0iKTsKKworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19jSFJNKSkKKyAgIHsKKyAgICAgIGlmICh3aGl0ZV94ICE9IE5VTEwpCisgICAgICAgICAqd2hpdGVfeCA9IGluZm9fcHRyLT5pbnRfeF93aGl0ZTsKKyAgICAgIGlmICh3aGl0ZV95ICE9IE5VTEwpCisgICAgICAgICAqd2hpdGVfeSA9IGluZm9fcHRyLT5pbnRfeV93aGl0ZTsKKyAgICAgIGlmIChyZWRfeCAhPSBOVUxMKQorICAgICAgICAgKnJlZF94ID0gaW5mb19wdHItPmludF94X3JlZDsKKyAgICAgIGlmIChyZWRfeSAhPSBOVUxMKQorICAgICAgICAgKnJlZF95ID0gaW5mb19wdHItPmludF95X3JlZDsKKyAgICAgIGlmIChncmVlbl94ICE9IE5VTEwpCisgICAgICAgICAqZ3JlZW5feCA9IGluZm9fcHRyLT5pbnRfeF9ncmVlbjsKKyAgICAgIGlmIChncmVlbl95ICE9IE5VTEwpCisgICAgICAgICAqZ3JlZW5feSA9IGluZm9fcHRyLT5pbnRfeV9ncmVlbjsKKyAgICAgIGlmIChibHVlX3ggIT0gTlVMTCkKKyAgICAgICAgICpibHVlX3ggPSBpbmZvX3B0ci0+aW50X3hfYmx1ZTsKKyAgICAgIGlmIChibHVlX3kgIT0gTlVMTCkKKyAgICAgICAgICpibHVlX3kgPSBpbmZvX3B0ci0+aW50X3lfYmx1ZTsKKyAgICAgIHJldHVybiAoUE5HX0lORk9fY0hSTSk7CisgICB9CisgICByZXR1cm4gKDApOworfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9nQU1BKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgZG91YmxlICpmaWxlX2dhbW1hKQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImdBTUEiKTsKKworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19nQU1BKQorICAgICAgJiYgZmlsZV9nYW1tYSAhPSBOVUxMKQorICAgeworICAgICAgKmZpbGVfZ2FtbWEgPSAoZG91YmxlKWluZm9fcHRyLT5nYW1tYTsKKyAgICAgIHJldHVybiAoUE5HX0lORk9fZ0FNQSk7CisgICB9CisgICByZXR1cm4gKDApOworfQorI2VuZGlmCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2dBTUFfZml4ZWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgIHBuZ19maXhlZF9wb2ludCAqaW50X2ZpbGVfZ2FtbWEpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiZ0FNQSIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2dBTUEpCisgICAgICAmJiBpbnRfZmlsZV9nYW1tYSAhPSBOVUxMKQorICAgeworICAgICAgKmludF9maWxlX2dhbW1hID0gaW5mb19wdHItPmludF9nYW1tYTsKKyAgICAgIHJldHVybiAoUE5HX0lORk9fZ0FNQSk7CisgICB9CisgICByZXR1cm4gKDApOworfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3NSR0IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgKmZpbGVfc3JnYl9pbnRlbnQpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAic1JHQiIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NSR0IpCisgICAgICAmJiBmaWxlX3NyZ2JfaW50ZW50ICE9IE5VTEwpCisgICB7CisgICAgICAqZmlsZV9zcmdiX2ludGVudCA9IChpbnQpaW5mb19wdHItPnNyZ2JfaW50ZW50OworICAgICAgcmV0dXJuIChQTkdfSU5GT19zUkdCKTsKKyAgIH0KKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19pQ0NQX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2lDQ1AocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgICAgICAgICAgIHBuZ19jaGFycHAgbmFtZSwgaW50ICpjb21wcmVzc2lvbl90eXBlLAorICAgICAgICAgICAgIHBuZ19jaGFycHAgcHJvZmlsZSwgcG5nX3VpbnRfMzIgKnByb2ZsZW4pCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiaUNDUCIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2lDQ1ApCisgICAgICAmJiBuYW1lICE9IE5VTEwgJiYgcHJvZmlsZSAhPSBOVUxMICYmIHByb2ZsZW4gIT0gTlVMTCkKKyAgIHsKKyAgICAgICpuYW1lID0gaW5mb19wdHItPmljY3BfbmFtZTsKKyAgICAgICpwcm9maWxlID0gaW5mb19wdHItPmljY3BfcHJvZmlsZTsKKyAgICAgIC8qIENvbXByZXNzaW9uX3R5cGUgaXMgYSBkdW1teSBzbyB0aGUgQVBJIHdvbid0IGhhdmUgdG8gY2hhbmdlCisgICAgICAgKiBpZiB3ZSBpbnRyb2R1Y2UgbXVsdGlwbGUgY29tcHJlc3Npb24gdHlwZXMgbGF0ZXIuCisgICAgICAgKi8KKyAgICAgICpwcm9mbGVuID0gKGludClpbmZvX3B0ci0+aWNjcF9wcm9mbGVuOworICAgICAgKmNvbXByZXNzaW9uX3R5cGUgPSAoaW50KWluZm9fcHRyLT5pY2NwX2NvbXByZXNzaW9uOworICAgICAgcmV0dXJuIChQTkdfSU5GT19pQ0NQKTsKKyAgIH0KKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19zUExUX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3NQTFQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgICAgICAgICAgIHBuZ19zUExUX3RwcCBzcGFsZXR0ZXMpCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgc3BhbGV0dGVzICE9IE5VTEwpCisgICB7CisgICAgICpzcGFsZXR0ZXMgPSBpbmZvX3B0ci0+c3BsdF9wYWxldHRlczsKKyAgICAgcmV0dXJuICgocG5nX3VpbnRfMzIpaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtKTsKKyAgIH0KKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19oSVNUX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X2hJU1QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8xNnAgKmhpc3QpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiaElTVCIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2hJU1QpCisgICAgICAmJiBoaXN0ICE9IE5VTEwpCisgICB7CisgICAgICAqaGlzdCA9IGluZm9fcHRyLT5oaXN0OworICAgICAgcmV0dXJuIChQTkdfSU5GT19oSVNUKTsKKyAgIH0KKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X0lIRFIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX3VpbnRfMzIgKndpZHRoLCBwbmdfdWludF8zMiAqaGVpZ2h0LCBpbnQgKmJpdF9kZXB0aCwKKyAgIGludCAqY29sb3JfdHlwZSwgaW50ICppbnRlcmxhY2VfdHlwZSwgaW50ICpjb21wcmVzc2lvbl90eXBlLAorICAgaW50ICpmaWx0ZXJfdHlwZSkKKworeworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgIklIRFIiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMIHx8IHdpZHRoID09IE5VTEwgfHwKKyAgICAgICBoZWlnaHQgPT0gTlVMTCB8fCBiaXRfZGVwdGggPT0gTlVMTCB8fCBjb2xvcl90eXBlID09IE5VTEwpCisgICAgICByZXR1cm4gKDApOworCisgICAqd2lkdGggPSBpbmZvX3B0ci0+d2lkdGg7CisgICAqaGVpZ2h0ID0gaW5mb19wdHItPmhlaWdodDsKKyAgICpiaXRfZGVwdGggPSBpbmZvX3B0ci0+Yml0X2RlcHRoOworICAgKmNvbG9yX3R5cGUgPSBpbmZvX3B0ci0+Y29sb3JfdHlwZTsKKworICAgaWYgKGNvbXByZXNzaW9uX3R5cGUgIT0gTlVMTCkKKyAgICAgICpjb21wcmVzc2lvbl90eXBlID0gaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGU7CisKKyAgIGlmIChmaWx0ZXJfdHlwZSAhPSBOVUxMKQorICAgICAgKmZpbHRlcl90eXBlID0gaW5mb19wdHItPmZpbHRlcl90eXBlOworCisgICBpZiAoaW50ZXJsYWNlX3R5cGUgIT0gTlVMTCkKKyAgICAgICppbnRlcmxhY2VfdHlwZSA9IGluZm9fcHRyLT5pbnRlcmxhY2VfdHlwZTsKKworICAgLyogVGhpcyBpcyByZWR1bmRhbnQgaWYgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgaW5mb19wdHIgdmFsdWVzIHdlcmUgYWxsCisgICAgKiBhc3NpZ25lZCBpbiBwbmdfc2V0X0lIRFIoKS4gIFdlIGRvIHRoZSBjaGVjayBhbnlob3cgaW4gY2FzZSBhbgorICAgICogYXBwbGljYXRpb24gaGFzIGlnbm9yZWQgb3VyIGFkdmljZSBub3QgdG8gbWVzcyB3aXRoIHRoZSBtZW1iZXJzCisgICAgKiBvZiBpbmZvX3B0ciBkaXJlY3RseS4KKyAgICAqLworICAgcG5nX2NoZWNrX0lIRFIgKHBuZ19wdHIsIGluZm9fcHRyLT53aWR0aCwgaW5mb19wdHItPmhlaWdodCwKKyAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoLCBpbmZvX3B0ci0+Y29sb3JfdHlwZSwgaW5mb19wdHItPmludGVybGFjZV90eXBlLAorICAgICAgIGluZm9fcHRyLT5jb21wcmVzc2lvbl90eXBlLCBpbmZvX3B0ci0+ZmlsdGVyX3R5cGUpOworCisgICByZXR1cm4gKDEpOworfQorCisjaWZkZWYgUE5HX29GRnNfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfb0ZGcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfaW50XzMyICpvZmZzZXRfeCwgcG5nX2ludF8zMiAqb2Zmc2V0X3ksIGludCAqdW5pdF90eXBlKQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgIm9GRnMiKTsKKworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19vRkZzKQorICAgICAgJiYgb2Zmc2V0X3ggIT0gTlVMTCAmJiBvZmZzZXRfeSAhPSBOVUxMICYmIHVuaXRfdHlwZSAhPSBOVUxMKQorICAgeworICAgICAgKm9mZnNldF94ID0gaW5mb19wdHItPnhfb2Zmc2V0OworICAgICAgKm9mZnNldF95ID0gaW5mb19wdHItPnlfb2Zmc2V0OworICAgICAgKnVuaXRfdHlwZSA9IChpbnQpaW5mb19wdHItPm9mZnNldF91bml0X3R5cGU7CisgICAgICByZXR1cm4gKFBOR19JTkZPX29GRnMpOworICAgfQorICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX3BDQUxfU1VQUE9SVEVECitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfcENBTChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfY2hhcnAgKnB1cnBvc2UsIHBuZ19pbnRfMzIgKlgwLCBwbmdfaW50XzMyICpYMSwgaW50ICp0eXBlLCBpbnQgKm5wYXJhbXMsCisgICBwbmdfY2hhcnAgKnVuaXRzLCBwbmdfY2hhcnBwICpwYXJhbXMpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicENBTCIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BDQUwpCisgICAgICAgJiYgcHVycG9zZSAhPSBOVUxMICYmIFgwICE9IE5VTEwgJiYgWDEgIT0gTlVMTCAmJiB0eXBlICE9IE5VTEwgJiYKKyAgICAgICBucGFyYW1zICE9IE5VTEwgJiYgdW5pdHMgIT0gTlVMTCAmJiBwYXJhbXMgIT0gTlVMTCkKKyAgIHsKKyAgICAgICpwdXJwb3NlID0gaW5mb19wdHItPnBjYWxfcHVycG9zZTsKKyAgICAgICpYMCA9IGluZm9fcHRyLT5wY2FsX1gwOworICAgICAgKlgxID0gaW5mb19wdHItPnBjYWxfWDE7CisgICAgICAqdHlwZSA9IChpbnQpaW5mb19wdHItPnBjYWxfdHlwZTsKKyAgICAgICpucGFyYW1zID0gKGludClpbmZvX3B0ci0+cGNhbF9ucGFyYW1zOworICAgICAgKnVuaXRzID0gaW5mb19wdHItPnBjYWxfdW5pdHM7CisgICAgICAqcGFyYW1zID0gaW5mb19wdHItPnBjYWxfcGFyYW1zOworICAgICAgcmV0dXJuIChQTkdfSU5GT19wQ0FMKTsKKyAgIH0KKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19zQ0FMX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9zQ0FMKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgICAgICAgICAgICBpbnQgKnVuaXQsIGRvdWJsZSAqd2lkdGgsIGRvdWJsZSAqaGVpZ2h0KQoreworICAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0NBTCkpCisgICAgeworICAgICAgICAqdW5pdCA9IGluZm9fcHRyLT5zY2FsX3VuaXQ7CisgICAgICAgICp3aWR0aCA9IGluZm9fcHRyLT5zY2FsX3BpeGVsX3dpZHRoOworICAgICAgICAqaGVpZ2h0ID0gaW5mb19wdHItPnNjYWxfcGl4ZWxfaGVpZ2h0OworICAgICAgICByZXR1cm4gKFBOR19JTkZPX3NDQUwpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisjZWxzZQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9zQ0FMX3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgICAgICAgICAgIGludCAqdW5pdCwgcG5nX2NoYXJwcCB3aWR0aCwgcG5nX2NoYXJwcCBoZWlnaHQpCit7CisgICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCisgICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQ0FMKSkKKyAgICB7CisgICAgICAgICp1bml0ID0gaW5mb19wdHItPnNjYWxfdW5pdDsKKyAgICAgICAgKndpZHRoID0gaW5mb19wdHItPnNjYWxfc193aWR0aDsKKyAgICAgICAgKmhlaWdodCA9IGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0OworICAgICAgICByZXR1cm4gKFBOR19JTkZPX3NDQUwpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBQTkdfcEhZc19TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9wSFlzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgIHBuZ191aW50XzMyICpyZXNfeCwgcG5nX3VpbnRfMzIgKnJlc195LCBpbnQgKnVuaXRfdHlwZSkKK3sKKyAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7CisKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwSFlzIik7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgorICAgICAgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpKQorICAgeworICAgICAgaWYgKHJlc194ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqcmVzX3ggPSBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQ7CisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKKyAgICAgIH0KKworICAgICAgaWYgKHJlc195ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAqcmVzX3kgPSBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQ7CisgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKKyAgICAgIH0KKworICAgICAgaWYgKHVuaXRfdHlwZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgKnVuaXRfdHlwZSA9IChpbnQpaW5mb19wdHItPnBoeXNfdW5pdF90eXBlOworICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3BIWXM7CisgICAgICB9CisgICB9CisgICByZXR1cm4gKHJldHZhbCk7Cit9CisjZW5kaWYKKworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X1BMVEUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY29sb3JwICpwYWxldHRlLAorICAgaW50ICpudW1fcGFsZXR0ZSkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJQTFRFIik7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fUExURSkKKyAgICAgICAmJiBwYWxldHRlICE9IE5VTEwpCisgICB7CisgICAgICAqcGFsZXR0ZSA9IGluZm9fcHRyLT5wYWxldHRlOworICAgICAgKm51bV9wYWxldHRlID0gaW5mb19wdHItPm51bV9wYWxldHRlOworICAgICAgcG5nX2RlYnVnMSgzLCAibnVtX3BhbGV0dGUgPSAlZCIsICpudW1fcGFsZXR0ZSk7CisgICAgICByZXR1cm4gKFBOR19JTkZPX1BMVEUpOworICAgfQorICAgcmV0dXJuICgwKTsKK30KKworI2lmZGVmIFBOR19zQklUX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3NCSVQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY29sb3JfOHAgKnNpZ19iaXQpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAic0JJVCIpOworCisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NCSVQpCisgICAgICAmJiBzaWdfYml0ICE9IE5VTEwpCisgICB7CisgICAgICAqc2lnX2JpdCA9ICYoaW5mb19wdHItPnNpZ19iaXQpOworICAgICAgcmV0dXJuIChQTkdfSU5GT19zQklUKTsKKyAgIH0KKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3RleHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGV4dHAgKnRleHRfcHRyLAorICAgaW50ICpudW1fdGV4dCkKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ci0+bnVtX3RleHQgPiAwKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwKKyAgICAgICAgIChwbmdfcHRyLT5jaHVua19uYW1lWzBdID09ICdcMCcgPyAidGV4dCIKKyAgICAgICAgICAgICA6IChwbmdfY29uc3RfY2hhcnApcG5nX3B0ci0+Y2h1bmtfbmFtZSkpOworCisgICAgICBpZiAodGV4dF9wdHIgIT0gTlVMTCkKKyAgICAgICAgICp0ZXh0X3B0ciA9IGluZm9fcHRyLT50ZXh0OworCisgICAgICBpZiAobnVtX3RleHQgIT0gTlVMTCkKKyAgICAgICAgICpudW1fdGV4dCA9IGluZm9fcHRyLT5udW1fdGV4dDsKKworICAgICAgcmV0dXJuICgocG5nX3VpbnRfMzIpaW5mb19wdHItPm51bV90ZXh0KTsKKyAgIH0KKyAgIGlmIChudW1fdGV4dCAhPSBOVUxMKQorICAgICAqbnVtX3RleHQgPSAwOworICAgcmV0dXJuKDApOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfdElNRV9TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF90SU1FKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3RpbWVwICptb2RfdGltZSkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJ0SU1FIik7CisKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdElNRSkKKyAgICAgICAmJiBtb2RfdGltZSAhPSBOVUxMKQorICAgeworICAgICAgKm1vZF90aW1lID0gJihpbmZvX3B0ci0+bW9kX3RpbWUpOworICAgICAgcmV0dXJuIChQTkdfSU5GT190SU1FKTsKKyAgIH0KKyAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR190Uk5TX1NVUFBPUlRFRAorcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3RSTlMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX2J5dGVwICp0cmFucywgaW50ICpudW1fdHJhbnMsIHBuZ19jb2xvcl8xNnAgKnRyYW5zX3ZhbHVlcykKK3sKKyAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RSTlMpKQorICAgeworICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInRSTlMiKTsKKworICAgICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICAgaWYgKHRyYW5zICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgICp0cmFucyA9IGluZm9fcHRyLT50cmFuczsKKyAgICAgICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fdFJOUzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodHJhbnNfdmFsdWVzICE9IE5VTEwpCisgICAgICAgICAgICAgKnRyYW5zX3ZhbHVlcyA9ICYoaW5mb19wdHItPnRyYW5zX3ZhbHVlcyk7CisgICAgICB9CisgICAgICBlbHNlIC8qIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSAqLworICAgICAgeworICAgICAgICAgIGlmICh0cmFuc192YWx1ZXMgIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgKnRyYW5zX3ZhbHVlcyA9ICYoaW5mb19wdHItPnRyYW5zX3ZhbHVlcyk7CisgICAgICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3RSTlM7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRyYW5zICE9IE5VTEwpCisgICAgICAgICAgICAgKnRyYW5zID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChudW1fdHJhbnMgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgICpudW1fdHJhbnMgPSBpbmZvX3B0ci0+bnVtX3RyYW5zOworICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3RSTlM7CisgICAgICB9CisgICB9CisgICByZXR1cm4gKHJldHZhbCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF91bmtub3duX2NodW5rcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICAgICAgICAgICAgcG5nX3Vua25vd25fY2h1bmtwcCB1bmtub3ducykKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiB1bmtub3ducyAhPSBOVUxMKQorICAgeworICAgICAqdW5rbm93bnMgPSBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3M7CisgICAgIHJldHVybiAoKHBuZ191aW50XzMyKWluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0pOworICAgfQorICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECitwbmdfYnl0ZSBQTkdBUEkKK3BuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzIChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcmV0dXJuIChwbmdfYnl0ZSkocG5nX3B0cj8gcG5nX3B0ci0+cmdiX3RvX2dyYXlfc3RhdHVzIDogMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQKK3BuZ192b2lkcCBQTkdBUEkKK3BuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHJldHVybiAocG5nX3B0cj8gcG5nX3B0ci0+dXNlcl9jaHVua19wdHIgOiBOVUxMKTsKK30KKyNlbmRpZgorCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHJldHVybiAocG5nX3VpbnRfMzIpKHBuZ19wdHI/IHBuZ19wdHItPnpidWZfc2l6ZSA6IDBMKTsKK30KKworI2lmZGVmIFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQKKyNpZm5kZWYgUE5HXzFfMF9YCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS4yLjAgYW5kIHNob3VsZCBleGlzdCBieSBkZWZhdWx0ICovCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfYXNtX2ZsYWdzIChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgIC8qIE9ic29sZXRlLCB0byBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNC4wICovCisgICAgcmV0dXJuIChwbmdfcHRyPyAwTDogMEwpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS4yLjAgYW5kIHNob3VsZCBleGlzdCBieSBkZWZhdWx0ICovCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfYXNtX2ZsYWdtYXNrIChpbnQgZmxhZ19zZWxlY3QpCit7CisgICAgLyogT2Jzb2xldGUsIHRvIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS40LjAgKi8KKyAgICBmbGFnX3NlbGVjdD1mbGFnX3NlbGVjdDsKKyAgICByZXR1cm4gMEw7Cit9CisKKyAgICAvKiBHUlI6ICBjb3VsZCBhZGQgdGhpczogICAmJiBkZWZpbmVkKFBOR19NTVhfQ09ERV9TVVBQT1JURUQpICovCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS4yLjAgKi8KK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF9tbXhfZmxhZ21hc2sgKGludCBmbGFnX3NlbGVjdCwgaW50ICpjb21waWxlcklEKQoreworICAgIC8qIE9ic29sZXRlLCB0byBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNC4wICovCisgICAgZmxhZ19zZWxlY3Q9ZmxhZ19zZWxlY3Q7CisgICAgKmNvbXBpbGVySUQgPSAtMTsgICAvKiB1bmtub3duIChpLmUuLCBubyBhc20vTU1YIGNvZGUgY29tcGlsZWQpICovCisgICAgcmV0dXJuIDBMOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS4yLjAgKi8KK3BuZ19ieXRlIFBOR0FQSQorcG5nX2dldF9tbXhfYml0ZGVwdGhfdGhyZXNob2xkIChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgIC8qIE9ic29sZXRlLCB0byBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNC4wICovCisgICAgcmV0dXJuIChwbmdfcHRyPyAwOiAwKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuMi4wICovCitwbmdfdWludF8zMiBQTkdBUEkKK3BuZ19nZXRfbW14X3Jvd2J5dGVzX3RocmVzaG9sZCAocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgICAvKiBPYnNvbGV0ZSwgdG8gYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjQuMCAqLworICAgIHJldHVybiAocG5nX3B0cj8gMEw6IDBMKTsKK30KKyNlbmRpZiAvKiA/UE5HXzFfMF9YICovCisjZW5kaWYgLyogP1BOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisvKiBUaGVzZSBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byBsaWJwbmcgMS4yLjYgYnV0IG5vdCBlbmFibGVkCisqIGJ5IGRlZmF1bHQuIFRoZXkgd2lsbCBiZSBlbmFibGVkIGluIGxpYnBuZy0xLjQuMCAqLworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4IChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgIHJldHVybiAocG5nX3B0cj8gcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggOiAwKTsKK30KK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF91c2VyX2hlaWdodF9tYXggKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICAgcmV0dXJuIChwbmdfcHRyPyBwbmdfcHRyLT51c2VyX2hlaWdodF9tYXggOiAwKTsKK30KKyNlbmRpZiAvKiA/UE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQgKi8KKworI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL3BuZ21lbS5jIGIvY29tMzIvbGliL2xpYnBuZy9wbmdtZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWYyNzY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9wbmdtZW0uYwpAQCAtMCwwICsxLDY0MSBAQAorCisvKiBwbmdtZW0uYyAtIHN0dWIgZnVuY3Rpb25zIGZvciBtZW1vcnkgYWxsb2NhdGlvbgorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjQxIFtGZWJydWFyeSAyNSwgMjAxMF0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGFsbCBtZW1vcnkgYWxsb2NhdGlvbi4gIFVzZXJzIHdobworICogbmVlZCBzcGVjaWFsIG1lbW9yeSBoYW5kbGluZyBhcmUgZXhwZWN0ZWQgdG8gc3VwcGx5IHJlcGxhY2VtZW50CisgKiBmdW5jdGlvbnMgZm9yIHBuZ19tYWxsb2MoKSBhbmQgcG5nX2ZyZWUoKSwgYW5kIHRvIHVzZQorICogcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgYW5kIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSB0bworICogaWRlbnRpZnkgdGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9ucy4KKyAqLworCisjZGVmaW5lIFBOR19JTlRFUk5BTAorI2RlZmluZSBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MKKyNpbmNsdWRlICJwbmcuaCIKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQorCisvKiBCb3JsYW5kIERPUyBzcGVjaWFsIG1lbW9yeSBoYW5kbGVyICovCisjaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiAhZGVmaW5lZChfV2luZG93cykgJiYgIWRlZmluZWQoX19GTEFUX18pCisvKiBJZiB5b3UgY2hhbmdlIHRoaXMsIGJlIHN1cmUgdG8gY2hhbmdlIHRoZSBvbmUgaW4gcG5nLmggYWxzbyAqLworCisvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgcG5nX3N0cnVjdC4gIFRoZSBtYWxsb2MgYW5kIG1lbXNldCBjYW4gYmUgcmVwbGFjZWQKKyAgIGJ5IGEgc2luZ2xlIGNhbGwgdG8gY2FsbG9jKCkgaWYgdGhpcyBpcyB0aG91Z2h0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuICovCitwbmdfdm9pZHAgLyogUFJJVkFURSAqLworcG5nX2NyZWF0ZV9zdHJ1Y3QoaW50IHR5cGUpCit7CisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgcmV0dXJuIChwbmdfY3JlYXRlX3N0cnVjdF8yKHR5cGUsIHBuZ19tYWxsb2NfcHRyX05VTEwsIHBuZ192b2lkcF9OVUxMKSk7Cit9CisKKy8qIEFsdGVybmF0ZSB2ZXJzaW9uIG9mIHBuZ19jcmVhdGVfc3RydWN0LCBmb3IgdXNlIHdpdGggdXNlci1kZWZpbmVkIG1hbGxvYy4gKi8KK3BuZ192b2lkcCAvKiBQUklWQVRFICovCitwbmdfY3JlYXRlX3N0cnVjdF8yKGludCB0eXBlLCBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4sIHBuZ192b2lkcCBtZW1fcHRyKQoreworI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKyAgIHBuZ19zaXplX3Qgc2l6ZTsKKyAgIHBuZ192b2lkcCBzdHJ1Y3RfcHRyOworCisgICBpZiAodHlwZSA9PSBQTkdfU1RSVUNUX0lORk8pCisgICAgICBzaXplID0gcG5nX3NpemVvZihwbmdfaW5mbyk7CisgICBlbHNlIGlmICh0eXBlID09IFBOR19TVFJVQ1RfUE5HKQorICAgICAgc2l6ZSA9IHBuZ19zaXplb2YocG5nX3N0cnVjdCk7CisgICBlbHNlCisgICAgICByZXR1cm4gKHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKKworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgIGlmIChtYWxsb2NfZm4gIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19zdHJ1Y3QgZHVtbXlfc3RydWN0OworICAgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9ICZkdW1teV9zdHJ1Y3Q7CisgICAgICBwbmdfcHRyLT5tZW1fcHRyPW1lbV9wdHI7CisgICAgICBzdHJ1Y3RfcHRyID0gKCoobWFsbG9jX2ZuKSkocG5nX3B0ciwgKHBuZ191aW50XzMyKXNpemUpOworICAgfQorICAgZWxzZQorI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKyAgIHN0cnVjdF9wdHIgPSAocG5nX3ZvaWRwKWZhcm1hbGxvYyhzaXplKTsKKyAgIGlmIChzdHJ1Y3RfcHRyICE9IE5VTEwpCisgICAgICBwbmdfbWVtc2V0KHN0cnVjdF9wdHIsIDAsIHNpemUpOworICAgcmV0dXJuIChzdHJ1Y3RfcHRyKTsKK30KKworLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGEgcG5nX2NyZWF0ZV9zdHJ1Y3QoKSBjYWxsICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kZXN0cm95X3N0cnVjdChwbmdfdm9pZHAgc3RydWN0X3B0cikKK3sKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBwbmdfZGVzdHJveV9zdHJ1Y3RfMihzdHJ1Y3RfcHRyLCBwbmdfZnJlZV9wdHJfTlVMTCwgcG5nX3ZvaWRwX05VTEwpOworfQorCisvKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYSBwbmdfY3JlYXRlX3N0cnVjdCgpIGNhbGwgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2Rlc3Ryb3lfc3RydWN0XzIocG5nX3ZvaWRwIHN0cnVjdF9wdHIsIHBuZ19mcmVlX3B0ciBmcmVlX2ZuLAorICAgIHBuZ192b2lkcCBtZW1fcHRyKQoreworI2VuZGlmCisgICBpZiAoc3RydWN0X3B0ciAhPSBOVUxMKQorICAgeworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgICAgIGlmIChmcmVlX2ZuICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICBwbmdfc3RydWN0IGR1bW15X3N0cnVjdDsKKyAgICAgICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAmZHVtbXlfc3RydWN0OworICAgICAgICAgcG5nX3B0ci0+bWVtX3B0cj1tZW1fcHRyOworICAgICAgICAgKCooZnJlZV9mbikpKHBuZ19wdHIsIHN0cnVjdF9wdHIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKyAgICAgIGZhcmZyZWUgKHN0cnVjdF9wdHIpOworICAgfQorfQorCisvKiBBbGxvY2F0ZSBtZW1vcnkuICBGb3IgcmVhc29uYWJsZSBmaWxlcywgc2l6ZSBzaG91bGQgbmV2ZXIgZXhjZWVkCisgKiA2NEsuICBIb3dldmVyLCB6bGliIG1heSBhbGxvY2F0ZSBtb3JlIHRoZW4gNjRLIGlmIHlvdSBkb24ndCB0ZWxsCisgKiBpdCBub3QgdG8uICBTZWUgemNvbmYuaCBhbmQgcG5nLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uIHpsaWIgZG9lcworICogbmVlZCB0byBhbGxvY2F0ZSBleGFjdGx5IDY0Sywgc28gd2hhdGV2ZXIgeW91IGNhbGwgaGVyZSBtdXN0CisgKiBoYXZlIHRoZSBhYmlsaXR5IHRvIGRvIHRoYXQuCisgKgorICogQm9ybGFuZCBzZWVtcyB0byBoYXZlIGEgcHJvYmxlbSBpbiBET1MgbW9kZSBmb3IgZXhhY3RseSA2NEsuCisgKiBJdCBnaXZlcyB5b3UgYSBzZWdtZW50IHdpdGggYW4gb2Zmc2V0IG9mIDggKHBlcmhhcHMgdG8gc3RvcmUgaXRzCisgKiBtZW1vcnkgc3R1ZmYpLiAgemxpYiBkb2Vzbid0IGxpa2UgdGhpcyBhdCBhbGwsIHNvIHdlIGhhdmUgdG8KKyAqIGRldGVjdCBhbmQgZGVhbCB3aXRoIGl0LiAgVGhpcyBjb2RlIHNob3VsZCBub3QgYmUgbmVlZGVkIGluCisgKiBXaW5kb3dzIG9yIE9TLzIgbW9kZXMsIGFuZCBvbmx5IGluIDE2IGJpdCBtb2RlLiAgVGhpcyBjb2RlIGhhcworICogYmVlbiB1cGRhdGVkIGJ5IEFsZXhhbmRlciBMZWhtYW5uIGZvciB2ZXJzaW9uIDAuODkgdG8gd2FzdGUgbGVzcworICogbWVtb3J5LgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgcG5nX3NpemVfdCBmb3IgdGhlICJzaXplIiBkZWNsYXJhdGlvbiwKKyAqIHNpbmNlIG9uIHNvbWUgc3lzdGVtcyBhIHBuZ19zaXplX3QgaXMgYSAxNi1iaXQgcXVhbnRpdHksIGFuZCBhcyBhCisgKiByZXN1bHQsIHdlIHdvdWxkIGJlIHRydW5jYXRpbmcgcG90ZW50aWFsbHkgbGFyZ2VyIG1lbW9yeSByZXF1ZXN0cworICogKHdoaWNoIHNob3VsZCBjYXVzZSBhIGZhdGFsIGVycm9yKSBhbmQgaW50cm9kdWNpbmcgbWFqb3IgcHJvYmxlbXMuCisgKi8KK3BuZ192b2lkcCAvKiBQUklWQVRFICovCitwbmdfY2FsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCit7CisgICBwbmdfdm9pZHAgcmV0OworCisgICByZXQgPSAocG5nX21hbGxvYyhwbmdfcHRyLCBzaXplKSk7CisgICBpZiAocmV0ICE9IE5VTEwpCisgICAgICBwbmdfbWVtc2V0KHJldCwwLChwbmdfc2l6ZV90KXNpemUpOworICAgcmV0dXJuIChyZXQpOworfQorCitwbmdfdm9pZHAgUE5HQVBJCitwbmdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCit7CisgICBwbmdfdm9pZHAgcmV0OworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHNpemUgPT0gMCkKKyAgICAgIHJldHVybiAoTlVMTCk7CisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+bWFsbG9jX2ZuICE9IE5VTEwpCisgICAgICByZXQgPSAoKHBuZ192b2lkcCkoKihwbmdfcHRyLT5tYWxsb2NfZm4pKShwbmdfcHRyLCAocG5nX3NpemVfdClzaXplKSk7CisgICBlbHNlCisgICAgICByZXQgPSAocG5nX21hbGxvY19kZWZhdWx0KHBuZ19wdHIsIHNpemUpKTsKKyAgIGlmIChyZXQgPT0gTlVMTCAmJiAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQorICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIG1lbW9yeSEiKTsKKyAgIHJldHVybiAocmV0KTsKK30KKworcG5nX3ZvaWRwIFBOR0FQSQorcG5nX21hbGxvY19kZWZhdWx0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCit7CisgICBwbmdfdm9pZHAgcmV0OworI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBzaXplID09IDApCisgICAgICByZXR1cm4gKE5VTEwpOworCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICBpZiAoc2l6ZSA+IChwbmdfdWludF8zMik2NTUzNkwpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQ2Fubm90IEFsbG9jYXRlID4gNjRLIik7CisgICAgICByZXQgPSBOVUxMOworICAgfQorICAgZWxzZQorI2VuZGlmCisKKyAgIGlmIChzaXplICE9IChzaXplX3Qpc2l6ZSkKKyAgICAgIHJldCA9IE5VTEw7CisgICBlbHNlIGlmIChzaXplID09IChwbmdfdWludF8zMik2NTUzNkwpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+b2Zmc2V0X3RhYmxlID09IE5VTEwpCisgICAgICB7CisgICAgICAgICAvKiBUcnkgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZG8gYW55IG9mIHRoaXMgZmFuY3kgc3R1ZmYgKi8KKyAgICAgICAgIHJldCA9IGZhcm1hbGxvYyhzaXplKTsKKyAgICAgICAgIGlmIChyZXQgPT0gTlVMTCB8fCAoKHBuZ19zaXplX3QpcmV0ICYgMHhmZmZmKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBudW1fYmxvY2tzOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgdG90YWxfc2l6ZTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCB0YWJsZTsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgcG5nX2J5dGUgaHVnZSAqIGhwdHI7CisKKyAgICAgICAgICAgIGlmIChyZXQgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZhcmZyZWUocmV0KTsKKyAgICAgICAgICAgICAgIHJldCA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT56bGliX3dpbmRvd19iaXRzID4gMTQpCisgICAgICAgICAgICAgICBudW1fYmxvY2tzID0gKGludCkoMSA8PCAocG5nX3B0ci0+emxpYl93aW5kb3dfYml0cyAtIDE0KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBudW1fYmxvY2tzID0gMTsKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT56bGliX21lbV9sZXZlbCA+PSA3KQorICAgICAgICAgICAgICAgbnVtX2Jsb2NrcyArPSAoaW50KSgxIDw8IChwbmdfcHRyLT56bGliX21lbV9sZXZlbCAtIDcpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIG51bV9ibG9ja3MrKzsKKworICAgICAgICAgICAgdG90YWxfc2l6ZSA9ICgocG5nX3VpbnRfMzIpNjU1MzZMKSAqIChwbmdfdWludF8zMiludW1fYmxvY2tzKzE2OworCisgICAgICAgICAgICB0YWJsZSA9IGZhcm1hbGxvYyh0b3RhbF9zaXplKTsKKworICAgICAgICAgICAgaWYgKHRhYmxlID09IE5VTEwpCisgICAgICAgICAgICB7CisjaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgT2YgTWVtb3J5LiIpOyAvKiBOb3RlICJPIiwgIk0iICovCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IE9mIE1lbW9yeS4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChwbmdfc2l6ZV90KXRhYmxlICYgMHhmZmYwKQorICAgICAgICAgICAgeworI2lmbmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICAgICAgICAgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzJlBOR19GTEFHX01BTExPQ19OVUxMX01FTV9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAiRmFybWFsbG9jIGRpZG4ndCByZXR1cm4gbm9ybWFsaXplZCBwb2ludGVyIik7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAiRmFybWFsbG9jIGRpZG4ndCByZXR1cm4gbm9ybWFsaXplZCBwb2ludGVyIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZSA9IHRhYmxlOworICAgICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0ciA9IGZhcm1hbGxvYyhudW1fYmxvY2tzICoKKyAgICAgICAgICAgICAgIHBuZ19zaXplb2YocG5nX2J5dGVwKSk7CisKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5vZmZzZXRfdGFibGVfcHRyID09IE5VTEwpCisgICAgICAgICAgICB7CisjaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgT2YgbWVtb3J5LiIpOyAvKiBOb3RlICJPIiwgIm0iICovCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IE9mIG1lbW9yeS4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHB0ciA9IChwbmdfYnl0ZSBodWdlICopdGFibGU7CisgICAgICAgICAgICBpZiAoKHBuZ19zaXplX3QpaHB0ciAmIDB4ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGhwdHIgPSAocG5nX2J5dGUgaHVnZSAqKSgobG9uZykoaHB0cikgJiAweGZmZmZmZmYwTCk7CisgICAgICAgICAgICAgICBocHRyID0gaHB0ciArIDE2TDsgIC8qICJocHRyICs9IDE2TCIgZmFpbHMgb24gVHVyYm8gQysrIDMuMCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHJbaV0gPSAocG5nX2J5dGVwKWhwdHI7CisgICAgICAgICAgICAgICBocHRyID0gaHB0ciArIChwbmdfdWludF8zMik2NTUzNkw7ICAvKiAiKz0iIGZhaWxzIG9uIFRDKyszLjAgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX251bWJlciA9IG51bV9ibG9ja3M7CisgICAgICAgICAgICBwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnQgPSAwOworICAgICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX2NvdW50X2ZyZWUgPSAwOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAocG5nX3B0ci0+b2Zmc2V0X3RhYmxlX2NvdW50ID49IHBuZ19wdHItPm9mZnNldF90YWJsZV9udW1iZXIpCisgICAgICB7CisjaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgICAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgTWVtb3J5LiIpOyAvKiBOb3RlICJvIiBhbmQgIk0iICovCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIE1lbW9yeS4iKTsKKyNlbmRpZgorICAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgIH0KKworICAgICAgcmV0ID0gcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0cltwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnQrK107CisgICB9CisgICBlbHNlCisgICAgICByZXQgPSBmYXJtYWxsb2Moc2l6ZSk7CisKKyNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgaWYgKHJldCA9PSBOVUxMKQorICAgeworICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkuIik7IC8qIE5vdGUgIm8iIGFuZCAibSIgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgbWVtb3J5LiIpOyAvKiBOb3RlICJvIiBhbmQgIm0iICovCisgICB9CisjZW5kaWYKKworICAgcmV0dXJuIChyZXQpOworfQorCisvKiBGcmVlIGEgcG9pbnRlciBhbGxvY2F0ZWQgYnkgcG5nX21hbGxvYygpLiAgSW4gdGhlIGRlZmF1bHQKKyAqIGNvbmZpZ3VyYXRpb24sIHBuZ19wdHIgaXMgbm90IHVzZWQsIGJ1dCBpcyBwYXNzZWQgaW4gY2FzZSBpdAorICogaXMgbmVlZGVkLiAgSWYgcHRyIGlzIE5VTEwsIHJldHVybiB3aXRob3V0IHRha2luZyBhbnkgYWN0aW9uLgorICovCit2b2lkIFBOR0FQSQorcG5nX2ZyZWUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+ZnJlZV9mbiAhPSBOVUxMKQorICAgeworICAgICAgKCoocG5nX3B0ci0+ZnJlZV9mbikpKHBuZ19wdHIsIHB0cik7CisgICAgICByZXR1cm47CisgICB9CisgICBlbHNlCisgICAgICBwbmdfZnJlZV9kZWZhdWx0KHBuZ19wdHIsIHB0cik7Cit9CisKK3ZvaWQgUE5HQVBJCitwbmdfZnJlZV9kZWZhdWx0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpCit7CisjZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHB0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAocG5nX3B0ci0+b2Zmc2V0X3RhYmxlICE9IE5VTEwpCisgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHBuZ19wdHItPm9mZnNldF90YWJsZV9jb3VudDsgaSsrKQorICAgICAgeworICAgICAgICAgaWYgKHB0ciA9PSBwbmdfcHRyLT5vZmZzZXRfdGFibGVfcHRyW2ldKQorICAgICAgICAgeworICAgICAgICAgICAgcHRyID0gTlVMTDsKKyAgICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9jb3VudF9mcmVlKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnRfZnJlZSA9PSBwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnQpCisgICAgICB7CisgICAgICAgICBmYXJmcmVlKHBuZ19wdHItPm9mZnNldF90YWJsZSk7CisgICAgICAgICBmYXJmcmVlKHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHIpOworICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlID0gTlVMTDsKKyAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHIgPSBOVUxMOworICAgICAgfQorICAgfQorCisgICBpZiAocHRyICE9IE5VTEwpCisgICB7CisgICAgICBmYXJmcmVlKHB0cik7CisgICB9Cit9CisKKyNlbHNlIC8qIE5vdCB0aGUgQm9ybGFuZCBET1Mgc3BlY2lhbCBtZW1vcnkgaGFuZGxlciAqLworCisvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgcG5nX3N0cnVjdCBvciBhIHBuZ19pbmZvLiAgVGhlIG1hbGxvYyBhbmQKKyAgIG1lbXNldCBjYW4gYmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgY2FsbCB0byBjYWxsb2MoKSBpZiB0aGlzIGlzIHRob3VnaHQKKyAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugbm90aWNhYmx5LiAqLworcG5nX3ZvaWRwIC8qIFBSSVZBVEUgKi8KK3BuZ19jcmVhdGVfc3RydWN0KGludCB0eXBlKQoreworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgIHJldHVybiAocG5nX2NyZWF0ZV9zdHJ1Y3RfMih0eXBlLCBwbmdfbWFsbG9jX3B0cl9OVUxMLCBwbmdfdm9pZHBfTlVMTCkpOworfQorCisvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgcG5nX3N0cnVjdCBvciBhIHBuZ19pbmZvLiAgVGhlIG1hbGxvYyBhbmQKKyAgIG1lbXNldCBjYW4gYmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgY2FsbCB0byBjYWxsb2MoKSBpZiB0aGlzIGlzIHRob3VnaHQKKyAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugbm90aWNhYmx5LiAqLworcG5nX3ZvaWRwIC8qIFBSSVZBVEUgKi8KK3BuZ19jcmVhdGVfc3RydWN0XzIoaW50IHR5cGUsIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX3ZvaWRwIG1lbV9wdHIpCit7CisjZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLworICAgcG5nX3NpemVfdCBzaXplOworICAgcG5nX3ZvaWRwIHN0cnVjdF9wdHI7CisKKyAgIGlmICh0eXBlID09IFBOR19TVFJVQ1RfSU5GTykKKyAgICAgIHNpemUgPSBwbmdfc2l6ZW9mKHBuZ19pbmZvKTsKKyAgIGVsc2UgaWYgKHR5cGUgPT0gUE5HX1NUUlVDVF9QTkcpCisgICAgICBzaXplID0gcG5nX3NpemVvZihwbmdfc3RydWN0KTsKKyAgIGVsc2UKKyAgICAgIHJldHVybiAoTlVMTCk7CisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBpZiAobWFsbG9jX2ZuICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfc3RydWN0IGR1bW15X3N0cnVjdDsKKyAgICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAmZHVtbXlfc3RydWN0OworICAgICAgcG5nX3B0ci0+bWVtX3B0cj1tZW1fcHRyOworICAgICAgc3RydWN0X3B0ciA9ICgqKG1hbGxvY19mbikpKHBuZ19wdHIsIHNpemUpOworICAgICAgaWYgKHN0cnVjdF9wdHIgIT0gTlVMTCkKKyAgICAgICAgIHBuZ19tZW1zZXQoc3RydWN0X3B0ciwgMCwgc2l6ZSk7CisgICAgICByZXR1cm4gKHN0cnVjdF9wdHIpOworICAgfQorI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKworI2lmIGRlZmluZWQoX19UVVJCT0NfXykgJiYgIWRlZmluZWQoX19GTEFUX18pCisgICBzdHJ1Y3RfcHRyID0gKHBuZ192b2lkcClmYXJtYWxsb2Moc2l6ZSk7CisjZWxzZQorIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKE1BWFNFR182NEspCisgICBzdHJ1Y3RfcHRyID0gKHBuZ192b2lkcCloYWxsb2Moc2l6ZSwgMSk7CisjIGVsc2UKKyAgIHN0cnVjdF9wdHIgPSAocG5nX3ZvaWRwKW1hbGxvYyhzaXplKTsKKyMgZW5kaWYKKyNlbmRpZgorICAgaWYgKHN0cnVjdF9wdHIgIT0gTlVMTCkKKyAgICAgIHBuZ19tZW1zZXQoc3RydWN0X3B0ciwgMCwgc2l6ZSk7CisKKyAgIHJldHVybiAoc3RydWN0X3B0cik7Cit9CisKKworLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGEgcG5nX2NyZWF0ZV9zdHJ1Y3QoKSBjYWxsICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kZXN0cm95X3N0cnVjdChwbmdfdm9pZHAgc3RydWN0X3B0cikKK3sKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBwbmdfZGVzdHJveV9zdHJ1Y3RfMihzdHJ1Y3RfcHRyLCBwbmdfZnJlZV9wdHJfTlVMTCwgcG5nX3ZvaWRwX05VTEwpOworfQorCisvKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYSBwbmdfY3JlYXRlX3N0cnVjdCgpIGNhbGwgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2Rlc3Ryb3lfc3RydWN0XzIocG5nX3ZvaWRwIHN0cnVjdF9wdHIsIHBuZ19mcmVlX3B0ciBmcmVlX2ZuLAorICAgIHBuZ192b2lkcCBtZW1fcHRyKQoreworI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKyAgIGlmIChzdHJ1Y3RfcHRyICE9IE5VTEwpCisgICB7CisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgICAgaWYgKGZyZWVfZm4gIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19zdHJ1Y3QgZHVtbXlfc3RydWN0OworICAgICAgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9ICZkdW1teV9zdHJ1Y3Q7CisgICAgICAgICBwbmdfcHRyLT5tZW1fcHRyPW1lbV9wdHI7CisgICAgICAgICAoKihmcmVlX2ZuKSkocG5nX3B0ciwgc3RydWN0X3B0cik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisjZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLworI2lmIGRlZmluZWQoX19UVVJCT0NfXykgJiYgIWRlZmluZWQoX19GTEFUX18pCisgICAgICBmYXJmcmVlKHN0cnVjdF9wdHIpOworI2Vsc2UKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNQVhTRUdfNjRLKQorICAgICAgaGZyZWUoc3RydWN0X3B0cik7CisjIGVsc2UKKyAgICAgIGZyZWUoc3RydWN0X3B0cik7CisjIGVuZGlmCisjZW5kaWYKKyAgIH0KK30KKworLyogQWxsb2NhdGUgbWVtb3J5LiAgRm9yIHJlYXNvbmFibGUgZmlsZXMsIHNpemUgc2hvdWxkIG5ldmVyIGV4Y2VlZAorICogNjRLLiAgSG93ZXZlciwgemxpYiBtYXkgYWxsb2NhdGUgbW9yZSB0aGVuIDY0SyBpZiB5b3UgZG9uJ3QgdGVsbAorICogaXQgbm90IHRvLiAgU2VlIHpjb25mLmggYW5kIHBuZy5oIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgemxpYiBkb2VzCisgKiBuZWVkIHRvIGFsbG9jYXRlIGV4YWN0bHkgNjRLLCBzbyB3aGF0ZXZlciB5b3UgY2FsbCBoZXJlIG11c3QKKyAqIGhhdmUgdGhlIGFiaWxpdHkgdG8gZG8gdGhhdC4KKyAqLworCitwbmdfdm9pZHAgUE5HQVBJCitwbmdfY2FsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCit7CisgICBwbmdfdm9pZHAgcmV0OworCisgICByZXQgPSAocG5nX21hbGxvYyhwbmdfcHRyLCBzaXplKSk7CisgICBpZiAocmV0ICE9IE5VTEwpCisgICAgICBwbmdfbWVtc2V0KHJldCwwLChwbmdfc2l6ZV90KXNpemUpOworICAgcmV0dXJuIChyZXQpOworfQorCitwbmdfdm9pZHAgUE5HQVBJCitwbmdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCit7CisgICBwbmdfdm9pZHAgcmV0OworCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBzaXplID09IDApCisgICAgICByZXR1cm4gKE5VTEwpOworCisgICBpZiAocG5nX3B0ci0+bWFsbG9jX2ZuICE9IE5VTEwpCisgICAgICByZXQgPSAoKHBuZ192b2lkcCkoKihwbmdfcHRyLT5tYWxsb2NfZm4pKShwbmdfcHRyLCAocG5nX3NpemVfdClzaXplKSk7CisgICBlbHNlCisgICAgICByZXQgPSAocG5nX21hbGxvY19kZWZhdWx0KHBuZ19wdHIsIHNpemUpKTsKKyAgIGlmIChyZXQgPT0gTlVMTCAmJiAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQorICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIE1lbW9yeSEiKTsKKyAgIHJldHVybiAocmV0KTsKK30KKworcG5nX3ZvaWRwIFBOR0FQSQorcG5nX21hbGxvY19kZWZhdWx0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCit7CisgICBwbmdfdm9pZHAgcmV0OworI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBzaXplID09IDApCisgICAgICByZXR1cm4gKE5VTEwpOworCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICBpZiAoc2l6ZSA+IChwbmdfdWludF8zMik2NTUzNkwpCisgICB7CisjaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJDYW5ub3QgQWxsb2NhdGUgPiA2NEsiKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisjZW5kaWYKKworICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisjaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykKKyAgIGlmIChzaXplICE9ICh1bnNpZ25lZCBsb25nKXNpemUpCisgICAgICByZXQgPSBOVUxMOworICAgZWxzZQorICAgICAgcmV0ID0gZmFybWFsbG9jKHNpemUpOworI2Vsc2UKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNQVhTRUdfNjRLKQorICAgaWYgKHNpemUgIT0gKHVuc2lnbmVkIGxvbmcpc2l6ZSkKKyAgICAgIHJldCA9IE5VTEw7CisgICBlbHNlCisgICAgICByZXQgPSBoYWxsb2Moc2l6ZSwgMSk7CisjIGVsc2UKKyAgIGlmIChzaXplICE9IChzaXplX3Qpc2l6ZSkKKyAgICAgIHJldCA9IE5VTEw7CisgICBlbHNlCisgICAgICByZXQgPSBtYWxsb2MoKHNpemVfdClzaXplKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgIGlmIChyZXQgPT0gTlVMTCAmJiAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgTWVtb3J5Iik7CisjZW5kaWYKKworICAgcmV0dXJuIChyZXQpOworfQorCisvKiBGcmVlIGEgcG9pbnRlciBhbGxvY2F0ZWQgYnkgcG5nX21hbGxvYygpLiAgSWYgcHRyIGlzIE5VTEwsIHJldHVybgorICogd2l0aG91dCB0YWtpbmcgYW55IGFjdGlvbi4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19mcmVlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHB0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPmZyZWVfZm4gIT0gTlVMTCkKKyAgIHsKKyAgICAgICgqKHBuZ19wdHItPmZyZWVfZm4pKShwbmdfcHRyLCBwdHIpOworICAgICAgcmV0dXJuOworICAgfQorICAgZWxzZQorICAgICAgcG5nX2ZyZWVfZGVmYXVsdChwbmdfcHRyLCBwdHIpOworfQordm9pZCBQTkdBUEkKK3BuZ19mcmVlX2RlZmF1bHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyNlbmRpZiAvKiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEICovCisKKyNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKQorICAgZmFyZnJlZShwdHIpOworI2Vsc2UKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNQVhTRUdfNjRLKQorICAgaGZyZWUocHRyKTsKKyMgZWxzZQorICAgZnJlZShwdHIpOworIyBlbmRpZgorI2VuZGlmCit9CisKKyNlbmRpZiAvKiBOb3QgQm9ybGFuZCBET1Mgc3BlY2lhbCBtZW1vcnkgaGFuZGxlciAqLworCisjaWZkZWYgUE5HXzFfMF9YCisjICBkZWZpbmUgcG5nX21hbGxvY193YXJuIHBuZ19tYWxsb2MKKyNlbHNlCisvKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuMy4gIFRoZSBwbmdfbWFsbG9jX3dhcm4oKQorICogZnVuY3Rpb24gd2lsbCBzZXQgdXAgcG5nX21hbGxvYygpIHRvIGlzc3VlIGEgcG5nX3dhcm5pbmcgYW5kIHJldHVybiBOVUxMCisgKiBpbnN0ZWFkIG9mIGlzc3VpbmcgYSBwbmdfZXJyb3IsIGlmIGl0IGZhaWxzIHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQKKyAqIG1lbW9yeS4KKyAqLworcG5nX3ZvaWRwIFBOR0FQSQorcG5nX21hbGxvY193YXJuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCit7CisgICBwbmdfdm9pZHAgcHRyOworICAgcG5nX3VpbnRfMzIgc2F2ZV9mbGFnczsKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm4gKE5VTEwpOworCisgICBzYXZlX2ZsYWdzID0gcG5nX3B0ci0+ZmxhZ3M7CisgICBwbmdfcHRyLT5mbGFnc3w9UE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LOworICAgcHRyID0gKHBuZ192b2lkcClwbmdfbWFsbG9jKChwbmdfc3RydWN0cClwbmdfcHRyLCBzaXplKTsKKyAgIHBuZ19wdHItPmZsYWdzPXNhdmVfZmxhZ3M7CisgICByZXR1cm4ocHRyKTsKK30KKyNlbmRpZgorCitwbmdfdm9pZHAgUE5HQVBJCitwbmdfbWVtY3B5X2NoZWNrIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgczEsIHBuZ192b2lkcCBzMiwKKyAgIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19zaXplX3Qgc2l6ZTsKKworICAgc2l6ZSA9IChwbmdfc2l6ZV90KWxlbmd0aDsKKyAgIGlmICgocG5nX3VpbnRfMzIpc2l6ZSAhPSBsZW5ndGgpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk92ZXJmbG93IGluIHBuZ19tZW1jcHlfY2hlY2suIik7CisKKyAgIHJldHVybihwbmdfbWVtY3B5IChzMSwgczIsIHNpemUpKTsKK30KKworcG5nX3ZvaWRwIFBOR0FQSQorcG5nX21lbXNldF9jaGVjayAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHMxLCBpbnQgdmFsdWUsCisgICBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfc2l6ZV90IHNpemU7CisKKyAgIHNpemUgPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBpZiAoKHBuZ191aW50XzMyKXNpemUgIT0gbGVuZ3RoKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdmVyZmxvdyBpbiBwbmdfbWVtc2V0X2NoZWNrLiIpOworCisgICByZXR1cm4gKHBuZ19tZW1zZXQgKHMxLCB2YWx1ZSwgc2l6ZSkpOworCit9CisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byB1c2UgYW5vdGhlciBtZXRob2QKKyAqIG9mIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgbWVtb3J5LgorICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9tZW1fZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIG1lbV9wdHIsIHBuZ19tYWxsb2NfcHRyCisgIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pCit7CisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3B0ci0+bWVtX3B0ciA9IG1lbV9wdHI7CisgICAgICBwbmdfcHRyLT5tYWxsb2NfZm4gPSBtYWxsb2NfZm47CisgICAgICBwbmdfcHRyLT5mcmVlX2ZuID0gZnJlZV9mbjsKKyAgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWVtX3B0ciBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIKKyAqIGZ1bmN0aW9ucy4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBwb2ludGVyIGJlZm9yZSBwbmdfd3JpdGVfZGVzdHJveSBhbmQgcG5nX3JlYWRfZGVzdHJveSBhcmUgY2FsbGVkLgorICovCitwbmdfdm9pZHAgUE5HQVBJCitwbmdfZ2V0X21lbV9wdHIocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm4gKE5VTEwpOworICAgcmV0dXJuICgocG5nX3ZvaWRwKXBuZ19wdHItPm1lbV9wdHIpOworfQorI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9wbmdwcmVhZC5jIGIvY29tMzIvbGliL2xpYnBuZy9wbmdwcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjY5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGlicG5nL3BuZ3ByZWFkLmMKQEAgLTAsMCArMSwxNzc0IEBACisKKy8qIHBuZ3ByZWFkLmMgLSByZWFkIGEgcG5nIGZpbGUgaW4gcHVzaCBtb2RlCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuNDQgW0p1bmUgMjYsIDIwMTBdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKyNkZWZpbmUgUE5HX0lOVEVSTkFMCisjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUworI2luY2x1ZGUgInBuZy5oIgorI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAorCisvKiBQdXNoIG1vZGVsIG1vZGVzICovCisjZGVmaW5lIFBOR19SRUFEX1NJR19NT0RFICAgMAorI2RlZmluZSBQTkdfUkVBRF9DSFVOS19NT0RFIDEKKyNkZWZpbmUgUE5HX1JFQURfSURBVF9NT0RFICAyCisjZGVmaW5lIFBOR19TS0lQX01PREUgICAgICAgMworI2RlZmluZSBQTkdfUkVBRF90RVh0X01PREUgIDQKKyNkZWZpbmUgUE5HX1JFQURfelRYdF9NT0RFICA1CisjZGVmaW5lIFBOR19SRUFEX0RPTkVfTU9ERSAgNgorI2RlZmluZSBQTkdfUkVBRF9pVFh0X01PREUgIDcKKyNkZWZpbmUgUE5HX0VSUk9SX01PREUgICAgICA4CisKK3ZvaWQgUE5HQVBJCitwbmdfcHJvY2Vzc19kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgYnVmZmVyX3NpemUpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyKHBuZ19wdHIsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCisgICB3aGlsZSAocG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICB7CisgICAgICBwbmdfcHJvY2Vzc19zb21lX2RhdGEocG5nX3B0ciwgaW5mb19wdHIpOworICAgfQorfQorCisvKiBXaGF0IHdlIGRvIHdpdGggdGhlIGluY29taW5nIGRhdGEgZGVwZW5kcyBvbiB3aGF0IHdlIHdlcmUgcHJldmlvdXNseQorICogZG9pbmcgYmVmb3JlIHdlIHJhbiBvdXQgb2YgZGF0YS4uLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19wcm9jZXNzX3NvbWVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBzd2l0Y2ggKHBuZ19wdHItPnByb2Nlc3NfbW9kZSkKKyAgIHsKKyAgICAgIGNhc2UgUE5HX1JFQURfU0lHX01PREU6CisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9yZWFkX3NpZyhwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBQTkdfUkVBRF9DSFVOS19NT0RFOgorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfcmVhZF9jaHVuayhwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBQTkdfUkVBRF9JREFUX01PREU6CisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9yZWFkX0lEQVQocG5nX3B0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVECisgICAgICBjYXNlIFBOR19SRUFEX3RFWHRfTU9ERToKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdXNoX3JlYWRfdEVYdChwbmdfcHRyLCBpbmZvX3B0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKKyAgICAgIGNhc2UgUE5HX1JFQURfelRYdF9NT0RFOgorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfcmVhZF96VFh0KHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAorICAgICAgY2FzZSBQTkdfUkVBRF9pVFh0X01PREU6CisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9yZWFkX2lUWHQocG5nX3B0ciwgaW5mb19wdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyNlbmRpZgorICAgICAgY2FzZSBQTkdfU0tJUF9NT0RFOgorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfY3JjX2ZpbmlzaChwbmdfcHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgPSAwOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9Cit9CisKKy8qIFJlYWQgYW55IHJlbWFpbmluZyBzaWduYXR1cmUgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIGFuZCBjb21wYXJlIHRoZW0gd2l0aAorICogdGhlIGNvcnJlY3QgUE5HIHNpZ25hdHVyZS4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyByb3V0aW5lIGlzIGNhbGxlZAorICogd2l0aCBieXRlcyBhbHJlYWR5IHJlYWQgZnJvbSB0aGUgc2lnbmF0dXJlLCBlaXRoZXIgYmVjYXVzZSB0aGV5IGhhdmUgYmVlbgorICogY2hlY2tlZCBieSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiwgb3IgYmVjYXVzZSBvZiBtdWx0aXBsZSBjYWxscyB0byB0aGlzCisgKiByb3V0aW5lLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19wdXNoX3JlYWRfc2lnKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIHBuZ19zaXplX3QgbnVtX2NoZWNrZWQgPSBwbmdfcHRyLT5zaWdfYnl0ZXMsCisgICAgICAgICAgICAgbnVtX3RvX2NoZWNrID0gOCAtIG51bV9jaGVja2VkOworCisgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCBudW1fdG9fY2hlY2spCisgICB7CisgICAgICBudW1fdG9fY2hlY2sgPSBwbmdfcHRyLT5idWZmZXJfc2l6ZTsKKyAgIH0KKworICAgcG5nX3B1c2hfZmlsbF9idWZmZXIocG5nX3B0ciwgJihpbmZvX3B0ci0+c2lnbmF0dXJlW251bV9jaGVja2VkXSksCisgICAgICBudW1fdG9fY2hlY2spOworICAgcG5nX3B0ci0+c2lnX2J5dGVzID0gKHBuZ19ieXRlKShwbmdfcHRyLT5zaWdfYnl0ZXMgKyBudW1fdG9fY2hlY2spOworCisgICBpZiAocG5nX3NpZ19jbXAoaW5mb19wdHItPnNpZ25hdHVyZSwgbnVtX2NoZWNrZWQsIG51bV90b19jaGVjaykpCisgICB7CisgICAgICBpZiAobnVtX2NoZWNrZWQgPCA0ICYmCisgICAgICAgICAgcG5nX3NpZ19jbXAoaW5mb19wdHItPnNpZ25hdHVyZSwgbnVtX2NoZWNrZWQsIG51bV90b19jaGVjayAtIDQpKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgYSBQTkcgZmlsZSIpOworICAgICAgZWxzZQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJQTkcgZmlsZSBjb3JydXB0ZWQgYnkgQVNDSUkgY29udmVyc2lvbiIpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnNpZ19ieXRlcyA+PSA4KQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfQ0hVTktfTU9ERTsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9yZWFkX2NodW5rKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgICAgUE5HX0NPTlNUIFBOR19JSERSOworICAgICAgUE5HX0NPTlNUIFBOR19JREFUOworICAgICAgUE5HX0NPTlNUIFBOR19JRU5EOworICAgICAgUE5HX0NPTlNUIFBOR19QTFRFOworI2lmZGVmIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX2JLR0Q7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19jSFJNOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfZ0FNQTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX2hJU1Q7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19pQ0NQOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfaVRYdDsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX29GRnNfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX29GRnM7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19wQ0FMOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfcEhZczsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3NCSVQ7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19zQ0FMOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfc1JHQjsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3NQTFQ7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR190RVh0OworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfdElNRTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3RSTlNfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3RSTlM7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR196VFh0OworI2VuZGlmCisjZW5kaWYgLyogUE5HX1VTRV9MT0NBTF9BUlJBWVMgKi8KKworICAgLyogRmlyc3Qgd2UgbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGRhdGEgZm9yIHRoZSA0IGJ5dGUgY2h1bmsgbmFtZQorICAgICogYW5kIHRoZSA0IGJ5dGUgY2h1bmsgbGVuZ3RoIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggZGVjb2RpbmcgdGhlCisgICAgKiBjaHVuayBkYXRhLiAgVG8gZnVsbHkgZGVjb2RlIGVhY2ggb2YgdGhlc2UgY2h1bmtzLCB3ZSBhbHNvIG1ha2UKKyAgICAqIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZGF0YSBpbiB0aGUgYnVmZmVyIGZvciB0aGUgNCBieXRlIENSQyBhdCB0aGUKKyAgICAqIGVuZCBvZiBldmVyeSBjaHVuayAoZXhjZXB0IElEQVQsIHdoaWNoIGlzIGhhbmRsZWQgc2VwYXJhdGVseSkuCisgICAgKi8KKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9DSFVOS19IRUFERVIpKQorICAgeworICAgICAgcG5nX2J5dGUgY2h1bmtfbGVuZ3RoWzRdOworCisgICAgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCA4KQorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHBuZ19wdXNoX2ZpbGxfYnVmZmVyKHBuZ19wdHIsIGNodW5rX2xlbmd0aCwgNCk7CisgICAgICBwbmdfcHRyLT5wdXNoX2xlbmd0aCA9IHBuZ19nZXRfdWludF8zMShwbmdfcHRyLCBjaHVua19sZW5ndGgpOworICAgICAgcG5nX3Jlc2V0X2NyYyhwbmdfcHRyKTsKKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lLCA0KTsKKyAgICAgIHBuZ19jaGVja19jaHVua19uYW1lKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUpOworICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9DSFVOS19IRUFERVI7CisgICB9CisKKyAgIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCisgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0FGVEVSX0lEQVQpCisgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVDsKKworICAgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19JSERSLCA0KSkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCAhPSAxMykKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBJSERSIGxlbmd0aCIpOworCisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19JRU5ELCA0KSkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfaGFuZGxlX0lFTkQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKworICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfRE9ORV9NT0RFOworICAgICAgcG5nX3B1c2hfaGF2ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworICAgfQorCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgZWxzZSBpZiAocG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUpKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCisgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lEQVQ7CisKKyAgICAgIHBuZ19oYW5kbGVfdW5rbm93bihwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOworCisgICAgICBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX1BMVEUsIDQpKQorICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9QTFRFOworCisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCisgICAgICB7CisgICAgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgSURBVCIpOworCisgICAgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKKyAgICAgICAgICAgICAgICAgICEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIElEQVQiKTsKKyAgICAgIH0KKyAgIH0KKworI2VuZGlmCisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfUExURSwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHBuZ19oYW5kbGVfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOworICAgfQorCisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCisgICB7CisgICAgICAvKiBJZiB3ZSByZWFjaCBhbiBJREFUIGNodW5rLCB0aGlzIG1lYW5zIHdlIGhhdmUgcmVhZCBhbGwgb2YgdGhlCisgICAgICAgKiBoZWFkZXIgY2h1bmtzLCBhbmQgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgdGhlIGltYWdlIChvciBpZiB0aGlzCisgICAgICAgKiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGltYWdlIGhhcyBiZWVuIHJlYWQgLSB3ZSBoYXZlIGFuIGVycm9yKS4KKyAgICAgICAqLworCisgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgSURBVCIpOworCisgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKKyAgICAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSkKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBQTFRFIGJlZm9yZSBJREFUIik7CisKKyAgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKKyAgICAgIHsKKyAgICAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUKSkKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19BRlRFUl9JREFUKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJUb28gbWFueSBJREFUJ3MgZm91bmQiKTsKKyAgICAgIH0KKworICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gcG5nX3B0ci0+cHVzaF9sZW5ndGg7CisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lEQVQ7CisgICAgICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF9JREFUX01PREU7CisgICAgICBwbmdfcHVzaF9oYXZlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPQorICAgICAgICAgICh1SW50KSBQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsCisgICAgICAgICAgcG5nX3B0ci0+aXdpZHRoKSArIDE7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+cm93X2J1ZjsKKyAgICAgIHJldHVybjsKKyAgIH0KKworI2lmZGVmIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfZ0FNQSwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfc0JJVCwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfY0hSTSwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfc1JHQiwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfaUNDUCwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfc1BMVCwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3RSTlNfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfdFJOUywgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfYktHRCwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfaElTVCwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3BIWXNfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfcEhZcywgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX29GRnNfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfb0ZGcywgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfcENBTCwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfc0NBTCwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfdElNRSwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2hhbmRsZV90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVECisgICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfdEVYdCwgNCkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX3B1c2hfaGFuZGxlX3RFWHQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKKyAgIH0KKworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKKyAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ196VFh0LCA0KSkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfcHVzaF9oYW5kbGVfelRYdChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOworICAgfQorCisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAorICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX2lUWHQsIDQpKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHBuZ19wdXNoX2hhbmRsZV9pVFh0KHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7CisgICB9CisKKyNlbmRpZgorICAgZWxzZQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBwbmdfcHVzaF9oYW5kbGVfdW5rbm93bihwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOworICAgfQorCisgICBwbmdfcHRyLT5tb2RlICY9IH5QTkdfSEFWRV9DSFVOS19IRUFERVI7Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3B1c2hfY3JjX3NraXAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2tpcCkKK3sKKyAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19TS0lQX01PREU7CisgICBwbmdfcHRyLT5za2lwX2xlbmd0aCA9IHNraXA7Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3B1c2hfY3JjX2ZpbmlzaChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgaWYgKHBuZ19wdHItPnNraXBfbGVuZ3RoICYmIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpCisgICB7CisgICAgICBwbmdfc2l6ZV90IHNhdmVfc2l6ZTsKKworICAgICAgaWYgKHBuZ19wdHItPnNraXBfbGVuZ3RoIDwgKHBuZ191aW50XzMyKXBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpCisgICAgICAgICBzYXZlX3NpemUgPSAocG5nX3NpemVfdClwbmdfcHRyLT5za2lwX2xlbmd0aDsKKyAgICAgIGVsc2UKKyAgICAgICAgIHNhdmVfc2l6ZSA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7CisKKyAgICAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKKworICAgICAgcG5nX3B0ci0+c2tpcF9sZW5ndGggLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7CisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOworICAgfQorICAgaWYgKHBuZ19wdHItPnNraXBfbGVuZ3RoICYmIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpCisgICB7CisgICAgICBwbmdfc2l6ZV90IHNhdmVfc2l6ZTsKKworICAgICAgaWYgKHBuZ19wdHItPnNraXBfbGVuZ3RoIDwgKHBuZ191aW50XzMyKXBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpCisgICAgICAgICBzYXZlX3NpemUgPSAocG5nX3NpemVfdClwbmdfcHRyLT5za2lwX2xlbmd0aDsKKyAgICAgIGVsc2UKKyAgICAgICAgIHNhdmVfc2l6ZSA9IHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemU7CisKKyAgICAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKKworICAgICAgcG5nX3B0ci0+c2tpcF9sZW5ndGggLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7CisgICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOworICAgfQorICAgaWYgKCFwbmdfcHRyLT5za2lwX2xlbmd0aCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IDQpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7CisgICAgICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF9DSFVOS19NT0RFOworICAgfQorfQorCit2b2lkIFBOR0FQSQorcG5nX3B1c2hfZmlsbF9idWZmZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBwbmdfYnl0ZXAgcHRyOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwdHIgPSBidWZmZXI7CisgICBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKKyAgIHsKKyAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOworCisgICAgICBpZiAobGVuZ3RoIDwgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKKyAgICAgICAgIHNhdmVfc2l6ZSA9IGxlbmd0aDsKKyAgICAgIGVsc2UKKyAgICAgICAgIHNhdmVfc2l6ZSA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7CisKKyAgICAgIHBuZ19tZW1jcHkocHRyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7CisgICAgICBsZW5ndGggLT0gc2F2ZV9zaXplOworICAgICAgcHRyICs9IHNhdmVfc2l6ZTsKKyAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKKyAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfcHRyICs9IHNhdmVfc2l6ZTsKKyAgIH0KKyAgIGlmIChsZW5ndGggJiYgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKKyAgIHsKKyAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOworCisgICAgICBpZiAobGVuZ3RoIDwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKKyAgICAgICAgIHNhdmVfc2l6ZSA9IGxlbmd0aDsKKworICAgICAgZWxzZQorICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZTsKKworICAgICAgcG5nX21lbWNweShwdHIsIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKKyAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyICs9IHNhdmVfc2l6ZTsKKyAgIH0KK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXJfcHRyICE9IHBuZ19wdHItPnNhdmVfYnVmZmVyKQorICAgICAgeworICAgICAgICAgcG5nX3NpemVfdCBpLCBpc3RvcDsKKyAgICAgICAgIHBuZ19ieXRlcCBzcDsKKyAgICAgICAgIHBuZ19ieXRlcCBkcDsKKworICAgICAgICAgaXN0b3AgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplOworICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIsIGRwID0gcG5nX3B0ci0+c2F2ZV9idWZmZXI7CisgICAgICAgICAgICBpIDwgaXN0b3A7IGkrKywgc3ArKywgZHArKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICpkcCA9ICpzcDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplICsgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSA+CisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9tYXgpCisgICB7CisgICAgICBwbmdfc2l6ZV90IG5ld19tYXg7CisgICAgICBwbmdfYnl0ZXAgb2xkX2J1ZmZlcjsKKworICAgICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgPiBQTkdfU0laRV9NQVggLQorICAgICAgICAgKHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgKyAyNTYpKQorICAgICAgeworICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlBvdGVudGlhbCBvdmVyZmxvdyBvZiBzYXZlX2J1ZmZlciIpOworICAgICAgfQorCisgICAgICBuZXdfbWF4ID0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSArIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgKyAyNTY7CisgICAgICBvbGRfYnVmZmVyID0gcG5nX3B0ci0+c2F2ZV9idWZmZXI7CisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlciA9IChwbmdfYnl0ZXApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCisgICAgICAgICAocG5nX3VpbnRfMzIpbmV3X21heCk7CisgICAgICBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXIgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkX2J1ZmZlcik7CisgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3Igc2F2ZV9idWZmZXIiKTsKKyAgICAgIH0KKyAgICAgIHBuZ19tZW1jcHkocG5nX3B0ci0+c2F2ZV9idWZmZXIsIG9sZF9idWZmZXIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpOworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkX2J1ZmZlcik7CisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9tYXggPSBuZXdfbWF4OworICAgfQorICAgaWYgKHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpCisgICB7CisgICAgICBwbmdfbWVtY3B5KHBuZ19wdHItPnNhdmVfYnVmZmVyICsgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSwKKyAgICAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSk7CisgICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplICs9IHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemU7CisgICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplID0gMDsKKyAgIH0KKyAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciA9IHBuZ19wdHItPnNhdmVfYnVmZmVyOworICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgPSAwOworfQorCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBidWZmZXIsCisgICBwbmdfc2l6ZV90IGJ1ZmZlcl9sZW5ndGgpCit7CisgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlciA9IGJ1ZmZlcjsKKyAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUgPSBidWZmZXJfbGVuZ3RoOworICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgPSBidWZmZXJfbGVuZ3RoICsgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsKKyAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciA9IHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyOworfQorCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19wdXNoX3JlYWRfSURBVChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfQ09OU1QgUE5HX0lEQVQ7CisjZW5kaWYKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9DSFVOS19IRUFERVIpKQorICAgeworICAgICAgcG5nX2J5dGUgY2h1bmtfbGVuZ3RoWzRdOworCisgICAgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCA4KQorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHBuZ19wdXNoX2ZpbGxfYnVmZmVyKHBuZ19wdHIsIGNodW5rX2xlbmd0aCwgNCk7CisgICAgICBwbmdfcHRyLT5wdXNoX2xlbmd0aCA9IHBuZ19nZXRfdWludF8zMShwbmdfcHRyLCBjaHVua19sZW5ndGgpOworICAgICAgcG5nX3Jlc2V0X2NyYyhwbmdfcHRyKTsKKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lLCA0KTsKKyAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfQ0hVTktfSEVBREVSOworCisgICAgICBpZiAocG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF9DSFVOS19NT0RFOworICAgICAgICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0ZJTklTSEVEKSkKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm90IGVub3VnaCBjb21wcmVzc2VkIGRhdGEiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gcG5nX3B0ci0+cHVzaF9sZW5ndGg7CisgICB9CisgICBpZiAocG5nX3B0ci0+aWRhdF9zaXplICYmIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpCisgICB7CisgICAgICBwbmdfc2l6ZV90IHNhdmVfc2l6ZTsKKworICAgICAgaWYgKHBuZ19wdHItPmlkYXRfc2l6ZSA8IChwbmdfdWludF8zMilwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplKQorICAgICAgeworICAgICAgICAgc2F2ZV9zaXplID0gKHBuZ19zaXplX3QpcG5nX3B0ci0+aWRhdF9zaXplOworCisgICAgICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAgICAgIGlmICgocG5nX3VpbnRfMzIpc2F2ZV9zaXplICE9IHBuZ19wdHItPmlkYXRfc2l6ZSkKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAic2F2ZV9zaXplIG92ZXJmbG93ZWQgaW4gcG5ncHJlYWQiKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgIHNhdmVfc2l6ZSA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7CisKKyAgICAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKKworICAgICAgcG5nX3Byb2Nlc3NfSURBVF9kYXRhKHBuZ19wdHIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKKworICAgICAgcG5nX3B0ci0+aWRhdF9zaXplIC09IHNhdmVfc2l6ZTsKKyAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKKyAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfcHRyICs9IHNhdmVfc2l6ZTsKKyAgIH0KKyAgIGlmIChwbmdfcHRyLT5pZGF0X3NpemUgJiYgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKKyAgIHsKKyAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOworCisgICAgICBpZiAocG5nX3B0ci0+aWRhdF9zaXplIDwgKHBuZ191aW50XzMyKXBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpCisgICAgICB7CisgICAgICAgICBzYXZlX3NpemUgPSAocG5nX3NpemVfdClwbmdfcHRyLT5pZGF0X3NpemU7CisKKyAgICAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgICAgICAgaWYgKChwbmdfdWludF8zMilzYXZlX3NpemUgIT0gcG5nX3B0ci0+aWRhdF9zaXplKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJzYXZlX3NpemUgb3ZlcmZsb3dlZCBpbiBwbmdwcmVhZCIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZTsKKworICAgICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyLCBzYXZlX3NpemUpOworCisgICAgICBwbmdfcHJvY2Vzc19JREFUX2RhdGEocG5nX3B0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyLCBzYXZlX3NpemUpOworCisgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOworICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7CisgICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOworICAgfQorICAgaWYgKCFwbmdfcHRyLT5pZGF0X3NpemUpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCA0KQorICAgICAgeworICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApOworICAgICAgcG5nX3B0ci0+bW9kZSAmPSB+UE5HX0hBVkVfQ0hVTktfSEVBREVSOworICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKKyAgIH0KK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHJvY2Vzc19JREFUX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZmZlciwKKyAgIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCkKK3sKKyAgIC8qIFRoZSBjYWxsZXIgY2hlY2tzIGZvciBhIG5vbi16ZXJvIGJ1ZmZlciBsZW5ndGguICovCisgICBpZiAoIShidWZmZXJfbGVuZ3RoID4gMCkgfHwgYnVmZmVyID09IE5VTEwpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vIElEQVQgZGF0YSAoaW50ZXJuYWwgZXJyb3IpIik7CisKKyAgIC8qIFRoaXMgcm91dGluZSBtdXN0IHByb2Nlc3MgYWxsIHRoZSBkYXRhIGl0IGhhcyBiZWVuIGdpdmVuCisgICAgKiBiZWZvcmUgcmV0dXJuaW5nLCBjYWxsaW5nIHRoZSByb3cgY2FsbGJhY2sgYXMgcmVxdWlyZWQgdG8KKyAgICAqIGhhbmRsZSB0aGUgdW5jb21wcmVzc2VkIHJlc3VsdHMuCisgICAgKi8KKyAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IGJ1ZmZlcjsKKyAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludClidWZmZXJfbGVuZ3RoOworCisgICAvKiBLZWVwIGdvaW5nIHVudGlsIHRoZSBkZWNvbXByZXNzZWQgZGF0YSBpcyBhbGwgcHJvY2Vzc2VkCisgICAgKiBvciB0aGUgc3RyZWFtIG1hcmtlZCBhcyBmaW5pc2hlZC4KKyAgICAqLworICAgd2hpbGUgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPiAwICYmCisJICAhKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRCkpCisgICB7CisgICAgICBpbnQgcmV0OworCisgICAgICAvKiBXZSBoYXZlIGRhdGEgZm9yIHpsaWIsIGJ1dCB3ZSBtdXN0IGNoZWNrIHRoYXQgemxpYgorICAgICAgICogaGFzIHNvbWV3aGVyZSB0byBwdXQgdGhlIHJlc3VsdHMuICBJdCBkb2Vzbid0IG1hdHRlcgorICAgICAgICogaWYgd2UgZG9uJ3QgZXhwZWN0IGFueSByZXN1bHRzIC0tIGl0IG1heSBiZSB0aGUgaW5wdXQKKyAgICAgICAqIGRhdGEgaXMganVzdCB0aGUgTFogZW5kIGNvZGUuCisgICAgICAgKi8KKyAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID4gMCkpCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9CisgICAgICAgICAgICAgKHVJbnQpIFBOR19ST1dCWVRFUyhwbmdfcHRyLT5waXhlbF9kZXB0aCwKKyAgICAgICAgICAgICBwbmdfcHRyLT5pd2lkdGgpICsgMTsKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT5yb3dfYnVmOworICAgICAgfQorCisgICAgICAvKiBVc2luZyBaX1NZTkNfRkxVU0ggaGVyZSBtZWFucyB0aGF0IGFuIHVudGVybWluYXRlZAorICAgICAgICogTFogc3RyZWFtIGNhbiBzdGlsbCBiZSBoYW5kbGVkIChhIHN0cmVhbSB3aXRoIGEgbWlzc2luZworICAgICAgICogZW5kIGNvZGUpLCBvdGhlcndpc2UgKFpfTk9fRkxVU0gpIGEgZnV0dXJlIHpsaWIKKyAgICAgICAqIGltcGxlbWVudGF0aW9uIG1pZ2h0IGRlZmVyIG91dHB1dCBhbmQsIHRoZXJlZm9yZSwKKyAgICAgICAqIGNoYW5nZSB0aGUgY3VycmVudCBiZWhhdmlvci4gIChTZWUgY29tbWVudHMgaW4gaW5mbGF0ZS5jCisgICAgICAgKiBmb3Igd2h5IHRoaXMgZG9lc24ndCBoYXBwZW4gYXQgcHJlc2VudCB3aXRoIHpsaWIgMS4yLjUuKQorICAgICAgICovCisgICAgICByZXQgPSBpbmZsYXRlKCZwbmdfcHRyLT56c3RyZWFtLCBaX1NZTkNfRkxVU0gpOworCisgICAgICAvKiBDaGVjayBmb3IgYW55IGZhaWx1cmUgYmVmb3JlIHByb2NlZWRpbmcuICovCisgICAgICBpZiAocmV0ICE9IFpfT0sgJiYgcmV0ICE9IFpfU1RSRUFNX0VORCkKKyAgICAgIHsKKwkgLyogVGVybWluYXRlIHRoZSBkZWNvbXByZXNzaW9uLiAqLworCSBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOworCisgICAgICAgICAvKiBUaGlzIG1heSBiZSBhIHRydW5jYXRlZCBzdHJlYW0gKG1pc3Npbmcgb3IKKwkgICogZGFtYWdlZCBlbmQgY29kZSkuICBUcmVhdCB0aGF0IGFzIGEgd2FybmluZy4KKwkgICovCisgICAgICAgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA+PSBwbmdfcHRyLT5udW1fcm93cyB8fAorCSAgICAgcG5nX3B0ci0+cGFzcyA+IDYpCisJICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJUcnVuY2F0ZWQgY29tcHJlc3NlZCBkYXRhIGluIElEQVQiKTsKKwkgZWxzZQorCSAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkRlY29tcHJlc3Npb24gZXJyb3IgaW4gSURBVCIpOworCisJIC8qIFNraXAgdGhlIGNoZWNrIG9uIHVucHJvY2Vzc2VkIGlucHV0ICovCisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8qIERpZCBpbmZsYXRlIG91dHB1dCBhbnkgZGF0YT8gKi8KKyAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ICE9IHBuZ19wdHItPnJvd19idWYpCisgICAgICB7CisJIC8qIElzIHRoaXMgdW5leHBlY3RlZCBkYXRhIGFmdGVyIHRoZSBsYXN0IHJvdz8KKwkgICogSWYgaXQgaXMsIGFydGlmaWNpYWxseSB0ZXJtaW5hdGUgdGhlIExaIG91dHB1dAorCSAgKiBoZXJlLgorCSAgKi8KKyAgICAgICAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyID49IHBuZ19wdHItPm51bV9yb3dzIHx8CisJICAgICBwbmdfcHRyLT5wYXNzID4gNikKKyAgICAgICAgIHsKKwkgICAgLyogRXh0cmEgZGF0YS4gKi8KKwkgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkV4dHJhIGNvbXByZXNzZWQgZGF0YSBpbiBJREFUIik7CisgICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOworCSAgICAvKiBEbyBubyBtb3JlIHByb2Nlc3Npbmc7IHNraXAgdGhlIHVucHJvY2Vzc2VkCisJICAgICAqIGlucHV0IGNoZWNrIGJlbG93LgorCSAgICAgKi8KKyAgICAgICAgICAgIHJldHVybjsKKwkgfQorCisJIC8qIERvIHdlIGhhdmUgYSBjb21wbGV0ZSByb3c/ICovCisJIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9PSAwKQorCSAgICBwbmdfcHVzaF9wcm9jZXNzX3JvdyhwbmdfcHRyKTsKKyAgICAgIH0KKworICAgICAgLyogQW5kIGNoZWNrIGZvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICovCisgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKwkgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRDsKKyAgIH0KKworICAgLyogQWxsIHRoZSBkYXRhIHNob3VsZCBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBpZiBhbnl0aGluZworICAgICogaXMgbGVmdCBhdCB0aGlzIHBvaW50IHdlIGhhdmUgYnl0ZXMgb2YgSURBVCBkYXRhCisgICAgKiBhZnRlciB0aGUgemxpYiBlbmQgY29kZS4KKyAgICAqLworICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPiAwKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkV4dHJhIGNvbXByZXNzaW9uIGRhdGEiKTsKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9wcm9jZXNzX3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX3B0ci0+cm93X2luZm8uY29sb3JfdHlwZSA9IHBuZ19wdHItPmNvbG9yX3R5cGU7CisgICBwbmdfcHRyLT5yb3dfaW5mby53aWR0aCA9IHBuZ19wdHItPml3aWR0aDsKKyAgIHBuZ19wdHItPnJvd19pbmZvLmNoYW5uZWxzID0gcG5nX3B0ci0+Y2hhbm5lbHM7CisgICBwbmdfcHRyLT5yb3dfaW5mby5iaXRfZGVwdGggPSBwbmdfcHRyLT5iaXRfZGVwdGg7CisgICBwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCA9IHBuZ19wdHItPnBpeGVsX2RlcHRoOworCisgICBwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCwKKyAgICAgICBwbmdfcHRyLT5yb3dfaW5mby53aWR0aCk7CisKKyAgIHBuZ19yZWFkX2ZpbHRlcl9yb3cocG5nX3B0ciwgJihwbmdfcHRyLT5yb3dfaW5mbyksCisgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEsIHBuZ19wdHItPnByZXZfcm93ICsgMSwKKyAgICAgICAoaW50KShwbmdfcHRyLT5yb3dfYnVmWzBdKSk7CisKKyAgIHBuZ19tZW1jcHlfY2hlY2socG5nX3B0ciwgcG5nX3B0ci0+cHJldl9yb3csIHBuZ19wdHItPnJvd19idWYsCisgICAgICBwbmdfcHRyLT5yb3dieXRlcyArIDEpOworCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHx8IChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19TVFJJUF9BTFBIQSkpCisgICAgICBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7CisKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIC8qIEJsb3cgdXAgaW50ZXJsYWNlZCByb3dzIHRvIGZ1bGwgc2l6ZSAqLworICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgJiYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA2KQorLyogICAgICAgb2xkIGludGVyZmFjZSAocHJlLTEuMC45KToKKyAgICAgICAgIHBuZ19kb19yZWFkX2ludGVybGFjZSgmKHBuZ19wdHItPnJvd19pbmZvKSwKKyAgICAgICAgICAgICBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0ci0+cGFzcywgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zKTsKKyAqLworICAgICAgICAgcG5nX2RvX3JlYWRfaW50ZXJsYWNlKHBuZ19wdHIpOworCisgICAgc3dpdGNoIChwbmdfcHRyLT5wYXNzKQorICAgIHsKKyAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDggJiYgcG5nX3B0ci0+cGFzcyA9PSAwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7IC8qIFVwZGF0ZXMgcG5nX3B0ci0+cGFzcyAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSAyKSAvKiBQYXNzIDEgbWlnaHQgYmUgZW1wdHkgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBuZ19wdHItPnBhc3MgPT0gMjsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX2J5dGVwX05VTEwpOworICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0ICYmIHBuZ19wdHItPmhlaWdodCA8PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA0OyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfYnl0ZXBfTlVMTCk7CisgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID09IDYgJiYgcG5nX3B0ci0+aGVpZ2h0IDw9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfYnl0ZXBfTlVMTCk7CisgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSAxOgorICAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCAmJiBwbmdfcHRyLT5wYXNzID09IDE7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gMikgLyogU2tpcCB0b3AgNCBnZW5lcmF0ZWQgcm93cyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgcG5nX3B0ci0+cGFzcyA9PSAyOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfYnl0ZXBfTlVMTCk7CisgICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDI6CisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgcG5nX3B0ci0+cGFzcyA9PSAyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBuZ19wdHItPnBhc3MgPT0gMjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX2J5dGVwX05VTEwpOworICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0KSAvKiBQYXNzIDMgbWlnaHQgYmUgZW1wdHkgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX2J5dGVwX05VTEwpOworICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSAzOgorICAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBuZ19wdHItPnBhc3MgPT0gMzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0KSAvKiBTa2lwIHRvcCB0d28gZ2VuZXJhdGVkIHJvd3MgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX2J5dGVwX05VTEwpOworICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSA0OgorICAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAmJiBwbmdfcHRyLT5wYXNzID09IDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19ieXRlcF9OVUxMKTsKKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNikgLyogUGFzcyA1IG1pZ2h0IGJlIGVtcHR5ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfYnl0ZXBfTlVMTCk7CisgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDU6CisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID09IDYpIC8qIFNraXAgdG9wIGdlbmVyYXRlZCByb3cgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19ieXRlcF9OVUxMKTsKKyAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBjYXNlIDY6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzICE9IDYpCisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX2J5dGVwX05VTEwpOworICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgZWxzZQorI2VuZGlmCisgICB7CisgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICB9Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisjaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCisKKyAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLworICAgUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX3N0YXJ0W10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07CisKKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLworICAgUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX2luY1tdID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OworCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCisgICBQTkdfQ09OU1QgaW50IEZBUkRBVEEgcG5nX3Bhc3NfeXN0YXJ0W10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07CisKKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KKyAgIFBOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc195aW5jW10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07CisKKyAgIC8qIEhlaWdodCBvZiBpbnRlcmxhY2UgYmxvY2suICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZCAtIGlmIHlvdSBuZWVkCisgICAgKiBpdCwgdW5jb21tZW50IGl0IGhlcmUgYW5kIGluIHBuZy5oCisgICBQTkdfQ09OU1QgaW50IEZBUkRBVEEgcG5nX3Bhc3NfaGVpZ2h0W10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07CisgICAqLworI2VuZGlmCisKKyAgIHBuZ19wdHItPnJvd19udW1iZXIrKzsKKyAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyIDwgcG5nX3B0ci0+bnVtX3Jvd3MpCisgICAgICByZXR1cm47CisKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQorICAgeworICAgICAgcG5nX3B0ci0+cm93X251bWJlciA9IDA7CisgICAgICBwbmdfbWVtc2V0X2NoZWNrKHBuZ19wdHIsIHBuZ19wdHItPnByZXZfcm93LCAwLAorICAgICAgICAgcG5nX3B0ci0+cm93Ynl0ZXMgKyAxKTsKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5wYXNzKys7CisgICAgICAgICBpZiAoKHBuZ19wdHItPnBhc3MgPT0gMSAmJiBwbmdfcHRyLT53aWR0aCA8IDUpIHx8CisgICAgICAgICAgICAgKHBuZ19wdHItPnBhc3MgPT0gMyAmJiBwbmdfcHRyLT53aWR0aCA8IDMpIHx8CisgICAgICAgICAgICAgKHBuZ19wdHItPnBhc3MgPT0gNSAmJiBwbmdfcHRyLT53aWR0aCA8IDIpKQorICAgICAgICAgICBwbmdfcHRyLT5wYXNzKys7CisKKyAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID4gNykKKyAgICAgICAgICAgIHBuZ19wdHItPnBhc3MtLTsKKworICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPj0gNykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBwbmdfcHRyLT5pd2lkdGggPSAocG5nX3B0ci0+d2lkdGggKworICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtCisgICAgICAgICAgICBwbmdfcGFzc19zdGFydFtwbmdfcHRyLT5wYXNzXSkgLworICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdOworCisgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IChwbmdfcHRyLT5oZWlnaHQgKworICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXSAtIDEgLQorICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0W3BuZ19wdHItPnBhc3NdKSAvCisgICAgICAgICAgICBwbmdfcGFzc195aW5jW3BuZ19wdHItPnBhc3NdOworCisgICAgICB9IHdoaWxlIChwbmdfcHRyLT5pd2lkdGggPT0gMCB8fCBwbmdfcHRyLT5udW1fcm93cyA9PSAwKTsKKyAgIH0KKyNlbmRpZiAvKiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgKi8KK30KKworI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19wdXNoX2hhbmRsZV90RVh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIKKyAgIGxlbmd0aCkKK3sKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSB8fCAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lFTkQpKQorICAgICAgeworICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgcGxhY2UgdEVYdCIpOworICAgICAgICAgaW5mb19wdHIgPSBpbmZvX3B0cjsgLyogVG8gcXVpZXQgc29tZSBjb21waWxlciB3YXJuaW5ncyAqLworICAgICAgfQorCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICBwbmdfcHRyLT5za2lwX2xlbmd0aCA9IDA7ICAvKiBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5ICovCisKKyAgIGlmIChsZW5ndGggPiAocG5nX3VpbnRfMzIpNjU1MzVMKSAvKiBDYW4ndCBob2xkIGVudGlyZSBzdHJpbmcgaW4gbWVtb3J5ICovCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAidEVYdCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOworICAgICAgcG5nX3B0ci0+c2tpcF9sZW5ndGggPSBsZW5ndGggLSAocG5nX3VpbnRfMzIpNjU1MzVMOworICAgICAgbGVuZ3RoID0gKHBuZ191aW50XzMyKTY1NTM1TDsKKyAgIH0KKyNlbmRpZgorCisgICBwbmdfcHRyLT5jdXJyZW50X3RleHQgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgIChwbmdfdWludF8zMikobGVuZ3RoICsgMSkpOworICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0W2xlbmd0aF0gPSAnXDAnOworICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3B0ciA9IHBuZ19wdHItPmN1cnJlbnRfdGV4dDsKKyAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9zaXplID0gKHBuZ19zaXplX3QpbGVuZ3RoOworICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQgPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF90RVh0X01PREU7Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3B1c2hfcmVhZF90RVh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSAmJiBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCkKKyAgIHsKKyAgICAgIHBuZ19zaXplX3QgdGV4dF9zaXplOworCisgICAgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCkKKyAgICAgICAgIHRleHRfc2l6ZSA9IHBuZ19wdHItPmJ1ZmZlcl9zaXplOworCisgICAgICBlbHNlCisgICAgICAgICB0ZXh0X3NpemUgPSBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdDsKKworICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y3VycmVudF90ZXh0X3B0ciwgdGV4dF9zaXplKTsKKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0IC09IHRleHRfc2l6ZTsKKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9wdHIgKz0gdGV4dF9zaXplOworICAgfQorICAgaWYgKCEocG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQpKQorICAgeworICAgICAgcG5nX3RleHRwIHRleHRfcHRyOworICAgICAgcG5nX2NoYXJwIHRleHQ7CisgICAgICBwbmdfY2hhcnAga2V5OworICAgICAgaW50IHJldDsKKworICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgNCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfcHVzaF9jcmNfZmluaXNoKHBuZ19wdHIpOworCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICAgICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGgpCisgICAgICAgICByZXR1cm47CisjZW5kaWYKKworICAgICAga2V5ID0gcG5nX3B0ci0+Y3VycmVudF90ZXh0OworCisgICAgICBmb3IgKHRleHQgPSBrZXk7ICp0ZXh0OyB0ZXh0KyspCisgICAgICAgICAvKiBFbXB0eSBsb29wICovIDsKKworICAgICAgaWYgKHRleHQgPCBrZXkgKyBwbmdfcHRyLT5jdXJyZW50X3RleHRfc2l6ZSkKKyAgICAgICAgIHRleHQrKzsKKworICAgICAgdGV4dF9wdHIgPSAocG5nX3RleHRwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgIChwbmdfdWludF8zMilwbmdfc2l6ZW9mKHBuZ190ZXh0KSk7CisgICAgICB0ZXh0X3B0ci0+Y29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOworICAgICAgdGV4dF9wdHItPmtleSA9IGtleTsKKyNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKKyAgICAgIHRleHRfcHRyLT5sYW5nID0gTlVMTDsKKyAgICAgIHRleHRfcHRyLT5sYW5nX2tleSA9IE5VTEw7CisjZW5kaWYKKyAgICAgIHRleHRfcHRyLT50ZXh0ID0gdGV4dDsKKworICAgICAgcmV0ID0gcG5nX3NldF90ZXh0XzIocG5nX3B0ciwgaW5mb19wdHIsIHRleHRfcHRyLCAxKTsKKworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwga2V5KTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHRfcHRyKTsKKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dCA9IE5VTEw7CisKKyAgICAgIGlmIChyZXQpCisgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHN0b3JlIHRleHQgY2h1bmsuIik7CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3pUWHRfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19wdXNoX2hhbmRsZV96VFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIKKyAgIGxlbmd0aCkKK3sKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSB8fCAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lFTkQpKQorICAgICAgeworICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgcGxhY2UgelRYdCIpOworICAgICAgICAgaW5mb19wdHIgPSBpbmZvX3B0cjsgLyogVG8gcXVpZXQgc29tZSBjb21waWxlciB3YXJuaW5ncyAqLworICAgICAgfQorCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICAvKiBXZSBjYW4ndCBoYW5kbGUgelRYdCBjaHVua3MgPiA2NEssIHNpbmNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNwYWNlCisgICAgKiB0byBiZSBhYmxlIHRvIHN0b3JlIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4gIEFjdHVhbGx5LCB0aGUgdGhyZXNob2xkCisgICAgKiBpcyBwcm9iYWJseSBhcm91bmQgMzJLLCBidXQgaXQgaXNuJ3QgYXMgZGVmaW5pdGUgYXMgNjRLIGlzLgorICAgICovCisgICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJ6VFh0IGNodW5rIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5Iik7CisgICAgICBwbmdfcHVzaF9jcmNfc2tpcChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorI2VuZGlmCisKKyAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dCA9IChwbmdfY2hhcnApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgKHBuZ191aW50XzMyKShsZW5ndGggKyAxKSk7CisgICBwbmdfcHRyLT5jdXJyZW50X3RleHRbbGVuZ3RoXSA9ICdcMCc7CisgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfcHRyID0gcG5nX3B0ci0+Y3VycmVudF90ZXh0OworICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3NpemUgPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCA9IChwbmdfc2l6ZV90KWxlbmd0aDsKKyAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX3pUWHRfTU9ERTsKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9yZWFkX3pUWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplICYmIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0KQorICAgeworICAgICAgcG5nX3NpemVfdCB0ZXh0X3NpemU7CisKKyAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IChwbmdfdWludF8zMilwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCkKKyAgICAgICAgIHRleHRfc2l6ZSA9IHBuZ19wdHItPmJ1ZmZlcl9zaXplOworCisgICAgICBlbHNlCisgICAgICAgICB0ZXh0X3NpemUgPSBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdDsKKworICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y3VycmVudF90ZXh0X3B0ciwgdGV4dF9zaXplKTsKKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0IC09IHRleHRfc2l6ZTsKKyAgICAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9wdHIgKz0gdGV4dF9zaXplOworICAgfQorICAgaWYgKCEocG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQpKQorICAgeworICAgICAgcG5nX3RleHRwIHRleHRfcHRyOworICAgICAgcG5nX2NoYXJwIHRleHQ7CisgICAgICBwbmdfY2hhcnAga2V5OworICAgICAgaW50IHJldDsKKyAgICAgIHBuZ19zaXplX3QgdGV4dF9zaXplLCBrZXlfc2l6ZTsKKworICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgNCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfcHVzaF9jcmNfZmluaXNoKHBuZ19wdHIpOworCisgICAgICBrZXkgPSBwbmdfcHRyLT5jdXJyZW50X3RleHQ7CisKKyAgICAgIGZvciAodGV4dCA9IGtleTsgKnRleHQ7IHRleHQrKykKKyAgICAgICAgIC8qIEVtcHR5IGxvb3AgKi8gOworCisgICAgICAvKiB6VFh0IGNhbid0IGhhdmUgemVybyB0ZXh0ICovCisgICAgICBpZiAodGV4dCA+PSBrZXkgKyBwbmdfcHRyLT5jdXJyZW50X3RleHRfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dCA9IE5VTEw7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBrZXkpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0ZXh0Kys7CisKKyAgICAgIGlmICgqdGV4dCAhPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0KSAvKiBDaGVjayBjb21wcmVzc2lvbiBieXRlICovCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHQgPSBOVUxMOworICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwga2V5KTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdGV4dCsrOworCisgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSAocG5nX2J5dGVwICl0ZXh0OworICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KShwbmdfcHRyLT5jdXJyZW50X3RleHRfc2l6ZSAtCisgICAgICAgICAodGV4dCAtIGtleSkpOworICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnpidWY7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKKworICAgICAga2V5X3NpemUgPSB0ZXh0IC0ga2V5OworICAgICAgdGV4dF9zaXplID0gMDsKKyAgICAgIHRleHQgPSBOVUxMOworICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EOworCisgICAgICB3aGlsZSAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbikKKyAgICAgIHsKKyAgICAgICAgIHJldCA9IGluZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7CisgICAgICAgICBpZiAocmV0ICE9IFpfT0sgJiYgcmV0ICE9IFpfU1RSRUFNX0VORCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSk7CisgICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICAgICAgICAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dCA9IE5VTEw7CisgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBrZXkpOworICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgdGV4dCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkgfHwgcmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0ZXh0ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB0ZXh0ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKHBuZ19wdHItPnpidWZfc2l6ZQorICAgICAgICAgICAgICAgICAgICAgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCArIGtleV9zaXplICsgMSkpOworCisgICAgICAgICAgICAgICBwbmdfbWVtY3B5KHRleHQgKyBrZXlfc2l6ZSwgcG5nX3B0ci0+emJ1ZiwKKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnpidWZfc2l6ZSAtIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KTsKKworICAgICAgICAgICAgICAgcG5nX21lbWNweSh0ZXh0LCBrZXksIGtleV9zaXplKTsKKworICAgICAgICAgICAgICAgdGV4dF9zaXplID0ga2V5X3NpemUgKyBwbmdfcHRyLT56YnVmX3NpemUgLQorICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQ7CisKKyAgICAgICAgICAgICAgICoodGV4dCArIHRleHRfc2l6ZSkgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2NoYXJwIHRtcDsKKworICAgICAgICAgICAgICAgdG1wID0gdGV4dDsKKyAgICAgICAgICAgICAgIHRleHQgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwgdGV4dF9zaXplICsKKyAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3B0ci0+emJ1Zl9zaXplIAorICAgICAgICAgICAgICAgICAgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCArIDEpKTsKKworICAgICAgICAgICAgICAgcG5nX21lbWNweSh0ZXh0LCB0bXAsIHRleHRfc2l6ZSk7CisgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCB0bXApOworCisgICAgICAgICAgICAgICBwbmdfbWVtY3B5KHRleHQgKyB0ZXh0X3NpemUsIHBuZ19wdHItPnpidWYsCisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT56YnVmX3NpemUgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCk7CisKKyAgICAgICAgICAgICAgIHRleHRfc2l6ZSArPSBwbmdfcHRyLT56YnVmX3NpemUgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgICAgICAgICoodGV4dCArIHRleHRfc2l6ZSkgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKKyAgICAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSk7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsKKworICAgICAgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHQgPSBOVUxMOworICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwga2V5KTsKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHQpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHQgPSBOVUxMOworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwga2V5KTsKKyAgICAgIGtleSA9IHRleHQ7CisgICAgICB0ZXh0ICs9IGtleV9zaXplOworCisgICAgICB0ZXh0X3B0ciA9IChwbmdfdGV4dHApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgIChwbmdfdWludF8zMilwbmdfc2l6ZW9mKHBuZ190ZXh0KSk7CisgICAgICB0ZXh0X3B0ci0+Y29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0OworICAgICAgdGV4dF9wdHItPmtleSA9IGtleTsKKyNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKKyAgICAgIHRleHRfcHRyLT5sYW5nID0gTlVMTDsKKyAgICAgIHRleHRfcHRyLT5sYW5nX2tleSA9IE5VTEw7CisjZW5kaWYKKyAgICAgIHRleHRfcHRyLT50ZXh0ID0gdGV4dDsKKworICAgICAgcmV0ID0gcG5nX3NldF90ZXh0XzIocG5nX3B0ciwgaW5mb19wdHIsIHRleHRfcHRyLCAxKTsKKworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwga2V5KTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHRfcHRyKTsKKworICAgICAgaWYgKHJldCkKKyAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgdG8gc3RvcmUgdGV4dCBjaHVuay4iKTsKKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3B1c2hfaGFuZGxlX2lUWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMgorICAgbGVuZ3RoKQoreworICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpIHx8IChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUVORCkpCisgICAgICB7CisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBwbGFjZSBpVFh0Iik7CisgICAgICAgICBpbmZvX3B0ciA9IGluZm9fcHRyOyAvKiBUbyBxdWlldCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgICB9CisKKyNpZmRlZiBQTkdfTUFYX01BTExPQ182NEsKKyAgIHBuZ19wdHItPnNraXBfbGVuZ3RoID0gMDsgIC8qIFRoaXMgbWF5IG5vdCBiZSBuZWNlc3NhcnkgKi8KKworICAgaWYgKGxlbmd0aCA+IChwbmdfdWludF8zMik2NTUzNUwpIC8qIENhbid0IGhvbGQgZW50aXJlIHN0cmluZyBpbiBtZW1vcnkgKi8KKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJpVFh0IGNodW5rIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5Iik7CisgICAgICBwbmdfcHRyLT5za2lwX2xlbmd0aCA9IGxlbmd0aCAtIChwbmdfdWludF8zMik2NTUzNUw7CisgICAgICBsZW5ndGggPSAocG5nX3VpbnRfMzIpNjU1MzVMOworICAgfQorI2VuZGlmCisKKyAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dCA9IChwbmdfY2hhcnApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgKHBuZ191aW50XzMyKShsZW5ndGggKyAxKSk7CisgICBwbmdfcHRyLT5jdXJyZW50X3RleHRbbGVuZ3RoXSA9ICdcMCc7CisgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfcHRyID0gcG5nX3B0ci0+Y3VycmVudF90ZXh0OworICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3NpemUgPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCA9IChwbmdfc2l6ZV90KWxlbmd0aDsKKyAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX2lUWHRfTU9ERTsKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9yZWFkX2lUWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworCisgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgJiYgcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQpCisgICB7CisgICAgICBwbmdfc2l6ZV90IHRleHRfc2l6ZTsKKworICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQpCisgICAgICAgICB0ZXh0X3NpemUgPSBwbmdfcHRyLT5idWZmZXJfc2l6ZTsKKworICAgICAgZWxzZQorICAgICAgICAgdGV4dF9zaXplID0gcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQ7CisKKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wdHItPmN1cnJlbnRfdGV4dF9wdHIsIHRleHRfc2l6ZSk7CisgICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCAtPSB0ZXh0X3NpemU7CisgICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfcHRyICs9IHRleHRfc2l6ZTsKKyAgIH0KKyAgIGlmICghKHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0KSkKKyAgIHsKKyAgICAgIHBuZ190ZXh0cCB0ZXh0X3B0cjsKKyAgICAgIHBuZ19jaGFycCBrZXk7CisgICAgICBpbnQgY29tcF9mbGFnOworICAgICAgcG5nX2NoYXJwIGxhbmc7CisgICAgICBwbmdfY2hhcnAgbGFuZ19rZXk7CisgICAgICBwbmdfY2hhcnAgdGV4dDsKKyAgICAgIGludCByZXQ7CisKKyAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IDQpCisgICAgICB7CisgICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX3B1c2hfY3JjX2ZpbmlzaChwbmdfcHRyKTsKKworI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SworICAgICAgaWYgKHBuZ19wdHItPnNraXBfbGVuZ3RoKQorICAgICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAgICAgIGtleSA9IHBuZ19wdHItPmN1cnJlbnRfdGV4dDsKKworICAgICAgZm9yIChsYW5nID0ga2V5OyAqbGFuZzsgbGFuZysrKQorICAgICAgICAgLyogRW1wdHkgbG9vcCAqLyA7CisKKyAgICAgIGlmIChsYW5nIDwga2V5ICsgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3NpemUgLSAzKQorICAgICAgICAgbGFuZysrOworCisgICAgICBjb21wX2ZsYWcgPSAqbGFuZysrOworICAgICAgbGFuZysrOyAgICAgLyogU2tpcCBjb21wX3R5cGUsIGFsd2F5cyB6ZXJvICovCisKKyAgICAgIGZvciAobGFuZ19rZXkgPSBsYW5nOyAqbGFuZ19rZXk7IGxhbmdfa2V5KyspCisgICAgICAgICAvKiBFbXB0eSBsb29wICovIDsKKworICAgICAgbGFuZ19rZXkrKzsgICAgICAgIC8qIFNraXAgTlVMIHNlcGFyYXRvciAqLworCisgICAgICB0ZXh0PWxhbmdfa2V5OworCisgICAgICBpZiAobGFuZ19rZXkgPCBrZXkgKyBwbmdfcHRyLT5jdXJyZW50X3RleHRfc2l6ZSAtIDEpCisgICAgICB7CisgICAgICAgIGZvciAoOyAqdGV4dDsgdGV4dCsrKQorICAgICAgICAgICAvKiBFbXB0eSBsb29wICovIDsKKyAgICAgIH0KKworICAgICAgaWYgKHRleHQgPCBrZXkgKyBwbmdfcHRyLT5jdXJyZW50X3RleHRfc2l6ZSkKKyAgICAgICAgIHRleHQrKzsKKworICAgICAgdGV4dF9wdHIgPSAocG5nX3RleHRwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgIChwbmdfdWludF8zMilwbmdfc2l6ZW9mKHBuZ190ZXh0KSk7CisKKyAgICAgIHRleHRfcHRyLT5jb21wcmVzc2lvbiA9IGNvbXBfZmxhZyArIDI7CisgICAgICB0ZXh0X3B0ci0+a2V5ID0ga2V5OworICAgICAgdGV4dF9wdHItPmxhbmcgPSBsYW5nOworICAgICAgdGV4dF9wdHItPmxhbmdfa2V5ID0gbGFuZ19rZXk7CisgICAgICB0ZXh0X3B0ci0+dGV4dCA9IHRleHQ7CisgICAgICB0ZXh0X3B0ci0+dGV4dF9sZW5ndGggPSAwOworICAgICAgdGV4dF9wdHItPml0eHRfbGVuZ3RoID0gcG5nX3N0cmxlbih0ZXh0KTsKKworICAgICAgcmV0ID0gcG5nX3NldF90ZXh0XzIocG5nX3B0ciwgaW5mb19wdHIsIHRleHRfcHRyLCAxKTsKKworICAgICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0ID0gTlVMTDsKKworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgdGV4dF9wdHIpOworICAgICAgaWYgKHJldCkKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHN0b3JlIGlUWHQgY2h1bmsuIik7CisgICB9Cit9CisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlbid0IGZvdW5kIGEgaGFuZGxlciBmb3IgdGhpcworICogY2h1bmsuICBJZiB0aGVyZSBpc24ndCBhIHByb2JsZW0gd2l0aCB0aGUgY2h1bmsgaXRzZWxmIChpZSBhIGJhZCBjaHVuaworICogbmFtZSBvciBhIGNyaXRpY2FsIGNodW5rKSwgdGhlIGNodW5rIGlzIChjdXJyZW50bHkpIHNpbGVudGx5IGlnbm9yZWQuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3B1c2hfaGFuZGxlX3Vua25vd24ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMgorICAgbGVuZ3RoKQoreworICAgcG5nX3VpbnRfMzIgc2tpcCA9IDA7CisKKyAgIGlmICghKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSkKKyAgIHsKKyNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgICAgIGlmIChwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSkgIT0KKyAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTCisjaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAgICAmJiBwbmdfcHRyLT5yZWFkX3VzZXJfY2h1bmtfZm4gPT0gTlVMTAorI2VuZGlmCisgICAgICAgICApCisjZW5kaWYKKyAgICAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAidW5rbm93biBjcml0aWNhbCBjaHVuayIpOworCisgICAgICBpbmZvX3B0ciA9IGluZm9fcHRyOyAvKiBUbyBxdWlldCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzICovCisgICB9CisKKyNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0tFRVBfVU5LTk9XTl9DSFVOS1MpCisgICB7CisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICAgICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKKyAgICAgIHsKKyAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAidW5rbm93biBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOworICAgICAgICAgIHNraXAgPSBsZW5ndGggLSAocG5nX3VpbnRfMzIpNjU1MzVMOworICAgICAgICAgIGxlbmd0aCA9IChwbmdfdWludF8zMik2NTUzNUw7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHBuZ19tZW1jcHkoKHBuZ19jaGFycClwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWUsCisgICAgICAgICAgICAgICAgIChwbmdfY2hhcnApcG5nX3B0ci0+Y2h1bmtfbmFtZSwgCisgICAgICAgICAgICAgICAgIHBuZ19zaXplb2YocG5nX3B0ci0+dW5rbm93bl9jaHVuay5uYW1lKSk7CisgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWVbcG5nX3NpemVvZihwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWUpIC0gMV0KKyAgICAgICAgPSAnXDAnOworCisgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLnNpemUgPSAocG5nX3NpemVfdClsZW5ndGg7CisKKyAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IE5VTEw7CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgKHBuZ191aW50XzMyKWxlbmd0aCk7CisgICAgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEsIGxlbmd0aCk7CisgICAgICB9CisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKKyAgICAgIGlmIChwbmdfcHRyLT5yZWFkX3VzZXJfY2h1bmtfZm4gIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIC8qIENhbGxiYWNrIHRvIHVzZXIgdW5rbm93biBjaHVuayBoYW5kbGVyICovCisgICAgICAgICBpbnQgcmV0OworICAgICAgICAgcmV0ID0gKCoocG5nX3B0ci0+cmVhZF91c2VyX2NodW5rX2ZuKSkKKyAgICAgICAgICAgKHBuZ19wdHIsICZwbmdfcHRyLT51bmtub3duX2NodW5rKTsKKworICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgImVycm9yIGluIHVzZXIgY2h1bmsiKTsKKworICAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+Y2h1bmtfbmFtZVswXSAmIDB4MjApKQorICAgICAgICAgICAgICAgaWYgKHBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lKSAhPQorICAgICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FMV0FZUykKKyAgICAgICAgICAgICAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAidW5rbm93biBjcml0aWNhbCBjaHVuayIpOworICAgICAgICAgICAgcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICAgICAgICAgICZwbmdfcHRyLT51bmtub3duX2NodW5rLCAxKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsICZwbmdfcHRyLT51bmtub3duX2NodW5rLCAxKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSk7CisgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgPSBOVUxMOworICAgfQorCisgICBlbHNlCisjZW5kaWYKKyAgICAgIHNraXA9bGVuZ3RoOworICAgcG5nX3B1c2hfY3JjX3NraXAocG5nX3B0ciwgc2tpcCk7Cit9CisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3B1c2hfaGF2ZV9pbmZvKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyLT5pbmZvX2ZuICE9IE5VTEwpCisgICAgICAoKihwbmdfcHRyLT5pbmZvX2ZuKSkocG5nX3B0ciwgaW5mb19wdHIpOworfQorCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19wdXNoX2hhdmVfZW5kKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIGlmIChwbmdfcHRyLT5lbmRfZm4gIT0gTlVMTCkKKyAgICAgICgqKHBuZ19wdHItPmVuZF9mbikpKHBuZ19wdHIsIGluZm9fcHRyKTsKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfcHVzaF9oYXZlX3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgcm93KQoreworICAgaWYgKHBuZ19wdHItPnJvd19mbiAhPSBOVUxMKQorICAgICAgKCoocG5nX3B0ci0+cm93X2ZuKSkocG5nX3B0ciwgcm93LCBwbmdfcHRyLT5yb3dfbnVtYmVyLAorICAgICAgICAgKGludClwbmdfcHRyLT5wYXNzKTsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyAocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgIHBuZ19ieXRlcCBvbGRfcm93LCBwbmdfYnl0ZXAgbmV3X3JvdykKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX2RzcF9tYXNrWzddID0KKyAgICAgIHsweGZmLCAweDBmLCAweGZmLCAweDMzLCAweGZmLCAweDU1LCAweGZmfTsKKyNlbmRpZgorCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAobmV3X3JvdyAhPSBOVUxMKSAgICAvKiBuZXdfcm93IG11c3QgPT0gcG5nX3B0ci0+cm93X2J1ZiBoZXJlLiAqLworICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csIHBuZ19wYXNzX2RzcF9tYXNrW3BuZ19wdHItPnBhc3NdKTsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHJvZ3Jlc3NpdmVfcHRyLAorICAgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIGluZm9fZm4sIHBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyIHJvd19mbiwKKyAgIHBuZ19wcm9ncmVzc2l2ZV9lbmRfcHRyIGVuZF9mbikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPmluZm9fZm4gPSBpbmZvX2ZuOworICAgcG5nX3B0ci0+cm93X2ZuID0gcm93X2ZuOworICAgcG5nX3B0ci0+ZW5kX2ZuID0gZW5kX2ZuOworCisgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3B0ciwgcHJvZ3Jlc3NpdmVfcHRyLCBwbmdfcHVzaF9maWxsX2J1ZmZlcik7Cit9CisKK3BuZ192b2lkcCBQTkdBUEkKK3BuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIChOVUxMKTsKKworICAgcmV0dXJuIHBuZ19wdHItPmlvX3B0cjsKK30KKyNlbmRpZiAvKiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9saWJwbmcvcG5ncmVhZC5jIGIvY29tMzIvbGliL2xpYnBuZy9wbmdyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwNzYyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvcG5ncmVhZC5jCkBAIC0wLDAgKzEsMTUyOCBAQAorCisvKiBwbmdyZWFkLmMgLSByZWFkIGEgUE5HIGZpbGUKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuMi40NCBbSnVuZSAyNiwgMjAxMF0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRoYXQgYW4gYXBwbGljYXRpb24gY2FsbHMgZGlyZWN0bHkgdG8KKyAqIHJlYWQgYSBQTkcgZmlsZSBvciBzdHJlYW0uCisgKi8KKworI2RlZmluZSBQTkdfSU5URVJOQUwKKyNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCisjaW5jbHVkZSAicG5nLmgiCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisKKworLyogQ3JlYXRlIGEgUE5HIHN0cnVjdHVyZSBmb3IgcmVhZGluZywgYW5kIGFsbG9jYXRlIGFueSBtZW1vcnkgbmVlZGVkLiAqLworcG5nX3N0cnVjdHAgUE5HQVBJCitwbmdfY3JlYXRlX3JlYWRfc3RydWN0KHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCisgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4pCit7CisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICByZXR1cm4gKHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMih1c2VyX3BuZ192ZXIsIGVycm9yX3B0ciwgZXJyb3JfZm4sCisgICAgICB3YXJuX2ZuLCBwbmdfdm9pZHBfTlVMTCwgcG5nX21hbGxvY19wdHJfTlVMTCwgcG5nX2ZyZWVfcHRyX05VTEwpKTsKK30KKworLyogQWx0ZXJuYXRlIGNyZWF0ZSBQTkcgc3RydWN0dXJlIGZvciByZWFkaW5nLCBhbmQgYWxsb2NhdGUgYW55IG1lbW9yeQorICogbmVlZGVkLgorICovCitwbmdfc3RydWN0cCBQTkdBUEkKK3BuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMihwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAorICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuLCBwbmdfdm9pZHAgbWVtX3B0ciwKKyAgIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pCit7CisjZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgIHZvbGF0aWxlCisjZW5kaWYKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7CisKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorI2lmZGVmIFVTRV9GQVJfS0VZV09SRAorICAgam1wX2J1ZiBqbXBidWY7CisjZW5kaWYKKyNlbmRpZgorCisgICBpbnQgaTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0Iik7CisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKXBuZ19jcmVhdGVfc3RydWN0XzIoUE5HX1NUUlVDVF9QTkcsCisgICAgICAocG5nX21hbGxvY19wdHIpbWFsbG9jX2ZuLCAocG5nX3ZvaWRwKW1lbV9wdHIpOworI2Vsc2UKKyAgIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApcG5nX2NyZWF0ZV9zdHJ1Y3QoUE5HX1NUUlVDVF9QTkcpOworI2VuZGlmCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIChOVUxMKTsKKworICAgLyogQWRkZWQgYXQgbGlicG5nLTEuMi42ICovCisjaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggPSBQTkdfVVNFUl9XSURUSF9NQVg7CisgICBwbmdfcHRyLT51c2VyX2hlaWdodF9tYXggPSBQTkdfVVNFUl9IRUlHSFRfTUFYOworIyAgaWZkZWYgUE5HX1VTRVJfQ0hVTktfQ0FDSEVfTUFYCisgICAvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjQzIGFuZCAxLjQuMCAqLworICAgcG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVg7CisjICBlbmRpZgorIyAgaWZkZWYgUE5HX1NFVF9VU0VSX0NIVU5LX01BTExPQ19NQVgKKyAgIC8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNDMgYW5kIDEuNC4xICovCisgICBwbmdfcHRyLT51c2VyX2NodW5rX21hbGxvY19tYXggPSBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYOworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKKyAgIGlmIChzZXRqbXAoam1wYnVmKSkKKyNlbHNlCisgICBpZiAoc2V0am1wKHBuZ19wdHItPmptcGJ1ZikpCisjZW5kaWYKKyAgIHsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnpidWYpOworICAgICAgcG5nX3B0ci0+emJ1ZiA9IE5VTEw7CisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoKHBuZ192b2lkcClwbmdfcHRyLAorICAgICAgICAgKHBuZ19mcmVlX3B0cilmcmVlX2ZuLCAocG5nX3ZvaWRwKW1lbV9wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKXBuZ19wdHIpOworI2VuZGlmCisgICAgICByZXR1cm4gKE5VTEwpOworICAgfQorI2lmZGVmIFVTRV9GQVJfS0VZV09SRAorICAgcG5nX21lbWNweShwbmdfcHRyLT5qbXBidWYsIGptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfU0VUSk1QX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgcG5nX3NldF9tZW1fZm4ocG5nX3B0ciwgbWVtX3B0ciwgbWFsbG9jX2ZuLCBmcmVlX2ZuKTsKKyNlbmRpZgorCisgICBwbmdfc2V0X2Vycm9yX2ZuKHBuZ19wdHIsIGVycm9yX3B0ciwgZXJyb3JfZm4sIHdhcm5fZm4pOworCisgICBpZiAodXNlcl9wbmdfdmVyKQorICAgeworICAgICAgaSA9IDA7CisgICAgICBkbworICAgICAgeworICAgICAgICAgaWYgKHVzZXJfcG5nX3ZlcltpXSAhPSBwbmdfbGlicG5nX3ZlcltpXSkKKyAgICAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0xJQlJBUllfTUlTTUFUQ0g7CisgICAgICB9IHdoaWxlIChwbmdfbGlicG5nX3ZlcltpKytdKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfTElCUkFSWV9NSVNNQVRDSDsKKworCisgICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfTElCUkFSWV9NSVNNQVRDSCkKKyAgICB7CisgICAgICAgLyogTGlicG5nIDAuOTAgYW5kIGxhdGVyIGFyZSBiaW5hcnkgaW5jb21wYXRpYmxlIHdpdGggbGlicG5nIDAuODksIHNvCisgICAgICAgKiB3ZSBtdXN0IHJlY29tcGlsZSBhbnkgYXBwbGljYXRpb25zIHRoYXQgdXNlIGFueSBvbGRlciBsaWJyYXJ5IHZlcnNpb24uCisgICAgICAgKiBGb3IgdmVyc2lvbnMgYWZ0ZXIgbGlicG5nIDEuMCwgd2Ugd2lsbCBiZSBjb21wYXRpYmxlLCBzbyB3ZSBuZWVkCisgICAgICAgKiBvbmx5IGNoZWNrIHRoZSBmaXJzdCBkaWdpdC4KKyAgICAgICAqLworICAgICAgaWYgKHVzZXJfcG5nX3ZlciA9PSBOVUxMIHx8IHVzZXJfcG5nX3ZlclswXSAhPSBwbmdfbGlicG5nX3ZlclswXSB8fAorICAgICAgICAgICh1c2VyX3BuZ192ZXJbMF0gPT0gJzEnICYmIHVzZXJfcG5nX3ZlclsyXSAhPSBwbmdfbGlicG5nX3ZlclsyXSkgfHwKKyAgICAgICAgICAodXNlcl9wbmdfdmVyWzBdID09ICcwJyAmJiB1c2VyX3BuZ192ZXJbMl0gPCAnOScpKQorICAgICAgeworI2lmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICAgICAgIGNoYXIgbXNnWzgwXTsKKyAgICAgICAgIGlmICh1c2VyX3BuZ192ZXIpCisgICAgICAgICB7CisgICAgICAgICAgIHBuZ19zbnByaW50Zihtc2csIDgwLAorICAgICAgICAgICAgICAiQXBwbGljYXRpb24gd2FzIGNvbXBpbGVkIHdpdGggcG5nLmggZnJvbSBsaWJwbmctJS4yMHMiLAorICAgICAgICAgICAgICB1c2VyX3BuZ192ZXIpOworICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOworICAgICAgICAgfQorICAgICAgICAgcG5nX3NucHJpbnRmKG1zZywgODAsCisgICAgICAgICAgICAgIkFwcGxpY2F0aW9uICBpcyAgcnVubmluZyB3aXRoIHBuZy5jIGZyb20gbGlicG5nLSUuMjBzIiwKKyAgICAgICAgICAgICBwbmdfbGlicG5nX3Zlcik7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOworI2VuZGlmCisjaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECisgICAgICAgICBwbmdfcHRyLT5mbGFncyA9IDA7CisjZW5kaWYKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAorICAgICAgICAgICAgIkluY29tcGF0aWJsZSBsaWJwbmcgdmVyc2lvbiBpbiBhcHBsaWNhdGlvbiBhbmQgbGlicmFyeSIpOworICAgICAgfQorICAgfQorCisgICAvKiBJbml0aWFsaXplIHpidWYgLSBjb21wcmVzc2lvbiBidWZmZXIgKi8KKyAgIHBuZ19wdHItPnpidWZfc2l6ZSA9IFBOR19aQlVGX1NJWkU7CisgICBwbmdfcHRyLT56YnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgIChwbmdfdWludF8zMilwbmdfcHRyLT56YnVmX3NpemUpOworICAgcG5nX3B0ci0+enN0cmVhbS56YWxsb2MgPSBwbmdfemFsbG9jOworICAgcG5nX3B0ci0+enN0cmVhbS56ZnJlZSA9IHBuZ196ZnJlZTsKKyAgIHBuZ19wdHItPnpzdHJlYW0ub3BhcXVlID0gKHZvaWRwZilwbmdfcHRyOworCisgICAgICBzd2l0Y2ggKGluZmxhdGVJbml0KCZwbmdfcHRyLT56c3RyZWFtKSkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgWl9PSzogLyogRG8gbm90aGluZyAqLyBicmVhazsKKyAgICAgICAgIGNhc2UgWl9NRU1fRVJST1I6CisgICAgICAgICBjYXNlIFpfU1RSRUFNX0VSUk9SOiBwbmdfZXJyb3IocG5nX3B0ciwgInpsaWIgbWVtb3J5IGVycm9yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgWl9WRVJTSU9OX0VSUk9SOiBwbmdfZXJyb3IocG5nX3B0ciwgInpsaWIgdmVyc2lvbiBlcnJvciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OiBwbmdfZXJyb3IocG5nX3B0ciwgIlVua25vd24gemxpYiBlcnJvciIpOworICAgICAgfQorCisKKyAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOworICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7CisKKyAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCBwbmdfdm9pZHBfTlVMTCwgcG5nX3J3X3B0cl9OVUxMKTsKKworI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisvKiBBcHBsaWNhdGlvbnMgdGhhdCBuZWdsZWN0IHRvIHNldCB1cCB0aGVpciBvd24gc2V0am1wKCkgYW5kIHRoZW4KKyAgIGVuY291bnRlciBhIHBuZ19lcnJvcigpIHdpbGwgbG9uZ2ptcCBoZXJlLiAgU2luY2UgdGhlIGptcGJ1ZiBpcworICAgdGhlbiBtZWFuaW5nbGVzcyB3ZSBhYm9ydCBpbnN0ZWFkIG9mIHJldHVybmluZy4gKi8KKyNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKKyAgIGlmIChzZXRqbXAoam1wYnVmKSkKKyAgICAgICBQTkdfQUJPUlQoKTsKKyAgIHBuZ19tZW1jcHkocG5nX3B0ci0+am1wYnVmLCBqbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOworI2Vsc2UKKyAgIGlmIChzZXRqbXAocG5nX3B0ci0+am1wYnVmKSkKKyAgICAgICBQTkdfQUJPUlQoKTsKKyNlbmRpZgorI2VuZGlmIC8qIFBOR19TRVRKTVBfU1VQUE9SVEVEICovCisKKyAgIHJldHVybiAocG5nX3B0cik7Cit9CisKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZChQTkdfMV8yX1gpCisvKiBJbml0aWFsaXplIFBORyBzdHJ1Y3R1cmUgZm9yIHJlYWRpbmcsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZC4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCksCisgKiBhbmQgaXQgd2lsbCBkaXNhcHBlYXIgYXMgb2YgbGlicG5nLTEuMy4wLgorICovCisjdW5kZWYgcG5nX3JlYWRfaW5pdAordm9pZCBQTkdBUEkKK3BuZ19yZWFkX2luaXQocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIC8qIFdlIG9ubHkgY29tZSBoZXJlIHZpYSBwcmUtMS4wLjctY29tcGlsZWQgYXBwbGljYXRpb25zICovCisgICBwbmdfcmVhZF9pbml0XzIocG5nX3B0ciwgIjEuMC42IG9yIGVhcmxpZXIiLCAwLCAwKTsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19yZWFkX2luaXRfMihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLAorICAgcG5nX3NpemVfdCBwbmdfc3RydWN0X3NpemUsIHBuZ19zaXplX3QgcG5nX2luZm9fc2l6ZSkKK3sKKyAgIC8qIFdlIG9ubHkgY29tZSBoZXJlIHZpYSBwcmUtMS4wLjEyLWNvbXBpbGVkIGFwcGxpY2F0aW9ucyAqLworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyNpZiBkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICBpZiAocG5nX3NpemVvZihwbmdfc3RydWN0KSA+IHBuZ19zdHJ1Y3Rfc2l6ZSB8fAorICAgICAgcG5nX3NpemVvZihwbmdfaW5mbykgPiBwbmdfaW5mb19zaXplKQorICAgeworICAgICAgY2hhciBtc2dbODBdOworICAgICAgcG5nX3B0ci0+d2FybmluZ19mbiA9IE5VTEw7CisgICAgICBpZiAodXNlcl9wbmdfdmVyKQorICAgICAgeworICAgICAgICBwbmdfc25wcmludGYobXNnLCA4MCwKKyAgICAgICAgICAgIkFwcGxpY2F0aW9uIHdhcyBjb21waWxlZCB3aXRoIHBuZy5oIGZyb20gbGlicG5nLSUuMjBzIiwKKyAgICAgICAgICAgdXNlcl9wbmdfdmVyKTsKKyAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKKyAgICAgIH0KKyAgICAgIHBuZ19zbnByaW50Zihtc2csIDgwLAorICAgICAgICAgIkFwcGxpY2F0aW9uICBpcyAgcnVubmluZyB3aXRoIHBuZy5jIGZyb20gbGlicG5nLSUuMjBzIiwKKyAgICAgICAgIHBuZ19saWJwbmdfdmVyKTsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7CisgICB9CisjZW5kaWYKKyAgIGlmIChwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpID4gcG5nX3N0cnVjdF9zaXplKQorICAgeworICAgICAgcG5nX3B0ci0+ZXJyb3JfZm4gPSBOVUxMOworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAorICAgICAgcG5nX3B0ci0+ZmxhZ3MgPSAwOworI2VuZGlmCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICJUaGUgcG5nIHN0cnVjdCBhbGxvY2F0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGZvciByZWFkaW5nIGlzIgorICAgICAgIiB0b28gc21hbGwuIik7CisgICB9CisgICBpZiAocG5nX3NpemVvZihwbmdfaW5mbykgPiBwbmdfaW5mb19zaXplKQorICAgeworICAgICAgcG5nX3B0ci0+ZXJyb3JfZm4gPSBOVUxMOworI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAorICAgICAgcG5nX3B0ci0+ZmxhZ3MgPSAwOworI2VuZGlmCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgIlRoZSBpbmZvIHN0cnVjdCBhbGxvY2F0ZWQgYnkgYXBwbGljYXRpb24gZm9yIHJlYWRpbmcgaXMiCisgICAgICAgICIgdG9vIHNtYWxsLiIpOworICAgfQorICAgcG5nX3JlYWRfaW5pdF8zKCZwbmdfcHRyLCB1c2VyX3BuZ192ZXIsIHBuZ19zdHJ1Y3Rfc2l6ZSk7Cit9CisjZW5kaWYgLyogUE5HXzFfMF9YIHx8IFBOR18xXzJfWCAqLworCit2b2lkIFBOR0FQSQorcG5nX3JlYWRfaW5pdF8zKHBuZ19zdHJ1Y3RwcCBwdHJfcHRyLCBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLAorICAgcG5nX3NpemVfdCBwbmdfc3RydWN0X3NpemUpCit7CisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgIGptcF9idWYgdG1wX2ptcDsgIC8qIHRvIHNhdmUgY3VycmVudCBqdW1wIGJ1ZmZlciAqLworI2VuZGlmCisKKyAgIGludCBpID0gMDsKKworICAgcG5nX3N0cnVjdHAgcG5nX3B0cj0qcHRyX3B0cjsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgZG8KKyAgIHsKKyAgICAgIGlmICh1c2VyX3BuZ192ZXJbaV0gIT0gcG5nX2xpYnBuZ192ZXJbaV0pCisgICAgICB7CisjaWZkZWYgUE5HX0xFR0FDWV9TVVBQT1JURUQKKyAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfTElCUkFSWV9NSVNNQVRDSDsKKyNlbHNlCisgICAgICAgIHBuZ19wdHItPndhcm5pbmdfZm4gPSBOVUxMOworICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgIkFwcGxpY2F0aW9uIHVzZXMgZGVwcmVjYXRlZCBwbmdfcmVhZF9pbml0KCkgYW5kIHNob3VsZCBiZSIKKyAgICAgICAgICIgcmVjb21waWxlZC4iKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgIH0KKyAgIH0gd2hpbGUgKHBuZ19saWJwbmdfdmVyW2krK10pOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX2luaXRfMyIpOworCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgIC8qIFNhdmUganVtcCBidWZmZXIgYW5kIGVycm9yIGZ1bmN0aW9ucyAqLworICAgcG5nX21lbWNweSh0bXBfam1wLCBwbmdfcHRyLT5qbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOworI2VuZGlmCisKKyAgIGlmIChwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpID4gcG5nX3N0cnVjdF9zaXplKQorICAgeworICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0KHBuZ19wdHIpOworICAgICAgKnB0cl9wdHIgPSAocG5nX3N0cnVjdHApcG5nX2NyZWF0ZV9zdHJ1Y3QoUE5HX1NUUlVDVF9QTkcpOworICAgICAgcG5nX3B0ciA9ICpwdHJfcHRyOworICAgfQorCisgICAvKiBSZXNldCBhbGwgdmFyaWFibGVzIHRvIDAgKi8KKyAgIHBuZ19tZW1zZXQocG5nX3B0ciwgMCwgcG5nX3NpemVvZihwbmdfc3RydWN0KSk7CisKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgLyogUmVzdG9yZSBqdW1wIGJ1ZmZlciAqLworICAgcG5nX21lbWNweShwbmdfcHRyLT5qbXBidWYsIHRtcF9qbXAsIHBuZ19zaXplb2Yoam1wX2J1ZikpOworI2VuZGlmCisKKyAgIC8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNiAqLworI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICBwbmdfcHRyLT51c2VyX3dpZHRoX21heCA9IFBOR19VU0VSX1dJRFRIX01BWDsKKyAgIHBuZ19wdHItPnVzZXJfaGVpZ2h0X21heCA9IFBOR19VU0VSX0hFSUdIVF9NQVg7CisjZW5kaWYKKworICAgLyogSW5pdGlhbGl6ZSB6YnVmIC0gY29tcHJlc3Npb24gYnVmZmVyICovCisgICBwbmdfcHRyLT56YnVmX3NpemUgPSBQTkdfWkJVRl9TSVpFOworICAgcG5nX3B0ci0+enN0cmVhbS56YWxsb2MgPSBwbmdfemFsbG9jOworICAgcG5nX3B0ci0+emJ1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAocG5nX3VpbnRfMzIpcG5nX3B0ci0+emJ1Zl9zaXplKTsKKyAgIHBuZ19wdHItPnpzdHJlYW0uemFsbG9jID0gcG5nX3phbGxvYzsKKyAgIHBuZ19wdHItPnpzdHJlYW0uemZyZWUgPSBwbmdfemZyZWU7CisgICBwbmdfcHRyLT56c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpcG5nX3B0cjsKKworICAgc3dpdGNoIChpbmZsYXRlSW5pdCgmcG5nX3B0ci0+enN0cmVhbSkpCisgICB7CisgICAgICBjYXNlIFpfT0s6IC8qIERvIG5vdGhpbmcgKi8gYnJlYWs7CisgICAgICBjYXNlIFpfU1RSRUFNX0VSUk9SOiBwbmdfZXJyb3IocG5nX3B0ciwgInpsaWIgbWVtb3J5IGVycm9yIik7IGJyZWFrOworICAgICAgY2FzZSBaX1ZFUlNJT05fRVJST1I6IHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiB2ZXJzaW9uIGVycm9yIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBwbmdfZXJyb3IocG5nX3B0ciwgIlVua25vd24gemxpYiBlcnJvciIpOworICAgfQorCisgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKKyAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOworCisgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3B0ciwgcG5nX3ZvaWRwX05VTEwsIHBuZ19yd19wdHJfTlVMTCk7Cit9CisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCB0aGUgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFRoaXMgaGFzIGJlZW4KKyAqIGNoYW5nZWQgaW4gdjAuOTAgdG8gYWxsb3cgcmVhZGluZyBhIGZpbGUgdGhhdCBhbHJlYWR5IGhhcyB0aGUgbWFnaWMKKyAqIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc3RyZWFtLiAgWW91IGNhbiB0ZWxsIGxpYnBuZyBob3cgbWFueSBieXRlcyBoYXZlCisgKiBiZWVuIHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0gKHVwIHRvIHRoZSBtYXhpbXVtIG9mIDgpCisgKiB2aWEgcG5nX3NldF9zaWdfYnl0ZXMoKSwgYW5kIHdlIHdpbGwgb25seSBjaGVjayB0aGUgcmVtYWluaW5nIGJ5dGVzCisgKiBoZXJlLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiB0aGVuIGhhdmUgYWNjZXNzIHRvIHRoZSBzaWduYXR1cmUgYnl0ZXMgd2UKKyAqIHJlYWQgaWYgaXQgaXMgZGV0ZXJtaW5lZCB0aGF0IHRoaXMgaXNuJ3QgYSB2YWxpZCBQTkcgZmlsZS4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19yZWFkX2luZm8ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9pbmZvIik7CisgCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgCisgICAvKiBJZiB3ZSBoYXZlbid0IGNoZWNrZWQgYWxsIG9mIHRoZSBQTkcgc2lnbmF0dXJlIGJ5dGVzLCBkbyBzbyBub3cuICovCisgICBpZiAocG5nX3B0ci0+c2lnX2J5dGVzIDwgOCkKKyAgIHsKKyAgICAgIHBuZ19zaXplX3QgbnVtX2NoZWNrZWQgPSBwbmdfcHRyLT5zaWdfYnl0ZXMsCisgICAgICAgICAgICAgICAgIG51bV90b19jaGVjayA9IDggLSBudW1fY2hlY2tlZDsKKworICAgICAgcG5nX3JlYWRfZGF0YShwbmdfcHRyLCAmKGluZm9fcHRyLT5zaWduYXR1cmVbbnVtX2NoZWNrZWRdKSwgbnVtX3RvX2NoZWNrKTsKKyAgICAgIHBuZ19wdHItPnNpZ19ieXRlcyA9IDg7CisKKyAgICAgIGlmIChwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrKSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChudW1fY2hlY2tlZCA8IDQgJiYKKyAgICAgICAgICAgICBwbmdfc2lnX2NtcChpbmZvX3B0ci0+c2lnbmF0dXJlLCBudW1fY2hlY2tlZCwgbnVtX3RvX2NoZWNrIC0gNCkpCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vdCBhIFBORyBmaWxlIik7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlBORyBmaWxlIGNvcnJ1cHRlZCBieSBBU0NJSSBjb252ZXJzaW9uIik7CisgICAgICB9CisgICAgICBpZiAobnVtX2NoZWNrZWQgPCAzKQorICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9QTkdfU0lHTkFUVVJFOworICAgfQorCisgICBmb3IgKDs7KQorICAgeworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICAgICBQTkdfQ09OU1QgUE5HX0lIRFI7CisgICAgICBQTkdfQ09OU1QgUE5HX0lEQVQ7CisgICAgICBQTkdfQ09OU1QgUE5HX0lFTkQ7CisgICAgICBQTkdfQ09OU1QgUE5HX1BMVEU7CisjaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfYktHRDsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX2NIUk07CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19nQU1BOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfaElTVDsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX2lDQ1A7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19pVFh0OworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfb0ZGczsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3BDQUw7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19wSFlzOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfc0JJVDsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3NDQUw7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19zUExUOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfc1JHQjsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3RFWHQ7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR190SU1FOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfdFJOUzsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3pUWHRfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3pUWHQ7CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfVVNFX0xPQ0FMX0FSUkFZUyAqLworICAgICAgcG5nX3VpbnRfMzIgbGVuZ3RoID0gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKHBuZ19wdHIpOworICAgICAgUE5HX0NPTlNUIHBuZ19ieXRlcCBjaHVua19uYW1lID0gcG5nX3B0ci0+Y2h1bmtfbmFtZTsKKworICAgICAgLyogVGhpcyBzaG91bGQgYmUgYSBiaW5hcnkgc3ViZGl2aXNpb24gc2VhcmNoIG9yIGEgaGFzaCBmb3IKKyAgICAgICAqIG1hdGNoaW5nIHRoZSBjaHVuayBuYW1lIHJhdGhlciB0aGFuIGEgbGluZWFyIHNlYXJjaC4KKyAgICAgICAqLworICAgICAgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKKyAgICAgICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfQUZURVJfSURBVCkKKyAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQ7CisKKyAgICAgIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSUhEUiwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSUVORCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX0lFTkQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAocG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIGNodW5rX25hbWUpKQorICAgICAgeworICAgICAgICAgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKKyAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSURBVDsKKyAgICAgICAgIHBuZ19oYW5kbGVfdW5rbm93bihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfUExURSwgNCkpCisgICAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BMVEU7CisgICAgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgSURBVCIpOworICAgICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCisgICAgICAgICAgICAgICAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSkKKyAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBQTFRFIGJlZm9yZSBJREFUIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX1BMVEUsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQorICAgICAgeworICAgICAgICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIElEQVQiKTsKKyAgICAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgorICAgICAgICAgICAgICAgICAgIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkpCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgSURBVCIpOworCisgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgPSBsZW5ndGg7CisgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lEQVQ7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2JLR0QsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19jSFJNLCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfZ0FNQSwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2hJU1QsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19vRkZzLCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfcENBTCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX3BDQUwocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3NDQUwsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19wSFlzLCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc0JJVCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3NSR0IsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19pQ0NQLCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc1BMVCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX3NQTFQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3RFWHQsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV90RVh0KHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ190SU1FLCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3RSTlNfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfdFJOUywgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3pUWHQsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV96VFh0KHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19pVFh0LCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfaVRYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorICAgICAgZWxzZQorICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworICAgfQorfQorI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCisKKy8qIE9wdGlvbmFsIGNhbGwgdG8gdXBkYXRlIHRoZSB1c2VycyBpbmZvX3B0ciBzdHJ1Y3R1cmUgKi8KK3ZvaWQgUE5HQVBJCitwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIik7CisgCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkpCisgICAgICBwbmdfcmVhZF9zdGFydF9yb3cocG5nX3B0cik7CisgICBlbHNlCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgIklnbm9yaW5nIGV4dHJhIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgY2FsbDsgcm93IGJ1ZmZlciBub3QgcmVhbGxvY2F0ZWQiKTsKKworICAgcG5nX3JlYWRfdHJhbnNmb3JtX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworfQorCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIEluaXRpYWxpemUgcGFsZXR0ZSwgYmFja2dyb3VuZCwgZXRjLCBhZnRlciB0cmFuc2Zvcm1hdGlvbnMKKyAqIGFyZSBzZXQsIGJ1dCBiZWZvcmUgYW55IHJlYWRpbmcgdGFrZXMgcGxhY2UuICBUaGlzIGFsbG93cworICogdGhlIHVzZXIgdG8gb2J0YWluIGEgZ2FtbWEtY29ycmVjdGVkIHBhbGV0dGUsIGZvciBleGFtcGxlLgorICogSWYgdGhlIHVzZXIgZG9lc24ndCBjYWxsIHRoaXMsIHdlIHdpbGwgZG8gaXQgb3Vyc2VsdmVzLgorICovCit2b2lkIFBOR0FQSQorcG5nX3N0YXJ0X3JlYWRfaW1hZ2UocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3N0YXJ0X3JlYWRfaW1hZ2UiKTsKKyAKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1JPV19JTklUKSkKKyAgICAgIHBuZ19yZWFkX3N0YXJ0X3JvdyhwbmdfcHRyKTsKK30KKyNlbmRpZiAvKiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfcmVhZF9yb3cocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHJvdywgcG5nX2J5dGVwIGRzcF9yb3cpCit7CisgICBQTkdfQ09OU1QgUE5HX0lEQVQ7CisgICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX2RzcF9tYXNrWzddID0gezB4ZmYsIDB4MGYsIDB4ZmYsIDB4MzMsIDB4ZmYsIDB4NTUsCisgICAgICAweGZmfTsKKyAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfbWFza1s3XSA9IHsweDgwLCAweDA4LCAweDg4LCAweDIyLCAweGFhLCAweDU1LCAweGZmfTsKKyAgIGludCByZXQ7CisgCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworIAorICAgcG5nX2RlYnVnMigxLCAiaW4gcG5nX3JlYWRfcm93IChyb3cgJWx1LCBwYXNzICVkKSIsCisgICAgICBwbmdfcHRyLT5yb3dfbnVtYmVyLCBwbmdfcHRyLT5wYXNzKTsKKworICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkpCisgICAgICBwbmdfcmVhZF9zdGFydF9yb3cocG5nX3B0cik7CisgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA9PSAwICYmIHBuZ19wdHItPnBhc3MgPT0gMCkKKyAgIHsKKyAgIC8qIENoZWNrIGZvciB0cmFuc2Zvcm1zIHRoYXQgaGF2ZSBiZWVuIHNldCBidXQgd2VyZSBkZWZpbmVkIG91dCAqLworI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQpCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9NT05PKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQuIik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkgJiYgXAorICAgICFkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCkKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkLiIpOworI2VuZGlmCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEKQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkLiIpOworI2VuZGlmCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NISUZUKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JHUikKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfUkVBRF9CR1JfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkLiIpOworI2VuZGlmCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKQorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX1NXQVBfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkLiIpOworI2VuZGlmCisgICB9CisKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIC8qIElmIGludGVybGFjZWQgYW5kIHdlIGRvIG5vdCBuZWVkIGEgbmV3IHJvdywgY29tYmluZSByb3cgYW5kIHJldHVybiAqLworICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgJiYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpKQorICAgeworICAgICAgc3dpdGNoIChwbmdfcHRyLT5wYXNzKQorICAgICAgeworICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDA3KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LAorICAgICAgICAgICAgICAgICAgICAgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgfHwgcG5nX3B0ci0+d2lkdGggPCA1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LAorICAgICAgICAgICAgICAgICAgICAgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChkc3Bfcm93ICE9IE5VTEwgJiYgKHBuZ19wdHItPnJvd19udW1iZXIgJiA0KSkKKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LAorICAgICAgICAgICAgICAgICAgICAgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMykgfHwgcG5nX3B0ci0+d2lkdGggPCAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LAorICAgICAgICAgICAgICAgICAgICAgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMykgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChkc3Bfcm93ICE9IE5VTEwgJiYgKHBuZ19wdHItPnJvd19udW1iZXIgJiAyKSkKKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LAorICAgICAgICAgICAgICAgICAgICAgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMSkgfHwgcG5nX3B0ci0+d2lkdGggPCAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LAorICAgICAgICAgICAgICAgICAgICAgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+cm93X251bWJlciAmIDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBhdHRlbXB0IHRvIHJlYWQgcm93IGRhdGEiKTsKKworICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnJvd19idWY7CisgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9CisgICAgICAgKHVJbnQpKFBOR19ST1dCWVRFUyhwbmdfcHRyLT5waXhlbF9kZXB0aCwKKyAgICAgICBwbmdfcHRyLT5pd2lkdGgpICsgMSk7CisgICBkbworICAgeworICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbikpCisgICAgICB7CisgICAgICAgICB3aGlsZSAoIXBuZ19wdHItPmlkYXRfc2l6ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApOworCisgICAgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgPSBwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3B0cik7CisgICAgICAgICAgICBpZiAocG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCisgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vdCBlbm91Z2ggaW1hZ2UgZGF0YSIpOworICAgICAgICAgfQorICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IHBuZ19wdHItPnpidWY7CisgICAgICAgICBpZiAocG5nX3B0ci0+emJ1Zl9zaXplID4gcG5nX3B0ci0+aWRhdF9zaXplKQorICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXBuZ19wdHItPmlkYXRfc2l6ZTsKKyAgICAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBwbmdfcHRyLT56YnVmLAorICAgICAgICAgICAgKHBuZ19zaXplX3QpcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbik7CisgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbjsKKyAgICAgIH0KKyAgICAgIHJldCA9IGluZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7CisgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCB8fCBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luIHx8CisgICAgICAgICAgICBwbmdfcHRyLT5pZGF0X3NpemUpCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkV4dHJhIGNvbXByZXNzZWQgZGF0YSIpOworICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pMSUJfRklOSVNIRUQ7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyA/IHBuZ19wdHItPnpzdHJlYW0ubXNnIDoKKyAgICAgICAgICAgICAgICAgICAiRGVjb21wcmVzc2lvbiBlcnJvciIpOworCisgICB9IHdoaWxlIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCk7CisKKyAgIHBuZ19wdHItPnJvd19pbmZvLmNvbG9yX3R5cGUgPSBwbmdfcHRyLT5jb2xvcl90eXBlOworICAgcG5nX3B0ci0+cm93X2luZm8ud2lkdGggPSBwbmdfcHRyLT5pd2lkdGg7CisgICBwbmdfcHRyLT5yb3dfaW5mby5jaGFubmVscyA9IHBuZ19wdHItPmNoYW5uZWxzOworICAgcG5nX3B0ci0+cm93X2luZm8uYml0X2RlcHRoID0gcG5nX3B0ci0+Yml0X2RlcHRoOworICAgcG5nX3B0ci0+cm93X2luZm8ucGl4ZWxfZGVwdGggPSBwbmdfcHRyLT5waXhlbF9kZXB0aDsKKyAgIHBuZ19wdHItPnJvd19pbmZvLnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoLAorICAgICAgIHBuZ19wdHItPnJvd19pbmZvLndpZHRoKTsKKworICAgaWYgKHBuZ19wdHItPnJvd19idWZbMF0pCisgICBwbmdfcmVhZF9maWx0ZXJfcm93KHBuZ19wdHIsICYocG5nX3B0ci0+cm93X2luZm8pLAorICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEsIHBuZ19wdHItPnByZXZfcm93ICsgMSwKKyAgICAgIChpbnQpKHBuZ19wdHItPnJvd19idWZbMF0pKTsKKworICAgcG5nX21lbWNweV9jaGVjayhwbmdfcHRyLCBwbmdfcHRyLT5wcmV2X3JvdywgcG5nX3B0ci0+cm93X2J1ZiwKKyAgICAgIHBuZ19wdHItPnJvd2J5dGVzICsgMSk7CisKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgJiYKKyAgICAgIChwbmdfcHRyLT5maWx0ZXJfdHlwZSA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpKQorICAgeworICAgICAgLyogSW50cmFwaXhlbCBkaWZmZXJlbmNpbmcgKi8KKyAgICAgIHBuZ19kb19yZWFkX2ludHJhcGl4ZWwoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyAgIH0KKyNlbmRpZgorCisKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfHwgKHBuZ19wdHItPmZsYWdzJlBOR19GTEFHX1NUUklQX0FMUEhBKSkKKyAgICAgIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyhwbmdfcHRyKTsKKworI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgLyogQmxvdyB1cCBpbnRlcmxhY2VkIHJvd3MgdG8gZnVsbCBzaXplICovCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAmJgorICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA2KQorICAgICAgICAgLyogT2xkIGludGVyZmFjZSAocHJlLTEuMC45KToKKyAgICAgICAgICAqIHBuZ19kb19yZWFkX2ludGVybGFjZSgmKHBuZ19wdHItPnJvd19pbmZvKSwKKyAgICAgICAgICAqICAgIHBuZ19wdHItPnJvd19idWYgKyAxLCBwbmdfcHRyLT5wYXNzLCBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMpOworICAgICAgICAgICovCisgICAgICAgICBwbmdfZG9fcmVhZF9pbnRlcmxhY2UocG5nX3B0cik7CisKKyAgICAgIGlmIChkc3Bfcm93ICE9IE5VTEwpCisgICAgICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgZHNwX3JvdywKKyAgICAgICAgICAgIHBuZ19wYXNzX2RzcF9tYXNrW3BuZ19wdHItPnBhc3NdKTsKKyAgICAgIGlmIChyb3cgIT0gTlVMTCkKKyAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCByb3csCisgICAgICAgICAgICBwbmdfcGFzc19tYXNrW3BuZ19wdHItPnBhc3NdKTsKKyAgIH0KKyAgIGVsc2UKKyNlbmRpZgorICAgeworICAgICAgaWYgKHJvdyAhPSBOVUxMKQorICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIHJvdywgMHhmZik7CisgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQorICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csIDB4ZmYpOworICAgfQorICAgcG5nX3JlYWRfZmluaXNoX3JvdyhwbmdfcHRyKTsKKworICAgaWYgKHBuZ19wdHItPnJlYWRfcm93X2ZuICE9IE5VTEwpCisgICAgICAoKihwbmdfcHRyLT5yZWFkX3Jvd19mbikpKHBuZ19wdHIsIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOworfQorI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCBvbmUgb3IgbW9yZSByb3dzIG9mIGltYWdlIGRhdGEuICBJZiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCwKKyAqIGFuZCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIGhhcyBiZWVuIGNhbGxlZCwgdGhlIHJvd3MgbmVlZCB0bworICogY29udGFpbiB0aGUgY29udGVudHMgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcHJldmlvdXMgcGFzcy4gIElmIHRoZQorICogaW1hZ2UgaGFzIGFscGhhIG9yIHRyYW5zcGFyZW5jeSwgYW5kIHBuZ19oYW5kbGVfYWxwaGEoKVsqXSBoYXMgYmVlbgorICogY2FsbGVkLCB0aGUgcm93cyBjb250ZW50cyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIHRoZSBjb250ZW50cyBvZiB0aGUKKyAqIHNjcmVlbi4KKyAqCisgKiAicm93IiBob2xkcyB0aGUgYWN0dWFsIGltYWdlLCBhbmQgcGl4ZWxzIGFyZSBwbGFjZWQgaW4gaXQKKyAqIGFzIHRoZXkgYXJyaXZlLiAgSWYgdGhlIGltYWdlIGlzIGRpc3BsYXllZCBhZnRlciBlYWNoIHBhc3MsIGl0IHdpbGwKKyAqIGFwcGVhciB0byAic3BhcmtsZSIgaW4uICAiZGlzcGxheV9yb3ciIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYQorICogImNodW5reSIgcHJvZ3Jlc3NpdmUgaW1hZ2UsIHdpdGggZmluZXIgZGV0YWlsIGFkZGVkIGFzIGl0IGJlY29tZXMKKyAqIGF2YWlsYWJsZS4gIElmIHlvdSBkbyBub3Qgd2FudCB0aGlzICJjaHVua3kiIGRpc3BsYXksIHlvdSBtYXkgcGFzcworICogTlVMTCBmb3IgZGlzcGxheV9yb3cuICBJZiB5b3UgZG8gbm90IHdhbnQgdGhlIHNwYXJrbGUgZGlzcGxheSwgYW5kCisgKiB5b3UgaGF2ZSBub3QgY2FsbGVkIHBuZ19oYW5kbGVfYWxwaGEoKSwgeW91IG1heSBwYXNzIE5VTEwgZm9yIHJvd3MuCisgKiBJZiB5b3UgaGF2ZSBjYWxsZWQgcG5nX2hhbmRsZV9hbHBoYSgpLCBhbmQgdGhlIGltYWdlIGhhcyBlaXRoZXIgYW4KKyAqIGFscGhhIGNoYW5uZWwgb3IgYSB0cmFuc3BhcmVuY3kgY2h1bmssIHlvdSBtdXN0IHByb3ZpZGUgYSBidWZmZXIgZm9yCisgKiByb3dzLiAgSW4gdGhpcyBjYXNlLCB5b3UgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSBhIGRpc3BsYXlfcm93IGJ1ZmZlcgorICogYWxzbywgYnV0IHlvdSBtYXkuICBJZiB0aGUgaW1hZ2UgaXMgbm90IGludGVybGFjZWQsIG9yIGlmIHlvdSBoYXZlCisgKiBub3QgY2FsbGVkIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCksIHRoZSBkaXNwbGF5X3JvdyBidWZmZXIgd2lsbAorICogYmUgaWdub3JlZCwgc28gcGFzcyBOVUxMIHRvIGl0LgorICoKKyAqIFsqXSBwbmdfaGFuZGxlX2FscGhhKCkgZG9lcyBub3QgZXhpc3QgeWV0LCBhcyBvZiB0aGlzIHZlcnNpb24gb2YgbGlicG5nCisgKi8KKwordm9pZCBQTkdBUEkKK3BuZ19yZWFkX3Jvd3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwcCByb3csCisgICBwbmdfYnl0ZXBwIGRpc3BsYXlfcm93LCBwbmdfdWludF8zMiBudW1fcm93cykKK3sKKyAgIHBuZ191aW50XzMyIGk7CisgICBwbmdfYnl0ZXBwIHJwOworICAgcG5nX2J5dGVwcCBkcDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9yb3dzIik7CisgCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcnAgPSByb3c7CisgICBkcCA9IGRpc3BsYXlfcm93OworICAgaWYgKHJwICE9IE5VTEwgJiYgZHAgIT0gTlVMTCkKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcm93czsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX2J5dGVwIHJwdHIgPSAqcnArKzsKKyAgICAgICAgIHBuZ19ieXRlcCBkcHRyID0gKmRwKys7CisKKyAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCBycHRyLCBkcHRyKTsKKyAgICAgIH0KKyAgIGVsc2UgaWYgKHJwICE9IE5VTEwpCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Jvd3M7IGkrKykKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBycHRyID0gKnJwOworICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJwdHIsIHBuZ19ieXRlcF9OVUxMKTsKKyAgICAgICAgIHJwKys7CisgICAgICB9CisgICBlbHNlIGlmIChkcCAhPSBOVUxMKQorICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9yb3dzOyBpKyspCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgZHB0ciA9ICpkcDsKKyAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCBwbmdfYnl0ZXBfTlVMTCwgZHB0cik7CisgICAgICAgICBkcCsrOworICAgICAgfQorfQorI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAorLyogUmVhZCB0aGUgZW50aXJlIGltYWdlLiAgSWYgdGhlIGltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsIG9yIGEgdFJOUworICogY2h1bmssIGFuZCB5b3UgaGF2ZSBjYWxsZWQgcG5nX2hhbmRsZV9hbHBoYSgpWypdLCB5b3Ugd2lsbCBuZWVkIHRvCisgKiBpbml0aWFsaXplIHRoZSBpbWFnZSB0byB0aGUgY3VycmVudCBpbWFnZSB0aGF0IFBORyB3aWxsIGJlIG92ZXJsYXlpbmcuCisgKiBXZSBzZXQgdGhlIG51bV9yb3dzIGFnYWluIGhlcmUsIGluIGNhc2UgaXQgd2FzIGluY29ycmVjdGx5IHNldCBpbgorICogcG5nX3JlYWRfc3RhcnRfcm93KCkgYnkgYSBjYWxsIHRvIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgb3IKKyAqIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgaWYgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSB3YXNuJ3QgY2FsbGVkCisgKiBwcmlvciB0byBlaXRoZXIgb2YgdGhlc2UgZnVuY3Rpb25zIGxpa2UgaXQgc2hvdWxkIGhhdmUgYmVlbi4gIFlvdSBjYW4KKyAqIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UuICBJZiB5b3UgZGVzaXJlIHRvIGhhdmUgYW4gaW1hZ2UgZm9yCisgKiBlYWNoIHBhc3Mgb2YgYSBpbnRlcmxhY2VkIGltYWdlLCB1c2UgcG5nX3JlYWRfcm93cygpIGluc3RlYWQuCisgKgorICogWypdIHBuZ19oYW5kbGVfYWxwaGEoKSBkb2VzIG5vdCBleGlzdCB5ZXQsIGFzIG9mIHRoaXMgdmVyc2lvbiBvZiBsaWJwbmcKKyAqLwordm9pZCBQTkdBUEkKK3BuZ19yZWFkX2ltYWdlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcHAgaW1hZ2UpCit7CisgICBwbmdfdWludF8zMiBpLCBpbWFnZV9oZWlnaHQ7CisgICBpbnQgcGFzcywgajsKKyAgIHBuZ19ieXRlcHAgcnA7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfaW1hZ2UiKTsKKyAKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIHBhc3MgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKKyNlbHNlCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAorICAgICAgICAiQ2Fubm90IHJlYWQgaW50ZXJsYWNlZCBpbWFnZSAtLSBpbnRlcmxhY2UgaGFuZGxlciBkaXNhYmxlZC4iKTsKKyAgIHBhc3MgPSAxOworI2VuZGlmCisKKworICAgaW1hZ2VfaGVpZ2h0PXBuZ19wdHItPmhlaWdodDsKKyAgIHBuZ19wdHItPm51bV9yb3dzID0gaW1hZ2VfaGVpZ2h0OyAvKiBNYWtlIHN1cmUgdGhpcyBpcyBzZXQgY29ycmVjdGx5ICovCisKKyAgIGZvciAoaiA9IDA7IGogPCBwYXNzOyBqKyspCisgICB7CisgICAgICBycCA9IGltYWdlOworICAgICAgZm9yIChpID0gMDsgaSA8IGltYWdlX2hlaWdodDsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsICpycCwgcG5nX2J5dGVwX05VTEwpOworICAgICAgICAgcnArKzsKKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZiAvKiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKKy8qIFJlYWQgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICBXaWxsIG5vdCByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUKKyAqIGZpbGUsIHdpbGwgdmVyaWZ5IHRoZSBlbmQgaXMgYWNjdXJhdGUsIGFuZCB3aWxsIHJlYWQgYW55IGNvbW1lbnRzCisgKiBvciB0aW1lIGluZm9ybWF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIGlmIGluZm8gaXMgbm90IE5VTEwuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfcmVhZF9lbmQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9lbmQiKTsKKyAKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsgLyogRmluaXNoIG9mZiBDUkMgZnJvbSBsYXN0IElEQVQgY2h1bmsgKi8KKworICAgZG8KKyAgIHsKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgICAgUE5HX0NPTlNUIFBOR19JSERSOworICAgICAgUE5HX0NPTlNUIFBOR19JREFUOworICAgICAgUE5HX0NPTlNUIFBOR19JRU5EOworICAgICAgUE5HX0NPTlNUIFBOR19QTFRFOworI2lmZGVmIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX2JLR0Q7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19jSFJNOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfZ0FNQTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX2hJU1Q7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19pQ0NQOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfaVRYdDsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX29GRnNfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX29GRnM7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19wQ0FMOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfcEhZczsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NCSVRfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3NCSVQ7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR19zQ0FMOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfc1BMVDsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3NSR0I7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR190RVh0OworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKKyAgICAgIFBOR19DT05TVCBQTkdfdElNRTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3RSTlNfU1VQUE9SVEVECisgICAgICBQTkdfQ09OU1QgUE5HX3RSTlM7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorICAgICAgUE5HX0NPTlNUIFBOR196VFh0OworI2VuZGlmCisjZW5kaWYgLyogUE5HX1VTRV9MT0NBTF9BUlJBWVMgKi8KKyAgICAgIHBuZ191aW50XzMyIGxlbmd0aCA9IHBuZ19yZWFkX2NodW5rX2hlYWRlcihwbmdfcHRyKTsKKyAgICAgIFBOR19DT05TVCBwbmdfYnl0ZXAgY2h1bmtfbmFtZSA9IHBuZ19wdHItPmNodW5rX25hbWU7CisKKyAgICAgIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSUhEUiwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSUVORCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX0lFTkQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAocG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIGNodW5rX25hbWUpKQorICAgICAgeworICAgICAgICAgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobGVuZ3RoID4gMCkgfHwgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUKSkKKyAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVG9vIG1hbnkgSURBVCdzIGZvdW5kIik7CisgICAgICAgICB9CisgICAgICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisgICAgICAgICBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX1BMVEUsIDQpKQorICAgICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9QTFRFOworICAgICAgfQorI2VuZGlmCisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCisgICAgICB7CisgICAgICAgICAvKiBaZXJvIGxlbmd0aCBJREFUcyBhcmUgbGVnYWwgYWZ0ZXIgdGhlIGxhc3QgSURBVCBoYXMgYmVlbgorICAgICAgICAgICogcmVhZCwgYnV0IG5vdCBhZnRlciBvdGhlciBjaHVua3MgaGF2ZSBiZWVuIHJlYWQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmICgobGVuZ3RoID4gMCkgfHwgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUKSkKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVG9vIG1hbnkgSURBVCdzIGZvdW5kIik7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX1BMVEUsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2lmZGVmIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfYktHRCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX2JLR0QocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2NIUk0sIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19nQU1BLCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfaElTVCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX29GRnMsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19wQ0FMLCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfcENBTChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc0NBTCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3BIWXMsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19zQklULCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc1JHQiwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2lDQ1AsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19zUExULCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfdEVYdCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX3RFWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3RJTUUsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKKyAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ190Uk5TLCA0KSkKKyAgICAgICAgIHBuZ19oYW5kbGVfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX3pUWHRfU1VQUE9SVEVECisgICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfelRYdCwgNCkpCisgICAgICAgICBwbmdfaGFuZGxlX3pUWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAorICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2lUWHQsIDQpKQorICAgICAgICAgcG5nX2hhbmRsZV9pVFh0KHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOworI2VuZGlmCisgICAgICBlbHNlCisgICAgICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7CisgICB9IHdoaWxlICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JRU5EKSk7Cit9CisjZW5kaWYgLyogUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgKi8KKworLyogRnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgdGhlIHJlYWQgKi8KK3ZvaWQgUE5HQVBJCitwbmdfZGVzdHJveV9yZWFkX3N0cnVjdChwbmdfc3RydWN0cHAgcG5nX3B0cl9wdHIsIHBuZ19pbmZvcHAgaW5mb19wdHJfcHRyLAorICAgcG5nX2luZm9wcCBlbmRfaW5mb19wdHJfcHRyKQoreworICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IE5VTEw7CisgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMLCBlbmRfaW5mb19wdHIgPSBOVUxMOworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgIHBuZ19mcmVlX3B0ciBmcmVlX2ZuID0gTlVMTDsKKyAgIHBuZ192b2lkcCBtZW1fcHRyID0gTlVMTDsKKyNlbmRpZgorCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0Iik7CisgCisgICBpZiAocG5nX3B0cl9wdHIgIT0gTlVMTCkKKyAgICAgIHBuZ19wdHIgPSAqcG5nX3B0cl9wdHI7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgZnJlZV9mbiA9IHBuZ19wdHItPmZyZWVfZm47CisgICBtZW1fcHRyID0gcG5nX3B0ci0+bWVtX3B0cjsKKyNlbmRpZgorCisgICBpZiAoaW5mb19wdHJfcHRyICE9IE5VTEwpCisgICAgICBpbmZvX3B0ciA9ICppbmZvX3B0cl9wdHI7CisKKyAgIGlmIChlbmRfaW5mb19wdHJfcHRyICE9IE5VTEwpCisgICAgICBlbmRfaW5mb19wdHIgPSAqZW5kX2luZm9fcHRyX3B0cjsKKworICAgcG5nX3JlYWRfZGVzdHJveShwbmdfcHRyLCBpbmZvX3B0ciwgZW5kX2luZm9fcHRyKTsKKworICAgaWYgKGluZm9fcHRyICE9IE5VTEwpCisgICB7CisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisgICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9URVhULCAtMSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgICAgIHBuZ19kZXN0cm95X3N0cnVjdF8yKChwbmdfdm9pZHApaW5mb19wdHIsIChwbmdfZnJlZV9wdHIpZnJlZV9mbiwKKyAgICAgICAgICAocG5nX3ZvaWRwKW1lbV9wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKWluZm9fcHRyKTsKKyNlbmRpZgorICAgICAgKmluZm9fcHRyX3B0ciA9IE5VTEw7CisgICB9CisKKyAgIGlmIChlbmRfaW5mb19wdHIgIT0gTlVMTCkKKyAgIHsKKyNpZmRlZiBQTkdfUkVBRF9URVhUX1NVUFBPUlRFRAorICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBlbmRfaW5mb19wdHIsIFBOR19GUkVFX1RFWFQsIC0xKTsKKyNlbmRpZgorI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgICAgIHBuZ19kZXN0cm95X3N0cnVjdF8yKChwbmdfdm9pZHApZW5kX2luZm9fcHRyLCAocG5nX2ZyZWVfcHRyKWZyZWVfZm4sCisgICAgICAgICAocG5nX3ZvaWRwKW1lbV9wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKWVuZF9pbmZvX3B0cik7CisjZW5kaWYKKyAgICAgICplbmRfaW5mb19wdHJfcHRyID0gTlVMTDsKKyAgIH0KKworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgIHsKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICAgICBwbmdfZGVzdHJveV9zdHJ1Y3RfMigocG5nX3ZvaWRwKXBuZ19wdHIsIChwbmdfZnJlZV9wdHIpZnJlZV9mbiwKKyAgICAgICAgICAocG5nX3ZvaWRwKW1lbV9wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKXBuZ19wdHIpOworI2VuZGlmCisgICAgICAqcG5nX3B0cl9wdHIgPSBOVUxMOworICAgfQorfQorCisvKiBGcmVlIGFsbCBtZW1vcnkgdXNlZCBieSB0aGUgcmVhZCAob2xkIG1ldGhvZCkgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3JlYWRfZGVzdHJveShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICAgcG5nX2luZm9wIGVuZF9pbmZvX3B0cikKK3sKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgam1wX2J1ZiB0bXBfam1wOworI2VuZGlmCisgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuOworICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuOworICAgcG5nX3ZvaWRwIGVycm9yX3B0cjsKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBwbmdfZnJlZV9wdHIgZnJlZV9mbjsKKyNlbmRpZgorCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX2Rlc3Ryb3kiKTsKKyAKKyAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQorICAgICAgcG5nX2luZm9fZGVzdHJveShwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgIGlmIChlbmRfaW5mb19wdHIgIT0gTlVMTCkKKyAgICAgIHBuZ19pbmZvX2Rlc3Ryb3kocG5nX3B0ciwgZW5kX2luZm9fcHRyKTsKKworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+emJ1Zik7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5iaWdfcm93X2J1Zik7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wcmV2X3Jvdyk7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworI2lmZGVmIFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwKTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmRpdGhlcl9pbmRleCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hX3RhYmxlKTsKKyNlbmRpZgorI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV9mcm9tXzEpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfdG9fMSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5mcmVlX21lICYgUE5HX0ZSRUVfUExURSkKKyAgICAgIHBuZ196ZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wYWxldHRlKTsKKyAgIHBuZ19wdHItPmZyZWVfbWUgJj0gflBOR19GUkVFX1BMVEU7CisjZWxzZQorICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfRlJFRV9QTFRFKQorICAgICAgcG5nX3pmcmVlKHBuZ19wdHIsIHBuZ19wdHItPnBhbGV0dGUpOworICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0ZSRUVfUExURTsKKyNlbmRpZgorI2lmIGRlZmluZWQoUE5HX3RSTlNfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQorI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPmZyZWVfbWUgJiBQTkdfRlJFRV9UUk5TKQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dHJhbnMpOworICAgcG5nX3B0ci0+ZnJlZV9tZSAmPSB+UE5HX0ZSRUVfVFJOUzsKKyNlbHNlCisgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19GUkVFX1RSTlMpCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT50cmFucyk7CisgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfRlJFRV9UUk5TOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPmZyZWVfbWUgJiBQTkdfRlJFRV9ISVNUKQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+aGlzdCk7CisgICBwbmdfcHRyLT5mcmVlX21lICY9IH5QTkdfRlJFRV9ISVNUOworI2Vsc2UKKyAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0ZSRUVfSElTVCkKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmhpc3QpOworICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0ZSRUVfSElTVDsKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGlzdG9wID0gKDEgPDwgKDggLSBwbmdfcHRyLT5nYW1tYV9zaGlmdCkpOworICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyspCisgICAgICB7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZVtpXSk7CisgICAgICB9CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZSk7CisgICB9CisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzEgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGlzdG9wID0gKDEgPDwgKDggLSBwbmdfcHRyLT5nYW1tYV9zaGlmdCkpOworICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyspCisgICAgICB7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzFbaV0pOworICAgICAgfQorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xKTsKKyAgIH0KKyAgIGlmIChwbmdfcHRyLT5nYW1tYV8xNl90b18xICE9IE5VTEwpCisgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBpc3RvcCA9ICgxIDw8ICg4IC0gcG5nX3B0ci0+Z2FtbWFfc2hpZnQpKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVtpXSk7CisgICAgICB9CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl90b18xKTsKKyAgIH0KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnRpbWVfYnVmZmVyKTsKKyNlbmRpZgorCisgICBpbmZsYXRlRW5kKCZwbmdfcHRyLT56c3RyZWFtKTsKKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnNhdmVfYnVmZmVyKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVECisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jdXJyZW50X3RleHQpOworI2VuZGlmIC8qIFBOR19URVhUX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRCAqLworCisgICAvKiBTYXZlIHRoZSBpbXBvcnRhbnQgaW5mbyBvdXQgb2YgdGhlIHBuZ19zdHJ1Y3QsIGluIGNhc2UgaXQgaXMKKyAgICAqIGJlaW5nIHVzZWQgYWdhaW4uCisgICAgKi8KKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgcG5nX21lbWNweSh0bXBfam1wLCBwbmdfcHRyLT5qbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOworI2VuZGlmCisKKyAgIGVycm9yX2ZuID0gcG5nX3B0ci0+ZXJyb3JfZm47CisgICB3YXJuaW5nX2ZuID0gcG5nX3B0ci0+d2FybmluZ19mbjsKKyAgIGVycm9yX3B0ciA9IHBuZ19wdHItPmVycm9yX3B0cjsKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBmcmVlX2ZuID0gcG5nX3B0ci0+ZnJlZV9mbjsKKyNlbmRpZgorCisgICBwbmdfbWVtc2V0KHBuZ19wdHIsIDAsIHBuZ19zaXplb2YocG5nX3N0cnVjdCkpOworCisgICBwbmdfcHRyLT5lcnJvcl9mbiA9IGVycm9yX2ZuOworICAgcG5nX3B0ci0+d2FybmluZ19mbiA9IHdhcm5pbmdfZm47CisgICBwbmdfcHRyLT5lcnJvcl9wdHIgPSBlcnJvcl9wdHI7CisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgcG5nX3B0ci0+ZnJlZV9mbiA9IGZyZWVfZm47CisjZW5kaWYKKworI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisgICBwbmdfbWVtY3B5KHBuZ19wdHItPmptcGJ1ZiwgdG1wX2ptcCwgcG5nX3NpemVvZihqbXBfYnVmKSk7CisjZW5kaWYKKworfQorCit2b2lkIFBOR0FQSQorcG5nX3NldF9yZWFkX3N0YXR1c19mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcmVhZF9zdGF0dXNfcHRyIHJlYWRfcm93X2ZuKQoreworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIHBuZ19wdHItPnJlYWRfcm93X2ZuID0gcmVhZF9yb3dfZm47Cit9CisKKworI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3JlYWRfcG5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2Zvcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHAgcGFyYW1zKQoreworICAgaW50IHJvdzsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECisgICAvKiBJbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgZnJvbSBvcGFjaXR5IHRvIHRyYW5zcGFyZW5jeQorICAgICovCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBKQorICAgICAgIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19wdHIpOworI2VuZGlmCisKKyAgIC8qIHBuZ19yZWFkX2luZm8oKSBnaXZlcyB1cyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlCisgICAgKiBQTkcgZmlsZSBiZWZvcmUgdGhlIGZpcnN0IElEQVQgKGltYWdlIGRhdGEgY2h1bmspLgorICAgICovCisgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKyAgIGlmIChpbmZvX3B0ci0+aGVpZ2h0ID4gUE5HX1VJTlRfMzJfTUFYL3BuZ19zaXplb2YocG5nX2J5dGVwKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW1hZ2UgaXMgdG9vIGhpZ2ggdG8gcHJvY2VzcyB3aXRoIHBuZ19yZWFkX3BuZygpIik7CisKKyAgIC8qIC0tLS0tLS0tLS0tLS0tIGltYWdlIHRyYW5zZm9ybWF0aW9ucyBzdGFydCBoZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECisgICAvKiBUZWxsIGxpYnBuZyB0byBzdHJpcCAxNiBiaXQvY29sb3IgZmlsZXMgZG93biB0byA4IGJpdHMgcGVyIGNvbG9yLgorICAgICovCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYpCisgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKKyAgIC8qIFN0cmlwIGFscGhhIGJ5dGVzIGZyb20gdGhlIGlucHV0IGRhdGEgd2l0aG91dCBjb21iaW5pbmcgd2l0aAorICAgICogdGhlIGJhY2tncm91bmQgKG5vdCByZWNvbW1lbmRlZCkuCisgICAgKi8KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TVFJJUF9BTFBIQSkKKyAgICAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3B0cik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpCisgICAvKiBFeHRyYWN0IG11bHRpcGxlIHBpeGVscyB3aXRoIGJpdCBkZXB0aHMgb2YgMSwgMiwgb3IgNCBmcm9tIGEgc2luZ2xlCisgICAgKiBieXRlIGludG8gc2VwYXJhdGUgYnl0ZXMgKHVzZWZ1bCBmb3IgcGFsZXR0ZWQgYW5kIGdyYXlzY2FsZSBpbWFnZXMpLgorICAgICovCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fUEFDS0lORykKKyAgICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECisgICAvKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIHBhY2tlZCBwaXhlbHMgdG8gbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0CisgICAgKiAobm90IHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIHBuZ19zZXRfcGFja2luZykuCisgICAgKi8KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCkKKyAgICAgIHBuZ19zZXRfcGFja3N3YXAocG5nX3B0cik7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKyAgIC8qIEV4cGFuZCBwYWxldHRlZCBjb2xvcnMgaW50byB0cnVlIFJHQiB0cmlwbGV0cworICAgICogRXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgdG8gZnVsbCA4IGJpdHMgZnJvbSAxLCAyLCBvciA0IGJpdHMvcGl4ZWwKKyAgICAqIEV4cGFuZCBwYWxldHRlZCBvciBSR0IgaW1hZ2VzIHdpdGggdHJhbnNwYXJlbmN5IHRvIGZ1bGwgYWxwaGEKKyAgICAqIGNoYW5uZWxzIHNvIHRoZSBkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIGFzIFJHQkEgcXVhcnRldHMuCisgICAgKi8KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9FWFBBTkQpCisgICAgICBpZiAoKHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpIHx8CisgICAgICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgfHwKKyAgICAgICAgICAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykpKQorICAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7CisjZW5kaWYKKworICAgLyogV2UgZG9uJ3QgaGFuZGxlIGJhY2tncm91bmQgY29sb3Igb3IgZ2FtbWEgdHJhbnNmb3JtYXRpb24gb3IgZGl0aGVyaW5nLgorICAgICovCisKKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVECisgICAvKiBJbnZlcnQgbW9ub2Nocm9tZSBmaWxlcyB0byBoYXZlIDAgYXMgd2hpdGUgYW5kIDEgYXMgYmxhY2sKKyAgICAqLworICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PKQorICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVECisgICAvKiBJZiB5b3Ugd2FudCB0byBzaGlmdCB0aGUgcGl4ZWwgdmFsdWVzIGZyb20gdGhlIHJhbmdlIFswLDI1NV0gb3IKKyAgICAqIFswLDY1NTM1XSB0byB0aGUgb3JpZ2luYWwgWzAsN10gb3IgWzAsMzFdLCBvciB3aGF0ZXZlciByYW5nZSB0aGUKKyAgICAqIGNvbG9ycyB3ZXJlIG9yaWdpbmFsbHkgaW46CisgICAgKi8KKyAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU0hJRlQpCisgICAgICAgJiYgcG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fc0JJVCkpCisgICB7CisgICAgICBwbmdfY29sb3JfOHAgc2lnX2JpdDsKKworICAgICAgcG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7CisgICAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsIHNpZ19iaXQpOworICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9CR1JfU1VQUE9SVEVECisgICAvKiBGbGlwIHRoZSBSR0IgcGl4ZWxzIHRvIEJHUiAob3IgUkdCQSB0byBCR1JBKQorICAgICovCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fQkdSKQorICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVECisgICAvKiBTd2FwIHRoZSBSR0JBIG9yIEdBIGRhdGEgdG8gQVJHQiBvciBBRyAob3IgQkdSQSB0byBBQkdSKQorICAgICovCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSkKKyAgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NXQVBfU1VQUE9SVEVECisgICAvKiBTd2FwIGJ5dGVzIG9mIDE2IGJpdCBmaWxlcyB0byBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgICAgKi8KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TV0FQX0VORElBTikKKyAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKyNlbmRpZgorCisvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjQxICovCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgLyogSW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIGZyb20gb3BhY2l0eSB0byB0cmFuc3BhcmVuY3kKKyAgICAqLworICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSkKKyAgICAgICBwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfcHRyKTsKKyNlbmRpZgorCisvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjQxICovCisjaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisgICAvKiBFeHBhbmQgZ3JheXNjYWxlIGltYWdlIHRvIFJHQgorICAgICovCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fR1JBWV9UT19SR0IpCisgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKKyNlbmRpZgorCisgICAvKiBXZSBkb24ndCBoYW5kbGUgYWRkaW5nIGZpbGxlciBieXRlcyAqLworCisgICAvKiBPcHRpb25hbCBjYWxsIHRvIGdhbW1hIGNvcnJlY3QgYW5kIGFkZCB0aGUgYmFja2dyb3VuZCB0byB0aGUgcGFsZXR0ZQorICAgICogYW5kIHVwZGF0ZSBpbmZvIHN0cnVjdHVyZS4gIFJFUVVJUkVEIGlmIHlvdSBhcmUgZXhwZWN0aW5nIGxpYnBuZyB0bworICAgICogdXBkYXRlIHRoZSBwYWxldHRlIGZvciB5b3UgKGkuZS4sIHlvdSBzZWxlY3RlZCBzdWNoIGEgdHJhbnNmb3JtIGFib3ZlKS4KKyAgICAqLworICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgICAvKiAtLS0tLS0tLS0tLS0tLSBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMgZW5kIGhlcmUgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9ST1dTLCAwKTsKKyNlbmRpZgorICAgaWYgKGluZm9fcHRyLT5yb3dfcG9pbnRlcnMgPT0gTlVMTCkKKyAgIHsKKyAgICAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMgPSAocG5nX2J5dGVwcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICBpbmZvX3B0ci0+aGVpZ2h0ICogcG5nX3NpemVvZihwbmdfYnl0ZXApKTsKKyAgICAgIHBuZ19tZW1zZXQoaW5mb19wdHItPnJvd19wb2ludGVycywgMCwgaW5mb19wdHItPmhlaWdodAorICAgICAgICAgKiBwbmdfc2l6ZW9mKHBuZ19ieXRlcCkpOworCisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICAgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9ST1dTOworI2VuZGlmCisKKyAgICAgIGZvciAocm93ID0gMDsgcm93IDwgKGludClpbmZvX3B0ci0+aGVpZ2h0OyByb3crKykKKyAgICAgICAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnNbcm93XSA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cikpOworICAgfQorCisgICBwbmdfcmVhZF9pbWFnZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19JREFUOworCisgICAvKiBSZWFkIHJlc3Qgb2YgZmlsZSwgYW5kIGdldCBhZGRpdGlvbmFsIGNodW5rcyBpbiBpbmZvX3B0ciAtIFJFUVVJUkVEICovCisgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgaW5mb19wdHIpOworCisgICB0cmFuc2Zvcm1zID0gdHJhbnNmb3JtczsgLyogUXVpZXQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgIHBhcmFtcyA9IHBhcmFtczsKKworfQorI2VuZGlmIC8qIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL3BuZ3Jpby5jIGIvY29tMzIvbGliL2xpYnBuZy9wbmdyaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTc4NjgyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9wbmdyaW8uYwpAQCAtMCwwICsxLDE4MCBAQAorCisvKiBwbmdyaW8uYyAtIGZ1bmN0aW9ucyBmb3IgZGF0YSBpbnB1dAorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjQzIFtGZWJydWFyeSAyNSwgMjAxMF0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGFsbCBpbnB1dC4gIFVzZXJzIHdobyBuZWVkCisgKiBzcGVjaWFsIGhhbmRsaW5nIGFyZSBleHBlY3RlZCB0byB3cml0ZSBhIGZ1bmN0aW9uIHRoYXQgaGFzIHRoZSBzYW1lCisgKiBhcmd1bWVudHMgYXMgdGhpcyBhbmQgcGVyZm9ybXMgYSBzaW1pbGFyIGZ1bmN0aW9uLCBidXQgdGhhdCBwb3NzaWJseQorICogaGFzIGEgZGlmZmVyZW50IGlucHV0IG1ldGhvZC4gIE5vdGUgdGhhdCB5b3Ugc2hvdWxkbid0IGNoYW5nZSB0aGlzCisgKiBmdW5jdGlvbiwgYnV0IHJhdGhlciB3cml0ZSBhIHJlcGxhY2VtZW50IGZ1bmN0aW9uIGFuZCB0aGVuIG1ha2UKKyAqIGxpYnBuZyB1c2UgaXQgYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3JlYWRfZm4oLi4uKS4KKyAqLworCisjZGVmaW5lIFBOR19JTlRFUk5BTAorI2RlZmluZSBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MKKyNpbmNsdWRlICJwbmcuaCIKKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKKworLyogUmVhZCB0aGUgZGF0YSBmcm9tIHdoYXRldmVyIGlucHV0IHlvdSBhcmUgdXNpbmcuICBUaGUgZGVmYXVsdCByb3V0aW5lCisgKiByZWFkcyBmcm9tIGEgZmlsZSBwb2ludGVyLiAgTm90ZSB0aGF0IHRoaXMgcm91dGluZSBzb21ldGltZXMgZ2V0cyBjYWxsZWQKKyAqIHdpdGggdmVyeSBzbWFsbCBsZW5ndGhzLCBzbyB5b3Ugc2hvdWxkIGltcGxlbWVudCBzb21lIGtpbmQgb2Ygc2ltcGxlCisgKiBidWZmZXJpbmcgaWYgeW91IGFyZSB1c2luZyB1bmJ1ZmZlcmVkIHJlYWRzLiAgVGhpcyBzaG91bGQgbmV2ZXIgYmUgYXNrZWQKKyAqIHRvIHJlYWQgbW9yZSB0aGVuIDY0SyBvbiBhIDE2IGJpdCBtYWNoaW5lLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgcG5nX2RlYnVnMSg0LCAicmVhZGluZyAlZCBieXRlcyIsIChpbnQpbGVuZ3RoKTsKKyAKKyAgIGlmIChwbmdfcHRyLT5yZWFkX2RhdGFfZm4gIT0gTlVMTCkKKyAgICAgICgqKHBuZ19wdHItPnJlYWRfZGF0YV9mbikpKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7CisgICBlbHNlCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbGwgdG8gTlVMTCByZWFkIGZ1bmN0aW9uIik7Cit9CisKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisvKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGFjdHVhbCByZWFkaW5nIG9mIGRhdGEuICBJZiB5b3UgYXJlCisgKiBub3QgcmVhZGluZyBmcm9tIGEgc3RhbmRhcmQgQyBzdHJlYW0sIHlvdSBzaG91bGQgY3JlYXRlIGEgcmVwbGFjZW1lbnQKKyAqIHJlYWRfZGF0YSBmdW5jdGlvbiBhbmQgdXNlIGl0IGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF9yZWFkX2ZuKCksIHJhdGhlcgorICogdGhhbiBjaGFuZ2luZyB0aGUgbGlicmFyeS4KKyAqLworI2lmbmRlZiBVU0VfRkFSX0tFWVdPUkQKK3ZvaWQgUE5HQVBJCitwbmdfZGVmYXVsdF9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgcG5nX3NpemVfdCBjaGVjazsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIC8qIGZyZWFkKCkgcmV0dXJucyAwIG9uIGVycm9yLCBzbyBpdCBpcyBPSyB0byBzdG9yZSB0aGlzIGluIGEgcG5nX3NpemVfdAorICAgICogaW5zdGVhZCBvZiBhbiBpbnQsIHdoaWNoIGlzIHdoYXQgZnJlYWQoKSBhY3R1YWxseSByZXR1cm5zLgorICAgICovCisjaWZkZWYgX1dJTjMyX1dDRQorICAgaWYgKCAhUmVhZEZpbGUoKEhBTkRMRSkocG5nX3B0ci0+aW9fcHRyKSwgZGF0YSwgbGVuZ3RoLCAmY2hlY2ssIE5VTEwpICkKKyAgICAgIGNoZWNrID0gMDsKKyNlbHNlCisgICBjaGVjayA9IChwbmdfc2l6ZV90KWZyZWFkKGRhdGEsIChwbmdfc2l6ZV90KTEsIGxlbmd0aCwKKyAgICAgIChwbmdfRklMRV9wKXBuZ19wdHItPmlvX3B0cik7CisjZW5kaWYKKworICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUmVhZCBFcnJvciIpOworfQorI2Vsc2UKKy8qIFRoaXMgaXMgdGhlIG1vZGVsLWluZGVwZW5kZW50IHZlcnNpb24uIFNpbmNlIHRoZSBzdGFuZGFyZCBJL08gbGlicmFyeQorICAgY2FuJ3QgaGFuZGxlIGZhciBidWZmZXJzIGluIHRoZSBtZWRpdW0gYW5kIHNtYWxsIG1vZGVscywgd2UgaGF2ZSB0byBjb3B5CisgICB0aGUgZGF0YS4KKyovCisKKyNkZWZpbmUgTkVBUl9CVUZfU0laRSAxMDI0CisjZGVmaW5lIE1JTihhLGIpIChhIDw9IGIgPyBhIDogYikKKworc3RhdGljIHZvaWQgUE5HQVBJCitwbmdfZGVmYXVsdF9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgaW50IGNoZWNrOworICAgcG5nX2J5dGUgKm5fZGF0YTsKKyAgIHBuZ19GSUxFX3AgaW9fcHRyOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgLyogQ2hlY2sgaWYgZGF0YSByZWFsbHkgaXMgbmVhci4gSWYgc28sIHVzZSB1c3VhbCBjb2RlLiAqLworICAgbl9kYXRhID0gKHBuZ19ieXRlICopQ1ZUX1BUUl9OT0NIRUNLKGRhdGEpOworICAgaW9fcHRyID0gKHBuZ19GSUxFX3ApQ1ZUX1BUUihwbmdfcHRyLT5pb19wdHIpOworICAgaWYgKChwbmdfYnl0ZXApbl9kYXRhID09IGRhdGEpCisgICB7CisjaWZkZWYgX1dJTjMyX1dDRQorICAgICAgaWYgKCAhUmVhZEZpbGUoKEhBTkRMRSkocG5nX3B0ci0+aW9fcHRyKSwgZGF0YSwgbGVuZ3RoLCAmY2hlY2ssCisgICAgICAgICAgTlVMTCkgKQorICAgICAgICAgY2hlY2sgPSAwOworI2Vsc2UKKyAgICAgIGNoZWNrID0gZnJlYWQobl9kYXRhLCAxLCBsZW5ndGgsIGlvX3B0cik7CisjZW5kaWYKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBuZ19ieXRlIGJ1ZltORUFSX0JVRl9TSVpFXTsKKyAgICAgIHBuZ19zaXplX3QgcmVhZCwgcmVtYWluaW5nLCBlcnI7CisgICAgICBjaGVjayA9IDA7CisgICAgICByZW1haW5pbmcgPSBsZW5ndGg7CisgICAgICBkbworICAgICAgeworICAgICAgICAgcmVhZCA9IE1JTihORUFSX0JVRl9TSVpFLCByZW1haW5pbmcpOworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgICAgICAgIGlmICggIVJlYWRGaWxlKChIQU5ETEUpKGlvX3B0ciksIGJ1ZiwgcmVhZCwgJmVyciwgTlVMTCkgKQorICAgICAgICAgICAgZXJyID0gMDsKKyNlbHNlCisgICAgICAgICBlcnIgPSBmcmVhZChidWYsIChwbmdfc2l6ZV90KTEsIHJlYWQsIGlvX3B0cik7CisjZW5kaWYKKyAgICAgICAgIHBuZ19tZW1jcHkoZGF0YSwgYnVmLCByZWFkKTsgLyogY29weSBmYXIgYnVmZmVyIHRvIG5lYXIgYnVmZmVyICovCisgICAgICAgICBpZiAoZXJyICE9IHJlYWQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoZWNrICs9IGVycjsKKyAgICAgICAgIGRhdGEgKz0gcmVhZDsKKyAgICAgICAgIHJlbWFpbmluZyAtPSByZWFkOworICAgICAgfQorICAgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKTsKKyAgIH0KKyAgIGlmICgocG5nX3VpbnRfMzIpY2hlY2sgIT0gKHBuZ191aW50XzMyKWxlbmd0aCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmVhZCBFcnJvciIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHN1cHBseSBhIG5ldyBpbnB1dCBmdW5jdGlvbgorICogZm9yIGxpYnBuZyBpZiBzdGFuZGFyZCBDIHN0cmVhbXMgYXJlbid0IGJlaW5nIHVzZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBpdHMgYXJndW1lbnRzOgorICogcG5nX3B0ciAgICAgIC0gcG9pbnRlciB0byBhIHBuZyBpbnB1dCBkYXRhIHN0cnVjdHVyZQorICogaW9fcHRyICAgICAgIC0gcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQKKyAqICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBmdW5jdGlvbnMuICBNYXkgYmUgTlVMTC4KKyAqIHJlYWRfZGF0YV9mbiAtIHBvaW50ZXIgdG8gYSBuZXcgaW5wdXQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhcyBpdHMKKyAqICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBhIHBvaW50ZXIgdG8gYSBwbmdfc3RydWN0LCBhIHBvaW50ZXIgdG8KKyAqICAgICAgICAgICAgICAgIGEgbG9jYXRpb24gd2hlcmUgaW5wdXQgZGF0YSBjYW4gYmUgc3RvcmVkLCBhbmQgYSAzMi1iaXQKKyAqICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aGF0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKyAqICAgICAgICAgICAgICAgIFRvIGV4aXQgYW5kIG91dHB1dCBhbnkgZmF0YWwgZXJyb3IgbWVzc2FnZXMgdGhlIG5ldyB3cml0ZQorICogICAgICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGNhbGwgcG5nX2Vycm9yKHBuZ19wdHIsICJFcnJvciBtc2ciKS4KKyAqICAgICAgICAgICAgICAgIE1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGxpYnBuZydzIGRlZmF1bHQgZnVuY3Rpb24gd2lsbAorICogICAgICAgICAgICAgICAgYmUgdXNlZC4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfcmVhZF9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLAorICAgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcG5nX3B0ci0+aW9fcHRyID0gaW9fcHRyOworCisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorICAgaWYgKHJlYWRfZGF0YV9mbiAhPSBOVUxMKQorICAgICAgcG5nX3B0ci0+cmVhZF9kYXRhX2ZuID0gcmVhZF9kYXRhX2ZuOworICAgZWxzZQorICAgICAgcG5nX3B0ci0+cmVhZF9kYXRhX2ZuID0gcG5nX2RlZmF1bHRfcmVhZF9kYXRhOworI2Vsc2UKKyAgIHBuZ19wdHItPnJlYWRfZGF0YV9mbiA9IHJlYWRfZGF0YV9mbjsKKyNlbmRpZgorCisgICAvKiBJdCBpcyBhbiBlcnJvciB0byB3cml0ZSB0byBhIHJlYWQgZGV2aWNlICovCisgICBpZiAocG5nX3B0ci0+d3JpdGVfZGF0YV9mbiAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3B0ci0+d3JpdGVfZGF0YV9mbiA9IE5VTEw7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgIkl0J3MgYW4gZXJyb3IgdG8gc2V0IGJvdGggcmVhZF9kYXRhX2ZuIGFuZCB3cml0ZV9kYXRhX2ZuIGluIHRoZSAiKTsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAic2FtZSBzdHJ1Y3R1cmUuICBSZXNldHRpbmcgd3JpdGVfZGF0YV9mbiB0byBOVUxMLiIpOworICAgfQorCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorICAgcG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuID0gTlVMTDsKKyNlbmRpZgorfQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9wbmdydHJhbi5jIGIvY29tMzIvbGliL2xpYnBuZy9wbmdydHJhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMWFhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGlicG5nL3BuZ3J0cmFuLmMKQEAgLTAsMCArMSw0NDU3IEBACisKKy8qIHBuZ3J0cmFuLmMgLSB0cmFuc2Zvcm1zIHRoZSBkYXRhIGluIGEgcm93IGZvciBQTkcgcmVhZGVycworICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjQzIFtGZWJydWFyeSAyNSwgMjAxMF0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBvcHRpb25hbGx5IGNhbGxlZCBieSBhbiBhcHBsaWNhdGlvbgorICogaW4gb3JkZXIgdG8gdGVsbCBsaWJwbmcgaG93IHRvIGhhbmRsZSBkYXRhIHdoZW4gcmVhZGluZyBhIFBORy4KKyAqIFRyYW5zZm9ybWF0aW9ucyB0aGF0IGFyZSB1c2VkIGluIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBhcmUKKyAqIGluIHBuZ3RyYW5zLmMuCisgKi8KKworI2RlZmluZSBQTkdfSU5URVJOQUwKKyNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCisjaW5jbHVkZSAicG5nLmgiCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisKKy8qIFNldCB0aGUgYWN0aW9uIG9uIGdldHRpbmcgYSBDUkMgZXJyb3IgZm9yIGFuIGFuY2lsbGFyeSBvciBjcml0aWNhbCBjaHVuay4gKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NyY19hY3Rpb24ocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGNyaXRfYWN0aW9uLCBpbnQgYW5jaWxfYWN0aW9uKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2NyY19hY3Rpb24iKTsKKyAKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIFRlbGwgbGlicG5nIGhvdyB3ZSByZWFjdCB0byBDUkMgZXJyb3JzIGluIGNyaXRpY2FsIGNodW5rcyAqLworICAgc3dpdGNoIChjcml0X2FjdGlvbikKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0NSQ19OT19DSEFOR0U6ICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVhdmUgc2V0dGluZyBhcyBpcyAqLworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NSQ19XQVJOX1VTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2Fybi91c2UgZGF0YSAqLworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLOworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX1VTRTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DUkNfUVVJRVRfVVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUXVpZXQvdXNlIGRhdGEgKi8KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19DUkNfQ1JJVElDQUxfTUFTSzsKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19DUklUSUNBTF9VU0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX0lHTk9SRTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DUkNfV0FSTl9ESVNDQVJEOiAgICAvKiBOb3QgYSB2YWxpZCBhY3Rpb24gZm9yIGNyaXRpY2FsIGRhdGEgKi8KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICAiQ2FuJ3QgZGlzY2FyZCBjcml0aWNhbCBkYXRhIG9uIENSQyBlcnJvci4iKTsKKyAgICAgIGNhc2UgUE5HX0NSQ19FUlJPUl9RVUlUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IvcXVpdCAqLworCisgICAgICBjYXNlIFBOR19DUkNfREVGQVVMVDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX01BU0s7CisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgLyogVGVsbCBsaWJwbmcgaG93IHdlIHJlYWN0IHRvIENSQyBlcnJvcnMgaW4gYW5jaWxsYXJ5IGNodW5rcyAqLworICAgc3dpdGNoIChhbmNpbF9hY3Rpb24pCisgICB7CisgICAgICBjYXNlIFBOR19DUkNfTk9fQ0hBTkdFOiAgICAgICAgICAgICAgICAgICAgICAgLyogTGVhdmUgc2V0dGluZyBhcyBpcyAqLworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NSQ19XQVJOX1VTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYXJuL3VzZSBkYXRhICovCisgICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLOworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0U7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfQ1JDX1FVSUVUX1VTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUXVpZXQvdXNlIGRhdGEgKi8KKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0s7CisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTjsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DUkNfRVJST1JfUVVJVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IvcXVpdCAqLworICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSzsKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUE5HX0NSQ19XQVJOX0RJU0NBUkQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFdhcm4vZGlzY2FyZCBkYXRhICovCisKKyAgICAgIGNhc2UgUE5HX0NSQ19ERUZBVUxUOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0s7CisgICAgICAgICBicmVhazsKKyAgIH0KK30KKworI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpICYmIFwKKyAgICBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCisvKiBIYW5kbGUgYWxwaGEgYW5kIHRSTlMgdmlhIGEgYmFja2dyb3VuZCBjb2xvciAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfYmFja2dyb3VuZChwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kX2NvbG9yLCBpbnQgYmFja2dyb3VuZF9nYW1tYV9jb2RlLAorICAgaW50IG5lZWRfZXhwYW5kLCBkb3VibGUgYmFja2dyb3VuZF9nYW1tYSkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9iYWNrZ3JvdW5kIik7CisgCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgaWYgKGJhY2tncm91bmRfZ2FtbWFfY29kZSA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTktOT1dOKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkFwcGxpY2F0aW9uIG11c3Qgc3VwcGx5IGEga25vd24gYmFja2dyb3VuZCBnYW1tYSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0JBQ0tHUk9VTkQ7CisgICBwbmdfbWVtY3B5KCYocG5nX3B0ci0+YmFja2dyb3VuZCksIGJhY2tncm91bmRfY29sb3IsCisgICAgICBwbmdfc2l6ZW9mKHBuZ19jb2xvcl8xNikpOworICAgcG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSA9IChmbG9hdCliYWNrZ3JvdW5kX2dhbW1hOworICAgcG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kX2dhbW1hX2NvZGUpOworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IChuZWVkX2V4cGFuZCA/IFBOR19CQUNLR1JPVU5EX0VYUEFORCA6IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAorLyogU3RyaXAgMTYgYml0IGRlcHRoIGZpbGVzIHRvIDggYml0IGRlcHRoICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9zdHJpcF8xNihwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3N0cmlwXzE2Iik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HXzE2X1RPXzg7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zdHJpcF9hbHBoYSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfU1RSSVBfQUxQSEE7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQKKy8qIERpdGhlciBmaWxlIHRvIDggYml0LiAgU3VwcGx5IGEgcGFsZXR0ZSwgdGhlIGN1cnJlbnQgbnVtYmVyCisgKiBvZiBlbGVtZW50cyBpbiB0aGUgcGFsZXR0ZSwgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzCisgKiBhbGxvd2VkLCBhbmQgYSBoaXN0b2dyYW0gaWYgcG9zc2libGUuICBJZiB0aGUgY3VycmVudCBudW1iZXIKKyAqIG9mIGNvbG9ycyBpcyBncmVhdGVyIHRoZW4gdGhlIG1heGltdW0gbnVtYmVyLCB0aGUgcGFsZXR0ZSB3aWxsIGJlCisgKiBtb2RpZmllZCB0byBmaXQgaW4gdGhlIG1heGltdW0gbnVtYmVyLiAgImZ1bGxfZGl0aGVyIiBpbmRpY2F0ZXMKKyAqIHdoZXRoZXIgd2UgbmVlZCBhIGRpdGhlcmluZyBjdWJlIHNldCB1cCBmb3IgUkdCIGltYWdlcywgb3IgaWYgd2UKKyAqIHNpbXBseSBhcmUgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBjb2xvcnMgaW4gYSBwYWxldHRlZCBpbWFnZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBwbmdfZHNvcnRfc3RydWN0Cit7CisgICBzdHJ1Y3QgcG5nX2Rzb3J0X3N0cnVjdCBGQVIgKiBuZXh0OworICAgcG5nX2J5dGUgbGVmdDsKKyAgIHBuZ19ieXRlIHJpZ2h0OworfSBwbmdfZHNvcnQ7Cit0eXBlZGVmIHBuZ19kc29ydCBGQVIgKiAgICAgICBwbmdfZHNvcnRwOwordHlwZWRlZiBwbmdfZHNvcnQgRkFSICogRkFSICogcG5nX2Rzb3J0cHA7CisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2RpdGhlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29sb3JwIHBhbGV0dGUsCisgICBpbnQgbnVtX3BhbGV0dGUsIGludCBtYXhpbXVtX2NvbG9ycywgcG5nX3VpbnRfMTZwIGhpc3RvZ3JhbSwKKyAgIGludCBmdWxsX2RpdGhlcikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9kaXRoZXIiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfRElUSEVSOworCisgICBpZiAoIWZ1bGxfZGl0aGVyKQorICAgeworICAgICAgaW50IGk7CisKKyAgICAgIHBuZ19wdHItPmRpdGhlcl9pbmRleCA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgKHBuZ191aW50XzMyKShudW1fcGFsZXR0ZSAqIHBuZ19zaXplb2YocG5nX2J5dGUpKSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykKKyAgICAgICAgIHBuZ19wdHItPmRpdGhlcl9pbmRleFtpXSA9IChwbmdfYnl0ZSlpOworICAgfQorCisgICBpZiAobnVtX3BhbGV0dGUgPiBtYXhpbXVtX2NvbG9ycykKKyAgIHsKKyAgICAgIGlmIChoaXN0b2dyYW0gIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoaXMgaXMgZWFzeSBlbm91Z2gsIGp1c3QgdGhyb3cgb3V0IHRoZSBsZWFzdCB1c2VkIGNvbG9ycy4KKyAgICAgICAgICAqIFBlcmhhcHMgbm90IHRoZSBiZXN0IHNvbHV0aW9uLCBidXQgZ29vZCBlbm91Z2guCisgICAgICAgICAgKi8KKworICAgICAgICAgaW50IGk7CisKKyAgICAgICAgIC8qIEluaXRpYWxpemUgYW4gYXJyYXkgdG8gc29ydCBjb2xvcnMgKi8KKyAgICAgICAgIHBuZ19wdHItPmRpdGhlcl9zb3J0ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAocG5nX3VpbnRfMzIpKG51bV9wYWxldHRlICogcG5nX3NpemVvZihwbmdfYnl0ZSkpKTsKKworICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGl0aGVyX3NvcnQgYXJyYXkgKi8KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQorICAgICAgICAgICAgcG5nX3B0ci0+ZGl0aGVyX3NvcnRbaV0gPSAocG5nX2J5dGUpaTsKKworICAgICAgICAgLyogRmluZCB0aGUgbGVhc3QgdXNlZCBwYWxldHRlIGVudHJpZXMgYnkgc3RhcnRpbmcgYQorICAgICAgICAgICogYnViYmxlIHNvcnQsIGFuZCBydW5uaW5nIGl0IHVudGlsIHdlIGhhdmUgc29ydGVkCisgICAgICAgICAgKiBvdXQgZW5vdWdoIGNvbG9ycy4gIE5vdGUgdGhhdCB3ZSBkb24ndCBjYXJlIGFib3V0CisgICAgICAgICAgKiBzb3J0aW5nIGFsbCB0aGUgY29sb3JzLCBqdXN0IGZpbmRpbmcgd2hpY2ggYXJlCisgICAgICAgICAgKiBsZWFzdCB1c2VkLgorICAgICAgICAgICovCisKKyAgICAgICAgIGZvciAoaSA9IG51bV9wYWxldHRlIC0gMTsgaSA+PSBtYXhpbXVtX2NvbG9yczsgaS0tKQorICAgICAgICAgeworICAgICAgICAgICAgaW50IGRvbmU7IC8qIFRvIHN0b3AgZWFybHkgaWYgdGhlIGxpc3QgaXMgcHJlLXNvcnRlZCAqLworICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChoaXN0b2dyYW1bcG5nX3B0ci0+ZGl0aGVyX3NvcnRbal1dCisgICAgICAgICAgICAgICAgICAgPCBoaXN0b2dyYW1bcG5nX3B0ci0+ZGl0aGVyX3NvcnRbaiArIDFdXSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHQ7CisKKyAgICAgICAgICAgICAgICAgIHQgPSBwbmdfcHRyLT5kaXRoZXJfc29ydFtqXTsKKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmRpdGhlcl9zb3J0W2pdID0gcG5nX3B0ci0+ZGl0aGVyX3NvcnRbaiArIDFdOworICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+ZGl0aGVyX3NvcnRbaiArIDFdID0gdDsKKyAgICAgICAgICAgICAgICAgIGRvbmUgPSAwOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogU3dhcCB0aGUgcGFsZXR0ZSBhcm91bmQsIGFuZCBzZXQgdXAgYSB0YWJsZSwgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICBpZiAoZnVsbF9kaXRoZXIpCisgICAgICAgICB7CisgICAgICAgICAgICBpbnQgaiA9IG51bV9wYWxldHRlOworCisgICAgICAgICAgICAvKiBQdXQgYWxsIHRoZSB1c2VmdWwgY29sb3JzIHdpdGhpbiB0aGUgbWF4LCBidXQgZG9uJ3QKKyAgICAgICAgICAgICAqIG1vdmUgdGhlIG90aGVycy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heGltdW1fY29sb3JzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoKGludClwbmdfcHRyLT5kaXRoZXJfc29ydFtpXSA+PSBtYXhpbXVtX2NvbG9ycykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgICB3aGlsZSAoKGludClwbmdfcHRyLT5kaXRoZXJfc29ydFtqXSA+PSBtYXhpbXVtX2NvbG9ycyk7CisgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldID0gcGFsZXR0ZVtqXTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBqID0gbnVtX3BhbGV0dGU7CisKKyAgICAgICAgICAgIC8qIE1vdmUgYWxsIHRoZSB1c2VkIGNvbG9ycyBpbnNpZGUgdGhlIG1heCBsaW1pdCwgYW5kCisgICAgICAgICAgICAgKiBkZXZlbG9wIGEgdHJhbnNsYXRpb24gdGFibGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhpbXVtX2NvbG9yczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogT25seSBtb3ZlIHRoZSBjb2xvcnMgd2UgbmVlZCB0byAqLworICAgICAgICAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+ZGl0aGVyX3NvcnRbaV0gPj0gbWF4aW11bV9jb2xvcnMpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfY29sb3IgdG1wX2NvbG9yOworCisgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgICAgd2hpbGUgKChpbnQpcG5nX3B0ci0+ZGl0aGVyX3NvcnRbal0gPj0gbWF4aW11bV9jb2xvcnMpOworCisgICAgICAgICAgICAgICAgICB0bXBfY29sb3IgPSBwYWxldHRlW2pdOworICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtqXSA9IHBhbGV0dGVbaV07CisgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldID0gdG1wX2NvbG9yOworICAgICAgICAgICAgICAgICAgLyogSW5kaWNhdGUgd2hlcmUgdGhlIGNvbG9yIHdlbnQgKi8KKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmRpdGhlcl9pbmRleFtqXSA9IChwbmdfYnl0ZSlpOworICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+ZGl0aGVyX2luZGV4W2ldID0gKHBuZ19ieXRlKWo7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEZpbmQgY2xvc2VzdCBjb2xvciBmb3IgdGhvc2UgY29sb3JzIHdlIGFyZSBub3QgdXNpbmcgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+ZGl0aGVyX2luZGV4W2ldID49IG1heGltdW1fY29sb3JzKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50IG1pbl9kLCBrLCBtaW5faywgZF9pbmRleDsKKworICAgICAgICAgICAgICAgICAgLyogRmluZCB0aGUgY2xvc2VzdCBjb2xvciB0byBvbmUgd2UgdGhyZXcgb3V0ICovCisgICAgICAgICAgICAgICAgICBkX2luZGV4ID0gcG5nX3B0ci0+ZGl0aGVyX2luZGV4W2ldOworICAgICAgICAgICAgICAgICAgbWluX2QgPSBQTkdfQ09MT1JfRElTVChwYWxldHRlW2RfaW5kZXhdLCBwYWxldHRlWzBdKTsKKyAgICAgICAgICAgICAgICAgIGZvciAoayA9IDEsIG1pbl9rID0gMDsgayA8IG1heGltdW1fY29sb3JzOyBrKyspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpbnQgZDsKKworICAgICAgICAgICAgICAgICAgICAgZCA9IFBOR19DT0xPUl9ESVNUKHBhbGV0dGVbZF9pbmRleF0sIHBhbGV0dGVba10pOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IG1pbl9kKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluX2QgPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgbWluX2sgPSBrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gY2xvc2VzdCBjb2xvciAqLworICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+ZGl0aGVyX2luZGV4W2ldID0gKHBuZ19ieXRlKW1pbl9rOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+ZGl0aGVyX3NvcnQpOworICAgICAgICAgcG5nX3B0ci0+ZGl0aGVyX3NvcnQgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogVGhpcyBpcyBtdWNoIGhhcmRlciB0byBkbyBzaW1wbHkgKGFuZCBxdWlja2x5KS4gIFBlcmhhcHMKKyAgICAgICAgICAqIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCBhIG1lZGlhbiBjdXQgcm91dGluZSwgYnV0IHRob3NlCisgICAgICAgICAgKiBkb24ndCBhbHdheXMgYmVoYXZlIHRoZW1zZWx2ZXMgd2l0aCBvbmx5IGEgZmV3IGNvbG9ycworICAgICAgICAgICogYXMgaW5wdXQuICBTbyB3ZSB3aWxsIGp1c3QgZmluZCB0aGUgY2xvc2VzdCB0d28gY29sb3JzLAorICAgICAgICAgICogYW5kIHRocm93IG91dCBvbmUgb2YgdGhlbSAoY2hvc2VuIHNvbWV3aGF0IHJhbmRvbWx5KS4KKyAgICAgICAgICAqIFtXZSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgYXQgYWxsLCBzbyBpZiBzb21lb25lIHdhbnRzIHRvCisgICAgICAgICAgKiAgd29yayBvbiBpbXByb3ZpbmcgaXQsIGJlIG91ciBndWVzdCAtIEFFRCwgR1JQXQorICAgICAgICAgICovCisgICAgICAgICBpbnQgaTsKKyAgICAgICAgIGludCBtYXhfZDsKKyAgICAgICAgIGludCBudW1fbmV3X3BhbGV0dGU7CisgICAgICAgICBwbmdfZHNvcnRwIHQ7CisgICAgICAgICBwbmdfZHNvcnRwcCBoYXNoOworCisgICAgICAgICB0ID0gTlVMTDsKKworICAgICAgICAgLyogSW5pdGlhbGl6ZSBwYWxldHRlIGluZGV4IGFycmF5cyAqLworICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZSA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgKHBuZ191aW50XzMyKShudW1fcGFsZXR0ZSAqIHBuZ19zaXplb2YocG5nX2J5dGUpKSk7CisgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAocG5nX3VpbnRfMzIpKG51bV9wYWxldHRlICogcG5nX3NpemVvZihwbmdfYnl0ZSkpKTsKKworICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgc29ydCBhcnJheSAqLworICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2ldID0gKHBuZ19ieXRlKWk7CisgICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4W2ldID0gKHBuZ19ieXRlKWk7CisgICAgICAgICB9CisKKyAgICAgICAgIGhhc2ggPSAocG5nX2Rzb3J0cHApcG5nX2NhbGxvYyhwbmdfcHRyLCAocG5nX3VpbnRfMzIpKDc2OSAqCisgICAgICAgICAgICBwbmdfc2l6ZW9mKHBuZ19kc29ydHApKSk7CisKKyAgICAgICAgIG51bV9uZXdfcGFsZXR0ZSA9IG51bV9wYWxldHRlOworCisgICAgICAgICAvKiBJbml0aWFsIHdpbGQgZ3Vlc3MgYXQgaG93IGZhciBhcGFydCB0aGUgZmFydGhlc3QgcGl4ZWwKKyAgICAgICAgICAqIHBhaXIgd2Ugd2lsbCBiZSBlbGltaW5hdGluZyB3aWxsIGJlLiAgTGFyZ2VyCisgICAgICAgICAgKiBudW1iZXJzIG1lYW4gbW9yZSBhcmVhcyB3aWxsIGJlIGFsbG9jYXRlZCwgU21hbGxlcgorICAgICAgICAgICogbnVtYmVycyBydW4gdGhlIHJpc2sgb2Ygbm90IHNhdmluZyBlbm91Z2ggZGF0YSwgYW5kCisgICAgICAgICAgKiBoYXZpbmcgdG8gZG8gdGhpcyBhbGwgb3ZlciBhZ2Fpbi4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBJIGhhdmUgbm90IGRvbmUgZXh0ZW5zaXZlIGNoZWNraW5nIG9uIHRoaXMgbnVtYmVyLgorICAgICAgICAgICovCisgICAgICAgICBtYXhfZCA9IDk2OworCisgICAgICAgICB3aGlsZSAobnVtX25ld19wYWxldHRlID4gbWF4aW11bV9jb2xvcnMpCisgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX25ld19wYWxldHRlIC0gMTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbnVtX25ld19wYWxldHRlOyBqKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbnQgZDsKKworICAgICAgICAgICAgICAgICAgZCA9IFBOR19DT0xPUl9ESVNUKHBhbGV0dGVbaV0sIHBhbGV0dGVbal0pOworCisgICAgICAgICAgICAgICAgICBpZiAoZCA8PSBtYXhfZCkKKyAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgdCA9IChwbmdfZHNvcnRwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3NpemVvZihwbmdfZHNvcnQpKSk7CisgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgdC0+bmV4dCA9IGhhc2hbZF07CisgICAgICAgICAgICAgICAgICAgICB0LT5sZWZ0ID0gKHBuZ19ieXRlKWk7CisgICAgICAgICAgICAgICAgICAgICB0LT5yaWdodCA9IChwbmdfYnl0ZSlqOworICAgICAgICAgICAgICAgICAgICAgaGFzaFtkXSA9IHQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0ICE9IE5VTEwpCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1heF9kOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoaGFzaFtpXSAhPSBOVUxMKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX2Rzb3J0cCBwOworCisgICAgICAgICAgICAgICAgICBmb3IgKHAgPSBoYXNoW2ldOyBwOyBwID0gcC0+bmV4dCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KXBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbcC0+bGVmdF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwgbnVtX25ld19wYWxldHRlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbcC0+cmlnaHRdCisgICAgICAgICAgICAgICAgICAgICAgICA8IG51bV9uZXdfcGFsZXR0ZSkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBqLCBuZXh0X2o7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1fbmV3X3BhbGV0dGUgJiAweDAxKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IHAtPmxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2ogPSBwLT5yaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBwLT5yaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfaiA9IHAtPmxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9uZXdfcGFsZXR0ZS0tOworICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdXQorICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBhbGV0dGVbbnVtX25ld19wYWxldHRlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnVsbF9kaXRoZXIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bV9wYWxldHRlOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+ZGl0aGVyX2luZGV4W2tdID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+ZGl0aGVyX2luZGV4W2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbbmV4dF9qXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KXBuZ19wdHItPmRpdGhlcl9pbmRleFtrXSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX25ld19wYWxldHRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+ZGl0aGVyX2luZGV4W2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW251bV9uZXdfcGFsZXR0ZV1dID0gcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfdG9faW5kZXhbcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtqXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtudW1fbmV3X3BhbGV0dGVdOworCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG5nX2J5dGUpbnVtX25ld19wYWxldHRlOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtudW1fbmV3X3BhbGV0dGVdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG5nX2J5dGUpajsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmIChudW1fbmV3X3BhbGV0dGUgPD0gbWF4aW11bV9jb2xvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChudW1fbmV3X3BhbGV0dGUgPD0gbWF4aW11bV9jb2xvcnMpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc2OTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGhhc2hbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19kc29ydHAgcCA9IGhhc2hbaV07CisgICAgICAgICAgICAgICAgICB3aGlsZSAocCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHQgPSBwLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcCk7CisgICAgICAgICAgICAgICAgICAgICBwID0gdDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGhhc2hbaV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4X2QgKz0gOTY7CisgICAgICAgICB9CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBoYXNoKTsKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnBhbGV0dGVfdG9faW5kZXgpOworICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZSk7CisgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4ID0gTlVMTDsKKyAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGUgPSBOVUxMOworICAgICAgfQorICAgICAgbnVtX3BhbGV0dGUgPSBtYXhpbXVtX2NvbG9yczsKKyAgIH0KKyAgIGlmIChwbmdfcHRyLT5wYWxldHRlID09IE5VTEwpCisgICB7CisgICAgICBwbmdfcHRyLT5wYWxldHRlID0gcGFsZXR0ZTsKKyAgIH0KKyAgIHBuZ19wdHItPm51bV9wYWxldHRlID0gKHBuZ191aW50XzE2KW51bV9wYWxldHRlOworCisgICBpZiAoZnVsbF9kaXRoZXIpCisgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHBuZ19ieXRlcCBkaXN0YW5jZTsKKyAgICAgIGludCB0b3RhbF9iaXRzID0gUE5HX0RJVEhFUl9SRURfQklUUyArIFBOR19ESVRIRVJfR1JFRU5fQklUUyArCisgICAgICAgICBQTkdfRElUSEVSX0JMVUVfQklUUzsKKyAgICAgIGludCBudW1fcmVkID0gKDEgPDwgUE5HX0RJVEhFUl9SRURfQklUUyk7CisgICAgICBpbnQgbnVtX2dyZWVuID0gKDEgPDwgUE5HX0RJVEhFUl9HUkVFTl9CSVRTKTsKKyAgICAgIGludCBudW1fYmx1ZSA9ICgxIDw8IFBOR19ESVRIRVJfQkxVRV9CSVRTKTsKKyAgICAgIHBuZ19zaXplX3QgbnVtX2VudHJpZXMgPSAoKHBuZ19zaXplX3QpMSA8PCB0b3RhbF9iaXRzKTsKKworICAgICAgcG5nX3B0ci0+cGFsZXR0ZV9sb29rdXAgPSAocG5nX2J5dGVwIClwbmdfY2FsbG9jKHBuZ19wdHIsCisgICAgICAgICAocG5nX3VpbnRfMzIpKG51bV9lbnRyaWVzICogcG5nX3NpemVvZihwbmdfYnl0ZSkpKTsKKworICAgICAgZGlzdGFuY2UgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwgKHBuZ191aW50XzMyKShudW1fZW50cmllcyAqCisgICAgICAgICBwbmdfc2l6ZW9mKHBuZ19ieXRlKSkpOworICAgICAgcG5nX21lbXNldChkaXN0YW5jZSwgMHhmZiwgbnVtX2VudHJpZXMgKiBwbmdfc2l6ZW9mKHBuZ19ieXRlKSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQorICAgICAgeworICAgICAgICAgaW50IGlyLCBpZywgaWI7CisgICAgICAgICBpbnQgciA9IChwYWxldHRlW2ldLnJlZCA+PiAoOCAtIFBOR19ESVRIRVJfUkVEX0JJVFMpKTsKKyAgICAgICAgIGludCBnID0gKHBhbGV0dGVbaV0uZ3JlZW4gPj4gKDggLSBQTkdfRElUSEVSX0dSRUVOX0JJVFMpKTsKKyAgICAgICAgIGludCBiID0gKHBhbGV0dGVbaV0uYmx1ZSA+PiAoOCAtIFBOR19ESVRIRVJfQkxVRV9CSVRTKSk7CisKKyAgICAgICAgIGZvciAoaXIgPSAwOyBpciA8IG51bV9yZWQ7IGlyKyspCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBpbnQgZHIgPSBhYnMoaXIgLSByKTsgKi8KKyAgICAgICAgICAgIGludCBkciA9ICgoaXIgPiByKSA/IGlyIC0gciA6IHIgLSBpcik7CisgICAgICAgICAgICBpbnQgaW5kZXhfciA9IChpciA8PCAoUE5HX0RJVEhFUl9CTFVFX0JJVFMgKworICAgICAgICAgICAgICAgIFBOR19ESVRIRVJfR1JFRU5fQklUUykpOworCisgICAgICAgICAgICBmb3IgKGlnID0gMDsgaWcgPCBudW1fZ3JlZW47IGlnKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBpbnQgZGcgPSBhYnMoaWcgLSBnKTsgKi8KKyAgICAgICAgICAgICAgIGludCBkZyA9ICgoaWcgPiBnKSA/IGlnIC0gZyA6IGcgLSBpZyk7CisgICAgICAgICAgICAgICBpbnQgZHQgPSBkciArIGRnOworICAgICAgICAgICAgICAgaW50IGRtID0gKChkciA+IGRnKSA/IGRyIDogZGcpOworICAgICAgICAgICAgICAgaW50IGluZGV4X2cgPSBpbmRleF9yIHwgKGlnIDw8IFBOR19ESVRIRVJfQkxVRV9CSVRTKTsKKworICAgICAgICAgICAgICAgZm9yIChpYiA9IDA7IGliIDwgbnVtX2JsdWU7IGliKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbnQgZF9pbmRleCA9IGluZGV4X2cgfCBpYjsKKyAgICAgICAgICAgICAgICAgIC8qIGludCBkYiA9IGFicyhpYiAtIGIpOyAqLworICAgICAgICAgICAgICAgICAgaW50IGRiID0gKChpYiA+IGIpID8gaWIgLSBiIDogYiAtIGliKTsKKyAgICAgICAgICAgICAgICAgIGludCBkbWF4ID0gKChkbSA+IGRiKSA/IGRtIDogZGIpOworICAgICAgICAgICAgICAgICAgaW50IGQgPSBkbWF4ICsgZHQgKyBkYjsKKworICAgICAgICAgICAgICAgICAgaWYgKGQgPCAoaW50KWRpc3RhbmNlW2RfaW5kZXhdKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VbZF9pbmRleF0gPSAocG5nX2J5dGUpZDsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwW2RfaW5kZXhdID0gKHBuZ19ieXRlKWk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGRpc3RhbmNlKTsKKyAgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKKy8qIFRyYW5zZm9ybSB0aGUgaW1hZ2UgZnJvbSB0aGUgZmlsZV9nYW1tYSB0byB0aGUgc2NyZWVuX2dhbW1hLiAgV2UKKyAqIG9ubHkgZG8gdHJhbnNmb3JtYXRpb25zIG9uIGltYWdlcyB3aGVyZSB0aGUgZmlsZV9nYW1tYSBhbmQgc2NyZWVuX2dhbW1hCisgKiBhcmUgbm90IGNsb3NlIHJlY2lwcm9jYWxzLCBvdGhlcndpc2UgaXQgc2xvd3MgdGhpbmdzIGRvd24gc2xpZ2h0bHksIGFuZAorICogYWxzbyBuZWVkbGVzc2x5IGludHJvZHVjZXMgc21hbGwgZXJyb3JzLgorICoKKyAqIFdlIHdpbGwgdHVybiBvZmYgZ2FtbWEgdHJhbnNmb3JtYXRpb24gbGF0ZXIgaWYgbm8gc2VtaXRyYW5zcGFyZW50IGVudHJpZXMKKyAqIGFyZSBwcmVzZW50IGluIHRoZSB0Uk5TIGFycmF5IGZvciBwYWxldHRlIGltYWdlcy4gIFdlIGNhbid0IGRvIGl0IGhlcmUKKyAqIGJlY2F1c2Ugd2UgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0aGUgdFJOUyBjaHVuayB5ZXQuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2dhbW1hKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGRvdWJsZSBzY3JuX2dhbW1hLCBkb3VibGUgZmlsZV9nYW1tYSkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9nYW1tYSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAoKGZhYnMoc2Nybl9nYW1tYSAqIGZpbGVfZ2FtbWEgLSAxLjApID4gUE5HX0dBTU1BX1RIUkVTSE9MRCkgfHwKKyAgICAgICAocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSB8fAorICAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpKQorICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0dBTU1BOworICAgcG5nX3B0ci0+Z2FtbWEgPSAoZmxvYXQpZmlsZV9nYW1tYTsKKyAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSA9IChmbG9hdClzY3JuX2dhbW1hOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisvKiBFeHBhbmQgcGFsZXR0ZWQgaW1hZ2VzIHRvIFJHQiwgZXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgb2YKKyAqIGxlc3MgdGhhbiA4LWJpdCBkZXB0aCB0byA4LWJpdCBkZXB0aCwgYW5kIGV4cGFuZCB0Uk5TIGNodW5rcworICogdG8gYWxwaGEgY2hhbm5lbHMuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2V4cGFuZChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2V4cGFuZCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gKFBOR19FWFBBTkQgfCBQTkdfRVhQQU5EX3RSTlMpOworICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX1JPV19JTklUOworfQorCisvKiBHUlIgMTk5OTA2Mjc6ICB0aGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBjdXJyZW50bHkgYXJlIGlkZW50aWNhbAorICogIHRvIHBuZ19zZXRfZXhwYW5kKCkuICBIb3dldmVyLCBpdCBpcyBlbnRpcmVseSByZWFzb25hYmxlIHRoYXQgc29tZW9uZQorICogIG1pZ2h0IHdpc2ggdG8gZXhwYW5kIGFuIGluZGV4ZWQgaW1hZ2UgdG8gUkdCIGJ1dCAqbm90KiBleHBhbmQgYSBzaW5nbGUsCisgKiAgZnVsbHkgdHJhbnNwYXJlbnQgcGFsZXR0ZSBlbnRyeSB0byBhIGZ1bGwgYWxwaGEgY2hhbm5lbC0tcGVyaGFwcyBpbnN0ZWFkCisgKiAgY29udmVydCB0Uk5TIHRvIHRoZSBncmF5c2NhbGUvUkdCIGZvcm1hdCAoMTYtYml0IFJHQiB2YWx1ZSksIG9yIHJlcGxhY2UKKyAqICB0aGUgdHJhbnNwYXJlbnQgY29sb3Igd2l0aCBhIHBhcnRpY3VsYXIgUkdCIHZhbHVlLCBvciBkcm9wIHRSTlMgZW50aXJlbHkuCisgKiAgSU9XLCBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG1heSBtYWtlIHRoZSB0cmFuc2Zvcm1hdGlvbnMgZmxhZworICogIGEgYml0IG1vcmUgZmluZS1ncmFpbmVkLCB3aXRoIHNlcGFyYXRlIGJpdHMgZm9yIGVhY2ggb2YgdGhlc2UgdGhyZWUKKyAqICBmdW5jdGlvbnMuCisgKgorICogIE1vcmUgdG8gdGhlIHBvaW50LCB0aGVzZSBmdW5jdGlvbnMgbWFrZSBpdCBvYnZpb3VzIHdoYXQgbGlicG5nIHdpbGwgYmUKKyAqICBkb2luZywgd2hlcmVhcyAiZXhwYW5kIiBjYW4gKGFuZCBkb2VzKSBtZWFuIGFueSBudW1iZXIgb2YgdGhpbmdzLgorICoKKyAqICBHUlAgMjAwNjAzMDc6IEluIGxpYnBuZy0xLjIuOSwgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSB3YXMgbW9kaWZpZWQKKyAqICB0byBleHBhbmQgb25seSB0aGUgc2FtcGxlIGRlcHRoIGJ1dCBub3QgdG8gZXhwYW5kIHRoZSB0Uk5TIHRvIGFscGhhCisgKiAgYW5kIGl0cyBuYW1lIHdhcyBjaGFuZ2VkIHRvIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpLgorICovCisKKy8qIEV4cGFuZCBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLiAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9wYWxldHRlX3RvX3JnYiIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gKFBOR19FWFBBTkQgfCBQTkdfRVhQQU5EX3RSTlMpOworICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX1JPV19JTklUOworfQorCisjaWZuZGVmIFBOR18xXzBfWAorLyogRXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgb2YgbGVzcyB0aGFuIDgtYml0IGRlcHRoIHRvIDggYml0cy4gKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184Iik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfRVhQQU5EOworICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX1JPV19JTklUOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZChQTkdfMV8yX1gpCisvKiBFeHBhbmQgZ3JheXNjYWxlIGltYWdlcyBvZiBsZXNzIHRoYW4gOC1iaXQgZGVwdGggdG8gOCBiaXRzLiAqLworLyogRGVwcmVjYXRlZCBhcyBvZiBsaWJwbmctMS4yLjkgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gKFBOR19FWFBBTkQgfCBQTkdfRVhQQU5EX3RSTlMpOworfQorI2VuZGlmCisKKworLyogRXhwYW5kIHRSTlMgY2h1bmtzIHRvIGFscGhhIGNoYW5uZWxzLiAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfdFJOU190b19hbHBoYShwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3RSTlNfdG9fYWxwaGEiKTsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IChQTkdfRVhQQU5EIHwgUE5HX0VYUEFORF90Uk5TKTsKKyAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19ST1dfSU5JVDsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpICovCisKKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZ3JheV90b19yZ2IiKTsKKworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19HUkFZX1RPX1JHQjsKKyAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19ST1dfSU5JVDsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorLyogQ29udmVydCBhIFJHQiBpbWFnZSB0byBhIGdyYXlzY2FsZSBvZiB0aGUgc2FtZSB3aWR0aC4gIFRoaXMgYWxsb3dzIHVzLAorICogZm9yIGV4YW1wbGUsIHRvIGNvbnZlcnQgYSAyNCBicHAgUkdCIGltYWdlIGludG8gYW4gOCBicHAgZ3JheXNjYWxlIGltYWdlLgorICovCisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3JnYl90b19ncmF5KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBlcnJvcl9hY3Rpb24sIGRvdWJsZSByZWQsCisgICBkb3VibGUgZ3JlZW4pCit7CisgICBpbnQgcmVkX2ZpeGVkID0gKGludCkoKGZsb2F0KXJlZCoxMDAwMDAuMCArIDAuNSk7CisgICBpbnQgZ3JlZW5fZml4ZWQgPSAoaW50KSgoZmxvYXQpZ3JlZW4qMTAwMDAwLjAgKyAwLjUpOworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQocG5nX3B0ciwgZXJyb3JfYWN0aW9uLCByZWRfZml4ZWQsIGdyZWVuX2ZpeGVkKTsKK30KKyNlbmRpZgorCit2b2lkIFBOR0FQSQorcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgZXJyb3JfYWN0aW9uLAorICAgcG5nX2ZpeGVkX3BvaW50IHJlZCwgcG5nX2ZpeGVkX3BvaW50IGdyZWVuKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3JnYl90b19ncmF5Iik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHN3aXRjaChlcnJvcl9hY3Rpb24pCisgICB7CisgICAgICBjYXNlIDE6IHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUkdCX1RPX0dSQVk7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI6IHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUkdCX1RPX0dSQVlfV0FSTjsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzogcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19SR0JfVE9fR1JBWV9FUlI7CisgICB9CisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfRVhQQU5EOworI2Vsc2UKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICJDYW5ub3QgZG8gUkdCX1RPX0dSQVkgd2l0aG91dCBFWFBBTkRfU1VQUE9SVEVELiIpOworICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfUkdCX1RPX0dSQVk7CisgICB9CisjZW5kaWYKKyAgIHsKKyAgICAgIHBuZ191aW50XzE2IHJlZF9pbnQsIGdyZWVuX2ludDsKKyAgICAgIGlmIChyZWQgPCAwIHx8IGdyZWVuIDwgMCkKKyAgICAgIHsKKyAgICAgICAgIHJlZF9pbnQgICA9ICA2OTY4OyAvKiAuMjEyNjcxICogMzI3NjggKyAuNSAqLworICAgICAgICAgZ3JlZW5faW50ID0gMjM0MzQ7IC8qIC43MTUxNjAgKiAzMjc2OCArIC41ICovCisgICAgICB9CisgICAgICBlbHNlIGlmIChyZWQgKyBncmVlbiA8IDEwMDAwMEwpCisgICAgICB7CisgICAgICAgICByZWRfaW50ID0gKHBuZ191aW50XzE2KSgoKHBuZ191aW50XzMyKXJlZCozMjc2OEwpLzEwMDAwMEwpOworICAgICAgICAgZ3JlZW5faW50ID0gKHBuZ191aW50XzE2KSgoKHBuZ191aW50XzMyKWdyZWVuKjMyNzY4TCkvMTAwMDAwTCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiaWdub3Jpbmcgb3V0IG9mIHJhbmdlIHJnYl90b19ncmF5IGNvZWZmaWNpZW50cyIpOworICAgICAgICAgcmVkX2ludCAgID0gIDY5Njg7CisgICAgICAgICBncmVlbl9pbnQgPSAyMzQzNDsKKyAgICAgIH0KKyAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X3JlZF9jb2VmZiAgID0gcmVkX2ludDsKKyAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X2dyZWVuX2NvZWZmID0gZ3JlZW5faW50OworICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfYmx1ZV9jb2VmZiAgPQorICAgICAgICAgKHBuZ191aW50XzE2KSgzMjc2OCAtIHJlZF9pbnQgLSBncmVlbl9pbnQpOworICAgfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX0xFR0FDWV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCit2b2lkIFBOR0FQSQorcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIKKyAgIHJlYWRfdXNlcl90cmFuc2Zvcm1fZm4pCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbiIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1VTRVJfVFJBTlNGT1JNOworICAgcG5nX3B0ci0+cmVhZF91c2VyX3RyYW5zZm9ybV9mbiA9IHJlYWRfdXNlcl90cmFuc2Zvcm1fZm47CisjZW5kaWYKKyNpZmRlZiBQTkdfTEVHQUNZX1NVUFBPUlRFRAorICAgaWYgKHJlYWRfdXNlcl90cmFuc2Zvcm1fZm4pCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAiVGhpcyB2ZXJzaW9uIG9mIGxpYnBuZyBkb2VzIG5vdCBzdXBwb3J0IHVzZXIgdHJhbnNmb3JtcyIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogSW5pdGlhbGl6ZSBldmVyeXRoaW5nIG5lZWRlZCBmb3IgdGhlIHJlYWQuICBUaGlzIGluY2x1ZGVzIG1vZGlmeWluZworICogdGhlIHBhbGV0dGUuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMiKTsKKworI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICBpZiAocG5nX3B0ciAhPSBOVUxMKQorI2VuZGlmCisgIHsKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKKyAgIGludCBjb2xvcl90eXBlID0gcG5nX3B0ci0+Y29sb3JfdHlwZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQorCisjaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisgICAvKiBEZXRlY3QgZ3JheSBiYWNrZ3JvdW5kIGFuZCBhdHRlbXB0IHRvIGVuYWJsZSBvcHRpbWl6YXRpb24KKyAgICAqIGZvciBncmF5IC0tPiBSR0IgY2FzZQorICAgICoKKyAgICAqIE5vdGU6ICBpZiBQTkdfQkFDS0dST1VORF9FWFBBTkQgaXMgc2V0IGFuZCBjb2xvcl90eXBlIGlzIGVpdGhlciBSR0Igb3IKKyAgICAqIFJHQl9BTFBIQSAoaW4gd2hpY2ggY2FzZSBuZWVkX2V4cGFuZCBpcyBzdXBlcmZsdW91cyBhbnl3YXkpLCB0aGUKKyAgICAqIGJhY2tncm91bmQgY29sb3IgbWlnaHQgYWN0dWFsbHkgYmUgZ3JheSB5ZXQgbm90IGJlIGZsYWdnZWQgYXMgc3VjaC4KKyAgICAqIFRoaXMgaXMgbm90IGEgcHJvYmxlbSBmb3IgdGhlIGN1cnJlbnQgY29kZSwgd2hpY2ggdXNlcworICAgICogUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWSBvbmx5IHRvIGRlY2lkZSB3aGVuIHRvIGRvIHRoZQorICAgICogcG5nX2RvX2dyYXlfdG9fcmdiKCkgdHJhbnNmb3JtYXRpb24uCisgICAgKi8KKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKSAmJgorICAgICAgICEoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSkKKyAgIHsKKyAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19CQUNLR1JPVU5EX0lTX0dSQVk7CisgICB9IGVsc2UgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORCkgJiYKKyAgICAgICAgICAgICAgIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORF9FWFBBTkQpICYmCisgICAgICAgICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR1JBWV9UT19SR0IpICYmCisgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID09IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gJiYKKyAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlKQorICAgeworICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWTsKKyAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsKKyAgIH0KKyNlbmRpZgorCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EX0VYUEFORCkgJiYKKyAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkpCisgICB7CisgICAgICBpZiAoIShjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKSAgLyogaS5lLiwgR1JBWSBvciBHUkFZX0FMUEhBICovCisgICAgICB7CisgICAgICAgICAvKiBFeHBhbmQgYmFja2dyb3VuZCBhbmQgdFJOUyBjaHVua3MgKi8KKyAgICAgICAgIHN3aXRjaCAocG5nX3B0ci0+Yml0X2RlcHRoKQorICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ICo9IChwbmdfdWludF8xNikweGZmOworICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuCisgICAgICAgICAgICAgICAgID0gIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKKyAgICAgICAgICAgICAgIGlmICghKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmF5ICo9IChwbmdfdWludF8xNikweGZmOworICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMucmVkID0gcG5nX3B0ci0+dHJhbnNfdmFsdWVzLmdyZWVuCisgICAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT50cmFuc192YWx1ZXMuYmx1ZSA9IHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmF5OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSAqPSAocG5nX3VpbnRfMTYpMHg1NTsKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbgorICAgICAgICAgICAgICAgICA9IHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKKyAgICAgICAgICAgICAgIGlmICghKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmF5ICo9IChwbmdfdWludF8xNikweDU1OworICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMucmVkID0gcG5nX3B0ci0+dHJhbnNfdmFsdWVzLmdyZWVuCisgICAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT50cmFuc192YWx1ZXMuYmx1ZSA9IHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmF5OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSAqPSAocG5nX3VpbnRfMTYpMHgxMTsKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbgorICAgICAgICAgICAgICAgICA9IHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKKyAgICAgICAgICAgICAgIGlmICghKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmF5ICo9IChwbmdfdWludF8xNikweDExOworICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMucmVkID0gcG5nX3B0ci0+dHJhbnNfdmFsdWVzLmdyZWVuCisgICAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT50cmFuc192YWx1ZXMuYmx1ZSA9IHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmF5OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgODoKKworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbgorICAgICAgICAgICAgICAgICA9IHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgICA9CisgICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlW3BuZ19wdHItPmJhY2tncm91bmQuaW5kZXhdLnJlZDsKKyAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gPQorICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmluZGV4XS5ncmVlbjsKKyAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSAgPQorICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmluZGV4XS5ibHVlOworCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9BTFBIQSkKKyAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKyAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF90Uk5TKSkKKyNlbmRpZgorICAgICAgICAgICB7CisgICAgICAgICAgIC8qIEludmVydCB0aGUgYWxwaGEgY2hhbm5lbCAoaW4gdFJOUykgdW5sZXNzIHRoZSBwaXhlbHMgYXJlCisgICAgICAgICAgICAqIGdvaW5nIHRvIGJlIGV4cGFuZGVkLCBpbiB3aGljaCBjYXNlIGxlYXZlIGl0IGZvciBsYXRlcgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaW50IGksIGlzdG9wOworICAgICAgICAgICAgICBpc3RvcD0oaW50KXBuZ19wdHItPm51bV90cmFuczsKKyAgICAgICAgICAgICAgZm9yIChpPTA7IGk8aXN0b3A7IGkrKykKKyAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNbaV0gPSAocG5nX2J5dGUpKDI1NSAtIHBuZ19wdHItPnRyYW5zW2ldKTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworICAgICAgfQorICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKKyAgIHBuZ19wdHItPmJhY2tncm91bmRfMSA9IHBuZ19wdHItPmJhY2tncm91bmQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQorCisgICBpZiAoKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJiBwbmdfcHRyLT5udW1fdHJhbnMgIT0gMCkKKyAgICAgICAmJiAoZmFicyhwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgKiBwbmdfcHRyLT5nYW1tYSAtIDEuMCkKKyAgICAgICAgIDwgUE5HX0dBTU1BX1RIUkVTSE9MRCkpCisgICB7CisgICAgaW50IGksIGs7CisgICAgaz0wOworICAgIGZvciAoaT0wOyBpPHBuZ19wdHItPm51bV90cmFuczsgaSsrKQorICAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc1tpXSAhPSAwICYmIHBuZ19wdHItPnRyYW5zW2ldICE9IDB4ZmYpCisgICAgICAgIGs9MTsgLyogUGFydGlhbCB0cmFuc3BhcmVuY3kgaXMgcHJlc2VudCAqLworICAgIH0KKyAgICBpZiAoayA9PSAwKQorICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfR0FNTUE7CisgICB9CisKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgKFBOR19HQU1NQSB8IFBOR19SR0JfVE9fR1JBWSkpICYmCisgICAgICAgIHBuZ19wdHItPmdhbW1hICE9IDAuMCkKKyAgIHsKKyAgICAgIHBuZ19idWlsZF9nYW1tYV90YWJsZShwbmdfcHRyKTsKKworI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECisgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkQpCisgICAgICB7CisgICAgICAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgICAgeworICAgICAgICAgICAvKiBDb3VsZCBza2lwIGlmIG5vIHRyYW5zcGFyZW5jeSAqLworICAgICAgICAgICAgcG5nX2NvbG9yIGJhY2ssIGJhY2tfMTsKKyAgICAgICAgICAgIHBuZ19jb2xvcnAgcGFsZXR0ZSA9IHBuZ19wdHItPnBhbGV0dGU7CisgICAgICAgICAgICBpbnQgbnVtX3BhbGV0dGUgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaWYgKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgYmFjay5yZWQgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZF07CisgICAgICAgICAgICAgICBiYWNrLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbl07CisgICAgICAgICAgICAgICBiYWNrLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWVdOworCisgICAgICAgICAgICAgICBiYWNrXzEucmVkID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZF07CisgICAgICAgICAgICAgICBiYWNrXzEuZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPmJhY2tncm91bmQuZ3JlZW5dOworICAgICAgICAgICAgICAgYmFja18xLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPmJhY2tncm91bmQuYmx1ZV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBkb3VibGUgZywgZ3M7CisKKyAgICAgICAgICAgICAgIHN3aXRjaCAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU46CisgICAgICAgICAgICAgICAgICAgICBnID0gKHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7CisgICAgICAgICAgICAgICAgICAgICBncyA9IDEuMDsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEU6CisgICAgICAgICAgICAgICAgICAgICBnID0gMS4wIC8gKHBuZ19wdHItPmdhbW1hKTsKKyAgICAgICAgICAgICAgICAgICAgIGdzID0gMS4wIC8gKHBuZ19wdHItPmdhbW1hICogcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRToKKyAgICAgICAgICAgICAgICAgICAgIGcgPSAxLjAgLyAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSk7CisgICAgICAgICAgICAgICAgICAgICBncyA9IDEuMCAvIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICBnID0gMS4wOyAgICAvKiBiYWNrXzEgKi8KKyAgICAgICAgICAgICAgICAgICAgIGdzID0gMS4wOyAgIC8qIGJhY2sgKi8KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgaWYgKCBmYWJzKGdzIC0gMS4wKSA8IFBOR19HQU1NQV9USFJFU0hPTEQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBiYWNrLnJlZCAgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOworICAgICAgICAgICAgICAgICAgYmFjay5ncmVlbiA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOworICAgICAgICAgICAgICAgICAgYmFjay5ibHVlICA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBiYWNrLnJlZCA9IChwbmdfYnl0ZSkocG93KAorICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZC8yNTUsIGdzKSAqIDI1NS4wICsgLjUpOworICAgICAgICAgICAgICAgICAgYmFjay5ncmVlbiA9IChwbmdfYnl0ZSkocG93KAorICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuLzI1NSwgZ3MpICogMjU1LjAKKyAgICAgICAgICAgICAgICAgICAgICAgICArIC41KTsKKyAgICAgICAgICAgICAgICAgIGJhY2suYmx1ZSA9IChwbmdfYnl0ZSkocG93KAorICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUvMjU1LCBncykgKiAyNTUuMCArIC41KTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgYmFja18xLnJlZCA9IChwbmdfYnl0ZSkocG93KAorICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZC8yNTUsIGcpICogMjU1LjAgKyAuNSk7CisgICAgICAgICAgICAgICBiYWNrXzEuZ3JlZW4gPSAocG5nX2J5dGUpKHBvdygKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbi8yNTUsIGcpICogMjU1LjAgKyAuNSk7CisgICAgICAgICAgICAgICBiYWNrXzEuYmx1ZSA9IChwbmdfYnl0ZSkocG93KAorICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUvMjU1LCBnKSAqIDI1NS4wICsgLjUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoaSA8IChpbnQpcG5nX3B0ci0+bnVtX3RyYW5zICYmIHBuZ19wdHItPnRyYW5zW2ldICE9IDB4ZmYpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNbaV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0gPSBiYWNrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSAvKiBpZiAocG5nX3B0ci0+dHJhbnNbaV0gIT0gMHhmZikgKi8KKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHYsIHc7CisKKyAgICAgICAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BhbGV0dGVbaV0ucmVkXTsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgcG5nX3B0ci0+dHJhbnNbaV0sIGJhY2tfMS5yZWQpOworICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107CisKKyAgICAgICAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BhbGV0dGVbaV0uZ3JlZW5dOworICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBwbmdfcHRyLT50cmFuc1tpXSwgYmFja18xLmdyZWVuKTsKKyAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107CisKKyAgICAgICAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BhbGV0dGVbaV0uYmx1ZV07CisgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIHBuZ19wdHItPnRyYW5zW2ldLCBiYWNrXzEuYmx1ZSk7CisgICAgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0ucmVkXTsKKyAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmdyZWVuXTsKKyAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0uYmx1ZV07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBQcmV2ZW50IHRoZSB0cmFuc2Zvcm1hdGlvbnMgYmVpbmcgZG9uZSBhZ2FpbiwgYW5kIG1ha2Ugc3VyZQorICAgICAgICAgICAgICogdGhhdCB0aGUgbm93IHNwdXJpb3VzIGFscGhhIGNoYW5uZWwgaXMgc3RyaXBwZWQgLSB0aGUgY29kZQorICAgICAgICAgICAgICogaGFzIGp1c3QgcmVkdWNlZCBiYWNrZ3JvdW5kIGNvbXBvc2l0aW9uIGFuZCBnYW1tYSBjb3JyZWN0aW9uCisgICAgICAgICAgICAgKiB0byBhIHNpbXBsZSBhbHBoYSBjaGFubmVsIHN0cmlwLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19CQUNLR1JPVU5EOworICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfR0FNTUE7CisgICAgICAgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NUUklQX0FMUEhBOworICAgICAgICAgfQorICAgICAgICAgLyogaWYgKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSE9UE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5LTk9XTikgKi8KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIC8qIGNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAqLworICAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIG0gPSAoZG91YmxlKSgoKHBuZ191aW50XzMyKTEgPDwgcG5nX3B0ci0+Yml0X2RlcHRoKSAtIDEpOworICAgICAgICAgICAgZG91YmxlIGcgPSAxLjA7CisgICAgICAgICAgICBkb3VibGUgZ3MgPSAxLjA7CisKKyAgICAgICAgICAgIHN3aXRjaCAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU46CisgICAgICAgICAgICAgICAgICBnID0gKHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7CisgICAgICAgICAgICAgICAgICBncyA9IDEuMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEU6CisgICAgICAgICAgICAgICAgICBnID0gMS4wIC8gKHBuZ19wdHItPmdhbW1hKTsKKyAgICAgICAgICAgICAgICAgIGdzID0gMS4wIC8gKHBuZ19wdHItPmdhbW1hICogcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRToKKyAgICAgICAgICAgICAgICAgIGcgPSAxLjAgLyAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSk7CisgICAgICAgICAgICAgICAgICBncyA9IDEuMCAvIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hICoKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyYXkgPSAocG5nX3VpbnRfMTYpKHBvdygKKyAgICAgICAgICAgICAgIChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5IC8gbSwgZykgKiBtICsgLjUpOworICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID0gKHBuZ191aW50XzE2KShwb3coCisgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JheSAvIG0sIGdzKSAqIG0gKyAuNSk7CisKKyAgICAgICAgICAgIGlmICgocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgIT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbikgfHwKKyAgICAgICAgICAgICAgICAocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgIT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlKSB8fAorICAgICAgICAgICAgICAgIChwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAhPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogUkdCIG9yIFJHQkEgd2l0aCBjb2xvciBiYWNrZ3JvdW5kICovCisgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEucmVkID0gKHBuZ191aW50XzE2KShwb3coCisgICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQucmVkIC8gbSwgZykgKiBtICsgLjUpOworICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyZWVuID0gKHBuZ191aW50XzE2KShwb3coCisgICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gLyBtLCBnKSAqIG0gKyAuNSk7CisgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuYmx1ZSA9IChwbmdfdWludF8xNikocG93KAorICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgLyBtLCBnKSAqIG0gKyAuNSk7CisgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9IChwbmdfdWludF8xNikocG93KAorICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAvIG0sIGdzKSAqIG0gKyAuNSk7CisgICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID0gKHBuZ191aW50XzE2KShwb3coCisgICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gLyBtLCBncykgKiBtICsgLjUpOworICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0gKHBuZ191aW50XzE2KShwb3coCisgICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSAvIG0sIGdzKSAqIG0gKyAuNSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBHUkFZLCBHUkFZIEFMUEhBLCBSR0IsIG9yIFJHQkEgd2l0aCBncmF5IGJhY2tncm91bmQgKi8KKyAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmRfMS5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuZ3JlZW4KKyAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmF5OworICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuCisgICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5OworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgLyogVHJhbnNmb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBQTkdfQkFDS0dST1VORCAqLworI2VuZGlmIC8qIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEICovCisgICAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgeworICAgICAgICAgcG5nX2NvbG9ycCBwYWxldHRlID0gcG5nX3B0ci0+cGFsZXR0ZTsKKyAgICAgICAgIGludCBudW1fcGFsZXR0ZSA9IHBuZ19wdHItPm51bV9wYWxldHRlOworICAgICAgICAgaW50IGk7CisKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLnJlZF07CisgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ncmVlbl07CisgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmJsdWVdOworICAgICAgICAgfQorCisgICAgICAgICAvKiBEb25lIHRoZSBnYW1tYSBjb3JyZWN0aW9uLiAqLworICAgICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICY9IH5QTkdfR0FNTUE7CisgICAgICB9CisgICB9CisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyAgIGVsc2UKKyNlbmRpZgorI2VuZGlmIC8qIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCAmJiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEICovCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyAgIC8qIE5vIEdBTU1BIHRyYW5zZm9ybWF0aW9uICovCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EKSAmJgorICAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpKQorICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgaXN0b3AgPSAoaW50KXBuZ19wdHItPm51bV90cmFuczsKKyAgICAgIHBuZ19jb2xvciBiYWNrOworICAgICAgcG5nX2NvbG9ycCBwYWxldHRlID0gcG5nX3B0ci0+cGFsZXR0ZTsKKworICAgICAgYmFjay5yZWQgICA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsKKyAgICAgIGJhY2suZ3JlZW4gPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbjsKKyAgICAgIGJhY2suYmx1ZSAgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc1tpXSA9PSAwKQorICAgICAgICAgeworICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IGJhY2s7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmIChwbmdfcHRyLT50cmFuc1tpXSAhPSAweGZmKQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIHBuZ19jb21wb3NpdGUoKSBtYWNybyBpcyBkZWZpbmVkIGluIHBuZy5oICovCisgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHBhbGV0dGVbaV0ucmVkLCBwYWxldHRlW2ldLnJlZCwKKyAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zW2ldLCBiYWNrLnJlZCk7CisgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHBhbGV0dGVbaV0uZ3JlZW4sIHBhbGV0dGVbaV0uZ3JlZW4sCisgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc1tpXSwgYmFjay5ncmVlbik7CisgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHBhbGV0dGVbaV0uYmx1ZSwgcGFsZXR0ZVtpXS5ibHVlLAorICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNbaV0sIGJhY2suYmx1ZSk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIEhhbmRsZWQgYWxwaGEsIHN0aWxsIG5lZWQgdG8gc3RyaXAgdGhlIGNoYW5uZWwuICovCisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19CQUNLR1JPVU5EOworICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19TVFJJUF9BTFBIQTsKKyAgIH0KKyNlbmRpZiAvKiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TSElGVCkgJiYKKyAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpKQorICAgeworICAgICAgcG5nX3VpbnRfMTYgaTsKKyAgICAgIHBuZ191aW50XzE2IGlzdG9wID0gcG5nX3B0ci0+bnVtX3BhbGV0dGU7CisgICAgICBpbnQgc3IgPSA4IC0gcG5nX3B0ci0+c2lnX2JpdC5yZWQ7CisgICAgICBpbnQgc2cgPSA4IC0gcG5nX3B0ci0+c2lnX2JpdC5ncmVlbjsKKyAgICAgIGludCBzYiA9IDggLSBwbmdfcHRyLT5zaWdfYml0LmJsdWU7CisKKyAgICAgIGlmIChzciA8IDAgfHwgc3IgPiA4KQorICAgICAgICAgc3IgPSAwOworICAgICAgaWYgKHNnIDwgMCB8fCBzZyA+IDgpCisgICAgICAgICBzZyA9IDA7CisgICAgICBpZiAoc2IgPCAwIHx8IHNiID4gOCkKKyAgICAgICAgIHNiID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtpXS5yZWQgPj49IHNyOworICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtpXS5ncmVlbiA+Pj0gc2c7CisgICAgICAgICBwbmdfcHRyLT5wYWxldHRlW2ldLmJsdWUgPj49IHNiOworICAgICAgfQorICAgfQorI2VuZGlmICAvKiBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQgKi8KKyB9CisjaWYgIWRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpIFwKKyAmJiAhZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKKyAgIGlmIChwbmdfcHRyKQorICAgICAgcmV0dXJuOworI2VuZGlmCit9CisKKy8qIE1vZGlmeSB0aGUgaW5mbyBzdHJ1Y3R1cmUgdG8gcmVmbGVjdCB0aGUgdHJhbnNmb3JtYXRpb25zLiAgVGhlCisgKiBpbmZvIHNob3VsZCBiZSB1cGRhdGVkIHNvIGEgUE5HIGZpbGUgY291bGQgYmUgd3JpdHRlbiB3aXRoIGl0LAorICogYXNzdW1pbmcgdGhlIHRyYW5zZm9ybWF0aW9ucyByZXN1bHQgaW4gdmFsaWQgUE5HIGRhdGEuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3JlYWRfdHJhbnNmb3JtX2luZm8ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF90cmFuc2Zvcm1faW5mbyIpOworCisjaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpCisgICB7CisgICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMgJiYKKyAgICAgICAgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykpCisgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOworICAgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7CisgICAgICAgICBpbmZvX3B0ci0+bnVtX3RyYW5zID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF90Uk5TKQorICAgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSB8PSBQTkdfQ09MT1JfTUFTS19BTFBIQTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChpbmZvX3B0ci0+Yml0X2RlcHRoIDwgOCkKKyAgICAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSA4OworICAgICAgICAgaW5mb19wdHItPm51bV90cmFucyA9IDA7CisgICAgICB9CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkQpCisgICB7CisgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSAmPSB+UE5HX0NPTE9SX01BU0tfQUxQSEE7CisgICAgICBpbmZvX3B0ci0+bnVtX3RyYW5zID0gMDsKKyAgICAgIGluZm9fcHRyLT5iYWNrZ3JvdW5kID0gcG5nX3B0ci0+YmFja2dyb3VuZDsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dBTU1BKQorICAgeworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgICAgIGluZm9fcHRyLT5nYW1tYSA9IHBuZ19wdHItPmdhbW1hOworI2VuZGlmCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorICAgICAgaW5mb19wdHItPmludF9nYW1tYSA9IHBuZ19wdHItPmludF9nYW1tYTsKKyNlbmRpZgorICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAorICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfMTZfVE9fOCkgJiYgKGluZm9fcHRyLT5iaXRfZGVwdGggPT0gMTYpKQorICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HUkFZX1RPX1JHQikKKyAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlIHw9IFBOR19DT0xPUl9NQVNLX0NPTE9SOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpCisgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSAmPSB+UE5HX0NPTE9SX01BU0tfQ09MT1I7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRElUSEVSKQorICAgeworICAgICAgaWYgKCgoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKSB8fAorICAgICAgICAgIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpKSAmJgorICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwICYmIGluZm9fcHRyLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spICYmIChpbmZvX3B0ci0+Yml0X2RlcHRoIDwgOCkpCisgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gODsKKyNlbmRpZgorCisgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIGluZm9fcHRyLT5jaGFubmVscyA9IDE7CisgICBlbHNlIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQorICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMzsKKyAgIGVsc2UKKyAgICAgIGluZm9fcHRyLT5jaGFubmVscyA9IDE7CisKKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1NUUklQX0FMUEhBKQorICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgJj0gflBOR19DT0xPUl9NQVNLX0FMUEhBOworI2VuZGlmCisKKyAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQorICAgICAgaW5mb19wdHItPmNoYW5uZWxzKys7CisKKyNpZmRlZiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVECisgICAvKiBTVFJJUF9BTFBIQSBhbmQgRklMTEVSIGFsbG93ZWQ6ICBNQVNLX0FMUEhBIGJpdCBzdHJpcHBlZCBhYm92ZSAqLworICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRklMTEVSKSAmJgorICAgICAgICgoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKSB8fAorICAgICAgIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKSkpCisgICB7CisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMrKzsKKyAgICAgIC8qIElmIGFkZGluZyBhIHRydWUgYWxwaGEgY2hhbm5lbCBub3QganVzdCBmaWxsZXIgKi8KKyNpZm5kZWYgUE5HXzFfMF9YCisgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0FERF9BTFBIQSkKKyAgICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgfD0gUE5HX0NPTE9SX01BU0tfQUxQSEE7CisjZW5kaWYKKyAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRCkgJiYgXAorZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1VTRVJfVFJBTlNGT1JNKQorICAgICB7CisgICAgICAgaWYgKGluZm9fcHRyLT5iaXRfZGVwdGggPCBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aCkKKyAgICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aDsKKyAgICAgICBpZiAoaW5mb19wdHItPmNoYW5uZWxzIDwgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMpCisgICAgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9jaGFubmVsczsKKyAgICAgfQorI2VuZGlmCisKKyAgIGluZm9fcHRyLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoaW5mb19wdHItPmNoYW5uZWxzICoKKyAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgpOworCisgICBpbmZvX3B0ci0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMoaW5mb19wdHItPnBpeGVsX2RlcHRoLCBpbmZvX3B0ci0+d2lkdGgpOworCisjaWZuZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyKQorICAgICAgcmV0dXJuOworI2VuZGlmCit9CisKKy8qIFRyYW5zZm9ybSB0aGUgcm93LiAgVGhlIG9yZGVyIG9mIHRyYW5zZm9ybWF0aW9ucyBpcyBzaWduaWZpY2FudCwKKyAqIGFuZCBpcyB2ZXJ5IHRvdWNoeS4gIElmIHlvdSBhZGQgYSB0cmFuc2Zvcm1hdGlvbiwgdGFrZSBjYXJlIHRvCisgKiBkZWNpZGUgaG93IGl0IGZpdHMgaW4gd2l0aCB0aGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIGhlcmUuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyIpOworCisgICBpZiAocG5nX3B0ci0+cm93X2J1ZiA9PSBOVUxMKQorICAgeworI2lmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICAgIGNoYXIgbXNnWzUwXTsKKworICAgICAgcG5nX3NucHJpbnRmMihtc2csIDUwLAorICAgICAgICAgIk5VTEwgcm93IGJ1ZmZlciBmb3Igcm93ICVsZCwgcGFzcyAlZCIsIChsb25nKXBuZ19wdHItPnJvd19udW1iZXIsCisgICAgICAgICBwbmdfcHRyLT5wYXNzKTsKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBtc2cpOworI2Vsc2UKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTlVMTCByb3cgYnVmZmVyIik7CisjZW5kaWYKKyAgIH0KKyNpZmRlZiBQTkdfV0FSTl9VTklOSVRJQUxJWkVEX1JPVworICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkpCisgICAgICAvKiBBcHBsaWNhdGlvbiBoYXMgZmFpbGVkIHRvIGNhbGwgZWl0aGVyIHBuZ19yZWFkX3N0YXJ0X2ltYWdlKCkKKyAgICAgICAqIG9yIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgYWZ0ZXIgc2V0dGluZyB0cmFuc2Zvcm1zIHRoYXQgZXhwYW5kCisgICAgICAgKiBwaXhlbHMuICBUaGlzIGNoZWNrIGFkZGVkIHRvIGxpYnBuZy0xLjIuMTkKKyAgICAgICAqLworI2lmIChQTkdfV0FSTl9VTklOSVRJQUxJWkVEX1JPVz09MSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVW5pbml0aWFsaXplZCByb3ciKTsKKyNlbHNlCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5pbml0aWFsaXplZCByb3ciKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5yb3dfaW5mby5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICBwbmdfZG9fZXhwYW5kX3BhbGV0dGUoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAorICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZSwgcG5nX3B0ci0+dHJhbnMsIHBuZ19wdHItPm51bV90cmFucyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zICYmCisgICAgICAgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykpCisgICAgICAgICAgICBwbmdfZG9fZXhwYW5kKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgICAgICAgICYocG5nX3B0ci0+dHJhbnNfdmFsdWVzKSk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwbmdfZG9fZXhwYW5kKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1NUUklQX0FMUEhBKQorICAgICAgcG5nX2RvX3N0cmlwX2ZpbGxlcigmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEsCisgICAgICAgICBQTkdfRkxBR19GSUxMRVJfQUZURVIgfCAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19TVFJJUF9BTFBIQSkpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpCisgICB7CisgICAgICBpbnQgcmdiX2Vycm9yID0KKyAgICAgICAgIHBuZ19kb19yZ2JfdG9fZ3JheShwbmdfcHRyLCAmKHBuZ19wdHItPnJvd19pbmZvKSwKKyAgICAgICAgICAgICBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisgICAgICBpZiAocmdiX2Vycm9yKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfc3RhdHVzPTE7CisgICAgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkgPT0KKyAgICAgICAgICAgICBQTkdfUkdCX1RPX0dSQVlfV0FSTikKKyAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJwbmdfZG9fcmdiX3RvX2dyYXkgZm91bmQgbm9uZ3JheSBwaXhlbCIpOworICAgICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpID09CisgICAgICAgICAgICAgUE5HX1JHQl9UT19HUkFZX0VSUikKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX2RvX3JnYl90b19ncmF5IGZvdW5kIG5vbmdyYXkgcGl4ZWwiKTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisvKiBGcm9tIEFuZHJlYXMgRGlsZ2VyIGUtbWFpbCB0byBwbmctaW1wbGVtZW50LCAyNiBNYXJjaCAxOTk4OgorICoKKyAqICAgSW4gbW9zdCBjYXNlcywgdGhlICJzaW1wbGUgdHJhbnNwYXJlbmN5IiBzaG91bGQgYmUgZG9uZSBwcmlvciB0byBkb2luZworICogICBncmF5LXRvLVJHQiwgb3IgeW91IHdpbGwgaGF2ZSB0byB0ZXN0IDN4IGFzIG1hbnkgYnl0ZXMgdG8gY2hlY2sgaWYgYQorICogICBwaXhlbCBpcyB0cmFuc3BhcmVudC4gIFlvdSB3b3VsZCBhbHNvIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCisgKiAgIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiBpcyB1cGdyYWRlZCB0byBSR0IuCisgKgorICogICBUbyBzdW1tYXJpemUsIHRoZSBjdXJyZW50IGZsb3cgaXM6CisgKiAgIC0gR3JheSArIHNpbXBsZSB0cmFuc3BhcmVuY3kgLT4gY29tcGFyZSAxIG9yIDIgZ3JheSBieXRlcyBhbmQgY29tcG9zaXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBiYWNrZ3JvdW5kICJpbiBwbGFjZSIgaWYgdHJhbnNwYXJlbnQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCB0byBSR0IgaWYgbmVjZXNzYXJ5CisgKiAgIC0gR3JheSArIGFscGhhIC0+IGNvbXBvc2l0ZSB3aXRoIGdyYXkgYmFja2dyb3VuZCBhbmQgcmVtb3ZlIGFscGhhIGJ5dGVzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQgdG8gUkdCIGlmIG5lY2Vzc2FyeQorICoKKyAqICAgVG8gc3VwcG9ydCBSR0IgYmFja2dyb3VuZHMgZm9yIGdyYXkgaW1hZ2VzIHdlIG5lZWQ6CisgKiAgIC0gR3JheSArIHNpbXBsZSB0cmFuc3BhcmVuY3kgLT4gY29udmVydCB0byBSR0IgKyBzaW1wbGUgdHJhbnNwYXJlbmN5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUgMyBvciA2IGJ5dGVzIGFuZCBjb21wb3NpdGUgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgImluIHBsYWNlIiBpZiB0cmFuc3BhcmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzeCBjb21wYXJlL3BpeGVsIGNvbXBhcmVkIHRvIGRvaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlIHdpdGggZ3JheSBia2dybmQpCisgKiAgIC0gR3JheSArIGFscGhhIC0+IGNvbnZlcnQgdG8gUkdCICsgYWxwaGEsIGNvbXBvc2l0ZSB3aXRoIGJhY2tncm91bmQgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlIGFscGhhIGJ5dGVzICgzeCBmbG9hdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMvcGl4ZWwgY29tcGFyZWQgd2l0aCBjb21wb3NpdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBncmF5IGJhY2tncm91bmQpCisgKgorICogIEdyZWcncyBjaGFuZ2Ugd2lsbCBkbyB0aGlzLiAgVGhlIHJlYXNvbiBpdCB3YXNuJ3QgZG9uZSBiZWZvcmUgaXMgZm9yCisgKiAgcGVyZm9ybWFuY2UsIGFzIHRoaXMgaW5jcmVhc2VzIHRoZSBwZXItcGl4ZWwgb3BlcmF0aW9ucy4gIElmIHdlIHdvdWxkIGNoZWNrCisgKiAgaW4gYWR2YW5jZSBpZiB0aGUgYmFja2dyb3VuZCB3YXMgZ3JheSBvciBSR0IsIGFuZCBwb3NpdGlvbiB0aGUgZ3JheS10by1SR0IKKyAqICB0cmFuc2Zvcm0gYXBwcm9wcmlhdGVseSwgdGhlbiBpdCB3b3VsZCBzYXZlIGEgbG90IG9mIHdvcmsvdGltZS4KKyAqLworCisjaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisgICAvKiBJZiBncmF5IC0+IFJHQiwgZG8gc28gbm93IG9ubHkgaWYgYmFja2dyb3VuZCBpcyBub24tZ3JheTsgZWxzZSBkbyBsYXRlcgorICAgICogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMKKyAgICAqLworICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR1JBWV9UT19SR0IpICYmCisgICAgICAgIShwbmdfcHRyLT5tb2RlICYgUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWSkpCisgICAgICBwbmdfZG9fZ3JheV90b19yZ2IoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkQpICYmCisgICAgICAoKHBuZ19wdHItPm51bV90cmFucyAhPSAwICkgfHwKKyAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpKSkKKyAgICAgIHBuZ19kb19iYWNrZ3JvdW5kKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgICYocG5nX3B0ci0+dHJhbnNfdmFsdWVzKSwgJihwbmdfcHRyLT5iYWNrZ3JvdW5kKQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgLCAmKHBuZ19wdHItPmJhY2tncm91bmRfMSksCisgICAgICAgICBwbmdfcHRyLT5nYW1tYV90YWJsZSwgcG5nX3B0ci0+Z2FtbWFfZnJvbV8xLAorICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfdG9fMSwgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUsCisgICAgICAgICBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzEsIHBuZ19wdHItPmdhbW1hXzE2X3RvXzEsCisgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdAorI2VuZGlmCispOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dBTU1BKSAmJgorI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECisgICAgICAgISgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkQpICYmCisgICAgICAgKChwbmdfcHRyLT5udW1fdHJhbnMgIT0gMCkgfHwKKyAgICAgICAocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSkpICYmCisjZW5kaWYKKyAgICAgICAocG5nX3B0ci0+Y29sb3JfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSkKKyAgICAgIHBuZ19kb19nYW1tYSgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEsCisgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfdGFibGUsIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlLAorICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0KTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfMTZfVE9fOCkKKyAgICAgIHBuZ19kb19jaG9wKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRElUSEVSKQorICAgeworICAgICAgcG5nX2RvX2RpdGhlcigocG5nX3Jvd19pbmZvcCkmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEsCisgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX2xvb2t1cCwgcG5nX3B0ci0+ZGl0aGVyX2luZGV4KTsKKyAgICAgIGlmIChwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyA9PSAocG5nX3VpbnRfMzIpMCkKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX2RvX2RpdGhlciByZXR1cm5lZCByb3dieXRlcz0wIik7CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX01PTk8pCisgICAgICBwbmdfZG9faW52ZXJ0KCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TSElGVCkKKyAgICAgIHBuZ19kb191bnNoaWZ0KCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgICYocG5nX3B0ci0+c2hpZnQpKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDSykKKyAgICAgIHBuZ19kb191bnBhY2soJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfQkdSX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CR1IpCisgICAgICBwbmdfZG9fYmdyKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKKyAgICAgIHBuZ19kb19wYWNrc3dhcCgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQKKyAgIC8qIElmIGdyYXkgLT4gUkdCLCBkbyBzbyBub3cgb25seSBpZiB3ZSBkaWQgbm90IGRvIHNvIGFib3ZlICovCisgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HUkFZX1RPX1JHQikgJiYKKyAgICAgICAocG5nX3B0ci0+bW9kZSAmIFBOR19CQUNLR1JPVU5EX0lTX0dSQVkpKQorICAgICAgcG5nX2RvX2dyYXlfdG9fcmdiKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRklMTEVSKQorICAgICAgcG5nX2RvX3JlYWRfZmlsbGVyKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgIChwbmdfdWludF8zMilwbmdfcHRyLT5maWxsZXIsIHBuZ19wdHItPmZsYWdzKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfQUxQSEEpCisgICAgICBwbmdfZG9fcmVhZF9pbnZlcnRfYWxwaGEoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1dBUF9BTFBIQSkKKyAgICAgIHBuZ19kb19yZWFkX3N3YXBfYWxwaGEoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfU1dBUF9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1dBUF9CWVRFUykKKyAgICAgIHBuZ19kb19zd2FwKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19VU0VSX1RSQU5TRk9STSkKKyAgICB7CisgICAgICBpZiAocG5nX3B0ci0+cmVhZF91c2VyX3RyYW5zZm9ybV9mbiAhPSBOVUxMKQorICAgICAgICAgKCoocG5nX3B0ci0+cmVhZF91c2VyX3RyYW5zZm9ybV9mbikpIC8qIFVzZXIgcmVhZCB0cmFuc2Zvcm0gZnVuY3Rpb24gKi8KKyAgICAgICAgICAgIChwbmdfcHRyLCAgICAgICAgICAgICAgICAgICAgLyogcG5nX3B0ciAqLworICAgICAgICAgICAgICAgJihwbmdfcHRyLT5yb3dfaW5mbyksICAgICAvKiByb3dfaW5mbzogKi8KKyAgICAgICAgICAgICAgIC8qICBwbmdfdWludF8zMiB3aWR0aDsgICAgICAgd2lkdGggb2Ygcm93ICovCisgICAgICAgICAgICAgICAvKiAgcG5nX3VpbnRfMzIgcm93Ynl0ZXM7ICAgIG51bWJlciBvZiBieXRlcyBpbiByb3cgKi8KKyAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBjb2xvcl90eXBlOyAgICAgY29sb3IgdHlwZSBvZiBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBiaXRfZGVwdGg7ICAgICAgYml0IGRlcHRoIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzICgxLTQpICovCisgICAgICAgICAgICAgICAvKiAgcG5nX2J5dGUgcGl4ZWxfZGVwdGg7ICAgIGJpdHMgcGVyIHBpeGVsIChkZXB0aCpjaGFubmVscykgKi8KKyAgICAgICAgICAgICAgIHBuZ19wdHItPnJvd19idWYgKyAxKTsgICAgLyogc3RhcnQgb2YgcGl4ZWwgZGF0YSBmb3Igcm93ICovCisjaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQKKyAgICAgIGlmIChwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aCkKKyAgICAgICAgIHBuZ19wdHItPnJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2RlcHRoOworICAgICAgaWYgKHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzKQorICAgICAgICAgcG5nX3B0ci0+cm93X2luZm8uY2hhbm5lbHMgPSBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9jaGFubmVsczsKKyNlbmRpZgorICAgICAgcG5nX3B0ci0+cm93X2luZm8ucGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHBuZ19wdHItPnJvd19pbmZvLmJpdF9kZXB0aCAqCisgICAgICAgICBwbmdfcHRyLT5yb3dfaW5mby5jaGFubmVscyk7CisgICAgICBwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCwKKyAgICAgICAgIHBuZ19wdHItPnJvd19pbmZvLndpZHRoKTsKKyAgIH0KKyNlbmRpZgorCit9CisKKyNpZmRlZiBQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRAorLyogVW5wYWNrIHBpeGVscyBvZiAxLCAyLCBvciA0IGJpdHMgcGVyIHBpeGVsIGludG8gMSBieXRlIHBlciBwaXhlbCwKKyAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGFjdHVhbCB2YWx1ZXMuICBUaHVzLCBpZiB5b3UgaGFkIGEgcm93IHdpdGgKKyAqIGEgYml0IGRlcHRoIG9mIDEsIHlvdSB3b3VsZCBlbmQgdXAgd2l0aCBieXRlcyB0aGF0IG9ubHkgY29udGFpbmVkCisgKiB0aGUgbnVtYmVycyAwIG9yIDEuICBJZiB5b3Ugd291bGQgcmF0aGVyIHRoZXkgY29udGFpbiAwIGFuZCAyNTUsIHVzZQorICogcG5nX2RvX3NoaWZ0KCkgYWZ0ZXIgdGhpcy4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fdW5wYWNrKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb191bnBhY2siKTsKKworI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYgcm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCisjZWxzZQorICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPCA4KQorI2VuZGlmCisgICB7CisgICAgICBwbmdfdWludF8zMiBpOworICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKKworICAgICAgc3dpdGNoIChyb3dfaW5mby0+Yml0X2RlcHRoKQorICAgICAgeworICAgICAgICAgY2FzZSAxOgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfd2lkdGggLSAxKSA+PiAzKTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7CisgICAgICAgICAgICBwbmdfdWludF8zMiBzaGlmdCA9IDcgLSAoaW50KSgocm93X3dpZHRoICsgNykgJiAweDA3KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzaGlmdCkgJiAweDAxKTsKKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA3KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOworICAgICAgICAgICAgICAgICAgc3AtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNoaWZ0Kys7CisKKyAgICAgICAgICAgICAgIGRwLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSAyOgorICAgICAgICAgeworCisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDIpOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHNoaWZ0ID0gKGludCkoKDMgLSAoKHJvd193aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKnNwID4+IHNoaWZ0KSAmIDB4MDMpOworICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDYpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMjsKKworICAgICAgICAgICAgICAgZHAtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDEpOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHNoaWZ0ID0gKGludCkoKDEgLSAoKHJvd193aWR0aCArIDEpICYgMHgwMSkpIDw8IDIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKnNwID4+IHNoaWZ0KSAmIDB4MGYpOworICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OworCisgICAgICAgICAgICAgICBkcC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gODsKKyAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoOCAqIHJvd19pbmZvLT5jaGFubmVscyk7CisgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiByb3dfaW5mby0+Y2hhbm5lbHM7CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRAorLyogUmV2ZXJzZSB0aGUgZWZmZWN0cyBvZiBwbmdfZG9fc2hpZnQuICBUaGlzIHJvdXRpbmUgbWVyZWx5IHNoaWZ0cyB0aGUKKyAqIHBpeGVscyBiYWNrIHRvIHRoZWlyIHNpZ25pZmljYW50IGJpdHMgdmFsdWVzLiAgVGh1cywgaWYgeW91IGhhdmUKKyAqIGEgcm93IG9mIGJpdCBkZXB0aCA4LCBidXQgb25seSA1IGFyZSBzaWduaWZpY2FudCwgdGhpcyB3aWxsIHNoaWZ0CisgKiB0aGUgdmFsdWVzIGJhY2sgdG8gMCB0aHJvdWdoIDMxLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb191bnNoaWZ0KHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb2xvcl84cCBzaWdfYml0cykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3Vuc2hpZnQiKTsKKworICAgaWYgKAorI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgICAgIHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYgc2lnX2JpdHMgIT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIGludCBzaGlmdFs0XTsKKyAgICAgIGludCBjaGFubmVscyA9IDA7CisgICAgICBpbnQgYzsKKyAgICAgIHBuZ191aW50XzE2IHZhbHVlID0gMDsKKyAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKworICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCisgICAgICB7CisgICAgICAgICBzaGlmdFtjaGFubmVscysrXSA9IHJvd19pbmZvLT5iaXRfZGVwdGggLSBzaWdfYml0cy0+cmVkOworICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gc2lnX2JpdHMtPmdyZWVuOworICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gc2lnX2JpdHMtPmJsdWU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBzaGlmdFtjaGFubmVscysrXSA9IHJvd19pbmZvLT5iaXRfZGVwdGggLSBzaWdfYml0cy0+Z3JheTsKKyAgICAgIH0KKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQorICAgICAgeworICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gc2lnX2JpdHMtPmFscGhhOworICAgICAgfQorCisgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykKKyAgICAgIHsKKyAgICAgICAgIGlmIChzaGlmdFtjXSA8PSAwKQorICAgICAgICAgICAgc2hpZnRbY10gPSAwOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUgPSAxOworICAgICAgfQorCisgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgcmV0dXJuOworCisgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5iaXRfZGVwdGgpCisgICAgICB7CisgICAgICAgICBjYXNlIDI6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgYnA7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSByb3dfaW5mby0+cm93Ynl0ZXM7CisKKyAgICAgICAgICAgIGZvciAoYnAgPSByb3csIGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICpicCA+Pj0gMTsKKyAgICAgICAgICAgICAgICpicCsrICY9IDB4NTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSA0OgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIGJwID0gcm93OworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgICAgcG5nX2J5dGUgbWFzayA9IChwbmdfYnl0ZSkoKCgoaW50KTB4ZjAgPj4gc2hpZnRbMF0pICYgKGludCkweGYwKSB8CisgICAgICAgICAgICAgICAocG5nX2J5dGUpKChpbnQpMHhmID4+IHNoaWZ0WzBdKSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKmJwID4+PSBzaGlmdFswXTsKKyAgICAgICAgICAgICAgICpicCsrICY9IG1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSA4OgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIGJwID0gcm93OworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X3dpZHRoICogY2hhbm5lbHM7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKmJwKysgPj49IHNoaWZ0W2klY2hhbm5lbHNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSBjaGFubmVscyAqIHJvd193aWR0aDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB2YWx1ZSA9IChwbmdfdWludF8xNikoKCpicCA8PCA4KSArICooYnAgKyAxKSk7CisgICAgICAgICAgICAgICB2YWx1ZSA+Pj0gc2hpZnRbaSVjaGFubmVsc107CisgICAgICAgICAgICAgICAqYnArKyA9IChwbmdfYnl0ZSkodmFsdWUgPj4gOCk7CisgICAgICAgICAgICAgICAqYnArKyA9IChwbmdfYnl0ZSkodmFsdWUgJiAweGZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAorLyogQ2hvcCByb3dzIG9mIGJpdCBkZXB0aCAxNiBkb3duIHRvIDggKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX2Nob3AocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2Nob3AiKTsKKworI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYgcm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyNlbHNlCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyNlbmRpZgorICAgeworICAgICAgcG5nX2J5dGVwIHNwID0gcm93OworICAgICAgcG5nX2J5dGVwIGRwID0gcm93OworICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPndpZHRoICogcm93X2luZm8tPmNoYW5uZWxzOworCisgICAgICBmb3IgKGkgPSAwOyBpPGlzdG9wOyBpKyssIHNwICs9IDIsIGRwKyspCisgICAgICB7CisjaWZkZWYgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKKyAgICAgIC8qIFRoaXMgZG9lcyBhIG1vcmUgYWNjdXJhdGUgc2NhbGluZyBvZiB0aGUgMTYtYml0IGNvbG9yCisgICAgICAgKiB2YWx1ZSwgcmF0aGVyIHRoYW4gYSBzaW1wbGUgbG93LWJ5dGUgdHJ1bmNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiBXaGF0IHRoZSBpZGVhbCBjYWxjdWxhdGlvbiBzaG91bGQgYmU6CisgICAgICAgKiAgICpkcCA9ICgoKCgocG5nX3VpbnRfMzIpKCpzcCkgPDwgOCkgfAorICAgICAgICogICAgICAgICAgKHBuZ191aW50XzMyKSgqKHNwICsgMSkpKSAqIDI1NSArIDEyNykKKyAgICAgICAqICAgICAgICAgIC8gKHBuZ191aW50XzMyKTY1NTM1TDsKKyAgICAgICAqCisgICAgICAgKiBHUlI6IG5vLCBJIHRoaW5rIHRoaXMgaXMgd2hhdCBpdCByZWFsbHkgc2hvdWxkIGJlOgorICAgICAgICogICAqZHAgPSAoKCgoKHBuZ191aW50XzMyKSgqc3ApIDw8IDgpIHwKKyAgICAgICAqICAgICAgICAgICAocG5nX3VpbnRfMzIpKCooc3AgKyAxKSkpICsgMTI4TCkKKyAgICAgICAqICAgICAgICAgICAvIChwbmdfdWludF8zMikyNTdMOworICAgICAgICoKKyAgICAgICAqIEdSUjogaGVyZSdzIHRoZSBleGFjdCBjYWxjdWxhdGlvbiB3aXRoIHNoaWZ0czoKKyAgICAgICAqICAgdGVtcCA9ICgoKHBuZ191aW50XzMyKSgqc3ApIDw8IDgpIHwKKyAgICAgICAqICAgICAgICAgICAocG5nX3VpbnRfMzIpKCooc3AgKyAxKSkpICsgMTI4TDsKKyAgICAgICAqICAgKmRwID0gKHRlbXAgLSAodGVtcCA+PiA4KSkgPj4gODsKKyAgICAgICAqCisgICAgICAgKiBBcHByb3hpbWF0ZSBjYWxjdWxhdGlvbiB3aXRoIHNoaWZ0L2FkZCBpbnN0ZWFkIG9mIG11bHRpcGx5L2RpdmlkZToKKyAgICAgICAqICAgKmRwID0gKCgoKHBuZ191aW50XzMyKSgqc3ApIDw8IDgpIHwKKyAgICAgICAqICAgICAgICAgIChwbmdfdWludF8zMikoKGludCkoKihzcCArIDEpKSAtICpzcCkpICsgMTI4KSA+PiA4OworICAgICAgICoKKyAgICAgICAqIFdoYXQgd2UgYWN0dWFsbHkgZG8gdG8gYXZvaWQgZXh0cmEgc2hpZnRpbmcgYW5kIGNvbnZlcnNpb246CisgICAgICAgKi8KKworICAgICAgICAgKmRwID0gKnNwICsgKCgoKGludCkoKihzcCArIDEpKSAtICpzcCkgPiAxMjgpID8gMSA6IDApOworI2Vsc2UKKyAgICAgICAvKiBTaW1wbHkgZGlzY2FyZCB0aGUgbG93IG9yZGVyIGJ5dGUgKi8KKyAgICAgICAgICpkcCA9ICpzcDsKKyNlbmRpZgorICAgICAgfQorICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7CisgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKDggKiByb3dfaW5mby0+Y2hhbm5lbHMpOworICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X2luZm8tPndpZHRoICogcm93X2luZm8tPmNoYW5uZWxzOworICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fcmVhZF9zd2FwX2FscGhhKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX3N3YXBfYWxwaGEiKTsKKworI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwpCisjZW5kaWYKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICB7CisgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gUkdCQSB0byBBUkdCICovCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7CisgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2F2ZSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gc2F2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBSUkdHQkJBQSB0byBBQVJSR0dCQiAqLworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7CisgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2F2ZVswXSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICBzYXZlWzFdID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlWzBdOworICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmVbMV07CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgeworICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEdBIHRvIEFHICovCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7CisgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2F2ZSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEdHQUEgdG8gQUFHRyAqLworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7CisgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc2F2ZVswXSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICBzYXZlWzFdID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gc2F2ZVswXTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19yZWFkX2ludmVydF9hbHBoYShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmVhZF9pbnZlcnRfYWxwaGEiKTsKKworI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwpCisjZW5kaWYKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICB7CisgICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gUkdCQSAqLworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7CisKKy8qICAgICAgICAgICAgIFRoaXMgZG9lcyBub3RoaW5nOgorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgV2UgY2FuIHJlcGxhY2UgaXQgd2l0aDoKKyovCisgICAgICAgICAgICAgICBzcC09MzsKKyAgICAgICAgICAgICAgIGRwPXNwOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIFJSR0dCQkFBICovCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOworICAgICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7CisKKy8qICAgICAgICAgICAgIFRoaXMgZG9lcyBub3RoaW5nOgorICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgV2UgY2FuIHJlcGxhY2UgaXQgd2l0aDoKKyovCisgICAgICAgICAgICAgICBzcC09NjsKKyAgICAgICAgICAgICAgIGRwPXNwOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBHQSAqLworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBHR0FBICovCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOworLyoKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisqLworICAgICAgICAgICAgICAgc3AtPTI7CisgICAgICAgICAgICAgICBkcD1zcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAorLyogQWRkIGZpbGxlciBjaGFubmVsIGlmIHdlIGhhdmUgUkdCIGNvbG9yICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19yZWFkX2ZpbGxlcihwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAorICAgcG5nX3VpbnRfMzIgZmlsbGVyLCBwbmdfdWludF8zMiBmbGFncykKK3sKKyAgIHBuZ191aW50XzMyIGk7CisgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgIHBuZ19ieXRlIGhpX2ZpbGxlciA9IChwbmdfYnl0ZSkoKGZpbGxlcj4+OCkgJiAweGZmKTsKKyAgIHBuZ19ieXRlIGxvX2ZpbGxlciA9IChwbmdfYnl0ZSkoZmlsbGVyICYgMHhmZik7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JlYWRfZmlsbGVyIik7CisKKyAgIGlmICgKKyNpZmRlZiBQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQKKyAgICAgICByb3cgIT0gTlVMTCAgJiYgcm93X2luZm8gIT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgIHsKKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICB7CisgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBHIHRvIEdYICovCisgICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGg7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSAgc3AgKyAocG5nX3NpemVfdClyb3dfd2lkdGg7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOworICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDE2OworICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogMjsKKyAgICAgICAgIH0KKyAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIEcgdG8gWEcgKi8KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAxNjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDI7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQorICAgICAgeworICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gR0cgdG8gR0dYWCAqLworICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOworICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOworICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7CisgICAgICAgICB9CisgICAgICAgICAvKiBUaGlzIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBHRyB0byBYWEdHICovCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOworICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7CisgICAgICAgICB9CisgICAgICB9CisgICB9IC8qIENPTE9SX1RZUEUgPT0gR1JBWSAqLworICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgeworICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJHQiB0byBSR0JYICovCisgICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAzOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7CisgICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSA0OworICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMzI7CisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA0OworICAgICAgICAgfQorICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gUkdCIHRvIFhSR0IgKi8KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDM7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSA0OworICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMzI7CisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA0OworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJSR0dCQiB0byBSUkdHQkJYWCAqLworICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNjsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOworICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7CisgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOworICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gNDsKKyAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDY0OworICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogODsKKyAgICAgICAgIH0KKyAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIFJSR0dCQiB0byBYWFJSR0dCQiAqLworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNjsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKKyAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOworICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7CisgICAgICAgICAgICAgICAqKC0tZHApID0gaGlfZmlsbGVyOworICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSA2NDsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDg7CisgICAgICAgICB9CisgICAgICB9CisgICB9IC8qIENPTE9SX1RZUEUgPT0gUkdCICovCit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAorLyogRXhwYW5kIGdyYXlzY2FsZSBmaWxlcyB0byBSR0IsIHdpdGggb3Igd2l0aG91dCBhbHBoYSAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fZ3JheV90b19yZ2IocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ191aW50XzMyIGk7CisgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2dyYXlfdG9fcmdiIik7CisKKyAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID49IDggJiYKKyNpZmRlZiBQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQKKyAgICAgICByb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMICYmCisjZW5kaWYKKyAgICAgICEocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyIC0gMTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AgLSAxKTsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcCAtIDEpOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCisgICAgICB7CisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMiAtIDE7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNCAtIDE7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiA0OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcCAtIDEpOworICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwIC0gMSk7CisgICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKKyAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgcm93X2luZm8tPmNoYW5uZWxzICs9IChwbmdfYnl0ZSkyOworICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgfD0gUE5HX0NPTE9SX01BU0tfQ09MT1I7CisgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5jaGFubmVscyAqCisgICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoKTsKKyAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIHJvd193aWR0aCk7CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAorLyogUmVkdWNlIFJHQiBmaWxlcyB0byBncmF5c2NhbGUsIHdpdGggb3Igd2l0aG91dCBhbHBoYQorICogdXNpbmcgdGhlIGVxdWF0aW9uIGdpdmVuIGluIFBveW50b24ncyBDb2xvckZBUSBhdAorICogPGh0dHA6Ly93d3cuaW5mb3JhbXAubmV0L35wb3ludG9uLz4gIChUSElTIExJTksgSVMgREVBRCBKdW5lIDIwMDgpCisgKiBOZXcgbGluazoKKyAqIDxodHRwOi8vd3d3LnBveW50b24uY29tL25vdGVzL2NvbG91cl9hbmRfZ2FtbWEvPgorICogQ2hhcmxlcyBQb3ludG9uIHBveW50b24gYXQgcG95bnRvbi5jb20KKyAqCisgKiAgICAgWSA9IDAuMjEyNjcxICogUiArIDAuNzE1MTYwICogRyArIDAuMDcyMTY5ICogQgorICoKKyAqICBXZSBhcHByb3hpbWF0ZSB0aGlzIHdpdGgKKyAqCisgKiAgICAgWSA9IDAuMjEyNjggKiBSICAgICsgMC43MTUxICogRyAgICArIDAuMDcyMTcgKiBCCisgKgorICogIHdoaWNoIGNhbiBiZSBleHByZXNzZWQgd2l0aCBpbnRlZ2VycyBhcworICoKKyAqICAgICBZID0gKDY5NjkgKiBSICsgMjM0MzQgKiBHICsgMjM2NSAqIEIpLzMyNzY4CisgKgorICogIFRoZSBjYWxjdWxhdGlvbiBpcyB0byBiZSBkb25lIGluIGEgbGluZWFyIGNvbG9yc3BhY2UuCisgKgorICogIE90aGVyIGludGVnZXIgY29lZmZpY2VudHMgY2FuIGJlIHVzZWQgdmlhIHBuZ19zZXRfcmdiX3RvX2dyYXkoKS4KKyAqLworaW50IC8qIFBSSVZBVEUgKi8KK3BuZ19kb19yZ2JfdG9fZ3JheShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQorCit7CisgICBwbmdfdWludF8zMiBpOworCisgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisgICBpbnQgcmdiX2Vycm9yID0gMDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmdiX3RvX2dyYXkiKTsKKworICAgaWYgKAorI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgICAgIHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYKKyNlbmRpZgorICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgcmMgPSBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9yZWRfY29lZmY7CisgICAgICBwbmdfdWludF8zMiBnYyA9IHBuZ19wdHItPnJnYl90b19ncmF5X2dyZWVuX2NvZWZmOworICAgICAgcG5nX3VpbnRfMzIgYmMgPSBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ibHVlX2NvZWZmOworCisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgICAgeworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgIHsKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5nYW1tYV9mcm9tXzEgIT0gTlVMTCAmJiBwbmdfcHRyLT5nYW1tYV90b18xICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7CisKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHJlZCAgID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKKyAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKKyAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGJsdWUgID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKKyAgICAgICAgICAgICAgICAgIGlmIChyZWQgIT0gZ3JlZW4gfHwgcmVkICE9IGJsdWUpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICooZHArKykgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbCisgICAgICAgICAgICAgICAgICAgICAgIChyYypyZWQgKyBnYypncmVlbiArIGJjKmJsdWUpPj4xNV07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCAtIDEpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSByZWQgICA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbiA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBibHVlICA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAgICBpZiAocmVkICE9IGdyZWVuIHx8IHJlZCAhPSBibHVlKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7CisgICAgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgocmMqcmVkICsgZ2MqZ3JlZW4gKyBiYypibHVlKT4+MTUpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3AgLSAxKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZWxzZSAvKiBSR0IgYml0X2RlcHRoID09IDE2ICovCisgICAgICAgICB7CisjaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCisgICAgICAgICAgICBpZiAocG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByZWQsIGdyZWVuLCBibHVlLCB3OworCisgICAgICAgICAgICAgICAgICByZWQgICA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOworICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAocG5nX3VpbnRfMTYpKCgoKihzcCkpPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKKyAgICAgICAgICAgICAgICAgIGJsdWUgID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7CisKKyAgICAgICAgICAgICAgICAgIGlmIChyZWQgPT0gZ3JlZW4gJiYgcmVkID09IGJsdWUpCisgICAgICAgICAgICAgICAgICAgICB3ID0gcmVkOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgcmVkXzEgICA9IHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbKHJlZCYweGZmKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtyZWQ+PjhdOworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgZ3JlZW5fMSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsoZ3JlZW4mMHhmZikgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdF1bZ3JlZW4+PjhdOworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYmx1ZV8xICA9IHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbKGJsdWUmMHhmZikgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdF1bYmx1ZT4+OF07CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBncmF5MTYgID0gKHBuZ191aW50XzE2KSgocmMqcmVkXzEgKyBnYypncmVlbl8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiYypibHVlXzEpPj4xNSk7CisgICAgICAgICAgICAgICAgICAgICB3ID0gcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xWyhncmF5MTYmMHhmZikgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdF1bZ3JheTE2ID4+IDhdOworICAgICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKCh3Pj44KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkodyAmIDB4ZmYpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByZWQsIGdyZWVuLCBibHVlLCBncmF5MTY7CisKKyAgICAgICAgICAgICAgICAgIHJlZCAgID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7CisgICAgICAgICAgICAgICAgICBncmVlbiA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOworICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAocG5nX3VpbnRfMTYpKCgoKihzcCkpPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKKworICAgICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkKKyAgICAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOworICAgICAgICAgICAgICAgICAgZ3JheTE2ICA9IChwbmdfdWludF8xNikoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsKKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKChncmF5MTY+PjgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKShncmF5MTYgJiAweGZmKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICB7CisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgeworI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQorICAgICAgICAgICAgaWYgKHBuZ19wdHItPmdhbW1hX2Zyb21fMSAhPSBOVUxMICYmIHBuZ19wdHItPmdhbW1hX3RvXzEgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHJlZCAgID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKKyAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKKyAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGJsdWUgID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVsqKHNwKyspXTsKKyAgICAgICAgICAgICAgICAgIGlmIChyZWQgIT0gZ3JlZW4gfHwgcmVkICE9IGJsdWUpCisgICAgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAgcG5nX3B0ci0+Z2FtbWFfZnJvbV8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsocmMqcmVkICsgZ2MqZ3JlZW4gKyBiYypibHVlKT4+MTVdOworICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7ICAvKiBhbHBoYSAqLworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSByZWQgICA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbiA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBibHVlICA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAgICBpZiAocmVkICE9IGdyZWVuIHx8IHJlZCAhPSBibHVlKQorICAgICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7CisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gIChwbmdfYnl0ZSkoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsKKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOyAgLyogYWxwaGEgKi8KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgLyogUkdCQSBiaXRfZGVwdGggPT0gMTYgKi8KKyAgICAgICAgIHsKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5nYW1tYV8xNl90b18xICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzEgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHJlZCwgZ3JlZW4sIGJsdWUsIHc7CisKKyAgICAgICAgICAgICAgICAgIHJlZCAgID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7CisgICAgICAgICAgICAgICAgICBncmVlbiA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOworICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAocG5nX3VpbnRfMTYpKCgoKihzcCkpPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKKworICAgICAgICAgICAgICAgICAgaWYgKHJlZCA9PSBncmVlbiAmJiByZWQgPT0gYmx1ZSkKKyAgICAgICAgICAgICAgICAgICAgIHcgPSByZWQ7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByZWRfMSAgID0gcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsocmVkJjB4ZmYpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfc2hpZnRdW3JlZD4+OF07CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBncmVlbl8xID0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV8xNl90b18xWyhncmVlbiYweGZmKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmVlbj4+OF07CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBibHVlXzEgID0gcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsoYmx1ZSYweGZmKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtibHVlPj44XTsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGdyYXkxNiAgPSAocG5nX3VpbnRfMTYpKChyYyAqIHJlZF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBnYyAqIGdyZWVuXzEgKyBiYyAqIGJsdWVfMSk+PjE1KTsKKyAgICAgICAgICAgICAgICAgICAgIHcgPSBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzFbKGdyYXkxNiYweGZmKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmF5MTYgPj4gOF07CisgICAgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKHc+PjgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSh3ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsgIC8qIGFscGhhICovCisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93OworICAgICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgcmVkLCBncmVlbiwgYmx1ZSwgZ3JheTE2OworICAgICAgICAgICAgICAgICAgcmVkICAgPSAocG5nX3VpbnRfMTYpKCgqKHNwKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7CisgICAgICAgICAgICAgICAgICBncmVlbiA9IChwbmdfdWludF8xNikoKCooc3ApPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKKyAgICAgICAgICAgICAgICAgIGJsdWUgID0gKHBuZ191aW50XzE2KSgoKihzcCk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOworICAgICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkKKyAgICAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOworICAgICAgICAgICAgICAgICAgZ3JheTE2ICA9IChwbmdfdWludF8xNikoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsKKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKChncmF5MTY+PjgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKShncmF5MTYgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOyAgLyogYWxwaGEgKi8KKyAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgcm93X2luZm8tPmNoYW5uZWxzIC09IChwbmdfYnl0ZSkyOworICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgJj0gflBOR19DT0xPUl9NQVNLX0NPTE9SOworICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShyb3dfaW5mby0+Y2hhbm5lbHMgKgorICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCk7CisgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCByb3dfd2lkdGgpOworICAgfQorICAgcmV0dXJuIHJnYl9lcnJvcjsKK30KKyNlbmRpZgorCisvKiBCdWlsZCBhIGdyYXlzY2FsZSBwYWxldHRlLiAgUGFsZXR0ZSBpcyBhc3N1bWVkIHRvIGJlIDEgPDwgYml0X2RlcHRoCisgKiBsYXJnZSBvZiBwbmdfY29sb3IuICBUaGlzIGxldHMgZ3JheXNjYWxlIGltYWdlcyBiZSB0cmVhdGVkIGFzCisgKiBwYWxldHRlZC4gIE1vc3QgdXNlZnVsIGZvciBnYW1tYSBjb3JyZWN0aW9uIGFuZCBzaW1wbGlmaWNhdGlvbgorICogb2YgY29kZS4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZShpbnQgYml0X2RlcHRoLCBwbmdfY29sb3JwIHBhbGV0dGUpCit7CisgICBpbnQgbnVtX3BhbGV0dGU7CisgICBpbnQgY29sb3JfaW5jOworICAgaW50IGk7CisgICBpbnQgdjsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUiKTsKKworICAgaWYgKHBhbGV0dGUgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgc3dpdGNoIChiaXRfZGVwdGgpCisgICB7CisgICAgICBjYXNlIDE6CisgICAgICAgICBudW1fcGFsZXR0ZSA9IDI7CisgICAgICAgICBjb2xvcl9pbmMgPSAweGZmOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgIG51bV9wYWxldHRlID0gNDsKKyAgICAgICAgIGNvbG9yX2luYyA9IDB4NTU7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA0OgorICAgICAgICAgbnVtX3BhbGV0dGUgPSAxNjsKKyAgICAgICAgIGNvbG9yX2luYyA9IDB4MTE7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSA4OgorICAgICAgICAgbnVtX3BhbGV0dGUgPSAyNTY7CisgICAgICAgICBjb2xvcl9pbmMgPSAxOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBudW1fcGFsZXR0ZSA9IDA7CisgICAgICAgICBjb2xvcl9pbmMgPSAwOworICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIGZvciAoaSA9IDAsIHYgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKywgdiArPSBjb2xvcl9pbmMpCisgICB7CisgICAgICBwYWxldHRlW2ldLnJlZCA9IChwbmdfYnl0ZSl2OworICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IChwbmdfYnl0ZSl2OworICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gKHBuZ19ieXRlKXY7CisgICB9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY3VycmVudGx5IHVudXNlZC4gIERvIHdlIHJlYWxseSBuZWVkIGl0PyAqLworI2lmIGRlZmluZWQoUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRCkgJiYgXAorICBkZWZpbmVkKFBOR19DT1JSRUNUX1BBTEVUVEVfU1VQUE9SVEVEKQordm9pZCAvKiBQUklWQVRFICovCitwbmdfY29ycmVjdF9wYWxldHRlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb2xvcnAgcGFsZXR0ZSwKKyAgIGludCBudW1fcGFsZXR0ZSkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NvcnJlY3RfcGFsZXR0ZSIpOworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgJiYgXAorICAgIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSAmJiBcCisgIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0dBTU1BIHwgUE5HX0JBQ0tHUk9VTkQpKQorICAgeworICAgICAgcG5nX2NvbG9yIGJhY2ssIGJhY2tfMTsKKworICAgICAgaWYgKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFKQorICAgICAgeworICAgICAgICAgYmFjay5yZWQgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZF07CisgICAgICAgICBiYWNrLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbl07CisgICAgICAgICBiYWNrLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWVdOworCisgICAgICAgICBiYWNrXzEucmVkID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZF07CisgICAgICAgICBiYWNrXzEuZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPmJhY2tncm91bmQuZ3JlZW5dOworICAgICAgICAgYmFja18xLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPmJhY2tncm91bmQuYmx1ZV07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBkb3VibGUgZzsKKworICAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hICogcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKworICAgICAgICAgaWYgKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4KKyAgICAgICAgICAgICB8fCBmYWJzKGcgLSAxLjApIDwgUE5HX0dBTU1BX1RIUkVTSE9MRCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGJhY2sucmVkID0gcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7CisgICAgICAgICAgICBiYWNrLmdyZWVuID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbjsKKyAgICAgICAgICAgIGJhY2suYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGJhY2sucmVkID0KKyAgICAgICAgICAgICAgIChwbmdfYnl0ZSkocG93KChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQvMjU1LCBnKSAqCisgICAgICAgICAgICAgICAgMjU1LjAgKyAwLjUpOworICAgICAgICAgICAgYmFjay5ncmVlbiA9CisgICAgICAgICAgICAgICAocG5nX2J5dGUpKHBvdygoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4vMjU1LCBnKSAqCisgICAgICAgICAgICAgICAgMjU1LjAgKyAwLjUpOworICAgICAgICAgICAgYmFjay5ibHVlID0KKyAgICAgICAgICAgICAgIChwbmdfYnl0ZSkocG93KChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlLzI1NSwgZykgKgorICAgICAgICAgICAgICAgIDI1NS4wICsgMC41KTsKKyAgICAgICAgIH0KKworICAgICAgICAgZyA9IDEuMCAvIHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWE7CisKKyAgICAgICAgIGJhY2tfMS5yZWQgPQorICAgICAgICAgICAgKHBuZ19ieXRlKShwb3coKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZC8yNTUsIGcpICoKKyAgICAgICAgICAgICAyNTUuMCArIDAuNSk7CisgICAgICAgICBiYWNrXzEuZ3JlZW4gPQorICAgICAgICAgICAgKHBuZ19ieXRlKShwb3coKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuLzI1NSwgZykgKgorICAgICAgICAgICAgIDI1NS4wICsgMC41KTsKKyAgICAgICAgIGJhY2tfMS5ibHVlID0KKyAgICAgICAgICAgIChwbmdfYnl0ZSkocG93KChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlLzI1NSwgZykgKgorICAgICAgICAgICAgIDI1NS4wICsgMC41KTsKKyAgICAgIH0KKworICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocG5nX3VpbnRfMzIpbnVtX3BhbGV0dGU7IGkrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpIDwgcG5nX3B0ci0+bnVtX3RyYW5zICYmIHBuZ19wdHItPnRyYW5zW2ldID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwYWxldHRlW2ldID0gYmFjazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBwbmdfcHRyLT5udW1fdHJhbnMgJiYgcG5nX3B0ci0+dHJhbnNbaV0gIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHYsIHc7CisKKyAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPnBhbGV0dGVbaV0ucmVkXTsKKyAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgcG5nX3B0ci0+dHJhbnNbaV0sIGJhY2tfMS5yZWQpOworICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107CisKKyAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPnBhbGV0dGVbaV0uZ3JlZW5dOworICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBwbmdfcHRyLT50cmFuc1tpXSwgYmFja18xLmdyZWVuKTsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107CisKKyAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPnBhbGV0dGVbaV0uYmx1ZV07CisgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIHBuZ19wdHItPnRyYW5zW2ldLCBiYWNrXzEuYmx1ZSk7CisgICAgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0ucmVkXTsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmdyZWVuXTsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0uYmx1ZV07CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpbnQgaTsKKworICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFsZXR0ZVtpXS5yZWQgPT0gKHBuZ19ieXRlKXBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmF5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IGJhY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0ucmVkXTsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmdyZWVuXTsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0uYmx1ZV07CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR0FNTUEpCisgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCisgICAgICB7CisgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0ucmVkXTsKKyAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmdyZWVuXTsKKyAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0uYmx1ZV07CisgICAgICB9CisgICB9CisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICBwbmdfY29sb3IgYmFjazsKKworICAgICAgICAgYmFjay5yZWQgICA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZDsKKyAgICAgICAgIGJhY2suZ3JlZW4gPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbjsKKyAgICAgICAgIGJhY2suYmx1ZSAgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlOworCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClwbmdfcHRyLT5udW1fdHJhbnM7IGkrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc1tpXSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBiYWNrLnJlZDsKKyAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBiYWNrLmdyZWVuOworICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gYmFjay5ibHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+dHJhbnNbaV0gIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUocGFsZXR0ZVtpXS5yZWQsIHBuZ19wdHItPnBhbGV0dGVbaV0ucmVkLAorICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNbaV0sIGJhY2sucmVkKTsKKyAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUocGFsZXR0ZVtpXS5ncmVlbiwgcG5nX3B0ci0+cGFsZXR0ZVtpXS5ncmVlbiwKKyAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zW2ldLCBiYWNrLmdyZWVuKTsKKyAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUocGFsZXR0ZVtpXS5ibHVlLCBwbmdfcHRyLT5wYWxldHRlW2ldLmJsdWUsCisgICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc1tpXSwgYmFjay5ibHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgLyogQXNzdW1lIGdyYXlzY2FsZSBwYWxldHRlICh3aGF0IGVsc2UgY291bGQgaXQgYmU/KSAqLworICAgICAgeworICAgICAgICAgaW50IGk7CisKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPT0gKHBuZ19ieXRlKXBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmF5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7CisgICAgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW47CisgICAgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorI2VuZGlmCit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECisvKiBSZXBsYWNlIGFueSBhbHBoYSBvciB0cmFuc3BhcmVuY3kgd2l0aCB0aGUgc3VwcGxpZWQgYmFja2dyb3VuZCBjb2xvci4KKyAqICJiYWNrZ3JvdW5kIiBpcyBhbHJlYWR5IGluIHRoZSBzY3JlZW4gZ2FtbWEsIHdoaWxlICJiYWNrZ3JvdW5kXzEiIGlzCisgKiBhdCBhIGdhbW1hIG9mIDEuMC4gIFBhbGV0dGVkIGZpbGVzIGhhdmUgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX2JhY2tncm91bmQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfdmFsdWVzLCBwbmdfY29sb3JfMTZwIGJhY2tncm91bmQKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICwgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kXzEsCisgICBwbmdfYnl0ZXAgZ2FtbWFfdGFibGUsIHBuZ19ieXRlcCBnYW1tYV9mcm9tXzEsIHBuZ19ieXRlcCBnYW1tYV90b18xLAorICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNiwgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl9mcm9tXzEsCisgICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X3RvXzEsIGludCBnYW1tYV9zaGlmdAorI2VuZGlmCisgICApCit7CisgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgcG5nX3VpbnRfMzIgaTsKKyAgIHBuZ191aW50XzMyIHJvd193aWR0aD1yb3dfaW5mby0+d2lkdGg7CisgICBpbnQgc2hpZnQ7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2JhY2tncm91bmQiKTsKKworICAgaWYgKGJhY2tncm91bmQgIT0gTlVMTCAmJgorI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgICAgIHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYKKyNlbmRpZgorICAgICAgKCEocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgfHwKKyAgICAgIChyb3dfaW5mby0+Y29sb3JfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmIHRyYW5zX3ZhbHVlcykpKQorICAgeworICAgICAgc3dpdGNoIChyb3dfaW5mby0+Y29sb3JfdHlwZSkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgc2hpZnQgPSA3OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKChwbmdfdWludF8xNikoKCpzcCA+PiBzaGlmdCkgJiAweDAxKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gdHJhbnNfdmFsdWVzLT5ncmF5KQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnNwICY9IChwbmdfYnl0ZSkoKDB4N2Y3ZiA+PiAoNyAtIHNoaWZ0KSkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCB8PSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgPDwgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdC0tOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgIHsKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAgIGlmIChnYW1tYV90YWJsZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBuZ191aW50XzE2KSgoKnNwID4+IHNoaWZ0KSAmIDB4MDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gdHJhbnNfdmFsdWVzLT5ncmF5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwICY9IChwbmdfYnl0ZSkoKDB4M2YzZiA+PiAoNiAtIHNoaWZ0KSkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCB8PSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgPDwgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgcCA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzaGlmdCkgJiAweDAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGcgPSAocG5nX2J5dGUpKChnYW1tYV90YWJsZSBbcCB8IChwIDw8IDIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocCA8PCA0KSB8IChwIDw8IDYpXSA+PiA2KSAmIDB4MDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwICY9IChwbmdfYnl0ZSkoKDB4M2YzZiA+PiAoNiAtIHNoaWZ0KSkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCB8PSAocG5nX2J5dGUpKGcgPDwgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCAtPSAyOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG5nX3VpbnRfMTYpKCgqc3AgPj4gc2hpZnQpICYgMHgwMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSB0cmFuc192YWx1ZXMtPmdyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgJj0gKHBuZ19ieXRlKSgoMHgzZjNmID4+ICg2IC0gc2hpZnQpKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JheSA8PCBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RhYmxlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG5nX3VpbnRfMTYpKCgqc3AgPj4gc2hpZnQpICYgMHgwZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSB0cmFuc192YWx1ZXMtPmdyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgJj0gKHBuZ19ieXRlKSgoMHhmMGYgPj4gKDQgLSBzaGlmdCkpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgfD0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmF5IDw8IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHAgPSAocG5nX2J5dGUpKCgqc3AgPj4gc2hpZnQpICYgMHgwZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBnID0gKHBuZ19ieXRlKSgoZ2FtbWFfdGFibGVbcCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwIDw8IDQpXSA+PiA0KSAmIDB4MGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwICY9IChwbmdfYnl0ZSkoKDB4ZjBmID4+ICg0IC0gc2hpZnQpKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoZyA8PCBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDQ7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OworICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbmdfdWludF8xNikoKCpzcCA+PiBzaGlmdCkgJiAweDBmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHRyYW5zX3ZhbHVlcy0+Z3JheSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCAmPSAocG5nX2J5dGUpKCgweGYwZiA+PiAoNCAtIHNoaWZ0KSkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCB8PSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgPDwgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCAtPSA0OworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgIHsKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAgIGlmIChnYW1tYV90YWJsZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwKyspCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnNwID09IHRyYW5zX3ZhbHVlcy0+Z3JheSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmF5OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwKyspCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnNwID09IHRyYW5zX3ZhbHVlcy0+Z3JheSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmF5OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICB7CisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICBpZiAoZ2FtbWFfMTYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSAyKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKKworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IHRyYW5zX3ZhbHVlcy0+Z3JheSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgaXMgYWxyZWFkeSBpbiBzY3JlZW4gZ2FtbWEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPmdyYXkgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JheSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2Wyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gMikKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAocG5nX3VpbnRfMTYpKCgoKnNwKSA8PCA4KSArICooc3AgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSB0cmFuc192YWx1ZXMtPmdyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmF5ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOgorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmIChnYW1tYV90YWJsZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDMpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoKnNwID09IHRyYW5zX3ZhbHVlcy0+cmVkICYmCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPT0gdHJhbnNfdmFsdWVzLT5ncmVlbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID09IHRyYW5zX3ZhbHVlcy0+Ymx1ZSkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5yZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Z3JlZW47CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Ymx1ZTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSBnYW1tYV90YWJsZVsqKHNwICsgMSldOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gZ2FtbWFfdGFibGVbKihzcCArIDIpXTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDMpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoKnNwID09IHRyYW5zX3ZhbHVlcy0+cmVkICYmCisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPT0gdHJhbnNfdmFsdWVzLT5ncmVlbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID09IHRyYW5zX3ZhbHVlcy0+Ymx1ZSkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5yZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Z3JlZW47CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Ymx1ZTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovCisgICAgICAgICAgICB7CisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICAgICAgICAgICAgICBpZiAoZ2FtbWFfMTYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA2KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgciA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcgPSAocG5nX3VpbnRfMTYpKCgoKihzcCsyKSkgPDwgOCkgKyAqKHNwKzMpKTsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGIgPSAocG5nX3VpbnRfMTYpKCgoKihzcCs0KSkgPDwgOCkgKyAqKHNwKzUpKTsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IHRyYW5zX3ZhbHVlcy0+cmVkICYmIGcgPT0gdHJhbnNfdmFsdWVzLT5ncmVlbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYiA9PSB0cmFuc192YWx1ZXMtPmJsdWUpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5yZWQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+cmVkICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmVlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDMpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmVlbiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Ymx1ZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ibHVlICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDMpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgMildOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDIpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDMpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDUpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgNCldOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA2KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgciA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCsxKSk7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBnID0gKHBuZ191aW50XzE2KSgoKCooc3ArMikpIDw8IDgpICsgKihzcCszKSk7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBiID0gKHBuZ191aW50XzE2KSgoKCooc3ArNCkpIDw8IDgpICsgKihzcCs1KSk7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IHRyYW5zX3ZhbHVlcy0+cmVkICYmIGcgPT0gdHJhbnNfdmFsdWVzLT5ncmVlbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYiA9PSB0cmFuc192YWx1ZXMtPmJsdWUpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5yZWQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+cmVkICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmVlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDMpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmVlbiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDQpID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Ymx1ZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDUpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ibHVlICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOgorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmIChnYW1tYV90b18xICE9IE5VTEwgJiYgZ2FtbWFfZnJvbV8xICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICBkcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gMiwgZHArKykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGEgPSAqKHNwICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSBnYW1tYV90YWJsZVsqc3BdOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmdyYXk7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSB2LCB3OworCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfdG9fMVsqc3BdOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPmdyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gZ2FtbWFfZnJvbV8xW3ddOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSAyLCBkcCsrKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgYSA9ICooc3AgKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMHhmZikKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9ICpzcDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmF5OworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSgqZHAsICpzcCwgYSwgYmFja2dyb3VuZF8xLT5ncmF5KTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Z3JheTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDE2KSAqLworICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgaWYgKGdhbW1hXzE2ICE9IE5VTEwgJiYgZ2FtbWFfMTZfZnJvbV8xICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICBnYW1tYV8xNl90b18xICE9IE5VTEwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA0LCBkcCArPSAyKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYSA9IChwbmdfdWludF8xNikoKCgqKHNwKzIpKSA8PCA4KSArICooc3ArMykpOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAocG5nX3VpbnRfMTYpMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKKworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2Wyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Z3JheSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmF5ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBnLCB2LCB3OworCisgICAgICAgICAgICAgICAgICAgICAgICBnID0gZ2FtbWFfMTZfdG9fMVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGcsIGEsIGJhY2tncm91bmRfMS0+Z3JheSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gZ2FtbWFfMTZfZnJvbV8xWyh2JjB4ZmYpID4+IGdhbW1hX3NoaWZ0XVt2ID4+IDhdOworICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgodyA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKSh3ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICBkcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNCwgZHAgKz0gMikKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGEgPSAocG5nX3VpbnRfMTYpKCgoKihzcCsyKSkgPDwgOCkgKyAqKHNwKzMpKTsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IChwbmdfdWludF8xNikweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCBzcCwgMik7CisgICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmF5ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcsIHY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAocG5nX3VpbnRfMTYpKCgoKnNwKSA8PCA4KSArICooc3AgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGcsIGEsIGJhY2tncm91bmRfMS0+Z3JheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOgorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgIGlmIChnYW1tYV90b18xICE9IE5VTEwgJiYgZ2FtbWFfZnJvbV8xICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICAgICBkcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNCwgZHAgKz0gMykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGEgPSAqKHNwICsgMyk7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSBnYW1tYV90YWJsZVsqc3BdOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gZ2FtbWFfdGFibGVbKihzcCArIDEpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IGdhbW1hX3RhYmxlWyooc3AgKyAyKV07CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCisgICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+cmVkOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmdyZWVuOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmJsdWU7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSB2LCB3OworCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfdG9fMVsqc3BdOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPnJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSBnYW1tYV9mcm9tXzFbd107CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfdG9fMVsqKHNwICsgMSldOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPmdyZWVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IGdhbW1hX2Zyb21fMVt3XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV90b18xWyooc3AgKyAyKV07CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIGEsIGJhY2tncm91bmRfMS0+Ymx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMikgPSBnYW1tYV9mcm9tXzFbd107CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgZHAgPSByb3c7CisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDQsIGRwICs9IDMpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBhID0gKihzcCArIDMpOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAweGZmKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKnNwOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKihzcCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKihzcCArIDIpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPnJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmVlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ibHVlOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSgqZHAsICpzcCwgYSwgYmFja2dyb3VuZC0+cmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUoKihkcCArIDEpLCAqKHNwICsgMSksIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLT5ncmVlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKCooZHAgKyAyKSwgKihzcCArIDIpLCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC0+Ymx1ZSk7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLworICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgaWYgKGdhbW1hXzE2ICE9IE5VTEwgJiYgZ2FtbWFfMTZfZnJvbV8xICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICBnYW1tYV8xNl90b18xICE9IE5VTEwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA4LCBkcCArPSA2KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYSA9IChwbmdfdWludF8xNikoKChwbmdfdWludF8xNikoKihzcCArIDYpKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDgpICsgKHBuZ191aW50XzE2KSgqKHNwICsgNykpKTsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IChwbmdfdWludF8xNikweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2OworCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDMpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgMildOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDMpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDUpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgNCldOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDQpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDUpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCisgICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5yZWQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+cmVkICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMikgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmVlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDMpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmVlbiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDQpID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Ymx1ZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDUpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ibHVlICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2LCB3LCB4OworCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdG9fMVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHcsIHYsIGEsIGJhY2tncm91bmRfMS0+cmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBnYW1tYV8xNl9mcm9tXzFbKCh3JjB4ZmYpID4+IGdhbW1hX3NoaWZ0KV1bdyA+PiA4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKHggPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSkoeCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RvXzFbKihzcCArIDMpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgMildOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPmdyZWVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBnYW1tYV8xNl9mcm9tXzFbKCh3JjB4ZmYpID4+IGdhbW1hX3NoaWZ0KV1bdyA+PiA4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IChwbmdfYnl0ZSkoKHggPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAzKSA9IChwbmdfYnl0ZSkoeCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RvXzFbKihzcCArIDUpID4+IGdhbW1hX3NoaWZ0XVsqKHNwICsgNCldOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih3LCB2LCBhLCBiYWNrZ3JvdW5kXzEtPmJsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGdhbW1hXzE2X2Zyb21fMVsodyAmIDB4ZmYpID4+IGdhbW1hX3NoaWZ0XVt3ID4+IDhdOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDQpID0gKHBuZ19ieXRlKSgoeCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDUpID0gKHBuZ19ieXRlKSh4ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgICAgZHAgPSByb3c7CisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDgsIGRwICs9IDYpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhID0gKHBuZ191aW50XzE2KSgoKHBuZ191aW50XzE2KSgqKHNwICsgNikpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCA4KSArIChwbmdfdWludF8xNikoKihzcCArIDcpKSk7CisgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAocG5nX3VpbnRfMTYpMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX21lbWNweShkcCwgc3AsIDYpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+cmVkID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPnJlZCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Z3JlZW4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAzKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JlZW4gJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyA0KSA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPmJsdWUgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyA1KSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Ymx1ZSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKKworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgciA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDIpKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGIgPSAocG5nX3VpbnRfMTYpKCgoKihzcCArIDQpKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKihzcCArIDUpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih2LCByLCBhLCBiYWNrZ3JvdW5kLT5yZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGcsIGEsIGJhY2tncm91bmQtPmdyZWVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAzKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZV8xNih2LCBiLCBhLCBiYWNrZ3JvdW5kLT5ibHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyA0KSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyA1KSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQorICAgICAgeworICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgJj0gflBOR19DT0xPUl9NQVNLX0FMUEhBOworICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzLS07CisgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5jaGFubmVscyAqCisgICAgICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoKTsKKyAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIHJvd193aWR0aCk7CisgICAgICB9CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAorLyogR2FtbWEgY29ycmVjdCB0aGUgaW1hZ2UsIGF2b2lkaW5nIHRoZSBhbHBoYSBjaGFubmVsLiAgTWFrZSBzdXJlCisgKiB5b3UgZG8gdGhpcyBhZnRlciB5b3UgZGVhbCB3aXRoIHRoZSB0cmFuc3BhcmVuY3kgaXNzdWUgb24gZ3JheXNjYWxlCisgKiBvciBSR0IgaW1hZ2VzLiBJZiB5b3VyIGJpdCBkZXB0aCBpcyA4LCB1c2UgZ2FtbWFfdGFibGUsIGlmIGl0CisgKiBpcyAxNiwgdXNlIGdhbW1hXzE2X3RhYmxlIGFuZCBnYW1tYV9zaGlmdC4gIEJ1aWxkIHRoZXNlIHdpdGgKKyAqIGJ1aWxkX2dhbW1hX3RhYmxlKCkuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX2dhbW1hKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICBwbmdfYnl0ZXAgZ2FtbWFfdGFibGUsIHBuZ191aW50XzE2cHAgZ2FtbWFfMTZfdGFibGUsCisgICBpbnQgZ2FtbWFfc2hpZnQpCit7CisgICBwbmdfYnl0ZXAgc3A7CisgICBwbmdfdWludF8zMiBpOworICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZ2FtbWEiKTsKKworICAgaWYgKAorI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgICAgIHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYKKyNlbmRpZgorICAgICAgICgocm93X2luZm8tPmJpdF9kZXB0aCA8PSA4ICYmIGdhbW1hX3RhYmxlICE9IE5VTEwpIHx8CisgICAgICAgIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2ICYmIGdhbW1hXzE2X3RhYmxlICE9IE5VTEwpKSkKKyAgIHsKKyAgICAgIHN3aXRjaCAocm93X2luZm8tPmNvbG9yX3R5cGUpCisgICAgICB7CisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07CisgICAgICAgICAgICAgICAgICBzcCsrOworICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKKyAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHY7CisKKyAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07CisgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgIHNwICs9IDI7CisgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICBzcCArPSAyOworICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07CisgICAgICAgICAgICAgICAgICBzcCsrOworICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKKyAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICBzcCArPSAyOworICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKKyAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKKyAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07CisgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgIHNwICs9IDQ7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOgorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93OworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKKyAgICAgICAgICAgICAgICAgIHNwICs9IDI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICBzcCArPSA0OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkgKz0gNCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGludCBhID0gKnNwICYgMHhjMDsKKyAgICAgICAgICAgICAgICAgIGludCBiID0gKnNwICYgMHgzMDsKKyAgICAgICAgICAgICAgICAgIGludCBjID0gKnNwICYgMHgwYzsKKyAgICAgICAgICAgICAgICAgIGludCBkID0gKnNwICYgMHgwMzsKKworICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgKKyAgICAgICAgICAgICAgICAgICAgICAoKCgoaW50KWdhbW1hX3RhYmxlW2F8KGE+PjIpfChhPj40KXwoYT4+NildKSAgICkgJiAweGMwKXwKKyAgICAgICAgICAgICAgICAgICAgICAoKCgoaW50KWdhbW1hX3RhYmxlWyhiPDwyKXxifChiPj4yKXwoYj4+NCldKT4+MikgJiAweDMwKXwKKyAgICAgICAgICAgICAgICAgICAgICAoKCgoaW50KWdhbW1hX3RhYmxlWyhjPDw0KXwoYzw8Mil8Y3woYz4+MildKT4+NCkgJiAweDBjKXwKKyAgICAgICAgICAgICAgICAgICAgICAoKCgoaW50KWdhbW1hX3RhYmxlWyhkPDw2KXwoZDw8NCl8KGQ8PDIpfGRdKT4+NikgKSk7CisgICAgICAgICAgICAgICAgICBzcCsrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpICs9IDIpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbnQgbXNiID0gKnNwICYgMHhmMDsKKyAgICAgICAgICAgICAgICAgIGludCBsc2IgPSAqc3AgJiAweDBmOworCisgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCgoKGludClnYW1tYV90YWJsZVttc2IgfCAobXNiID4+IDQpXSkgJiAweGYwKQorICAgICAgICAgICAgICAgICAgICAgIHwgKCgoaW50KWdhbW1hX3RhYmxlWyhsc2IgPDwgNCkgfCBsc2JdKSA+PiA0KSk7CisgICAgICAgICAgICAgICAgICBzcCsrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07CisgICAgICAgICAgICAgICAgICBzcCsrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOworICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICBzcCArPSAyOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKy8qIEV4cGFuZHMgYSBwYWxldHRlIHJvdyB0byBhbiBSR0Igb3IgUkdCQSByb3cgZGVwZW5kaW5nCisgKiB1cG9uIHdoZXRoZXIgeW91IHN1cHBseSB0cmFucyBhbmQgbnVtX3RyYW5zLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19leHBhbmRfcGFsZXR0ZShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAorICAgcG5nX2NvbG9ycCBwYWxldHRlLCBwbmdfYnl0ZXAgdHJhbnMsIGludCBudW1fdHJhbnMpCit7CisgICBpbnQgc2hpZnQsIHZhbHVlOworICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgIHBuZ191aW50XzMyIGk7CisgICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19leHBhbmRfcGFsZXR0ZSIpOworCisgICBpZiAoCisjaWZkZWYgUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVECisgICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoIDwgOCkKKyAgICAgIHsKKyAgICAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfd2lkdGggLSAxKSA+PiAzKTsKKyAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgICAgIHNoaWZ0ID0gNyAtIChpbnQpKChyb3dfd2lkdGggKyA3KSAmIDB4MDcpOworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCgqc3AgPj4gc2hpZnQpICYgMHgwMSkKKyAgICAgICAgICAgICAgICAgICAgICpkcCA9IDE7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAqZHAgPSAwOworICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDcpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgc2hpZnQrKzsKKworICAgICAgICAgICAgICAgICAgZHAtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMik7CisgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7CisgICAgICAgICAgICAgICBzaGlmdCA9IChpbnQpKCgzIC0gKChyb3dfd2lkdGggKyAzKSAmIDB4MDMpKSA8PCAxKTsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweDAzOworICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXZhbHVlOworICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDYpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMjsKKworICAgICAgICAgICAgICAgICAgZHAtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMSk7CisgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7CisgICAgICAgICAgICAgICBzaGlmdCA9IChpbnQpKChyb3dfd2lkdGggJiAweDAxKSA8PCAyKTsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweDBmOworICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXZhbHVlOworICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gNDsKKworICAgICAgICAgICAgICAgICAgZHAtLTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7CisgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSA4OworICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoOworICAgICAgfQorICAgICAgc3dpdGNoIChyb3dfaW5mby0+Yml0X2RlcHRoKQorICAgICAgeworICAgICAgICAgY2FzZSA4OgorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHRyYW5zICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7CisgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KShyb3dfd2lkdGggPDwgMikgLSAxOworCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoKGludCkoKnNwKSA+PSBudW1fdHJhbnMpCisgICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IHRyYW5zWypzcF07CisgICAgICAgICAgICAgICAgICAqZHAtLSA9IHBhbGV0dGVbKnNwXS5ibHVlOworICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0uZ3JlZW47CisgICAgICAgICAgICAgICAgICAqZHAtLSA9IHBhbGV0dGVbKnNwXS5yZWQ7CisgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7CisgICAgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7CisgICAgICAgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IDY7CisgICAgICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkocm93X3dpZHRoICogMykgLSAxOworCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAqZHAtLSA9IHBhbGV0dGVbKnNwXS5ibHVlOworICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0uZ3JlZW47CisgICAgICAgICAgICAgICAgICAqZHAtLSA9IHBhbGV0dGVbKnNwXS5yZWQ7CisgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gODsKKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDI0OworICAgICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogMzsKKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gMjsKKyAgICAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKworLyogSWYgdGhlIGJpdCBkZXB0aCA8IDgsIGl0IGlzIGV4cGFuZGVkIHRvIDguICBBbHNvLCBpZiB0aGUgYWxyZWFkeQorICogZXhwYW5kZWQgdHJhbnNwYXJlbmN5IHZhbHVlIGlzIHN1cHBsaWVkLCBhbiBhbHBoYSBjaGFubmVsIGlzIGJ1aWx0LgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19leHBhbmQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfdmFsdWUpCit7CisgICBpbnQgc2hpZnQsIHZhbHVlOworICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgIHBuZ191aW50XzMyIGk7CisgICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19leHBhbmQiKTsKKworI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwpCisjZW5kaWYKKyAgIHsKKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgICAgeworICAgICAgICAgcG5nX3VpbnRfMTYgZ3JheSA9IChwbmdfdWludF8xNikodHJhbnNfdmFsdWUgPyB0cmFuc192YWx1ZS0+Z3JheSA6IDApOworCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCisgICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5iaXRfZGVwdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBncmF5ID0gKHBuZ191aW50XzE2KSgoZ3JheSYweDAxKSoweGZmKTsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfd2lkdGggLSAxKSA+PiAzKTsKKyAgICAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNyAtIChpbnQpKChyb3dfd2lkdGggKyA3KSAmIDB4MDcpOworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKCgqc3AgPj4gc2hpZnQpICYgMHgwMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IDB4ZmY7CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAwOworICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDcpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQrKzsKKworICAgICAgICAgICAgICAgICAgICAgZHAtLTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBncmF5ID0gKHBuZ191aW50XzE2KSgoZ3JheSYweDAzKSoweDU1KTsKKyAgICAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfd2lkdGggLSAxKSA+PiAyKTsKKyAgICAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gKGludCkoKDMgLSAoKHJvd193aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+IHNoaWZ0KSAmIDB4MDM7CisgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKHZhbHVlIHwgKHZhbHVlIDw8IDIpIHwgKHZhbHVlIDw8IDQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8PCA2KSk7CisgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNikKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwLS07CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCArPSAyOworCisgICAgICAgICAgICAgICAgICAgICBkcC0tOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdyYXkgPSAocG5nX3VpbnRfMTYpKChncmF5JjB4MGYpKjB4MTEpOworICAgICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDEpOworICAgICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgoMSAtICgocm93X3dpZHRoICsgMSkgJiAweDAxKSkgPDwgMik7CisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkodmFsdWUgfCAodmFsdWUgPDwgNCkpOworICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDQpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OworCisgICAgICAgICAgICAgICAgICAgICBkcC0tOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4OworICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gODsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aDsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHRyYW5zX3ZhbHVlICE9IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZ3JheSA9IGdyYXkgJiAweGZmOworICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOworICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkocm93X3dpZHRoIDw8IDEpIC0gMTsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gZ3JheSkKKyAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsKKyAgICAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBncmF5X2hpZ2ggPSAoZ3JheSA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBncmF5X2xvdyA9IGdyYXkgJiAweGZmOworICAgICAgICAgICAgICAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXMgLSAxOworICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocm93X2luZm8tPnJvd2J5dGVzIDw8IDEpIC0gMTsKKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICgqKHNwIC0gMSkgPT0gZ3JheV9oaWdoICYmICooc3ApID09IGdyYXlfbG93KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAwOworICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAwOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOworICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKKyAgICAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQTsKKyAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDI7CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5iaXRfZGVwdGggPDwgMSk7CisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLAorICAgICAgICAgICAgICAgcm93X3dpZHRoKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiAmJiB0cmFuc192YWx1ZSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZSByZWQgPSB0cmFuc192YWx1ZS0+cmVkICYgMHhmZjsKKyAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuID0gdHJhbnNfdmFsdWUtPmdyZWVuICYgMHhmZjsKKyAgICAgICAgICAgIHBuZ19ieXRlIGJsdWUgPSB0cmFuc192YWx1ZS0+Ymx1ZSAmIDB4ZmY7CisgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd19pbmZvLT5yb3dieXRlcyAtIDE7CisgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KShyb3dfd2lkdGggPDwgMikgLSAxOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCooc3AgLSAyKSA9PSByZWQgJiYgKihzcCAtIDEpID09IGdyZWVuICYmICooc3ApID09IGJsdWUpCisgICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7CisgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOworICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKKyAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGUgcmVkX2hpZ2ggPSAodHJhbnNfdmFsdWUtPnJlZCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbl9oaWdoID0gKHRyYW5zX3ZhbHVlLT5ncmVlbiA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBwbmdfYnl0ZSBibHVlX2hpZ2ggPSAodHJhbnNfdmFsdWUtPmJsdWUgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgcG5nX2J5dGUgcmVkX2xvdyA9IHRyYW5zX3ZhbHVlLT5yZWQgJiAweGZmOworICAgICAgICAgICAgcG5nX2J5dGUgZ3JlZW5fbG93ID0gdHJhbnNfdmFsdWUtPmdyZWVuICYgMHhmZjsKKyAgICAgICAgICAgIHBuZ19ieXRlIGJsdWVfbG93ID0gdHJhbnNfdmFsdWUtPmJsdWUgJiAweGZmOworICAgICAgICAgICAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXMgLSAxOworICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkocm93X3dpZHRoIDw8IDMpIC0gMTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmICgqKHNwIC0gNSkgPT0gcmVkX2hpZ2ggJiYKKyAgICAgICAgICAgICAgICAgICooc3AgLSA0KSA9PSByZWRfbG93ICYmCisgICAgICAgICAgICAgICAgICAqKHNwIC0gMykgPT0gZ3JlZW5faGlnaCAmJgorICAgICAgICAgICAgICAgICAgKihzcCAtIDIpID09IGdyZWVuX2xvdyAmJgorICAgICAgICAgICAgICAgICAgKihzcCAtIDEpID09IGJsdWVfaGlnaCAmJgorICAgICAgICAgICAgICAgICAgKihzcCAgICApID09IGJsdWVfbG93KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKmRwLS0gPSAwOworICAgICAgICAgICAgICAgICAgKmRwLS0gPSAwOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOworICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKKyAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07CisgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOworICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKKyAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07CisgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE7CisgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSA0OworICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShyb3dfaW5mby0+Yml0X2RlcHRoIDw8IDIpOworICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsKKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fZGl0aGVyKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCisgICAgcG5nX2J5dGVwIHBhbGV0dGVfbG9va3VwLCBwbmdfYnl0ZXAgZGl0aGVyX2xvb2t1cCkKK3sKKyAgIHBuZ19ieXRlcCBzcCwgZHA7CisgICBwbmdfdWludF8zMiBpOworICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZGl0aGVyIik7CisKKyNpZmRlZiBQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQKKyAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQorI2VuZGlmCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCICYmCisgICAgICAgICBwYWxldHRlX2xvb2t1cCAmJiByb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICB7CisgICAgICAgICBpbnQgciwgZywgYiwgcDsKKyAgICAgICAgIHNwID0gcm93OworICAgICAgICAgZHAgPSByb3c7CisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICByID0gKnNwKys7CisgICAgICAgICAgICBnID0gKnNwKys7CisgICAgICAgICAgICBiID0gKnNwKys7CisKKyAgICAgICAgICAgIC8qIFRoaXMgbG9va3MgcmVhbCBtZXNzeSwgYnV0IHRoZSBjb21waWxlciB3aWxsIHJlZHVjZQorICAgICAgICAgICAgICogaXQgZG93biB0byBhIHJlYXNvbmFibGUgZm9ybXVsYS4gIEZvciBleGFtcGxlLCB3aXRoCisgICAgICAgICAgICAgKiA1IGJpdHMgcGVyIGNvbG9yLCB3ZSBnZXQ6CisgICAgICAgICAgICAgKiBwID0gKCgociA+PiAzKSAmIDB4MWYpIDw8IDEwKSB8CisgICAgICAgICAgICAgKiAgICAoKChnID4+IDMpICYgMHgxZikgPDwgNSkgfAorICAgICAgICAgICAgICogICAgKChiID4+IDMpICYgMHgxZik7CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHAgPSAoKChyID4+ICg4IC0gUE5HX0RJVEhFUl9SRURfQklUUykpICYKKyAgICAgICAgICAgICAgICgoMSA8PCBQTkdfRElUSEVSX1JFRF9CSVRTKSAtIDEpKSA8PAorICAgICAgICAgICAgICAgKFBOR19ESVRIRVJfR1JFRU5fQklUUyArIFBOR19ESVRIRVJfQkxVRV9CSVRTKSkgfAorICAgICAgICAgICAgICAgKCgoZyA+PiAoOCAtIFBOR19ESVRIRVJfR1JFRU5fQklUUykpICYKKyAgICAgICAgICAgICAgICgoMSA8PCBQTkdfRElUSEVSX0dSRUVOX0JJVFMpIC0gMSkpIDw8CisgICAgICAgICAgICAgICAoUE5HX0RJVEhFUl9CTFVFX0JJVFMpKSB8CisgICAgICAgICAgICAgICAoKGIgPj4gKDggLSBQTkdfRElUSEVSX0JMVUVfQklUUykpICYKKyAgICAgICAgICAgICAgICgoMSA8PCBQTkdfRElUSEVSX0JMVUVfQklUUykgLSAxKSk7CisKKyAgICAgICAgICAgICpkcCsrID0gcGFsZXR0ZV9sb29rdXBbcF07CisgICAgICAgICB9CisgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEU7CisgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAxOworICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gcm93X2luZm8tPmJpdF9kZXB0aDsKKyAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIHJvd193aWR0aCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEgJiYKKyAgICAgICAgIHBhbGV0dGVfbG9va3VwICE9IE5VTEwgJiYgcm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgeworICAgICAgICAgaW50IHIsIGcsIGIsIHA7CisgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgIGRwID0gcm93OworICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgciA9ICpzcCsrOworICAgICAgICAgICAgZyA9ICpzcCsrOworICAgICAgICAgICAgYiA9ICpzcCsrOworICAgICAgICAgICAgc3ArKzsKKworICAgICAgICAgICAgcCA9ICgoKHIgPj4gKDggLSBQTkdfRElUSEVSX1JFRF9CSVRTKSkgJgorICAgICAgICAgICAgICAgKCgxIDw8IFBOR19ESVRIRVJfUkVEX0JJVFMpIC0gMSkpIDw8CisgICAgICAgICAgICAgICAoUE5HX0RJVEhFUl9HUkVFTl9CSVRTICsgUE5HX0RJVEhFUl9CTFVFX0JJVFMpKSB8CisgICAgICAgICAgICAgICAoKChnID4+ICg4IC0gUE5HX0RJVEhFUl9HUkVFTl9CSVRTKSkgJgorICAgICAgICAgICAgICAgKCgxIDw8IFBOR19ESVRIRVJfR1JFRU5fQklUUykgLSAxKSkgPDwKKyAgICAgICAgICAgICAgIChQTkdfRElUSEVSX0JMVUVfQklUUykpIHwKKyAgICAgICAgICAgICAgICgoYiA+PiAoOCAtIFBOR19ESVRIRVJfQkxVRV9CSVRTKSkgJgorICAgICAgICAgICAgICAgKCgxIDw8IFBOR19ESVRIRVJfQkxVRV9CSVRTKSAtIDEpKTsKKworICAgICAgICAgICAgKmRwKysgPSBwYWxldHRlX2xvb2t1cFtwXTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURTsKKyAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDE7CisgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSByb3dfaW5mby0+Yml0X2RlcHRoOworICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKKyAgICAgICAgIGRpdGhlcl9sb29rdXAgJiYgcm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgeworICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwKyspCisgICAgICAgICB7CisgICAgICAgICAgICAqc3AgPSBkaXRoZXJfbG9va3VwWypzcF07CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKK3N0YXRpYyBQTkdfQ09OU1QgaW50IHBuZ19nYW1tYV9zaGlmdFtdID0KKyAgIHsweDEwLCAweDIxLCAweDQyLCAweDg0LCAweDExMCwgMHgyNDgsIDB4NTUwLCAweGZmMCwgMHgwMH07CisKKy8qIFdlIGJ1aWxkIHRoZSA4LSBvciAxNi1iaXQgZ2FtbWEgdGFibGVzIGhlcmUuICBOb3RlIHRoYXQgZm9yIDE2LWJpdAorICogdGFibGVzLCB3ZSBkb24ndCBtYWtlIGEgZnVsbCB0YWJsZSBpZiB3ZSBhcmUgcmVkdWNpbmcgdG8gOC1iaXQgaW4KKyAqIHRoZSBmdXR1cmUuICBOb3RlIGFsc28gaG93IHRoZSBnYW1tYV8xNiB0YWJsZXMgYXJlIHNlZ21lbnRlZCBzbyB0aGF0CisgKiB3ZSBkb24ndCBuZWVkIHRvIGFsbG9jYXRlID4gNjRLIGNodW5rcyBmb3IgYSBmdWxsIDE2LWJpdCB0YWJsZS4KKyAqCisgKiBTZWUgdGhlIFBORyBleHRlbnNpb25zIGRvY3VtZW50IGZvciBhbiBpbnRlZ2VyIGFsZ29yaXRobSBmb3IgY3JlYXRpbmcKKyAqIHRoZSBnYW1tYSB0YWJsZXMuICBNYXliZSB3ZSB3aWxsIGltcGxlbWVudCB0aGF0IGhlcmUgc29tZWRheS4KKyAqCisgKiBXZSBzaG91bGQgb25seSByZWFjaCB0aGlzIHBvaW50IGlmCisgKgorICogICAgICB0aGUgZmlsZV9nYW1tYSBpcyBrbm93biAoaS5lLiwgdGhlIGdBTUEgb3Igc1JHQiBjaHVuayBpcyBwcmVzZW50LAorICogICAgICBvciB0aGUgYXBwbGljYXRpb24gaGFzIHByb3ZpZGVkIGEgZmlsZV9nYW1tYSkKKyAqCisgKiAgIEFORAorICogICAgICB7CisgKiAgICAgICAgIHRoZSBzY3JlZW5fZ2FtbWEgaXMga25vd24KKyAqICAgICAgT1IKKyAqCisgKiAgICAgICAgIFJHQl90b19ncmF5IHRyYW5zZm9ybWF0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZAorICogICAgICB9CisgKgorICogICBBTkQKKyAqICAgICAgeworICogICAgICAgICB0aGUgc2NyZWVuX2dhbW1hIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZWNpcHJvY2FsIG9mIHRoZQorICogICAgICAgICBmaWxlX2dhbW1hIGJ5IG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkIHRocmVzaG9sZAorICoKKyAqICAgICAgT1IKKyAqCisgKiAgICAgICAgIGEgYmFja2dyb3VuZCBjb2xvciBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIHRoZSBmaWxlX2dhbW1hCisgKiAgICAgICAgIGFuZCBzY3JlZW5fZ2FtbWEgYXJlIG5vdCAxLjAsIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRocmVzaG9sZC4KKyAqICAgICAgfQorICovCisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2J1aWxkX2dhbW1hX3RhYmxlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2J1aWxkX2dhbW1hX3RhYmxlIik7CisKKyAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA8PSA4KQorICB7CisgICAgIGludCBpOworICAgICBkb3VibGUgZzsKKworICAgICBpZiAocG5nX3B0ci0+c2NyZWVuX2dhbW1hID4gLjAwMDAwMSkKKyAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5nYW1tYSAqIHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7CisKKyAgICAgZWxzZQorICAgICAgICBnID0gMS4wOworCisgICAgIHBuZ19wdHItPmdhbW1hX3RhYmxlID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgIChwbmdfdWludF8zMikyNTYpOworCisgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgeworICAgICAgICBwbmdfcHRyLT5nYW1tYV90YWJsZVtpXSA9IChwbmdfYnl0ZSkocG93KChkb3VibGUpaSAvIDI1NS4wLAorICAgICAgICAgICBnKSAqIDI1NS4wICsgLjUpOworICAgICB9CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fCBcCisgICBkZWZpbmVkKFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRCkKKyAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmICgoUE5HX0JBQ0tHUk9VTkQpIHwgUE5HX1JHQl9UT19HUkFZKSkKKyAgICAgeworCisgICAgICAgIGcgPSAxLjAgLyAocG5nX3B0ci0+Z2FtbWEpOworCisgICAgICAgIHBuZ19wdHItPmdhbW1hX3RvXzEgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgKHBuZ191aW50XzMyKTI1Nik7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3RvXzFbaV0gPSAocG5nX2J5dGUpKHBvdygoZG91YmxlKWkgLyAyNTUuMCwKKyAgICAgICAgICAgICAgZykgKiAyNTUuMCArIC41KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcG5nX3B0ci0+Z2FtbWFfZnJvbV8xID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgIChwbmdfdWludF8zMikyNTYpOworCisgICAgICAgIGlmIChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAwLjAwMDAwMSkKKyAgICAgICAgICAgZyA9IDEuMCAvIHBuZ19wdHItPnNjcmVlbl9nYW1tYTsKKworICAgICAgICBlbHNlCisgICAgICAgICAgIGcgPSBwbmdfcHRyLT5nYW1tYTsgICAvKiBQcm9iYWJseSBkb2luZyByZ2JfdG9fZ3JheSAqLworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbaV0gPSAocG5nX2J5dGUpKHBvdygoZG91YmxlKWkgLyAyNTUuMCwKKyAgICAgICAgICAgICAgZykgKiAyNTUuMCArIC41KTsKKworICAgICAgICB9CisgICAgIH0KKyNlbmRpZiAvKiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCB8fCBQTkdfUkdCX1RPX0dSQVlfU1VQUE9SVEVEICovCisgIH0KKyAgZWxzZQorICB7CisgICAgIGRvdWJsZSBnOworICAgICBpbnQgaSwgaiwgc2hpZnQsIG51bTsKKyAgICAgaW50IHNpZ19iaXQ7CisgICAgIHBuZ191aW50XzMyIGlnOworCisgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCisgICAgIHsKKyAgICAgICAgc2lnX2JpdCA9IChpbnQpcG5nX3B0ci0+c2lnX2JpdC5yZWQ7CisKKyAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+c2lnX2JpdC5ncmVlbiA+IHNpZ19iaXQpCisgICAgICAgICAgIHNpZ19iaXQgPSBwbmdfcHRyLT5zaWdfYml0LmdyZWVuOworCisgICAgICAgIGlmICgoaW50KXBuZ19wdHItPnNpZ19iaXQuYmx1ZSA+IHNpZ19iaXQpCisgICAgICAgICAgIHNpZ19iaXQgPSBwbmdfcHRyLT5zaWdfYml0LmJsdWU7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgIHNpZ19iaXQgPSAoaW50KXBuZ19wdHItPnNpZ19iaXQuZ3JheTsKKyAgICAgfQorCisgICAgIGlmIChzaWdfYml0ID4gMCkKKyAgICAgICAgc2hpZnQgPSAxNiAtIHNpZ19iaXQ7CisKKyAgICAgZWxzZQorICAgICAgICBzaGlmdCA9IDA7CisKKyAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR18xNl9UT184KQorICAgICB7CisgICAgICAgIGlmIChzaGlmdCA8ICgxNiAtIFBOR19NQVhfR0FNTUFfOCkpCisgICAgICAgICAgIHNoaWZ0ID0gKDE2IC0gUE5HX01BWF9HQU1NQV84KTsKKyAgICAgfQorCisgICAgIGlmIChzaGlmdCA+IDgpCisgICAgICAgIHNoaWZ0ID0gODsKKworICAgICBpZiAoc2hpZnQgPCAwKQorICAgICAgICBzaGlmdCA9IDA7CisKKyAgICAgcG5nX3B0ci0+Z2FtbWFfc2hpZnQgPSAocG5nX2J5dGUpc2hpZnQ7CisKKyAgICAgbnVtID0gKDEgPDwgKDggLSBzaGlmdCkpOworCisgICAgIGlmIChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAuMDAwMDAxKQorICAgICAgICBnID0gMS4wIC8gKHBuZ19wdHItPmdhbW1hICogcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKKyAgICAgZWxzZQorICAgICAgICBnID0gMS4wOworCisgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlID0gKHBuZ191aW50XzE2cHApcG5nX2NhbGxvYyhwbmdfcHRyLAorICAgICAgICAocG5nX3VpbnRfMzIpKG51bSAqIHBuZ19zaXplb2YocG5nX3VpbnRfMTZwKSkpOworCisgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HXzE2X1RPXzggfCBQTkdfQkFDS0dST1VORCkpCisgICAgIHsKKyAgICAgICAgZG91YmxlIGZpbiwgZm91dDsKKyAgICAgICAgcG5nX3VpbnRfMzIgbGFzdCwgbWF4OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKyAgICAgICAgeworICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZVtpXSA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKDI1NiAqIHBuZ19zaXplb2YocG5nX3VpbnRfMTYpKSk7CisgICAgICAgIH0KKworICAgICAgICBnID0gMS4wIC8gZzsKKyAgICAgICAgbGFzdCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICBmb3V0ID0gKChkb3VibGUpaSArIDAuNSkgLyAyNTYuMDsKKyAgICAgICAgICAgZmluID0gcG93KGZvdXQsIGcpOworICAgICAgICAgICBtYXggPSAocG5nX3VpbnRfMzIpKGZpbiAqIChkb3VibGUpKChwbmdfdWludF8zMiludW0gPDwgOCkpOworICAgICAgICAgICB3aGlsZSAobGFzdCA8PSBtYXgpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGVbKGludCkobGFzdCAmICgweGZmID4+IHNoaWZ0KSldCisgICAgICAgICAgICAgICAgIFsoaW50KShsYXN0ID4+ICg4IC0gc2hpZnQpKV0gPSAocG5nX3VpbnRfMTYpKAorICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMTYpaSB8ICgocG5nX3VpbnRfMTYpaSA8PCA4KSk7CisgICAgICAgICAgICAgIGxhc3QrKzsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChsYXN0IDwgKChwbmdfdWludF8zMiludW0gPDwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGVbKGludCkobGFzdCAmICgweGZmID4+IHNoaWZ0KSldCisgICAgICAgICAgICAgIFsoaW50KShsYXN0ID4+ICg4IC0gc2hpZnQpKV0gPSAocG5nX3VpbnRfMTYpNjU1MzVMOworICAgICAgICAgICBsYXN0Kys7CisgICAgICAgIH0KKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlW2ldID0gKHBuZ191aW50XzE2cClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAgIChwbmdfdWludF8zMikoMjU2ICogcG5nX3NpemVvZihwbmdfdWludF8xNikpKTsKKworICAgICAgICAgICBpZyA9ICgoKHBuZ191aW50XzMyKWkgKiAocG5nX3VpbnRfMzIpcG5nX2dhbW1hX3NoaWZ0W3NoaWZ0XSkgPj4gNCk7CisKKyAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlW2ldW2pdID0KKyAgICAgICAgICAgICAgICAgKHBuZ191aW50XzE2KShwb3coKGRvdWJsZSkoaWcgKyAoKHBuZ191aW50XzMyKWogPDwgOCkpIC8KKyAgICAgICAgICAgICAgICAgICAgNjU1MzUuMCwgZykgKiA2NTUzNS4wICsgLjUpOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgfQorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHwgXAorICAgZGVmaW5lZChQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQpCisgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0JBQ0tHUk9VTkQgfCBQTkdfUkdCX1RPX0dSQVkpKQorICAgICB7CisKKyAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5nYW1tYSk7CisKKyAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSA9IChwbmdfdWludF8xNnBwKXBuZ19jYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgKHBuZ191aW50XzMyKShudW0gKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2cCApKSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbaV0gPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgICAgKHBuZ191aW50XzMyKSgyNTYgKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSkpOworCisgICAgICAgICAgIGlnID0gKCgocG5nX3VpbnRfMzIpaSAqCisgICAgICAgICAgICAgIChwbmdfdWludF8zMilwbmdfZ2FtbWFfc2hpZnRbc2hpZnRdKSA+PiA0KTsKKyAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbaV1bal0gPQorICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMTYpKHBvdygoZG91YmxlKShpZyArICgocG5nX3VpbnRfMzIpaiA8PCA4KSkgLworICAgICAgICAgICAgICAgICAgICA2NTUzNS4wLCBnKSAqIDY1NTM1LjAgKyAuNSk7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAwLjAwMDAwMSkKKyAgICAgICAgICAgZyA9IDEuMCAvIHBuZ19wdHItPnNjcmVlbl9nYW1tYTsKKworICAgICAgICBlbHNlCisgICAgICAgICAgIGcgPSBwbmdfcHRyLT5nYW1tYTsgICAvKiBQcm9iYWJseSBkb2luZyByZ2JfdG9fZ3JheSAqLworCisgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSA9IChwbmdfdWludF8xNnBwKXBuZ19jYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgKHBuZ191aW50XzMyKShudW0gKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2cCkpKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xW2ldID0gKHBuZ191aW50XzE2cClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAgIChwbmdfdWludF8zMikoMjU2ICogcG5nX3NpemVvZihwbmdfdWludF8xNikpKTsKKworICAgICAgICAgICBpZyA9ICgoKHBuZ191aW50XzMyKWkgKgorICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpcG5nX2dhbW1hX3NoaWZ0W3NoaWZ0XSkgPj4gNCk7CisKKyAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMVtpXVtqXSA9CisgICAgICAgICAgICAgICAgIChwbmdfdWludF8xNikocG93KChkb3VibGUpKGlnICsgKChwbmdfdWludF8zMilqIDw8IDgpKSAvCisgICAgICAgICAgICAgICAgICAgIDY1NTM1LjAsIGcpICogNjU1MzUuMCArIC41KTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgIH0KKyNlbmRpZiAvKiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCB8fCBQTkdfUkdCX1RPX0dSQVlfU1VQUE9SVEVEICovCisgIH0KK30KKyNlbmRpZgorLyogVG8gZG86IGluc3RhbGwgaW50ZWdlciB2ZXJzaW9uIG9mIHBuZ19idWlsZF9nYW1tYV90YWJsZSBoZXJlICovCisjZW5kaWYKKworI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisvKiBVbmRvZXMgaW50cmFwaXhlbCBkaWZmZXJlbmNpbmcgICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19yZWFkX2ludHJhcGl4ZWwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JlYWRfaW50cmFwaXhlbCIpOworCisgICBpZiAoCisjaWZkZWYgUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVECisgICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQorICAgeworICAgICAgaW50IGJ5dGVzX3Blcl9waXhlbDsKKyAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKyAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgcnA7CisgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gMzsKKworICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNDsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCisgICAgICAgICB7CisgICAgICAgICAgICAqKHJwKSA9IChwbmdfYnl0ZSkoKDI1NiArICpycCArICoocnArMSkpJjB4ZmYpOworICAgICAgICAgICAgKihycCsyKSA9IChwbmdfYnl0ZSkoKDI1NiArICoocnArMikgKyAqKHJwKzEpKSYweGZmKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgcnA7CisgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNjsKKworICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gODsKKworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiBzMCAgID0gKCoocnAgICAgKSA8PCA4KSB8ICoocnAgKyAxKTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHMxICAgPSAoKihycCArIDIpIDw8IDgpIHwgKihycCArIDMpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgczIgICA9ICgqKHJwICsgNCkgPDwgOCkgfCAqKHJwICsgNSk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByZWQgID0gKHBuZ191aW50XzMyKSgoczAgKyBzMSArIDY1NTM2TCkgJiAweGZmZmZMKTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGJsdWUgPSAocG5nX3VpbnRfMzIpKChzMiArIHMxICsgNjU1MzZMKSAmIDB4ZmZmZkwpOworICAgICAgICAgICAgKihycCAgKSA9IChwbmdfYnl0ZSkoKHJlZCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgKihycCsxKSA9IChwbmdfYnl0ZSkocmVkICYgMHhmZik7CisgICAgICAgICAgICAqKHJwKzQpID0gKHBuZ19ieXRlKSgoYmx1ZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgKihycCs1KSA9IChwbmdfYnl0ZSkoYmx1ZSAmIDB4ZmYpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorI2VuZGlmIC8qIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEICovCisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL3BuZ3J1dGlsLmMgYi9jb20zMi9saWIvbGlicG5nL3BuZ3J1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyZGIzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvcG5ncnV0aWwuYwpAQCAtMCwwICsxLDMzODIgQEAKKworLyogcG5ncnV0aWwuYyAtIHV0aWxpdGllcyB0byByZWFkIGEgUE5HIGZpbGUKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuMi40NCBbSnVuZSAyNiwgMjAxMF0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRoYXQgYXJlIG9ubHkgY2FsbGVkIGZyb20gd2l0aGluCisgKiBsaWJwbmcgaXRzZWxmIGR1cmluZyB0aGUgY291cnNlIG9mIHJlYWRpbmcgYW4gaW1hZ2UuCisgKi8KKworI2RlZmluZSBQTkdfSU5URVJOQUwKKyNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCisjaW5jbHVkZSAicG5nLmgiCisjaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIChfV0lOMzJfV0NFPDB4NTAwKQorIyAgZGVmaW5lIFdJTjMyX1dDRV9PTEQKKyNlbmRpZgorCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorIyAgaWZkZWYgV0lOMzJfV0NFX09MRAorLyogVGhlIHN0cnRvZCgpIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93c0NFICovCitfX2lubGluZSBkb3VibGUgcG5nX3N0cnRvZChwbmdfc3RydWN0cCBwbmdfcHRyLCBQTkdfQ09OU1QgY2hhciAqbnB0ciwKKyAgICBjaGFyICoqZW5kcHRyKQoreworICAgZG91YmxlIHJlc3VsdCA9IDA7CisgICBpbnQgbGVuOworICAgd2NoYXJfdCAqc3RyLCAqZW5kOworCisgICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgbnB0ciwgLTEsIE5VTEwsIDApOworICAgc3RyID0gKHdjaGFyX3QgKilwbmdfbWFsbG9jKHBuZ19wdHIsIGxlbiAqIHBuZ19zaXplb2Yod2NoYXJfdCkpOworICAgaWYgKCBOVUxMICE9IHN0ciApCisgICB7CisgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgbnB0ciwgLTEsIHN0ciwgbGVuKTsKKyAgICAgIHJlc3VsdCA9IHdjc3RvZChzdHIsICZlbmQpOworICAgICAgbGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIGVuZCwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICAgICAgKmVuZHB0ciA9IChjaGFyICopbnB0ciArIChwbmdfc3RybGVuKG5wdHIpIC0gbGVuICsgMSk7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBzdHIpOworICAgfQorICAgcmV0dXJuIHJlc3VsdDsKK30KKyMgIGVsc2UKKyMgICAgZGVmaW5lIHBuZ19zdHJ0b2QocCxhLGIpIHN0cnRvZChhLGIpCisjICBlbmRpZgorI2VuZGlmCisKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX2dldF91aW50XzMxKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBidWYpCit7CisjaWZkZWYgUE5HX1JFQURfQklHX0VORElBTl9TVVBQT1JURUQKKyAgIHBuZ191aW50XzMyIGkgPSBwbmdfZ2V0X3VpbnRfMzIoYnVmKTsKKyNlbHNlCisgICAvKiBBdm9pZCBhbiBleHRyYSBmdW5jdGlvbiBjYWxsIGJ5IGlubGluaW5nIHRoZSByZXN1bHQuICovCisgICBwbmdfdWludF8zMiBpID0gKChwbmdfdWludF8zMikoKmJ1ZikgPDwgMjQpICsKKyAgICAgICgocG5nX3VpbnRfMzIpKCooYnVmICsgMSkpIDw8IDE2KSArCisgICAgICAoKHBuZ191aW50XzMyKSgqKGJ1ZiArIDIpKSA8PCA4KSArCisgICAgICAocG5nX3VpbnRfMzIpKCooYnVmICsgMykpOworI2VuZGlmCisgICBpZiAoaSA+IFBOR19VSU5UXzMxX01BWCkKKyAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJQTkcgdW5zaWduZWQgaW50ZWdlciBvdXQgb2YgcmFuZ2UuIik7CisgICByZXR1cm4gKGkpOworfQorI2lmbmRlZiBQTkdfUkVBRF9CSUdfRU5ESUFOX1NVUFBPUlRFRAorLyogR3JhYiBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciBmcm9tIGEgYnVmZmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LiAqLworcG5nX3VpbnRfMzIgUE5HQVBJCitwbmdfZ2V0X3VpbnRfMzIocG5nX2J5dGVwIGJ1ZikKK3sKKyAgIHBuZ191aW50XzMyIGkgPSAoKHBuZ191aW50XzMyKSgqYnVmKSA8PCAyNCkgKworICAgICAgKChwbmdfdWludF8zMikoKihidWYgKyAxKSkgPDwgMTYpICsKKyAgICAgICgocG5nX3VpbnRfMzIpKCooYnVmICsgMikpIDw8IDgpICsKKyAgICAgIChwbmdfdWludF8zMikoKihidWYgKyAzKSk7CisKKyAgIHJldHVybiAoaSk7Cit9CisKKy8qIEdyYWIgYSBzaWduZWQgMzItYml0IGludGVnZXIgZnJvbSBhIGJ1ZmZlciBpbiBiaWctZW5kaWFuIGZvcm1hdC4gIFRoZQorICogZGF0YSBpcyBzdG9yZWQgaW4gdGhlIFBORyBmaWxlIGluIHR3bydzIGNvbXBsZW1lbnQgZm9ybWF0LCBhbmQgaXQgaXMKKyAqIGFzc3VtZWQgdGhhdCB0aGUgbWFjaGluZSBmb3JtYXQgZm9yIHNpZ25lZCBpbnRlZ2VycyBpcyB0aGUgc2FtZS4KKyAqLworcG5nX2ludF8zMiBQTkdBUEkKK3BuZ19nZXRfaW50XzMyKHBuZ19ieXRlcCBidWYpCit7CisgICBwbmdfaW50XzMyIGkgPSAoKHBuZ19pbnRfMzIpKCpidWYpIDw8IDI0KSArCisgICAgICAoKHBuZ19pbnRfMzIpKCooYnVmICsgMSkpIDw8IDE2KSArCisgICAgICAoKHBuZ19pbnRfMzIpKCooYnVmICsgMikpIDw8IDgpICsKKyAgICAgIChwbmdfaW50XzMyKSgqKGJ1ZiArIDMpKTsKKworICAgcmV0dXJuIChpKTsKK30KKworLyogR3JhYiBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciBmcm9tIGEgYnVmZmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LiAqLworcG5nX3VpbnRfMTYgUE5HQVBJCitwbmdfZ2V0X3VpbnRfMTYocG5nX2J5dGVwIGJ1ZikKK3sKKyAgIHBuZ191aW50XzE2IGkgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMTYpKCpidWYpIDw8IDgpICsKKyAgICAgIChwbmdfdWludF8xNikoKihidWYgKyAxKSkpOworCisgICByZXR1cm4gKGkpOworfQorI2VuZGlmIC8qIFBOR19SRUFEX0JJR19FTkRJQU5fU1VQUE9SVEVEICovCisKKy8qIFJlYWQgdGhlIGNodW5rIGhlYWRlciAobGVuZ3RoICsgdHlwZSBuYW1lKS4KKyAqIFB1dCB0aGUgdHlwZSBuYW1lIGludG8gcG5nX3B0ci0+Y2h1bmtfbmFtZSwgYW5kIHJldHVybiB0aGUgbGVuZ3RoLgorICovCitwbmdfdWludF8zMiAvKiBQUklWQVRFICovCitwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHBuZ19ieXRlIGJ1Zls4XTsKKyAgIHBuZ191aW50XzMyIGxlbmd0aDsKKworICAgLyogUmVhZCB0aGUgbGVuZ3RoIGFuZCB0aGUgY2h1bmsgbmFtZSAqLworICAgcG5nX3JlYWRfZGF0YShwbmdfcHRyLCBidWYsIDgpOworICAgbGVuZ3RoID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGJ1Zik7CisKKyAgIC8qIFB1dCB0aGUgY2h1bmsgbmFtZSBpbnRvIHBuZ19wdHItPmNodW5rX25hbWUgKi8KKyAgIHBuZ19tZW1jcHkocG5nX3B0ci0+Y2h1bmtfbmFtZSwgYnVmICsgNCwgNCk7CisKKyAgIHBuZ19kZWJ1ZzIoMCwgIlJlYWRpbmcgJXMgY2h1bmssIGxlbmd0aCA9ICVsdSIsCisgICAgICBwbmdfcHRyLT5jaHVua19uYW1lLCBsZW5ndGgpOworCisgICAvKiBSZXNldCB0aGUgY3JjIGFuZCBydW4gaXQgb3ZlciB0aGUgY2h1bmsgbmFtZSAqLworICAgcG5nX3Jlc2V0X2NyYyhwbmdfcHRyKTsKKyAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUsIDQpOworCisgICAvKiBDaGVjayB0byBzZWUgaWYgY2h1bmsgbmFtZSBpcyB2YWxpZCAqLworICAgcG5nX2NoZWNrX2NodW5rX25hbWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSk7CisKKyAgIHJldHVybiBsZW5ndGg7Cit9CisKKy8qIFJlYWQgZGF0YSwgYW5kIChvcHRpb25hbGx5KSBydW4gaXQgdGhyb3VnaCB0aGUgQ1JDLiAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfY3JjX3JlYWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZiwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcG5nX3JlYWRfZGF0YShwbmdfcHRyLCBidWYsIGxlbmd0aCk7CisgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBidWYsIGxlbmd0aCk7Cit9CisKKy8qIE9wdGlvbmFsbHkgc2tpcCBkYXRhIGFuZCB0aGVuIGNoZWNrIHRoZSBDUkMuICBEZXBlbmRpbmcgb24gd2hldGhlciB3ZQorICogYXJlIHJlYWRpbmcgYSBhbmNpbGxhcnkgb3IgY3JpdGljYWwgY2h1bmssIGFuZCBob3cgdGhlIHByb2dyYW0gaGFzIHNldAorICogdGhpbmdzIHVwLCB3ZSBtYXkgY2FsY3VsYXRlIHRoZSBDUkMgb24gdGhlIGRhdGEgYW5kIHByaW50IGEgbWVzc2FnZS4KKyAqIFJldHVybnMgJzEnIGlmIHRoZXJlIHdhcyBhIENSQyBlcnJvciwgJzAnIG90aGVyd2lzZS4KKyAqLworaW50IC8qIFBSSVZBVEUgKi8KK3BuZ19jcmNfZmluaXNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNraXApCit7CisgICBwbmdfc2l6ZV90IGk7CisgICBwbmdfc2l6ZV90IGlzdG9wID0gcG5nX3B0ci0+emJ1Zl9zaXplOworCisgICBmb3IgKGkgPSAocG5nX3NpemVfdClza2lwOyBpID4gaXN0b3A7IGkgLT0gaXN0b3ApCisgICB7CisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwgcG5nX3B0ci0+emJ1Zl9zaXplKTsKKyAgIH0KKyAgIGlmIChpKQorICAgeworICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsIGkpOworICAgfQorCisgICBpZiAocG5nX2NyY19lcnJvcihwbmdfcHRyKSkKKyAgIHsKKyAgICAgIGlmICgoKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSAmJiAgICAgICAgICAgICAgICAvKiBBbmNpbGxhcnkgKi8KKyAgICAgICAgICAhKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4pKSB8fAorICAgICAgICAgICghKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSAmJiAgICAgICAgICAgICAvKiBDcml0aWNhbCAgKi8KKyAgICAgICAgICAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFKSkpCisgICAgICB7CisgICAgICAgICBwbmdfY2h1bmtfd2FybmluZyhwbmdfcHRyLCAiQ1JDIGVycm9yIik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgIkNSQyBlcnJvciIpOworICAgICAgfQorICAgICAgcmV0dXJuICgxKTsKKyAgIH0KKworICAgcmV0dXJuICgwKTsKK30KKworLyogQ29tcGFyZSB0aGUgQ1JDIHN0b3JlZCBpbiB0aGUgUE5HIGZpbGUgd2l0aCB0aGF0IGNhbGN1bGF0ZWQgYnkgbGlicG5nIGZyb20KKyAqIHRoZSBkYXRhIGl0IGhhcyByZWFkIHRodXMgZmFyLgorICovCitpbnQgLyogUFJJVkFURSAqLworcG5nX2NyY19lcnJvcihwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX2J5dGUgY3JjX2J5dGVzWzRdOworICAgcG5nX3VpbnRfMzIgY3JjOworICAgaW50IG5lZWRfY3JjID0gMTsKKworICAgaWYgKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSAgICAgICAgICAgICAgICAgICAgIC8qIGFuY2lsbGFyeSAqLworICAgeworICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSykgPT0KKyAgICAgICAgICAoUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgfCBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikpCisgICAgICAgICBuZWVkX2NyYyA9IDA7CisgICB9CisgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyaXRpY2FsICovCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFKQorICAgICAgICAgbmVlZF9jcmMgPSAwOworICAgfQorCisgICBwbmdfcmVhZF9kYXRhKHBuZ19wdHIsIGNyY19ieXRlcywgNCk7CisKKyAgIGlmIChuZWVkX2NyYykKKyAgIHsKKyAgICAgIGNyYyA9IHBuZ19nZXRfdWludF8zMihjcmNfYnl0ZXMpOworICAgICAgcmV0dXJuICgoaW50KShjcmMgIT0gcG5nX3B0ci0+Y3JjKSk7CisgICB9CisgICBlbHNlCisgICAgICByZXR1cm4gKDApOworfQorCisjaWYgZGVmaW5lZChQTkdfUkVBRF96VFh0X1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1JFQURfaUNDUF9TVVBQT1JURUQpCitzdGF0aWMgcG5nX3NpemVfdAorcG5nX2luZmxhdGUocG5nX3N0cnVjdHAgcG5nX3B0ciwgY29uc3QgcG5nX2J5dGUgKmRhdGEsIHBuZ19zaXplX3Qgc2l6ZSwKKyAgICAgICAgcG5nX2J5dGVwIG91dHB1dCwgcG5nX3NpemVfdCBvdXRwdXRfc2l6ZSkKK3sKKyAgIHBuZ19zaXplX3QgY291bnQgPSAwOworCisgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSAocG5nX2J5dGVwKWRhdGE7IC8qIGNvbnN0X2Nhc3Q6IFZBTElEICovCisgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKworICAgd2hpbGUgKDEpCisgICB7CisgICAgICBpbnQgcmV0LCBhdmFpbDsKKworICAgICAgLyogUmVzZXQgdGhlIG91dHB1dCBidWZmZXIgZWFjaCB0aW1lIHJvdW5kIC0gd2UgZW1wdHkgaXQKKyAgICAgICAqIGFmdGVyIGV2ZXJ5IGluZmxhdGUgY2FsbC4KKyAgICAgICAqLworICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnpidWY7CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IHBuZ19wdHItPnpidWZfc2l6ZTsKKworICAgICAgcmV0ID0gaW5mbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICBhdmFpbCA9IHBuZ19wdHItPnpidWZfc2l6ZSAtIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0OworCisgICAgICAvKiBGaXJzdCBjb3B5L2NvdW50IGFueSBuZXcgb3V0cHV0IC0gYnV0IG9ubHkgaWYgd2UgZGlkbid0CisgICAgICAgKiBnZXQgYW4gZXJyb3IgY29kZS4KKyAgICAgICAqLworICAgICAgaWYgKChyZXQgPT0gWl9PSyB8fCByZXQgPT0gWl9TVFJFQU1fRU5EKSAmJiBhdmFpbCA+IDApCisgICAgICB7CisgICAgICAgICBpZiAob3V0cHV0ICE9IDAgJiYgb3V0cHV0X3NpemUgPiBjb3VudCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb3B5ID0gb3V0cHV0X3NpemUgLSBjb3VudDsKKyAgICAgICAgICAgIGlmIChhdmFpbCA8IGNvcHkpIGNvcHkgPSBhdmFpbDsKKyAgICAgICAgICAgIHBuZ19tZW1jcHkob3V0cHV0ICsgY291bnQsIHBuZ19wdHItPnpidWYsIGNvcHkpOworICAgICAgICAgfQorICAgICAgICAgY291bnQgKz0gYXZhaWw7CisgICAgICB9CisKKyAgICAgIGlmIChyZXQgPT0gWl9PSykKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvKiBUZXJtaW5hdGlvbiBjb25kaXRpb25zIC0gYWx3YXlzIHJlc2V0IHRoZSB6c3RyZWFtLCBpdAorICAgICAgICogbXVzdCBiZSBsZWZ0IGluIGluZmxhdGVJbml0IHN0YXRlLgorICAgICAgICovCisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICAgIGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSk7CisKKyAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICAgcmV0dXJuIGNvdW50OyAvKiBOT1RFOiBtYXkgYmUgemVyby4gKi8KKworICAgICAgLyogTm93IGhhbmRsZSB0aGUgZXJyb3IgY29kZXMgLSB0aGUgQVBJIGFsd2F5cyByZXR1cm5zIDAKKyAgICAgICAqIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBpcyBkdW1wZWQgaW50byB0aGUgdW5jb21wcmVzc2VkCisgICAgICAgKiBidWZmZXIgaWYgYXZhaWxhYmxlLgorICAgICAgICovCisgICAgICB7CisgICAgICAgICBQTkdfQ09OU1QgY2hhciAqbXNnOworICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubXNnICE9IDApCisgICAgICAgICAgICBtc2cgPSBwbmdfcHRyLT56c3RyZWFtLm1zZzsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyNpZiBkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgICAgICAgICBjaGFyIHVtc2dbNTJdOworCisgICAgICAgICAgICBzd2l0Y2ggKHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgWl9CVUZfRVJST1I6CisgICAgICAgICAgICAgICAgICBtc2cgPSAiQnVmZmVyIGVycm9yIGluIGNvbXByZXNzZWQgZGF0YXN0cmVhbSBpbiAlcyBjaHVuayI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgorICAgICAgICAgICAgICAgICAgbXNnID0gIkRhdGEgZXJyb3IgaW4gY29tcHJlc3NlZCBkYXRhc3RyZWFtIGluICVzIGNodW5rIjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIG1zZyA9ICJJbmNvbXBsZXRlIGNvbXByZXNzZWQgZGF0YXN0cmVhbSBpbiAlcyBjaHVuayI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG5nX3NucHJpbnRmKHVtc2csIHNpemVvZiB1bXNnLCBtc2csIHBuZ19wdHItPmNodW5rX25hbWUpOworICAgICAgICAgICAgbXNnID0gdW1zZzsKKyNlbHNlCisgICAgICAgICAgICBtc2cgPSAiRGFtYWdlZCBjb21wcmVzc2VkIGRhdGFzdHJlYW0gaW4gY2h1bmsgb3RoZXIgdGhhbiBJREFUIjsKKyNlbmRpZgorICAgICAgICAgfQorCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOworICAgICAgfQorCisgICAgICAvKiAwIG1lYW5zIGFuIGVycm9yIC0gbm90aWNlIHRoYXQgdGhpcyBjb2RlIHNpbXBsZSBpZ25vcmVzCisgICAgICAgKiB6ZXJvIGxlbmd0aCBjb21wcmVzc2VkIGNodW5rcyBhcyBhIHJlc3VsdC4KKyAgICAgICAqLworICAgICAgcmV0dXJuIDA7CisgICB9Cit9CisKKy8qCisgKiBEZWNvbXByZXNzIHRyYWlsaW5nIGRhdGEgaW4gYSBjaHVuay4gIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgY2h1bmtkYXRhCisgKiBwb2ludHMgYXQgYW4gYWxsb2NhdGVkIGFyZWEgaG9sZGluZyB0aGUgY29udGVudHMgb2YgYSBjaHVuayB3aXRoIGEKKyAqIHRyYWlsaW5nIGNvbXByZXNzZWQgcGFydC4gIFdoYXQgd2UgZ2V0IGJhY2sgaXMgYW4gYWxsb2NhdGVkIGFyZWEKKyAqIGhvbGRpbmcgdGhlIG9yaWdpbmFsIHByZWZpeCBwYXJ0IGFuZCBhbiB1bmNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUKKyAqIHRyYWlsaW5nIHBhcnQgKHRoZSBtYWxsb2MgYXJlYSBwYXNzZWQgaW4gaXMgZnJlZWQpLgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kZWNvbXByZXNzX2NodW5rKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBjb21wX3R5cGUsCisgICAgcG5nX3NpemVfdCBjaHVua2xlbmd0aCwKKyAgICBwbmdfc2l6ZV90IHByZWZpeF9zaXplLCBwbmdfc2l6ZV90ICpuZXdsZW5ndGgpCit7CisgICAvKiBUaGUgY2FsbGVyIHNob3VsZCBndWFyYW50ZWUgdGhpcyAqLworICAgaWYgKHByZWZpeF9zaXplID4gY2h1bmtsZW5ndGgpCisgICB7CisgICAgICAvKiBUaGUgcmVjb3ZlcnkgaXMgdG8gZGVsZXRlIHRoZSBjaHVuay4gKi8KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJpbnZhbGlkIGNodW5rbGVuZ3RoIik7CisgICAgICBwcmVmaXhfc2l6ZSA9IDA7IC8qIFRvIGRlbGV0ZSBldmVyeXRoaW5nICovCisgICB9CisKKyAgIGVsc2UgaWYgKGNvbXBfdHlwZSA9PSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQorICAgeworICAgICAgcG5nX3NpemVfdCBleHBhbmRlZF9zaXplID0gcG5nX2luZmxhdGUocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAocG5nX2J5dGVwKShwbmdfcHRyLT5jaHVua2RhdGEgKyBwcmVmaXhfc2l6ZSksCisgICAgICAgICAgICAgICAgY2h1bmtsZW5ndGggLSBwcmVmaXhfc2l6ZSwKKyAgICAgICAgICAgICAgICAwLypvdXRwdXQqLywgMC8qb3V0cHV0IHNpemUqLyk7CisKKyAgICAgIC8qIE5vdyBjaGVjayB0aGUgbGltaXRzIG9uIHRoaXMgY2h1bmsgLSBpZiB0aGUgbGltaXQgZmFpbHMgdGhlCisgICAgICAgKiBjb21wcmVzc2VkIGRhdGEgd2lsbCBiZSByZW1vdmVkLCB0aGUgcHJlZml4IHdpbGwgcmVtYWluLgorICAgICAgICovCisjaWZkZWYgUE5HX1NFVF9DSFVOS19NQUxMT0NfTElNSVRfU1VQUE9SVEVECisgICAgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19tYWxsb2NfbWF4ICYmCisgICAgICAgICAgKHByZWZpeF9zaXplICsgZXhwYW5kZWRfc2l6ZSA+PSBwbmdfcHRyLT51c2VyX2NodW5rX21hbGxvY19tYXggLSAxKSkKKyNlbHNlCisjICBpZmRlZiBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYCisgICAgICBpZiAoKFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggPiAwKSAmJgorICAgICAgICAgIHByZWZpeF9zaXplICsgZXhwYW5kZWRfc2l6ZSA+PSBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYIC0gMSkKKyMgIGVuZGlmCisjZW5kaWYKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeGNlZWRlZCBzaXplIGxpbWl0IHdoaWxlIGV4cGFuZGluZyBjaHVuayIpOworCisgICAgICAvKiBJZiB0aGUgc2l6ZSBpcyB6ZXJvIGVpdGhlciB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGEgbWVzc2FnZQorICAgICAgICogaGFzIGFscmVhZHkgYmVlbiBvdXRwdXQgKHdhcm5pbmcpIG9yIHRoZSBzaXplIHJlYWxseSBpcyB6ZXJvCisgICAgICAgKiBhbmQgd2UgaGF2ZSBub3RoaW5nIHRvIGRvIC0gdGhlIGNvZGUgd2lsbCBleGl0IHRocm91Z2ggdGhlCisgICAgICAgKiBlcnJvciBjYXNlIGJlbG93LgorICAgICAgICovCisjaWYgZGVmaW5lZChQTkdfU0VUX0NIVU5LX01BTExPQ19MSU1JVF9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVgpCisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChleHBhbmRlZF9zaXplID4gMCkKKyAgICAgIHsKKyAgICAgICAgIC8qIFN1Y2Nlc3MgKG1heWJlKSAtIHJlYWxseSB1bmNvbXByZXNzIHRoZSBjaHVuay4gKi8KKyAgICAgICAgIHBuZ19zaXplX3QgbmV3X3NpemUgPSAwOworICAgICAgICAgcG5nX2NoYXJwIHRleHQgPSBwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9zaXplICsgZXhwYW5kZWRfc2l6ZSArIDEpOworCisgICAgICAgICBpZiAodGV4dCAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX21lbWNweSh0ZXh0LCBwbmdfcHRyLT5jaHVua2RhdGEsIHByZWZpeF9zaXplKTsKKyAgICAgICAgICAgIG5ld19zaXplID0gcG5nX2luZmxhdGUocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAocG5nX2J5dGVwKShwbmdfcHRyLT5jaHVua2RhdGEgKyBwcmVmaXhfc2l6ZSksCisgICAgICAgICAgICAgICAgY2h1bmtsZW5ndGggLSBwcmVmaXhfc2l6ZSwKKyAgICAgICAgICAgICAgICAocG5nX2J5dGVwKSh0ZXh0ICsgcHJlZml4X3NpemUpLCBleHBhbmRlZF9zaXplKTsKKyAgICAgICAgICAgIHRleHRbcHJlZml4X3NpemUgKyBleHBhbmRlZF9zaXplXSA9IDA7IC8qIGp1c3QgaW4gY2FzZSAqLworCisgICAgICAgICAgICBpZiAobmV3X3NpemUgPT0gZXhwYW5kZWRfc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICAgICAgICAgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSB0ZXh0OworICAgICAgICAgICAgICAgKm5ld2xlbmd0aCA9IHByZWZpeF9zaXplICsgZXhwYW5kZWRfc2l6ZTsKKyAgICAgICAgICAgICAgIHJldHVybjsgLyogVGhlIHN1Y2Nlc3MgcmV0dXJuISAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAicG5nX2luZmxhdGUgbG9naWMgZXJyb3IiKTsKKyAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHQpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvbXByZXNzIGNodW5rLiIpOworICAgICAgfQorICAgfQorCisgICBlbHNlIC8qIGlmIChjb21wX3R5cGUgIT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkgKi8KKyAgIHsKKyNpZiBkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgICBjaGFyIHVtc2dbNTBdOworCisgICAgICBwbmdfc25wcmludGYodW1zZywgc2l6ZW9mIHVtc2csICJVbmtub3duIHpUWHQgY29tcHJlc3Npb24gdHlwZSAlZCIsCisgICAgICAgICAgY29tcF90eXBlKTsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIHVtc2cpOworI2Vsc2UKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIHpUWHQgY29tcHJlc3Npb24gdHlwZSIpOworI2VuZGlmCisKKyAgICAgIC8qIFRoZSByZWNvdmVyeSBpcyB0byBzaW1wbHkgZHJvcCB0aGUgZGF0YS4gKi8KKyAgIH0KKworICAgLyogR2VuZXJpYyBlcnJvciByZXR1cm4gLSBsZWF2ZSB0aGUgcHJlZml4LCBkZWxldGUgdGhlIGNvbXByZXNzZWQKKyAgICAqIGRhdGEsIHJlYWxsb2NhdGUgdGhlIGNodW5rZGF0YSB0byByZW1vdmUgdGhlIHBvdGVudGlhbGx5IGxhcmdlCisgICAgKiBhbW91bnQgb2YgY29tcHJlc3NlZCBkYXRhLgorICAgICovCisgICB7CisgICAgICBwbmdfY2hhcnAgdGV4dCA9IHBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBwcmVmaXhfc2l6ZSArIDEpOworICAgICAgaWYgKHRleHQgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwcmVmaXhfc2l6ZSA+IDApCisgICAgICAgICAgICBwbmdfbWVtY3B5KHRleHQsIHBuZ19wdHItPmNodW5rZGF0YSwgcHJlZml4X3NpemUpOworICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IHRleHQ7CisKKyAgICAgICAgIC8qIFRoaXMgaXMgYW4gZXh0cmEgemVybyBpbiB0aGUgJ3VuY29tcHJlc3NlZCcgcGFydC4gKi8KKyAgICAgICAgICoocG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X3NpemUpID0gMHgwMDsKKyAgICAgIH0KKyAgICAgIC8qIElnbm9yZSBhIG1hbGxvYyBlcnJvciBoZXJlIC0gaXQgaXMgc2FmZS4gKi8KKyAgIH0KKworICAgKm5ld2xlbmd0aCA9IHByZWZpeF9zaXplOworfQorI2VuZGlmCisKKy8qIFJlYWQgYW5kIGNoZWNrIHRoZSBJREhSIGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfSUhEUihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19ieXRlIGJ1ZlsxM107CisgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OworICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX3R5cGU7CisgICBpbnQgaW50ZXJsYWNlX3R5cGU7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9JSERSIik7CisKKyAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIElIRFIiKTsKKworICAgLyogQ2hlY2sgdGhlIGxlbmd0aCAqLworICAgaWYgKGxlbmd0aCAhPSAxMykKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBJSERSIGNodW5rIik7CisKKyAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSUhEUjsKKworICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMTMpOworICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7CisKKyAgIHdpZHRoID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGJ1Zik7CisgICBoZWlnaHQgPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmICsgNCk7CisgICBiaXRfZGVwdGggPSBidWZbOF07CisgICBjb2xvcl90eXBlID0gYnVmWzldOworICAgY29tcHJlc3Npb25fdHlwZSA9IGJ1ZlsxMF07CisgICBmaWx0ZXJfdHlwZSA9IGJ1ZlsxMV07CisgICBpbnRlcmxhY2VfdHlwZSA9IGJ1ZlsxMl07CisKKyAgIC8qIFNldCBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyAgIHBuZ19wdHItPndpZHRoID0gd2lkdGg7CisgICBwbmdfcHRyLT5oZWlnaHQgPSBoZWlnaHQ7CisgICBwbmdfcHRyLT5iaXRfZGVwdGggPSAocG5nX2J5dGUpYml0X2RlcHRoOworICAgcG5nX3B0ci0+aW50ZXJsYWNlZCA9IChwbmdfYnl0ZSlpbnRlcmxhY2VfdHlwZTsKKyAgIHBuZ19wdHItPmNvbG9yX3R5cGUgPSAocG5nX2J5dGUpY29sb3JfdHlwZTsKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorICAgcG5nX3B0ci0+ZmlsdGVyX3R5cGUgPSAocG5nX2J5dGUpZmlsdGVyX3R5cGU7CisjZW5kaWYKKyAgIHBuZ19wdHItPmNvbXByZXNzaW9uX3R5cGUgPSAocG5nX2J5dGUpY29tcHJlc3Npb25fdHlwZTsKKworICAgLyogRmluZCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgIHN3aXRjaCAocG5nX3B0ci0+Y29sb3JfdHlwZSkKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToKKyAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKyAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMzsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6CisgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDI7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6CisgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDQ7CisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgLyogU2V0IHVwIG90aGVyIHVzZWZ1bCBpbmZvICovCisgICBwbmdfcHRyLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocG5nX3B0ci0+Yml0X2RlcHRoICoKKyAgIHBuZ19wdHItPmNoYW5uZWxzKTsKKyAgIHBuZ19wdHItPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLCBwbmdfcHRyLT53aWR0aCk7CisgICBwbmdfZGVidWcxKDMsICJiaXRfZGVwdGggPSAlZCIsIHBuZ19wdHItPmJpdF9kZXB0aCk7CisgICBwbmdfZGVidWcxKDMsICJjaGFubmVscyA9ICVkIiwgcG5nX3B0ci0+Y2hhbm5lbHMpOworICAgcG5nX2RlYnVnMSgzLCAicm93Ynl0ZXMgPSAlbHUiLCBwbmdfcHRyLT5yb3dieXRlcyk7CisgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwKKyAgICAgIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7Cit9CisKKy8qIFJlYWQgYW5kIGNoZWNrIHRoZSBwYWxldHRlICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfUExURShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ19jb2xvciBwYWxldHRlW1BOR19NQVhfUEFMRVRURV9MRU5HVEhdOworICAgaW50IG51bSwgaTsKKyNpZmRlZiBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKKyAgIHBuZ19jb2xvcnAgcGFsX3B0cjsKKyNlbmRpZgorCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfUExURSIpOworCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgUExURSIpOworCisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIFBMVEUgYWZ0ZXIgSURBVCIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkR1cGxpY2F0ZSBQTFRFIGNodW5rIik7CisKKyAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKKworICAgaWYgKCEocG5nX3B0ci0+Y29sb3JfdHlwZSZQTkdfQ09MT1JfTUFTS19DT0xPUikpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAiSWdub3JpbmcgUExURSBjaHVuayBpbiBncmF5c2NhbGUgUE5HIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorI2lmbmRlZiBQTkdfUkVBRF9PUFRfUExURV9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorI2VuZGlmCisKKyAgIGlmIChsZW5ndGggPiAzKlBOR19NQVhfUEFMRVRURV9MRU5HVEggfHwgbGVuZ3RoICUgMykKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBwYWxldHRlIGNodW5rIik7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgcGFsZXR0ZSBjaHVuayIpOworICAgICAgfQorICAgfQorCisgICBudW0gPSAoaW50KWxlbmd0aCAvIDM7CisKKyNpZmRlZiBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKKyAgIGZvciAoaSA9IDAsIHBhbF9wdHIgPSBwYWxldHRlOyBpIDwgbnVtOyBpKyssIHBhbF9wdHIrKykKKyAgIHsKKyAgICAgIHBuZ19ieXRlIGJ1ZlszXTsKKworICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMyk7CisgICAgICBwYWxfcHRyLT5yZWQgPSBidWZbMF07CisgICAgICBwYWxfcHRyLT5ncmVlbiA9IGJ1ZlsxXTsKKyAgICAgIHBhbF9wdHItPmJsdWUgPSBidWZbMl07CisgICB9CisjZWxzZQorICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICAgeworICAgICAgcG5nX2J5dGUgYnVmWzNdOworCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAzKTsKKyAgICAgIC8qIERvbid0IGRlcGVuZCB1cG9uIHBuZ19jb2xvciBiZWluZyBhbnkgb3JkZXIgKi8KKyAgICAgIHBhbGV0dGVbaV0ucmVkID0gYnVmWzBdOworICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IGJ1ZlsxXTsKKyAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IGJ1ZlsyXTsKKyAgIH0KKyNlbmRpZgorCisgICAvKiBJZiB3ZSBhY3R1YWxseSBORUVEIHRoZSBQTFRFIGNodW5rIChpZSBmb3IgYSBwYWxldHRlZCBpbWFnZSksIHdlIGRvCisgICAgKiB3aGF0ZXZlciB0aGUgbm9ybWFsIENSQyBjb25maWd1cmF0aW9uIHRlbGxzIHVzLiAgSG93ZXZlciwgaWYgd2UKKyAgICAqIGhhdmUgYW4gUkdCIGltYWdlLCB0aGUgUExURSBjYW4gYmUgY29uc2lkZXJlZCBhbmNpbGxhcnksIHNvCisgICAgKiB3ZSB3aWxsIGFjdCBhcyB0aG91Z2ggaXQgaXMuCisgICAgKi8KKyNpZm5kZWYgUE5HX1JFQURfT1BUX1BMVEVfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorI2VuZGlmCisgICB7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsKKyAgIH0KKyNpZm5kZWYgUE5HX1JFQURfT1BUX1BMVEVfU1VQUE9SVEVECisgICBlbHNlIGlmIChwbmdfY3JjX2Vycm9yKHBuZ19wdHIpKSAgLyogT25seSBpZiB3ZSBoYXZlIGEgQ1JDIGVycm9yICovCisgICB7CisgICAgICAvKiBJZiB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgZGF0YSBmcm9tIGFuIGFuY2lsbGFyeSBjaHVuaywKKyAgICAgICAgIHdlIGhhdmUgdHdvIG9wdGlvbnM6IGFuIGVycm9yIGFib3J0LCBvciBhIHdhcm5pbmcgYW5kIHdlCisgICAgICAgICBpZ25vcmUgdGhlIGRhdGEgaW4gdGhpcyBjaHVuayAod2hpY2ggc2hvdWxkIGJlIE9LLCBzaW5jZQorICAgICAgICAgaXQncyBjb25zaWRlcmVkIGFuY2lsbGFyeSBmb3IgYSBSR0Igb3IgUkdCQSBpbWFnZSkuICovCisgICAgICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFKSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIE90aGVyd2lzZSwgd2UgKG9wdGlvbmFsbHkpIGVtaXQgYSB3YXJuaW5nIGFuZCB1c2UgdGhlIGNodW5rLiAqLworICAgICAgZWxzZSBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsIG51bSk7CisKKyNpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMgPiAocG5nX3VpbnRfMTYpbnVtKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRpbmcgaW5jb3JyZWN0IHRSTlMgY2h1bmsgbGVuZ3RoIik7CisgICAgICAgICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAocG5nX3VpbnRfMTYpbnVtOworICAgICAgICAgfQorICAgICAgICAgaWYgKGluZm9fcHRyLT5udW1fdHJhbnMgPiAocG5nX3VpbnRfMTYpbnVtKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRpbmcgaW5jb3JyZWN0IGluZm8gdFJOUyBjaHVuayBsZW5ndGgiKTsKKyAgICAgICAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAocG5nX3VpbnRfMTYpbnVtOworICAgICAgICAgfQorICAgICAgfQorICAgfQorI2VuZGlmCisKK30KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX0lFTkQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfSUVORCIpOworCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikgfHwgIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkpCisgICB7CisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vIGltYWdlIGluIGZpbGUiKTsKKyAgIH0KKworICAgcG5nX3B0ci0+bW9kZSB8PSAoUE5HX0FGVEVSX0lEQVQgfCBQTkdfSEFWRV9JRU5EKTsKKworICAgaWYgKGxlbmd0aCAhPSAwKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBJRU5EIGNodW5rIGxlbmd0aCIpOworICAgfQorICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKworICAgaW5mb19wdHIgPSBpbmZvX3B0cjsgLyogUXVpZXQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgdW51c2VkIGluZm9fcHRyICovCit9CisKKyNpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX2dBTUEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfZml4ZWRfcG9pbnQgaWdhbW1hOworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIGZsb2F0IGZpbGVfZ2FtbWE7CisjZW5kaWYKKyAgIHBuZ19ieXRlIGJ1Zls0XTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2dBTUEiKTsKKworICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIGdBTUEiKTsKKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgZ0FNQSBhZnRlciBJREFUIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpCisgICAgICAvKiBTaG91bGQgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBjYW4gY29wZSB3aXRoIGl0ICovCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIGdBTUEgY2h1bmsiKTsKKworICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2dBTUEpCisjaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKKyAgICAgICYmICEoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikKKyNlbmRpZgorICAgICAgKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBnQU1BIGNodW5rIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAobGVuZ3RoICE9IDQpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IGdBTUEgY2h1bmsgbGVuZ3RoIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCA0KTsKKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKKyAgICAgIHJldHVybjsKKworICAgaWdhbW1hID0gKHBuZ19maXhlZF9wb2ludClwbmdfZ2V0X3VpbnRfMzIoYnVmKTsKKyAgIC8qIENoZWNrIGZvciB6ZXJvIGdhbW1hICovCisgICBpZiAoaWdhbW1hID09IDApCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAiSWdub3JpbmcgZ0FNQSBjaHVuayB3aXRoIGdhbW1hPTAiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworI2lmZGVmIFBOR19SRUFEX3NSR0JfU1VQUE9SVEVECisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikpCisgICAgICBpZiAoUE5HX09VVF9PRl9SQU5HRShpZ2FtbWEsIDQ1NTAwTCwgNTAwKSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICJJZ25vcmluZyBpbmNvcnJlY3QgZ0FNQSB2YWx1ZSB3aGVuIHNSR0IgaXMgYWxzbyBwcmVzZW50Iik7CisjaWZkZWYgUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVECisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdhbW1hID0gKCVkLzEwMDAwMCkiLCAoaW50KWlnYW1tYSk7CisjZW5kaWYKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyNlbmRpZiAvKiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgZmlsZV9nYW1tYSA9IChmbG9hdClpZ2FtbWEgLyAoZmxvYXQpMTAwMDAwLjA7CisjICBpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKKyAgICAgcG5nX3B0ci0+Z2FtbWEgPSBmaWxlX2dhbW1hOworIyAgZW5kaWYKKyAgICAgcG5nX3NldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBmaWxlX2dhbW1hKTsKKyNlbmRpZgorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyAgIHBuZ19zZXRfZ0FNQV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgaWdhbW1hKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX3NCSVQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfc2l6ZV90IHRydWVsZW47CisgICBwbmdfYnl0ZSBidWZbNF07CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9zQklUIik7CisKKyAgIGJ1ZlswXSA9IGJ1ZlsxXSA9IGJ1ZlsyXSA9IGJ1ZlszXSA9IDA7CisKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBzQklUIik7CisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNCSVQgYWZ0ZXIgSURBVCIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKQorICAgeworICAgICAgLyogU2hvdWxkIGJlIGFuIGVycm9yLCBidXQgd2UgY2FuIGNvcGUgd2l0aCBpdCAqLworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBwbGFjZSBzQklUIGNodW5rIik7CisgICB9CisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0JJVCkpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIHNCSVQgY2h1bmsiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB0cnVlbGVuID0gMzsKKyAgIGVsc2UKKyAgICAgIHRydWVsZW4gPSAocG5nX3NpemVfdClwbmdfcHRyLT5jaGFubmVsczsKKworICAgaWYgKGxlbmd0aCAhPSB0cnVlbGVuIHx8IGxlbmd0aCA+IDQpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IHNCSVQgY2h1bmsgbGVuZ3RoIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCB0cnVlbGVuKTsKKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKKyAgICAgIHJldHVybjsKKworICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgIHsKKyAgICAgIHBuZ19wdHItPnNpZ19iaXQucmVkID0gYnVmWzBdOworICAgICAgcG5nX3B0ci0+c2lnX2JpdC5ncmVlbiA9IGJ1ZlsxXTsKKyAgICAgIHBuZ19wdHItPnNpZ19iaXQuYmx1ZSA9IGJ1ZlsyXTsKKyAgICAgIHBuZ19wdHItPnNpZ19iaXQuYWxwaGEgPSBidWZbM107CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwbmdfcHRyLT5zaWdfYml0LmdyYXkgPSBidWZbMF07CisgICAgICBwbmdfcHRyLT5zaWdfYml0LnJlZCA9IGJ1ZlswXTsKKyAgICAgIHBuZ19wdHItPnNpZ19iaXQuZ3JlZW4gPSBidWZbMF07CisgICAgICBwbmdfcHRyLT5zaWdfYml0LmJsdWUgPSBidWZbMF07CisgICAgICBwbmdfcHRyLT5zaWdfYml0LmFscGhhID0gYnVmWzFdOworICAgfQorICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmKHBuZ19wdHItPnNpZ19iaXQpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV9jSFJNKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgcG5nX2J5dGUgYnVmWzMyXTsKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisgICBmbG9hdCB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3ksIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwgYmx1ZV95OworI2VuZGlmCisgICBwbmdfZml4ZWRfcG9pbnQgaW50X3hfd2hpdGUsIGludF95X3doaXRlLCBpbnRfeF9yZWQsIGludF95X3JlZCwgaW50X3hfZ3JlZW4sCisgICAgICBpbnRfeV9ncmVlbiwgaW50X3hfYmx1ZSwgaW50X3lfYmx1ZTsKKworICAgcG5nX3VpbnRfMzIgdWludF94LCB1aW50X3k7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9jSFJNIik7CisKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBjSFJNIik7CisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gYWZ0ZXIgSURBVCIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKQorICAgICAgLyogU2hvdWxkIGJlIGFuIGVycm9yLCBidXQgd2UgY2FuIGNvcGUgd2l0aCBpdCAqLworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgY0hSTSIpOworCisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fY0hSTSkKKyNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAorICAgICAgJiYgIShpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zUkdCKQorI2VuZGlmCisgICAgICApCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIGNIUk0gY2h1bmsiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChsZW5ndGggIT0gMzIpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IGNIUk0gY2h1bmsgbGVuZ3RoIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAzMik7CisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCisgICAgICByZXR1cm47CisKKyAgIHVpbnRfeCA9IHBuZ19nZXRfdWludF8zMihidWYpOworICAgdWludF95ID0gcG5nX2dldF91aW50XzMyKGJ1ZiArIDQpOworICAgaW50X3hfd2hpdGUgPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeDsKKyAgIGludF95X3doaXRlID0gKHBuZ19maXhlZF9wb2ludCl1aW50X3k7CisKKyAgIHVpbnRfeCA9IHBuZ19nZXRfdWludF8zMihidWYgKyA4KTsKKyAgIHVpbnRfeSA9IHBuZ19nZXRfdWludF8zMihidWYgKyAxMik7CisgICBpbnRfeF9yZWQgPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeDsKKyAgIGludF95X3JlZCA9IChwbmdfZml4ZWRfcG9pbnQpdWludF95OworCisgICB1aW50X3ggPSBwbmdfZ2V0X3VpbnRfMzIoYnVmICsgMTYpOworICAgdWludF95ID0gcG5nX2dldF91aW50XzMyKGJ1ZiArIDIwKTsKKyAgIGludF94X2dyZWVuID0gKHBuZ19maXhlZF9wb2ludCl1aW50X3g7CisgICBpbnRfeV9ncmVlbiA9IChwbmdfZml4ZWRfcG9pbnQpdWludF95OworCisgICB1aW50X3ggPSBwbmdfZ2V0X3VpbnRfMzIoYnVmICsgMjQpOworICAgdWludF95ID0gcG5nX2dldF91aW50XzMyKGJ1ZiArIDI4KTsKKyAgIGludF94X2JsdWUgPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeDsKKyAgIGludF95X2JsdWUgPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeTsKKworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIHdoaXRlX3ggPSAoZmxvYXQpaW50X3hfd2hpdGUgLyAoZmxvYXQpMTAwMDAwLjA7CisgICB3aGl0ZV95ID0gKGZsb2F0KWludF95X3doaXRlIC8gKGZsb2F0KTEwMDAwMC4wOworICAgcmVkX3ggICA9IChmbG9hdClpbnRfeF9yZWQgICAvIChmbG9hdCkxMDAwMDAuMDsKKyAgIHJlZF95ICAgPSAoZmxvYXQpaW50X3lfcmVkICAgLyAoZmxvYXQpMTAwMDAwLjA7CisgICBncmVlbl94ID0gKGZsb2F0KWludF94X2dyZWVuIC8gKGZsb2F0KTEwMDAwMC4wOworICAgZ3JlZW5feSA9IChmbG9hdClpbnRfeV9ncmVlbiAvIChmbG9hdCkxMDAwMDAuMDsKKyAgIGJsdWVfeCAgPSAoZmxvYXQpaW50X3hfYmx1ZSAgLyAoZmxvYXQpMTAwMDAwLjA7CisgICBibHVlX3kgID0gKGZsb2F0KWludF95X2JsdWUgIC8gKGZsb2F0KTEwMDAwMC4wOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAorICAgaWYgKChpbmZvX3B0ciAhPSBOVUxMKSAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikpCisgICAgICB7CisgICAgICBpZiAoUE5HX09VVF9PRl9SQU5HRShpbnRfeF93aGl0ZSwgMzEyNzAsICAxMDAwKSB8fAorICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW50X3lfd2hpdGUsIDMyOTAwLCAgMTAwMCkgfHwKKyAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGludF94X3JlZCwgICA2NDAwMEwsIDEwMDApIHx8CisgICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbnRfeV9yZWQsICAgMzMwMDAsICAxMDAwKSB8fAorICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW50X3hfZ3JlZW4sIDMwMDAwLCAgMTAwMCkgfHwKKyAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGludF95X2dyZWVuLCA2MDAwMEwsIDEwMDApIHx8CisgICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbnRfeF9ibHVlLCAgMTUwMDAsICAxMDAwKSB8fAorICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW50X3lfYmx1ZSwgICA2MDAwLCAgMTAwMCkpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICAiSWdub3JpbmcgaW5jb3JyZWN0IGNIUk0gdmFsdWUgd2hlbiBzUkdCIGlzIGFsc28gcHJlc2VudCIpOworI2lmZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAid3g9JWYsIHd5PSVmLCByeD0lZiwgcnk9JWZcbiIsCisgICAgICAgICAgICAgICB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3kpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJneD0lZiwgZ3k9JWYsIGJ4PSVmLCBieT0lZlxuIiwKKyAgICAgICAgICAgICAgIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwgYmx1ZV95KTsKKyNlbHNlCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInd4PSVsZCwgd3k9JWxkLCByeD0lbGQsIHJ5PSVsZFxuIiwKKyAgICAgICAgICAgICAgIChsb25nKWludF94X3doaXRlLCAobG9uZylpbnRfeV93aGl0ZSwKKyAgICAgICAgICAgICAgIChsb25nKWludF94X3JlZCwgKGxvbmcpaW50X3lfcmVkKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3g9JWxkLCBneT0lbGQsIGJ4PSVsZCwgYnk9JWxkXG4iLAorICAgICAgICAgICAgICAgKGxvbmcpaW50X3hfZ3JlZW4sIChsb25nKWludF95X2dyZWVuLAorICAgICAgICAgICAgICAgKGxvbmcpaW50X3hfYmx1ZSwgKGxvbmcpaW50X3lfYmx1ZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQgKi8KKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyNlbmRpZiAvKiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgcG5nX3NldF9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLAorICAgICAgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisgICBwbmdfc2V0X2NIUk1fZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICBpbnRfeF93aGl0ZSwgaW50X3lfd2hpdGUsIGludF94X3JlZCwgaW50X3lfcmVkLCBpbnRfeF9ncmVlbiwKKyAgICAgIGludF95X2dyZWVuLCBpbnRfeF9ibHVlLCBpbnRfeV9ibHVlKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX3NSR0IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBpbnQgaW50ZW50OworICAgcG5nX2J5dGUgYnVmWzFdOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfc1JHQiIpOworCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgc1JHQiIpOworICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzUkdCIGFmdGVyIElEQVQiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkKKyAgICAgIC8qIFNob3VsZCBiZSBhbiBlcnJvciwgYnV0IHdlIGNhbiBjb3BlIHdpdGggaXQgKi8KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgcGxhY2Ugc1JHQiBjaHVuayIpOworCisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIHNSR0IgY2h1bmsiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChsZW5ndGggIT0gMSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3Qgc1JHQiBjaHVuayBsZW5ndGgiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDEpOworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQorICAgICAgcmV0dXJuOworCisgICBpbnRlbnQgPSBidWZbMF07CisgICAvKiBDaGVjayBmb3IgYmFkIGludGVudCAqLworICAgaWYgKGludGVudCA+PSBQTkdfc1JHQl9JTlRFTlRfTEFTVCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIHNSR0IgaW50ZW50Iik7CisgICAgICByZXR1cm47CisgICB9CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKKyAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19nQU1BKSkKKyAgIHsKKyAgIHBuZ19maXhlZF9wb2ludCBpZ2FtbWE7CisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorICAgICAgaWdhbW1hPWluZm9fcHRyLT5pbnRfZ2FtbWE7CisjZWxzZQorIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgICAgaWdhbW1hPShwbmdfZml4ZWRfcG9pbnQpKGluZm9fcHRyLT5nYW1tYSAqIDEwMDAwMC4pOworIyAgZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKFBOR19PVVRfT0ZfUkFOR0UoaWdhbW1hLCA0NTUwMEwsIDUwMCkpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAiSWdub3JpbmcgaW5jb3JyZWN0IGdBTUEgdmFsdWUgd2hlbiBzUkdCIGlzIGFsc28gcHJlc2VudCIpOworI2lmZGVmIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAorIyAgaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvcnJlY3QgZ2FtbWE9KCVkLzEwMDAwMClcbiIsCisgICAgICAgICAgICAoaW50KXBuZ19wdHItPmludF9nYW1tYSk7CisjICBlbHNlCisjICAgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb3JyZWN0IGdhbW1hPSVmXG4iLCBwbmdfcHRyLT5nYW1tYSk7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisgICAgICB9CisgICB9CisjZW5kaWYgLyogUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVECisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2NIUk0pKQorICAgICAgaWYgKFBOR19PVVRfT0ZfUkFOR0UoaW5mb19wdHItPmludF94X3doaXRlLCAzMTI3MCwgIDEwMDApIHx8CisgICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbmZvX3B0ci0+aW50X3lfd2hpdGUsIDMyOTAwLCAgMTAwMCkgfHwKKyAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGluZm9fcHRyLT5pbnRfeF9yZWQsICAgNjQwMDBMLCAxMDAwKSB8fAorICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW5mb19wdHItPmludF95X3JlZCwgICAzMzAwMCwgIDEwMDApIHx8CisgICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbmZvX3B0ci0+aW50X3hfZ3JlZW4sIDMwMDAwLCAgMTAwMCkgfHwKKyAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGluZm9fcHRyLT5pbnRfeV9ncmVlbiwgNjAwMDBMLCAxMDAwKSB8fAorICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW5mb19wdHItPmludF94X2JsdWUsICAxNTAwMCwgIDEwMDApIHx8CisgICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbmZvX3B0ci0+aW50X3lfYmx1ZSwgICA2MDAwLCAgMTAwMCkpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICAiSWdub3JpbmcgaW5jb3JyZWN0IGNIUk0gdmFsdWUgd2hlbiBzUkdCIGlzIGFsc28gcHJlc2VudCIpOworICAgICAgICAgfQorI2VuZGlmIC8qIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQgKi8KKyNlbmRpZiAvKiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRCAqLworCisgICBwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgaW50ZW50KTsKK30KKyNlbmRpZiAvKiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV9pQ0NQKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQorLyogTm90ZTogdGhpcyBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgY2h1bmtzIHRoYXQgYXJlID4gNjRLIHVuZGVyIERPUyAqLworeworICAgcG5nX2J5dGUgY29tcHJlc3Npb25fdHlwZTsKKyAgIHBuZ19ieXRlcCBwQzsKKyAgIHBuZ19jaGFycCBwcm9maWxlOworICAgcG5nX3VpbnRfMzIgc2tpcCA9IDA7CisgICBwbmdfdWludF8zMiBwcm9maWxlX3NpemUsIHByb2ZpbGVfbGVuZ3RoOworICAgcG5nX3NpemVfdCBzbGVuZ3RoLCBwcmVmaXhfbGVuZ3RoLCBkYXRhX2xlbmd0aDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2lDQ1AiKTsKKworICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIGlDQ1AiKTsKKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgaUNDUCBhZnRlciBJREFUIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpCisgICAgICAvKiBTaG91bGQgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBjYW4gY29wZSB3aXRoIGl0ICovCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIGlDQ1AgY2h1bmsiKTsKKworICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2lDQ1ApKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBpQ0NQIGNodW5rIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJpQ0NQIGNodW5rIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5Iik7CisgICAgICBza2lwID0gbGVuZ3RoIC0gKHBuZ191aW50XzMyKTY1NTM1TDsKKyAgICAgIGxlbmd0aCA9IChwbmdfdWludF8zMik2NTUzNUw7CisgICB9CisjZW5kaWYKKworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvYyhwbmdfcHRyLCBsZW5ndGggKyAxKTsKKyAgIHNsZW5ndGggPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEsIHNsZW5ndGgpOworCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgc2tpcCkpCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX3B0ci0+Y2h1bmtkYXRhW3NsZW5ndGhdID0gMHgwMDsKKworICAgZm9yIChwcm9maWxlID0gcG5nX3B0ci0+Y2h1bmtkYXRhOyAqcHJvZmlsZTsgcHJvZmlsZSsrKQorICAgICAgLyogRW1wdHkgbG9vcCB0byBmaW5kIGVuZCBvZiBuYW1lICovIDsKKworICAgKytwcm9maWxlOworCisgICAvKiBUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIHplcm8gKHRoZSBjb21wcmVzc2lvbiB0eXBlIGJ5dGUpCisgICAgKiBmb2xsb3dpbmcgdGhlIHNlcGFyYXRvciwgYW5kIHdlIHNob3VsZCBiZSBvbiBpdAorICAgICovCisgICBpZiAoIHByb2ZpbGUgPj0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgc2xlbmd0aCAtIDEpCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNYWxmb3JtZWQgaUNDUCBjaHVuayIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBDb21wcmVzc2lvbl90eXBlIHNob3VsZCBhbHdheXMgYmUgemVybyAqLworICAgY29tcHJlc3Npb25fdHlwZSA9ICpwcm9maWxlKys7CisgICBpZiAoY29tcHJlc3Npb25fdHlwZSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJZ25vcmluZyBub256ZXJvIGNvbXByZXNzaW9uIHR5cGUgaW4gaUNDUCBjaHVuayIpOworICAgICAgY29tcHJlc3Npb25fdHlwZSA9IDB4MDA7ICAvKiBSZXNldCBpdCB0byB6ZXJvIChsaWJwbmctMS4wLjYgdGhyb3VnaCAxLjAuOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JvdGUgbm9uemVybykgKi8KKyAgIH0KKworICAgcHJlZml4X2xlbmd0aCA9IHByb2ZpbGUgLSBwbmdfcHRyLT5jaHVua2RhdGE7CisgICBwbmdfZGVjb21wcmVzc19jaHVuayhwbmdfcHRyLCBjb21wcmVzc2lvbl90eXBlLAorICAgICBzbGVuZ3RoLCBwcmVmaXhfbGVuZ3RoLCAmZGF0YV9sZW5ndGgpOworCisgICBwcm9maWxlX2xlbmd0aCA9IGRhdGFfbGVuZ3RoIC0gcHJlZml4X2xlbmd0aDsKKworICAgaWYgKCBwcmVmaXhfbGVuZ3RoID4gZGF0YV9sZW5ndGggfHwgcHJvZmlsZV9sZW5ndGggPCA0KQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUHJvZmlsZSBzaXplIGZpZWxkIG1pc3NpbmcgZnJvbSBpQ0NQIGNodW5rIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIENoZWNrIHRoZSBwcm9maWxlX3NpemUgcmVjb3JkZWQgaW4gdGhlIGZpcnN0IDMyIGJpdHMgb2YgdGhlIElDQyBwcm9maWxlICovCisgICBwQyA9IChwbmdfYnl0ZXApKHBuZ19wdHItPmNodW5rZGF0YSArIHByZWZpeF9sZW5ndGgpOworICAgcHJvZmlsZV9zaXplID0gKCgqKHBDICAgICkpPDwyNCkgfAorICAgICAgICAgICAgICAgICAgKCgqKHBDICsgMSkpPDwxNikgfAorICAgICAgICAgICAgICAgICAgKCgqKHBDICsgMikpPDwgOCkgfAorICAgICAgICAgICAgICAgICAgKCgqKHBDICsgMykpICAgICk7CisKKyAgIGlmIChwcm9maWxlX3NpemUgPCBwcm9maWxlX2xlbmd0aCkKKyAgICAgIHByb2ZpbGVfbGVuZ3RoID0gcHJvZmlsZV9zaXplOworCisgICBpZiAocHJvZmlsZV9zaXplID4gcHJvZmlsZV9sZW5ndGgpCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJZ25vcmluZyB0cnVuY2F0ZWQgaUNDUCBwcm9maWxlLiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfc2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSwKKyAgICAgY29tcHJlc3Npb25fdHlwZSwgcG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X2xlbmd0aCwgcHJvZmlsZV9sZW5ndGgpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Cit9CisjZW5kaWYgLyogUE5HX1JFQURfaUNDUF9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfc1BMVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKKy8qIE5vdGU6IHRoaXMgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8KK3sKKyAgIHBuZ19ieXRlcCBlbnRyeV9zdGFydDsKKyAgIHBuZ19zUExUX3QgbmV3X3BhbGV0dGU7CisjaWZkZWYgUE5HX1BPSU5URVJfSU5ERVhJTkdfU1VQUE9SVEVECisgICBwbmdfc1BMVF9lbnRyeXAgcHA7CisjZW5kaWYKKyAgIGludCBkYXRhX2xlbmd0aCwgZW50cnlfc2l6ZSwgaTsKKyAgIHBuZ191aW50XzMyIHNraXAgPSAwOworICAgcG5nX3NpemVfdCBzbGVuZ3RoOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfc1BMVCIpOworCisjaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorCisgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggIT0gMCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQorICAgICAgeworICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmICgtLXBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUgZm9yIHNQTFQiKTsKKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIHNQTFQiKTsKKyAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc1BMVCBhZnRlciBJREFUIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJzUExUIGNodW5rIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5Iik7CisgICAgICBza2lwID0gbGVuZ3RoIC0gKHBuZ191aW50XzMyKTY1NTM1TDsKKyAgICAgIGxlbmd0aCA9IChwbmdfdWludF8zMik2NTUzNUw7CisgICB9CisjZW5kaWYKKworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvYyhwbmdfcHRyLCBsZW5ndGggKyAxKTsKKyAgIHNsZW5ndGggPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEsIHNsZW5ndGgpOworCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgc2tpcCkpCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX3B0ci0+Y2h1bmtkYXRhW3NsZW5ndGhdID0gMHgwMDsKKworICAgZm9yIChlbnRyeV9zdGFydCA9IChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhOyAqZW50cnlfc3RhcnQ7CisgICAgICAgZW50cnlfc3RhcnQrKykKKyAgICAgIC8qIEVtcHR5IGxvb3AgdG8gZmluZCBlbmQgb2YgbmFtZSAqLyA7CisgICArK2VudHJ5X3N0YXJ0OworCisgICAvKiBBIHNhbXBsZSBkZXB0aCBzaG91bGQgZm9sbG93IHRoZSBzZXBhcmF0b3IsIGFuZCB3ZSBzaG91bGQgYmUgb24gaXQgICovCisgICBpZiAoZW50cnlfc3RhcnQgPiAocG5nX2J5dGVwKXBuZ19wdHItPmNodW5rZGF0YSArIHNsZW5ndGggLSAyKQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAibWFsZm9ybWVkIHNQTFQgY2h1bmsiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgbmV3X3BhbGV0dGUuZGVwdGggPSAqZW50cnlfc3RhcnQrKzsKKyAgIGVudHJ5X3NpemUgPSAobmV3X3BhbGV0dGUuZGVwdGggPT0gOCA/IDYgOiAxMCk7CisgICBkYXRhX2xlbmd0aCA9IChzbGVuZ3RoIC0gKGVudHJ5X3N0YXJ0IC0gKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEpKTsKKworICAgLyogSW50ZWdyaXR5LWNoZWNrIHRoZSBkYXRhIGxlbmd0aCAqLworICAgaWYgKGRhdGFfbGVuZ3RoICUgZW50cnlfc2l6ZSkKKyAgIHsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInNQTFQgY2h1bmsgaGFzIGJhZCBsZW5ndGgiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgbmV3X3BhbGV0dGUubmVudHJpZXMgPSAocG5nX2ludF8zMikgKCBkYXRhX2xlbmd0aCAvIGVudHJ5X3NpemUpOworICAgaWYgKChwbmdfdWludF8zMikgbmV3X3BhbGV0dGUubmVudHJpZXMgPgorICAgICAgIChwbmdfdWludF8zMikgKFBOR19TSVpFX01BWCAvIHBuZ19zaXplb2YocG5nX3NQTFRfZW50cnkpKSkKKyAgIHsKKyAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAic1BMVCBjaHVuayB0b28gbG9uZyIpOworICAgICAgIHJldHVybjsKKyAgIH0KKyAgIG5ld19wYWxldHRlLmVudHJpZXMgPSAocG5nX3NQTFRfZW50cnlwKXBuZ19tYWxsb2Nfd2FybigKKyAgICAgICBwbmdfcHRyLCBuZXdfcGFsZXR0ZS5uZW50cmllcyAqIHBuZ19zaXplb2YocG5nX3NQTFRfZW50cnkpKTsKKyAgIGlmIChuZXdfcGFsZXR0ZS5lbnRyaWVzID09IE5VTEwpCisgICB7CisgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInNQTFQgY2h1bmsgcmVxdWlyZXMgdG9vIG11Y2ggbWVtb3J5Iik7CisgICAgICAgcmV0dXJuOworICAgfQorCisjaWZkZWYgUE5HX1BPSU5URVJfSU5ERVhJTkdfU1VQUE9SVEVECisgICBmb3IgKGkgPSAwOyBpIDwgbmV3X3BhbGV0dGUubmVudHJpZXM7IGkrKykKKyAgIHsKKyAgICAgIHBwID0gbmV3X3BhbGV0dGUuZW50cmllcyArIGk7CisKKyAgICAgIGlmIChuZXdfcGFsZXR0ZS5kZXB0aCA9PSA4KQorICAgICAgeworICAgICAgICAgIHBwLT5yZWQgPSAqZW50cnlfc3RhcnQrKzsKKyAgICAgICAgICBwcC0+Z3JlZW4gPSAqZW50cnlfc3RhcnQrKzsKKyAgICAgICAgICBwcC0+Ymx1ZSA9ICplbnRyeV9zdGFydCsrOworICAgICAgICAgIHBwLT5hbHBoYSA9ICplbnRyeV9zdGFydCsrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIHBwLT5yZWQgICA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7CisgICAgICAgICAgcHAtPmdyZWVuID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgICAgICAgICBwcC0+Ymx1ZSAgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOworICAgICAgICAgIHBwLT5hbHBoYSA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7CisgICAgICB9CisgICAgICBwcC0+ZnJlcXVlbmN5ID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgIH0KKyNlbHNlCisgICBwcCA9IG5ld19wYWxldHRlLmVudHJpZXM7CisgICBmb3IgKGkgPSAwOyBpIDwgbmV3X3BhbGV0dGUubmVudHJpZXM7IGkrKykKKyAgIHsKKworICAgICAgaWYgKG5ld19wYWxldHRlLmRlcHRoID09IDgpCisgICAgICB7CisgICAgICAgICAgcHBbaV0ucmVkICAgPSAqZW50cnlfc3RhcnQrKzsKKyAgICAgICAgICBwcFtpXS5ncmVlbiA9ICplbnRyeV9zdGFydCsrOworICAgICAgICAgIHBwW2ldLmJsdWUgID0gKmVudHJ5X3N0YXJ0Kys7CisgICAgICAgICAgcHBbaV0uYWxwaGEgPSAqZW50cnlfc3RhcnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICBwcFtpXS5yZWQgICA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7CisgICAgICAgICAgcHBbaV0uZ3JlZW4gPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOworICAgICAgICAgIHBwW2ldLmJsdWUgID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgICAgICAgICBwcFtpXS5hbHBoYSA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7CisgICAgICB9CisgICAgICBwcC0+ZnJlcXVlbmN5ID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKKyAgIH0KKyNlbmRpZgorCisgICAvKiBEaXNjYXJkIGFsbCBjaHVuayBkYXRhIGV4Y2VwdCB0aGUgbmFtZSBhbmQgc3Rhc2ggdGhhdCAqLworICAgbmV3X3BhbGV0dGUubmFtZSA9IHBuZ19wdHItPmNodW5rZGF0YTsKKworICAgcG5nX3NldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCAmbmV3X3BhbGV0dGUsIDEpOworCisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19wYWxldHRlLmVudHJpZXMpOworfQorI2VuZGlmIC8qIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX3RSTlMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZSByZWFkYnVmW1BOR19NQVhfUEFMRVRURV9MRU5HVEhdOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfdFJOUyIpOworCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgdFJOUyIpOworICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCB0Uk5TIGFmdGVyIElEQVQiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisgICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgdFJOUyBjaHVuayIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgIHsKKyAgICAgIHBuZ19ieXRlIGJ1ZlsyXTsKKworICAgICAgaWYgKGxlbmd0aCAhPSAyKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCB0Uk5TIGNodW5rIGxlbmd0aCIpOworICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMik7CisgICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAxOworICAgICAgcG5nX3B0ci0+dHJhbnNfdmFsdWVzLmdyYXkgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsKKyAgIH0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgeworICAgICAgcG5nX2J5dGUgYnVmWzZdOworCisgICAgICBpZiAobGVuZ3RoICE9IDYpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IHRSTlMgY2h1bmsgbGVuZ3RoIik7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpbGVuZ3RoKTsKKyAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IDE7CisgICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMucmVkID0gcG5nX2dldF91aW50XzE2KGJ1Zik7CisgICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JlZW4gPSBwbmdfZ2V0X3VpbnRfMTYoYnVmICsgMik7CisgICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMuYmx1ZSA9IHBuZ19nZXRfdWludF8xNihidWYgKyA0KTsKKyAgIH0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgIHsKKyAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSkKKyAgICAgIHsKKyAgICAgICAgIC8qIFNob3VsZCBiZSBhbiBlcnJvciwgYnV0IHdlIGNhbiBjb3BlIHdpdGggaXQuICovCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTWlzc2luZyBQTFRFIGJlZm9yZSB0Uk5TIik7CisgICAgICB9CisgICAgICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKXBuZ19wdHItPm51bV9wYWxldHRlIHx8CisgICAgICAgICAgbGVuZ3RoID4gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3QgdFJOUyBjaHVuayBsZW5ndGgiKTsKKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiWmVybyBsZW5ndGggdFJOUyBjaHVuayIpOworICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCByZWFkYnVmLCAocG5nX3NpemVfdClsZW5ndGgpOworICAgICAgcG5nX3B0ci0+bnVtX3RyYW5zID0gKHBuZ191aW50XzE2KWxlbmd0aDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJ0Uk5TIGNodW5rIG5vdCBhbGxvd2VkIHdpdGggYWxwaGEgY2hhbm5lbCIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQorICAgeworICAgICAgcG5nX3B0ci0+bnVtX3RyYW5zID0gMDsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCByZWFkYnVmLCBwbmdfcHRyLT5udW1fdHJhbnMsCisgICAgICAmKHBuZ19wdHItPnRyYW5zX3ZhbHVlcykpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX2JLR0QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfc2l6ZV90IHRydWVsZW47CisgICBwbmdfYnl0ZSBidWZbNl07CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9iS0dEIik7CisKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBiS0dEIik7CisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGJLR0QgYWZ0ZXIgSURBVCIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgorICAgICAgICAgICAgIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTWlzc2luZyBQTFRFIGJlZm9yZSBiS0dEIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fYktHRCkpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIGJLR0QgY2h1bmsiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB0cnVlbGVuID0gMTsKKyAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgICAgIHRydWVsZW4gPSA2OworICAgZWxzZQorICAgICAgdHJ1ZWxlbiA9IDI7CisKKyAgIGlmIChsZW5ndGggIT0gdHJ1ZWxlbikKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3QgYktHRCBjaHVuayBsZW5ndGgiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIHRydWVsZW4pOworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQorICAgICAgcmV0dXJuOworCisgICAvKiBXZSBjb252ZXJ0IHRoZSBpbmRleCB2YWx1ZSBpbnRvIFJHQiBjb21wb25lbnRzIHNvIHRoYXQgd2UgY2FuIGFsbG93CisgICAgKiBhcmJpdHJhcnkgUkdCIHZhbHVlcyBmb3IgYmFja2dyb3VuZCB3aGVuIHdlIGhhdmUgdHJhbnNwYXJlbmN5LCBhbmQKKyAgICAqIHNvIGl0IGlzIGVhc3kgdG8gZGV0ZXJtaW5lIHRoZSBSR0IgdmFsdWVzIG9mIHRoZSBiYWNrZ3JvdW5kIGNvbG9yCisgICAgKiBmcm9tIHRoZSBpbmZvX3B0ciBzdHJ1Y3QuICovCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgeworICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5pbmRleCA9IGJ1ZlswXTsKKyAgICAgIGlmIChpbmZvX3B0ciAmJiBpbmZvX3B0ci0+bnVtX3BhbGV0dGUpCisgICAgICB7CisgICAgICAgICAgaWYgKGJ1ZlswXSA+PSBpbmZvX3B0ci0+bnVtX3BhbGV0dGUpCisgICAgICAgICAgeworICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3QgYktHRCBjaHVuayBpbmRleCB2YWx1ZSIpOworICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPQorICAgICAgICAgICAgIChwbmdfdWludF8xNilwbmdfcHRyLT5wYWxldHRlW2J1ZlswXV0ucmVkOworICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gPQorICAgICAgICAgICAgIChwbmdfdWludF8xNilwbmdfcHRyLT5wYWxldHRlW2J1ZlswXV0uZ3JlZW47CisgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0KKyAgICAgICAgICAgICAocG5nX3VpbnRfMTYpcG5nX3B0ci0+cGFsZXR0ZVtidWZbMF1dLmJsdWU7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmICghKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpIC8qIEdSQVkgKi8KKyAgIHsKKyAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0KKyAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gPQorICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlID0KKyAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSA9IHBuZ19nZXRfdWludF8xNihidWYpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsKKyAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4gPSBwbmdfZ2V0X3VpbnRfMTYoYnVmICsgMik7CisgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmICsgNCk7CisgICB9CisKKyAgIHBuZ19zZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJihwbmdfcHRyLT5iYWNrZ3JvdW5kKSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfaElTVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHVuc2lnbmVkIGludCBudW0sIGk7CisgICBwbmdfdWludF8xNiByZWFkYnVmW1BOR19NQVhfUEFMRVRURV9MRU5HVEhdOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfaElTVCIpOworCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgaElTVCIpOworICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBoSVNUIGFmdGVyIElEQVQiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisgICBlbHNlIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIGhJU1QiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisgICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19oSVNUKSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgaElTVCBjaHVuayIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgbnVtID0gbGVuZ3RoIC8gMiA7CisgICBpZiAobnVtICE9ICh1bnNpZ25lZCBpbnQpIHBuZ19wdHItPm51bV9wYWxldHRlIHx8IG51bSA+CisgICAgICAodW5zaWduZWQgaW50KSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBoSVNUIGNodW5rIGxlbmd0aCIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICAgeworICAgICAgcG5nX2J5dGUgYnVmWzJdOworCisgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAyKTsKKyAgICAgIHJlYWRidWZbaV0gPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsKKyAgIH0KKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQorICAgICAgcmV0dXJuOworCisgICBwbmdfc2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIHJlYWRidWYpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX3BIWXMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZSBidWZbOV07CisgICBwbmdfdWludF8zMiByZXNfeCwgcmVzX3k7CisgICBpbnQgdW5pdF90eXBlOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfcEhZcyIpOworCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgcEhZcyIpOworICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBwSFlzIGFmdGVyIElEQVQiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisgICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgcEhZcyBjaHVuayIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKGxlbmd0aCAhPSA5KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBwSFlzIGNodW5rIGxlbmd0aCIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgOSk7CisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCisgICAgICByZXR1cm47CisKKyAgIHJlc194ID0gcG5nX2dldF91aW50XzMyKGJ1Zik7CisgICByZXNfeSA9IHBuZ19nZXRfdWludF8zMihidWYgKyA0KTsKKyAgIHVuaXRfdHlwZSA9IGJ1Zls4XTsKKyAgIHBuZ19zZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgcmVzX3gsIHJlc195LCB1bml0X3R5cGUpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX29GRnMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZSBidWZbOV07CisgICBwbmdfaW50XzMyIG9mZnNldF94LCBvZmZzZXRfeTsKKyAgIGludCB1bml0X3R5cGU7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9vRkZzIik7CisKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBvRkZzIik7CisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIG9GRnMgYWZ0ZXIgSURBVCIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBvRkZzIGNodW5rIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAobGVuZ3RoICE9IDkpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IG9GRnMgY2h1bmsgbGVuZ3RoIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCA5KTsKKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKKyAgICAgIHJldHVybjsKKworICAgb2Zmc2V0X3ggPSBwbmdfZ2V0X2ludF8zMihidWYpOworICAgb2Zmc2V0X3kgPSBwbmdfZ2V0X2ludF8zMihidWYgKyA0KTsKKyAgIHVuaXRfdHlwZSA9IGJ1Zls4XTsKKyAgIHBuZ19zZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgb2Zmc2V0X3gsIG9mZnNldF95LCB1bml0X3R5cGUpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAorLyogUmVhZCB0aGUgcENBTCBjaHVuayAoZGVzY3JpYmVkIGluIHRoZSBQTkcgRXh0ZW5zaW9ucyBkb2N1bWVudCkgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV9wQ0FMKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgcG5nX2ludF8zMiBYMCwgWDE7CisgICBwbmdfYnl0ZSB0eXBlLCBucGFyYW1zOworICAgcG5nX2NoYXJwIGJ1ZiwgdW5pdHMsIGVuZHB0cjsKKyAgIHBuZ19jaGFycHAgcGFyYW1zOworICAgcG5nX3NpemVfdCBzbGVuZ3RoOworICAgaW50IGk7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9wQ0FMIik7CisKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBwQ0FMIik7CisgICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHBDQUwgYWZ0ZXIgSURBVCIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BDQUwpKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBwQ0FMIGNodW5rIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfZGVidWcxKDIsICJBbGxvY2F0aW5nIGFuZCByZWFkaW5nIHBDQUwgY2h1bmsgZGF0YSAoJWx1IGJ5dGVzKSIsCisgICAgICBsZW5ndGggKyAxKTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICBwbmdfcHRyLT5jaHVua2RhdGEgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGggKyAxKTsKKyAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgPT0gTlVMTCkKKyAgICAgeworICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJObyBtZW1vcnkgZm9yIHBDQUwgcHVycG9zZS4iKTsKKyAgICAgICByZXR1cm47CisgICAgIH0KKyAgIHNsZW5ndGggPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEsIHNsZW5ndGgpOworCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX3B0ci0+Y2h1bmtkYXRhW3NsZW5ndGhdID0gMHgwMDsgLyogTnVsbCB0ZXJtaW5hdGUgdGhlIGxhc3Qgc3RyaW5nICovCisKKyAgIHBuZ19kZWJ1ZygzLCAiRmluZGluZyBlbmQgb2YgcENBTCBwdXJwb3NlIHN0cmluZyIpOworICAgZm9yIChidWYgPSBwbmdfcHRyLT5jaHVua2RhdGE7ICpidWY7IGJ1ZisrKQorICAgICAgLyogRW1wdHkgbG9vcCAqLyA7CisKKyAgIGVuZHB0ciA9IHBuZ19wdHItPmNodW5rZGF0YSArIHNsZW5ndGg7CisKKyAgIC8qIFdlIG5lZWQgdG8gaGF2ZSBhdCBsZWFzdCAxMiBieXRlcyBhZnRlciB0aGUgcHVycG9zZSBzdHJpbmcKKyAgICAgIGluIG9yZGVyIHRvIGdldCB0aGUgcGFyYW1ldGVyIGluZm9ybWF0aW9uLiAqLworICAgaWYgKGVuZHB0ciA8PSBidWYgKyAxMikKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHBDQUwgZGF0YSIpOworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19kZWJ1ZygzLCAiUmVhZGluZyBwQ0FMIFgwLCBYMSwgdHlwZSwgbnBhcmFtcywgYW5kIHVuaXRzIik7CisgICBYMCA9IHBuZ19nZXRfaW50XzMyKChwbmdfYnl0ZXApYnVmKzEpOworICAgWDEgPSBwbmdfZ2V0X2ludF8zMigocG5nX2J5dGVwKWJ1Zis1KTsKKyAgIHR5cGUgPSBidWZbOV07CisgICBucGFyYW1zID0gYnVmWzEwXTsKKyAgIHVuaXRzID0gYnVmICsgMTE7CisKKyAgIHBuZ19kZWJ1ZygzLCAiQ2hlY2tpbmcgcENBTCBlcXVhdGlvbiB0eXBlIGFuZCBudW1iZXIgb2YgcGFyYW1ldGVycyIpOworICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSByaWdodCBudW1iZXIgb2YgcGFyYW1ldGVycyBmb3Iga25vd24KKyAgICAgIGVxdWF0aW9uIHR5cGVzLiAqLworICAgaWYgKCh0eXBlID09IFBOR19FUVVBVElPTl9MSU5FQVIgJiYgbnBhcmFtcyAhPSAyKSB8fAorICAgICAgICh0eXBlID09IFBOR19FUVVBVElPTl9CQVNFX0UgJiYgbnBhcmFtcyAhPSAzKSB8fAorICAgICAgICh0eXBlID09IFBOR19FUVVBVElPTl9BUkJJVFJBUlkgJiYgbnBhcmFtcyAhPSAzKSB8fAorICAgICAgICh0eXBlID09IFBOR19FUVVBVElPTl9IWVBFUkJPTElDICYmIG5wYXJhbXMgIT0gNCkpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBwQ0FMIHBhcmFtZXRlcnMgZm9yIGVxdWF0aW9uIHR5cGUiKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOworICAgICAgcmV0dXJuOworICAgfQorICAgZWxzZSBpZiAodHlwZSA+PSBQTkdfRVFVQVRJT05fTEFTVCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbnJlY29nbml6ZWQgZXF1YXRpb24gdHlwZSBmb3IgcENBTCBjaHVuayIpOworICAgfQorCisgICBmb3IgKGJ1ZiA9IHVuaXRzOyAqYnVmOyBidWYrKykKKyAgICAgIC8qIEVtcHR5IGxvb3AgdG8gbW92ZSBwYXN0IHRoZSB1bml0cyBzdHJpbmcuICovIDsKKworICAgcG5nX2RlYnVnKDMsICJBbGxvY2F0aW5nIHBDQUwgcGFyYW1ldGVycyBhcnJheSIpOworICAgcGFyYW1zID0gKHBuZ19jaGFycHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCisgICAgICAocG5nX3VpbnRfMzIpKG5wYXJhbXMgKiBwbmdfc2l6ZW9mKHBuZ19jaGFycCkpKSA7CisgICBpZiAocGFyYW1zID09IE5VTEwpCisgICAgIHsKKyAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vIG1lbW9yeSBmb3IgcENBTCBwYXJhbXMuIik7CisgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgIC8qIEdldCBwb2ludGVycyB0byB0aGUgc3RhcnQgb2YgZWFjaCBwYXJhbWV0ZXIgc3RyaW5nLiAqLworICAgZm9yIChpID0gMDsgaSA8IChpbnQpbnBhcmFtczsgaSsrKQorICAgeworICAgICAgYnVmKys7IC8qIFNraXAgdGhlIG51bGwgc3RyaW5nIHRlcm1pbmF0b3IgZnJvbSBwcmV2aW91cyBwYXJhbWV0ZXIuICovCisKKyAgICAgIHBuZ19kZWJ1ZzEoMywgIlJlYWRpbmcgcENBTCBwYXJhbWV0ZXIgJWQiLCBpKTsKKyAgICAgIGZvciAocGFyYW1zW2ldID0gYnVmOyBidWYgPD0gZW5kcHRyICYmICpidWYgIT0gMHgwMDsgYnVmKyspCisgICAgICAgICAvKiBFbXB0eSBsb29wIHRvIG1vdmUgcGFzdCBlYWNoIHBhcmFtZXRlciBzdHJpbmcgKi8gOworCisgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZW4ndCBydW4gb3V0IG9mIGRhdGEgeWV0ICovCisgICAgICBpZiAoYnVmID4gZW5kcHRyKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgcENBTCBkYXRhIik7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBhcmFtcyk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisKKyAgIHBuZ19zZXRfcENBTChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhLCBYMCwgWDEsIHR5cGUsIG5wYXJhbXMsCisgICAgICB1bml0cywgcGFyYW1zKTsKKworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwYXJhbXMpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAorLyogUmVhZCB0aGUgc0NBTCBjaHVuayAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX3NDQUwocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfY2hhcnAgZXA7CisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgZG91YmxlIHdpZHRoLCBoZWlnaHQ7CisgICBwbmdfY2hhcnAgdnA7CisjZWxzZQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyAgIHBuZ19jaGFycCBzd2lkdGgsIHNoZWlnaHQ7CisjZW5kaWYKKyNlbmRpZgorICAgcG5nX3NpemVfdCBzbGVuZ3RoOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfc0NBTCIpOworCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgc0NBTCIpOworICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIGFmdGVyIElEQVQiKTsKKyAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICB9CisgICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQ0FMKSkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgc0NBTCBjaHVuayIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX2RlYnVnMSgyLCAiQWxsb2NhdGluZyBhbmQgcmVhZGluZyBzQ0FMIGNodW5rIGRhdGEgKCVsdSBieXRlcykiLAorICAgICAgbGVuZ3RoICsgMSk7CisgICBwbmdfcHRyLT5jaHVua2RhdGEgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGggKyAxKTsKKyAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgbWVtb3J5IHdoaWxlIHByb2Nlc3Npbmcgc0NBTCBjaHVuayIpOworICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIHNsZW5ndGggPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEsIHNsZW5ndGgpOworCisgICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCisgICB7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcG5nX3B0ci0+Y2h1bmtkYXRhW3NsZW5ndGhdID0gMHgwMDsgLyogTnVsbCB0ZXJtaW5hdGUgdGhlIGxhc3Qgc3RyaW5nICovCisKKyAgIGVwID0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgMTsgICAgICAgIC8qIFNraXAgdW5pdCBieXRlICovCisKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisgICB3aWR0aCA9IHBuZ19zdHJ0b2QocG5nX3B0ciwgZXAsICZ2cCk7CisgICBpZiAoKnZwKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIm1hbGZvcm1lZCB3aWR0aCBzdHJpbmcgaW4gc0NBTCBjaHVuayIpOworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgICByZXR1cm47CisgICB9CisjZWxzZQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyAgIHN3aWR0aCA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIHBuZ19zdHJsZW4oZXApICsgMSk7CisgICBpZiAoc3dpZHRoID09IE5VTEwpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIG1lbW9yeSB3aGlsZSBwcm9jZXNzaW5nIHNDQUwgY2h1bmsgd2lkdGgiKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOworICAgICAgcmV0dXJuOworICAgfQorICAgcG5nX21lbWNweShzd2lkdGgsIGVwLCAocG5nX3NpemVfdClwbmdfc3RybGVuKGVwKSk7CisjZW5kaWYKKyNlbmRpZgorCisgICBmb3IgKGVwID0gcG5nX3B0ci0+Y2h1bmtkYXRhOyAqZXA7IGVwKyspCisgICAgICAvKiBFbXB0eSBsb29wICovIDsKKyAgIGVwKys7CisKKyAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIDwgZXApCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVHJ1bmNhdGVkIHNDQUwgY2h1bmsiKTsKKyNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBzd2lkdGgpOworI2VuZGlmCisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgIH0KKworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIGhlaWdodCA9IHBuZ19zdHJ0b2QocG5nX3B0ciwgZXAsICZ2cCk7CisgICBpZiAoKnZwKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIm1hbGZvcm1lZCBoZWlnaHQgc3RyaW5nIGluIHNDQUwgY2h1bmsiKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOworI2lmIGRlZmluZWQoUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHN3aWR0aCk7CisjZW5kaWYKKyAgICAgIHJldHVybjsKKyAgIH0KKyNlbHNlCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorICAgc2hlaWdodCA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIHBuZ19zdHJsZW4oZXApICsgMSk7CisgICBpZiAoc2hlaWdodCA9PSBOVUxMKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkgd2hpbGUgcHJvY2Vzc2luZyBzQ0FMIGNodW5rIGhlaWdodCIpOworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisjaWYgZGVmaW5lZChQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQorICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgc3dpZHRoKTsKKyNlbmRpZgorICAgICAgcmV0dXJuOworICAgfQorICAgcG5nX21lbWNweShzaGVpZ2h0LCBlcCwgKHBuZ19zaXplX3QpcG5nX3N0cmxlbihlcCkpOworI2VuZGlmCisjZW5kaWYKKworICAgaWYgKHBuZ19wdHItPmNodW5rZGF0YSArIHNsZW5ndGggPCBlcAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgICAgIHx8IHdpZHRoIDw9IDAuIHx8IGhlaWdodCA8PSAwLgorI2VuZGlmCisgICAgICApCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQ0FMIGRhdGEiKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOworI2lmIGRlZmluZWQoUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHN3aWR0aCk7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBzaGVpZ2h0KTsKKyNlbmRpZgorICAgICAgcmV0dXJuOworICAgfQorCisKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisgICBwbmdfc2V0X3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPmNodW5rZGF0YVswXSwgd2lkdGgsIGhlaWdodCk7CisjZWxzZQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyAgIHBuZ19zZXRfc0NBTF9zKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5jaHVua2RhdGFbMF0sIHN3aWR0aCwgc2hlaWdodCk7CisjZW5kaWYKKyNlbmRpZgorCisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCisgICBwbmdfZnJlZShwbmdfcHRyLCBzd2lkdGgpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgc2hlaWdodCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV90SU1FKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgcG5nX2J5dGUgYnVmWzddOworICAgcG5nX3RpbWUgbW9kX3RpbWU7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV90SU1FIik7CisKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIHRJTUUgY2h1bmsiKTsKKyAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RJTUUpKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSB0SU1FIGNodW5rIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOworCisgICBpZiAobGVuZ3RoICE9IDcpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IHRJTUUgY2h1bmsgbGVuZ3RoIik7CisgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCA3KTsKKyAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKKyAgICAgIHJldHVybjsKKworICAgbW9kX3RpbWUuc2Vjb25kID0gYnVmWzZdOworICAgbW9kX3RpbWUubWludXRlID0gYnVmWzVdOworICAgbW9kX3RpbWUuaG91ciA9IGJ1Zls0XTsKKyAgIG1vZF90aW1lLmRheSA9IGJ1ZlszXTsKKyAgIG1vZF90aW1lLm1vbnRoID0gYnVmWzJdOworICAgbW9kX3RpbWUueWVhciA9IHBuZ19nZXRfdWludF8xNihidWYpOworCisgICBwbmdfc2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2RfdGltZSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVECisvKiBOb3RlOiB0aGlzIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSBjaHVua3MgdGhhdCBhcmUgPiA2NEsgdW5kZXIgRE9TICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19oYW5kbGVfdEVYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgIHBuZ190ZXh0cCB0ZXh0X3B0cjsKKyAgIHBuZ19jaGFycCBrZXk7CisgICBwbmdfY2hhcnAgdGV4dDsKKyAgIHBuZ191aW50XzMyIHNraXAgPSAwOworICAgcG5nX3NpemVfdCBzbGVuZ3RoOworICAgaW50IHJldDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3RFWHQiKTsKKworI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCisgICAgICB7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKC0tcG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPT0gMSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJObyBzcGFjZSBpbiBjaHVuayBjYWNoZSBmb3IgdEVYdCIpOworICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisgICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgdEVYdCIpOworCisgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOworCisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJ0RVh0IGNodW5rIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5Iik7CisgICAgICBza2lwID0gbGVuZ3RoIC0gKHBuZ191aW50XzMyKTY1NTM1TDsKKyAgICAgIGxlbmd0aCA9IChwbmdfdWludF8zMik2NTUzNUw7CisgICB9CisjZW5kaWYKKworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKworICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoICsgMSk7CisgICBpZiAocG5nX3B0ci0+Y2h1bmtkYXRhID09IE5VTEwpCisgICB7CisgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJObyBtZW1vcnkgdG8gcHJvY2VzcyB0ZXh0IGNodW5rLiIpOworICAgICByZXR1cm47CisgICB9CisgICBzbGVuZ3RoID0gKHBuZ19zaXplX3QpbGVuZ3RoOworICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhLCBzbGVuZ3RoKTsKKworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIHNraXApKQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGtleSA9IHBuZ19wdHItPmNodW5rZGF0YTsKKworICAga2V5W3NsZW5ndGhdID0gMHgwMDsKKworICAgZm9yICh0ZXh0ID0ga2V5OyAqdGV4dDsgdGV4dCsrKQorICAgICAgLyogRW1wdHkgbG9vcCB0byBmaW5kIGVuZCBvZiBrZXkgKi8gOworCisgICBpZiAodGV4dCAhPSBrZXkgKyBzbGVuZ3RoKQorICAgICAgdGV4dCsrOworCisgICB0ZXh0X3B0ciA9IChwbmdfdGV4dHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCisgICAgICAocG5nX3VpbnRfMzIpcG5nX3NpemVvZihwbmdfdGV4dCkpOworICAgaWYgKHRleHRfcHRyID09IE5VTEwpCisgICB7CisgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBwcm9jZXNzIHRleHQgY2h1bmsuIik7CisgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgIHJldHVybjsKKyAgIH0KKyAgIHRleHRfcHRyLT5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICB0ZXh0X3B0ci0+a2V5ID0ga2V5OworI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorICAgdGV4dF9wdHItPmxhbmcgPSBOVUxMOworICAgdGV4dF9wdHItPmxhbmdfa2V5ID0gTlVMTDsKKyAgIHRleHRfcHRyLT5pdHh0X2xlbmd0aCA9IDA7CisjZW5kaWYKKyAgIHRleHRfcHRyLT50ZXh0ID0gdGV4dDsKKyAgIHRleHRfcHRyLT50ZXh0X2xlbmd0aCA9IHBuZ19zdHJsZW4odGV4dCk7CisKKyAgIHJldCA9IHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgMSk7CisKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOworICAgcG5nX2ZyZWUocG5nX3B0ciwgdGV4dF9wdHIpOworICAgaWYgKHJldCkKKyAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgdG8gcHJvY2VzcyB0ZXh0IGNodW5rLiIpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAorLyogTm90ZTogdGhpcyBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2hhbmRsZV96VFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQoreworICAgcG5nX3RleHRwIHRleHRfcHRyOworICAgcG5nX2NoYXJwIHRleHQ7CisgICBpbnQgY29tcF90eXBlOworICAgaW50IHJldDsKKyAgIHBuZ19zaXplX3Qgc2xlbmd0aCwgcHJlZml4X2xlbiwgZGF0YV9sZW47CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV96VFh0Iik7CisKKyNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggIT0gMCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQorICAgICAgeworICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmICgtLXBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gc3BhY2UgaW4gY2h1bmsgY2FjaGUgZm9yIHpUWHQiKTsKKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIHpUWHQiKTsKKworICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKKworI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SworICAgLyogV2Ugd2lsbCBubyBkb3VidCBoYXZlIHByb2JsZW1zIHdpdGggY2h1bmtzIGV2ZW4gaGFsZiB0aGlzIHNpemUsIGJ1dAorICAgICAgdGhlcmUgaXMgbm8gaGFyZCBhbmQgZmFzdCBydWxlIHRvIHRlbGwgdXMgd2hlcmUgdG8gc3RvcC4gKi8KKyAgIGlmIChsZW5ndGggPiAocG5nX3VpbnRfMzIpNjU1MzVMKQorICAgeworICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAielRYdCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOworICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICByZXR1cm47CisgICB9CisjZW5kaWYKKworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCArIDEpOworICAgaWYgKHBuZ19wdHItPmNodW5rZGF0YSA9PSBOVUxMKQorICAgeworICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIG1lbW9yeSBwcm9jZXNzaW5nIHpUWHQgY2h1bmsuIik7CisgICAgIHJldHVybjsKKyAgIH0KKyAgIHNsZW5ndGggPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEsIHNsZW5ndGgpOworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19wdHItPmNodW5rZGF0YVtzbGVuZ3RoXSA9IDB4MDA7CisKKyAgIGZvciAodGV4dCA9IHBuZ19wdHItPmNodW5rZGF0YTsgKnRleHQ7IHRleHQrKykKKyAgICAgIC8qIEVtcHR5IGxvb3AgKi8gOworCisgICAvKiB6VFh0IG11c3QgaGF2ZSBzb21lIHRleHQgYWZ0ZXIgdGhlIGNodW5rZGF0YXdvcmQgKi8KKyAgIGlmICh0ZXh0ID49IHBuZ19wdHItPmNodW5rZGF0YSArIHNsZW5ndGggLSAyKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRlZCB6VFh0IGNodW5rIik7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICBjb21wX3R5cGUgPSAqKCsrdGV4dCk7CisgICAgICAgaWYgKGNvbXBfdHlwZSAhPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0KQorICAgICAgIHsKKyAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBjb21wcmVzc2lvbiB0eXBlIGluIHpUWHQgY2h1bmsiKTsKKyAgICAgICAgICBjb21wX3R5cGUgPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0OworICAgICAgIH0KKyAgICAgICB0ZXh0Kys7ICAgICAgICAvKiBTa2lwIHRoZSBjb21wcmVzc2lvbl9tZXRob2QgYnl0ZSAqLworICAgfQorICAgcHJlZml4X2xlbiA9IHRleHQgLSBwbmdfcHRyLT5jaHVua2RhdGE7CisKKyAgIHBuZ19kZWNvbXByZXNzX2NodW5rKHBuZ19wdHIsIGNvbXBfdHlwZSwKKyAgICAgKHBuZ19zaXplX3QpbGVuZ3RoLCBwcmVmaXhfbGVuLCAmZGF0YV9sZW4pOworCisgICB0ZXh0X3B0ciA9IChwbmdfdGV4dHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCisgICAgICAocG5nX3VpbnRfMzIpcG5nX3NpemVvZihwbmdfdGV4dCkpOworICAgaWYgKHRleHRfcHRyID09IE5VTEwpCisgICB7CisgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBwcm9jZXNzIHpUWHQgY2h1bmsuIik7CisgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgIHJldHVybjsKKyAgIH0KKyAgIHRleHRfcHRyLT5jb21wcmVzc2lvbiA9IGNvbXBfdHlwZTsKKyAgIHRleHRfcHRyLT5rZXkgPSBwbmdfcHRyLT5jaHVua2RhdGE7CisjaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECisgICB0ZXh0X3B0ci0+bGFuZyA9IE5VTEw7CisgICB0ZXh0X3B0ci0+bGFuZ19rZXkgPSBOVUxMOworICAgdGV4dF9wdHItPml0eHRfbGVuZ3RoID0gMDsKKyNlbmRpZgorICAgdGV4dF9wdHItPnRleHQgPSBwbmdfcHRyLT5jaHVua2RhdGEgKyBwcmVmaXhfbGVuOworICAgdGV4dF9wdHItPnRleHRfbGVuZ3RoID0gZGF0YV9sZW47CisKKyAgIHJldCA9IHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgMSk7CisKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHRfcHRyKTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOworICAgaWYgKHJldCkKKyAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHN0b3JlIHpUWHQgY2h1bmsuIik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVECisvKiBOb3RlOiB0aGlzIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgY2h1bmtzIHRoYXQgYXJlID4gNjRLIHVuZGVyIERPUyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX2lUWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfdGV4dHAgdGV4dF9wdHI7CisgICBwbmdfY2hhcnAga2V5LCBsYW5nLCB0ZXh0LCBsYW5nX2tleTsKKyAgIGludCBjb21wX2ZsYWc7CisgICBpbnQgY29tcF90eXBlID0gMDsKKyAgIGludCByZXQ7CisgICBwbmdfc2l6ZV90IHNsZW5ndGgsIHByZWZpeF9sZW4sIGRhdGFfbGVuOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfaVRYdCIpOworCisjaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ICE9IDApCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPT0gMSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoLS1wbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCA9PSAxKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vIHNwYWNlIGluIGNodW5rIGNhY2hlIGZvciBpVFh0Iik7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBpVFh0Iik7CisKKyAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKKyAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7CisKKyNpZmRlZiBQTkdfTUFYX01BTExPQ182NEsKKyAgIC8qIFdlIHdpbGwgbm8gZG91YnQgaGF2ZSBwcm9ibGVtcyB3aXRoIGNodW5rcyBldmVuIGhhbGYgdGhpcyBzaXplLCBidXQKKyAgICAgIHRoZXJlIGlzIG5vIGhhcmQgYW5kIGZhc3QgcnVsZSB0byB0ZWxsIHVzIHdoZXJlIHRvIHN0b3AuICovCisgICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKKyAgIHsKKyAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImlUWHQgY2h1bmsgdG9vIGxhcmdlIHRvIGZpdCBpbiBtZW1vcnkiKTsKKyAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgcmV0dXJuOworICAgfQorI2VuZGlmCisKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICBwbmdfcHRyLT5jaHVua2RhdGEgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGggKyAxKTsKKyAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgPT0gTlVMTCkKKyAgIHsKKyAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vIG1lbW9yeSB0byBwcm9jZXNzIGlUWHQgY2h1bmsuIik7CisgICAgIHJldHVybjsKKyAgIH0KKyAgIHNsZW5ndGggPSAocG5nX3NpemVfdClsZW5ndGg7CisgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEsIHNsZW5ndGgpOworICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBuZ19wdHItPmNodW5rZGF0YVtzbGVuZ3RoXSA9IDB4MDA7CisKKyAgIGZvciAobGFuZyA9IHBuZ19wdHItPmNodW5rZGF0YTsgKmxhbmc7IGxhbmcrKykKKyAgICAgIC8qIEVtcHR5IGxvb3AgKi8gOworICAgbGFuZysrOyAgICAgICAgLyogU2tpcCBOVUwgc2VwYXJhdG9yICovCisKKyAgIC8qIGlUWHQgbXVzdCBoYXZlIGEgbGFuZ3VhZ2UgdGFnIChwb3NzaWJseSBlbXB0eSksIHR3byBjb21wcmVzc2lvbiBieXRlcywKKyAgICAqIHRyYW5zbGF0ZWQga2V5d29yZCAocG9zc2libHkgZW1wdHkpLCBhbmQgcG9zc2libHkgc29tZSB0ZXh0IGFmdGVyIHRoZQorICAgICoga2V5d29yZAorICAgICovCisKKyAgIGlmIChsYW5nID49IHBuZ19wdHItPmNodW5rZGF0YSArIHNsZW5ndGggLSAzKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRlZCBpVFh0IGNodW5rIik7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICBjb21wX2ZsYWcgPSAqbGFuZysrOworICAgICAgIGNvbXBfdHlwZSA9ICpsYW5nKys7CisgICB9CisKKyAgIGZvciAobGFuZ19rZXkgPSBsYW5nOyAqbGFuZ19rZXk7IGxhbmdfa2V5KyspCisgICAgICAvKiBFbXB0eSBsb29wICovIDsKKyAgIGxhbmdfa2V5Kys7ICAgICAgICAvKiBTa2lwIE5VTCBzZXBhcmF0b3IgKi8KKworICAgaWYgKGxhbmdfa2V5ID49IHBuZ19wdHItPmNodW5rZGF0YSArIHNsZW5ndGgpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVHJ1bmNhdGVkIGlUWHQgY2h1bmsiKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7CisgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOworICAgICAgcmV0dXJuOworICAgfQorCisgICBmb3IgKHRleHQgPSBsYW5nX2tleTsgKnRleHQ7IHRleHQrKykKKyAgICAgIC8qIEVtcHR5IGxvb3AgKi8gOworICAgdGV4dCsrOyAgICAgICAgLyogU2tpcCBOVUwgc2VwYXJhdG9yICovCisgICBpZiAodGV4dCA+PSBwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk1hbGZvcm1lZCBpVFh0IGNodW5rIik7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOworICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcHJlZml4X2xlbiA9IHRleHQgLSBwbmdfcHRyLT5jaHVua2RhdGE7CisKKyAgIGtleT1wbmdfcHRyLT5jaHVua2RhdGE7CisgICBpZiAoY29tcF9mbGFnKQorICAgICAgIHBuZ19kZWNvbXByZXNzX2NodW5rKHBuZ19wdHIsIGNvbXBfdHlwZSwKKyAgICAgICAgIChzaXplX3QpbGVuZ3RoLCBwcmVmaXhfbGVuLCAmZGF0YV9sZW4pOworICAgZWxzZQorICAgICAgIGRhdGFfbGVuID0gcG5nX3N0cmxlbihwbmdfcHRyLT5jaHVua2RhdGEgKyBwcmVmaXhfbGVuKTsKKyAgIHRleHRfcHRyID0gKHBuZ190ZXh0cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKKyAgICAgIChwbmdfdWludF8zMilwbmdfc2l6ZW9mKHBuZ190ZXh0KSk7CisgICBpZiAodGV4dF9wdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHByb2Nlc3MgaVRYdCBjaHVuay4iKTsKKyAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKKyAgICAgcmV0dXJuOworICAgfQorICAgdGV4dF9wdHItPmNvbXByZXNzaW9uID0gKGludCljb21wX2ZsYWcgKyAxOworICAgdGV4dF9wdHItPmxhbmdfa2V5ID0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgKGxhbmdfa2V5IC0ga2V5KTsKKyAgIHRleHRfcHRyLT5sYW5nID0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgKGxhbmcgLSBrZXkpOworICAgdGV4dF9wdHItPml0eHRfbGVuZ3RoID0gZGF0YV9sZW47CisgICB0ZXh0X3B0ci0+dGV4dF9sZW5ndGggPSAwOworICAgdGV4dF9wdHItPmtleSA9IHBuZ19wdHItPmNodW5rZGF0YTsKKyAgIHRleHRfcHRyLT50ZXh0ID0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X2xlbjsKKworICAgcmV0ID0gcG5nX3NldF90ZXh0XzIocG5nX3B0ciwgaW5mb19wdHIsIHRleHRfcHRyLCAxKTsKKworICAgcG5nX2ZyZWUocG5nX3B0ciwgdGV4dF9wdHIpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKKyAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7CisgICBpZiAocmV0KQorICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgdG8gc3RvcmUgaVRYdCBjaHVuay4iKTsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIGhhdmVuJ3QgZm91bmQgYSBoYW5kbGVyIGZvciBhCisgICBjaHVuay4gIElmIHRoZXJlIGlzbid0IGEgcHJvYmxlbSB3aXRoIHRoZSBjaHVuayBpdHNlbGYgKGllIGJhZAorICAgY2h1bmsgbmFtZSwgQ1JDLCBvciBhIGNyaXRpY2FsIGNodW5rKSwgdGhlIGNodW5rIGlzIHNpbGVudGx5IGlnbm9yZWQKKyAgIC0tIHVubGVzcyB0aGUgUE5HX0ZMQUdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEIGZsYWcgaXMgb24gaW4gd2hpY2gKKyAgIGNhc2UgaXQgd2lsbCBiZSBzYXZlZCBhd2F5IHRvIGJlIHdyaXR0ZW4gb3V0IGxhdGVyLiAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfaGFuZGxlX3Vua25vd24ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfdWludF8zMiBza2lwID0gMDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3Vua25vd24iKTsKKworI2lmZGVmIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX2NhY2hlX21heCAhPSAwKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnVzZXJfY2h1bmtfY2FjaGVfbWF4ID09IDEpCisgICAgICB7CisgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKC0tcG5nX3B0ci0+dXNlcl9jaHVua19jYWNoZV9tYXggPT0gMSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJObyBzcGFjZSBpbiBjaHVuayBjYWNoZSBmb3IgdW5rbm93biBjaHVuayIpOworICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisgICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCisgICB7CisjaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKKyAgICAgIFBOR19DT05TVCBQTkdfSURBVDsKKyNlbmRpZgorICAgICAgaWYgKHBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKSAgLyogTm90IGFuIElEQVQgKi8KKyAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7CisgICB9CisKKyAgIGlmICghKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSkKKyAgIHsKKyNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECisgICAgICBpZiAocG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUpICE9CisgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTCisjaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECisgICAgICAgICAgICYmIHBuZ19wdHItPnJlYWRfdXNlcl9jaHVua19mbiA9PSBOVUxMCisjZW5kaWYKKyAgICAgICAgKQorI2VuZGlmCisgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJ1bmtub3duIGNyaXRpY2FsIGNodW5rIik7CisgICB9CisKKyNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19LRUVQX1VOS05PV05fQ0hVTktTKQorI2lmZGVmIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAorICAgICAgIHx8IChwbmdfcHRyLT5yZWFkX3VzZXJfY2h1bmtfZm4gIT0gTlVMTCkKKyNlbmRpZgorICAgICAgICApCisgICB7CisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICAgICAgaWYgKGxlbmd0aCA+IChwbmdfdWludF8zMik2NTUzNUwpCisgICAgICAgeworICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAidW5rbm93biBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOworICAgICAgICAgICBza2lwID0gbGVuZ3RoIC0gKHBuZ191aW50XzMyKTY1NTM1TDsKKyAgICAgICAgICAgbGVuZ3RoID0gKHBuZ191aW50XzMyKTY1NTM1TDsKKyAgICAgICB9CisjZW5kaWYKKyAgICAgICBwbmdfbWVtY3B5KChwbmdfY2hhcnApcG5nX3B0ci0+dW5rbm93bl9jaHVuay5uYW1lLAorICAgICAgICAgICAgICAgICAgKHBuZ19jaGFycClwbmdfcHRyLT5jaHVua19uYW1lLAorICAgICAgICAgICAgICAgICAgcG5nX3NpemVvZihwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWUpKTsKKyAgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWVbcG5nX3NpemVvZihwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWUpLTFdCisgICAgICAgICAgID0gJ1wwJzsKKyAgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLnNpemUgPSAocG5nX3NpemVfdClsZW5ndGg7CisgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhID0gTlVMTDsKKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsIGxlbmd0aCk7CisgICAgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEsIGxlbmd0aCk7CisgICAgICAgfQorI2lmZGVmIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAorICAgICAgIGlmIChwbmdfcHRyLT5yZWFkX3VzZXJfY2h1bmtfZm4gIT0gTlVMTCkKKyAgICAgICB7CisgICAgICAgICAgLyogQ2FsbGJhY2sgdG8gdXNlciB1bmtub3duIGNodW5rIGhhbmRsZXIgKi8KKyAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgIHJldCA9ICgqKHBuZ19wdHItPnJlYWRfdXNlcl9jaHVua19mbikpCisgICAgICAgICAgICAocG5nX3B0ciwgJnBuZ19wdHItPnVua25vd25fY2h1bmspOworICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAiZXJyb3IgaW4gdXNlciBjaHVuayIpOworICAgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+Y2h1bmtfbmFtZVswXSAmIDB4MjApKQorI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICBpZiAocG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUpICE9CisgICAgICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FMV0FZUykKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAidW5rbm93biBjcml0aWNhbCBjaHVuayIpOworICAgICAgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICAgICAgICAgICAmcG5nX3B0ci0+dW5rbm93bl9jaHVuaywgMSk7CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAmcG5nX3B0ci0+dW5rbm93bl9jaHVuaywgMSk7CisgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhKTsKKyAgICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEgPSBOVUxMOworICAgfQorICAgZWxzZQorI2VuZGlmCisgICAgICBza2lwID0gbGVuZ3RoOworCisgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBza2lwKTsKKworI2lmbmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKKyAgIGluZm9fcHRyID0gaW5mb19wdHI7IC8qIFF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHVudXNlZCBpbmZvX3B0ciAqLworI2VuZGlmCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHZlcmlmeSB0aGF0IGEgY2h1bmsgbmFtZSBpcyB2YWxpZC4KKyAgIFRoaXMgZnVuY3Rpb24gY2FuJ3QgaGF2ZSB0aGUgImNyaXRpY2FsIGNodW5rIGNoZWNrIiBpbmNvcnBvcmF0ZWQKKyAgIGludG8gaXQsIHNpbmNlIGluIHRoZSBmdXR1cmUgd2Ugd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gY2FsbCB1c2VyCisgICBmdW5jdGlvbnMgdG8gaGFuZGxlIHVua25vd24gY3JpdGljYWwgY2h1bmtzIGFmdGVyIHdlIGNoZWNrIHRoYXQKKyAgIHRoZSBjaHVuayBuYW1lIGl0c2VsZiBpcyB2YWxpZC4gKi8KKworI2RlZmluZSBpc25vbmFscGhhKGMpICgoYykgPCA2NSB8fCAoYykgPiAxMjIgfHwgKChjKSA+IDkwICYmIChjKSA8IDk3KSkKKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfY2hlY2tfY2h1bmtfbmFtZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgY2h1bmtfbmFtZSkKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NoZWNrX2NodW5rX25hbWUiKTsKKyAgIGlmIChpc25vbmFscGhhKGNodW5rX25hbWVbMF0pIHx8IGlzbm9uYWxwaGEoY2h1bmtfbmFtZVsxXSkgfHwKKyAgICAgICBpc25vbmFscGhhKGNodW5rX25hbWVbMl0pIHx8IGlzbm9uYWxwaGEoY2h1bmtfbmFtZVszXSkpCisgICB7CisgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgImludmFsaWQgY2h1bmsgdHlwZSIpOworICAgfQorfQorCisvKiBDb21iaW5lcyB0aGUgcm93IHJlY2VudGx5IHJlYWQgaW4gd2l0aCB0aGUgZXhpc3RpbmcgcGl4ZWxzIGluIHRoZQorICAgcm93LiAgVGhpcyByb3V0aW5lIHRha2VzIGNhcmUgb2YgYWxwaGEgYW5kIHRyYW5zcGFyZW5jeSBpZiByZXF1ZXN0ZWQuCisgICBUaGlzIHJvdXRpbmUgYWxzbyBoYW5kbGVzIHRoZSB0d28gbWV0aG9kcyBvZiBwcm9ncmVzc2l2ZSBkaXNwbGF5CisgICBvZiBpbnRlcmxhY2VkIGltYWdlcywgZGVwZW5kaW5nIG9uIHRoZSBtYXNrIHZhbHVlLgorICAgVGhlIG1hc2sgdmFsdWUgZGVzY3JpYmVzIHdoaWNoIHBpeGVscyBhcmUgdG8gYmUgY29tYmluZWQgd2l0aAorICAgdGhlIHJvdy4gIFRoZSBwYXR0ZXJuIGFsd2F5cyByZXBlYXRzIGV2ZXJ5IDggcGl4ZWxzLCBzbyBqdXN0IDgKKyAgIGJpdHMgYXJlIG5lZWRlZC4gIEEgb25lIGluZGljYXRlcyB0aGUgcGl4ZWwgaXMgdG8gYmUgY29tYmluZWQsCisgICBhIHplcm8gaW5kaWNhdGVzIHRoZSBwaXhlbCBpcyB0byBiZSBza2lwcGVkLiAgVGhpcyBpcyBpbiBhZGRpdGlvbgorICAgdG8gYW55IGFscGhhIG9yIHRyYW5zcGFyZW5jeSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBpeGVsLiAgSWYKKyAgIHlvdSB3YW50IGFsbCBwaXhlbHMgdG8gYmUgY29tYmluZWQsIHBhc3MgMHhmZiAoMjU1KSBpbiBtYXNrLiAgKi8KKwordm9pZCAvKiBQUklWQVRFICovCitwbmdfY29tYmluZV9yb3cocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHJvdywgaW50IG1hc2spCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jb21iaW5lX3JvdyIpOworICAgaWYgKG1hc2sgPT0gMHhmZikKKyAgIHsKKyAgICAgIHBuZ19tZW1jcHkocm93LCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgIFBOR19ST1dCWVRFUyhwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCwgcG5nX3B0ci0+d2lkdGgpKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN3aXRjaCAocG5nX3B0ci0+cm93X2luZm8ucGl4ZWxfZGVwdGgpCisgICAgICB7CisgICAgICAgICBjYXNlIDE6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSBwbmdfcHRyLT5yb3dfYnVmICsgMTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKKyAgICAgICAgICAgIGludCBzX2luYywgc19zdGFydCwgc19lbmQ7CisgICAgICAgICAgICBpbnQgbSA9IDB4ODA7CisgICAgICAgICAgICBpbnQgc2hpZnQ7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcG5nX3B0ci0+d2lkdGg7CisKKyNpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc19zdGFydCA9IDA7CisgICAgICAgICAgICAgICAgc19lbmQgPSA3OworICAgICAgICAgICAgICAgIHNfaW5jID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNfc3RhcnQgPSA3OworICAgICAgICAgICAgICAgIHNfZW5kID0gMDsKKyAgICAgICAgICAgICAgICBzX2luYyA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaGlmdCA9IHNfc3RhcnQ7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChtICYgbWFzaykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGludCB2YWx1ZTsKKworICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+IHNoaWZ0KSAmIDB4MDE7CisgICAgICAgICAgICAgICAgICAqZHAgJj0gKHBuZ19ieXRlKSgoMHg3ZjdmID4+ICg3IC0gc2hpZnQpKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKmRwIHw9IChwbmdfYnl0ZSkodmFsdWUgPDwgc2hpZnQpOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gc19lbmQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzaGlmdCA9IHNfc3RhcnQ7CisgICAgICAgICAgICAgICAgICBzcCsrOworICAgICAgICAgICAgICAgICAgZHArKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IHNfaW5jOworCisgICAgICAgICAgICAgICBpZiAobSA9PSAxKQorICAgICAgICAgICAgICAgICAgbSA9IDB4ODA7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBtID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBjYXNlIDI6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSBwbmdfcHRyLT5yb3dfYnVmICsgMTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKKyAgICAgICAgICAgIGludCBzX3N0YXJ0LCBzX2VuZCwgc19pbmM7CisgICAgICAgICAgICBpbnQgbSA9IDB4ODA7CisgICAgICAgICAgICBpbnQgc2hpZnQ7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcG5nX3B0ci0+d2lkdGg7CisgICAgICAgICAgICBpbnQgdmFsdWU7CisKKyNpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzX3N0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgIHNfZW5kID0gNjsKKyAgICAgICAgICAgICAgIHNfaW5jID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc19zdGFydCA9IDY7CisgICAgICAgICAgICAgICBzX2VuZCA9IDA7CisgICAgICAgICAgICAgICBzX2luYyA9IC0yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaGlmdCA9IHNfc3RhcnQ7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChtICYgbWFzaykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweDAzOworICAgICAgICAgICAgICAgICAgKmRwICY9IChwbmdfYnl0ZSkoKDB4M2YzZiA+PiAoNiAtIHNoaWZ0KSkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICpkcCB8PSAocG5nX2J5dGUpKHZhbHVlIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IHNfZW5kKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2hpZnQgPSBzX3N0YXJ0OworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgICAgIGRwKys7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBzaGlmdCArPSBzX2luYzsKKyAgICAgICAgICAgICAgIGlmIChtID09IDEpCisgICAgICAgICAgICAgICAgICBtID0gMHg4MDsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG0gPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHBuZ19wdHItPnJvd19idWYgKyAxOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OworICAgICAgICAgICAgaW50IHNfc3RhcnQsIHNfZW5kLCBzX2luYzsKKyAgICAgICAgICAgIGludCBtID0gMHg4MDsKKyAgICAgICAgICAgIGludCBzaGlmdDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSBwbmdfcHRyLT53aWR0aDsKKyAgICAgICAgICAgIGludCB2YWx1ZTsKKworI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNfc3RhcnQgPSAwOworICAgICAgICAgICAgICAgc19lbmQgPSA0OworICAgICAgICAgICAgICAgc19pbmMgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzX3N0YXJ0ID0gNDsKKyAgICAgICAgICAgICAgIHNfZW5kID0gMDsKKyAgICAgICAgICAgICAgIHNfaW5jID0gLTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaGlmdCA9IHNfc3RhcnQ7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChtICYgbWFzaykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweGY7CisgICAgICAgICAgICAgICAgICAqZHAgJj0gKHBuZ19ieXRlKSgoMHhmMGYgPj4gKDQgLSBzaGlmdCkpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAqZHAgfD0gKHBuZ19ieXRlKSh2YWx1ZSA8PCBzaGlmdCk7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSBzX2VuZCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gc19zdGFydDsKKyAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICBkcCsrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gc19pbmM7CisgICAgICAgICAgICAgICBpZiAobSA9PSAxKQorICAgICAgICAgICAgICAgICAgbSA9IDB4ODA7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBtID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcG5nX3B0ci0+cm93X2J1ZiArIDE7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7CisgICAgICAgICAgICBwbmdfc2l6ZV90IHBpeGVsX2J5dGVzID0gKHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoID4+IDMpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHBuZ19wdHItPndpZHRoOworICAgICAgICAgICAgcG5nX2J5dGUgbSA9IDB4ODA7CisKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKG0gJiBtYXNrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX21lbWNweShkcCwgc3AsIHBpeGVsX2J5dGVzKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgc3AgKz0gcGl4ZWxfYnl0ZXM7CisgICAgICAgICAgICAgICBkcCArPSBwaXhlbF9ieXRlczsKKworICAgICAgICAgICAgICAgaWYgKG0gPT0gMSkKKyAgICAgICAgICAgICAgICAgIG0gPSAweDgwOworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgbSA+Pj0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisvKiBPTEQgcHJlLTEuMC45IGludGVyZmFjZToKK3ZvaWQgcG5nX2RvX3JlYWRfaW50ZXJsYWNlKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csIGludCBwYXNzLAorICAgcG5nX3VpbnRfMzIgdHJhbnNmb3JtYXRpb25zKQorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19yZWFkX2ludGVybGFjZShwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX3Jvd19pbmZvcCByb3dfaW5mbyA9ICYocG5nX3B0ci0+cm93X2luZm8pOworICAgcG5nX2J5dGVwIHJvdyA9IHBuZ19wdHItPnJvd19idWYgKyAxOworICAgaW50IHBhc3MgPSBwbmdfcHRyLT5wYXNzOworICAgcG5nX3VpbnRfMzIgdHJhbnNmb3JtYXRpb25zID0gcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zOworICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLworICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc19pbmNbN10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JlYWRfaW50ZXJsYWNlIik7CisgICBpZiAocm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ191aW50XzMyIGZpbmFsX3dpZHRoOworCisgICAgICBmaW5hbF93aWR0aCA9IHJvd19pbmZvLT53aWR0aCAqIHBuZ19wYXNzX2luY1twYXNzXTsKKworICAgICAgc3dpdGNoIChyb3dfaW5mby0+cGl4ZWxfZGVwdGgpCisgICAgICB7CisgICAgICAgICBjYXNlIDE6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd19pbmZvLT53aWR0aCAtIDEpID4+IDMpOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKChmaW5hbF93aWR0aCAtIDEpID4+IDMpOworICAgICAgICAgICAgaW50IHNzaGlmdCwgZHNoaWZ0OworICAgICAgICAgICAgaW50IHNfc3RhcnQsIHNfZW5kLCBzX2luYzsKKyAgICAgICAgICAgIGludCBqc3RvcCA9IHBuZ19wYXNzX2luY1twYXNzXTsKKyAgICAgICAgICAgIHBuZ19ieXRlIHY7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgaW50IGo7CisKKyNpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3NoaWZ0ID0gKGludCkoKHJvd19pbmZvLT53aWR0aCArIDcpICYgMHgwNyk7CisgICAgICAgICAgICAgICAgZHNoaWZ0ID0gKGludCkoKGZpbmFsX3dpZHRoICsgNykgJiAweDA3KTsKKyAgICAgICAgICAgICAgICBzX3N0YXJ0ID0gNzsKKyAgICAgICAgICAgICAgICBzX2VuZCA9IDA7CisgICAgICAgICAgICAgICAgc19pbmMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzaGlmdCA9IDcgLSAoaW50KSgocm93X2luZm8tPndpZHRoICsgNykgJiAweDA3KTsKKyAgICAgICAgICAgICAgICBkc2hpZnQgPSA3IC0gKGludCkoKGZpbmFsX3dpZHRoICsgNykgJiAweDA3KTsKKyAgICAgICAgICAgICAgICBzX3N0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICBzX2VuZCA9IDc7CisgICAgICAgICAgICAgICAgc19pbmMgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X2luZm8tPndpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB2ID0gKHBuZ19ieXRlKSgoKnNwID4+IHNzaGlmdCkgJiAweDAxKTsKKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKmRwICY9IChwbmdfYnl0ZSkoKDB4N2Y3ZiA+PiAoNyAtIGRzaGlmdCkpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAqZHAgfD0gKHBuZ19ieXRlKSh2IDw8IGRzaGlmdCk7CisgICAgICAgICAgICAgICAgICBpZiAoZHNoaWZ0ID09IHNfZW5kKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgZHNoaWZ0ID0gc19zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgIGRwLS07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICBkc2hpZnQgKz0gc19pbmM7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBpZiAoc3NoaWZ0ID09IHNfZW5kKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3NoaWZ0ID0gc19zdGFydDsKKyAgICAgICAgICAgICAgICAgIHNwLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBzc2hpZnQgKz0gc19pbmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfdWludF8zMikoKHJvd19pbmZvLT53aWR0aCAtIDEpID4+IDIpOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ191aW50XzMyKSgoZmluYWxfd2lkdGggLSAxKSA+PiAyKTsKKyAgICAgICAgICAgIGludCBzc2hpZnQsIGRzaGlmdDsKKyAgICAgICAgICAgIGludCBzX3N0YXJ0LCBzX2VuZCwgc19pbmM7CisgICAgICAgICAgICBpbnQganN0b3AgPSBwbmdfcGFzc19pbmNbcGFzc107CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisjaWZkZWYgUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVECisgICAgICAgICAgICBpZiAodHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3NoaWZ0ID0gKGludCkoKChyb3dfaW5mby0+d2lkdGggKyAzKSAmIDB4MDMpIDw8IDEpOworICAgICAgICAgICAgICAgZHNoaWZ0ID0gKGludCkoKChmaW5hbF93aWR0aCArIDMpICYgMHgwMykgPDwgMSk7CisgICAgICAgICAgICAgICBzX3N0YXJ0ID0gNjsKKyAgICAgICAgICAgICAgIHNfZW5kID0gMDsKKyAgICAgICAgICAgICAgIHNfaW5jID0gLTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNzaGlmdCA9IChpbnQpKCgzIC0gKChyb3dfaW5mby0+d2lkdGggKyAzKSAmIDB4MDMpKSA8PCAxKTsKKyAgICAgICAgICAgICAgIGRzaGlmdCA9IChpbnQpKCgzIC0gKChmaW5hbF93aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOworICAgICAgICAgICAgICAgc19zdGFydCA9IDA7CisgICAgICAgICAgICAgICBzX2VuZCA9IDY7CisgICAgICAgICAgICAgICBzX2luYyA9IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfaW5mby0+d2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHY7CisgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgdiA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzc2hpZnQpICYgMHgwMyk7CisgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwganN0b3A7IGorKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICpkcCAmPSAocG5nX2J5dGUpKCgweDNmM2YgPj4gKDYgLSBkc2hpZnQpKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgKmRwIHw9IChwbmdfYnl0ZSkodiA8PCBkc2hpZnQpOworICAgICAgICAgICAgICAgICAgaWYgKGRzaGlmdCA9PSBzX2VuZCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCA9IHNfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICBkcC0tOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgZHNoaWZ0ICs9IHNfaW5jOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYgKHNzaGlmdCA9PSBzX2VuZCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNzaGlmdCA9IHNfc3RhcnQ7CisgICAgICAgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc3NoaWZ0ICs9IHNfaW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd19pbmZvLT53aWR0aCAtIDEpID4+IDEpOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKChmaW5hbF93aWR0aCAtIDEpID4+IDEpOworICAgICAgICAgICAgaW50IHNzaGlmdCwgZHNoaWZ0OworICAgICAgICAgICAgaW50IHNfc3RhcnQsIHNfZW5kLCBzX2luYzsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBpbnQganN0b3AgPSBwbmdfcGFzc19pbmNbcGFzc107CisKKyNpZmRlZiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgoKHJvd19pbmZvLT53aWR0aCArIDEpICYgMHgwMSkgPDwgMik7CisgICAgICAgICAgICAgICBkc2hpZnQgPSAoaW50KSgoKGZpbmFsX3dpZHRoICsgMSkgJiAweDAxKSA8PCAyKTsKKyAgICAgICAgICAgICAgIHNfc3RhcnQgPSA0OworICAgICAgICAgICAgICAgc19lbmQgPSAwOworICAgICAgICAgICAgICAgc19pbmMgPSAtNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3NoaWZ0ID0gKGludCkoKDEgLSAoKHJvd19pbmZvLT53aWR0aCArIDEpICYgMHgwMSkpIDw8IDIpOworICAgICAgICAgICAgICAgZHNoaWZ0ID0gKGludCkoKDEgLSAoKGZpbmFsX3dpZHRoICsgMSkgJiAweDAxKSkgPDwgMik7CisgICAgICAgICAgICAgICBzX3N0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgIHNfZW5kID0gNDsKKyAgICAgICAgICAgICAgIHNfaW5jID0gNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19pbmZvLT53aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgdiA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzc2hpZnQpICYgMHhmKTsKKyAgICAgICAgICAgICAgIGludCBqOworCisgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwganN0b3A7IGorKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICpkcCAmPSAocG5nX2J5dGUpKCgweGYwZiA+PiAoNCAtIGRzaGlmdCkpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAqZHAgfD0gKHBuZ19ieXRlKSh2IDw8IGRzaGlmdCk7CisgICAgICAgICAgICAgICAgICBpZiAoZHNoaWZ0ID09IHNfZW5kKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgZHNoaWZ0ID0gc19zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgIGRwLS07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICBkc2hpZnQgKz0gc19pbmM7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBpZiAoc3NoaWZ0ID09IHNfZW5kKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3NoaWZ0ID0gc19zdGFydDsKKyAgICAgICAgICAgICAgICAgIHNwLS07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBzc2hpZnQgKz0gc19pbmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfc2l6ZV90IHBpeGVsX2J5dGVzID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCA+PiAzKTsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShyb3dfaW5mby0+d2lkdGggLSAxKQorICAgICAgICAgICAgICAgICogcGl4ZWxfYnl0ZXM7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkoZmluYWxfd2lkdGggLSAxKSAqIHBpeGVsX2J5dGVzOworCisgICAgICAgICAgICBpbnQganN0b3AgPSBwbmdfcGFzc19pbmNbcGFzc107CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X2luZm8tPndpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSB2WzhdOworICAgICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgICAgIHBuZ19tZW1jcHkodiwgc3AsIHBpeGVsX2J5dGVzKTsKKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcG5nX21lbWNweShkcCwgdiwgcGl4ZWxfYnl0ZXMpOworICAgICAgICAgICAgICAgICAgZHAgLT0gcGl4ZWxfYnl0ZXM7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBzcCAtPSBwaXhlbF9ieXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgICAgcm93X2luZm8tPndpZHRoID0gZmluYWxfd2lkdGg7CisgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCBmaW5hbF93aWR0aCk7CisgICB9CisjaWZuZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgdHJhbnNmb3JtYXRpb25zID0gdHJhbnNmb3JtYXRpb25zOyAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyNlbmRpZgorfQorI2VuZGlmIC8qIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAqLworCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19yZWFkX2ZpbHRlcl9yb3cocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKKyAgIHBuZ19ieXRlcCBwcmV2X3JvdywgaW50IGZpbHRlcikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfZmlsdGVyX3JvdyIpOworICAgcG5nX2RlYnVnMigyLCAicm93ID0gJWx1LCBmaWx0ZXIgPSAlZCIsIHBuZ19wdHItPnJvd19udW1iZXIsIGZpbHRlcik7CisgICBzd2l0Y2ggKGZpbHRlcikKKyAgIHsKKyAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9OT05FOgorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfU1VCOgorICAgICAgeworICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgcG5nX3VpbnRfMzIgYnBwID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCArIDcpID4+IDM7CisgICAgICAgICBwbmdfYnl0ZXAgcnAgPSByb3cgKyBicHA7CisgICAgICAgICBwbmdfYnl0ZXAgbHAgPSByb3c7CisKKyAgICAgICAgIGZvciAoaSA9IGJwcDsgaSA8IGlzdG9wOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICAqcnAgPSAocG5nX2J5dGUpKCgoaW50KSgqcnApICsgKGludCkoKmxwKyspKSAmIDB4ZmYpOworICAgICAgICAgICAgcnArKzsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX1VQOgorICAgICAgeworICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOworICAgICAgICAgcG5nX2J5dGVwIHJwID0gcm93OworICAgICAgICAgcG5nX2J5dGVwIHBwID0gcHJldl9yb3c7CisKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArIChpbnQpKCpwcCsrKSkgJiAweGZmKTsKKyAgICAgICAgICAgIHJwKys7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9BVkc6CisgICAgICB7CisgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgcG5nX2J5dGVwIHJwID0gcm93OworICAgICAgICAgcG5nX2J5dGVwIHBwID0gcHJldl9yb3c7CisgICAgICAgICBwbmdfYnl0ZXAgbHAgPSByb3c7CisgICAgICAgICBwbmdfdWludF8zMiBicHAgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoICsgNykgPj4gMzsKKyAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzIC0gYnBwOworCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnBwOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICAqcnAgPSAocG5nX2J5dGUpKCgoaW50KSgqcnApICsKKyAgICAgICAgICAgICAgICgoaW50KSgqcHArKykgLyAyICkpICYgMHhmZik7CisgICAgICAgICAgICBycCsrOworICAgICAgICAgfQorCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICpycCA9IChwbmdfYnl0ZSkoKChpbnQpKCpycCkgKworICAgICAgICAgICAgICAgKGludCkoKnBwKysgKyAqbHArKykgLyAyICkgJiAweGZmKTsKKyAgICAgICAgICAgIHJwKys7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSDoKKyAgICAgIHsKKyAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7CisgICAgICAgICBwbmdfYnl0ZXAgcHAgPSBwcmV2X3JvdzsKKyAgICAgICAgIHBuZ19ieXRlcCBscCA9IHJvdzsKKyAgICAgICAgIHBuZ19ieXRlcCBjcCA9IHByZXZfcm93OworICAgICAgICAgcG5nX3VpbnRfMzIgYnBwID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCArIDcpID4+IDM7CisgICAgICAgICBwbmdfdWludF8zMiBpc3RvcD1yb3dfaW5mby0+cm93Ynl0ZXMgLSBicHA7CisKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBicHA7IGkrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICpycCA9IChwbmdfYnl0ZSkoKChpbnQpKCpycCkgKyAoaW50KSgqcHArKykpICYgMHhmZik7CisgICAgICAgICAgICBycCsrOworICAgICAgICAgfQorCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykgICAvKiBVc2UgbGVmdG92ZXIgcnAscHAgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhLCBiLCBjLCBwYSwgcGIsIHBjLCBwOworCisgICAgICAgICAgICBhID0gKmxwKys7CisgICAgICAgICAgICBiID0gKnBwKys7CisgICAgICAgICAgICBjID0gKmNwKys7CisKKyAgICAgICAgICAgIHAgPSBiIC0gYzsKKyAgICAgICAgICAgIHBjID0gYSAtIGM7CisKKyNpZmRlZiBQTkdfVVNFX0FCUworICAgICAgICAgICAgcGEgPSBhYnMocCk7CisgICAgICAgICAgICBwYiA9IGFicyhwYyk7CisgICAgICAgICAgICBwYyA9IGFicyhwICsgcGMpOworI2Vsc2UKKyAgICAgICAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7CisgICAgICAgICAgICBwYiA9IHBjIDwgMCA/IC1wYyA6IHBjOworICAgICAgICAgICAgcGMgPSAocCArIHBjKSA8IDAgPyAtKHAgKyBwYykgOiBwICsgcGM7CisjZW5kaWYKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgIGlmIChwYSA8PSBwYiAmJiBwYSA8PSBwYykKKyAgICAgICAgICAgICAgICAgIHAgPSBhOworICAgICAgICAgICAgICAgZWxzZSBpZiAocGIgPD0gcGMpCisgICAgICAgICAgICAgICAgICBwID0gYjsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHAgPSBjOworICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHAgPSAocGEgPD0gcGIgJiYgcGEgPD0gcGMpID8gYSA6IChwYiA8PSBwYykgPyBiIDogYzsKKworICAgICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArIHApICYgMHhmZik7CisgICAgICAgICAgICBycCsrOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIklnbm9yaW5nIGJhZCBhZGFwdGl2ZSBmaWx0ZXIgdHlwZSIpOworICAgICAgICAgKnJvdyA9IDA7CisgICAgICAgICBicmVhazsKKyAgIH0KK30KKworI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCisKKyAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLworICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsKKworICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovCisgICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07CisKKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KKyAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsKKyNlbmRpZiAvKiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgKi8KKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9maW5pc2hfcm93Iik7CisgICBwbmdfcHRyLT5yb3dfbnVtYmVyKys7CisgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA8IHBuZ19wdHItPm51bV9yb3dzKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPnJvd19udW1iZXIgPSAwOworICAgICAgcG5nX21lbXNldF9jaGVjayhwbmdfcHRyLCBwbmdfcHRyLT5wcmV2X3JvdywgMCwKKyAgICAgICAgIHBuZ19wdHItPnJvd2J5dGVzICsgMSk7CisgICAgICBkbworICAgICAgeworICAgICAgICAgcG5nX3B0ci0+cGFzcysrOworICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPj0gNykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgcG5nX3B0ci0+aXdpZHRoID0gKHBuZ19wdHItPndpZHRoICsKKyAgICAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXSAtIDEgLQorICAgICAgICAgICAgcG5nX3Bhc3Nfc3RhcnRbcG5nX3B0ci0+cGFzc10pIC8KKyAgICAgICAgICAgIHBuZ19wYXNzX2luY1twbmdfcHRyLT5wYXNzXTsKKworICAgICAgICAgaWYgKCEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IChwbmdfcHRyLT5oZWlnaHQgKworICAgICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXSAtIDEgLQorICAgICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0W3BuZ19wdHItPnBhc3NdKSAvCisgICAgICAgICAgICAgICBwbmdfcGFzc195aW5jW3BuZ19wdHItPnBhc3NdOworICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+bnVtX3Jvd3MpKQorICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisgICAgICAgICBlbHNlICAvKiBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfSB3aGlsZSAocG5nX3B0ci0+aXdpZHRoID09IDApOworCisgICAgICBpZiAocG5nX3B0ci0+cGFzcyA8IDcpCisgICAgICAgICByZXR1cm47CisgICB9CisjZW5kaWYgLyogUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEICovCisKKyAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRCkpCisgICB7CisjaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKKyAgICAgIFBOR19DT05TVCBQTkdfSURBVDsKKyNlbmRpZgorICAgICAgY2hhciBleHRyYTsKKyAgICAgIGludCByZXQ7CisKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSAqKSZleHRyYTsKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpMTsKKyAgICAgIGZvciAoOzspCisgICAgICB7CisgICAgICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICghcG5nX3B0ci0+aWRhdF9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgY2h1bmtfbGVuZ3RoWzRdOworCisgICAgICAgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsKKworICAgICAgICAgICAgICAgcG5nX3JlYWRfZGF0YShwbmdfcHRyLCBjaHVua19sZW5ndGgsIDQpOworICAgICAgICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGNodW5rX2xlbmd0aCk7CisgICAgICAgICAgICAgICBwbmdfcmVzZXRfY3JjKHBuZ19wdHIpOworICAgICAgICAgICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUsIDQpOworICAgICAgICAgICAgICAgaWYgKHBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQorICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgZW5vdWdoIGltYWdlIGRhdGEiKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IHBuZ19wdHItPnpidWY7CisgICAgICAgICAgICBpZiAocG5nX3B0ci0+emJ1Zl9zaXplID4gcG5nX3B0ci0+aWRhdF9zaXplKQorICAgICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXBuZ19wdHItPmlkYXRfc2l6ZTsKKyAgICAgICAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBwbmdfcHRyLT56YnVmLCBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luKTsKKyAgICAgICAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSAtPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luOworICAgICAgICAgfQorICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9QQVJUSUFMX0ZMVVNIKTsKKyAgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpIHx8IHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gfHwKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSkKKyAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2VkIGRhdGEuIik7CisgICAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOworICAgICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnID8gcG5nX3B0ci0+enN0cmVhbS5tc2cgOgorICAgICAgICAgICAgICAgICAgICAgICJEZWNvbXByZXNzaW9uIEVycm9yIik7CisKKyAgICAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2VkIGRhdGEuIik7CisgICAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOworICAgICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICB9CisgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9IDA7CisgICB9CisKKyAgIGlmIChwbmdfcHRyLT5pZGF0X3NpemUgfHwgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbikKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2lvbiBkYXRhLiIpOworCisgICBpbmZsYXRlUmVzZXQoJnBuZ19wdHItPnpzdHJlYW0pOworCisgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOworfQorI2VuZGlmIC8qIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCisKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3JlYWRfc3RhcnRfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisjaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAvKiBBcnJheXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nIC0gdXNlIHBhc3MgKDAgLSA2KSBhcyBpbmRleCAqLworCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgKi8KKyAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3Nfc3RhcnRbN10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07CisKKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLworICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc19pbmNbN10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07CisKKyAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KKyAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfeXN0YXJ0WzddID0gezAsIDAsIDQsIDAsIDIsIDAsIDF9OworCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCisgICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX3lpbmNbN10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07CisjZW5kaWYKKworICAgaW50IG1heF9waXhlbF9kZXB0aDsKKyAgIHBuZ19zaXplX3Qgcm93X2J5dGVzOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX3N0YXJ0X3JvdyIpOworICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IDA7CisgICBwbmdfaW5pdF9yZWFkX3RyYW5zZm9ybWF0aW9ucyhwbmdfcHRyKTsKKyNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQorICAgeworICAgICAgaWYgKCEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCisgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IChwbmdfcHRyLT5oZWlnaHQgKyBwbmdfcGFzc195aW5jWzBdIC0gMSAtCisgICAgICAgICAgICBwbmdfcGFzc195c3RhcnRbMF0pIC8gcG5nX3Bhc3NfeWluY1swXTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gcG5nX3B0ci0+aGVpZ2h0OworCisgICAgICBwbmdfcHRyLT5pd2lkdGggPSAocG5nX3B0ci0+d2lkdGggKworICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtCisgICAgICAgICBwbmdfcGFzc19zdGFydFtwbmdfcHRyLT5wYXNzXSkgLworICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdOworICAgfQorICAgZWxzZQorI2VuZGlmIC8qIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAqLworICAgeworICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSBwbmdfcHRyLT5oZWlnaHQ7CisgICAgICBwbmdfcHRyLT5pd2lkdGggPSBwbmdfcHRyLT53aWR0aDsKKyAgIH0KKyAgIG1heF9waXhlbF9kZXB0aCA9IHBuZ19wdHItPnBpeGVsX2RlcHRoOworCisjaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spICYmIHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpCisgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA4OworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zKQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMzI7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAyNDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKKyAgICAgIHsKKyAgICAgICAgIGlmIChtYXhfcGl4ZWxfZGVwdGggPCA4KQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gODsKKyAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMpCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggKj0gMjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQorICAgICAgeworICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCAqPSA0OworICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoIC89IDM7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisjZW5kaWYKKworI2lmZGVmIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0ZJTExFUikpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMzI7CisgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCisgICAgICB7CisgICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDw9IDgpCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAxNjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOworICAgICAgfQorICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICAgICB7CisgICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDw9IDMyKQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMzI7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA2NDsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKQorICAgeworICAgICAgaWYgKAorI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKKyAgICAgICAgKHBuZ19wdHItPm51bV90cmFucyAmJiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkpIHx8CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVECisgICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0ZJTExFUikpIHx8CisjZW5kaWYKKyAgICAgICAgcG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgeworICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8PSAxNikKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gNjQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDw9IDgpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAzMjsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAyNDsKKyAgICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA2NDsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDQ4OworICAgICAgfQorICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgJiYgXAorZGVmaW5lZChQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRCkKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfVVNFUl9UUkFOU0ZPUk0pCisgICAgIHsKKyAgICAgICBpbnQgdXNlcl9waXhlbF9kZXB0aCA9IHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2RlcHRoKgorICAgICAgICAgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7CisgICAgICAgaWYgKHVzZXJfcGl4ZWxfZGVwdGggPiBtYXhfcGl4ZWxfZGVwdGgpCisgICAgICAgICBtYXhfcGl4ZWxfZGVwdGg9dXNlcl9waXhlbF9kZXB0aDsKKyAgICAgfQorI2VuZGlmCisKKyAgIC8qIEFsaWduIHRoZSB3aWR0aCBvbiB0aGUgbmV4dCBsYXJnZXIgOCBwaXhlbHMuICBNYWlubHkgdXNlZAorICAgICogZm9yIGludGVybGFjaW5nCisgICAgKi8KKyAgIHJvd19ieXRlcyA9ICgocG5nX3B0ci0+d2lkdGggKyA3KSAmIH4oKHBuZ191aW50XzMyKTcpKTsKKyAgIC8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBieXRlcyBuZWVkZWQsIGFkZGluZyBhIGJ5dGUgYW5kIGEgcGl4ZWwKKyAgICAqIGZvciBzYWZldHkncyBzYWtlCisgICAgKi8KKyAgIHJvd19ieXRlcyA9IFBOR19ST1dCWVRFUyhtYXhfcGl4ZWxfZGVwdGgsIHJvd19ieXRlcykgKworICAgICAgMSArICgobWF4X3BpeGVsX2RlcHRoICsgNykgPj4gMyk7CisjaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCisgICBpZiAocm93X2J5dGVzID4gKHBuZ191aW50XzMyKTY1NTM2TCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVGhpcyBpbWFnZSByZXF1aXJlcyBhIHJvdyBncmVhdGVyIHRoYW4gNjRLQiIpOworI2VuZGlmCisKKyAgIGlmIChyb3dfYnl0ZXMgKyA2NCA+IHBuZ19wdHItPm9sZF9iaWdfcm93X2J1Zl9zaXplKQorICAgeworICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5iaWdfcm93X2J1Zik7CisgICAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQorICAgICAgICBwbmdfcHRyLT5iaWdfcm93X2J1ZiA9IChwbmdfYnl0ZXApcG5nX2NhbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgcm93X2J5dGVzICsgNjQpOworICAgICBlbHNlCisgICAgICAgIHBuZ19wdHItPmJpZ19yb3dfYnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICByb3dfYnl0ZXMgKyA2NCk7CisgICAgIHBuZ19wdHItPm9sZF9iaWdfcm93X2J1Zl9zaXplID0gcm93X2J5dGVzICsgNjQ7CisKKyAgICAgLyogVXNlIDMyIGJ5dGVzIG9mIHBhZGRpbmcgYmVmb3JlIGFuZCBhZnRlciByb3dfYnVmLiAqLworICAgICBwbmdfcHRyLT5yb3dfYnVmID0gcG5nX3B0ci0+YmlnX3Jvd19idWYgKyAzMjsKKyAgICAgcG5nX3B0ci0+b2xkX2JpZ19yb3dfYnVmX3NpemUgPSByb3dfYnl0ZXMgKyA2NDsKKyAgIH0KKworI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SworICAgaWYgKChwbmdfdWludF8zMilyb3dfYnl0ZXMgKyAxID4gKHBuZ191aW50XzMyKTY1NTM2TCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVGhpcyBpbWFnZSByZXF1aXJlcyBhIHJvdyBncmVhdGVyIHRoYW4gNjRLQiIpOworI2VuZGlmCisgICBpZiAoKHBuZ191aW50XzMyKXJvd19ieXRlcyA+IChwbmdfdWludF8zMikoUE5HX1NJWkVfTUFYIC0gMSkpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlJvdyBoYXMgdG9vIG1hbnkgYnl0ZXMgdG8gYWxsb2NhdGUgaW4gbWVtb3J5LiIpOworCisgICBpZiAocm93X2J5dGVzICsgMSA+IHBuZ19wdHItPm9sZF9wcmV2X3Jvd19zaXplKQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cHJldl9yb3cpOworICAgICAgcG5nX3B0ci0+cHJldl9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwgKHBuZ191aW50XzMyKSgKKyAgICAgICAgcm93X2J5dGVzICsgMSkpOworICAgICAgcG5nX21lbXNldF9jaGVjayhwbmdfcHRyLCBwbmdfcHRyLT5wcmV2X3JvdywgMCwgcm93X2J5dGVzICsgMSk7CisgICAgICBwbmdfcHRyLT5vbGRfcHJldl9yb3dfc2l6ZSA9IHJvd19ieXRlcyArIDE7CisgICB9CisKKyAgIHBuZ19wdHItPnJvd2J5dGVzID0gcm93X2J5dGVzOworCisgICBwbmdfZGVidWcxKDMsICJ3aWR0aCA9ICVsdSwiLCBwbmdfcHRyLT53aWR0aCk7CisgICBwbmdfZGVidWcxKDMsICJoZWlnaHQgPSAlbHUsIiwgcG5nX3B0ci0+aGVpZ2h0KTsKKyAgIHBuZ19kZWJ1ZzEoMywgIml3aWR0aCA9ICVsdSwiLCBwbmdfcHRyLT5pd2lkdGgpOworICAgcG5nX2RlYnVnMSgzLCAibnVtX3Jvd3MgPSAlbHUsIiwgcG5nX3B0ci0+bnVtX3Jvd3MpOworICAgcG5nX2RlYnVnMSgzLCAicm93Ynl0ZXMgPSAlbHUsIiwgcG5nX3B0ci0+cm93Ynl0ZXMpOworICAgcG5nX2RlYnVnMSgzLCAiaXJvd2J5dGVzID0gJWx1IiwKKyAgICAgICBQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsIHBuZ19wdHItPml3aWR0aCkgKyAxKTsKKworICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfUk9XX0lOSVQ7Cit9CisjZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL3BuZ3NldC5jIGIvY29tMzIvbGliL2xpYnBuZy9wbmdzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc3NTdmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9wbmdzZXQuYwpAQCAtMCwwICsxLDEyMjYgQEAKKworLyogcG5nc2V0LmMgLSBzdG9yYWdlIG9mIGltYWdlIGluZm9ybWF0aW9uIGludG8gaW5mbyBzdHJ1Y3QKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuMi40MyBbRmVicnVhcnkgMjUsIDIwMTBdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICoKKyAqIFRoZSBmdW5jdGlvbnMgaGVyZSBhcmUgdXNlZCBkdXJpbmcgcmVhZHMgdG8gc3RvcmUgZGF0YSBmcm9tIHRoZSBmaWxlCisgKiBpbnRvIHRoZSBpbmZvIHN0cnVjdCwgYW5kIGR1cmluZyB3cml0ZXMgdG8gc3RvcmUgYXBwbGljYXRpb24gZGF0YQorICogaW50byB0aGUgaW5mbyBzdHJ1Y3QgZm9yIHdyaXRpbmcgaW50byB0aGUgZmlsZS4gIFRoaXMgYWJzdHJhY3RzIHRoZQorICogaW5mbyBzdHJ1Y3QgYW5kIGFsbG93cyB1cyB0byBjaGFuZ2UgdGhlIHN0cnVjdHVyZSBpbiB0aGUgZnV0dXJlLgorICovCisKKyNkZWZpbmUgUE5HX0lOVEVSTkFMCisjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUworI2luY2x1ZGUgInBuZy5oIgorI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCisKKyNpZmRlZiBQTkdfYktHRF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2JLR0QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY29sb3JfMTZwIGJhY2tncm91bmQpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgImJLR0QiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfbWVtY3B5KCYoaW5mb19wdHItPmJhY2tncm91bmQpLCBiYWNrZ3JvdW5kLCBwbmdfc2l6ZW9mKHBuZ19jb2xvcl8xNikpOworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2JLR0Q7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NIUk0ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgZG91YmxlIHdoaXRlX3gsIGRvdWJsZSB3aGl0ZV95LCBkb3VibGUgcmVkX3gsIGRvdWJsZSByZWRfeSwKKyAgIGRvdWJsZSBncmVlbl94LCBkb3VibGUgZ3JlZW5feSwgZG91YmxlIGJsdWVfeCwgZG91YmxlIGJsdWVfeSkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiY0hSTSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGluZm9fcHRyLT54X3doaXRlID0gKGZsb2F0KXdoaXRlX3g7CisgICBpbmZvX3B0ci0+eV93aGl0ZSA9IChmbG9hdCl3aGl0ZV95OworICAgaW5mb19wdHItPnhfcmVkICAgPSAoZmxvYXQpcmVkX3g7CisgICBpbmZvX3B0ci0+eV9yZWQgICA9IChmbG9hdClyZWRfeTsKKyAgIGluZm9fcHRyLT54X2dyZWVuID0gKGZsb2F0KWdyZWVuX3g7CisgICBpbmZvX3B0ci0+eV9ncmVlbiA9IChmbG9hdClncmVlbl95OworICAgaW5mb19wdHItPnhfYmx1ZSAgPSAoZmxvYXQpYmx1ZV94OworICAgaW5mb19wdHItPnlfYmx1ZSAgPSAoZmxvYXQpYmx1ZV95OworI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyAgIGluZm9fcHRyLT5pbnRfeF93aGl0ZSA9IChwbmdfZml4ZWRfcG9pbnQpKHdoaXRlX3gqMTAwMDAwLiswLjUpOworICAgaW5mb19wdHItPmludF95X3doaXRlID0gKHBuZ19maXhlZF9wb2ludCkod2hpdGVfeSoxMDAwMDAuKzAuNSk7CisgICBpbmZvX3B0ci0+aW50X3hfcmVkICAgPSAocG5nX2ZpeGVkX3BvaW50KSggIHJlZF94KjEwMDAwMC4rMC41KTsKKyAgIGluZm9fcHRyLT5pbnRfeV9yZWQgICA9IChwbmdfZml4ZWRfcG9pbnQpKCAgcmVkX3kqMTAwMDAwLiswLjUpOworICAgaW5mb19wdHItPmludF94X2dyZWVuID0gKHBuZ19maXhlZF9wb2ludCkoZ3JlZW5feCoxMDAwMDAuKzAuNSk7CisgICBpbmZvX3B0ci0+aW50X3lfZ3JlZW4gPSAocG5nX2ZpeGVkX3BvaW50KShncmVlbl95KjEwMDAwMC4rMC41KTsKKyAgIGluZm9fcHRyLT5pbnRfeF9ibHVlICA9IChwbmdfZml4ZWRfcG9pbnQpKCBibHVlX3gqMTAwMDAwLiswLjUpOworICAgaW5mb19wdHItPmludF95X2JsdWUgID0gKHBuZ19maXhlZF9wb2ludCkoIGJsdWVfeSoxMDAwMDAuKzAuNSk7CisjZW5kaWYKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19jSFJNOworfQorI2VuZGlmIC8qIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2NIUk1fZml4ZWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX2ZpeGVkX3BvaW50IHdoaXRlX3gsIHBuZ19maXhlZF9wb2ludCB3aGl0ZV95LCBwbmdfZml4ZWRfcG9pbnQgcmVkX3gsCisgICBwbmdfZml4ZWRfcG9pbnQgcmVkX3ksIHBuZ19maXhlZF9wb2ludCBncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5feSwKKyAgIHBuZ19maXhlZF9wb2ludCBibHVlX3gsIHBuZ19maXhlZF9wb2ludCBibHVlX3kpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgImNIUk0gZml4ZWQiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX0NIRUNLX2NIUk1fU1VQUE9SVEVECisgICBpZiAocG5nX2NoZWNrX2NIUk1fZml4ZWQocG5nX3B0ciwKKyAgICAgIHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LCByZWRfeSwgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3kpKQorI2VuZGlmCisgICB7CisgICAgICBpbmZvX3B0ci0+aW50X3hfd2hpdGUgPSB3aGl0ZV94OworICAgICAgaW5mb19wdHItPmludF95X3doaXRlID0gd2hpdGVfeTsKKyAgICAgIGluZm9fcHRyLT5pbnRfeF9yZWQgICA9IHJlZF94OworICAgICAgaW5mb19wdHItPmludF95X3JlZCAgID0gcmVkX3k7CisgICAgICBpbmZvX3B0ci0+aW50X3hfZ3JlZW4gPSBncmVlbl94OworICAgICAgaW5mb19wdHItPmludF95X2dyZWVuID0gZ3JlZW5feTsKKyAgICAgIGluZm9fcHRyLT5pbnRfeF9ibHVlICA9IGJsdWVfeDsKKyAgICAgIGluZm9fcHRyLT5pbnRfeV9ibHVlICA9IGJsdWVfeTsKKyNpZmRlZiAgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgICAgaW5mb19wdHItPnhfd2hpdGUgPSAoZmxvYXQpKHdoaXRlX3gvMTAwMDAwLik7CisgICAgICBpbmZvX3B0ci0+eV93aGl0ZSA9IChmbG9hdCkod2hpdGVfeS8xMDAwMDAuKTsKKyAgICAgIGluZm9fcHRyLT54X3JlZCAgID0gKGZsb2F0KSggIHJlZF94LzEwMDAwMC4pOworICAgICAgaW5mb19wdHItPnlfcmVkICAgPSAoZmxvYXQpKCAgcmVkX3kvMTAwMDAwLik7CisgICAgICBpbmZvX3B0ci0+eF9ncmVlbiA9IChmbG9hdCkoZ3JlZW5feC8xMDAwMDAuKTsKKyAgICAgIGluZm9fcHRyLT55X2dyZWVuID0gKGZsb2F0KShncmVlbl95LzEwMDAwMC4pOworICAgICAgaW5mb19wdHItPnhfYmx1ZSAgPSAoZmxvYXQpKCBibHVlX3gvMTAwMDAwLik7CisgICAgICBpbmZvX3B0ci0+eV9ibHVlICA9IChmbG9hdCkoIGJsdWVfeS8xMDAwMDAuKTsKKyNlbmRpZgorICAgICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2NIUk07CisgICB9Cit9CisjZW5kaWYgLyogUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIFBOR19jSFJNX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX2dBTUFfU1VQUE9SVEVECisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfZ0FNQShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGRvdWJsZSBmaWxlX2dhbW1hKQoreworICAgZG91YmxlIHBuZ19nYW1tYTsKKworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJnQU1BIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisgICBpZiAoZmlsZV9nYW1tYSA+IDIxNDc0LjgzKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkxpbWl0aW5nIGdhbW1hIHRvIDIxNDc0LjgzIik7CisgICAgICBwbmdfZ2FtbWE9MjE0NzQuODM7CisgICB9CisgICBlbHNlCisgICAgICBwbmdfZ2FtbWEgPSBmaWxlX2dhbW1hOworICAgaW5mb19wdHItPmdhbW1hID0gKGZsb2F0KXBuZ19nYW1tYTsKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisgICBpbmZvX3B0ci0+aW50X2dhbW1hID0gKGludCkocG5nX2dhbW1hKjEwMDAwMC4rLjUpOworI2VuZGlmCisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fZ0FNQTsKKyAgIGlmIChwbmdfZ2FtbWEgPT0gMC4wKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlNldHRpbmcgZ2FtbWE9MCIpOworfQorI2VuZGlmCit2b2lkIFBOR0FQSQorcG5nX3NldF9nQU1BX2ZpeGVkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2ZpeGVkX3BvaW50CisgICBpbnRfZ2FtbWEpCit7CisgICBwbmdfZml4ZWRfcG9pbnQgcG5nX2dhbW1hOworCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgImdBTUEiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAoaW50X2dhbW1hID4gKHBuZ19maXhlZF9wb2ludClQTkdfVUlOVF8zMV9NQVgpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTGltaXRpbmcgZ2FtbWEgdG8gMjE0NzQuODMiKTsKKyAgICAgIHBuZ19nYW1tYT1QTkdfVUlOVF8zMV9NQVg7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZiAoaW50X2dhbW1hIDwgMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJTZXR0aW5nIG5lZ2F0aXZlIGdhbW1hIHRvIHplcm8iKTsKKyAgICAgICAgIHBuZ19nYW1tYSA9IDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICBwbmdfZ2FtbWEgPSBpbnRfZ2FtbWE7CisgICB9CisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgaW5mb19wdHItPmdhbW1hID0gKGZsb2F0KShwbmdfZ2FtbWEvMTAwMDAwLik7CisjZW5kaWYKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisgICBpbmZvX3B0ci0+aW50X2dhbW1hID0gcG5nX2dhbW1hOworI2VuZGlmCisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fZ0FNQTsKKyAgIGlmIChwbmdfZ2FtbWEgPT0gMCkKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJTZXR0aW5nIGdhbW1hPTAiKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX2hJU1RfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9oSVNUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMTZwIGhpc3QpCit7CisgICBpbnQgaTsKKworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJoSVNUIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKGluZm9fcHRyLT5udW1fcGFsZXR0ZSA9PSAwIHx8IGluZm9fcHRyLT5udW1fcGFsZXR0ZQorICAgICAgID4gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAiSW52YWxpZCBwYWxldHRlIHNpemUsIGhJU1QgYWxsb2NhdGlvbiBza2lwcGVkLiIpOworICAgICAgcmV0dXJuOworICAgfQorCisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9ISVNULCAwKTsKKyNlbmRpZgorICAgLyogQ2hhbmdlZCBmcm9tIGluZm8tPm51bV9wYWxldHRlIHRvIFBOR19NQVhfUEFMRVRURV9MRU5HVEggaW4KKyAgICAqIHZlcnNpb24gMS4yLjEKKyAgICAqLworICAgcG5nX3B0ci0+aGlzdCA9IChwbmdfdWludF8xNnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCisgICAgICAocG5nX3VpbnRfMzIpKFBOR19NQVhfUEFMRVRURV9MRU5HVEggKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSkpOworICAgaWYgKHBuZ19wdHItPmhpc3QgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBoSVNUIGNodW5rIGRhdGEuIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+bnVtX3BhbGV0dGU7IGkrKykKKyAgICAgIHBuZ19wdHItPmhpc3RbaV0gPSBoaXN0W2ldOworICAgaW5mb19wdHItPmhpc3QgPSBwbmdfcHRyLT5oaXN0OworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2hJU1Q7CisKKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX0hJU1Q7CisjZWxzZQorICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfRlJFRV9ISVNUOworI2VuZGlmCit9CisjZW5kaWYKKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfSUhEUihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLAorICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfdHlwZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCisgICBpbnQgZmlsdGVyX3R5cGUpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgIklIRFIiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpbmZvX3B0ci0+d2lkdGggPSB3aWR0aDsKKyAgIGluZm9fcHRyLT5oZWlnaHQgPSBoZWlnaHQ7CisgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsKKyAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gKHBuZ19ieXRlKWNvbG9yX3R5cGU7CisgICBpbmZvX3B0ci0+Y29tcHJlc3Npb25fdHlwZSA9IChwbmdfYnl0ZSljb21wcmVzc2lvbl90eXBlOworICAgaW5mb19wdHItPmZpbHRlcl90eXBlID0gKHBuZ19ieXRlKWZpbHRlcl90eXBlOworICAgaW5mb19wdHItPmludGVybGFjZV90eXBlID0gKHBuZ19ieXRlKWludGVybGFjZV90eXBlOworCisgICBwbmdfY2hlY2tfSUhEUiAocG5nX3B0ciwgaW5mb19wdHItPndpZHRoLCBpbmZvX3B0ci0+aGVpZ2h0LAorICAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgsIGluZm9fcHRyLT5jb2xvcl90eXBlLCBpbmZvX3B0ci0+aW50ZXJsYWNlX3R5cGUsCisgICAgICAgaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGUsIGluZm9fcHRyLT5maWx0ZXJfdHlwZSk7CisKKyAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMTsKKyAgIGVsc2UgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCisgICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAzOworICAgZWxzZQorICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMTsKKyAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQorICAgICAgaW5mb19wdHItPmNoYW5uZWxzKys7CisgICBpbmZvX3B0ci0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKGluZm9fcHRyLT5jaGFubmVscyAqIGluZm9fcHRyLT5iaXRfZGVwdGgpOworCisgICAvKiBDaGVjayBmb3IgcG90ZW50aWFsIG92ZXJmbG93ICovCisgICBpZiAod2lkdGggPiAoUE5HX1VJTlRfMzJfTUFYCisgICAgICAgICAgICAgICAgID4+IDMpICAgICAgLyogOC1ieXRlIFJHQkEgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgIC0gNjQgICAgICAgLyogYmlncm93YnVmIGhhY2sgKi8KKyAgICAgICAgICAgICAgICAgLSAxICAgICAgICAvKiBmaWx0ZXIgYnl0ZSAqLworICAgICAgICAgICAgICAgICAtIDcqOCAgICAgIC8qIHJvdW5kaW5nIG9mIHdpZHRoIHRvIG11bHRpcGxlIG9mIDggcGl4ZWxzICovCisgICAgICAgICAgICAgICAgIC0gOCkgICAgICAgLyogZXh0cmEgbWF4X3BpeGVsX2RlcHRoIHBhZCAqLworICAgICAgaW5mb19wdHItPnJvd2J5dGVzID0gKHBuZ19zaXplX3QpMDsKKyAgIGVsc2UKKyAgICAgIGluZm9fcHRyLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhpbmZvX3B0ci0+cGl4ZWxfZGVwdGgsIHdpZHRoKTsKK30KKworI2lmZGVmIFBOR19vRkZzX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfb0ZGcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfaW50XzMyIG9mZnNldF94LCBwbmdfaW50XzMyIG9mZnNldF95LCBpbnQgdW5pdF90eXBlKQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJvRkZzIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaW5mb19wdHItPnhfb2Zmc2V0ID0gb2Zmc2V0X3g7CisgICBpbmZvX3B0ci0+eV9vZmZzZXQgPSBvZmZzZXRfeTsKKyAgIGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlID0gKHBuZ19ieXRlKXVuaXRfdHlwZTsKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19vRkZzOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfcENBTF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3BDQUwocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgcG5nX2NoYXJwIHB1cnBvc2UsIHBuZ19pbnRfMzIgWDAsIHBuZ19pbnRfMzIgWDEsIGludCB0eXBlLCBpbnQgbnBhcmFtcywKKyAgIHBuZ19jaGFycCB1bml0cywgcG5nX2NoYXJwcCBwYXJhbXMpCit7CisgICBwbmdfdWludF8zMiBsZW5ndGg7CisgICBpbnQgaTsKKworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJwQ0FMIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgbGVuZ3RoID0gcG5nX3N0cmxlbihwdXJwb3NlKSArIDE7CisgICBwbmdfZGVidWcxKDMsICJhbGxvY2F0aW5nIHB1cnBvc2UgZm9yIGluZm8gKCVsdSBieXRlcykiLAorICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOworICAgaW5mb19wdHItPnBjYWxfcHVycG9zZSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCk7CisgICBpZiAoaW5mb19wdHItPnBjYWxfcHVycG9zZSA9PSBOVUxMKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHBDQUwgcHVycG9zZS4iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnBjYWxfcHVycG9zZSwgcHVycG9zZSwgKHBuZ19zaXplX3QpbGVuZ3RoKTsKKworICAgcG5nX2RlYnVnKDMsICJzdG9yaW5nIFgwLCBYMSwgdHlwZSwgYW5kIG5wYXJhbXMgaW4gaW5mbyIpOworICAgaW5mb19wdHItPnBjYWxfWDAgPSBYMDsKKyAgIGluZm9fcHRyLT5wY2FsX1gxID0gWDE7CisgICBpbmZvX3B0ci0+cGNhbF90eXBlID0gKHBuZ19ieXRlKXR5cGU7CisgICBpbmZvX3B0ci0+cGNhbF9ucGFyYW1zID0gKHBuZ19ieXRlKW5wYXJhbXM7CisKKyAgIGxlbmd0aCA9IHBuZ19zdHJsZW4odW5pdHMpICsgMTsKKyAgIHBuZ19kZWJ1ZzEoMywgImFsbG9jYXRpbmcgdW5pdHMgZm9yIGluZm8gKCVsdSBieXRlcykiLAorICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOworICAgaW5mb19wdHItPnBjYWxfdW5pdHMgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpOworICAgaWYgKGluZm9fcHRyLT5wY2FsX3VuaXRzID09IE5VTEwpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgcENBTCB1bml0cy4iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnBjYWxfdW5pdHMsIHVuaXRzLCAocG5nX3NpemVfdClsZW5ndGgpOworCisgICBpbmZvX3B0ci0+cGNhbF9wYXJhbXMgPSAocG5nX2NoYXJwcClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKKyAgICAgIChwbmdfdWludF8zMikoKG5wYXJhbXMgKyAxKSAqIHBuZ19zaXplb2YocG5nX2NoYXJwKSkpOworICAgaWYgKGluZm9fcHRyLT5wY2FsX3BhcmFtcyA9PSBOVUxMKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHBDQUwgcGFyYW1zLiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfbWVtc2V0KGluZm9fcHRyLT5wY2FsX3BhcmFtcywgMCwgKG5wYXJhbXMgKyAxKSAqIHBuZ19zaXplb2YocG5nX2NoYXJwKSk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBucGFyYW1zOyBpKyspCisgICB7CisgICAgICBsZW5ndGggPSBwbmdfc3RybGVuKHBhcmFtc1tpXSkgKyAxOworICAgICAgcG5nX2RlYnVnMigzLCAiYWxsb2NhdGluZyBwYXJhbWV0ZXIgJWQgZm9yIGluZm8gKCVsdSBieXRlcykiLCBpLAorICAgICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOworICAgICAgaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKTsKKyAgICAgIGlmIChpbmZvX3B0ci0+cGNhbF9wYXJhbXNbaV0gPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBwQ0FMIHBhcmFtZXRlci4iKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldLCBwYXJhbXNbaV0sIChwbmdfc2l6ZV90KWxlbmd0aCk7CisgICB9CisKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19wQ0FMOworI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfUENBTDsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX3NDQUxfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRCkKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9zQ0FMKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgICAgICAgICAgICBpbnQgdW5pdCwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJzQ0FMIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaW5mb19wdHItPnNjYWxfdW5pdCA9IChwbmdfYnl0ZSl1bml0OworICAgaW5mb19wdHItPnNjYWxfcGl4ZWxfd2lkdGggPSB3aWR0aDsKKyAgIGluZm9fcHRyLT5zY2FsX3BpeGVsX2hlaWdodCA9IGhlaWdodDsKKworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3NDQUw7Cit9CisjZWxzZQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NDQUxfcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICAgICAgICAgICAgaW50IHVuaXQsIHBuZ19jaGFycCBzd2lkdGgsIHBuZ19jaGFycCBzaGVpZ2h0KQoreworICAgcG5nX3VpbnRfMzIgbGVuZ3RoOworCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNDQUwiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpbmZvX3B0ci0+c2NhbF91bml0ID0gKHBuZ19ieXRlKXVuaXQ7CisKKyAgIGxlbmd0aCA9IHBuZ19zdHJsZW4oc3dpZHRoKSArIDE7CisgICBwbmdfZGVidWcxKDMsICJhbGxvY2F0aW5nIHVuaXQgZm9yIGluZm8gKCV1IGJ5dGVzKSIsCisgICAgICAodW5zaWduZWQgaW50KWxlbmd0aCk7CisgICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKTsKKyAgIGlmIChpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID09IE5VTEwpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCB3aGlsZSBwcm9jZXNzaW5nIHNDQUwuIik7CisgICAgICByZXR1cm47CisgICB9CisgICBwbmdfbWVtY3B5KGluZm9fcHRyLT5zY2FsX3Nfd2lkdGgsIHN3aWR0aCwgKHBuZ19zaXplX3QpbGVuZ3RoKTsKKworICAgbGVuZ3RoID0gcG5nX3N0cmxlbihzaGVpZ2h0KSArIDE7CisgICBwbmdfZGVidWcxKDMsICJhbGxvY2F0aW5nIHVuaXQgZm9yIGluZm8gKCV1IGJ5dGVzKSIsCisgICAgICAodW5zaWduZWQgaW50KWxlbmd0aCk7CisgICBpbmZvX3B0ci0+c2NhbF9zX2hlaWdodCA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCk7CisgICBpZiAoaW5mb19wdHItPnNjYWxfc19oZWlnaHQgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19mcmVlIChwbmdfcHRyLCBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoKTsKKyAgICAgIGluZm9fcHRyLT5zY2FsX3Nfd2lkdGggPSBOVUxMOworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgd2hpbGUgcHJvY2Vzc2luZyBzQ0FMLiIpOworICAgICAgcmV0dXJuOworICAgfQorICAgcG5nX21lbWNweShpbmZvX3B0ci0+c2NhbF9zX2hlaWdodCwgc2hlaWdodCwgKHBuZ19zaXplX3QpbGVuZ3RoKTsKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19zQ0FMOworI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfU0NBTDsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX3BIWXNfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9wSFlzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgIHBuZ191aW50XzMyIHJlc194LCBwbmdfdWludF8zMiByZXNfeSwgaW50IHVuaXRfdHlwZSkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAicEhZcyIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCA9IHJlc194OworICAgaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0ID0gcmVzX3k7CisgICBpbmZvX3B0ci0+cGh5c191bml0X3R5cGUgPSAocG5nX2J5dGUpdW5pdF90eXBlOworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3BIWXM7Cit9CisjZW5kaWYKKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfUExURShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBwbmdfY29sb3JwIHBhbGV0dGUsIGludCBudW1fcGFsZXR0ZSkKK3sKKworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJQTFRFIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKG51bV9wYWxldHRlIDwgMCB8fCBudW1fcGFsZXR0ZSA+IFBOR19NQVhfUEFMRVRURV9MRU5HVEgpCisgICB7CisgICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBwYWxldHRlIGxlbmd0aCIpOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgcGFsZXR0ZSBsZW5ndGgiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIH0KKworICAgLyogSXQgbWF5IG5vdCBhY3R1YWxseSBiZSBuZWNlc3NhcnkgdG8gc2V0IHBuZ19wdHItPnBhbGV0dGUgaGVyZTsKKyAgICAqIHdlIGRvIGl0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHdheSB0aGUgcG5nX2hhbmRsZV90Uk5TCisgICAgKiBmdW5jdGlvbiB1c2VkIHRvIGRvIHRoZSBhbGxvY2F0aW9uLgorICAgICovCisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9QTFRFLCAwKTsKKyNlbmRpZgorCisgICAvKiBDaGFuZ2VkIGluIGxpYnBuZy0xLjIuMSB0byBhbGxvY2F0ZSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIIGluc3RlYWQKKyAgICAqIG9mIG51bV9wYWxldHRlIGVudHJpZXMsIGluIGNhc2Ugb2YgYW4gaW52YWxpZCBQTkcgZmlsZSB0aGF0IGhhcworICAgICogdG9vLWxhcmdlIHNhbXBsZSB2YWx1ZXMuCisgICAgKi8KKyAgIHBuZ19wdHItPnBhbGV0dGUgPSAocG5nX2NvbG9ycClwbmdfY2FsbG9jKHBuZ19wdHIsCisgICAgICBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIICogcG5nX3NpemVvZihwbmdfY29sb3IpKTsKKyAgIHBuZ19tZW1jcHkocG5nX3B0ci0+cGFsZXR0ZSwgcGFsZXR0ZSwgbnVtX3BhbGV0dGUgKiBwbmdfc2l6ZW9mKHBuZ19jb2xvcikpOworICAgaW5mb19wdHItPnBhbGV0dGUgPSBwbmdfcHRyLT5wYWxldHRlOworICAgaW5mb19wdHItPm51bV9wYWxldHRlID0gcG5nX3B0ci0+bnVtX3BhbGV0dGUgPSAocG5nX3VpbnRfMTYpbnVtX3BhbGV0dGU7CisKKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1BMVEU7CisjZWxzZQorICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfRlJFRV9QTFRFOworI2VuZGlmCisKKyAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19QTFRFOworfQorCisjaWZkZWYgUE5HX3NCSVRfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9zQklUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgIHBuZ19jb2xvcl84cCBzaWdfYml0KQoreworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJzQklUIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX21lbWNweSgmKGluZm9fcHRyLT5zaWdfYml0KSwgc2lnX2JpdCwgcG5nX3NpemVvZihwbmdfY29sb3JfOCkpOworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3NCSVQ7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfc1JHQihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBpbnRlbnQpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNSR0IiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpbmZvX3B0ci0+c3JnYl9pbnRlbnQgPSAocG5nX2J5dGUpaW50ZW50OworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3NSR0I7Cit9CisKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBpbnQgaW50ZW50KQoreworI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIGZsb2F0IGZpbGVfZ2FtbWE7CisjZW5kaWYKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisgICBwbmdfZml4ZWRfcG9pbnQgaW50X2ZpbGVfZ2FtbWE7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFBOR19jSFJNX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIGZsb2F0IHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LCByZWRfeSwgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3k7CisjZW5kaWYKKyAgIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksIGludF9yZWRfeCwgaW50X3JlZF95LCBpbnRfZ3JlZW5feCwKKyAgICAgIGludF9ncmVlbl95LCBpbnRfYmx1ZV94LCBpbnRfYmx1ZV95OworI2VuZGlmCisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNSR0JfZ0FNQV9hbmRfY0hSTSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHBuZ19zZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgaW50ZW50KTsKKworI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIGZpbGVfZ2FtbWEgPSAoZmxvYXQpLjQ1NDU1OworICAgcG5nX3NldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBmaWxlX2dhbW1hKTsKKyNlbmRpZgorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyAgIGludF9maWxlX2dhbW1hID0gNDU0NTVMOworICAgcG5nX3NldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBpbnRfZmlsZV9nYW1tYSk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECisgICBpbnRfd2hpdGVfeCA9IDMxMjcwTDsKKyAgIGludF93aGl0ZV95ID0gMzI5MDBMOworICAgaW50X3JlZF94ICAgPSA2NDAwMEw7CisgICBpbnRfcmVkX3kgICA9IDMzMDAwTDsKKyAgIGludF9ncmVlbl94ID0gMzAwMDBMOworICAgaW50X2dyZWVuX3kgPSA2MDAwMEw7CisgICBpbnRfYmx1ZV94ICA9IDE1MDAwTDsKKyAgIGludF9ibHVlX3kgID0gIDYwMDBMOworCisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgd2hpdGVfeCA9IChmbG9hdCkuMzEyNzsKKyAgIHdoaXRlX3kgPSAoZmxvYXQpLjMyOTA7CisgICByZWRfeCAgID0gKGZsb2F0KS42NDsKKyAgIHJlZF95ICAgPSAoZmxvYXQpLjMzOworICAgZ3JlZW5feCA9IChmbG9hdCkuMzA7CisgICBncmVlbl95ID0gKGZsb2F0KS42MDsKKyAgIGJsdWVfeCAgPSAoZmxvYXQpLjE1OworICAgYmx1ZV95ICA9IChmbG9hdCkuMDY7CisjZW5kaWYKKworI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyAgIHBuZ19zZXRfY0hSTV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwKKyAgICAgICBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksIGludF9yZWRfeCwgaW50X3JlZF95LCBpbnRfZ3JlZW5feCwKKyAgICAgICBpbnRfZ3JlZW5feSwgaW50X2JsdWVfeCwgaW50X2JsdWVfeSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisgICBwbmdfc2V0X2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsCisgICAgICAgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7CisjZW5kaWYKKyNlbmRpZiAvKiBjSFJNICovCit9CisjZW5kaWYgLyogc1JHQiAqLworCisKKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2lDQ1AocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAorICAgICAgICAgICAgIHBuZ19jaGFycCBuYW1lLCBpbnQgY29tcHJlc3Npb25fdHlwZSwKKyAgICAgICAgICAgICBwbmdfY2hhcnAgcHJvZmlsZSwgcG5nX3VpbnRfMzIgcHJvZmxlbikKK3sKKyAgIHBuZ19jaGFycCBuZXdfaWNjcF9uYW1lOworICAgcG5nX2NoYXJwIG5ld19pY2NwX3Byb2ZpbGU7CisgICBwbmdfdWludF8zMiBsZW5ndGg7CisKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiaUNDUCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMIHx8IHByb2ZpbGUgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgbGVuZ3RoID0gcG5nX3N0cmxlbihuYW1lKSsxOworICAgbmV3X2ljY3BfbmFtZSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCk7CisgICBpZiAobmV3X2ljY3BfbmFtZSA9PSBOVUxMKQorICAgeworICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBwcm9jZXNzIGlDQ1AgY2h1bmsuIik7CisgICAgICByZXR1cm47CisgICB9CisgICBwbmdfbWVtY3B5KG5ld19pY2NwX25hbWUsIG5hbWUsIGxlbmd0aCk7CisgICBuZXdfaWNjcF9wcm9maWxlID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgcHJvZmxlbik7CisgICBpZiAobmV3X2ljY3BfcHJvZmlsZSA9PSBOVUxMKQorICAgeworICAgICAgcG5nX2ZyZWUgKHBuZ19wdHIsIG5ld19pY2NwX25hbWUpOworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBwcm9jZXNzIGlDQ1AgcHJvZmlsZS4iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIHBuZ19tZW1jcHkobmV3X2ljY3BfcHJvZmlsZSwgcHJvZmlsZSwgKHBuZ19zaXplX3QpcHJvZmxlbik7CisKKyAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX0lDQ1AsIDApOworCisgICBpbmZvX3B0ci0+aWNjcF9wcm9mbGVuID0gcHJvZmxlbjsKKyAgIGluZm9fcHRyLT5pY2NwX25hbWUgPSBuZXdfaWNjcF9uYW1lOworICAgaW5mb19wdHItPmljY3BfcHJvZmlsZSA9IG5ld19pY2NwX3Byb2ZpbGU7CisgICAvKiBDb21wcmVzc2lvbiBpcyBhbHdheXMgemVybyBidXQgaXMgaGVyZSBzbyB0aGUgQVBJIGFuZCBpbmZvIHN0cnVjdHVyZQorICAgICogZG9lcyBub3QgaGF2ZSB0byBjaGFuZ2UgaWYgd2UgaW50cm9kdWNlIG11bHRpcGxlIGNvbXByZXNzaW9uIHR5cGVzCisgICAgKi8KKyAgIGluZm9fcHRyLT5pY2NwX2NvbXByZXNzaW9uID0gKHBuZ19ieXRlKWNvbXByZXNzaW9uX3R5cGU7CisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9JQ0NQOworI2VuZGlmCisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9faUNDUDsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF90ZXh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3RleHRwIHRleHRfcHRyLAorICAgICAgICAgICAgIGludCBudW1fdGV4dCkKK3sKKyAgIGludCByZXQ7CisgICByZXQgPSBwbmdfc2V0X3RleHRfMihwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIG51bV90ZXh0KTsKKyAgIGlmIChyZXQpCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgdG8gc3RvcmUgdGV4dCIpOworfQorCitpbnQgLyogUFJJVkFURSAqLworcG5nX3NldF90ZXh0XzIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGV4dHAgdGV4dF9wdHIsCisgICAgICAgICAgICAgICBpbnQgbnVtX3RleHQpCit7CisgICBpbnQgaTsKKworICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICgocG5nX3B0ciA9PSBOVUxMIHx8CisgICAgICBwbmdfcHRyLT5jaHVua19uYW1lWzBdID09ICdcMCcpID8KKyAgICAgICJ0ZXh0IiA6IChwbmdfY29uc3RfY2hhcnApcG5nX3B0ci0+Y2h1bmtfbmFtZSkpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbnVtX3RleHQgPT0gMCkKKyAgICAgIHJldHVybigwKTsKKworICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGluIHRoZSAidGV4dCIgYXJyYXkgaW4gaW5mb19zdHJ1Y3QKKyAgICAqIHRvIGhvbGQgYWxsIG9mIHRoZSBpbmNvbWluZyB0ZXh0X3B0ciBvYmplY3RzLgorICAgICovCisgICBpZiAoaW5mb19wdHItPm51bV90ZXh0ICsgbnVtX3RleHQgPiBpbmZvX3B0ci0+bWF4X3RleHQpCisgICB7CisgICAgICBpZiAoaW5mb19wdHItPnRleHQgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ190ZXh0cCBvbGRfdGV4dDsKKyAgICAgICAgIGludCBvbGRfbWF4OworCisgICAgICAgICBvbGRfbWF4ID0gaW5mb19wdHItPm1heF90ZXh0OworICAgICAgICAgaW5mb19wdHItPm1heF90ZXh0ID0gaW5mb19wdHItPm51bV90ZXh0ICsgbnVtX3RleHQgKyA4OworICAgICAgICAgb2xkX3RleHQgPSBpbmZvX3B0ci0+dGV4dDsKKyAgICAgICAgIGluZm9fcHRyLT50ZXh0ID0gKHBuZ190ZXh0cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKKyAgICAgICAgICAgIChwbmdfdWludF8zMikoaW5mb19wdHItPm1heF90ZXh0ICogcG5nX3NpemVvZihwbmdfdGV4dCkpKTsKKyAgICAgICAgIGlmIChpbmZvX3B0ci0+dGV4dCA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkX3RleHQpOworICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgfQorICAgICAgICAgcG5nX21lbWNweShpbmZvX3B0ci0+dGV4dCwgb2xkX3RleHQsIChwbmdfc2l6ZV90KShvbGRfbWF4ICoKKyAgICAgICAgICAgIHBuZ19zaXplb2YocG5nX3RleHQpKSk7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBvbGRfdGV4dCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpbmZvX3B0ci0+bWF4X3RleHQgPSBudW1fdGV4dCArIDg7CisgICAgICAgICBpbmZvX3B0ci0+bnVtX3RleHQgPSAwOworICAgICAgICAgaW5mb19wdHItPnRleHQgPSAocG5nX3RleHRwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAorICAgICAgICAgICAgKHBuZ191aW50XzMyKShpbmZvX3B0ci0+bWF4X3RleHQgKiBwbmdfc2l6ZW9mKHBuZ190ZXh0KSkpOworICAgICAgICAgaWYgKGluZm9fcHRyLT50ZXh0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oMSk7CisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICAgICAgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9URVhUOworI2VuZGlmCisgICAgICB9CisgICAgICBwbmdfZGVidWcxKDMsICJhbGxvY2F0ZWQgJWQgZW50cmllcyBmb3IgaW5mb19wdHItPnRleHQiLAorICAgICAgICAgaW5mb19wdHItPm1heF90ZXh0KTsKKyAgIH0KKyAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGV4dDsgaSsrKQorICAgeworICAgICAgcG5nX3NpemVfdCB0ZXh0X2xlbmd0aCwga2V5X2xlbjsKKyAgICAgIHBuZ19zaXplX3QgbGFuZ19sZW4sIGxhbmdfa2V5X2xlbjsKKyAgICAgIHBuZ190ZXh0cCB0ZXh0cCA9ICYoaW5mb19wdHItPnRleHRbaW5mb19wdHItPm51bV90ZXh0XSk7CisKKyAgICAgIGlmICh0ZXh0X3B0cltpXS5rZXkgPT0gTlVMTCkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAga2V5X2xlbiA9IHBuZ19zdHJsZW4odGV4dF9wdHJbaV0ua2V5KTsKKworICAgICAgaWYgKHRleHRfcHRyW2ldLmNvbXByZXNzaW9uIDw9IDApCisgICAgICB7CisgICAgICAgICBsYW5nX2xlbiA9IDA7CisgICAgICAgICBsYW5nX2tleV9sZW4gPSAwOworICAgICAgfQorCisgICAgICBlbHNlCisjaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECisgICAgICB7CisgICAgICAgICAvKiBTZXQgaVRYdCBkYXRhICovCisKKyAgICAgICAgIGlmICh0ZXh0X3B0cltpXS5sYW5nICE9IE5VTEwpCisgICAgICAgICAgICBsYW5nX2xlbiA9IHBuZ19zdHJsZW4odGV4dF9wdHJbaV0ubGFuZyk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBsYW5nX2xlbiA9IDA7CisgICAgICAgICBpZiAodGV4dF9wdHJbaV0ubGFuZ19rZXkgIT0gTlVMTCkKKyAgICAgICAgICAgIGxhbmdfa2V5X2xlbiA9IHBuZ19zdHJsZW4odGV4dF9wdHJbaV0ubGFuZ19rZXkpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgbGFuZ19rZXlfbGVuID0gMDsKKyAgICAgIH0KKyNlbHNlIC8qIFBOR19pVFh0X1NVUFBPUlRFRCAqLworICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImlUWHQgY2h1bmsgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmICh0ZXh0X3B0cltpXS50ZXh0ID09IE5VTEwgfHwgdGV4dF9wdHJbaV0udGV4dFswXSA9PSAnXDAnKQorICAgICAgeworICAgICAgICAgdGV4dF9sZW5ndGggPSAwOworI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorICAgICAgICAgaWYgKHRleHRfcHRyW2ldLmNvbXByZXNzaW9uID4gMCkKKyAgICAgICAgICAgIHRleHRwLT5jb21wcmVzc2lvbiA9IFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkU7CisgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHRleHRwLT5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICAgICB9CisKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHRleHRfbGVuZ3RoID0gcG5nX3N0cmxlbih0ZXh0X3B0cltpXS50ZXh0KTsKKyAgICAgICAgIHRleHRwLT5jb21wcmVzc2lvbiA9IHRleHRfcHRyW2ldLmNvbXByZXNzaW9uOworICAgICAgfQorCisgICAgICB0ZXh0cC0+a2V5ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKKyAgICAgICAgIChwbmdfdWludF8zMikKKyAgICAgICAgIChrZXlfbGVuICsgdGV4dF9sZW5ndGggKyBsYW5nX2xlbiArIGxhbmdfa2V5X2xlbiArIDQpKTsKKyAgICAgIGlmICh0ZXh0cC0+a2V5ID09IE5VTEwpCisgICAgICAgICByZXR1cm4oMSk7CisgICAgICBwbmdfZGVidWcyKDIsICJBbGxvY2F0ZWQgJWx1IGJ5dGVzIGF0ICV4IGluIHBuZ19zZXRfdGV4dCIsCisgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikKKyAgICAgICAgICAgICAgICAgKGtleV9sZW4gKyBsYW5nX2xlbiArIGxhbmdfa2V5X2xlbiArIHRleHRfbGVuZ3RoICsgNCksCisgICAgICAgICAgICAgICAgIChpbnQpdGV4dHAtPmtleSk7CisKKyAgICAgIHBuZ19tZW1jcHkodGV4dHAtPmtleSwgdGV4dF9wdHJbaV0ua2V5LChwbmdfc2l6ZV90KShrZXlfbGVuKSk7CisgICAgICAqKHRleHRwLT5rZXkgKyBrZXlfbGVuKSA9ICdcMCc7CisjaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECisgICAgICBpZiAodGV4dF9wdHJbaV0uY29tcHJlc3Npb24gPiAwKQorICAgICAgeworICAgICAgICAgdGV4dHAtPmxhbmcgPSB0ZXh0cC0+a2V5ICsga2V5X2xlbiArIDE7CisgICAgICAgICBwbmdfbWVtY3B5KHRleHRwLT5sYW5nLCB0ZXh0X3B0cltpXS5sYW5nLCBsYW5nX2xlbik7CisgICAgICAgICAqKHRleHRwLT5sYW5nICsgbGFuZ19sZW4pID0gJ1wwJzsKKyAgICAgICAgIHRleHRwLT5sYW5nX2tleSA9IHRleHRwLT5sYW5nICsgbGFuZ19sZW4gKyAxOworICAgICAgICAgcG5nX21lbWNweSh0ZXh0cC0+bGFuZ19rZXksIHRleHRfcHRyW2ldLmxhbmdfa2V5LCBsYW5nX2tleV9sZW4pOworICAgICAgICAgKih0ZXh0cC0+bGFuZ19rZXkgKyBsYW5nX2tleV9sZW4pID0gJ1wwJzsKKyAgICAgICAgIHRleHRwLT50ZXh0ID0gdGV4dHAtPmxhbmdfa2V5ICsgbGFuZ19rZXlfbGVuICsgMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgeworI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorICAgICAgICAgdGV4dHAtPmxhbmc9TlVMTDsKKyAgICAgICAgIHRleHRwLT5sYW5nX2tleT1OVUxMOworI2VuZGlmCisgICAgICAgICB0ZXh0cC0+dGV4dCA9IHRleHRwLT5rZXkgKyBrZXlfbGVuICsgMTsKKyAgICAgIH0KKyAgICAgIGlmICh0ZXh0X2xlbmd0aCkKKyAgICAgICAgIHBuZ19tZW1jcHkodGV4dHAtPnRleHQsIHRleHRfcHRyW2ldLnRleHQsCisgICAgICAgICAgICAocG5nX3NpemVfdCkodGV4dF9sZW5ndGgpKTsKKyAgICAgICoodGV4dHAtPnRleHQgKyB0ZXh0X2xlbmd0aCkgPSAnXDAnOworCisjaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECisgICAgICBpZiAodGV4dHAtPmNvbXByZXNzaW9uID4gMCkKKyAgICAgIHsKKyAgICAgICAgIHRleHRwLT50ZXh0X2xlbmd0aCA9IDA7CisgICAgICAgICB0ZXh0cC0+aXR4dF9sZW5ndGggPSB0ZXh0X2xlbmd0aDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorCisgICAgICB7CisgICAgICAgICB0ZXh0cC0+dGV4dF9sZW5ndGggPSB0ZXh0X2xlbmd0aDsKKyNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKKyAgICAgICAgIHRleHRwLT5pdHh0X2xlbmd0aCA9IDA7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGluZm9fcHRyLT5udW1fdGV4dCsrOworICAgICAgcG5nX2RlYnVnMSgzLCAidHJhbnNmZXJyZWQgdGV4dCBjaHVuayAlZCIsIGluZm9fcHRyLT5udW1fdGV4dCk7CisgICB9CisgICByZXR1cm4oMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR190SU1FX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfdElNRShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190aW1lcCBtb2RfdGltZSkKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAidElNRSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwKKyAgICAgICAocG5nX3B0ci0+bW9kZSAmIFBOR19XUk9URV90SU1FKSkKKyAgICAgIHJldHVybjsKKworICAgcG5nX21lbWNweSgmKGluZm9fcHRyLT5tb2RfdGltZSksIG1vZF90aW1lLCBwbmdfc2l6ZW9mKHBuZ190aW1lKSk7CisgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fdElNRTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX3RSTlNfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF90Uk5TKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKKyAgIHBuZ19ieXRlcCB0cmFucywgaW50IG51bV90cmFucywgcG5nX2NvbG9yXzE2cCB0cmFuc192YWx1ZXMpCit7CisgICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInRSTlMiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpZiAodHJhbnMgIT0gTlVMTCkKKyAgIHsKKyAgICAgICAvKiBJdCBtYXkgbm90IGFjdHVhbGx5IGJlIG5lY2Vzc2FyeSB0byBzZXQgcG5nX3B0ci0+dHJhbnMgaGVyZTsKKyAgICAgICAgKiB3ZSBkbyBpdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB3YXkgdGhlIHBuZ19oYW5kbGVfdFJOUworICAgICAgICAqIGZ1bmN0aW9uIHVzZWQgdG8gZG8gdGhlIGFsbG9jYXRpb24uCisgICAgICAgICovCisKKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9UUk5TLCAwKTsKKyNlbmRpZgorCisgICAgICAgLyogQ2hhbmdlZCBmcm9tIG51bV90cmFucyB0byBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIIGluIHZlcnNpb24gMS4yLjEgKi8KKyAgICAgICBwbmdfcHRyLT50cmFucyA9IGluZm9fcHRyLT50cmFucyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAocG5nX3VpbnRfMzIpUE5HX01BWF9QQUxFVFRFX0xFTkdUSCk7CisgICAgICAgaWYgKG51bV90cmFucyA+IDAgJiYgbnVtX3RyYW5zIDw9IFBOR19NQVhfUEFMRVRURV9MRU5HVEgpCisgICAgICAgICAgcG5nX21lbWNweShpbmZvX3B0ci0+dHJhbnMsIHRyYW5zLCAocG5nX3NpemVfdCludW1fdHJhbnMpOworICAgfQorCisgICBpZiAodHJhbnNfdmFsdWVzICE9IE5VTEwpCisgICB7CisgICAgICBpbnQgc2FtcGxlX21heCA9ICgxIDw8IGluZm9fcHRyLT5iaXRfZGVwdGgpOworICAgICAgaWYgKChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmCisgICAgICAgICAgKGludCl0cmFuc192YWx1ZXMtPmdyYXkgPiBzYW1wbGVfbWF4KSB8fAorICAgICAgICAgIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgJiYKKyAgICAgICAgICAoKGludCl0cmFuc192YWx1ZXMtPnJlZCA+IHNhbXBsZV9tYXggfHwKKyAgICAgICAgICAoaW50KXRyYW5zX3ZhbHVlcy0+Z3JlZW4gPiBzYW1wbGVfbWF4IHx8CisgICAgICAgICAgKGludCl0cmFuc192YWx1ZXMtPmJsdWUgPiBzYW1wbGVfbWF4KSkpCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgInRSTlMgY2h1bmsgaGFzIG91dC1vZi1yYW5nZSBzYW1wbGVzIGZvciBiaXRfZGVwdGgiKTsKKyAgICAgIHBuZ19tZW1jcHkoJihpbmZvX3B0ci0+dHJhbnNfdmFsdWVzKSwgdHJhbnNfdmFsdWVzLAorICAgICAgICAgcG5nX3NpemVvZihwbmdfY29sb3JfMTYpKTsKKyAgICAgIGlmIChudW1fdHJhbnMgPT0gMCkKKyAgICAgICAgIG51bV90cmFucyA9IDE7CisgICB9CisKKyAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAocG5nX3VpbnRfMTYpbnVtX3RyYW5zOworICAgaWYgKG51bV90cmFucyAhPSAwKQorICAgeworICAgICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3RSTlM7CisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICAgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9UUk5TOworI2Vsc2UKKyAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0ZSRUVfVFJOUzsKKyNlbmRpZgorICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfc1BMVF9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3NQTFQocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICAgICAgICAgICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19zUExUX3RwIGVudHJpZXMsIGludCBuZW50cmllcykKKy8qCisgKiAgZW50cmllcyAgICAgICAgLSBhcnJheSBvZiBwbmdfc1BMVF90IHN0cnVjdHVyZXMKKyAqICAgICAgICAgICAgICAgICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHBhbGV0dGVzCisgKiAgICAgICAgICAgICAgICAgICBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCisgKiAgbmVudHJpZXMgICAgICAgLSBudW1iZXIgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIHRvIGJlCisgKiAgICAgICAgICAgICAgICAgICBhZGRlZC4KKyAqLworeworICAgcG5nX3NQTFRfdHAgbnA7CisgICBpbnQgaTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBucCA9IChwbmdfc1BMVF90cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKKyAgICAgICAoaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtICsgbmVudHJpZXMpICoKKyAgICAgICAgKHBuZ191aW50XzMyKXBuZ19zaXplb2YocG5nX3NQTFRfdCkpOworICAgaWYgKG5wID09IE5VTEwpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gbWVtb3J5IGZvciBzUExUIHBhbGV0dGVzLiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfbWVtY3B5KG5wLCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcywKKyAgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0gKiBwbmdfc2l6ZW9mKHBuZ19zUExUX3QpKTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzKTsKKyAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzPU5VTEw7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBuZW50cmllczsgaSsrKQorICAgeworICAgICAgcG5nX3NQTFRfdHAgdG8gPSBucCArIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bSArIGk7CisgICAgICBwbmdfc1BMVF90cCBmcm9tID0gZW50cmllcyArIGk7CisgICAgICBwbmdfdWludF8zMiBsZW5ndGg7CisKKyAgICAgIGxlbmd0aCA9IHBuZ19zdHJsZW4oZnJvbS0+bmFtZSkgKyAxOworICAgICAgdG8tPm5hbWUgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpOworICAgICAgaWYgKHRvLT5uYW1lID09IE5VTEwpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAiT3V0IG9mIG1lbW9yeSB3aGlsZSBwcm9jZXNzaW5nIHNQTFQgY2h1bmsiKTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcG5nX21lbWNweSh0by0+bmFtZSwgZnJvbS0+bmFtZSwgbGVuZ3RoKTsKKyAgICAgIHRvLT5lbnRyaWVzID0gKHBuZ19zUExUX2VudHJ5cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKKyAgICAgICAgICAocG5nX3VpbnRfMzIpKGZyb20tPm5lbnRyaWVzICogcG5nX3NpemVvZihwbmdfc1BMVF9lbnRyeSkpKTsKKyAgICAgIGlmICh0by0+ZW50cmllcyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgcHJvY2Vzc2luZyBzUExUIGNodW5rIik7CisgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCB0by0+bmFtZSk7CisgICAgICAgICB0by0+bmFtZSA9IE5VTEw7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHBuZ19tZW1jcHkodG8tPmVudHJpZXMsIGZyb20tPmVudHJpZXMsCisgICAgICAgICAgZnJvbS0+bmVudHJpZXMgKiBwbmdfc2l6ZW9mKHBuZ19zUExUX2VudHJ5KSk7CisgICAgICB0by0+bmVudHJpZXMgPSBmcm9tLT5uZW50cmllczsKKyAgICAgIHRvLT5kZXB0aCA9IGZyb20tPmRlcHRoOworICAgfQorCisgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyA9IG5wOworICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtICs9IG5lbnRyaWVzOworICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3NQTFQ7CisjaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECisgICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9TUExUOworI2VuZGlmCit9CisjZW5kaWYgLyogUE5HX3NQTFRfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdW5rbm93bl9jaHVua3AgdW5rbm93bnMsIGludCBudW1fdW5rbm93bnMpCit7CisgICBwbmdfdW5rbm93bl9jaHVua3AgbnA7CisgICBpbnQgaTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMIHx8IG51bV91bmtub3ducyA9PSAwKQorICAgICAgcmV0dXJuOworCisgICBucCA9IChwbmdfdW5rbm93bl9jaHVua3ApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCisgICAgICAgKHBuZ191aW50XzMyKSgoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSArIG51bV91bmtub3ducykgKgorICAgICAgIHBuZ19zaXplb2YocG5nX3Vua25vd25fY2h1bmspKSk7CisgICBpZiAobnAgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgcHJvY2Vzc2luZyB1bmtub3duIGNodW5rLiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfbWVtY3B5KG5wLCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MsCisgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSAqIHBuZ19zaXplb2YocG5nX3Vua25vd25fY2h1bmspKTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT51bmtub3duX2NodW5rcyk7CisgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgPSBOVUxMOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Vua25vd25zOyBpKyspCisgICB7CisgICAgICBwbmdfdW5rbm93bl9jaHVua3AgdG8gPSBucCArIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0gKyBpOworICAgICAgcG5nX3Vua25vd25fY2h1bmtwIGZyb20gPSB1bmtub3ducyArIGk7CisKKyAgICAgIHBuZ19tZW1jcHkoKHBuZ19jaGFycCl0by0+bmFtZSwgKHBuZ19jaGFycClmcm9tLT5uYW1lLAorICAgICAgICAgIHBuZ19zaXplb2YoZnJvbS0+bmFtZSkpOworICAgICAgdG8tPm5hbWVbcG5nX3NpemVvZih0by0+bmFtZSktMV0gPSAnXDAnOworICAgICAgdG8tPnNpemUgPSBmcm9tLT5zaXplOworICAgICAgLyogTm90ZSBvdXIgbG9jYXRpb24gaW4gdGhlIHJlYWQgb3Igd3JpdGUgc2VxdWVuY2UgKi8KKyAgICAgIHRvLT5sb2NhdGlvbiA9IChwbmdfYnl0ZSkocG5nX3B0ci0+bW9kZSAmIDB4ZmYpOworCisgICAgICBpZiAoZnJvbS0+c2l6ZSA9PSAwKQorICAgICAgICAgdG8tPmRhdGE9TlVMTDsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHRvLT5kYXRhID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKKyAgICAgICAgICAgKHBuZ191aW50XzMyKWZyb20tPnNpemUpOworICAgICAgICAgaWYgKHRvLT5kYXRhID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgICJPdXQgb2YgbWVtb3J5IHdoaWxlIHByb2Nlc3NpbmcgdW5rbm93biBjaHVuay4iKTsKKyAgICAgICAgICAgIHRvLT5zaXplID0gMDsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBuZ19tZW1jcHkodG8tPmRhdGEsIGZyb20tPmRhdGEsIGZyb20tPnNpemUpOworICAgICAgfQorICAgfQorCisgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgPSBucDsKKyAgIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0gKz0gbnVtX3Vua25vd25zOworI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAorICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfVU5LTjsKKyNlbmRpZgorfQordm9pZCBQTkdBUEkKK3BuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICBpbnQgY2h1bmssIGludCBsb2NhdGlvbikKK3sKKyAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiBjaHVuayA+PSAwICYmIGNodW5rIDwKKyAgICAgICAoaW50KWluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0pCisgICAgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NbY2h1bmtdLmxvY2F0aW9uID0gKHBuZ19ieXRlKWxvY2F0aW9uOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZChQTkdfMV8yX1gpCisjaWYgZGVmaW5lZChQTkdfUkVBRF9FTVBUWV9QTFRFX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX0VNUFRZX1BMVEVfU1VQUE9SVEVEKQordm9pZCBQTkdBUEkKK3BuZ19wZXJtaXRfZW1wdHlfcGx0ZSAocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGVtcHR5X3BsdGVfcGVybWl0dGVkKQoreworICAgLyogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkKKyAgICAgIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS4zLjAgKi8KKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcGVybWl0X2VtcHR5X3BsdGUsIERFUFJFQ0FURUQuIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkID0gKHBuZ19ieXRlKQorICAgICAoKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiAoflBOR19GTEFHX01OR19FTVBUWV9QTFRFKSkgfAorICAgICAoKGVtcHR5X3BsdGVfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0VNUFRZX1BMVEUpKSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKK3BuZ191aW50XzMyIFBOR0FQSQorcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIG1uZ19mZWF0dXJlcykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiAocG5nX3VpbnRfMzIpMDsKKyAgIHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgPQorICAgICAocG5nX2J5dGUpKG1uZ19mZWF0dXJlcyAmIFBOR19BTExfTU5HX0ZFQVRVUkVTKTsKKyAgIHJldHVybiAocG5nX3VpbnRfMzIpcG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZDsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAordm9pZCBQTkdBUEkKK3BuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQga2VlcCwgcG5nX2J5dGVwCisgICBjaHVua19saXN0LCBpbnQgbnVtX2NodW5rcykKK3sKKyAgIHBuZ19ieXRlcCBuZXdfbGlzdCwgcDsKKyAgIGludCBpLCBvbGRfbnVtX2NodW5rczsKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBpZiAobnVtX2NodW5rcyA9PSAwKQorICAgeworICAgICAgaWYgKGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgfHwga2VlcCA9PSBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUpCisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19LRUVQX1VOS05PV05fQ0hVTktTOworICAgICAgZWxzZQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0tFRVBfVU5LTk9XTl9DSFVOS1M7CisKKyAgICAgIGlmIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTKQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfS0VFUF9VTlNBRkVfQ0hVTktTOworICAgICAgZWxzZQorICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0tFRVBfVU5TQUZFX0NIVU5LUzsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGlmIChjaHVua19saXN0ID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBvbGRfbnVtX2NodW5rcyA9IHBuZ19wdHItPm51bV9jaHVua19saXN0OworICAgbmV3X2xpc3Q9KHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAocG5nX3VpbnRfMzIpCisgICAgICAgKDUqKG51bV9jaHVua3MgKyBvbGRfbnVtX2NodW5rcykpKTsKKyAgIGlmIChwbmdfcHRyLT5jaHVua19saXN0ICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfbWVtY3B5KG5ld19saXN0LCBwbmdfcHRyLT5jaHVua19saXN0LAorICAgICAgICAgIChwbmdfc2l6ZV90KSg1Km9sZF9udW1fY2h1bmtzKSk7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19saXN0KTsKKyAgICAgIHBuZ19wdHItPmNodW5rX2xpc3Q9TlVMTDsKKyAgIH0KKyAgIHBuZ19tZW1jcHkobmV3X2xpc3QgKyA1Km9sZF9udW1fY2h1bmtzLCBjaHVua19saXN0LAorICAgICAgIChwbmdfc2l6ZV90KSg1Km51bV9jaHVua3MpKTsKKyAgIGZvciAocCA9IG5ld19saXN0ICsgNSpvbGRfbnVtX2NodW5rcyArIDQsIGkgPSAwOyBpPG51bV9jaHVua3M7IGkrKywgcCArPSA1KQorICAgICAgKnA9KHBuZ19ieXRlKWtlZXA7CisgICBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCA9IG9sZF9udW1fY2h1bmtzICsgbnVtX2NodW5rczsKKyAgIHBuZ19wdHItPmNodW5rX2xpc3QgPSBuZXdfbGlzdDsKKyNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKKyAgIHBuZ19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfTElTVDsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgdXNlcl9jaHVua19wdHIsCisgICBwbmdfdXNlcl9jaHVua19wdHIgcmVhZF91c2VyX2NodW5rX2ZuKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbiIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT5yZWFkX3VzZXJfY2h1bmtfZm4gPSByZWFkX3VzZXJfY2h1bmtfZm47CisgICBwbmdfcHRyLT51c2VyX2NodW5rX3B0ciA9IHVzZXJfY2h1bmtfcHRyOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3Jvd3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfYnl0ZXBwIHJvd19wb2ludGVycykKK3sKKyAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAicm93cyIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGlmIChpbmZvX3B0ci0+cm93X3BvaW50ZXJzICYmIChpbmZvX3B0ci0+cm93X3BvaW50ZXJzICE9IHJvd19wb2ludGVycykpCisgICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9ST1dTLCAwKTsKKyAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMgPSByb3dfcG9pbnRlcnM7CisgICBpZiAocm93X3BvaW50ZXJzKQorICAgICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX0lEQVQ7Cit9CisjZW5kaWYKKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3N0cnVjdHAgcG5nX3B0ciwKKyAgICBwbmdfdWludF8zMiBzaXplKQoreworICAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICAgcmV0dXJuOworICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnpidWYpOworICAgIHBuZ19wdHItPnpidWZfc2l6ZSA9IChwbmdfc2l6ZV90KXNpemU7CisgICAgcG5nX3B0ci0+emJ1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLCBzaXplKTsKKyAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKKyAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfaW52YWxpZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBtYXNrKQoreworICAgaWYgKHBuZ19wdHIgJiYgaW5mb19wdHIpCisgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gfm1hc2s7Cit9CisKKworI2lmbmRlZiBQTkdfMV8wX1gKKyNpZmRlZiBQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVECisvKiBGdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuMi4wIGFuZCBzaG91bGQgYWx3YXlzIGV4aXN0IGJ5IGRlZmF1bHQgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2FzbV9mbGFncyAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgYXNtX2ZsYWdzKQoreworLyogT2Jzb2xldGUgYXMgb2YgbGlicG5nLTEuMi4yMCBhbmQgd2lsbCBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNC4wICovCisgICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgICBwbmdfcHRyLT5hc21fZmxhZ3MgPSAwOworICAgIGFzbV9mbGFncyA9IGFzbV9mbGFnczsgLyogUXVpZXQgdGhlIGNvbXBpbGVyICovCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZyAxLjIuMCAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfbW14X3RocmVzaG9sZHMgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBtbXhfYml0ZGVwdGhfdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgbW14X3Jvd2J5dGVzX3RocmVzaG9sZCkKK3sKKy8qIE9ic29sZXRlIGFzIG9mIGxpYnBuZy0xLjIuMjAgYW5kIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjQuMCAqLworICAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICAgcmV0dXJuOworICAgIC8qIFF1aWV0IHRoZSBjb21waWxlciAqLworICAgIG1teF9iaXRkZXB0aF90aHJlc2hvbGQgPSBtbXhfYml0ZGVwdGhfdGhyZXNob2xkOworICAgIG1teF9yb3dieXRlc190aHJlc2hvbGQgPSBtbXhfcm93Ynl0ZXNfdGhyZXNob2xkOworfQorI2VuZGlmIC8qID9QTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVEICovCisKKyNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuMi42ICovCit2b2lkIFBOR0FQSQorcG5nX3NldF91c2VyX2xpbWl0cyAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgdXNlcl93aWR0aF9tYXgsCisgICAgcG5nX3VpbnRfMzIgdXNlcl9oZWlnaHRfbWF4KQoreworICAgLyogSW1hZ2VzIHdpdGggZGltZW5zaW9ucyBsYXJnZXIgdGhhbiB0aGVzZSBsaW1pdHMgd2lsbCBiZQorICAgICogcmVqZWN0ZWQgYnkgcG5nX3NldF9JSERSKCkuICBUbyBhY2NlcHQgYW55IFBORyBkYXRhc3RyZWFtCisgICAgKiByZWdhcmRsZXNzIG9mIGRpbWVuc2lvbnMsIHNldCBib3RoIGxpbWl0cyB0byAweDdmZmZmZmZMLgorICAgICovCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggPSB1c2VyX3dpZHRoX21heDsKKyAgIHBuZ19wdHItPnVzZXJfaGVpZ2h0X21heCA9IHVzZXJfaGVpZ2h0X21heDsKK30KKyNlbmRpZiAvKiA/UE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQgKi8KKworCisjaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF9iZW5pZ25fZXJyb3JzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBhbGxvd2VkKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMiKTsKKworICAgaWYgKGFsbG93ZWQpCisgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk47CisgICBlbHNlCisgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQkVOSUdOX0VSUk9SU19XQVJOOworfQorI2VuZGlmIC8qIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qID9QTkdfMV8wX1ggKi8KKyNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9wbmd0ZXN0LmMgYi9jb20zMi9saWIvbGlicG5nL3BuZ3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDBlNDMyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9wbmd0ZXN0LmMKQEAgLTAsMCArMSwxNzA1IEBACisKKy8qIHBuZ3Rlc3QuYyAtIGEgc2ltcGxlIHRlc3QgcHJvZ3JhbSB0byB0ZXN0IGxpYnBuZworICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjQzIFtGZWJydWFyeSAyNSwgMjAxMF0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKgorICogVGhpcyBwcm9ncmFtIHJlYWRzIGluIGEgUE5HIGltYWdlLCB3cml0ZXMgaXQgb3V0IGFnYWluLCBhbmQgdGhlbgorICogY29tcGFyZXMgdGhlIHR3byBmaWxlcy4gIElmIHRoZSBmaWxlcyBhcmUgaWRlbnRpY2FsLCB0aGlzIHNob3dzIHRoYXQKKyAqIHRoZSBiYXNpYyBjaHVuayBoYW5kbGluZywgZmlsdGVyaW5nLCBhbmQgKGRlKWNvbXByZXNzaW9uIGNvZGUgaXMgd29ya2luZworICogcHJvcGVybHkuICBJdCBkb2VzIG5vdCBjdXJyZW50bHkgdGVzdCBhbGwgb2YgdGhlIHRyYW5zZm9ybXMsIGFsdGhvdWdoCisgKiBpdCBwcm9iYWJseSBzaG91bGQuCisgKgorICogVGhlIHByb2dyYW0gd2lsbCByZXBvcnQgIkZBSUwiIGluIGNlcnRhaW4gbGVnaXRpbWF0ZSBjYXNlczoKKyAqIDEpIHdoZW4gdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIGZpbHRlciBzZWxlY3Rpb24gbWV0aG9kIGlzIGNoYW5nZWQuCisgKiAyKSB3aGVuIHRoZSBtYXhpbXVtIElEQVQgc2l6ZSAoUE5HX1pCVUZfU0laRSBpbiBwbmdjb25mLmgpIGlzIG5vdCA4MTkyLgorICogMykgdW5rbm93biB1bnNhZmUtdG8tY29weSBhbmNpbGxhcnkgY2h1bmtzIG9yIHVua25vd24gY3JpdGljYWwgY2h1bmtzCisgKiAgICBleGlzdCBpbiB0aGUgaW5wdXQgZmlsZS4KKyAqIDQpIG90aGVycyBub3QgbGlzdGVkIGhlcmUuLi4KKyAqIEluIHRoZXNlIGNhc2VzLCBpdCBpcyBiZXN0IHRvIGNoZWNrIHdpdGggYW5vdGhlciB0b29sIHN1Y2ggYXMgInBuZ2NoZWNrIgorICogdG8gc2VlIHdoYXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBmaWxlcyBhcmUuCisgKgorICogSWYgYSBmaWxlbmFtZSBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZC1saW5lLCB0aGVuIHRoaXMgZmlsZSBpcyB1c2VkCisgKiBmb3IgdGhlIGlucHV0LCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCAicG5ndGVzdC5wbmciLiAgVGhpcyBhbGxvd3MKKyAqIHRlc3RpbmcgYSB3aWRlIHZhcmlldHkgb2YgZmlsZXMgZWFzaWx5LiAgWW91IGNhbiBhbHNvIHRlc3QgYSBudW1iZXIKKyAqIG9mIGZpbGVzIGF0IG9uY2UgYnkgdHlwaW5nICJwbmd0ZXN0IC1tIGZpbGUxLnBuZyBmaWxlMi5wbmcgLi4uIgorICovCisKKyNkZWZpbmUgUE5HX1BFREFOVElDX1dBUk5JTkdTCisjaW5jbHVkZSAicG5nLmgiCisKKyNpZmRlZiBfV0lOMzJfV0NFCisjICBpZiBfV0lOMzJfV0NFIDwgMjExCisgICAgIF9fZXJyb3JfXyAoZnx3KXByaW50ZiBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gb2xkIFdpbmRvd3NDRS47CisjICBlbmRpZgorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjICBkZWZpbmUgUkVBREZJTEUoZmlsZSwgZGF0YSwgbGVuZ3RoLCBjaGVjaykgXAorICAgICBpZiAoUmVhZEZpbGUoZmlsZSwgZGF0YSwgbGVuZ3RoLCAmY2hlY2ssIE5VTEwpKSBjaGVjayA9IDAKKyMgIGRlZmluZSBXUklURUZJTEUoZmlsZSwgZGF0YSwgbGVuZ3RoLCBjaGVjaykpIFwKKyAgICAgaWYgKFdyaXRlRmlsZShmaWxlLCBkYXRhLCBsZW5ndGgsICZjaGVjaywgTlVMTCkpIGNoZWNrID0gMAorIyAgZGVmaW5lIEZDTE9TRShmaWxlKSBDbG9zZUhhbmRsZShmaWxlKQorI2Vsc2UKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgIGRlZmluZSBSRUFERklMRShmaWxlLCBkYXRhLCBsZW5ndGgsIGNoZWNrKSBcCisgICAgIGNoZWNrPShwbmdfc2l6ZV90KWZyZWFkKGRhdGEsIChwbmdfc2l6ZV90KTEsIGxlbmd0aCwgZmlsZSkKKyMgIGRlZmluZSBXUklURUZJTEUoZmlsZSwgZGF0YSwgbGVuZ3RoLCBjaGVjaykgXAorICAgICBjaGVjaz0ocG5nX3NpemVfdClmd3JpdGUoZGF0YSwgKHBuZ19zaXplX3QpMSwgbGVuZ3RoLCBmaWxlKQorIyAgZGVmaW5lIEZDTE9TRShmaWxlKSBmY2xvc2UoZmlsZSkKKyNlbmRpZgorCisjaWZuZGVmIFBOR19TVERJT19TVVBQT1JURUQKKyMgIGlmZGVmIF9XSU4zMl9XQ0UKKyAgICAgdHlwZWRlZiBIQU5ETEUgICAgICAgICAgICAgICAgcG5nX0ZJTEVfcDsKKyMgIGVsc2UKKyAgICAgdHlwZWRlZiBGSUxFICAgICAgICAgICAgICAgICogcG5nX0ZJTEVfcDsKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWFrZXMgcG5ndGVzdCB2ZXJib3NlIHNvIHdlIGNhbiBmaW5kIHByb2JsZW1zIChuZWVkcyB0byBiZSBiZWZvcmUgcG5nLmgpICovCisjaWZuZGVmIFBOR19ERUJVRworIyAgZGVmaW5lIFBOR19ERUJVRyAwCisjZW5kaWYKKworI2lmICFQTkdfREVCVUcKKyMgIGRlZmluZSBTSU5HTEVfUk9XQlVGX0FMTE9DICAvKiBNYWtlcyBidWZmZXIgb3ZlcnJ1bnMgZWFzaWVyIHRvIG5haWwgKi8KKyNlbmRpZgorCisvKiBUdXJuIG9uIENQVSB0aW1pbmcKKyNkZWZpbmUgUE5HVEVTVF9USU1JTkcKKyovCisKKyNpZm5kZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorI3VuZGVmIFBOR1RFU1RfVElNSU5HCisjZW5kaWYKKworI2lmZGVmIFBOR1RFU1RfVElNSU5HCitzdGF0aWMgZmxvYXQgdF9zdGFydCwgdF9zdG9wLCB0X2RlY29kZSwgdF9lbmNvZGUsIHRfbWlzYzsKKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworI2lmZGVmIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECisjZGVmaW5lIFBOR190SU1FX1NUUklOR19MRU5HVEggMjkKK3N0YXRpYyBpbnQgdElNRV9jaHVua19wcmVzZW50ID0gMDsKK3N0YXRpYyBjaGFyIHRJTUVfc3RyaW5nW1BOR190SU1FX1NUUklOR19MRU5HVEhdID0gInRJTUUgY2h1bmsgaXMgbm90IHByZXNlbnQiOworI2VuZGlmCisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CisKK2ludCB0ZXN0X29uZV9maWxlIFBOR0FSRygoUE5HX0NPTlNUIGNoYXIgKmlubmFtZSwgUE5HX0NPTlNUIGNoYXIgKm91dG5hbWUpKTsKKworI2lmZGVmIF9fVFVSQk9DX18KKyNpbmNsdWRlIDxtZW0uaD4KKyNlbmRpZgorCisvKiBEZWZpbmVkIHNvIEkgY2FuIHdyaXRlIHRvIGEgZmlsZSBvbiBndWkvd2luZG93aW5nIHBsYXRmb3JtcyAqLworLyogICNkZWZpbmUgU1RERVJSIHN0ZGVyciAgKi8KKyNkZWZpbmUgU1RERVJSIHN0ZG91dCAgIC8qIEZvciBET1MgKi8KKworLyogSW4gY2FzZSBhIHN5c3RlbSBoZWFkZXIgKGUuZy4sIG9uIEFJWCkgZGVmaW5lZCBqbXBidWYgKi8KKyNpZmRlZiBqbXBidWYKKyMgIHVuZGVmIGptcGJ1ZgorI2VuZGlmCisKKy8qIERlZmluZSBwbmdfam1wYnVmKCkgaW4gY2FzZSB3ZSBhcmUgdXNpbmcgYSBwcmUtMS4wLjYgdmVyc2lvbiBvZiBsaWJwbmcgKi8KKyNpZm5kZWYgcG5nX2ptcGJ1ZgorIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgcG5nX3B0ci0+am1wYnVmCisjZW5kaWYKKworLyogRXhhbXBsZSBvZiB1c2luZyByb3cgY2FsbGJhY2tzIHRvIG1ha2UgYSBzaW1wbGUgcHJvZ3Jlc3MgbWV0ZXIgKi8KK3N0YXRpYyBpbnQgc3RhdHVzX3Bhc3MgPSAxOworc3RhdGljIGludCBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAwOworc3RhdGljIGludCBzdGF0dXNfZG90cyA9IDE7CisKK3ZvaWQKKyNpZmRlZiBQTkdfMV8wX1gKK1BOR0FQSQorI2VuZGlmCityZWFkX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiByb3dfbnVtYmVyLCBpbnQgcGFzcyk7Cit2b2lkCisjaWZkZWYgUE5HXzFfMF9YCitQTkdBUEkKKyNlbmRpZgorcmVhZF9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgcm93X251bWJlciwgaW50IHBhc3MpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHJvd19udW1iZXIgPiBQTkdfVUlOVF8zMV9NQVgpCisgICAgICByZXR1cm47CisgICBpZiAoc3RhdHVzX3Bhc3MgIT0gcGFzcykKKyAgIHsKKyAgICAgIGZwcmludGYoc3Rkb3V0LCAiXG4gUGFzcyAlZDogIiwgcGFzcyk7CisgICAgICBzdGF0dXNfcGFzcyA9IHBhc3M7CisgICAgICBzdGF0dXNfZG90cyA9IDMxOworICAgfQorICAgc3RhdHVzX2RvdHMtLTsKKyAgIGlmIChzdGF0dXNfZG90cyA9PSAwKQorICAgeworICAgICAgZnByaW50ZihzdGRvdXQsICJcbiAgICAgICAgICIpOworICAgICAgc3RhdHVzX2RvdHM9MzA7CisgICB9CisgICBmcHJpbnRmKHN0ZG91dCwgInIiKTsKK30KKwordm9pZAorI2lmZGVmIFBOR18xXzBfWAorUE5HQVBJCisjZW5kaWYKK3dyaXRlX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiByb3dfbnVtYmVyLCBpbnQgcGFzcyk7Cit2b2lkCisjaWZkZWYgUE5HXzFfMF9YCitQTkdBUEkKKyNlbmRpZgord3JpdGVfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHJvd19udW1iZXIsIGludCBwYXNzKQoreworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCByb3dfbnVtYmVyID4gUE5HX1VJTlRfMzFfTUFYIHx8IHBhc3MgPiA3KQorICAgICAgcmV0dXJuOworICAgZnByaW50ZihzdGRvdXQsICJ3Iik7Cit9CisKKworI2lmZGVmIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorLyogRXhhbXBsZSBvZiB1c2luZyB1c2VyIHRyYW5zZm9ybSBjYWxsYmFjayAod2UgZG9uJ3QgdHJhbnNmb3JtIGFueXRoaW5nLAorICogYnV0IG1lcmVseSBleGFtaW5lIHRoZSByb3cgZmlsdGVycy4gIFdlIHNldCB0aGlzIHRvIDI1NiByYXRoZXIgdGhhbgorICogNSBpbiBjYXNlIGlsbGVnYWwgZmlsdGVyIHZhbHVlcyBhcmUgcHJlc2VudC4pCisgKi8KK3N0YXRpYyBwbmdfdWludF8zMiBmaWx0ZXJzX3VzZWRbMjU2XTsKK3ZvaWQKKyNpZmRlZiBQTkdfMV8wX1gKK1BOR0FQSQorI2VuZGlmCitjb3VudF9maWx0ZXJzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCBkYXRhKTsKK3ZvaWQKKyNpZmRlZiBQTkdfMV8wX1gKK1BOR0FQSQorI2VuZGlmCitjb3VudF9maWx0ZXJzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCBkYXRhKQoreworICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQorICAgICAgKytmaWx0ZXJzX3VzZWRbKihkYXRhIC0gMSldOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECisvKiBFeGFtcGxlIG9mIHVzaW5nIHVzZXIgdHJhbnNmb3JtIGNhbGxiYWNrICh3ZSBkb24ndCB0cmFuc2Zvcm0gYW55dGhpbmcsCisgKiBidXQgbWVyZWx5IGNvdW50IHRoZSB6ZXJvIHNhbXBsZXMpCisgKi8KKworc3RhdGljIHBuZ191aW50XzMyIHplcm9fc2FtcGxlczsKKwordm9pZAorI2lmZGVmIFBOR18xXzBfWAorUE5HQVBJCisjZW5kaWYKK2NvdW50X3plcm9fc2FtcGxlcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSk7Cit2b2lkCisjaWZkZWYgUE5HXzFfMF9YCitQTkdBUEkKKyNlbmRpZgorY291bnRfemVyb19zYW1wbGVzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCBkYXRhKQoreworICAgcG5nX2J5dGVwIGRwID0gZGF0YTsKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpcmV0dXJuOworCisgICAvKiBDb250ZW50cyBvZiByb3dfaW5mbzoKKyAgICAqICBwbmdfdWludF8zMiB3aWR0aCAgICAgIHdpZHRoIG9mIHJvdworICAgICogIHBuZ191aW50XzMyIHJvd2J5dGVzICAgbnVtYmVyIG9mIGJ5dGVzIGluIHJvdworICAgICogIHBuZ19ieXRlIGNvbG9yX3R5cGUgICAgY29sb3IgdHlwZSBvZiBwaXhlbHMKKyAgICAqICBwbmdfYnl0ZSBiaXRfZGVwdGggICAgIGJpdCBkZXB0aCBvZiBzYW1wbGVzCisgICAgKiAgcG5nX2J5dGUgY2hhbm5lbHMgICAgICBudW1iZXIgb2YgY2hhbm5lbHMgKDEtNCkKKyAgICAqICBwbmdfYnl0ZSBwaXhlbF9kZXB0aCAgIGJpdHMgcGVyIHBpeGVsIChkZXB0aCpjaGFubmVscykKKyAgICAqLworCisgICAgLyogQ291bnRzIHRoZSBudW1iZXIgb2YgemVybyBzYW1wbGVzIChvciB6ZXJvIHBpeGVscyBpZiBjb2xvcl90eXBlIGlzIDMgKi8KKworICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSAwIHx8IHJvd19pbmZvLT5jb2xvcl90eXBlID09IDMpCisgICAgeworICAgICAgIGludCBwb3MgPSAwOworICAgICAgIHBuZ191aW50XzMyIG4sIG5zdG9wOworICAgICAgIGZvciAobiA9IDAsIG5zdG9wPXJvd19pbmZvLT53aWR0aDsgbjxuc3RvcDsgbisrKQorICAgICAgIHsKKyAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoKCgqZHAgPDwgcG9zKysgKSAmIDB4ODApID09IDApCisgICAgICAgICAgICAgICAgemVyb19zYW1wbGVzKys7CisgICAgICAgICAgICAgaWYgKHBvcyA9PSA4KQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICAgICAgICAgIGRwKys7CisgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAyKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoKCgqZHAgPDwgKHBvcys9MikpICYgMHhjMCkgPT0gMCkKKyAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKKyAgICAgICAgICAgICBpZiAocG9zID09IDgpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcyA9IDA7CisgICAgICAgICAgICAgICAgZHArKzsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDQpCisgICAgICAgICAgeworICAgICAgICAgICAgIGlmICgoKCpkcCA8PCAocG9zKz00KSkgJiAweGYwKSA9PSAwKQorICAgICAgICAgICAgICAgIHplcm9fc2FtcGxlcysrOworICAgICAgICAgICAgIGlmIChwb3MgPT0gOCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgICAgICAgICBkcCsrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgICBpZiAoKmRwKysgPT0gMCkKKyAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKKyAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKCgqZHAgfCAqKGRwKzEpKSA9PSAwKQorICAgICAgICAgICAgICAgIHplcm9fc2FtcGxlcysrOworICAgICAgICAgICAgIGRwKz0yOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogT3RoZXIgY29sb3IgdHlwZXMgKi8KKyAgICB7CisgICAgICAgcG5nX3VpbnRfMzIgbiwgbnN0b3A7CisgICAgICAgaW50IGNoYW5uZWw7CisgICAgICAgaW50IGNvbG9yX2NoYW5uZWxzID0gcm93X2luZm8tPmNoYW5uZWxzOworICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA+IDMpY29sb3JfY2hhbm5lbHMtLTsKKworICAgICAgIGZvciAobiA9IDAsIG5zdG9wPXJvd19pbmZvLT53aWR0aDsgbjxuc3RvcDsgbisrKQorICAgICAgIHsKKyAgICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29sb3JfY2hhbm5lbHM7IGNoYW5uZWwrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgICAgICAgICBpZiAoKmRwKysgPT0gMCkKKyAgICAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKKyAgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgqZHAgfCAqKGRwKzEpKSA9PSAwKQorICAgICAgICAgICAgICAgICAgIHplcm9fc2FtcGxlcysrOworICAgICAgICAgICAgICAgIGRwKz0yOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID4gMykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgZHArKzsKKyAgICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgICAgICAgICAgICBkcCsrOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8qIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQgKi8KKworc3RhdGljIGludCB3cm90ZV9xdWVzdGlvbiA9IDA7CisKKyNpZm5kZWYgUE5HX1NURElPX1NVUFBPUlRFRAorLyogU1RBUlQgb2YgY29kZSB0byB2YWxpZGF0ZSBzdGRpby1mcmVlIGNvbXBpbGF0aW9uICovCisvKiBUaGVzZSBjb3BpZXMgb2YgdGhlIGRlZmF1bHQgcmVhZC93cml0ZSBmdW5jdGlvbnMgY29tZSBmcm9tIHBuZ3Jpby5jIGFuZAorICogcG5nd2lvLmMuICBUaGV5IGFsbG93ICJkb24ndCBpbmNsdWRlIHN0ZGlvIiB0ZXN0aW5nIG9mIHRoZSBsaWJyYXJ5LgorICogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgcmVhZGluZyBvZiBkYXRhLiAgSWYgeW91IGFyZQorICogbm90IHJlYWRpbmcgZnJvbSBhIHN0YW5kYXJkIEMgc3RyZWFtLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIHJlcGxhY2VtZW50CisgKiByZWFkX2RhdGEgZnVuY3Rpb24gYW5kIHVzZSBpdCBhdCBydW4gdGltZSB3aXRoIHBuZ19zZXRfcmVhZF9mbigpLCByYXRoZXIKKyAqIHRoYW4gY2hhbmdpbmcgdGhlIGxpYnJhcnkuCisgKi8KKworI2lmbmRlZiBVU0VfRkFSX0tFWVdPUkQKK3N0YXRpYyB2b2lkCitwbmd0ZXN0X3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBwbmdfc2l6ZV90IGNoZWNrID0gMDsKKyAgIHBuZ192b2lkcCBpb19wdHI7CisKKyAgIC8qIGZyZWFkKCkgcmV0dXJucyAwIG9uIGVycm9yLCBzbyBpdCBpcyBPSyB0byBzdG9yZSB0aGlzIGluIGEgcG5nX3NpemVfdAorICAgICogaW5zdGVhZCBvZiBhbiBpbnQsIHdoaWNoIGlzIHdoYXQgZnJlYWQoKSBhY3R1YWxseSByZXR1cm5zLgorICAgICovCisgICBpb19wdHIgPSBwbmdfZ2V0X2lvX3B0cihwbmdfcHRyKTsKKyAgIGlmIChpb19wdHIgIT0gTlVMTCkKKyAgIHsKKyAgICAgIFJFQURGSUxFKChwbmdfRklMRV9wKWlvX3B0ciwgZGF0YSwgbGVuZ3RoLCBjaGVjayk7CisgICB9CisKKyAgIGlmIChjaGVjayAhPSBsZW5ndGgpCisgICB7CisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlJlYWQgRXJyb3IhIik7CisgICB9Cit9CisjZWxzZQorLyogVGhpcyBpcyB0aGUgbW9kZWwtaW5kZXBlbmRlbnQgdmVyc2lvbi4gU2luY2UgdGhlIHN0YW5kYXJkIEkvTyBsaWJyYXJ5CisgICBjYW4ndCBoYW5kbGUgZmFyIGJ1ZmZlcnMgaW4gdGhlIG1lZGl1bSBhbmQgc21hbGwgbW9kZWxzLCB3ZSBoYXZlIHRvIGNvcHkKKyAgIHRoZSBkYXRhLgorKi8KKworI2RlZmluZSBORUFSX0JVRl9TSVpFIDEwMjQKKyNkZWZpbmUgTUlOKGEsYikgKGEgPD0gYiA/IGEgOiBiKQorCitzdGF0aWMgdm9pZAorcG5ndGVzdF9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgaW50IGNoZWNrOworICAgcG5nX2J5dGUgKm5fZGF0YTsKKyAgIHBuZ19GSUxFX3AgaW9fcHRyOworCisgICAvKiBDaGVjayBpZiBkYXRhIHJlYWxseSBpcyBuZWFyLiBJZiBzbywgdXNlIHVzdWFsIGNvZGUuICovCisgICBuX2RhdGEgPSAocG5nX2J5dGUgKilDVlRfUFRSX05PQ0hFQ0soZGF0YSk7CisgICBpb19wdHIgPSAocG5nX0ZJTEVfcClDVlRfUFRSKHBuZ19wdHItPmlvX3B0cik7CisgICBpZiAoKHBuZ19ieXRlcCluX2RhdGEgPT0gZGF0YSkKKyAgIHsKKyAgICAgIFJFQURGSUxFKGlvX3B0ciwgbl9kYXRhLCBsZW5ndGgsIGNoZWNrKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBuZ19ieXRlIGJ1ZltORUFSX0JVRl9TSVpFXTsKKyAgICAgIHBuZ19zaXplX3QgcmVhZCwgcmVtYWluaW5nLCBlcnI7CisgICAgICBjaGVjayA9IDA7CisgICAgICByZW1haW5pbmcgPSBsZW5ndGg7CisgICAgICBkbworICAgICAgeworICAgICAgICAgcmVhZCA9IE1JTihORUFSX0JVRl9TSVpFLCByZW1haW5pbmcpOworICAgICAgICAgUkVBREZJTEUoaW9fcHRyLCBidWYsIDEsIGVycik7CisgICAgICAgICBwbmdfbWVtY3B5KGRhdGEsIGJ1ZiwgcmVhZCk7IC8qIENvcHkgZmFyIGJ1ZmZlciB0byBuZWFyIGJ1ZmZlciAqLworICAgICAgICAgaWYgKGVyciAhPSByZWFkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBjaGVjayArPSBlcnI7CisgICAgICAgICBkYXRhICs9IHJlYWQ7CisgICAgICAgICByZW1haW5pbmcgLT0gcmVhZDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChyZW1haW5pbmcgIT0gMCk7CisgICB9CisgICBpZiAoY2hlY2sgIT0gbGVuZ3RoKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJyZWFkIEVycm9yIik7Cit9CisjZW5kaWYgLyogVVNFX0ZBUl9LRVlXT1JEICovCisKKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorcG5ndGVzdF9mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgLyogRG8gbm90aGluZzsgZmZsdXNoKCkgaXMgc2FpZCB0byBiZSBqdXN0IGEgd2FzdGUgb2YgZW5lcmd5LiAqLworICAgcG5nX3B0ciA9IHBuZ19wdHI7ICAvKiBTdGlmbGUgY29tcGlsZXIgd2FybmluZyAqLworfQorI2VuZGlmCisKKy8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdyaXRpbmcgb2YgZGF0YS4gIElmIHlvdSBhcmUKKyAqIG5vdCB3cml0aW5nIHRvIGEgc3RhbmRhcmQgQyBzdHJlYW0sIHlvdSBzaG91bGQgY3JlYXRlIGEgcmVwbGFjZW1lbnQKKyAqIHdyaXRlX2RhdGEgZnVuY3Rpb24gYW5kIHVzZSBpdCBhdCBydW4gdGltZSB3aXRoIHBuZ19zZXRfd3JpdGVfZm4oKSwgcmF0aGVyCisgKiB0aGFuIGNoYW5naW5nIHRoZSBsaWJyYXJ5LgorICovCisjaWZuZGVmIFVTRV9GQVJfS0VZV09SRAorc3RhdGljIHZvaWQKK3BuZ3Rlc3Rfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBwbmdfdWludF8zMiBjaGVjazsKKworICAgV1JJVEVGSUxFKChwbmdfRklMRV9wKXBuZ19wdHItPmlvX3B0ciwgIGRhdGEsIGxlbmd0aCwgY2hlY2spOworICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKKyAgIHsKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiV3JpdGUgRXJyb3IiKTsKKyAgIH0KK30KKyNlbHNlCisvKiBUaGlzIGlzIHRoZSBtb2RlbC1pbmRlcGVuZGVudCB2ZXJzaW9uLiBTaW5jZSB0aGUgc3RhbmRhcmQgSS9PIGxpYnJhcnkKKyAgIGNhbid0IGhhbmRsZSBmYXIgYnVmZmVycyBpbiB0aGUgbWVkaXVtIGFuZCBzbWFsbCBtb2RlbHMsIHdlIGhhdmUgdG8gY29weQorICAgdGhlIGRhdGEuCisqLworCisjZGVmaW5lIE5FQVJfQlVGX1NJWkUgMTAyNAorI2RlZmluZSBNSU4oYSxiKSAoYSA8PSBiID8gYSA6IGIpCisKK3N0YXRpYyB2b2lkCitwbmd0ZXN0X3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworICAgcG5nX3VpbnRfMzIgY2hlY2s7CisgICBwbmdfYnl0ZSAqbmVhcl9kYXRhOyAgLyogTmVlZHMgdG8gYmUgInBuZ19ieXRlICoiIGluc3RlYWQgb2YgInBuZ19ieXRlcCIgKi8KKyAgIHBuZ19GSUxFX3AgaW9fcHRyOworCisgICAvKiBDaGVjayBpZiBkYXRhIHJlYWxseSBpcyBuZWFyLiBJZiBzbywgdXNlIHVzdWFsIGNvZGUuICovCisgICBuZWFyX2RhdGEgPSAocG5nX2J5dGUgKilDVlRfUFRSX05PQ0hFQ0soZGF0YSk7CisgICBpb19wdHIgPSAocG5nX0ZJTEVfcClDVlRfUFRSKHBuZ19wdHItPmlvX3B0cik7CisgICBpZiAoKHBuZ19ieXRlcCluZWFyX2RhdGEgPT0gZGF0YSkKKyAgIHsKKyAgICAgIFdSSVRFRklMRShpb19wdHIsIG5lYXJfZGF0YSwgbGVuZ3RoLCBjaGVjayk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwbmdfYnl0ZSBidWZbTkVBUl9CVUZfU0laRV07CisgICAgICBwbmdfc2l6ZV90IHdyaXR0ZW4sIHJlbWFpbmluZywgZXJyOworICAgICAgY2hlY2sgPSAwOworICAgICAgcmVtYWluaW5nID0gbGVuZ3RoOworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgIHdyaXR0ZW4gPSBNSU4oTkVBUl9CVUZfU0laRSwgcmVtYWluaW5nKTsKKyAgICAgICAgIHBuZ19tZW1jcHkoYnVmLCBkYXRhLCB3cml0dGVuKTsgLyogQ29weSBmYXIgYnVmZmVyIHRvIG5lYXIgYnVmZmVyICovCisgICAgICAgICBXUklURUZJTEUoaW9fcHRyLCBidWYsIHdyaXR0ZW4sIGVycik7CisgICAgICAgICBpZiAoZXJyICE9IHdyaXR0ZW4pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoZWNrICs9IGVycjsKKyAgICAgICAgIGRhdGEgKz0gd3JpdHRlbjsKKyAgICAgICAgIHJlbWFpbmluZyAtPSB3cml0dGVuOworICAgICAgfQorICAgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKTsKKyAgIH0KKyAgIGlmIChjaGVjayAhPSBsZW5ndGgpCisgICB7CisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIldyaXRlIEVycm9yIik7CisgICB9Cit9CisjZW5kaWYgLyogVVNFX0ZBUl9LRVlXT1JEICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSB3YXJuaW5nLCBidXQgdGhlIGxpYnJhcnkgdGhpbmtzCisgKiBpdCBjYW4gY29udGludWUgYW55d2F5LiAgUmVwbGFjZW1lbnQgZnVuY3Rpb25zIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKKyAqIGhlcmUgaWYgeW91IGRvbid0IHdhbnQgdG8uICBJbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBwbmdfcHRyIGlzCisgKiBub3QgdXNlZCwgYnV0IGl0IGlzIHBhc3NlZCBpbiBjYXNlIGl0IG1heSBiZSB1c2VmdWwuCisgKi8KK3N0YXRpYyB2b2lkCitwbmd0ZXN0X3dhcm5pbmcocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpCit7CisgICBQTkdfQ09OU1QgY2hhciAqbmFtZSA9ICJVTktOT1dOIChFUlJPUiEpIjsKKyAgIGNoYXIgKnRlc3Q7CisgICB0ZXN0ID0gcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7CisgICBpZiAodGVzdCA9PSBOVUxMKQorICAgICBmcHJpbnRmKFNUREVSUiwgIiVzOiBsaWJwbmcgd2FybmluZzogJXNcbiIsIG5hbWUsIG1lc3NhZ2UpOworICAgZWxzZQorICAgICBmcHJpbnRmKFNUREVSUiwgIiVzOiBsaWJwbmcgd2FybmluZzogJXNcbiIsIHRlc3QsIG1lc3NhZ2UpOworfQorCisvKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHJlcGxhY2VtZW50cyBmb3IKKyAqIHRoaXMgZnVuY3Rpb24gTVVTVCBOT1QgUkVUVVJOLCBvciB0aGUgcHJvZ3JhbSB3aWxsIGxpa2VseSBjcmFzaC4gIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIHVzZWQgYnkgZGVmYXVsdCwgb3IgaWYgdGhlIHByb2dyYW0gc3VwcGxpZXMgTlVMTCBmb3IgdGhlCisgKiBlcnJvciBmdW5jdGlvbiBwb2ludGVyIGluIHBuZ19zZXRfZXJyb3JfZm4oKS4KKyAqLworc3RhdGljIHZvaWQKK3BuZ3Rlc3RfZXJyb3IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpCit7CisgICBwbmd0ZXN0X3dhcm5pbmcocG5nX3B0ciwgbWVzc2FnZSk7CisgICAvKiBXZSBjYW4gcmV0dXJuIGJlY2F1c2UgcG5nX2Vycm9yIGNhbGxzIHRoZSBkZWZhdWx0IGhhbmRsZXIsIHdoaWNoIGlzCisgICAgKiBhY3R1YWxseSBPSyBpbiB0aGlzIGNhc2UuCisgICAgKi8KK30KKyNlbmRpZiAvKiAhUE5HX1NURElPX1NVUFBPUlRFRCAqLworLyogRU5EIG9mIGNvZGUgdG8gdmFsaWRhdGUgc3RkaW8tZnJlZSBjb21waWxhdGlvbiAqLworCisvKiBTVEFSVCBvZiBjb2RlIHRvIHZhbGlkYXRlIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gKi8KKyNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRworCisvKiBBbGxvY2F0ZSBtZW1vcnkuICBGb3IgcmVhc29uYWJsZSBmaWxlcywgc2l6ZSBzaG91bGQgbmV2ZXIgZXhjZWVkCisgKiA2NEsuICBIb3dldmVyLCB6bGliIG1heSBhbGxvY2F0ZSBtb3JlIHRoZW4gNjRLIGlmIHlvdSBkb24ndCB0ZWxsCisgKiBpdCBub3QgdG8uICBTZWUgemNvbmYuaCBhbmQgcG5nLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uICB6bGliIGRvZXMKKyAqIG5lZWQgdG8gYWxsb2NhdGUgZXhhY3RseSA2NEssIHNvIHdoYXRldmVyIHlvdSBjYWxsIGhlcmUgbXVzdAorICogaGF2ZSB0aGUgYWJpbGl0eSB0byBkbyB0aGF0LgorICoKKyAqIFRoaXMgcGllY2Ugb2YgY29kZSBjYW4gYmUgY29tcGlsZWQgdG8gdmFsaWRhdGUgbWF4IDY0SyBhbGxvY2F0aW9ucworICogYnkgc2V0dGluZyBNQVhTRUdfNjRLIGluIHpsaWIgemNvbmYuaCAqb3IqIFBOR19NQVhfTUFMTE9DXzY0Sy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVtb3J5X2luZm9ybWF0aW9uCit7CisgICBwbmdfdWludF8zMiAgICAgICAgICAgICAgIHNpemU7CisgICBwbmdfdm9pZHAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICBzdHJ1Y3QgbWVtb3J5X2luZm9ybWF0aW9uIEZBUiAqbmV4dDsKK30gbWVtb3J5X2luZm9ybWF0aW9uOwordHlwZWRlZiBtZW1vcnlfaW5mb3JtYXRpb24gRkFSICptZW1vcnlfaW5mb3A7CisKK3N0YXRpYyBtZW1vcnlfaW5mb3AgcGluZm9ybWF0aW9uID0gTlVMTDsKK3N0YXRpYyBpbnQgY3VycmVudF9hbGxvY2F0aW9uID0gMDsKK3N0YXRpYyBpbnQgbWF4aW11bV9hbGxvY2F0aW9uID0gMDsKK3N0YXRpYyBpbnQgdG90YWxfYWxsb2NhdGlvbiA9IDA7CitzdGF0aWMgaW50IG51bV9hbGxvY2F0aW9ucyA9IDA7CisKK3BuZ192b2lkcCBwbmdfZGVidWdfbWFsbG9jIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2l6ZSkpOwordm9pZCBwbmdfZGVidWdfZnJlZSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpKTsKKworcG5nX3ZvaWRwCitwbmdfZGVidWdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCit7CisKKyAgIC8qIHBuZ19tYWxsb2MgaGFzIGFscmVhZHkgdGVzdGVkIGZvciBOVUxMOyBwbmdfY3JlYXRlX3N0cnVjdCBjYWxscworICAgICogcG5nX2RlYnVnX21hbGxvYyBkaXJlY3RseSwgd2l0aCBwbmdfcHRyID09IE5VTEwgd2hpY2ggaXMgT0sKKyAgICAqLworCisgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgcmV0dXJuIChOVUxMKTsKKworICAgLyogVGhpcyBjYWxscyB0aGUgbGlicmFyeSBhbGxvY2F0b3IgdHdpY2UsIG9uY2UgdG8gZ2V0IHRoZSByZXF1ZXN0ZWQKKyAgICAgIGJ1ZmZlciBhbmQgb25jZSB0byBnZXQgYSBuZXcgZnJlZSBsaXN0IGVudHJ5LiAqLworICAgeworICAgICAgLyogRGlzYWJsZSBtYWxsb2NfZm4gYW5kIGZyZWVfZm4gKi8KKyAgICAgIG1lbW9yeV9pbmZvcCBwaW5mbzsKKyAgICAgIHBuZ19zZXRfbWVtX2ZuKHBuZ19wdHIsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgcGluZm8gPSAobWVtb3J5X2luZm9wKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgIChwbmdfdWludF8zMilwbmdfc2l6ZW9mKCpwaW5mbykpOworICAgICAgcGluZm8tPnNpemUgPSBzaXplOworICAgICAgY3VycmVudF9hbGxvY2F0aW9uICs9IHNpemU7CisgICAgICB0b3RhbF9hbGxvY2F0aW9uICs9IHNpemU7CisgICAgICBudW1fYWxsb2NhdGlvbnMgKys7CisgICAgICBpZiAoY3VycmVudF9hbGxvY2F0aW9uID4gbWF4aW11bV9hbGxvY2F0aW9uKQorICAgICAgICAgbWF4aW11bV9hbGxvY2F0aW9uID0gY3VycmVudF9hbGxvY2F0aW9uOworICAgICAgcGluZm8tPnBvaW50ZXIgPSAocG5nX3ZvaWRwKXBuZ19tYWxsb2MocG5nX3B0ciwgc2l6ZSk7CisgICAgICAvKiBSZXN0b3JlIG1hbGxvY19mbiBhbmQgZnJlZV9mbiAqLworICAgICAgcG5nX3NldF9tZW1fZm4ocG5nX3B0ciwKKyAgICAgICAgICBwbmdfdm9pZHBfTlVMTCwgKHBuZ19tYWxsb2NfcHRyKXBuZ19kZWJ1Z19tYWxsb2MsCisgICAgICAgICAgKHBuZ19mcmVlX3B0cilwbmdfZGVidWdfZnJlZSk7CisgICAgICBpZiAoc2l6ZSAhPSAwICYmIHBpbmZvLT5wb2ludGVyID09IE5VTEwpCisgICAgICB7CisgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24gLT0gc2l6ZTsKKyAgICAgICAgIHRvdGFsX2FsbG9jYXRpb24gLT0gc2l6ZTsKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAorICAgICAgICAgICAib3V0IG9mIG1lbW9yeSBpbiBwbmd0ZXN0LT5wbmdfZGVidWdfbWFsbG9jLiIpOworICAgICAgfQorICAgICAgcGluZm8tPm5leHQgPSBwaW5mb3JtYXRpb247CisgICAgICBwaW5mb3JtYXRpb24gPSBwaW5mbzsKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgY2FsbGVyIGlzbid0IGFzc3VtaW5nIHplcm9lZCBtZW1vcnkuICovCisgICAgICBwbmdfbWVtc2V0KHBpbmZvLT5wb2ludGVyLCAweGRkLCBwaW5mby0+c2l6ZSk7CisgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgIHByaW50ZigicG5nX21hbGxvYyAlbHUgYnl0ZXMgYXQgJXhcbiIsICh1bnNpZ25lZCBsb25nKXNpemUsCisgICAgICAgICAgICBwaW5mby0+cG9pbnRlcik7CisgICAgICByZXR1cm4gKHBuZ192b2lkcCkocGluZm8tPnBvaW50ZXIpOworICAgfQorfQorCisvKiBGcmVlIGEgcG9pbnRlci4gIEl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhdCB0aGUgc2FtZSB0aW1lLiAqLwordm9pZAorcG5nX2RlYnVnX2ZyZWUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICBmcHJpbnRmKFNUREVSUiwgIk5VTEwgcG9pbnRlciB0byBwbmdfZGVidWdfZnJlZS5cbiIpOworICAgaWYgKHB0ciA9PSAwKQorICAgeworI2lmIDAgLyogVGhpcyBoYXBwZW5zIGFsbCB0aGUgdGltZS4gKi8KKyAgICAgIGZwcmludGYoU1RERVJSLCAiV0FSTklORzogZnJlZWluZyBOVUxMIHBvaW50ZXJcbiIpOworI2VuZGlmCisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIFVubGluayB0aGUgZWxlbWVudCBmcm9tIHRoZSBsaXN0LiAqLworICAgeworICAgICAgbWVtb3J5X2luZm9wIEZBUiAqcHBpbmZvID0gJnBpbmZvcm1hdGlvbjsKKyAgICAgIGZvciAoOzspCisgICAgICB7CisgICAgICAgICBtZW1vcnlfaW5mb3AgcGluZm8gPSAqcHBpbmZvOworICAgICAgICAgaWYgKHBpbmZvLT5wb2ludGVyID09IHB0cikKKyAgICAgICAgIHsKKyAgICAgICAgICAgICpwcGluZm8gPSBwaW5mby0+bmV4dDsKKyAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbiAtPSBwaW5mby0+c2l6ZTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2FsbG9jYXRpb24gPCAwKQorICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJEdXBsaWNhdGUgZnJlZSBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgLyogV2UgbXVzdCBmcmVlIHRoZSBsaXN0IGVsZW1lbnQgdG9vLCBidXQgZmlyc3Qga2lsbAorICAgICAgICAgICAgICAgdGhlIG1lbW9yeSB0aGF0IGlzIHRvIGJlIGZyZWVkLiAqLworICAgICAgICAgICAgcG5nX21lbXNldChwdHIsIDB4NTUsIHBpbmZvLT5zaXplKTsKKyAgICAgICAgICAgIHBuZ19mcmVlX2RlZmF1bHQocG5nX3B0ciwgcGluZm8pOworICAgICAgICAgICAgcGluZm8gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBpZiAocGluZm8tPm5leHQgPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiUG9pbnRlciAleCBub3QgZm91bmRcbiIsICh1bnNpZ25lZCBpbnQpcHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgcHBpbmZvID0gJnBpbmZvLT5uZXh0OworICAgICAgfQorICAgfQorCisgICAvKiBGaW5hbGx5IGZyZWUgdGhlIGRhdGEuICovCisgICBpZiAodmVyYm9zZSkKKyAgICAgIHByaW50ZigiRnJlZWluZyAleFxuIiwgcHRyKTsKKyAgIHBuZ19mcmVlX2RlZmF1bHQocG5nX3B0ciwgcHRyKTsKKyAgIHB0ciA9IE5VTEw7Cit9CisjZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAmJiBQTkdfREVCVUcgKi8KKy8qIEVORCBvZiBjb2RlIHRvIHRlc3QgbWVtb3J5IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uICovCisKKworLyogRGVtb25zdHJhdGlvbiBvZiB1c2VyIGNodW5rIHN1cHBvcnQgb2YgdGhlIHNURVIgYW5kIHZwQWcgY2h1bmtzICovCisjaWZkZWYgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorCisvKiAoc1RFUiBpcyBhIHB1YmxpYyBjaHVuayBub3QgeWV0IGtub3duIGJ5IGxpYnBuZy4gIHZwQWcgaXMgYSBwcml2YXRlCitjaHVuayB1c2VkIGluIEltYWdlTWFnaWNrIHRvIHN0b3JlICJ2aXJ0dWFsIHBhZ2UiIHNpemUpLiAgKi8KKworc3RhdGljIHBuZ191aW50XzMyIHVzZXJfY2h1bmtfZGF0YVs0XTsKKworICAgIC8qIDA6IHNURVIgbW9kZSArIDEKKyAgICAgKiAxOiB2cEFnIHdpZHRoCisgICAgICogMjogdnBBZyBoZWlnaHQKKyAgICAgKiAzOiB2cEFnIHVuaXRzCisgICAgICovCisKK3N0YXRpYyBpbnQgcmVhZF91c2VyX2NodW5rX2NhbGxiYWNrKHBuZ19zdHJ1Y3QgKnBuZ19wdHIsCisgICBwbmdfdW5rbm93bl9jaHVua3AgY2h1bmspCit7CisgICBwbmdfdWludF8zMgorICAgICAqbXlfdXNlcl9jaHVua19kYXRhOworCisgICAvKiBSZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgKiAgICByZXR1cm4gKC1uKTsgIGNodW5rIGhhZCBhbiBlcnJvcgorICAgICogICAgcmV0dXJuICgwKTsgIGRpZCBub3QgcmVjb2duaXplCisgICAgKiAgICByZXR1cm4gKG4pOyAgc3VjY2VzcworICAgICoKKyAgICAqIFRoZSB1bmtub3duIGNodW5rIHN0cnVjdHVyZSBjb250YWlucyB0aGUgY2h1bmsgZGF0YToKKyAgICAqIHBuZ19ieXRlIG5hbWVbNV07CisgICAgKiBwbmdfYnl0ZSAqZGF0YTsKKyAgICAqIHBuZ19zaXplX3Qgc2l6ZTsKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgbGlicG5nIGhhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgdGhlIENSQyBoYW5kbGluZy4KKyAgICAqLworCisgICBpZiAoY2h1bmstPm5hbWVbMF0gPT0gMTE1ICYmIGNodW5rLT5uYW1lWzFdID09ICA4NCAmJiAgICAgLyogcyAgVCAqLworICAgICAgIGNodW5rLT5uYW1lWzJdID09ICA2OSAmJiBjaHVuay0+bmFtZVszXSA9PSAgODIpICAgICAgIC8qIEUgIFIgKi8KKyAgICAgIHsKKyAgICAgICAgIC8qIEZvdW5kIHNURVIgY2h1bmsgKi8KKyAgICAgICAgIGlmIChjaHVuay0+c2l6ZSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuICgtMSk7IC8qIEVycm9yIHJldHVybiAqLworICAgICAgICAgaWYgKGNodW5rLT5kYXRhWzBdICE9IDAgJiYgY2h1bmstPmRhdGFbMF0gIT0gMSkKKyAgICAgICAgICAgIHJldHVybiAoLTEpOyAgLyogSW52YWxpZCBtb2RlICovCisgICAgICAgICBteV91c2VyX2NodW5rX2RhdGE9KHBuZ191aW50XzMyICopIHBuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX3B0cik7CisgICAgICAgICBteV91c2VyX2NodW5rX2RhdGFbMF09Y2h1bmstPmRhdGFbMF0rMTsKKyAgICAgICAgIHJldHVybiAoMSk7CisgICAgICB9CisKKyAgIGlmIChjaHVuay0+bmFtZVswXSAhPSAxMTggfHwgY2h1bmstPm5hbWVbMV0gIT0gMTEyIHx8ICAgIC8qIHYgIHAgKi8KKyAgICAgICBjaHVuay0+bmFtZVsyXSAhPSAgNjUgfHwgY2h1bmstPm5hbWVbM10gIT0gMTAzKSAgICAgIC8qIEEgIGcgKi8KKyAgICAgIHJldHVybiAoMCk7IC8qIERpZCBub3QgcmVjb2duaXplICovCisKKyAgIC8qIEZvdW5kIEltYWdlTWFnaWNrIHZwQWcgY2h1bmsgKi8KKworICAgaWYgKGNodW5rLT5zaXplICE9IDkpCisgICAgICByZXR1cm4gKC0xKTsgLyogRXJyb3IgcmV0dXJuICovCisKKyAgIG15X3VzZXJfY2h1bmtfZGF0YT0ocG5nX3VpbnRfMzIgKikgcG5nX2dldF91c2VyX2NodW5rX3B0cihwbmdfcHRyKTsKKworICAgbXlfdXNlcl9jaHVua19kYXRhWzFdPXBuZ19nZXRfdWludF8zMShwbmdfcHRyLCBjaHVuay0+ZGF0YSk7CisgICBteV91c2VyX2NodW5rX2RhdGFbMl09cG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGNodW5rLT5kYXRhICsgNCk7CisgICBteV91c2VyX2NodW5rX2RhdGFbM109KHBuZ191aW50XzMyKWNodW5rLT5kYXRhWzhdOworCisgICByZXR1cm4gKDEpOworCit9CisjZW5kaWYKKy8qIEVORCBvZiBjb2RlIHRvIGRlbW9uc3RyYXRlIHVzZXIgY2h1bmsgc3VwcG9ydCAqLworCisvKiBUZXN0IG9uZSBmaWxlICovCitpbnQKK3Rlc3Rfb25lX2ZpbGUoUE5HX0NPTlNUIGNoYXIgKmlubmFtZSwgUE5HX0NPTlNUIGNoYXIgKm91dG5hbWUpCit7CisgICBzdGF0aWMgcG5nX0ZJTEVfcCBmcGluOworICAgc3RhdGljIHBuZ19GSUxFX3AgZnBvdXQ7ICAvKiAic3RhdGljIiBwcmV2ZW50cyBzZXRqbXAgY29ycnVwdGlvbiAqLworICAgcG5nX3N0cnVjdHAgcmVhZF9wdHI7CisgICBwbmdfaW5mb3AgcmVhZF9pbmZvX3B0ciwgZW5kX2luZm9fcHRyOworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgIHBuZ19zdHJ1Y3RwIHdyaXRlX3B0cjsKKyAgIHBuZ19pbmZvcCB3cml0ZV9pbmZvX3B0cjsKKyAgIHBuZ19pbmZvcCB3cml0ZV9lbmRfaW5mb19wdHI7CisjZWxzZQorICAgcG5nX3N0cnVjdHAgd3JpdGVfcHRyID0gTlVMTDsKKyAgIHBuZ19pbmZvcCB3cml0ZV9pbmZvX3B0ciA9IE5VTEw7CisgICBwbmdfaW5mb3Agd3JpdGVfZW5kX2luZm9fcHRyID0gTlVMTDsKKyNlbmRpZgorICAgcG5nX2J5dGVwIHJvd19idWY7CisgICBwbmdfdWludF8zMiB5OworICAgcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodDsKKyAgIGludCBudW1fcGFzcywgcGFzczsKKyAgIGludCBiaXRfZGVwdGgsIGNvbG9yX3R5cGU7CisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKKyAgIGptcF9idWYgam1wYnVmOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgIFRDSEFSIHBhdGhbTUFYX1BBVEhdOworI2VuZGlmCisgICBjaGFyIGluYnVmWzI1Nl0sIG91dGJ1ZlsyNTZdOworCisgICByb3dfYnVmID0gTlVMTDsKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBpbm5hbWUsIC0xLCBwYXRoLCBNQVhfUEFUSCk7CisgICBpZiAoKGZwaW4gPSBDcmVhdGVGaWxlKHBhdGgsIEdFTkVSSUNfUkVBRCwgMCwgTlVMTCwgT1BFTl9FWElTVElORywgMCwKKyAgICAgICBOVUxMKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisjZWxzZQorICAgaWYgKChmcGluID0gZm9wZW4oaW5uYW1lLCAicmIiKSkgPT0gTlVMTCkKKyNlbmRpZgorICAgeworICAgICAgZnByaW50ZihTVERFUlIsICJDb3VsZCBub3QgZmluZCBpbnB1dCBmaWxlICVzXG4iLCBpbm5hbWUpOworICAgICAgcmV0dXJuICgxKTsKKyAgIH0KKworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBvdXRuYW1lLCAtMSwgcGF0aCwgTUFYX1BBVEgpOworICAgaWYgKChmcG91dCA9IENyZWF0ZUZpbGUocGF0aCwgR0VORVJJQ19XUklURSwgMCwgTlVMTCwgQ1JFQVRFX0FMV0FZUywKKyAgICAgICAwLCBOVUxMKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisjZWxzZQorICAgaWYgKChmcG91dCA9IGZvcGVuKG91dG5hbWUsICJ3YiIpKSA9PSBOVUxMKQorI2VuZGlmCisgICB7CisgICAgICBmcHJpbnRmKFNUREVSUiwgIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRuYW1lKTsKKyAgICAgIEZDTE9TRShmcGluKTsKKyAgICAgIHJldHVybiAoMSk7CisgICB9CisKKyAgIHBuZ19kZWJ1ZygwLCAiQWxsb2NhdGluZyByZWFkIGFuZCB3cml0ZSBzdHJ1Y3R1cmVzIik7CisjaWYgZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKSAmJiBQTkdfREVCVUcKKyAgIHJlYWRfcHRyID0KKyAgICAgIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMihQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBuZ192b2lkcF9OVUxMLAorICAgICAgcG5nX2Vycm9yX3B0cl9OVUxMLCBwbmdfZXJyb3JfcHRyX05VTEwsIHBuZ192b2lkcF9OVUxMLAorICAgICAgKHBuZ19tYWxsb2NfcHRyKXBuZ19kZWJ1Z19tYWxsb2MsIChwbmdfZnJlZV9wdHIpcG5nX2RlYnVnX2ZyZWUpOworI2Vsc2UKKyAgIHJlYWRfcHRyID0KKyAgICAgIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBwbmdfdm9pZHBfTlVMTCwKKyAgICAgIHBuZ19lcnJvcl9wdHJfTlVMTCwgcG5nX2Vycm9yX3B0cl9OVUxMKTsKKyNlbmRpZgorI2lmbmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisgICBwbmdfc2V0X2Vycm9yX2ZuKHJlYWRfcHRyLCAocG5nX3ZvaWRwKWlubmFtZSwgcG5ndGVzdF9lcnJvciwKKyAgICAgICBwbmd0ZXN0X3dhcm5pbmcpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICB1c2VyX2NodW5rX2RhdGFbMF0gPSAwOworICAgdXNlcl9jaHVua19kYXRhWzFdID0gMDsKKyAgIHVzZXJfY2h1bmtfZGF0YVsyXSA9IDA7CisgICB1c2VyX2NodW5rX2RhdGFbM10gPSAwOworICAgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4ocmVhZF9wdHIsIHVzZXJfY2h1bmtfZGF0YSwKKyAgICAgcmVhZF91c2VyX2NodW5rX2NhbGxiYWNrKTsKKworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCisgICB3cml0ZV9wdHIgPQorICAgICAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMihQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBuZ192b2lkcF9OVUxMLAorICAgICAgcG5nX2Vycm9yX3B0cl9OVUxMLCBwbmdfZXJyb3JfcHRyX05VTEwsIHBuZ192b2lkcF9OVUxMLAorICAgICAgKHBuZ19tYWxsb2NfcHRyKXBuZ19kZWJ1Z19tYWxsb2MsIChwbmdfZnJlZV9wdHIpcG5nX2RlYnVnX2ZyZWUpOworI2Vsc2UKKyAgIHdyaXRlX3B0ciA9CisgICAgICBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBuZ192b2lkcF9OVUxMLAorICAgICAgcG5nX2Vycm9yX3B0cl9OVUxMLCBwbmdfZXJyb3JfcHRyX05VTEwpOworI2VuZGlmCisjaWZuZGVmIFBOR19TVERJT19TVVBQT1JURUQKKyAgIHBuZ19zZXRfZXJyb3JfZm4od3JpdGVfcHRyLCAocG5nX3ZvaWRwKWlubmFtZSwgcG5ndGVzdF9lcnJvciwKKyAgICAgICBwbmd0ZXN0X3dhcm5pbmcpOworI2VuZGlmCisjZW5kaWYKKyAgIHBuZ19kZWJ1ZygwLCAiQWxsb2NhdGluZyByZWFkX2luZm8sIHdyaXRlX2luZm8gYW5kIGVuZF9pbmZvIHN0cnVjdHVyZXMiKTsKKyAgIHJlYWRfaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHJlYWRfcHRyKTsKKyAgIGVuZF9pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocmVhZF9wdHIpOworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgIHdyaXRlX2luZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCh3cml0ZV9wdHIpOworICAgd3JpdGVfZW5kX2luZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCh3cml0ZV9wdHIpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgcG5nX2RlYnVnKDAsICJTZXR0aW5nIGptcGJ1ZiBmb3IgcmVhZCBzdHJ1Y3QiKTsKKyNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKKyAgIGlmIChzZXRqbXAoam1wYnVmKSkKKyNlbHNlCisgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocmVhZF9wdHIpKSkKKyNlbmRpZgorICAgeworICAgICAgZnByaW50ZihTVERFUlIsICIlcyAtPiAlczogbGlicG5nIHJlYWQgZXJyb3JcbiIsIGlubmFtZSwgb3V0bmFtZSk7CisgICAgICBwbmdfZnJlZShyZWFkX3B0ciwgcm93X2J1Zik7CisgICAgICByb3dfYnVmID0gTlVMTDsKKyAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZyZWFkX3B0ciwgJnJlYWRfaW5mb19wdHIsICZlbmRfaW5mb19wdHIpOworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgICAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHdyaXRlX3B0ciwgJndyaXRlX2VuZF9pbmZvX3B0cik7CisgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJndyaXRlX3B0ciwgJndyaXRlX2luZm9fcHRyKTsKKyNlbmRpZgorICAgICAgRkNMT1NFKGZwaW4pOworICAgICAgRkNMT1NFKGZwb3V0KTsKKyAgICAgIHJldHVybiAoMSk7CisgICB9CisjaWZkZWYgVVNFX0ZBUl9LRVlXT1JECisgICBwbmdfbWVtY3B5KHBuZ19qbXBidWYocmVhZF9wdHIpLCBqbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICBwbmdfZGVidWcoMCwgIlNldHRpbmcgam1wYnVmIGZvciB3cml0ZSBzdHJ1Y3QiKTsKKyNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKKyAgIGlmIChzZXRqbXAoam1wYnVmKSkKKyNlbHNlCisgICBpZiAoc2V0am1wKHBuZ19qbXBidWYod3JpdGVfcHRyKSkpCisjZW5kaWYKKyAgIHsKKyAgICAgIGZwcmludGYoU1RERVJSLCAiJXMgLT4gJXM6IGxpYnBuZyB3cml0ZSBlcnJvclxuIiwgaW5uYW1lLCBvdXRuYW1lKTsKKyAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZyZWFkX3B0ciwgJnJlYWRfaW5mb19wdHIsICZlbmRfaW5mb19wdHIpOworICAgICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3Qod3JpdGVfcHRyLCAmd3JpdGVfZW5kX2luZm9fcHRyKTsKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJndyaXRlX3B0ciwgJndyaXRlX2luZm9fcHRyKTsKKyNlbmRpZgorICAgICAgRkNMT1NFKGZwaW4pOworICAgICAgRkNMT1NFKGZwb3V0KTsKKyAgICAgIHJldHVybiAoMSk7CisgICB9CisjaWZkZWYgVVNFX0ZBUl9LRVlXT1JECisgICBwbmdfbWVtY3B5KHBuZ19qbXBidWYod3JpdGVfcHRyKSwgam1wYnVmLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworICAgcG5nX2RlYnVnKDAsICJJbml0aWFsaXppbmcgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIik7CisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorICAgcG5nX2luaXRfaW8ocmVhZF9wdHIsIGZwaW4pOworIyAgaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgcG5nX2luaXRfaW8od3JpdGVfcHRyLCBmcG91dCk7CisjICBlbmRpZgorI2Vsc2UKKyAgIHBuZ19zZXRfcmVhZF9mbihyZWFkX3B0ciwgKHBuZ192b2lkcClmcGluLCBwbmd0ZXN0X3JlYWRfZGF0YSk7CisjICBpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICBwbmdfc2V0X3dyaXRlX2ZuKHdyaXRlX3B0ciwgKHBuZ192b2lkcClmcG91dCwgIHBuZ3Rlc3Rfd3JpdGVfZGF0YSwKKyMgICAgaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorICAgICAgcG5ndGVzdF9mbHVzaCk7CisjICAgIGVsc2UKKyAgICAgIE5VTEwpOworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorICAgaWYgKHN0YXR1c19kb3RzX3JlcXVlc3RlZCA9PSAxKQorICAgeworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgICAgIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuKHdyaXRlX3B0ciwgd3JpdGVfcm93X2NhbGxiYWNrKTsKKyNlbmRpZgorICAgICAgcG5nX3NldF9yZWFkX3N0YXR1c19mbihyZWFkX3B0ciwgcmVhZF9yb3dfY2FsbGJhY2spOworICAgfQorICAgZWxzZQorICAgeworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgICAgIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuKHdyaXRlX3B0ciwgcG5nX3dyaXRlX3N0YXR1c19wdHJfTlVMTCk7CisjZW5kaWYKKyAgICAgIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4ocmVhZF9wdHIsIHBuZ19yZWFkX3N0YXR1c19wdHJfTlVMTCk7CisgICB9CisKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyAgIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaTwyNTY7IGkrKykKKyAgICAgICAgIGZpbHRlcnNfdXNlZFtpXSA9IDA7CisgICAgICBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4ocmVhZF9wdHIsIGNvdW50X2ZpbHRlcnMpOworICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgemVyb19zYW1wbGVzID0gMDsKKyAgIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4od3JpdGVfcHRyLCBjb3VudF96ZXJvX3NhbXBsZXMpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyMgIGlmbmRlZiBQTkdfSEFORExFX0NIVU5LX0FMV0FZUworIyAgICBkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgICAgICAgMworIyAgZW5kaWYKKyAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMsCisgICAgICBwbmdfYnl0ZXBfTlVMTCwgMCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisjICBpZm5kZWYgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFCisjICAgIGRlZmluZSBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUgICAgICAyCisjICBlbmRpZgorICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHdyaXRlX3B0ciwgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFLAorICAgICAgcG5nX2J5dGVwX05VTEwsIDApOworI2VuZGlmCisKKyAgIHBuZ19kZWJ1ZygwLCAiUmVhZGluZyBpbmZvIHN0cnVjdCIpOworICAgcG5nX3JlYWRfaW5mbyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0cik7CisKKyAgIHBuZ19kZWJ1ZygwLCAiVHJhbnNmZXJyaW5nIGluZm8gc3RydWN0Iik7CisgICB7CisgICAgICBpbnQgaW50ZXJsYWNlX3R5cGUsIGNvbXByZXNzaW9uX3R5cGUsIGZpbHRlcl90eXBlOworCisgICAgICBpZiAocG5nX2dldF9JSERSKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsCisgICAgICAgICAgJmNvbG9yX3R5cGUsICZpbnRlcmxhY2VfdHlwZSwgJmNvbXByZXNzaW9uX3R5cGUsICZmaWx0ZXJfdHlwZSkpCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X0lIRFIod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwgYml0X2RlcHRoLAorI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgICAgICAgICAgIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7CisjZWxzZQorICAgICAgICAgICAgY29sb3JfdHlwZSwgUE5HX0lOVEVSTEFDRV9OT05FLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7CisjZW5kaWYKKyAgICAgIH0KKyAgIH0KKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisjaWZkZWYgUE5HX2NIUk1fU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsCisgICAgICAgICBibHVlX3k7CisgICAgICBpZiAocG5nX2dldF9jSFJNX2ZpeGVkKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmd2hpdGVfeCwgJndoaXRlX3ksCisgICAgICAgICAmcmVkX3gsICZyZWRfeSwgJmdyZWVuX3gsICZncmVlbl95LCAmYmx1ZV94LCAmYmx1ZV95KSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19zZXRfY0hSTV9maXhlZCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwKKyAgICAgICAgICAgIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7CisgICAgICB9CisgICB9CisjZW5kaWYKKyNpZmRlZiBQTkdfZ0FNQV9TVVBQT1JURUQKKyAgIHsKKyAgICAgIHBuZ19maXhlZF9wb2ludCBnYW1tYTsKKworICAgICAgaWYgKHBuZ19nZXRfZ0FNQV9maXhlZChyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJmdhbW1hKSkKKyAgICAgICAgIHBuZ19zZXRfZ0FNQV9maXhlZCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBnYW1tYSk7CisgICB9CisjZW5kaWYKKyNlbHNlIC8qIFVzZSBmbG9hdGluZyBwb2ludCB2ZXJzaW9ucyAqLworI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKKyAgIHsKKyAgICAgIGRvdWJsZSB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3ksIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwKKyAgICAgICAgIGJsdWVfeTsKKyAgICAgIGlmIChwbmdfZ2V0X2NIUk0ocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZ3aGl0ZV94LCAmd2hpdGVfeSwgJnJlZF94LAorICAgICAgICAgJnJlZF95LCAmZ3JlZW5feCwgJmdyZWVuX3ksICZibHVlX3gsICZibHVlX3kpKQorICAgICAgeworICAgICAgICAgcG5nX3NldF9jSFJNKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LAorICAgICAgICAgICAgcmVkX3ksIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwgYmx1ZV95KTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19nQU1BX1NVUFBPUlRFRAorICAgeworICAgICAgZG91YmxlIGdhbW1hOworCisgICAgICBpZiAocG5nX2dldF9nQU1BKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmZ2FtbWEpKQorICAgICAgICAgcG5nX3NldF9nQU1BKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGdhbW1hKTsKKyAgIH0KKyNlbmRpZgorI2VuZGlmIC8qIEZsb2F0aW5nIHBvaW50ICovCisjZW5kaWYgLyogRml4ZWQgcG9pbnQgKi8KKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQKKyAgIHsKKyAgICAgIHBuZ19jaGFycCBuYW1lOworICAgICAgcG5nX2NoYXJwIHByb2ZpbGU7CisgICAgICBwbmdfdWludF8zMiBwcm9mbGVuOworICAgICAgaW50IGNvbXByZXNzaW9uX3R5cGU7CisKKyAgICAgIGlmIChwbmdfZ2V0X2lDQ1AocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZuYW1lLCAmY29tcHJlc3Npb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAmcHJvZmlsZSwgJnByb2ZsZW4pKQorICAgICAgeworICAgICAgICAgcG5nX3NldF9pQ0NQKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIG5hbWUsIGNvbXByZXNzaW9uX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSwgcHJvZmxlbik7CisgICAgICB9CisgICB9CisjZW5kaWYKKyNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKKyAgIHsKKyAgICAgIGludCBpbnRlbnQ7CisKKyAgICAgIGlmIChwbmdfZ2V0X3NSR0IocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZpbnRlbnQpKQorICAgICAgICAgcG5nX3NldF9zUkdCKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGludGVudCk7CisgICB9CisjZW5kaWYKKyAgIHsKKyAgICAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsKKyAgICAgIGludCBudW1fcGFsZXR0ZTsKKworICAgICAgaWYgKHBuZ19nZXRfUExURShyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnBhbGV0dGUsICZudW1fcGFsZXR0ZSkpCisgICAgICAgICBwbmdfc2V0X1BMVEUod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgcGFsZXR0ZSwgbnVtX3BhbGV0dGUpOworICAgfQorI2lmZGVmIFBOR19iS0dEX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kOworCisgICAgICBpZiAocG5nX2dldF9iS0dEKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmYmFja2dyb3VuZCkpCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X2JLR0Qod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgYmFja2dyb3VuZCk7CisgICAgICB9CisgICB9CisjZW5kaWYKKyNpZmRlZiBQTkdfaElTVF9TVVBQT1JURUQKKyAgIHsKKyAgICAgIHBuZ191aW50XzE2cCBoaXN0OworCisgICAgICBpZiAocG5nX2dldF9oSVNUKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmaGlzdCkpCisgICAgICAgICBwbmdfc2V0X2hJU1Qod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgaGlzdCk7CisgICB9CisjZW5kaWYKKyNpZmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKKyAgIHsKKyAgICAgIHBuZ19pbnRfMzIgb2Zmc2V0X3gsIG9mZnNldF95OworICAgICAgaW50IHVuaXRfdHlwZTsKKworICAgICAgaWYgKHBuZ19nZXRfb0ZGcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJm9mZnNldF94LCAmb2Zmc2V0X3ksCisgICAgICAgICAgJnVuaXRfdHlwZSkpCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X29GRnMod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgb2Zmc2V0X3gsIG9mZnNldF95LCB1bml0X3R5cGUpOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX3BDQUxfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfY2hhcnAgcHVycG9zZSwgdW5pdHM7CisgICAgICBwbmdfY2hhcnBwIHBhcmFtczsKKyAgICAgIHBuZ19pbnRfMzIgWDAsIFgxOworICAgICAgaW50IHR5cGUsIG5wYXJhbXM7CisKKyAgICAgIGlmIChwbmdfZ2V0X3BDQUwocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZwdXJwb3NlLCAmWDAsICZYMSwgJnR5cGUsCisgICAgICAgICAmbnBhcmFtcywgJnVuaXRzLCAmcGFyYW1zKSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19zZXRfcENBTCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBwdXJwb3NlLCBYMCwgWDEsIHR5cGUsCisgICAgICAgICAgICBucGFyYW1zLCB1bml0cywgcGFyYW1zKTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19wSFlzX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX3VpbnRfMzIgcmVzX3gsIHJlc195OworICAgICAgaW50IHVuaXRfdHlwZTsKKworICAgICAgaWYgKHBuZ19nZXRfcEhZcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnJlc194LCAmcmVzX3ksICZ1bml0X3R5cGUpKQorICAgICAgICAgcG5nX3NldF9wSFlzKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHJlc194LCByZXNfeSwgdW5pdF90eXBlKTsKKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19zQklUX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX2NvbG9yXzhwIHNpZ19iaXQ7CisKKyAgICAgIGlmIChwbmdfZ2V0X3NCSVQocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZzaWdfYml0KSkKKyAgICAgICAgIHBuZ19zZXRfc0JJVCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBzaWdfYml0KTsKKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19zQ0FMX1NVUFBPUlRFRAorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKKyAgIHsKKyAgICAgIGludCB1bml0OworICAgICAgZG91YmxlIHNjYWxfd2lkdGgsIHNjYWxfaGVpZ2h0OworCisgICAgICBpZiAocG5nX2dldF9zQ0FMKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmdW5pdCwgJnNjYWxfd2lkdGgsCisgICAgICAgICAmc2NhbF9oZWlnaHQpKQorICAgICAgeworICAgICAgICAgcG5nX3NldF9zQ0FMKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHVuaXQsIHNjYWxfd2lkdGgsIHNjYWxfaGVpZ2h0KTsKKyAgICAgIH0KKyAgIH0KKyNlbHNlCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorICAgeworICAgICAgaW50IHVuaXQ7CisgICAgICBwbmdfY2hhcnAgc2NhbF93aWR0aCwgc2NhbF9oZWlnaHQ7CisKKyAgICAgIGlmIChwbmdfZ2V0X3NDQUxfcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnVuaXQsICZzY2FsX3dpZHRoLAorICAgICAgICAgICZzY2FsX2hlaWdodCkpCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X3NDQUxfcyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB1bml0LCBzY2FsX3dpZHRoLAorICAgICAgICAgICAgIHNjYWxfaGVpZ2h0KTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKKyAgIHsKKyAgICAgIHBuZ190ZXh0cCB0ZXh0X3B0cjsKKyAgICAgIGludCBudW1fdGV4dDsKKworICAgICAgaWYgKHBuZ19nZXRfdGV4dChyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnRleHRfcHRyLCAmbnVtX3RleHQpID4gMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19kZWJ1ZzEoMCwgIkhhbmRsaW5nICVkIGlUWHQvdEVYdC96VFh0IGNodW5rcyIsIG51bV90ZXh0KTsKKyAgICAgICAgIHBuZ19zZXRfdGV4dCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB0ZXh0X3B0ciwgbnVtX3RleHQpOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX3RJTUVfU1VQUE9SVEVECisgICB7CisgICAgICBwbmdfdGltZXAgbW9kX3RpbWU7CisKKyAgICAgIGlmIChwbmdfZ2V0X3RJTUUocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZtb2RfdGltZSkpCisgICAgICB7CisgICAgICAgICBwbmdfc2V0X3RJTUUod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgbW9kX3RpbWUpOworI2lmZGVmIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECisgICAgICAgICAvKiBXZSBoYXZlIHRvIHVzZSBwbmdfbWVtY3B5IGluc3RlYWQgb2YgIj0iIGJlY2F1c2UgdGhlIHN0cmluZworICAgICAgICAgICogcG9pbnRlZCB0byBieSBwbmdfY29udmVydF90b19yZmMxMTIzKCkgZ2V0cyBmcmVlJ2VkIGJlZm9yZQorICAgICAgICAgICogd2UgdXNlIGl0LgorICAgICAgICAgICovCisgICAgICAgICBwbmdfbWVtY3B5KHRJTUVfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICBwbmdfY29udmVydF90b19yZmMxMTIzKHJlYWRfcHRyLCBtb2RfdGltZSksCisgICAgICAgICAgICAgICAgICAgIHBuZ19zaXplb2YodElNRV9zdHJpbmcpKTsKKyAgICAgICAgIHRJTUVfc3RyaW5nW3BuZ19zaXplb2YodElNRV9zdHJpbmcpIC0gMV0gPSAnXDAnOworICAgICAgICAgdElNRV9jaHVua19wcmVzZW50Kys7CisjZW5kaWYgLyogUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQgKi8KKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR190Uk5TX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX2J5dGVwIHRyYW5zOworICAgICAgaW50IG51bV90cmFuczsKKyAgICAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfdmFsdWVzOworCisgICAgICBpZiAocG5nX2dldF90Uk5TKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmdHJhbnMsICZudW1fdHJhbnMsCisgICAgICAgICAmdHJhbnNfdmFsdWVzKSkKKyAgICAgIHsKKyAgICAgICAgIGludCBzYW1wbGVfbWF4ID0gKDEgPDwgYml0X2RlcHRoKTsKKyAgICAgICAgIC8qIGxpYnBuZyBkb2Vzbid0IHJlamVjdCBhIHRSTlMgY2h1bmsgd2l0aCBvdXQtb2YtcmFuZ2Ugc2FtcGxlcyAqLworICAgICAgICAgaWYgKCEoKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJgorICAgICAgICAgICAgIChpbnQpdHJhbnNfdmFsdWVzLT5ncmF5ID4gc2FtcGxlX21heCkgfHwKKyAgICAgICAgICAgICAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgJiYKKyAgICAgICAgICAgICAoKGludCl0cmFuc192YWx1ZXMtPnJlZCA+IHNhbXBsZV9tYXggfHwKKyAgICAgICAgICAgICAoaW50KXRyYW5zX3ZhbHVlcy0+Z3JlZW4gPiBzYW1wbGVfbWF4IHx8CisgICAgICAgICAgICAgKGludCl0cmFuc192YWx1ZXMtPmJsdWUgPiBzYW1wbGVfbWF4KSkpKQorICAgICAgICAgICAgcG5nX3NldF90Uk5TKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHRyYW5zLCBudW1fdHJhbnMsCisgICAgICAgICAgICAgICB0cmFuc192YWx1ZXMpOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX3Vua25vd25fY2h1bmtwIHVua25vd25zOworICAgICAgaW50IG51bV91bmtub3ducyA9IChpbnQpcG5nX2dldF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwKKyAgICAgICAgICZ1bmtub3ducyk7CisgICAgICBpZiAobnVtX3Vua25vd25zKQorICAgICAgeworICAgICAgICAgcG5nX3NpemVfdCBpOworICAgICAgICAgcG5nX3NldF91bmtub3duX2NodW5rcyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB1bmtub3ducywKKyAgICAgICAgICAgbnVtX3Vua25vd25zKTsKKyAgICAgICAgIC8qIENvcHkgdGhlIGxvY2F0aW9ucyBmcm9tIHRoZSByZWFkX2luZm9fcHRyLiAgVGhlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAqIGdlbmVyYXRlZCBsb2NhdGlvbnMgaW4gd3JpdGVfaW5mb19wdHIgYXJlIHdyb25nIGJlY2F1c2Ugd2UKKyAgICAgICAgICAqIGhhdmVuJ3Qgd3JpdHRlbiBhbnl0aGluZyB5ZXQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocG5nX3NpemVfdCludW1fdW5rbm93bnM7IGkrKykKKyAgICAgICAgICAgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGksCisgICAgICAgICAgICAgdW5rbm93bnNbaV0ubG9jYXRpb24pOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECisgICBwbmdfZGVidWcoMCwgIldyaXRpbmcgaW5mbyBzdHJ1Y3QiKTsKKworLyogSWYgd2Ugd2FudGVkLCB3ZSBjb3VsZCB3cml0ZSBpbmZvIGluIHR3byBzdGVwczoKKyAqIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIpOworICovCisgICBwbmdfd3JpdGVfaW5mbyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyKTsKKworI2lmZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIGlmICh1c2VyX2NodW5rX2RhdGFbMF0gIT0gMCkKKyAgIHsKKyAgICAgIHBuZ19ieXRlIHBuZ19zVEVSWzVdID0gezExNSwgIDg0LCAgNjksICA4MiwgJ1wwJ307CisKKyAgICAgIHVuc2lnbmVkIGNoYXIKKyAgICAgICAgc3Rlcl9jaHVua19kYXRhWzFdOworCisgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gc3RlcmVvIG1vZGUgPSAlbHVcbiIsCisgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSh1c2VyX2NodW5rX2RhdGFbMF0gLSAxKSk7CisgICAgICBzdGVyX2NodW5rX2RhdGFbMF09KHVuc2lnbmVkIGNoYXIpKHVzZXJfY2h1bmtfZGF0YVswXSAtIDEpOworICAgICAgcG5nX3dyaXRlX2NodW5rKHdyaXRlX3B0ciwgcG5nX3NURVIsIHN0ZXJfY2h1bmtfZGF0YSwgMSk7CisgICB9CisgICBpZiAodXNlcl9jaHVua19kYXRhWzFdICE9IDAgfHwgdXNlcl9jaHVua19kYXRhWzJdICE9IDApCisgICB7CisgICAgICBwbmdfYnl0ZSBwbmdfdnBBZ1s1XSA9IHsxMTgsIDExMiwgIDY1LCAxMDMsICdcMCd9OworCisgICAgICB1bnNpZ25lZCBjaGFyCisgICAgICAgIHZwYWdfY2h1bmtfZGF0YVs5XTsKKworICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiB2cEFnID0gJWx1IHggJWx1LCB1bml0cyA9ICVsdVxuIiwKKyAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdXNlcl9jaHVua19kYXRhWzFdLAorICAgICAgICAgICAodW5zaWduZWQgbG9uZyl1c2VyX2NodW5rX2RhdGFbMl0sCisgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXVzZXJfY2h1bmtfZGF0YVszXSk7CisgICAgICBwbmdfc2F2ZV91aW50XzMyKHZwYWdfY2h1bmtfZGF0YSwgdXNlcl9jaHVua19kYXRhWzFdKTsKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIodnBhZ19jaHVua19kYXRhICsgNCwgdXNlcl9jaHVua19kYXRhWzJdKTsKKyAgICAgIHZwYWdfY2h1bmtfZGF0YVs4XSA9ICh1bnNpZ25lZCBjaGFyKSh1c2VyX2NodW5rX2RhdGFbM10gJiAweGZmKTsKKyAgICAgIHBuZ193cml0ZV9jaHVuayh3cml0ZV9wdHIsIHBuZ192cEFnLCB2cGFnX2NodW5rX2RhdGEsIDkpOworICAgfQorCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU0lOR0xFX1JPV0JVRl9BTExPQworICAgcG5nX2RlYnVnKDAsICJBbGxvY2F0aW5nIHJvdyBidWZmZXIuLi4iKTsKKyAgIHJvd19idWYgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocmVhZF9wdHIsCisgICAgICBwbmdfZ2V0X3Jvd2J5dGVzKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyKSk7CisgICBwbmdfZGVidWcxKDAsICIweCUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpcm93X2J1Zik7CisjZW5kaWYgLyogU0lOR0xFX1JPV0JVRl9BTExPQyAqLworICAgcG5nX2RlYnVnKDAsICJXcml0aW5nIHJvdyBkYXRhIik7CisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkgfHwgXAorICBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCisgICBudW1fcGFzcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHJlYWRfcHRyKTsKKyMgIGlmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHdyaXRlX3B0cik7CisjICBlbmRpZgorI2Vsc2UKKyAgIG51bV9wYXNzID0gMTsKKyNlbmRpZgorCisjaWZkZWYgUE5HVEVTVF9USU1JTkcKKyAgIHRfc3RvcCA9IChmbG9hdCljbG9jaygpOworICAgdF9taXNjICs9ICh0X3N0b3AgLSB0X3N0YXJ0KTsKKyAgIHRfc3RhcnQgPSB0X3N0b3A7CisjZW5kaWYKKyAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBudW1fcGFzczsgcGFzcysrKQorICAgeworICAgICAgcG5nX2RlYnVnMSgwLCAiV3JpdGluZyByb3cgZGF0YSBmb3IgcGFzcyAlZCIsIHBhc3MpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgICAgeworI2lmbmRlZiBTSU5HTEVfUk9XQlVGX0FMTE9DCisgICAgICAgICBwbmdfZGVidWcyKDAsICJBbGxvY2F0aW5nIHJvdyBidWZmZXIgKHBhc3MgJWQsIHkgPSAlbGQpLi4uIiwgcGFzcywgeSk7CisgICAgICAgICByb3dfYnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHJlYWRfcHRyLAorICAgICAgICAgICAgcG5nX2dldF9yb3dieXRlcyhyZWFkX3B0ciwgcmVhZF9pbmZvX3B0cikpOworICAgICAgICAgcG5nX2RlYnVnMigwLCAiMHglMDhseCAoJWxkIGJ5dGVzKSIsICh1bnNpZ25lZCBsb25nKXJvd19idWYsCisgICAgICAgICAgICBwbmdfZ2V0X3Jvd2J5dGVzKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyKSk7CisjZW5kaWYgLyogIVNJTkdMRV9ST1dCVUZfQUxMT0MgKi8KKyAgICAgICAgIHBuZ19yZWFkX3Jvd3MocmVhZF9wdHIsIChwbmdfYnl0ZXBwKSZyb3dfYnVmLCBwbmdfYnl0ZXBwX05VTEwsIDEpOworCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorI2lmZGVmIFBOR1RFU1RfVElNSU5HCisgICAgICAgICB0X3N0b3AgPSAoZmxvYXQpY2xvY2soKTsKKyAgICAgICAgIHRfZGVjb2RlICs9ICh0X3N0b3AgLSB0X3N0YXJ0KTsKKyAgICAgICAgIHRfc3RhcnQgPSB0X3N0b3A7CisjZW5kaWYKKyAgICAgICAgIHBuZ193cml0ZV9yb3dzKHdyaXRlX3B0ciwgKHBuZ19ieXRlcHApJnJvd19idWYsIDEpOworI2lmZGVmIFBOR1RFU1RfVElNSU5HCisgICAgICAgICB0X3N0b3AgPSAoZmxvYXQpY2xvY2soKTsKKyAgICAgICAgIHRfZW5jb2RlICs9ICh0X3N0b3AgLSB0X3N0YXJ0KTsKKyAgICAgICAgIHRfc3RhcnQgPSB0X3N0b3A7CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfV1JJVEVfU1VQUE9SVEVEICovCisKKyNpZm5kZWYgU0lOR0xFX1JPV0JVRl9BTExPQworICAgICAgICAgcG5nX2RlYnVnMigwLCAiRnJlZWluZyByb3cgYnVmZmVyIChwYXNzICVkLCB5ID0gJWxkKSIsIHBhc3MsIHkpOworICAgICAgICAgcG5nX2ZyZWUocmVhZF9wdHIsIHJvd19idWYpOworICAgICAgICAgcm93X2J1ZiA9IE5VTEw7CisjZW5kaWYgLyogIVNJTkdMRV9ST1dCVUZfQUxMT0MgKi8KKyAgICAgIH0KKyAgIH0KKworI2lmZGVmIFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgcG5nX2ZyZWVfZGF0YShyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgUE5HX0ZSRUVfVU5LTiwgLTEpOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgcG5nX2ZyZWVfZGF0YSh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBQTkdfRlJFRV9VTktOLCAtMSk7CisjZW5kaWYKKworICAgcG5nX2RlYnVnKDAsICJSZWFkaW5nIGFuZCB3cml0aW5nIGVuZF9pbmZvIGRhdGEiKTsKKworICAgcG5nX3JlYWRfZW5kKHJlYWRfcHRyLCBlbmRfaW5mb19wdHIpOworI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX3RleHRwIHRleHRfcHRyOworICAgICAgaW50IG51bV90ZXh0OworCisgICAgICBpZiAocG5nX2dldF90ZXh0KHJlYWRfcHRyLCBlbmRfaW5mb19wdHIsICZ0ZXh0X3B0ciwgJm51bV90ZXh0KSA+IDApCisgICAgICB7CisgICAgICAgICBwbmdfZGVidWcxKDAsICJIYW5kbGluZyAlZCBpVFh0L3RFWHQvelRYdCBjaHVua3MiLCBudW1fdGV4dCk7CisgICAgICAgICBwbmdfc2V0X3RleHQod3JpdGVfcHRyLCB3cml0ZV9lbmRfaW5mb19wdHIsIHRleHRfcHRyLCBudW1fdGV4dCk7CisgICAgICB9CisgICB9CisjZW5kaWYKKyNpZmRlZiBQTkdfdElNRV9TVVBQT1JURUQKKyAgIHsKKyAgICAgIHBuZ190aW1lcCBtb2RfdGltZTsKKworICAgICAgaWYgKHBuZ19nZXRfdElNRShyZWFkX3B0ciwgZW5kX2luZm9fcHRyLCAmbW9kX3RpbWUpKQorICAgICAgeworICAgICAgICAgcG5nX3NldF90SU1FKHdyaXRlX3B0ciwgd3JpdGVfZW5kX2luZm9fcHRyLCBtb2RfdGltZSk7CisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyAgICAgICAgIC8qIFdlIGhhdmUgdG8gdXNlIHBuZ19tZW1jcHkgaW5zdGVhZCBvZiAiPSIgYmVjYXVzZSB0aGUgc3RyaW5nCisgICAgICAgICAgICBwb2ludGVkIHRvIGJ5IHBuZ19jb252ZXJ0X3RvX3JmYzExMjMoKSBnZXRzIGZyZWUnZWQgYmVmb3JlCisgICAgICAgICAgICB3ZSB1c2UgaXQgKi8KKyAgICAgICAgIHBuZ19tZW1jcHkodElNRV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMocmVhZF9wdHIsIG1vZF90aW1lKSwKKyAgICAgICAgICAgICAgICAgICAgcG5nX3NpemVvZih0SU1FX3N0cmluZykpOworICAgICAgICAgdElNRV9zdHJpbmdbcG5nX3NpemVvZih0SU1FX3N0cmluZykgLSAxXSA9ICdcMCc7CisgICAgICAgICB0SU1FX2NodW5rX3ByZXNlbnQrKzsKKyNlbmRpZiAvKiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCAqLworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAorICAgeworICAgICAgcG5nX3Vua25vd25fY2h1bmtwIHVua25vd25zOworICAgICAgaW50IG51bV91bmtub3duczsKKyAgICAgIG51bV91bmtub3ducyA9IChpbnQpcG5nX2dldF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgZW5kX2luZm9fcHRyLAorICAgICAgICAgJnVua25vd25zKTsKKyAgICAgIGlmIChudW1fdW5rbm93bnMpCisgICAgICB7CisgICAgICAgICBwbmdfc2l6ZV90IGk7CisgICAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHdyaXRlX3B0ciwgd3JpdGVfZW5kX2luZm9fcHRyLCB1bmtub3ducywKKyAgICAgICAgICAgbnVtX3Vua25vd25zKTsKKyAgICAgICAgIC8qIENvcHkgdGhlIGxvY2F0aW9ucyBmcm9tIHRoZSByZWFkX2luZm9fcHRyLiAgVGhlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAqIGdlbmVyYXRlZCBsb2NhdGlvbnMgaW4gd3JpdGVfZW5kX2luZm9fcHRyIGFyZSB3cm9uZyBiZWNhdXNlIHdlCisgICAgICAgICAgKiBoYXZlbid0IHdyaXR0ZW4gdGhlIGVuZF9pbmZvIHlldC4KKyAgICAgICAgICAqLworICAgICAgICAgZm9yIChpID0gMDsgaSA8IChwbmdfc2l6ZV90KW51bV91bmtub3duczsgaSsrKQorICAgICAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24od3JpdGVfcHRyLCB3cml0ZV9lbmRfaW5mb19wdHIsIGksCisgICAgICAgICAgICAgdW5rbm93bnNbaV0ubG9jYXRpb24pOworICAgICAgfQorICAgfQorI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorICAgcG5nX3dyaXRlX2VuZCh3cml0ZV9wdHIsIHdyaXRlX2VuZF9pbmZvX3B0cik7CisjZW5kaWYKKworI2lmZGVmIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQKKyAgIGlmICh2ZXJib3NlKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgaXdpZHRoLCBpaGVpZ2h0OworICAgICAgaXdpZHRoID0gcG5nX2dldF9pbWFnZV93aWR0aCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyKTsKKyAgICAgIGloZWlnaHQgPSBwbmdfZ2V0X2ltYWdlX2hlaWdodCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyKTsKKyAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gSW1hZ2Ugd2lkdGggPSAlbHUsIGhlaWdodCA9ICVsdVxuIiwKKyAgICAgICAgICh1bnNpZ25lZCBsb25nKWl3aWR0aCwgKHVuc2lnbmVkIGxvbmcpaWhlaWdodCk7CisgICB9CisjZW5kaWYKKworICAgcG5nX2RlYnVnKDAsICJEZXN0cm95aW5nIGRhdGEgc3RydWN0cyIpOworI2lmZGVmIFNJTkdMRV9ST1dCVUZfQUxMT0MKKyAgIHBuZ19kZWJ1ZygxLCAiZGVzdHJveWluZyByb3dfYnVmIGZvciByZWFkX3B0ciIpOworICAgcG5nX2ZyZWUocmVhZF9wdHIsIHJvd19idWYpOworICAgcm93X2J1ZiA9IE5VTEw7CisjZW5kaWYgLyogU0lOR0xFX1JPV0JVRl9BTExPQyAqLworICAgcG5nX2RlYnVnKDEsICJkZXN0cm95aW5nIHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCBlbmRfaW5mb19wdHIiKTsKKyAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZyZWFkX3B0ciwgJnJlYWRfaW5mb19wdHIsICZlbmRfaW5mb19wdHIpOworI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKyAgIHBuZ19kZWJ1ZygxLCAiZGVzdHJveWluZyB3cml0ZV9lbmRfaW5mb19wdHIiKTsKKyAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHdyaXRlX3B0ciwgJndyaXRlX2VuZF9pbmZvX3B0cik7CisgICBwbmdfZGVidWcoMSwgImRlc3Ryb3lpbmcgd3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciIpOworICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZ3cml0ZV9wdHIsICZ3cml0ZV9pbmZvX3B0cik7CisjZW5kaWYKKyAgIHBuZ19kZWJ1ZygwLCAiRGVzdHJ1Y3Rpb24gY29tcGxldGUuIik7CisKKyAgIEZDTE9TRShmcGluKTsKKyAgIEZDTE9TRShmcG91dCk7CisKKyAgIHBuZ19kZWJ1ZygwLCAiT3BlbmluZyBmaWxlcyBmb3IgY29tcGFyaXNvbiIpOworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBpbm5hbWUsIC0xLCBwYXRoLCBNQVhfUEFUSCk7CisgICBpZiAoKGZwaW4gPSBDcmVhdGVGaWxlKHBhdGgsIEdFTkVSSUNfUkVBRCwgMCwgTlVMTCwgT1BFTl9FWElTVElORywKKyAgICAgICAwLCBOVUxMKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisjZWxzZQorICAgaWYgKChmcGluID0gZm9wZW4oaW5uYW1lLCAicmIiKSkgPT0gTlVMTCkKKyNlbmRpZgorICAgeworICAgICAgZnByaW50ZihTVERFUlIsICJDb3VsZCBub3QgZmluZCBmaWxlICVzXG4iLCBpbm5hbWUpOworICAgICAgcmV0dXJuICgxKTsKKyAgIH0KKworI2lmZGVmIF9XSU4zMl9XQ0UKKyAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBvdXRuYW1lLCAtMSwgcGF0aCwgTUFYX1BBVEgpOworICAgaWYgKChmcG91dCA9IENyZWF0ZUZpbGUocGF0aCwgR0VORVJJQ19SRUFELCAwLCBOVUxMLCBPUEVOX0VYSVNUSU5HLAorICAgICAgIDAsIE5VTEwpKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyNlbHNlCisgICBpZiAoKGZwb3V0ID0gZm9wZW4ob3V0bmFtZSwgInJiIikpID09IE5VTEwpCisjZW5kaWYKKyAgIHsKKyAgICAgIGZwcmludGYoU1RERVJSLCAiQ291bGQgbm90IGZpbmQgZmlsZSAlc1xuIiwgb3V0bmFtZSk7CisgICAgICBGQ0xPU0UoZnBpbik7CisgICAgICByZXR1cm4gKDEpOworICAgfQorCisgICBmb3IgKDs7KQorICAgeworICAgICAgcG5nX3NpemVfdCBudW1faW4sIG51bV9vdXQ7CisKKyAgICAgICAgIFJFQURGSUxFKGZwaW4sIGluYnVmLCAxLCBudW1faW4pOworICAgICAgICAgUkVBREZJTEUoZnBvdXQsIG91dGJ1ZiwgMSwgbnVtX291dCk7CisKKyAgICAgIGlmIChudW1faW4gIT0gbnVtX291dCkKKyAgICAgIHsKKyAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG5GaWxlcyAlcyBhbmQgJXMgYXJlIG9mIGEgZGlmZmVyZW50IHNpemVcbiIsCisgICAgICAgICAgICAgICAgIGlubmFtZSwgb3V0bmFtZSk7CisgICAgICAgICBpZiAod3JvdGVfcXVlc3Rpb24gPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICAgIiAgIFdhcyAlcyB3cml0dGVuIHdpdGggdGhlIHNhbWUgbWF4aW11bSBJREFUIGNodW5rIHNpemUgKCVkIGJ5dGVzKSwiLAorICAgICAgICAgICAgICBpbm5hbWUsIFBOR19aQlVGX1NJWkUpOworICAgICAgICAgICAgZnByaW50ZihTVERFUlIsCisgICAgICAgICAgICAgICJcbiAgIGZpbHRlcmluZyBoZXVyaXN0aWMgKGxpYnBuZyBkZWZhdWx0KSwgY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICAgICAgICAiIGxldmVsICh6bGliIGRlZmF1bHQpLFxuICAgYW5kIHpsaWIgdmVyc2lvbiAoJXMpP1xuXG4iLAorICAgICAgICAgICAgICBaTElCX1ZFUlNJT04pOworICAgICAgICAgICAgd3JvdGVfcXVlc3Rpb24gPSAxOworICAgICAgICAgfQorICAgICAgICAgRkNMT1NFKGZwaW4pOworICAgICAgICAgRkNMT1NFKGZwb3V0KTsKKyAgICAgICAgIHJldHVybiAoMCk7CisgICAgICB9CisKKyAgICAgIGlmICghbnVtX2luKQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChwbmdfbWVtY21wKGluYnVmLCBvdXRidWYsIG51bV9pbikpCisgICAgICB7CisgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuRmlsZXMgJXMgYW5kICVzIGFyZSBkaWZmZXJlbnRcbiIsIGlubmFtZSwgb3V0bmFtZSk7CisgICAgICAgICBpZiAod3JvdGVfcXVlc3Rpb24gPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICAgIiAgIFdhcyAlcyB3cml0dGVuIHdpdGggdGhlIHNhbWUgbWF4aW11bSBJREFUIGNodW5rIHNpemUgKCVkIGJ5dGVzKSwiLAorICAgICAgICAgICAgICAgICBpbm5hbWUsIFBOR19aQlVGX1NJWkUpOworICAgICAgICAgICAgZnByaW50ZihTVERFUlIsCisgICAgICAgICAgICAgICJcbiAgIGZpbHRlcmluZyBoZXVyaXN0aWMgKGxpYnBuZyBkZWZhdWx0KSwgY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICAgICAgICAiIGxldmVsICh6bGliIGRlZmF1bHQpLFxuICAgYW5kIHpsaWIgdmVyc2lvbiAoJXMpP1xuXG4iLAorICAgICAgICAgICAgICBaTElCX1ZFUlNJT04pOworICAgICAgICAgICAgd3JvdGVfcXVlc3Rpb24gPSAxOworICAgICAgICAgfQorICAgICAgICAgRkNMT1NFKGZwaW4pOworICAgICAgICAgRkNMT1NFKGZwb3V0KTsKKyAgICAgICAgIHJldHVybiAoMCk7CisgICAgICB9CisgICB9CisKKyAgIEZDTE9TRShmcGluKTsKKyAgIEZDTE9TRShmcG91dCk7CisKKyAgIHJldHVybiAoMCk7Cit9CisKKy8qIElucHV0IGFuZCBvdXRwdXQgZmlsZW5hbWVzICovCisjaWZkZWYgUklTQ09TCitzdGF0aWMgUE5HX0NPTlNUIGNoYXIgKmlubmFtZSA9ICJwbmd0ZXN0L3BuZyI7CitzdGF0aWMgUE5HX0NPTlNUIGNoYXIgKm91dG5hbWUgPSAicG5nb3V0L3BuZyI7CisjZWxzZQorc3RhdGljIFBOR19DT05TVCBjaGFyICppbm5hbWUgPSAicG5ndGVzdC5wbmciOworc3RhdGljIFBOR19DT05TVCBjaGFyICpvdXRuYW1lID0gInBuZ291dC5wbmciOworI2VuZGlmCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgaW50IG11bHRpcGxlID0gMDsKKyAgIGludCBpZXJyb3IgPSAwOworCisgICBmcHJpbnRmKFNUREVSUiwgIlxuIFRlc3RpbmcgbGlicG5nIHZlcnNpb24gJXNcbiIsIFBOR19MSUJQTkdfVkVSX1NUUklORyk7CisgICBmcHJpbnRmKFNUREVSUiwgIiAgIHdpdGggemxpYiAgIHZlcnNpb24gJXNcbiIsIFpMSUJfVkVSU0lPTik7CisgICBmcHJpbnRmKFNUREVSUiwgIiVzIiwgcG5nX2dldF9jb3B5cmlnaHQoTlVMTCkpOworICAgLyogU2hvdyB0aGUgdmVyc2lvbiBvZiBsaWJwbmcgdXNlZCBpbiBidWlsZGluZyB0aGUgbGlicmFyeSAqLworICAgZnByaW50ZihTVERFUlIsICIgbGlicmFyeSAoJWx1KTolcyIsCisgICAgICAodW5zaWduZWQgbG9uZylwbmdfYWNjZXNzX3ZlcnNpb25fbnVtYmVyKCksCisgICAgICBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKE5VTEwpKTsKKyAgIC8qIFNob3cgdGhlIHZlcnNpb24gb2YgbGlicG5nIHVzZWQgaW4gYnVpbGRpbmcgdGhlIGFwcGxpY2F0aW9uICovCisgICBmcHJpbnRmKFNUREVSUiwgIiBwbmd0ZXN0ICglbHUpOiVzIiwgKHVuc2lnbmVkIGxvbmcpUE5HX0xJQlBOR19WRVIsCisgICAgICBQTkdfSEVBREVSX1ZFUlNJT05fU1RSSU5HKTsKKyAgIGZwcmludGYoU1RERVJSLCAiIHNpemVvZihwbmdfc3RydWN0KT0lbGQsIHNpemVvZihwbmdfaW5mbyk9JWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAobG9uZylwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpLCAobG9uZylwbmdfc2l6ZW9mKHBuZ19pbmZvKSk7CisKKyAgIC8qIERvIHNvbWUgY29uc2lzdGVuY3kgY2hlY2tpbmcgb24gdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHNldHRpbmdzLCBJJ20KKyAgICAqIG5vdCBzdXJlIHRoaXMgbWF0dGVycywgYnV0IGl0IGlzIG5pY2UgdG8ga25vdywgdGhlIGZpcnN0IG9mIHRoZXNlCisgICAgKiB0ZXN0cyBzaG91bGQgYmUgaW1wb3NzaWJsZSBiZWNhdXNlIG9mIHRoZSB3YXkgdGhlIG1hY3JvcyBhcmUgc2V0CisgICAgKiBpbiBwbmdjb25mLmgKKyAgICAqLworI2lmIGRlZmluZWQoTUFYU0VHXzY0SykgJiYgIWRlZmluZWQoUE5HX01BWF9NQUxMT0NfNjRLKQorICAgICAgZnByaW50ZihTVERFUlIsICIgTk9URTogWmxpYiBjb21waWxlZCBmb3IgbWF4IDY0aywgbGlicG5nIG5vdFxuIik7CisjZW5kaWYKKyAgIC8qIEkgdGhpbmsgdGhlIGZvbGxvd2luZyBjYW4gaGFwcGVuLiAqLworI2lmICFkZWZpbmVkKE1BWFNFR182NEspICYmIGRlZmluZWQoUE5HX01BWF9NQUxMT0NfNjRLKQorICAgICAgZnByaW50ZihTVERFUlIsICIgTk9URTogbGlicG5nIGNvbXBpbGVkIGZvciBtYXggNjRrLCB6bGliIG5vdFxuIik7CisjZW5kaWYKKworICAgaWYgKHN0cmNtcChwbmdfbGlicG5nX3ZlciwgUE5HX0xJQlBOR19WRVJfU1RSSU5HKSkKKyAgIHsKKyAgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICAgIldhcm5pbmc6IHZlcnNpb25zIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiBwbmcuaCBhbmQgcG5nLmNcbiIpOworICAgICAgZnByaW50ZihTVERFUlIsICIgIHBuZy5oIHZlcnNpb246ICVzXG4iLCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcpOworICAgICAgZnByaW50ZihTVERFUlIsICIgIHBuZy5jIHZlcnNpb246ICVzXG5cbiIsIHBuZ19saWJwbmdfdmVyKTsKKyAgICAgICsraWVycm9yOworICAgfQorCisgICBpZiAoYXJnYyA+IDEpCisgICB7CisgICAgICBpZiAoc3RyY21wKGFyZ3ZbMV0sICItbSIpID09IDApCisgICAgICB7CisgICAgICAgICBtdWx0aXBsZSA9IDE7CisgICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICItbXYiKSA9PSAwIHx8CisgICAgICAgICAgICAgICBzdHJjbXAoYXJndlsxXSwgIi12bSIpID09IDAgKQorICAgICAgeworICAgICAgICAgbXVsdGlwbGUgPSAxOworICAgICAgICAgdmVyYm9zZSA9IDE7CisgICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAxOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICItdiIpID09IDApCisgICAgICB7CisgICAgICAgICB2ZXJib3NlID0gMTsKKyAgICAgICAgIHN0YXR1c19kb3RzX3JlcXVlc3RlZCA9IDE7CisgICAgICAgICBpbm5hbWUgPSBhcmd2WzJdOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaW5uYW1lID0gYXJndlsxXTsKKyAgICAgICAgIHN0YXR1c19kb3RzX3JlcXVlc3RlZCA9IDA7CisgICAgICB9CisgICB9CisKKyAgIGlmICghbXVsdGlwbGUgJiYgYXJnYyA9PSAzICsgdmVyYm9zZSkKKyAgICAgb3V0bmFtZSA9IGFyZ3ZbMiArIHZlcmJvc2VdOworCisgICBpZiAoKCFtdWx0aXBsZSAmJiBhcmdjID4gMyArIHZlcmJvc2UpIHx8IChtdWx0aXBsZSAmJiBhcmdjIDwgMikpCisgICB7CisgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICJ1c2FnZTogJXMgW2luZmlsZS5wbmddIFtvdXRmaWxlLnBuZ11cblx0JXMgLW0ge2luZmlsZS5wbmd9XG4iLAorICAgICAgICBhcmd2WzBdLCBhcmd2WzBdKTsKKyAgICAgZnByaW50ZihTVERFUlIsCisgICAgICAgIiAgcmVhZHMvd3JpdGVzIG9uZSBQTkcgZmlsZSAod2l0aG91dCAtbSkgb3IgbXVsdGlwbGUgZmlsZXMgKC1tKVxuIik7CisgICAgIGZwcmludGYoU1RERVJSLAorICAgICAgICIgIHdpdGggLW0gJXMgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBmaWxlXG4iLCBvdXRuYW1lKTsKKyAgICAgZXhpdCgxKTsKKyAgIH0KKworICAgaWYgKG11bHRpcGxlKQorICAgeworICAgICAgaW50IGk7CisjaWYgZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKSAmJiBQTkdfREVCVUcKKyAgICAgIGludCBhbGxvY2F0aW9uX25vdyA9IGN1cnJlbnRfYWxsb2NhdGlvbjsKKyNlbmRpZgorICAgICAgZm9yIChpPTI7IGk8YXJnYzsgKytpKQorICAgICAgeworICAgICAgICAgaW50IGtlcnJvcjsKKyAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gVGVzdGluZyAlczoiLCBhcmd2W2ldKTsKKyAgICAgICAgIGtlcnJvciA9IHRlc3Rfb25lX2ZpbGUoYXJndltpXSwgb3V0bmFtZSk7CisgICAgICAgICBpZiAoa2Vycm9yID09IDApCisgICAgICAgICB7CisjaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECisgICAgICAgICAgICBpbnQgazsKKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gUEFTUyAoJWx1IHplcm8gc2FtcGxlcylcbiIsCisgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl6ZXJvX3NhbXBsZXMpOworI2Vsc2UKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIFBBU1NcbiIpOworI2VuZGlmCisjaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrPDI1NjsgaysrKQorICAgICAgICAgICAgICAgaWYgKGZpbHRlcnNfdXNlZFtrXSkKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIEZpbHRlciAlZCB3YXMgdXNlZCAlbHUgdGltZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBrLCAodW5zaWduZWQgbG9uZylmaWx0ZXJzX3VzZWRba10pOworI2VuZGlmCisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyAgICAgICAgIGlmICh0SU1FX2NodW5rX3ByZXNlbnQgIT0gMCkKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIHRJTUUgPSAlc1xuIiwgdElNRV9zdHJpbmcpOworICAgICAgICAgdElNRV9jaHVua19wcmVzZW50ID0gMDsKKyNlbmRpZiAvKiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCAqLworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgRkFJTFxuIik7CisgICAgICAgICAgICBpZXJyb3IgKz0ga2Vycm9yOworICAgICAgICAgfQorI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCisgICAgICAgICBpZiAoYWxsb2NhdGlvbl9ub3cgIT0gY3VycmVudF9hbGxvY2F0aW9uKQorICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJNRU1PUlkgRVJST1I6ICVkIGJ5dGVzIGxvc3RcbiIsCisgICAgICAgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24gLSBhbGxvY2F0aW9uX25vdyk7CisgICAgICAgICBpZiAoY3VycmVudF9hbGxvY2F0aW9uICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICBtZW1vcnlfaW5mb3AgcGluZm8gPSBwaW5mb3JtYXRpb247CisKKyAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiTUVNT1JZIEVSUk9SOiAlZCBieXRlcyBzdGlsbCBhbGxvY2F0ZWRcbiIsCisgICAgICAgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24pOworICAgICAgICAgICAgd2hpbGUgKHBpbmZvICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiAlbHUgYnl0ZXMgYXQgJXhcbiIsCisgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXBpbmZvLT5zaXplLAorICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSBwaW5mby0+cG9pbnRlcik7CisgICAgICAgICAgICAgICBwaW5mbyA9IHBpbmZvLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgfQorI2VuZGlmCisgICAgICB9CisjaWYgZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKSAmJiBQTkdfREVCVUcKKyAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIEN1cnJlbnQgbWVtb3J5IGFsbG9jYXRpb246ICUxMGQgYnl0ZXNcbiIsCisgICAgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24pOworICAgICAgICAgZnByaW50ZihTVERFUlIsICIgTWF4aW11bSBtZW1vcnkgYWxsb2NhdGlvbjogJTEwZCBieXRlc1xuIiwKKyAgICAgICAgICAgIG1heGltdW1fYWxsb2NhdGlvbik7CisgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBUb3RhbCAgIG1lbW9yeSBhbGxvY2F0aW9uOiAlMTBkIGJ5dGVzXG4iLAorICAgICAgICAgICAgdG90YWxfYWxsb2NhdGlvbik7CisgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiAgICAgTnVtYmVyIG9mIGFsbG9jYXRpb25zOiAlMTBkXG4iLAorICAgICAgICAgICAgbnVtX2FsbG9jYXRpb25zKTsKKyNlbmRpZgorICAgfQorICAgZWxzZQorICAgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpPDM7ICsraSkKKyAgICAgIHsKKyAgICAgICAgIGludCBrZXJyb3I7CisjaWYgZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKSAmJiBQTkdfREVCVUcKKyAgICAgICAgIGludCBhbGxvY2F0aW9uX25vdyA9IGN1cnJlbnRfYWxsb2NhdGlvbjsKKyNlbmRpZgorICAgICAgICAgaWYgKGkgPT0gMSkgc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMTsKKyAgICAgICAgIGVsc2UgaWYgKHZlcmJvc2UgPT0gMClzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAwOworICAgICAgICAgaWYgKGkgPT0gMCB8fCB2ZXJib3NlID09IDEgfHwgaWVycm9yICE9IDApCisgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuIFRlc3RpbmcgJXM6IiwgaW5uYW1lKTsKKyAgICAgICAgIGtlcnJvciA9IHRlc3Rfb25lX2ZpbGUoaW5uYW1lLCBvdXRuYW1lKTsKKyAgICAgICAgIGlmIChrZXJyb3IgPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlID09IDEgfHwgaSA9PSAyKQorICAgICAgICAgICAgeworI2lmZGVmIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgIGludCBrOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiXG4gUEFTUyAoJWx1IHplcm8gc2FtcGxlcylcbiIsCisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpemVyb19zYW1wbGVzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgUEFTU1xuIik7CisjZW5kaWYKKyNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrPDI1NjsgaysrKQorICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJzX3VzZWRba10pCisgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgRmlsdGVyICVkIHdhcyB1c2VkICVsdSB0aW1lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrLCAodW5zaWduZWQgbG9uZylmaWx0ZXJzX3VzZWRba10pOworI2VuZGlmCisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKKyAgICAgICAgICAgICBpZiAodElNRV9jaHVua19wcmVzZW50ICE9IDApCisgICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgdElNRSA9ICVzXG4iLCB0SU1FX3N0cmluZyk7CisjZW5kaWYgLyogUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlID09IDAgJiYgaSAhPSAyKQorICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBUZXN0aW5nICVzOiIsIGlubmFtZSk7CisgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBGQUlMXG4iKTsKKyAgICAgICAgICAgIGllcnJvciArPSBrZXJyb3I7CisgICAgICAgICB9CisjaWYgZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKSAmJiBQTkdfREVCVUcKKyAgICAgICAgIGlmIChhbGxvY2F0aW9uX25vdyAhPSBjdXJyZW50X2FsbG9jYXRpb24pCisgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJNRU1PUlkgRVJST1I6ICVkIGJ5dGVzIGxvc3RcbiIsCisgICAgICAgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24gLSBhbGxvY2F0aW9uX25vdyk7CisgICAgICAgICBpZiAoY3VycmVudF9hbGxvY2F0aW9uICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgICAgbWVtb3J5X2luZm9wIHBpbmZvID0gcGluZm9ybWF0aW9uOworCisgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJNRU1PUlkgRVJST1I6ICVkIGJ5dGVzIHN0aWxsIGFsbG9jYXRlZFxuIiwKKyAgICAgICAgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24pOworICAgICAgICAgICAgIHdoaWxlIChwaW5mbyAhPSBOVUxMKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiAlbHUgYnl0ZXMgYXQgJXhcbiIsCisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcGluZm8tPnNpemUsICh1bnNpZ25lZCBpbnQpcGluZm8tPnBvaW50ZXIpOworICAgICAgICAgICAgICAgIHBpbmZvID0gcGluZm8tPm5leHQ7CisgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgIH0KKyNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRworICAgICAgIGZwcmludGYoU1RERVJSLCAiIEN1cnJlbnQgbWVtb3J5IGFsbG9jYXRpb246ICUxMGQgYnl0ZXNcbiIsCisgICAgICAgICAgY3VycmVudF9hbGxvY2F0aW9uKTsKKyAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBNYXhpbXVtIG1lbW9yeSBhbGxvY2F0aW9uOiAlMTBkIGJ5dGVzXG4iLAorICAgICAgICAgIG1heGltdW1fYWxsb2NhdGlvbik7CisgICAgICAgZnByaW50ZihTVERFUlIsICIgVG90YWwgICBtZW1vcnkgYWxsb2NhdGlvbjogJTEwZCBieXRlc1xuIiwKKyAgICAgICAgICB0b3RhbF9hbGxvY2F0aW9uKTsKKyAgICAgICBmcHJpbnRmKFNUREVSUiwgIiAgICAgTnVtYmVyIG9mIGFsbG9jYXRpb25zOiAlMTBkXG4iLAorICAgICAgICAgICAgbnVtX2FsbG9jYXRpb25zKTsKKyNlbmRpZgorICAgfQorCisjaWZkZWYgUE5HVEVTVF9USU1JTkcKKyAgIHRfc3RvcCA9IChmbG9hdCljbG9jaygpOworICAgdF9taXNjICs9ICh0X3N0b3AgLSB0X3N0YXJ0KTsKKyAgIHRfc3RhcnQgPSB0X3N0b3A7CisgICBmcHJpbnRmKFNUREVSUiwgIiBDUFUgdGltZSB1c2VkID0gJS4zZiBzZWNvbmRzIiwKKyAgICAgICh0X21pc2MrdF9kZWNvZGUrdF9lbmNvZGUpLyhmbG9hdClDTE9DS1NfUEVSX1NFQyk7CisgICBmcHJpbnRmKFNUREVSUiwgIiAoZGVjb2RpbmcgJS4zZixcbiIsCisgICAgICB0X2RlY29kZS8oZmxvYXQpQ0xPQ0tTX1BFUl9TRUMpOworICAgZnByaW50ZihTVERFUlIsICIgICAgICAgIGVuY29kaW5nICUuM2YgLCIsCisgICAgICB0X2VuY29kZS8oZmxvYXQpQ0xPQ0tTX1BFUl9TRUMpOworICAgZnByaW50ZihTVERFUlIsICIgb3RoZXIgJS4zZiBzZWNvbmRzKVxuXG4iLAorICAgICAgdF9taXNjLyhmbG9hdClDTE9DS1NfUEVSX1NFQyk7CisjZW5kaWYKKworICAgaWYgKGllcnJvciA9PSAwKQorICAgICAgZnByaW50ZihTVERFUlIsICIgbGlicG5nIHBhc3NlcyB0ZXN0XG4iKTsKKyAgIGVsc2UKKyAgICAgIGZwcmludGYoU1RERVJSLCAiIGxpYnBuZyBGQUlMUyB0ZXN0XG4iKTsKKyAgIHJldHVybiAoaW50KShpZXJyb3IgIT0gMCk7Cit9CisKKy8qIEdlbmVyYXRlIGEgY29tcGlsZXIgZXJyb3IgaWYgdGhlcmUgaXMgYW4gb2xkIHBuZy5oIGluIHRoZSBzZWFyY2ggcGF0aC4gKi8KK3R5cGVkZWYgdmVyc2lvbl8xXzJfNDQgeW91cl9wbmdfaF9pc19ub3RfdmVyc2lvbl8xXzJfNDQ7CmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL3BuZ3RyYW5zLmMgYi9jb20zMi9saWIvbGlicG5nL3BuZ3RyYW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkOWRjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvcG5ndHJhbnMuYwpAQCAtMCwwICsxLDY5OSBAQAorCisvKiBwbmd0cmFucy5jIC0gdHJhbnNmb3JtcyB0aGUgZGF0YSBpbiBhIHJvdyAodXNlZCBieSBib3RoIHJlYWRlcnMgYW5kIHdyaXRlcnMpCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuNDEgW0RlY2VtYmVyIDMsIDIwMDldCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKyNkZWZpbmUgUE5HX0lOVEVSTkFMCisjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUworI2luY2x1ZGUgInBuZy5oIgorI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpCisvKiBUdXJuIG9uIEJHUi10by1SR0IgbWFwcGluZyAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfYmdyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfYmdyIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0JHUjsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpCisvKiBUdXJuIG9uIDE2IGJpdCBieXRlIHN3YXBwaW5nICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9zd2FwKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfc3dhcCIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgaWYgKHBuZ19wdHItPmJpdF9kZXB0aCA9PSAxNikKKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfU1dBUF9CWVRFUzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpCisvKiBUdXJuIG9uIHBpeGVsIHBhY2tpbmcgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X3BhY2tpbmcocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9wYWNraW5nIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoIDwgOCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUEFDSzsKKyAgICAgIHBuZ19wdHItPnVzcl9iaXRfZGVwdGggPSA4OworICAgfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCl8fGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkKKy8qIFR1cm4gb24gcGFja2VkIHBpeGVsIHN3YXBwaW5nICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9wYWNrc3dhcChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3BhY2tzd2FwIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoIDwgOCkKKyAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUEFDS1NXQVA7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpCit2b2lkIFBOR0FQSQorcG5nX3NldF9zaGlmdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29sb3JfOHAgdHJ1ZV9iaXRzKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3NoaWZ0Iik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NISUZUOworICAgcG5nX3B0ci0+c2hpZnQgPSAqdHJ1ZV9iaXRzOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkKK2ludCBQTkdBUEkKK3BuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfaW50ZXJsYWNlIGhhbmRsaW5nIik7CisKKyAgIGlmIChwbmdfcHRyICYmIHBuZ19wdHItPmludGVybGFjZWQpCisgICB7CisgICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0lOVEVSTEFDRTsKKyAgICAgIHJldHVybiAoNyk7CisgICB9CisKKyAgIHJldHVybiAoMSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkKKy8qIEFkZCBhIGZpbGxlciBieXRlIG9uIHJlYWQsIG9yIHJlbW92ZSBhIGZpbGxlciBvciBhbHBoYSBieXRlIG9uIHdyaXRlLgorICogVGhlIGZpbGxlciB0eXBlIGhhcyBjaGFuZ2VkIGluIHYwLjk1IHRvIGFsbG93IGZ1dHVyZSAyLWJ5dGUgZmlsbGVycworICogZm9yIDQ4LWJpdCBpbnB1dCBkYXRhLCBhcyB3ZWxsIGFzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggc29tZSBjb21waWxlcnMKKyAqIHRoYXQgZG9uJ3QgbGlrZSBieXRlcyBhcyBwYXJhbWV0ZXJzLgorICovCit2b2lkIFBOR0FQSQorcG5nX3NldF9maWxsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgZmlsbGVyLCBpbnQgZmlsbGVyX2xvYykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9maWxsZXIiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfRklMTEVSOworI2lmZGVmIFBOR19MRUdBQ1lfU1VQUE9SVEVECisgICBwbmdfcHRyLT5maWxsZXIgPSAocG5nX2J5dGUpZmlsbGVyOworI2Vsc2UKKyAgIHBuZ19wdHItPmZpbGxlciA9IChwbmdfdWludF8xNilmaWxsZXI7CisjZW5kaWYKKyAgIGlmIChmaWxsZXJfbG9jID09IFBOR19GSUxMRVJfQUZURVIpCisgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19GSUxMRVJfQUZURVI7CisgICBlbHNlCisgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfRklMTEVSX0FGVEVSOworCisgICAvKiBUaGlzIHNob3VsZCBwcm9iYWJseSBnbyBpbiB0aGUgImRvX3JlYWRfZmlsbGVyIiByb3V0aW5lLgorICAgICogSSBhdHRlbXB0ZWQgdG8gZG8gdGhhdCBpbiBsaWJwbmctMS4wLjFhIGJ1dCB0aGF0IGNhdXNlZCBwcm9ibGVtcworICAgICogc28gSSByZXN0b3JlZCBpdCBpbiBsaWJwbmctMS4wLjJhCisgICAqLworCisgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICB7CisgICAgICBwbmdfcHRyLT51c3JfY2hhbm5lbHMgPSA0OworICAgfQorCisgICAvKiBBbHNvIEkgYWRkZWQgdGhpcyBpbiBsaWJwbmctMS4wLjJhICh3aGF0IGhhcHBlbnMgd2hlbiB3ZSBleHBhbmQKKyAgICAqIGEgbGVzcy10aGFuLTgtYml0IGdyYXlzY2FsZSB0byBHQT8gKi8KKworICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBwbmdfcHRyLT5iaXRfZGVwdGggPj0gOCkKKyAgIHsKKyAgICAgIHBuZ19wdHItPnVzcl9jaGFubmVscyA9IDI7CisgICB9Cit9CisKKyNpZm5kZWYgUE5HXzFfMF9YCisvKiBBZGRlZCB0byBsaWJwbmctMS4yLjcgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2FkZF9hbHBoYShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBmaWxsZXIsIGludCBmaWxsZXJfbG9jKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2FkZF9hbHBoYSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBmaWxsZXJfbG9jKTsKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfQUREX0FMUEhBOworfQorI2VuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfQUxQSEFfU1VQUE9SVEVEKQordm9pZCBQTkdBUEkKK3BuZ19zZXRfc3dhcF9hbHBoYShwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3N3YXBfYWxwaGEiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfU1dBUF9BTFBIQTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRCkKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ludmVydF9hbHBoYSIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19JTlZFUlRfQUxQSEE7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkKK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2ludmVydF9tb25vKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfaW52ZXJ0X21vbm8iKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfSU5WRVJUX01PTk87Cit9CisKKy8qIEludmVydCBtb25vY2hyb21lIGdyYXlzY2FsZSBkYXRhICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19pbnZlcnQocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2ludmVydCIpOworCisgIC8qIFRoaXMgdGVzdCByZW1vdmVkIGZyb20gbGlicG5nIHZlcnNpb24gMS4wLjEzIGFuZCAxLjIuMDoKKyAgICogICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxICYmCisgICAqLworI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgaWYgKHJvdyA9PSBOVUxMIHx8IHJvd19pbmZvID09IE5VTEwpCisgICAgIHJldHVybjsKKyNlbmRpZgorICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCisgICB7CisgICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7CisgICAgICBwbmdfdWludF8zMiBpOworICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSByb3dfaW5mby0+cm93Ynl0ZXM7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgeworICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSh+KCpycCkpOworICAgICAgICAgcnArKzsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEgJiYKKyAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBycCA9IHJvdzsKKyAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICBwbmdfdWludF8zMiBpc3RvcCA9IHJvd19pbmZvLT5yb3dieXRlczsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKz0yKQorICAgICAgeworICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSh+KCpycCkpOworICAgICAgICAgcnArPTI7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBICYmCisgICAgICByb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQorICAgeworICAgICAgcG5nX2J5dGVwIHJwID0gcm93OworICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrPTQpCisgICAgICB7CisgICAgICAgICAqcnAgPSAocG5nX2J5dGUpKH4oKnJwKSk7CisgICAgICAgICAqKHJwKzEpID0gKHBuZ19ieXRlKSh+KCoocnArMSkpKTsKKyAgICAgICAgIHJwKz00OworICAgICAgfQorICAgfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkKKy8qIFN3YXBzIGJ5dGUgb3JkZXIgb24gMTYgYml0IGRlcHRoIGltYWdlcyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fc3dhcChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fc3dhcCIpOworCisgICBpZiAoCisjaWZkZWYgUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVECisgICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBycCA9IHJvdzsKKyAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICBwbmdfdWludF8zMiBpc3RvcD0gcm93X2luZm8tPndpZHRoICogcm93X2luZm8tPmNoYW5uZWxzOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKywgcnAgKz0gMikKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlIHQgPSAqcnA7CisgICAgICAgICAqcnAgPSAqKHJwICsgMSk7CisgICAgICAgICAqKHJwICsgMSkgPSB0OworICAgICAgfQorICAgfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCl8fGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkKK3N0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgb25lYnBwc3dhcHRhYmxlWzI1Nl0gPSB7CisgICAweDAwLCAweDgwLCAweDQwLCAweEMwLCAweDIwLCAweEEwLCAweDYwLCAweEUwLAorICAgMHgxMCwgMHg5MCwgMHg1MCwgMHhEMCwgMHgzMCwgMHhCMCwgMHg3MCwgMHhGMCwKKyAgIDB4MDgsIDB4ODgsIDB4NDgsIDB4QzgsIDB4MjgsIDB4QTgsIDB4NjgsIDB4RTgsCisgICAweDE4LCAweDk4LCAweDU4LCAweEQ4LCAweDM4LCAweEI4LCAweDc4LCAweEY4LAorICAgMHgwNCwgMHg4NCwgMHg0NCwgMHhDNCwgMHgyNCwgMHhBNCwgMHg2NCwgMHhFNCwKKyAgIDB4MTQsIDB4OTQsIDB4NTQsIDB4RDQsIDB4MzQsIDB4QjQsIDB4NzQsIDB4RjQsCisgICAweDBDLCAweDhDLCAweDRDLCAweENDLCAweDJDLCAweEFDLCAweDZDLCAweEVDLAorICAgMHgxQywgMHg5QywgMHg1QywgMHhEQywgMHgzQywgMHhCQywgMHg3QywgMHhGQywKKyAgIDB4MDIsIDB4ODIsIDB4NDIsIDB4QzIsIDB4MjIsIDB4QTIsIDB4NjIsIDB4RTIsCisgICAweDEyLCAweDkyLCAweDUyLCAweEQyLCAweDMyLCAweEIyLCAweDcyLCAweEYyLAorICAgMHgwQSwgMHg4QSwgMHg0QSwgMHhDQSwgMHgyQSwgMHhBQSwgMHg2QSwgMHhFQSwKKyAgIDB4MUEsIDB4OUEsIDB4NUEsIDB4REEsIDB4M0EsIDB4QkEsIDB4N0EsIDB4RkEsCisgICAweDA2LCAweDg2LCAweDQ2LCAweEM2LCAweDI2LCAweEE2LCAweDY2LCAweEU2LAorICAgMHgxNiwgMHg5NiwgMHg1NiwgMHhENiwgMHgzNiwgMHhCNiwgMHg3NiwgMHhGNiwKKyAgIDB4MEUsIDB4OEUsIDB4NEUsIDB4Q0UsIDB4MkUsIDB4QUUsIDB4NkUsIDB4RUUsCisgICAweDFFLCAweDlFLCAweDVFLCAweERFLCAweDNFLCAweEJFLCAweDdFLCAweEZFLAorICAgMHgwMSwgMHg4MSwgMHg0MSwgMHhDMSwgMHgyMSwgMHhBMSwgMHg2MSwgMHhFMSwKKyAgIDB4MTEsIDB4OTEsIDB4NTEsIDB4RDEsIDB4MzEsIDB4QjEsIDB4NzEsIDB4RjEsCisgICAweDA5LCAweDg5LCAweDQ5LCAweEM5LCAweDI5LCAweEE5LCAweDY5LCAweEU5LAorICAgMHgxOSwgMHg5OSwgMHg1OSwgMHhEOSwgMHgzOSwgMHhCOSwgMHg3OSwgMHhGOSwKKyAgIDB4MDUsIDB4ODUsIDB4NDUsIDB4QzUsIDB4MjUsIDB4QTUsIDB4NjUsIDB4RTUsCisgICAweDE1LCAweDk1LCAweDU1LCAweEQ1LCAweDM1LCAweEI1LCAweDc1LCAweEY1LAorICAgMHgwRCwgMHg4RCwgMHg0RCwgMHhDRCwgMHgyRCwgMHhBRCwgMHg2RCwgMHhFRCwKKyAgIDB4MUQsIDB4OUQsIDB4NUQsIDB4REQsIDB4M0QsIDB4QkQsIDB4N0QsIDB4RkQsCisgICAweDAzLCAweDgzLCAweDQzLCAweEMzLCAweDIzLCAweEEzLCAweDYzLCAweEUzLAorICAgMHgxMywgMHg5MywgMHg1MywgMHhEMywgMHgzMywgMHhCMywgMHg3MywgMHhGMywKKyAgIDB4MEIsIDB4OEIsIDB4NEIsIDB4Q0IsIDB4MkIsIDB4QUIsIDB4NkIsIDB4RUIsCisgICAweDFCLCAweDlCLCAweDVCLCAweERCLCAweDNCLCAweEJCLCAweDdCLCAweEZCLAorICAgMHgwNywgMHg4NywgMHg0NywgMHhDNywgMHgyNywgMHhBNywgMHg2NywgMHhFNywKKyAgIDB4MTcsIDB4OTcsIDB4NTcsIDB4RDcsIDB4MzcsIDB4QjcsIDB4NzcsIDB4RjcsCisgICAweDBGLCAweDhGLCAweDRGLCAweENGLCAweDJGLCAweEFGLCAweDZGLCAweEVGLAorICAgMHgxRiwgMHg5RiwgMHg1RiwgMHhERiwgMHgzRiwgMHhCRiwgMHg3RiwgMHhGRgorfTsKKworc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSB0d29icHBzd2FwdGFibGVbMjU2XSA9IHsKKyAgIDB4MDAsIDB4NDAsIDB4ODAsIDB4QzAsIDB4MTAsIDB4NTAsIDB4OTAsIDB4RDAsCisgICAweDIwLCAweDYwLCAweEEwLCAweEUwLCAweDMwLCAweDcwLCAweEIwLCAweEYwLAorICAgMHgwNCwgMHg0NCwgMHg4NCwgMHhDNCwgMHgxNCwgMHg1NCwgMHg5NCwgMHhENCwKKyAgIDB4MjQsIDB4NjQsIDB4QTQsIDB4RTQsIDB4MzQsIDB4NzQsIDB4QjQsIDB4RjQsCisgICAweDA4LCAweDQ4LCAweDg4LCAweEM4LCAweDE4LCAweDU4LCAweDk4LCAweEQ4LAorICAgMHgyOCwgMHg2OCwgMHhBOCwgMHhFOCwgMHgzOCwgMHg3OCwgMHhCOCwgMHhGOCwKKyAgIDB4MEMsIDB4NEMsIDB4OEMsIDB4Q0MsIDB4MUMsIDB4NUMsIDB4OUMsIDB4REMsCisgICAweDJDLCAweDZDLCAweEFDLCAweEVDLCAweDNDLCAweDdDLCAweEJDLCAweEZDLAorICAgMHgwMSwgMHg0MSwgMHg4MSwgMHhDMSwgMHgxMSwgMHg1MSwgMHg5MSwgMHhEMSwKKyAgIDB4MjEsIDB4NjEsIDB4QTEsIDB4RTEsIDB4MzEsIDB4NzEsIDB4QjEsIDB4RjEsCisgICAweDA1LCAweDQ1LCAweDg1LCAweEM1LCAweDE1LCAweDU1LCAweDk1LCAweEQ1LAorICAgMHgyNSwgMHg2NSwgMHhBNSwgMHhFNSwgMHgzNSwgMHg3NSwgMHhCNSwgMHhGNSwKKyAgIDB4MDksIDB4NDksIDB4ODksIDB4QzksIDB4MTksIDB4NTksIDB4OTksIDB4RDksCisgICAweDI5LCAweDY5LCAweEE5LCAweEU5LCAweDM5LCAweDc5LCAweEI5LCAweEY5LAorICAgMHgwRCwgMHg0RCwgMHg4RCwgMHhDRCwgMHgxRCwgMHg1RCwgMHg5RCwgMHhERCwKKyAgIDB4MkQsIDB4NkQsIDB4QUQsIDB4RUQsIDB4M0QsIDB4N0QsIDB4QkQsIDB4RkQsCisgICAweDAyLCAweDQyLCAweDgyLCAweEMyLCAweDEyLCAweDUyLCAweDkyLCAweEQyLAorICAgMHgyMiwgMHg2MiwgMHhBMiwgMHhFMiwgMHgzMiwgMHg3MiwgMHhCMiwgMHhGMiwKKyAgIDB4MDYsIDB4NDYsIDB4ODYsIDB4QzYsIDB4MTYsIDB4NTYsIDB4OTYsIDB4RDYsCisgICAweDI2LCAweDY2LCAweEE2LCAweEU2LCAweDM2LCAweDc2LCAweEI2LCAweEY2LAorICAgMHgwQSwgMHg0QSwgMHg4QSwgMHhDQSwgMHgxQSwgMHg1QSwgMHg5QSwgMHhEQSwKKyAgIDB4MkEsIDB4NkEsIDB4QUEsIDB4RUEsIDB4M0EsIDB4N0EsIDB4QkEsIDB4RkEsCisgICAweDBFLCAweDRFLCAweDhFLCAweENFLCAweDFFLCAweDVFLCAweDlFLCAweERFLAorICAgMHgyRSwgMHg2RSwgMHhBRSwgMHhFRSwgMHgzRSwgMHg3RSwgMHhCRSwgMHhGRSwKKyAgIDB4MDMsIDB4NDMsIDB4ODMsIDB4QzMsIDB4MTMsIDB4NTMsIDB4OTMsIDB4RDMsCisgICAweDIzLCAweDYzLCAweEEzLCAweEUzLCAweDMzLCAweDczLCAweEIzLCAweEYzLAorICAgMHgwNywgMHg0NywgMHg4NywgMHhDNywgMHgxNywgMHg1NywgMHg5NywgMHhENywKKyAgIDB4MjcsIDB4NjcsIDB4QTcsIDB4RTcsIDB4MzcsIDB4NzcsIDB4QjcsIDB4RjcsCisgICAweDBCLCAweDRCLCAweDhCLCAweENCLCAweDFCLCAweDVCLCAweDlCLCAweERCLAorICAgMHgyQiwgMHg2QiwgMHhBQiwgMHhFQiwgMHgzQiwgMHg3QiwgMHhCQiwgMHhGQiwKKyAgIDB4MEYsIDB4NEYsIDB4OEYsIDB4Q0YsIDB4MUYsIDB4NUYsIDB4OUYsIDB4REYsCisgICAweDJGLCAweDZGLCAweEFGLCAweEVGLCAweDNGLCAweDdGLCAweEJGLCAweEZGCit9OworCitzdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIGZvdXJicHBzd2FwdGFibGVbMjU2XSA9IHsKKyAgIDB4MDAsIDB4MTAsIDB4MjAsIDB4MzAsIDB4NDAsIDB4NTAsIDB4NjAsIDB4NzAsCisgICAweDgwLCAweDkwLCAweEEwLCAweEIwLCAweEMwLCAweEQwLCAweEUwLCAweEYwLAorICAgMHgwMSwgMHgxMSwgMHgyMSwgMHgzMSwgMHg0MSwgMHg1MSwgMHg2MSwgMHg3MSwKKyAgIDB4ODEsIDB4OTEsIDB4QTEsIDB4QjEsIDB4QzEsIDB4RDEsIDB4RTEsIDB4RjEsCisgICAweDAyLCAweDEyLCAweDIyLCAweDMyLCAweDQyLCAweDUyLCAweDYyLCAweDcyLAorICAgMHg4MiwgMHg5MiwgMHhBMiwgMHhCMiwgMHhDMiwgMHhEMiwgMHhFMiwgMHhGMiwKKyAgIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4NDMsIDB4NTMsIDB4NjMsIDB4NzMsCisgICAweDgzLCAweDkzLCAweEEzLCAweEIzLCAweEMzLCAweEQzLCAweEUzLCAweEYzLAorICAgMHgwNCwgMHgxNCwgMHgyNCwgMHgzNCwgMHg0NCwgMHg1NCwgMHg2NCwgMHg3NCwKKyAgIDB4ODQsIDB4OTQsIDB4QTQsIDB4QjQsIDB4QzQsIDB4RDQsIDB4RTQsIDB4RjQsCisgICAweDA1LCAweDE1LCAweDI1LCAweDM1LCAweDQ1LCAweDU1LCAweDY1LCAweDc1LAorICAgMHg4NSwgMHg5NSwgMHhBNSwgMHhCNSwgMHhDNSwgMHhENSwgMHhFNSwgMHhGNSwKKyAgIDB4MDYsIDB4MTYsIDB4MjYsIDB4MzYsIDB4NDYsIDB4NTYsIDB4NjYsIDB4NzYsCisgICAweDg2LCAweDk2LCAweEE2LCAweEI2LCAweEM2LCAweEQ2LCAweEU2LCAweEY2LAorICAgMHgwNywgMHgxNywgMHgyNywgMHgzNywgMHg0NywgMHg1NywgMHg2NywgMHg3NywKKyAgIDB4ODcsIDB4OTcsIDB4QTcsIDB4QjcsIDB4QzcsIDB4RDcsIDB4RTcsIDB4RjcsCisgICAweDA4LCAweDE4LCAweDI4LCAweDM4LCAweDQ4LCAweDU4LCAweDY4LCAweDc4LAorICAgMHg4OCwgMHg5OCwgMHhBOCwgMHhCOCwgMHhDOCwgMHhEOCwgMHhFOCwgMHhGOCwKKyAgIDB4MDksIDB4MTksIDB4MjksIDB4MzksIDB4NDksIDB4NTksIDB4NjksIDB4NzksCisgICAweDg5LCAweDk5LCAweEE5LCAweEI5LCAweEM5LCAweEQ5LCAweEU5LCAweEY5LAorICAgMHgwQSwgMHgxQSwgMHgyQSwgMHgzQSwgMHg0QSwgMHg1QSwgMHg2QSwgMHg3QSwKKyAgIDB4OEEsIDB4OUEsIDB4QUEsIDB4QkEsIDB4Q0EsIDB4REEsIDB4RUEsIDB4RkEsCisgICAweDBCLCAweDFCLCAweDJCLCAweDNCLCAweDRCLCAweDVCLCAweDZCLCAweDdCLAorICAgMHg4QiwgMHg5QiwgMHhBQiwgMHhCQiwgMHhDQiwgMHhEQiwgMHhFQiwgMHhGQiwKKyAgIDB4MEMsIDB4MUMsIDB4MkMsIDB4M0MsIDB4NEMsIDB4NUMsIDB4NkMsIDB4N0MsCisgICAweDhDLCAweDlDLCAweEFDLCAweEJDLCAweENDLCAweERDLCAweEVDLCAweEZDLAorICAgMHgwRCwgMHgxRCwgMHgyRCwgMHgzRCwgMHg0RCwgMHg1RCwgMHg2RCwgMHg3RCwKKyAgIDB4OEQsIDB4OUQsIDB4QUQsIDB4QkQsIDB4Q0QsIDB4REQsIDB4RUQsIDB4RkQsCisgICAweDBFLCAweDFFLCAweDJFLCAweDNFLCAweDRFLCAweDVFLCAweDZFLCAweDdFLAorICAgMHg4RSwgMHg5RSwgMHhBRSwgMHhCRSwgMHhDRSwgMHhERSwgMHhFRSwgMHhGRSwKKyAgIDB4MEYsIDB4MUYsIDB4MkYsIDB4M0YsIDB4NEYsIDB4NUYsIDB4NkYsIDB4N0YsCisgICAweDhGLCAweDlGLCAweEFGLCAweEJGLCAweENGLCAweERGLCAweEVGLCAweEZGCit9OworCisvKiBTd2FwcyBwaXhlbCBwYWNraW5nIG9yZGVyIHdpdGhpbiBieXRlcyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fcGFja3N3YXAocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3BhY2tzd2FwIik7CisKKyAgIGlmICgKKyNpZmRlZiBQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQKKyAgICAgICByb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMICYmCisjZW5kaWYKKyAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoIDwgOCkKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBycCwgZW5kLCB0YWJsZTsKKworICAgICAgZW5kID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOworCisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxKQorICAgICAgICAgdGFibGUgPSAocG5nX2J5dGVwKW9uZWJwcHN3YXB0YWJsZTsKKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMikKKyAgICAgICAgIHRhYmxlID0gKHBuZ19ieXRlcCl0d29icHBzd2FwdGFibGU7CisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDQpCisgICAgICAgICB0YWJsZSA9IChwbmdfYnl0ZXApZm91cmJwcHN3YXB0YWJsZTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybjsKKworICAgICAgZm9yIChycCA9IHJvdzsgcnAgPCBlbmQ7IHJwKyspCisgICAgICAgICAqcnAgPSB0YWJsZVsqcnBdOworICAgfQorfQorI2VuZGlmIC8qIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCBvciBQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEICovCisKKyNpZiBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQpCisvKiBSZW1vdmUgZmlsbGVyIG9yIGFscGhhIGJ5dGUocykgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX3N0cmlwX2ZpbGxlcihwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBmbGFncykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3N0cmlwX2ZpbGxlciIpOworCisjaWZkZWYgUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVECisgICBpZiAocm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCkKKyNlbmRpZgorICAgeworICAgICAgcG5nX2J5dGVwIHNwPXJvdzsKKyAgICAgIHBuZ19ieXRlcCBkcD1yb3c7CisgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOworICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgaWYgKChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKKyAgICAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBICYmCisgICAgICAgICAgKGZsYWdzICYgUE5HX0ZMQUdfU1RSSVBfQUxQSEEpKSkgJiYKKyAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPT0gNCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gUkdCWCBvciBSR0JBIHRvIFJHQiAqLworICAgICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZHArPTM7IHNwKz00OworICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7CisgICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBYUkdCIG9yIEFSR0IgdG8gUkdCICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCsrOworICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7CisgICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMjQ7CisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiAzOworICAgICAgICAgfQorICAgICAgICAgZWxzZSAvKiBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFBOR19GTEFHX0ZJTExFUl9BRlRFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBSUkdHQkJYWCBvciBSUkdHQkJBQSB0byBSUkdHQkIgKi8KKyAgICAgICAgICAgICAgIHNwICs9IDg7IGRwICs9IDY7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNvdWxkIGJlIChhbHRob3VnaCBwbmdfbWVtY3B5IGlzIHByb2JhYmx5IHNsb3dlcik6CisgICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCBzcCwgNik7CisgICAgICAgICAgICAgICAgICBzcCArPSA4OworICAgICAgICAgICAgICAgICAgZHAgKz0gNjsKKyAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7CisgICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOworICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7CisgICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOworICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgIHNwICs9IDI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gWFhSUkdHQkIgb3IgQUFSUkdHQkIgdG8gUlJHR0JCICovCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNvdWxkIGJlIChhbHRob3VnaCBwbmdfbWVtY3B5IGlzIHByb2JhYmx5IHNsb3dlcik6CisgICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCBzcCwgNik7CisgICAgICAgICAgICAgICAgICBzcCArPSA4OworICAgICAgICAgICAgICAgICAgZHAgKz0gNjsKKyAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgIHNwKz0yOworICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7CisgICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOworICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7CisgICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gNDg7CisgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA2OworICAgICAgICAgfQorICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8CisgICAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSAmJgorICAgICAgICAgKGZsYWdzICYgUE5HX0ZMQUdfU1RSSVBfQUxQSEEpKSkgJiYKKyAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPT0gMikKKyAgICAgIHsKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gR1ggb3IgR0EgdG8gRyAqLworICAgICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gWEcgb3IgQUcgdG8gRyAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSA4OworICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoOworICAgICAgICAgfQorICAgICAgICAgZWxzZSAvKiBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFBOR19GTEFHX0ZJTExFUl9BRlRFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBHR1hYIG9yIEdHQUEgdG8gR0cgKi8KKyAgICAgICAgICAgICAgIHNwICs9IDQ7IGRwICs9IDI7CisgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOworICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgIHNwICs9IDI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gWFhHRyBvciBBQUdHIHRvIEdHICovCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzcCArPSAyOworICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKKyAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAxNjsKKyAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDI7CisgICAgICAgICB9CisgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAxOworICAgICAgfQorICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfU1RSSVBfQUxQSEEpCisgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlICY9IH5QTkdfQ09MT1JfTUFTS19BTFBIQTsKKyAgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQorLyogU3dhcHMgcmVkIGFuZCBibHVlIGJ5dGVzIHdpdGhpbiBhIHBpeGVsICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19iZ3IocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX2JnciIpOworCisgICBpZiAoCisjaWZkZWYgUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVECisgICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQorICAgeworICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgcnA7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICpycDsKKyAgICAgICAgICAgICAgICpycCA9ICoocnAgKyAyKTsKKyAgICAgICAgICAgICAgICoocnAgKyAyKSA9IHNhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgcnA7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICpycDsKKyAgICAgICAgICAgICAgICpycCA9ICoocnAgKyAyKTsKKyAgICAgICAgICAgICAgICoocnAgKyAyKSA9IHNhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQorICAgICAgeworICAgICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBycDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IDYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlID0gKnJwOworICAgICAgICAgICAgICAgKnJwID0gKihycCArIDQpOworICAgICAgICAgICAgICAgKihycCArIDQpID0gc2F2ZTsKKyAgICAgICAgICAgICAgIHNhdmUgPSAqKHJwICsgMSk7CisgICAgICAgICAgICAgICAqKHJwICsgMSkgPSAqKHJwICsgNSk7CisgICAgICAgICAgICAgICAqKHJwICsgNSkgPSBzYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHJwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKywgcnAgKz0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqcnA7CisgICAgICAgICAgICAgICAqcnAgPSAqKHJwICsgNCk7CisgICAgICAgICAgICAgICAqKHJwICsgNCkgPSBzYXZlOworICAgICAgICAgICAgICAgc2F2ZSA9ICoocnAgKyAxKTsKKyAgICAgICAgICAgICAgICoocnAgKyAxKSA9ICoocnAgKyA1KTsKKyAgICAgICAgICAgICAgICoocnAgKyA1KSA9IHNhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisjZW5kaWYgLyogUE5HX1JFQURfQkdSX1NVUFBPUlRFRCBvciBQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCAqLworCisjaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKKyAgICBkZWZpbmVkKFBOR19MRUdBQ1lfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKQordm9pZCBQTkdBUEkKK3BuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAKKyAgIHVzZXJfdHJhbnNmb3JtX3B0ciwgaW50IHVzZXJfdHJhbnNmb3JtX2RlcHRoLCBpbnQgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworI2lmZGVmIFBOR19VU0VSX1RSQU5TRk9STV9QVFJfU1VQUE9SVEVECisgICBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9wdHIgPSB1c2VyX3RyYW5zZm9ybV9wdHI7CisgICBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9kZXB0aCA9IChwbmdfYnl0ZSl1c2VyX3RyYW5zZm9ybV9kZXB0aDsKKyAgIHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzID0gKHBuZ19ieXRlKXVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzOworI2Vsc2UKKyAgIGlmICh1c2VyX3RyYW5zZm9ybV9wdHIgfHwgdXNlcl90cmFuc2Zvcm1fZGVwdGggfHwgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMpCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAiVGhpcyB2ZXJzaW9uIG9mIGxpYnBuZyBkb2VzIG5vdCBzdXBwb3J0IHVzZXIgdHJhbnNmb3JtIGluZm8iKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHVzZXJfdHJhbnNmb3JtX3B0ciBhc3NvY2lhdGVkIHdpdGgKKyAqIHRoZSB1c2VyIHRyYW5zZm9ybSBmdW5jdGlvbnMuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGZyZWUgYW55IG1lbW9yeQorICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgcG9pbnRlciBiZWZvcmUgcG5nX3dyaXRlX2Rlc3Ryb3kgYW5kIHBuZ19yZWFkX2Rlc3Ryb3kKKyAqIGFyZSBjYWxsZWQuCisgKi8KK3BuZ192b2lkcCBQTkdBUEkKK3BuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIChOVUxMKTsKKyNpZmRlZiBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRAorICAgcmV0dXJuICgocG5nX3ZvaWRwKXBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX3B0cik7CisjZWxzZQorICAgcmV0dXJuIChOVUxMKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL3BuZ3ZjcmQuYyBiL2NvbTMyL2xpYi9saWJwbmcvcG5ndmNyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDIzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGlicG5nL3BuZ3ZjcmQuYwpAQCAtMCwwICsxIEBACisvKiBwbmdndnJkLmMgd2FzIHJlbW92ZWQgZnJvbSBsaWJwbmctMS4yLjIwLiAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9wbmd3aW8uYyBiL2NvbTMyL2xpYi9saWJwbmcvcG5nd2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlNWVhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvcG5nd2lvLmMKQEAgLTAsMCArMSwyNjAgQEAKKworLyogcG5nd2lvLmMgLSBmdW5jdGlvbnMgZm9yIGRhdGEgb3V0cHV0CisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuNDEgW0RlY2VtYmVyIDMsIDIwMDldCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIGxvY2F0aW9uIGZvciBhbGwgb3V0cHV0LiAgVXNlcnMgd2hvIG5lZWQKKyAqIHNwZWNpYWwgaGFuZGxpbmcgYXJlIGV4cGVjdGVkIHRvIHdyaXRlIGZ1bmN0aW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUKKyAqIGFyZ3VtZW50cyBhcyB0aGVzZSBhbmQgcGVyZm9ybSBzaW1pbGFyIGZ1bmN0aW9ucywgYnV0IHRoYXQgcG9zc2libHkKKyAqIHVzZSBkaWZmZXJlbnQgb3V0cHV0IG1ldGhvZHMuICBOb3RlIHRoYXQgeW91IHNob3VsZG4ndCBjaGFuZ2UgdGhlc2UKKyAqIGZ1bmN0aW9ucywgYnV0IHJhdGhlciB3cml0ZSByZXBsYWNlbWVudCBmdW5jdGlvbnMgYW5kIHRoZW4gY2hhbmdlCisgKiB0aGVtIGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF93cml0ZV9mbiguLi4pLgorICovCisKKyNkZWZpbmUgUE5HX0lOVEVSTkFMCisjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUworI2luY2x1ZGUgInBuZy5oIgorI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKworLyogV3JpdGUgdGhlIGRhdGEgdG8gd2hhdGV2ZXIgb3V0cHV0IHlvdSBhcmUgdXNpbmcuICBUaGUgZGVmYXVsdCByb3V0aW5lCisgKiB3cml0ZXMgdG8gYSBmaWxlIHBvaW50ZXIuICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIHNvbWV0aW1lcyBnZXRzIGNhbGxlZAorICogd2l0aCB2ZXJ5IHNtYWxsIGxlbmd0aHMsIHNvIHlvdSBzaG91bGQgaW1wbGVtZW50IHNvbWUga2luZCBvZiBzaW1wbGUKKyAqIGJ1ZmZlcmluZyBpZiB5b3UgYXJlIHVzaW5nIHVuYnVmZmVyZWQgd3JpdGVzLiAgVGhpcyBzaG91bGQgbmV2ZXIgYmUgYXNrZWQKKyAqIHRvIHdyaXRlIG1vcmUgdGhhbiA2NEsgb24gYSAxNiBiaXQgbWFjaGluZS4KKyAqLworCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKK3sKKyAgIGlmIChwbmdfcHRyLT53cml0ZV9kYXRhX2ZuICE9IE5VTEwgKQorICAgICAgKCoocG5nX3B0ci0+d3JpdGVfZGF0YV9mbikpKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7CisgICBlbHNlCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbGwgdG8gTlVMTCB3cml0ZSBmdW5jdGlvbiIpOworfQorCisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgd3JpdGluZyBvZiBkYXRhLiAgSWYgeW91IGFyZQorICogbm90IHdyaXRpbmcgdG8gYSBzdGFuZGFyZCBDIHN0cmVhbSwgeW91IHNob3VsZCBjcmVhdGUgYSByZXBsYWNlbWVudAorICogd3JpdGVfZGF0YSBmdW5jdGlvbiBhbmQgdXNlIGl0IGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF93cml0ZV9mbigpLCByYXRoZXIKKyAqIHRoYW4gY2hhbmdpbmcgdGhlIGxpYnJhcnkuCisgKi8KKyNpZm5kZWYgVVNFX0ZBUl9LRVlXT1JECit2b2lkIFBOR0FQSQorcG5nX2RlZmF1bHRfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBwbmdfdWludF8zMiBjaGVjazsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyNpZmRlZiBfV0lOMzJfV0NFCisgICBpZiAoICFXcml0ZUZpbGUoKEhBTkRMRSkocG5nX3B0ci0+aW9fcHRyKSwgZGF0YSwgbGVuZ3RoLCAmY2hlY2ssIE5VTEwpICkKKyAgICAgIGNoZWNrID0gMDsKKyNlbHNlCisgICBjaGVjayA9IGZ3cml0ZShkYXRhLCAxLCBsZW5ndGgsIChwbmdfRklMRV9wKShwbmdfcHRyLT5pb19wdHIpKTsKKyNlbmRpZgorICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiV3JpdGUgRXJyb3IiKTsKK30KKyNlbHNlCisvKiBUaGlzIGlzIHRoZSBtb2RlbC1pbmRlcGVuZGVudCB2ZXJzaW9uLiBTaW5jZSB0aGUgc3RhbmRhcmQgSS9PIGxpYnJhcnkKKyAqIGNhbid0IGhhbmRsZSBmYXIgYnVmZmVycyBpbiB0aGUgbWVkaXVtIGFuZCBzbWFsbCBtb2RlbHMsIHdlIGhhdmUgdG8gY29weQorICogdGhlIGRhdGEuCisgKi8KKworI2RlZmluZSBORUFSX0JVRl9TSVpFIDEwMjQKKyNkZWZpbmUgTUlOKGEsYikgKGEgPD0gYiA/IGEgOiBiKQorCit2b2lkIFBOR0FQSQorcG5nX2RlZmF1bHRfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICBwbmdfdWludF8zMiBjaGVjazsKKyAgIHBuZ19ieXRlICpuZWFyX2RhdGE7ICAvKiBOZWVkcyB0byBiZSAicG5nX2J5dGUgKiIgaW5zdGVhZCBvZiAicG5nX2J5dGVwIiAqLworICAgcG5nX0ZJTEVfcCBpb19wdHI7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICAvKiBDaGVjayBpZiBkYXRhIHJlYWxseSBpcyBuZWFyLiBJZiBzbywgdXNlIHVzdWFsIGNvZGUuICovCisgICBuZWFyX2RhdGEgPSAocG5nX2J5dGUgKilDVlRfUFRSX05PQ0hFQ0soZGF0YSk7CisgICBpb19wdHIgPSAocG5nX0ZJTEVfcClDVlRfUFRSKHBuZ19wdHItPmlvX3B0cik7CisgICBpZiAoKHBuZ19ieXRlcCluZWFyX2RhdGEgPT0gZGF0YSkKKyAgIHsKKyNpZmRlZiBfV0lOMzJfV0NFCisgICAgICBpZiAoICFXcml0ZUZpbGUoaW9fcHRyLCBuZWFyX2RhdGEsIGxlbmd0aCwgJmNoZWNrLCBOVUxMKSApCisgICAgICAgICBjaGVjayA9IDA7CisjZWxzZQorICAgICAgY2hlY2sgPSBmd3JpdGUobmVhcl9kYXRhLCAxLCBsZW5ndGgsIGlvX3B0cik7CisjZW5kaWYKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBuZ19ieXRlIGJ1ZltORUFSX0JVRl9TSVpFXTsKKyAgICAgIHBuZ19zaXplX3Qgd3JpdHRlbiwgcmVtYWluaW5nLCBlcnI7CisgICAgICBjaGVjayA9IDA7CisgICAgICByZW1haW5pbmcgPSBsZW5ndGg7CisgICAgICBkbworICAgICAgeworICAgICAgICAgd3JpdHRlbiA9IE1JTihORUFSX0JVRl9TSVpFLCByZW1haW5pbmcpOworICAgICAgICAgcG5nX21lbWNweShidWYsIGRhdGEsIHdyaXR0ZW4pOyAvKiBDb3B5IGZhciBidWZmZXIgdG8gbmVhciBidWZmZXIgKi8KKyNpZmRlZiBfV0lOMzJfV0NFCisgICAgICAgICBpZiAoICFXcml0ZUZpbGUoaW9fcHRyLCBidWYsIHdyaXR0ZW4sICZlcnIsIE5VTEwpICkKKyAgICAgICAgICAgIGVyciA9IDA7CisjZWxzZQorICAgICAgICAgZXJyID0gZndyaXRlKGJ1ZiwgMSwgd3JpdHRlbiwgaW9fcHRyKTsKKyNlbmRpZgorICAgICAgICAgaWYgKGVyciAhPSB3cml0dGVuKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoZWNrICs9IGVycjsKKworICAgICAgICAgZGF0YSArPSB3cml0dGVuOworICAgICAgICAgcmVtYWluaW5nIC09IHdyaXR0ZW47CisgICAgICB9CisgICAgICB3aGlsZSAocmVtYWluaW5nICE9IDApOworICAgfQorICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiV3JpdGUgRXJyb3IiKTsKK30KKworI2VuZGlmCisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gb3V0cHV0IGFueSBkYXRhIHBlbmRpbmcgd3JpdGluZyAobm9ybWFsbHkKKyAqIHRvIGRpc2spLiAgQWZ0ZXIgcG5nX2ZsdXNoIGlzIGNhbGxlZCwgdGhlcmUgc2hvdWxkIGJlIG5vIGRhdGEgcGVuZGluZworICogd3JpdGluZyBpbiBhbnkgYnVmZmVycy4KKyAqLworI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2ZsdXNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBpZiAocG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuICE9IE5VTEwpCisgICAgICAoKihwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4pKShwbmdfcHRyKTsKK30KKworI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKK3ZvaWQgUE5HQVBJCitwbmdfZGVmYXVsdF9mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworI2lmbmRlZiBfV0lOMzJfV0NFCisgICBwbmdfRklMRV9wIGlvX3B0cjsKKyNlbmRpZgorICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyNpZm5kZWYgX1dJTjMyX1dDRQorICAgaW9fcHRyID0gKHBuZ19GSUxFX3ApQ1ZUX1BUUigocG5nX3B0ci0+aW9fcHRyKSk7CisgICBmZmx1c2goaW9fcHRyKTsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHN1cHBseSBuZXcgb3V0cHV0IGZ1bmN0aW9ucyBmb3IKKyAqIGxpYnBuZyBpZiBzdGFuZGFyZCBDIHN0cmVhbXMgYXJlbid0IGJlaW5nIHVzZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBpdHMgYXJndW1lbnRzOgorICogcG5nX3B0ciAgICAgICAtIHBvaW50ZXIgdG8gYSBwbmcgb3V0cHV0IGRhdGEgc3RydWN0dXJlCisgKiBpb19wdHIgICAgICAgIC0gcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQKKyAqICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IGZ1bmN0aW9ucy4gIE1heSBiZSBOVUxMLgorICogd3JpdGVfZGF0YV9mbiAtIHBvaW50ZXIgdG8gYSBuZXcgb3V0cHV0IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYXMgaXRzCisgKiAgICAgICAgICAgICAgICAgYXJndW1lbnRzIGEgcG9pbnRlciB0byBhIHBuZ19zdHJ1Y3QsIGEgcG9pbnRlciB0bworICogICAgICAgICAgICAgICAgIGRhdGEgdG8gYmUgd3JpdHRlbiwgYW5kIGEgMzItYml0IHVuc2lnbmVkIGludCB0aGF0IGlzCisgKiAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuLiAgVGhlIG5ldyB3cml0ZQorICogICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBjYWxsIHBuZ19lcnJvcihwbmdfcHRyLCAiRXJyb3IgbXNnIikKKyAqICAgICAgICAgICAgICAgICB0byBleGl0IGFuZCBvdXRwdXQgYW55IGZhdGFsIGVycm9yIG1lc3NhZ2VzLiAgTWF5IGJlCisgKiAgICAgICAgICAgICAgICAgTlVMTCwgaW4gd2hpY2ggY2FzZSBsaWJwbmcncyBkZWZhdWx0IGZ1bmN0aW9uIHdpbGwKKyAqICAgICAgICAgICAgICAgICBiZSB1c2VkLgorICogZmx1c2hfZGF0YV9mbiAtIHBvaW50ZXIgdG8gYSBuZXcgZmx1c2ggZnVuY3Rpb24gdGhhdCB0YWtlcyBhcyBpdHMKKyAqICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYSBwb2ludGVyIHRvIGEgcG5nX3N0cnVjdC4gIEFmdGVyIGEgY2FsbCB0bworICogICAgICAgICAgICAgICAgIHRoZSBmbHVzaCBmdW5jdGlvbiwgdGhlcmUgc2hvdWxkIGJlIG5vIGRhdGEgaW4gYW55IGJ1ZmZlcnMKKyAqICAgICAgICAgICAgICAgICBvciBwZW5kaW5nIHRyYW5zbWlzc2lvbi4gIElmIHRoZSBvdXRwdXQgbWV0aG9kIGRvZXNuJ3QgZG8KKyAqICAgICAgICAgICAgICAgICBhbnkgYnVmZmVyaW5nIG9mIG91dHB1dCwgYSBmdW5jdGlvbiBwcm90b3R5cGUgbXVzdCBzdGlsbCBiZQorICogICAgICAgICAgICAgICAgIHN1cHBsaWVkIGFsdGhvdWdoIGl0IGRvZXNuJ3QgaGF2ZSB0byBkbyBhbnl0aGluZy4gIElmCisgKiAgICAgICAgICAgICAgICAgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZCBhdCBsaWJwbmcgY29tcGlsZQorICogICAgICAgICAgICAgICAgIHRpbWUsIG91dHB1dF9mbHVzaF9mbiB3aWxsIGJlIGlnbm9yZWQsIGFsdGhvdWdoIGl0IG11c3QgYmUKKyAqICAgICAgICAgICAgICAgICBzdXBwbGllZCBmb3IgY29tcGF0aWJpbGl0eS4gIE1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlCisgKiAgICAgICAgICAgICAgICAgbGlicG5nJ3MgZGVmYXVsdCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQsIGlmCisgKiAgICAgICAgICAgICAgICAgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCBpcyBkZWZpbmVkLiAgVGhpcyBpcyBub3QKKyAqICAgICAgICAgICAgICAgICBhIGdvb2QgaWRlYSBpZiBpb19wdHIgZG9lcyBub3QgcG9pbnQgdG8gYSBzdGFuZGFyZAorICogICAgICAgICAgICAgICAgICpGSUxFIHN0cnVjdHVyZS4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfd3JpdGVfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIGlvX3B0ciwKKyAgIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbiwgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm4pCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfcHRyLT5pb19wdHIgPSBpb19wdHI7CisKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECisgICBpZiAod3JpdGVfZGF0YV9mbiAhPSBOVUxMKQorICAgICAgcG5nX3B0ci0+d3JpdGVfZGF0YV9mbiA9IHdyaXRlX2RhdGFfZm47CisKKyAgIGVsc2UKKyAgICAgIHBuZ19wdHItPndyaXRlX2RhdGFfZm4gPSBwbmdfZGVmYXVsdF93cml0ZV9kYXRhOworI2Vsc2UKKyAgIHBuZ19wdHItPndyaXRlX2RhdGFfZm4gPSB3cml0ZV9kYXRhX2ZuOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECisjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAorICAgaWYgKG91dHB1dF9mbHVzaF9mbiAhPSBOVUxMKQorICAgICAgcG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuID0gb3V0cHV0X2ZsdXNoX2ZuOworCisgICBlbHNlCisgICAgICBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gPSBwbmdfZGVmYXVsdF9mbHVzaDsKKyNlbHNlCisgICBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gPSBvdXRwdXRfZmx1c2hfZm47CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEICovCisKKyAgIC8qIEl0IGlzIGFuIGVycm9yIHRvIHJlYWQgd2hpbGUgd3JpdGluZyBhIHBuZyBmaWxlICovCisgICBpZiAocG5nX3B0ci0+cmVhZF9kYXRhX2ZuICE9IE5VTEwpCisgICB7CisgICAgICBwbmdfcHRyLT5yZWFkX2RhdGFfZm4gPSBOVUxMOworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICJBdHRlbXB0ZWQgdG8gc2V0IGJvdGggcmVhZF9kYXRhX2ZuIGFuZCB3cml0ZV9kYXRhX2ZuIGluIik7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgInRoZSBzYW1lIHN0cnVjdHVyZS4gIFJlc2V0dGluZyByZWFkX2RhdGFfZm4gdG8gTlVMTC4iKTsKKyAgIH0KK30KKworI2lmZGVmIFVTRV9GQVJfS0VZV09SRAorI2lmZGVmIF9NU0NfVkVSCit2b2lkICpwbmdfZmFyX3RvX25lYXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0ciwgaW50IGNoZWNrKQoreworICAgdm9pZCAqbmVhcl9wdHI7CisgICB2b2lkIEZBUiAqZmFyX3B0cjsKKyAgIEZQX09GRihuZWFyX3B0cikgPSBGUF9PRkYocHRyKTsKKyAgIGZhcl9wdHIgPSAodm9pZCBGQVIgKiluZWFyX3B0cjsKKworICAgaWYgKGNoZWNrICE9IDApCisgICAgICBpZiAoRlBfU0VHKHB0cikgIT0gRlBfU0VHKGZhcl9wdHIpKQorICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJzZWdtZW50IGxvc3QgaW4gY29udmVyc2lvbiIpOworCisgICByZXR1cm4obmVhcl9wdHIpOworfQorIyAgZWxzZQordm9pZCAqcG5nX2Zhcl90b19uZWFyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIsIGludCBjaGVjaykKK3sKKyAgIHZvaWQgKm5lYXJfcHRyOworICAgdm9pZCBGQVIgKmZhcl9wdHI7CisgICBuZWFyX3B0ciA9ICh2b2lkIEZBUiAqKXB0cjsKKyAgIGZhcl9wdHIgPSAodm9pZCBGQVIgKiluZWFyX3B0cjsKKworICAgaWYgKGNoZWNrICE9IDApCisgICAgICBpZiAoZmFyX3B0ciAhPSBwdHIpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInNlZ21lbnQgbG9zdCBpbiBjb252ZXJzaW9uIik7CisKKyAgIHJldHVybihuZWFyX3B0cik7Cit9CisjICAgZW5kaWYKKyMgICBlbmRpZgorI2VuZGlmIC8qIFBOR19XUklURV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9saWJwbmcvcG5nd3JpdGUuYyBiL2NvbTMyL2xpYi9saWJwbmcvcG5nd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDExZTgxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL2xpYnBuZy9wbmd3cml0ZS5jCkBAIC0wLDAgKzEsMTU5MiBAQAorCisvKiBwbmd3cml0ZS5jIC0gZ2VuZXJhbCByb3V0aW5lcyB0byB3cml0ZSBhIFBORyBmaWxlCisgKgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuNDIgW0phbnVhcnkgMywgMjAxMF0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKworLyogR2V0IGludGVybmFsIGFjY2VzcyB0byBwbmcuaCAqLworI2RlZmluZSBQTkdfSU5URVJOQUwKKyNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCisjaW5jbHVkZSAicG5nLmgiCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorCisvKiBXcml0ZXMgYWxsIHRoZSBQTkcgaW5mb3JtYXRpb24uICBUaGlzIGlzIHRoZSBzdWdnZXN0ZWQgd2F5IHRvIHVzZSB0aGUKKyAqIGxpYnJhcnkuICBJZiB5b3UgaGF2ZSBhIG5ldyBjaHVuayB0byBhZGQsIG1ha2UgYSBmdW5jdGlvbiB0byB3cml0ZSBpdCwKKyAqIGFuZCBwdXQgaXQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24gaGVyZS4gIElmIHlvdSB3YW50IHRoZSBjaHVuayB3cml0dGVuCisgKiBhZnRlciB0aGUgaW1hZ2UgZGF0YSwgcHV0IGl0IGluIHBuZ193cml0ZV9lbmQoKS4gIEkgc3Ryb25nbHkgZW5jb3VyYWdlCisgKiB5b3UgdG8gc3VwcGx5IGEgUE5HX0lORk9fIGZsYWcsIGFuZCBjaGVjayBpbmZvX3B0ci0+dmFsaWQgYmVmb3JlIHdyaXRpbmcKKyAqIHRoZSBjaHVuaywgYXMgdGhhdCB3aWxsIGtlZXAgdGhlIGNvZGUgZnJvbSBicmVha2luZyBpZiB5b3Ugd2FudCB0byBqdXN0CisgKiB3cml0ZSBhIHBsYWluIFBORyBmaWxlLiAgSWYgeW91IGhhdmUgbG9uZyBjb21tZW50cywgSSBzdWdnZXN0IHdyaXRpbmcKKyAqIHRoZW0gaW4gcG5nX3dyaXRlX2VuZCgpLCBhbmQgY29tcHJlc3NpbmcgdGhlbS4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19XUk9URV9JTkZPX0JFRk9SRV9QTFRFKSkKKyAgIHsKKyAgIC8qIFdyaXRlIFBORyBzaWduYXR1cmUgKi8KKyAgIHBuZ193cml0ZV9zaWcocG5nX3B0cik7CisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyAgIGlmICgocG5nX3B0ci0+bW9kZSZQTkdfSEFWRV9QTkdfU0lHTkFUVVJFKSAmJiBcCisgICAgICAocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCkpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTU5HIGZlYXR1cmVzIGFyZSBub3QgYWxsb3dlZCBpbiBhIFBORyBkYXRhc3RyZWFtIik7CisgICAgICBwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkID0gMDsKKyAgIH0KKyNlbmRpZgorICAgLyogV3JpdGUgSUhEUiBpbmZvcm1hdGlvbi4gKi8KKyAgIHBuZ193cml0ZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLT53aWR0aCwgaW5mb19wdHItPmhlaWdodCwKKyAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgsIGluZm9fcHRyLT5jb2xvcl90eXBlLCBpbmZvX3B0ci0+Y29tcHJlc3Npb25fdHlwZSwKKyAgICAgIGluZm9fcHRyLT5maWx0ZXJfdHlwZSwKKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAgICBpbmZvX3B0ci0+aW50ZXJsYWNlX3R5cGUpOworI2Vsc2UKKyAgICAgIDApOworI2VuZGlmCisgICAvKiBUaGUgcmVzdCBvZiB0aGVzZSBjaGVjayB0byBzZWUgaWYgdGhlIHZhbGlkIGZpZWxkIGhhcyB0aGUgYXBwcm9wcmlhdGUKKyAgICAqIGZsYWcgc2V0LCBhbmQgaWYgaXQgZG9lcywgd3JpdGVzIHRoZSBjaHVuay4KKyAgICAqLworI2lmZGVmIFBOR19XUklURV9nQU1BX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2dBTUEpCisgICB7CisjICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisgICAgICBwbmdfd3JpdGVfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ci0+Z2FtbWEpOworI2Vsc2UKKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECisgICAgICBwbmdfd3JpdGVfZ0FNQV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ci0+aW50X2dhbW1hKTsKKyMgIGVuZGlmCisjZW5kaWYKKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NSR0IpCisgICAgICBwbmdfd3JpdGVfc1JHQihwbmdfcHRyLCAoaW50KWluZm9fcHRyLT5zcmdiX2ludGVudCk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfaUNDUF9TVVBQT1JURUQKKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19pQ0NQKQorICAgICAgcG5nX3dyaXRlX2lDQ1AocG5nX3B0ciwgaW5mb19wdHItPmljY3BfbmFtZSwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwKKyAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUsIChpbnQpaW5mb19wdHItPmljY3BfcHJvZmxlbik7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfc0JJVF9TVVBQT1JURUQKKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQklUKQorICAgICAgcG5nX3dyaXRlX3NCSVQocG5nX3B0ciwgJihpbmZvX3B0ci0+c2lnX2JpdCksIGluZm9fcHRyLT5jb2xvcl90eXBlKTsKKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9jSFJNX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2NIUk0pCisgICB7CisjaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAorICAgICAgcG5nX3dyaXRlX2NIUk0ocG5nX3B0ciwKKyAgICAgICAgIGluZm9fcHRyLT54X3doaXRlLCBpbmZvX3B0ci0+eV93aGl0ZSwKKyAgICAgICAgIGluZm9fcHRyLT54X3JlZCwgaW5mb19wdHItPnlfcmVkLAorICAgICAgICAgaW5mb19wdHItPnhfZ3JlZW4sIGluZm9fcHRyLT55X2dyZWVuLAorICAgICAgICAgaW5mb19wdHItPnhfYmx1ZSwgaW5mb19wdHItPnlfYmx1ZSk7CisjZWxzZQorIyAgaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAorICAgICAgcG5nX3dyaXRlX2NIUk1fZml4ZWQocG5nX3B0ciwKKyAgICAgICAgIGluZm9fcHRyLT5pbnRfeF93aGl0ZSwgaW5mb19wdHItPmludF95X3doaXRlLAorICAgICAgICAgaW5mb19wdHItPmludF94X3JlZCwgaW5mb19wdHItPmludF95X3JlZCwKKyAgICAgICAgIGluZm9fcHRyLT5pbnRfeF9ncmVlbiwgaW5mb19wdHItPmludF95X2dyZWVuLAorICAgICAgICAgaW5mb19wdHItPmludF94X2JsdWUsIGluZm9fcHRyLT5pbnRfeV9ibHVlKTsKKyMgIGVuZGlmCisjZW5kaWYKKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIGlmIChpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtKQorICAgeworICAgICAgcG5nX3Vua25vd25fY2h1bmsgKnVwOworCisgICAgICBwbmdfZGVidWcoNSwgIndyaXRpbmcgZXh0cmEgY2h1bmtzIik7CisKKyAgICAgIGZvciAodXAgPSBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3M7CisgICAgICAgICAgIHVwIDwgaW5mb19wdHItPnVua25vd25fY2h1bmtzICsgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bTsKKyAgICAgICAgICAgdXArKykKKyAgICAgIHsKKyAgICAgICAgIGludCBrZWVwID0gcG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIHVwLT5uYW1lKTsKKyAgICAgICAgIGlmIChrZWVwICE9IFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgJiYKKyAgICAgICAgICAgIHVwLT5sb2NhdGlvbiAmJiAhKHVwLT5sb2NhdGlvbiAmIFBOR19IQVZFX1BMVEUpICYmCisgICAgICAgICAgICAhKHVwLT5sb2NhdGlvbiAmIFBOR19IQVZFX0lEQVQpICYmCisgICAgICAgICAgICAoKHVwLT5uYW1lWzNdICYgMHgyMCkgfHwga2VlcCA9PSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyB8fAorICAgICAgICAgICAgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfS0VFUF9VTlNBRkVfQ0hVTktTKSkpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAodXAtPnNpemUgPT0gMCkKKyAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJXcml0aW5nIHplcm8tbGVuZ3RoIHVua25vd24gY2h1bmsiKTsKKyAgICAgICAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCB1cC0+bmFtZSwgdXAtPmRhdGEsIHVwLT5zaXplKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURTsKKyAgIH0KK30KKwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9pbmZvKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKK3sKKyNpZiBkZWZpbmVkKFBOR19XUklURV9URVhUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQpCisgICBpbnQgaTsKKyNlbmRpZgorCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9pbmZvIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIpOworCisgICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fUExURSkKKyAgICAgIHBuZ193cml0ZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLT5wYWxldHRlLAorICAgICAgICAgKHBuZ191aW50XzMyKWluZm9fcHRyLT5udW1fcGFsZXR0ZSk7CisgICBlbHNlIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJWYWxpZCBwYWxldHRlIHJlcXVpcmVkIGZvciBwYWxldHRlZCBpbWFnZXMiKTsKKworI2lmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RSTlMpCisgICB7CisjaWZkZWYgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKKyAgICAgIC8qIEludmVydCB0aGUgYWxwaGEgY2hhbm5lbCAoaW4gdFJOUykgKi8KKyAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9BTFBIQSkgJiYKKyAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICAgICB7CisgICAgICAgICBpbnQgajsKKyAgICAgICAgIGZvciAoaiA9IDA7IGo8KGludClpbmZvX3B0ci0+bnVtX3RyYW5zOyBqKyspCisgICAgICAgICAgICBpbmZvX3B0ci0+dHJhbnNbal0gPSAocG5nX2J5dGUpKDI1NSAtIGluZm9fcHRyLT50cmFuc1tqXSk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHBuZ193cml0ZV90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLT50cmFucywgJihpbmZvX3B0ci0+dHJhbnNfdmFsdWVzKSwKKyAgICAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMsIGluZm9fcHRyLT5jb2xvcl90eXBlKTsKKyAgIH0KKyNlbmRpZgorI2lmZGVmIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2JLR0QpCisgICAgICBwbmdfd3JpdGVfYktHRChwbmdfcHRyLCAmKGluZm9fcHRyLT5iYWNrZ3JvdW5kKSwgaW5mb19wdHItPmNvbG9yX3R5cGUpOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX2hJU1RfU1VQUE9SVEVECisgICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9faElTVCkKKyAgICAgIHBuZ193cml0ZV9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLT5oaXN0LCBpbmZvX3B0ci0+bnVtX3BhbGV0dGUpOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX29GRnNfU1VQUE9SVEVECisgICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykKKyAgICAgIHBuZ193cml0ZV9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLT54X29mZnNldCwgaW5mb19wdHItPnlfb2Zmc2V0LAorICAgICAgICAgaW5mb19wdHItPm9mZnNldF91bml0X3R5cGUpOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX3BDQUxfU1VQUE9SVEVECisgICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcENBTCkKKyAgICAgIHBuZ193cml0ZV9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLT5wY2FsX3B1cnBvc2UsIGluZm9fcHRyLT5wY2FsX1gwLAorICAgICAgICAgaW5mb19wdHItPnBjYWxfWDEsIGluZm9fcHRyLT5wY2FsX3R5cGUsIGluZm9fcHRyLT5wY2FsX25wYXJhbXMsCisgICAgICAgICBpbmZvX3B0ci0+cGNhbF91bml0cywgaW5mb19wdHItPnBjYWxfcGFyYW1zKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX3NDQUxfU1VQUE9SVEVECisgICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0NBTCkKKyNpZmRlZiBQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQKKyNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkKKyAgICAgIHBuZ193cml0ZV9zQ0FMKHBuZ19wdHIsIChpbnQpaW5mb19wdHItPnNjYWxfdW5pdCwKKyAgICAgICAgICBpbmZvX3B0ci0+c2NhbF9waXhlbF93aWR0aCwgaW5mb19wdHItPnNjYWxfcGl4ZWxfaGVpZ2h0KTsKKyNlbHNlIC8qICFGTE9BVElOR19QT0lOVCAqLworI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKKyAgICAgIHBuZ193cml0ZV9zQ0FMX3MocG5nX3B0ciwgKGludClpbmZvX3B0ci0+c2NhbF91bml0LAorICAgICAgICAgIGluZm9fcHRyLT5zY2FsX3Nfd2lkdGgsIGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0KTsKKyNlbmRpZiAvKiBGSVhFRF9QT0lOVCAqLworI2VuZGlmIC8qIEZMT0FUSU5HX1BPSU5UICovCisjZWxzZSAgLyogIVdSSVRFX3NDQUwgKi8KKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgInBuZ193cml0ZV9zQ0FMIG5vdCBzdXBwb3J0ZWQ7IHNDQUwgY2h1bmsgbm90IHdyaXR0ZW4uIik7CisjZW5kaWYgLyogV1JJVEVfc0NBTCAqLworI2VuZGlmIC8qIHNDQUwgKi8KKworI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpCisgICAgICBwbmdfd3JpdGVfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQsCisgICAgICAgICBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQsIGluZm9fcHRyLT5waHlzX3VuaXRfdHlwZSk7CisjZW5kaWYgLyogcEhZcyAqLworCisjaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECisgICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdElNRSkKKyAgIHsKKyAgICAgIHBuZ193cml0ZV90SU1FKHBuZ19wdHIsICYoaW5mb19wdHItPm1vZF90aW1lKSk7CisgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19XUk9URV90SU1FOworICAgfQorI2VuZGlmIC8qIHRJTUUgKi8KKworI2lmZGVmIFBOR19XUklURV9zUExUX1NVUFBPUlRFRAorICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NQTFQpCisgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bTsgaSsrKQorICAgICAgIHBuZ193cml0ZV9zUExUKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzICsgaSk7CisjZW5kaWYgLyogc1BMVCAqLworCisjaWZkZWYgUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVECisgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byB3cml0ZSB0ZXh0IGNodW5rcyAqLworICAgZm9yIChpID0gMDsgaSA8IGluZm9fcHRyLT5udW1fdGV4dDsgaSsrKQorICAgeworICAgICAgcG5nX2RlYnVnMigyLCAiV3JpdGluZyBoZWFkZXIgdGV4dCBjaHVuayAlZCwgdHlwZSAlZCIsIGksCisgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbik7CisgICAgICAvKiBBbiBpbnRlcm5hdGlvbmFsaXplZCBjaHVuaz8gKi8KKyAgICAgIGlmIChpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA+IDApCisgICAgICB7CisjaWZkZWYgUE5HX1dSSVRFX2lUWHRfU1VQUE9SVEVECisgICAgICAgICAgLyogV3JpdGUgaW50ZXJuYXRpb25hbCBjaHVuayAqLworICAgICAgICAgIHBuZ193cml0ZV9pVFh0KHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmxhbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0ubGFuZ19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCk7CisjZWxzZQorICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmFibGUgdG8gd3JpdGUgaW50ZXJuYXRpb25hbCB0ZXh0Iik7CisjZW5kaWYKKyAgICAgICAgICAvKiBNYXJrIHRoaXMgY2h1bmsgYXMgd3JpdHRlbiAqLworICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUjsKKyAgICAgIH0KKyAgICAgIC8qIElmIHdlIHdhbnQgYSBjb21wcmVzc2VkIHRleHQgY2h1bmsgKi8KKyAgICAgIGVsc2UgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID09IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQpCisgICAgICB7CisjaWZkZWYgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVECisgICAgICAgICAvKiBXcml0ZSBjb21wcmVzc2VkIGNodW5rICovCisgICAgICAgICBwbmdfd3JpdGVfelRYdChwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dFtpXS5rZXksCisgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0LCAwLAorICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24pOworI2Vsc2UKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmFibGUgdG8gd3JpdGUgY29tcHJlc3NlZCB0ZXh0Iik7CisjZW5kaWYKKyAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCisgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHRfV1I7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9PSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FKQorICAgICAgeworI2lmZGVmIFBOR19XUklURV90RVh0X1NVUFBPUlRFRAorICAgICAgICAgLyogV3JpdGUgdW5jb21wcmVzc2VkIGNodW5rICovCisgICAgICAgICBwbmdfd3JpdGVfdEVYdChwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dFtpXS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCisgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7CisjZWxzZQorICAgICAgICAgLyogQ2FuJ3QgZ2V0IGhlcmUgKi8KKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmFibGUgdG8gd3JpdGUgdW5jb21wcmVzc2VkIHRleHQiKTsKKyNlbmRpZgorICAgICAgfQorICAgfQorI2VuZGlmIC8qIHRFWHQgKi8KKworI2lmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKKyAgIGlmIChpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtKQorICAgeworICAgICAgcG5nX3Vua25vd25fY2h1bmsgKnVwOworCisgICAgICBwbmdfZGVidWcoNSwgIndyaXRpbmcgZXh0cmEgY2h1bmtzIik7CisKKyAgICAgIGZvciAodXAgPSBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3M7CisgICAgICAgICAgIHVwIDwgaW5mb19wdHItPnVua25vd25fY2h1bmtzICsgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bTsKKyAgICAgICAgICAgdXArKykKKyAgICAgIHsKKyAgICAgICAgIGludCBrZWVwID0gcG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIHVwLT5uYW1lKTsKKyAgICAgICAgIGlmIChrZWVwICE9IFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgJiYKKyAgICAgICAgICAgIHVwLT5sb2NhdGlvbiAmJiAodXAtPmxvY2F0aW9uICYgUE5HX0hBVkVfUExURSkgJiYKKyAgICAgICAgICAgICEodXAtPmxvY2F0aW9uICYgUE5HX0hBVkVfSURBVCkgJiYKKyAgICAgICAgICAgICgodXAtPm5hbWVbM10gJiAweDIwKSB8fCBrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTIHx8CisgICAgICAgICAgICAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19LRUVQX1VOU0FGRV9DSFVOS1MpKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCB1cC0+bmFtZSwgdXAtPmRhdGEsIHVwLT5zaXplKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyNlbmRpZgorfQorCisvKiBXcml0ZXMgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICBJZiB5b3UgZG9uJ3Qgd2FudCB0byB3cml0ZSBjb21tZW50cyBvcgorICogdGltZSBpbmZvcm1hdGlvbiwgeW91IGNhbiBwYXNzIE5VTEwgZm9yIGluZm8uICBJZiB5b3UgYWxyZWFkeSB3cm90ZSB0aGVzZQorICogaW4gcG5nX3dyaXRlX2luZm8oKSwgZG8gbm90IHdyaXRlIHRoZW0gYWdhaW4gaGVyZS4gIElmIHlvdSBoYXZlIGxvbmcKKyAqIGNvbW1lbnRzLCBJIHN1Z2dlc3Qgd3JpdGluZyB0aGVtIGhlcmUsIGFuZCBjb21wcmVzc2luZyB0aGVtLgorICovCit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX2VuZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9lbmQiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSkKKyAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm8gSURBVHMgd3JpdHRlbiBpbnRvIGZpbGUiKTsKKworICAgLyogU2VlIGlmIHVzZXIgd2FudHMgdXMgdG8gd3JpdGUgaW5mb3JtYXRpb24gY2h1bmtzICovCisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKKyAgIHsKKyNpZmRlZiBQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQKKyAgICAgIGludCBpOyAvKiBsb2NhbCBpbmRleCB2YXJpYWJsZSAqLworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECisgICAgICAvKiBDaGVjayB0byBzZWUgaWYgdXNlciBoYXMgc3VwcGxpZWQgYSB0aW1lIGNodW5rICovCisgICAgICBpZiAoKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RJTUUpICYmCisgICAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfV1JPVEVfdElNRSkpCisgICAgICAgICBwbmdfd3JpdGVfdElNRShwbmdfcHRyLCAmKGluZm9fcHRyLT5tb2RfdGltZSkpOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVECisgICAgICAvKiBMb29wIHRocm91Z2ggY29tbWVudCBjaHVua3MgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+bnVtX3RleHQ7IGkrKykKKyAgICAgIHsKKyAgICAgICAgIHBuZ19kZWJ1ZzIoMiwgIldyaXRpbmcgdHJhaWxlciB0ZXh0IGNodW5rICVkLCB0eXBlICVkIiwgaSwKKyAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsKKyAgICAgICAgIC8qIEFuIGludGVybmF0aW9uYWxpemVkIGNodW5rPyAqLworICAgICAgICAgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID4gMCkKKyAgICAgICAgIHsKKyNpZmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKKyAgICAgICAgICAgIC8qIFdyaXRlIGludGVybmF0aW9uYWwgY2h1bmsgKi8KKyAgICAgICAgICAgIHBuZ193cml0ZV9pVFh0KHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmxhbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5sYW5nX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLnRleHQpOworI2Vsc2UKKyAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmFibGUgdG8gd3JpdGUgaW50ZXJuYXRpb25hbCB0ZXh0Iik7CisjZW5kaWYKKyAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCisgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmIChpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA+PSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0KQorICAgICAgICAgeworI2lmZGVmIFBOR19XUklURV96VFh0X1NVUFBPUlRFRAorICAgICAgICAgICAgLyogV3JpdGUgY29tcHJlc3NlZCBjaHVuayAqLworICAgICAgICAgICAgcG5nX3dyaXRlX3pUWHQocG5nX3B0ciwgaW5mb19wdHItPnRleHRbaV0ua2V5LAorICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwgMCwKKyAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsKKyNlbHNlCisgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5hYmxlIHRvIHdyaXRlIGNvbXByZXNzZWQgdGV4dCIpOworI2VuZGlmCisgICAgICAgICAgICAvKiBNYXJrIHRoaXMgY2h1bmsgYXMgd3JpdHRlbiAqLworICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSOworICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPT0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSkKKyAgICAgICAgIHsKKyNpZmRlZiBQTkdfV1JJVEVfdEVYdF9TVVBQT1JURUQKKyAgICAgICAgICAgIC8qIFdyaXRlIHVuY29tcHJlc3NlZCBjaHVuayAqLworICAgICAgICAgICAgcG5nX3dyaXRlX3RFWHQocG5nX3B0ciwgaW5mb19wdHItPnRleHRbaV0ua2V5LAorICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwgMCk7CisjZWxzZQorICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSB1bmNvbXByZXNzZWQgdGV4dCIpOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCisgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7CisgICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECisgICBpZiAoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSkKKyAgIHsKKyAgICAgIHBuZ191bmtub3duX2NodW5rICp1cDsKKworICAgICAgcG5nX2RlYnVnKDUsICJ3cml0aW5nIGV4dHJhIGNodW5rcyIpOworCisgICAgICBmb3IgKHVwID0gaW5mb19wdHItPnVua25vd25fY2h1bmtzOworICAgICAgICAgICB1cCA8IGluZm9fcHRyLT51bmtub3duX2NodW5rcyArIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW07CisgICAgICAgICAgIHVwKyspCisgICAgICB7CisgICAgICAgICBpbnQga2VlcCA9IHBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCB1cC0+bmFtZSk7CisgICAgICAgICBpZiAoa2VlcCAhPSBQTkdfSEFORExFX0NIVU5LX05FVkVSICYmCisgICAgICAgICAgICB1cC0+bG9jYXRpb24gJiYgKHVwLT5sb2NhdGlvbiAmIFBOR19BRlRFUl9JREFUKSAmJgorICAgICAgICAgICAgKCh1cC0+bmFtZVszXSAmIDB4MjApIHx8IGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgfHwKKyAgICAgICAgICAgIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0tFRVBfVU5TQUZFX0NIVU5LUykpKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIHVwLT5uYW1lLCB1cC0+ZGF0YSwgdXAtPnNpemUpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorI2VuZGlmCisgICB9CisKKyAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7CisKKyAgIC8qIFdyaXRlIGVuZCBvZiBQTkcgZmlsZSAqLworICAgcG5nX3dyaXRlX0lFTkQocG5nX3B0cik7CisgICAvKiBUaGlzIGZsdXNoLCBhZGRlZCBpbiBsaWJwbmctMS4wLjgsIHJlbW92ZWQgZnJvbSBsaWJwbmctMS4wLjliZXRhMDMsCisgICAgKiBhbmQgcmVzdG9yZWQgYWdhaW4gaW4gbGlicG5nLTEuMi4zMCwgbWF5IGNhdXNlIHNvbWUgYXBwbGljYXRpb25zIHRoYXQKKyAgICAqIGRvIG5vdCBzZXQgcG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuIHRvIGNyYXNoLiAgSWYgeW91ciBhcHBsaWNhdGlvbgorICAgICogZXhwZXJpZW5jZXMgYSBwcm9ibGVtLCBwbGVhc2UgdHJ5IGJ1aWxkaW5nIGxpYnBuZyB3aXRoCisgICAgKiBQTkdfV1JJVEVfRkxVU0hfQUZURVJfSUVORF9TVVBQT1JURUQgZGVmaW5lZCwgYW5kIHJlcG9ydCB0aGUgZXZlbnQgdG8KKyAgICAqIHBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldCAuCisgICAgKi8KKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECisjICBpZmRlZiBQTkdfV1JJVEVfRkxVU0hfQUZURVJfSUVORF9TVVBQT1JURUQKKyAgIHBuZ19mbHVzaChwbmdfcHRyKTsKKyMgIGVuZGlmCisjZW5kaWYKK30KKworI2lmZGVmIFBOR19DT05WRVJUX3RJTUVfU1VQUE9SVEVECisvKiAidG0iIHN0cnVjdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NDRSAqLwordm9pZCBQTkdBUEkKK3BuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKHBuZ190aW1lcCBwdGltZSwgc3RydWN0IHRtIEZBUiAqIHR0aW1lKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSIpOworCisgICBwdGltZS0+eWVhciA9IChwbmdfdWludF8xNikoMTkwMCArIHR0aW1lLT50bV95ZWFyKTsKKyAgIHB0aW1lLT5tb250aCA9IChwbmdfYnl0ZSkodHRpbWUtPnRtX21vbiArIDEpOworICAgcHRpbWUtPmRheSA9IChwbmdfYnl0ZSl0dGltZS0+dG1fbWRheTsKKyAgIHB0aW1lLT5ob3VyID0gKHBuZ19ieXRlKXR0aW1lLT50bV9ob3VyOworICAgcHRpbWUtPm1pbnV0ZSA9IChwbmdfYnl0ZSl0dGltZS0+dG1fbWluOworICAgcHRpbWUtPnNlY29uZCA9IChwbmdfYnl0ZSl0dGltZS0+dG1fc2VjOworfQorCit2b2lkIFBOR0FQSQorcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QocG5nX3RpbWVwIHB0aW1lLCB0aW1lX3QgdHRpbWUpCit7CisgICBzdHJ1Y3QgdG0gKnRidWY7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QiKTsKKworICAgdGJ1ZiA9IGdtdGltZSgmdHRpbWUpOworICAgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0ocHRpbWUsIHRidWYpOworfQorI2VuZGlmCisKKy8qIEluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3R1cmUsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZCAqLworcG5nX3N0cnVjdHAgUE5HQVBJCitwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAorICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKQoreworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgIHJldHVybiAocG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMih1c2VyX3BuZ192ZXIsIGVycm9yX3B0ciwgZXJyb3JfZm4sCisgICAgICB3YXJuX2ZuLCBwbmdfdm9pZHBfTlVMTCwgcG5nX21hbGxvY19wdHJfTlVMTCwgcG5nX2ZyZWVfcHRyX05VTEwpKTsKK30KKworLyogQWx0ZXJuYXRlIGluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3R1cmUsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZCAqLworcG5nX3N0cnVjdHAgUE5HQVBJCitwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCisgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sIHBuZ192b2lkcCBtZW1fcHRyLAorICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbikKK3sKKyNlbmRpZiAvKiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEICovCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgIHZvbGF0aWxlCisjZW5kaWYKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7CisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKKyAgIGptcF9idWYgam1wYnVmOworI2VuZGlmCisjZW5kaWYKKyAgIGludCBpOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0Iik7CisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKXBuZ19jcmVhdGVfc3RydWN0XzIoUE5HX1NUUlVDVF9QTkcsCisgICAgICAocG5nX21hbGxvY19wdHIpbWFsbG9jX2ZuLCAocG5nX3ZvaWRwKW1lbV9wdHIpOworI2Vsc2UKKyAgIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApcG5nX2NyZWF0ZV9zdHJ1Y3QoUE5HX1NUUlVDVF9QTkcpOworI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm4gKE5VTEwpOworCisgICAvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjYgKi8KKyNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggPSBQTkdfVVNFUl9XSURUSF9NQVg7CisgICBwbmdfcHRyLT51c2VyX2hlaWdodF9tYXggPSBQTkdfVVNFUl9IRUlHSFRfTUFYOworI2VuZGlmCisKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorI2lmZGVmIFVTRV9GQVJfS0VZV09SRAorICAgaWYgKHNldGptcChqbXBidWYpKQorI2Vsc2UKKyAgIGlmIChzZXRqbXAocG5nX3B0ci0+am1wYnVmKSkKKyNlbmRpZgorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+emJ1Zik7CisgICAgICBwbmdfcHRyLT56YnVmID0gTlVMTDsKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICAgICBwbmdfZGVzdHJveV9zdHJ1Y3RfMigocG5nX3ZvaWRwKXBuZ19wdHIsCisgICAgICAgICAocG5nX2ZyZWVfcHRyKWZyZWVfZm4sIChwbmdfdm9pZHApbWVtX3B0cik7CisjZWxzZQorICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0KChwbmdfdm9pZHApcG5nX3B0cik7CisjZW5kaWYKKyAgICAgIHJldHVybiAoTlVMTCk7CisgICB9CisjaWZkZWYgVVNFX0ZBUl9LRVlXT1JECisgICBwbmdfbWVtY3B5KHBuZ19wdHItPmptcGJ1Ziwgam1wYnVmLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECisgICBwbmdfc2V0X21lbV9mbihwbmdfcHRyLCBtZW1fcHRyLCBtYWxsb2NfZm4sIGZyZWVfZm4pOworI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KKyAgIHBuZ19zZXRfZXJyb3JfZm4ocG5nX3B0ciwgZXJyb3JfcHRyLCBlcnJvcl9mbiwgd2Fybl9mbik7CisKKyAgIGlmICh1c2VyX3BuZ192ZXIpCisgICB7CisgICAgICBpID0gMDsKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgICBpZiAodXNlcl9wbmdfdmVyW2ldICE9IHBuZ19saWJwbmdfdmVyW2ldKQorICAgICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfTElCUkFSWV9NSVNNQVRDSDsKKyAgICAgIH0gd2hpbGUgKHBuZ19saWJwbmdfdmVyW2krK10pOworICAgfQorCisgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIKQorICAgeworICAgICAvKiBMaWJwbmcgMC45MCBhbmQgbGF0ZXIgYXJlIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBsaWJwbmcgMC44OSwgc28KKyAgICAgICogd2UgbXVzdCByZWNvbXBpbGUgYW55IGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBhbnkgb2xkZXIgbGlicmFyeSB2ZXJzaW9uLgorICAgICAgKiBGb3IgdmVyc2lvbnMgYWZ0ZXIgbGlicG5nIDEuMCwgd2Ugd2lsbCBiZSBjb21wYXRpYmxlLCBzbyB3ZSBuZWVkCisgICAgICAqIG9ubHkgY2hlY2sgdGhlIGZpcnN0IGRpZ2l0LgorICAgICAgKi8KKyAgICAgaWYgKHVzZXJfcG5nX3ZlciA9PSBOVUxMIHx8IHVzZXJfcG5nX3ZlclswXSAhPSBwbmdfbGlicG5nX3ZlclswXSB8fAorICAgICAgICAgKHVzZXJfcG5nX3ZlclswXSA9PSAnMScgJiYgdXNlcl9wbmdfdmVyWzJdICE9IHBuZ19saWJwbmdfdmVyWzJdKSB8fAorICAgICAgICAgKHVzZXJfcG5nX3ZlclswXSA9PSAnMCcgJiYgdXNlcl9wbmdfdmVyWzJdIDwgJzknKSkKKyAgICAgeworI2lmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICAgICAgY2hhciBtc2dbODBdOworICAgICAgICBpZiAodXNlcl9wbmdfdmVyKQorICAgICAgICB7CisgICAgICAgICAgIHBuZ19zbnByaW50Zihtc2csIDgwLAorICAgICAgICAgICAgICAiQXBwbGljYXRpb24gd2FzIGNvbXBpbGVkIHdpdGggcG5nLmggZnJvbSBsaWJwbmctJS4yMHMiLAorICAgICAgICAgICAgICB1c2VyX3BuZ192ZXIpOworICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOworICAgICAgICB9CisgICAgICAgIHBuZ19zbnByaW50Zihtc2csIDgwLAorICAgICAgICAgICAiQXBwbGljYXRpb24gIGlzICBydW5uaW5nIHdpdGggcG5nLmMgZnJvbSBsaWJwbmctJS4yMHMiLAorICAgICAgICAgICBwbmdfbGlicG5nX3Zlcik7CisgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7CisjZW5kaWYKKyNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKKyAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgPSAwOworI2VuZGlmCisgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAorICAgICAgICAgICAiSW5jb21wYXRpYmxlIGxpYnBuZyB2ZXJzaW9uIGluIGFwcGxpY2F0aW9uIGFuZCBsaWJyYXJ5Iik7CisgICAgIH0KKyAgIH0KKworICAgLyogSW5pdGlhbGl6ZSB6YnVmIC0gY29tcHJlc3Npb24gYnVmZmVyICovCisgICBwbmdfcHRyLT56YnVmX3NpemUgPSBQTkdfWkJVRl9TSVpFOworICAgcG5nX3B0ci0+emJ1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAocG5nX3VpbnRfMzIpcG5nX3B0ci0+emJ1Zl9zaXplKTsKKworICAgcG5nX3NldF93cml0ZV9mbihwbmdfcHRyLCBwbmdfdm9pZHBfTlVMTCwgcG5nX3J3X3B0cl9OVUxMLAorICAgICAgcG5nX2ZsdXNoX3B0cl9OVUxMKTsKKworI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECisgICBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19wdHIsIFBOR19GSUxURVJfSEVVUklTVElDX0RFRkFVTFQsCisgICAgICAxLCBwbmdfZG91YmxlcF9OVUxMLCBwbmdfZG91YmxlcF9OVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKKyAgIC8qIEFwcGxpY2F0aW9ucyB0aGF0IG5lZ2xlY3QgdG8gc2V0IHVwIHRoZWlyIG93biBzZXRqbXAoKSBhbmQgdGhlbgorICAgICogZW5jb3VudGVyIGEgcG5nX2Vycm9yKCkgd2lsbCBsb25nam1wIGhlcmUuICBTaW5jZSB0aGUgam1wYnVmIGlzCisgICAgKiB0aGVuIG1lYW5pbmdsZXNzIHdlIGFib3J0IGluc3RlYWQgb2YgcmV0dXJuaW5nLgorICAgICovCisjaWZkZWYgVVNFX0ZBUl9LRVlXT1JECisgICBpZiAoc2V0am1wKGptcGJ1ZikpCisgICAgICBQTkdfQUJPUlQoKTsKKyAgIHBuZ19tZW1jcHkocG5nX3B0ci0+am1wYnVmLCBqbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOworI2Vsc2UKKyAgIGlmIChzZXRqbXAocG5nX3B0ci0+am1wYnVmKSkKKyAgICAgIFBOR19BQk9SVCgpOworI2VuZGlmCisjZW5kaWYKKyAgIHJldHVybiAocG5nX3B0cik7Cit9CisKKy8qIEluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3R1cmUsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZCAqLworI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkKFBOR18xXzJfWCkKKy8qIERlcHJlY2F0ZWQuICovCisjdW5kZWYgcG5nX3dyaXRlX2luaXQKK3ZvaWQgUE5HQVBJCitwbmdfd3JpdGVfaW5pdChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgLyogV2Ugb25seSBjb21lIGhlcmUgdmlhIHByZS0xLjAuNy1jb21waWxlZCBhcHBsaWNhdGlvbnMgKi8KKyAgIHBuZ193cml0ZV9pbml0XzIocG5nX3B0ciwgIjEuMC42IG9yIGVhcmxpZXIiLCAwLCAwKTsKK30KKwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9pbml0XzIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwKKyAgIHBuZ19zaXplX3QgcG5nX3N0cnVjdF9zaXplLCBwbmdfc2l6ZV90IHBuZ19pbmZvX3NpemUpCit7CisgICAvKiBXZSBvbmx5IGNvbWUgaGVyZSB2aWEgcHJlLTEuMC4xMi1jb21waWxlZCBhcHBsaWNhdGlvbnMgKi8KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpIHJldHVybjsKKyNpZiBkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICBpZiAocG5nX3NpemVvZihwbmdfc3RydWN0KSA+IHBuZ19zdHJ1Y3Rfc2l6ZSB8fAorICAgICAgcG5nX3NpemVvZihwbmdfaW5mbykgPiBwbmdfaW5mb19zaXplKQorICAgeworICAgICAgY2hhciBtc2dbODBdOworICAgICAgcG5nX3B0ci0+d2FybmluZ19mbiA9IE5VTEw7CisgICAgICBpZiAodXNlcl9wbmdfdmVyKQorICAgICAgeworICAgICAgICAgcG5nX3NucHJpbnRmKG1zZywgODAsCisgICAgICAgICAgICAiQXBwbGljYXRpb24gd2FzIGNvbXBpbGVkIHdpdGggcG5nLmggZnJvbSBsaWJwbmctJS4yMHMiLAorICAgICAgICAgICAgdXNlcl9wbmdfdmVyKTsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7CisgICAgICB9CisgICAgICBwbmdfc25wcmludGYobXNnLCA4MCwKKyAgICAgICAgICJBcHBsaWNhdGlvbiAgaXMgIHJ1bm5pbmcgd2l0aCBwbmcuYyBmcm9tIGxpYnBuZy0lLjIwcyIsCisgICAgICAgICBwbmdfbGlicG5nX3Zlcik7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOworICAgfQorI2VuZGlmCisgICBpZiAocG5nX3NpemVvZihwbmdfc3RydWN0KSA+IHBuZ19zdHJ1Y3Rfc2l6ZSkKKyAgIHsKKyAgICAgIHBuZ19wdHItPmVycm9yX2ZuID0gTlVMTDsKKyNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKKyAgICAgIHBuZ19wdHItPmZsYWdzID0gMDsKKyNlbmRpZgorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCisgICAgICAiVGhlIHBuZyBzdHJ1Y3QgYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmb3Igd3JpdGluZyBpcyIKKyAgICAgICIgdG9vIHNtYWxsLiIpOworICAgfQorICAgaWYgKHBuZ19zaXplb2YocG5nX2luZm8pID4gcG5nX2luZm9fc2l6ZSkKKyAgIHsKKyAgICAgIHBuZ19wdHItPmVycm9yX2ZuID0gTlVMTDsKKyNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKKyAgICAgIHBuZ19wdHItPmZsYWdzID0gMDsKKyNlbmRpZgorICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCisgICAgICAiVGhlIGluZm8gc3RydWN0IGFsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24gZm9yIHdyaXRpbmcgaXMiCisgICAgICAiIHRvbyBzbWFsbC4iKTsKKyAgIH0KKyAgIHBuZ193cml0ZV9pbml0XzMoJnBuZ19wdHIsIHVzZXJfcG5nX3ZlciwgcG5nX3N0cnVjdF9zaXplKTsKK30KKyNlbmRpZiAvKiBQTkdfMV8wX1ggfHwgUE5HXzFfMl9YICovCisKKwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9pbml0XzMocG5nX3N0cnVjdHBwIHB0cl9wdHIsIHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsCisgICBwbmdfc2l6ZV90IHBuZ19zdHJ1Y3Rfc2l6ZSkKK3sKKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAqcHRyX3B0cjsKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgam1wX2J1ZiB0bXBfam1wOyAvKiB0byBzYXZlIGN1cnJlbnQganVtcCBidWZmZXIgKi8KKyNlbmRpZgorCisgICBpbnQgaSA9IDA7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGRvCisgICB7CisgICAgICBpZiAodXNlcl9wbmdfdmVyW2ldICE9IHBuZ19saWJwbmdfdmVyW2ldKQorICAgICAgeworI2lmZGVmIFBOR19MRUdBQ1lfU1VQUE9SVEVECisgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIOworI2Vsc2UKKyAgICAgICAgIHBuZ19wdHItPndhcm5pbmdfZm4gPSBOVUxMOworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAiQXBwbGljYXRpb24gdXNlcyBkZXByZWNhdGVkIHBuZ193cml0ZV9pbml0KCkgYW5kIHNob3VsZCBiZSByZWNvbXBpbGVkLiIpOworI2VuZGlmCisgICAgICB9CisgICB9IHdoaWxlIChwbmdfbGlicG5nX3ZlcltpKytdKTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaW5pdF8zIik7CisKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgLyogU2F2ZSBqdW1wIGJ1ZmZlciBhbmQgZXJyb3IgZnVuY3Rpb25zICovCisgICBwbmdfbWVtY3B5KHRtcF9qbXAsIHBuZ19wdHItPmptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7CisjZW5kaWYKKworICAgaWYgKHBuZ19zaXplb2YocG5nX3N0cnVjdCkgPiBwbmdfc3RydWN0X3NpemUpCisgICB7CisgICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QocG5nX3B0cik7CisgICAgICBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKXBuZ19jcmVhdGVfc3RydWN0KFBOR19TVFJVQ1RfUE5HKTsKKyAgICAgICpwdHJfcHRyID0gcG5nX3B0cjsKKyAgIH0KKworICAgLyogUmVzZXQgYWxsIHZhcmlhYmxlcyB0byAwICovCisgICBwbmdfbWVtc2V0KHBuZ19wdHIsIDAsIHBuZ19zaXplb2YocG5nX3N0cnVjdCkpOworCisgICAvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjYgKi8KKyNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAorICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXggPSBQTkdfVVNFUl9XSURUSF9NQVg7CisgICBwbmdfcHRyLT51c2VyX2hlaWdodF9tYXggPSBQTkdfVVNFUl9IRUlHSFRfTUFYOworI2VuZGlmCisKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgLyogUmVzdG9yZSBqdW1wIGJ1ZmZlciAqLworICAgcG5nX21lbWNweShwbmdfcHRyLT5qbXBidWYsIHRtcF9qbXAsIHBuZ19zaXplb2Yoam1wX2J1ZikpOworI2VuZGlmCisKKyAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nX3B0ciwgcG5nX3ZvaWRwX05VTEwsIHBuZ19yd19wdHJfTlVMTCwKKyAgICAgIHBuZ19mbHVzaF9wdHJfTlVMTCk7CisKKyAgIC8qIEluaXRpYWxpemUgemJ1ZiAtIGNvbXByZXNzaW9uIGJ1ZmZlciAqLworICAgcG5nX3B0ci0+emJ1Zl9zaXplID0gUE5HX1pCVUZfU0laRTsKKyAgIHBuZ19wdHItPnpidWYgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgKHBuZ191aW50XzMyKXBuZ19wdHItPnpidWZfc2l6ZSk7CisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQKKyAgIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MocG5nX3B0ciwgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfREVGQVVMVCwKKyAgICAgIDEsIHBuZ19kb3VibGVwX05VTEwsIHBuZ19kb3VibGVwX05VTEwpOworI2VuZGlmCit9CisKKy8qIFdyaXRlIGEgZmV3IHJvd3Mgb2YgaW1hZ2UgZGF0YS4gIElmIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkLAorICogZWl0aGVyIHlvdSB3aWxsIGhhdmUgdG8gd3JpdGUgdGhlIDcgc3ViIGltYWdlcywgb3IsIGlmIHlvdQorICogaGF2ZSBjYWxsZWQgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSwgeW91IHdpbGwgaGF2ZSB0bworICogIndyaXRlIiB0aGUgaW1hZ2Ugc2V2ZW4gdGltZXMuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfd3JpdGVfcm93cyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXBwIHJvdywKKyAgIHBuZ191aW50XzMyIG51bV9yb3dzKQoreworICAgcG5nX3VpbnRfMzIgaTsgLyogcm93IGNvdW50ZXIgKi8KKyAgIHBuZ19ieXRlcHAgcnA7IC8qIHJvdyBwb2ludGVyICovCisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3Jvd3MiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgLyogTG9vcCB0aHJvdWdoIHRoZSByb3dzICovCisgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IG51bV9yb3dzOyBpKyssIHJwKyspCisgICB7CisgICAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsICpycCk7CisgICB9Cit9CisKKy8qIFdyaXRlIHRoZSBpbWFnZS4gIFlvdSBvbmx5IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UsIGV2ZW4KKyAqIGlmIHlvdSBhcmUgd3JpdGluZyBhbiBpbnRlcmxhY2VkIGltYWdlLgorICovCit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX2ltYWdlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcHAgaW1hZ2UpCit7CisgICBwbmdfdWludF8zMiBpOyAvKiByb3cgaW5kZXggKi8KKyAgIGludCBwYXNzLCBudW1fcGFzczsgLyogcGFzcyB2YXJpYWJsZXMgKi8KKyAgIHBuZ19ieXRlcHAgcnA7IC8qIHBvaW50cyB0byBjdXJyZW50IHJvdyAqLworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9pbWFnZSIpOworCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgLyogSW5pdGlhbGl6ZSBpbnRlcmxhY2UgaGFuZGxpbmcuICBJZiBpbWFnZSBpcyBub3QgaW50ZXJsYWNlZCwKKyAgICAqIHRoaXMgd2lsbCBzZXQgcGFzcyB0byAxCisgICAgKi8KKyAgIG51bV9wYXNzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisjZWxzZQorICAgbnVtX3Bhc3MgPSAxOworI2VuZGlmCisgICAvKiBMb29wIHRocm91Z2ggcGFzc2VzICovCisgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgbnVtX3Bhc3M7IHBhc3MrKykKKyAgIHsKKyAgICAgIC8qIExvb3AgdGhyb3VnaCBpbWFnZSAqLworICAgICAgZm9yIChpID0gMCwgcnAgPSBpbWFnZTsgaSA8IHBuZ19wdHItPmhlaWdodDsgaSsrLCBycCsrKQorICAgICAgeworICAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCAqcnApOworICAgICAgfQorICAgfQorfQorCisvKiBDYWxsZWQgYnkgdXNlciB0byB3cml0ZSBhIHJvdyBvZiBpbWFnZSBkYXRhICovCit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgcm93KQoreworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcG5nX2RlYnVnMigxLCAiaW4gcG5nX3dyaXRlX3JvdyAocm93ICVsZCwgcGFzcyAlZCkiLAorICAgICAgcG5nX3B0ci0+cm93X251bWJlciwgcG5nX3B0ci0+cGFzcyk7CisKKyAgIC8qIEluaXRpYWxpemUgdHJhbnNmb3JtYXRpb25zIGFuZCBvdGhlciBzdHVmZiBpZiBmaXJzdCB0aW1lICovCisgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA9PSAwICYmIHBuZ19wdHItPnBhc3MgPT0gMCkKKyAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgaGVhZGVyIGluZm8gKi8KKyAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURSkpCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAgICJwbmdfd3JpdGVfaW5mbyB3YXMgbmV2ZXIgY2FsbGVkIGJlZm9yZSBwbmdfd3JpdGVfcm93LiIpOworCisgICAgICAvKiBDaGVjayBmb3IgdHJhbnNmb3JtcyB0aGF0IGhhdmUgYmVlbiBzZXQgYnV0IHdlcmUgZGVmaW5lZCBvdXQgKi8KKyNpZiAhZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKQorICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfTU9OTykKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICAgIlBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkLiIpOworI2VuZGlmCisjaWYgIWRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkKKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRklMTEVSKQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICAgICAiUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQuIik7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEKSAmJiBcCisgICAgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpCisgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQorICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgICAgICAiUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRCkKKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDSykKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQgaXMgbm90IGRlZmluZWQuIik7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkKKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpCisgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JHUikKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkKKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1dBUF9CWVRFUykKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQuIik7CisjZW5kaWYKKworICAgICAgcG5nX3dyaXRlX3N0YXJ0X3JvdyhwbmdfcHRyKTsKKyAgIH0KKworI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIC8qIElmIGludGVybGFjZWQgYW5kIG5vdCBpbnRlcmVzdGVkIGluIHJvdywgcmV0dXJuICovCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAmJiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCisgICB7CisgICAgICBzd2l0Y2ggKHBuZ19wdHItPnBhc3MpCisgICAgICB7CisgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgfHwgcG5nX3B0ci0+d2lkdGggPCA1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmICgocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDcpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwMykgfHwgcG5nX3B0ci0+d2lkdGggPCAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGlmICgocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDMpICE9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwMSkgfHwgcG5nX3B0ci0+d2lkdGggPCAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGlmICghKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgLyogU2V0IHVwIHJvdyBpbmZvIGZvciB0cmFuc2Zvcm1hdGlvbnMgKi8KKyAgIHBuZ19wdHItPnJvd19pbmZvLmNvbG9yX3R5cGUgPSBwbmdfcHRyLT5jb2xvcl90eXBlOworICAgcG5nX3B0ci0+cm93X2luZm8ud2lkdGggPSBwbmdfcHRyLT51c3Jfd2lkdGg7CisgICBwbmdfcHRyLT5yb3dfaW5mby5jaGFubmVscyA9IHBuZ19wdHItPnVzcl9jaGFubmVsczsKKyAgIHBuZ19wdHItPnJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPnVzcl9iaXRfZGVwdGg7CisgICBwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocG5nX3B0ci0+cm93X2luZm8uYml0X2RlcHRoICoKKyAgICAgIHBuZ19wdHItPnJvd19pbmZvLmNoYW5uZWxzKTsKKworICAgcG5nX3B0ci0+cm93X2luZm8ucm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocG5nX3B0ci0+cm93X2luZm8ucGl4ZWxfZGVwdGgsCisgICAgICBwbmdfcHRyLT5yb3dfaW5mby53aWR0aCk7CisKKyAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5jb2xvcl90eXBlID0gJWQiLCBwbmdfcHRyLT5yb3dfaW5mby5jb2xvcl90eXBlKTsKKyAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT53aWR0aCA9ICVsdSIsIHBuZ19wdHItPnJvd19pbmZvLndpZHRoKTsKKyAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5jaGFubmVscyA9ICVkIiwgcG5nX3B0ci0+cm93X2luZm8uY2hhbm5lbHMpOworICAgcG5nX2RlYnVnMSgzLCAicm93X2luZm8tPmJpdF9kZXB0aCA9ICVkIiwgcG5nX3B0ci0+cm93X2luZm8uYml0X2RlcHRoKTsKKyAgIHBuZ19kZWJ1ZzEoMywgInJvd19pbmZvLT5waXhlbF9kZXB0aCA9ICVkIiwgcG5nX3B0ci0+cm93X2luZm8ucGl4ZWxfZGVwdGgpOworICAgcG5nX2RlYnVnMSgzLCAicm93X2luZm8tPnJvd2J5dGVzID0gJWx1IiwgcG5nX3B0ci0+cm93X2luZm8ucm93Ynl0ZXMpOworCisgICAvKiBDb3B5IHVzZXIncyByb3cgaW50byBidWZmZXIsIGxlYXZpbmcgcm9vbSBmb3IgZmlsdGVyIGJ5dGUuICovCisgICBwbmdfbWVtY3B5X2NoZWNrKHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxLCByb3csCisgICAgICBwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyk7CisKKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAvKiBIYW5kbGUgaW50ZXJsYWNpbmcgKi8KKyAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICYmIHBuZ19wdHItPnBhc3MgPCA2ICYmCisgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCisgICB7CisgICAgICBwbmdfZG9fd3JpdGVfaW50ZXJsYWNlKCYocG5nX3B0ci0+cm93X2luZm8pLAorICAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEsIHBuZ19wdHItPnBhc3MpOworICAgICAgLyogVGhpcyBzaG91bGQgYWx3YXlzIGdldCBjYXVnaHQgYWJvdmUsIGJ1dCBzdGlsbCAuLi4gKi8KKyAgICAgIGlmICghKHBuZ19wdHItPnJvd19pbmZvLndpZHRoKSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyAgIC8qIEhhbmRsZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgKi8KKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMpCisgICAgICBwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIpOworCisjaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKKyAgIC8qIFdyaXRlIGZpbHRlcl9tZXRob2QgNjQgKGludHJhcGl4ZWwgZGlmZmVyZW5jaW5nKSBvbmx5IGlmCisgICAgKiAxLiBMaWJwbmcgd2FzIGNvbXBpbGVkIHdpdGggUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgYW5kCisgICAgKiAyLiBMaWJwbmcgZGlkIG5vdCB3cml0ZSBhIFBORyBzaWduYXR1cmUgKHRoaXMgZmlsdGVyX21ldGhvZCBpcyBvbmx5CisgICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZAorICAgICogMy4gVGhlIGFwcGxpY2F0aW9uIGNhbGxlZCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyB3aXRoIGEgbWFzayB0aGF0CisgICAgKiAgICBpbmNsdWRlZCBQTkdfRkxBR19NTkdfRklMVEVSXzY0IGFuZAorICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kCisgICAgKiA1LiBUaGUgY29sb3JfdHlwZSBpcyBSR0Igb3IgUkdCQQorICAgICovCisgICBpZiAoKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiBQTkdfRkxBR19NTkdfRklMVEVSXzY0KSAmJgorICAgICAgKHBuZ19wdHItPmZpbHRlcl90eXBlID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpCisgICB7CisgICAgICAvKiBJbnRyYXBpeGVsIGRpZmZlcmVuY2luZyAqLworICAgICAgcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyAgIH0KKyNlbmRpZgorCisgICAvKiBGaW5kIGEgZmlsdGVyIGlmIG5lY2Vzc2FyeSwgZmlsdGVyIHRoZSByb3cgYW5kIHdyaXRlIGl0IG91dC4gKi8KKyAgIHBuZ193cml0ZV9maW5kX2ZpbHRlcihwbmdfcHRyLCAmKHBuZ19wdHItPnJvd19pbmZvKSk7CisKKyAgIGlmIChwbmdfcHRyLT53cml0ZV9yb3dfZm4gIT0gTlVMTCkKKyAgICAgICgqKHBuZ19wdHItPndyaXRlX3Jvd19mbikpKHBuZ19wdHIsIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOworfQorCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAorLyogU2V0IHRoZSBhdXRvbWF0aWMgZmx1c2ggaW50ZXJ2YWwgb3IgMCB0byB0dXJuIGZsdXNoaW5nIG9mZiAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfZmx1c2gocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IG5yb3dzKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ZsdXNoIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfcHRyLT5mbHVzaF9kaXN0ID0gKG5yb3dzIDwgMCA/IDAgOiBucm93cyk7Cit9CisKKy8qIEZsdXNoIHRoZSBjdXJyZW50IG91dHB1dCBidWZmZXJzIG5vdyAqLwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKQoreworICAgaW50IHdyb3RlX0lEQVQ7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ZsdXNoIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgYWxsIG9mIHRoZSBkYXRhICovCisgICBpZiAocG5nX3B0ci0+cm93X251bWJlciA+PSBwbmdfcHRyLT5udW1fcm93cykKKyAgICAgIHJldHVybjsKKworICAgZG8KKyAgIHsKKyAgICAgIGludCByZXQ7CisKKyAgICAgIC8qIENvbXByZXNzIHRoZSBkYXRhICovCisgICAgICByZXQgPSBkZWZsYXRlKCZwbmdfcHRyLT56c3RyZWFtLCBaX1NZTkNfRkxVU0gpOworICAgICAgd3JvdGVfSURBVCA9IDA7CisKKyAgICAgIC8qIENoZWNrIGZvciBjb21wcmVzc2lvbiBlcnJvcnMgKi8KKyAgICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLm1zZyAhPSBOVUxMKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiBlcnJvciIpOworICAgICAgfQorCisgICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpCisgICAgICB7CisgICAgICAgICAvKiBXcml0ZSB0aGUgSURBVCBhbmQgcmVzZXQgdGhlIHpsaWIgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgcG5nX3dyaXRlX0lEQVQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnpidWZfc2l6ZSk7CisgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOworICAgICAgICAgd3JvdGVfSURBVCA9IDE7CisgICAgICB9CisgICB9IHdoaWxlKHdyb3RlX0lEQVQgPT0gMSk7CisKKyAgIC8qIElmIHRoZXJlIGlzIGFueSBkYXRhIGxlZnQgdG8gYmUgb3V0cHV0LCB3cml0ZSBpdCBpbnRvIGEgbmV3IElEQVQgKi8KKyAgIGlmIChwbmdfcHRyLT56YnVmX3NpemUgIT0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpCisgICB7CisgICAgICAvKiBXcml0ZSB0aGUgSURBVCBhbmQgcmVzZXQgdGhlIHpsaWIgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgcG5nX3dyaXRlX0lEQVQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnpidWZfc2l6ZSAtIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KTsKKyAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOworICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7CisgICB9CisgICBwbmdfcHRyLT5mbHVzaF9yb3dzID0gMDsKKyAgIHBuZ19mbHVzaChwbmdfcHRyKTsKK30KKyNlbmRpZiAvKiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEICovCisKKy8qIEZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSB3cml0ZSAqLwordm9pZCBQTkdBUEkKK3BuZ19kZXN0cm95X3dyaXRlX3N0cnVjdChwbmdfc3RydWN0cHAgcG5nX3B0cl9wdHIsIHBuZ19pbmZvcHAgaW5mb19wdHJfcHRyKQoreworICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IE5VTEw7CisgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgIHBuZ19mcmVlX3B0ciBmcmVlX2ZuID0gTlVMTDsKKyAgIHBuZ192b2lkcCBtZW1fcHRyID0gTlVMTDsKKyNlbmRpZgorCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCIpOworCisgICBpZiAocG5nX3B0cl9wdHIgIT0gTlVMTCkKKyAgIHsKKyAgICAgIHBuZ19wdHIgPSAqcG5nX3B0cl9wdHI7CisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgICAgZnJlZV9mbiA9IHBuZ19wdHItPmZyZWVfZm47CisgICAgICBtZW1fcHRyID0gcG5nX3B0ci0+bWVtX3B0cjsKKyNlbmRpZgorICAgfQorCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGZyZWVfZm4gPSBwbmdfcHRyLT5mcmVlX2ZuOworICAgICAgbWVtX3B0ciA9IHBuZ19wdHItPm1lbV9wdHI7CisgICB9CisjZW5kaWYKKworICAgaWYgKGluZm9fcHRyX3B0ciAhPSBOVUxMKQorICAgICAgaW5mb19wdHIgPSAqaW5mb19wdHJfcHRyOworCisgICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGlmIChwbmdfcHRyICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX0FMTCwgLTEpOworCisjaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAorICAgICAgICBpZiAocG5nX3B0ci0+bnVtX2NodW5rX2xpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbGlzdCk7CisgICAgICAgICAgIHBuZ19wdHItPmNodW5rX2xpc3QgPSBOVUxMOworICAgICAgICAgICBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCA9IDA7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorCisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoKHBuZ192b2lkcClpbmZvX3B0ciwgKHBuZ19mcmVlX3B0cilmcmVlX2ZuLAorICAgICAgICAgKHBuZ192b2lkcCltZW1fcHRyKTsKKyNlbHNlCisgICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoKHBuZ192b2lkcClpbmZvX3B0cik7CisjZW5kaWYKKyAgICAgICppbmZvX3B0cl9wdHIgPSBOVUxMOworICAgfQorCisgICBpZiAocG5nX3B0ciAhPSBOVUxMKQorICAgeworICAgICAgcG5nX3dyaXRlX2Rlc3Ryb3kocG5nX3B0cik7CisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoKHBuZ192b2lkcClwbmdfcHRyLCAocG5nX2ZyZWVfcHRyKWZyZWVfZm4sCisgICAgICAgICAocG5nX3ZvaWRwKW1lbV9wdHIpOworI2Vsc2UKKyAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKXBuZ19wdHIpOworI2VuZGlmCisgICAgICAqcG5nX3B0cl9wdHIgPSBOVUxMOworICAgfQorfQorCisKKy8qIEZyZWUgYW55IG1lbW9yeSB1c2VkIGluIHBuZ19wdHIgc3RydWN0IChvbGQgbWV0aG9kKSAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfZGVzdHJveShwbmdfc3RydWN0cCBwbmdfcHRyKQoreworI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisgICBqbXBfYnVmIHRtcF9qbXA7IC8qIFNhdmUganVtcCBidWZmZXIgKi8KKyNlbmRpZgorICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbjsKKyAgIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbjsKKyAgIHBuZ192b2lkcCBlcnJvcl9wdHI7CisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm47CisjZW5kaWYKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZGVzdHJveSIpOworCisgICAvKiBGcmVlIGFueSBtZW1vcnkgemxpYiB1c2VzICovCisgICBkZWZsYXRlRW5kKCZwbmdfcHRyLT56c3RyZWFtKTsKKworICAgLyogRnJlZSBvdXIgbWVtb3J5LiAgcG5nX2ZyZWUgY2hlY2tzIE5VTEwgZm9yIHVzLiAqLworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+emJ1Zik7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmKTsKKyNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cHJldl9yb3cpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+c3ViX3Jvdyk7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT51cF9yb3cpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+YXZnX3Jvdyk7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wYWV0aF9yb3cpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dGltZV9idWZmZXIpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAorICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cHJldl9maWx0ZXJzKTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzKTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0cyk7CisgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5maWx0ZXJfY29zdHMpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0cyk7CisjZW5kaWYKKworI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECisgICAvKiBSZXNldCBzdHJ1Y3R1cmUgKi8KKyAgIHBuZ19tZW1jcHkodG1wX2ptcCwgcG5nX3B0ci0+am1wYnVmLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKKyNlbmRpZgorCisgICBlcnJvcl9mbiA9IHBuZ19wdHItPmVycm9yX2ZuOworICAgd2FybmluZ19mbiA9IHBuZ19wdHItPndhcm5pbmdfZm47CisgICBlcnJvcl9wdHIgPSBwbmdfcHRyLT5lcnJvcl9wdHI7CisjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAorICAgZnJlZV9mbiA9IHBuZ19wdHItPmZyZWVfZm47CisjZW5kaWYKKworICAgcG5nX21lbXNldChwbmdfcHRyLCAwLCBwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpKTsKKworICAgcG5nX3B0ci0+ZXJyb3JfZm4gPSBlcnJvcl9mbjsKKyAgIHBuZ19wdHItPndhcm5pbmdfZm4gPSB3YXJuaW5nX2ZuOworICAgcG5nX3B0ci0+ZXJyb3JfcHRyID0gZXJyb3JfcHRyOworI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKKyAgIHBuZ19wdHItPmZyZWVfZm4gPSBmcmVlX2ZuOworI2VuZGlmCisKKyNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAorICAgcG5nX21lbWNweShwbmdfcHRyLT5qbXBidWYsIHRtcF9qbXAsIHBuZ19zaXplb2Yoam1wX2J1ZikpOworI2VuZGlmCit9CisKKy8qIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWxlY3Qgb25lIG9yIG1vcmUgcm93IGZpbHRlcnMgdG8gdXNlLiAqLwordm9pZCBQTkdBUEkKK3BuZ19zZXRfZmlsdGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBtZXRob2QsIGludCBmaWx0ZXJzKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ZpbHRlciIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisgICBpZiAoKHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQgJiBQTkdfRkxBR19NTkdfRklMVEVSXzY0KSAmJgorICAgICAgKG1ldGhvZCA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpKQorICAgICAgICAgbWV0aG9kID0gUE5HX0ZJTFRFUl9UWVBFX0JBU0U7CisjZW5kaWYKKyAgIGlmIChtZXRob2QgPT0gUE5HX0ZJTFRFUl9UWVBFX0JBU0UpCisgICB7CisgICAgICBzd2l0Y2ggKGZpbHRlcnMgJiAoUE5HX0FMTF9GSUxURVJTIHwgMHgwNykpCisgICAgICB7CisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKKyAgICAgICAgIGNhc2UgNToKKyAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgIGNhc2UgNzogcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gcm93IGZpbHRlciBmb3IgbWV0aG9kIDAiKTsKKyNlbmRpZiAvKiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRCAqLworICAgICAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX05PTkU6CisgICAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19GSUxURVJfTk9ORTsgYnJlYWs7CisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKKyAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9TVUI6CisgICAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19GSUxURVJfU1VCOyBicmVhazsKKyAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9VUDoKKyAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9VUDsgYnJlYWs7CisgICAgICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfQVZHOgorICAgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfRklMVEVSX0FWRzsgYnJlYWs7CisgICAgICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfUEFFVEg6CisgICAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19GSUxURVJfUEFFVEg7IGJyZWFrOworICAgICAgICAgZGVmYXVsdDogcG5nX3B0ci0+ZG9fZmlsdGVyID0gKHBuZ19ieXRlKWZpbHRlcnM7IGJyZWFrOworI2Vsc2UKKyAgICAgICAgIGRlZmF1bHQ6IHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIHJvdyBmaWx0ZXIgZm9yIG1ldGhvZCAwIik7CisjZW5kaWYgLyogUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQgKi8KKyAgICAgIH0KKworICAgICAgLyogSWYgd2UgaGF2ZSBhbGxvY2F0ZWQgdGhlIHJvd19idWYsIHRoaXMgbWVhbnMgd2UgaGF2ZSBhbHJlYWR5IHN0YXJ0ZWQKKyAgICAgICAqIHdpdGggdGhlIGltYWdlIGFuZCB3ZSBzaG91bGQgaGF2ZSBhbGxvY2F0ZWQgYWxsIG9mIHRoZSBmaWx0ZXIgYnVmZmVycworICAgICAgICogdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQuICBJZiBwcmV2X3JvdyBpc24ndCBhbHJlYWR5IGFsbG9jYXRlZCwgdGhlbgorICAgICAgICogaXQgaXMgdG9vIGxhdGUgdG8gc3RhcnQgdXNpbmcgdGhlIGZpbHRlcnMgdGhhdCBuZWVkIGl0LCBzaW5jZSB3ZQorICAgICAgICogd2lsbCBiZSBtaXNzaW5nIHRoZSBkYXRhIGluIHRoZSBwcmV2aW91cyByb3cuICBJZiBhbiBhcHBsaWNhdGlvbgorICAgICAgICogd2FudHMgdG8gc3RhcnQgYW5kIHN0b3AgdXNpbmcgcGFydGljdWxhciBmaWx0ZXJzIGR1cmluZyBjb21wcmVzc2lvbiwKKyAgICAgICAqIGl0IHNob3VsZCBzdGFydCBvdXQgd2l0aCBhbGwgb2YgdGhlIGZpbHRlcnMsIGFuZCB0aGVuIGFkZCBhbmQKKyAgICAgICAqIHJlbW92ZSB0aGVtIGFmdGVyIHRoZSBzdGFydCBvZiBjb21wcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgaWYgKHBuZ19wdHItPnJvd19idWYgIT0gTlVMTCkKKyAgICAgIHsKKyNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAorICAgICAgICAgaWYgKChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1NVQikgJiYgcG5nX3B0ci0+c3ViX3JvdyA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3B0ci0+c3ViX3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgICAocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7CisgICAgICAgICAgICBwbmdfcHRyLT5zdWJfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9TVUI7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmICgocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9VUCkgJiYgcG5nX3B0ci0+dXBfcm93ID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9yb3cgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDYW4ndCBhZGQgVXAgZmlsdGVyIGFmdGVyIHN0YXJ0aW5nIik7CisgICAgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgJj0gflBOR19GSUxURVJfVVA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfcHRyLT51cF9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgIChwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKKyAgICAgICAgICAgICAgIHBuZ19wdHItPnVwX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfVVA7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGlmICgocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9BVkcpICYmIHBuZ19wdHItPmF2Z19yb3cgPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X3JvdyA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkNhbid0IGFkZCBBdmVyYWdlIGZpbHRlciBhZnRlciBzdGFydGluZyIpOworICAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyICY9IH5QTkdfRklMVEVSX0FWRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmF2Z19yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgIChwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKKyAgICAgICAgICAgICAgIHBuZ19wdHItPmF2Z19yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX0FWRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1BBRVRIKSAmJgorICAgICAgICAgICAgIHBuZ19wdHItPnBhZXRoX3JvdyA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfcm93ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQ2FuJ3QgYWRkIFBhZXRoIGZpbHRlciBhZnRlciBzdGFydGluZyIpOworICAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyICY9IChwbmdfYnl0ZSkoflBOR19GSUxURVJfUEFFVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX3B0ci0+cGFldGhfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7CisgICAgICAgICAgICAgICBwbmdfcHRyLT5wYWV0aF9yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyID09IFBOR19OT19GSUxURVJTKQorI2VuZGlmIC8qIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVEICovCisgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgPSBQTkdfRklMVEVSX05PTkU7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlVua25vd24gY3VzdG9tIGZpbHRlciBtZXRob2QiKTsKK30KKworLyogVGhpcyBhbGxvd3MgdXMgdG8gaW5mbHVlbmNlIHRoZSB3YXkgaW4gd2hpY2ggbGlicG5nIGNob29zZXMgdGhlICJiZXN0IgorICogZmlsdGVyIGZvciB0aGUgY3VycmVudCBzY2FubGluZS4gIFdoaWxlIHRoZSAibWluaW11bS1zdW0tb2YtYWJzb2x1dGUtCisgKiBkaWZmZXJlbmNlcyBtZXRyaWMgaXMgcmVsYXRpdmVseSBmYXN0IGFuZCBlZmZlY3RpdmUsIHRoZXJlIGlzIHNvbWUKKyAqIHF1ZXN0aW9uIGFzIHRvIHdoZXRoZXIgaXQgY2FuIGJlIGltcHJvdmVkIHVwb24gYnkgdHJ5aW5nIHRvIGtlZXAgdGhlCisgKiBmaWx0ZXJlZCBkYXRhIGdvaW5nIHRvIHpsaWIgbW9yZSBjb25zaXN0ZW50LCBob3BlZnVsbHkgcmVzdWx0aW5nIGluCisgKiBiZXR0ZXIgY29tcHJlc3Npb24uCisgKi8KKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCAgICAgIC8qIEdSUiA5NzAxMTYgKi8KK3ZvaWQgUE5HQVBJCitwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBoZXVyaXN0aWNfbWV0aG9kLAorICAgaW50IG51bV93ZWlnaHRzLCBwbmdfZG91YmxlcCBmaWx0ZXJfd2VpZ2h0cywKKyAgIHBuZ19kb3VibGVwIGZpbHRlcl9jb3N0cykKK3sKKyAgIGludCBpOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MiKTsKKworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIGlmIChoZXVyaXN0aWNfbWV0aG9kID49IFBOR19GSUxURVJfSEVVUklTVElDX0xBU1QpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBmaWx0ZXIgaGV1cmlzdGljIG1ldGhvZCIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoaGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19ERUZBVUxUKQorICAgeworICAgICAgaGV1cmlzdGljX21ldGhvZCA9IFBOR19GSUxURVJfSEVVUklTVElDX1VOV0VJR0hURUQ7CisgICB9CisKKyAgIGlmIChudW1fd2VpZ2h0cyA8IDAgfHwgZmlsdGVyX3dlaWdodHMgPT0gTlVMTCB8fAorICAgICAgaGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19VTldFSUdIVEVEKQorICAgeworICAgICAgbnVtX3dlaWdodHMgPSAwOworICAgfQorCisgICBwbmdfcHRyLT5udW1fcHJldl9maWx0ZXJzID0gKHBuZ19ieXRlKW51bV93ZWlnaHRzOworICAgcG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9IChwbmdfYnl0ZSloZXVyaXN0aWNfbWV0aG9kOworCisgICBpZiAobnVtX3dlaWdodHMgPiAwKQorICAgeworICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVycyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+cHJldl9maWx0ZXJzID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAocG5nX3VpbnRfMzIpKHBuZ19zaXplb2YocG5nX2J5dGUpICogbnVtX3dlaWdodHMpKTsKKworICAgICAgICAgLyogVG8gbWFrZSBzdXJlIHRoYXQgdGhlIHdlaWdodGluZyBzdGFydHMgb3V0IGZhaXJseSAqLworICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV93ZWlnaHRzOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbaV0gPSAyNTU7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHMgPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3NpemVvZihwbmdfdWludF8xNikgKiBudW1fd2VpZ2h0cykpOworCisgICAgICAgICBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHMgPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3NpemVvZihwbmdfdWludF8xNikgKiBudW1fd2VpZ2h0cykpOworICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV93ZWlnaHRzOyBpKyspCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbaV0gPQorICAgICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbaV0gPSBQTkdfV0VJR0hUX0ZBQ1RPUjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV93ZWlnaHRzOyBpKyspCisgICAgICB7CisgICAgICAgICBpZiAoZmlsdGVyX3dlaWdodHNbaV0gPCAwLjApCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbaV0gPQorICAgICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbaV0gPSBQTkdfV0VJR0hUX0ZBQ1RPUjsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tpXSA9CisgICAgICAgICAgICAgICAocG5nX3VpbnRfMTYpKChkb3VibGUpUE5HX1dFSUdIVF9GQUNUT1IqZmlsdGVyX3dlaWdodHNbaV0rMC41KTsKKyAgICAgICAgICAgIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2ldID0KKyAgICAgICAgICAgICAgIChwbmdfdWludF8xNikoKGRvdWJsZSlQTkdfV0VJR0hUX0ZBQ1RPUi9maWx0ZXJfd2VpZ2h0c1tpXSswLjUpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBJZiwgaW4gdGhlIGZ1dHVyZSwgdGhlcmUgYXJlIG90aGVyIGZpbHRlciBtZXRob2RzLCB0aGlzIHdvdWxkCisgICAgKiBuZWVkIHRvIGJlIGJhc2VkIG9uIHBuZ19wdHItPmZpbHRlci4KKyAgICAqLworICAgaWYgKHBuZ19wdHItPmZpbHRlcl9jb3N0cyA9PSBOVUxMKQorICAgeworICAgICAgcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzID0gKHBuZ191aW50XzE2cClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAocG5nX3VpbnRfMzIpKHBuZ19zaXplb2YocG5nX3VpbnRfMTYpICogUE5HX0ZJTFRFUl9WQUxVRV9MQVNUKSk7CisKKyAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHMgPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgIChwbmdfdWludF8zMikocG5nX3NpemVvZihwbmdfdWludF8xNikgKiBQTkdfRklMVEVSX1ZBTFVFX0xBU1QpKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IFBOR19GSUxURVJfVkFMVUVfTEFTVDsgaSsrKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tpXSA9CisgICAgICAgICBwbmdfcHRyLT5maWx0ZXJfY29zdHNbaV0gPSBQTkdfQ09TVF9GQUNUT1I7CisgICAgICB9CisgICB9CisKKyAgIC8qIEhlcmUgaXMgd2hlcmUgd2Ugc2V0IHRoZSByZWxhdGl2ZSBjb3N0cyBvZiB0aGUgZGlmZmVyZW50IGZpbHRlcnMuICBXZQorICAgICogc2hvdWxkIHRha2UgdGhlIGRlc2lyZWQgY29tcHJlc3Npb24gbGV2ZWwgaW50byBhY2NvdW50IHdoZW4gc2V0dGluZworICAgICogdGhlIGNvc3RzLCBzbyB0aGF0IFBhZXRoLCBmb3IgaW5zdGFuY2UsIGhhcyBhIGhpZ2ggcmVsYXRpdmUgY29zdCBhdCBsb3cKKyAgICAqIGNvbXByZXNzaW9uIGxldmVscywgd2hpbGUgaXQgaGFzIGEgbG93ZXIgcmVsYXRpdmUgY29zdCBhdCBoaWdoZXIKKyAgICAqIGNvbXByZXNzaW9uIHNldHRpbmdzLiAgVGhlIGZpbHRlciB0eXBlcyBhcmUgaW4gb3JkZXIgb2YgaW5jcmVhc2luZworICAgICogcmVsYXRpdmUgY29zdCwgc28gaXQgd291bGQgYmUgcG9zc2libGUgdG8gZG8gdGhpcyB3aXRoIGFuIGFsZ29yaXRobS4KKyAgICAqLworICAgZm9yIChpID0gMDsgaSA8IFBOR19GSUxURVJfVkFMVUVfTEFTVDsgaSsrKQorICAgeworICAgICAgaWYgKGZpbHRlcl9jb3N0cyA9PSBOVUxMIHx8IGZpbHRlcl9jb3N0c1tpXSA8IDAuMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbaV0gPQorICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW2ldID0gUE5HX0NPU1RfRkFDVE9SOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZmlsdGVyX2Nvc3RzW2ldID49IDEuMCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbaV0gPQorICAgICAgICAgICAgKHBuZ191aW50XzE2KSgoZG91YmxlKVBOR19DT1NUX0ZBQ1RPUiAvIGZpbHRlcl9jb3N0c1tpXSArIDAuNSk7CisgICAgICAgICBwbmdfcHRyLT5maWx0ZXJfY29zdHNbaV0gPQorICAgICAgICAgICAgKHBuZ191aW50XzE2KSgoZG91YmxlKVBOR19DT1NUX0ZBQ1RPUiAqIGZpbHRlcl9jb3N0c1tpXSArIDAuNSk7CisgICAgICB9CisgICB9Cit9CisjZW5kaWYgLyogUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQgKi8KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGxldmVsKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0NVU1RPTV9MRVZFTDsKKyAgIHBuZ19wdHItPnpsaWJfbGV2ZWwgPSBsZXZlbDsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBtZW1fbGV2ZWwpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0NVU1RPTV9NRU1fTEVWRUw7CisgICBwbmdfcHRyLT56bGliX21lbV9sZXZlbCA9IG1lbV9sZXZlbDsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IHN0cmF0ZWd5KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5Iik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0NVU1RPTV9TVFJBVEVHWTsKKyAgIHBuZ19wdHItPnpsaWJfc3RyYXRlZ3kgPSBzdHJhdGVneTsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IHdpbmRvd19iaXRzKQoreworICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgIGlmICh3aW5kb3dfYml0cyA+IDE1KQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gd2luZG93cyA8PSAzMmsgc3VwcG9ydGVkIGJ5IFBORyIpOworICAgZWxzZSBpZiAod2luZG93X2JpdHMgPCA4KQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gd2luZG93cyA+PSAyNTYgc3VwcG9ydGVkIGJ5IFBORyIpOworI2lmbmRlZiBXQklUU184X09LCisgICAvKiBBdm9pZCBsaWJwbmcgYnVnIHdpdGggMjU2LWJ5dGUgd2luZG93cyAqLworICAgaWYgKHdpbmRvd19iaXRzID09IDgpCisgICAgIHsKKyAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQ29tcHJlc3Npb24gd2luZG93IGlzIGJlaW5nIHJlc2V0IHRvIDUxMiIpOworICAgICAgIHdpbmRvd19iaXRzID0gOTsKKyAgICAgfQorI2VuZGlmCisgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0NVU1RPTV9XSU5ET1dfQklUUzsKKyAgIHBuZ19wdHItPnpsaWJfd2luZG93X2JpdHMgPSB3aW5kb3dfYml0czsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBtZXRob2QpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kIik7CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBpZiAobWV0aG9kICE9IDgpCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT25seSBjb21wcmVzc2lvbiBtZXRob2QgOCBpcyBzdXBwb3J0ZWQgYnkgUE5HIik7CisgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0NVU1RPTV9NRVRIT0Q7CisgICBwbmdfcHRyLT56bGliX21ldGhvZCA9IG1ldGhvZDsKK30KKwordm9pZCBQTkdBUEkKK3BuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ193cml0ZV9zdGF0dXNfcHRyIHdyaXRlX3Jvd19mbikKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfcHRyLT53cml0ZV9yb3dfZm4gPSB3cml0ZV9yb3dfZm47Cit9CisKKyNpZmRlZiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyCisgICB3cml0ZV91c2VyX3RyYW5zZm9ybV9mbikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbiIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19VU0VSX1RSQU5TRk9STTsKKyAgIHBuZ19wdHItPndyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuID0gd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm47Cit9CisjZW5kaWYKKworCisjaWZkZWYgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECit2b2lkIFBOR0FQSQorcG5nX3dyaXRlX3BuZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCisgICAgICAgICAgICAgIGludCB0cmFuc2Zvcm1zLCB2b2lkcCBwYXJhbXMpCit7CisgICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIFdyaXRlIHRoZSBmaWxlIGhlYWRlciBpbmZvcm1hdGlvbi4gKi8KKyAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgLyogLS0tLS0tIHRoZXNlIHRyYW5zZm9ybWF0aW9ucyBkb24ndCB0b3VjaCB0aGUgaW5mbyBzdHJ1Y3R1cmUgLS0tLS0tLSAqLworCisjaWZkZWYgUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQKKyAgIC8qIEludmVydCBtb25vY2hyb21lIHBpeGVscyAqLworICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PKQorICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRAorICAgLyogU2hpZnQgdGhlIHBpeGVscyB1cCB0byBhIGxlZ2FsIGJpdCBkZXB0aCBhbmQgZmlsbCBpbgorICAgICogYXMgYXBwcm9wcmlhdGUgdG8gY29ycmVjdGx5IHNjYWxlIHRoZSBpbWFnZS4KKyAgICAqLworICAgaWYgKCh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TSElGVCkKKyAgICAgICAgICAgICAgICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQklUKSkKKyAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJmluZm9fcHRyLT5zaWdfYml0KTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVECisgICAvKiBQYWNrIHBpeGVscyBpbnRvIGJ5dGVzICovCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fUEFDS0lORykKKyAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRAorICAgLyogU3dhcCBsb2NhdGlvbiBvZiBhbHBoYSBieXRlcyBmcm9tIEFSR0IgdG8gUkdCQSAqLworICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEpCisgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVECisgICAvKiBQYWNrIFhSR0IvUkdCWC9BUkdCL1JHQkEgaW50byAqIFJHQiAoNCBjaGFubmVscyAtPiAzIGNoYW5uZWxzKSAqLworICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9BRlRFUikKKyAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDAsIFBOR19GSUxMRVJfQUZURVIpOworICAgZWxzZSBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0JFRk9SRSkKKyAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDAsIFBOR19GSUxMRVJfQkVGT1JFKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQKKyAgIC8qIEZsaXAgQkdSIHBpeGVscyB0byBSR0IgKi8KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9CR1IpCisgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVECisgICAvKiBTd2FwIGJ5dGVzIG9mIDE2LWJpdCBmaWxlcyB0byBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TV0FQX0VORElBTikKKyAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRAorICAgLyogU3dhcCBiaXRzIG9mIDEsIDIsIDQgYml0IHBhY2tlZCBwaXhlbCBmb3JtYXRzICovCisgICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVApCisgICAgICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19wdHIpOworI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgLyogSW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIGZyb20gb3BhY2l0eSB0byB0cmFuc3BhcmVuY3kgKi8KKyAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEpCisgICAgICBwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfcHRyKTsKKyNlbmRpZgorCisgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgb2YgdHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgLyogV3JpdGUgdGhlIGJpdHMgKi8KKyAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19JREFUKQorICAgICAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsKKworICAgLyogSXQgaXMgUkVRVUlSRUQgdG8gY2FsbCB0aGlzIHRvIGZpbmlzaCB3cml0aW5nIHRoZSByZXN0IG9mIHRoZSBmaWxlICovCisgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgdHJhbnNmb3JtcyA9IHRyYW5zZm9ybXM7IC8qIFF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICBwYXJhbXMgPSBwYXJhbXM7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfV1JJVEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbGlicG5nL3BuZ3d0cmFuLmMgYi9jb20zMi9saWIvbGlicG5nL3BuZ3d0cmFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlOWI5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9saWJwbmcvcG5nd3RyYW4uYwpAQCAtMCwwICsxLDU4MiBAQAorCisvKiBwbmd3dHJhbi5jIC0gdHJhbnNmb3JtcyB0aGUgZGF0YSBpbiBhIHJvdyBmb3IgUE5HIHdyaXRlcnMKKyAqCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuMi40MyBbRmVicnVhcnkgMjUsIDIwMTBdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaAorICovCisKKyNkZWZpbmUgUE5HX0lOVEVSTkFMCisjZGVmaW5lIFBOR19OT19QRURBTlRJQ19XQVJOSU5HUworI2luY2x1ZGUgInBuZy5oIgorI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKKworLyogVHJhbnNmb3JtIHRoZSBkYXRhIGFjY29yZGluZyB0byB0aGUgdXNlcidzIHdpc2hlcy4gIFRoZSBvcmRlciBvZgorICogdHJhbnNmb3JtYXRpb25zIGlzIHNpZ25pZmljYW50LgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb193cml0ZV90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX3RyYW5zZm9ybWF0aW9ucyIpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19VU0VSX1RSQU5TRk9STSkKKyAgICAgIGlmIChwbmdfcHRyLT53cml0ZV91c2VyX3RyYW5zZm9ybV9mbiAhPSBOVUxMKQorICAgICAgICAoKihwbmdfcHRyLT53cml0ZV91c2VyX3RyYW5zZm9ybV9mbikpIC8qIFVzZXIgd3JpdGUgdHJhbnNmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKi8KKyAgICAgICAgICAocG5nX3B0ciwgICAgICAgICAgICAgICAgICAgIC8qIHBuZ19wdHIgKi8KKyAgICAgICAgICAgJihwbmdfcHRyLT5yb3dfaW5mbyksICAgICAgIC8qIHJvd19pbmZvOiAgICAgKi8KKyAgICAgICAgICAgICAvKiAgcG5nX3VpbnRfMzIgd2lkdGg7ICAgICAgICAgIHdpZHRoIG9mIHJvdyAqLworICAgICAgICAgICAgIC8qICBwbmdfdWludF8zMiByb3dieXRlczsgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIHJvdyAqLworICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBjb2xvcl90eXBlOyAgICAgICAgY29sb3IgdHlwZSBvZiBwaXhlbHMgKi8KKyAgICAgICAgICAgICAvKiAgcG5nX2J5dGUgYml0X2RlcHRoOyAgICAgICAgIGJpdCBkZXB0aCBvZiBzYW1wbGVzICovCisgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGNoYW5uZWxzOyAgICAgICAgICBudW1iZXIgb2YgY2hhbm5lbHMgKDEtNCkgKi8KKyAgICAgICAgICAgICAvKiAgcG5nX2J5dGUgcGl4ZWxfZGVwdGg7ICAgICAgIGJpdHMgcGVyIHBpeGVsIChkZXB0aCpjaGFubmVscykgKi8KKyAgICAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEpOyAgICAgIC8qIHN0YXJ0IG9mIHBpeGVsIGRhdGEgZm9yIHJvdyAqLworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRklMTEVSKQorICAgICAgcG5nX2RvX3N0cmlwX2ZpbGxlcigmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEsCisgICAgICAgICBwbmdfcHRyLT5mbGFncyk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQorICAgICAgcG5nX2RvX3BhY2tzd2FwKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDSykKKyAgICAgIHBuZ19kb19wYWNrKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKKyAgICAgICAgIChwbmdfdWludF8zMilwbmdfcHRyLT5iaXRfZGVwdGgpOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVECisgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NXQVBfQllURVMpCisgICAgICBwbmdfZG9fc3dhcCgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOworI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TSElGVCkKKyAgICAgIHBuZ19kb19zaGlmdCgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEsCisgICAgICAgICAmKHBuZ19wdHItPnNoaWZ0KSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKKyAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU1dBUF9BTFBIQSkKKyAgICAgIHBuZ19kb193cml0ZV9zd2FwX2FscGhhKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfQUxQSEEpCisgICAgICBwbmdfZG9fd3JpdGVfaW52ZXJ0X2FscGhhKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CR1IpCisgICAgICBwbmdfZG9fYmdyKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7CisjZW5kaWYKKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRAorICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfTU9OTykKKyAgICAgIHBuZ19kb19pbnZlcnQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKKyNlbmRpZgorfQorCisjaWZkZWYgUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVECisvKiBQYWNrIHBpeGVscyBpbnRvIGJ5dGVzLiAgUGFzcyB0aGUgdHJ1ZSBiaXQgZGVwdGggaW4gYml0X2RlcHRoLiAgVGhlCisgKiByb3dfaW5mbyBiaXQgZGVwdGggc2hvdWxkIGJlIDggKG9uZSBwaXhlbCBwZXIgYnl0ZSkuICBUaGUgY2hhbm5lbHMKKyAqIHNob3VsZCBiZSAxICh0aGlzIG9ubHkgaGFwcGVucyBvbiBncmF5c2NhbGUgYW5kIHBhbGV0dGVkIGltYWdlcykuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX3BhY2socG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgYml0X2RlcHRoKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcGFjayIpOworCisgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4ICYmCisjaWZkZWYgUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVECisgICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgorI2VuZGlmCisgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPT0gMSkKKyAgIHsKKyAgICAgIHN3aXRjaCAoKGludCliaXRfZGVwdGgpCisgICAgICB7CisgICAgICAgICBjYXNlIDE6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgaW50IG1hc2ssIHY7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgbWFzayA9IDB4ODA7CisgICAgICAgICAgICB2ID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCpzcCAhPSAwKQorICAgICAgICAgICAgICAgICAgdiB8PSBtYXNrOworICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgICAgIGlmIChtYXNrID4gMSkKKyAgICAgICAgICAgICAgICAgIG1hc2sgPj49IDE7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtYXNrID0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2OworICAgICAgICAgICAgICAgICAgZHArKzsKKyAgICAgICAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hc2sgIT0gMHg4MCkKKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBjYXNlIDI6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgaW50IHNoaWZ0LCB2OworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKworICAgICAgICAgICAgc3AgPSByb3c7CisgICAgICAgICAgICBkcCA9IHJvdzsKKyAgICAgICAgICAgIHNoaWZ0ID0gNjsKKyAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgdmFsdWU7CisKKyAgICAgICAgICAgICAgIHZhbHVlID0gKHBuZ19ieXRlKSgqc3AgJiAweDAzKTsKKyAgICAgICAgICAgICAgIHYgfD0gKHZhbHVlIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2hpZnQgPSA2OworICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7CisgICAgICAgICAgICAgICAgICBkcCsrOworICAgICAgICAgICAgICAgICAgdiA9IDA7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBzaGlmdCAtPSAyOworICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA2KQorICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7CisgICAgICAgICAgICBpbnQgc2hpZnQsIHY7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBzcCA9IHJvdzsKKyAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgc2hpZnQgPSA0OworICAgICAgICAgICAgdiA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSB2YWx1ZTsKKworICAgICAgICAgICAgICAgdmFsdWUgPSAocG5nX2J5dGUpKCpzcCAmIDB4MGYpOworICAgICAgICAgICAgICAgdiB8PSAodmFsdWUgPDwgc2hpZnQpOworCisgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNDsKKyAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2OworICAgICAgICAgICAgICAgICAgZHArKzsKKyAgICAgICAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc2hpZnQgLT0gNDsKKworICAgICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA0KQorICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSAocG5nX2J5dGUpYml0X2RlcHRoOworICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShiaXRfZGVwdGggKiByb3dfaW5mby0+Y2hhbm5lbHMpOworICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwKKyAgICAgICAgIHJvd19pbmZvLT53aWR0aCk7CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQKKy8qIFNoaWZ0IHBpeGVsIHZhbHVlcyB0byB0YWtlIGFkdmFudGFnZSBvZiB3aG9sZSByYW5nZS4gIFBhc3MgdGhlCisgKiB0cnVlIG51bWJlciBvZiBiaXRzIGluIGJpdF9kZXB0aC4gIFRoZSByb3cgc2hvdWxkIGJlIHBhY2tlZAorICogYWNjb3JkaW5nIHRvIHJvd19pbmZvLT5iaXRfZGVwdGguICBUaHVzLCBpZiB5b3UgaGFkIGEgcm93IG9mCisgKiBiaXQgZGVwdGggNCwgYnV0IHRoZSBwaXhlbHMgb25seSBoYWQgdmFsdWVzIGZyb20gMCB0byA3LCB5b3UKKyAqIHdvdWxkIHBhc3MgMyBhcyBiaXRfZGVwdGgsIGFuZCB0aGlzIHJvdXRpbmUgd291bGQgdHJhbnNsYXRlIHRoZQorICogZGF0YSB0byAwIHRvIDE1LgorICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb19zaGlmdChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29sb3JfOHAgYml0X2RlcHRoKQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fc2hpZnQiKTsKKworI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYKKyNlbHNlCisgICBpZiAoCisjZW5kaWYKKyAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCisgICB7CisgICAgICBpbnQgc2hpZnRfc3RhcnRbNF0sIHNoaWZ0X2RlY1s0XTsKKyAgICAgIGludCBjaGFubmVscyA9IDA7CisKKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQorICAgICAgeworICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+cmVkOworICAgICAgICAgc2hpZnRfZGVjW2NoYW5uZWxzXSA9IGJpdF9kZXB0aC0+cmVkOworICAgICAgICAgY2hhbm5lbHMrKzsKKyAgICAgICAgIHNoaWZ0X3N0YXJ0W2NoYW5uZWxzXSA9IHJvd19pbmZvLT5iaXRfZGVwdGggLSBiaXRfZGVwdGgtPmdyZWVuOworICAgICAgICAgc2hpZnRfZGVjW2NoYW5uZWxzXSA9IGJpdF9kZXB0aC0+Z3JlZW47CisgICAgICAgICBjaGFubmVscysrOworICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Ymx1ZTsKKyAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmJsdWU7CisgICAgICAgICBjaGFubmVscysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Z3JheTsKKyAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmdyYXk7CisgICAgICAgICBjaGFubmVscysrOworICAgICAgfQorICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCisgICAgICB7CisgICAgICAgICBzaGlmdF9zdGFydFtjaGFubmVsc10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gYml0X2RlcHRoLT5hbHBoYTsKKyAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmFscGhhOworICAgICAgICAgY2hhbm5lbHMrKzsKKyAgICAgIH0KKworICAgICAgLyogV2l0aCBsb3cgcm93IGRlcHRocywgY291bGQgb25seSBiZSBncmF5c2NhbGUsIHNvIG9uZSBjaGFubmVsICovCisgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7CisgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgcG5nX2J5dGUgbWFzazsKKyAgICAgICAgIHBuZ191aW50XzMyIHJvd19ieXRlcyA9IHJvd19pbmZvLT5yb3dieXRlczsKKworICAgICAgICAgaWYgKGJpdF9kZXB0aC0+Z3JheSA9PSAxICYmIHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMikKKyAgICAgICAgICAgIG1hc2sgPSAweDU1OworICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA0ICYmIGJpdF9kZXB0aC0+Z3JheSA9PSAzKQorICAgICAgICAgICAgbWFzayA9IDB4MTE7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXNrID0gMHhmZjsKKworICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19ieXRlczsgaSsrLCBicCsrKQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKKyAgICAgICAgICAgIGludCBqOworCisgICAgICAgICAgICB2ID0gKmJwOworICAgICAgICAgICAgKmJwID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IHNoaWZ0X3N0YXJ0WzBdOyBqID4gLXNoaWZ0X2RlY1swXTsgaiAtPSBzaGlmdF9kZWNbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoaiA+IDApCisgICAgICAgICAgICAgICAgICAqYnAgfD0gKHBuZ19ieXRlKSgodiA8PCBqKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgKmJwIHw9IChwbmdfYnl0ZSkoKHYgPj4gKC1qKSkgJiBtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsKKyAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICBwbmdfdWludF8zMiBpc3RvcCA9IGNoYW5uZWxzICogcm93X2luZm8tPndpZHRoOworCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKywgYnArKykKKyAgICAgICAgIHsKKworICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgaW50IGMgPSAoaW50KShpJWNoYW5uZWxzKTsKKworICAgICAgICAgICAgdiA9ICpicDsKKyAgICAgICAgICAgICpicCA9IDA7CisgICAgICAgICAgICBmb3IgKGogPSBzaGlmdF9zdGFydFtjXTsgaiA+IC1zaGlmdF9kZWNbY107IGogLT0gc2hpZnRfZGVjW2NdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKGogPiAwKQorICAgICAgICAgICAgICAgICAgKmJwIHw9IChwbmdfYnl0ZSkoKHYgPDwgaikgJiAweGZmKTsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICpicCB8PSAocG5nX2J5dGUpKCh2ID4+ICgtaikpICYgMHhmZik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwbmdfYnl0ZXAgYnA7CisgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSBjaGFubmVscyAqIHJvd19pbmZvLT53aWR0aDsKKworICAgICAgICAgZm9yIChicCA9IHJvdywgaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgaW50IGMgPSAoaW50KShpJWNoYW5uZWxzKTsKKyAgICAgICAgICAgIHBuZ191aW50XzE2IHZhbHVlLCB2OworICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgIHYgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMTYpKCpicCkgPDwgOCkgKyAqKGJwICsgMSkpOworICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICAgICAgZm9yIChqID0gc2hpZnRfc3RhcnRbY107IGogPiAtc2hpZnRfZGVjW2NdOyBqIC09IHNoaWZ0X2RlY1tjXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChqID4gMCkKKyAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IChwbmdfdWludF8xNikoKHYgPDwgaikgJiAocG5nX3VpbnRfMTYpMHhmZmZmKTsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IChwbmdfdWludF8xNikoKHYgPj4gKC1qKSkgJiAocG5nX3VpbnRfMTYpMHhmZmZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSh2YWx1ZSA+PiA4KTsKKyAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSh2YWx1ZSAmIDB4ZmYpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX3dyaXRlX3N3YXBfYWxwaGEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKK3sKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX3N3YXBfYWxwaGEiKTsKKworI2lmZGVmIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAorICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwpCisjZW5kaWYKKyAgIHsKKyAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICB7CisgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gQVJHQiB0byBSR0JBICovCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEFBUlJHR0JCIHRvIFJSR0dCQkFBICovCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKworICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZVsyXTsKKyAgICAgICAgICAgICAgIHNhdmVbMF0gPSAqKHNwKyspOworICAgICAgICAgICAgICAgc2F2ZVsxXSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gc2F2ZVswXTsKKyAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICAgIHsKKyAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBBRyB0byBHQSAqLworICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9IHNhdmU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gQUFHRyB0byBHR0FBICovCisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKworICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZVsyXTsKKyAgICAgICAgICAgICAgIHNhdmVbMF0gPSAqKHNwKyspOworICAgICAgICAgICAgICAgc2F2ZVsxXSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9IHNhdmVbMF07CisgICAgICAgICAgICAgICAqKGRwKyspID0gc2F2ZVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX2RvX3dyaXRlX2ludmVydF9hbHBoYShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQoreworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fd3JpdGVfaW52ZXJ0X2FscGhhIik7CisKKyNpZmRlZiBQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQKKyAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQorI2VuZGlmCisgICB7CisgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgeworICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIFJHQkEgKi8KKyAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIERvZXMgbm90aGluZworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHNwKz0zOyBkcCA9IHNwOworICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoMjU1IC0gKihzcCsrKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gUlJHR0JCQUEgKi8KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IGRwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBEb2VzIG5vdGhpbmcKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBzcCs9NjsgZHAgPSBzcDsKKyAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKDI1NSAtICooc3ArKykpOworICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoMjU1IC0gKihzcCsrKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQorICAgICAgeworICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIEdBICovCisgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOworICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoMjU1IC0gKihzcCsrKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gR0dBQSAqLworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIERvZXMgbm90aGluZworICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7CisgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBzcCs9MjsgZHAgPSBzcDsKKyAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKDI1NSAtICooc3ArKykpOworICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoMjU1IC0gKihzcCsrKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisvKiBVbmRvZXMgaW50cmFwaXhlbCBkaWZmZXJlbmNpbmcgICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ19kb193cml0ZV9pbnRyYXBpeGVsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ19kb193cml0ZV9pbnRyYXBpeGVsIik7CisKKyAgIGlmICgKKyNpZmRlZiBQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQKKyAgICAgICByb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMICYmCisjZW5kaWYKKyAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpCisgICB7CisgICAgICBpbnQgYnl0ZXNfcGVyX3BpeGVsOworICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19ieXRlcCBycDsKKyAgICAgICAgIHBuZ191aW50XzMyIGk7CisKKyAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICAgICAgICAgICBieXRlc19wZXJfcGl4ZWwgPSAzOworICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQorICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNDsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKywgcnAgKz0gYnl0ZXNfcGVyX3BpeGVsKQorICAgICAgICAgeworICAgICAgICAgICAgKihycCkgICA9IChwbmdfYnl0ZSkoKCpycCAgICAgLSAqKHJwKzEpKSYweGZmKTsKKyAgICAgICAgICAgICoocnArMikgPSAocG5nX2J5dGUpKCgqKHJwKzIpIC0gKihycCsxKSkmMHhmZik7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQorICAgICAgeworICAgICAgICAgcG5nX2J5dGVwIHJwOworICAgICAgICAgcG5nX3VpbnRfMzIgaTsKKworICAgICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKKyAgICAgICAgICAgIGJ5dGVzX3Blcl9waXhlbCA9IDY7CisgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCisgICAgICAgICAgICBieXRlc19wZXJfcGl4ZWwgPSA4OworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfdWludF8zMiBzMCAgID0gKCoocnAgICkgPDwgOCkgfCAqKHJwKzEpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgczEgICA9ICgqKHJwKzIpIDw8IDgpIHwgKihycCszKTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHMyICAgPSAoKihycCs0KSA8PCA4KSB8ICoocnArNSk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByZWQgID0gKHBuZ191aW50XzMyKSgoczAgLSBzMSkgJiAweGZmZmZMKTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGJsdWUgPSAocG5nX3VpbnRfMzIpKChzMiAtIHMxKSAmIDB4ZmZmZkwpOworICAgICAgICAgICAgKihycCAgKSA9IChwbmdfYnl0ZSkoKHJlZCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgKihycCsxKSA9IChwbmdfYnl0ZSkocmVkICYgMHhmZik7CisgICAgICAgICAgICAqKHJwKzQpID0gKHBuZ19ieXRlKSgoYmx1ZSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgKihycCs1KSA9IChwbmdfYnl0ZSkoYmx1ZSAmIDB4ZmYpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorI2VuZGlmIC8qIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEICovCisjZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xpYnBuZy9wbmd3dXRpbC5jIGIvY29tMzIvbGliL2xpYnBuZy9wbmd3dXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWY1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbGlicG5nL3BuZ3d1dGlsLmMKQEAgLTAsMCArMSwyODMyIEBACisKKy8qIHBuZ3d1dGlsLmMgLSB1dGlsaXRpZXMgdG8gd3JpdGUgYSBQTkcgZmlsZQorICoKKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjQzIFtGZWJydWFyeSAyNSwgMjAxMF0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCisgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCisgKi8KKworI2RlZmluZSBQTkdfSU5URVJOQUwKKyNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTCisjaW5jbHVkZSAicG5nLmgiCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAorCisvKiBQbGFjZSBhIDMyLWJpdCBudW1iZXIgaW50byBhIGJ1ZmZlciBpbiBQTkcgYnl0ZSBvcmRlci4gIFdlIHdvcmsKKyAqIHdpdGggdW5zaWduZWQgbnVtYmVycyBmb3IgY29udmVuaWVuY2UsIGFsdGhvdWdoIG9uZSBzdXBwb3J0ZWQKKyAqIGFuY2lsbGFyeSBjaHVuayB1c2VzIHNpZ25lZCAodHdvJ3MgY29tcGxlbWVudCkgbnVtYmVycy4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ19zYXZlX3VpbnRfMzIocG5nX2J5dGVwIGJ1ZiwgcG5nX3VpbnRfMzIgaSkKK3sKKyAgIGJ1ZlswXSA9IChwbmdfYnl0ZSkoKGkgPj4gMjQpICYgMHhmZik7CisgICBidWZbMV0gPSAocG5nX2J5dGUpKChpID4+IDE2KSAmIDB4ZmYpOworICAgYnVmWzJdID0gKHBuZ19ieXRlKSgoaSA+PiA4KSAmIDB4ZmYpOworICAgYnVmWzNdID0gKHBuZ19ieXRlKShpICYgMHhmZik7Cit9CisKKy8qIFRoZSBwbmdfc2F2ZV9pbnRfMzIgZnVuY3Rpb24gYXNzdW1lcyBpbnRlZ2VycyBhcmUgc3RvcmVkIGluIHR3bydzCisgKiBjb21wbGVtZW50IGZvcm1hdC4gIElmIHRoaXMgaXNuJ3QgdGhlIGNhc2UsIHRoZW4gdGhpcyByb3V0aW5lIG5lZWRzIHRvCisgKiBiZSBtb2RpZmllZCB0byB3cml0ZSBkYXRhIGluIHR3bydzIGNvbXBsZW1lbnQgZm9ybWF0LgorICovCit2b2lkIFBOR0FQSQorcG5nX3NhdmVfaW50XzMyKHBuZ19ieXRlcCBidWYsIHBuZ19pbnRfMzIgaSkKK3sKKyAgIGJ1ZlswXSA9IChwbmdfYnl0ZSkoKGkgPj4gMjQpICYgMHhmZik7CisgICBidWZbMV0gPSAocG5nX2J5dGUpKChpID4+IDE2KSAmIDB4ZmYpOworICAgYnVmWzJdID0gKHBuZ19ieXRlKSgoaSA+PiA4KSAmIDB4ZmYpOworICAgYnVmWzNdID0gKHBuZ19ieXRlKShpICYgMHhmZik7Cit9CisKKy8qIFBsYWNlIGEgMTYtYml0IG51bWJlciBpbnRvIGEgYnVmZmVyIGluIFBORyBieXRlIG9yZGVyLgorICogVGhlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCB1bnNpZ25lZCBpbnQsIG5vdCBwbmdfdWludF8xNiwKKyAqIGp1c3QgdG8gYXZvaWQgcG90ZW50aWFsIHByb2JsZW1zIG9uIHByZS1BTlNJIEMgY29tcGlsZXJzLgorICovCit2b2lkIFBOR0FQSQorcG5nX3NhdmVfdWludF8xNihwbmdfYnl0ZXAgYnVmLCB1bnNpZ25lZCBpbnQgaSkKK3sKKyAgIGJ1ZlswXSA9IChwbmdfYnl0ZSkoKGkgPj4gOCkgJiAweGZmKTsKKyAgIGJ1ZlsxXSA9IChwbmdfYnl0ZSkoaSAmIDB4ZmYpOworfQorCisvKiBTaW1wbGUgZnVuY3Rpb24gdG8gd3JpdGUgdGhlIHNpZ25hdHVyZS4gIElmIHdlIGhhdmUgYWxyZWFkeSB3cml0dGVuCisgKiB0aGUgbWFnaWMgYnl0ZXMgb2YgdGhlIHNpZ25hdHVyZSwgb3IgbW9yZSBsaWtlbHksIHRoZSBQTkcgc3RyZWFtIGlzCisgKiBiZWluZyBlbWJlZGRlZCBpbnRvIGFub3RoZXIgc3RyZWFtIGFuZCBkb2Vzbid0IG5lZWQgaXRzIG93biBzaWduYXR1cmUsCisgKiB3ZSBzaG91bGQgY2FsbCBwbmdfc2V0X3NpZ19ieXRlcygpIHRvIHRlbGwgbGlicG5nIGhvdyBtYW55IG9mIHRoZQorICogYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfc2lnKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBwbmdfYnl0ZSBwbmdfc2lnbmF0dXJlWzhdID0gezEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTB9OworCisgICAvKiBXcml0ZSB0aGUgcmVzdCBvZiB0aGUgOCBieXRlIHNpZ25hdHVyZSAqLworICAgcG5nX3dyaXRlX2RhdGEocG5nX3B0ciwgJnBuZ19zaWduYXR1cmVbcG5nX3B0ci0+c2lnX2J5dGVzXSwKKyAgICAgIChwbmdfc2l6ZV90KSg4IC0gcG5nX3B0ci0+c2lnX2J5dGVzKSk7CisgICBpZiAocG5nX3B0ci0+c2lnX2J5dGVzIDwgMykKKyAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUE5HX1NJR05BVFVSRTsKK30KKworLyogV3JpdGUgYSBQTkcgY2h1bmsgYWxsIGF0IG9uY2UuICBUaGUgdHlwZSBpcyBhbiBhcnJheSBvZiBBU0NJSSBjaGFyYWN0ZXJzCisgKiByZXByZXNlbnRpbmcgdGhlIGNodW5rIG5hbWUuICBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVzIGluCisgKiBsZW5ndGgsIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIG51bGwgdGVybWluYXRlZC4gIFRvIGJlIHNhZmUsIHBhc3MgdGhlCisgKiBwcmUtZGVmaW5lZCBjaHVuayBuYW1lcyBoZXJlLCBhbmQgaWYgeW91IG5lZWQgYSBuZXcgb25lLCBkZWZpbmUgaXQKKyAqIHdoZXJlIHRoZSBvdGhlcnMgYXJlIGRlZmluZWQuICBUaGUgbGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuCisgKiBBbGwgdGhlIGRhdGEgbXVzdCBiZSBwcmVzZW50LiAgSWYgdGhhdCBpcyBub3QgcG9zc2libGUsIHVzZSB0aGUKKyAqIHBuZ193cml0ZV9jaHVua19zdGFydCgpLCBwbmdfd3JpdGVfY2h1bmtfZGF0YSgpLCBhbmQgcG5nX3dyaXRlX2NodW5rX2VuZCgpCisgKiBmdW5jdGlvbnMgaW5zdGVhZC4KKyAqLwordm9pZCBQTkdBUEkKK3BuZ193cml0ZV9jaHVuayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgY2h1bmtfbmFtZSwKKyAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKK3sKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgY2h1bmtfbmFtZSwgKHBuZ191aW50XzMyKWxlbmd0aCk7CisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBkYXRhLCAocG5nX3NpemVfdClsZW5ndGgpOworICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKK30KKworLyogV3JpdGUgdGhlIHN0YXJ0IG9mIGEgUE5HIGNodW5rLiAgVGhlIHR5cGUgaXMgdGhlIGNodW5rIHR5cGUuCisgKiBUaGUgdG90YWxfbGVuZ3RoIGlzIHRoZSBzdW0gb2YgdGhlIGxlbmd0aHMgb2YgYWxsIHRoZSBkYXRhIHlvdSB3aWxsIGJlCisgKiBwYXNzaW5nIGluIHBuZ193cml0ZV9jaHVua19kYXRhKCkuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGNodW5rX25hbWUsCisgICBwbmdfdWludF8zMiBsZW5ndGgpCit7CisgICBwbmdfYnl0ZSBidWZbOF07CisKKyAgIHBuZ19kZWJ1ZzIoMCwgIldyaXRpbmcgJXMgY2h1bmssIGxlbmd0aCA9ICVsdSIsIGNodW5rX25hbWUsCisgICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOworCisgICBpZiAocG5nX3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisKKyAgIC8qIFdyaXRlIHRoZSBsZW5ndGggYW5kIHRoZSBjaHVuayBuYW1lICovCisgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgbGVuZ3RoKTsKKyAgIHBuZ19tZW1jcHkoYnVmICsgNCwgY2h1bmtfbmFtZSwgNCk7CisgICBwbmdfd3JpdGVfZGF0YShwbmdfcHRyLCBidWYsIChwbmdfc2l6ZV90KTgpOworICAgLyogUHV0IHRoZSBjaHVuayBuYW1lIGludG8gcG5nX3B0ci0+Y2h1bmtfbmFtZSAqLworICAgcG5nX21lbWNweShwbmdfcHRyLT5jaHVua19uYW1lLCBjaHVua19uYW1lLCA0KTsKKyAgIC8qIFJlc2V0IHRoZSBjcmMgYW5kIHJ1biBpdCBvdmVyIHRoZSBjaHVuayBuYW1lICovCisgICBwbmdfcmVzZXRfY3JjKHBuZ19wdHIpOworICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgY2h1bmtfbmFtZSwgKHBuZ19zaXplX3QpNCk7Cit9CisKKy8qIFdyaXRlIHRoZSBkYXRhIG9mIGEgUE5HIGNodW5rIHN0YXJ0ZWQgd2l0aCBwbmdfd3JpdGVfY2h1bmtfc3RhcnQoKS4KKyAqIE5vdGUgdGhhdCBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBhbGxvd2VkLCBhbmQgdGhhdCB0aGUKKyAqIHN1bSBvZiB0aGUgbGVuZ3RocyBmcm9tIHRoZXNlIGNhbGxzICptdXN0KiBhZGQgdXAgdG8gdGhlIHRvdGFsX2xlbmd0aAorICogZ2l2ZW4gdG8gcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkuCisgKi8KK3ZvaWQgUE5HQVBJCitwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCit7CisgICAvKiBXcml0ZSB0aGUgZGF0YSwgYW5kIHJ1biB0aGUgQ1JDIG92ZXIgaXQgKi8KKyAgIGlmIChwbmdfcHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICBpZiAoZGF0YSAhPSBOVUxMICYmIGxlbmd0aCA+IDApCisgICB7CisgICAgICBwbmdfd3JpdGVfZGF0YShwbmdfcHRyLCBkYXRhLCBsZW5ndGgpOworICAgICAgLyogVXBkYXRlIHRoZSBDUkMgYWZ0ZXIgd3JpdGluZyB0aGUgZGF0YSwKKyAgICAgICAqIGluIGNhc2UgdGhhdCB0aGUgdXNlciBJL08gcm91dGluZSBhbHRlcnMgaXQuCisgICAgICAgKi8KKyAgICAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7CisgICB9Cit9CisKKy8qIEZpbmlzaCBhIGNodW5rIHN0YXJ0ZWQgd2l0aCBwbmdfd3JpdGVfY2h1bmtfc3RhcnQoKS4gKi8KK3ZvaWQgUE5HQVBJCitwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisgICBwbmdfYnl0ZSBidWZbNF07CisKKyAgIGlmIChwbmdfcHRyID09IE5VTEwpIHJldHVybjsKKworICAgLyogV3JpdGUgdGhlIGNyYyBpbiBhIHNpbmdsZSBvcGVyYXRpb24gKi8KKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCBwbmdfcHRyLT5jcmMpOworCisgICBwbmdfd3JpdGVfZGF0YShwbmdfcHRyLCBidWYsIChwbmdfc2l6ZV90KTQpOworfQorCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEKQorLyogVGhpcyBwYWlyIG9mIGZ1bmN0aW9ucyBlbmNhcHN1bGF0ZXMgdGhlIG9wZXJhdGlvbiBvZiAoYSkgY29tcHJlc3NpbmcgYQorICogdGV4dCBzdHJpbmcsIGFuZCAoYikgaXNzdWluZyBpdCBsYXRlciBhcyBhIHNlcmllcyBvZiBjaHVuayBkYXRhIHdyaXRlcy4KKyAqIFRoZSBjb21wcmVzc2lvbl9zdGF0ZSBzdHJ1Y3R1cmUgaXMgc2hhcmVkIGNvbnRleHQgZm9yIHRoZXNlIGZ1bmN0aW9ucworICogc2V0IHVwIGJ5IHRoZSBjYWxsZXIgaW4gb3JkZXIgdG8gbWFrZSB0aGUgd2hvbGUgbWVzcyB0aHJlYWQtc2FmZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgY2hhciAqaW5wdXQ7ICAgLyogVGhlIHVuY29tcHJlc3NlZCBpbnB1dCBkYXRhICovCisgICBpbnQgaW5wdXRfbGVuOyAgIC8qIEl0cyBsZW5ndGggKi8KKyAgIGludCBudW1fb3V0cHV0X3B0cjsgLyogTnVtYmVyIG9mIG91dHB1dCBwb2ludGVycyB1c2VkICovCisgICBpbnQgbWF4X291dHB1dF9wdHI7IC8qIFNpemUgb2Ygb3V0cHV0X3B0ciAqLworICAgcG5nX2NoYXJwcCBvdXRwdXRfcHRyOyAvKiBBcnJheSBvZiBwb2ludGVycyB0byBvdXRwdXQgKi8KK30gY29tcHJlc3Npb25fc3RhdGU7CisKKy8qIENvbXByZXNzIGdpdmVuIHRleHQgaW50byBzdG9yYWdlIGluIHRoZSBwbmdfcHRyIHN0cnVjdHVyZSAqLworc3RhdGljIGludCAvKiBQUklWQVRFICovCitwbmdfdGV4dF9jb21wcmVzcyhwbmdfc3RydWN0cCBwbmdfcHRyLAorICAgICAgICBwbmdfY2hhcnAgdGV4dCwgcG5nX3NpemVfdCB0ZXh0X2xlbiwgaW50IGNvbXByZXNzaW9uLAorICAgICAgICBjb21wcmVzc2lvbl9zdGF0ZSAqY29tcCkKK3sKKyAgIGludCByZXQ7CisKKyAgIGNvbXAtPm51bV9vdXRwdXRfcHRyID0gMDsKKyAgIGNvbXAtPm1heF9vdXRwdXRfcHRyID0gMDsKKyAgIGNvbXAtPm91dHB1dF9wdHIgPSBOVUxMOworICAgY29tcC0+aW5wdXQgPSBOVUxMOworICAgY29tcC0+aW5wdXRfbGVuID0gMDsKKworICAgLyogV2UgbWF5IGp1c3Qgd2FudCB0byBwYXNzIHRoZSB0ZXh0IHJpZ2h0IHRocm91Z2ggKi8KKyAgIGlmIChjb21wcmVzc2lvbiA9PSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FKQorICAgeworICAgICAgIGNvbXAtPmlucHV0ID0gdGV4dDsKKyAgICAgICBjb21wLT5pbnB1dF9sZW4gPSB0ZXh0X2xlbjsKKyAgICAgICByZXR1cm4oKGludCl0ZXh0X2xlbik7CisgICB9CisKKyAgIGlmIChjb21wcmVzc2lvbiA+PSBQTkdfVEVYVF9DT01QUkVTU0lPTl9MQVNUKQorICAgeworI2lmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICAgIGNoYXIgbXNnWzUwXTsKKyAgICAgIHBuZ19zbnByaW50Zihtc2csIDUwLCAiVW5rbm93biBjb21wcmVzc2lvbiB0eXBlICVkIiwgY29tcHJlc3Npb24pOworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKKyNlbHNlCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBjb21wcmVzc2lvbiB0eXBlIik7CisjZW5kaWYKKyAgIH0KKworICAgLyogV2UgY2FuJ3Qgd3JpdGUgdGhlIGNodW5rIHVudGlsIHdlIGZpbmQgb3V0IGhvdyBtdWNoIGRhdGEgd2UgaGF2ZSwKKyAgICAqIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8gcnVuIHRoZSBjb21wcmVzc29yIGZpcnN0IGFuZCBzYXZlIHRoZQorICAgICogb3V0cHV0LiAgVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLCBhcyB0aGUgdmFzdCBtYWpvcml0eSBvZgorICAgICogY29tbWVudHMgc2hvdWxkIGJlIHJlYXNvbmFibGUsIGJ1dCB3ZSB3aWxsIHNldCB1cCBhbiBhcnJheSBvZgorICAgICogbWFsbG9jJ2QgcG9pbnRlcnMgdG8gYmUgc3VyZS4KKyAgICAqCisgICAgKiBJZiB3ZSBrbmV3IHRoZSBhcHBsaWNhdGlvbiB3YXMgd2VsbCBiZWhhdmVkLCB3ZSBjb3VsZCBzaW1wbGlmeSB0aGlzCisgICAgKiBncmVhdGx5IGJ5IGFzc3VtaW5nIHdlIGNhbiBhbHdheXMgbWFsbG9jIGFuIG91dHB1dCBidWZmZXIgbGFyZ2UKKyAgICAqIGVub3VnaCB0byBob2xkIHRoZSBjb21wcmVzc2VkIHRleHQgKCgxMDAxICogdGV4dF9sZW4gLyAxMDAwKSArIDEyKQorICAgICogYW5kIG1hbGxvYyB0aGlzIGRpcmVjdGx5LiAgVGhlIG9ubHkgdGltZSB0aGlzIHdvdWxkIGJlIGEgYmFkIGlkZWEgaXMKKyAgICAqIGlmIHdlIGNhbid0IG1hbGxvYyBtb3JlIHRoYW4gNjRLIGFuZCB3ZSBoYXZlIDY0SyBvZiByYW5kb20gaW5wdXQKKyAgICAqIGRhdGEsIG9yIGlmIHRoZSBpbnB1dCBzdHJpbmcgaXMgaW5jcmVkaWJseSBsYXJnZSAoYWx0aG91Z2ggdGhpcworICAgICogd291bGRuJ3QgY2F1c2UgYSBmYWlsdXJlLCBqdXN0IGEgc2xvd2Rvd24gZHVlIHRvIHN3YXBwaW5nKS4KKyAgICAqLworCisgICAvKiBTZXQgdXAgdGhlIGNvbXByZXNzaW9uIGJ1ZmZlcnMgKi8KKyAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludCl0ZXh0X2xlbjsKKyAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IChCeXRlZiAqKXRleHQ7CisgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKKyAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZWYgKilwbmdfcHRyLT56YnVmOworCisgICAvKiBUaGlzIGlzIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxvb3AgYXMgaW4gcG5nX3dyaXRlX3JvdygpICovCisgICBkbworICAgeworICAgICAgLyogQ29tcHJlc3MgdGhlIGRhdGEgKi8KKyAgICAgIHJldCA9IGRlZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgeworICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLm1zZyAhPSBOVUxMKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiBlcnJvciIpOworICAgICAgfQorICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgbW9yZSByb29tICovCisgICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpCisgICAgICB7CisgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIG91dHB1dCBhcnJheSBoYXMgcm9vbSAqLworICAgICAgICAgaWYgKGNvbXAtPm51bV9vdXRwdXRfcHRyID49IGNvbXAtPm1heF9vdXRwdXRfcHRyKQorICAgICAgICAgeworICAgICAgICAgICAgaW50IG9sZF9tYXg7CisKKyAgICAgICAgICAgIG9sZF9tYXggPSBjb21wLT5tYXhfb3V0cHV0X3B0cjsKKyAgICAgICAgICAgIGNvbXAtPm1heF9vdXRwdXRfcHRyID0gY29tcC0+bnVtX291dHB1dF9wdHIgKyA0OworICAgICAgICAgICAgaWYgKGNvbXAtPm91dHB1dF9wdHIgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBuZ19jaGFycHAgb2xkX3B0cjsKKworICAgICAgICAgICAgICAgb2xkX3B0ciA9IGNvbXAtPm91dHB1dF9wdHI7CisgICAgICAgICAgICAgICBjb21wLT5vdXRwdXRfcHRyID0gKHBuZ19jaGFycHApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgKHBuZ191aW50XzMyKQorICAgICAgICAgICAgICAgICAgKGNvbXAtPm1heF9vdXRwdXRfcHRyICogcG5nX3NpemVvZihwbmdfY2hhcnBwKSkpOworICAgICAgICAgICAgICAgcG5nX21lbWNweShjb21wLT5vdXRwdXRfcHRyLCBvbGRfcHRyLCBvbGRfbWF4CisgICAgICAgICAgICAgICAgICAqIHBuZ19zaXplb2YocG5nX2NoYXJwKSk7CisgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBvbGRfcHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGNvbXAtPm91dHB1dF9wdHIgPSAocG5nX2NoYXJwcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpCisgICAgICAgICAgICAgICAgICAoY29tcC0+bWF4X291dHB1dF9wdHIgKiBwbmdfc2l6ZW9mKHBuZ19jaGFycCkpKTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogU2F2ZSB0aGUgZGF0YSAqLworICAgICAgICAgY29tcC0+b3V0cHV0X3B0cltjb21wLT5udW1fb3V0cHV0X3B0cl0gPQorICAgICAgICAgICAgKHBuZ19jaGFycClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAocG5nX3VpbnRfMzIpcG5nX3B0ci0+emJ1Zl9zaXplKTsKKyAgICAgICAgIHBuZ19tZW1jcHkoY29tcC0+b3V0cHV0X3B0cltjb21wLT5udW1fb3V0cHV0X3B0cl0sIHBuZ19wdHItPnpidWYsCisgICAgICAgICAgICBwbmdfcHRyLT56YnVmX3NpemUpOworICAgICAgICAgY29tcC0+bnVtX291dHB1dF9wdHIrKzsKKworICAgICAgICAgLyogYW5kIHJlc2V0IHRoZSBidWZmZXIgKi8KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnpidWY7CisgICAgICB9CisgICAvKiBDb250aW51ZSB1bnRpbCB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIHRvIGNvbXByZXNzICovCisgICB9IHdoaWxlIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luKTsKKworICAgLyogRmluaXNoIHRoZSBjb21wcmVzc2lvbiAqLworICAgZG8KKyAgIHsKKyAgICAgIC8qIFRlbGwgemxpYiB3ZSBhcmUgZmluaXNoZWQgKi8KKyAgICAgIHJldCA9IGRlZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfRklOSVNIKTsKKworICAgICAgaWYgKHJldCA9PSBaX09LKQorICAgICAgeworICAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgbW9yZSByb29tICovCisgICAgICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgb3VyIG91dHB1dCBhcnJheSBoYXMgcm9vbSAqLworICAgICAgICAgICAgaWYgKGNvbXAtPm51bV9vdXRwdXRfcHRyID49IGNvbXAtPm1heF9vdXRwdXRfcHRyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaW50IG9sZF9tYXg7CisKKyAgICAgICAgICAgICAgIG9sZF9tYXggPSBjb21wLT5tYXhfb3V0cHV0X3B0cjsKKyAgICAgICAgICAgICAgIGNvbXAtPm1heF9vdXRwdXRfcHRyID0gY29tcC0+bnVtX291dHB1dF9wdHIgKyA0OworICAgICAgICAgICAgICAgaWYgKGNvbXAtPm91dHB1dF9wdHIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBuZ19jaGFycHAgb2xkX3B0cjsKKworICAgICAgICAgICAgICAgICAgb2xkX3B0ciA9IGNvbXAtPm91dHB1dF9wdHI7CisgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCB0byByZWFsbG9jKCkgKi8KKyAgICAgICAgICAgICAgICAgIGNvbXAtPm91dHB1dF9wdHIgPSAocG5nX2NoYXJwcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKGNvbXAtPm1heF9vdXRwdXRfcHRyICoKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19zaXplb2YocG5nX2NoYXJwKSkpOworICAgICAgICAgICAgICAgICAgcG5nX21lbWNweShjb21wLT5vdXRwdXRfcHRyLCBvbGRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgb2xkX21heCAqIHBuZ19zaXplb2YocG5nX2NoYXJwKSk7CisgICAgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBvbGRfcHRyKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGNvbXAtPm91dHB1dF9wdHIgPSAocG5nX2NoYXJwcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKGNvbXAtPm1heF9vdXRwdXRfcHRyICoKKyAgICAgICAgICAgICAgICAgICAgIHBuZ19zaXplb2YocG5nX2NoYXJwKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTYXZlIHRoZSBkYXRhICovCisgICAgICAgICAgICBjb21wLT5vdXRwdXRfcHRyW2NvbXAtPm51bV9vdXRwdXRfcHRyXSA9CisgICAgICAgICAgICAgICAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgICAgIChwbmdfdWludF8zMilwbmdfcHRyLT56YnVmX3NpemUpOworICAgICAgICAgICAgcG5nX21lbWNweShjb21wLT5vdXRwdXRfcHRyW2NvbXAtPm51bV9vdXRwdXRfcHRyXSwgcG5nX3B0ci0+emJ1ZiwKKyAgICAgICAgICAgICAgIHBuZ19wdHItPnpidWZfc2l6ZSk7CisgICAgICAgICAgICBjb21wLT5udW1fb3V0cHV0X3B0cisrOworCisgICAgICAgICAgICAvKiBhbmQgcmVzZXQgdGhlIGJ1ZmZlciBwb2ludGVycyAqLworICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7CisgICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpCisgICAgICB7CisgICAgICAgICAvKiBXZSBnb3QgYW4gZXJyb3IgKi8KKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLm1zZyAhPSBOVUxMKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiBlcnJvciIpOworICAgICAgfQorICAgfSB3aGlsZSAocmV0ICE9IFpfU1RSRUFNX0VORCk7CisKKyAgIC8qIFRleHQgbGVuZ3RoIGlzIG51bWJlciBvZiBidWZmZXJzIHBsdXMgbGFzdCBidWZmZXIgKi8KKyAgIHRleHRfbGVuID0gcG5nX3B0ci0+emJ1Zl9zaXplICogY29tcC0+bnVtX291dHB1dF9wdHI7CisgICBpZiAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPCBwbmdfcHRyLT56YnVmX3NpemUpCisgICAgICB0ZXh0X2xlbiArPSBwbmdfcHRyLT56YnVmX3NpemUgLSAocG5nX3NpemVfdClwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsKKworICAgcmV0dXJuKChpbnQpdGV4dF9sZW4pOworfQorCisvKiBTaGlwIHRoZSBjb21wcmVzc2VkIHRleHQgb3V0IHZpYSBjaHVuayB3cml0ZXMgKi8KK3N0YXRpYyB2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9jb21wcmVzc2VkX2RhdGFfb3V0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGNvbXByZXNzaW9uX3N0YXRlICpjb21wKQoreworICAgaW50IGk7CisKKyAgIC8qIEhhbmRsZSB0aGUgbm8tY29tcHJlc3Npb24gY2FzZSAqLworICAgaWYgKGNvbXAtPmlucHV0KQorICAgeworICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19ieXRlcCljb21wLT5pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG5nX3NpemVfdCljb21wLT5pbnB1dF9sZW4pOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBXcml0ZSBzYXZlZCBvdXRwdXQgYnVmZmVycywgaWYgYW55ICovCisgICBmb3IgKGkgPSAwOyBpIDwgY29tcC0+bnVtX291dHB1dF9wdHI7IGkrKykKKyAgIHsKKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApY29tcC0+b3V0cHV0X3B0cltpXSwKKyAgICAgICAgIChwbmdfc2l6ZV90KXBuZ19wdHItPnpidWZfc2l6ZSk7CisgICAgICBwbmdfZnJlZShwbmdfcHRyLCBjb21wLT5vdXRwdXRfcHRyW2ldKTsKKyAgICAgICBjb21wLT5vdXRwdXRfcHRyW2ldPU5VTEw7CisgICB9CisgICBpZiAoY29tcC0+bWF4X291dHB1dF9wdHIgIT0gMCkKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGNvbXAtPm91dHB1dF9wdHIpOworICAgICAgIGNvbXAtPm91dHB1dF9wdHI9TlVMTDsKKyAgIC8qIFdyaXRlIGFueXRoaW5nIGxlZnQgaW4gemJ1ZiAqLworICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0IDwgKHBuZ191aW50XzMyKXBuZ19wdHItPnpidWZfc2l6ZSkKKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsCisgICAgICAgICAocG5nX3NpemVfdCkocG5nX3B0ci0+emJ1Zl9zaXplIC0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpKTsKKworICAgLyogUmVzZXQgemxpYiBmb3IgYW5vdGhlciB6VFh0L2lUWHQgb3IgaW1hZ2UgZGF0YSAqLworICAgZGVmbGF0ZVJlc2V0KCZwbmdfcHRyLT56c3RyZWFtKTsKKyAgIHBuZ19wdHItPnpzdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7Cit9CisjZW5kaWYKKworLyogV3JpdGUgdGhlIElIRFIgY2h1bmssIGFuZCB1cGRhdGUgdGhlIHBuZ19zdHJ1Y3Qgd2l0aCB0aGUgbmVjZXNzYXJ5CisgKiBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCB0aGUgcmVzdCBvZiB0aGlzIGNvZGUgZGVwZW5kcyB1cG9uIHRoaXMKKyAqIGluZm9ybWF0aW9uIGJlaW5nIGNvcnJlY3QuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX0lIRFIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwKKyAgIGludCBiaXRfZGVwdGgsIGludCBjb2xvcl90eXBlLCBpbnQgY29tcHJlc3Npb25fdHlwZSwgaW50IGZpbHRlcl90eXBlLAorICAgaW50IGludGVybGFjZV90eXBlKQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfSUhEUjsKKyNlbmRpZgorICAgaW50IHJldDsKKworICAgcG5nX2J5dGUgYnVmWzEzXTsgLyogQnVmZmVyIHRvIHN0b3JlIHRoZSBJSERSIGluZm8gKi8KKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfSUhEUiIpOworCisgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgdmFsaWQgaW5wdXQgZGF0YSBmcm9tIHRoZSBhcHBsaWNhdGlvbiBpbmZvICovCisgICBzd2l0Y2ggKGNvbG9yX3R5cGUpCisgICB7CisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6CisgICAgICAgICBzd2l0Y2ggKGJpdF9kZXB0aCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGNhc2UgMTY6IHBuZ19wdHItPmNoYW5uZWxzID0gMTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBiaXQgZGVwdGggZm9yIGdyYXlzY2FsZSBpbWFnZSIpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKyAgICAgICAgIGlmIChiaXRfZGVwdGggIT0gOCAmJiBiaXRfZGVwdGggIT0gMTYpCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBSR0IgaW1hZ2UiKTsKKyAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMzsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOgorICAgICAgICAgc3dpdGNoIChiaXRfZGVwdGgpCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjYXNlIDg6IHBuZ19wdHItPmNoYW5uZWxzID0gMTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBwYWxldHRlZCBpbWFnZSIpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6CisgICAgICAgICBpZiAoYml0X2RlcHRoICE9IDggJiYgYml0X2RlcHRoICE9IDE2KQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGJpdCBkZXB0aCBmb3IgZ3JheXNjYWxlK2FscGhhIGltYWdlIik7CisgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOgorICAgICAgICAgaWYgKGJpdF9kZXB0aCAhPSA4ICYmIGJpdF9kZXB0aCAhPSAxNikKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBiaXQgZGVwdGggZm9yIFJHQkEgaW1hZ2UiKTsKKyAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gNDsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBpbWFnZSBjb2xvciB0eXBlIHNwZWNpZmllZCIpOworICAgfQorCisgICBpZiAoY29tcHJlc3Npb25fdHlwZSAhPSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgY29tcHJlc3Npb24gdHlwZSBzcGVjaWZpZWQiKTsKKyAgICAgIGNvbXByZXNzaW9uX3R5cGUgPSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFOworICAgfQorCisgICAvKiBXcml0ZSBmaWx0ZXJfbWV0aG9kIDY0IChpbnRyYXBpeGVsIGRpZmZlcmVuY2luZykgb25seSBpZgorICAgICogMS4gTGlicG5nIHdhcyBjb21waWxlZCB3aXRoIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEIGFuZAorICAgICogMi4gTGlicG5nIGRpZCBub3Qgd3JpdGUgYSBQTkcgc2lnbmF0dXJlICh0aGlzIGZpbHRlcl9tZXRob2QgaXMgb25seQorICAgICogICAgdXNlZCBpbiBQTkcgZGF0YXN0cmVhbXMgdGhhdCBhcmUgZW1iZWRkZWQgaW4gTU5HIGRhdGFzdHJlYW1zKSBhbmQKKyAgICAqIDMuIFRoZSBhcHBsaWNhdGlvbiBjYWxsZWQgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMgd2l0aCBhIG1hc2sgdGhhdAorICAgICogICAgaW5jbHVkZWQgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCBhbmQKKyAgICAqIDQuIFRoZSBmaWx0ZXJfbWV0aG9kIGlzIDY0IGFuZAorICAgICogNS4gVGhlIGNvbG9yX3R5cGUgaXMgUkdCIG9yIFJHQkEKKyAgICAqLworICAgaWYgKAorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisgICAgICAhKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgJiYKKyAgICAgICgocG5nX3B0ci0+bW9kZSZQTkdfSEFWRV9QTkdfU0lHTkFUVVJFKSA9PSAwKSAmJgorICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8CisgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpICYmCisgICAgICAoZmlsdGVyX3R5cGUgPT0gUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKSkgJiYKKyNlbmRpZgorICAgICAgZmlsdGVyX3R5cGUgIT0gUE5HX0ZJTFRFUl9UWVBFX0JBU0UpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBmaWx0ZXIgdHlwZSBzcGVjaWZpZWQiKTsKKyAgICAgIGZpbHRlcl90eXBlID0gUE5HX0ZJTFRFUl9UWVBFX0JBU0U7CisgICB9CisKKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICBpZiAoaW50ZXJsYWNlX3R5cGUgIT0gUE5HX0lOVEVSTEFDRV9OT05FICYmCisgICAgICBpbnRlcmxhY2VfdHlwZSAhPSBQTkdfSU5URVJMQUNFX0FEQU03KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgaW50ZXJsYWNlIHR5cGUgc3BlY2lmaWVkIik7CisgICAgICBpbnRlcmxhY2VfdHlwZSA9IFBOR19JTlRFUkxBQ0VfQURBTTc7CisgICB9CisjZWxzZQorICAgaW50ZXJsYWNlX3R5cGU9UE5HX0lOVEVSTEFDRV9OT05FOworI2VuZGlmCisKKyAgIC8qIFNhdmUgdGhlIHJlbGV2ZW50IGluZm9ybWF0aW9uICovCisgICBwbmdfcHRyLT5iaXRfZGVwdGggPSAocG5nX2J5dGUpYml0X2RlcHRoOworICAgcG5nX3B0ci0+Y29sb3JfdHlwZSA9IChwbmdfYnl0ZSljb2xvcl90eXBlOworICAgcG5nX3B0ci0+aW50ZXJsYWNlZCA9IChwbmdfYnl0ZSlpbnRlcmxhY2VfdHlwZTsKKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAorICAgcG5nX3B0ci0+ZmlsdGVyX3R5cGUgPSAocG5nX2J5dGUpZmlsdGVyX3R5cGU7CisjZW5kaWYKKyAgIHBuZ19wdHItPmNvbXByZXNzaW9uX3R5cGUgPSAocG5nX2J5dGUpY29tcHJlc3Npb25fdHlwZTsKKyAgIHBuZ19wdHItPndpZHRoID0gd2lkdGg7CisgICBwbmdfcHRyLT5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgIHBuZ19wdHItPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShiaXRfZGVwdGggKiBwbmdfcHRyLT5jaGFubmVscyk7CisgICBwbmdfcHRyLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhwbmdfcHRyLT5waXhlbF9kZXB0aCwgd2lkdGgpOworICAgLyogU2V0IHRoZSB1c3IgaW5mbywgc28gYW55IHRyYW5zZm9ybWF0aW9ucyBjYW4gbW9kaWZ5IGl0ICovCisgICBwbmdfcHRyLT51c3Jfd2lkdGggPSBwbmdfcHRyLT53aWR0aDsKKyAgIHBuZ19wdHItPnVzcl9iaXRfZGVwdGggPSBwbmdfcHRyLT5iaXRfZGVwdGg7CisgICBwbmdfcHRyLT51c3JfY2hhbm5lbHMgPSBwbmdfcHRyLT5jaGFubmVsczsKKworICAgLyogUGFjayB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGludG8gdGhlIGJ1ZmZlciAqLworICAgcG5nX3NhdmVfdWludF8zMihidWYsIHdpZHRoKTsKKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgNCwgaGVpZ2h0KTsKKyAgIGJ1Zls4XSA9IChwbmdfYnl0ZSliaXRfZGVwdGg7CisgICBidWZbOV0gPSAocG5nX2J5dGUpY29sb3JfdHlwZTsKKyAgIGJ1ZlsxMF0gPSAocG5nX2J5dGUpY29tcHJlc3Npb25fdHlwZTsKKyAgIGJ1ZlsxMV0gPSAocG5nX2J5dGUpZmlsdGVyX3R5cGU7CisgICBidWZbMTJdID0gKHBuZ19ieXRlKWludGVybGFjZV90eXBlOworCisgICAvKiBXcml0ZSB0aGUgY2h1bmsgKi8KKyAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19JSERSLCBidWYsIChwbmdfc2l6ZV90KTEzKTsKKworICAgLyogSW5pdGlhbGl6ZSB6bGliIHdpdGggUE5HIGluZm8gKi8KKyAgIHBuZ19wdHItPnpzdHJlYW0uemFsbG9jID0gcG5nX3phbGxvYzsKKyAgIHBuZ19wdHItPnpzdHJlYW0uemZyZWUgPSBwbmdfemZyZWU7CisgICBwbmdfcHRyLT56c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpcG5nX3B0cjsKKyAgIGlmICghKHBuZ19wdHItPmRvX2ZpbHRlcikpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFIHx8CisgICAgICAgICBwbmdfcHRyLT5iaXRfZGVwdGggPCA4KQorICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9OT05FOworICAgICAgZWxzZQorICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0FMTF9GSUxURVJTOworICAgfQorICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0NVU1RPTV9TVFJBVEVHWSkpCisgICB7CisgICAgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICE9IFBOR19GSUxURVJfTk9ORSkKKyAgICAgICAgIHBuZ19wdHItPnpsaWJfc3RyYXRlZ3kgPSBaX0ZJTFRFUkVEOworICAgICAgZWxzZQorICAgICAgICAgcG5nX3B0ci0+emxpYl9zdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWTsKKyAgIH0KKyAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9DVVNUT01fTEVWRUwpKQorICAgICAgcG5nX3B0ci0+emxpYl9sZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKKyAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9DVVNUT01fTUVNX0xFVkVMKSkKKyAgICAgIHBuZ19wdHItPnpsaWJfbWVtX2xldmVsID0gODsKKyAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9DVVNUT01fV0lORE9XX0JJVFMpKQorICAgICAgcG5nX3B0ci0+emxpYl93aW5kb3dfYml0cyA9IDE1OworICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0NVU1RPTV9NRVRIT0QpKQorICAgICAgcG5nX3B0ci0+emxpYl9tZXRob2QgPSA4OworICAgcmV0ID0gZGVmbGF0ZUluaXQyKCZwbmdfcHRyLT56c3RyZWFtLCBwbmdfcHRyLT56bGliX2xldmVsLAorICAgICAgICAgcG5nX3B0ci0+emxpYl9tZXRob2QsIHBuZ19wdHItPnpsaWJfd2luZG93X2JpdHMsCisgICAgICAgICBwbmdfcHRyLT56bGliX21lbV9sZXZlbCwgcG5nX3B0ci0+emxpYl9zdHJhdGVneSk7CisgICBpZiAocmV0ICE9IFpfT0spCisgICB7CisgICAgICBpZiAocmV0ID09IFpfVkVSU0lPTl9FUlJPUikgcG5nX2Vycm9yKHBuZ19wdHIsCisgICAgICAgICAgInpsaWIgZmFpbGVkIHRvIGluaXRpYWxpemUgY29tcHJlc3NvciAtLSB2ZXJzaW9uIGVycm9yIik7CisgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VSUk9SKSBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAgInpsaWIgZmFpbGVkIHRvIGluaXRpYWxpemUgY29tcHJlc3NvciAtLSBzdHJlYW0gZXJyb3IiKTsKKyAgICAgIGlmIChyZXQgPT0gWl9NRU1fRVJST1IpIHBuZ19lcnJvcihwbmdfcHRyLAorICAgICAgICAgICAiemxpYiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb21wcmVzc29yIC0tIG1lbSBlcnJvciIpOworICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ6bGliIGZhaWxlZCB0byBpbml0aWFsaXplIGNvbXByZXNzb3IiKTsKKyAgIH0KKyAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOworICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7CisgICAvKiBsaWJwbmcgaXMgbm90IGludGVyZXN0ZWQgaW4genN0cmVhbS5kYXRhX3R5cGUgKi8KKyAgIC8qIFNldCBpdCB0byBhIHByZWRlZmluZWQgdmFsdWUsIHRvIGF2b2lkIGl0cyBldmFsdWF0aW9uIGluc2lkZSB6bGliICovCisgICBwbmdfcHRyLT56c3RyZWFtLmRhdGFfdHlwZSA9IFpfQklOQVJZOworCisgICBwbmdfcHRyLT5tb2RlID0gUE5HX0hBVkVfSUhEUjsKK30KKworLyogV3JpdGUgdGhlIHBhbGV0dGUuICBXZSBhcmUgY2FyZWZ1bCBub3QgdG8gdHJ1c3QgcG5nX2NvbG9yIHRvIGJlIGluIHRoZQorICogY29ycmVjdCBvcmRlciBmb3IgUE5HLCBzbyBwZW9wbGUgY2FuIHJlZGVmaW5lIGl0IHRvIGFueSBjb252ZW5pZW50CisgKiBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX1BMVEUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbG9ycCBwYWxldHRlLCBwbmdfdWludF8zMiBudW1fcGFsKQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfUExURTsKKyNlbmRpZgorICAgcG5nX3VpbnRfMzIgaTsKKyAgIHBuZ19jb2xvcnAgcGFsX3B0cjsKKyAgIHBuZ19ieXRlIGJ1ZlszXTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfUExURSIpOworCisgICBpZiAoKAorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisgICAgICAgICEocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19FTVBUWV9QTFRFKSAmJgorI2VuZGlmCisgICAgICAgIG51bV9wYWwgPT0gMCkgfHwgbnVtX3BhbCA+IDI1NikKKyAgIHsKKyAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKKyAgICAgeworICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgbnVtYmVyIG9mIGNvbG9ycyBpbiBwYWxldHRlIik7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIG51bWJlciBvZiBjb2xvcnMgaW4gcGFsZXR0ZSIpOworICAgICAgICByZXR1cm47CisgICAgIH0KKyAgIH0KKworICAgaWYgKCEocG5nX3B0ci0+Y29sb3JfdHlwZSZQTkdfQ09MT1JfTUFTS19DT0xPUikpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAiSWdub3JpbmcgcmVxdWVzdCB0byB3cml0ZSBhIFBMVEUgY2h1bmsgaW4gZ3JheXNjYWxlIFBORyIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfcHRyLT5udW1fcGFsZXR0ZSA9IChwbmdfdWludF8xNiludW1fcGFsOworICAgcG5nX2RlYnVnMSgzLCAibnVtX3BhbGV0dGUgPSAlZCIsIHBuZ19wdHItPm51bV9wYWxldHRlKTsKKworICAgcG5nX3dyaXRlX2NodW5rX3N0YXJ0KHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX1BMVEUsCisgICAgIChwbmdfdWludF8zMikobnVtX3BhbCAqIDMpKTsKKyNpZmRlZiBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKKyAgIGZvciAoaSA9IDAsIHBhbF9wdHIgPSBwYWxldHRlOyBpIDwgbnVtX3BhbDsgaSsrLCBwYWxfcHRyKyspCisgICB7CisgICAgICBidWZbMF0gPSBwYWxfcHRyLT5yZWQ7CisgICAgICBidWZbMV0gPSBwYWxfcHRyLT5ncmVlbjsKKyAgICAgIGJ1ZlsyXSA9IHBhbF9wdHItPmJsdWU7CisgICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBidWYsIChwbmdfc2l6ZV90KTMpOworICAgfQorI2Vsc2UKKyAgIC8qIFRoaXMgaXMgYSBsaXR0bGUgc2xvd2VyIGJ1dCBzb21lIGJ1Z2d5IGNvbXBpbGVycyBuZWVkIHRvIGRvIHRoaXMKKyAgICAqIGluc3RlYWQKKyAgICAqLworICAgcGFsX3B0cj1wYWxldHRlOworICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWw7IGkrKykKKyAgIHsKKyAgICAgIGJ1ZlswXSA9IHBhbF9wdHJbaV0ucmVkOworICAgICAgYnVmWzFdID0gcGFsX3B0cltpXS5ncmVlbjsKKyAgICAgIGJ1ZlsyXSA9IHBhbF9wdHJbaV0uYmx1ZTsKKyAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpMyk7CisgICB9CisjZW5kaWYKKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7CisgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BMVEU7Cit9CisKKy8qIFdyaXRlIGFuIElEQVQgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX0lEQVQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfSURBVDsKKyNlbmRpZgorCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9JREFUIik7CisKKyAgIC8qIE9wdGltaXplIHRoZSBDTUYgZmllbGQgaW4gdGhlIHpsaWIgc3RyZWFtLiAqLworICAgLyogVGhpcyBoYWNrIG9mIHRoZSB6bGliIHN0cmVhbSBpcyBjb21wbGlhbnQgdG8gdGhlIHN0cmVhbSBzcGVjaWZpY2F0aW9uLiAqLworICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICYmCisgICAgICAgcG5nX3B0ci0+Y29tcHJlc3Npb25fdHlwZSA9PSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQorICAgeworICAgICAgdW5zaWduZWQgaW50IHpfY21mID0gZGF0YVswXTsgIC8qIHpsaWIgY29tcHJlc3Npb24gbWV0aG9kIGFuZCBmbGFncyAqLworICAgICAgaWYgKCh6X2NtZiAmIDB4MGYpID09IDggJiYgKHpfY21mICYgMHhmMCkgPD0gMHg3MCkKKyAgICAgIHsKKyAgICAgICAgIC8qIEF2b2lkIG1lbW9yeSB1bmRlcmZsb3dzIGFuZCBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvd3MuCisgICAgICAgICAgKgorICAgICAgICAgICogVGhlIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHByYWN0aWNhbGx5IGFsd2F5cyBzYXRpc2ZpZWQ7CisgICAgICAgICAgKiBob3dldmVyLCB0aGV5IHN0aWxsIG11c3QgYmUgY2hlY2tlZC4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGxlbmd0aCA+PSAyICYmCisgICAgICAgICAgICAgcG5nX3B0ci0+aGVpZ2h0IDwgMTYzODQgJiYgcG5nX3B0ci0+d2lkdGggPCAxNjM4NCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIHVuY29tcHJlc3NlZF9pZGF0X3NpemUgPSBwbmdfcHRyLT5oZWlnaHQgKgorICAgICAgICAgICAgICAgKChwbmdfcHRyLT53aWR0aCAqCisgICAgICAgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyAqIHBuZ19wdHItPmJpdF9kZXB0aCArIDE1KSA+PiAzKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB6X2NpbmZvID0gel9jbWYgPj4gNDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBoYWxmX3pfd2luZG93X3NpemUgPSAxIDw8ICh6X2NpbmZvICsgNyk7CisgICAgICAgICAgICB3aGlsZSAodW5jb21wcmVzc2VkX2lkYXRfc2l6ZSA8PSBoYWxmX3pfd2luZG93X3NpemUgJiYKKyAgICAgICAgICAgICAgICAgICBoYWxmX3pfd2luZG93X3NpemUgPj0gMjU2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgel9jaW5mby0tOworICAgICAgICAgICAgICAgaGFsZl96X3dpbmRvd19zaXplID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgel9jbWYgPSAoel9jbWYgJiAweDBmKSB8ICh6X2NpbmZvIDw8IDQpOworICAgICAgICAgICAgaWYgKGRhdGFbMF0gIT0gKHBuZ19ieXRlKXpfY21mKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZGF0YVswXSA9IChwbmdfYnl0ZSl6X2NtZjsKKyAgICAgICAgICAgICAgIGRhdGFbMV0gJj0gMHhlMDsKKyAgICAgICAgICAgICAgIGRhdGFbMV0gKz0gKHBuZ19ieXRlKSgweDFmIC0gKCh6X2NtZiA8PCA4KSArIGRhdGFbMV0pICUgMHgxZik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKKyAgICAgICAgICAgICJJbnZhbGlkIHpsaWIgY29tcHJlc3Npb24gbWV0aG9kIG9yIGZsYWdzIGluIElEQVQiKTsKKyAgIH0KKworICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX0lEQVQsIGRhdGEsIGxlbmd0aCk7CisgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lEQVQ7Cit9CisKKy8qIFdyaXRlIGFuIElFTkQgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX0lFTkQocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX0lFTkQ7CisjZW5kaWYKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfSUVORCIpOworCisgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfSUVORCwgcG5nX2J5dGVwX05VTEwsCisgICAgIChwbmdfc2l6ZV90KTApOworICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JRU5EOworfQorCisjaWZkZWYgUE5HX1dSSVRFX2dBTUFfU1VQUE9SVEVECisvKiBXcml0ZSBhIGdBTUEgY2h1bmsgKi8KKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9nQU1BKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGRvdWJsZSBmaWxlX2dhbW1hKQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfZ0FNQTsKKyNlbmRpZgorICAgcG5nX3VpbnRfMzIgaWdhbW1hOworICAgcG5nX2J5dGUgYnVmWzRdOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9nQU1BIik7CisKKyAgIC8qIGZpbGVfZ2FtbWEgaXMgc2F2ZWQgaW4gMS8xMDAsMDAwdGhzICovCisgICBpZ2FtbWEgPSAocG5nX3VpbnRfMzIpKGZpbGVfZ2FtbWEgKiAxMDAwMDAuMCArIDAuNSk7CisgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgaWdhbW1hKTsKKyAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19nQU1BLCBidWYsIChwbmdfc2l6ZV90KTQpOworfQorI2VuZGlmCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfZ0FNQV9maXhlZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfZml4ZWRfcG9pbnQgZmlsZV9nYW1tYSkKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX2dBTUE7CisjZW5kaWYKKyAgIHBuZ19ieXRlIGJ1Zls0XTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZ0FNQSIpOworCisgICAvKiBmaWxlX2dhbW1hIGlzIHNhdmVkIGluIDEvMTAwLDAwMHRocyAqLworICAgcG5nX3NhdmVfdWludF8zMihidWYsIChwbmdfdWludF8zMilmaWxlX2dhbW1hKTsKKyAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19nQU1BLCBidWYsIChwbmdfc2l6ZV90KTQpOworfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRAorLyogV3JpdGUgYSBzUkdCIGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9zUkdCKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBzcmdiX2ludGVudCkKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX3NSR0I7CisjZW5kaWYKKyAgIHBuZ19ieXRlIGJ1ZlsxXTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfc1JHQiIpOworCisgICBpZiAoc3JnYl9pbnRlbnQgPj0gUE5HX3NSR0JfSU5URU5UX0xBU1QpCisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAgIkludmFsaWQgc1JHQiByZW5kZXJpbmcgaW50ZW50IHNwZWNpZmllZCIpOworICAgYnVmWzBdPShwbmdfYnl0ZSlzcmdiX2ludGVudDsKKyAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19zUkdCLCBidWYsIChwbmdfc2l6ZV90KTEpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfaUNDUF9TVVBQT1JURUQKKy8qIFdyaXRlIGFuIGlDQ1AgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX2lDQ1AocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIG5hbWUsIGludCBjb21wcmVzc2lvbl90eXBlLAorICAgcG5nX2NoYXJwIHByb2ZpbGUsIGludCBwcm9maWxlX2xlbikKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX2lDQ1A7CisjZW5kaWYKKyAgIHBuZ19zaXplX3QgbmFtZV9sZW47CisgICBwbmdfY2hhcnAgbmV3X25hbWU7CisgICBjb21wcmVzc2lvbl9zdGF0ZSBjb21wOworICAgaW50IGVtYmVkZGVkX3Byb2ZpbGVfbGVuID0gMDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaUNDUCIpOworCisgICBjb21wLm51bV9vdXRwdXRfcHRyID0gMDsKKyAgIGNvbXAubWF4X291dHB1dF9wdHIgPSAwOworICAgY29tcC5vdXRwdXRfcHRyID0gTlVMTDsKKyAgIGNvbXAuaW5wdXQgPSBOVUxMOworICAgY29tcC5pbnB1dF9sZW4gPSAwOworCisgICBpZiAoKG5hbWVfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0ciwgbmFtZSwKKyAgICAgICZuZXdfbmFtZSkpID09IDApCisgICAgICByZXR1cm47CisKKyAgIGlmIChjb21wcmVzc2lvbl90eXBlICE9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biBjb21wcmVzc2lvbiB0eXBlIGluIGlDQ1AgY2h1bmsiKTsKKworICAgaWYgKHByb2ZpbGUgPT0gTlVMTCkKKyAgICAgIHByb2ZpbGVfbGVuID0gMDsKKworICAgaWYgKHByb2ZpbGVfbGVuID4gMykKKyAgICAgIGVtYmVkZGVkX3Byb2ZpbGVfbGVuID0KKyAgICAgICAgICAoKCooIChwbmdfYnl0ZXApcHJvZmlsZSAgICApKTw8MjQpIHwKKyAgICAgICAgICAoKCooIChwbmdfYnl0ZXApcHJvZmlsZSArIDEpKTw8MTYpIHwKKyAgICAgICAgICAoKCooIChwbmdfYnl0ZXApcHJvZmlsZSArIDIpKTw8IDgpIHwKKyAgICAgICAgICAoKCooIChwbmdfYnl0ZXApcHJvZmlsZSArIDMpKSAgICApOworCisgICBpZiAoZW1iZWRkZWRfcHJvZmlsZV9sZW4gPCAwKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKKyAgICAgICAgIkVtYmVkZGVkIHByb2ZpbGUgbGVuZ3RoIGluIGlDQ1AgY2h1bmsgaXMgbmVnYXRpdmUiKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19uYW1lKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKHByb2ZpbGVfbGVuIDwgZW1iZWRkZWRfcHJvZmlsZV9sZW4pCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAiRW1iZWRkZWQgcHJvZmlsZSBsZW5ndGggdG9vIGxhcmdlIGluIGlDQ1AgY2h1bmsiKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19uYW1lKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKHByb2ZpbGVfbGVuID4gZW1iZWRkZWRfcHJvZmlsZV9sZW4pCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAiVHJ1bmNhdGluZyBwcm9maWxlIHRvIGFjdHVhbCBsZW5ndGggaW4gaUNDUCBjaHVuayIpOworICAgICAgcHJvZmlsZV9sZW4gPSBlbWJlZGRlZF9wcm9maWxlX2xlbjsKKyAgIH0KKworICAgaWYgKHByb2ZpbGVfbGVuKQorICAgICAgcHJvZmlsZV9sZW4gPSBwbmdfdGV4dF9jb21wcmVzcyhwbmdfcHRyLCBwcm9maWxlLAorICAgICAgICAocG5nX3NpemVfdClwcm9maWxlX2xlbiwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgJmNvbXApOworCisgICAvKiBNYWtlIHN1cmUgd2UgaW5jbHVkZSB0aGUgTlVMTCBhZnRlciB0aGUgbmFtZSBhbmQgdGhlIGNvbXByZXNzaW9uIHR5cGUgKi8KKyAgIHBuZ193cml0ZV9jaHVua19zdGFydChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19pQ0NQLAorICAgICAgICAgIChwbmdfdWludF8zMikobmFtZV9sZW4gKyBwcm9maWxlX2xlbiArIDIpKTsKKyAgIG5ld19uYW1lW25hbWVfbGVuICsgMV0gPSAweDAwOworICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19ieXRlcCluZXdfbmFtZSwKKyAgICAgKHBuZ19zaXplX3QpKG5hbWVfbGVuICsgMikpOworCisgICBpZiAocHJvZmlsZV9sZW4pCisgICAgICBwbmdfd3JpdGVfY29tcHJlc3NlZF9kYXRhX291dChwbmdfcHRyLCAmY29tcCk7CisKKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7CisgICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfbmFtZSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zUExUX1NVUFBPUlRFRAorLyogV3JpdGUgYSBzUExUIGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9zUExUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19zUExUX3RwIHNwYWxldHRlKQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfc1BMVDsKKyNlbmRpZgorICAgcG5nX3NpemVfdCBuYW1lX2xlbjsKKyAgIHBuZ19jaGFycCBuZXdfbmFtZTsKKyAgIHBuZ19ieXRlIGVudHJ5YnVmWzEwXTsKKyAgIGludCBlbnRyeV9zaXplID0gKHNwYWxldHRlLT5kZXB0aCA9PSA4ID8gNiA6IDEwKTsKKyAgIGludCBwYWxldHRlX3NpemUgPSBlbnRyeV9zaXplICogc3BhbGV0dGUtPm5lbnRyaWVzOworICAgcG5nX3NQTFRfZW50cnlwIGVwOworI2lmbmRlZiBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKKyAgIGludCBpOworI2VuZGlmCisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3NQTFQiKTsKKworICAgaWYgKChuYW1lX2xlbiA9IHBuZ19jaGVja19rZXl3b3JkKHBuZ19wdHIsc3BhbGV0dGUtPm5hbWUsICZuZXdfbmFtZSkpPT0wKQorICAgICAgcmV0dXJuOworCisgICAvKiBNYWtlIHN1cmUgd2UgaW5jbHVkZSB0aGUgTlVMTCBhZnRlciB0aGUgbmFtZSAqLworICAgcG5nX3dyaXRlX2NodW5rX3N0YXJ0KHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3NQTFQsCisgICAgIChwbmdfdWludF8zMikobmFtZV9sZW4gKyAyICsgcGFsZXR0ZV9zaXplKSk7CisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKW5ld19uYW1lLAorICAgICAocG5nX3NpemVfdCkobmFtZV9sZW4gKyAxKSk7CisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKSZzcGFsZXR0ZS0+ZGVwdGgsIChwbmdfc2l6ZV90KTEpOworCisgICAvKiBMb29wIHRocm91Z2ggZWFjaCBwYWxldHRlIGVudHJ5LCB3cml0aW5nIGFwcHJvcHJpYXRlbHkgKi8KKyNpZmRlZiBQTkdfUE9JTlRFUl9JTkRFWElOR19TVVBQT1JURUQKKyAgIGZvciAoZXAgPSBzcGFsZXR0ZS0+ZW50cmllczsgZXA8c3BhbGV0dGUtPmVudHJpZXMgKyBzcGFsZXR0ZS0+bmVudHJpZXM7IGVwKyspCisgICB7CisgICAgICBpZiAoc3BhbGV0dGUtPmRlcHRoID09IDgpCisgICAgICB7CisgICAgICAgICAgZW50cnlidWZbMF0gPSAocG5nX2J5dGUpZXAtPnJlZDsKKyAgICAgICAgICBlbnRyeWJ1ZlsxXSA9IChwbmdfYnl0ZSllcC0+Z3JlZW47CisgICAgICAgICAgZW50cnlidWZbMl0gPSAocG5nX2J5dGUpZXAtPmJsdWU7CisgICAgICAgICAgZW50cnlidWZbM10gPSAocG5nX2J5dGUpZXAtPmFscGhhOworICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA0LCBlcC0+ZnJlcXVlbmN5KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgMCwgZXAtPnJlZCk7CisgICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDIsIGVwLT5ncmVlbik7CisgICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDQsIGVwLT5ibHVlKTsKKyAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNiwgZXAtPmFscGhhKTsKKyAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgOCwgZXAtPmZyZXF1ZW5jeSk7CisgICAgICB9CisgICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBlbnRyeWJ1ZiwgKHBuZ19zaXplX3QpZW50cnlfc2l6ZSk7CisgICB9CisjZWxzZQorICAgZXA9c3BhbGV0dGUtPmVudHJpZXM7CisgICBmb3IgKGk9MDsgaT5zcGFsZXR0ZS0+bmVudHJpZXM7IGkrKykKKyAgIHsKKyAgICAgIGlmIChzcGFsZXR0ZS0+ZGVwdGggPT0gOCkKKyAgICAgIHsKKyAgICAgICAgICBlbnRyeWJ1ZlswXSA9IChwbmdfYnl0ZSllcFtpXS5yZWQ7CisgICAgICAgICAgZW50cnlidWZbMV0gPSAocG5nX2J5dGUpZXBbaV0uZ3JlZW47CisgICAgICAgICAgZW50cnlidWZbMl0gPSAocG5nX2J5dGUpZXBbaV0uYmx1ZTsKKyAgICAgICAgICBlbnRyeWJ1ZlszXSA9IChwbmdfYnl0ZSllcFtpXS5hbHBoYTsKKyAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNCwgZXBbaV0uZnJlcXVlbmN5KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgMCwgZXBbaV0ucmVkKTsKKyAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgMiwgZXBbaV0uZ3JlZW4pOworICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA0LCBlcFtpXS5ibHVlKTsKKyAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNiwgZXBbaV0uYWxwaGEpOworICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA4LCBlcFtpXS5mcmVxdWVuY3kpOworICAgICAgfQorICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgZW50cnlidWYsIChwbmdfc2l6ZV90KWVudHJ5X3NpemUpOworICAgfQorI2VuZGlmCisKKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7CisgICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfbmFtZSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zQklUX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIHNCSVQgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3NCSVQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbG9yXzhwIHNiaXQsIGludCBjb2xvcl90eXBlKQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfc0JJVDsKKyNlbmRpZgorICAgcG5nX2J5dGUgYnVmWzRdOworICAgcG5nX3NpemVfdCBzaXplOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9zQklUIik7CisKKyAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBkZXBlbmQgdXBvbiB0aGUgb3JkZXIgb2YgUE5HX0NPTE9SXzggKi8KKyAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCisgICB7CisgICAgICBwbmdfYnl0ZSBtYXhiaXRzOworCisgICAgICBtYXhiaXRzID0gKHBuZ19ieXRlKShjb2xvcl90eXBlPT1QTkdfQ09MT1JfVFlQRV9QQUxFVFRFID8gOCA6CisgICAgICAgICAgICAgICAgcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCk7CisgICAgICBpZiAoc2JpdC0+cmVkID09IDAgfHwgc2JpdC0+cmVkID4gbWF4Yml0cyB8fAorICAgICAgICAgIHNiaXQtPmdyZWVuID09IDAgfHwgc2JpdC0+Z3JlZW4gPiBtYXhiaXRzIHx8CisgICAgICAgICAgc2JpdC0+Ymx1ZSA9PSAwIHx8IHNiaXQtPmJsdWUgPiBtYXhiaXRzKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc0JJVCBkZXB0aCBzcGVjaWZpZWQiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGJ1ZlswXSA9IHNiaXQtPnJlZDsKKyAgICAgIGJ1ZlsxXSA9IHNiaXQtPmdyZWVuOworICAgICAgYnVmWzJdID0gc2JpdC0+Ymx1ZTsKKyAgICAgIHNpemUgPSAzOworICAgfQorICAgZWxzZQorICAgeworICAgICAgaWYgKHNiaXQtPmdyYXkgPT0gMCB8fCBzYml0LT5ncmF5ID4gcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNCSVQgZGVwdGggc3BlY2lmaWVkIik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBidWZbMF0gPSBzYml0LT5ncmF5OworICAgICAgc2l6ZSA9IDE7CisgICB9CisKKyAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCisgICB7CisgICAgICBpZiAoc2JpdC0+YWxwaGEgPT0gMCB8fCBzYml0LT5hbHBoYSA+IHBuZ19wdHItPnVzcl9iaXRfZGVwdGgpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQklUIGRlcHRoIHNwZWNpZmllZCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYnVmW3NpemUrK10gPSBzYml0LT5hbHBoYTsKKyAgIH0KKworICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3NCSVQsIGJ1Ziwgc2l6ZSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9jSFJNX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIGNIUk0gY2h1bmsgKi8KKyNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9jSFJNKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGRvdWJsZSB3aGl0ZV94LCBkb3VibGUgd2hpdGVfeSwKKyAgIGRvdWJsZSByZWRfeCwgZG91YmxlIHJlZF95LCBkb3VibGUgZ3JlZW5feCwgZG91YmxlIGdyZWVuX3ksCisgICBkb3VibGUgYmx1ZV94LCBkb3VibGUgYmx1ZV95KQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfY0hSTTsKKyNlbmRpZgorICAgcG5nX2J5dGUgYnVmWzMyXTsKKworICAgcG5nX2ZpeGVkX3BvaW50IGludF93aGl0ZV94LCBpbnRfd2hpdGVfeSwgaW50X3JlZF94LCBpbnRfcmVkX3ksCisgICAgICBpbnRfZ3JlZW5feCwgaW50X2dyZWVuX3ksIGludF9ibHVlX3gsIGludF9ibHVlX3k7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2NIUk0iKTsKKworICAgaW50X3doaXRlX3ggPSAocG5nX3VpbnRfMzIpKHdoaXRlX3ggKiAxMDAwMDAuMCArIDAuNSk7CisgICBpbnRfd2hpdGVfeSA9IChwbmdfdWludF8zMikod2hpdGVfeSAqIDEwMDAwMC4wICsgMC41KTsKKyAgIGludF9yZWRfeCAgID0gKHBuZ191aW50XzMyKShyZWRfeCAgICogMTAwMDAwLjAgKyAwLjUpOworICAgaW50X3JlZF95ICAgPSAocG5nX3VpbnRfMzIpKHJlZF95ICAgKiAxMDAwMDAuMCArIDAuNSk7CisgICBpbnRfZ3JlZW5feCA9IChwbmdfdWludF8zMikoZ3JlZW5feCAqIDEwMDAwMC4wICsgMC41KTsKKyAgIGludF9ncmVlbl95ID0gKHBuZ191aW50XzMyKShncmVlbl95ICogMTAwMDAwLjAgKyAwLjUpOworICAgaW50X2JsdWVfeCAgPSAocG5nX3VpbnRfMzIpKGJsdWVfeCAgKiAxMDAwMDAuMCArIDAuNSk7CisgICBpbnRfYmx1ZV95ICA9IChwbmdfdWludF8zMikoYmx1ZV95ICAqIDEwMDAwMC4wICsgMC41KTsKKworI2lmZGVmIFBOR19DSEVDS19jSFJNX1NVUFBPUlRFRAorICAgaWYgKHBuZ19jaGVja19jSFJNX2ZpeGVkKHBuZ19wdHIsIGludF93aGl0ZV94LCBpbnRfd2hpdGVfeSwKKyAgICAgIGludF9yZWRfeCwgaW50X3JlZF95LCBpbnRfZ3JlZW5feCwgaW50X2dyZWVuX3ksIGludF9ibHVlX3gsIGludF9ibHVlX3kpKQorI2VuZGlmCisgICB7CisgICAgICAvKiBFYWNoIHZhbHVlIGlzIHNhdmVkIGluIDEvMTAwLDAwMHRocyAqLworCisgICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgaW50X3doaXRlX3gpOworICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA0LCBpbnRfd2hpdGVfeSk7CisKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgOCwgaW50X3JlZF94KTsKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMTIsIGludF9yZWRfeSk7CisKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMTYsIGludF9ncmVlbl94KTsKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMjAsIGludF9ncmVlbl95KTsKKworICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAyNCwgaW50X2JsdWVfeCk7CisgICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDI4LCBpbnRfYmx1ZV95KTsKKworICAgICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX2NIUk0sIGJ1ZiwgKHBuZ19zaXplX3QpMzIpOworICAgfQorfQorI2VuZGlmCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfY0hSTV9maXhlZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeCwKKyAgIHBuZ19maXhlZF9wb2ludCB3aGl0ZV95LCBwbmdfZml4ZWRfcG9pbnQgcmVkX3gsIHBuZ19maXhlZF9wb2ludCByZWRfeSwKKyAgIHBuZ19maXhlZF9wb2ludCBncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5feSwgcG5nX2ZpeGVkX3BvaW50IGJsdWVfeCwKKyAgIHBuZ19maXhlZF9wb2ludCBibHVlX3kpCit7CisjaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKKyAgIFBOR19jSFJNOworI2VuZGlmCisgICBwbmdfYnl0ZSBidWZbMzJdOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9jSFJNIik7CisKKyAgIC8qIEVhY2ggdmFsdWUgaXMgc2F2ZWQgaW4gMS8xMDAsMDAwdGhzICovCisjaWZkZWYgUE5HX0NIRUNLX2NIUk1fU1VQUE9SVEVECisgICBpZiAocG5nX2NoZWNrX2NIUk1fZml4ZWQocG5nX3B0ciwgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LAorICAgICAgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3kpKQorI2VuZGlmCisgICB7CisgICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgKHBuZ191aW50XzMyKXdoaXRlX3gpOworICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA0LCAocG5nX3VpbnRfMzIpd2hpdGVfeSk7CisKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgOCwgKHBuZ191aW50XzMyKXJlZF94KTsKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMTIsIChwbmdfdWludF8zMilyZWRfeSk7CisKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMTYsIChwbmdfdWludF8zMilncmVlbl94KTsKKyAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMjAsIChwbmdfdWludF8zMilncmVlbl95KTsKKworICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAyNCwgKHBuZ191aW50XzMyKWJsdWVfeCk7CisgICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDI4LCAocG5nX3VpbnRfMzIpYmx1ZV95KTsKKworICAgICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX2NIUk0sIGJ1ZiwgKHBuZ19zaXplX3QpMzIpOworICAgfQorfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIHRSTlMgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3RSTlMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHRyYW5zLCBwbmdfY29sb3JfMTZwIHRyYW4sCisgICBpbnQgbnVtX3RyYW5zLCBpbnQgY29sb3JfdHlwZSkKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX3RSTlM7CisjZW5kaWYKKyAgIHBuZ19ieXRlIGJ1Zls2XTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfdFJOUyIpOworCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgeworICAgICAgaWYgKG51bV90cmFucyA8PSAwIHx8IG51bV90cmFucyA+IChpbnQpcG5nX3B0ci0+bnVtX3BhbGV0dGUpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBudW1iZXIgb2YgdHJhbnNwYXJlbnQgY29sb3JzIHNwZWNpZmllZCIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogV3JpdGUgdGhlIGNodW5rIG91dCBhcyBpdCBpcyAqLworICAgICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3RSTlMsIHRyYW5zLAorICAgICAgICAocG5nX3NpemVfdCludW1fdHJhbnMpOworICAgfQorICAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQorICAgeworICAgICAgLyogT25lIDE2IGJpdCB2YWx1ZSAqLworICAgICAgaWYgKHRyYW4tPmdyYXkgPj0gKDEgPDwgcG5nX3B0ci0+Yml0X2RlcHRoKSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHdyaXRlIHRSTlMgY2h1bmsgb3V0LW9mLXJhbmdlIGZvciBiaXRfZGVwdGgiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmLCB0cmFuLT5ncmF5KTsKKyAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ190Uk5TLCBidWYsIChwbmdfc2l6ZV90KTIpOworICAgfQorICAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCisgICB7CisgICAgICAvKiBUaHJlZSAxNiBiaXQgdmFsdWVzICovCisgICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgdHJhbi0+cmVkKTsKKyAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmICsgMiwgdHJhbi0+Z3JlZW4pOworICAgICAgcG5nX3NhdmVfdWludF8xNihidWYgKyA0LCB0cmFuLT5ibHVlKTsKKyAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gOCAmJiAoYnVmWzBdIHwgYnVmWzJdIHwgYnVmWzRdKSkKKyAgICAgIHsKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCisgICAgICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHdyaXRlIDE2LWJpdCB0Uk5TIGNodW5rIHdoZW4gYml0X2RlcHRoIGlzIDgiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ190Uk5TLCBidWYsIChwbmdfc2l6ZV90KTYpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkNhbid0IHdyaXRlIHRSTlMgd2l0aCBhbiBhbHBoYSBjaGFubmVsIik7CisgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIGJhY2tncm91bmQgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX2JLR0QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbG9yXzE2cCBiYWNrLCBpbnQgY29sb3JfdHlwZSkKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX2JLR0Q7CisjZW5kaWYKKyAgIHBuZ19ieXRlIGJ1Zls2XTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfYktHRCIpOworCisgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQorICAgeworICAgICAgaWYgKAorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECisgICAgICAgICAgKHBuZ19wdHItPm51bV9wYWxldHRlIHx8CisgICAgICAgICAgKCEocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19FTVBUWV9QTFRFKSkpICYmCisjZW5kaWYKKyAgICAgICAgIGJhY2stPmluZGV4ID49IHBuZ19wdHItPm51bV9wYWxldHRlKQorICAgICAgeworICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgYmFja2dyb3VuZCBwYWxldHRlIGluZGV4Iik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBidWZbMF0gPSBiYWNrLT5pbmRleDsKKyAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19iS0dELCBidWYsIChwbmdfc2l6ZV90KTEpOworICAgfQorICAgZWxzZSBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQorICAgeworICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIGJhY2stPnJlZCk7CisgICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiArIDIsIGJhY2stPmdyZWVuKTsKKyAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmICsgNCwgYmFjay0+Ymx1ZSk7CisgICAgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDggJiYgKGJ1ZlswXSB8IGJ1ZlsyXSB8IGJ1Zls0XSkpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSAxNi1iaXQgYktHRCBjaHVuayB3aGVuIGJpdF9kZXB0aCBpcyA4Iik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfYktHRCwgYnVmLCAocG5nX3NpemVfdCk2KTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGlmIChiYWNrLT5ncmF5ID49ICgxIDw8IHBuZ19wdHItPmJpdF9kZXB0aCkpCisgICAgICB7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAorICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSBiS0dEIGNodW5rIG91dC1vZi1yYW5nZSBmb3IgYml0X2RlcHRoIik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgYmFjay0+Z3JheSk7CisgICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfYktHRCwgYnVmLCAocG5nX3NpemVfdCkyKTsKKyAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX2hJU1RfU1VQUE9SVEVECisvKiBXcml0ZSB0aGUgaGlzdG9ncmFtICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9oSVNUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzE2cCBoaXN0LCBpbnQgbnVtX2hpc3QpCit7CisjaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKKyAgIFBOR19oSVNUOworI2VuZGlmCisgICBpbnQgaTsKKyAgIHBuZ19ieXRlIGJ1ZlszXTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaElTVCIpOworCisgICBpZiAobnVtX2hpc3QgPiAoaW50KXBuZ19wdHItPm51bV9wYWxldHRlKQorICAgeworICAgICAgcG5nX2RlYnVnMigzLCAibnVtX2hpc3QgPSAlZCwgbnVtX3BhbGV0dGUgPSAlZCIsIG51bV9oaXN0LAorICAgICAgICAgcG5nX3B0ci0+bnVtX3BhbGV0dGUpOworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgbnVtYmVyIG9mIGhpc3RvZ3JhbSBlbnRyaWVzIHNwZWNpZmllZCIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfaElTVCwKKyAgICAgKHBuZ191aW50XzMyKShudW1faGlzdCAqIDIpKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBudW1faGlzdDsgaSsrKQorICAgeworICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIGhpc3RbaV0pOworICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkyKTsKKyAgIH0KKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRCkgfHwgXAorICAgIGRlZmluZWQoUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9zUExUX1NVUFBPUlRFRCkKKy8qIENoZWNrIHRoYXQgdGhlIHRFWHQgb3IgelRYdCBrZXl3b3JkIGlzIHZhbGlkIHBlciBQTkcgMS4wIHNwZWNpZmljYXRpb24sCisgKiBhbmQgaWYgaW52YWxpZCwgY29ycmVjdCB0aGUga2V5d29yZCByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIHRoZSBlbnRpcmUKKyAqIGNodW5rLiAgVGhlIFBORyAxLjAgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBrZXl3b3JkcyAxLTc5IGNoYXJhY3RlcnMgaW4KKyAqIGxlbmd0aCwgZm9yYmlkcyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UsIG11bHRpcGxlIGludGVybmFsIHNwYWNlcywKKyAqIGFuZCB0aGUgbm9uLWJyZWFrIHNwYWNlICgweDgwKSBmcm9tIElTTyA4ODU5LTEuICBSZXR1cm5zIGtleXdvcmQgbGVuZ3RoLgorICoKKyAqIFRoZSBuZXdfa2V5IGlzIGFsbG9jYXRlZCB0byBob2xkIHRoZSBjb3JyZWN0ZWQga2V5d29yZCBhbmQgbXVzdCBiZSBmcmVlZAorICogYnkgdGhlIGNhbGxpbmcgcm91dGluZS4gIFRoaXMgYXZvaWRzIHByb2JsZW1zIHdpdGggdHJ5aW5nIHRvIHdyaXRlIHRvCisgKiBzdGF0aWMga2V5d29yZHMgd2l0aG91dCBoYXZpbmcgdG8gaGF2ZSBkdXBsaWNhdGUgY29waWVzIG9mIHRoZSBzdHJpbmdzLgorICovCitwbmdfc2l6ZV90IC8qIFBSSVZBVEUgKi8KK3BuZ19jaGVja19rZXl3b3JkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jaGFycCBrZXksIHBuZ19jaGFycHAgbmV3X2tleSkKK3sKKyAgIHBuZ19zaXplX3Qga2V5X2xlbjsKKyAgIHBuZ19jaGFycCBrcCwgZHA7CisgICBpbnQga2ZsYWc7CisgICBpbnQga3dhcm49MDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY2hlY2tfa2V5d29yZCIpOworCisgICAqbmV3X2tleSA9IE5VTEw7CisKKyAgIGlmIChrZXkgPT0gTlVMTCB8fCAoa2V5X2xlbiA9IHBuZ19zdHJsZW4oa2V5KSkgPT0gMCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJ6ZXJvIGxlbmd0aCBrZXl3b3JkIik7CisgICAgICByZXR1cm4gKChwbmdfc2l6ZV90KTApOworICAgfQorCisgICBwbmdfZGVidWcxKDIsICJLZXl3b3JkIHRvIGJlIGNoZWNrZWQgaXMgJyVzJyIsIGtleSk7CisKKyAgICpuZXdfa2V5ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgKHBuZ191aW50XzMyKShrZXlfbGVuICsgMikpOworICAgaWYgKCpuZXdfa2V5ID09IE5VTEwpCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIG1lbW9yeSB3aGlsZSBwcm9jZXNpbmcga2V5d29yZCIpOworICAgICAgcmV0dXJuICgocG5nX3NpemVfdCkwKTsKKyAgIH0KKworICAgLyogUmVwbGFjZSBub24tcHJpbnRpbmcgY2hhcmFjdGVycyB3aXRoIGEgYmxhbmsgYW5kIHByaW50IGEgd2FybmluZyAqLworICAgZm9yIChrcCA9IGtleSwgZHAgPSAqbmV3X2tleTsgKmtwICE9ICdcMCc7IGtwKyssIGRwKyspCisgICB7CisgICAgICBpZiAoKHBuZ19ieXRlKSprcCA8IDB4MjAgfHwKKyAgICAgICAgICgocG5nX2J5dGUpKmtwID4gMHg3RSAmJiAocG5nX2J5dGUpKmtwIDwgMHhBMSkpCisgICAgICB7CisjaWYgZGVmaW5lZChQTkdfU1RESU9fU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQorICAgICAgICAgY2hhciBtc2dbNDBdOworCisgICAgICAgICBwbmdfc25wcmludGYobXNnLCA0MCwKKyAgICAgICAgICAgImludmFsaWQga2V5d29yZCBjaGFyYWN0ZXIgMHglMDJYIiwgKHBuZ19ieXRlKSprcCk7CisgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOworI2Vsc2UKKyAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJpbnZhbGlkIGNoYXJhY3RlciBpbiBrZXl3b3JkIik7CisjZW5kaWYKKyAgICAgICAgICpkcCA9ICcgJzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICpkcCA9ICprcDsKKyAgICAgIH0KKyAgIH0KKyAgICpkcCA9ICdcMCc7CisKKyAgIC8qIFJlbW92ZSBhbnkgdHJhaWxpbmcgd2hpdGUgc3BhY2UuICovCisgICBrcCA9ICpuZXdfa2V5ICsga2V5X2xlbiAtIDE7CisgICBpZiAoKmtwID09ICcgJykKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJ0cmFpbGluZyBzcGFjZXMgcmVtb3ZlZCBmcm9tIGtleXdvcmQiKTsKKworICAgICAgd2hpbGUgKCprcCA9PSAnICcpCisgICAgICB7CisgICAgICAgICAqKGtwLS0pID0gJ1wwJzsKKyAgICAgICAgIGtleV9sZW4tLTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogUmVtb3ZlIGFueSBsZWFkaW5nIHdoaXRlIHNwYWNlLiAqLworICAga3AgPSAqbmV3X2tleTsKKyAgIGlmICgqa3AgPT0gJyAnKQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImxlYWRpbmcgc3BhY2VzIHJlbW92ZWQgZnJvbSBrZXl3b3JkIik7CisKKyAgICAgIHdoaWxlICgqa3AgPT0gJyAnKQorICAgICAgeworICAgICAgICAga3ArKzsKKyAgICAgICAgIGtleV9sZW4tLTsKKyAgICAgIH0KKyAgIH0KKworICAgcG5nX2RlYnVnMSgyLCAiQ2hlY2tpbmcgZm9yIG11bHRpcGxlIGludGVybmFsIHNwYWNlcyBpbiAnJXMnIiwga3ApOworCisgICAvKiBSZW1vdmUgbXVsdGlwbGUgaW50ZXJuYWwgc3BhY2VzLiAqLworICAgZm9yIChrZmxhZyA9IDAsIGRwID0gKm5ld19rZXk7ICprcCAhPSAnXDAnOyBrcCsrKQorICAgeworICAgICAgaWYgKCprcCA9PSAnICcgJiYga2ZsYWcgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgICooZHArKykgPSAqa3A7CisgICAgICAgICBrZmxhZyA9IDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICgqa3AgPT0gJyAnKQorICAgICAgeworICAgICAgICAga2V5X2xlbi0tOworICAgICAgICAga3dhcm49MTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICooZHArKykgPSAqa3A7CisgICAgICAgICBrZmxhZyA9IDA7CisgICAgICB9CisgICB9CisgICAqZHAgPSAnXDAnOworICAgaWYgKGt3YXJuKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImV4dHJhIGludGVyaW9yIHNwYWNlcyByZW1vdmVkIGZyb20ga2V5d29yZCIpOworCisgICBpZiAoa2V5X2xlbiA9PSAwKQorICAgeworICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgKm5ld19rZXkpOworICAgICAgICpuZXdfa2V5PU5VTEw7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiWmVybyBsZW5ndGgga2V5d29yZCIpOworICAgfQorCisgICBpZiAoa2V5X2xlbiA+IDc5KQorICAgeworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImtleXdvcmQgbGVuZ3RoIG11c3QgYmUgMSAtIDc5IGNoYXJhY3RlcnMiKTsKKyAgICAgICgqbmV3X2tleSlbNzldID0gJ1wwJzsKKyAgICAgIGtleV9sZW4gPSA3OTsKKyAgIH0KKworICAgcmV0dXJuIChrZXlfbGVuKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVECisvKiBXcml0ZSBhIHRFWHQgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3RFWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIGtleSwgcG5nX2NoYXJwIHRleHQsCisgICBwbmdfc2l6ZV90IHRleHRfbGVuKQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfdEVYdDsKKyNlbmRpZgorICAgcG5nX3NpemVfdCBrZXlfbGVuOworICAgcG5nX2NoYXJwIG5ld19rZXk7CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3RFWHQiKTsKKworICAgaWYgKChrZXlfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0ciwga2V5LCAmbmV3X2tleSkpPT0wKQorICAgICAgcmV0dXJuOworCisgICBpZiAodGV4dCA9PSBOVUxMIHx8ICp0ZXh0ID09ICdcMCcpCisgICAgICB0ZXh0X2xlbiA9IDA7CisgICBlbHNlCisgICAgICB0ZXh0X2xlbiA9IHBuZ19zdHJsZW4odGV4dCk7CisKKyAgIC8qIE1ha2Ugc3VyZSB3ZSBpbmNsdWRlIHRoZSAwIGFmdGVyIHRoZSBrZXkgKi8KKyAgIHBuZ193cml0ZV9jaHVua19zdGFydChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ190RVh0LAorICAgICAgKHBuZ191aW50XzMyKShrZXlfbGVuICsgdGV4dF9sZW4gKyAxKSk7CisgICAvKgorICAgICogV2UgbGVhdmUgaXQgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIG1lZXQgUE5HLTEuMCByZXF1aXJlbWVudHMgb24gdGhlCisgICAgKiBjb250ZW50cyBvZiB0aGUgdGV4dC4gIFBORy0xLjAgdGhyb3VnaCBQTkctMS4yIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZgorICAgICogYW55IG5vbi1MYXRpbi0xIGNoYXJhY3RlcnMgZXhjZXB0IGZvciBORVdMSU5FLiAgSVNPIFBORyB3aWxsIGZvcmJpZCB0aGVtLgorICAgICogVGhlIE5VTCBjaGFyYWN0ZXIgaXMgZm9yYmlkZGVuIGJ5IFBORy0xLjAgdGhyb3VnaCBQTkctMS4yIGFuZCBJU08gUE5HLgorICAgICovCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKW5ld19rZXksCisgICAgIChwbmdfc2l6ZV90KShrZXlfbGVuICsgMSkpOworICAgaWYgKHRleHRfbGVuKQorICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19ieXRlcCl0ZXh0LCAocG5nX3NpemVfdCl0ZXh0X2xlbik7CisKKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7CisgICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfa2V5KTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVECisvKiBXcml0ZSBhIGNvbXByZXNzZWQgdGV4dCBjaHVuayAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfelRYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAga2V5LCBwbmdfY2hhcnAgdGV4dCwKKyAgIHBuZ19zaXplX3QgdGV4dF9sZW4sIGludCBjb21wcmVzc2lvbikKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX3pUWHQ7CisjZW5kaWYKKyAgIHBuZ19zaXplX3Qga2V5X2xlbjsKKyAgIGNoYXIgYnVmWzFdOworICAgcG5nX2NoYXJwIG5ld19rZXk7CisgICBjb21wcmVzc2lvbl9zdGF0ZSBjb21wOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV96VFh0Iik7CisKKyAgIGNvbXAubnVtX291dHB1dF9wdHIgPSAwOworICAgY29tcC5tYXhfb3V0cHV0X3B0ciA9IDA7CisgICBjb21wLm91dHB1dF9wdHIgPSBOVUxMOworICAgY29tcC5pbnB1dCA9IE5VTEw7CisgICBjb21wLmlucHV0X2xlbiA9IDA7CisKKyAgIGlmICgoa2V5X2xlbiA9IHBuZ19jaGVja19rZXl3b3JkKHBuZ19wdHIsIGtleSwgJm5ld19rZXkpKT09MCkKKyAgIHsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19rZXkpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAodGV4dCA9PSBOVUxMIHx8ICp0ZXh0ID09ICdcMCcgfHwgY29tcHJlc3Npb249PVBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUpCisgICB7CisgICAgICBwbmdfd3JpdGVfdEVYdChwbmdfcHRyLCBuZXdfa2V5LCB0ZXh0LCAocG5nX3NpemVfdCkwKTsKKyAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19rZXkpOworICAgICAgcmV0dXJuOworICAgfQorCisgICB0ZXh0X2xlbiA9IHBuZ19zdHJsZW4odGV4dCk7CisKKyAgIC8qIENvbXB1dGUgdGhlIGNvbXByZXNzZWQgZGF0YTsgZG8gaXQgbm93IGZvciB0aGUgbGVuZ3RoICovCisgICB0ZXh0X2xlbiA9IHBuZ190ZXh0X2NvbXByZXNzKHBuZ19wdHIsIHRleHQsIHRleHRfbGVuLCBjb21wcmVzc2lvbiwKKyAgICAgICAmY29tcCk7CisKKyAgIC8qIFdyaXRlIHN0YXJ0IG9mIGNodW5rICovCisgICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfelRYdCwKKyAgICAgKHBuZ191aW50XzMyKShrZXlfbGVuK3RleHRfbGVuICsgMikpOworICAgLyogV3JpdGUga2V5ICovCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKW5ld19rZXksCisgICAgIChwbmdfc2l6ZV90KShrZXlfbGVuICsgMSkpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X2tleSk7CisKKyAgIGJ1ZlswXSA9IChwbmdfYnl0ZSljb21wcmVzc2lvbjsKKyAgIC8qIFdyaXRlIGNvbXByZXNzaW9uICovCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKWJ1ZiwgKHBuZ19zaXplX3QpMSk7CisgICAvKiBXcml0ZSB0aGUgY29tcHJlc3NlZCBkYXRhICovCisgICBwbmdfd3JpdGVfY29tcHJlc3NlZF9kYXRhX291dChwbmdfcHRyLCAmY29tcCk7CisKKyAgIC8qIENsb3NlIHRoZSBjaHVuayAqLworICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUE5HX1dSSVRFX2lUWHRfU1VQUE9SVEVECisvKiBXcml0ZSBhbiBpVFh0IGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9pVFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBjb21wcmVzc2lvbiwgcG5nX2NoYXJwIGtleSwKKyAgICBwbmdfY2hhcnAgbGFuZywgcG5nX2NoYXJwIGxhbmdfa2V5LCBwbmdfY2hhcnAgdGV4dCkKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX2lUWHQ7CisjZW5kaWYKKyAgIHBuZ19zaXplX3QgbGFuZ19sZW4sIGtleV9sZW4sIGxhbmdfa2V5X2xlbiwgdGV4dF9sZW47CisgICBwbmdfY2hhcnAgbmV3X2xhbmc7CisgICBwbmdfY2hhcnAgbmV3X2tleSA9IE5VTEw7CisgICBwbmdfYnl0ZSBjYnVmWzJdOworICAgY29tcHJlc3Npb25fc3RhdGUgY29tcDsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaVRYdCIpOworCisgICBjb21wLm51bV9vdXRwdXRfcHRyID0gMDsKKyAgIGNvbXAubWF4X291dHB1dF9wdHIgPSAwOworICAgY29tcC5vdXRwdXRfcHRyID0gTlVMTDsKKyAgIGNvbXAuaW5wdXQgPSBOVUxMOworCisgICBpZiAoKGtleV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBrZXksICZuZXdfa2V5KSk9PTApCisgICAgICByZXR1cm47CisKKyAgIGlmICgobGFuZ19sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBsYW5nLCAmbmV3X2xhbmcpKT09MCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFbXB0eSBsYW5ndWFnZSBmaWVsZCBpbiBpVFh0IGNodW5rIik7CisgICAgICBuZXdfbGFuZyA9IE5VTEw7CisgICAgICBsYW5nX2xlbiA9IDA7CisgICB9CisKKyAgIGlmIChsYW5nX2tleSA9PSBOVUxMKQorICAgICAgbGFuZ19rZXlfbGVuID0gMDsKKyAgIGVsc2UKKyAgICAgIGxhbmdfa2V5X2xlbiA9IHBuZ19zdHJsZW4obGFuZ19rZXkpOworCisgICBpZiAodGV4dCA9PSBOVUxMKQorICAgICAgdGV4dF9sZW4gPSAwOworICAgZWxzZQorICAgICAgdGV4dF9sZW4gPSBwbmdfc3RybGVuKHRleHQpOworCisgICAvKiBDb21wdXRlIHRoZSBjb21wcmVzc2VkIGRhdGE7IGRvIGl0IG5vdyBmb3IgdGhlIGxlbmd0aCAqLworICAgdGV4dF9sZW4gPSBwbmdfdGV4dF9jb21wcmVzcyhwbmdfcHRyLCB0ZXh0LCB0ZXh0X2xlbiwgY29tcHJlc3Npb24tMiwKKyAgICAgICZjb21wKTsKKworCisgICAvKiBNYWtlIHN1cmUgd2UgaW5jbHVkZSB0aGUgY29tcHJlc3Npb24gZmxhZywgdGhlIGNvbXByZXNzaW9uIGJ5dGUsCisgICAgKiBhbmQgdGhlIE5VTHMgYWZ0ZXIgdGhlIGtleSwgbGFuZywgYW5kIGxhbmdfa2V5IHBhcnRzICovCisKKyAgIHBuZ193cml0ZV9jaHVua19zdGFydChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19pVFh0LAorICAgICAgICAgIChwbmdfdWludF8zMikoCisgICAgICAgIDUgLyogY29tcCBieXRlLCBjb21wIGZsYWcsIHRlcm1pbmF0b3JzIGZvciBrZXksIGxhbmcgYW5kIGxhbmdfa2V5ICovCisgICAgICAgICsga2V5X2xlbgorICAgICAgICArIGxhbmdfbGVuCisgICAgICAgICsgbGFuZ19rZXlfbGVuCisgICAgICAgICsgdGV4dF9sZW4pKTsKKworICAgLyogV2UgbGVhdmUgaXQgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIG1lZXQgUE5HLTEuMCByZXF1aXJlbWVudHMgb24gdGhlCisgICAgKiBjb250ZW50cyBvZiB0aGUgdGV4dC4gIFBORy0xLjAgdGhyb3VnaCBQTkctMS4yIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZgorICAgICogYW55IG5vbi1MYXRpbi0xIGNoYXJhY3RlcnMgZXhjZXB0IGZvciBORVdMSU5FLiAgSVNPIFBORyB3aWxsIGZvcmJpZCB0aGVtLgorICAgICogVGhlIE5VTCBjaGFyYWN0ZXIgaXMgZm9yYmlkZGVuIGJ5IFBORy0xLjAgdGhyb3VnaCBQTkctMS4yIGFuZCBJU08gUE5HLgorICAgICovCisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKW5ld19rZXksCisgICAgIChwbmdfc2l6ZV90KShrZXlfbGVuICsgMSkpOworCisgICAvKiBTZXQgdGhlIGNvbXByZXNzaW9uIGZsYWcgKi8KKyAgIGlmIChjb21wcmVzc2lvbiA9PSBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FIHx8IFwKKyAgICAgICBjb21wcmVzc2lvbiA9PSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FKQorICAgICAgIGNidWZbMF0gPSAwOworICAgZWxzZSAvKiBjb21wcmVzc2lvbiA9PSBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0ICovCisgICAgICAgY2J1ZlswXSA9IDE7CisgICAvKiBTZXQgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCAqLworICAgY2J1ZlsxXSA9IDA7CisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBjYnVmLCAocG5nX3NpemVfdCkyKTsKKworICAgY2J1ZlswXSA9IDA7CisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAobmV3X2xhbmcgPyAocG5nX2J5dGVwKW5ld19sYW5nIDogY2J1ZiksCisgICAgIChwbmdfc2l6ZV90KShsYW5nX2xlbiArIDEpKTsKKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChsYW5nX2tleSA/IChwbmdfYnl0ZXApbGFuZ19rZXkgOiBjYnVmKSwKKyAgICAgKHBuZ19zaXplX3QpKGxhbmdfa2V5X2xlbiArIDEpKTsKKyAgIHBuZ193cml0ZV9jb21wcmVzc2VkX2RhdGFfb3V0KHBuZ19wdHIsICZjb21wKTsKKworICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKKyAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19rZXkpOworICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X2xhbmcpOworfQorI2VuZGlmCisKKyNpZmRlZiBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQKKy8qIFdyaXRlIHRoZSBvRkZzIGNodW5rICovCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9vRkZzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbnRfMzIgeF9vZmZzZXQsIHBuZ19pbnRfMzIgeV9vZmZzZXQsCisgICBpbnQgdW5pdF90eXBlKQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfb0ZGczsKKyNlbmRpZgorICAgcG5nX2J5dGUgYnVmWzldOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9vRkZzIik7CisKKyAgIGlmICh1bml0X3R5cGUgPj0gUE5HX09GRlNFVF9MQVNUKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCB1bml0IHR5cGUgZm9yIG9GRnMgY2h1bmsiKTsKKworICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiwgeF9vZmZzZXQpOworICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArIDQsIHlfb2Zmc2V0KTsKKyAgIGJ1Zls4XSA9IChwbmdfYnl0ZSl1bml0X3R5cGU7CisKKyAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19vRkZzLCBidWYsIChwbmdfc2l6ZV90KTkpOworfQorI2VuZGlmCisjaWZkZWYgUE5HX1dSSVRFX3BDQUxfU1VQUE9SVEVECisvKiBXcml0ZSB0aGUgcENBTCBjaHVuayAoZGVzY3JpYmVkIGluIHRoZSBQTkcgZXh0ZW5zaW9ucyBkb2N1bWVudCkgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3BDQUwocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIHB1cnBvc2UsIHBuZ19pbnRfMzIgWDAsCisgICBwbmdfaW50XzMyIFgxLCBpbnQgdHlwZSwgaW50IG5wYXJhbXMsIHBuZ19jaGFycCB1bml0cywgcG5nX2NoYXJwcCBwYXJhbXMpCit7CisjaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKKyAgIFBOR19wQ0FMOworI2VuZGlmCisgICBwbmdfc2l6ZV90IHB1cnBvc2VfbGVuLCB1bml0c19sZW4sIHRvdGFsX2xlbjsKKyAgIHBuZ191aW50XzMycCBwYXJhbXNfbGVuOworICAgcG5nX2J5dGUgYnVmWzEwXTsKKyAgIHBuZ19jaGFycCBuZXdfcHVycG9zZTsKKyAgIGludCBpOworCisgICBwbmdfZGVidWcxKDEsICJpbiBwbmdfd3JpdGVfcENBTCAoJWQgcGFyYW1ldGVycykiLCBucGFyYW1zKTsKKworICAgaWYgKHR5cGUgPj0gUE5HX0VRVUFUSU9OX0xBU1QpCisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5yZWNvZ25pemVkIGVxdWF0aW9uIHR5cGUgZm9yIHBDQUwgY2h1bmsiKTsKKworICAgcHVycG9zZV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBwdXJwb3NlLCAmbmV3X3B1cnBvc2UpICsgMTsKKyAgIHBuZ19kZWJ1ZzEoMywgInBDQUwgcHVycG9zZSBsZW5ndGggPSAlZCIsIChpbnQpcHVycG9zZV9sZW4pOworICAgdW5pdHNfbGVuID0gcG5nX3N0cmxlbih1bml0cykgKyAobnBhcmFtcyA9PSAwID8gMCA6IDEpOworICAgcG5nX2RlYnVnMSgzLCAicENBTCB1bml0cyBsZW5ndGggPSAlZCIsIChpbnQpdW5pdHNfbGVuKTsKKyAgIHRvdGFsX2xlbiA9IHB1cnBvc2VfbGVuICsgdW5pdHNfbGVuICsgMTA7CisKKyAgIHBhcmFtc19sZW4gPSAocG5nX3VpbnRfMzJwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgIChwbmdfdWludF8zMikobnBhcmFtcyAqIHBuZ19zaXplb2YocG5nX3VpbnRfMzIpKSk7CisKKyAgIC8qIEZpbmQgdGhlIGxlbmd0aCBvZiBlYWNoIHBhcmFtZXRlciwgbWFraW5nIHN1cmUgd2UgZG9uJ3QgY291bnQgdGhlCisgICAgICBudWxsIHRlcm1pbmF0b3IgZm9yIHRoZSBsYXN0IHBhcmFtZXRlci4gKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBucGFyYW1zOyBpKyspCisgICB7CisgICAgICBwYXJhbXNfbGVuW2ldID0gcG5nX3N0cmxlbihwYXJhbXNbaV0pICsgKGkgPT0gbnBhcmFtcyAtIDEgPyAwIDogMSk7CisgICAgICBwbmdfZGVidWcyKDMsICJwQ0FMIHBhcmFtZXRlciAlZCBsZW5ndGggPSAlbHUiLCBpLAorICAgICAgICAodW5zaWduZWQgbG9uZykgcGFyYW1zX2xlbltpXSk7CisgICAgICB0b3RhbF9sZW4gKz0gKHBuZ19zaXplX3QpcGFyYW1zX2xlbltpXTsKKyAgIH0KKworICAgcG5nX2RlYnVnMSgzLCAicENBTCB0b3RhbCBsZW5ndGggPSAlZCIsIChpbnQpdG90YWxfbGVuKTsKKyAgIHBuZ193cml0ZV9jaHVua19zdGFydChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wQ0FMLCAocG5nX3VpbnRfMzIpdG90YWxfbGVuKTsKKyAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApbmV3X3B1cnBvc2UsCisgICAgIChwbmdfc2l6ZV90KXB1cnBvc2VfbGVuKTsKKyAgIHBuZ19zYXZlX2ludF8zMihidWYsIFgwKTsKKyAgIHBuZ19zYXZlX2ludF8zMihidWYgKyA0LCBYMSk7CisgICBidWZbOF0gPSAocG5nX2J5dGUpdHlwZTsKKyAgIGJ1Zls5XSA9IChwbmdfYnl0ZSlucGFyYW1zOworICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkxMCk7CisgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKXVuaXRzLCAocG5nX3NpemVfdCl1bml0c19sZW4pOworCisgICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfcHVycG9zZSk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBucGFyYW1zOyBpKyspCisgICB7CisgICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKXBhcmFtc1tpXSwKKyAgICAgICAgIChwbmdfc2l6ZV90KXBhcmFtc19sZW5baV0pOworICAgfQorCisgICBwbmdfZnJlZShwbmdfcHRyLCBwYXJhbXNfbGVuKTsKKyAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIHNDQUwgY2h1bmsgKi8KKyNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkKK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3NDQUwocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IHVuaXQsIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkKK3sKKyNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUworICAgUE5HX3NDQUw7CisjZW5kaWYKKyAgIGNoYXIgYnVmWzY0XTsKKyAgIHBuZ19zaXplX3QgdG90YWxfbGVuOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9zQ0FMIik7CisKKyAgIGJ1ZlswXSA9IChjaGFyKXVuaXQ7CisjaWZkZWYgX1dJTjMyX1dDRQorLyogc3ByaW50ZigpIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93c0NFICovCisgICB7CisgICAgICB3Y2hhcl90IHdjX2J1ZlszMl07CisgICAgICBzaXplX3Qgd2NfbGVuOworICAgICAgc3dwcmludGYod2NfYnVmLCBURVhUKCIlMTIuMTJlIiksIHdpZHRoKTsKKyAgICAgIHdjX2xlbiA9IHdjc2xlbih3Y19idWYpOworICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHdjX2J1ZiwgLTEsIGJ1ZiArIDEsIHdjX2xlbiwgTlVMTCwKKyAgICAgICAgICBOVUxMKTsKKyAgICAgIHRvdGFsX2xlbiA9IHdjX2xlbiArIDI7CisgICAgICBzd3ByaW50Zih3Y19idWYsIFRFWFQoIiUxMi4xMmUiKSwgaGVpZ2h0KTsKKyAgICAgIHdjX2xlbiA9IHdjc2xlbih3Y19idWYpOworICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHdjX2J1ZiwgLTEsIGJ1ZiArIHRvdGFsX2xlbiwgd2NfbGVuLAorICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgICB0b3RhbF9sZW4gKz0gd2NfbGVuOworICAgfQorI2Vsc2UKKyAgIHBuZ19zbnByaW50ZihidWYgKyAxLCA2MywgIiUxMi4xMmUiLCB3aWR0aCk7CisgICB0b3RhbF9sZW4gPSAxICsgcG5nX3N0cmxlbihidWYgKyAxKSArIDE7CisgICBwbmdfc25wcmludGYoYnVmICsgdG90YWxfbGVuLCA2NC10b3RhbF9sZW4sICIlMTIuMTJlIiwgaGVpZ2h0KTsKKyAgIHRvdGFsX2xlbiArPSBwbmdfc3RybGVuKGJ1ZiArIHRvdGFsX2xlbik7CisjZW5kaWYKKworICAgcG5nX2RlYnVnMSgzLCAic0NBTCB0b3RhbCBsZW5ndGggPSAldSIsICh1bnNpZ25lZCBpbnQpdG90YWxfbGVuKTsKKyAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19zQ0FMLCAocG5nX2J5dGVwKWJ1ZiwgdG90YWxfbGVuKTsKK30KKyNlbHNlCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfc0NBTF9zKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCB1bml0LCBwbmdfY2hhcnAgd2lkdGgsCisgICBwbmdfY2hhcnAgaGVpZ2h0KQoreworI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCisgICBQTkdfc0NBTDsKKyNlbmRpZgorICAgcG5nX2J5dGUgYnVmWzY0XTsKKyAgIHBuZ19zaXplX3Qgd2xlbiwgaGxlbiwgdG90YWxfbGVuOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9zQ0FMX3MiKTsKKworICAgd2xlbiA9IHBuZ19zdHJsZW4od2lkdGgpOworICAgaGxlbiA9IHBuZ19zdHJsZW4oaGVpZ2h0KTsKKyAgIHRvdGFsX2xlbiA9IHdsZW4gKyBobGVuICsgMjsKKyAgIGlmICh0b3RhbF9sZW4gPiA2NCkKKyAgIHsKKyAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDYW4ndCB3cml0ZSBzQ0FMIChidWZmZXIgdG9vIHNtYWxsKSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBidWZbMF0gPSAocG5nX2J5dGUpdW5pdDsKKyAgIHBuZ19tZW1jcHkoYnVmICsgMSwgd2lkdGgsIHdsZW4gKyAxKTsgICAgICAvKiBBcHBlbmQgdGhlICdcMCcgaGVyZSAqLworICAgcG5nX21lbWNweShidWYgKyB3bGVuICsgMiwgaGVpZ2h0LCBobGVuKTsgIC8qIERvIE5PVCBhcHBlbmQgdGhlICdcMCcgaGVyZSAqLworCisgICBwbmdfZGVidWcxKDMsICJzQ0FMIHRvdGFsIGxlbmd0aCA9ICV1IiwgKHVuc2lnbmVkIGludCl0b3RhbF9sZW4pOworICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3NDQUwsIGJ1ZiwgdG90YWxfbGVuKTsKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIHBIWXMgY2h1bmsgKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX3BIWXMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgeF9waXhlbHNfcGVyX3VuaXQsCisgICBwbmdfdWludF8zMiB5X3BpeGVsc19wZXJfdW5pdCwKKyAgIGludCB1bml0X3R5cGUpCit7CisjaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKKyAgIFBOR19wSFlzOworI2VuZGlmCisgICBwbmdfYnl0ZSBidWZbOV07CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3BIWXMiKTsKKworICAgaWYgKHVuaXRfdHlwZSA+PSBQTkdfUkVTT0xVVElPTl9MQVNUKQorICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCB1bml0IHR5cGUgZm9yIHBIWXMgY2h1bmsiKTsKKworICAgcG5nX3NhdmVfdWludF8zMihidWYsIHhfcGl4ZWxzX3Blcl91bml0KTsKKyAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgNCwgeV9waXhlbHNfcGVyX3VuaXQpOworICAgYnVmWzhdID0gKHBuZ19ieXRlKXVuaXRfdHlwZTsKKworICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3BIWXMsIGJ1ZiwgKHBuZ19zaXplX3QpOSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBOR19XUklURV90SU1FX1NVUFBPUlRFRAorLyogV3JpdGUgdGhlIHRJTUUgY2h1bmsuICBVc2UgZWl0aGVyIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkKKyAqIG9yIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCksIG9yIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSB5b3Vyc2VsZi4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfdElNRShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdGltZXAgbW9kX3RpbWUpCit7CisjaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKKyAgIFBOR190SU1FOworI2VuZGlmCisgICBwbmdfYnl0ZSBidWZbN107CisKKyAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3RJTUUiKTsKKworICAgaWYgKG1vZF90aW1lLT5tb250aCAgPiAxMiB8fCBtb2RfdGltZS0+bW9udGggIDwgMSB8fAorICAgICAgIG1vZF90aW1lLT5kYXkgICAgPiAzMSB8fCBtb2RfdGltZS0+ZGF5ICAgIDwgMSB8fAorICAgICAgIG1vZF90aW1lLT5ob3VyICAgPiAyMyB8fCBtb2RfdGltZS0+c2Vjb25kID4gNjApCisgICB7CisgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCB0aW1lIHNwZWNpZmllZCBmb3IgdElNRSBjaHVuayIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgbW9kX3RpbWUtPnllYXIpOworICAgYnVmWzJdID0gbW9kX3RpbWUtPm1vbnRoOworICAgYnVmWzNdID0gbW9kX3RpbWUtPmRheTsKKyAgIGJ1Zls0XSA9IG1vZF90aW1lLT5ob3VyOworICAgYnVmWzVdID0gbW9kX3RpbWUtPm1pbnV0ZTsKKyAgIGJ1Zls2XSA9IG1vZF90aW1lLT5zZWNvbmQ7CisKKyAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ190SU1FLCBidWYsIChwbmdfc2l6ZV90KTcpOworfQorI2VuZGlmCisKKy8qIEluaXRpYWxpemVzIHRoZSByb3cgd3JpdGluZyBjYXBhYmlsaXR5IG9mIGxpYnBuZyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfc3RhcnRfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCit7CisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovCisgICBpbnQgcG5nX3Bhc3Nfc3RhcnRbN10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07CisKKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLworICAgaW50IHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgaW50IHBuZ19wYXNzX3lzdGFydFs3XSA9IHswLCAwLCA0LCAwLCAyLCAwLCAxfTsKKworICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLworICAgaW50IHBuZ19wYXNzX3lpbmNbN10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07CisjZW5kaWYKKworICAgcG5nX3NpemVfdCBidWZfc2l6ZTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfc3RhcnRfcm93Iik7CisKKyAgIGJ1Zl9zaXplID0gKHBuZ19zaXplX3QpKFBOR19ST1dCWVRFUygKKyAgICAgIHBuZ19wdHItPnVzcl9jaGFubmVscypwbmdfcHRyLT51c3JfYml0X2RlcHRoLCBwbmdfcHRyLT53aWR0aCkgKyAxKTsKKworICAgLyogU2V0IHVwIHJvdyBidWZmZXIgKi8KKyAgIHBuZ19wdHItPnJvd19idWYgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgKHBuZ191aW50XzMyKWJ1Zl9zaXplKTsKKyAgIHBuZ19wdHItPnJvd19idWZbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX05PTkU7CisKKyNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAorICAgLyogU2V0IHVwIGZpbHRlcmluZyBidWZmZXIsIGlmIHVzaW5nIHRoaXMgZmlsdGVyICovCisgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9TVUIpCisgICB7CisgICAgICBwbmdfcHRyLT5zdWJfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAocG5nX3VpbnRfMzIpKHBuZ19wdHItPnJvd2J5dGVzICsgMSkpOworICAgICAgcG5nX3B0ci0+c3ViX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfU1VCOworICAgfQorCisgICAvKiBXZSBvbmx5IG5lZWQgdG8ga2VlcCB0aGUgcHJldmlvdXMgcm93IGlmIHdlIGFyZSB1c2luZyBvbmUgb2YgdGhlc2UuICovCisgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgKFBOR19GSUxURVJfQVZHIHwgUE5HX0ZJTFRFUl9VUCB8IFBOR19GSUxURVJfUEFFVEgpKQorICAgeworICAgICAgLyogU2V0IHVwIHByZXZpb3VzIHJvdyBidWZmZXIgKi8KKyAgICAgIHBuZ19wdHItPnByZXZfcm93ID0gKHBuZ19ieXRlcClwbmdfY2FsbG9jKHBuZ19wdHIsCisgICAgICAgICAocG5nX3VpbnRfMzIpYnVmX3NpemUpOworCisgICAgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9VUCkKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPnVwX3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAorICAgICAgICAgICAgKHBuZ191aW50XzMyKShwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKKyAgICAgICAgIHBuZ19wdHItPnVwX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfVVA7CisgICAgICB9CisKKyAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX0FWRykKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPmF2Z19yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKKyAgICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7CisgICAgICAgICBwbmdfcHRyLT5hdmdfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9BVkc7CisgICAgICB9CisKKyAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1BBRVRIKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+cGFldGhfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCisgICAgICAgICAgICAocG5nX3VpbnRfMzIpKHBuZ19wdHItPnJvd2J5dGVzICsgMSkpOworICAgICAgICAgcG5nX3B0ci0+cGFldGhfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSDsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZiAvKiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRCAqLworCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAorICAgLyogSWYgaW50ZXJsYWNlZCwgd2UgbmVlZCB0byBzZXQgdXAgd2lkdGggYW5kIGhlaWdodCBvZiBwYXNzICovCisgICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCkKKyAgIHsKKyAgICAgIGlmICghKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSAocG5nX3B0ci0+aGVpZ2h0ICsgcG5nX3Bhc3NfeWluY1swXSAtIDEgLQorICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0WzBdKSAvIHBuZ19wYXNzX3lpbmNbMF07CisgICAgICAgICBwbmdfcHRyLT51c3Jfd2lkdGggPSAocG5nX3B0ci0+d2lkdGggKyBwbmdfcGFzc19pbmNbMF0gLSAxIC0KKyAgICAgICAgICAgIHBuZ19wYXNzX3N0YXJ0WzBdKSAvIHBuZ19wYXNzX2luY1swXTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gcG5nX3B0ci0+aGVpZ2h0OworICAgICAgICAgcG5nX3B0ci0+dXNyX3dpZHRoID0gcG5nX3B0ci0+d2lkdGg7CisgICAgICB9CisgICB9CisgICBlbHNlCisjZW5kaWYKKyAgIHsKKyAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gcG5nX3B0ci0+aGVpZ2h0OworICAgICAgcG5nX3B0ci0+dXNyX3dpZHRoID0gcG5nX3B0ci0+d2lkdGg7CisgICB9CisgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKKyAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOworfQorCisvKiBJbnRlcm5hbCB1c2Ugb25seS4gIENhbGxlZCB3aGVuIGZpbmlzaGVkIHByb2Nlc3NpbmcgYSByb3cgb2YgZGF0YS4gKi8KK3ZvaWQgLyogUFJJVkFURSAqLworcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3N0cnVjdHAgcG5nX3B0cikKK3sKKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisgICAvKiBBcnJheXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nIC0gdXNlIHBhc3MgKDAgLSA2KSBhcyBpbmRleCAqLworCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgKi8KKyAgIGludCBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsKKworICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovCisgICBpbnQgcG5nX3Bhc3NfaW5jWzddID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OworCisgICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCisgICBpbnQgcG5nX3Bhc3NfeXN0YXJ0WzddID0gezAsIDAsIDQsIDAsIDIsIDAsIDF9OworCisgICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCisgICBpbnQgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsKKyNlbmRpZgorCisgICBpbnQgcmV0OworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9maW5pc2hfcm93Iik7CisKKyAgIC8qIE5leHQgcm93ICovCisgICBwbmdfcHRyLT5yb3dfbnVtYmVyKys7CisKKyAgIC8qIFNlZSBpZiB3ZSBhcmUgZG9uZSAqLworICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPCBwbmdfcHRyLT5udW1fcm93cykKKyAgICAgIHJldHVybjsKKworI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKKyAgIC8qIElmIGludGVybGFjZWQsIGdvIHRvIG5leHQgcGFzcyAqLworICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpCisgICB7CisgICAgICBwbmdfcHRyLT5yb3dfbnVtYmVyID0gMDsKKyAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKQorICAgICAgeworICAgICAgICAgcG5nX3B0ci0+cGFzcysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogTG9vcCB1bnRpbCB3ZSBmaW5kIGEgbm9uLXplcm8gd2lkdGggb3IgaGVpZ2h0IHBhc3MgKi8KKyAgICAgICAgIGRvCisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfcHRyLT5wYXNzKys7CisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA+PSA3KQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwbmdfcHRyLT51c3Jfd2lkdGggPSAocG5nX3B0ci0+d2lkdGggKworICAgICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtCisgICAgICAgICAgICAgICBwbmdfcGFzc19zdGFydFtwbmdfcHRyLT5wYXNzXSkgLworICAgICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdOworICAgICAgICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSAocG5nX3B0ci0+aGVpZ2h0ICsKKyAgICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0KKyAgICAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFtwbmdfcHRyLT5wYXNzXSkgLworICAgICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXTsKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9IHdoaWxlIChwbmdfcHRyLT51c3Jfd2lkdGggPT0gMCB8fCBwbmdfcHRyLT5udW1fcm93cyA9PSAwKTsKKworICAgICAgfQorCisgICAgICAvKiBSZXNldCB0aGUgcm93IGFib3ZlIHRoZSBpbWFnZSBmb3IgdGhlIG5leHQgcGFzcyAqLworICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA3KQorICAgICAgeworICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfcm93ICE9IE5VTEwpCisgICAgICAgICAgICBwbmdfbWVtc2V0KHBuZ19wdHItPnByZXZfcm93LCAwLAorICAgICAgICAgICAgICAgKHBuZ19zaXplX3QpKFBOR19ST1dCWVRFUyhwbmdfcHRyLT51c3JfY2hhbm5lbHMqCisgICAgICAgICAgICAgICBwbmdfcHRyLT51c3JfYml0X2RlcHRoLCBwbmdfcHRyLT53aWR0aCkpICsgMSk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlJ3ZlIGp1c3Qgd3JpdHRlbiB0aGUgbGFzdCByb3csIHNvIHdlIG5lZWQKKyAgICAgIHRvIGZsdXNoIHRoZSBjb21wcmVzc29yICovCisgICBkbworICAgeworICAgICAgLyogVGVsbCB0aGUgY29tcHJlc3NvciB3ZSBhcmUgZG9uZSAqLworICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9GSU5JU0gpOworICAgICAgLyogQ2hlY2sgZm9yIGFuIGVycm9yICovCisgICAgICBpZiAocmV0ID09IFpfT0spCisgICAgICB7CisgICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCBtb3JlIHJvb20gKi8KKyAgICAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBuZ193cml0ZV9JREFUKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsIHBuZ19wdHItPnpidWZfc2l6ZSk7CisgICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKKyAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLm1zZyAhPSBOVUxMKQorICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiBlcnJvciIpOworICAgICAgfQorICAgfSB3aGlsZSAocmV0ICE9IFpfU1RSRUFNX0VORCk7CisKKyAgIC8qIFdyaXRlIGFueSBleHRyYSBzcGFjZSAqLworICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0IDwgcG5nX3B0ci0+emJ1Zl9zaXplKQorICAgeworICAgICAgcG5nX3dyaXRlX0lEQVQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwgcG5nX3B0ci0+emJ1Zl9zaXplIC0KKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KTsKKyAgIH0KKworICAgZGVmbGF0ZVJlc2V0KCZwbmdfcHRyLT56c3RyZWFtKTsKKyAgIHBuZ19wdHItPnpzdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7Cit9CisKKyNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECisvKiBQaWNrIG91dCB0aGUgY29ycmVjdCBwaXhlbHMgZm9yIHRoZSBpbnRlcmxhY2UgcGFzcy4KKyAqIFRoZSBiYXNpYyBpZGVhIGhlcmUgaXMgdG8gZ28gdGhyb3VnaCB0aGUgcm93IHdpdGggYSBzb3VyY2UKKyAqIHBvaW50ZXIgYW5kIGEgZGVzdGluYXRpb24gcG9pbnRlciAoc3AgYW5kIGRwKSwgYW5kIGNvcHkgdGhlCisgKiBjb3JyZWN0IHBpeGVscyBmb3IgdGhlIHBhc3MuICBBcyB0aGUgcm93IGdldHMgY29tcGFjdGVkLAorICogc3Agd2lsbCBhbHdheXMgYmUgPj0gZHAsIHNvIHdlIHNob3VsZCBuZXZlciBvdmVyd3JpdGUgYW55dGhpbmcuCisgKiBTZWUgdGhlIGRlZmF1bHQ6IGNhc2UgZm9yIHRoZSBlYXNpZXN0IGNvZGUgdG8gdW5kZXJzdGFuZC4KKyAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfZG9fd3JpdGVfaW50ZXJsYWNlKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csIGludCBwYXNzKQoreworICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KKworICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovCisgICBpbnQgcG5nX3Bhc3Nfc3RhcnRbN10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07CisKKyAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLworICAgaW50IHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKKworICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fd3JpdGVfaW50ZXJsYWNlIik7CisKKyAgIC8qIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgb24gdGhlIGxhc3QgcGFzcyAoNikgKi8KKyNpZmRlZiBQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQKKyAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMICYmIHBhc3MgPCA2KQorI2Vsc2UKKyAgIGlmIChwYXNzIDwgNikKKyNlbmRpZgorICAgeworICAgICAgLyogRWFjaCBwaXhlbCBkZXB0aCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgKi8KKyAgICAgIHN3aXRjaCAocm93X2luZm8tPnBpeGVsX2RlcHRoKQorICAgICAgeworICAgICAgICAgY2FzZSAxOgorICAgICAgICAgeworICAgICAgICAgICAgcG5nX2J5dGVwIHNwOworICAgICAgICAgICAgcG5nX2J5dGVwIGRwOworICAgICAgICAgICAgaW50IHNoaWZ0OworICAgICAgICAgICAgaW50IGQ7CisgICAgICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworCisgICAgICAgICAgICBkcCA9IHJvdzsKKyAgICAgICAgICAgIGQgPSAwOworICAgICAgICAgICAgc2hpZnQgPSA3OworICAgICAgICAgICAgZm9yIChpID0gcG5nX3Bhc3Nfc3RhcnRbcGFzc107IGkgPCByb3dfd2lkdGg7CisgICAgICAgICAgICAgICBpICs9IHBuZ19wYXNzX2luY1twYXNzXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKGkgPj4gMyk7CisgICAgICAgICAgICAgICB2YWx1ZSA9IChpbnQpKCpzcCA+PiAoNyAtIChpbnQpKGkgJiAweDA3KSkpICYgMHgwMTsKKyAgICAgICAgICAgICAgIGQgfD0gKHZhbHVlIDw8IHNoaWZ0KTsKKworICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzaGlmdCA9IDc7CisgICAgICAgICAgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSlkOworICAgICAgICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBzaGlmdC0tOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hpZnQgIT0gNykKKyAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBjYXNlIDI6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3A7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHA7CisgICAgICAgICAgICBpbnQgc2hpZnQ7CisgICAgICAgICAgICBpbnQgZDsKKyAgICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgc2hpZnQgPSA2OworICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSBwbmdfcGFzc19zdGFydFtwYXNzXTsgaSA8IHJvd193aWR0aDsKKyAgICAgICAgICAgICAgIGkgKz0gcG5nX3Bhc3NfaW5jW3Bhc3NdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoaSA+PiAyKTsKKyAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiAoKDMgLSAoaW50KShpICYgMHgwMykpIDw8IDEpKSAmIDB4MDM7CisgICAgICAgICAgICAgICBkIHw9ICh2YWx1ZSA8PCBzaGlmdCk7CisKKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2hpZnQgPSA2OworICAgICAgICAgICAgICAgICAgKmRwKysgPSAocG5nX2J5dGUpZDsKKyAgICAgICAgICAgICAgICAgIGQgPSAwOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc2hpZnQgLT0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA2KQorICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3A7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHA7CisgICAgICAgICAgICBpbnQgc2hpZnQ7CisgICAgICAgICAgICBpbnQgZDsKKyAgICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7CisKKyAgICAgICAgICAgIGRwID0gcm93OworICAgICAgICAgICAgc2hpZnQgPSA0OworICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSBwbmdfcGFzc19zdGFydFtwYXNzXTsgaSA8IHJvd193aWR0aDsKKyAgICAgICAgICAgICAgIGkgKz0gcG5nX3Bhc3NfaW5jW3Bhc3NdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoaSA+PiAxKTsKKyAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiAoKDEgLSAoaW50KShpICYgMHgwMSkpIDw8IDIpKSAmIDB4MGY7CisgICAgICAgICAgICAgICBkIHw9ICh2YWx1ZSA8PCBzaGlmdCk7CisKKyAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OworICAgICAgICAgICAgICAgICAgKmRwKysgPSAocG5nX2J5dGUpZDsKKyAgICAgICAgICAgICAgICAgIGQgPSAwOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc2hpZnQgLT0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSA0KQorICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICB7CisgICAgICAgICAgICBwbmdfYnl0ZXAgc3A7CisgICAgICAgICAgICBwbmdfYnl0ZXAgZHA7CisgICAgICAgICAgICBwbmdfdWludF8zMiBpOworICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOworICAgICAgICAgICAgcG5nX3NpemVfdCBwaXhlbF9ieXRlczsKKworICAgICAgICAgICAgLyogU3RhcnQgYXQgdGhlIGJlZ2lubmluZyAqLworICAgICAgICAgICAgZHAgPSByb3c7CisgICAgICAgICAgICAvKiBGaW5kIG91dCBob3cgbWFueSBieXRlcyBlYWNoIHBpeGVsIHRha2VzIHVwICovCisgICAgICAgICAgICBwaXhlbF9ieXRlcyA9IChyb3dfaW5mby0+cGl4ZWxfZGVwdGggPj4gMyk7CisgICAgICAgICAgICAvKiBMb29wIHRocm91Z2ggdGhlIHJvdywgb25seSBsb29raW5nIGF0IHRoZSBwaXhlbHMgdGhhdAorICAgICAgICAgICAgICAgbWF0dGVyICovCisgICAgICAgICAgICBmb3IgKGkgPSBwbmdfcGFzc19zdGFydFtwYXNzXTsgaSA8IHJvd193aWR0aDsKKyAgICAgICAgICAgICAgIGkgKz0gcG5nX3Bhc3NfaW5jW3Bhc3NdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogRmluZCBvdXQgd2hlcmUgdGhlIG9yaWdpbmFsIHBpeGVsIGlzICovCisgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KWkgKiBwaXhlbF9ieXRlczsKKyAgICAgICAgICAgICAgIC8qIE1vdmUgdGhlIHBpeGVsICovCisgICAgICAgICAgICAgICBpZiAoZHAgIT0gc3ApCisgICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCBzcCwgcGl4ZWxfYnl0ZXMpOworICAgICAgICAgICAgICAgLyogTmV4dCBwaXhlbCAqLworICAgICAgICAgICAgICAgZHAgKz0gcGl4ZWxfYnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIFNldCBuZXcgcm93IHdpZHRoICovCisgICAgICByb3dfaW5mby0+d2lkdGggPSAocm93X2luZm8tPndpZHRoICsKKyAgICAgICAgIHBuZ19wYXNzX2luY1twYXNzXSAtIDEgLQorICAgICAgICAgcG5nX3Bhc3Nfc3RhcnRbcGFzc10pIC8KKyAgICAgICAgIHBuZ19wYXNzX2luY1twYXNzXTsKKyAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsCisgICAgICAgICAgICByb3dfaW5mby0+d2lkdGgpOworICAgfQorfQorI2VuZGlmCisKKy8qIFRoaXMgZmlsdGVycyB0aGUgcm93LCBjaG9vc2VzIHdoaWNoIGZpbHRlciB0byB1c2UsIGlmIGl0IGhhcyBub3QgYWxyZWFkeQorICogYmVlbiBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBhbmQgdGhlbiB3cml0ZXMgdGhlIHJvdyBvdXQgd2l0aCB0aGUKKyAqIGNob3NlbiBmaWx0ZXIuCisgKi8KKyNkZWZpbmUgUE5HX01BWFNVTSAoKChwbmdfdWludF8zMikoLTEpKSA+PiAxKQorI2RlZmluZSBQTkdfSElTSElGVCAxMAorI2RlZmluZSBQTkdfTE9NQVNLICgocG5nX3VpbnRfMzIpMHhmZmZmTCkKKyNkZWZpbmUgUE5HX0hJTUFTSyAoKHBuZ191aW50XzMyKSh+UE5HX0xPTUFTSyA+PiBQTkdfSElTSElGVCkpCit2b2lkIC8qIFBSSVZBVEUgKi8KK3BuZ193cml0ZV9maW5kX2ZpbHRlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvKQoreworICAgcG5nX2J5dGVwIGJlc3Rfcm93OworI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECisgICBwbmdfYnl0ZXAgcHJldl9yb3csIHJvd19idWY7CisgICBwbmdfdWludF8zMiBtaW5zLCBicHA7CisgICBwbmdfYnl0ZSBmaWx0ZXJfdG9fZG8gPSBwbmdfcHRyLT5kb19maWx0ZXI7CisgICBwbmdfdWludF8zMiByb3dfYnl0ZXMgPSByb3dfaW5mby0+cm93Ynl0ZXM7CisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQKKyAgIGludCBudW1fcF9maWx0ZXJzID0gKGludClwbmdfcHRyLT5udW1fcHJldl9maWx0ZXJzOworI2VuZGlmIAorCisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9maW5kX2ZpbHRlciIpOworCisjaWZuZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECisgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyID09IDAgJiYgZmlsdGVyX3RvX2RvID09IFBOR19BTExfRklMVEVSUykKKyAgeworICAgICAgLyogVGhlc2Ugd2lsbCBuZXZlciBiZSBzZWxlY3RlZCBzbyB3ZSBuZWVkIG5vdCB0ZXN0IHRoZW0uICovCisgICAgICBmaWx0ZXJfdG9fZG8gJj0gfihQTkdfRklMVEVSX1VQIHwgUE5HX0ZJTFRFUl9QQUVUSCk7CisgIH0KKyNlbmRpZiAKKworICAgLyogRmluZCBvdXQgaG93IG1hbnkgYnl0ZXMgb2Zmc2V0IGVhY2ggcGl4ZWwgaXMgKi8KKyAgIGJwcCA9IChyb3dfaW5mby0+cGl4ZWxfZGVwdGggKyA3KSA+PiAzOworCisgICBwcmV2X3JvdyA9IHBuZ19wdHItPnByZXZfcm93OworI2VuZGlmCisgICBiZXN0X3JvdyA9IHBuZ19wdHItPnJvd19idWY7CisjaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKKyAgIHJvd19idWYgPSBiZXN0X3JvdzsKKyAgIG1pbnMgPSBQTkdfTUFYU1VNOworCisgICAvKiBUaGUgcHJlZGljdGlvbiBtZXRob2Qgd2UgdXNlIGlzIHRvIGZpbmQgd2hpY2ggbWV0aG9kIHByb3ZpZGVzIHRoZQorICAgICogc21hbGxlc3QgdmFsdWUgd2hlbiBzdW1taW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGRpc3RhbmNlcworICAgICogZnJvbSB6ZXJvLCB1c2luZyBhbnl0aGluZyA+PSAxMjggYXMgbmVnYXRpdmUgbnVtYmVycy4gIFRoaXMgaXMga25vd24KKyAgICAqIGFzIHRoZSAibWluaW11bSBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMiIGhldXJpc3RpYy4gIE90aGVyCisgICAgKiBoZXVyaXN0aWNzIGFyZSB0aGUgIndlaWdodGVkIG1pbmltdW0gc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIgorICAgICogKGV4cGVyaW1lbnRhbCBhbmQgY2FuIGluIHRoZW9yeSBpbXByb3ZlIGNvbXByZXNzaW9uKSwgYW5kIHRoZSAiemxpYgorICAgICogcHJlZGljdGl2ZSIgbWV0aG9kIChub3QgaW1wbGVtZW50ZWQgeWV0KSwgd2hpY2ggZG9lcyB0ZXN0IGNvbXByZXNzaW9ucworICAgICogb2YgbGluZXMgdXNpbmcgZGlmZmVyZW50IGZpbHRlciBtZXRob2RzLCBhbmQgdGhlbiBjaG9vc2VzIHRoZQorICAgICogKHNlcmllcyBvZikgZmlsdGVyKHMpIHRoYXQgZ2l2ZSBtaW5pbXVtIGNvbXByZXNzZWQgZGF0YSBzaXplIChWRVJZCisgICAgKiBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlKS4KKyAgICAqCisgICAgKiBHUlIgOTgwNTI1OiAgY29uc2lkZXIgYWxzbworICAgICogICAoMSkgbWluaW11bSBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMgZnJvbSBydW5uaW5nIGF2ZXJhZ2UgKGkuZS4sCisgICAgKiAgICAgICBrZWVwIHJ1bm5pbmcgc3VtIG9mIG5vbi1hYnNvbHV0ZSBkaWZmZXJlbmNlcyAmIGNvdW50IG9mIGJ5dGVzKQorICAgICogICAgICAgW3RyYWNrIGRpc3BlcnNpb24sIHRvbz8gIHJlc3RhcnQgYXZlcmFnZSBpZiBkaXNwZXJzaW9uIHRvbyBsYXJnZT9dCisgICAgKiAgKDFiKSBtaW5pbXVtIHN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBmcm9tIHNsaWRpbmcgYXZlcmFnZSwgcHJvYmFibHkKKyAgICAqICAgICAgIHdpdGggd2luZG93IHNpemUgPD0gZGVmbGF0ZSB3aW5kb3cgKHVzdWFsbHkgMzJLKQorICAgICogICAoMikgbWluaW11bSBzdW0gb2Ygc3F1YXJlZCBkaWZmZXJlbmNlcyBmcm9tIHplcm8gb3IgcnVubmluZyBhdmVyYWdlCisgICAgKiAgICAgICAoaS5lLiwgfiByb290LW1lYW4tc3F1YXJlIGFwcHJvYWNoKQorICAgICovCisKKworICAgLyogV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHRoZSAnbm8gZmlsdGVyJyBjYXNlIGlmIHRoaXMgaXMgdGhlIG9ubHkgZmlsdGVyCisgICAgKiB0aGF0IGhhcyBiZWVuIGNob3NlbiwgYXMgaXQgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB0byB0aGUgZGF0YS4KKyAgICAqLworICAgaWYgKChmaWx0ZXJfdG9fZG8gJiBQTkdfRklMVEVSX05PTkUpICYmCisgICAgICAgZmlsdGVyX3RvX2RvICE9IFBOR19GSUxURVJfTk9ORSkKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBycDsKKyAgICAgIHBuZ191aW50XzMyIHN1bSA9IDA7CisgICAgICBwbmdfdWludF8zMiBpOworICAgICAgaW50IHY7CisKKyAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKywgcnArKykKKyAgICAgIHsKKyAgICAgICAgIHYgPSAqcnA7CisgICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7CisgICAgICB9CisKKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAorICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCisgICAgICB7CisgICAgICAgICBwbmdfdWludF8zMiBzdW1oaSwgc3VtbG87CisgICAgICAgICBpbnQgajsKKyAgICAgICAgIHN1bWxvID0gc3VtICYgUE5HX0xPTUFTSzsKKyAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOyAvKiBHaXZlcyB1cyBzb21lIGZvb3Ryb29tICovCisKKyAgICAgICAgIC8qIFJlZHVjZSB0aGUgc3VtIGlmIHdlIG1hdGNoIGFueSBvZiB0aGUgcHJldmlvdXMgcm93cyAqLworICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KKyAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7CisgICAgICAgICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2pdKSA+PgorICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgLyogRmFjdG9yIGluIHRoZSBjb3N0IG9mIHRoaXMgZmlsdGVyICh0aGlzIGlzIGhlcmUgZm9yIGNvbXBsZXRlbmVzcywKKyAgICAgICAgICAqIGJ1dCBpdCBtYWtlcyBubyBzZW5zZSB0byBoYXZlIGEgImNvc3QiIGZvciB0aGUgTk9ORSBmaWx0ZXIsIGFzCisgICAgICAgICAgKiBpdCBoYXMgdGhlIG1pbmltdW0gcG9zc2libGUgY29tcHV0YXRpb25hbCBjb3N0IC0gbm9uZSkuCisgICAgICAgICAgKi8KKyAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfTk9ORV0pID4+CisgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKKyAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfTk9ORV0pID4+CisgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKKworICAgICAgICAgaWYgKHN1bWhpID4gUE5HX0hJTUFTSykKKyAgICAgICAgICAgIHN1bSA9IFBOR19NQVhTVU07CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBzdW0gPSAoc3VtaGkgPDwgUE5HX0hJU0hJRlQpICsgc3VtbG87CisgICAgICB9CisjZW5kaWYKKyAgICAgIG1pbnMgPSBzdW07CisgICB9CisKKyAgIC8qIFN1YiBmaWx0ZXIgKi8KKyAgIGlmIChmaWx0ZXJfdG9fZG8gPT0gUE5HX0ZJTFRFUl9TVUIpCisgICAvKiBJdCdzIHRoZSBvbmx5IGZpbHRlciBzbyBubyB0ZXN0aW5nIGlzIG5lZWRlZCAqLworICAgeworICAgICAgcG5nX2J5dGVwIHJwLCBscCwgZHA7CisgICAgICBwbmdfdWludF8zMiBpOworICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT5zdWJfcm93ICsgMTsgaSA8IGJwcDsKKyAgICAgICAgICAgaSsrLCBycCsrLCBkcCsrKQorICAgICAgeworICAgICAgICAgKmRwID0gKnJwOworICAgICAgfQorICAgICAgZm9yIChscCA9IHJvd19idWYgKyAxOyBpIDwgcm93X2J5dGVzOworICAgICAgICAgaSsrLCBycCsrLCBscCsrLCBkcCsrKQorICAgICAgeworICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKGludCkqcnAgLSAoaW50KSpscCkgJiAweGZmKTsKKyAgICAgIH0KKyAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+c3ViX3JvdzsKKyAgIH0KKworICAgZWxzZSBpZiAoZmlsdGVyX3RvX2RvICYgUE5HX0ZJTFRFUl9TVUIpCisgICB7CisgICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBscDsKKyAgICAgIHBuZ191aW50XzMyIHN1bSA9IDAsIGxtaW5zID0gbWluczsKKyAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICBpbnQgdjsKKworI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECisgICAgICAvKiBXZSB0ZW1wb3JhcmlseSBpbmNyZWFzZSB0aGUgIm1pbmltdW0gc3VtIiBieSB0aGUgZmFjdG9yIHdlCisgICAgICAgKiB3b3VsZCByZWR1Y2UgdGhlIHN1bSBvZiB0aGlzIGZpbHRlciwgc28gdGhhdCB3ZSBjYW4gZG8gdGhlCisgICAgICAgKiBlYXJseSBleGl0IGNvbXBhcmlzb24gd2l0aG91dCBzY2FsaW5nIHRoZSBzdW0gZWFjaCB0aW1lLgorICAgICAgICovCisgICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkKKyAgICAgIHsKKyAgICAgICAgIGludCBqOworICAgICAgICAgcG5nX3VpbnRfMzIgbG1oaSwgbG1sbzsKKyAgICAgICAgIGxtbG8gPSBsbWlucyAmIFBOR19MT01BU0s7CisgICAgICAgICBsbWhpID0gKGxtaW5zID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7CisKKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfU1VCKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgorICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKKyAgICAgICAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KKyAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9TVUJdKSA+PgorICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7CisgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4KKyAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOworCisgICAgICAgICBpZiAobG1oaSA+IFBOR19ISU1BU0spCisgICAgICAgICAgICBsbWlucyA9IFBOR19NQVhTVU07CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBsbWlucyA9IChsbWhpIDw8IFBOR19ISVNISUZUKSArIGxtbG87CisgICAgICB9CisjZW5kaWYKKworICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT5zdWJfcm93ICsgMTsgaSA8IGJwcDsKKyAgICAgICAgICAgaSsrLCBycCsrLCBkcCsrKQorICAgICAgeworICAgICAgICAgdiA9ICpkcCA9ICpycDsKKworICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OworICAgICAgfQorICAgICAgZm9yIChscCA9IHJvd19idWYgKyAxOyBpIDwgcm93X2J5dGVzOworICAgICAgICAgaSsrLCBycCsrLCBscCsrLCBkcCsrKQorICAgICAgeworICAgICAgICAgdiA9ICpkcCA9IChwbmdfYnl0ZSkoKChpbnQpKnJwIC0gKGludCkqbHApICYgMHhmZik7CisKKyAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKKworICAgICAgICAgaWYgKHN1bSA+IGxtaW5zKSAgLyogV2UgYXJlIGFscmVhZHkgd29yc2UsIGRvbid0IGNvbnRpbnVlLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAorICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCisgICAgICB7CisgICAgICAgICBpbnQgajsKKyAgICAgICAgIHBuZ191aW50XzMyIHN1bWhpLCBzdW1sbzsKKyAgICAgICAgIHN1bWxvID0gc3VtICYgUE5HX0xPTUFTSzsKKyAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOworCisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX1NVQikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgorICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKKyAgICAgICAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgorICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4KKyAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOworICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4KKyAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOworCisgICAgICAgICBpZiAoc3VtaGkgPiBQTkdfSElNQVNLKQorICAgICAgICAgICAgc3VtID0gUE5HX01BWFNVTTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1bSA9IChzdW1oaSA8PCBQTkdfSElTSElGVCkgKyBzdW1sbzsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBpZiAoc3VtIDwgbWlucykKKyAgICAgIHsKKyAgICAgICAgIG1pbnMgPSBzdW07CisgICAgICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPnN1Yl9yb3c7CisgICAgICB9CisgICB9CisKKyAgIC8qIFVwIGZpbHRlciAqLworICAgaWYgKGZpbHRlcl90b19kbyA9PSBQTkdfRklMVEVSX1VQKQorICAgeworICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHA7CisgICAgICBwbmdfdWludF8zMiBpOworCisgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPnVwX3JvdyArIDEsCisgICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgcm93X2J5dGVzOworICAgICAgICAgICBpKyssIHJwKyssIHBwKyssIGRwKyspCisgICAgICB7CisgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKCgoaW50KSpycCAtIChpbnQpKnBwKSAmIDB4ZmYpOworICAgICAgfQorICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT51cF9yb3c7CisgICB9CisKKyAgIGVsc2UgaWYgKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfVVApCisgICB7CisgICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcDsKKyAgICAgIHBuZ191aW50XzMyIHN1bSA9IDAsIGxtaW5zID0gbWluczsKKyAgICAgIHBuZ191aW50XzMyIGk7CisgICAgICBpbnQgdjsKKworCisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQKKyAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQorICAgICAgeworICAgICAgICAgaW50IGo7CisgICAgICAgICBwbmdfdWludF8zMiBsbWhpLCBsbWxvOworICAgICAgICAgbG1sbyA9IGxtaW5zICYgUE5HX0xPTUFTSzsKKyAgICAgICAgIGxtaGkgPSAobG1pbnMgPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsKKworICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9VUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KKyAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7CisgICAgICAgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+CisgICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfVVBdKSA+PgorICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7CisgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfVVBdKSA+PgorICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7CisKKyAgICAgICAgIGlmIChsbWhpID4gUE5HX0hJTUFTSykKKyAgICAgICAgICAgIGxtaW5zID0gUE5HX01BWFNVTTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxtaW5zID0gKGxtaGkgPDwgUE5HX0hJU0hJRlQpICsgbG1sbzsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPnVwX3JvdyArIDEsCisgICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgcm93X2J5dGVzOyBpKyspCisgICAgICB7CisgICAgICAgICB2ID0gKmRwKysgPSAocG5nX2J5dGUpKCgoaW50KSpycCsrIC0gKGludCkqcHArKykgJiAweGZmKTsKKworICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OworCisgICAgICAgICBpZiAoc3VtID4gbG1pbnMpICAvKiBXZSBhcmUgYWxyZWFkeSB3b3JzZSwgZG9uJ3QgY29udGludWUuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECisgICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkKKyAgICAgIHsKKyAgICAgICAgIGludCBqOworICAgICAgICAgcG5nX3VpbnRfMzIgc3VtaGksIHN1bWxvOworICAgICAgICAgc3VtbG8gPSBzdW0gJiBQTkdfTE9NQVNLOworICAgICAgICAgc3VtaGkgPSAoc3VtID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7CisKKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfVVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzdW1sbyA9IChzdW1sbyAqIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2pdKSA+PgorICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKKyAgICAgICAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+CisgICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBzdW1sbyA9IChzdW1sbyAqIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1VQXSkgPj4KKyAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOworICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9VUF0pID4+CisgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKKworICAgICAgICAgaWYgKHN1bWhpID4gUE5HX0hJTUFTSykKKyAgICAgICAgICAgIHN1bSA9IFBOR19NQVhTVU07CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBzdW0gPSAoc3VtaGkgPDwgUE5HX0hJU0hJRlQpICsgc3VtbG87CisgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKHN1bSA8IG1pbnMpCisgICAgICB7CisgICAgICAgICBtaW5zID0gc3VtOworICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT51cF9yb3c7CisgICAgICB9CisgICB9CisKKyAgIC8qIEF2ZyBmaWx0ZXIgKi8KKyAgIGlmIChmaWx0ZXJfdG9fZG8gPT0gUE5HX0ZJTFRFUl9BVkcpCisgICB7CisgICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcCwgbHA7CisgICAgICBwbmdfdWludF8zMiBpOworICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT5hdmdfcm93ICsgMSwKKyAgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykKKyAgICAgIHsKKyAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoaW50KSpwcCsrIC8gMikpICYgMHhmZik7CisgICAgICB9CisgICAgICBmb3IgKGxwID0gcm93X2J1ZiArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKykKKyAgICAgIHsKKyAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoKGludCkqcHArKyArIChpbnQpKmxwKyspIC8gMikpCisgICAgICAgICAgICAgICAgICYgMHhmZik7CisgICAgICB9CisgICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPmF2Z19yb3c7CisgICB9CisKKyAgIGVsc2UgaWYgKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfQVZHKQorICAgeworICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHAsIGxwOworICAgICAgcG5nX3VpbnRfMzIgc3VtID0gMCwgbG1pbnMgPSBtaW5zOworICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgIGludCB2OworCisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQKKyAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQorICAgICAgeworICAgICAgICAgaW50IGo7CisgICAgICAgICBwbmdfdWludF8zMiBsbWhpLCBsbWxvOworICAgICAgICAgbG1sbyA9IGxtaW5zICYgUE5HX0xPTUFTSzsKKyAgICAgICAgIGxtaGkgPSAobG1pbnMgPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsKKworICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9BVkcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+CisgICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOworICAgICAgICAgICAgICAgbG1oaSA9IChsbWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgorICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX0FWR10pID4+CisgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKKyAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9BVkddKSA+PgorICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7CisKKyAgICAgICAgIGlmIChsbWhpID4gUE5HX0hJTUFTSykKKyAgICAgICAgICAgIGxtaW5zID0gUE5HX01BWFNVTTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxtaW5zID0gKGxtaGkgPDwgUE5HX0hJU0hJRlQpICsgbG1sbzsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPmF2Z19yb3cgKyAxLAorICAgICAgICAgICBwcCA9IHByZXZfcm93ICsgMTsgaSA8IGJwcDsgaSsrKQorICAgICAgeworICAgICAgICAgdiA9ICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoaW50KSpwcCsrIC8gMikpICYgMHhmZik7CisKKyAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKKyAgICAgIH0KKyAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsgaSsrKQorICAgICAgeworICAgICAgICAgdiA9ICpkcCsrID0KKyAgICAgICAgICAocG5nX2J5dGUpKCgoaW50KSpycCsrIC0gKCgoaW50KSpwcCsrICsgKGludCkqbHArKykgLyAyKSkgJiAweGZmKTsKKworICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OworCisgICAgICAgICBpZiAoc3VtID4gbG1pbnMpICAvKiBXZSBhcmUgYWxyZWFkeSB3b3JzZSwgZG9uJ3QgY29udGludWUuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECisgICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkKKyAgICAgIHsKKyAgICAgICAgIGludCBqOworICAgICAgICAgcG5nX3VpbnRfMzIgc3VtaGksIHN1bWxvOworICAgICAgICAgc3VtbG8gPSBzdW0gJiBQTkdfTE9NQVNLOworICAgICAgICAgc3VtaGkgPSAoc3VtID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7CisKKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+CisgICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOworICAgICAgICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KKyAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfQVZHXSkgPj4KKyAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOworICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9BVkddKSA+PgorICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7CisKKyAgICAgICAgIGlmIChzdW1oaSA+IFBOR19ISU1BU0spCisgICAgICAgICAgICBzdW0gPSBQTkdfTUFYU1VNOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgc3VtID0gKHN1bWhpIDw8IFBOR19ISVNISUZUKSArIHN1bWxvOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmIChzdW0gPCBtaW5zKQorICAgICAgeworICAgICAgICAgbWlucyA9IHN1bTsKKyAgICAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+YXZnX3JvdzsKKyAgICAgIH0KKyAgIH0KKworICAgLyogUGFldGggZmlsdGVyICovCisgICBpZiAoZmlsdGVyX3RvX2RvID09IFBOR19GSUxURVJfUEFFVEgpCisgICB7CisgICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcCwgY3AsIGxwOworICAgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+cGFldGhfcm93ICsgMSwKKyAgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykKKyAgICAgIHsKKyAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtIChpbnQpKnBwKyspICYgMHhmZik7CisgICAgICB9CisKKyAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMSwgY3AgPSBwcmV2X3JvdyArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKykKKyAgICAgIHsKKyAgICAgICAgIGludCBhLCBiLCBjLCBwYSwgcGIsIHBjLCBwOworCisgICAgICAgICBiID0gKnBwKys7CisgICAgICAgICBjID0gKmNwKys7CisgICAgICAgICBhID0gKmxwKys7CisKKyAgICAgICAgIHAgPSBiIC0gYzsKKyAgICAgICAgIHBjID0gYSAtIGM7CisKKyNpZmRlZiBQTkdfVVNFX0FCUworICAgICAgICAgcGEgPSBhYnMocCk7CisgICAgICAgICBwYiA9IGFicyhwYyk7CisgICAgICAgICBwYyA9IGFicyhwICsgcGMpOworI2Vsc2UKKyAgICAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7CisgICAgICAgICBwYiA9IHBjIDwgMCA/IC1wYyA6IHBjOworICAgICAgICAgcGMgPSAocCArIHBjKSA8IDAgPyAtKHAgKyBwYykgOiBwICsgcGM7CisjZW5kaWYKKworICAgICAgICAgcCA9IChwYSA8PSBwYiAmJiBwYSA8PXBjKSA/IGEgOiAocGIgPD0gcGMpID8gYiA6IGM7CisKKyAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtIHApICYgMHhmZik7CisgICAgICB9CisgICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPnBhZXRoX3JvdzsKKyAgIH0KKworICAgZWxzZSBpZiAoZmlsdGVyX3RvX2RvICYgUE5HX0ZJTFRFUl9QQUVUSCkKKyAgIHsKKyAgICAgIHBuZ19ieXRlcCBycCwgZHAsIHBwLCBjcCwgbHA7CisgICAgICBwbmdfdWludF8zMiBzdW0gPSAwLCBsbWlucyA9IG1pbnM7CisgICAgICBwbmdfdWludF8zMiBpOworICAgICAgaW50IHY7CisKKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAorICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCisgICAgICB7CisgICAgICAgICBpbnQgajsKKyAgICAgICAgIHBuZ191aW50XzMyIGxtaGksIGxtbG87CisgICAgICAgICBsbWxvID0gbG1pbnMgJiBQTkdfTE9NQVNLOworICAgICAgICAgbG1oaSA9IChsbWlucyA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOworCisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgorICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKKyAgICAgICAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KKyAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSF0pID4+CisgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKKyAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSF0pID4+CisgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKKworICAgICAgICAgaWYgKGxtaGkgPiBQTkdfSElNQVNLKQorICAgICAgICAgICAgbG1pbnMgPSBQTkdfTUFYU1VNOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgbG1pbnMgPSAobG1oaSA8PCBQTkdfSElTSElGVCkgKyBsbWxvOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+cGFldGhfcm93ICsgMSwKKyAgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykKKyAgICAgIHsKKyAgICAgICAgIHYgPSAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoaW50KSpwcCsrKSAmIDB4ZmYpOworCisgICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7CisgICAgICB9CisKKyAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMSwgY3AgPSBwcmV2X3JvdyArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKykKKyAgICAgIHsKKyAgICAgICAgIGludCBhLCBiLCBjLCBwYSwgcGIsIHBjLCBwOworCisgICAgICAgICBiID0gKnBwKys7CisgICAgICAgICBjID0gKmNwKys7CisgICAgICAgICBhID0gKmxwKys7CisKKyNpZm5kZWYgUE5HX1NMT1dfUEFFVEgKKyAgICAgICAgIHAgPSBiIC0gYzsKKyAgICAgICAgIHBjID0gYSAtIGM7CisjaWZkZWYgUE5HX1VTRV9BQlMKKyAgICAgICAgIHBhID0gYWJzKHApOworICAgICAgICAgcGIgPSBhYnMocGMpOworICAgICAgICAgcGMgPSBhYnMocCArIHBjKTsKKyNlbHNlCisgICAgICAgICBwYSA9IHAgPCAwID8gLXAgOiBwOworICAgICAgICAgcGIgPSBwYyA8IDAgPyAtcGMgOiBwYzsKKyAgICAgICAgIHBjID0gKHAgKyBwYykgPCAwID8gLShwICsgcGMpIDogcCArIHBjOworI2VuZGlmCisgICAgICAgICBwID0gKHBhIDw9IHBiICYmIHBhIDw9cGMpID8gYSA6IChwYiA8PSBwYykgPyBiIDogYzsKKyNlbHNlIC8qIFBOR19TTE9XX1BBRVRIICovCisgICAgICAgICBwID0gYSArIGIgLSBjOworICAgICAgICAgcGEgPSBhYnMocCAtIGEpOworICAgICAgICAgcGIgPSBhYnMocCAtIGIpOworICAgICAgICAgcGMgPSBhYnMocCAtIGMpOworICAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKQorICAgICAgICAgICAgcCA9IGE7CisgICAgICAgICBlbHNlIGlmIChwYiA8PSBwYykKKyAgICAgICAgICAgIHAgPSBiOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcCA9IGM7CisjZW5kaWYgLyogUE5HX1NMT1dfUEFFVEggKi8KKworICAgICAgICAgdiA9ICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtIHApICYgMHhmZik7CisKKyAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKKworICAgICAgICAgaWYgKHN1bSA+IGxtaW5zKSAgLyogV2UgYXJlIGFscmVhZHkgd29yc2UsIGRvbid0IGNvbnRpbnVlLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAorICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCisgICAgICB7CisgICAgICAgICBpbnQgajsKKyAgICAgICAgIHBuZ191aW50XzMyIHN1bWhpLCBzdW1sbzsKKyAgICAgICAgIHN1bWxvID0gc3VtICYgUE5HX0xPTUFTSzsKKyAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOworCisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KKyAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7CisgICAgICAgICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2pdKSA+PgorICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSF0pID4+CisgICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKKyAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfUEFFVEhdKSA+PgorICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7CisKKyAgICAgICAgIGlmIChzdW1oaSA+IFBOR19ISU1BU0spCisgICAgICAgICAgICBzdW0gPSBQTkdfTUFYU1VNOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgc3VtID0gKHN1bWhpIDw8IFBOR19ISVNISUZUKSArIHN1bWxvOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmIChzdW0gPCBtaW5zKQorICAgICAgeworICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5wYWV0aF9yb3c7CisgICAgICB9CisgICB9CisjZW5kaWYgLyogUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQgKi8KKyAgIC8qIERvIHRoZSBhY3R1YWwgd3JpdGluZyBvZiB0aGUgZmlsdGVyZWQgcm93IGRhdGEgZnJvbSB0aGUgY2hvc2VuIGZpbHRlci4gKi8KKworICAgcG5nX3dyaXRlX2ZpbHRlcmVkX3JvdyhwbmdfcHRyLCBiZXN0X3Jvdyk7CisKKyNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAorI2lmZGVmIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECisgICAvKiBTYXZlIHRoZSB0eXBlIG9mIGZpbHRlciB3ZSBwaWNrZWQgdGhpcyB0aW1lIGZvciBmdXR1cmUgY2FsY3VsYXRpb25zICovCisgICBpZiAocG5nX3B0ci0+bnVtX3ByZXZfZmlsdGVycyA+IDApCisgICB7CisgICAgICBpbnQgajsKKyAgICAgIGZvciAoaiA9IDE7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCisgICAgICB7CisgICAgICAgICBwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPSBwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbaiAtIDFdOworICAgICAgfQorICAgICAgcG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID0gYmVzdF9yb3dbMF07CisgICB9CisjZW5kaWYKKyNlbmRpZiAvKiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRCAqLworfQorCisKKy8qIERvIHRoZSBhY3R1YWwgd3JpdGluZyBvZiBhIHByZXZpb3VzbHkgZmlsdGVyZWQgcm93LiAqLwordm9pZCAvKiBQUklWQVRFICovCitwbmdfd3JpdGVfZmlsdGVyZWRfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBmaWx0ZXJlZF9yb3cpCit7CisgICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9maWx0ZXJlZF9yb3ciKTsKKworICAgcG5nX2RlYnVnMSgyLCAiZmlsdGVyID0gJWQiLCBmaWx0ZXJlZF9yb3dbMF0pOworICAgLyogU2V0IHVwIHRoZSB6bGliIGlucHV0IGJ1ZmZlciAqLworCisgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBmaWx0ZXJlZF9yb3c7CisgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpcG5nX3B0ci0+cm93X2luZm8ucm93Ynl0ZXMgKyAxOworICAgLyogUmVwZWF0IHVudGlsIHdlIGhhdmUgY29tcHJlc3NlZCBhbGwgdGhlIGRhdGEgKi8KKyAgIGRvCisgICB7CisgICAgICBpbnQgcmV0OyAvKiBSZXR1cm4gb2YgemxpYiAqLworCisgICAgICAvKiBDb21wcmVzcyB0aGUgZGF0YSAqLworICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICAvKiBDaGVjayBmb3IgY29tcHJlc3Npb24gZXJyb3JzICovCisgICAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICB7CisgICAgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5tc2cgIT0gTlVMTCkKKyAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInpsaWIgZXJyb3IiKTsKKyAgICAgIH0KKworICAgICAgLyogU2VlIGlmIGl0IGlzIHRpbWUgdG8gd3JpdGUgYW5vdGhlciBJREFUICovCisgICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpCisgICAgICB7CisgICAgICAgICAvKiBXcml0ZSB0aGUgSURBVCBhbmQgcmVzZXQgdGhlIHpsaWIgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgcG5nX3dyaXRlX0lEQVQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwgcG5nX3B0ci0+emJ1Zl9zaXplKTsKKyAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOworICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7CisgICAgICB9CisgICAvKiBSZXBlYXQgdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gY29tcHJlc3NlZCAqLworICAgfSB3aGlsZSAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbik7CisKKyAgIC8qIFN3YXAgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHJvd3MgKi8KKyAgIGlmIChwbmdfcHRyLT5wcmV2X3JvdyAhPSBOVUxMKQorICAgeworICAgICAgcG5nX2J5dGVwIHRwdHI7CisKKyAgICAgIHRwdHIgPSBwbmdfcHRyLT5wcmV2X3JvdzsKKyAgICAgIHBuZ19wdHItPnByZXZfcm93ID0gcG5nX3B0ci0+cm93X2J1ZjsKKyAgICAgIHBuZ19wdHItPnJvd19idWYgPSB0cHRyOworICAgfQorCisgICAvKiBGaW5pc2ggcm93IC0gdXBkYXRlcyBjb3VudGVycyBhbmQgZmx1c2hlcyB6bGliIGlmIGxhc3Qgcm93ICovCisgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKKworI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKKyAgIHBuZ19wdHItPmZsdXNoX3Jvd3MrKzsKKworICAgaWYgKHBuZ19wdHItPmZsdXNoX2Rpc3QgPiAwICYmCisgICAgICAgcG5nX3B0ci0+Zmx1c2hfcm93cyA+PSBwbmdfcHRyLT5mbHVzaF9kaXN0KQorICAgeworICAgICAgcG5nX3dyaXRlX2ZsdXNoKHBuZ19wdHIpOworICAgfQorI2VuZGlmCit9CisjZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xtYWxsb2MuYyBiL2NvbTMyL2xpYi9sbWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2OWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9sbWFsbG9jLmMKQEAgLTAsMCArMSw0OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9wbWFwaS5oPgorCit2b2lkICpsemFsbG9jKHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnA7CisgICAgcCA9IGxtYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFwKQorCWVycm5vID0gRU5PTUVNOworICAgIGVsc2UKKwltZW1zZXQocCwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgbGZyZWUodm9pZCAqcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9scmFuZDQ4LmMgYi9jb20zMi9saWIvbHJhbmQ0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDk2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbHJhbmQ0OC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBscmFuZDQ4LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3Vuc2lnbmVkIHNob3J0IF9fcmFuZDQ4X3NlZWRbM107CisKK2xvbmcganJhbmQ0OCh1bnNpZ25lZCBzaG9ydCB4c3ViaVszXSkKK3sKKyAgICB1aW50NjRfdCB4OworCisgICAgLyogVGhlIHhzdWJpW10gYXJyYXkgaXMgbGl0dGxlZW5kaWFuIGJ5IHNwZWMgKi8KKyAgICB4ID0gKHVpbnQ2NF90KSB4c3ViaVswXSArCisJKCh1aW50NjRfdCkgeHN1YmlbMV0gPDwgMTYpICsgKCh1aW50NjRfdCkgeHN1YmlbMl0gPDwgMzIpOworCisgICAgeCA9ICgweDVkZWVjZTY2ZFVMTCAqIHgpICsgMHhiOworCisgICAgeHN1YmlbMF0gPSAodW5zaWduZWQgc2hvcnQpeDsKKyAgICB4c3ViaVsxXSA9ICh1bnNpZ25lZCBzaG9ydCkoeCA+PiAxNik7CisgICAgeHN1YmlbMl0gPSAodW5zaWduZWQgc2hvcnQpKHggPj4gMzIpOworCisgICAgcmV0dXJuIChsb25nKShpbnQzMl90KSAoeCA+PiAxNik7Cit9CisKK2xvbmcgbXJhbmQ0OCh2b2lkKQoreworICAgIHJldHVybiBqcmFuZDQ4KF9fcmFuZDQ4X3NlZWQpOworfQorCitsb25nIG5yYW5kNDgodW5zaWduZWQgc2hvcnQgeHN1YmlbM10pCit7CisgICAgcmV0dXJuIChsb25nKSgodWludDMyX3QpIGpyYW5kNDgoeHN1YmkpID4+IDEpOworfQorCitsb25nIGxyYW5kNDgodm9pZCkKK3sKKyAgICByZXR1cm4gKGxvbmcpKCh1aW50MzJfdCkgbXJhbmQ0OCgpID4+IDEpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL2xzdHJkdXAuYyBiL2NvbTMyL2xpYi9sc3RyZHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExZWZlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9sc3RyZHVwLmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGxzdHJkdXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorCitjaGFyICpsc3RyZHVwKGNvbnN0IGNoYXIgKnMpCit7CisgICAgaW50IGwgPSBzdHJsZW4ocykgKyAxOworICAgIGNoYXIgKmQgPSBsbWFsbG9jKGwpOworCisgICAgaWYgKGQpCisJbWVtY3B5KGQsIHMsIGwpOworCisgICAgcmV0dXJuIGQ7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvbWFrZWVycmxpc3QucGwgYi9jb20zMi9saWIvbWFrZWVycmxpc3QucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0M2I5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9tYWtlZXJybGlzdC5wbApAQCAtMCwwICsxLDk4IEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgVGhpcyBjcmVhdGVzIHN5c19lcnJsaXN0IGZyb20gPGFzbS9lcnJuby5oPiB0aHJvdWdoIHNvbWV3aGF0CisjIGhldXJpc3RpYyBtYXRjaGluZy4gIEl0IHByZXN1bWVzIHRoZSByZWxldmFudCBlbnRyaWVzIGFyZSBvZiB0aGUgZm9ybQorIyAjZGVmaW5lIEV4eHh4IDxpbnRlZ2VyPiAvKiBjb21tZW50ICovCisjCisKK3VzZSBGaWxlSGFuZGxlOworCislZXJyb3JzICA9ICgpOworJWVycm1zZyAgPSAoKTsKKyRtYXhlcnIgID0gLTE7CitAaW5jbHVkZWxpc3QgPSAoKTsJCSMgSW5jbHVkZSBkaXJlY3RvcmllcworCitzdWIgcGFyc2VfZmlsZSgkKSB7CisgICAgbXkoJGZpbGUpID0gQF87CisgICAgbXkoJGZoKSA9IG5ldyBGaWxlSGFuZGxlOworICAgIG15KCRsaW5lLCAkZXJyb3IsICRtc2cpOworICAgIG15KCRrZXJuZWxvbmx5KSA9IDA7CisgICAgbXkoJHJvb3QpOworCisgICAgcHJpbnQgU1RERVJSICJvcGVuaW5nICRmaWxlXG4iIHVubGVzcyAoICRxdWlldCApOworCisgICAgJG9rID0gMDsKKyAgICBmb3JlYWNoICRyb290ICggQGluY2x1ZGVsaXN0ICkgeworCWlmICggJGZoLT5vcGVuKCRyb290LicvLycuJGZpbGUsICc8JykgKSB7CisJICAgICRvayA9IDE7CisJICAgIGxhc3Q7CisJfQorICAgIH0KKworICAgIGlmICggISAkb2sgKSB7CisJZGllICIkMDogQ2Fubm90IGZpbmQgZmlsZSAkZmlsZVxuIjsKKyAgICB9CisKKyAgICB3aGlsZSAoIGRlZmluZWQoJGxpbmUgPSA8JGZoPikgKSB7CisJaWYgKCAka2VybmVsb25seSApIHsKKwkgICAgaWYgKCAkbGluZSA9fiAvXlwjXHMqZW5kaWYvICkgeworCQkka2VybmVsb25seS0tOworCSAgICB9IGVsc2lmICggJGxpbmUgPX4gL15cI1xzaWYvICkgeworCQkka2VybmVsb25seSsrOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYgKCAkbGluZSA9fiAvXlwjXHMqZGVmaW5lXHMrKFtBLVowLTlfXSspXHMrKFswLTldKylccypcL1wqXHMqKC4qXFMpXHMqXCpcLy8gKSB7CisJCSRlcnJvciA9ICQxOworCQkkZXJybm8gPSAkMiswOworCQkkbXNnICAgPSAkMzsKKwkJcHJpbnQgU1RERVJSICIkZXJyb3IgKCRlcnJubykgPT4gXCIkbXNnXCJcbiIgdW5sZXNzICggJHF1aWV0ICk7CisJCSRlcnJvcnN7JGVycm5vfSA9ICRlcnJvcjsKKwkJJGVycm1zZ3skZXJybm99ID0gJG1zZzsKKwkJJG1heGVyciA9ICRlcnJubyBpZiAoICRlcnJubyA+ICRtYXhlcnIgKTsKKwkgICAgfSBlbHNpZiAoICRsaW5lID1+IC9eXCNccyppbmNsdWRlXHMrW1w8XCJdKC4qKVtcPlwiXS8gKSB7CisJCXBhcnNlX2ZpbGUoJDEpOworCSAgICB9IGVsc2lmICggJGxpbmUgPX4gL15cI1xzKmlmZGVmXHMrX19LRVJORUxfXy8gKSB7CisJCSRrZXJuZWxvbmx5Kys7CisJICAgIH0KKwl9CisgICAgfQorICAgIGNsb3NlKCRmaCk7CisgICAgcHJpbnQgU1RERVJSICJjbG9zaW5nICRmaWxlXG4iIHVubGVzcyAoICRxdWlldCApOworfQorCiskdiA9ICRFTlZ7J0tCVUlMRF9WRVJCT1NFJ307CiskcXVpZXQgPSBkZWZpbmVkKCR2KSA/ICEkdiA6IDA7CisKK2ZvcmVhY2ggJGFyZyAoIEBBUkdWICkgeworICAgIGlmICggJGFyZyBlcSAnLXEnICkgeworCSRxdWlldCA9IDE7CisgICAgfSBlbHNpZiAoICRhcmcgPX4gL14tKGVycmxpc3R8ZXJybm9zfG1heGVycikkLyApIHsKKwkkdHlwZSA9ICRhcmc7CisgICAgfSBlbHNpZiAoICRhcmcgPX4gJ15cLUknICkgeworCXB1c2goQGluY2x1ZGVsaXN0LCAiJCciKTsKKyAgICB9IGVsc2UgeworCSMgSWdub3JlCisgICAgfQorfQorCitwYXJzZV9maWxlKCdlcnJuby5oJyk7CisKK2lmICggJHR5cGUgZXEgJy1lcnJsaXN0JyApIHsKKyAgICBwcmludCAgIiNpbmNsdWRlIDxlcnJuby5oPlxuIjsKKyAgICBwcmludGYgImNvbnN0IGludCBzeXNfbmVyciA9ICVkO1xuIiwgJG1heGVycisxOworICAgIHByaW50ZiAiY29uc3QgY2hhciAqIGNvbnN0IHN5c19lcnJsaXN0WyVkXSA9IHtcbiIsICRtYXhlcnIrMTsKKyAgICBmb3JlYWNoICRlICggc29ydChrZXlzKCVlcnJvcnMpKSApIHsKKwlwcmludGYgIiAgWyVzXSA9IFwiJXNcIixcbiIsICRlcnJvcnN7JGV9LCAkZXJybXNneyRlfTsKKyAgICB9CisgICAgcHJpbnQgIn07XG4iOworfSBlbHNpZiAoICR0eXBlIGVxICctZXJybm9zJyApIHsKKyAgICBwcmludCAgIiNpbmNsdWRlIDxlcnJuby5oPlxuIjsKKyAgICBwcmludGYgImNvbnN0IGludCBzeXNfbmVyciA9ICVkO1xuIiwgJG1heGVycisxOworICAgIHByaW50ZiAiY29uc3QgY2hhciAqIGNvbnN0IHN5c19lcnJsaXN0WyVkXSA9IHtcbiIsICRtYXhlcnIrMTsKKyAgICBmb3JlYWNoICRlICggc29ydChrZXlzKCVlcnJvcnMpKSApIHsKKwlwcmludGYgIiAgWyVzXSA9IFwiJXNcIixcbiIsICRlcnJvcnN7JGV9LCAkZXJyb3JzeyRlfTsKKyAgICB9CisgICAgcHJpbnQgIn07XG4iOworfSBlbHNpZiAoICR0eXBlIGVxICctbWF4ZXJyJyApIHsKKyAgICBwcmludCAkbWF4ZXJyLCAiXG4iOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL21hbGxvYy5oIGIvY29tMzIvbGliL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzU0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbWFsbG9jLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIG1hbGxvYy5oCisgKgorICogSW50ZXJuYWxzIGZvciB0aGUgbWVtb3J5IGFsbG9jYXRvcgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyoKKyAqIFRoaXMgaXMgdGhlIG1pbmltdW0gY2h1bmsgc2l6ZSB3ZSB3aWxsIGFzayB0aGUga2VybmVsIGZvcjsgdGhpcyBzaG91bGQKKyAqIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZSBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KKyAqLworI2RlZmluZSBNQUxMT0NfQ0hVTktfU0laRQk2NTUzNgorI2RlZmluZSBNQUxMT0NfQ0hVTktfTUFTSyAgICAgICAoTUFMTE9DX0NIVU5LX1NJWkUtMSkKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3by4gIFRoaXMgYmVjb21lcyB0aGUKKyAqIGFsaWdubWVudCB1bml0LgorICovCitzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXI7CisKK3N0cnVjdCBhcmVuYV9oZWFkZXIgeworICAgIHNpemVfdCB0eXBlOworICAgIHNpemVfdCBzaXplOwkJLyogQWxzbyBnaXZlcyB0aGUgbG9jYXRpb24gb2YgdGhlIG5leHQgZW50cnkgKi8KKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKm5leHQsICpwcmV2OworfTsKKworI2lmZGVmIERFQlVHX01BTExPQworI2RlZmluZSBBUkVOQV9UWVBFX1VTRUQgMHg2NGU2OWM3MAorI2RlZmluZSBBUkVOQV9UWVBFX0ZSRUUgMHgwMTJkNjEwYQorI2RlZmluZSBBUkVOQV9UWVBFX0hFQUQgMHg5NzE2NzZiNQorI2RlZmluZSBBUkVOQV9UWVBFX0RFQUQgMHhlZWVlZWVlZQorI2Vsc2UKKyNkZWZpbmUgQVJFTkFfVFlQRV9VU0VEIDAKKyNkZWZpbmUgQVJFTkFfVFlQRV9GUkVFIDEKKyNkZWZpbmUgQVJFTkFfVFlQRV9IRUFEIDIKKyNlbmRpZgorCisjZGVmaW5lIEFSRU5BX1NJWkVfTUFTSyAofih1aW50cHRyX3QpKHNpemVvZihzdHJ1Y3QgYXJlbmFfaGVhZGVyKS0xKSkKKworI2RlZmluZSBBUkVOQV9BTElHTl9VUChwKQkoKGNoYXIgKikoKCh1aW50cHRyX3QpKHApICsgfkFSRU5BX1NJWkVfTUFTSykgJiBBUkVOQV9TSVpFX01BU0spKQorI2RlZmluZSBBUkVOQV9BTElHTl9ET1dOKHApCSgoY2hhciAqKSgodWludHB0cl90KShwKSAmIEFSRU5BX1NJWkVfTUFTSykpCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIHR3aWNlIHRoZSBzaXplIG9mIHRoZQorICogcHJldmlvdXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgeworICAgIHN0cnVjdCBhcmVuYV9oZWFkZXIgYTsKKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKm5leHRfZnJlZSwgKnByZXZfZnJlZTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgX19tYWxsb2NfaGVhZDsKK3ZvaWQgX19pbmplY3RfZnJlZV9ibG9jayhzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFoKTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9tYXRoL3Bvdy5TIGIvY29tMzIvbGliL21hdGgvcG93LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmNTA0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9tYXRoL3Bvdy5TCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBwb3cuUworICoKKyAqIGRvdWJsZSBwb3coZG91YmxlIGJhc2UsIGRvdWJsZSBleHBvbmVudCkKKyAqLworCisJLnRleHQKKwkuZ2xvYmwJcG93CisJLnR5cGUJcG93LEBmdW5jdGlvbgorcG93OgorCWZsZGwJMTIoJWVzcCkKKwlmbGRsCTQoJWVzcCkKKwlmeWwyeAorCWZsZAklc3QoMCkKKwlmcm5kaW50CisJZnN1YnIJJXN0LCVzdCgxKQorCWZ4Y2gJJXN0KDEpCisJZjJ4bTEKKwlmbGQxCisJZmFkZHAJJXN0LCVzdCgxKQorCWZzY2FsZQorCWZzdHAJJXN0KDEpCisJcmV0CisKKwkuc2l6ZQlwb3csLi1wb3cKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9tYXRoL3N0cnRvZC5jIGIvY29tMzIvbGliL21hdGgvc3RydG9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5NTMxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9tYXRoL3N0cnRvZC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogc3RydG9kLmMKKyAqCisgKiBDb252ZXJ0IHN0cmluZyB0byBkb3VibGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTWljaGFlbCBSaW5nZ2FhcmQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworc3RhdGljIGlubGluZSBpbnQgaXNfcmVhbChkb3VibGUgeCkKK3sKKyAgICBjb25zdCBkb3VibGUgSW5mID0gMS4wIC8gMC4wOworICAgIHJldHVybiAoeCA8IEluZikgJiYgKHggPj0gLUluZik7Cit9CisKK2RvdWJsZSBzdHJ0b2QoY29uc3QgY2hhciAqc3RyLCBjaGFyICoqZW5kcHRyKQoreworICAgIGRvdWJsZSBudW1iZXI7CisgICAgaW50IGV4cG9uZW50OworICAgIGludCBuZWdhdGl2ZTsKKyAgICBjaGFyICpwID0gKGNoYXIgKilzdHI7CisgICAgZG91YmxlIHAxMDsKKyAgICBpbnQgbjsKKyAgICBpbnQgbnVtX2RpZ2l0czsKKyAgICBpbnQgbnVtX2RlY2ltYWxzOworICAgIGNvbnN0IGRvdWJsZSBJbmYgPSAxLjAgLyAwLjA7CisKKyAgICAvLyBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZQorICAgIHdoaWxlIChpc3NwYWNlKCpwKSkKKwlwKys7CisKKyAgICAvLyBIYW5kbGUgb3B0aW9uYWwgc2lnbgorICAgIG5lZ2F0aXZlID0gMDsKKyAgICBzd2l0Y2ggKCpwKSB7CisgICAgY2FzZSAnLSc6CisJbmVnYXRpdmUgPSAxOwkJLy8gRmFsbCB0aHJvdWdoIHRvIGluY3JlbWVudCBwb3NpdGlvbgorICAgIGNhc2UgJysnOgorCXArKzsKKyAgICB9CisKKyAgICBudW1iZXIgPSAwLjsKKyAgICBleHBvbmVudCA9IDA7CisgICAgbnVtX2RpZ2l0cyA9IDA7CisgICAgbnVtX2RlY2ltYWxzID0gMDsKKworICAgIC8vIFByb2Nlc3Mgc3RyaW5nIG9mIGRpZ2l0cworICAgIHdoaWxlIChpc2RpZ2l0KCpwKSkgeworCW51bWJlciA9IG51bWJlciAqIDEwLiArICgqcCAtICcwJyk7CisJcCsrOworCW51bV9kaWdpdHMrKzsKKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIGRlY2ltYWwgcGFydAorICAgIGlmICgqcCA9PSAnLicpIHsKKwlwKys7CisKKwl3aGlsZSAoaXNkaWdpdCgqcCkpIHsKKwkgICAgbnVtYmVyID0gbnVtYmVyICogMTAuICsgKCpwIC0gJzAnKTsKKwkgICAgcCsrOworCSAgICBudW1fZGlnaXRzKys7CisJICAgIG51bV9kZWNpbWFscysrOworCX0KKworCWV4cG9uZW50IC09IG51bV9kZWNpbWFsczsKKyAgICB9CisKKyAgICBpZiAobnVtX2RpZ2l0cyA9PSAwKSB7CisJZXJybm8gPSBFUkFOR0U7CisJcmV0dXJuIDAuMDsKKyAgICB9CisgICAgLy8gQ29ycmVjdCBmb3Igc2lnbgorICAgIGlmIChuZWdhdGl2ZSkKKwludW1iZXIgPSAtbnVtYmVyOworCisgICAgLy8gUHJvY2VzcyBhbiBleHBvbmVudCBzdHJpbmcKKyAgICBpZiAoKnAgPT0gJ2UnIHx8ICpwID09ICdFJykgeworCS8vIEhhbmRsZSBvcHRpb25hbCBzaWduCisJbmVnYXRpdmUgPSAwOworCXN3aXRjaCAoKisrcCkgeworCWNhc2UgJy0nOgorCSAgICBuZWdhdGl2ZSA9IDE7CS8vIEZhbGwgdGhyb3VnaCB0byBpbmNyZW1lbnQgcG9zCisJY2FzZSAnKyc6CisJICAgIHArKzsKKwl9CisKKwkvLyBQcm9jZXNzIHN0cmluZyBvZiBkaWdpdHMKKwluID0gMDsKKwl3aGlsZSAoaXNkaWdpdCgqcCkpIHsKKwkgICAgbiA9IG4gKiAxMCArICgqcCAtICcwJyk7CisJICAgIHArKzsKKwl9CisKKwlpZiAobmVnYXRpdmUpCisJICAgIGV4cG9uZW50IC09IG47CisJZWxzZQorCSAgICBleHBvbmVudCArPSBuOworICAgIH0KKworICAgIGlmIChleHBvbmVudCA8IF9fREJMX01JTl9FWFBfXyB8fCBleHBvbmVudCA+IF9fREJMX01BWF9FWFBfXykgeworCWVycm5vID0gRVJBTkdFOworCXJldHVybiBJbmY7CisgICAgfQorICAgIC8vIFNjYWxlIHRoZSByZXN1bHQKKyAgICBwMTAgPSAxMC47CisgICAgbiA9IGV4cG9uZW50OworICAgIGlmIChuIDwgMCkKKwluID0gLW47CisgICAgd2hpbGUgKG4pIHsKKwlpZiAobiAmIDEpIHsKKwkgICAgaWYgKGV4cG9uZW50IDwgMCkKKwkJbnVtYmVyIC89IHAxMDsKKwkgICAgZWxzZQorCQludW1iZXIgKj0gcDEwOworCX0KKwluID4+PSAxOworCXAxMCAqPSBwMTA7CisgICAgfQorCisgICAgaWYgKCFpc19yZWFsKG51bWJlcikpCisJZXJybm8gPSBFUkFOR0U7CisgICAgaWYgKGVuZHB0cikKKwkqZW5kcHRyID0gcDsKKworICAgIHJldHVybiBudW1iZXI7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvbWVtY2NweS5jIGIvY29tMzIvbGliL21lbWNjcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ5ZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL21lbWNjcHkuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogbWVtY2NweS5jCisgKgorICogbWVtY2NweSgpCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkICptZW1jY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgYywgc2l6ZV90IG4pCit7CisgICAgY2hhciAqcSA9IGRzdDsKKyAgICBjb25zdCBjaGFyICpwID0gc3JjOworICAgIGNoYXIgY2g7CisKKyAgICB3aGlsZSAobi0tKSB7CisJKnErKyA9IGNoID0gKnArKzsKKwlpZiAoY2ggPT0gKGNoYXIpYykKKwkgICAgcmV0dXJuIHE7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7CQkvKiBObyBpbnN0YW5jZSBvZiAiYyIgZm91bmQgKi8KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9tZW1jaHIuYyBiL2NvbTMyL2xpYi9tZW1jaHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQxYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL21lbWNoci5jCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBtZW1jaHIuYworICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordm9pZCAqbWVtY2hyKGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3QgbikKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcCA9IHM7CisKKyAgICB3aGlsZSAobi0tKSB7CisJaWYgKCpzcCA9PSAodW5zaWduZWQgY2hhciljKQorCSAgICByZXR1cm4gKHZvaWQgKilzcDsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9tZW1jbXAuYyBiL2NvbTMyL2xpYi9tZW1jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWU2NDJiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL21lbWNtcC5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBtZW1jbXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IG1lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmMxID0gczEsICpjMiA9IHMyOworICAgIGludCBkID0gMDsKKworICAgIHdoaWxlIChuLS0pIHsKKwlkID0gKGludCkqYzErKyAtIChpbnQpKmMyKys7CisJaWYgKGQpCisJICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBkOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL21lbWNweS5TIGIvY29tMzIvbGliL21lbWNweS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNTMwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbWVtY3B5LlMKQEAgLTAsMCArMSw5MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBtZW1jcHkuUworICoKKyAqIFJlYXNvbmFibHkgZWZmaWNpZW50IG1lbWNweSwgdXNpbmcgYWxpZ25lZCB0cmFuc2ZlcnMgYXQgbGVhc3QKKyAqIGZvciB0aGUgZGVzdGluYXRpb24gb3BlcmFuZC4KKyAqLworCisJLnRleHQKKwkuZ2xvYmwJbWVtY3B5CisJLnR5cGUJbWVtY3B5LCBAZnVuY3Rpb24KK21lbWNweToKKwltb3ZsCTB4YyglZXNwKSwlZWN4CisJbW92bAkweDgoJWVzcCksJWVkeAorCW1vdmwJMHg0KCVlc3ApLCVlYXgKKworCWplY3h6CTFmCisKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYXgJCS8qIFJldHVybiB2YWx1ZSAqLworCisJbW92bAklZWF4LCVlZGkKKwltb3ZsCSVlZHgsJWVzaQorCisJLyogSW5pdGlhbCBhbGlnbm1lbnQgKi8KKwltb3ZsCSVlZGksJWVkeAorCXNocmwJJDEsJWVkeAorCWpuYwkxMWYKKwltb3ZzYgorCWRlY2wJJWVjeAorMTE6CisJbW92YgklY2wsJWFsCisJY21wbAkkMiwlZWN4CisJamIJMTNmCisKKwlzaHJsCSQxLCVlZHgKKwlqbmMJMTJmCisJbW92c3cKKwlzdWJsCSQyLCVlY3gKKzEyOgorCS8qIEJ1bGsgdHJhbnNmZXIgKi8KKwltb3ZiCSVjbCwlYWwKKwlzaHJsCSQyLCVlY3gKKwlyZXA7IG1vdnNsCisKKwkvKiBGaW5hbCBhbGlnbm1lbnQgKi8KKwl0ZXN0YgkkMiwlYWwKKwlqegkxNGYKKwltb3ZzdworMTM6CisxNDoKKwl0ZXN0YgkkMSwlYWwKKwlqegkxNWYKKwltb3ZzYgorMTU6CisKKwlwb3BsCSVlYXgJCS8qIFJldHVybiB2YWx1ZSAqLworCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorMToKKwlyZXQKKworCS5zaXplCW1lbWNweSwgLi1tZW1jcHkKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9tZW1jcHkuYyBiL2NvbTMyL2xpYi9tZW1jcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UyMDZkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL21lbWNweS5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBtZW1jcHkuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCAqbWVtY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKwljb25zdCBjaGFyICpwID0gc3JjOworCWNoYXIgKnEgPSBkc3Q7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwlzaXplX3QgbmwgPSBuID4+IDI7CisJYXNtIHZvbGF0aWxlICgiY2xkIDsgcmVwIDsgbW92c2wgOyBtb3ZsICUzLCUwIDsgcmVwIDsgbW92c2IiOiIrYyIgKG5sKSwKKwkJICAgICAgIitTIihwKSwgIitEIihxKQorCQkgICAgICA6InIiKG4gJiAzKSk7CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisJc2l6ZV90IG5xID0gbiA+PiAzOworCWFzbSB2b2xhdGlsZSAoImNsZCA7IHJlcCA7IG1vdnNxIDsgbW92bCAlMywlJWVjeCA7IHJlcCA7IG1vdnNiIjoiK2MiCisJCSAgICAgIChucSksICIrUyIocCksICIrRCIocSkKKwkJICAgICAgOiJyIigodWludDMyX3QpIChuICYgNykpKTsKKyNlbHNlCisJd2hpbGUgKG4tLSkgeworCQkqcSsrID0gKnArKzsKKwl9CisjZW5kaWYKKworCXJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvbWVtbWVtLmMgYi9jb20zMi9saWIvbWVtbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0MmYxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9tZW1tZW0uYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogbWVtbWVtLmMKKyAqCisgKiBGaW5kIGEgYnl0ZSBzdHJpbmcgaW5zaWRlIGEgbG9uZ2VyIGJ5dGUgc3RyaW5nCisgKgorICogVGhpcyB1c2VzIHRoZSAiTm90IFNvIE5haXZlIiBhbGdvcml0aG0sIGEgdmVyeSBzaW1wbGUgYnV0CisgKiB1c3VhbGx5IGVmZmVjdGl2ZSBhbGdvcml0aG0sIHNlZToKKyAqCisgKiBodHRwOi8vd3d3LWlnbS51bml2LW1sdi5mci9+bGVjcm9xL3N0cmluZy8KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgKm1lbW1lbShjb25zdCB2b2lkICpoYXlzdGFjaywgc2l6ZV90IG4sIGNvbnN0IHZvaWQgKm5lZWRsZSwgc2l6ZV90IG0pCit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqeSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopaGF5c3RhY2s7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqeCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopbmVlZGxlOworCisgICAgc2l6ZV90IGosIGssIGw7CisKKyAgICBpZiAobSA+IG4gfHwgIW0gfHwgIW4pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKDEgIT0gbSkgeworICAgICAgICBpZiAoeFswXSA9PSB4WzFdKSB7CisgICAgICAgICAgICBrID0gMjsKKyAgICAgICAgICAgIGwgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgayA9IDE7CisgICAgICAgICAgICBsID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGogPSAwOworICAgICAgICB3aGlsZSAoaiA8PSBuIC0gbSkgeworICAgICAgICAgICAgaWYgKHhbMV0gIT0geVtqICsgMV0pIHsKKyAgICAgICAgICAgICAgICBqICs9IGs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbWVtY21wKHggKyAyLCB5ICsgaiArIDIsIG0gLSAyKQorICAgICAgICAgICAgICAgICAgICAmJiB4WzBdID09IHlbal0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSZ5W2pdOworICAgICAgICAgICAgICAgIGogKz0gbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmICgqeSA9PSAqeCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKil5OworICAgICAgICAgICAgeSsrOworICAgICAgICB9IHdoaWxlICgtLW4pOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL21lbW1vdmUuUyBiL2NvbTMyL2xpYi9tZW1tb3ZlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5NGU0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9tZW1tb3ZlLlMKQEAgLTAsMCArMSwxNTAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbWVtbW92ZS5TCisgKgorICogUmVhc29uYWJseSBlZmZpY2llbnQgbWVtbW92ZSwgdXNpbmcgYWxpZ25lZCB0cmFuc2ZlcnMgYXQgbGVhc3QKKyAqIGZvciB0aGUgZGVzdGluYXRpb24gb3BlcmFuZC4KKyAqLworCisJLmdsb2JsCW1lbW1vdmUKKwkudHlwZQltZW1tb3ZlLEBmdW5jdGlvbgorCS50ZXh0CittZW1tb3ZlOgorCW1vdmwJMHhjKCVlc3ApLCVlY3gKKwltb3ZsCTB4OCglZXNwKSwlZWR4CisJbW92bAkweDQoJWVzcCksJWVheAorCisJamVjeHoJNGYKKworCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVheAkJLyogUmV0dXJuIHZhbHVlICovCisKKwltb3ZsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisKKwljbXBsCSVlZGksJWVzaQorCWpiCTJmCisKKwkvKiBzb3VyY2UgPj0gZGVzdCwgZm9yd2FyZHMgbW92ZSAqLworCisJLyogSW5pdGlhbCBhbGlnbm1lbnQgKi8KKzE6CisJbW92bAklZWRpLCVlZHgKKwlzaHJsCSQxLCVlZHgKKwlqbmMJMTFmCisJbW92c2IKKwlkZWNsCSVlY3gKKzExOgorCW1vdmIJJWNsLCVhbAorCWNtcGwJJDIsJWVjeAorCWpiCTEzZgorCisJc2hybAkkMSwlZWR4CisJam5jCTEyZgorCW1vdnN3CisJc3VibAkkMiwlZWN4CisxMjoKKwkvKiBCdWxrIHRyYW5zZmVyICovCisJbW92YgklY2wsJWFsCisJc2hybAkkMiwlZWN4CisJcmVwOyBtb3ZzbAorCisJLyogRmluYWwgYWxpZ25tZW50ICovCisJdGVzdGIJJDIsJWFsCisJanoJMTRmCisJbW92c3cKKzEzOgorMTQ6CisJdGVzdGIJJDEsJWFsCisJanoJMTVmCisJbW92c2IKKzE1OgorCS8qIENvbW1vbiBleGl0IHN0dWIgKi8KKzM6CisJcG9wbAklZWF4CQkvKiBSZXR1cm4gdmFsdWUgKi8KKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKzQ6CisJcmV0CisKKworMjoKKwkvKiBzb3VyY2UgPCBkZXN0LCBiYWNrd2FyZHMgbW92ZSBpZiBvdmVybGFwICovCisJbGVhbAktMSglZWN4LCVlc2kpLCVlYXgKKwljbXBsCSVlYXgsJWVkaQorCWphCTFiCQkJLyogTm8gb3ZlcmxhcCwgYWZ0ZXIgYWxsLi4uICovCisKKwlzdGQKKwlsZWFsCS0xKCVlY3gsJWVkaSksJWVkaQorCW1vdmwJJWVheCwlZXNpCisKKwkvKiBJbml0aWFsIGFsaWdubWVudCAqLworCW1vdmwJJWVkaSwlZWR4CisJc2hybAkkMSwlZWR4CisJamMJMjFmCisJbW92c2IKKwlkZWNsCSVlY3gKKzIxOgorCWRlY2wJJWVzaQorCWRlY2wJJWVkaQorCW1vdmIJJWNsLCVhbAorCWNtcGwJJDIsJWVjeAorCWpiCTIzZgorCXNocmwJJDEsJWVkeAorCWpjCTIyZgorCW1vdnN3CisJc3VibAkkMiwlZWN4CisyMjoKKwkvKiBCdWxrIHRyYW5zZmVyICovCisJc3VibAkkMiwlZXNpCisJc3VibAkkMiwlZWRpCisJbW92YgklY2wsJWFsCisJc2hybAkkMiwlZWN4CisJcmVwOyBtb3ZzbAorCisJLyogRmluYWwgYWxpZ25tZW50ICovCisJYWRkbAkkMiwlZXNpCisJYWRkbAkkMiwlZWRpCisJdGVzdGIJJDIsJWFsCisJanoJMjRmCisJbW92c3cKKzIzOgorMjQ6CisJaW5jbAklZXNpCisJaW5jbAklZWRpCisJdGVzdGIJJDEsJWFsCisJanoJMjVmCisJbW92c2IKKzI1OgorCWNsZAorCWptcAkzYgorCisJLnNpemUJbWVtbW92ZSwgLi1tZW1tb3ZlCmRpZmYgLS1naXQgYS9jb20zMi9saWIvbWVtbW92ZS5jIGIvY29tMzIvbGliL21lbW1vdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzk4Y2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL21lbW1vdmUuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogbWVtbW92ZS5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkICptZW1tb3ZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKwljb25zdCBjaGFyICpwID0gc3JjOworCWNoYXIgKnEgPSBkc3Q7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCWlmIChxIDwgcCkgeworCQlhc20gdm9sYXRpbGUoImNsZDsgcmVwOyBtb3ZzYiIKKwkJCSAgICAgOiAiK2MiIChuKSwgIitTIihwKSwgIitEIihxKSk7CisJfSBlbHNlIHsKKwkJcCArPSAobiAtIDEpOworCQlxICs9IChuIC0gMSk7CisJCWFzbSB2b2xhdGlsZSgic3RkOyByZXA7IG1vdnNiOyBjbGQiCisJCQkgICAgIDogIitjIiAobiksICIrUyIocCksICIrRCIocSkpOworCX0KKyNlbHNlCisJaWYgKHEgPCBwKSB7CisJCXdoaWxlIChuLS0pIHsKKwkJCSpxKysgPSAqcCsrOworCQl9CisJfSBlbHNlIHsKKwkJcCArPSBuOworCQlxICs9IG47CisJCXdoaWxlIChuLS0pIHsKKwkJCSotLXEgPSAqLS1wOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL21lbXBjcHkuUyBiL2NvbTMyL2xpYi9tZW1wY3B5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5NmYxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9tZW1wY3B5LlMKQEAgLTAsMCArMSw4OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBtZW1wY3B5LlMKKyAqCisgKiBSZWFzb25hYmx5IGVmZmljaWVudCBtZW1wY3B5LCB1c2luZyBhbGlnbmVkIHRyYW5zZmVycyBhdCBsZWFzdAorICogZm9yIHRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kLgorICovCisKKwkudGV4dAorCS5nbG9ibAltZW1wY3B5CisJLnR5cGUJbWVtcGNweSwgQGZ1bmN0aW9uCittZW1wY3B5OgorCW1vdmwJMHhjKCVlc3ApLCVlY3gKKwltb3ZsCTB4OCglZXNwKSwlZWR4CisJbW92bAkweDQoJWVzcCksJWVheAorCisJamVjeHoJMWYKKworCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisKKwltb3ZsCSVlYXgsJWVkaQorCW1vdmwJJWVkeCwlZXNpCisKKwkvKiBJbml0aWFsIGFsaWdubWVudCAqLworCW1vdmwJJWVkaSwlZWR4CisJc2hybAkkMSwlZWR4CisJam5jCTExZgorCW1vdnNiCisJZGVjbAklZWN4CisxMToKKwltb3ZiCSVjbCwlYWwKKwljbXBsCSQyLCVlY3gKKwlqYgkxM2YKKworCXNocmwJJDEsJWVkeAorCWpuYwkxMmYKKwltb3ZzdworCXN1YmwJJDIsJWVjeAorMTI6CisJLyogQnVsayB0cmFuc2ZlciAqLworCW1vdmIJJWNsLCVhbAorCXNocmwJJDIsJWVjeAorCXJlcDsgbW92c2wKKworCS8qIEZpbmFsIGFsaWdubWVudCAqLworCXRlc3RiCSQyLCVhbAorCWp6CTE0ZgorCW1vdnN3CisxMzoKKzE0OgorCXRlc3RiCSQxLCVhbAorCWp6CTE1ZgorCW1vdnNiCisxNToKKworCW1vdmwJJWVkaSwlZWF4CS8qIFJldHVybiB2YWx1ZSAqLworCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorMToKKwlyZXQKKworCS5zaXplCW1lbXBjcHksIC4tbWVtcGNweQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL21lbXBjcHkuYyBiL2NvbTMyL2xpYi9tZW1wY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyM2I2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9tZW1wY3B5LmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIG1lbXBjcHkuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogc2ltcGx5IGEgd3JhcHBlciBhcm91bmQgbWVtY3B5IGltcGxlbWVudGF0aW9uICovCisKK3ZvaWQgKm1lbXBjcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworCisJcmV0dXJuIChjaGFyICopbWVtY3B5KGRzdCwgc3JjLCBuKSArIG47Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvbWVtc2V0LlMgYi9jb20zMi9saWIvbWVtc2V0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0Mjg0MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9tZW1zZXQuUwpAQCAtMCwwICsxLDkwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1lbXNldC5TCisgKgorICogUmVhc29uYWJseSBlZmZpY2llbnQgbWVtc2V0LCB1c2luZyBhbGlnbmVkIHRyYW5zZmVycyBhdCBsZWFzdAorICogZm9yIHRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kLgorICovCisKKwkuZ2xvYmwJbWVtc2V0CisJLnR5cGUJbWVtc2V0LEBmdW5jdGlvbgorCS50ZXh0CittZW1zZXQ6CisJbW92bAkweGMoJWVzcCksJWVjeAorCW1vdmwJMHg4KCVlc3ApLCVlZHgKKwltb3ZsCTB4NCglZXNwKSwlZWF4CisKKwlqZWN4egk2ZgorCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYngKKwlwdXNobAklZWF4CQkvKiBSZXR1cm4gdmFsdWUgKi8KKworCW1vdmwJJWVheCwlZWRpCisJbW92YgklZGwsJWRoCisJbW92endsCSVkeCwlZWF4CisJc2hsbAkkMTYsJWVkeAorCW9ybAklZWR4LCVlYXgKKworCS8qIEluaXRpYWwgYWxpZ25tZW50ICovCisJbW92bAklZWRpLCVlZHgKKwlzaHJsCSQxLCVlZHgKKwlqbmMJMWYKKwlzdG9zYgorCWRlY2wJJWVjeAorMToKKwltb3ZiCSVjbCwlYmwKKwljbXBsCSQyLCVlY3gKKwlqYgkzZgorCXNocmwJJDEsJWVkeAorCWpuYwkyZgorCXN0b3N3CisJc3VibAkkMiwlZWN4CisyOgorCS8qIEJ1bGsgdHJhbnNmZXIgKi8KKwltb3ZiCSVjbCwlYmwKKwlzaHJsCSQyLCVlY3gKKwlyZXA7IHN0b3NsCisKKwl0ZXN0YgkkMiwlYmwKKwlqegk0ZgorCXN0b3N3CiszOgorNDoKKwl0ZXN0YgkkMSwlYmwKKwlqegk1ZgorCXN0b3NiCis1OgorCXBvcGwJJWVheAkJLyogUmV0dXJuIHZhbHVlICovCisJcG9wbAklZWJ4CisJcG9wbAklZWRpCis2OgorCXJldAorCisJLnNpemUJbWVtc2V0LCAuLW1lbXNldApkaWZmIC0tZ2l0IGEvY29tMzIvbGliL21lbXNldC5jIGIvY29tMzIvbGliL21lbXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDBiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvbWVtc2V0LmMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIG1lbXNldC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkICptZW1zZXQodm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IG4pCit7CisJY2hhciAqcSA9IGRzdDsKKworI2lmIGRlZmluZWQoX19pMzg2X18pCisJc2l6ZV90IG5sID0gbiA+PiAyOworCWFzbSB2b2xhdGlsZSAoImNsZCA7IHJlcCA7IHN0b3NsIDsgbW92bCAlMywlMCA7IHJlcCA7IHN0b3NiIgorCQkgICAgICA6ICIrYyIgKG5sKSwgIitEIiAocSkKKwkJICAgICAgOiAiYSIgKCh1bnNpZ25lZCBjaGFyKWMgKiAweDAxMDEwMTAxVSksICJyIiAobiAmIDMpKTsKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKKwlzaXplX3QgbnEgPSBuID4+IDM7CisJYXNtIHZvbGF0aWxlICgiY2xkIDsgcmVwIDsgc3Rvc3EgOyBtb3ZsICUzLCUlZWN4IDsgcmVwIDsgc3Rvc2IiCisJCSAgICAgIDoiK2MiIChucSksICIrRCIgKHEpCisJCSAgICAgIDogImEiICgodW5zaWduZWQgY2hhciljICogMHgwMTAxMDEwMTAxMDEwMTAxVSksCisJCQkiciIgKCh1aW50MzJfdCkgbiAmIDcpKTsKKyNlbHNlCisJd2hpbGUgKG4tLSkgeworCQkqcSsrID0gYzsKKwl9CisjZW5kaWYKKworCXJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvbWVtc3dhcC5jIGIvY29tMzIvbGliL21lbXN3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzgxM2FiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL21lbXN3YXAuYwpAQCAtMCwwICsxLDI0IEBACisvKgorICogbWVtc3dhcCgpCisgKgorICogU3dhcHMgdGhlIGNvbnRlbnRzIG9mIHR3byBub25vdmVybGFwcGluZyBtZW1vcnkgYXJlYXMuCisgKiBUaGlzIHJlYWxseSBjb3VsZCBiZSBkb25lIGZhc3Rlci4uLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordm9pZCBtZW1zd2FwKHZvaWQgKm0xLCB2b2lkICptMiwgc2l6ZV90IG4pCit7CisgICAgY2hhciAqcCA9IG0xOworICAgIGNoYXIgKnEgPSBtMjsKKyAgICBjaGFyIHRtcDsKKworICAgIHdoaWxlIChuLS0pIHsKKwl0bXAgPSAqcDsKKwkqcCA9ICpxOworCSpxID0gdG1wOworCisJcCsrOworCXErKzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvb25leGl0LmMgYi9jb20zMi9saWIvb25leGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyZjhmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9vbmV4aXQuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogb25leGl0LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiYXRleGl0LmgiCisKK3N0YXRpYyBzdHJ1Y3QgYXRleGl0ICpfX2F0ZXhpdF9saXN0OworCitzdGF0aWMgX19ub3JldHVybiBvbl9leGl0X2V4aXQoaW50IHJ2KQoreworICAgIHN0cnVjdCBhdGV4aXQgKmFwOworCisgICAgZm9yIChhcCA9IF9fYXRleGl0X2xpc3Q7IGFwOyBhcCA9IGFwLT5uZXh0KSB7CisJYXAtPmZjdG4ocnYsIGFwLT5hcmcpOwkvKiBUaGlzIGFzc3VtZXMgZXh0cmEgYXJncyBhcmUgaGFybWxlc3MgKi8KKyAgICB9CisKKyAgICBfZXhpdChydik7Cit9CisKK2ludCBvbl9leGl0KHZvaWQgKCpmY3RuKSAoaW50LCB2b2lkICopLCB2b2lkICphcmcpCit7CisgICAgc3RydWN0IGF0ZXhpdCAqYXMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdGV4aXQpKTsKKworICAgIGlmICghYXMpCisJcmV0dXJuIC0xOworCisgICAgYXMtPmZjdG4gPSBmY3RuOworICAgIGFzLT5hcmcgPSBhcmc7CisKKyAgICBhcy0+bmV4dCA9IF9fYXRleGl0X2xpc3Q7CisgICAgX19hdGV4aXRfbGlzdCA9IGFzOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvcGNpL2Jpb3MuYyBiL2NvbTMyL2xpYi9wY2kvYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzJjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvcGNpL2Jpb3MuYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJwY2kvcGNpLmgiCisKK3VpbnQzMl90IF9fcGNpX3JlYWRfd3JpdGVfYmlvcyh1aW50MzJfdCBjYWxsLCB1aW50MzJfdCB2LCBwY2lhZGRyX3QgYSkKK3sKKyAgICBjb20zMnN5c190IHJzOworICAgIG1lbXNldCgmcnMsIDAsIHNpemVvZiBycyk7CisgICAgcnMuZWF4LndbMF0gPSBjYWxsOworICAgIHJzLmVieC53WzBdID0gYSA+PiA4OwkvKiBidXM6ZGV2aWNlOmZ1bmN0aW9uICovCisgICAgcnMuZWRpLmJbMF0gPSBhOwkJLyogYWRkcmVzczpyZWcgKi8KKyAgICBycy5lY3gubCAgICA9IHY7CisgICAgcnMuZWZsYWdzLmwgPSBFRkxBR1NfQ0Y7CisgICAgX19pbnRjYWxsKDB4MWEsICZycywgJnJzKTsKKworICAgIHJldHVybiAocnMuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpID8gfih1aW50MzJfdCkgMCA6IHJzLmVjeC5sOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3BjaS9jZmd0eXBlLmMgYi9jb20zMi9saWIvcGNpL2NmZ3R5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTZmN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3BjaS9jZmd0eXBlLmMKQEAgLTAsMCArMSw4OSBAQAorI2luY2x1ZGUgInBjaS9wY2kuaCIKKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitlbnVtIHBjaV9jb25maWdfdHlwZSBfX3BjaV9jZmdfdHlwZTsKKworc3RhdGljIGludCB0eXBlMV9vayh2b2lkKQoreworICAgIHVpbnQzMl90IG9sZGNmOCwgbmV3Y2Y4OworCisgICAgLyogVGVzdCBmb3IgQ29uZmlndXJhdGlvbiBNZXRob2QgIzEgKi8KKworICAgIC8qIE5vdGU6IFhGcmVlODYgd3JpdGVzIH4wIGFuZCBleHBlY3RzIHRvIHJlYWQgYmFjayAweDgwZmZmZmZjLiAgTGludXgKKyAgICAgICBkb2VzIHRoaXMgbGVzcyBzZXZlcmUgdGVzdDsgZ28gd2l0aCBMaW51eC4gKi8KKworICAgIGNsaSgpOworICAgIG91dGIoMSwgMHhjZmIpOwkJLyogRm9yIG9sZCBJbnRlbCBjaGlwc2V0cyAqLworICAgIG9sZGNmOCA9IGlubCgweGNmOCk7CisgICAgb3V0bCgweDgwMDAwMDAwLCAweGNmOCk7CisgICAgbmV3Y2Y4ID0gaW5sKDB4Y2Y4KTsKKyAgICBvdXRsKG9sZGNmOCwgMHhjZjgpOworICAgIHN0aSgpOworCisgICAgcmV0dXJuIG5ld2NmOCA9PSAweDgwMDAwMDAwOworfQorCitzdGF0aWMgaW50IHR5cGUyX29rKHZvaWQpCit7CisgICAgdWludDhfdCBvbGRjZjgsIG9sZGNmYTsKKyAgICB1aW50OF90IGNmOCwgY2ZhOworCisgICAgLyogVGVzdCBmb3IgQ29uZmlndXJhdGlvbiBNZXRob2QgIzIgKi8KKworICAgIC8qIENNIzIgaXMgaGFyZCB0byBwcm9iZSBmb3IsIGJ1dCBsZXQncyBkbyBvdXIgYmVzdC4uLiAqLworCisgICAgY2xpKCk7CisgICAgb3V0YigwLCAweGNmYik7CQkvKiBGb3Igb2xkIEludGVsIGNoaXBzZXRzICovCisgICAgb2xkY2Y4ID0gaW5iKDB4Y2Y4KTsKKyAgICBvdXRiKDAsIDB4Y2Y4KTsKKyAgICBvbGRjZmEgPSBpbmIoMHhjZmEpOworICAgIG91dGIoMCwgMHhjZmEpOworCisgICAgY2Y4ID0gaW5iKDB4Y2Y4KTsKKyAgICBjZmEgPSBpbmIoMHhjZmEpOworCisgICAgb3V0YihvbGRjZjgsIDB4Y2Y4KTsKKyAgICBvdXRiKG9sZGNmYSwgMHhjZmEpOworICAgIHN0aSgpOworCisgICAgcmV0dXJuIGNmOCA9PSAwICYmIGNmYSA9PSAwOworfQorCitpbnQgcGNpX3NldF9jb25maWdfdHlwZShlbnVtIHBjaV9jb25maWdfdHlwZSB0eXBlKQoreworICAgIHN0YXRpYyBjb25zdCBjb20zMnN5c190IGlyZWcgPSB7CisJLmVheC5sID0gMHhiMTAxLAorCS5lZGkubCA9IDAsCisJLmVmbGFncy5sID0gRUZMQUdTX0NGLAorICAgIH07CisgICAgY29tMzJzeXNfdCBvcmVnOworCisgICAgaWYgKHR5cGUgPT0gUENJX0NGR19BVVRPKSB7CisJdHlwZSA9IFBDSV9DRkdfTk9ORTsKKworCS8qIFRyeSB0byBkZXRlY3QgUENJIEJJT1MgKi8KKwlfX2ludGNhbGwoMHgxYSwgJmlyZWcsICZvcmVnKTsKKworCWlmICghKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpICYmCisJICAgIG9yZWcuZWF4LmJbMV0gPT0gMCAmJiBvcmVnLmVkeC5sID09IDB4MjA0OTQyNTApIHsKKwkgICAgLyogUENJIEJJT1MgcHJlc2VudC4gIFVzZSBkaXJlY3QgYWNjZXNzIGlmIHdlIGtub3cgaG93IHRvIGRvIGl0LiAqLworCisJICAgIGlmICgob3JlZy5lYXguYlswXSAmIDEpICYmIHR5cGUxX29rKCkpCisJCXR5cGUgPSBQQ0lfQ0ZHX1RZUEUxOworCSAgICBlbHNlIGlmICgob3JlZy5lYXguYlswXSAmIDIpICYmIHR5cGUyX29rKCkpCisJCXR5cGUgPSBQQ0lfQ0ZHX1RZUEUyOworCSAgICBlbHNlCisJCXR5cGUgPSBQQ0lfQ0ZHX0JJT1M7CS8qIFVzZSBCSU9TIGNhbGxzIGFzIGZhbGxiYWNrICovCisKKwl9IGVsc2UgaWYgKHR5cGUxX29rKCkpIHsKKwkgICAgdHlwZSA9IFBDSV9DRkdfVFlQRTE7CisJfSBlbHNlIGlmICh0eXBlMl9vaygpKSB7CisJICAgIHR5cGUgPSBQQ0lfQ0ZHX1RZUEUyOworCX0gZWxzZSB7CisJICAgIHR5cGUgPSBQQ0lfQ0ZHX05PTkU7CS8qIEJhZG5lc3MuLi4gKi8KKwl9CisgICAgfQorCisgICAgcmV0dXJuIChfX3BjaV9jZmdfdHlwZSA9IHR5cGUpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3BjaS9wY2kuaCBiL2NvbTMyL2xpYi9wY2kvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4MWIwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9wY2kvcGNpLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIHBjaS9wY2kuaAorICoKKyAqIENvbW1vbiBpbnRlcm5hbCBoZWFkZXIgZmlsZQorICovCisKKyNpZm5kZWYgUENJX1BDSV9ICisKKyNpbmNsdWRlIDxzeXMvcGNpLmg+CisjaW5jbHVkZSA8c3lzL2NwdS5oPgorCitleHRlcm4gZW51bSBwY2lfY29uZmlnX3R5cGUgX19wY2lfY2ZnX3R5cGU7CitleHRlcm4gdWludDMyX3QgX19wY2lfcmVhZF93cml0ZV9iaW9zKHVpbnQzMl90IGNhbGwsIHVpbnQzMl90IHYsIHBjaWFkZHJfdCBhKTsKKworI2VuZGlmIC8qIFBDSV9QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3BjaS9yZWFkYi5jIGIvY29tMzIvbGliL3BjaS9yZWFkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzQxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvcGNpL3JlYWRiLmMKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIFRZUEUgdWludDhfdAorI2RlZmluZSBCV0woeCkgeCAjIyBiCisjZGVmaW5lIEJJT1NDQUxMIDB4YjEwOAorI2luY2x1ZGUgInBjaS9yZWFkeC5jIgpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3BjaS9yZWFkbC5jIGIvY29tMzIvbGliL3BjaS9yZWFkbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZWYzYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvcGNpL3JlYWRsLmMKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIFRZUEUgdWludDMyX3QKKyNkZWZpbmUgQldMKHgpIHggIyMgbAorI2RlZmluZSBCSU9TQ0FMTCAweGIxMGEKKyNpbmNsdWRlICJwY2kvcmVhZHguYyIKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9wY2kvcmVhZHcuYyBiL2NvbTMyL2xpYi9wY2kvcmVhZHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjYwNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3BjaS9yZWFkdy5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBUWVBFIHVpbnQxNl90CisjZGVmaW5lIEJXTCh4KSB4ICMjIHcKKyNkZWZpbmUgQklPU0NBTEwgMHhiMTA5CisjaW5jbHVkZSAicGNpL3JlYWR4LmMiCmRpZmYgLS1naXQgYS9jb20zMi9saWIvcGNpL3JlYWR4LmMgYi9jb20zMi9saWIvcGNpL3JlYWR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2NmQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9wY2kvcmVhZHguYwpAQCAtMCwwICsxLDUxIEBACisjaW5jbHVkZSAicGNpL3BjaS5oIgorCitUWVBFIEJXTChwY2lfcmVhZCkgKHBjaWFkZHJfdCBhKQoreworICAgIFRZUEUgcjsKKworICAgIGZvciAoOzspIHsKKwlzd2l0Y2ggKF9fcGNpX2NmZ190eXBlKSB7CisJY2FzZSBQQ0lfQ0ZHX0FVVE86CisJICAgIHBjaV9zZXRfY29uZmlnX3R5cGUoUENJX0NGR19BVVRPKTsKKwkgICAgYnJlYWs7CQkvKiBUcnkgYWdhaW4gKi8KKworCWNhc2UgUENJX0NGR19UWVBFMToKKwkgICAgeworCQl1aW50MzJfdCBvbGRjZjg7CisJCWNsaSgpOworCQlvbGRjZjggPSBpbmwoMHhjZjgpOworCQlvdXRsKGEsIDB4Y2Y4KTsKKwkJciA9IEJXTChpbikgKDB4Y2ZjICsgKGEgJiAzKSk7CisJCW91dGwob2xkY2Y4LCAweGNmOCk7CisJCXN0aSgpOworCSAgICB9CisJICAgIHJldHVybiByOworCisJY2FzZSBQQ0lfQ0ZHX1RZUEUyOgorCSAgICB7CisJCXVpbnQ4X3Qgb2xkY2Y4LCBvbGRjZmE7CisKKwkJaWYgKGEgJiAoMHgxMCA8PCAxMSkpCisJCSAgICByZXR1cm4gKFRZUEUpIH4gMDsJLyogRGV2aWNlIDE2LTMxIG5vdCBzdXBwb3J0ZWQgKi8KKworCQljbGkoKTsKKwkJb2xkY2Y4ID0gaW5iKDB4Y2Y4KTsKKwkJb2xkY2ZhID0gaW5iKDB4Y2ZhKTsKKwkJb3V0YigweGYwICsgKChhID4+ICg4IC0gMSkpICYgMHgwZSksIDB4Y2Y4KTsKKwkJb3V0YihhID4+IDE2LCAweGNmYSk7CisJCXIgPSBCV0woaW4pICgweGMwMDAgKyAoKGEgPj4gKDExIC0gOCkpICYgMHhmMDApICsgKGEgJiAweGZmKSk7CisJCW91dGIob2xkY2Y4LCAweGNmOCk7CisJCW91dGIob2xkY2ZhLCAweGNmYSk7CisJCXN0aSgpOworCSAgICB9CisJICAgIHJldHVybiByOworCisJY2FzZSBQQ0lfQ0ZHX0JJT1M6CisJICAgIHJldHVybiAoVFlQRSkgX19wY2lfcmVhZF93cml0ZV9iaW9zKEJJT1NDQUxMLCAwLCBhKTsKKworCWRlZmF1bHQ6CisJICAgIHJldHVybiAoVFlQRSkgfiAwOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvcGNpL3NjYW4uYyBiL2NvbTMyL2xpYi9wY2kvc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDBmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvcGNpL3NjYW4uYwpAQCAtMCwwICsxLDcyOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYtMjAwNyBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcGNpLmMKKyAqCisgKiBBIG1vZHVsZSB0byBleHRyYWN0IHBjaSBpbmZvcm1hdGlvbnMKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxzeXMvcGNpLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC96aW8uaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisKKyNkZWZpbmUgTUFYX0xJTkUgNTEyCisKKy8qIHJlbW92aW5nIGFueSBcbiBmb3VuZCBpbiBhIHN0cmluZyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2VvbChjaGFyICpzdHJpbmcpCit7CisgICAgaW50IGogPSBzdHJsZW4oc3RyaW5nKTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykKKwlpZiAoc3RyaW5nW2ldID09ICdcbicpCisJICAgIHN0cmluZ1tpXSA9IDA7Cit9CisKKy8qIGNvbnZlcnRpbmcgYSBoZXhhIHN0cmluZyBpbnRvIGl0cyBudW1lcmljYWwgdmFsdWUgKi8KK3N0YXRpYyBpbnQgaGV4X3RvX2ludChjaGFyICpoZXhhKQoreworICAgIHJldHVybiBzdHJ0b3VsKGhleGEsIE5VTEwsIDE2KTsKK30KKworLyogVHJ5IHRvIG1hdGNoIGFueSBwY2kgZGV2aWNlIHRvIHRoZSBhcHByb3ByaWF0ZSBrZXJuZWwgbW9kdWxlICovCisvKiBpdCB1c2VzIHRoZSBtb2R1bGVzLnBjaW1hcCBmcm9tIHRoZSBib290IGRldmljZSAqLworaW50IGdldF9tb2R1bGVfbmFtZV9mcm9tX3BjaW1hcChzdHJ1Y3QgcGNpX2RvbWFpbiAqZG9tYWluLAorCQkJCWNoYXIgKm1vZHVsZXNfcGNpbWFwX3BhdGgpCit7CisgIGNoYXIgbGluZVtNQVhfTElORV07CisgIGNoYXIgbW9kdWxlX25hbWVbMjFdOyAvLyB0aGUgbW9kdWxlIG5hbWUgZmllbGQgaXMgMjEgY2hhciBsb25nCisgIGNoYXIgZGVsaW1zW109IiAiOyAgICAvLyBjb2x1bXMgYXJlIHNlcGFyYXRlZCBieSBzcGFjZXMKKyAgY2hhciB2ZW5kb3JfaWRbMTZdOworICBjaGFyIHByb2R1Y3RfaWRbMTZdOworICBjaGFyIHN1Yl92ZW5kb3JfaWRbMTZdOworICBjaGFyIHN1Yl9wcm9kdWN0X2lkWzE2XTsKKyAgRklMRSAqZjsKKyAgc3RydWN0IHBjaV9kZXZpY2UgKmRldj1OVUxMOworCisgIC8qIEludGlhbGl6aW5nIHRoZSBsaW51eF9rZXJuZWxfbW9kdWxlIGZvciBlYWNoIHBjaSBkZXZpY2UgdG8gInVua25vd24iICovCisgIC8qIGFkZGluZyBhIGRldl9pbmZvIG1lbWJlciBpZiBuZWVkZWQgKi8KKyAgZm9yX2VhY2hfcGNpX2Z1bmMoZGV2LCBkb21haW4pIHsKKyAgICAvKiBpbml0aWFsaXplIHRoZSBkZXZfaW5mbyBzdHJ1Y3R1cmUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuICovCisgICAgaWYgKCEgZGV2LT5kZXZfaW5mbykgeworICAgICAgZGV2LT5kZXZfaW5mbyA9IHphbGxvYyhzaXplb2YgKmRldi0+ZGV2X2luZm8pOworICAgICAgaWYgKCFkZXYtPmRldl9pbmZvKQorCXJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChpbnQgaT0wO2k8TUFYX0tFUk5FTF9NT0RVTEVTX1BFUl9QQ0lfREVWSUNFO2krKykgeworICAgICBpZiAoc3RybGVuKGRldi0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVbaV0pPT0wKQorICAgICAgIHN0cmxjcHkoZGV2LT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZVtpXSwgInVua25vd24iLDcpOworICAgIH0KKyAgfQorCisgIC8qIE9wZW5pbmcgdGhlIG1vZHVsZXMucGNpbWFwIChvZiBhIGxpbnV4IGtlcm5lbCkgZnJvbSB0aGUgYm9vdCBkZXZpY2UgKi8KKyAgZj16Zm9wZW4obW9kdWxlc19wY2ltYXBfcGF0aCwgInIiKTsKKyAgaWYgKCFmKQorICAgIHJldHVybiAtRU5PTU9EVUxFU1BDSU1BUDsKKworICBzdHJjcHkodmVuZG9yX2lkLCIwMDAwIik7CisgIHN0cmNweShwcm9kdWN0X2lkLCIwMDAwIik7CisgIHN0cmNweShzdWJfcHJvZHVjdF9pZCwiMDAwMCIpOworICBzdHJjcHkoc3ViX3ZlbmRvcl9pZCwiMDAwMCIpOworCisgIC8qIGZvciBlYWNoIGxpbmUgd2UgZm91bmQgaW4gdGhlIG1vZHVsZXMucGNpbWFwICovCisgIHdoaWxlICggZmdldHMobGluZSwgc2l6ZW9mIGxpbmUsIGYpICkgeworICAgIC8qIHNraXBwaW5nIHVuZWNlc3NhcnkgbGluZXMgKi8KKyAgICBpZiAoKGxpbmVbMF0gPT0gJyMnKSB8fCAobGluZVswXSA9PSAnICcpIHx8IChsaW5lWzBdID09IDEwKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICBjaGFyICpyZXN1bHQgPSBOVUxMOworICAgIGludCBmaWVsZD0wOworCisgICAgLyogbG9va2luZyBmb3IgdGhlIG5leHQgZmllbGQgKi8KKyAgICByZXN1bHQgPSBzdHJ0b2sobGluZSwgZGVsaW1zKTsKKyAgICB3aGlsZSggcmVzdWx0ICE9IE5VTEwgKSB7CisgICAgICAgLyogaWYgdGhlIGNvbHVtbiBpcyBsYXJnZXIgdGhhbiAxIGNoYXIgKi8KKyAgICAgICAvKiBtdWx0aXBsZSBzcGFjZXMgZ2VuZXJhdGVzIHNvbWUgZW1wdHkgZmllbGRzICovCisgICAgICAgaWYgKHN0cmxlbihyZXN1bHQpPjEpIHsKKwkgc3dpdGNoIChmaWVsZCkgeworCSAvKiBBYm91dCBjYXNlIDAsIHRoZSBrZXJuZWwgbW9kdWxlIG5hbWUgaXMgZmVhdHVyaW5nICdfJyBvciAnLScgCisJICAqIGluIHRoZSBtb2R1bGUgbmFtZSB3aGVyZWFzIG1vZHVsZXMuYWxpYXMgaXMgb25seSB1c2luZyAnXycuCisJICAqIFRvIGF2b2lkIGtlcm5lbCBtb2R1bGVzIGR1cGxpY2F0aW9uLCBsZXQncyByZW5hbWUgYWxsICctJyBpbiAnXycgCisJICAqIHRvIG1hdGNoIHdoYXQgbW9kdWxlcy5hbGlhcyBwcm92aWRlcyAqLworCSBjYXNlIDA6Y2hycmVwbGFjZShyZXN1bHQsJy0nLCdfJyk7c3RyY3B5KG1vZHVsZV9uYW1lLHJlc3VsdCk7IGJyZWFrOworCSBjYXNlIDE6c3RyY3B5KHZlbmRvcl9pZCxyZXN1bHQpOyBicmVhazsKKwkgY2FzZSAyOnN0cmNweShwcm9kdWN0X2lkLHJlc3VsdCk7IGJyZWFrOworCSBjYXNlIDM6c3RyY3B5KHN1Yl92ZW5kb3JfaWQscmVzdWx0KTsgYnJlYWs7CisJIGNhc2UgNDpzdHJjcHkoc3ViX3Byb2R1Y3RfaWQscmVzdWx0KTsgYnJlYWs7CisJIH0KKwkgZmllbGQrKzsKKyAgICAgICB9CisgICAgICAgLyogU2VhcmNoaW5nIHRoZSBuZXh0IGZpZWxkICovCisgICAgICAgcmVzdWx0ID0gc3RydG9rKCBOVUxMLCBkZWxpbXMgKTsKKyAgIH0KKyAgICBpbnQgaW50X3ZlbmRvcl9pZD1oZXhfdG9faW50KHZlbmRvcl9pZCk7CisgICAgaW50IGludF9zdWJfdmVuZG9yX2lkPWhleF90b19pbnQoc3ViX3ZlbmRvcl9pZCk7CisgICAgaW50IGludF9wcm9kdWN0X2lkPWhleF90b19pbnQocHJvZHVjdF9pZCk7CisgICAgaW50IGludF9zdWJfcHJvZHVjdF9pZD1oZXhfdG9faW50KHN1Yl9wcm9kdWN0X2lkKTsKKyAgICAvKiBpZiBhIHBjaV9kZXZpY2UgbWF0Y2hlcyBhbiBlbnRyeSwgZmlsbCB0aGUgbGludXhfa2VybmVsX21vZHVsZSB3aXRoCisgICAgICAgdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBtb2R1bGUgKi8KKyAgICBmb3JfZWFjaF9wY2lfZnVuYyhkZXYsIGRvbWFpbikgeworICAgICAgaWYgKGludF92ZW5kb3JfaWQgPT0gZGV2LT52ZW5kb3IgJiYKKwkgIGludF9wcm9kdWN0X2lkID09IGRldi0+cHJvZHVjdCAmJgorCSAgKGludF9zdWJfcHJvZHVjdF9pZCAmIGRldi0+c3ViX3Byb2R1Y3QpCisJICA9PSBkZXYtPnN1Yl9wcm9kdWN0ICYmCisJICAoaW50X3N1Yl92ZW5kb3JfaWQgJiBkZXYtPnN1Yl92ZW5kb3IpCisJICA9PSBkZXYtPnN1Yl92ZW5kb3IpIHsKKwkgICAgICBib29sIGZvdW5kPWZhbHNlOworCisJICAgICAgLyogU2NhbiBhbGwga25vd24ga2VybmVsIG1vZHVsZXMgZm9yIHRoaXMgcGNpIGRldmljZSAqLworCSAgICAgIGZvciAoaW50IGk9MDsgaTxkZXYtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50OyBpKyspIHsKKworICAgICAgIAkgICAgICAvKiBUcnkgdG8gZGV0ZWN0IGlmIHdlIGFscmVhZHkga25ldyB0aGUgc2FtZSBrZXJuZWwgbW9kdWxlKi8KKwkgICAgICAgaWYgKHN0cnN0cihkZXYtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlW2ldLCBtb2R1bGVfbmFtZSkpIHsKKwkJICAgICAgZm91bmQ9dHJ1ZTsKKwkJICAgICAgYnJlYWs7CisJICAgICAgIH0KKwkgICAgICB9CisJICAgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIGtlcm5lbCBtb2R1bGUsIGxldCdzIGFkZCBpdCAqLworCSAgICAgIGlmICghZm91bmQpIHsKKwkJc3RyY3B5KGRldi0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVbZGV2LT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudF0sIG1vZHVsZV9uYW1lKTsKKwkJZGV2LT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudCsrOworCSAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZmNsb3NlKGYpOworICByZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIG1hdGNoIGFueSBwY2kgZGV2aWNlIHRvIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBuYW1lICovCisvKiBpdCB1c2VzIHRoZSBwY2kuaWRzIGZyb20gdGhlIGJvb3QgZGV2aWNlICovCitpbnQgZ2V0X2NsYXNzX25hbWVfZnJvbV9wY2lfaWRzKHN0cnVjdCBwY2lfZG9tYWluICpkb21haW4sIGNoYXIgKnBjaWlkc19wYXRoKQoreworICAgIGNoYXIgbGluZVtNQVhfTElORV07CisgICAgY2hhciBjbGFzc19uYW1lW1BDSV9DTEFTU19OQU1FX1NJWkVdOworICAgIGNoYXIgc3ViX2NsYXNzX25hbWVbUENJX0NMQVNTX05BTUVfU0laRV07CisgICAgY2hhciBjbGFzc19pZF9zdHJbNV07CisgICAgY2hhciBzdWJfY2xhc3NfaWRfc3RyWzVdOworICAgIEZJTEUgKmY7CisgICAgc3RydWN0IHBjaV9kZXZpY2UgKmRldjsKKyAgICBib29sIGNsYXNzX21vZGUgPSBmYWxzZTsKKworICAgIC8qIEludGlhbGl6aW5nIHRoZSB2ZW5kb3IvcHJvZHVjdCBuYW1lIGZvciBlYWNoIHBjaSBkZXZpY2UgdG8gInVua25vd24iICovCisgICAgLyogYWRkaW5nIGEgZGV2X2luZm8gbWVtYmVyIGlmIG5lZWRlZCAqLworICAgIGZvcl9lYWNoX3BjaV9mdW5jKGRldiwgZG9tYWluKSB7CisJLyogaW5pdGlhbGl6ZSB0aGUgZGV2X2luZm8gc3RydWN0dXJlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LiAqLworCWlmICghZGV2LT5kZXZfaW5mbykgeworCSAgICBkZXYtPmRldl9pbmZvID0gemFsbG9jKHNpemVvZiAqZGV2LT5kZXZfaW5mbyk7CisJICAgIGlmICghZGV2LT5kZXZfaW5mbykKKwkJcmV0dXJuIC0xOworCX0KKwlzdHJsY3B5KGRldi0+ZGV2X2luZm8tPmNsYXNzX25hbWUsICJ1bmtub3duIiwgNyk7CisgICAgfQorCisgICAgLyogT3BlbmluZyB0aGUgcGNpLmlkcyBmcm9tIHRoZSBib290IGRldmljZSAqLworICAgIGYgPSB6Zm9wZW4ocGNpaWRzX3BhdGgsICJyIik7CisgICAgaWYgKCFmKQorCXJldHVybiAtRU5PUENJSURTOworCisgICAgLyogZm9yIGVhY2ggbGluZSB3ZSBmb3VuZCBpbiB0aGUgcGNpLmlkcyAqLworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikpIHsKKwkvKiBTa2lwcGluZyB1bmNlc3NhcnkgbGluZXMgKi8KKwlpZiAoKGxpbmVbMF0gPT0gJyMnKSB8fCAobGluZVswXSA9PSAnICcpIHx8IChsaW5lWzBdID09IDEwKSkKKwkgICAgY29udGludWU7CisKKwkvKiBVbnRpbCB3ZSBmb3VuZCBhIGxpbmUgc3RhcnRpbmcgd2l0aCBhICdDJywgd2UgYXJlIG5vdCBwYXJzaW5nIGNsYXNzZXMgKi8KKwlpZiAobGluZVswXSA9PSAnQycpCisJICAgIGNsYXNzX21vZGUgPSB0cnVlOworCWlmIChjbGFzc19tb2RlID09IGZhbHNlKQorCSAgICBjb250aW51ZTsKKwlzdHJsY3B5KGNsYXNzX25hbWUsICJ1bmtub3duIiwgNyk7CisJLyogSWYgdGhlIGxpbmUgZG9lc24ndCBzdGFydCB3aXRoIGEgdGFiLCBpdCBtZWFucyB0aGF0J3MgYSBjbGFzcyBuYW1lICovCisJaWYgKGxpbmVbMF0gIT0gJ1x0JykgeworCisJICAgIC8qIGlnbm9yZSB0aGUgdHdvIGZpcnN0IGNoYXIgYW5kIHRoZW4gY29weSAyIGNoYXJzIChjbGFzcyBpZCkgKi8KKwkgICAgc3RybGNweShjbGFzc19pZF9zdHIsICZsaW5lWzJdLCAyKTsKKwkgICAgY2xhc3NfaWRfc3RyWzJdID0gMDsKKworCSAgICAvKiB0aGUgY2xhc3MgbmFtZSBpcyB0aGUgbmV4dCBmaWVsZCAqLworCSAgICBzdHJsY3B5KGNsYXNzX25hbWUsIHNraXBzcGFjZShzdHJzdHIobGluZSwgIiAiKSksCisJCSAgICBQQ0lfQ0xBU1NfTkFNRV9TSVpFIC0gMSk7CisJICAgIHJlbW92ZV9lb2woY2xhc3NfbmFtZSk7CisKKwkgICAgaW50IGludF9jbGFzc19pZF9zdHIgPSBoZXhfdG9faW50KGNsYXNzX2lkX3N0cik7CisJICAgIC8qIGFzc2lnbiB0aGUgY2xhc3NfbmFtZSB0byBhbnkgbWF0Y2hpbmcgcGNpIGRldmljZSAqLworCSAgICBmb3JfZWFjaF9wY2lfZnVuYyhkZXYsIGRvbWFpbikgeworCQlpZiAoaW50X2NsYXNzX2lkX3N0ciA9PSBkZXYtPmNsYXNzWzJdKSB7CisJCSAgICBzdHJsY3B5KGRldi0+ZGV2X2luZm8tPmNsYXNzX25hbWUsIGNsYXNzX25hbWUsCisJCQkgICAgUENJX0NMQVNTX05BTUVfU0laRSAtIDEpOworCQkgICAgLyogVGhpcyB2YWx1ZSBpcyB1c3VhbGx5IHRoZSBtYWluIGNhdGVnb3J5ICovCisJCSAgICBzdHJsY3B5KGRldi0+ZGV2X2luZm8tPmNhdGVnb3J5X25hbWUsIGNsYXNzX25hbWUgKyA0LAorCQkJICAgIFBDSV9DTEFTU19OQU1FX1NJWkUgLSAxKTsKKwkJfQorCSAgICB9CisJICAgIC8qIGlmIHdlIGhhdmUgYSB0YWIgKyBhIGNoYXIsIGl0IG1lYW5zIHRoaXMgaXMgYSBzdWIgY2xhc3MgbmFtZSAqLworCX0gZWxzZSBpZiAoKGxpbmVbMF0gPT0gJ1x0JykgJiYgKGxpbmVbMV0gIT0gJ1x0JykpIHsKKworCSAgICAvKiB0aGUgc3ViIGNsYXNzIG5hbWUgdGhlIHNlY29uZCBmaWVsZCAqLworCSAgICBzdHJsY3B5KHN1Yl9jbGFzc19uYW1lLCBza2lwc3BhY2Uoc3Ryc3RyKGxpbmUsICIgIikpLAorCQkgICAgUENJX0NMQVNTX05BTUVfU0laRSAtIDEpOworCSAgICByZW1vdmVfZW9sKHN1Yl9jbGFzc19uYW1lKTsKKworCSAgICAvKiB0aGUgc3ViIGNsYXNzIGlkIGlzIGZpcnN0IGZpZWxkICovCisJICAgIHN0cmxjcHkoc3ViX2NsYXNzX2lkX3N0ciwgJmxpbmVbMV0sIDIpOworCSAgICBzdWJfY2xhc3NfaWRfc3RyWzJdID0gMDsKKworCSAgICBpbnQgaW50X2NsYXNzX2lkX3N0ciA9IGhleF90b19pbnQoY2xhc3NfaWRfc3RyKTsKKwkgICAgaW50IGludF9zdWJfY2xhc3NfaWRfc3RyID0gaGV4X3RvX2ludChzdWJfY2xhc3NfaWRfc3RyKTsKKwkgICAgLyogYXNzaWduIHRoZSBwcm9kdWN0X25hbWUgdG8gYW55IG1hdGNoaW5nIHBjaSBkZXZpY2UgKi8KKwkgICAgZm9yX2VhY2hfcGNpX2Z1bmMoZGV2LCBkb21haW4pIHsKKwkJaWYgKGludF9jbGFzc19pZF9zdHIgPT0gZGV2LT5jbGFzc1syXSAmJgorCQkgICAgaW50X3N1Yl9jbGFzc19pZF9zdHIgPT0gZGV2LT5jbGFzc1sxXSkKKwkJICAgIHN0cmxjcHkoZGV2LT5kZXZfaW5mby0+Y2xhc3NfbmFtZSwgc3ViX2NsYXNzX25hbWUsCisJCQkgICAgUENJX0NMQVNTX05BTUVfU0laRSAtIDEpOworCSAgICB9CisKKwl9CisgICAgfQorICAgIGZjbG9zZShmKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIG1hdGNoIGFueSBwY2kgZGV2aWNlIHRvIHRoZSBhcHByb3ByaWF0ZSB2ZW5kb3IgYW5kIHByb2R1Y3QgbmFtZSAqLworLyogaXQgdXNlcyB0aGUgcGNpLmlkcyBmcm9tIHRoZSBib290IGRldmljZSAqLworaW50IGdldF9uYW1lX2Zyb21fcGNpX2lkcyhzdHJ1Y3QgcGNpX2RvbWFpbiAqZG9tYWluLCBjaGFyICpwY2lpZHNfcGF0aCkKK3sKKyAgICBjaGFyIGxpbmVbTUFYX0xJTkVdOworICAgIGNoYXIgdmVuZG9yW1BDSV9WRU5ET1JfTkFNRV9TSVpFXTsKKyAgICBjaGFyIHZlbmRvcl9pZFs1XTsKKyAgICBjaGFyIHByb2R1Y3RbUENJX1BST0RVQ1RfTkFNRV9TSVpFXTsKKyAgICBjaGFyIHByb2R1Y3RfaWRbNV07CisgICAgY2hhciBzdWJfcHJvZHVjdF9pZFs1XTsKKyAgICBjaGFyIHN1Yl92ZW5kb3JfaWRbNV07CisgICAgRklMRSAqZjsKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSAqZGV2OworICAgIGJvb2wgc2tpcF90b19uZXh0X3ZlbmRvciA9IGZhbHNlOworICAgIHVpbnQxNl90IGludF92ZW5kb3JfaWQ7CisgICAgdWludDE2X3QgaW50X3Byb2R1Y3RfaWQ7CisgICAgdWludDE2X3QgaW50X3N1Yl9wcm9kdWN0X2lkOworICAgIHVpbnQxNl90IGludF9zdWJfdmVuZG9yX2lkOworCisgICAgLyogSW50aWFsaXppbmcgdGhlIHZlbmRvci9wcm9kdWN0IG5hbWUgZm9yIGVhY2ggcGNpIGRldmljZSB0byAidW5rbm93biIgKi8KKyAgICAvKiBhZGRpbmcgYSBkZXZfaW5mbyBtZW1iZXIgaWYgbmVlZGVkICovCisgICAgZm9yX2VhY2hfcGNpX2Z1bmMoZGV2LCBkb21haW4pIHsKKwkvKiBpbml0aWFsaXplIHRoZSBkZXZfaW5mbyBzdHJ1Y3R1cmUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuICovCisJaWYgKCFkZXYtPmRldl9pbmZvKSB7CisJICAgIGRldi0+ZGV2X2luZm8gPSB6YWxsb2Moc2l6ZW9mICpkZXYtPmRldl9pbmZvKTsKKwkgICAgaWYgKCFkZXYtPmRldl9pbmZvKQorCQlyZXR1cm4gLTE7CisJfQorCXN0cmxjcHkoZGV2LT5kZXZfaW5mby0+dmVuZG9yX25hbWUsICJ1bmtub3duIiwgNyk7CisJc3RybGNweShkZXYtPmRldl9pbmZvLT5wcm9kdWN0X25hbWUsICJ1bmtub3duIiwgNyk7CisgICAgfQorCisgICAgLyogT3BlbmluZyB0aGUgcGNpLmlkcyBmcm9tIHRoZSBib290IGRldmljZSAqLworICAgIGYgPSB6Zm9wZW4ocGNpaWRzX3BhdGgsICJyIik7CisgICAgaWYgKCFmKQorCXJldHVybiAtRU5PUENJSURTOworCisgICAgc3RybGNweSh2ZW5kb3JfaWQsICIwMDAwIiwgNCk7CisgICAgc3RybGNweShwcm9kdWN0X2lkLCAiMDAwMCIsIDQpOworICAgIHN0cmxjcHkoc3ViX3Byb2R1Y3RfaWQsICIwMDAwIiwgNCk7CisgICAgc3RybGNweShzdWJfdmVuZG9yX2lkLCAiMDAwMCIsIDQpOworCisgICAgLyogZm9yIGVhY2ggbGluZSB3ZSBmb3VuZCBpbiB0aGUgcGNpLmlkcyAqLworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikpIHsKKwkvKiBTa2lwcGluZyB1bmNlc3NhcnkgbGluZXMgKi8KKwlpZiAoKGxpbmVbMF0gPT0gJyMnKSB8fCAobGluZVswXSA9PSAnICcpIHx8IChsaW5lWzBdID09ICdDJykgfHwKKwkgICAgKGxpbmVbMF0gPT0gMTApKQorCSAgICBjb250aW51ZTsKKworCS8qIElmIHRoZSBsaW5lIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHRhYiwgaXQgbWVhbnMgdGhhdCdzIGEgdmVuZG9yIGlkICovCisJaWYgKGxpbmVbMF0gIT0gJ1x0JykgeworCisJICAgIC8qIHRoZSA0IGZpcnN0IGNoYXJzIGFyZSB0aGUgdmVuZG9yX2lkICovCisJICAgIHN0cmxjcHkodmVuZG9yX2lkLCBsaW5lLCA0KTsKKworCSAgICAvKiB0aGUgdmVuZG9yIG5hbWUgaXMgdGhlIG5leHQgZmllbGQgKi8KKwkgICAgdmVuZG9yX2lkWzRdID0gMDsKKwkgICAgc3RybGNweSh2ZW5kb3IsIHNraXBzcGFjZShzdHJzdHIobGluZSwgIiAiKSksCisJCSAgICBQQ0lfVkVORE9SX05BTUVfU0laRSAtIDEpOworCisJICAgIHJlbW92ZV9lb2wodmVuZG9yKTsKKwkgICAgLyogaW5pdCBwcm9kdWN0X2lkLCBzdWJfcHJvZHVjdCBhbmQgc3ViX3ZlbmRvciAqLworCSAgICBzdHJsY3B5KHByb2R1Y3RfaWQsICIwMDAwIiwgNCk7CisJICAgIHN0cmxjcHkoc3ViX3Byb2R1Y3RfaWQsICIwMDAwIiwgNCk7CisJICAgIHN0cmxjcHkoc3ViX3ZlbmRvcl9pZCwgIjAwMDAiLCA0KTsKKworCSAgICAvKiBVbmxlc3Mgd2UgZm91bmQgYSBtYXRjaGluZyBkZXZpY2UsIHdlIGhhdmUgdG8gc2tpcCB0byB0aGUgbmV4dCB2ZW5kb3IgKi8KKwkgICAgc2tpcF90b19uZXh0X3ZlbmRvciA9IHRydWU7CisKKwkgICAgaW50X3ZlbmRvcl9pZCA9IGhleF90b19pbnQodmVuZG9yX2lkKTsKKwkgICAgLyogSXRlcmF0ZSBpbiBhbGwgcGNpIGRldmljZXMgdG8gZmluZCBhIG1hdGNoaW5nIHZlbmRvciAqLworCSAgICBmb3JfZWFjaF9wY2lfZnVuYyhkZXYsIGRvbWFpbikgeworCQkvKiBpZiBvbmUgZGV2aWNlIHRoYXQgbWF0Y2ggdGhpcyB2ZW5kb3IgKi8KKwkJaWYgKGludF92ZW5kb3JfaWQgPT0gZGV2LT52ZW5kb3IpIHsKKwkJICAgIC8qIGNvcHkgdGhlIHZlbmRvciBuYW1lIGZvciB0aGlzIGRldmljZSAqLworCQkgICAgc3RybGNweShkZXYtPmRldl9pbmZvLT52ZW5kb3JfbmFtZSwgdmVuZG9yLAorCQkJICAgIFBDSV9WRU5ET1JfTkFNRV9TSVpFIC0gMSk7CisJCSAgICAvKiBTb21lIHBjaSBkZXZpY2VzIG1hdGNoIHRoaXMgdmVuZG9yLCBzbyB3ZSBoYXZlIHRvIGZvdW5kIHRoZW0gKi8KKwkJICAgIHNraXBfdG9fbmV4dF92ZW5kb3IgPSBmYWxzZTsKKwkJICAgIC8qIExldCdzIGxvb3Agb24gdGhlIG90aGVyIGRldmljZXMgYXMgc29tZSBtYXkgaGF2ZSB0aGUgc2FtZSB2ZW5kb3IgKi8KKwkJfQorCSAgICB9CisJICAgIC8qIGlmIHdlIGhhdmUgYSB0YWIgKyBhIGNoYXIsIGl0IG1lYW5zIHRoaXMgaXMgYSBwcm9kdWN0IGlkCisJICAgICAqIGJ1dCB3ZSBvbmx5IGxvb2sgYXQgaXQgaWYgd2Ugb3duIHNvbWUgcGNpIGRldmljZXMgb2YgdGhlIGN1cnJlbnQgdmVuZG9yKi8KKwl9IGVsc2UgaWYgKChsaW5lWzBdID09ICdcdCcpICYmIChsaW5lWzFdICE9ICdcdCcpCisJCSAgICYmIChza2lwX3RvX25leHRfdmVuZG9yID09IGZhbHNlKSkgeworCisJICAgIC8qIHRoZSBwcm9kdWN0IG5hbWUgdGhlIHNlY29uZCBmaWVsZCAqLworCSAgICBzdHJsY3B5KHByb2R1Y3QsIHNraXBzcGFjZShzdHJzdHIobGluZSwgIiAiKSksCisJCSAgICBQQ0lfUFJPRFVDVF9OQU1FX1NJWkUgLSAxKTsKKwkgICAgcmVtb3ZlX2VvbChwcm9kdWN0KTsKKworCSAgICAvKiB0aGUgcHJvZHVjdCBpZCBpcyBmaXJzdCBmaWVsZCAqLworCSAgICBzdHJsY3B5KHByb2R1Y3RfaWQsICZsaW5lWzFdLCA0KTsKKwkgICAgcHJvZHVjdF9pZFs0XSA9IDA7CisKKwkgICAgLyogaW5pdCBzdWJfcHJvZHVjdCBhbmQgc3ViX3ZlbmRvciAqLworCSAgICBzdHJsY3B5KHN1Yl9wcm9kdWN0X2lkLCAiMDAwMCIsIDQpOworCSAgICBzdHJsY3B5KHN1Yl92ZW5kb3JfaWQsICIwMDAwIiwgNCk7CisKKwkgICAgaW50X3ZlbmRvcl9pZCA9IGhleF90b19pbnQodmVuZG9yX2lkKTsKKwkgICAgaW50X3Byb2R1Y3RfaWQgPSBoZXhfdG9faW50KHByb2R1Y3RfaWQpOworCSAgICAvKiBhc3NpZ24gdGhlIHByb2R1Y3RfbmFtZSB0byBhbnkgbWF0Y2hpbmcgcGNpIGRldmljZSAqLworCSAgICBmb3JfZWFjaF9wY2lfZnVuYyhkZXYsIGRvbWFpbikgeworCQlpZiAoaW50X3ZlbmRvcl9pZCA9PSBkZXYtPnZlbmRvciAmJgorCQkgICAgaW50X3Byb2R1Y3RfaWQgPT0gZGV2LT5wcm9kdWN0KSB7CisJCSAgICBzdHJsY3B5KGRldi0+ZGV2X2luZm8tPnZlbmRvcl9uYW1lLCB2ZW5kb3IsCisJCQkgICAgUENJX1ZFTkRPUl9OQU1FX1NJWkUgLSAxKTsKKwkJICAgIHN0cmxjcHkoZGV2LT5kZXZfaW5mby0+cHJvZHVjdF9uYW1lLCBwcm9kdWN0LAorCQkJICAgIFBDSV9QUk9EVUNUX05BTUVfU0laRSAtIDEpOworCQl9CisJICAgIH0KKworCSAgICAvKiBpZiB3ZSBoYXZlIHR3byB0YWJzLCBpdCBtZWFucyB0aGlzIGlzIGEgc3ViIHByb2R1Y3QKKwkgICAgICogYnV0IHdlIG9ubHkgbG9vayBhdCBpdCBpZiB3ZSBvd24gc29tZSBwY2kgZGV2aWNlcyBvZiB0aGUgY3VycmVudCB2ZW5kb3IqLworCX0gZWxzZSBpZiAoKGxpbmVbMF0gPT0gJ1x0JykgJiYgKGxpbmVbMV0gPT0gJ1x0JykKKwkJICAgJiYgKHNraXBfdG9fbmV4dF92ZW5kb3IgPT0gZmFsc2UpKSB7CisKKwkgICAgLyogdGhlIHByb2R1Y3QgbmFtZSBpcyBsYXN0IGZpZWxkICovCisJICAgIHN0cmxjcHkocHJvZHVjdCwgc2tpcHNwYWNlKHN0cnN0cihsaW5lLCAiICIpKSwKKwkJICAgIFBDSV9QUk9EVUNUX05BTUVfU0laRSAtIDEpOworCSAgICBzdHJsY3B5KHByb2R1Y3QsIHNraXBzcGFjZShzdHJzdHIocHJvZHVjdCwgIiAiKSksCisJCSAgICBQQ0lfUFJPRFVDVF9OQU1FX1NJWkUgLSAxKTsKKwkgICAgcmVtb3ZlX2VvbChwcm9kdWN0KTsKKworCSAgICAvKiB0aGUgc3ViX3ZlbmRvciBpZCBpcyBmaXJzdCBmaWVsZCAqLworCSAgICBzdHJsY3B5KHN1Yl92ZW5kb3JfaWQsICZsaW5lWzJdLCA0KTsKKwkgICAgc3ViX3ZlbmRvcl9pZFs0XSA9IDA7CisKKwkgICAgLyogdGhlIHN1Yl92ZW5kb3IgaWQgaXMgc2Vjb25kIGZpZWxkICovCisJICAgIHN0cmxjcHkoc3ViX3Byb2R1Y3RfaWQsICZsaW5lWzddLCA0KTsKKwkgICAgc3ViX3Byb2R1Y3RfaWRbNF0gPSAwOworCisJICAgIGludF92ZW5kb3JfaWQgPSBoZXhfdG9faW50KHZlbmRvcl9pZCk7CisJICAgIGludF9zdWJfdmVuZG9yX2lkID0gaGV4X3RvX2ludChzdWJfdmVuZG9yX2lkKTsKKwkgICAgaW50X3Byb2R1Y3RfaWQgPSBoZXhfdG9faW50KHByb2R1Y3RfaWQpOworCSAgICBpbnRfc3ViX3Byb2R1Y3RfaWQgPSBoZXhfdG9faW50KHN1Yl9wcm9kdWN0X2lkKTsKKwkgICAgLyogYXNzaWduIHRoZSBwcm9kdWN0X25hbWUgdG8gYW55IG1hdGNoaW5nIHBjaSBkZXZpY2UgKi8KKwkgICAgZm9yX2VhY2hfcGNpX2Z1bmMoZGV2LCBkb21haW4pIHsKKwkJaWYgKGludF92ZW5kb3JfaWQgPT0gZGV2LT52ZW5kb3IgJiYKKwkJICAgIGludF9wcm9kdWN0X2lkID09IGRldi0+cHJvZHVjdCAmJgorCQkgICAgaW50X3N1Yl9wcm9kdWN0X2lkID09IGRldi0+c3ViX3Byb2R1Y3QgJiYKKwkJICAgIGludF9zdWJfdmVuZG9yX2lkID09IGRldi0+c3ViX3ZlbmRvcikgeworCQkgICAgc3RybGNweShkZXYtPmRldl9pbmZvLT52ZW5kb3JfbmFtZSwgdmVuZG9yLAorCQkJICAgIFBDSV9WRU5ET1JfTkFNRV9TSVpFIC0gMSk7CisJCSAgICBzdHJsY3B5KGRldi0+ZGV2X2luZm8tPnByb2R1Y3RfbmFtZSwgcHJvZHVjdCwKKwkJCSAgICBQQ0lfUFJPRFVDVF9OQU1FX1NJWkUgLSAxKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICBmY2xvc2UoZik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHNlYXJjaGluZyBpZiBhbnkgcGNpZGV2aWNlIG1hdGNoIG91ciBxdWVyeSAqLworc3RydWN0IG1hdGNoICpmaW5kX3BjaV9kZXZpY2UoY29uc3Qgc3RydWN0IHBjaV9kb21haW4gKmRvbWFpbiwKKwkJCSAgICAgIHN0cnVjdCBtYXRjaCAqbGlzdCkKK3sKKyAgICB1aW50MzJfdCBkaWQsIHNpZDsKKyAgICBzdHJ1Y3QgbWF0Y2ggKm07CisgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2UgKmRldjsKKworICAgIC8qIGZvciBhbGwgbWF0Y2hlcyB3ZSBoYXZlIHRvIHNlYXJjaCAqLworICAgIGZvciAobSA9IGxpc3Q7IG07IG0gPSBtLT5uZXh0KSB7CisJLyogZm9yIGVhY2ggcGNpIGRldmljZSB3ZSBrbm93ICovCisJZm9yX2VhY2hfcGNpX2Z1bmMoZGV2LCBkb21haW4pIHsKKwkgICAgLyogc2lkICYgZGlkIGFyZSB0aGUgZWFzaWVzdCB3YXkgdG8gY29tcGFyZSBkZXZpY2VzICovCisJICAgIC8qIHRoZXkgYXJlIG1hZGUgb2YgdmVuZG9yL3Byb2R1Y3Qgc3VidmVuZG9yL3N1YnByb2R1Y3QgaWRzICovCisJICAgIHNpZCA9IGRldi0+c3ZpZF9zZGlkOworCSAgICBkaWQgPSBkZXYtPnZpZF9kaWQ7CisJICAgIC8qIGlmIHRoZSBjdXJyZW50IGRldmljZSBtYXRjaCAqLworCSAgICBpZiAoKChkaWQgXiBtLT5kaWQpICYgbS0+ZGlkX21hc2spID09IDAgJiYKKwkJKChzaWQgXiBtLT5zaWQpICYgbS0+c2lkX21hc2spID09IDAgJiYKKwkJZGV2LT5yZXZpc2lvbiA+PSBtLT5yaWRfbWluICYmIGRldi0+cmV2aXNpb24gPD0gbS0+cmlkX21heCkgeworCQlkcHJpbnRmCisJCSAgICAoIlBDSSBNYXRjaDogVmVuZG9yPSUwNHggUHJvZHVjdD0lMDR4IFN1Yl92ZW5kb3I9JTA0eCBTdWJfUHJvZHVjdD0lMDR4IFJlbGVhc2U9JTAyeFxuIiwKKwkJICAgICBkZXYtPnZlbmRvciwgZGV2LT5wcm9kdWN0LCBkZXYtPnN1Yl92ZW5kb3IsCisJCSAgICAgZGV2LT5zdWJfcHJvZHVjdCwgZGV2LT5yZXZpc2lvbik7CisJCS8qIHJldHVybmluZyB0aGUgbWF0Y2hlZCBwY2kgZGV2aWNlICovCisJCXJldHVybiBtOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogc2Nhbm5pbmcgdGhlIHBjaSBidXMgdG8gZmluZCBwY2kgZGV2aWNlcyAqLworc3RydWN0IHBjaV9kb21haW4gKnBjaV9zY2FuKHZvaWQpCit7CisgICAgc3RydWN0IHBjaV9kb21haW4gKmRvbWFpbiA9IE5VTEw7CisgICAgc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CisgICAgc3RydWN0IHBjaV9zbG90ICpzbG90ID0gTlVMTDsKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSAqZnVuYyA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IG5idXMsIG5kZXYsIG5mdW5jLCBtYXhmdW5jOworICAgIHVpbnQzMl90IGRpZCwgc2lkLCByY2lkOworICAgIHVpbnQ4X3QgaGRydHlwZTsKKyAgICBwY2lhZGRyX3QgYTsKKyAgICBpbnQgY2ZndHlwZTsKKworICAgIGNmZ3R5cGUgPSBwY2lfc2V0X2NvbmZpZ190eXBlKFBDSV9DRkdfQVVUTyk7CisKKyAgICBkcHJpbnRmKCJQQ0kgY29uZmlndXJhdGlvbiB0eXBlICVkXG4iLCBjZmd0eXBlKTsKKworICAgIGlmIChjZmd0eXBlID09IFBDSV9DRkdfTk9ORSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGRwcmludGYoIlNjYW5uaW5nIFBDSSBCdXNlc1xuIik7CisKKyAgICBmb3IgKG5idXMgPSAwOyBuYnVzIDwgTUFYX1BDSV9CVVNFUzsgbmJ1cysrKSB7CisJZHByaW50ZigiUHJvYmluZyBidXMgMHglMDJ4Li4uIFxuIiwgbmJ1cyk7CisJYnVzID0gTlVMTDsKKworCWZvciAobmRldiA9IDA7IG5kZXYgPCBNQVhfUENJX0RFVklDRVM7IG5kZXYrKykgeworCSAgICBtYXhmdW5jID0gMTsJLyogQXNzdW1lIGEgc2luZ2xlLWZ1bmN0aW9uIGRldmljZSAqLworCSAgICBzbG90ID0gTlVMTDsKKworCSAgICBmb3IgKG5mdW5jID0gMDsgbmZ1bmMgPCBtYXhmdW5jOyBuZnVuYysrKSB7CisJCWEgPSBwY2lfbWthZGRyKG5idXMsIG5kZXYsIG5mdW5jLCAwKTsKKwkJZGlkID0gcGNpX3JlYWRsKGEpOworCisJCWlmIChkaWQgPT0gMHhmZmZmZmZmZiB8fCBkaWQgPT0gMHhmZmZmMDAwMCB8fAorCQkgICAgZGlkID09IDB4MDAwMGZmZmYgfHwgZGlkID09IDB4MDAwMDAwMDApCisJCSAgICBjb250aW51ZTsKKworCQloZHJ0eXBlID0gcGNpX3JlYWRiKGEgKyAweDBlKTsKKworCQlpZiAoaGRydHlwZSAmIDB4ODApCisJCSAgICBtYXhmdW5jID0gTUFYX1BDSV9GVU5DOwkvKiBNdWx0aWZ1bmN0aW9uIGRldmljZSAqLworCisJCXJjaWQgPSBwY2lfcmVhZGwoYSArIDB4MDgpOworCQlzaWQgPSBwY2lfcmVhZGwoYSArIDB4MmMpOworCisJCWlmICghZG9tYWluKSB7CisJCSAgICBkb21haW4gPSB6YWxsb2Moc2l6ZW9mICpkb21haW4pOworCQkgICAgaWYgKCFkb21haW4pCisJCQlnb3RvIGJhaWw7CisJCX0KKwkJaWYgKCFidXMpIHsKKwkJICAgIGJ1cyA9IHphbGxvYyhzaXplb2YgKmJ1cyk7CisJCSAgICBpZiAoIWJ1cykKKwkJCWdvdG8gYmFpbDsKKwkJICAgIGRvbWFpbi0+YnVzW25idXNdID0gYnVzOworCQl9CisJCWlmICghc2xvdCkgeworCQkgICAgc2xvdCA9IHphbGxvYyhzaXplb2YgKnNsb3QpOworCQkgICAgaWYgKCFzbG90KQorCQkJZ290byBiYWlsOworCQkgICAgYnVzLT5zbG90W25kZXZdID0gc2xvdDsKKwkJfQorCQlmdW5jID0gemFsbG9jKHNpemVvZiAqZnVuYyk7CisJCWlmICghZnVuYykKKwkJICAgIGdvdG8gYmFpbDsKKworCQlzbG90LT5mdW5jW25mdW5jXSA9IGZ1bmM7CisKKwkJZnVuYy0+dmlkX2RpZCA9IGRpZDsKKwkJZnVuYy0+c3ZpZF9zZGlkID0gc2lkOworCQlmdW5jLT5yaWRfY2xhc3MgPSByY2lkOworCisJCWRwcmludGYKKwkJICAgICgiU2Nhbm5pbmc6IEJVUyAlMDJ4IERJRCAlMDh4ICglMDR4OiUwNHgpIFNJRCAlMDh4IFJJRCAlMDJ4XG4iLAorCQkgICAgIG5idXMsIGRpZCwgZGlkID4+IDE2LCAoZGlkIDw8IDE2KSA+PiAxNiwgc2lkLCByY2lkICYgMHhmZik7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIGRvbWFpbjsKKworYmFpbDoKKyAgICBmcmVlX3BjaV9kb21haW4oZG9tYWluKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogZ2F0aGVyaW5nIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiovCit2b2lkIGdhdGhlcl9hZGRpdGlvbmFsX3BjaV9jb25maWcoc3RydWN0IHBjaV9kb21haW4gKmRvbWFpbikKK3sKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSAqZGV2OworICAgIHBjaWFkZHJfdCBwY2lfYWRkcjsKKyAgICBpbnQgY2ZndHlwZTsKKworICAgIGNmZ3R5cGUgPSBwY2lfc2V0X2NvbmZpZ190eXBlKFBDSV9DRkdfQVVUTyk7CisgICAgaWYgKGNmZ3R5cGUgPT0gUENJX0NGR19OT05FKQorCXJldHVybjsKKworICAgIGZvcl9lYWNoX3BjaV9mdW5jMyhkZXYsIGRvbWFpbiwgcGNpX2FkZHIpIHsKKwlpZiAoIWRldi0+ZGV2X2luZm8pIHsKKwkgICAgZGV2LT5kZXZfaW5mbyA9IHphbGxvYyhzaXplb2YgKmRldi0+ZGV2X2luZm8pOworCSAgICBpZiAoIWRldi0+ZGV2X2luZm8pIHsKKwkJcmV0dXJuOworCSAgICB9CisJfQorCWRldi0+ZGV2X2luZm8tPmlycSA9IHBjaV9yZWFkYihwY2lfYWRkciArIDB4M2MpOworCWRldi0+ZGV2X2luZm8tPmxhdGVuY3kgPSBwY2lfcmVhZGIocGNpX2FkZHIgKyAweDBkKTsKKyAgICB9Cit9CisKK3ZvaWQgZnJlZV9wY2lfZG9tYWluKHN0cnVjdCBwY2lfZG9tYWluICpkb21haW4pCit7CisgICAgc3RydWN0IHBjaV9idXMgKmJ1czsKKyAgICBzdHJ1Y3QgcGNpX3Nsb3QgKnNsb3Q7CisgICAgc3RydWN0IHBjaV9kZXZpY2UgKmZ1bmM7CisgICAgdW5zaWduZWQgaW50IG5idXMsIG5kZXYsIG5mdW5jOworCisgICAgaWYgKGRvbWFpbikgeworCWZvciAobmJ1cyA9IDA7IG5idXMgPCBNQVhfUENJX0JVU0VTOyBuYnVzKyspIHsKKwkgICAgYnVzID0gZG9tYWluLT5idXNbbmJ1c107CisJICAgIGlmIChidXMpIHsKKwkJZm9yIChuZGV2ID0gMDsgbmRldiA8IE1BWF9QQ0lfREVWSUNFUzsgbmRldisrKSB7CisJCSAgICBzbG90ID0gYnVzLT5zbG90W25kZXZdOworCQkgICAgaWYgKHNsb3QpIHsKKwkJCWZvciAobmZ1bmMgPSAwOyBuZnVuYyA8IE1BWF9QQ0lfRlVOQzsgbmZ1bmMrKykgeworCQkJICAgIGZ1bmMgPSBzbG90LT5mdW5jW25mdW5jXTsKKwkJCSAgICBpZiAoZnVuYykgeworCQkJCWlmIChmdW5jLT5kZXZfaW5mbykKKwkJCQkgICAgZnJlZShmdW5jLT5kZXZfaW5mbyk7CisJCQkJZnJlZShmdW5jKTsKKwkJCSAgICB9CisJCQl9CisJCQlmcmVlKHNsb3QpOworCQkgICAgfQorCQl9CisJCWZyZWUoYnVzKTsKKwkgICAgfQorCX0KKwlmcmVlKGRvbWFpbik7CisgICAgfQorfQorCisvKiBUcnkgdG8gbWF0Y2ggYW55IHBjaSBkZXZpY2UgdG8gdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBtb2R1bGUgKi8KKy8qIGl0IHVzZXMgdGhlIG1vZHVsZXMuYWxpYXMgZnJvbSB0aGUgYm9vdCBkZXZpY2UgKi8KK2ludCBnZXRfbW9kdWxlX25hbWVfZnJvbV9hbGlhcyhzdHJ1Y3QgcGNpX2RvbWFpbiAqZG9tYWluLCBjaGFyICptb2R1bGVzX2FsaWFzX3BhdGgpCit7CisgIGNoYXIgbGluZVtNQVhfTElORV07CisgIGNoYXIgbW9kdWxlX25hbWVbMjFdOyAvLyB0aGUgbW9kdWxlIG5hbWUgZmllbGQgaXMgMjEgY2hhciBsb25nCisgIGNoYXIgZGVsaW1zW109IioiOyAgICAvLyBjb2x1bXMgYXJlIHNlcGFyYXRlZCBieSBzcGFjZXMKKyAgY2hhciB2ZW5kb3JfaWRbMTZdOworICBjaGFyIHByb2R1Y3RfaWRbMTZdOworICBjaGFyIHN1Yl92ZW5kb3JfaWRbMTZdOworICBjaGFyIHN1Yl9wcm9kdWN0X2lkWzE2XTsKKyAgRklMRSAqZjsKKyAgc3RydWN0IHBjaV9kZXZpY2UgKmRldj1OVUxMOworCisgIC8qIEludGlhbGl6aW5nIHRoZSBsaW51eF9rZXJuZWxfbW9kdWxlIGZvciBlYWNoIHBjaSBkZXZpY2UgdG8gInVua25vd24iICovCisgIC8qIGFkZGluZyBhIGRldl9pbmZvIG1lbWJlciBpZiBuZWVkZWQgKi8KKyAgZm9yX2VhY2hfcGNpX2Z1bmMoZGV2LCBkb21haW4pIHsKKyAgICAvKiBpbml0aWFsaXplIHRoZSBkZXZfaW5mbyBzdHJ1Y3R1cmUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuICovCisgICAgaWYgKCEgZGV2LT5kZXZfaW5mbykgeworICAgICAgZGV2LT5kZXZfaW5mbyA9IHphbGxvYyhzaXplb2YgKmRldi0+ZGV2X2luZm8pOworICAgICAgaWYgKCFkZXYtPmRldl9pbmZvKQorCXJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChpbnQgaT0wO2k8TUFYX0tFUk5FTF9NT0RVTEVTX1BFUl9QQ0lfREVWSUNFO2krKykgeworICAgICBpZiAoc3RybGVuKGRldi0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVbaV0pPT0wKQorICAgICAgIHN0cmxjcHkoZGV2LT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZVtpXSwgInVua25vd24iLDcpOworICAgIH0KKyAgfQorCisgIC8qIE9wZW5pbmcgdGhlIG1vZHVsZXMucGNpbWFwIChvZiBhIGxpbnV4IGtlcm5lbCkgZnJvbSB0aGUgYm9vdCBkZXZpY2UgKi8KKyAgZj16Zm9wZW4obW9kdWxlc19hbGlhc19wYXRoLCAiciIpOworICBpZiAoIWYpCisgICAgcmV0dXJuIC1FTk9NT0RVTEVTQUxJQVM7CisKKyAgLyogZm9yIGVhY2ggbGluZSB3ZSBmb3VuZCBpbiB0aGUgbW9kdWxlcy5wY2ltYXAgKi8KKyAgd2hpbGUgKCBmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikgKSB7CisgICAgLyogc2tpcHBpbmcgdW5lY2Vzc2FyeSBsaW5lcyAqLworICAgIGlmICgobGluZVswXSA9PSAnIycpIHx8IChzdHJzdHIobGluZSwiYWxpYXMgcGNpOnYiKT09TlVMTCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgLyogUmVzZXR0aW5nIHRlbXAgYnVmZmVyKi8KKyAgICBtZW1zZXQobW9kdWxlX25hbWUsMCxzaXplb2YobW9kdWxlX25hbWUpKTsKKyAgICBtZW1zZXQodmVuZG9yX2lkLDAsc2l6ZW9mKHZlbmRvcl9pZCkpOworICAgIG1lbXNldChzdWJfdmVuZG9yX2lkLDAsc2l6ZW9mKHN1Yl92ZW5kb3JfaWQpKTsKKyAgICBtZW1zZXQocHJvZHVjdF9pZCwwLHNpemVvZihwcm9kdWN0X2lkKSk7CisgICAgbWVtc2V0KHN1Yl9wcm9kdWN0X2lkLDAsc2l6ZW9mKHN1Yl9wcm9kdWN0X2lkKSk7CisgICAgc3RyY3B5KHZlbmRvcl9pZCwiMDAwMCIpOworICAgIHN0cmNweShwcm9kdWN0X2lkLCIwMDAwIik7CisgICAgLyogZmZmZiB3aWxsIGJlIHVzZWQgdG8gbWF0Y2ggYW55IGRldmljZSBhcyBpbiBtb2R1bGVzLmFsaWFzCisgICAgICogYSBtaXNzaW5nIHN1YnZlbmRvci9wcm9kdWN0IGhhdmUgdG8gYmUgY29uc2lkZXJlZCBhcyAgMHhGRkZGKi8KKyAgICBzdHJjcHkoc3ViX3Byb2R1Y3RfaWQsImZmZmYiKTsKKyAgICBzdHJjcHkoc3ViX3ZlbmRvcl9pZCwiZmZmZiIpOworCisgICAgY2hhciAqcmVzdWx0ID0gTlVMTDsKKyAgICBpbnQgZmllbGQ9MDsKKworICAgIC8qIGxvb2tpbmcgZm9yIHRoZSBuZXh0IGZpZWxkICovCisgICAgcmVzdWx0ID0gc3RydG9rKGxpbmUrc3RybGVuKCJhbGlhcyBwY2k6diIpLCBkZWxpbXMpOworICAgIHdoaWxlKCByZXN1bHQgIT0gTlVMTCApIHsKKwlpZiAoZmllbGQ9PTApIHsKKworCQkvKiBTZWFyY2hpbmcgZm9yIHRoZSB2ZW5kb3Igc2VwYXJhdG9yKi8KKwkJY2hhciAqdGVtcCA9IHN0cnN0cihyZXN1bHQsImQiKTsKKwkJaWYgKHRlbXAgIT0gTlVMTCkgeworCQkJc3RybGNweSh2ZW5kb3JfaWQscmVzdWx0LHRlbXAtcmVzdWx0KTsKKwkJCXJlc3VsdCs9c3RybGVuKHZlbmRvcl9pZCkrMTsKKwkJfQorCisJCS8qIFNlYXJjaGluZyBmb3IgdGhlIHByb2R1Y3Qgc2VwYXJhdG9yKi8KKwkJdGVtcCA9IHN0cnN0cihyZXN1bHQsInN2Iik7CisJCWlmICh0ZW1wICE9IE5VTEwpIHsKKwkJCXN0cmxjcHkocHJvZHVjdF9pZCxyZXN1bHQsdGVtcC1yZXN1bHQpOworCQkJcmVzdWx0Kz1zdHJsZW4ocHJvZHVjdF9pZCkrMTsKKwkJfQorCisJCS8qIFNlYXJjaGluZyBmb3IgdGhlIHN1YiB2ZW5kb3Igc2VwYXJhdG9yKi8KKwkJdGVtcCA9IHN0cnN0cihyZXN1bHQsInNkIik7CisJCWlmICh0ZW1wICE9IE5VTEwpIHsKKwkJCXN0cmxjcHkoc3ViX3ZlbmRvcl9pZCxyZXN1bHQsdGVtcC1yZXN1bHQpOworCQkJcmVzdWx0Kz1zdHJsZW4oc3ViX3ZlbmRvcl9pZCkrMTsKKwkJfQorCisJCS8qIFNlYXJjaGluZyBmb3IgdGhlIHN1YiBwcm9kdWN0IHNlcGFyYXRvciovCisJCXRlbXAgPSBzdHJzdHIocmVzdWx0LCJiYyIpOworCQlpZiAodGVtcCAhPSBOVUxMKSB7CisJCQlzdHJsY3B5KHN1Yl9wcm9kdWN0X2lkLHJlc3VsdCx0ZW1wLXJlc3VsdCk7CisJCQlyZXN1bHQrPXN0cmxlbihzdWJfcHJvZHVjdF9pZCkrMTsKKwkJfQorCS8qIFRoYXQncyB0aGUgbW9kdWxlIG5hbWUgKi8KKwl9IGVsc2UgaWYgKChzdHJsZW4ocmVzdWx0KT4yKSAmJgorCQkJKHJlc3VsdFswXT09MHgyMCkpCisJCXN0cmNweShtb2R1bGVfbmFtZSxyZXN1bHQrMSk7CisJCS8qIFdlIGhhdmUgdG8gcmVwbGFjZSBcbiBieSBcMCovCisJCW1vZHVsZV9uYW1lW3N0cmxlbihtb2R1bGVfbmFtZSktMV09J1wwJzsKKwlmaWVsZCsrOworCisJLyogU2VhcmNoaW5nIHRoZSBuZXh0IGZpZWxkICovCisgICAgICAgIHJlc3VsdCA9IHN0cnRvayggTlVMTCwgZGVsaW1zICk7CisgICAgfQorCisgICAgLyogTm93IHdlIGhhdmUgZXh0cmFjdGVkIGluZm9ybWF0aW9ucyBmcm9tIHRoZSBtb2R1bGVzLmFsaWFzCisgICAgICogTGV0J3MgY29tcGFyZSBpdCB3aXRoIHRoZSBkZXZpY2VzIHdlIGtub3cqLworICAgIGludCBpbnRfdmVuZG9yX2lkPWhleF90b19pbnQodmVuZG9yX2lkKTsKKyAgICBpbnQgaW50X3N1Yl92ZW5kb3JfaWQ9aGV4X3RvX2ludChzdWJfdmVuZG9yX2lkKTsKKyAgICBpbnQgaW50X3Byb2R1Y3RfaWQ9aGV4X3RvX2ludChwcm9kdWN0X2lkKTsKKyAgICBpbnQgaW50X3N1Yl9wcm9kdWN0X2lkPWhleF90b19pbnQoc3ViX3Byb2R1Y3RfaWQpOworICAgIC8qIGlmIGEgcGNpX2RldmljZSBtYXRjaGVzIGFuIGVudHJ5LCBmaWxsIHRoZSBsaW51eF9rZXJuZWxfbW9kdWxlIHdpdGgKKyAgICAgICB0aGUgYXBwcm9wcmlhdGUga2VybmVsIG1vZHVsZSAqLworICAgIGZvcl9lYWNoX3BjaV9mdW5jKGRldiwgZG9tYWluKSB7CisgICAgICBpZiAoaW50X3ZlbmRvcl9pZCA9PSBkZXYtPnZlbmRvciAmJgorCSAgaW50X3Byb2R1Y3RfaWQgPT0gZGV2LT5wcm9kdWN0ICYmCisJICAoaW50X3N1Yl9wcm9kdWN0X2lkICYgZGV2LT5zdWJfcHJvZHVjdCkKKwkgID09IGRldi0+c3ViX3Byb2R1Y3QgJiYKKwkgIChpbnRfc3ViX3ZlbmRvcl9pZCAmIGRldi0+c3ViX3ZlbmRvcikKKwkgID09IGRldi0+c3ViX3ZlbmRvcikgeworCSAgICAgIGJvb2wgZm91bmQ9ZmFsc2U7CisJICAgICAgCisJICAgICAgLyogU2NhbiBhbGwga25vd24ga2VybmVsIG1vZHVsZXMgZm9yIHRoaXMgcGNpIGRldmljZSAqLworCSAgICAgIGZvciAoaW50IGk9MDsgaTxkZXYtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50OyBpKyspIHsKKworICAgICAgIAkgICAgICAvKiBUcnkgdG8gZGV0ZWN0IGlmIHdlIGFscmVhZHkga25ldyB0aGUgc2FtZSBrZXJuZWwgbW9kdWxlKi8KKwkgICAgICAgaWYgKHN0cnN0cihkZXYtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlW2ldLCBtb2R1bGVfbmFtZSkpIHsKKwkJICAgICAgZm91bmQ9dHJ1ZTsKKwkJICAgICAgYnJlYWs7CisJICAgICAgIH0KKwkgICAgICB9CisJICAgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIGtlcm5lbCBtb2R1bGUsIGxldCdzIGFkZCBpdCAqLworCSAgICAgIGlmICghZm91bmQpIHsKKwkJc3RyY3B5KGRldi0+ZGV2X2luZm8tPmxpbnV4X2tlcm5lbF9tb2R1bGVbZGV2LT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudF0sIG1vZHVsZV9uYW1lKTsKKwkJZGV2LT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudCsrOworCSAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZmNsb3NlKGYpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9wY2kvd3JpdGViLmMgYi9jb20zMi9saWIvcGNpL3dyaXRlYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWEyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvcGNpL3dyaXRlYi5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBUWVBFIHVpbnQ4X3QKKyNkZWZpbmUgQldMKHgpIHggIyMgYgorI2RlZmluZSBCSU9TQ0FMTCAweGIxMGIKKyNpbmNsdWRlICJwY2kvd3JpdGV4LmMiCmRpZmYgLS1naXQgYS9jb20zMi9saWIvcGNpL3dyaXRlbC5jIGIvY29tMzIvbGliL3BjaS93cml0ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjlmYzdiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3BjaS93cml0ZWwuYwpAQCAtMCwwICsxLDQgQEAKKyNkZWZpbmUgVFlQRSB1aW50MzJfdAorI2RlZmluZSBCV0woeCkgeCAjIyBsCisjZGVmaW5lIEJJT1NDQUxMIDB4YjEwZAorI2luY2x1ZGUgInBjaS93cml0ZXguYyIKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9wY2kvd3JpdGV3LmMgYi9jb20zMi9saWIvcGNpL3dyaXRldy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTk0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvcGNpL3dyaXRldy5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBUWVBFIHVpbnQxNl90CisjZGVmaW5lIEJXTCh4KSB4ICMjIHcKKyNkZWZpbmUgQklPU0NBTEwgMHhiMTBjCisjaW5jbHVkZSAicGNpL3dyaXRleC5jIgpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3BjaS93cml0ZXguYyBiL2NvbTMyL2xpYi9wY2kvd3JpdGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzYTFlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9wY2kvd3JpdGV4LmMKQEAgLTAsMCArMSw1MCBAQAorI2luY2x1ZGUgInBjaS9wY2kuaCIKKwordm9pZCBCV0wocGNpX3dyaXRlKShUWVBFIHYsIHBjaWFkZHJfdCBhKQoreworICAgIGZvciAoOzspIHsKKwlzd2l0Y2ggKF9fcGNpX2NmZ190eXBlKSB7CisJY2FzZSBQQ0lfQ0ZHX0FVVE86CisJICAgIHBjaV9zZXRfY29uZmlnX3R5cGUoUENJX0NGR19BVVRPKTsKKwkgICAgYnJlYWs7CQkvKiBUcnkgYWdhaW4gKi8KKworCWNhc2UgUENJX0NGR19UWVBFMToKKwkgICAgeworCQl1aW50MzJfdCBvbGRjZjg7CisJCWNsaSgpOworCQlvbGRjZjggPSBpbmwoMHhjZjgpOworCQlvdXRsKGEsIDB4Y2Y4KTsKKwkJQldMKG91dCkgKHYsIDB4Y2ZjICsgKGEgJiAzKSk7CisJCW91dGwob2xkY2Y4LCAweGNmOCk7CisJCXN0aSgpOworCSAgICB9CisJICAgIHJldHVybjsKKworCWNhc2UgUENJX0NGR19UWVBFMjoKKwkgICAgeworCQl1aW50OF90IG9sZGNmOCwgb2xkY2ZhOworCisJCWlmIChhICYgKDB4MTAgPDwgMTEpKQorCQkgICAgcmV0dXJuOwkvKiBEZXZpY2VzIDE2LTMxIG5vdCBzdXBwb3J0ZWQgKi8KKworCQljbGkoKTsKKwkJb2xkY2Y4ID0gaW5iKDB4Y2Y4KTsKKwkJb2xkY2ZhID0gaW5iKDB4Y2ZhKTsKKwkJb3V0YigweGYwICsgKChhID4+ICg4IC0gMSkpICYgMHgwZSksIDB4Y2Y4KTsKKwkJb3V0YihhID4+IDE2LCAweGNmYSk7CisJCUJXTChvdXQpICh2LCAweGMwMDAgKyAoKGEgPj4gKDExIC0gOCkpICYgMHhmMDApICsgKGEgJiAweGZmKSk7CisJCW91dGIob2xkY2Y4LCAweGNmOCk7CisJCW91dGIob2xkY2ZhLCAweGNmYSk7CisJCXN0aSgpOworCSAgICB9CisJICAgIHJldHVybjsKKworCWNhc2UgUENJX0NGR19CSU9TOgorCSAgICBfX3BjaV9yZWFkX3dyaXRlX2Jpb3MoQklPU0NBTEwsIHYsIGEpOworCSAgICByZXR1cm47CisKKwlkZWZhdWx0OgorCSAgICByZXR1cm47CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9wZXJyb3IuYyBiL2NvbTMyL2xpYi9wZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjIzYjkxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3BlcnJvci5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiBwZXJyb3IuYworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgcGVycm9yKGNvbnN0IGNoYXIgKnMpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgJWRcbiIsIHMsIGVycm5vKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9wcmludGYuYyBiL2NvbTMyL2xpYi9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmMyYjc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3ByaW50Zi5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgaW50IHJ2OworCisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgcnYgPSB2ZnByaW50ZihzdGRvdXQsIGZvcm1hdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3B1dGNoYXIuYyBiL2NvbTMyL2xpYi9wdXRjaGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5OTNhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9wdXRjaGFyLmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIHB1dGNoYXIuYworICoKKyAqIGdjYyAicHJpbnRmIGRlY29tcGlsYXRpb24iIGV4cGVjdHMgdGhpcyB0byBleGlzdC4uLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjdW5kZWYgcHV0Y2hhcgorCitpbnQgcHV0Y2hhcihpbnQgYykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGNoID0gYzsKKworICAgIHJldHVybiBfZndyaXRlKCZjaCwgMSwgc3Rkb3V0KSA9PSAxID8gY2ggOiBFT0Y7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvcHV0cy5jIGIvY29tMzIvbGliL3B1dHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI4NTQzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3B1dHMuYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogcHV0cy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBwdXRzKGNvbnN0IGNoYXIgKnMpCit7CisgICAgaWYgKGZwdXRzKHMsIHN0ZG91dCkgPCAwKQorCXJldHVybiAtMTsKKworICAgIHJldHVybiBfZndyaXRlKCJcbiIsIDEsIHN0ZG91dCk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvcXNvcnQuYyBiL2NvbTMyL2xpYi9xc29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDY0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvcXNvcnQuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogcXNvcnQuYworICoKKyAqIFRoaXMgaXMgYWN0dWFsbHkgY29tYnNvcnQuICBJdCdzIGFuIE8obiBsb2cgbikgYWxnb3JpdGhtIHdpdGgKKyAqIHNpbXBsaWNpdHkvc21hbGwgY29kZSBzaXplIGJlaW5nIGl0cyBtYWluIHZpcnR1ZS4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IG5ld2dhcChzaXplX3QgZ2FwKQoreworICAgIGdhcCA9IChnYXAgKiAxMCkgLyAxMzsKKyAgICBpZiAoZ2FwID09IDkgfHwgZ2FwID09IDEwKQorCWdhcCA9IDExOworCisgICAgaWYgKGdhcCA8IDEpCisJZ2FwID0gMTsKKyAgICByZXR1cm4gZ2FwOworfQorCit2b2lkIHFzb3J0KHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCisJICAgaW50ICgqY29tcGFyKSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKQoreworICAgIHNpemVfdCBnYXAgPSBubWVtYjsKKyAgICBzaXplX3QgaSwgajsKKyAgICBjaGFyICpwMSwgKnAyOworICAgIGludCBzd2FwcGVkOworCisgICAgaWYgKCFubWVtYikKKwlyZXR1cm47CisKKyAgICBkbyB7CisJZ2FwID0gbmV3Z2FwKGdhcCk7CisJc3dhcHBlZCA9IDA7CisKKwlmb3IgKGkgPSAwLCBwMSA9IGJhc2U7IGkgPCBubWVtYiAtIGdhcDsgaSsrLCBwMSArPSBzaXplKSB7CisJICAgIGogPSBpICsgZ2FwOworCSAgICBpZiAoY29tcGFyKHAxLCBwMiA9IChjaGFyICopYmFzZSArIGogKiBzaXplKSA+IDApIHsKKwkJbWVtc3dhcChwMSwgcDIsIHNpemUpOworCQlzd2FwcGVkID0gMTsKKwkgICAgfQorCX0KKyAgICB9IHdoaWxlIChnYXAgPiAxIHx8IHN3YXBwZWQpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3NlZWQ0OC5jIGIvY29tMzIvbGliL3NlZWQ0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjI4YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc2VlZDQ4LmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIHNlZWQ0OC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gdW5zaWduZWQgc2hvcnQgX19yYW5kNDhfc2VlZFszXTsKKwordW5zaWduZWQgc2hvcnQgKnNlZWQ0OChjb25zdCB1bnNpZ25lZCBzaG9ydCB4c3ViaVszXSkKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgc2hvcnQgb2xkc2VlZFszXTsKKyAgICBtZW1jcHkob2xkc2VlZCwgX19yYW5kNDhfc2VlZCwgc2l6ZW9mIF9fcmFuZDQ4X3NlZWQpOworICAgIG1lbWNweShfX3JhbmQ0OF9zZWVkLCB4c3ViaSwgc2l6ZW9mIF9fcmFuZDQ4X3NlZWQpOworCisgICAgcmV0dXJuIG9sZHNlZWQ7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc2V0am1wLlMgYi9jb20zMi9saWIvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiNWMyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zZXRqbXAuUwpAQCAtMCwwICsxLDcyIEBACisvKgorICogYXJjaC9pMzg2L3NldGptcC5TCisgKgorICogc2V0am1wL2xvbmdqbXAgZm9yIHRoZSBpMzg2IGFyY2hpdGVjdHVyZQorICoKKyAqCisgKgorICogVGhlIGptcF9idWYgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBmb2xsb3dpbmcsIGluIG9yZGVyOgorICoJJWVieAorICoJJWVzcAorICoJJWVicAorICoJJWVzaQorICoJJWVkaQorICoJPHJldHVybiBhZGRyZXNzPgorICovCisvKgorCS50ZXh0CisJLmFsaWduIDQKKworCS5nbG9ibCBfc2V0am1wCisJLnR5cGUgX3NldGptcCwgQGZ1bmN0aW9uCitfc2V0am1wOgkJCQkjIGdjYyA0LjAuMSB3YW50cyB0aGlzIGFzIGFuIGFsaWFzPworCisJLmdsb2JsIHNldGptcAorCS50eXBlIHNldGptcCwgQGZ1bmN0aW9uCitzZXRqbXA6CisjaWZkZWYgUkVHUEFSTQorCW1vdmwgJWVheCwlZWR4CisjZWxzZQorCW1vdmwgNCglZXNwKSwlZWR4CisjZW5kaWYKKwlwb3BsICVlY3gJCQkjIFJldHVybiBhZGRyZXNzLCBhbmQgYWRqdXN0IHRoZSBzdGFjaworCXhvcmwgJWVheCwlZWF4CQkJIyBSZXR1cm4gdmFsdWUKKwltb3ZsICVlYngsKCVlZHgpCisJbW92bCAlZXNwLDQoJWVkeCkJCSMgUG9zdC1yZXR1cm4gJWVzcCEKKwlwdXNobCAlZWN4CQkJIyBNYWtlIHRoZSBjYWxsL3JldHVybiBzdGFjayBoYXBweQorCW1vdmwgJWVicCw4KCVlZHgpCisJbW92bCAlZXNpLDEyKCVlZHgpCisJbW92bCAlZWRpLDE2KCVlZHgpCisJbW92bCAlZWN4LDIwKCVlZHgpCQkjIFJldHVybiBhZGRyZXNzCisJcmV0CisKKwkuc2l6ZSBzZXRqbXAsLi1zZXRqbXAKKworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgbG9uZ2ptcAorCS50eXBlIGxvbmdqbXAsIEBmdW5jdGlvbgorbG9uZ2ptcDoKKyNpZmRlZiBSRUdQQVJNCisJeGNoZ2wgJWVheCwlZWR4CisjZWxzZQorCW1vdmwgNCglZXNwKSwlZWR4CQkjIGptcF9wdHIgYWRkcmVzcworCW1vdmwgOCglZXNwKSwlZWF4CQkjIFJldHVybiB2YWx1ZQorI2VuZGlmCisJbW92bCAoJWVkeCksJWVieAorCW1vdmwgNCglZWR4KSwlZXNwCisJbW92bCA4KCVlZHgpLCVlYnAKKwltb3ZsIDEyKCVlZHgpLCVlc2kKKwltb3ZsIDE2KCVlZHgpLCVlZGkKKwlqbXAgKjIwKCVlZHgpCisKKwkuc2l6ZSBsb25nam1wLC4tbG9uZ2ptcAorKi8KKyNpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gNAorI2luY2x1ZGUgPGkzODYvc2V0am1wLlM+CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAorI2luY2x1ZGUgPHg4Nl82NC9zZXRqbXAuUz4KKyNlbHNlCisjZXJyb3IgIlVuYWJsZSB0byBidWlsZCBmb3IgdG8tYmUtZGVmaW5lZCBhcmNoaXRlY3R1cmUgdHlwZSIKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb20zMi9saWIvc2tpcHNwYWNlLmMgYi9jb20zMi9saWIvc2tpcHNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMjY1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9za2lwc3BhY2UuYwpAQCAtMCwwICsxLDggQEAKKyNpbmNsdWRlIDxjdHlwZS5oPgorCitjaGFyICpza2lwc3BhY2UoY29uc3QgY2hhciAqcCkKK3sKKyAgIHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpwKSkKKyAgICAgICAgICAgIHArKzsKKyAgIHJldHVybiAoY2hhciAqKXA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc25wcmludGYuYyBiL2NvbTMyL2xpYi9zbnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGJhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc25wcmludGYuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogc25wcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgc25wcmludGYoY2hhciAqYnVmZmVyLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICBpbnQgcnY7CisKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgICBydiA9IHZzbnByaW50ZihidWZmZXIsIG4sIGZvcm1hdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3NwcmludGYuYyBiL2NvbTMyL2xpYi9zcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzMjg0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zcHJpbnRmLmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIHNwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgc3ByaW50ZihjaGFyICpidWZmZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgaW50IHJ2OworCisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgcnYgPSB2c25wcmludGYoYnVmZmVyLCB+KHNpemVfdCkgMCwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKworICAgIHJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zcmFuZDQ4LmMgYi9jb20zMi9saWIvc3JhbmQ0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNmMyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3JhbmQ0OC5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBzcmFuZDQ4LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBfX3JhbmQ0OF9zZWVkWzNdOworCit2b2lkIHNyYW5kNDgobG9uZyBzZWVkdmFsKQoreworICAgIF9fcmFuZDQ4X3NlZWRbMF0gPSAweDMzMGU7CisgICAgX19yYW5kNDhfc2VlZFsxXSA9ICh1bnNpZ25lZCBzaG9ydClzZWVkdmFsOworICAgIF9fcmFuZDQ4X3NlZWRbMl0gPSAodW5zaWduZWQgc2hvcnQpKCh1aW50MzJfdCkgc2VlZHZhbCA+PiAxNik7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3NjYW5mLmMgYi9jb20zMi9saWIvc3NjYW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2ZDIzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zc2NhbmYuYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogc3NjYW5mKCkKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IHNzY2FuZihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgaW50IHJ2OworCisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgcnYgPSB2c3NjYW5mKHN0ciwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKworICAgIHJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdGFjay5jIGIvY29tMzIvbGliL3N0YWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3ZDlkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdGFjay5jCkBAIC0wLDAgKzEsNCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBEZWZhdWx0IHN0YWNrIHNpemUgOCBNQiAqLworc2l6ZV90IF9fc3RhY2tfc2l6ZSA9IDggPDwgMjA7CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3RwY3B5LmMgYi9jb20zMi9saWIvc3RwY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlMjBhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHBjcHkuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogc3RwY3B5LmMKKyAqCisgKiBzdHBjcHkoKQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3RwY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworICAgIGNoYXIgKnEgPSBkc3Q7CisgICAgY29uc3QgY2hhciAqcCA9IHNyYzsKKyAgICBjaGFyIGNoOworCisgICAgZm9yICg7OykgeworCSpxID0gY2ggPSAqcCsrOworCWlmICghY2gpCisJICAgIGJyZWFrOworCXErKzsKKyAgICB9CisKKyAgICByZXR1cm4gcTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHBuY3B5LmMgYi9jb20zMi9saWIvc3RwbmNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzdhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3RwbmNweS5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBzdHBuY3B5LmMKKyAqCisgKiBzdHBuY3B5KCkKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NoYXIgKnN0cG5jcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBuKQoreworICAgIGNoYXIgKnEgPSBkc3Q7CisgICAgY29uc3QgY2hhciAqcCA9IHNyYzsKKyAgICBjaGFyIGNoOworCisgICAgd2hpbGUgKG4tLSkgeworCSpxID0gY2ggPSAqcCsrOworCWlmICghY2gpCisJICAgIGJyZWFrOworCXErKzsKKyAgICB9CisKKyAgICByZXR1cm4gcTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJjYXNlY21wLmMgYi9jb20zMi9saWIvc3RyY2FzZWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTQ5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3RyY2FzZWNtcC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBzdHJjYXNlY21wLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczI7CisgICAgdW5zaWduZWQgY2hhciBjaDsKKyAgICBpbnQgZCA9IDA7CisKKyAgICB3aGlsZSAoMSkgeworCS8qIHRvdXBwZXIoKSBleHBlY3RzIGFuIHVuc2lnbmVkIGNoYXIgKGltcGxpY2l0bHkgY2FzdCB0byBpbnQpCisJICAgYXMgaW5wdXQsIGFuZCByZXR1cm5zIGFuIGludCwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdhbnQuICovCisJZCA9IHRvdXBwZXIoY2ggPSAqYzErKykgLSB0b3VwcGVyKCpjMisrKTsKKwlpZiAoZCB8fCAhY2gpCisJICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBkOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N0cmNhdC5jIGIvY29tMzIvbGliL3N0cmNhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmRiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3RyY2F0LmMKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIHN0cmNhdC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjaGFyICpzdHJjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisgICAgc3RyY3B5KHN0cmNocihkc3QsICdcMCcpLCBzcmMpOworICAgIHJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3RyY2hyLmMgYi9jb20zMi9saWIvc3RyY2hyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzZWM3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJjaHIuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogc3RyY2hyLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NoYXIgKnN0cmNocihjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKyAgICB3aGlsZSAoKnMgIT0gKGNoYXIpYykgeworCWlmICghKnMpCisJICAgIHJldHVybiBOVUxMOworCXMrKzsKKyAgICB9CisKKyAgICByZXR1cm4gKGNoYXIgKilzOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N0cmNtcC5jIGIvY29tMzIvbGliL3N0cmNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YTRhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3RyY21wLmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIHN0cmNtcC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgc3RyY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYzIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXMyOworICAgIHVuc2lnbmVkIGNoYXIgY2g7CisgICAgaW50IGQgPSAwOworCisgICAgd2hpbGUgKDEpIHsKKwlkID0gKGludCkoY2ggPSAqYzErKykgLSAoaW50KSpjMisrOworCWlmIChkIHx8ICFjaCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGQ7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3RyY3B5LmMgYi9jb20zMi9saWIvc3RyY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzYjAyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJjcHkuYwpAQCAtMCwwICsxLDIwIEBACisvKgorICogc3RyY3B5LmMKKyAqCisgKiBzdHJjcHkoKQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3RyY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworICAgIGNoYXIgKnEgPSBkc3Q7CisgICAgY29uc3QgY2hhciAqcCA9IHNyYzsKKyAgICBjaGFyIGNoOworCisgICAgZG8geworCSpxKysgPSBjaCA9ICpwKys7CisgICAgfSB3aGlsZSAoY2gpOworCisgICAgcmV0dXJuIGRzdDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJkdXAuYyBiL2NvbTMyL2xpYi9zdHJkdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjY5NThiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cmR1cC5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBzdHJkdXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworY2hhciAqc3RyZHVwKGNvbnN0IGNoYXIgKnMpCit7CisgICAgaW50IGwgPSBzdHJsZW4ocykgKyAxOworICAgIGNoYXIgKmQgPSBtYWxsb2MobCk7CisKKyAgICBpZiAoZCkKKwltZW1jcHkoZCwgcywgbCk7CisKKyAgICByZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJlcnJvci5jIGIvY29tMzIvbGliL3N0cmVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzZDQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJlcnJvci5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBzdHJlcnJvci5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjaGFyICpzdHJlcnJvcihpbnQgZXJybnVtKQoreworCXN0YXRpYyBjaGFyIG1lc3NhZ2VbMzJdID0gImVycm9yICI7CS8qIGVub3VnaCBmb3IgZXJyb3IgMl42My0xICovCisJY2hhciBudW1idWZbMzJdOworCWNoYXIgKnA7CisJdW5zaWduZWQgaW50IGUgPSAodW5zaWduZWQgaW50KWVycm51bTsKKworCWV4dGVybiBjb25zdCBpbnQgc3lzX25lcnI7CisJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19lcnJsaXN0W107CisKKwlpZiAoZSA8ICh1bnNpZ25lZCBpbnQpc3lzX25lcnIgJiYgc3lzX2Vycmxpc3RbZV0pCisJCXJldHVybiAoY2hhciAqKXN5c19lcnJsaXN0W2VdOworCisJcCA9IG51bWJ1ZiArIHNpemVvZiBudW1idWY7CisJKi0tcCA9ICdcMCc7CisKKwlkbyB7CisJCSotLXAgPSAoZSAlIDEwKSArICcwJzsKKwkJZSAvPSAxMDsKKwl9IHdoaWxlIChlKTsKKworCW1lbWNweShtZXNzYWdlICsgNiwgcCwgKG51bWJ1ZiArIHNpemVvZiBudW1idWYpIC0gcCk7CisKKwlyZXR1cm4gbWVzc2FnZTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJsY2F0LmMgYi9jb20zMi9saWIvc3RybGNhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZjY5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3RybGNhdC5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBzdHJsY2F0LmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworc2l6ZV90IHN0cmxjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKQoreworICAgIHNpemVfdCBieXRlcyA9IDA7CisgICAgY2hhciAqcSA9IGRzdDsKKyAgICBjb25zdCBjaGFyICpwID0gc3JjOworICAgIGNoYXIgY2g7CisKKyAgICB3aGlsZSAoYnl0ZXMgPCBzaXplICYmICpxKSB7CisJcSsrOworCWJ5dGVzKys7CisgICAgfQorCisgICAgd2hpbGUgKChjaCA9ICpwKyspKSB7CisJaWYgKGJ5dGVzIDwgc2l6ZSkKKwkgICAgKnErKyA9IGNoOworCisJYnl0ZXMrKzsKKyAgICB9CisKKyAgICAqcSA9ICdcMCc7CisgICAgcmV0dXJuIGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N0cmxjcHkuYyBiL2NvbTMyL2xpYi9zdHJsY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0ZTcyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJsY3B5LmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIHN0cmxjcHkuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorCitzaXplX3Qgc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisgICAgc2l6ZV90IGJ5dGVzID0gMDsKKyAgICBjaGFyICpxID0gZHN0OworICAgIGNvbnN0IGNoYXIgKnAgPSBzcmM7CisgICAgY2hhciBjaDsKKworICAgIHdoaWxlICgoY2ggPSAqcCsrKSkgeworCWlmIChieXRlcyA8IHNpemUpCisJICAgICpxKysgPSBjaDsKKworCWJ5dGVzKys7CisgICAgfQorCisgICAgKnEgPSAnXDAnOworICAgIHJldHVybiBieXRlczsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJsZW4uYyBiL2NvbTMyL2xpYi9zdHJsZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJjN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cmxlbi5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBzdHJsZW4oKQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICpzKQoreworICAgIGNvbnN0IGNoYXIgKnNzID0gczsKKyAgICB3aGlsZSAoKnNzKQorCXNzKys7CisgICAgcmV0dXJuIHNzIC0gczsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJuY2FzZWNtcC5jIGIvY29tMzIvbGliL3N0cm5jYXNlY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYWMwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJuY2FzZWNtcC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBzdHJuY2FzZWNtcC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKK2ludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczI7CisgICAgdW5zaWduZWQgY2hhciBjaDsKKyAgICBpbnQgZCA9IDA7CisKKyAgICB3aGlsZSAobi0tKSB7CisJLyogdG91cHBlcigpIGV4cGVjdHMgYW4gdW5zaWduZWQgY2hhciAoaW1wbGljaXRseSBjYXN0IHRvIGludCkKKwkgICBhcyBpbnB1dCwgYW5kIHJldHVybnMgYW4gaW50LCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4gKi8KKwlkID0gdG91cHBlcihjaCA9ICpjMSsrKSAtIHRvdXBwZXIoKmMyKyspOworCWlmIChkIHx8ICFjaCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGQ7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3RybmNhdC5jIGIvY29tMzIvbGliL3N0cm5jYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNkYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cm5jYXQuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogc3RybmNhdC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjaGFyICpzdHJuY2F0KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbikKK3sKKyAgICBzdHJuY3B5KHN0cmNocihkc3QsICdcMCcpLCBzcmMsIG4pOworICAgIHJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3RybmNtcC5jIGIvY29tMzIvbGliL3N0cm5jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDFiOWUzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cm5jbXAuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogc3RybmNtcC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczI7CisgICAgdW5zaWduZWQgY2hhciBjaDsKKyAgICBpbnQgZCA9IDA7CisKKyAgICB3aGlsZSAobi0tKSB7CisJZCA9IChpbnQpKGNoID0gKmMxKyspIC0gKGludCkqYzIrKzsKKwlpZiAoZCB8fCAhY2gpCisJICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBkOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N0cm5jcHkuYyBiL2NvbTMyL2xpYi9zdHJuY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkYTc5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJuY3B5LmMKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIHN0cm5jcHkuYworICoKKyAqIHN0cm5jcHkoKQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3RybmNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG4pCit7CisgICAgY2hhciAqcSA9IGRzdDsKKyAgICBjb25zdCBjaGFyICpwID0gc3JjOworICAgIGNoYXIgY2g7CisKKyAgICB3aGlsZSAobi0tKSB7CisJKnErKyA9IGNoID0gKnArKzsKKwlpZiAoIWNoKQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N0cm5kdXAuYyBiL2NvbTMyL2xpYi9zdHJuZHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwNzNhOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJuZHVwLmMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIHN0cm5kdXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworY2hhciAqc3RybmR1cChjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sKKyAgICBpbnQgbCA9IG4gPiBzdHJsZW4ocykgPyBzdHJsZW4ocykgKyAxIDogbiArIDE7CisgICAgY2hhciAqZCA9IG1hbGxvYyhsKTsKKworICAgIGlmIChkKQorCW1lbWNweShkLCBzLCBsKTsKKyAgICBkW25dID0gJ1wwJzsKKyAgICByZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJubGVuLmMgYi9jb20zMi9saWIvc3Rybmxlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmY4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3Rybmxlbi5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBzdHJubGVuKCkKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3NpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreworICAgIGNvbnN0IGNoYXIgKnNzID0gczsKKyAgICB3aGlsZSAobi0tICYmICpzcykKKwlzcysrOworICAgIHJldHVybiBzcyAtIHM7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3RybnRvaW1heC5jIGIvY29tMzIvbGliL3N0cm50b2ltYXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Y0MDEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cm50b2ltYXguYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogc3RybnRvaW1heC5jCisgKgorICogc3RybnRvaW1heCgpCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK2ludG1heF90IHN0cm50b2ltYXgoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UsIHNpemVfdCBuKQoreworICAgIHJldHVybiAoaW50bWF4X3QpIHN0cm50b3VtYXgobnB0ciwgZW5kcHRyLCBiYXNlLCBuKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJudG91bWF4LmMgYi9jb20zMi9saWIvc3RybnRvdW1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YmM3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3RybnRvdW1heC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBzdHJudG91bWF4LmMKKyAqCisgKiBUaGUgc3RybnRvdW1heCgpIGZ1bmN0aW9uIGFuZCBhc3NvY2lhdGVkCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpZ2l0dmFsKGludCBjaCkKK3sKKyAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworCXJldHVybiBjaCAtICcwJzsKKyAgICB9IGVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHsKKwlyZXR1cm4gY2ggLSAnQScgKyAxMDsKKyAgICB9IGVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHsKKwlyZXR1cm4gY2ggLSAnYScgKyAxMDsKKyAgICB9IGVsc2UgeworCXJldHVybiAtMTsKKyAgICB9Cit9CisKK3VpbnRtYXhfdCBzdHJudG91bWF4KGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlLCBzaXplX3QgbikKK3sKKyAgICBpbnQgbWludXMgPSAwOworICAgIHVpbnRtYXhfdCB2ID0gMDsKKyAgICBpbnQgZDsKKworICAgIHdoaWxlIChuICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKm5wdHIpKSB7CisJbnB0cisrOworCW4tLTsKKyAgICB9CisKKyAgICAvKiBTaW5nbGUgb3B0aW9uYWwgKyBvciAtICovCisgICAgaWYgKG4gJiYgKm5wdHIgPT0gJy0nKSB7CisJbWludXMgPSAxOworCW5wdHIrKzsKKwluLS07CisgICAgfSBlbHNlIGlmIChuICYmICpucHRyID09ICcrJykgeworCW5wdHIrKzsKKyAgICB9CisKKyAgICBpZiAoYmFzZSA9PSAwKSB7CisJaWYgKG4gPj0gMiAmJiBucHRyWzBdID09ICcwJyAmJiAobnB0clsxXSA9PSAneCcgfHwgbnB0clsxXSA9PSAnWCcpKSB7CisJICAgIG4gLT0gMjsKKwkgICAgbnB0ciArPSAyOworCSAgICBiYXNlID0gMTY7CisJfSBlbHNlIGlmIChuID49IDEgJiYgbnB0clswXSA9PSAnMCcpIHsKKwkgICAgbi0tOworCSAgICBucHRyKys7CisJICAgIGJhc2UgPSA4OworCX0gZWxzZSB7CisJICAgIGJhc2UgPSAxMDsKKwl9CisgICAgfSBlbHNlIGlmIChiYXNlID09IDE2KSB7CisJaWYgKG4gPj0gMiAmJiBucHRyWzBdID09ICcwJyAmJiAobnB0clsxXSA9PSAneCcgfHwgbnB0clsxXSA9PSAnWCcpKSB7CisJICAgIG4gLT0gMjsKKwkgICAgbnB0ciArPSAyOworCX0KKyAgICB9CisKKyAgICB3aGlsZSAobiAmJiAoZCA9IGRpZ2l0dmFsKCpucHRyKSkgPj0gMCAmJiBkIDwgYmFzZSkgeworCXYgPSB2ICogYmFzZSArIGQ7CisJbi0tOworCW5wdHIrKzsKKyAgICB9CisKKyAgICBpZiAoZW5kcHRyKQorCSplbmRwdHIgPSAoY2hhciAqKW5wdHI7CisKKyAgICByZXR1cm4gbWludXMgPyAtdiA6IHY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3RycmNoci5jIGIvY29tMzIvbGliL3N0cnJjaHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2QyZmVlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cnJjaHIuYwpAQCAtMCwwICsxLDE4IEBACisvKgorICogc3RycmNoci5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjaGFyICpzdHJyY2hyKGNvbnN0IGNoYXIgKnMsIGludCBjKQoreworICAgIGNvbnN0IGNoYXIgKmZvdW5kID0gTlVMTDsKKworICAgIHdoaWxlICgqcykgeworCWlmICgqcyA9PSAoY2hhciljKQorCSAgICBmb3VuZCA9IHM7CisJcysrOworICAgIH0KKworICAgIHJldHVybiAoY2hhciAqKWZvdW5kOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N0cnJlcGxhY2UuYyBiL2NvbTMyL2xpYi9zdHJyZXBsYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5ZWZlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJyZXBsYWNlLmMKQEAgLTAsMCArMSw1OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTEgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2NoYXIgKnN0cnJlcGxhY2UoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpzdHJpbmdfdG9fcmVwbGFjZSwKKwkJIGNvbnN0IGNoYXIgKnN0cmluZ190b19pbnNlcnQpCit7CisgICAgY2hhciAqdG9rZW4gPSBOVUxMOworICAgIGNoYXIgKm91dCA9IE5VTEw7CisKKyAgICBzaXplX3Qgc2xlbiwgc3JsZW4sIHNpbGVuOworCisgICAgdG9rZW4gPSBzdHJzdHIoc3RyaW5nLCBzdHJpbmdfdG9fcmVwbGFjZSk7CisgICAgaWYgKCF0b2tlbikKKwlyZXR1cm4gc3RyZHVwKHN0cmluZyk7CisKKyAgICBzbGVuICA9IHN0cmxlbihzdHJpbmcpOworICAgIHNybGVuID0gc3RybGVuKHN0cmluZ190b19yZXBsYWNlKTsKKyAgICBzaWxlbiA9IHN0cmxlbihzdHJpbmdfdG9faW5zZXJ0KTsKKyAgICAKKyAgICBvdXQgPSBtYWxsb2Moc2xlbiAtIHNybGVuICsgc2lsZW4gKyAxKTsKKyAgICBpZiAoIW91dCkKKwlyZXR1cm4gTlVMTDsKKyAgICAKKyAgICBtZW1jcHkob3V0LCBzdHJpbmcsIHRva2VuIC0gc3RyaW5nKTsKKyAgICBtZW1jcHkob3V0ICsgKHRva2VuIC0gc3RyaW5nKSwgc3RyaW5nX3RvX2luc2VydCwgc2lsZW4pOworICAgIG1lbWNweShvdXQgKyAodG9rZW4gLSBzdHJpbmcpICsgc2lsZW4sIHRva2VuICsgc3JsZW4sIAorCSAgIHNsZW4gLSBzcmxlbiAtICh0b2tlbiAtIHN0cmluZykgKyAxKTsKKworICAgIHJldHVybiBvdXQ7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3Ryc2VwLmMgYi9jb20zMi9saWIvc3Ryc2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0ZjAzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJzZXAuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogc3Ryc2VwLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NoYXIgKnN0cnNlcChjaGFyICoqc3RyaW5ncCwgY29uc3QgY2hhciAqZGVsaW0pCit7CisgICAgY2hhciAqcyA9ICpzdHJpbmdwOworICAgIGNoYXIgKmU7CisKKyAgICBpZiAoIXMpCisJcmV0dXJuIE5VTEw7CisKKyAgICBlID0gc3RycGJyayhzLCBkZWxpbSk7CisgICAgaWYgKGUpCisJKmUrKyA9ICdcMCc7CisKKyAgICAqc3RyaW5ncCA9IGU7CisgICAgcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3Ryc3BuLmMgYi9jb20zMi9saWIvc3Ryc3BuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyNDgyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJzcG4uYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogc3Ryc3BuLCBzdHJjc3BuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZm5kZWYgTE9OR19CSVQKKyNkZWZpbmUgTE9OR19CSVQgKENIQVJfQklUKnNpemVvZihsb25nKSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZXRfYml0KHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgdW5zaWduZWQgaW50IGJpdCkKK3sKKyAgICBiaXRtYXBbYml0IC8gTE9OR19CSVRdIHw9IDFVTCA8PCAoYml0ICUgTE9OR19CSVQpOworfQorCitzdGF0aWMgaW50IHRlc3RfYml0KHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgdW5zaWduZWQgaW50IGJpdCkKK3sKKyAgICByZXR1cm4gKGludCkoYml0bWFwW2JpdCAvIExPTkdfQklUXSA+PiAoYml0ICUgTE9OR19CSVQpKSAmIDE7Cit9CisKK3N0YXRpYyBzaXplX3Qgc3RyeHNwbihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICptYXAsIGludCBwYXJpdHkpCit7CisgICAgdW5zaWduZWQgbG9uZyBtYXRjaG1hcFsoKDEgPDwgQ0hBUl9CSVQpICsgTE9OR19CSVQgLSAxKSAvIExPTkdfQklUXTsKKyAgICBzaXplX3QgbiA9IDA7CisKKyAgICAvKiBDcmVhdGUgYml0bWFwICovCisgICAgbWVtc2V0KG1hdGNobWFwLCAwLCBzaXplb2YgbWF0Y2htYXApOworICAgIHdoaWxlICgqbWFwKQorCXNldF9iaXQobWF0Y2htYXAsICh1bnNpZ25lZCBjaGFyKSptYXArKyk7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIG51bGwgY2hhcmFjdGVyIG5ldmVyIG1hdGNoZXMgKi8KKyAgICBpZiAocGFyaXR5KQorCXNldF9iaXQobWF0Y2htYXAsIDApOworCisgICAgLyogQ2FsY3VsYXRlIHNwYW4gbGVuZ3RoICovCisgICAgd2hpbGUgKHRlc3RfYml0KG1hdGNobWFwLCAodW5zaWduZWQgY2hhcikqcysrKSBeIHBhcml0eSkKKwluKys7CisKKyAgICByZXR1cm4gbjsKK30KKworc2l6ZV90IHN0cnNwbihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICphY2NlcHQpCit7CisgICAgcmV0dXJuIHN0cnhzcG4ocywgYWNjZXB0LCAwKTsKK30KKworc2l6ZV90IHN0cmNzcG4oY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcmVqZWN0KQoreworICAgIHJldHVybiBzdHJ4c3BuKHMsIHJlamVjdCwgMSk7Cit9CisKK2NoYXIgKnN0cnBicmsoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqYWNjZXB0KQoreworICAgIGNvbnN0IGNoYXIgKnNzID0gcyArIHN0cnhzcG4ocywgYWNjZXB0LCAxKTsKKworICAgIHJldHVybiAqc3MgPyAoY2hhciAqKXNzIDogTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJzdHIuYyBiL2NvbTMyL2xpYi9zdHJzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTNlNzQzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cnN0ci5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBzdHJzdHIuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3Ryc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpCit7CisgICAgcmV0dXJuIChjaGFyICopbWVtbWVtKGhheXN0YWNrLCBzdHJsZW4oaGF5c3RhY2spLCBuZWVkbGUsIHN0cmxlbihuZWVkbGUpKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJ0b2ltYXguYyBiL2NvbTMyL2xpYi9zdHJ0b2ltYXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2RkMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cnRvaW1heC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIGludG1heF90CisjZGVmaW5lIE5BTUUgc3RydG9pbWF4CisjaW5jbHVkZSAic3RydG94LmMiCmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3RydG9rLmMgYi9jb20zMi9saWIvc3RydG9rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlMzdiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zdHJ0b2suYwpAQCAtMCwwICsxLDE1IEBACisvKgorICogc3RydG9rLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NoYXIgKnN0cnRvayhjaGFyICpzLCBjb25zdCBjaGFyICpkZWxpbSkKK3sKKyAgICBzdGF0aWMgY2hhciAqaG9sZGVyOworCisgICAgaWYgKHMpCisJaG9sZGVyID0gczsKKworICAgIHJldHVybiBzdHJzZXAoJmhvbGRlciwgZGVsaW0pOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N0cnRvbC5jIGIvY29tMzIvbGliL3N0cnRvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZmM4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3RydG9sLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIFRZUEUgc2lnbmVkIGxvbmcKKyNkZWZpbmUgTkFNRSBzdHJ0b2wKKyNpbmNsdWRlICJzdHJ0b3guYyIKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJ0b2xsLmMgYi9jb20zMi9saWIvc3RydG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NDI4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3RydG9sbC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIHNpZ25lZCBsb25nIGxvbmcKKyNkZWZpbmUgTkFNRSBzdHJ0b2xsCisjaW5jbHVkZSAic3RydG94LmMiCmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3RydG91bC5jIGIvY29tMzIvbGliL3N0cnRvdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg5YWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cnRvdWwuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgVFlQRSB1bnNpZ25lZCBsb25nCisjZGVmaW5lIE5BTUUgc3RydG91bAorI2luY2x1ZGUgInN0cnRveC5jIgpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N0cnRvdWxsLmMgYi9jb20zMi9saWIvc3RydG91bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MxNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cnRvdWxsLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIFRZUEUgdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIE5BTUUgc3RydG91bGwKKyNpbmNsdWRlICJzdHJ0b3guYyIKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdHJ0b3VtYXguYyBiL2NvbTMyL2xpYi9zdHJ0b3VtYXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzc5NzEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N0cnRvdW1heC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIHVpbnRtYXhfdAorI2RlZmluZSBOQU1FIHN0cnRvdW1heAorI2luY2x1ZGUgInN0cnRveC5jIgpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N0cnRveC5jIGIvY29tMzIvbGliL3N0cnRveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTI0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3RydG94LmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIHN0cnRveC5jCisgKgorICogc3RydG8uLi4oKSBmdW5jdGlvbnMsIGJ5IG1hY3JvIGRlZmluaXRpb24KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworVFlQRSBOQU1FKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKQoreworICAgIHJldHVybiAoVFlQRSkgc3RybnRvdW1heChucHRyLCBlbmRwdHIsIGJhc2UsIH4oc2l6ZV90KSAwKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zdWZmaXhfbnVtYmVyLmMgYi9jb20zMi9saWIvc3VmZml4X251bWJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDczYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3VmZml4X251bWJlci5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzdWZmaXhfbnVtYmVyLmMKKyAqCisgKiBDb252ZXJ0IGEgc3RyaW5nIG9mIGEgbnVtYmVyIHdpdGggcG90ZW50aWFsIFNJIHN1ZmZpeCB0byBpbnQtdHlwZQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdWZmaXhfbnVtYmVyLmg+CisKKy8qIEdldCBhIHZhbHVlIHdpdGggYSBwb3RlbnRpYWwgc3VmZml4IChrL20vZy90L3AvZSkgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBzdWZmaXhfbnVtYmVyKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjaGFyICplcDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdjsKKyAgICBpbnQgc2hpZnQ7CisKKyAgICB2ID0gc3RydG91bGwoc3RyLCAmZXAsIDApOworICAgIHN3aXRjaCAoKmVwIHwgMHgyMCkgeworICAgIGNhc2UgJ2snOgorCXNoaWZ0ID0gMTA7CisJYnJlYWs7CisgICAgY2FzZSAnbSc6CisJc2hpZnQgPSAyMDsKKwlicmVhazsKKyAgICBjYXNlICdnJzoKKwlzaGlmdCA9IDMwOworCWJyZWFrOworICAgIGNhc2UgJ3QnOgorCXNoaWZ0ID0gNDA7CisJYnJlYWs7CisgICAgY2FzZSAncCc6CisJc2hpZnQgPSA1MDsKKwlicmVhazsKKyAgICBjYXNlICdlJzoKKwlzaGlmdCA9IDYwOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJc2hpZnQgPSAwOworCWJyZWFrOworICAgIH0KKyAgICB2IDw8PSBzaGlmdDsKKworICAgIHJldHVybiB2OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9hbnNpLmMgYi9jb20zMi9saWIvc3lzL2Fuc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNjMDNlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9hbnNpLmMKQEAgLTAsMCArMSw0NDQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBhbnNpLmMKKyAqCisgKiBBTlNJIGNoYXJhY3RlciBjb2RlIGVuZ2luZQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb2xvcnRibC5oPgorI2luY2x1ZGUgImFuc2kuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlIGRlZmF1bHRfc3RhdGUgPSB7CisgICAgLnN0YXRlID0gc3RfaW5pdCwKKyAgICAucHZ0ID0gZmFsc2UsCisgICAgLm5wYXJtcyA9IDAsCisgICAgLnh5ID0gezAsIDB9LAorICAgIC5jaW5kZXggPSAwLAkJLyogRmlyc3QgY29sb3IgdGFibGUgZW50cnkgKi8KKyAgICAudnRncmFwaGljcyA9IGZhbHNlLAorICAgIC5pbnRlbnNpdHkgPSAxLAorICAgIC51bmRlcmxpbmUgPSBmYWxzZSwKKyAgICAuYmxpbmsgPSBmYWxzZSwKKyAgICAucmV2ZXJzZSA9IGZhbHNlLAorICAgIC5mZyA9IDcsCisgICAgLmJnID0gMCwKKyAgICAuYXV0b2NyID0gdHJ1ZSwJICAJLyogTWltaWMgXG4gLT4gXHJcbiBjb252ZXJzaW9uIGJ5IGRlZmF1bHQgKi8KKyAgICAuYXV0b3dyYXAgPSB0cnVlLAkJLyogV3JhcCBsaW5lcyBieSBkZWZhdWx0ICovCisgICAgLnNhdmVkX3h5ID0gezAsIDB9LAorICAgIC5jdXJzb3IgPSB0cnVlLAorfTsKKworLyogREVDIFZUIGdyYXBoaWNzIHRvIGNvZGVwYWdlIDQzNyB0YWJsZSAoY2hhcmFjdGVycyAweDYwLTB4N0Ygb25seSkgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRlY3Z0X3RvX2NwNDM3W10gPSB7CisgICAgMDAwNCwgMDI2MSwgMDAwNywgMDAwNywgMDAwNywgMDAwNywgMDM3MCwgMDM2MSwKKyAgICAwMDA3LCAwMDA3LCAwMzMxLCAwMjc3LCAwMzMyLCAwMzAwLCAwMzA1LCAwMzA0LAorICAgIDAzMDQsIDAzMDQsIDAxMzcsIDAxMzcsIDAzMDMsIDAyNjQsIDAzMDEsIDAzMDIsCisgICAgMDI2MywgMDM2MywgMDM2MiwgMDM0MywgMDMzMCwgMDIzNCwgMDAwNywgMDAKK307CisKK3ZvaWQgX19hbnNpX2luaXQoY29uc3Qgc3RydWN0IHRlcm1faW5mbyAqdGkpCit7CisgICAgbWVtY3B5KHRpLT50cywgJmRlZmF1bHRfc3RhdGUsIHNpemVvZiBkZWZhdWx0X3N0YXRlKTsKK30KKwordm9pZCBfX2Fuc2lfcHV0Y2hhcihjb25zdCBzdHJ1Y3QgdGVybV9pbmZvICp0aSwgdWludDhfdCBjaCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYW5zaV9vcHMgKm9wID0gdGktPm9wOworICAgIHN0cnVjdCB0ZXJtX3N0YXRlICpzdCA9IHRpLT50czsKKyAgICBjb25zdCBpbnQgcm93cyA9IHRpLT5yb3dzOworICAgIGNvbnN0IGludCBjb2xzID0gdGktPmNvbHM7CisgICAgc3RydWN0IGN1cnh5IHh5ID0gc3QtPnh5OworCisgICAgc3dpdGNoIChzdC0+c3RhdGUpIHsKKyAgICBjYXNlIHN0X2luaXQ6CisJc3dpdGNoIChjaCkgeworCWNhc2UgMSAuLi4gNToKKwkgICAgc3QtPnN0YXRlID0gc3RfdGJsOworCSAgICBzdC0+cGFybXNbMF0gPSBjaDsKKwkgICAgYnJlYWs7CisJY2FzZSAnXGEnOgorCSAgICBvcC0+YmVlcCgpOworCSAgICBicmVhazsKKwljYXNlICdcYic6CisJICAgIGlmICh4eS54ID4gMCkKKwkJeHkueC0tOworCSAgICBicmVhazsKKwljYXNlICdcdCc6CisJICAgIHsKKwkJaW50IG5zcCA9IDggLSAoeHkueCAmIDcpOworCQl3aGlsZSAobnNwLS0pCisJCSAgICBfX2Fuc2lfcHV0Y2hhcih0aSwgJyAnKTsKKwkgICAgfQorCSAgICByZXR1cm47CQkvKiBDdXJzb3IgYWxyZWFkeSB1cGRhdGVkICovCisJY2FzZSAnXG4nOgorCWNhc2UgJ1x2JzoKKwljYXNlICdcZic6CisJICAgIHh5LnkrKzsKKwkgICAgaWYgKHN0LT5hdXRvY3IpCisJCXh5LnggPSAwOworCSAgICBicmVhazsKKwljYXNlICdccic6CisJICAgIHh5LnggPSAwOworCSAgICBicmVhazsKKwljYXNlIDEyNzoKKwkgICAgLyogSWdub3JlIGRlbGV0ZSAqLworCSAgICBicmVhazsKKwljYXNlIDE0OgorCSAgICBzdC0+dnRncmFwaGljcyA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgMTU6CisJICAgIHN0LT52dGdyYXBoaWNzID0gMDsKKwkgICAgYnJlYWs7CisJY2FzZSAyNzoKKwkgICAgc3QtPnN0YXRlID0gc3RfZXNjOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICAvKiBQcmludCBjaGFyYWN0ZXIgKi8KKwkgICAgaWYgKGNoID49IDMyKSB7CisJCWlmIChzdC0+dnRncmFwaGljcyAmJiAoY2ggJiAweGUwKSA9PSAweDYwKQorCQkgICAgY2ggPSBkZWN2dF90b19jcDQzN1tjaCAtIDB4NjBdOworCisJCW9wLT53cml0ZV9jaGFyKHh5LngsIHh5LnksIGNoLCBzdCk7CisJCXh5LngrKzsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIHN0X2VzYzoKKwlzd2l0Y2ggKGNoKSB7CisJY2FzZSAnJSc6CisJY2FzZSAnKCc6CisJY2FzZSAnKSc6CisJY2FzZSAnIyc6CisJICAgIC8qIElnbm9yZSB0aGlzIHBsdXMgdGhlIHN1YnNlcXVlbnQgY2hhcmFjdGVyLCBhbGxvd3MKKwkgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIExpbnV4IHNlcXVlbmNlIHRvIHNldCBjaGFyc2V0ICovCisJICAgIGJyZWFrOworCWNhc2UgJ1snOgorCSAgICBzdC0+c3RhdGUgPSBzdF9jc2k7CisJICAgIHN0LT5ucGFybXMgPSAwOworCSAgICBzdC0+cHZ0ID0gZmFsc2U7CisJICAgIG1lbXNldChzdC0+cGFybXMsIDAsIHNpemVvZiBzdC0+cGFybXMpOworCSAgICBicmVhazsKKwljYXNlICdjJzoKKwkgICAgLyogUmVzZXQgdGVybWluYWwgKi8KKwkgICAgbWVtY3B5KCZzdCwgJmRlZmF1bHRfc3RhdGUsIHNpemVvZiBzdCk7CisJICAgIG9wLT5lcmFzZShzdCwgMCwgMCwgY29scyAtIDEsIHJvd3MgLSAxKTsKKwkgICAgeHkueCA9IHh5LnkgPSAwOworCSAgICBzdC0+c3RhdGUgPSBzdF9pbml0OworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICAvKiBJZ25vcmUgc2VxdWVuY2UgKi8KKwkgICAgc3QtPnN0YXRlID0gc3RfaW5pdDsKKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCisgICAgY2FzZSBzdF9jc2k6CisJeworCSAgICBpbnQgcDAgPSBzdC0+cGFybXNbMF0gPyBzdC0+cGFybXNbMF0gOiAxOworCisJICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisJCXN0LT5wYXJtc1tzdC0+bnBhcm1zXSA9IHN0LT5wYXJtc1tzdC0+bnBhcm1zXSAqIDEwICsgKGNoIC0gJzAnKTsKKwkgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKKwkJc3QtPm5wYXJtcysrOworCQlpZiAoc3QtPm5wYXJtcyA+PSBBTlNJX01BWF9QQVJNUykKKwkJICAgIHN0LT5ucGFybXMgPSBBTlNJX01BWF9QQVJNUyAtIDE7CisJCWJyZWFrOworCSAgICB9IGVsc2UgaWYgKGNoID09ICc/JykgeworCQlzdC0+cHZ0ID0gdHJ1ZTsKKwkgICAgfSBlbHNlIHsKKwkJc3dpdGNoIChjaCkgeworCQljYXNlICdBJzoKKwkJICAgIHsKKwkJCWludCB5ID0geHkueSAtIHAwOworCQkJeHkueSA9ICh5IDwgMCkgPyAwIDogeTsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQljYXNlICdCJzoKKwkJICAgIHsKKwkJCWludCB5ID0geHkueSArIHAwOworCQkJeHkueSA9ICh5ID49IHJvd3MpID8gcm93cyAtIDEgOiB5OworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ0MnOgorCQkgICAgeworCQkJaW50IHggPSB4eS54ICsgcDA7CisJCQl4eS54ID0gKHggPj0gY29scykgPyBjb2xzIC0gMSA6IHg7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnRCc6CisJCSAgICB7CisJCQlpbnQgeCA9IHh5LnggLSBwMDsKKwkJCXh5LnggPSAoeCA8IDApID8gMCA6IHg7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnRSc6CisJCSAgICB7CisJCQlpbnQgeSA9IHh5LnkgKyBwMDsKKwkJCXh5LnkgPSAoeSA+PSByb3dzKSA/IHJvd3MgLSAxIDogeTsKKwkJCXh5LnggPSAwOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ0YnOgorCQkgICAgeworCQkJaW50IHkgPSB4eS55IC0gcDA7CisJCQl4eS55ID0gKHkgPCAwKSA/IDAgOiB5OworCQkJeHkueCA9IDA7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnRyc6CisJCWNhc2UgJ1wnJzoKKwkJICAgIHsKKwkJCWludCB4ID0gc3QtPnBhcm1zWzBdIC0gMTsKKwkJCXh5LnggPSAoeCA+PSBjb2xzKSA/IGNvbHMgLSAxIDogKHggPCAwKSA/IDAgOiB4OworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ0gnOgorCQljYXNlICdmJzoKKwkJICAgIHsKKwkJCWludCB5ID0gc3QtPnBhcm1zWzBdIC0gMTsKKwkJCWludCB4ID0gc3QtPnBhcm1zWzFdIC0gMTsKKworCQkJeHkueCA9ICh4ID49IGNvbHMpID8gY29scyAtIDEgOiAoeCA8IDApID8gMCA6IHg7CisJCQl4eS55ID0gKHkgPj0gcm93cykgPyByb3dzIC0gMSA6ICh5IDwgMCkgPyAwIDogeTsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQljYXNlICdKJzoKKwkJICAgIHsKKwkJCXN3aXRjaCAoc3QtPnBhcm1zWzBdKSB7CisJCQljYXNlIDA6CisJCQkgICAgb3AtPmVyYXNlKHN0LCB4eS54LCB4eS55LCBjb2xzIC0gMSwgeHkueSk7CisJCQkgICAgaWYgKHh5LnkgPCByb3dzIC0gMSkKKwkJCQlvcC0+ZXJhc2Uoc3QsIDAsIHh5LnkgKyAxLCBjb2xzIC0gMSwgcm93cyAtIDEpOworCQkJICAgIGJyZWFrOworCisJCQljYXNlIDE6CisJCQkgICAgaWYgKHh5LnkgPiAwKQorCQkJCW9wLT5lcmFzZShzdCwgMCwgMCwgY29scyAtIDEsIHh5LnkgLSAxKTsKKwkJCSAgICBpZiAoeHkueSA+IDApCisJCQkJb3AtPmVyYXNlKHN0LCAwLCB4eS55LCB4eS54IC0gMSwgeHkueSk7CisJCQkgICAgYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCSAgICBvcC0+ZXJhc2Uoc3QsIDAsIDAsIGNvbHMgLSAxLCByb3dzIC0gMSk7CisJCQkgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkgICAgLyogSWdub3JlICovCisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnSyc6CisJCSAgICB7CisJCQlzd2l0Y2ggKHN0LT5wYXJtc1swXSkgeworCQkJY2FzZSAwOgorCQkJICAgIG9wLT5lcmFzZShzdCwgeHkueCwgeHkueSwgY29scyAtIDEsIHh5LnkpOworCQkJICAgIGJyZWFrOworCisJCQljYXNlIDE6CisJCQkgICAgaWYgKHh5LnggPiAwKQorCQkJCW9wLT5lcmFzZShzdCwgMCwgeHkueSwgeHkueCAtIDEsIHh5LnkpOworCQkJICAgIGJyZWFrOworCisJCQljYXNlIDI6CisJCQkgICAgb3AtPmVyYXNlKHN0LCAwLCB4eS55LCBjb2xzIC0gMSwgeHkueSk7CisJCQkgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkgICAgLyogSWdub3JlICovCisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJ2wnOgorCQl7CisJCSAgICBib29sIHNldCA9IChjaCA9PSAnaCcpOworCQkgICAgc3dpdGNoIChzdC0+cGFybXNbMF0pIHsKKwkJICAgIGNhc2UgNzoJLyogREVDQVdNICovCisJCQlzdC0+YXV0b3dyYXAgPSBzZXQ7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMjA6CS8qIExOTSAqLworCQkJc3QtPmF1dG9jciA9IHNldDsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAyNToJLyogREVDVEVDTSAqLworCQkJc3QtPmN1cnNvciA9IHNldDsKKwkJCW9wLT5zaG93Y3Vyc29yKHN0KTsKKwkJCWJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJCS8qIElnbm9yZSAqLworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCQljYXNlICdtJzoKKwkJICAgIHsKKwkJCXN0YXRpYyBjb25zdCBpbnQgYW5zaTJwY1s4XSA9CisJCQkgICAgeyAwLCA0LCAyLCA2LCAxLCA1LCAzLCA3IH07CisKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8PSBzdC0+bnBhcm1zOyBpKyspIHsKKwkJCSAgICBpbnQgYSA9IHN0LT5wYXJtc1tpXTsKKwkJCSAgICBzd2l0Y2ggKGEpIHsKKwkJCSAgICBjYXNlIDA6CisJCQkJc3QtPmZnID0gNzsKKwkJCQlzdC0+YmcgPSAwOworCQkJCXN0LT5pbnRlbnNpdHkgPSAxOworCQkJCXN0LT51bmRlcmxpbmUgPSAwOworCQkJCXN0LT5ibGluayA9IDA7CisJCQkJc3QtPnJldmVyc2UgPSAwOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgMToKKwkJCQlzdC0+aW50ZW5zaXR5ID0gMjsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDI6CisJCQkJc3QtPmludGVuc2l0eSA9IDA7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSA0OgorCQkJCXN0LT51bmRlcmxpbmUgPSAxOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgNToKKwkJCQlzdC0+YmxpbmsgPSAxOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgNzoKKwkJCQlzdC0+cmV2ZXJzZSA9IDE7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSAyMToKKwkJCSAgICBjYXNlIDIyOgorCQkJCXN0LT5pbnRlbnNpdHkgPSAxOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgMjQ6CisJCQkJc3QtPnVuZGVybGluZSA9IDA7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSAyNToKKwkJCQlzdC0+YmxpbmsgPSAwOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgMjc6CisJCQkJc3QtPnJldmVyc2UgPSAwOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgMzAgLi4uIDM3OgorCQkJCXN0LT5mZyA9IGFuc2kycGNbYSAtIDMwXTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDM4OgorCQkJCXN0LT5mZyA9IDc7CisJCQkJc3QtPnVuZGVybGluZSA9IDE7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSAzOToKKwkJCQlzdC0+ZmcgPSA3OworCQkJCXN0LT51bmRlcmxpbmUgPSAwOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgNDAgLi4uIDQ3OgorCQkJCXN0LT5iZyA9IGFuc2kycGNbYSAtIDQwXTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDQ5OgorCQkJCXN0LT5iZyA9IDc7CisJCQkJYnJlYWs7CisJCQkgICAgZGVmYXVsdDoKKwkJCQkvKiBEbyBub3RoaW5nICovCisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkgICAgc3QtPnNhdmVkX3h5ID0geHk7CisJCSAgICBicmVhazsKKwkJY2FzZSAndSc6CisJCSAgICB4eSA9IHN0LT5zYXZlZF94eTsKKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgkvKiBJbmNsdWRlcyBDQU4gYW5kIFNVQiAqLworCQkgICAgYnJlYWs7CS8qIERyb3AgdW5rbm93biBzZXF1ZW5jZSAqLworCQl9CisJCXN0LT5zdGF0ZSA9IHN0X2luaXQ7CisJICAgIH0KKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIHN0X3RibDoKKwlzdC0+cGFybXNbMV0gPSAwOworCWlmIChjaCA9PSAnIycpCisJICAgIHN0LT5zdGF0ZSA9IHN0X3RibGM7CisJZWxzZQorCSAgICBzdC0+c3RhdGUgPSBzdF9pbml0OworCWJyZWFrOworCisgICAgY2FzZSBzdF90YmxjOgorCXsKKwkgICAgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgY2hhciljaCAtICcwJzsKKwkgICAgY29uc3QgY2hhciAqcDsKKworCSAgICBpZiAobiA8IDEwKSB7CisJCXN0LT5wYXJtc1sxXSA9IHN0LT5wYXJtc1sxXSAqIDEwICsgbjsKKworCQlpZiAoIS0tc3QtPnBhcm1zWzBdKSB7CisJCSAgICBpZiAoc3QtPnBhcm1zWzFdIDwgY29uc29sZV9jb2xvcl90YWJsZV9zaXplKSB7CisJCQkvKiBTZXQgdGhlIGNvbG9yIHRhYmxlIGluZGV4ICovCisJCQlzdC0+Y2luZGV4ID0gc3QtPnBhcm1zWzFdOworCisJCQkvKiBTZWUgaWYgdGhlcmUgYXJlIGFueSBvdGhlciBhdHRyaWJ1dGVzIHdlIGNhcmUgYWJvdXQgKi8KKwkJCXAgPSBjb25zb2xlX2NvbG9yX3RhYmxlW3N0LT5wYXJtc1sxXV0uYW5zaTsKKwkJCWlmIChwKSB7CisJCQkgICAgc3QtPnN0YXRlID0gc3RfZXNjOworCQkJICAgIF9fYW5zaV9wdXRjaGFyKHRpLCAnWycpOworCQkJICAgIF9fYW5zaV9wdXRjaGFyKHRpLCAnMCcpOworCQkJICAgIF9fYW5zaV9wdXRjaGFyKHRpLCAnOycpOworCQkJICAgIHdoaWxlICgqcCkKKwkJCQlfX2Fuc2lfcHV0Y2hhcih0aSwgKnArKyk7CisJCQkgICAgX19hbnNpX3B1dGNoYXIodGksICdtJyk7CisJCQl9CisJCSAgICB9CisJCSAgICBzdC0+c3RhdGUgPSBzdF9pbml0OworCQl9CisJICAgIH0gZWxzZSB7CisJCXN0LT5zdGF0ZSA9IHN0X2luaXQ7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorCisgICAgLyogSWYgd2UgZmVsbCBvZmYgdGhlIGVuZCBvZiB0aGUgc2NyZWVuLCBhZGp1c3QgKi8KKyAgICBpZiAoeHkueCA+PSBjb2xzKSB7CisJaWYgKHN0LT5hdXRvd3JhcCkgeworCSAgICB4eS54ID0gMDsKKwkgICAgeHkueSsrOworCX0gZWxzZSB7CisJICAgIHh5LnggPSBjb2xzIC0gMTsKKwl9CisgICAgfQorICAgIHdoaWxlICh4eS55ID49IHJvd3MpIHsKKwl4eS55LS07CisJb3AtPnNjcm9sbF91cChzdCk7CisgICAgfQorCisgICAgLyogVXBkYXRlIGN1cnNvciBwb3NpdGlvbiAqLworICAgIG9wLT5zZXRfY3Vyc29yKHh5LngsIHh5LnksIHN0LT5jdXJzb3IpOworICAgIHN0LT54eSA9IHh5OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9hbnNpLmggYi9jb20zMi9saWIvc3lzL2Fuc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE2ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9hbnNpLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIGFuc2kuaAorICovCisKKyNpZm5kZWYgQ09NMzJfTElCX1NZU19BTlNJX0gKKyNkZWZpbmUgQ09NMzJfTElCX1NZU19BTlNJX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgInZlc2EvdmlkZW8uaCIKKworI2RlZmluZSBBTlNJX01BWF9QQVJNUwkxNgorCitlbnVtIGFuc2lfc3RhdGUgeworICAgIHN0X2luaXQsCisgICAgc3RfZXNjLAorICAgIHN0X2NzaSwKKyAgICBzdF90YmwsCisgICAgc3RfdGJsYywKK307CisKK3N0cnVjdCBjdXJ4eSB7CisgICAgdWludDhfdCB4LCB5OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB0ZXJtX3N0YXRlIHsKKyAgICBlbnVtIGFuc2lfc3RhdGUgc3RhdGU7CisgICAgaW50IG5wYXJtczsJCQkvKiBOdW1iZXIgb2YgcGFyYW1ldGVycyBzZWVuICovCisgICAgaW50IHBhcm1zW0FOU0lfTUFYX1BBUk1TXTsKKyAgICBib29sIHB2dDsJCQkvKiBQcml2YXRlIGNvZGU/ICovCisgICAgc3RydWN0IGN1cnh5IHh5OworICAgIHN0cnVjdCBjdXJ4eSBzYXZlZF94eTsKKyAgICBhdHRyX3QgY2luZGV4OwkJLyogU09IIGNvbG9yIGluZGV4ICovCisgICAgdWludDhfdCBmZzsKKyAgICB1aW50OF90IGJnOworICAgIHVpbnQ4X3QgaW50ZW5zaXR5OworICAgIGJvb2wgdnRncmFwaGljczsJCS8qIFZUIGdyYXBoaWNzIG9uL29mZiAqLworICAgIGJvb2wgdW5kZXJsaW5lOworICAgIGJvb2wgYmxpbms7CisgICAgYm9vbCByZXZlcnNlOworICAgIGJvb2wgYXV0b2NyOworICAgIGJvb2wgYXV0b3dyYXA7CisgICAgYm9vbCBjdXJzb3I7Cit9OworCitzdHJ1Y3QgYW5zaV9vcHMgeworICAgIHZvaWQgKCplcmFzZSkgKGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICogc3QsIGludCB4MCwgaW50IHkwLCBpbnQgeDEsCisJCSAgIGludCB5MSk7CisgICAgdm9pZCAoKndyaXRlX2NoYXIpIChpbnQgeCwgaW50IHksIHVpbnQ4X3QgY2gsIGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICogc3QpOworICAgIHZvaWQgKCpzaG93Y3Vyc29yKSAoY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKiBzdCk7CisgICAgdm9pZCAoKnNjcm9sbF91cCkgKGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICogc3QpOworICAgIHZvaWQgKCpzZXRfY3Vyc29yKSAoaW50IHgsIGludCB5LCBib29sIHZpc2libGUpOworICAgIHZvaWQgKCpiZWVwKSAodm9pZCk7Cit9OworCitzdHJ1Y3QgdGVybV9pbmZvIHsKKyAgICBpbnQgcm93cywgY29sczsJCS8qIFNjcmVlbiBzaXplICovCisgICAgaW50IGRpc2FibGVkOworICAgIHN0cnVjdCB0ZXJtX3N0YXRlICp0czsKKyAgICBjb25zdCBzdHJ1Y3QgYW5zaV9vcHMgKm9wOworfTsKKwordm9pZCBfX2Fuc2lfaW5pdChjb25zdCBzdHJ1Y3QgdGVybV9pbmZvICp0aSk7Cit2b2lkIF9fYW5zaV9wdXRjaGFyKGNvbnN0IHN0cnVjdCB0ZXJtX2luZm8gKnRpLCB1aW50OF90IGNoKTsKK3ZvaWQgX19hbnNpY29uX2JlZXAodm9pZCk7CisKKyNlbmRpZiAvKiBDT00zMl9MSUJfU1lTX0FOU0lfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9hbnNpY29uX3dyaXRlLmMgYi9jb20zMi9saWIvc3lzL2Fuc2ljb25fd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTcwYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9hbnNpY29uX3dyaXRlLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBhbnNpY29uX3dyaXRlLmMKKyAqCisgKiBXcml0ZSB0byB0aGUgc2NyZWVuIHVzaW5nIEFOU0kgY29udHJvbCBjb2RlcyAoYWJvdXQgYXMgY2FwYWJsZSBhcworICogRE9TJyBBTlNJLlNZUy4pCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSA8Y29sb3J0YmwuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImZpbGUuaCIKKyNpbmNsdWRlICJhbnNpLmgiCisjaW5jbHVkZSA8c3lzbGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlICJncmFwaGljcy5oIgorCitzdGF0aWMgdm9pZCBhbnNpY29uX2VyYXNlKGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICosIGludCwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBhbnNpY29uX3dyaXRlX2NoYXIoaW50LCBpbnQsIHVpbnQ4X3QsIGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICopOworc3RhdGljIHZvaWQgYW5zaWNvbl9zaG93Y3Vyc29yKGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICopOworc3RhdGljIHZvaWQgYW5zaWNvbl9zY3JvbGxfdXAoY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKik7CitzdGF0aWMgdm9pZCBhbnNpY29uX3NldF9jdXJzb3IoaW50LCBpbnQsIGJvb2wpOworCitzdGF0aWMgc3RydWN0IHRlcm1fc3RhdGUgdHM7CitzdHJ1Y3QgYW5zaV9vcHMgX19hbnNpY29uX29wcyA9IHsKKyAgICAuZXJhc2UgPSBhbnNpY29uX2VyYXNlLAorICAgIC53cml0ZV9jaGFyID0gYW5zaWNvbl93cml0ZV9jaGFyLAorICAgIC5zaG93Y3Vyc29yID0gYW5zaWNvbl9zaG93Y3Vyc29yLAorICAgIC5zZXRfY3Vyc29yID0gYW5zaWNvbl9zZXRfY3Vyc29yLAorICAgIC5zY3JvbGxfdXAgPSBhbnNpY29uX3Njcm9sbF91cCwKKyAgICAuYmVlcCA9IF9fYW5zaWNvbl9iZWVwLAorfTsKKworc3RhdGljIHN0cnVjdCB0ZXJtX2luZm8gdGkgPSB7CisgICAgLmRpc2FibGVkID0gMCwKKyAgICAudHMgPSAmdHMsCisgICAgLm9wID0gJl9fYW5zaWNvbl9vcHMKK307CisKKyNkZWZpbmUgVEVYVF9NT0RFIDB4MDAwNQorCisvKiBSZWZlcmVuY2UgY291bnRlciB0byB0aGUgc2NyZWVuLCB0byBrZWVwIHRyYWNrIG9mIGlmIHdlIG5lZWQKKyAgIHJlaW5pdGlhbGl6YXRpb24uICovCitzdGF0aWMgaW50IGFuc2ljb25fY291bnRlciA9IDA7CisKKy8qIENvbW1vbiBzZXR1cCAqLworaW50IF9fYW5zaWNvbl9vcGVuKHN0cnVjdCBmaWxlX2luZm8gKmZwKQoreworICAgIGlmICghYW5zaWNvbl9jb3VudGVyKSB7CisJLyogQXJlIHdlIGRpc2FibGVkPyAqLworCWlmIChzeXNsaW51eF9zZXJpYWxfY29uc29sZV9pbmZvKCktPmZsb3djdGwgJiAweDgwMDApIHsKKwkgICAgdGkuZGlzYWJsZWQgPSAxOworCSAgICB0aS5yb3dzID0gMjU7CisJICAgIHRpLmNvbHMgPSA4MDsKKwl9IGVsc2UgeworCSAgICAvKiBGb3JjZSB0ZXh0IG1vZGUgKi8KKwkgICAgZmlybXdhcmUtPm9fb3BzLT50ZXh0X21vZGUoKTsKKworCSAgICAvKiBJbml0aWFsIHN0YXRlICovCisJICAgIGZpcm13YXJlLT5vX29wcy0+Z2V0X21vZGUoJnRpLmNvbHMsICZ0aS5yb3dzKTsKKwkgICAgX19hbnNpX2luaXQoJnRpKTsKKworCSAgICAvKiBHZXQgY3Vyc29yIHNoYXBlIGFuZCBwb3NpdGlvbiAqLworCSAgICBmaXJtd2FyZS0+b19vcHMtPmdldF9jdXJzb3IoJnRpLnRzLT54eS54LCAmdGkudHMtPnh5LnkpOworCX0KKyAgICB9CisKKyAgICBmcC0+by5yb3dzID0gdGkucm93czsKKyAgICBmcC0+by5jb2xzID0gdGkuY29sczsKKworICAgIGFuc2ljb25fY291bnRlcisrOworICAgIHJldHVybiAwOworfQorCitpbnQgX19hbnNpY29uX2Nsb3NlKHN0cnVjdCBmaWxlX2luZm8gKmZwKQoreworICAgICh2b2lkKWZwOworCisgICAgYW5zaWNvbl9jb3VudGVyLS07CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFR1cm4gQU5TSSBhdHRyaWJ1dGVzIGludG8gVkdBIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyB1aW50OF90IGFuc2ljb25fYXR0cmlidXRlKGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICpzdCkKK3sKKyAgICBpbnQgYmcgPSBzdC0+Ymc7CisgICAgaW50IGZnOworCisgICAgaWYgKHN0LT51bmRlcmxpbmUpCisJZmcgPSAweDAxOworICAgIGVsc2UgaWYgKHN0LT5pbnRlbnNpdHkgPT0gMCkKKwlmZyA9IDB4MDg7CisgICAgZWxzZQorCWZnID0gc3QtPmZnOworCisgICAgaWYgKHN0LT5yZXZlcnNlKSB7CisJYmcgPSBmZyAmIDB4MDc7CisJZmcgJj0gMHgwODsKKwlmZyB8PSBzdC0+Ymc7CisgICAgfQorCisgICAgaWYgKHN0LT5ibGluaykKKwliZyBePSAweDA4OworCisgICAgaWYgKHN0LT5pbnRlbnNpdHkgPT0gMikKKwlmZyBePSAweDA4OworCisgICAgcmV0dXJuIChiZyA8PCA0KSB8IGZnOworfQorCisvKiBFcmFzZSBhIHJlZ2lvbiBvZiB0aGUgc2NyZWVuICovCitzdGF0aWMgdm9pZCBhbnNpY29uX2VyYXNlKGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICpzdCwKKwkJCSAgaW50IHgwLCBpbnQgeTAsIGludCB4MSwgaW50IHkxKQoreworICAgIHVpbnQ4X3QgYXR0cmlidXRlID0gYW5zaWNvbl9hdHRyaWJ1dGUoc3QpOworCisgICAgaWYgKGZpcm13YXJlLT5vX29wcy0+ZXJhc2UpCisJZmlybXdhcmUtPm9fb3BzLT5lcmFzZSh4MCwgeTAsIHgxLCB5MSwgYXR0cmlidXRlKTsKK30KKworLyogU2hvdyBvciBoaWRlIHRoZSBjdXJzb3IgKi8KK3N0YXRpYyB2b2lkIGFuc2ljb25fc2hvd2N1cnNvcihjb25zdCBzdHJ1Y3QgdGVybV9zdGF0ZSAqc3QpCit7CisgICAgZmlybXdhcmUtPm9fb3BzLT5zaG93Y3Vyc29yKHN0KTsKK30KKworc3RhdGljIHZvaWQgYW5zaWNvbl9zZXRfY3Vyc29yKGludCB4LCBpbnQgeSwgYm9vbCB2aXNpYmxlKQoreworICAgIGZpcm13YXJlLT5vX29wcy0+c2V0X2N1cnNvcih4LCB5LCB2aXNpYmxlKTsKK30KKworc3RhdGljIHZvaWQgYW5zaWNvbl93cml0ZV9jaGFyKGludCB4LCBpbnQgeSwgdWludDhfdCBjaCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdGVybV9zdGF0ZSAqc3QpCit7CisgICAgdWludDhfdCBhdHRyaWJ1dGUgPSBhbnNpY29uX2F0dHJpYnV0ZShzdCk7CisgICAgYW5zaWNvbl9zZXRfY3Vyc29yKHgsIHksIGZhbHNlKTsKKworICAgIGZpcm13YXJlLT5vX29wcy0+d3JpdGVfY2hhcihjaCwgYXR0cmlidXRlKTsKK30KKworc3RhdGljIHZvaWQgYW5zaWNvbl9zY3JvbGxfdXAoY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKnN0KQoreworICAgIHVpbnQ4X3Qgcm93cywgY29scywgYXR0cmlidXRlOworCisgICAgY29scyA9IHRpLmNvbHMgLSAxOworICAgIHJvd3MgPSB0aS5yb3dzIC0gMTsKKyAgICBhdHRyaWJ1dGUgPSBhbnNpY29uX2F0dHJpYnV0ZShzdCk7CisKKyAgICBmaXJtd2FyZS0+b19vcHMtPnNjcm9sbF91cChjb2xzLCByb3dzLCBhdHRyaWJ1dGUpOworfQorCitzc2l6ZV90IF9fYW5zaWNvbl93cml0ZShzdHJ1Y3QgZmlsZV9pbmZvICpmcCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmcCA9IGJ1ZjsKKyAgICBzaXplX3QgbiA9IDA7CisKKyAgICAodm9pZClmcDsKKworICAgIGlmICh0aS5kaXNhYmxlZCkKKwlyZXR1cm4gY291bnQ7CQkvKiBOb3RoaW5nIHRvIGRvICovCisKKyAgICB3aGlsZSAoY291bnQtLSkgeworCV9fYW5zaV9wdXRjaGFyKCZ0aSwgKmJ1ZnArKyk7CisJbisrOworICAgIH0KKworICAgIHJldHVybiBuOworfQorCit2b2lkIF9fYW5zaWNvbl9iZWVwKHZvaWQpCit7CisgICAgaWYgKGZpcm13YXJlLT5vX29wcy0+YmVlcCkKKwlmaXJtd2FyZS0+b19vcHMtPmJlZXAoKTsKK30KKworY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgZGV2X2Fuc2ljb25fdyA9IHsKKyAgICAuZGV2X21hZ2ljID0gX19ERVZfTUFHSUMsCisgICAgLmZsYWdzID0gX19ERVZfVFRZIHwgX19ERVZfT1VUUFVULAorICAgIC5maWxlZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19BUFBFTkQsCisgICAgLndyaXRlID0gX19hbnNpY29uX3dyaXRlLAorICAgIC5jbG9zZSA9IF9fYW5zaWNvbl9jbG9zZSwKKyAgICAub3BlbiA9IF9fYW5zaWNvbl9vcGVuLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvYW5zaXNlcmlhbF93cml0ZS5jIGIvY29tMzIvbGliL3N5cy9hbnNpc2VyaWFsX3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3ZDFjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvYW5zaXNlcmlhbF93cml0ZS5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBhbnNpc2VyaWFsX3dyaXRlLmMKKyAqCisgKiBXcml0ZSB0byBib3RoIHRvIHRoZSBBTlNJIGNvbnNvbGUgYW5kIHRoZSBzZXJpYWwgcG9ydAorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCitleHRlcm4gaW50IF9fYW5zaWNvbl9vcGVuKHN0cnVjdCBmaWxlX2luZm8gKik7CitleHRlcm4gaW50IF9fYW5zaWNvbl9jbG9zZShzdHJ1Y3QgZmlsZV9pbmZvICopOworZXh0ZXJuIHNzaXplX3QgX19hbnNpY29uX3dyaXRlKHN0cnVjdCBmaWxlX2luZm8gKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHNzaXplX3QgX194c2VyaWFsX3dyaXRlKHN0cnVjdCBmaWxlX2luZm8gKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworCitzdGF0aWMgc3NpemVfdCBfX2Fuc2lzZXJpYWxfd3JpdGUoc3RydWN0IGZpbGVfaW5mbyAqZnAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCkKK3sKKyAgICBfX2Fuc2ljb25fd3JpdGUoZnAsIGJ1ZiwgY291bnQpOworICAgIHJldHVybiBfX3hzZXJpYWxfd3JpdGUoZnAsIGJ1ZiwgY291bnQpOworfQorCitjb25zdCBzdHJ1Y3Qgb3V0cHV0X2RldiBkZXZfYW5zaXNlcmlhbF93ID0geworICAgIC5kZXZfbWFnaWMgPSBfX0RFVl9NQUdJQywKKyAgICAuZmxhZ3MgPSBfX0RFVl9UVFkgfCBfX0RFVl9PVVRQVVQsCisgICAgLmZpbGVmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0FQUEVORCwKKyAgICAud3JpdGUgPSBfX2Fuc2lzZXJpYWxfd3JpdGUsCisgICAgLmNsb3NlID0gX19hbnNpY29uX2Nsb3NlLAorICAgIC5vcGVuID0gX19hbnNpY29uX29wZW4sCit9OwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9hcmd2LmMgYi9jb20zMi9saWIvc3lzL2FyZ3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjI4N2MyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9hcmd2LmMKQEAgLTAsMCArMSw5NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGFyZ3YuYworICoKKyAqIFBhcnNlIGEgc2luZ2xlIEMgc3RyaW5nIGludG8gYXJnYyBhbmQgYXJndiAoYXJnYyBpcyByZXR1cm4gdmFsdWUuKQorICogbWVtcHRyIHBvaW50cyB0byBhdmFpbGFibGUgbWVtb3J5LgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYWxpZ24uaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorCitleHRlcm4gY2hhciBfZW5kW107CQkvKiBTeW1ib2wgY3JlYXRlZCBieSBsaW5rZXIgKi8KK3ZvaWQgKl9fbWVtX2VuZCA9ICZfZW5kOwkvKiBHbG9iYWwgdmFyaWFibGUgZm9yIHVzZSBieSBtYWxsb2MoKSAqLworCitpbnQgX19wYXJzZV9hcmd2KGNoYXIgKioqYXJndiwgY29uc3QgY2hhciAqc3RyKQoreworICAgIGNoYXIgZHVtbXlfYXJndjBbXSA9ICIiOworICAgIGNoYXIgKm1lbSA9IF9fbWVtX2VuZDsKKyAgICBjb25zdCBjaGFyICpwID0gc3RyOworICAgIGNoYXIgKnEgPSBtZW07CisgICAgY2hhciAqcjsKKyAgICBjaGFyICoqYXJnOworICAgIGludCB3YXNzcGFjZSA9IDE7CisgICAgaW50IGFyZ2MgPSAxOworCisgICAgLyogRmlyc3QgY29weSB0aGUgc3RyaW5nLCB0dXJuaW5nIHdoaXRlc3BhY2UgcnVucyBpbnRvIG51bGxzICovCisgICAgZm9yIChwID0gc3RyOzsgcCsrKSB7CisJaWYgKCpwIDw9ICcgJykgeworCSAgICBpZiAoIXdhc3NwYWNlKSB7CisJCXdhc3NwYWNlID0gMTsKKwkJKnErKyA9ICdcMCc7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAod2Fzc3BhY2UpIHsKKwkJYXJnYysrOworCQl3YXNzcGFjZSA9IDA7CisJICAgIH0KKwkgICAgKnErKyA9ICpwOworCX0KKworCS8qIFRoaXMgdGVzdCBpcyBBRlRFUiB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUgbnVsbCBieXRlOworCSAgIHdlIHRyZWF0IGl0IGFzIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgc28gaXQgdGVybWluYXRlcworCSAgIHRoZSBsYXN0IGFyZ3VtZW50ICovCisJaWYgKCEqcCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTm93IGNyZWF0ZSBhcmd2ICovCisgICAgYXJnID0gKGNoYXIgKiopQUxJR05fVVBfRk9SKHEsIGNoYXIgKik7CisgICAgKmFyZ3YgPSBhcmc7CisgICAgKmFyZysrID0gX19jb20zMi5jc19uYW1lID8gKGNoYXIgKilfX2NvbTMyLmNzX25hbWUgOiBkdW1teV9hcmd2MDsgLyogYXJndlswXSAqLworCisgICAgcS0tOwkJCS8qIFBvaW50IHEgdG8gZmluYWwgbnVsbCAqLworICAgIGlmIChtZW0gPCBxKQorCSphcmcrKyA9IG1lbTsJCS8qIGFyZ3ZbMV0gKi8KKworICAgIGZvciAociA9IG1lbTsgciA8IHE7IHIrKykgeworCWlmICgqciA9PSAnXDAnKSB7CisJICAgICphcmcrKyA9IHIgKyAxOworCX0KKyAgICB9CisKKyAgICAqYXJnKysgPSBOVUxMOwkJLyogTnVsbCBwb2ludGVyIGF0IHRoZSBlbmQgKi8KKyAgICBfX21lbV9lbmQgPSBhcmc7CQkvKiBFbmQgb2YgbWVtb3J5IHdlIHVzZWQgKi8KKworICAgIHJldHVybiBhcmdjOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9jZmFyY2FsbC5jIGIvY29tMzIvbGliL3N5cy9jZmFyY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTgxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL2NmYXJjYWxsLmMKQEAgLTAsMCArMSwxMCBAQAorLyoKKyAqIGNmYXJjYWxsLmMKKyAqLworCisjaW5jbHVkZSA8Y29tMzIuaD4KKworaW50IF9fY2ZhcmNhbGwodWludDE2X3QgY3MsIHVpbnQxNl90IGlwLCBjb25zdCB2b2lkICpzdGFjaywgdWludDMyX3Qgc3RhY2tfc2l6ZSkKK3sKKyAgICByZXR1cm4gX19jb20zMi5jc19jZmFyY2FsbCgoY3MgPDwgMTYpICsgaXAsIHN0YWNrLCBzdGFja19zaXplKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvY2xvc2UuYyBiL2NvbTMyL2xpYi9zeXMvY2xvc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGQ5YTQyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9jbG9zZS5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjbG9zZS5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJmaWxlLmgiCisKK2ludCBjbG9zZShpbnQgZmQpCit7CisgICAgc3RydWN0IGZpbGVfaW5mbyAqZnAgPSAmX19maWxlX2luZm9bZmRdOworICAgIGludCBydiA9IDA7CisKKyAgICBpZiAoZmQgPj0gTkZJTEVTIHx8ICFmcC0+aW9wIHx8ICFmcC0+b29wKSB7CisJZXJybm8gPSBFQkFERjsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGZwLT5pb3AtPmNsb3NlKSB7CisJcnYgPSBmcC0+aW9wLT5jbG9zZShmcCk7CisJaWYgKHJ2KQorCSAgICByZXR1cm4gcnY7CisgICAgfQorICAgIGZwLT5pb3AgPSAmZGV2X2Vycm9yX3I7CisKKyAgICBpZiAoZnAtPm9vcC0+Y2xvc2UpIHsKKwlydiA9IGZwLT5vb3AtPmNsb3NlKGZwKTsKKwlpZiAocnYpCisJICAgIHJldHVybiBydjsKKyAgICB9CisKKyAgICBtZW1zZXQoZnAsIDAsIHNpemVvZiAqZnApOwkvKiBGaWxlIHN0cnVjdHVyZSB1bnVzZWQgKi8KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvY29sb3J0YWJsZS5jIGIvY29tMzIvbGliL3N5cy9jb2xvcnRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxYzQyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvY29sb3J0YWJsZS5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgPGNvbG9ydGJsLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY29sb3JfdGFibGUgZGVmYXVsdF9jb2xvcl90YWJsZVtdID0geworICAgIHsiZGVmYXVsdCIsICIwIiwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwgU0hBRE9XX05PUk1BTH0KK307CisKK3N0cnVjdCBjb2xvcl90YWJsZSAqY29uc29sZV9jb2xvcl90YWJsZSA9IGRlZmF1bHRfY29sb3JfdGFibGU7CitpbnQgY29uc29sZV9jb2xvcl90YWJsZV9zaXplID0KKyAgICAoc2l6ZW9mIGRlZmF1bHRfY29sb3JfdGFibGUgLyBzaXplb2Yoc3RydWN0IGNvbG9yX3RhYmxlKSk7CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL2VudHJ5LlMgYi9jb20zMi9saWIvc3lzL2VudHJ5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmZGU4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvZW50cnkuUwpAQCAtMCwwICsxLDExOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBDT00zMiBzdGFydCB1cCBjb2RlIC0gbXVzdCBiZSBsaW5rZWQgZmlyc3QgaW4gdGhlIGJpbmFyeQorICovCisKKy8qIE51bWJlciBvZiBhcmd1bWVudHMgaW4gb3VyIHZlcnNpb24gb2YgdGhlIGVudHJ5IHN0cnVjdHVyZSAqLworI2RlZmluZSBDT00zMl9BUkdTIDkKKworCQkuc2VjdGlvbiAiLmluaXQiLCJheCIKKwkJLmdsb2JsIF9zdGFydAorCQkudHlwZSBfc3RhcnQsIEBmdW5jdGlvbgorX3N0YXJ0OgorCQkvKiBUaGlzIGZpcnN0IGluc3RydWN0aW9uIGFjdHMgYXMgQ09NMzJSIG1hZ2ljIG51bWJlciAqLworCQltb3ZsICQweDIxY2Q0Y2ZlLCVlYXgKKworCQkvKiBVcHdhcmRzIHN0cmluZyBvcGVyYXRpb25zICovCisJCWNsZAorCisJCS8qIEZpbmQgb3VyIG93biBsb2NhdGlvbiAqLworCQljYWxsIDFmCisxOgkJcG9wbCAlZWJ4CisJCWFkZGwgJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyArICguIC0gMWIpLCAlZWJ4CisJCisJCS8qIFByb2Nlc3MgcmVsb2NhdGlvbnMgKHdoaWNoIG92ZXJsYXkgdGhlIC5ic3Mgc2VnbWVudCkgKi8KKwkJbGVhbCBfZWRhdGFAR09UT0ZGKCVlYngpLCVlc2kKKwkJbGVhbCBfc3RhcnRAR09UT0ZGKCVlYngpLCVlZHgKKzI6CQlsb2RzbAorCQlhbmRsICVlYXgsJWVheAorCQlqeiAzZgorCQlhZGRsICVlZHgsKCVlYXgsJWVkeCkKKwkJam1wIDJiCiszOgorCQkvKiBSZWxvY2F0ZSB0aGUgR09UIChpcyB0aGlzIHJpZ2h0PykgKi8KKwkJbGVhbCBfX2dvdF9zdGFydEBHT1RPRkYoJWVieCksJWVzaQorCQlsZWFsIF9fZ290X2VuZEBHT1RPRkYoJWVieCksJWVkaQorNDoKKwkJYWRkbCAlZWR4LCglZXNpKQorCQlhZGRsICQ0LCVlc2kKKwkJY21wbCAlZWRpLCVlc2kKKwkJamIgNGIKKwkKKwkJLyogWmVybyB0aGUgLmJzcyBzZWdtZW50ICovCisJCXhvcmwgJWVheCwlZWF4CisJCWxlYWwgX19ic3Nfc3RhcnRAR09UT0ZGKCVlYngpLCVlZGkKKwkJbGVhbCBfZW5kKzNAR09UT0ZGKCVlYngpLCVlY3gKKwkJc3VibCAlZWRpLCVlY3gKKwkJc2hybCAkMiwlZWN4CisJCXJlcCA7IHN0b3NsCisKKwkJLyogQ29weSBDT00zMiBpbnZvY2F0aW9uIHBhcmFtZXRlcnMgKi8KKwkJbGVhbCA0KCVlc3ApLCVlc2kJCSMgQXJndW1lbnQgbGlzdAorCQlsZWFsIF9fY29tMzJAR09UT0ZGKCVlYngpLCVlZGkKKwkJbW92bCAkKENPTTMyX0FSR1MpLCVlY3gKKwkJbW92bCAlZXNwLC00KCVlZGkpCQkjIFNhdmUgdGhlIGluaXRpYWwgc3RhY2sgcHRyCisJCWNtcGwgKCVlc2kpLCVlY3gKKwkJamJlIDVmCisJCW1vdmwgKCVlc2kpLCVlY3gKKzU6CQlpbmMgJWVjeAkJCSMgQ29weSB0aGUgYXJndW1lbnQgY291bnQsIHRvbworCQlyZXAgOyBtb3ZzbAorCisJCS8qIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgKGFzc3VtZXMgUkVHUEFSTSkgKi8KKwkJbW92bCBfX2NvbTMyKzRAR09UT0ZGKCVlYngpLCVlZHgJIyBDb21tYW5kIGxpbmUKKwkJcHVzaGwgJWVkeAkJCQkjIE1ha2Ugc3BhY2UgZm9yIGFyZ3YKKwkJbW92bCAlZXNwLCVlYXgKKwkJY2FsbCBfX3BhcnNlX2FyZ3YKKwkJcHVzaGwgJWVheAkJCQkjIFNhdmUgYXJnYworCisJCS8qIExvb2sgZm9yIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICovCisJCWxlYWwgX19jdG9yc19zdGFydEBHT1RPRkYoJWVieCksJWVzaQorCQlsZWFsIF9fY3RvcnNfZW5kQEdPVE9GRiglZWJ4KSwlZWRpCis2OgorCQljbXBsICVlZGksJWVzaQorCQlqYWUgN2YKKwkJY2FsbCAqKCVlc2kpCisJCWFkZGwgJDQsJWVzaQorCQlqbXAgNmIKKy8qCisgKiBBY3R1YWxseSBydW4gbWFpbi4gIFRoaXMgYXNzdW1lcyBSRUdQQVJNIGlzIHVzZWQhISEhCisgKi8KKzc6CisJCXBvcGwgJWVheAkJCSMgYXJnYworCQlwb3BsICVlZHgJCQkjIGFyZ3YKKwkJY2FsbCBtYWluCisJCWNhbGwgKl9fZXhpdF9oYW5kbGVyQEdPVE9GRiglZWJ4KQorCQlobHQKKwkJLnNpemUgX3N0YXJ0LCAuLV9zdGFydAorCisJCS5ic3MKKwkJLmdsb2JsIF9fZW50cnlfZXNwCitfX2VudHJ5X2VzcDoJLnNwYWNlIDQKKwkJLmdsb2JsIF9fY29tMzIKK19fY29tMzI6CS5zcGFjZSA0KihDT00zMl9BUkdTKzEpCmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL2Vycl9yZWFkLmMgYi9jb20zMi9saWIvc3lzL2Vycl9yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1NTVjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvZXJyX3JlYWQuYwpAQCAtMCwwICsxLDU1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZXJyX3JlYWQuYworICoKKyAqIFJlYWRpbmcgZnJvbSBhIGRldmljZSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgcmVhZGluZworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCitzdGF0aWMgc3NpemVfdCBfX2Vycl9yZWFkKHN0cnVjdCBmaWxlX2luZm8gKmZwLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICAodm9pZClmcDsKKyAgICAodm9pZClidWY7CisgICAgKHZvaWQpY291bnQ7CisgICAgZXJybm8gPSAtRUlOVkFMOworICAgIHJldHVybiAtMTsKK30KKworY29uc3Qgc3RydWN0IGlucHV0X2RldiBkZXZfZXJyb3JfciA9IHsKKyAgICAuZGV2X21hZ2ljID0gX19ERVZfTUFHSUMsCisgICAgLmZsYWdzID0gX19ERVZfSU5QVVQgfCBfX0RFVl9FUlJPUiwKKyAgICAuZmlsZWZsYWdzID0gT19SRE9OTFksCisgICAgLnJlYWQgPSBfX2Vycl9yZWFkLAorICAgIC5jbG9zZSA9IE5VTEwsCit9OwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9lcnJfd3JpdGUuYyBiL2NvbTMyL2xpYi9zeXMvZXJyX3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiNjBiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvZXJyX3dyaXRlLmMKQEAgLTAsMCArMSw1NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGVycl93cml0ZS5jCisgKgorICogV3JpdGluZyB0byBhIGRldmljZSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgd3JpdGluZworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCitzdGF0aWMgc3NpemVfdCBfX2Vycl93cml0ZShzdHJ1Y3QgZmlsZV9pbmZvICpmcCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgKHZvaWQpZnA7CisgICAgKHZvaWQpYnVmOworICAgICh2b2lkKWNvdW50OworICAgIGVycm5vID0gLUVJTlZBTDsKKyAgICByZXR1cm4gLTE7Cit9CisKK2NvbnN0IHN0cnVjdCBvdXRwdXRfZGV2IGRldl9lcnJvcl93ID0geworICAgIC5kZXZfbWFnaWMgPSBfX0RFVl9NQUdJQywKKyAgICAuZmxhZ3MgPSBfX0RFVl9PVVRQVVQgfCBfX0RFVl9FUlJPUiwKKyAgICAuZmlsZWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQVBQRU5ELAorICAgIC53cml0ZSA9IF9fZXJyX3dyaXRlLAorICAgIC5jbG9zZSA9IE5VTEwsCit9OwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9mYXJjYWxsLmMgYi9jb20zMi9saWIvc3lzL2ZhcmNhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQ5MDgzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9mYXJjYWxsLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGZhcmNhbGwuYworICovCisKKyNpbmNsdWRlIDxjb20zMi5oPgorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGVmbGFncyh2b2lkKQoreworICAgIC8vdWludDMyX3QgdjsKKworI2lmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA0CisgICAgdWludDMyX3QgdjsKKyAgICBhc20gdm9sYXRpbGUoInB1c2hmbCA7IHBvcGwgJTAiIDogIj1ybSIgKHYpKTsKKyNlbGlmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA4CisgICAgdWludDY0X3QgdjsKKyAgICBhc20gdm9sYXRpbGUoInB1c2hmcSA7IHBvcCAlMCIgOiAiPXJtIiAodikpOworI2Vsc2UKKyNlcnJvciAiVW5hYmxlIHRvIGJ1aWxkIGZvciB0by1iZS1kZWZpbmVkIGFyY2hpdGVjdHVyZSB0eXBlIgorI2VuZGlmCisgICAgcmV0dXJuIHY7Cit9CisKK3ZvaWQgX19mYXJjYWxsKHVpbnQxNl90IGNzLCB1aW50MTZfdCBpcCwKKwkgICAgICAgY29uc3QgY29tMzJzeXNfdCAqIGlyZWcsIGNvbTMyc3lzX3QgKiBvcmVnKQoreworICAgIGNvbTMyc3lzX3QgeHJlZyA9ICppcmVnOworCisgICAgLyogRW5hYmxlIGludGVycnVwdHMgaWYgYW5kIG9ubHkgaWYgdGhleSBhcmUgZW5hYmxlZCBpbiB0aGUgY2FsbGVyICovCisgICAgeHJlZy5lZmxhZ3MubCA9ICh4cmVnLmVmbGFncy5sICYgfkVGTEFHU19JRikgfCAoZWZsYWdzKCkgJiBFRkxBR1NfSUYpOworCisgICAgX19jb20zMi5jc19mYXJjYWxsKChjcyA8PCAxNikgKyBpcCwgJnhyZWcsIG9yZWcpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9maWxlLmggYi9jb20zMi9saWIvc3lzL2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzliNGYxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9maWxlLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBmaWxlLmgKKyAqCisgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBmaWxlIEkvTyBmb3IgQ09NMzIKKyAqLworCisjaWZuZGVmIF9DT00zMl9TWVNfRklMRV9ICisjZGVmaW5lIF9DT00zMl9TWVNfRklMRV9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRldi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzbGludXgvcG1hcGkuaD4KKworLyogRGV2aWNlIHN0cnVjdHVyZTsgY29udGFpbnMgdGhlIHJlbGV2YW50IG9wZXJhdGlvbnMgKi8KKworc3RydWN0IGZpbGVfaW5mbzsKKworI2RlZmluZSBfX0RFVl9NQUdJQwkweGY0ZTcKKyNkZWZpbmUgX19ERVZfVFRZCTB4MDAwMQkvKiBUVFkgLSBtdXN0IGJlIGJpdCAwICovCisjZGVmaW5lIF9fREVWX0ZJTEUJMHgwMDAyCS8qIE9yZGluYXJ5IGZpbGUgKi8KKyNkZWZpbmUgX19ERVZfT1VUUFVUCTB4MDAwNAkvKiBUaGlzIGlzIGFuIG91dHB1dCBkZXZpY2UgKi8KKyNkZWZpbmUgX19ERVZfSU5QVVQJMAkvKiBEdW1teSAqLworI2RlZmluZSBfX0RFVl9FUlJPUgkweDAwMDgJLyogVGhpcyBpcyB0aGUgZXJyb3IgZGV2aWNlICovCisjZGVmaW5lIF9fREVWX05VTEwJMHgwMDEwCS8qIFRoaXMgaXMgdGhlIG51bGwgZGV2aWNlICovCisKK3N0cnVjdCBpbnB1dF9kZXYgeworICAgIHVpbnQxNl90IGRldl9tYWdpYzsJCS8qIE1hZ2ljIG51bWJlciAqLworICAgIHVpbnQxNl90IGZsYWdzOwkJLyogRmxhZ3MgKi8KKyAgICBpbnQgZmlsZWZsYWdzOwkJLyogUGVybWl0dGVkIGZpbGUgZmxhZ3MgKi8KKyAgICBzc2l6ZV90ICgqcmVhZCkoc3RydWN0IGZpbGVfaW5mbyAqLCB2b2lkICosIHNpemVfdCk7CisgICAgaW50ICgqY2xvc2UpKHN0cnVjdCBmaWxlX2luZm8gKik7CisgICAgaW50ICgqb3Blbikoc3RydWN0IGZpbGVfaW5mbyAqKTsKK307CisKK3N0cnVjdCBvdXRwdXRfZGV2IHsKKyAgICB1aW50MTZfdCBkZXZfbWFnaWM7CQkvKiBNYWdpYyBudW1iZXIgKi8KKyAgICB1aW50MTZfdCBmbGFnczsJCS8qIEZsYWdzICovCisgICAgaW50IGZpbGVmbGFnczsKKyAgICBzc2l6ZV90ICgqd3JpdGUpKHN0cnVjdCBmaWxlX2luZm8gKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworICAgIGludCAoKmNsb3NlKShzdHJ1Y3QgZmlsZV9pbmZvICopOworICAgIGludCAoKm9wZW4pKHN0cnVjdCBmaWxlX2luZm8gKik7CisgICAgY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgKmZhbGxiYWNrOwkvKiBGYWxsYmFjayBvcHRpb24gZm9yIGNlcnRhaW4gY29uc29sZXMgKi8KK307CisKKy8qIEZpbGUgc3RydWN0dXJlICovCisKKyNkZWZpbmUgTkZJTEVTIDEyOAkJLyogTnVtYmVyIG9mIGZpbGVzIHRvIHN1cHBvcnQgKi8KKyNkZWZpbmUgTUFYQkxPQ0sgMTYzODQJCS8qIERlZmluZWQgYnkgQUJJICovCisKK3N0cnVjdCBmaWxlX2luZm8geworICAgIGNvbnN0IHN0cnVjdCBpbnB1dF9kZXYgKmlvcDsJLyogSW5wdXQgb3BlcmF0aW9ucyAqLworICAgIGNvbnN0IHN0cnVjdCBvdXRwdXRfZGV2ICpvb3A7CS8qIE91dHB1dCBvcGVyYXRpb25zICovCisKKyAgICAvKiBPdXRwdXQgZmlsZSBkYXRhICovCisgICAgc3RydWN0IHsKKwlpbnQgcm93cywgY29sczsJCS8qIFJvd3MgYW5kIGNvbHVtbnMgKi8KKyAgICB9IG87CisKKyAgICAvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgaW5wdXQgYmxvY2tpbmcgKi8KKyAgICBzdHJ1Y3QgeworCXN0cnVjdCBjb20zMl9maWxlZGF0YSBmZDsKKwlzaXplX3Qgb2Zmc2V0OwkJLyogQ3VycmVudCBmaWxlIG9mZnNldCAqLworCXNpemVfdCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIGJ1ZmZlciAqLworCWNoYXIgKmRhdGFwOwkJLyogQ3VycmVudCBkYXRhIHBvaW50ZXIgKi8KKwl2b2lkICpwdnQ7CQkvKiBQcml2YXRlIHBvaW50ZXIgZm9yIGRyaXZlciAqLworCWNoYXIgYnVmW01BWEJMT0NLXTsKKyAgICB9IGk7Cit9OworCitleHRlcm4gc3RydWN0IGZpbGVfaW5mbyBfX2ZpbGVfaW5mb1tORklMRVNdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbnB1dF9kZXYgX19maWxlX2RldjsKKworLyogTGluZSBpbnB1dCBkaXNjaXBsaW5lICovCitzc2l6ZV90IF9fbGluZV9pbnB1dChzdHJ1Y3QgZmlsZV9pbmZvICpmcCwgY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwKKwkJICAgICBzc2l6ZV90KCpnZXRfY2hhcikgKHN0cnVjdCBmaWxlX2luZm8gKiwgdm9pZCAqLCBzaXplX3QpKTsKKworI2VuZGlmIC8qIF9DT00zMl9TWVNfRklMRV9IICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL2ZpbGVjbG9zZS5jIGIvY29tMzIvbGliL3N5cy9maWxlY2xvc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTlkYmUzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9maWxlY2xvc2UuYwpAQCAtMCwwICsxLDQ2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZmlsZWNsb3NlLmMKKyAqCisgKiBDbG9zZSBhbiBvcmRpbmFyeSBmaWxlCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgImZpbGUuaCIKKworaW50IF9fZmlsZV9jbG9zZShzdHJ1Y3QgZmlsZV9pbmZvICpmcCkKK3sKKyAgICBpZiAoZnAtPmkuZmQuaGFuZGxlKQorCWNsb3NlX2ZpbGUoZnAtPmkuZmQuaGFuZGxlKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9maWxlaW5mby5jIGIvY29tMzIvbGliL3N5cy9maWxlaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZmM3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL2ZpbGVpbmZvLmMKQEAgLTAsMCArMSwzIEBACisjaW5jbHVkZSAiZmlsZS5oIgorCitzdHJ1Y3QgZmlsZV9pbmZvIF9fZmlsZV9pbmZvW05GSUxFU107CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL2ZpbGVyZWFkLmMgYi9jb20zMi9saWIvc3lzL2ZpbGVyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiMGNlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvZmlsZXJlYWQuYwpAQCAtMCwwICsxLDk5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmVhZC5jCisgKgorICogUmVhZGluZyBmcm9tIGEgZmlsZQorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8cG1hcGkuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9wbWFwaS5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgImZpbGUuaCIKKworaW50IF9fZmlsZV9nZXRfYmxvY2soc3RydWN0IGZpbGVfaW5mbyAqZnApCit7CisgICAgc3NpemVfdCBieXRlc19yZWFkOworCisgICAgYnl0ZXNfcmVhZCA9IHBtYXBpX3JlYWRfZmlsZSgmZnAtPmkuZmQuaGFuZGxlLCBmcC0+aS5idWYsCisJCQkJCSAgTUFYQkxPQ0sgPj4gZnAtPmkuZmQuYmxvY2tsZzIpOworICAgIGlmICghYnl0ZXNfcmVhZCkgeworCWVycm5vID0gRUlPOworCXJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgZnAtPmkubmJ5dGVzID0gYnl0ZXNfcmVhZDsKKyAgICBmcC0+aS5kYXRhcCAgPSBmcC0+aS5idWY7CisgICAgcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgX19maWxlX3JlYWQoc3RydWN0IGZpbGVfaW5mbyAqIGZwLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBjaGFyICpidWZwID0gYnVmOworICAgIHNzaXplX3QgbiA9IDA7CisgICAgc2l6ZV90IG5jb3B5OworCisgICAgd2hpbGUgKGNvdW50KSB7CisJaWYgKGZwLT5pLm5ieXRlcyA9PSAwKSB7CisJICAgIGlmIChmcC0+aS5vZmZzZXQgPj0gZnAtPmkuZmQuc2l6ZSB8fCAhZnAtPmkuZmQuaGFuZGxlKQorCQlyZXR1cm4gbjsJLyogQXMgZ29vZCBhcyBpdCBnZXRzLi4uICovCisKKwkgICAgaWYgKGNvdW50ID4gTUFYQkxPQ0spIHsKKwkJLyogTGFyZ2UgdHJhbnNmZXI6IGNvcHkgZGlyZWN0bHksIHdpdGhvdXQgYnVmZmVyaW5nICovCisJCW5jb3B5ID0gcG1hcGlfcmVhZF9maWxlKCZmcC0+aS5mZC5oYW5kbGUsIGJ1ZnAsCisJCQkJCQkgY291bnQgPj4gZnAtPmkuZmQuYmxvY2tsZzIpOworCQlpZiAoIW5jb3B5KSB7CisJCSAgICBlcnJubyA9IEVJTzsKKwkJICAgIHJldHVybiBuID8gbiA6IC0xOworCQl9CisKKwkJZ290byBnb3RfZGF0YTsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKF9fZmlsZV9nZXRfYmxvY2soZnApKQorCQkgICAgcmV0dXJuIG4gPyBuIDogLTE7CisJICAgIH0KKwl9CisKKwluY29weSA9IG1pbihjb3VudCwgZnAtPmkubmJ5dGVzKTsKKwltZW1jcHkoYnVmcCwgZnAtPmkuZGF0YXAsIG5jb3B5KTsKKworCWZwLT5pLmRhdGFwICs9IG5jb3B5OworCWZwLT5pLm9mZnNldCArPSBuY29weTsKKwlmcC0+aS5uYnl0ZXMgLT0gbmNvcHk7CisKKyAgICBnb3RfZGF0YToKKwluICs9IG5jb3B5OworCWJ1ZnAgKz0gbmNvcHk7CisJY291bnQgLT0gbmNvcHk7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL2ZzdGF0LmMgYi9jb20zMi9saWIvc3lzL2ZzdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlOGNhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvZnN0YXQuYwpAQCAtMCwwICsxLDYzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZnN0YXQuYworICoKKyAqIFZlcnkgdHJpdmlhbCBmc3RhdCBlbXVsYXRpb24KKyAqLworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImZpbGUuaCIKKworaW50IGZzdGF0KGludCBmZCwgc3RydWN0IHN0YXQgKmJ1ZikKK3sKKyAgICBzdHJ1Y3QgZmlsZV9pbmZvICpmcCA9ICZfX2ZpbGVfaW5mb1tmZF07CisKKyAgICBpZiAoZmQgPj0gTkZJTEVTIHx8ICFmcC0+aW9wKSB7CisJZXJybm8gPSBFQkFERjsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGZwLT5pb3AtPmZsYWdzICYgX19ERVZfRklMRSkgeworCWlmIChmcC0+aS5mZC5zaXplID09ICh1aW50MzJfdCkgLSAxKSB7CisJICAgIC8qIEZpbGUgb2YgdW5rbm93biBsZW5ndGgsIHJlcG9ydCBpdCBhcyBhIHNvY2tldAorCSAgICAgICAoaXQgcHJvYmFibHkgcmVhbGx5IGlzLCBhbnl3YXkhKSAqLworCSAgICBidWYtPnN0X21vZGUgPSBTX0lGU09DSyB8IDA0NDQ7CisJICAgIGJ1Zi0+c3Rfc2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkgICAgYnVmLT5zdF9tb2RlID0gU19JRlJFRyB8IDA0NDQ7CisJICAgIGJ1Zi0+c3Rfc2l6ZSA9IGZwLT5pLmZkLnNpemU7CisJfQorICAgIH0gZWxzZSB7CisJYnVmLT5zdF9tb2RlID0gU19JRkNIUiB8IDA2NjY7CisJYnVmLT5zdF9zaXplID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvZnRlbGwuYyBiL2NvbTMyL2xpYi9zeXMvZnRlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzFhOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9mdGVsbC5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBzeXMvZnRlbGwuYworICoKKyAqIFdlIGNhbid0IHNlZWssIGJ1dCB3ZSBjYW4gYXQgbGVhc3QgdGVsbC4uLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInN5cy9maWxlLmgiCisKK2xvbmcgZnRlbGwoRklMRSAqIHN0cmVhbSkKK3sKKyAgICBpbnQgZmQgPSBmaWxlbm8oc3RyZWFtKTsKKyAgICBzdHJ1Y3QgZmlsZV9pbmZvICpmcCA9ICZfX2ZpbGVfaW5mb1tmZF07CisKKyAgICByZXR1cm4gZnAtPmkub2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9ncHhlLmMgYi9jb20zMi9saWIvc3lzL2dweGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2MyYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9ncHhlLmMKQEAgLTAsMCArMSw0NyBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8c3lzL2dweGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9weGVfYXBpLmg+CisKK2Jvb2wgaXNfZ3B4ZSh2b2lkKQoreworICAgIGNvbnN0IHN0cnVjdCBzeXNsaW51eF92ZXJzaW9uICpzdjsKKyAgICBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0NIRUNLX0FQSSAqZmNhOworICAgIGJvb2wgZ3B4ZTsKKyAgICBpbnQgZXJyOworCisgICAgc3YgPSBzeXNsaW51eF92ZXJzaW9uKCk7CisgICAgaWYgKHN2LT5maWxlc3lzdGVtICE9IFNZU0xJTlVYX0ZTX1BYRUxJTlVYKQorICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAvKiBOb3QgUFhFTElOVVggKi8KKworICAgIGZjYSA9IGx6YWxsb2Moc2l6ZW9mICpmY2EpOworICAgIGlmICghZmNhKQorCXJldHVybiBmYWxzZTsKKworICAgIGZjYS0+U2l6ZSA9IHNpemVvZiAqZmNhOworICAgIGZjYS0+TWFnaWMgPSAweDkxZDQ0N2IyOworCisgICAgZXJyID0gcHhlX2NhbGwoUFhFTlZfRklMRV9BUElfQ0hFQ0ssIGZjYSk7CisKKyAgICBncHhlID0gdHJ1ZTsKKworICAgIGlmIChlcnIpCisJZ3B4ZSA9IGZhbHNlOyAgICAgICAgICAgLyogQ2Fubm90IGludm9rZSBQWEUgc3RhY2sgKi8KKworICAgIGlmIChmY2EtPlN0YXR1cykKKyAgICAgICAgZ3B4ZSA9IGZhbHNlOyAgICAgICAgICAgLyogUFhFIGZhaWx1cmUgKi8KKworICAgIGlmIChmY2EtPk1hZ2ljICE9IDB4ZTljMTdiMjApCisgICAgICAgIGdweGUgPSBmYWxzZTsgICAgICAgICAgIC8qIEluY29ycmVjdCBtYWdpYyAqLworCisgICAgaWYgKGZjYS0+U2l6ZSA8IHNpemVvZiAqZmNhKQorICAgICAgICBncHhlID0gZmFsc2U7ICAgICAgICAgICAvKiBTaG9ydCByZXR1cm4gKi8KKworICAgIC8qIFhYWDogVGhlIEFQSXMgdG8gdGVzdCBmb3Igc2hvdWxkIGJlIGEgcGFzc2VkLWluIG9wdGlvbiAqLworICAgIGlmICghKGZjYS0+QVBJTWFzayAmICgxIDw8IDUpKSkKKwlncHhlID0gZmFsc2U7ICAgICAgICAgICAvKiBObyBGSUxFIEVYRUMgKi8KKworICAgIGxmcmVlKGZjYSk7CisgICAgcmV0dXJuIGdweGU7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL2kzODYveDg2X2luaXRfZnB1LmMgYi9jb20zMi9saWIvc3lzL2kzODYveDg2X2luaXRfZnB1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzMzY5MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvaTM4Ni94ODZfaW5pdF9mcHUuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogeDg2X2hhc19mcHUuYworICoKKyAqIFRlc3QgZm9yIGFuIHg4NiBGUFUsIGFuZCBkbyBhbnkgbmVjZXNzYXJ5IHNldHVwLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9mcHUuaD4KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBnZXRfY3IwKHZvaWQpCit7CisgICAgdWludDMyX3QgdjsKK2FzbSgibW92bCAlJWNyMCwlMCI6Ij1yIih2KSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3IwKHVpbnQzMl90IHYpCit7CisgICAgYXNtIHZvbGF0aWxlICgibW92bCAlMCwlJWNyMCI6OiJyIiAodikpOworfQorCisjZGVmaW5lIENSMF9QRQkweDAwMDAwMDAxCisjZGVmaW5lIENSMF9NUCAgMHgwMDAwMDAwMgorI2RlZmluZSBDUjBfRU0gIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ1IwX1RTICAweDAwMDAwMDA4CisjZGVmaW5lIENSMF9FVCAgMHgwMDAwMDAxMAorI2RlZmluZSBDUjBfTkUgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQ1IwX1dQICAweDAwMDEwMDAwCisjZGVmaW5lIENSMF9BTSAgMHgwMDA0MDAwMAorI2RlZmluZSBDUjBfTlcgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQ1IwX0NEICAweDQwMDAwMDAwCisjZGVmaW5lIENSMF9QRyAgMHg4MDAwMDAwMAorCitpbnQgeDg2X2luaXRfZnB1KHZvaWQpCit7CisgICAgdWludDMyX3QgY3IwOworICAgIHVpbnQxNl90IGZzdyA9IDB4ZmZmZjsKKyAgICB1aW50MTZfdCBmY3cgPSAweGZmZmY7CisKKyAgICBjcjAgPSBnZXRfY3IwKCk7CisgICAgY3IwICY9IH4oQ1IwX0VNIHwgQ1IwX1RTKTsKKyAgICBjcjAgfD0gQ1IwX01QOworICAgIHNldF9jcjAoY3IwKTsKKworICAgIGFzbSB2b2xhdGlsZSAoImZuaW5pdCIpOworICAgIGFzbSB2b2xhdGlsZSAoImZuc3RzdyAlMCI6IittIiAoZnN3KSk7CisgICAgaWYgKGZzdyAhPSAwKQorCXJldHVybiAtMTsKKworICAgIGFzbSB2b2xhdGlsZSAoImZuc3RjdyAlMCI6IittIiAoZmN3KSk7CisgICAgaWYgKChmY3cgJiAweDEwM2YpICE9IDB4M2YpCisJcmV0dXJuIC0xOworCisgICAgLyogVGVjaGljYWxseSwgdGhpcyBjb3VsZCBiZSBhIDM4NiB3aXRoIGEgMjg3LiAgV2UgY291bGQgYWRkIGEgY2hlY2sKKyAgICAgICBmb3IgdGhhdCBoZXJlLi4uICovCisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvaW50Y2FsbC5jIGIvY29tMzIvbGliL3N5cy9pbnRjYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3YTM4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvaW50Y2FsbC5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBpbnRjYWxsLmMKKyAqLworCisjaW5jbHVkZSA8Y29tMzIuaD4KKwordm9pZCBfX2ludGNhbGwodWludDhfdCB2ZWN0b3IsIGNvbnN0IGNvbTMyc3lzX3QgKiBpcmVnLCBjb20zMnN5c190ICogb3JlZykKK3sKKyAgICBfX2NvbTMyLmNzX2ludGNhbGwodmVjdG9yLCBpcmVnLCBvcmVnKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvaXNhdHR5LmMgYi9jb20zMi9saWIvc3lzL2lzYXR0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDIxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL2lzYXR0eS5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpc2F0dHkuYworICoKKyAqIFJldHVybiBpZiB0aGlzIGlzIGEgdHR5IG9yIG5vdAorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlICJmaWxlLmgiCisKK2ludCBpc2F0dHkoaW50IGZkKQoreworICAgIHN0cnVjdCBmaWxlX2luZm8gKmZwID0gJl9fZmlsZV9pbmZvW2ZkXTsKKworICAgIGlmIChmZCA+PSBORklMRVMgfHwgIWZwLT5pb3ApIHsKKwllcnJubyA9IEVCQURGOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBfX0RFVl9UVFkgPT0gMSAqLworICAgIHJldHVybiAoZnAtPmlvcC0+ZmxhZ3MgJiBfX0RFVl9UVFkpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9saWJhbnNpLmMgYi9jb20zMi9saWIvc3lzL2xpYmFuc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDExY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9saWJhbnNpLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQW5zaSBTZXF1ZW5jZXMgY2FuIGJlIGZvdW5kIGhlcmUgOgorICogIGh0dHA6Ly9hc2NpaS10YWJsZS5jb20vYW5zaS1lc2NhcGUtc2VxdWVuY2VzLXZ0LTEwMC5waHAKKyAqICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhbnNpLmgiCisKK3ZvaWQgZGlzcGxheV9jdXJzb3IoYm9vbCBzdGF0dXMpCit7CisJaWYgKHN0YXR1cyA9PSB0cnVlKSB7CisJCWZwdXRzKENTSSAiPzI1aCIsIHN0ZG91dCk7CisJfSBlbHNlIHsKKwkJZnB1dHMoQ1NJICI/MjVsIiwgc3Rkb3V0KTsKKwl9Cit9CisKK3ZvaWQgY2xlYXJfZW5kX29mX2xpbmUodm9pZCkKK3sKKwlmcHV0cyhDU0kgIjBLIiwgc3Rkb3V0KTsKK30KKwordm9pZCBtb3ZlX2N1cnNvcl9sZWZ0KGludCBjb3VudCkKK3sKKwljaGFyIGJ1ZmZlclsxMF07CisJbWVtc2V0KGJ1ZmZlciwwLHNpemVvZihidWZmZXIpKTsKKwlzcHJpbnRmKGJ1ZmZlcixDU0kgIiVkRCIsY291bnQpOworCWZwdXRzKGJ1ZmZlciwgc3Rkb3V0KTsKK30KKwordm9pZCBtb3ZlX2N1cnNvcl9yaWdodChpbnQgY291bnQpCit7CisJY2hhciBidWZmZXJbMTBdOworCW1lbXNldChidWZmZXIsMCxzaXplb2YoYnVmZmVyKSk7CisJc3ByaW50ZihidWZmZXIsIENTSSAiJWRDIiwgY291bnQpOworCWZwdXRzKGJ1ZmZlciwgc3Rkb3V0KTsKK30KKwordm9pZCBzZXRfY3Vyc29yX2JsaW5rKGJvb2wgc3RhdHVzKSB7CisJaWYgKHN0YXR1cyA9PSB0cnVlKQorCQlmcHV0cygiXDAzM1swNW0iLHN0ZG91dCk7CisJZWxzZQorCQlmcHV0cygiXDAzM1swbSIsc3Rkb3V0KTsKK30KKwordm9pZCBjbGVhcl9saW5lKHZvaWQpCit7CisJZnB1dHMoQ1NJICIySyIsIHN0ZG91dCk7Cit9CisKK3ZvaWQgY2xlYXJfYmVnaW5uaW5nX29mX2xpbmUodm9pZCkKK3sKKwlmcHV0cyhDU0kgIjFLIiwgc3Rkb3V0KTsKK30KKwordm9pZCBtb3ZlX2N1cnNvcl90b19jb2x1bW4oaW50IGNvdW50KQoreworCWNoYXIgYnVmZmVyWzEwXTsKKyAgICAgICAgbWVtc2V0KGJ1ZmZlciwwLHNpemVvZihidWZmZXIpKTsKKwlzcHJpbnRmKGJ1ZmZlciwgQ1NJICIlZEciLCBjb3VudCk7CisJZnB1dHMoYnVmZmVyLCBzdGRvdXQpOworfQorCit2b2lkIG1vdmVfY3Vyc29yX3RvX25leHRfbGluZSh2b2lkKQoreworCWZwdXRzKCJcMDMzZSIsIHN0ZG91dCk7Cit9CisKK3ZvaWQgZGlzYWJsZV91dGY4KHZvaWQpCit7CisJZnB1dHMoIlwwMzMlQCIsIHN0ZG91dCk7Cit9CisKK3ZvaWQgc2V0X2cxX3NwZWNpYWxfY2hhcih2b2lkKXsKKwlmcHV0cygiXDAzMykwIiwgc3Rkb3V0KTsKK30KKwordm9pZCBzZXRfdXNfZzBfY2hhcnNldCh2b2lkKQoreworCWZwdXRzKCJcMDMzKEJcMSMwIiwgc3Rkb3V0KTsKK30KKwordm9pZCBjbGVhcl9lbnRpcmVfc2NyZWVuKHZvaWQpCit7CisJZnB1dHMoQ1NJICIySiIsIHN0ZG91dCk7Cit9CisKKy8qKgorICogY3ByaW50X3ZnYTJhbnNpIC0gZ2l2ZW4gYSBWR0EgYXR0cmlidXRlLCBwcmludCBhIGNoYXJhY3RlcgorICogQGNocjoJY2hhcmFjdGVyIHRvIHByaW50CisgKiBAYXR0cjoJdmdhIGF0dHJpYnV0ZQorICoKKyAqIENvbnZlcnQgdGhlIFZHQSBhdHRyaWJ1dGUgQGF0dHIgdG8gYW4gQU5TSSBlc2NhcGUgc2VxdWVuY2UgYW5kCisgKiBwcmludCBpdC4KKyAqIEZvciBwZXJmb3JtYW5jZSwgU0dSIHBhcmFtZXRlcnMgYXJlIGNhY2hlZC4gVG8gcmVzZXQgdGhlbSwKKyAqIGNhbGwgY3ByaW50X3ZnYTJhbnNpKCcwJywgJzAnKS4KKyAqKi8KK3N0YXRpYyB2b2lkIGNwcmludF92Z2EyYW5zaShjb25zdCBjaGFyIGNociwgY29uc3QgY2hhciBhdHRyKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGFuc2lfY2hhcls4XSA9ICIwNDI2MTUzNyI7CisJc3RhdGljIHVpbnQxNl90IGxhc3RfYXR0ciA9IDB4MzAwOworCWNoYXIgYnVmWzE2XSwgKnA7CisKKyAgICBpZiAoY2hyID09ICcwJyAmJiBhdHRyID09ICcwJykgeworICAgICAgICBsYXN0X2F0dHIgPSAweDMwMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCWlmIChhdHRyICE9IGxhc3RfYXR0cikgeworICAgICAgICBib29sIHJlc2V0ID0gZmFsc2U7CisJCXAgPSBidWY7CisJCSpwKysgPSAnXDAzMyc7CisJCSpwKysgPSAnWyc7CisKKwkJaWYgKGxhc3RfYXR0ciAmIH5hdHRyICYgMHg4OCkgeworCQkJKnArKyA9ICcwJzsKKwkJCSpwKysgPSAnOyc7CisJCQkvKiBSZXNldCBsYXN0X2F0dHIgdG8gdW5rbm93biB0byBoYW5kbGUKKwkJCSAqIGJhY2tncm91bmQvZm9yZWdyb3VuZCBhdHRyaWJ1dGVzIGNvcnJlY3RseSAqLworCQkJbGFzdF9hdHRyID0gMHgzMDA7CisgICAgICAgICAgICByZXNldCA9IHRydWU7CisJCX0KKwkJaWYgKGF0dHIgJiAweDA4KSB7CisJCQkqcCsrID0gJzEnOworCQkJKnArKyA9ICc7JzsKKwkJfQorCQlpZiAoYXR0ciAmIDB4ODApIHsKKwkJCSpwKysgPSAnNCc7CisJCQkqcCsrID0gJzsnOworCQl9CisJCWlmIChyZXNldCB8fCAoYXR0ciBeIGxhc3RfYXR0cikgJiAweDA3KSB7CisJCQkqcCsrID0gJzMnOworCQkJKnArKyA9IGFuc2lfY2hhclthdHRyICYgN107CisJCQkqcCsrID0gJzsnOworCQl9CisJCWlmIChyZXNldCB8fCAoYXR0ciBeIGxhc3RfYXR0cikgJiAweDcwKSB7CisJCQkqcCsrID0gJzQnOworCQkJKnArKyA9IGFuc2lfY2hhclsoYXR0ciA+PiA0KSAmIDddOworCQkJKnArKyA9ICc7JzsKKwkJfQorCQlwWy0xXSA9ICdtJzsJLyogV2UnbGwgaGF2ZSBnZW5lcmF0ZWQgYXQgbGVhc3Qgb25lIHNlbWljb2xvbiAqLworCQlwWzBdID0gJ1wwJzsKKworCQlsYXN0X2F0dHIgPSBhdHRyOworCisJCWZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKwl9CisKKwlwdXRjaGFyKGNocik7Cit9CisKKy8qCisgKiBjbHMgLSBjbGVhciBhbmQgaW5pdGlhbGl6ZSB0aGUgZW50aXJlIHNjcmVlbgorICoKKyAqIE5vdGU6IHdoZW4gaW5pdGlhbGl6aW5nIHh0ZXJtLCBvbmUgaGFzIHRvIHNwZWNpZnkgdGhhdAorICogRzEgcG9pbnRzIHRvIHRoZSBhbHRlcm5hdGUgY2hhcmFjdGVyIHNldCAodGhpcyBpcyBub3QgdHJ1ZQorICogYnkgZGVmYXVsdCkuIFdpdGhvdXQgdGhlIGluaXRpYWwgcHJpbnRmICJcMDMzKTAiLCBsaW5lIGRyYXdpbmcKKyAqIGNoYXJhY3RlcnMgd29uJ3QgYmUgZGlzcGxheWVkLgorICovCit2b2lkIGNscyh2b2lkKQoreworCWZwdXRzKCJcMDMzZVwwMzMlQFwwMzMpMFwwMzMoQlwxIzBcMDMzWz8yNWxcMDMzWzJKIiwgc3Rkb3V0KTsKKworICAgIC8qIFJlc2V0IFNHUiBwYXJhbWV0ZXJzIGNhY2hlICovCisgICAgY3ByaW50X3ZnYTJhbnNpKCcwJywgJzAnKTsKK30KKwordm9pZCByZXNldF9jb2xvcnModm9pZCkKK3sKKyAgICBjc3ByaW50KENTSSAiMUQiLCAweDA3KTsKK30KKworLyoqCisgKiBjcHJpbnQgLSBnaXZlbiBhIFZHQSBhdHRyaWJ1dGUsIHByaW50IGEgc2luZ2xlIGNoYXJhY3RlciBhdCBjdXJzb3IKKyAqIEBjaHI6CWNoYXJhY3RlciB0byBwcmludAorICogQGF0dHI6CVZHQSBhdHRyaWJ1dGUKKyAqIEB0aW1lczoJbnVtYmVyIG9mIHRpbWVzIHRvIHByaW50IEBjaHIKKyAqCisgKiBOb3RlOiBAYXR0ciBpcyBhIFZHQSBhdHRyaWJ1dGUuCisgKiovCit2b2lkIGNwcmludChjb25zdCBjaGFyIGNociwgY29uc3QgY2hhciBhdHRyLCB1bnNpZ25lZCBpbnQgdGltZXMpCit7CisJd2hpbGUgKHRpbWVzLS0pCisJCWNwcmludF92Z2EyYW5zaShjaHIsIGF0dHIpOworfQorCisvKioKKyAqIGNzcHJpbnQgLSBnaXZlbiBhIFZHQSBhdHRyaWJ1dGUsIHByaW50IGEgTlVMTC10ZXJtaW5hdGVkIHN0cmluZworICogQHN0cjoJc3RyaW5nIHRvIHByaW50CisgKiBAYXR0cjoJVkdBIGF0dHJpYnV0ZQorICoqLwordm9pZCBjc3ByaW50KGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciBhdHRyKQoreworCXdoaWxlICgqc3RyKSB7CisJCWNwcmludCgqc3RyLCBhdHRyLCAxKTsKKwkJc3RyKys7CisJfQorfQorCisvKioKKyAqIGNsZWFyd2luZG93IC0gZmlsbCBhIGdpdmVuIGEgcmVnaW9uIG9uIHRoZSBzY3JlZW4KKyAqIEB0b3AsIEBsZWZ0LCBAYm90LCBAcmlnaHQ6CWNvb3JkaW5hdGVzIHRvIGZpbGwKKyAqIEBmaWxsY2hhcjoJCQljaGFyYWN0ZXIgdG8gdXNlIHRvIGZpbGwgdGhlIHJlZ2lvbgorICogQGZpbGxhdHRyOgkJCWNoYXJhY3RlciBhdHRyaWJ1dGUgKFZHQSkKKyAqKi8KK3ZvaWQgY2xlYXJ3aW5kb3coY29uc3QgY2hhciB0b3AsIGNvbnN0IGNoYXIgbGVmdCwgY29uc3QgY2hhciBib3QsCisJCSBjb25zdCBjaGFyIHJpZ2h0LCBjb25zdCBjaGFyIGZpbGxjaGFyLCBjb25zdCBjaGFyIGZpbGxhdHRyKQoreworCWNoYXIgeDsKKwlmb3IgKHggPSB0b3A7IHggPCBib3QgKyAxOyB4KyspIHsKKwkJZ290b3h5KHgsIGxlZnQpOworCQljcHJpbnQoZmlsbGNoYXIsIGZpbGxhdHRyLCByaWdodCAtIGxlZnQgKyAxKTsKKwl9Cit9CisKKwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9saW5lX2lucHV0LmMgYi9jb20zMi9saWIvc3lzL2xpbmVfaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGM5OTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9saW5lX2lucHV0LmMKQEAgLTAsMCArMSw5MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGxpbmVfaW5wdXQuYworICoKKyAqIExpbmUtb3JpZW50ZWQgaW5wdXQgZGlzY3VwbGluZQorICovCisKKyNpbmNsdWRlICJmaWxlLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9pZGxlLmg+CisKK3NzaXplX3QgX19saW5lX2lucHV0KHN0cnVjdCBmaWxlX2luZm8gKiBmcCwgY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwKKwkJICAgICBzc2l6ZV90KCpnZXRfY2hhcikgKHN0cnVjdCBmaWxlX2luZm8gKiwgdm9pZCAqLCBzaXplX3QpKQoreworICAgIHNpemVfdCBuID0gMDsKKyAgICBjaGFyIGNoOworICAgIGludCBydjsKKyAgICBzc2l6ZV90KCpjb25zdCBXcml0ZSkgKHN0cnVjdCBmaWxlX2luZm8gKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpID0KKwlmcC0+b29wLT53cml0ZTsKKworICAgIGZvciAoOzspIHsKKwlydiA9IGdldF9jaGFyKGZwLCAmY2gsIDEpOworCisJaWYgKHJ2ICE9IDEpIHsKKwkgICAgc3lzbGludXhfaWRsZSgpOworCSAgICBjb250aW51ZTsKKwl9CisKKwlzd2l0Y2ggKGNoKSB7CisJY2FzZSAnXG4nOgkJLyogSWdub3JlIGluY29taW5nIGxpbmVmZWVkICovCisJICAgIGJyZWFrOworCisJY2FzZSAnXHInOgorCSAgICAqYnVmID0gJ1xuJzsKKwkgICAgV3JpdGUoZnAsICJcbiIsIDEpOworCSAgICByZXR1cm4gbiArIDE7CisKKwljYXNlICdcYic6CisJICAgIGlmIChuID4gMCkgeworCQluLS07CisJCWJ1Zi0tOworCQlXcml0ZShmcCwgIlxiIFxiIiwgMyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICdceDE1JzoJCS8qIEN0cmwtVSAqLworCSAgICB3aGlsZSAobikgeworCQluLS07CisJCWJ1Zi0tOworCQlXcml0ZShmcCwgIlxiIFxiIiwgMyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBpZiAobiA8IGJ1ZnNpemUgLSAxKSB7CisJCSpidWYgPSBjaDsKKwkJV3JpdGUoZnAsIGJ1ZiwgMSk7CisJCW4rKzsKKwkJYnVmKys7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvbW9kdWxlL2NvbW1vbi5jIGIvY29tMzIvbGliL3N5cy9tb2R1bGUvY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhMjdlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvbW9kdWxlL2NvbW1vbi5jCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogY29tbW9uLmMKKyAqCisgKiAgQ3JlYXRlZCBvbjogQXVnIDExLCAyMDA4CisgKiAgICAgIEF1dGhvcjogU3RlZmFuIEJ1Y3VyIDxzdGVmYW5iQHp5dG9yLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmcy5oPgorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4KKworI2luY2x1ZGUgImVsZnV0aWxzLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qKgorICogVGhlIG9uZSBhbmQgb25seSBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzCisgKi8KK0xJU1RfSEVBRChtb2R1bGVzX2hlYWQpOworCisvLyBVc2VyLXNwYWNlIGRlYnVnZ2luZyByb3V0aW5lcworI2lmZGVmIEVMRl9ERUJVRwordm9pZCBwcmludF9lbGZfZWhkcihFbGZfRWhkciAqZWhkcikgeworCWludCBpOworCisJZnByaW50ZihzdGRlcnIsICJJZGVudGlmaWNhdGlvbjpcdCIpOworCWZvciAoaT0wOyBpIDwgRUlfTklERU5UOyBpKyspIHsKKwkJcHJpbnRmKCIlZCAiLCBlaGRyLT5lX2lkZW50W2ldKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiVHlwZTpcdFx0JXVcbiIsIGVoZHItPmVfdHlwZSk7CisJZnByaW50ZihzdGRlcnIsICJNYWNoaW5lOlx0JXVcbiIsIGVoZHItPmVfbWFjaGluZSk7CisJZnByaW50ZihzdGRlcnIsICJWZXJzaW9uOlx0JXVcbiIsIGVoZHItPmVfdmVyc2lvbik7CisJZnByaW50ZihzdGRlcnIsICJFbnRyeTpcdFx0MHglMDh4XG4iLCBlaGRyLT5lX2VudHJ5KTsKKwlmcHJpbnRmKHN0ZGVyciwgIlBIVCBPZmZzZXQ6XHQweCUwOHhcbiIsIGVoZHItPmVfcGhvZmYpOworCWZwcmludGYoc3RkZXJyLCAiU0hUIE9mZnNldDpcdDB4JTA4eFxuIiwgZWhkci0+ZV9zaG9mZik7CisJLy9mcHJpbnRmKHN0ZGVyciwgIkZsYWdzOlx0XHQldVxuIiwgZWhkci0+ZV9mbGFncyk7CisJLy9mcHJpbnRmKHN0ZGVyciwgIkhlYWRlciBzaXplOlx0JXUgKFN0cnVjdHVyZSBzaXplOiAldSlcbiIsIGVoZHItPmVfZWhzaXplLHNpemVvZihFbGZfRWhkcikpOworCWZwcmludGYoc3RkZXJyLCAicGhudW06ICVkIHNobnVtOiAlZFxuIiwgZWhkci0+ZV9waG51bSwKKwkJZWhkci0+ZV9zaG51bSk7Cit9CisKK3ZvaWQgcHJpbnRfZWxmX3N5bWJvbHMoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSkgeworCXVuc2lnbmVkIGludCBpOworCUVsZl9TeW0gKmNydF9zeW07CisKKwlmb3IgKGkgPSAxOyBpIDwgbW9kdWxlLT5zeW10YWJsZV9zaXplL21vZHVsZS0+c3ltZW50X3NpemU7IGkrKykKKwl7CisJCWNydF9zeW0gPSAoRWxmX1N5bSopKG1vZHVsZS0+c3ltX3RhYmxlICsgaSptb2R1bGUtPnN5bWVudF9zaXplKTsKKworCQlmcHJpbnRmKHN0ZGVyciwiJXMgJWRcbiIsIG1vZHVsZS0+c3RyX3RhYmxlICsgY3J0X3N5bS0+c3RfbmFtZSwgY3J0X3N5bS0+c3RfdmFsdWUpOworCisJfQorfQorI2VuZGlmIC8vRUxGX0RFQlVHCisKK0ZJTEUgKmZpbmRwYXRoKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHBhdGhfZW50cnkgKmVudHJ5OworCWNoYXIgcGF0aFtGSUxFTkFNRV9NQVhdOworCUZJTEUgKmY7CisKKwlmID0gZm9wZW4obmFtZSwgInJiIik7IC8qIGZvciBmdWxsIHBhdGggKi8KKwlpZiAoZikKKwkJcmV0dXJuIGY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmUEFUSCwgbGlzdCkgeworCQlib29sIHNsYXNoID0gZmFsc2U7CisKKwkJLyogRW5zdXJlIHdlIGhhdmUgYSAnLycgc2VwYXJhdG9yICovCisJCWlmIChlbnRyeS0+c3RyW3N0cmxlbihlbnRyeS0+c3RyKSAtIDFdICE9ICcvJykKKwkJCXNsYXNoID0gdHJ1ZTsKKworCQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcyVzJXMiLAorCQkJIGVudHJ5LT5zdHIsIHNsYXNoID8gIi8iIDogIiIsIG5hbWUpOworCisJCWRwcmludGYoImZpbmRwYXRoOiB0cnlpbmcgXCIlc1wiXG4iLCBwYXRoKTsKKwkJZiA9IGZvcGVuKHBhdGgsICJyYiIpOworCQlpZiAoZikKKwkJCXJldHVybiBmOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogSW1hZ2UgZmlsZXMgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCisgKi8KKworaW50IGltYWdlX2xvYWQoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSkKK3sKKwltb2R1bGUtPnUubC5fZmlsZSA9IGZpbmRwYXRoKG1vZHVsZS0+bmFtZSk7CisKKwlpZiAobW9kdWxlLT51LmwuX2ZpbGUgPT0gTlVMTCkgeworCQlkcHJpbnRmKCJDb3VsZCBub3Qgb3BlbiBvYmplY3QgZmlsZSAnJXMnXG4iLCBtb2R1bGUtPm5hbWUpOworCQlnb3RvIGVycm9yOworCX0KKworCW1vZHVsZS0+dS5sLl9jcl9vZmZzZXQgPSAwOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChtb2R1bGUtPnUubC5fZmlsZSAhPSBOVUxMKSB7CisJCWZjbG9zZShtb2R1bGUtPnUubC5fZmlsZSk7CisJCW1vZHVsZS0+dS5sLl9maWxlID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKworaW50IGltYWdlX3VubG9hZChzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKSB7CisJaWYgKG1vZHVsZS0+dS5sLl9maWxlICE9IE5VTEwpIHsKKwkJZmNsb3NlKG1vZHVsZS0+dS5sLl9maWxlKTsKKwkJbW9kdWxlLT51LmwuX2ZpbGUgPSBOVUxMOworCisJfQorCW1vZHVsZS0+dS5sLl9jcl9vZmZzZXQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpbWFnZV9yZWFkKHZvaWQgKmJ1ZmYsIHNpemVfdCBzaXplLCBzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKSB7CisJc2l6ZV90IHJlc3VsdCA9IGZyZWFkKGJ1ZmYsIHNpemUsIDEsIG1vZHVsZS0+dS5sLl9maWxlKTsKKworCWlmIChyZXN1bHQgPCAxKQorCQlyZXR1cm4gLTE7CisKKwltb2R1bGUtPnUubC5fY3Jfb2Zmc2V0ICs9IHNpemU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpbWFnZV9za2lwKHNpemVfdCBzaXplLCBzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKSB7CisJdm9pZCAqc2tpcF9idWZmID0gTlVMTDsKKwlzaXplX3QgcmVzdWx0OworCisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlza2lwX2J1ZmYgPSBtYWxsb2Moc2l6ZSk7CisJcmVzdWx0ID0gZnJlYWQoc2tpcF9idWZmLCBzaXplLCAxLCBtb2R1bGUtPnUubC5fZmlsZSk7CisJZnJlZShza2lwX2J1ZmYpOworCisJaWYgKHJlc3VsdCA8IDEpCisJCXJldHVybiAtMTsKKworCW1vZHVsZS0+dS5sLl9jcl9vZmZzZXQgKz0gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IGltYWdlX3NlZWsoRWxmX09mZiBvZmZzZXQsIHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpIHsKKwlpZiAob2Zmc2V0IDwgbW9kdWxlLT51LmwuX2NyX29mZnNldCkgLy8gQ2Fubm90IHNlZWsgYmFja3dhcmRzCisJCXJldHVybiAtMTsKKworCXJldHVybiBpbWFnZV9za2lwKG9mZnNldCAtIG1vZHVsZS0+dS5sLl9jcl9vZmZzZXQsIG1vZHVsZSk7Cit9CisKKworLy8gSW5pdGlhbGl6YXRpb24gb2YgdGhlIG1vZHVsZSBzdWJzeXN0ZW0KK2ludCBtb2R1bGVzX2luaXQodm9pZCkgeworCXJldHVybiAwOworfQorCisvLyBUZXJtaW5hdGlvbiBvZiB0aGUgbW9kdWxlIHN1YnN5c3RlbQordm9pZCBtb2R1bGVzX3Rlcm0odm9pZCkgeworCit9CisKKy8vIEFsbG9jYXRlcyB0aGUgc3RydWN0dXJlIGZvciBhIG5ldyBtb2R1bGUKK3N0cnVjdCBlbGZfbW9kdWxlICptb2R1bGVfYWxsb2MoY29uc3QgY2hhciAqbmFtZSkgeworCXN0cnVjdCBlbGZfbW9kdWxlICpyZXN1bHQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbGZfbW9kdWxlKSk7CisKKwlpZiAoIXJlc3VsdCkgeworCSAgICBkcHJpbnRmKCJtb2R1bGU6IEZhaWxlZCB0byBhbGxvYyBlbGZfbW9kdWxlXG4iKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZW9mKHN0cnVjdCBlbGZfbW9kdWxlKSk7CisKKwlJTklUX0xJU1RfSEVBRCgmcmVzdWx0LT5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcmVzdWx0LT5yZXF1aXJlZCk7CisJSU5JVF9MSVNUX0hFQUQoJnJlc3VsdC0+ZGVwZW5kYW50cyk7CisKKwlzdHJuY3B5KHJlc3VsdC0+bmFtZSwgbmFtZSwgTU9EVUxFX05BTUVfU0laRSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgbW9kdWxlX2RlcCAqbW9kdWxlX2RlcF9hbGxvYyhzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKSB7CisJc3RydWN0IG1vZHVsZV9kZXAgKnJlc3VsdCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG1vZHVsZV9kZXApKTsKKworCUlOSVRfTElTVF9IRUFEICgmcmVzdWx0LT5saXN0KTsKKworCXJlc3VsdC0+bW9kdWxlID0gbW9kdWxlOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZV9maW5kKGNvbnN0IGNoYXIgKm5hbWUpIHsKKwlzdHJ1Y3QgZWxmX21vZHVsZSAqY3JfbW9kdWxlOworCisJZm9yX2VhY2hfbW9kdWxlKGNyX21vZHVsZSkgeworCQlpZiAoc3RyY21wKGNyX21vZHVsZS0+bmFtZSwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiBjcl9tb2R1bGU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworLy8gTW91bGk6IFRoaXMgaXMgY2hlY2tpbmcgdGhlIGhlYWRlciBmb3IgMzJiaXQgbWFjaGluZQorLy8gU3VwcG9ydCA2NGJpdCBhcmNoaXRlY3R1cmUgYXMgd2VsbC4KKy8vIFBhcnRzIG9mIHRoZSBFTEYgaGVhZGVyIGNoZWNrZWQgYXJlIGNvbW1vbiB0byBib3RoIEVMRjMyIGFuZCBFTEY2NAorLy8gQWRkaW5nIHNpbXBsZSBjaGVja3MgZm9yIGJvdGggMzJiaXQgYW5kIDY0Yml0IHNob3VsZCB3b3JrIChob3BlZnVsbHkpCisvLworLy8gUGVyZm9ybXMgdmVyaWZpY2F0aW9ucyBvbiBFTEYgaGVhZGVyIHRvIGFzc3VyZSB0aGF0IHRoZSBvcGVuIGZpbGUgaXMgYQorLy8gdmFsaWQgU1lTTElOVVggRUxGIG1vZHVsZS4KK2ludCBjaGVja19oZWFkZXJfY29tbW9uKEVsZl9FaGRyICplbGZfaGRyKSB7CisJLy8gQ2hlY2sgdGhlIGhlYWRlciBtYWdpYworCWlmIChlbGZfaGRyLT5lX2lkZW50W0VJX01BRzBdICE9IEVMRk1BRzAgfHwKKwkJZWxmX2hkci0+ZV9pZGVudFtFSV9NQUcxXSAhPSBFTEZNQUcxIHx8CisJCWVsZl9oZHItPmVfaWRlbnRbRUlfTUFHMl0gIT0gRUxGTUFHMiB8fAorCQllbGZfaGRyLT5lX2lkZW50W0VJX01BRzNdICE9IEVMRk1BRzMpIHsKKworCQlkcHJpbnRmKCJUaGUgZmlsZSBpcyBub3QgYW4gRUxGIG9iamVjdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZWxmX2hkci0+ZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1MzMiAmJgorCSAgICBlbGZfaGRyLT5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzY0KSB7CisJCWRwcmludGYoIkludmFsaWQgRUxGIGNsYXNzIGNvZGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGVsZl9oZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gTU9EVUxFX0VMRl9EQVRBKSB7CisJCWRwcmludGYoIkludmFsaWQgRUxGIGRhdGEgZW5jb2RpbmdcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGVsZl9oZHItPmVfaWRlbnRbRUlfVkVSU0lPTl0gIT0gTU9EVUxFX0VMRl9WRVJTSU9OIHx8CisJCQllbGZfaGRyLT5lX3ZlcnNpb24gIT0gTU9EVUxFX0VMRl9WRVJTSU9OKSB7CisJCWRwcmludGYoIkludmFsaWQgRUxGIGZpbGUgdmVyc2lvblxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZWxmX2hkci0+ZV9tYWNoaW5lICE9IEVNXzM4NiAmJgorCQllbGZfaGRyLT5lX21hY2hpbmUgIT0gRU1fWDg2XzY0KSB7CisJCWRwcmludGYoIkludmFsaWQgRUxGIGFyY2hpdGVjdHVyZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKK2ludCBlbmZvcmNlX2RlcGVuZGVuY3koc3RydWN0IGVsZl9tb2R1bGUgKnJlcSwgc3RydWN0IGVsZl9tb2R1bGUgKmRlcCkgeworCXN0cnVjdCBtb2R1bGVfZGVwICpjcnRfZGVwOworCXN0cnVjdCBtb2R1bGVfZGVwICpuZXdfZGVwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRfZGVwLCAmcmVxLT5kZXBlbmRhbnRzLCBsaXN0KSB7CisJCWlmIChjcnRfZGVwLT5tb2R1bGUgPT0gZGVwKSB7CisJCQkvLyBUaGUgZGVwZW5kZW5jeSBpcyBhbHJlYWR5IGVuZm9yY2VkCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCW5ld19kZXAgPSBtb2R1bGVfZGVwX2FsbG9jKHJlcSk7CisJbGlzdF9hZGQoJm5ld19kZXAtPmxpc3QsICZkZXAtPnJlcXVpcmVkKTsKKworCW5ld19kZXAgPSBtb2R1bGVfZGVwX2FsbG9jKGRlcCk7CisJbGlzdF9hZGQoJm5ld19kZXAtPmxpc3QsICZyZXEtPmRlcGVuZGFudHMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjbGVhcl9kZXBlbmRlbmN5KHN0cnVjdCBlbGZfbW9kdWxlICpyZXEsIHN0cnVjdCBlbGZfbW9kdWxlICpkZXApIHsKKwlzdHJ1Y3QgbW9kdWxlX2RlcCAqY3J0X2RlcCA9IE5VTEw7CisJaW50IGZvdW5kID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0X2RlcCwgJnJlcS0+ZGVwZW5kYW50cywgbGlzdCkgeworCQlpZiAoY3J0X2RlcC0+bW9kdWxlID09IGRlcCkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZm91bmQpIHsKKwkJbGlzdF9kZWwoJmNydF9kZXAtPmxpc3QpOworCQlmcmVlKGNydF9kZXApOworCX0KKworCWZvdW5kID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0X2RlcCwgJmRlcC0+cmVxdWlyZWQsIGxpc3QpIHsKKwkJaWYgKGNydF9kZXAtPm1vZHVsZSA9PSByZXEpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZvdW5kKSB7CisJCWxpc3RfZGVsKCZjcnRfZGVwLT5saXN0KTsKKwkJZnJlZShjcnRfZGVwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNoZWNrX3N5bWJvbHMoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlFbGZfU3ltICpjcnRfc3ltID0gTlVMTCwgKnJlZl9zeW0gPSBOVUxMOworCWNoYXIgKmNydF9uYW1lOworCXN0cnVjdCBlbGZfbW9kdWxlICpjcnRfbW9kdWxlOworCisJaW50IHN0cm9uZ19jb3VudDsKKwlpbnQgd2Vha19jb3VudDsKKworCWZvciAoaSA9IDE7IGkgPCBtb2R1bGUtPnN5bXRhYmxlX3NpemUvbW9kdWxlLT5zeW1lbnRfc2l6ZTsgaSsrKQorCXsKKwkJY3J0X3N5bSA9IHN5bWJvbF9nZXRfZW50cnkobW9kdWxlLCBpKTsKKwkJY3J0X25hbWUgPSBtb2R1bGUtPnN0cl90YWJsZSArIGNydF9zeW0tPnN0X25hbWU7CisKKwkJc3Ryb25nX2NvdW50ID0gMDsKKwkJd2Vha19jb3VudCA9IChFTEYzMl9TVF9CSU5EKGNydF9zeW0tPnN0X2luZm8pID09IFNUQl9XRUFLKTsKKworCQlmb3JfZWFjaF9tb2R1bGUoY3J0X21vZHVsZSkKKwkJeworCQkJcmVmX3N5bSA9IG1vZHVsZV9maW5kX3N5bWJvbChjcnRfbmFtZSwgY3J0X21vZHVsZSk7CisKKwkJCS8vIElmIHdlIGZvdW5kIGEgZGVmaW5pdGlvbiBmb3Igb3VyIHN5bWJvbC4uLgorCQkJaWYgKHJlZl9zeW0gIT0gTlVMTCAmJiByZWZfc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpCisJCQl7CisJCQkJc3dpdGNoIChFTEYzMl9TVF9CSU5EKHJlZl9zeW0tPnN0X2luZm8pKQorCQkJCXsKKwkJCQkJY2FzZSBTVEJfR0xPQkFMOgorCQkJCQkJc3Ryb25nX2NvdW50Kys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTVEJfV0VBSzoKKwkJCQkJCXdlYWtfY291bnQrKzsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChjcnRfc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCisJCXsKKwkJCS8vIFdlIGhhdmUgYW4gdW5kZWZpbmVkIHN5bWJvbAorCQkJLy8KKwkJCS8vIFdlIHVzZSB0aGUgd2Vha19jb3VudCB0byBkaWZmZXJlbnRpYXRlCisJCQkvLyBiZXR3ZWVuIFN5c2xpbnV4LWRlcml2YXRpdmUtc3BlY2lmaWMKKwkJCS8vIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGUsIHVubG9hZF9weGUoKSBpcworCQkJLy8gb25seSBwcm92aWRlZCBieSBQWEVMSU5VWCwgc28gd2UgbWFyayBpdCBhcworCQkJLy8gX193ZWFrIGFuZCByZXBsYWNlIGl0IHdpdGggYSByZWZlcmVuY2UgdG8KKwkJCS8vIHVuZGVmaW5lZF9zeW1ib2woKSBvbiBTWVNMSU5VWCwgRVhUTElOVVgsCisJCQkvLyBhbmQgSVNPTElOVVguIFNlZSBwZXJmb3JtX3JlbG9jYXRpb25zKCkuCisJCQlpZiAoc3Ryb25nX2NvdW50ID09IDAgJiYgd2Vha19jb3VudCA9PSAwKQorCQkJeworCQkJCWRwcmludGYoIlN5bWJvbCAlcyBpcyB1bmRlZmluZWRcbiIsIGNydF9uYW1lKTsKKwkJCQlwcmludGYoIlVuZGVmIHN5bWJvbCBGQUlMOiAlc1xuIixjcnRfbmFtZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHN0cm9uZ19jb3VudCA+IDAgJiYgRUxGMzJfU1RfQklORChyZWZfc3ltLT5zdF9pbmZvKSA9PSBTVEJfR0xPQkFMKQorCQkJeworCQkJCS8vIEl0J3Mgbm90IGFuIGVycm9yIC0gYXQgcmVsb2NhdGlvbiwgdGhlIG1vc3QgcmVjZW50IHN5bWJvbAorCQkJCS8vIHdpbGwgYmUgY29uc2lkZXJlZAorCQkJCWRwcmludGYoIkluZm86IFN5bWJvbCAlcyBpcyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlXG4iLCBjcnRfbmFtZSk7CisJCQl9CisJCX0KKwkJLy9wcmludGYoInN5bWJvbCAlcyBsYW9kZWQgZnJvbSAlZFxuIixjcnRfbmFtZSxjcnRfc3ltLT5zdF92YWx1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtb2R1bGVfdW5sb2FkYWJsZShzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKSB7CisJaWYgKCFsaXN0X2VtcHR5KCZtb2R1bGUtPmRlcGVuZGFudHMpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisKKy8vIFVubG9hZHMgdGhlIG1vZHVsZSBmcm9tIHRoZSBzeXN0ZW0gYW5kIHJlbGVhc2VzIGFsbCB0aGUgYXNzb2NpYXRlZCBtZW1vcnkKK2ludCBfbW9kdWxlX3VubG9hZChzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKSB7CisJc3RydWN0IG1vZHVsZV9kZXAgKmNydF9kZXAsICp0bXA7CisJLy8gTWFrZSBzdXJlIG5vYm9keSBuZWVkcyB1cworCWlmICghbW9kdWxlX3VubG9hZGFibGUobW9kdWxlKSkgeworCQlkcHJpbnRmKCJNb2R1bGUgaXMgcmVxdWlyZWQgYnkgb3RoZXIgbW9kdWxlcy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLy8gUmVtb3ZlIGFueSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNydF9kZXAsIHRtcCwgJm1vZHVsZS0+cmVxdWlyZWQsIGxpc3QpIHsKKwkJY2xlYXJfZGVwZW5kZW5jeShjcnRfZGVwLT5tb2R1bGUsIG1vZHVsZSk7CisJfQorCisJLy8gUmVtb3ZlIHRoZSBtb2R1bGUgZnJvbSB0aGUgbW9kdWxlIGxpc3QKKwlsaXN0X2RlbF9pbml0KCZtb2R1bGUtPmxpc3QpOworCisJLy8gUmVsZWFzZSB0aGUgbG9hZGVkIHNlZ21lbnRzIG9yIHNlY3Rpb25zCisJaWYgKG1vZHVsZS0+bW9kdWxlX2FkZHIgIT0gTlVMTCkgeworCQllbGZfZnJlZShtb2R1bGUtPm1vZHVsZV9hZGRyKTsKKworCQlkcHJpbnRmKCIlcyBNT0RVTEUgJXMgVU5MT0FERURcbiIsIG1vZHVsZS0+c2hhbGxvdyA/ICJTSEFMTE9XIiA6ICIiLAorCQkJCW1vZHVsZS0+bmFtZSk7CisJfQorCisJZHByaW50ZigiVW5sb2FkaW5nIG1vZHVsZSAlc1xuIiwgbW9kdWxlLT5uYW1lKTsKKwkvLyBSZWxlYXNlIHRoZSBtb2R1bGUgc3RydWN0dXJlCisJZnJlZShtb2R1bGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtb2R1bGVfdW5sb2FkKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpIHsKKwltb2R1bGVfY3Rvcl90ICpkdG9yOworCisJZm9yIChkdG9yID0gbW9kdWxlLT5kdG9yczsgZHRvciAmJiAqZHRvcjsgZHRvcisrKQorCQkoKmR0b3IpICgpOworCisJcmV0dXJuIF9tb2R1bGVfdW5sb2FkKG1vZHVsZSk7Cit9CisKK3N0cnVjdCBlbGZfbW9kdWxlICp1bmxvYWRfbW9kdWxlc19zaW5jZShjb25zdCBjaGFyICpuYW1lKSB7CisJc3RydWN0IGVsZl9tb2R1bGUgKm0sICptb2QsICpiZWdpbiA9IE5VTEw7CisKKwlmb3JfZWFjaF9tb2R1bGUobW9kKSB7CisJCWlmICghc3RyY21wKG1vZC0+bmFtZSwgbmFtZSkpIHsKKwkJCWJlZ2luID0gbW9kOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWJlZ2luKQorCQlyZXR1cm4gYmVnaW47CisKKwlmb3JfZWFjaF9tb2R1bGVfc2FmZShtb2QsIG0pIHsKKwkJaWYgKG1vZCA9PSBiZWdpbikKKwkJCWJyZWFrOworCisJCWlmIChtb2QgIT0gYmVnaW4pCisJCQltb2R1bGVfdW5sb2FkKG1vZCk7CisJfQorCisJcmV0dXJuIGJlZ2luOworfQorCitzdGF0aWMgRWxmX1N5bSAqbW9kdWxlX2ZpbmRfc3ltYm9sX3N5c3YoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSkgeworCXVuc2lnbmVkIGxvbmcgaCA9IGVsZl9oYXNoKChjb25zdCB1bnNpZ25lZCBjaGFyKiluYW1lKTsKKwlFbGZfV29yZCAqY3Jfd29yZCA9IG1vZHVsZS0+aGFzaF90YWJsZTsKKworCUVsZl9Xb3JkIG5idWNrZXQgPSAqY3Jfd29yZCsrOworCWNyX3dvcmQrKzsgLy8gU2tpcCBuY2hhaW4KKworCUVsZl9Xb3JkICpia3QgPSBjcl93b3JkOworCUVsZl9Xb3JkICpjaG4gPSBjcl93b3JkICsgbmJ1Y2tldDsKKworCUVsZl9Xb3JkIGNydF9pbmRleCA9IGJrdFtoICUgbW9kdWxlLT5oYXNoX3RhYmxlWzBdXTsKKwlFbGZfU3ltICpjcnRfc3ltOworCisKKwl3aGlsZSAoY3J0X2luZGV4ICE9IFNUTl9VTkRFRikgeworCQljcnRfc3ltID0gc3ltYm9sX2dldF9lbnRyeShtb2R1bGUsIGNydF9pbmRleCk7CisKKwkJaWYgKHN0cmNtcChuYW1lLCBtb2R1bGUtPnN0cl90YWJsZSArIGNydF9zeW0tPnN0X25hbWUpID09IDApCisJCQlyZXR1cm4gY3J0X3N5bTsKKworCQljcnRfaW5kZXggPSBjaG5bY3J0X2luZGV4XTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEVsZl9TeW0gKm1vZHVsZV9maW5kX3N5bWJvbF9nbnUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSkgeworCXVuc2lnbmVkIGxvbmcgaCA9IGVsZl9nbnVfaGFzaCgoY29uc3QgdW5zaWduZWQgY2hhciopbmFtZSk7CisKKwkvLyBTZXR1cCBjb2RlIChUT0RPOiBPcHRpbWl6ZSB0aGlzIGJ5IGNvbXB1dGluZyBvbmx5IG9uY2UpCisJRWxmX1dvcmQgKmNyX3dvcmQgPSBtb2R1bGUtPmdoYXNoX3RhYmxlOworCUVsZl9Xb3JkIG5idWNrZXQgPSAqY3Jfd29yZCsrOworCUVsZl9Xb3JkIHN5bWJpYXMgPSAqY3Jfd29yZCsrOworCUVsZl9Xb3JkIGJpdG1hc2tfbndvcmRzID0gKmNyX3dvcmQrKzsKKworCWlmICgoYml0bWFza19ud29yZHMgJiAoYml0bWFza19ud29yZHMgLSAxKSkgIT0gMCkgeworCQlkcHJpbnRmKCJJbnZhbGlkIEdOVSBIYXNoIHN0cnVjdHVyZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCUVsZl9Xb3JkIGdudV9zaGlmdCA9ICpjcl93b3JkKys7CisKKwlFbGZfQWRkciAqZ251X2JpdG1hc2sgPSAoRWxmX0FkZHIqKWNyX3dvcmQ7CisJY3Jfd29yZCArPSBNT0RVTEVfRUxGX0NMQVNTX1NJWkUgLyAzMiAqIGJpdG1hc2tfbndvcmRzOworCisJRWxmX1dvcmQgKmdudV9idWNrZXRzID0gY3Jfd29yZDsKKwljcl93b3JkICs9IG5idWNrZXQ7CisKKwlFbGZfV29yZCAqZ251X2NoYWluX3plcm8gPSBjcl93b3JkIC0gc3ltYmlhczsKKworCS8vIENvbXB1dGF0aW9ucworCUVsZl9Cd29yZCBiaXRtYXNrX3dvcmQgPSBnbnVfYml0bWFza1soaCAvIE1PRFVMRV9FTEZfQ0xBU1NfU0laRSkgJgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXRtYXNrX253b3JkcyAtIDEpXTsKKworCXVuc2lnbmVkIGludCBoYXNoYml0MSA9IGggJiAoTU9EVUxFX0VMRl9DTEFTU19TSVpFIC0gMSk7CisJdW5zaWduZWQgaW50IGhhc2hiaXQyID0gKGggPj4gZ251X3NoaWZ0KSAmIChNT0RVTEVfRUxGX0NMQVNTX1NJWkUgLSAxKTsKKworCWlmICgoYml0bWFza193b3JkID4+IGhhc2hiaXQxKSAmIChiaXRtYXNrX3dvcmQgPj4gaGFzaGJpdDIpICYgMSkgeworCQl1bnNpZ25lZCBsb25nIHJlbTsKKwkJRWxmX1dvcmQgYnVja2V0OworCisJCXJlbSA9IGggJSBuYnVja2V0OworCisJCWJ1Y2tldCA9IGdudV9idWNrZXRzW3JlbV07CisKKwkJaWYgKGJ1Y2tldCAhPSAwKSB7CisJCQljb25zdCBFbGZfV29yZCogaGFzaGFyciA9ICZnbnVfY2hhaW5femVyb1tidWNrZXRdOworCisJCQlkbyB7CisJCQkJaWYgKCgoKmhhc2hhcnIgXiBoICkgPj4gMSkgPT0gMCkgeworCQkJCQlFbGZfU3ltICpjcnRfc3ltID0gc3ltYm9sX2dldF9lbnRyeShtb2R1bGUsIChoYXNoYXJyIC0gZ251X2NoYWluX3plcm8pKTsKKworCQkJCQlpZiAoc3RyY21wKG5hbWUsIG1vZHVsZS0+c3RyX3RhYmxlICsgY3J0X3N5bS0+c3RfbmFtZSkgPT0gMCkgeworCQkJCQkJcmV0dXJuIGNydF9zeW07CisJCQkJCX0KKwkJCQl9CisJCQl9IHdoaWxlICgoKmhhc2hhcnIrKyAmIDF1KSA9PSAwKTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgRWxmX1N5bSAqbW9kdWxlX2ZpbmRfc3ltYm9sX2l0ZXJhdGUoY29uc3QgY2hhciAqbmFtZSxzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKQoreworCisJdW5zaWduZWQgaW50IGk7CisJRWxmX1N5bSAqY3J0X3N5bTsKKworCWZvciAoaSA9IDE7IGkgPCBtb2R1bGUtPnN5bXRhYmxlX3NpemUvbW9kdWxlLT5zeW1lbnRfc2l6ZTsgaSsrKQorCXsKKwkJY3J0X3N5bSA9IHN5bWJvbF9nZXRfZW50cnkobW9kdWxlLCBpKTsKKwkJaWYgKHN0cmNtcChuYW1lLCBtb2R1bGUtPnN0cl90YWJsZSArIGNydF9zeW0tPnN0X25hbWUpID09IDApCisJCXsKKwkJCXJldHVybiBjcnRfc3ltOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK0VsZl9TeW0gKm1vZHVsZV9maW5kX3N5bWJvbChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKSB7CisJRWxmX1N5bSAqcmVzdWx0ID0gTlVMTDsKKworCWlmIChtb2R1bGUtPmdoYXNoX3RhYmxlICE9IE5VTEwpCisJCXJlc3VsdCA9IG1vZHVsZV9maW5kX3N5bWJvbF9nbnUobmFtZSwgbW9kdWxlKTsKKworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwl7CisJCWlmIChtb2R1bGUtPmhhc2hfdGFibGUgIT0gTlVMTCkKKwkJeworCQkJLy9wcmludGYoIkF0dGVtcHRpbmcgU1lTViBTeW1ib2wgc2VhcmNoXG4iKTsKKwkJCXJlc3VsdCA9IG1vZHVsZV9maW5kX3N5bWJvbF9zeXN2KG5hbWUsIG1vZHVsZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvL3ByaW50ZigiQXR0ZW1wdGluZyBJdGVyYXRpdmUgU3ltYm9sIHNlYXJjaFxuIik7CisJCQlyZXN1bHQgPSBtb2R1bGVfZmluZF9zeW1ib2xfaXRlcmF0ZShuYW1lLCBtb2R1bGUpOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworRWxmX1N5bSAqZ2xvYmFsX2ZpbmRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBlbGZfbW9kdWxlICoqbW9kdWxlKSB7CisJc3RydWN0IGVsZl9tb2R1bGUgKmNydF9tb2R1bGU7CisJRWxmX1N5bSAqY3J0X3N5bSA9IE5VTEw7CisJRWxmX1N5bSAqcmVzdWx0ID0gTlVMTDsKKworCWZvcl9lYWNoX21vZHVsZShjcnRfbW9kdWxlKSB7CisJCWNydF9zeW0gPSBtb2R1bGVfZmluZF9zeW1ib2wobmFtZSwgY3J0X21vZHVsZSk7CisKKwkJaWYgKGNydF9zeW0gIT0gTlVMTCAmJiBjcnRfc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpIHsKKwkJCXN3aXRjaCAoRUxGMzJfU1RfQklORChjcnRfc3ltLT5zdF9pbmZvKSkgeworCQkJY2FzZSBTVEJfR0xPQkFMOgorCQkJCWlmIChtb2R1bGUgIT0gTlVMTCkgeworCQkJCQkqbW9kdWxlID0gY3J0X21vZHVsZTsKKwkJCQl9CisJCQkJcmV0dXJuIGNydF9zeW07CisJCQljYXNlIFNUQl9XRUFLOgorCQkJCS8vIENvbnNpZGVyIG9ubHkgdGhlIGZpcnN0IHdlYWsgc3ltYm9sCisJCQkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisJCQkJCWlmIChtb2R1bGUgIT0gTlVMTCkgeworCQkJCQkJKm1vZHVsZSA9IGNydF9tb2R1bGU7CisJCQkJCX0KKwkJCQkJcmVzdWx0ID0gY3J0X3N5bTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9tb2R1bGUvY29tbW9uLmggYi9jb20zMi9saWIvc3lzL21vZHVsZS9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTJjOTczCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9tb2R1bGUvY29tbW9uLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGNvbW1vbi5oIC0gQ29tbW9uIGludGVybmFsIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZSBtb2R1bGUgc3Vic3lzdGVtCisgKgorICogIENyZWF0ZWQgb246IEF1ZyAxMSwgMjAwOAorICogICAgICBBdXRob3I6IFN0ZWZhbiBCdWN1ciA8c3RlZmFuYkB6eXRvci5jb20+CisgKi8KKworI2lmbmRlZiBDT01NT05fSF8KKyNkZWZpbmUgQ09NTU9OX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgImVsZnV0aWxzLmgiCisKKy8vIFBlcmZvcm1zIGFuIG9wZXJhdGlvbiBhbmQganVtcHMgdG8gYSBnaXZlbiBsYWJlbCBpZiBhbiBlcnJvciBvY2N1cnMKKyNkZWZpbmUgQ0hFQ0tFRChyZXMsIGV4cHIsIGVycm9yKQkJXAorCWRvIHsgCQkJCQkJCQlcCisJCShyZXMpID0gKGV4cHIpOwkJCQkJXAorCQlpZiAoKHJlcykgPCAwKQkJCQkJXAorCQkJZ290byBlcnJvcjsJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIE1JTih4LHkpCSgoKHgpIDwgKHkpKSA/ICh4KSA6ICh5KSkKKyNkZWZpbmUgTUFYKHgseSkJKCgoeCkgPiAoeSkpID8gKHgpIDogKHkpKQorCitzdGF0aWMgaW5saW5lIEVsZl9TeW0gKnN5bWJvbF9nZXRfZW50cnkoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSwgaW50IGVudHJ5KQoreworCWNoYXIgKnN5bV90YWJsZSA9IChjaGFyICopbW9kdWxlLT5zeW1fdGFibGU7CisJaW50IGluZGV4ID0gZW50cnkgKiBtb2R1bGUtPnN5bWVudF9zaXplOworCisJcmV0dXJuIChFbGZfU3ltICopKHN5bV90YWJsZSArIGluZGV4KTsKK30KKworLy8jZGVmaW5lIEVMRl9ERUJVRworCisjaWZkZWYgRUxGX0RFQlVHCisjZGVmaW5lIERCR19QUklOVChmbXQsIGFyZ3MuLi4pCWZwcmludGYoc3RkZXJyLCAiW0VMRl0gIiBmbXQsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIERCR19QUklOVChmbXQsIGFyZ3MuLi4pCS8vIEV4cGFuZCB0byBub3RoaW5nCisjZW5kaWYKKworLy8gVXNlci1zcGFjZSBkZWJ1Z2dpbmcgcm91dGluZXMKKyNpZmRlZiBFTEZfREVCVUcKK2V4dGVybiB2b2lkIHByaW50X2VsZl9laGRyKEVsZl9FaGRyICplaGRyKTsKK2V4dGVybiB2b2lkIHByaW50X2VsZl9zeW1ib2xzKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpOworI2VuZGlmIC8vRUxGX0RFQlVHCisKKworLyoKKyAqIEltYWdlIGZpbGVzIG1hbmlwdWxhdGlvbiByb3V0aW5lcworICovCisKK2V4dGVybiBpbnQgaW1hZ2VfbG9hZChzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKTsKK2V4dGVybiBpbnQgaW1hZ2VfdW5sb2FkKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpOworZXh0ZXJuIGludCBpbWFnZV9yZWFkKHZvaWQgKmJ1ZmYsIHNpemVfdCBzaXplLCBzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKTsKK2V4dGVybiBpbnQgaW1hZ2Vfc2tpcChzaXplX3Qgc2l6ZSwgc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CitleHRlcm4gaW50IGltYWdlX3NlZWsoRWxmX09mZiBvZmZzZXQsIHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpOworCitleHRlcm4gc3RydWN0IG1vZHVsZV9kZXAgKm1vZHVsZV9kZXBfYWxsb2Moc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CisKK2V4dGVybiBpbnQgY2hlY2tfaGVhZGVyX2NvbW1vbihFbGZfRWhkciAqZWxmX2hkcik7CisKK2V4dGVybiBpbnQgZW5mb3JjZV9kZXBlbmRlbmN5KHN0cnVjdCBlbGZfbW9kdWxlICpyZXEsIHN0cnVjdCBlbGZfbW9kdWxlICpkZXApOworZXh0ZXJuIGludCBjbGVhcl9kZXBlbmRlbmN5KHN0cnVjdCBlbGZfbW9kdWxlICpyZXEsIHN0cnVjdCBlbGZfbW9kdWxlICpkZXApOworCitleHRlcm4gaW50IGNoZWNrX3N5bWJvbHMoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CisKKworI2VuZGlmIC8qIENPTU1PTl9IXyAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9tb2R1bGUvZWxmX21vZHVsZS5jIGIvY29tMzIvbGliL3N5cy9tb2R1bGUvZWxmX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOWE1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL21vZHVsZS9lbGZfbW9kdWxlLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBlbGZfbW9kdWxlLmMKKyAqCisgKiAgQ3JlYXRlZCBvbjogQXVnIDExLCAyMDA4CisgKiAgICAgIEF1dGhvcjogU3RlZmFuIEJ1Y3VyIDxzdGVmYW5iQHp5dG9yLmNvbT4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9leGVjLmg+CisKKyNpbmNsdWRlICJlbGZ1dGlscy5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorCitzdGF0aWMgaW50IGNoZWNrX2hlYWRlcihFbGZfRWhkciAqZWxmX2hkcikgeworCWludCByZXM7CisKKwlyZXMgPSBjaGVja19oZWFkZXJfY29tbW9uKGVsZl9oZHIpOworCisJaWYgKHJlcyAhPSAwKQorCQlyZXR1cm4gcmVzOworCisJaWYgKGVsZl9oZHItPmVfdHlwZSAhPSBNT0RVTEVfRUxGX1RZUEUpIHsKKwkJZHByaW50ZigiVGhlIEVMRiBmaWxlIG11c3QgYmUgYSBzaGFyZWQgb2JqZWN0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChlbGZfaGRyLT5lX3Bob2ZmID09IDB4MDAwMDAwMDApIHsKKwkJZHByaW50ZigiUEhUIG1pc3NpbmdcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCB0aGUgbG9hZGFibGUgc2VnbWVudHMgYXJlIHByZXNlbnQKKyAqIGluIHRoZSBQSFQgc29ydGVkIGJ5IHRoZWlyIG9mZnNldHMsIHNvIHRoYXQgb25seSBmb3J3YXJkIHNlZWtzIHdvdWxkCisgKiBiZSBuZWNlc3NhcnkuCisgKi8KK2V4dGVybiBpbnQgbG9hZF9zZWdtZW50cyhzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlLCBFbGZfRWhkciAqZWxmX2hkcik7CisKK3N0YXRpYyBpbnQgcHJlcGFyZV9keW5saW5raW5nKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpIHsKKwlFbGZfRHluICAqZHluX2VudHJ5ID0gbW9kdWxlLT5keW5fdGFibGU7CisKKwl3aGlsZSAoZHluX2VudHJ5LT5kX3RhZyAhPSBEVF9OVUxMKSB7CisJCXN3aXRjaCAoZHluX2VudHJ5LT5kX3RhZykgeworCQljYXNlIERUX05FRURFRDoKKwkJCS8qCisJCQkgKiBJdCdzIHVubGlrZWx5IHRoZXJlJ2xsIGJlIG1vcmUgdGhhbgorCQkJICogTUFYX05SX0RFUFMgRFRfTkVFREVEIGVudHJpZXMgYnV0IGlmIHRoZXJlCisJCQkgKiBhcmUgdGhlbiBpbmZvcm0gdGhlIHVzZXIgdGhhdCB3ZSByYW4gb3V0IG9mCisJCQkgKiBzcGFjZS4KKwkJCSAqLworCQkJaWYgKG1vZHVsZS0+bnJfbmVlZGVkIDwgTUFYX05SX0RFUFMpCisJCQkJbW9kdWxlLT5uZWVkZWRbbW9kdWxlLT5ucl9uZWVkZWQrK10gPSBkeW5fZW50cnktPmRfdW4uZF9wdHI7CisJCQllbHNlIHsKKwkJCQlwcmludGYoIlRvbyBtYW55IGRlcGVuZGVuY2llcyFcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERUX0hBU0g6CisJCQltb2R1bGUtPmhhc2hfdGFibGUgPQorCQkJCShFbGZfV29yZCopbW9kdWxlX2dldF9hYnNvbHV0ZShkeW5fZW50cnktPmRfdW4uZF9wdHIsIG1vZHVsZSk7CisJCQlicmVhazsKKwkJY2FzZSBEVF9HTlVfSEFTSDoKKwkJCW1vZHVsZS0+Z2hhc2hfdGFibGUgPQorCQkJCShFbGZfV29yZCopbW9kdWxlX2dldF9hYnNvbHV0ZShkeW5fZW50cnktPmRfdW4uZF9wdHIsIG1vZHVsZSk7CisJCQlicmVhazsKKwkJY2FzZSBEVF9TVFJUQUI6CisJCQltb2R1bGUtPnN0cl90YWJsZSA9CisJCQkJKGNoYXIqKW1vZHVsZV9nZXRfYWJzb2x1dGUoZHluX2VudHJ5LT5kX3VuLmRfcHRyLCBtb2R1bGUpOworCQkJYnJlYWs7CisJCWNhc2UgRFRfU1lNVEFCOgorCQkJbW9kdWxlLT5zeW1fdGFibGUgPQorCQkJCW1vZHVsZV9nZXRfYWJzb2x1dGUoZHluX2VudHJ5LT5kX3VuLmRfcHRyLCBtb2R1bGUpOworCQkJYnJlYWs7CisJCWNhc2UgRFRfU1RSU1o6CisJCQltb2R1bGUtPnN0cnRhYmxlX3NpemUgPSBkeW5fZW50cnktPmRfdW4uZF92YWw7CisJCQlicmVhazsKKwkJY2FzZSBEVF9TWU1FTlQ6CisJCQltb2R1bGUtPnN5bWVudF9zaXplID0gZHluX2VudHJ5LT5kX3VuLmRfdmFsOworCQkJYnJlYWs7CisJCWNhc2UgRFRfUExUR09UOiAvLyBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIEdPVAorCQkJbW9kdWxlLT5nb3QgPSBtb2R1bGVfZ2V0X2Fic29sdXRlKGR5bl9lbnRyeS0+ZF91bi5kX3B0ciwgbW9kdWxlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZHluX2VudHJ5Kys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdW5kZWZpbmVkX3N5bWJvbCh2b2lkKQoreworCXByaW50ZigiRXJyb3I6IEFuIHVuZGVmaW5lZCBzeW1ib2wgd2FzIHJlZmVyZW5jZWRcbiIpOworCWthYm9vbSgpOworfQorCitleHRlcm4gaW50IHBlcmZvcm1fcmVsb2NhdGlvbihzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlLCBFbGZfUmVsICpyZWwpOworZXh0ZXJuIGludCByZXNvbHZlX3N5bWJvbHMoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CisKK3N0YXRpYyBpbnQgZXh0cmFjdF9vcGVyYXRpb25zKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpIHsKKwlFbGZfU3ltICpjdG9yc19zdGFydCwgKmN0b3JzX2VuZDsKKwlFbGZfU3ltICpkdG9yc19zdGFydCwgKmR0b3JzX2VuZDsKKwltb2R1bGVfY3Rvcl90ICpjdG9ycyA9IE5VTEw7CisJbW9kdWxlX2N0b3JfdCAqZHRvcnMgPSBOVUxMOworCisJY3RvcnNfc3RhcnQgPSBtb2R1bGVfZmluZF9zeW1ib2woIl9fY3RvcnNfc3RhcnQiLCBtb2R1bGUpOworCWN0b3JzX2VuZCA9IG1vZHVsZV9maW5kX3N5bWJvbCgiX19jdG9yc19lbmQiLCBtb2R1bGUpOworCisJaWYgKGN0b3JzX3N0YXJ0ICYmIGN0b3JzX2VuZCkgeworCQltb2R1bGVfY3Rvcl90ICpzdGFydCwgKmVuZDsKKwkJaW50IG5yX2N0b3JzID0gMDsKKwkJaW50IGksIHNpemU7CisKKwkJc3RhcnQgPSBtb2R1bGVfZ2V0X2Fic29sdXRlKGN0b3JzX3N0YXJ0LT5zdF92YWx1ZSwgbW9kdWxlKTsKKwkJZW5kID0gbW9kdWxlX2dldF9hYnNvbHV0ZShjdG9yc19lbmQtPnN0X3ZhbHVlLCBtb2R1bGUpOworCisJCW5yX2N0b3JzID0gZW5kIC0gc3RhcnQ7CisKKwkJc2l6ZSA9IG5yX2N0b3JzICogc2l6ZW9mKG1vZHVsZV9jdG9yX3QpOworCQlzaXplICs9IHNpemVvZihtb2R1bGVfY3Rvcl90KTsgLyogTlVMTCBlbnRyeSAqLworCisJCWN0b3JzID0gbWFsbG9jKHNpemUpOworCQlpZiAoIWN0b3JzKSB7CisJCQlwcmludGYoIlVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIGN0b3JzXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW1lbXNldChjdG9ycywgMCwgc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBucl9jdG9yczsgaSsrKQorCQkJY3RvcnNbaV0gPSBzdGFydFtpXTsKKworCQltb2R1bGUtPmN0b3JzID0gY3RvcnM7CisJfQorCisJZHRvcnNfc3RhcnQgPSBtb2R1bGVfZmluZF9zeW1ib2woIl9fZHRvcnNfc3RhcnQiLCBtb2R1bGUpOworCWR0b3JzX2VuZCA9IG1vZHVsZV9maW5kX3N5bWJvbCgiX19kdG9yc19lbmQiLCBtb2R1bGUpOworCisJaWYgKGR0b3JzX3N0YXJ0ICYmIGR0b3JzX2VuZCkgeworCQltb2R1bGVfY3Rvcl90ICpzdGFydCwgKmVuZDsKKwkJaW50IG5yX2R0b3JzID0gMDsKKwkJaW50IGksIHNpemU7CisKKwkJc3RhcnQgPSBtb2R1bGVfZ2V0X2Fic29sdXRlKGR0b3JzX3N0YXJ0LT5zdF92YWx1ZSwgbW9kdWxlKTsKKwkJZW5kID0gbW9kdWxlX2dldF9hYnNvbHV0ZShkdG9yc19lbmQtPnN0X3ZhbHVlLCBtb2R1bGUpOworCisJCW5yX2R0b3JzID0gZW5kIC0gc3RhcnQ7CisKKwkJc2l6ZSA9IG5yX2R0b3JzICogc2l6ZW9mKG1vZHVsZV9jdG9yX3QpOworCQlzaXplICs9IHNpemVvZihtb2R1bGVfY3Rvcl90KTsgLyogTlVMTCBlbnRyeSAqLworCisJCWR0b3JzID0gbWFsbG9jKHNpemUpOworCQlpZiAoIWR0b3JzKSB7CisJCQlwcmludGYoIlVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIGR0b3JzXG4iKTsKKwkJCWZyZWUoY3RvcnMpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbWVtc2V0KGR0b3JzLCAwLCBzaXplKTsKKwkJZm9yIChpID0gMDsgaSA8IG5yX2R0b3JzOyBpKyspCisJCQlkdG9yc1tpXSA9IHN0YXJ0W2ldOworCisJCW1vZHVsZS0+ZHRvcnMgPSBkdG9yczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLy8gTG9hZHMgdGhlIG1vZHVsZSBpbnRvIHRoZSBzeXN0ZW0KK2ludCBtb2R1bGVfbG9hZChzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKSB7CisJaW50IHJlczsKKwlFbGZfU3ltICptYWluX3N5bTsKKwlFbGZfRWhkciBlbGZfaGRyOworCW1vZHVsZV9jdG9yX3QgKmN0b3I7CisJc3RydWN0IGVsZl9tb2R1bGUgKmhlYWQgPSBOVUxMOworCisJLy8gRG8gbm90IGFsbG93IGR1cGxpY2F0ZSBtb2R1bGVzCisJaWYgKG1vZHVsZV9maW5kKG1vZHVsZS0+bmFtZSkgIT0gTlVMTCkgeworCQlkcHJpbnRmKCJNb2R1bGUgJXMgaXMgYWxyZWFkeSBsb2FkZWQuXG4iLCBtb2R1bGUtPm5hbWUpOworCQlyZXR1cm4gRUVYSVNUOworCX0KKworCS8vIEdldCBhIG1hcHBpbmcvY29weSBvZiB0aGUgRUxGIGZpbGUgaW4gbWVtb3J5CisJcmVzID0gaW1hZ2VfbG9hZChtb2R1bGUpOworCisJaWYgKHJlcyA8IDApIHsKKwkJZHByaW50ZigiSW1hZ2UgbG9hZCBmYWlsZWQgZm9yICVzXG4iLCBtb2R1bGUtPm5hbWUpOworCQlyZXR1cm4gcmVzOworCX0KKworCS8vIFRoZSBtb2R1bGUgaXMgYSBmdWxseSBmZWF0dXJlZCBkeW5hbWljIGxpYnJhcnkKKwltb2R1bGUtPnNoYWxsb3cgPSAwOworCisJQ0hFQ0tFRChyZXMsIGltYWdlX3JlYWQoJmVsZl9oZHIsIHNpemVvZihFbGZfRWhkciksIG1vZHVsZSksIGVycm9yKTsKKwkvL3ByaW50ZigiY2hlY2suLi4gMVxuIik7CisJCisJLy9wcmludF9lbGZfZWhkcigmZWxmX2hkcik7CisKKwkvLyBDaGVja2luZyB0aGUgaGVhZGVyIHNpZ25hdHVyZSBhbmQgbWVtYmVycworCUNIRUNLRUQocmVzLCBjaGVja19oZWFkZXIoJmVsZl9oZHIpLCBlcnJvcik7CisJLy9wcmludGYoImNoZWNrLi4uIDJcbiIpOworCisJLy8gTG9hZCB0aGUgc2VnbWVudHMgaW4gdGhlIG1lbW9yeQorCUNIRUNLRUQocmVzLCBsb2FkX3NlZ21lbnRzKG1vZHVsZSwgJmVsZl9oZHIpLCBlcnJvcik7CisJLy9wcmludGYoImJsZWFoLi4uIDNcbiIpOworCS8vIE9idGFpbiBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24KKwlDSEVDS0VEKHJlcywgcHJlcGFyZV9keW5saW5raW5nKG1vZHVsZSksIGVycm9yKTsKKwkvL3ByaW50ZigiY2hlY2suLi4gNFxuIik7CisKKwloZWFkID0gbW9kdWxlX2N1cnJlbnQoKTsKKworCS8qIEZpbmQgbW9kdWxlcyB3ZSBuZWVkIHRvIGxvYWQgYXMgZGVwZW5kZW5jaWVzICovCisJaWYgKG1vZHVsZS0+c3RyX3RhYmxlKSB7CisJCWludCBpOworCisJCS8qCisJCSAqIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIGxvYWQgdGhlIGRlcGVuZGVuY2llcyBpbgorCQkgKiByZXZlcnNlIG9yZGVyLgorCQkgKi8KKwkJZm9yIChpID0gbW9kdWxlLT5ucl9uZWVkZWQgLSAxOyBpID49IDA7IGktLSkgeworCQkJY2hhciAqZGVwLCAqcDsKKwkJCWNoYXIgKmFyZ3ZbMl0gPSB7IE5VTEwsIE5VTEwgfTsKKworCQkJZGVwID0gbW9kdWxlLT5zdHJfdGFibGUgKyBtb2R1bGUtPm5lZWRlZFtpXTsKKworCQkJLyogc3RyaXAgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgY29tcG9uZW50ICovCisJCQlpZiAoIXN0cmxlbihkZXApKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3RyY2hyKGRlcCwgJy8nKSkgeworCQkJCXAgPSBzdHJyY2hyKGRlcCwgJy8nKTsKKwkJCQlwKys7CisJCQl9IGVsc2UKKwkJCQlwID0gZGVwOworCisJCQlhcmd2WzBdID0gcDsKKwkJCXJlcyA9IHNwYXduX2xvYWQocCwgMSwgYXJndik7CisJCQlpZiAocmVzIDwgMCkgeworCQkJCXByaW50ZigiRmFpbGVkIHRvIGxvYWQgJXNcbiIsIHApOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwl9CisKKwkvLyBDaGVjayB0aGUgc3ltYm9scyBmb3IgZHVwbGljYXRlcyAvIG1pc3NpbmcgZGVmaW5pdGlvbnMKKwlDSEVDS0VEKHJlcywgY2hlY2tfc3ltYm9scyhtb2R1bGUpLCBlcnJvcik7CisJLy9wcmludGYoImNoZWNrLi4uIDVcbiIpOworCisJbWFpbl9zeW0gPSBtb2R1bGVfZmluZF9zeW1ib2woIm1haW4iLCBtb2R1bGUpOworCWlmIChtYWluX3N5bSkKKwkJbW9kdWxlLT5tYWluX2Z1bmMgPQorCQkJbW9kdWxlX2dldF9hYnNvbHV0ZShtYWluX3N5bS0+c3RfdmFsdWUsIG1vZHVsZSk7CisKKwkvL3ByaW50ZigiY2hlY2suLi4gNlxuIik7CisKKwkvLyBBZGQgdGhlIG1vZHVsZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb2R1bGUgbGlzdAorCWxpc3RfYWRkKCZtb2R1bGUtPmxpc3QsICZtb2R1bGVzX2hlYWQpOworCisJLy8gUGVyZm9ybSB0aGUgcmVsb2NhdGlvbnMKKwlyZXNvbHZlX3N5bWJvbHMobW9kdWxlKTsKKworCS8vIE9idGFpbiBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzCisJQ0hFQ0tFRChyZXMsIGV4dHJhY3Rfb3BlcmF0aW9ucyhtb2R1bGUpLCBlcnJvcik7CisKKwkvL2RwcmludGYoIm1vZHVsZS0+c3ltdGFibGVfc2l6ZSA9ICVkXG4iLCBtb2R1bGUtPnN5bXRhYmxlX3NpemUpOworCisJLy9wcmludF9lbGZfc3ltYm9scyhtb2R1bGUpOworCisJLy8gVGhlIGZpbGUgaW1hZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZAorCWltYWdlX3VubG9hZChtb2R1bGUpOworCisJLyoKKwlkcHJpbnRmKCJNT0RVTEUgJXMgTE9BREVEIFNVQ0NFU1NGVUxMWSAobWFpbkAlcCwgaW5pdEAlcCwgZXhpdEAlcClcbiIsCisJCQltb2R1bGUtPm5hbWUsCisJCQkobW9kdWxlLT5tYWluX2Z1bmMgPT0gTlVMTCkgPyBOVUxMIDogKihtb2R1bGUtPm1haW5fZnVuYyksCisJCQkobW9kdWxlLT5pbml0X2Z1bmMgPT0gTlVMTCkgPyBOVUxMIDogKihtb2R1bGUtPmluaXRfZnVuYyksCisJCQkobW9kdWxlLT5leGl0X2Z1bmMgPT0gTlVMTCkgPyBOVUxMIDogKihtb2R1bGUtPmV4aXRfZnVuYykpOworCSovCisKKwlmb3IgKGN0b3IgPSBtb2R1bGUtPmN0b3JzOyBjdG9yICYmICpjdG9yOyBjdG9yKyspCisJCSgqY3RvcikgKCk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKGhlYWQpCisJCXVubG9hZF9tb2R1bGVzX3NpbmNlKGhlYWQtPm5hbWUpOworCisJLy8gUmVtb3ZlIHRoZSBtb2R1bGUgZnJvbSB0aGUgbW9kdWxlIGxpc3QgKGlmIGFwcGxpY2FibGUpCisJbGlzdF9kZWxfaW5pdCgmbW9kdWxlLT5saXN0KTsKKworCWlmIChtb2R1bGUtPm1vZHVsZV9hZGRyICE9IE5VTEwpIHsKKwkJZWxmX2ZyZWUobW9kdWxlLT5tb2R1bGVfYWRkcik7CisJCW1vZHVsZS0+bW9kdWxlX2FkZHIgPSBOVUxMOworCX0KKworCWltYWdlX3VubG9hZChtb2R1bGUpOworCisJLy8gQ2xlYXIgdGhlIGV4ZWN1dGlvbiBwYXJ0IG9mIHRoZSBtb2R1bGUgYnVmZmVyCisJbWVtc2V0KCZtb2R1bGUtPnUsIDAsIHNpemVvZiBtb2R1bGUtPnUpOworCisJcmV0dXJuIHJlczsKK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9tb2R1bGUvZWxmdXRpbHMuYyBiL2NvbTMyL2xpYi9zeXMvbW9kdWxlL2VsZnV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkNzYwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvbW9kdWxlL2VsZnV0aWxzLmMKQEAgLTAsMCArMSw4OSBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJlbGZ1dGlscy5oIgorCit1bnNpZ25lZCBsb25nIGVsZl9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpIHsKKwl1bnNpZ25lZCBsb25nIGggPSAwOworCXVuc2lnbmVkIGxvbmcgZzsKKworCXdoaWxlICgqbmFtZSkgeworCQloID0gKGggPDwgNCkgKyAqbmFtZSsrOworCQlpZiAoKGcgPSBoICYgMHhGMDAwMDAwMCkpCisJCQloIF49IGcgPj4gMjQ7CisKKwkJaCAmPSB+ZzsKKwl9CisKKwlyZXR1cm4gaDsKK30KKwordW5zaWduZWQgbG9uZyBlbGZfZ251X2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSkgeworCXVuc2lnbmVkIGxvbmcgaCA9IDUzODE7CisJdW5zaWduZWQgY2hhciBjOworCisJZm9yIChjID0gKm5hbWU7IGMgIT0gJ1wwJzsgYyA9ICorK25hbWUpIHsKKwkJaCA9IGggKiAzMyArIGM7CisJfQorCisJcmV0dXJuIGggJiAweEZGRkZGRkZGOworfQorCisjaWZuZGVmIEhBVkVfRUxGX1BPU0lYX01FTUFMSUdOCisKK3N0cnVjdCBtZW1hbGlnbl9pbmZvIHsKKwl2b2lkIAkqc3RhcnRfYWRkcjsKKwljaGFyCWRhdGFbMF07Cit9OworCitpbnQgZWxmX21hbGxvYyh2b2lkICoqbWVtcHRyLCBzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSkgeworCWNoYXIgKnN0YXJ0X2FkZHIgPSBOVUxMOworCXN0cnVjdCBtZW1hbGlnbl9pbmZvICppbmZvOworCisJaWYgKChhbGlnbm1lbnQgJiAoYWxpZ25tZW50IC0gMSkpICE9IDApCisJCXJldHVybiBFSU5WQUw7CisJaWYgKGFsaWdubWVudCAlIHNpemVvZih2b2lkKikgIT0gMCkKKwkJYWxpZ25tZW50ID0gc2l6ZW9mKHZvaWQqKTsKKworCXN0YXJ0X2FkZHIgPSBtYWxsb2Moc2l6ZSArIChhbGlnbm1lbnQgPiBzaXplb2Yoc3RydWN0IG1lbWFsaWduX2luZm8pID8KKwkJCQkJYWxpZ25tZW50IDogc2l6ZW9mKHN0cnVjdCBtZW1hbGlnbl9pbmZvKSkpOworCisJaWYgKHN0YXJ0X2FkZHIgPT0gTlVMTCkKKwkJcmV0dXJuIEVOT01FTTsKKworCisJaW5mbyA9IChzdHJ1Y3QgbWVtYWxpZ25faW5mbyopKHN0YXJ0X2FkZHIgLQorCQkJKCh1bnNpZ25lZCBsb25nKXN0YXJ0X2FkZHIgJSBhbGlnbm1lbnQpICsKKwkJCWFsaWdubWVudCAtIHNpemVvZihzdHJ1Y3QgbWVtYWxpZ25faW5mbykpOworCisJaW5mby0+c3RhcnRfYWRkciA9IHN0YXJ0X2FkZHI7CisKKwkqbWVtcHRyID0gaW5mby0+ZGF0YTsKKworCXJldHVybiAwOworfQorCit2b2lkIGVsZl9mcmVlKGNoYXIgKm1lbXB0cikgeworCXN0cnVjdCBtZW1hbGlnbl9pbmZvICppbmZvID0gKHN0cnVjdCBtZW1hbGlnbl9pbmZvKikobWVtcHRyIC0KKwkJCXNpemVvZihzdHJ1Y3QgbWVtYWxpZ25faW5mbykpOworCisJZnJlZShpbmZvLT5zdGFydF9hZGRyKTsKK30KKworI2Vsc2UKKworaW50IGVsZl9tYWxsb2Modm9pZCAqKm1lbXB0ciwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IHNpemUpIHsKKwlpZiAoKGFsaWdubWVudCAmIChhbGlnbm1lbnQgLSAxKSkgIT0gMCkKKwkJcmV0dXJuIEVJTlZBTDsKKworCWlmIChhbGlnbm1lbnQgJSBzaXplb2Yodm9pZCopICE9IDApCisJCWFsaWdubWVudCA9IHNpemVvZih2b2lkKik7CisKKwlyZXR1cm4gcG9zaXhfbWVtYWxpZ24obWVtcHRyLCBhbGlnbm1lbnQsIHNpemUpOworfQorCit2b2lkIGVsZl9mcmVlKHZvaWQgKm1lbXB0cikgeworCWZyZWUobWVtcHRyKTsKK30KKworI2VuZGlmIC8vSEFWRV9FTEZfUE9TSVhfTUVNQUxJR04KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvbW9kdWxlL2VsZnV0aWxzLmggYi9jb20zMi9saWIvc3lzL21vZHVsZS9lbGZ1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmRjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL21vZHVsZS9lbGZ1dGlscy5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgRUxGX1VUSUxTX0hfCisjZGVmaW5lIEVMRl9VVElMU19IXworCisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorCisvKioKKyAqIGVsZl9nZXRfaGVhZGVyIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEVMRiBoZWFkZXIgc3RydWN0dXJlLgorICogQGVsZl9pbWFnZTogcG9pbnRlciB0byB0aGUgRUxGIGZpbGUgaW1hZ2UgaW4gbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgRWxmX0VoZHIgKmVsZl9nZXRfaGVhZGVyKHZvaWQgKmVsZl9pbWFnZSkgeworCXJldHVybiAoRWxmX0VoZHIqKWVsZl9pbWFnZTsKK30KKworLyoqCisgKiBlbGZfZ2V0X3BodCAtIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgUEhULgorICogQGVsZl9pbWFnZTogcG9pbnRlciB0byB0aGUgRUxGIGZpbGUgaW1hZ2UgaW4gbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgRWxmX1BoZHIgKmVsZl9nZXRfcGh0KHZvaWQgKmVsZl9pbWFnZSkgeworCUVsZl9FaGRyICplbGZfaGRyID0gZWxmX2dldF9oZWFkZXIoZWxmX2ltYWdlKTsKKworCXJldHVybiAoRWxmX1BoZHIqKSgoRWxmX09mZillbGZfaGRyICsgZWxmX2hkci0+ZV9waG9mZik7Cit9CisKKy8vCisvKioKKyAqIGVsZl9nZXRfcGggLSBSZXR1cm5zIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIGluZGV4IGluIHRoZSBQVEgKKyAqIEBlbGZfaW1hZ2U6IHBvaW50ZXIgdG8gdGhlIEVMRiBmaWxlIGltYWdlIGluIG1lbW9yeQorICogQGluZGV4OiB0aGUgaW5kZXggb2YgdGhlIFBIVCBlbnRyeSB0byBsb29rIGZvcgorICovCitzdGF0aWMgaW5saW5lIEVsZl9QaGRyICplbGZfZ2V0X3BoKHZvaWQgKmVsZl9pbWFnZSwgaW50IGluZGV4KSB7CisJRWxmX1BoZHIgKmVsZl9waHQgPSBlbGZfZ2V0X3BodChlbGZfaW1hZ2UpOworCUVsZl9FaGRyICplbGZfaGRyID0gZWxmX2dldF9oZWFkZXIoZWxmX2ltYWdlKTsKKworCXJldHVybiAoRWxmX1BoZHIqKSgoRWxmX09mZillbGZfcGh0ICsgaW5kZXggKiBlbGZfaGRyLT5lX3BoZW50c2l6ZSk7Cit9CisKKy8qKgorICogZWxmX2hhc2ggLSBSZXR1cm5zIHRoZSBpbmRleCBpbiBhIFN5c1YgaGFzaCB0YWJsZSBmb3IgdGhlIHN5bWJvbCBuYW1lLgorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gbG9vayBmb3IKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZWxmX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSk7CisKKy8qKgorICogZWxmX2dudV9oYXNoIC0gUmV0dXJucyB0aGUgaW5kZXggaW4gYSBHTlUgaGFzaCB0YWJsZSBmb3IgdGhlIHN5bWJvbCBuYW1lLgorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gbG9vayBmb3IKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZWxmX2dudV9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpOworCisvKioKKyAqIGVsZl9tYWxsb2MgLSBBbGxvY2F0ZXMgbWVtb3J5IHRvIGJlIHVzZWQgYnkgRUxGIG1vZHVsZSBjb250ZW50cy4KKyAqIEBtZW1wdHI6IHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byBob2xkIHRoZSBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYmxvY2suCisgKiBAYWxpZ25tZW50OiBhbGlnbm1lbnQgY29uc3RyYWludHMgb2YgdGhlIGJsb2NrCisgKiBAc2l6ZTogdGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGJsb2NrCisgKi8KK2V4dGVybiBpbnQgZWxmX21hbGxvYyh2b2lkICoqbWVtcHRyLCBzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogZWxmX2ZyZWUgLSBSZWxlYXNlcyBtZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgZWxmX21hbGxvYy4KKyAqIEBtZW1wdHI6IHRoZSBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYmxvY2sKKyAqLworZXh0ZXJuIHZvaWQgZWxmX2ZyZWUoY2hhciAqbWVtcHRyKTsKKworI2VuZGlmIC8qRUxGX1VUSUxTX0hfKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvbW9kdWxlL2V4ZWMuYyBiL2NvbTMyL2xpYi9zeXMvbW9kdWxlL2V4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI5NmUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9tb2R1bGUvZXhlYy5jCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogZXhlYy5jCisgKgorICogIENyZWF0ZWQgb246IEF1ZyAxNCwgMjAwOAorICogICAgICBBdXRob3I6IFN0ZWZhbiBCdWN1ciA8c3RlZmFuYkB6eXRvci5jb20+CisgKi8KKworI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4KKyNpbmNsdWRlIDxzeXMvZXhlYy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorCisjZGVmaW5lIERCR19QUklOVChmbXQsIGFyZ3MuLi4pIGRwcmludGYoIltFWEVDXSAiIGZtdCwgIyNhcmdzKQorCitzdHJ1Y3QgZWxmX21vZHVsZSAqX19zeXNsaW51eF9jdXJyZW50ID0gTlVMTDsKKworaW50IGdldF9tb2R1bGVfdHlwZShzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKQoreworCWlmKG1vZHVsZS0+bWFpbl9mdW5jKSByZXR1cm4gRVhFQ19NT0RVTEU7CisJcmV0dXJuIExJQl9NT0RVTEU7Cit9CisKK2ptcF9idWYgX19wcm9jZXNzX2V4aXRfam1wOworCisjaWYgMAoraW50IHNwYXdudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmVzLCByZXRfdmFsID0gMDsKKwljb25zdCBjaGFyICoqYXJnOworCWludCBhcmdjOworCWNoYXIgKiphcmdwLCAqKmFyZ3M7CisJc3RydWN0IGVsZl9tb2R1bGUgKnByZXZpb3VzOworCW1hbGxvY190YWdfdCBwcmV2X21lbV90YWc7CisKKwlzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlID0gbW9kdWxlX2FsbG9jKG5hbWUpOworCisJaWYgKG1vZHVsZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlyZXMgPSBtb2R1bGVfbG9hZChtb2R1bGUpOworCWlmIChyZXMgIT0gMCkgeworCQltb2R1bGVfdW5sb2FkKG1vZHVsZSk7CisJCXJldHVybiByZXM7CisJfQorCisJaWYgKG1vZHVsZS0+bWFpbl9mdW5jID09IE5VTEwpIHsKKwkJLy8gV2UgY2FuJ3QgZXhlY3V0ZSB3aXRob3V0IGEgbWFpbiBmdW5jdGlvbgorCQltb2R1bGVfdW5sb2FkKG1vZHVsZSk7CisJCXJldHVybiAtMTsKKwl9CisJLyppZiAobW9kdWxlLT5tYWluX2Z1bmMgIT0gTlVMTCkgeworCQljb25zdCBjaGFyICoqbGFzdF9hcmcgPSBhcmd2OworCQl2b2lkICpvbGRfdGFnOworCQl3aGlsZSAoKmxhc3RfYXJnICE9IE5VTEwpCisJCQlsYXN0X2FyZysrOworCisJCS8vIFNldHVwIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBjb250ZXh0CisJCW9sZF90YWcgPSBfX21lbV9nZXRfdGFnX2dsb2JhbCgpOworCQlfX21lbV9zZXRfdGFnX2dsb2JhbChtb2R1bGUpOworCisJCS8vIEV4ZWN1dGUgdGhlIHByb2dyYW0KKwkJcmV0X3ZhbCA9ICgqKG1vZHVsZS0+bWFpbl9mdW5jKSkobGFzdF9hcmcgLSBhcmd2LCBhcmd2KTsKKworCQkvLyBDbGVhbiB1cCB0aGUgYWxsb2NhdGlvbiBjb250ZXh0CisJCV9fZnJlZV90YWdnZWQobW9kdWxlKTsKKwkJLy8gUmVzdG9yZSB0aGUgYWxsb2NhdGlvbiBjb250ZXh0CisJCV9fbWVtX3NldF90YWdfZ2xvYmFsKG9sZF90YWcpOworCX0gZWxzZSB7CisJCS8vIFdlIGNhbid0IGV4ZWN1dGUgd2l0aG91dCBhIG1haW4gZnVuY3Rpb24KKwkJbW9kdWxlX3VubG9hZChtb2R1bGUpOworCQlyZXR1cm4gLTE7CisJfSovCisJLy8gU2V0IHVwIHRoZSBwcm9jZXNzIGNvbnRleHQKKwlwcmV2aW91cyA9IF9fc3lzbGludXhfY3VycmVudDsKKwlwcmV2X21lbV90YWcgPSBfX21lbV9nZXRfdGFnX2dsb2JhbCgpOworCisJLy8gU2V0dXAgdGhlIG5ldyBwcm9jZXNzIGNvbnRleHQKKwlfX3N5c2xpbnV4X2N1cnJlbnQgPSBtb2R1bGU7CisJX19tZW1fc2V0X3RhZ19nbG9iYWwoKG1hbGxvY190YWdfdCltb2R1bGUpOworCisJLy8gR2VuZXJhdGUgYSBuZXcgcHJvY2VzcyBjb3B5IG9mIGFyZ3YgKG9uIHRoZSBzdGFjaykKKwlhcmdjID0gMDsKKwlmb3IgKGFyZyA9IGFyZ3Y7ICphcmc7IGFyZysrKQorCQlhcmdjKys7CisKKwlhcmdzID0gYWxsb2NhKChhcmdjKzEpICogc2l6ZW9mKGNoYXIgKikpOworCisJZm9yIChhcmcgPSBhcmd2LCBhcmdwID0gYXJnczsgKmFyZzsgYXJnKyssIGFyZ3ArKykgeworCQlzaXplX3QgbCA9IHN0cmxlbigqYXJnKSsxOworCQkqYXJncCA9IGFsbG9jYShsKTsKKwkJbWVtY3B5KCphcmdwLCAqYXJnLCBsKTsKKwl9CisKKwkqYXJncyA9IE5VTEw7CisKKwkvLyBFeGVjdXRlIHRoZSBwcm9ncmFtCisJcmV0X3ZhbCA9IHNldGptcChtb2R1bGUtPnUueC5wcm9jZXNzX2V4aXQpOworCisJaWYgKHJldF92YWwpCisJCXJldF92YWwtLTsJCS8qIFZhbGlkIHJhbmdlIGlzIDAtMjU1ICovCisJZWxzZSBpZiAoIW1vZHVsZS0+bWFpbl9mdW5jKQorCQlyZXRfdmFsID0gLTE7CisJZWxzZQorCQlleGl0KChtb2R1bGUtPm1haW5fZnVuYykoYXJnYywgYXJncykpOyAvKiBBY3R1YWxseSBydW4hICovCisKKwkvLyBDbGVhbiB1cCB0aGUgYWxsb2NhdGlvbiBjb250ZXh0CisJX19mcmVlX3RhZ2dlZChtb2R1bGUpOworCS8vIFJlc3RvcmUgdGhlIGFsbG9jYXRpb24gY29udGV4dAorCV9fbWVtX3NldF90YWdfZ2xvYmFsKHByZXZfbWVtX3RhZyk7CisJLy8gUmVzdG9yZSB0aGUgcHJvY2VzcyBjb250ZXh0CisJX19zeXNsaW51eF9jdXJyZW50ID0gcHJldmlvdXM7CisKKwlyZXMgPSBtb2R1bGVfdW5sb2FkKG1vZHVsZSk7CisKKwlpZiAocmVzICE9IDApIHsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gKCh1bnNpZ25lZCBpbnQpcmV0X3ZhbCAmIDB4RkYpOworfQorCitpbnQgc3Bhd25sKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZywgLi4uKQoreworCS8qCisJICogTk9URTogV2UgYXNzdW1lIHRoZSBzdGFuZGFyZCBBQkkgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGkzODYKKwkgKiBhcmNoaXRlY3R1cmUuIFRoaXMgY29kZSBtYXkgbm90IHdvcmsgaWYgdXNlZCBpbiBvdGhlcgorCSAqIGNpcmN1bXN0YW5jZXMsIGluY2x1ZGluZyBub24tdmFyaWFkaWMgZnVuY3Rpb25zLCBkaWZmZXJlbnQKKwkgKiBhcmNoaXRlY3R1cmVzIGFuZCBjYWxsaW5nIGNvbnZlbnRpb25zLgorCSAqLworCXJldHVybiBzcGF3bnYobmFtZSwgJmFyZyk7Cit9CisjZW5kaWYKKworLyoKKyAqIExvYWQgYSBtb2R1bGUgYW5kIHJ1bnMgaXRzIHN0YXJ0IGZ1bmN0aW9uLgorICoKKyAqIEZvciBsaWJyYXJ5IG1vZHVsZXMgdGhlIHN0YXJ0IGZ1bmN0aW9uIGlzIG1vZHVsZS0+aW5pdF9mdW5jIGFuZCBmb3IKKyAqIGV4ZWN1dGFibGUgbW9kdWxlcyBpdHMgbW9kdWxlLT5tYWluX2Z1bmMuCisgKgorICogIm5hbWUiIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbG9hZC4KKyAqCisgKiAiYXJndiIgYW5kICJhcmdjIiBhcmUgb25seSBwYXNzZWQgdG8gbW9kdWxlLT5tYWluX2Z1bmMsIGZvciBsaWJyYXJ5CisgKiBtb2R1bGVzIHRoZXNlIGFyZ3VtZW50cyBjYW4gYmUgTlVMTCBhbmQgMCwgcmVzcGVjdGl2ZWx5LgorICoKKyAqICJhcmd2IiBpcyBhbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gcGFzcyB0byBtb2R1bGUtPm1haW5fZnVuYy4KKyAqIGFyZ3ZbMF0gbXVzdCBiZSBhIHBvaW50ZXIgdG8gIm5hbWUiIGFuZCBhcmd2W2FyZ2NdIG11c3QgYmUgTlVMTC4KKyAqCisgKiAiYXJnYyIgaXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gImFyZ3YiLgorICovCitpbnQgc3Bhd25fbG9hZChjb25zdCBjaGFyICpuYW1lLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJlcywgcmV0X3ZhbCA9IDA7CisJc3RydWN0IGVsZl9tb2R1bGUgKnByZXZpb3VzOworCS8vbWFsbG9jX3RhZ190IHByZXZfbWVtX3RhZzsKKwlzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlID0gbW9kdWxlX2FsbG9jKG5hbWUpOworCXN0cnVjdCBlbGZfbW9kdWxlICpjdXJfbW9kdWxlOworCWludCB0eXBlOworCisJZHByaW50ZigiZW50ZXI6IG5hbWUgPSAlcyIsIG5hbWUpOworCisJaWYgKG1vZHVsZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZ2V0X21vZHVsZV90eXBlKG1vZHVsZSkgPT0gRVhFQ19NT0RVTEUpIHsKKwkJaWYgKCFhcmdjIHx8ICFhcmd2IHx8IHN0cmNtcChhcmd2WzBdLCBuYW1lKSkgeworCQkJZHByaW50ZigiaW52YWxpZCBhcmdzIGZvciAlc1xuIiwgbmFtZSk7CisJCQlyZXMgPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJY3VyX21vZHVsZSA9IG1vZHVsZV9jdXJyZW50KCk7CisJaWYgKCFzdHJjbXAoY3VyX21vZHVsZS0+bmFtZSwgbW9kdWxlLT5uYW1lKSkgeworCQlkcHJpbnRmKCJXZSBpcyBydW5uaW5nIHRoaXMgbW9kdWxlICVzIGFscmVhZHkhIiwgbW9kdWxlLT5uYW1lKTsKKworCQltb2R1bGVfdW5sb2FkKGN1cl9tb2R1bGUpOworCX0KKworCXJlcyA9IG1vZHVsZV9sb2FkKG1vZHVsZSk7CisJaWYgKHJlcyAhPSAwKSB7CisJCWRwcmludGYoImZhaWxlZCB0byBsb2FkIG1vZHVsZSAlc1xuIiwgbW9kdWxlLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJdHlwZSA9IGdldF9tb2R1bGVfdHlwZShtb2R1bGUpOworCisJZHByaW50ZigidHlwZSA9ICVkLCBwcmV2ID0gJXMsIGN1ciA9ICVzIiwKKwkJdHlwZSwgY3VyX21vZHVsZS0+bmFtZSwgbW9kdWxlLT5uYW1lKTsKKworCWlmKHR5cGU9PUVYRUNfTU9EVUxFKQorCXsKKwkJcHJldmlvdXMgPSBfX3N5c2xpbnV4X2N1cnJlbnQ7CisJCS8vcHJldl9tZW1fdGFnID0gX19tZW1fZ2V0X3RhZ19nbG9iYWwoKTsKKworCQkvLyBTZXR1cCB0aGUgbmV3IHByb2Nlc3MgY29udGV4dAorCQlfX3N5c2xpbnV4X2N1cnJlbnQgPSBtb2R1bGU7CisJCS8vX19tZW1fc2V0X3RhZ19nbG9iYWwoKG1hbGxvY190YWdfdCltb2R1bGUpOworCisJCS8vIEV4ZWN1dGUgdGhlIHByb2dyYW0KKwkJcmV0X3ZhbCA9IHNldGptcChtb2R1bGUtPnUueC5wcm9jZXNzX2V4aXQpOworCisJCWlmIChyZXRfdmFsKQorCQkJcmV0X3ZhbC0tOwkJLyogVmFsaWQgcmFuZ2UgaXMgMC0yNTUgKi8KKwkJZWxzZSBpZiAoIW1vZHVsZS0+bWFpbl9mdW5jKQorCQkJcmV0X3ZhbCA9IC0xOworCQllbHNlCisJCQlleGl0KChtb2R1bGUtPm1haW5fZnVuYykoYXJnYywgYXJndikpOyAvKiBBY3R1YWxseSBydW4hICovCisKKwkJLy8gQ2xlYW4gdXAgdGhlIGFsbG9jYXRpb24gY29udGV4dAorCQkvL19fZnJlZV90YWdnZWQobW9kdWxlKTsKKwkJLy8gUmVzdG9yZSB0aGUgYWxsb2NhdGlvbiBjb250ZXh0CisJCS8vX19tZW1fc2V0X3RhZ19nbG9iYWwocHJldl9tZW1fdGFnKTsKKwkJLy8gUmVzdG9yZSB0aGUgcHJvY2VzcyBjb250ZXh0CisJCV9fc3lzbGludXhfY3VycmVudCA9IHByZXZpb3VzOworCisJCXJlcyA9IG1vZHVsZV91bmxvYWQobW9kdWxlKTsKKworCQlpZiAocmVzICE9IDApCisJCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlpZiAocmVzKQorCQlfbW9kdWxlX3VubG9hZChtb2R1bGUpOworCXJldHVybiByZXM7Cit9CisKK3ZvaWQgZXhlY190ZXJtKHZvaWQpCit7CisJbW9kdWxlc190ZXJtKCk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL21vZHVsZS9pMzg2L2VsZl9tb2R1bGUuYyBiL2NvbTMyL2xpYi9zeXMvbW9kdWxlL2kzODYvZWxmX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGY0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL21vZHVsZS9pMzg2L2VsZl9tb2R1bGUuYwpAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIGVsZl9tb2R1bGUuYworICoKKyAqICBDcmVhdGVkIG9uOiBBdWcgMTEsIDIwMDgKKyAqICAgICAgQXV0aG9yOiBTdGVmYW4gQnVjdXIgPHN0ZWZhbmJAenl0b3IuY29tPgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxzeXMvbW9kdWxlLmg+CisjaW5jbHVkZSA8c3lzL2V4ZWMuaD4KKworI2luY2x1ZGUgImVsZnV0aWxzLmgiCisjaW5jbHVkZSAiLi4vY29tbW9uLmgiCisKKy8qCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCB0aGUgbG9hZGFibGUgc2VnbWVudHMgYXJlIHByZXNlbnQKKyAqIGluIHRoZSBQSFQgc29ydGVkIGJ5IHRoZWlyIG9mZnNldHMsIHNvIHRoYXQgb25seSBmb3J3YXJkIHNlZWtzIHdvdWxkCisgKiBiZSBuZWNlc3NhcnkuCisgKi8KK2ludCBsb2FkX3NlZ21lbnRzKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUsIEVsZl9FaGRyICplbGZfaGRyKSB7CisJaW50IGk7CisJaW50IHJlcyA9IDA7CisJY2hhciAqcGh0ID0gTlVMTDsKKwljaGFyICpzaHQgPSBOVUxMOworCUVsZjMyX1BoZHIgKmNyX3BodDsKKwlFbGYzMl9TaGRyICpjcl9zaHQ7CisKKwlFbGYzMl9BZGRyIG1pbl9hZGRyICA9IDB4MDAwMDAwMDA7IC8vIE1pbi4gRUxGIHZhZGRyCisJRWxmMzJfQWRkciBtYXhfYWRkciAgPSAweDAwMDAwMDAwOyAvLyBNYXguIEVMRiB2YWRkcgorCUVsZjMyX1dvcmQgbWF4X2FsaWduID0gc2l6ZW9mKHZvaWQqKTsgLy8gTWluLiBhbGlnbiBvZiBwb3NpeF9tZW1hbGlnbigpCisJRWxmMzJfQWRkciBtaW5fYWxsb2MsIG1heF9hbGxvYzsgICAvLyBNaW4uIGFuZCBtYXguIGFsaWduZWQgYWxsb2NhYmxlcworCisJRWxmMzJfQWRkciBkeW5fYWRkciA9IDB4MDAwMDAwMDA7CisKKwkvLyBHZXQgdG8gdGhlIFBIVAorCWltYWdlX3NlZWsoZWxmX2hkci0+ZV9waG9mZiwgbW9kdWxlKTsKKworCS8vIExvYWQgdGhlIFBIVAorCXBodCA9IG1hbGxvYyhlbGZfaGRyLT5lX3BobnVtICogZWxmX2hkci0+ZV9waGVudHNpemUpOworCWlmICghcGh0KQorCQlyZXR1cm4gLTE7CisKKwlpbWFnZV9yZWFkKHBodCwgZWxmX2hkci0+ZV9waG51bSAqIGVsZl9oZHItPmVfcGhlbnRzaXplLCBtb2R1bGUpOworCisJLy8gQ29tcHV0ZSB0aGUgbWVtb3J5IG5lZWRpbmdzIG9mIHRoZSBtb2R1bGUKKwlmb3IgKGk9MDsgaSA8IGVsZl9oZHItPmVfcGhudW07IGkrKykgeworCQljcl9waHQgPSAoRWxmMzJfUGhkciopKHBodCArIGkgKiBlbGZfaGRyLT5lX3BoZW50c2l6ZSk7CisKKwkJc3dpdGNoIChjcl9waHQtPnBfdHlwZSkgeworCQljYXNlIFBUX0xPQUQ6CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJbWluX2FkZHIgPSBjcl9waHQtPnBfdmFkZHI7CisJCQl9IGVsc2UgeworCQkJCW1pbl9hZGRyID0gTUlOKG1pbl9hZGRyLCBjcl9waHQtPnBfdmFkZHIpOworCQkJfQorCisJCQltYXhfYWRkciA9IE1BWChtYXhfYWRkciwgY3JfcGh0LT5wX3ZhZGRyICsgY3JfcGh0LT5wX21lbXN6KTsKKwkJCW1heF9hbGlnbiA9IE1BWChtYXhfYWxpZ24sIGNyX3BodC0+cF9hbGlnbik7CisJCQlicmVhazsKKwkJY2FzZSBQVF9EWU5BTUlDOgorCQkJZHluX2FkZHIgPSBjcl9waHQtPnBfdmFkZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8vIFVuc3VwcG9ydGVkIC0gaWdub3JlCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChtYXhfYWRkciAtIG1pbl9hZGRyID09IDApIHsKKwkJLy8gTm8gbG9hZGFibGUgc2VnbWVudHMKKwkJREJHX1BSSU5UKCJObyBsb2FkYWJsZSBzZWdtZW50cyBmb3VuZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkeW5fYWRkciA9PSAwKSB7CisJCURCR19QUklOVCgiTm8gZHluYW1pYyBpbmZvcm1hdGlvbiBzZWdtZW50IGZvdW5kXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLy8gVGhlIG1pbmltdW0gYWRkcmVzcyB0aGF0IHNob3VsZCBiZSBhbGxvY2F0ZWQKKwltaW5fYWxsb2MgPSBtaW5fYWRkciAtIChtaW5fYWRkciAlIG1heF9hbGlnbik7CisKKwkvLyBUaGUgbWF4aW11bSBhZGRyZXNzIHRoYXQgc2hvdWxkIGJlIGFsbG9jYXRlZAorCW1heF9hbGxvYyA9IG1heF9hZGRyIC0gKG1heF9hZGRyICUgbWF4X2FsaWduKTsKKwlpZiAobWF4X2FkZHIgJSBtYXhfYWxpZ24gPiAwKQorCQltYXhfYWxsb2MgKz0gbWF4X2FsaWduOworCisKKwlpZiAoZWxmX21hbGxvYygmbW9kdWxlLT5tb2R1bGVfYWRkciwKKwkJCW1heF9hbGlnbiwKKwkJCW1heF9hbGxvYy1taW5fYWxsb2MpICE9IDApIHsKKworCQlEQkdfUFJJTlQoIkNvdWxkIG5vdCBhbGxvY2F0ZSBzZWdtZW50c1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCW1vZHVsZS0+YmFzZV9hZGRyID0gKEVsZjMyX0FkZHIpKG1vZHVsZS0+bW9kdWxlX2FkZHIpIC0gbWluX2FsbG9jOworCW1vZHVsZS0+bW9kdWxlX3NpemUgPSBtYXhfYWxsb2MgLSBtaW5fYWxsb2M7CisKKwkvLyBaZXJvLWluaXRpYWxpemUgdGhlIG1lbW9yeQorCW1lbXNldChtb2R1bGUtPm1vZHVsZV9hZGRyLCAwLCBtb2R1bGUtPm1vZHVsZV9zaXplKTsKKworCWZvciAoaSA9IDA7IGkgPCBlbGZfaGRyLT5lX3BobnVtOyBpKyspIHsKKwkJY3JfcGh0ID0gKEVsZjMyX1BoZHIqKShwaHQgKyBpICogZWxmX2hkci0+ZV9waGVudHNpemUpOworCisJCWlmIChjcl9waHQtPnBfdHlwZSA9PSBQVF9MT0FEKSB7CisJCQkvLyBDb3B5IHRoZSBzZWdtZW50IGF0IGl0cyBkZXN0aW5hdGlvbgorCQkJaWYgKGNyX3BodC0+cF9vZmZzZXQgPCBtb2R1bGUtPnUubC5fY3Jfb2Zmc2V0KSB7CisJCQkJLy8gVGhlIHNlZ21lbnQgY29udGFpbnMgZGF0YSBiZWZvcmUgdGhlIGN1cnJlbnQgb2Zmc2V0CisJCQkJLy8gSXQgY2FuIGJlIGRpc2NhcmRlZCB3aXRob3V0IHdvcnJ5IC0gaXQgd291bGQgY29udGFpbiBvbmx5CisJCQkJLy8gaGVhZGVycworCQkJCUVsZjMyX09mZiBhdXhfb2ZmID0gbW9kdWxlLT51LmwuX2NyX29mZnNldCAtIGNyX3BodC0+cF9vZmZzZXQ7CisKKwkJCQlpZiAoaW1hZ2VfcmVhZCgoY2hhciAqKW1vZHVsZV9nZXRfYWJzb2x1dGUoY3JfcGh0LT5wX3ZhZGRyLCBtb2R1bGUpICsgYXV4X29mZiwKKwkJCQkJICAgICAgIGNyX3BodC0+cF9maWxlc3ogLSBhdXhfb2ZmLCBtb2R1bGUpIDwgMCkgeworCQkJCQlyZXMgPSAtMTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaW1hZ2Vfc2Vlayhjcl9waHQtPnBfb2Zmc2V0LCBtb2R1bGUpIDwgMCkgeworCQkJCQlyZXMgPSAtMTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCisJCQkJaWYgKGltYWdlX3JlYWQobW9kdWxlX2dldF9hYnNvbHV0ZShjcl9waHQtPnBfdmFkZHIsIG1vZHVsZSksCisJCQkJCQljcl9waHQtPnBfZmlsZXN6LCBtb2R1bGUpIDwgMCkgeworCQkJCQlyZXMgPSAtMTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCisJCQkvKgorCQkJREJHX1BSSU5UKCJMb2FkYWJsZSBzZWdtZW50IG9mIHNpemUgMHglMDh4IGNvcGllZCBmcm9tIHZhZGRyIDB4JTA4eCBhdCAweCUwOHhcbiIsCisJCQkJCWNyX3BodC0+cF9maWxlc3osCisJCQkJCWNyX3BodC0+cF92YWRkciwKKwkJCQkJKEVsZjMyX0FkZHIpbW9kdWxlX2dldF9hYnNvbHV0ZShjcl9waHQtPnBfdmFkZHIsIG1vZHVsZSkpOworCQkJKi8KKwkJfQorCX0KKworCS8vIEdldCB0byB0aGUgU0hUCisJaW1hZ2Vfc2VlayhlbGZfaGRyLT5lX3Nob2ZmLCBtb2R1bGUpOworCisJLy8gTG9hZCB0aGUgU0hUCisJc2h0ID0gbWFsbG9jKGVsZl9oZHItPmVfc2hudW0gKiBlbGZfaGRyLT5lX3NoZW50c2l6ZSk7CisJaWYgKCFzaHQpIHsKKwkJcmVzID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWltYWdlX3JlYWQoc2h0LCBlbGZfaGRyLT5lX3NobnVtICogZWxmX2hkci0+ZV9zaGVudHNpemUsIG1vZHVsZSk7CisKKwkvLyBTZXR1cCB0aGUgc3ltdGFibGUgc2l6ZQorCWZvciAoaSA9IDA7IGkgPCBlbGZfaGRyLT5lX3NobnVtOyBpKyspIHsKKwkJY3Jfc2h0ID0gKEVsZjMyX1NoZHIqKShzaHQgKyBpICogZWxmX2hkci0+ZV9zaGVudHNpemUpOworCisJCWlmIChjcl9zaHQtPnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkgeworCQkJbW9kdWxlLT5zeW10YWJsZV9zaXplID0gY3Jfc2h0LT5zaF9zaXplOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmcmVlKHNodCk7CisKKwkvLyBTZXR1cCBkeW5hbWljIHNlZ21lbnQgbG9jYXRpb24KKwltb2R1bGUtPmR5bl90YWJsZSA9IG1vZHVsZV9nZXRfYWJzb2x1dGUoZHluX2FkZHIsIG1vZHVsZSk7CisKKwkvKgorCURCR19QUklOVCgiQmFzZSBhZGRyZXNzOiAweCUwOHgsIGFsaWduZWQgYXQgMHglMDh4XG4iLCBtb2R1bGUtPmJhc2VfYWRkciwKKwkJCW1heF9hbGlnbik7CisJREJHX1BSSU5UKCJNb2R1bGUgc2l6ZTogMHglMDh4XG4iLCBtb2R1bGUtPm1vZHVsZV9zaXplKTsKKwkqLworCitvdXQ6CisJLy8gRnJlZSB1cCBhbGxvY2F0ZWQgbWVtb3J5CisJaWYgKHBodCAhPSBOVUxMKQorCQlmcmVlKHBodCk7CisKKwlyZXR1cm4gcmVzOworfQorCitpbnQgcGVyZm9ybV9yZWxvY2F0aW9uKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUsIEVsZl9SZWwgKnJlbCkgeworCUVsZjMyX1dvcmQgKmRlc3QgPSBtb2R1bGVfZ2V0X2Fic29sdXRlKHJlbC0+cl9vZmZzZXQsIG1vZHVsZSk7CisKKwkvLyBUaGUgc3ltYm9sIHJlZmVyZW5jZSBpbmRleAorCUVsZjMyX1dvcmQgc3ltID0gRUxGMzJfUl9TWU0ocmVsLT5yX2luZm8pOworCXVuc2lnbmVkIGNoYXIgdHlwZSA9IEVMRjMyX1JfVFlQRShyZWwtPnJfaW5mbyk7CisKKwkvLyBUaGUgc3ltYm9sIGRlZmluaXRpb24gKGlmIGFwcGxpY2FibGUpCisJRWxmMzJfU3ltICpzeW1fZGVmID0gTlVMTDsKKwlzdHJ1Y3QgZWxmX21vZHVsZSAqc3ltX21vZHVsZSA9IE5VTEw7CisJRWxmMzJfQWRkciBzeW1fYWRkciA9IDB4MDsKKworCWlmIChzeW0gPiAwKSB7CisJCS8vIEZpbmQgb3V0IGRldGFpbHMgYWJvdXQgdGhlIHN5bWJvbAorCisJCS8vIFRoZSBzeW1ib2wgcmVmZXJlbmNlCisJCUVsZjMyX1N5bSAqc3ltX3JlZiA9IHN5bWJvbF9nZXRfZW50cnkobW9kdWxlLCBzeW0pOworCisJCS8vIFRoZSBzeW1ib2wgZGVmaW5pdGlvbgorCQlzeW1fZGVmID0KKwkJCWdsb2JhbF9maW5kX3N5bWJvbChtb2R1bGUtPnN0cl90YWJsZSArIHN5bV9yZWYtPnN0X25hbWUsCisJCQkJCSZzeW1fbW9kdWxlKTsKKworCQlpZiAoc3ltX2RlZiA9PSBOVUxMKSB7CisJCQlEQkdfUFJJTlQoIkNhbm5vdCBwZXJmb3JtIHJlbG9jYXRpb24gZm9yIHN5bWJvbCAlc1xuIiwKKwkJCQkJbW9kdWxlLT5zdHJfdGFibGUgKyBzeW1fcmVmLT5zdF9uYW1lKTsKKworCQkJaWYgKEVMRjMyX1NUX0JJTkQoc3ltX3JlZi0+c3RfaW5mbykgIT0gU1RCX1dFQUspCisJCQkJcmV0dXJuIC0xOworCisJCQkvLyBUaGlzIG11c3QgYmUgYSBkZXJpdmF0aXZlLXNwZWNpZmljCisJCQkvLyBmdW5jdGlvbi4gV2UncmUgT0sgYXMgbG9uZyBhcyB3ZSBuZXZlcgorCQkJLy8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24uCisJCQlzeW1fZGVmID0gZ2xvYmFsX2ZpbmRfc3ltYm9sKCJ1bmRlZmluZWRfc3ltYm9sIiwgJnN5bV9tb2R1bGUpOworCQl9CisKKwkJLy8gQ29tcHV0ZSB0aGUgYWJzb2x1dGUgc3ltYm9sIHZpcnR1YWwgYWRkcmVzcworCQlzeW1fYWRkciA9IChFbGYzMl9BZGRyKW1vZHVsZV9nZXRfYWJzb2x1dGUoc3ltX2RlZi0+c3RfdmFsdWUsIHN5bV9tb2R1bGUpOworCisJCWlmIChzeW1fbW9kdWxlICE9IG1vZHVsZSkgeworCQkJLy8gQ3JlYXRlIGEgZGVwZW5kZW5jeQorCQkJZW5mb3JjZV9kZXBlbmRlbmN5KHN5bV9tb2R1bGUsIG1vZHVsZSk7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJfMzg2X05PTkU6CisJCS8vIERvIG5vdGhpbmcKKwkJYnJlYWs7CisJY2FzZSBSXzM4Nl8zMjoKKwkJKmRlc3QgKz0gc3ltX2FkZHI7CisJCWJyZWFrOworCWNhc2UgUl8zODZfUEMzMjoKKwkJKmRlc3QgKz0gc3ltX2FkZHIgLSAoRWxmMzJfQWRkcilkZXN0OworCQlicmVhazsKKwljYXNlIFJfMzg2X0NPUFk6CisJCWlmIChzeW1fYWRkciA+IDApIHsKKwkJCW1lbWNweSgodm9pZCopZGVzdCwgKHZvaWQqKXN5bV9hZGRyLCBzeW1fZGVmLT5zdF9zaXplKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJfMzg2X0dMT0JfREFUOgorCWNhc2UgUl8zODZfSk1QX1NMT1Q6CisJCS8vIE1heWJlIFRPRE86IEtlZXAgdHJhY2sgb2YgdGhlIEdPVCBlbnRyaWVzIGFsbG9jYXRpb25zCisJCSpkZXN0ID0gc3ltX2FkZHI7CisJCWJyZWFrOworCWNhc2UgUl8zODZfUkVMQVRJVkU6CisJCSpkZXN0ICs9IG1vZHVsZS0+YmFzZV9hZGRyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdfUFJJTlQoIlJlbG9jYXRpb24gdHlwZSAlZCBub3Qgc3VwcG9ydGVkXG4iLCB0eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcmVzb2x2ZV9zeW1ib2xzKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpIHsKKwlFbGYzMl9EeW4gICpkeW5fZW50cnkgPSBtb2R1bGUtPmR5bl90YWJsZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmVzOworCisJRWxmMzJfV29yZCBwbHRfcmVsX3NpemUgPSAwOworCWNoYXIgKnBsdF9yZWwgPSBOVUxMOworCisJY2hhciAqcmVsID0gTlVMTDsKKwlFbGYzMl9Xb3JkIHJlbF9zaXplID0gMDsKKwlFbGYzMl9Xb3JkIHJlbF9lbnRyeSA9IDA7CisKKwkvLyBUaGUgY3VycmVudCByZWxvY2F0aW9uCisJRWxmMzJfUmVsICpjcnRfcmVsOworCisJd2hpbGUgKGR5bl9lbnRyeS0+ZF90YWcgIT0gRFRfTlVMTCkgeworCQlzd2l0Y2goZHluX2VudHJ5LT5kX3RhZykgeworCisJCS8vIFBMVCByZWxvY2F0aW9uIGluZm9ybWF0aW9uCisJCWNhc2UgRFRfUExUUkVMU1o6CisJCQlwbHRfcmVsX3NpemUgPSBkeW5fZW50cnktPmRfdW4uZF92YWw7CisJCQlicmVhazsKKwkJY2FzZSBEVF9QTFRSRUw6CisJCQlpZiAoZHluX2VudHJ5LT5kX3VuLmRfdmFsICE9IERUX1JFTCkgeworCQkJCURCR19QUklOVCgiVW5zdXBwb3J0ZWQgUExUIHJlbG9jYXRpb25cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJY2FzZSBEVF9KTVBSRUw6CisJCQlwbHRfcmVsID0gbW9kdWxlX2dldF9hYnNvbHV0ZShkeW5fZW50cnktPmRfdW4uZF9wdHIsIG1vZHVsZSk7CisJCQlicmVhazsKKworCQkvLyBTdGFuZGFyZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uCisJCWNhc2UgRFRfUkVMOgorCQkJcmVsID0gbW9kdWxlX2dldF9hYnNvbHV0ZShkeW5fZW50cnktPmRfdW4uZF9wdHIsIG1vZHVsZSk7CisJCQlicmVhazsKKwkJY2FzZSBEVF9SRUxTWjoKKwkJCXJlbF9zaXplID0gZHluX2VudHJ5LT5kX3VuLmRfdmFsOworCQkJYnJlYWs7CisJCWNhc2UgRFRfUkVMRU5UOgorCQkJcmVsX2VudHJ5ID0gZHluX2VudHJ5LT5kX3VuLmRfdmFsOworCQkJYnJlYWs7CisKKwkJLy8gTW9kdWxlIGluaXRpYWxpemF0aW9uIGFuZCB0ZXJtaW5hdGlvbgorCQljYXNlIERUX0lOSVQ6CisJCQkvLyBUT0RPIEltcGxlbWVudCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKwkJCWJyZWFrOworCQljYXNlIERUX0ZJTkk6CisJCQkvLyBUT0RPIEltcGxlbWVudCBmaW5hbGl6YXRpb24gZnVuY3Rpb25zCisJCQlicmVhazsKKwkJfQorCisJCWR5bl9lbnRyeSsrOworCX0KKworCWlmIChyZWxfc2l6ZSA+IDApIHsKKwkJLy8gUHJvY2VzcyBzdGFuZGFyZCByZWxvY2F0aW9ucworCQlmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemUvcmVsX2VudHJ5OyBpKyspIHsKKwkJCWNydF9yZWwgPSAoRWxmMzJfUmVsKikocmVsICsgaSpyZWxfZW50cnkpOworCisJCQlyZXMgPSBwZXJmb3JtX3JlbG9jYXRpb24obW9kdWxlLCBjcnRfcmVsKTsKKworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCisJfQorCisJaWYgKHBsdF9yZWxfc2l6ZSA+IDApIHsKKwkJLy8gVE9ETzogUGVybWl0IHRoaXMgbGF6aWx5CisJCS8vIFByb2Nlc3MgUExUIHJlbG9jYXRpb25zCisJCWZvciAoaSA9IDA7IGkgPCBwbHRfcmVsX3NpemUvc2l6ZW9mKEVsZjMyX1JlbCk7IGkrKykgeworCQkJY3J0X3JlbCA9IChFbGYzMl9SZWwqKShwbHRfcmVsICsgaSpzaXplb2YoRWxmMzJfUmVsKSk7CisKKwkJCXJlcyA9IHBlcmZvcm1fcmVsb2NhdGlvbihtb2R1bGUsIGNydF9yZWwpOworCisJCQlpZiAocmVzIDwgMCkKKwkJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvbW9kdWxlL3g4Nl82NC9lbGZfbW9kdWxlLmMgYi9jb20zMi9saWIvc3lzL21vZHVsZS94ODZfNjQvZWxmX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjRiZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL21vZHVsZS94ODZfNjQvZWxmX21vZHVsZS5jCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogZWxmX21vZHVsZS5jCisgKgorICogIENyZWF0ZWQgb246IEF1ZyAxMSwgMjAwOAorICogICAgICBBdXRob3I6IFN0ZWZhbiBCdWN1ciA8c3RlZmFuYkB6eXRvci5jb20+CisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4KKyNpbmNsdWRlIDxzeXMvZXhlYy5oPgorCisjaW5jbHVkZSAiZWxmdXRpbHMuaCIKKyNpbmNsdWRlICIuLi9jb21tb24uaCIKKworLyoKKyAqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHRoZSBsb2FkYWJsZSBzZWdtZW50cyBhcmUgcHJlc2VudAorICogaW4gdGhlIFBIVCBzb3J0ZWQgYnkgdGhlaXIgb2Zmc2V0cywgc28gdGhhdCBvbmx5IGZvcndhcmQgc2Vla3Mgd291bGQKKyAqIGJlIG5lY2Vzc2FyeS4KKyAqLworaW50IGxvYWRfc2VnbWVudHMoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSwgRWxmX0VoZHIgKmVsZl9oZHIpIHsKKwlpbnQgaTsKKwlpbnQgcmVzID0gMDsKKwljaGFyICpwaHQgPSBOVUxMOworCWNoYXIgKnNodCA9IE5VTEw7CisJRWxmNjRfUGhkciAqY3JfcGh0OworCUVsZjY0X1NoZHIgKmNyX3NodDsKKworCUVsZjY0X0FkZHIgbWluX2FkZHIgID0gMHgwMDAwMDAwMDAwMDAwMDAwOyAvLyBNaW4uIEVMRiB2YWRkcgorCUVsZjY0X0FkZHIgbWF4X2FkZHIgID0gMHgwMDAwMDAwMDAwMDAwMDAwOyAvLyBNYXguIEVMRiB2YWRkcgorCUVsZjY0X1dvcmQgbWF4X2FsaWduID0gc2l6ZW9mKHZvaWQqKTsgLy8gTWluLiBhbGlnbiBvZiBwb3NpeF9tZW1hbGlnbigpCisJRWxmNjRfQWRkciBtaW5fYWxsb2MsIG1heF9hbGxvYzsgICAvLyBNaW4uIGFuZCBtYXguIGFsaWduZWQgYWxsb2NhYmxlcworCisJRWxmNjRfQWRkciBkeW5fYWRkciA9IDB4MDAwMDAwMDAwMDAwMDAwMDsKKworCS8vIEdldCB0byB0aGUgUEhUCisJaW1hZ2Vfc2VlayhlbGZfaGRyLT5lX3Bob2ZmLCBtb2R1bGUpOworCisJLy8gTG9hZCB0aGUgUEhUCisJcGh0ID0gbWFsbG9jKGVsZl9oZHItPmVfcGhudW0gKiBlbGZfaGRyLT5lX3BoZW50c2l6ZSk7CisJaWYgKCFwaHQpCisJCXJldHVybiAtMTsKKworCWltYWdlX3JlYWQocGh0LCBlbGZfaGRyLT5lX3BobnVtICogZWxmX2hkci0+ZV9waGVudHNpemUsIG1vZHVsZSk7CisKKwkvLyBDb21wdXRlIHRoZSBtZW1vcnkgbmVlZGluZ3Mgb2YgdGhlIG1vZHVsZQorCWZvciAoaT0wOyBpIDwgZWxmX2hkci0+ZV9waG51bTsgaSsrKSB7CisJCWNyX3BodCA9IChFbGY2NF9QaGRyKikocGh0ICsgaSAqIGVsZl9oZHItPmVfcGhlbnRzaXplKTsKKworCQlzd2l0Y2ggKGNyX3BodC0+cF90eXBlKSB7CisJCWNhc2UgUFRfTE9BRDoKKwkJCWlmIChpID09IDApIHsKKwkJCQltaW5fYWRkciA9IGNyX3BodC0+cF92YWRkcjsKKwkJCX0gZWxzZSB7CisJCQkJbWluX2FkZHIgPSBNSU4obWluX2FkZHIsIGNyX3BodC0+cF92YWRkcik7CisJCQl9CisKKwkJCW1heF9hZGRyID0gTUFYKG1heF9hZGRyLCBjcl9waHQtPnBfdmFkZHIgKyBjcl9waHQtPnBfbWVtc3opOworCQkJbWF4X2FsaWduID0gTUFYKG1heF9hbGlnbiwgY3JfcGh0LT5wX2FsaWduKTsKKwkJCWJyZWFrOworCQljYXNlIFBUX0RZTkFNSUM6CisJCQlkeW5fYWRkciA9IGNyX3BodC0+cF92YWRkcjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLy8gVW5zdXBwb3J0ZWQgLSBpZ25vcmUKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG1heF9hZGRyIC0gbWluX2FkZHIgPT0gMCkgeworCQkvLyBObyBsb2FkYWJsZSBzZWdtZW50cworCQlEQkdfUFJJTlQoIk5vIGxvYWRhYmxlIHNlZ21lbnRzIGZvdW5kXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGR5bl9hZGRyID09IDApIHsKKwkJREJHX1BSSU5UKCJObyBkeW5hbWljIGluZm9ybWF0aW9uIHNlZ21lbnQgZm91bmRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvLyBUaGUgbWluaW11bSBhZGRyZXNzIHRoYXQgc2hvdWxkIGJlIGFsbG9jYXRlZAorCW1pbl9hbGxvYyA9IG1pbl9hZGRyIC0gKG1pbl9hZGRyICUgbWF4X2FsaWduKTsKKworCS8vIFRoZSBtYXhpbXVtIGFkZHJlc3MgdGhhdCBzaG91bGQgYmUgYWxsb2NhdGVkCisJbWF4X2FsbG9jID0gbWF4X2FkZHIgLSAobWF4X2FkZHIgJSBtYXhfYWxpZ24pOworCWlmIChtYXhfYWRkciAlIG1heF9hbGlnbiA+IDApCisJCW1heF9hbGxvYyArPSBtYXhfYWxpZ247CisKKworCWlmIChlbGZfbWFsbG9jKCZtb2R1bGUtPm1vZHVsZV9hZGRyLAorCQkJbWF4X2FsaWduLAorCQkJbWF4X2FsbG9jLW1pbl9hbGxvYykgIT0gMCkgeworCisJCURCR19QUklOVCgiQ291bGQgbm90IGFsbG9jYXRlIHNlZ21lbnRzXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJbW9kdWxlLT5iYXNlX2FkZHIgPSAoRWxmNjRfQWRkcikobW9kdWxlLT5tb2R1bGVfYWRkcikgLSBtaW5fYWxsb2M7CisJbW9kdWxlLT5tb2R1bGVfc2l6ZSA9IG1heF9hbGxvYyAtIG1pbl9hbGxvYzsKKworCS8vIFplcm8taW5pdGlhbGl6ZSB0aGUgbWVtb3J5CisJbWVtc2V0KG1vZHVsZS0+bW9kdWxlX2FkZHIsIDAsIG1vZHVsZS0+bW9kdWxlX3NpemUpOworCisJZm9yIChpID0gMDsgaSA8IGVsZl9oZHItPmVfcGhudW07IGkrKykgeworCQljcl9waHQgPSAoRWxmNjRfUGhkciopKHBodCArIGkgKiBlbGZfaGRyLT5lX3BoZW50c2l6ZSk7CisKKwkJaWYgKGNyX3BodC0+cF90eXBlID09IFBUX0xPQUQpIHsKKwkJCS8vIENvcHkgdGhlIHNlZ21lbnQgYXQgaXRzIGRlc3RpbmF0aW9uCisJCQlpZiAoY3JfcGh0LT5wX29mZnNldCA8IG1vZHVsZS0+dS5sLl9jcl9vZmZzZXQpIHsKKwkJCQkvLyBUaGUgc2VnbWVudCBjb250YWlucyBkYXRhIGJlZm9yZSB0aGUgY3VycmVudCBvZmZzZXQKKwkJCQkvLyBJdCBjYW4gYmUgZGlzY2FyZGVkIHdpdGhvdXQgd29ycnkgLSBpdCB3b3VsZCBjb250YWluIG9ubHkKKwkJCQkvLyBoZWFkZXJzCisJCQkJRWxmNjRfT2ZmIGF1eF9vZmYgPSBtb2R1bGUtPnUubC5fY3Jfb2Zmc2V0IC0gY3JfcGh0LT5wX29mZnNldDsKKworCQkJCWlmIChpbWFnZV9yZWFkKChjaGFyICopbW9kdWxlX2dldF9hYnNvbHV0ZShjcl9waHQtPnBfdmFkZHIsIG1vZHVsZSkgKyBhdXhfb2ZmLAorCQkJCQkgICAgICAgY3JfcGh0LT5wX2ZpbGVzeiAtIGF1eF9vZmYsIG1vZHVsZSkgPCAwKSB7CisJCQkJCXJlcyA9IC0xOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChpbWFnZV9zZWVrKGNyX3BodC0+cF9vZmZzZXQsIG1vZHVsZSkgPCAwKSB7CisJCQkJCXJlcyA9IC0xOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQlpZiAoaW1hZ2VfcmVhZChtb2R1bGVfZ2V0X2Fic29sdXRlKGNyX3BodC0+cF92YWRkciwgbW9kdWxlKSwKKwkJCQkJCWNyX3BodC0+cF9maWxlc3osIG1vZHVsZSkgPCAwKSB7CisJCQkJCXJlcyA9IC0xOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQlEQkdfUFJJTlQoIkxvYWRhYmxlIHNlZ21lbnQgb2Ygc2l6ZSAweCUwOHggY29waWVkIGZyb20gdmFkZHIgMHglMDh4IGF0IDB4JTA4eFxuIiwKKwkJCQkJY3JfcGh0LT5wX2ZpbGVzeiwKKwkJCQkJY3JfcGh0LT5wX3ZhZGRyLAorCQkJCQkoRWxmNjRfQWRkciltb2R1bGVfZ2V0X2Fic29sdXRlKGNyX3BodC0+cF92YWRkciwgbW9kdWxlKSk7CisJCQkqLworCQl9CisJfQorCisJLy8gR2V0IHRvIHRoZSBTSFQKKwlpbWFnZV9zZWVrKGVsZl9oZHItPmVfc2hvZmYsIG1vZHVsZSk7CisKKwkvLyBMb2FkIHRoZSBTSFQKKwlzaHQgPSBtYWxsb2MoZWxmX2hkci0+ZV9zaG51bSAqIGVsZl9oZHItPmVfc2hlbnRzaXplKTsKKwlpZiAoIXNodCkgeworCQlyZXMgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaW1hZ2VfcmVhZChzaHQsIGVsZl9oZHItPmVfc2hudW0gKiBlbGZfaGRyLT5lX3NoZW50c2l6ZSwgbW9kdWxlKTsKKworCS8vIFNldHVwIHRoZSBzeW10YWJsZSBzaXplCisJZm9yIChpID0gMDsgaSA8IGVsZl9oZHItPmVfc2hudW07IGkrKykgeworCQljcl9zaHQgPSAoRWxmNjRfU2hkciopKHNodCArIGkgKiBlbGZfaGRyLT5lX3NoZW50c2l6ZSk7CisKKwkJaWYgKGNyX3NodC0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKSB7CisJCQltb2R1bGUtPnN5bXRhYmxlX3NpemUgPSBjcl9zaHQtPnNoX3NpemU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWZyZWUoc2h0KTsKKworCS8vIFNldHVwIGR5bmFtaWMgc2VnbWVudCBsb2NhdGlvbgorCW1vZHVsZS0+ZHluX3RhYmxlID0gbW9kdWxlX2dldF9hYnNvbHV0ZShkeW5fYWRkciwgbW9kdWxlKTsKKworCS8qCisJREJHX1BSSU5UKCJCYXNlIGFkZHJlc3M6IDB4JTA4eCwgYWxpZ25lZCBhdCAweCUwOHhcbiIsIG1vZHVsZS0+YmFzZV9hZGRyLAorCQkJbWF4X2FsaWduKTsKKwlEQkdfUFJJTlQoIk1vZHVsZSBzaXplOiAweCUwOHhcbiIsIG1vZHVsZS0+bW9kdWxlX3NpemUpOworCSovCisKK291dDoKKwkvLyBGcmVlIHVwIGFsbG9jYXRlZCBtZW1vcnkKKwlpZiAocGh0ICE9IE5VTEwpCisJCWZyZWUocGh0KTsKKworCXJldHVybiByZXM7Cit9CisKK2ludCBwZXJmb3JtX3JlbG9jYXRpb24oc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSwgRWxmX1JlbCAqcmVsKSB7CisJRWxmNjRfWHdvcmQgKmRlc3QgPSBtb2R1bGVfZ2V0X2Fic29sdXRlKHJlbC0+cl9vZmZzZXQsIG1vZHVsZSk7CisKKwkvLyBUaGUgc3ltYm9sIHJlZmVyZW5jZSBpbmRleAorCUVsZjY0X1dvcmQgc3ltID0gRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pOworCXVuc2lnbmVkIGNoYXIgdHlwZSA9IEVMRjY0X1JfVFlQRShyZWwtPnJfaW5mbyk7CisKKwkvLyBUaGUgc3ltYm9sIGRlZmluaXRpb24gKGlmIGFwcGxpY2FibGUpCisJRWxmNjRfU3ltICpzeW1fZGVmID0gTlVMTDsKKwlzdHJ1Y3QgZWxmX21vZHVsZSAqc3ltX21vZHVsZSA9IE5VTEw7CisJRWxmNjRfQWRkciBzeW1fYWRkciA9IDB4MDsKKworCWlmIChzeW0gPiAwKSB7CisJCS8vIEZpbmQgb3V0IGRldGFpbHMgYWJvdXQgdGhlIHN5bWJvbAorCisJCS8vIFRoZSBzeW1ib2wgcmVmZXJlbmNlCisJCUVsZjY0X1N5bSAqc3ltX3JlZiA9IHN5bWJvbF9nZXRfZW50cnkobW9kdWxlLCBzeW0pOworCisJCS8vIFRoZSBzeW1ib2wgZGVmaW5pdGlvbgorCQlzeW1fZGVmID0KKwkJCWdsb2JhbF9maW5kX3N5bWJvbChtb2R1bGUtPnN0cl90YWJsZSArIHN5bV9yZWYtPnN0X25hbWUsCisJCQkJCSZzeW1fbW9kdWxlKTsKKworCQlpZiAoc3ltX2RlZiA9PSBOVUxMKSB7CisJCQlEQkdfUFJJTlQoIkNhbm5vdCBwZXJmb3JtIHJlbG9jYXRpb24gZm9yIHN5bWJvbCAlc1xuIiwKKwkJCQkJbW9kdWxlLT5zdHJfdGFibGUgKyBzeW1fcmVmLT5zdF9uYW1lKTsKKworCQkJaWYgKEVMRjY0X1NUX0JJTkQoc3ltX3JlZi0+c3RfaW5mbykgIT0gU1RCX1dFQUspCisJCQkJcmV0dXJuIC0xOworCisJCQkvLyBUaGlzIG11c3QgYmUgYSBkZXJpdmF0aXZlLXNwZWNpZmljCisJCQkvLyBmdW5jdGlvbi4gV2UncmUgT0sgYXMgbG9uZyBhcyB3ZSBuZXZlcgorCQkJLy8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24uCisJCQlzeW1fZGVmID0gZ2xvYmFsX2ZpbmRfc3ltYm9sKCJ1bmRlZmluZWRfc3ltYm9sIiwgJnN5bV9tb2R1bGUpOworCQl9CisKKwkJLy8gQ29tcHV0ZSB0aGUgYWJzb2x1dGUgc3ltYm9sIHZpcnR1YWwgYWRkcmVzcworCQlzeW1fYWRkciA9IChFbGY2NF9BZGRyKW1vZHVsZV9nZXRfYWJzb2x1dGUoc3ltX2RlZi0+c3RfdmFsdWUsIHN5bV9tb2R1bGUpOworCisJCWlmIChzeW1fbW9kdWxlICE9IG1vZHVsZSkgeworCQkJLy8gQ3JlYXRlIGEgZGVwZW5kZW5jeQorCQkJZW5mb3JjZV9kZXBlbmRlbmN5KHN5bV9tb2R1bGUsIG1vZHVsZSk7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJfWDg2XzY0X05PTkU6CisJCS8vIERvIG5vdGhpbmcKKwkJYnJlYWs7CisJY2FzZSBSX1g4Nl82NF82NDoKKwkJKmRlc3QgKz0gc3ltX2FkZHI7CisJCWJyZWFrOworCWNhc2UgUl9YODZfNjRfUEMzMjoKKwkJKmRlc3QgKz0gc3ltX2FkZHIgLSAoRWxmMzJfQWRkcilkZXN0OworCQlicmVhazsKKwljYXNlIFJfWDg2XzY0X0NPUFk6CisJCWlmIChzeW1fYWRkciA+IDApIHsKKwkJCW1lbWNweSgodm9pZCopZGVzdCwgKHZvaWQqKXN5bV9hZGRyLCBzeW1fZGVmLT5zdF9zaXplKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJfWDg2XzY0X0dMT0JfREFUOgorCWNhc2UgUl9YODZfNjRfSlVNUF9TTE9UOgorCQkgLy9NYXliZSBUT0RPOiBLZWVwIHRyYWNrIG9mIHRoZSBHT1QgZW50cmllcyBhbGxvY2F0aW9ucworCQkqZGVzdCA9IHN5bV9hZGRyOworCQlicmVhazsKKwljYXNlIFJfWDg2XzY0X1JFTEFUSVZFOgorCQkqZGVzdCArPSBtb2R1bGUtPmJhc2VfYWRkcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJHX1BSSU5UKCJSZWxvY2F0aW9uIHR5cGUgJWQgbm90IHN1cHBvcnRlZFxuIiwgdHlwZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJlc29sdmVfc3ltYm9scyhzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKSB7CisJRWxmNjRfRHluICAqZHluX2VudHJ5ID0gbW9kdWxlLT5keW5fdGFibGU7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJlczsKKworCUVsZjY0X1dvcmQgcGx0X3JlbF9zaXplID0gMDsKKwl2b2lkICpwbHRfcmVsID0gTlVMTDsKKworCXZvaWQgKnJlbCA9IE5VTEw7CisJRWxmNjRfV29yZCByZWxfc2l6ZSA9IDA7CisJRWxmNjRfV29yZCByZWxfZW50cnkgPSAwOworCUVsZjY0X1h3b3JkIHJlbGFfc2l6ZSA9IDA7CisJRWxmNjRfWHdvcmQgcmVsYV9lbnRyeSA9IDA7CisJRWxmNjRfWHdvcmQgc3ltX2VudCA9IDA7CisKKwkvLyBUaGUgY3VycmVudCByZWxvY2F0aW9uCisJRWxmNjRfUmVsICpjcnRfcmVsOworCisJd2hpbGUgKGR5bl9lbnRyeS0+ZF90YWcgIT0gRFRfTlVMTCkgeworCQlzd2l0Y2goZHluX2VudHJ5LT5kX3RhZykgeworCisJCS8vIFBMVCByZWxvY2F0aW9uIGluZm9ybWF0aW9uCisJCWNhc2UgRFRfUExUUkVMU1o6CisJCQlwbHRfcmVsX3NpemUgPSBkeW5fZW50cnktPmRfdW4uZF92YWw7CisJCQlicmVhazsKKwkJY2FzZSBEVF9QTFRSRUw6CisJCQlpZiAoZHluX2VudHJ5LT5kX3VuLmRfdmFsICE9IERUX1JFTCAmJiBkeW5fZW50cnktPmRfdW4uZF92YWwgIT0gRFRfUkVMQSkgeworCQkJCURCR19QUklOVCgiVW5zdXBwb3J0ZWQgUExUIHJlbG9jYXRpb25cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCS8vYnJlYWs7CisJCWNhc2UgRFRfSk1QUkVMOgorCQkJcGx0X3JlbCA9IG1vZHVsZV9nZXRfYWJzb2x1dGUoZHluX2VudHJ5LT5kX3VuLmRfcHRyLCBtb2R1bGUpOworCQkJYnJlYWs7CisKKwkJLy8gU3RhbmRhcmQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbgorCQljYXNlIERUX1JFTDoKKwkJCXJlbCA9IG1vZHVsZV9nZXRfYWJzb2x1dGUoZHluX2VudHJ5LT5kX3VuLmRfcHRyLCBtb2R1bGUpOworCQkJYnJlYWs7CisJCWNhc2UgRFRfUkVMQToKKwkJCXJlbCA9IG1vZHVsZV9nZXRfYWJzb2x1dGUoZHluX2VudHJ5LT5kX3VuLmRfcHRyLCBtb2R1bGUpOworCQkJYnJlYWs7CisJCWNhc2UgRFRfUkVMU1o6CisJCQlyZWxfc2l6ZSA9IGR5bl9lbnRyeS0+ZF91bi5kX3ZhbDsKKwkJCWJyZWFrOworCQljYXNlIERUX1JFTEFTWjoKKwkJCXJlbGFfc2l6ZSA9IGR5bl9lbnRyeS0+ZF91bi5kX3ZhbDsKKwkJCWJyZWFrOworCQljYXNlIERUX1JFTEVOVDoKKwkJCXJlbF9lbnRyeSA9IGR5bl9lbnRyeS0+ZF91bi5kX3ZhbDsKKwkJCWJyZWFrOworCQljYXNlIERUX1JFTEFFTlQ6CisJCQlyZWxhX2VudHJ5ID0gZHluX2VudHJ5LT5kX3VuLmRfdmFsOworCQkJYnJlYWs7CisJCS8qIEZJWE1FOiBXZSBtYXkgbmVlZCB0byByZWx5IHVwb24gU1lNRU5UIGlmIERUX1JFTEFFTlQgaXMgbWlzc2luZyBpbiB0aGUgb2JqZWN0IGZpbGUgKi8KKwkJY2FzZSBEVF9TWU1FTlQ6CisJCQlzeW1fZW50ID0gZHluX2VudHJ5LT5kX3VuLmRfdmFsOworCQkJYnJlYWs7CisKKwkJLy8gTW9kdWxlIGluaXRpYWxpemF0aW9uIGFuZCB0ZXJtaW5hdGlvbgorCQljYXNlIERUX0lOSVQ6CisJCQkvLyBUT0RPIEltcGxlbWVudCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKwkJCWJyZWFrOworCQljYXNlIERUX0ZJTkk6CisJCQkvLyBUT0RPIEltcGxlbWVudCBmaW5hbGl6YXRpb24gZnVuY3Rpb25zCisJCQlicmVhazsKKwkJfQorCisJCWR5bl9lbnRyeSsrOworCX0KKworCWlmIChyZWxfc2l6ZSA+IDApIHsKKwkJLy8gUHJvY2VzcyBzdGFuZGFyZCByZWxvY2F0aW9ucworCQlmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemUvcmVsX2VudHJ5OyBpKyspIHsKKwkJCWNydF9yZWwgPSAoRWxmNjRfUmVsKikocmVsICsgaSpyZWxfZW50cnkpOworCisJCQlyZXMgPSBwZXJmb3JtX3JlbG9jYXRpb24obW9kdWxlLCBjcnRfcmVsKTsKKworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCisJfQorCisJaWYgKHJlbGFfc2l6ZSA+IDApIHsKKwkJLy8gUHJvY2VzcyBzdGFuZGFyZCByZWxvY2F0aW9ucworCQlmb3IgKGkgPSAwOyBpIDwgcmVsYV9zaXplL3JlbGFfZW50cnk7IGkrKykgeworCQkJY3J0X3JlbCA9IChFbGY2NF9SZWwqKShyZWwgKyBpKnJlbGFfZW50cnkpOworCisJCQlyZXMgPSBwZXJmb3JtX3JlbG9jYXRpb24obW9kdWxlLCBjcnRfcmVsKTsKKworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlpZiAocGx0X3JlbF9zaXplID4gMCkgeworCQkvLyBUT0RPOiBQZXJtaXQgdGhpcyBsYXppbHkKKwkJLy8gUHJvY2VzcyBQTFQgcmVsb2NhdGlvbnMKKwkJLyogc29tZSBtb2R1bGVzIGRvIG5vdCBoYXZlIERUX1NZTUVOVCwgc2V0IGl0IHN5bV9lbnQgaW4gc3VjaCBjYXNlcyAqLworCQlpZiAoIXJlbGFfZW50cnkpIHJlbGFfZW50cnkgPSBzeW1fZW50OyAKKwkJLy9mb3IgKGkgPSAwOyBpIDwgcGx0X3JlbF9zaXplL3NpemVvZihFbGY2NF9SZWwpOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHBsdF9yZWxfc2l6ZS9yZWxhX2VudHJ5OyBpKyspIHsKKwkJCS8vY3J0X3JlbCA9IChFbGY2NF9SZWwqKShwbHRfcmVsICsgaSpzaXplb2YoRWxmNjRfUmVsKSk7CisJCQljcnRfcmVsID0gKEVsZjY0X1JlbCopKHBsdF9yZWwgKyBpKnJlbGFfZW50cnkpOworCisJCQlyZXMgPSBwZXJmb3JtX3JlbG9jYXRpb24obW9kdWxlLCBjcnRfcmVsKTsKKworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9udWxsX3JlYWQuYyBiL2NvbTMyL2xpYi9zeXMvbnVsbF9yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwMzdjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvbnVsbF9yZWFkLmMKQEAgLTAsMCArMSw1NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG51bGxfcmVhZC5jCisgKgorICogUmVhZGluZyBudWxsIGRldmljZQorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCitzdGF0aWMgc3NpemVfdCBfX251bGxfcmVhZChzdHJ1Y3QgZmlsZV9pbmZvICpmcCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgKHZvaWQpZnA7CisgICAgKHZvaWQpYnVmOworICAgICh2b2lkKWNvdW50OworICAgIHJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgaW5wdXRfZGV2IGRldl9udWxsX3IgPSB7CisgICAgLmRldl9tYWdpYyA9IF9fREVWX01BR0lDLAorICAgIC5mbGFncyA9IF9fREVWX0lOUFVUIHwgX19ERVZfTlVMTCwKKyAgICAuZmlsZWZsYWdzID0gT19SRE9OTFksCisgICAgLnJlYWQgPSBfX251bGxfcmVhZCwKKyAgICAuY2xvc2UgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvbnVsbF93cml0ZS5jIGIvY29tMzIvbGliL3N5cy9udWxsX3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5YjIxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvbnVsbF93cml0ZS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBudWxsX3dyaXRlLmMKKyAqCisgKiBOdWxsIHdyaXRpbmcgZGV2aWNlCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlICJmaWxlLmgiCisKK3N0YXRpYyBzc2l6ZV90IF9fbnVsbF93cml0ZShzdHJ1Y3QgZmlsZV9pbmZvICpmcCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgKHZvaWQpZnA7CisgICAgKHZvaWQpYnVmOworICAgICh2b2lkKWNvdW50OworICAgIHJldHVybiBjb3VudDsKK30KKworY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgZGV2X251bGxfdyA9IHsKKyAgICAuZGV2X21hZ2ljID0gX19ERVZfTUFHSUMsCisgICAgLmZsYWdzID0gX19ERVZfT1VUUFVUIHwgX19ERVZfTlVMTCwKKyAgICAuZmlsZWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQVBQRU5ELAorICAgIC53cml0ZSA9IF9fbnVsbF93cml0ZSwKKyAgICAuY2xvc2UgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvb3Blbi5jIGIvY29tMzIvbGliL3N5cy9vcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkNWJiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvb3Blbi5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgImZpbGUuaCIKKworLyoKKyAqIG9wZW4uYworICoKKyAqIE9wZW4gYW4gb3JkaW5hcnkgZmlsZQorICovCisKK2V4dGVybiBzc2l6ZV90IF9fZmlsZV9yZWFkKHN0cnVjdCBmaWxlX2luZm8gKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIGludCBfX2ZpbGVfY2xvc2Uoc3RydWN0IGZpbGVfaW5mbyAqKTsKKworY29uc3Qgc3RydWN0IGlucHV0X2RldiBfX2ZpbGVfZGV2ID0geworICAgIC5kZXZfbWFnaWMgPSBfX0RFVl9NQUdJQywKKyAgICAuZmxhZ3MgPSBfX0RFVl9GSUxFIHwgX19ERVZfSU5QVVQsCisgICAgLmZpbGVmbGFncyA9IE9fUkRPTkxZLAorICAgIC5yZWFkID0gX19maWxlX3JlYWQsCisgICAgLmNsb3NlID0gX19maWxlX2Nsb3NlLAorICAgIC5vcGVuID0gTlVMTCwKK307CisKK2ludCBvcGVuKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIC4uLikKK3sKKyAgICBpbnQgZmQsIGhhbmRsZTsKKyAgICBzdHJ1Y3QgZmlsZV9pbmZvICpmcDsKKworICAgIGZkID0gb3BlbmRldigmX19maWxlX2RldiwgTlVMTCwgZmxhZ3MpOworCisgICAgLy9wcmludGYoImVudGVyLCBmaWxlID0gJXMsIGZkID0gJWRcbiIsIHBhdGhuYW1lLCBmZCk7CisKKyAgICBpZiAoZmQgPCAwKQorCXJldHVybiAtMTsKKworICAgIGZwID0gJl9fZmlsZV9pbmZvW2ZkXTsKKworICAgIGhhbmRsZSA9IG9wZW5fZmlsZShwYXRobmFtZSwgZmxhZ3MsICZmcC0+aS5mZCk7CisgICAgaWYgKGhhbmRsZSA8IDApIHsKKwljbG9zZShmZCk7CisJZXJybm8gPSBFTk9FTlQ7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGZwLT5pLm9mZnNldCA9IDA7CisgICAgZnAtPmkubmJ5dGVzID0gMDsKKworICAgIHJldHVybiBmZDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvb3BlbmNvbnNvbGUuYyBiL2NvbTMyL2xpYi9zeXMvb3BlbmNvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzc1NjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9vcGVuY29uc29sZS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBvcGVuY29uc29sZS5jCisgKgorICogT3BlbiB0aGUgY2hvc2VuIGNvbnNvbGUgZGV2aWNlCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitpbnQgb3BlbmNvbnNvbGUoY29uc3Qgc3RydWN0IGlucHV0X2RldiAqaWRldiwgY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgKm9kZXYpCit7CisgICAgY2xvc2UoMCk7CisgICAgaWYgKG9wZW5kZXYoaWRldiwgb2RldiwgT19SRE9OTFkpICE9IDApCisJcmV0dXJuIC0xOworICAgIGNsb3NlKDEpOworICAgIGlmIChvcGVuZGV2KGlkZXYsIG9kZXYsIE9fV1JPTkxZKSAhPSAxKQorCXJldHVybiAtMTsKKyAgICBjbG9zZSgyKTsKKyAgICBpZiAob3BlbmRldihpZGV2LCBvZGV2LCBPX1dST05MWSkgIT0gMikKKwlyZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvb3BlbmRldi5jIGIvY29tMzIvbGliL3N5cy9vcGVuZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmOWQwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvb3BlbmRldi5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCisvKgorICogb3BlbmRldi5jCisgKgorICogT3BlbiBhIHNwZWNpYWwgZGV2aWNlCisgKi8KKworaW50IG9wZW5kZXYoY29uc3Qgc3RydWN0IGlucHV0X2RldiAqaWRldiwKKwkgICAgY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgKm9kZXYsIGludCBmbGFncykKK3sKKyAgICBpbnQgZmQ7CisgICAgc3RydWN0IGZpbGVfaW5mbyAqZnA7CisgICAgaW50IG9rZmxhZ3M7CisgICAgaW50IGU7CisKKyAgICBva2ZsYWdzID0gKGlkZXYgPyBpZGV2LT5maWxlZmxhZ3MgOiAwKSB8IChvZGV2ID8gb2Rldi0+ZmlsZWZsYWdzIDogMCk7CisKKyAgICBpZiAoIShmbGFncyAmIDMpIHx8IChmbGFncyAmIH5va2ZsYWdzKSkgeworCWVycm5vID0gRUlOVkFMOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3IgKGZkID0gMCwgZnAgPSBfX2ZpbGVfaW5mbzsgZmQgPCBORklMRVM7IGZkKyssIGZwKyspCisJaWYgKCFmcC0+aW9wICYmICFmcC0+b29wKQorCSAgICBicmVhazsKKworICAgIGlmIChmZCA+PSBORklMRVMpIHsKKwllcnJubyA9IEVNRklMRTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogVGhlIGZpbGUgc3RydWN0dXJlIGlzIGFscmVhZHkgemVyb2VkICovCisgICAgZnAtPmlvcCA9ICZkZXZfZXJyb3JfcjsKKyAgICBmcC0+b29wID0gJmRldl9lcnJvcl93OworICAgIGZwLT5pLmRhdGFwID0gZnAtPmkuYnVmOworCisgICAgaWYgKGlkZXYpIHsKKwlpZiAoaWRldi0+b3BlbiAmJiAoZSA9IGlkZXYtPm9wZW4oZnApKSkgeworCSAgICBlcnJubyA9IGU7CisJICAgIGdvdG8gcHVrZTsKKwl9CisJZnAtPmlvcCA9IGlkZXY7CisgICAgfQorCisgICAgd2hpbGUgKG9kZXYpIHsKKwlpZiAob2Rldi0+b3BlbiAmJiAoZSA9IG9kZXYtPm9wZW4oZnApKSkgeworCSAgICBpZiAoZSA9PSBFQUdBSU4pIHsKKwkJaWYgKG9kZXYtPmZhbGxiYWNrKSB7CisJCSAgICBvZGV2ID0gb2Rldi0+ZmFsbGJhY2s7CisJCSAgICBjb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJICAgIGUgPSBFSU87CisJCX0KKwkgICAgfQorCSAgICBlcnJubyA9IGU7CisJICAgIGdvdG8gcHVrZTsKKwl9CisJZnAtPm9vcCA9IG9kZXY7CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZkOworCitwdWtlOgorICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL29wZW5tZW0uYyBiL2NvbTMyL2xpYi9zeXMvb3Blbm1lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NmE0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL29wZW5tZW0uYwpAQCAtMCwwICsxLDYxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCisvKgorICogb3Blbm1lbS5jCisgKgorICogT3BlbiBhIGNodW5rIG9mIG1lbW9yeSBhcyBpZiBpdCB3YXMgYSBmaWxlCisgKi8KKworY29uc3Qgc3RydWN0IGlucHV0X2RldiBfX2ZpbGVfZGV2OworCitpbnQgb3Blbm1lbShjb25zdCB2b2lkICpiYXNlLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGZkOworICAgIHN0cnVjdCBmaWxlX2luZm8gKmZwOworCisgICAgZmQgPSBvcGVuZGV2KCZfX2ZpbGVfZGV2LCBOVUxMLCBmbGFncyk7CisKKyAgICBpZiAoZmQgPCAwKQorCXJldHVybiAtMTsKKworICAgIGZwID0gJl9fZmlsZV9pbmZvW2ZkXTsKKworICAgIGZwLT5pLmZkLnNpemUgID0gZnAtPmkubmJ5dGVzID0gbGVuOworICAgIGZwLT5pLmRhdGFwICAgPSAodm9pZCAqKWJhc2U7CisgICAgZnAtPmkuZmQuaGFuZGxlID0gMDsJCS8qIE5vIGFjdHVhbCBmaWxlICovCisgICAgZnAtPmkub2Zmc2V0ICA9IDA7CisKKyAgICByZXR1cm4gZmQ7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3Jhd2Nvbl9yZWFkLmMgYi9jb20zMi9saWIvc3lzL3Jhd2Nvbl9yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiYjk1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvcmF3Y29uX3JlYWQuYwpAQCAtMCwwICsxLDgzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmF3Y29uX3JlYWQuYworICoKKyAqIENoYXJhY3Rlci1vcmllbnRlZCByZWFkaW5nIGZyb20gdGhlIGNvbnNvbGUgd2l0aG91dCBlY2hvOworICogdGhpcyBpcyBhIE5PTkJMT0NLSU5HIGRldmljZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlICJmaWxlLmgiCisKKy8qIEdsb2JhbCwgc2luY2UgaXQncyB1c2VkIGJ5IHN0ZGNvbl9yZWFkICovCitzc2l6ZV90IF9fcmF3Y29uX3JlYWQoc3RydWN0IGZpbGVfaW5mbyAqZnAsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgIGNoYXIgKmJ1ZnAgPSBidWY7CisgICAgc2l6ZV90IG4gPSAwOworICAgIHN0YXRpYyBjaGFyIGhpID0gMDsKKyAgICBzdGF0aWMgYm9vbCBoaV9rZXkgPSBmYWxzZTsKKworICAgICh2b2lkKWZwOworCisgICAgd2hpbGUgKG4gPCBjb3VudCkgeworCWlmIChoaV9rZXkpIHsKKwkgICAgKmJ1ZnArKyA9IGhpOworCSAgICBuKys7CisJICAgIGhpX2tleSA9IGZhbHNlOworCSAgICBjb250aW51ZTsKKwl9CisKKwkvKiBQb2xsICovCisJaWYgKCFwb2xsY2hhcigpKQorCSAgICBicmVhazsKKworCS8qIFdlIGhhdmUgZGF0YSwgZ28gZ2V0IGl0ICovCisJKmJ1ZnAgPSBnZXRjaGFyKCZoaSk7CisJaWYgKCEqYnVmcCkKKwkJaGlfa2V5ID0gdHJ1ZTsKKworCWJ1ZnArKzsKKwluKys7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK2NvbnN0IHN0cnVjdCBpbnB1dF9kZXYgZGV2X3Jhd2Nvbl9yID0geworICAgIC5kZXZfbWFnaWMgPSBfX0RFVl9NQUdJQywKKyAgICAuZmxhZ3MgPSBfX0RFVl9UVFkgfCBfX0RFVl9JTlBVVCwKKyAgICAuZmlsZWZsYWdzID0gT19SRE9OTFksCisgICAgLnJlYWQgPSBfX3Jhd2Nvbl9yZWFkLAorICAgIC5jbG9zZSA9IE5VTEwsCisgICAgLm9wZW4gPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvcmF3Y29uX3dyaXRlLmMgYi9jb20zMi9saWIvc3lzL3Jhd2Nvbl93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzkyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL3Jhd2Nvbl93cml0ZS5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiByYXdjb25fd3JpdGUuYworICoKKyAqIFJhdyB3cml0aW5nIHRvIHRoZSBjb25zb2xlOyBubyBcbiAtPiBcclxuIHRyYW5zbGF0aW9uCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCitzdGF0aWMgc3NpemVfdCBfX3Jhd2Nvbl93cml0ZShzdHJ1Y3QgZmlsZV9pbmZvICpmcCwgY29uc3Qgdm9pZCAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50KQoreworICAgIGNvbnN0IGNoYXIgKmJ1ZnAgPSBidWY7CisgICAgc2l6ZV90IG4gPSAwOworCisgICAgKHZvaWQpZnA7CisKKyAgICB3aGlsZSAoY291bnQtLSkgeworCXdyaXRlY2hyKCpidWZwKyspOworCW4rKzsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgZGV2X3Jhd2Nvbl93ID0geworICAgIC5kZXZfbWFnaWMgPSBfX0RFVl9NQUdJQywKKyAgICAuZmxhZ3MgPSBfX0RFVl9UVFkgfCBfX0RFVl9PVVRQVVQsCisgICAgLmZpbGVmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0FQUEVORCwKKyAgICAud3JpdGUgPSBfX3Jhd2Nvbl93cml0ZSwKKyAgICAuY2xvc2UgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvcmVhZC5jIGIvY29tMzIvbGliL3N5cy9yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5N2FkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvcmVhZC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiByZWFkLmMKKyAqCisgKiBSZWFkaW5nIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCitzc2l6ZV90IHJlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBzdHJ1Y3QgZmlsZV9pbmZvICpmcCA9ICZfX2ZpbGVfaW5mb1tmZF07CisKKyAgICBpZiAoZmQgPj0gTkZJTEVTIHx8ICFmcC0+aW9wKSB7CisJZXJybm8gPSBFQkFERjsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIGZwLT5pb3AtPnJlYWQoZnAsIGJ1ZiwgY291bnQpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9zY3JlZW5zaXplLmMgYi9jb20zMi9saWIvc3lzL3NjcmVlbnNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q0NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9zY3JlZW5zaXplLmMKQEAgLTAsMCArMSwyMyBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCitpbnQgZ2V0c2NyZWVuc2l6ZShpbnQgZmQsIGludCAqcm93cywgaW50ICpjb2xzKQoreworICAgIHN0cnVjdCBmaWxlX2luZm8gKmZwID0gJl9fZmlsZV9pbmZvW2ZkXTsKKworICAgIGlmIChmZCA+PSBORklMRVMgfHwgIWZwLT5pb3ApIHsKKwllcnJubyA9IEVCQURGOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICAqcm93cyA9IGZwLT5vLnJvd3M7CisgICAgKmNvbHMgPSBmcC0+by5jb2xzOworCisgICAgaWYgKCEqcm93cyB8fCAhKmNvbHMpIHsKKwllcnJubyA9IEVOT1RUWTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3NlcmlhbF93cml0ZS5jIGIvY29tMzIvbGliL3N5cy9zZXJpYWxfd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjk0OWZiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy9zZXJpYWxfd3JpdGUuYwpAQCAtMCwwICsxLDY3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc2VyaWFsX3dyaXRlLmMKKyAqCisgKiBSYXcgd3JpdGluZyB0byB0aGUgc2VyaWFsIHBvcnQ7IG5vIFxuIC0+IFxyXG4gdHJhbnNsYXRpb24KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJmaWxlLmgiCisKK3NzaXplX3QgX19zZXJpYWxfd3JpdGUoc3RydWN0IGZpbGVfaW5mbyAqZnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgIGNvbnN0IGNoYXIgKmJ1ZnAgPSBidWY7CisgICAgc2l6ZV90IG4gPSAwOworCisgICAgKHZvaWQpZnA7CisKKyAgICBpZiAoIXN5c2xpbnV4X3NlcmlhbF9jb25zb2xlX2luZm8oKS0+aW9iYXNlKQorCXJldHVybiBjb3VudDsJCS8qIE5vdGhpbmcgdG8gZG8gKi8KKworICAgIHdoaWxlIChjb3VudC0tKSB7CisJd3JpdGVfc2VyaWFsKCpidWZwKyspOworCW4rKzsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworY29uc3Qgc3RydWN0IG91dHB1dF9kZXYgZGV2X3NlcmlhbF93ID0geworICAgIC5kZXZfbWFnaWMgPSBfX0RFVl9NQUdJQywKKyAgICAuZmxhZ3MgPSBfX0RFVl9UVFkgfCBfX0RFVl9PVVRQVVQsCisgICAgLmZpbGVmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0FQUEVORCwKKyAgICAud3JpdGUgPSBfX3NlcmlhbF93cml0ZSwKKyAgICAuY2xvc2UgPSBOVUxMLAorICAgIC5vcGVuID0gTlVMTCwKK307CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3NsZWVwLmMgYi9jb20zMi9saWIvc3lzL3NsZWVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1MWMxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvc2xlZXAuYwpAQCAtMCwwICsxLDIyIEBACisvKgorICogc3lzL3NsZWVwLmMKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8c3lzbGludXgvaWRsZS5oPgorCit1bnNpZ25lZCBpbnQgbXNsZWVwKHVuc2lnbmVkIGludCBtc2VjKQoreworICAgIGNsb2NrX3Qgc3RhcnQgPSB0aW1lcyhOVUxMKTsKKworICAgIHdoaWxlICh0aW1lcyhOVUxMKSAtIHN0YXJ0IDwgbXNlYykKKwlzeXNsaW51eF9pZGxlKCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IHNsZWVwKHVuc2lnbmVkIGludCBzZWNvbmRzKQoreworICAgIHJldHVybiBtc2xlZXAoc2Vjb25kcyAqIDEwMDApOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy9zdGRjb25fcmVhZC5jIGIvY29tMzIvbGliL3N5cy9zdGRjb25fcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2N2U1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL3N0ZGNvbl9yZWFkLmMKQEAgLTAsMCArMSw3NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN0ZGNvbl9yZWFkLmMKKyAqCisgKiBMaW5lLW9yaWVudGVkIHJlYWRpbmcgZnJvbSB0aGUgc3RhbmRhcmQgY29uc29sZQorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSAiZmlsZS5oIgorCitleHRlcm4gc3NpemVfdCBfX3Jhd2Nvbl9yZWFkKHN0cnVjdCBmaWxlX2luZm8gKmZwLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CisKK3N0YXRpYyBzc2l6ZV90IF9fc3RkY29uX3JlYWQoc3RydWN0IGZpbGVfaW5mbyAqZnAsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgIGNoYXIgKmJ1ZnAgPSBidWY7CisgICAgc2l6ZV90IG4gPSAwOworICAgIGNoYXIgY2g7CisKKyAgICAodm9pZClmcDsKKworICAgIHdoaWxlIChuIDwgY291bnQpIHsKKwlpZiAoZnAtPmkubmJ5dGVzKSB7CisJICAgIGNoID0gKmJ1ZnArKyA9ICpmcC0+aS5kYXRhcCsrOworCSAgICBmcC0+aS5uYnl0ZXMtLTsKKwkgICAgbisrOworCSAgICBpZiAoY2ggPT0gJ1xuJykKKwkJcmV0dXJuIG47CisJfSBlbHNlIHsKKwkgICAgZnAtPmkubmJ5dGVzID0gX19saW5lX2lucHV0KGZwLCBmcC0+aS5idWYsIE1BWEJMT0NLLCBfX3Jhd2Nvbl9yZWFkKTsKKwkgICAgZnAtPmkuZGF0YXAgPSBmcC0+aS5idWY7CisKKwkgICAgaWYgKGZwLT5pLm5ieXRlcyA9PSAwKQorCQlyZXR1cm4gbjsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK2NvbnN0IHN0cnVjdCBpbnB1dF9kZXYgZGV2X3N0ZGNvbl9yID0geworICAgIC5kZXZfbWFnaWMgPSBfX0RFVl9NQUdJQywKKyAgICAuZmxhZ3MgPSBfX0RFVl9UVFkgfCBfX0RFVl9JTlBVVCwKKyAgICAuZmlsZWZsYWdzID0gT19SRE9OTFksCisgICAgLnJlYWQgPSBfX3N0ZGNvbl9yZWFkLAorICAgIC5jbG9zZSA9IE5VTEwsCisgICAgLm9wZW4gPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvc3RkY29uX3dyaXRlLmMgYi9jb20zMi9saWIvc3lzL3N0ZGNvbl93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDIyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL3N0ZGNvbl93cml0ZS5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzdGRjb25fd3JpdGUuYworICoKKyAqIFdyaXRpbmcgdG8gdGhlIGNvbnNvbGU7IFxuIC0+IFxyXG4gY29udmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlICJmaWxlLmgiCisKKyNkZWZpbmUgQklPU19ST1dTICgqKHVpbnQ4X3QgKikweDQ4NCkJLyogTWludXMgb25lOyBpZiB6ZXJvIHVzZSAyNCAoPSAyNSBsaW5lcykgKi8KKyNkZWZpbmUgQklPU19DT0xTICgqKHVpbnQxNl90ICopMHg0NEEpCisKK3N0YXRpYyBpbnQgX19zdGRjb25fb3BlbihzdHJ1Y3QgZmlsZV9pbmZvICpmcCkKK3sKKyAgICBmcC0+by5yb3dzID0gQklPU19ST1dTICsgMTsKKyAgICBmcC0+by5jb2xzID0gQklPU19DT0xTOworCisgICAgLyogU2FuaXR5IGNoZWNrICovCisgICAgaWYgKGZwLT5vLnJvd3MgPCAxMikKKwlmcC0+by5yb3dzID0gMjQ7CisgICAgaWYgKGZwLT5vLmNvbHMgPCA0MCkKKwlmcC0+by5jb2xzID0gODA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgX19zdGRjb25fd3JpdGUoc3RydWN0IGZpbGVfaW5mbyAqZnAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpidWZwID0gYnVmOworICAgIHNpemVfdCBuID0gMDsKKworICAgICh2b2lkKWZwOworCisgICAgd2hpbGUgKGNvdW50LS0pIHsKKwlpZiAoKmJ1ZnAgPT0gJ1xuJykKKwkgICAgd3JpdGVjaHIoJ1xyJyk7CisKKwl3cml0ZWNocigqYnVmcCsrKTsKKwluKys7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK2NvbnN0IHN0cnVjdCBvdXRwdXRfZGV2IGRldl9zdGRjb25fdyA9IHsKKyAgICAuZGV2X21hZ2ljID0gX19ERVZfTUFHSUMsCisgICAgLmZsYWdzID0gX19ERVZfVFRZIHwgX19ERVZfT1VUUFVULAorICAgIC5maWxlZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19BUFBFTkQsCisgICAgLndyaXRlID0gX19zdGRjb25fd3JpdGUsCisgICAgLmNsb3NlID0gTlVMTCwKKyAgICAub3BlbiAgPSBfX3N0ZGNvbl9vcGVuLAorfTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvdmVzYS9hbHBoYXRibC5wbCBiL2NvbTMyL2xpYi9zeXMvdmVzYS9hbHBoYXRibC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzBjNzZlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy92ZXNhL2FscGhhdGJsLnBsCkBAIC0wLDAgKzEsNTMgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBQcm9kdWNlIGdhbW1hLWNvcnJlY3Rpb24gdGFibGVzIGZvciBhbHBoYSBibGVuZGluZywgYXNzdW1pbmcgc1JHQiBzcGFjZS4KKyMKKworc3ViIHNyZ2JfdG9fbGluZWFyKCQpCit7CisgICAgbXkoJHMpID0gQF87CisKKyAgICBpZiAoJHMgPD0gMTApIHsKKwlyZXR1cm4gJHMvKDI1NSoxMi45Mik7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gKCgkcysxNC4wMjUpLzI2OS4wMjUpKioyLjQ7CisgICAgfQorfQorCitzdWIgbGluZWFyX3RvX3NyZ2IoJCkKK3sKKyAgICBteSgkbCkgPSBAXzsKKyAgICBteSAkczsKKworICAgIGlmICgkbCA8PSAwLjAwMzA0KSB7CisJJHMgPSAxMi45MiokbDsKKyAgICB9IGVsc2UgeworCSRzID0gMS4wNTUqJGwqKigxLjAvMi40KSAtIDAuMDU1OworICAgIH0KKworICAgIHJldHVybiBpbnQoJHMqMjU1KzAuNSk7Cit9CisKKyMgSGVhZGVyCitwcmludCAiI2luY2x1ZGUgPGludHR5cGVzLmg+XG5cbiI7CisKKyMKKyMgVGFibGUgMTogY29udmVydCA4LWJpdCBzUkdCIHZhbHVlcyB0byAxNi1iaXQgbGluZWFyIHZhbHVlcworIworCitwcmludCAiY29uc3QgdWludDE2X3QgX192ZXNhY29uX3NyZ2JfdG9fbGluZWFyWzI1Nl0gPSB7XG4iOworZm9yICgkaSA9IDA7ICRpIDw9IDI1NTsgJGkrKykgeworICAgIHByaW50ZiAiXHQlNWQsXG4iLCBpbnQoc3JnYl90b19saW5lYXIoJGkpKjY1NTM1KzAuNSk7Cit9CitwcmludCAifTtcblxuIjsKKworIworIyBUYWJsZSAyOiBjb252ZXJ0IGxpbmVhciB2YWx1ZXMgaW4gdGhlIHJhbmdlIFswLCA2NTUzNSoyNTVdLAorIyAgICAgICAgICBzaGlmdGVkIHJpZ2h0IGJ5IDEyIGJpdHMsIHRvIHNSR0IKKyMKKworcHJpbnQgImNvbnN0IHVpbnQ4X3QgX192ZXNhY29uX2xpbmVhcl90b19zcmdiWzQwODBdID0ge1xuIjsKK2ZvciAoJGkgPSAwOyAkaSA8PSA0MDc5OyAkaSsrKSB7CisgICAgcHJpbnRmICJcdCUzZCxcbiIsIGxpbmVhcl90b19zcmdiKCgkaSswLjUpLzQwNzkuOTM3NzQ0KTsKK30KK3ByaW50ICJ9O1xuXG4iOwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy92ZXNhL2JhY2tncm91bmQuYyBiL2NvbTMyL2xpYi9zeXMvdmVzYS9iYWNrZ3JvdW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlOTA4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvdmVzYS9iYWNrZ3JvdW5kLmMKQEAgLTAsMCArMSw0NTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA2LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHBuZy5oPgorI2luY2x1ZGUgPHRpbnlqcGVnLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxpbG9nMi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisjaW5jbHVkZSAidmVzYS5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKKy8qKiogRklYOiBUaGlzIHJlYWxseSBzaG91bGQgYmUgYWxwaGEtYmxlbmRlZCB3aXRoIGNvbG9yIGluZGV4IDAgKioqLworCisvKiBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgInN0YXJ0IiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiA0LCB0byBhc3N1cmUKKyAgIGFsaWduZWQgZHdvcmRzLiAqLworc3RhdGljIHZvaWQgZHJhd19iYWNrZ3JvdW5kX2xpbmUoaW50IGxpbmUsIGludCBzdGFydCwgaW50IG5waXhlbHMpCit7CisgICAgdWludDMyX3QgKmJncHRyID0gJl9fdmVzYWNvbl9iYWNrZ3JvdW5kW2xpbmUqX192ZXNhX2luZm8ubWkuaF9yZXMrc3RhcnRdOworICAgIHVuc2lnbmVkIGludCBieXRlc19wZXJfcGl4ZWwgPSBfX3Zlc2Fjb25fYnl0ZXNfcGVyX3BpeGVsOworICAgIHNpemVfdCBmYnB0ciA9IGxpbmUgKiBfX3Zlc2FfaW5mby5taS5sb2dpY2FsX3NjYW4gKyBzdGFydCpieXRlc19wZXJfcGl4ZWw7CisKKyAgICBfX3Zlc2Fjb25fY29weV90b19zY3JlZW4oZmJwdHIsIGJncHRyLCBucGl4ZWxzKTsKK30KKworLyogVGhpcyBkcmF3cyB0aGUgYm9yZGVyLCB0aGVuIHJlZHJhd3MgdGhlIHRleHQgYXJlYSAqLworc3RhdGljIHZvaWQgZHJhd19iYWNrZ3JvdW5kKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgaW50IGJvdHRvbV9ib3JkZXIgPSBWSURFT19CT1JERVIgKworCShURVhUX1BJWEVMX1JPV1MgJSBfX3Zlc2Fjb25fZm9udF9oZWlnaHQpOworICAgIGNvbnN0IGludCByaWdodF9ib3JkZXIgPSBWSURFT19CT1JERVIgKyAoVEVYVF9QSVhFTF9DT0xTICUgRk9OVF9XSURUSCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVklERU9fQk9SREVSOyBpKyspCisJZHJhd19iYWNrZ3JvdW5kX2xpbmUoaSwgMCwgX192ZXNhX2luZm8ubWkuaF9yZXMpOworCisgICAgZm9yIChpID0gVklERU9fQk9SREVSOyBpIDwgX192ZXNhX2luZm8ubWkudl9yZXMgLSBib3R0b21fYm9yZGVyOyBpKyspIHsKKwlkcmF3X2JhY2tncm91bmRfbGluZShpLCAwLCBWSURFT19CT1JERVIpOworCWRyYXdfYmFja2dyb3VuZF9saW5lKGksIF9fdmVzYV9pbmZvLm1pLmhfcmVzIC0gcmlnaHRfYm9yZGVyLAorCQkJICAgICByaWdodF9ib3JkZXIpOworICAgIH0KKworICAgIGZvciAoaSA9IF9fdmVzYV9pbmZvLm1pLnZfcmVzIC0gYm90dG9tX2JvcmRlcjsKKwkgaSA8IF9fdmVzYV9pbmZvLm1pLnZfcmVzOyBpKyspCisJZHJhd19iYWNrZ3JvdW5kX2xpbmUoaSwgMCwgX192ZXNhX2luZm8ubWkuaF9yZXMpOworCisgICAgX192ZXNhY29uX3JlZHJhd190ZXh0KCk7Cit9CisKKy8qCisgKiBUaWxlIGFuIGltYWdlIGluIHRoZSBVTCBjb3JuZXIgYWNyb3NzIHRoZSBlbnRpcmUgc2NyZWVuCisgKi8KK3N0YXRpYyB2b2lkIHRpbGVfaW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCB4c2l6ZSA9IF9fdmVzYV9pbmZvLm1pLmhfcmVzOworICAgIGludCB5c2l6ZSA9IF9fdmVzYV9pbmZvLm1pLnZfcmVzOworICAgIGludCB4LCB5LCB5cjsKKyAgICBpbnQgeGwsIHlsOworICAgIHVpbnQzMl90ICpzcCwgKmRwLCAqZHJwLCAqZHRwOworCisgICAgZHJwID0gX192ZXNhY29uX2JhY2tncm91bmQ7CisgICAgZm9yICh5ID0gMCA7IHkgPCB5c2l6ZSA7IHkgKz0gaGVpZ2h0KSB7CisJeWwgPSBtaW4oaGVpZ2h0LCB5c2l6ZS15KTsKKwlkdHAgPSBkcnA7CisJZm9yICh4ID0gMCA7IHggPCB4c2l6ZSA7IHggKz0gd2lkdGgpIHsKKwkgICAgeGwgPSBtaW4od2lkdGgsIHhzaXplLXgpOworCSAgICBpZiAoeCB8fCB5KSB7CisJCXNwID0gX192ZXNhY29uX2JhY2tncm91bmQ7CisJCWRwID0gZHRwOworCQlmb3IgKHlyID0gMCA7IHlyIDwgeWwgOyB5cisrKSB7CisJCSAgICBtZW1jcHkoZHAsIHNwLCB4bCpzaXplb2YodWludDMyX3QpKTsKKwkJICAgIGRwICs9IHhzaXplOworCQkgICAgc3AgKz0geHNpemU7CisJCX0KKwkgICAgfQorCSAgICBkdHAgKz0geGw7CisJfQorCWRycCArPSB4c2l6ZSpoZWlnaHQ7CisgICAgfQorfQorCitzdGF0aWMgaW50IHJlYWRfcG5nX2ZpbGUoRklMRSAqIGZwKQoreworICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBOVUxMOworICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7CisjaWYgMAorICAgIHBuZ19jb2xvcl8xNnAgaW1hZ2VfYmFja2dyb3VuZDsKKyAgICBzdGF0aWMgY29uc3QgcG5nX2NvbG9yXzE2IG15X2JhY2tncm91bmQgPSB7IDAsIDAsIDAsIDAsIDAgfTsKKyNlbmRpZgorICAgIHBuZ19ieXRlcCByb3dfcG9pbnRlcnNbX192ZXNhX2luZm8ubWkudl9yZXNdLCBycDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcnYgPSAtMTsKKworICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworCisgICAgaWYgKCFwbmdfcHRyIHx8ICFpbmZvX3B0ciB8fCBzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCisJZ290byBlcnI7CisKKyAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7CisgICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgOCk7CisKKyAgICBwbmdfc2V0X3VzZXJfbGltaXRzKHBuZ19wdHIsIF9fdmVzYV9pbmZvLm1pLmhfcmVzLCBfX3Zlc2FfaW5mby5taS52X3Jlcyk7CisKKyAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKKworICAgIC8qIFNldCB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucy4gIFdlIG5lZWQgdG8gZW5kIHVwCisgICAgICAgd2l0aCAzMi1iaXQgQkdSQSBmb3JtYXQsIG5vIG1vcmUsIG5vIGxlc3MuICovCisKKyAgICAvKiBFeHBhbmQgdG8gUkdCIGZpcnN0Li4uICovCisgICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfUEFMRVRURSkKKwlwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKHBuZ19wdHIpOworICAgIGVsc2UgaWYgKCEoaW5mb19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpCisJcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKKworICAgIC8qIEFkZCBhbHBoYSBjaGFubmVsLCBpZiBuZWVkIGJlICovCisgICAgaWYgKCEocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSkgeworCWlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKKwkgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOworCWVsc2UKKwkgICAgcG5nX3NldF9hZGRfYWxwaGEocG5nX3B0ciwgfjAsIFBOR19GSUxMRVJfQUZURVIpOworICAgIH0KKworICAgIC8qIEFkanVzdCB0aGUgYnl0ZSBvcmRlciwgaWYgbmVjZXNzYXJ5ICovCisgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7CisKKyAgICAvKiBNYWtlIHN1cmUgd2UgZW5kIHVwIHdpdGggOC1iaXQgZGF0YSAqLworICAgIGlmIChpbmZvX3B0ci0+Yml0X2RlcHRoID09IDE2KQorCXBuZ19zZXRfc3RyaXBfMTYocG5nX3B0cik7CisgICAgZWxzZSBpZiAoaW5mb19wdHItPmJpdF9kZXB0aCA8IDgpCisJcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOworCisjaWYgMAorICAgIGlmIChwbmdfZ2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsICZpbWFnZV9iYWNrZ3JvdW5kKSkKKwlwbmdfc2V0X2JhY2tncm91bmQocG5nX3B0ciwgaW1hZ2VfYmFja2dyb3VuZCwKKwkJCSAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUsIDEsIDEuMCk7CisgICAgZWxzZQorCXBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCAmbXlfYmFja2dyb3VuZCwKKwkJCSAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMCwgMS4wKTsKKyNlbmRpZgorCisgICAgLyogV2hldyEgIE5vdyB3ZSBzaG91bGQgZ2V0IHRoZSBzdHVmZiB3ZSB3YW50Li4uICovCisgICAgcnAgPSAocG5nX2J5dGVwKV9fdmVzYWNvbl9iYWNrZ3JvdW5kOworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWluZm9fcHRyLT5oZWlnaHQ7IGkrKykgeworCXJvd19wb2ludGVyc1tpXSA9IHJwOworCXJwICs9IF9fdmVzYV9pbmZvLm1pLmhfcmVzIDw8IDI7CisgICAgfQorCisgICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKKworICAgIHRpbGVfaW1hZ2UoaW5mb19wdHItPndpZHRoLCBpbmZvX3B0ci0+aGVpZ2h0KTsKKworICAgIHJ2ID0gMDsKKworZXJyOgorICAgIGlmIChwbmdfcHRyKQorCXBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIChwbmdfaW5mb3BwKSBOVUxMKTsKKyAgICByZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQganBlZ19zaWdfY21wKHVpbnQ4X3QgKiBieXRlcywgaW50IGxlbikKK3sKKyAgICAodm9pZClsZW47CisKKyAgICByZXR1cm4gKGJ5dGVzWzBdID09IDB4ZmYgJiYgYnl0ZXNbMV0gPT0gMHhkOCkgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9qcGVnX2ZpbGUoRklMRSAqIGZwLCB1aW50OF90ICogaGVhZGVyLCBpbnQgbGVuKQoreworICAgIHN0cnVjdCBqZGVjX3ByaXZhdGUgKmpkZWMgPSBOVUxMOworICAgIHZvaWQgKmpwZWdfZmlsZSA9IE5VTEw7CisgICAgc2l6ZV90IGxlbmd0aF9vZl9maWxlOworICAgIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBydiA9IC0xOworICAgIHVuc2lnbmVkIGNoYXIgKmNvbXBvbmVudHNbMV07CisgICAgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9yb3dbMV07CisKKyAgICBydiA9IGZsb2FkZmlsZShmcCwgJmpwZWdfZmlsZSwgJmxlbmd0aF9vZl9maWxlLCBoZWFkZXIsIGxlbik7CisgICAgaWYgKHJ2KQorCWdvdG8gZXJyOworCisgICAgamRlYyA9IHRpbnlqcGVnX2luaXQoKTsKKyAgICBpZiAoIWpkZWMpCisJZ290byBlcnI7CisKKyAgICBpZiAodGlueWpwZWdfcGFyc2VfaGVhZGVyKGpkZWMsIGpwZWdfZmlsZSwgbGVuZ3RoX29mX2ZpbGUpIDwgMCkKKwlnb3RvIGVycjsKKworICAgIHRpbnlqcGVnX2dldF9zaXplKGpkZWMsICZ3aWR0aCwgJmhlaWdodCk7CisgICAgaWYgKHdpZHRoID4gX192ZXNhX2luZm8ubWkuaF9yZXMgfHwgaGVpZ2h0ID4gX192ZXNhX2luZm8ubWkudl9yZXMpCisJZ290byBlcnI7CisKKyAgICBjb21wb25lbnRzWzBdID0gKHZvaWQgKilfX3Zlc2Fjb25fYmFja2dyb3VuZDsKKyAgICB0aW55anBlZ19zZXRfY29tcG9uZW50cyhqZGVjLCBjb21wb25lbnRzLCAxKTsKKyAgICBieXRlc19wZXJfcm93WzBdID0gX192ZXNhX2luZm8ubWkuaF9yZXMgPDwgMjsKKyAgICB0aW55anBlZ19zZXRfYnl0ZXNfcGVyX3JvdyhqZGVjLCBieXRlc19wZXJfcm93LCAxKTsKKworICAgIHRpbnlqcGVnX2RlY29kZShqZGVjLCBUSU5ZSlBFR19GTVRfQkdSQTMyKTsKKyAgICB0aWxlX2ltYWdlKHdpZHRoLCBoZWlnaHQpOworCisgICAgcnYgPSAwOworCitlcnI6CisgICAgLyogRG9uJ3QgdXNlIHRpbnlqcGVnX2ZyZWUoKSBoZXJlLCBzaW5jZSB3ZSBkaWRuJ3QgYWxsb3cgdGlueWpwZWcKKyAgICAgICB0byBhbGxvY2F0ZSB0aGUgZnJhbWUgYnVmZmVyICovCisgICAgaWYgKGpkZWMpCisJZnJlZShqZGVjKTsKKworICAgIGlmIChqcGVnX2ZpbGUpCisJZnJlZShqcGVnX2ZpbGUpOworCisgICAgcmV0dXJuIHJ2OworfQorCisvKiBTaW1wbGUgZ3JleSBHYXVzc2lhbiBob2xlLCBlbm91Z2ggdG8gbG9vayBpbnRlcmVzdGluZyAqLworaW50IHZlc2Fjb25fZGVmYXVsdF9iYWNrZ3JvdW5kKHZvaWQpCit7CisgICAgaW50IHgsIHksIGR4LCBkeSwgZHkyOworICAgIGludCB6OworICAgIHVuc2lnbmVkIGludCBzaGZ0OworICAgIHVpbnQ4X3QgKmJncHRyID0gKHVpbnQ4X3QgKilfX3Zlc2Fjb25fYmFja2dyb3VuZDsKKyAgICB1aW50OF90IGs7CisKKyAgICBpZiAoX192ZXNhY29uX3BpeGVsX2Zvcm1hdCA9PSBQWEZfTk9ORSkKKwlyZXR1cm4gMDsJCS8qIE5vdCBpbiBncmFwaGljcyBtb2RlICovCisKKyAgICB6ID0gbWF4KF9fdmVzYV9pbmZvLm1pLnZfcmVzLCBfX3Zlc2FfaW5mby5taS5oX3JlcykgPj4gMTsKKyAgICB6ID0gKCh6KnopID4+IDExKSAtIDE7CisgICAgc2hmdCA9IGlsb2cyKHopICsgMTsKKworICAgIGZvciAoeSA9IDAsIGR5ID0gLShfX3Zlc2FfaW5mby5taS52X3JlcyA+PiAxKTsKKwkgeSA8IF9fdmVzYV9pbmZvLm1pLnZfcmVzOyB5KyssIGR5KyspIHsKKwlkeTIgPSBkeSAqIGR5OworCWZvciAoeCA9IDAsIGR4ID0gLShfX3Zlc2FfaW5mby5taS5oX3JlcyA+PiAxKTsKKwkgICAgIHggPCBfX3Zlc2FfaW5mby5taS5oX3JlczsgeCsrLCBkeCsrKSB7CisJICAgIGsgPSBfX3Zlc2Fjb25fbGluZWFyX3RvX3NyZ2JbNTAwICsgKChkeCpkeCArIGR5MikgPj4gc2hmdCldOworCSAgICBiZ3B0clswXSA9IGs7CS8qIEJsdWUgKi8KKwkgICAgYmdwdHJbMV0gPSBrOwkvKiBHcmVlbiAqLworCSAgICBiZ3B0clsyXSA9IGs7CS8qIFJlZCAqLworCSAgICBiZ3B0ciArPSA0OwkJLyogRHVtbXkgYWxwaGEgKi8KKwl9CisgICAgfQorCisgICAgZHJhd19iYWNrZ3JvdW5kKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFNldCB0aGUgYmFja2dyb3VuZCB0byBhIHNpbmdsZSBmbGF0IGNvbG9yICovCitpbnQgdmVzYWNvbl9zZXRfYmFja2dyb3VuZCh1bnNpZ25lZCBpbnQgcmdiKQoreworICAgIHZvaWQgKmJncHRyID0gX192ZXNhY29uX2JhY2tncm91bmQ7CisgICAgdW5zaWduZWQgaW50IGNvdW50ID0gX192ZXNhX2luZm8ubWkuaF9yZXMgKiBfX3Zlc2FfaW5mby5taS52X3JlczsKKworICAgIGlmIChfX3Zlc2Fjb25fcGl4ZWxfZm9ybWF0ID09IFBYRl9OT05FKQorCXJldHVybiAwOwkJLyogTm90IGluIGdyYXBoaWNzIG1vZGUgKi8KKworICAgIGFzbSB2b2xhdGlsZSAoInJlcDsgc3Rvc2wiOiIrRCIgKGJncHRyKSwgIitjIihjb3VudCkKKwkJICA6ImEiKHJnYikKKwkJICA6Im1lbW9yeSIpOworCisgICAgZHJhd19iYWNrZ3JvdW5kKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsc3MxNl9oZWFkZXIgeworICAgIHVpbnQzMl90IG1hZ2ljOworICAgIHVpbnQxNl90IHhzaXplOworICAgIHVpbnQxNl90IHlzaXplOworfTsKKworI2RlZmluZSBMU1MxNl9NQUdJQyAweDE0MTNmMzNkCisKK3N0YXRpYyBpbmxpbmUgaW50IGxzczE2X3NpZ19jbXAoY29uc3Qgdm9pZCAqaGVhZGVyLCBpbnQgbGVuKQoreworICAgIGNvbnN0IHN0cnVjdCBsc3MxNl9oZWFkZXIgKmggPSBoZWFkZXI7CisKKyAgICBpZiAobGVuICE9IDgpCisJcmV0dXJuIDE7CisKKyAgICByZXR1cm4gIShoLT5tYWdpYyA9PSBMU1MxNl9NQUdJQyAmJgorCSAgICAgaC0+eHNpemUgPD0gX192ZXNhX2luZm8ubWkuaF9yZXMgJiYKKwkgICAgIGgtPnlzaXplIDw9IF9fdmVzYV9pbmZvLm1pLnZfcmVzKTsKK30KKworc3RhdGljIGludCByZWFkX2xzczE2X2ZpbGUoRklMRSAqIGZwLCBjb25zdCB2b2lkICpoZWFkZXIsIGludCBoZWFkZXJfbGVuKQoreworICAgIGNvbnN0IHN0cnVjdCBsc3MxNl9oZWFkZXIgKmggPSBoZWFkZXI7CisgICAgdWludDMyX3QgY29sb3JzWzE2XSwgY29sb3I7CisgICAgYm9vbCBoYXNfbnliYmxlOworICAgIHVpbnQ4X3QgYnl0ZTsKKyAgICBpbnQgY291bnQ7CisgICAgaW50IG55YmJsZSwgcHJldjsKKyAgICBlbnVtIHN0YXRlIHsKKwlzdF9zdGFydCwKKwlzdF9jMCwKKwlzdF9jMSwKKwlzdF9jMiwKKyAgICB9IHN0YXRlOworICAgIGludCBpLCB4LCB5OworICAgIHVpbnQzMl90ICpiZ3B0ciA9IF9fdmVzYWNvbl9iYWNrZ3JvdW5kOworCisgICAgLyogQXNzdW1lIHRoZSBoZWFkZXIsIDggYnl0ZXMsIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiAqLworICAgIGlmIChoZWFkZXJfbGVuICE9IDgpCisJcmV0dXJuIC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwl1aW50OF90IHJnYlszXTsKKwlpZiAoZnJlYWQocmdiLCAxLCAzLCBmcCkgIT0gMykKKwkgICAgcmV0dXJuIC0xOworCisJY29sb3JzW2ldID0gKCgocmdiWzBdICYgNjMpICogMjU1IC8gNjMpIDw8IDE2KSArCisJICAgICgoKHJnYlsxXSAmIDYzKSAqIDI1NSAvIDYzKSA8PCA4KSArCisJICAgICgocmdiWzJdICYgNjMpICogMjU1IC8gNjMpOworICAgIH0KKworICAgIC8qIEJ5IHNwZWMsIHRoZSBzdGF0ZSBtYWNoaW5lIGlzIHBlciByb3cgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgaC0+eXNpemU7IHkrKykgeworCXN0YXRlID0gc3Rfc3RhcnQ7CisJaGFzX255YmJsZSA9IGZhbHNlOworCWNvbG9yID0gY29sb3JzW3ByZXYgPSAwXTsJLyogQnkgc3BlY2lmaWNhdGlvbiAqLworCWNvdW50ID0gMDsKKworCXggPSAwOworCXdoaWxlICh4IDwgaC0+eHNpemUpIHsKKwkgICAgaWYgKCFoYXNfbnliYmxlKSB7CisJCWlmIChmcmVhZCgmYnl0ZSwgMSwgMSwgZnApICE9IDEpCisJCSAgICByZXR1cm4gLTE7CisJCW55YmJsZSA9IGJ5dGUgJiAweGY7CisJCWhhc19ueWJibGUgPSB0cnVlOworCSAgICB9IGVsc2UgeworCQlueWJibGUgPSBieXRlID4+IDQ7CisJCWhhc19ueWJibGUgPSBmYWxzZTsKKwkgICAgfQorCisJICAgIHN3aXRjaCAoc3RhdGUpIHsKKwkgICAgY2FzZSBzdF9zdGFydDoKKwkJaWYgKG55YmJsZSAhPSBwcmV2KSB7CisJCSAgICAqYmdwdHIrKyA9IGNvbG9yID0gY29sb3JzW3ByZXYgPSBueWJibGVdOworCQkgICAgeCsrOworCQl9IGVsc2UgeworCQkgICAgc3RhdGUgPSBzdF9jMDsKKwkJfQorCQlicmVhazsKKworCSAgICBjYXNlIHN0X2MwOgorCQlpZiAobnliYmxlID09IDApIHsKKwkJICAgIHN0YXRlID0gc3RfYzE7CisJCX0gZWxzZSB7CisJCSAgICBjb3VudCA9IG55YmJsZTsKKwkJICAgIGdvdG8gZG9fcnVuOworCQl9CisJCWJyZWFrOworCisJICAgIGNhc2Ugc3RfYzE6CisJCWNvdW50ID0gbnliYmxlICsgMTY7CisJCXN0YXRlID0gc3RfYzI7CisJCWJyZWFrOworCisJICAgIGNhc2Ugc3RfYzI6CisJCWNvdW50ICs9IG55YmJsZSA8PCA0OworCQlnb3RvIGRvX3J1bjsKKworZG9fcnVuOgorCQljb3VudCA9IG1pbihjb3VudCwgaC0+eHNpemUgLSB4KTsKKwkJeCArPSBjb3VudDsKKwkJYXNtIHZvbGF0aWxlICgicmVwOyBzdG9zbCI6IitEIiAoYmdwdHIpLAorCQkJICAgICAgIitjIihjb3VudCk6ImEiKGNvbG9yKSk7CisJCXN0YXRlID0gc3Rfc3RhcnQ7CisJCWJyZWFrOworCSAgICB9CisJfQorCisJLyogWmVyby1maWxsIHJlc3Qgb2Ygcm93ICovCisJaSA9IF9fdmVzYV9pbmZvLm1pLmhfcmVzIC0geDsKKwlhc20gdm9sYXRpbGUgKCJyZXA7IHN0b3NsIjoiK0QiIChiZ3B0ciksICIrYyIoaSk6ImEiKDApOiJtZW1vcnkiKTsKKyAgICB9CisKKyAgICAvKiBaZXJvLWZpbGwgcmVzdCBvZiBzY3JlZW4gKi8KKyAgICBpID0gKF9fdmVzYV9pbmZvLm1pLnZfcmVzIC0geSkgKiBfX3Zlc2FfaW5mby5taS5oX3JlczsKKyAgICBhc20gdm9sYXRpbGUgKCJyZXA7IHN0b3NsIjoiK0QiIChiZ3B0ciksICIrYyIoaSk6ImEiKDApOiJtZW1vcnkiKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdmVzYWNvbl9sb2FkX2JhY2tncm91bmQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgRklMRSAqZnAgPSBOVUxMOworICAgIHVpbnQ4X3QgaGVhZGVyWzhdOworICAgIGludCBydiA9IDE7CisKKyAgICBpZiAoX192ZXNhY29uX3BpeGVsX2Zvcm1hdCA9PSBQWEZfTk9ORSkKKwlyZXR1cm4gMDsJCS8qIE5vdCBpbiBncmFwaGljcyBtb2RlICovCisKKyAgICBmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCisgICAgaWYgKCFmcCkKKwlnb3RvIGVycjsKKworICAgIGlmIChmcmVhZChoZWFkZXIsIDEsIDgsIGZwKSAhPSA4KQorCWdvdG8gZXJyOworCisgICAgaWYgKCFwbmdfc2lnX2NtcChoZWFkZXIsIDAsIDgpKSB7CisJcnYgPSByZWFkX3BuZ19maWxlKGZwKTsKKyAgICB9IGVsc2UgaWYgKCFqcGVnX3NpZ19jbXAoaGVhZGVyLCA4KSkgeworCXJ2ID0gcmVhZF9qcGVnX2ZpbGUoZnAsIGhlYWRlciwgOCk7CisgICAgfSBlbHNlIGlmICghbHNzMTZfc2lnX2NtcChoZWFkZXIsIDgpKSB7CisJcnYgPSByZWFkX2xzczE2X2ZpbGUoZnAsIGhlYWRlciwgOCk7CisgICAgfQorCisgICAgLyogVGhpcyBhY3R1YWxseSBkaXNwbGF5cyB0aGUgc3R1ZmYgKi8KKyAgICBkcmF3X2JhY2tncm91bmQoKTsKKworZXJyOgorICAgIGlmIChmcCkKKwlmY2xvc2UoZnApOworCisgICAgcmV0dXJuIHJ2OworfQorCitpbnQgX192ZXNhY29uX2luaXRfYmFja2dyb3VuZCh2b2lkKQoreworICAgIC8qIF9fdmVzYWNvbl9iYWNrZ3JvdW5kIHdhcyBjbGVhcmVkIGJ5IGNhbGxvYygpICovCisKKyAgICAvKiBUaGUgVkVTQSBCSU9TIGhhcyBhbHJlYWR5IGNsZWFyZWQgdGhlIHNjcmVlbiAqLworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy92ZXNhL2RlYnVnLmggYi9jb20zMi9saWIvc3lzL3Zlc2EvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQwODVmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy92ZXNhL2RlYnVnLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBMSUJfU1lTX1ZFU0FfREVCVUdfSAorI2RlZmluZSBMSUJfU1lTX1ZFU0FfREVCVUdfSAorCisjaWYgMAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworc3NpemVfdCBfX3NlcmlhbF93cml0ZSh2b2lkICpmcCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpOworCitzdGF0aWMgdm9pZCBkZWJ1Zyhjb25zdCBjaGFyICpzdHIsIC4uLikKK3sKKyAgICB2YV9saXN0IHZhOworICAgIGNoYXIgYnVmWzY1NTM2XTsKKyAgICBzaXplX3QgbGVuOworCisgICAgdmFfc3RhcnQodmEsIHN0cik7CisgICAgbGVuID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1Ziwgc3RyLCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKworICAgIGlmIChsZW4gPj0gc2l6ZW9mIGJ1ZikKKwlsZW4gPSBzaXplb2YgYnVmIC0gMTsKKworICAgIF9fc2VyaWFsX3dyaXRlKE5VTEwsIGJ1ZiwgbGVuKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnKGNvbnN0IGNoYXIgKnN0ciwgLi4uKQoreworICAgICh2b2lkKXN0cjsKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiBMSUJfU1lTX1ZFU0FfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy92ZXNhL2RyYXd0eHQuYyBiL2NvbTMyL2xpYi9zeXMvdmVzYS9kcmF3dHh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhOWU5NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvdmVzYS9kcmF3dHh0LmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA2LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGNvbG9ydGJsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidmVzYS5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAiZmlsbC5oIgorCisvKgorICogVmlzaWJsZSBjdXJzb3IgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHVpbnQ4X3QgY3Vyc29yX3BhdHRlcm5bRk9OVF9NQVhfSEVJR0hUXTsKK3N0YXRpYyBzdHJ1Y3QgdmVzYV9jaGFyICpjdXJzb3JfcG9pbnRlciA9IE5VTEw7CitzdGF0aWMgaW50IGN1cnNvcl94LCBjdXJzb3JfeTsKKworc3RhdGljIGlubGluZSB2b2lkICpjb3B5X2R3b3JkKHZvaWQgKmRzdCwgdm9pZCAqc3JjLCBzaXplX3QgZHdvcmRfY291bnQpCit7CisgICAgYXNtIHZvbGF0aWxlICgicmVwOyBtb3ZzbCI6IitEIiAoZHN0KSwgIitTIihzcmMpLCAiK2MiKGR3b3JkX2NvdW50KSk7CisgICAgcmV0dXJuIGRzdDsJCQkvKiBVcGRhdGVkIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KK30KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSkpCit1aW50OF90IGFscGhhX3ZhbCh1aW50OF90IGZnLCB1aW50OF90IGJnLCB1aW50OF90IGFscGhhKQoreworICAgIHVuc2lnbmVkIGludCB0bXA7CisKKyAgICB0bXAgPSBfX3Zlc2Fjb25fc3JnYl90b19saW5lYXJbZmddICogYWxwaGE7CisgICAgdG1wICs9IF9fdmVzYWNvbl9zcmdiX3RvX2xpbmVhcltiZ10gKiAoMjU1IC0gYWxwaGEpOworCisgICAgcmV0dXJuIF9fdmVzYWNvbl9saW5lYXJfdG9fc3JnYlt0bXAgPj4gMTJdOworfQorCitzdGF0aWMgdWludDMyX3QgYWxwaGFfcGl4ZWwodWludDMyX3QgZmcsIHVpbnQzMl90IGJnKQoreworICAgIHVpbnQ4X3QgYWxwaGEgPSBmZyA+PiAyNDsKKyAgICB1aW50OF90IGZnX3IgPSBmZyA+PiAxNjsKKyAgICB1aW50OF90IGZnX2cgPSBmZyA+PiA4OworICAgIHVpbnQ4X3QgZmdfYiA9IGZnOworICAgIHVpbnQ4X3QgYmdfciA9IGJnID4+IDE2OworICAgIHVpbnQ4X3QgYmdfZyA9IGJnID4+IDg7CisgICAgdWludDhfdCBiZ19iID0gYmc7CisKKyAgICByZXR1cm4KKwkoYWxwaGFfdmFsKGZnX3IsIGJnX3IsIGFscGhhKSA8PCAxNikgfAorCShhbHBoYV92YWwoZmdfZywgYmdfZywgYWxwaGEpIDw8IDgpIHwgKGFscGhhX3ZhbChmZ19iLCBiZ19iLCBhbHBoYSkpOworfQorCitzdGF0aWMgdm9pZCB2ZXNhY29uX3VwZGF0ZV9jaGFyYWN0ZXJzKGludCByb3csIGludCBjb2wsIGludCBucm93cywgaW50IG5jb2xzKQoreworICAgIGNvbnN0IGludCBoZWlnaHQgPSBfX3Zlc2Fjb25fZm9udF9oZWlnaHQ7CisgICAgY29uc3QgaW50IHdpZHRoID0gRk9OVF9XSURUSDsKKyAgICB1aW50MzJfdCAqYmdyb3dwdHIsICpiZ3B0ciwgYmd2YWwsIGZndmFsOworICAgIHVpbnQzMl90IGZnY29sb3IgPSAwLCBiZ2NvbG9yID0gMCwgY29sb3I7CisgICAgdWludDhfdCBjaGJpdHMgPSAwLCBjaHhiaXRzID0gMCwgY2hzYml0cyA9IDA7CisgICAgaW50IGksIGosIGp4LCBwaXhyb3csIHBpeHNyb3c7CisgICAgc3RydWN0IHZlc2FfY2hhciAqcm93cHRyLCAqcm93c3B0ciwgKmNwdHIsICpjc3B0cjsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX3BpeGVsID0gX192ZXNhY29uX2J5dGVzX3Blcl9waXhlbDsKKyAgICB1bnNpZ25lZCBsb25nIHBpeGVsX29mZnNldDsKKyAgICB1aW50MzJfdCByb3dfYnVmZmVyW19fdmVzYV9pbmZvLm1pLmhfcmVzXSwgKnJvd2J1ZnB0cjsKKyAgICBzaXplX3QgZmJyb3dwdHI7CisgICAgdWludDhfdCBzaGE7CisKKyAgICBwaXhlbF9vZmZzZXQgPSAoKHJvdyAqIGhlaWdodCArIFZJREVPX0JPUkRFUikgKiBfX3Zlc2FfaW5mby5taS5oX3JlcykgKworCShjb2wgKiB3aWR0aCArIFZJREVPX0JPUkRFUik7CisKKyAgICBiZ3Jvd3B0ciA9ICZfX3Zlc2Fjb25fYmFja2dyb3VuZFtwaXhlbF9vZmZzZXRdOworICAgIGZicm93cHRyID0gKHJvdyAqIGhlaWdodCArIFZJREVPX0JPUkRFUikgKiBfX3Zlc2FfaW5mby5taS5sb2dpY2FsX3NjYW4gKworCShjb2wgKiB3aWR0aCArIFZJREVPX0JPUkRFUikgKiBieXRlc19wZXJfcGl4ZWw7CisKKyAgICAvKiBOb3RlIHRoYXQgd2Uga2VlcCBhIDEtY2hhcmFjdGVyIGd1YXJkIGFyZWEgYXJvdW5kIHRoZSByZWFsIHRleHQgYXJlYS4uLiAqLworICAgIHJvd3B0ciA9ICZfX3Zlc2Fjb25fdGV4dF9kaXNwbGF5Wyhyb3crMSkqKF9fdmVzYWNvbl90ZXh0X2NvbHMrMikrKGNvbCsxKV07CisgICAgcm93c3B0ciA9IHJvd3B0ciAtICgoX192ZXNhY29uX3RleHRfY29scysyKSsxKTsKKyAgICBwaXhyb3cgPSAwOworICAgIHBpeHNyb3cgPSBoZWlnaHQgLSAxOworCisgICAgZm9yIChpID0gaGVpZ2h0ICogbnJvd3M7IGkgPj0gMDsgaS0tKSB7CisJYmdwdHIgPSBiZ3Jvd3B0cjsKKwlyb3didWZwdHIgPSByb3dfYnVmZmVyOworCisJY3B0ciA9IHJvd3B0cjsKKwljc3B0ciA9IHJvd3NwdHI7CisKKwljaHNiaXRzID0gX192ZXNhY29uX2dyYXBoaWNzX2ZvbnRbY3NwdHItPmNoXVtwaXhzcm93XTsKKwlpZiAoX191bmxpa2VseShjc3B0ciA9PSBjdXJzb3JfcG9pbnRlcikpCisJICAgIGNoc2JpdHMgfD0gY3Vyc29yX3BhdHRlcm5bcGl4c3Jvd107CisJc2hhID0gY29uc29sZV9jb2xvcl90YWJsZVtjc3B0ci0+YXR0cl0uc2hhZG93OworCWNoc2JpdHMgJj0gKHNoYSAmIDB4MDIpID8gMHhmZiA6IDB4MDA7CisJY2hzYml0cyBePSAoc2hhICYgMHgwMSkgPyAweGZmIDogMHgwMDsKKwljaHNiaXRzIDw8PSAod2lkdGggLSAyKTsKKwljc3B0cisrOworCisJLyogRHJhdyB0d28gcGl4ZWxzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgT25lIGZvciB0aGUgc2hhZG93LAorCSAgIGFuZCBvbmUgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSB3aG9sZSBkd29yZCBvZiBkYXRhIGZvciB0aGUgY29weQorCSAgIG9wZXJhdGlvbiBhdCB0aGUgZW5kLiAgTm90ZSB0aGF0IHRoaXMgY29kZSBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQKKwkgICBhbGwgY2hhcmFjdGVycyBiZWdpbiBvbiBkd29yZCBib3VuZGFyaWVzIGluIHRoZSBmcmFtZSBidWZmZXIuICovCisKKwlmb3IgKGp4ID0gMSwgaiA9IHdpZHRoICogbmNvbHMgKyAxOyBqID49IDA7IGotLSkgeworCSAgICBjaGJpdHMgPDw9IDE7CisJICAgIGNoc2JpdHMgPDw9IDE7CisJICAgIGNoeGJpdHMgPDw9IDE7CisKKwkgICAgc3dpdGNoIChqeCkgeworCSAgICBjYXNlIDE6CisJCWNoYml0cyA9IF9fdmVzYWNvbl9ncmFwaGljc19mb250W2NwdHItPmNoXVtwaXhyb3ddOworCQlpZiAoX191bmxpa2VseShjcHRyID09IGN1cnNvcl9wb2ludGVyKSkKKwkJICAgIGNoYml0cyB8PSBjdXJzb3JfcGF0dGVybltwaXhyb3ddOworCQlzaGEgPSBjb25zb2xlX2NvbG9yX3RhYmxlW2NwdHItPmF0dHJdLnNoYWRvdzsKKwkJY2h4Yml0cyA9IGNoYml0czsKKwkJY2h4Yml0cyAmPSAoc2hhICYgMHgwMikgPyAweGZmIDogMHgwMDsKKwkJY2h4Yml0cyBePSAoc2hhICYgMHgwMSkgPyAweGZmIDogMHgwMDsKKwkJZmdjb2xvciA9IGNvbnNvbGVfY29sb3JfdGFibGVbY3B0ci0+YXR0cl0uYXJnYl9mZzsKKwkJYmdjb2xvciA9IGNvbnNvbGVfY29sb3JfdGFibGVbY3B0ci0+YXR0cl0uYXJnYl9iZzsKKwkJY3B0cisrOworCQlqeC0tOworCQlicmVhazsKKwkgICAgY2FzZSAwOgorCQljaHNiaXRzID0gX192ZXNhY29uX2dyYXBoaWNzX2ZvbnRbY3NwdHItPmNoXVtwaXhzcm93XTsKKwkJaWYgKF9fdW5saWtlbHkoY3NwdHIgPT0gY3Vyc29yX3BvaW50ZXIpKQorCQkgICAgY2hzYml0cyB8PSBjdXJzb3JfcGF0dGVybltwaXhzcm93XTsKKwkJc2hhID0gY29uc29sZV9jb2xvcl90YWJsZVtjc3B0ci0+YXR0cl0uc2hhZG93OworCQljaHNiaXRzICY9IChzaGEgJiAweDAyKSA/IDB4ZmYgOiAweDAwOworCQljaHNiaXRzIF49IChzaGEgJiAweDAxKSA/IDB4ZmYgOiAweDAwOworCQljc3B0cisrOworCQlqeCA9IHdpZHRoIC0gMTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWp4LS07CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgLyogSWYgdGhpcyBwaXhlbCBpcyByYWlzZWQsIHVzZSB0aGUgb2Zmc2V0dGVkIHZhbHVlICovCisJICAgIGJndmFsID0gKGNoeGJpdHMgJiAweDgwKQorCQk/IGJncHRyW19fdmVzYV9pbmZvLm1pLmhfcmVzICsgMV0gOiAqYmdwdHI7CisJICAgIGJncHRyKys7CisKKwkgICAgLyogSWYgdGhpcyBwaXhlbCBpcyBzZXQsIHVzZSB0aGUgZmcgY29sb3IsIGVsc2UgdGhlIGJnIGNvbG9yICovCisJICAgIGZndmFsID0gKGNoYml0cyAmIDB4ODApID8gZmdjb2xvciA6IGJnY29sb3I7CisKKwkgICAgLyogUHJvZHVjZSB0aGUgY29tYmluZWQgY29sb3IgcGl4ZWwgdmFsdWUgKi8KKwkgICAgY29sb3IgPSBhbHBoYV9waXhlbChmZ3ZhbCwgYmd2YWwpOworCisJICAgIC8qIEFwcGx5IHRoZSBzaGFkb3cgKDc1JSBzaGFkb3cpICovCisJICAgIGlmICgoY2hzYml0cyAmIH5jaHhiaXRzKSAmIDB4ODApIHsKKwkJY29sb3IgPj49IDI7CisJCWNvbG9yICY9IDB4M2YzZjNmOworCSAgICB9CisKKwkgICAgKnJvd2J1ZnB0cisrID0gY29sb3I7CisJfQorCisJLyogQ29weSB0byBmcmFtZSBidWZmZXIgKi8KKwlfX3Zlc2Fjb25fY29weV90b19zY3JlZW4oZmJyb3dwdHIsIHJvd19idWZmZXIsIHJvd2J1ZnB0ciAtIHJvd19idWZmZXIpOworCisJYmdyb3dwdHIgKz0gX192ZXNhX2luZm8ubWkuaF9yZXM7CisJZmJyb3dwdHIgKz0gX192ZXNhX2luZm8ubWkubG9naWNhbF9zY2FuOworCisJaWYgKCsrcGl4cm93ID09IGhlaWdodCkgeworCSAgICByb3dwdHIgKz0gX192ZXNhY29uX3RleHRfY29scyArIDI7CisJICAgIHBpeHJvdyA9IDA7CisJfQorCWlmICgrK3BpeHNyb3cgPT0gaGVpZ2h0KSB7CisJICAgIHJvd3NwdHIgKz0gX192ZXNhY29uX3RleHRfY29scyArIDI7CisJICAgIHBpeHNyb3cgPSAwOworCX0KKyAgICB9Cit9CisKKy8qIEJvdW5kaW5nIGJveCBmb3IgY2hhbmdlZCB0ZXh0LiAgVGhlICh4MSwgeTEpIGNvb3JkaW5hdGVzIGFyZSArMSEgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXBkX3gwID0gLTFVLCB1cGRfeDEsIHVwZF95MCA9IC0xVSwgdXBkX3kxOworCisvKiBVcGRhdGUgdGhlIHJhbmdlIGFscmVhZHkgdG91Y2hlZCBieSB2YXJpb3VzIHZhcmlhYmxlcyAqLwordm9pZCBfX3Zlc2Fjb25fZG9pdCh2b2lkKQoreworICAgIGlmICh1cGRfeDEgPiB1cGRfeDAgJiYgdXBkX3kxID4gdXBkX3kwKSB7CisJdmVzYWNvbl91cGRhdGVfY2hhcmFjdGVycyh1cGRfeTAsIHVwZF94MCwgdXBkX3kxIC0gdXBkX3kwLAorCQkJCSAgdXBkX3gxIC0gdXBkX3gwKTsKKwl1cGRfeDAgPSB1cGRfeTAgPSAtMVU7CisJdXBkX3gxID0gdXBkX3kxID0gMDsKKyAgICB9Cit9CisKKy8qIE1hcmsgYSByYW5nZSBmb3IgdXBkYXRlOyBub3RlIGFyZ3VtZW50IHNlcXVlbmNlIGlzIHRoZSBzYW1lIGFzCisgICB2ZXNhY29uX3VwZGF0ZV9jaGFyYWN0ZXJzKCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZXNhY29uX3RvdWNoKGludCByb3csIGludCBjb2wsIGludCByb3dzLCBpbnQgY29scykKK3sKKyAgICB1bnNpZ25lZCBpbnQgeTAgPSByb3c7CisgICAgdW5zaWduZWQgaW50IHgwID0gY29sOworICAgIHVuc2lnbmVkIGludCB5MSA9IHkwICsgcm93czsKKyAgICB1bnNpZ25lZCBpbnQgeDEgPSB4MCArIGNvbHM7CisKKyAgICBpZiAoeTAgPCB1cGRfeTApCisJdXBkX3kwID0geTA7CisgICAgaWYgKHkxID4gdXBkX3kxKQorCXVwZF95MSA9IHkxOworICAgIGlmICh4MCA8IHVwZF94MCkKKwl1cGRfeDAgPSB4MDsKKyAgICBpZiAoeDEgPiB1cGRfeDEpCisJdXBkX3gxID0geDE7Cit9CisKKy8qIEVyYXNlIGEgcmVnaW9uIG9mIHRoZSBzY3JlZW4gKi8KK3ZvaWQgX192ZXNhY29uX2VyYXNlKGludCB4MCwgaW50IHkwLCBpbnQgeDEsIGludCB5MSwgYXR0cl90IGF0dHIpCit7CisgICAgaW50IHk7CisgICAgc3RydWN0IHZlc2FfY2hhciAqcHRyID0gJl9fdmVzYWNvbl90ZXh0X2Rpc3BsYXkKKwlbKHkwICsgMSkgKiAoX192ZXNhY29uX3RleHRfY29scyArIDIpICsgKHgwICsgMSldOworICAgIHN0cnVjdCB2ZXNhX2NoYXIgZmlsbCA9IHsKKwkuY2ggPSAnICcsCisJLmF0dHIgPSBhdHRyLAorICAgIH07CisgICAgaW50IG5jb2xzID0geDEgLSB4MCArIDE7CisKKyAgICBmb3IgKHkgPSB5MDsgeSA8PSB5MTsgeSsrKSB7CisJdmVzYWNvbl9maWxsKHB0ciwgZmlsbCwgbmNvbHMpOworCXB0ciArPSBfX3Zlc2Fjb25fdGV4dF9jb2xzICsgMjsKKyAgICB9CisKKyAgICB2ZXNhY29uX3RvdWNoKHkwLCB4MCwgeTEgLSB5MCArIDEsIG5jb2xzKTsKK30KKworLyogU2Nyb2xsIHRoZSBzY3JlZW4gdXAgKi8KK3ZvaWQgX192ZXNhY29uX3Njcm9sbF91cChpbnQgbnJvd3MsIGF0dHJfdCBhdHRyKQoreworICAgIHN0cnVjdCB2ZXNhX2NoYXIgKmZyb21wdHIgPSAmX192ZXNhY29uX3RleHRfZGlzcGxheQorCVsobnJvd3MgKyAxKSAqIChfX3Zlc2Fjb25fdGV4dF9jb2xzICsgMildOworICAgIHN0cnVjdCB2ZXNhX2NoYXIgKnRvcHRyID0gJl9fdmVzYWNvbl90ZXh0X2Rpc3BsYXkKKwlbKF9fdmVzYWNvbl90ZXh0X2NvbHMgKyAyKV07CisgICAgaW50IGR3b3JkX2NvdW50ID0KKwkoX192ZXNhY29uX3RleHRfcm93cyAtIG5yb3dzKSAqIChfX3Zlc2Fjb25fdGV4dF9jb2xzICsgMik7CisgICAgc3RydWN0IHZlc2FfY2hhciBmaWxsID0geworCS5jaCA9ICcgJywKKwkuYXR0ciA9IGF0dHIsCisgICAgfTsKKworICAgIHRvcHRyID0gY29weV9kd29yZCh0b3B0ciwgZnJvbXB0ciwgZHdvcmRfY291bnQpOworCisgICAgZHdvcmRfY291bnQgPSBucm93cyAqIChfX3Zlc2Fjb25fdGV4dF9jb2xzICsgMik7CisKKyAgICB2ZXNhY29uX2ZpbGwodG9wdHIsIGZpbGwsIGR3b3JkX2NvdW50KTsKKworICAgIHZlc2Fjb25fdG91Y2goMCwgMCwgX192ZXNhY29uX3RleHRfcm93cywgX192ZXNhY29uX3RleHRfY29scyk7Cit9CisKKy8qIERyYXcgb25lIGNoYXJhY3RlciB0ZXh0IGF0IGEgc3BlY2lmaWMgYXJlYSBvZiB0aGUgc2NyZWVuICovCit2b2lkIF9fdmVzYWNvbl93cml0ZV9jaGFyKGludCB4LCBpbnQgeSwgdWludDhfdCBjaCwgYXR0cl90IGF0dHIpCit7CisgICAgc3RydWN0IHZlc2FfY2hhciAqcHRyID0gJl9fdmVzYWNvbl90ZXh0X2Rpc3BsYXkKKwlbKHkgKyAxKSAqIChfX3Zlc2Fjb25fdGV4dF9jb2xzICsgMikgKyAoeCArIDEpXTsKKworICAgIHB0ci0+Y2ggPSBjaDsKKyAgICBwdHItPmF0dHIgPSBhdHRyOworCisgICAgdmVzYWNvbl90b3VjaCh5LCB4LCAxLCAxKTsKK30KKwordm9pZCBfX3Zlc2Fjb25fc2V0X2N1cnNvcihpbnQgeCwgaW50IHksIGJvb2wgdmlzaWJsZSkKK3sKKyAgICBzdHJ1Y3QgdmVzYV9jaGFyICpwdHIgPSAmX192ZXNhY29uX3RleHRfZGlzcGxheQorCVsoeSArIDEpICogKF9fdmVzYWNvbl90ZXh0X2NvbHMgKyAyKSArICh4ICsgMSldOworCisgICAgaWYgKGN1cnNvcl9wb2ludGVyKQorCXZlc2Fjb25fdG91Y2goY3Vyc29yX3ksIGN1cnNvcl94LCAxLCAxKTsKKworICAgIGlmICghdmlzaWJsZSkgeworCS8qIEludmlzaWJsZSBjdXJzb3IgKi8KKwljdXJzb3JfcG9pbnRlciA9IE5VTEw7CisgICAgfSBlbHNlIHsKKwljdXJzb3JfcG9pbnRlciA9IHB0cjsKKwl2ZXNhY29uX3RvdWNoKHksIHgsIDEsIDEpOworICAgIH0KKworICAgIGN1cnNvcl94ID0geDsKKyAgICBjdXJzb3JfeSA9IHk7Cit9CisKK3ZvaWQgX192ZXNhY29uX2luaXRfY3Vyc29yKGludCBmb250X2hlaWdodCkKK3sKKyAgICBpbnQgcjAgPSBmb250X2hlaWdodCAtIChmb250X2hlaWdodCA8IDEwID8gMiA6IDMpOworCisgICAgaWYgKHIwIDwgMCkKKwlyMCA9IDA7CisKKyAgICBtZW1zZXQoY3Vyc29yX3BhdHRlcm4sIDAsIGZvbnRfaGVpZ2h0KTsKKyAgICBjdXJzb3JfcGF0dGVybltyMF0gPSAweGZmOworICAgIGN1cnNvcl9wYXR0ZXJuW3IwICsgMV0gPSAweGZmOworfQorCit2b2lkIF9fdmVzYWNvbl9yZWRyYXdfdGV4dCh2b2lkKQoreworICAgIHZlc2Fjb25fdXBkYXRlX2NoYXJhY3RlcnMoMCwgMCwgX192ZXNhY29uX3RleHRfcm93cywgX192ZXNhY29uX3RleHRfY29scyk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3Zlc2EvZmlsbC5oIGIvY29tMzIvbGliL3N5cy92ZXNhL2ZpbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQzYzcyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy92ZXNhL2ZpbGwuaApAQCAtMCwwICsxLDYzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNi0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQl9TWVNfVkVTQV9GSUxMX0gKKyNkZWZpbmUgTElCX1NZU19WRVNBX0ZJTExfSAorCisjaW5jbHVkZSAidmlkZW8uaCIKKworLyogRmlsbCBhIG51bWJlciBvZiBjaGFyYWN0ZXJzLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmVzYV9jaGFyICp2ZXNhY29uX2ZpbGwoc3RydWN0IHZlc2FfY2hhciAqcHRyLAorCQkJCQkgICAgIHN0cnVjdCB2ZXNhX2NoYXIgZmlsbCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnQpCit7CisgICAgc3dpdGNoIChzaXplb2Yoc3RydWN0IHZlc2FfY2hhcikpIHsKKyAgICBjYXNlIDE6CisJYXNtIHZvbGF0aWxlICgicmVwOyBzdG9zYiI6IitEIiAocHRyKSwgIitjIihjb3VudCkKKwkJICAgICAgOiJhIihmaWxsKQorCQkgICAgICA6Im1lbW9yeSIpOworCWJyZWFrOworICAgIGNhc2UgMjoKKwlhc20gdm9sYXRpbGUgKCJyZXA7IHN0b3N3IjoiK0QiIChwdHIpLCAiK2MiKGNvdW50KQorCQkgICAgICA6ImEiKGZpbGwpCisJCSAgICAgIDoibWVtb3J5Iik7CisJYnJlYWs7CisgICAgY2FzZSA0OgorCWFzbSB2b2xhdGlsZSAoInJlcDsgc3Rvc2wiOiIrRCIgKHB0ciksICIrYyIoY291bnQpCisJCSAgICAgIDoiYSIoZmlsbCkKKwkJICAgICAgOiJtZW1vcnkiKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXdoaWxlIChjb3VudC0tKQorCSAgICAqcHRyKysgPSBmaWxsOworCWJyZWFrOworICAgIH0KKworICAgIHJldHVybiBwdHI7Cit9CisKKyNlbmRpZiAvKiBMSUJfU1lTX1ZFU0FfRklMTF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3Zlc2EvZm10cGl4ZWwuYyBiL2NvbTMyL2xpYi9zeXMvdmVzYS9mbXRwaXhlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MWZjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL3Zlc2EvZm10cGl4ZWwuYwpAQCAtMCwwICsxLDEwMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGZtdHBpeGVsLmMKKyAqCisgKiBGdW5jdGlvbnMgdG8gZm9ybWF0IGEgc2luZ2xlIHBpeGVsCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAidmlkZW8uaCIKKworLyoKKyAqIEZvcm1hdCBhIHNlcXVlbmNlIG9mIHBpeGVscy4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbGluZSBidWZmZXI7CisgKiB3ZSBjYW4gdXNlIGl0IHRvIHdyaXRlIHVwIHRvIDQgYnl0ZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHBpeGVsLgorICogUmV0dXJuIHRoZSBwbGFjZSB3ZSBzaG91bGQgYmUgY29weWluZyBmcm9tLCB0aGlzIGlzIHVzdWFsbHkgdGhlCisgKiBidWZmZXIgYWRkcmVzcywgYnV0IGRvZXNuJ3QgKmhhdmUqIHRvIGJlLgorICovCisKK3N0YXRpYyBjb25zdCB2b2lkICpmb3JtYXRfcHhmX2JncmEzMih2b2lkICpwdHIsIGNvbnN0IHVpbnQzMl90ICogcCwgc2l6ZV90IG4pCit7CisgICAgKHZvaWQpcHRyOworICAgICh2b2lkKW47CisgICAgcmV0dXJuIHA7CQkJLyogTm8gY29udmVyc2lvbiBuZWVkZWQhICovCit9CisKK3N0YXRpYyBjb25zdCB2b2lkICpmb3JtYXRfcHhmX2JncjI0KHZvaWQgKnB0ciwgY29uc3QgdWludDMyX3QgKiBwLCBzaXplX3QgbikKK3sKKyAgICBjaGFyICpxID0gcHRyOworCisgICAgd2hpbGUgKG4tLSkgeworCSoodWludDMyX3QgKikgcSA9ICpwKys7CisJcSArPSAzOworICAgIH0KKyAgICByZXR1cm4gcHRyOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCAqZm9ybWF0X3B4Zl9sZV9yZ2IxNl81NjUodm9pZCAqcHRyLCBjb25zdCB1aW50MzJfdCAqIHAsCisJCQkJCSAgIHNpemVfdCBuKQoreworICAgIHVpbnQzMl90IGJncmE7CisgICAgdWludDE2X3QgKnEgPSBwdHI7CisKKyAgICB3aGlsZSAobi0tKSB7CisJYmdyYSA9ICpwKys7CisJKnErKyA9CisJICAgICgoYmdyYSA+PiAzKSAmIDB4MWYpICsKKwkgICAgKChiZ3JhID4+ICgyICsgOCAtIDUpKSAmICgweDNmIDw8IDUpKSArCisJICAgICgoYmdyYSA+PiAoMyArIDE2IC0gMTEpKSAmICgweDFmIDw8IDExKSk7CisgICAgfQorICAgIHJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkICpmb3JtYXRfcHhmX2xlX3JnYjE1XzU1NSh2b2lkICpwdHIsIGNvbnN0IHVpbnQzMl90ICogcCwKKwkJCQkJICAgc2l6ZV90IG4pCit7CisgICAgdWludDMyX3QgYmdyYTsKKyAgICB1aW50MTZfdCAqcSA9IHB0cjsKKworICAgIHdoaWxlIChuLS0pIHsKKwliZ3JhID0gKnArKzsKKwkqcSsrID0KKwkgICAgKChiZ3JhID4+IDMpICYgMHgxZikgKworCSAgICAoKGJncmEgPj4gKDIgKyA4IC0gNSkpICYgKDB4MWYgPDwgNSkpICsKKwkgICAgKChiZ3JhID4+ICgzICsgMTYgLSAxMCkpICYgKDB4MWYgPDwgMTApKTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKworX192ZXNhY29uX2Zvcm1hdF9waXhlbHNfdCBfX3Zlc2Fjb25fZm9ybWF0X3BpeGVsczsKKworY29uc3QgX192ZXNhY29uX2Zvcm1hdF9waXhlbHNfdCBfX3Zlc2Fjb25fZm9ybWF0X3BpeGVsc19saXN0W1BYRl9OT05FXSA9IHsKKyAgICBbUFhGX0JHUkEzMl0gPSBmb3JtYXRfcHhmX2JncmEzMiwKKyAgICBbUFhGX0JHUjI0XSA9IGZvcm1hdF9weGZfYmdyMjQsCisgICAgW1BYRl9MRV9SR0IxNl81NjVdID0gZm9ybWF0X3B4Zl9sZV9yZ2IxNl81NjUsCisgICAgW1BYRl9MRV9SR0IxNV81NTVdID0gZm9ybWF0X3B4Zl9sZV9yZ2IxNV81NTUsCit9OwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy92ZXNhL2k5MTVyZXNvbHV0aW9uLmMgYi9jb20zMi9saWIvc3lzL3Zlc2EvaTkxNXJlc29sdXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJiMDRkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy92ZXNhL2k5MTVyZXNvbHV0aW9uLmMKQEAgLTAsMCArMSw3OTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqICAgCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogICAKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBCYXNlZCBvbjoKKyAqIAorICogOTE1IHJlc29sdXRpb24gYnkgc3RldmUgdG9tbGplbm92aWMKKyAqCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSBvbiBTb255IFZHTi1GUzU1MC4gIFVzZSBhdCB5b3VyIG93biByaXNrCisgKgorICogVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSB0ZWNobmlxdWVzIHVzZWQgaW4gOgorICoKKyAqICAgLSA4NTVwYXRjaC4gIE1hbnkgdGhhbmtzIHRvIENocmlzdGlhbiBaaWV0eiAoY3ppZXR6IGdteCBuZXQpCisgKiAgICAgZm9yIGRlbW9uc3RyYXRpbmcgaG93IHRvIHNoYWRvdyB0aGUgVkJJT1MgaW50byBzeXN0ZW0gUkFNCisgKiAgICAgYW5kIHRoZW4gbW9kaWZ5IGl0LgorICoKKyAqICAgLSAxMjgwcGF0Y2ggYnkgQW5kcmV3IFRpcHRvbiAoYW5kcmV3dGlwdG9uIG51bGwgbGkpLgorICoKKyAqICAgLSA4NTVyZXNvbHV0aW9uIGJ5IEFsYWluIFBvaXJpZXIKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZGVmaW5lIF9fVVNFX0dOVQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9pby5oPgorI2luY2x1ZGUgPHN5cy9jcHUuaD4KKyNpbmNsdWRlIDxzeXMvcGNpLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2RlZmluZSBWQklPU19TVEFSVCAgICAgICAgIDB4YzAwMDAKKyNkZWZpbmUgVkJJT1NfU0laRSAgICAgICAgICAweDEwMDAwCisKKyNkZWZpbmUgTU9ERV9UQUJMRV9PRkZTRVRfODQ1RyA2MTcKKworI2RlZmluZSBWRVJTSU9OICIwLjUuMyIKKworI2RlZmluZSBBVElfU0lHTkFUVVJFMSAiQVRJIE1PQklMSVRZIFJBREVPTiIKKyNkZWZpbmUgQVRJX1NJR05BVFVSRTIgIkFUSSBUZWNobm9sb2dpZXMgSW5jIgorI2RlZmluZSBOVklESUFfU0lHTkFUVVJFICJOVklESUEgQ29ycCIKKyNkZWZpbmUgSU5URUxfU0lHTkFUVVJFICJJbnRlbCBDb3JwIgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKiBhZGRyZXNzOworCit0eXBlZGVmIGVudW0geworICAgIENUX1VOS1dOLCBDVF84MzAsIENUXzg0NUcsIENUXzg1NUdNLCBDVF84NjVHLCBDVF85MTVHLCBDVF85MTVHTSwKKyAgICBDVF85NDVHLCBDVF85NDVHTSwgQ1RfOTQ2R1osIENUX0c5NjUsIENUX1E5NjUsIENUXzk0NUdNRSwKKyAgICBDSElQU0VUX1RZUEVTCit9IGNoaXBzZXRfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBCVF9VTktXTiwgQlRfMSwgQlRfMiwgQlRfMworfSBiaW9zX3R5cGU7CisKK3N0YXRpYyBpbnQgZnJlcXNbXSA9IHsgNjAsIDc1LCA4NSB9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBtb2RlOworICAgIHVpbnQ4X3QgYml0c19wZXJfcGl4ZWw7CisgICAgdWludDE2X3QgcmVzb2x1dGlvbjsKKyAgICB1aW50OF90IHVua25vd247Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZiaW9zX21vZGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCBjbG9jazsJCS8qIENsb2NrIGZyZXF1ZW5jeSBpbiAxMCBrSHogKi8KKyAgICB1aW50OF90IHgxOworICAgIHVpbnQ4X3QgeF90b3RhbDsKKyAgICB1aW50OF90IHgyOworICAgIHVpbnQ4X3QgeTE7CisgICAgdWludDhfdCB5X3RvdGFsOworICAgIHVpbnQ4X3QgeTI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZiaW9zX3Jlc29sdXRpb25fdHlwZTE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjbG9jazsKKworICAgIHVpbnQxNl90IHgxOworICAgIHVpbnQxNl90IGh0b3RhbDsKKyAgICB1aW50MTZfdCB4MjsKKyAgICB1aW50MTZfdCBoYmxhbms7CisgICAgdWludDE2X3QgaHN5bmNzdGFydDsKKyAgICB1aW50MTZfdCBoc3luY2VuZDsKKworICAgIHVpbnQxNl90IHkxOworICAgIHVpbnQxNl90IHZ0b3RhbDsKKyAgICB1aW50MTZfdCB5MjsKKyAgICB1aW50MTZfdCB2Ymxhbms7CisgICAgdWludDE2X3QgdnN5bmNzdGFydDsKKyAgICB1aW50MTZfdCB2c3luY2VuZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmJpb3NfbW9kZWxpbmVfdHlwZTI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHhjaGFyczsKKyAgICB1aW50OF90IHljaGFyczsKKyAgICB1aW50OF90IHVua25vd25bNF07CisKKyAgICB2Ymlvc19tb2RlbGluZV90eXBlMiBtb2RlbGluZXNbXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmJpb3NfcmVzb2x1dGlvbl90eXBlMjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGNsb2NrOworCisgICAgdWludDE2X3QgeDE7CisgICAgdWludDE2X3QgaHRvdGFsOworICAgIHVpbnQxNl90IHgyOworICAgIHVpbnQxNl90IGhibGFuazsKKyAgICB1aW50MTZfdCBoc3luY3N0YXJ0OworICAgIHVpbnQxNl90IGhzeW5jZW5kOworCisgICAgdWludDE2X3QgeTE7CisgICAgdWludDE2X3QgdnRvdGFsOworICAgIHVpbnQxNl90IHkyOworICAgIHVpbnQxNl90IHZibGFuazsKKyAgICB1aW50MTZfdCB2c3luY3N0YXJ0OworICAgIHVpbnQxNl90IHZzeW5jZW5kOworCisgICAgdWludDE2X3QgdGltaW5nX2g7CisgICAgdWludDE2X3QgdGltaW5nX3Y7CisKKyAgICB1aW50OF90IHVua25vd25bNl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZiaW9zX21vZGVsaW5lX3R5cGUzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciB1bmtub3duWzZdOworCisgICAgdmJpb3NfbW9kZWxpbmVfdHlwZTMgbW9kZWxpbmVzW107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZiaW9zX3Jlc29sdXRpb25fdHlwZTM7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBjaGlwc2V0X2lkOworICAgIGNoaXBzZXRfdHlwZSBjaGlwc2V0OworICAgIGJpb3NfdHlwZSBiaW9zOworICAgIAorICAgIGFkZHJlc3MgYmlvc19wdHI7CisKKyAgICB2Ymlvc19tb2RlICogbW9kZV90YWJsZTsKKyAgICB1bnNpZ25lZCBpbnQgbW9kZV90YWJsZV9zaXplOworCisgICAgdWludDhfdCBiMSwgYjI7CisKKyAgICBib29sIHVubG9ja2VkOworfSB2Ymlvc19tYXA7CisKKyNpZiAwCQkJCS8qIERlYnVnZ2luZyBoYWNrcyAqLworc3RhdGljIHZvaWQgZ29vZF9tYXJrZXIoaW50IHgpCit7CisgICAgKCh1aW50MTZfdCAqKTB4YjgwMDApW3hdID0gMHgyZjMwIC0gKCh4ICYgMHhmMCkgPDwgNCkgKyAoeCAmIDB4MGYpOworfQorCitzdGF0aWMgdm9pZCBiYWRfbWFya2VyKGludCB4KQoreworICAgICgodWludDE2X3QgKikweGI4MDAwKVt4XSA9IDB4NGYzMCAtICgoeCAmIDB4ZjApIDw8IDQpICsgKHggJiAweDBmKTsKK30KKworc3RhdGljIHZvaWQgc3RhdHVzKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgY2hhciBtc2dbODFdLCAqcDsKKyAgICBpbnQgaTsKKyAgICB1aW50MTZfdCAqcTsKKworICAgIG1lbXNldChtc2csIDAsIHNpemVvZiBtc2cpOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZzbnByaW50Zihtc2csIHNpemVvZiBtc2csIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgcCA9IG1zZzsKKyAgICBxID0gKHVpbnQxNl90ICopMHhiODAwMCArIDgwOworICAgIGZvciAoaSA9IDA7IGkgPCA4MDsgaSsrKQorCSpxKysgPSAqcCsrICsgMHgxZjAwOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBnb29kX21hcmtlcihpbnQgeCkgeyAodm9pZCl4OyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYmFkX21hcmtlcihpbnQgeCkgeyAodm9pZCl4OyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc3RhdHVzKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7ICh2b2lkKWZtdDsgfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2NoaXBzZXRfaWQodm9pZCkgeworICAgIHJldHVybiBwY2lfcmVhZGwoMHg4MDAwMDAwMCk7Cit9CisKK3N0YXRpYyBjaGlwc2V0X3R5cGUgZ2V0X2NoaXBzZXQodW5zaWduZWQgaW50IGlkKSB7CisgICAgY2hpcHNldF90eXBlIHR5cGU7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSAweDM1NzU4MDg2OgorICAgICAgICB0eXBlID0gQ1RfODMwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHgyNTYwODA4NjoKKyAgICAgICAgdHlwZSA9IENUXzg0NUc7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBjYXNlIDB4MzU4MDgwODY6CisgICAgICAgIHR5cGUgPSBDVF84NTVHTTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgMHgyNTcwODA4NjoKKyAgICAgICAgdHlwZSA9IENUXzg2NUc7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDI1ODA4MDg2OgorCXR5cGUgPSBDVF85MTVHOworCWJyZWFrOworCisgICAgY2FzZSAweDI1OTA4MDg2OgorICAgICAgICB0eXBlID0gQ1RfOTE1R007CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDI3NzA4MDg2OgorICAgICAgICB0eXBlID0gQ1RfOTQ1RzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MjdhMDgwODY6CisgICAgICAgIHR5cGUgPSBDVF85NDVHTTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4Mjk3MDgwODY6CisgICAgICAgIHR5cGUgPSBDVF85NDZHWjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MjlhMDgwODY6CisJdHlwZSA9IENUX0c5NjU7CisJYnJlYWs7CisKKyAgICBjYXNlIDB4Mjk5MDgwODY6CisgICAgICAgIHR5cGUgPSBDVF9ROTY1OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHgyN2FjODA4NjoKKwl0eXBlID0gQ1RfOTQ1R01FOworCWJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgdHlwZSA9IENUX1VOS1dOOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdHlwZTsKK30KKworCitzdGF0aWMgdmJpb3NfcmVzb2x1dGlvbl90eXBlMSAqIG1hcF90eXBlMV9yZXNvbHV0aW9uKHZiaW9zX21hcCAqIG1hcCwKKwkJCQkJCSAgICAgdWludDE2X3QgcmVzKQoreworICAgIHZiaW9zX3Jlc29sdXRpb25fdHlwZTEgKiBwdHIgPSAoKHZiaW9zX3Jlc29sdXRpb25fdHlwZTEqKShtYXAtPmJpb3NfcHRyICsgcmVzKSk7IAorICAgIHJldHVybiBwdHI7Cit9CisKK3N0YXRpYyB2Ymlvc19yZXNvbHV0aW9uX3R5cGUyICogbWFwX3R5cGUyX3Jlc29sdXRpb24odmJpb3NfbWFwICogbWFwLAorCQkJCQkJICAgICB1aW50MTZfdCByZXMpCit7CisgICAgdmJpb3NfcmVzb2x1dGlvbl90eXBlMiAqIHB0ciA9ICgodmJpb3NfcmVzb2x1dGlvbl90eXBlMiopKG1hcC0+Ymlvc19wdHIgKyByZXMpKTsgCisgICAgcmV0dXJuIHB0cjsKK30KKworc3RhdGljIHZiaW9zX3Jlc29sdXRpb25fdHlwZTMgKiBtYXBfdHlwZTNfcmVzb2x1dGlvbih2Ymlvc19tYXAgKiBtYXAsCisJCQkJCQkgICAgIHVpbnQxNl90IHJlcykKK3sKKyAgICB2Ymlvc19yZXNvbHV0aW9uX3R5cGUzICogcHRyID0gKCh2Ymlvc19yZXNvbHV0aW9uX3R5cGUzKikobWFwLT5iaW9zX3B0ciArIHJlcykpOyAKKyAgICByZXR1cm4gcHRyOworfQorCisKK3N0YXRpYyBib29sIGRldGVjdF9iaW9zX3R5cGUodmJpb3NfbWFwICogbWFwLCBpbnQgZW50cnlfc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB1aW50MTZfdCByMSwgcjI7CisgICAgCisgICAgcjEgPSByMiA9IDMyMDAwOworCisgICAgZm9yIChpID0gMDsgaSA8IG1hcC0+bW9kZV90YWJsZV9zaXplOyBpKyspIHsKKyAgICAgICAgaWYgKG1hcC0+bW9kZV90YWJsZVtpXS5yZXNvbHV0aW9uIDw9IHIxKSB7CisgICAgICAgICAgICByMSA9IG1hcC0+bW9kZV90YWJsZVtpXS5yZXNvbHV0aW9uOworICAgIAl9IGVsc2UgaWYgKG1hcC0+bW9kZV90YWJsZVtpXS5yZXNvbHV0aW9uIDw9IHIyKSB7CisJICAgIHIyID0gbWFwLT5tb2RlX3RhYmxlW2ldLnJlc29sdXRpb247CisgICAgCX0KKyAgICB9CisgICAgCisgICAgcmV0dXJuICgocjItcjEtNikgJSBlbnRyeV9zaXplKSA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xvc2VfdmJpb3ModmJpb3NfbWFwICptYXApCit7CisgICAgKHZvaWQpbWFwOworfQorCitzdGF0aWMgdmJpb3NfbWFwICogb3Blbl92Ymlvcyh2b2lkKQoreworICAgIHN0YXRpYyB2Ymlvc19tYXAgX21hcDsKKyAgICB2Ymlvc19tYXAgKiBjb25zdCBtYXAgPSAmX21hcDsKKworICAgIG1lbXNldCgmX21hcCwgMCwgc2l6ZW9mIF9tYXApOworCisgICAgLyoKKyAgICAgKiBEZXRlcm1pbmUgY2hpcHNldAorICAgICAqLworICAgIG1hcC0+Y2hpcHNldF9pZCA9IGdldF9jaGlwc2V0X2lkKCk7CisgICAgZ29vZF9tYXJrZXIoMHgxMCk7CisgICAgbWFwLT5jaGlwc2V0ID0gZ2V0X2NoaXBzZXQobWFwLT5jaGlwc2V0X2lkKTsKKyAgICBnb29kX21hcmtlcigweDExKTsKKworICAgIC8qCisgICAgICogIE1hcCB0aGUgdmlkZW8gYmlvcyB0byBtZW1vcnkKKyAgICAgKi8KKyAgICBtYXAtPmJpb3NfcHRyID0gKHZvaWQgKilWQklPU19TVEFSVDsKKworICAgIC8qCisgICAgICogY2hlY2sgaWYgd2UgaGF2ZSBBVEkgUmFkZW9uCisgICAgICovCisgICAgCisgICAgaWYgKG1lbW1lbShtYXAtPmJpb3NfcHRyLCBWQklPU19TSVpFLCBBVElfU0lHTkFUVVJFMSwgc3RybGVuKEFUSV9TSUdOQVRVUkUxKSkgfHwKKyAgICAgICAgbWVtbWVtKG1hcC0+Ymlvc19wdHIsIFZCSU9TX1NJWkUsIEFUSV9TSUdOQVRVUkUyLCBzdHJsZW4oQVRJX1NJR05BVFVSRTIpKSApIHsKKyAgICAgICAgZGVidWcoIkFUSSBjaGlwc2V0IGRldGVjdGVkLiAgOTE1cmVzb2x1dGlvbiBvbmx5IHdvcmtzIHdpdGggSW50ZWwgODAwLzkwMCBzZXJpZXMgZ3JhcGhpYyBjaGlwc2V0cy5cclxuIik7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBjaGVjayBpZiB3ZSBoYXZlIE5WSURJQQorICAgICAqLworICAgIAorICAgIGlmIChtZW1tZW0obWFwLT5iaW9zX3B0ciwgVkJJT1NfU0laRSwgTlZJRElBX1NJR05BVFVSRSwgc3RybGVuKE5WSURJQV9TSUdOQVRVUkUpKSkgeworICAgICAgICBkZWJ1ZygiTlZJRElBIGNoaXBzZXQgZGV0ZWN0ZWQuICA5MTVyZXNvbHV0aW9uIG9ubHkgd29ya3Mgd2l0aCBJbnRlbCA4MDAvOTAwIHNlcmllcyBncmFwaGljIGNoaXBzZXRzLlxyXG4iKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGNoZWNrIGlmIHdlIGhhdmUgSW50ZWwKKyAgICAgKi8KKyAgICAKKyAgICBpZiAobWFwLT5jaGlwc2V0ID09IENUX1VOS1dOICYmIG1lbW1lbShtYXAtPmJpb3NfcHRyLCBWQklPU19TSVpFLCBJTlRFTF9TSUdOQVRVUkUsIHN0cmxlbihJTlRFTF9TSUdOQVRVUkUpKSkgeworICAgICAgICBkZWJ1ZygiSW50ZWwgY2hpcHNldCBkZXRlY3RlZC4gIEhvd2V2ZXIsIDkxNXJlc29sdXRpb24gd2FzIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNoaXBzZXQgdHlwZS5cclxuIik7CisKKyAgICAgICAgZGVidWcoIkNoaXBzZXQgSWQ6ICV4XHJcbiIsIG1hcC0+Y2hpcHNldF9pZCk7CisKKyAgICAgICAgZGVidWcoIlBsZWFzZSByZXBvcnQgdGhpcyBwcm9ibGVtIHRvIHN0b21samVuQHlhaG9vLmNvbVxyXG4iKTsKKyAgICAgICAgCisgICAgICAgIGNsb3NlX3ZiaW9zKG1hcCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBjaGVjayBmb3Igb3RoZXJzCisgICAgICovCisKKyAgICBpZiAobWFwLT5jaGlwc2V0ID09IENUX1VOS1dOKSB7CisgICAgICAgIGRlYnVnKCJVbmtub3duIGNoaXBzZXQgdHlwZSBhbmQgdW5yZWNvZ25pemVkIGJpb3MuXHJcbiIpOworICAgICAgICBkZWJ1ZygiOTE1cmVzb2x1dGlvbiBvbmx5IHdvcmtzIHdpdGggSW50ZWwgODAwLzkwMCBzZXJpZXMgZ3JhcGhpYyBjaGlwc2V0cy5cclxuIik7CisKKyAgICAgICAgZGVidWcoIkNoaXBzZXQgSWQ6ICV4XHJcbiIsIG1hcC0+Y2hpcHNldF9pZCk7CisgICAgICAgIGNsb3NlX3ZiaW9zKG1hcCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBtb2RlIHRhYmxlIGlzIAorICAgICAqLworICAgIGdvb2RfbWFya2VyKDB4MTIpOworCisgICAgeworICAgICAgICBhZGRyZXNzIHAgPSBtYXAtPmJpb3NfcHRyICsgMTY7CisgICAgICAgIGFkZHJlc3MgbGltaXQgPSBtYXAtPmJpb3NfcHRyICsgVkJJT1NfU0laRSAtICgzICogc2l6ZW9mKHZiaW9zX21vZGUpKTsKKyAgICAgICAgCisgICAgICAgIHdoaWxlIChwIDwgbGltaXQgJiYgbWFwLT5tb2RlX3RhYmxlID09IDApIHsKKyAgICAgICAgICAgIHZiaW9zX21vZGUgKiBtb2RlX3B0ciA9ICh2Ymlvc19tb2RlICopIHA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgoKG1vZGVfcHRyWzBdLm1vZGUgJiAweGYwKSA9PSAweDMwKSAmJiAoKG1vZGVfcHRyWzFdLm1vZGUgJiAweGYwKSA9PSAweDMwKSAmJgorICAgICAgICAgICAgICAgICgobW9kZV9wdHJbMl0ubW9kZSAmIDB4ZjApID09IDB4MzApICYmICgobW9kZV9wdHJbM10ubW9kZSAmIDB4ZjApID09IDB4MzApKSB7CisKKyAgICAgICAgICAgICAgICBtYXAtPm1vZGVfdGFibGUgPSBtb2RlX3B0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcCsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hcC0+bW9kZV90YWJsZSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1ZygiVW5hYmxlIHRvIGxvY2F0ZSB0aGUgbW9kZSB0YWJsZS5cclxuIik7CisgICAgICAgICAgICBjbG9zZV92YmlvcyhtYXApOworCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBnb29kX21hcmtlcigweDEzKTsKKworICAgIC8qCisgICAgICogRGV0ZXJtaW5lIHNpemUgb2YgbW9kZSB0YWJsZQorICAgICAqLworICAgIAorICAgIHsKKyAgICAgICAgdmJpb3NfbW9kZSAqIG1vZGVfcHRyID0gbWFwLT5tb2RlX3RhYmxlOworICAgICAgICAKKyAgICAgICAgd2hpbGUgKG1vZGVfcHRyLT5tb2RlICE9IDB4ZmYpIHsKKyAgICAgICAgICAgIG1hcC0+bW9kZV90YWJsZV9zaXplKys7CisgICAgICAgICAgICBtb2RlX3B0cisrOworICAgICAgICB9CisgICAgfQorICAgIGdvb2RfbWFya2VyKDB4MTQpOworICAgIHN0YXR1cygibW9kZV90YWJsZV9zaXplID0gJWQiLCBtYXAtPm1vZGVfdGFibGVfc2l6ZSk7CisKKyAgICAvKgorICAgICAqIEZpZ3VyZSBvdXQgd2hhdCB0eXBlIG9mIGJpb3Mgd2UgaGF2ZQorICAgICAqICBvcmRlciBvZiBkZXRlY3Rpb24gaXMgaW1wb3J0YW50CisgICAgICovCisKKyAgICBpZiAoZGV0ZWN0X2Jpb3NfdHlwZShtYXAsIHNpemVvZih2Ymlvc19tb2RlbGluZV90eXBlMykpKSB7CisgICAgICAgIG1hcC0+YmlvcyA9IEJUXzM7CisgICAgfQorICAgIGVsc2UgaWYgKGRldGVjdF9iaW9zX3R5cGUobWFwLCBzaXplb2YodmJpb3NfbW9kZWxpbmVfdHlwZTIpKSkgeworICAgICAgICBtYXAtPmJpb3MgPSBCVF8yOworICAgIH0KKyAgICBlbHNlIGlmIChkZXRlY3RfYmlvc190eXBlKG1hcCwgc2l6ZW9mKHZiaW9zX3Jlc29sdXRpb25fdHlwZTEpKSkgeworICAgICAgICBtYXAtPmJpb3MgPSBCVF8xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGVidWcoIlVuYWJsZSB0byBkZXRlcm1pbmUgYmlvcyB0eXBlLlxyXG4iKTsKKyAgICAgICAgZGVidWcoIk1vZGUgVGFibGUgT2Zmc2V0OiAkQzAwMDAgKyAkJXhcclxuIiwgKCh1bnNpZ25lZCBpbnQpbWFwLT5tb2RlX3RhYmxlKSAtICgodW5zaWduZWQgaW50KW1hcC0+Ymlvc19wdHIpKTsKKyAgICAgICAgZGVidWcoIk1vZGUgVGFibGUgRW50cmllczogJXVcclxuIiwgbWFwLT5tb2RlX3RhYmxlX3NpemUpOworCWJhZF9tYXJrZXIoMHgxNSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGdvb2RfbWFya2VyKDB4MTUpOworCisgICAgcmV0dXJuIG1hcDsKK30KKworc3RhdGljIHZvaWQgdW5sb2NrX3ZiaW9zKHZiaW9zX21hcCAqIG1hcCkKK3sKKyAgICBhc3NlcnQoIW1hcC0+dW5sb2NrZWQpOworCisgICAgbWFwLT51bmxvY2tlZCA9IHRydWU7CisgICAgCisgICAgc3dpdGNoIChtYXAtPmNoaXBzZXQpIHsKKyAgICBjYXNlIENUX1VOS1dOOgorICAgIGNhc2UgQ0hJUFNFVF9UWVBFUzoJCS8qIFNodXQgdXAgZ2NjICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1RfODMwOgorICAgIGNhc2UgQ1RfODU1R006CisgICAgICAgIG1hcC0+YjEgPSBwY2lfcmVhZGIoMHg4MDAwMDA1YSk7CisgICAgICAgIHBjaV93cml0ZWIoMHgzMywgMHg4MDAwMDA1YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1RfODQ1RzoKKyAgICBjYXNlIENUXzg2NUc6CisgICAgY2FzZSBDVF85MTVHOgorICAgIGNhc2UgQ1RfOTE1R006CisgICAgY2FzZSBDVF85NDVHOgorICAgIGNhc2UgQ1RfOTQ1R006CisgICAgY2FzZSBDVF85NDVHTUU6CisgICAgY2FzZSBDVF85NDZHWjoKKyAgICBjYXNlIENUX0c5NjU6CisgICAgY2FzZSBDVF9ROTY1OgorCW1hcC0+YjEgPSBwY2lfcmVhZGIoMHg4MDAwMDA5MSk7CisJbWFwLT5iMiA9IHBjaV9yZWFkYigweDgwMDAwMDkyKTsKKwlwY2lfd3JpdGViKDB4MzMsIDB4ODAwMDAwOTEpOworCXBjaV93cml0ZWIoMHgzMywgMHg4MDAwMDA5Mik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIERFQlVHCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgdCA9IGlubCgweGNmYyk7CisgICAgICAgIGRlYnVnKCJ1bmxvY2sgUEFNOiAoMHglMDh4KVxyXG4iLCB0KTsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcmVsb2NrX3ZiaW9zKHZiaW9zX21hcCAqIG1hcCkKK3sKKyAgICBhc3NlcnQobWFwLT51bmxvY2tlZCk7CisgICAgbWFwLT51bmxvY2tlZCA9IGZhbHNlOworICAgIAorICAgIHN3aXRjaCAobWFwLT5jaGlwc2V0KSB7CisgICAgY2FzZSBDVF9VTktXTjoKKyAgICBjYXNlIENISVBTRVRfVFlQRVM6CQkvKiBTaHV0IHVwIGdjYyAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIENUXzgzMDoKKyAgICBjYXNlIENUXzg1NUdNOgorCXBjaV93cml0ZWIobWFwLT5iMSwgMHg4MDAwMDA1YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1RfODQ1RzoKKyAgICBjYXNlIENUXzg2NUc6CisgICAgY2FzZSBDVF85MTVHOgorICAgIGNhc2UgQ1RfOTE1R006CisgICAgY2FzZSBDVF85NDVHOgorICAgIGNhc2UgQ1RfOTQ1R006CisgICAgY2FzZSBDVF85NDVHTUU6CisgICAgY2FzZSBDVF85NDZHWjoKKyAgICBjYXNlIENUX0c5NjU6CisgICAgY2FzZSBDVF9ROTY1OgorCXBjaV93cml0ZWIobWFwLT5iMSwgMHg4MDAwMDA5MSk7CisJcGNpX3dyaXRlYihtYXAtPmIyLCAweDgwMDAwMDkyKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWYgREVCVUcKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCB0ID0gaW5sKDB4Y2ZjKTsKKyAgICAgICAgZGVidWcoInJlbG9jayBQQU06ICgweCUwOHgpXHJcbiIsIHQpOworICAgIH0KKyNlbmRpZgorfQorCisjaWYgMAorc3RhdGljIHZvaWQgbGlzdF9tb2Rlcyh2Ymlvc19tYXAgKm1hcCwgdW5zaWduZWQgaW50IHJhdykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgeCwgeTsKKworICAgIGZvciAoaT0wOyBpIDwgbWFwLT5tb2RlX3RhYmxlX3NpemU7IGkrKykgeworICAgICAgICBzd2l0Y2gobWFwLT5iaW9zKSB7CisgICAgICAgIGNhc2UgQlRfMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2Ymlvc19yZXNvbHV0aW9uX3R5cGUxICogcmVzID0gbWFwX3R5cGUxX3Jlc29sdXRpb24obWFwLCBtYXAtPm1vZGVfdGFibGVbaV0ucmVzb2x1dGlvbik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgeCA9ICgoKCh1bnNpZ25lZCBpbnQpIHJlcy0+eDIpICYgMHhmMCkgPDwgNCkgfCByZXMtPngxOworICAgICAgICAgICAgICAgIHkgPSAoKCgodW5zaWduZWQgaW50KSByZXMtPnkyKSAmIDB4ZjApIDw8IDQpIHwgcmVzLT55MTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoeCAhPSAwICYmIHkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiTW9kZSAlMDJ4IDogJWR4JWQsICVkIGJpdHMvcGl4ZWxcclxuIiwgbWFwLT5tb2RlX3RhYmxlW2ldLm1vZGUsIHgsIHksIG1hcC0+bW9kZV90YWJsZVtpXS5iaXRzX3Blcl9waXhlbCk7CisgICAgICAgICAgICAgICAgfQorCisJCWlmIChyYXcpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoIk1vZGUgJTAyeCAocmF3KSA6XHJcblx0JTAyeCAlMDJ4XHJcblx0JTAyeFxyXG5cdCUwMnhcclxuXHQlMDJ4XHJcblx0JTAyeFxyXG5cdCUwMnhcclxuXHQlMDJ4XHJcbiIsIG1hcC0+bW9kZV90YWJsZVtpXS5tb2RlLCByZXMtPnVua25vdzFbMF0scmVzLT51bmtub3cxWzFdLCByZXMtPngxLHJlcy0+eF90b3RhbCxyZXMtPngyLHJlcy0+eTEscmVzLT55X3RvdGFsLHJlcy0+eTIpOworCQl9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJUXzI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmJpb3NfcmVzb2x1dGlvbl90eXBlMiAqIHJlcyA9IG1hcF90eXBlMl9yZXNvbHV0aW9uKG1hcCwgbWFwLT5tb2RlX3RhYmxlW2ldLnJlc29sdXRpb24pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHggPSByZXMtPm1vZGVsaW5lc1swXS54MSsxOworICAgICAgICAgICAgICAgIHkgPSByZXMtPm1vZGVsaW5lc1swXS55MSsxOworCisgICAgICAgICAgICAgICAgaWYgKHggIT0gMCAmJiB5ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoIk1vZGUgJTAyeCA6ICVkeCVkLCAlZCBiaXRzL3BpeGVsXHJcbiIsIG1hcC0+bW9kZV90YWJsZVtpXS5tb2RlLCB4LCB5LCBtYXAtPm1vZGVfdGFibGVbaV0uYml0c19wZXJfcGl4ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJUXzM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmJpb3NfcmVzb2x1dGlvbl90eXBlMyAqIHJlcyA9IG1hcF90eXBlM19yZXNvbHV0aW9uKG1hcCwgbWFwLT5tb2RlX3RhYmxlW2ldLnJlc29sdXRpb24pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHggPSByZXMtPm1vZGVsaW5lc1swXS54MSsxOworICAgICAgICAgICAgICAgIHkgPSByZXMtPm1vZGVsaW5lc1swXS55MSsxOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICh4ICE9IDAgJiYgeSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKCJNb2RlICUwMnggOiAlZHglZCwgJWQgYml0cy9waXhlbFxyXG4iLCBtYXAtPm1vZGVfdGFibGVbaV0ubW9kZSwgeCwgeSwgbWFwLT5tb2RlX3RhYmxlW2ldLmJpdHNfcGVyX3BpeGVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVF9VTktXTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGd0Zl90aW1pbmdzKGludCB4LCBpbnQgeSwgaW50IGZyZXEsCXVpbnQzMl90ICpjbG9jaywKKyAgICAgICAgdWludDE2X3QgKmhzeW5jc3RhcnQsIHVpbnQxNl90ICpoc3luY2VuZCwgdWludDE2X3QgKmhibGFuaywKKyAgICAgICAgdWludDE2X3QgKnZzeW5jc3RhcnQsIHVpbnQxNl90ICp2c3luY2VuZCwgdWludDE2X3QgKnZibGFuaykKK3sKKyAgICBpbnQgaGJsLCB2YmwsIHZmcmVxOworCisgICAgdmJsID0geSArICh5KzEpLygyMDAwMC4wLygxMSpmcmVxKSAtIDEpICsgMS41OworICAgIHZmcmVxID0gdmJsICogZnJlcTsKKyAgICBoYmwgPSAxNiAqIChpbnQpKHggKiAoMzAuMCAtIDMwMDAwMC4wIC8gdmZyZXEpIC8KKyAgICAgICAgICAgICg3MC4wICsgMzAwMDAwLjAgLyB2ZnJlcSkgLyAxNi4wICsgMC41KTsKKworICAgICp2c3luY3N0YXJ0ID0geTsKKyAgICAqdnN5bmNlbmQgPSB5ICsgMzsKKyAgICAqdmJsYW5rID0gdmJsIC0gMTsKKyAgICAqaHN5bmNzdGFydCA9IHggKyBoYmwgLyAyIC0gKHggKyBoYmwgKyA1MCkgLyAxMDAgKiA4IC0gMTsKKyAgICAqaHN5bmNlbmQgPSB4ICsgaGJsIC8gMiAtIDE7CisgICAgKmhibGFuayA9IHggKyBoYmwgLSAxOworICAgICpjbG9jayA9ICh4ICsgaGJsKSAqIHZmcmVxIC8gMTAwMDsKK30KKworc3RhdGljIGludCBzZXRfbW9kZSh2Ymlvc19tYXAgKiBtYXAsIHVuc2lnbmVkIGludCBtb2RlLAorCQkgICAgIHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgeSwgdW5zaWduZWQgaW50IGJwLAorCQkgICAgIHVuc2lnbmVkIGludCBodG90YWwsIHVuc2lnbmVkIGludCB2dG90YWwpCit7CisgICAgaW50IHhwcmV2LCB5cHJldjsKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICBpbnQgcnYgPSAtMTsKKworICAgIGZvciAoaT0wOyBpIDwgbWFwLT5tb2RlX3RhYmxlX3NpemU7IGkrKykgeworICAgICAgICBpZiAobWFwLT5tb2RlX3RhYmxlW2ldLm1vZGUgPT0gbW9kZSkgeworICAgICAgICAgICAgc3dpdGNoKG1hcC0+YmlvcykgeworICAgICAgICAgICAgY2FzZSBCVF8xOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmJpb3NfcmVzb2x1dGlvbl90eXBlMSAqIHJlcyA9IG1hcF90eXBlMV9yZXNvbHV0aW9uKG1hcCwgbWFwLT5tb2RlX3RhYmxlW2ldLnJlc29sdXRpb24pOworCQkgICAgdWludDMyX3QgY2xvY2s7CisJCSAgICB1aW50MTZfdCBoc3luY3N0YXJ0LCBoc3luY2VuZCwgaGJsYW5rOworCQkgICAgdWludDE2X3QgdnN5bmNzdGFydCwgdnN5bmNlbmQsIHZibGFuazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChicCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFwLT5tb2RlX3RhYmxlW2ldLmJpdHNfcGVyX3BpeGVsID0gYnA7CisgICAgICAgICAgICAgICAgICAgIH0KKworCQkgICAgZ3RmX3RpbWluZ3MoeCwgeSwgZnJlcXNbMF0sICZjbG9jaywKKwkJCQkmaHN5bmNzdGFydCwgJmhzeW5jZW5kLCAmaGJsYW5rLAorCQkJCSZ2c3luY3N0YXJ0LCAmdnN5bmNlbmQsICZ2YmxhbmspOworCQkgICAgCisJCSAgICBzdGF0dXMoInggPSAlZCwgeSA9ICVkLCBjbG9jayA9ICVsdSwgaCA9ICVkICVkICVkLCB2ID0gJWQgJWQgJWRcbiIsCisJCQkgIHgsIHksIGNsb2NrLAorCQkJICBoc3luY3N0YXJ0LCBoc3luY2VuZCwgaGJsYW5rLAorCQkJICB2c3luY3N0YXJ0LCB2c3luY2VuZCwgdmJsYW5rKTsKKworCQkgICAgaHRvdGFsID0gaHRvdGFsID8gaHRvdGFsIDogKHVuc2lnbmVkIGludCloYmxhbmsrMTsKKwkJICAgIHZ0b3RhbCA9IHZ0b3RhbCA/IHZ0b3RhbCA6ICh1bnNpZ25lZCBpbnQpdmJsYW5rKzE7CisKKwkJICAgIHJlcy0+Y2xvY2sgPSBjbG9jay8xMDsgLyogVW5pdHMgYXBwZWFyIHRvIGJlIDEwIGtIeiAqLworICAgICAgICAgICAgICAgICAgICByZXMtPngyID0gKCgoaHRvdGFsLXgpID4+IDgpICYgMHgwZikgfCAoKHggPj4gNCkgJiAweGYwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzLT54MSA9ICh4ICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXMtPnkyID0gKCgodnRvdGFsLXkpID4+IDgpICYgMHgwZikgfCAoKHkgPj4gNCkgJiAweGYwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzLT55MSA9ICh5ICYgMHhmZik7CisJCSAgICBpZiAoaHRvdGFsKQorCQkJcmVzLT54X3RvdGFsID0gKChodG90YWwteCkgJiAweGZmKTsKKworCQkgICAgaWYgKHZ0b3RhbCkKKwkJCXJlcy0+eV90b3RhbCA9ICgodnRvdGFsLXkpICYgMHhmZik7CisKKwkJICAgIHJ2ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJUXzI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2Ymlvc19yZXNvbHV0aW9uX3R5cGUyICogcmVzID0gbWFwX3R5cGUyX3Jlc29sdXRpb24obWFwLCBtYXAtPm1vZGVfdGFibGVbaV0ucmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzLT54Y2hhcnMgPSB4IC8gODsKKyAgICAgICAgICAgICAgICAgICAgcmVzLT55Y2hhcnMgPSB5IC8gMTYgLSAxOworICAgICAgICAgICAgICAgICAgICB4cHJldiA9IHJlcy0+bW9kZWxpbmVzWzBdLngxOworICAgICAgICAgICAgICAgICAgICB5cHJldiA9IHJlcy0+bW9kZWxpbmVzWzBdLnkxOworCisgICAgICAgICAgICAgICAgICAgIGZvcihqPTA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZiaW9zX21vZGVsaW5lX3R5cGUyICogbW9kZWxpbmUgPSAmcmVzLT5tb2RlbGluZXNbal07CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbGluZS0+eDEgPT0geHByZXYgJiYgbW9kZWxpbmUtPnkxID09IHlwcmV2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxpbmUtPngxID0gbW9kZWxpbmUtPngyID0geC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsaW5lLT55MSA9IG1vZGVsaW5lLT55MiA9IHktMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0Zl90aW1pbmdzKHgsIHksIGZyZXFzW2pdLCAmbW9kZWxpbmUtPmNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsaW5lLT5oc3luY3N0YXJ0LCAmbW9kZWxpbmUtPmhzeW5jZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsaW5lLT5oYmxhbmssICZtb2RlbGluZS0+dnN5bmNzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlbGluZS0+dnN5bmNlbmQsICZtb2RlbGluZS0+dmJsYW5rKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChodG90YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsaW5lLT5odG90YWwgPSBodG90YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbGluZS0+aHRvdGFsID0gbW9kZWxpbmUtPmhibGFuazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2dG90YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsaW5lLT52dG90YWwgPSB2dG90YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbGluZS0+dnRvdGFsID0gbW9kZWxpbmUtPnZibGFuazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisJCSAgICBydiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCVF8zOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmJpb3NfcmVzb2x1dGlvbl90eXBlMyAqIHJlcyA9IG1hcF90eXBlM19yZXNvbHV0aW9uKG1hcCwgbWFwLT5tb2RlX3RhYmxlW2ldLnJlc29sdXRpb24pOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgeHByZXYgPSByZXMtPm1vZGVsaW5lc1swXS54MTsKKyAgICAgICAgICAgICAgICAgICAgeXByZXYgPSByZXMtPm1vZGVsaW5lc1swXS55MTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IDM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdmJpb3NfbW9kZWxpbmVfdHlwZTMgKiBtb2RlbGluZSA9ICZyZXMtPm1vZGVsaW5lc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsaW5lLT54MSA9PSB4cHJldiAmJiBtb2RlbGluZS0+eTEgPT0geXByZXYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbGluZS0+eDEgPSBtb2RlbGluZS0+eDIgPSB4LTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxpbmUtPnkxID0gbW9kZWxpbmUtPnkyID0geS0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0Zl90aW1pbmdzKHgsIHksIGZyZXFzW2pdLCAmbW9kZWxpbmUtPmNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsaW5lLT5oc3luY3N0YXJ0LCAmbW9kZWxpbmUtPmhzeW5jZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsaW5lLT5oYmxhbmssICZtb2RlbGluZS0+dnN5bmNzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlbGluZS0+dnN5bmNlbmQsICZtb2RlbGluZS0+dmJsYW5rKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHRvdGFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbGluZS0+aHRvdGFsID0gaHRvdGFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxpbmUtPmh0b3RhbCA9IG1vZGVsaW5lLT5oYmxhbms7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZ0b3RhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxpbmUtPnZ0b3RhbCA9IHZ0b3RhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsaW5lLT52dG90YWwgPSBtb2RlbGluZS0+dmJsYW5rOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxpbmUtPnRpbWluZ19oICAgPSB5LTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxpbmUtPnRpbWluZ192ICAgPSB4LTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworCQkgICAgcnYgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlRfVU5LV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcnY7Cit9ICAgCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNwbGF5X21hcF9pbmZvKHZiaW9zX21hcCAqIG1hcCkgeworI2lmZGVmIERFQlVHCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBiaW9zX3R5cGVfbmFtZXNbXSA9CisJeyJVTktOT1dOIiwgIlRZUEUgMSIsICJUWVBFIDIiLCAiVFlQRSAzIn07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjaGlwc2V0X3R5cGVfbmFtZXNbXSA9IHsKKwkiVU5LTk9XTiIsICI4MzAiLCAiODQ1RyIsICI4NTVHTSIsICI4NjVHIiwgIjkxNUciLCAiOTE1R00iLCAiOTQ1RyIsCisJIjk0NUdNIiwgIjk0NkdaIiwgIkc5NjUiLCAiUTk2NSIsICI5NDVHTUUiCisgICAgfTsKKworICAgIGRlYnVnKCJDaGlwc2V0OiAlc1xyXG4iLCBjaGlwc2V0X3R5cGVfbmFtZXNbbWFwLT5jaGlwc2V0XSk7CisgICAgZGVidWcoIkJJT1M6ICVzXHJcbiIsIGJpb3NfdHlwZV9uYW1lc1ttYXAtPmJpb3NdKTsKKworICAgIGRlYnVnKCJNb2RlIFRhYmxlIE9mZnNldDogJEMwMDAwICsgJCV4XHJcbiIsCisJICAoKHVuc2lnbmVkIGludCltYXAtPm1vZGVfdGFibGUpIC0gKCh1bnNpZ25lZCBpbnQpbWFwLT5iaW9zX3B0cikpOworICAgIGRlYnVnKCJNb2RlIFRhYmxlIEVudHJpZXM6ICV1XHJcbiIsIG1hcC0+bW9kZV90YWJsZV9zaXplKTsKKyNlbmRpZgorICAgICh2b2lkKW1hcDsKK30KKworaW50IF9fdmVzYWNvbl9pOTE1cmVzb2x1dGlvbihpbnQgeCwgaW50IHkpCit7CisgICAgdmJpb3NfbWFwICogbWFwOworICAgIHVuc2lnbmVkIGludCBtb2RlID0gMHg1MjsJLyogODAweDYwMHgzMiBtb2RlIGluIGtub3duIEJJT1NlcyAqLworICAgIHVuc2lnbmVkIGludCBicCA9IDMyOwkvKiAzMiBiaXRzIHBlciBwaXhlbCAqLworICAgIGludCBydiA9IDA7CisKKyAgICBnb29kX21hcmtlcigwKTsKKworICAgIG1hcCA9IG9wZW5fdmJpb3MoKTsKKyAgICBpZiAoIW1hcCkKKwlyZXR1cm4gLTE7CisKKyAgICBnb29kX21hcmtlcigxKTsKKworICAgIGRpc3BsYXlfbWFwX2luZm8obWFwKTsKKworICAgIGRlYnVnKCJcclxuIik7CisKKyAgICBpZiAobW9kZSAmJiB4ICYmIHkpIHsKKwlnb29kX21hcmtlcigyKTsKKwljbGkoKTsKKwlnb29kX21hcmtlcigzKTsKKwl1bmxvY2tfdmJpb3MobWFwKTsKKwlnb29kX21hcmtlcig0KTsKKyAgICAgICAgcnYgPSBzZXRfbW9kZShtYXAsIG1vZGUsIHgsIHksIGJwLCAwLCAwKTsKKwlpZiAocnYpCisJICAgIGJhZF9tYXJrZXIoNSk7CisJZWxzZQorCSAgICBnb29kX21hcmtlcig1KTsKKwlyZWxvY2tfdmJpb3MobWFwKTsKKwlnb29kX21hcmtlcig2KTsKKwlzdGkoKTsKKyAgICAgICAgCisgICAgICAgIGRlYnVnKCJQYXRjaCBtb2RlICUwMnggdG8gcmVzb2x1dGlvbiAlZHglZCBjb21wbGV0ZVxyXG4iLCBtb2RlLCB4LCB5KTsKKyAgICB9CisgICAgY2xvc2VfdmJpb3MobWFwKTsKKyAgICAKKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3Zlc2EvaW5pdHZlc2EuYyBiL2NvbTMyL2xpYi9zeXMvdmVzYS9pbml0dmVzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzIxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL3Zlc2EvaW5pdHZlc2EuYwpAQCAtMCwwICsxLDE5MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDE5OTktMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGluaXR2ZXNhLmMKKyAqCisgKiBRdWVyeSB0aGUgVkVTQSBCSU9TIGFuZCBzZWxlY3QgYSA2NDB4NDgweDMyIG1vZGUgd2l0aCBsb2NhbCBtYXBwaW5nCisgKiBzdXBwb3J0LCBpZiBvbmUgZXhpc3RzLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2ZwdS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3ZpZGVvLmg+CisjaW5jbHVkZSAidmVzYS5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAiZmlsbC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3N0cnVjdCB2ZXNhX2luZm8gX192ZXNhX2luZm87CisKK3N0cnVjdCB2ZXNhX2NoYXIgKl9fdmVzYWNvbl90ZXh0X2Rpc3BsYXk7CisKK2ludCBfX3Zlc2Fjb25fZm9udF9oZWlnaHQ7CitpbnQgX192ZXNhY29uX3RleHRfcm93czsKK2ludCBfX3Zlc2Fjb25fdGV4dF9jb2xzOworZW51bSB2ZXNhX3BpeGVsX2Zvcm1hdCBfX3Zlc2Fjb25fcGl4ZWxfZm9ybWF0ID0gUFhGX05PTkU7Cit1bnNpZ25lZCBpbnQgX192ZXNhY29uX2J5dGVzX3Blcl9waXhlbDsKK3VpbnQ4X3QgX192ZXNhY29uX2dyYXBoaWNzX2ZvbnRbRk9OVF9NQVhfQ0hBUlNdW0ZPTlRfTUFYX0hFSUdIVF07CisKK3VpbnQzMl90ICpfX3Zlc2Fjb25fYmFja2dyb3VuZCwgKl9fdmVzYWNvbl9zaGFkb3dmYjsKKworc3RhdGljIHZvaWQgdW5wYWNrX2ZvbnQodWludDhfdCAqIGRzdCwgdWludDhfdCAqIHNyYywgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGT05UX01BWF9DSEFSUzsgaSsrKSB7CisJbWVtY3B5KGRzdCwgc3JjLCBoZWlnaHQpOworCW1lbXNldChkc3QgKyBoZWlnaHQsIDAsIEZPTlRfTUFYX0hFSUdIVCAtIGhlaWdodCk7CisKKwlkc3QgKz0gRk9OVF9NQVhfSEVJR0hUOworCXNyYyArPSBoZWlnaHQ7CisgICAgfQorfQorCitzdGF0aWMgaW50IHZlc2Fjb25fc2V0X21vZGUoaW50ICp4LCBpbnQgKnkpCit7CisgICAgdWludDhfdCAqcm9tX2ZvbnQ7CisgICAgc3RydWN0IHZlc2FfbW9kZV9pbmZvICptaTsKKyAgICBlbnVtIHZlc2FfcGl4ZWxfZm9ybWF0IGJlc3RweGY7CisgICAgaW50IHJ2OworCisgICAgZGVidWcoIkhlbGxvLCBXb3JsZCFcclxuIik7CisKKyAgICAvKiBGcmVlIGFueSBleGlzdGluZyBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICBpZiAoX192ZXNhY29uX2JhY2tncm91bmQpIHsKKwlmcmVlKF9fdmVzYWNvbl9iYWNrZ3JvdW5kKTsKKwlfX3Zlc2Fjb25fYmFja2dyb3VuZCA9IE5VTEw7CisgICAgfQorICAgIGlmIChfX3Zlc2Fjb25fc2hhZG93ZmIpIHsKKwlmcmVlKF9fdmVzYWNvbl9zaGFkb3dmYik7CisJX192ZXNhY29uX3NoYWRvd2ZiID0gTlVMTDsKKyAgICB9CisKKyAgICBydiA9IGZpcm13YXJlLT52ZXNhLT5zZXRfbW9kZSgmX192ZXNhX2luZm8sIHgsIHksICZiZXN0cHhmKTsKKyAgICBpZiAocnYpCisJcmV0dXJuIHJ2OworCisgICAgbWkgPSAmX192ZXNhX2luZm8ubWk7CisgICAgX192ZXNhY29uX2J5dGVzX3Blcl9waXhlbCA9IChtaS0+YnBwICsgNykgPj4gMzsKKyAgICBfX3Zlc2Fjb25fZm9ybWF0X3BpeGVscyA9IF9fdmVzYWNvbl9mb3JtYXRfcGl4ZWxzX2xpc3RbYmVzdHB4Zl07CisKKyAgICAvKiBEb3dubG9hZCB0aGUgU1lTTElOVVgtIG9yIGZpcm13YXJlLXByb3ZpZGVkIGZvbnQgKi8KKyAgICBfX3Zlc2Fjb25fZm9udF9oZWlnaHQgPSBzeXNsaW51eF9mb250X3F1ZXJ5KCZyb21fZm9udCk7CisgICAgaWYgKCFfX3Zlc2Fjb25fZm9udF9oZWlnaHQpCisJX192ZXNhY29uX2ZvbnRfaGVpZ2h0ID0gZmlybXdhcmUtPnZlc2EtPmZvbnRfcXVlcnkoJnJvbV9mb250KTsKKworICAgIHVucGFja19mb250KCh1aW50OF90ICopIF9fdmVzYWNvbl9ncmFwaGljc19mb250LCByb21fZm9udCwKKwkJX192ZXNhY29uX2ZvbnRfaGVpZ2h0KTsKKworICAgIF9fdmVzYWNvbl9iYWNrZ3JvdW5kID0gY2FsbG9jKG1pLT5oX3JlcyptaS0+dl9yZXMsIDQpOworICAgIF9fdmVzYWNvbl9zaGFkb3dmYiA9IGNhbGxvYyhtaS0+aF9yZXMqbWktPnZfcmVzLCA0KTsKKworICAgIF9fdmVzYWNvbl9pbml0X2NvcHlfdG9fc2NyZWVuKCk7CisKKyAgICAvKiBUZWxsIHN5c2xpbnV4IHdlIGNoYW5nZWQgdmlkZW8gbW9kZSAqLworICAgIC8qIEluIHRoZW9yeSB0aGlzIHNob3VsZCBiZToKKworICAgICAgIGZsYWdzID0gKG1pLT5tb2RlX2F0dHIgJiA0KSA/IDB4MDAwNyA6IDB4MDAwZjsKKworICAgICAgIEhvd2V2ZXIsIHRoYXQgd291bGQgYXNzdW1lIGFsbCBzeXN0ZW1zIHRoYXQgY2xhaW0gdG8gaGFuZGxlIHRleHQKKyAgICAgICBvdXRwdXQgaW4gVkVTQSBtb2RlcyBhY3R1YWxseSBkbyB0aGF0Li4uICovCisgICAgc3lzbGludXhfcmVwb3J0X3ZpZGVvX21vZGUoMHgwMDBmLCBtaS0+aF9yZXMsIG1pLT52X3Jlcyk7CisKKyAgICBfX3Zlc2Fjb25fcGl4ZWxfZm9ybWF0ID0gYmVzdHB4ZjsKKworICAgIHJldHVybiAwOworfQorCisvKiBGSVhNRToKKyAqIERvZXMgaW5pdF90ZXh0X2Rpc3BsYXkgbmVlZCBhbiBFRkkgY291bnRlcnBhcnQ/CisgKiBlLmcuIHZlc2FfY2hhciBtYXkgbmVlZCB0byBzZXR1cCBVTklDT0RFIGNoYXIgZm9yIEVGSQorICogYW5kIHRoZSBudW1iZXIgb2Ygc2NyZWVuIGNoYXJzIG1heSBuZWVkIHRvIGJlIHNpemVkIHVwCisgKiBhY2NvcmRpbmdseS4gVGhpcyBtYXkgYWxzbyByZXF1aXJlIHR1cm5pbmcgYnl0ZSBzdHJpbmdzCisgKiBpbnRvIHVuaWNvZGUgc3RyaW5ncyBpbiB0aGUgZnJhbWVidWZmZXIKKyAqIFBvc3NpYmx5LCByZXZpc2l0IHZlc2Fjb25fZmlsbCgpIGZvciBFRkkuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF90ZXh0X2Rpc3BsYXkodm9pZCkKK3sKKyAgICBzaXplX3QgbmNoYXJzOworICAgIHN0cnVjdCB2ZXNhX2NoYXIgKnB0cjsKKyAgICBzdHJ1Y3QgdmVzYV9jaGFyIGRlZl9jaGFyID0geworCS5jaCA9ICcgJywKKwkuYXR0ciA9IDAsCisgICAgfTsKKworICAgIGlmIChfX3Zlc2Fjb25fdGV4dF9kaXNwbGF5KQorCWZyZWUoX192ZXNhY29uX3RleHRfZGlzcGxheSk7CisKKyAgICBfX3Zlc2Fjb25fdGV4dF9jb2xzID0gVEVYVF9QSVhFTF9DT0xTIC8gRk9OVF9XSURUSDsKKyAgICBfX3Zlc2Fjb25fdGV4dF9yb3dzID0gVEVYVF9QSVhFTF9ST1dTIC8gX192ZXNhY29uX2ZvbnRfaGVpZ2h0OworICAgIG5jaGFycyA9IChfX3Zlc2Fjb25fdGV4dF9jb2xzKzIpICogKF9fdmVzYWNvbl90ZXh0X3Jvd3MrMik7CisKKyAgICBfX3Zlc2Fjb25fdGV4dF9kaXNwbGF5ID0gcHRyID0gbWFsbG9jKG5jaGFycyAqIHNpemVvZihzdHJ1Y3QgdmVzYV9jaGFyKSk7CisKKyAgICBpZiAoIXB0cikKKwlyZXR1cm4gLTE7CisKKyAgICB2ZXNhY29uX2ZpbGwocHRyLCBkZWZfY2hhciwgbmNoYXJzKTsKKyAgICBfX3Zlc2Fjb25faW5pdF9jdXJzb3IoX192ZXNhY29uX2ZvbnRfaGVpZ2h0KTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogT24gaW5wdXQsIFZFU0EgaW5pdGlhbGl6YXRpb24gaXMgcGFzc2VkIGEgZGVzaXJhYmxlIHJlc29sdXRpb24uIE9uCisgKiByZXR1cm4sIGVpdGhlciB0aGUgcmVxdWVzdGVkIHJlc29sdXRpb24gaXMgc2V0IG9yIHRoZSBzeXN0ZW0KKyAqIHN1cHBvcnRlZCBkZWZhdWx0IHJlc29sdXRpb24gaXMgc2V0IGFuZCByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICovCitpbnQgX192ZXNhY29uX2luaXQoaW50ICp4LCBpbnQgKnkpCit7CisgICAgaW50IHJ2OworCisgICAgLyogV2UgbmVlZCB0aGUgRlBVIGZvciBncmFwaGljcywgYXQgbGVhc3QgbGlicG5nIGV0IGFsIHdpbGwgbmVlZCBpdC4uLiAqLworICAgIGlmICh4ODZfaW5pdF9mcHUoKSkKKwlyZXR1cm4gMTA7CisKKyAgICBydiA9IHZlc2Fjb25fc2V0X21vZGUoeCwgeSk7CisgICAgaWYgKHJ2KSB7CisJLyogVHJ5IHRvIHNlZSBpZiB3ZSBjYW4ganVzdCBwYXRjaCB0aGUgQklPUy4uLiAqLworCWlmIChfX3Zlc2Fjb25faTkxNXJlc29sdXRpb24oKngsICp5KSkKKwkgICAgcmV0dXJuIHJ2OworCWlmICh2ZXNhY29uX3NldF9tb2RlKHgsIHkpKQorCSAgICByZXR1cm4gcnY7CisgICAgfQorCisgICAgaW5pdF90ZXh0X2Rpc3BsYXkoKTsKKworICAgIGRlYnVnKCJNb2RlIHNldCwgbm93IGRyYXdpbmcgYXQgJSNwXHJcbiIsIF9fdmVzYV9pbmZvLm1pLmxmYl9wdHIpOworCisgICAgX192ZXNhY29uX2luaXRfYmFja2dyb3VuZCgpOworCisgICAgZGVidWcoIlJlYWR5IVxyXG4iKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvdmVzYS9zY3JlZW5jcHkuYyBiL2NvbTMyL2xpYi9zeXMvdmVzYS9zY3JlZW5jcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzgxMDliCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy92ZXNhL3NjcmVlbmNweS5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8aWxvZzIuaD4KKyNpbmNsdWRlICJ2ZXNhLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworCitzdGF0aWMgc3RydWN0IHdpbl9pbmZvIHdpOworCit2b2lkIF9fdmVzYWNvbl9pbml0X2NvcHlfdG9fc2NyZWVuKHZvaWQpCit7CisgICAgc3RydWN0IHZlc2FfbW9kZV9pbmZvICpjb25zdCBtaSA9ICZfX3Zlc2FfaW5mby5taTsKKyAgICBpbnQgd2lubjsKKworICAgIGlmIChtaS0+bW9kZV9hdHRyICYgMHgwMDgwKSB7CisJLyogTGluZWFyIGZyYW1lIGJ1ZmZlciAqLworCisJd2kud2luX2Jhc2UgPSAoY2hhciAqKW1pLT5sZmJfcHRyOworCXdpLndpbl9zaXplID0gMSA8PCAzMTsJLyogMiBHQiwgaS5lLiBvbmUgaHVnZSB3aW5kb3cgKi8KKwl3aS53aW5fcG9zID0gMDsJCS8qIEFscmVhZHkgcG9zaXRpb25lZCAob25seSBvbmUgcG9zaXRpb24uLi4pICovCisJd2kud2luX251bSA9IC0xOwkvKiBOb3QgYSB3aW5kb3cgKi8KKyAgICB9IGVsc2UgeworCS8qIFBhZ2VkIGZyYW1lIGJ1ZmZlciAqLworCisJLyogV2UgaGF2ZSBhbHJlYWR5IHRlc3RlZCB0aGF0ICpvbmUqIG9mIHRoZXNlIGlzIHVzYWJsZSAqLworCWlmICgobWktPndpbl9hdHRyWzBdICYgMHgwNSkgPT0gMHgwNSAmJiBtaS0+d2luX3NlZ1swXSkKKwkgICAgd2lubiA9IDA7CisJZWxzZQorCSAgICB3aW5uID0gMTsKKworCXdpLndpbl9udW0gPSB3aW5uOworCXdpLndpbl9iYXNlID0gKGNoYXIgKikobWktPndpbl9zZWdbd2lubl0gPDwgNCk7CisJd2kud2luX3NpemUgPSBtaS0+d2luX3NpemUgPDwgMTA7CisJd2kud2luX2dzaGlmdCA9IGlsb2cyKG1pLT53aW5fZ3JhaW4pICsgMTA7CisJd2kud2luX3BvcyA9IC0xOwkvKiBVbmRlZmluZWQgcG9zaXRpb24gKi8KKyAgICB9Cit9CisKK3ZvaWQgX192ZXNhY29uX2NvcHlfdG9fc2NyZWVuKHNpemVfdCBkc3QsIGNvbnN0IHVpbnQzMl90ICogc3JjLCBzaXplX3QgbnBpeGVscykKK3sKKyAgICBzaXplX3QgYnl0ZXMgPSBucGl4ZWxzICogX192ZXNhY29uX2J5dGVzX3Blcl9waXhlbDsKKyAgICBjaGFyIHJvd2J1ZltieXRlcyArIDRdIF9fYWxpZ25lZCg0KTsKKyAgICBjb25zdCB1aW50MzJfdCAqczsKKworICAgIHMgPSAoY29uc3QgdWludDMyX3QgKilfX3Zlc2Fjb25fZm9ybWF0X3BpeGVscyhyb3didWYsIHNyYywgbnBpeGVscyk7CisgICAgZmlybXdhcmUtPnZlc2EtPnNjcmVlbmNweShkc3QsIHMsIGJ5dGVzLCAmd2kpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy92ZXNhL3Zlc2EuaCBiL2NvbTMyL2xpYi9zeXMvdmVzYS92ZXNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzZDg3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvdmVzYS92ZXNhLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk5LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCX1NZU19WRVNBX0gKKyNkZWZpbmUgTElCX1NZU19WRVNBX0gKKworI2luY2x1ZGUgPHN5c2xpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorCisvKiBWRVNBIEdlbmVyYWwgSW5mb3JtYXRpb24gdGFibGUgKi8KK3N0cnVjdCB2ZXNhX2dlbmVyYWxfaW5mbyB7CisgICAgdWludDMyX3Qgc2lnbmF0dXJlOwkJLyogTWFnaWMgbnVtYmVyID0gIlZFU0EiICovCisgICAgdWludDE2X3QgdmVyc2lvbjsKKyAgICBmYXJfcHRyX3QgdmVuZG9yX3N0cmluZzsKKyAgICB1aW50OF90IGNhcGFiaWxpdGllc1s0XTsKKyAgICBmYXJfcHRyX3QgdmlkZW9fbW9kZV9wdHI7CisgICAgdWludDE2X3QgdG90YWxfbWVtb3J5OworCisgICAgdWludDE2X3Qgb2VtX3NvZnR3YXJlX3JldjsKKyAgICBmYXJfcHRyX3Qgb2VtX3ZlbmRvcl9uYW1lX3B0cjsKKyAgICBmYXJfcHRyX3Qgb2VtX3Byb2R1Y3RfbmFtZV9wdHI7CisgICAgZmFyX3B0cl90IG9lbV9wcm9kdWN0X3Jldl9wdHI7CisKKyAgICB1aW50OF90IHJlc2VydmVkWzIyMl07CisgICAgdWludDhfdCBvZW1fZGF0YVsyNTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVkVTQV9NQUdJQyAoJ1YnICsgKCdFJyA8PCA4KSArICgnUycgPDwgMTYpICsgKCdBJyA8PCAyNCkpCisjZGVmaW5lIFZCRTJfTUFHSUMgKCdWJyArICgnQicgPDwgOCkgKyAoJ0UnIDw8IDE2KSArICgnMicgPDwgMjQpKQorCitzdHJ1Y3QgdmVzYV9tb2RlX2luZm8geworICAgIHVpbnQxNl90IG1vZGVfYXR0cjsKKyAgICB1aW50OF90IHdpbl9hdHRyWzJdOworICAgIHVpbnQxNl90IHdpbl9ncmFpbjsKKyAgICB1aW50MTZfdCB3aW5fc2l6ZTsKKyAgICB1aW50MTZfdCB3aW5fc2VnWzJdOworICAgIGZhcl9wdHJfdCB3aW5fc2NoZW1lOworICAgIHVpbnQxNl90IGxvZ2ljYWxfc2NhbjsKKworICAgIHVpbnQxNl90IGhfcmVzOworICAgIHVpbnQxNl90IHZfcmVzOworICAgIHVpbnQ4X3QgY2hhcl93aWR0aDsKKyAgICB1aW50OF90IGNoYXJfaGVpZ2h0OworICAgIHVpbnQ4X3QgbWVtb3J5X3BsYW5lczsKKyAgICB1aW50OF90IGJwcDsKKyAgICB1aW50OF90IGJhbmtzOworICAgIHVpbnQ4X3QgbWVtb3J5X2xheW91dDsKKyAgICB1aW50OF90IGJhbmtfc2l6ZTsKKyAgICB1aW50OF90IGltYWdlX3BhZ2VzOworICAgIHVpbnQ4X3QgcGFnZV9mdW5jdGlvbjsKKworICAgIHVpbnQ4X3Qgcm1hc2s7CisgICAgdWludDhfdCBycG9zOworICAgIHVpbnQ4X3QgZ21hc2s7CisgICAgdWludDhfdCBncG9zOworICAgIHVpbnQ4X3QgYm1hc2s7CisgICAgdWludDhfdCBicG9zOworICAgIHVpbnQ4X3QgcmVzdl9tYXNrOworICAgIHVpbnQ4X3QgcmVzdl9wb3M7CisgICAgdWludDhfdCBkY21faW5mbzsKKworICAgIHVpbnQ4X3QgKmxmYl9wdHI7CQkvKiBMaW5lYXIgZnJhbWUgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICB1aW50OF90ICpvZmZzY3JlZW5fcHRyOwkvKiBPZmZzY3JlZW4gbWVtb3J5IGFkZHJlc3MgKi8KKyAgICB1aW50MTZfdCBvZmZzY3JlZW5fc2l6ZTsKKworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMjA2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdmVzYV9pbmZvIHsKKyAgICBzdHJ1Y3QgdmVzYV9nZW5lcmFsX2luZm8gZ2k7CisgICAgc3RydWN0IHZlc2FfbW9kZV9pbmZvIG1pOworfTsKKworZXh0ZXJuIHN0cnVjdCB2ZXNhX2luZm8gX192ZXNhX2luZm87CisKKyNpZiAwCitzdGF0aWMgaW5saW5lIHZvaWQgdmVzYV9kZWJ1Zyh1aW50MzJfdCBjb2xvciwgaW50IHBvcykKK3sKKyAgICB1aW50MzJfdCAqc3RwID0gKHVpbnQzMl90ICopIF9fdmVzYV9pbmZvLm1pLmxmYl9wdHI7CisgICAgc3RwW3BvcyAqIDNdID0gY29sb3I7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHZlc2FfZGVidWcodWludDMyX3QgY29sb3IsIGludCBwb3MpCit7CisgICAgKHZvaWQpY29sb3I7CisgICAgKHZvaWQpcG9zOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBMSUJfU1lTX1ZFU0FfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy92ZXNhL3ZpZGVvLmggYi9jb20zMi9saWIvc3lzL3Zlc2EvdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdlMzRmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy92ZXNhL3ZpZGVvLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA2LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCX1NZU19WRVNBX1ZJREVPX0gKKyNkZWZpbmUgTElCX1NZU19WRVNBX1ZJREVPX0gKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxjb2xvcnRibC5oPgorI2luY2x1ZGUgInZlc2EuaCIKKworI2RlZmluZSBGT05UX01BWF9DSEFSUwkyNTYKKyNkZWZpbmUgRk9OVF9NQVhfSEVJR0hUCSAzMgorI2RlZmluZSBGT05UX1dJRFRICSAgOAorCisjZGVmaW5lIERFRkFVTFRfVkVTQV9YX1NJWkUJNjQwCisjZGVmaW5lIERFRkFVTFRfVkVTQV9ZX1NJWkUJNDgwCisKKyNkZWZpbmUgVklERU9fQk9SREVSCTgKKyNkZWZpbmUgVEVYVF9QSVhFTF9ST1dTIChfX3Zlc2FfaW5mby5taS52X3JlcyAtIDIqVklERU9fQk9SREVSKQorI2RlZmluZSBURVhUX1BJWEVMX0NPTFMgKF9fdmVzYV9pbmZvLm1pLmhfcmVzIC0gMipWSURFT19CT1JERVIpCisKK3R5cGVkZWYgdWludDE2X3QgYXR0cl90OworCitzdHJ1Y3QgdmVzYV9jaGFyIHsKKyAgICB1aW50OF90IGNoOwkJCS8qIENoYXJhY3RlciAqLworICAgIHVpbnQ4X3QgX2ZpbGxlcjsJCS8qIEN1cnJlbnRseSB1bnVzZWQgKi8KKyAgICBhdHRyX3QgYXR0cjsJCS8qIENvbG9yIHRhYmxlIGluZGV4ICovCit9OworCitzdHJ1Y3Qgd2luX2luZm8geworICAgIGNoYXIgKndpbl9iYXNlOworICAgIHNpemVfdCB3aW5fcG9zOworICAgIHNpemVfdCB3aW5fc2l6ZTsKKyAgICBpbnQgd2luX2dzaGlmdDsKKyAgICBpbnQgd2luX251bTsKK307CisKKy8qIFBpeGVsIGZvcm1hdHMgaW4gb3JkZXIgb2YgZGVjcmVhc2luZyBwcmVmZXJlbmNlOyBQWEZfTk9ORSBzaG91bGQgYmUgbGFzdCAqLworLyogQkdSMjQgaXMgcHJlZmVycmVkIG92ZXIgQkdSQTMyIHNpbmNlIHRoZSBJL08gb3ZlcmhlYWQgaXMgc21hbGxlci4gKi8KK2VudW0gdmVzYV9waXhlbF9mb3JtYXQgeworICAgIFBYRl9CR1IyNCwJCQkvKiAyNC1iaXQgQkdSICovCisgICAgUFhGX0JHUkEzMiwJCQkvKiAzMi1iaXQgQkdSQSAqLworICAgIFBYRl9MRV9SR0IxNl81NjUsCQkvKiAxNi1iaXQgbGl0dGxlZW5kaWFuIDU6Njo1IFJHQiAqLworICAgIFBYRl9MRV9SR0IxNV81NTUsCQkvKiAxNS1iaXQgbGl0dGxlZW5kaWFuIDU6NTo1IFJHQiAqLworICAgIFBYRl9OT05FCit9OworZXh0ZXJuIGVudW0gdmVzYV9waXhlbF9mb3JtYXQgX192ZXNhY29uX3BpeGVsX2Zvcm1hdDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgX192ZXNhY29uX2J5dGVzX3Blcl9waXhlbDsKK3R5cGVkZWYgY29uc3Qgdm9pZCAqKCpfX3Zlc2Fjb25fZm9ybWF0X3BpeGVsc190KQorICAgICh2b2lkICosIGNvbnN0IHVpbnQzMl90ICosIHNpemVfdCk7CitleHRlcm4gX192ZXNhY29uX2Zvcm1hdF9waXhlbHNfdCBfX3Zlc2Fjb25fZm9ybWF0X3BpeGVsczsKK2V4dGVybiBjb25zdCBfX3Zlc2Fjb25fZm9ybWF0X3BpeGVsc190IF9fdmVzYWNvbl9mb3JtYXRfcGl4ZWxzX2xpc3RbUFhGX05PTkVdOworCitleHRlcm4gc3RydWN0IHZlc2FfY2hhciAqX192ZXNhY29uX3RleHRfZGlzcGxheTsKKworZXh0ZXJuIGludCBfX3Zlc2Fjb25fZm9udF9oZWlnaHQ7CitleHRlcm4gaW50IF9fdmVzYWNvbl90ZXh0X3Jvd3M7CitleHRlcm4gaW50IF9fdmVzYWNvbl90ZXh0X2NvbHM7CitleHRlcm4gdWludDhfdCBfX3Zlc2Fjb25fZ3JhcGhpY3NfZm9udFtGT05UX01BWF9DSEFSU11bRk9OVF9NQVhfSEVJR0hUXTsKK2V4dGVybiB1aW50MzJfdCAqX192ZXNhY29uX2JhY2tncm91bmQ7CitleHRlcm4gdWludDMyX3QgKl9fdmVzYWNvbl9zaGFkb3dmYjsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IF9fdmVzYWNvbl9zcmdiX3RvX2xpbmVhclsyNTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgX192ZXNhY29uX2xpbmVhcl90b19zcmdiWzQwODBdOworCitpbnQgX192ZXNhY29uX2luaXRfYmFja2dyb3VuZCh2b2lkKTsKK2ludCB2ZXNhY29uX2xvYWRfYmFja2dyb3VuZChjb25zdCBjaGFyICopOworaW50IF9fdmVzYWNvbl9pbml0KGludCAqLCBpbnQgKik7Cit2b2lkIF9fdmVzYWNvbl9pbml0X2N1cnNvcihpbnQpOwordm9pZCBfX3Zlc2Fjb25fZXJhc2UoaW50LCBpbnQsIGludCwgaW50LCBhdHRyX3QpOwordm9pZCBfX3Zlc2Fjb25fc2Nyb2xsX3VwKGludCwgYXR0cl90KTsKK3ZvaWQgX192ZXNhY29uX3dyaXRlX2NoYXIoaW50LCBpbnQsIHVpbnQ4X3QsIGF0dHJfdCk7Cit2b2lkIF9fdmVzYWNvbl9yZWRyYXdfdGV4dCh2b2lkKTsKK3ZvaWQgX192ZXNhY29uX2RvaXQodm9pZCk7Cit2b2lkIF9fdmVzYWNvbl9zZXRfY3Vyc29yKGludCwgaW50LCBib29sKTsKK3ZvaWQgX192ZXNhY29uX2NvcHlfdG9fc2NyZWVuKHNpemVfdCwgY29uc3QgdWludDMyX3QgKiwgc2l6ZV90KTsKK3ZvaWQgX192ZXNhY29uX2luaXRfY29weV90b19zY3JlZW4odm9pZCk7CisKK2ludCBfX3Zlc2Fjb25faTkxNXJlc29sdXRpb24oaW50IHgsIGludCB5KTsKKworI2VuZGlmIC8qIExJQl9TWVNfVkVTQV9WSURFT19IICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3Zlc2Fjb25fd3JpdGUuYyBiL2NvbTMyL2xpYi9zeXMvdmVzYWNvbl93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyM2E2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL3Zlc2Fjb25fd3JpdGUuYwpAQCAtMCwwICsxLDE5NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHZlc2Fjb25fd3JpdGUuYworICoKKyAqIFdyaXRlIHRvIHRoZSBzY3JlZW4gdXNpbmcgQU5TSSBjb250cm9sIGNvZGVzIChhYm91dCBhcyBjYXBhYmxlIGFzCisgKiBET1MnIEFOU0kuU1lTLikKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPGNvbG9ydGJsLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiYW5zaS5oIgorI2luY2x1ZGUgImZpbGUuaCIKKyNpbmNsdWRlICJ2ZXNhL3ZpZGVvLmgiCisKK3N0YXRpYyB2b2lkIHZlc2Fjb25fZXJhc2UoY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKiwgaW50LCBpbnQsIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIHZlc2Fjb25fd3JpdGVfY2hhcihpbnQsIGludCwgdWludDhfdCwgY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKik7CitzdGF0aWMgdm9pZCB2ZXNhY29uX3Nob3djdXJzb3IoY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKik7CitzdGF0aWMgdm9pZCB2ZXNhY29uX3NldGN1cnNvcihpbnQgeCwgaW50IHksIGJvb2wgdmlzaWJsZSk7CitzdGF0aWMgdm9pZCB2ZXNhY29uX3Njcm9sbF91cChjb25zdCBzdHJ1Y3QgdGVybV9zdGF0ZSAqKTsKKworc3RhdGljIHN0cnVjdCB0ZXJtX3N0YXRlIHRzOworc3RhdGljIHN0cnVjdCBhbnNpX29wcyBvcCA9IHsKKyAgICAuZXJhc2UgPSB2ZXNhY29uX2VyYXNlLAorICAgIC53cml0ZV9jaGFyID0gdmVzYWNvbl93cml0ZV9jaGFyLAorICAgIC5zaG93Y3Vyc29yID0gdmVzYWNvbl9zaG93Y3Vyc29yLAorICAgIC5zZXRfY3Vyc29yID0gdmVzYWNvbl9zZXRjdXJzb3IsCisgICAgLnNjcm9sbF91cCA9IHZlc2Fjb25fc2Nyb2xsX3VwLAorICAgIC5iZWVwID0gX19hbnNpY29uX2JlZXAsCit9OworCitzdGF0aWMgc3RydWN0IHRlcm1faW5mbyB0aSA9IHsKKyAgICAuZGlzYWJsZWQgPSAwLAorICAgIC50cyA9ICZ0cywKKyAgICAub3AgPSAmb3AKK307CisKKy8qIFJlZmVyZW5jZSBjb3VudGVyIHRvIHRoZSBzY3JlZW4sIHRvIGtlZXAgdHJhY2sgb2YgaWYgd2UgbmVlZAorICAgcmVpbml0aWFsaXphdGlvbi4gKi8KK3N0YXRpYyBpbnQgdmVzYWNvbl9jb3VudGVyID0gMDsKKworc3RhdGljIHN0cnVjdCB7CisgICAgaW50IHgsIHk7Cit9IHZlc2Fjb25fcmVzb2x1dGlvbiA9IHsKKyAgICAueCA9IERFRkFVTFRfVkVTQV9YX1NJWkUsCisgICAgLnkgPSBERUZBVUxUX1ZFU0FfWV9TSVpFLAorfTsKKworLyogU2V0IGRlc2lyZWQgcmVzb2x1dGlvbiAtIHJlcXVpcmVzIGEgZnVsbCBjbG9zZS9vcGVuIGN5Y2xlICovCit2b2lkIHZlc2Fjb25fc2V0X3Jlc29sdXRpb24oaW50IHgsIGludCB5KQoreworICAgIHZlc2Fjb25fcmVzb2x1dGlvbi54ID0geDsKKyAgICB2ZXNhY29uX3Jlc29sdXRpb24ueSA9IHk7Cit9CisKKy8qIENvbW1vbiBzZXR1cCAqLworaW50IF9fdmVzYWNvbl9vcGVuKHN0cnVjdCBmaWxlX2luZm8gKmZwKQoreworICAgICh2b2lkKWZwOworCisgICAgaWYgKCF2ZXNhY29uX2NvdW50ZXIpIHsKKwkvKiBBcmUgd2UgZGlzYWJsZWQ/ICovCisJaWYgKHN5c2xpbnV4X3NlcmlhbF9jb25zb2xlX2luZm8oKS0+Zmxvd2N0bCAmIDB4ODAwMCkgeworCSAgICB0aS5kaXNhYmxlZCA9IDE7CisJICAgIHRpLnJvd3MgPSAyNTsKKwkgICAgdGkuY29scyA9IDgwOworCX0gZWxzZSB7CisJICAgIC8qIFN3aXRjaCBtb2RlICovCisJICAgIC8qIERlYWwgd2l0aCBhIHJlc29sdXRpb24gZGlmZmVyZW50IGZyb20gZGVmYXVsdCBidWlsZCAqLworCSAgICBpZiAoX192ZXNhY29uX2luaXQoJnZlc2Fjb25fcmVzb2x1dGlvbi54LCAmdmVzYWNvbl9yZXNvbHV0aW9uLnkpKSB7CisJCXZlc2Fjb25fY291bnRlciA9IC0xOworCQlyZXR1cm4gRUFHQUlOOworCSAgICB9CisKKwkgICAgLyogSW5pdGlhbCBzdGF0ZSAqLworCSAgICBfX2Fuc2lfaW5pdCgmdGkpOworCSAgICB0aS5yb3dzID0gX192ZXNhY29uX3RleHRfcm93czsKKwkgICAgdGkuY29scyA9IF9fdmVzYWNvbl90ZXh0X2NvbHM7CisJfQorICAgIH0gZWxzZSBpZiAodmVzYWNvbl9jb3VudGVyID09IC0xKSB7CisJcmV0dXJuIEVBR0FJTjsKKyAgICB9CisKKyAgICBmcC0+by5yb3dzID0gdGkucm93czsKKyAgICBmcC0+by5jb2xzID0gdGkuY29sczsKKworICAgIHZlc2Fjb25fY291bnRlcisrOworICAgIHJldHVybiAwOworfQorCitpbnQgX192ZXNhY29uX2Nsb3NlKHN0cnVjdCBmaWxlX2luZm8gKmZwKQoreworICAgICh2b2lkKWZwOworCisgICAgdmVzYWNvbl9jb3VudGVyLS07CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEVyYXNlIGEgcmVnaW9uIG9mIHRoZSBzY3JlZW4gKi8KK3N0YXRpYyB2b2lkIHZlc2Fjb25fZXJhc2UoY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKnN0LAorCQkJICBpbnQgeDAsIGludCB5MCwgaW50IHgxLCBpbnQgeTEpCit7CisgICAgX192ZXNhY29uX2VyYXNlKHgwLCB5MCwgeDEsIHkxLCBzdC0+Y2luZGV4KTsKK30KKworLyogRHJhdyB0ZXh0IG9uIHRoZSBzY3JlZW4gKi8KK3N0YXRpYyB2b2lkIHZlc2Fjb25fd3JpdGVfY2hhcihpbnQgeCwgaW50IHksIHVpbnQ4X3QgY2gsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKnN0KQoreworICAgIF9fdmVzYWNvbl93cml0ZV9jaGFyKHgsIHksIGNoLCBzdC0+Y2luZGV4KTsKK30KKworLyogU2hvdyBvciBoaWRlIHRoZSBjdXJzb3IgKi8KK3N0YXRpYyBib29sIGN1cnNvcl9lbmFibGVkID0gdHJ1ZTsKK3ZvaWQgdmVzYWNvbl9jdXJzb3JfZW5hYmxlKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBjdXJzb3JfZW5hYmxlZCA9IGVuYWJsZWQ7Cit9CitzdGF0aWMgdm9pZCB2ZXNhY29uX3Nob3djdXJzb3IoY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKnN0KQoreworICAgIHZlc2Fjb25fc2V0Y3Vyc29yKHN0LT54eS54LCBzdC0+eHkueSwgc3QtPmN1cnNvcik7Cit9CitzdGF0aWMgdm9pZCB2ZXNhY29uX3NldGN1cnNvcihpbnQgeCwgaW50IHksIGJvb2wgdmlzaWJsZSkKK3sKKyAgICBfX3Zlc2Fjb25fc2V0X2N1cnNvcih4LCB5LCB2aXNpYmxlICYmIGN1cnNvcl9lbmFibGVkKTsKK30KKworc3RhdGljIHZvaWQgdmVzYWNvbl9zY3JvbGxfdXAoY29uc3Qgc3RydWN0IHRlcm1fc3RhdGUgKnN0KQoreworICAgIF9fdmVzYWNvbl9zY3JvbGxfdXAoMSwgc3QtPmNpbmRleCk7Cit9CisKK3NzaXplX3QgX192ZXNhY29uX3dyaXRlKHN0cnVjdCBmaWxlX2luZm8gKmZwLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZwID0gYnVmOworICAgIHNpemVfdCBuID0gMDsKKworICAgICh2b2lkKWZwOworCisgICAgaWYgKHRpLmRpc2FibGVkKQorCXJldHVybiBjb3VudDsJCS8qIE5vdGhpbmcgdG8gZG8gKi8KKworICAgIC8qIFRoaXMgb25seSB1cGRhdGVzIHRoZSBzaGFkb3cgdGV4dCBidWZmZXIuLi4gKi8KKyAgICB3aGlsZSAoY291bnQtLSkgeworCV9fYW5zaV9wdXRjaGFyKCZ0aSwgKmJ1ZnArKyk7CisJbisrOworICAgIH0KKworICAgIC8qIFRoaXMgYWN0dWFsbHkgZHJhd3MgaXQgKi8KKyAgICBfX3Zlc2Fjb25fZG9pdCgpOworCisgICAgcmV0dXJuIG47Cit9CisKK2NvbnN0IHN0cnVjdCBvdXRwdXRfZGV2IGRldl92ZXNhY29uX3cgPSB7CisgICAgLmRldl9tYWdpYyA9IF9fREVWX01BR0lDLAorICAgIC5mbGFncyA9IF9fREVWX1RUWSB8IF9fREVWX09VVFBVVCwKKyAgICAuZmlsZWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQVBQRU5ELAorICAgIC53cml0ZSA9IF9fdmVzYWNvbl93cml0ZSwKKyAgICAuY2xvc2UgPSBfX3Zlc2Fjb25fY2xvc2UsCisgICAgLm9wZW4gPSBfX3Zlc2Fjb25fb3BlbiwKKyAgICAuZmFsbGJhY2sgPSAmZGV2X2Fuc2ljb25fdywKK307CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3Zlc2FzZXJpYWxfd3JpdGUuYyBiL2NvbTMyL2xpYi9zeXMvdmVzYXNlcmlhbF93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NWNhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL3Zlc2FzZXJpYWxfd3JpdGUuYwpAQCAtMCwwICsxLDYxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogdmVzYXNlcmlhbF93cml0ZS5jCisgKgorICogV3JpdGUgdG8gYm90aCB0byB0aGUgVkVTQSBjb25zb2xlIGFuZCB0aGUgc2VyaWFsIHBvcnQKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlICJmaWxlLmgiCisKK2V4dGVybiBpbnQgX192ZXNhY29uX29wZW4oc3RydWN0IGZpbGVfaW5mbyAqKTsKK2V4dGVybiBpbnQgX192ZXNhY29uX2Nsb3NlKHN0cnVjdCBmaWxlX2luZm8gKik7CitleHRlcm4gc3NpemVfdCBfX3Zlc2Fjb25fd3JpdGUoc3RydWN0IGZpbGVfaW5mbyAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gc3NpemVfdCBfX3hzZXJpYWxfd3JpdGUoc3RydWN0IGZpbGVfaW5mbyAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CisKK3N0YXRpYyBzc2l6ZV90IF9fdmVzYXNlcmlhbF93cml0ZShzdHJ1Y3QgZmlsZV9pbmZvICpmcCwgY29uc3Qgdm9pZCAqYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50KQoreworICAgIF9fdmVzYWNvbl93cml0ZShmcCwgYnVmLCBjb3VudCk7CisgICAgcmV0dXJuIF9feHNlcmlhbF93cml0ZShmcCwgYnVmLCBjb3VudCk7Cit9CisKK2NvbnN0IHN0cnVjdCBvdXRwdXRfZGV2IGRldl92ZXNhc2VyaWFsX3cgPSB7CisgICAgLmRldl9tYWdpYyA9IF9fREVWX01BR0lDLAorICAgIC5mbGFncyA9IF9fREVWX1RUWSB8IF9fREVWX09VVFBVVCwKKyAgICAuZmlsZWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQVBQRU5ELAorICAgIC53cml0ZSA9IF9fdmVzYXNlcmlhbF93cml0ZSwKKyAgICAuY2xvc2UgPSBfX3Zlc2Fjb25fY2xvc2UsCisgICAgLm9wZW4gPSBfX3Zlc2Fjb25fb3BlbiwKKyAgICAuZmFsbGJhY2sgPSAmZGV2X2Fuc2lzZXJpYWxfdywKK307CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3dyaXRlLmMgYi9jb20zMi9saWIvc3lzL3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2MWZkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvd3JpdGUuYwpAQCAtMCwwICsxLDUxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogd3JpdGUuYworICoKKyAqIFdyaXRlIHRvIGEgZmlsZSBkZXNjcmlwdG9yCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgImZpbGUuaCIKKworc3NpemVfdCB3cml0ZShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgIHN0cnVjdCBmaWxlX2luZm8gKmZwID0gJl9fZmlsZV9pbmZvW2ZkXTsKKworICAgIGlmIChmZCA+PSBORklMRVMgfHwgIWZwLT5vb3ApIHsKKwllcnJubyA9IEVCQURGOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gZnAtPm9vcC0+d3JpdGUoZnAsIGJ1ZiwgY291bnQpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy94ODZfNjQveDg2X2luaXRfZnB1LmMgYi9jb20zMi9saWIvc3lzL3g4Nl82NC94ODZfaW5pdF9mcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQzOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5cy94ODZfNjQveDg2X2luaXRfZnB1LmMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIHg4Nl9oYXNfZnB1LmMKKyAqCisgKiBUZXN0IGZvciBhbiB4ODYgRlBVLCBhbmQgZG8gYW55IG5lY2Vzc2FyeSBzZXR1cC4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZnB1Lmg+CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZ2V0X2NyMCh2b2lkKQoreworICAgIHVpbnQ2NF90IHY7Cithc20oIm1vdnEgJSVjcjAsJTAiOiI9ciIodikpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NyMCh1aW50MzJfdCB2KQoreworICAgIGFzbSB2b2xhdGlsZSAoIm1vdnEgJTAsJSVjcjAiOjoiciIgKCh1aW50NjRfdCl2KSk7Cit9CisKKyNkZWZpbmUgQ1IwX1BFCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1IwX01QICAweDAwMDAwMDAyCisjZGVmaW5lIENSMF9FTSAgMHgwMDAwMDAwNAorI2RlZmluZSBDUjBfVFMgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ1IwX0VUICAweDAwMDAwMDEwCisjZGVmaW5lIENSMF9ORSAgMHgwMDAwMDAyMAorI2RlZmluZSBDUjBfV1AgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQ1IwX0FNICAweDAwMDQwMDAwCisjZGVmaW5lIENSMF9OVyAgMHgyMDAwMDAwMAorI2RlZmluZSBDUjBfQ0QgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQ1IwX1BHICAweDgwMDAwMDAwCisKK2ludCB4ODZfaW5pdF9mcHUodm9pZCkKK3sKKyAgICB1aW50MzJfdCBjcjA7CisgICAgdWludDE2X3QgZnN3ID0gMHhmZmZmOworICAgIHVpbnQxNl90IGZjdyA9IDB4ZmZmZjsKKworICAgIGNyMCA9IGdldF9jcjAoKTsKKyAgICBjcjAgJj0gfihDUjBfRU0gfCBDUjBfVFMpOworICAgIGNyMCB8PSBDUjBfTVA7CisgICAgc2V0X2NyMChjcjApOworCisgICAgYXNtIHZvbGF0aWxlICgiZm5pbml0Iik7CisgICAgYXNtIHZvbGF0aWxlICgiZm5zdHN3ICUwIjoiK20iIChmc3cpKTsKKyAgICBpZiAoZnN3ICE9IDApCisJcmV0dXJuIC0xOworCisgICAgYXNtIHZvbGF0aWxlICgiZm5zdGN3ICUwIjoiK20iIChmY3cpKTsKKyAgICBpZiAoKGZjdyAmIDB4MTAzZikgIT0gMHgzZikKKwlyZXR1cm4gLTE7CisKKyAgICAvKiBUZWNoaWNhbGx5LCB0aGlzIGNvdWxkIGJlIGEgMzg2IHdpdGggYSAyODcuICBXZSBjb3VsZCBhZGQgYSBjaGVjaworICAgICAgIGZvciB0aGF0IGhlcmUuLi4gKi8KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy94ODZfaW5pdF9mcHUuYyBiL2NvbTMyL2xpYi9zeXMveDg2X2luaXRfZnB1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjYjRlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMveDg2X2luaXRfZnB1LmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIHg4Nl9oYXNfZnB1LmMKKyAqCisgKiBUZXN0IGZvciBhbiB4ODYgRlBVLCBhbmQgZG8gYW55IG5lY2Vzc2FyeSBzZXR1cC4KKyAqLworCisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKyNpbmNsdWRlIDxpMzg2L3g4Nl9pbml0X2ZwdS5jPgorI2VsaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDgKKyNpbmNsdWRlIDx4ODZfNjQveDg2X2luaXRfZnB1LmM+CisjZWxzZQorI2Vycm9yICJVbmFibGUgdG8gYnVpbGQgZm9yIHRvLWJlLWRlZmluZWQgYXJjaGl0ZWN0dXJlIHR5cGUiCisjZW5kaWYKKyNpZiAwCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZnB1Lmg+CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZ2V0X2NyMCh2b2lkKQoreworI2lmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA0CisgICAgdWludDMyX3QgdjsKK2FzbSgibW92bCAlJWNyMCwlMCI6Ij1yIih2KSk7CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAorICAgIHVpbnQ2NF90IHY7Cithc20oIm1vdnEgJSVjcjAsJTAiOiI9ciIodikpOworI2Vsc2UKKyNlcnJvciAiVW5hYmxlIHRvIGJ1aWxkIGZvciB0by1iZS1kZWZpbmVkIGFyY2hpdGVjdHVyZSB0eXBlIgorI2VuZGlmCisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3IwKHVpbnQzMl90IHYpCit7CisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKyAgICBhc20gdm9sYXRpbGUgKCJtb3ZsICUwLCUlY3IwIjo6InIiICh2KSk7CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAorICAgIGFzbSB2b2xhdGlsZSAoIm1vdnEgJTAsJSVjcjAiOjoiciIgKCh1aW50NjRfdCl2KSk7CisjZWxzZQorI2Vycm9yICJVbmFibGUgdG8gYnVpbGQgZm9yIHRvLWJlLWRlZmluZWQgYXJjaGl0ZWN0dXJlIHR5cGUiCisjZW5kaWYKK30KKworI2RlZmluZSBDUjBfUEUJMHgwMDAwMDAwMQorI2RlZmluZSBDUjBfTVAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ1IwX0VNICAweDAwMDAwMDA0CisjZGVmaW5lIENSMF9UUyAgMHgwMDAwMDAwOAorI2RlZmluZSBDUjBfRVQgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQ1IwX05FICAweDAwMDAwMDIwCisjZGVmaW5lIENSMF9XUCAgMHgwMDAxMDAwMAorI2RlZmluZSBDUjBfQU0gIDB4MDAwNDAwMDAKKyNkZWZpbmUgQ1IwX05XICAweDIwMDAwMDAwCisjZGVmaW5lIENSMF9DRCAgMHg0MDAwMDAwMAorI2RlZmluZSBDUjBfUEcgIDB4ODAwMDAwMDAKKworaW50IHg4Nl9pbml0X2ZwdSh2b2lkKQoreworICAgIHVpbnQzMl90IGNyMDsKKyAgICB1aW50MTZfdCBmc3cgPSAweGZmZmY7CisgICAgdWludDE2X3QgZmN3ID0gMHhmZmZmOworCisgICAgY3IwID0gZ2V0X2NyMCgpOworICAgIGNyMCAmPSB+KENSMF9FTSB8IENSMF9UUyk7CisgICAgY3IwIHw9IENSMF9NUDsKKyAgICBzZXRfY3IwKGNyMCk7CisKKyAgICBhc20gdm9sYXRpbGUgKCJmbmluaXQiKTsKKyAgICBhc20gdm9sYXRpbGUgKCJmbnN0c3cgJTAiOiIrbSIgKGZzdykpOworICAgIGlmIChmc3cgIT0gMCkKKwlyZXR1cm4gLTE7CisKKyAgICBhc20gdm9sYXRpbGUgKCJmbnN0Y3cgJTAiOiIrbSIgKGZjdykpOworICAgIGlmICgoZmN3ICYgMHgxMDNmKSAhPSAweDNmKQorCXJldHVybiAtMTsKKworICAgIC8qIFRlY2hpY2FsbHksIHRoaXMgY291bGQgYmUgYSAzODYgd2l0aCBhIDI4Ny4gIFdlIGNvdWxkIGFkZCBhIGNoZWNrCisgICAgICAgZm9yIHRoYXQgaGVyZS4uLiAqLworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMveHNlcmlhbF93cml0ZS5jIGIvY29tMzIvbGliL3N5cy94c2VyaWFsX3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0ZmI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMveHNlcmlhbF93cml0ZS5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogeHNlcmlhbF93cml0ZS5jCisgKgorICogUmF3IHdyaXRpbmcgdG8gdGhlIHNlcmlhbCBwb3J0OyBcbiAtPiBcclxuIHRyYW5zbGF0aW9uLCBhbmQKKyAqIGNvbnZlcnQgXDEjIHNlcXVlbmNlcy4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlIDxjb2xvcnRibC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImZpbGUuaCIKKworc3RhdGljIHZvaWQgZW1pdChjaGFyIGNoKQoreworICAgIHdyaXRlX3NlcmlhbChjaCk7Cit9CisKK3NzaXplX3QgX194c2VyaWFsX3dyaXRlKHN0cnVjdCBmaWxlX2luZm8gKmZwLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpidWZwID0gYnVmOworICAgIHNpemVfdCBuID0gMDsKKyAgICBzdGF0aWMgZW51bSB7IHN0X2luaXQsIHN0X3RibCwgc3RfdGJsYyB9IHN0YXRlID0gc3RfaW5pdDsKKyAgICBzdGF0aWMgaW50IG5kaWdpdHM7CisgICAgc3RhdGljIGludCBuY29sb3IgPSAwOworICAgIGludCBudW07CisgICAgY29uc3QgY2hhciAqcDsKKworICAgICh2b2lkKWZwOworCisgICAgaWYgKCFzeXNsaW51eF9zZXJpYWxfY29uc29sZV9pbmZvKCktPmlvYmFzZSkKKwlyZXR1cm4gY291bnQ7CQkvKiBOb3RoaW5nIHRvIGRvICovCisKKyAgICB3aGlsZSAoY291bnQtLSkgeworCXVuc2lnbmVkIGNoYXIgY2ggPSAqYnVmcCsrOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2Ugc3RfaW5pdDoKKwkgICAgaWYgKGNoID49IDEgJiYgY2ggPD0gNSkgeworCQlzdGF0ZSA9IHN0X3RibDsKKwkJbmRpZ2l0cyA9IGNoOworCSAgICB9IGVsc2UgaWYgKGNoID09ICdcbicpIHsKKwkJZW1pdCgnXHInKTsKKwkJZW1pdCgnXG4nKTsKKwkgICAgfSBlbHNlIHsKKwkJZW1pdChjaCk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIHN0X3RibDoKKwkgICAgaWYgKGNoID09ICcjJykgeworCQlzdGF0ZSA9IHN0X3RibGM7CisJCW5jb2xvciA9IDA7CisJICAgIH0gZWxzZSB7CisJCXN0YXRlID0gc3RfaW5pdDsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2Ugc3RfdGJsYzoKKwkgICAgbnVtID0gY2ggLSAnMCc7CisJICAgIGlmIChudW0gPCAxMCkgeworCQluY29sb3IgPSAobmNvbG9yICogMTApICsgbnVtOworCQlpZiAoLS1uZGlnaXRzID09IDApIHsKKwkJICAgIGlmIChuY29sb3IgPCBjb25zb2xlX2NvbG9yX3RhYmxlX3NpemUpIHsKKwkJCWVtaXQoJ1wwMzMnKTsKKwkJCWVtaXQoJ1snKTsKKwkJCWVtaXQoJzAnKTsKKwkJCWVtaXQoJzsnKTsKKwkJCWZvciAocCA9IGNvbnNvbGVfY29sb3JfdGFibGVbbmNvbG9yXS5hbnNpOyAqcDsgcCsrKQorCQkJICAgIGVtaXQoKnApOworCQkJZW1pdCgnbScpOworCQkgICAgfQorCQkgICAgc3RhdGUgPSBzdF9pbml0OworCQl9CisJICAgIH0gZWxzZSB7CisJCXN0YXRlID0gc3RfaW5pdDsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisJbisrOworICAgIH0KKworICAgIHJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5cy96ZXJvcmVncy5jIGIvY29tMzIvbGliL3N5cy96ZXJvcmVncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTI0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL3plcm9yZWdzLmMKQEAgLTAsMCArMSw1IEBACisjaW5jbHVkZSA8Y29tMzIuaD4KKworLyogV2hlbiB3ZSBkb24ndCBuZWVkIHRvIHBhc3MgYW55IHJlZ2lzdGVycywgaXQncyBjb252ZW5pZW50IHRvIGp1c3QKKyAgIGJlIGFibGUgdG8gcGFzcyBhIHByZXBhcmVkIGFsbC16ZXJvIHN0cnVjdHVyZS4gKi8KK2NvbnN0IGNvbTMyc3lzX3QgX19jb20zMl96ZXJvX3JlZ3M7CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzL3pmaWxlLmMgYi9jb20zMi9saWIvc3lzL3pmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2YmE5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXMvemZpbGUuYwpAQCAtMCwwICsxLDE3MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC96aW8uaD4KKworI2luY2x1ZGUgImZpbGUuaCIKKyNpbmNsdWRlICJ6bGliLmgiCisKKy8qCisgKiB6b3Blbi5jCisgKgorICogT3BlbiBhbiBvcmRpbmFyeSBmaWxlLCBwb3NzaWJseSBjb21wcmVzc2VkOyBpZiBzbywgaW5zZXJ0CisgKiBhbiBhcHByb3ByaWF0ZSBkZWNvbXByZXNzb3IuCisgKi8KKworaW50IF9fZmlsZV9nZXRfYmxvY2soc3RydWN0IGZpbGVfaW5mbyAqZnApOworaW50IF9fZmlsZV9jbG9zZShzdHJ1Y3QgZmlsZV9pbmZvICpmcCk7CisKK3N0YXRpYyBzc2l6ZV90IGd6aXBfZmlsZV9yZWFkKHN0cnVjdCBmaWxlX2luZm8gKiwgdm9pZCAqLCBzaXplX3QpOworc3RhdGljIGludCBnemlwX2ZpbGVfY2xvc2Uoc3RydWN0IGZpbGVfaW5mbyAqKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnB1dF9kZXYgZ3ppcF9maWxlX2RldiA9IHsKKyAgICAuZGV2X21hZ2ljID0gX19ERVZfTUFHSUMsCisgICAgLmZsYWdzID0gX19ERVZfRklMRSB8IF9fREVWX0lOUFVULAorICAgIC5maWxlZmxhZ3MgPSBPX1JET05MWSwKKyAgICAucmVhZCA9IGd6aXBfZmlsZV9yZWFkLAorICAgIC5jbG9zZSA9IGd6aXBfZmlsZV9jbG9zZSwKKyAgICAub3BlbiA9IE5VTEwsCit9OworCitzdGF0aWMgaW50IGd6aXBfZmlsZV9pbml0KHN0cnVjdCBmaWxlX2luZm8gKmZwKQoreworICAgIHpfc3RyZWFtcCB6cyA9IGNhbGxvYygxLCBzaXplb2Yoel9zdHJlYW0pKTsKKworICAgIGlmICghenMpCisJcmV0dXJuIC0xOworCisgICAgZnAtPmkucHZ0ID0genM7CisKKyAgICB6cy0+bmV4dF9pbiA9ICh2b2lkICopZnAtPmkuZGF0YXA7CisgICAgenMtPmF2YWlsX2luID0gZnAtPmkubmJ5dGVzOworCisgICAgaWYgKGluZmxhdGVJbml0Mih6cywgMTUgKyAzMikgIT0gWl9PSykgeworCWVycm5vID0gRUlPOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBmcC0+aW9wID0gJmd6aXBfZmlsZV9kZXY7CisgICAgZnAtPmkuZmQuc2l6ZSA9IC0xOwkJLyogVW5rbm93biAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGd6aXBfZmlsZV9yZWFkKHN0cnVjdCBmaWxlX2luZm8gKmZwLCB2b2lkICpwdHIsIHNpemVfdCBuKQoreworICAgIHpfc3RyZWFtcCB6cyA9IGZwLT5pLnB2dDsKKyAgICBpbnQgcnY7CisgICAgc3NpemVfdCBieXRlczsKKyAgICBzc2l6ZV90IG5vdXQgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBwdHI7CisKKyAgICB3aGlsZSAobikgeworCXpzLT5uZXh0X291dCA9IHA7CisJenMtPmF2YWlsX291dCA9IG47CisKKwlpZiAoIXpzLT5hdmFpbF9pbiAmJiBmcC0+aS5mZC5oYW5kbGUpIHsKKwkgICAgaWYgKF9fZmlsZV9nZXRfYmxvY2soZnApKQorCQlyZXR1cm4gbm91dCA/IG5vdXQgOiAtMTsKKworCSAgICB6cy0+bmV4dF9pbiA9ICh2b2lkICopZnAtPmkuZGF0YXA7CisJICAgIHpzLT5hdmFpbF9pbiA9IGZwLT5pLm5ieXRlczsKKwl9CisKKwlydiA9IGluZmxhdGUoenMsIFpfU1lOQ19GTFVTSCk7CisKKwlieXRlcyA9IG4gLSB6cy0+YXZhaWxfb3V0OworCW5vdXQgKz0gYnl0ZXM7CisJcCArPSBieXRlczsKKwluIC09IGJ5dGVzOworCisJc3dpdGNoIChydikgeworCWNhc2UgWl9EQVRBX0VSUk9SOgorCWNhc2UgWl9ORUVEX0RJQ1Q6CisJY2FzZSBaX0JVRl9FUlJPUjoKKwljYXNlIFpfU1RSRUFNX0VSUk9SOgorCWRlZmF1bHQ6CisJICAgIGVycm5vID0gRUlPOworCSAgICByZXR1cm4gbm91dCA/IG5vdXQgOiAtMTsKKwljYXNlIFpfTUVNX0VSUk9SOgorCSAgICBlcnJubyA9IEVOT01FTTsKKwkgICAgcmV0dXJuIG5vdXQgPyBub3V0IDogLTE7CisJY2FzZSBaX1NUUkVBTV9FTkQ6CisJICAgIHJldHVybiBub3V0OworCWNhc2UgWl9PSzoKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybiBub3V0OworfQorCitzdGF0aWMgaW50IGd6aXBfZmlsZV9jbG9zZShzdHJ1Y3QgZmlsZV9pbmZvICpmcCkKK3sKKyAgICB6X3N0cmVhbXAgenMgPSBmcC0+aS5wdnQ7CisKKyAgICBpbmZsYXRlRW5kKHpzKTsKKyAgICBmcmVlKHpzKTsKKyAgICByZXR1cm4gX19maWxlX2Nsb3NlKGZwKTsKK30KKworaW50IHpvcGVuKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIC4uLikKK3sKKyAgICBpbnQgZmQsIHJ2OworICAgIHN0cnVjdCBmaWxlX2luZm8gKmZwOworCisgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgZ2l2ZSBhIGhvb3QgYWJvdXQgdGhlIGNyZWF0aW9uIGJpdHMuLi4gKi8KKyAgICBmZCA9IG9wZW4ocGF0aG5hbWUsIGZsYWdzLCAwKTsKKworICAgIGlmIChmZCA8IDApCisJcmV0dXJuIC0xOworCisgICAgZnAgPSAmX19maWxlX2luZm9bZmRdOworCisgICAgLyogTmVlZCB0byBnZXQgdGhlIGZpcnN0IGJsb2NrIGludG8gdGhlIGJ1ZmZlciwgYnV0IG5vdCBjb25zdW1lZCAqLworICAgIGlmIChfX2ZpbGVfZ2V0X2Jsb2NrKGZwKSkKKwlnb3RvIGVycjsKKworICAgIGlmIChmcC0+aS5uYnl0ZXMgPj0gMTQgJiYKKwkodWludDhfdCkgZnAtPmkuYnVmWzBdID09IDAzNyAmJgorCSh1aW50OF90KSBmcC0+aS5idWZbMV0gPT0gMDIxMyAmJgkvKiBnemlwICovCisJZnAtPmkuYnVmWzJdID09IDgpCS8qIGRlZmxhdGUgKi8KKwlydiA9IGd6aXBfZmlsZV9pbml0KGZwKTsKKyAgICBlbHNlCisJcnYgPSAwOwkJCS8qIFBsYWluIGZpbGUgKi8KKworICAgIGlmICghcnYpCisJcmV0dXJuIGZkOworCitlcnI6CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXMvemZvcGVuLmMgYi9jb20zMi9saWIvc3lzL3pmb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmFhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzL3pmb3Blbi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiB6Zm9wZW4uYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzbGludXgvemlvLmg+CisKK0ZJTEUgKnpmb3Blbihjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RlKQoreworICAgIGludCBmbGFncyA9IE9fUkRPTkxZOworICAgIGludCBwbHVzID0gMDsKKyAgICBpbnQgZmQ7CisKKyAgICB3aGlsZSAoKm1vZGUpIHsKKwlzd2l0Y2ggKCptb2RlKSB7CisJY2FzZSAncic6CisJICAgIGZsYWdzID0gT19SRE9OTFk7CisJICAgIGJyZWFrOworCWNhc2UgJ3cnOgorCSAgICBmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkM7CisJICAgIGJyZWFrOworCWNhc2UgJ2EnOgorCSAgICBmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQVBQRU5EOworCSAgICBicmVhazsKKwljYXNlICcrJzoKKwkgICAgcGx1cyA9IDE7CisJICAgIGJyZWFrOworCX0KKwltb2RlKys7CisgICAgfQorCisgICAgaWYgKHBsdXMpIHsKKwlmbGFncyA9IChmbGFncyAmIH4oT19SRE9OTFkgfCBPX1dST05MWSkpIHwgT19SRFdSOworICAgIH0KKworICAgIGZkID0gem9wZW4oZmlsZSwgZmxhZ3MsIDA2NjYpOworCisgICAgaWYgKGZkIDwgMCkKKwlyZXR1cm4gTlVMTDsKKyAgICBlbHNlCisJcmV0dXJuIGZkb3BlbihmZCwgbW9kZSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvYWRkbGlzdC5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2FkZGxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjVjZjRhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L2FkZGxpc3QuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbW92ZWJpdHMuaD4KKworaW50IHN5c2xpbnV4X2FkZF9tb3ZlbGlzdChzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKipsaXN0LAorCQkJICBhZGRyX3QgZHN0LCBhZGRyX3Qgc3JjLCBhZGRyX3QgbGVuKQoreworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqbWwgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCkpOworICAgIGlmICghbWwpCisJcmV0dXJuIC0xOworCisgICAgbWwtPmRzdCA9IGRzdDsKKyAgICBtbC0+c3JjID0gc3JjOworICAgIG1sLT5sZW4gPSBsZW47CisgICAgbWwtPm5leHQgPSAqbGlzdDsKKworICAgICpsaXN0ID0gbWw7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvYmlvc2Jvb3QuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9iaW9zYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNTk5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvYmlvc2Jvb3QuYwpAQCAtMCwwICsxLDQzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L21vdmViaXRzLmg+CisKKyNpZmRlZiBfX0ZJUk1XQVJFX0JJT1NfXworCit2b2lkIGJpb3NfZG9fc2h1ZmZsZV9hbmRfYm9vdCh1aW50MTZfdCBib290ZmxhZ3MsIHVpbnQzMl90IGRlc2NhZGRyLAorCQkJICAgICAgY29uc3Qgdm9pZCAqZGVzY2J1ZiwgdWludDMyX3QgZHNpemUpCit7CisgICAgZXh0ZXJuIHZvaWQgZG9fcmF3X3NodWZmbGVfYW5kX2Jvb3QoYWRkcl90LCBjb25zdCB2b2lkICosIGFkZHJfdCk7CisKKyAgICBzeXNsaW51eF9maW5hbF9jbGVhbnVwKGJvb3RmbGFncyk7CisgICAgZG9fcmF3X3NodWZmbGVfYW5kX2Jvb3QoZGVzY2FkZHIsIGRlc2NidWYsIGRzaXplKTsKKyAgICAvKiBTaG91bGQgbm90IHJldHVybiAqLworfQorCisjZW5kaWYgLyogX19GSVJNV0FSRV9CSU9TX18gKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9jbGVhbnVwLmMgYi9jb20zMi9saWIvc3lzbGludXgvY2xlYW51cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODU4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvY2xlYW51cC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzeXNsaW51eC9ib290Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8c3lzbGludXgvcHhlX2FwaS5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKwordm9pZCBzeXNsaW51eF9maW5hbF9jbGVhbnVwKHVpbnQxNl90IGZsYWdzKQoreworICAgIGlmIChzeXNsaW51eF9maWxlc3lzdGVtKCkgPT0gU1lTTElOVVhfRlNfUFhFTElOVVgpCisJdW5sb2FkX3B4ZShmbGFncyk7CisKKyAgICBjbGVhbnVwX2hhcmR3YXJlKCk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvZGVidWcuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YWI4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvZGVidWcuYwpAQCAtMCwwICsxLDk1IEBACisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2lmZGVmIERZTkFNSUNfREVCVUcKKworc3RhdGljIExJU1RfSEVBRChkZWJ1Z19mdW5jcyk7CisKK3N0cnVjdCBkZWJ1Z19mdW5jX2VudHJ5IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfZnVuY19lbnRyeSAqbG9va3VwX2VudHJ5KGNvbnN0IGNoYXIgKmZ1bmMpCit7CisgICAgc3RydWN0IGRlYnVnX2Z1bmNfZW50cnkgKmUsICplbnRyeSA9IE5VTEw7CisKKyAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZkZWJ1Z19mdW5jcywgbGlzdCkgeworCWlmICghc3RyY21wKGUtPm5hbWUsIGZ1bmMpKSB7CisJICAgIGVudHJ5ID0gZTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybiBlbnRyeTsKK30KKworYm9vbCBfX3N5c2xpbnV4X2RlYnVnX2VuYWJsZWQoY29uc3QgY2hhciAqZnVuYykKK3sKKyAgICBzdHJ1Y3QgZGVidWdfZnVuY19lbnRyeSAqZW50cnk7CisKKyAgICBlbnRyeSA9IGxvb2t1cF9lbnRyeShmdW5jKTsKKyAgICBpZiAoZW50cnkpCisJcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgX19lbmFibGUoY29uc3QgY2hhciAqZnVuYykKK3sKKyAgICBzdHJ1Y3QgZGVidWdfZnVuY19lbnRyeSAqZW50cnk7CisKKyAgICBlbnRyeSA9IGxvb2t1cF9lbnRyeShmdW5jKTsKKyAgICBpZiAoZW50cnkpCisJcmV0dXJuIDA7CS8qIGFscmVhZHkgZW5hYmxlZCAqLworCisgICAgZW50cnkgPSBtYWxsb2Moc2l6ZW9mKCplbnRyeSkpOworICAgIGlmICghZW50cnkpCisJcmV0dXJuIC0xOworCisgICAgZW50cnktPm5hbWUgPSBmdW5jOworICAgIGxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJmRlYnVnX2Z1bmNzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2Rpc2FibGUoY29uc3QgY2hhciAqZnVuYykKK3sKKyAgICBzdHJ1Y3QgZGVidWdfZnVuY19lbnRyeSAqZW50cnk7CisKKyAgICBlbnRyeSA9IGxvb2t1cF9lbnRyeShmdW5jKTsKKyAgICBpZiAoIWVudHJ5KQorCXJldHVybiAwOwkvKiBhbHJlYWR5IGRpc2FibGVkICovCisKKyAgICBsaXN0X2RlbCgmZW50cnktPmxpc3QpOworICAgIGZyZWUoZW50cnkpOworICAgIHJldHVybiAwOworfQorCisvKgorICogRW5hYmxlIG9yIGRpc2FibGUgZGVidWcgY29kZSBmb3IgZnVuY3Rpb24gJ2Z1bmMnLgorICovCitpbnQgc3lzbGludXhfZGVidWcoY29uc3QgY2hhciAqZnVuYywgYm9vbCBlbmFibGUpCit7CisgICAgaW50IHJ2OworCisgICAgaWYgKGVuYWJsZSkKKwlydiA9IF9fZW5hYmxlKGZ1bmMpOworICAgIGVsc2UKKwlydiA9IF9fZGlzYWJsZShmdW5jKTsKKworICAgIHJldHVybiBydjsKK30KKworI2Vsc2UKKworaW50IHN5c2xpbnV4X2RlYnVnKGNvbnN0IGNoYXIgKmZ1bmMsIGJvb2wgZW5hYmxlKQoreworICAgICh2b2lkKWZ1bmM7CisgICAgKHZvaWQpZW5hYmxlOworCisgICAgcHJpbnRmKCJEeW5hbWljIGRlYnVnIHVuYXZhaWxhYmxlXG4iKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKyNlbmRpZiAvKiBEWU5BTUlDX0RFQlVHICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvZGlzay5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2Rpc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTk5YmI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L2Rpc2suYwpAQCAtMCwwICsxLDU4MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICogICBDb3B5cmlnaHQgKEMpIDIwMTAgU2hhbyBNaWxsZXIKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBAZmlsZSBkaXNrLmMKKyAqCisgKiBEZWFsIHdpdGggZGlza3MgYW5kIHBhcnRpdGlvbnMKKyAqLworCisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Rpc2suaD4KKworLyoqCisgKiBDYWxsIGludCAxM2gsIGJ1dCB3aXRoIHJldHJ5IG9uIGZhaWx1cmUuICBFc3BlY2lhbGx5IGZsb3BwaWVzIG5lZWQgdGhpcy4KKyAqCisgKiBAdiBpbnJlZwkJCUNQVSByZWdpc3RlciBzZXR0aW5ncyB1cG9uIElOVCBjYWxsCisgKiBAdiBvdXRyZWcJCQlDUFUgcmVnaXN0ZXIgc2V0dGluZ3MgcmV0dXJuZWQgYnkgSU5UIGNhbGwKKyAqIEByZXQgKGludCkJCQkwIHVwb24gc3VjY2VzcywgLTEgdXBvbiBmYWlsdXJlCisgKi8KK2ludCBkaXNrX2ludDEzX3JldHJ5KGNvbnN0IGNvbTMyc3lzX3QgKiBpbnJlZywgY29tMzJzeXNfdCAqIG91dHJlZykKK3sKKyAgICBpbnQgcmV0cnkgPSA2OwkJLyogTnVtYmVyIG9mIHJldHJpZXMgKi8KKyAgICBjb20zMnN5c190IHRtcHJlZ3M7CisKKyAgICBpZiAoIW91dHJlZykKKwlvdXRyZWcgPSAmdG1wcmVnczsKKworICAgIHdoaWxlIChyZXRyeS0tKSB7CisJX19pbnRjYWxsKDB4MTMsIGlucmVnLCBvdXRyZWcpOworCWlmICghKG91dHJlZy0+ZWZsYWdzLmwgJiBFRkxBR1NfQ0YpKQorCSAgICByZXR1cm4gMDsJCS8qIENGPTAsIE9LICovCisgICAgfQorCisgICAgcmV0dXJuIC0xOwkJCS8qIEVycm9yICovCit9CisKKy8qKgorICogUXVlcnkgZGlzayBwYXJhbWV0ZXJzIGFuZCBFQklPUyBhdmFpbGFiaWxpdHkgZm9yIGEgcGFydGljdWxhciBkaXNrLgorICoKKyAqIEB2IGRpc2sJCQlUaGUgSU5UIDB4MTMgZGlzayBkcml2ZSBudW1iZXIgdG8gcHJvY2VzcworICogQHYgZGlza2luZm8JCQlUaGUgc3RydWN0dXJlIHRvIHNhdmUgdGhlIHF1ZXJpZWQgcGFyYW1zIHRvCisgKiBAcmV0IChpbnQpCQkJMCB1cG9uIHN1Y2Nlc3MsIC0xIHVwb24gZmFpbHVyZQorICovCitpbnQgZGlza19nZXRfcGFyYW1zKGludCBkaXNrLCBzdHJ1Y3QgZGlza19pbmZvICpjb25zdCBkaXNraW5mbykKK3sKKyAgICBzdGF0aWMgY29tMzJzeXNfdCBpbnJlZywgb3V0cmVnOworICAgIHN0cnVjdCBkaXNrX2ViaW9zX2VwYXJhbSAqZXBhcmFtOworICAgIGludCBydiA9IDA7CisKKyAgICBtZW1zZXQoZGlza2luZm8sIDAsIHNpemVvZiAqZGlza2luZm8pOworICAgIGRpc2tpbmZvLT5kaXNrID0gZGlzazsKKyAgICBkaXNraW5mby0+YnBzID0gU0VDVE9SOworCisgICAgLyogR2V0IEVCSU9TIHN1cHBvcnQgKi8KKyAgICBtZW1zZXQoJmlucmVnLCAwLCBzaXplb2YgaW5yZWcpOworICAgIGlucmVnLmVheC5iWzFdID0gMHg0MTsKKyAgICBpbnJlZy5lYngud1swXSA9IDB4NTVhYTsKKyAgICBpbnJlZy5lZHguYlswXSA9IGRpc2s7CisgICAgaW5yZWcuZWZsYWdzLmJbMF0gPSAweDM7CS8qIENGIHNldCAqLworCisgICAgX19pbnRjYWxsKDB4MTMsICZpbnJlZywgJm91dHJlZyk7CisKKyAgICBpZiAoIShvdXRyZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpICYmCisJb3V0cmVnLmVieC53WzBdID09IDB4YWE1NSAmJiAob3V0cmVnLmVjeC5iWzBdICYgMSkpIHsKKwlkaXNraW5mby0+ZWJpb3MgPSAxOworICAgIH0KKworICAgIGVwYXJhbSA9IGxtYWxsb2Moc2l6ZW9mICplcGFyYW0pOworICAgIGlmICghZXBhcmFtKQorCXJldHVybiAtMTsKKworICAgIC8qIEdldCBleHRlbmRlZCBkaXNrIHBhcmFtZXRlcnMgaWYgZWJpb3MgPT0gMSAqLworICAgIGlmIChkaXNraW5mby0+ZWJpb3MpIHsKKwltZW1zZXQoJmlucmVnLCAwLCBzaXplb2YgaW5yZWcpOworCWlucmVnLmVheC5iWzFdID0gMHg0ODsKKwlpbnJlZy5lZHguYlswXSA9IGRpc2s7CisJaW5yZWcuZXNpLndbMF0gPSBPRkZTKGVwYXJhbSk7CisJaW5yZWcuZHMgPSBTRUcoZXBhcmFtKTsKKworCW1lbXNldChlcGFyYW0sIDAsIHNpemVvZiAqZXBhcmFtKTsKKwllcGFyYW0tPmxlbiA9IHNpemVvZiAqZXBhcmFtOworCisJX19pbnRjYWxsKDB4MTMsICZpbnJlZywgJm91dHJlZyk7CisKKwlpZiAoIShvdXRyZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpKSB7CisJICAgIGRpc2tpbmZvLT5sYmFjbnQgPSBlcGFyYW0tPmxiYWNudDsKKwkgICAgaWYgKGVwYXJhbS0+YnBzKQorCQlkaXNraW5mby0+YnBzID0gZXBhcmFtLT5icHM7CisJICAgIC8qCisJICAgICAqIGRvbid0IHRoaW5rIGFib3V0IHVzaW5nIGdlb21ldHJ5IGRhdGEgcmV0dXJuZWQgYnkKKwkgICAgICogNDhoLCBhcyBpdCBjYW4gZGlmZmVyIGZyb20gMDhoIGEgbG90IC4uLgorCSAgICAgKi8KKwl9CisgICAgfQorICAgIC8qCisgICAgICogR2V0IGRpc2sgcGFyYW1ldGVycyB0aGUgb2xkIHdheSAtIHJlYWxseSBvbmx5IHVzZWZ1bCBmb3IgaGFyZAorICAgICAqIGRpc2tzLCBidXQgaWYgd2UgaGF2ZSBhIHBhcnRpdGlvbmVkIGZsb3BweSBpdCdzIGFjdHVhbGx5IG91ciBiZXN0CisgICAgICogY2hhbmNlLi4uCisgICAgICovCisgICAgbWVtc2V0KCZpbnJlZywgMCwgc2l6ZW9mIGlucmVnKTsKKyAgICBpbnJlZy5lYXguYlsxXSA9IDB4MDg7CisgICAgaW5yZWcuZWR4LmJbMF0gPSBkaXNrOworCisgICAgX19pbnRjYWxsKDB4MTMsICZpbnJlZywgJm91dHJlZyk7CisKKyAgICBpZiAob3V0cmVnLmVmbGFncy5sICYgRUZMQUdTX0NGKSB7CisJcnYgPSBkaXNraW5mby0+ZWJpb3MgPyAwIDogLTE7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgZGlza2luZm8tPnNwdCA9IDB4M2YgJiBvdXRyZWcuZWN4LmJbMF07CisgICAgZGlza2luZm8tPmhlYWQgPSAxICsgb3V0cmVnLmVkeC5iWzFdOworICAgIGRpc2tpbmZvLT5jeWwgPSAxICsgKG91dHJlZy5lY3guYlsxXSB8ICgob3V0cmVnLmVjeC5iWzBdICYgMHhjMHUpIDw8IDIpKTsKKworICAgIGlmIChkaXNraW5mby0+c3B0KQorCWRpc2tpbmZvLT5jYmlvcyA9IDE7CS8qIFZhbGlkIGdlb21ldHJ5ICovCisgICAgZWxzZSB7CisJZGlza2luZm8tPmhlYWQgPSAxOworCWRpc2tpbmZvLT5zcHQgPSAxOworCWRpc2tpbmZvLT5jeWwgPSAxOworICAgIH0KKworICAgIGlmICghZGlza2luZm8tPmxiYWNudCkKKwlkaXNraW5mby0+bGJhY250ID0gZGlza2luZm8tPmN5bCAqIGRpc2tpbmZvLT5oZWFkICogZGlza2luZm8tPnNwdDsKKworb3V0OgorICAgIGxmcmVlKGVwYXJhbSk7CisgICAgcmV0dXJuIHJ2OworfQorCisvKioKKyAqIEZpbGwgaW5yZWcgYmFzZWQgb24gRUJJT1MgYWRkcmVzc2luZyBwcm9wZXJ0aWVzLgorICoKKyAqIEB2IGRpc2tpbmZvCQkJVGhlIGRpc2sgZHJpdmUgdG8gcmVhZCBmcm9tCisgKiBAdiBpbnJlZwkJCVJlZ2lzdGVyIGRhdGEgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4KKyAqIEB2IGxiYQkJCVRoZSBsb2dpY2FsIGJsb2NrIGFkZHJlc3MgdG8gYmVnaW4gcmVhZGluZyBhdAorICogQHYgY291bnQJCQlUaGUgbnVtYmVyIG9mIHNlY3RvcnMgdG8gcmVhZAorICogQHYgb3BfY29kZQkJCUNvZGUgdG8gd3JpdGUvcmVhZCBvcGVyYXRpb24KKyAqIEByZXQgCQkJbG1hbGxvYydkIGJ1ZiB1cG9uIHN1Y2Nlc3MsIE5VTEwgdXBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyB2b2lkICplYmlvc19zZXR1cChjb25zdCBzdHJ1Y3QgZGlza19pbmZvICpjb25zdCBkaXNraW5mbywgY29tMzJzeXNfdCAqaW5yZWcsCisJCQkgdWludDY0X3QgbGJhLCB1aW50OF90IGNvdW50LCB1aW50OF90IG9wX2NvZGUpCit7CisgICAgc3RhdGljIHN0cnVjdCBkaXNrX2ViaW9zX2RhcGEgKmRhcGEgPSBOVUxMOworICAgIHZvaWQgKmJ1ZjsKKworICAgIGlmICghZGFwYSkgeworCWRhcGEgPSBsbWFsbG9jKHNpemVvZiAqZGFwYSk7CisJaWYgKCFkYXBhKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBidWYgPSBsbWFsbG9jKGNvdW50ICogZGlza2luZm8tPmJwcyk7CisgICAgaWYgKCFidWYpCisJcmV0dXJuIE5VTEw7CisKKyAgICBkYXBhLT5sZW4gPSBzaXplb2YoKmRhcGEpOworICAgIGRhcGEtPmNvdW50ID0gY291bnQ7CisgICAgZGFwYS0+b2ZmID0gT0ZGUyhidWYpOworICAgIGRhcGEtPnNlZyA9IFNFRyhidWYpOworICAgIGRhcGEtPmxiYSA9IGxiYTsKKworICAgIGlucmVnLT5lYXguYlsxXSA9IG9wX2NvZGU7CisgICAgaW5yZWctPmVzaS53WzBdID0gT0ZGUyhkYXBhKTsKKyAgICBpbnJlZy0+ZHMgPSBTRUcoZGFwYSk7CisgICAgaW5yZWctPmVkeC5iWzBdID0gZGlza2luZm8tPmRpc2s7CisKKyAgICByZXR1cm4gYnVmOworfQorCisvKioKKyAqIEZpbGwgaW5yZWcgYmFzZWQgb24gQ0hTIGFkZHJlc3NpbmcgcHJvcGVydGllcy4KKyAqCisgKiBAdiBkaXNraW5mbwkJCVRoZSBkaXNrIGRyaXZlIHRvIHJlYWQgZnJvbQorICogQHYgaW5yZWcJCQlSZWdpc3RlciBkYXRhIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuCisgKiBAdiBsYmEJCQlUaGUgbG9naWNhbCBibG9jayBhZGRyZXNzIHRvIGJlZ2luIHJlYWRpbmcgYXQKKyAqIEB2IGNvdW50CQkJVGhlIG51bWJlciBvZiBzZWN0b3JzIHRvIHJlYWQKKyAqIEB2IG9wX2NvZGUJCQlDb2RlIHRvIHdyaXRlL3JlYWQgb3BlcmF0aW9uCisgKiBAcmV0IAkJCWxtYWxsb2MnZCBidWYgdXBvbiBzdWNjZXNzLCBOVUxMIHVwb24gZmFpbHVyZQorICovCitzdGF0aWMgdm9pZCAqY2hzX3NldHVwKGNvbnN0IHN0cnVjdCBkaXNrX2luZm8gKmNvbnN0IGRpc2tpbmZvLCBjb20zMnN5c190ICppbnJlZywKKwkJICAgICAgIHVpbnQ2NF90IGxiYSwgdWludDhfdCBjb3VudCwgdWludDhfdCBvcF9jb2RlKQoreworICAgIHVuc2lnbmVkIGludCBjLCBoLCBzLCB0OworICAgIHZvaWQgKmJ1ZjsKKworICAgIGJ1ZiA9IGxtYWxsb2MoY291bnQgKiBkaXNraW5mby0+YnBzKTsKKyAgICBpZiAoIWJ1ZikKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qCisgICAgICogaWYgd2UgcGFzc2VkIGxiYSArIGNvdW50IGNoZWNrIGFuZCB3ZSBnZXQgaGVyZSwgdGhhdCBtZWFucyB0aGF0CisgICAgICogbGJhY250IHdhcyBjYWxjdWxhdGVkIGZyb20gY2hzIGdlb21ldHJ5IChvciBmYWtlZCBmcm9tIDEvMS8xKSwgdGh1cworICAgICAqIDMyYml0cyBhcmUgcGVyZmVjdGx5IGVub3VnaCBhbmQgbGJhY250IGNvcnJlc3BvbmRzIHRvIGN5bGluZGVyCisgICAgICogYm91bmRhcnkKKyAgICAgKi8KKyAgICBzID0gbGJhICUgZGlza2luZm8tPnNwdDsKKyAgICB0ID0gbGJhIC8gZGlza2luZm8tPnNwdDsKKyAgICBoID0gdCAlIGRpc2tpbmZvLT5oZWFkOworICAgIGMgPSB0IC8gZGlza2luZm8tPmhlYWQ7CisKKyAgICBtZW1zZXQoaW5yZWcsIDAsIHNpemVvZiAqaW5yZWcpOworICAgIGlucmVnLT5lYXguYlswXSA9IGNvdW50OworICAgIGlucmVnLT5lYXguYlsxXSA9IG9wX2NvZGU7CisgICAgaW5yZWctPmVjeC5iWzFdID0gYzsKKyAgICBpbnJlZy0+ZWN4LmJbMF0gPSAoKGMgJiAweDMwMCkgPj4gMikgfCAocysxKTsKKyAgICBpbnJlZy0+ZWR4LmJbMV0gPSBoOworICAgIGlucmVnLT5lZHguYlswXSA9IGRpc2tpbmZvLT5kaXNrOworICAgIGlucmVnLT5lYngud1swXSA9IE9GRlMoYnVmKTsKKyAgICBpbnJlZy0+ZXMgPSBTRUcoYnVmKTsKKworICAgIHJldHVybiBidWY7Cit9CisKKy8qKgorICogR2V0IGRpc2sgYmxvY2socykgYW5kIHJldHVybiBhIG1hbGxvYydkIGJ1ZmZlci4KKyAqCisgKiBAdiBkaXNraW5mbwkJCVRoZSBkaXNrIGRyaXZlIHRvIHJlYWQgZnJvbQorICogQHYgbGJhCQkJVGhlIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcyB0byBiZWdpbiByZWFkaW5nIGF0CisgKiBAdiBjb3VudAkJCVRoZSBudW1iZXIgb2Ygc2VjdG9ycyB0byByZWFkCisgKiBAcmV0IGRhdGEJCQlBbiBhbGxvY2F0ZWQgYnVmZmVyIHdpdGggdGhlIHJlYWQgZGF0YQorICoKKyAqIFVzZXMgdGhlIGRpc2sgbnVtYmVyIGFuZCBpbmZvcm1hdGlvbiBmcm9tIGRpc2tpbmZvLiAgUmVhZCBjb3VudCBzZWN0b3JzCisgKiBmcm9tIGRyaXZlLCBzdGFydGluZyBhdCBsYmEuICBSZXR1cm4gYSBuZXcgYnVmZmVyLCBvciBOVUxMIHVwb24gZmFpbHVyZS4KKyAqLwordm9pZCAqZGlza19yZWFkX3NlY3RvcnMoY29uc3Qgc3RydWN0IGRpc2tfaW5mbyAqY29uc3QgZGlza2luZm8sIHVpbnQ2NF90IGxiYSwKKwkJCXVpbnQ4X3QgY291bnQpCit7CisgICAgY29tMzJzeXNfdCBpbnJlZzsKKyAgICB2b2lkICpidWY7CisgICAgdm9pZCAqZGF0YSA9IE5VTEw7CisgICAgdWludDMyX3QgbWF4Y250OworICAgIHVpbnQzMl90IHNpemUgPSA2NTUzNjsKKworICAgIG1heGNudCA9IChzaXplIC0gZGlza2luZm8tPmJwcykgLyBkaXNraW5mby0+YnBzOworICAgIGlmICghY291bnQgfHwgY291bnQgPiBtYXhjbnQgfHwgbGJhICsgY291bnQgPiBkaXNraW5mby0+bGJhY250KQorCXJldHVybiBOVUxMOworCisgICAgbWVtc2V0KCZpbnJlZywgMCwgc2l6ZW9mIGlucmVnKTsKKworICAgIGlmIChkaXNraW5mby0+ZWJpb3MpCisJYnVmID0gZWJpb3Nfc2V0dXAoZGlza2luZm8sICZpbnJlZywgbGJhLCBjb3VudCwgRUJJT1NfUkVBRF9DT0RFKTsKKyAgICBlbHNlCisJYnVmID0gY2hzX3NldHVwKGRpc2tpbmZvLCAmaW5yZWcsIGxiYSwgY291bnQsIENIU19SRUFEX0NPREUpOworCisgICAgaWYgKCFidWYpCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoZGlza19pbnQxM19yZXRyeSgmaW5yZWcsIE5VTEwpKQorCWdvdG8gb3V0OworCisgICAgZGF0YSA9IG1hbGxvYyhjb3VudCAqIGRpc2tpbmZvLT5icHMpOworICAgIGlmIChkYXRhKQorCW1lbWNweShkYXRhLCBidWYsIGNvdW50ICogZGlza2luZm8tPmJwcyk7CitvdXQ6CisgICAgbGZyZWUoYnVmKTsKKyAgICByZXR1cm4gZGF0YTsKK30KKworLyoqCisgKiBXcml0ZSBkaXNrIGJsb2NrKHMpLgorICoKKyAqIEB2IGRpc2tpbmZvCQkJVGhlIGRpc2sgZHJpdmUgdG8gd3JpdGUgdG8KKyAqIEB2IGxiYQkJCVRoZSBsb2dpY2FsIGJsb2NrIGFkZHJlc3MgdG8gYmVnaW4gd3JpdGluZyBhdAorICogQHYgZGF0YQkJCVRoZSBkYXRhIHRvIHdyaXRlCisgKiBAdiBjb3VudAkJCVRoZSBudW1iZXIgb2Ygc2VjdG9ycyB0byB3cml0ZQorICogQHJldCAoaW50KQkJCTAgdXBvbiBzdWNjZXNzLCAtMSB1cG9uIGZhaWx1cmUKKyAqCisgKiBVc2VzIHRoZSBkaXNrIG51bWJlciBhbmQgaW5mb3JtYXRpb24gZnJvbSBkaXNraW5mby4KKyAqIFdyaXRlIHNlY3RvcihzKSB0byBhIGRpc2sgZHJpdmUsIHN0YXJ0aW5nIGF0IGxiYS4KKyAqLworaW50IGRpc2tfd3JpdGVfc2VjdG9ycyhjb25zdCBzdHJ1Y3QgZGlza19pbmZvICpjb25zdCBkaXNraW5mbywgdWludDY0X3QgbGJhLAorCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdWludDhfdCBjb3VudCkKK3sKKyAgICBjb20zMnN5c190IGlucmVnOworICAgIHZvaWQgKmJ1ZjsKKyAgICB1aW50MzJfdCBtYXhjbnQ7CisgICAgdWludDMyX3Qgc2l6ZSA9IDY1NTM2OworICAgIGludCBydiA9IC0xOworCisgICAgbWF4Y250ID0gKHNpemUgLSBkaXNraW5mby0+YnBzKSAvIGRpc2tpbmZvLT5icHM7CisgICAgaWYgKCFjb3VudCB8fCBjb3VudCA+IG1heGNudCB8fCBsYmEgKyBjb3VudCA+IGRpc2tpbmZvLT5sYmFjbnQpCisJcmV0dXJuIC0xOworCisgICAgbWVtc2V0KCZpbnJlZywgMCwgc2l6ZW9mIGlucmVnKTsKKworICAgIGlmIChkaXNraW5mby0+ZWJpb3MpCisJYnVmID0gZWJpb3Nfc2V0dXAoZGlza2luZm8sICZpbnJlZywgbGJhLCBjb3VudCwgRUJJT1NfV1JJVEVfQ09ERSk7CisgICAgZWxzZQorCWJ1ZiA9IGNoc19zZXR1cChkaXNraW5mbywgJmlucmVnLCBsYmEsIGNvdW50LCBDSFNfV1JJVEVfQ09ERSk7CisKKyAgICBpZiAoIWJ1ZikKKwlyZXR1cm4gLTE7CisKKyAgICBtZW1jcHkoYnVmLCBkYXRhLCBjb3VudCAqIGRpc2tpbmZvLT5icHMpOworCisgICAgaWYgKGRpc2tfaW50MTNfcmV0cnkoJmlucmVnLCBOVUxMKSkKKwlnb3RvIG91dDsKKworICAgIHJ2ID0gMDsJCQkvKiBvayAqLworb3V0OgorICAgIGxmcmVlKGJ1Zik7CisgICAgcmV0dXJuIHJ2OworfQorCisvKioKKyAqIFdyaXRlIGRpc2sgYmxvY2tzIGFuZCB2ZXJpZnkgdGhleSB3ZXJlIHdyaXR0ZW4uCisgKgorICogQHYgZGlza2luZm8JCQlUaGUgZGlzayBkcml2ZSB0byB3cml0ZSB0bworICogQHYgbGJhCQkJVGhlIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcyB0byBiZWdpbiB3cml0aW5nIGF0CisgKiBAdiBidWYJCQlUaGUgZGF0YSB0byB3cml0ZQorICogQHYgY291bnQJCQlUaGUgbnVtYmVyIG9mIHNlY3RvcnMgdG8gd3JpdGUKKyAqIEByZXQgcnYJCQkwIHVwb24gc3VjY2VzcywgLTEgdXBvbiBmYWlsdXJlCisgKgorICogVXNlcyB0aGUgZGlzayBudW1iZXIgYW5kIGluZm9ybWF0aW9uIGZyb20gZGlza2luZm8uCisgKiBXcml0ZXMgc2VjdG9ycyB0byBhIGRpc2sgZHJpdmUgc3RhcnRpbmcgYXQgbGJhLCB0aGVuIHJlYWRzIHRoZW0gYmFjaworICogdG8gdmVyaWZ5IHRoZXkgd2VyZSB3cml0dGVuIGNvcnJlY3RseS4KKyAqLworaW50IGRpc2tfd3JpdGVfdmVyaWZ5X3NlY3RvcnMoY29uc3Qgc3RydWN0IGRpc2tfaW5mbyAqY29uc3QgZGlza2luZm8sCisJCQkgICAgICB1aW50NjRfdCBsYmEsIGNvbnN0IHZvaWQgKmJ1ZiwgdWludDhfdCBjb3VudCkKK3sKKyAgICBjaGFyICpyYjsKKyAgICBpbnQgcnY7CisKKyAgICBydiA9IGRpc2tfd3JpdGVfc2VjdG9ycyhkaXNraW5mbywgbGJhLCBidWYsIGNvdW50KTsKKyAgICBpZiAocnYpCisJcmV0dXJuIHJ2OwkJLyogV3JpdGUgZmFpbHVyZSAqLworICAgIHJiID0gZGlza19yZWFkX3NlY3RvcnMoZGlza2luZm8sIGxiYSwgY291bnQpOworICAgIGlmICghcmIpCisJcmV0dXJuIC0xOwkJLyogUmVhZGJhY2sgZmFpbHVyZSAqLworICAgIHJ2ID0gbWVtY21wKGJ1ZiwgcmIsIGNvdW50ICogZGlza2luZm8tPmJwcyk7CisgICAgZnJlZShyYik7CisgICAgcmV0dXJuIHJ2ID8gLTEgOiAwOworfQorCisvKioKKyAqIER1bXAgaW5mbyBhYm91dCBhIERPUyBwYXJ0aXRpb24gZW50cnkKKyAqCisgKiBAdiBwYXJ0CQkJVGhlIDE2LWJ5dGUgcGFydGl0aW9uIGVudHJ5IHRvIGV4YW1pbmUKKyAqLwordm9pZCBkaXNrX2Rvc19wYXJ0X2R1bXAoY29uc3Qgc3RydWN0IGRpc2tfZG9zX3BhcnRfZW50cnkgKmNvbnN0IHBhcnQpCit7CisgICAgKHZvaWQpcGFydDsKKyAgICBkcHJpbnRmKCJQYXJ0aXRpb24gc3RhdHVzIF9fX19fIDogMHglLjJ4XG4iCisJICAgICJQYXJ0aXRpb24gQ0hTIHN0YXJ0XG4iCisJICAgICIgIEN5bGluZGVyIF9fX19fX19fX19fIDogMHglLjR4ICgldSlcbiIKKwkgICAgIiAgSGVhZCBfX19fX19fX19fX19fX18gOiAweCUuMnggKCV1KVxuIgorCSAgICAiICBTZWN0b3IgX19fX19fX19fX19fXyA6IDB4JS4yeCAoJXUpXG4iCisJICAgICJQYXJ0aXRpb24gdHlwZSBfX19fX19fIDogMHglLjJ4XG4iCisJICAgICJQYXJ0aXRpb24gQ0hTIGVuZFxuIgorCSAgICAiICBDeWxpbmRlciBfX19fX19fX19fXyA6IDB4JS40eCAoJXUpXG4iCisJICAgICIgIEhlYWQgX19fX19fX19fX19fX19fIDogMHglLjJ4ICgldSlcbiIKKwkgICAgIiAgU2VjdG9yIF9fX19fX19fX19fX18gOiAweCUuMnggKCV1KVxuIgorCSAgICAiUGFydGl0aW9uIExCQSBzdGFydCBfXyA6IDB4JS44eCAoJXUpXG4iCisJICAgICJQYXJ0aXRpb24gTEJBIGNvdW50IF9fIDogMHglLjh4ICgldSlcbiIKKwkgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsCisJICAgIHBhcnQtPmFjdGl2ZV9mbGFnLAorCSAgICBjaHNfY3lsaW5kZXIocGFydC0+c3RhcnQpLAorCSAgICBjaHNfY3lsaW5kZXIocGFydC0+c3RhcnQpLAorCSAgICBjaHNfaGVhZChwYXJ0LT5zdGFydCksCisJICAgIGNoc19oZWFkKHBhcnQtPnN0YXJ0KSwKKwkgICAgY2hzX3NlY3RvcihwYXJ0LT5zdGFydCksCisJICAgIGNoc19zZWN0b3IocGFydC0+c3RhcnQpLAorCSAgICBwYXJ0LT5vc3R5cGUsCisJICAgIGNoc19jeWxpbmRlcihwYXJ0LT5lbmQpLAorCSAgICBjaHNfY3lsaW5kZXIocGFydC0+ZW5kKSwKKwkgICAgY2hzX2hlYWQocGFydC0+ZW5kKSwKKwkgICAgY2hzX2hlYWQocGFydC0+ZW5kKSwKKwkgICAgY2hzX3NlY3RvcihwYXJ0LT5lbmQpLAorCSAgICBjaHNfc2VjdG9yKHBhcnQtPmVuZCksCisJICAgIHBhcnQtPnN0YXJ0X2xiYSwgcGFydC0+c3RhcnRfbGJhLCBwYXJ0LT5sZW5ndGgsIHBhcnQtPmxlbmd0aCk7Cit9CisKKy8qIFRyaXZpYWwgZXJyb3IgbWVzc2FnZSBvdXRwdXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlcnJvcihjb25zdCBjaGFyICptc2cpCit7CisgICAgZnB1dHMobXNnLCBzdGRlcnIpOworfQorCisvKioKKyAqIFRoaXMgd2Fsay1tYXAgZWZmZWN0aXZlbHkgcmV2ZXJzZXMgdGhlIGxpdHRsZS1lbmRpYW4KKyAqIHBvcnRpb25zIG9mIGEgR1BUIGRpc2svcGFydGl0aW9uIEdVSUQgZm9yIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICogVGhlcmUgbWlnaHQgYmUgYSBiZXR0ZXIgaGVhZGVyIGZvciB0aGlzLi4uCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGd1aWRfbGVfd2Fsa19tYXBbXSA9IHsKKyAgICAzLCAtMSwgLTEsIC0xLCAwLAorICAgIDUsIC0xLCAwLAorICAgIDMsIC0xLCAwLAorICAgIDIsIDEsIDAsCisgICAgMSwgMSwgMSwgMSwgMSwgMQorfTsKKworLyoqCisgKiBGaWxsIGEgYnVmZmVyIHdpdGggYSB0ZXh0dWFsIEdVSUQgcmVwcmVzZW50YXRpb24uCisgKgorICogQHYgYnVmCQkJUG9pbnRzIHRvIGEgbWluaW11bSBhcnJheSBvZiAzNyBjaGFycworICogQHYgaWQJCQlUaGUgR1VJRCB0byByZXByZXNlbnQgYXMgdGV4dAorICoKKyAqIFRoZSBidWZmZXIgbXVzdCBiZSA+PSBjaGFyWzM3XSBhbmQgd2lsbCBiZSBwb3B1bGF0ZWQKKyAqIHdpdGggYW4gQVNDSUkgTlVMIEMgc3RyaW5nIHRlcm1pbmF0b3IuCisgKiBFeGFtcGxlOiAxMTExMTExMS0yMjIyLTMzMzMtNDQ0NC00NDQ0NDQ0NDQ0NDQKKyAqIEVuZGlhbjogIExMTExMTExMLUxMTEwtTExMTC1CQkJCLUJCQkJCQkJCQkJCQgorICovCit2b2lkIGd1aWRfdG9fc3RyKGNoYXIgKmJ1ZiwgY29uc3Qgc3RydWN0IGd1aWQgKmNvbnN0IGlkKQoreworICAgIHVuc2lnbmVkIGludCBpID0gMDsKKyAgICBjb25zdCBjaGFyICp3YWxrZXIgPSAoY29uc3QgY2hhciAqKWlkOworCisgICAgd2hpbGUgKGkgPCBzaXplb2YoZ3VpZF9sZV93YWxrX21hcCkpIHsKKwl3YWxrZXIgKz0gZ3VpZF9sZV93YWxrX21hcFtpXTsKKwlpZiAoIWd1aWRfbGVfd2Fsa19tYXBbaV0pCisJICAgICpidWYgPSAnLSc7CisJZWxzZSB7CisJICAgICpidWYgPSAoKCp3YWxrZXIgJiAweEYwKSA+PiA0KSArICcwJzsKKwkgICAgaWYgKCpidWYgPiAnOScpCisJCSpidWYgKz0gJ0EnIC0gJzknIC0gMTsKKwkgICAgYnVmKys7CisJICAgICpidWYgPSAoKndhbGtlciAmIDB4MEYpICsgJzAnOworCSAgICBpZiAoKmJ1ZiA+ICc5JykKKwkJKmJ1ZiArPSAnQScgLSAnOScgLSAxOworCX0KKwlidWYrKzsKKwlpKys7CisgICAgfQorICAgICpidWYgPSAwOworfQorCisvKioKKyAqIENyZWF0ZSBhIEdVSUQgc3RydWN0dXJlIGZyb20gYSB0ZXh0dWFsIEdVSUQgcmVwcmVzZW50YXRpb24uCisgKgorICogQHYgYnVmCQkJUG9pbnRzIHRvIGEgR1VJRCBzdHJpbmcgdG8gcGFyc2UKKyAqIEB2IGlkCQkJUG9pbnRzIHRvIGEgR1VJRCB0byBiZSBwb3B1bGF0ZWQKKyAqIEByZXQgKGludCkJCQlSZXR1cm5zIDAgdXBvbiBzdWNjZXNzLCAtMSB1cG9uIGZhaWx1cmUKKyAqCisgKiBUaGUgaW5wdXQgYnVmZmVyIG11c3QgYmUgPj0gMzIgaGV4YWRlY2ltYWwgY2hhcnMgYW5kIGJlCisgKiB0ZXJtaW5hdGVkIHdpdGggYW4gQVNDSUkgTlVMLiAgUmV0dXJucyBub24temVybyBvbiBmYWlsdXJlLgorICogRXhhbXBsZTogMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNDQ0NDQ0NDQ0NDQ0CisgKiBFbmRpYW46ICBMTExMTExMTC1MTExMLUxMTEwtQkJCQi1CQkJCQkJCQkJCQkIKKyAqLworaW50IHN0cl90b19ndWlkKGNvbnN0IGNoYXIgKmJ1Ziwgc3RydWN0IGd1aWQgKmNvbnN0IGlkKQoreworICAgIGNoYXIgZ3VpZF9zZXFbc2l6ZW9mKHN0cnVjdCBndWlkKSAqIDJdOworICAgIHVuc2lnbmVkIGludCBpID0gMDsKKyAgICBjaGFyICp3YWxrZXIgPSAoY2hhciAqKWlkOworCisgICAgd2hpbGUgKCpidWYgJiYgaSA8IHNpemVvZihndWlkX3NlcSkpIHsKKwlzd2l0Y2ggKCpidWYpIHsKKwkgICAgLyogU2tpcCB0aGVzZSB0aHJlZSBjaGFyYWN0ZXJzICovCisJY2FzZSAneyc6CisJY2FzZSAnfSc6CisJY2FzZSAnLSc6CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIC8qIENvcHkgc29tZXRoaW5nIHVzZWZ1bCB0byB0aGUgdGVtcC4gc2VxdWVuY2UgKi8KKwkgICAgaWYgKCgqYnVmID49ICcwJykgJiYgKCpidWYgPD0gJzknKSkKKwkJZ3VpZF9zZXFbaV0gPSAqYnVmIC0gJzAnOworCSAgICBlbHNlIGlmICgoKmJ1ZiA+PSAnQScpICYmICgqYnVmIDw9ICdGJykpCisJCWd1aWRfc2VxW2ldID0gKmJ1ZiAtICdBJyArIDEwOworCSAgICBlbHNlIGlmICgoKmJ1ZiA+PSAnYScpICYmICgqYnVmIDw9ICdmJykpCisJCWd1aWRfc2VxW2ldID0gKmJ1ZiAtICdhJyArIDEwOworCSAgICBlbHNlIHsKKwkJLyogT3Igbm90ICovCisJCWVycm9yKCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBHVUlEIVxuIik7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBpKys7CisJfQorCWJ1ZisrOworICAgIH0KKyAgICAvKiBDaGVjayBmb3IgaW5zdWZmaWNpZW50IHZhbGlkIGNoYXJhY3RlcnMgKi8KKyAgICBpZiAoaSA8IHNpemVvZihndWlkX3NlcSkpIHsKKwllcnJvcigiVG9vIGZldyBHVUlEIGNoYXJhY3RlcnMhXG4iKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGJ1ZiA9IGd1aWRfc2VxOworICAgIGkgPSAwOworICAgIHdoaWxlIChpIDwgc2l6ZW9mKGd1aWRfbGVfd2Fsa19tYXApKSB7CisJaWYgKCFndWlkX2xlX3dhbGtfbWFwW2ldKQorCSAgICBpKys7CisJd2Fsa2VyICs9IGd1aWRfbGVfd2Fsa19tYXBbaV07CisJKndhbGtlciA9ICpidWYgPDwgNDsKKwlidWYrKzsKKwkqd2Fsa2VyIHw9ICpidWY7CisJYnVmKys7CisJaSsrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEaXNwbGF5IEdQVCBwYXJ0aXRpb24gZGV0YWlscy4KKyAqCisgKiBAdiBncHRfcGFydAkJCVRoZSBHUFQgcGFydGl0aW9uIGVudHJ5IHRvIGRpc3BsYXkKKyAqLwordm9pZCBkaXNrX2dwdF9wYXJ0X2R1bXAoY29uc3Qgc3RydWN0IGRpc2tfZ3B0X3BhcnRfZW50cnkgKmNvbnN0IGdwdF9wYXJ0KQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIGNoYXIgZ3VpZF90ZXh0WzM3XTsKKworICAgIGRwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkgICAgIkdQVCBwYXJ0LiBMQkEgZmlyc3QgX18gOiAweCUuMTZsbHhcbiIKKwkgICAgIkdQVCBwYXJ0LiBMQkEgbGFzdCBfX18gOiAweCUuMTZsbHhcbiIKKwkgICAgIkdQVCBwYXJ0LiBhdHRyaWJzIF9fX18gOiAweCUuMTZsbHhcbiIKKwkgICAgIkdQVCBwYXJ0LiBuYW1lIF9fX19fX18gOiAnIiwKKwkgICAgZ3B0X3BhcnQtPmxiYV9maXJzdCwgZ3B0X3BhcnQtPmxiYV9sYXN0LCBncHRfcGFydC0+YXR0cmlicyk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihncHRfcGFydC0+bmFtZSk7IGkrKykgeworCWlmIChncHRfcGFydC0+bmFtZVtpXSkKKwkgICAgZHByaW50ZigiJWMiLCBncHRfcGFydC0+bmFtZVtpXSk7CisgICAgfQorICAgIGRwcmludGYoIiciKTsKKyAgICBndWlkX3RvX3N0cihndWlkX3RleHQsICZncHRfcGFydC0+dHlwZSk7CisgICAgZHByaW50ZigiR1BUIHBhcnQuIHR5cGUgR1VJRCBfXyA6IHslc31cbiIsIGd1aWRfdGV4dCk7CisgICAgZ3VpZF90b19zdHIoZ3VpZF90ZXh0LCAmZ3B0X3BhcnQtPnVpZCk7CisgICAgZHByaW50ZigiR1BUIHBhcnQuIHVuaXF1ZSBJRCBfXyA6IHslc31cbiIsIGd1aWRfdGV4dCk7Cit9CisKKy8qKgorICogRGlzcGxheSBHUFQgaGVhZGVyIGRldGFpbHMuCisgKgorICogQHYgZ3B0CQkJVGhlIEdQVCBoZWFkZXIgdG8gZGlzcGxheQorICovCit2b2lkIGRpc2tfZ3B0X2hlYWRlcl9kdW1wKGNvbnN0IHN0cnVjdCBkaXNrX2dwdF9oZWFkZXIgKmNvbnN0IGdwdCkKK3sKKyAgICBjaGFyIGd1aWRfdGV4dFszN107CisKKyAgICBwcmludGYoIkdQVCBzaWcgX19fX19fX19fX19fX18gOiAnJTguOHMnXG4iCisJICAgIkdQVCBtYWpvciByZXZpc2lvbiBfX18gOiAweCUuNHhcbiIKKwkgICAiR1BUIG1pbm9yIHJldmlzaW9uIF9fXyA6IDB4JS40eFxuIgorCSAgICJHUFQgaGVhZGVyIHNpemUgX19fX19fIDogMHglLjh4XG4iCisJICAgIkdQVCBoZWFkZXIgY2hlY2tzdW0gX18gOiAweCUuOHhcbiIKKwkgICAiR1BUIHJlc2VydmVkIF9fX19fX19fXyA6ICclNC40cydcbiIKKwkgICAiR1BUIExCQSBjdXJyZW50IF9fX19fXyA6IDB4JS4xNmxseFxuIgorCSAgICJHUFQgTEJBIGFsdGVybmF0aXZlIF9fIDogMHglLjE2bGx4XG4iCisJICAgIkdQVCBMQkEgZmlyc3QgdXNhYmxlIF8gOiAweCUuMTZsbHhcbiIKKwkgICAiR1BUIExCQSBsYXN0IHVzYWJsZSBfXyA6IDB4JS4xNmxseFxuIgorCSAgICJHUFQgTEJBIHBhcnQuIHRhYmxlIF9fIDogMHglLjE2bGx4XG4iCisJICAgIkdQVCBwYXJ0aXRpb24gY291bnQgX18gOiAweCUuOHhcbiIKKwkgICAiR1BUIHBhcnRpdGlvbiBzaXplIF9fXyA6IDB4JS44eFxuIgorCSAgICJHUFQgcGFydC4gdGFibGUgY2hrc3VtIDogMHglLjh4XG4iLAorCSAgIGdwdC0+c2lnLAorCSAgIGdwdC0+cmV2LmZpZWxkcy5tYWpvciwKKwkgICBncHQtPnJldi5maWVsZHMubWlub3IsCisJICAgZ3B0LT5oZHJfc2l6ZSwKKwkgICBncHQtPmNoa3N1bSwKKwkgICBncHQtPnJlc2VydmVkMSwKKwkgICBncHQtPmxiYV9jdXIsCisJICAgZ3B0LT5sYmFfYWx0LAorCSAgIGdwdC0+bGJhX2ZpcnN0X3VzYWJsZSwKKwkgICBncHQtPmxiYV9sYXN0X3VzYWJsZSwKKwkgICBncHQtPmxiYV90YWJsZSwgZ3B0LT5wYXJ0X2NvdW50LCBncHQtPnBhcnRfc2l6ZSwgZ3B0LT50YWJsZV9jaGtzdW0pOworICAgIGd1aWRfdG9fc3RyKGd1aWRfdGV4dCwgJmdwdC0+ZGlza19ndWlkKTsKKyAgICBwcmludGYoIkdQVCBkaXNrIEdVSUQgX19fX19fX18gOiB7JXN9XG4iLCBndWlkX3RleHQpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L2RzaW5mby5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2RzaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTI2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvZHNpbmZvLmMKQEAgLTAsMCArMSwzOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDgtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKwordW5pb24gc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvIF9fc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvOworCit2b2lkIF9fY29uc3RydWN0b3IgX19zeXNsaW51eF9nZXRfZGVyaXZhdGl2ZV9pbmZvKHZvaWQpCit7CisgICAgZ2V0X2Rlcml2YXRpdmVfaW5mbygmX19zeXNsaW51eF9kZXJpdmF0aXZlX2luZm8pOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L2R1bXBfbW1hcC5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2R1bXBfbW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjM4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvZHVtcF9tbWFwLmMKQEAgLTAsMCArMSw0OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGR1bXBfbW1hcC5jCisgKgorICogV3JpdGVzIGEgc3lzbGludXhfbWVtbWFwIG91dCB0byBhIGRwcmludGYuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L21vdmViaXRzLmg+CisKKyNpZmRlZiBERUJVRwordm9pZCBzeXNsaW51eF9kdW1wX21lbW1hcChzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptZW1tYXApCit7CisgICAgZHByaW50ZigiJTEwcyAlMTBzICUxMHNcbiIKKwkgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCAiU3RhcnQiLCAiTGVuZ3RoIiwgIlR5cGUiKTsKKyAgICB3aGlsZSAobWVtbWFwLT5uZXh0KSB7CisJZHByaW50ZigiMHglMDh4IDB4JTA4eCAlMTBkXG4iLCBtZW1tYXAtPnN0YXJ0LAorCQltZW1tYXAtPm5leHQtPnN0YXJ0IC0gbWVtbWFwLT5zdGFydCwgbWVtbWFwLT50eXBlKTsKKwltZW1tYXAgPSBtZW1tYXAtPm5leHQ7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvZHVtcF9tb3ZlbGlzdC5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2R1bXBfbW92ZWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQyY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L2R1bXBfbW92ZWxpc3QuYwpAQCAtMCwwICsxLDQ5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZHVtcF9tb3ZlbGlzdC5jCisgKgorICogV3JpdGVzIGEgc3lzbGludXhfbW92ZWxpc3Qgb3V0IHRvIGEgc3BlY2lmaWVkIGZpbGUuICBUaGlzIGlzCisgKiBpbnRlbmRlZCBmb3IgZGVidWdnaW5nLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorCisjaWZkZWYgREVCVUcKK3ZvaWQgc3lzbGludXhfZHVtcF9tb3ZlbGlzdChzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKm1sKQoreworICAgIGRwcmludGYoIiUxMHMgJTEwcyAlMTBzXG4iCisJICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgIkRlc3QiLCAiU3JjIiwgIkxlbmd0aCIpOworICAgIHdoaWxlIChtbCkgeworCWRwcmludGYoIjB4JTA4eCAweCUwOHggMHglMDh4XG4iLCBtbC0+ZHN0LCBtbC0+c3JjLCBtbC0+bGVuKTsKKwltbCA9IG1sLT5uZXh0OworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L2Zsb2FkZmlsZS5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2Zsb2FkZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZTQ2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvZmxvYWRmaWxlLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA1LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBmbG9hZGZpbGUuYworICoKKyAqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgZGF0YSBmaWxlIGludG8gYSBtYWxsb2MnZCBidWZmZXIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxzeXNsaW51eC9sb2FkZmlsZS5oPgorCisjZGVmaW5lIElOQ1JFTUVOVEFMX0NIVU5LIDEwMjQqMTAyNAorCitpbnQgZmxvYWRmaWxlKEZJTEUgKiBmLCB2b2lkICoqcHRyLCBzaXplX3QgKiBsZW4sIGNvbnN0IHZvaWQgKnByZWZpeCwKKwkgICAgICBzaXplX3QgcHJlZml4X2xlbikKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICB2b2lkICpkYXRhLCAqZHA7CisgICAgc2l6ZV90IGFsZW4sIGNsZW4sIHJsZW4sIHhsZW47CisKKyAgICBjbGVuID0gYWxlbiA9IDA7CisgICAgZGF0YSA9IE5VTEw7CisKKyAgICBpZiAoZnN0YXQoZmlsZW5vKGYpLCAmc3QpKQorCWdvdG8gZXJyOworCisgICAgaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJLyogTm90IGEgcmVndWxhciBmaWxlLCB3ZSBjYW4ndCBhc3N1bWUgd2Uga25vdyB0aGUgZmlsZSBzaXplICovCisJaWYgKHByZWZpeF9sZW4pIHsKKwkgICAgY2xlbiA9IGFsZW4gPSBwcmVmaXhfbGVuOworCSAgICBkYXRhID0gbWFsbG9jKHByZWZpeF9sZW4pOworCSAgICBpZiAoIWRhdGEpCisJCWdvdG8gZXJyOworCisJICAgIG1lbWNweShkYXRhLCBwcmVmaXgsIHByZWZpeF9sZW4pOworCX0KKworCWRvIHsKKwkgICAgYWxlbiArPSBJTkNSRU1FTlRBTF9DSFVOSzsKKwkgICAgZHAgPSByZWFsbG9jKGRhdGEsIGFsZW4pOworCSAgICBpZiAoIWRwKQorCQlnb3RvIGVycjsKKwkgICAgZGF0YSA9IGRwOworCisJICAgIHJsZW4gPSBmcmVhZCgoY2hhciAqKWRhdGEgKyBjbGVuLCAxLCBhbGVuIC0gY2xlbiwgZik7CisJICAgIGNsZW4gKz0gcmxlbjsKKwl9IHdoaWxlIChjbGVuID09IGFsZW4pOworCisJKmxlbiA9IGNsZW47CisJeGxlbiA9IChjbGVuICsgTE9BREZJTEVfWkVST19QQUQgLSAxKSAmIH4oTE9BREZJTEVfWkVST19QQUQgLSAxKTsKKwlkcCA9IHJlYWxsb2MoZGF0YSwgeGxlbik7CisJaWYgKGRwKQorCSAgICBkYXRhID0gZHA7CisJKnB0ciA9IGRhdGE7CisgICAgfSBlbHNlIHsKKwkqbGVuID0gY2xlbiA9IHN0LnN0X3NpemUgKyBwcmVmaXhfbGVuIC0gZnRlbGwoZik7CisJeGxlbiA9IChjbGVuICsgTE9BREZJTEVfWkVST19QQUQgLSAxKSAmIH4oTE9BREZJTEVfWkVST19QQUQgLSAxKTsKKworCSpwdHIgPSBkYXRhID0gbWFsbG9jKHhsZW4pOworCWlmICghZGF0YSkKKwkgICAgcmV0dXJuIC0xOworCisJbWVtY3B5KGRhdGEsIHByZWZpeCwgcHJlZml4X2xlbik7CisKKwlpZiAoKG9mZl90KSBmcmVhZCgoY2hhciAqKWRhdGEgKyBwcmVmaXhfbGVuLCAxLCBjbGVuIC0gcHJlZml4X2xlbiwgZikKKwkgICAgIT0gY2xlbiAtIHByZWZpeF9sZW4pCisJICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIG1lbXNldCgoY2hhciAqKWRhdGEgKyBjbGVuLCAwLCB4bGVuIC0gY2xlbik7CisgICAgcmV0dXJuIDA7CisKK2VycjoKKyAgICBpZiAoZGF0YSkKKwlmcmVlKGRhdGEpOworICAgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9mcmVlbGlzdC5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2ZyZWVsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczYTY5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC9mcmVlbGlzdC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBmcmVlbGlzdC5jCisgKgorICogRnJlZXMgYSBzeXNsaW51eF9tb3ZlbGlzdAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorCit2b2lkIHN5c2xpbnV4X2ZyZWVfbW92ZWxpc3Qoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICpsaXN0KQoreworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqbTsKKworICAgIHdoaWxlIChsaXN0KSB7CisJbSA9IGxpc3Q7CisJbGlzdCA9IGxpc3QtPm5leHQ7CisJZnJlZShtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvaWRsZS5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2lkbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2U4MDM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L2lkbGUuYwpAQCAtMCwwICsxLDQ4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogaWRsZS5jCisgKgorICogV2hhdCB0byBkbyBpbiBhIGJ1c3kgbG9vcC4uLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9wbWFwaS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2lkbGUuaD4KKwordm9pZCBzeXNsaW51eF9yZXNldF9pZGxlKHZvaWQpCit7CisgICAgcmVzZXRfaWRsZSgpOworfQorCit2b2lkIHN5c2xpbnV4X2lkbGUodm9pZCkKK3sKKyAgICBfX2lkbGUoKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9pbml0cmFtZnMuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9pbml0cmFtZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjBlMTYyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L2luaXRyYW1mcy5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpbml0cmFtZnMuYworICoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBpbml0cmFtZnMgbWFuaXB1bGF0aW9uCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2xpbnV4Lmg+CisKK3N0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mc19pbml0KHZvaWQpCit7CisgICAgc3RydWN0IGluaXRyYW1mcyAqaXI7CisKKyAgICBpciA9IGNhbGxvYyhzaXplb2YoKmlyKSwgMSk7CisgICAgaWYgKCFpcikKKwlyZXR1cm4gTlVMTDsKKworICAgIGlyLT5wcmV2ID0gaXItPm5leHQgPSBpcjsKKyAgICByZXR1cm4gaXI7Cit9CisKK2ludCBpbml0cmFtZnNfYWRkX2RhdGEoc3RydWN0IGluaXRyYW1mcyAqaWhlYWQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgICBzaXplX3QgZGF0YV9sZW4sIHNpemVfdCBsZW4sIHNpemVfdCBhbGlnbikKK3sKKyAgICBzdHJ1Y3QgaW5pdHJhbWZzICppbjsKKworICAgIGlmICghbGVuKQorCXJldHVybiAwOwkJLyogTm90aGluZyB0byBhZGQuLi4gKi8KKworICAgIC8qIEFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgMiwgYW5kIDw9IElOSVRSQU1GU19NQVhfQUxJR04gKi8KKyAgICBpZiAoIWFsaWduIHx8IChhbGlnbiAmIChhbGlnbiAtIDEpKSB8fCBhbGlnbiA+IElOSVRSQU1GU19NQVhfQUxJR04pCisJcmV0dXJuIC0xOworCisgICAgaW4gPSBtYWxsb2Moc2l6ZW9mKCppbikpOworICAgIGlmICghaW4pCisJcmV0dXJuIC0xOworCisgICAgaW4tPmxlbiA9IGxlbjsKKyAgICBpbi0+ZGF0YSA9IGRhdGE7CisgICAgaW4tPmRhdGFfbGVuID0gZGF0YV9sZW47CisgICAgaW4tPmFsaWduID0gYWxpZ247CisKKyAgICBpbi0+bmV4dCA9IGloZWFkOworICAgIGluLT5wcmV2ID0gaWhlYWQtPnByZXY7CisgICAgaWhlYWQtPnByZXYtPm5leHQgPSBpbjsKKyAgICBpaGVhZC0+cHJldiA9IGluOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvaW5pdHJhbWZzX2FyY2hpdmUuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9pbml0cmFtZnNfYXJjaGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NWI3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvaW5pdHJhbWZzX2FyY2hpdmUuYwpAQCAtMCwwICsxLDQ3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogaW5pdHJhbWZzX2FyY2hpdmUuYworICoKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gbG9hZCBhbiBpbml0cmFtZnMgYXJjaGl2ZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbG9hZGZpbGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9saW51eC5oPgorCitpbnQgaW5pdHJhbWZzX2xvYWRfYXJjaGl2ZShzdHJ1Y3QgaW5pdHJhbWZzICppaGVhZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgdm9pZCAqZGF0YTsKKyAgICBzaXplX3QgbGVuOworCisgICAgaWYgKGxvYWRmaWxlKGZpbGVuYW1lLCAmZGF0YSwgJmxlbikpCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGluaXRyYW1mc19hZGRfZGF0YShpaGVhZCwgZGF0YSwgbGVuLCBsZW4sIDQpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L2luaXRyYW1mc19maWxlLmMgYi9jb20zMi9saWIvc3lzbGludXgvaW5pdHJhbWZzX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWI1NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L2luaXRyYW1mc19maWxlLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpbml0cmFtZnNfZmlsZS5jCisgKgorICogVXRpbGl0eSBmdW5jdGlvbnMgdG8gYWRkIGFyYml0cmFyeSBmaWxlcyBpbmNsdWRpbmcgY3BpbyBoZWFkZXIKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2xpbnV4Lmg+CisKKyNkZWZpbmUgQ1BJT19NQUdJQyAiMDcwNzAxIgorc3RydWN0IGNwaW9faGVhZGVyIHsKKyAgICBjaGFyIGNfbWFnaWNbNl07CQkvKiAwNzA3MDEgKi8KKyAgICBjaGFyIGNfaW5vWzhdOwkJLyogSW5vZGUgbnVtYmVyICovCisgICAgY2hhciBjX21vZGVbOF07CQkvKiBGaWxlIG1vZGUgYW5kIHBlcm1pc3Npb25zICovCisgICAgY2hhciBjX3VpZFs4XTsJCS8qIHVpZCAqLworICAgIGNoYXIgY19naWRbOF07CQkvKiBnaWQgKi8KKyAgICBjaGFyIGNfbmxpbmtbOF07CQkvKiBOdW1iZXIgb2YgbGlua3MgKi8KKyAgICBjaGFyIGNfbXRpbWVbOF07CQkvKiBNb2RpZmljYXRpb24gdGltZSAqLworICAgIGNoYXIgY19maWxlc2l6ZVs4XTsJCS8qIFNpemUgb2YgZGF0YSBmaWVsZCAqLworICAgIGNoYXIgY19tYWpbOF07CQkvKiBGaWxlIGRldmljZSBtYWpvciBudW1iZXIgKi8KKyAgICBjaGFyIGNfbWluWzhdOwkJLyogRmlsZSBkZXZpY2UgbWlub3IgbnVtYmVyICovCisgICAgY2hhciBjX3JtYWpbOF07CQkvKiBEZXZpY2Ugbm9kZSByZWZlcmVuY2UgbWFqb3IgbnVtYmVyICovCisgICAgY2hhciBjX3JtaW5bOF07CQkvKiBEZXZpY2Ugbm9kZSByZWZlcmVuY2UgbWlub3IgbnVtYmVyICovCisgICAgY2hhciBjX25hbWVzaXplWzhdOwkJLyogTGVuZ3RoIG9mIGZpbGVuYW1lIGluY2x1ZGluZyBmaW5hbCBcMCAqLworICAgIGNoYXIgY19jaGtzdW1bOF07CQkvKiBDaGVja3N1bSBpZiBjX21hZ2ljIGVuZHMgaW4gMiAqLworfTsKKworc3RhdGljIHVpbnQzMl90IG5leHRfaW5vID0gMTsKKworLyogQ3JlYXRlIGNwaW8gaGVhZGVycyBmb3IgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGxlYWRpbmcgdXAgdG8gYSBmaWxlLgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzOyBkb2Vzbid0IHRvdWNoIHRoZSBidWZmZXIgaWYgdG9vIHNtYWxsLiAqLworc3RhdGljIHNpemVfdCBpbml0cmFtZnNfbWtkaXJzKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsCisJCQkgICAgICAgc2l6ZV90IGJ1ZmxlbikKK3sKKyAgICBjb25zdCBjaGFyICpwID0gZmlsZW5hbWU7CisgICAgY2hhciAqYnAgPSBidWZmZXI7CisgICAgaW50IGxlbjsKKyAgICBzaXplX3QgYnl0ZXMgPSAwLCBoZHJfc3o7CisgICAgaW50IHBhZDsKKworICAgIHdoaWxlICgocCA9IHN0cmNocihwLCAnLycpKSkgeworCWlmIChwICE9IGZpbGVuYW1lICYmIHBbLTFdICE9ICcvJykgeworCSAgICBsZW4gPSBwIC0gZmlsZW5hbWU7CisJICAgIGJ5dGVzICs9ICgoc2l6ZW9mKHN0cnVjdCBjcGlvX2hlYWRlcikgKyBsZW4gKyAxKSArIDMpICYgfjM7CisJfQorCXArKzsKKyAgICB9CisKKyAgICBpZiAoYnVmbGVuID49IGJ5dGVzKSB7CisJcCA9IGZpbGVuYW1lOworCXdoaWxlICgocCA9IHN0cmNocihwLCAnLycpKSkgeworCSAgICBpZiAocCAhPSBmaWxlbmFtZSAmJiBwWy0xXSAhPSAnLycpIHsKKwkJbGVuID0gcCAtIGZpbGVuYW1lOworCQloZHJfc3ogPSAoKHNpemVvZihzdHJ1Y3QgY3Bpb19oZWFkZXIpICsgbGVuICsgMSkgKyAzKSAmIH4zOworCQlicCArPSBzcHJpbnRmKGJwLCAiMDcwNzAxJTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4IgorCQkJICAgICAgIiUwOHglMDh4JTA4eCUwOHgiLCBuZXh0X2lubysrLCBTX0lGRElSIHwgMDc1NSwKKwkJCSAgICAgIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDEsIGxlbiArIDEsIDApOworCQltZW1jcHkoYnAsIGZpbGVuYW1lLCBsZW4pOworCQlicCArPSBsZW47CisJCXBhZCA9IGhkcl9zeiAtIChzaXplb2Yoc3RydWN0IGNwaW9faGVhZGVyKSArIGxlbik7CisJCW1lbXNldChicCwgMCwgcGFkKTsKKwkJYnAgKz0gcGFkOworCSAgICB9CisJICAgIHArKzsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzOworfQorCisvKgorICogQ3JlYXRlIGEgZmlsZSBoZWFkZXIgKHdpdGggb3B0aW9uYWwgcGFyZW50IGRpcmVjdG9yeSBlbnRyaWVzKQorICogYW5kIGFkZCBpdCB0byBhbiBpbml0cmFtZnMgY2hhaW4KKyAqLworaW50IGluaXRyYW1mc19ta25vZChzdHJ1Y3QgaW5pdHJhbWZzICppaGVhZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCSAgICBpbnQgZG9fbWtkaXIsCisJCSAgICB1aW50MTZfdCBtb2RlLCBzaXplX3QgbGVuLCB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IpCit7CisgICAgc2l6ZV90IGJ5dGVzLCBoZHJfc3o7CisgICAgaW50IG5hbWVsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworICAgIGludCBwYWQ7CisgICAgY2hhciAqYnVmZmVyLCAqYnA7CisKKyAgICBpZiAoZG9fbWtkaXIpCisJYnl0ZXMgPSBpbml0cmFtZnNfbWtkaXJzKGZpbGVuYW1lLCBOVUxMLCAwKTsKKyAgICBlbHNlCisJYnl0ZXMgPSAwOworCisgICAgaGRyX3N6ID0gKChzaXplb2Yoc3RydWN0IGNwaW9faGVhZGVyKSArIG5hbWVsZW4gKyAxKSArIDMpICYgfjM7CisgICAgYnl0ZXMgKz0gaGRyX3N6OworCisgICAgYnAgPSBidWZmZXIgPSBtYWxsb2MoYnl0ZXMpOworICAgIGlmICghYnVmZmVyKQorCXJldHVybiAtMTsKKworICAgIGlmIChkb19ta2RpcikKKwlicCArPSBpbml0cmFtZnNfbWtkaXJzKGZpbGVuYW1lLCBicCwgYnl0ZXMpOworCisgICAgYnAgKz0gc3ByaW50ZihicCwgIjA3MDcwMSUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCIKKwkJICAiJTA4eCUwOHglMDh4JTA4eCIsIG5leHRfaW5vKyssIG1vZGUsCisJCSAgMCwgMCwgMSwgMCwgbGVuLCAwLCAxLCBtYWpvciwgbWlub3IsIG5hbWVsZW4gKyAxLCAwKTsKKyAgICBtZW1jcHkoYnAsIGZpbGVuYW1lLCBuYW1lbGVuKTsKKyAgICBicCArPSBuYW1lbGVuOworICAgIHBhZCA9IGhkcl9zeiAtIChzaXplb2Yoc3RydWN0IGNwaW9faGVhZGVyKSArIG5hbWVsZW4pOworICAgIG1lbXNldChicCwgMCwgcGFkKTsKKworICAgIGlmIChpbml0cmFtZnNfYWRkX2RhdGEoaWhlYWQsIGJ1ZmZlciwgYnl0ZXMsIGJ5dGVzLCA0KSkgeworCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgYSBmaWxlIGdpdmVuIGRhdGEgaW4gbWVtb3J5IHRvIGFuIGluaXRyYW1mcyBjaGFpbi4gIFRoaXMKKyAqIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBub25maWxlcyBsaWtlIHN5bWxpbmtzIGJ5IHNwZWNpZnlpbmcgYW4KKyAqIGFwcHJvcHJpYXRlIG1vZGUuCisgKi8KK2ludCBpbml0cmFtZnNfYWRkX2ZpbGUoc3RydWN0IGluaXRyYW1mcyAqaWhlYWQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgICBzaXplX3QgZGF0YV9sZW4sIHNpemVfdCBsZW4sCisJCSAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX21rZGlyLCB1aW50MzJfdCBtb2RlKQoreworICAgIGlmIChpbml0cmFtZnNfbWtub2QoaWhlYWQsIGZpbGVuYW1lLCBkb19ta2RpciwKKwkJCShtb2RlICYgU19JRk1UKSA/IG1vZGUgOiBtb2RlIHwgU19JRlJFRywgbGVuLCAwLCAxKSkKKwlyZXR1cm4gLTE7CisKKyAgICByZXR1cm4gaW5pdHJhbWZzX2FkZF9kYXRhKGloZWFkLCBkYXRhLCBkYXRhX2xlbiwgbGVuLCA0KTsKK30KKworaW50IGluaXRyYW1mc19hZGRfdHJhaWxlcihzdHJ1Y3QgaW5pdHJhbWZzICppaGVhZCkKK3sKKyAgICByZXR1cm4gaW5pdHJhbWZzX21rbm9kKGloZWFkLCAiVFJBSUxFUiEhISIsIDAsIDAsIDAsIDAsIDApOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L2luaXRyYW1mc19sb2FkZmlsZS5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2luaXRyYW1mc19sb2FkZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzhhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvaW5pdHJhbWZzX2xvYWRmaWxlLmMKQEAgLTAsMCArMSw0OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGluaXRyYW1mc19sb2FkZmlsZS5jCisgKgorICogTG9hZCBhIHNpbmdsZSBmaWxlIGludG8gYW4gaW5pdHJhbWZzIGltYWdlLgorICovCisKKyNpbmNsdWRlIDxzeXNsaW51eC9saW51eC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisKK2ludCBpbml0cmFtZnNfbG9hZF9maWxlKHN0cnVjdCBpbml0cmFtZnMgKmloZWFkLCBjb25zdCBjaGFyICpzcmNfZmlsZW5hbWUsCisJCQljb25zdCBjaGFyICpkc3RfZmlsZW5hbWUsIGludCBkb19ta2RpciwgdWludDMyX3QgbW9kZSkKK3sKKyAgICB2b2lkICpkYXRhOworICAgIHNpemVfdCBsZW47CisKKyAgICBpZiAobG9hZGZpbGUoc3JjX2ZpbGVuYW1lLCAmZGF0YSwgJmxlbikpCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGluaXRyYW1mc19hZGRfZmlsZShpaGVhZCwgZGF0YSwgbGVuLCBsZW4sIGRzdF9maWxlbmFtZSwKKwkJCSAgICAgIGRvX21rZGlyLCBtb2RlKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9pcGFwcGVuZC5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2lwYXBwZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlYjFiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC9pcGFwcGVuZC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbGludXgvaXBhcHBlbmQuYworICoKKyAqIEdldCBpcGFwcGVuZCBzdHJpbmdzCisgKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L3N5c2FwcGVuZC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3BtYXBpLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisKK3N0cnVjdCBzeXNsaW51eF9pcGFwcGVuZF9zdHJpbmdzIF9fc3lzbGludXhfaXBhcHBlbmRfc3RyaW5nczsKKwordm9pZCBfX2NvbnN0cnVjdG9yIF9fc3lzbGludXhfZ2V0X2lwYXBwZW5kX3N0cmluZ3Modm9pZCkKK3sKKyAgICBfX3N5c2xpbnV4X2lwYXBwZW5kX3N0cmluZ3MuY291bnQgPSBTWVNBUFBFTkRfTUFYLAorICAgIF9fc3lzbGludXhfaXBhcHBlbmRfc3RyaW5ncy5wdHIgICA9IHN5c2FwcGVuZF9zdHJpbmdzOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L2tleWJvYXJkLmMgYi9jb20zMi9saWIvc3lzbGludXgva2V5Ym9hcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2JkMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L2tleWJvYXJkLmMKQEAgLTAsMCArMSwzOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L2tleWJvYXJkLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorCitzdHJ1Y3Qgc3lzbGludXhfa2V5Ym9hcmRfbWFwIF9fc3lzbGludXhfa2V5Ym9hcmRfbWFwOworCit2b2lkIF9fY29uc3RydWN0b3IgX19zeXNsaW51eF9nZXRfa2V5Ym9hcmRfbWFwKHZvaWQpCit7CisgICAgX19zeXNsaW51eF9rZXlib2FyZF9tYXAudmVyc2lvbiA9IDE7CisgICAgX19zeXNsaW51eF9rZXlib2FyZF9tYXAubGVuZ3RoID0gc2l6ZW9mKEtiZE1hcCk7CisgICAgX19zeXNsaW51eF9rZXlib2FyZF9tYXAubWFwID0gKHZvaWQgKilLYmRNYXA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvbG9hZF9saW51eC5jIGIvY29tMzIvbGliL3N5c2xpbnV4L2xvYWRfbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmFlMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L2xvYWRfbGludXguYwpAQCAtMCwwICsxLDUxOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbG9hZF9saW51eC5jCisgKgorICogTG9hZCBhIExpbnV4IGtlcm5lbCAoSW1hZ2UvekltYWdlL2J6SW1hZ2UpLgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3VmZml4X251bWJlci5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKworI2luY2x1ZGUgPHN5c2xpbnV4L2FsaWduLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbGludXguaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9ib290cm0uaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvdmlkZW8uaD4KKworI2RlZmluZSBCT09UX01BR0lDIDB4QUE1NQorI2RlZmluZSBMSU5VWF9NQUdJQyAoJ0gnICsgKCdkJyA8PCA4KSArICgncicgPDwgMTYpICsgKCdTJyA8PCAyNCkpCisjZGVmaW5lIE9MRF9DTURMSU5FX01BR0lDIDB4QTMzRgorCisvKiBsb2FkZmxhZ3MgKi8KKyNkZWZpbmUgTE9BRF9ISUdICTB4MDEKKyNkZWZpbmUgQ0FOX1VTRV9IRUFQCTB4ODAKKworLyogCisgKiBGaW5kIHRoZSBsYXN0IGluc3RhbmNlIG9mIGEgcGFydGljdWxhciBjb21tYW5kIGxpbmUgYXJndW1lbnQKKyAqICh3aGljaCBzaG91bGQgaW5jbHVkZSB0aGUgZmluYWwgPTsgZG8gbm90IHVzZSBmb3IgYm9vbGVhbiBhcmd1bWVudHMpCisgKiBOb3RlOiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyB0eXBpY2FsbHkgbm90IG51bGwtdGVybWluYXRlZC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfYXJndW1lbnQoY29uc3QgY2hhciAqY21kbGluZSwgY29uc3QgY2hhciAqYXJndW1lbnQpCit7CisgICAgY29uc3QgY2hhciAqZm91bmQgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKnAgPSBjbWRsaW5lOworICAgIGJvb2wgd2FzX3NwYWNlID0gdHJ1ZTsKKyAgICBzaXplX3QgbGEgPSBzdHJsZW4oYXJndW1lbnQpOworCisgICAgd2hpbGUgKCpwKSB7CisJaWYgKGlzc3BhY2UoKnApKSB7CisJICAgIHdhc19zcGFjZSA9IHRydWU7CisJfSBlbHNlIGlmICh3YXNfc3BhY2UpIHsKKwkgICAgaWYgKCFtZW1jbXAocCwgYXJndW1lbnQsIGxhKSkKKwkJZm91bmQgPSBwICsgbGE7CisJICAgIHdhc19zcGFjZSA9IGZhbHNlOworCX0KKwlwKys7CisgICAgfQorCisgICAgcmV0dXJuIGZvdW5kOworfQorCisvKiBUcnVuY2F0ZSB0byAzMiBiaXRzLCB3aXRoIHNhdHVyYXRlICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHNhdHVyYXRlMzIodW5zaWduZWQgbG9uZyBsb25nIHYpCit7CisgICAgcmV0dXJuICh2ID4gMHhmZmZmZmZmZikgPyAweGZmZmZmZmZmIDogKHVpbnQzMl90KSB2OworfQorCisvKiBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIG1hcHBpbmdzIGZvciB0aGUgaW5pdHJhbWZzICovCitzdGF0aWMgaW50IG1hcF9pbml0cmFtZnMoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICoqZnJhZ2xpc3QsCisJCQkgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqKm1tYXAsCisJCQkgc3RydWN0IGluaXRyYW1mcyAqaW5pdHJhbWZzLCBhZGRyX3QgYWRkcikKK3sKKyAgICBzdHJ1Y3QgaW5pdHJhbWZzICppcDsKKyAgICBhZGRyX3QgbmV4dF9hZGRyLCBsZW4sIHBhZDsKKworICAgIGZvciAoaXAgPSBpbml0cmFtZnMtPm5leHQ7IGlwLT5sZW47IGlwID0gaXAtPm5leHQpIHsKKwlsZW4gPSBpcC0+bGVuOworCW5leHRfYWRkciA9IGFkZHIgKyBsZW47CisKKwkvKiBJZiB0aGlzIGlzbid0IHRoZSBsYXN0IGVudHJ5LCBleHRlbmQgdGhlIHplcm8tcGFkIHJlZ2lvbgorCSAgIHRvIGVuZm9yY2UgdGhlIGFsaWdubWVudCBvZiB0aGUgbmV4dCBjaHVuay4gKi8KKwlpZiAoaXAtPm5leHQtPmxlbikgeworCSAgICBwYWQgPSAtbmV4dF9hZGRyICYgKGlwLT5uZXh0LT5hbGlnbiAtIDEpOworCSAgICBsZW4gKz0gcGFkOworCSAgICBuZXh0X2FkZHIgKz0gcGFkOworCX0KKworCWlmIChpcC0+ZGF0YV9sZW4pIHsKKwkgICAgaWYgKHN5c2xpbnV4X2FkZF9tb3ZlbGlzdChmcmFnbGlzdCwgYWRkciwgKGFkZHJfdCkgaXAtPmRhdGEsIGxlbikpCisJCXJldHVybiAtMTsKKwl9CisJaWYgKGxlbiA+IGlwLT5kYXRhX2xlbikgeworCSAgICBpZiAoc3lzbGludXhfYWRkX21lbW1hcChtbWFwLCBhZGRyICsgaXAtPmRhdGFfbGVuLAorCQkJCSAgICBsZW4gLSBpcC0+ZGF0YV9sZW4sIFNNVF9aRVJPKSkKKwkJcmV0dXJuIC0xOworCX0KKwlhZGRyID0gbmV4dF9hZGRyOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc2l6ZV90IGNhbGNfY21kbGluZV9vZmZzZXQoY29uc3Qgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbW1hcCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBsaW51eF9oZWFkZXIgKmhkciwKKwkJCQkgIHNpemVfdCBjbWRsaW5lX3NpemUsIGFkZHJfdCBiYXNlLAorCQkJCSAgYWRkcl90IHN0YXJ0KQoreworICAgIHNpemVfdCBtYXhfb2Zmc2V0OworCisgICAgaWYgKGhkci0+dmVyc2lvbiA+PSAweDAyMDIgJiYgKGhkci0+bG9hZGZsYWdzICYgTE9BRF9ISUdIKSkKKwltYXhfb2Zmc2V0ID0gMHgxMDAwMDsKKyAgICBlbHNlCisJbWF4X29mZnNldCA9IDB4ZmZmMCAtIGNtZGxpbmVfc2l6ZTsKKworICAgIGlmICghc3lzbGludXhfbWVtbWFwX2hpZ2hlc3QobW1hcCwgU01UX0ZSRUUsICZzdGFydCwKKwkJCQkgY21kbGluZV9zaXplLCAweGEwMDAwLCAxNikgfHwKKwkhc3lzbGludXhfbWVtbWFwX2hpZ2hlc3QobW1hcCwgU01UX1RFUk1JTkFMLCAmc3RhcnQsCisJCQkJIGNtZGxpbmVfc2l6ZSwgMHhhMDAwMCwgMTYpKSB7CisJCisKKwlyZXR1cm4gbWluKHN0YXJ0IC0gYmFzZSwgbWF4X29mZnNldCkgJiB+MTU7CisgICAgfQorCisgICAgZHByaW50ZigiVW5hYmxlIHRvIGZpbmQgbG93bWVtIGZvciBjbWRsaW5lXG4iKTsKKyAgICByZXR1cm4gKDB4OWZmMCAtIGNtZGxpbmVfc2l6ZSkgJiB+MTU7IC8qIExlZ2FjeSB2YWx1ZTogcHVyZSBob3BlLi4uICovCit9CisKK2ludCBiaW9zX2Jvb3RfbGludXgodm9pZCAqa2VybmVsX2J1Ziwgc2l6ZV90IGtlcm5lbF9zaXplLAorCQkgICAgc3RydWN0IGluaXRyYW1mcyAqaW5pdHJhbWZzLAorCQkgICAgc3RydWN0IHNldHVwX2RhdGEgKnNldHVwX2RhdGEsCisJCSAgICBjaGFyICpjbWRsaW5lKQoreworICAgIHN0cnVjdCBsaW51eF9oZWFkZXIgaGRyLCAqd2hkcjsKKyAgICBzaXplX3QgcmVhbF9tb2RlX3NpemUsIHByb3RfbW9kZV9zaXplLCBiYXNlOworICAgIGFkZHJfdCByZWFsX21vZGVfYmFzZSwgcHJvdF9tb2RlX2Jhc2UsIHByb3RfbW9kZV9tYXg7CisgICAgYWRkcl90IGlyZl9zaXplOworICAgIHNpemVfdCBjbWRsaW5lX3NpemUsIGNtZGxpbmVfb2Zmc2V0OworICAgIHN0cnVjdCBzZXR1cF9kYXRhICpzZHA7CisgICAgc3RydWN0IHN5c2xpbnV4X3JtX3JlZ3MgcmVnczsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKmZyYWdsaXN0ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptbWFwID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICphbWFwID0gTlVMTDsKKyAgICB1aW50MzJfdCBtZW1saW1pdCA9IDA7CisgICAgdWludDE2X3QgdmlkZW9fbW9kZSA9IDA7CisgICAgY29uc3QgY2hhciAqYXJnOworCisgICAgY21kbGluZV9zaXplID0gc3RybGVuKGNtZGxpbmUpICsgMTsKKworICAgIGVycm5vID0gRUlOVkFMOworICAgIGlmIChrZXJuZWxfc2l6ZSA8IDIgKiA1MTIpIHsKKwlkcHJpbnRmKCJLZXJuZWwgc2l6ZSB0b28gc21hbGxcbiIpOworCWdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBMb29rIGZvciBzcGVjaWZpYyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHdlIGNhcmUgYWJvdXQgKi8KKyAgICBpZiAoKGFyZyA9IGZpbmRfYXJndW1lbnQoY21kbGluZSwgIm1lbT0iKSkpCisJbWVtbGltaXQgPSBzYXR1cmF0ZTMyKHN1ZmZpeF9udW1iZXIoYXJnKSk7CisKKyAgICBpZiAoKGFyZyA9IGZpbmRfYXJndW1lbnQoY21kbGluZSwgInZnYT0iKSkpIHsKKwlzd2l0Y2ggKGFyZ1swXSB8IDB4MjApIHsKKwljYXNlICdhJzoJCS8qICJhc2siICovCisJICAgIHZpZGVvX21vZGUgPSAweGZmZmQ7CisJICAgIGJyZWFrOworCWNhc2UgJ2UnOgkJLyogImV4dCIgKi8KKwkgICAgdmlkZW9fbW9kZSA9IDB4ZmZmZTsKKwkgICAgYnJlYWs7CisJY2FzZSAnbic6CQkvKiAibm9ybWFsIiAqLworCSAgICB2aWRlb19tb2RlID0gMHhmZmZmOworCSAgICBicmVhazsKKwljYXNlICdjJzoJCS8qICJjdXJyZW50IiAqLworCSAgICB2aWRlb19tb2RlID0gMHgwZjA0OworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICB2aWRlb19tb2RlID0gc3RydG91bChhcmcsIE5VTEwsIDApOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgLyogQ29weSB0aGUgaGVhZGVyIGludG8gcHJpdmF0ZSBzdG9yYWdlICovCisgICAgLyogVXNlIHdoZHIgdG8gbW9kaWZ5IHRoZSBhY3R1YWwga2VybmVsIGhlYWRlciAqLworICAgIG1lbWNweSgmaGRyLCBrZXJuZWxfYnVmLCBzaXplb2YgaGRyKTsKKyAgICB3aGRyID0gKHN0cnVjdCBsaW51eF9oZWFkZXIgKilrZXJuZWxfYnVmOworCisgICAgaWYgKGhkci5ib290X2ZsYWcgIT0gQk9PVF9NQUdJQykgeworCWRwcmludGYoIkludmFsaWQgYm9vdCBtYWdpY1xuIik7CisJZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChoZHIuaGVhZGVyICE9IExJTlVYX01BR0lDKSB7CisJaGRyLnZlcnNpb24gPSAweDAxMDA7CS8qIFZlcnkgb2xkIGtlcm5lbCAqLworCWhkci5sb2FkZmxhZ3MgPSAwOworICAgIH0KKworICAgIHdoZHItPnZpZF9tb2RlID0gdmlkZW9fbW9kZTsKKworICAgIGlmICghaGRyLnNldHVwX3NlY3RzKQorCWhkci5zZXR1cF9zZWN0cyA9IDQ7CisKKyAgICBpZiAoaGRyLnZlcnNpb24gPCAweDAyMDMgfHwgIWhkci5pbml0cmRfYWRkcl9tYXgpCisJaGRyLmluaXRyZF9hZGRyX21heCA9IDB4MzdmZmZmZmY7CisKKyAgICBpZiAoIW1lbWxpbWl0ICYmIG1lbWxpbWl0IC0gMSA+IGhkci5pbml0cmRfYWRkcl9tYXgpCisJbWVtbGltaXQgPSBoZHIuaW5pdHJkX2FkZHJfbWF4ICsgMTsJLyogWmVybyBmb3Igbm8gbGltaXQgKi8KKworICAgIGlmIChoZHIudmVyc2lvbiA8IDB4MDIwNSB8fCAhKGhkci5sb2FkZmxhZ3MgJiBMT0FEX0hJR0gpKQorCWhkci5yZWxvY2F0YWJsZV9rZXJuZWwgPSAwOworCisgICAgaWYgKGhkci52ZXJzaW9uIDwgMHgwMjA2KQorCWhkci5jbWRsaW5lX21heF9sZW4gPSAyNTY7CisKKyAgICBpZiAoY21kbGluZV9zaXplID4gaGRyLmNtZGxpbmVfbWF4X2xlbikgeworCWNtZGxpbmVfc2l6ZSA9IGhkci5jbWRsaW5lX21heF9sZW47CisJY21kbGluZVtjbWRsaW5lX3NpemUgLSAxXSA9ICdcMCc7CisgICAgfQorCisgICAgcmVhbF9tb2RlX3NpemUgPSAoaGRyLnNldHVwX3NlY3RzICsgMSkgPDwgOTsKKyAgICByZWFsX21vZGVfYmFzZSA9IChoZHIubG9hZGZsYWdzICYgTE9BRF9ISUdIKSA/IDB4MTAwMDAgOiAweDkwMDAwOworICAgIHByb3RfbW9kZV9iYXNlID0gKGhkci5sb2FkZmxhZ3MgJiBMT0FEX0hJR0gpID8gMHgxMDAwMDAgOiAweDEwMDAwOworICAgIHByb3RfbW9kZV9tYXggID0gKGhkci5sb2FkZmxhZ3MgJiBMT0FEX0hJR0gpID8gKGFkZHJfdCktMSA6IDB4OGZmZmY7CisgICAgcHJvdF9tb2RlX3NpemUgPSBrZXJuZWxfc2l6ZSAtIHJlYWxfbW9kZV9zaXplOworCisgICAgLyogR2V0IHRoZSBtZW1vcnkgbWFwICovCisgICAgbW1hcCA9IHN5c2xpbnV4X21lbW9yeV9tYXAoKTsJLyogTWVtb3J5IG1hcCBmb3Igc2h1ZmZsZV9ib290ICovCisgICAgYW1hcCA9IHN5c2xpbnV4X2R1cF9tZW1tYXAobW1hcCk7CS8qIEtlZXAgdHJhY2sgb2YgYXZhaWxhYmxlIG1lbW9yeSAqLworICAgIGlmICghbW1hcCB8fCAhYW1hcCkgeworCWVycm5vID0gRU5PTUVNOworCWdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBjbWRsaW5lX29mZnNldCA9IGNhbGNfY21kbGluZV9vZmZzZXQobW1hcCwgJmhkciwgY21kbGluZV9zaXplLAorCQkJCQkgcmVhbF9tb2RlX2Jhc2UsCisJCQkJCSByZWFsX21vZGVfYmFzZSArIHJlYWxfbW9kZV9zaXplKTsKKyAgICBkcHJpbnRmKCJjbWRsaW5lX29mZnNldCBhdCAweCV4XG4iLCByZWFsX21vZGVfYmFzZSArIGNtZGxpbmVfb2Zmc2V0KTsKKworICAgIGlmIChoZHIudmVyc2lvbiA8IDB4MDIwYSkgeworCS8qCisJICogVGhlIDMqIGhlcmUgaXMgYSB0b3RhbCBmdWRnZSBmYWN0b3IuLi4gaXQncyBzdXBwb3NlZCB0bworCSAqIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgdGhlIGtlcm5lbCBuZWVkcyB0byBiZQorCSAqIGRlY29tcHJlc3NlZCwgYW5kIHRoZW4gZm9sbG93ZWQgYnkgdGhlIEJTUyBhbmQgQlJLIHJlZ2lvbnMuCisJICogVGhpcyBkb2Vzbid0LCBob3dldmVyLCBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0IHRoZSBrZXJuZWwKKwkgKiBpcyBkZWNvbXByZXNzZWQgaW50byBhIHdob2xlIG90aGVyIHBsYWNlLCBlaXRoZXIuCisJICovCisJaGRyLmluaXRfc2l6ZSA9IDMgKiBwcm90X21vZGVfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIShoZHIubG9hZGZsYWdzICYgTE9BRF9ISUdIKSAmJiBwcm90X21vZGVfc2l6ZSA+IDUxMiAqIDEwMjQpIHsKKwlkcHJpbnRmKCJLZXJuZWwgY2Fubm90IGJlIGxvYWRlZCBsb3dcbiIpOworCWdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGluaXRyYW1mcywgaWYgdGhlcmUgaXMgb25lICovCisgICAgaXJmX3NpemUgPSBpbml0cmFtZnNfc2l6ZShpbml0cmFtZnMpOworCisgICAgaWYgKGlyZl9zaXplICYmIGhkci52ZXJzaW9uIDwgMHgwMjAwKSB7CisJZHByaW50ZigiSW5pdHJkIHNwZWNpZmllZCBidXQgbm90IHN1cHBvcnRlZCBieSBrZXJuZWxcbiIpOworCWdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoaGRyLnZlcnNpb24gPj0gMHgwMjAwKSB7CisJd2hkci0+dHlwZV9vZl9sb2FkZXIgPSAweDMwOwkvKiBTWVNMSU5VWCB1bmtub3duIG1vZHVsZSAqLworCWlmIChoZHIudmVyc2lvbiA+PSAweDAyMDEpIHsKKwkgICAgd2hkci0+aGVhcF9lbmRfcHRyID0gY21kbGluZV9vZmZzZXQgLSAweDAyMDA7CisJICAgIHdoZHItPmxvYWRmbGFncyB8PSBDQU5fVVNFX0hFQVA7CisJfQorICAgIH0KKworICAgIGRwcmludGYoIkluaXRpYWwgbWVtb3J5IG1hcDpcbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbWVtbWFwKG1tYXApOworCisgICAgLyogSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIG1lbW9yeSBsaW1pdCwgbWFyayB0aGF0IGFzIHVuYXZhaWxhYmxlLgorICAgICAgIFF1ZXN0aW9uOiBzaG91bGQgd2UgbWFyayB0aGlzIG9mZi1saW1pdCBpbiB0aGUgbW1hcCBhcyB3ZWxsIChtZWFuaW5nCisgICAgICAgaXQncyB1bmF2YWlsYWJsZSB0byB0aGUgYm9vdCBsb2FkZXIsIHdoaWNoIHByb2JhYmx5IGhhcyBhbHJlYWR5IHRvdWNoZWQKKyAgICAgICBzb21lIG9mIGl0KSwgb3IganVzdCBpbiB0aGUgYW1hcD8gKi8KKyAgICBpZiAobWVtbGltaXQpCisJaWYgKHN5c2xpbnV4X2FkZF9tZW1tYXAoJmFtYXAsIG1lbWxpbWl0LCAtbWVtbGltaXQsIFNNVF9SRVNFUlZFRCkpIHsKKwkgICAgZXJybm8gPSBFTk9NRU07CisJICAgIGdvdG8gYmFpbDsKKwl9CisKKyAgICAvKiBQbGFjZSB0aGUga2VybmVsIGluIG1lbW9yeSAqLworCisgICAgLyoKKyAgICAgKiBGaXJzdCwgZmluZCBhIHN1aXRhYmxlIHBsYWNlIGZvciB0aGUgcHJvdGVjdGVkLW1vZGUgY29kZS4gIElmCisgICAgICogdGhlIGtlcm5lbCBpbWFnZSBpcyBub3QgcmVsb2NhdGFibGUsIGp1c3Qgd29ycnkgaWYgaXQgZml0cyAoaXQKKyAgICAgKiBtaWdodCBub3QgZXZlbiBiZSBhIExpbnV4IGltYWdlLCBhZnRlciBhbGwsIGFuZCBmb3IgIUxPQURfSElHSAorICAgICAqIHdlIGVuZCB1cCBkZWNvbXByZXNzaW5nIGludG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gYW55d2F5KSwgYnV0CisgICAgICogaWYgaXQgaXMsIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGZpdHMuCisgICAgICovCisgICAgYmFzZSA9IHByb3RfbW9kZV9iYXNlOworICAgIGlmIChwcm90X21vZGVfc2l6ZSAmJgorCXN5c2xpbnV4X21lbW1hcF9maW5kKGFtYXAsICZiYXNlLAorCQkJICAgICBoZHIucmVsb2NhdGFibGVfa2VybmVsID8KKwkJCSAgICAgaGRyLmluaXRfc2l6ZSA6IHByb3RfbW9kZV9zaXplLAorCQkJICAgICBoZHIucmVsb2NhdGFibGVfa2VybmVsLCBoZHIua2VybmVsX2FsaWdubWVudCwKKwkJCSAgICAgcHJvdF9tb2RlX2Jhc2UsIHByb3RfbW9kZV9tYXgsCisJCQkgICAgIHByb3RfbW9kZV9iYXNlLCBwcm90X21vZGVfbWF4KSkgeworCWRwcmludGYoIkNvdWxkIG5vdCBmaW5kIGxvY2F0aW9uIGZvciBwcm90ZWN0ZWQtbW9kZSBjb2RlXG4iKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgd2hkci0+Y29kZTMyX3N0YXJ0ICs9IGJhc2UgLSBwcm90X21vZGVfYmFzZTsKKworICAgIC8qIFJlYWwgbW9kZSBjb2RlICovCisgICAgaWYgKHN5c2xpbnV4X21lbW1hcF9maW5kKGFtYXAsICZyZWFsX21vZGVfYmFzZSwKKwkJCSAgICAgY21kbGluZV9vZmZzZXQgKyBjbWRsaW5lX3NpemUsIHRydWUsIDE2LAorCQkJICAgICByZWFsX21vZGVfYmFzZSwgMHg5MDAwMCwgMCwgNjQwKjEwMjQpKSB7CisJZHByaW50ZigiQ291bGQgbm90IGZpbmQgbG9jYXRpb24gZm9yIHJlYWwtbW9kZSBjb2RlXG4iKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKHN5c2xpbnV4X2FkZF9tb3ZlbGlzdCgmZnJhZ2xpc3QsIHJlYWxfbW9kZV9iYXNlLCAoYWRkcl90KSBrZXJuZWxfYnVmLAorCQkJICAgICAgcmVhbF9tb2RlX3NpemUpKQorCWdvdG8gYmFpbDsKKyAgICBpZiAoc3lzbGludXhfYWRkX21lbW1hcAorCSgmYW1hcCwgcmVhbF9tb2RlX2Jhc2UsIGNtZGxpbmVfb2Zmc2V0ICsgY21kbGluZV9zaXplLCBTTVRfQUxMT0MpKSB7CisJZXJybm8gPSBFTk9NRU07CisJZ290byBiYWlsOworICAgIH0KKworICAgIC8qIFplcm8gcmVnaW9uIGJldHdlZW4gcmVhbCBtb2RlIGNvZGUgYW5kIGNtZGxpbmUgKi8KKyAgICBpZiAoc3lzbGludXhfYWRkX21lbW1hcCgmbW1hcCwgcmVhbF9tb2RlX2Jhc2UgKyByZWFsX21vZGVfc2l6ZSwKKwkJCSAgICBjbWRsaW5lX29mZnNldCAtIHJlYWxfbW9kZV9zaXplLCBTTVRfWkVSTykpIHsKKwllcnJubyA9IEVOT01FTTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogQ29tbWFuZCBsaW5lICovCisgICAgaWYgKHN5c2xpbnV4X2FkZF9tb3ZlbGlzdCgmZnJhZ2xpc3QsIHJlYWxfbW9kZV9iYXNlICsgY21kbGluZV9vZmZzZXQsCisJCQkgICAgICAoYWRkcl90KSBjbWRsaW5lLCBjbWRsaW5lX3NpemUpKSB7CisJZXJybm8gPSBFTk9NRU07CisJZ290byBiYWlsOworICAgIH0KKyAgICBpZiAoaGRyLnZlcnNpb24gPj0gMHgwMjAyKSB7CisJd2hkci0+Y21kX2xpbmVfcHRyID0gcmVhbF9tb2RlX2Jhc2UgKyBjbWRsaW5lX29mZnNldDsKKyAgICB9IGVsc2UgeworCXdoZHItPm9sZF9jbWRfbGluZV9tYWdpYyA9IE9MRF9DTURMSU5FX01BR0lDOworCXdoZHItPm9sZF9jbWRfbGluZV9vZmZzZXQgPSBjbWRsaW5lX29mZnNldDsKKwlpZiAoaGRyLnZlcnNpb24gPj0gMHgwMjAwKSB7CisJICAgIC8qIEJlIHBhcmFub2lkIGFuZCByb3VuZCB1cCB0byBhIG11bHRpcGxlIG9mIDE2ICovCisJICAgIHdoZHItPnNldHVwX21vdmVfc2l6ZSA9IChjbWRsaW5lX29mZnNldCArIGNtZGxpbmVfc2l6ZSArIDE1KSAmIH4xNTsKKwl9CisgICAgfQorCisgICAgLyogUHJvdGVjdGVkLW1vZGUgY29kZSAqLworICAgIGlmIChwcm90X21vZGVfc2l6ZSkgeworCWlmIChzeXNsaW51eF9hZGRfbW92ZWxpc3QoJmZyYWdsaXN0LCBwcm90X21vZGVfYmFzZSwKKwkJCQkgIChhZGRyX3QpIGtlcm5lbF9idWYgKyByZWFsX21vZGVfc2l6ZSwKKwkJCQkgIHByb3RfbW9kZV9zaXplKSkgeworCSAgICBlcnJubyA9IEVOT01FTTsKKwkgICAgZ290byBiYWlsOworCX0KKwlpZiAoc3lzbGludXhfYWRkX21lbW1hcCgmYW1hcCwgcHJvdF9tb2RlX2Jhc2UsIHByb3RfbW9kZV9zaXplLAorCQkJCVNNVF9BTExPQykpIHsKKwkgICAgZXJybm8gPSBFTk9NRU07CisJICAgIGdvdG8gYmFpbDsKKwl9CisgICAgfQorCisgICAgLyogRmlndXJlIG91dCB0aGUgc2l6ZSBvZiB0aGUgaW5pdHJhbWZzLCBhbmQgd2hlcmUgdG8gcHV0IGl0LgorICAgICAgIFdlIHNob3VsZCBwdXQgaXQgYXQgdGhlIGhpZ2hlc3QgcG9zc2libGUgYWRkcmVzcyB3aGljaCBpcworICAgICAgIDw9IGhkci5pbml0cmRfYWRkcl9tYXgsIHdoaWNoIGZpdHMgdGhlIGVudGlyZSBpbml0cmFtZnMuICovCisKKyAgICBpZiAoaXJmX3NpemUpIHsKKwlhZGRyX3QgYmVzdF9hZGRyID0gMDsKKwlzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptbDsKKwljb25zdCBhZGRyX3QgYWxpZ25fbWFzayA9IElOSVRSQU1GU19NQVhfQUxJR04gLSAxOworCisJaWYgKGlyZl9zaXplKSB7CisJICAgIGZvciAobWwgPSBhbWFwOyBtbC0+dHlwZSAhPSBTTVRfRU5EOyBtbCA9IG1sLT5uZXh0KSB7CisJCWFkZHJfdCBhZGpfc3RhcnQgPSAobWwtPnN0YXJ0ICsgYWxpZ25fbWFzaykgJiB+YWxpZ25fbWFzazsKKwkJYWRkcl90IGFkal9lbmQgPSBtbC0+bmV4dC0+c3RhcnQgJiB+YWxpZ25fbWFzazsKKwkJaWYgKG1sLT50eXBlID09IFNNVF9GUkVFICYmIGFkal9lbmQgLSBhZGpfc3RhcnQgPj0gaXJmX3NpemUpCisJCSAgICBiZXN0X2FkZHIgPSAoYWRqX2VuZCAtIGlyZl9zaXplKSAmIH5hbGlnbl9tYXNrOworCSAgICB9CisKKwkgICAgaWYgKCFiZXN0X2FkZHIpIHsKKwkJZHByaW50ZigiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgaW5pdHJhbWZzXG4iKTsKKwkJZ290byBiYWlsOworCSAgICB9CisKKwkgICAgd2hkci0+cmFtZGlza19pbWFnZSA9IGJlc3RfYWRkcjsKKwkgICAgd2hkci0+cmFtZGlza19zaXplID0gaXJmX3NpemU7CisKKwkgICAgaWYgKHN5c2xpbnV4X2FkZF9tZW1tYXAoJmFtYXAsIGJlc3RfYWRkciwgaXJmX3NpemUsIFNNVF9BTExPQykpIHsKKwkJZXJybm8gPSBFTk9NRU07CisJCWdvdG8gYmFpbDsKKwkgICAgfQorCisJICAgIGlmIChtYXBfaW5pdHJhbWZzKCZmcmFnbGlzdCwgJm1tYXAsIGluaXRyYW1mcywgYmVzdF9hZGRyKSkgeworCQllcnJubyA9IEVOT01FTTsKKwkJZ290byBiYWlsOworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmIChzZXR1cF9kYXRhKSB7CisJdWludDY0X3QgKnByZXZfcHRyID0gJndoZHItPnNldHVwX2RhdGE7CisKKwlmb3IgKHNkcCA9IHNldHVwX2RhdGEtPm5leHQ7IHNkcCAhPSBzZXR1cF9kYXRhOyBzZHAgPSBzZHAtPm5leHQpIHsKKwkgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbWw7CisJICAgIGNvbnN0IGFkZHJfdCBhbGlnbl9tYXNrID0gMTU7IC8qIEhlYWRlciBpcyAxNiBieXRlcyAqLworCSAgICBhZGRyX3QgYmVzdF9hZGRyID0gMDsKKwkgICAgc2l6ZV90IHNpemUgPSBzZHAtPmhkci5sZW4gKyBzaXplb2Yoc2RwLT5oZHIpOworCisJICAgIGlmICghc2RwLT5kYXRhIHx8ICFzZHAtPmhkci5sZW4pCisJCWNvbnRpbnVlOworCisJICAgIGlmIChoZHIudmVyc2lvbiA8IDB4MDIwOSkgeworCQkvKiBTZXR1cCBkYXRhIG5vdCBzdXBwb3J0ZWQgKi8KKwkJZXJybm8gPSBFTlhJTzsJLyogS2luZCBvZiBhcmJpdHJhcnkuLi4gKi8KKwkJZ290byBiYWlsOworCSAgICB9CisKKwkgICAgZm9yIChtbCA9IGFtYXA7IG1sLT50eXBlICE9IFNNVF9FTkQ7IG1sID0gbWwtPm5leHQpIHsKKwkJYWRkcl90IGFkal9zdGFydCA9IChtbC0+c3RhcnQgKyBhbGlnbl9tYXNrKSAmIH5hbGlnbl9tYXNrOworCQlhZGRyX3QgYWRqX2VuZCA9IG1sLT5uZXh0LT5zdGFydCAmIH5hbGlnbl9tYXNrOworCisJCWlmIChtbC0+dHlwZSA9PSBTTVRfRlJFRSAmJiBhZGpfZW5kIC0gYWRqX3N0YXJ0ID49IHNpemUpCisJCSAgICBiZXN0X2FkZHIgPSAoYWRqX2VuZCAtIHNpemUpICYgfmFsaWduX21hc2s7CisJICAgIH0KKworCSAgICBpZiAoIWJlc3RfYWRkcikKKwkJZ290byBiYWlsOworCisJICAgICpwcmV2X3B0ciA9IGJlc3RfYWRkcjsKKwkgICAgcHJldl9wdHIgPSAmc2RwLT5oZHIubmV4dDsKKworCSAgICBpZiAoc3lzbGludXhfYWRkX21lbW1hcCgmYW1hcCwgYmVzdF9hZGRyLCBzaXplLCBTTVRfQUxMT0MpKSB7CisJCWVycm5vID0gRU5PTUVNOworCQlnb3RvIGJhaWw7CisJICAgIH0KKwkgICAgaWYgKHN5c2xpbnV4X2FkZF9tb3ZlbGlzdCgmZnJhZ2xpc3QsIGJlc3RfYWRkciwKKwkJCQkgICAgICAoYWRkcl90KSZzZHAtPmhkciwgc2l6ZW9mIHNkcC0+aGRyKSkgeworCQllcnJubyA9IEVOT01FTTsKKwkJZ290byBiYWlsOworCSAgICB9CisJICAgIGlmIChzeXNsaW51eF9hZGRfbW92ZWxpc3QoJmZyYWdsaXN0LCBiZXN0X2FkZHIgKyBzaXplb2Ygc2RwLT5oZHIsCisJCQkJICAgICAgKGFkZHJfdClzZHAtPmRhdGEsIHNkcC0+aGRyLmxlbikpIHsKKwkJZXJybm8gPSBFTk9NRU07CisJCWdvdG8gYmFpbDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiBTZXQgdXAgdGhlIHJlZ2lzdGVycyBvbiBlbnRyeSAqLworICAgIG1lbXNldCgmcmVncywgMCwgc2l6ZW9mIHJlZ3MpOworICAgIHJlZ3MuZXMgPSByZWdzLmRzID0gcmVncy5zcyA9IHJlZ3MuZnMgPSByZWdzLmdzID0gcmVhbF9tb2RlX2Jhc2UgPj4gNDsKKyAgICByZWdzLmNzID0gKHJlYWxfbW9kZV9iYXNlID4+IDQpICsgMHgyMDsKKyAgICAvKiByZWdzLmlwID0gMDsgKi8KKyAgICAvKiBMaW51eCBpcyBPSyB3aXRoIHNwID0gMCA9IDY0SywgYnV0IHBlcmhhcHMgb3RoZXIgdGhpbmdzIGFyZW4ndC4uLiAqLworICAgIHJlZ3MuZXNwLndbMF0gPSBtaW4oY21kbGluZV9vZmZzZXQsIChzaXplX3QpIDB4ZmZmMCk7CisKKyAgICBkcHJpbnRmKCJGaW5hbCBtZW1vcnkgbWFwOlxuIik7CisgICAgc3lzbGludXhfZHVtcF9tZW1tYXAobW1hcCk7CisKKyAgICBkcHJpbnRmKCJGaW5hbCBhdmFpbGFibGUgbWFwOlxuIik7CisgICAgc3lzbGludXhfZHVtcF9tZW1tYXAoYW1hcCk7CisKKyAgICBkcHJpbnRmKCJJbml0aWFsIG1vdmVsaXN0OlxuIik7CisgICAgc3lzbGludXhfZHVtcF9tb3ZlbGlzdChmcmFnbGlzdCk7CisKKyAgICBpZiAodmlkZW9fbW9kZSAhPSAweDBmMDQpIHsKKwkvKgorCSAqIHZpZGVvX21vZGUgaXMgbm90ICJjdXJyZW50Iiwgc28gaWYgd2UgYXJlIGluIGdyYXBoaWNzIG1vZGUgd2UKKwkgKiBuZWVkIHRvIHJldmVydCB0byB0ZXh0IG1vZGUuLi4KKwkgKi8KKwlkcHJpbnRmKCIqKiogQ2FsbGluZyBzeXNsaW51eF9mb3JjZV90ZXh0X21vZGUoKS4uLlxuIik7CisJc3lzbGludXhfZm9yY2VfdGV4dF9tb2RlKCk7CisgICAgfSBlbHNlIHsKKwlkcHJpbnRmKCIqKiogdmdhPWN1cnJlbnQsIG5vdCBjYWxsaW5nIHN5c2xpbnV4X2ZvcmNlX3RleHRfbW9kZSgpLi4uXG4iKTsKKyAgICB9CisKKyAgICBzeXNsaW51eF9zaHVmZmxlX2Jvb3Rfcm0oZnJhZ2xpc3QsIG1tYXAsIDAsICZyZWdzKTsKKyAgICBkcHJpbnRmKCJzaHVmZmxlX2Jvb3Rfcm0gZmFpbGVkXG4iKTsKKworYmFpbDoKKyAgICBzeXNsaW51eF9mcmVlX21vdmVsaXN0KGZyYWdsaXN0KTsKKyAgICBzeXNsaW51eF9mcmVlX21lbW1hcChtbWFwKTsKKyAgICBzeXNsaW51eF9mcmVlX21lbW1hcChhbWFwKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBzeXNsaW51eF9ib290X2xpbnV4KHZvaWQgKmtlcm5lbF9idWYsIHNpemVfdCBrZXJuZWxfc2l6ZSwKKwkJCXN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mcywKKwkJCXN0cnVjdCBzZXR1cF9kYXRhICpzZXR1cF9kYXRhLAorCQkJY2hhciAqY21kbGluZSkKK3sKKyAgICBpZiAoZmlybXdhcmUtPmJvb3RfbGludXgpCisJcmV0dXJuIGZpcm13YXJlLT5ib290X2xpbnV4KGtlcm5lbF9idWYsIGtlcm5lbF9zaXplLCBpbml0cmFtZnMsCisJCQkJICAgIHNldHVwX2RhdGEsIGNtZGxpbmUpOworCisgICAgcmV0dXJuIGJpb3NfYm9vdF9saW51eChrZXJuZWxfYnVmLCBrZXJuZWxfc2l6ZSwgaW5pdHJhbWZzLAorCQkJICAgc2V0dXBfZGF0YSwgY21kbGluZSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvbG9hZGZpbGUuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9sb2FkZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOTZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvbG9hZGZpbGUuYwpAQCAtMCwwICsxLDYzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbG9hZGZpbGUuYworICoKKyAqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgZGF0YSBmaWxlIGludG8gYSBtYWxsb2MnZCBidWZmZXIKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisKKyNkZWZpbmUgSU5DUkVNRU5UQUxfQ0hVTksgMTAyNCoxMDI0CisKK2ludCBsb2FkZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqKnB0ciwgc2l6ZV90ICogbGVuKQoreworICAgIEZJTEUgKmY7CisgICAgaW50IHJ2LCBlOworCisgICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgIGlmICghZikKKwlyZXR1cm4gLTE7CisKKyAgICBydiA9IGZsb2FkZmlsZShmLCBwdHIsIGxlbiwgTlVMTCwgMCk7CisgICAgZSA9IGVycm5vOworCisgICAgZmNsb3NlKGYpOworCisgICAgaWYgKHJ2KQorCWVycm5vID0gZTsKKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvbG9jYWxib290LmMgYi9jb20zMi9saWIvc3lzbGludXgvbG9jYWxib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwMTZhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC9sb2NhbGJvb3QuYwpAQCAtMCwwICsxLDM4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8bG9jYWxib290Lmg+CisKKy8qIFRoaXMgcmV0dXJucyBvbmx5IG9uIGZhaWx1cmUgKi8KKwordm9pZCBzeXNsaW51eF9sb2NhbF9ib290KGludDE2X3QgZmxhZ3MpCit7CisgICAgbG9jYWxfYm9vdChmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvbWVtbWFwLmMgYi9jb20zMi9saWIvc3lzbGludXgvbWVtbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzZTkxYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC9tZW1tYXAuYwpAQCAtMCwwICsxLDY0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbWVtbWFwLmMKKyAqCisgKiBDcmVhdGUgaW5pdGlhbCBtZW1vcnkgbWFwIGZvciAic2h1ZmZsZSBhbmQgYm9vdCIgb3BlcmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzbGludXgvbWVtc2Nhbi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L21vdmViaXRzLmg+CisKK3N0YXRpYyBpbnQgc3lzbGludXhfbWVtb3J5X21hcF9jYWxsYmFjayh2b2lkICptYXAsIGFkZHJfdCBzdGFydCwgYWRkcl90IGxlbiwKKwkJCQkJZW51bSBzeXNsaW51eF9tZW1tYXBfdHlwZXMgdHlwZSkKK3sKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICoqbW1hcCA9IG1hcDsKKyAgICByZXR1cm4gc3lzbGludXhfYWRkX21lbW1hcChtbWFwLCBzdGFydCwgbGVuLCB0eXBlKTsKK30KKworc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqc3lzbGludXhfbWVtb3J5X21hcCh2b2lkKQoreworICAgIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKm1tYXA7CisKKyAgICBtbWFwID0gc3lzbGludXhfaW5pdF9tZW1tYXAoKTsKKyAgICBpZiAoIW1tYXApCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoc3lzbGludXhfc2Nhbl9tZW1vcnkoc3lzbGludXhfbWVtb3J5X21hcF9jYWxsYmFjaywgJm1tYXApKSB7CisJc3lzbGludXhfZnJlZV9tZW1tYXAobW1hcCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG1tYXA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvbWVtc2Nhbi5jIGIvY29tMzIvbGliL3N5c2xpbnV4L21lbXNjYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGI3Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L21lbXNjYW4uYwpAQCAtMCwwICsxLDc1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1lbXNjYW4uYworICoKKyAqIFF1ZXJ5IHRoZSBzeXN0ZW0gZm9yIGZyZWUgbWVtb3J5CisgKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L21lbXNjYW4uaD4KKworc3RhdGljIExJU1RfSEVBRChzeXNsaW51eF9tZW1zY2FuX2hlYWQpOworCisvKgorICogQWRkIGEgbWVtc2NhbiBlbnRyeSB0byB0aGUgbGlzdC4KKyAqLwordm9pZCBzeXNsaW51eF9tZW1zY2FuX2FkZChzdHJ1Y3Qgc3lzbGludXhfbWVtc2NhbiAqZW50cnkpCit7CisgICAgbGlzdF9hZGQoJmVudHJ5LT5uZXh0LCAmc3lzbGludXhfbWVtc2Nhbl9oZWFkKTsKK30KKworLyoKKyAqIEJ1aWxkIGEgbmV3IG1lbXNjYW4gZW50cnkgYW5kIGFkZCBpdCB0byB0aGUgbGlzdC4KKyAqLworaW50IHN5c2xpbnV4X21lbXNjYW5fbmV3KGludCBmdW5jKHNjYW5fbWVtb3J5X2NhbGxiYWNrX3QsIHZvaWQgKmRhdGEpKQoreworICAgIHN0cnVjdCBzeXNsaW51eF9tZW1zY2FuICplbnRyeTsKKworICAgIGVudHJ5ID0gbWFsbG9jKHNpemVvZiAqZW50cnkpOworICAgIGlmICghZW50cnkpCisJcmV0dXJuIC0xOworCisgICAgZW50cnktPmZ1bmMgPSBmdW5jOworICAgIHN5c2xpbnV4X21lbXNjYW5fYWRkKGVudHJ5KTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHN5c2xpbnV4X3NjYW5fbWVtb3J5KHNjYW5fbWVtb3J5X2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbXNjYW4gKmVudHJ5OworICAgIGludCBydiA9IDA7CisKKyAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmc3lzbGludXhfbWVtc2Nhbl9oZWFkLCBuZXh0KSB7CisJcnYgPSBlbnRyeS0+ZnVuYyhjYWxsYmFjaywgZGF0YSk7CisJaWYgKHJ2KQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvbW92ZWJpdHMuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9tb3ZlYml0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Y2I3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvbW92ZWJpdHMuYwpAQCAtMCwwICsxLDY4OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1vdmViaXRzLmMKKyAqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHRha2UgYSBsaXN0IG9mIG1lbW9yeSBhcmVhcyB0byBzaHVmZmxlIGFuZAorICogY29udmVydCBpdCB0byBhIHNldCBvZiBzaHVmZmxlIG9wZXJhdGlvbnMuCisgKgorICogTm90ZTogYSBsb3Qgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgZGVhbCB3aXRoICJwYXJlbnQgcG9pbnRlcnMiLAorICogd2hpY2ggYXJlIHBvaW50ZXJzIHRvIGEgcG9pbnRlciB0byBhIGxpc3QsIG9yIHBhcnQgb2YgdGhlIGxpc3QuCisgKiBUaGV5IGNhbiBiZSBwb2ludGVycyB0byBhIHZhcmlhYmxlIGhvbGRpbmcgdGhlIGxpc3Qgcm9vdCBwb2ludGVyLAorICogb3IgcG9pbnRlcnMgdG8gYSBuZXh0IGZpZWxkIG9mIGEgcHJldmlvdXMgZW50cnkuCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgPHN5c2xpbnV4L21vdmViaXRzLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorCitzdGF0aWMgam1wX2J1ZiBuZXdfbW92ZWxpc3RfYmFpbDsKKworc3RhdGljIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqbmV3X21vdmVsaXN0KGFkZHJfdCBkc3QsIGFkZHJfdCBzcmMsCisJCQkJCSAgICAgIGFkZHJfdCBsZW4pCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICptbCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0KSk7CisKKyAgICBpZiAoIW1sKQorCWxvbmdqbXAobmV3X21vdmVsaXN0X2JhaWwsIDEpOworCisgICAgbWwtPmRzdCA9IGRzdDsKKyAgICBtbC0+c3JjID0gc3JjOworICAgIG1sLT5sZW4gPSBsZW47CisgICAgbWwtPm5leHQgPSBOVUxMOworCisgICAgcmV0dXJuIG1sOworfQorCitzdGF0aWMgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICpkdXBfbW92ZWxpc3Qoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICpzcmMpCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICpkc3QgPSBOVUxMLCAqKmRzdHAgPSAmZHN0LCAqbWw7CisKKyAgICB3aGlsZSAoc3JjKSB7CisJbWwgPSBuZXdfbW92ZWxpc3Qoc3JjLT5kc3QsIHNyYy0+c3JjLCBzcmMtPmxlbik7CisJKmRzdHAgPSBtbDsKKwlkc3RwID0gJm1sLT5uZXh0OworCXNyYyA9IHNyYy0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gZHN0OworfQorCitzdGF0aWMgdm9pZAorYWRkX2ZyZWVsaXN0KHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKiptbWFwLCBhZGRyX3Qgc3RhcnQsCisJICAgICBhZGRyX3QgbGVuLCBlbnVtIHN5c2xpbnV4X21lbW1hcF90eXBlcyB0eXBlKQoreworICAgIGlmIChzeXNsaW51eF9hZGRfbWVtbWFwKG1tYXAsIHN0YXJ0LCBsZW4sIHR5cGUpKQorCWxvbmdqbXAobmV3X21vdmVsaXN0X2JhaWwsIDEpOworfQorCisvKgorICogVGFrZSBhIGNodW5rLCBlbnRpcmVseSBjb25maW5lZCBpbiAqKnBhcmVudHB0ciwgYW5kIHNwbGl0IGl0IG9mZiBzbyB0aGF0CisgKiBpdCBoYXMgaXRzIG93biBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKipzcGxpdF9tb3ZlbGlzdChhZGRyX3Qgc3RhcnQsIGFkZHJfdCBsZW4sCisJCQkJCQkgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0CisJCQkJCQkgKipwYXJlbnRwdHIpCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICptLCAqbWwgPSAqcGFyZW50cHRyOworCisgICAgYXNzZXJ0KHN0YXJ0ID49IG1sLT5zcmMpOworICAgIGFzc2VydChzdGFydCA8IG1sLT5zcmMgKyBtbC0+bGVuKTsKKworICAgIC8qIFNwbGl0IG9mZiB0aGUgYmVnaW5uaW5nICovCisgICAgaWYgKHN0YXJ0ID4gbWwtPnNyYykgeworCWFkZHJfdCBsID0gc3RhcnQgLSBtbC0+c3JjOworCisJbSA9IG5ld19tb3ZlbGlzdChtbC0+ZHN0ICsgbCwgc3RhcnQsIG1sLT5sZW4gLSBsKTsKKwltLT5uZXh0ID0gbWwtPm5leHQ7CisJbWwtPmxlbiA9IGw7CisJbWwtPm5leHQgPSBtOworCisJcGFyZW50cHRyID0gJm1sLT5uZXh0OworCW1sID0gbTsJCQkvKiBDb250aW51ZSBwcm9jZXNzaW5nIHRoZSBuZXcgbm9kZSAqLworICAgIH0KKworICAgIC8qIFNwbGl0IG9mZiB0aGUgZW5kICovCisgICAgaWYgKG1sLT5sZW4gPiBsZW4pIHsKKwlhZGRyX3QgbCA9IG1sLT5sZW4gLSBsZW47CisKKwltID0gbmV3X21vdmVsaXN0KG1sLT5kc3QgKyBsZW4sIG1sLT5zcmMgKyBsZW4sIGwpOworCW0tPm5leHQgPSBtbC0+bmV4dDsKKwltbC0+bGVuID0gbGVuOworCW1sLT5uZXh0ID0gbTsKKyAgICB9CisKKyAgICByZXR1cm4gcGFyZW50cHRyOworfQorCitzdGF0aWMgdm9pZCBkZWxldGVfbW92ZWxpc3Qoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICoqcGFyZW50cHRyKQoreworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqbyA9ICpwYXJlbnRwdHI7CisgICAgKnBhcmVudHB0ciA9IG8tPm5leHQ7CisgICAgZnJlZShvKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9tb3ZlbGlzdChzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKipwYXJlbnRwdHIpCit7CisgICAgd2hpbGUgKCpwYXJlbnRwdHIpCisJZGVsZXRlX21vdmVsaXN0KHBhcmVudHB0cik7Cit9CisKKy8qCisgKiBTY2FuIHRoZSBmcmVlbGlzdCBsb29raW5nIGZvciBhIHBhcnRpY3VsYXIgY2h1bmsgb2YgbWVtb3J5LiAgUmV0dXJucworICogdGhlIG1lbW1hcCBjaHVuayBjb250YWluaW5nIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZWdpb24uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICppc19mcmVlX3pvbmUoY29uc3Qgc3RydWN0IHN5c2xpbnV4X21lbW1hcAorCQkJCQkJICAqbGlzdCwgYWRkcl90IHN0YXJ0LAorCQkJCQkJICBhZGRyX3QgbGVuKQoreworICAgIGFkZHJfdCBsYXN0LCBsbGFzdDsKKworICAgIGRwcmludGYoImY6IDB4JTA4eCBieXRlcyBhdCAweCUwOHhcbiIsIGxlbiwgc3RhcnQpOworCisgICAgbGFzdCA9IHN0YXJ0ICsgbGVuIC0gMTsKKworICAgIHdoaWxlIChsaXN0LT50eXBlICE9IFNNVF9FTkQpIHsKKwlpZiAobGlzdC0+c3RhcnQgPD0gc3RhcnQpIHsKKwkgICAgY29uc3Qgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqaWxpc3QgPSBsaXN0OworCSAgICB3aGlsZSAodmFsaWRfdGVybWluYWxfdHlwZShsaXN0LT50eXBlKSkgeworCQlsbGFzdCA9IGxpc3QtPm5leHQtPnN0YXJ0IC0gMTsKKwkJaWYgKGxsYXN0ID49IGxhc3QpCisJCSAgICByZXR1cm4gaWxpc3Q7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCSAgICB9CisKKwkgICAgaWYgKGxpc3QtPnN0YXJ0ID4gc3RhcnQpCisJCXJldHVybiBOVUxMOwkvKiBJbnZhbGlkIHR5cGUgaW4gcmVnaW9uICovCisJfQorCWxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBOVUxMOwkJLyogSW50ZXJuYWwgZXJyb3I/ICovCit9CisKKy8qCisgKiBTY2FuIHRoZSBmcmVlbGlzdCBsb29raW5nIGZvciB0aGUgc21hbGxlc3QgY2h1bmsgb2YgbWVtb3J5IHdoaWNoCisgKiBjYW4gZml0IFggYnl0ZXM7IHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgYmxvY2sgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGFkZHJfdCBmcmVlX2FyZWEoY29uc3Qgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbW1hcCwKKwkJCWFkZHJfdCBsZW4sIGFkZHJfdCAqIHN0YXJ0KQoreworICAgIGNvbnN0IHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmJlc3QgPSBOVUxMOworICAgIGNvbnN0IHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKnM7CisgICAgYWRkcl90IHNsZW4sIGJlc3RfbGVuID0gLTE7CisKKyAgICBmb3IgKHMgPSBtbWFwOyBzLT50eXBlICE9IFNNVF9FTkQ7IHMgPSBzLT5uZXh0KSB7CisJaWYgKHMtPnR5cGUgIT0gU01UX0ZSRUUpCisJICAgIGNvbnRpbnVlOworCXNsZW4gPSBzLT5uZXh0LT5zdGFydCAtIHMtPnN0YXJ0OworCWlmIChzbGVuID49IGxlbikgeworCSAgICBpZiAoIWJlc3QgfHwgYmVzdF9sZW4gPiBzbGVuKSB7CisJCWJlc3QgPSBzOworCQliZXN0X2xlbiA9IHNsZW47CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKGJlc3QpIHsKKwkqc3RhcnQgPSBiZXN0LT5zdGFydDsKKwlyZXR1cm4gYmVzdF9sZW47CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qCisgKiBSZW1vdmUgYSBjaHVuayBmcm9tIHRoZSBmcmVlbGlzdAorICovCitzdGF0aWMgdm9pZAorYWxsb2NhdGVfZnJvbShzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICoqbW1hcCwgYWRkcl90IHN0YXJ0LCBhZGRyX3QgbGVuKQoreworICAgIHN5c2xpbnV4X2FkZF9tZW1tYXAobW1hcCwgc3RhcnQsIGxlbiwgU01UX0FMTE9DKTsKK30KKworLyoKKyAqIEZpbmQgY2h1bmtzIG9mIGEgbW92ZWxpc3Qgd2hpY2ggYXJlIG9uZS10by1tYW55IChvbmUgc291cmNlLCBtdWx0aXBsZQorICogZGVzdGluYXRpb25zLikgIFRob3NlIGNodW5rcyBjYW4gZ2V0IHR1cm5lZCBpbnRvIHBvc3Qtc2h1ZmZsZSBjb3BpZXMsCisgKiB0byBhdm9pZCBjb25mdXNpbmcgdGhlIHNodWZmbGVyLgorICovCitzdGF0aWMgdm9pZCBzaHVmZmxlX2RlYWxpYXMoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICoqZnJhZ2xpc3QsCisJCQkgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICoqcG9zdGNvcHkpCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICptcCwgKiptcHAsICpteCwgKm5wOworICAgIGFkZHJfdCBwcywgcGUsIHhzLCB4ZSwgZGVsdGE7CisgICAgYm9vbCBhZHZhbmNlOworCisgICAgZHByaW50ZigiQmVmb3JlIGFsaWFzIHJlc29sdXRpb246XG4iKTsKKyAgICBzeXNsaW51eF9kdW1wX21vdmVsaXN0KCpmcmFnbGlzdCk7CisKKyAgICAqcG9zdGNvcHkgPSBOVUxMOworCisgICAgLyoKKyAgICAgKiBOb3RlOiBhcyB3cml0dGVuLCB0aGlzIGlzIGFuIE8obl4yKSBhbGdvcml0aG07IGJ5IHByb2R1Y2luZyBhIGxpc3QKKyAgICAgKiBzb3J0ZWQgYnkgZGVzdGluYXRpb24gYWRkcmVzcyB3ZSBjb3VsZCByZWR1Y2UgaXQgdG8gTyhuIGxvZyBuKS4KKyAgICAgKi8KKyAgICBtcHAgPSBmcmFnbGlzdDsKKyAgICB3aGlsZSAoKG1wID0gKm1wcCkpIHsKKwlkcHJpbnRmKCJtcCAtPiAoJSN4LCUjeCwlI3gpXG4iLCBtcC0+ZHN0LCBtcC0+c3JjLCBtcC0+bGVuKTsKKwlwcyA9IG1wLT5zcmM7CisJcGUgPSBtcC0+c3JjICsgbXAtPmxlbiAtIDE7CisJZm9yIChteCA9ICpmcmFnbGlzdDsgbXggIT0gbXA7IG14ID0gbXgtPm5leHQpIHsKKwkgICAgZHByaW50ZigibXggLT4gKCUjeCwlI3gsJSN4KVxuIiwgbXgtPmRzdCwgbXgtPnNyYywgbXgtPmxlbik7CisJICAgIC8qCisJICAgICAqIElmIHRoZXJlIGlzIGFueSBvdmVybGFwIGJldHdlZW4gbXggYW5kIG1wLCBtcCBzaG91bGQgYmUKKwkgICAgICogbW9kaWZpZWQgYW5kIHBvc3NpYmx5IHNwbGl0LgorCSAgICAgKi8KKwkgICAgeHMgPSBteC0+c3JjOworCSAgICB4ZSA9IG14LT5zcmMgKyBteC0+bGVuIC0gMTsKKworCSAgICBkcHJpbnRmKCI/OiAlI3guLiUjeCAoaW5zaWRlICUjeC4uJSN4KVxuIiwgcHMsIHBlLCB4cywgeGUpOworCisJICAgIGlmIChwZSA8PSB4cyB8fCBwcyA+PSB4ZSkKKwkJY29udGludWU7CS8qIE5vIG92ZXJsYXAgKi8KKworCSAgICBhZHZhbmNlID0gZmFsc2U7CisJICAgICptcHAgPSBtcC0+bmV4dDsJLyogUmVtb3ZlIGZyb20gbGlzdCAqLworCisJICAgIGlmIChwZSA+IHhlKSB7CisJCWRlbHRhID0gcGUgLSB4ZTsKKwkJbnAgPSBuZXdfbW92ZWxpc3QobXAtPmRzdCArIG1wLT5sZW4gLSBkZWx0YSwKKwkJCQkgIG1wLT5zcmMgKyBtcC0+bGVuIC0gZGVsdGEsIGRlbHRhKTsKKwkJbXAtPmxlbiAtPSBkZWx0YTsKKwkJcGUgPSB4ZTsKKwkJbnAtPm5leHQgPSAqbXBwOworCQkqbXBwID0gbnA7CisJCWFkdmFuY2UgPSB0cnVlOworCSAgICB9CisJICAgIGlmIChwcyA8IHhzKSB7CisJCWRlbHRhID0geHMgLSBwczsKKwkJbnAgPSBuZXdfbW92ZWxpc3QobXAtPmRzdCwgcHMsIGRlbHRhKTsKKwkJbXAtPnNyYyArPSBkZWx0YTsKKwkJcHMgPSBtcC0+c3JjOworCQltcC0+ZHN0ICs9IGRlbHRhOworCQltcC0+bGVuIC09IGRlbHRhOworCQlucC0+bmV4dCA9ICptcHA7CisJCSptcHAgPSBucDsKKwkJYWR2YW5jZSA9IHRydWU7CisJICAgIH0KKworCSAgICBhc3NlcnQocHMgPj0geHMgJiYgcGUgPD0geGUpOworCisJICAgIGRwcmludGYoIk92ZXJsYXA6ICUjeC4uJSN4IChpbnNpZGUgJSN4Li4lI3gpXG4iLCBwcywgcGUsIHhzLCB4ZSk7CisKKwkgICAgbXAtPnNyYyA9IG14LT5kc3QgKyAocHMgLSB4cyk7CisJICAgIG1wLT5uZXh0ID0gKnBvc3Rjb3B5OworCSAgICAqcG9zdGNvcHkgPSBtcDsKKworCSAgICBtcCA9ICptcHA7CisKKwkgICAgaWYgKCFhZHZhbmNlKQorCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJbXBwID0gJm1wLT5uZXh0OworcmVzdGFydDoKKwk7CisgICAgfQorCisgICAgZHByaW50ZigiQWZ0ZXIgYWxpYXMgcmVzb2x1dGlvbjpcbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbW92ZWxpc3QoKmZyYWdsaXN0KTsKKyAgICBkcHJpbnRmKCJQb3N0LXNodWZmbGUgY29waWVzOlxuIik7CisgICAgc3lzbGludXhfZHVtcF9tb3ZlbGlzdCgqcG9zdGNvcHkpOworfQorCisvKgorICogVGhlIGNvZGUgdG8gYWN0dWFsbHkgZW1pdCBtb3Zpbmcgb2YgYSBjaHVuayBpbnRvIGl0cyBmaW5hbCBwbGFjZS4KKyAqLworc3RhdGljIHZvaWQKK21vdmVfY2h1bmsoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICoqKm1vdmVzLAorCSAgIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKiptbWFwLAorCSAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqKmZwLCBhZGRyX3QgY29weWxlbikKK3sKKyAgICBhZGRyX3QgY29weWRzdCwgY29weXNyYzsKKyAgICBhZGRyX3QgZnJlZWJhc2UsIGZyZWVsZW47CisgICAgYWRkcl90IG5lZWRsZW47CisgICAgaW50IHJldmVyc2U7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICpmID0gKmZwLCAqbXY7CisKKyAgICBpZiAoZi0+c3JjIDwgZi0+ZHN0ICYmIChmLT5kc3QgLSBmLT5zcmMpIDwgZi0+bGVuKSB7CisJLyogIlNoaWZ0IHVwIiB0eXBlIG92ZXJsYXAgKi8KKwluZWVkbGVuID0gZi0+ZHN0IC0gZi0+c3JjOworCXJldmVyc2UgPSAxOworICAgIH0gZWxzZSBpZiAoZi0+c3JjID4gZi0+ZHN0ICYmIChmLT5zcmMgLSBmLT5kc3QpIDwgZi0+bGVuKSB7CisJLyogIlNoaWZ0IGRvd24iIHR5cGUgb3ZlcmxhcCAqLworCW5lZWRsZW4gPSBmLT5zcmMgLSBmLT5kc3Q7CisJcmV2ZXJzZSA9IDA7CisgICAgfSBlbHNlIHsKKwluZWVkbGVuID0gZi0+bGVuOworCXJldmVyc2UgPSAwOworICAgIH0KKworICAgIGNvcHlkc3QgPSBmLT5kc3Q7CisgICAgY29weXNyYyA9IGYtPnNyYzsKKworICAgIGRwcmludGYoIlE6IGNvcHlsZW4gPSAweCUwOHgsIG5lZWRsZW4gPSAweCUwOHhcbiIsIGNvcHlsZW4sIG5lZWRsZW4pOworCisgICAgaWYgKGNvcHlsZW4gPCBuZWVkbGVuKSB7CisJaWYgKHJldmVyc2UpIHsKKwkgICAgY29weWRzdCArPSAoZi0+bGVuIC0gY29weWxlbik7CisJICAgIGNvcHlzcmMgKz0gKGYtPmxlbiAtIGNvcHlsZW4pOworCX0KKworCWRwcmludGYoIlg6IDB4JTA4eCBieXRlcyBhdCAweCUwOHggLT4gMHglMDh4XG4iLAorCQljb3B5bGVuLCBjb3B5c3JjLCBjb3B5ZHN0KTsKKworCS8qIERpZG4ndCBnZXQgYWxsIHdlIHdhbnRlZCwgc28gd2UgaGF2ZSB0byBzcGxpdCB0aGUgY2h1bmsgKi8KKwlmcCA9IHNwbGl0X21vdmVsaXN0KGNvcHlzcmMsIGNvcHlsZW4sIGZwKTsJLyogSXMgdGhpcyByaWdodD8gKi8KKwlmID0gKmZwOworICAgIH0KKworICAgIG12ID0gbmV3X21vdmVsaXN0KGYtPmRzdCwgZi0+c3JjLCBmLT5sZW4pOworICAgIGRwcmludGYoIkE6IDB4JTA4eCBieXRlcyBhdCAweCUwOHggLT4gMHglMDh4XG4iLCBtdi0+bGVuLCBtdi0+c3JjLCBtdi0+ZHN0KTsKKyAgICAqKm1vdmVzID0gbXY7CisgICAgKm1vdmVzID0gJm12LT5uZXh0OworCisgICAgLyogRmlndXJlIG91dCB3aGF0IG1lbW9yeSB3ZSBqdXN0IGZyZWVkIHVwICovCisgICAgaWYgKGYtPmRzdCA+IGYtPnNyYykgeworCWZyZWViYXNlID0gZi0+c3JjOworCWZyZWVsZW4gPSBtaW4oZi0+bGVuLCBmLT5kc3QgLSBmLT5zcmMpOworICAgIH0gZWxzZSBpZiAoZi0+c3JjID49IGYtPmRzdCArIGYtPmxlbikgeworCWZyZWViYXNlID0gZi0+c3JjOworCWZyZWVsZW4gPSBmLT5sZW47CisgICAgfSBlbHNlIHsKKwlmcmVlbGVuID0gZi0+c3JjIC0gZi0+ZHN0OworCWZyZWViYXNlID0gZi0+ZHN0ICsgZi0+bGVuOworICAgIH0KKworICAgIGRwcmludGYoIkY6IDB4JTA4eCBieXRlcyBhdCAweCUwOHhcbiIsIGZyZWVsZW4sIGZyZWViYXNlKTsKKworICAgIGFkZF9mcmVlbGlzdChtbWFwLCBmcmVlYmFzZSwgZnJlZWxlbiwgU01UX0ZSRUUpOworCisgICAgZGVsZXRlX21vdmVsaXN0KGZwKTsKK30KKworLyoKKyAqIG1vdmVzIGlzIGNvbXB1dGVkIGZyb20gImZyYWdzIiBhbmQgImZyZWVtZW0iLiAgInNwYWNlIiBsaXN0cworICogZnJlZSBtZW1vcnkgYXJlYXMgYXQgb3VyIGRpc3Bvc2FsLCBhbmQgaXMgKHNyYywgY250KSBvbmx5LgorICovCitpbnQKK3N5c2xpbnV4X2NvbXB1dGVfbW92ZWxpc3Qoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICoqbW92ZXMsCisJCQkgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqaWZyYWdzLAorCQkJICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptZW1tYXApCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbW1hcCA9IE5VTEw7CisgICAgY29uc3Qgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbW0sICplcDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKmZyYWdzID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKnBvc3Rjb3B5ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKm12OworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqZiwgKipmcDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKm8sICoqb3A7CisgICAgYWRkcl90IG5lZWRiYXNlLCBuZWVkbGVuLCBjb3B5c3JjLCBjb3B5ZHN0LCBjb3B5bGVuOworICAgIGFkZHJfdCBhdmFpbDsKKyAgICBhZGRyX3QgZnN0YXJ0LCBmbGVuOworICAgIGFkZHJfdCBjYnl0ZTsKKyAgICBhZGRyX3QgZXBfbGVuOworICAgIGludCBydiA9IC0xOworICAgIGludCByZXZlcnNlOworCisgICAgZHByaW50ZigiZW50ZXJpbmcgc3lzbGludXhfY29tcHV0ZV9tb3ZlbGlzdCgpLi4uXG4iKTsKKworICAgIGlmIChzZXRqbXAobmV3X21vdmVsaXN0X2JhaWwpKSB7Citub21lbToKKwlkcHJpbnRmKCJPdXQgb2Ygd29ya2luZyBtZW1vcnkhXG4iKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgKm1vdmVzID0gTlVMTDsKKworICAgIC8qIENyZWF0ZSBvdXIgbWVtb3J5IG1hcC4gIEFueXRoaW5nIHRoYXQgaXMgU01UX0ZSRUUgb3IgU01UX1pFUk8gaXMKKyAgICAgICBmYWlyIGdhbWUsIGJ1dCBtYXJrIGFueXRoaW5nIHVzZWQgYnkgc291cmNlIG1hdGVyaWFsIGFzIFNNVF9BTExPQy4gKi8KKyAgICBtbWFwID0gc3lzbGludXhfaW5pdF9tZW1tYXAoKTsKKyAgICBpZiAoIW1tYXApCisJZ290byBub21lbTsKKworICAgIGZyYWdzID0gZHVwX21vdmVsaXN0KGlmcmFncyk7CisKKyAgICAvKiBQcm9jZXNzIG9uZS10by1tYW55IGNvbmRpdGlvbnMgKi8KKyAgICBzaHVmZmxlX2RlYWxpYXMoJmZyYWdzLCAmcG9zdGNvcHkpOworCisgICAgZm9yIChtbSA9IG1lbW1hcDsgbW0tPnR5cGUgIT0gU01UX0VORDsgbW0gPSBtbS0+bmV4dCkKKwlhZGRfZnJlZWxpc3QoJm1tYXAsIG1tLT5zdGFydCwgbW0tPm5leHQtPnN0YXJ0IC0gbW0tPnN0YXJ0LAorCQkgICAgIG1tLT50eXBlID09IFNNVF9aRVJPID8gU01UX0ZSRUUgOiBtbS0+dHlwZSk7CisKKyAgICBmb3IgKGYgPSBmcmFnczsgZjsgZiA9IGYtPm5leHQpCisJYWRkX2ZyZWVsaXN0KCZtbWFwLCBmLT5zcmMsIGYtPmxlbiwgU01UX0FMTE9DKTsKKworICAgIC8qIEFzIGxvbmcgYXMgdGhlcmUgYXJlIHVucHJvY2Vzc2VkIGZyYWdtZW50cyBpbiB0aGUgY2hhaW4uLi4gKi8KKyAgICB3aGlsZSAoKGZwID0gJmZyYWdzLCBmID0gKmZwKSkgeworCisJZHByaW50ZigiQ3VycmVudCBmcmVlIGxpc3Q6XG4iKTsKKwlzeXNsaW51eF9kdW1wX21lbW1hcChtbWFwKTsKKwlkcHJpbnRmKCJDdXJyZW50IGZyYWcgbGlzdDpcbiIpOworCXN5c2xpbnV4X2R1bXBfbW92ZWxpc3QoZnJhZ3MpOworCisJLyogU2NhbiBmb3IgZnJhZ21lbnRzIHdoaWNoIGNhbiBiZSBkaXNjYXJkZWQgd2l0aG91dCBhY3Rpb24uICovCisJaWYgKGYtPnNyYyA9PSBmLT5kc3QpIHsKKwkgICAgZGVsZXRlX21vdmVsaXN0KGZwKTsKKwkgICAgY29udGludWU7CisJfQorCW9wID0gJmYtPm5leHQ7CisJd2hpbGUgKChvID0gKm9wKSkgeworCSAgICBpZiAoby0+c3JjID09IG8tPmRzdCkKKwkJZGVsZXRlX21vdmVsaXN0KG9wKTsKKwkgICAgZWxzZQorCQlvcCA9ICZvLT5uZXh0OworCX0KKworCS8qIFNjYW4gZm9yIGZyYWdtZW50cyB3aGljaCBjYW4gYmUgaW1tZWRpYXRlbHkgbW92ZWQKKwkgICB0byB0aGVpciBmaW5hbCBkZXN0aW5hdGlvbiwgaWYgc28gaGFuZGxlIHRoZW0gbm93ICovCisJZm9yIChvcCA9IGZwOyAobyA9ICpvcCk7IG9wID0gJm8tPm5leHQpIHsKKwkgICAgaWYgKG8tPnNyYyA8IG8tPmRzdCAmJiAoby0+ZHN0IC0gby0+c3JjKSA8IG8tPmxlbikgeworCQkvKiAiU2hpZnQgdXAiIHR5cGUgb3ZlcmxhcCAqLworCQluZWVkbGVuID0gby0+ZHN0IC0gby0+c3JjOworCQluZWVkYmFzZSA9IG8tPmRzdCArIChvLT5sZW4gLSBuZWVkbGVuKTsKKwkJcmV2ZXJzZSA9IDE7CisJCWNieXRlID0gby0+ZHN0ICsgby0+bGVuIC0gMTsKKwkgICAgfSBlbHNlIGlmIChvLT5zcmMgPiBvLT5kc3QgJiYgKG8tPnNyYyAtIG8tPmRzdCkgPCBvLT5sZW4pIHsKKwkJLyogIlNoaWZ0IGRvd24iIHR5cGUgb3ZlcmxhcCAqLworCQluZWVkbGVuID0gby0+c3JjIC0gby0+ZHN0OworCQluZWVkYmFzZSA9IG8tPmRzdDsKKwkJcmV2ZXJzZSA9IDA7CisJCWNieXRlID0gby0+ZHN0OwkvKiAiQ3JpdGljYWwgYnl0ZSIgKi8KKwkgICAgfSBlbHNlIHsKKwkJbmVlZGxlbiA9IG8tPmxlbjsKKwkJbmVlZGJhc2UgPSBvLT5kc3Q7CisJCXJldmVyc2UgPSAwOworCQljYnl0ZSA9IG8tPmRzdDsJLyogIkNyaXRpY2FsIGJ5dGUiICovCisJICAgIH0KKworCSAgICBpZiAoaXNfZnJlZV96b25lKG1tYXAsIG5lZWRiYXNlLCBuZWVkbGVuKSkgeworCQlmcCA9IG9wLCBmID0gbzsKKwkJZHByaW50ZigiITogMHglMDh4IGJ5dGVzIGF0IDB4JTA4eCAtPiAweCUwOHhcbiIsCisJCQlmLT5sZW4sIGYtPnNyYywgZi0+ZHN0KTsKKwkJY29weXNyYyA9IGYtPnNyYzsKKwkJY29weWxlbiA9IG5lZWRsZW47CisJCWFsbG9jYXRlX2Zyb20oJm1tYXAsIG5lZWRiYXNlLCBjb3B5bGVuKTsKKwkJZ290byBtb3ZlX2NodW5rOworCSAgICB9CisJfQorCisJLyogT2ssIGJvdGhlci4gIE5lZWQgdG8gZG8gcmVhbCB3b3JrIGF0IGxlYXN0IHdpdGggb25lIGNodW5rLiAqLworCisJZHByaW50ZigiQDogMHglMDh4IGJ5dGVzIGF0IDB4JTA4eCAtPiAweCUwOHhcbiIsCisJCWYtPmxlbiwgZi0+c3JjLCBmLT5kc3QpOworCisJLyogU2VlIGlmIHdlIGNhbiBtb3ZlIHRoaXMgY2h1bmsgaW50byBwbGFjZSBieSBjbGFpbWluZworCSAgIHRoZSBkZXN0aW5hdGlvbiwgb3IgaW4gdGhlIGNhc2Ugb2YgcGFydGlhbCBvdmVybGFwLCB0aGUKKwkgICBtaXNzaW5nIHBvcnRpb24uICovCisKKwlpZiAoZi0+c3JjIDwgZi0+ZHN0ICYmIChmLT5kc3QgLSBmLT5zcmMpIDwgZi0+bGVuKSB7CisJICAgIC8qICJTaGlmdCB1cCIgdHlwZSBvdmVybGFwICovCisJICAgIG5lZWRsZW4gPSBmLT5kc3QgLSBmLT5zcmM7CisJICAgIG5lZWRiYXNlID0gZi0+ZHN0ICsgKGYtPmxlbiAtIG5lZWRsZW4pOworCSAgICByZXZlcnNlID0gMTsKKwkgICAgY2J5dGUgPSBmLT5kc3QgKyBmLT5sZW4gLSAxOworCX0gZWxzZSBpZiAoZi0+c3JjID4gZi0+ZHN0ICYmIChmLT5zcmMgLSBmLT5kc3QpIDwgZi0+bGVuKSB7CisJICAgIC8qICJTaGlmdCBkb3duIiB0eXBlIG92ZXJsYXAgKi8KKwkgICAgbmVlZGxlbiA9IGYtPnNyYyAtIGYtPmRzdDsKKwkgICAgbmVlZGJhc2UgPSBmLT5kc3Q7CisJICAgIHJldmVyc2UgPSAwOworCSAgICBjYnl0ZSA9IGYtPmRzdDsJLyogIkNyaXRpY2FsIGJ5dGUiICovCisJfSBlbHNlIHsKKwkgICAgbmVlZGxlbiA9IGYtPmxlbjsKKwkgICAgbmVlZGJhc2UgPSBmLT5kc3Q7CisJICAgIHJldmVyc2UgPSAwOworCSAgICBjYnl0ZSA9IGYtPmRzdDsKKwl9CisKKwlkcHJpbnRmKCJuZWVkOiBiYXNlID0gMHglMDh4LCBsZW4gPSAweCUwOHgsICIKKwkJInJldmVyc2UgPSAlZCwgY2J5dGUgPSAweCUwOHhcbiIsCisJCW5lZWRiYXNlLCBuZWVkbGVuLCByZXZlcnNlLCBjYnl0ZSk7CisKKwllcCA9IGlzX2ZyZWVfem9uZShtbWFwLCBjYnl0ZSwgMSk7CisJaWYgKGVwKSB7CisJICAgIGVwX2xlbiA9IGVwLT5uZXh0LT5zdGFydCAtIGVwLT5zdGFydDsKKwkgICAgaWYgKHJldmVyc2UpCisJCWF2YWlsID0gbmVlZGJhc2UgKyBuZWVkbGVuIC0gZXAtPnN0YXJ0OworCSAgICBlbHNlCisJCWF2YWlsID0gZXBfbGVuIC0gKG5lZWRiYXNlIC0gZXAtPnN0YXJ0KTsKKwl9IGVsc2UgeworCSAgICBhdmFpbCA9IDA7CisJfQorCisJaWYgKGF2YWlsKSB7CisJICAgIC8qIFdlIGNhbiBtb3ZlIGF0IGxlYXN0IHBhcnQgb2YgdGhpcyBjaHVuayBpbnRvIHBsYWNlIHdpdGhvdXQKKwkgICAgICAgZnVydGhlciBhZG8gKi8KKwkgICAgZHByaW50Zigic3BhY2U6IHN0YXJ0IDB4JTA4eCwgbGVuIDB4JTA4eCwgZnJlZSAweCUwOHhcbiIsCisJCSAgICBlcC0+c3RhcnQsIGVwX2xlbiwgYXZhaWwpOworCSAgICBjb3B5bGVuID0gbWluKG5lZWRsZW4sIGF2YWlsKTsKKworCSAgICBpZiAocmV2ZXJzZSkKKwkJYWxsb2NhdGVfZnJvbSgmbW1hcCwgbmVlZGJhc2UgKyBuZWVkbGVuIC0gY29weWxlbiwgY29weWxlbik7CisJICAgIGVsc2UKKwkJYWxsb2NhdGVfZnJvbSgmbW1hcCwgbmVlZGJhc2UsIGNvcHlsZW4pOworCisJICAgIGdvdG8gbW92ZV9jaHVuazsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGV2aWN0IHNvbWV0aGluZyBvdXQgb2Ygb3VyIHNwYWNlLgorCSAgIEZpbmQgdGhlIG9iamVjdCBvY2N1cHlpbmcgdGhlIGNyaXRpY2FsIGJ5dGUgb2Ygb3VyIHRhcmdldCBzcGFjZSwKKwkgICBhbmQgbW92ZSBpdCBvdXQgKHRoZSB3aG9sZSBvYmplY3QgaWYgd2UgY2FuLCBvdGhlcndpc2UgYSBzdWJzZXQuKQorCSAgIFRoZW4gbW92ZSBhIGNodW5rIG9mIG91cnNlbHZlcyBpbnRvIHBsYWNlLiAqLworCWZvciAob3AgPSAmZi0+bmV4dCwgbyA9ICpvcDsgbzsgb3AgPSAmby0+bmV4dCwgbyA9ICpvcCkgeworCisJICAgIGRwcmludGYoIk86IDB4JTA4eCBieXRlcyBhdCAweCUwOHggLT4gMHglMDh4XG4iLAorCQkgICAgby0+bGVuLCBvLT5zcmMsIG8tPmRzdCk7CisKKwkgICAgaWYgKCEoby0+c3JjIDw9IGNieXRlICYmIG8tPnNyYyArIG8tPmxlbiA+IGNieXRlKSkKKwkJY29udGludWU7CS8qIE5vdCB3aGF0IHdlJ3JlIGxvb2tpbmcgZm9yLi4uICovCisKKwkgICAgLyogRmluZCBzb21ld2hlcmUgdG8gcHV0IGl0Li4uICovCisKKwkgICAgaWYgKGlzX2ZyZWVfem9uZShtbWFwLCBvLT5kc3QsIG8tPmxlbikpIHsKKwkJLyogU2NvcmUhICBXZSBjYW4gbW92ZSBpdCBpbnRvIHBsYWNlIGRpcmVjdGx5Li4uICovCisJCWNvcHlkc3QgPSBvLT5kc3Q7CisJCWNvcHlzcmMgPSBvLT5zcmM7CisJCWNvcHlsZW4gPSBvLT5sZW47CisJICAgIH0gZWxzZSBpZiAoZnJlZV9hcmVhKG1tYXAsIG8tPmxlbiwgJmZzdGFydCkpIHsKKwkJLyogV2UgY2FuIG1vdmUgdGhlIHdob2xlIGNodW5rICovCisJCWNvcHlkc3QgPSBmc3RhcnQ7CisJCWNvcHlzcmMgPSBvLT5zcmM7CisJCWNvcHlsZW4gPSBvLT5sZW47CisJICAgIH0gZWxzZSB7CisJCS8qIFdlbGwsIGNvcHkgYXMgbXVjaCBhcyB3ZSBjYW4uLi4gKi8KKwkJaWYgKHN5c2xpbnV4X21lbW1hcF9sYXJnZXN0KG1tYXAsIFNNVF9GUkVFLCAmZnN0YXJ0LCAmZmxlbikpIHsKKwkJICAgIGRwcmludGYoIk5vIGZyZWUgbWVtb3J5IGF0IGFsbCFcbiIpOworCQkgICAgZ290byBiYWlsOwkvKiBTdHVjayEgKi8KKwkJfQorCisJCS8qIE1ha2Ugc3VyZSB3ZSBpbmNsdWRlIHRoZSBjcml0aWNhbCBieXRlICovCisJCWNvcHlkc3QgPSBmc3RhcnQ7CisJCWlmIChyZXZlcnNlKSB7CisJCSAgICBjb3B5c3JjID0gbWF4KG8tPnNyYywgY2J5dGUgKyAxIC0gZmxlbik7CisJCSAgICBjb3B5bGVuID0gY2J5dGUgKyAxIC0gY29weXNyYzsKKwkJfSBlbHNlIHsKKwkJICAgIGNvcHlzcmMgPSBjYnl0ZTsKKwkJICAgIGNvcHlsZW4gPSBtaW4oZmxlbiwgby0+bGVuIC0gKGNieXRlIC0gby0+c3JjKSk7CisJCX0KKwkgICAgfQorCSAgICBhbGxvY2F0ZV9mcm9tKCZtbWFwLCBjb3B5ZHN0LCBjb3B5bGVuKTsKKworCSAgICBpZiAoY29weWxlbiA8IG8tPmxlbikgeworCQlvcCA9IHNwbGl0X21vdmVsaXN0KGNvcHlzcmMsIGNvcHlsZW4sIG9wKTsKKwkJbyA9ICpvcDsKKwkgICAgfQorCisJICAgIG12ID0gbmV3X21vdmVsaXN0KGNvcHlkc3QsIGNvcHlzcmMsIGNvcHlsZW4pOworCSAgICBkcHJpbnRmKCJDOiAweCUwOHggYnl0ZXMgYXQgMHglMDh4IC0+IDB4JTA4eFxuIiwKKwkJICAgIG12LT5sZW4sIG12LT5zcmMsIG12LT5kc3QpOworCSAgICAqbW92ZXMgPSBtdjsKKwkgICAgbW92ZXMgPSAmbXYtPm5leHQ7CisKKwkgICAgby0+c3JjID0gY29weWRzdDsKKworCSAgICBpZiAoY29weWxlbiA+IG5lZWRsZW4pIHsKKwkJLyogV2UgZG9uJ3QgbmVlZCBhbGwgdGhlIG1lbW9yeSB3ZSBmcmVlZCB1cC4gIE1hcmsgaXQgZnJlZS4gKi8KKwkJaWYgKGNvcHlzcmMgPCBuZWVkYmFzZSkgeworCQkgICAgYWRkX2ZyZWVsaXN0KCZtbWFwLCBjb3B5c3JjLCBuZWVkYmFzZSAtIGNvcHlzcmMsIFNNVF9GUkVFKTsKKwkJICAgIGNvcHlsZW4gLT0gKG5lZWRiYXNlIC0gY29weXNyYyk7CisJCX0KKwkJaWYgKGNvcHlsZW4gPiBuZWVkbGVuKSB7CisJCSAgICBhZGRfZnJlZWxpc3QoJm1tYXAsIGNvcHlzcmMgKyBuZWVkbGVuLCBjb3B5bGVuIC0gbmVlZGxlbiwKKwkJCQkgU01UX0ZSRUUpOworCQkgICAgY29weWxlbiA9IG5lZWRsZW47CisJCX0KKwkgICAgfQorCSAgICByZXZlcnNlID0gMDsKKwkgICAgZ290byBtb3ZlX2NodW5rOworCX0KKwlkcHJpbnRmKCJDYW5ub3QgZmluZCB0aGUgY2h1bmsgY29udGFpbmluZyB0aGUgY3JpdGljYWwgYnl0ZVxuIik7CisJZ290byBiYWlsOwkJLyogU3R1Y2shICovCisKK21vdmVfY2h1bms6CisJbW92ZV9jaHVuaygmbW92ZXMsICZtbWFwLCBmcCwgY29weWxlbik7CisgICAgfQorCisgICAgLyogRmluYWxseSwgYXBwZW5kIHRoZSBwb3N0Y29weSBjaGFpbiB0byB0aGUgZW5kIG9mIHRoZSBtb3ZlcyBsaXN0ICovCisgICAgZm9yIChvcCA9IG1vdmVzOyAobyA9ICpvcCk7IG9wID0gJm8tPm5leHQpIDsJLyogTG9jYXRlIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKyAgICAqb3AgPSBwb3N0Y29weTsKKyAgICBwb3N0Y29weSA9IE5VTEw7CisKKyAgICBydiA9IDA7CitiYWlsOgorICAgIGlmIChtbWFwKQorCXN5c2xpbnV4X2ZyZWVfbWVtbWFwKG1tYXApOworICAgIGlmIChmcmFncykKKwlmcmVlX21vdmVsaXN0KCZmcmFncyk7CisgICAgaWYgKHBvc3Rjb3B5KQorCWZyZWVfbW92ZWxpc3QoJnBvc3Rjb3B5KTsKKyAgICByZXR1cm4gcnY7Cit9CisKKyNpZmRlZiBURVNUCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIEZJTEUgKmY7CisgICAgdW5zaWduZWQgbG9uZyBkLCBzLCBsOworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqZnJhZ3M7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICoqZmVwID0gJmZyYWdzOworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqbXYsICptb3ZlczsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptZW1tYXA7CisgICAgY2hhciBsaW5lW0JVRlNJWl07CisKKyAgICAodm9pZClhcmdjOworCisgICAgbWVtbWFwID0gc3lzbGludXhfaW5pdF9tZW1tYXAoKTsKKworICAgIGYgPSBmb3Blbihhcmd2WzFdLCAiciIpOworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikgIT0gTlVMTCkgeworCWlmIChzc2NhbmYobGluZSwgIiVseCAlbHggJWx4IiwgJnMsICZkLCAmbCkgPT0gMykgeworCSAgICBpZiAoZCkgeworCQlpZiAocyA9PSAtMVVMKSB7CisJCSAgICBzeXNsaW51eF9hZGRfbWVtbWFwKCZtZW1tYXAsIGQsIGwsIFNNVF9aRVJPKTsKKwkJfSBlbHNlIHsKKwkJICAgIG12ID0gbmV3X21vdmVsaXN0KGQsIHMsIGwpOworCQkgICAgKmZlcCA9IG12OworCQkgICAgZmVwID0gJm12LT5uZXh0OworCQl9CisJICAgIH0gZWxzZSB7CisJCXN5c2xpbnV4X2FkZF9tZW1tYXAoJm1lbW1hcCwgcywgbCwgU01UX0ZSRUUpOworCSAgICB9CisJfQorICAgIH0KKyAgICBmY2xvc2UoZik7CisKKyAgICAqZmVwID0gTlVMTDsKKworICAgIGRwcmludGYoIklucHV0IG1vdmUgbGlzdDpcbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbW92ZWxpc3QoZnJhZ3MpOworICAgIGRwcmludGYoIklucHV0IGZyZWUgbGlzdDpcbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbWVtbWFwKG1lbW1hcCk7CisKKyAgICBpZiAoc3lzbGludXhfY29tcHV0ZV9tb3ZlbGlzdCgmbW92ZXMsIGZyYWdzLCBtZW1tYXApKSB7CisJcHJpbnRmKCJGYWlsZWQgdG8gY29tcHV0ZSBhIG1vdmUgc2VxdWVuY2VcbiIpOworCXJldHVybiAxOworICAgIH0gZWxzZSB7CisJZHByaW50ZigiRmluYWwgbW92ZSBsaXN0OlxuIik7CisJc3lzbGludXhfZHVtcF9tb3ZlbGlzdChtb3Zlcyk7CisJcmV0dXJuIDA7CisgICAgfQorfQorCisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L3B4ZV9kbnMuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9weGVfZG5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxM2I1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC9weGVfZG5zLmMKQEAgLTAsMCArMSw2NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHB4ZV9kbnMuYworICoKKyAqIFJlc29sdmUgYSBob3N0bmFtZSB2aWEgRE5TCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKworI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZS5oPgorCisvKiBSZXR1cm5zIHRoZSBzdGF0dXMgY29kZSBmcm9tIFBYRSAoMCBvbiBzdWNjZXNzKSwKKyAgIG9yIC0xIG9uIGludm9jYXRpb24gZmFpbHVyZSAqLwordWludDMyX3QgcHhlX2Rucyhjb25zdCBjaGFyICpob3N0bmFtZSkKK3sKKyAgICB1bmlvbiB7CisJdW5zaWduZWQgY2hhciBiWzRdOworCXVpbnQzMl90IGlwOworICAgIH0gcTsKKyAgICBjaGFyICpsbV9ob3N0bmFtZTsKKyAgICB1aW50MzJfdCBzdGF0dXM7CisKKyAgICAvKiBJcyB0aGlzIGEgZG90LXF1YWQ/ICovCisgICAgaWYgKHNzY2FuZihob3N0bmFtZSwgIiVoaHUuJWhodS4laGh1LiVoaHUiLAorCSAgICAgICAmcS5iWzBdLCAmcS5iWzFdLCAmcS5iWzJdLCAmcS5iWzNdKSA9PSA0KQorCXJldHVybiBxLmlwOworCisgICAgbG1faG9zdG5hbWUgPSBsc3RyZHVwKGhvc3RuYW1lKTsKKyAgICBpZiAoIWxtX2hvc3RuYW1lKQorCXJldHVybiAwOworCisgICAgc3RhdHVzID0gZG5zX3Jlc29sdihsbV9ob3N0bmFtZSk7CisKKyAgICBsZnJlZShsbV9ob3N0bmFtZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L3B4ZV9nZXRfY2FjaGVkLmMgYi9jb20zMi9saWIvc3lzbGludXgvcHhlX2dldF9jYWNoZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDkwYTRjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L3B4ZV9nZXRfY2FjaGVkLmMKQEAgLTAsMCArMSw4OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHB4ZV9nZXRfY2FjaGVkLmMKKyAqCisgKiBQWEUgY2FsbCAiZ2V0IGNhY2hlZCBpbmZvIgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorCisjaW5jbHVkZSA8c3lzbGludXgvcHhlLmg+CisKKy8qIFJldHVybnMgdGhlIHN0YXR1cyBjb2RlIGZyb20gUFhFICgwIG9uIHN1Y2Nlc3MpLAorICAgb3IgLTEgb24gaW52b2NhdGlvbiBmYWlsdXJlICovCitpbnQgcHhlX2dldF9jYWNoZWRfaW5mbyhpbnQgbGV2ZWwsIHZvaWQgKipidWYsIHNpemVfdCAqIGxlbikKK3sKKyAgICBjb25zdCBpbnQgbWF4X2RoY3BfcGFja2V0ID0gMjA0ODsKKyAgICB0X1BYRU5WX0dFVF9DQUNIRURfSU5GTyAqZ2NpOworICAgIHZvaWQgKmJidWYsICpuYnVmOworICAgIGludCBlcnI7CisKKyAgICBnY2kgPSBsbWFsbG9jKHNpemVvZiAqZ2NpICsgbWF4X2RoY3BfcGFja2V0KTsKKyAgICBpZiAoIWdjaSkKKwlyZXR1cm4gLTE7CisKKyAgICBiYnVmID0gJmdjaVsxXTsKKworICAgIGdjaS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX0ZBSUxVUkU7CisgICAgZ2NpLT5QYWNrZXRUeXBlID0gbGV2ZWw7CisgICAgZ2NpLT5CdWZmZXJTaXplID0gZ2NpLT5CdWZmZXJMaW1pdCA9IG1heF9kaGNwX3BhY2tldDsKKyAgICBnY2ktPkJ1ZmZlci5zZWcgPSBTRUcoYmJ1Zik7CisgICAgZ2NpLT5CdWZmZXIub2ZmcyA9IE9GRlMoYmJ1Zik7CisKKyAgICBlcnIgPSBweGVfY2FsbChQWEVOVl9HRVRfQ0FDSEVEX0lORk8sIGdjaSk7CisKKyAgICBpZiAoZXJyKSB7CisJZXJyID0gLTE7CisJZ290byBleGl0OworICAgIH0KKworICAgIGlmIChnY2ktPlN0YXR1cykgeworCWVyciA9IGdjaS0+U3RhdHVzOworCWdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBuYnVmID0gbWFsbG9jKGdjaS0+QnVmZmVyU2l6ZSk7CisgICAgaWYgKCFuYnVmKSB7CisJZXJyID0gLTE7CisJZ290byBleGl0OworICAgIH0KKworICAgIG1lbWNweShuYnVmLCBiYnVmLCBnY2ktPkJ1ZmZlclNpemUpOworCisgICAgKmJ1ZiA9IG5idWY7CisgICAgKmxlbiA9IGdjaS0+QnVmZmVyU2l6ZTsKKyAgICBlcnIgPSAwOworCitleGl0OgorICAgIGxmcmVlKGdjaSk7CisgICAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9weGVfZ2V0X25pYy5jIGIvY29tMzIvbGliL3N5c2xpbnV4L3B4ZV9nZXRfbmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyNTZmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC9weGVfZ2V0X25pYy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBweGVfZ2V0X2NhY2hlZC5jCisgKgorICogUFhFIGNhbGwgImdldCBjYWNoZWQgaW5mbyIKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKworI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZS5oPgorCisvKiBSZXR1cm5zIHRoZSBzdGF0dXMgY29kZSBmcm9tIFBYRSAoMCBvbiBzdWNjZXNzKSwKKyAgIG9yIC0xIG9uIGludm9jYXRpb24gZmFpbHVyZSAqLworaW50IHB4ZV9nZXRfbmljX3R5cGUodF9QWEVOVl9VTkRJX0dFVF9OSUNfVFlQRSAqZ250KQoreworICAgIHRfUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUgKmxnbnQ7CisgICAgaW50IGVycjsKKworICAgIGxnbnQgPSBsemFsbG9jKHNpemVvZiAqbGdudCk7CisgICAgaWYgKCFsZ250KQorCXJldHVybiAtMTsKKworICAgIGVyciA9IHB4ZV9jYWxsKFBYRU5WX1VORElfR0VUX05JQ19UWVBFLCBsZ250KTsKKworICAgIG1lbWNweShnbnQsIGxnbnQsIHNpemVvZih0X1BYRU5WX1VORElfR0VUX05JQ19UWVBFKSk7CisgICAgbGZyZWUobGdudCk7CisKKyAgICBpZiAoZXJyKQorCXJldHVybiAtMTsKKworICAgIHJldHVybiBnbnQtPlN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9yZWJvb3QuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9yZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTNlYjJiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L3JlYm9vdC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiByZWJvb3QuYworICoKKyAqIFByb3Zva2UgYSBzeXN0ZW0gcmVib290CisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvcmVib290Lmg+CisKK19fbm9yZXR1cm4gc3lzbGludXhfcmVib290KGludCB3YXJtKQoreworICAgIHVpbnQxNl90ICpjb25zdCByZWJvb3RfZmxhZyA9ICh1aW50MTZfdCAqKSAweDQ3MjsKKworICAgICpyZWJvb3RfZmxhZyA9IHdhcm0gPyAweDEyMzQgOiAwOworICAgIF9fZmFyY2FsbCgweGYwMDAsIDB4ZmZmMCwgJl9fY29tMzJfemVyb19yZWdzLCBOVUxMKTsKKworICAgIHdoaWxlICgxKQorCWFzbSB2b2xhdGlsZSAoImhsdCIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L3J1bl9jb21tYW5kLmMgYi9jb20zMi9saWIvc3lzbGludXgvcnVuX2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTRkYzQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L3J1bl9jb21tYW5kLmMKQEAgLTAsMCArMSw0NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3QuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisKK2ludCBzeXNsaW51eF9ydW5fY29tbWFuZChjb25zdCBjaGFyICpjb21tYW5kKQoreworICAgIGNoYXIgKmxtX2NvbW1hbmQgPSBsc3RyZHVwKGNvbW1hbmQpOworCisgICAgaWYgKCFsbV9jb21tYW5kKQorCXJldHVybiAtMTsKKyAgICAKKyAgICBsb2FkX2tlcm5lbChsbV9jb21tYW5kKTsKKworICAgIC8qIFNob3VsZCBub3QgcmV0dXJuIGV2ZW4gb24gZmFpbHVyZSwgYnV0IGluIGNhc2UuLi4gKi8KKyAgICBsZnJlZShsbV9jb21tYW5kKTsKKyAgICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvcnVuX2RlZmF1bHQuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9ydW5fZGVmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZmE1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvcnVuX2RlZmF1bHQuYwpAQCAtMCwwICsxLDM5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworZXh0ZXJuIGNvbnN0IGNoYXIgKmRlZmF1bHRfY21kOworCitfX25vcmV0dXJuIHN5c2xpbnV4X3J1bl9kZWZhdWx0KHZvaWQpCit7CisgICAgbG9hZF9rZXJuZWwoZGVmYXVsdF9jbWQpOworICAgIC8qIFNob3VsZCBub3QgcmV0dXJuIGV2ZW4gb24gZmFpbHVyZSAqLworICAgIGZvciAoOzspIDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9ydW5pbWFnZS5jIGIvY29tMzIvbGliL3N5c2xpbnV4L3J1bmltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjZDAyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC9ydW5pbWFnZS5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBydW5pbWFnZS5jCisgKgorICogTG9hZCBhbmQgcnVuIGEgc3lzbGludXggaW1hZ2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3QuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisKK3ZvaWQgc3lzbGludXhfcnVuX2tlcm5lbF9pbWFnZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqY21kbGluZSwKKwkJCSAgICAgICB1aW50MzJfdCBpcGFwcGVuZF9mbGFncywgdWludDMyX3QgdHlwZSkKK3sKKyAgICBjaGFyICpiYmNtZGxpbmUgID0gTlVMTDsKKyAgICBzaXplX3QgbGVuOworICAgIGludCBydjsKKworICAgIC8qICsyIGZvciBOVUxMIGFuZCBzcGFjZSAqLworICAgIGxlbiA9IHN0cmxlbihmaWxlbmFtZSkgKyBzdHJsZW4oY21kbGluZSkgKyAyOworICAgIGJiY21kbGluZSA9IG1hbGxvYyhsZW4pOworICAgIGlmICghYmJjbWRsaW5lKQorCXJldHVybjsKKworICAgIHJ2ID0gc25wcmludGYoYmJjbWRsaW5lLCBsZW4sICIlcyAlcyIsIGZpbGVuYW1lLCBjbWRsaW5lKTsKKyAgICBpZiAocnYgPT0gLTEgfHwgKHNpemVfdClydiA+PSBsZW4pCisJcmV0dXJuOworCisgICAgU3lzQXBwZW5kcyA9IGlwYXBwZW5kX2ZsYWdzOworICAgIGV4ZWN1dGUoYmJjbWRsaW5lLCB0eXBlLCB0cnVlKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9zZXJpYWwuYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFlODUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L3NlcmlhbC5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC9zZXJpYWwuYworICoKKyAqIFNZU0xJTlVYIHNlcmlhbCBjb25zb2xlIHF1ZXJ5CisgKi8KKworI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RydWN0IHN5c2xpbnV4X3NlcmlhbF9jb25zb2xlX2luZm8gX19zeXNsaW51eF9zZXJpYWxfY29uc29sZV9pbmZvOworCit2b2lkIF9fc3lzbGludXhfc2V0X3NlcmlhbF9jb25zb2xlX2luZm8odm9pZCkKK3sKKyAgICB1aW50MTZfdCBpb2Jhc2UsIGRpdmlzb3IsIGZsb3djdGw7CisKKyAgICBmaXJtd2FyZS0+Z2V0X3NlcmlhbF9jb25zb2xlX2luZm8oJmlvYmFzZSwgJmRpdmlzb3IsICZmbG93Y3RsKTsKKworICAgIF9fc3lzbGludXhfc2VyaWFsX2NvbnNvbGVfaW5mby5pb2Jhc2UgPSBpb2Jhc2U7CisgICAgX19zeXNsaW51eF9zZXJpYWxfY29uc29sZV9pbmZvLmRpdmlzb3IgPSBkaXZpc29yOworICAgIF9fc3lzbGludXhfc2VyaWFsX2NvbnNvbGVfaW5mby5mbG93Y3RsID0gZmxvd2N0bDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9zZXR1cF9kYXRhLmMgYi9jb20zMi9saWIvc3lzbGludXgvc2V0dXBfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNmM1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvc2V0dXBfZGF0YS5jCkBAIC0wLDAgKzEsNDcgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9saW51eC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisKK3N0cnVjdCBzZXR1cF9kYXRhICpzZXR1cF9kYXRhX2luaXQodm9pZCkKK3sKKyAgICBzdHJ1Y3Qgc2V0dXBfZGF0YSAqc2V0dXBfZGF0YTsKKworICAgIHNldHVwX2RhdGEgPSB6YWxsb2Moc2l6ZW9mKCpzZXR1cF9kYXRhKSk7CisgICAgaWYgKCFzZXR1cF9kYXRhKQorCXJldHVybiBOVUxMOworCisgICAgc2V0dXBfZGF0YS0+cHJldiA9IHNldHVwX2RhdGEtPm5leHQgPSBzZXR1cF9kYXRhOworICAgIHJldHVybiBzZXR1cF9kYXRhOworfQorCitpbnQgc2V0dXBfZGF0YV9hZGQoc3RydWN0IHNldHVwX2RhdGEgKmhlYWQsIHVpbnQzMl90IHR5cGUsCisJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3Qgc2V0dXBfZGF0YSAqc2V0dXBfZGF0YTsKKworCXNldHVwX2RhdGEgPSB6YWxsb2Moc2l6ZW9mKCpzZXR1cF9kYXRhKSk7CisJaWYgKCFzZXR1cF9kYXRhKQorCSAgICByZXR1cm4gLTE7CisKKwlzZXR1cF9kYXRhLT5kYXRhICAgICA9IGRhdGE7CisJc2V0dXBfZGF0YS0+aGRyLmxlbiAgPSBkYXRhX2xlbjsKKwlzZXR1cF9kYXRhLT5oZHIudHlwZSA9IHR5cGU7CisJc2V0dXBfZGF0YS0+cHJldiAgICAgPSBoZWFkLT5wcmV2OworCXNldHVwX2RhdGEtPm5leHQgICAgID0gaGVhZDsKKwloZWFkLT5wcmV2LT5uZXh0ICAgICA9IHNldHVwX2RhdGE7CisJaGVhZC0+cHJldiAgICAgICAgICAgPSBzZXR1cF9kYXRhOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXR1cF9kYXRhX2xvYWQoc3RydWN0IHNldHVwX2RhdGEgKmhlYWQsIHVpbnQzMl90IHR5cGUsCisJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwl2b2lkICpkYXRhOworCXNpemVfdCBsZW47CisKKwlpZiAobG9hZGZpbGUoZmlsZW5hbWUsICZkYXRhLCAmbGVuKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHNldHVwX2RhdGFfYWRkKGhlYWQsIHR5cGUsIGRhdGEsIGxlbik7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvc2h1ZmZsZS5jIGIvY29tMzIvbGliL3N5c2xpbnV4L3NodWZmbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjljMjJiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L3NodWZmbGUuYwpAQCAtMCwwICsxLDI1MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHNodWZmbGUuYworICoKKyAqIENvbW1vbiBjb2RlIGZvciAic2h1ZmZsZSBhbmQgYm9vdCIgb3BlcmF0aW9uOyBnZW5lcmF0ZXMgYSBzaHVmZmxlIGxpc3QKKyAqIGFuZCBwdXRzIGl0IGluIHRoZSBib3VuY2UgYnVmZmVyLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNodWZmbGUKKyAqIGRlc2NyaXB0b3JzLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorCitzdHJ1Y3Qgc2h1ZmZsZV9kZXNjcmlwdG9yIHsKKyAgICB1aW50MzJfdCBkc3QsIHNyYywgbGVuOworfTsKKworLyoKKyAqIEFsbG9jYXRlIGRlc2NyaXB0b3IgbWVtb3J5IGluIHRoZXNlIGNodW5rczsgaWYgdGhpcyBpcyBsYXJnZSB3ZSBtYXkKKyAqIHdhc3RlIG1lbW9yeSwgaWYgaXQgaXMgc21hbGwgd2UgbWF5IGdldCBzbG93IGNvbnZlcmdlbmNlLgorICovCisjZGVmaW5lIERFU0NfQkxPQ0tfU0laRQkyNTYKKworaW50IHN5c2xpbnV4X2RvX3NodWZmbGUoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICpmcmFnbGlzdCwKKwkJCXN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKm1lbW1hcCwKKwkJCWFkZHJfdCBlbnRyeV9wb2ludCwgYWRkcl90IGVudHJ5X3R5cGUsCisJCQl1aW50MTZfdCBib290ZmxhZ3MpCit7CisgICAgaW50IHJ2ID0gLTE7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICptb3ZlcyA9IE5VTEwsICptcDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICpyeG1hcCA9IE5VTEwsICptbDsKKyAgICBzdHJ1Y3Qgc2h1ZmZsZV9kZXNjcmlwdG9yICpkcCwgKmRidWY7CisgICAgaW50IG5wOworICAgIGludCBkZXNjX2Jsb2NrcywgbmVlZF9ibG9ja3M7CisgICAgaW50IG5lZWRfcHRyczsKKyAgICBhZGRyX3QgZGVzY3pvbmUsIGRlc2NmcmVlLCBkZXNjYWRkcjsKKyAgICBpbnQgbm1vdmVzLCBuemVybzsKKworI2lmbmRlZiBfX0ZJUk1XQVJFX0JJT1NfXworICAgIGVycm5vID0gRU5PU1lTOworICAgIHJldHVybiAtMTsJCQkvKiBOb3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSovCisjZW5kaWYKKworICAgIGRlc2NhZGRyID0gMDsKKyAgICBkcCA9IGRidWYgPSBOVUxMOworCisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiB6ZXJvIG9wZXJhdGlvbnMgKi8KKyAgICBuemVybyA9IDA7CisgICAgZm9yIChtbCA9IG1lbW1hcDsgbWwtPnR5cGUgIT0gU01UX0VORDsgbWwgPSBtbC0+bmV4dCkgeworCWlmIChtbC0+dHlwZSA9PSBTTVRfWkVSTykKKwkgICAgbnplcm8rKzsKKyAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBsYXJnZXN0IGNvbnRpZ3VvdXMgcmVnaW9uIHVudXNlZCBieSBpbnB1dCAqYW5kKiBvdXRwdXQ7CisgICAgICAgdGhpcyBpcyB3aGVyZSB3ZSBwdXQgdGhlIG1vdmUgZGVzY3JpcHRvciBsaXN0IGFuZCBzYWZlIGFyZWEgKi8KKworICAgIHJ4bWFwID0gc3lzbGludXhfZHVwX21lbW1hcChtZW1tYXApOworICAgIGlmICghcnhtYXApCisJZ290byBiYWlsOworICAgIC8qIEF2b2lkIHVzaW5nIHRoZSBsb3cgMSBNQiBmb3IgdGhlIHNodWZmbGUgYXJlYSAtLSB0aGlzIGF2b2lkcworICAgICAgIHBvc3NpYmxlIGludGVyZmVyZW5jZSB3aXRoIHRoZSByZWFsIG1vZGUgY29kZSBvciBzdGFjayAqLworICAgIGlmIChzeXNsaW51eF9hZGRfbWVtbWFwKCZyeG1hcCwgMCwgMTAyNCAqIDEwMjQsIFNNVF9SRVNFUlZFRCkpCisJZ290byBiYWlsOworICAgIGZvciAobXAgPSBmcmFnbGlzdDsgbXA7IG1wID0gbXAtPm5leHQpIHsKKwlpZiAoc3lzbGludXhfYWRkX21lbW1hcCgmcnhtYXAsIG1wLT5zcmMsIG1wLT5sZW4sIFNNVF9BTExPQykgfHwKKwkgICAgc3lzbGludXhfYWRkX21lbW1hcCgmcnhtYXAsIG1wLT5kc3QsIG1wLT5sZW4sIFNNVF9BTExPQykpCisJICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgaWYgKHN5c2xpbnV4X21lbW1hcF9sYXJnZXN0KHJ4bWFwLCBTTVRfRlJFRSwgJmRlc2N6b25lLCAmZGVzY2ZyZWUpKQorCWdvdG8gYmFpbDsKKworICAgIHN5c2xpbnV4X2ZyZWVfbWVtbWFwKHJ4bWFwKTsKKworICAgIGRwcmludGYoImRlc2N6b25lID0gMHglMDh4LCBkZXNjZnJlZSA9IDB4JTA4eFxuIiwgZGVzY3pvbmUsIGRlc2NmcmVlKTsKKworICAgIHJ4bWFwID0gc3lzbGludXhfZHVwX21lbW1hcChtZW1tYXApOworICAgIGlmICghcnhtYXApCisJZ290byBiYWlsOworCisgICAgZGVzY19ibG9ja3MgPSAobnplcm8gKyBERVNDX0JMT0NLX1NJWkUgLSAxKSAvIERFU0NfQkxPQ0tfU0laRTsKKyAgICBmb3IgKDs7KSB7CisJLyogV2Ugd2FudCAoZGVzY19ibG9ja3MpIGFsbG9jYXRpb24gYmxvY2tzLCBwbHVzIHRoZSB0ZXJtaW5hdGluZworCSAgIGRlc2NyaXB0b3IsIHBsdXMgdGhlIHNodWZmbGVyIHNhZmUgYXJlYS4gKi8KKwlhZGRyX3QgZGVzY21lbSA9IGRlc2NfYmxvY2tzICoKKwkgICAgc2l6ZW9mKHN0cnVjdCBzaHVmZmxlX2Rlc2NyaXB0b3IpICogREVTQ19CTE9DS19TSVpFCisJICAgICsgc2l6ZW9mKHN0cnVjdCBzaHVmZmxlX2Rlc2NyaXB0b3IpCisJICAgICsgc3lzbGludXhfc2h1ZmZsZXJfc2l6ZSgpOworCisJZGVzY2FkZHIgPSAoZGVzY3pvbmUgKyBkZXNjZnJlZSAtIGRlc2NtZW0pICYgfjM7CisKKwlpZiAoZGVzY2FkZHIgPCBkZXNjem9uZSkKKwkgICAgZ290byBiYWlsOwkJLyogTm8gbWVtb3J5IGJsb2NrIGxhcmdlIGVub3VnaCAqLworCisJLyogTWFyayBtZW1vcnkgdXNlZCBieSBzaHVmZmxlIGRlc2NyaXB0b3JzIGFzIHJlc2VydmVkICovCisJaWYgKHN5c2xpbnV4X2FkZF9tZW1tYXAoJnJ4bWFwLCBkZXNjYWRkciwgZGVzY21lbSwgU01UX1JFU0VSVkVEKSkKKwkgICAgZ290byBiYWlsOworCisjaWYgREVCVUcgPiAxCisJc3lzbGludXhfZHVtcF9tb3ZlbGlzdChmcmFnbGlzdCk7CisjZW5kaWYKKworCWlmIChzeXNsaW51eF9jb21wdXRlX21vdmVsaXN0KCZtb3ZlcywgZnJhZ2xpc3QsIHJ4bWFwKSkKKwkgICAgZ290byBiYWlsOworCisJbm1vdmVzID0gMDsKKwlmb3IgKG1wID0gbW92ZXM7IG1wOyBtcCA9IG1wLT5uZXh0KQorCSAgICBubW92ZXMrKzsKKworCW5lZWRfYmxvY2tzID0gKG5tb3ZlcyArIG56ZXJvICsgREVTQ19CTE9DS19TSVpFIC0gMSkgLyBERVNDX0JMT0NLX1NJWkU7CisKKwlpZiAoZGVzY19ibG9ja3MgPj0gbmVlZF9ibG9ja3MpCisJICAgIGJyZWFrOwkJLyogU3VmZmljaWVudCBtZW1vcnksIHlheSAqLworCisJZGVzY19ibG9ja3MgPSBuZWVkX2Jsb2NrczsJLyogVHJ5IGFnYWluLi4uICovCisgICAgfQorCisjaWYgREVCVUcgPiAxCisgICAgZHByaW50ZigiRmluYWwgbW92ZWxpc3Q6XG4iKTsKKyAgICBzeXNsaW51eF9kdW1wX21vdmVsaXN0KG1vdmVzKTsKKyNlbmRpZgorCisgICAgc3lzbGludXhfZnJlZV9tZW1tYXAocnhtYXApOworICAgIHJ4bWFwID0gTlVMTDsKKworICAgIG5lZWRfcHRycyA9IG5tb3ZlcyArIG56ZXJvICsgMTsKKyAgICBkYnVmID0gbWFsbG9jKG5lZWRfcHRycyAqIHNpemVvZihzdHJ1Y3Qgc2h1ZmZsZV9kZXNjcmlwdG9yKSk7CisgICAgaWYgKCFkYnVmKQorCWdvdG8gYmFpbDsKKworI2lmIERFQlVHCisgICAgeworCWFkZHJfdCBkZXNjb2ZmcyA9IGRlc2NhZGRyIC0gKGFkZHJfdCkgZGJ1ZjsKKworCWRwcmludGYoIm5tb3ZlcyA9ICVkLCBuemVybyA9ICVkLCBkYnVmID0gJXAsIG9mZnMgPSAweCUwOHhcbiIsCisJCW5tb3Zlcywgbnplcm8sIGRidWYsIGRlc2NvZmZzKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIENvcHkgdGhlIG1vdmUgc2VxdWVuY2UgaW50byB0aGUgZGVzY3JpcHRvciBidWZmZXIgKi8KKyAgICBucCA9IDA7CisgICAgZHAgPSBkYnVmOworICAgIGZvciAobXAgPSBtb3ZlczsgbXA7IG1wID0gbXAtPm5leHQpIHsKKwlkcC0+ZHN0ID0gbXAtPmRzdDsKKwlkcC0+c3JjID0gbXAtPnNyYzsKKwlkcC0+bGVuID0gbXAtPmxlbjsKKwlkcHJpbnRmMigiWyAlMDh4ICUwOHggJTA4eCBdXG4iLCBkcC0+ZHN0LCBkcC0+c3JjLCBkcC0+bGVuKTsKKwlkcCsrOworCW5wKys7CisgICAgfQorCisgICAgLyogQ29weSBiemVybyBvcGVyYXRpb25zIGludG8gdGhlIGRlc2NyaXB0b3IgYnVmZmVyICovCisgICAgZm9yIChtbCA9IG1lbW1hcDsgbWwtPnR5cGUgIT0gU01UX0VORDsgbWwgPSBtbC0+bmV4dCkgeworCWlmIChtbC0+dHlwZSA9PSBTTVRfWkVSTykgeworCSAgICBkcC0+ZHN0ID0gbWwtPnN0YXJ0OworCSAgICBkcC0+c3JjID0gKGFkZHJfdCkgLSAxOwkvKiBiemVybyByZWdpb24gKi8KKwkgICAgZHAtPmxlbiA9IG1sLT5uZXh0LT5zdGFydCAtIG1sLT5zdGFydDsKKwkgICAgZHByaW50ZjIoIlsgJTA4eCAlMDh4ICUwOHggXVxuIiwgZHAtPmRzdCwgZHAtPnNyYywgZHAtPmxlbik7CisJICAgIGRwKys7CisJICAgIG5wKys7CisJfQorICAgIH0KKworICAgIC8qIEZpbmFsbHksIHJlY29yZCB0aGUgdGVybWluYXRpb24gZW50cnkgKi8KKyAgICBkcC0+ZHN0ID0gZW50cnlfcG9pbnQ7CisgICAgZHAtPnNyYyA9IGVudHJ5X3R5cGU7CisgICAgZHAtPmxlbiA9IDA7CisgICAgZHArKzsKKyAgICBucCsrOworCisgICAgaWYgKG5wICE9IG5lZWRfcHRycykgeworCWRwcmludGYoIiEhISBucCA9ICVkIDogbm1vdmVzID0gJWQsIG56ZXJvID0gJWQsIGRlc2NfYmxvY2tzID0gJWRcbiIsCisJCW5wLCBubW92ZXMsIG56ZXJvLCBkZXNjX2Jsb2Nrcyk7CisgICAgfQorCisgICAgcnYgPSAwOworCitiYWlsOgorICAgIC8qIFRoaXMgaXMgc2FmZSBvbmx5IGJlY2F1c2UgZnJlZSgpIGRvZXNuJ3QgdXNlIHRoZSBib3VuY2UgYnVmZmVyISEhISAqLworICAgIGlmIChtb3ZlcykKKwlzeXNsaW51eF9mcmVlX21vdmVsaXN0KG1vdmVzKTsKKyAgICBpZiAocnhtYXApCisJc3lzbGludXhfZnJlZV9tZW1tYXAocnhtYXApOworCisgICAgaWYgKHJ2KQorCXJldHVybiBydjsKKworICAgIC8qIEFjdHVhbGx5IGRvIGl0Li4uICovCisgICAgYmlvc19kb19zaHVmZmxlX2FuZF9ib290KGJvb3RmbGFncywgZGVzY2FkZHIsIGRidWYsCisJCQkgICAgIChzaXplX3QpZHAgLSAoc2l6ZV90KWRidWYpOworCisgICAgcmV0dXJuIC0xOwkJCS8qIFNob3VsZG4ndCBoYXZlIHJldHVybmVkISAqLworfQorCisvKgorICogQ29tbW9uIGhlbHBlciByb3V0aW5lOiB0YWtlcyBhIG1lbW9yeSBtYXAgYW5kIGJsb3RzIG91dCB0aGUKKyAqIHpvbmVzIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGZyYWdsaXN0CisgKi8KK3N0cnVjdCBzeXNsaW51eF9tZW1tYXAgKnN5c2xpbnV4X3RhcmdldF9tZW1tYXAoc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0CisJCQkJCSAgICAgICAqZnJhZ2xpc3QsCisJCQkJCSAgICAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptZW1tYXApCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqdG1hcDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbW92ZWxpc3QgKm1wOworCisgICAgdG1hcCA9IHN5c2xpbnV4X2R1cF9tZW1tYXAobWVtbWFwKTsKKyAgICBpZiAoIXRtYXApCisJcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKG1wID0gZnJhZ2xpc3Q7IG1wOyBtcCA9IG1wLT5uZXh0KSB7CisJaWYgKHN5c2xpbnV4X2FkZF9tZW1tYXAoJnRtYXAsIG1wLT5kc3QsIG1wLT5sZW4sIFNNVF9BTExPQykpIHsKKwkgICAgc3lzbGludXhfZnJlZV9tZW1tYXAodG1hcCk7CisJICAgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gdG1hcDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC9zaHVmZmxlX3BtLmMgYi9jb20zMi9saWIvc3lzbGludXgvc2h1ZmZsZV9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzA1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvc2h1ZmZsZV9wbS5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzaHVmZmxlX3BtLmMKKyAqCisgKiBTaHVmZmxlIGFuZCBib290IHRvIHByb3RlY3RlZCBtb2RlIGNvZGUKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3RwbS5oPgorCitpbnQgc3lzbGludXhfc2h1ZmZsZV9ib290X3BtKHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqZnJhZ2xpc3QsCisJCQkgICAgIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKm1lbW1hcCwKKwkJCSAgICAgdWludDE2X3QgYm9vdGZsYWdzLCBzdHJ1Y3Qgc3lzbGludXhfcG1fcmVncyAqcmVncykKK3sKKyAgICB1aW50OF90IGhhbmRvZmZfY29kZVs5ICogNV0sICpwOworICAgIGNvbnN0IHVpbnQzMl90ICpycDsKKyAgICBpbnQgaSwgcnY7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqdG1hcDsKKyAgICBhZGRyX3QgcmVnc3R1Yiwgc3R1YmxlbjsKKworICAgIHRtYXAgPSBzeXNsaW51eF90YXJnZXRfbWVtbWFwKGZyYWdsaXN0LCBtZW1tYXApOworICAgIGlmICghdG1hcCkKKwlyZXR1cm4gLTE7CisKKyAgICByZWdzdHViID0gMHg4MDA7CQkvKiBMb2NhdGUgYW55d2hlcmUgYWJvdmUgdGhpcyBwb2ludCAqLworICAgIHN0dWJsZW4gPSBzaXplb2YgaGFuZG9mZl9jb2RlOworICAgIHJ2ID0gc3lzbGludXhfbWVtbWFwX2ZpbmRfdHlwZSh0bWFwLCBTTVRfRlJFRSwgJnJlZ3N0dWIsICZzdHVibGVuLCAxKTsKKyAgICBzeXNsaW51eF9mcmVlX21lbW1hcCh0bWFwKTsKKyAgICBpZiAocnYpCisJcmV0dXJuIC0xOworCisgICAgLyogQnVpbGQgcmVnaXN0ZXItc2V0dGluZyBzdHViICovCisgICAgcCA9IGhhbmRvZmZfY29kZTsKKyAgICBycCA9IChjb25zdCB1aW50MzJfdCAqKXJlZ3M7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCSpwID0gMHhiOCArIGk7CQkvKiBNT1YgZ3ByLGltbTMyICovCisJKih1aW50MzJfdCAqKSAocCArIDEpID0gKnJwKys7CisJcCArPSA1OworICAgIH0KKyAgICAqcCA9IDB4ZTk7CQkJLyogSk1QICovCisgICAgKih1aW50MzJfdCAqKSAocCArIDEpID0gcmVncy0+ZWlwIC0gcmVnc3R1YiAtIHNpemVvZiBoYW5kb2ZmX2NvZGU7CisKKyAgICAvKiBBZGQgcmVnaXN0ZXItc2V0dGluZyBzdHViIHRvIHNodWZmbGUgbGlzdCAqLworICAgIGlmIChzeXNsaW51eF9hZGRfbW92ZWxpc3QoJmZyYWdsaXN0LCByZWdzdHViLCAoYWRkcl90KSBoYW5kb2ZmX2NvZGUsCisJCQkgICAgICBzaXplb2YgaGFuZG9mZl9jb2RlKSkKKwlyZXR1cm4gLTE7CisKKyAgICByZXR1cm4gc3lzbGludXhfZG9fc2h1ZmZsZShmcmFnbGlzdCwgbWVtbWFwLCByZWdzdHViLCAxLCBib290ZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L3NodWZmbGVfcm0uYyBiL2NvbTMyL2xpYi9zeXNsaW51eC9zaHVmZmxlX3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNWY0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC9zaHVmZmxlX3JtLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzaHVmZmxlX3JtLmMKKyAqCisgKiBTaHVmZmxlIGFuZCBib290IHRvIHByb3RlY3RlZCBtb2RlIGNvZGUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L21vdmViaXRzLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYm9vdHJtLmg+CisKK2VudW0gZ3ByX2luZGV4IHsgUl9BWCwgUl9DWCwgUl9EWCwgUl9CWCwgUl9TUCwgUl9CUCwgUl9TSSwgUl9ESSB9OworZW51bSBzZWdfaW5kZXggeyBSX0VTLCBSX0NTLCBSX1NTLCBSX0RTLCBSX0ZTLCBSX0dTIH07CisKKyNkZWZpbmUgU1Q4KFAsVikJCQkJCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICB1aW50OF90ICpfcCA9ICh2b2lkICopKFApOwkJCQkJXAorICAgICpfcCsrID0gKFYpOwkJCQkJCVwKKyAgICAoUCkgPSAodm9pZCAqKV9wOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCk7CisjZGVmaW5lIFNUMTYoUCxWKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJXAorICAgIHVpbnQxNl90ICpfcCA9ICh2b2lkICopKFApOwkJCQkJXAorICAgICpfcCsrID0gKFYpOwkJCQkJCVwKKyAgICAoUCkgPSAodm9pZCAqKV9wOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1QzMihQLFYpCQkJCQkJXAorICBkbyB7CQkJCQkJCQlcCisgICAgdWludDMyX3QgKl9wID0gKHZvaWQgKikoUCk7CQkJCQlcCisgICAgKl9wKysgPSAoVik7CQkJCQkJXAorICAgIChQKSA9ICh2b2lkICopX3A7CQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1PVl9UT19TRUcoUCxTLFIpCQkJCQlcCisgICAgU1QxNihQLCAweGMwOGUgKyAoKFIpIDw8IDgpICsgKChTKSA8PCAxMSkpCisjZGVmaW5lIE1PVl9UT19SMTYoUCxSLFYpCQkJCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICBTVDgoUCwgMHhiOCArIChSKSk7CQkJCQkJXAorICAgIFNUMTYoUCwgVik7CQkJCQkJCVwKKyAgfSAgd2hpbGUgKDApCisjZGVmaW5lIE1PVl9UT19SMzIoUCxSLFYpCQkJCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICBTVDE2KFAsIDB4Yjg2NiArICgoUikgPDwgOCkpOwkJCQlcCisgICAgU1QzMihQLCBWKTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCitpbnQgc3lzbGludXhfc2h1ZmZsZV9ib290X3JtKHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqZnJhZ2xpc3QsCisJCQkgICAgIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKm1lbW1hcCwKKwkJCSAgICAgdWludDE2X3QgYm9vdGZsYWdzLCBzdHJ1Y3Qgc3lzbGludXhfcm1fcmVncyAqcmVncykKK3sKKyAgICBjb25zdCBzdHJ1Y3Qgc3lzbGludXhfcm1fcmVnc19hbHQgeworCXVpbnQxNl90IHNlZ1s2XTsKKwl1aW50MzJfdCBncHJbOF07CisJdWludDMyX3QgY3NpcDsKKwlib29sIHN0aTsKKyAgICB9ICpycDsKKyAgICBpbnQgaSwgcnY7CisgICAgdWludDhfdCBoYW5kb2ZmX2NvZGVbOCArIDUgKiA1ICsgOCAqIDYgKyAxICsgNV0sICpwOworICAgIHVpbnQxNl90IG9mZjsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICp0bWFwOworICAgIGFkZHJfdCByZWdzdHViLCBzdHVibGVuOworICAgIC8qIEFzc2lnbiBHUFJzIGZvciBlYWNoIHNyZWcsIGRvbid0IHVzZSBBWCBhbmQgU1AgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBncHJfZm9yX3NlZ1s2XSA9CisJeyBSX0NYLCBSX0RYLCBSX0JYLCBSX0JQLCBSX1NJLCBSX0RJIH07CisKKyAgICB0bWFwID0gc3lzbGludXhfdGFyZ2V0X21lbW1hcChmcmFnbGlzdCwgbWVtbWFwKTsKKyAgICBpZiAoIXRtYXApCisJcmV0dXJuIC0xOworCisgICAgLyoKKyAgICAgKiBTZWFyY2ggZm9yIGEgZ29vZCBwbGFjZSB0byBwdXQgdGhlIHJlYWwtbW9kZSByZWdpc3RlciBzdHViLgorICAgICAqIFdlIHByZWZlciBpdCBhcyBsb3cgYXMgcG9zc2libGUgYWJvdmUgMHg4MDAuICBLVk0gYmFyZnMgaG9ycmlibHkKKyAgICAgKiBpZiB3ZSdyZSBub3QgYWxpZ25lZCB0byBhIHBhcmFncmFwaCBib3VuZGFyeSwgc28gc2V0IHRoZSBhbGlnbm1lbnQKKyAgICAgKiBhcHByb3ByaWF0ZWx5LgorICAgICAqLworICAgIHJlZ3N0dWIgPSAweDgwMDsKKyAgICBzdHVibGVuID0gc2l6ZW9mIGhhbmRvZmZfY29kZTsKKyAgICBydiA9IHN5c2xpbnV4X21lbW1hcF9maW5kX3R5cGUodG1hcCwgU01UX0ZSRUUsICZyZWdzdHViLCAmc3R1YmxlbiwgMTYpOworCisgICAgaWYgKHJ2IHx8IChyZWdzdHViID4gMHgxMDAwMDAgLSBzaXplb2YgaGFuZG9mZl9jb2RlKSkgeworCS8qCisJICogVWgtb2guICBUaGlzIGlzbid0IHJlYWwtbW9kZSBhY2Nlc3NpYmxlIG1lbW9yeS4KKwkgKiBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgaW5zYW5lIGhlcmUgbGlrZQorCSAqIHB1dHRpbmcgdGhlIHN0dWIgaW4gdGhlIElSUSB2ZWN0b3JzLCBvciBpbiB0aGUgMHg1eHggc2VnbWVudC4KKwkgKiBUaGlzIGNvZGUgdHJpZXMgdGhlIDB4NTEwLTB4N2ZmIHJhbmdlIGFuZCBob3BlcyBmb3IgdGhlIGJlc3QuCisJICovCisJcmVnc3R1YiA9IDB4NTEwOwkvKiBUcnkgdGhlIDB4NXh4IHNlZ21lbnQuLi4gKi8KKwlzdHVibGVuID0gc2l6ZW9mIGhhbmRvZmZfY29kZTsKKwlydiA9IHN5c2xpbnV4X21lbW1hcF9maW5kX3R5cGUodG1hcCwgU01UX0ZSRUUsICZyZWdzdHViLCAmc3R1YmxlbiwgMTYpOworCisJaWYgKCFydiAmJiAocmVnc3R1YiA+IDB4MTAwMDAwIC0gc2l6ZW9mIGhhbmRvZmZfY29kZSkpCisJICAgIHJ2ID0gLTE7CQkvKiBObyBhY2NlcHRhYmxlIG1lbW9yeSBmb3VuZCAqLworICAgIH0KKworICAgIHN5c2xpbnV4X2ZyZWVfbWVtbWFwKHRtYXApOworICAgIGlmIChydikKKwlyZXR1cm4gLTE7CisKKyAgICAvKiBCdWlsZCByZWdpc3Rlci1zZXR0aW5nIHN0dWIgKi8KKyAgICBwID0gaGFuZG9mZl9jb2RlOworICAgIHJwID0gKGNvbnN0IHN0cnVjdCBzeXNsaW51eF9ybV9yZWdzX2FsdCAqKXJlZ3M7CisKKyAgICAvKiBTZXQgdXAgR1BScyB3aXRoIHNlZ21lbnQgcmVnaXN0ZXJzIC0gZG9uJ3QgdXNlIEFYICovCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCWlmIChpICE9IFJfQ1MpCisJICAgIE1PVl9UT19SMTYocCwgZ3ByX2Zvcl9zZWdbaV0sIHJwLT5zZWdbaV0pOworICAgIH0KKworICAgIC8qIEFjdHVhbCB0cmFuc2l0aW9uIHRvIHJlYWwgbW9kZSAqLworICAgIFNUMzIocCwgMHhlYWMwMjIwZik7CS8qIE1PViBDUjAsRUFYOyBKTVAgRkFSICovCisgICAgb2ZmID0gKHAgLSBoYW5kb2ZmX2NvZGUpICsgNDsKKyAgICBTVDE2KHAsIG9mZik7CQkvKiBPZmZzZXQgKi8KKyAgICBTVDE2KHAsIHJlZ3N0dWIgPj4gNCk7CS8qIFNlZ21lbnQgKi8KKworICAgIC8qIExvYWQgU1MgYW5kIEVTUCBpbW1lZGlhdGVseSAqLworICAgIE1PVl9UT19TRUcocCwgUl9TUywgUl9CWCk7CisgICAgTU9WX1RPX1IzMihwLCBSX1NQLCBycC0+Z3ByW1JfU1BdKTsKKworICAgIC8qIExvYWQgdGhlIG90aGVyIHNlZ21lbnRzICovCisgICAgTU9WX1RPX1NFRyhwLCBSX0VTLCBSX0NYKTsKKyAgICBNT1ZfVE9fU0VHKHAsIFJfRFMsIFJfQlApOworICAgIE1PVl9UT19TRUcocCwgUl9GUywgUl9TSSk7CisgICAgTU9WX1RPX1NFRyhwLCBSX0dTLCBSX0RJKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwlpZiAoaSAhPSBSX1NQKQorCSAgICBNT1ZfVE9fUjMyKHAsIGksIHJwLT5ncHJbaV0pOworICAgIH0KKworICAgIFNUOChwLCBycC0+c3RpID8gMHhmYiA6IDB4ZmEpOwkvKiBTVEkvQ0xJICovCisKKyAgICBTVDgocCwgMHhlYSk7CQkvKiBKTVAgRkFSICovCisgICAgU1QzMihwLCBycC0+Y3NpcCk7CisKKyAgICAvKiBBZGQgcmVnaXN0ZXItc2V0dGluZyBzdHViIHRvIHNodWZmbGUgbGlzdCAqLworICAgIGlmIChzeXNsaW51eF9hZGRfbW92ZWxpc3QoJmZyYWdsaXN0LCByZWdzdHViLCAoYWRkcl90KSBoYW5kb2ZmX2NvZGUsCisJCQkgICAgICBzaXplb2YgaGFuZG9mZl9jb2RlKSkKKwlyZXR1cm4gLTE7CisKKyAgICByZXR1cm4gc3lzbGludXhfZG9fc2h1ZmZsZShmcmFnbGlzdCwgbWVtbWFwLCByZWdzdHViLCAwLCBib290ZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L3ZlcnNpb24uYyBiL2NvbTMyL2xpYi9zeXNsaW51eC92ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwNTU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC92ZXJzaW9uLmMKQEAgLTAsMCArMSw0OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKK3N0cnVjdCBzeXNsaW51eF92ZXJzaW9uIF9fc3lzbGludXhfdmVyc2lvbjsKKwordm9pZCBfX2NvbnN0cnVjdG9yIF9fc3lzbGludXhfZ2V0X3ZlcnNpb24odm9pZCkKK3sKKyAgICBfX3N5c2xpbnV4X3ZlcnNpb24udmVyc2lvbiA9IChWRVJTSU9OX01BSk9SIDw8IDgpICsgVkVSU0lPTl9NSU5PUjsKKworICAgIC8qIFdlIG5vIGxvbmdlciBzdXBwb3J0IHRoZSBDT01CT09UIEFQSSAgKi8KKyAgICBfX3N5c2xpbnV4X3ZlcnNpb24ubWF4X2FwaSA9IDB4ZmZmZjsKKworICAgIF9fc3lzbGludXhfdmVyc2lvbi5maWxlc3lzdGVtID0gc3lzbGludXhfZmlsZXN5c3RlbSgpOworCisgICAgLyogU2tpcCBsZWFkaW5nIENSIExGICovCisgICAgX19zeXNsaW51eF92ZXJzaW9uLnZlcnNpb25fc3RyaW5nID0gJnN5c2xpbnV4X2Jhbm5lclsyXTsKKworICAgIC8qIFNraXAgbGVhZGluZyBzcGFjZSAqLworICAgIF9fc3lzbGludXhfdmVyc2lvbi5jb3B5cmlnaHRfc3RyaW5nID0gJmNvcHlyaWdodF9zdHJbMV07Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvdmlkZW8vZm9udHF1ZXJ5LmMgYi9jb20zMi9saWIvc3lzbGludXgvdmlkZW8vZm9udHF1ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxZmFiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC92aWRlby9mb250cXVlcnkuYwpAQCAtMCwwICsxLDQ4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbGludXgvdmlkZW8vZm9yY2V0ZXh0LmMKKyAqLworCisjaW5jbHVkZSA8c3lzbGludXgvdmlkZW8uaD4KKyNpbmNsdWRlIDxncmFwaGljcy5oPgorCisvKgorICogUmV0dXJucyBoZWlnaHQgb2YgZm9udCBvciB6ZXJvIGlmIG5vIGN1c3RvbSBmb250IGxvYWRlZAorICovCitpbnQgc3lzbGludXhfZm9udF9xdWVyeSh1aW50OF90ICoqZm9udCkKK3sKKyAgICBpZiAoIVVzZXJGb250KQorCXJldHVybiAwOworCisgICAgKmZvbnQgPSAodWludDhfdCAqKWZvbnRidWY7CisKKyAgICByZXR1cm4gVkdBRm9udFNpemU7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi9zeXNsaW51eC92aWRlby9yZXBvcnRtb2RlLmMgYi9jb20zMi9saWIvc3lzbGludXgvdmlkZW8vcmVwb3J0bW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMmM1NzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvc3lzbGludXgvdmlkZW8vcmVwb3J0bW9kZS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC92aWRlby9yZXBvcnRtb2RlLmMKKyAqLworCisjaW5jbHVkZSA8c3lzbGludXgvdmlkZW8uaD4KKyNpbmNsdWRlIDxncmFwaGljcy5oPgorCit2b2lkIHN5c2xpbnV4X3JlcG9ydF92aWRlb19tb2RlKHVpbnQxNl90IGZsYWdzLCB1aW50MTZfdCB4c2l6ZSwgdWludDE2X3QgeXNpemUpCit7CisgICAgaWYgKGZsYWdzID4gMHgwZikKKwlyZXR1cm47CisKKyAgICB1c2luZ192Z2EoZmxhZ3MsIHhzaXplLCB5c2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvc3lzbGludXgvemxvYWRmaWxlLmMgYi9jb20zMi9saWIvc3lzbGludXgvemxvYWRmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2ZDA3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi9zeXNsaW51eC96bG9hZGZpbGUuYwpAQCAtMCwwICsxLDU5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogemxvYWRmaWxlLmMKKyAqCisgKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHBvc3NpYmx5IGNvbXByZXNzZWQgZGF0YSBmaWxlIGludG8gYSBtYWxsb2MnZCBidWZmZXIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvemlvLmg+CisKKyNpbmNsdWRlIDxzeXNsaW51eC9sb2FkZmlsZS5oPgorCisjZGVmaW5lIElOQ1JFTUVOVEFMX0NIVU5LIDEwMjQqMTAyNAorCitpbnQgemxvYWRmaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICoqcHRyLCBzaXplX3QgKiBsZW4pCit7CisgICAgRklMRSAqZjsKKyAgICBpbnQgcnY7CisKKyAgICBmID0gemZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgIGlmICghZikKKwlyZXR1cm4gLTE7CisKKyAgICBydiA9IGZsb2FkZmlsZShmLCBwdHIsIGxlbiwgTlVMTCwgMCk7CisgICAgZmNsb3NlKGYpOworCisgICAgcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3N5c2xpbnV4L3pvbmVsaXN0LmMgYi9jb20zMi9saWIvc3lzbGludXgvem9uZWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmM4NzRjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3N5c2xpbnV4L3pvbmVsaXN0LmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiB6b25lbGlzdC5jCisgKgorICogRGVhbCB3aXRoIHN5c2xpbnV4X21lbW1hcCdzLCB3aGljaCBhcmUgZGF0YSBzdHJ1Y3R1cmVzIGRlc2lnbmVkIHRvCisgKiBob2xkIG1lbW9yeSBtYXBzLiAgQSB6b25lbGlzdCBpcyBhIHNvcnRlZCBsaW5rZWQgbGlzdCBvZiBtZW1vcnkKKyAqIHJhbmdlcywgd2l0aCB0aGUgZ3VhcmFudGVlIHRoYXQgbm8gdHdvIGFkamFjZW50IGJsb2NrcyBoYXZlIHRoZQorICogc2FtZSByYW5nZSB0eXBlLiAgQWRkaXRpb25hbGx5LCBhbGwgdW5zcGVjaWZpZWQgbWVtb3J5IGhhdmUgYSByYW5nZQorICogdHlwZSBvZiB6ZXJvLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9hbGlnbi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L21vdmViaXRzLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorCisvKgorICogQ3JlYXRlIGFuIGVtcHR5IHN5c2xpbnV4X21lbW1hcCBsaXN0LgorICovCitzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICpzeXNsaW51eF9pbml0X21lbW1hcCh2b2lkKQoreworICAgIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKnNwLCAqZXA7CisKKyAgICBzcCA9IG1hbGxvYyhzaXplb2YoKnNwKSk7CisgICAgaWYgKCFzcCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGVwID0gbWFsbG9jKHNpemVvZigqZXApKTsKKyAgICBpZiAoIWVwKSB7CisJZnJlZShzcCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3AtPnN0YXJ0ID0gMDsKKyAgICBzcC0+dHlwZSA9IFNNVF9VTkRFRklORUQ7CisgICAgc3AtPm5leHQgPSBlcDsKKworICAgIGVwLT5zdGFydCA9IDA7CQkvKiBXcmFwIGFyb3VuZC4uLiAqLworICAgIGVwLT50eXBlID0gU01UX0VORDsJCS8qIEVuZCBvZiBjaGFpbiAqLworICAgIGVwLT5uZXh0ID0gTlVMTDsKKworICAgIHJldHVybiBzcDsKK30KKworLyoKKyAqIEFkZCBhbiBpdGVtIHRvIGEgc3lzbGludXhfbWVtbWFwIGxpc3QsIHBvdGVudGlhbGx5IG92ZXJ3cml0aW5nCisgKiB3aGF0IGlzIGFscmVhZHkgdGhlcmUuCisgKi8KK2ludCBzeXNsaW51eF9hZGRfbWVtbWFwKHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKipsaXN0LAorCQkJYWRkcl90IHN0YXJ0LCBhZGRyX3QgbGVuLAorCQkJZW51bSBzeXNsaW51eF9tZW1tYXBfdHlwZXMgdHlwZSkKK3sKKyAgICBhZGRyX3QgbGFzdDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptcCwgKiptcHA7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqcmFuZ2U7CisgICAgZW51bSBzeXNsaW51eF9tZW1tYXBfdHlwZXMgb2xkdHlwZTsKKworICAgIGRwcmludGYoIklucHV0IG1lbW1hcDpcbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbWVtbWFwKCpsaXN0KTsKKworICAgIC8qIFJlbW92ZSB0aGlzIHRvIG1ha2UgbGVuID09IDAgbWVhbiBhbGwgb2YgbWVtb3J5ICovCisgICAgaWYgKGxlbiA9PSAwKQorCXJldHVybiAwOworCisgICAgLyogTGFzdCBieXRlIC0tIHRvIGF2b2lkIHJvbGxvdmVyICovCisgICAgbGFzdCA9IHN0YXJ0ICsgbGVuIC0gMTsKKworICAgIG1wcCA9IGxpc3Q7CisgICAgb2xkdHlwZSA9IFNNVF9FTkQ7CQkvKiBJbXBvc3NpYmxlIHZhbHVlICovCisgICAgd2hpbGUgKG1wID0gKm1wcCwgc3RhcnQgPiBtcC0+c3RhcnQgJiYgbXAtPnR5cGUgIT0gU01UX0VORCkgeworCW9sZHR5cGUgPSBtcC0+dHlwZTsKKwltcHAgPSAmbXAtPm5leHQ7CisgICAgfQorCisgICAgaWYgKHN0YXJ0IDwgbXAtPnN0YXJ0IHx8IG1wLT50eXBlID09IFNNVF9FTkQpIHsKKwlpZiAodHlwZSAhPSBvbGR0eXBlKSB7CisJICAgIC8qIFNwbGljZSBpbiBhIG5ldyBzdGFydCB0b2tlbiAqLworCSAgICByYW5nZSA9IG1hbGxvYyhzaXplb2YoKnJhbmdlKSk7CisJICAgIGlmICghcmFuZ2UpCisJCXJldHVybiAtMTsKKworCSAgICByYW5nZS0+c3RhcnQgPSBzdGFydDsKKwkgICAgcmFuZ2UtPnR5cGUgPSB0eXBlOworCSAgICAqbXBwID0gcmFuZ2U7CisJICAgIHJhbmdlLT5uZXh0ID0gbXA7CisJICAgIG1wcCA9ICZyYW5nZS0+bmV4dDsKKwl9CisgICAgfSBlbHNlIHsKKwkvKiBtcCBpcyBleGFjdGx5IGFsaWduZWQgd2l0aCB0aGUgc3RhcnQgb2Ygb3VyIHJlZ2lvbiAqLworCWlmICh0eXBlICE9IG9sZHR5cGUpIHsKKwkgICAgLyogUmVjbGFpbSB0aGlzIGVudHJ5IGFzIG91ciBvd24gYm91bmRhcnkgbWFya2VyICovCisJICAgIG9sZHR5cGUgPSBtcC0+dHlwZTsKKwkgICAgbXAtPnR5cGUgPSB0eXBlOworCSAgICBtcHAgPSAmbXAtPm5leHQ7CisJfQorICAgIH0KKworICAgIHdoaWxlIChtcCA9ICptcHAsIGxhc3QgPiBtcC0+c3RhcnQgLSAxKSB7CisJb2xkdHlwZSA9IG1wLT50eXBlOworCSptcHAgPSBtcC0+bmV4dDsKKwlmcmVlKG1wKTsKKyAgICB9CisKKyAgICBpZiAobGFzdCA8IG1wLT5zdGFydCAtIDEpIHsKKwlpZiAob2xkdHlwZSAhPSB0eXBlKSB7CisJICAgIC8qIE5lZWQgYSBuZXcgZW5kIHRva2VuICovCisJICAgIHJhbmdlID0gbWFsbG9jKHNpemVvZigqcmFuZ2UpKTsKKwkgICAgaWYgKCFyYW5nZSkKKwkJcmV0dXJuIC0xOworCisJICAgIHJhbmdlLT5zdGFydCA9IGxhc3QgKyAxOworCSAgICByYW5nZS0+dHlwZSA9IG9sZHR5cGU7CisJICAgICptcHAgPSByYW5nZTsKKwkgICAgcmFuZ2UtPm5leHQgPSBtcDsKKwl9CisgICAgfSBlbHNlIHsKKwlpZiAobXAtPnR5cGUgPT0gdHlwZSkgeworCSAgICAvKiBNZXJnZSB0aGlzIHJlZ2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgb25lICovCisJICAgICptcHAgPSBtcC0+bmV4dDsKKwkgICAgZnJlZShtcCk7CisJfQorICAgIH0KKworICAgIGRwcmludGYoIkFmdGVyIGFkZGluZyAoJSN4LCUjeCwlZCk6XG4iLCBzdGFydCwgbGVuLCB0eXBlKTsKKyAgICBzeXNsaW51eF9kdW1wX21lbW1hcCgqbGlzdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFZlcmlmeSB3aGF0IHR5cGUgYSBjZXJ0YWluIG1lbW9yeSByZWdpb24gaXMuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIFNNVF9FUlJPUiBpZiB0aGUgbWVtb3J5IHJlZ2lvbiBoYXMgbXVsdGlwbGUgdHlwZXMsIGV4Y2VwdCB0aGF0CisgKiBTTVRfRlJFRSBjYW4gYmUgZGVtb3RlZCB0byBTTVRfVEVSTUlOQUwuCisgKi8KK2VudW0gc3lzbGludXhfbWVtbWFwX3R5cGVzIHN5c2xpbnV4X21lbW1hcF90eXBlKHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmxpc3QsCisJCQkJCQlhZGRyX3Qgc3RhcnQsIGFkZHJfdCBsZW4pCit7CisgICAgYWRkcl90IGxhc3QsIGxsYXN0OworCisgICAgbGFzdCA9IHN0YXJ0ICsgbGVuIC0gMTsKKworICAgIHdoaWxlIChsaXN0LT50eXBlICE9IFNNVF9FTkQpIHsKKwlsbGFzdCA9IGxpc3QtPm5leHQtPnN0YXJ0IC0gMTsKKwlpZiAobGlzdC0+c3RhcnQgPD0gc3RhcnQpIHsKKwkgICAgaWYgKGxsYXN0ID49IGxhc3QpIHsKKwkJcmV0dXJuIGxpc3QtPnR5cGU7CS8qIFJlZ2lvbiBoYXMgYSB3ZWxsLWRlZmluZWQgdHlwZSAqLworCSAgICB9IGVsc2UgaWYgKGxsYXN0ID49IHN0YXJ0KSB7CisJCS8qIENyb3NzZXMgcmVnaW9uIGJvdW5kYXJ5ICovCisJCXdoaWxlICh2YWxpZF90ZXJtaW5hbF90eXBlKGxpc3QtPnR5cGUpKSB7CisJCSAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKwkJICAgIGxsYXN0ID0gbGlzdC0+bmV4dC0+c3RhcnQgLSAxOworCQkgICAgaWYgKGxsYXN0ID49IGxhc3QpCisJCQlyZXR1cm4gU01UX1RFUk1JTkFMOworCQl9CisJCXJldHVybiBTTVRfRVJST1I7CisJICAgIH0KKwl9CisJbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIFNNVF9FUlJPUjsJCS8qIEludGVybmFsIGVycm9yPyAqLworfQorCisvKgorICogRmluZCB0aGUgbGFyZ2VzdCB6b25lIG9mIGEgc3BlY2lmaWMgdHlwZS4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4KKyAqLworaW50IHN5c2xpbnV4X21lbW1hcF9sYXJnZXN0KHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmxpc3QsCisJCQkgICAgZW51bSBzeXNsaW51eF9tZW1tYXBfdHlwZXMgdHlwZSwKKwkJCSAgICBhZGRyX3QgKiBzdGFydCwgYWRkcl90ICogbGVuKQoreworICAgIGFkZHJfdCBzaXplLCBiZXN0X3NpemUgPSAwOworICAgIHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmJlc3QgPSBOVUxMOworCisgICAgd2hpbGUgKGxpc3QtPnR5cGUgIT0gU01UX0VORCkgeworCXNpemUgPSBsaXN0LT5uZXh0LT5zdGFydCAtIGxpc3QtPnN0YXJ0OworCisJaWYgKGxpc3QtPnR5cGUgPT0gdHlwZSAmJiBzaXplID4gYmVzdF9zaXplKSB7CisJICAgIGJlc3QgPSBsaXN0OworCSAgICBiZXN0X3NpemUgPSBzaXplOworCX0KKworCWxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKworICAgIGlmICghYmVzdCkKKwlyZXR1cm4gLTE7CisKKyAgICAqc3RhcnQgPSBiZXN0LT5zdGFydDsKKyAgICAqbGVuID0gYmVzdF9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBoaWdoZXN0IHpvbmUgb2YgYSBzcGVjaWZpYyB0eXBlIHRoYXQgc2F0aXNmaWVzIHRoZQorICogY29uc3RyYWludHMuCisgKgorICogJ3N0YXJ0JyBpcyB1cGRhdGVkIHdpdGggdGhlIGhpZ2hlc3QgYWRkcmVzcyBvbiBzdWNjZXNzLiAnc3RhcnQnIGNhbgorICogYmUgdXNlZCB0byBzZXQgYSBtaW5pbXVtIGFkZHJlc3MgdG8gYmVnaW4gc2VhcmNoaW5nIGZyb20uCisgKgorICogUmV0dXJucyAtMSBvbiBmYWlsdXJlLgorICovCitpbnQgc3lzbGludXhfbWVtbWFwX2hpZ2hlc3QoY29uc3Qgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbGlzdCwKKwkJCSAgICBlbnVtIHN5c2xpbnV4X21lbW1hcF90eXBlcyB0eXBlLAorCQkJICAgIGFkZHJfdCAqc3RhcnQsIGFkZHJfdCBsZW4sCisJCQkgICAgYWRkcl90IGNlaWxpbmcsIGFkZHJfdCBhbGlnbikKK3sKKyAgICBhZGRyX3Qgc2l6ZSwgYmVzdDsKKworICAgIGZvciAoYmVzdCA9IDA7IGxpc3QtPnR5cGUgIT0gU01UX0VORDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwlzaXplID0gbGlzdC0+bmV4dC0+c3RhcnQgLSBsaXN0LT5zdGFydDsKKworCWlmIChsaXN0LT50eXBlICE9IHR5cGUpCisJICAgIGNvbnRpbnVlOworCisJaWYgKGxpc3QtPnN0YXJ0ICsgc2l6ZSA8PSAqc3RhcnQpCisJICAgIGNvbnRpbnVlOworCisJaWYgKGxpc3QtPnN0YXJ0ICsgbGVuID49IGNlaWxpbmcpCisJICAgIGNvbnRpbnVlOworCisJaWYgKGxpc3QtPnN0YXJ0ICsgc2l6ZSA8IGNlaWxpbmcpCisJICAgIGJlc3QgPSBBTElHTl9ET1dOKGxpc3QtPnN0YXJ0ICsgc2l6ZSAtIGxlbiwgYWxpZ24pOworCWVsc2UKKwkgICAgYmVzdCA9IEFMSUdOX0RPV04oY2VpbGluZyAtIGxlbiwgYWxpZ24pOworCisJaWYgKGJlc3QgPCAqc3RhcnQpCisJICAgIGJlc3QgPSAwOworICAgIH0KKworICAgIGlmICghYmVzdCkKKwlyZXR1cm4gLTE7CisKKyAgICAqc3RhcnQgPSBiZXN0OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBmaXJzdCAobG93ZXN0IGFkZHJlc3MpIHpvbmUgb2YgYSBzcGVjaWZpYyB0eXBlIGFuZCBvZgorICogYSBjZXJ0YWluIG1pbmltdW0gc2l6ZSwgd2l0aCBhbiBvcHRpb25hbCBzdGFydGluZyBhZGRyZXNzLgorICogVGhlIGlucHV0IHZhbHVlcyBvZiBzdGFydCBhbmQgbGVuIGFyZSB1c2VkIGFzIG1pbmltYS4KKyAqLworaW50IHN5c2xpbnV4X21lbW1hcF9maW5kX3R5cGUoc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbGlzdCwKKwkJCSAgICAgIGVudW0gc3lzbGludXhfbWVtbWFwX3R5cGVzIHR5cGUsCisJCQkgICAgICBhZGRyX3QgKiBzdGFydCwgYWRkcl90ICogbGVuLCBhZGRyX3QgYWxpZ24pCit7CisgICAgYWRkcl90IG1pbl9zdGFydCA9ICpzdGFydDsKKyAgICBhZGRyX3QgbWluX2xlbiA9ICpsZW47CisKKyAgICB3aGlsZSAobGlzdC0+dHlwZSAhPSBTTVRfRU5EKSB7CisJaWYgKGxpc3QtPnR5cGUgPT0gdHlwZSkgeworCSAgICBhZGRyX3QgeHN0YXJ0LCB4bGVuOworCSAgICB4c3RhcnQgPSBtaW5fc3RhcnQgPiBsaXN0LT5zdGFydCA/IG1pbl9zdGFydCA6IGxpc3QtPnN0YXJ0OworCSAgICB4c3RhcnQgPSBBTElHTl9VUCh4c3RhcnQsIGFsaWduKTsKKworCSAgICBpZiAoeHN0YXJ0IDwgbGlzdC0+bmV4dC0+c3RhcnQpIHsKKwkJeGxlbiA9IGxpc3QtPm5leHQtPnN0YXJ0IC0geHN0YXJ0OworCQlpZiAoeGxlbiA+PSBtaW5fbGVuKSB7CisJCSAgICAqc3RhcnQgPSB4c3RhcnQ7CisJCSAgICAqbGVuID0geGxlbjsKKwkJICAgIHJldHVybiAwOworCQl9CisJICAgIH0KKwl9CisJbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIC0xOwkJCS8qIE5vdCBmb3VuZCAqLworfQorCisvKgorICogRnJlZSBhIHpvbmVsaXN0LgorICovCit2b2lkIHN5c2xpbnV4X2ZyZWVfbWVtbWFwKHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmxpc3QpCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbWw7CisKKyAgICB3aGlsZSAobGlzdCkgeworCW1sID0gbGlzdDsKKwlsaXN0ID0gbGlzdC0+bmV4dDsKKwlmcmVlKG1sKTsKKyAgICB9Cit9CisKKy8qCisgKiBEdXBsaWNhdGUgYSB6b25lbGlzdC4gIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLgorICovCitzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICpzeXNsaW51eF9kdXBfbWVtbWFwKHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKmxpc3QpCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbmV3bGlzdCA9IE5VTEwsICoqbmxwID0gJm5ld2xpc3Q7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbWw7CisKKyAgICB3aGlsZSAobGlzdCkgeworCW1sID0gbWFsbG9jKHNpemVvZigqbWwpKTsKKwlpZiAoIW1sKSB7CisJICAgIHN5c2xpbnV4X2ZyZWVfbWVtbWFwKG5ld2xpc3QpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisJbWwtPnN0YXJ0ID0gbGlzdC0+c3RhcnQ7CisJbWwtPnR5cGUgPSBsaXN0LT50eXBlOworCW1sLT5uZXh0ID0gTlVMTDsKKwkqbmxwID0gbWw7CisJbmxwID0gJm1sLT5uZXh0OworCisJbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIG5ld2xpc3Q7Cit9CisKKy8qCisgKiBGaW5kIGEgbWVtb3J5IHJlZ2lvbiwgZ2l2ZW4gYSBzZXQgb2YgaGV1cmlzdGljcyBhbmQgdXBkYXRlICdiYXNlJyBpZgorICogc3VjY2Vzc2Z1bC4KKyAqLworaW50IHN5c2xpbnV4X21lbW1hcF9maW5kKHN0cnVjdCBzeXNsaW51eF9tZW1tYXAgKm1tYXAsCisJCQkgYWRkcl90ICpiYXNlLCBzaXplX3Qgc2l6ZSwKKwkJCSBib29sIHJlbG9jYXRlLCBzaXplX3QgYWxpZ24sCisJCQkgYWRkcl90IHN0YXJ0X21pbiwgYWRkcl90IHN0YXJ0X21heCwKKwkJCSBhZGRyX3QgZW5kX21pbiwgYWRkcl90IGVuZF9tYXgpCit7CisgICAgY29uc3Qgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbXA7CisgICAgZW51bSBzeXNsaW51eF9tZW1tYXBfdHlwZXMgdHlwZTsKKyAgICBib29sIG9rOworCisgICAgaWYgKCFzaXplKQorCXJldHVybiAwOworCisgICAgdHlwZSA9IHN5c2xpbnV4X21lbW1hcF90eXBlKG1tYXAsICpiYXNlLCBzaXplKTsKKworICAgIC8qIFRoaXMgYXNzdW1lcyBTTVRfVEVSTUlOQUwgaXMgT0sgaWYgd2UgY2FuIGdldCB0aGUgZXhhY3QgYWRkcmVzcyAqLworICAgIGlmICh2YWxpZF90ZXJtaW5hbF90eXBlKHR5cGUpKQorCXJldHVybiAwOworCisgICAgaWYgKCFyZWxvY2F0ZSkgeworCWRwcmludGYoIkNhbm5vdCByZWxvY2F0ZVxuIik7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIG9rID0gZmFsc2U7CisgICAgZm9yIChtcCA9IG1tYXA7IG1wICYmIG1wLT50eXBlICE9IFNNVF9FTkQ7IG1wID0gbXAtPm5leHQpIHsKKwlhZGRyX3Qgc3RhcnQsIGVuZDsKKwlzdGFydCA9IG1wLT5zdGFydDsKKwllbmQgPSBtcC0+bmV4dC0+c3RhcnQ7CisKKwlpZiAobXAtPnR5cGUgIT0gU01UX0ZSRUUpCisJICAgIGNvbnRpbnVlOworCisJLyogbWluICovCisJaWYgKGVuZCA8PSBlbmRfbWluKQorCSAgICBjb250aW51ZTsJLyogT25seSByZWxvY2F0ZSB1cHdhcmRzICovCisKKwlpZiAoc3RhcnQgPCBzdGFydF9taW4pCisJICAgIHN0YXJ0ID0gc3RhcnRfbWluOworCisJLyogbWF4ICovCisJaWYgKGVuZCA+IGVuZF9tYXgpCisJICAgIGVuZCA9IGVuZF9tYXg7CisKKwlzdGFydCA9IEFMSUdOX1VQKHN0YXJ0LCBhbGlnbik7CisJaWYgKHN0YXJ0ID4gc3RhcnRfbWF4IHx8IHN0YXJ0ID49IGVuZCkKKwkgICAgY29udGludWU7CisKKwlpZiAoZW5kIC0gc3RhcnQgPj0gc2l6ZSkgeworCSAgICAqYmFzZSA9IHN0YXJ0OworCSAgICBvayA9IHRydWU7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBpZiAoIW9rKQorCXJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3Zhc3ByaW50Zi5jIGIvY29tMzIvbGliL3Zhc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjE1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvdmFzcHJpbnRmLmMKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIHZhc3ByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCB2YXNwcmludGYoY2hhciAqKmJ1ZnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgICB2YV9saXN0IGFwMTsKKyAgICBpbnQgYnl0ZXM7CisgICAgY2hhciAqcDsKKworICAgIHZhX2NvcHkoYXAxLCBhcCk7CisKKyAgICBieXRlcyA9IHZzbnByaW50ZihOVUxMLCAwLCBmb3JtYXQsIGFwMSkgKyAxOworICAgIHZhX2VuZChhcDEpOworCisgICAgKmJ1ZnAgPSBwID0gbWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAoIXApCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHZzbnByaW50ZihwLCBieXRlcywgZm9ybWF0LCBhcCk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvdmRwcmludGYuYyBiL2NvbTMyL2xpYi92ZHByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjU1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvdmRwcmludGYuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIHZkcHJpbnRmLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pby5oPgorI2luY2x1ZGUgPHN5cy9jcHUuaD4KKworI2lmZGVmIERFQlVHX1BPUlQKKworI2RlZmluZSBCVUZGRVJfU0laRQk0MDk2CisKK2VudW0gc2VyaWFsX3BvcnRfcmVncyB7CisgICAgVEhSID0gMCwKKyAgICBSQlIgPSAwLAorICAgIERMTCA9IDAsCisgICAgRExNID0gMSwKKyAgICBJRVIgPSAxLAorICAgIElJUiA9IDIsCisgICAgRkNSID0gMiwKKyAgICBMQ1IgPSAzLAorICAgIE1DUiA9IDQsCisgICAgTFNSID0gNSwKKyAgICBNU1IgPSA2LAorICAgIFNDUiA9IDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZGVidWdfYmFzZSA9IERFQlVHX1BPUlQ7CisKK3N0YXRpYyB2b2lkIGRlYnVnX3B1dGMoY2hhciBjKQoreworICAgIGlmIChjID09ICdcbicpCisJZGVidWdfcHV0YygnXHInKTsKKworICAgIHdoaWxlICgoaW5iKGRlYnVnX2Jhc2UgKyBMU1IpICYgMHgyMCkgPT0gMCkKKwljcHVfcmVsYXgoKTsKKyAgICBvdXRiKGMsIGRlYnVnX2Jhc2UgKyBUSFIpOworfQorCit2b2lkIHZkcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgICBpbnQgcnY7CisgICAgY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworICAgIGNoYXIgKnA7CisgICAgc3RhdGljIGJvb2wgZGVidWdfaW5pdCA9IGZhbHNlOworICAgIHN0YXRpYyBib29sIGRlYnVnX29rICAgPSBmYWxzZTsKKworICAgIHJ2ID0gdnNucHJpbnRmKGJ1ZmZlciwgQlVGRkVSX1NJWkUsIGZvcm1hdCwgYXApOworICAgIGlmIChydiA8IDApCisJcmV0dXJuOworCisgICAgaWYgKHJ2ID4gQlVGRkVSX1NJWkUgLSAxKQorCXJ2ID0gQlVGRkVSX1NJWkUgLSAxOworCisgICAgLyoKKyAgICAgKiBUaGlzIHVuY29uZGl0aW9uYWxseSBvdXRwdXRzIHRvIGEgc2VyaWFsIHBvcnQgYXQgMHgzZjggcmVnYXJkbGVzcyBvZgorICAgICAqIGlmIG9uZSBpcyBlbmFibGVkIG9yIG5vdCAodGhpcyBtZWFucyB3ZSBkb24ndCBoYXZlIHRvIGVuYWJsZSB0aGUgcmVhbAorICAgICAqIHNlcmlhbCBjb25zb2xlIGFuZCB0aGVyZWZvcmUgZ2V0IGNvbmZsaWN0aW5nIG91dHB1dC4pCisgICAgICovCisgICAgaWYgKF9fdW5saWtlbHkoIWRlYnVnX2luaXQpKSB7CisJdWludDhfdCBkbGwsIGRsbSwgbGNyOworCisJZGVidWdfaW5pdCA9IHRydWU7CisKKwljbGkoKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHNlcmlhbCBwb3J0IHRvIDExNTIwMCBuODEgd2l0aCBGSUZPcyBlbmFibGVkICovCisJb3V0YigweDgzLCBkZWJ1Z19iYXNlICsgTENSKTsKKwlvdXRiKDB4MDEsIGRlYnVnX2Jhc2UgKyBETEwpOworCW91dGIoMHgwMCwgZGVidWdfYmFzZSArIERMTSk7CisJKHZvaWQpaW5iKGRlYnVnX2Jhc2UgKyBJRVIpOwkvKiBTeW5jaHJvbml6ZSAqLworCWRsbCA9IGluYihkZWJ1Z19iYXNlICsgRExMKTsKKwlkbG0gPSBpbmIoZGVidWdfYmFzZSArIERMTSk7CisJbGNyID0gaW5iKGRlYnVnX2Jhc2UgKyBMQ1IpOworCQorCW91dGIoMHgwMywgZGVidWdfYmFzZSArIExDUik7CisJKHZvaWQpaW5iKGRlYnVnX2Jhc2UgKyBJRVIpOwkvKiBTeW5jaHJvbml6ZSAqLworCisJb3V0YigweDAwLCBkZWJ1Z19iYXNlICsgSUVSKTsKKwkodm9pZClpbmIoZGVidWdfYmFzZSArIElFUik7CS8qIFN5bmNocm9uaXplICovCisKKwlzdGkoKTsKKworCWlmIChkbGwgIT0gMHgwMSB8fCBkbG0gIT0gMHgwMCB8fCBsY3IgIT0gMHg4MykgeworCSAgICAvKiBObyBzZXJpYWwgcG9ydCBwcmVzZW50ICovCisJICAgIHJldHVybjsKKwl9CisKKwlvdXRiKDB4MDEsIGRlYnVnX2Jhc2UgKyBGQ1IpOworCSh2b2lkKWluYihkZWJ1Z19iYXNlICsgSUVSKTsJLyogU3luY2hyb25pemUgKi8KKwlpZiAoaW5iKGRlYnVnX2Jhc2UgKyBJSVIpIDwgMHhjMCkgeworCSAgICBvdXRiKDB4MDAsIGRlYnVnX2Jhc2UgKyBGQ1IpOyAvKiBEaXNhYmxlIG5vbi1mdW5jdGlvbmFsIEZJRk9zICovCisJICAgICh2b2lkKWluYihkZWJ1Z19iYXNlICsgSUVSKTsJLyogU3luY2hyb25pemUgKi8KKwl9CisKKwlkZWJ1Z19vayA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCFkZWJ1Z19vaykKKwlyZXR1cm47CisKKyAgICBwID0gYnVmZmVyOworICAgIHdoaWxlIChydi0tKQorCWRlYnVnX3B1dGMoKnArKyk7Cit9CisKKyNlbmRpZiAvKiBERUJVR19QT1JUICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvdmZwcmludGYuYyBiL2NvbTMyL2xpYi92ZnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMDg0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvdmZwcmludGYuYwpAQCAtMCwwICsxLDI2IEBACisvKgorICogdmZwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIEJVRkZFUl9TSVpFCTMyNzY4CisKK2ludCB2ZnByaW50ZihGSUxFICogZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworICAgIGludCBydjsKKyAgICBjaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV07CisKKyAgICBydiA9IHZzbnByaW50ZihidWZmZXIsIEJVRkZFUl9TSVpFLCBmb3JtYXQsIGFwKTsKKworICAgIGlmIChydiA8IDApCisJcmV0dXJuIHJ2OworCisgICAgaWYgKHJ2ID4gQlVGRkVSX1NJWkUgLSAxKQorCXJ2ID0gQlVGRkVSX1NJWkUgLSAxOworCisgICAgcmV0dXJuIF9md3JpdGUoYnVmZmVyLCBydiwgZmlsZSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvdnByaW50Zi5jIGIvY29tMzIvbGliL3ZwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODZmNzIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3ZwcmludGYuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogdnByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCB2cHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgICByZXR1cm4gdmZwcmludGYoc3Rkb3V0LCBmb3JtYXQsIGFwKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi92c25wcmludGYuYyBiL2NvbTMyL2xpYi92c25wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDFkMmEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3ZzbnByaW50Zi5jCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogdnNucHJpbnRmLmMKKyAqCisgKiB2c25wcmludGYoKSwgZnJvbSB3aGljaCB0aGUgcmVzdCBvZiB0aGUgcHJpbnRmKCkKKyAqIGZhbWlseSBpcyBidWlsdAorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2VudW0gZmxhZ3MgeworICAgIEZMX1pFUk8gPSAweDAxLAkJLyogWmVybyBtb2RpZmllciAqLworICAgIEZMX01JTlVTID0gMHgwMiwJCS8qIE1pbnVzIG1vZGlmaWVyICovCisgICAgRkxfUExVUyA9IDB4MDQsCQkvKiBQbHVzIG1vZGlmaWVyICovCisgICAgRkxfVElDSyA9IDB4MDgsCQkvKiAnIG1vZGlmaWVyICovCisgICAgRkxfU1BBQ0UgPSAweDEwLAkJLyogU3BhY2UgbW9kaWZpZXIgKi8KKyAgICBGTF9IQVNIID0gMHgyMCwJCS8qICMgbW9kaWZpZXIgKi8KKyAgICBGTF9TSUdORUQgPSAweDQwLAkJLyogTnVtYmVyIGlzIHNpZ25lZCAqLworICAgIEZMX1VQUEVSID0gMHg4MAkJLyogVXBwZXIgY2FzZSBkaWdpdHMgKi8KK307CisKKy8qIFRoZXNlIG1heSBoYXZlIHRvIGJlIGFkanVzdGVkIG9uIGNlcnRhaW4gaW1wbGVtZW50YXRpb25zICovCitlbnVtIHJhbmtzIHsKKyAgICByYW5rX2NoYXIgPSAtMiwKKyAgICByYW5rX3Nob3J0ID0gLTEsCisgICAgcmFua19pbnQgPSAwLAorICAgIHJhbmtfbG9uZyA9IDEsCisgICAgcmFua19sb25nbG9uZyA9IDIKK307CisKKyNkZWZpbmUgTUlOX1JBTksJcmFua19jaGFyCisjZGVmaW5lIE1BWF9SQU5LCXJhbmtfbG9uZ2xvbmcKKworI2RlZmluZSBJTlRNQVhfUkFOSwlyYW5rX2xvbmdsb25nCisjZGVmaW5lIFNJWkVfVF9SQU5LCXJhbmtfbG9uZworI2RlZmluZSBQVFJESUZGX1RfUkFOSwlyYW5rX2xvbmcKKworI2RlZmluZSBFTUlUKHgpICh7IGlmIChvPG4peypxKysgPSAoeCk7fSBvKys7IH0pCisKK3N0YXRpYyBzaXplX3QKK2Zvcm1hdF9pbnQoY2hhciAqcSwgc2l6ZV90IG4sIHVpbnRtYXhfdCB2YWwsIGVudW0gZmxhZ3MgZmxhZ3MsCisJICAgaW50IGJhc2UsIGludCB3aWR0aCwgaW50IHByZWMpCit7CisgICAgY2hhciAqcXE7CisgICAgc2l6ZV90IG8gPSAwLCBvbzsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBsY2RpZ2l0c1tdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICAgIHN0YXRpYyBjb25zdCBjaGFyIHVjZGlnaXRzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisgICAgY29uc3QgY2hhciAqZGlnaXRzOworICAgIHVpbnRtYXhfdCB0bXB2YWw7CisgICAgaW50IG1pbnVzID0gMDsKKyAgICBpbnQgbmRpZ2l0cyA9IDAsIG5jaGFyczsKKyAgICBpbnQgdGlja3NraXAsIGI0dGljazsKKworICAgIC8qIFNlbGVjdCB0eXBlIG9mIGRpZ2l0cyAqLworICAgIGRpZ2l0cyA9IChmbGFncyAmIEZMX1VQUEVSKSA/IHVjZGlnaXRzIDogbGNkaWdpdHM7CisKKyAgICAvKiBJZiBzaWduZWQsIHNlcGFyYXRlIG91dCB0aGUgbWludXMgKi8KKyAgICBpZiAoZmxhZ3MgJiBGTF9TSUdORUQgJiYgKGludG1heF90KSB2YWwgPCAwKSB7CisJbWludXMgPSAxOworCXZhbCA9ICh1aW50bWF4X3QpICgtKGludG1heF90KSB2YWwpOworICAgIH0KKworICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgZGlnaXRzIG5lZWRlZC4gIFRoaXMgcmV0dXJucyB6ZXJvIGZvciAwLiAqLworICAgIHRtcHZhbCA9IHZhbDsKKyAgICB3aGlsZSAodG1wdmFsKSB7CisJdG1wdmFsIC89IGJhc2U7CisJbmRpZ2l0cysrOworICAgIH0KKworICAgIC8qIEFkanVzdCBuZGlnaXRzIGZvciBzaXplIG9mIG91dHB1dCAqLworCisgICAgaWYgKGZsYWdzICYgRkxfSEFTSCAmJiBiYXNlID09IDgpIHsKKwlpZiAocHJlYyA8IG5kaWdpdHMgKyAxKQorCSAgICBwcmVjID0gbmRpZ2l0cyArIDE7CisgICAgfQorCisgICAgaWYgKG5kaWdpdHMgPCBwcmVjKSB7CisJbmRpZ2l0cyA9IHByZWM7CQkvKiBNYW5kYXRvcnkgbnVtYmVyIHBhZGRpbmcgKi8KKyAgICB9IGVsc2UgaWYgKHZhbCA9PSAwKSB7CisJbmRpZ2l0cyA9IDE7CQkvKiBaZXJvIHN0aWxsIHJlcXVpcmVzIHNwYWNlICovCisgICAgfQorCisgICAgLyogRm9yICcsIGZpZ3VyZSBvdXQgd2hhdCB0aGUgc2tpcCBzaG91bGQgYmUgKi8KKyAgICBpZiAoZmxhZ3MgJiBGTF9USUNLKSB7CisJdGlja3NraXAgPSAoYmFzZSA9PSAxNikgPyA0IDogMzsKKyAgICB9IGVsc2UgeworCXRpY2tza2lwID0gbmRpZ2l0czsJLyogTm8gdGljayBtYXJrcyAqLworICAgIH0KKworICAgIC8qIFRpY2sgbWFya3MgYXJlbid0IGRpZ2l0cywgYnV0IGdlbmVyYXRlZCBieSB0aGUgbnVtYmVyIGNvbnZlcnRlciAqLworICAgIG5kaWdpdHMgKz0gKG5kaWdpdHMgLSAxKSAvIHRpY2tza2lwOworCisgICAgLyogTm93IGNvbXB1dGUgdGhlIG51bWJlciBvZiBub25kaWdpdHMgKi8KKyAgICBuY2hhcnMgPSBuZGlnaXRzOworCisgICAgaWYgKG1pbnVzIHx8IChmbGFncyAmIChGTF9QTFVTIHwgRkxfU1BBQ0UpKSkKKwluY2hhcnMrKzsJCS8qIE5lZWQgc3BhY2UgZm9yIHNpZ24gKi8KKyAgICBpZiAoKGZsYWdzICYgRkxfSEFTSCkgJiYgYmFzZSA9PSAxNikgeworCW5jaGFycyArPSAyOwkJLyogQWRkIDB4IGZvciBoZXggKi8KKyAgICB9CisKKyAgICAvKiBFbWl0IGVhcmx5IHNwYWNlIHBhZGRpbmcgKi8KKyAgICBpZiAoIShmbGFncyAmIChGTF9NSU5VUyB8IEZMX1pFUk8pKSAmJiB3aWR0aCA+IG5jaGFycykgeworCXdoaWxlICh3aWR0aCA+IG5jaGFycykgeworCSAgICBFTUlUKCcgJyk7CisJICAgIHdpZHRoLS07CisJfQorICAgIH0KKworICAgIC8qIEVtaXQgbm9uZGlnaXRzICovCisgICAgaWYgKG1pbnVzKQorCUVNSVQoJy0nKTsKKyAgICBlbHNlIGlmIChmbGFncyAmIEZMX1BMVVMpCisJRU1JVCgnKycpOworICAgIGVsc2UgaWYgKGZsYWdzICYgRkxfU1BBQ0UpCisJRU1JVCgnICcpOworCisgICAgaWYgKChmbGFncyAmIEZMX0hBU0gpICYmIGJhc2UgPT0gMTYpIHsKKwlFTUlUKCcwJyk7CisJRU1JVCgoZmxhZ3MgJiBGTF9VUFBFUikgPyAnWCcgOiAneCcpOworICAgIH0KKworICAgIC8qIEVtaXQgemVybyBwYWRkaW5nICovCisgICAgaWYgKChmbGFncyAmIChGTF9NSU5VUyB8IEZMX1pFUk8pKSA9PSBGTF9aRVJPICYmIHdpZHRoID4gbmRpZ2l0cykgeworCXdoaWxlICh3aWR0aCA+IG5jaGFycykgeworCSAgICBFTUlUKCcwJyk7CisJICAgIHdpZHRoLS07CisJfQorICAgIH0KKworICAgIC8qIEdlbmVyYXRlIHRoZSBudW1iZXIuICBUaGlzIGlzIGRvbmUgZnJvbSByaWdodCB0byBsZWZ0LiAqLworICAgIHEgKz0gbmRpZ2l0czsJCS8qIEFkdmFuY2UgdGhlIHBvaW50ZXIgdG8gZW5kIG9mIG51bWJlciAqLworICAgIG8gKz0gbmRpZ2l0czsKKyAgICBxcSA9IHE7CisgICAgb28gPSBvOwkJCS8qIFRlbXBvcmFyeSB2YWx1ZXMgKi8KKworICAgIGI0dGljayA9IHRpY2tza2lwOworICAgIHdoaWxlIChuZGlnaXRzID4gMCkgeworCWlmICghYjR0aWNrLS0pIHsKKwkgICAgcXEtLTsKKwkgICAgb28tLTsKKwkgICAgbmRpZ2l0cy0tOworCSAgICBpZiAob28gPCBuKQorCQkqcXEgPSAnXyc7CisJICAgIGI0dGljayA9IHRpY2tza2lwIC0gMTsKKwl9CisJcXEtLTsKKwlvby0tOworCW5kaWdpdHMtLTsKKwlpZiAob28gPCBuKQorCSAgICAqcXEgPSBkaWdpdHNbdmFsICUgYmFzZV07CisJdmFsIC89IGJhc2U7CisgICAgfQorCisgICAgLyogRW1pdCBsYXRlIHNwYWNlIHBhZGRpbmcgKi8KKyAgICB3aGlsZSAoKGZsYWdzICYgRkxfTUlOVVMpICYmIHdpZHRoID4gbmNoYXJzKSB7CisJRU1JVCgnICcpOworCXdpZHRoLS07CisgICAgfQorCisgICAgcmV0dXJuIG87Cit9CisKK2ludCB2c25wcmludGYoY2hhciAqYnVmZmVyLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworICAgIGNvbnN0IGNoYXIgKnAgPSBmb3JtYXQ7CisgICAgY2hhciBjaDsKKyAgICBjaGFyICpxID0gYnVmZmVyOworICAgIHNpemVfdCBvID0gMDsJCS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIG91dHB1dCAqLworICAgIHVpbnRtYXhfdCB2YWwgPSAwOworICAgIGludCByYW5rID0gcmFua19pbnQ7CS8qIERlZmF1bHQgcmFuayAqLworICAgIGludCB3aWR0aCA9IDA7CisgICAgaW50IHByZWMgPSAtMTsKKyAgICBpbnQgYmFzZTsKKyAgICBzaXplX3Qgc3o7CisgICAgZW51bSBmbGFncyBmbGFncyA9IDA7CisgICAgZW51bSB7CisJc3Rfbm9ybWFsLAkJLyogR3JvdW5kIHN0YXRlICovCisJc3RfZmxhZ3MsCQkvKiBTcGVjaWFsIGZsYWdzICovCisJc3Rfd2lkdGgsCQkvKiBGaWVsZCB3aWR0aCAqLworCXN0X3ByZWMsCQkvKiBGaWVsZCBwcmVjaXNpb24gKi8KKwlzdF9tb2RpZmllcnMJCS8qIExlbmd0aCBvciBjb252ZXJzaW9uIG1vZGlmaWVycyAqLworICAgIH0gc3RhdGUgPSBzdF9ub3JtYWw7CisgICAgY29uc3QgY2hhciAqc2FyZzsJCS8qICVzIHN0cmluZyBhcmd1bWVudCAqLworICAgIGNoYXIgY2FyZzsJCQkvKiAlYyBjaGFyIGFyZ3VtZW50ICovCisgICAgaW50IHNsZW47CQkJLyogU3RyaW5nIGxlbmd0aCAqLworCisgICAgd2hpbGUgKChjaCA9ICpwKyspKSB7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2Ugc3Rfbm9ybWFsOgorCSAgICBpZiAoY2ggPT0gJyUnKSB7CisJCXN0YXRlID0gc3RfZmxhZ3M7CisJCWZsYWdzID0gMDsKKwkJcmFuayA9IHJhbmtfaW50OworCQl3aWR0aCA9IDA7CisJCXByZWMgPSAtMTsKKwkgICAgfSBlbHNlIHsKKwkJRU1JVChjaCk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIHN0X2ZsYWdzOgorCSAgICBzd2l0Y2ggKGNoKSB7CisJICAgIGNhc2UgJy0nOgorCQlmbGFncyB8PSBGTF9NSU5VUzsKKwkJYnJlYWs7CisJICAgIGNhc2UgJysnOgorCQlmbGFncyB8PSBGTF9QTFVTOworCQlicmVhazsKKwkgICAgY2FzZSAnXCcnOgorCQlmbGFncyB8PSBGTF9USUNLOworCQlicmVhazsKKwkgICAgY2FzZSAnICc6CisJCWZsYWdzIHw9IEZMX1NQQUNFOworCQlicmVhazsKKwkgICAgY2FzZSAnIyc6CisJCWZsYWdzIHw9IEZMX0hBU0g7CisJCWJyZWFrOworCSAgICBjYXNlICcwJzoKKwkJZmxhZ3MgfD0gRkxfWkVSTzsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCXN0YXRlID0gc3Rfd2lkdGg7CisJCXAtLTsJCS8qIFByb2Nlc3MgdGhpcyBjaGFyYWN0ZXIgYWdhaW4gKi8KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIHN0X3dpZHRoOgorCSAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworCQl3aWR0aCA9IHdpZHRoICogMTAgKyAoY2ggLSAnMCcpOworCSAgICB9IGVsc2UgaWYgKGNoID09ICcqJykgeworCQl3aWR0aCA9IHZhX2FyZyhhcCwgaW50KTsKKwkJaWYgKHdpZHRoIDwgMCkgeworCQkgICAgd2lkdGggPSAtd2lkdGg7CisJCSAgICBmbGFncyB8PSBGTF9NSU5VUzsKKwkJfQorCSAgICB9IGVsc2UgaWYgKGNoID09ICcuJykgeworCQlwcmVjID0gMDsJLyogUHJlY2lzaW9uIGdpdmVuICovCisJCXN0YXRlID0gc3RfcHJlYzsKKwkgICAgfSBlbHNlIHsKKwkJc3RhdGUgPSBzdF9tb2RpZmllcnM7CisJCXAtLTsJCS8qIFByb2Nlc3MgdGhpcyBjaGFyYWN0ZXIgYWdhaW4gKi8KKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2Ugc3RfcHJlYzoKKwkgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKwkJcHJlYyA9IHByZWMgKiAxMCArIChjaCAtICcwJyk7CisJICAgIH0gZWxzZSBpZiAoY2ggPT0gJyonKSB7CisJCXByZWMgPSB2YV9hcmcoYXAsIGludCk7CisJCWlmIChwcmVjIDwgMCkKKwkJICAgIHByZWMgPSAtMTsKKwkgICAgfSBlbHNlIHsKKwkJc3RhdGUgPSBzdF9tb2RpZmllcnM7CisJCXAtLTsJCS8qIFByb2Nlc3MgdGhpcyBjaGFyYWN0ZXIgYWdhaW4gKi8KKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2Ugc3RfbW9kaWZpZXJzOgorCSAgICBzd2l0Y2ggKGNoKSB7CisJCS8qIExlbmd0aCBtb2RpZmllcnMgLSBub250ZXJtaW5hbCBzZXF1ZW5jZXMgKi8KKwkgICAgY2FzZSAnaCc6CisJCXJhbmstLTsJCS8qIFNob3J0ZXIgcmFuayAqLworCQlicmVhazsKKwkgICAgY2FzZSAnbCc6CisJCXJhbmsrKzsJCS8qIExvbmdlciByYW5rICovCisJCWJyZWFrOworCSAgICBjYXNlICdqJzoKKwkJcmFuayA9IElOVE1BWF9SQU5LOworCQlicmVhazsKKwkgICAgY2FzZSAneic6CisJCXJhbmsgPSBTSVpFX1RfUkFOSzsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ3QnOgorCQlyYW5rID0gUFRSRElGRl9UX1JBTks7CisJCWJyZWFrOworCSAgICBjYXNlICdMJzoKKwkgICAgY2FzZSAncSc6CisJCXJhbmsgKz0gMjsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCS8qIE91dHB1dCBtb2RpZmllcnMgLSB0ZXJtaW5hbCBzZXF1ZW5jZXMgKi8KKwkJc3RhdGUgPSBzdF9ub3JtYWw7CS8qIE5leHQgc3RhdGUgd2lsbCBiZSBub3JtYWwgKi8KKwkJaWYgKHJhbmsgPCBNSU5fUkFOSykJLyogQ2Fub25pY2FsaXplIHJhbmsgKi8KKwkJICAgIHJhbmsgPSBNSU5fUkFOSzsKKwkJZWxzZSBpZiAocmFuayA+IE1BWF9SQU5LKQorCQkgICAgcmFuayA9IE1BWF9SQU5LOworCisJCXN3aXRjaCAoY2gpIHsKKwkJY2FzZSAnUCc6CS8qIFVwcGVyIGNhc2UgcG9pbnRlciAqLworCQkgICAgZmxhZ3MgfD0gRkxfVVBQRVI7CisJCSAgICAvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAncCc6CS8qIFBvaW50ZXIgKi8KKwkJICAgIGJhc2UgPSAxNjsKKwkJICAgIHByZWMgPSAoQ0hBUl9CSVQgKiBzaXplb2Yodm9pZCAqKSArIDMpIC8gNDsKKwkJICAgIGZsYWdzIHw9IEZMX0hBU0g7CisJCSAgICB2YWwgPSAodWludG1heF90KSAodWludHB0cl90KSB2YV9hcmcoYXAsIHZvaWQgKik7CisJCSAgICBnb3RvIGlzX2ludGVnZXI7CisKKwkJY2FzZSAnZCc6CS8qIFNpZ25lZCBkZWNpbWFsIG91dHB1dCAqLworCQljYXNlICdpJzoKKwkJICAgIGJhc2UgPSAxMDsKKwkJICAgIGZsYWdzIHw9IEZMX1NJR05FRDsKKwkJICAgIHN3aXRjaCAocmFuaykgeworCQkgICAgY2FzZSByYW5rX2NoYXI6CisJCQkvKiBZZXMsIGFsbCB0aGVzZSBjYXN0cyBhcmUgbmVlZGVkLi4uICovCisJCQl2YWwgPQorCQkJICAgICh1aW50bWF4X3QpIChpbnRtYXhfdCkgKHNpZ25lZCBjaGFyKXZhX2FyZyhhcCwKKwkJCQkJCQkJICAgICAgIHNpZ25lZAorCQkJCQkJCQkgICAgICAgaW50KTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSByYW5rX3Nob3J0OgorCQkJdmFsID0KKwkJCSAgICAodWludG1heF90KSAoaW50bWF4X3QpIChzaWduZWQgc2hvcnQpdmFfYXJnKGFwLAorCQkJCQkJCQkJc2lnbmVkCisJCQkJCQkJCQlpbnQpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIHJhbmtfaW50OgorCQkJdmFsID0gKHVpbnRtYXhfdCkgKGludG1heF90KSB2YV9hcmcoYXAsIHNpZ25lZCBpbnQpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIHJhbmtfbG9uZzoKKwkJCXZhbCA9ICh1aW50bWF4X3QpIChpbnRtYXhfdCkgdmFfYXJnKGFwLCBzaWduZWQgbG9uZyk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgcmFua19sb25nbG9uZzoKKwkJCXZhbCA9CisJCQkgICAgKHVpbnRtYXhfdCkgKGludG1heF90KSB2YV9hcmcoYXAsIHNpZ25lZCBsb25nIGxvbmcpOworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBnb3RvIGlzX2ludGVnZXI7CisJCWNhc2UgJ28nOgkvKiBPY3RhbCAqLworCQkgICAgYmFzZSA9IDg7CisJCSAgICBnb3RvIGlzX3Vuc2lnbmVkOworCQljYXNlICd1JzoJLyogVW5zaWduZWQgZGVjaW1hbCAqLworCQkgICAgYmFzZSA9IDEwOworCQkgICAgZ290byBpc191bnNpZ25lZDsKKwkJY2FzZSAnWCc6CS8qIFVwcGVyIGNhc2UgaGV4YWRlY2ltYWwgKi8KKwkJICAgIGZsYWdzIHw9IEZMX1VQUEVSOworCQkgICAgLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJ3gnOgkvKiBIZXhhZGVjaW1hbCAqLworCQkgICAgYmFzZSA9IDE2OworCQkgICAgZ290byBpc191bnNpZ25lZDsKKworaXNfdW5zaWduZWQ6CisJCSAgICBzd2l0Y2ggKHJhbmspIHsKKwkJICAgIGNhc2UgcmFua19jaGFyOgorCQkJdmFsID0KKwkJCSAgICAodWludG1heF90KSAodW5zaWduZWQgY2hhcil2YV9hcmcoYXAsIHVuc2lnbmVkIGludCk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgcmFua19zaG9ydDoKKwkJCXZhbCA9CisJCQkgICAgKHVpbnRtYXhfdCkgKHVuc2lnbmVkIHNob3J0KXZhX2FyZyhhcCwKKwkJCQkJCQkgICAgICAgdW5zaWduZWQgaW50KTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSByYW5rX2ludDoKKwkJCXZhbCA9ICh1aW50bWF4X3QpIHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSByYW5rX2xvbmc6CisJCQl2YWwgPSAodWludG1heF90KSB2YV9hcmcoYXAsIHVuc2lnbmVkIGxvbmcpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIHJhbmtfbG9uZ2xvbmc6CisJCQl2YWwgPSAodWludG1heF90KSB2YV9hcmcoYXAsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIC8qIGZhbGwgdGhyb3VnaCAqLworCitpc19pbnRlZ2VyOgorCQkgICAgc3ogPSBmb3JtYXRfaW50KHEsIChvIDwgbikgPyBuIC0gbyA6IDAsIHZhbCwgZmxhZ3MsIGJhc2UsCisJCQkJICAgIHdpZHRoLCBwcmVjKTsKKwkJICAgIHEgKz0gc3o7CisJCSAgICBvICs9IHN6OworCQkgICAgYnJlYWs7CisKKwkJY2FzZSAnYyc6CS8qIENoYXJhY3RlciAqLworCQkgICAgY2FyZyA9IChjaGFyKXZhX2FyZyhhcCwgaW50KTsKKwkJICAgIHNhcmcgPSAmY2FyZzsKKwkJICAgIHNsZW4gPSAxOworCQkgICAgZ290byBpc19zdHJpbmc7CisJCWNhc2UgJ3MnOgkvKiBTdHJpbmcgKi8KKwkJICAgIHNhcmcgPSB2YV9hcmcoYXAsIGNvbnN0IGNoYXIgKik7CisJCSAgICBzYXJnID0gc2FyZyA/IHNhcmcgOiAiKG51bGwpIjsKKwkJICAgIHNsZW4gPSBzdHJsZW4oc2FyZyk7CisJCSAgICBnb3RvIGlzX3N0cmluZzsKKworaXNfc3RyaW5nOgorCQkgICAgeworCQkJY2hhciBzY2g7CisJCQlpbnQgaTsKKworCQkJaWYgKHByZWMgIT0gLTEgJiYgc2xlbiA+IHByZWMpCisJCQkgICAgc2xlbiA9IHByZWM7CisKKwkJCWlmICh3aWR0aCA+IHNsZW4gJiYgIShmbGFncyAmIEZMX01JTlVTKSkgeworCQkJICAgIGNoYXIgcGFkID0gKGZsYWdzICYgRkxfWkVSTykgPyAnMCcgOiAnICc7CisJCQkgICAgd2hpbGUgKHdpZHRoID4gc2xlbikgeworCQkJCUVNSVQocGFkKTsKKwkJCQl3aWR0aC0tOworCQkJICAgIH0KKwkJCX0KKwkJCWZvciAoaSA9IHNsZW47IGk7IGktLSkgeworCQkJICAgIHNjaCA9ICpzYXJnKys7CisJCQkgICAgRU1JVChzY2gpOworCQkJfQorCQkJaWYgKHdpZHRoID4gc2xlbiAmJiAoZmxhZ3MgJiBGTF9NSU5VUykpIHsKKwkJCSAgICB3aGlsZSAod2lkdGggPiBzbGVuKSB7CisJCQkJRU1JVCgnICcpOworCQkJCXdpZHRoLS07CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQkgICAgYnJlYWs7CisKKwkJY2FzZSAnbic6CS8qIE91dHB1dCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiAqLworCQkgICAgeworCQkJc3dpdGNoIChyYW5rKSB7CisJCQljYXNlIHJhbmtfY2hhcjoKKwkJCSAgICAqdmFfYXJnKGFwLCBzaWduZWQgY2hhciAqKSA9IG87CisJCQkgICAgYnJlYWs7CisJCQljYXNlIHJhbmtfc2hvcnQ6CisJCQkgICAgKnZhX2FyZyhhcCwgc2lnbmVkIHNob3J0ICopID0gbzsKKwkJCSAgICBicmVhazsKKwkJCWNhc2UgcmFua19pbnQ6CisJCQkgICAgKnZhX2FyZyhhcCwgc2lnbmVkIGludCAqKSA9IG87CisJCQkgICAgYnJlYWs7CisJCQljYXNlIHJhbmtfbG9uZzoKKwkJCSAgICAqdmFfYXJnKGFwLCBzaWduZWQgbG9uZyAqKSA9IG87CisJCQkgICAgYnJlYWs7CisJCQljYXNlIHJhbmtfbG9uZ2xvbmc6CisJCQkgICAgKnZhX2FyZyhhcCwgc2lnbmVkIGxvbmcgbG9uZyAqKSA9IG87CisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgICBicmVhazsKKworCQlkZWZhdWx0OgkvKiBBbnl0aGluZyBlbHNlLCBpbmNsdWRpbmcgJSAqLworCQkgICAgRU1JVChjaCk7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIE51bGwtdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKyAgICBpZiAobyA8IG4pCisJKnEgPSAnXDAnOwkJLyogTm8gb3ZlcmZsb3cgKi8KKyAgICBlbHNlIGlmIChuID4gMCkKKwlidWZmZXJbbiAtIDFdID0gJ1wwJzsJLyogT3ZlcmZsb3cgLSB0ZXJtaW5hdGUgYXQgZW5kIG9mIGJ1ZmZlciAqLworCisgICAgcmV0dXJuIG87Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvdnNwcmludGYuYyBiL2NvbTMyL2xpYi92c3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjYyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvdnNwcmludGYuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogdnNwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgdnNwcmludGYoY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisgICAgcmV0dXJuIHZzbnByaW50ZihidWZmZXIsIH4oc2l6ZV90KSAwLCBmb3JtYXQsIGFwKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi92c3NjYW5mLmMgYi9jb20zMi9saWIvdnNzY2FuZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNGM3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvdnNzY2FuZi5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogdnNzY2FuZi5jCisgKgorICogdnNzY2FuZigpLCBmcm9tIHdoaWNoIHRoZSByZXN0IG9mIHRoZSBzY2FuZigpCisgKiBmYW1pbHkgaXMgYnVpbHQKKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL2JpdG9wcy5oPgorCisjaWZuZGVmIExPTkdfQklUCisjZGVmaW5lIExPTkdfQklUIChDSEFSX0JJVCpzaXplb2YobG9uZykpCisjZW5kaWYKKworZW51bSBmbGFncyB7CisgICAgRkxfU1BMQVQgPSAweDAxLAkJLyogRHJvcCB0aGUgdmFsdWUsIGRvIG5vdCBhc3NpZ24gKi8KKyAgICBGTF9XSURUSCA9IDB4MDIsCQkvKiBGaWVsZCB3aWR0aCBzcGVjaWZpZWQgKi8KKyAgICBGTF9NSU5VUyA9IDB4MDQsCQkvKiBOZWdhdGl2ZSBudW1iZXIgKi8KK307CisKK2VudW0gcmFua3MgeworICAgIHJhbmtfY2hhciA9IC0yLAorICAgIHJhbmtfc2hvcnQgPSAtMSwKKyAgICByYW5rX2ludCA9IDAsCisgICAgcmFua19sb25nID0gMSwKKyAgICByYW5rX2xvbmdsb25nID0gMiwKKyAgICByYW5rX3B0ciA9IElOVF9NQVgJCS8qIFNwZWNpYWwgdmFsdWUgdXNlZCBmb3IgcG9pbnRlcnMgKi8KK307CisKKyNkZWZpbmUgTUlOX1JBTksJcmFua19jaGFyCisjZGVmaW5lIE1BWF9SQU5LCXJhbmtfbG9uZ2xvbmcKKworI2RlZmluZSBJTlRNQVhfUkFOSwlyYW5rX2xvbmdsb25nCisjZGVmaW5lIFNJWkVfVF9SQU5LCXJhbmtfbG9uZworI2RlZmluZSBQVFJESUZGX1RfUkFOSwlyYW5rX2xvbmcKKworZW51bSBiYWlsIHsKKyAgICBiYWlsX25vbmUgPSAwLAkJLyogTm8gZXJyb3IgY29uZGl0aW9uICovCisgICAgYmFpbF9lb2YsCQkJLyogSGl0IEVPRiAqLworICAgIGJhaWxfZXJyCQkJLyogQ29udmVyc2lvbiBtaXNtYXRjaCAqLworfTsKKworaW50IHZzc2NhbmYoY29uc3QgY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisgICAgY29uc3QgY2hhciAqcCA9IGZvcm1hdDsKKyAgICBjaGFyIGNoOworICAgIGNvbnN0IGNoYXIgKnEgPSBidWZmZXI7CisgICAgY29uc3QgY2hhciAqcXE7CisgICAgdWludG1heF90IHZhbCA9IDA7CisgICAgaW50IHJhbmsgPSByYW5rX2ludDsJLyogRGVmYXVsdCByYW5rICovCisgICAgdW5zaWduZWQgaW50IHdpZHRoID0gVUlOVF9NQVg7CisgICAgaW50IGJhc2U7CisgICAgZW51bSBmbGFncyBmbGFncyA9IDA7CisgICAgZW51bSB7CisJc3Rfbm9ybWFsLAkJLyogR3JvdW5kIHN0YXRlICovCisJc3RfZmxhZ3MsCQkvKiBTcGVjaWFsIGZsYWdzICovCisJc3Rfd2lkdGgsCQkvKiBGaWVsZCB3aWR0aCAqLworCXN0X21vZGlmaWVycywJCS8qIExlbmd0aCBvciBjb252ZXJzaW9uIG1vZGlmaWVycyAqLworCXN0X21hdGNoX2luaXQsCQkvKiBJbml0aWFsIHN0YXRlIG9mICVbIHNlcXVlbmNlICovCisJc3RfbWF0Y2gsCQkvKiBNYWluIHN0YXRlIG9mICVbIHNlcXVlbmNlICovCisJc3RfbWF0Y2hfcmFuZ2UsCQkvKiBBZnRlciAtIGluIGEgJVsgc2VxdWVuY2UgKi8KKyAgICB9IHN0YXRlID0gc3Rfbm9ybWFsOworICAgIGNoYXIgKnNhcmcgPSBOVUxMOwkJLyogJXMgJWMgb3IgJVsgc3RyaW5nIGFyZ3VtZW50ICovCisgICAgZW51bSBiYWlsIGJhaWwgPSBiYWlsX25vbmU7CisgICAgaW50IGNvbnZlcnRlZCA9IDA7CQkvKiBTdWNjZXNzZnVsIGNvbnZlcnNpb25zICovCisgICAgdW5zaWduZWQgbG9uZyBtYXRjaG1hcFsoKDEgPDwgQ0hBUl9CSVQpICsgKExPTkdfQklUIC0gMSkpIC8gTE9OR19CSVRdOworICAgIGludCBtYXRjaGludiA9IDA7CQkvKiBJcyBtYXRjaCBtYXAgaW52ZXJ0ZWQ/ICovCisgICAgdW5zaWduZWQgY2hhciByYW5nZV9zdGFydCA9IDA7CisKKyAgICB3aGlsZSAoKGNoID0gKnArKykgJiYgIWJhaWwpIHsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBzdF9ub3JtYWw6CisJICAgIGlmIChjaCA9PSAnJScpIHsKKwkJc3RhdGUgPSBzdF9mbGFnczsKKwkJZmxhZ3MgPSAwOworCQlyYW5rID0gcmFua19pbnQ7CisJCXdpZHRoID0gVUlOVF9NQVg7CisJICAgIH0gZWxzZSBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhciljaCkpIHsKKwkJcSA9IHNraXBzcGFjZShxKTsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKCpxID09IGNoKQorCQkgICAgcSsrOworCQllbHNlCisJCSAgICBiYWlsID0gYmFpbF9lcnI7CS8qIE1hdGNoIGZhaWx1cmUgKi8KKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2Ugc3RfZmxhZ3M6CisJICAgIHN3aXRjaCAoY2gpIHsKKwkgICAgY2FzZSAnKic6CisJCWZsYWdzIHw9IEZMX1NQTEFUOworCQlicmVhazsKKwkgICAgY2FzZSAnMCcgLi4uICc5JzoKKwkJd2lkdGggPSAoY2ggLSAnMCcpOworCQlzdGF0ZSA9IHN0X3dpZHRoOworCQlmbGFncyB8PSBGTF9XSURUSDsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCXN0YXRlID0gc3RfbW9kaWZpZXJzOworCQlwLS07CQkvKiBQcm9jZXNzIHRoaXMgY2hhcmFjdGVyIGFnYWluICovCisJCWJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBzdF93aWR0aDoKKwkgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKwkJd2lkdGggPSB3aWR0aCAqIDEwICsgKGNoIC0gJzAnKTsKKwkgICAgfSBlbHNlIHsKKwkJc3RhdGUgPSBzdF9tb2RpZmllcnM7CisJCXAtLTsJCS8qIFByb2Nlc3MgdGhpcyBjaGFyYWN0ZXIgYWdhaW4gKi8KKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2Ugc3RfbW9kaWZpZXJzOgorCSAgICBzd2l0Y2ggKGNoKSB7CisJCS8qIExlbmd0aCBtb2RpZmllcnMgLSBub250ZXJtaW5hbCBzZXF1ZW5jZXMgKi8KKwkgICAgY2FzZSAnaCc6CisJCXJhbmstLTsJCS8qIFNob3J0ZXIgcmFuayAqLworCQlicmVhazsKKwkgICAgY2FzZSAnbCc6CisJCXJhbmsrKzsJCS8qIExvbmdlciByYW5rICovCisJCWJyZWFrOworCSAgICBjYXNlICdqJzoKKwkJcmFuayA9IElOVE1BWF9SQU5LOworCQlicmVhazsKKwkgICAgY2FzZSAneic6CisJCXJhbmsgPSBTSVpFX1RfUkFOSzsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ3QnOgorCQlyYW5rID0gUFRSRElGRl9UX1JBTks7CisJCWJyZWFrOworCSAgICBjYXNlICdMJzoKKwkgICAgY2FzZSAncSc6CisJCXJhbmsgPSByYW5rX2xvbmdsb25nOwkvKiBsb25nIGRvdWJsZS9sb25nIGxvbmcgKi8KKwkJYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkJLyogT3V0cHV0IG1vZGlmaWVycyAtIHRlcm1pbmFsIHNlcXVlbmNlcyAqLworCQlzdGF0ZSA9IHN0X25vcm1hbDsJLyogTmV4dCBzdGF0ZSB3aWxsIGJlIG5vcm1hbCAqLworCQlpZiAocmFuayA8IE1JTl9SQU5LKQkvKiBDYW5vbmljYWxpemUgcmFuayAqLworCQkgICAgcmFuayA9IE1JTl9SQU5LOworCQllbHNlIGlmIChyYW5rID4gTUFYX1JBTkspCisJCSAgICByYW5rID0gTUFYX1JBTks7CisKKwkJc3dpdGNoIChjaCkgeworCQljYXNlICdQJzoJLyogVXBwZXIgY2FzZSBwb2ludGVyICovCisJCWNhc2UgJ3AnOgkvKiBQb2ludGVyICovCisjaWYgMAkJCQkvKiBFbmFibGUgdGhpcyB0byBhbGxvdyBudWxsIHBvaW50ZXJzIGJ5IG5hbWUgKi8KKwkJICAgIHEgPSBza2lwc3BhY2UocSk7CisJCSAgICBpZiAoIWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKnEpKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbnVsbG5hbWVzW10gPQorCQkJICAgIHsgIm51bGwiLCAibnVsIiwgIm5pbCIsICIobnVsbCkiLCAiKG51bCkiLCAiKG5pbCkiLAorMCB9OworCQkJY29uc3QgY2hhciAqY29uc3QgKm5wOworCisJCQkvKiBDaGVjayB0byBzZWUgaWYgaXQncyBhIG51bGwgcG9pbnRlciBieSBuYW1lICovCisJCQlmb3IgKG5wID0gbnVsbG5hbWVzOyAqbnA7IG5wKyspIHsKKwkJCSAgICBpZiAoIXN0cm5jYXNlY21wKHEsICpucCwgc3RybGVuKCpucCkpKSB7CisJCQkJdmFsID0gKHVpbnRtYXhfdCkgKCh2b2lkICopTlVMTCk7CisJCQkJZ290byBzZXRfaW50ZWdlcjsKKwkJCSAgICB9CisJCQl9CisJCQkvKiBGYWlsdXJlICovCisJCQliYWlsID0gYmFpbF9lcnI7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIC8qIGVsc2UgKi8KKyNlbmRpZgorCQkgICAgcmFuayA9IHJhbmtfcHRyOworCQkgICAgYmFzZSA9IDA7CisJCSAgICBnb3RvIHNjYW5faW50OworCisJCWNhc2UgJ2knOgkvKiBCYXNlLWluZGVwZW5kZW50IGludGVnZXIgKi8KKwkJICAgIGJhc2UgPSAwOworCQkgICAgZ290byBzY2FuX2ludDsKKworCQljYXNlICdkJzoJLyogRGVjaW1hbCBpbnRlZ2VyICovCisJCSAgICBiYXNlID0gMTA7CisJCSAgICBnb3RvIHNjYW5faW50OworCisJCWNhc2UgJ28nOgkvKiBPY3RhbCBpbnRlZ2VyICovCisJCSAgICBiYXNlID0gODsKKwkJICAgIGdvdG8gc2Nhbl9pbnQ7CisKKwkJY2FzZSAndSc6CS8qIFVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciAqLworCQkgICAgYmFzZSA9IDEwOworCQkgICAgZ290byBzY2FuX2ludDsKKworCQljYXNlICd4JzoJLyogSGV4YWRlY2ltYWwgaW50ZWdlciAqLworCQljYXNlICdYJzoKKwkJICAgIGJhc2UgPSAxNjsKKwkJICAgIGdvdG8gc2Nhbl9pbnQ7CisKKwkJY2FzZSAnbic6CS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbnN1bWVkICovCisJCSAgICB2YWwgPSAocSAtIGJ1ZmZlcik7CisJCSAgICBnb3RvIHNldF9pbnRlZ2VyOworCitzY2FuX2ludDoKKwkJICAgIHEgPSBza2lwc3BhY2UocSk7CisJCSAgICBpZiAoISpxKSB7CisJCQliYWlsID0gYmFpbF9lb2Y7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIHZhbCA9IHN0cm50b3VtYXgocSwgKGNoYXIgKiopJnFxLCBiYXNlLCB3aWR0aCk7CisJCSAgICBpZiAocXEgPT0gcSkgeworCQkJYmFpbCA9IGJhaWxfZXJyOworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBxID0gcXE7CisJCSAgICBjb252ZXJ0ZWQrKzsKKwkJICAgIC8qIGZhbGwgdGhyb3VnaCAqLworCitzZXRfaW50ZWdlcjoKKwkJICAgIGlmICghKGZsYWdzICYgRkxfU1BMQVQpKSB7CisJCQlzd2l0Y2ggKHJhbmspIHsKKwkJCWNhc2UgcmFua19jaGFyOgorCQkJICAgICp2YV9hcmcoYXAsIHVuc2lnbmVkIGNoYXIgKikgPSAodW5zaWduZWQgY2hhcil2YWw7CisJCQkgICAgYnJlYWs7CisJCQljYXNlIHJhbmtfc2hvcnQ6CisJCQkgICAgKnZhX2FyZyhhcCwgdW5zaWduZWQgc2hvcnQgKikgPSAodW5zaWduZWQgc2hvcnQpdmFsOworCQkJICAgIGJyZWFrOworCQkJY2FzZSByYW5rX2ludDoKKwkJCSAgICAqdmFfYXJnKGFwLCB1bnNpZ25lZCBpbnQgKikgPSAodW5zaWduZWQgaW50KXZhbDsKKwkJCSAgICBicmVhazsKKwkJCWNhc2UgcmFua19sb25nOgorCQkJICAgICp2YV9hcmcoYXAsIHVuc2lnbmVkIGxvbmcgKikgPSAodW5zaWduZWQgbG9uZyl2YWw7CisJCQkgICAgYnJlYWs7CisJCQljYXNlIHJhbmtfbG9uZ2xvbmc6CisJCQkgICAgKnZhX2FyZyhhcCwgdW5zaWduZWQgbG9uZyBsb25nICopID0KKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZhbDsKKwkJCSAgICBicmVhazsKKwkJCWNhc2UgcmFua19wdHI6CisJCQkgICAgKnZhX2FyZyhhcCwgdm9pZCAqKikgPSAodm9pZCAqKSh1aW50cHRyX3QpIHZhbDsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGJyZWFrOworCisJCWNhc2UgJ2MnOgkvKiBDaGFyYWN0ZXIgKi8KKwkJICAgIHdpZHRoID0gKGZsYWdzICYgRkxfV0lEVEgpID8gd2lkdGggOiAxOwkvKiBEZWZhdWx0IHdpZHRoID09IDEgKi8KKwkJICAgIHNhcmcgPSB2YV9hcmcoYXAsIGNoYXIgKik7CisJCSAgICB3aGlsZSAod2lkdGgtLSkgeworCQkJaWYgKCEqcSkgeworCQkJICAgIGJhaWwgPSBiYWlsX2VvZjsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCSpzYXJnKysgPSAqcSsrOworCQkgICAgfQorCQkgICAgaWYgKCFiYWlsKQorCQkJY29udmVydGVkKys7CisJCSAgICBicmVhazsKKworCQljYXNlICdzJzoJLyogU3RyaW5nICovCisJCSAgICB7CisJCQljaGFyICpzcDsKKwkJCXNwID0gc2FyZyA9IHZhX2FyZyhhcCwgY2hhciAqKTsKKwkJCXdoaWxlICh3aWR0aC0tICYmICpxICYmICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpxKSkgeworCQkJICAgICpzcCsrID0gKnErKzsKKwkJCX0KKwkJCWlmIChzYXJnICE9IHNwKSB7CisJCQkgICAgKnNwID0gJ1wwJzsJLyogVGVybWluYXRlIG91dHB1dCAqLworCQkJICAgIGNvbnZlcnRlZCsrOworCQkJfSBlbHNlIHsKKwkJCSAgICBiYWlsID0gYmFpbF9lb2Y7CisJCQl9CisJCSAgICB9CisJCSAgICBicmVhazsKKworCQljYXNlICdbJzoJLyogQ2hhcmFjdGVyIHJhbmdlICovCisJCSAgICBzYXJnID0gdmFfYXJnKGFwLCBjaGFyICopOworCQkgICAgc3RhdGUgPSBzdF9tYXRjaF9pbml0OworCQkgICAgbWF0Y2hpbnYgPSAwOworCQkgICAgbWVtc2V0KG1hdGNobWFwLCAwLCBzaXplb2YgbWF0Y2htYXApOworCQkgICAgYnJlYWs7CisKKwkJY2FzZSAnJSc6CS8qICUlIHNlcXVlbmNlICovCisJCSAgICBpZiAoKnEgPT0gJyUnKQorCQkJcSsrOworCQkgICAgZWxzZQorCQkJYmFpbCA9IGJhaWxfZXJyOworCQkgICAgYnJlYWs7CisKKwkJZGVmYXVsdDoJLyogQW55dGhpbmcgZWxzZSAqLworCQkgICAgYmFpbCA9IGJhaWxfZXJyOwkvKiBVbmtub3duIHNlcXVlbmNlICovCisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBzdF9tYXRjaF9pbml0OgkvKiBJbml0aWFsIHN0YXRlIGZvciAlWyBtYXRjaCAqLworCSAgICBpZiAoY2ggPT0gJ14nICYmICFtYXRjaGludikgeworCQltYXRjaGludiA9IDE7CisJICAgIH0gZWxzZSB7CisJCXJhbmdlX3N0YXJ0ID0gKHVuc2lnbmVkIGNoYXIpY2g7CisJCXNldF9iaXQoKHVuc2lnbmVkIGNoYXIpY2gsIG1hdGNobWFwKTsKKwkJc3RhdGUgPSBzdF9tYXRjaDsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2Ugc3RfbWF0Y2g6CQkvKiBNYWluIHN0YXRlIGZvciAlWyBtYXRjaCAqLworCSAgICBpZiAoY2ggPT0gJ10nKSB7CisJCWdvdG8gbWF0Y2hfcnVuOworCSAgICB9IGVsc2UgaWYgKGNoID09ICctJykgeworCQlzdGF0ZSA9IHN0X21hdGNoX3JhbmdlOworCSAgICB9IGVsc2UgeworCQlyYW5nZV9zdGFydCA9ICh1bnNpZ25lZCBjaGFyKWNoOworCQlzZXRfYml0KCh1bnNpZ25lZCBjaGFyKWNoLCBtYXRjaG1hcCk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIHN0X21hdGNoX3JhbmdlOgkvKiAlWyBtYXRjaCBhZnRlciAtICovCisJICAgIGlmIChjaCA9PSAnXScpIHsKKwkJc2V0X2JpdCgodW5zaWduZWQgY2hhciknLScsIG1hdGNobWFwKTsJLyogLSB3YXMgbGFzdCBjaGFyYWN0ZXIgKi8KKwkJZ290byBtYXRjaF9ydW47CisJICAgIH0gZWxzZSB7CisJCWludCBpOworCQlmb3IgKGkgPSByYW5nZV9zdGFydDsgaSA8PSAodW5zaWduZWQgY2hhciljaDsgaSsrKQorCQkgICAgc2V0X2JpdChpLCBtYXRjaG1hcCk7CisJCXN0YXRlID0gc3RfbWF0Y2g7CisJICAgIH0KKwkgICAgYnJlYWs7CisKK21hdGNoX3J1bjoJCQkvKiBNYXRjaCBleHByZXNzaW9uIGZpbmlzaGVkICovCisJICAgIHFxID0gcTsKKwkgICAgd2hpbGUgKHdpZHRoICYmICpxCisJCSAgICYmIHRlc3RfYml0KCh1bnNpZ25lZCBjaGFyKSpxLCBtYXRjaG1hcCkgXiBtYXRjaGludikgeworCQkqc2FyZysrID0gKnErKzsKKwkgICAgfQorCSAgICBpZiAocSAhPSBxcSkgeworCQkqc2FyZyA9ICdcMCc7CisJCWNvbnZlcnRlZCsrOworCSAgICB9IGVsc2UgeworCQliYWlsID0gKnEgPyBiYWlsX2VyciA6IGJhaWxfZW9mOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBpZiAoYmFpbCA9PSBiYWlsX2VvZiAmJiAhY29udmVydGVkKQorCWNvbnZlcnRlZCA9IC0xOwkJLyogUmV0dXJuIEVPRiAoLTEpICovCisKKyAgICByZXR1cm4gY29udmVydGVkOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3g4Nl82NC9lbGYubGQgYi9jb20zMi9saWIveDg2XzY0L2VsZi5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGVlN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3g4Nl82NC9lbGYubGQKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciBFTEYgZHluYW1pYyBsb2FkZWQgbW9kdWxlcy4KKyAqIFRoaXMgc2ltcGx5IG1pcnJvcnMgdGhlIDMyYml0IGxpbmtlciBzY3JpcHQgd2l0aCBtaW5pbWFsIHg4Nl82NCBjaGFuZ2VzCisgKi8KKworLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2M6IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICA6IHsgKiguZ251Lmhhc2gpIH0JCisgIC5keW5zeW0gIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKy8qIG1vdWxpOiBpbnRyb2R1Y2UgYWxpZ25tZW50IGZvciB2YXJpb3VzIHNlZ21lbnRzICovCisgIC5yZWwuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwuaW5pdCkKKyAgICAgICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbC5maW5pKQorICAgICAgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbC5kYXRhLnJlbC5ybyogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikKKyAgICAgICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbC50YnNzIC5yZWwudGJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWwuY3RvcnMpCisgICAgICAqKC5yZWwuZHRvcnMpCisgICAgICAqKC5yZWwuZ290KQorICAgICAgKigucmVsLmJzcyAucmVsLmJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLmIuKikKKyAgICB9CisgIC5yZWxhLmR5biAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgfQorICAucmVsLnBsdCA6IHsgKigucmVsLnBsdCk7IH0KKyAgLnJlbGEucGx0IDogeyAqKC5yZWxhLnBsdCkgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0IDoKKyAgeworICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICBLRUVQICgqKC50ZXh0LipwZXJzb25hbGl0eSopKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC4gPSBBTElHTig0KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgCV9fY3RvcnNfc3RhcnQgPSAuOworICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgICBLRUVQICgqKC5jdG9yc19tb2Rpbml0KSkKKyAgICBLRUVQICgqKC5jdG9yc19tb2RtYWluKSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorCV9fY3RvcnNfZW5kID0gLjsKKyAgfQorICAKKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAJX19kdG9yc19zdGFydCA9IC47CisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICAgIEtFRVAgKCooLmR0b3JzX21vZGV4aXQpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisJX19kdG9yc19lbmQgPSAuOworICB9CisgIAorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgfQorICAvKi4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgxMiwgLik7IC0+IFRoaXMgZ2l2ZXMgYSAiaW52YWxpZCBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXIiIGVycm9yICovCisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIEtFRVAgKCooLmdudS5saW5rb25jZS5kLipwZXJzb25hbGl0eSopKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgUFJPVklERSAoX2VkYXRhID0gLik7IAorICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC8qLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOyovCisgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFIChfZW5kID0gLik7IAorICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLyouID0gREFUQV9TRUdNRU5UX0VORCAoLik7IC0+IFRoaXMgZ2l2ZXMgYSAiaW52YWxpZCBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXIiIGVycm9yICovCisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5laF9mcmFtZSkgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3g4Nl82NC9zZXRqbXAuUyBiL2NvbTMyL2xpYi94ODZfNjQvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmNTQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi94ODZfNjQvc2V0am1wLlMKQEAgLTAsMCArMSw1NCBAQAorIworIyBhcmNoL3g4Nl82NC9zZXRqbXAuUworIworIyBzZXRqbXAvbG9uZ2ptcCBmb3IgdGhlIHg4Ni02NCBhcmNoaXRlY3R1cmUKKyMKKworIworIyBUaGUgam1wX2J1ZiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZywgaW4gb3JkZXI6CisjCSVyYngKKyMJJXJzcCAocG9zdC1yZXR1cm4pCisjCSVyYnAKKyMJJXIxMgorIwklcjEzCisjCSVyMTQKKyMJJXIxNQorIwk8cmV0dXJuIGFkZHJlc3M+CisjCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIHNldGptcAorCS50eXBlIHNldGptcCwgQGZ1bmN0aW9uCitzZXRqbXA6CisJcG9wICAlcnNpCQkJIyBSZXR1cm4gYWRkcmVzcywgYW5kIGFkanVzdCB0aGUgc3RhY2sKKwl4b3JsICVlYXgsJWVheAkJCSMgUmV0dXJuIHZhbHVlCisJbW92cSAlcmJ4LCglcmRpKQorCW1vdnEgJXJzcCw4KCVyZGkpCQkjIFBvc3QtcmV0dXJuICVyc3AhCisJcHVzaCAlcnNpCQkJIyBNYWtlIHRoZSBjYWxsL3JldHVybiBzdGFjayBoYXBweQorCW1vdnEgJXJicCwxNiglcmRpKQorCW1vdnEgJXIxMiwyNCglcmRpKQorCW1vdnEgJXIxMywzMiglcmRpKQorCW1vdnEgJXIxNCw0MCglcmRpKQorCW1vdnEgJXIxNSw0OCglcmRpKQorCW1vdnEgJXJzaSw1NiglcmRpKQkJIyBSZXR1cm4gYWRkcmVzcworCXJldAorCisJLnNpemUgc2V0am1wLC4tc2V0am1wCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIGxvbmdqbXAKKwkudHlwZSBsb25nam1wLCBAZnVuY3Rpb24KK2xvbmdqbXA6CisJbW92bCAlZXNpLCVlYXgJCQkjIFJldHVybiB2YWx1ZSAoaW50KQorCW1vdnEgKCVyZGkpLCVyYngKKwltb3ZxIDgoJXJkaSksJXJzcAorCW1vdnEgMTYoJXJkaSksJXJicAorCW1vdnEgMjQoJXJkaSksJXIxMgorCW1vdnEgMzIoJXJkaSksJXIxMworCW1vdnEgNDAoJXJkaSksJXIxNAorCW1vdnEgNDgoJXJkaSksJXIxNQorCWptcCAqNTYoJXJkaSkKKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS9jb20zMi9saWIvemxpYi9GQVEgYi9jb20zMi9saWIvemxpYi9GQVEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyMjc1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL0ZBUQpAQCAtMCwwICsxLDM2NiBAQAorCisgICAgICAgICAgICAgICAgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgemxpYgorCisKK0lmIHlvdXIgcXVlc3Rpb24gaXMgbm90IHRoZXJlLCBwbGVhc2UgY2hlY2sgdGhlIHpsaWIgaG9tZSBwYWdlCitodHRwOi8vemxpYi5uZXQvIHdoaWNoIG1heSBoYXZlIG1vcmUgcmVjZW50IGluZm9ybWF0aW9uLgorVGhlIGxhc3Rlc3QgemxpYiBGQVEgaXMgYXQgaHR0cDovL3psaWIubmV0L3psaWJfZmFxLmh0bWwKKworCisgMS4gSXMgemxpYiBZMkstY29tcGxpYW50PworCisgICAgWWVzLiB6bGliIGRvZXNuJ3QgaGFuZGxlIGRhdGVzLgorCisgMi4gV2hlcmUgY2FuIEkgZ2V0IGEgV2luZG93cyBETEwgdmVyc2lvbj8KKworICAgIFRoZSB6bGliIHNvdXJjZXMgY2FuIGJlIGNvbXBpbGVkIHdpdGhvdXQgY2hhbmdlIHRvIHByb2R1Y2UgYSBETEwuICBTZWUgdGhlCisgICAgZmlsZSB3aW4zMi9ETExfRkFRLnR4dCBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24uICBQb2ludGVycyB0byB0aGUKKyAgICBwcmVjb21waWxlZCBETEwgYXJlIGZvdW5kIGluIHRoZSB6bGliIHdlYiBzaXRlIGF0IGh0dHA6Ly96bGliLm5ldC8gLgorCisgMy4gV2hlcmUgY2FuIEkgZ2V0IGEgVmlzdWFsIEJhc2ljIGludGVyZmFjZSB0byB6bGliPworCisgICAgU2VlCisgICAgICAgICogaHR0cDovL21hcmtuZWxzb24udXMvMTk5Ny8wMS8wMS96bGliLWVuZ2luZS8KKyAgICAgICAgKiB3aW4zMi9ETExfRkFRLnR4dCBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24KKworIDQuIGNvbXByZXNzKCkgcmV0dXJucyBaX0JVRl9FUlJPUi4KKworICAgIE1ha2Ugc3VyZSB0aGF0IGJlZm9yZSB0aGUgY2FsbCBvZiBjb21wcmVzcygpLCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkCisgICAgYnVmZmVyIGlzIGVxdWFsIHRvIHRoZSBhdmFpbGFibGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIgYW5kIG5vdAorICAgIHplcm8uICBGb3IgVmlzdWFsIEJhc2ljLCBjaGVjayB0aGF0IHRoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBieSByZWZlcmVuY2UKKyAgICAoImFzIGFueSIpLCBub3QgYnkgdmFsdWUgKCJhcyBsb25nIikuCisKKyA1LiBkZWZsYXRlKCkgb3IgaW5mbGF0ZSgpIHJldHVybnMgWl9CVUZfRVJST1IuCisKKyAgICBCZWZvcmUgbWFraW5nIHRoZSBjYWxsLCBtYWtlIHN1cmUgdGhhdCBhdmFpbF9pbiBhbmQgYXZhaWxfb3V0IGFyZSBub3QgemVyby4KKyAgICBXaGVuIHNldHRpbmcgdGhlIHBhcmFtZXRlciBmbHVzaCBlcXVhbCB0byBaX0ZJTklTSCwgYWxzbyBtYWtlIHN1cmUgdGhhdAorICAgIGF2YWlsX291dCBpcyBiaWcgZW5vdWdoIHRvIGFsbG93IHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgaW5wdXQuICBOb3RlIHRoYXQgYQorICAgIFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbC0tYW5vdGhlciBjYWxsIHRvIGRlZmxhdGUoKSBvciBpbmZsYXRlKCkgY2FuIGJlCisgICAgbWFkZSB3aXRoIG1vcmUgaW5wdXQgb3Igb3V0cHV0IHNwYWNlLiAgQSBaX0JVRl9FUlJPUiBtYXkgaW4gZmFjdCBiZQorICAgIHVuYXZvaWRhYmxlIGRlcGVuZGluZyBvbiBob3cgdGhlIGZ1bmN0aW9ucyBhcmUgdXNlZCwgc2luY2UgaXQgaXMgbm90CisgICAgcG9zc2libGUgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBtb3JlIG91dHB1dCBwZW5kaW5nIHdoZW4KKyAgICBzdHJtLmF2YWlsX291dCByZXR1cm5zIHdpdGggemVyby4gIFNlZSBodHRwOi8vemxpYi5uZXQvemxpYl9ob3cuaHRtbCBmb3IgYQorICAgIGhlYXZpbHkgYW5ub3RhdGVkIGV4YW1wbGUuCisKKyA2LiBXaGVyZSdzIHRoZSB6bGliIGRvY3VtZW50YXRpb24gKG1hbiBwYWdlcywgZXRjLik/CisKKyAgICBJdCdzIGluIHpsaWIuaCAuICBFeGFtcGxlcyBvZiB6bGliIHVzYWdlIGFyZSBpbiB0aGUgZmlsZXMgZXhhbXBsZS5jIGFuZAorICAgIG1pbmlnemlwLmMsIHdpdGggbW9yZSBpbiBleGFtcGxlcy8gLgorCisgNy4gV2h5IGRvbid0IHlvdSB1c2UgR05VIGF1dG9jb25mIG9yIGxpYnRvb2wgb3IgLi4uPworCisgICAgQmVjYXVzZSB3ZSB3b3VsZCBsaWtlIHRvIGtlZXAgemxpYiBhcyBhIHZlcnkgc21hbGwgYW5kIHNpbXBsZSBwYWNrYWdlLgorICAgIHpsaWIgaXMgcmF0aGVyIHBvcnRhYmxlIGFuZCBkb2Vzbid0IG5lZWQgbXVjaCBjb25maWd1cmF0aW9uLgorCisgOC4gSSBmb3VuZCBhIGJ1ZyBpbiB6bGliLgorCisgICAgTW9zdCBvZiB0aGUgdGltZSwgc3VjaCBwcm9ibGVtcyBhcmUgZHVlIHRvIGFuIGluY29ycmVjdCB1c2FnZSBvZiB6bGliLgorICAgIFBsZWFzZSB0cnkgdG8gcmVwcm9kdWNlIHRoZSBwcm9ibGVtIHdpdGggYSBzbWFsbCBwcm9ncmFtIGFuZCBzZW5kIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIHRvIHVzIGF0IHpsaWJAZ3ppcC5vcmcgLiAgRG8gbm90IHNlbmQgbXVsdGktbWVnYWJ5dGUKKyAgICBkYXRhIGZpbGVzIHdpdGhvdXQgcHJpb3IgYWdyZWVtZW50LgorCisgOS4gV2h5IGRvIEkgZ2V0ICJ1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGd6cHV0YyI/CisKKyAgICBJZiAibWFrZSB0ZXN0IiBwcm9kdWNlcyBzb21ldGhpbmcgbGlrZQorCisgICAgICAgZXhhbXBsZS5vKC50ZXh0KzB4MTU0KTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgZ3pwdXRjJworCisgICAgY2hlY2sgdGhhdCB5b3UgZG9uJ3QgaGF2ZSBvbGQgZmlsZXMgbGliei4qIGluIC91c3IvbGliLCAvdXNyL2xvY2FsL2xpYiBvcgorICAgIC91c3IvWDExUjYvbGliLiBSZW1vdmUgYW55IG9sZCB2ZXJzaW9ucywgdGhlbiBkbyAibWFrZSBpbnN0YWxsIi4KKworMTAuIEkgbmVlZCBhIERlbHBoaSBpbnRlcmZhY2UgdG8gemxpYi4KKworICAgIFNlZSB0aGUgY29udHJpYi9kZWxwaGkgZGlyZWN0b3J5IGluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbi4KKworMTEuIENhbiB6bGliIGhhbmRsZSAuemlwIGFyY2hpdmVzPworCisgICAgTm90IGJ5IGl0c2VsZiwgbm8uICBTZWUgdGhlIGRpcmVjdG9yeSBjb250cmliL21pbml6aXAgaW4gdGhlIHpsaWIKKyAgICBkaXN0cmlidXRpb24uCisKKzEyLiBDYW4gemxpYiBoYW5kbGUgLlogZmlsZXM/CisKKyAgICBObywgc29ycnkuICBZb3UgaGF2ZSB0byBzcGF3biBhbiB1bmNvbXByZXNzIG9yIGd1bnppcCBzdWJwcm9jZXNzLCBvciBhZGFwdAorICAgIHRoZSBjb2RlIG9mIHVuY29tcHJlc3Mgb24geW91ciBvd24uCisKKzEzLiBIb3cgY2FuIEkgbWFrZSBhIFVuaXggc2hhcmVkIGxpYnJhcnk/CisKKyAgICBtYWtlIGNsZWFuCisgICAgLi9jb25maWd1cmUgLXMKKyAgICBtYWtlCisKKzE0LiBIb3cgZG8gSSBpbnN0YWxsIGEgc2hhcmVkIHpsaWIgbGlicmFyeSBvbiBVbml4PworCisgICAgQWZ0ZXIgdGhlIGFib3ZlLCB0aGVuOgorCisgICAgbWFrZSBpbnN0YWxsCisKKyAgICBIb3dldmVyLCBtYW55IGZsYXZvcnMgb2YgVW5peCBjb21lIHdpdGggYSBzaGFyZWQgemxpYiBhbHJlYWR5IGluc3RhbGxlZC4KKyAgICBCZWZvcmUgZ29pbmcgdG8gdGhlIHRyb3VibGUgb2YgY29tcGlsaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgemxpYiBhbmQKKyAgICB0cnlpbmcgdG8gaW5zdGFsbCBpdCwgeW91IG1heSB3YW50IHRvIGNoZWNrIGlmIGl0J3MgYWxyZWFkeSB0aGVyZSEgIElmIHlvdQorICAgIGNhbiAjaW5jbHVkZSA8emxpYi5oPiwgaXQncyB0aGVyZS4gIFRoZSAtbHogb3B0aW9uIHdpbGwgcHJvYmFibHkgbGluayB0bworICAgIGl0LiAgWW91IGNhbiBjaGVjayB0aGUgdmVyc2lvbiBhdCB0aGUgdG9wIG9mIHpsaWIuaCBvciB3aXRoIHRoZQorICAgIFpMSUJfVkVSU0lPTiBzeW1ib2wgZGVmaW5lZCBpbiB6bGliLmggLgorCisxNS4gSSBoYXZlIGEgcXVlc3Rpb24gYWJvdXQgT3R0b1BERi4KKworICAgIFdlIGFyZSBub3QgdGhlIGF1dGhvcnMgb2YgT3R0b1BERi4gVGhlIHJlYWwgYXV0aG9yIGlzIG9uIHRoZSBPdHRvUERGIHdlYgorICAgIHNpdGU6IEpvZWwgSGFpbmxleSwgamhhaW5sZXlAbXluZGtyeW1lLmNvbS4KKworMTYuIENhbiB6bGliIGRlY29kZSBGbGF0ZSBkYXRhIGluIGFuIEFkb2JlIFBERiBmaWxlPworCisgICAgWWVzLiBTZWUgaHR0cDovL3d3dy5wZGZsaWIuY29tLyAuIFRvIG1vZGlmeSBQREYgZm9ybXMsIHNlZQorICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYWNyb2Zvcm10b29sLyAuCisKKzE3LiBXaHkgYW0gSSBnZXR0aW5nIHRoaXMgInJlZ2lzdGVyX2ZyYW1lX2luZm8gbm90IGZvdW5kIiBlcnJvciBvbiBTb2xhcmlzPworCisgICAgQWZ0ZXIgaW5zdGFsbGluZyB6bGliIDEuMS40IG9uIFNvbGFyaXMgMi42LCBydW5uaW5nIGFwcGxpY2F0aW9ucyB1c2luZyB6bGliCisgICAgZ2VuZXJhdGVzIGFuIGVycm9yIHN1Y2ggYXM6CisKKyAgICAgICAgbGQuc28uMTogcnBtOiBmYXRhbDogcmVsb2NhdGlvbiBlcnJvcjogZmlsZSAvdXNyL2xvY2FsL2xpYi9saWJ6LnNvOgorICAgICAgICBzeW1ib2wgX19yZWdpc3Rlcl9mcmFtZV9pbmZvOiByZWZlcmVuY2VkIHN5bWJvbCBub3QgZm91bmQKKworICAgIFRoZSBzeW1ib2wgX19yZWdpc3Rlcl9mcmFtZV9pbmZvIGlzIG5vdCBwYXJ0IG9mIHpsaWIsIGl0IGlzIGdlbmVyYXRlZCBieQorICAgIHRoZSBDIGNvbXBpbGVyIChjYyBvciBnY2MpLiAgWW91IG11c3QgcmVjb21waWxlIGFwcGxpY2F0aW9ucyB1c2luZyB6bGliCisgICAgd2hpY2ggaGF2ZSB0aGlzIHByb2JsZW0uICBUaGlzIHByb2JsZW0gaXMgc3BlY2lmaWMgdG8gU29sYXJpcy4gIFNlZQorICAgIGh0dHA6Ly93d3cuc3VuZnJlZXdhcmUuY29tIGZvciBTb2xhcmlzIHZlcnNpb25zIG9mIHpsaWIgYW5kIGFwcGxpY2F0aW9ucworICAgIHVzaW5nIHpsaWIuCisKKzE4LiBXaHkgZG9lcyBnemlwIGdpdmUgYW4gZXJyb3Igb24gYSBmaWxlIEkgbWFrZSB3aXRoIGNvbXByZXNzL2RlZmxhdGU/CisKKyAgICBUaGUgY29tcHJlc3MgYW5kIGRlZmxhdGUgZnVuY3Rpb25zIHByb2R1Y2UgZGF0YSBpbiB0aGUgemxpYiBmb3JtYXQsIHdoaWNoCisgICAgaXMgZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZ3ppcCBmb3JtYXQuICBUaGUgZ3oqIGZ1bmN0aW9ucyBpbgorICAgIHpsaWIgb24gdGhlIG90aGVyIGhhbmQgdXNlIHRoZSBnemlwIGZvcm1hdC4gIEJvdGggdGhlIHpsaWIgYW5kIGd6aXAgZm9ybWF0cworICAgIHVzZSB0aGUgc2FtZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IGludGVybmFsbHksIGJ1dCBoYXZlIGRpZmZlcmVudCBoZWFkZXJzCisgICAgYW5kIHRyYWlsZXJzIGFyb3VuZCB0aGUgY29tcHJlc3NlZCBkYXRhLgorCisxOS4gT2ssIHNvIHdoeSBhcmUgdGhlcmUgdHdvIGRpZmZlcmVudCBmb3JtYXRzPworCisgICAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byByZXRhaW4gdGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBhYm91dCBhCisgICAgc2luZ2xlIGZpbGUsIHN1Y2ggYXMgdGhlIG5hbWUgYW5kIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuICBUaGUgemxpYiBmb3JtYXQKKyAgICBvbiB0aGUgb3RoZXIgaGFuZCB3YXMgZGVzaWduZWQgZm9yIGluLW1lbW9yeSBhbmQgY29tbXVuaWNhdGlvbiBjaGFubmVsCisgICAgYXBwbGljYXRpb25zLCBhbmQgaGFzIGEgbXVjaCBtb3JlIGNvbXBhY3QgaGVhZGVyIGFuZCB0cmFpbGVyIGFuZCB1c2VzIGEKKyAgICBmYXN0ZXIgaW50ZWdyaXR5IGNoZWNrIHRoYW4gZ3ppcC4KKworMjAuIFdlbGwgdGhhdCdzIG5pY2UsIGJ1dCBob3cgZG8gSSBtYWtlIGEgZ3ppcCBmaWxlIGluIG1lbW9yeT8KKworICAgIFlvdSBjYW4gcmVxdWVzdCB0aGF0IGRlZmxhdGUgd3JpdGUgdGhlIGd6aXAgZm9ybWF0IGluc3RlYWQgb2YgdGhlIHpsaWIKKyAgICBmb3JtYXQgdXNpbmcgZGVmbGF0ZUluaXQyKCkuICBZb3UgY2FuIGFsc28gcmVxdWVzdCB0aGF0IGluZmxhdGUgZGVjb2RlIHRoZQorICAgIGd6aXAgZm9ybWF0IHVzaW5nIGluZmxhdGVJbml0MigpLiAgUmVhZCB6bGliLmggZm9yIG1vcmUgZGV0YWlscy4KKworMjEuIElzIHpsaWIgdGhyZWFkLXNhZmU/CisKKyAgICBZZXMuICBIb3dldmVyIGFueSBsaWJyYXJ5IHJvdXRpbmVzIHRoYXQgemxpYiB1c2VzIGFuZCBhbnkgYXBwbGljYXRpb24tCisgICAgcHJvdmlkZWQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgbXVzdCBhbHNvIGJlIHRocmVhZC1zYWZlLiAgemxpYidzIGd6KgorICAgIGZ1bmN0aW9ucyB1c2Ugc3RkaW8gbGlicmFyeSByb3V0aW5lcywgYW5kIG1vc3Qgb2YgemxpYidzIGZ1bmN0aW9ucyB1c2UgdGhlCisgICAgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBieSBkZWZhdWx0LiAgemxpYidzICpJbml0KiBmdW5jdGlvbnMKKyAgICBhbGxvdyBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgY3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgorCisgICAgT2YgY291cnNlLCB5b3Ugc2hvdWxkIG9ubHkgb3BlcmF0ZSBvbiBhbnkgZ2l2ZW4gemxpYiBvciBnemlwIHN0cmVhbSBmcm9tIGEKKyAgICBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KKworMjIuIENhbiBJIHVzZSB6bGliIGluIG15IGNvbW1lcmNpYWwgYXBwbGljYXRpb24/CisKKyAgICBZZXMuICBQbGVhc2UgcmVhZCB0aGUgbGljZW5zZSBpbiB6bGliLmguCisKKzIzLiBJcyB6bGliIHVuZGVyIHRoZSBHTlUgbGljZW5zZT8KKworICAgIE5vLiAgUGxlYXNlIHJlYWQgdGhlIGxpY2Vuc2UgaW4gemxpYi5oLgorCisyNC4gVGhlIGxpY2Vuc2Ugc2F5cyB0aGF0IGFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgInBsYWlubHkgbWFya2VkIi4gU28KKyAgICB3aGF0IGV4YWN0bHkgZG8gSSBuZWVkIHRvIGRvIHRvIG1lZXQgdGhhdCByZXF1aXJlbWVudD8KKworICAgIFlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgWkxJQl9WRVJTSU9OIGFuZCBaTElCX1ZFUk5VTSAjZGVmaW5lcyBpbiB6bGliLmguICBJbgorICAgIHBhcnRpY3VsYXIsIHRoZSBmaW5hbCB2ZXJzaW9uIG51bWJlciBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvICJmIiwgYW5kIGFuCisgICAgaWRlbnRpZmljYXRpb24gc3RyaW5nIHNob3VsZCBiZSBhcHBlbmRlZCB0byBaTElCX1ZFUlNJT04uICBWZXJzaW9uIG51bWJlcnMKKyAgICB4LngueC5mIGFyZSByZXNlcnZlZCBmb3IgbW9kaWZpY2F0aW9ucyB0byB6bGliIGJ5IG90aGVycyB0aGFuIHRoZSB6bGliCisgICAgbWFpbnRhaW5lcnMuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgemxpYiB5b3UgYXJlIGFsdGVyaW5nCisgICAgaXMgIjEuMi4zLjQiLCB0aGVuIGluIHpsaWIuaCB5b3Ugc2hvdWxkIGNoYW5nZSBaTElCX1ZFUk5VTSB0byAweDEyM2YsIGFuZAorICAgIFpMSUJfVkVSU0lPTiB0byBzb21ldGhpbmcgbGlrZSAiMS4yLjMuZi16YWNoYXJ5LW1vZHMtdjMiLiAgWW91IGNhbiBhbHNvCisgICAgdXBkYXRlIHRoZSB2ZXJzaW9uIHN0cmluZ3MgaW4gZGVmbGF0ZS5jIGFuZCBpbmZ0cmVlcy5jLgorCisgICAgRm9yIGFsdGVyZWQgc291cmNlIGRpc3RyaWJ1dGlvbnMsIHlvdSBzaG91bGQgYWxzbyBub3RlIHRoZSBvcmlnaW4gYW5kCisgICAgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzIGluIHpsaWIuaCwgYXMgd2VsbCBhcyBpbiBDaGFuZ2VMb2cgYW5kIFJFQURNRSwgYWxvbmcKKyAgICB3aXRoIHRoZSBkYXRlcyBvZiB0aGUgYWx0ZXJhdGlvbnMuICBUaGUgb3JpZ2luIHNob3VsZCBpbmNsdWRlIGF0IGxlYXN0IHlvdXIKKyAgICBuYW1lIChvciB5b3VyIGNvbXBhbnkncyBuYW1lKSwgYW5kIGFuIGVtYWlsIGFkZHJlc3MgdG8gY29udGFjdCBmb3IgaGVscCBvcgorICAgIGlzc3VlcyB3aXRoIHRoZSBsaWJyYXJ5LgorCisgICAgTm90ZSB0aGF0IGRpc3RyaWJ1dGluZyBhIGNvbXBpbGVkIHpsaWIgbGlicmFyeSBhbG9uZyB3aXRoIHpsaWIuaCBhbmQKKyAgICB6Y29uZi5oIGlzIGFsc28gYSBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhbmQgc28geW91IHNob3VsZCBjaGFuZ2UKKyAgICBaTElCX1ZFUlNJT04gYW5kIFpMSUJfVkVSTlVNIGFuZCBub3RlIHRoZSBvcmlnaW4gYW5kIG5hdHVyZSBvZiB0aGUgY2hhbmdlcworICAgIGluIHpsaWIuaCBhcyB5b3Ugd291bGQgZm9yIGEgZnVsbCBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisyNS4gV2lsbCB6bGliIHdvcmsgb24gYSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4gYXJjaGl0ZWN0dXJlLCBhbmQgY2FuIEkKKyAgICBleGNoYW5nZSBjb21wcmVzc2VkIGRhdGEgYmV0d2VlbiB0aGVtPworCisgICAgWWVzIGFuZCB5ZXMuCisKKzI2LiBXaWxsIHpsaWIgd29yayBvbiBhIDY0LWJpdCBtYWNoaW5lPworCisgICAgWWVzLiAgSXQgaGFzIGJlZW4gdGVzdGVkIG9uIDY0LWJpdCBtYWNoaW5lcywgYW5kIGhhcyBubyBkZXBlbmRlbmNlIG9uIGFueQorICAgIGRhdGEgdHlwZXMgYmVpbmcgbGltaXRlZCB0byAzMi1iaXRzIGluIGxlbmd0aC4gIElmIHlvdSBoYXZlIGFueQorICAgIGRpZmZpY3VsdGllcywgcGxlYXNlIHByb3ZpZGUgYSBjb21wbGV0ZSBwcm9ibGVtIHJlcG9ydCB0byB6bGliQGd6aXAub3JnCisKKzI3LiBXaWxsIHpsaWIgZGVjb21wcmVzcyBkYXRhIGZyb20gdGhlIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnk/CisKKyAgICBOby4gIFRoZSBQS1dhcmUgRENMIHVzZXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYW4KKyAgICBkb2VzIFBLWklQIGFuZCB6bGliLiAgSG93ZXZlciwgeW91IGNhbiBsb29rIGluIHpsaWIncyBjb250cmliL2JsYXN0CisgICAgZGlyZWN0b3J5IGZvciBhIHBvc3NpYmxlIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbS4KKworMjguIENhbiBJIGFjY2VzcyBkYXRhIHJhbmRvbWx5IGluIGEgY29tcHJlc3NlZCBzdHJlYW0/CisKKyAgICBObywgbm90IHdpdGhvdXQgc29tZSBwcmVwYXJhdGlvbi4gIElmIHdoZW4gY29tcHJlc3NpbmcgeW91IHBlcmlvZGljYWxseSB1c2UKKyAgICBaX0ZVTExfRkxVU0gsIGNhcmVmdWxseSB3cml0ZSBhbGwgdGhlIHBlbmRpbmcgZGF0YSBhdCB0aG9zZSBwb2ludHMsIGFuZAorICAgIGtlZXAgYW4gaW5kZXggb2YgdGhvc2UgbG9jYXRpb25zLCB0aGVuIHlvdSBjYW4gc3RhcnQgZGVjb21wcmVzc2lvbiBhdCB0aG9zZQorICAgIHBvaW50cy4gIFlvdSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gbm90IHVzZSBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuLCBzaW5jZSBpdAorICAgIGNhbiBzaWduaWZpY2FudGx5IGRlZ3JhZGUgY29tcHJlc3Npb24uICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNjYW4gYQorICAgIGRlZmxhdGUgc3RyZWFtIG9uY2UgdG8gZ2VuZXJhdGUgYW4gaW5kZXgsIGFuZCB0aGVuIHVzZSB0aGF0IGluZGV4IGZvcgorICAgIHJhbmRvbSBhY2Nlc3MuICBTZWUgZXhhbXBsZXMvenJhbi5jIC4KKworMjkuIERvZXMgemxpYiB3b3JrIG9uIE1WUywgT1MvMzkwLCBDSUNTLCBldGMuPworCisgICAgSXQgaGFzIGluIHRoZSBwYXN0LCBidXQgd2UgaGF2ZSBub3QgaGVhcmQgb2YgYW55IHJlY2VudCBldmlkZW5jZS4gIFRoZXJlCisgICAgd2VyZSB3b3JraW5nIHBvcnRzIG9mIHpsaWIgMS4xLjQgdG8gTVZTLCBidXQgdGhvc2UgbGlua3Mgbm8gbG9uZ2VyIHdvcmsuCisgICAgSWYgeW91IGtub3cgb2YgcmVjZW50LCBzdWNjZXNzZnVsIGFwcGxpY2F0aW9ucyBvZiB6bGliIG9uIHRoZXNlIG9wZXJhdGluZworICAgIHN5c3RlbXMsIHBsZWFzZSBsZXQgdXMga25vdy4gIFRoYW5rcy4KKworMzAuIElzIHRoZXJlIHNvbWUgc2ltcGxlciwgZWFzaWVyIHRvIHJlYWQgdmVyc2lvbiBvZiBpbmZsYXRlIEkgY2FuIGxvb2sgYXQgdG8KKyAgICB1bmRlcnN0YW5kIHRoZSBkZWZsYXRlIGZvcm1hdD8KKworICAgIEZpcnN0IG9mZiwgeW91IHNob3VsZCByZWFkIFJGQyAxOTUxLiAgU2Vjb25kLCB5ZXMuICBMb29rIGluIHpsaWIncworICAgIGNvbnRyaWIvcHVmZiBkaXJlY3RvcnkuCisKKzMxLiBEb2VzIHpsaWIgaW5mcmluZ2Ugb24gYW55IHBhdGVudHM/CisKKyAgICBBcyBmYXIgYXMgd2Uga25vdywgbm8uICBJbiBmYWN0LCB0aGF0IHdhcyBvcmlnaW5hbGx5IHRoZSB3aG9sZSBwb2ludCBiZWhpbmQKKyAgICB6bGliLiAgTG9vayBoZXJlIGZvciBzb21lIG1vcmUgaW5mb3JtYXRpb246CisKKyAgICBodHRwOi8vd3d3Lmd6aXAub3JnLyNmYXExMQorCiszMi4gQ2FuIHpsaWIgd29yayB3aXRoIGdyZWF0ZXIgdGhhbiA0IEdCIG9mIGRhdGE/CisKKyAgICBZZXMuICBpbmZsYXRlKCkgYW5kIGRlZmxhdGUoKSB3aWxsIHByb2Nlc3MgYW55IGFtb3VudCBvZiBkYXRhIGNvcnJlY3RseS4KKyAgICBFYWNoIGNhbGwgb2YgaW5mbGF0ZSgpIG9yIGRlZmxhdGUoKSBpcyBsaW1pdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgY2h1bmtzCisgICAgb2YgdGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgc3RvcmVkIGluIHRoZSBjb21waWxlcidzICJ1bnNpZ25lZCBpbnQiCisgICAgdHlwZSwgYnV0IHRoZXJlIGlzIG5vIGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgY2h1bmtzLiAgTm90ZSBob3dldmVyIHRoYXQgdGhlCisgICAgc3RybS50b3RhbF9pbiBhbmQgc3RybV90b3RhbF9vdXQgY291bnRlcnMgbWF5IGJlIGxpbWl0ZWQgdG8gNCBHQi4gIFRoZXNlCisgICAgY291bnRlcnMgYXJlIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgYW5kIGFyZSBub3QgdXNlZCBpbnRlcm5hbGx5IGJ5CisgICAgaW5mbGF0ZSgpIG9yIGRlZmxhdGUoKS4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gZWFzaWx5IHNldCB1cCBpdHMgb3duIGNvdW50ZXJzCisgICAgdXBkYXRlZCBhZnRlciBlYWNoIGNhbGwgb2YgaW5mbGF0ZSgpIG9yIGRlZmxhdGUoKSB0byBjb3VudCBiZXlvbmQgNCBHQi4KKyAgICBjb21wcmVzcygpIGFuZCB1bmNvbXByZXNzKCkgbWF5IGJlIGxpbWl0ZWQgdG8gNCBHQiwgc2luY2UgdGhleSBvcGVyYXRlIGluIGEKKyAgICBzaW5nbGUgY2FsbC4gIGd6c2VlaygpIGFuZCBnenRlbGwoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCIGRlcGVuZGluZyBvbiBob3cKKyAgICB6bGliIGlzIGNvbXBpbGVkLiAgU2VlIHRoZSB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gaW4gemxpYi5oLgorCisgICAgVGhlIHdvcmQgIm1heSIgYXBwZWFycyBzZXZlcmFsIHRpbWVzIGFib3ZlIHNpbmNlIHRoZXJlIGlzIGEgNCBHQiBsaW1pdCBvbmx5CisgICAgaWYgdGhlIGNvbXBpbGVyJ3MgImxvbmciIHR5cGUgaXMgMzIgYml0cy4gIElmIHRoZSBjb21waWxlcidzICJsb25nIiB0eXBlIGlzCisgICAgNjQgYml0cywgdGhlbiB0aGUgbGltaXQgaXMgMTYgZXhhYnl0ZXMuCisKKzMzLiBEb2VzIHpsaWIgaGF2ZSBhbnkgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzPworCisgICAgVGhlIG9ubHkgb25lIHRoYXQgd2UgYXJlIGF3YXJlIG9mIGlzIHBvdGVudGlhbGx5IGluIGd6cHJpbnRmKCkuICBJZiB6bGliIGlzCisgICAgY29tcGlsZWQgdG8gdXNlIHNwcmludGYoKSBvciB2c3ByaW50ZigpLCB0aGVuIHRoZXJlIGlzIG5vIHByb3RlY3Rpb24KKyAgICBhZ2FpbnN0IGEgYnVmZmVyIG92ZXJmbG93IG9mIGFuIDhLIHN0cmluZyBzcGFjZSAob3Igb3RoZXIgdmFsdWUgYXMgc2V0IGJ5CisgICAgZ3pidWZmZXIoKSksIG90aGVyIHRoYW4gdGhlIGNhbGxlciBvZiBnenByaW50ZigpIGFzc3VyaW5nIHRoYXQgdGhlIG91dHB1dAorICAgIHdpbGwgbm90IGV4Y2VlZCA4Sy4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB6bGliIGlzIGNvbXBpbGVkIHRvIHVzZQorICAgIHNucHJpbnRmKCkgb3IgdnNucHJpbnRmKCksIHdoaWNoIHNob3VsZCBub3JtYWxseSBiZSB0aGUgY2FzZSwgdGhlbiB0aGVyZSBpcworICAgIG5vIHZ1bG5lcmFiaWxpdHkuICBUaGUgLi9jb25maWd1cmUgc2NyaXB0IHdpbGwgZGlzcGxheSB3YXJuaW5ncyBpZiBhbgorICAgIGluc2VjdXJlIHZhcmlhdGlvbiBvZiBzcHJpbnRmKCkgd2lsbCBiZSB1c2VkIGJ5IGd6cHJpbnRmKCkuICBBbHNvIHRoZQorICAgIHpsaWJDb21waWxlRmxhZ3MoKSBmdW5jdGlvbiB3aWxsIHJldHVybiBpbmZvcm1hdGlvbiBvbiB3aGF0IHZhcmlhbnQgb2YKKyAgICBzcHJpbnRmKCkgaXMgdXNlZCBieSBnenByaW50ZigpLgorCisgICAgSWYgeW91IGRvbid0IGhhdmUgc25wcmludGYoKSBvciB2c25wcmludGYoKSBhbmQgd291bGQgbGlrZSBvbmUsIHlvdSBjYW4KKyAgICBmaW5kIGEgcG9ydGFibGUgaW1wbGVtZW50YXRpb24gaGVyZToKKworICAgICAgICBodHRwOi8vd3d3Lmlqcy5zaS9zb2Z0d2FyZS9zbnByaW50Zi8KKworICAgIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHpsaWIuICBWZXJzaW9ucworICAgIDEuMS4zIGFuZCBiZWZvcmUgd2VyZSBzdWJqZWN0IHRvIGEgZG91YmxlLWZyZWUgdnVsbmVyYWJpbGl0eSwgYW5kIHZlcnNpb25zCisgICAgMS4yLjEgYW5kIDEuMi4yIHdlcmUgc3ViamVjdCB0byBhbiBhY2Nlc3MgZXhjZXB0aW9uIHdoZW4gZGVjb21wcmVzc2luZworICAgIGludmFsaWQgY29tcHJlc3NlZCBkYXRhLgorCiszNC4gSXMgdGhlcmUgYSBKYXZhIHZlcnNpb24gb2YgemxpYj8KKworICAgIFByb2JhYmx5IHdoYXQgeW91IHdhbnQgaXMgdG8gdXNlIHpsaWIgaW4gSmF2YS4gemxpYiBpcyBhbHJlYWR5IGluY2x1ZGVkCisgICAgYXMgcGFydCBvZiB0aGUgSmF2YSBTREsgaW4gdGhlIGphdmEudXRpbC56aXAgcGFja2FnZS4gSWYgeW91IHJlYWxseSB3YW50CisgICAgYSB2ZXJzaW9uIG9mIHpsaWIgd3JpdHRlbiBpbiB0aGUgSmF2YSBsYW5ndWFnZSwgbG9vayBvbiB0aGUgemxpYiBob21lCisgICAgcGFnZSBmb3IgbGlua3M6IGh0dHA6Ly96bGliLm5ldC8gLgorCiszNS4gSSBnZXQgdGhpcyBvciB0aGF0IGNvbXBpbGVyIG9yIHNvdXJjZS1jb2RlIHNjYW5uZXIgd2FybmluZyB3aGVuIEkgY3JhbmsgaXQKKyAgICB1cCB0byBtYXhpbWFsbHktcGVkYW50aWMuIENhbid0IHlvdSBndXlzIHdyaXRlIHByb3BlciBjb2RlPworCisgICAgTWFueSB5ZWFycyBhZ28sIHdlIGdhdmUgdXAgYXR0ZW1wdGluZyB0byBhdm9pZCB3YXJuaW5ncyBvbiBldmVyeSBjb21waWxlcgorICAgIGluIHRoZSB1bml2ZXJzZS4gIEl0IGp1c3QgZ290IHRvIGJlIGEgd2FzdGUgb2YgdGltZSwgYW5kIHNvbWUgY29tcGlsZXJzCisgICAgd2VyZSBkb3ducmlnaHQgc2lsbHkgYXMgd2VsbCBhcyBjb250cmFkaWN0ZWQgZWFjaCBvdGhlci4gIFNvIG5vdywgd2Ugc2ltcGx5CisgICAgbWFrZSBzdXJlIHRoYXQgdGhlIGNvZGUgYWx3YXlzIHdvcmtzLgorCiszNi4gVmFsZ3JpbmQgKG9yIHNvbWUgc2ltaWxhciBtZW1vcnkgYWNjZXNzIGNoZWNrZXIpIHNheXMgdGhhdCBkZWZsYXRlIGlzCisgICAgcGVyZm9ybWluZyBhIGNvbmRpdGlvbmFsIGp1bXAgdGhhdCBkZXBlbmRzIG9uIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUuCisgICAgSXNuJ3QgdGhhdCBhIGJ1Zz8KKworICAgIE5vLiAgVGhhdCBpcyBpbnRlbnRpb25hbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYW5kIHRoZSBvdXRwdXQgb2YgZGVmbGF0ZQorICAgIGlzIG5vdCBhZmZlY3RlZC4gIFRoaXMgb25seSBzdGFydGVkIHNob3dpbmcgdXAgcmVjZW50bHkgc2luY2UgemxpYiAxLjIueAorICAgIHVzZXMgbWFsbG9jKCkgYnkgZGVmYXVsdCBmb3IgYWxsb2NhdGlvbnMsIHdoZXJlYXMgZWFybGllciB2ZXJzaW9ucyB1c2VkCisgICAgY2FsbG9jKCksIHdoaWNoIHplcm9zIG91dCB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gIEV2ZW4gdGhvdWdoIHRoZSBjb2RlIHdhcworICAgIGNvcnJlY3QsIHZlcnNpb25zIDEuMi40IGFuZCBsYXRlciB3YXMgY2hhbmdlZCB0byBub3Qgc3RpbXVsYXRlIHRoZXNlCisgICAgY2hlY2tlcnMuCisKKzM3LiBXaWxsIHpsaWIgcmVhZCB0aGUgKGluc2VydCBhbnkgYW5jaWVudCBvciBhcmNhbmUgZm9ybWF0IGhlcmUpIGNvbXByZXNzZWQKKyAgICBkYXRhIGZvcm1hdD8KKworICAgIFByb2JhYmx5IG5vdC4gTG9vayBpbiB0aGUgY29tcC5jb21wcmVzc2lvbiBGQVEgZm9yIHBvaW50ZXJzIHRvIHZhcmlvdXMKKyAgICBmb3JtYXRzIGFuZCBhc3NvY2lhdGVkIHNvZnR3YXJlLgorCiszOC4gSG93IGNhbiBJIGVuY3J5cHQvZGVjcnlwdCB6aXAgZmlsZXMgd2l0aCB6bGliPworCisgICAgemxpYiBkb2Vzbid0IHN1cHBvcnQgZW5jcnlwdGlvbi4gIFRoZSBvcmlnaW5hbCBQS1pJUCBlbmNyeXB0aW9uIGlzIHZlcnkKKyAgICB3ZWFrIGFuZCBjYW4gYmUgYnJva2VuIHdpdGggZnJlZWx5IGF2YWlsYWJsZSBwcm9ncmFtcy4gIFRvIGdldCBzdHJvbmcKKyAgICBlbmNyeXB0aW9uLCB1c2UgR251UEcsIGh0dHA6Ly93d3cuZ251cGcub3JnLyAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgemxpYgorICAgIGNvbXByZXNzaW9uLiAgRm9yIFBLWklQIGNvbXBhdGlibGUgImVuY3J5cHRpb24iLCBsb29rIGF0CisgICAgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvCisKKzM5LiBXaGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgImd6aXAiIGFuZCAiZGVmbGF0ZSIgSFRUUCAxLjEgZW5jb2RpbmdzPworCisgICAgImd6aXAiIGlzIHRoZSBnemlwIGZvcm1hdCwgYW5kICJkZWZsYXRlIiBpcyB0aGUgemxpYiBmb3JtYXQuICBUaGV5IHNob3VsZAorICAgIHByb2JhYmx5IGhhdmUgY2FsbGVkIHRoZSBzZWNvbmQgb25lICJ6bGliIiBpbnN0ZWFkIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoCisgICAgdGhlIHJhdyBkZWZsYXRlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQuICBXaGlsZSB0aGUgSFRUUCAxLjEgUkZDIDI2MTYKKyAgICBjb3JyZWN0bHkgcG9pbnRzIHRvIHRoZSB6bGliIHNwZWNpZmljYXRpb24gaW4gUkZDIDE5NTAgZm9yIHRoZSAiZGVmbGF0ZSIKKyAgICB0cmFuc2ZlciBlbmNvZGluZywgdGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMgb2Ygc2VydmVycyBhbmQgYnJvd3NlcnMgdGhhdAorICAgIGluY29ycmVjdGx5IHByb2R1Y2Ugb3IgZXhwZWN0IHJhdyBkZWZsYXRlIGRhdGEgcGVyIHRoZSBkZWZsYXRlCisgICAgc3BlY2ZpY2lhdGlvbiBpbiBSRkMgMTk1MSwgbW9zdCBub3RhYmx5IE1pY3Jvc29mdC4gIFNvIGV2ZW4gdGhvdWdoIHRoZQorICAgICJkZWZsYXRlIiB0cmFuc2ZlciBlbmNvZGluZyB1c2luZyB0aGUgemxpYiBmb3JtYXQgd291bGQgYmUgdGhlIG1vcmUKKyAgICBlZmZpY2llbnQgYXBwcm9hY2ggKGFuZCBpbiBmYWN0IGV4YWN0bHkgd2hhdCB0aGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkCisgICAgZm9yKSwgdXNpbmcgdGhlICJnemlwIiB0cmFuc2ZlciBlbmNvZGluZyBpcyBwcm9iYWJseSBtb3JlIHJlbGlhYmxlIGR1ZSB0bworICAgIGFuIHVuZm9ydHVuYXRlIGNob2ljZSBvZiBuYW1lIG9uIHRoZSBwYXJ0IG9mIHRoZSBIVFRQIDEuMSBhdXRob3JzLgorCisgICAgQm90dG9tIGxpbmU6IHVzZSB0aGUgZ3ppcCBmb3JtYXQgZm9yIEhUVFAgMS4xIGVuY29kaW5nLgorCis0MC4gRG9lcyB6bGliIHN1cHBvcnQgdGhlIG5ldyAiRGVmbGF0ZTY0IiBmb3JtYXQgaW50cm9kdWNlZCBieSBQS1dhcmU/CisKKyAgICBOby4gIFBLV2FyZSBoYXMgYXBwYXJlbnRseSBkZWNpZGVkIHRvIGtlZXAgdGhhdCBmb3JtYXQgcHJvcHJpZXRhcnksIHNpbmNlCisgICAgdGhleSBoYXZlIG5vdCBkb2N1bWVudGVkIGl0IGFzIHRoZXkgaGF2ZSBwcmV2aW91cyBjb21wcmVzc2lvbiBmb3JtYXRzLiAgSW4KKyAgICBhbnkgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGltcHJvdmVtZW50cyBhcmUgc28gbW9kZXN0IGNvbXBhcmVkIHRvIG90aGVyIG1vcmUKKyAgICBtb2Rlcm4gYXBwcm9hY2hlcywgdGhhdCBpdCdzIG5vdCB3b3J0aCB0aGUgZWZmb3J0IHRvIGltcGxlbWVudC4KKworNDEuIEknbSBoYXZpbmcgYSBwcm9ibGVtIHdpdGggdGhlIHppcCBmdW5jdGlvbnMgaW4gemxpYiwgY2FuIHlvdSBoZWxwPworCisgICAgVGhlcmUgYXJlIG5vIHppcCBmdW5jdGlvbnMgaW4gemxpYi4gIFlvdSBhcmUgcHJvYmFibHkgdXNpbmcgbWluaXppcCBieQorICAgIEdpbGVzIFZvbGxhbnQsIHdoaWNoIGlzIGZvdW5kIGluIHRoZSBjb250cmliIGRpcmVjdG9yeSBvZiB6bGliLiAgSXQgaXMgbm90CisgICAgcGFydCBvZiB6bGliLiAgSW4gZmFjdCBub25lIG9mIHRoZSBzdHVmZiBpbiBjb250cmliIGlzIHBhcnQgb2YgemxpYi4gIFRoZQorICAgIGZpbGVzIGluIHRoZXJlIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB6bGliIGF1dGhvcnMuICBZb3UgbmVlZCB0byBjb250YWN0CisgICAgdGhlIGF1dGhvcnMgb2YgdGhlIHJlc3BlY3RpdmUgY29udHJpYnV0aW9uIGZvciBoZWxwLgorCis0Mi4gVGhlIG1hdGNoLmFzbSBjb2RlIGluIGNvbnRyaWIgaXMgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICAgIFNpbmNlIGl0J3MgcGFydCBvZiB6bGliLCBkb2Vzbid0IHRoYXQgbWVhbiB0aGF0IGFsbCBvZiB6bGliIGZhbGxzIHVuZGVyIHRoZQorICAgIEdOVSBHUEw/CisKKyAgICBOby4gIFRoZSBmaWxlcyBpbiBjb250cmliIGFyZSBub3QgcGFydCBvZiB6bGliLiAgVGhleSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5CisgICAgb3RoZXIgYXV0aG9ycyBhbmQgYXJlIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgdG8gdGhlIHVzZXIgd2l0aGluIHRoZSB6bGliCisgICAgZGlzdHJpYnV0aW9uLiAgRWFjaCBpdGVtIGluIGNvbnRyaWIgaGFzIGl0cyBvd24gbGljZW5zZS4KKworNDMuIElzIHpsaWIgc3ViamVjdCB0byBleHBvcnQgY29udHJvbHM/ICBXaGF0IGlzIGl0cyBFQ0NOPworCisgICAgemxpYiBpcyBub3Qgc3ViamVjdCB0byBleHBvcnQgY29udHJvbHMsIGFuZCBzbyBpcyBjbGFzc2lmaWVkIGFzIEVBUjk5LgorCis0NC4gQ2FuIHlvdSBwbGVhc2Ugc2lnbiB0aGVzZSBsZW5ndGh5IGxlZ2FsIGRvY3VtZW50cyBhbmQgZmF4IHRoZW0gYmFjayB0byB1cworICAgIHNvIHRoYXQgd2UgY2FuIHVzZSB5b3VyIHNvZnR3YXJlIGluIG91ciBwcm9kdWN0PworCisgICAgTm8uIEdvIGF3YXkuIFNob28uCmRpZmYgLS1naXQgYS9jb20zMi9saWIvemxpYi9SRUFETUUgYi9jb20zMi9saWIvemxpYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyMTliZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL1JFQURNRQpAQCAtMCwwICsxLDExNSBAQAorWkxJQiBEQVRBIENPTVBSRVNTSU9OIExJQlJBUlkKKworemxpYiAxLjIuNSBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuICBBbGwgdGhlIGNvZGUgaXMKK3RocmVhZCBzYWZlLiAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDcworKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzCitodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dCAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpCithbmQgcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KS4KKworQWxsIGZ1bmN0aW9ucyBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSB6bGliLmgKKyh2b2x1bnRlZXIgdG8gd3JpdGUgbWFuIHBhZ2VzIHdlbGNvbWUsIGNvbnRhY3QgemxpYkBnemlwLm9yZykuICBBIHVzYWdlIGV4YW1wbGUKK29mIHRoZSBsaWJyYXJ5IGlzIGdpdmVuIGluIHRoZSBmaWxlIGV4YW1wbGUuYyB3aGljaCBhbHNvIHRlc3RzIHRoYXQgdGhlIGxpYnJhcnkKK2lzIHdvcmtpbmcgY29ycmVjdGx5LiAgQW5vdGhlciBleGFtcGxlIGlzIGdpdmVuIGluIHRoZSBmaWxlIG1pbmlnemlwLmMuICBUaGUKK2NvbXByZXNzaW9uIGxpYnJhcnkgaXRzZWxmIGlzIGNvbXBvc2VkIG9mIGFsbCBzb3VyY2UgZmlsZXMgZXhjZXB0IGV4YW1wbGUuYyBhbmQKK21pbmlnemlwLmMuCisKK1RvIGNvbXBpbGUgYWxsIGZpbGVzIGFuZCBydW4gdGhlIHRlc3QgcHJvZ3JhbSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgZ2l2ZW4gYXQKK3RoZSB0b3Agb2YgTWFrZWZpbGUuaW4uICBJbiBzaG9ydCAiLi9jb25maWd1cmU7IG1ha2UgdGVzdCIsIGFuZCBpZiB0aGF0IGdvZXMKK3dlbGwsICJtYWtlIGluc3RhbGwiIHNob3VsZCB3b3JrIGZvciBtb3N0IGZsYXZvcnMgb2YgVW5peC4gIEZvciBXaW5kb3dzLCB1c2Ugb25lCitvZiB0aGUgc3BlY2lhbCBtYWtlZmlsZXMgaW4gd2luMzIvIG9yIGNvbnRyaWIvdnN0dWRpby8gLiAgRm9yIFZNUywgdXNlCittYWtlX3Ztcy5jb20uCisKK1F1ZXN0aW9ucyBhYm91dCB6bGliIHNob3VsZCBiZSBzZW50IHRvIDx6bGliQGd6aXAub3JnPiwgb3IgdG8gR2lsbGVzIFZvbGxhbnQKKzxpbmZvQHdpbmltYWdlLmNvbT4gZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uLiAgVGhlIHpsaWIgaG9tZSBwYWdlIGlzCitodHRwOi8vemxpYi5uZXQvIC4gIEJlZm9yZSByZXBvcnRpbmcgYSBwcm9ibGVtLCBwbGVhc2UgY2hlY2sgdGhpcyBzaXRlIHRvCit2ZXJpZnkgdGhhdCB5b3UgaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgemxpYjsgb3RoZXJ3aXNlIGdldCB0aGUgbGF0ZXN0Cit2ZXJzaW9uIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBwcm9ibGVtIHN0aWxsIGV4aXN0cyBvciBub3QuCisKK1BMRUFTRSByZWFkIHRoZSB6bGliIEZBUSBodHRwOi8vemxpYi5uZXQvemxpYl9mYXEuaHRtbCBiZWZvcmUgYXNraW5nIGZvciBoZWxwLgorCitNYXJrIE5lbHNvbiA8bWFya25AaWVlZS5vcmc+IHdyb3RlIGFuIGFydGljbGUgYWJvdXQgemxpYiBmb3IgdGhlIEphbi4gIDE5OTcKK2lzc3VlIG9mIERyLiAgRG9iYidzIEpvdXJuYWw7IGEgY29weSBvZiB0aGUgYXJ0aWNsZSBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly9tYXJrbmVsc29uLnVzLzE5OTcvMDEvMDEvemxpYi1lbmdpbmUvIC4KKworVGhlIGNoYW5nZXMgbWFkZSBpbiB2ZXJzaW9uIDEuMi41IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIENoYW5nZUxvZy4KKworVW5zdXBwb3J0ZWQgdGhpcmQgcGFydHkgY29udHJpYnV0aW9ucyBhcmUgcHJvdmlkZWQgaW4gZGlyZWN0b3J5IGNvbnRyaWIvIC4KKworemxpYiBpcyBhdmFpbGFibGUgaW4gSmF2YSB1c2luZyB0aGUgamF2YS51dGlsLnppcCBwYWNrYWdlLCBkb2N1bWVudGVkIGF0CitodHRwOi8vamF2YS5zdW4uY29tL2RldmVsb3Blci90ZWNobmljYWxBcnRpY2xlcy9Qcm9ncmFtbWluZy9jb21wcmVzc2lvbi8gLgorCitBIFBlcmwgaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIDxwbXFzQGNwYW4ub3JnPiBpcyBhdmFpbGFibGUKK2F0IENQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspIHNpdGVzLCBpbmNsdWRpbmcKK2h0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfnBtcXMvSU8tQ29tcHJlc3MtWmxpYi8gLgorCitBIFB5dGhvbiBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcgPGFta0BhbWsuY2E+IGlzCithdmFpbGFibGUgaW4gUHl0aG9uIDEuNSBhbmQgbGF0ZXIgdmVyc2lvbnMsIHNlZQoraHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9saWIvbW9kdWxlLXpsaWIuaHRtbCAuCisKK3psaWIgaXMgYnVpbHQgaW50byB0Y2w6IGh0dHA6Ly93aWtpLnRjbC50ay80NjEwIC4KKworQW4gZXhwZXJpbWVudGFsIHBhY2thZ2UgdG8gcmVhZCBhbmQgd3JpdGUgZmlsZXMgaW4gLnppcCBmb3JtYXQsIHdyaXR0ZW4gb24gdG9wCitvZiB6bGliIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4sIGlzIGF2YWlsYWJsZSBpbiB0aGUKK2NvbnRyaWIvbWluaXppcCBkaXJlY3Rvcnkgb2YgemxpYi4KKworCitOb3RlcyBmb3Igc29tZSB0YXJnZXRzOgorCistIEZvciBXaW5kb3dzIERMTCB2ZXJzaW9ucywgcGxlYXNlIHNlZSB3aW4zMi9ETExfRkFRLnR4dAorCistIEZvciA2NC1iaXQgSXJpeCwgZGVmbGF0ZS5jIG11c3QgYmUgY29tcGlsZWQgd2l0aG91dCBhbnkgb3B0aW1pemF0aW9uLiBXaXRoCisgIC1PLCBvbmUgbGlicG5nIHRlc3QgZmFpbHMuIFRoZSB0ZXN0IHdvcmtzIGluIDMyIGJpdCBtb2RlICh3aXRoIHRoZSAtbjMyCisgIGNvbXBpbGVyIGZsYWcpLiBUaGUgY29tcGlsZXIgYnVnIGhhcyBiZWVuIHJlcG9ydGVkIHRvIFNHSS4KKworLSB6bGliIGRvZXNuJ3Qgd29yayB3aXRoIGdjYyAyLjYuMyBvbiBhIERFQyAzMDAwLzMwMExYIHVuZGVyIE9TRi8xIDIuMSBpdCB3b3JrcworICB3aGVuIGNvbXBpbGVkIHdpdGggY2MuCisKKy0gT24gRGlnaXRhbCBVbml4IDQuMEQgKGZvcm1lbHkgT1NGLzEpIG9uIEFscGhhU2VydmVyLCB0aGUgY2Mgb3B0aW9uIC1zdGQxIGlzCisgIG5lY2Vzc2FyeSB0byBnZXQgZ3pwcmludGYgd29ya2luZyBjb3JyZWN0bHkuIFRoaXMgaXMgZG9uZSBieSBjb25maWd1cmUuCisKKy0gemxpYiBkb2Vzbid0IHdvcmsgb24gSFAtVVggOS4wNSB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgL2Jpbi9jYy4gSXQgd29ya3Mgd2l0aAorICBvdGhlciBjb21waWxlcnMuIFVzZSAibWFrZSB0ZXN0IiB0byBjaGVjayB5b3VyIGNvbXBpbGVyLgorCistIGd6ZG9wZW4gaXMgbm90IHN1cHBvcnRlZCBvbiBSSVNDT1Mgb3IgQkVPUy4KKworLSBGb3IgUGFsbU9zLCBzZWUgaHR0cDovL3BhbG16bGliLnNvdXJjZWZvcmdlLm5ldC8KKworCitBY2tub3dsZWRnbWVudHM6CisKKyAgVGhlIGRlZmxhdGUgZm9ybWF0IHVzZWQgYnkgemxpYiB3YXMgZGVmaW5lZCBieSBQaGlsIEthdHouICBUaGUgZGVmbGF0ZSBhbmQKKyAgemxpYiBzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gIFBldGVyIERldXRzY2guICBUaGFua3MgdG8gYWxsIHRoZQorICBwZW9wbGUgd2hvIHJlcG9ydGVkIHByb2JsZW1zIGFuZCBzdWdnZXN0ZWQgdmFyaW91cyBpbXByb3ZlbWVudHMgaW4gemxpYjsgdGhleQorICBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KKworQ29weXJpZ2h0IG5vdGljZToKKworIChDKSAxOTk1LTIwMTAgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKworSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgd2Ugd291bGQgYXBwcmVjaWF0ZSAqbm90KiByZWNlaXZpbmcKK2xlbmd0aHkgbGVnYWwgZG9jdW1lbnRzIHRvIHNpZ24uICBUaGUgc291cmNlcyBhcmUgcHJvdmlkZWQgZm9yIGZyZWUgYnV0IHdpdGhvdXQKK3dhcnJhbnR5IG9mIGFueSBraW5kLiAgVGhlIGxpYnJhcnkgaGFzIGJlZW4gZW50aXJlbHkgd3JpdHRlbiBieSBKZWFuLWxvdXAKK0dhaWxseSBhbmQgTWFyayBBZGxlcjsgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGlyZC1wYXJ0eSBjb2RlLgorCitJZiB5b3UgcmVkaXN0cmlidXRlIG1vZGlmaWVkIHNvdXJjZXMsIHdlIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3UgaW5jbHVkZSBpbgordGhlIGZpbGUgQ2hhbmdlTG9nIGhpc3RvcnkgaW5mb3JtYXRpb24gZG9jdW1lbnRpbmcgeW91ciBjaGFuZ2VzLiAgUGxlYXNlIHJlYWQKK3RoZSBGQVEgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGRpc3RyaWJ1dGlvbiBvZiBtb2RpZmllZCBzb3VyY2UgdmVyc2lvbnMuCmRpZmYgLS1naXQgYS9jb20zMi9saWIvemxpYi9hZGxlcjMyLmMgYi9jb20zMi9saWIvemxpYi9hZGxlcjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhZDZhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL2FkbGVyMzIuYwpAQCAtMCwwICsxLDE2OSBAQAorLyogYWRsZXIzMi5jIC0tIGNvbXB1dGUgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIGEgZGF0YSBzdHJlYW0KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA3IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljCisKK2xvY2FsIHVMb25nIGFkbGVyMzJfY29tYmluZV8odUxvbmcgYWRsZXIxLCB1TG9uZyBhZGxlcjIsIHpfb2ZmNjRfdCBsZW4yKTsKKworI2RlZmluZSBCQVNFIDY1NTIxVUwgICAgLyogbGFyZ2VzdCBwcmltZSBzbWFsbGVyIHRoYW4gNjU1MzYgKi8KKyNkZWZpbmUgTk1BWCA1NTUyCisvKiBOTUFYIGlzIHRoZSBsYXJnZXN0IG4gc3VjaCB0aGF0IDI1NW4obisxKS8yICsgKG4rMSkoQkFTRS0xKSA8PSAyXjMyLTEgKi8KKworI2RlZmluZSBETzEoYnVmLGkpICB7YWRsZXIgKz0gKGJ1ZilbaV07IHN1bTIgKz0gYWRsZXI7fQorI2RlZmluZSBETzIoYnVmLGkpICBETzEoYnVmLGkpOyBETzEoYnVmLGkrMSk7CisjZGVmaW5lIERPNChidWYsaSkgIERPMihidWYsaSk7IERPMihidWYsaSsyKTsKKyNkZWZpbmUgRE84KGJ1ZixpKSAgRE80KGJ1ZixpKTsgRE80KGJ1ZixpKzQpOworI2RlZmluZSBETzE2KGJ1ZikgICBETzgoYnVmLDApOyBETzgoYnVmLDgpOworCisvKiB1c2UgTk9fRElWSURFIGlmIHlvdXIgcHJvY2Vzc29yIGRvZXMgbm90IGRvIGRpdmlzaW9uIGluIGhhcmR3YXJlICovCisjaWZkZWYgTk9fRElWSURFCisjICBkZWZpbmUgTU9EKGEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTYpKSBhIC09IChCQVNFIDw8IDE2KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxNSkpIGEgLT0gKEJBU0UgPDwgMTUpOyBcCisgICAgICAgIGlmIChhID49IChCQVNFIDw8IDE0KSkgYSAtPSAoQkFTRSA8PCAxNCk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTMpKSBhIC09IChCQVNFIDw8IDEzKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxMikpIGEgLT0gKEJBU0UgPDwgMTIpOyBcCisgICAgICAgIGlmIChhID49IChCQVNFIDw8IDExKSkgYSAtPSAoQkFTRSA8PCAxMSk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTApKSBhIC09IChCQVNFIDw8IDEwKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA5KSkgYSAtPSAoQkFTRSA8PCA5KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA4KSkgYSAtPSAoQkFTRSA8PCA4KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA3KSkgYSAtPSAoQkFTRSA8PCA3KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA2KSkgYSAtPSAoQkFTRSA8PCA2KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA1KSkgYSAtPSAoQkFTRSA8PCA1KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA0KSkgYSAtPSAoQkFTRSA8PCA0KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAzKSkgYSAtPSAoQkFTRSA8PCAzKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAyKSkgYSAtPSAoQkFTRSA8PCAyKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxKSkgYSAtPSAoQkFTRSA8PCAxKTsgXAorICAgICAgICBpZiAoYSA+PSBCQVNFKSBhIC09IEJBU0U7IFwKKyAgICB9IHdoaWxlICgwKQorIyAgZGVmaW5lIE1PRDQoYSkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA0KSkgYSAtPSAoQkFTRSA8PCA0KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAzKSkgYSAtPSAoQkFTRSA8PCAzKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAyKSkgYSAtPSAoQkFTRSA8PCAyKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxKSkgYSAtPSAoQkFTRSA8PCAxKTsgXAorICAgICAgICBpZiAoYSA+PSBCQVNFKSBhIC09IEJBU0U7IFwKKyAgICB9IHdoaWxlICgwKQorI2Vsc2UKKyMgIGRlZmluZSBNT0QoYSkgYSAlPSBCQVNFCisjICBkZWZpbmUgTU9ENChhKSBhICU9IEJBU0UKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1TG9uZyBaRVhQT1JUIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuKQorICAgIHVMb25nIGFkbGVyOworICAgIGNvbnN0IEJ5dGVmICpidWY7CisgICAgdUludCBsZW47Cit7CisgICAgdW5zaWduZWQgbG9uZyBzdW0yOworICAgIHVuc2lnbmVkIG47CisKKyAgICAvKiBzcGxpdCBBZGxlci0zMiBpbnRvIGNvbXBvbmVudCBzdW1zICovCisgICAgc3VtMiA9IChhZGxlciA+PiAxNikgJiAweGZmZmY7CisgICAgYWRsZXIgJj0gMHhmZmZmOworCisgICAgLyogaW4gY2FzZSB1c2VyIGxpa2VzIGRvaW5nIGEgYnl0ZSBhdCBhIHRpbWUsIGtlZXAgaXQgZmFzdCAqLworICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICBhZGxlciArPSBidWZbMF07CisgICAgICAgIGlmIChhZGxlciA+PSBCQVNFKQorICAgICAgICAgICAgYWRsZXIgLT0gQkFTRTsKKyAgICAgICAgc3VtMiArPSBhZGxlcjsKKyAgICAgICAgaWYgKHN1bTIgPj0gQkFTRSkKKyAgICAgICAgICAgIHN1bTIgLT0gQkFTRTsKKyAgICAgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOworICAgIH0KKworICAgIC8qIGluaXRpYWwgQWRsZXItMzIgdmFsdWUgKGRlZmVycmVkIGNoZWNrIGZvciBsZW4gPT0gMSBzcGVlZCkgKi8KKyAgICBpZiAoYnVmID09IFpfTlVMTCkKKyAgICAgICAgcmV0dXJuIDFMOworCisgICAgLyogaW4gY2FzZSBzaG9ydCBsZW5ndGhzIGFyZSBwcm92aWRlZCwga2VlcCBpdCBzb21ld2hhdCBmYXN0ICovCisgICAgaWYgKGxlbiA8IDE2KSB7CisgICAgICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAgICAgYWRsZXIgKz0gKmJ1ZisrOworICAgICAgICAgICAgc3VtMiArPSBhZGxlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRsZXIgPj0gQkFTRSkKKyAgICAgICAgICAgIGFkbGVyIC09IEJBU0U7CisgICAgICAgIE1PRDQoc3VtMik7ICAgICAgICAgICAgIC8qIG9ubHkgYWRkZWQgc28gbWFueSBCQVNFJ3MgKi8KKyAgICAgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOworICAgIH0KKworICAgIC8qIGRvIGxlbmd0aCBOTUFYIGJsb2NrcyAtLSByZXF1aXJlcyBqdXN0IG9uZSBtb2R1bG8gb3BlcmF0aW9uICovCisgICAgd2hpbGUgKGxlbiA+PSBOTUFYKSB7CisgICAgICAgIGxlbiAtPSBOTUFYOworICAgICAgICBuID0gTk1BWCAvIDE2OyAgICAgICAgICAvKiBOTUFYIGlzIGRpdmlzaWJsZSBieSAxNiAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBETzE2KGJ1Zik7ICAgICAgICAgIC8qIDE2IHN1bXMgdW5yb2xsZWQgKi8KKyAgICAgICAgICAgIGJ1ZiArPSAxNjsKKyAgICAgICAgfSB3aGlsZSAoLS1uKTsKKyAgICAgICAgTU9EKGFkbGVyKTsKKyAgICAgICAgTU9EKHN1bTIpOworICAgIH0KKworICAgIC8qIGRvIHJlbWFpbmluZyBieXRlcyAobGVzcyB0aGFuIE5NQVgsIHN0aWxsIGp1c3Qgb25lIG1vZHVsbykgKi8KKyAgICBpZiAobGVuKSB7ICAgICAgICAgICAgICAgICAgLyogYXZvaWQgbW9kdWxvcyBpZiBub25lIHJlbWFpbmluZyAqLworICAgICAgICB3aGlsZSAobGVuID49IDE2KSB7CisgICAgICAgICAgICBsZW4gLT0gMTY7CisgICAgICAgICAgICBETzE2KGJ1Zik7CisgICAgICAgICAgICBidWYgKz0gMTY7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgICAgICBhZGxlciArPSAqYnVmKys7CisgICAgICAgICAgICBzdW0yICs9IGFkbGVyOworICAgICAgICB9CisgICAgICAgIE1PRChhZGxlcik7CisgICAgICAgIE1PRChzdW0yKTsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gcmVjb21iaW5lZCBzdW1zICovCisgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1TG9uZyBhZGxlcjMyX2NvbWJpbmVfKGFkbGVyMSwgYWRsZXIyLCBsZW4yKQorICAgIHVMb25nIGFkbGVyMTsKKyAgICB1TG9uZyBhZGxlcjI7CisgICAgel9vZmY2NF90IGxlbjI7Cit7CisgICAgdW5zaWduZWQgbG9uZyBzdW0xOworICAgIHVuc2lnbmVkIGxvbmcgc3VtMjsKKyAgICB1bnNpZ25lZCByZW07CisKKyAgICAvKiB0aGUgZGVyaXZhdGlvbiBvZiB0aGlzIGZvcm11bGEgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlciAqLworICAgIHJlbSA9ICh1bnNpZ25lZCkobGVuMiAlIEJBU0UpOworICAgIHN1bTEgPSBhZGxlcjEgJiAweGZmZmY7CisgICAgc3VtMiA9IHJlbSAqIHN1bTE7CisgICAgTU9EKHN1bTIpOworICAgIHN1bTEgKz0gKGFkbGVyMiAmIDB4ZmZmZikgKyBCQVNFIC0gMTsKKyAgICBzdW0yICs9ICgoYWRsZXIxID4+IDE2KSAmIDB4ZmZmZikgKyAoKGFkbGVyMiA+PiAxNikgJiAweGZmZmYpICsgQkFTRSAtIHJlbTsKKyAgICBpZiAoc3VtMSA+PSBCQVNFKSBzdW0xIC09IEJBU0U7CisgICAgaWYgKHN1bTEgPj0gQkFTRSkgc3VtMSAtPSBCQVNFOworICAgIGlmIChzdW0yID49IChCQVNFIDw8IDEpKSBzdW0yIC09IChCQVNFIDw8IDEpOworICAgIGlmIChzdW0yID49IEJBU0UpIHN1bTIgLT0gQkFTRTsKKyAgICByZXR1cm4gc3VtMSB8IChzdW0yIDw8IDE2KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUoYWRsZXIxLCBhZGxlcjIsIGxlbjIpCisgICAgdUxvbmcgYWRsZXIxOworICAgIHVMb25nIGFkbGVyMjsKKyAgICB6X29mZl90IGxlbjI7Cit7CisgICAgcmV0dXJuIGFkbGVyMzJfY29tYmluZV8oYWRsZXIxLCBhZGxlcjIsIGxlbjIpOworfQorCit1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZTY0KGFkbGVyMSwgYWRsZXIyLCBsZW4yKQorICAgIHVMb25nIGFkbGVyMTsKKyAgICB1TG9uZyBhZGxlcjI7CisgICAgel9vZmY2NF90IGxlbjI7Cit7CisgICAgcmV0dXJuIGFkbGVyMzJfY29tYmluZV8oYWRsZXIxLCBhZGxlcjIsIGxlbjIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvYWxnb3JpdGhtLnR4dCBiL2NvbTMyL2xpYi96bGliL2FsZ29yaXRobS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyMmRkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL2FsZ29yaXRobS50eHQKQEAgLTAsMCArMSwyMDkgQEAKKzEuIENvbXByZXNzaW9uIGFsZ29yaXRobSAoZGVmbGF0ZSkKKworVGhlIGRlZmxhdGlvbiBhbGdvcml0aG0gdXNlZCBieSBnemlwIChhbHNvIHppcCBhbmQgemxpYikgaXMgYSB2YXJpYXRpb24gb2YKK0xaNzcgKExlbXBlbC1aaXYgMTk3Nywgc2VlIHJlZmVyZW5jZSBiZWxvdykuIEl0IGZpbmRzIGR1cGxpY2F0ZWQgc3RyaW5ncyBpbgordGhlIGlucHV0IGRhdGEuICBUaGUgc2Vjb25kIG9jY3VycmVuY2Ugb2YgYSBzdHJpbmcgaXMgcmVwbGFjZWQgYnkgYQorcG9pbnRlciB0byB0aGUgcHJldmlvdXMgc3RyaW5nLCBpbiB0aGUgZm9ybSBvZiBhIHBhaXIgKGRpc3RhbmNlLAorbGVuZ3RoKS4gIERpc3RhbmNlcyBhcmUgbGltaXRlZCB0byAzMksgYnl0ZXMsIGFuZCBsZW5ndGhzIGFyZSBsaW1pdGVkCit0byAyNTggYnl0ZXMuIFdoZW4gYSBzdHJpbmcgZG9lcyBub3Qgb2NjdXIgYW55d2hlcmUgaW4gdGhlIHByZXZpb3VzCiszMksgYnl0ZXMsIGl0IGlzIGVtaXR0ZWQgYXMgYSBzZXF1ZW5jZSBvZiBsaXRlcmFsIGJ5dGVzLiAgKEluIHRoaXMKK2Rlc2NyaXB0aW9uLCBgc3RyaW5nJyBtdXN0IGJlIHRha2VuIGFzIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBieXRlcywKK2FuZCBpcyBub3QgcmVzdHJpY3RlZCB0byBwcmludGFibGUgY2hhcmFjdGVycy4pCisKK0xpdGVyYWxzIG9yIG1hdGNoIGxlbmd0aHMgYXJlIGNvbXByZXNzZWQgd2l0aCBvbmUgSHVmZm1hbiB0cmVlLCBhbmQKK21hdGNoIGRpc3RhbmNlcyBhcmUgY29tcHJlc3NlZCB3aXRoIGFub3RoZXIgdHJlZS4gVGhlIHRyZWVzIGFyZSBzdG9yZWQKK2luIGEgY29tcGFjdCBmb3JtIGF0IHRoZSBzdGFydCBvZiBlYWNoIGJsb2NrLiBUaGUgYmxvY2tzIGNhbiBoYXZlIGFueQorc2l6ZSAoZXhjZXB0IHRoYXQgdGhlIGNvbXByZXNzZWQgZGF0YSBmb3Igb25lIGJsb2NrIG11c3QgZml0IGluCithdmFpbGFibGUgbWVtb3J5KS4gQSBibG9jayBpcyB0ZXJtaW5hdGVkIHdoZW4gZGVmbGF0ZSgpIGRldGVybWluZXMgdGhhdAoraXQgd291bGQgYmUgdXNlZnVsIHRvIHN0YXJ0IGFub3RoZXIgYmxvY2sgd2l0aCBmcmVzaCB0cmVlcy4gKFRoaXMgaXMKK3NvbWV3aGF0IHNpbWlsYXIgdG8gdGhlIGJlaGF2aW9yIG9mIExaVy1iYXNlZCBfY29tcHJlc3NfLikKKworRHVwbGljYXRlZCBzdHJpbmdzIGFyZSBmb3VuZCB1c2luZyBhIGhhc2ggdGFibGUuIEFsbCBpbnB1dCBzdHJpbmdzIG9mCitsZW5ndGggMyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIGhhc2ggdGFibGUuIEEgaGFzaCBpbmRleCBpcyBjb21wdXRlZCBmb3IKK3RoZSBuZXh0IDMgYnl0ZXMuIElmIHRoZSBoYXNoIGNoYWluIGZvciB0aGlzIGluZGV4IGlzIG5vdCBlbXB0eSwgYWxsCitzdHJpbmdzIGluIHRoZSBjaGFpbiBhcmUgY29tcGFyZWQgd2l0aCB0aGUgY3VycmVudCBpbnB1dCBzdHJpbmcsIGFuZAordGhlIGxvbmdlc3QgbWF0Y2ggaXMgc2VsZWN0ZWQuCisKK1RoZSBoYXNoIGNoYWlucyBhcmUgc2VhcmNoZWQgc3RhcnRpbmcgd2l0aCB0aGUgbW9zdCByZWNlbnQgc3RyaW5ncywgdG8KK2Zhdm9yIHNtYWxsIGRpc3RhbmNlcyBhbmQgdGh1cyB0YWtlIGFkdmFudGFnZSBvZiB0aGUgSHVmZm1hbiBlbmNvZGluZy4KK1RoZSBoYXNoIGNoYWlucyBhcmUgc2luZ2x5IGxpbmtlZC4gVGhlcmUgYXJlIG5vIGRlbGV0aW9ucyBmcm9tIHRoZQoraGFzaCBjaGFpbnMsIHRoZSBhbGdvcml0aG0gc2ltcGx5IGRpc2NhcmRzIG1hdGNoZXMgdGhhdCBhcmUgdG9vIG9sZC4KKworVG8gYXZvaWQgYSB3b3JzdC1jYXNlIHNpdHVhdGlvbiwgdmVyeSBsb25nIGhhc2ggY2hhaW5zIGFyZSBhcmJpdHJhcmlseQordHJ1bmNhdGVkIGF0IGEgY2VydGFpbiBsZW5ndGgsIGRldGVybWluZWQgYnkgYSBydW50aW1lIG9wdGlvbiAobGV2ZWwKK3BhcmFtZXRlciBvZiBkZWZsYXRlSW5pdCkuIFNvIGRlZmxhdGUoKSBkb2VzIG5vdCBhbHdheXMgZmluZCB0aGUgbG9uZ2VzdAorcG9zc2libGUgbWF0Y2ggYnV0IGdlbmVyYWxseSBmaW5kcyBhIG1hdGNoIHdoaWNoIGlzIGxvbmcgZW5vdWdoLgorCitkZWZsYXRlKCkgYWxzbyBkZWZlcnMgdGhlIHNlbGVjdGlvbiBvZiBtYXRjaGVzIHdpdGggYSBsYXp5IGV2YWx1YXRpb24KK21lY2hhbmlzbS4gQWZ0ZXIgYSBtYXRjaCBvZiBsZW5ndGggTiBoYXMgYmVlbiBmb3VuZCwgZGVmbGF0ZSgpIHNlYXJjaGVzIGZvcgorYSBsb25nZXIgbWF0Y2ggYXQgdGhlIG5leHQgaW5wdXQgYnl0ZS4gSWYgYSBsb25nZXIgbWF0Y2ggaXMgZm91bmQsIHRoZQorcHJldmlvdXMgbWF0Y2ggaXMgdHJ1bmNhdGVkIHRvIGEgbGVuZ3RoIG9mIG9uZSAodGh1cyBwcm9kdWNpbmcgYSBzaW5nbGUKK2xpdGVyYWwgYnl0ZSkgYW5kIHRoZSBwcm9jZXNzIG9mIGxhenkgZXZhbHVhdGlvbiBiZWdpbnMgYWdhaW4uIE90aGVyd2lzZSwKK3RoZSBvcmlnaW5hbCBtYXRjaCBpcyBrZXB0LCBhbmQgdGhlIG5leHQgbWF0Y2ggc2VhcmNoIGlzIGF0dGVtcHRlZCBvbmx5IE4KK3N0ZXBzIGxhdGVyLgorCitUaGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uIGlzIGFsc28gc3ViamVjdCB0byBhIHJ1bnRpbWUgcGFyYW1ldGVyLiBJZgordGhlIGN1cnJlbnQgbWF0Y2ggaXMgbG9uZyBlbm91Z2gsIGRlZmxhdGUoKSByZWR1Y2VzIHRoZSBzZWFyY2ggZm9yIGEgbG9uZ2VyCittYXRjaCwgdGh1cyBzcGVlZGluZyB1cCB0aGUgd2hvbGUgcHJvY2Vzcy4gSWYgY29tcHJlc3Npb24gcmF0aW8gaXMgbW9yZQoraW1wb3J0YW50IHRoYW4gc3BlZWQsIGRlZmxhdGUoKSBhdHRlbXB0cyBhIGNvbXBsZXRlIHNlY29uZCBzZWFyY2ggZXZlbiBpZgordGhlIGZpcnN0IG1hdGNoIGlzIGFscmVhZHkgbG9uZyBlbm91Z2guCisKK1RoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgbm90IHBlcmZvcm1lZCBmb3IgdGhlIGZhc3Rlc3QgY29tcHJlc3Npb24KK21vZGVzIChsZXZlbCBwYXJhbWV0ZXIgMSB0byAzKS4gRm9yIHRoZXNlIGZhc3QgbW9kZXMsIG5ldyBzdHJpbmdzCithcmUgaW5zZXJ0ZWQgaW4gdGhlIGhhc2ggdGFibGUgb25seSB3aGVuIG5vIG1hdGNoIHdhcyBmb3VuZCwgb3IKK3doZW4gdGhlIG1hdGNoIGlzIG5vdCB0b28gbG9uZy4gVGhpcyBkZWdyYWRlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8KK2J1dCBzYXZlcyB0aW1lIHNpbmNlIHRoZXJlIGFyZSBib3RoIGZld2VyIGluc2VydGlvbnMgYW5kIGZld2VyIHNlYXJjaGVzLgorCisKKzIuIERlY29tcHJlc3Npb24gYWxnb3JpdGhtIChpbmZsYXRlKQorCisyLjEgSW50cm9kdWN0aW9uCisKK1RoZSBrZXkgcXVlc3Rpb24gaXMgaG93IHRvIHJlcHJlc2VudCBhIEh1ZmZtYW4gY29kZSAob3IgYW55IHByZWZpeCBjb2RlKSBzbwordGhhdCB5b3UgY2FuIGRlY29kZSBmYXN0LiAgVGhlIG1vc3QgaW1wb3J0YW50IGNoYXJhY3RlcmlzdGljIGlzIHRoYXQgc2hvcnRlcgorY29kZXMgYXJlIG11Y2ggbW9yZSBjb21tb24gdGhhbiBsb25nZXIgY29kZXMsIHNvIHBheSBhdHRlbnRpb24gdG8gZGVjb2RpbmcgdGhlCitzaG9ydCBjb2RlcyBmYXN0LCBhbmQgbGV0IHRoZSBsb25nIGNvZGVzIHRha2UgbG9uZ2VyIHRvIGRlY29kZS4KKworaW5mbGF0ZSgpIHNldHMgdXAgYSBmaXJzdCBsZXZlbCB0YWJsZSB0aGF0IGNvdmVycyBzb21lIG51bWJlciBvZiBiaXRzIG9mCitpbnB1dCBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiBsb25nZXN0IGNvZGUuICBJdCBnZXRzIHRoYXQgbWFueSBiaXRzIGZyb20gdGhlCitzdHJlYW0sIGFuZCBsb29rcyBpdCB1cCBpbiB0aGUgdGFibGUuICBUaGUgdGFibGUgd2lsbCB0ZWxsIGlmIHRoZSBuZXh0Citjb2RlIGlzIHRoYXQgbWFueSBiaXRzIG9yIGxlc3MgYW5kIGhvdyBtYW55LCBhbmQgaWYgaXQgaXMsIGl0IHdpbGwgdGVsbAordGhlIHZhbHVlLCBlbHNlIGl0IHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgbGV2ZWwgdGFibGUgZm9yIHdoaWNoIGluZmxhdGUoKQorZ3JhYnMgbW9yZSBiaXRzIGFuZCB0cmllcyB0byBkZWNvZGUgYSBsb25nZXIgY29kZS4KKworSG93IG1hbnkgYml0cyB0byBtYWtlIHRoZSBmaXJzdCBsb29rdXAgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIHRoZSB0aW1lIGl0Cit0YWtlcyB0byBkZWNvZGUgYW5kIHRoZSB0aW1lIGl0IHRha2VzIHRvIGJ1aWxkIHRoZSB0YWJsZS4gIElmIGJ1aWxkaW5nIHRoZQordGFibGUgdG9vayBubyB0aW1lIChhbmQgaWYgeW91IGhhZCBpbmZpbml0ZSBtZW1vcnkpLCB0aGVuIHRoZXJlIHdvdWxkIG9ubHkKK2JlIGEgZmlyc3QgbGV2ZWwgdGFibGUgdG8gY292ZXIgYWxsIHRoZSB3YXkgdG8gdGhlIGxvbmdlc3QgY29kZS4gIEhvd2V2ZXIsCitidWlsZGluZyB0aGUgdGFibGUgZW5kcyB1cCB0YWtpbmcgYSBsb3QgbG9uZ2VyIGZvciBtb3JlIGJpdHMgc2luY2Ugc2hvcnQKK2NvZGVzIGFyZSByZXBsaWNhdGVkIG1hbnkgdGltZXMgaW4gc3VjaCBhIHRhYmxlLiAgV2hhdCBpbmZsYXRlKCkgZG9lcyBpcworc2ltcGx5IHRvIG1ha2UgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaXJzdCB0YWJsZSBhIHZhcmlhYmxlLCBhbmQgIHRoZW4KK3RvIHNldCB0aGF0IHZhcmlhYmxlIGZvciB0aGUgbWF4aW11bSBzcGVlZC4KKworRm9yIGluZmxhdGUsIHdoaWNoIGhhcyAyODYgcG9zc2libGUgY29kZXMgZm9yIHRoZSBsaXRlcmFsL2xlbmd0aCB0cmVlLCB0aGUgc2l6ZQorb2YgdGhlIGZpcnN0IHRhYmxlIGlzIG5pbmUgYml0cy4gIEFsc28gdGhlIGRpc3RhbmNlIHRyZWVzIGhhdmUgMzAgcG9zc2libGUKK3ZhbHVlcywgYW5kIHRoZSBzaXplIG9mIHRoZSBmaXJzdCB0YWJsZSBpcyBzaXggYml0cy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBvZgordGhvc2UgY2FzZXMsIHRoZSB0YWJsZSBlbmRlZCB1cCBvbmUgYml0IGxvbmdlciB0aGFuIHRoZSBgYGF2ZXJhZ2UnJyBjb2RlCitsZW5ndGgsIGkuZS4gdGhlIGNvZGUgbGVuZ3RoIG9mIGFuIGFwcHJveGltYXRlbHkgZmxhdCBjb2RlIHdoaWNoIHdvdWxkIGJlIGEKK2xpdHRsZSBtb3JlIHRoYW4gZWlnaHQgYml0cyBmb3IgMjg2IHN5bWJvbHMgYW5kIGEgbGl0dGxlIGxlc3MgdGhhbiBmaXZlIGJpdHMKK2ZvciAzMCBzeW1ib2xzLgorCisKKzIuMiBNb3JlIGRldGFpbHMgb24gdGhlIGluZmxhdGUgdGFibGUgbG9va3VwCisKK09rLCB5b3Ugd2FudCB0byBrbm93IHdoYXQgdGhpcyBjbGV2ZXJseSBvYmZ1c2NhdGVkIGluZmxhdGUgdHJlZSBhY3R1YWxseQorbG9va3MgbGlrZS4gIFlvdSBhcmUgY29ycmVjdCB0aGF0IGl0J3Mgbm90IGEgSHVmZm1hbiB0cmVlLiAgSXQgaXMgc2ltcGx5IGEKK2xvb2t1cCB0YWJsZSBmb3IgdGhlIGZpcnN0LCBsZXQncyBzYXksIG5pbmUgYml0cyBvZiBhIEh1ZmZtYW4gc3ltYm9sLiAgVGhlCitzeW1ib2wgY291bGQgYmUgYXMgc2hvcnQgYXMgb25lIGJpdCBvciBhcyBsb25nIGFzIDE1IGJpdHMuICBJZiBhIHBhcnRpY3VsYXIKK3N5bWJvbCBpcyBzaG9ydGVyIHRoYW4gbmluZSBiaXRzLCB0aGVuIHRoYXQgc3ltYm9sJ3MgdHJhbnNsYXRpb24gaXMgZHVwbGljYXRlZAoraW4gYWxsIHRob3NlIGVudHJpZXMgdGhhdCBzdGFydCB3aXRoIHRoYXQgc3ltYm9sJ3MgYml0cy4gIEZvciBleGFtcGxlLCBpZiB0aGUKK3N5bWJvbCBpcyBmb3VyIGJpdHMsIHRoZW4gaXQncyBkdXBsaWNhdGVkIDMyIHRpbWVzIGluIGEgbmluZS1iaXQgdGFibGUuICBJZiBhCitzeW1ib2wgaXMgbmluZSBiaXRzIGxvbmcsIGl0IGFwcGVhcnMgaW4gdGhlIHRhYmxlIG9uY2UuCisKK0lmIHRoZSBzeW1ib2wgaXMgbG9uZ2VyIHRoYW4gbmluZSBiaXRzLCB0aGVuIHRoYXQgZW50cnkgaW4gdGhlIHRhYmxlIHBvaW50cwordG8gYW5vdGhlciBzaW1pbGFyIHRhYmxlIGZvciB0aGUgcmVtYWluaW5nIGJpdHMuICBBZ2FpbiwgdGhlcmUgYXJlIGR1cGxpY2F0ZWQKK2VudHJpZXMgYXMgbmVlZGVkLiAgVGhlIGlkZWEgaXMgdGhhdCBtb3N0IG9mIHRoZSB0aW1lIHRoZSBzeW1ib2wgd2lsbCBiZSBzaG9ydAorYW5kIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgdGFibGUgbG9vayB1cC4gIChUaGF0J3Mgd2hvbGUgaWRlYSBiZWhpbmQgZGF0YQorY29tcHJlc3Npb24gaW4gdGhlIGZpcnN0IHBsYWNlLikgIEZvciB0aGUgbGVzcyBmcmVxdWVudCBsb25nIHN5bWJvbHMsIHRoZXJlCit3aWxsIGJlIHR3byBsb29rdXBzLiAgSWYgeW91IGhhZCBhIGNvbXByZXNzaW9uIG1ldGhvZCB3aXRoIHJlYWxseSBsb25nCitzeW1ib2xzLCB5b3UgY291bGQgaGF2ZSBhcyBtYW55IGxldmVscyBvZiBsb29rdXBzIGFzIGlzIGVmZmljaWVudC4gIEZvcgoraW5mbGF0ZSwgdHdvIGlzIGVub3VnaC4KKworU28gYSB0YWJsZSBlbnRyeSBlaXRoZXIgcG9pbnRzIHRvIGFub3RoZXIgdGFibGUgKGluIHdoaWNoIGNhc2UgbmluZSBiaXRzIGluCit0aGUgYWJvdmUgZXhhbXBsZSBhcmUgZ29iYmxlZCksIG9yIGl0IGNvbnRhaW5zIHRoZSB0cmFuc2xhdGlvbiBmb3IgdGhlIHN5bWJvbAorYW5kIHRoZSBudW1iZXIgb2YgYml0cyB0byBnb2JibGUuICBUaGVuIHlvdSBzdGFydCBhZ2FpbiB3aXRoIHRoZSBuZXh0Cit1bmdvYmJsZWQgYml0LgorCitZb3UgbWF5IHdvbmRlcjogd2h5IG5vdCBqdXN0IGhhdmUgb25lIGxvb2t1cCB0YWJsZSBmb3IgaG93IGV2ZXIgbWFueSBiaXRzIHRoZQorbG9uZ2VzdCBzeW1ib2wgaXM/ICBUaGUgcmVhc29uIGlzIHRoYXQgaWYgeW91IGRvIHRoYXQsIHlvdSBlbmQgdXAgc3BlbmRpbmcKK21vcmUgdGltZSBmaWxsaW5nIGluIGR1cGxpY2F0ZSBzeW1ib2wgZW50cmllcyB0aGFuIHlvdSBkbyBhY3R1YWxseSBkZWNvZGluZy4KK0F0IGxlYXN0IGZvciBkZWZsYXRlJ3Mgb3V0cHV0IHRoYXQgZ2VuZXJhdGVzIG5ldyB0cmVlcyBldmVyeSBzZXZlcmFsIDEwJ3Mgb2YKK2tieXRlcy4gIFlvdSBjYW4gaW1hZ2luZSB0aGF0IGZpbGxpbmcgaW4gYSAyXjE1IGVudHJ5IHRhYmxlIGZvciBhIDE1LWJpdCBjb2RlCit3b3VsZCB0YWtlIHRvbyBsb25nIGlmIHlvdSdyZSBvbmx5IGRlY29kaW5nIHNldmVyYWwgdGhvdXNhbmQgc3ltYm9scy4gIEF0IHRoZQorb3RoZXIgZXh0cmVtZSwgeW91IGNvdWxkIG1ha2UgYSBuZXcgdGFibGUgZm9yIGV2ZXJ5IGJpdCBpbiB0aGUgY29kZS4gIEluIGZhY3QsCit0aGF0J3MgZXNzZW50aWFsbHkgYSBIdWZmbWFuIHRyZWUuICBCdXQgdGhlbiB5b3Ugc3BlbmQgdHdvIG11Y2ggdGltZQordHJhdmVyc2luZyB0aGUgdHJlZSB3aGlsZSBkZWNvZGluZywgZXZlbiBmb3Igc2hvcnQgc3ltYm9scy4KKworU28gdGhlIG51bWJlciBvZiBiaXRzIGZvciB0aGUgZmlyc3QgbG9va3VwIHRhYmxlIGlzIGEgdHJhZGUgb2YgdGhlIHRpbWUgdG8KK2ZpbGwgb3V0IHRoZSB0YWJsZSB2cy4gdGhlIHRpbWUgc3BlbnQgbG9va2luZyBhdCB0aGUgc2Vjb25kIGxldmVsIGFuZCBhYm92ZSBvZgordGhlIHRhYmxlLgorCitIZXJlIGlzIGFuIGV4YW1wbGUsIHNjYWxlZCBkb3duOgorCitUaGUgY29kZSBiZWluZyBkZWNvZGVkLCB3aXRoIDEwIHN5bWJvbHMsIGZyb20gMSB0byA2IGJpdHMgbG9uZzoKKworQTogMAorQjogMTAKK0M6IDExMDAKK0Q6IDExMDEwCitFOiAxMTAxMQorRjogMTExMDAKK0c6IDExMTAxCitIOiAxMTExMAorSTogMTExMTEwCitKOiAxMTExMTEKKworTGV0J3MgbWFrZSB0aGUgZmlyc3QgdGFibGUgdGhyZWUgYml0cyBsb25nIChlaWdodCBlbnRyaWVzKToKKworMDAwOiBBLDEKKzAwMTogQSwxCiswMTA6IEEsMQorMDExOiBBLDEKKzEwMDogQiwyCisxMDE6IEIsMgorMTEwOiAtPiB0YWJsZSBYIChnb2JibGUgMyBiaXRzKQorMTExOiAtPiB0YWJsZSBZIChnb2JibGUgMyBiaXRzKQorCitFYWNoIGVudHJ5IGlzIHdoYXQgdGhlIGJpdHMgZGVjb2RlIGFzIGFuZCBob3cgbWFueSBiaXRzIHRoYXQgaXMsIGkuZS4gaG93CittYW55IGJpdHMgdG8gZ29iYmxlLiAgT3IgdGhlIGVudHJ5IHBvaW50cyB0byBhbm90aGVyIHRhYmxlLCB3aXRoIHRoZSBudW1iZXIgb2YKK2JpdHMgdG8gZ29iYmxlIGltcGxpY2l0IGluIHRoZSBzaXplIG9mIHRoZSB0YWJsZS4KKworVGFibGUgWCBpcyB0d28gYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTAgaXMgZml2ZSBiaXRzCitsb25nOgorCiswMDogQywxCiswMTogQywxCisxMDogRCwyCisxMTogRSwyCisKK1RhYmxlIFkgaXMgdGhyZWUgYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTEgaXMgc2l4CitiaXRzIGxvbmc6CisKKzAwMDogRiwyCiswMDE6IEYsMgorMDEwOiBHLDIKKzAxMTogRywyCisxMDA6IEgsMgorMTAxOiBILDIKKzExMDogSSwzCisxMTE6IEosMworCitTbyB3aGF0IHdlIGhhdmUgaGVyZSBhcmUgdGhyZWUgdGFibGVzIHdpdGggYSB0b3RhbCBvZiAyMCBlbnRyaWVzIHRoYXQgaGFkIHRvCitiZSBjb25zdHJ1Y3RlZC4gIFRoYXQncyBjb21wYXJlZCB0byA2NCBlbnRyaWVzIGZvciBhIHNpbmdsZSB0YWJsZS4gIE9yCitjb21wYXJlZCB0byAxNiBlbnRyaWVzIGZvciBhIEh1ZmZtYW4gdHJlZSAoc2l4IHR3byBlbnRyeSB0YWJsZXMgYW5kIG9uZSBmb3VyCitlbnRyeSB0YWJsZSkuICBBc3N1bWluZyB0aGF0IHRoZSBjb2RlIGlkZWFsbHkgcmVwcmVzZW50cyB0aGUgcHJvYmFiaWxpdHkgb2YKK3RoZSBzeW1ib2xzLCBpdCB0YWtlcyBvbiB0aGUgYXZlcmFnZSAxLjI1IGxvb2t1cHMgcGVyIHN5bWJvbC4gIFRoYXQncyBjb21wYXJlZAordG8gb25lIGxvb2t1cCBmb3IgdGhlIHNpbmdsZSB0YWJsZSwgb3IgMS42NiBsb29rdXBzIHBlciBzeW1ib2wgZm9yIHRoZQorSHVmZm1hbiB0cmVlLgorCitUaGVyZSwgSSB0aGluayB0aGF0IGdpdmVzIHlvdSBhIHBpY3R1cmUgb2Ygd2hhdCdzIGdvaW5nIG9uLiAgRm9yIGluZmxhdGUsIHRoZQorbWVhbmluZyBvZiBhIHBhcnRpY3VsYXIgc3ltYm9sIGlzIG9mdGVuIG1vcmUgdGhhbiBqdXN0IGEgbGV0dGVyLiAgSXQgY2FuIGJlIGEKK2J5dGUgKGEgImxpdGVyYWwiKSwgb3IgaXQgY2FuIGJlIGVpdGhlciBhIGxlbmd0aCBvciBhIGRpc3RhbmNlIHdoaWNoCitpbmRpY2F0ZXMgYSBiYXNlIHZhbHVlIGFuZCBhIG51bWJlciBvZiBiaXRzIHRvIGZldGNoIGFmdGVyIHRoZSBjb2RlIHRoYXQgaXMKK2FkZGVkIHRvIHRoZSBiYXNlIHZhbHVlLiAgT3IgaXQgbWlnaHQgYmUgdGhlIHNwZWNpYWwgZW5kLW9mLWJsb2NrIGNvZGUuICBUaGUKK2RhdGEgc3RydWN0dXJlcyBjcmVhdGVkIGluIGluZnRyZWVzLmMgdHJ5IHRvIGVuY29kZSBhbGwgdGhhdCBpbmZvcm1hdGlvbgorY29tcGFjdGx5IGluIHRoZSB0YWJsZXMuCisKKworSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgoramxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKK1JlZmVyZW5jZXM6CisKK1tMWjc3XSBaaXYgSi4sIExlbXBlbCBBLiwgYGBBIFVuaXZlcnNhbCBBbGdvcml0aG0gZm9yIFNlcXVlbnRpYWwgRGF0YQorQ29tcHJlc3Npb24sJycgSUVFRSBUcmFuc2FjdGlvbnMgb24gSW5mb3JtYXRpb24gVGhlb3J5LCBWb2wuIDIzLCBOby4gMywKK3BwLiAzMzctMzQzLgorCitgYERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uJycgYXZhaWxhYmxlIGluCitodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUxLnR4dApkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvY29tcHJlc3MuYyBiL2NvbTMyL2xpYi96bGliL2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0ZGZiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL2NvbXByZXNzLmMKQEAgLTAsMCArMSw4MCBAQAorLyogY29tcHJlc3MuYyAtLSBjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2luY2x1ZGUgInpsaWIuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlTGVuIHBsdXMKKyAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICBjb21wcmVzczIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCisgICBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCisqLworaW50IFpFWFBPUlQgY29tcHJlc3MyIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbiwgbGV2ZWwpCisgICAgQnl0ZWYgKmRlc3Q7CisgICAgdUxvbmdmICpkZXN0TGVuOworICAgIGNvbnN0IEJ5dGVmICpzb3VyY2U7CisgICAgdUxvbmcgc291cmNlTGVuOworICAgIGludCBsZXZlbDsKK3sKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgaW50IGVycjsKKworICAgIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilzb3VyY2U7CisgICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOworI2lmZGVmIE1BWFNFR182NEsKKyAgICAvKiBDaGVjayBmb3Igc291cmNlID4gNjRLIG9uIDE2LWJpdCBtYWNoaW5lOiAqLworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX2luICE9IHNvdXJjZUxlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworI2VuZGlmCisgICAgc3RyZWFtLm5leHRfb3V0ID0gZGVzdDsKKyAgICBzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmRlc3RMZW47CisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfb3V0ICE9ICpkZXN0TGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGVyciA9IGRlZmxhdGVJbml0KCZzdHJlYW0sIGxldmVsKTsKKyAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBkZWZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgICByZXR1cm4gZXJyID09IFpfT0sgPyBaX0JVRl9FUlJPUiA6IGVycjsKKyAgICB9CisgICAgKmRlc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgZXJyID0gZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworaW50IFpFWFBPUlQgY29tcHJlc3MgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuKQorICAgIEJ5dGVmICpkZXN0OworICAgIHVMb25nZiAqZGVzdExlbjsKKyAgICBjb25zdCBCeXRlZiAqc291cmNlOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICByZXR1cm4gY29tcHJlc3MyKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgSWYgdGhlIGRlZmF1bHQgbWVtTGV2ZWwgb3Igd2luZG93Qml0cyBmb3IgZGVmbGF0ZUluaXQoKSBpcyBjaGFuZ2VkLCB0aGVuCisgICB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgKi8KK3VMb25nIFpFWFBPUlQgY29tcHJlc3NCb3VuZCAoc291cmNlTGVuKQorICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICByZXR1cm4gc291cmNlTGVuICsgKHNvdXJjZUxlbiA+PiAxMikgKyAoc291cmNlTGVuID4+IDE0KSArCisgICAgICAgICAgIChzb3VyY2VMZW4gPj4gMjUpICsgMTM7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvemxpYi9jcmMzMi5jIGIvY29tMzIvbGliL3psaWIvY3JjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI2NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3psaWIvY3JjMzIuYwpAQCAtMCwwICsxLDQ0MiBAQAorLyogY3JjMzIuYyAtLSBjb21wdXRlIHRoZSBDUkMtMzIgb2YgYSBkYXRhIHN0cmVhbQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDYsIDIwMTAgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICoKKyAqIFRoYW5rcyB0byBSb2RuZXkgQnJvd24gPHJicm93bjY0QGNzYy5jb20uYXU+IGZvciBoaXMgY29udHJpYnV0aW9uIG9mIGZhc3RlcgorICogQ1JDIG1ldGhvZHM6IGV4Y2x1c2l2ZS1vcmluZyAzMiBiaXRzIG9mIGRhdGEgYXQgYSB0aW1lLCBhbmQgcHJlLWNvbXB1dGluZworICogdGFibGVzIGZvciB1cGRhdGluZyB0aGUgc2hpZnQgcmVnaXN0ZXIgaW4gb25lIHN0ZXAgd2l0aCB0aHJlZSBleGNsdXNpdmUtb3JzCisgKiBpbnN0ZWFkIG9mIGZvdXIgc3RlcHMgd2l0aCBmb3VyIGV4Y2x1c2l2ZS1vcnMuICBUaGlzIHJlc3VsdHMgaW4gYWJvdXQgYQorICogZmFjdG9yIG9mIHR3byBpbmNyZWFzZSBpbiBzcGVlZCBvbiBhIFBvd2VyIFBDIEc0IChQUEM3NDU1KSB1c2luZyBnY2MgLU8zLgorICovCisKKy8qIEAoIykgJElkJCAqLworCisvKgorICBOb3RlIG9uIHRoZSB1c2Ugb2YgRFlOQU1JQ19DUkNfVEFCTEU6IHRoZXJlIGlzIG5vIG11dGV4IG9yIHNlbWFwaG9yZQorICBwcm90ZWN0aW9uIG9uIHRoZSBzdGF0aWMgdmFyaWFibGVzIHVzZWQgdG8gY29udHJvbCB0aGUgZmlyc3QtdXNlIGdlbmVyYXRpb24KKyAgb2YgdGhlIGNyYyB0YWJsZXMuICBUaGVyZWZvcmUsIGlmIHlvdSAjZGVmaW5lIERZTkFNSUNfQ1JDX1RBQkxFLCB5b3Ugc2hvdWxkCisgIGZpcnN0IGNhbGwgZ2V0X2NyY190YWJsZSgpIHRvIGluaXRpYWxpemUgdGhlIHRhYmxlcyBiZWZvcmUgYWxsb3dpbmcgbW9yZSB0aGFuCisgIG9uZSB0aHJlYWQgdG8gdXNlIGNyYzMyKCkuCisgKi8KKworI2lmZGVmIE1BS0VDUkNICisjICBpbmNsdWRlIDxzdGRpby5oPgorIyAgaWZuZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisjICAgIGRlZmluZSBEWU5BTUlDX0NSQ19UQUJMRQorIyAgZW5kaWYgLyogIURZTkFNSUNfQ1JDX1RBQkxFICovCisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KKworI2luY2x1ZGUgInp1dGlsLmgiICAgICAgLyogZm9yIFNUREMgYW5kIEZBUiBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCisvKiBGaW5kIGEgZm91ci1ieXRlIGludGVnZXIgdHlwZSBmb3IgY3JjMzJfbGl0dGxlKCkgYW5kIGNyYzMyX2JpZygpLiAqLworI2lmbmRlZiBOT0JZRk9VUgorIyAgaWZkZWYgU1REQyAgICAgICAgICAgLyogbmVlZCBBTlNJIEMgbGltaXRzLmggdG8gZGV0ZXJtaW5lIHNpemVzICovCisjICAgIGluY2x1ZGUgPGxpbWl0cy5oPgorIyAgICBkZWZpbmUgQllGT1VSCisjICAgIGlmIChVSU5UX01BWCA9PSAweGZmZmZmZmZmVUwpCisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdTQ7CisjICAgIGVsc2UKKyMgICAgICBpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB1NDsKKyMgICAgICBlbHNlCisjICAgICAgICBpZiAoVVNIUlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyAgICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1NDsKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgdW5kZWYgQllGT1VSICAgICAvKiBjYW4ndCBmaW5kIGEgZm91ci1ieXRlIGludGVnZXIgdHlwZSEgKi8KKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qIFNUREMgKi8KKyNlbmRpZiAvKiAhTk9CWUZPVVIgKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIGRvaW5nIHRoZSBjcmMgZm91ciBkYXRhIGJ5dGVzIGF0IGEgdGltZS4gKi8KKyNpZmRlZiBCWUZPVVIKKyMgIGRlZmluZSBSRVYodykgKCgoKHcpPj4yNCkmMHhmZikrKCgodyk+PjgpJjB4ZmYwMCkrIFwKKyAgICAgICAgICAgICAgICAoKCh3KSYweGZmMDApPDw4KSsoKCh3KSYweGZmKTw8MjQpKQorICAgbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9saXR0bGUgT0YoKHVuc2lnbmVkIGxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOworICAgbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9iaWcgT0YoKHVuc2lnbmVkIGxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOworIyAgZGVmaW5lIFRCTFMgOAorI2Vsc2UKKyMgIGRlZmluZSBUQkxTIDEKKyNlbmRpZiAvKiBCWUZPVVIgKi8KKworLyogTG9jYWwgZnVuY3Rpb25zIGZvciBjcmMgY29uY2F0ZW5hdGlvbiAqLworbG9jYWwgdW5zaWduZWQgbG9uZyBnZjJfbWF0cml4X3RpbWVzIE9GKCh1bnNpZ25lZCBsb25nICptYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdmVjKSk7Citsb2NhbCB2b2lkIGdmMl9tYXRyaXhfc3F1YXJlIE9GKCh1bnNpZ25lZCBsb25nICpzcXVhcmUsIHVuc2lnbmVkIGxvbmcgKm1hdCkpOworbG9jYWwgdUxvbmcgY3JjMzJfY29tYmluZV8odUxvbmcgY3JjMSwgdUxvbmcgY3JjMiwgel9vZmY2NF90IGxlbjIpOworCisKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorCitsb2NhbCB2b2xhdGlsZSBpbnQgY3JjX3RhYmxlX2VtcHR5ID0gMTsKK2xvY2FsIHVuc2lnbmVkIGxvbmcgRkFSIGNyY190YWJsZVtUQkxTXVsyNTZdOworbG9jYWwgdm9pZCBtYWtlX2NyY190YWJsZSBPRigodm9pZCkpOworI2lmZGVmIE1BS0VDUkNICisgICBsb2NhbCB2b2lkIHdyaXRlX3RhYmxlIE9GKChGSUxFICosIGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICopKTsKKyNlbmRpZiAvKiBNQUtFQ1JDSCAqLworLyoKKyAgR2VuZXJhdGUgdGFibGVzIGZvciBhIGJ5dGUtd2lzZSAzMi1iaXQgQ1JDIGNhbGN1bGF0aW9uIG9uIHRoZSBwb2x5bm9taWFsOgorICB4XjMyK3heMjYreF4yMyt4XjIyK3heMTYreF4xMit4XjExK3heMTAreF44K3heNyt4XjUreF40K3heMit4KzEuCisKKyAgUG9seW5vbWlhbHMgb3ZlciBHRigyKSBhcmUgcmVwcmVzZW50ZWQgaW4gYmluYXJ5LCBvbmUgYml0IHBlciBjb2VmZmljaWVudCwKKyAgd2l0aCB0aGUgbG93ZXN0IHBvd2VycyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBUaGVuIGFkZGluZyBwb2x5bm9taWFscworICBpcyBqdXN0IGV4Y2x1c2l2ZS1vciwgYW5kIG11bHRpcGx5aW5nIGEgcG9seW5vbWlhbCBieSB4IGlzIGEgcmlnaHQgc2hpZnQgYnkKKyAgb25lLiAgSWYgd2UgY2FsbCB0aGUgYWJvdmUgcG9seW5vbWlhbCBwLCBhbmQgcmVwcmVzZW50IGEgYnl0ZSBhcyB0aGUKKyAgcG9seW5vbWlhbCBxLCBhbHNvIHdpdGggdGhlIGxvd2VzdCBwb3dlciBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgKHNvIHRoZQorICBieXRlIDB4YjEgaXMgdGhlIHBvbHlub21pYWwgeF43K3heMyt4KzEpLCB0aGVuIHRoZSBDUkMgaXMgKHEqeF4zMikgbW9kIHAsCisgIHdoZXJlIGEgbW9kIGIgbWVhbnMgdGhlIHJlbWFpbmRlciBhZnRlciBkaXZpZGluZyBhIGJ5IGIuCisKKyAgVGhpcyBjYWxjdWxhdGlvbiBpcyBkb25lIHVzaW5nIHRoZSBzaGlmdC1yZWdpc3RlciBtZXRob2Qgb2YgbXVsdGlwbHlpbmcgYW5kCisgIHRha2luZyB0aGUgcmVtYWluZGVyLiAgVGhlIHJlZ2lzdGVyIGlzIGluaXRpYWxpemVkIHRvIHplcm8sIGFuZCBmb3IgZWFjaAorICBpbmNvbWluZyBiaXQsIHheMzIgaXMgYWRkZWQgbW9kIHAgdG8gdGhlIHJlZ2lzdGVyIGlmIHRoZSBiaXQgaXMgYSBvbmUgKHdoZXJlCisgIHheMzIgbW9kIHAgaXMgcCt4XjMyID0geF4yNisuLi4rMSksIGFuZCB0aGUgcmVnaXN0ZXIgaXMgbXVsdGlwbGllZCBtb2QgcCBieQorICB4ICh3aGljaCBpcyBzaGlmdGluZyByaWdodCBieSBvbmUgYW5kIGFkZGluZyB4XjMyIG1vZCBwIGlmIHRoZSBiaXQgc2hpZnRlZAorICBvdXQgaXMgYSBvbmUpLiAgV2Ugc3RhcnQgd2l0aCB0aGUgaGlnaGVzdCBwb3dlciAobGVhc3Qgc2lnbmlmaWNhbnQgYml0KSBvZgorICBxIGFuZCByZXBlYXQgZm9yIGFsbCBlaWdodCBiaXRzIG9mIHEuCisKKyAgVGhlIGZpcnN0IHRhYmxlIGlzIHNpbXBseSB0aGUgQ1JDIG9mIGFsbCBwb3NzaWJsZSBlaWdodCBiaXQgdmFsdWVzLiAgVGhpcyBpcworICBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBnZW5lcmF0ZSBDUkNzIG9uIGRhdGEgYSBieXRlIGF0IGEgdGltZSBmb3IgYWxsCisgIGNvbWJpbmF0aW9ucyBvZiBDUkMgcmVnaXN0ZXIgdmFsdWVzIGFuZCBpbmNvbWluZyBieXRlcy4gIFRoZSByZW1haW5pbmcgdGFibGVzCisgIGFsbG93IGZvciB3b3JkLWF0LWEtdGltZSBDUkMgY2FsY3VsYXRpb24gZm9yIGJvdGggYmlnLWVuZGlhbiBhbmQgbGl0dGxlLQorICBlbmRpYW4gbWFjaGluZXMsIHdoZXJlIGEgd29yZCBpcyBmb3VyIGJ5dGVzLgorKi8KK2xvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUoKQoreworICAgIHVuc2lnbmVkIGxvbmcgYzsKKyAgICBpbnQgbiwgazsKKyAgICB1bnNpZ25lZCBsb25nIHBvbHk7ICAgICAgICAgICAgICAgICAvKiBwb2x5bm9taWFsIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuICovCisgICAgLyogdGVybXMgb2YgcG9seW5vbWlhbCBkZWZpbmluZyB0aGlzIGNyYyAoZXhjZXB0IHheMzIpOiAqLworICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQgZmlyc3QgPSAxOyAgICAgIC8qIGZsYWcgdG8gbGltaXQgY29uY3VycmVudCBtYWtpbmcgKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwW10gPSB7MCwxLDIsNCw1LDcsOCwxMCwxMSwxMiwxNiwyMiwyMywyNn07CisKKyAgICAvKiBTZWUgaWYgYW5vdGhlciB0YXNrIGlzIGFscmVhZHkgZG9pbmcgdGhpcyAobm90IHRocmVhZC1zYWZlLCBidXQgYmV0dGVyCisgICAgICAgdGhhbiBub3RoaW5nIC0tIHNpZ25pZmljYW50bHkgcmVkdWNlcyBkdXJhdGlvbiBvZiB2dWxuZXJhYmlsaXR5IGluCisgICAgICAgY2FzZSB0aGUgYWR2aWNlIGFib3V0IERZTkFNSUNfQ1JDX1RBQkxFIGlzIGlnbm9yZWQpICovCisgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gMDsKKworICAgICAgICAvKiBtYWtlIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuIGZyb20gcG9seW5vbWlhbCAoMHhlZGI4ODMyMFVMKSAqLworICAgICAgICBwb2x5ID0gMFVMOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKGludCkoc2l6ZW9mKHApL3NpemVvZih1bnNpZ25lZCBjaGFyKSk7IG4rKykKKyAgICAgICAgICAgIHBvbHkgfD0gMVVMIDw8ICgzMSAtIHBbbl0pOworCisgICAgICAgIC8qIGdlbmVyYXRlIGEgY3JjIGZvciBldmVyeSA4LWJpdCB2YWx1ZSAqLworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKKyAgICAgICAgICAgIGMgPSAodW5zaWduZWQgbG9uZyluOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICBjID0gYyAmIDEgPyBwb2x5IF4gKGMgPj4gMSkgOiBjID4+IDE7CisgICAgICAgICAgICBjcmNfdGFibGVbMF1bbl0gPSBjOworICAgICAgICB9CisKKyNpZmRlZiBCWUZPVVIKKyAgICAgICAgLyogZ2VuZXJhdGUgY3JjIGZvciBlYWNoIHZhbHVlIGZvbGxvd2VkIGJ5IG9uZSwgdHdvLCBhbmQgdGhyZWUgemVyb3MsCisgICAgICAgICAgIGFuZCB0aGVuIHRoZSBieXRlIHJldmVyc2FsIG9mIHRob3NlIGFzIHdlbGwgYXMgdGhlIGZpcnN0IHRhYmxlICovCisgICAgICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgeworICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtuXTsKKyAgICAgICAgICAgIGNyY190YWJsZVs0XVtuXSA9IFJFVihjKTsKKyAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCA0OyBrKyspIHsKKyAgICAgICAgICAgICAgICBjID0gY3JjX3RhYmxlWzBdW2MgJiAweGZmXSBeIChjID4+IDgpOworICAgICAgICAgICAgICAgIGNyY190YWJsZVtrXVtuXSA9IGM7CisgICAgICAgICAgICAgICAgY3JjX3RhYmxlW2sgKyA0XVtuXSA9IFJFVihjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIEJZRk9VUiAqLworCisgICAgICAgIGNyY190YWJsZV9lbXB0eSA9IDA7CisgICAgfQorICAgIGVsc2UgeyAgICAgIC8qIG5vdCBmaXJzdCAqLworICAgICAgICAvKiB3YWl0IGZvciB0aGUgb3RoZXIgZ3V5IHRvIGZpbmlzaCAobm90IGVmZmljaWVudCwgYnV0IHJhcmUpICovCisgICAgICAgIHdoaWxlIChjcmNfdGFibGVfZW1wdHkpCisgICAgICAgICAgICA7CisgICAgfQorCisjaWZkZWYgTUFLRUNSQ0gKKyAgICAvKiB3cml0ZSBvdXQgQ1JDIHRhYmxlcyB0byBjcmMzMi5oICovCisgICAgeworICAgICAgICBGSUxFICpvdXQ7CisKKyAgICAgICAgb3V0ID0gZm9wZW4oImNyYzMyLmgiLCAidyIpOworICAgICAgICBpZiAob3V0ID09IE5VTEwpIHJldHVybjsKKyAgICAgICAgZnByaW50ZihvdXQsICIvKiBjcmMzMi5oIC0tIHRhYmxlcyBmb3IgcmFwaWQgQ1JDIGNhbGN1bGF0aW9uXG4iKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjcmMzMi5jXG4gKi9cblxuIik7CisgICAgICAgIGZwcmludGYob3V0LCAibG9jYWwgY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgIik7CisgICAgICAgIGZwcmludGYob3V0LCAiY3JjX3RhYmxlW1RCTFNdWzI1Nl0gPVxue1xuICB7XG4iKTsKKyAgICAgICAgd3JpdGVfdGFibGUob3V0LCBjcmNfdGFibGVbMF0pOworIyAgaWZkZWYgQllGT1VSCisgICAgICAgIGZwcmludGYob3V0LCAiI2lmZGVmIEJZRk9VUlxuIik7CisgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspIHsKKyAgICAgICAgICAgIGZwcmludGYob3V0LCAiICB9LFxuICB7XG4iKTsKKyAgICAgICAgICAgIHdyaXRlX3RhYmxlKG91dCwgY3JjX3RhYmxlW2tdKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKG91dCwgIiNlbmRpZlxuIik7CisjICBlbmRpZiAvKiBCWUZPVVIgKi8KKyAgICAgICAgZnByaW50ZihvdXQsICIgIH1cbn07XG4iKTsKKyAgICAgICAgZmNsb3NlKG91dCk7CisgICAgfQorI2VuZGlmIC8qIE1BS0VDUkNIICovCit9CisKKyNpZmRlZiBNQUtFQ1JDSAorbG9jYWwgdm9pZCB3cml0ZV90YWJsZShvdXQsIHRhYmxlKQorICAgIEZJTEUgKm91dDsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nIEZBUiAqdGFibGU7Cit7CisgICAgaW50IG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspCisgICAgICAgIGZwcmludGYob3V0LCAiJXMweCUwOGx4VUwlcyIsIG4gJSA1ID8gIiIgOiAiICAgICIsIHRhYmxlW25dLAorICAgICAgICAgICAgICAgIG4gPT0gMjU1ID8gIlxuIiA6IChuICUgNSA9PSA0ID8gIixcbiIgOiAiLCAiKSk7Cit9CisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KKworI2Vsc2UgLyogIURZTkFNSUNfQ1JDX1RBQkxFICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRhYmxlcyBvZiBDUkMtMzJzIG9mIGFsbCBzaW5nbGUtYnl0ZSB2YWx1ZXMsIG1hZGUgYnkgbWFrZV9jcmNfdGFibGUoKS4KKyAqLworI2luY2x1ZGUgImNyYzMyLmgiCisjZW5kaWYgLyogRFlOQU1JQ19DUkNfVEFCTEUgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBhc20gdmVyc2lvbnMgb2YgY3JjMzIoKQorICovCitjb25zdCB1bnNpZ25lZCBsb25nIEZBUiAqIFpFWFBPUlQgZ2V0X2NyY190YWJsZSgpCit7CisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyAgICBpZiAoY3JjX3RhYmxlX2VtcHR5KQorICAgICAgICBtYWtlX2NyY190YWJsZSgpOworI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCisgICAgcmV0dXJuIChjb25zdCB1bnNpZ25lZCBsb25nIEZBUiAqKWNyY190YWJsZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBETzEgY3JjID0gY3JjX3RhYmxlWzBdWygoaW50KWNyYyBeICgqYnVmKyspKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KQorI2RlZmluZSBETzggRE8xOyBETzE7IERPMTsgRE8xOyBETzE7IERPMTsgRE8xOyBETzEKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordW5zaWduZWQgbG9uZyBaRVhQT1JUIGNyYzMyKGNyYywgYnVmLCBsZW4pCisgICAgdW5zaWduZWQgbG9uZyBjcmM7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKKyAgICB1SW50IGxlbjsKK3sKKyAgICBpZiAoYnVmID09IFpfTlVMTCkgcmV0dXJuIDBVTDsKKworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisgICAgaWYgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKKyNlbmRpZiAvKiBEWU5BTUlDX0NSQ19UQUJMRSAqLworCisjaWZkZWYgQllGT1VSCisgICAgaWYgKHNpemVvZih2b2lkICopID09IHNpemVvZihwdHJkaWZmX3QpKSB7CisgICAgICAgIHU0IGVuZGlhbjsKKworICAgICAgICBlbmRpYW4gPSAxOworICAgICAgICBpZiAoKigodW5zaWduZWQgY2hhciAqKSgmZW5kaWFuKSkpCisgICAgICAgICAgICByZXR1cm4gY3JjMzJfbGl0dGxlKGNyYywgYnVmLCBsZW4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY3JjMzJfYmlnKGNyYywgYnVmLCBsZW4pOworICAgIH0KKyNlbmRpZiAvKiBCWUZPVVIgKi8KKyAgICBjcmMgPSBjcmMgXiAweGZmZmZmZmZmVUw7CisgICAgd2hpbGUgKGxlbiA+PSA4KSB7CisgICAgICAgIERPODsKKyAgICAgICAgbGVuIC09IDg7CisgICAgfQorICAgIGlmIChsZW4pIGRvIHsKKyAgICAgICAgRE8xOworICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICByZXR1cm4gY3JjIF4gMHhmZmZmZmZmZlVMOworfQorCisjaWZkZWYgQllGT1VSCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgRE9MSVQ0IGMgXj0gKmJ1ZjQrKzsgXAorICAgICAgICBjID0gY3JjX3RhYmxlWzNdW2MgJiAweGZmXSBeIGNyY190YWJsZVsyXVsoYyA+PiA4KSAmIDB4ZmZdIF4gXAorICAgICAgICAgICAgY3JjX3RhYmxlWzFdWyhjID4+IDE2KSAmIDB4ZmZdIF4gY3JjX3RhYmxlWzBdW2MgPj4gMjRdCisjZGVmaW5lIERPTElUMzIgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9saXR0bGUoY3JjLCBidWYsIGxlbikKKyAgICB1bnNpZ25lZCBsb25nIGNyYzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICByZWdpc3RlciB1NCBjOworICAgIHJlZ2lzdGVyIGNvbnN0IHU0IEZBUiAqYnVmNDsKKworICAgIGMgPSAodTQpY3JjOworICAgIGMgPSB+YzsKKyAgICB3aGlsZSAobGVuICYmICgocHRyZGlmZl90KWJ1ZiAmIDMpKSB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bKGMgXiAqYnVmKyspICYgMHhmZl0gXiAoYyA+PiA4KTsKKyAgICAgICAgbGVuLS07CisgICAgfQorCisgICAgYnVmNCA9IChjb25zdCB1NCBGQVIgKikoY29uc3Qgdm9pZCBGQVIgKilidWY7CisgICAgd2hpbGUgKGxlbiA+PSAzMikgeworICAgICAgICBET0xJVDMyOworICAgICAgICBsZW4gLT0gMzI7CisgICAgfQorICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgICBET0xJVDQ7CisgICAgICAgIGxlbiAtPSA0OworICAgIH0KKyAgICBidWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKilidWY0OworCisgICAgaWYgKGxlbikgZG8geworICAgICAgICBjID0gY3JjX3RhYmxlWzBdWyhjIF4gKmJ1ZisrKSAmIDB4ZmZdIF4gKGMgPj4gOCk7CisgICAgfSB3aGlsZSAoLS1sZW4pOworICAgIGMgPSB+YzsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpYzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBET0JJRzQgYyBePSAqKytidWY0OyBcCisgICAgICAgIGMgPSBjcmNfdGFibGVbNF1bYyAmIDB4ZmZdIF4gY3JjX3RhYmxlWzVdWyhjID4+IDgpICYgMHhmZl0gXiBcCisgICAgICAgICAgICBjcmNfdGFibGVbNl1bKGMgPj4gMTYpICYgMHhmZl0gXiBjcmNfdGFibGVbN11bYyA+PiAyNF0KKyNkZWZpbmUgRE9CSUczMiBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2JpZyhjcmMsIGJ1ZiwgbGVuKQorICAgIHVuc2lnbmVkIGxvbmcgY3JjOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIHJlZ2lzdGVyIHU0IGM7CisgICAgcmVnaXN0ZXIgY29uc3QgdTQgRkFSICpidWY0OworCisgICAgYyA9IFJFVigodTQpY3JjKTsKKyAgICBjID0gfmM7CisgICAgd2hpbGUgKGxlbiAmJiAoKHB0cmRpZmZfdClidWYgJiAzKSkgeworICAgICAgICBjID0gY3JjX3RhYmxlWzRdWyhjID4+IDI0KSBeICpidWYrK10gXiAoYyA8PCA4KTsKKyAgICAgICAgbGVuLS07CisgICAgfQorCisgICAgYnVmNCA9IChjb25zdCB1NCBGQVIgKikoY29uc3Qgdm9pZCBGQVIgKilidWY7CisgICAgYnVmNC0tOworICAgIHdoaWxlIChsZW4gPj0gMzIpIHsKKyAgICAgICAgRE9CSUczMjsKKyAgICAgICAgbGVuIC09IDMyOworICAgIH0KKyAgICB3aGlsZSAobGVuID49IDQpIHsKKyAgICAgICAgRE9CSUc0OworICAgICAgICBsZW4gLT0gNDsKKyAgICB9CisgICAgYnVmNCsrOworICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqKWJ1ZjQ7CisKKyAgICBpZiAobGVuKSBkbyB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbNF1bKGMgPj4gMjQpIF4gKmJ1ZisrXSBeIChjIDw8IDgpOworICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICBjID0gfmM7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKShSRVYoYykpOworfQorCisjZW5kaWYgLyogQllGT1VSICovCisKKyNkZWZpbmUgR0YyX0RJTSAzMiAgICAgIC8qIGRpbWVuc2lvbiBvZiBHRigyKSB2ZWN0b3JzIChsZW5ndGggb2YgQ1JDKSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGdmMl9tYXRyaXhfdGltZXMobWF0LCB2ZWMpCisgICAgdW5zaWduZWQgbG9uZyAqbWF0OworICAgIHVuc2lnbmVkIGxvbmcgdmVjOworeworICAgIHVuc2lnbmVkIGxvbmcgc3VtOworCisgICAgc3VtID0gMDsKKyAgICB3aGlsZSAodmVjKSB7CisgICAgICAgIGlmICh2ZWMgJiAxKQorICAgICAgICAgICAgc3VtIF49ICptYXQ7CisgICAgICAgIHZlYyA+Pj0gMTsKKyAgICAgICAgbWF0Kys7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHZvaWQgZ2YyX21hdHJpeF9zcXVhcmUoc3F1YXJlLCBtYXQpCisgICAgdW5zaWduZWQgbG9uZyAqc3F1YXJlOworICAgIHVuc2lnbmVkIGxvbmcgKm1hdDsKK3sKKyAgICBpbnQgbjsKKworICAgIGZvciAobiA9IDA7IG4gPCBHRjJfRElNOyBuKyspCisgICAgICAgIHNxdWFyZVtuXSA9IGdmMl9tYXRyaXhfdGltZXMobWF0LCBtYXRbbl0pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1TG9uZyBjcmMzMl9jb21iaW5lXyhjcmMxLCBjcmMyLCBsZW4yKQorICAgIHVMb25nIGNyYzE7CisgICAgdUxvbmcgY3JjMjsKKyAgICB6X29mZjY0X3QgbGVuMjsKK3sKKyAgICBpbnQgbjsKKyAgICB1bnNpZ25lZCBsb25nIHJvdzsKKyAgICB1bnNpZ25lZCBsb25nIGV2ZW5bR0YyX0RJTV07ICAgIC8qIGV2ZW4tcG93ZXItb2YtdHdvIHplcm9zIG9wZXJhdG9yICovCisgICAgdW5zaWduZWQgbG9uZyBvZGRbR0YyX0RJTV07ICAgICAvKiBvZGQtcG93ZXItb2YtdHdvIHplcm9zIG9wZXJhdG9yICovCisKKyAgICAvKiBkZWdlbmVyYXRlIGNhc2UgKGFsc28gZGlzYWxsb3cgbmVnYXRpdmUgbGVuZ3RocykgKi8KKyAgICBpZiAobGVuMiA8PSAwKQorICAgICAgICByZXR1cm4gY3JjMTsKKworICAgIC8qIHB1dCBvcGVyYXRvciBmb3Igb25lIHplcm8gYml0IGluIG9kZCAqLworICAgIG9kZFswXSA9IDB4ZWRiODgzMjBVTDsgICAgICAgICAgLyogQ1JDLTMyIHBvbHlub21pYWwgKi8KKyAgICByb3cgPSAxOworICAgIGZvciAobiA9IDE7IG4gPCBHRjJfRElNOyBuKyspIHsKKyAgICAgICAgb2RkW25dID0gcm93OworICAgICAgICByb3cgPDw9IDE7CisgICAgfQorCisgICAgLyogcHV0IG9wZXJhdG9yIGZvciB0d28gemVybyBiaXRzIGluIGV2ZW4gKi8KKyAgICBnZjJfbWF0cml4X3NxdWFyZShldmVuLCBvZGQpOworCisgICAgLyogcHV0IG9wZXJhdG9yIGZvciBmb3VyIHplcm8gYml0cyBpbiBvZGQgKi8KKyAgICBnZjJfbWF0cml4X3NxdWFyZShvZGQsIGV2ZW4pOworCisgICAgLyogYXBwbHkgbGVuMiB6ZXJvcyB0byBjcmMxIChmaXJzdCBzcXVhcmUgd2lsbCBwdXQgdGhlIG9wZXJhdG9yIGZvciBvbmUKKyAgICAgICB6ZXJvIGJ5dGUsIGVpZ2h0IHplcm8gYml0cywgaW4gZXZlbikgKi8KKyAgICBkbyB7CisgICAgICAgIC8qIGFwcGx5IHplcm9zIG9wZXJhdG9yIGZvciB0aGlzIGJpdCBvZiBsZW4yICovCisgICAgICAgIGdmMl9tYXRyaXhfc3F1YXJlKGV2ZW4sIG9kZCk7CisgICAgICAgIGlmIChsZW4yICYgMSkKKyAgICAgICAgICAgIGNyYzEgPSBnZjJfbWF0cml4X3RpbWVzKGV2ZW4sIGNyYzEpOworICAgICAgICBsZW4yID4+PSAxOworCisgICAgICAgIC8qIGlmIG5vIG1vcmUgYml0cyBzZXQsIHRoZW4gZG9uZSAqLworICAgICAgICBpZiAobGVuMiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogYW5vdGhlciBpdGVyYXRpb24gb2YgdGhlIGxvb3Agd2l0aCBvZGQgYW5kIGV2ZW4gc3dhcHBlZCAqLworICAgICAgICBnZjJfbWF0cml4X3NxdWFyZShvZGQsIGV2ZW4pOworICAgICAgICBpZiAobGVuMiAmIDEpCisgICAgICAgICAgICBjcmMxID0gZ2YyX21hdHJpeF90aW1lcyhvZGQsIGNyYzEpOworICAgICAgICBsZW4yID4+PSAxOworCisgICAgICAgIC8qIGlmIG5vIG1vcmUgYml0cyBzZXQsIHRoZW4gZG9uZSAqLworICAgIH0gd2hpbGUgKGxlbjIgIT0gMCk7CisKKyAgICAvKiByZXR1cm4gY29tYmluZWQgY3JjICovCisgICAgY3JjMSBePSBjcmMyOworICAgIHJldHVybiBjcmMxOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUoY3JjMSwgY3JjMiwgbGVuMikKKyAgICB1TG9uZyBjcmMxOworICAgIHVMb25nIGNyYzI7CisgICAgel9vZmZfdCBsZW4yOworeworICAgIHJldHVybiBjcmMzMl9jb21iaW5lXyhjcmMxLCBjcmMyLCBsZW4yKTsKK30KKwordUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQoY3JjMSwgY3JjMiwgbGVuMikKKyAgICB1TG9uZyBjcmMxOworICAgIHVMb25nIGNyYzI7CisgICAgel9vZmY2NF90IGxlbjI7Cit7CisgICAgcmV0dXJuIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvY3JjMzIuaCBiL2NvbTMyL2xpYi96bGliL2NyYzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1M2I2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL2NyYzMyLmgKQEAgLTAsMCArMSw0NDEgQEAKKy8qIGNyYzMyLmggLS0gdGFibGVzIGZvciByYXBpZCBDUkMgY2FsY3VsYXRpb24KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNyYzMyLmMKKyAqLworCitsb2NhbCBjb25zdCB1bnNpZ25lZCBsb25nIEZBUiBjcmNfdGFibGVbVEJMU11bMjU2XSA9Cit7CisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4NzcwNzMwOTZVTCwgMHhlZTBlNjEyY1VMLCAweDk5MDk1MWJhVUwsIDB4MDc2ZGM0MTlVTCwKKyAgICAweDcwNmFmNDhmVUwsIDB4ZTk2M2E1MzVVTCwgMHg5ZTY0OTVhM1VMLCAweDBlZGI4ODMyVUwsIDB4NzlkY2I4YTRVTCwKKyAgICAweGUwZDVlOTFlVUwsIDB4OTdkMmQ5ODhVTCwgMHgwOWI2NGMyYlVMLCAweDdlYjE3Y2JkVUwsIDB4ZTdiODJkMDdVTCwKKyAgICAweDkwYmYxZDkxVUwsIDB4MWRiNzEwNjRVTCwgMHg2YWIwMjBmMlVMLCAweGYzYjk3MTQ4VUwsIDB4ODRiZTQxZGVVTCwKKyAgICAweDFhZGFkNDdkVUwsIDB4NmRkZGU0ZWJVTCwgMHhmNGQ0YjU1MVVMLCAweDgzZDM4NWM3VUwsIDB4MTM2Yzk4NTZVTCwKKyAgICAweDY0NmJhOGMwVUwsIDB4ZmQ2MmY5N2FVTCwgMHg4YTY1YzllY1VMLCAweDE0MDE1YzRmVUwsIDB4NjMwNjZjZDlVTCwKKyAgICAweGZhMGYzZDYzVUwsIDB4OGQwODBkZjVVTCwgMHgzYjZlMjBjOFVMLCAweDRjNjkxMDVlVUwsIDB4ZDU2MDQxZTRVTCwKKyAgICAweGEyNjc3MTcyVUwsIDB4M2MwM2U0ZDFVTCwgMHg0YjA0ZDQ0N1VMLCAweGQyMGQ4NWZkVUwsIDB4YTUwYWI1NmJVTCwKKyAgICAweDM1YjVhOGZhVUwsIDB4NDJiMjk4NmNVTCwgMHhkYmJiYzlkNlVMLCAweGFjYmNmOTQwVUwsIDB4MzJkODZjZTNVTCwKKyAgICAweDQ1ZGY1Yzc1VUwsIDB4ZGNkNjBkY2ZVTCwgMHhhYmQxM2Q1OVVMLCAweDI2ZDkzMGFjVUwsIDB4NTFkZTAwM2FVTCwKKyAgICAweGM4ZDc1MTgwVUwsIDB4YmZkMDYxMTZVTCwgMHgyMWI0ZjRiNVVMLCAweDU2YjNjNDIzVUwsIDB4Y2ZiYTk1OTlVTCwKKyAgICAweGI4YmRhNTBmVUwsIDB4MjgwMmI4OWVVTCwgMHg1ZjA1ODgwOFVMLCAweGM2MGNkOWIyVUwsIDB4YjEwYmU5MjRVTCwKKyAgICAweDJmNmY3Yzg3VUwsIDB4NTg2ODRjMTFVTCwgMHhjMTYxMWRhYlVMLCAweGI2NjYyZDNkVUwsIDB4NzZkYzQxOTBVTCwKKyAgICAweDAxZGI3MTA2VUwsIDB4OThkMjIwYmNVTCwgMHhlZmQ1MTAyYVVMLCAweDcxYjE4NTg5VUwsIDB4MDZiNmI1MWZVTCwKKyAgICAweDlmYmZlNGE1VUwsIDB4ZThiOGQ0MzNVTCwgMHg3ODA3YzlhMlVMLCAweDBmMDBmOTM0VUwsIDB4OTYwOWE4OGVVTCwKKyAgICAweGUxMGU5ODE4VUwsIDB4N2Y2YTBkYmJVTCwgMHgwODZkM2QyZFVMLCAweDkxNjQ2Yzk3VUwsIDB4ZTY2MzVjMDFVTCwKKyAgICAweDZiNmI1MWY0VUwsIDB4MWM2YzYxNjJVTCwgMHg4NTY1MzBkOFVMLCAweGYyNjIwMDRlVUwsIDB4NmMwNjk1ZWRVTCwKKyAgICAweDFiMDFhNTdiVUwsIDB4ODIwOGY0YzFVTCwgMHhmNTBmYzQ1N1VMLCAweDY1YjBkOWM2VUwsIDB4MTJiN2U5NTBVTCwKKyAgICAweDhiYmViOGVhVUwsIDB4ZmNiOTg4N2NVTCwgMHg2MmRkMWRkZlVMLCAweDE1ZGEyZDQ5VUwsIDB4OGNkMzdjZjNVTCwKKyAgICAweGZiZDQ0YzY1VUwsIDB4NGRiMjYxNThVTCwgMHgzYWI1NTFjZVVMLCAweGEzYmMwMDc0VUwsIDB4ZDRiYjMwZTJVTCwKKyAgICAweDRhZGZhNTQxVUwsIDB4M2RkODk1ZDdVTCwgMHhhNGQxYzQ2ZFVMLCAweGQzZDZmNGZiVUwsIDB4NDM2OWU5NmFVTCwKKyAgICAweDM0NmVkOWZjVUwsIDB4YWQ2Nzg4NDZVTCwgMHhkYTYwYjhkMFVMLCAweDQ0MDQyZDczVUwsIDB4MzMwMzFkZTVVTCwKKyAgICAweGFhMGE0YzVmVUwsIDB4ZGQwZDdjYzlVTCwgMHg1MDA1NzEzY1VMLCAweDI3MDI0MWFhVUwsIDB4YmUwYjEwMTBVTCwKKyAgICAweGM5MGMyMDg2VUwsIDB4NTc2OGI1MjVVTCwgMHgyMDZmODViM1VMLCAweGI5NjZkNDA5VUwsIDB4Y2U2MWU0OWZVTCwKKyAgICAweDVlZGVmOTBlVUwsIDB4MjlkOWM5OThVTCwgMHhiMGQwOTgyMlVMLCAweGM3ZDdhOGI0VUwsIDB4NTliMzNkMTdVTCwKKyAgICAweDJlYjQwZDgxVUwsIDB4YjdiZDVjM2JVTCwgMHhjMGJhNmNhZFVMLCAweGVkYjg4MzIwVUwsIDB4OWFiZmIzYjZVTCwKKyAgICAweDAzYjZlMjBjVUwsIDB4NzRiMWQyOWFVTCwgMHhlYWQ1NDczOVVMLCAweDlkZDI3N2FmVUwsIDB4MDRkYjI2MTVVTCwKKyAgICAweDczZGMxNjgzVUwsIDB4ZTM2MzBiMTJVTCwgMHg5NDY0M2I4NFVMLCAweDBkNmQ2YTNlVUwsIDB4N2E2YTVhYThVTCwKKyAgICAweGU0MGVjZjBiVUwsIDB4OTMwOWZmOWRVTCwgMHgwYTAwYWUyN1VMLCAweDdkMDc5ZWIxVUwsIDB4ZjAwZjkzNDRVTCwKKyAgICAweDg3MDhhM2QyVUwsIDB4MWUwMWYyNjhVTCwgMHg2OTA2YzJmZVVMLCAweGY3NjI1NzVkVUwsIDB4ODA2NTY3Y2JVTCwKKyAgICAweDE5NmMzNjcxVUwsIDB4NmU2YjA2ZTdVTCwgMHhmZWQ0MWI3NlVMLCAweDg5ZDMyYmUwVUwsIDB4MTBkYTdhNWFVTCwKKyAgICAweDY3ZGQ0YWNjVUwsIDB4ZjliOWRmNmZVTCwgMHg4ZWJlZWZmOVVMLCAweDE3YjdiZTQzVUwsIDB4NjBiMDhlZDVVTCwKKyAgICAweGQ2ZDZhM2U4VUwsIDB4YTFkMTkzN2VVTCwgMHgzOGQ4YzJjNFVMLCAweDRmZGZmMjUyVUwsIDB4ZDFiYjY3ZjFVTCwKKyAgICAweGE2YmM1NzY3VUwsIDB4M2ZiNTA2ZGRVTCwgMHg0OGIyMzY0YlVMLCAweGQ4MGQyYmRhVUwsIDB4YWYwYTFiNGNVTCwKKyAgICAweDM2MDM0YWY2VUwsIDB4NDEwNDdhNjBVTCwgMHhkZjYwZWZjM1VMLCAweGE4NjdkZjU1VUwsIDB4MzE2ZThlZWZVTCwKKyAgICAweDQ2NjliZTc5VUwsIDB4Y2I2MWIzOGNVTCwgMHhiYzY2ODMxYVVMLCAweDI1NmZkMmEwVUwsIDB4NTI2OGUyMzZVTCwKKyAgICAweGNjMGM3Nzk1VUwsIDB4YmIwYjQ3MDNVTCwgMHgyMjAyMTZiOVVMLCAweDU1MDUyNjJmVUwsIDB4YzViYTNiYmVVTCwKKyAgICAweGIyYmQwYjI4VUwsIDB4MmJiNDVhOTJVTCwgMHg1Y2IzNmEwNFVMLCAweGMyZDdmZmE3VUwsIDB4YjVkMGNmMzFVTCwKKyAgICAweDJjZDk5ZThiVUwsIDB4NWJkZWFlMWRVTCwgMHg5YjY0YzJiMFVMLCAweGVjNjNmMjI2VUwsIDB4NzU2YWEzOWNVTCwKKyAgICAweDAyNmQ5MzBhVUwsIDB4OWMwOTA2YTlVTCwgMHhlYjBlMzYzZlVMLCAweDcyMDc2Nzg1VUwsIDB4MDUwMDU3MTNVTCwKKyAgICAweDk1YmY0YTgyVUwsIDB4ZTJiODdhMTRVTCwgMHg3YmIxMmJhZVVMLCAweDBjYjYxYjM4VUwsIDB4OTJkMjhlOWJVTCwKKyAgICAweGU1ZDViZTBkVUwsIDB4N2NkY2VmYjdVTCwgMHgwYmRiZGYyMVVMLCAweDg2ZDNkMmQ0VUwsIDB4ZjFkNGUyNDJVTCwKKyAgICAweDY4ZGRiM2Y4VUwsIDB4MWZkYTgzNmVVTCwgMHg4MWJlMTZjZFVMLCAweGY2YjkyNjViVUwsIDB4NmZiMDc3ZTFVTCwKKyAgICAweDE4Yjc0Nzc3VUwsIDB4ODgwODVhZTZVTCwgMHhmZjBmNmE3MFVMLCAweDY2MDYzYmNhVUwsIDB4MTEwMTBiNWNVTCwKKyAgICAweDhmNjU5ZWZmVUwsIDB4Zjg2MmFlNjlVTCwgMHg2MTZiZmZkM1VMLCAweDE2NmNjZjQ1VUwsIDB4YTAwYWUyNzhVTCwKKyAgICAweGQ3MGRkMmVlVUwsIDB4NGUwNDgzNTRVTCwgMHgzOTAzYjNjMlVMLCAweGE3NjcyNjYxVUwsIDB4ZDA2MDE2ZjdVTCwKKyAgICAweDQ5Njk0NzRkVUwsIDB4M2U2ZTc3ZGJVTCwgMHhhZWQxNmE0YVVMLCAweGQ5ZDY1YWRjVUwsIDB4NDBkZjBiNjZVTCwKKyAgICAweDM3ZDgzYmYwVUwsIDB4YTliY2FlNTNVTCwgMHhkZWJiOWVjNVVMLCAweDQ3YjJjZjdmVUwsIDB4MzBiNWZmZTlVTCwKKyAgICAweGJkYmRmMjFjVUwsIDB4Y2FiYWMyOGFVTCwgMHg1M2IzOTMzMFVMLCAweDI0YjRhM2E2VUwsIDB4YmFkMDM2MDVVTCwKKyAgICAweGNkZDcwNjkzVUwsIDB4NTRkZTU3MjlVTCwgMHgyM2Q5NjdiZlVMLCAweGIzNjY3YTJlVUwsIDB4YzQ2MTRhYjhVTCwKKyAgICAweDVkNjgxYjAyVUwsIDB4MmE2ZjJiOTRVTCwgMHhiNDBiYmUzN1VMLCAweGMzMGM4ZWExVUwsIDB4NWEwNWRmMWJVTCwKKyAgICAweDJkMDJlZjhkVUwKKyNpZmRlZiBCWUZPVVIKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHgxOTFiMzE0MVVMLCAweDMyMzY2MjgyVUwsIDB4MmIyZDUzYzNVTCwgMHg2NDZjYzUwNFVMLAorICAgIDB4N2Q3N2Y0NDVVTCwgMHg1NjVhYTc4NlVMLCAweDRmNDE5NmM3VUwsIDB4YzhkOThhMDhVTCwgMHhkMWMyYmI0OVVMLAorICAgIDB4ZmFlZmU4OGFVTCwgMHhlM2Y0ZDljYlVMLCAweGFjYjU0ZjBjVUwsIDB4YjVhZTdlNGRVTCwgMHg5ZTgzMmQ4ZVVMLAorICAgIDB4ODc5ODFjY2ZVTCwgMHg0YWMyMTI1MVVMLCAweDUzZDkyMzEwVUwsIDB4NzhmNDcwZDNVTCwgMHg2MWVmNDE5MlVMLAorICAgIDB4MmVhZWQ3NTVVTCwgMHgzN2I1ZTYxNFVMLCAweDFjOThiNWQ3VUwsIDB4MDU4Mzg0OTZVTCwgMHg4MjFiOTg1OVVMLAorICAgIDB4OWIwMGE5MThVTCwgMHhiMDJkZmFkYlVMLCAweGE5MzZjYjlhVUwsIDB4ZTY3NzVkNWRVTCwgMHhmZjZjNmMxY1VMLAorICAgIDB4ZDQ0MTNmZGZVTCwgMHhjZDVhMGU5ZVVMLCAweDk1ODQyNGEyVUwsIDB4OGM5ZjE1ZTNVTCwgMHhhN2IyNDYyMFVMLAorICAgIDB4YmVhOTc3NjFVTCwgMHhmMWU4ZTFhNlVMLCAweGU4ZjNkMGU3VUwsIDB4YzNkZTgzMjRVTCwgMHhkYWM1YjI2NVVMLAorICAgIDB4NWQ1ZGFlYWFVTCwgMHg0NDQ2OWZlYlVMLCAweDZmNmJjYzI4VUwsIDB4NzY3MGZkNjlVTCwgMHgzOTMxNmJhZVVMLAorICAgIDB4MjAyYTVhZWZVTCwgMHgwYjA3MDkyY1VMLCAweDEyMWMzODZkVUwsIDB4ZGY0NjM2ZjNVTCwgMHhjNjVkMDdiMlVMLAorICAgIDB4ZWQ3MDU0NzFVTCwgMHhmNDZiNjUzMFVMLCAweGJiMmFmM2Y3VUwsIDB4YTIzMWMyYjZVTCwgMHg4OTFjOTE3NVVMLAorICAgIDB4OTAwN2EwMzRVTCwgMHgxNzlmYmNmYlVMLCAweDBlODQ4ZGJhVUwsIDB4MjVhOWRlNzlVTCwgMHgzY2IyZWYzOFVMLAorICAgIDB4NzNmMzc5ZmZVTCwgMHg2YWU4NDhiZVVMLCAweDQxYzUxYjdkVUwsIDB4NThkZTJhM2NVTCwgMHhmMDc5NGYwNVVMLAorICAgIDB4ZTk2MjdlNDRVTCwgMHhjMjRmMmQ4N1VMLCAweGRiNTQxY2M2VUwsIDB4OTQxNThhMDFVTCwgMHg4ZDBlYmI0MFVMLAorICAgIDB4YTYyM2U4ODNVTCwgMHhiZjM4ZDljMlVMLCAweDM4YTBjNTBkVUwsIDB4MjFiYmY0NGNVTCwgMHgwYTk2YTc4ZlVMLAorICAgIDB4MTM4ZDk2Y2VVTCwgMHg1Y2NjMDAwOVVMLCAweDQ1ZDczMTQ4VUwsIDB4NmVmYTYyOGJVTCwgMHg3N2UxNTNjYVVMLAorICAgIDB4YmFiYjVkNTRVTCwgMHhhM2EwNmMxNVVMLCAweDg4OGQzZmQ2VUwsIDB4OTE5NjBlOTdVTCwgMHhkZWQ3OTg1MFVMLAorICAgIDB4YzdjY2E5MTFVTCwgMHhlY2UxZmFkMlVMLCAweGY1ZmFjYjkzVUwsIDB4NzI2MmQ3NWNVTCwgMHg2Yjc5ZTYxZFVMLAorICAgIDB4NDA1NGI1ZGVVTCwgMHg1OTRmODQ5ZlVMLCAweDE2MGUxMjU4VUwsIDB4MGYxNTIzMTlVTCwgMHgyNDM4NzBkYVVMLAorICAgIDB4M2QyMzQxOWJVTCwgMHg2NWZkNmJhN1VMLCAweDdjZTY1YWU2VUwsIDB4NTdjYjA5MjVVTCwgMHg0ZWQwMzg2NFVMLAorICAgIDB4MDE5MWFlYTNVTCwgMHgxODhhOWZlMlVMLCAweDMzYTdjYzIxVUwsIDB4MmFiY2ZkNjBVTCwgMHhhZDI0ZTFhZlVMLAorICAgIDB4YjQzZmQwZWVVTCwgMHg5ZjEyODMyZFVMLCAweDg2MDliMjZjVUwsIDB4Yzk0ODI0YWJVTCwgMHhkMDUzMTVlYVVMLAorICAgIDB4ZmI3ZTQ2MjlVTCwgMHhlMjY1Nzc2OFVMLCAweDJmM2Y3OWY2VUwsIDB4MzYyNDQ4YjdVTCwgMHgxZDA5MWI3NFVMLAorICAgIDB4MDQxMjJhMzVVTCwgMHg0YjUzYmNmMlVMLCAweDUyNDg4ZGIzVUwsIDB4Nzk2NWRlNzBVTCwgMHg2MDdlZWYzMVVMLAorICAgIDB4ZTdlNmYzZmVVTCwgMHhmZWZkYzJiZlVMLCAweGQ1ZDA5MTdjVUwsIDB4Y2NjYmEwM2RVTCwgMHg4MzhhMzZmYVVMLAorICAgIDB4OWE5MTA3YmJVTCwgMHhiMWJjNTQ3OFVMLCAweGE4YTc2NTM5VUwsIDB4M2I4Mzk4NGJVTCwgMHgyMjk4YTkwYVVMLAorICAgIDB4MDliNWZhYzlVTCwgMHgxMGFlY2I4OFVMLCAweDVmZWY1ZDRmVUwsIDB4NDZmNDZjMGVVTCwgMHg2ZGQ5M2ZjZFVMLAorICAgIDB4NzRjMjBlOGNVTCwgMHhmMzVhMTI0M1VMLCAweGVhNDEyMzAyVUwsIDB4YzE2YzcwYzFVTCwgMHhkODc3NDE4MFVMLAorICAgIDB4OTczNmQ3NDdVTCwgMHg4ZTJkZTYwNlVMLCAweGE1MDBiNWM1VUwsIDB4YmMxYjg0ODRVTCwgMHg3MTQxOGExYVVMLAorICAgIDB4Njg1YWJiNWJVTCwgMHg0Mzc3ZTg5OFVMLCAweDVhNmNkOWQ5VUwsIDB4MTUyZDRmMWVVTCwgMHgwYzM2N2U1ZlVMLAorICAgIDB4MjcxYjJkOWNVTCwgMHgzZTAwMWNkZFVMLCAweGI5OTgwMDEyVUwsIDB4YTA4MzMxNTNVTCwgMHg4YmFlNjI5MFVMLAorICAgIDB4OTJiNTUzZDFVTCwgMHhkZGY0YzUxNlVMLCAweGM0ZWZmNDU3VUwsIDB4ZWZjMmE3OTRVTCwgMHhmNmQ5OTZkNVVMLAorICAgIDB4YWUwN2JjZTlVTCwgMHhiNzFjOGRhOFVMLCAweDljMzFkZTZiVUwsIDB4ODUyYWVmMmFVTCwgMHhjYTZiNzllZFVMLAorICAgIDB4ZDM3MDQ4YWNVTCwgMHhmODVkMWI2ZlVMLCAweGUxNDYyYTJlVUwsIDB4NjZkZTM2ZTFVTCwgMHg3ZmM1MDdhMFVMLAorICAgIDB4NTRlODU0NjNVTCwgMHg0ZGYzNjUyMlVMLCAweDAyYjJmM2U1VUwsIDB4MWJhOWMyYTRVTCwgMHgzMDg0OTE2N1VMLAorICAgIDB4Mjk5ZmEwMjZVTCwgMHhlNGM1YWViOFVMLCAweGZkZGU5ZmY5VUwsIDB4ZDZmM2NjM2FVTCwgMHhjZmU4ZmQ3YlVMLAorICAgIDB4ODBhOTZiYmNVTCwgMHg5OWIyNWFmZFVMLCAweGIyOWYwOTNlVUwsIDB4YWI4NDM4N2ZVTCwgMHgyYzFjMjRiMFVMLAorICAgIDB4MzUwNzE1ZjFVTCwgMHgxZTJhNDYzMlVMLCAweDA3MzE3NzczVUwsIDB4NDg3MGUxYjRVTCwgMHg1MTZiZDBmNVVMLAorICAgIDB4N2E0NjgzMzZVTCwgMHg2MzVkYjI3N1VMLCAweGNiZmFkNzRlVUwsIDB4ZDJlMWU2MGZVTCwgMHhmOWNjYjVjY1VMLAorICAgIDB4ZTBkNzg0OGRVTCwgMHhhZjk2MTI0YVVMLCAweGI2OGQyMzBiVUwsIDB4OWRhMDcwYzhVTCwgMHg4NGJiNDE4OVVMLAorICAgIDB4MDMyMzVkNDZVTCwgMHgxYTM4NmMwN1VMLCAweDMxMTUzZmM0VUwsIDB4MjgwZTBlODVVTCwgMHg2NzRmOTg0MlVMLAorICAgIDB4N2U1NGE5MDNVTCwgMHg1NTc5ZmFjMFVMLCAweDRjNjJjYjgxVUwsIDB4ODEzOGM1MWZVTCwgMHg5ODIzZjQ1ZVVMLAorICAgIDB4YjMwZWE3OWRVTCwgMHhhYTE1OTZkY1VMLCAweGU1NTQwMDFiVUwsIDB4ZmM0ZjMxNWFVTCwgMHhkNzYyNjI5OVVMLAorICAgIDB4Y2U3OTUzZDhVTCwgMHg0OWUxNGYxN1VMLCAweDUwZmE3ZTU2VUwsIDB4N2JkNzJkOTVVTCwgMHg2MmNjMWNkNFVMLAorICAgIDB4MmQ4ZDhhMTNVTCwgMHgzNDk2YmI1MlVMLCAweDFmYmJlODkxVUwsIDB4MDZhMGQ5ZDBVTCwgMHg1ZTdlZjNlY1VMLAorICAgIDB4NDc2NWMyYWRVTCwgMHg2YzQ4OTE2ZVVMLCAweDc1NTNhMDJmVUwsIDB4M2ExMjM2ZThVTCwgMHgyMzA5MDdhOVVMLAorICAgIDB4MDgyNDU0NmFVTCwgMHgxMTNmNjUyYlVMLCAweDk2YTc3OWU0VUwsIDB4OGZiYzQ4YTVVTCwgMHhhNDkxMWI2NlVMLAorICAgIDB4YmQ4YTJhMjdVTCwgMHhmMmNiYmNlMFVMLCAweGViZDA4ZGExVUwsIDB4YzBmZGRlNjJVTCwgMHhkOWU2ZWYyM1VMLAorICAgIDB4MTRiY2UxYmRVTCwgMHgwZGE3ZDBmY1VMLCAweDI2OGE4MzNmVUwsIDB4M2Y5MWIyN2VVTCwgMHg3MGQwMjRiOVVMLAorICAgIDB4NjljYjE1ZjhVTCwgMHg0MmU2NDYzYlVMLCAweDViZmQ3NzdhVUwsIDB4ZGM2NTZiYjVVTCwgMHhjNTdlNWFmNFVMLAorICAgIDB4ZWU1MzA5MzdVTCwgMHhmNzQ4Mzg3NlVMLCAweGI4MDlhZWIxVUwsIDB4YTExMjlmZjBVTCwgMHg4YTNmY2MzM1VMLAorICAgIDB4OTMyNGZkNzJVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDAxYzI2YTM3VUwsIDB4MDM4NGQ0NmVVTCwgMHgwMjQ2YmU1OVVMLCAweDA3MDlhOGRjVUwsCisgICAgMHgwNmNiYzJlYlVMLCAweDA0OGQ3Y2IyVUwsIDB4MDU0ZjE2ODVVTCwgMHgwZTEzNTFiOFVMLCAweDBmZDEzYjhmVUwsCisgICAgMHgwZDk3ODVkNlVMLCAweDBjNTVlZmUxVUwsIDB4MDkxYWY5NjRVTCwgMHgwOGQ4OTM1M1VMLCAweDBhOWUyZDBhVUwsCisgICAgMHgwYjVjNDczZFVMLCAweDFjMjZhMzcwVUwsIDB4MWRlNGM5NDdVTCwgMHgxZmEyNzcxZVVMLCAweDFlNjAxZDI5VUwsCisgICAgMHgxYjJmMGJhY1VMLCAweDFhZWQ2MTliVUwsIDB4MThhYmRmYzJVTCwgMHgxOTY5YjVmNVVMLCAweDEyMzVmMmM4VUwsCisgICAgMHgxM2Y3OThmZlVMLCAweDExYjEyNmE2VUwsIDB4MTA3MzRjOTFVTCwgMHgxNTNjNWExNFVMLCAweDE0ZmUzMDIzVUwsCisgICAgMHgxNmI4OGU3YVVMLCAweDE3N2FlNDRkVUwsIDB4Mzg0ZDQ2ZTBVTCwgMHgzOThmMmNkN1VMLCAweDNiYzk5MjhlVUwsCisgICAgMHgzYTBiZjhiOVVMLCAweDNmNDRlZTNjVUwsIDB4M2U4Njg0MGJVTCwgMHgzY2MwM2E1MlVMLCAweDNkMDI1MDY1VUwsCisgICAgMHgzNjVlMTc1OFVMLCAweDM3OWM3ZDZmVUwsIDB4MzVkYWMzMzZVTCwgMHgzNDE4YTkwMVVMLCAweDMxNTdiZjg0VUwsCisgICAgMHgzMDk1ZDViM1VMLCAweDMyZDM2YmVhVUwsIDB4MzMxMTAxZGRVTCwgMHgyNDZiZTU5MFVMLCAweDI1YTk4ZmE3VUwsCisgICAgMHgyN2VmMzFmZVVMLCAweDI2MmQ1YmM5VUwsIDB4MjM2MjRkNGNVTCwgMHgyMmEwMjc3YlVMLCAweDIwZTY5OTIyVUwsCisgICAgMHgyMTI0ZjMxNVVMLCAweDJhNzhiNDI4VUwsIDB4MmJiYWRlMWZVTCwgMHgyOWZjNjA0NlVMLCAweDI4M2UwYTcxVUwsCisgICAgMHgyZDcxMWNmNFVMLCAweDJjYjM3NmMzVUwsIDB4MmVmNWM4OWFVTCwgMHgyZjM3YTJhZFVMLCAweDcwOWE4ZGMwVUwsCisgICAgMHg3MTU4ZTdmN1VMLCAweDczMWU1OWFlVUwsIDB4NzJkYzMzOTlVTCwgMHg3NzkzMjUxY1VMLCAweDc2NTE0ZjJiVUwsCisgICAgMHg3NDE3ZjE3MlVMLCAweDc1ZDU5YjQ1VUwsIDB4N2U4OWRjNzhVTCwgMHg3ZjRiYjY0ZlVMLCAweDdkMGQwODE2VUwsCisgICAgMHg3Y2NmNjIyMVVMLCAweDc5ODA3NGE0VUwsIDB4Nzg0MjFlOTNVTCwgMHg3YTA0YTBjYVVMLCAweDdiYzZjYWZkVUwsCisgICAgMHg2Y2JjMmViMFVMLCAweDZkN2U0NDg3VUwsIDB4NmYzOGZhZGVVTCwgMHg2ZWZhOTBlOVVMLCAweDZiYjU4NjZjVUwsCisgICAgMHg2YTc3ZWM1YlVMLCAweDY4MzE1MjAyVUwsIDB4NjlmMzM4MzVVTCwgMHg2MmFmN2YwOFVMLCAweDYzNmQxNTNmVUwsCisgICAgMHg2MTJiYWI2NlVMLCAweDYwZTljMTUxVUwsIDB4NjVhNmQ3ZDRVTCwgMHg2NDY0YmRlM1VMLCAweDY2MjIwM2JhVUwsCisgICAgMHg2N2UwNjk4ZFVMLCAweDQ4ZDdjYjIwVUwsIDB4NDkxNWExMTdVTCwgMHg0YjUzMWY0ZVVMLCAweDRhOTE3NTc5VUwsCisgICAgMHg0ZmRlNjNmY1VMLCAweDRlMWMwOWNiVUwsIDB4NGM1YWI3OTJVTCwgMHg0ZDk4ZGRhNVVMLCAweDQ2YzQ5YTk4VUwsCisgICAgMHg0NzA2ZjBhZlVMLCAweDQ1NDA0ZWY2VUwsIDB4NDQ4MjI0YzFVTCwgMHg0MWNkMzI0NFVMLCAweDQwMGY1ODczVUwsCisgICAgMHg0MjQ5ZTYyYVVMLCAweDQzOGI4YzFkVUwsIDB4NTRmMTY4NTBVTCwgMHg1NTMzMDI2N1VMLCAweDU3NzViYzNlVUwsCisgICAgMHg1NmI3ZDYwOVVMLCAweDUzZjhjMDhjVUwsIDB4NTIzYWFhYmJVTCwgMHg1MDdjMTRlMlVMLCAweDUxYmU3ZWQ1VUwsCisgICAgMHg1YWUyMzllOFVMLCAweDViMjA1M2RmVUwsIDB4NTk2NmVkODZVTCwgMHg1OGE0ODdiMVVMLCAweDVkZWI5MTM0VUwsCisgICAgMHg1YzI5ZmIwM1VMLCAweDVlNmY0NTVhVUwsIDB4NWZhZDJmNmRVTCwgMHhlMTM1MWI4MFVMLCAweGUwZjc3MWI3VUwsCisgICAgMHhlMmIxY2ZlZVVMLCAweGUzNzNhNWQ5VUwsIDB4ZTYzY2IzNWNVTCwgMHhlN2ZlZDk2YlVMLCAweGU1Yjg2NzMyVUwsCisgICAgMHhlNDdhMGQwNVVMLCAweGVmMjY0YTM4VUwsIDB4ZWVlNDIwMGZVTCwgMHhlY2EyOWU1NlVMLCAweGVkNjBmNDYxVUwsCisgICAgMHhlODJmZTJlNFVMLCAweGU5ZWQ4OGQzVUwsIDB4ZWJhYjM2OGFVTCwgMHhlYTY5NWNiZFVMLCAweGZkMTNiOGYwVUwsCisgICAgMHhmY2QxZDJjN1VMLCAweGZlOTc2YzllVUwsIDB4ZmY1NTA2YTlVTCwgMHhmYTFhMTAyY1VMLCAweGZiZDg3YTFiVUwsCisgICAgMHhmOTllYzQ0MlVMLCAweGY4NWNhZTc1VUwsIDB4ZjMwMGU5NDhVTCwgMHhmMmMyODM3ZlVMLCAweGYwODQzZDI2VUwsCisgICAgMHhmMTQ2NTcxMVVMLCAweGY0MDk0MTk0VUwsIDB4ZjVjYjJiYTNVTCwgMHhmNzhkOTVmYVVMLCAweGY2NGZmZmNkVUwsCisgICAgMHhkOTc4NWQ2MFVMLCAweGQ4YmEzNzU3VUwsIDB4ZGFmYzg5MGVVTCwgMHhkYjNlZTMzOVVMLCAweGRlNzFmNWJjVUwsCisgICAgMHhkZmIzOWY4YlVMLCAweGRkZjUyMWQyVUwsIDB4ZGMzNzRiZTVVTCwgMHhkNzZiMGNkOFVMLCAweGQ2YTk2NmVmVUwsCisgICAgMHhkNGVmZDhiNlVMLCAweGQ1MmRiMjgxVUwsIDB4ZDA2MmE0MDRVTCwgMHhkMWEwY2UzM1VMLCAweGQzZTY3MDZhVUwsCisgICAgMHhkMjI0MWE1ZFVMLCAweGM1NWVmZTEwVUwsIDB4YzQ5Yzk0MjdVTCwgMHhjNmRhMmE3ZVVMLCAweGM3MTg0MDQ5VUwsCisgICAgMHhjMjU3NTZjY1VMLCAweGMzOTUzY2ZiVUwsIDB4YzFkMzgyYTJVTCwgMHhjMDExZTg5NVVMLCAweGNiNGRhZmE4VUwsCisgICAgMHhjYThmYzU5ZlVMLCAweGM4Yzk3YmM2VUwsIDB4YzkwYjExZjFVTCwgMHhjYzQ0MDc3NFVMLCAweGNkODY2ZDQzVUwsCisgICAgMHhjZmMwZDMxYVVMLCAweGNlMDJiOTJkVUwsIDB4OTFhZjk2NDBVTCwgMHg5MDZkZmM3N1VMLCAweDkyMmI0MjJlVUwsCisgICAgMHg5M2U5MjgxOVVMLCAweDk2YTYzZTljVUwsIDB4OTc2NDU0YWJVTCwgMHg5NTIyZWFmMlVMLCAweDk0ZTA4MGM1VUwsCisgICAgMHg5ZmJjYzdmOFVMLCAweDllN2VhZGNmVUwsIDB4OWMzODEzOTZVTCwgMHg5ZGZhNzlhMVVMLCAweDk4YjU2ZjI0VUwsCisgICAgMHg5OTc3MDUxM1VMLCAweDliMzFiYjRhVUwsIDB4OWFmM2QxN2RVTCwgMHg4ZDg5MzUzMFVMLCAweDhjNGI1ZjA3VUwsCisgICAgMHg4ZTBkZTE1ZVVMLCAweDhmY2Y4YjY5VUwsIDB4OGE4MDlkZWNVTCwgMHg4YjQyZjdkYlVMLCAweDg5MDQ0OTgyVUwsCisgICAgMHg4OGM2MjNiNVVMLCAweDgzOWE2NDg4VUwsIDB4ODI1ODBlYmZVTCwgMHg4MDFlYjBlNlVMLCAweDgxZGNkYWQxVUwsCisgICAgMHg4NDkzY2M1NFVMLCAweDg1NTFhNjYzVUwsIDB4ODcxNzE4M2FVTCwgMHg4NmQ1NzIwZFVMLCAweGE5ZTJkMGEwVUwsCisgICAgMHhhODIwYmE5N1VMLCAweGFhNjYwNGNlVUwsIDB4YWJhNDZlZjlVTCwgMHhhZWViNzg3Y1VMLCAweGFmMjkxMjRiVUwsCisgICAgMHhhZDZmYWMxMlVMLCAweGFjYWRjNjI1VUwsIDB4YTdmMTgxMThVTCwgMHhhNjMzZWIyZlVMLCAweGE0NzU1NTc2VUwsCisgICAgMHhhNWI3M2Y0MVVMLCAweGEwZjgyOWM0VUwsIDB4YTEzYTQzZjNVTCwgMHhhMzdjZmRhYVVMLCAweGEyYmU5NzlkVUwsCisgICAgMHhiNWM0NzNkMFVMLCAweGI0MDYxOWU3VUwsIDB4YjY0MGE3YmVVTCwgMHhiNzgyY2Q4OVVMLCAweGIyY2RkYjBjVUwsCisgICAgMHhiMzBmYjEzYlVMLCAweGIxNDkwZjYyVUwsIDB4YjA4YjY1NTVVTCwgMHhiYmQ3MjI2OFVMLCAweGJhMTU0ODVmVUwsCisgICAgMHhiODUzZjYwNlVMLCAweGI5OTE5YzMxVUwsIDB4YmNkZThhYjRVTCwgMHhiZDFjZTA4M1VMLCAweGJmNWE1ZWRhVUwsCisgICAgMHhiZTk4MzRlZFVMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4YjhiYzY3NjVVTCwgMHhhYTA5Yzg4YlVMLCAweDEyYjVhZmVlVUwsIDB4OGY2Mjk3NTdVTCwKKyAgICAweDM3ZGVmMDMyVUwsIDB4MjU2YjVmZGNVTCwgMHg5ZGQ3MzhiOVVMLCAweGM1YjQyOGVmVUwsIDB4N2QwODRmOGFVTCwKKyAgICAweDZmYmRlMDY0VUwsIDB4ZDcwMTg3MDFVTCwgMHg0YWQ2YmZiOFVMLCAweGYyNmFkOGRkVUwsIDB4ZTBkZjc3MzNVTCwKKyAgICAweDU4NjMxMDU2VUwsIDB4NTAxOTU3OWZVTCwgMHhlOGE1MzBmYVVMLCAweGZhMTA5ZjE0VUwsIDB4NDJhY2Y4NzFVTCwKKyAgICAweGRmN2JjMGM4VUwsIDB4NjdjN2E3YWRVTCwgMHg3NTcyMDg0M1VMLCAweGNkY2U2ZjI2VUwsIDB4OTVhZDdmNzBVTCwKKyAgICAweDJkMTExODE1VUwsIDB4M2ZhNGI3ZmJVTCwgMHg4NzE4ZDA5ZVVMLCAweDFhY2ZlODI3VUwsIDB4YTI3MzhmNDJVTCwKKyAgICAweGIwYzYyMGFjVUwsIDB4MDg3YTQ3YzlVTCwgMHhhMDMyYWYzZVVMLCAweDE4OGVjODViVUwsIDB4MGEzYjY3YjVVTCwKKyAgICAweGIyODcwMGQwVUwsIDB4MmY1MDM4NjlVTCwgMHg5N2VjNWYwY1VMLCAweDg1NTlmMGUyVUwsIDB4M2RlNTk3ODdVTCwKKyAgICAweDY1ODY4N2QxVUwsIDB4ZGQzYWUwYjRVTCwgMHhjZjhmNGY1YVVMLCAweDc3MzMyODNmVUwsIDB4ZWFlNDEwODZVTCwKKyAgICAweDUyNTg3N2UzVUwsIDB4NDBlZGQ4MGRVTCwgMHhmODUxYmY2OFVMLCAweGYwMmJmOGExVUwsIDB4NDg5NzlmYzRVTCwKKyAgICAweDVhMjIzMDJhVUwsIDB4ZTI5ZTU3NGZVTCwgMHg3ZjQ5NmZmNlVMLCAweGM3ZjUwODkzVUwsIDB4ZDU0MGE3N2RVTCwKKyAgICAweDZkZmNjMDE4VUwsIDB4MzU5ZmQwNGVVTCwgMHg4ZDIzYjcyYlVMLCAweDlmOTYxOGM1VUwsIDB4MjcyYTdmYTBVTCwKKyAgICAweGJhZmQ0NzE5VUwsIDB4MDI0MTIwN2NVTCwgMHgxMGY0OGY5MlVMLCAweGE4NDhlOGY3VUwsIDB4OWIxNDU4M2RVTCwKKyAgICAweDIzYTgzZjU4VUwsIDB4MzExZDkwYjZVTCwgMHg4OWExZjdkM1VMLCAweDE0NzZjZjZhVUwsIDB4YWNjYWE4MGZVTCwKKyAgICAweGJlN2YwN2UxVUwsIDB4MDZjMzYwODRVTCwgMHg1ZWEwNzBkMlVMLCAweGU2MWMxN2I3VUwsIDB4ZjRhOWI4NTlVTCwKKyAgICAweDRjMTVkZjNjVUwsIDB4ZDFjMmU3ODVVTCwgMHg2OTdlODBlMFVMLCAweDdiY2IyZjBlVUwsIDB4YzM3NzQ4NmJVTCwKKyAgICAweGNiMGQwZmEyVUwsIDB4NzNiMTY4YzdVTCwgMHg2MTA0YzcyOVVMLCAweGQ5YjhhMDRjVUwsIDB4NDQ2Zjk4ZjVVTCwKKyAgICAweGZjZDNmZjkwVUwsIDB4ZWU2NjUwN2VVTCwgMHg1NmRhMzcxYlVMLCAweDBlYjkyNzRkVUwsIDB4YjYwNTQwMjhVTCwKKyAgICAweGE0YjBlZmM2VUwsIDB4MWMwYzg4YTNVTCwgMHg4MWRiYjAxYVVMLCAweDM5NjdkNzdmVUwsIDB4MmJkMjc4OTFVTCwKKyAgICAweDkzNmUxZmY0VUwsIDB4M2IyNmY3MDNVTCwgMHg4MzlhOTA2NlVMLCAweDkxMmYzZjg4VUwsIDB4Mjk5MzU4ZWRVTCwKKyAgICAweGI0NDQ2MDU0VUwsIDB4MGNmODA3MzFVTCwgMHgxZTRkYThkZlVMLCAweGE2ZjFjZmJhVUwsIDB4ZmU5MmRmZWNVTCwKKyAgICAweDQ2MmViODg5VUwsIDB4NTQ5YjE3NjdVTCwgMHhlYzI3NzAwMlVMLCAweDcxZjA0OGJiVUwsIDB4Yzk0YzJmZGVVTCwKKyAgICAweGRiZjk4MDMwVUwsIDB4NjM0NWU3NTVVTCwgMHg2YjNmYTA5Y1VMLCAweGQzODNjN2Y5VUwsIDB4YzEzNjY4MTdVTCwKKyAgICAweDc5OGEwZjcyVUwsIDB4ZTQ1ZDM3Y2JVTCwgMHg1Y2UxNTBhZVVMLCAweDRlNTRmZjQwVUwsIDB4ZjZlODk4MjVVTCwKKyAgICAweGFlOGI4ODczVUwsIDB4MTYzN2VmMTZVTCwgMHgwNDgyNDBmOFVMLCAweGJjM2UyNzlkVUwsIDB4MjFlOTFmMjRVTCwKKyAgICAweDk5NTU3ODQxVUwsIDB4OGJlMGQ3YWZVTCwgMHgzMzVjYjBjYVVMLCAweGVkNTliNjNiVUwsIDB4NTVlNWQxNWVVTCwKKyAgICAweDQ3NTA3ZWIwVUwsIDB4ZmZlYzE5ZDVVTCwgMHg2MjNiMjE2Y1VMLCAweGRhODc0NjA5VUwsIDB4YzgzMmU5ZTdVTCwKKyAgICAweDcwOGU4ZTgyVUwsIDB4MjhlZDllZDRVTCwgMHg5MDUxZjliMVVMLCAweDgyZTQ1NjVmVUwsIDB4M2E1ODMxM2FVTCwKKyAgICAweGE3OGYwOTgzVUwsIDB4MWYzMzZlZTZVTCwgMHgwZDg2YzEwOFVMLCAweGI1M2FhNjZkVUwsIDB4YmQ0MGUxYTRVTCwKKyAgICAweDA1ZmM4NmMxVUwsIDB4MTc0OTI5MmZVTCwgMHhhZmY1NGU0YVVMLCAweDMyMjI3NmYzVUwsIDB4OGE5ZTExOTZVTCwKKyAgICAweDk4MmJiZTc4VUwsIDB4MjA5N2Q5MWRVTCwgMHg3OGY0Yzk0YlVMLCAweGMwNDhhZTJlVUwsIDB4ZDJmZDAxYzBVTCwKKyAgICAweDZhNDE2NmE1VUwsIDB4Zjc5NjVlMWNVTCwgMHg0ZjJhMzk3OVVMLCAweDVkOWY5Njk3VUwsIDB4ZTUyM2YxZjJVTCwKKyAgICAweDRkNmIxOTA1VUwsIDB4ZjVkNzdlNjBVTCwgMHhlNzYyZDE4ZVVMLCAweDVmZGViNmViVUwsIDB4YzIwOThlNTJVTCwKKyAgICAweDdhYjVlOTM3VUwsIDB4NjgwMDQ2ZDlVTCwgMHhkMGJjMjFiY1VMLCAweDg4ZGYzMWVhVUwsIDB4MzA2MzU2OGZVTCwKKyAgICAweDIyZDZmOTYxVUwsIDB4OWE2YTllMDRVTCwgMHgwN2JkYTZiZFVMLCAweGJmMDFjMWQ4VUwsIDB4YWRiNDZlMzZVTCwKKyAgICAweDE1MDgwOTUzVUwsIDB4MWQ3MjRlOWFVTCwgMHhhNWNlMjlmZlVMLCAweGI3N2I4NjExVUwsIDB4MGZjN2UxNzRVTCwKKyAgICAweDkyMTBkOWNkVUwsIDB4MmFhY2JlYThVTCwgMHgzODE5MTE0NlVMLCAweDgwYTU3NjIzVUwsIDB4ZDhjNjY2NzVVTCwKKyAgICAweDYwN2EwMTEwVUwsIDB4NzJjZmFlZmVVTCwgMHhjYTczYzk5YlVMLCAweDU3YTRmMTIyVUwsIDB4ZWYxODk2NDdVTCwKKyAgICAweGZkYWQzOWE5VUwsIDB4NDUxMTVlY2NVTCwgMHg3NjRkZWUwNlVMLCAweGNlZjE4OTYzVUwsIDB4ZGM0NDI2OGRVTCwKKyAgICAweDY0Zjg0MWU4VUwsIDB4ZjkyZjc5NTFVTCwgMHg0MTkzMWUzNFVMLCAweDUzMjZiMWRhVUwsIDB4ZWI5YWQ2YmZVTCwKKyAgICAweGIzZjljNmU5VUwsIDB4MGI0NWExOGNVTCwgMHgxOWYwMGU2MlVMLCAweGExNGM2OTA3VUwsIDB4M2M5YjUxYmVVTCwKKyAgICAweDg0MjczNmRiVUwsIDB4OTY5Mjk5MzVVTCwgMHgyZTJlZmU1MFVMLCAweDI2NTRiOTk5VUwsIDB4OWVlOGRlZmNVTCwKKyAgICAweDhjNWQ3MTEyVUwsIDB4MzRlMTE2NzdVTCwgMHhhOTM2MmVjZVVMLCAweDExOGE0OWFiVUwsIDB4MDMzZmU2NDVVTCwKKyAgICAweGJiODM4MTIwVUwsIDB4ZTNlMDkxNzZVTCwgMHg1YjVjZjYxM1VMLCAweDQ5ZTk1OWZkVUwsIDB4ZjE1NTNlOThVTCwKKyAgICAweDZjODIwNjIxVUwsIDB4ZDQzZTYxNDRVTCwgMHhjNjhiY2VhYVVMLCAweDdlMzdhOWNmVUwsIDB4ZDY3ZjQxMzhVTCwKKyAgICAweDZlYzMyNjVkVUwsIDB4N2M3Njg5YjNVTCwgMHhjNGNhZWVkNlVMLCAweDU5MWRkNjZmVUwsIDB4ZTFhMWIxMGFVTCwKKyAgICAweGYzMTQxZWU0VUwsIDB4NGJhODc5ODFVTCwgMHgxM2NiNjlkN1VMLCAweGFiNzcwZWIyVUwsIDB4YjljMmExNWNVTCwKKyAgICAweDAxN2VjNjM5VUwsIDB4OWNhOWZlODBVTCwgMHgyNDE1OTllNVVMLCAweDM2YTAzNjBiVUwsIDB4OGUxYzUxNmVVTCwKKyAgICAweDg2NjYxNmE3VUwsIDB4M2VkYTcxYzJVTCwgMHgyYzZmZGUyY1VMLCAweDk0ZDNiOTQ5VUwsIDB4MDkwNDgxZjBVTCwKKyAgICAweGIxYjhlNjk1VUwsIDB4YTMwZDQ5N2JVTCwgMHgxYmIxMmUxZVVMLCAweDQzZDIzZTQ4VUwsIDB4ZmI2ZTU5MmRVTCwKKyAgICAweGU5ZGJmNmMzVUwsIDB4NTE2NzkxYTZVTCwgMHhjY2IwYTkxZlVMLCAweDc0MGNjZTdhVUwsIDB4NjZiOTYxOTRVTCwKKyAgICAweGRlMDUwNmYxVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHg5NjMwMDc3N1VMLCAweDJjNjEwZWVlVUwsIDB4YmE1MTA5OTlVTCwgMHgxOWM0NmQwN1VMLAorICAgIDB4OGZmNDZhNzBVTCwgMHgzNWE1NjNlOVVMLCAweGEzOTU2NDllVUwsIDB4MzI4OGRiMGVVTCwgMHhhNGI4ZGM3OVVMLAorICAgIDB4MWVlOWQ1ZTBVTCwgMHg4OGQ5ZDI5N1VMLCAweDJiNGNiNjA5VUwsIDB4YmQ3Y2IxN2VVTCwgMHgwNzJkYjhlN1VMLAorICAgIDB4OTExZGJmOTBVTCwgMHg2NDEwYjcxZFVMLCAweGYyMjBiMDZhVUwsIDB4NDg3MWI5ZjNVTCwgMHhkZTQxYmU4NFVMLAorICAgIDB4N2RkNGRhMWFVTCwgMHhlYmU0ZGQ2ZFVMLCAweDUxYjVkNGY0VUwsIDB4Yzc4NWQzODNVTCwgMHg1Njk4NmMxM1VMLAorICAgIDB4YzBhODZiNjRVTCwgMHg3YWY5NjJmZFVMLCAweGVjYzk2NThhVUwsIDB4NGY1YzAxMTRVTCwgMHhkOTZjMDY2M1VMLAorICAgIDB4NjMzZDBmZmFVTCwgMHhmNTBkMDg4ZFVMLCAweGM4MjA2ZTNiVUwsIDB4NWUxMDY5NGNVTCwgMHhlNDQxNjBkNVVMLAorICAgIDB4NzI3MTY3YTJVTCwgMHhkMWU0MDMzY1VMLCAweDQ3ZDQwNDRiVUwsIDB4ZmQ4NTBkZDJVTCwgMHg2YmI1MGFhNVVMLAorICAgIDB4ZmFhOGI1MzVVTCwgMHg2Yzk4YjI0MlVMLCAweGQ2YzliYmRiVUwsIDB4NDBmOWJjYWNVTCwgMHhlMzZjZDgzMlVMLAorICAgIDB4NzU1Y2RmNDVVTCwgMHhjZjBkZDZkY1VMLCAweDU5M2RkMWFiVUwsIDB4YWMzMGQ5MjZVTCwgMHgzYTAwZGU1MVVMLAorICAgIDB4ODA1MWQ3YzhVTCwgMHgxNjYxZDBiZlVMLCAweGI1ZjRiNDIxVUwsIDB4MjNjNGIzNTZVTCwgMHg5OTk1YmFjZlVMLAorICAgIDB4MGZhNWJkYjhVTCwgMHg5ZWI4MDIyOFVMLCAweDA4ODgwNTVmVUwsIDB4YjJkOTBjYzZVTCwgMHgyNGU5MGJiMVVMLAorICAgIDB4ODc3YzZmMmZVTCwgMHgxMTRjNjg1OFVMLCAweGFiMWQ2MWMxVUwsIDB4M2QyZDY2YjZVTCwgMHg5MDQxZGM3NlVMLAorICAgIDB4MDY3MWRiMDFVTCwgMHhiYzIwZDI5OFVMLCAweDJhMTBkNWVmVUwsIDB4ODk4NWIxNzFVTCwgMHgxZmI1YjYwNlVMLAorICAgIDB4YTVlNGJmOWZVTCwgMHgzM2Q0YjhlOFVMLCAweGEyYzkwNzc4VUwsIDB4MzRmOTAwMGZVTCwgMHg4ZWE4MDk5NlVMLAorICAgIDB4MTg5ODBlZTFVTCwgMHhiYjBkNmE3ZlVMLCAweDJkM2Q2ZDA4VUwsIDB4OTc2YzY0OTFVTCwgMHgwMTVjNjNlNlVMLAorICAgIDB4ZjQ1MTZiNmJVTCwgMHg2MjYxNmMxY1VMLCAweGQ4MzA2NTg1VUwsIDB4NGUwMDYyZjJVTCwgMHhlZDk1MDY2Y1VMLAorICAgIDB4N2JhNTAxMWJVTCwgMHhjMWY0MDg4MlVMLCAweDU3YzQwZmY1VUwsIDB4YzZkOWIwNjVVTCwgMHg1MGU5YjcxMlVMLAorICAgIDB4ZWFiOGJlOGJVTCwgMHg3Yzg4YjlmY1VMLCAweGRmMWRkZDYyVUwsIDB4NDkyZGRhMTVVTCwgMHhmMzdjZDM4Y1VMLAorICAgIDB4NjU0Y2Q0ZmJVTCwgMHg1ODYxYjI0ZFVMLCAweGNlNTFiNTNhVUwsIDB4NzQwMGJjYTNVTCwgMHhlMjMwYmJkNFVMLAorICAgIDB4NDFhNWRmNGFVTCwgMHhkNzk1ZDgzZFVMLCAweDZkYzRkMWE0VUwsIDB4ZmJmNGQ2ZDNVTCwgMHg2YWU5Njk0M1VMLAorICAgIDB4ZmNkOTZlMzRVTCwgMHg0Njg4NjdhZFVMLCAweGQwYjg2MGRhVUwsIDB4NzMyZDA0NDRVTCwgMHhlNTFkMDMzM1VMLAorICAgIDB4NWY0YzBhYWFVTCwgMHhjOTdjMGRkZFVMLCAweDNjNzEwNTUwVUwsIDB4YWE0MTAyMjdVTCwgMHgxMDEwMGJiZVVMLAorICAgIDB4ODYyMDBjYzlVTCwgMHgyNWI1Njg1N1VMLCAweGIzODU2ZjIwVUwsIDB4MDlkNDY2YjlVTCwgMHg5ZmU0NjFjZVVMLAorICAgIDB4MGVmOWRlNWVVTCwgMHg5OGM5ZDkyOVVMLCAweDIyOThkMGIwVUwsIDB4YjRhOGQ3YzdVTCwgMHgxNzNkYjM1OVVMLAorICAgIDB4ODEwZGI0MmVVTCwgMHgzYjVjYmRiN1VMLCAweGFkNmNiYWMwVUwsIDB4MjA4M2I4ZWRVTCwgMHhiNmIzYmY5YVVMLAorICAgIDB4MGNlMmI2MDNVTCwgMHg5YWQyYjE3NFVMLCAweDM5NDdkNWVhVUwsIDB4YWY3N2QyOWRVTCwgMHgxNTI2ZGIwNFVMLAorICAgIDB4ODMxNmRjNzNVTCwgMHgxMjBiNjNlM1VMLCAweDg0M2I2NDk0VUwsIDB4M2U2YTZkMGRVTCwgMHhhODVhNmE3YVVMLAorICAgIDB4MGJjZjBlZTRVTCwgMHg5ZGZmMDk5M1VMLCAweDI3YWUwMDBhVUwsIDB4YjE5ZTA3N2RVTCwgMHg0NDkzMGZmMFVMLAorICAgIDB4ZDJhMzA4ODdVTCwgMHg2OGYyMDExZVVMLCAweGZlYzIwNjY5VUwsIDB4NWQ1NzYyZjdVTCwgMHhjYjY3NjU4MFVMLAorICAgIDB4NzEzNjZjMTlVTCwgMHhlNzA2NmI2ZVVMLCAweDc2MWJkNGZlVUwsIDB4ZTAyYmQzODlVTCwgMHg1YTdhZGExMFVMLAorICAgIDB4Y2M0YWRkNjdVTCwgMHg2ZmRmYjlmOVVMLCAweGY5ZWZiZThlVUwsIDB4NDNiZWI3MTdVTCwgMHhkNThlYjA2MFVMLAorICAgIDB4ZThhM2Q2ZDZVTCwgMHg3ZTkzZDFhMVVMLCAweGM0YzJkODM4VUwsIDB4NTJmMmRmNGZVTCwgMHhmMTY3YmJkMVVMLAorICAgIDB4Njc1N2JjYTZVTCwgMHhkZDA2YjUzZlVMLCAweDRiMzZiMjQ4VUwsIDB4ZGEyYjBkZDhVTCwgMHg0YzFiMGFhZlVMLAorICAgIDB4ZjY0YTAzMzZVTCwgMHg2MDdhMDQ0MVVMLCAweGMzZWY2MGRmVUwsIDB4NTVkZjY3YThVTCwgMHhlZjhlNmUzMVVMLAorICAgIDB4NzliZTY5NDZVTCwgMHg4Y2IzNjFjYlVMLCAweDFhODM2NmJjVUwsIDB4YTBkMjZmMjVVTCwgMHgzNmUyNjg1MlVMLAorICAgIDB4OTU3NzBjY2NVTCwgMHgwMzQ3MGJiYlVMLCAweGI5MTYwMjIyVUwsIDB4MmYyNjA1NTVVTCwgMHhiZTNiYmFjNVVMLAorICAgIDB4MjgwYmJkYjJVTCwgMHg5MjVhYjQyYlVMLCAweDA0NmFiMzVjVUwsIDB4YTdmZmQ3YzJVTCwgMHgzMWNmZDBiNVVMLAorICAgIDB4OGI5ZWQ5MmNVTCwgMHgxZGFlZGU1YlVMLCAweGIwYzI2NDliVUwsIDB4MjZmMjYzZWNVTCwgMHg5Y2EzNmE3NVVMLAorICAgIDB4MGE5MzZkMDJVTCwgMHhhOTA2MDk5Y1VMLCAweDNmMzYwZWViVUwsIDB4ODU2NzA3NzJVTCwgMHgxMzU3MDAwNVVMLAorICAgIDB4ODI0YWJmOTVVTCwgMHgxNDdhYjhlMlVMLCAweGFlMmJiMTdiVUwsIDB4MzgxYmI2MGNVTCwgMHg5YjhlZDI5MlVMLAorICAgIDB4MGRiZWQ1ZTVVTCwgMHhiN2VmZGM3Y1VMLCAweDIxZGZkYjBiVUwsIDB4ZDRkMmQzODZVTCwgMHg0MmUyZDRmMVVMLAorICAgIDB4ZjhiM2RkNjhVTCwgMHg2ZTgzZGExZlVMLCAweGNkMTZiZTgxVUwsIDB4NWIyNmI5ZjZVTCwgMHhlMTc3YjA2ZlVMLAorICAgIDB4Nzc0N2I3MThVTCwgMHhlNjVhMDg4OFVMLCAweDcwNmEwZmZmVUwsIDB4Y2EzYjA2NjZVTCwgMHg1YzBiMDExMVVMLAorICAgIDB4ZmY5ZTY1OGZVTCwgMHg2OWFlNjJmOFVMLCAweGQzZmY2YjYxVUwsIDB4NDVjZjZjMTZVTCwgMHg3OGUyMGFhMFVMLAorICAgIDB4ZWVkMjBkZDdVTCwgMHg1NDgzMDQ0ZVVMLCAweGMyYjMwMzM5VUwsIDB4NjEyNjY3YTdVTCwgMHhmNzE2NjBkMFVMLAorICAgIDB4NGQ0NzY5NDlVTCwgMHhkYjc3NmUzZVVMLCAweDRhNmFkMWFlVUwsIDB4ZGM1YWQ2ZDlVTCwgMHg2NjBiZGY0MFVMLAorICAgIDB4ZjAzYmQ4MzdVTCwgMHg1M2FlYmNhOVVMLCAweGM1OWViYmRlVUwsIDB4N2ZjZmIyNDdVTCwgMHhlOWZmYjUzMFVMLAorICAgIDB4MWNmMmJkYmRVTCwgMHg4YWMyYmFjYVVMLCAweDMwOTNiMzUzVUwsIDB4YTZhM2I0MjRVTCwgMHgwNTM2ZDBiYVVMLAorICAgIDB4OTMwNmQ3Y2RVTCwgMHgyOTU3ZGU1NFVMLCAweGJmNjdkOTIzVUwsIDB4MmU3YTY2YjNVTCwgMHhiODRhNjFjNFVMLAorICAgIDB4MDIxYjY4NWRVTCwgMHg5NDJiNmYyYVVMLCAweDM3YmUwYmI0VUwsIDB4YTE4ZTBjYzNVTCwgMHgxYmRmMDU1YVVMLAorICAgIDB4OGRlZjAyMmRVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDQxMzExYjE5VUwsIDB4ODI2MjM2MzJVTCwgMHhjMzUzMmQyYlVMLCAweDA0YzU2YzY0VUwsCisgICAgMHg0NWY0Nzc3ZFVMLCAweDg2YTc1YTU2VUwsIDB4Yzc5NjQxNGZVTCwgMHgwODhhZDljOFVMLCAweDQ5YmJjMmQxVUwsCisgICAgMHg4YWU4ZWZmYVVMLCAweGNiZDlmNGUzVUwsIDB4MGM0ZmI1YWNVTCwgMHg0ZDdlYWViNVVMLCAweDhlMmQ4MzllVUwsCisgICAgMHhjZjFjOTg4N1VMLCAweDUxMTJjMjRhVUwsIDB4MTAyM2Q5NTNVTCwgMHhkMzcwZjQ3OFVMLCAweDkyNDFlZjYxVUwsCisgICAgMHg1NWQ3YWUyZVVMLCAweDE0ZTZiNTM3VUwsIDB4ZDdiNTk4MWNVTCwgMHg5Njg0ODMwNVVMLCAweDU5OTgxYjgyVUwsCisgICAgMHgxOGE5MDA5YlVMLCAweGRiZmEyZGIwVUwsIDB4OWFjYjM2YTlVTCwgMHg1ZDVkNzdlNlVMLCAweDFjNmM2Y2ZmVUwsCisgICAgMHhkZjNmNDFkNFVMLCAweDllMGU1YWNkVUwsIDB4YTIyNDg0OTVVTCwgMHhlMzE1OWY4Y1VMLCAweDIwNDZiMmE3VUwsCisgICAgMHg2MTc3YTliZVVMLCAweGE2ZTFlOGYxVUwsIDB4ZTdkMGYzZThVTCwgMHgyNDgzZGVjM1VMLCAweDY1YjJjNWRhVUwsCisgICAgMHhhYWFlNWQ1ZFVMLCAweGViOWY0NjQ0VUwsIDB4MjhjYzZiNmZVTCwgMHg2OWZkNzA3NlVMLCAweGFlNmIzMTM5VUwsCisgICAgMHhlZjVhMmEyMFVMLCAweDJjMDkwNzBiVUwsIDB4NmQzODFjMTJVTCwgMHhmMzM2NDZkZlVMLCAweGIyMDc1ZGM2VUwsCisgICAgMHg3MTU0NzBlZFVMLCAweDMwNjU2YmY0VUwsIDB4ZjdmMzJhYmJVTCwgMHhiNmMyMzFhMlVMLCAweDc1OTExYzg5VUwsCisgICAgMHgzNGEwMDc5MFVMLCAweGZiYmM5ZjE3VUwsIDB4YmE4ZDg0MGVVTCwgMHg3OWRlYTkyNVVMLCAweDM4ZWZiMjNjVUwsCisgICAgMHhmZjc5ZjM3M1VMLCAweGJlNDhlODZhVUwsIDB4N2QxYmM1NDFVTCwgMHgzYzJhZGU1OFVMLCAweDA1NGY3OWYwVUwsCisgICAgMHg0NDdlNjJlOVVMLCAweDg3MmQ0ZmMyVUwsIDB4YzYxYzU0ZGJVTCwgMHgwMThhMTU5NFVMLCAweDQwYmIwZThkVUwsCisgICAgMHg4M2U4MjNhNlVMLCAweGMyZDkzOGJmVUwsIDB4MGRjNWEwMzhVTCwgMHg0Y2Y0YmIyMVVMLCAweDhmYTc5NjBhVUwsCisgICAgMHhjZTk2OGQxM1VMLCAweDA5MDBjYzVjVUwsIDB4NDgzMWQ3NDVVTCwgMHg4YjYyZmE2ZVVMLCAweGNhNTNlMTc3VUwsCisgICAgMHg1NDVkYmJiYVVMLCAweDE1NmNhMGEzVUwsIDB4ZDYzZjhkODhVTCwgMHg5NzBlOTY5MVVMLCAweDUwOThkN2RlVUwsCisgICAgMHgxMWE5Y2NjN1VMLCAweGQyZmFlMWVjVUwsIDB4OTNjYmZhZjVVTCwgMHg1Y2Q3NjI3MlVMLCAweDFkZTY3OTZiVUwsCisgICAgMHhkZWI1NTQ0MFVMLCAweDlmODQ0ZjU5VUwsIDB4NTgxMjBlMTZVTCwgMHgxOTIzMTUwZlVMLCAweGRhNzAzODI0VUwsCisgICAgMHg5YjQxMjMzZFVMLCAweGE3NmJmZDY1VUwsIDB4ZTY1YWU2N2NVTCwgMHgyNTA5Y2I1N1VMLCAweDY0MzhkMDRlVUwsCisgICAgMHhhM2FlOTEwMVVMLCAweGUyOWY4YTE4VUwsIDB4MjFjY2E3MzNVTCwgMHg2MGZkYmMyYVVMLCAweGFmZTEyNGFkVUwsCisgICAgMHhlZWQwM2ZiNFVMLCAweDJkODMxMjlmVUwsIDB4NmNiMjA5ODZVTCwgMHhhYjI0NDhjOVVMLCAweGVhMTU1M2QwVUwsCisgICAgMHgyOTQ2N2VmYlVMLCAweDY4Nzc2NWUyVUwsIDB4ZjY3OTNmMmZVTCwgMHhiNzQ4MjQzNlVMLCAweDc0MWIwOTFkVUwsCisgICAgMHgzNTJhMTIwNFVMLCAweGYyYmM1MzRiVUwsIDB4YjM4ZDQ4NTJVTCwgMHg3MGRlNjU3OVVMLCAweDMxZWY3ZTYwVUwsCisgICAgMHhmZWYzZTZlN1VMLCAweGJmYzJmZGZlVUwsIDB4N2M5MWQwZDVVTCwgMHgzZGEwY2JjY1VMLCAweGZhMzY4YTgzVUwsCisgICAgMHhiYjA3OTE5YVVMLCAweDc4NTRiY2IxVUwsIDB4Mzk2NWE3YThVTCwgMHg0Yjk4ODMzYlVMLCAweDBhYTk5ODIyVUwsCisgICAgMHhjOWZhYjUwOVVMLCAweDg4Y2JhZTEwVUwsIDB4NGY1ZGVmNWZVTCwgMHgwZTZjZjQ0NlVMLCAweGNkM2ZkOTZkVUwsCisgICAgMHg4YzBlYzI3NFVMLCAweDQzMTI1YWYzVUwsIDB4MDIyMzQxZWFVTCwgMHhjMTcwNmNjMVVMLCAweDgwNDE3N2Q4VUwsCisgICAgMHg0N2Q3MzY5N1VMLCAweDA2ZTYyZDhlVUwsIDB4YzViNTAwYTVVTCwgMHg4NDg0MWJiY1VMLCAweDFhOGE0MTcxVUwsCisgICAgMHg1YmJiNWE2OFVMLCAweDk4ZTg3NzQzVUwsIDB4ZDlkOTZjNWFVTCwgMHgxZTRmMmQxNVVMLCAweDVmN2UzNjBjVUwsCisgICAgMHg5YzJkMWIyN1VMLCAweGRkMWMwMDNlVUwsIDB4MTIwMDk4YjlVTCwgMHg1MzMxODNhMFVMLCAweDkwNjJhZThiVUwsCisgICAgMHhkMTUzYjU5MlVMLCAweDE2YzVmNGRkVUwsIDB4NTdmNGVmYzRVTCwgMHg5NGE3YzJlZlVMLCAweGQ1OTZkOWY2VUwsCisgICAgMHhlOWJjMDdhZVVMLCAweGE4OGQxY2I3VUwsIDB4NmJkZTMxOWNVTCwgMHgyYWVmMmE4NVVMLCAweGVkNzk2YmNhVUwsCisgICAgMHhhYzQ4NzBkM1VMLCAweDZmMWI1ZGY4VUwsIDB4MmUyYTQ2ZTFVTCwgMHhlMTM2ZGU2NlVMLCAweGEwMDdjNTdmVUwsCisgICAgMHg2MzU0ZTg1NFVMLCAweDIyNjVmMzRkVUwsIDB4ZTVmM2IyMDJVTCwgMHhhNGMyYTkxYlVMLCAweDY3OTE4NDMwVUwsCisgICAgMHgyNmEwOWYyOVVMLCAweGI4YWVjNWU0VUwsIDB4Zjk5ZmRlZmRVTCwgMHgzYWNjZjNkNlVMLCAweDdiZmRlOGNmVUwsCisgICAgMHhiYzZiYTk4MFVMLCAweGZkNWFiMjk5VUwsIDB4M2UwOTlmYjJVTCwgMHg3ZjM4ODRhYlVMLCAweGIwMjQxYzJjVUwsCisgICAgMHhmMTE1MDczNVVMLCAweDMyNDYyYTFlVUwsIDB4NzM3NzMxMDdVTCwgMHhiNGUxNzA0OFVMLCAweGY1ZDA2YjUxVUwsCisgICAgMHgzNjgzNDY3YVVMLCAweDc3YjI1ZDYzVUwsIDB4NGVkN2ZhY2JVTCwgMHgwZmU2ZTFkMlVMLCAweGNjYjVjY2Y5VUwsCisgICAgMHg4ZDg0ZDdlMFVMLCAweDRhMTI5NmFmVUwsIDB4MGIyMzhkYjZVTCwgMHhjODcwYTA5ZFVMLCAweDg5NDFiYjg0VUwsCisgICAgMHg0NjVkMjMwM1VMLCAweDA3NmMzODFhVUwsIDB4YzQzZjE1MzFVTCwgMHg4NTBlMGUyOFVMLCAweDQyOTg0ZjY3VUwsCisgICAgMHgwM2E5NTQ3ZVVMLCAweGMwZmE3OTU1VUwsIDB4ODFjYjYyNGNVTCwgMHgxZmM1Mzg4MVVMLCAweDVlZjQyMzk4VUwsCisgICAgMHg5ZGE3MGViM1VMLCAweGRjOTYxNWFhVUwsIDB4MWIwMDU0ZTVVTCwgMHg1YTMxNGZmY1VMLCAweDk5NjI2MmQ3VUwsCisgICAgMHhkODUzNzljZVVMLCAweDE3NGZlMTQ5VUwsIDB4NTY3ZWZhNTBVTCwgMHg5NTJkZDc3YlVMLCAweGQ0MWNjYzYyVUwsCisgICAgMHgxMzhhOGQyZFVMLCAweDUyYmI5NjM0VUwsIDB4OTFlOGJiMWZVTCwgMHhkMGQ5YTAwNlVMLCAweGVjZjM3ZTVlVUwsCisgICAgMHhhZGMyNjU0N1VMLCAweDZlOTE0ODZjVUwsIDB4MmZhMDUzNzVVTCwgMHhlODM2MTIzYVVMLCAweGE5MDcwOTIzVUwsCisgICAgMHg2YTU0MjQwOFVMLCAweDJiNjUzZjExVUwsIDB4ZTQ3OWE3OTZVTCwgMHhhNTQ4YmM4ZlVMLCAweDY2MWI5MWE0VUwsCisgICAgMHgyNzJhOGFiZFVMLCAweGUwYmNjYmYyVUwsIDB4YTE4ZGQwZWJVTCwgMHg2MmRlZmRjMFVMLCAweDIzZWZlNmQ5VUwsCisgICAgMHhiZGUxYmMxNFVMLCAweGZjZDBhNzBkVUwsIDB4M2Y4MzhhMjZVTCwgMHg3ZWIyOTEzZlVMLCAweGI5MjRkMDcwVUwsCisgICAgMHhmODE1Y2I2OVVMLCAweDNiNDZlNjQyVUwsIDB4N2E3N2ZkNWJVTCwgMHhiNTZiNjVkY1VMLCAweGY0NWE3ZWM1VUwsCisgICAgMHgzNzA5NTNlZVVMLCAweDc2Mzg0OGY3VUwsIDB4YjFhZTA5YjhVTCwgMHhmMDlmMTJhMVVMLCAweDMzY2MzZjhhVUwsCisgICAgMHg3MmZkMjQ5M1VMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4Mzc2YWMyMDFVTCwgMHg2ZWQ0ODQwM1VMLCAweDU5YmU0NjAyVUwsIDB4ZGNhODA5MDdVTCwKKyAgICAweGViYzJjYjA2VUwsIDB4YjI3YzhkMDRVTCwgMHg4NTE2NGYwNVVMLCAweGI4NTExMzBlVUwsIDB4OGYzYmQxMGZVTCwKKyAgICAweGQ2ODU5NzBkVUwsIDB4ZTFlZjU1MGNVTCwgMHg2NGY5MWEwOVVMLCAweDUzOTNkODA4VUwsIDB4MGEyZDllMGFVTCwKKyAgICAweDNkNDc1YzBiVUwsIDB4NzBhMzI2MWNVTCwgMHg0N2M5ZTQxZFVMLCAweDFlNzdhMjFmVUwsIDB4MjkxZDYwMWVVTCwKKyAgICAweGFjMGIyZjFiVUwsIDB4OWI2MWVkMWFVTCwgMHhjMmRmYWIxOFVMLCAweGY1YjU2OTE5VUwsIDB4YzhmMjM1MTJVTCwKKyAgICAweGZmOThmNzEzVUwsIDB4YTYyNmIxMTFVTCwgMHg5MTRjNzMxMFVMLCAweDE0NWEzYzE1VUwsIDB4MjMzMGZlMTRVTCwKKyAgICAweDdhOGViODE2VUwsIDB4NGRlNDdhMTdVTCwgMHhlMDQ2NGQzOFVMLCAweGQ3MmM4ZjM5VUwsIDB4OGU5MmM5M2JVTCwKKyAgICAweGI5ZjgwYjNhVUwsIDB4M2NlZTQ0M2ZVTCwgMHgwYjg0ODYzZVVMLCAweDUyM2FjMDNjVUwsIDB4NjU1MDAyM2RVTCwKKyAgICAweDU4MTc1ZTM2VUwsIDB4NmY3ZDljMzdVTCwgMHgzNmMzZGEzNVVMLCAweDAxYTkxODM0VUwsIDB4ODRiZjU3MzFVTCwKKyAgICAweGIzZDU5NTMwVUwsIDB4ZWE2YmQzMzJVTCwgMHhkZDAxMTEzM1VMLCAweDkwZTU2YjI0VUwsIDB4YTc4ZmE5MjVVTCwKKyAgICAweGZlMzFlZjI3VUwsIDB4Yzk1YjJkMjZVTCwgMHg0YzRkNjIyM1VMLCAweDdiMjdhMDIyVUwsIDB4MjI5OWU2MjBVTCwKKyAgICAweDE1ZjMyNDIxVUwsIDB4MjhiNDc4MmFVTCwgMHgxZmRlYmEyYlVMLCAweDQ2NjBmYzI5VUwsIDB4NzEwYTNlMjhVTCwKKyAgICAweGY0MWM3MTJkVUwsIDB4YzM3NmIzMmNVTCwgMHg5YWM4ZjUyZVVMLCAweGFkYTIzNzJmVUwsIDB4YzA4ZDlhNzBVTCwKKyAgICAweGY3ZTc1ODcxVUwsIDB4YWU1OTFlNzNVTCwgMHg5OTMzZGM3MlVMLCAweDFjMjU5Mzc3VUwsIDB4MmI0ZjUxNzZVTCwKKyAgICAweDcyZjExNzc0VUwsIDB4NDU5YmQ1NzVVTCwgMHg3OGRjODk3ZVVMLCAweDRmYjY0YjdmVUwsIDB4MTYwODBkN2RVTCwKKyAgICAweDIxNjJjZjdjVUwsIDB4YTQ3NDgwNzlVTCwgMHg5MzFlNDI3OFVMLCAweGNhYTAwNDdhVUwsIDB4ZmRjYWM2N2JVTCwKKyAgICAweGIwMmViYzZjVUwsIDB4ODc0NDdlNmRVTCwgMHhkZWZhMzg2ZlVMLCAweGU5OTBmYTZlVUwsIDB4NmM4NmI1NmJVTCwKKyAgICAweDViZWM3NzZhVUwsIDB4MDI1MjMxNjhVTCwgMHgzNTM4ZjM2OVVMLCAweDA4N2ZhZjYyVUwsIDB4M2YxNTZkNjNVTCwKKyAgICAweDY2YWIyYjYxVUwsIDB4NTFjMWU5NjBVTCwgMHhkNGQ3YTY2NVVMLCAweGUzYmQ2NDY0VUwsIDB4YmEwMzIyNjZVTCwKKyAgICAweDhkNjllMDY3VUwsIDB4MjBjYmQ3NDhVTCwgMHgxN2ExMTU0OVVMLCAweDRlMWY1MzRiVUwsIDB4Nzk3NTkxNGFVTCwKKyAgICAweGZjNjNkZTRmVUwsIDB4Y2IwOTFjNGVVTCwgMHg5MmI3NWE0Y1VMLCAweGE1ZGQ5ODRkVUwsIDB4OTg5YWM0NDZVTCwKKyAgICAweGFmZjAwNjQ3VUwsIDB4ZjY0ZTQwNDVVTCwgMHhjMTI0ODI0NFVMLCAweDQ0MzJjZDQxVUwsIDB4NzM1ODBmNDBVTCwKKyAgICAweDJhZTY0OTQyVUwsIDB4MWQ4YzhiNDNVTCwgMHg1MDY4ZjE1NFVMLCAweDY3MDIzMzU1VUwsIDB4M2ViYzc1NTdVTCwKKyAgICAweDA5ZDZiNzU2VUwsIDB4OGNjMGY4NTNVTCwgMHhiYmFhM2E1MlVMLCAweGUyMTQ3YzUwVUwsIDB4ZDU3ZWJlNTFVTCwKKyAgICAweGU4MzllMjVhVUwsIDB4ZGY1MzIwNWJVTCwgMHg4NmVkNjY1OVVMLCAweGIxODdhNDU4VUwsIDB4MzQ5MWViNWRVTCwKKyAgICAweDAzZmIyOTVjVUwsIDB4NWE0NTZmNWVVTCwgMHg2ZDJmYWQ1ZlVMLCAweDgwMWIzNWUxVUwsIDB4Yjc3MWY3ZTBVTCwKKyAgICAweGVlY2ZiMWUyVUwsIDB4ZDlhNTczZTNVTCwgMHg1Y2IzM2NlNlVMLCAweDZiZDlmZWU3VUwsIDB4MzI2N2I4ZTVVTCwKKyAgICAweDA1MGQ3YWU0VUwsIDB4Mzg0YTI2ZWZVTCwgMHgwZjIwZTRlZVVMLCAweDU2OWVhMmVjVUwsIDB4NjFmNDYwZWRVTCwKKyAgICAweGU0ZTIyZmU4VUwsIDB4ZDM4OGVkZTlVTCwgMHg4YTM2YWJlYlVMLCAweGJkNWM2OWVhVUwsIDB4ZjBiODEzZmRVTCwKKyAgICAweGM3ZDJkMWZjVUwsIDB4OWU2Yzk3ZmVVTCwgMHhhOTA2NTVmZlVMLCAweDJjMTAxYWZhVUwsIDB4MWI3YWQ4ZmJVTCwKKyAgICAweDQyYzQ5ZWY5VUwsIDB4NzVhZTVjZjhVTCwgMHg0OGU5MDBmM1VMLCAweDdmODNjMmYyVUwsIDB4MjYzZDg0ZjBVTCwKKyAgICAweDExNTc0NmYxVUwsIDB4OTQ0MTA5ZjRVTCwgMHhhMzJiY2JmNVVMLCAweGZhOTU4ZGY3VUwsIDB4Y2RmZjRmZjZVTCwKKyAgICAweDYwNWQ3OGQ5VUwsIDB4NTczN2JhZDhVTCwgMHgwZTg5ZmNkYVVMLCAweDM5ZTMzZWRiVUwsIDB4YmNmNTcxZGVVTCwKKyAgICAweDhiOWZiM2RmVUwsIDB4ZDIyMWY1ZGRVTCwgMHhlNTRiMzdkY1VMLCAweGQ4MGM2YmQ3VUwsIDB4ZWY2NmE5ZDZVTCwKKyAgICAweGI2ZDhlZmQ0VUwsIDB4ODFiMjJkZDVVTCwgMHgwNGE0NjJkMFVMLCAweDMzY2VhMGQxVUwsIDB4NmE3MGU2ZDNVTCwKKyAgICAweDVkMWEyNGQyVUwsIDB4MTBmZTVlYzVVTCwgMHgyNzk0OWNjNFVMLCAweDdlMmFkYWM2VUwsIDB4NDk0MDE4YzdVTCwKKyAgICAweGNjNTY1N2MyVUwsIDB4ZmIzYzk1YzNVTCwgMHhhMjgyZDNjMVVMLCAweDk1ZTgxMWMwVUwsIDB4YThhZjRkY2JVTCwKKyAgICAweDlmYzU4ZmNhVUwsIDB4YzY3YmM5YzhVTCwgMHhmMTExMGJjOVVMLCAweDc0MDc0NGNjVUwsIDB4NDM2ZDg2Y2RVTCwKKyAgICAweDFhZDNjMGNmVUwsIDB4MmRiOTAyY2VVTCwgMHg0MDk2YWY5MVVMLCAweDc3ZmM2ZDkwVUwsIDB4MmU0MjJiOTJVTCwKKyAgICAweDE5MjhlOTkzVUwsIDB4OWMzZWE2OTZVTCwgMHhhYjU0NjQ5N1VMLCAweGYyZWEyMjk1VUwsIDB4YzU4MGUwOTRVTCwKKyAgICAweGY4YzdiYzlmVUwsIDB4Y2ZhZDdlOWVVTCwgMHg5NjEzMzg5Y1VMLCAweGExNzlmYTlkVUwsIDB4MjQ2ZmI1OThVTCwKKyAgICAweDEzMDU3Nzk5VUwsIDB4NGFiYjMxOWJVTCwgMHg3ZGQxZjM5YVVMLCAweDMwMzU4OThkVUwsIDB4MDc1ZjRiOGNVTCwKKyAgICAweDVlZTEwZDhlVUwsIDB4Njk4YmNmOGZVTCwgMHhlYzlkODA4YVVMLCAweGRiZjc0MjhiVUwsIDB4ODI0OTA0ODlVTCwKKyAgICAweGI1MjNjNjg4VUwsIDB4ODg2NDlhODNVTCwgMHhiZjBlNTg4MlVMLCAweGU2YjAxZTgwVUwsIDB4ZDFkYWRjODFVTCwKKyAgICAweDU0Y2M5Mzg0VUwsIDB4NjNhNjUxODVVTCwgMHgzYTE4MTc4N1VMLCAweDBkNzJkNTg2VUwsIDB4YTBkMGUyYTlVTCwKKyAgICAweDk3YmEyMGE4VUwsIDB4Y2UwNDY2YWFVTCwgMHhmOTZlYTRhYlVMLCAweDdjNzhlYmFlVUwsIDB4NGIxMjI5YWZVTCwKKyAgICAweDEyYWM2ZmFkVUwsIDB4MjVjNmFkYWNVTCwgMHgxODgxZjFhN1VMLCAweDJmZWIzM2E2VUwsIDB4NzY1NTc1YTRVTCwKKyAgICAweDQxM2ZiN2E1VUwsIDB4YzQyOWY4YTBVTCwgMHhmMzQzM2FhMVVMLCAweGFhZmQ3Y2EzVUwsIDB4OWQ5N2JlYTJVTCwKKyAgICAweGQwNzNjNGI1VUwsIDB4ZTcxOTA2YjRVTCwgMHhiZWE3NDBiNlVMLCAweDg5Y2Q4MmI3VUwsIDB4MGNkYmNkYjJVTCwKKyAgICAweDNiYjEwZmIzVUwsIDB4NjIwZjQ5YjFVTCwgMHg1NTY1OGJiMFVMLCAweDY4MjJkN2JiVUwsIDB4NWY0ODE1YmFVTCwKKyAgICAweDA2ZjY1M2I4VUwsIDB4MzE5YzkxYjlVTCwgMHhiNDhhZGViY1VMLCAweDgzZTAxY2JkVUwsIDB4ZGE1ZTVhYmZVTCwKKyAgICAweGVkMzQ5OGJlVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHg2NTY3YmNiOFVMLCAweDhiYzgwOWFhVUwsIDB4ZWVhZmI1MTJVTCwgMHg1Nzk3NjI4ZlVMLAorICAgIDB4MzJmMGRlMzdVTCwgMHhkYzVmNmIyNVVMLCAweGI5MzhkNzlkVUwsIDB4ZWYyOGI0YzVVTCwgMHg4YTRmMDg3ZFVMLAorICAgIDB4NjRlMGJkNmZVTCwgMHgwMTg3MDFkN1VMLCAweGI4YmZkNjRhVUwsIDB4ZGRkODZhZjJVTCwgMHgzMzc3ZGZlMFVMLAorICAgIDB4NTYxMDYzNThVTCwgMHg5ZjU3MTk1MFVMLCAweGZhMzBhNWU4VUwsIDB4MTQ5ZjEwZmFVTCwgMHg3MWY4YWM0MlVMLAorICAgIDB4YzhjMDdiZGZVTCwgMHhhZGE3Yzc2N1VMLCAweDQzMDg3Mjc1VUwsIDB4MjY2ZmNlY2RVTCwgMHg3MDdmYWQ5NVVMLAorICAgIDB4MTUxODExMmRVTCwgMHhmYmI3YTQzZlVMLCAweDllZDAxODg3VUwsIDB4MjdlOGNmMWFVTCwgMHg0MjhmNzNhMlVMLAorICAgIDB4YWMyMGM2YjBVTCwgMHhjOTQ3N2EwOFVMLCAweDNlYWYzMmEwVUwsIDB4NWJjODhlMThVTCwgMHhiNTY3M2IwYVVMLAorICAgIDB4ZDAwMDg3YjJVTCwgMHg2OTM4NTAyZlVMLCAweDBjNWZlYzk3VUwsIDB4ZTJmMDU5ODVVTCwgMHg4Nzk3ZTUzZFVMLAorICAgIDB4ZDE4Nzg2NjVVTCwgMHhiNGUwM2FkZFVMLCAweDVhNGY4ZmNmVUwsIDB4M2YyODMzNzdVTCwgMHg4NjEwZTRlYVVMLAorICAgIDB4ZTM3NzU4NTJVTCwgMHgwZGQ4ZWQ0MFVMLCAweDY4YmY1MWY4VUwsIDB4YTFmODJiZjBVTCwgMHhjNDlmOTc0OFVMLAorICAgIDB4MmEzMDIyNWFVTCwgMHg0ZjU3OWVlMlVMLCAweGY2NmY0OTdmVUwsIDB4OTMwOGY1YzdVTCwgMHg3ZGE3NDBkNVVMLAorICAgIDB4MThjMGZjNmRVTCwgMHg0ZWQwOWYzNVVMLCAweDJiYjcyMzhkVUwsIDB4YzUxODk2OWZVTCwgMHhhMDdmMmEyN1VMLAorICAgIDB4MTk0N2ZkYmFVTCwgMHg3YzIwNDEwMlVMLCAweDkyOGZmNDEwVUwsIDB4ZjdlODQ4YThVTCwgMHgzZDU4MTQ5YlVMLAorICAgIDB4NTgzZmE4MjNVTCwgMHhiNjkwMWQzMVVMLCAweGQzZjdhMTg5VUwsIDB4NmFjZjc2MTRVTCwgMHgwZmE4Y2FhY1VMLAorICAgIDB4ZTEwNzdmYmVVTCwgMHg4NDYwYzMwNlVMLCAweGQyNzBhMDVlVUwsIDB4YjcxNzFjZTZVTCwgMHg1OWI4YTlmNFVMLAorICAgIDB4M2NkZjE1NGNVTCwgMHg4NWU3YzJkMVVMLCAweGUwODA3ZTY5VUwsIDB4MGUyZmNiN2JVTCwgMHg2YjQ4NzdjM1VMLAorICAgIDB4YTIwZjBkY2JVTCwgMHhjNzY4YjE3M1VMLCAweDI5YzcwNDYxVUwsIDB4NGNhMGI4ZDlVTCwgMHhmNTk4NmY0NFVMLAorICAgIDB4OTBmZmQzZmNVTCwgMHg3ZTUwNjZlZVVMLCAweDFiMzdkYTU2VUwsIDB4NGQyN2I5MGVVTCwgMHgyODQwMDViNlVMLAorICAgIDB4YzZlZmIwYTRVTCwgMHhhMzg4MGMxY1VMLCAweDFhYjBkYjgxVUwsIDB4N2ZkNzY3MzlVTCwgMHg5MTc4ZDIyYlVMLAorICAgIDB4ZjQxZjZlOTNVTCwgMHgwM2Y3MjYzYlVMLCAweDY2OTA5YTgzVUwsIDB4ODgzZjJmOTFVTCwgMHhlZDU4OTMyOVVMLAorICAgIDB4NTQ2MDQ0YjRVTCwgMHgzMTA3ZjgwY1VMLCAweGRmYTg0ZDFlVUwsIDB4YmFjZmYxYTZVTCwgMHhlY2RmOTJmZVVMLAorICAgIDB4ODliODJlNDZVTCwgMHg2NzE3OWI1NFVMLCAweDAyNzAyN2VjVUwsIDB4YmI0OGYwNzFVTCwgMHhkZTJmNGNjOVVMLAorICAgIDB4MzA4MGY5ZGJVTCwgMHg1NWU3NDU2M1VMLCAweDljYTAzZjZiVUwsIDB4ZjljNzgzZDNVTCwgMHgxNzY4MzZjMVVMLAorICAgIDB4NzIwZjhhNzlVTCwgMHhjYjM3NWRlNFVMLCAweGFlNTBlMTVjVUwsIDB4NDBmZjU0NGVVTCwgMHgyNTk4ZThmNlVMLAorICAgIDB4NzM4ODhiYWVVTCwgMHgxNmVmMzcxNlVMLCAweGY4NDA4MjA0VUwsIDB4OWQyNzNlYmNVTCwgMHgyNDFmZTkyMVVMLAorICAgIDB4NDE3ODU1OTlVTCwgMHhhZmQ3ZTA4YlVMLCAweGNhYjA1YzMzVUwsIDB4M2JiNjU5ZWRVTCwgMHg1ZWQxZTU1NVVMLAorICAgIDB4YjA3ZTUwNDdVTCwgMHhkNTE5ZWNmZlVMLCAweDZjMjEzYjYyVUwsIDB4MDk0Njg3ZGFVTCwgMHhlN2U5MzJjOFVMLAorICAgIDB4ODI4ZThlNzBVTCwgMHhkNDllZWQyOFVMLCAweGIxZjk1MTkwVUwsIDB4NWY1NmU0ODJVTCwgMHgzYTMxNTgzYVVMLAorICAgIDB4ODMwOThmYTdVTCwgMHhlNjZlMzMxZlVMLCAweDA4YzE4NjBkVUwsIDB4NmRhNjNhYjVVTCwgMHhhNGUxNDBiZFVMLAorICAgIDB4YzE4NmZjMDVVTCwgMHgyZjI5NDkxN1VMLCAweDRhNGVmNWFmVUwsIDB4ZjM3NjIyMzJVTCwgMHg5NjExOWU4YVVMLAorICAgIDB4NzhiZTJiOThVTCwgMHgxZGQ5OTcyMFVMLCAweDRiYzlmNDc4VUwsIDB4MmVhZTQ4YzBVTCwgMHhjMDAxZmRkMlVMLAorICAgIDB4YTU2NjQxNmFVTCwgMHgxYzVlOTZmN1VMLCAweDc5MzkyYTRmVUwsIDB4OTc5NjlmNWRVTCwgMHhmMmYxMjNlNVVMLAorICAgIDB4MDUxOTZiNGRVTCwgMHg2MDdlZDdmNVVMLCAweDhlZDE2MmU3VUwsIDB4ZWJiNmRlNWZVTCwgMHg1MjhlMDljMlVMLAorICAgIDB4MzdlOWI1N2FVTCwgMHhkOTQ2MDA2OFVMLCAweGJjMjFiY2QwVUwsIDB4ZWEzMWRmODhVTCwgMHg4ZjU2NjMzMFVMLAorICAgIDB4NjFmOWQ2MjJVTCwgMHgwNDllNmE5YVVMLCAweGJkYTZiZDA3VUwsIDB4ZDhjMTAxYmZVTCwgMHgzNjZlYjRhZFVMLAorICAgIDB4NTMwOTA4MTVVTCwgMHg5YTRlNzIxZFVMLCAweGZmMjljZWE1VUwsIDB4MTE4NjdiYjdVTCwgMHg3NGUxYzcwZlVMLAorICAgIDB4Y2RkOTEwOTJVTCwgMHhhOGJlYWMyYVVMLCAweDQ2MTExOTM4VUwsIDB4MjM3NmE1ODBVTCwgMHg3NTY2YzZkOFVMLAorICAgIDB4MTAwMTdhNjBVTCwgMHhmZWFlY2Y3MlVMLCAweDliYzk3M2NhVUwsIDB4MjJmMWE0NTdVTCwgMHg0Nzk2MThlZlVMLAorICAgIDB4YTkzOWFkZmRVTCwgMHhjYzVlMTE0NVVMLCAweDA2ZWU0ZDc2VUwsIDB4NjM4OWYxY2VVTCwgMHg4ZDI2NDRkY1VMLAorICAgIDB4ZTg0MWY4NjRVTCwgMHg1MTc5MmZmOVVMLCAweDM0MWU5MzQxVUwsIDB4ZGFiMTI2NTNVTCwgMHhiZmQ2OWFlYlVMLAorICAgIDB4ZTljNmY5YjNVTCwgMHg4Y2ExNDUwYlVMLCAweDYyMGVmMDE5VUwsIDB4MDc2OTRjYTFVTCwgMHhiZTUxOWIzY1VMLAorICAgIDB4ZGIzNjI3ODRVTCwgMHgzNTk5OTI5NlVMLCAweDUwZmUyZTJlVUwsIDB4OTliOTU0MjZVTCwgMHhmY2RlZTg5ZVVMLAorICAgIDB4MTI3MTVkOGNVTCwgMHg3NzE2ZTEzNFVMLCAweGNlMmUzNmE5VUwsIDB4YWI0OThhMTFVTCwgMHg0NWU2M2YwM1VMLAorICAgIDB4MjA4MTgzYmJVTCwgMHg3NjkxZTBlM1VMLCAweDEzZjY1YzViVUwsIDB4ZmQ1OWU5NDlVTCwgMHg5ODNlNTVmMVVMLAorICAgIDB4MjEwNjgyNmNVTCwgMHg0NDYxM2VkNFVMLCAweGFhY2U4YmM2VUwsIDB4Y2ZhOTM3N2VVTCwgMHgzODQxN2ZkNlVMLAorICAgIDB4NWQyNmMzNmVVTCwgMHhiMzg5NzY3Y1VMLCAweGQ2ZWVjYWM0VUwsIDB4NmZkNjFkNTlVTCwgMHgwYWIxYTFlMVVMLAorICAgIDB4ZTQxZTE0ZjNVTCwgMHg4MTc5YTg0YlVMLCAweGQ3NjljYjEzVUwsIDB4YjIwZTc3YWJVTCwgMHg1Y2ExYzJiOVVMLAorICAgIDB4MzljNjdlMDFVTCwgMHg4MGZlYTk5Y1VMLCAweGU1OTkxNTI0VUwsIDB4MGIzNmEwMzZVTCwgMHg2ZTUxMWM4ZVVMLAorICAgIDB4YTcxNjY2ODZVTCwgMHhjMjcxZGEzZVVMLCAweDJjZGU2ZjJjVUwsIDB4NDliOWQzOTRVTCwgMHhmMDgxMDQwOVVMLAorICAgIDB4OTVlNmI4YjFVTCwgMHg3YjQ5MGRhM1VMLCAweDFlMmViMTFiVUwsIDB4NDgzZWQyNDNVTCwgMHgyZDU5NmVmYlVMLAorICAgIDB4YzNmNmRiZTlVTCwgMHhhNjkxNjc1MVVMLCAweDFmYTliMGNjVUwsIDB4N2FjZTBjNzRVTCwgMHg5NDYxYjk2NlVMLAorICAgIDB4ZjEwNjA1ZGVVTAorI2VuZGlmCisgIH0KK307CmRpZmYgLS1naXQgYS9jb20zMi9saWIvemxpYi9kZWZsYXRlLmMgYi9jb20zMi9saWIvemxpYi9kZWZsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzNzU2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL2RlZmxhdGUuYwpAQCAtMCwwICsxLDE4MzQgQEAKKy8qIGRlZmxhdGUuYyAtLSBjb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMCBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqICBBTEdPUklUSE0KKyAqCisgKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIGRlcGVuZHMgb24gYmVpbmcgYWJsZSB0byBpZGVudGlmeSBwb3J0aW9ucworICogICAgICBvZiB0aGUgaW5wdXQgdGV4dCB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIGVhcmxpZXIgaW5wdXQgKHdpdGhpbiBhCisgKiAgICAgIHNsaWRpbmcgd2luZG93IHRyYWlsaW5nIGJlaGluZCB0aGUgaW5wdXQgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCkuCisgKgorICogICAgICBUaGUgbW9zdCBzdHJhaWdodGZvcndhcmQgdGVjaG5pcXVlIHR1cm5zIG91dCB0byBiZSB0aGUgZmFzdGVzdCBmb3IKKyAqICAgICAgbW9zdCBpbnB1dCBmaWxlczogdHJ5IGFsbCBwb3NzaWJsZSBtYXRjaGVzIGFuZCBzZWxlY3QgdGhlIGxvbmdlc3QuCisgKiAgICAgIFRoZSBrZXkgZmVhdHVyZSBvZiB0aGlzIGFsZ29yaXRobSBpcyB0aGF0IGluc2VydGlvbnMgaW50byB0aGUgc3RyaW5nCisgKiAgICAgIGRpY3Rpb25hcnkgYXJlIHZlcnkgc2ltcGxlIGFuZCB0aHVzIGZhc3QsIGFuZCBkZWxldGlvbnMgYXJlIGF2b2lkZWQKKyAqICAgICAgY29tcGxldGVseS4gSW5zZXJ0aW9ucyBhcmUgcGVyZm9ybWVkIGF0IGVhY2ggaW5wdXQgY2hhcmFjdGVyLCB3aGVyZWFzCisgKiAgICAgIHN0cmluZyBtYXRjaGVzIGFyZSBwZXJmb3JtZWQgb25seSB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBlbmRzLiBTbyBpdAorICogICAgICBpcyBwcmVmZXJhYmxlIHRvIHNwZW5kIG1vcmUgdGltZSBpbiBtYXRjaGVzIHRvIGFsbG93IHZlcnkgZmFzdCBzdHJpbmcKKyAqICAgICAgaW5zZXJ0aW9ucyBhbmQgYXZvaWQgZGVsZXRpb25zLiBUaGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGZvciBzbWFsbAorICogICAgICBzdHJpbmdzIGlzIGluc3BpcmVkIGZyb20gdGhhdCBvZiBSYWJpbiAmIEthcnAuIEEgYnJ1dGUgZm9yY2UgYXBwcm9hY2gKKyAqICAgICAgaXMgdXNlZCB0byBmaW5kIGxvbmdlciBzdHJpbmdzIHdoZW4gYSBzbWFsbCBtYXRjaCBoYXMgYmVlbiBmb3VuZC4KKyAqICAgICAgQSBzaW1pbGFyIGFsZ29yaXRobSBpcyB1c2VkIGluIGNvbWljIChieSBKYW4tTWFyayBXYW1zKSBhbmQgZnJlZXplCisgKiAgICAgIChieSBMZW9uaWQgQnJvdWtoaXMpLgorICogICAgICAgICBBIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVzZWQgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgYWxnb3JpdGhtCisgKiAgICAgIChieSBGaWFsYSBhbmQgR3JlZW5lKSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiBsaW5lYXIgYW1vcnRpemVkCisgKiAgICAgIHRpbWUsIGJ1dCBoYXMgYSBsYXJnZXIgYXZlcmFnZSBjb3N0LCB1c2VzIG1vcmUgbWVtb3J5IGFuZCBpcyBwYXRlbnRlZC4KKyAqICAgICAgSG93ZXZlciB0aGUgRiZHIGFsZ29yaXRobSBtYXkgYmUgZmFzdGVyIGZvciBzb21lIGhpZ2hseSByZWR1bmRhbnQKKyAqICAgICAgZmlsZXMgaWYgdGhlIHBhcmFtZXRlciBtYXhfY2hhaW5fbGVuZ3RoIChkZXNjcmliZWQgYmVsb3cpIGlzIHRvbyBsYXJnZS4KKyAqCisgKiAgQUNLTk9XTEVER0VNRU5UUworICoKKyAqICAgICAgVGhlIGlkZWEgb2YgbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgaXMgZHVlIHRvIEphbi1NYXJrIFdhbXMsIGFuZAorICogICAgICBJIGZvdW5kIGl0IGluICdmcmVlemUnIHdyaXR0ZW4gYnkgTGVvbmlkIEJyb3VraGlzLgorICogICAgICBUaGFua3MgdG8gbWFueSBwZW9wbGUgZm9yIGJ1ZyByZXBvcnRzIGFuZCB0ZXN0aW5nLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKgorICogICAgICBEZXV0c2NoLCBMLlAuLCJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIuCisgKiAgICAgIEF2YWlsYWJsZSBpbiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUxLnR4dAorICoKKyAqICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGUgUmFiaW4gYW5kIEthcnAgYWxnb3JpdGhtIGlzIGdpdmVuIGluIHRoZSBib29rCisgKiAgICAgICAgICJBbGdvcml0aG1zIiBieSBSLiBTZWRnZXdpY2ssIEFkZGlzb24tV2VzbGV5LCBwMjUyLgorICoKKyAqICAgICAgRmlhbGEsRS5SLiwgYW5kIEdyZWVuZSxELkguCisgKiAgICAgICAgIERhdGEgQ29tcHJlc3Npb24gd2l0aCBGaW5pdGUgV2luZG93cywgQ29tbS5BQ00sIDMyLDQgKDE5ODkpIDQ5MC01OTUKKyAqCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpbmNsdWRlICJkZWZsYXRlLmgiCisKK2NvbnN0IGNoYXIgZGVmbGF0ZV9jb3B5cmlnaHRbXSA9CisgICAiIGRlZmxhdGUgMS4yLjUgQ29weXJpZ2h0IDE5OTUtMjAxMCBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyICI7CisvKgorICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCisgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKKyAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCisgIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIEZ1bmN0aW9uIHByb3RvdHlwZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgbmVlZF9tb3JlLCAgICAgIC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqLworICAgIGJsb2NrX2RvbmUsICAgICAvKiBibG9jayBmbHVzaCBwZXJmb3JtZWQgKi8KKyAgICBmaW5pc2hfc3RhcnRlZCwgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi8KKyAgICBmaW5pc2hfZG9uZSAgICAgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqLworfSBibG9ja19zdGF0ZTsKKwordHlwZWRlZiBibG9ja19zdGF0ZSAoKmNvbXByZXNzX2Z1bmMpIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKKy8qIENvbXByZXNzaW9uIGZ1bmN0aW9uLiBSZXR1cm5zIHRoZSBibG9jayBzdGF0ZSBhZnRlciB0aGUgY2FsbC4gKi8KKworbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworI2lmbmRlZiBGQVNURVNUCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3cgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7CisjZW5kaWYKK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfcmxlICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfaHVmZiAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKK2xvY2FsIHZvaWQgbG1faW5pdCAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgcHV0U2hvcnRNU0IgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVJbnQgYikpOworbG9jYWwgdm9pZCBmbHVzaF9wZW5kaW5nICBPRigoel9zdHJlYW1wIHN0cm0pKTsKK2xvY2FsIGludCByZWFkX2J1ZiAgICAgICAgT0YoKHpfc3RyZWFtcCBzdHJtLCBCeXRlZiAqYnVmLCB1bnNpZ25lZCBzaXplKSk7CisjaWZkZWYgQVNNVgorICAgICAgdm9pZCBtYXRjaF9pbml0IE9GKCh2b2lkKSk7IC8qIGFzbSBjb2RlIGluaXRpYWxpemF0aW9uICovCisgICAgICB1SW50IGxvbmdlc3RfbWF0Y2ggIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCkpOworI2Vsc2UKK2xvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1pMSUIKK2xvY2FsICB2b2lkIGNoZWNrX21hdGNoIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIHN0YXJ0LCBJUG9zIG1hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpKTsKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExvY2FsIGRhdGEKKyAqLworCisjZGVmaW5lIE5JTCAwCisvKiBUYWlsIG9mIGhhc2ggY2hhaW5zICovCisKKyNpZm5kZWYgVE9PX0ZBUgorIyAgZGVmaW5lIFRPT19GQVIgNDA5NgorI2VuZGlmCisvKiBNYXRjaGVzIG9mIGxlbmd0aCAzIGFyZSBkaXNjYXJkZWQgaWYgdGhlaXIgZGlzdGFuY2UgZXhjZWVkcyBUT09fRkFSICovCisKKy8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvbgorICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvCisgKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmUKKyAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY29uZmlnX3MgeworICAgdXNoIGdvb2RfbGVuZ3RoOyAvKiByZWR1Y2UgbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBtYXhfbGF6eTsgICAgLyogZG8gbm90IHBlcmZvcm0gbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBuaWNlX2xlbmd0aDsgLyogcXVpdCBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBtYXhfY2hhaW47CisgICBjb21wcmVzc19mdW5jIGZ1bmM7Cit9IGNvbmZpZzsKKworI2lmZGVmIEZBU1RFU1QKK2xvY2FsIGNvbnN0IGNvbmZpZyBjb25maWd1cmF0aW9uX3RhYmxlWzJdID0geworLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqLworLyogMCAqLyB7MCwgICAgMCwgIDAsICAgIDAsIGRlZmxhdGVfc3RvcmVkfSwgIC8qIHN0b3JlIG9ubHkgKi8KKy8qIDEgKi8gezQsICAgIDQsICA4LCAgICA0LCBkZWZsYXRlX2Zhc3R9fTsgLyogbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KKyNlbHNlCitsb2NhbCBjb25zdCBjb25maWcgY29uZmlndXJhdGlvbl90YWJsZVsxMF0gPSB7CisvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCisvKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLworLyogMSAqLyB7NCwgICAgNCwgIDgsICAgIDQsIGRlZmxhdGVfZmFzdH0sIC8qIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovCisvKiAyICovIHs0LCAgICA1LCAxNiwgICAgOCwgZGVmbGF0ZV9mYXN0fSwKKy8qIDMgKi8gezQsICAgIDYsIDMyLCAgIDMyLCBkZWZsYXRlX2Zhc3R9LAorCisvKiA0ICovIHs0LCAgICA0LCAxNiwgICAxNiwgZGVmbGF0ZV9zbG93fSwgIC8qIGxhenkgbWF0Y2hlcyAqLworLyogNSAqLyB7OCwgICAxNiwgMzIsICAgMzIsIGRlZmxhdGVfc2xvd30sCisvKiA2ICovIHs4LCAgIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93fSwKKy8qIDcgKi8gezgsICAgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3d9LAorLyogOCAqLyB7MzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3d9LAorLyogOSAqLyB7MzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3d9fTsgLyogbWF4IGNvbXByZXNzaW9uICovCisjZW5kaWYKKworLyogTm90ZTogdGhlIGRlZmxhdGUoKSBjb2RlIHJlcXVpcmVzIG1heF9sYXp5ID49IE1JTl9NQVRDSCBhbmQgbWF4X2NoYWluID49IDQKKyAqIEZvciBkZWZsYXRlX2Zhc3QoKSAobGV2ZWxzIDw9IDMpIGdvb2QgaXMgaWdub3JlZCBhbmQgbGF6eSBoYXMgYSBkaWZmZXJlbnQKKyAqIG1lYW5pbmcuCisgKi8KKworI2RlZmluZSBFUVVBTCAwCisvKiByZXN1bHQgb2YgbWVtY21wIGZvciBlcXVhbCBzdHJpbmdzICovCisKKyNpZm5kZWYgTk9fRFVNTVlfREVDTAorc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBhIGhhc2ggdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgYnl0ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQorICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCisgKi8KKyNkZWZpbmUgVVBEQVRFX0hBU0gocyxoLGMpIChoID0gKCgoaCk8PHMtPmhhc2hfc2hpZnQpIF4gKGMpKSAmIHMtPmhhc2hfbWFzaykKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluc2VydCBzdHJpbmcgc3RyIGluIHRoZSBkaWN0aW9uYXJ5IGFuZCBzZXQgbWF0Y2hfaGVhZCB0byB0aGUgcHJldmlvdXMgaGVhZAorICogb2YgdGhlIGhhc2ggY2hhaW4gKHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgd2l0aCBzYW1lIGhhc2gga2V5KS4gUmV0dXJuCisgKiB0aGUgcHJldmlvdXMgbGVuZ3RoIG9mIHRoZSBoYXNoIGNoYWluLgorICogSWYgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggLURGQVNURVNULCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgZm9yY2VkCisgKiB0byAxLCBhbmQgbm8gaGFzaCBjaGFpbnMgYXJlIG1haW50YWluZWQuCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiAgICBpbnB1dCBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHN0ciBhcmUgdmFsaWQKKyAqICAgIChleGNlcHQgZm9yIHRoZSBsYXN0IE1JTl9NQVRDSC0xIGJ5dGVzIG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAqLworI2lmZGVmIEZBU1RFU1QKKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKKyAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCisgICAgbWF0Y2hfaGVhZCA9IHMtPmhlYWRbcy0+aW5zX2hdLCBcCisgICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKShzdHIpKQorI2Vsc2UKKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKKyAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCisgICAgbWF0Y2hfaGVhZCA9IHMtPnByZXZbKHN0cikgJiBzLT53X21hc2tdID0gcy0+aGVhZFtzLT5pbnNfaF0sIFwKKyAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3MpKHN0cikpCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIChhdm9pZGluZyA2NEsgb3ZlcmZsb3cgZm9yIDE2IGJpdCBzeXN0ZW1zKS4KKyAqIHByZXZbXSB3aWxsIGJlIGluaXRpYWxpemVkIG9uIHRoZSBmbHkuCisgKi8KKyNkZWZpbmUgQ0xFQVJfSEFTSChzKSBcCisgICAgcy0+aGVhZFtzLT5oYXNoX3NpemUtMV0gPSBOSUw7IFwKKyAgICB6bWVtemVybygoQnl0ZWYgKilzLT5oZWFkLCAodW5zaWduZWQpKHMtPmhhc2hfc2l6ZS0xKSpzaXplb2YoKnMtPmhlYWQpKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfKHN0cm0sIGxldmVsLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgbGV2ZWw7CisgICAgY29uc3QgY2hhciAqdmVyc2lvbjsKKyAgICBpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgcmV0dXJuIGRlZmxhdGVJbml0Ml8oc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywgREVGX01FTV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1ksIHZlcnNpb24sIHN0cmVhbV9zaXplKTsKKyAgICAvKiBUbyBkbzogaWdub3JlIHN0cm0tPm5leHRfaW4gaWYgd2UgdXNlIGl0IGFzIHdpbmRvdyAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgIHZlcnNpb24sIHN0cmVhbV9zaXplKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCAgbGV2ZWw7CisgICAgaW50ICBtZXRob2Q7CisgICAgaW50ICB3aW5kb3dCaXRzOworICAgIGludCAgbWVtTGV2ZWw7CisgICAgaW50ICBzdHJhdGVneTsKKyAgICBjb25zdCBjaGFyICp2ZXJzaW9uOworICAgIGludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCB3cmFwID0gMTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBteV92ZXJzaW9uW10gPSBaTElCX1ZFUlNJT047CisKKyAgICB1c2hmICpvdmVybGF5OworICAgIC8qIFdlIG92ZXJsYXkgcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmLiBUaGlzIHdvcmtzIHNpbmNlIHRoZSBhdmVyYWdlCisgICAgICogb3V0cHV0IHNpemUgZm9yIChsZW5ndGgsZGlzdGFuY2UpIGNvZGVzIGlzIDw9IDI0IGJpdHMuCisgICAgICovCisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBteV92ZXJzaW9uWzBdIHx8CisgICAgICAgIHN0cmVhbV9zaXplICE9IHNpemVvZih6X3N0cmVhbSkpIHsKKyAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7CisgICAgaWYgKHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwKSB7CisgICAgICAgIHN0cm0tPnphbGxvYyA9IHpjYWxsb2M7CisgICAgICAgIHN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICB9CisgICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkgc3RybS0+emZyZWUgPSB6Y2ZyZWU7CisKKyNpZmRlZiBGQVNURVNUCisgICAgaWYgKGxldmVsICE9IDApIGxldmVsID0gMTsKKyNlbHNlCisgICAgaWYgKGxldmVsID09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbGV2ZWwgPSA2OworI2VuZGlmCisKKyAgICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovCisgICAgICAgIHdyYXAgPSAwOworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisgICAgfQorI2lmZGVmIEdaSVAKKyAgICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHsKKyAgICAgICAgd3JhcCA9IDI7ICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovCisgICAgICAgIHdpbmRvd0JpdHMgLT0gMTY7CisgICAgfQorI2VuZGlmCisgICAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9IFpfREVGTEFURUQgfHwKKyAgICAgICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHwKKyAgICAgICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIGlmICh3aW5kb3dCaXRzID09IDgpIHdpbmRvd0JpdHMgPSA5OyAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqLworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0Moc3RybSwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAocyA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopczsKKyAgICBzLT5zdHJtID0gc3RybTsKKworICAgIHMtPndyYXAgPSB3cmFwOworICAgIHMtPmd6aGVhZCA9IFpfTlVMTDsKKyAgICBzLT53X2JpdHMgPSB3aW5kb3dCaXRzOworICAgIHMtPndfc2l6ZSA9IDEgPDwgcy0+d19iaXRzOworICAgIHMtPndfbWFzayA9IHMtPndfc2l6ZSAtIDE7CisKKyAgICBzLT5oYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7CisgICAgcy0+aGFzaF9zaXplID0gMSA8PCBzLT5oYXNoX2JpdHM7CisgICAgcy0+aGFzaF9tYXNrID0gcy0+aGFzaF9zaXplIC0gMTsKKyAgICBzLT5oYXNoX3NoaWZ0ID0gICgocy0+aGFzaF9iaXRzK01JTl9NQVRDSC0xKS9NSU5fTUFUQ0gpOworCisgICAgcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhzdHJtLCBzLT53X3NpemUsIDIqc2l6ZW9mKEJ5dGUpKTsKKyAgICBzLT5wcmV2ICAgPSAoUG9zZiAqKSAgWkFMTE9DKHN0cm0sIHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOworICAgIHMtPmhlYWQgICA9IChQb3NmICopICBaQUxMT0Moc3RybSwgcy0+aGFzaF9zaXplLCBzaXplb2YoUG9zKSk7CisKKyAgICBzLT5oaWdoX3dhdGVyID0gMDsgICAgICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqLworCisgICAgcy0+bGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqLworCisgICAgb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7CisgICAgcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5OworICAgIHMtPnBlbmRpbmdfYnVmX3NpemUgPSAodWxnKXMtPmxpdF9idWZzaXplICogKHNpemVvZih1c2gpKzJMKTsKKworICAgIGlmIChzLT53aW5kb3cgPT0gWl9OVUxMIHx8IHMtPnByZXYgPT0gWl9OVUxMIHx8IHMtPmhlYWQgPT0gWl9OVUxMIHx8CisgICAgICAgIHMtPnBlbmRpbmdfYnVmID09IFpfTlVMTCkgeworICAgICAgICBzLT5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7CisgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyKilFUlJfTVNHKFpfTUVNX0VSUk9SKTsKKyAgICAgICAgZGVmbGF0ZUVuZCAoc3RybSk7CisgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB9CisgICAgcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7CisgICAgcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTsKKworICAgIHMtPmxldmVsID0gbGV2ZWw7CisgICAgcy0+c3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICBzLT5tZXRob2QgPSAoQnl0ZSltZXRob2Q7CisKKyAgICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlU2V0RGljdGlvbmFyeSAoc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeTsKKyAgICB1SW50ICBkaWN0TGVuZ3RoOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdUludCBsZW5ndGggPSBkaWN0TGVuZ3RoOworICAgIHVJbnQgbjsKKyAgICBJUG9zIGhhc2hfaGVhZCA9IDA7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IGRpY3Rpb25hcnkgPT0gWl9OVUxMIHx8CisgICAgICAgIHN0cm0tPnN0YXRlLT53cmFwID09IDIgfHwKKyAgICAgICAgKHN0cm0tPnN0YXRlLT53cmFwID09IDEgJiYgc3RybS0+c3RhdGUtPnN0YXR1cyAhPSBJTklUX1NUQVRFKSkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgcyA9IHN0cm0tPnN0YXRlOworICAgIGlmIChzLT53cmFwKQorICAgICAgICBzdHJtLT5hZGxlciA9IGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOworCisgICAgaWYgKGxlbmd0aCA8IE1JTl9NQVRDSCkgcmV0dXJuIFpfT0s7CisgICAgaWYgKGxlbmd0aCA+IHMtPndfc2l6ZSkgeworICAgICAgICBsZW5ndGggPSBzLT53X3NpemU7CisgICAgICAgIGRpY3Rpb25hcnkgKz0gZGljdExlbmd0aCAtIGxlbmd0aDsgLyogdXNlIHRoZSB0YWlsIG9mIHRoZSBkaWN0aW9uYXJ5ICovCisgICAgfQorICAgIHptZW1jcHkocy0+d2luZG93LCBkaWN0aW9uYXJ5LCBsZW5ndGgpOworICAgIHMtPnN0cnN0YXJ0ID0gbGVuZ3RoOworICAgIHMtPmJsb2NrX3N0YXJ0ID0gKGxvbmcpbGVuZ3RoOworCisgICAgLyogSW5zZXJ0IGFsbCBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIChleGNlcHQgZm9yIHRoZSBsYXN0IHR3byBieXRlcykuCisgICAgICogcy0+bG9va2FoZWFkIHN0YXlzIG51bGwsIHNvIHMtPmluc19oIHdpbGwgYmUgcmVjb21wdXRlZCBhdCB0aGUgbmV4dAorICAgICAqIGNhbGwgb2YgZmlsbF93aW5kb3cuCisgICAgICovCisgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbMF07CisgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1sxXSk7CisgICAgZm9yIChuID0gMDsgbiA8PSBsZW5ndGggLSBNSU5fTUFUQ0g7IG4rKykgeworICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIG4sIGhhc2hfaGVhZCk7CisgICAgfQorICAgIGlmIChoYXNoX2hlYWQpIGhhc2hfaGVhZCA9IDA7ICAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVSZXNldCAoc3RybSkKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAorICAgICAgICBzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKworICAgIHN0cm0tPnRvdGFsX2luID0gc3RybS0+dG90YWxfb3V0ID0gMDsKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7IC8qIHVzZSB6ZnJlZSBpZiB3ZSBldmVyIGFsbG9jYXRlIG1zZyBkeW5hbWljYWxseSAqLworICAgIHN0cm0tPmRhdGFfdHlwZSA9IFpfVU5LTk9XTjsKKworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworICAgIHMtPnBlbmRpbmcgPSAwOworICAgIHMtPnBlbmRpbmdfb3V0ID0gcy0+cGVuZGluZ19idWY7CisKKyAgICBpZiAocy0+d3JhcCA8IDApIHsKKyAgICAgICAgcy0+d3JhcCA9IC1zLT53cmFwOyAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqLworICAgIH0KKyAgICBzLT5zdGF0dXMgPSBzLT53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEU7CisgICAgc3RybS0+YWRsZXIgPQorI2lmZGVmIEdaSVAKKyAgICAgICAgcy0+d3JhcCA9PSAyID8gY3JjMzIoMEwsIFpfTlVMTCwgMCkgOgorI2VuZGlmCisgICAgICAgIGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgcy0+bGFzdF9mbHVzaCA9IFpfTk9fRkxVU0g7CisKKyAgICBfdHJfaW5pdChzKTsKKyAgICBsbV9pbml0KHMpOworCisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgKHN0cm0sIGhlYWQpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgZ3pfaGVhZGVycCBoZWFkOworeworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBpZiAoc3RybS0+c3RhdGUtPndyYXAgIT0gMikgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0cm0tPnN0YXRlLT5nemhlYWQgPSBoZWFkOworICAgIHJldHVybiBaX09LOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgKHN0cm0sIGJpdHMsIHZhbHVlKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBiaXRzOworICAgIGludCB2YWx1ZTsKK3sKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+c3RhdGUtPmJpX3ZhbGlkID0gYml0czsKKyAgICBzdHJtLT5zdGF0ZS0+YmlfYnVmID0gKHVzaCkodmFsdWUgJiAoKDEgPDwgYml0cykgLSAxKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVQYXJhbXMoc3RybSwgbGV2ZWwsIHN0cmF0ZWd5KQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgc3RyYXRlZ3k7Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjb21wcmVzc19mdW5jIGZ1bmM7CisgICAgaW50IGVyciA9IFpfT0s7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgcyA9IHN0cm0tPnN0YXRlOworCisjaWZkZWYgRkFTVEVTVAorICAgIGlmIChsZXZlbCAhPSAwKSBsZXZlbCA9IDE7CisjZWxzZQorICAgIGlmIChsZXZlbCA9PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIGxldmVsID0gNjsKKyNlbmRpZgorICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8IHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQpIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBmdW5jID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYzsKKworICAgIGlmICgoc3RyYXRlZ3kgIT0gcy0+c3RyYXRlZ3kgfHwgZnVuYyAhPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5mdW5jKSAmJgorICAgICAgICBzdHJtLT50b3RhbF9pbiAhPSAwKSB7CisgICAgICAgIC8qIEZsdXNoIHRoZSBsYXN0IGJ1ZmZlcjogKi8KKyAgICAgICAgZXJyID0gZGVmbGF0ZShzdHJtLCBaX0JMT0NLKTsKKyAgICB9CisgICAgaWYgKHMtPmxldmVsICE9IGxldmVsKSB7CisgICAgICAgIHMtPmxldmVsID0gbGV2ZWw7CisgICAgICAgIHMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfbGF6eTsKKyAgICAgICAgcy0+Z29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmdvb2RfbGVuZ3RoOworICAgICAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0ubmljZV9sZW5ndGg7CisgICAgICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfY2hhaW47CisgICAgfQorICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVR1bmUoc3RybSwgZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBnb29kX2xlbmd0aDsKKyAgICBpbnQgbWF4X2xhenk7CisgICAgaW50IG5pY2VfbGVuZ3RoOworICAgIGludCBtYXhfY2hhaW47Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgcy0+Z29vZF9tYXRjaCA9IGdvb2RfbGVuZ3RoOworICAgIHMtPm1heF9sYXp5X21hdGNoID0gbWF4X2xhenk7CisgICAgcy0+bmljZV9tYXRjaCA9IG5pY2VfbGVuZ3RoOworICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBtYXhfY2hhaW47CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZvciB0aGUgZGVmYXVsdCB3aW5kb3dCaXRzIG9mIDE1IGFuZCBtZW1MZXZlbCBvZiA4LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIGEgY2xvc2UgdG8gZXhhY3QsIGFzIHdlbGwgYXMgc21hbGwsIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUuCisgKiBUaGV5IGFyZSBjb2RlZCBhcyBjb25zdGFudHMgaGVyZSBmb3IgYSByZWFzb24tLWlmIHRoZSAjZGVmaW5lJ3MgYXJlCisgKiBjaGFuZ2VkLCB0aGVuIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2hhbmdlZCBhcyB3ZWxsLiAgVGhlIHJldHVybgorICogdmFsdWUgZm9yIDE1IGFuZCA4IG9ubHkgd29ya3MgZm9yIHRob3NlIGV4YWN0IHNldHRpbmdzLgorICoKKyAqIEZvciBhbnkgc2V0dGluZyBvdGhlciB0aGFuIHRob3NlIGRlZmF1bHRzIGZvciB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbCwKKyAqIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIGNvbnNlcnZhdGl2ZSB3b3JzdCBjYXNlIGZvciB0aGUgbWF4aW11bSBleHBhbnNpb24KKyAqIHJlc3VsdGluZyBmcm9tIHVzaW5nIGZpeGVkIGJsb2NrcyBpbnN0ZWFkIG9mIHN0b3JlZCBibG9ja3MsIHdoaWNoIGRlZmxhdGUKKyAqIGNhbiBlbWl0IG9uIGNvbXByZXNzZWQgZGF0YSBmb3Igc29tZSBjb21iaW5hdGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMuCisgKgorICogVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3JlIHNvcGhpc3RpY2F0ZWQgdG8gcHJvdmlkZSBjbG9zZXIgdXBwZXIgYm91bmRzIGZvcgorICogZXZlcnkgY29tYmluYXRpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwuICBCdXQgZXZlbiB0aGUgY29uc2VydmF0aXZlCisgKiB1cHBlciBib3VuZCBvZiBhYm91dCAxNCUgZXhwYW5zaW9uIGRvZXMgbm90IHNlZW0gb25lcm91cyBmb3Igb3V0cHV0IGJ1ZmZlcgorICogYWxsb2NhdGlvbi4KKyAqLwordUxvbmcgWkVYUE9SVCBkZWZsYXRlQm91bmQoc3RybSwgc291cmNlTGVuKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVMb25nIGNvbXBsZW4sIHdyYXBsZW47CisgICAgQnl0ZWYgKnN0cjsKKworICAgIC8qIGNvbnNlcnZhdGl2ZSB1cHBlciBib3VuZCBmb3IgY29tcHJlc3NlZCBkYXRhICovCisgICAgY29tcGxlbiA9IHNvdXJjZUxlbiArCisgICAgICAgICAgICAgICgoc291cmNlTGVuICsgNykgPj4gMykgKyAoKHNvdXJjZUxlbiArIDYzKSA+PiA2KSArIDU7CisKKyAgICAvKiBpZiBjYW4ndCBnZXQgcGFyYW1ldGVycywgcmV0dXJuIGNvbnNlcnZhdGl2ZSBib3VuZCBwbHVzIHpsaWIgd3JhcHBlciAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCisgICAgICAgIHJldHVybiBjb21wbGVuICsgNjsKKworICAgIC8qIGNvbXB1dGUgd3JhcHBlciBsZW5ndGggKi8KKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgc3dpdGNoIChzLT53cmFwKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhdyBkZWZsYXRlICovCisgICAgICAgIHdyYXBsZW4gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogemxpYiB3cmFwcGVyICovCisgICAgICAgIHdyYXBsZW4gPSA2ICsgKHMtPnN0cnN0YXJ0ID8gNCA6IDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3ppcCB3cmFwcGVyICovCisgICAgICAgIHdyYXBsZW4gPSAxODsKKyAgICAgICAgaWYgKHMtPmd6aGVhZCAhPSBaX05VTEwpIHsgICAgICAgICAgLyogdXNlci1zdXBwbGllZCBnemlwIGhlYWRlciAqLworICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHdyYXBsZW4gKz0gMiArIHMtPmd6aGVhZC0+ZXh0cmFfbGVuOworICAgICAgICAgICAgc3RyID0gcy0+Z3poZWFkLT5uYW1lOworICAgICAgICAgICAgaWYgKHN0ciAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB3cmFwbGVuKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoKnN0cisrKTsKKyAgICAgICAgICAgIHN0ciA9IHMtPmd6aGVhZC0+Y29tbWVudDsKKyAgICAgICAgICAgIGlmIChzdHIgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgd3JhcGxlbisrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCpzdHIrKyk7CisgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjKQorICAgICAgICAgICAgICAgIHdyYXBsZW4gKz0gMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGNvbXBpbGVyIGhhcHBpbmVzcyAqLworICAgICAgICB3cmFwbGVuID0gNjsKKyAgICB9CisKKyAgICAvKiBpZiBub3QgZGVmYXVsdCBwYXJhbWV0ZXJzLCByZXR1cm4gY29uc2VydmF0aXZlIGJvdW5kICovCisgICAgaWYgKHMtPndfYml0cyAhPSAxNSB8fCBzLT5oYXNoX2JpdHMgIT0gOCArIDcpCisgICAgICAgIHJldHVybiBjb21wbGVuICsgd3JhcGxlbjsKKworICAgIC8qIGRlZmF1bHQgc2V0dGluZ3M6IHJldHVybiB0aWdodCBib3VuZCBmb3IgdGhhdCBjYXNlICovCisgICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKworICAgICAgICAgICAoc291cmNlTGVuID4+IDI1KSArIDEzIC0gNiArIHdyYXBsZW47Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluCisgKiBwZW5kaW5nX2J1Zi4KKyAqLworbG9jYWwgdm9pZCBwdXRTaG9ydE1TQiAocywgYikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVJbnQgYjsKK3sKKyAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7CisgICAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXMKKyAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQKKyAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5uZXh0X291dCBidWZmZXIgYW5kIGNvcHlpbmcgaW50byBpdC4KKyAqIChTZWUgYWxzbyByZWFkX2J1ZigpKS4KKyAqLworbG9jYWwgdm9pZCBmbHVzaF9wZW5kaW5nKHN0cm0pCisgICAgel9zdHJlYW1wIHN0cm07Cit7CisgICAgdW5zaWduZWQgbGVuID0gc3RybS0+c3RhdGUtPnBlbmRpbmc7CisKKyAgICBpZiAobGVuID4gc3RybS0+YXZhaWxfb3V0KSBsZW4gPSBzdHJtLT5hdmFpbF9vdXQ7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CisKKyAgICB6bWVtY3B5KHN0cm0tPm5leHRfb3V0LCBzdHJtLT5zdGF0ZS0+cGVuZGluZ19vdXQsIGxlbik7CisgICAgc3RybS0+bmV4dF9vdXQgICs9IGxlbjsKKyAgICBzdHJtLT5zdGF0ZS0+cGVuZGluZ19vdXQgICs9IGxlbjsKKyAgICBzdHJtLT50b3RhbF9vdXQgKz0gbGVuOworICAgIHN0cm0tPmF2YWlsX291dCAgLT0gbGVuOworICAgIHN0cm0tPnN0YXRlLT5wZW5kaW5nIC09IGxlbjsKKyAgICBpZiAoc3RybS0+c3RhdGUtPnBlbmRpbmcgPT0gMCkgeworICAgICAgICBzdHJtLT5zdGF0ZS0+cGVuZGluZ19vdXQgPSBzdHJtLT5zdGF0ZS0+cGVuZGluZ19idWY7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlIChzdHJtLCBmbHVzaCkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgaW50IG9sZF9mbHVzaDsgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqLworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8CisgICAgICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBzID0gc3RybS0+c3RhdGU7CisKKyAgICBpZiAoc3RybS0+bmV4dF9vdXQgPT0gWl9OVUxMIHx8CisgICAgICAgIChzdHJtLT5uZXh0X2luID09IFpfTlVMTCAmJiBzdHJtLT5hdmFpbF9pbiAhPSAwKSB8fAorICAgICAgICAocy0+c3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPSBaX0ZJTklTSCkpIHsKKyAgICAgICAgRVJSX1JFVFVSTihzdHJtLCBaX1NUUkVBTV9FUlJPUik7CisgICAgfQorICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgRVJSX1JFVFVSTihzdHJtLCBaX0JVRl9FUlJPUik7CisKKyAgICBzLT5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovCisgICAgb2xkX2ZsdXNoID0gcy0+bGFzdF9mbHVzaDsKKyAgICBzLT5sYXN0X2ZsdXNoID0gZmx1c2g7CisKKyAgICAvKiBXcml0ZSB0aGUgaGVhZGVyICovCisgICAgaWYgKHMtPnN0YXR1cyA9PSBJTklUX1NUQVRFKSB7CisjaWZkZWYgR1pJUAorICAgICAgICBpZiAocy0+d3JhcCA9PSAyKSB7CisgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgICAgICAgICAgcHV0X2J5dGUocywgMzEpOworICAgICAgICAgICAgcHV0X2J5dGUocywgMTM5KTsKKyAgICAgICAgICAgIHB1dF9ieXRlKHMsIDgpOworICAgICAgICAgICAgaWYgKHMtPmd6aGVhZCA9PSBaX05VTEwpIHsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5sZXZlbCA9PSA5ID8gMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7CisgICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLT5nemhlYWQtPnRleHQgPyAxIDogMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmhjcmMgPyAyIDogMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmV4dHJhID09IFpfTlVMTCA/IDAgOiA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmd6aGVhZC0+bmFtZSA9PSBaX05VTEwgPyAwIDogOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmNvbW1lbnQgPT0gWl9OVUxMID8gMCA6IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkocy0+Z3poZWFkLT50aW1lICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDgpICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDE2KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHMtPmd6aGVhZC0+dGltZSA+PiAyNCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+bGV2ZWwgPT0gOSA/IDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IDogMCkpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+b3MgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBaX05VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+Z3poZWFkLT5leHRyYV9sZW4gJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKHMtPmd6aGVhZC0+ZXh0cmFfbGVuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpCisgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcpOworICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEVYVFJBX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICB1SW50IGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLT53X2JpdHMtOCk8PDQpKSA8PCA4OworICAgICAgICAgICAgdUludCBsZXZlbF9mbGFnczsKKworICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMikKKyAgICAgICAgICAgICAgICBsZXZlbF9mbGFncyA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChzLT5sZXZlbCA8IDYpCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAocy0+bGV2ZWwgPT0gNikKKyAgICAgICAgICAgICAgICBsZXZlbF9mbGFncyA9IDI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzOworICAgICAgICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJzdGFydCAhPSAwKSBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7CisgICAgICAgICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpOworCisgICAgICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOworICAgICAgICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTsKKworICAgICAgICAgICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovCisgICAgICAgICAgICBpZiAocy0+c3Ryc3RhcnQgIT0gMCkgeworICAgICAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOworICAgICAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEdaSVAKKyAgICBpZiAocy0+c3RhdHVzID09IEVYVFJBX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPmV4dHJhICE9IFpfTlVMTCkgeworICAgICAgICAgICAgdUludCBiZWcgPSBzLT5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLworCisgICAgICAgICAgICB3aGlsZSAocy0+Z3ppbmRleCA8IChzLT5nemhlYWQtPmV4dHJhX2xlbiAmIDB4ZmZmZikpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAgICAgICAgICAgICAgICAgYmVnID0gcy0+cGVuZGluZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5nemhlYWQtPmV4dHJhW3MtPmd6aW5kZXhdKTsKKyAgICAgICAgICAgICAgICBzLT5nemluZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgIGlmIChzLT5nemluZGV4ID09IHMtPmd6aGVhZC0+ZXh0cmFfbGVuKSB7CisgICAgICAgICAgICAgICAgcy0+Z3ppbmRleCA9IDA7CisgICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gTkFNRV9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5zdGF0dXMgPSBOQU1FX1NUQVRFOworICAgIH0KKyAgICBpZiAocy0+c3RhdHVzID09IE5BTUVfU1RBVEUpIHsKKyAgICAgICAgaWYgKHMtPmd6aGVhZC0+bmFtZSAhPSBaX05VTEwpIHsKKyAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KKyAgICAgICAgICAgIGludCB2YWw7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAgICAgICAgICAgICAgICAgYmVnID0gcy0+cGVuZGluZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbCA9IHMtPmd6aGVhZC0+bmFtZVtzLT5nemluZGV4KytdOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7CisgICAgICAgICAgICB9IHdoaWxlICh2YWwgIT0gMCk7CisgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gQ09NTUVOVF9TVEFURTsKKyAgICB9CisgICAgaWYgKHMtPnN0YXR1cyA9PSBDT01NRU5UX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPmNvbW1lbnQgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICB1SW50IGJlZyA9IHMtPnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovCisgICAgICAgICAgICBpbnQgdmFsOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgICAgICAgICAgICAgIGJlZyA9IHMtPnBlbmRpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSBzLT5nemhlYWQtPmNvbW1lbnRbcy0+Z3ppbmRleCsrXTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOworICAgICAgICAgICAgfSB3aGlsZSAodmFsICE9IDApOworICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICBpZiAodmFsID09IDApCisgICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gSENSQ19TVEFURTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5zdGF0dXMgPSBIQ1JDX1NUQVRFOworICAgIH0KKyAgICBpZiAocy0+c3RhdHVzID09IEhDUkNfU1RBVEUpIHsKKyAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYykgeworICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgKyAyID4gcy0+cGVuZGluZ19idWZfc2l6ZSkKKyAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgKyAyIDw9IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+YWRsZXIgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiA4KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi8KKyAgICBpZiAocy0+cGVuZGluZyAhPSAwKSB7CisgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aAorICAgICAgICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmQKKyAgICAgICAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLAorICAgICAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2UKKyAgICAgICAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZToKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOworICAgICAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZQorICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwCisgICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLgorICAgICAqLworICAgIH0gZWxzZSBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBmbHVzaCA8PSBvbGRfZmx1c2ggJiYKKyAgICAgICAgICAgICAgIGZsdXNoICE9IFpfRklOSVNIKSB7CisgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOworICAgIH0KKworICAgIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovCisgICAgaWYgKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgeworICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuCisgICAgICovCisgICAgaWYgKHN0cm0tPmF2YWlsX2luICE9IDAgfHwgcy0+bG9va2FoZWFkICE9IDAgfHwKKyAgICAgICAgKGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgcy0+c3RhdHVzICE9IEZJTklTSF9TVEFURSkpIHsKKyAgICAgICAgYmxvY2tfc3RhdGUgYnN0YXRlOworCisgICAgICAgIGJzdGF0ZSA9IHMtPnN0cmF0ZWd5ID09IFpfSFVGRk1BTl9PTkxZID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6CisgICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA9PSBaX1JMRSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKihjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5mdW5jKSkocywgZmx1c2gpKTsKKworICAgICAgICBpZiAoYnN0YXRlID09IGZpbmlzaF9zdGFydGVkIHx8IGJzdGF0ZSA9PSBmaW5pc2hfZG9uZSkgeworICAgICAgICAgICAgcy0+c3RhdHVzID0gRklOSVNIX1NUQVRFOworICAgICAgICB9CisgICAgICAgIGlmIChic3RhdGUgPT0gbmVlZF9tb3JlIHx8IGJzdGF0ZSA9PSBmaW5pc2hfc3RhcnRlZCkgeworICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhbgorICAgICAgICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc28KKyAgICAgICAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdAorICAgICAgICAgICAgICogb25lIGVtcHR5IGJsb2NrLgorICAgICAgICAgICAgICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGJzdGF0ZSA9PSBibG9ja19kb25lKSB7CisgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9QQVJUSUFMX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgX3RyX2FsaWduKHMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmbHVzaCAhPSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqLworICAgICAgICAgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgKGNoYXIqKTAsIDBMLCAwKTsKKyAgICAgICAgICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZAorICAgICAgICAgICAgICAgICAqIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfRlVMTF9GTFVTSCkgeworICAgICAgICAgICAgICAgICAgICBDTEVBUl9IQVNIKHMpOyAgICAgICAgICAgICAvKiBmb3JnZXQgaGlzdG9yeSAqLworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3N0YXJ0ID0gMEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovCisgICAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCAiYnVnMiIpOworCisgICAgaWYgKGZsdXNoICE9IFpfRklOSVNIKSByZXR1cm4gWl9PSzsKKyAgICBpZiAocy0+d3JhcCA8PSAwKSByZXR1cm4gWl9TVFJFQU1fRU5EOworCisgICAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi8KKyNpZmRlZiBHWklQCisgICAgaWYgKHMtPndyYXAgPT0gMikgeworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+YWRsZXIgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gOCkgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gMTYpICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPmFkbGVyID4+IDI0KSAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHN0cm0tPnRvdGFsX2luICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPnRvdGFsX2luID4+IDgpICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT50b3RhbF9pbiA+PiAyNCkgJiAweGZmKSk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyID4+IDE2KSk7CisgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOworICAgIH0KKyAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW4KKyAgICAgKiB0byBmbHVzaCB0aGUgcmVzdC4KKyAgICAgKi8KKyAgICBpZiAocy0+d3JhcCA+IDApIHMtPndyYXAgPSAtcy0+d3JhcDsgLyogd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlISAqLworICAgIHJldHVybiBzLT5wZW5kaW5nICE9IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIChzdHJtKQorICAgIHpfc3RyZWFtcCBzdHJtOworeworICAgIGludCBzdGF0dXM7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdGF0dXMgPSBzdHJtLT5zdGF0ZS0+c3RhdHVzOworICAgIGlmIChzdGF0dXMgIT0gSU5JVF9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gRVhUUkFfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IE5BTUVfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IENPTU1FTlRfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IEhDUkNfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IEJVU1lfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IEZJTklTSF9TVEFURSkgeworICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKworICAgIC8qIERlYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uczogKi8KKyAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+cGVuZGluZ19idWYpOworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5oZWFkKTsKKyAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+cHJldik7CisgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPndpbmRvdyk7CisKKyAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7CisgICAgc3RybS0+c3RhdGUgPSBaX05VTEw7CisKKyAgICByZXR1cm4gc3RhdHVzID09IEJVU1lfU1RBVEUgPyBaX0RBVEFfRVJST1IgOiBaX09LOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IHRoZSBzb3VyY2Ugc3RhdGUgdG8gdGhlIGRlc3RpbmF0aW9uIHN0YXRlLgorICogVG8gc2ltcGxpZnkgdGhlIHNvdXJjZSwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkIGZvciAxNi1iaXQgTVNET1MgKHdoaWNoCisgKiBkb2Vzbid0IGhhdmUgZW5vdWdoIG1lbW9yeSBhbnl3YXkgdG8gZHVwbGljYXRlIGNvbXByZXNzaW9uIHN0YXRlcykuCisgKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVDb3B5IChkZXN0LCBzb3VyY2UpCisgICAgel9zdHJlYW1wIGRlc3Q7CisgICAgel9zdHJlYW1wIHNvdXJjZTsKK3sKKyNpZmRlZiBNQVhTRUdfNjRLCisgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICBkZWZsYXRlX3N0YXRlICpkczsKKyAgICBkZWZsYXRlX3N0YXRlICpzczsKKyAgICB1c2hmICpvdmVybGF5OworCisKKyAgICBpZiAoc291cmNlID09IFpfTlVMTCB8fCBkZXN0ID09IFpfTlVMTCB8fCBzb3VyY2UtPnN0YXRlID09IFpfTlVMTCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorCisgICAgc3MgPSBzb3VyY2UtPnN0YXRlOworCisgICAgem1lbWNweShkZXN0LCBzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOworCisgICAgZHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0MoZGVzdCwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoZHMgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKSBkczsKKyAgICB6bWVtY3B5KGRzLCBzcywgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBkcy0+c3RybSA9IGRlc3Q7CisKKyAgICBkcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhkZXN0LCBkcy0+d19zaXplLCAyKnNpemVvZihCeXRlKSk7CisgICAgZHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOworICAgIGRzLT5oZWFkICAgPSAoUG9zZiAqKSAgWkFMTE9DKGRlc3QsIGRzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKKyAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKGRlc3QsIGRzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7CisgICAgZHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKKworICAgIGlmIChkcy0+d2luZG93ID09IFpfTlVMTCB8fCBkcy0+cHJldiA9PSBaX05VTEwgfHwgZHMtPmhlYWQgPT0gWl9OVUxMIHx8CisgICAgICAgIGRzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgZGVmbGF0ZUVuZCAoZGVzdCk7CisgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB9CisgICAgLyogZm9sbG93aW5nIHptZW1jcHkgZG8gbm90IHdvcmsgZm9yIDE2LWJpdCBNU0RPUyAqLworICAgIHptZW1jcHkoZHMtPndpbmRvdywgc3MtPndpbmRvdywgZHMtPndfc2l6ZSAqIDIgKiBzaXplb2YoQnl0ZSkpOworICAgIHptZW1jcHkoZHMtPnByZXYsIHNzLT5wcmV2LCBkcy0+d19zaXplICogc2l6ZW9mKFBvcykpOworICAgIHptZW1jcHkoZHMtPmhlYWQsIHNzLT5oZWFkLCBkcy0+aGFzaF9zaXplICogc2l6ZW9mKFBvcykpOworICAgIHptZW1jcHkoZHMtPnBlbmRpbmdfYnVmLCBzcy0+cGVuZGluZ19idWYsICh1SW50KWRzLT5wZW5kaW5nX2J1Zl9zaXplKTsKKworICAgIGRzLT5wZW5kaW5nX291dCA9IGRzLT5wZW5kaW5nX2J1ZiArIChzcy0+cGVuZGluZ19vdXQgLSBzcy0+cGVuZGluZ19idWYpOworICAgIGRzLT5kX2J1ZiA9IG92ZXJsYXkgKyBkcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7CisgICAgZHMtPmxfYnVmID0gZHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKmRzLT5saXRfYnVmc2l6ZTsKKworICAgIGRzLT5sX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2x0cmVlOworICAgIGRzLT5kX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2R0cmVlOworICAgIGRzLT5ibF9kZXNjLmR5bl90cmVlID0gZHMtPmJsX3RyZWU7CisKKyAgICByZXR1cm4gWl9PSzsKKyNlbmRpZiAvKiBNQVhTRUdfNjRLICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMgorICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2gKKyAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkCisgKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9pbiBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC4KKyAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLgorICovCitsb2NhbCBpbnQgcmVhZF9idWYoc3RybSwgYnVmLCBzaXplKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIEJ5dGVmICpidWY7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICB1bnNpZ25lZCBsZW4gPSBzdHJtLT5hdmFpbF9pbjsKKworICAgIGlmIChsZW4gPiBzaXplKSBsZW4gPSBzaXplOworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIDA7CisKKyAgICBzdHJtLT5hdmFpbF9pbiAgLT0gbGVuOworCisgICAgaWYgKHN0cm0tPnN0YXRlLT53cmFwID09IDEpIHsKKyAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBzdHJtLT5uZXh0X2luLCBsZW4pOworICAgIH0KKyNpZmRlZiBHWklQCisgICAgZWxzZSBpZiAoc3RybS0+c3RhdGUtPndyYXAgPT0gMikgeworICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzdHJtLT5uZXh0X2luLCBsZW4pOworICAgIH0KKyNlbmRpZgorICAgIHptZW1jcHkoYnVmLCBzdHJtLT5uZXh0X2luLCBsZW4pOworICAgIHN0cm0tPm5leHRfaW4gICs9IGxlbjsKKyAgICBzdHJtLT50b3RhbF9pbiArPSBsZW47CisKKyAgICByZXR1cm4gKGludClsZW47Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgImxvbmdlc3QgbWF0Y2giIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbQorICovCitsb2NhbCB2b2lkIGxtX2luaXQgKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBzLT53aW5kb3dfc2l6ZSA9ICh1bGcpMkwqcy0+d19zaXplOworCisgICAgQ0xFQVJfSEFTSChzKTsKKworICAgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6CisgICAgICovCisgICAgcy0+bWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9sYXp5OworICAgIHMtPmdvb2RfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5nb29kX2xlbmd0aDsKKyAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubmljZV9sZW5ndGg7CisgICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9jaGFpbjsKKworICAgIHMtPnN0cnN0YXJ0ID0gMDsKKyAgICBzLT5ibG9ja19zdGFydCA9IDBMOworICAgIHMtPmxvb2thaGVhZCA9IDA7CisgICAgcy0+bWF0Y2hfbGVuZ3RoID0gcy0+cHJldl9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKyAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOworICAgIHMtPmluc19oID0gMDsKKyNpZm5kZWYgRkFTVEVTVAorI2lmZGVmIEFTTVYKKyAgICBtYXRjaF9pbml0KCk7IC8qIGluaXRpYWxpemUgdGhlIGFzbSBjb2RlICovCisjZW5kaWYKKyNlbmRpZgorfQorCisjaWZuZGVmIEZBU1RFU1QKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kCisgKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsCisgKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzCisgKiBnYXJiYWdlLgorICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudAorICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMQorICogT1VUIGFzc2VydGlvbjogdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QgZ3JlYXRlciB0aGFuIHMtPmxvb2thaGVhZC4KKyAqLworI2lmbmRlZiBBU01WCisvKiBGb3IgODB4ODYgYW5kIDY4MHgwLCBhbiBvcHRpbWl6ZWQgdmVyc2lvbiB3aWxsIGJlIHByb3ZpZGVkIGluIG1hdGNoLmFzbSBvcgorICogbWF0Y2guUy4gVGhlIGNvZGUgd2lsbCBiZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudC4KKyAqLworbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLworeworICAgIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7LyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBCeXRlZiAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLworICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KKyAgICBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLworICAgIGludCBuaWNlX21hdGNoID0gcy0+bmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqLworICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KKyAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsKKyAgICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAorICAgICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCisgICAgICovCisgICAgUG9zZiAqcHJldiA9IHMtPnByZXY7CisgICAgdUludCB3bWFzayA9IHMtPndfbWFzazsKKworI2lmZGVmIFVOQUxJR05FRF9PSworICAgIC8qIENvbXBhcmUgdHdvIGJ5dGVzIGF0IGEgdGltZS4gTm90ZTogdGhpcyBpcyBub3QgYWx3YXlzIGJlbmVmaWNpYWwuCisgICAgICogVHJ5IHdpdGggYW5kIHdpdGhvdXQgLURVTkFMSUdORURfT0sgdG8gY2hlY2suCisgICAgICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIIC0gMTsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CisjZWxzZQorICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKyAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOworICAgIHJlZ2lzdGVyIEJ5dGUgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOworI2VuZGlmCisKKyAgICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KKyAgICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCAiQ29kZSB0b28gY2xldmVyIik7CisKKyAgICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqLworICAgIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CisgICAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKKyAgICB9CisgICAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeQorICAgICAqIHRvIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljLgorICAgICAqLworICAgIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOworCisgICAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgIm5lZWQgbG9va2FoZWFkIik7CisKKyAgICBkbyB7CisgICAgICAgIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgIm5vIGZ1dHVyZSIpOworICAgICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKKworICAgICAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2UKKyAgICAgICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMi4gIE5vdGUgdGhhdCB0aGUgY2hlY2tzIGJlbG93CisgICAgICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZQorICAgICAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZAorICAgICAgICAgKiBjb25kaXRpb25hbCBqdW1wcyB3aWxsIGJlIG1hZGUgdGhhdCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzLgorICAgICAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc28KKyAgICAgICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuCisgICAgICAgICAqLworI2lmIChkZWZpbmVkKFVOQUxJR05FRF9PSykgJiYgTUFYX01BVENIID09IDI1OCkKKyAgICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSA9PSAyLiBEbyBub3QgdXNlCisgICAgICAgICAqIFVOQUxJR05FRF9PSyBpZiB5b3VyIGNvbXBpbGVyIHVzZXMgYSBkaWZmZXJlbnQgc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAorICAgICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKKworICAgICAgICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleSBhcmUKKyAgICAgICAgICogYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0IHRoZSBoYXNoIGtleXMKKyAgICAgICAgICogYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LiBDb21wYXJlIDIgYnl0ZXMgYXQgYSB0aW1lIGF0CisgICAgICAgICAqIHN0cnN0YXJ0KzMsICs1LCAuLi4gdXAgdG8gc3Ryc3RhcnQrMjU3LiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50CisgICAgICAgICAqIGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDR0aCBjb21wYXJpc29uOyB0aGUgMTI4dGggY2hlY2sgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGF0IHN0cnN0YXJ0KzI1Ny4gSWYgTUFYX01BVENILTIgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgaXQgaXMKKyAgICAgICAgICogbmVjZXNzYXJ5IHRvIHB1dCBtb3JlIGd1YXJkIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdywgb3IKKyAgICAgICAgICogdG8gY2hlY2sgbW9yZSBvZnRlbiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZC4KKyAgICAgICAgICovCisgICAgICAgIEFzc2VydChzY2FuWzJdID09IG1hdGNoWzJdLCAic2NhblsyXT8iKTsKKyAgICAgICAgc2NhbisrLCBtYXRjaCsrOworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKyAgICAgICAgLyogVGhlIGZ1bm55ICJkbyB7fSIgZ2VuZXJhdGVzIGJldHRlciBjb2RlIG9uIG1vc3QgY29tcGlsZXJzICovCisKKyAgICAgICAgLyogSGVyZSwgc2NhbiA8PSB3aW5kb3crc3Ryc3RhcnQrMjU3ICovCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisgICAgICAgIGlmICgqc2NhbiA9PSAqbWF0Y2gpIHNjYW4rKzsKKworICAgICAgICBsZW4gPSAoTUFYX01BVENIIC0gMSkgLSAoaW50KShzdHJlbmQtc2Nhbik7CisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSAoTUFYX01BVENILTEpOworCisjZWxzZSAvKiBVTkFMSUdORURfT0sgKi8KKworICAgICAgICBpZiAobWF0Y2hbYmVzdF9sZW5dICAgIT0gc2Nhbl9lbmQgIHx8CisgICAgICAgICAgICBtYXRjaFtiZXN0X2xlbi0xXSAhPSBzY2FuX2VuZDEgfHwKKyAgICAgICAgICAgICptYXRjaCAgICAgICAgICAgICE9ICpzY2FuICAgICB8fAorICAgICAgICAgICAgKisrbWF0Y2ggICAgICAgICAgIT0gc2NhblsxXSkgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQorICAgICAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorICAgICAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQorICAgICAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0CisgICAgICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorICAgICAgICAgKi8KKyAgICAgICAgc2NhbiArPSAyLCBtYXRjaCsrOworICAgICAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7CisKKyAgICAgICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKKyAgICAgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCisgICAgICAgICAqLworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKworICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOworCisgICAgICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworICAgICAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOworCisjZW5kaWYgLyogVU5BTElHTkVEX09LICovCisKKyAgICAgICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7CisgICAgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKKyAgICAgICAgICAgIGJlc3RfbGVuID0gbGVuOworICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKKyNpZmRlZiBVTkFMSUdORURfT0sKKyAgICAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKKyNlbHNlCisgICAgICAgICAgICBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICAgICAgICAgIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0CisgICAgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7CisKKyAgICBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CisgICAgcmV0dXJuIHMtPmxvb2thaGVhZDsKK30KKyNlbmRpZiAvKiBBU01WICovCisKKyNlbHNlIC8qIEZBU1RFU1QgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPcHRpbWl6ZWQgdmVyc2lvbiBmb3IgRkFTVEVTVCBvbmx5CisgKi8KK2xvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KK3sKKyAgICByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKworICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgorICAgICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsKKworICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOworCisgICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CisKKyAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKKworICAgIC8qIFJldHVybiBmYWlsdXJlIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDI6CisgICAgICovCisgICAgaWYgKG1hdGNoWzBdICE9IHNjYW5bMF0gfHwgbWF0Y2hbMV0gIT0gc2NhblsxXSkgcmV0dXJuIE1JTl9NQVRDSC0xOworCisgICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKKyAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CisgICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAorICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorICAgICAqLworICAgIHNjYW4gKz0gMiwgbWF0Y2ggKz0gMjsKKyAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7CisKKyAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgorICAgICAqLworICAgIGRvIHsKKyAgICB9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKworICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisKKyAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKKworICAgIGlmIChsZW4gPCBNSU5fTUFUQ0gpIHJldHVybiBNSU5fTUFUQ0ggLSAxOworCisgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CisgICAgcmV0dXJuICh1SW50KWxlbiA8PSBzLT5sb29rYWhlYWQgPyAodUludClsZW4gOiBzLT5sb29rYWhlYWQ7Cit9CisKKyNlbmRpZiAvKiBGQVNURVNUICovCisKKyNpZmRlZiBERUJVR19aTElCCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRoYXQgdGhlIG1hdGNoIGF0IG1hdGNoX3N0YXJ0IGlzIGluZGVlZCBhIG1hdGNoLgorICovCitsb2NhbCB2b2lkIGNoZWNrX21hdGNoKHMsIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgSVBvcyBzdGFydCwgbWF0Y2g7CisgICAgaW50IGxlbmd0aDsKK3sKKyAgICAvKiBjaGVjayB0aGF0IHRoZSBtYXRjaCBpcyBpbmRlZWQgYSBtYXRjaCAqLworICAgIGlmICh6bWVtY21wKHMtPndpbmRvdyArIG1hdGNoLAorICAgICAgICAgICAgICAgIHMtPndpbmRvdyArIHN0YXJ0LCBsZW5ndGgpICE9IEVRVUFMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIHN0YXJ0ICV1LCBtYXRjaCAldSwgbGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgICAgIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlYyVjIiwgcy0+d2luZG93W21hdGNoKytdLCBzLT53aW5kb3dbc3RhcnQrK10pOworICAgICAgICB9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKKyAgICAgICAgel9lcnJvcigiaW52YWxpZCBtYXRjaCIpOworICAgIH0KKyAgICBpZiAoel92ZXJib3NlID4gMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXFxbJWQsJWRdIiwgc3RhcnQtbWF0Y2gsIGxlbmd0aCk7CisgICAgICAgIGRvIHsgcHV0YyhzLT53aW5kb3dbc3RhcnQrK10sIHN0ZGVycik7IH0gd2hpbGUgKC0tbGVuZ3RoICE9IDApOworICAgIH0KK30KKyNlbHNlCisjICBkZWZpbmUgY2hlY2tfbWF0Y2gocywgc3RhcnQsIG1hdGNoLCBsZW5ndGgpCisjZW5kaWYgLyogREVCVUdfWkxJQiAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZpbGwgdGhlIHdpbmRvdyB3aGVuIHRoZSBsb29rYWhlYWQgYmVjb21lcyBpbnN1ZmZpY2llbnQuCisgKiBVcGRhdGVzIHN0cnN0YXJ0IGFuZCBsb29rYWhlYWQuCisgKgorICogSU4gYXNzZXJ0aW9uOiBsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFECisgKiBPVVQgYXNzZXJ0aW9uczogc3Ryc3RhcnQgPD0gd2luZG93X3NpemUtTUlOX0xPT0tBSEVBRAorICogICAgQXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4gcmVhZCwgb3IgYXZhaWxfaW4gPT0gMDsgcmVhZHMgYXJlCisgKiAgICBwZXJmb3JtZWQgZm9yIGF0IGxlYXN0IHR3byBieXRlcyAocmVxdWlyZWQgZm9yIHRoZSB6aXAgdHJhbnNsYXRlX2VvbAorICogICAgb3B0aW9uIC0tIG5vdCBzdXBwb3J0ZWQgaGVyZSkuCisgKi8KK2xvY2FsIHZvaWQgZmlsbF93aW5kb3cocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIG4sIG07CisgICAgcmVnaXN0ZXIgUG9zZiAqcDsKKyAgICB1bnNpZ25lZCBtb3JlOyAgICAvKiBBbW91bnQgb2YgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3cuICovCisgICAgdUludCB3c2l6ZSA9IHMtPndfc2l6ZTsKKworICAgIGRvIHsKKyAgICAgICAgbW9yZSA9ICh1bnNpZ25lZCkocy0+d2luZG93X3NpemUgLSh1bGcpcy0+bG9va2FoZWFkIC0odWxnKXMtPnN0cnN0YXJ0KTsKKworICAgICAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqLworICAgICAgICBpZiAoc2l6ZW9mKGludCkgPD0gMikgeworICAgICAgICAgICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbW9yZSA9IHdzaXplOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHsKKyAgICAgICAgICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYKKyAgICAgICAgICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG1vcmUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsCisgICAgICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPj0gd3NpemUrTUFYX0RJU1QocykpIHsKKworICAgICAgICAgICAgem1lbWNweShzLT53aW5kb3csIHMtPndpbmRvdyt3c2l6ZSwgKHVuc2lnbmVkKXdzaXplKTsKKyAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0IC09IHdzaXplOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQgICAgLT0gd3NpemU7IC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovCisgICAgICAgICAgICBzLT5ibG9ja19zdGFydCAtPSAobG9uZykgd3NpemU7CisKKyAgICAgICAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlcworICAgICAgICAgICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDAKKyAgICAgICAgICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDAKKyAgICAgICAgICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZgorICAgICAgICAgICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLikKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbiA9IHMtPmhhc2hfc2l6ZTsKKyAgICAgICAgICAgIHAgPSAmcy0+aGVhZFtuXTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtID0gKi0tcDsKKyAgICAgICAgICAgICAgICAqcCA9IChQb3MpKG0gPj0gd3NpemUgPyBtLXdzaXplIDogTklMKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CisKKyAgICAgICAgICAgIG4gPSB3c2l6ZTsKKyNpZm5kZWYgRkFTVEVTVAorICAgICAgICAgICAgcCA9ICZzLT5wcmV2W25dOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG0gPSAqLS1wOworICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOworICAgICAgICAgICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0CisgICAgICAgICAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CisjZW5kaWYKKyAgICAgICAgICAgIG1vcmUgKz0gd3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIHJldHVybjsKKworICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzoKKyAgICAgICAgICogICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiYKKyAgICAgICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0CisgICAgICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKQorICAgICAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gMipXU0laRSArIDIKKyAgICAgICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksCisgICAgICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmCisgICAgICAgICAqICAgc3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgPD0gaW5wdXRfc2l6ZSA9PiBtb3JlID49IE1JTl9MT09LQUhFQUQuCisgICAgICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuCisgICAgICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi4KKyAgICAgICAgICovCisgICAgICAgIEFzc2VydChtb3JlID49IDIsICJtb3JlIDwgMiIpOworCisgICAgICAgIG4gPSByZWFkX2J1ZihzLT5zdHJtLCBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIHMtPmxvb2thaGVhZCwgbW9yZSk7CisgICAgICAgIHMtPmxvb2thaGVhZCArPSBuOworCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdOworICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzLT5zdHJzdGFydCsxXSk7CisjaWYgTUlOX01BVENIICE9IDMKKyAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsCisgICAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC4KKyAgICAgICAgICovCisKKyAgICB9IHdoaWxlIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMtPnN0cm0tPmF2YWlsX2luICE9IDApOworCisgICAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW4KKyAgICAgKiB3cml0dGVuLCB0aGVuIHplcm8gdGhvc2UgYnl0ZXMgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHJlcG9ydHMgb2YKKyAgICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnkKKyAgICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dAorICAgICAqIHRpbWUgdGhyb3VnaCBoZXJlLiAgV0lOX0lOSVQgaXMgc2V0IHRvIE1BWF9NQVRDSCBzaW5jZSB0aGUgbG9uZ2VzdCBtYXRjaAorICAgICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuCisgICAgICovCisgICAgaWYgKHMtPmhpZ2hfd2F0ZXIgPCBzLT53aW5kb3dfc2l6ZSkgeworICAgICAgICB1bGcgY3VyciA9IHMtPnN0cnN0YXJ0ICsgKHVsZykocy0+bG9va2FoZWFkKTsKKyAgICAgICAgdWxnIGluaXQ7CisKKyAgICAgICAgaWYgKHMtPmhpZ2hfd2F0ZXIgPCBjdXJyKSB7CisgICAgICAgICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVQKKyAgICAgICAgICAgICAqIGJ5dGVzIG9yIHVwIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBjdXJyOworICAgICAgICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVCkKKyAgICAgICAgICAgICAgICBpbml0ID0gV0lOX0lOSVQ7CisgICAgICAgICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7CisgICAgICAgICAgICBzLT5oaWdoX3dhdGVyID0gY3VyciArIGluaXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7CisgICAgICAgICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhCisgICAgICAgICAgICAgKiBwbHVzIFdJTl9JTklUIC0tIHplcm8gb3V0IHRvIGN1cnJlbnQgZGF0YSBwbHVzIFdJTl9JTklULCBvciB1cAorICAgICAgICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGluaXQgPSAodWxnKWN1cnIgKyBXSU5fSU5JVCAtIHMtPmhpZ2hfd2F0ZXI7CisgICAgICAgICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcikKKyAgICAgICAgICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyOworICAgICAgICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpOworICAgICAgICAgICAgcy0+aGlnaF93YXRlciArPSBpbml0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIHRoZSBjdXJyZW50IGJsb2NrLCB3aXRoIGdpdmVuIGVuZC1vZi1maWxlIGZsYWcuCisgKiBJTiBhc3NlcnRpb246IHN0cnN0YXJ0IGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1hdGNoLgorICovCisjZGVmaW5lIEZMVVNIX0JMT0NLX09OTFkocywgbGFzdCkgeyBcCisgICBfdHJfZmx1c2hfYmxvY2socywgKHMtPmJsb2NrX3N0YXJ0ID49IDBMID8gXAorICAgICAgICAgICAgICAgICAgIChjaGFyZiAqKSZzLT53aW5kb3dbKHVuc2lnbmVkKXMtPmJsb2NrX3N0YXJ0XSA6IFwKKyAgICAgICAgICAgICAgICAgICAoY2hhcmYgKilaX05VTEwpLCBcCisgICAgICAgICAgICAgICAgKHVsZykoKGxvbmcpcy0+c3Ryc3RhcnQgLSBzLT5ibG9ja19zdGFydCksIFwKKyAgICAgICAgICAgICAgICAobGFzdCkpOyBcCisgICBzLT5ibG9ja19zdGFydCA9IHMtPnN0cnN0YXJ0OyBcCisgICBmbHVzaF9wZW5kaW5nKHMtPnN0cm0pOyBcCisgICBUcmFjZXYoKHN0ZGVyciwiW0ZMVVNIXSIpKTsgXAorfQorCisvKiBTYW1lIGJ1dCBmb3JjZSBwcmVtYXR1cmUgZXhpdCBpZiBuZWNlc3NhcnkuICovCisjZGVmaW5lIEZMVVNIX0JMT0NLKHMsIGxhc3QpIHsgXAorICAgRkxVU0hfQkxPQ0tfT05MWShzLCBsYXN0KTsgXAorICAgaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSByZXR1cm4gKGxhc3QpID8gZmluaXNoX3N0YXJ0ZWQgOiBuZWVkX21vcmU7IFwKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IHdpdGhvdXQgY29tcHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybgorICogdGhlIGN1cnJlbnQgYmxvY2sgc3RhdGUuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZQorICogdW5jb21wcmVzc2libGUgZGF0YSBpcyBwcm9iYWJseSBub3QgdXNlZnVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQKKyAqIG9ubHkgZm9yIHRoZSBsZXZlbD0wIGNvbXByZXNzaW9uIG9wdGlvbi4KKyAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb20KKyAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi4KKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWQKKyAgICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjoKKyAgICAgKi8KKyAgICB1bGcgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7CisgICAgdWxnIG1heF9zdGFydDsKKworICAgIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7CisgICAgICAgIG1heF9ibG9ja19zaXplID0gcy0+cGVuZGluZ19idWZfc2l6ZSAtIDU7CisgICAgfQorCisgICAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPD0gMSkgeworCisgICAgICAgICAgICBBc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHwKKyAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsICJzbGlkZSB0b28gbGF0ZSIpOworCisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSByZXR1cm4gbmVlZF9tb3JlOworCisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisgICAgICAgIEFzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgImJsb2NrIGdvbmUiKTsKKworICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7CisgICAgICAgIHMtPmxvb2thaGVhZCA9IDA7CisKKyAgICAgICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovCisgICAgICAgIG1heF9zdGFydCA9IHMtPmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7CisgICAgICAgIGlmIChzLT5zdHJzdGFydCA9PSAwIHx8ICh1bGcpcy0+c3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7CisgICAgICAgICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqLworICAgICAgICAgICAgcy0+bG9va2FoZWFkID0gKHVJbnQpKHMtPnN0cnN0YXJ0IC0gbWF4X3N0YXJ0KTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0ID0gKHVJbnQpbWF4X3N0YXJ0OworICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgICAgIH0KKyAgICAgICAgLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lCisgICAgICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6CisgICAgICAgICAqLworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgLSAodUludClzLT5ibG9ja19zdGFydCA+PSBNQVhfRElTVChzKSkgeworICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOworICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50CisgKiBibG9jayBzdGF0ZS4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0cworICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0CisgKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuCisgKi8KK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBmbHVzaDsKK3sKKyAgICBJUG9zIGhhc2hfaGVhZDsgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqLworICAgIGludCBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0CisgICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCisgICAgICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZQorICAgICAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKKyAgICAgICAgICovCisgICAgICAgIGhhc2hfaGVhZCA9IE5JTDsKKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorICAgICAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKKyAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LCBzLT5tYXRjaF9zdGFydCwgcy0+bWF0Y2hfbGVuZ3RoKTsKKworICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3Qocywgcy0+c3Ryc3RhcnQgLSBzLT5tYXRjaF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsKKworICAgICAgICAgICAgcy0+bG9va2FoZWFkIC09IHMtPm1hdGNoX2xlbmd0aDsKKworICAgICAgICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aAorICAgICAgICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KKyAgICAgICAgICAgICAqLworI2lmbmRlZiBGQVNURVNUCisgICAgICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoIDw9IHMtPm1heF9pbnNlcnRfbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgcy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aC0tOyAvKiBzdHJpbmcgYXQgc3Ryc3RhcnQgYWxyZWFkeSBpbiB0YWJsZSAqLworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZQorICAgICAgICAgICAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXMtPm1hdGNoX2xlbmd0aCAhPSAwKTsKKyAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5tYXRjaF9sZW5ndGg7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1tzLT5zdHJzdGFydF07CisgICAgICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzLT5zdHJzdGFydCsxXSk7CisjaWYgTUlOX01BVENIICE9IDMKKyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lcworI2VuZGlmCisgICAgICAgICAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgKiBtYXR0ZXIgc2luY2UgaXQgd2lsbCBiZSByZWNvbXB1dGVkIGF0IG5leHQgZGVmbGF0ZSBjYWxsLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKKyAgICAgICAgICAgIF90cl90YWxseV9saXQgKHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0sIGJmbHVzaCk7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisgICAgfQorICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKKyAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7Cit9CisKKyNpZm5kZWYgRkFTVEVTVAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTYW1lIGFzIGFib3ZlLCBidXQgYWNoaWV2ZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBXZSB1c2UgYSBsYXp5CisgKiBldmFsdWF0aW9uIGZvciBtYXRjaGVzOiBhIG1hdGNoIGlzIGZpbmFsbHkgYWRvcHRlZCBvbmx5IGlmIHRoZXJlIGlzCisgKiBubyBiZXR0ZXIgbWF0Y2ggYXQgdGhlIG5leHQgd2luZG93IHBvc2l0aW9uLgorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3cocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgSVBvcyBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqLworICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KKworICAgIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0CisgICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCisgICAgICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZQorICAgICAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKKyAgICAgICAgICovCisgICAgICAgIGhhc2hfaGVhZCA9IE5JTDsKKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorICAgICAgICAgKi8KKyAgICAgICAgcy0+cHJldl9sZW5ndGggPSBzLT5tYXRjaF9sZW5ndGgsIHMtPnByZXZfbWF0Y2ggPSBzLT5tYXRjaF9zdGFydDsKKyAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisKKyAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+cHJldl9sZW5ndGggPCBzLT5tYXhfbGF6eV9tYXRjaCAmJgorICAgICAgICAgICAgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKKyAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisKKyAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gNSAmJiAocy0+c3RyYXRlZ3kgPT0gWl9GSUxURVJFRAorI2lmIFRPT19GQVIgPD0gMzI3NjcKKyAgICAgICAgICAgICAgICB8fCAocy0+bWF0Y2hfbGVuZ3RoID09IE1JTl9NQVRDSCAmJgorICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0ID4gVE9PX0ZBUikKKyNlbmRpZgorICAgICAgICAgICAgICAgICkpIHsKKworICAgICAgICAgICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKKyAgICAgICAgICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAorICAgICAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLT5tYXRjaF9sZW5ndGggPD0gcy0+cHJldl9sZW5ndGgpIHsKKyAgICAgICAgICAgIHVJbnQgbWF4X2luc2VydCA9IHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIC0gTUlOX01BVENIOworICAgICAgICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovCisKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LTEsIHMtPnByZXZfbWF0Y2gsIHMtPnByZXZfbGVuZ3RoKTsKKworICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3Qocywgcy0+c3Ryc3RhcnQgLTEgLSBzLT5wcmV2X21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisKKyAgICAgICAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgorICAgICAgICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdAorICAgICAgICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpbgorICAgICAgICAgICAgICogdGhlIGhhc2ggdGFibGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5wcmV2X2xlbmd0aC0xOworICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLT0gMjsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAoKytzLT5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5wcmV2X2xlbmd0aCAhPSAwKTsKKyAgICAgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisKKyAgICAgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworCisgICAgICAgIH0gZWxzZSBpZiAocy0+bWF0Y2hfYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYQorICAgICAgICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaAorICAgICAgICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOworICAgICAgICAgICAgX3RyX3RhbGx5X2xpdChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0sIGJmbHVzaCk7CisgICAgICAgICAgICBpZiAoYmZsdXNoKSB7CisgICAgICAgICAgICAgICAgRkxVU0hfQkxPQ0tfT05MWShzLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3IKKyAgICAgICAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAxOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgIm5vIGZsdXNoPyIpOworICAgIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKKyAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOworICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKKyAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICB9CisgICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOworICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKK30KKyNlbmRpZiAvKiBGQVNURVNUICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRm9yIFpfUkxFLCBzaW1wbHkgbG9vayBmb3IgcnVucyBvZiBieXRlcywgZ2VuZXJhdGUgbWF0Y2hlcyBvbmx5IG9mIGRpc3RhbmNlCisgKiBvbmUuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLiAgKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YKKyAqIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIFpfUkxFLikKKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9ybGUocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisgICAgdUludCBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi8KKyAgICBCeXRlZiAqc2NhbiwgKnN0cmVuZDsgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIGxvbmdlc3QgZW5jb2RhYmxlIHJ1bi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNQVhfTUFUQ0gpIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1BWF9NQVRDSCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKworICAgICAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqLworICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLT5zdHJzdGFydCA+IDApIHsKKyAgICAgICAgICAgIHNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCAtIDE7CisgICAgICAgICAgICBwcmV2ID0gKnNjYW47CisgICAgICAgICAgICBpZiAocHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4pIHsKKyAgICAgICAgICAgICAgICBzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAocHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworICAgICAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPiBzLT5sb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IHMtPmxvb2thaGVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi8KKyAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LCBzLT5zdHJzdGFydCAtIDEsIHMtPm1hdGNoX2xlbmd0aCk7CisKKyAgICAgICAgICAgIF90cl90YWxseV9kaXN0KHMsIDEsIHMtPm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsKKworICAgICAgICAgICAgcy0+bG9va2FoZWFkIC09IHMtPm1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPm1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOworICAgICAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICB9CisgICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOworICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGb3IgWl9IVUZGTUFOX09OTFksIGRvIG5vdCBsb29rIGZvciBtYXRjaGVzLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4KKyAqIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIEh1ZmZtYW4uKQorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2h1ZmYocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBsaXRlcmFsIHRvIHdyaXRlLiAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfTk9fRkxVU0gpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOworICAgICAgICBfdHJfdGFsbHlfbGl0IChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdLCBiZmx1c2gpOworICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisgICAgfQorICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKKyAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWIvemxpYi9kZWZsYXRlLmggYi9jb20zMi9saWIvemxpYi9kZWZsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljZjRjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL2RlZmxhdGUuaApAQCAtMCwwICsxLDM0MiBAQAorLyogZGVmbGF0ZS5oIC0tIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMCBKZWFuLWxvdXAgR2FpbGx5CisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaWZuZGVmIERFRkxBVEVfSAorI2RlZmluZSBERUZMQVRFX0gKKworI2luY2x1ZGUgInp1dGlsLmgiCisKKy8qIGRlZmluZSBOT19HWklQIHdoZW4gY29tcGlsaW5nIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGNyZWF0aW9uIGJ5IGRlZmxhdGUoKS4gIE5PX0daSVAgd291bGQgYmUgdXNlZCB0byBhdm9pZCBsaW5raW5nIGluCisgICB0aGUgY3JjIGNvZGUgd2hlbiBpdCBpcyBub3QgbmVlZGVkLiAgRm9yIHNoYXJlZCBsaWJyYXJpZXMsIGd6aXAgZW5jb2RpbmcKKyAgIHNob3VsZCBiZSBsZWZ0IGVuYWJsZWQuICovCisjaWZuZGVmIE5PX0daSVAKKyMgIGRlZmluZSBHWklQCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4KKyAqLworCisjZGVmaW5lIExFTkdUSF9DT0RFUyAyOQorLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgTElURVJBTFMgIDI1NgorLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovCisKKyNkZWZpbmUgTF9DT0RFUyAoTElURVJBTFMrMStMRU5HVEhfQ09ERVMpCisvKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi8KKworI2RlZmluZSBEX0NPREVTICAgMzAKKy8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworCisjZGVmaW5lIEJMX0NPREVTICAxOQorLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovCisKKyNkZWZpbmUgSEVBUF9TSVpFICgyKkxfQ09ERVMrMSkKKy8qIG1heGltdW0gaGVhcCBzaXplICovCisKKyNkZWZpbmUgTUFYX0JJVFMgMTUKKy8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqLworCisjZGVmaW5lIElOSVRfU1RBVEUgICAgNDIKKyNkZWZpbmUgRVhUUkFfU1RBVEUgICA2OQorI2RlZmluZSBOQU1FX1NUQVRFICAgIDczCisjZGVmaW5lIENPTU1FTlRfU1RBVEUgOTEKKyNkZWZpbmUgSENSQ19TVEFURSAgIDEwMworI2RlZmluZSBCVVNZX1NUQVRFICAgMTEzCisjZGVmaW5lIEZJTklTSF9TVEFURSA2NjYKKy8qIFN0cmVhbSBzdGF0dXMgKi8KKworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2luZ2xlIHZhbHVlIGFuZCBpdHMgY29kZSBzdHJpbmcuICovCit0eXBlZGVmIHN0cnVjdCBjdF9kYXRhX3MgeworICAgIHVuaW9uIHsKKyAgICAgICAgdXNoICBmcmVxOyAgICAgICAvKiBmcmVxdWVuY3kgY291bnQgKi8KKyAgICAgICAgdXNoICBjb2RlOyAgICAgICAvKiBiaXQgc3RyaW5nICovCisgICAgfSBmYzsKKyAgICB1bmlvbiB7CisgICAgICAgIHVzaCAgZGFkOyAgICAgICAgLyogZmF0aGVyIG5vZGUgaW4gSHVmZm1hbiB0cmVlICovCisgICAgICAgIHVzaCAgbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIGJpdCBzdHJpbmcgKi8KKyAgICB9IGRsOworfSBGQVIgY3RfZGF0YTsKKworI2RlZmluZSBGcmVxIGZjLmZyZXEKKyNkZWZpbmUgQ29kZSBmYy5jb2RlCisjZGVmaW5lIERhZCAgZGwuZGFkCisjZGVmaW5lIExlbiAgZGwubGVuCisKK3R5cGVkZWYgc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyAgc3RhdGljX3RyZWVfZGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgdHJlZV9kZXNjX3MgeworICAgIGN0X2RhdGEgKmR5bl90cmVlOyAgICAgICAgICAgLyogdGhlIGR5bmFtaWMgdHJlZSAqLworICAgIGludCAgICAgbWF4X2NvZGU7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisgICAgc3RhdGljX3RyZWVfZGVzYyAqc3RhdF9kZXNjOyAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqLworfSBGQVIgdHJlZV9kZXNjOworCit0eXBlZGVmIHVzaCBQb3M7Cit0eXBlZGVmIFBvcyBGQVIgUG9zZjsKK3R5cGVkZWYgdW5zaWduZWQgSVBvczsKKworLyogQSBQb3MgaXMgYW4gaW5kZXggaW4gdGhlIGNoYXJhY3RlciB3aW5kb3cuIFdlIHVzZSBzaG9ydCBpbnN0ZWFkIG9mIGludCB0bworICogc2F2ZSBzcGFjZSBpbiB0aGUgdmFyaW91cyB0YWJsZXMuIElQb3MgaXMgdXNlZCBvbmx5IGZvciBwYXJhbWV0ZXIgcGFzc2luZy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7CisgICAgel9zdHJlYW1wIHN0cm07ICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi8KKyAgICBpbnQgICBzdGF0dXM7ICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovCisgICAgQnl0ZWYgKnBlbmRpbmdfYnVmOyAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi8KKyAgICB1bGcgICBwZW5kaW5nX2J1Zl9zaXplOyAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovCisgICAgQnl0ZWYgKnBlbmRpbmdfb3V0OyAgLyogbmV4dCBwZW5kaW5nIGJ5dGUgdG8gb3V0cHV0IHRvIHRoZSBzdHJlYW0gKi8KKyAgICB1SW50ICAgcGVuZGluZzsgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi8KKyAgICBpbnQgICB3cmFwOyAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovCisgICAgZ3pfaGVhZGVycCAgZ3poZWFkOyAgLyogZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gdG8gd3JpdGUgKi8KKyAgICB1SW50ICAgZ3ppbmRleDsgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqLworICAgIEJ5dGUgIG1ldGhvZDsgICAgICAgIC8qIFNUT1JFRCAoZm9yIHppcCBvbmx5KSBvciBERUZMQVRFRCAqLworICAgIGludCAgIGxhc3RfZmx1c2g7ICAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi8KKworICAgICAgICAgICAgICAgIC8qIHVzZWQgYnkgZGVmbGF0ZS5jOiAqLworCisgICAgdUludCAgd19zaXplOyAgICAgICAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovCisgICAgdUludCAgd19iaXRzOyAgICAgICAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovCisgICAgdUludCAgd19tYXNrOyAgICAgICAgLyogd19zaXplIC0gMSAqLworCisgICAgQnl0ZWYgKndpbmRvdzsKKyAgICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdywKKyAgICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZQorICAgICAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2YKKyAgICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXMKKyAgICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4gQWxzbywgaXQgbGltaXRzCisgICAgICogdGhlIHdpbmRvdyBzaXplIHRvIDY0Sywgd2hpY2ggaXMgcXVpdGUgdXNlZnVsIG9uIE1TRE9TLgorICAgICAqIFRvIGRvOiB1c2UgdGhlIHVzZXIgaW5wdXQgYnVmZmVyIGFzIHNsaWRpbmcgd2luZG93LgorICAgICAqLworCisgICAgdWxnIHdpbmRvd19zaXplOworICAgIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyCisgICAgICogaXMgZGlyZWN0bHkgdXNlZCBhcyBzbGlkaW5nIHdpbmRvdy4KKyAgICAgKi8KKworICAgIFBvc2YgKnByZXY7CisgICAgLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXMKKyAgICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLgorICAgICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLgorICAgICAqLworCisgICAgUG9zZiAqaGVhZDsgLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIE5JTC4gKi8KKworICAgIHVJbnQgIGluc19oOyAgICAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqLworICAgIHVJbnQgIGhhc2hfc2l6ZTsgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqLworICAgIHVJbnQgIGhhc2hfYml0czsgICAgICAvKiBsb2cyKGhhc2hfc2l6ZSkgKi8KKyAgICB1SW50ICBoYXNoX21hc2s7ICAgICAgLyogaGFzaF9zaXplLTEgKi8KKworICAgIHVJbnQgIGhhc2hfc2hpZnQ7CisgICAgLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggbXVzdCBiZSBzaGlmdGVkIGF0IGVhY2ggaW5wdXQKKyAgICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3QKKyAgICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczoKKyAgICAgKiAgIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzCisgICAgICovCisKKyAgICBsb25nIGJsb2NrX3N0YXJ0OworICAgIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0cworICAgICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuCisgICAgICovCisKKyAgICB1SW50IG1hdGNoX2xlbmd0aDsgICAgICAgICAgIC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovCisgICAgSVBvcyBwcmV2X21hdGNoOyAgICAgICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqLworICAgIGludCBtYXRjaF9hdmFpbGFibGU7ICAgICAgICAgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqLworICAgIHVJbnQgc3Ryc3RhcnQ7ICAgICAgICAgICAgICAgLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqLworICAgIHVJbnQgbWF0Y2hfc3RhcnQ7ICAgICAgICAgICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovCisgICAgdUludCBsb29rYWhlYWQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovCisKKyAgICB1SW50IHByZXZfbGVuZ3RoOworICAgIC8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpcworICAgICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLgorICAgICAqLworCisgICAgdUludCBtYXhfY2hhaW5fbGVuZ3RoOworICAgIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzCisgICAgICogbGVuZ3RoLiAgQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZQorICAgICAqIHNwZWVkLgorICAgICAqLworCisgICAgdUludCBtYXhfbGF6eV9tYXRjaDsKKyAgICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5CisgICAgICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24KKyAgICAgKiBsZXZlbHMgPj0gNC4KKyAgICAgKi8KKyMgICBkZWZpbmUgbWF4X2luc2VydF9sZW5ndGggIG1heF9sYXp5X21hdGNoCisgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QKKyAgICAgKiBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCisgICAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy4KKyAgICAgKi8KKworICAgIGludCBsZXZlbDsgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovCisgICAgaW50IHN0cmF0ZWd5OyAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovCisKKyAgICB1SW50IGdvb2RfbWF0Y2g7CisgICAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovCisKKyAgICBpbnQgbmljZV9tYXRjaDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqLworCisgICAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqLworICAgIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHJlc3MgY29tcGlsZXIgd2FybmluZyAqLworICAgIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi8KKworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBsX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqLworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBkX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgYmxfZGVzYzsgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi8KKworICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKKyAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworICAgIGludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi8KKyAgICBpbnQgaGVhcF9sZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgaW50IGhlYXBfbWF4OyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KKyAgICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuCisgICAgICovCisKKyAgICB1Y2ggZGVwdGhbMipMX0NPREVTKzFdOworICAgIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kKKyAgICAgKi8KKworICAgIHVjaGYgKmxfYnVmOyAgICAgICAgICAvKiBidWZmZXIgZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi8KKworICAgIHVJbnQgIGxpdF9idWZzaXplOworICAgIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3IKKyAgICAgKiBsaW1pdGluZyBsaXRfYnVmc2l6ZSB0byA2NEs6CisgICAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVycworICAgICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXQKKyAgICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW4KKyAgICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3IKKyAgICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCisgICAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuCisgICAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS4KKyAgICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuCisgICAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAorICAgICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yCisgICAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQorICAgICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZQorICAgICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmcKKyAgICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LgorICAgICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKKyAgICAgKi8KKworICAgIHVJbnQgbGFzdF9saXQ7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworCisgICAgdXNoZiAqZF9idWY7CisgICAgLyogQnVmZmVyIGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZQorICAgICAqIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy4gVG8gdXNlIGRpZmZlcmVudCBsZW5ndGhzLCBhbiBleHRyYSBmbGFnCisgICAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LgorICAgICAqLworCisgICAgdWxnIG9wdF9sZW47ICAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovCisgICAgdWxnIHN0YXRpY19sZW47ICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi8KKyAgICB1SW50IG1hdGNoZXM7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovCisgICAgaW50IGxhc3RfZW9iX2xlbjsgICAvKiBiaXQgbGVuZ3RoIG9mIEVPQiBjb2RlIGZvciBsYXN0IGJsb2NrICovCisKKyNpZmRlZiBERUJVR19aTElCCisgICAgdWxnIGNvbXByZXNzZWRfbGVuOyAvKiB0b3RhbCBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZmlsZSBtb2QgMl4zMiAqLworICAgIHVsZyBiaXRzX3NlbnQ7ICAgICAgLyogYml0IGxlbmd0aCBvZiBjb21wcmVzc2VkIGRhdGEgc2VudCBtb2QgMl4zMiAqLworI2VuZGlmCisKKyAgICB1c2ggYmlfYnVmOworICAgIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0CisgICAgICogc2lnbmlmaWNhbnQgYml0cykuCisgICAgICovCisgICAgaW50IGJpX3ZhbGlkOworICAgIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdAorICAgICAqIGFyZSBhbHdheXMgemVyby4KKyAgICAgKi8KKworICAgIHVsZyBoaWdoX3dhdGVyOworICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZQorICAgICAqIHRoaXMgYXJlIHNldCB0byB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayB3YXJuaW5ncyB3aGVuCisgICAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW4KKyAgICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLgorICAgICAqLworCit9IEZBUiBkZWZsYXRlX3N0YXRlOworCisvKiBPdXRwdXQgYSBieXRlIG9uIHRoZSBzdHJlYW0uCisgKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdfYnVmLgorICovCisjZGVmaW5lIHB1dF9ieXRlKHMsIGMpIHtzLT5wZW5kaW5nX2J1ZltzLT5wZW5kaW5nKytdID0gKGMpO30KKworCisjZGVmaW5lIE1JTl9MT09LQUhFQUQgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkKKy8qIE1pbmltdW0gYW1vdW50IG9mIGxvb2thaGVhZCwgZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCisgKiBTZWUgZGVmbGF0ZS5jIGZvciBjb21tZW50cyBhYm91dCB0aGUgTUlOX01BVENIKzEuCisgKi8KKworI2RlZmluZSBNQVhfRElTVChzKSAgKChzKS0+d19zaXplLU1JTl9MT09LQUhFQUQpCisvKiBJbiBvcmRlciB0byBzaW1wbGlmeSB0aGUgY29kZSwgcGFydGljdWxhcmx5IG9uIDE2IGJpdCBtYWNoaW5lcywgbWF0Y2gKKyAqIGRpc3RhbmNlcyBhcmUgbGltaXRlZCB0byBNQVhfRElTVCBpbnN0ZWFkIG9mIFdTSVpFLgorICovCisKKyNkZWZpbmUgV0lOX0lOSVQgTUFYX01BVENICisvKiBOdW1iZXIgb2YgYnl0ZXMgYWZ0ZXIgZW5kIG9mIGRhdGEgaW4gd2luZG93IHRvIGluaXRpYWxpemUgaW4gb3JkZXIgdG8gYXZvaWQKKyAgIG1lbW9yeSBjaGVja2VyIGVycm9ycyBmcm9tIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMgKi8KKworICAgICAgICAvKiBpbiB0cmVlcy5jICovCit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2luaXQgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2ludCBaTElCX0lOVEVSTkFMIF90cl90YWxseSBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdW5zaWduZWQgZGlzdCwgdW5zaWduZWQgbGMpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfZmx1c2hfYmxvY2sgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB1bGcgc3RvcmVkX2xlbiwgaW50IGxhc3QpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfYWxpZ24gT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfc3RvcmVkX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdWxnIHN0b3JlZF9sZW4sIGludCBsYXN0KSk7CisKKyNkZWZpbmUgZF9jb2RlKGRpc3QpIFwKKyAgICgoZGlzdCkgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYrKChkaXN0KT4+NyldKQorLyogTWFwcGluZyBmcm9tIGEgZGlzdGFuY2UgdG8gYSBkaXN0YW5jZSBjb2RlLiBkaXN0IGlzIHRoZSBkaXN0YW5jZSAtIDEgYW5kCisgKiBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy4gX2Rpc3RfY29kZVsyNTZdIGFuZCBfZGlzdF9jb2RlWzI1N10gYXJlIG5ldmVyCisgKiB1c2VkLgorICovCisKKyNpZm5kZWYgREVCVUdfWkxJQgorLyogSW5saW5lIHZlcnNpb25zIG9mIF90cl90YWxseSBmb3Igc3BlZWQ6ICovCisKKyNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQorICBleHRlcm4gdWNoIFpMSUJfSU5URVJOQUwgX2xlbmd0aF9jb2RlW107CisgIGV4dGVybiB1Y2ggWkxJQl9JTlRFUk5BTCBfZGlzdF9jb2RlW107CisjZWxzZQorICBleHRlcm4gY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2xlbmd0aF9jb2RlW107CisgIGV4dGVybiBjb25zdCB1Y2ggWkxJQl9JTlRFUk5BTCBfZGlzdF9jb2RlW107CisjZW5kaWYKKworIyBkZWZpbmUgX3RyX3RhbGx5X2xpdChzLCBjLCBmbHVzaCkgXAorICB7IHVjaCBjYyA9IChjKTsgXAorICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9IDA7IFwKKyAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9IGNjOyBcCisgICAgcy0+ZHluX2x0cmVlW2NjXS5GcmVxKys7IFwKKyAgICBmbHVzaCA9IChzLT5sYXN0X2xpdCA9PSBzLT5saXRfYnVmc2l6ZS0xKTsgXAorICAgfQorIyBkZWZpbmUgX3RyX3RhbGx5X2Rpc3QocywgZGlzdGFuY2UsIGxlbmd0aCwgZmx1c2gpIFwKKyAgeyB1Y2ggbGVuID0gKGxlbmd0aCk7IFwKKyAgICB1c2ggZGlzdCA9IChkaXN0YW5jZSk7IFwKKyAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSBkaXN0OyBcCisgICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSBsZW47IFwKKyAgICBkaXN0LS07IFwKKyAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xlbl0rTElURVJBTFMrMV0uRnJlcSsrOyBcCisgICAgcy0+ZHluX2R0cmVlW2RfY29kZShkaXN0KV0uRnJlcSsrOyBcCisgICAgZmx1c2ggPSAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7IFwKKyAgfQorI2Vsc2UKKyMgZGVmaW5lIF90cl90YWxseV9saXQocywgYywgZmx1c2gpIGZsdXNoID0gX3RyX3RhbGx5KHMsIDAsIGMpCisjIGRlZmluZSBfdHJfdGFsbHlfZGlzdChzLCBkaXN0YW5jZSwgbGVuZ3RoLCBmbHVzaCkgXAorICAgICAgICAgICAgICBmbHVzaCA9IF90cl90YWxseShzLCBkaXN0YW5jZSwgbGVuZ3RoKQorI2VuZGlmCisKKyNlbmRpZiAvKiBERUZMQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi96bGliL2luZmJhY2suYyBiL2NvbTMyL2xpYi96bGliL2luZmJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjNhOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3psaWIvaW5mYmFjay5jCkBAIC0wLDAgKzEsNjMyIEBACisvKiBpbmZiYWNrLmMgLS0gaW5mbGF0ZSB1c2luZyBhIGNhbGwtYmFjayBpbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA5IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICAgVGhpcyBjb2RlIGlzIGxhcmdlbHkgY29waWVkIGZyb20gaW5mbGF0ZS5jLiAgTm9ybWFsbHkgZWl0aGVyIGluZmJhY2subyBvcgorICAgaW5mbGF0ZS5vIHdvdWxkIGJlIGxpbmtlZCBpbnRvIGFuIGFwcGxpY2F0aW9uLS1ub3QgYm90aC4gIFRoZSBpbnRlcmZhY2UKKyAgIHdpdGggaW5mZmFzdC5jIGlzIHJldGFpbmVkIHNvIHRoYXQgb3B0aW1pemVkIGFzc2VtYmxlci1jb2RlZCB2ZXJzaW9ucyBvZgorICAgaW5mbGF0ZV9mYXN0KCkgY2FuIGJlIHVzZWQgd2l0aCBlaXRoZXIgaW5mbGF0ZS5jIG9yIGluZmJhY2suYy4KKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmxhdGUuaCIKKyNpbmNsdWRlICJpbmZmYXN0LmgiCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK2xvY2FsIHZvaWQgZml4ZWR0YWJsZXMgT0YoKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGUpKTsKKworLyoKKyAgIHN0cm0gcHJvdmlkZXMgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGluIHphbGxvYyBhbmQgemZyZWUsIG9yCisgICBaX05VTEwgdG8gdXNlIHRoZSBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworICAgd2luZG93Qml0cyBpcyBpbiB0aGUgcmFuZ2UgOC4uMTUsIGFuZCB3aW5kb3cgaXMgYSB1c2VyLXN1cHBsaWVkCisgICB3aW5kb3cgYW5kIG91dHB1dCBidWZmZXIgdGhhdCBpcyAyKip3aW5kb3dCaXRzIGJ5dGVzLgorICovCitpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfKHN0cm0sIHdpbmRvd0JpdHMsIHdpbmRvdywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbXAgc3RybTsKK2ludCB3aW5kb3dCaXRzOwordW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsKK2NvbnN0IGNoYXIgKnZlcnNpb247CitpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAorICAgICAgICBzdHJlYW1fc2l6ZSAhPSAoaW50KShzaXplb2Yoel9zdHJlYW0pKSkKKyAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgd2luZG93ID09IFpfTlVMTCB8fAorICAgICAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqLworICAgIGlmIChzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCkgeworICAgICAgICBzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOworICAgICAgICBzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgfQorICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApIHN0cm0tPnpmcmVlID0gemNmcmVlOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKVpBTExPQyhzdHJtLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoc3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopc3RhdGU7CisgICAgc3RhdGUtPmRtYXggPSAzMjc2OFU7CisgICAgc3RhdGUtPndiaXRzID0gd2luZG93Qml0czsKKyAgICBzdGF0ZS0+d3NpemUgPSAxVSA8PCB3aW5kb3dCaXRzOworICAgIHN0YXRlLT53aW5kb3cgPSB3aW5kb3c7CisgICAgc3RhdGUtPnduZXh0ID0gMDsKKyAgICBzdGF0ZS0+d2hhdmUgPSAwOworICAgIHJldHVybiBaX09LOworfQorCisvKgorICAgUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0bworICAgZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLgorICAgSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZQorICAgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZAorICAgdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW4KKyAgIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZQorICAgdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpbgorICAgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4KKyAqLworbG9jYWwgdm9pZCBmaXhlZHRhYmxlcyhzdGF0ZSkKK3N0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Cit7CisjaWZkZWYgQlVJTERGSVhFRAorICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsKKyAgICBzdGF0aWMgY29kZSAqbGVuZml4LCAqZGlzdGZpeDsKKyAgICBzdGF0aWMgY29kZSBmaXhlZFs1NDRdOworCisgICAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KKyAgICBpZiAodmlyZ2luKSB7CisgICAgICAgIHVuc2lnbmVkIHN5bSwgYml0czsKKyAgICAgICAgc3RhdGljIGNvZGUgKm5leHQ7CisKKyAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDE0NCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUtPmxlbnNbc3ltKytdID0gOTsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4MCkgc3RhdGUtPmxlbnNbc3ltKytdID0gNzsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4OCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgbmV4dCA9IGZpeGVkOworICAgICAgICBsZW5maXggPSBuZXh0OworICAgICAgICBiaXRzID0gOTsKKyAgICAgICAgaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7CisKKyAgICAgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDMyKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA1OworICAgICAgICBkaXN0Zml4ID0gbmV4dDsKKyAgICAgICAgYml0cyA9IDU7CisgICAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zLCAzMiwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOworCisgICAgICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovCisgICAgICAgIHZpcmdpbiA9IDA7CisgICAgfQorI2Vsc2UgLyogIUJVSUxERklYRUQgKi8KKyMgICBpbmNsdWRlICJpbmZmaXhlZC5oIgorI2VuZGlmIC8qIEJVSUxERklYRUQgKi8KKyAgICBzdGF0ZS0+bGVuY29kZSA9IGxlbmZpeDsKKyAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgc3RhdGUtPmRpc3Rjb2RlID0gZGlzdGZpeDsKKyAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA1OworfQorCisvKiBNYWNyb3MgZm9yIGluZmxhdGVCYWNrKCk6ICovCisKKy8qIExvYWQgcmV0dXJuZWQgc3RhdGUgZnJvbSBpbmZsYXRlX2Zhc3QoKSAqLworI2RlZmluZSBMT0FEKCkgXAorICAgIGRvIHsgXAorICAgICAgICBwdXQgPSBzdHJtLT5uZXh0X291dDsgXAorICAgICAgICBsZWZ0ID0gc3RybS0+YXZhaWxfb3V0OyBcCisgICAgICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOyBcCisgICAgICAgIGhhdmUgPSBzdHJtLT5hdmFpbF9pbjsgXAorICAgICAgICBob2xkID0gc3RhdGUtPmhvbGQ7IFwKKyAgICAgICAgYml0cyA9IHN0YXRlLT5iaXRzOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogU2V0IHN0YXRlIGZyb20gcmVnaXN0ZXJzIGZvciBpbmZsYXRlX2Zhc3QoKSAqLworI2RlZmluZSBSRVNUT1JFKCkgXAorICAgIGRvIHsgXAorICAgICAgICBzdHJtLT5uZXh0X291dCA9IHB1dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBsZWZ0OyBcCisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OyBcCisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsgXAorICAgICAgICBzdGF0ZS0+aG9sZCA9IGhvbGQ7IFwKKyAgICAgICAgc3RhdGUtPmJpdHMgPSBiaXRzOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBJTklUQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA9IDA7IFwKKyAgICAgICAgYml0cyA9IDA7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZS4gIElmIGlucHV0IGlzIHJlcXVlc3RlZCwgYnV0IGRlbmllZCwKKyAgIHRoZW4gcmV0dXJuIGEgWl9CVUZfRVJST1IgZnJvbSBpbmZsYXRlQmFjaygpLiAqLworI2RlZmluZSBQVUxMKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKKyAgICAgICAgICAgIGhhdmUgPSBpbihpbl9kZXNjLCAmbmV4dCk7IFwKKyAgICAgICAgICAgIGlmIChoYXZlID09IDApIHsgXAorICAgICAgICAgICAgICAgIG5leHQgPSBaX05VTEw7IFwKKyAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsgXAorICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworLyogR2V0IGEgYnl0ZSBvZiBpbnB1dCBpbnRvIHRoZSBiaXQgYWNjdW11bGF0b3IsIG9yIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkKKyAgIHdpdGggYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAqLworI2RlZmluZSBQVUxMQllURSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgUFVMTCgpOyBcCisgICAgICAgIGhhdmUtLTsgXAorICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqbmV4dCsrKSA8PCBiaXRzOyBcCisgICAgICAgIGJpdHMgKz0gODsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEFzc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJpdHMgaW4gdGhlIGJpdCBhY2N1bXVsYXRvci4gIElmIHRoZXJlIGlzCisgICBub3QgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dCB0byBkbyB0aGF0LCB0aGVuIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkgd2l0aAorICAgYW4gZXJyb3IuICovCisjZGVmaW5lIE5FRURCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCisgICAgICAgICAgICBQVUxMQllURSgpOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPCAxNikgKi8KKyNkZWZpbmUgQklUUyhuKSBcCisgICAgKCh1bnNpZ25lZClob2xkICYgKCgxVSA8PCAobikpIC0gMSkpCisKKy8qIFJlbW92ZSBuIGJpdHMgZnJvbSB0aGUgYml0IGFjY3VtdWxhdG9yICovCisjZGVmaW5lIERST1BCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gKG4pOyBcCisgICAgICAgIGJpdHMgLT0gKHVuc2lnbmVkKShuKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJlbW92ZSB6ZXJvIHRvIHNldmVuIGJpdHMgYXMgbmVlZGVkIHRvIGdvIHRvIGEgYnl0ZSBib3VuZGFyeSAqLworI2RlZmluZSBCWVRFQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gYml0cyAmIDc7IFwKKyAgICAgICAgYml0cyAtPSBiaXRzICYgNzsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEFzc3VyZSB0aGF0IHNvbWUgb3V0cHV0IHNwYWNlIGlzIGF2YWlsYWJsZSwgYnkgd3JpdGluZyBvdXQgdGhlIHdpbmRvdworICAgaWYgaXQncyBmdWxsLiAgSWYgdGhlIHdyaXRlIGZhaWxzLCByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpIHdpdGggYQorICAgWl9CVUZfRVJST1IuICovCisjZGVmaW5lIFJPT00oKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChsZWZ0ID09IDApIHsgXAorICAgICAgICAgICAgcHV0ID0gc3RhdGUtPndpbmRvdzsgXAorICAgICAgICAgICAgbGVmdCA9IHN0YXRlLT53c2l6ZTsgXAorICAgICAgICAgICAgc3RhdGUtPndoYXZlID0gbGVmdDsgXAorICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgcHV0LCBsZWZ0KSkgeyBcCisgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7IFwKKyAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKy8qCisgICBzdHJtIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgYW5kIHdpbmRvdyBidWZmZXIgb24gaW5wdXQsCisgICBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHVudXNlZCBpbnB1dCBvbiByZXR1cm4uICBGb3IgWl9EQVRBX0VSUk9SCisgICByZXR1cm5zLCBzdHJtIHdpbGwgYWxzbyBwcm92aWRlIGFuIGVycm9yIG1lc3NhZ2UuCisKKyAgIGluKCkgYW5kIG91dCgpIGFyZSB0aGUgY2FsbC1iYWNrIGlucHV0IGFuZCBvdXRwdXQgZnVuY3Rpb25zLiAgV2hlbgorICAgaW5mbGF0ZUJhY2soKSBuZWVkcyBtb3JlIGlucHV0LCBpdCBjYWxscyBpbigpLiAgV2hlbiBpbmZsYXRlQmFjaygpIGhhcworICAgZmlsbGVkIHRoZSB3aW5kb3cgd2l0aCBvdXRwdXQsIG9yIHdoZW4gaXQgY29tcGxldGVzIHdpdGggZGF0YSBpbiB0aGUKKyAgIHdpbmRvdywgaXQgY2FsbHMgb3V0KCkgdG8gd3JpdGUgb3V0IHRoZSBkYXRhLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90CisgICBjaGFuZ2UgdGhlIHByb3ZpZGVkIGlucHV0IHVudGlsIGluKCkgaXMgY2FsbGVkIGFnYWluIG9yIGluZmxhdGVCYWNrKCkKKyAgIHJldHVybnMuICBUaGUgYXBwbGljYXRpb24gbXVzdCBub3QgY2hhbmdlIHRoZSB3aW5kb3cvb3V0cHV0IGJ1ZmZlciB1bnRpbAorICAgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgorCisgICBpbigpIGFuZCBvdXQoKSBhcmUgY2FsbGVkIHdpdGggYSBkZXNjcmlwdG9yIHBhcmFtZXRlciBwcm92aWRlZCBpbiB0aGUKKyAgIGluZmxhdGVCYWNrKCkgY2FsbC4gIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHN0cnVjdHVyZSB0aGF0IHByb3ZpZGVzIHRoZQorICAgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gZG8gdGhlIHJlYWQgb3Igd3JpdGUsIGFzIHdlbGwgYXMgYWNjdW11bGF0ZWQKKyAgIGluZm9ybWF0aW9uIG9uIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN1Y2ggYXMgdG90YWxzIGFuZCBjaGVjayB2YWx1ZXMuCisKKyAgIGluKCkgc2hvdWxkIHJldHVybiB6ZXJvIG9uIGZhaWx1cmUuICBvdXQoKSBzaG91bGQgcmV0dXJuIG5vbi16ZXJvIG9uCisgICBmYWlsdXJlLiAgSWYgZWl0aGVyIGluKCkgb3Igb3V0KCkgZmFpbHMsIHRoYW4gaW5mbGF0ZUJhY2soKSByZXR1cm5zIGEKKyAgIFpfQlVGX0VSUk9SLiAgc3RybS0+bmV4dF9pbiBjYW4gYmUgY2hlY2tlZCBmb3IgWl9OVUxMIHRvIHNlZSB3aGV0aGVyIGl0CisgICB3YXMgaW4oKSBvciBvdXQoKSB0aGF0IGNhdXNlZCBpbiB0aGUgZXJyb3IuICBPdGhlcndpc2UsICBpbmZsYXRlQmFjaygpCisgICByZXR1cm5zIFpfU1RSRUFNX0VORCBvbiBzdWNjZXNzLCBaX0RBVEFfRVJST1IgZm9yIGFuIGRlZmxhdGUgZm9ybWF0CisgICBlcnJvciwgb3IgWl9NRU1fRVJST1IgaWYgaXQgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0YXRlLgorICAgaW5mbGF0ZUJhY2soKSBjYW4gYWxzbyByZXR1cm4gWl9TVFJFQU1fRVJST1IgaWYgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAgIGFyZSBub3QgY29ycmVjdCwgaS5lLiBzdHJtIGlzIFpfTlVMTCBvciB0aGUgc3RhdGUgd2FzIG5vdCBpbml0aWFsaXplZC4KKyAqLworaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2soc3RybSwgaW4sIGluX2Rlc2MsIG91dCwgb3V0X2Rlc2MpCit6X3N0cmVhbXAgc3RybTsKK2luX2Z1bmMgaW47Cit2b2lkIEZBUiAqaW5fZGVzYzsKK291dF9mdW5jIG91dDsKK3ZvaWQgRkFSICpvdXRfZGVzYzsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgaGF2ZSwgbGVmdDsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgY29weTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpmcm9tOyAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi8KKyAgICBjb2RlIGhlcmU7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqLworICAgIGNvZGUgbGFzdDsgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqLworICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RybSBleGlzdHMgYW5kIHRoYXQgdGhlIHN0YXRlIHdhcyBpbml0aWFsaXplZCAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKworICAgIC8qIFJlc2V0IHRoZSBzdGF0ZSAqLworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKKyAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgc3RhdGUtPmxhc3QgPSAwOworICAgIHN0YXRlLT53aGF2ZSA9IDA7CisgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47CisgICAgaGF2ZSA9IG5leHQgIT0gWl9OVUxMID8gc3RybS0+YXZhaWxfaW4gOiAwOworICAgIGhvbGQgPSAwOworICAgIGJpdHMgPSAwOworICAgIHB1dCA9IHN0YXRlLT53aW5kb3c7CisgICAgbGVmdCA9IHN0YXRlLT53c2l6ZTsKKworICAgIC8qIEluZmxhdGUgdW50aWwgZW5kIG9mIGJsb2NrIG1hcmtlZCBhcyBsYXN0ICovCisgICAgZm9yICg7OykKKyAgICAgICAgc3dpdGNoIChzdGF0ZS0+bW9kZSkgeworICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgYW5kIGRpc3BhdGNoIGJsb2NrIHR5cGUgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGFzdCkgeworICAgICAgICAgICAgICAgIEJZVEVCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBET05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICBzdGF0ZS0+bGFzdCA9IEJJVFMoMSk7CisgICAgICAgICAgICBEUk9QQklUUygxKTsKKyAgICAgICAgICAgIHN3aXRjaCAoQklUUygyKSkgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBTVE9SRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLworICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOyAgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVEFCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBibG9jayB0eXBlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVE9SRUQ6CisgICAgICAgICAgICAvKiBnZXQgYW5kIHZlcmlmeSBzdG9yZWQgYmxvY2sgbGVuZ3RoICovCisgICAgICAgICAgICBCWVRFQklUUygpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCisgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9ICgoaG9sZCA+PiAxNikgXiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGgpKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgc3RvcmVkIGJsb2NrIGZyb20gaW5wdXQgdG8gb3V0cHV0ICovCisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgUFVMTCgpOworICAgICAgICAgICAgICAgIFJPT00oKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIGNvcHkgPSBoYXZlOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgem1lbWNweShwdXQsIG5leHQsIGNvcHkpOworICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgICAgIHB1dCArPSBjb3B5OworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUQUJMRToKKyAgICAgICAgICAgIC8qIGdldCBkeW5hbWljIHRhYmxlIGVudHJpZXMgZGVzY3JpcHRvciAqLworICAgICAgICAgICAgTkVFREJJVFMoMTQpOworICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OworICAgICAgICAgICAgRFJPUEJJVFMoNSk7CisgICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOworCisgICAgICAgICAgICAvKiBnZXQgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzIChub3QgYSB0eXBvKSAqLworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5jb2RlKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gKHVuc2lnbmVkIHNob3J0KUJJVFMoMyk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCAxOSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAwOworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDc7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSBsZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xuIikpOworCisgICAgICAgICAgICAvKiBnZXQgbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGNvZGUgbGVuZ3RocyAqLworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gaGVyZS52YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlIC0gMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVyZS52YWwgPT0gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOworCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuc1syNTZdID09IDApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzCisgICAgICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oCisgICAgICAgICAgICAgICBjb25jZXJuaW5nIHRoZSBFTk9VR0ggY29uc3RhbnRzLCB3aGljaCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzICovCisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Yml0cyA9IDY7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLCBzdGF0ZS0+bmRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYoc3RhdGUtPmRpc3RiaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG9rXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKworICAgICAgICBjYXNlIExFTjoKKyAgICAgICAgICAgIC8qIHVzZSBpbmZsYXRlX2Zhc3QoKSBpZiB3ZSBoYXZlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+d2hhdmUgPCBzdGF0ZS0+d3NpemUpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZSAtIGxlZnQ7CisgICAgICAgICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXRlLT53c2l6ZSk7CisgICAgICAgICAgICAgICAgTE9BRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnZXQgYSBsaXRlcmFsLCBsZW5ndGgsIG9yIGVuZC1vZi1ibG9jayBjb2RlICovCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmJiAoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKworICAgICAgICAgICAgLyogcHJvY2VzcyBsaXRlcmFsICovCisgICAgICAgICAgICBpZiAoaGVyZS5vcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIGhlcmUudmFsKSk7CisgICAgICAgICAgICAgICAgUk9PTSgpOworICAgICAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgZW5kIG9mIGJsb2NrICovCisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDMyKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSAqLworICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGxlbmd0aCBjb2RlIC0tIGdldCBleHRyYSBiaXRzLCBpZiBhbnkgKi8KKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBzdGF0ZS0+bGVuZ3RoKSk7CisKKyAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5kaXN0Y29kZVtCSVRTKHN0YXRlLT5kaXN0Yml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+ZGlzdGNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKworICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlIGV4dHJhIGJpdHMsIGlmIGFueSAqLworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OworICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+d3NpemUgLSAoc3RhdGUtPndoYXZlIDwgc3RhdGUtPndzaXplID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgOiAwKSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIHN0YXRlLT5vZmZzZXQpKTsKKworICAgICAgICAgICAgLyogY29weSBtYXRjaCBmcm9tIHdpbmRvdyB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBST09NKCk7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT53c2l6ZSAtIHN0YXRlLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPCBsZWZ0KSB7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgKyBjb3B5OworICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbGVmdCAtIGNvcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUtPm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHN0YXRlLT5sZW5ndGggIT0gMCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERPTkU6CisgICAgICAgICAgICAvKiBpbmZsYXRlIHN0cmVhbSB0ZXJtaW5hdGVkIHByb3Blcmx5IC0tIHdyaXRlIGxlZnRvdmVyIG91dHB1dCAqLworICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EOworICAgICAgICAgICAgaWYgKGxlZnQgPCBzdGF0ZS0+d3NpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0KG91dF9kZXNjLCBzdGF0ZS0+d2luZG93LCBzdGF0ZS0+d3NpemUgLSBsZWZ0KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKworICAgICAgICBjYXNlIEJBRDoKKyAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIGNhbid0IGhhcHBlbiwgYnV0IG1ha2VzIGNvbXBpbGVycyBoYXBweSAqLworICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRVJST1I7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgfQorCisgICAgLyogUmV0dXJuIHVudXNlZCBpbnB1dCAqLworICBpbmZfbGVhdmU6CisgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7CisgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrRW5kKHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKKyAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGVuZFxuIikpOworICAgIHJldHVybiBaX09LOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvaW5mZmFzdC5jIGIvY29tMzIvbGliL3psaWIvaW5mZmFzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWQ2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvemxpYi9pbmZmYXN0LmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwOCwgMjAxMCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisjaWZuZGVmIEFTTUlORgorCisvKiBBbGxvdyBtYWNoaW5lIGRlcGVuZGVudCBvcHRpbWl6YXRpb24gZm9yIHBvc3QtaW5jcmVtZW50IG9yIHByZS1pbmNyZW1lbnQuCisgICBCYXNlZCBvbiB0ZXN0aW5nIHRvIGRhdGUsCisgICBQcmUtaW5jcmVtZW50IHByZWZlcnJlZCBmb3I6CisgICAtIFBvd2VyUEMgRzMgKEFkbGVyKQorICAgLSBNSVBTIFI1MDAwIChSYW5kZXJzLVBlaHJzb24pCisgICBQb3N0LWluY3JlbWVudCBwcmVmZXJyZWQgZm9yOgorICAgLSBub25lCisgICBObyBtZWFzdXJhYmxlIGRpZmZlcmVuY2U6CisgICAtIFBlbnRpdW0gSUlJIChBbmRlcnNvbikKKyAgIC0gTTY4MDYwIChOaWtsKQorICovCisjaWZkZWYgUE9TVElOQworIyAgZGVmaW5lIE9GRiAwCisjICBkZWZpbmUgUFVQKGEpICooYSkrKworI2Vsc2UKKyMgIGRlZmluZSBPRkYgMQorIyAgZGVmaW5lIFBVUChhKSAqKysoYSkKKyNlbmRpZgorCisvKgorICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZworICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzCisgICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLgorICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvcgorICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZQorICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuCisKKyAgIEVudHJ5IGFzc3VtcHRpb25zOgorCisgICAgICAgIHN0YXRlLT5tb2RlID09IExFTgorICAgICAgICBzdHJtLT5hdmFpbF9pbiA+PSA2CisgICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgKKyAgICAgICAgc3RhcnQgPj0gc3RybS0+YXZhaWxfb3V0CisgICAgICAgIHN0YXRlLT5iaXRzIDwgOAorCisgICBPbiByZXR1cm4sIHN0YXRlLT5tb2RlIGlzIG9uZSBvZjoKKworICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXQKKyAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2sKKyAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGEKKworICAgTm90ZXM6CisKKyAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZQorICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsCisgICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLgorICAgICAgVGhlcmVmb3JlIGlmIHN0cm0tPmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkCisgICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLgorCisgICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4CisgICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KCkKKyAgICAgIHJlcXVpcmVzIHN0cm0tPmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3IKKyAgICAgIG91dHB1dCBzcGFjZS4KKyAqLwordm9pZCBaTElCX0lOVEVSTkFMIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkKK3pfc3RyZWFtcCBzdHJtOwordW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgY2hhciBGQVIgKmluOyAgICAgIC8qIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqbGFzdDsgICAgLyogd2hpbGUgaW4gPCBsYXN0LCBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKm91dDsgICAgIC8qIGxvY2FsIHN0cm0tPm5leHRfb3V0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKmJlZzsgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS0+bmV4dF9vdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZW5kOyAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovCisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICB1bnNpZ25lZCBkbWF4OyAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovCisjZW5kaWYKKyAgICB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd2hhdmU7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3bmV4dDsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBsb2NhbCBzdHJtLT5ob2xkICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0tPmJpdHMgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqbGNvZGU7ICAgICAgLyogbG9jYWwgc3RybS0+bGVuY29kZSAqLworICAgIGNvZGUgY29uc3QgRkFSICpkY29kZTsgICAgICAvKiBsb2NhbCBzdHJtLT5kaXN0Y29kZSAqLworICAgIHVuc2lnbmVkIGxtYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi8KKyAgICB1bnNpZ25lZCBkbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyAgICBjb2RlIGhlcmU7ICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgb3A7ICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqLworICAgIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpmcm9tOyAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi8KKworICAgIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaW4gPSBzdHJtLT5uZXh0X2luIC0gT0ZGOworICAgIGxhc3QgPSBpbiArIChzdHJtLT5hdmFpbF9pbiAtIDUpOworICAgIG91dCA9IHN0cm0tPm5leHRfb3V0IC0gT0ZGOworICAgIGJlZyA9IG91dCAtIChzdGFydCAtIHN0cm0tPmF2YWlsX291dCk7CisgICAgZW5kID0gb3V0ICsgKHN0cm0tPmF2YWlsX291dCAtIDI1Nyk7CisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICBkbWF4ID0gc3RhdGUtPmRtYXg7CisjZW5kaWYKKyAgICB3c2l6ZSA9IHN0YXRlLT53c2l6ZTsKKyAgICB3aGF2ZSA9IHN0YXRlLT53aGF2ZTsKKyAgICB3bmV4dCA9IHN0YXRlLT53bmV4dDsKKyAgICB3aW5kb3cgPSBzdGF0ZS0+d2luZG93OworICAgIGhvbGQgPSBzdGF0ZS0+aG9sZDsKKyAgICBiaXRzID0gc3RhdGUtPmJpdHM7CisgICAgbGNvZGUgPSBzdGF0ZS0+bGVuY29kZTsKKyAgICBkY29kZSA9IHN0YXRlLT5kaXN0Y29kZTsKKyAgICBsbWFzayA9ICgxVSA8PCBzdGF0ZS0+bGVuYml0cykgLSAxOworICAgIGRtYXNrID0gKDFVIDw8IHN0YXRlLT5kaXN0Yml0cykgLSAxOworCisgICAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoCisgICAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi8KKyAgICBkbyB7CisgICAgICAgIGlmIChiaXRzIDwgMTUpIHsKKyAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICB9CisgICAgICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdOworICAgICAgZG9sZW46CisgICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLmJpdHMpOworICAgICAgICBob2xkID4+PSBvcDsKKyAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgb3AgPSAodW5zaWduZWQpKGhlcmUub3ApOworICAgICAgICBpZiAob3AgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6CisgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCBoZXJlLnZhbCkpOworICAgICAgICAgICAgUFVQKG91dCkgPSAodW5zaWduZWQgY2hhcikoaGVyZS52YWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqLworICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShoZXJlLnZhbCk7CisgICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLworICAgICAgICAgICAgaWYgKG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgeworICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbiArPSAodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgb3ApIC0gMSk7CisgICAgICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBsZW4pKTsKKyAgICAgICAgICAgIGlmIChiaXRzIDwgMTUpIHsKKyAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdOworICAgICAgICAgIGRvZGlzdDoKKyAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLmJpdHMpOworICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICBiaXRzIC09IG9wOworICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKGhlcmUub3ApOworICAgICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqLworICAgICAgICAgICAgICAgIGRpc3QgPSAodW5zaWduZWQpKGhlcmUudmFsKTsKKyAgICAgICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovCisgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgeworICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlzdCArPSAodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgb3ApIC0gMSk7CisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBkaXN0KSk7CisgICAgICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKG91dCAtIGJlZyk7ICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+c2FuZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlOworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHdpbmRvdyAtIE9GRjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHduZXh0ID09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wIC09IHduZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gd2luZG93IC0gT0ZGOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDM7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgICAgICBoZXJlID0gZGNvZGVbaGVyZS52YWwgKyAoaG9sZCAmICgoMVUgPDwgb3ApIC0gMSkpXTsKKyAgICAgICAgICAgICAgICBnb3RvIGRvZGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqLworICAgICAgICAgICAgaGVyZSA9IGxjb2RlW2hlcmUudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07CisgICAgICAgICAgICBnb3RvIGRvbGVuOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi8KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAoaW4gPCBsYXN0ICYmIG91dCA8IGVuZCk7CisKKyAgICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi8KKyAgICBsZW4gPSBiaXRzID4+IDM7CisgICAgaW4gLT0gbGVuOworICAgIGJpdHMgLT0gbGVuIDw8IDM7CisgICAgaG9sZCAmPSAoMVUgPDwgYml0cykgLSAxOworCisgICAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi8KKyAgICBzdHJtLT5uZXh0X2luID0gaW4gKyBPRkY7CisgICAgc3RybS0+bmV4dF9vdXQgPSBvdXQgKyBPRkY7CisgICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpKGluIDwgbGFzdCA/IDUgKyAobGFzdCAtIGluKSA6IDUgLSAoaW4gLSBsYXN0KSk7CisgICAgc3RybS0+YXZhaWxfb3V0ID0gKHVuc2lnbmVkKShvdXQgPCBlbmQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU3ICsgKGVuZCAtIG91dCkgOiAyNTcgLSAob3V0IC0gZW5kKSk7CisgICAgc3RhdGUtPmhvbGQgPSBob2xkOworICAgIHN0YXRlLT5iaXRzID0gYml0czsKKyAgICByZXR1cm47Cit9CisKKy8qCisgICBpbmZsYXRlX2Zhc3QoKSBzcGVlZHVwcyB0aGF0IHR1cm5lZCBvdXQgc2xvd2VyIChvbiBhIFBvd2VyUEMgRzMgNzUwQ1hlKToKKyAgIC0gVXNpbmcgYml0IGZpZWxkcyBmb3IgY29kZSBzdHJ1Y3R1cmUKKyAgIC0gRGlmZmVyZW50IG9wIGRlZmluaXRpb24gdG8gYXZvaWQgJiBmb3IgZXh0cmEgYml0cyAoZG8gJiBmb3IgdGFibGUgYml0cykKKyAgIC0gVGhyZWUgc2VwYXJhdGUgZGVjb2RpbmcgZG8tbG9vcHMgZm9yIGRpcmVjdCwgd2luZG93LCBhbmQgd25leHQgPT0gMAorICAgLSBTcGVjaWFsIGNhc2UgZm9yIGRpc3RhbmNlID4gMSBjb3BpZXMgdG8gZG8gb3ZlcmxhcHBlZCBsb2FkIGFuZCBzdG9yZSBjb3B5CisgICAtIEV4cGxpY2l0IGJyYW5jaCBwcmVkaWN0aW9ucyAoYmFzZWQgb24gbWVhc3VyZWQgYnJhbmNoIHByb2JhYmlsaXRpZXMpCisgICAtIERlZmVycmluZyBtYXRjaCBjb3B5IGFuZCBpbnRlcnNwZXJzZWQgaXQgd2l0aCBkZWNvZGluZyBzdWJzZXF1ZW50IGNvZGVzCisgICAtIFN3YXBwaW5nIGxpdGVyYWwvbGVuZ3RoIGVsc2UKKyAgIC0gU3dhcHBpbmcgd2luZG93L2RpcmVjdCBlbHNlCisgICAtIExhcmdlciB1bnJvbGxlZCBjb3B5IGxvb3BzICh0aHJlZSBpcyBhYm91dCByaWdodCkKKyAgIC0gTW92aW5nIGxlbiAtPSAzIHN0YXRlbWVudCBpbnRvIG1pZGRsZSBvZiBsb29wCisgKi8KKworI2VuZGlmIC8qICFBU01JTkYgKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi96bGliL2luZmZhc3QuaCBiL2NvbTMyL2xpYi96bGliL2luZmZhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWMxYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3psaWIvaW5mZmFzdC5oCkBAIC0wLDAgKzEsMTEgQEAKKy8qIGluZmZhc3QuaCAtLSBoZWFkZXIgdG8gdXNlIGluZmZhc3QuYworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMsIDIwMTAgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCit2b2lkIFpMSUJfSU5URVJOQUwgaW5mbGF0ZV9mYXN0IE9GKCh6X3N0cmVhbXAgc3RybSwgdW5zaWduZWQgc3RhcnQpKTsKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi96bGliL2luZmZpeGVkLmggYi9jb20zMi9saWIvemxpYi9pbmZmaXhlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWQ0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvemxpYi9pbmZmaXhlZC5oCkBAIC0wLDAgKzEsOTQgQEAKKyAgICAvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcworICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZCgpLgorICAgICAqLworCisgICAgLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQKKyAgICAgICBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQKKyAgICAgICBpcyBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgICAgICovCisKKyAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbNTEyXSA9IHsKKyAgICAgICAgezk2LDcsMH0sezAsOCw4MH0sezAsOCwxNn0sezIwLDgsMTE1fSx7MTgsNywzMX0sezAsOCwxMTJ9LHswLDgsNDh9LAorICAgICAgICB7MCw5LDE5Mn0sezE2LDcsMTB9LHswLDgsOTZ9LHswLDgsMzJ9LHswLDksMTYwfSx7MCw4LDB9LHswLDgsMTI4fSwKKyAgICAgICAgezAsOCw2NH0sezAsOSwyMjR9LHsxNiw3LDZ9LHswLDgsODh9LHswLDgsMjR9LHswLDksMTQ0fSx7MTksNyw1OX0sCisgICAgICAgIHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOH0sezE3LDcsMTd9LHswLDgsMTA0fSx7MCw4LDQwfSx7MCw5LDE3Nn0sCisgICAgICAgIHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LHswLDksMjQwfSx7MTYsNyw0fSx7MCw4LDg0fSx7MCw4LDIwfSwKKyAgICAgICAgezIxLDgsMjI3fSx7MTksNyw0M30sezAsOCwxMTZ9LHswLDgsNTJ9LHswLDksMjAwfSx7MTcsNywxM30sezAsOCwxMDB9LAorICAgICAgICB7MCw4LDM2fSx7MCw5LDE2OH0sezAsOCw0fSx7MCw4LDEzMn0sezAsOCw2OH0sezAsOSwyMzJ9LHsxNiw3LDh9LAorICAgICAgICB7MCw4LDkyfSx7MCw4LDI4fSx7MCw5LDE1Mn0sezIwLDcsODN9LHswLDgsMTI0fSx7MCw4LDYwfSx7MCw5LDIxNn0sCisgICAgICAgIHsxOCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sezAsOSwxODR9LHswLDgsMTJ9LHswLDgsMTQwfSx7MCw4LDc2fSwKKyAgICAgICAgezAsOSwyNDh9LHsxNiw3LDN9LHswLDgsODJ9LHswLDgsMTh9LHsyMSw4LDE2M30sezE5LDcsMzV9LHswLDgsMTE0fSwKKyAgICAgICAgezAsOCw1MH0sezAsOSwxOTZ9LHsxNyw3LDExfSx7MCw4LDk4fSx7MCw4LDM0fSx7MCw5LDE2NH0sezAsOCwyfSwKKyAgICAgICAgezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI4fSx7MTYsNyw3fSx7MCw4LDkwfSx7MCw4LDI2fSx7MCw5LDE0OH0sCisgICAgICAgIHsyMCw3LDY3fSx7MCw4LDEyMn0sezAsOCw1OH0sezAsOSwyMTJ9LHsxOCw3LDE5fSx7MCw4LDEwNn0sezAsOCw0Mn0sCisgICAgICAgIHswLDksMTgwfSx7MCw4LDEwfSx7MCw4LDEzOH0sezAsOCw3NH0sezAsOSwyNDR9LHsxNiw3LDV9LHswLDgsODZ9LAorICAgICAgICB7MCw4LDIyfSx7NjQsOCwwfSx7MTksNyw1MX0sezAsOCwxMTh9LHswLDgsNTR9LHswLDksMjA0fSx7MTcsNywxNX0sCisgICAgICAgIHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3Mn0sezAsOCw2fSx7MCw4LDEzNH0sezAsOCw3MH0sezAsOSwyMzZ9LAorICAgICAgICB7MTYsNyw5fSx7MCw4LDk0fSx7MCw4LDMwfSx7MCw5LDE1Nn0sezIwLDcsOTl9LHswLDgsMTI2fSx7MCw4LDYyfSwKKyAgICAgICAgezAsOSwyMjB9LHsxOCw3LDI3fSx7MCw4LDExMH0sezAsOCw0Nn0sezAsOSwxODh9LHswLDgsMTR9LHswLDgsMTQyfSwKKyAgICAgICAgezAsOCw3OH0sezAsOSwyNTJ9LHs5Niw3LDB9LHswLDgsODF9LHswLDgsMTd9LHsyMSw4LDEzMX0sezE4LDcsMzF9LAorICAgICAgICB7MCw4LDExM30sezAsOCw0OX0sezAsOSwxOTR9LHsxNiw3LDEwfSx7MCw4LDk3fSx7MCw4LDMzfSx7MCw5LDE2Mn0sCisgICAgICAgIHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LHswLDksMjI2fSx7MTYsNyw2fSx7MCw4LDg5fSx7MCw4LDI1fSwKKyAgICAgICAgezAsOSwxNDZ9LHsxOSw3LDU5fSx7MCw4LDEyMX0sezAsOCw1N30sezAsOSwyMTB9LHsxNyw3LDE3fSx7MCw4LDEwNX0sCisgICAgICAgIHswLDgsNDF9LHswLDksMTc4fSx7MCw4LDl9LHswLDgsMTM3fSx7MCw4LDczfSx7MCw5LDI0Mn0sezE2LDcsNH0sCisgICAgICAgIHswLDgsODV9LHswLDgsMjF9LHsxNiw4LDI1OH0sezE5LDcsNDN9LHswLDgsMTE3fSx7MCw4LDUzfSx7MCw5LDIwMn0sCisgICAgICAgIHsxNyw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sezAsOSwxNzB9LHswLDgsNX0sezAsOCwxMzN9LHswLDgsNjl9LAorICAgICAgICB7MCw5LDIzNH0sezE2LDcsOH0sezAsOCw5M30sezAsOCwyOX0sezAsOSwxNTR9LHsyMCw3LDgzfSx7MCw4LDEyNX0sCisgICAgICAgIHswLDgsNjF9LHswLDksMjE4fSx7MTgsNywyM30sezAsOCwxMDl9LHswLDgsNDV9LHswLDksMTg2fSx7MCw4LDEzfSwKKyAgICAgICAgezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUwfSx7MTYsNywzfSx7MCw4LDgzfSx7MCw4LDE5fSx7MjEsOCwxOTV9LAorICAgICAgICB7MTksNywzNX0sezAsOCwxMTV9LHswLDgsNTF9LHswLDksMTk4fSx7MTcsNywxMX0sezAsOCw5OX0sezAsOCwzNX0sCisgICAgICAgIHswLDksMTY2fSx7MCw4LDN9LHswLDgsMTMxfSx7MCw4LDY3fSx7MCw5LDIzMH0sezE2LDcsN30sezAsOCw5MX0sCisgICAgICAgIHswLDgsMjd9LHswLDksMTUwfSx7MjAsNyw2N30sezAsOCwxMjN9LHswLDgsNTl9LHswLDksMjE0fSx7MTgsNywxOX0sCisgICAgICAgIHswLDgsMTA3fSx7MCw4LDQzfSx7MCw5LDE4Mn0sezAsOCwxMX0sezAsOCwxMzl9LHswLDgsNzV9LHswLDksMjQ2fSwKKyAgICAgICAgezE2LDcsNX0sezAsOCw4N30sezAsOCwyM30sezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE5fSx7MCw4LDU1fSwKKyAgICAgICAgezAsOSwyMDZ9LHsxNyw3LDE1fSx7MCw4LDEwM30sezAsOCwzOX0sezAsOSwxNzR9LHswLDgsN30sezAsOCwxMzV9LAorICAgICAgICB7MCw4LDcxfSx7MCw5LDIzOH0sezE2LDcsOX0sezAsOCw5NX0sezAsOCwzMX0sezAsOSwxNTh9LHsyMCw3LDk5fSwKKyAgICAgICAgezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIyfSx7MTgsNywyN30sezAsOCwxMTF9LHswLDgsNDd9LHswLDksMTkwfSwKKyAgICAgICAgezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LHswLDksMjU0fSx7OTYsNywwfSx7MCw4LDgwfSx7MCw4LDE2fSwKKyAgICAgICAgezIwLDgsMTE1fSx7MTgsNywzMX0sezAsOCwxMTJ9LHswLDgsNDh9LHswLDksMTkzfSx7MTYsNywxMH0sezAsOCw5Nn0sCisgICAgICAgIHswLDgsMzJ9LHswLDksMTYxfSx7MCw4LDB9LHswLDgsMTI4fSx7MCw4LDY0fSx7MCw5LDIyNX0sezE2LDcsNn0sCisgICAgICAgIHswLDgsODh9LHswLDgsMjR9LHswLDksMTQ1fSx7MTksNyw1OX0sezAsOCwxMjB9LHswLDgsNTZ9LHswLDksMjA5fSwKKyAgICAgICAgezE3LDcsMTd9LHswLDgsMTA0fSx7MCw4LDQwfSx7MCw5LDE3N30sezAsOCw4fSx7MCw4LDEzNn0sezAsOCw3Mn0sCisgICAgICAgIHswLDksMjQxfSx7MTYsNyw0fSx7MCw4LDg0fSx7MCw4LDIwfSx7MjEsOCwyMjd9LHsxOSw3LDQzfSx7MCw4LDExNn0sCisgICAgICAgIHswLDgsNTJ9LHswLDksMjAxfSx7MTcsNywxM30sezAsOCwxMDB9LHswLDgsMzZ9LHswLDksMTY5fSx7MCw4LDR9LAorICAgICAgICB7MCw4LDEzMn0sezAsOCw2OH0sezAsOSwyMzN9LHsxNiw3LDh9LHswLDgsOTJ9LHswLDgsMjh9LHswLDksMTUzfSwKKyAgICAgICAgezIwLDcsODN9LHswLDgsMTI0fSx7MCw4LDYwfSx7MCw5LDIxN30sezE4LDcsMjN9LHswLDgsMTA4fSx7MCw4LDQ0fSwKKyAgICAgICAgezAsOSwxODV9LHswLDgsMTJ9LHswLDgsMTQwfSx7MCw4LDc2fSx7MCw5LDI0OX0sezE2LDcsM30sezAsOCw4Mn0sCisgICAgICAgIHswLDgsMTh9LHsyMSw4LDE2M30sezE5LDcsMzV9LHswLDgsMTE0fSx7MCw4LDUwfSx7MCw5LDE5N30sezE3LDcsMTF9LAorICAgICAgICB7MCw4LDk4fSx7MCw4LDM0fSx7MCw5LDE2NX0sezAsOCwyfSx7MCw4LDEzMH0sezAsOCw2Nn0sezAsOSwyMjl9LAorICAgICAgICB7MTYsNyw3fSx7MCw4LDkwfSx7MCw4LDI2fSx7MCw5LDE0OX0sezIwLDcsNjd9LHswLDgsMTIyfSx7MCw4LDU4fSwKKyAgICAgICAgezAsOSwyMTN9LHsxOCw3LDE5fSx7MCw4LDEwNn0sezAsOCw0Mn0sezAsOSwxODF9LHswLDgsMTB9LHswLDgsMTM4fSwKKyAgICAgICAgezAsOCw3NH0sezAsOSwyNDV9LHsxNiw3LDV9LHswLDgsODZ9LHswLDgsMjJ9LHs2NCw4LDB9LHsxOSw3LDUxfSwKKyAgICAgICAgezAsOCwxMTh9LHswLDgsNTR9LHswLDksMjA1fSx7MTcsNywxNX0sezAsOCwxMDJ9LHswLDgsMzh9LHswLDksMTczfSwKKyAgICAgICAgezAsOCw2fSx7MCw4LDEzNH0sezAsOCw3MH0sezAsOSwyMzd9LHsxNiw3LDl9LHswLDgsOTR9LHswLDgsMzB9LAorICAgICAgICB7MCw5LDE1N30sezIwLDcsOTl9LHswLDgsMTI2fSx7MCw4LDYyfSx7MCw5LDIyMX0sezE4LDcsMjd9LHswLDgsMTEwfSwKKyAgICAgICAgezAsOCw0Nn0sezAsOSwxODl9LHswLDgsMTR9LHswLDgsMTQyfSx7MCw4LDc4fSx7MCw5LDI1M30sezk2LDcsMH0sCisgICAgICAgIHswLDgsODF9LHswLDgsMTd9LHsyMSw4LDEzMX0sezE4LDcsMzF9LHswLDgsMTEzfSx7MCw4LDQ5fSx7MCw5LDE5NX0sCisgICAgICAgIHsxNiw3LDEwfSx7MCw4LDk3fSx7MCw4LDMzfSx7MCw5LDE2M30sezAsOCwxfSx7MCw4LDEyOX0sezAsOCw2NX0sCisgICAgICAgIHswLDksMjI3fSx7MTYsNyw2fSx7MCw4LDg5fSx7MCw4LDI1fSx7MCw5LDE0N30sezE5LDcsNTl9LHswLDgsMTIxfSwKKyAgICAgICAgezAsOCw1N30sezAsOSwyMTF9LHsxNyw3LDE3fSx7MCw4LDEwNX0sezAsOCw0MX0sezAsOSwxNzl9LHswLDgsOX0sCisgICAgICAgIHswLDgsMTM3fSx7MCw4LDczfSx7MCw5LDI0M30sezE2LDcsNH0sezAsOCw4NX0sezAsOCwyMX0sezE2LDgsMjU4fSwKKyAgICAgICAgezE5LDcsNDN9LHswLDgsMTE3fSx7MCw4LDUzfSx7MCw5LDIwM30sezE3LDcsMTN9LHswLDgsMTAxfSx7MCw4LDM3fSwKKyAgICAgICAgezAsOSwxNzF9LHswLDgsNX0sezAsOCwxMzN9LHswLDgsNjl9LHswLDksMjM1fSx7MTYsNyw4fSx7MCw4LDkzfSwKKyAgICAgICAgezAsOCwyOX0sezAsOSwxNTV9LHsyMCw3LDgzfSx7MCw4LDEyNX0sezAsOCw2MX0sezAsOSwyMTl9LHsxOCw3LDIzfSwKKyAgICAgICAgezAsOCwxMDl9LHswLDgsNDV9LHswLDksMTg3fSx7MCw4LDEzfSx7MCw4LDE0MX0sezAsOCw3N30sezAsOSwyNTF9LAorICAgICAgICB7MTYsNywzfSx7MCw4LDgzfSx7MCw4LDE5fSx7MjEsOCwxOTV9LHsxOSw3LDM1fSx7MCw4LDExNX0sezAsOCw1MX0sCisgICAgICAgIHswLDksMTk5fSx7MTcsNywxMX0sezAsOCw5OX0sezAsOCwzNX0sezAsOSwxNjd9LHswLDgsM30sezAsOCwxMzF9LAorICAgICAgICB7MCw4LDY3fSx7MCw5LDIzMX0sezE2LDcsN30sezAsOCw5MX0sezAsOCwyN30sezAsOSwxNTF9LHsyMCw3LDY3fSwKKyAgICAgICAgezAsOCwxMjN9LHswLDgsNTl9LHswLDksMjE1fSx7MTgsNywxOX0sezAsOCwxMDd9LHswLDgsNDN9LHswLDksMTgzfSwKKyAgICAgICAgezAsOCwxMX0sezAsOCwxMzl9LHswLDgsNzV9LHswLDksMjQ3fSx7MTYsNyw1fSx7MCw4LDg3fSx7MCw4LDIzfSwKKyAgICAgICAgezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE5fSx7MCw4LDU1fSx7MCw5LDIwN30sezE3LDcsMTV9LHswLDgsMTAzfSwKKyAgICAgICAgezAsOCwzOX0sezAsOSwxNzV9LHswLDgsN30sezAsOCwxMzV9LHswLDgsNzF9LHswLDksMjM5fSx7MTYsNyw5fSwKKyAgICAgICAgezAsOCw5NX0sezAsOCwzMX0sezAsOSwxNTl9LHsyMCw3LDk5fSx7MCw4LDEyN30sezAsOCw2M30sezAsOSwyMjN9LAorICAgICAgICB7MTgsNywyN30sezAsOCwxMTF9LHswLDgsNDd9LHswLDksMTkxfSx7MCw4LDE1fSx7MCw4LDE0M30sezAsOCw3OX0sCisgICAgICAgIHswLDksMjU1fQorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY29kZSBkaXN0Zml4WzMyXSA9IHsKKyAgICAgICAgezE2LDUsMX0sezIzLDUsMjU3fSx7MTksNSwxN30sezI3LDUsNDA5N30sezE3LDUsNX0sezI1LDUsMTAyNX0sCisgICAgICAgIHsyMSw1LDY1fSx7MjksNSwxNjM4NX0sezE2LDUsM30sezI0LDUsNTEzfSx7MjAsNSwzM30sezI4LDUsODE5M30sCisgICAgICAgIHsxOCw1LDl9LHsyNiw1LDIwNDl9LHsyMiw1LDEyOX0sezY0LDUsMH0sezE2LDUsMn0sezIzLDUsMzg1fSwKKyAgICAgICAgezE5LDUsMjV9LHsyNyw1LDYxNDV9LHsxNyw1LDd9LHsyNSw1LDE1Mzd9LHsyMSw1LDk3fSx7MjksNSwyNDU3N30sCisgICAgICAgIHsxNiw1LDR9LHsyNCw1LDc2OX0sezIwLDUsNDl9LHsyOCw1LDEyMjg5fSx7MTgsNSwxM30sezI2LDUsMzA3M30sCisgICAgICAgIHsyMiw1LDE5M30sezY0LDUsMH0KKyAgICB9OwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvaW5mbGF0ZS5jIGIvY29tMzIvbGliL3psaWIvaW5mbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDMxYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvemxpYi9pbmZsYXRlLmMKQEAgLTAsMCArMSwxNDgwIEBACisvKiBpbmZsYXRlLmMgLS0gemxpYiBkZWNvbXByZXNzaW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqIENoYW5nZSBoaXN0b3J5OgorICoKKyAqIDEuMi5iZXRhMCAgICAyNCBOb3YgMjAwMgorICogLSBGaXJzdCB2ZXJzaW9uIC0tIGNvbXBsZXRlIHJld3JpdGUgb2YgaW5mbGF0ZSB0byBzaW1wbGlmeSBjb2RlLCBhdm9pZAorICogICBjcmVhdGlvbiBvZiB3aW5kb3cgd2hlbiBub3QgbmVlZGVkLCBtaW5pbWl6ZSB1c2Ugb2Ygd2luZG93IHdoZW4gaXQgaXMKKyAqICAgbmVlZGVkLCBtYWtlIGluZmZhc3QuYyBldmVuIGZhc3RlciwgaW1wbGVtZW50IGd6aXAgZGVjb2RpbmcsIGFuZCB0bworICogICBpbXByb3ZlIGNvZGUgcmVhZGFiaWxpdHkgYW5kIHN0eWxlIG92ZXIgdGhlIHByZXZpb3VzIHpsaWIgaW5mbGF0ZSBjb2RlCisgKgorICogMS4yLmJldGExICAgIDI1IE5vdiAyMDAyCisgKiAtIFVzZSBwb2ludGVycyBmb3IgYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgY2hlY2tpbmcgaW4gaW5mZmFzdC5jCisgKiAtIFJlbW92ZSBpbnB1dCBhbmQgb3V0cHV0IGNvdW50ZXJzIGluIGluZmZhc3QuYworICogLSBDaGFuZ2UgaW5mZmFzdC5jIGVudHJ5IGFuZCBsb29wIGZyb20gYXZhaWxfaW4gPj0gNyB0byA+PSA2CisgKiAtIFJlbW92ZSB1bm5lY2Vzc2FyeSBzZWNvbmQgYnl0ZSBwdWxsIGZyb20gbGVuZ3RoIGV4dHJhIGluIGluZmZhc3QuYworICogLSBVbnJvbGwgZGlyZWN0IGNvcHkgdG8gdGhyZWUgY29waWVzIHBlciBsb29wIGluIGluZmZhc3QuYworICoKKyAqIDEuMi5iZXRhMiAgICA0IERlYyAyMDAyCisgKiAtIENoYW5nZSBleHRlcm5hbCByb3V0aW5lIG5hbWVzIHRvIHJlZHVjZSBwb3RlbnRpYWwgY29uZmxpY3RzCisgKiAtIENvcnJlY3QgZmlsZW5hbWUgdG8gaW5mZml4ZWQuaCBmb3IgZml4ZWQgdGFibGVzIGluIGluZmxhdGUuYworICogLSBNYWtlIGhidWZbXSB1bnNpZ25lZCBjaGFyIHRvIG1hdGNoIHBhcmFtZXRlciB0eXBlIGluIGluZmxhdGUuYworICogLSBDaGFuZ2Ugc3RybS0+bmV4dF9vdXRbLXN0YXRlLT5vZmZzZXRdIHRvICooc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+b2Zmc2V0KQorICogICB0byBhdm9pZCBuZWdhdGlvbiBwcm9ibGVtIG9uIEFscGhhcyAoNjQgYml0KSBpbiBpbmZsYXRlLmMKKyAqCisgKiAxLjIuYmV0YTMgICAgMjIgRGVjIDIwMDIKKyAqIC0gQWRkIGNvbW1lbnRzIG9uIHN0YXRlLT5iaXRzIGFzc2VydGlvbiBpbiBpbmZmYXN0LmMKKyAqIC0gQWRkIGNvbW1lbnRzIG9uIG9wIGZpZWxkIGluIGluZnRyZWVzLmgKKyAqIC0gRml4IGJ1ZyBpbiByZXVzZSBvZiBhbGxvY2F0ZWQgd2luZG93IGFmdGVyIGluZmxhdGVSZXNldCgpCisgKiAtIFJlbW92ZSBiaXQgZmllbGRzLS1iYWNrIHRvIGJ5dGUgc3RydWN0dXJlIGZvciBzcGVlZAorICogLSBSZW1vdmUgZGlzdGFuY2UgZXh0cmEgPT0gMCBjaGVjayBpbiBpbmZsYXRlX2Zhc3QoKS0tb25seSBoZWxwcyBmb3IgbGVuZ3RocworICogLSBDaGFuZ2UgcG9zdC1pbmNyZW1lbnRzIHRvIHByZS1pbmNyZW1lbnRzIGluIGluZmxhdGVfZmFzdCgpLCBQUEMgYmlhc2VkPworICogLSBBZGQgY29tcGlsZSB0aW1lIG9wdGlvbiwgUE9TVElOQywgdG8gdXNlIHBvc3QtaW5jcmVtZW50cyBpbnN0ZWFkIChJbnRlbD8pCisgKiAtIE1ha2UgTUFUQ0ggY29weSBpbiBpbmZsYXRlKCkgbXVjaCBmYXN0ZXIgZm9yIHdoZW4gaW5mbGF0ZV9mYXN0KCkgbm90IHVzZWQKKyAqIC0gVXNlIGxvY2FsIGNvcGllcyBvZiBzdHJlYW0gbmV4dCBhbmQgYXZhaWwgdmFsdWVzLCBhcyB3ZWxsIGFzIGxvY2FsIGJpdAorICogICBidWZmZXIgYW5kIGJpdCBjb3VudCBpbiBpbmZsYXRlKCktLWZvciBzcGVlZCB3aGVuIGluZmxhdGVfZmFzdCgpIG5vdCB1c2VkCisgKgorICogMS4yLmJldGE0ICAgIDEgSmFuIDIwMDMKKyAqIC0gU3BsaXQgcHRyIC0gMjU3IHN0YXRlbWVudHMgaW4gaW5mbGF0ZV90YWJsZSgpIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCisgKiAtIE1vdmUgYSBjb21tZW50IG9uIG91dHB1dCBidWZmZXIgc2l6ZXMgZnJvbSBpbmZmYXN0LmMgdG8gaW5mbGF0ZS5jCisgKiAtIEFkZCBjb21tZW50cyBpbiBpbmZmYXN0LmMgdG8gaW50cm9kdWNlIHRoZSBpbmZsYXRlX2Zhc3QoKSByb3V0aW5lCisgKiAtIFJlYXJyYW5nZSB3aW5kb3cgY29waWVzIGluIGluZmxhdGVfZmFzdCgpIGZvciBzcGVlZCBhbmQgc2ltcGxpZmljYXRpb24KKyAqIC0gVW5yb2xsIGxhc3QgY29weSBmb3Igd2luZG93IG1hdGNoIGluIGluZmxhdGVfZmFzdCgpCisgKiAtIFVzZSBsb2NhbCBjb3BpZXMgb2Ygd2luZG93IHZhcmlhYmxlcyBpbiBpbmZsYXRlX2Zhc3QoKSBmb3Igc3BlZWQKKyAqIC0gUHVsbCBvdXQgY29tbW9uIHduZXh0ID09IDAgY2FzZSBmb3Igc3BlZWQgaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gTWFrZSBvcCBhbmQgbGVuIGluIGluZmxhdGVfZmFzdCgpIHVuc2lnbmVkIGZvciBjb25zaXN0ZW5jeQorICogLSBBZGQgRkFSIHRvIGxjb2RlIGFuZCBkY29kZSBkZWNsYXJhdGlvbnMgaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gU2ltcGxpZmllZCBiYWQgZGlzdGFuY2UgY2hlY2sgaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gQWRkZWQgaW5mbGF0ZUJhY2tJbml0KCksIGluZmxhdGVCYWNrKCksIGFuZCBpbmZsYXRlQmFja0VuZCgpIGluIG5ldworICogICBzb3VyY2UgZmlsZSBpbmZiYWNrLmMgdG8gcHJvdmlkZSBhIGNhbGwtYmFjayBpbnRlcmZhY2UgdG8gaW5mbGF0ZSBmb3IKKyAqICAgcHJvZ3JhbXMgbGlrZSBnemlwIGFuZCB1bnppcCAtLSB1c2VzIHdpbmRvdyBhcyBvdXRwdXQgYnVmZmVyIHRvIGF2b2lkCisgKiAgIHdpbmRvdyBjb3B5aW5nCisgKgorICogMS4yLmJldGE1ICAgIDEgSmFuIDIwMDMKKyAqIC0gSW1wcm92ZWQgaW5mbGF0ZUJhY2soKSBpbnRlcmZhY2UgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBwcm92aWRlIGluaXRpYWwKKyAqICAgaW5wdXQgaW4gc3RybS4KKyAqIC0gRml4ZWQgc3RvcmVkIGJsb2NrcyBidWcgaW4gaW5mbGF0ZUJhY2soKQorICoKKyAqIDEuMi5iZXRhNiAgICA0IEphbiAyMDAzCisgKiAtIEFkZGVkIGNvbW1lbnRzIGluIGluZmZhc3QuYyBvbiBlZmZlY3RpdmVuZXNzIG9mIFBPU1RJTkMKKyAqIC0gVHlwZWNhc3RpbmcgYWxsIGFyb3VuZCB0byByZWR1Y2UgY29tcGlsZXIgd2FybmluZ3MKKyAqIC0gQ2hhbmdlZCBsb29wcyBmcm9tIHdoaWxlICgxKSBvciBkbyB7fSB3aGlsZSAoMSkgdG8gZm9yICg7OyksIGFnYWluIHRvCisgKiAgIG1ha2UgY29tcGlsZXJzIGhhcHB5CisgKiAtIENoYW5nZWQgdHlwZSBvZiB3aW5kb3cgaW4gaW5mbGF0ZUJhY2tJbml0KCkgdG8gdW5zaWduZWQgY2hhciAqCisgKgorICogMS4yLmJldGE3ICAgIDI3IEphbiAyMDAzCisgKiAtIENoYW5nZWQgbWFueSB0eXBlcyB0byB1bnNpZ25lZCBvciB1bnNpZ25lZCBzaG9ydCB0byBhdm9pZCB3YXJuaW5ncworICogLSBBZGRlZCBpbmZsYXRlQ29weSgpIGZ1bmN0aW9uCisgKgorICogMS4yLjAgICAgICAgIDkgTWFyIDIwMDMKKyAqIC0gQ2hhbmdlZCBpbmZsYXRlQmFjaygpIGludGVyZmFjZSB0byBwcm92aWRlIHNlcGFyYXRlIG9wYXF1ZSBkZXNjcmlwdG9ycworICogICBmb3IgdGhlIGluKCkgYW5kIG91dCgpIGZ1bmN0aW9ucworICogLSBDaGFuZ2VkIGluZmxhdGVCYWNrKCkgYXJndW1lbnQgYW5kIGluX2Z1bmMgdHlwZWRlZiB0byBzd2FwIHRoZSBsZW5ndGgKKyAqICAgYW5kIGJ1ZmZlciBhZGRyZXNzIHJldHVybiB2YWx1ZXMgZm9yIHRoZSBpbnB1dCBmdW5jdGlvbgorICogLSBDaGVjayBuZXh0X2luIGFuZCBuZXh0X291dCBmb3IgWl9OVUxMIG9uIGVudHJ5IHRvIGluZmxhdGUoKQorICoKKyAqIFRoZSBoaXN0b3J5IGZvciB2ZXJzaW9ucyBhZnRlciAxLjIuMCBhcmUgaW4gQ2hhbmdlTG9nIGluIHpsaWIgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisjaW5jbHVkZSAiaW5mbGF0ZS5oIgorI2luY2x1ZGUgImluZmZhc3QuaCIKKworI2lmZGVmIE1BS0VGSVhFRAorIyAgaWZuZGVmIEJVSUxERklYRUQKKyMgICAgZGVmaW5lIEJVSUxERklYRUQKKyMgIGVuZGlmCisjZW5kaWYKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworbG9jYWwgdm9pZCBmaXhlZHRhYmxlcyBPRigoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZSkpOworbG9jYWwgaW50IHVwZGF0ZXdpbmRvdyBPRigoel9zdHJlYW1wIHN0cm0sIHVuc2lnbmVkIG91dCkpOworI2lmZGVmIEJVSUxERklYRUQKKyAgIHZvaWQgbWFrZWZpeGVkIE9GKCh2b2lkKSk7CisjZW5kaWYKK2xvY2FsIHVuc2lnbmVkIHN5bmNzZWFyY2ggT0YoKHVuc2lnbmVkIEZBUiAqaGF2ZSwgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOworCitpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSBzdGF0ZS0+dG90YWwgPSAwOworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKKyAgICBzdHJtLT5hZGxlciA9IDE7ICAgICAgICAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovCisgICAgc3RhdGUtPm1vZGUgPSBIRUFEOworICAgIHN0YXRlLT5sYXN0ID0gMDsKKyAgICBzdGF0ZS0+aGF2ZWRpY3QgPSAwOworICAgIHN0YXRlLT5kbWF4ID0gMzI3NjhVOworICAgIHN0YXRlLT5oZWFkID0gWl9OVUxMOworICAgIHN0YXRlLT53c2l6ZSA9IDA7CisgICAgc3RhdGUtPndoYXZlID0gMDsKKyAgICBzdGF0ZS0+d25leHQgPSAwOworICAgIHN0YXRlLT5ob2xkID0gMDsKKyAgICBzdGF0ZS0+Yml0cyA9IDA7CisgICAgc3RhdGUtPmxlbmNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGUgPSBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICBzdGF0ZS0+c2FuZSA9IDE7CisgICAgc3RhdGUtPmJhY2sgPSAtMTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IHJlc2V0XG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykKK3pfc3RyZWFtcCBzdHJtOworaW50IHdpbmRvd0JpdHM7Cit7CisgICAgaW50IHdyYXA7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIC8qIGdldCB0aGUgc3RhdGUgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisKKyAgICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovCisgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CisgICAgICAgIHdyYXAgPSAwOworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOworI2lmZGVmIEdVTlpJUAorICAgICAgICBpZiAod2luZG93Qml0cyA8IDQ4KQorICAgICAgICAgICAgd2luZG93Qml0cyAmPSAxNTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqLworICAgIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgaWYgKHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMICYmIHN0YXRlLT53Yml0cyAhPSAodW5zaWduZWQpd2luZG93Qml0cykgeworICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZS0+d2luZG93KTsKKyAgICAgICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJlc2V0IHRoZSByZXN0IG9mIGl0ICovCisgICAgc3RhdGUtPndyYXAgPSB3cmFwOworICAgIHN0YXRlLT53Yml0cyA9ICh1bnNpZ25lZCl3aW5kb3dCaXRzOworICAgIHJldHVybiBpbmZsYXRlUmVzZXQoc3RybSk7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8oc3RybSwgd2luZG93Qml0cywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbXAgc3RybTsKK2ludCB3aW5kb3dCaXRzOworY29uc3QgY2hhciAqdmVyc2lvbjsKK2ludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gKGludCkoc2l6ZW9mKHpfc3RyZWFtKSkpCisgICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworICAgIH0KKyAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKKyAgICAgICAgICAgIFpBTExPQyhzdHJtLCAxLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoc3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopc3RhdGU7CisgICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpOworICAgIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZSk7CisgICAgICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8oc3RybSwgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbXAgc3RybTsKK2NvbnN0IGNoYXIgKnZlcnNpb247CitpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgcmV0dXJuIGluZmxhdGVJbml0Ml8oc3RybSwgREVGX1dCSVRTLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVQcmltZShzdHJtLCBiaXRzLCB2YWx1ZSkKK3pfc3RyZWFtcCBzdHJtOworaW50IGJpdHM7CitpbnQgdmFsdWU7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoYml0cyA8IDApIHsKKyAgICAgICAgc3RhdGUtPmhvbGQgPSAwOworICAgICAgICBzdGF0ZS0+Yml0cyA9IDA7CisgICAgICAgIHJldHVybiBaX09LOworICAgIH0KKyAgICBpZiAoYml0cyA+IDE2IHx8IHN0YXRlLT5iaXRzICsgYml0cyA+IDMyKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgdmFsdWUgJj0gKDFMIDw8IGJpdHMpIC0gMTsKKyAgICBzdGF0ZS0+aG9sZCArPSB2YWx1ZSA8PCBzdGF0ZS0+Yml0czsKKyAgICBzdGF0ZS0+Yml0cyArPSBiaXRzOworICAgIHJldHVybiBaX09LOworfQorCisvKgorICAgUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0bworICAgZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLgorICAgSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZQorICAgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZAorICAgdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW4KKyAgIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZQorICAgdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpbgorICAgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4KKyAqLworbG9jYWwgdm9pZCBmaXhlZHRhYmxlcyhzdGF0ZSkKK3N0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Cit7CisjaWZkZWYgQlVJTERGSVhFRAorICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsKKyAgICBzdGF0aWMgY29kZSAqbGVuZml4LCAqZGlzdGZpeDsKKyAgICBzdGF0aWMgY29kZSBmaXhlZFs1NDRdOworCisgICAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KKyAgICBpZiAodmlyZ2luKSB7CisgICAgICAgIHVuc2lnbmVkIHN5bSwgYml0czsKKyAgICAgICAgc3RhdGljIGNvZGUgKm5leHQ7CisKKyAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDE0NCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUtPmxlbnNbc3ltKytdID0gOTsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4MCkgc3RhdGUtPmxlbnNbc3ltKytdID0gNzsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4OCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgbmV4dCA9IGZpeGVkOworICAgICAgICBsZW5maXggPSBuZXh0OworICAgICAgICBiaXRzID0gOTsKKyAgICAgICAgaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7CisKKyAgICAgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDMyKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA1OworICAgICAgICBkaXN0Zml4ID0gbmV4dDsKKyAgICAgICAgYml0cyA9IDU7CisgICAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zLCAzMiwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOworCisgICAgICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovCisgICAgICAgIHZpcmdpbiA9IDA7CisgICAgfQorI2Vsc2UgLyogIUJVSUxERklYRUQgKi8KKyMgICBpbmNsdWRlICJpbmZmaXhlZC5oIgorI2VuZGlmIC8qIEJVSUxERklYRUQgKi8KKyAgICBzdGF0ZS0+bGVuY29kZSA9IGxlbmZpeDsKKyAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgc3RhdGUtPmRpc3Rjb2RlID0gZGlzdGZpeDsKKyAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA1OworfQorCisjaWZkZWYgTUFLRUZJWEVECisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAgIFdyaXRlIG91dCB0aGUgaW5mZml4ZWQuaCB0aGF0IGlzICNpbmNsdWRlJ2QgYWJvdmUuICBEZWZpbmluZyBNQUtFRklYRUQgYWxzbworICAgZGVmaW5lcyBCVUlMREZJWEVELCBzbyB0aGUgdGFibGVzIGFyZSBidWlsdCBvbiB0aGUgZmx5LiAgbWFrZWZpeGVkKCkgd3JpdGVzCisgICB0aG9zZSB0YWJsZXMgdG8gc3Rkb3V0LCB3aGljaCB3b3VsZCBiZSBwaXBlZCB0byBpbmZmaXhlZC5oLiAgQSBzbWFsbCBwcm9ncmFtCisgICBjYW4gc2ltcGx5IGNhbGwgbWFrZWZpeGVkIHRvIGRvIHRoaXM6CisKKyAgICB2b2lkIG1ha2VmaXhlZCh2b2lkKTsKKworICAgIGludCBtYWluKHZvaWQpCisgICAgeworICAgICAgICBtYWtlZml4ZWQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICBUaGVuIHRoYXQgY2FuIGJlIGxpbmtlZCB3aXRoIHpsaWIgYnVpbHQgd2l0aCBNQUtFRklYRUQgZGVmaW5lZCBhbmQgcnVuOgorCisgICAgYS5vdXQgPiBpbmZmaXhlZC5oCisgKi8KK3ZvaWQgbWFrZWZpeGVkKCkKK3sKKyAgICB1bnNpZ25lZCBsb3csIHNpemU7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgc3RhdGU7CisKKyAgICBmaXhlZHRhYmxlcygmc3RhdGUpOworICAgIHB1dHMoIiAgICAvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcyIpOworICAgIHB1dHMoIiAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4iKTsKKyAgICBwdXRzKCIgICAgICovIik7CisgICAgcHV0cygiIik7CisgICAgcHV0cygiICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIik7CisgICAgcHV0cygiICAgICAgIEl0IGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBhbmQgaXMiKTsKKyAgICBwdXRzKCIgICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLiIpOworICAgIHB1dHMoIiAgICAgKi8iKTsKKyAgICBwdXRzKCIiKTsKKyAgICBzaXplID0gMVUgPDwgOTsKKyAgICBwcmludGYoIiAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbJXVdID0geyIsIHNpemUpOworICAgIGxvdyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoKGxvdyAlIDcpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOworICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCBzdGF0ZS5sZW5jb2RlW2xvd10ub3AsIHN0YXRlLmxlbmNvZGVbbG93XS5iaXRzLAorICAgICAgICAgICAgICAgc3RhdGUubGVuY29kZVtsb3ddLnZhbCk7CisgICAgICAgIGlmICgrK2xvdyA9PSBzaXplKSBicmVhazsKKyAgICAgICAgcHV0Y2hhcignLCcpOworICAgIH0KKyAgICBwdXRzKCJcbiAgICB9OyIpOworICAgIHNpemUgPSAxVSA8PCA1OworICAgIHByaW50ZigiXG4gICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFsldV0gPSB7Iiwgc2l6ZSk7CisgICAgbG93ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICgobG93ICUgNikgPT0gMCkgcHJpbnRmKCJcbiAgICAgICAgIik7CisgICAgICAgIHByaW50ZigieyV1LCV1LCVkfSIsIHN0YXRlLmRpc3Rjb2RlW2xvd10ub3AsIHN0YXRlLmRpc3Rjb2RlW2xvd10uYml0cywKKyAgICAgICAgICAgICAgIHN0YXRlLmRpc3Rjb2RlW2xvd10udmFsKTsKKyAgICAgICAgaWYgKCsrbG93ID09IHNpemUpIGJyZWFrOworICAgICAgICBwdXRjaGFyKCcsJyk7CisgICAgfQorICAgIHB1dHMoIlxuICAgIH07Iik7Cit9CisjZW5kaWYgLyogTUFLRUZJWEVEICovCisKKy8qCisgICBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlCisgICByZXR1cm5pbmcuICBJZiB3aW5kb3cgZG9lcyBub3QgZXhpc3QgeWV0LCBjcmVhdGUgaXQuICBUaGlzIGlzIG9ubHkgY2FsbGVkCisgICB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzCisgICBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuCisgICBJdCBpcyBhbHNvIGNhbGxlZCB0byBjcmVhdGUgYSB3aW5kb3cgZm9yIGRpY3Rpb25hcnkgZGF0YSB3aGVuIGEgZGljdGlvbmFyeQorICAgaXMgbG9hZGVkLgorCisgICBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkCisgICBhZHZhbnRhZ2UsIHNpbmNlIG9ubHkgdGhlIGxhc3QgMzJLIG9mIG91dHB1dCBpcyBjb3BpZWQgdG8gdGhlIHNsaWRpbmcgd2luZG93CisgICB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZgorICAgb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLgorICAgVGhlIGFkdmFudGFnZSBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZSBwcm9jZXNzb3IncyBkYXRhIGNhY2hlcy4KKyAqLworbG9jYWwgaW50IHVwZGF0ZXdpbmRvdyhzdHJtLCBvdXQpCit6X3N0cmVhbXAgc3RybTsKK3Vuc2lnbmVkIG91dDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGNvcHksIGRpc3Q7CisKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKworICAgIC8qIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3aW5kb3cgKi8KKyAgICBpZiAoc3RhdGUtPndpbmRvdyA9PSBaX05VTEwpIHsKKyAgICAgICAgc3RhdGUtPndpbmRvdyA9ICh1bnNpZ25lZCBjaGFyIEZBUiAqKQorICAgICAgICAgICAgICAgICAgICAgICAgWkFMTE9DKHN0cm0sIDFVIDw8IHN0YXRlLT53Yml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgY2hhcikpOworICAgICAgICBpZiAoc3RhdGUtPndpbmRvdyA9PSBaX05VTEwpIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGlmIHdpbmRvdyBub3QgaW4gdXNlIHlldCwgaW5pdGlhbGl6ZSAqLworICAgIGlmIChzdGF0ZS0+d3NpemUgPT0gMCkgeworICAgICAgICBzdGF0ZS0+d3NpemUgPSAxVSA8PCBzdGF0ZS0+d2JpdHM7CisgICAgICAgIHN0YXRlLT53bmV4dCA9IDA7CisgICAgICAgIHN0YXRlLT53aGF2ZSA9IDA7CisgICAgfQorCisgICAgLyogY29weSBzdGF0ZS0+d3NpemUgb3IgbGVzcyBvdXRwdXQgYnl0ZXMgaW50byB0aGUgY2lyY3VsYXIgd2luZG93ICovCisgICAgY29weSA9IG91dCAtIHN0cm0tPmF2YWlsX291dDsKKyAgICBpZiAoY29weSA+PSBzdGF0ZS0+d3NpemUpIHsKKyAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93LCBzdHJtLT5uZXh0X291dCAtIHN0YXRlLT53c2l6ZSwgc3RhdGUtPndzaXplKTsKKyAgICAgICAgc3RhdGUtPnduZXh0ID0gMDsKKyAgICAgICAgc3RhdGUtPndoYXZlID0gc3RhdGUtPndzaXplOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGlzdCA9IHN0YXRlLT53c2l6ZSAtIHN0YXRlLT53bmV4dDsKKyAgICAgICAgaWYgKGRpc3QgPiBjb3B5KSBkaXN0ID0gY29weTsKKyAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBzdHJtLT5uZXh0X291dCAtIGNvcHksIGRpc3QpOworICAgICAgICBjb3B5IC09IGRpc3Q7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIHN0cm0tPm5leHRfb3V0IC0gY29weSwgY29weSk7CisgICAgICAgICAgICBzdGF0ZS0+d25leHQgPSBjb3B5OworICAgICAgICAgICAgc3RhdGUtPndoYXZlID0gc3RhdGUtPndzaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RhdGUtPnduZXh0ICs9IGRpc3Q7CisgICAgICAgICAgICBpZiAoc3RhdGUtPnduZXh0ID09IHN0YXRlLT53c2l6ZSkgc3RhdGUtPnduZXh0ID0gMDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d2hhdmUgPCBzdGF0ZS0+d3NpemUpIHN0YXRlLT53aGF2ZSArPSBkaXN0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBNYWNyb3MgZm9yIGluZmxhdGUoKTogKi8KKworLyogY2hlY2sgZnVuY3Rpb24gdG8gdXNlIGFkbGVyMzIoKSBmb3IgemxpYiBvciBjcmMzMigpIGZvciBnemlwICovCisjaWZkZWYgR1VOWklQCisjICBkZWZpbmUgVVBEQVRFKGNoZWNrLCBidWYsIGxlbikgXAorICAgIChzdGF0ZS0+ZmxhZ3MgPyBjcmMzMihjaGVjaywgYnVmLCBsZW4pIDogYWRsZXIzMihjaGVjaywgYnVmLCBsZW4pKQorI2Vsc2UKKyMgIGRlZmluZSBVUERBVEUoY2hlY2ssIGJ1ZiwgbGVuKSBhZGxlcjMyKGNoZWNrLCBidWYsIGxlbikKKyNlbmRpZgorCisvKiBjaGVjayBtYWNyb3MgZm9yIGhlYWRlciBjcmMgKi8KKyNpZmRlZiBHVU5aSVAKKyMgIGRlZmluZSBDUkMyKGNoZWNrLCB3b3JkKSBcCisgICAgZG8geyBcCisgICAgICAgIGhidWZbMF0gPSAodW5zaWduZWQgY2hhcikod29yZCk7IFwKKyAgICAgICAgaGJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gOCk7IFwKKyAgICAgICAgY2hlY2sgPSBjcmMzMihjaGVjaywgaGJ1ZiwgMik7IFwKKyAgICB9IHdoaWxlICgwKQorCisjICBkZWZpbmUgQ1JDNChjaGVjaywgd29yZCkgXAorICAgIGRvIHsgXAorICAgICAgICBoYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpKHdvcmQpOyBcCisgICAgICAgIGhidWZbMV0gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDgpOyBcCisgICAgICAgIGhidWZbMl0gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDE2KTsgXAorICAgICAgICBoYnVmWzNdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiAyNCk7IFwKKyAgICAgICAgY2hlY2sgPSBjcmMzMihjaGVjaywgaGJ1ZiwgNCk7IFwKKyAgICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIExvYWQgcmVnaXN0ZXJzIHdpdGggc3RhdGUgaW4gaW5mbGF0ZSgpIGZvciBzcGVlZCAqLworI2RlZmluZSBMT0FEKCkgXAorICAgIGRvIHsgXAorICAgICAgICBwdXQgPSBzdHJtLT5uZXh0X291dDsgXAorICAgICAgICBsZWZ0ID0gc3RybS0+YXZhaWxfb3V0OyBcCisgICAgICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOyBcCisgICAgICAgIGhhdmUgPSBzdHJtLT5hdmFpbF9pbjsgXAorICAgICAgICBob2xkID0gc3RhdGUtPmhvbGQ7IFwKKyAgICAgICAgYml0cyA9IHN0YXRlLT5iaXRzOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmVzdG9yZSBzdGF0ZSBmcm9tIHJlZ2lzdGVycyBpbiBpbmZsYXRlKCkgKi8KKyNkZWZpbmUgUkVTVE9SRSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBwdXQ7IFwKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVmdDsgXAorICAgICAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7IFwKKyAgICAgICAgc3RhdGUtPmhvbGQgPSBob2xkOyBcCisgICAgICAgIHN0YXRlLT5iaXRzID0gYml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIENsZWFyIHRoZSBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgSU5JVEJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPSAwOyBcCisgICAgICAgIGJpdHMgPSAwOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogR2V0IGEgYnl0ZSBvZiBpbnB1dCBpbnRvIHRoZSBiaXQgYWNjdW11bGF0b3IsIG9yIHJldHVybiBmcm9tIGluZmxhdGUoKQorICAgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAqLworI2RlZmluZSBQVUxMQllURSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBpbmZfbGVhdmU7IFwKKyAgICAgICAgaGF2ZS0tOyBcCisgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKCpuZXh0KyspIDw8IGJpdHM7IFwKKyAgICAgICAgYml0cyArPSA4OyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQXNzdXJlIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IG4gYml0cyBpbiB0aGUgYml0IGFjY3VtdWxhdG9yLiAgSWYgdGhlcmUgaXMKKyAgIG5vdCBlbm91Z2ggYXZhaWxhYmxlIGlucHV0IHRvIGRvIHRoYXQsIHRoZW4gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLiAqLworI2RlZmluZSBORUVEQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAorICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDwgMTYpICovCisjZGVmaW5lIEJJVFMobikgXAorICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQorCisvKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBEUk9QQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IChuKTsgXAorICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgQllURUJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCisgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZXZlcnNlIHRoZSBieXRlcyBpbiBhIDMyLWJpdCB2YWx1ZSAqLworI2RlZmluZSBSRVZFUlNFKHEpIFwKKyAgICAoKCgocSkgPj4gMjQpICYgMHhmZikgKyAoKChxKSA+PiA4KSAmIDB4ZmYwMCkgKyBcCisgICAgICgoKHEpICYgMHhmZjAwKSA8PCA4KSArICgoKHEpICYgMHhmZikgPDwgMjQpKQorCisvKgorICAgaW5mbGF0ZSgpIHVzZXMgYSBzdGF0ZSBtYWNoaW5lIHRvIHByb2Nlc3MgYXMgbXVjaCBpbnB1dCBkYXRhIGFuZCBnZW5lcmF0ZSBhcworICAgbXVjaCBvdXRwdXQgZGF0YSBhcyBwb3NzaWJsZSBiZWZvcmUgcmV0dXJuaW5nLiAgVGhlIHN0YXRlIG1hY2hpbmUgaXMKKyAgIHN0cnVjdHVyZWQgcm91Z2hseSBhcyBmb2xsb3dzOgorCisgICAgZm9yICg7Oykgc3dpdGNoIChzdGF0ZSkgeworICAgIC4uLgorICAgIGNhc2UgU1RBVEVuOgorICAgICAgICBpZiAobm90IGVub3VnaCBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSB0byBtYWtlIHByb2dyZXNzKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAuLi4gbWFrZSBwcm9ncmVzcyAuLi4KKyAgICAgICAgc3RhdGUgPSBTVEFURW07CisgICAgICAgIGJyZWFrOworICAgIC4uLgorICAgIH0KKworICAgc28gd2hlbiBpbmZsYXRlKCkgaXMgY2FsbGVkIGFnYWluLCB0aGUgc2FtZSBjYXNlIGlzIGF0dGVtcHRlZCBhZ2FpbiwgYW5kCisgICBpZiB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2VzIGFyZSBwcm92aWRlZCwgdGhlIG1hY2hpbmUgcHJvY2VlZHMgdG8gdGhlCisgICBuZXh0IHN0YXRlLiAgVGhlIE5FRURCSVRTKCkgbWFjcm8gaXMgdXN1YWxseSB0aGUgd2F5IHRoZSBzdGF0ZSBldmFsdWF0ZXMKKyAgIHdoZXRoZXIgaXQgY2FuIHByb2NlZWQgb3Igc2hvdWxkIHJldHVybi4gIE5FRURCSVRTKCkgZG9lcyB0aGUgcmV0dXJuIGlmCisgICB0aGUgcmVxdWVzdGVkIGJpdHMgYXJlIG5vdCBhdmFpbGFibGUuICBUaGUgdHlwaWNhbCB1c2Ugb2YgdGhlIEJJVFMgbWFjcm9zCisgICBpczoKKworICAgICAgICBORUVEQklUUyhuKTsKKyAgICAgICAgLi4uIGRvIHNvbWV0aGluZyB3aXRoIEJJVFMobikgLi4uCisgICAgICAgIERST1BCSVRTKG4pOworCisgICB3aGVyZSBORUVEQklUUyhuKSBlaXRoZXIgcmV0dXJucyBmcm9tIGluZmxhdGUoKSBpZiB0aGVyZSBpc24ndCBlbm91Z2gKKyAgIGlucHV0IGxlZnQgdG8gbG9hZCBuIGJpdHMgaW50byB0aGUgYWNjdW11bGF0b3IsIG9yIGl0IGNvbnRpbnVlcy4gIEJJVFMobikKKyAgIGdpdmVzIHRoZSBsb3cgbiBiaXRzIGluIHRoZSBhY2N1bXVsYXRvci4gIFdoZW4gZG9uZSwgRFJPUEJJVFMobikgZHJvcHMKKyAgIHRoZSBsb3cgbiBiaXRzIG9mZiB0aGUgYWNjdW11bGF0b3IuICBJTklUQklUUygpIGNsZWFycyB0aGUgYWNjdW11bGF0b3IKKyAgIGFuZCBzZXRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdHMgdG8gemVyby4gIEJZVEVCSVRTKCkgZGlzY2FyZHMganVzdAorICAgZW5vdWdoIGJpdHMgdG8gcHV0IHRoZSBhY2N1bXVsYXRvciBvbiBhIGJ5dGUgYm91bmRhcnkuICBBZnRlciBCWVRFQklUUygpCisgICBhbmQgYSBORUVEQklUUyg4KSwgdGhlbiBCSVRTKDgpIHdvdWxkIHJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0uCisKKyAgIE5FRURCSVRTKG4pIHVzZXMgUFVMTEJZVEUoKSB0byBnZXQgYW4gYXZhaWxhYmxlIGJ5dGUgb2YgaW5wdXQsIG9yIHRvIHJldHVybgorICAgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAgVGhlIGRlY29kaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBjb2RlcyB1c2VzCisgICBQVUxMQllURSgpIGRpcmVjdGx5IGluIG9yZGVyIHRvIHB1bGwganVzdCBlbm91Z2ggYnl0ZXMgdG8gZGVjb2RlIHRoZSBuZXh0CisgICBjb2RlLCBhbmQgbm8gbW9yZS4KKworICAgU29tZSBzdGF0ZXMgbG9vcCB1bnRpbCB0aGV5IGdldCBlbm91Z2ggaW5wdXQsIG1ha2luZyBzdXJlIHRoYXQgZW5vdWdoCisgICBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIHRvIGNvbnRpbnVlIHRoZSBsb29wIHdoZXJlIGl0IGxlZnQgb2ZmCisgICBpZiBORUVEQklUUygpIHJldHVybnMgaW4gdGhlIGxvb3AuICBGb3IgZXhhbXBsZSwgd2FudCwgbmVlZCwgYW5kIGtlZXAKKyAgIHdvdWxkIGFsbCBoYXZlIHRvIGFjdHVhbGx5IGJlIHBhcnQgb2YgdGhlIHNhdmVkIHN0YXRlIGluIGNhc2UgTkVFREJJVFMoKQorICAgcmV0dXJuczoKKworICAgIGNhc2UgU1RBVEV3OgorICAgICAgICB3aGlsZSAod2FudCA8IG5lZWQpIHsKKyAgICAgICAgICAgIE5FRURCSVRTKG4pOworICAgICAgICAgICAga2VlcFt3YW50KytdID0gQklUUyhuKTsKKyAgICAgICAgICAgIERST1BCSVRTKG4pOworICAgICAgICB9CisgICAgICAgIHN0YXRlID0gU1RBVEV4OworICAgIGNhc2UgU1RBVEV4OgorCisgICBBcyBzaG93biBhYm92ZSwgaWYgdGhlIG5leHQgc3RhdGUgaXMgYWxzbyB0aGUgbmV4dCBjYXNlLCB0aGVuIHRoZSBicmVhaworICAgaXMgb21pdHRlZC4KKworICAgQSBzdGF0ZSBtYXkgYWxzbyByZXR1cm4gaWYgdGhlcmUgaXMgbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgYXZhaWxhYmxlIHRvCisgICBjb21wbGV0ZSB0aGF0IHN0YXRlLiAgVGhvc2Ugc3RhdGVzIGFyZSBjb3B5aW5nIHN0b3JlZCBkYXRhLCB3cml0aW5nIGEKKyAgIGxpdGVyYWwgYnl0ZSwgYW5kIGNvcHlpbmcgYSBtYXRjaGluZyBzdHJpbmcuCisKKyAgIFdoZW4gcmV0dXJuaW5nLCBhICJnb3RvIGluZl9sZWF2ZSIgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHRvdGFsIGNvdW50ZXJzLAorICAgdXBkYXRlIHRoZSBjaGVjayB2YWx1ZSwgYW5kIGRldGVybWluZSB3aGV0aGVyIGFueSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlCisgICBkdXJpbmcgdGhhdCBpbmZsYXRlKCkgY2FsbCBpbiBvcmRlciB0byByZXR1cm4gdGhlIHByb3BlciByZXR1cm4gY29kZS4KKyAgIFByb2dyZXNzIGlzIGRlZmluZWQgYXMgYSBjaGFuZ2UgaW4gZWl0aGVyIHN0cm0tPmF2YWlsX2luIG9yIHN0cm0tPmF2YWlsX291dC4KKyAgIFdoZW4gdGhlcmUgaXMgYSB3aW5kb3csIGdvdG8gaW5mX2xlYXZlIHdpbGwgdXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdAorICAgb3V0cHV0IHdyaXR0ZW4uICBJZiBhIGdvdG8gaW5mX2xlYXZlIG9jY3VycyBpbiB0aGUgbWlkZGxlIG9mIGRlY29tcHJlc3Npb24KKyAgIGFuZCB0aGVyZSBpcyBubyB3aW5kb3cgY3VycmVudGx5LCBnb3RvIGluZl9sZWF2ZSB3aWxsIGNyZWF0ZSBvbmUgYW5kIGNvcHkKKyAgIG91dHB1dCB0byB0aGUgd2luZG93IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KKworICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgb25seSBhZmZlY3RzIHRoZQorICAgcmV0dXJuIGNvZGUgKHBlciB6bGliLmgpLiAgaW5mbGF0ZSgpIGFsd2F5cyB3cml0ZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSB0bworICAgc3RybS0+bmV4dF9vdXQsIGdpdmVuIHRoZSBzcGFjZSBhdmFpbGFibGUgYW5kIHRoZSBwcm92aWRlZCBpbnB1dC0tdGhlIGVmZmVjdAorICAgZG9jdW1lbnRlZCBpbiB6bGliLmggb2YgWl9TWU5DX0ZMVVNILiAgRnVydGhlcm1vcmUsIGluZmxhdGUoKSBhbHdheXMgZGVmZXJzCisgICB0aGUgYWxsb2NhdGlvbiBvZiBhbmQgY29weWluZyBpbnRvIGEgc2xpZGluZyB3aW5kb3cgdW50aWwgbmVjZXNzYXJ5LCB3aGljaAorICAgcHJvdmlkZXMgdGhlIGVmZmVjdCBkb2N1bWVudGVkIGluIHpsaWIuaCBmb3IgWl9GSU5JU0ggd2hlbiB0aGUgZW50aXJlIGlucHV0CisgICBzdHJlYW0gYXZhaWxhYmxlLiAgU28gdGhlIG9ubHkgdGhpbmcgdGhlIGZsdXNoIHBhcmFtZXRlciBhY3R1YWxseSBkb2VzIGlzOgorICAgd2hlbiBmbHVzaCBpcyBzZXQgdG8gWl9GSU5JU0gsIGluZmxhdGUoKSBjYW5ub3QgcmV0dXJuIFpfT0suICBJbnN0ZWFkIGl0CisgICB3aWxsIHJldHVybiBaX0JVRl9FUlJPUiBpZiBpdCBoYXMgbm90IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICovCisKK2ludCBaRVhQT1JUIGluZmxhdGUoc3RybSwgZmx1c2gpCit6X3N0cmVhbXAgc3RybTsKK2ludCBmbHVzaDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgaGF2ZSwgbGVmdDsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgaW4sIG91dDsgICAgICAgICAgIC8qIHNhdmUgc3RhcnRpbmcgYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBjb3B5OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKmZyb207ICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqLworICAgIGNvZGUgaGVyZTsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovCisgICAgY29kZSBsYXN0OyAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovCisgICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisjaWZkZWYgR1VOWklQCisgICAgdW5zaWduZWQgY2hhciBoYnVmWzRdOyAgICAgIC8qIGJ1ZmZlciBmb3IgZ3ppcCBoZWFkZXIgY3JjIGNhbGN1bGF0aW9uICovCisjZW5kaWYKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb3JkZXJbMTldID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCisgICAgICAgIHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+bmV4dF9vdXQgPT0gWl9OVUxMIHx8CisgICAgICAgIChzdHJtLT5uZXh0X2luID09IFpfTlVMTCAmJiBzdHJtLT5hdmFpbF9pbiAhPSAwKSkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0YXRlLT5tb2RlID09IFRZUEUpIHN0YXRlLT5tb2RlID0gVFlQRURPOyAgICAgIC8qIHNraXAgY2hlY2sgKi8KKyAgICBMT0FEKCk7CisgICAgaW4gPSBoYXZlOworICAgIG91dCA9IGxlZnQ7CisgICAgcmV0ID0gWl9PSzsKKyAgICBmb3IgKDs7KQorICAgICAgICBzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CisgICAgICAgIGNhc2UgSEVBRDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFRE87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBORUVEQklUUygxNik7CisjaWZkZWYgR1VOWklQCisgICAgICAgICAgICBpZiAoKHN0YXRlLT53cmFwICYgMikgJiYgaG9sZCA9PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovCisgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBGTEFHUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmRvbmUgPSAtMTsKKyAgICAgICAgICAgIGlmICghKHN0YXRlLT53cmFwICYgMSkgfHwgICAvKiBjaGVjayBpZiB6bGliIGhlYWRlciBhbGxvd2VkICovCisjZWxzZQorICAgICAgICAgICAgaWYgKAorI2VuZGlmCisgICAgICAgICAgICAgICAgKChCSVRTKDgpIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChCSVRTKDQpICE9IFpfREVGTEFURUQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyAgICAgICAgICAgIGxlbiA9IEJJVFMoNCkgKyA4OworICAgICAgICAgICAgaWYgKHN0YXRlLT53Yml0cyA9PSAwKQorICAgICAgICAgICAgICAgIHN0YXRlLT53Yml0cyA9IGxlbjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA+IHN0YXRlLT53Yml0cykgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgd2luZG93IHNpemUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRtYXggPSAxVSA8PCBsZW47CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgY2FzZSBGTEFHUzoKKyAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyAgICAgICAgICAgIHN0YXRlLT5mbGFncyA9IChpbnQpKGhvbGQpOworICAgICAgICAgICAgaWYgKChzdGF0ZS0+ZmxhZ3MgJiAweGZmKSAhPSBaX0RFRkxBVEVEKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4ZTAwMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gaGVhZGVyIGZsYWdzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT50ZXh0ID0gKGludCkoKGhvbGQgPj4gOCkgJiAxKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIENSQzIoc3RhdGUtPmNoZWNrLCBob2xkKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRJTUU7CisgICAgICAgIGNhc2UgVElNRToKKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnRpbWUgPSBob2xkOworICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDNChzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gT1M7CisgICAgICAgIGNhc2UgT1M6CisgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnhmbGFncyA9IChpbnQpKGhvbGQgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+b3MgPSAoaW50KShob2xkID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRVhMRU47CisgICAgICAgIGNhc2UgRVhMRU46CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwNDAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMTYpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpKGhvbGQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYV9sZW4gPSAodW5zaWduZWQpaG9sZDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmEgPSBaX05VTEw7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEVYVFJBOworICAgICAgICBjYXNlIEVYVFJBOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDQwMCkgeworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmV4dHJhICE9IFpfTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RhdGUtPmhlYWQtPmV4dHJhX2xlbiAtIHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB6bWVtY3B5KHN0YXRlLT5oZWFkLT5leHRyYSArIGxlbiwgbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLT5oZWFkLT5leHRyYV9tYXggPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmFfbWF4IC0gbGVuIDogY29weSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBOQU1FOworICAgICAgICBjYXNlIE5BTUU6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwODAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAgICAgY29weSA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKG5leHRbY29weSsrXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZSAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIDwgc3RhdGUtPmhlYWQtPm5hbWVfbWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPm5hbWVbc3RhdGUtPmxlbmd0aCsrXSA9IGxlbjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBpZiAobGVuKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZSA9IFpfTlVMTDsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT01NRU5UOworICAgICAgICBjYXNlIENPTU1FTlQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgxMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAgICAgY29weSA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKG5leHRbY29weSsrXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudCAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIDwgc3RhdGUtPmhlYWQtPmNvbW1fbWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmNvbW1lbnRbc3RhdGUtPmxlbmd0aCsrXSA9IGxlbjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBpZiAobGVuKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudCA9IFpfTlVMTDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gSENSQzsKKyAgICAgICAgY2FzZSBIQ1JDOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyAgICAgICAgICAgICAgICBpZiAoaG9sZCAhPSAoc3RhdGUtPmNoZWNrICYgMHhmZmZmKSkgeworICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJoZWFkZXIgY3JjIG1pc21hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkgeworICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5oY3JjID0gKGludCkoKHN0YXRlLT5mbGFncyA+PiA5KSAmIDEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5kb25lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIERJQ1RJRDoKKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gUkVWRVJTRShob2xkKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJQ1Q7CisgICAgICAgIGNhc2UgRElDVDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZWRpY3QgPT0gMCkgeworICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX0JMT0NLIHx8IGZsdXNoID09IFpfVFJFRVMpIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIFRZUEVETzoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGFzdCkgeworICAgICAgICAgICAgICAgIEJZVEVCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDSEVDSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgc3RhdGUtPmxhc3QgPSBCSVRTKDEpOworICAgICAgICAgICAgRFJPUEJJVFMoMSk7CisgICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gU1RPUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTl87ICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqLworICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1RSRUVTKSB7CisgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVEFCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBibG9jayB0eXBlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUkVEOgorICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZClob2xkICYgMHhmZmZmOworICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoKSk7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT1BZXzsKKyAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1RSRUVTKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBDT1BZXzoKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ09QWTsKKyAgICAgICAgY2FzZSBDT1BZOgorICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgcHV0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQUJMRToKKyAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKKyAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OworICAgICAgICAgICAgRFJPUEJJVFMoNCk7CisjaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYgfHwgc3RhdGUtPm5kaXN0ID4gMzApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOTEVOUzsKKyAgICAgICAgY2FzZSBMRU5MRU5TOgorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5jb2RlKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gKHVuc2lnbmVkIHNob3J0KUJJVFMoMyk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCAxOSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAwOworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDc7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSBsZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xuIikpOworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT0RFTEVOUzsKKyAgICAgICAgY2FzZSBDT0RFTEVOUzoKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPCAxNikgeworICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9IGhlcmUudmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlcmUudmFsID09IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlcmUudmFsID09IDE3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9ICh1bnNpZ25lZCBzaG9ydClsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gQkFEKSBicmVhazsKKworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbnNbMjU2XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0cworICAgICAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaAorICAgICAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqLworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCBzdGF0ZS0+bmxlbiwgJihzdGF0ZS0+bmV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Y29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA2OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMgKyBzdGF0ZS0+bmxlbiwgc3RhdGUtPm5kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKHN0YXRlLT5kaXN0Yml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBva1xuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5fOworICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfVFJFRVMpIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIExFTl86CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgY2FzZSBMRU46CisgICAgICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBvdXQpOworICAgICAgICAgICAgICAgIExPQUQoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmJhY2sgPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5iYWNrID0gMDsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYmIChoZXJlLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSBoZXJlOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5sZW5jb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBsYXN0LmJpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgc3RhdGUtPmJhY2sgKz0gaGVyZS5iaXRzOworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKyAgICAgICAgICAgIGlmICgoaW50KShoZXJlLm9wKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIGhlcmUudmFsKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMSVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDMyKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayA9IC0xOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5FWFQ7CisgICAgICAgIGNhc2UgTEVORVhUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBzdGF0ZS0+ZXh0cmE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgc3RhdGUtPmxlbmd0aCkpOworICAgICAgICAgICAgc3RhdGUtPndhcyA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJU1Q7CisgICAgICAgIGNhc2UgRElTVDoKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmRpc3Rjb2RlW0JJVFMoc3RhdGUtPmRpc3RiaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChoZXJlLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSBoZXJlOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5kaXN0Y29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmJhY2sgKz0gbGFzdC5iaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IGhlcmUuYml0czsKKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElTVEVYVDsKKyAgICAgICAgY2FzZSBESVNURVhUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm9mZnNldCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBzdGF0ZS0+ZXh0cmE7CisgICAgICAgICAgICB9CisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gc3RhdGUtPmRtYXgpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIHN0YXRlLT5vZmZzZXQpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTUFUQ0g7CisgICAgICAgIGNhc2UgTUFUQ0g6CisgICAgICAgICAgICBpZiAobGVmdCA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIGNvcHkgPSBvdXQgLSBsZWZ0OworICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+b2Zmc2V0IC0gY29weTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT53aGF2ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPnNhbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlIKKyAgICAgICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImluZmxhdGUuYyB0b28gZmFyXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUtPndoYXZlOworICAgICAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgKnB1dCsrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGggPT0gMCkgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPnduZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUtPnduZXh0OworICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUtPndpbmRvdyArIChzdGF0ZS0+d3NpemUgLSBjb3B5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUtPndpbmRvdyArIChzdGF0ZS0+d25leHQgLSBjb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS0+b2Zmc2V0OworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoID09IDApIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElUOgorICAgICAgICAgICAgaWYgKGxlZnQgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAqcHV0KysgPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmxlbmd0aCk7CisgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIRUNLOgorICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgICAgIG91dCAtPSBsZWZ0OworICAgICAgICAgICAgICAgIHN0cm0tPnRvdGFsX291dCArPSBvdXQ7CisgICAgICAgICAgICAgICAgc3RhdGUtPnRvdGFsICs9IG91dDsKKyAgICAgICAgICAgICAgICBpZiAob3V0KQorICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9CisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEUoc3RhdGUtPmNoZWNrLCBwdXQgLSBvdXQsIG91dCk7CisgICAgICAgICAgICAgICAgb3V0ID0gbGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoKAorI2lmZGVmIEdVTlpJUAorICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmZsYWdzID8gaG9sZCA6CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgIFJFVkVSU0UoaG9sZCkpICE9IHN0YXRlLT5jaGVjaykgeworICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgZGF0YSBjaGVjayI7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXG4iKSk7CisgICAgICAgICAgICB9CisjaWZkZWYgR1VOWklQCisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTkdUSDsKKyAgICAgICAgY2FzZSBMRU5HVEg6CisgICAgICAgICAgICBpZiAoc3RhdGUtPndyYXAgJiYgc3RhdGUtPmZsYWdzKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgICAgIGlmIChob2xkICE9IChzdGF0ZS0+dG90YWwgJiAweGZmZmZmZmZmVUwpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBsZW5ndGggY2hlY2siOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBET05FOworICAgICAgICBjYXNlIERPTkU6CisgICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBCQUQ6CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBNRU06CisgICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgICAgIGNhc2UgU1lOQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgLyoKKyAgICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS4KKyAgICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyCisgICAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuCisgICAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLgorICAgICAqLworICBpbmZfbGVhdmU6CisgICAgUkVTVE9SRSgpOworICAgIGlmIChzdGF0ZS0+d3NpemUgfHwgKHN0YXRlLT5tb2RlIDwgQ0hFQ0sgJiYgb3V0ICE9IHN0cm0tPmF2YWlsX291dCkpCisgICAgICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgb3V0KSkgeworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNRU07CisgICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgICAgIH0KKyAgICBpbiAtPSBzdHJtLT5hdmFpbF9pbjsKKyAgICBvdXQgLT0gc3RybS0+YXZhaWxfb3V0OworICAgIHN0cm0tPnRvdGFsX2luICs9IGluOworICAgIHN0cm0tPnRvdGFsX291dCArPSBvdXQ7CisgICAgc3RhdGUtPnRvdGFsICs9IG91dDsKKyAgICBpZiAoc3RhdGUtPndyYXAgJiYgb3V0KQorICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9CisgICAgICAgICAgICBVUERBVEUoc3RhdGUtPmNoZWNrLCBzdHJtLT5uZXh0X291dCAtIG91dCwgb3V0KTsKKyAgICBzdHJtLT5kYXRhX3R5cGUgPSBzdGF0ZS0+Yml0cyArIChzdGF0ZS0+bGFzdCA/IDY0IDogMCkgKworICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBUWVBFID8gMTI4IDogMCkgKworICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBMRU5fIHx8IHN0YXRlLT5tb2RlID09IENPUFlfID8gMjU2IDogMCk7CisgICAgaWYgKCgoaW4gPT0gMCAmJiBvdXQgPT0gMCkgfHwgZmx1c2ggPT0gWl9GSU5JU0gpICYmIHJldCA9PSBaX09LKQorICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlRW5kKHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMKSBaRlJFRShzdHJtLCBzdGF0ZS0+d2luZG93KTsKKyAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7CisgICAgc3RybS0+c3RhdGUgPSBaX05VTEw7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBlbmRcbiIpKTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkKK3pfc3RyZWFtcCBzdHJtOworY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnk7Cit1SW50IGRpY3RMZW5ndGg7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICB1bnNpZ25lZCBsb25nIGlkOworCisgICAgLyogY2hlY2sgc3RhdGUgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0YXRlLT53cmFwICE9IDAgJiYgc3RhdGUtPm1vZGUgIT0gRElDVCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZCAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBESUNUKSB7CisgICAgICAgIGlkID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgaWQgPSBhZGxlcjMyKGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKKyAgICAgICAgaWYgKGlkICE9IHN0YXRlLT5jaGVjaykKKyAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisgICAgfQorCisgICAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyAqLworICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS0+YXZhaWxfb3V0KSkgeworICAgICAgICBzdGF0ZS0+bW9kZSA9IE1FTTsKKyAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIH0KKyAgICBpZiAoZGljdExlbmd0aCA+IHN0YXRlLT53c2l6ZSkgeworICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIGRpY3Rpb25hcnkgKyBkaWN0TGVuZ3RoIC0gc3RhdGUtPndzaXplLAorICAgICAgICAgICAgICAgIHN0YXRlLT53c2l6ZSk7CisgICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53c2l6ZSAtIGRpY3RMZW5ndGgsIGRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgZGljdExlbmd0aCk7CisgICAgICAgIHN0YXRlLT53aGF2ZSA9IGRpY3RMZW5ndGg7CisgICAgfQorICAgIHN0YXRlLT5oYXZlZGljdCA9IDE7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkKK3pfc3RyZWFtcCBzdHJtOworZ3pfaGVhZGVycCBoZWFkOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICAvKiBjaGVjayBzdGF0ZSAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoKHN0YXRlLT53cmFwICYgMikgPT0gMCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovCisgICAgc3RhdGUtPmhlYWQgPSBoZWFkOworICAgIGhlYWQtPmRvbmUgPSAwOworICAgIHJldHVybiBaX09LOworfQorCisvKgorICAgU2VhcmNoIGJ1ZlswLi5sZW4tMV0gZm9yIHRoZSBwYXR0ZXJuOiAwLCAwLCAweGZmLCAweGZmLiAgUmV0dXJuIHdoZW4gZm91bmQKKyAgIG9yIHdoZW4gb3V0IG9mIGlucHV0LiAgV2hlbiBjYWxsZWQsICpoYXZlIGlzIHRoZSBudW1iZXIgb2YgcGF0dGVybiBieXRlcworICAgZm91bmQgaW4gb3JkZXIgc28gZmFyLCBpbiAwLi4zLiAgT24gcmV0dXJuICpoYXZlIGlzIHVwZGF0ZWQgdG8gdGhlIG5ldworICAgc3RhdGUuICBJZiBvbiByZXR1cm4gKmhhdmUgZXF1YWxzIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gd2FzIGZvdW5kIGFuZCB0aGUKKyAgIHJldHVybiB2YWx1ZSBpcyBob3cgbWFueSBieXRlcyB3ZXJlIHJlYWQgaW5jbHVkaW5nIHRoZSBsYXN0IGJ5dGUgb2YgdGhlCisgICBwYXR0ZXJuLiAgSWYgKmhhdmUgaXMgbGVzcyB0aGFuIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gaGFzIG5vdCBiZWVuIGZvdW5kCisgICB5ZXQgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbGVuLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBzeW5jc2VhcmNoKCkgY2FuIGJlCisgICBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGRhdGEgYW5kIHRoZSAqaGF2ZSBzdGF0ZS4gICpoYXZlIGlzIGluaXRpYWxpemVkIHRvCisgICB6ZXJvIGZvciB0aGUgZmlyc3QgY2FsbC4KKyAqLworbG9jYWwgdW5zaWduZWQgc3luY3NlYXJjaChoYXZlLCBidWYsIGxlbikKK3Vuc2lnbmVkIEZBUiAqaGF2ZTsKK3Vuc2lnbmVkIGNoYXIgRkFSICpidWY7Cit1bnNpZ25lZCBsZW47Cit7CisgICAgdW5zaWduZWQgZ290OworICAgIHVuc2lnbmVkIG5leHQ7CisKKyAgICBnb3QgPSAqaGF2ZTsKKyAgICBuZXh0ID0gMDsKKyAgICB3aGlsZSAobmV4dCA8IGxlbiAmJiBnb3QgPCA0KSB7CisgICAgICAgIGlmICgoaW50KShidWZbbmV4dF0pID09IChnb3QgPCAyID8gMCA6IDB4ZmYpKQorICAgICAgICAgICAgZ290Kys7CisgICAgICAgIGVsc2UgaWYgKGJ1ZltuZXh0XSkKKyAgICAgICAgICAgIGdvdCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdCA9IDQgLSBnb3Q7CisgICAgICAgIG5leHQrKzsKKyAgICB9CisgICAgKmhhdmUgPSBnb3Q7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVTeW5jKHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGxvb2sgYXQgb3IgbG9va2VkIGF0ICovCisgICAgdW5zaWduZWQgbG9uZyBpbiwgb3V0OyAgICAgIC8qIHRlbXBvcmFyeSB0byBzYXZlIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsgICAgICAgLyogdG8gcmVzdG9yZSBiaXQgYnVmZmVyIHRvIGJ5dGUgc3RyaW5nICovCisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgc3RhdGUtPmJpdHMgPCA4KSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICAvKiBpZiBmaXJzdCB0aW1lLCBzdGFydCBzZWFyY2ggaW4gYml0IGJ1ZmZlciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBTWU5DKSB7CisgICAgICAgIHN0YXRlLT5tb2RlID0gU1lOQzsKKyAgICAgICAgc3RhdGUtPmhvbGQgPDw9IHN0YXRlLT5iaXRzICYgNzsKKyAgICAgICAgc3RhdGUtPmJpdHMgLT0gc3RhdGUtPmJpdHMgJiA3OworICAgICAgICBsZW4gPSAwOworICAgICAgICB3aGlsZSAoc3RhdGUtPmJpdHMgPj0gOCkgeworICAgICAgICAgICAgYnVmW2xlbisrXSA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+aG9sZCk7CisgICAgICAgICAgICBzdGF0ZS0+aG9sZCA+Pj0gODsKKyAgICAgICAgICAgIHN0YXRlLT5iaXRzIC09IDg7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICBzeW5jc2VhcmNoKCYoc3RhdGUtPmhhdmUpLCBidWYsIGxlbik7CisgICAgfQorCisgICAgLyogc2VhcmNoIGF2YWlsYWJsZSBpbnB1dCAqLworICAgIGxlbiA9IHN5bmNzZWFyY2goJihzdGF0ZS0+aGF2ZSksIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKKyAgICBzdHJtLT5hdmFpbF9pbiAtPSBsZW47CisgICAgc3RybS0+bmV4dF9pbiArPSBsZW47CisgICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOworCisgICAgLyogcmV0dXJuIG5vIGpveSBvciBzZXQgdXAgdG8gcmVzdGFydCBpbmZsYXRlKCkgb24gYSBuZXcgYmxvY2sgKi8KKyAgICBpZiAoc3RhdGUtPmhhdmUgIT0gNCkgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICBpbiA9IHN0cm0tPnRvdGFsX2luOyAgb3V0ID0gc3RybS0+dG90YWxfb3V0OworICAgIGluZmxhdGVSZXNldChzdHJtKTsKKyAgICBzdHJtLT50b3RhbF9pbiA9IGluOyAgc3RybS0+dG90YWxfb3V0ID0gb3V0OworICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAgIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkIGJ5CisgICBaX1NZTkNfRkxVU0ggb3IgWl9GVUxMX0ZMVVNILiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgb25lIFBQUAorICAgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHNhZmV0eSBjaGVjay4gUFBQIHVzZXMKKyAgIFpfU1lOQ19GTFVTSCBidXQgcmVtb3ZlcyB0aGUgbGVuZ3RoIGJ5dGVzIG9mIHRoZSByZXN1bHRpbmcgZW1wdHkgc3RvcmVkCisgICBibG9jay4gV2hlbiBkZWNvbXByZXNzaW5nLCBQUFAgY2hlY2tzIHRoYXQgYXQgdGhlIGVuZCBvZiBpbnB1dCBwYWNrZXQsCisgICBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIHRoZXNlIGxlbmd0aCBieXRlcy4KKyAqLworaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICByZXR1cm4gc3RhdGUtPm1vZGUgPT0gU1RPUkVEICYmIHN0YXRlLT5iaXRzID09IDA7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVDb3B5KGRlc3QsIHNvdXJjZSkKK3pfc3RyZWFtcCBkZXN0Oworel9zdHJlYW1wIHNvdXJjZTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqY29weTsKKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OworICAgIHVuc2lnbmVkIHdzaXplOworCisgICAgLyogY2hlY2sgaW5wdXQgKi8KKyAgICBpZiAoZGVzdCA9PSBaX05VTEwgfHwgc291cmNlID09IFpfTlVMTCB8fCBzb3VyY2UtPnN0YXRlID09IFpfTlVMTCB8fAorICAgICAgICBzb3VyY2UtPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwIHx8IHNvdXJjZS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc291cmNlLT5zdGF0ZTsKKworICAgIC8qIGFsbG9jYXRlIHNwYWNlICovCisgICAgY29weSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKKyAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKGNvcHkgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgd2luZG93ID0gWl9OVUxMOworICAgIGlmIChzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgeworICAgICAgICB3aW5kb3cgPSAodW5zaWduZWQgY2hhciBGQVIgKikKKyAgICAgICAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMVUgPDwgc3RhdGUtPndiaXRzLCBzaXplb2YodW5zaWduZWQgY2hhcikpOworICAgICAgICBpZiAod2luZG93ID09IFpfTlVMTCkgeworICAgICAgICAgICAgWkZSRUUoc291cmNlLCBjb3B5KTsKKyAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgc3RhdGUgKi8KKyAgICB6bWVtY3B5KGRlc3QsIHNvdXJjZSwgc2l6ZW9mKHpfc3RyZWFtKSk7CisgICAgem1lbWNweShjb3B5LCBzdGF0ZSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHN0YXRlLT5sZW5jb2RlID49IHN0YXRlLT5jb2RlcyAmJgorICAgICAgICBzdGF0ZS0+bGVuY29kZSA8PSBzdGF0ZS0+Y29kZXMgKyBFTk9VR0ggLSAxKSB7CisgICAgICAgIGNvcHktPmxlbmNvZGUgPSBjb3B5LT5jb2RlcyArIChzdGF0ZS0+bGVuY29kZSAtIHN0YXRlLT5jb2Rlcyk7CisgICAgICAgIGNvcHktPmRpc3Rjb2RlID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPmRpc3Rjb2RlIC0gc3RhdGUtPmNvZGVzKTsKKyAgICB9CisgICAgY29weS0+bmV4dCA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5uZXh0IC0gc3RhdGUtPmNvZGVzKTsKKyAgICBpZiAod2luZG93ICE9IFpfTlVMTCkgeworICAgICAgICB3c2l6ZSA9IDFVIDw8IHN0YXRlLT53Yml0czsKKyAgICAgICAgem1lbWNweSh3aW5kb3csIHN0YXRlLT53aW5kb3csIHdzaXplKTsKKyAgICB9CisgICAgY29weS0+d2luZG93ID0gd2luZG93OworICAgIGRlc3QtPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKiljb3B5OworICAgIHJldHVybiBaX09LOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlVW5kZXJtaW5lKHN0cm0sIHN1YnZlcnQpCit6X3N0cmVhbXAgc3RybTsKK2ludCBzdWJ2ZXJ0OworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgc3RhdGUtPnNhbmUgPSAhc3VidmVydDsKKyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlIKKyAgICByZXR1cm4gWl9PSzsKKyNlbHNlCisgICAgc3RhdGUtPnNhbmUgPSAxOworICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisjZW5kaWYKK30KKworbG9uZyBaRVhQT1JUIGluZmxhdGVNYXJrKHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIC0xTCA8PCAxNjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICByZXR1cm4gKChsb25nKShzdGF0ZS0+YmFjaykgPDwgMTYpICsKKyAgICAgICAgKHN0YXRlLT5tb2RlID09IENPUFkgPyBzdGF0ZS0+bGVuZ3RoIDoKKyAgICAgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBNQVRDSCA/IHN0YXRlLT53YXMgLSBzdGF0ZS0+bGVuZ3RoIDogMCkpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvaW5mbGF0ZS5oIGIvY29tMzIvbGliL3psaWIvaW5mbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZjQ5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvemxpYi9pbmZsYXRlLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIGluZmxhdGUuaCAtLSBpbnRlcm5hbCBpbmZsYXRlIHN0YXRlIGRlZmluaXRpb24KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA5IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogZGVmaW5lIE5PX0daSVAgd2hlbiBjb21waWxpbmcgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBnemlwIGhlYWRlciBhbmQKKyAgIHRyYWlsZXIgZGVjb2RpbmcgYnkgaW5mbGF0ZSgpLiAgTk9fR1pJUCB3b3VsZCBiZSB1c2VkIHRvIGF2b2lkIGxpbmtpbmcgaW4KKyAgIHRoZSBjcmMgY29kZSB3aGVuIGl0IGlzIG5vdCBuZWVkZWQuICBGb3Igc2hhcmVkIGxpYnJhcmllcywgZ3ppcCBkZWNvZGluZworICAgc2hvdWxkIGJlIGxlZnQgZW5hYmxlZC4gKi8KKyNpZm5kZWYgTk9fR1pJUAorIyAgZGVmaW5lIEdVTlpJUAorI2VuZGlmCisKKy8qIFBvc3NpYmxlIGluZmxhdGUgbW9kZXMgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgSEVBRCwgICAgICAgLyogaTogd2FpdGluZyBmb3IgbWFnaWMgaGVhZGVyICovCisgICAgRkxBR1MsICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi8KKyAgICBUSU1FLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi8KKyAgICBPUywgICAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBmbGFncyBhbmQgb3BlcmF0aW5nIHN5c3RlbSAoZ3ppcCkgKi8KKyAgICBFWExFTiwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovCisgICAgRVhUUkEsICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovCisgICAgTkFNRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGZpbGUgbmFtZSAoZ3ppcCkgKi8KKyAgICBDT01NRU5ULCAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi8KKyAgICBIQ1JDLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqLworICAgIERJQ1RJRCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpY3Rpb25hcnkgY2hlY2sgdmFsdWUgKi8KKyAgICBESUNULCAgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi8KKyAgICAgICAgVFlQRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqLworICAgICAgICBUWVBFRE8sICAgICAvKiBpOiBzYW1lLCBidXQgc2tpcCBjaGVjayB0byBleGl0IGluZmxhdGUgb24gbmV3IGJsb2NrICovCisgICAgICAgIFNUT1JFRCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovCisgICAgICAgIENPUFlfLCAgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovCisgICAgICAgIENPUFksICAgICAgIC8qIGkvbzogd2FpdGluZyBmb3IgaW5wdXQgb3Igb3V0cHV0IHRvIGNvcHkgc3RvcmVkIGJsb2NrICovCisgICAgICAgIFRBQkxFLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqLworICAgICAgICBMRU5MRU5TLCAgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgQ09ERUxFTlMsICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisgICAgICAgICAgICBMRU5fLCAgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqLworICAgICAgICAgICAgTEVOLCAgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqLworICAgICAgICAgICAgTEVORVhULCAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIERJU1QsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIERJU1RFWFQsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIE1BVENILCAgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqLworICAgICAgICAgICAgTElULCAgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi8KKyAgICBDSEVDSywgICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi8KKyAgICBMRU5HVEgsICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqLworICAgIERPTkUsICAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgQkFELCAgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLworICAgIE1FTSwgICAgICAgIC8qIGdvdCBhbiBpbmZsYXRlKCkgbWVtb3J5IGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgU1lOQyAgICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovCit9IGluZmxhdGVfbW9kZTsKKworLyoKKyAgICBTdGF0ZSB0cmFuc2l0aW9ucyBiZXR3ZWVuIGFib3ZlIG1vZGVzIC0KKworICAgIChtb3N0IG1vZGVzIGNhbiBnbyB0byBCQUQgb3IgTUVNIG9uIGVycm9yIC0tIG5vdCBzaG93biBmb3IgY2xhcml0eSkKKworICAgIFByb2Nlc3MgaGVhZGVyOgorICAgICAgICBIRUFEIC0+IChnemlwKSBvciAoemxpYikgb3IgKHJhdykKKyAgICAgICAgKGd6aXApIC0+IEZMQUdTIC0+IFRJTUUgLT4gT1MgLT4gRVhMRU4gLT4gRVhUUkEgLT4gTkFNRSAtPiBDT01NRU5UIC0+CisgICAgICAgICAgICAgICAgICBIQ1JDIC0+IFRZUEUKKyAgICAgICAgKHpsaWIpIC0+IERJQ1RJRCBvciBUWVBFCisgICAgICAgIERJQ1RJRCAtPiBESUNUIC0+IFRZUEUKKyAgICAgICAgKHJhdykgLT4gVFlQRURPCisgICAgUmVhZCBkZWZsYXRlIGJsb2NrczoKKyAgICAgICAgICAgIFRZUEUgLT4gVFlQRURPIC0+IFNUT1JFRCBvciBUQUJMRSBvciBMRU5fIG9yIENIRUNLCisgICAgICAgICAgICBTVE9SRUQgLT4gQ09QWV8gLT4gQ09QWSAtPiBUWVBFCisgICAgICAgICAgICBUQUJMRSAtPiBMRU5MRU5TIC0+IENPREVMRU5TIC0+IExFTl8KKyAgICAgICAgICAgIExFTl8gLT4gTEVOCisgICAgUmVhZCBkZWZsYXRlIGNvZGVzIGluIGZpeGVkIG9yIGR5bmFtaWMgYmxvY2s6CisgICAgICAgICAgICAgICAgTEVOIC0+IExFTkVYVCBvciBMSVQgb3IgVFlQRQorICAgICAgICAgICAgICAgIExFTkVYVCAtPiBESVNUIC0+IERJU1RFWFQgLT4gTUFUQ0ggLT4gTEVOCisgICAgICAgICAgICAgICAgTElUIC0+IExFTgorICAgIFByb2Nlc3MgdHJhaWxlcjoKKyAgICAgICAgQ0hFQ0sgLT4gTEVOR1RIIC0+IERPTkUKKyAqLworCisvKiBzdGF0ZSBtYWludGFpbmVkIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzLiAgQXBwcm94aW1hdGVseSAxMEsgYnl0ZXMuICovCitzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSB7CisgICAgaW5mbGF0ZV9tb2RlIG1vZGU7ICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCisgICAgaW50IGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovCisgICAgaW50IHdyYXA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi8KKyAgICBpbnQgaGF2ZWRpY3Q7ICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBkaWN0aW9uYXJ5IHByb3ZpZGVkICovCisgICAgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi8KKyAgICB1bnNpZ25lZCBkbWF4OyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi8KKyAgICB1bnNpZ25lZCBsb25nIGNoZWNrOyAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2YgY2hlY2sgdmFsdWUgKi8KKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsOyAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovCisgICAgZ3pfaGVhZGVycCBoZWFkOyAgICAgICAgICAgIC8qIHdoZXJlIHRvIHNhdmUgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgLyogc2xpZGluZyB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3Yml0czsgICAgICAgICAgICAgLyogbG9nIGJhc2UgMiBvZiByZXF1ZXN0ZWQgd2luZG93IHNpemUgKi8KKyAgICB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd2hhdmU7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3bmV4dDsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovCisgICAgICAgIC8qIGJpdCBhY2N1bXVsYXRvciAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gImluIiAqLworICAgICAgICAvKiBmb3Igc3RyaW5nIGFuZCBzdG9yZWQgYmxvY2sgY29weWluZyAqLworICAgIHVuc2lnbmVkIGxlbmd0aDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBvZmZzZXQ7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovCisgICAgICAgIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqLworICAgIHVuc2lnbmVkIGV4dHJhOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqLworICAgICAgICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqLworICAgIGNvZGUgY29uc3QgRkFSICpsZW5jb2RlOyAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqZGlzdGNvZGU7ICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovCisgICAgdW5zaWduZWQgbGVuYml0czsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi8KKyAgICB1bnNpZ25lZCBkaXN0Yml0czsgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgZGlzdGNvZGUgKi8KKyAgICAgICAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqLworICAgIHVuc2lnbmVkIG5jb2RlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgbmxlbjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgbmRpc3Q7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBoYXZlOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBpbiBsZW5zW10gKi8KKyAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqLworICAgIHVuc2lnbmVkIHNob3J0IGxlbnNbMzIwXTsgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgc2hvcnQgd29ya1syODhdOyAgIC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqLworICAgIGNvZGUgY29kZXNbRU5PVUdIXTsgICAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi8KKyAgICBpbnQgc2FuZTsgICAgICAgICAgICAgICAgICAgLyogaWYgZmFsc2UsIGFsbG93IGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciAqLworICAgIGludCBiYWNrOyAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGJhY2sgb2YgbGFzdCB1bnByb2Nlc3NlZCBsZW5ndGgvbGl0ICovCisgICAgdW5zaWduZWQgd2FzOyAgICAgICAgICAgICAgIC8qIGluaXRpYWwgbGVuZ3RoIG9mIG1hdGNoICovCit9OwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvaW5mdHJlZXMuYyBiL2NvbTMyL2xpYi96bGliL2luZnRyZWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlOWM1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL2luZnRyZWVzLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qIGluZnRyZWVzLmMgLS0gZ2VuZXJhdGUgSHVmZm1hbiB0cmVlcyBmb3IgZWZmaWNpZW50IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKworI2RlZmluZSBNQVhCSVRTIDE1CisKK2NvbnN0IGNoYXIgaW5mbGF0ZV9jb3B5cmlnaHRbXSA9CisgICAiIGluZmxhdGUgMS4yLjUgQ29weXJpZ2h0IDE5OTUtMjAxMCBNYXJrIEFkbGVyICI7CisvKgorICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCisgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKKyAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCisgIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgorICovCisKKy8qCisgICBCdWlsZCBhIHNldCBvZiB0YWJsZXMgdG8gZGVjb2RlIHRoZSBwcm92aWRlZCBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLgorICAgVGhlIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIFRoZSByZXN1bHQgc3RhcnRzIGF0ICp0YWJsZSwKKyAgIHdob3NlIGluZGljZXMgYXJlIDAuLjJeYml0cy0xLiAgd29yayBpcyBhIHdyaXRhYmxlIGFycmF5IG9mIGF0IGxlYXN0CisgICBsZW5zIHNob3J0cywgd2hpY2ggaXMgdXNlZCBhcyBhIHdvcmsgYXJlYS4gIHR5cGUgaXMgdGhlIHR5cGUgb2YgY29kZQorICAgdG8gYmUgZ2VuZXJhdGVkLCBDT0RFUywgTEVOUywgb3IgRElTVFMuICBPbiByZXR1cm4sIHplcm8gaXMgc3VjY2VzcywKKyAgIC0xIGlzIGFuIGludmFsaWQgY29kZSwgYW5kICsxIG1lYW5zIHRoYXQgRU5PVUdIIGlzbid0IGVub3VnaC4gIHRhYmxlCisgICBvbiByZXR1cm4gcG9pbnRzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSdzIGFkZHJlc3MuICBiaXRzIGlzIHRoZQorICAgcmVxdWVzdGVkIHJvb3QgdGFibGUgaW5kZXggYml0cywgYW5kIG9uIHJldHVybiBpdCBpcyB0aGUgYWN0dWFsIHJvb3QKKyAgIHRhYmxlIGluZGV4IGJpdHMuICBJdCB3aWxsIGRpZmZlciBpZiB0aGUgcmVxdWVzdCBpcyBncmVhdGVyIHRoYW4gdGhlCisgICBsb25nZXN0IGNvZGUgb3IgaWYgaXQgaXMgbGVzcyB0aGFuIHRoZSBzaG9ydGVzdCBjb2RlLgorICovCitpbnQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX3RhYmxlKHR5cGUsIGxlbnMsIGNvZGVzLCB0YWJsZSwgYml0cywgd29yaykKK2NvZGV0eXBlIHR5cGU7Cit1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnM7Cit1bnNpZ25lZCBjb2RlczsKK2NvZGUgRkFSICogRkFSICp0YWJsZTsKK3Vuc2lnbmVkIEZBUiAqYml0czsKK3Vuc2lnbmVkIHNob3J0IEZBUiAqd29yazsKK3sKKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBzeW07ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovCisgICAgdW5zaWduZWQgbWluLCBtYXg7ICAgICAgICAgIC8qIG1pbmltdW0gYW5kIG1heGltdW0gY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgcm9vdDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciByb290IHRhYmxlICovCisgICAgdW5zaWduZWQgY3VycjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovCisgICAgdW5zaWduZWQgZHJvcDsgICAgICAgICAgICAgIC8qIGNvZGUgYml0cyB0byBkcm9wIGZvciBzdWItdGFibGUgKi8KKyAgICBpbnQgbGVmdDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi8KKyAgICB1bnNpZ25lZCB1c2VkOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi8KKyAgICB1bnNpZ25lZCBodWZmOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovCisgICAgdW5zaWduZWQgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi8KKyAgICB1bnNpZ25lZCBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi8KKyAgICB1bnNpZ25lZCBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqLworICAgIHVuc2lnbmVkIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovCisgICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqLworICAgIGNvZGUgRkFSICpuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEZBUiAqYmFzZTsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRkFSICpleHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2UgKi8KKyAgICBpbnQgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudFtNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBvZmZzW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsYmFzZVszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovCisgICAgICAgIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsCisgICAgICAgIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGV4dFszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLworICAgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwKKyAgICAgICAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDczLCAxOTV9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkYmFzZVszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi8KKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAorICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCisgICAgICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZXh0WzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi8KKyAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsCisgICAgICAgIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LAorICAgICAgICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0fTsKKworICAgIC8qCisgICAgICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZQorICAgICAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlCisgICAgICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXIKKyAgICAgICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzCisgICAgICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXIKKyAgICAgICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aAorICAgICAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHMKKyAgICAgICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXMKKyAgICAgICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLgorCisgICAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4KKyAgICAgICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLgorICAgICAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0CisgICAgICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS4KKworICAgICAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCwKKyAgICAgICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGUKKyAgICAgICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWQKKyAgICAgICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnkKKyAgICAgICB0aGUgY2FsbGVyLgorCisgICAgICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZworICAgICAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueQorICAgICAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkCisgICAgICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzLgorICAgICAqLworCisgICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCisgICAgICAgIGNvdW50W2xlbl0gPSAwOworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7CisKKyAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLworICAgIHJvb3QgPSAqYml0czsKKyAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKKyAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7CisgICAgaWYgKG1heCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqLworICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KKyAgICAgICAgaGVyZS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpMTsKKyAgICAgICAgaGVyZS52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICAgICAgKigqdGFibGUpKysgPSBoZXJlOyAgICAgICAgICAgICAvKiBtYWtlIGEgdGFibGUgdG8gZm9yY2UgYW4gZXJyb3IgKi8KKyAgICAgICAgKigqdGFibGUpKysgPSBoZXJlOworICAgICAgICAqYml0cyA9IDE7CisgICAgICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqLworICAgIH0KKyAgICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspCisgICAgICAgIGlmIChjb3VudFttaW5dICE9IDApIGJyZWFrOworICAgIGlmIChyb290IDwgbWluKSByb290ID0gbWluOworCisgICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCisgICAgbGVmdCA9IDE7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKKyAgICAgICAgbGVmdCA8PD0gMTsKKyAgICAgICAgbGVmdCAtPSBjb3VudFtsZW5dOworICAgICAgICBpZiAobGVmdCA8IDApIHJldHVybiAtMTsgICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqLworICAgIH0KKyAgICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT0gQ09ERVMgfHwgbWF4ICE9IDEpKQorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovCisKKyAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLworICAgIG9mZnNbMV0gPSAwOworICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCisgICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dOworCisgICAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqLworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBpZiAobGVuc1tzeW1dICE9IDApIHdvcmtbb2Zmc1tsZW5zW3N5bV1dKytdID0gKHVuc2lnbmVkIHNob3J0KXN5bTsKKworICAgIC8qCisgICAgICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nCisgICAgICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmYKKyAgICAgICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3AKKyAgICAgICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsCisgICAgICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0bworICAgICAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLgorCisgICAgICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkcworICAgICAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4CisgICAgICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGEKKyAgICAgICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXMKKyAgICAgICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuCisKKyAgICAgICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZQorICAgICAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoCisgICAgICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmUKKyAgICAgICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuCisKKyAgICAgICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZQorICAgICAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3QKKyAgICAgICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluCisgICAgICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaAorICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisgICAgICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbgorICAgICAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzCisgICAgICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgorICAgICAqLworCisgICAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENPREVTOgorICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi8KKyAgICAgICAgZW5kID0gMTk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEVOUzoKKyAgICAgICAgYmFzZSA9IGxiYXNlOworICAgICAgICBiYXNlIC09IDI1NzsKKyAgICAgICAgZXh0cmEgPSBsZXh0OworICAgICAgICBleHRyYSAtPSAyNTc7CisgICAgICAgIGVuZCA9IDI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBESVNUUyAqLworICAgICAgICBiYXNlID0gZGJhc2U7CisgICAgICAgIGV4dHJhID0gZGV4dDsKKyAgICAgICAgZW5kID0gLTE7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgbG9vcCAqLworICAgIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovCisgICAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovCisgICAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovCisgICAgbmV4dCA9ICp0YWJsZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLworICAgIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KKyAgICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLworICAgIGxvdyA9ICh1bnNpZ25lZCkoLTEpOyAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCisgICAgdXNlZCA9IDFVIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi8KKyAgICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqLworCisgICAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovCisgICAgaWYgKCh0eXBlID09IExFTlMgJiYgdXNlZCA+PSBFTk9VR0hfTEVOUykgfHwKKyAgICAgICAgKHR5cGUgPT0gRElTVFMgJiYgdXNlZCA+PSBFTk9VR0hfRElTVFMpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqLworICAgICAgICBoZXJlLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7CisgICAgICAgIGlmICgoaW50KSh3b3JrW3N5bV0pIDwgZW5kKSB7CisgICAgICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpMDsKKyAgICAgICAgICAgIGhlcmUudmFsID0gd29ya1tzeW1dOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChpbnQpKHdvcmtbc3ltXSkgPiBlbmQpIHsKKyAgICAgICAgICAgIGhlcmUub3AgPSAodW5zaWduZWQgY2hhcikoZXh0cmFbd29ya1tzeW1dXSk7CisgICAgICAgICAgICBoZXJlLnZhbCA9IGJhc2Vbd29ya1tzeW1dXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGhlcmUub3AgPSAodW5zaWduZWQgY2hhcikoMzIgKyA2NCk7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovCisgICAgICAgICAgICBoZXJlLnZhbCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIGRyb3ApOworICAgICAgICBmaWxsID0gMVUgPDwgY3VycjsKKyAgICAgICAgbWluID0gZmlsbDsgICAgICAgICAgICAgICAgIC8qIHNhdmUgb2Zmc2V0IHRvIG5leHQgdGFibGUgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgZmlsbCAtPSBpbmNyOworICAgICAgICAgICAgbmV4dFsoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gaGVyZTsKKyAgICAgICAgfSB3aGlsZSAoZmlsbCAhPSAwKTsKKworICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOworICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCisgICAgICAgICAgICBpbmNyID4+PSAxOworICAgICAgICBpZiAoaW5jciAhPSAwKSB7CisgICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOworICAgICAgICAgICAgaHVmZiArPSBpbmNyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGh1ZmYgPSAwOworCisgICAgICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqLworICAgICAgICBzeW0rKzsKKyAgICAgICAgaWYgKC0tKGNvdW50W2xlbl0pID09IDApIHsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gbWF4KSBicmVhazsKKyAgICAgICAgICAgIGxlbiA9IGxlbnNbd29ya1tzeW1dXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqLworICAgICAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovCisgICAgICAgICAgICBpZiAoZHJvcCA9PSAwKQorICAgICAgICAgICAgICAgIGRyb3AgPSByb290OworCisgICAgICAgICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovCisgICAgICAgICAgICBuZXh0ICs9IG1pbjsgICAgICAgICAgICAvKiBoZXJlIG1pbiBpcyAxIDw8IGN1cnIgKi8KKworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGxlbmd0aCBvZiBuZXh0IHRhYmxlICovCisgICAgICAgICAgICBjdXJyID0gbGVuIC0gZHJvcDsKKyAgICAgICAgICAgIGxlZnQgPSAoaW50KSgxIDw8IGN1cnIpOworICAgICAgICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3VudFtjdXJyICsgZHJvcF07CisgICAgICAgICAgICAgICAgaWYgKGxlZnQgPD0gMCkgYnJlYWs7CisgICAgICAgICAgICAgICAgY3VycisrOworICAgICAgICAgICAgICAgIGxlZnQgPDw9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi8KKyAgICAgICAgICAgIHVzZWQgKz0gMVUgPDwgY3VycjsKKyAgICAgICAgICAgIGlmICgodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIX0xFTlMpIHx8CisgICAgICAgICAgICAgICAgKHR5cGUgPT0gRElTVFMgJiYgdXNlZCA+PSBFTk9VR0hfRElTVFMpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqLworICAgICAgICAgICAgbG93ID0gaHVmZiAmIG1hc2s7CisgICAgICAgICAgICAoKnRhYmxlKVtsb3ddLm9wID0gKHVuc2lnbmVkIGNoYXIpY3VycjsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10uYml0cyA9ICh1bnNpZ25lZCBjaGFyKXJvb3Q7CisgICAgICAgICAgICAoKnRhYmxlKVtsb3ddLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkobmV4dCAtICp0YWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAgIEZpbGwgaW4gcmVzdCBvZiB0YWJsZSBmb3IgaW5jb21wbGV0ZSBjb2Rlcy4gIFRoaXMgbG9vcCBpcyBzaW1pbGFyIHRvIHRoZQorICAgICAgIGxvb3AgYWJvdmUgaW4gaW5jcmVtZW50aW5nIGh1ZmYgZm9yIHRhYmxlIGluZGljZXMuICBJdCBpcyBhc3N1bWVkIHRoYXQKKyAgICAgICBsZW4gaXMgZXF1YWwgdG8gY3VyciArIGRyb3AsIHNvIHRoZXJlIGlzIG5vIGxvb3AgbmVlZGVkIHRvIGluY3JlbWVudAorICAgICAgIHRocm91Z2ggaGlnaCBpbmRleCBiaXRzLiAgV2hlbiB0aGUgY3VycmVudCBzdWItdGFibGUgaXMgZmlsbGVkLCB0aGUgbG9vcAorICAgICAgIGRyb3BzIGJhY2sgdG8gdGhlIHJvb3QgdGFibGUgdG8gZmlsbCBpbiBhbnkgcmVtYWluaW5nIGVudHJpZXMgdGhlcmUuCisgICAgICovCisgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKTY0OyAgICAgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovCisgICAgaGVyZS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOworICAgIGhlcmUudmFsID0gKHVuc2lnbmVkIHNob3J0KTA7CisgICAgd2hpbGUgKGh1ZmYgIT0gMCkgeworICAgICAgICAvKiB3aGVuIGRvbmUgd2l0aCBzdWItdGFibGUsIGRyb3AgYmFjayB0byByb290IHRhYmxlICovCisgICAgICAgIGlmIChkcm9wICE9IDAgJiYgKGh1ZmYgJiBtYXNrKSAhPSBsb3cpIHsKKyAgICAgICAgICAgIGRyb3AgPSAwOworICAgICAgICAgICAgbGVuID0gcm9vdDsKKyAgICAgICAgICAgIG5leHQgPSAqdGFibGU7CisgICAgICAgICAgICBoZXJlLmJpdHMgPSAodW5zaWduZWQgY2hhcilsZW47CisgICAgICAgIH0KKworICAgICAgICAvKiBwdXQgaW52YWxpZCBjb2RlIG1hcmtlciBpbiB0YWJsZSAqLworICAgICAgICBuZXh0W2h1ZmYgPj4gZHJvcF0gPSBoZXJlOworCisgICAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovCisgICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gMSk7CisgICAgICAgIHdoaWxlIChodWZmICYgaW5jcikKKyAgICAgICAgICAgIGluY3IgPj49IDE7CisgICAgICAgIGlmIChpbmNyICE9IDApIHsKKyAgICAgICAgICAgIGh1ZmYgJj0gaW5jciAtIDE7CisgICAgICAgICAgICBodWZmICs9IGluY3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaHVmZiA9IDA7CisgICAgfQorCisgICAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovCisgICAgKnRhYmxlICs9IHVzZWQ7CisgICAgKmJpdHMgPSByb290OworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvaW5mdHJlZXMuaCBiL2NvbTMyL2xpYi96bGliL2luZnRyZWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhNTNhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL2luZnRyZWVzLmgKQEAgLTAsMCArMSw2MiBAQAorLyogaW5mdHJlZXMuaCAtLSBoZWFkZXIgdG8gdXNlIGluZnRyZWVzLmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1LCAyMDEwIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogU3RydWN0dXJlIGZvciBkZWNvZGluZyB0YWJsZXMuICBFYWNoIGVudHJ5IHByb3ZpZGVzIGVpdGhlciB0aGUKKyAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgY29kZSB0aGF0CisgICBpbmRleGVkIHRoYXQgdGFibGUgZW50cnksIG9yIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBhbm90aGVyCisgICB0YWJsZSB0aGF0IGluZGV4ZXMgbW9yZSBiaXRzIG9mIHRoZSBjb2RlLiAgb3AgaW5kaWNhdGVzIHdoZXRoZXIKKyAgIHRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciB0YWJsZSwgYSBsaXRlcmFsLCBhIGxlbmd0aCBvcgorICAgZGlzdGFuY2UsIGFuIGVuZC1vZi1ibG9jaywgb3IgYW4gaW52YWxpZCBjb2RlLiAgRm9yIGEgdGFibGUKKyAgIHBvaW50ZXIsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wIGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBvZgorICAgdGhhdCB0YWJsZS4gIEZvciBhIGxlbmd0aCBvciBkaXN0YW5jZSwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AKKyAgIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBnZXQgYWZ0ZXIgdGhlIGNvZGUuICBiaXRzIGlzCisgICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHBhcnQgb2YgdGhlIGNvZGUgdG8gZHJvcCBvZmYKKyAgIG9mIHRoZSBiaXQgYnVmZmVyLiAgdmFsIGlzIHRoZSBhY3R1YWwgYnl0ZSB0byBvdXRwdXQgaW4gdGhlIGNhc2UKKyAgIG9mIGEgbGl0ZXJhbCwgdGhlIGJhc2UgbGVuZ3RoIG9yIGRpc3RhbmNlLCBvciB0aGUgb2Zmc2V0IGZyb20KKyAgIHRoZSBjdXJyZW50IHRhYmxlIHRvIHRoZSBuZXh0IHRhYmxlLiAgRWFjaCBlbnRyeSBpcyBmb3VyIGJ5dGVzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgb3A7ICAgICAgICAgICAvKiBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIHRhYmxlIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgICAgICAgLyogYml0cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7ICAgICAgICAgLyogb2Zmc2V0IGluIHRhYmxlIG9yIGNvZGUgdmFsdWUgKi8KK30gY29kZTsKKworLyogb3AgdmFsdWVzIGFzIHNldCBieSBpbmZsYXRlX3RhYmxlKCk6CisgICAgMDAwMDAwMDAgLSBsaXRlcmFsCisgICAgMDAwMHR0dHQgLSB0YWJsZSBsaW5rLCB0dHR0ICE9IDAgaXMgdGhlIG51bWJlciBvZiB0YWJsZSBpbmRleCBiaXRzCisgICAgMDAwMWVlZWUgLSBsZW5ndGggb3IgZGlzdGFuY2UsIGVlZWUgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzCisgICAgMDExMDAwMDAgLSBlbmQgb2YgYmxvY2sKKyAgICAwMTAwMDAwMCAtIGludmFsaWQgY29kZQorICovCisKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZHluYW1pYyB0YWJsZS4gIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2RlIHN0cnVjdHVyZXMgaXMKKyAgIDE0NDQsIHdoaWNoIGlzIHRoZSBzdW0gb2YgODUyIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcyBhbmQgNTkyIGZvciBkaXN0YW5jZQorICAgY29kZXMuICBUaGVzZSB2YWx1ZXMgd2VyZSBmb3VuZCBieSBleGhhdXN0aXZlIHNlYXJjaGVzIHVzaW5nIHRoZSBwcm9ncmFtCisgICBleGFtcGxlcy9lbm91Z2guYyBmb3VuZCBpbiB0aGUgemxpYiBkaXN0cmlidHV0aW9uLiAgVGhlIGFyZ3VtZW50cyB0byB0aGF0CisgICBwcm9ncmFtIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSwgYW5kIHRoZQorICAgbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGEgY29kZS4gICJlbm91Z2ggMjg2IDkgMTUiIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcworICAgcmV0dXJucyByZXR1cm5zIDg1MiwgYW5kICJlbm91Z2ggMzAgNiAxNSIgZm9yIGRpc3RhbmNlIGNvZGVzIHJldHVybnMgNTkyLgorICAgVGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplICg5IG9yIDYpIGlzIGZvdW5kIGluIHRoZSBmaWZ0aCBhcmd1bWVudCBvZiB0aGUKKyAgIGluZmxhdGVfdGFibGUoKSBjYWxscyBpbiBpbmZsYXRlLmMgYW5kIGluZmJhY2suYy4gIElmIHRoZSByb290IHRhYmxlIHNpemUgaXMKKyAgIGNoYW5nZWQsIHRoZW4gdGhlc2UgbWF4aW11bSBzaXplcyB3b3VsZCBiZSBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCBhbmQKKyAgIHVwZGF0ZWQuICovCisjZGVmaW5lIEVOT1VHSF9MRU5TIDg1MgorI2RlZmluZSBFTk9VR0hfRElTVFMgNTkyCisjZGVmaW5lIEVOT1VHSCAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKQorCisvKiBUeXBlIG9mIGNvZGUgdG8gYnVpbGQgZm9yIGluZmxhdGVfdGFibGUoKSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBDT0RFUywKKyAgICBMRU5TLAorICAgIERJU1RTCit9IGNvZGV0eXBlOworCitpbnQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX3RhYmxlIE9GKChjb2RldHlwZSB0eXBlLCB1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvZGVzLCBjb2RlIEZBUiAqIEZBUiAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZBUiAqYml0cywgdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrKSk7CmRpZmYgLS1naXQgYS9jb20zMi9saWIvemxpYi90cmVlcy5jIGIvY29tMzIvbGliL3psaWIvdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRlM2NkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGliL3psaWIvdHJlZXMuYwpAQCAtMCwwICsxLDEyNDQgQEAKKy8qIHRyZWVzLmMgLS0gb3V0cHV0IGRlZmxhdGVkIGRhdGEgdXNpbmcgSHVmZm1hbiBjb2RpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEwIEplYW4tbG91cCBHYWlsbHkKKyAqIGRldGVjdF9kYXRhX3R5cGUoKSBmdW5jdGlvbiBwcm92aWRlZCBmcmVlbHkgYnkgQ29zbWluIFRydXRhLCAyMDA2CisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqICBBTEdPUklUSE0KKyAqCisgKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIHVzZXMgc2V2ZXJhbCBIdWZmbWFuIHRyZWVzLiBUaGUgbW9yZQorICogICAgICBjb21tb24gc291cmNlIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgc2hvcnRlciBiaXQgc2VxdWVuY2VzLgorICoKKyAqICAgICAgRWFjaCBjb2RlIHRyZWUgaXMgc3RvcmVkIGluIGEgY29tcHJlc3NlZCBmb3JtIHdoaWNoIGlzIGl0c2VsZgorICogYSBIdWZmbWFuIGVuY29kaW5nIG9mIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgY29kZSBzdHJpbmdzIChpbgorICogYXNjZW5kaW5nIG9yZGVyIGJ5IHNvdXJjZSB2YWx1ZXMpLiAgVGhlIGFjdHVhbCBjb2RlIHN0cmluZ3MgYXJlCisgKiByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGxlbmd0aHMgaW4gdGhlIGluZmxhdGUgcHJvY2VzcywgYXMgZGVzY3JpYmVkCisgKiBpbiB0aGUgZGVmbGF0ZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKgorICogICAgICBEZXV0c2NoLCBMLlAuLCInRGVmbGF0ZScgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KKyAqICAgICAgQXZhaWxhYmxlIGluIGZ0cC51dS5uZXQ6L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy9kZWZsYXRlLTEuMS5kb2MKKyAqCisgKiAgICAgIFN0b3JlciwgSmFtZXMgQS4KKyAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVvcnksIHBwLiA0OS01MC4KKyAqICAgICAgICAgIENvbXB1dGVyIFNjaWVuY2UgUHJlc3MsIDE5ODguICBJU0JOIDAtNzE2Ny04MTU2LTUuCisgKgorICogICAgICBTZWRnZXdpY2ssIFIuCisgKiAgICAgICAgICBBbGdvcml0aG1zLCBwMjkwLgorICogICAgICAgICAgQWRkaXNvbi1XZXNsZXksIDE5ODMuIElTQk4gMC0yMDEtMDY2NzItNi4KKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworLyogI2RlZmluZSBHRU5fVFJFRVNfSCAqLworCisjaW5jbHVkZSAiZGVmbGF0ZS5oIgorCisjaWZkZWYgREVCVUdfWkxJQgorIyAgaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0YW50cworICovCisKKyNkZWZpbmUgTUFYX0JMX0JJVFMgNworLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqLworCisjZGVmaW5lIEVORF9CTE9DSyAyNTYKKy8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi8KKworI2RlZmluZSBSRVBfM182ICAgICAgMTYKKy8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworI2RlZmluZSBSRVBaXzNfMTAgICAgMTcKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworCisjZGVmaW5lIFJFUFpfMTFfMTM4ICAxOAorLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2xiaXRzW0xFTkdUSF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqLworICAgPSB7MCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwfTsKKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2RiaXRzW0RfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLworICAgPSB7MCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM307CisKK2xvY2FsIGNvbnN0IGludCBleHRyYV9ibGJpdHNbQkxfQ09ERVNdLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8KKyAgID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDd9OworCitsb2NhbCBjb25zdCB1Y2ggYmxfb3JkZXJbQkxfQ09ERVNdCisgICA9IHsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1fTsKKy8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmcKKyAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLgorICovCisKKyNkZWZpbmUgQnVmX3NpemUgKDggKiAyKnNpemVvZihjaGFyKSkKKy8qIE51bWJlciBvZiBiaXRzIHVzZWQgd2l0aGluIGJpX2J1Zi4gKGJpX2J1ZiBtaWdodCBiZSBpbXBsZW1lbnRlZCBvbgorICogbW9yZSB0aGFuIDE2IGJpdHMgb24gc29tZSBzeXN0ZW1zLikKKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuCisgKi8KKworI2RlZmluZSBESVNUX0NPREVfTEVOICA1MTIgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovCisKKyNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQorLyogbm9uIEFOU0kgY29tcGlsZXJzIG1heSBub3QgYWNjZXB0IHRyZWVzLmggKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXTsKKy8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vCisgKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlcgorICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIF90cl9pbml0CisgKiBiZWxvdykuCisgKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU107CisvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlCisgKiA1IGJpdHMuKQorICovCisKK3VjaCBfZGlzdF9jb2RlW0RJU1RfQ09ERV9MRU5dOworLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlcworICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZgorICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuCisgKi8KKwordWNoIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdOworLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqLworCitsb2NhbCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXTsKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovCisKK2xvY2FsIGludCBiYXNlX2Rpc3RbRF9DT0RFU107CisvKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLworCisjZWxzZQorIyAgaW5jbHVkZSAidHJlZXMuaCIKKyNlbmRpZiAvKiBHRU5fVFJFRVNfSCAqLworCitzdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHsKKyAgICBjb25zdCBjdF9kYXRhICpzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi8KKyAgICBjb25zdCBpbnRmICpleHRyYV9iaXRzOyAgICAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCisgICAgaW50ICAgICBleHRyYV9iYXNlOyAgICAgICAgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovCisgICAgaW50ICAgICBlbGVtczsgICAgICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovCisgICAgaW50ICAgICBtYXhfbGVuZ3RoOyAgICAgICAgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovCit9OworCitsb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfbF9kZXNjID0KK3tzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUysxLCBMX0NPREVTLCBNQVhfQklUU307CisKK2xvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19kX2Rlc2MgPQore3N0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTfTsKKworbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2JsX2Rlc2MgPQoreyhjb25zdCBjdF9kYXRhICopMCwgZXh0cmFfYmxiaXRzLCAwLCAgIEJMX0NPREVTLCBNQVhfQkxfQklUU307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgKHN0YXRpYykgcm91dGluZXMgaW4gdGhpcyBmaWxlLgorICovCisKK2xvY2FsIHZvaWQgdHJfc3RhdGljX2luaXQgT0YoKHZvaWQpKTsKK2xvY2FsIHZvaWQgaW5pdF9ibG9jayAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgcHFkb3duaGVhcCAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBrKSk7Citsb2NhbCB2b2lkIGdlbl9iaXRsZW4gICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB0cmVlX2Rlc2MgKmRlc2MpKTsKK2xvY2FsIHZvaWQgZ2VuX2NvZGVzICAgICAgT0YoKGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSwgdXNoZiAqYmxfY291bnQpKTsKK2xvY2FsIHZvaWQgYnVpbGRfdHJlZSAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHRyZWVfZGVzYyAqZGVzYykpOworbG9jYWwgdm9pZCBzY2FuX3RyZWUgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Citsb2NhbCB2b2lkIHNlbmRfdHJlZSAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKK2xvY2FsIGludCAgYnVpbGRfYmxfdHJlZSAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBsY29kZXMsIGludCBkY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxjb2RlcykpOworbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqbHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdF9kYXRhICpkdHJlZSkpOworbG9jYWwgaW50ICBkZXRlY3RfZGF0YV90eXBlIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCB1bnNpZ25lZCBiaV9yZXZlcnNlIE9GKCh1bnNpZ25lZCB2YWx1ZSwgaW50IGxlbmd0aCkpOworbG9jYWwgdm9pZCBiaV93aW5kdXAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBiaV9mbHVzaCAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBjb3B5X2Jsb2NrICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdW5zaWduZWQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlcikpOworCisjaWZkZWYgR0VOX1RSRUVTX0gKK2xvY2FsIHZvaWQgZ2VuX3RyZWVzX2hlYWRlciBPRigodm9pZCkpOworI2VuZGlmCisKKyNpZm5kZWYgREVCVUdfWkxJQgorIyAgZGVmaW5lIHNlbmRfY29kZShzLCBjLCB0cmVlKSBzZW5kX2JpdHMocywgdHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbikKKyAgIC8qIFNlbmQgYSBjb2RlIG9mIHRoZSBnaXZlbiB0cmVlLiBjIGFuZCB0cmVlIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzICovCisKKyNlbHNlIC8qIERFQlVHX1pMSUIgKi8KKyMgIGRlZmluZSBzZW5kX2NvZGUocywgYywgdHJlZSkgXAorICAgICB7IGlmICh6X3ZlcmJvc2U+MikgZnByaW50ZihzdGRlcnIsIlxuY2QgJTNkICIsKGMpKTsgXAorICAgICAgIHNlbmRfYml0cyhzLCB0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKTsgfQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uCisgKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuCisgKi8KKyNkZWZpbmUgcHV0X3Nob3J0KHMsIHcpIHsgXAorICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTsgXAorICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTsgXAorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLgorICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuCisgKi8KKyNpZmRlZiBERUJVR19aTElCCitsb2NhbCB2b2lkIHNlbmRfYml0cyAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgdmFsdWUsIGludCBsZW5ndGgpKTsKKworbG9jYWwgdm9pZCBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCB2YWx1ZTsgIC8qIHZhbHVlIHRvIHNlbmQgKi8KKyAgICBpbnQgbGVuZ3RoOyAvKiBudW1iZXIgb2YgYml0cyAqLworeworICAgIFRyYWNldnYoKHN0ZGVyciwiIGwgJTJkIHYgJTR4ICIsIGxlbmd0aCwgdmFsdWUpKTsKKyAgICBBc3NlcnQobGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gMTUsICJpbnZhbGlkIGxlbmd0aCIpOworICAgIHMtPmJpdHNfc2VudCArPSAodWxnKWxlbmd0aDsKKworICAgIC8qIElmIG5vdCBlbm91Z2ggcm9vbSBpbiBiaV9idWYsIHVzZSAodmFsaWQpIGJpdHMgZnJvbSBiaV9idWYgYW5kCisgICAgICogKDE2IC0gYmlfdmFsaWQpIGJpdHMgZnJvbSB2YWx1ZSwgbGVhdmluZyAod2lkdGggLSAoMTYtYmlfdmFsaWQpKQorICAgICAqIHVudXNlZCBiaXRzIGluIHZhbHVlLgorICAgICAqLworICAgIGlmIChzLT5iaV92YWxpZCA+IChpbnQpQnVmX3NpemUgLSBsZW5ndGgpIHsKKyAgICAgICAgcy0+YmlfYnVmIHw9ICh1c2gpdmFsdWUgPDwgcy0+YmlfdmFsaWQ7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPSAodXNoKXZhbHVlID4+IChCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkKTsKKyAgICAgICAgcy0+YmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+YmlfYnVmIHw9ICh1c2gpdmFsdWUgPDwgcy0+YmlfdmFsaWQ7CisgICAgICAgIHMtPmJpX3ZhbGlkICs9IGxlbmd0aDsKKyAgICB9Cit9CisjZWxzZSAvKiAhREVCVUdfWkxJQiAqLworCisjZGVmaW5lIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKSBcCit7IGludCBsZW4gPSBsZW5ndGg7XAorICBpZiAocy0+YmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuKSB7XAorICAgIGludCB2YWwgPSB2YWx1ZTtcCisgICAgcy0+YmlfYnVmIHw9ICh1c2gpdmFsIDw8IHMtPmJpX3ZhbGlkO1wKKyAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTtcCisgICAgcy0+YmlfYnVmID0gKHVzaCl2YWwgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpO1wKKyAgICBzLT5iaV92YWxpZCArPSBsZW4gLSBCdWZfc2l6ZTtcCisgIH0gZWxzZSB7XAorICAgIHMtPmJpX2J1ZiB8PSAodXNoKSh2YWx1ZSkgPDwgcy0+YmlfdmFsaWQ7XAorICAgIHMtPmJpX3ZhbGlkICs9IGxlbjtcCisgIH1cCit9CisjZW5kaWYgLyogREVCVUdfWkxJQiAqLworCisKKy8qIHRoZSBhcmd1bWVudHMgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLgorICovCitsb2NhbCB2b2lkIHRyX3N0YXRpY19pbml0KCkKK3sKKyNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQorICAgIHN0YXRpYyBpbnQgc3RhdGljX2luaXRfZG9uZSA9IDA7CisgICAgaW50IG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovCisgICAgaW50IGxlbmd0aDsgICAvKiBsZW5ndGggdmFsdWUgKi8KKyAgICBpbnQgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi8KKyAgICBpbnQgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovCisgICAgdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdOworICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqLworCisgICAgaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjsKKworICAgIC8qIEZvciBzb21lIGVtYmVkZGVkIHRhcmdldHMsIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdCBpbml0aWFsaXplZDogKi8KKyNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSUworICAgIHN0YXRpY19sX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfbHRyZWU7CisgICAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7CisgICAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTsKKyAgICBzdGF0aWNfZF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9kYml0czsKKyAgICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzOworI2VuZGlmCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovCisgICAgbGVuZ3RoID0gMDsKKyAgICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgTEVOR1RIX0NPREVTLTE7IGNvZGUrKykgeworICAgICAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDxleHRyYV9sYml0c1tjb2RlXSk7IG4rKykgeworICAgICAgICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGxlbmd0aCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NiIpOworICAgIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkCisgICAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2UKKyAgICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6CisgICAgICovCisgICAgX2xlbmd0aF9jb2RlW2xlbmd0aC0xXSA9ICh1Y2gpY29kZTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqLworICAgIGRpc3QgPSAwOworICAgIGZvciAoY29kZSA9IDAgOyBjb2RlIDwgMTY7IGNvZGUrKykgeworICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0OworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7CisgICAgICAgICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChkaXN0ID09IDI1NiwgInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NiIpOworICAgIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqLworICAgIGZvciAoIDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykgeworICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8KGV4dHJhX2RiaXRzW2NvZGVdLTcpKTsgbisrKSB7CisgICAgICAgICAgICBfZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChkaXN0ID09IDI1NiwgInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTIiKTsKKworICAgIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi8KKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIGJsX2NvdW50W2JpdHNdID0gMDsKKyAgICBuID0gMDsKKyAgICB3aGlsZSAobiA8PSAxNDMpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDgsIGJsX2NvdW50WzhdKys7CisgICAgd2hpbGUgKG4gPD0gMjU1KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA5LCBibF9jb3VudFs5XSsrOworICAgIHdoaWxlIChuIDw9IDI3OSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gNywgYmxfY291bnRbN10rKzsKKyAgICB3aGlsZSAobiA8PSAyODcpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDgsIGJsX2NvdW50WzhdKys7CisgICAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlCisgICAgICogdHJlZSBjb25zdHJ1Y3Rpb24gdG8gZ2V0IGEgY2Fub25pY2FsIEh1ZmZtYW4gdHJlZSAobG9uZ2VzdCBjb2RlCisgICAgICogYWxsIG9uZXMpCisgICAgICovCisgICAgZ2VuX2NvZGVzKChjdF9kYXRhICopc3RhdGljX2x0cmVlLCBMX0NPREVTKzEsIGJsX2NvdW50KTsKKworICAgIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqLworICAgIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHsKKyAgICAgICAgc3RhdGljX2R0cmVlW25dLkxlbiA9IDU7CisgICAgICAgIHN0YXRpY19kdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZSgodW5zaWduZWQpbiwgNSk7CisgICAgfQorICAgIHN0YXRpY19pbml0X2RvbmUgPSAxOworCisjICBpZmRlZiBHRU5fVFJFRVNfSAorICAgIGdlbl90cmVlc19oZWFkZXIoKTsKKyMgIGVuZGlmCisjZW5kaWYgLyogZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZW5lcmVyYXRlIHRoZSBmaWxlIHRyZWVzLmggZGVzY3JpYmluZyB0aGUgc3RhdGljIHRyZWVzLgorICovCisjaWZkZWYgR0VOX1RSRUVTX0gKKyMgIGlmbmRlZiBERUJVR19aTElCCisjICAgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBlbmRpZgorCisjICBkZWZpbmUgU0VQQVJBVE9SKGksIGxhc3QsIHdpZHRoKSBcCisgICAgICAoKGkpID09IChsYXN0KT8gIlxufTtcblxuIiA6ICAgIFwKKyAgICAgICAoKGkpICUgKHdpZHRoKSA9PSAod2lkdGgpLTEgPyAiLFxuIiA6ICIsICIpKQorCit2b2lkIGdlbl90cmVlc19oZWFkZXIoKQoreworICAgIEZJTEUgKmhlYWRlciA9IGZvcGVuKCJ0cmVlcy5oIiwgInciKTsKKyAgICBpbnQgaTsKKworICAgIEFzc2VydCAoaGVhZGVyICE9IE5VTEwsICJDYW4ndCBvcGVuIHRyZWVzLmgiKTsKKyAgICBmcHJpbnRmKGhlYWRlciwKKyAgICAgICAgICAgICIvKiBoZWFkZXIgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggLURHRU5fVFJFRVNfSCAqL1xuXG4iKTsKKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBMX0NPREVTKzI7IGkrKykgeworICAgICAgICBmcHJpbnRmKGhlYWRlciwgInt7JTN1fSx7JTN1fX0lcyIsIHN0YXRpY19sdHJlZVtpXS5Db2RlLAorICAgICAgICAgICAgICAgIHN0YXRpY19sdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBMX0NPREVTKzEsIDUpKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgeworICAgICAgICBmcHJpbnRmKGhlYWRlciwgInt7JTJ1fSx7JTJ1fX0lcyIsIHN0YXRpY19kdHJlZVtpXS5Db2RlLAorICAgICAgICAgICAgICAgIHN0YXRpY19kdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDUpKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRElTVF9DT0RFX0xFTjsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfZGlzdF9jb2RlW2ldLAorICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBESVNUX0NPREVfTEVOLTEsIDIwKSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsCisgICAgICAgICJjb25zdCB1Y2ggWkxJQl9JTlRFUk5BTCBfbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXT0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQVRDSC1NSU5fTUFUQ0grMTsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfbGVuZ3RoX2NvZGVbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIE1BWF9NQVRDSC1NSU5fTUFUQ0gsIDIwKSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBMRU5HVEhfQ09ERVM7IGkrKykgeworICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiUxdSVzIiwgYmFzZV9sZW5ndGhbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIExFTkdUSF9DT0RFUy0xLCAyMCkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgaW50IGJhc2VfZGlzdFtEX0NPREVTXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBEX0NPREVTOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICIlNXUlcyIsIGJhc2VfZGlzdFtpXSwKKyAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgRF9DT0RFUy0xLCAxMCkpOworICAgIH0KKworICAgIGZjbG9zZShoZWFkZXIpOworfQorI2VuZGlmIC8qIEdFTl9UUkVFU19IICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtLgorICovCit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2luaXQocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIHRyX3N0YXRpY19pbml0KCk7CisKKyAgICBzLT5sX2Rlc2MuZHluX3RyZWUgPSBzLT5keW5fbHRyZWU7CisgICAgcy0+bF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfbF9kZXNjOworCisgICAgcy0+ZF9kZXNjLmR5bl90cmVlID0gcy0+ZHluX2R0cmVlOworICAgIHMtPmRfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2RfZGVzYzsKKworICAgIHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBzLT5ibF90cmVlOworICAgIHMtPmJsX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19ibF9kZXNjOworCisgICAgcy0+YmlfYnVmID0gMDsKKyAgICBzLT5iaV92YWxpZCA9IDA7CisgICAgcy0+bGFzdF9lb2JfbGVuID0gODsgLyogZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZSAqLworI2lmZGVmIERFQlVHX1pMSUIKKyAgICBzLT5jb21wcmVzc2VkX2xlbiA9IDBMOworICAgIHMtPmJpdHNfc2VudCA9IDBMOworI2VuZGlmCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi8KKyAgICBpbml0X2Jsb2NrKHMpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCisgKi8KK2xvY2FsIHZvaWQgaW5pdF9ibG9jayhzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovCisgICAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIHMtPmR5bl9sdHJlZVtuXS5GcmVxID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgcy0+ZHluX2R0cmVlW25dLkZyZXEgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSBzLT5ibF90cmVlW25dLkZyZXEgPSAwOworCisgICAgcy0+ZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CisgICAgcy0+b3B0X2xlbiA9IHMtPnN0YXRpY19sZW4gPSAwTDsKKyAgICBzLT5sYXN0X2xpdCA9IHMtPm1hdGNoZXMgPSAwOworfQorCisjZGVmaW5lIFNNQUxMRVNUIDEKKy8qIEluZGV4IHdpdGhpbiB0aGUgaGVhcCBhcnJheSBvZiBsZWFzdCBmcmVxdWVudCBub2RlIGluIHRoZSBIdWZmbWFuIHRyZWUgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlbW92ZSB0aGUgc21hbGxlc3QgZWxlbWVudCBmcm9tIHRoZSBoZWFwIGFuZCByZWNyZWF0ZSB0aGUgaGVhcCB3aXRoCisgKiBvbmUgbGVzcyBlbGVtZW50LiBVcGRhdGVzIGhlYXAgYW5kIGhlYXBfbGVuLgorICovCisjZGVmaW5lIHBxcmVtb3ZlKHMsIHRyZWUsIHRvcCkgXAore1wKKyAgICB0b3AgPSBzLT5oZWFwW1NNQUxMRVNUXTsgXAorICAgIHMtPmhlYXBbU01BTExFU1RdID0gcy0+aGVhcFtzLT5oZWFwX2xlbi0tXTsgXAorICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW4KKyAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLgorICovCisjZGVmaW5lIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIFwKKyAgICh0cmVlW25dLkZyZXEgPCB0cmVlW21dLkZyZXEgfHwgXAorICAgKHRyZWVbbl0uRnJlcSA9PSB0cmVlW21dLkZyZXEgJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLAorICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmcKKyAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKKyAqIHR3byBzb25zKS4KKyAqLworbG9jYWwgdm9pZCBwcWRvd25oZWFwKHMsIHRyZWUsIGspCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqLworICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovCit7CisgICAgaW50IHYgPSBzLT5oZWFwW2tdOworICAgIGludCBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqLworICAgIHdoaWxlIChqIDw9IHMtPmhlYXBfbGVuKSB7CisgICAgICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovCisgICAgICAgIGlmIChqIDwgcy0+aGVhcF9sZW4gJiYKKyAgICAgICAgICAgIHNtYWxsZXIodHJlZSwgcy0+aGVhcFtqKzFdLCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqLworICAgICAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIGJyZWFrOworCisgICAgICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovCisgICAgICAgIHMtPmhlYXBba10gPSBzLT5oZWFwW2pdOyAgayA9IGo7CisKKyAgICAgICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqLworICAgICAgICBqIDw8PSAxOworICAgIH0KKyAgICBzLT5oZWFwW2tdID0gdjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aAorICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmQKKyAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlCisgKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguCisgKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzCisgKiAgICAgbm90IG51bGwuCisgKi8KK2xvY2FsIHZvaWQgZ2VuX2JpdGxlbihzLCBkZXNjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCit7CisgICAgY3RfZGF0YSAqdHJlZSAgICAgICAgPSBkZXNjLT5keW5fdHJlZTsKKyAgICBpbnQgbWF4X2NvZGUgICAgICAgICA9IGRlc2MtPm1heF9jb2RlOworICAgIGNvbnN0IGN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKKyAgICBjb25zdCBpbnRmICpleHRyYSAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYml0czsKKyAgICBpbnQgYmFzZSAgICAgICAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYmFzZTsKKyAgICBpbnQgbWF4X2xlbmd0aCAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+bWF4X2xlbmd0aDsKKyAgICBpbnQgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi8KKyAgICBpbnQgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqLworICAgIGludCB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqLworICAgIHVzaCBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovCisgICAgaW50IG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqLworCisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBzLT5ibF9jb3VudFtiaXRzXSA9IDA7CisKKyAgICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heQorICAgICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLgorICAgICAqLworICAgIHRyZWVbcy0+aGVhcFtzLT5oZWFwX21heF1dLkxlbiA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi8KKworICAgIGZvciAoaCA9IHMtPmhlYXBfbWF4KzE7IGggPCBIRUFQX1NJWkU7IGgrKykgeworICAgICAgICBuID0gcy0+aGVhcFtoXTsKKyAgICAgICAgYml0cyA9IHRyZWVbdHJlZVtuXS5EYWRdLkxlbiArIDE7CisgICAgICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkgYml0cyA9IG1heF9sZW5ndGgsIG92ZXJmbG93Kys7CisgICAgICAgIHRyZWVbbl0uTGVuID0gKHVzaCliaXRzOworICAgICAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqLworCisgICAgICAgIGlmIChuID4gbWF4X2NvZGUpIGNvbnRpbnVlOyAvKiBub3QgYSBsZWFmIG5vZGUgKi8KKworICAgICAgICBzLT5ibF9jb3VudFtiaXRzXSsrOworICAgICAgICB4Yml0cyA9IDA7CisgICAgICAgIGlmIChuID49IGJhc2UpIHhiaXRzID0gZXh0cmFbbi1iYXNlXTsKKyAgICAgICAgZiA9IHRyZWVbbl0uRnJlcTsKKyAgICAgICAgcy0+b3B0X2xlbiArPSAodWxnKWYgKiAoYml0cyArIHhiaXRzKTsKKyAgICAgICAgaWYgKHN0cmVlKSBzLT5zdGF0aWNfbGVuICs9ICh1bGcpZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7CisgICAgfQorICAgIGlmIChvdmVyZmxvdyA9PSAwKSByZXR1cm47CisKKyAgICBUcmFjZSgoc3RkZXJyLCJcbmJpdCBsZW5ndGggb3ZlcmZsb3dcbiIpKTsKKyAgICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqLworCisgICAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi8KKyAgICBkbyB7CisgICAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoLTE7CisgICAgICAgIHdoaWxlIChzLT5ibF9jb3VudFtiaXRzXSA9PSAwKSBiaXRzLS07CisgICAgICAgIHMtPmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovCisgICAgICAgIHMtPmJsX2NvdW50W2JpdHMrMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqLworICAgICAgICBzLT5ibF9jb3VudFttYXhfbGVuZ3RoXS0tOworICAgICAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLAorICAgICAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF0KKyAgICAgICAgICovCisgICAgICAgIG92ZXJmbG93IC09IDI7CisgICAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTsKKworICAgIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KKyAgICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsCisgICAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW4KKyAgICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLikKKyAgICAgKi8KKyAgICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9IDA7IGJpdHMtLSkgeworICAgICAgICBuID0gcy0+YmxfY291bnRbYml0c107CisgICAgICAgIHdoaWxlIChuICE9IDApIHsKKyAgICAgICAgICAgIG0gPSBzLT5oZWFwWy0taF07CisgICAgICAgICAgICBpZiAobSA+IG1heF9jb2RlKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpIHRyZWVbbV0uTGVuICE9ICh1bnNpZ25lZCkgYml0cykgeworICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsImNvZGUgJWQgYml0cyAlZC0+JWRcbiIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7CisgICAgICAgICAgICAgICAgcy0+b3B0X2xlbiArPSAoKGxvbmcpYml0cyAtIChsb25nKXRyZWVbbV0uTGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsb25nKXRyZWVbbV0uRnJlcTsKKyAgICAgICAgICAgICAgICB0cmVlW21dLkxlbiA9ICh1c2gpYml0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKKyAqIG9wdGltYWwpLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3IKKyAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vbgorICogICAgIHplcm8gY29kZSBsZW5ndGguCisgKi8KK2xvY2FsIHZvaWQgZ2VuX2NvZGVzICh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpCisgICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KKyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovCit7CisgICAgdXNoIG5leHRfY29kZVtNQVhfQklUUysxXTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKyAgICB1c2ggY29kZSA9IDA7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi8KKyAgICBpbnQgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi8KKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovCisKKyAgICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXMKKyAgICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC4KKyAgICAgKi8KKyAgICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHsKKyAgICAgICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cy0xXSkgPDwgMTsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZQorICAgICAqIG11c3QgYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLAorICAgICAgICAgICAgImluY29uc2lzdGVudCBiaXQgY291bnRzIik7CisgICAgVHJhY2V2KChzdGRlcnIsIlxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCAiLCBtYXhfY29kZSkpOworCisgICAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBpbnQgbGVuID0gdHJlZVtuXS5MZW47CisgICAgICAgIGlmIChsZW4gPT0gMCkgY29udGludWU7CisgICAgICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovCisgICAgICAgIHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTsKKworICAgICAgICBUcmFjZWN2KHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLCJcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgIiwKKyAgICAgICAgICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy4KKyAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoCisgKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMKKyAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuCisgKi8KK2xvY2FsIHZvaWQgYnVpbGRfdHJlZShzLCBkZXNjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCit7CisgICAgY3RfZGF0YSAqdHJlZSAgICAgICAgID0gZGVzYy0+ZHluX3RyZWU7CisgICAgY29uc3QgY3RfZGF0YSAqc3RyZWUgID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKKyAgICBpbnQgZWxlbXMgICAgICAgICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmVsZW1zOworICAgIGludCBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqLworICAgIGludCBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KKyAgICBpbnQgbm9kZTsgICAgICAgICAgLyogbmV3IG5vZGUgYmVpbmcgY3JlYXRlZCAqLworCisgICAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgorICAgICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLgorICAgICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCisgICAgICovCisgICAgcy0+aGVhcF9sZW4gPSAwLCBzLT5oZWFwX21heCA9IEhFQVBfU0laRTsKKworICAgIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7CisgICAgICAgIGlmICh0cmVlW25dLkZyZXEgIT0gMCkgeworICAgICAgICAgICAgcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gbWF4X2NvZGUgPSBuOworICAgICAgICAgICAgcy0+ZGVwdGhbbl0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJlZVtuXS5MZW4gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKKyAgICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUKKyAgICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdAorICAgICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCisgICAgICovCisgICAgd2hpbGUgKHMtPmhlYXBfbGVuIDwgMikgeworICAgICAgICBub2RlID0gcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTsKKyAgICAgICAgdHJlZVtub2RlXS5GcmVxID0gMTsKKyAgICAgICAgcy0+ZGVwdGhbbm9kZV0gPSAwOworICAgICAgICBzLT5vcHRfbGVuLS07IGlmIChzdHJlZSkgcy0+c3RhdGljX2xlbiAtPSBzdHJlZVtub2RlXS5MZW47CisgICAgICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqLworICAgIH0KKyAgICBkZXNjLT5tYXhfY29kZSA9IG1heF9jb2RlOworCisgICAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLAorICAgICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgorICAgICAqLworICAgIGZvciAobiA9IHMtPmhlYXBfbGVuLzI7IG4gPj0gMTsgbi0tKSBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOworCisgICAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3bworICAgICAqIGZyZXF1ZW50IG5vZGVzLgorICAgICAqLworICAgIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLworICAgIGRvIHsKKyAgICAgICAgcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi8KKyAgICAgICAgbSA9IHMtPmhlYXBbU01BTExFU1RdOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqLworCisgICAgICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi8KKyAgICAgICAgcy0+aGVhcFstLShzLT5oZWFwX21heCldID0gbTsKKworICAgICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqLworICAgICAgICB0cmVlW25vZGVdLkZyZXEgPSB0cmVlW25dLkZyZXEgKyB0cmVlW21dLkZyZXE7CisgICAgICAgIHMtPmRlcHRoW25vZGVdID0gKHVjaCkoKHMtPmRlcHRoW25dID49IHMtPmRlcHRoW21dID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVwdGhbbl0gOiBzLT5kZXB0aFttXSkgKyAxKTsKKyAgICAgICAgdHJlZVtuXS5EYWQgPSB0cmVlW21dLkRhZCA9ICh1c2gpbm9kZTsKKyNpZmRlZiBEVU1QX0JMX1RSRUUKKyAgICAgICAgaWYgKHRyZWUgPT0gcy0+YmxfdHJlZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxubm9kZSAlZCglZCksIHNvbnMgJWQoJWQpICVkKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5GcmVxLCBtLCB0cmVlW21dLkZyZXEpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KKyAgICAgICAgcy0+aGVhcFtTTUFMTEVTVF0gPSBub2RlKys7CisgICAgICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOworCisgICAgfSB3aGlsZSAocy0+aGVhcF9sZW4gPj0gMik7CisKKyAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBzLT5oZWFwW1NNQUxMRVNUXTsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3cKKyAgICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuCisgICAgICovCisgICAgZ2VuX2JpdGxlbihzLCAodHJlZV9kZXNjICopZGVzYyk7CisKKyAgICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovCisgICAgZ2VuX2NvZGVzICgoY3RfZGF0YSAqKXRyZWUsIG1heF9jb2RlLCBzLT5ibF9jb3VudCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2RlcworICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4KKyAqLworbG9jYWwgdm9pZCBzY2FuX3RyZWUgKHMsIHRyZWUsIG1heF9jb2RlKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCisgICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gKHVzaCkweGZmZmY7IC8qIGd1YXJkICovCisKKyAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CisgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworICAgICAgICAgICAgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXEgKz0gY291bnQ7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXErKzsKKyAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQXzNfNl0uRnJlcSsrOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBaXzExXzEzOF0uRnJlcSsrOworICAgICAgICB9CisgICAgICAgIGNvdW50ID0gMDsgcHJldmxlbiA9IGN1cmxlbjsKKyAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA2LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNywgbWluX2NvdW50ID0gNDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluCisgKiBibF90cmVlLgorICovCitsb2NhbCB2b2lkIHNlbmRfdHJlZSAocywgdHJlZSwgbWF4X2NvZGUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCisgICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworCisgICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgIGN1cmxlbiA9IG5leHRsZW47IG5leHRsZW4gPSB0cmVlW24rMV0uTGVuOworICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKKyAgICAgICAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT0gMCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSB7CisgICAgICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IGNvdW50LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTMsIDIpOworCisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0xMSwgNyk7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW4KKyAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgorICovCitsb2NhbCBpbnQgYnVpbGRfYmxfdHJlZShzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG1heF9ibGluZGV4OyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLworICAgIHNjYW5fdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgcy0+bF9kZXNjLm1heF9jb2RlKTsKKyAgICBzY2FuX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUsIHMtPmRfZGVzYy5tYXhfY29kZSk7CisKKyAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqLworICAgIGJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmJsX2Rlc2MpKSk7CisgICAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAorICAgICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuCisgICAgICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXQKKyAgICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5cworICAgICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKKyAgICAgKi8KKyAgICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMtMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkgeworICAgICAgICBpZiAocy0+YmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF1dLkxlbiAhPSAwKSBicmVhazsKKyAgICB9CisgICAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi8KKyAgICBzLT5vcHRfbGVuICs9IDMqKG1heF9ibGluZGV4KzEpICsgNSs1KzQ7CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGQiLAorICAgICAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpOworCisgICAgcmV0dXJuIG1heF9ibGluZGV4OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZQorICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuCisgKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuCisgKi8KK2xvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovCit7CisgICAgaW50IHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqLworCisgICAgQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgIm5vdCBlbm91Z2ggY29kZXMiKTsKKyAgICBBc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsCisgICAgICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY291bnRzOiAiKSk7CisgICAgc2VuZF9iaXRzKHMsIGxjb2Rlcy0yNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKyAgICBzZW5kX2JpdHMocywgZGNvZGVzLTEsICAgNSk7CisgICAgc2VuZF9iaXRzKHMsIGJsY29kZXMtNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCisgICAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykgeworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsKKyAgICAgICAgc2VuZF9iaXRzKHMsIHMtPmJsX3RyZWVbYmxfb3JkZXJbcmFua11dLkxlbiwgMyk7CisgICAgfQorICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworCisgICAgc2VuZF90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIGxpdGVyYWwgdHJlZSAqLworICAgIFRyYWNldigoc3RkZXJyLCAiXG5saXQgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKKworICAgIHNlbmRfdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSwgZGNvZGVzLTEpOyAvKiBkaXN0YW5jZSB0cmVlICovCisgICAgVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgc3RvcmVkIGJsb2NrCisgKi8KK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovCisgICAgdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCisgICAgaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworeworICAgIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLPDwxKStsYXN0LCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovCisjaWZkZWYgREVCVUdfWkxJQgorICAgIHMtPmNvbXByZXNzZWRfbGVuID0gKHMtPmNvbXByZXNzZWRfbGVuICsgMyArIDcpICYgKHVsZyl+N0w7CisgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gKHN0b3JlZF9sZW4gKyA0KSA8PCAzOworI2VuZGlmCisgICAgY29weV9ibG9jayhzLCBidWYsICh1bnNpZ25lZClzdG9yZWRfbGVuLCAxKTsgLyogd2l0aCBoZWFkZXIgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLgorICogVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuCisgKiBUaGUgY3VycmVudCBpbmZsYXRlIGNvZGUgcmVxdWlyZXMgOSBiaXRzIG9mIGxvb2thaGVhZC4gSWYgdGhlCisgKiBsYXN0IHR3byBjb2RlcyBmb3IgdGhlIHByZXZpb3VzIGJsb2NrIChyZWFsIGNvZGUgcGx1cyBFT0IpIHdlcmUgY29kZWQKKyAqIG9uIDUgYml0cyBvciBsZXNzLCBpbmZsYXRlIG1heSBoYXZlIG9ubHkgNSszIGJpdHMgb2YgbG9va2FoZWFkIHRvIGRlY29kZQorICogdGhlIGxhc3QgcmVhbCBjb2RlLiBJbiB0aGlzIGNhc2Ugd2Ugc2VuZCB0d28gZW1wdHkgc3RhdGljIGJsb2NrcyBpbnN0ZWFkCisgKiBvZiBvbmUuIChUaGVyZSBhcmUgbm8gcHJvYmxlbXMgaWYgdGhlIHByZXZpb3VzIGJsb2NrIGlzIHN0b3JlZCBvciBmaXhlZC4pCisgKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgYXNzdW1lIHRoZSB3b3JzdCBjYXNlIG9mIGxhc3QgcmVhbCBjb2RlIGVuY29kZWQKKyAqIG9uIG9uZSBiaXQgb25seS4KKyAqLwordm9pZCBaTElCX0lOVEVSTkFMIF90cl9hbGlnbihzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUzw8MSwgMyk7CisgICAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTsKKyNpZmRlZiBERUJVR19aTElCCisgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMTBMOyAvKiAzIGZvciBibG9jayB0eXBlLCA3IGZvciBFT0IgKi8KKyNlbmRpZgorICAgIGJpX2ZsdXNoKHMpOworICAgIC8qIE9mIHRoZSAxMCBiaXRzIGZvciB0aGUgZW1wdHkgYmxvY2ssIHdlIGhhdmUgYWxyZWFkeSBzZW50CisgICAgICogKDEwIC0gYmlfdmFsaWQpIGJpdHMuIFRoZSBsb29rYWhlYWQgZm9yIHRoZSBsYXN0IHJlYWwgY29kZSAoYmVmb3JlCisgICAgICogdGhlIEVPQiBvZiB0aGUgcHJldmlvdXMgYmxvY2spIHdhcyB0aHVzIGF0IGxlYXN0IG9uZSBwbHVzIHRoZSBsZW5ndGgKKyAgICAgKiBvZiB0aGUgRU9CIHBsdXMgd2hhdCB3ZSBoYXZlIGp1c3Qgc2VudCBvZiB0aGUgZW1wdHkgc3RhdGljIGJsb2NrLgorICAgICAqLworICAgIGlmICgxICsgcy0+bGFzdF9lb2JfbGVuICsgMTAgLSBzLT5iaV92YWxpZCA8IDkpIHsKKyAgICAgICAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUzw8MSwgMyk7CisgICAgICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7CisjaWZkZWYgREVCVUdfWkxJQgorICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAxMEw7CisjZW5kaWYKKyAgICAgICAgYmlfZmx1c2gocyk7CisgICAgfQorICAgIHMtPmxhc3RfZW9iX2xlbiA9IDc7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywgc3RhdGljCisgKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuCisgKi8KK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqLworICAgIHVsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqLworICAgIGludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi8KK3sKKyAgICB1bGcgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovCisgICAgaW50IG1heF9ibGluZGV4ID0gMDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KKworICAgIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi8KKyAgICBpZiAocy0+bGV2ZWwgPiAwKSB7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi8KKyAgICAgICAgaWYgKHMtPnN0cm0tPmRhdGFfdHlwZSA9PSBaX1VOS05PV04pCisgICAgICAgICAgICBzLT5zdHJtLT5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpOworCisgICAgICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKyAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+bF9kZXNjKSkpOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgcy0+b3B0X2xlbiwKKyAgICAgICAgICAgICAgICBzLT5zdGF0aWNfbGVuKSk7CisKKyAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+ZF9kZXNjKSkpOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCisgICAgICAgICAgICAgICAgcy0+c3RhdGljX2xlbikpOworICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKKyAgICAgICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgICAgICovCisKKyAgICAgICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKKyAgICAgICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgICAgICAgICAqLworICAgICAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7CisKKyAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqLworICAgICAgICBvcHRfbGVuYiA9IChzLT5vcHRfbGVuKzMrNyk+PjM7CisgICAgICAgIHN0YXRpY19sZW5iID0gKHMtPnN0YXRpY19sZW4rMys3KT4+MzsKKworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgIiwKKyAgICAgICAgICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCisgICAgICAgICAgICAgICAgcy0+bGFzdF9saXQpKTsKKworICAgICAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBc3NlcnQoYnVmICE9IChjaGFyKikwLCAibG9zdCBidWYiKTsKKyAgICAgICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqLworICAgIH0KKworI2lmZGVmIEZPUkNFX1NUT1JFRAorICAgIGlmIChidWYgIT0gKGNoYXIqKTApIHsgLyogZm9yY2Ugc3RvcmVkIGJsb2NrICovCisjZWxzZQorICAgIGlmIChzdG9yZWRfbGVuKzQgPD0gb3B0X2xlbmIgJiYgYnVmICE9IChjaGFyKikwKSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi8KKyNlbmRpZgorICAgICAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLgorICAgICAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlCisgICAgICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlbgorICAgICAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG8KKyAgICAgICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay4KKyAgICAgICAgICovCisgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTsKKworI2lmZGVmIEZPUkNFX1NUQVRJQworICAgIH0gZWxzZSBpZiAoc3RhdGljX2xlbmIgPj0gMCkgeyAvKiBmb3JjZSBzdGF0aWMgdHJlZXMgKi8KKyNlbHNlCisgICAgfSBlbHNlIGlmIChzLT5zdHJhdGVneSA9PSBaX0ZJWEVEIHx8IHN0YXRpY19sZW5iID09IG9wdF9sZW5iKSB7CisjZW5kaWYKKyAgICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVM8PDEpK2xhc3QsIDMpOworICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwgKGN0X2RhdGEgKilzdGF0aWNfZHRyZWUpOworI2lmZGVmIERFQlVHX1pMSUIKKyAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMyArIHMtPnN0YXRpY19sZW47CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUzw8MSkrbGFzdCwgMyk7CisgICAgICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMtPmxfZGVzYy5tYXhfY29kZSsxLCBzLT5kX2Rlc2MubWF4X2NvZGUrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4X2JsaW5kZXgrMSk7CisgICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSk7CisjaWZkZWYgREVCVUdfWkxJQgorICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAzICsgcy0+b3B0X2xlbjsKKyNlbmRpZgorICAgIH0KKyAgICBBc3NlcnQgKHMtPmNvbXByZXNzZWRfbGVuID09IHMtPmJpdHNfc2VudCwgImJhZCBjb21wcmVzc2VkIHNpemUiKTsKKyAgICAvKiBUaGUgYWJvdmUgY2hlY2sgaXMgbWFkZSBtb2QgMl4zMiwgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDUxMiBNQgorICAgICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLgorICAgICAqLworICAgIGluaXRfYmxvY2socyk7CisKKyAgICBpZiAobGFzdCkgeworICAgICAgICBiaV93aW5kdXAocyk7CisjaWZkZWYgREVCVUdfWkxJQgorICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworI2VuZGlmCisgICAgfQorICAgIFRyYWNldigoc3RkZXJyLCJcbmNvbXBybGVuICVsdSglbHUpICIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLAorICAgICAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWYKKyAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC4KKyAqLworaW50IFpMSUJfSU5URVJOQUwgX3RyX3RhbGx5IChzLCBkaXN0LCBsYykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLworICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqLworeworICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9ICh1c2gpZGlzdDsKKyAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9ICh1Y2gpbGM7CisgICAgaWYgKGRpc3QgPT0gMCkgeworICAgICAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KKyAgICAgICAgcy0+ZHluX2x0cmVlW2xjXS5GcmVxKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bWF0Y2hlcysrOworICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisgICAgICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLworICAgICAgICBBc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJgorICAgICAgICAgICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJgorICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICAiX3RyX3RhbGx5OiBiYWQgbWF0Y2giKTsKKworICAgICAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xjXStMSVRFUkFMUysxXS5GcmVxKys7CisgICAgICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsKKyAgICB9CisKKyNpZmRlZiBUUlVOQ0FURV9CTE9DSworICAgIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqLworICAgIGlmICgocy0+bGFzdF9saXQgJiAweDFmZmYpID09IDAgJiYgcy0+bGV2ZWwgPiAyKSB7CisgICAgICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqLworICAgICAgICB1bGcgb3V0X2xlbmd0aCA9ICh1bGcpcy0+bGFzdF9saXQqOEw7CisgICAgICAgIHVsZyBpbl9sZW5ndGggPSAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KTsKKyAgICAgICAgaW50IGRjb2RlOworICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7CisgICAgICAgICAgICBvdXRfbGVuZ3RoICs9ICh1bGcpcy0+ZHluX2R0cmVlW2Rjb2RlXS5GcmVxICoKKyAgICAgICAgICAgICAgICAoNUwrZXh0cmFfZGJpdHNbZGNvZGVdKTsKKyAgICAgICAgfQorICAgICAgICBvdXRfbGVuZ3RoID4+PSAzOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgIiwKKyAgICAgICAgICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsCisgICAgICAgICAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpOworICAgICAgICBpZiAocy0+bWF0Y2hlcyA8IHMtPmxhc3RfbGl0LzIgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aC8yKSByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOworICAgIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0SworICAgICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCisgICAgICogNjRLLTEgYnl0ZXMuCisgICAgICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCisgKi8KK2xvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqLworICAgIGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovCit7CisgICAgdW5zaWduZWQgZGlzdDsgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLworICAgIGludCBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovCisgICAgdW5zaWduZWQgbHggPSAwOyAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovCisgICAgdW5zaWduZWQgY29kZTsgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovCisgICAgaW50IGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovCisKKyAgICBpZiAocy0+bGFzdF9saXQgIT0gMCkgZG8geworICAgICAgICBkaXN0ID0gcy0+ZF9idWZbbHhdOworICAgICAgICBsYyA9IHMtPmxfYnVmW2x4KytdOworICAgICAgICBpZiAoZGlzdCA9PSAwKSB7CisgICAgICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICAgICAgVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0ZGVyciwiICclYycgIiwgbGMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KKyAgICAgICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdOworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUrTElURVJBTFMrMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqLworICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07CisgICAgICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi8KKyAgICAgICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7CisgICAgICAgICAgICBBc3NlcnQgKGNvZGUgPCBEX0NPREVTLCAiYmFkIGRfY29kZSIpOworCisgICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdOworICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTsKKyAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqLworCisgICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovCisgICAgICAgIEFzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsCisgICAgICAgICAgICAgICAicGVuZGluZ0J1ZiBvdmVyZmxvdyIpOworCisgICAgfSB3aGlsZSAobHggPCBzLT5sYXN0X2xpdCk7CisKKyAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7CisgICAgcy0+bGFzdF9lb2JfbGVuID0gbHRyZWVbRU5EX0JMT0NLXS5MZW47Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06CisgKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6CisgKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlCisgKiAgICAgICAiYmxhY2sgbGlzdCIgKDAuLjYsIDE0Li4yNSwgMjguLjMxKS4KKyAqICAgIGIpIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwcmludGFibGUgY2hhcmFjdGVyIGJlbG9uZ2luZyB0byB0aGUKKyAqICAgICAgICJ3aGl0ZSBsaXN0IiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuCisgKiAtIEJJTkFSWSBvdGhlcndpc2UuCisgKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGEKKyAqICAgImdyYXkgbGlzdCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobToKKyAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LgorICovCitsb2NhbCBpbnQgZGV0ZWN0X2RhdGFfdHlwZShzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzCisgICAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxCisgICAgICogMHhmM2ZmYzA3ZiA9IGJpbmFyeSAxMTExMDAxMTExMTExMTExMTEwMDAwMDAwMTExMTExMQorICAgICAqLworICAgIHVuc2lnbmVkIGxvbmcgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2ZVTDsKKyAgICBpbnQgbjsKKworICAgIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoImJsYWNrLWxpc3RlZCIpIGJ5dGVzLiAqLworICAgIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj0gMSkKKyAgICAgICAgaWYgKChibGFja19tYXNrICYgMSkgJiYgKHMtPmR5bl9sdHJlZVtuXS5GcmVxICE9IDApKQorICAgICAgICAgICAgcmV0dXJuIFpfQklOQVJZOworCisgICAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKCJ3aGl0ZS1saXN0ZWQiKSBieXRlcy4gKi8KKyAgICBpZiAocy0+ZHluX2x0cmVlWzldLkZyZXEgIT0gMCB8fCBzLT5keW5fbHRyZWVbMTBdLkZyZXEgIT0gMAorICAgICAgICAgICAgfHwgcy0+ZHluX2x0cmVlWzEzXS5GcmVxICE9IDApCisgICAgICAgIHJldHVybiBaX1RFWFQ7CisgICAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUzsgbisrKQorICAgICAgICBpZiAocy0+ZHluX2x0cmVlW25dLkZyZXEgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBaX1RFWFQ7CisKKyAgICAvKiBUaGVyZSBhcmUgbm8gImJsYWNrLWxpc3RlZCIgb3IgIndoaXRlLWxpc3RlZCIgYnl0ZXM6CisgICAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKCJncmF5LWxpc3RlZCIpIGJ5dGVzIG9ubHkuCisgICAgICovCisgICAgcmV0dXJuIFpfQklOQVJZOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyCisgKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpCisgKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1CisgKi8KK2xvY2FsIHVuc2lnbmVkIGJpX3JldmVyc2UoY29kZSwgbGVuKQorICAgIHVuc2lnbmVkIGNvZGU7IC8qIHRoZSB2YWx1ZSB0byBpbnZlcnQgKi8KKyAgICBpbnQgbGVuOyAgICAgICAvKiBpdHMgYml0IGxlbmd0aCAqLworeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHJlcyA9IDA7CisgICAgZG8geworICAgICAgICByZXMgfD0gY29kZSAmIDE7CisgICAgICAgIGNvZGUgPj49IDEsIHJlcyA8PD0gMTsKKyAgICB9IHdoaWxlICgtLWxlbiA+IDApOworICAgIHJldHVybiByZXMgPj4gMTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC4KKyAqLworbG9jYWwgdm9pZCBiaV9mbHVzaChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaWYgKHMtPmJpX3ZhbGlkID09IDE2KSB7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPSAwOworICAgICAgICBzLT5iaV92YWxpZCA9IDA7CisgICAgfSBlbHNlIGlmIChzLT5iaV92YWxpZCA+PSA4KSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7CisgICAgICAgIHMtPmJpX2J1ZiA+Pj0gODsKKyAgICAgICAgcy0+YmlfdmFsaWQgLT0gODsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5CisgKi8KK2xvY2FsIHZvaWQgYmlfd2luZHVwKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpZiAocy0+YmlfdmFsaWQgPiA4KSB7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgIH0gZWxzZSBpZiAocy0+YmlfdmFsaWQgPiAwKSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7CisgICAgfQorICAgIHMtPmJpX2J1ZiA9IDA7CisgICAgcy0+YmlfdmFsaWQgPSAwOworI2lmZGVmIERFQlVHX1pMSUIKKyAgICBzLT5iaXRzX3NlbnQgPSAocy0+Yml0c19zZW50KzcpICYgfjc7CisjZW5kaWYKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0cworICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuCisgKi8KK2xvY2FsIHZvaWQgY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovCisgICAgaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovCit7CisgICAgYmlfd2luZHVwKHMpOyAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworICAgIHMtPmxhc3RfZW9iX2xlbiA9IDg7IC8qIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUgKi8KKworICAgIGlmIChoZWFkZXIpIHsKKyAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpbGVuKTsKKyAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpfmxlbik7CisjaWZkZWYgREVCVUdfWkxJQgorICAgICAgICBzLT5iaXRzX3NlbnQgKz0gMioxNjsKKyNlbmRpZgorICAgIH0KKyNpZmRlZiBERUJVR19aTElCCisgICAgcy0+Yml0c19zZW50ICs9ICh1bGcpbGVuPDwzOworI2VuZGlmCisgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgIHB1dF9ieXRlKHMsICpidWYrKyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvdHJlZXMuaCBiL2NvbTMyL2xpYi96bGliL3RyZWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1NjM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL3RyZWVzLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovCisKK2xvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl0gPSB7Cit7eyAxMn0seyAgOH19LCB7ezE0MH0seyAgOH19LCB7eyA3Nn0seyAgOH19LCB7ezIwNH0seyAgOH19LCB7eyA0NH0seyAgOH19LAore3sxNzJ9LHsgIDh9fSwge3sxMDh9LHsgIDh9fSwge3syMzZ9LHsgIDh9fSwge3sgMjh9LHsgIDh9fSwge3sxNTZ9LHsgIDh9fSwKK3t7IDkyfSx7ICA4fX0sIHt7MjIwfSx7ICA4fX0sIHt7IDYwfSx7ICA4fX0sIHt7MTg4fSx7ICA4fX0sIHt7MTI0fSx7ICA4fX0sCit7ezI1Mn0seyAgOH19LCB7eyAgMn0seyAgOH19LCB7ezEzMH0seyAgOH19LCB7eyA2Nn0seyAgOH19LCB7ezE5NH0seyAgOH19LAore3sgMzR9LHsgIDh9fSwge3sxNjJ9LHsgIDh9fSwge3sgOTh9LHsgIDh9fSwge3syMjZ9LHsgIDh9fSwge3sgMTh9LHsgIDh9fSwKK3t7MTQ2fSx7ICA4fX0sIHt7IDgyfSx7ICA4fX0sIHt7MjEwfSx7ICA4fX0sIHt7IDUwfSx7ICA4fX0sIHt7MTc4fSx7ICA4fX0sCit7ezExNH0seyAgOH19LCB7ezI0Mn0seyAgOH19LCB7eyAxMH0seyAgOH19LCB7ezEzOH0seyAgOH19LCB7eyA3NH0seyAgOH19LAore3syMDJ9LHsgIDh9fSwge3sgNDJ9LHsgIDh9fSwge3sxNzB9LHsgIDh9fSwge3sxMDZ9LHsgIDh9fSwge3syMzR9LHsgIDh9fSwKK3t7IDI2fSx7ICA4fX0sIHt7MTU0fSx7ICA4fX0sIHt7IDkwfSx7ICA4fX0sIHt7MjE4fSx7ICA4fX0sIHt7IDU4fSx7ICA4fX0sCit7ezE4Nn0seyAgOH19LCB7ezEyMn0seyAgOH19LCB7ezI1MH0seyAgOH19LCB7eyAgNn0seyAgOH19LCB7ezEzNH0seyAgOH19LAore3sgNzB9LHsgIDh9fSwge3sxOTh9LHsgIDh9fSwge3sgMzh9LHsgIDh9fSwge3sxNjZ9LHsgIDh9fSwge3sxMDJ9LHsgIDh9fSwKK3t7MjMwfSx7ICA4fX0sIHt7IDIyfSx7ICA4fX0sIHt7MTUwfSx7ICA4fX0sIHt7IDg2fSx7ICA4fX0sIHt7MjE0fSx7ICA4fX0sCit7eyA1NH0seyAgOH19LCB7ezE4Mn0seyAgOH19LCB7ezExOH0seyAgOH19LCB7ezI0Nn0seyAgOH19LCB7eyAxNH0seyAgOH19LAore3sxNDJ9LHsgIDh9fSwge3sgNzh9LHsgIDh9fSwge3syMDZ9LHsgIDh9fSwge3sgNDZ9LHsgIDh9fSwge3sxNzR9LHsgIDh9fSwKK3t7MTEwfSx7ICA4fX0sIHt7MjM4fSx7ICA4fX0sIHt7IDMwfSx7ICA4fX0sIHt7MTU4fSx7ICA4fX0sIHt7IDk0fSx7ICA4fX0sCit7ezIyMn0seyAgOH19LCB7eyA2Mn0seyAgOH19LCB7ezE5MH0seyAgOH19LCB7ezEyNn0seyAgOH19LCB7ezI1NH0seyAgOH19LAore3sgIDF9LHsgIDh9fSwge3sxMjl9LHsgIDh9fSwge3sgNjV9LHsgIDh9fSwge3sxOTN9LHsgIDh9fSwge3sgMzN9LHsgIDh9fSwKK3t7MTYxfSx7ICA4fX0sIHt7IDk3fSx7ICA4fX0sIHt7MjI1fSx7ICA4fX0sIHt7IDE3fSx7ICA4fX0sIHt7MTQ1fSx7ICA4fX0sCit7eyA4MX0seyAgOH19LCB7ezIwOX0seyAgOH19LCB7eyA0OX0seyAgOH19LCB7ezE3N30seyAgOH19LCB7ezExM30seyAgOH19LAore3syNDF9LHsgIDh9fSwge3sgIDl9LHsgIDh9fSwge3sxMzd9LHsgIDh9fSwge3sgNzN9LHsgIDh9fSwge3syMDF9LHsgIDh9fSwKK3t7IDQxfSx7ICA4fX0sIHt7MTY5fSx7ICA4fX0sIHt7MTA1fSx7ICA4fX0sIHt7MjMzfSx7ICA4fX0sIHt7IDI1fSx7ICA4fX0sCit7ezE1M30seyAgOH19LCB7eyA4OX0seyAgOH19LCB7ezIxN30seyAgOH19LCB7eyA1N30seyAgOH19LCB7ezE4NX0seyAgOH19LAore3sxMjF9LHsgIDh9fSwge3syNDl9LHsgIDh9fSwge3sgIDV9LHsgIDh9fSwge3sxMzN9LHsgIDh9fSwge3sgNjl9LHsgIDh9fSwKK3t7MTk3fSx7ICA4fX0sIHt7IDM3fSx7ICA4fX0sIHt7MTY1fSx7ICA4fX0sIHt7MTAxfSx7ICA4fX0sIHt7MjI5fSx7ICA4fX0sCit7eyAyMX0seyAgOH19LCB7ezE0OX0seyAgOH19LCB7eyA4NX0seyAgOH19LCB7ezIxM30seyAgOH19LCB7eyA1M30seyAgOH19LAore3sxODF9LHsgIDh9fSwge3sxMTd9LHsgIDh9fSwge3syNDV9LHsgIDh9fSwge3sgMTN9LHsgIDh9fSwge3sxNDF9LHsgIDh9fSwKK3t7IDc3fSx7ICA4fX0sIHt7MjA1fSx7ICA4fX0sIHt7IDQ1fSx7ICA4fX0sIHt7MTczfSx7ICA4fX0sIHt7MTA5fSx7ICA4fX0sCit7ezIzN30seyAgOH19LCB7eyAyOX0seyAgOH19LCB7ezE1N30seyAgOH19LCB7eyA5M30seyAgOH19LCB7ezIyMX0seyAgOH19LAore3sgNjF9LHsgIDh9fSwge3sxODl9LHsgIDh9fSwge3sxMjV9LHsgIDh9fSwge3syNTN9LHsgIDh9fSwge3sgMTl9LHsgIDl9fSwKK3t7Mjc1fSx7ICA5fX0sIHt7MTQ3fSx7ICA5fX0sIHt7NDAzfSx7ICA5fX0sIHt7IDgzfSx7ICA5fX0sIHt7MzM5fSx7ICA5fX0sCit7ezIxMX0seyAgOX19LCB7ezQ2N30seyAgOX19LCB7eyA1MX0seyAgOX19LCB7ezMwN30seyAgOX19LCB7ezE3OX0seyAgOX19LAore3s0MzV9LHsgIDl9fSwge3sxMTV9LHsgIDl9fSwge3szNzF9LHsgIDl9fSwge3syNDN9LHsgIDl9fSwge3s0OTl9LHsgIDl9fSwKK3t7IDExfSx7ICA5fX0sIHt7MjY3fSx7ICA5fX0sIHt7MTM5fSx7ICA5fX0sIHt7Mzk1fSx7ICA5fX0sIHt7IDc1fSx7ICA5fX0sCit7ezMzMX0seyAgOX19LCB7ezIwM30seyAgOX19LCB7ezQ1OX0seyAgOX19LCB7eyA0M30seyAgOX19LCB7ezI5OX0seyAgOX19LAore3sxNzF9LHsgIDl9fSwge3s0Mjd9LHsgIDl9fSwge3sxMDd9LHsgIDl9fSwge3szNjN9LHsgIDl9fSwge3syMzV9LHsgIDl9fSwKK3t7NDkxfSx7ICA5fX0sIHt7IDI3fSx7ICA5fX0sIHt7MjgzfSx7ICA5fX0sIHt7MTU1fSx7ICA5fX0sIHt7NDExfSx7ICA5fX0sCit7eyA5MX0seyAgOX19LCB7ezM0N30seyAgOX19LCB7ezIxOX0seyAgOX19LCB7ezQ3NX0seyAgOX19LCB7eyA1OX0seyAgOX19LAore3szMTV9LHsgIDl9fSwge3sxODd9LHsgIDl9fSwge3s0NDN9LHsgIDl9fSwge3sxMjN9LHsgIDl9fSwge3szNzl9LHsgIDl9fSwKK3t7MjUxfSx7ICA5fX0sIHt7NTA3fSx7ICA5fX0sIHt7ICA3fSx7ICA5fX0sIHt7MjYzfSx7ICA5fX0sIHt7MTM1fSx7ICA5fX0sCit7ezM5MX0seyAgOX19LCB7eyA3MX0seyAgOX19LCB7ezMyN30seyAgOX19LCB7ezE5OX0seyAgOX19LCB7ezQ1NX0seyAgOX19LAore3sgMzl9LHsgIDl9fSwge3syOTV9LHsgIDl9fSwge3sxNjd9LHsgIDl9fSwge3s0MjN9LHsgIDl9fSwge3sxMDN9LHsgIDl9fSwKK3t7MzU5fSx7ICA5fX0sIHt7MjMxfSx7ICA5fX0sIHt7NDg3fSx7ICA5fX0sIHt7IDIzfSx7ICA5fX0sIHt7Mjc5fSx7ICA5fX0sCit7ezE1MX0seyAgOX19LCB7ezQwN30seyAgOX19LCB7eyA4N30seyAgOX19LCB7ezM0M30seyAgOX19LCB7ezIxNX0seyAgOX19LAore3s0NzF9LHsgIDl9fSwge3sgNTV9LHsgIDl9fSwge3szMTF9LHsgIDl9fSwge3sxODN9LHsgIDl9fSwge3s0Mzl9LHsgIDl9fSwKK3t7MTE5fSx7ICA5fX0sIHt7Mzc1fSx7ICA5fX0sIHt7MjQ3fSx7ICA5fX0sIHt7NTAzfSx7ICA5fX0sIHt7IDE1fSx7ICA5fX0sCit7ezI3MX0seyAgOX19LCB7ezE0M30seyAgOX19LCB7ezM5OX0seyAgOX19LCB7eyA3OX0seyAgOX19LCB7ezMzNX0seyAgOX19LAore3syMDd9LHsgIDl9fSwge3s0NjN9LHsgIDl9fSwge3sgNDd9LHsgIDl9fSwge3szMDN9LHsgIDl9fSwge3sxNzV9LHsgIDl9fSwKK3t7NDMxfSx7ICA5fX0sIHt7MTExfSx7ICA5fX0sIHt7MzY3fSx7ICA5fX0sIHt7MjM5fSx7ICA5fX0sIHt7NDk1fSx7ICA5fX0sCit7eyAzMX0seyAgOX19LCB7ezI4N30seyAgOX19LCB7ezE1OX0seyAgOX19LCB7ezQxNX0seyAgOX19LCB7eyA5NX0seyAgOX19LAore3szNTF9LHsgIDl9fSwge3syMjN9LHsgIDl9fSwge3s0Nzl9LHsgIDl9fSwge3sgNjN9LHsgIDl9fSwge3szMTl9LHsgIDl9fSwKK3t7MTkxfSx7ICA5fX0sIHt7NDQ3fSx7ICA5fX0sIHt7MTI3fSx7ICA5fX0sIHt7MzgzfSx7ICA5fX0sIHt7MjU1fSx7ICA5fX0sCit7ezUxMX0seyAgOX19LCB7eyAgMH0seyAgN319LCB7eyA2NH0seyAgN319LCB7eyAzMn0seyAgN319LCB7eyA5Nn0seyAgN319LAore3sgMTZ9LHsgIDd9fSwge3sgODB9LHsgIDd9fSwge3sgNDh9LHsgIDd9fSwge3sxMTJ9LHsgIDd9fSwge3sgIDh9LHsgIDd9fSwKK3t7IDcyfSx7ICA3fX0sIHt7IDQwfSx7ICA3fX0sIHt7MTA0fSx7ICA3fX0sIHt7IDI0fSx7ICA3fX0sIHt7IDg4fSx7ICA3fX0sCit7eyA1Nn0seyAgN319LCB7ezEyMH0seyAgN319LCB7eyAgNH0seyAgN319LCB7eyA2OH0seyAgN319LCB7eyAzNn0seyAgN319LAore3sxMDB9LHsgIDd9fSwge3sgMjB9LHsgIDd9fSwge3sgODR9LHsgIDd9fSwge3sgNTJ9LHsgIDd9fSwge3sxMTZ9LHsgIDd9fSwKK3t7ICAzfSx7ICA4fX0sIHt7MTMxfSx7ICA4fX0sIHt7IDY3fSx7ICA4fX0sIHt7MTk1fSx7ICA4fX0sIHt7IDM1fSx7ICA4fX0sCit7ezE2M30seyAgOH19LCB7eyA5OX0seyAgOH19LCB7ezIyN30seyAgOH19Cit9OworCitsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXSA9IHsKK3t7IDB9LHsgNX19LCB7ezE2fSx7IDV9fSwge3sgOH0seyA1fX0sIHt7MjR9LHsgNX19LCB7eyA0fSx7IDV9fSwKK3t7MjB9LHsgNX19LCB7ezEyfSx7IDV9fSwge3syOH0seyA1fX0sIHt7IDJ9LHsgNX19LCB7ezE4fSx7IDV9fSwKK3t7MTB9LHsgNX19LCB7ezI2fSx7IDV9fSwge3sgNn0seyA1fX0sIHt7MjJ9LHsgNX19LCB7ezE0fSx7IDV9fSwKK3t7MzB9LHsgNX19LCB7eyAxfSx7IDV9fSwge3sxN30seyA1fX0sIHt7IDl9LHsgNX19LCB7ezI1fSx7IDV9fSwKK3t7IDV9LHsgNX19LCB7ezIxfSx7IDV9fSwge3sxM30seyA1fX0sIHt7Mjl9LHsgNX19LCB7eyAzfSx7IDV9fSwKK3t7MTl9LHsgNX19LCB7ezExfSx7IDV9fSwge3syN30seyA1fX0sIHt7IDd9LHsgNX19LCB7ezIzfSx7IDV9fQorfTsKKworY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXSA9IHsKKyAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwKKyA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKzEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKzExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKzEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywKKzEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKzEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKzE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKzE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKzE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKzE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKzE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKzE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAgMCwgIDAsIDE2LCAxNywKKzE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKKzIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKKzI0LCAyNCwgMjQsIDI0LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwKKzI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKzI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKKzI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKKzI3LCAyNywgMjcsIDI3LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKKzI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKKzI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKKzI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKKzI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKKzI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKKzI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjkKK307CisKK2NvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdPSB7CisgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsCisxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksCisxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsCisyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsCisyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsCisyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCisyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCisyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsCisyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCisyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCisyNiwgMjYsIDI2LCAyNiwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyOAorfTsKKworbG9jYWwgY29uc3QgaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU10gPSB7CiswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxMCwgMTIsIDE0LCAxNiwgMjAsIDI0LCAyOCwgMzIsIDQwLCA0OCwgNTYsCis2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMAorfTsKKworbG9jYWwgY29uc3QgaW50IGJhc2VfZGlzdFtEX0NPREVTXSA9IHsKKyAgICAwLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDYsICAgICA4LCAgICAxMiwgICAgMTYsICAgIDI0LAorICAgMzIsICAgIDQ4LCAgICA2NCwgICAgOTYsICAgMTI4LCAgIDE5MiwgICAyNTYsICAgMzg0LCAgIDUxMiwgICA3NjgsCisgMTAyNCwgIDE1MzYsICAyMDQ4LCAgMzA3MiwgIDQwOTYsICA2MTQ0LCAgODE5MiwgMTIyODgsIDE2Mzg0LCAyNDU3NgorfTsKKwpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvdW5jb21wci5jIGIvY29tMzIvbGliL3psaWIvdW5jb21wci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOThiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvemxpYi91bmNvbXByLmMKQEAgLTAsMCArMSw1OSBAQAorLyogdW5jb21wci5jIC0tIGRlY29tcHJlc3MgYSBtZW1vcnkgYnVmZmVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMywgMjAxMCBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkJCAqLworCisjZGVmaW5lIFpMSUJfSU5URVJOQUwKKyNpbmNsdWRlICJ6bGliLmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCisgICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCisgICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCisgICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKKyAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCisgICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICB1bmNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlciwgb3IgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQuCisqLworaW50IFpFWFBPUlQgdW5jb21wcmVzcyAoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4pCisgICAgQnl0ZWYgKmRlc3Q7CisgICAgdUxvbmdmICpkZXN0TGVuOworICAgIGNvbnN0IEJ5dGVmICpzb3VyY2U7CisgICAgdUxvbmcgc291cmNlTGVuOworeworICAgIHpfc3RyZWFtIHN0cmVhbTsKKyAgICBpbnQgZXJyOworCisgICAgc3RyZWFtLm5leHRfaW4gPSAoQnl0ZWYqKXNvdXJjZTsKKyAgICBzdHJlYW0uYXZhaWxfaW4gPSAodUludClzb3VyY2VMZW47CisgICAgLyogQ2hlY2sgZm9yIHNvdXJjZSA+IDY0SyBvbiAxNi1iaXQgbWFjaGluZTogKi8KKyAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9pbiAhPSBzb3VyY2VMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKKworICAgIHN0cmVhbS5uZXh0X291dCA9IGRlc3Q7CisgICAgc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSpkZXN0TGVuOworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX291dCAhPSAqZGVzdExlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworCisgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworCisgICAgZXJyID0gaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisgICAgaWYgKGVyciAhPSBaX09LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gaW5mbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgICAgaWYgKGVyciA9PSBaX05FRURfRElDVCB8fCAoZXJyID09IFpfQlVGX0VSUk9SICYmIHN0cmVhbS5hdmFpbF9pbiA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgICpkZXN0TGVuID0gc3RyZWFtLnRvdGFsX291dDsKKworICAgIGVyciA9IGluZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi96bGliL3pjb25mLmluLmggYi9jb20zMi9saWIvemxpYi96Y29uZi5pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTBlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvemxpYi96Y29uZi5pbi5oCkBAIC0wLDAgKzEsMzIyIEBACisvKiB6Y29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisKKyNpZm5kZWYgWkNPTkZfSAorI2RlZmluZSBaQ09ORl9ICisKKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqLworI2lmZGVmIFpfUFJFRklYCisjICBkZWZpbmUgZGVmbGF0ZUluaXRfICB6X2RlZmxhdGVJbml0XworIyAgZGVmaW5lIGRlZmxhdGUgICAgICAgel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICB6X2RlZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gIHpfaW5mbGF0ZUluaXRfCisjICBkZWZpbmUgaW5mbGF0ZSAgICAgICB6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgIHpfaW5mbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgel9kZWZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgIHpfZGVmbGF0ZVByaW1lCisjICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyB6X2RlZmxhdGVQYXJhbXMKKyMgIGRlZmluZSBkZWZsYXRlQm91bmQgIHpfZGVmbGF0ZUJvdW5kCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyB6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICB6X2luZmxhdGVTeW5jCisjICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCB6X2luZmxhdGVTeW5jUG9pbnQKKyMgIGRlZmluZSBpbmZsYXRlQ29weSAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlUmVzZXQgIHpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgY29tcHJlc3MgICAgICB6X2NvbXByZXNzCisjICBkZWZpbmUgY29tcHJlc3MyICAgICB6X2NvbXByZXNzMgorIyAgZGVmaW5lIGNvbXByZXNzQm91bmQgel9jb21wcmVzc0JvdW5kCisjICBkZWZpbmUgdW5jb21wcmVzcyAgICB6X3VuY29tcHJlc3MKKyMgIGRlZmluZSBhZGxlcjMyICAgICAgIHpfYWRsZXIzMgorIyAgZGVmaW5lIGNyYzMyICAgICAgICAgel9jcmMzMgorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgel9nZXRfY3JjX3RhYmxlCisKKyMgIGRlZmluZSBCeXRlICAgICAgICAgIHpfQnl0ZQorIyAgZGVmaW5lIHVJbnQgICAgICAgICAgel91SW50CisjICBkZWZpbmUgdUxvbmcgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgQnl0ZWYgICAgICAgICB6X0J5dGVmCisjICBkZWZpbmUgY2hhcmYgICAgICAgICB6X2NoYXJmCisjICBkZWZpbmUgaW50ZiAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgIHpfdUludGYKKyMgIGRlZmluZSB1TG9uZ2YgICAgICAgIHpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHBmICAgICAgICB6X3ZvaWRwZgorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgel92b2lkcAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCisjICBkZWZpbmUgTVNET1MKKyNlbmRpZgorI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKKyMgIGRlZmluZSBPUzIKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCisjICBkZWZpbmUgV0lORE9XUworI2VuZGlmCisjaWYgKGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgZGVmaW5lIFdJTjMyCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBOT19EVU1NWV9ERUNMCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVAorIyAgZGVmaW5lIFpFWFBPUlQKKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUVkEKKyMgIGRlZmluZSBaRVhQT1JUVkEKKyNlbmRpZgorCisjaWZuZGVmIEZBUgorIyAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KKworI2lmZGVmIFNNQUxMX01FRElVTQorICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KKyMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgorI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOworI2VuZGlmCit0eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKK3R5cGVkZWYgaW50ICAgRkFSIGludGY7Cit0eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKK3R5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKKworI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOworI2VuZGlmCisKKyNpZiAwICAgICAgICAgICAvKiBIQVZFX1VOSVNURF9IIC0tIHRoaXMgbGluZSBpcyB1cGRhdGVkIGJ5IC4vY29uZmlndXJlICovCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCisjICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KKyMgIGlmZGVmIFZNUworIyAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjICBkZWZpbmUgel9vZmZfdCAgb2ZmX3QKKyNlbmRpZgorI2lmbmRlZiBTRUVLX1NFVAorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgIHpfb2ZmX3QgbG9uZworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fT1M0MDBfXykKKyNkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgIGRlZmluZSBOT192c25wcmludGYKKyMgIGlmZGVmIEZBUgorIyAgICB1bmRlZiBGQVIKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisjICAgcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisKKyNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS9jb20zMi9saWIvemxpYi96bGliLjMgYi9jb20zMi9saWIvemxpYi96bGliLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZGM0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL3psaWIuMwpAQCAtMCwwICsxLDE1MSBAQAorLlRIIFpMSUIgMyAiMTkgQXByIDIwMTAiCisuU0ggTkFNRQoremxpYiBcLSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGxpYnJhcnkKKy5TSCBTWU5PUFNJUworW3NlZQorLkkgemxpYi5oCitmb3IgZnVsbCBkZXNjcmlwdGlvbl0KKy5TSCBERVNDUklQVElPTgorVGhlCisuSSB6bGliCitsaWJyYXJ5IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KK1RoZSBjb2RlIGlzIHRocmVhZCBzYWZlLCBhc3N1bWluZyB0aGF0IHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucwordXNlZCBhcmUgdGhyZWFkIHNhZmUsIHN1Y2ggYXMgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCitJdCBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLAoraW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZCAoZGVmbGF0aW9uKQorYnV0IG90aGVyIGFsZ29yaXRobXMgbWF5IGJlIGFkZGVkIGxhdGVyCit3aXRoIHRoZSBzYW1lIHN0cmVhbSBpbnRlcmZhY2UuCisuTFAKK0NvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaAorb3IgY2FuIGJlIGRvbmUgYnkgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLgorSW4gdGhlIGxhdHRlciBjYXNlLAordGhlIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKKyhwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisuTFAKK1RoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbgorLklSIGd6aXAgKDEpCisoLmd6KSBmb3JtYXQKK3dpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpby4KKy5MUAorVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuCitUaGUgZGVjb2RlciBjaGVja3MgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsCitzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIgY3Jhc2ggZXZlbiBpbiB0aGUgY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCisuTFAKK0FsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUKKy5JUiB6bGliLmggLgorVGhlIGRpc3RyaWJ1dGlvbiBzb3VyY2UgaW5jbHVkZXMgZXhhbXBsZXMgb2YgdXNlIG9mIHRoZSBsaWJyYXJ5CitpbiB0aGUgZmlsZXMKKy5JIGV4YW1wbGUuYworYW5kCisuSVIgbWluaWd6aXAuYywKK2FzIHdlbGwgYXMgb3RoZXIgZXhhbXBsZXMgaW4gdGhlCisuSVIgZXhhbXBsZXMvCitkaXJlY3RvcnkuCisuTFAKK0NoYW5nZXMgdG8gdGhpcyB2ZXJzaW9uIGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlCisuSSBDaGFuZ2VMb2cKK3RoYXQgYWNjb21wYW5pZXMgdGhlIHNvdXJjZS4KKy5MUAorLkkgemxpYgoraXMgYXZhaWxhYmxlIGluIEphdmEgdXNpbmcgdGhlIGphdmEudXRpbC56aXAgcGFja2FnZToKKy5JUAoraHR0cDovL2phdmEuc3VuLmNvbS9kZXZlbG9wZXIvdGVjaG5pY2FsQXJ0aWNsZXMvUHJvZ3JhbW1pbmcvY29tcHJlc3Npb24vCisuTFAKK0EgUGVybCBpbnRlcmZhY2UgdG8KKy5JUiB6bGliICwKK3dyaXR0ZW4gYnkgUGF1bCBNYXJxdWVzcyAocG1xc0BjcGFuLm9yZyksCitpcyBhdmFpbGFibGUgYXQgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMsCitpbmNsdWRpbmc6CisuSVAKK2h0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfnBtcXMvSU8tQ29tcHJlc3MtWmxpYi8KKy5MUAorQSBQeXRob24gaW50ZXJmYWNlIHRvCisuSVIgemxpYiAsCit3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcgKGFta0BtYWduZXQuY29tKSwKK2lzIGF2YWlsYWJsZSBpbiBQeXRob24gMS41IGFuZCBsYXRlciB2ZXJzaW9uczoKKy5JUAoraHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9saWIvbW9kdWxlLXpsaWIuaHRtbAorLkxQCisuSSB6bGliCitpcyBidWlsdCBpbnRvCisuSVIgdGNsOgorLklQCitodHRwOi8vd2lraS50Y2wudGsvNDYxMAorLkxQCitBbiBleHBlcmltZW50YWwgcGFja2FnZSB0byByZWFkIGFuZCB3cml0ZSBmaWxlcyBpbiAuemlwIGZvcm1hdCwKK3dyaXR0ZW4gb24gdG9wIG9mCisuSSB6bGliCitieSBHaWxsZXMgVm9sbGFudCAoaW5mb0B3aW5pbWFnZS5jb20pLAoraXMgYXZhaWxhYmxlIGF0OgorLklQCitodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbAorYW5kIGFsc28gaW4gdGhlCisuSSBjb250cmliL21pbml6aXAKK2RpcmVjdG9yeSBvZiB0aGUgbWFpbgorLkkgemxpYgorc291cmNlIGRpc3RyaWJ1dGlvbi4KKy5TSCAiU0VFIEFMU08iCitUaGUKKy5JIHpsaWIKK3dlYiBzaXRlIGNhbiBiZSBmb3VuZCBhdDoKKy5JUAoraHR0cDovL3psaWIubmV0LworLkxQCitUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkMKKyhSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlczoKKy5JUAoraHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQgKGZvciB0aGUgemxpYiBoZWFkZXIgYW5kIHRyYWlsZXIgZm9ybWF0KQorLmJyCitodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUxLnR4dCAoZm9yIHRoZSBkZWZsYXRlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQpCisuYnIKK2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTIudHh0IChmb3IgdGhlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyIGZvcm1hdCkKKy5MUAorTWFyayBOZWxzb24gd3JvdGUgYW4gYXJ0aWNsZSBhYm91dAorLkkgemxpYgorZm9yIHRoZSBKYW4uIDE5OTcgaXNzdWUgb2YgIERyLiBEb2JiJ3MgSm91cm5hbDsKK2EgY29weSBvZiB0aGUgYXJ0aWNsZSBpcyBhdmFpbGFibGUgYXQ6CisuSVAKK2h0dHA6Ly9tYXJrbmVsc29uLnVzLzE5OTcvMDEvMDEvemxpYi1lbmdpbmUvCisuU0ggIlJFUE9SVElORyBQUk9CTEVNUyIKK0JlZm9yZSByZXBvcnRpbmcgYSBwcm9ibGVtLAorcGxlYXNlIGNoZWNrIHRoZQorLkkgemxpYgord2ViIHNpdGUgdG8gdmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mCisuSVIgemxpYiA7CitvdGhlcndpc2UsCitvYnRhaW4gdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCBzZWUgaWYgdGhlIHByb2JsZW0gc3RpbGwgZXhpc3RzLgorUGxlYXNlIHJlYWQgdGhlCisuSSB6bGliCitGQVEgYXQ6CisuSVAKK2h0dHA6Ly96bGliLm5ldC96bGliX2ZhcS5odG1sCisuTFAKK2JlZm9yZSBhc2tpbmcgZm9yIGhlbHAuCitTZW5kIHF1ZXN0aW9ucyBhbmQvb3IgY29tbWVudHMgdG8gemxpYkBnemlwLm9yZywKK29yIChmb3IgdGhlIFdpbmRvd3MgRExMIHZlcnNpb24pIHRvIEdpbGxlcyBWb2xsYW50IChpbmZvQHdpbmltYWdlLmNvbSkuCisuU0ggQVVUSE9SUworVmVyc2lvbiAxLjIuNQorQ29weXJpZ2h0IChDKSAxOTk1LTIwMTAgSmVhbi1sb3VwIEdhaWxseSAoamxvdXBAZ3ppcC5vcmcpCithbmQgTWFyayBBZGxlciAobWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSkuCisuTFAKK1RoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzLWlzLCIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KK0luIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCithcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorU2VlIHRoZSBkaXN0cmlidXRpb24gZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byByZXF1aXJlbWVudHMKK2dvdmVybmluZyByZWRpc3RyaWJ1dGlvbi4KK1RoZSBkZWZsYXRlIGZvcm1hdCB1c2VkIGJ5CisuSSB6bGliCit3YXMgZGVmaW5lZCBieSBQaGlsIEthdHouCitUaGUgZGVmbGF0ZSBhbmQKKy5JIHpsaWIKK3NwZWNpZmljYXRpb25zIHdlcmUgd3JpdHRlbiBieSBMLiBQZXRlciBEZXV0c2NoLgorVGhhbmtzIHRvIGFsbCB0aGUgcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMKK2ltcHJvdmVtZW50cyBpbgorLklSIHpsaWIgOword2hvIGFyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgorLkxQCitVTklYIG1hbnVhbCBwYWdlIGJ5IFIuIFAuIEMuIFJvZGdlcnMsCitVLlMuIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgKHJvZGdlcnNAbmxtLm5paC5nb3YpLgorLlwiIGVuZCBvZiBtYW4gcGFnZQpkaWZmIC0tZ2l0IGEvY29tMzIvbGliL3psaWIvenV0aWwuYyBiL2NvbTMyL2xpYi96bGliL3p1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlODk3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYi96bGliL3p1dGlsLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qIHp1dGlsLmMgLS0gdGFyZ2V0IGRlcGVuZGVudCB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1LCAyMDEwIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorCisjaWZuZGVmIE5PX0RVTU1ZX0RFQ0wKK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZSAgICAgIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworI2VuZGlmCisKK2NvbnN0IGNoYXIgKiBjb25zdCB6X2Vycm1zZ1sxMF0gPSB7CisibmVlZCBkaWN0aW9uYXJ5IiwgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovCisic3RyZWFtIGVuZCIsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovCisiIiwgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovCisiZmlsZSBlcnJvciIsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovCisic3RyZWFtIGVycm9yIiwgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovCisiZGF0YSBlcnJvciIsICAgICAgICAgIC8qIFpfREFUQV9FUlJPUiAgICAoLTMpICovCisiaW5zdWZmaWNpZW50IG1lbW9yeSIsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovCisiYnVmZmVyIGVycm9yIiwgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovCisiaW5jb21wYXRpYmxlIHZlcnNpb24iLC8qIFpfVkVSU0lPTl9FUlJPUiAoLTYpICovCisiIn07CisKKworY29uc3QgY2hhciAqIFpFWFBPUlQgemxpYlZlcnNpb24oKQoreworICAgIHJldHVybiBaTElCX1ZFUlNJT047Cit9CisKK3VMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncygpCit7CisgICAgdUxvbmcgZmxhZ3M7CisKKyAgICBmbGFncyA9IDA7CisgICAgc3dpdGNoICgoaW50KShzaXplb2YodUludCkpKSB7CisgICAgY2FzZSAyOiAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMTsgICAgIGJyZWFrOworICAgIGNhc2UgODogICAgIGZsYWdzICs9IDI7ICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzOworICAgIH0KKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih1TG9uZykpKSB7CisgICAgY2FzZSAyOiAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMSA8PCAyOyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMiA8PCAyOyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMyA8PCAyOworICAgIH0KKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih2b2lkcGYpKSkgeworICAgIGNhc2UgMjogICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgNDsgICAgICAgIGJyZWFrOworICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgNDsgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgNDsKKyAgICB9CisgICAgc3dpdGNoICgoaW50KShzaXplb2Yoel9vZmZfdCkpKSB7CisgICAgY2FzZSAyOiAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMSA8PCA2OyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMiA8PCA2OyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMyA8PCA2OworICAgIH0KKyNpZmRlZiBERUJVR19aTElCCisgICAgZmxhZ3MgKz0gMSA8PCA4OworI2VuZGlmCisjaWYgZGVmaW5lZChBU01WKSB8fCBkZWZpbmVkKEFTTUlORikKKyAgICBmbGFncyArPSAxIDw8IDk7CisjZW5kaWYKKyNpZmRlZiBaTElCX1dJTkFQSQorICAgIGZsYWdzICs9IDEgPDwgMTA7CisjZW5kaWYKKyNpZmRlZiBCVUlMREZJWEVECisgICAgZmxhZ3MgKz0gMSA8PCAxMjsKKyNlbmRpZgorI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisgICAgZmxhZ3MgKz0gMSA8PCAxMzsKKyNlbmRpZgorI2lmZGVmIE5PX0daQ09NUFJFU1MKKyAgICBmbGFncyArPSAxTCA8PCAxNjsKKyNlbmRpZgorI2lmZGVmIE5PX0daSVAKKyAgICBmbGFncyArPSAxTCA8PCAxNzsKKyNlbmRpZgorI2lmZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgZmxhZ3MgKz0gMUwgPDwgMjA7CisjZW5kaWYKKyNpZmRlZiBGQVNURVNUCisgICAgZmxhZ3MgKz0gMUwgPDwgMjE7CisjZW5kaWYKKyNpZmRlZiBTVERDCisjICBpZmRlZiBOT192c25wcmludGYKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjU7CisjICAgIGlmZGVmIEhBU192c3ByaW50Zl92b2lkCisgICAgICAgIGZsYWdzICs9IDFMIDw8IDI2OworIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZmRlZiBIQVNfdnNucHJpbnRmX3ZvaWQKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjY7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2Vsc2UKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjQ7CisjICBpZmRlZiBOT19zbnByaW50ZgorICAgICAgICBmbGFncyArPSAxTCA8PCAyNTsKKyMgICAgaWZkZWYgSEFTX3NwcmludGZfdm9pZAorICAgICAgICBmbGFncyArPSAxTCA8PCAyNjsKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWZkZWYgSEFTX3NucHJpbnRmX3ZvaWQKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjY7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisgICAgcmV0dXJuIGZsYWdzOworfQorCisjaWZkZWYgREVCVUdfWkxJQgorCisjICBpZm5kZWYgdmVyYm9zZQorIyAgICBkZWZpbmUgdmVyYm9zZSAwCisjICBlbmRpZgoraW50IFpMSUJfSU5URVJOQUwgel92ZXJib3NlID0gdmVyYm9zZTsKKwordm9pZCBaTElCX0lOVEVSTkFMIHpfZXJyb3IgKG0pCisgICAgY2hhciAqbTsKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtKTsKKyAgICBleGl0KDEpOworfQorI2VuZGlmCisKKy8qIGV4cG9ydGVkIHRvIGFsbG93IGNvbnZlcnNpb24gb2YgZXJyb3IgY29kZSB0byBzdHJpbmcgZm9yIGNvbXByZXNzKCkgYW5kCisgKiB1bmNvbXByZXNzKCkKKyAqLworY29uc3QgY2hhciAqIFpFWFBPUlQgekVycm9yKGVycikKKyAgICBpbnQgZXJyOworeworICAgIHJldHVybiBFUlJfTVNHKGVycik7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgLyogVGhlIE1pY3Jvc29mdCBDIFJ1bi1UaW1lIExpYnJhcnkgZm9yIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlCisgICAgICogZXJybm8uICBXZSBkZWZpbmUgaXQgYXMgYSBnbG9iYWwgdmFyaWFibGUgdG8gc2ltcGxpZnkgcG9ydGluZy4KKyAgICAgKiBJdHMgdmFsdWUgaXMgYWx3YXlzIDAgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBpbnQgZXJybm8gPSAwOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9NRU1DUFkKKwordm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkoZGVzdCwgc291cmNlLCBsZW4pCisgICAgQnl0ZWYqIGRlc3Q7CisgICAgY29uc3QgQnl0ZWYqIHNvdXJjZTsKKyAgICB1SW50ICBsZW47Cit7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CisgICAgZG8geworICAgICAgICAqZGVzdCsrID0gKnNvdXJjZSsrOyAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KKyAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKK30KKworaW50IFpMSUJfSU5URVJOQUwgem1lbWNtcChzMSwgczIsIGxlbikKKyAgICBjb25zdCBCeXRlZiogczE7CisgICAgY29uc3QgQnl0ZWYqIHMyOworICAgIHVJbnQgIGxlbjsKK3sKKyAgICB1SW50IGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgICAgaWYgKHMxW2pdICE9IHMyW2pdKSByZXR1cm4gMiooczFbal0gPiBzMltqXSktMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgWkxJQl9JTlRFUk5BTCB6bWVtemVybyhkZXN0LCBsZW4pCisgICAgQnl0ZWYqIGRlc3Q7CisgICAgdUludCAgbGVuOworeworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOworICAgIGRvIHsKKyAgICAgICAgKmRlc3QrKyA9IDA7ICAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KKyAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBTWVMxNkJJVAorCisjaWZkZWYgX19UVVJCT0NfXworLyogVHVyYm8gQyBpbiAxNi1iaXQgbW9kZSAqLworCisjICBkZWZpbmUgTVlfWkNBTExPQworCisvKiBUdXJibyBDIG1hbGxvYygpIGRvZXMgbm90IGFsbG93IGR5bmFtaWMgYWxsb2NhdGlvbiBvZiA2NEsgYnl0ZXMKKyAqIGFuZCBmYXJtYWxsb2MoNjRLKSByZXR1cm5zIGEgcG9pbnRlciB3aXRoIGFuIG9mZnNldCBvZiA4LCBzbyB3ZQorICogbXVzdCBmaXggdGhlIHBvaW50ZXIuIFdhcm5pbmc6IHRoZSBwb2ludGVyIG11c3QgYmUgcHV0IGJhY2sgdG8gaXRzCisgKiBvcmlnaW5hbCBmb3JtIGluIG9yZGVyIHRvIGZyZWUgaXQsIHVzZSB6Y2ZyZWUoKS4KKyAqLworCisjZGVmaW5lIE1BWF9QVFIgMTAKKy8qIDEwKjY0SyA9IDY0MEsgKi8KKworbG9jYWwgaW50IG5leHRfcHRyID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QgcHRyX3RhYmxlX3MgeworICAgIHZvaWRwZiBvcmdfcHRyOworICAgIHZvaWRwZiBuZXdfcHRyOworfSBwdHJfdGFibGU7CisKK2xvY2FsIHB0cl90YWJsZSB0YWJsZVtNQVhfUFRSXTsKKy8qIFRoaXMgdGFibGUgaXMgdXNlZCB0byByZW1lbWJlciB0aGUgb3JpZ2luYWwgZm9ybSBvZiBwb2ludGVycworICogdG8gbGFyZ2UgYnVmZmVycyAoNjRLKS4gU3VjaCBwb2ludGVycyBhcmUgbm9ybWFsaXplZCB3aXRoIGEgemVybyBvZmZzZXQuCisgKiBTaW5jZSBNU0RPUyBpcyBub3QgYSBwcmVlbXB0aXZlIG11bHRpdGFza2luZyBPUywgdGhpcyB0YWJsZSBpcyBub3QKKyAqIHByb3RlY3RlZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiBUaGlzIGhhY2sgZG9lc24ndCB3b3JrIGFueXdheSBvbgorICogYSBwcm90ZWN0ZWQgc3lzdGVtIGxpa2UgT1MvMi4gVXNlIE1pY3Jvc29mdCBDIGluc3RlYWQuCisgKi8KKwordm9pZHBmIFpMSUJfSU5URVJOQUwgemNhbGxvYyAodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpCit7CisgICAgdm9pZHBmIGJ1ZiA9IG9wYXF1ZTsgLyoganVzdCB0byBtYWtlIHNvbWUgY29tcGlsZXJzIGhhcHB5ICovCisgICAgdWxnIGJzaXplID0gKHVsZylpdGVtcypzaXplOworCisgICAgLyogSWYgd2UgYWxsb2NhdGUgbGVzcyB0aGFuIDY1NTIwIGJ5dGVzLCB3ZSBhc3N1bWUgdGhhdCBmYXJtYWxsb2MKKyAgICAgKiB3aWxsIHJldHVybiBhIHVzYWJsZSBwb2ludGVyIHdoaWNoIGRvZXNuJ3QgaGF2ZSB0byBiZSBub3JtYWxpemVkLgorICAgICAqLworICAgIGlmIChic2l6ZSA8IDY1NTIwTCkgeworICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUpOworICAgICAgICBpZiAoKih1c2gqKSZidWYgIT0gMCkgcmV0dXJuIGJ1ZjsKKyAgICB9IGVsc2UgeworICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUgKyAxNkwpOworICAgIH0KKyAgICBpZiAoYnVmID09IE5VTEwgfHwgbmV4dF9wdHIgPj0gTUFYX1BUUikgcmV0dXJuIE5VTEw7CisgICAgdGFibGVbbmV4dF9wdHJdLm9yZ19wdHIgPSBidWY7CisKKyAgICAvKiBOb3JtYWxpemUgdGhlIHBvaW50ZXIgdG8gc2VnOjAgKi8KKyAgICAqKCh1c2gqKSZidWYrMSkgKz0gKCh1c2gpKCh1Y2gqKWJ1Zi0wKSArIDE1KSA+PiA0OworICAgICoodXNoKikmYnVmID0gMDsKKyAgICB0YWJsZVtuZXh0X3B0cisrXS5uZXdfcHRyID0gYnVmOworICAgIHJldHVybiBidWY7Cit9CisKK3ZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpCit7CisgICAgaW50IG47CisgICAgaWYgKCoodXNoKikmcHRyICE9IDApIHsgLyogb2JqZWN0IDwgNjRLICovCisgICAgICAgIGZhcmZyZWUocHRyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBGaW5kIHRoZSBvcmlnaW5hbCBwb2ludGVyICovCisgICAgZm9yIChuID0gMDsgbiA8IG5leHRfcHRyOyBuKyspIHsKKyAgICAgICAgaWYgKHB0ciAhPSB0YWJsZVtuXS5uZXdfcHRyKSBjb250aW51ZTsKKworICAgICAgICBmYXJmcmVlKHRhYmxlW25dLm9yZ19wdHIpOworICAgICAgICB3aGlsZSAoKytuIDwgbmV4dF9wdHIpIHsKKyAgICAgICAgICAgIHRhYmxlW24tMV0gPSB0YWJsZVtuXTsKKyAgICAgICAgfQorICAgICAgICBuZXh0X3B0ci0tOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHB0ciA9IG9wYXF1ZTsgLyoganVzdCB0byBtYWtlIHNvbWUgY29tcGlsZXJzIGhhcHB5ICovCisgICAgQXNzZXJ0KDAsICJ6Y2ZyZWU6IHB0ciBub3QgZm91bmQiKTsKK30KKworI2VuZGlmIC8qIF9fVFVSQk9DX18gKi8KKworCisjaWZkZWYgTV9JODYKKy8qIE1pY3Jvc29mdCBDIGluIDE2LWJpdCBtb2RlICovCisKKyMgIGRlZmluZSBNWV9aQ0FMTE9DCisKKyNpZiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA8PSA2MDApKQorIyAgZGVmaW5lIF9oYWxsb2MgIGhhbGxvYworIyAgZGVmaW5lIF9oZnJlZSAgIGhmcmVlCisjZW5kaWYKKwordm9pZHBmIFpMSUJfSU5URVJOQUwgemNhbGxvYyAodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKQoreworICAgIGlmIChvcGFxdWUpIG9wYXF1ZSA9IDA7IC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKyAgICByZXR1cm4gX2hhbGxvYygobG9uZylpdGVtcywgc2l6ZSk7Cit9CisKK3ZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpCit7CisgICAgaWYgKG9wYXF1ZSkgb3BhcXVlID0gMDsgLyogdG8gbWFrZSBjb21waWxlciBoYXBweSAqLworICAgIF9oZnJlZShwdHIpOworfQorCisjZW5kaWYgLyogTV9JODYgKi8KKworI2VuZGlmIC8qIFNZUzE2QklUICovCisKKworI2lmbmRlZiBNWV9aQ0FMTE9DIC8qIEFueSBzeXN0ZW0gd2l0aG91dCBhIHNwZWNpYWwgYWxsb2MgZnVuY3Rpb24gKi8KKworI2lmbmRlZiBTVERDCitleHRlcm4gdm9pZHAgIG1hbGxvYyBPRigodUludCBzaXplKSk7CitleHRlcm4gdm9pZHAgIGNhbGxvYyBPRigodUludCBpdGVtcywgdUludCBzaXplKSk7CitleHRlcm4gdm9pZCAgIGZyZWUgICBPRigodm9pZHBmIHB0cikpOworI2VuZGlmCisKK3ZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgKG9wYXF1ZSwgaXRlbXMsIHNpemUpCisgICAgdm9pZHBmIG9wYXF1ZTsKKyAgICB1bnNpZ25lZCBpdGVtczsKKyAgICB1bnNpZ25lZCBzaXplOworeworICAgIGlmIChvcGFxdWUpIGl0ZW1zICs9IHNpemUgLSBzaXplOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuIHNpemVvZih1SW50KSA+IDIgPyAodm9pZHBmKW1hbGxvYyhpdGVtcyAqIHNpemUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkcGYpY2FsbG9jKGl0ZW1zLCBzaXplKTsKK30KKwordm9pZCBaTElCX0lOVEVSTkFMIHpjZnJlZSAob3BhcXVlLCBwdHIpCisgICAgdm9pZHBmIG9wYXF1ZTsKKyAgICB2b2lkcGYgcHRyOworeworICAgIGZyZWUocHRyKTsKKyAgICBpZiAob3BhcXVlKSByZXR1cm47IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KK30KKworI2VuZGlmIC8qIE1ZX1pDQUxMT0MgKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYi96bGliL3p1dGlsLmggYi9jb20zMi9saWIvemxpYi96dXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMmQ3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWIvemxpYi96dXRpbC5oCkBAIC0wLDAgKzEsMjc0IEBACisvKiB6dXRpbC5oIC0tIGludGVybmFsIGludGVyZmFjZSBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTAgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpZm5kZWYgWlVUSUxfSAorI2RlZmluZSBaVVRJTF9ICisKKyNpZiAoKF9fR05VQ19fLTApICogMTAgKyBfX0dOVUNfTUlOT1JfXy0wID49IDMzKSAmJiAhZGVmaW5lZChOT19WSVopCisjICBkZWZpbmUgWkxJQl9JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQorI2Vsc2UKKyMgIGRlZmluZSBaTElCX0lOVEVSTkFMCisjZW5kaWYKKworI2luY2x1ZGUgInpsaWIuaCIKKworI2lmZGVmIFNUREMKKyMgIGlmICEoZGVmaW5lZChfV0lOMzJfV0NFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSkKKyMgICAgaW5jbHVkZSA8c3RkZGVmLmg+CisjICBlbmRpZgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIGxvY2FsCisjICBkZWZpbmUgbG9jYWwgc3RhdGljCisjZW5kaWYKKy8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVjaDsKK3R5cGVkZWYgdWNoIEZBUiB1Y2hmOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Cit0eXBlZGVmIHVzaCBGQVIgdXNoZjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOworCitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IHpfZXJybXNnWzEwXTsgLyogaW5kZXhlZCBieSAyLXpsaWJfZXJyb3IgKi8KKy8qIChzaXplIGdpdmVuIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIHdpdGggVmlzdWFsIEMrKykgKi8KKworI2RlZmluZSBFUlJfTVNHKGVycikgel9lcnJtc2dbWl9ORUVEX0RJQ1QtKGVycildCisKKyNkZWZpbmUgRVJSX1JFVFVSTihzdHJtLGVycikgXAorICByZXR1cm4gKHN0cm0tPm1zZyA9IChjaGFyKilFUlJfTVNHKGVyciksIChlcnIpKQorLyogVG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN0YXRlIGlzIGtub3duIHRvIGJlIHZhbGlkICovCisKKyAgICAgICAgLyogY29tbW9uIGNvbnN0YW50cyAqLworCisjaWZuZGVmIERFRl9XQklUUworIyAgZGVmaW5lIERFRl9XQklUUyBNQVhfV0JJVFMKKyNlbmRpZgorLyogZGVmYXVsdCB3aW5kb3dCaXRzIGZvciBkZWNvbXByZXNzaW9uLiBNQVhfV0JJVFMgaXMgZm9yIGNvbXByZXNzaW9uIG9ubHkgKi8KKworI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAorI2Vsc2UKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCisjZW5kaWYKKy8qIGRlZmF1bHQgbWVtTGV2ZWwgKi8KKworI2RlZmluZSBTVE9SRURfQkxPQ0sgMAorI2RlZmluZSBTVEFUSUNfVFJFRVMgMQorI2RlZmluZSBEWU5fVFJFRVMgICAgMgorLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi8KKworI2RlZmluZSBNSU5fTUFUQ0ggIDMKKyNkZWZpbmUgTUFYX01BVENIICAyNTgKKy8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi8KKworI2RlZmluZSBQUkVTRVRfRElDVCAweDIwIC8qIHByZXNldCBkaWN0aW9uYXJ5IGZsYWcgaW4gemxpYiBoZWFkZXIgKi8KKworICAgICAgICAvKiB0YXJnZXQgZGVwZW5kZW5jaWVzICovCisKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCAoZGVmaW5lZChXSU5ET1dTKSAmJiAhZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMAorIyAgaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyMgICAgaWYgKF9fU1REQ19fID09IDEpICYmIChkZWZpbmVkKF9fTEFSR0VfXykgfHwgZGVmaW5lZChfX0NPTVBBQ1RfXykpCisgICAgICAgLyogQWxsb3cgY29tcGlsYXRpb24gd2l0aCBBTlNJIGtleXdvcmRzIG9ubHkgZW5hYmxlZCAqLworICAgICAgIHZvaWQgX0NkZWNsIGZhcmZyZWUoIHZvaWQgKmJsb2NrICk7CisgICAgICAgdm9pZCAqX0NkZWNsIGZhcm1hbGxvYyggdW5zaWduZWQgbG9uZyBuYnl0ZXMgKTsKKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgPGFsbG9jLmg+CisjICAgIGVuZGlmCisjICBlbHNlIC8qIE1TQyBvciBESkdQUCAqLworIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEFNSUdBCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZBWEMpIHx8IGRlZmluZWQoVk1TKQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDIKKyMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgXAorICAgICBmb3BlbigobmFtZSksIChtb2RlKSwgIm1iYz02MCIsICJjdHg9c3RtIiwgInJmbT1maXgiLCAibXJzPTUxMiIpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQVRBUkkpIHx8IGRlZmluZWQoYXRhcmlzdCkKKyMgIGRlZmluZSBPU19DT0RFICAweDA1CisjZW5kaWYKKworI2lmZGVmIE9TMgorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDYKKyMgIGlmZGVmIE1fSTg2CisjICAgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNQUNPUykgfHwgZGVmaW5lZChUQVJHRVRfT1NfTUFDKQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDcKKyMgIGlmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19kZXN0X29zICE9IF9fYmVfb3MgJiYgX19kZXN0X29zICE9IF9fd2luMzJfb3MKKyMgICAgaW5jbHVkZSA8dW5peC5oPiAvKiBmb3IgZmRvcGVuICovCisjICBlbHNlCisjICAgIGlmbmRlZiBmZG9wZW4KKyMgICAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFRPUFMyMAorIyAgZGVmaW5lIE9TX0NPREUgIDB4MGEKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgIGlmbmRlZiBfX0NZR1dJTl9fICAvKiBDeWd3aW4gaXMgVW5peCwgbm90IFdpbjMyICovCisjICAgIGRlZmluZSBPU19DT0RFICAweDBiCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfXzUwU0VSSUVTIC8qIFByaW1lL1BSSU1PUyAqLworIyAgZGVmaW5lIE9TX0NPREUgIDB4MGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfQkVPU18pIHx8IGRlZmluZWQoUklTQ09TKQorIyAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiA2MDApKSAmJiAhZGVmaW5lZCBfX0lOVEVSSVgKKyMgIGlmIGRlZmluZWQoX1dJTjMyX1dDRSkKKyMgICAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCisjICAgIGlmbmRlZiBfUFRSRElGRl9UX0RFRklORUQKKyAgICAgICB0eXBlZGVmIGludCBwdHJkaWZmX3Q7CisjICAgICAgZGVmaW5lIF9QVFJESUZGX1RfREVGSU5FRAorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBkZWZpbmUgZmRvcGVuKGZkLHR5cGUpICBfZmRvcGVuKGZkLHR5cGUpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgI3ByYWdtYSB3YXJuIC04MDA0CisgICNwcmFnbWEgd2FybiAtODAwOAorICAjcHJhZ21hIHdhcm4gLTgwNjYKKyNlbmRpZgorCisvKiBwcm92aWRlIHByb3RvdHlwZXMgZm9yIHRoZXNlIHdoZW4gYnVpbGRpbmcgemxpYiB3aXRob3V0IExGUyAqLworI2lmICFkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpIHx8IF9MRlM2NF9MQVJHRUZJTEUtMCA9PSAwCisgICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyNlbmRpZgorCisgICAgICAgIC8qIGNvbW1vbiBkZWZhdWx0cyAqLworCisjaWZuZGVmIE9TX0NPREUKKyMgIGRlZmluZSBPU19DT0RFICAweDAzICAvKiBhc3N1bWUgVW5peCAqLworI2VuZGlmCisKKyNpZm5kZWYgRl9PUEVOCisjICBkZWZpbmUgRl9PUEVOKG5hbWUsIG1vZGUpIGZvcGVuKChuYW1lKSwgKG1vZGUpKQorI2VuZGlmCisKKyAgICAgICAgIC8qIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChTVERDOTkpIHx8IChkZWZpbmVkKF9fVFVSQk9DX18pICYmIF9fVFVSQk9DX18gPj0gMHg1NTApCisjICBpZm5kZWYgSEFWRV9WU05QUklOVEYKKyMgICAgZGVmaW5lIEhBVkVfVlNOUFJJTlRGCisjICBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgaWZuZGVmIEhBVkVfVlNOUFJJTlRGCisjICAgIGRlZmluZSBIQVZFX1ZTTlBSSU5URgorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgaWZkZWYgTVNET1MKKyAgICAgLyogdnNucHJpbnRmIG1heSBleGlzdCBvbiBzb21lIE1TLURPUyBjb21waWxlcnMgKERKR1BQPyksCisgICAgICAgIGJ1dCBmb3Igbm93IHdlIGp1c3QgYXNzdW1lIGl0IGRvZXNuJ3QuICovCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjICBpZmRlZiBfX1RVUkJPQ19fCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjICBpZmRlZiBXSU4zMgorICAgICAvKiBJbiBXaW4zMiwgdnNucHJpbnRmIGlzIGF2YWlsYWJsZSBhcyB0aGUgIm5vbi1BTlNJIiBfdnNucHJpbnRmLiAqLworIyAgICBpZiAhZGVmaW5lZCh2c25wcmludGYpICYmICFkZWZpbmVkKE5PX3ZzbnByaW50ZikKKyMgICAgICBpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgKCBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE1MDAgKQorIyAgICAgICAgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgX19TQVNDCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBWTVMKKyMgIGRlZmluZSBOT192c25wcmludGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChweXIpCisjICBkZWZpbmUgTk9fTUVNQ1BZCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNNQUxMX01FRElVTSkgJiYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU0NfXykKKyAvKiBVc2Ugb3VyIG93biBmdW5jdGlvbnMgZm9yIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgd2l0aCBNU0MgPD0gNS4wLgorICAqIFlvdSBtYXkgaGF2ZSB0byB1c2UgdGhlIHNhbWUgc3RyYXRlZ3kgZm9yIEJvcmxhbmQgQyAodW50ZXN0ZWQpLgorICAqIFRoZSBfX1NDX18gY2hlY2sgaXMgZm9yIFN5bWFudGVjLgorICAqLworIyAgZGVmaW5lIE5PX01FTUNQWQorI2VuZGlmCisjaWYgZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChIQVZFX01FTUNQWSkgJiYgIWRlZmluZWQoTk9fTUVNQ1BZKQorIyAgZGVmaW5lIEhBVkVfTUVNQ1BZCisjZW5kaWYKKyNpZmRlZiBIQVZFX01FTUNQWQorIyAgaWZkZWYgU01BTExfTUVESVVNIC8qIE1TRE9TIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgem1lbWNweSBfZm1lbWNweQorIyAgICBkZWZpbmUgem1lbWNtcCBfZm1lbWNtcAorIyAgICBkZWZpbmUgem1lbXplcm8oZGVzdCwgbGVuKSBfZm1lbXNldChkZXN0LCAwLCBsZW4pCisjICBlbHNlCisjICAgIGRlZmluZSB6bWVtY3B5IG1lbWNweQorIyAgICBkZWZpbmUgem1lbWNtcCBtZW1jbXAKKyMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgbWVtc2V0KGRlc3QsIDAsIGxlbikKKyMgIGVuZGlmCisjZWxzZQorICAgdm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkgT0YoKEJ5dGVmKiBkZXN0LCBjb25zdCBCeXRlZiogc291cmNlLCB1SW50IGxlbikpOworICAgaW50IFpMSUJfSU5URVJOQUwgem1lbWNtcCBPRigoY29uc3QgQnl0ZWYqIHMxLCBjb25zdCBCeXRlZiogczIsIHVJbnQgbGVuKSk7CisgICB2b2lkIFpMSUJfSU5URVJOQUwgem1lbXplcm8gT0YoKEJ5dGVmKiBkZXN0LCB1SW50IGxlbikpOworI2VuZGlmCisKKy8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCisjaWZkZWYgREVCVUdfWkxJQgorIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyAgIGV4dGVybiBpbnQgWkxJQl9JTlRFUk5BTCB6X3ZlcmJvc2U7CisgICBleHRlcm4gdm9pZCBaTElCX0lOVEVSTkFMIHpfZXJyb3IgT0YoKGNvbnN0IGNoYXIgKm0pKTsKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHtpZighKGNvbmQpKSB6X2Vycm9yKG1zZyk7fQorIyAgZGVmaW5lIFRyYWNlKHgpIHtpZiAoel92ZXJib3NlPj0wKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh6X3ZlcmJvc2U+MCkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHpfdmVyYm9zZT4xKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHpfdmVyYm9zZT4wICYmIChjKSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAoel92ZXJib3NlPjEgJiYgKGMpKSBmcHJpbnRmIHggO30KKyNlbHNlCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQorIyAgZGVmaW5lIFRyYWNlKHgpCisjICBkZWZpbmUgVHJhY2V2KHgpCisjICBkZWZpbmUgVHJhY2V2dih4KQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpCisjICBkZWZpbmUgVHJhY2VjdihjLHgpCisjZW5kaWYKKworCit2b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jIE9GKCh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpemUpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKSk7CisKKyNkZWZpbmUgWkFMTE9DKHN0cm0sIGl0ZW1zLCBzaXplKSBcCisgICAgICAgICAgICgqKChzdHJtKS0+emFsbG9jKSkoKHN0cm0pLT5vcGFxdWUsIChpdGVtcyksIChzaXplKSkKKyNkZWZpbmUgWkZSRUUoc3RybSwgYWRkcikgICgqKChzdHJtKS0+emZyZWUpKSgoc3RybSktPm9wYXF1ZSwgKHZvaWRwZikoYWRkcikpCisjZGVmaW5lIFRSWV9GUkVFKHMsIHApIHtpZiAocCkgWkZSRUUocywgcCk7fQorCisjZW5kaWYgLyogWlVUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGlidXBsb2FkL01ha2VmaWxlIGIvY29tMzIvbGlidXBsb2FkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDQwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1cGxvYWQvTWFrZWZpbGUKQEAgLTAsMCArMSwzNyBAQAorIyBJbmNsdWRlIGNvbmZpZ3VyYXRpb24gcnVsZXMKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvY29tMzIubWsKKworUkVRRkxBR1MgKz0gLUkkKFNSQykKKworTElCT0JKUyA6PSAkKG5vdGRpciAkKHBhdHN1YnN0ICUuYywlLm8sJCh3aWxkY2FyZCAkKFNSQykvKi5jKSkpCisKK0JJTkRJUiAgID0gL3Vzci9iaW4KK0xJQkRJUiAgID0gL3Vzci9saWIKK0RBVEFESVIgID0gL3Vzci9zaGFyZQorQVVYRElSICAgPSAkKERBVEFESVIpL3N5c2xpbnV4CitJTkNESVIgICA9IC91c3IvaW5jbHVkZQorQ09NMzJESVIgPSAkKEFVWERJUikvY29tMzIKKworYWxsOiBsaWJjb20zMnVwbG9hZC5hCisKK2xpYmNvbTMydXBsb2FkLmEgOiAkKExJQk9CSlMpCisJcm0gLWYgJEAKKwkkKEFSKSBjcSAkQCAkXgorCSQoUkFOTElCKSAkQAorCit0aWR5IGRpc3QgY2xlYW46CisJZmluZCAuIFwoIC1uYW1lIFwqLm8gLW8gLW5hbWUgXCouYSAtbyAtbmFtZSAuXCouZCAtbyAtbmFtZSBcKi50bXAgXCkgLXByaW50MCB8IFwKKwkJeGFyZ3MgLTByIHJtIC1mCisKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICouYQorCXJtIC1mICp+IFwjKiAqLyp+ICovXCMqCisKK2luc3RhbGw6IGFsbAorCW1rZGlyIC1tIDc1NSAtcCAkKElOU1RBTExST09UKSQoQ09NMzJESVIpCisJaW5zdGFsbCAtbSA2NDQgbGliY29tMzJ1cGxvYWQuYSAkKElOU1RBTExST09UKSQoQ09NMzJESVIpCisJbWtkaXIgLXAgJChJTlNUQUxMUk9PVCkkKENPTTMyRElSKS9pbmNsdWRlLworCWNwIC1yICQoU1JDKS8qLmggJChJTlNUQUxMUk9PVCkkKENPTTMyRElSKS9pbmNsdWRlLworCistaW5jbHVkZSAuKi5kICovLiouZCAqLyovLiouZApkaWZmIC0tZ2l0IGEvY29tMzIvbGlidXBsb2FkL2NwaW8uYyBiL2NvbTMyL2xpYnVwbG9hZC9jcGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViNDY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYnVwbG9hZC9jcGlvLmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIGNwaW8uYworICoKKyAqIFdyaXRlIGEgY29tcHJlc3NlZCBDUElPIGZpbGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSAidXBsb2FkX2JhY2tlbmQuaCIKKyNpbmNsdWRlICJjdGltZS5oIgorCitpbnQgY3Bpb19wYWQoc3RydWN0IHVwbG9hZF9iYWNrZW5kICpiZSkKK3sKKyAgICBzdGF0aWMgY2hhciBwYWRbNF07CQkvKiBVcCB0byA0IHplcm8gYnl0ZXMgKi8KKyAgICBpZiAoYmUtPmRieXRlcyAmIDMpCisJcmV0dXJuIHdyaXRlX2RhdGEoYmUsIHBhZCwgLWJlLT5kYnl0ZXMgJiAzKTsKKyAgICBlbHNlCisJcmV0dXJuIDA7Cit9CisKK2ludCBjcGlvX2hkcihzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlLCB1aW50MzJfdCBtb2RlLCBzaXplX3QgZGF0YWxlbiwKKwkgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHN0YXRpYyB1aW50MzJfdCBpbm9kZSA9IDI7CisgICAgY2hhciBoZHJbNisxMyo4KzFdOworICAgIGludCBubGVuID0gc3RybGVuKGZpbGVuYW1lKSsxOworICAgIGludCBydiA9IDA7CisKKyAgICBjcGlvX3BhZChiZSk7CisKKyAgICBzcHJpbnRmKGhkciwgIiUwNm8lMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh6eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCIsCisJICAgIDA3MDcwMSwJCS8qIGNfbWFnaWMgKi8KKwkgICAgaW5vZGUrKywJCS8qIGNfaW5vICovCisJICAgIG1vZGUsCQkvKiBjX21vZGUgKi8KKwkgICAgMCwJCQkvKiBjX3VpZCAqLworCSAgICAwLAkJCS8qIGNfZ2lkICovCisJICAgIDEsCQkJLyogY19ubGluayAqLworCSAgICBiZS0+bm93LAkJLyogY19tdGltZSAqLworCSAgICBkYXRhbGVuLAkJLyogY19maWxlc2l6ZSAqLworCSAgICAwLAkJCS8qIGNfbWFqICovCisJICAgIDAsCQkJLyogY19taW4gKi8KKwkgICAgMCwJCQkvKiBjX3JtYWogKi8KKwkgICAgMCwJCQkvKiBjX3JtaW4gKi8KKwkgICAgbmxlbiwJCS8qIGNfbmFtZXNpemUgKi8KKwkgICAgMCk7CQkJLyogY19jaGtzdW0gKi8KKyAgICBydiB8PSB3cml0ZV9kYXRhKGJlLCBoZHIsIDYrMTMqOCk7CisgICAgcnYgfD0gd3JpdGVfZGF0YShiZSwgZmlsZW5hbWUsIG5sZW4pOworICAgIHJ2IHw9IGNwaW9fcGFkKGJlKTsKKyAgICByZXR1cm4gcnY7Cit9CisKK2ludCBjcGlvX21rZGlyKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHJldHVybiBjcGlvX2hkcihiZSwgTU9ERV9ESVIsIDAsIGZpbGVuYW1lKTsKK30KKworaW50IGNwaW9fd3JpdGVmaWxlKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIGludCBydjsKKworICAgIHJ2ID0gY3Bpb19oZHIoYmUsIE1PREVfRklMRSwgbGVuLCBmaWxlbmFtZSk7CisgICAgcnYgfD0gd3JpdGVfZGF0YShiZSwgZGF0YSwgbGVuKTsKKyAgICBydiB8PSBjcGlvX3BhZChiZSk7CisKKyAgICByZXR1cm4gcnY7Cit9CisKK2ludCBjcGlvX2Nsb3NlKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUpCit7CisgICAgcmV0dXJuIGNwaW9faGRyKGJlLCAwLCAwLCAiVFJBSUxFUiEhISIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGlidXBsb2FkL2N0aW1lLmMgYi9jb20zMi9saWJ1cGxvYWQvY3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2U4MTU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXBsb2FkL2N0aW1lLmMKQEAgLTAsMCArMSw3OSBAQAorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiY3RpbWUuaCIKKworc3RhdGljIHVpbnQ4X3QgZnJvbWJjZCh1aW50OF90IHYpCit7CisgICAgdWludDhfdCBhID0gdiAmIDB4MGY7CisgICAgdWludDhfdCBiID0gdiA+PiA0OworCisgICAgcmV0dXJuIGEgKyBiKjEwOworfQorCit1aW50MzJfdCBwb3NpeF90aW1lKHZvaWQpCit7CisgICAgLyogRGF5cyBmcm9tIE1hcmNoIDEgZm9yIGEgc3BlY2lmaWMgbW9udGgsIHN0YXJ0aW5nIGluIE1hcmNoICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB5ZGF5WzEyXSA9CisJeyAwLCAzMSwgNjEsIDkyLCAxMjIsIDE1MywgMTg0LCAyMTQsIDI0NSwgMjc1LCAzMDYsIDMzNyB9OworICAgIGNvbTMyc3lzX3QgaXIsIGQwLCBkMSwgdDA7CisgICAgdW5zaWduZWQgaW50IGMsIHksIG1vLCBkLCBoLCBtLCBzOworICAgIHVpbnQzMl90IHQ7CisKKyAgICBtZW1zZXQoJmlyLCAwLCBzaXplb2YgaXIpOworCisgICAgaXIuZWF4LmJbMV0gPSAweDA0OworICAgIF9faW50Y2FsbCgweDFBLCAmaXIsICZkMCk7CisKKyAgICBtZW1zZXQoJmlyLCAwLCBzaXplb2YgaXIpOworICAgIGlyLmVheC5iWzFdID0gMHgwMjsKKyAgICBfX2ludGNhbGwoMHgxQSwgJmlyLCAmdDApOworCisgICAgbWVtc2V0KCZpciwgMCwgc2l6ZW9mIGlyKTsKKyAgICBpci5lYXguYlsxXSA9IDB4MDQ7CisgICAgX19pbnRjYWxsKDB4MUEsICZpciwgJmQxKTsKKworICAgIGlmICh0MC5lY3guYlsxXSA8IDB4MTIpCisJZDAgPSBkMTsKKworICAgIGMgID0gZnJvbWJjZChkMC5lY3guYlsxXSk7CisgICAgeSAgPSBmcm9tYmNkKGQwLmVjeC5iWzBdKTsKKyAgICBtbyA9IGZyb21iY2QoZDAuZWR4LmJbMV0pOworICAgIGQgID0gZnJvbWJjZChkMC5lZHguYlswXSk7CisKKyAgICBoICA9IGZyb21iY2QodDAuZWN4LmJbMV0pOworICAgIG0gID0gZnJvbWJjZCh0MC5lY3guYlswXSk7CisgICAgcyAgPSBmcm9tYmNkKHQwLmVkeC5iWzFdKTsKKworICAgIC8qIFdlIG9mIGNvdXJzZSBoYXZlIG5vIGlkZWEgYWJvdXQgdGhlIHRpbWV6b25lLCBzbyBpZ25vcmUgaXQgKi8KKworICAgIC8qCisgICAgICogTG9vayBmb3IgaW1wb3NzaWJsZSBkYXRlcy4uLiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gaW4gMjAxMCwgc28KKyAgICAgKiBhc3N1bWUgYW55IGNlbnR1cnkgbGVzcyB0aGFuIDIwIGlzIGp1c3QgYnJva2VuLgorICAgICAqLworICAgIGlmIChjIDwgMjApCisJYyA9IDIwOworICAgIHkgKz0gYyoxMDA7CisKKyAgICAvKiBDb25zaWRlciBKYW4gYW5kIEZlYiBhcyB0aGUgbGFzdCBtb250aHMgb2YgdGhlIHByZXZpb3VzIHllYXIgKi8KKyAgICBpZiAobW8gPCAzKSB7CisJeS0tOworCW1vICs9IDEyOworICAgIH0KKworICAgIC8qCisgICAgICogSnVzdCBpbiBjYXNlOiBpZiB0aGUgbW9udGggaXMgbm9uc2Vuc2UsIGRvbid0IHJlYWQgb2ZmIHRoZSBlbmQKKyAgICAgKiBvZiB0aGUgdGFibGUuLi4KKyAgICAgKi8KKyAgICBpZiAobW8tMyA+IDExKQorCXJldHVybiAwOworCisgICAgdCA9IHkqMzY1ICsgeS80IC0geS8xMDAgKyB5LzQwMCArIHlkYXlbbW8tM10gKyBkIC0gNzE5NDY5OworICAgIHQgKj0gMjQ7CisgICAgdCArPSBoOworICAgIHQgKj0gNjA7CisgICAgdCArPSBtOworICAgIHQgKj0gNjA7CisgICAgdCArPSBzOworCisgICAgcmV0dXJuIHQ7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWJ1cGxvYWQvY3RpbWUuaCBiL2NvbTMyL2xpYnVwbG9hZC9jdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDYxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1cGxvYWQvY3RpbWUuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgQ1RJTUVfSAorI2RlZmluZSBDVElNRV9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCit1aW50MzJfdCBwb3NpeF90aW1lKHZvaWQpOworCisjZW5kaWYgLyogQ1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGlidXBsb2FkL3NlcmlhbC5jIGIvY29tMzIvbGlidXBsb2FkL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTg3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1cGxvYWQvc2VyaWFsLmMKQEAgLTAsMCArMSwxNjkgQEAKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3lzL2lvLmg+CisjaW5jbHVkZSA8c3lzL2NwdS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSAic2VyaWFsLmgiCisKK2VudW0geworICAgIFRIUiA9IDAsCisgICAgUkJSID0gMCwKKyAgICBETEwgPSAwLAorICAgIERMTSA9IDEsCisgICAgSUVSID0gMSwKKyAgICBJSVIgPSAyLAorICAgIEZDUiA9IDIsCisgICAgTENSID0gMywKKyAgICBNQ1IgPSA0LAorICAgIExTUiA9IDUsCisgICAgTVNSID0gNiwKKyAgICBTQ1IgPSA3LAorfTsKKworCitpbnQgc2VyaWFsX2luaXQoc3RydWN0IHNlcmlhbF9pZiAqc2lmLCBjb25zdCBjaGFyICphcmd2W10pCit7CisgICAgY29uc3Qgc3RydWN0IHN5c2xpbnV4X3NlcmlhbF9jb25zb2xlX2luZm8gKnNjaQorCT0gc3lzbGludXhfc2VyaWFsX2NvbnNvbGVfaW5mbygpOworICAgIHVpbnQxNl90IHBvcnQ7CisgICAgdW5zaWduZWQgaW50IGRpdmlzb3I7CisgICAgdWludDhfdCBkbGwsIGRsbSwgbGNyOworCisgICAgaWYgKCFhcmd2WzBdKSB7CisJaWYgKHNjaS0+aW9iYXNlKSB7CisJICAgIHBvcnQgPSBzY2ktPmlvYmFzZTsKKwl9IGVsc2UgeworCSAgICBwcmludGYoIk5vIHBvcnQgbnVtYmVyIHNwZWNpZmllZCBhbmQgbm90IHVzaW5nIHNlcmlhbCBjb25zb2xlIVxuIik7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfSBlbHNlIHsKKwlwb3J0ID0gc3RydG91bChhcmd2WzBdLCBOVUxMLCAwKTsKKwlpZiAocG9ydCA8PSAzKSB7CisJICAgIHVpbnQxNl90IGFkZHIgPSAoKHVpbnQxNl90ICopMHg0MDApW3BvcnRdOworCSAgICBpZiAoIWFkZHIpIHsKKwkJcHJpbnRmKCJObyBzZXJpYWwgcG9ydCBhZGRyZXNzIGZvdW5kIVxuIik7CisJICAgIHJldHVybiAtMTsKKwkgICAgfQorCSAgICBwcmludGYoIlNlcmlhbCBwb3J0ICV1IGlzIGF0IDB4JTA0eFxuIiwgcG9ydCwgYWRkcik7CisJICAgIHBvcnQgPSBhZGRyOworCX0KKyAgICB9CisKKyAgICBzaWYtPnBvcnQgPSBwb3J0OworICAgIHNpZi0+Y29uc29sZSA9IGZhbHNlOworCisgICAgZGl2aXNvciA9IDE7CQkvKiBEZWZhdWx0IHNwZWVkID0gMTE1MjAwIGJwcyAqLworCisgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHNlcmlhbCBjb25zb2xlICovCisgICAgaWYgKHBvcnQgPT0gc2NpLT5pb2Jhc2UpIHsKKwkvKiBPdmVybGF5aW5nIHRoZSBjb25zb2xlLi4uICovCisJc2lmLT5jb25zb2xlID0gdHJ1ZTsKKworCS8qIERlZmF1bHQgdG8gYWxyZWFkeSBjb25maWd1cmVkIHNwZWVkICovCisJZGl2aXNvciA9IHNjaS0+ZGl2aXNvcjsKKworCS8qIFNodXQgZG93biBJL08gdG8gdGhlIGNvbnNvbGUgZm9yIHRoZSB0aW1lIGJlaW5nICovCisJb3BlbmNvbnNvbGUoJmRldl9udWxsX3IsICZkZXZfbnVsbF93KTsKKyAgICB9CisKKyAgICBpZiAoYXJndlswXSAmJiBhcmd2WzFdKQorCWRpdmlzb3IgPSAxMTUyMDAvc3RydG91bChhcmd2WzFdLCBOVUxMLCAwKTsKKworICAgIGNsaSgpOwkJCS8qIEp1c3QgaW4gY2FzZS4uLiAqLworCisgICAgLyogU2F2ZSBvbGQgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KKyAgICBzaWYtPm9sZC5sY3IgPSBpbmIocG9ydCArIExDUik7CisgICAgc2lmLT5vbGQubWNyID0gaW5iKHBvcnQgKyBNQ1IpOworICAgIHNpZi0+b2xkLmlpciA9IGluYihwb3J0ICsgSUlSKTsKKworICAgIC8qIFNldCBzcGVlZCAqLworICAgIG91dGIoMHg4MywgcG9ydCArIExDUik7CS8qIEVuYWJsZSBkaXZpc29yIGFjY2VzcyAqLworICAgIHNpZi0+b2xkLmRsbCA9IGluYihwb3J0ICsgRExMKTsKKyAgICBzaWYtPm9sZC5kbG0gPSBpbmIocG9ydCArIERMTSk7CisgICAgb3V0YihkaXZpc29yLCBwb3J0ICsgRExMKTsKKyAgICBvdXRiKGRpdmlzb3IgPj4gOCwgcG9ydCArIERMTSk7CisgICAgKHZvaWQpaW5iKHBvcnQgKyBJRVIpOwkvKiBTeW5jaHJvbml6ZSAqLworCisgICAgZGxsID0gaW5iKHBvcnQgKyBETEwpOworICAgIGRsbSA9IGluYihwb3J0ICsgRExNKTsKKyAgICBsY3IgPSBpbmIocG9ydCArIExDUik7CisgICAgb3V0YigweDAzLCBwb3J0ICsgTENSKTsJLyogRW5hYmxlIGRhdGEgYWNjZXNzLCBuODEgKi8KKyAgICAodm9pZClpbmIocG9ydCArIElFUik7CS8qIFN5bmNocm9uaXplICovCisgICAgc2lmLT5vbGQuaWVyID0gaW5iKHBvcnQgKyBJRVIpOworCisgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgb3V0YigwLCBwb3J0ICsgSUVSKTsKKworICAgIHN0aSgpOworCisgICAgaWYgKGRsbCAhPSAodWludDhfdClkaXZpc29yIHx8CisJZGxtICE9ICh1aW50OF90KShkaXZpc29yID4+IDgpIHx8CisJbGNyICE9IDB4ODMpIHsKKwlzZXJpYWxfY2xlYW51cChzaWYpOworCXByaW50ZigiTm8gc2VyaWFsIHBvcnQgZGV0ZWN0ZWQhXG4iKTsKKwlyZXR1cm4gLTE7CQkvKiBUaGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgc2VyaWFsIHBvcnQgKi8KKyAgICB9CisKKyAgICAvKiBFbmFibGUgMTY1NTBBIEZJRk9zIGlmIGF2YWlsYWJsZSAqLworICAgIG91dGIoMHgwMSwgcG9ydCArIEZDUik7CS8qIEVuYWJsZSBGSUZPICovCisgICAgKHZvaWQpaW5iKHBvcnQgKyBJRVIpOwkvKiBTeW5jaHJvbml6ZSAqLworICAgIGlmIChpbmIocG9ydCArIElJUikgPCAweGMwKQorCW91dGIoMHgwMCwgcG9ydCArIEZDUik7CS8qIERpc2FibGUgRklGT3MgaWYgbm9uLWZ1bmN0aW9uYWwgKi8KKyAgICAodm9pZClpbmIocG9ydCArIElFUik7CS8qIFN5bmNocm9uaXplICovCisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBzZXJpYWxfd3JpdGUoc3RydWN0IHNlcmlhbF9pZiAqc2lmLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbikKK3sKKyAgICB1aW50MTZfdCBwb3J0ID0gc2lmLT5wb3J0OworICAgIGNvbnN0IGNoYXIgKnAgPSBkYXRhOworICAgIHVpbnQ4X3QgbHNyOworCisgICAgd2hpbGUgKG4tLSkgeworCWRvIHsKKwkgICAgbHNyID0gaW5iKHBvcnQgKyBMU1IpOworCX0gd2hpbGUgKCEobHNyICYgMHgyMCkpOworCisJb3V0YigqcCsrLCBwb3J0ICsgVEhSKTsKKyAgICB9Cit9CisKK3ZvaWQgc2VyaWFsX3JlYWQoc3RydWN0IHNlcmlhbF9pZiAqc2lmLCB2b2lkICpkYXRhLCBzaXplX3QgbikKK3sKKyAgICB1aW50MTZfdCBwb3J0ID0gc2lmLT5wb3J0OworICAgIGNoYXIgKnAgPSBkYXRhOworICAgIHVpbnQ4X3QgbHNyOworCisgICAgd2hpbGUgKG4tLSkgeworCWRvIHsKKwkgICAgbHNyID0gaW5iKHBvcnQgKyBMU1IpOworCX0gd2hpbGUgKCEobHNyICYgMHgwMSkpOworCisJKnArKyA9IGluYihwb3J0ICsgUkJSKTsKKyAgICB9Cit9CisKK3ZvaWQgc2VyaWFsX2NsZWFudXAoc3RydWN0IHNlcmlhbF9pZiAqc2lmKQoreworICAgIHVpbnQxNl90IHBvcnQgPSBzaWYtPnBvcnQ7CisKKyAgICBvdXRiKDB4ODMsIHBvcnQgKyBMQ1IpOworICAgICh2b2lkKWluYihwb3J0ICsgSUVSKTsKKyAgICBvdXRiKHNpZi0+b2xkLmRsbCwgcG9ydCArIERMTCk7CisgICAgb3V0YihzaWYtPm9sZC5kbG0sIHBvcnQgKyBETE0pOworICAgICh2b2lkKWluYihwb3J0ICsgSUVSKTsKKyAgICBvdXRiKHNpZi0+b2xkLmxjciAmIDB4N2YsIHBvcnQgKyBMQ1IpOworICAgICh2b2lkKWluYihwb3J0ICsgSUVSKTsKKyAgICBvdXRiKHNpZi0+b2xkLm1jciwgcG9ydCArIE1DUik7CisgICAgb3V0YihzaWYtPm9sZC5pZXIsIHBvcnQgKyBJRVIpOworICAgIGlmIChzaWYtPm9sZC5paXIgPCAweGMwKQorCW91dGIoMHgwMCwgcG9ydCArIEZDUik7CS8qIERpc2FibGUgRklGT3MgKi8KKworICAgIC8qIFJlLWVuYWJsZSBjb25zb2xlIG1lc3NhZ2VzLCBpZiB3ZSBzaHV0IHRoZW0gZG93biAqLworICAgIGlmIChzaWYtPmNvbnNvbGUpCisJb3BlbmNvbnNvbGUoJmRldl9udWxsX3IsICZkZXZfc3RkY29uX3cpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbGlidXBsb2FkL3NlcmlhbC5oIGIvY29tMzIvbGlidXBsb2FkL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NmYyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1cGxvYWQvc2VyaWFsLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBTRVJJQUxfSAorI2RlZmluZSBTRVJJQUxfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3N0cnVjdCBzZXJpYWxfaWYgeworICAgIHVpbnQxNl90IHBvcnQ7CisgICAgYm9vbCBjb25zb2xlOworICAgIHN0cnVjdCB7CisJdWludDhfdCBkbGwsIGRsbSwgaWVyLCBpaXIsIGxjciwgbWNyOworICAgIH0gb2xkOworfTsKKworaW50IHNlcmlhbF9pbml0KHN0cnVjdCBzZXJpYWxfaWYgKnNpZiwgY29uc3QgY2hhciAqYXJndltdKTsKK3ZvaWQgc2VyaWFsX3JlYWQoc3RydWN0IHNlcmlhbF9pZiAqc2lmLCB2b2lkICpkYXRhLCBzaXplX3Qgbik7Cit2b2lkIHNlcmlhbF93cml0ZShzdHJ1Y3Qgc2VyaWFsX2lmICpzaWYsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBuKTsKK3ZvaWQgc2VyaWFsX2NsZWFudXAoc3RydWN0IHNlcmlhbF9pZiAqc2lmKTsKKworI2VuZGlmIC8qIFNFUklBTF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9saWJ1cGxvYWQvc3JlY3NlbmQuaCBiL2NvbTMyL2xpYnVwbG9hZC9zcmVjc2VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2N2JlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1cGxvYWQvc3JlY3NlbmQuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgU1JFQ1NFTkRfSAorI2RlZmluZSBTUkVDU0VORF9ICisKKyNpbmNsdWRlICJmaWxlLmgiCisKK3ZvaWQgc2VuZF9zcmVjKHN0cnVjdCBzZXJpYWxfaWYgKiwgc3RydWN0IGZpbGVfaW5mbyAqLAorCQkgdm9pZCAoKikodm9pZCAqLCBzaXplX3QsIHN0cnVjdCBmaWxlX2luZm8gKiwgc2l6ZV90KSk7CisKKyNlbmRpZiAvKiBTUkVDU0VORF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9saWJ1cGxvYWQvdGZ0cC5oIGIvY29tMzIvbGlidXBsb2FkL3RmdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNkYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXBsb2FkL3RmdHAuaApAQCAtMCwwICsxLDIyIEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZm5kZWYgVVBMT0FEX1RGVFAKKyNkZWZpbmUgVVBMT0FEX1RGVFAKKy8qIFRGVFAgRXJyb3IgY29kZXMgKi8KK2VudW0gdGZ0cF9lcnJvcl9jb2RlcyB7CitURlRQX0VSUl9VTktOT1dOX0VSUk9SID0gMCwgLy8gV2UgaGF2ZSB0byB1c2UgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyCitURlRQX0VSUl9GSUxFX05PVF9GT1VORAk9IDEsIC8qKjwgRmlsZSBub3QgZm91bmQgKi8KK1RGVFBfRVJSX0FDQ0VTU19ERU5JRUQgPSAyLCAvKio8IEFjY2VzcyB2aW9sYXRpb24gKi8KK1RGVFBfRVJSX0RJU0tfRlVMTCA9IDMsIC8qKjwgRGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQgKi8KK1RGVFBfRVJSX0lMTEVHQUxfT1AgPSA0LCAvKio8IElsbGVnYWwgVEZUUCBvcGVyYXRpb24gKi8KK1RGVFBfRVJSX1VOS05PV05fVElEID0gNSwgLyoqPCBVbmtub3duIHRyYW5zZmVyIElEICovCitURlRQX0VSUl9GSUxFX0VYSVNUUyA9IDYsIC8qKjwgRmlsZSBhbHJlYWR5IGV4aXN0cyAqLworVEZUUF9FUlJfVU5LTk9XTl9VU0VSID0gNywgLyoqPCBObyBzdWNoIHVzZXIgKi8KK1RGVFBfRVJSX0JBRF9PUFRTID0gOCwgLyoqPCBPcHRpb24gbmVnb3RpYXRpb24gZmFpbGVkICovCitURlRQX0VSUl9VTkFCTEVfVE9fUkVTT0xWRSA9IDksIC8vIE5vdCBpbiBSRkMsIGludGVybmFsIHVzYWdlIAorVEZUUF9FUlJfVU5BQkxFX1RPX0NPTk5FQ1QgPSAxMCwgLy8gTm90IGluIFJGQywgaW50ZXJuYWwgdXNhZ2UKK1RGVFBfT0sJPSAxMSwgLyogTm90IGluIFJGQyAqLworfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnRmdHBfc3RyaW5nX2Vycm9yX21lc3NhZ2VbXTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbGlidXBsb2FkL3VwbG9hZF9iYWNrZW5kLmggYi9jb20zMi9saWJ1cGxvYWQvdXBsb2FkX2JhY2tlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWEwM2U0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXBsb2FkL3VwbG9hZF9iYWNrZW5kLmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZiBCQUNLRU5EX0gKKyNkZWZpbmUgQkFDS0VORF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSAic2VyaWFsLmgiCisjaW5jbHVkZSAidGZ0cC5oIgorCisvKiBCYWNrZW5kIGZsYWdzICovCisjZGVmaW5lIEJFX05FRURMRU4JMHgwMQorCitzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciAqaGVscG1zZzsKKyAgICBpbnQgbWluYXJnczsKKworICAgIHNpemVfdCBkYnl0ZXM7CisgICAgc2l6ZV90IHpieXRlczsKKyAgICBjb25zdCBjaGFyICoqYXJndjsKKworICAgIHVpbnQzMl90IG5vdzsKKworICAgIGludCAoKndyaXRlKShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKik7CisKKyAgICB6X3N0cmVhbSB6c3RyZWFtOworICAgIGNoYXIgKm91dGJ1ZjsKKyAgICBzaXplX3QgYWxsb2M7Cit9OworCisvKiB6b3V0LmMgKi8KK2ludCBpbml0X2RhdGEoc3RydWN0IHVwbG9hZF9iYWNrZW5kICpiZSwgY29uc3QgY2hhciAqYXJndltdKTsKK2ludCB3cml0ZV9kYXRhKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CitpbnQgZmx1c2hfZGF0YShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKTsKKworLyogY3Bpby5jICovCisjZGVmaW5lIGNwaW9faW5pdCBpbml0X2RhdGEKK2ludCBjcGlvX2hkcihzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlLCB1aW50MzJfdCBtb2RlLCBzaXplX3QgZGF0YWxlbiwKKwkgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK2ludCBjcGlvX21rZGlyKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK2ludCBjcGlvX3dyaXRlZmlsZShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgY3Bpb19jbG9zZShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKTsKKyNkZWZpbmUgTU9ERV9GSUxFCTAxMDA2NDQKKyNkZWZpbmUgTU9ERV9ESVIJMDA0MDc1NQorCisvKiBiYWNrZW5kcy5jICovCitzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmdldF91cGxvYWRfYmFja2VuZChjb25zdCBjaGFyICpuYW1lKTsKKworLyogYmFja2VuZHMgKi8KK2V4dGVybiBzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgdXBsb2FkX3RmdHA7CitleHRlcm4gc3RydWN0IHVwbG9hZF9iYWNrZW5kIHVwbG9hZF95bW9kZW07CitleHRlcm4gc3RydWN0IHVwbG9hZF9iYWNrZW5kIHVwbG9hZF9zcmVjOworCisjZW5kaWYgLyogQkFDS0VORF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9saWJ1cGxvYWQvdXBsb2FkX3NyZWMuYyBiL2NvbTMyL2xpYnVwbG9hZC91cGxvYWRfc3JlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTA3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1cGxvYWQvdXBsb2FkX3NyZWMuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogUy1yZWNvcmRzIGR1bXAgcm91dGluZSAtLSBkdW1wcyBTLXJlY29yZHMgb24gdGhlIGNvbnNvbGUKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgInVwbG9hZF9iYWNrZW5kLmgiCisKKy8qIFdyaXRlIGEgc2luZ2xlIFMtcmVjb3JkICovCitzdGF0aWMgaW50IHdyaXRlX3NyZWNvcmQodW5zaWduZWQgaW50IGxlbiwgIHVuc2lnbmVkIGludCBhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHIsIHVpbnQ4X3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBjaGFyIGJ1ZlsyKzIrOCsyNTUqMisyKzJdOworICAgIGNoYXIgKnAgPSBidWY7CisgICAgdWludDhfdCBjc3VtOworICAgIGNvbnN0IHVpbnQ4X3QgKmRwdHIgPSBkYXRhOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgc3dpdGNoIChhbGVuKSB7CisgICAgY2FzZSAyOgorICAgICAgICBhZGRyICY9IDB4ZmZmZjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBhZGRyICY9IDB4ZmZmZmZmOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNzdW0gPSAobGVuK2FsZW4rMSkgKyBhZGRyICsgKGFkZHIgPj4gOCkgKyAoYWRkciA+PiAxNikgKyAoYWRkciA+PiAyNCk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICBjc3VtICs9IGRwdHJbaV07CisgICAgY3N1bSA9IDB4ZmYtY3N1bTsKKworICAgIHAgKz0gc3ByaW50ZihwLCAiUyVjJTAyWCUwKlgiLCB0eXBlLCBsZW4rYWxlbisxLCBhbGVuKjIsIGFkZHIpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgcCArPSBzcHJpbnRmKHAsICIlMDJYIiwgZHB0cltpXSk7CisgICAgcCArPSBzcHJpbnRmKHAsICIlMDJYXG4iLCBjc3VtKTsKKworICAgIGZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGxvYWRfc3JlY193cml0ZShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKQoreworICAgIGNoYXIgbmFtZVszM107CisgICAgY29uc3QgY2hhciAqYnVmOworICAgIHNpemVfdCBsZW4sIGNodW5rLCBvZmZzZXQsIGhkcmxlbjsKKworICAgIGJ1ZiA9IGJlLT5vdXRidWY7CisgICAgbGVuID0gYmUtPnpieXRlczsKKworICAgIHB1dGNoYXIoJ1xuJyk7CisKKyAgICBoZHJsZW4gPSBzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgIiUuMzJzIiwKKwkJICAgICAgYmUtPmFyZ3ZbMF0gPyBiZS0+YXJndlswXSA6ICIiKTsKKworICAgIC8qIFdyaXRlIGhlYWQgcmVjb3JkICovCisgICAgd3JpdGVfc3JlY29yZChoZHJsZW4sIDIsIDAsICcwJywgbmFtZSk7CisKKyAgICAvKiBXcml0ZSBkYXRhIHJlY29yZHMgKi8KKyAgICBvZmZzZXQgPSAwOworICAgIHdoaWxlIChsZW4pIHsKKwljaHVuayA9IG1pbihsZW4sIChzaXplX3QpMzIpOworCisJd3JpdGVfc3JlY29yZChjaHVuaywgNCwgb2Zmc2V0LCAnMycsIGJ1Zik7CisJYnVmICs9IGNodW5rOworCWxlbiAtPSBjaHVuazsKKwlvZmZzZXQgKz0gY2h1bms7CisgICAgfQorCisgICAgLyogV3JpdGUgdGVybWluYXRpb24gcmVjb3JkICovCisgICAgd3JpdGVfc3JlY29yZCgwLCA0LCAwLCAnNycsIE5VTEwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB1cGxvYWRfYmFja2VuZCB1cGxvYWRfc3JlYyA9IHsKKyAgICAubmFtZSAgICAgICA9ICJzcmVjIiwKKyAgICAuaGVscG1zZyAgICA9ICJbZmlsZW5hbWVdIiwKKyAgICAubWluYXJncyAgICA9IDAsCisgICAgLndyaXRlICAgICAgPSB1cGxvYWRfc3JlY193cml0ZSwKK307CmRpZmYgLS1naXQgYS9jb20zMi9saWJ1cGxvYWQvdXBsb2FkX3RmdHAuYyBiL2NvbTMyL2xpYnVwbG9hZC91cGxvYWRfdGZ0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMGRhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1cGxvYWQvdXBsb2FkX3RmdHAuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIFRGVFAgZGF0YSBvdXRwdXQgYmFja2VuZAorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlICJ1cGxvYWRfYmFja2VuZC5oIgorCitlbnVtIHRmdHBfb3Bjb2RlIHsKKyAgICBURlRQX1JSUQk9IDEsCisgICAgVEZUUF9XUlEJPSAyLAorICAgIFRGVFBfREFUQQk9IDMsCisgICAgVEZUUF9BQ0sJPSA0LAorICAgIFRGVFBfRVJST1IJPSA1LAorfTsKKworc3RydWN0IHRmdHBfZXJyb3IgeworCXVpbnQxNl90IG9wY29kZTsKKwl1aW50MTZfdCBlcnJjb2RlOworCWNoYXIgZXJybXNnWzBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworc3RydWN0IHRmdHBfc3RhdGUgeworICAgIHVpbnQzMl90IG15X2lwOworICAgIHVpbnQzMl90IHNydl9pcDsKKyAgICB1aW50MzJfdCBzcnZfZ3c7CisgICAgdWludDE2X3QgbXlfcG9ydDsKKyAgICB1aW50MTZfdCBzcnZfcG9ydDsKKyAgICB1aW50MTZfdCBzZXE7Cit9OworCitjb25zdCBjaGFyICp0ZnRwX3N0cmluZ19lcnJvcl9tZXNzYWdlW109eworIiIsCisiRmlsZSBub3QgZm91bmQiLAorIkFjY2VzcyBEZW5pZWQiLAorIkRpc2sgRnVsbCIsCisiSWxsZWdhbCBPcGVyYXRpb24iLAorIlVua25vd24gVHJhbnNmZXJ0IElEIiwKKyJGaWxlIGFscmVhZHkgZXhpc3RzIiwKKyJVbmtub3duIFVzZXIiLAorIk5lZ29jaWF0aW9uIGZhaWxlZCIsCisiVW5hYmxlIHRvIHJlc29sdmUgaG9zdG5hbWUiLCAvLyBub3QgaW4gUkZDCisiVW5hYmxlIHRvIGNvbm5lY3QiLCAvLyBub3QgaW4gUkZDCisiTm8gRXJyb3IiLAorfTsKKworI2RlZmluZSBSQ1ZfQlVGCTIwNDgKKworc3RhdGljIGludCBzZW5kX2Fja19wYWNrZXQoc3RydWN0IHRmdHBfc3RhdGUgKnRmdHAsCisJCQkgICBjb25zdCB2b2lkICpwa3QsIHNpemVfdCBsZW4pCit7CisgICAgdF9QWEVOVl9VRFBfV1JJVEUgKnV3OworICAgIHRfUFhFTlZfVURQX1JFQUQgICp1cjsKKyAgICBjbG9ja190IHN0YXJ0OworICAgIHN0YXRpYyBjb25zdCBjbG9ja190IHRpbWVvdXRzW10gPSB7CisJMiwgMiwgMywgMywgNCwgNSwgNiwgNywgOSwgMTAsIDEyLCAxNSwgMTgsIDIxLCAyNiwgMzEsCisJMzcsIDQ0LCA1MywgNjQsIDc3LCA5MiwgMTEwLCAxMzIsIDE1OSwgMTkxLCAyMjksIDAKKyAgICB9OworICAgIGNvbnN0IGNsb2NrX3QgKnRpbWVvdXQ7CisgICAgaW50IGVyciA9IC0xOworCisgICAgdXcgPSBsbWFsbG9jKHNpemVvZiAqdXcgKyBsZW4pOworICAgIHVyID0gbG1hbGxvYyhzaXplb2YgKnVyICsgUkNWX0JVRik7CisKKyAgICBmb3IgKHRpbWVvdXQgPSB0aW1lb3V0cyA7ICp0aW1lb3V0IDsgdGltZW91dCsrKSB7CisJbWVtc2V0KHV3LCAwLCBzaXplb2YgKnV3KTsKKwltZW1jcHkodXcrMSwgcGt0LCBsZW4pOworCXV3LT5pcCA9IHRmdHAtPnNydl9pcDsKKwl1dy0+Z3cgPSB0ZnRwLT5zcnZfZ3c7CisJdXctPnNyY19wb3J0ID0gdGZ0cC0+bXlfcG9ydDsKKwl1dy0+ZHN0X3BvcnQgPSB0ZnRwLT5zcnZfcG9ydCA/IHRmdHAtPnNydl9wb3J0IDogaHRvbnMoNjkpOworCXV3LT5idWZmZXJfc2l6ZSA9IGxlbjsKKwl1dy0+YnVmZmVyID0gRkFSX1BUUih1dysxKTsKKworCXB4ZV9jYWxsKFBYRU5WX1VEUF9XUklURSwgdXcpOworCisJc3RhcnQgPSB0aW1lcyhOVUxMKTsKKworCWRvIHsKKwkgICAgbWVtc2V0KHVyLCAwLCBzaXplb2YgKnVyKTsKKwkgICAgdXItPnNyY19pcCA9IHRmdHAtPnNydl9pcDsKKwkgICAgdXItPmRlc3RfaXAgPSB0ZnRwLT5teV9pcDsKKwkgICAgdXItPnNfcG9ydCA9IHRmdHAtPnNydl9wb3J0OworCSAgICB1ci0+ZF9wb3J0ID0gdGZ0cC0+bXlfcG9ydDsKKwkgICAgdXItPmJ1ZmZlcl9zaXplID0gUkNWX0JVRjsKKwkgICAgdXItPmJ1ZmZlciA9IEZBUl9QVFIodXIrMSk7CisKKwkgICAgZXJyID0gcHhlX2NhbGwoUFhFTlZfVURQX1JFQUQsIHVyKTsKKworCSAgICBpZiAoIWVyciAmJgl1ci0+c3RhdHVzID09IFBYRU5WX1NUQVRVU19TVUNDRVNTICYmCisJCXRmdHAtPnNydl9pcCA9PSB1ci0+c3JjX2lwICYmCisJCSh0ZnRwLT5zcnZfcG9ydCA9PSAwIHx8CisJCSB0ZnRwLT5zcnZfcG9ydCA9PSB1ci0+c19wb3J0KSkgeworCQl1aW50MTZfdCAqeGIgPSAodWludDE2X3QgKikodXIrMSk7CisJCWlmIChudG9ocyh4YlswXSkgPT0gVEZUUF9BQ0sgJiYKKwkJICAgIG50b2hzKHhiWzFdKSA9PSB0ZnRwLT5zZXEpIHsKKwkJICAgIHRmdHAtPnNydl9wb3J0ID0gdXItPnNfcG9ydDsKKwkJICAgIGVyciA9IFRGVFBfT0s7CQkvKiBBbGwgZ29vZCEgKi8KKwkJICAgIGdvdG8gZG9uZTsKKwkJfSBlbHNlIGlmIChudG9ocyh4YlswXSkgPT0gVEZUUF9FUlJPUikgeworCQkgICAgc3RydWN0IHRmdHBfZXJyb3IgKnRlID0gKHN0cnVjdCB0ZnRwX2Vycm9yICopKHVyKzEpOworCQkgICAgaWYgKHRlLT5lcnJjb2RlID09IFRGVFBfRVJSX1VOS05PV05fRVJST1IpIHsKKwkJICAgIAl0ZnRwX3N0cmluZ19lcnJvcl9tZXNzYWdlW1RGVFBfRVJSX1VOS05PV05fRVJST1JdPXN0cmR1cCh0ZS0+ZXJybXNnKTsKKwkJICAgIH0KKyAJCSAgICBlcnI9LW50b2hzKHRlLT5lcnJjb2RlKTsgLy8gUmV0dXJuIHRoZSBhc3NvY2lhdGVkIGVycm9yIGNvZGUKKwkJICAgIGdvdG8gZG9uZTsKKwkJfQorCSAgICB9CisJfSB3aGlsZSAoKGNsb2NrX3QpKHRpbWVzKE5VTEwpIC0gc3RhcnQpIDwgKnRpbWVvdXQpOworICAgIH0KKworZG9uZToKKyAgICBsZnJlZSh1cik7CisgICAgbGZyZWUodXcpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1cGxvYWRfdGZ0cF93cml0ZShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKQoreworICAgIHN0YXRpYyB1aW50MTZfdCBsb2NhbF9wb3J0ID0gMHg0MDAwOworICAgIHN0cnVjdCB0ZnRwX3N0YXRlIHRmdHA7CisgICAgY2hhciBidWZmZXJbNTEyKzQrNl07CisgICAgaW50IG5sZW47CisgICAgaW50IGVycj1URlRQX09LOworICAgIGNvbnN0IHVuaW9uIHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbyAqc2RpID0KKwlzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8oKTsKKyAgICBjb25zdCBjaGFyICpkYXRhID0gYmUtPm91dGJ1ZjsKKyAgICBzaXplX3QgbGVuID0gYmUtPnpieXRlczsKKyAgICBzaXplX3QgY2h1bms7CisKKyAgICB0ZnRwLm15X2lwICAgID0gc2RpLT5weGUubXlpcDsKKyAgICB0ZnRwLm15X3BvcnQgID0gaHRvbnMobG9jYWxfcG9ydCsrKTsKKyAgICB0ZnRwLnNydl9ndyAgID0gKCh0ZnRwLnNydl9pcCBeIHRmdHAubXlfaXApICYgc2RpLT5weGUuaXBpbmZvLT5uZXRtYXNrKQorCT8gc2RpLT5weGUuaXBpbmZvLT5nYXRld2F5IDogMDsKKyAgICB0ZnRwLnNydl9wb3J0ID0gMDsKKyAgICB0ZnRwLnNlcSAgICAgID0gMDsKKworICAgIGlmIChiZS0+YXJndlsxXSkgeworCXRmdHAuc3J2X2lwICAgPSBweGVfZG5zKGJlLT5hcmd2WzFdKTsKKwlpZiAoIXRmdHAuc3J2X2lwKSB7CisvLwkgICAgcHJpbnRmKCJcblVuYWJsZSB0byByZXNvbHZlIGhvc3RuYW1lOiAlc1xuIiwgYmUtPmFyZ3ZbMV0pOworCSAgICByZXR1cm4gLVRGVFBfRVJSX1VOQUJMRV9UT19SRVNPTFZFOworCX0KKyAgICB9IGVsc2UgeworCXRmdHAuc3J2X2lwICAgPSBzZGktPnB4ZS5pcGluZm8tPnNlcnZlcmlwOworCWlmICghdGZ0cC5zcnZfaXApIHsKKy8vCSAgICBwcmludGYoIlxuTm8gc2VydmVyIElQIGFkZHJlc3NcbiIpOworCSAgICByZXR1cm4gLVRGVFBfRVJSX1VOQUJMRV9UT19DT05ORUNUOworCX0KKyAgICB9CisKKy8qICAgIHByaW50Zigic2VydmVyICV1LiV1LiV1LiV1Li4uICIsCisJICAgKCh1aW50OF90ICopJnRmdHAuc3J2X2lwKVswXSwKKwkgICAoKHVpbnQ4X3QgKikmdGZ0cC5zcnZfaXApWzFdLAorCSAgICgodWludDhfdCAqKSZ0ZnRwLnNydl9pcClbMl0sCisJICAgKCh1aW50OF90ICopJnRmdHAuc3J2X2lwKVszXSk7Ki8KKworICAgIGJ1ZmZlclswXSA9IDA7CisgICAgYnVmZmVyWzFdID0gVEZUUF9XUlE7CisgICAgbmxlbiA9IHN0cmxjcHkoYnVmZmVyKzIsIGJlLT5hcmd2WzBdLCA1MTIpOworICAgIG1lbWNweShidWZmZXIrMytubGVuLCAib2N0ZXQiLCA2KTsKKworICAgIGlmICgoZXJyPXNlbmRfYWNrX3BhY2tldCgmdGZ0cCwgYnVmZmVyLCAyK25sZW4rMSs2KSkhPVRGVFBfT0spCisJcmV0dXJuIGVycjsKKworICAgIGRvIHsKKwljaHVuayA9IGxlbiA+PSA1MTIgPyA1MTIgOiBsZW47CisKKwlidWZmZXJbMV0gPSBURlRQX0RBVEE7CisJKigodWludDE2X3QgKikoYnVmZmVyKzIpKSA9IGh0b25zKCsrdGZ0cC5zZXEpOworCW1lbWNweShidWZmZXIrNCwgZGF0YSwgY2h1bmspOworCWRhdGEgKz0gY2h1bms7CisJbGVuIC09IGNodW5rOworCisJaWYgKChlcnI9c2VuZF9hY2tfcGFja2V0KCZ0ZnRwLCBidWZmZXIsIGNodW5rKzQpKSE9VEZUUF9PSykKKwkgICAgcmV0dXJuIGVycjsKKyAgICB9IHdoaWxlIChjaHVuayA9PSA1MTIpOworCisgICAgcmV0dXJuIFRGVFBfT0s7Cit9CisKK3N0cnVjdCB1cGxvYWRfYmFja2VuZCB1cGxvYWRfdGZ0cCA9IHsKKyAgICAubmFtZSAgICAgICA9ICJ0ZnRwIiwKKyAgICAuaGVscG1zZyAgICA9ICJmaWxlbmFtZSBbdGZ0cF9zZXJ2ZXJdIiwKKyAgICAubWluYXJncyAgICA9IDEsCisgICAgLndyaXRlICAgICAgPSB1cGxvYWRfdGZ0cF93cml0ZSwKK307CmRpZmYgLS1naXQgYS9jb20zMi9saWJ1cGxvYWQvdXBsb2FkX3ltb2RlbS5jIGIvY29tMzIvbGlidXBsb2FkL3VwbG9hZF95bW9kZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIzMjdkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXBsb2FkL3VwbG9hZF95bW9kZW0uYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIFltb2RlbSBzZW5kIHJvdXRpbmUuICBPbmx5IHN1cHBvcnRzIDFLIGJsb2NrcyBhbmQgQ1JDIG1vZGUuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlICJ1cGxvYWRfYmFja2VuZC5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorCitlbnVtIHsKKyAgICBTT0ggPSAweDAxLAorICAgIFNUWCA9IDB4MDIsCisgICAgRU9UID0gMHgwNCwKKyAgICBBQ0sgPSAweDA2LAorICAgIE5BSyA9IDB4MTUsCisgICAgQ0FOID0gMHgxOCwKK307CisKK3N0cnVjdCB5bW9kZW1fc3RhdGUgeworICAgIHN0cnVjdCBzZXJpYWxfaWYgc2VyaWFsOworICAgIHVuc2lnbmVkIGludCBzZXEsIGJsb2NrczsKK307CisKKy8qCisgKiBBcHBlbmQgYSBDUkMxNiB0byBhIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9jcmMxNih1aW50OF90ICogYmxrLCBpbnQgbGVuKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBjcmN0YWJbMjU2XSA9IHsKKwkweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MGE1LCAweDYwYzYsIDB4NzBlNywKKwkweDgxMDgsIDB4OTEyOSwgMHhhMTRhLCAweGIxNmIsIDB4YzE4YywgMHhkMWFkLCAweGUxY2UsIDB4ZjFlZiwKKwkweDEyMzEsIDB4MDIxMCwgMHgzMjczLCAweDIyNTIsIDB4NTJiNSwgMHg0Mjk0LCAweDcyZjcsIDB4NjJkNiwKKwkweDkzMzksIDB4ODMxOCwgMHhiMzdiLCAweGEzNWEsIDB4ZDNiZCwgMHhjMzljLCAweGYzZmYsIDB4ZTNkZSwKKwkweDI0NjIsIDB4MzQ0MywgMHgwNDIwLCAweDE0MDEsIDB4NjRlNiwgMHg3NGM3LCAweDQ0YTQsIDB4NTQ4NSwKKwkweGE1NmEsIDB4YjU0YiwgMHg4NTI4LCAweDk1MDksIDB4ZTVlZSwgMHhmNWNmLCAweGM1YWMsIDB4ZDU4ZCwKKwkweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZkNywgMHg2NmY2LCAweDU2OTUsIDB4NDZiNCwKKwkweGI3NWIsIDB4YTc3YSwgMHg5NzE5LCAweDg3MzgsIDB4ZjdkZiwgMHhlN2ZlLCAweGQ3OWQsIDB4YzdiYywKKwkweDQ4YzQsIDB4NThlNSwgMHg2ODg2LCAweDc4YTcsIDB4MDg0MCwgMHgxODYxLCAweDI4MDIsIDB4MzgyMywKKwkweGM5Y2MsIDB4ZDllZCwgMHhlOThlLCAweGY5YWYsIDB4ODk0OCwgMHg5OTY5LCAweGE5MGEsIDB4YjkyYiwKKwkweDVhZjUsIDB4NGFkNCwgMHg3YWI3LCAweDZhOTYsIDB4MWE3MSwgMHgwYTUwLCAweDNhMzMsIDB4MmExMiwKKwkweGRiZmQsIDB4Y2JkYywgMHhmYmJmLCAweGViOWUsIDB4OWI3OSwgMHg4YjU4LCAweGJiM2IsIDB4YWIxYSwKKwkweDZjYTYsIDB4N2M4NywgMHg0Y2U0LCAweDVjYzUsIDB4MmMyMiwgMHgzYzAzLCAweDBjNjAsIDB4MWM0MSwKKwkweGVkYWUsIDB4ZmQ4ZiwgMHhjZGVjLCAweGRkY2QsIDB4YWQyYSwgMHhiZDBiLCAweDhkNjgsIDB4OWQ0OSwKKwkweDdlOTcsIDB4NmViNiwgMHg1ZWQ1LCAweDRlZjQsIDB4M2UxMywgMHgyZTMyLCAweDFlNTEsIDB4MGU3MCwKKwkweGZmOWYsIDB4ZWZiZSwgMHhkZmRkLCAweGNmZmMsIDB4YmYxYiwgMHhhZjNhLCAweDlmNTksIDB4OGY3OCwKKwkweDkxODgsIDB4ODFhOSwgMHhiMWNhLCAweGExZWIsIDB4ZDEwYywgMHhjMTJkLCAweGYxNGUsIDB4ZTE2ZiwKKwkweDEwODAsIDB4MDBhMSwgMHgzMGMyLCAweDIwZTMsIDB4NTAwNCwgMHg0MDI1LCAweDcwNDYsIDB4NjA2NywKKwkweDgzYjksIDB4OTM5OCwgMHhhM2ZiLCAweGIzZGEsIDB4YzMzZCwgMHhkMzFjLCAweGUzN2YsIDB4ZjM1ZSwKKwkweDAyYjEsIDB4MTI5MCwgMHgyMmYzLCAweDMyZDIsIDB4NDIzNSwgMHg1MjE0LCAweDYyNzcsIDB4NzI1NiwKKwkweGI1ZWEsIDB4YTVjYiwgMHg5NWE4LCAweDg1ODksIDB4ZjU2ZSwgMHhlNTRmLCAweGQ1MmMsIDB4YzUwZCwKKwkweDM0ZTIsIDB4MjRjMywgMHgxNGEwLCAweDA0ODEsIDB4NzQ2NiwgMHg2NDQ3LCAweDU0MjQsIDB4NDQwNSwKKwkweGE3ZGIsIDB4YjdmYSwgMHg4Nzk5LCAweDk3YjgsIDB4ZTc1ZiwgMHhmNzdlLCAweGM3MWQsIDB4ZDczYywKKwkweDI2ZDMsIDB4MzZmMiwgMHgwNjkxLCAweDE2YjAsIDB4NjY1NywgMHg3Njc2LCAweDQ2MTUsIDB4NTYzNCwKKwkweGQ5NGMsIDB4Yzk2ZCwgMHhmOTBlLCAweGU5MmYsIDB4OTljOCwgMHg4OWU5LCAweGI5OGEsIDB4YTlhYiwKKwkweDU4NDQsIDB4NDg2NSwgMHg3ODA2LCAweDY4MjcsIDB4MThjMCwgMHgwOGUxLCAweDM4ODIsIDB4MjhhMywKKwkweGNiN2QsIDB4ZGI1YywgMHhlYjNmLCAweGZiMWUsIDB4OGJmOSwgMHg5YmQ4LCAweGFiYmIsIDB4YmI5YSwKKwkweDRhNzUsIDB4NWE1NCwgMHg2YTM3LCAweDdhMTYsIDB4MGFmMSwgMHgxYWQwLCAweDJhYjMsIDB4M2E5MiwKKwkweGZkMmUsIDB4ZWQwZiwgMHhkZDZjLCAweGNkNGQsIDB4YmRhYSwgMHhhZDhiLCAweDlkZTgsIDB4OGRjOSwKKwkweDdjMjYsIDB4NmMwNywgMHg1YzY0LCAweDRjNDUsIDB4M2NhMiwgMHgyYzgzLCAweDFjZTAsIDB4MGNjMSwKKwkweGVmMWYsIDB4ZmYzZSwgMHhjZjVkLCAweGRmN2MsIDB4YWY5YiwgMHhiZmJhLCAweDhmZDksIDB4OWZmOCwKKwkweDZlMTcsIDB4N2UzNiwgMHg0ZTU1LCAweDVlNzQsIDB4MmU5MywgMHgzZWIyLCAweDBlZDEsIDB4MWVmMAorICAgIH07CisgICAgdWludDE2X3QgY3JjID0gMDsKKworICAgIHdoaWxlIChsZW4tLSkKKwljcmMgPSBjcmN0YWJbKGNyYyA+PiA4KSBeICpibGsrK10gXiBjcmMgPDwgODsKKworICAgICpibGsrKyA9IGNyYyA+PiA4OworICAgICpibGsgPSBjcmM7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfYWNrKHN0cnVjdCB5bW9kZW1fc3RhdGUgKnltLCBjb25zdCB1aW50OF90ICpibGssCisJCSAgICAgc2l6ZV90IGJ5dGVzKTsKKworc3RhdGljIHZvaWQgc2VuZF9hY2tfYmxrKHN0cnVjdCB5bW9kZW1fc3RhdGUgKnltLCB1aW50OF90ICpibGspCit7CisgICAgcHJpbnRmKCJTZW5kaW5nIGJsb2NrICV1LyV1Li4uXHIiLCB5bS0+c2VxLCB5bS0+YmxvY2tzKTsKKworICAgIGJsa1swXSA9IFNUWDsKKyAgICBibGtbMV0gPSB5bS0+c2VxKys7CisgICAgYmxrWzJdID0gfmJsa1sxXTsKKyAgICBhZGRfY3JjMTYoYmxrKzMsIDEwMjQpOworCisgICAgc2VuZF9hY2soeW0sIGJsaywgMTAyNCs1KTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9hY2soc3RydWN0IHltb2RlbV9zdGF0ZSAqeW0sIGNvbnN0IHVpbnQ4X3QgKmJsaywgc2l6ZV90IGJ5dGVzKQoreworICAgIHVpbnQ4X3QgYWNrX2J1ZjsKKworICAgIGRvIHsKKwlzZXJpYWxfd3JpdGUoJnltLT5zZXJpYWwsIGJsaywgYnl0ZXMpOworCisJZG8geworCSAgICBzZXJpYWxfcmVhZCgmeW0tPnNlcmlhbCwgJmFja19idWYsIDEpOworCX0gd2hpbGUgKGFja19idWYgIT0gQUNLICYmIGFja19idWYgIT0gTkFLKTsKKyAgICB9IHdoaWxlIChhY2tfYnVmID09IE5BSyk7Cit9CisKK3N0YXRpYyBpbnQgdXBsb2FkX3ltb2RlbV93cml0ZShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGVvdF9idWYgPSBFT1Q7CisgICAgdWludDhfdCBhY2tfYnVmOworICAgIHVpbnQ4X3QgYmxrX2J1ZlsxMDI0ICsgNV07CisgICAgc3RydWN0IHltb2RlbV9zdGF0ZSB5bTsKKyAgICBjb25zdCBjaGFyICpidWY7CisgICAgc2l6ZV90IGxlbiwgY2h1bms7CisgICAgY29uc3QgY2hhciB5bW9kZW1fYmFubmVyW10gPSAiTm93IGJlZ2luIFltb2RlbSBkb3dubG9hZC4uLlxyXG4iOworCisgICAgYnVmID0gYmUtPm91dGJ1ZjsKKyAgICBsZW4gPSBiZS0+emJ5dGVzOworCisgICAgcHV0Y2hhcignXG4nKTsKKworICAgIHltLnNlcSA9IDA7CisgICAgeW0uYmxvY2tzID0gKGxlbisxMDIzKS8xMDI0OworCisgICAgLyogSW5pdGlhbGl6ZSBzZXJpYWwgcG9ydCAqLworICAgIGlmIChzZXJpYWxfaW5pdCgmeW0uc2VyaWFsLCAmYmUtPmFyZ3ZbMV0pKQorCXJldHVybiAtMTsKKworICAgIC8qIFdyaXRlIGJhbm5lciAqLworICAgIHByaW50ZigiV3JpdGluZyBiYW5uZXIuLi5cbiIpOworICAgIHNlcmlhbF93cml0ZSgmeW0uc2VyaWFsLCB5bW9kZW1fYmFubmVyLCBzaXplb2YgeW1vZGVtX2Jhbm5lci0xKTsKKworICAgIC8qIFdhaXQgZm9yIGluaXRpYWwgaGFuZHNoYWtlICovCisgICAgcHJpbnRmKCJXYWl0aW5nIGZvciBoYW5kc2hha2UuLi5cbiIpOworICAgIGRvIHsKKwlzZXJpYWxfcmVhZCgmeW0uc2VyaWFsLCAmYWNrX2J1ZiwgMSk7CisgICAgfSB3aGlsZSAoYWNrX2J1ZiAhPSAnQycpOworCisgICAgLyogU2VuZCBmaWxlbmFtZSBibG9jayAqLworICAgIG1lbXNldChibGtfYnVmLCAwLCBzaXplb2YgYmxrX2J1Zik7CisgICAgc25wcmludGYoKGNoYXIgKilibGtfYnVmKzMsIDEwMjQsICIlcyVjJXp1IDAlbyAwNjQ0IiwKKwkgICAgIGJlLT5hcmd2WzBdLCAwLCBiZS0+emJ5dGVzLCBiZS0+bm93KTsKKyAgICBzZW5kX2Fja19ibGsoJnltLCBibGtfYnVmKTsKKworICAgIHdoaWxlIChsZW4pIHsKKwljaHVuayA9IGxlbiA8IDEwMjQgPyBsZW4gOiAxMDI0OworCisJbWVtY3B5KGJsa19idWYrMywgYnVmLCBjaHVuayk7CisJaWYgKGNodW5rIDwgMTAyNCkKKwkgICAgbWVtc2V0KGJsa19idWYrMytjaHVuaywgMHgxYSwgMTAyNC1jaHVuayk7CisKKwlzZW5kX2Fja19ibGsoJnltLCBibGtfYnVmKTsKKwlidWYgKz0gY2h1bms7CisJbGVuIC09IGNodW5rOworICAgIH0KKworICAgIHByaW50ZigiXG5TZW5kaW5nIEVPVC4uLlxuIik7CisgICAgc2VuZF9hY2soJnltLCAmZW90X2J1ZiwgMSk7CisKKyAgICBwcmludGYoIldhaXRpbmcgZm9yIGhhbmRzaGFrZS4uLlxuIik7CisgICAgZG8geworCXNlcmlhbF9yZWFkKCZ5bS5zZXJpYWwsICZhY2tfYnVmLCAxKTsKKyAgICB9IHdoaWxlIChhY2tfYnVmICE9ICdDJyk7CisgICAgeW0uc2VxID0gMDsKKworICAgIHByaW50ZigiU2VuZGluZyBiYXRjaCB0ZXJtaW5hdGlvbiBibG9jay4uLlxuIik7CisgICAgbWVtc2V0KGJsa19idWYrMywgMCwgMTAyNCk7CisgICAgc2VuZF9hY2tfYmxrKCZ5bSwgYmxrX2J1Zik7CisKKyAgICBwcmludGYoIkNsZWFuaW5nIHVwLi4uICAgICAgICAgICAgIFxuIik7CisgICAgc2VyaWFsX2NsZWFudXAoJnltLnNlcmlhbCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RydWN0IHVwbG9hZF9iYWNrZW5kIHVwbG9hZF95bW9kZW0gPSB7CisgICAgLm5hbWUgICAgICAgPSAieW1vZGVtIiwKKyAgICAuaGVscG1zZyAgICA9ICJmaWxlbmFtZSBbcG9ydCBbc3BlZWRdXSIsCisgICAgLm1pbmFyZ3MgICAgPSAxLAorICAgIC53cml0ZSAgICAgID0gdXBsb2FkX3ltb2RlbV93cml0ZSwKK307CmRpZmYgLS1naXQgYS9jb20zMi9saWJ1cGxvYWQveW1vZGVtLnR4dCBiL2NvbTMyL2xpYnVwbG9hZC95bW9kZW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjRmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1cGxvYWQveW1vZGVtLnR4dApAQCAtMCwwICsxLDIxMDggQEAKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIC0KKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBYTU9ERU0vWU1PREVNIFBST1RPQ09MIFJFRkVSRU5DRQorICAgICAgICAgICAgICAgICAgICAgQSBjb21wZW5kaXVtIG9mIGRvY3VtZW50cyBkZXNjcmliaW5nIHRoZQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNT0RFTSBhbmQgWU1PREVNCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBUcmFuc2ZlciBQcm90b2NvbHMKKworCisKKworICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZG9jdW1lbnQgd2FzIGZvcm1hdHRlZCAxMC0xNC04OC4KKworCisKKworCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0ZWQgYnkgQ2h1Y2sgRm9yc2JlcmcKKworCisKKworCisKKworCisKKyAgICAgICAgICAgICAgICBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgd2l0aG91dCByZXN0cmljdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgdGhlIHRleHQgaXMgbm90IGFsdGVyZWQuCisKKyAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBkaXN0cmlidXRlIGFzIHdpZGVseSBhcyBwb3NzaWJsZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlc3Rpb25zIHRvIENodWNrIEZvcnNiZXJnCisKKworCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9tZW4gVGVjaG5vbG9neSBJbmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIEhpZ2ggUmVsaWFiaWxpdHkgU29mdHdhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzUwNS1WIFNhdXZpZSBJc2xhbmQgUm9hZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGxhbmQgT3JlZ29uIDk3MjMxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9JQ0U6IDUwMy02MjEtMzQwNiA6Vk9JQ0UKKyAgICAgIFRlbGVHb2R6aWxsYSBCQlM6IDUwMy02MjEtMzc0NiBTcGVlZCAxOTIwMChUZWxlYml0IFBFUCksMjQwMCwxMjAwLDMwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHVTZXJ2ZTogNzAwMDcsMjMwNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VuaWU6IENBRgorICAgICAgICAgICAgICAgICAgICAgICAgVVVDUDogLi4uIXRla3Ryb25peCFyZWVkIW9tZW4hY2FmCisKKworCisKKworCisKKworCisKKworCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDIgLQorCisKKworICAgIDEuICBUT1dFUiBPRiBCQUJFTAorCisgICAgQSAiWU1PREVNIFRvd2VyIG9mIEJhYmVsIiBoYXMgZGVzY2VuZGVkIG9uIHRoZSBtaWNyb2NvbXB1dGluZyBjb21tdW5pdHkKKyAgICBicmluZ2luZyB3aXRoIGl0IGNvbmZ1c2lvbiwgZnJ1c3RyYXRpb24sIGJsb2F0ZWQgcGhvbmUgYmlsbHMsIGFuZCB3YXN0ZWQKKyAgICBtYW4gaG91cnMuICBTYWRseSwgSSAoQ2h1Y2sgRm9yc2JlcmcpIGFtIHBhcnRseSB0byBibGFtZSBmb3IgdGhpcyBtZXNzLgorCisgICAgQXMgYXV0aG9yIG9mIHRoZSBlYXJseSAxOTgwcyBiYXRjaCBhbmQgMWsgWE1PREVNIGV4dGVuc2lvbnMsIEkgYXNzdW1lZAorICAgIHJlYWRlcnMgb2YgZWFybGllciB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50IHdvdWxkIGltcGxlbWVudCBhcyBtdWNoIG9mCisgICAgdGhlIFlNT0RFTSBwcm90b2NvbCBhcyB0aGVpciBwcm9ncmFtbWluZyBza2lsbHMgYW5kIGNvbXB1dGluZyBlbnZpcm9ubWVudHMKKyAgICB3b3VsZCBwZXJtaXQuICBUaGlzIHByb3ZlZCBhIHJhdGhlciBuYWl2ZSBhc3N1bXB0aW9uIGFzIHByb2dyYW1tZXJzCisgICAgbW90aXZhdGVkIGJ5IGNvbXBldGl0aXZlIHByZXNzdXJlIGltcGxlbWVudGVkIGFzIGxpdHRsZSBvZiBZTU9ERU0gYXMKKyAgICBwb3NzaWJsZS4gIFNvbWUgaGF2ZSB0YWtlbiB3aGF0ZXZlciBwYXJ0cyBvZiBZTU9ERU0gdGhhdCBhcHBlYWxlZCB0byB0aGVtLAorICAgIGFwcGxpZWQgdGhlbSB0byBNT0RFTTcgQmF0Y2gsIFRlbGluaywgWE1PREVNIG9yIHdoYXRldmVyLCBhbmQgY2FsbGVkIHRoZQorICAgIHJlc3VsdCBZTU9ERU0uCisKKyAgICBKZWZmIEdhcmJlcnMgKENyb3NzdGFsayBwYWNrYWdlIGRldmVsb3BtZW50IGRpcmVjdG9yKSBzYWlkIGl0IGFsbDogIldpdGgKKyAgICBwcm90b2NvbHMgaW4gdGhlIHB1YmxpYyBkb21haW4sIGFueW9uZSB3aG8gd2FudHMgdG8gZGluayBhcm91bmQgd2l0aCB0aGVtCisgICAgY2FuIGdvIGFoZWFkLiIgWzFdCisKKyAgICBEb2N1bWVudHMgY29udGFpbmluZyBhbHRlcmVkIGV4YW1wbGVzIGRlcml2ZWQgZnJvbSBZTU9ERU0uRE9DIGhhdmUgYWRkZWQKKyAgICB0byB0aGUgY29uZnVzaW9uLiAgSW4gb25lIGluc3RhbmNlLCBzb21lIHNlbGYgc3R5bGVkIHJld3JpdGVyIG9mIGhpc3RvcnkKKyAgICBhbHRlcmVkIHRoZSBoZWFkaW5nIGluIFlNT0RFTS5ET0MncyBGaWd1cmUgMSBmcm9tICIxMDI0IGJ5dGUgUGFja2V0cyIgdG8KKyAgICAiWU1PREVNL0NSQyBGaWxlIFRyYW5zZmVyIFByb3RvY29sIi4gIE5vbmUgb2YgdGhlIFhNT0RFTSBhbmQgWU1PREVNCisgICAgZXhhbXBsZXMgc2hvd24gaW4gdGhhdCBkb2N1bWVudCB3ZXJlIGNvcnJlY3QuCisKKyAgICBUbyBwdXQgYW4gZW5kIHRvIHRoaXMgY29uZnVzaW9uLCB3ZSBtdXN0IG1ha2UgInBlcmZlY3RseSBjbGVhciIgd2hhdAorICAgIFlNT0RFTSBzdGFuZHMgZm9yLCBhcyBXYXJkIENocmlzdGVuc2VuIGRlZmluZWQgaXQgaW4gaGlzIDE5ODUgY29pbmluZyBvZgorICAgIHRoZSB0ZXJtLgorCisgICAgVG8gdGhlIG1ham9yaXR5IG9mIHlvdSB3aG8gcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHJlc3BlY3RlZCBXYXJkJ3MKKyAgICBkZWZpbml0aW9uIG9mIFlNT0RFTSwgSSBhcG9sb2dpemUgZm9yIHRoZSBpbmNvbnZlbmllbmNlLgorCisgICAgMS4xICBEZWZpbml0aW9ucworCisgICAgQVJDICAgICBBUkMgaXMgYSBwcm9ncmFtIHRoYXQgY29tcHJlc3NlcyBvbmUgb3IgbW9yZSBmaWxlcyBpbnRvIGFuIGFyY2hpdmUKKyAgICAgICAgICAgIGFuZCBleHRyYWN0cyBmaWxlcyBmcm9tIHN1Y2ggYXJjaGl2ZXMuCisKKyAgICBYTU9ERU0gIHJlZmVycyB0byB0aGUgZmlsZSB0cmFuc2ZlciBldGlxdWV0dGUgaW50cm9kdWNlZCBieSBXYXJkCisgICAgICAgICAgICBDaHJpc3RlbnNlbidzIDE5NzcgTU9ERU0uQVNNIHByb2dyYW0uICBUaGUgbmFtZSBYTU9ERU0gY29tZXMgZnJvbQorICAgICAgICAgICAgS2VpdGggUGV0ZXJzZW4ncyBYTU9ERU0uQVNNIHByb2dyYW0sIGFuIGFkYXB0YXRpb24gb2YgTU9ERU0uQVNNCisgICAgICAgICAgICBmb3IgUmVtb3RlIENQL00gKFJDUE0pIHN5c3RlbXMuICBJdCdzIGFsc28gY2FsbGVkIHRoZSBNT0RFTSBvcgorICAgICAgICAgICAgTU9ERU0yIHByb3RvY29sLiAgU29tZSB3aG8gYXJlIHVuYXdhcmUgb2YgTU9ERU03J3MgdW51c3VhbCBiYXRjaAorICAgICAgICAgICAgZmlsZSBtb2RlIGNhbGwgaXQgTU9ERU03LiAgT3RoZXIgYWxpYXNlcyBpbmNsdWRlICJDUC9NIFVzZXJzJworICAgICAgICAgICAgR3JvdXAiIGFuZCAiVEVSTSBJSSBGVFAgMyIuICBUaGUgbmFtZSBYTU9ERU0gY2F1Z2h0IG9uIHBhcnRseQorICAgICAgICAgICAgYmVjYXVzZSBpdCBpcyBkaXN0aW5jdGl2ZSBhbmQgcGFydGx5IGJlY2F1c2Ugb2YgbWVkaWEgaW50ZXJlc3QgaW4KKworCisgICAgX19fX19fX19fXworCisgICAgIDEuIFBhZ2UgQy8xMiwgUEMtV0VFSyBKdWx5IDEyLCAxOTg3CisKKworCisKKyAgICBDaGFwdGVyIDEKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisKKworCisgICAgICAgICAgICBidWxsZXRpbiBib2FyZCBhbmQgUkNQTSBzeXN0ZW1zIHdoZXJlIGl0IHdhcyBhY2Nlc3NlZCB3aXRoIGFuCisgICAgICAgICAgICAiWE1PREVNIiBjb21tYW5kLiAgVGhpcyBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgYnkgZXZlcnkgc2VyaW91cworICAgICAgICAgICAgY29tbXVuaWNhdGlvbnMgcHJvZ3JhbSBiZWNhdXNlIG9mIGl0cyB1bml2ZXJzYWxpdHksIHNpbXBsaWNpdHksCisgICAgICAgICAgICBhbmQgcmVhc29uYWJsZSBwZXJmb3JtYW5jZS4KKworICAgIFhNT0RFTS9DUkMgcmVwbGFjZXMgWE1PREVNJ3MgMSBieXRlIGNoZWNrc3VtIHdpdGggYSB0d28gYnl0ZSBDeWNsaWNhbAorICAgICAgICAgICAgUmVkdW5kYW5jeSBDaGVjayAoQ1JDLTE2KSwgZ2l2aW5nIG1vZGVybiBlcnJvciBkZXRlY3Rpb24KKyAgICAgICAgICAgIHByb3RlY3Rpb24uCisKKyAgICBYTU9ERU0tMWsgUmVmZXJzIHRvIHRoZSBYTU9ERU0vQ1JDIHByb3RvY29sIHdpdGggMTAyNCBieXRlIGRhdGEgYmxvY2tzLgorCisgICAgWU1PREVNICBSZWZlcnMgdG8gdGhlIFhNT0RFTS9DUkMgKG9wdGlvbmFsIDFrIGJsb2NrcykgcHJvdG9jb2wgd2l0aCBiYXRjaAorICAgICAgICAgICAgdHJhbnNtaXNzaW9uIGFzIGRlc2NyaWJlZCBiZWxvdy4gIEluIGEgbnV0c2hlbGwsIFlNT0RFTSBtZWFucworICAgICAgICAgICAgQkFUQ0guCisKKyAgICBZTU9ERU0tZyBSZWZlcnMgdG8gdGhlIHN0cmVhbWluZyBZTU9ERU0gdmFyaWF0aW9uIGRlc2NyaWJlZCBiZWxvdy4KKworICAgIFRydWUgWU1PREVNKFRNKSBJbiBhbiBhdHRlbXB0IHRvIHNvcnQgb3V0IHRoZSBZTU9ERU0gVG93ZXIgb2YgQmFiZWwsIE9tZW4KKyAgICAgICAgICAgIFRlY2hub2xvZ3kgaGFzIHRyYWRlbWFya2VkIHRoZSB0ZXJtIFRydWUgWU1PREVNKFRNKSB0byByZXByZXNlbnQKKyAgICAgICAgICAgIHRoZSBjb21wbGV0ZSBZTU9ERU0gcHJvdG9jb2wgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQsIGluY2x1ZGluZworICAgICAgICAgICAgcGF0aG5hbWUsIGxlbmd0aCwgYW5kIG1vZGlmaWNhdGlvbiBkYXRlIHRyYW5zbWl0dGVkIGluIGJsb2NrIDAuCisgICAgICAgICAgICBQbGVhc2UgY29udGFjdCBPbWVuIFRlY2hub2xvZ3kgYWJvdXQgY2VydGlmeWluZyBwcm9ncmFtcyBmb3IgVHJ1ZQorICAgICAgICAgICAgWU1PREVNKFRNKSBjb21wbGlhbmNlLgorCisgICAgWk1PREVNICB1c2VzIGZhbWlsaWFyIFhNT0RFTS9DUkMgYW5kIFlNT0RFTSB0ZWNobm9sb2d5IGluIGEgbmV3IHByb3RvY29sCisgICAgICAgICAgICB0aGF0IHByb3ZpZGVzIHJlbGlhYmlsaXR5LCB0aHJvdWdocHV0LCBmaWxlIG1hbmFnZW1lbnQsIGFuZCB1c2VyCisgICAgICAgICAgICBhbWVuaXRpZXMgYXBwcm9wcmlhdGUgdG8gY29udGVtcG9yYXJ5IGRhdGEgY29tbXVuaWNhdGlvbnMuCisKKyAgICBaT08gICAgIExpa2UgQVJDLCBaT08gaXMgYSBwcm9ncmFtIHRoYXQgY29tcHJlc3NlcyBvbmUgb3IgbW9yZSBmaWxlcyBpbnRvCisgICAgICAgICAgICBhICJ6b28gYXJjaGl2ZSIuICBaT08gc3VwcG9ydHMgbWFueSBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMKKyAgICAgICAgICAgIGluY2x1ZGluZyBVbml4IGFuZCBWTVMuCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIENoYXB0ZXIgMQorCisKKworCisKKworCisgICAgWC9ZTU9ERU0gUHJvdG9jb2wgUmVmZXJlbmNlICAgIEp1bmUgMTggMTk4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKworCisKKyAgICAyLiAgWU1PREVNIE1JTklNVU0gUkVRVUlSRU1FTlRTCisKKyAgICBBbGwgcHJvZ3JhbXMgY2xhaW1pbmcgdG8gc3VwcG9ydCBZTU9ERU0gbXVzdCBtZWV0IHRoZSBmb2xsb3dpbmcgbWluaW11bQorICAgIHJlcXVpcmVtZW50czoKKworICAgICAgICsgVGhlIHNlbmRpbmcgcHJvZ3JhbSBzaGFsbCBzZW5kIHRoZSBwYXRobmFtZSAoZmlsZSBuYW1lKSBpbiBibG9jayAwLgorCisgICAgICAgKyBUaGUgcGF0aG5hbWUgc2hhbGwgYmUgYSBudWxsIHRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nIGFzIGRlc2NyaWJlZAorICAgICAgICAgYmVsb3cuCisKKyAgICAgICAgIEZvciB0aG9zZSB3aG8gYXJlIHRvbyBsYXp5IHRvIHJlYWQgdGhlIGVudGlyZSBkb2N1bWVudDoKKworICAgICAgICAgICAgKyBVbmxlc3Mgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZCwgb25seSB0aGUgZmlsZSBuYW1lIHBvcnRpb24gaXMKKyAgICAgICAgICAgICAgc2VudC4KKworICAgICAgICAgICAgKyBObyBkcml2ZSBsZXR0ZXIgaXMgc2VudC4KKworICAgICAgICAgICAgKyBTeXN0ZW1zIHRoYXQgZG8gbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gdXBwZXIgYW5kIGxvd2VyIGNhc2UKKyAgICAgICAgICAgICAgbGV0dGVycyBpbiBmaWxlbmFtZXMgc2hhbGwgc2VuZCB0aGUgcGF0aG5hbWUgaW4gbG93ZXIgY2FzZSBvbmx5LgorCisKKyAgICAgICArIFRoZSByZWNlaXZpbmcgcHJvZ3JhbSBzaGFsbCB1c2UgdGhpcyBwYXRobmFtZSBmb3IgdGhlIHJlY2VpdmVkIGZpbGUKKyAgICAgICAgIG5hbWUsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4uCisKKyAgICAgICArIFdoZW4gdGhlIHJlY2VpdmluZyBwcm9ncmFtIHJlY2VpdmVzIHRoaXMgYmxvY2sgYW5kIHN1Y2Nlc3NmdWxseQorICAgICAgICAgb3BlbmVkIHRoZSBvdXRwdXQgZmlsZSwgaXQgc2hhbGwgYWNrbm93bGVkZ2UgdGhpcyBibG9jayB3aXRoIGFuIEFDSworICAgICAgICAgY2hhcmFjdGVyIGFuZCB0aGVuIHByb2NlZWQgd2l0aCBhIG5vcm1hbCBYTU9ERU0gZmlsZSB0cmFuc2ZlcgorICAgICAgICAgYmVnaW5uaW5nIHdpdGggYSAiQyIgb3IgTkFLIHRyYW5tc2l0dGVkIGJ5IHRoZSByZWNlaXZlci4KKworICAgICAgICsgVGhlIHNlbmRpbmcgcHJvZ3JhbSBzaGFsbCB1c2UgQ1JDLTE2IGluIHJlc3BvbnNlIHRvIGEgIkMiIHBhdGhuYW1lCisgICAgICAgICBuYWssIG90aGVyd2lzZSB1c2UgOCBiaXQgY2hlY2tzdW0uCisKKyAgICAgICArIFRoZSByZWNlaXZpbmcgcHJvZ3JhbSBtdXN0IGFjY2VwdCBhbnkgbWl4dHVyZSBvZiAxMjggYW5kIDEwMjQgYnl0ZQorICAgICAgICAgYmxvY2tzIHdpdGhpbiBlYWNoIGZpbGUgaXQgcmVjZWl2ZXMuICBTZW5kaW5nIHByb2dyYW1zIG1heQorICAgICAgICAgYXJiaXRyYXJpbHkgc3dpdGNoIGJldHdlZW4gMTAyNCBhbmQgMTI4IGJ5dGUgYmxvY2tzLgorCisgICAgICAgKyBUaGUgc2VuZGluZyBwcm9ncmFtIG11c3Qgbm90IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIGFuIHVuYWNrbm93bGVkZ2VkCisgICAgICAgICBibG9jay4KKworICAgICAgICsgQXQgdGhlIGVuZCBvZiBlYWNoIGZpbGUsIHRoZSBzZW5kaW5nIHByb2dyYW0gc2hhbGwgc2VuZCBFT1QgdXAgdG8gdGVuCisgICAgICAgICB0aW1lcyB1bnRpbCBpdCByZWNlaXZlcyBhbiBBQ0sgY2hhcmFjdGVyLiAgKFRoaXMgaXMgcGFydCBvZiB0aGUKKyAgICAgICAgIFhNT0RFTSBzcGVjLikKKworICAgICAgICsgVGhlIGVuZCBvZiBhIHRyYW5zZmVyIHNlc3Npb24gc2hhbGwgYmUgc2lnbmlmaWVkIGJ5IGEgbnVsbCAoZW1wdHkpCisgICAgICAgICBwYXRobmFtZSwgdGhpcyBwYXRobmFtZSBibG9jayBzaGFsbCBiZSBhY2tub3dsZWRnZWQgdGhlIHNhbWUgYXMgb3RoZXIKKyAgICAgICAgIHBhdGhuYW1lIGJsb2Nrcy4KKworICAgIFByb2dyYW1zIG5vdCBtZWV0aW5nIGFsbCBvZiB0aGVzZSByZXF1aXJlbWVudHMgYXJlIG5vdCBZTU9ERU0gY29tcGF0aWJsZSwKKyAgICBhbmQgc2hhbGwgbm90IGJlIGRlc2NyaWJlZCBhcyBzdXBwb3J0aW5nIFlNT0RFTS4KKworICAgIE1lZXRpbmcgdGhlc2UgTUlOSU1VTSByZXF1aXJlbWVudHMgZG9lcyBub3QgZ3VhcmFudGVlIHJlbGlhYmxlIGZpbGUKKworCisKKyAgICBDaGFwdGVyIDIKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisKKworCisgICAgdHJhbnNmZXJzIHVuZGVyIHN0cmVzcy4gIFBhcnRpY3VsYXIgYXR0ZW50aW9uIGlzIGNhbGxlZCB0byBYTU9ERU0ncyBzaW5nbGUKKyAgICBjaGFyYWN0ZXIgc3VwZXJ2aXNvcnkgbWVzc2FnZXMgdGhhdCBhcmUgZWFzaWx5IGNvcnJ1cHRlZCBieSB0cmFuc21pc3Npb24KKyAgICBlcnJvcnMuCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgQ2hhcHRlciAyCisKKworCisKKworCisKKyAgICBYL1lNT0RFTSBQcm90b2NvbCBSZWZlcmVuY2UgICAgSnVuZSAxOCAxOTg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorCisKKworICAgIDMuICBXSFkgWU1PREVNPworCisgICAgU2luY2UgaXRzIGRldmVsb3BtZW50IGhhbGYgYSBkZWNhZGUgYWdvLCB0aGUgV2FyZCBDaHJpc3RlbnNlbiBtb2RlbQorICAgIHByb3RvY29sIGhhcyBlbmFibGVkIGEgd2lkZSB2YXJpZXR5IG9mIGNvbXB1dGVyIHN5c3RlbXMgdG8gaW50ZXJjaGFuZ2UKKyAgICBkYXRhLiAgVGhlcmUgaXMgaGFyZGx5IGEgY29tbXVuaWNhdGlvbnMgcHJvZ3JhbSB0aGF0IGRvZXNuJ3QgYXQgbGVhc3QKKyAgICBjbGFpbSB0byBzdXBwb3J0IHRoaXMgcHJvdG9jb2wuCisKKyAgICBBZHZhbmNlcyBpbiBjb21wdXRpbmcsIG1vZGVtcyBhbmQgbmV0d29ya2luZyBoYXZlIHJldmVhbGVkIGEgbnVtYmVyIG9mCisgICAgd2Vha25lc3NlcyBpbiB0aGUgb3JpZ2luYWwgcHJvdG9jb2w6CisKKyAgICAgICArIFRoZSBzaG9ydCBibG9jayBsZW5ndGggY2F1c2VkIHRocm91Z2hwdXQgdG8gc3VmZmVyIHdoZW4gdXNlZCB3aXRoCisgICAgICAgICB0aW1lc2hhcmluZyBzeXN0ZW1zLCBwYWNrZXQgc3dpdGNoZWQgbmV0d29ya3MsIHNhdGVsbGl0ZSBjaXJjdWl0cywKKyAgICAgICAgIGFuZCBidWZmZXJlZCAoZXJyb3IgY29ycmVjdGluZykgbW9kZW1zLgorCisgICAgICAgKyBUaGUgOCBiaXQgYXJpdGhtZXRpYyBjaGVja3N1bSBhbmQgb3RoZXIgYXNwZWN0cyBhbGxvd2VkIGxpbmUKKyAgICAgICAgIGltcGFpcm1lbnRzIHRvIGludGVyZmVyZSB3aXRoIGRlcGVuZGFibGUsIGFjY3VyYXRlIHRyYW5zZmVycy4KKworICAgICAgICsgT25seSBvbmUgZmlsZSBjb3VsZCBiZSBzZW50IHBlciBjb21tYW5kLiAgVGhlIGZpbGUgbmFtZSBoYWQgdG8gYmUKKyAgICAgICAgIGdpdmVuIHR3aWNlLCBmaXJzdCB0byB0aGUgc2VuZGluZyBwcm9ncmFtIGFuZCB0aGVuIGFnYWluIHRvIHRoZQorICAgICAgICAgcmVjZWl2aW5nIHByb2dyYW0uCisKKyAgICAgICArIFRoZSB0cmFuc21pdHRlZCBmaWxlIGNvdWxkIGFjY3VtdWxhdGUgYXMgbWFueSBhcyAxMjcgZXh0cmFuZW91cworICAgICAgICAgYnl0ZXMuCisKKyAgICAgICArIFRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgZmlsZSB3YXMgbG9zdC4KKworICAgIEEgbnVtYmVyIG9mIG90aGVyIHByb3RvY29scyBoYXZlIGJlZW4gZGV2ZWxvcGVkIG92ZXIgdGhlIHllYXJzLCBidXQgbm9uZQorICAgIGhhdmUgZGlzcGxhY2VkIFhNT0RFTSB0byBkYXRlOgorCisgICAgICAgKyBMYWNrIG9mIHB1YmxpYyBkb21haW4gZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZSBwcm9ncmFtcyBoYXZlIGtlcHQKKyAgICAgICAgIHByb3ByaWV0YXJ5IHByb3RvY29scyBzdWNoIGFzIEJsYXN0LCBSZWxheSwgYW5kIG90aGVycyB0aWdodGx5IGJvdW5kCisgICAgICAgICB0byB0aGUgZm9ydHVuZXMgb2YgdGhlaXIgc3VwcGxpZXJzLgorCisgICAgICAgKyBDb21wbGV4aXR5IGRpc2NvdXJhZ2VzIHRoZSB3aWRlc3ByZWFkIGFwcGxpY2F0aW9uIG9mIEJJU1lOQywgU0RMQywKKyAgICAgICAgIEhETEMsIFguMjUsIGFuZCBYLlBDIHByb3RvY29scy4KKworICAgICAgICsgUGVyZm9ybWFuY2UgY29tcHJvbWlzZXMgYW5kIGNvbXBsZXhpdHkgaGF2ZSBsaW1pdGVkIHRoZSBwb3B1bGFyaXR5IG9mCisgICAgICAgICB0aGUgS2VybWl0IHByb3RvY29sLCB3aGljaCB3YXMgZGV2ZWxvcGVkIHRvIGFsbG93IGZpbGUgdHJhbnNmZXJzIGluCisgICAgICAgICBlbnZpcm9ubWVudHMgaG9zdGlsZSB0byBYTU9ERU0uCisKKyAgICBUaGUgWE1PREVNIHByb3RvY29sIGV4dGVuc2lvbnMgYW5kIFlNT0RFTSBCYXRjaCBhZGRyZXNzIHNvbWUgb2YgdGhlc2UKKyAgICB3ZWFrbmVzc2VzIHdoaWxlIG1haW50YWluaW5nIG1vc3Qgb2YgWE1PREVNJ3Mgc2ltcGxpY2l0eS4KKworICAgIFlNT0RFTSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHB1YmxpYyBkb21haW4gcHJvZ3JhbXMgWUFNIChDUC9NKSwKKyAgICBZQU0oQ1AvTS04NiksIFlBTShDQ1BNLTg2KSwgSU1QIChDUC9NKSwgS01EIChDUC9NKSwgcnovc3ogKFVuaXgsIFhlbml4LAorICAgIFZNUywgQmVya2VsZXkgVW5peCwgVmVuaXgsIFhlbml4LCBDb2hlcmVudCwgSURSSVMsIFJlZ3VsdXMpLiAgQ29tbWVyY2lhbAorICAgIGltcGxlbWVudGF0aW9ucyBpbmNsdWRlIE1JUlJPUiwgYW5kIFByb2Zlc3Npb25hbC1ZQU0uWzFdIENvbW11bmljYXRpb25zCisKKworCisKKworCisKKyAgICBDaGFwdGVyIDMKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKworCisgICAgcHJvZ3JhbXMgc3VwcG9ydGluZyB0aGVzZSBleHRlbnNpb25zIGhhdmUgYmVlbiBpbiB1c2Ugc2luY2UgMTk4MS4KKworICAgIFRoZSAxayBibG9jayBsZW5ndGggKFhNT0RFTS0xaykgZGVzY3JpYmVkIGJlbG93IG1heSBiZSB1c2VkIGluIGNvbmp1bmN0aW9uCisgICAgd2l0aCBZTU9ERU0gQmF0Y2ggUHJvdG9jb2wsIG9yIHdpdGggc2luZ2xlIGZpbGUgdHJhbnNmZXJzIGlkZW50aWNhbCB0byB0aGUKKyAgICBYTU9ERU0vQ1JDIHByb3RvY29sIGV4Y2VwdCBmb3IgbWluaW1hbCBjaGFuZ2VzIHRvIHN1cHBvcnQgMWsgYmxvY2tzLgorCisgICAgQW5vdGhlciBleHRlbnNpb24gaXMgdGhlIFlNT0RFTS1nIHByb3RvY29sLiAgWU1PREVNLWcgcHJvdmlkZXMgYmF0Y2gKKyAgICB0cmFuc2ZlcnMgd2l0aCBtYXhpbXVtIHRocm91Z2hwdXQgd2hlbiB1c2VkIHdpdGggZW5kIHRvIGVuZCBlcnJvcgorICAgIGNvcnJlY3RpbmcgbWVkaWEsIHN1Y2ggYXMgWC5QQyBhbmQgZXJyb3IgY29ycmVjdGluZyBtb2RlbXMsIGluY2x1ZGluZyA5NjAwCisgICAgYnBzIHVuaXRzIGJ5IFRlbGVCaXQsIFUuUy5Sb2JvdGljcywgSGF5ZXMsIEVsZWN0cm9uaWMgVmF1bHRzLCBEYXRhIFJhY2UsCisgICAgYW5kIG90aGVycy4KKworICAgIFRvIGNvbXBsZXRlIHRoaXMgdG9tZSwgZWRpdGVkIHZlcnNpb25zIG9mIFdhcmQgQ2hyaXN0ZW5zZW4ncyBvcmlnaW5hbAorICAgIHByb3RvY29sIGRvY3VtZW50IGFuZCBKb2huIEJ5cm5zJ3MgQ1JDLTE2IGRvY3VtZW50IGFyZSBpbmNsdWRlZCBmb3IKKyAgICByZWZlcmVuY2UuCisKKyAgICBSZWZlcmVuY2VzIHRvIHRoZSBNT0RFTSBvciBNT0RFTTcgcHJvdG9jb2wgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gWE1PREVNIHRvCisgICAgYWNjb21tb2RhdGUgdGhlIHZlcm5hY3VsYXIuICBJbiBBdXN0cmFsaWEsIGl0IGlzIHByb3Blcmx5IGNhbGxlZCB0aGUKKyAgICBDaHJpc3RlbnNlbiBQcm90b2NvbC4KKworCisgICAgMy4xICBTb21lIE1lc3NhZ2VzIGZyb20gdGhlIFBpb25lZXIKKworICAgICM6IDEzMDk0MCBTMC9Db21tdW5pY2F0aW9ucyAyNS1BcHItODUgIDE4OjM4OjQ3CisgICAgU2I6IG15IHByb3RvY29sCisgICAgRm06IFdhcmQgQ2hyaXN0ZW5zZW4gNzY3MDMsMzAyIFsyXQorICAgIFRvOiBhbGwKKworICAgIEJlIGF3YXJlIHRoZSBhcnRpY2xlWzNdIERJRCBxdW90ZSBtZSBjb3JyZWN0bHkgaW4gdGVybXMgb2YgdGhlIHBocmFzZXMKKyAgICBsaWtlICJub3Qgcm9idXN0IiwgZXRjLgorCisgICAgSXQgd2FzIGEgcXVpY2sgaGFjayBJIHRocmV3IHRvZ2V0aGVyLCB2ZXJ5IHVucGxhbm5lZCAobGlrZSBldmVyeXRoaW5nIEkKKyAgICBkbyksIHRvIHNhdGlzZnkgYSBwZXJzb25hbCBuZWVkIHRvIGNvbW11bmljYXRlIHdpdGggInNvbWUgb3RoZXIiIHBlb3BsZS4KKworICAgIE9OTFkgdGhlIGZhY3QgdGhhdCBpdCB3YXMgZG9uZSBpbiA4Lzc3LCBhbmQgdGhhdCBJIHB1dCBpdCBpbiB0aGUgcHVibGljCisgICAgZG9tYWluIGltbWVkaWF0ZWx5LCBtYWRlIGl0IGJlY29tZSB0aGUgc3RhbmRhcmQgdGhhdCBpdCBpcy4KKworCisKKworCisKKworICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAgMS4gQXZhaWxhYmxlIGZvciBJQk0gUEMsWFQsQVQsIFVuaXggYW5kIFhlbml4CisKKyAgICAgMi4gRWRpdGVkIGZvciB0eXBlc2V0dGluZyBhcHBlYXJhbmNlCisKKyAgICAgMy4gSW5mb3dvcmxkIEFwcmlsIDI5IHAuIDE2CisKKworCisKKyAgICBDaGFwdGVyIDMKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisKKworCisgICAgSSB0aGluayBpdHMgdGltZSBmb3IgbWUgdG8KKworICAgICgxKSBkb2N1bWVudCBpdDsgKHBlb3BsZSBjYWxsIG1lIGFuZCBzYXkgIm15IHByb2R1Y3QgaXMgZ29pbmcgdG8gaW5jbHVkZQorICAgIGl0IC0gd2hhdCBjYW4gSSAncmVmZXJlbmNlJyIsIG9yICJJJ20gd3JpdGluZyBhIHBhcGVyIG9uIGl0LCB3aGF0IGRvIEkgcHV0CisgICAgaW4gdGhlIGJpYmxpb2dyYXBoeSIpIGFuZAorCisgICAgKDIpIHByb3Bvc2UgYW4gImluY3JlbWVudGFsIGV4dGVuc2lvbiIgdG8gaXQsIHdoaWNoIG1pZ2h0IHRha2UgImV4YWN0bHkiCisgICAgdGhlIGZvcm0gb2YgQ2h1Y2sgRm9yc2JlcmcncyBZQU0gcHJvdG9jb2wuICBIZSB3cm90ZSBZQU0gaW4gQyBmb3IgQ1AvTSBhbmQKKyAgICBwdXQgaXQgaW4gdGhlIHB1YmxpYyBkb21haW4sIGFuZCB3cm90ZSBhIGJhdGNoIHByb3RvY29sIGZvciBVbml4WzRdIGNhbGxlZAorICAgIHJiIGFuZCBzYiAocmVjZWl2ZSBiYXRjaCwgc2VuZCBiYXRjaCksIHdoaWNoIHdhcyBiYXNpY2FsbHkgWE1PREVNIHdpdGgKKyAgICAgICAoYSkgYSByZWNvcmQgMCBjb250YWluaW5nIGZpbGVuYW1lIGRhdGUgdGltZSBhbmQgc2l6ZQorICAgICAgIChiKSBhIDFLIGJsb2NrIHNpemUgb3B0aW9uCisgICAgICAgKGMpIENSQy0xNi4KKworICAgIEhlIGRpZCBzb21lIGNsZXZlciBwcm9ncmFtbWluZyB0byBkZXRlY3QgZmFsc2UgQUNLIG9yIEVPVCwgYnV0IGJhc2ljYWxseQorICAgIGxlZnQgdGhlbSB0aGUgc2FtZS4KKworICAgIFBlb3BsZSB3aG8gc3VnZ2VzdCBJIG1ha2UgU0lHTklGSUNBTlQgY2hhbmdlcyB0byB0aGUgcHJvdG9jb2wsIHN1Y2ggYXMKKyAgICAiZnVsbCBkdXBsZXgiLCAibXVsdGlwbGUgb3V0c3RhbmRpbmcgYmxvY2tzIiwgIm11bHRpcGxlIGRlc3RpbmF0aW9ucyIsIGV0YworICAgIGV0YyBkb24ndCB1bmRlcnN0YW5kIHRoYXQgdGhlIGluY3JlZGlibGUgc2ltcGxpY2l0eSBvZiB0aGUgcHJvdG9jb2wgaXMgb25lCisgICAgb2YgdGhlIHJlYXNvbnMgaXQgc3Vydml2ZWQgdG8gdGhpcyBkYXkgaW4gYXMgbWFueSBtYWNoaW5lcyBhbmQgcHJvZ3JhbXMgYXMKKyAgICBpdCBtYXkgYmUgZm91bmQgaW4hCisKKyAgICBDb25zaWRlciB0aGUgUEMtTkVUIGdyb3VwIGJhY2sgaW4gJzc3IG9yIHNvIC0gZG9jdW1lbnRpbmcgdG8gYmVhdCB0aGUgYmFuZAorICAgIC0gVEhFWSBoYWQgYSBwcm90b2NvbCwgYnV0IGl0IHdhcyAiZXh0cmVtZWx5IGNvbXBsZXgiLCBiZWNhdXNlIGl0IHRyaWVkIHRvCisgICAgYmUgImFsbCB0aGluZ3MgdG8gYWxsIHBlb3BsZSIgLSBpLmUuIHNlbmQgYmluYXJ5IGZpbGVzIG9uIGEgNy1iaXQgc3lzdGVtLAorICAgIGV0Yy4gIEkgd2FzIG5vdCB0aGF0ICJiZW5ldm9sZW50Ii4gSSAoZW1waGFzaXplID4gSSA8ICkgaGFkIGFuIDgtYml0IFVBUlQsCisgICAgc28gIm15IHByb3RvY29sIHdhcyBhbiA4LWJpdCBwcm90b2NvbCIsIGFuZCBJIHdvdWxkIGp1c3Qgc2F5ICJzb3JyeSIgdG8KKyAgICBwZW9wbGUgd2hvIHdlcmUgaGVsZCBiYWNrIGJ5IDctYml0IGxpbWl0YXRpb25zLiAgLi4uCisKKyAgICBCbG9jayBzaXplOiBDaHVjayBGb3JzYmVyZyBjcmVhdGVkIGFuIGV4dGVuc2lvbiBvZiBteSBwcm90b2NvbCwgY2FsbGVkCisgICAgWUFNLCB3aGljaCBpcyBhbHNvIHN1cHBvcnRlZCB2aWEgaGlzIHB1YmxpYyBkb21haW4gcHJvZ3JhbXMgZm9yIFVOSVgKKyAgICBjYWxsZWQgcmIgYW5kIHNiIC0gcmVjZWl2ZSBiYXRjaCBhbmQgc2VuZCBiYXRjaC4gIFRoZXkgY2xldmVybHkgc2VuZCBhCisgICAgImJsb2NrIDAiIHdoaWNoIGNvbnRhaW5zIHRoZSBmaWxlbmFtZSwgZGF0ZSwgdGltZSwgYW5kIHNpemUuCisgICAgVW5mb3J0dW5hdGVseSwgaXRzIFVOSVggc3R5bGUsIGFuZCBpcyBhIGJpdCB3ZWlyZFs1XSAtIG9jdGFsIG51bWJlcnMsIGV0Yy4KKyAgICBCVVQsIGl0IGlzIGEgbmljZSB3YXkgdG8gb3ZlcmNvbWUgdGhlIGtsdWRneSAiZWNobyB0aGUgY2hhcnMgb2YgdGhlIG5hbWUiCisgICAgaW50cm9kdWNlZCB3aXRoIE1PREVNNy4gIEZ1cnRoZXIsIGNodWNrIHVzZXMgQ1JDLTE2IGFuZCBvcHRpb25hbCAxSworICAgIGJsb2Nrcy4gIFRodXMgdGhlIHJlY29yZCAwLCAxSywgYW5kIENSQywgbWFrZSBpdCBhICJwcmV0dHkgc2xpY2sgbmV3CisgICAgcHJvdG9jb2wiIHdoaWNoIGlzIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIG15IG93bi4KKworICAgIEFsc28sIHRoZXJlIGlzIGEgY2F0Y2h5IG5hbWUgLSBZTU9ERU0uICBUaGF0IG1lYW5zIHRvIHNvbWUgdGhhdCBpdCBpcyB0aGUKKyAgICAibmV4dCB0aGluZyBhZnRlciBYTU9ERU0iLCBhbmQgdG8gb3RoZXJzIHRoYXQgaXQgaXMgdGhlIFkoYW0pTU9ERU0KKworCisgICAgX19fX19fX19fXworCisgICAgIDQuIFZBWC9WTVMgdmVyc2lvbnMgb2YgdGhlc2UgcHJvZ3JhbXMgYXJlIGFsc28gYXZhaWxhYmxlLgorCisgICAgIDUuIFRoZSBmaWxlIGxlbmd0aCwgdGltZSwgYW5kIGZpbGUgbW9kZSBhcmUgb3B0aW9uYWwuICBUaGUgcGF0aG5hbWUgYW5kCisgICAgICAgIGZpbGUgbGVuZ3RoIG1heSBiZSBzZW50IGFsb25lIGlmIGRlc2lyZWQuCisKKworCisKKyAgICBDaGFwdGVyIDMKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5CisKKworCisgICAgcHJvdG9jb2wuICBJIGRvbid0IHdhbnQgdG8gZW1waGFzaXplIHRoYXQgdG9vIG11Y2ggLSBvdXQgb2YgZmVhciB0aGF0CisgICAgb3RoZXIgbWZncnMgbWlnaHQgdGhpbmsgaXQgaXMgYSAiY29tcGV0aXRpdmUiIHByb3RvY29sLCByYXRoZXIgdGhhbiBhbgorICAgICJ1bmFmZmlsaWF0ZWQiIHByb3RvY29sLiAgQ2h1Y2sgaXMgY3VycmVudGx5IHNlbGxpbmcgYSBtdWNoLWVuaGFuY2VkCisgICAgdmVyc2lvbiBvZiBoaXMgQ1AvTS04MCBDIHByb2dyYW0gWUFNLCBjYWxsaW5nIGl0IFByb2Zlc3Npb25hbCBZYW0sIGFuZCBpdHMKKyAgICBmb3IgdGhlIFBDIC0gSSdtIHVzaW5nIGl0IHJpZ2h0IG5vdy4gIFZFUlkgc2xpY2shICAzMksgY2FwdHVyZSBidWZmZXIsCisgICAgc2NyaXB0LCBzY3JvbGxpbmcsIHByZXZpb3VzbHkgY2FwdHVyZWQgdGV4dCBzZWFyY2gsIHBsdXMgYnVpbHQtaW4gY29tbWFuZHMKKyAgICBmb3IganVzdCBhYm91dCBldmVyeXRoaW5nIC0gZGlyZWN0b3J5IChzb3J0ZWQgZXZlcnkgd2hpY2ggd2F5KSwgWE1PREVNLAorICAgIFlNT0RFTSwgS0VSTUlULCBhbmQgQVNDSUkgZmlsZSB1cGxvYWQvZG93bmxvYWQsIGV0Yy4gIFlvdSBjYW4gcHJvZ3JhbSBpdAorICAgIHRvICJiZWhhdmUiIHdpdGggbW9zdCBhbnkgc3lzdGVtIC0gZm9yIGV4YW1wbGUgd2hlbiB0cnlpbmcgYSBudW1iZXIgZm9yCisgICAgQ0lTIGl0IGRldGVjdHMgdGhlICJidXN5IiBzdHJpbmcgYmFjayBmcm9tIHRoZSBtb2RlbSBhbmQgc3Vic3RpdHV0ZXMgYQorICAgIGRpZmYgcGhvbmUgIyBpbnRvIHRoZSBkaWFsaW5nIHN0cmluZyBhbmQgYnJhbmNoZXMgYmFjayB0byB0cnkgaXQuCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBDaGFwdGVyIDMKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisKKworCisgICAgNC4gIFhNT0RFTSBQUk9UT0NPTCBFTkhBTkNFTUVOVFMKKworICAgIFRoaXMgY2hhcHRlciBkaXNjdXNzZXMgdGhlIHByb3RvY29sIGV4dGVuc2lvbnMgdG8gV2FyZCBDaHJpc3RlbnNlbidzIDE5ODIKKyAgICBYTU9ERU0gcHJvdG9jb2wgZGVzY3JpcHRpb24gZG9jdW1lbnQuCisKKyAgICBUaGUgb3JpZ2luYWwgZG9jdW1lbnQgcmVjb21tZW5kcyB0aGUgdXNlciBiZSBhc2tlZCB3aGV0aGVyIHRvIGNvbnRpbnVlCisgICAgdHJ5aW5nIG9yIGFib3J0IGFmdGVyIDEwIHJldHJpZXMuICBNb3N0IHByb2dyYW1zIG5vIGxvbmdlciBhc2sgdGhlCisgICAgb3BlcmF0b3Igd2hldGhlciBoZSB3aXNoZXMgdG8ga2VlcCByZXRyeWluZy4gIFZpcnR1YWxseSBhbGwgY29ycmVjdGFibGUKKyAgICBlcnJvcnMgYXJlIGNvcnJlY3RlZCB3aXRoaW4gdGhlIGZpcnN0IGZldyByZXRyYW5zbWlzc2lvbnMuICBJZiB0aGUgbGluZSBpcworICAgIHNvIGJhZCB0aGF0IHRlbiBhdHRlbXB0cyBhcmUgaW5zdWZmaWNpZW50LCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRhbmdlcgorICAgIG9mIHVuZGV0ZWN0ZWQgZXJyb3JzLiAgSWYgdGhlIGNvbm5lY3Rpb24gaXMgdGhhdCBiYWQsIGl0J3MgYmV0dGVyIHRvCisgICAgcmVkaWFsIGZvciBhIGJldHRlciBjb25uZWN0aW9uLCBvciBtYWlsIGEgZmxvcHB5IGRpc2suCisKKworICAgIDQuMSAgR3JhY2VmdWwgQWJvcnQKKworICAgIFRoZSBZQU0gYW5kIFByb2Zlc3Npb25hbC1ZQU0gWC9ZTU9ERU0gcm91dGluZXMgcmVjb2duaXplIGEgc2VxdWVuY2Ugb2YgdHdvCisgICAgY29uc2VjdXRpdmUgQ0FOIChIZXggMTgpIGNoYXJhY3RlcnMgd2l0aG91dCBtb2RlbSBlcnJvcnMgKG92ZXJydW4sCisgICAgZnJhbWluZywgZXRjLikgYXMgYSB0cmFuc2ZlciBhYm9ydCBjb21tYW5kLiAgVGhpcyBzZXF1ZW5jZSBpcyByZWNvZ25pemVkCisgICAgd2hlbiBpcyB3YWl0aW5nIGZvciB0aGUgYmVnaW5uaW5nIG9mIGEgYmxvY2sgb3IgZm9yIGFuIGFja25vd2xlZGdlbWVudCB0bworICAgIGEgYmxvY2sgdGhhdCBoYXMgYmVlbiBzZW50LiAgVGhlIGNoZWNrIGZvciB0d28gY29uc2VjdXRpdmUgQ0FOIGNoYXJhY3RlcnMKKyAgICByZWR1Y2VzIHRoZSBudW1iZXIgb2YgdHJhbnNmZXJzIGFib3J0ZWQgYnkgbGluZSBoaXRzLiAgWUFNIHNlbmRzIGVpZ2h0IENBTgorICAgIGNoYXJhY3RlcnMgd2hlbiBpdCBhYm9ydHMgYW4gWE1PREVNLCBZTU9ERU0sIG9yIFpNT0RFTSBwcm90b2NvbCBmaWxlCisgICAgdHJhbnNmZXIuICBQcm8tWUFNIHRoZW4gc2VuZHMgZWlnaHQgYmFja3NwYWNlcyB0byBkZWxldGUgdGhlIENBTgorICAgIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVtb3RlJ3Mga2V5Ym9hcmQgaW5wdXQgYnVmZmVyLCBpbiBjYXNlIHRoZSByZW1vdGUgaGFkCisgICAgYWxyZWFkeSBhYm9ydGVkIHRoZSB0cmFuc2ZlciBhbmQgd2FzIGF3YWl0aW5nIGEga2V5Ym9hcmRlZCBjb21tYW5kLgorCisKKyAgICA0LjIgIENSQy0xNiBPcHRpb24KKworICAgIFRoZSBYTU9ERU0gcHJvdG9jb2wgdXNlcyBhbiBvcHRpb25hbCB0d28gY2hhcmFjdGVyIENSQy0xNiBpbnN0ZWFkIG9mIHRoZQorICAgIG9uZSBjaGFyYWN0ZXIgYXJpdGhtZXRpYyBjaGVja3N1bSB1c2VkIGJ5IHRoZSBvcmlnaW5hbCBwcm90b2NvbCBhbmQgYnkKKyAgICBtb3N0IGNvbW1lcmNpYWwgaW1wbGVtZW50YXRpb25zLiAgQ1JDLTE2IGd1YXJhbnRlZXMgZGV0ZWN0aW9uIG9mIGFsbAorICAgIHNpbmdsZSBhbmQgZG91YmxlIGJpdCBlcnJvcnMsICBhbGwgZXJyb3JzIHdpdGggYW4gb2RkIG51bWJlciBvZiBlcnJvcgorICAgIGJpdHMsIGFsbCBidXJzdCBlcnJvcnMgb2YgbGVuZ3RoIDE2IG9yIGxlc3MsIDk5Ljk5NjklIG9mIGFsbCAxNy1iaXQgZXJyb3IKKyAgICBidXJzdHMsIGFuZCA5OS45OTg0IHBlciBjZW50IG9mIGFsbCBwb3NzaWJsZSBsb25nZXIgZXJyb3IgYnVyc3RzLiAgQnkKKyAgICBjb250cmFzdCwgYSBkb3VibGUgYml0IGVycm9yLCBvciBhIGJ1cnN0IGVycm9yIG9mIDkgYml0cyBvciBtb3JlIGNhbiBzbmVhaworICAgIHBhc3QgdGhlIFhNT0RFTSBwcm90b2NvbCBhcml0aG1ldGljIGNoZWNrc3VtLgorCisgICAgVGhlIFhNT0RFTS9DUkMgcHJvdG9jb2wgaXMgc2ltaWxhciB0byB0aGUgWE1PREVNIHByb3RvY29sLCBleGNlcHQgdGhhdCB0aGUKKyAgICByZWNlaXZlciBzcGVjaWZpZXMgQ1JDLTE2IGJ5IHNlbmRpbmcgQyAoSGV4IDQzKSBpbnN0ZWFkIG9mIE5BSyB3aGVuCisgICAgcmVxdWVzdGluZyB0aGUgRklSU1QgYmxvY2suICBBIHR3byBieXRlIENSQyBpcyBzZW50IGluIHBsYWNlIG9mIHRoZSBvbmUKKyAgICBieXRlIGFyaXRobWV0aWMgY2hlY2tzdW0uCisKKyAgICBZQU0ncyBjIG9wdGlvbiB0byB0aGUgciBjb21tYW5kIGVuYWJsZXMgQ1JDLTE2IGluIHNpbmdsZSBmaWxlIHJlY2VwdGlvbiwKKyAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgTU9ERU03IHNlcmllcworICAgIHByb2dyYW1zLiAgVGhpcyByZW1haW5zIHRoZSBkZWZhdWx0IGJlY2F1c2UgbWFueSBjb21tZXJjaWFsIGNvbW11bmljYXRpb25zCisgICAgcHJvZ3JhbXMgYW5kIGJ1bGxldGluIGJvYXJkIHN5c3RlbXMgc3RpbGwgZG8gbm90IHN1cHBvcnQgQ1JDLTE2LAorICAgIGVzcGVjaWFsbHkgdGhvc2Ugd3JpdHRlbiBpbiBCYXNpYyBvciBQYXNjYWwuCisKKyAgICBYTU9ERU0gcHJvdG9jb2wgd2l0aCBDUkMgaXMgYWNjdXJhdGUgcHJvdmlkZWQgYm90aCBzZW5kZXIgYW5kIHJlY2VpdmVyCisKKworCisgICAgQ2hhcHRlciA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNT0RFTSBQcm90b2NvbCBFbmhhbmNlbWVudHMKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCisKKworCisgICAgYm90aCByZXBvcnQgYSBzdWNjZXNzZnVsIHRyYW5zbWlzc2lvbi4gIFRoZSBwcm90b2NvbCBpcyByb2J1c3QgaW4gdGhlCisgICAgcHJlc2VuY2Ugb2YgY2hhcmFjdGVycyBsb3N0IGJ5IGJ1ZmZlciBvdmVybG9hZGluZyBvbiB0aW1lc2hhcmluZyBzeXN0ZW1zLgorCisgICAgVGhlIHNpbmdsZSBjaGFyYWN0ZXIgQUNLL05BSyByZXNwb25zZXMgZ2VuZXJhdGVkIGJ5IHRoZSByZWNlaXZpbmcgcHJvZ3JhbQorICAgIGFkYXB0IHdlbGwgdG8gc3BsaXQgc3BlZWQgbW9kZW1zLCB3aGVyZSB0aGUgcmV2ZXJzZSBjaGFubmVsIGlzIGxpbWl0ZWQgdG8KKyAgICB0ZW4gcGVyIGNlbnQgb3IgbGVzcyBvZiB0aGUgbWFpbiBjaGFubmVsJ3Mgc3BlZWQuCisKKyAgICBYTU9ERU0gYW5kIFlNT0RFTSBhcmUgaGFsZiBkdXBsZXggcHJvdG9jb2xzIHdoaWNoIGRvIG5vdCBhdHRlbXB0IHRvCisgICAgdHJhbnNtaXQgaW5mb3JtYXRpb24gYW5kIGNvbnRyb2wgc2lnbmFscyBpbiBib3RoIGRpcmVjdGlvbnMgYXQgdGhlIHNhbWUKKyAgICB0aW1lLiAgVGhpcyBhdm9pZHMgYnVmZmVyIG92ZXJydW4gcHJvYmxlbXMgdGhhdCBoYXZlIGJlZW4gcmVwb3J0ZWQgYnkKKyAgICB1c2VycyBhdHRlbXB0aW5nIHRvIGV4cGxvaXQgZnVsbCBkdXBsZXggYXN5bmNocm9ub3VzIGZpbGUgdHJhbnNmZXIKKyAgICBwcm90b2NvbHMgc3VjaCBhcyBCbGFzdC4KKworICAgIFByb2Zlc3Npb25hbC1ZQU0gYWRkcyBzZXZlcmFsIHByb3ByaWV0YXJ5IGxvZ2ljIGVuaGFuY2VtZW50cyB0byBYTU9ERU0ncworICAgIGVycm9yIGRldGVjdGlvbiBhbmQgcmVjb3ZlcnkuICBUaGVzZSBjb21wYXRpYmxlIGVuaGFuY2VtZW50cyBlbGltaW5hdGUKKyAgICBtb3N0IG9mIHRoZSBiYWQgZmlsZSB0cmFuc2ZlcnMgb3RoZXIgcHJvZ3JhbXMgbWFrZSB3aGVuIHVzaW5nIHRoZSBYTU9ERU0KKyAgICBwcm90b2NvbCB1bmRlciBsZXNzIHRoYW4gaWRlYWwgY29uZGl0aW9ucy4KKworCisgICAgNC4zICBYTU9ERU0tMWsgMTAyNCBCeXRlIEJsb2NrCisKKyAgICBEaXNhcHBvaW50aW5nIHRocm91Z2hwdXQgZG93bmxvYWRpbmcgZnJvbSBVbml4IHdpdGggWU1PREVNWzFdIGxlYWQgdG8gdGhlCisgICAgZGV2ZWxvcG1lbnQgb2YgMTAyNCBieXRlIGJsb2NrcyBpbiAxOTgyLiAgMTAyNCBieXRlIGJsb2NrcyByZWR1Y2UgdGhlCisgICAgZWZmZWN0IG9mIGRlbGF5cyBmcm9tIHRpbWVzaGFyaW5nIHN5c3RlbXMsIG1vZGVtcywgYW5kIHBhY2tldCBzd2l0Y2hlZAorICAgIG5ldHdvcmtzIG9uIHRocm91Z2hwdXQgYnkgODcuNSBwZXIgY2VudCBpbiBhZGRpdGlvbiB0byBkZWNyZWFzaW5nIFhNT0RFTSdzCisgICAgMyBwZXIgY2VudCBvdmVyaGVhZCAoYmxvY2sgbnVtYmVyLCBDUkMsIGV0Yy4pLgorCisgICAgU29tZSBlbnZpcm9ubWVudHMgY2Fubm90IGFjY2VwdCAxMDI0IGJ5dGUgYnVyc3RzLCBpbmNsdWRpbmcgc29tZSBuZXR3b3JrcworICAgIGFuZCBtaW5pY29tcHV0ZXIgcG9ydHMuICBUaGUgbG9uZ2VyIGJsb2NrIGxlbmd0aCBzaG91bGQgYmUgYW4gb3B0aW9uLgorCisgICAgVGhlIGNob2ljZSB0byB1c2UgMTAyNCBieXRlIGJsb2NrcyBpcyBleHByZXNzZWQgdG8gdGhlIHNlbmRpbmcgcHJvZ3JhbSBvbgorICAgIGl0cyBjb21tYW5kIGxpbmUgb3Igc2VsZWN0aW9uIG1lbnUuWzJdIDEwMjQgYnl0ZSBibG9ja3MgaW1wcm92ZSB0aHJvdWdocHV0CisgICAgaW4gbWFueSBhcHBsaWNhdGlvbnMuCisKKyAgICBBbiBTVFggKDAyKSByZXBsYWNlcyB0aGUgU09IICgwMSkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhbnNtaXR0ZWQKKyAgICBibG9jayB0byBub3RpZnkgdGhlIHJlY2VpdmVyIG9mIHRoZSBsb25nZXIgYmxvY2sgbGVuZ3RoLiAgVGhlIHRyYW5zbWl0dGVkCisgICAgYmxvY2sgY29udGFpbnMgMTAyNCBieXRlcyBvZiBkYXRhLiAgVGhlIHJlY2VpdmVyIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VwdAorICAgIGFueSBtaXh0dXJlIG9mIDEyOCBhbmQgMTAyNCBieXRlIGJsb2Nrcy4gIFRoZSBibG9jayBudW1iZXIgKGluIHRoZSBzZWNvbmQKKyAgICBhbmQgdGhpcmQgYnl0ZXMgb2YgdGhlIGJsb2NrKSBpcyBpbmNyZW1lbnRlZCBieSBvbmUgZm9yIGVhY2ggYmxvY2sKKyAgICByZWdhcmRsZXNzIG9mIHRoZSBibG9jayBsZW5ndGguCisKKyAgICBUaGUgc2VuZGVyIG11c3Qgbm90IGNoYW5nZSBiZXR3ZWVuIDEyOCBhbmQgMTAyNCBieXRlIGJsb2NrIGxlbmd0aHMgaWYgaXQKKyAgICBoYXMgbm90IHJlY2VpdmVkIGEgdmFsaWQgQUNLIGZvciB0aGUgY3VycmVudCBibG9jay4gIEZhaWx1cmUgdG8gb2JzZXJ2ZQorCisKKyAgICBfX19fX19fX19fCisKKyAgICAgMS4gVGhlIG5hbWUgaGFkbid0IGJlZW4gY29pbmVkIHlldCwgYnV0IHRoZSBwcm90b2NvbCB3YXMgdGhlIHNhbWUuCisKKyAgICAgMi4gU2VlICJLTUQvSU1QIEV4Y2VwdGlvbnMgdG8gWU1PREVNIiBiZWxvdy4KKworCisKKworICAgIENoYXB0ZXIgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTU9ERU0gUHJvdG9jb2wgRW5oYW5jZW1lbnRzCisKKworCisKKworCisKKyAgICBYL1lNT0RFTSBQcm90b2NvbCBSZWZlcmVuY2UgICAgSnVuZSAxOCAxOTg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorCisKKworICAgIHRoaXMgcmVzdHJpY3Rpb24gYWxsb3dzIHRyYW5zbWlzc2lvbiBlcnJvcnMgdG8gcGFzcyB1bmRldGVjdGVkLgorCisgICAgSWYgMTAyNCBieXRlIGJsb2NrcyBhcmUgYmVpbmcgdXNlZCwgaXQgaXMgcG9zc2libGUgZm9yIGEgZmlsZSB0byAiZ3JvdyIgdXAKKyAgICB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiAxMDI0IGJ5dGVzLiAgVGhpcyBkb2VzIG5vdCB3YXN0ZSBkaXNrIHNwYWNlIGlmIHRoZQorICAgIGFsbG9jYXRpb24gZ3JhbnVsYXJpdHkgaXMgMWsgb3IgZ3JlYXRlci4gIFdpdGggWU1PREVNIGJhdGNoIHRyYW5zbWlzc2lvbiwKKyAgICB0aGUgb3B0aW9uYWwgZmlsZSBsZW5ndGggdHJhbnNtaXR0ZWQgaW4gdGhlIGZpbGUgbmFtZSBibG9jayBhbGxvd3MgdGhlCisgICAgcmVjZWl2ZXIgdG8gZGlzY2FyZCB0aGUgcGFkZGluZywgcHJlc2VydmluZyB0aGUgZXhhY3QgZmlsZSBsZW5ndGggYW5kCisgICAgY29udGVudHMuCisKKyAgICAxMDI0IGJ5dGUgYmxvY2tzIG1heSBiZSB1c2VkIHdpdGggYmF0Y2ggZmlsZSB0cmFuc21pc3Npb24gb3Igd2l0aCBzaW5nbGUKKyAgICBmaWxlIHRyYW5zbWlzc2lvbi4gIENSQy0xNiBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBrIG9wdGlvbiB0byBwcmVzZXJ2ZQorICAgIGRhdGEgaW50ZWdyaXR5IG92ZXIgcGhvbmUgbGluZXMuICBJZiBhIHByb2dyYW0gd2lzaGVzIHRvIGVuZm9yY2UgdGhpcworICAgIHJlY29tbWVuZGF0aW9uLCBpdCBzaG91bGQgY2FuY2VsIHRoZSB0cmFuc2ZlciwgdGhlbiBpc3N1ZSBhbiBpbmZvcm1hdGl2ZQorICAgIGRpYWdub3N0aWMgbWVzc2FnZSBpZiB0aGUgcmVjZWl2ZXIgcmVxdWVzdHMgY2hlY2tzdW0gaW5zdGVhZCBvZiBDUkMtMTYuCisKKyAgICBVbmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSBhIHNlbmRpbmcgcHJvZ3JhbSB1c2UgQ1JDLTE2IHVubGVzcyB0aGUKKyAgICByZWNlaXZlciBjb21tYW5kcyBDUkMtMTYuCisKKyAgICAgICAgICAgICBGaWd1cmUgMS4gIFhNT0RFTS0xayBCbG9ja3MKKworICAgICAgICAgICAgIFNFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNFSVZFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ggLWsgZm9vLmJhciIKKyAgICAgICAgICAgICAiZm9vLmJhciBvcGVuIHgueCBtaW51dGVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDCisgICAgICAgICAgICAgU1RYIDAxIEZFIERhdGFbMTAyNF0gQ1JDIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0sKKyAgICAgICAgICAgICBTVFggMDIgRkQgRGF0YVsxMDI0XSBDUkMgQ1JDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgIFNUWCAwMyBGQyBEYXRhWzEwMDBdIENQTUVPRlsyNF0gQ1JDIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0sKKyAgICAgICAgICAgICBFT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLCisKKyAgICAgICAgICAgICBGaWd1cmUgMi4gIE1peGVkIDEwMjQgYW5kIDEyOCBieXRlIEJsb2NrcworCisgICAgICAgICAgICAgU0VOREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0VJVkVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeCAtayBmb28uYmFyIgorICAgICAgICAgICAgICJmb28uYmFyIG9wZW4geC54IG1pbnV0ZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMKKyAgICAgICAgICAgICBTVFggMDEgRkUgRGF0YVsxMDI0XSBDUkMgQ1JDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgIFNUWCAwMiBGRCBEYXRhWzEwMjRdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLCisgICAgICAgICAgICAgU09IIDAzIEZDIERhdGFbMTI4XSBDUkMgQ1JDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgIFNPSCAwNCBGQiBEYXRhWzEwMF0gQ1BNRU9GWzI4XSBDUkMgQ1JDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgIEVPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0sKKworCisKKworCisgICAgQ2hhcHRlciA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNT0RFTSBQcm90b2NvbCBFbmhhbmNlbWVudHMKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzCisKKworCisgICAgNS4gIFlNT0RFTSBCYXRjaCBGaWxlIFRyYW5zbWlzc2lvbgorCisgICAgVGhlIFlNT0RFTSBCYXRjaCBwcm90b2NvbCBpcyBhbiBleHRlbnNpb24gdG8gdGhlIFhNT0RFTS9DUkMgcHJvdG9jb2wgdGhhdAorICAgIGFsbG93cyAwIG9yIG1vcmUgZmlsZXMgdG8gYmUgdHJhbnNtaXR0ZWQgd2l0aCBhIHNpbmdsZSBjb21tYW5kLiAgKFplcm8KKyAgICBmaWxlcyBtYXkgYmUgc2VudCBpZiBub25lIG9mIHRoZSByZXF1ZXN0ZWQgZmlsZXMgaXMgYWNjZXNzaWJsZS4pIFRoZQorICAgIGRlc2lnbiBhcHByb2FjaCBvZiB0aGUgWU1PREVNIEJhdGNoIHByb3RvY29sIGlzIHRvIHVzZSB0aGUgbm9ybWFsIHJvdXRpbmVzCisgICAgZm9yIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBYTU9ERU0gYmxvY2tzIGluIGEgbGF5ZXJlZCBmYXNoaW9uIHNpbWlsYXIgdG8KKyAgICBwYWNrZXQgc3dpdGNoaW5nIG1ldGhvZHMuCisKKyAgICBXaHkgd2FzIGl0IG5lY2Vzc2FyeSB0byBkZXNpZ24gYSBuZXcgYmF0Y2ggcHJvdG9jb2wgd2hlbiBvbmUgYWxyZWFkeQorICAgIGV4aXN0ZWQgaW4gTU9ERU03P1sxXSBUaGUgYmF0Y2ggZmlsZSBtb2RlIHVzZWQgYnkgTU9ERU03IGlzIHVuc3VpdGFibGUKKyAgICBiZWNhdXNlIGl0IGRvZXMgbm90IHBlcm1pdCBmdWxsIHBhdGhuYW1lcywgZmlsZSBsZW5ndGgsIGZpbGUgZGF0ZSwgb3IKKyAgICBvdGhlciBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gdG8gYmUgdHJhbnNtaXR0ZWQuICBTdWNoIGEgcmVzdHJpY3RpdmUgZGVzaWduLAorICAgIGhhc3RpbHkgaW1wbGVtZW50ZWQgd2l0aCBvbmx5IENQL00gaW4gbWluZCwgd291bGQgbm90IGhhdmUgcGVybWl0dGVkCisgICAgZXh0ZW5zaW9ucyB0byBjdXJyZW50IGFyZWFzIG9mIHBlcnNvbmFsIGNvbXB1dGluZyBzdWNoIGFzIFVuaXgsIERPUywgYW5kCisgICAgb2JqZWN0IG9yaWVudGVkIHN5c3RlbXMuICBJbiBhZGRpdGlvbiwgdGhlIE1PREVNNyBiYXRjaCBmaWxlIG1vZGUgaXMKKyAgICBzb21ld2hhdCBzdXNjZXB0aWJsZSB0byB0cmFuc21pc3Npb24gaW1wYWlybWVudHMuCisKKyAgICBBcyBpbiB0aGUgY2FzZSBvZiBzaW5nbGUgYSBmaWxlIHRyYW5zZmVyLCB0aGUgcmVjZWl2ZXIgaW5pdGlhdGVzIGJhdGNoCisgICAgZmlsZSB0cmFuc21pc3Npb24gYnkgc2VuZGluZyBhICJDIiBjaGFyYWN0ZXIgKGZvciBDUkMtMTYpLgorCisgICAgVGhlIHNlbmRlciBvcGVucyB0aGUgZmlyc3QgZmlsZSBhbmQgc2VuZHMgYmxvY2sgbnVtYmVyIDAgd2l0aCB0aGUKKyAgICBmb2xsb3dpbmcgaW5mb3JtYXRpb24uWzJdCisKKyAgICBPbmx5IHRoZSBwYXRobmFtZSAoZmlsZSBuYW1lKSBwYXJ0IGlzIHJlcXVpcmVkIGZvciBiYXRjaCB0cmFuc2ZlcnMuCisKKyAgICBUbyBtYWludGFpbiB1cHdhcmRzIGNvbXBhdGliaWxpdHksIGFsbCB1bnVzZWQgYnl0ZXMgaW4gYmxvY2sgMCBtdXN0IGJlIHNldAorICAgIHRvIG51bGwuCisKKyAgICBQYXRobmFtZSBUaGUgcGF0aG5hbWUgKGNvbnZlbnRpb25hbGx5LCB0aGUgZmlsZSBuYW1lKSBpcyBzZW50IGFzIGEgbnVsbAorICAgICAgICAgdGVybWluYXRlZCBBU0NJSSBzdHJpbmcuICBUaGlzIGlzIHRoZSBmaWxlbmFtZSBmb3JtYXQgdXNlZCBieSB0aGUKKyAgICAgICAgIGhhbmRsZSBvcmllbnRlZCBNU0RPUyhUTSkgZnVuY3Rpb25zIGFuZCBDIGxpYnJhcnkgZm9wZW4gZnVuY3Rpb25zLgorICAgICAgICAgQW4gYXNzZW1ibHkgbGFuZ3VhZ2UgZXhhbXBsZSBmb2xsb3dzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCICAgICAgJ2Zvby5iYXInLDAKKyAgICAgICAgIE5vIHNwYWNlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHBhdGhuYW1lLiAgTm9ybWFsbHkgb25seSB0aGUgZmlsZSBuYW1lCisgICAgICAgICBzdGVtIChubyBkaXJlY3RvcnkgcHJlZml4KSBpcyB0cmFuc21pdHRlZCB1bmxlc3MgdGhlIHNlbmRlciBoYXMKKyAgICAgICAgIHNlbGVjdGVkIFlBTSdzIGYgb3B0aW9uIHRvIHNlbmQgdGhlIGZ1bGwgcGF0aG5hbWUuICBUaGUgc291cmNlIGRyaXZlCisgICAgICAgICAoQTosIEI6LCBldGMuKSBpcyBub3Qgc2VudC4KKworICAgICAgICAgRmlsZW5hbWUgQ29uc2lkZXJhdGlvbnM6CisKKworCisgICAgX19fX19fX19fXworCisgICAgIDEuIFRoZSBNT0RFTTcgYmF0Y2ggcHJvdG9jb2wgdHJhbnNtaXR0ZWQgQ1AvTSBGQ0IgYnl0ZXMgZjEuLi5mOCBhbmQKKyAgICAgICAgdDEuLi50MyBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZS4gIFRoZSByZWNlaXZlciBlY2hvZWQgdGhlc2UgYnl0ZXMgYXMKKyAgICAgICAgcmVjZWl2ZWQsIG9uZSBhdCBhIHRpbWUuCisKKyAgICAgMi4gT25seSB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBibG9jayBpcyBkZXNjcmliZWQgaGVyZS4KKworCisKKworICAgIENoYXB0ZXIgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTU9ERU0gUHJvdG9jb2wgRW5oYW5jZW1lbnRzCisKKworCisKKworCisKKyAgICBYL1lNT0RFTSBQcm90b2NvbCBSZWZlcmVuY2UgICAgSnVuZSAxOCAxOTg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisKKworICAgICAgICAgICAgKyBGaWxlIG5hbWVzIGFyZSBmb3JjZWQgdG8gbG93ZXIgY2FzZSB1bmxlc3MgdGhlIHNlbmRpbmcgc3lzdGVtCisgICAgICAgICAgICAgIHN1cHBvcnRzIHVwcGVyL2xvd2VyIGNhc2UgZmlsZSBuYW1lcy4gIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmb3IKKyAgICAgICAgICAgICAgdXNlcnMgb2Ygc3lzdGVtcyAoc3VjaCBhcyBVbml4KSB3aGljaCBzdG9yZSBmaWxlbmFtZXMgaW4gdXBwZXIKKyAgICAgICAgICAgICAgYW5kIGxvd2VyIGNhc2UuCisKKyAgICAgICAgICAgICsgVGhlIHJlY2VpdmVyIHNob3VsZCBhY2NvbW1vZGF0ZSBmaWxlIG5hbWVzIGluIGxvd2VyIGFuZCB1cHBlcgorICAgICAgICAgICAgICBjYXNlLgorCisgICAgICAgICAgICArIFdoZW4gdHJhbnNtaXR0aW5nIGZpbGVzIGJldHdlZW4gZGlmZmVyZW50IG9wZXJhdGluZyBzeXN0ZW1zLAorICAgICAgICAgICAgICBmaWxlIG5hbWVzIG11c3QgYmUgYWNjZXB0YWJsZSB0byBib3RoIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmluZworICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtcy4KKworICAgICAgICAgSWYgZGlyZWN0b3JpZXMgYXJlIGluY2x1ZGVkLCB0aGV5IGFyZSBkZWxpbWl0ZWQgYnkgLzsgaS5lLiwKKyAgICAgICAgICJzdWJkaXIvZm9vIiBpcyBhY2NlcHRhYmxlLCAic3ViZGlyXGZvbyIgaXMgbm90LgorCisgICAgTGVuZ3RoIFRoZSBmaWxlIGxlbmd0aCBhbmQgZWFjaCBvZiB0aGUgc3VjY2VlZGluZyBmaWVsZHMgYXJlIG9wdGlvbmFsLlszXQorICAgICAgICAgVGhlIGxlbmd0aCBmaWVsZCBpcyBzdG9yZWQgaW4gdGhlIGJsb2NrIGFzIGEgZGVjaW1hbCBzdHJpbmcgY291bnRpbmcKKyAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgZmlsZS4gIFRoZSBmaWxlIGxlbmd0aCBkb2VzIG5vdAorICAgICAgICAgaW5jbHVkZSBhbnkgQ1BNRU9GICheWikgb3Igb3RoZXIgZ2FyYmFnZSBjaGFyYWN0ZXJzIHVzZWQgdG8gcGFkIHRoZQorICAgICAgICAgbGFzdCBibG9jay4KKworICAgICAgICAgSWYgdGhlIGZpbGUgYmVpbmcgdHJhbnNtaXR0ZWQgaXMgZ3Jvd2luZyBkdXJpbmcgdHJhbnNtaXNzaW9uLCB0aGUKKyAgICAgICAgIGxlbmd0aCBmaWVsZCBzaG91bGQgYmUgc2V0IHRvIGF0IGxlYXN0IHRoZSBmaW5hbCBleHBlY3RlZCBmaWxlCisgICAgICAgICBsZW5ndGgsIG9yIG5vdCBzZW50LgorCisgICAgICAgICBUaGUgcmVjZWl2ZXIgc3RvcmVzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIGRpc2NhcmRpbmcKKyAgICAgICAgIGFueSBwYWRkaW5nIGFkZGVkIGJ5IHRoZSBzZW5kZXIgdG8gZmlsbCB1cCB0aGUgbGFzdCBibG9jay4KKworICAgIE1vZGlmaWNhdGlvbiBEYXRlIFRoZSBtb2QgZGF0ZSBpcyBvcHRpb25hbCwgYW5kIHRoZSBmaWxlbmFtZSBhbmQgbGVuZ3RoCisgICAgICAgICBtYXkgYmUgc2VudCB3aXRob3V0IHJlcXVpcmluZyB0aGUgbW9kIGRhdGUgdG8gYmUgc2VudC4KKworICAgICAgICAgSWZmIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBpcyBzZW50LCBhIHNpbmdsZSBzcGFjZSBzZXBhcmF0ZXMgdGhlCisgICAgICAgICBtb2RpZmljYXRpb24gZGF0ZSBmcm9tIHRoZSBmaWxlIGxlbmd0aC4KKworICAgICAgICAgVGhlIG1vZCBkYXRlIGlzIHNlbnQgYXMgYW4gb2N0YWwgbnVtYmVyIGdpdmluZyB0aGUgdGltZSB0aGUgY29udGVudHMKKyAgICAgICAgIG9mIHRoZSBmaWxlIHdlcmUgbGFzdCBjaGFuZ2VkLCBtZWFzdXJlZCBpbiBzZWNvbmRzIGZyb20gSmFuIDEgMTk3MAorICAgICAgICAgVW5pdmVyc2FsIENvb3JkaW5hdGVkIFRpbWUgKEdNVCkuICBBIGRhdGUgb2YgMCBpbXBsaWVzIHRoZQorICAgICAgICAgbW9kaWZpY2F0aW9uIGRhdGUgaXMgdW5rbm93biBhbmQgc2hvdWxkIGJlIGxlZnQgYXMgdGhlIGRhdGUgdGhlIGZpbGUKKyAgICAgICAgIGlzIHJlY2VpdmVkLgorCisgICAgICAgICBUaGlzIHN0YW5kYXJkIGZvcm1hdCB3YXMgY2hvc2VuIHRvIGVsaW1pbmF0ZSBhbWJpZ3VpdGllcyBhcmlzaW5nIGZyb20KKyAgICAgICAgIHRyYW5zZmVycyBiZXR3ZWVuIGRpZmZlcmVudCB0aW1lIHpvbmVzLgorCisKKworCisKKyAgICBfX19fX19fX19fCisKKyAgICAgMy4gRmllbGRzIG1heSBub3QgYmUgc2tpcHBlZC4KKworCisKKworICAgIENoYXB0ZXIgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTU9ERU0gUHJvdG9jb2wgRW5oYW5jZW1lbnRzCisKKworCisKKworCisKKyAgICBYL1lNT0RFTSBQcm90b2NvbCBSZWZlcmVuY2UgICAgSnVuZSAxOCAxOTg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisKKworICAgIE1vZGUgSWZmIHRoZSBmaWxlIG1vZGUgaXMgc2VudCwgYSBzaW5nbGUgc3BhY2Ugc2VwYXJhdGVzIHRoZSBmaWxlIG1vZGUKKyAgICAgICAgIGZyb20gdGhlIG1vZGlmaWNhdGlvbiBkYXRlLiAgVGhlIGZpbGUgbW9kZSBpcyBzdG9yZWQgYXMgYW4gb2N0YWwKKyAgICAgICAgIHN0cmluZy4gIFVubGVzcyB0aGUgZmlsZSBvcmlnaW5hdGVkIGZyb20gYSBVbml4IHN5c3RlbSwgdGhlIGZpbGUgbW9kZQorICAgICAgICAgaXMgc2V0IHRvIDAuICByYigxKSBjaGVja3MgdGhlIGZpbGUgbW9kZSBmb3IgdGhlIDB4ODAwMCBiaXQgd2hpY2gKKyAgICAgICAgIGluZGljYXRlcyBhIFVuaXggdHlwZSByZWd1bGFyIGZpbGUuICBGaWxlcyB3aXRoIHRoZSAweDgwMDAgYml0IHNldAorICAgICAgICAgYXJlIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHNlbnQgZnJvbSBhbm90aGVyIFVuaXggKG9yIHNpbWlsYXIpIHN5c3RlbQorICAgICAgICAgd2hpY2ggdXNlcyB0aGUgc2FtZSBmaWxlIGNvbnZlbnRpb25zLiAgU3VjaCBmaWxlcyBhcmUgbm90IHRyYW5zbGF0ZWQKKyAgICAgICAgIGluIGFueSB3YXkuCisKKworICAgIFNlcmlhbCBOdW1iZXIgSWZmIHRoZSBzZXJpYWwgbnVtYmVyIGlzIHNlbnQsIGEgc2luZ2xlIHNwYWNlIHNlcGFyYXRlcyB0aGUKKyAgICAgICAgIHNlcmlhbCBudW1iZXIgZnJvbSB0aGUgZmlsZSBtb2RlLiAgVGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlCisgICAgICAgICB0cmFuc21pdHRpbmcgcHJvZ3JhbSBpcyBzdG9yZWQgYXMgYW4gb2N0YWwgc3RyaW5nLiAgUHJvZ3JhbXMgd2hpY2ggZG8KKyAgICAgICAgIG5vdCBoYXZlIGEgc2VyaWFsIG51bWJlciBzaG91bGQgb21pdCB0aGlzIGZpZWxkLCBvciBzZXQgaXQgdG8gMC4gIFRoZQorICAgICAgICAgcmVjZWl2ZXIncyB1c2Ugb2YgdGhpcyBmaWVsZCBpcyBvcHRpb25hbC4KKworCisgICAgT3RoZXIgRmllbGRzIFlNT0RFTSB3YXMgZGVzaWduZWQgdG8gYWxsb3cgYWRkaXRpb25hbCBoZWFkZXIgZmllbGRzIHRvIGJlCisgICAgICAgICBhZGRlZCBhcyBhYm92ZSB3aXRob3V0IGNyZWF0aW5nIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aCBvbGRlcgorICAgICAgICAgWU1PREVNIHByb2dyYW1zLiAgUGxlYXNlIGNvbnRhY3QgT21lbiBUZWNobm9sb2d5IGlmIG90aGVyIGZpZWxkcyBhcmUKKyAgICAgICAgIG5lZWRlZCBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuCisKKyAgICBUaGUgcmVzdCBvZiB0aGUgYmxvY2sgaXMgc2V0IHRvIG51bGxzLiAgVGhpcyBpcyBlc3NlbnRpYWwgdG8gcHJlc2VydmUKKyAgICB1cHdhcmQgY29tcGF0aWJpbGl0eS5bNF0KKworICAgIElmIHRoZSBmaWxlbmFtZSBibG9jayBpcyByZWNlaXZlZCB3aXRoIGEgQ1JDIG9yIG90aGVyIGVycm9yLCBhCisgICAgcmV0cmFuc21pc3Npb24gaXMgcmVxdWVzdGVkLiAgQWZ0ZXIgdGhlIGZpbGVuYW1lIGJsb2NrIGhhcyBiZWVuIHJlY2VpdmVkLAorICAgIGl0IGlzIEFDSydlZCBpZiB0aGUgd3JpdGUgb3BlbiBpcyBzdWNjZXNzZnVsLiAgSWYgdGhlIGZpbGUgY2Fubm90IGJlCisgICAgb3BlbmVkIGZvciB3cml0aW5nLCB0aGUgcmVjZWl2ZXIgY2FuY2VscyB0aGUgdHJhbnNmZXIgd2l0aCBDQU4gY2hhcmFjdGVycworICAgIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICAgIFRoZSByZWNlaXZlciB0aGVuIGluaXRpYXRlcyB0cmFuc2ZlciBvZiB0aGUgZmlsZSBjb250ZW50cyB3aXRoIGEgIkMiCisgICAgY2hhcmFjdGVyLCBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkIFhNT0RFTS9DUkMgcHJvdG9jb2wuCisKKyAgICBBZnRlciB0aGUgZmlsZSBjb250ZW50cyBhbmQgWE1PREVNIEVPVCBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQgYW5kCisgICAgYWNrbm93bGVkZ2VkLCB0aGUgcmVjZWl2ZXIgYWdhaW4gYXNrcyBmb3IgdGhlIG5leHQgcGF0aG5hbWUuCisKKyAgICBUcmFuc21pc3Npb24gb2YgYSBudWxsIHBhdGhuYW1lIHRlcm1pbmF0ZXMgYmF0Y2ggZmlsZSB0cmFuc21pc3Npb24uCisKKyAgICBOb3RlIHRoYXQgdHJhbnNtaXNzaW9uIG9mIG5vIGZpbGVzIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBlcnJvci4gIFRoaXMgaXMKKyAgICBwb3NzaWJsZSBpZiBub25lIG9mIHRoZSBmaWxlcyByZXF1ZXN0ZWQgb2YgdGhlIHNlbmRlciBjb3VsZCBiZSBvcGVuZWQgZm9yCisgICAgcmVhZGluZy4KKworCisKKyAgICBfX19fX19fX19fCisKKyAgICAgNC4gSWYsIHBlcmNoYW5jZSwgdGhpcyBpbmZvcm1hdGlvbiBleHRlbmRzIGJleW9uZCAxMjggYnl0ZXMgKHBvc3NpYmxlCisgICAgICAgIHdpdGggVW5peCA0LjIgQlNEIGV4dGVuZGVkIGZpbGUgbmFtZXMpLCB0aGUgYmxvY2sgc2hvdWxkIGJlIHNlbnQgYXMgYQorICAgICAgICAxayBibG9jayBhcyBkZXNjcmliZWQgYWJvdmUuCisKKworCisKKyAgICBDaGFwdGVyIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1PREVNIFByb3RvY29sIEVuaGFuY2VtZW50cworCisKKworCisKKworCisgICAgWC9ZTU9ERU0gUHJvdG9jb2wgUmVmZXJlbmNlICAgIEp1bmUgMTggMTk4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworCisKKyAgICBNb3N0IFlNT0RFTSByZWNlaXZlcnMgcmVxdWVzdCBDUkMtMTYgYnkgZGVmYXVsdC4KKworICAgIFRoZSBVbml4IHByb2dyYW1zIHN6KDEpIGFuZCByeigxKSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGNvZGUgZmlsZQorICAgIFJaU1ouWk9PIHNob3VsZCBhbnN3ZXIgb3RoZXIgcXVlc3Rpb25zIGFib3V0IFlNT0RFTSBiYXRjaCBwcm90b2NvbC4KKworICAgICAgICAgICAgICBGaWd1cmUgMy4gIFlNT0RFTSBCYXRjaCBUcmFuc21pc3Npb24gU2Vzc2lvbiAoMSBmaWxlKQorCisgICAgICAgICAgICAgIFNFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNFSVZFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNiIGZvby4qPENSPiIKKyAgICAgICAgICAgICAgInNlbmRpbmcgaW4gYmF0Y2ggbW9kZSBldGMuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyAoY29tbWFuZDpyYikKKyAgICAgICAgICAgICAgU09IIDAwIEZGIGZvby5jIE5VTFsxMjNdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQworICAgICAgICAgICAgICBTT0ggMDEgRkUgRGF0YVsxMjhdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgICBTT0ggMDIgRkMgRGF0YVsxMjhdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgICBTT0ggMDMgRkIgRGF0YVsxMDBdIENQTUVPRlsyOF0gQ1JDIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLCisgICAgICAgICAgICAgIEVPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFLCisgICAgICAgICAgICAgIEVPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDCisgICAgICAgICAgICAgIFNPSCAwMCBGRiBOVUxbMTI4XSBDUkMgQ1JDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0sKKworICAgICAgICAgICAgICAgIEZpZ3VyZSA3LiAgWU1PREVNIEhlYWRlciBJbmZvcm1hdGlvbiBhbmQgRmVhdHVyZXMKKworICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgICB8IFByb2dyYW0gICB8IExlbmd0aCB8IERhdGUgfCBNb2RlIHwgUy9OIHwgMWstQmxrIHwgWU1PREVNLWcgfAorICAgIHxfX19fX19fX19fX3xfX19fX19fX3xfX19fX198X19fX19ffF9fX19ffF9fX19fX19ffF9fX19fX19fX198CisgICAgfFVuaXggcnovc3ogfCB5ZXMgICAgfCB5ZXMgIHwgeWVzICB8IG5vICB8IHllcyAgICB8IHNiIG9ubHkgIHwKKyAgICB8X19fX19fX19fX198X19fX19fX198X19fX19ffF9fX19fX3xfX19fX3xfX19fX19fX3xfX19fX19fX19ffAorICAgIHxWTVMgcmIvc2IgIHwgeWVzICAgIHwgbm8gICB8IG5vICAgfCBubyAgfCB5ZXMgICAgfCBubyAgICAgICB8CisgICAgfF9fX19fX19fX19ffF9fX19fX19ffF9fX19fX3xfX19fX198X19fX198X19fX19fX198X19fX19fX19fX3wKKyAgICB8UHJvLVlBTSAgICB8IHllcyAgICB8IHllcyAgfCBubyAgIHwgeWVzIHwgeWVzICAgIHwgeWVzICAgICAgfAorICAgIHxfX19fX19fX19fX3xfX19fX19fX3xfX19fX198X19fX19ffF9fX19ffF9fX19fX19ffF9fX19fX19fX198CisgICAgfENQL00gWUFNICAgfCBubyAgICAgfCBubyAgIHwgbm8gICB8IG5vICB8IHllcyAgICB8IG5vICAgICAgIHwKKyAgICB8X19fX19fX19fX198X19fX19fX198X19fX19ffF9fX19fX3xfX19fX3xfX19fX19fX3xfX19fX19fX19ffAorICAgIHxLTUQvSU1QICAgIHwgPyAgICAgIHwgbm8gICB8IG5vICAgfCBubyAgfCB5ZXMgICAgfCBubyAgICAgICB8CisgICAgfF9fX19fX19fX19ffF9fX19fX19ffF9fX19fX3xfX19fX198X19fX198X19fX19fX198X19fX19fX19fX3wKKworICAgIDUuMSAgS01EL0lNUCBFeGNlcHRpb25zIHRvIFlNT0RFTQorCisgICAgS01EIGFuZCBJTVAgdXNlIGEgIkNLIiBjaGFyYWN0ZXIgc2VxdWVuY2UgZW1pdHRlZCBieSB0aGUgcmVjZWl2ZXIgdG8KKyAgICB0cmlnZ2VyIHRoZSB1c2Ugb2YgMTAyNCBieXRlIGJsb2NrcyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIHRoaXMKKyAgICBvcHRpb24gdG8gdGhlIHNlbmRpbmcgcHJvZ3JhbS4gIFRoaXMgdHdvIGNoYXJhY3RlciBzZXF1ZW5jZSBnZW5lcmFsbHkKKyAgICB3b3JrcyB3ZWxsIG9uIHNpbmdsZSBwcm9jZXNzIG1pY3JvcyBpbiBkaXJlY3QgY29tbXVuaWNhdGlvbiwgcHJvdmlkZWQgdGhlCisgICAgcHJvZ3JhbXMgcmlnb3JvdXNseSBhZGhlcmUgdG8gYWxsIHRoZSBYTU9ERU0gcmVjb21tZW5kYXRpb25zIGluY2x1ZGVkCisKKworCisgICAgQ2hhcHRlciA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNT0RFTSBQcm90b2NvbCBFbmhhbmNlbWVudHMKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3CisKKworCisgICAgICAgICAgIEZpZ3VyZSA0LiAgWU1PREVNIEJhdGNoIFRyYW5zbWlzc2lvbiBTZXNzaW9uICgyIGZpbGVzKQorCisgICAgICAgICAgIFNFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNFSVZFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNiIGZvby5jIGJhei5jPENSPiIKKyAgICAgICAgICAgInNlbmRpbmcgaW4gYmF0Y2ggbW9kZSBldGMuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyAoY29tbWFuZDpyYikKKyAgICAgICAgICAgU09IIDAwIEZGIGZvby5jIE5VTFsxMjNdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQworICAgICAgICAgICBTT0ggMDEgRkUgRGF0YVsxMjhdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICBTT0ggMDIgRkMgRGF0YVsxMjhdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICBTT0ggMDMgRkIgRGF0YVsxMDBdIENQTUVPRlsyOF0gQ1JDIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLCisgICAgICAgICAgIEVPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFLCisgICAgICAgICAgIEVPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDCisgICAgICAgICAgIFNPSCAwMCBGRiBiYXouYyBOVUxbMTIzXSBDUkMgQ1JDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMKKyAgICAgICAgICAgU09IIDAxIEZCIERhdGFbMTAwXSBDUE1FT0ZbMjhdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICBFT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BSworICAgICAgICAgICBFT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQworICAgICAgICAgICBTT0ggMDAgRkYgTlVMWzEyOF0gQ1JDIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLCisKKyAgICAgICAgICAgIEZpZ3VyZSA1LiAgWU1PREVNIEJhdGNoIFRyYW5zbWlzc2lvbiBTZXNzaW9uLTFrIEJsb2NrcworCisgICAgICAgICAgICBTRU5ERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDRUlWRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2IgLWsgZm9vLio8Q1I+IgorICAgICAgICAgICAgInNlbmRpbmcgaW4gYmF0Y2ggbW9kZSBldGMuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMgKGNvbW1hbmQ6cmIpCisgICAgICAgICAgICBTT0ggMDAgRkYgZm9vLmMgTlVMWzEyM10gQ1JDIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMKKyAgICAgICAgICAgIFNUWCAwMSBGRCBEYXRhWzEwMjRdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0sKKyAgICAgICAgICAgIFNPSCAwMiBGQyBEYXRhWzEyOF0gQ1JDIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDSworICAgICAgICAgICAgU09IIDAzIEZCIERhdGFbMTAwXSBDUE1FT0ZbMjhdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0sKKyAgICAgICAgICAgIEVPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BSworICAgICAgICAgICAgRU9UCisKKworCisgICAgQ2hhcHRlciA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNT0RFTSBQcm90b2NvbCBFbmhhbmNlbWVudHMKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4CisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQworICAgICAgICAgICAgU09IIDAwIEZGIE5VTFsxMjhdIENSQyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0sKKworICAgICAgICAgICBGaWd1cmUgNi4gIFlNT0RFTSBGaWxlbmFtZSBibG9jayB0cmFuc21pdHRlZCBieSBzegorCisgICAgICAgICAgIC1ydy1yLS1yLS0gIDYzNDcgSnVuIDE3IDE5ODQgMjA6MzQgYmJjc2NoZWQudHh0CisKKyAgICAgICAgICAgMDAgMDEwMEZGNjIgNjI2MzczNjMgNjg2NTY0MkUgNzQ3ODc0MDAgICB8Li4uYmJjc2NoZWQudHh0LnwKKyAgICAgICAgICAgMTAgMzYzMzM0MzcgMjAzMzMzMzEgMzQzNzM0MzIgMzUzMTMzMjAgICB8NjM0NyAzMzE0NzQyNTEzIHwKKyAgICAgICAgICAgMjAgMzEzMDMwMzYgMzQzNDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgICB8MTAwNjQ0Li4uLi4uLi4uLnwKKyAgICAgICAgICAgMzAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAKKyAgICAgICAgICAgNDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAKKyAgICAgICAgICAgNTAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAKKyAgICAgICAgICAgNjAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAKKyAgICAgICAgICAgNzAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAKKyAgICAgICAgICAgODAgMDAwMDAwQ0EgNTYKKworICAgIGhlcmVpbi4gIFByb2dyYW1zIHdpdGggbWFyZ2luYWwgWE1PREVNIGltcGxlbWVudGF0aW9ucyBkbyBub3QgZmFyZSBzbworICAgIHdlbGwuICBUaW1lc2hhcmluZyBzeXN0ZW1zIGFuZCBwYWNrZXQgc3dpdGNoZWQgbmV0d29ya3MgY2FuIHNlcGFyYXRlIHRoZQorICAgIHN1Y2Nlc3NpdmUgY2hhcmFjdGVycywgcmVuZGVyaW5nIHRoaXMgbWV0aG9kIHVucmVsaWFibGUuCisKKyAgICBTZW5kaW5nIHByb2dyYW1zIG1heSBkZXRlY3QgdGhlIENLIHNlcXVlbmNlIGlmIHRoZSBvcGVyYXRpbmcgZW52aW9ybm1lbnQKKyAgICBkb2VzIG5vdCBwcmVjbHVkZSByZWxpYWJsZSBpbXBsZW1lbnRhdGlvbi4KKworICAgIEluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIFlNT0RFTSBmaWxlIGxlbmd0aCBpbiBkZWNpbWFsLCBLTUQgYW5kIElNUAorICAgIHRyYW5zbWl0IHRoZSBDUC9NIHJlY29yZCBjb3VudCBpbiB0aGUgbGFzdCB0d28gYnl0ZXMgb2YgdGhlIGhlYWRlciBibG9jay4KKworCisgICAgNi4gIFlNT0RFTS1nIEZpbGUgVHJhbnNtaXNzaW9uCisKKyAgICBEZXZlbG9waW5nIHRlY2hub2xvZ3kgaXMgcHJvdmlkaW5nIHBob25lIGxpbmUgZGF0YSB0cmFuc21pc3Npb24gYXQgZXZlcgorICAgIGhpZ2hlciBzcGVlZHMgdXNpbmcgdmVyeSBzcGVjaWFsaXplZCB0ZWNobmlxdWVzLiAgVGhlc2UgaGlnaCBzcGVlZCBtb2RlbXMsCisgICAgYXMgd2VsbCBhcyBzZXNzaW9uIHByb3RvY29scyBzdWNoIGFzIFguUEMsIHByb3ZpZGUgaGlnaCBzcGVlZCwgbmVhcmx5CisgICAgZXJyb3IgZnJlZSBjb21tdW5pY2F0aW9ucyBhdCB0aGUgZXhwZW5zZSBvZiBjb25zaWRlcmFibHkgaW5jcmVhc2VkIGRlbGF5CisgICAgdGltZS4KKworICAgIFRoaXMgZGVsYXkgdGltZSBpcyBtb2RlcmF0ZSBjb21wYXJlZCB0byBodW1hbiBpbnRlcmFjdGlvbnMsIGJ1dCBpdAorICAgIGNyaXBwbGVzIHRoZSB0aHJvdWdocHV0IG9mIG1vc3QgZXJyb3IgY29ycmVjdGluZyBwcm90b2NvbHMuCisKKyAgICBUaGUgZyBvcHRpb24gdG8gWU1PREVNIGhhcyBwcm92ZW4gZWZmZWN0aXZlIHVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXMuCisgICAgVGhlIGcgb3B0aW9uIGlzIGRyaXZlbiBieSB0aGUgcmVjZWl2ZXIsIHdoaWNoIGluaXRpYXRlcyB0aGUgYmF0Y2ggdHJhbnNmZXIKKyAgICBieSB0cmFuc21pdHRpbmcgYSBHIGluc3RlYWQgb2YgQy4gIFdoZW4gdGhlIHNlbmRlciByZWNvZ25pemVzIHRoZSBHLCBpdAorICAgIGJ5cGFzc2VzIHRoZSB1c3VhbCB3YWl0IGZvciBhbiBBQ0sgdG8gZWFjaCB0cmFuc21pdHRlZCBibG9jaywgc2VuZGluZworICAgIHN1Y2NlZWRpbmcgYmxvY2tzIGF0IGZ1bGwgc3BlZWQsIHN1YmplY3QgdG8gWE9GRi9YT04gb3Igb3RoZXIgZmxvdyBjb250cm9sCisgICAgZXhlcnRlZCBieSB0aGUgbWVkaXVtLgorCisgICAgVGhlIHNlbmRlciBleHBlY3RzIGFuIGluaXRhbCBHIHRvIGluaXRpYXRlIHRoZSB0cmFuc21pc3Npb24gb2YgYQorICAgIHBhcnRpY3VsYXIgZmlsZSwgYW5kIGFsc28gZXhwZWN0cyBhbiBBQ0sgb24gdGhlIEVPVCBzZW50IGF0IHRoZSBlbmQgb2YKKyAgICBlYWNoIGZpbGUuICBUaGlzIHN5bmNocm9uaXphdGlvbiBhbGxvd3MgdGhlIHJlY2VpdmVyIHRpbWUgdG8gb3BlbiBhbmQKKworCisKKyAgICBDaGFwdGVyIDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1PREVNIFByb3RvY29sIEVuaGFuY2VtZW50cworCisKKworCisKKworCisgICAgWC9ZTU9ERU0gUHJvdG9jb2wgUmVmZXJlbmNlICAgIEp1bmUgMTggMTk4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkKKworCisKKyAgICBjbG9zZSBmaWxlcyBhcyBuZWNlc3NhcnkuCisKKyAgICBJZiBhbiBlcnJvciBpcyBkZXRlY3RlZCBpbiBhIFlNT0RFTS1nIHRyYW5zZmVyLCB0aGUgcmVjZWl2ZXIgYWJvcnRzIHRoZQorICAgIHRyYW5zZmVyIHdpdGggdGhlIG11bHRpcGxlIENBTiBhYm9ydCBzZXF1ZW5jZS4gIFRoZSBaTU9ERU0gcHJvdG9jb2wgc2hvdWxkCisgICAgYmUgdXNlZCBpbiBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIGJvdGggc3RyZWFtaW5nIHRocm91Z2hwdXQgYW5kIGVycm9yCisgICAgcmVjb3ZlcnkuCisKKyAgICAgICAgICAgIEZpZ3VyZSA4LiAgWU1PREVNLWcgVHJhbnNtaXNzaW9uIFNlc3Npb24KKworICAgICAgICAgICAgU0VOREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0VJVkVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNiIGZvby4qPENSPiIKKyAgICAgICAgICAgICJzZW5kaW5nIGluIGJhdGNoIG1vZGUgZXRjLi4uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcgKGNvbW1hbmQ6cmIgLWcpCisgICAgICAgICAgICBTT0ggMDAgRkYgZm9vLmMgTlVMWzEyM10gQ1JDIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcKKyAgICAgICAgICAgIFNPSCAwMSBGRSBEYXRhWzEyOF0gQ1JDIENSQworICAgICAgICAgICAgU1RYIDAyIEZEIERhdGFbMTAyNF0gQ1JDIENSQworICAgICAgICAgICAgU09IIDAzIEZDIERhdGFbMTI4XSBDUkMgQ1JDCisgICAgICAgICAgICBTT0ggMDQgRkIgRGF0YVsxMDBdIENQTUVPRlsyOF0gQ1JDIENSQworICAgICAgICAgICAgRU9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRworICAgICAgICAgICAgU09IIDAwIEZGIE5VTFsxMjhdIENSQyBDUkMKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIENoYXB0ZXIgNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTU9ERU0gUHJvdG9jb2wgRW5oYW5jZW1lbnRzCisKKworCisKKworCisKKyAgICBYL1lNT0RFTSBQcm90b2NvbCBSZWZlcmVuY2UgICAgSnVuZSAxOCAxOTg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMAorCisKKworICAgIDcuICBYTU9ERU0gUFJPVE9DT0wgT1ZFUlZJRVcKKworICAgIDgvOS84MiBieSBXYXJkIENocmlzdGVuc2VuLgorCisgICAgSSB3aWxsIG1haW50YWluIGEgbWFzdGVyIGNvcHkgb2YgdGhpcy4gIFBsZWFzZSBwYXNzIG9uIGNoYW5nZXMgb3IKKyAgICBzdWdnZXN0aW9ucyB2aWEgQ0JCUy9DaGljYWdvIGF0ICgzMTIpIDU0NS04MDg2LCBDQkJTL0NQTVVHICgzMTIpIDg0OS0xMTMyCisgICAgb3IgYnkgdm9pY2UgYXQgKDMxMikgODQ5LTYyNzkuCisKKyAgICA3LjEgIERlZmluaXRpb25zCisKKyAgICAgIDxzb2g+IDAxSAorICAgICAgPGVvdD4gMDRICisgICAgICA8YWNrPiAwNkgKKyAgICAgIDxuYWs+IDE1SAorICAgICAgPGNhbj4gMThICisgICAgICA8Qz4gICA0M0gKKworCisgICAgNy4yICBUcmFuc21pc3Npb24gTWVkaXVtIExldmVsIFByb3RvY29sCisKKyAgICBBc3luY2hyb25vdXMsIDggZGF0YSBiaXRzLCBubyBwYXJpdHksIG9uZSBzdG9wIGJpdC4KKworICAgIFRoZSBwcm90b2NvbCBpbXBvc2VzIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUgY29udGVudHMgb2YgdGhlIGRhdGEgYmVpbmcKKyAgICB0cmFuc21pdHRlZC4gIE5vIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUgbG9va2VkIGZvciBpbiB0aGUgMTI4LWJ5dGUgZGF0YQorICAgIG1lc3NhZ2VzLiAgQWJzb2x1dGVseSBhbnkga2luZCBvZiBkYXRhIG1heSBiZSBzZW50IC0gYmluYXJ5LCBBU0NJSSwgZXRjLgorICAgIFRoZSBwcm90b2NvbCBoYXMgbm90IGZvcm1hbGx5IGJlZW4gYWRvcHRlZCB0byBhIDctYml0IGVudmlyb25tZW50IGZvciB0aGUKKyAgICB0cmFuc21pc3Npb24gb2YgQVNDSUktb25seSAob3IgdW5wYWNrZWQtaGV4KSBkYXRhICwgYWx0aG91Z2ggaXQgY291bGQgYmUKKyAgICBzaW1wbHkgYnkgaGF2aW5nIGJvdGggZW5kcyBhZ3JlZSB0byBBTkQgdGhlIHByb3RvY29sLWRlcGVuZGVudCBkYXRhIHdpdGgKKyAgICA3RiBoZXggYmVmb3JlIHZhbGlkYXRpbmcgaXQuICBJIHNwZWNpZmljYWxseSBhbSByZWZlcnJpbmcgdG8gdGhlIGNoZWNrc3VtLAorICAgIGFuZCB0aGUgYmxvY2sgbnVtYmVycyBhbmQgdGhlaXIgb25lcy0gY29tcGxlbWVudC4KKworICAgIFRob3NlIHdpc2hpbmcgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSBvZiB0aGUgQ1AvTSBmaWxlIHN0cnVjdHVyZSwgaS5lLgorICAgIHRvIGFsbG93IG1vZGVtbWluZyBBU0NJSSBmaWxlcyB0byBvciBmcm9tIENQL00gc3lzdGVtcyBzaG91bGQgZm9sbG93IHRoaXMKKyAgICBkYXRhIGZvcm1hdDoKKworICAgICAgICsgQVNDSUkgdGFicyB1c2VkICgwOUgpOyB0YWJzIHNldCBldmVyeSA4LgorCisgICAgICAgKyBMaW5lcyB0ZXJtaW5hdGVkIGJ5IENSL0xGICgwREggMEFIKQorCisgICAgICAgKyBFbmQtb2YtZmlsZSBpbmRpY2F0ZWQgYnkgXlosIDFBSC4gIChvbmUgb3IgbW9yZSkKKworICAgICAgICsgRGF0YSBpcyB2YXJpYWJsZSBsZW5ndGgsIGkuZS4gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjb250aW51b3VzCisgICAgICAgICBzdHJlYW0gb2YgZGF0YSBieXRlcywgYnJva2VuIGludG8gMTI4LWJ5dGUgY2h1bmtzIHB1cmVseSBmb3IgdGhlCisgICAgICAgICBwdXJwb3NlIG9mIHRyYW5zbWlzc2lvbi4KKworICAgICAgICsgQSBDUC9NICJwZWN1bGlhcml0eSI6IElmIHRoZSBkYXRhIGVuZHMgZXhhY3RseSBvbiBhIDEyOC1ieXRlCisgICAgICAgICBib3VuZGFyeSwgaS5lLiBDUiBpbiAxMjcsIGFuZCBMRiBpbiAxMjgsIGEgc3Vic2VxdWVudCBzZWN0b3IKKyAgICAgICAgIGNvbnRhaW5pbmcgdGhlIF5aIEVPRiBjaGFyYWN0ZXIocykgaXMgb3B0aW9uYWwsIGJ1dCBpcyBwcmVmZXJyZWQuCisgICAgICAgICBTb21lIHV0aWxpdGllcyBvciB1c2VyIHByb2dyYW1zIHN0aWxsIGRvIG5vdCBoYW5kbGUgRU9GIHdpdGhvdXQgXlpzLgorCisKKworCisKKyAgICBDaGFwdGVyIDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtb2RlbSBQcm90b2NvbCBPdmVydmlldworCisKKworCisKKworCisgICAgWC9ZTU9ERU0gUHJvdG9jb2wgUmVmZXJlbmNlICAgIEp1bmUgMTggMTk4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEKKworCisKKyAgICAgICArIFRoZSBsYXN0IGJsb2NrIHNlbnQgaXMgbm8gZGlmZmVyZW50IGZyb20gb3RoZXJzLCBpLmUuICB0aGVyZSBpcyBubworICAgICAgICAgInNob3J0IGJsb2NrIi4KKyAgICAgICAgICAgICAgICAgIEZpZ3VyZSA5LiAgWE1PREVNIE1lc3NhZ2UgQmxvY2sgTGV2ZWwgUHJvdG9jb2wKKworICAgIEVhY2ggYmxvY2sgb2YgdGhlIHRyYW5zZmVyIGxvb2tzIGxpa2U6CisgICAgICAgICAgPFNPSD48YmxrICM+PDI1NS1ibGsgIz48LS0xMjggZGF0YSBieXRlcy0tPjxja3N1bT4KKyAgICBpbiB3aGljaDoKKyAgICA8U09IPiAgICAgICAgID0gMDEgaGV4CisgICAgPGJsayAjPiAgICAgICA9IGJpbmFyeSBudW1iZXIsIHN0YXJ0cyBhdCAwMSBpbmNyZW1lbnRzIGJ5IDEsIGFuZAorICAgICAgICAgICAgICAgICAgICB3cmFwcyAwRkZIIHRvIDAwSCAobm90IHRvIDAxKQorICAgIDwyNTUtYmxrICM+ICAgPSBibGsgIyBhZnRlciBnb2luZyB0aHJ1IDgwODAgIkNNQSIgaW5zdHIsIGkuZS4KKyAgICAgICAgICAgICAgICAgICAgZWFjaCBiaXQgY29tcGxlbWVudGVkIGluIHRoZSA4LWJpdCBibG9jayBudW1iZXIuCisgICAgICAgICAgICAgICAgICAgIEZvcm1hbGx5LCB0aGlzIGlzIHRoZSAib25lcyBjb21wbGVtZW50Ii4KKyAgICA8Y2tzdW0+ICAgICAgID0gdGhlIHN1bSBvZiB0aGUgZGF0YSBieXRlcyBvbmx5LiAgVG9zcyBhbnkgY2FycnkuCisKKyAgICA3LjMgIEZpbGUgTGV2ZWwgUHJvdG9jb2wKKworICAgIDcuMy4xICBDb21tb25fdG9fQm90aF9TZW5kZXJfYW5kX1JlY2VpdmVyCisgICAgQWxsIGVycm9ycyBhcmUgcmV0cmllZCAxMCB0aW1lcy4gIEZvciB2ZXJzaW9ucyBydW5uaW5nIHdpdGggYW4gb3BlcmF0b3IKKyAgICAoaS5lLiBOT1Qgd2l0aCBYTU9ERU0pLCBhIG1lc3NhZ2UgaXMgdHlwZWQgYWZ0ZXIgMTAgZXJyb3JzIGFza2luZyB0aGUKKyAgICBvcGVyYXRvciB3aGV0aGVyIHRvICJyZXRyeSBvciBxdWl0Ii4KKworICAgIFNvbWUgdmVyc2lvbnMgb2YgdGhlIHByb3RvY29sIHVzZSA8Y2FuPiwgQVNDSUkgXlgsIHRvIGNhbmNlbCB0cmFuc21pc3Npb24uCisgICAgVGhpcyB3YXMgbmV2ZXIgYWRvcHRlZCBhcyBhIHN0YW5kYXJkLCBhcyBoYXZpbmcgYSBzaW5nbGUgImFib3J0IiBjaGFyYWN0ZXIKKyAgICBtYWtlcyB0aGUgdHJhbnNtaXNzaW9uIHN1c2NlcHRpYmxlIHRvIGZhbHNlIHRlcm1pbmF0aW9uIGR1ZSB0byBhbiA8YWNrPgorICAgIDxuYWs+IG9yIDxzb2g+IGJlaW5nIGNvcnJ1cHRlZCBpbnRvIGEgPGNhbj4gYW5kIGFib3J0aW5nIHRyYW5zbWlzc2lvbi4KKworICAgIFRoZSBwcm90b2NvbCBtYXkgYmUgY29uc2lkZXJlZCAicmVjZWl2ZXIgZHJpdmVuIiwgdGhhdCBpcywgdGhlIHNlbmRlciBuZWVkCisgICAgbm90IGF1dG9tYXRpY2FsbHkgcmUtdHJhbnNtaXQsIGFsdGhvdWdoIGl0IGRvZXMgaW4gdGhlIGN1cnJlbnQKKyAgICBpbXBsZW1lbnRhdGlvbnMuCisKKworICAgIDcuMy4yICBSZWNlaXZlX1Byb2dyYW1fQ29uc2lkZXJhdGlvbnMKKyAgICBUaGUgcmVjZWl2ZXIgaGFzIGEgMTAtc2Vjb25kIHRpbWVvdXQuICBJdCBzZW5kcyBhIDxuYWs+IGV2ZXJ5IHRpbWUgaXQKKyAgICB0aW1lcyBvdXQuICBUaGUgcmVjZWl2ZXIncyBmaXJzdCB0aW1lb3V0LCB3aGljaCBzZW5kcyBhIDxuYWs+LCBzaWduYWxzIHRoZQorICAgIHRyYW5zbWl0dGVyIHRvIHN0YXJ0LiAgT3B0aW9uYWxseSwgdGhlIHJlY2VpdmVyIGNvdWxkIHNlbmQgYSA8bmFrPgorICAgIGltbWVkaWF0ZWx5LCBpbiBjYXNlIHRoZSBzZW5kZXIgd2FzIHJlYWR5LiAgVGhpcyB3b3VsZCBzYXZlIHRoZSBpbml0aWFsIDEwCisgICAgc2Vjb25kIHRpbWVvdXQuICBIb3dldmVyLCB0aGUgcmVjZWl2ZXIgTVVTVCBjb250aW51ZSB0byB0aW1lb3V0IGV2ZXJ5IDEwCisgICAgc2Vjb25kcyBpbiBjYXNlIHRoZSBzZW5kZXIgd2Fzbid0IHJlYWR5LgorCisgICAgT25jZSBpbnRvIGEgcmVjZWl2aW5nIGEgYmxvY2ssIHRoZSByZWNlaXZlciBnb2VzIGludG8gYSBvbmUtc2Vjb25kIHRpbWVvdXQKKyAgICBmb3IgZWFjaCBjaGFyYWN0ZXIgYW5kIHRoZSBjaGVja3N1bS4gIElmIHRoZSByZWNlaXZlciB3aXNoZXMgdG8gPG5haz4gYQorICAgIGJsb2NrIGZvciBhbnkgcmVhc29uIChpbnZhbGlkIGhlYWRlciwgdGltZW91dCByZWNlaXZpbmcgZGF0YSksIGl0IG11c3QKKyAgICB3YWl0IGZvciB0aGUgbGluZSB0byBjbGVhci4gIFNlZSAicHJvZ3JhbW1pbmcgdGlwcyIgZm9yIGlkZWFzCisKKyAgICBTeW5jaHJvbml6aW5nOiAgSWYgYSB2YWxpZCBibG9jayBudW1iZXIgaXMgcmVjZWl2ZWQsIGl0IHdpbGwgYmU6IDEpIHRoZQorICAgIGV4cGVjdGVkIG9uZSwgaW4gd2hpY2ggY2FzZSBldmVyeXRoaW5nIGlzIGZpbmU7IG9yIDIpIGEgcmVwZWF0IG9mIHRoZQorICAgIHByZXZpb3VzbHkgcmVjZWl2ZWQgYmxvY2suICBUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIE9LLCBhbmQgb25seQorICAgIGluZGljYXRlcyB0aGF0IHRoZSByZWNlaXZlcnMgPGFjaz4gZ290IGdsaXRjaGVkLCBhbmQgdGhlIHNlbmRlciByZS0KKyAgICB0cmFuc21pdHRlZDsgMykgYW55IG90aGVyIGJsb2NrIG51bWJlciBpbmRpY2F0ZXMgYSBmYXRhbCBsb3NzIG9mCisgICAgc3luY2hyb25pemF0aW9uLCBzdWNoIGFzIHRoZSByYXJlIGNhc2Ugb2YgdGhlIHNlbmRlciBnZXR0aW5nIGEgbGluZS1nbGl0Y2gKKworCisKKyAgICBDaGFwdGVyIDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtb2RlbSBQcm90b2NvbCBPdmVydmlldworCisKKworCisKKworCisgICAgWC9ZTU9ERU0gUHJvdG9jb2wgUmVmZXJlbmNlICAgIEp1bmUgMTggMTk4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIKKworCisKKyAgICB0aGF0IGxvb2tlZCBsaWtlIGFuIDxhY2s+LiAgQWJvcnQgdGhlIHRyYW5zbWlzc2lvbiwgc2VuZGluZyBhIDxjYW4+CisKKworICAgIDcuMy4zICBTZW5kaW5nX3Byb2dyYW1fY29uc2lkZXJhdGlvbnMKKyAgICBXaGlsZSB3YWl0aW5nIGZvciB0cmFuc21pc3Npb24gdG8gYmVnaW4sIHRoZSBzZW5kZXIgaGFzIG9ubHkgYSBzaW5nbGUgdmVyeQorICAgIGxvbmcgdGltZW91dCwgc2F5IG9uZSBtaW51dGUuICBJbiB0aGUgY3VycmVudCBwcm90b2NvbCwgdGhlIHNlbmRlciBoYXMgYQorICAgIDEwIHNlY29uZCB0aW1lb3V0IGJlZm9yZSByZXRyeWluZy4gIEkgc3VnZ2VzdCBOT1QgZG9pbmcgdGhpcywgYW5kIGxldHRpbmcKKyAgICB0aGUgcHJvdG9jb2wgYmUgY29tcGxldGVseSByZWNlaXZlci1kcml2ZW4uICBUaGlzIHdpbGwgYmUgY29tcGF0aWJsZSB3aXRoCisgICAgZXhpc3RpbmcgcHJvZ3JhbXMuCisKKyAgICBXaGVuIHRoZSBzZW5kZXIgaGFzIG5vIG1vcmUgZGF0YSwgaXQgc2VuZHMgYW4gPGVvdD4sIGFuZCBhd2FpdHMgYW4gPGFjaz4sCisgICAgcmVzZW5kaW5nIHRoZSA8ZW90PiBpZiBpdCBkb2Vzbid0IGdldCBvbmUuICBBZ2FpbiwgdGhlIHByb3RvY29sIGNvdWxkIGJlCisgICAgcmVjZWl2ZXItZHJpdmVuLCB3aXRoIHRoZSBzZW5kZXIgb25seSBoYXZpbmcgdGhlIGhpZ2gtbGV2ZWwgMS1taW51dGUKKyAgICB0aW1lb3V0IHRvIGFib3J0LgorCisKKyAgICBIZXJlIGlzIGEgc2FtcGxlIG9mIHRoZSBkYXRhIGZsb3csIHNlbmRpbmcgYSAzLWJsb2NrIG1lc3NhZ2UuICBJdCBpbmNsdWRlcworICAgIHRoZSB0d28gbW9zdCBjb21tb24gbGluZSBoaXRzIC0gYSBnYXJiYWdlZCBibG9jaywgYW5kIGFuIDxhY2s+IHJlcGx5CisgICAgZ2V0dGluZyBnYXJiYWdlZC4gIDx4eD4gcmVwcmVzZW50cyB0aGUgY2hlY2tzdW0gYnl0ZS4KKworICAgICAgICAgICAgICAgICAgRmlndXJlIDEwLiAgRGF0YSBmbG93IGluY2x1ZGluZyBFcnJvciBSZWNvdmVyeQorCisgICAgU0VOREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0VJVkVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgb3V0IGFmdGVyIDEwIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgPG5haz4KKyAgICA8c29oPiAwMSBGRSAtZGF0YS0gPHh4PiAgICAgICAtLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgPGFjaz4KKyAgICA8c29oPiAwMiBGRCAtZGF0YS0geHggICAgICAgICAtLS0+ICAgICAgIChkYXRhIGdldHMgbGluZSBoaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgPG5haz4KKyAgICA8c29oPiAwMiBGRCAtZGF0YS0geHggICAgICAgICAtLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgPGFjaz4KKyAgICA8c29oPiAwMyBGQyAtZGF0YS0geHggICAgICAgICAtLS0+CisgICAgKGFjayBnZXRzIGdhcmJhZ2VkKSAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgPGFjaz4KKyAgICA8c29oPiAwMyBGQyAtZGF0YS0geHggICAgICAgICAtLS0+ICAgICAgICAgICAgICA8YWNrPgorICAgIDxlb3Q+ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tICAgICAgIDxhbnl0aGluZyBleGNlcHQgYWNrPgorICAgIDxlb3Q+ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tICAgICAgICAgICAgICA8YWNrPgorICAgIChmaW5pc2hlZCkKKworICAgIDcuNCAgUHJvZ3JhbW1pbmcgVGlwcworCisgICAgICAgKyBUaGUgY2hhcmFjdGVyLXJlY2VpdmUgc3Vicm91dGluZSBzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBwYXJhbWV0ZXIKKyAgICAgICAgIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQuICBUaGUgcmVjZWl2ZXIgc2hvdWxkIGZpcnN0CisgICAgICAgICBjYWxsIGl0IHdpdGggYSB0aW1lIG9mIDEwLCB0aGVuIDxuYWs+IGFuZCB0cnkgYWdhaW4sIDEwIHRpbWVzLgorCisgICAgICAgICBBZnRlciByZWNlaXZpbmcgdGhlIDxzb2g+LCB0aGUgcmVjZWl2ZXIgc2hvdWxkIGNhbGwgdGhlIGNoYXJhY3RlcgorICAgICAgICAgcmVjZWl2ZSBzdWJyb3V0aW5lIHdpdGggYSAxLXNlY29uZCB0aW1lb3V0LCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUKKyAgICAgICAgIG1lc3NhZ2UgYW5kIHRoZSA8Y2tzdW0+LiAgU2luY2UgdGhleSBhcmUgc2VudCBhcyBhIGNvbnRpbnVvdXMgc3RyZWFtLAorICAgICAgICAgdGltaW5nIG91dCBvZiB0aGlzIGltcGxpZXMgYSBzZXJpb3VzIGxpa2UgZ2xpdGNoIHRoYXQgY2F1c2VkLCBzYXksCisgICAgICAgICAxMjcgY2hhcmFjdGVycyB0byBiZSBzZWVuIGluc3RlYWQgb2YgMTI4LgorCisKKworICAgIENoYXB0ZXIgNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1vZGVtIFByb3RvY29sIE92ZXJ2aWV3CisKKworCisKKworCisKKyAgICBYL1lNT0RFTSBQcm90b2NvbCBSZWZlcmVuY2UgICAgSnVuZSAxOCAxOTg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMworCisKKworICAgICAgICsgV2hlbiB0aGUgcmVjZWl2ZXIgd2lzaGVzIHRvIDxuYWs+LCBpdCBzaG91bGQgY2FsbCBhICJQVVJHRSIKKyAgICAgICAgIHN1YnJvdXRpbmUsIHRvIHdhaXQgZm9yIHRoZSBsaW5lIHRvIGNsZWFyLiAgUmVjYWxsIHRoZSBzZW5kZXIgdG9zc2VzCisgICAgICAgICBhbnkgY2hhcmFjdGVycyBpbiBpdHMgVUFSVCBidWZmZXIgaW1tZWRpYXRlbHkgdXBvbiBjb21wbGV0aW5nIHNlbmRpbmcKKyAgICAgICAgIGEgYmxvY2ssIHRvIGVuc3VyZSBubyBnbGl0Y2hlcyB3ZXJlIG1pcy0gaW50ZXJwcmV0ZWQuCisKKyAgICAgICAgIFRoZSBtb3N0IGNvbW1vbiB0ZWNobmlxdWUgaXMgZm9yICJQVVJHRSIgdG8gY2FsbCB0aGUgY2hhcmFjdGVyCisgICAgICAgICByZWNlaXZlIHN1YnJvdXRpbmUsIHNwZWNpZnlpbmcgYSAxLXNlY29uZCB0aW1lb3V0LFsxXSBhbmQgbG9vcGluZworICAgICAgICAgYmFjayB0byBQVVJHRSB1bnRpbCBhIHRpbWVvdXQgb2NjdXJzLiAgVGhlIDxuYWs+IGlzIHRoZW4gc2VudCwKKyAgICAgICAgIGVuc3VyaW5nIHRoZSBvdGhlciBlbmQgd2lsbCBzZWUgaXQuCisKKyAgICAgICArIFlvdSBtYXkgd2lzaCB0byBhZGQgY29kZSByZWNvbW1lbmRlZCBieSBKb2huIE1haHIgdG8geW91ciBjaGFyYWN0ZXIKKyAgICAgICAgIHJlY2VpdmUgcm91dGluZSAtIHRvIHNldCBhbiBlcnJvciBmbGFnIGlmIHRoZSBVQVJUIHNob3dzIGZyYW1pbmcKKyAgICAgICAgIGVycm9yLCBvciBvdmVycnVuLiAgVGhpcyB3aWxsIGhlbHAgY2F0Y2ggYSBmZXcgbW9yZSBnbGl0Y2hlcyAtIHRoZQorICAgICAgICAgbW9zdCBjb21tb24gb2Ygd2hpY2ggaXMgYSBoaXQgaW4gdGhlIGhpZ2ggYml0cyBvZiB0aGUgYnl0ZSBpbiB0d28KKyAgICAgICAgIGNvbnNlY3V0aXZlIGJ5dGVzLiAgVGhlIDxja3N1bT4gY29tZXMgb3V0IE9LIHNpbmNlIGNvdW50aW5nIGluIDEtYnl0ZQorICAgICAgICAgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0IG9mIGFkZGluZyA4MEggKyA4MEggYXMgd2l0aCBhZGRpbmcgMDBIICsKKyAgICAgICAgIDAwSC4KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBfX19fX19fX19fCisKKyAgICAgMS4gVGhlc2UgdGltZXMgc2hvdWxkIGJlIGFkanVzdGVkIGZvciB1c2Ugd2l0aCB0aW1lc2hhcmluZyBzeXN0ZW1zLgorCisKKworCisgICAgQ2hhcHRlciA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbW9kZW0gUHJvdG9jb2wgT3ZlcnZpZXcKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0CisKKworCisgICAgOC4gIFhNT0RFTS9DUkMgT3ZlcnZpZXcKKworICAgIE9yaWdpbmFsIDEvMTMvODUgYnkgSm9obiBCeXJucyAtLSBDUkMgb3B0aW9uLgorCisgICAgUGxlYXNlIHBhc3Mgb24gYW55IHJlcG9ydHMgb2YgZXJyb3JzIGluIHRoaXMgZG9jdW1lbnQgb3Igc3VnZ2VzdGlvbnMgZm9yCisgICAgaW1wcm92ZW1lbnQgdG8gbWUgdmlhIFdhcmQncy9DQkJTIGF0ICgzMTIpIDg0OS0xMTMyLCBvciBieSB2b2ljZSBhdCAoMzEyKQorICAgIDg4NS0xMTA1LgorCisgICAgVGhlIENSQyB1c2VkIGluIHRoZSBNb2RlbSBQcm90b2NvbCBpcyBhbiBhbHRlcm5hdGUgZm9ybSBvZiBibG9jayBjaGVjaworICAgIHdoaWNoIHByb3ZpZGVzIG1vcmUgcm9idXN0IGVycm9yIGRldGVjdGlvbiB0aGFuIHRoZSBvcmlnaW5hbCBjaGVja3N1bS4KKyAgICBBbmRyZXcgUy4gVGFuZW5iYXVtIHNheXMgaW4gaGlzIGJvb2ssIENvbXB1dGVyIE5ldHdvcmtzLCB0aGF0IHRoZSBDUkMtCisgICAgQ0NJVFQgdXNlZCBieSB0aGUgTW9kZW0gUHJvdG9jb2wgd2lsbCBkZXRlY3QgYWxsIHNpbmdsZSBhbmQgZG91YmxlIGJpdAorICAgIGVycm9ycywgYWxsIGVycm9ycyB3aXRoIGFuIG9kZCBudW1iZXIgb2YgYml0cywgYWxsIGJ1cnN0IGVycm9ycyBvZiBsZW5ndGgKKyAgICAxNiBvciBsZXNzLCA5OS45OTclIG9mIDE3LWJpdCBlcnJvciBidXJzdHMsIGFuZCA5OS45OTglIG9mIDE4LWJpdCBhbmQKKyAgICBsb25nZXIgYnVyc3RzLlsxXQorCisgICAgVGhlIGNoYW5nZXMgdG8gdGhlIE1vZGVtIFByb3RvY29sIHRvIHJlcGxhY2UgdGhlIGNoZWNrc3VtIHdpdGggdGhlIENSQyBhcmUKKyAgICBzdHJhaWdodCBmb3J3YXJkLiBJZiB0aGF0IHdlcmUgYWxsIHRoYXQgd2UgZGlkIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvCisgICAgY29tbXVuaWNhdGUgYmV0d2VlbiBhIHByb2dyYW0gdXNpbmcgdGhlIG9sZCBjaGVja3N1bSBwcm90b2NvbCBhbmQgb25lCisgICAgdXNpbmcgdGhlIG5ldyBDUkMgcHJvdG9jb2wuIEFuIGluaXRpYWwgaGFuZHNoYWtlIHdhcyBhZGRlZCB0byBzb2x2ZSB0aGlzCisgICAgcHJvYmxlbS4gVGhlIGhhbmRzaGFrZSBhbGxvd3MgYSByZWNlaXZpbmcgcHJvZ3JhbSB3aXRoIENSQyBjYXBhYmlsaXR5IHRvCisgICAgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlbmRpbmcgcHJvZ3JhbSBzdXBwb3J0cyB0aGUgQ1JDIG9wdGlvbiwgYW5kIHRvCisgICAgc3dpdGNoIGl0IHRvIENSQyBtb2RlIGlmIGl0IGRvZXMuIFRoaXMgaGFuZHNoYWtlIGlzIGRlc2lnbmVkIHNvIHRoYXQgaXQKKyAgICB3aWxsIHdvcmsgcHJvcGVybHkgd2l0aCBwcm9ncmFtcyB3aGljaCBpbXBsZW1lbnQgb25seSB0aGUgb3JpZ2luYWwKKyAgICBwcm90b2NvbC4gQSBkZXNjcmlwdGlvbiBvZiB0aGlzIGhhbmRzaGFrZSBpcyBwcmVzZW50ZWQgaW4gc2VjdGlvbiAxMC4KKworICAgICAgICAgICAgICAgIEZpZ3VyZSAxMS4gIE1lc3NhZ2UgQmxvY2sgTGV2ZWwgUHJvdG9jb2wsIENSQyBtb2RlCisKKyAgICBFYWNoIGJsb2NrIG9mIHRoZSB0cmFuc2ZlciBpbiBDUkMgbW9kZSBsb29rcyBsaWtlOgorICAgICAgICAgPFNPSD48YmxrICM+PDI1NS1ibGsgIz48LS0xMjggZGF0YSBieXRlcy0tPjxDUkMgaGk+PENSQyBsbz4KKyAgICBpbiB3aGljaDoKKyAgICA8U09IPiAgICAgICAgPSAwMSBoZXgKKyAgICA8YmxrICM+ICAgICAgPSBiaW5hcnkgbnVtYmVyLCBzdGFydHMgYXQgMDEgaW5jcmVtZW50cyBieSAxLCBhbmQKKyAgICAgICAgICAgICAgICAgICB3cmFwcyAwRkZIIHRvIDAwSCAobm90IHRvIDAxKQorICAgIDwyNTUtYmxrICM+ICA9IG9uZXMgY29tcGxlbWVudCBvZiBibGsgIy4KKyAgICA8Q1JDIGhpPiAgICAgPSBieXRlIGNvbnRhaW5pbmcgdGhlIDggaGkgb3JkZXIgY29lZmZpY2llbnRzIG9mIHRoZSBDUkMuCisgICAgPENSQyBsbz4gICAgID0gYnl0ZSBjb250YWluaW5nIHRoZSA4IGxvIG9yZGVyIGNvZWZmaWNpZW50cyBvZiB0aGUgQ1JDLgorCisgICAgOC4xICBDUkMgQ2FsY3VsYXRpb24KKworICAgIDguMS4xICBGb3JtYWxfRGVmaW5pdGlvbgorICAgIFRvIGNhbGN1bGF0ZSB0aGUgMTYgYml0IENSQyB0aGUgbWVzc2FnZSBiaXRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHRoZQorICAgIGNvZWZmaWNpZW50cyBvZiBhIHBvbHlub21pYWwuIFRoaXMgbWVzc2FnZSBwb2x5bm9taWFsIGlzIGZpcnN0IG11bHRpcGxpZWQKKyAgICBieSBYXjE2IGFuZCB0aGVuIGRpdmlkZWQgYnkgdGhlIGdlbmVyYXRvciBwb2x5bm9taWFsIChYXjE2ICsgWF4xMiArIFheNSArCisKKworICAgIF9fX19fX19fX18KKworICAgICAxLiBUaGlzIHJlbGlhYmlsaXR5IGZpZ3VyZSBpcyBtaXNsZWFkaW5nIGJlY2F1c2UgWE1PREVNJ3MgY3JpdGljYWwKKyAgICAgICAgc3VwZXJ2aXNvcnkgZnVuY3Rpb25zIGFyZSBub3QgcHJvdGVjdGVkIGJ5IHRoaXMgQ1JDLgorCisKKworCisgICAgQ2hhcHRlciA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbW9kZW0gUHJvdG9jb2wgT3ZlcnZpZXcKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1CisKKworCisgICAgMSkgdXNpbmcgbW9kdWxvIHR3byBhcml0aG1ldGljLiBUaGUgcmVtYWluZGVyIGxlZnQgYWZ0ZXIgdGhlIGRpdmlzaW9uIGlzCisgICAgdGhlIGRlc2lyZWQgQ1JDLiBTaW5jZSBhIG1lc3NhZ2UgYmxvY2sgaW4gdGhlIE1vZGVtIFByb3RvY29sIGlzIDEyOCBieXRlcworICAgIG9yIDEwMjQgYml0cywgdGhlIG1lc3NhZ2UgcG9seW5vbWlhbCB3aWxsIGJlIG9mIG9yZGVyIFheMTAyMy4gVGhlIGhpIG9yZGVyCisgICAgYml0IG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlIGJsb2NrIGlzIHRoZSBjb2VmZmljaWVudCBvZiBYXjEwMjMgaW4KKyAgICB0aGUgbWVzc2FnZSBwb2x5bm9taWFsLiAgVGhlIGxvIG9yZGVyIGJpdCBvZiB0aGUgbGFzdCBieXRlIG9mIHRoZSBtZXNzYWdlCisgICAgYmxvY2sgaXMgdGhlIGNvZWZmaWNpZW50IG9mIFheMCBpbiB0aGUgbWVzc2FnZSBwb2x5bm9taWFsLgorCisgICAgICAgICAgICAgICBGaWd1cmUgMTIuICBFeGFtcGxlIG9mIENSQyBDYWxjdWxhdGlvbiB3cml0dGVuIGluIEMKKworICAgIFRoZSBmb2xsb3dpbmcgWE1PREVNIGNyYyByb3V0aW5lIGlzIHRha2VuIGZyb20gInJic2IuYyIuICBQbGVhc2UgcmVmZXIgdG8KKyAgICB0aGUgc291cmNlIGNvZGUgZm9yIHRoZXNlIHByb2dyYW1zIChjb250YWluZWQgaW4gUlpTWi5aT08pIGZvciB1c2FnZS4gIEEKKyAgICBmYXN0IHRhYmxlIGRyaXZlbiB2ZXJzaW9uIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhpcyBmaWxlLgorCisgICAgLyogdXBkYXRlIENSQyAqLworICAgIHVuc2lnbmVkIHNob3J0CisgICAgdXBkY3JjKGMsIGNyYykKKyAgICByZWdpc3RlciBjOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNyYzsKKyAgICB7CisgICAgICAgICAgICByZWdpc3RlciBjb3VudDsKKworICAgICAgICAgICAgZm9yIChjb3VudD04OyAtLWNvdW50Pj0wOykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3JjICYgMHg4MDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjIDw8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYyArPSAoKChjPDw9MSkgJiAwNDAwKSAgIT0gIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYyBePSAweDEwMjE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjIDw8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYyArPSAoKChjPDw9MSkgJiAwNDAwKSAgIT0gIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY3JjOworICAgIH0KKworICAgIDguMiAgQ1JDIEZpbGUgTGV2ZWwgUHJvdG9jb2wgQ2hhbmdlcworCisgICAgOC4yLjEgIENvbW1vbl90b19Cb3RoX1NlbmRlcl9hbmRfUmVjZWl2ZXIKKyAgICBUaGUgb25seSBjaGFuZ2UgdG8gdGhlIEZpbGUgTGV2ZWwgUHJvdG9jb2wgZm9yIHRoZSBDUkMgb3B0aW9uIGlzIHRoZQorICAgIGluaXRpYWwgaGFuZHNoYWtlIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGJvdGggdGhlIHNlbmRpbmcgYW5kIHRoZQorICAgIHJlY2VpdmluZyBwcm9ncmFtcyBzdXBwb3J0IHRoZSBDUkMgbW9kZS4gQWxsIE1vZGVtIFByb2dyYW1zIHNob3VsZCBzdXBwb3J0CisgICAgdGhlIGNoZWNrc3VtIG1vZGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucy4gIEEgcmVjZWl2aW5nCisgICAgcHJvZ3JhbSB0aGF0IHdpc2hlcyB0byByZWNlaXZlIGluIENSQyBtb2RlIGltcGxlbWVudHMgdGhlIG1vZGUgc2V0dGluZworICAgIGhhbmRzaGFrZSBieSBzZW5kaW5nIGEgPEM+IGluIHBsYWNlIG9mIHRoZSBpbml0aWFsIDxuYWs+LiAgSWYgdGhlIHNlbmRpbmcKKyAgICBwcm9ncmFtIHN1cHBvcnRzIENSQyBtb2RlIGl0IHdpbGwgcmVjb2duaXplIHRoZSA8Qz4gYW5kIHdpbGwgc2V0IGl0c2VsZgorICAgIGludG8gQ1JDIG1vZGUsIGFuZCByZXNwb25kIGJ5IHNlbmRpbmcgdGhlIGZpcnN0IGJsb2NrIGFzIGlmIGEgPG5haz4gaGFkCisgICAgYmVlbiByZWNlaXZlZC4gSWYgdGhlIHNlbmRpbmcgcHJvZ3JhbSBkb2VzIG5vdCBzdXBwb3J0IENSQyBtb2RlIGl0IHdpbGwKKyAgICBub3QgcmVzcG9uZCB0byB0aGUgPEM+IGF0IGFsbC4gQWZ0ZXIgdGhlIHJlY2VpdmVyIGhhcyBzZW50IHRoZSA8Qz4gaXQgd2lsbAorICAgIHdhaXQgdXAgdG8gMyBzZWNvbmRzIGZvciB0aGUgPHNvaD4gdGhhdCBzdGFydHMgdGhlIGZpcnN0IGJsb2NrLiBJZiBpdAorICAgIHJlY2VpdmVzIGEgPHNvaD4gd2l0aGluIDMgc2Vjb25kcyBpdCB3aWxsIGFzc3VtZSB0aGUgc2VuZGVyIHN1cHBvcnRzIENSQworICAgIG1vZGUgYW5kIHdpbGwgcHJvY2VlZCB3aXRoIHRoZSBmaWxlIGV4Y2hhbmdlIGluIENSQyBtb2RlLiBJZiBubyA8c29oPiBpcworCisKKworICAgIENoYXB0ZXIgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1vZGVtIFByb3RvY29sIE92ZXJ2aWV3CisKKworCisKKworCisKKyAgICBYL1lNT0RFTSBQcm90b2NvbCBSZWZlcmVuY2UgICAgSnVuZSAxOCAxOTg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNgorCisKKworICAgIHJlY2VpdmVkIHdpdGhpbiAzIHNlY29uZHMgdGhlIHJlY2VpdmVyIHdpbGwgc3dpdGNoIHRvIGNoZWNrc3VtIG1vZGUsIHNlbmQKKyAgICBhIDxuYWs+LCBhbmQgcHJvY2VlZCBpbiBjaGVja3N1bSBtb2RlLiBJZiB0aGUgcmVjZWl2ZXIgd2lzaGVzIHRvIHVzZQorICAgIGNoZWNrc3VtIG1vZGUgaXQgc2hvdWxkIHNlbmQgYW4gaW5pdGlhbCA8bmFrPiBhbmQgdGhlIHNlbmRpbmcgcHJvZ3JhbQorICAgIHNob3VsZCByZXNwb25kIHRvIHRoZSA8bmFrPiBhcyBkZWZpbmVkIGluIHRoZSBvcmlnaW5hbCBNb2RlbSBQcm90b2NvbC4KKyAgICBBZnRlciB0aGUgbW9kZSBoYXMgYmVlbiBzZXQgYnkgdGhlIGluaXRpYWwgPEM+IG9yIDxuYWs+IHRoZSBwcm90b2NvbAorICAgIGZvbGxvd3MgdGhlIG9yaWdpbmFsIE1vZGVtIFByb3RvY29sIGFuZCBpcyBpZGVudGljYWwgd2hldGhlciB0aGUgY2hlY2tzdW0KKyAgICBvciBDUkMgaXMgYmVpbmcgdXNlZC4KKworCisgICAgOC4yLjIgIFJlY2VpdmVfUHJvZ3JhbV9Db25zaWRlcmF0aW9ucworICAgIFRoZXJlIGFyZSBhdCBsZWFzdCA0IHRoaW5ncyB0aGF0IGNhbiBnbyB3cm9uZyB3aXRoIHRoZSBtb2RlIHNldHRpbmcKKyAgICBoYW5kc2hha2UuCisKKyAgICAgIDEuICB0aGUgaW5pdGlhbCA8Qz4gY2FuIGJlIGdhcmJsZWQgb3IgbG9zdC4KKworICAgICAgMi4gIHRoZSBpbml0aWFsIDxzb2g+IGNhbiBiZSBnYXJibGVkLgorCisgICAgICAzLiAgdGhlIGluaXRpYWwgPEM+IGNhbiBiZSBjaGFuZ2VkIHRvIGEgPG5haz4uCisKKyAgICAgIDQuICB0aGUgaW5pdGlhbCA8bmFrPiBmcm9tIGEgcmVjZWl2ZXIgd2hpY2ggd2FudHMgdG8gcmVjZWl2ZSBpbiBjaGVja3N1bQorICAgICAgICAgIGNhbiBiZSBjaGFuZ2VkIHRvIGEgPEM+LgorCisgICAgVGhlIGZpcnN0IHByb2JsZW0gY2FuIGJlIHNvbHZlZCBpZiB0aGUgcmVjZWl2ZXIgc2VuZHMgYSBzZWNvbmQgPEM+IGFmdGVyCisgICAgaXQgdGltZXMgb3V0IHRoZSBmaXJzdCB0aW1lLiBUaGlzIHByb2Nlc3MgY2FuIGJlIHJlcGVhdGVkIHNldmVyYWwgdGltZXMuCisgICAgSXQgbXVzdCBub3QgYmUgcmVwZWF0ZWQgdG9vIG1hbnkgdGltZXMgYmVmb3JlIHNlbmRpbmcgYSA8bmFrPiBhbmQKKyAgICBzd2l0Y2hpbmcgdG8gY2hlY2tzdW0gbW9kZSBvciBhIHNlbmRpbmcgcHJvZ3JhbSB3aXRob3V0IENSQyBzdXBwb3J0IG1heQorICAgIHRpbWUgb3V0IGFuZCBhYm9ydC4gUmVwZWF0aW5nIHRoZSA8Qz4gd2lsbCBhbHNvIGZpeCB0aGUgc2Vjb25kIHByb2JsZW0gaWYKKyAgICB0aGUgc2VuZGluZyBwcm9ncmFtIGNvb3BlcmF0ZXMgYnkgcmVzcG9uZGluZyBhcyBpZiBhIDxuYWs+IHdlcmUgcmVjZWl2ZWQKKyAgICBpbnN0ZWFkIG9mIGlnbm9yaW5nIHRoZSBleHRyYSA8Qz4uCisKKyAgICBJdCBpcyBwb3NzaWJsZSB0byBmaXggcHJvYmxlbXMgMyBhbmQgNCBidXQgcHJvYmFibHkgbm90IHdvcnRoIHRoZSB0cm91YmxlCisgICAgc2luY2UgdGhleSB3aWxsIG9jY3VyIHZlcnkgaW5mcmVxdWVudGx5LiBUaGV5IGNvdWxkIGJlIGZpeGVkIGJ5IHN3aXRjaGluZworICAgIG1vZGVzIGluIGVpdGhlciB0aGUgc2VuZGluZyBvciB0aGUgcmVjZWl2aW5nIHByb2dyYW0gYWZ0ZXIgYSBsYXJnZSBudW1iZXIKKyAgICBvZiBzdWNjZXNzaXZlIDxuYWs+cy4gVGhpcyBzb2x1dGlvbiB3b3VsZCByaXNrIG90aGVyIHByb2JsZW1zIGhvd2V2ZXIuCisKKworICAgIDguMi4zICBTZW5kaW5nX1Byb2dyYW1fQ29uc2lkZXJhdGlvbnMKKyAgICBUaGUgc2VuZGluZyBwcm9ncmFtIHNob3VsZCBzdGFydCBpbiB0aGUgY2hlY2tzdW0gbW9kZS4gVGhpcyB3aWxsIGluc3VyZQorICAgIGNvbXBhdGliaWxpdHkgd2l0aCBjaGVja3N1bSBvbmx5IHJlY2VpdmluZyBwcm9ncmFtcy4gQW55dGltZSBhIDxDPiBpcworICAgIHJlY2VpdmVkIGJlZm9yZSB0aGUgZmlyc3QgPG5haz4gb3IgPGFjaz4gdGhlIHNlbmRpbmcgcHJvZ3JhbSBzaG91bGQgc2V0CisgICAgaXRzZWxmIGludG8gQ1JDIG1vZGUgYW5kIHJlc3BvbmQgYXMgaWYgYSA8bmFrPiB3ZXJlIHJlY2VpdmVkLiBUaGUgc2VuZGVyCisgICAgc2hvdWxkIHJlc3BvbmQgdG8gYWRkaXRpb25hbCA8Qz5zIGFzIGlmIHRoZXkgd2VyZSA8bmFrPnMgdW50aWwgdGhlIGZpcnN0CisgICAgPGFjaz4gaXMgcmVjZWl2ZWQuIFRoaXMgd2lsbCBhc3Npc3QgdGhlIHJlY2VpdmluZyBwcm9ncmFtIGluIGRldGVybWluaW5nCisgICAgdGhlIGNvcnJlY3QgbW9kZSB3aGVuIHRoZSA8c29oPiBpcyBsb3N0IG9yIGdhcmJsZWQuIEFmdGVyIHRoZSBmaXJzdCA8YWNrPgorICAgIGlzIHJlY2VpdmVkIHRoZSBzZW5kaW5nIHByb2dyYW0gc2hvdWxkIGlnbm9yZSA8Qz5zLgorCisKKworCisKKworCisKKworICAgIENoYXB0ZXIgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1vZGVtIFByb3RvY29sIE92ZXJ2aWV3CisKKworCisKKworCisKKyAgICBYL1lNT0RFTSBQcm90b2NvbCBSZWZlcmVuY2UgICAgSnVuZSAxOCAxOTg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNworCisKKworICAgIDguMyAgRGF0YSBGbG93IEV4YW1wbGVzIHdpdGggQ1JDIE9wdGlvbgorCisgICAgSGVyZSBpcyBhIGRhdGEgZmxvdyBleGFtcGxlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgcmVjZWl2ZXIgcmVxdWVzdHMKKyAgICB0cmFuc21pc3Npb24gaW4gdGhlIENSQyBtb2RlIGJ1dCB0aGUgc2VuZGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIENSQworICAgIG9wdGlvbi4gVGhpcyBleGFtcGxlIGFsc28gaW5jbHVkZXMgdmFyaW91cyB0cmFuc21pc3Npb24gZXJyb3JzLiAgPHh4PgorICAgIHJlcHJlc2VudHMgdGhlIGNoZWNrc3VtIGJ5dGUuCisKKyAgICAgICAgICBGaWd1cmUgMTMuICBEYXRhIEZsb3c6IFJlY2VpdmVyIGhhcyBDUkMgT3B0aW9uLCBTZW5kZXIgRG9lc24ndAorCisgICAgU0VOREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0VJVkVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgICA8Qz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIG91dCBhZnRlciAzIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgICA8Qz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIG91dCBhZnRlciAzIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgICA8Qz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIG91dCBhZnRlciAzIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgICA8Qz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIG91dCBhZnRlciAzIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgICA8bmFrPgorICAgIDxzb2g+IDAxIEZFIC1kYXRhLSA8eHg+IC0tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tICAgICAgICAgICAgICAgIDxhY2s+CisgICAgPHNvaD4gMDIgRkQgLWRhdGEtIDx4eD4gLS0tPiAgICAgICAgKGRhdGEgZ2V0cyBsaW5lIGhpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tICAgICAgICAgICAgICAgIDxuYWs+CisgICAgPHNvaD4gMDIgRkQgLWRhdGEtIDx4eD4gLS0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0gICAgICAgICAgICAgICAgPGFjaz4KKyAgICA8c29oPiAwMyBGQyAtZGF0YS0gPHh4PiAtLS0+CisgICAgICAgKGFjayBnZXRzIGdhcmJhZ2VkKSAgPC0tLSAgICAgICAgICAgICAgICA8YWNrPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgb3V0IGFmdGVyIDEwIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgICA8bmFrPgorICAgIDxzb2g+IDAzIEZDIC1kYXRhLSA8eHg+IC0tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tICAgICAgICAgICAgICAgIDxhY2s+CisgICAgPGVvdD4gICAgICAgICAgICAgICAgICAgLS0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0gICAgICAgICAgICAgICAgPGFjaz4KKworICAgIEhlcmUgaXMgYSBkYXRhIGZsb3cgZXhhbXBsZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHJlY2VpdmVyIHJlcXVlc3RzCisgICAgdHJhbnNtaXNzaW9uIGluIHRoZSBDUkMgbW9kZSBhbmQgdGhlIHNlbmRlciBzdXBwb3J0cyB0aGUgQ1JDIG9wdGlvbi4gIFRoaXMKKyAgICBleGFtcGxlIGFsc28gaW5jbHVkZXMgdmFyaW91cyB0cmFuc21pc3Npb24gZXJyb3JzLiAgPHh4eHg+IHJlcHJlc2VudHMgdGhlCisgICAgMiBDUkMgYnl0ZXMuCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBDaGFwdGVyIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtb2RlbSBQcm90b2NvbCBPdmVydmlldworCisKKworCisKKworCisgICAgWC9ZTU9ERU0gUHJvdG9jb2wgUmVmZXJlbmNlICAgIEp1bmUgMTggMTk4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgKKworCisKKyAgICAgICAgICAgICAgIEZpZ3VyZSAxNC4gIFJlY2VpdmVyIGFuZCBTZW5kZXIgQm90aCBoYXZlIENSQyBPcHRpb24KKworICAgIFNFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0VJVkVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tICAgICAgICAgICAgICAgICA8Qz4KKyAgICA8c29oPiAwMSBGRSAtZGF0YS0gPHh4eHg+IC0tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0gICAgICAgICAgICAgICAgIDxhY2s+CisgICAgPHNvaD4gMDIgRkQgLWRhdGEtIDx4eHh4PiAtLS0+ICAgICAgICAgKGRhdGEgZ2V0cyBsaW5lIGhpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0gICAgICAgICAgICAgICAgIDxuYWs+CisgICAgPHNvaD4gMDIgRkQgLWRhdGEtIDx4eHh4PiAtLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tICAgICAgICAgICAgICAgICA8YWNrPgorICAgIDxzb2g+IDAzIEZDIC1kYXRhLSA8eHh4eD4gLS0tPgorICAgIChhY2sgZ2V0cyBnYXJiYWdlZCkgICAgICAgPC0tLSAgICAgICAgICAgICAgICAgPGFjaz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgb3V0IGFmdGVyIDEwIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tICAgICAgICAgICAgICAgICA8bmFrPgorICAgIDxzb2g+IDAzIEZDIC1kYXRhLSA8eHh4eD4gLS0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLSAgICAgICAgICAgICAgICAgPGFjaz4KKyAgICA8ZW90PiAgICAgICAgICAgICAgICAgICAgIC0tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0gICAgICAgICAgICAgICAgIDxhY2s+CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgQ2hhcHRlciA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbW9kZW0gUHJvdG9jb2wgT3ZlcnZpZXcKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5CisKKworCisgICAgOS4gIE1PUkUgSU5GT1JNQVRJT04KKworICAgIFBsZWFzZSBjb250YWN0IE9tZW4gVGVjaG5vbG9neSBmb3IgdHJvZmYgc291cmNlIGZpbGVzIGFuZCB0eXBlc2V0IGNvcGllcworICAgIG9mIHRoaXMgZG9jdW1lbnQuCisKKworICAgIDkuMSAgVGVsZUdvZHppbGxhIEJ1bGxldGluIEJvYXJkCisKKyAgICBNb3JlIGluZm9ybWF0aW9uIG1heSBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIFRlbGVHb2R6aWxsYSBhdCA1MDMtNjIxLTM3NDYuCisgICAgU3BlZWQgZGV0ZWN0aW9uIGlzIGF1dG9tYXRpYyBmb3IgMTIwMCwgMjQwMCBhbmQgMTkyMDAoVGVsZWJpdCBQRVApIGJwcy4KKyAgICBUcmFpbEJsYXplciBtb2RlbSB1c2VycyBtYXkgaXNzdWUgdGhlIFRlbGVHb2R6aWxsYSB0cmFpbGJsYXplciBjb21tYW5kIHRvCisgICAgc3dpdGggdG8gMTkyMDAgYnBzIG9uY2UgdGhleSBoYXZlIGxvZ2dlZCBpbi4KKworICAgIEludGVyZXN0aW5nIGZpbGVzIGluY2x1ZGUgUlpTWi5aT08gKEMgc291cmNlIGNvZGUpLCBZWk1PREVNLlpPTyAoT2ZmaWNpYWwKKyAgICBYTU9ERU0sIFlNT0RFTSwgYW5kIFpNT0RFTSBwcm90b2NvbCBkZXNjcmlwdGlvbnMpLCBaQ09NTUVYRS5BUkMsCisgICAgWkNPTU1ET0MuQVJDLCBhbmQgWkNPTU1ITFAuQVJDIChQQy1ET1Mgc2hhcmV3YXJlIGNvbW0gcHJvZ3JhbSB3aXRoIFhNT0RFTSwKKyAgICBUcnVlIFlNT0RFTShUTSksIFpNT0RFTSwgS2VybWl0IFNsaWRpbmcgV2luZG93cywgVGVsaW5rLCBNT0RFTTcgQmF0Y2gsCisgICAgc2NyaXB0IGxhbmd1YWdlLCBldGMuKS4KKworCisgICAgOS4yICBVbml4IFVVQ1AgQWNjZXNzCisKKyAgICBVVUNQIHNpdGVzIGNhbiBvYnRhaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgdXVjcCBvbWVuIS91L2NhZi9wdWJsaWMveW1vZGVtLmRvYyAvdG1wCisgICAgQSBjb250aW51YWxseSB1cGRhdGVkIGxpc3Qgb2YgYXZhaWxhYmxlIGZpbGVzIGlzIHN0b3JlZCBpbgorICAgIC91c3Ivc3Bvb2wvdXVjcHB1YmxpYy9GSUxFUy4gIFdoZW4gcmV0cmlldmluZyB0aGVzZSBmaWxlcyB3aXRoIHV1Y3AsCisgICAgcmVtZW1iZXIgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG9uIHlvdXIgc3lzdGVtIG11c3QgYmUgd3JpdGVhYmxlCisgICAgYnkgYW55b25lLCBvciB0aGUgVVVDUCB0cmFuc2ZlciB3aWxsIGZhaWwuCisKKyAgICBUaGUgZm9sbG93aW5nIEwuc3lzIGxpbmUgY2FsbHMgVGVsZUdvZHppbGxhIChQcm8tWUFNIGluIGhvc3Qgb3BlcmF0aW9uKS4KKyAgICBUZWxlR29kemlsbGEgZGV0ZXJtaW5lcyB0aGUgaW5jb21pbmcgc3BlZWQgYXV0b21hdGljYWxseS4KKworICAgIEluIHJlc3BvbnNlIHRvICJOYW1lIFBsZWFzZToiIHV1Y2ljbyBnaXZlcyB0aGUgUHJvLVlBTSAibGluayIgY29tbWFuZCBhcyBhCisgICAgdXNlciBuYW1lLiAgVGhlIHBhc3N3b3JkIChHaXpub2lkKSBjb250cm9scyBhY2Nlc3MgdG8gdGhlIFhlbml4IHN5c3RlbQorICAgIGNvbm5lY3RlZCB0byB0aGUgSUJNIFBDJ3Mgb3RoZXIgc2VyaWFsIHBvcnQuICBDb21tdW5pY2F0aW9ucyBiZXR3ZWVuCisgICAgUHJvLVlBTSBhbmQgWGVuaXggdXNlIDk2MDAgYnBzOyBZQU0gY29udmVydHMgdGhpcyB0byB0aGUgY2FsbGVyJ3Mgc3BlZWQuCisKKyAgICBGaW5hbGx5LCB0aGUgY2FsbGluZyB1dWNpY28gbG9ncyBpbiBhcyB1dWNwLgorCisgICAgb21lbiBBbnkgQUNVIDI0MDAgMS01MDMtNjIxLTM3NDYgc2U6LS1zZTogbGluayBvcmQ6IEdpem5vaWQgaW46LS1pbjogdXVjcAorCisKKworICAgIDEwLiAgUkVWSVNJT05TCisKKyAgICA2LTE4LTg4IEZ1cnRoZXIgcmV2aXNlZCBmb3IgY2xhcml0eS4gIENvcnJlY3RlZCBibG9jayBudW1iZXJpbmcgaW4gdHdvCisgICAgZXhhbXBsZXMuCisgICAgMTAtMjctODcgT3B0aW9uYWwgZmllbGRzIGFkZGVkIGZvciBudW1iZXIgb2YgZmlsZXMgcmVtYWluaW5nIHRvIGJlIHNlbnQKKyAgICBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyB0byBiZSBzZW50LgorICAgIDEwLTE4LTg3IEZsb3cgY29udHJvbCBkaXNjdXNzaW9uIGFkZGVkIHRvIDEwMjQgYnl0ZSBibG9jayBkZXNjcml0cGlvbiwKKyAgICBtaW5vciByZXZpc2lvbnMgZm9yIGNsYXJpdHkgcGVyIHVzZXIgY29tbWVudHMuCisKKworCisgICAgQ2hhcHRlciAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbW9kZW0gUHJvdG9jb2wgT3ZlcnZpZXcKKworCisKKworCisKKworICAgIFgvWU1PREVNIFByb3RvY29sIFJlZmVyZW5jZSAgICBKdW5lIDE4IDE5ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCisKKworCisgICAgOC0wMy04NyBSZXZpc2VkIGZvciBjbGFyaXR5LgorICAgIDUtMzEtMTk4NyBlbXBoYXNpemVzIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciBZTU9ERU0sIGFuZCB1cGRhdGVzCisgICAgaW5mb3JtYXRpb24gb24gYWNjZXNzaW5nIGZpbGVzLgorICAgIDktMTEtMTk4NiBjbGFyaWZpZXMgbm9tZW5jbGF0dXJlIGFuZCBzb21lIG1pbm9yIHBvaW50cy4KKyAgICBUaGUgQXByaWwgMTUgMTk4NiBlZGl0aW9uIGNsYXJpZmllcyBzb21lIHBvaW50cyBjb25jZXJuaW5nIENSQworICAgIGNhbGN1bGF0aW9ucyBhbmQgc3BhY2VzIGluIHRoZSBoZWFkZXIuCisKKworICAgIDExLiAgWU1PREVNIFByb2dyYW1zCisKKyAgICBaQ09NTSwgQSBzaGFyZXdhcmUgbGl0dGxlIGJyb3RoZXIgdG8gUHJvZmVzc2lvbmFsLVlBTSwgaXMgYXZhaWxhYmxlIGFzCisgICAgWkNPTU1FWEUuQVJDIG9uIFRlbGVHb2R6aWxsYSBhbmQgb3RoZXIgYnVsbGV0aW4gYm9hcmQgc3lzdGVtcy4gIFpDT01NIG1heQorICAgIGJlIHVzZWQgdG8gdGVzdCBZTU9ERU0gYW1kIFpNT0RFTSBpbXBsZW1lbnRhdGlvbnMuCisKKyAgICBVbml4IHByb2dyYW1zIHN1cHBvcnRpbmcgWU1PREVNIGFyZSBhdmFpbGFibGUgb24gVGVsZUdvZHppbGxhIGluIFJaU1ouWk9PLgorICAgIFRoaXMgWk9PIGFyY2hpdmUgaW5jbHVkZXMgYSBaQ09NTS9Qcm8tWUFNL1Bvd2VyQ29tIHNjcmlwdCBaVVBMLlQgdG8gdXBsb2FkCisgICAgYSBib290c3RyYXAgcHJvZ3JhbSBNSU5JUkIuQywgY29tcGlsZSBpdCwgYW5kIHRoZW4gdXBsb2FkIHRoZSByZXN0IG9mIHRoZQorICAgIGZpbGVzIHVzaW5nIHRoZSBjb21waWxlZCBNSU5JUkIuICBNb3N0IFVuaXggbGlrZSBzeXN0ZW1zIGFyZSBzdXBwb3J0ZWQsCisgICAgaW5jbHVkaW5nIFY3LCBYZW5peCwgU3lzIElJSSwgNC4yIEJTRCwgU1lTIFYsIElkcmlzLCBDb2hlcmVudCwgYW5kCisgICAgUmVndWx1cy4KKworICAgIEEgdmVyc2lvbiBmb3IgVkFYLVZNUyBpcyBhdmFpbGFibGUgaW4gVlJCU0IuU0hRLgorCisgICAgSXJ2IEhvZmYgaGFzIGFkZGVkIDFrIGJsb2NrcyBhbmQgYmFzaWMgWU1PREVNIGJhdGNoIHRyYW5zZmVycyB0byB0aGUgS01ECisgICAgYW5kIElNUCBzZXJpZXMgcHJvZ3JhbXMsIHdoaWNoIHJlcGxhY2UgdGhlIFhNT0RFTSBhbmQgTU9ERU03L01ETTd4eCBzZXJpZXMKKyAgICByZXNwZWN0aXZlbHkuICBPdmVybGF5cyBhcmUgYXZhaWxhYmxlIGZvciBhIHdpZGUgdmFyaWV0eSBvZiBDUC9NIHN5c3RlbXMuCisKKyAgICBRdWVzdGlvbnMgYWJvdXQgUHJvZmVzc2lvbmFsLVlBTSBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSBtYXkgYmUgZGlyZWN0ZWQKKyAgICB0bzoKKyAgICAgICAgIENodWNrIEZvcnNiZXJnCisgICAgICAgICBPbWVuIFRlY2hub2xvZ3kgSW5jCisgICAgICAgICAxNzUwNS1WIFNhdXZpZSBJc2xhbmQgUm9hZAorICAgICAgICAgUG9ydGxhbmQgT3JlZ29uIDk3MjMxCisgICAgICAgICBWT0lDRTogNTAzLTYyMS0zNDA2IDpWT0lDRQorICAgICAgICAgTW9kZW06IDUwMy02MjEtMzc0NiBTcGVlZDogMTkyMDAoVGVsZWJpdCBQRVApLDI0MDAsMTIwMCwzMDAKKyAgICAgICAgIFVzZW5ldDogLi4uIXRla3Ryb25peCFyZWVkIW9tZW4hY2FmCisgICAgICAgICBDb21wdVNlcnZlOiA3MDAwNywyMzA0CisgICAgICAgICBHRW5pZTogQ0FGCisKKyAgICBVbmxpa2UgWk1PREVNIGFuZCBLZXJtaXQsIFhNT0RFTSBhbmQgWU1PREVNIHBsYWNlIG9ic3RhY2xlcyBpbiB0aGUgcGF0aCBvZgorICAgIGEgcmVsaWFibGUgaGlnaCBwZXJmb3JtYW5jZSBpbXBsZW1lbnRhdGlvbiwgZXZpZGVuY2VkIGJ5IHBvb3IgcmVsaWFiaWxpdHkKKyAgICB1bmRlciBzdHJlc3Mgb2YgdGhlIGluZHVzdHJ5IGxlYWRlcnMnIFhNT0RFTSBhbmQgWU1PREVNIHByb2dyYW1zLiAgT21lbgorICAgIFRlY2hub2xvZ3kgcHJvdmlkZXMgY29uc3VsdGluZyBhbmQgb3RoZXIgc2VydmljZXMgdG8gdGhvc2Ugd2lzaGluZyB0bworICAgIGltcGxlbWVudCBYTU9ERU0sIFlNT0RFTSwgYW5kIFpNT0RFTSB3aXRoIHN0YXRlIG9mIHRoZSBhcnQgZmVhdHVyZXMgYW5kCisgICAgcmVsaWFiaWxpdHkuCisKKworCisKKworCisKKworCisgICAgQ2hhcHRlciAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbW9kZW0gUHJvdG9jb2wgT3ZlcnZpZXcKKworCisKKworCisKKworCisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVOVFMKKworCisgICAgIDEuICBUT1dFUiBPRiBCQUJFTC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgIDIKKyAgICAgICAgIDEuMSAgRGVmaW5pdGlvbnMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAgMgorCisgICAgIDIuICBZTU9ERU0gTUlOSU1VTSBSRVFVSVJFTUVOVFMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgIDQKKworICAgICAzLiAgV0hZIFlNT0RFTT8uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gICA2CisgICAgICAgICAzLjEgIFNvbWUgTWVzc2FnZXMgZnJvbSB0aGUgUGlvbmVlci4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgIDcKKworICAgICA0LiAgWE1PREVNIFBST1RPQ09MIEVOSEFOQ0VNRU5UUy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDEwCisgICAgICAgICA0LjEgIEdyYWNlZnVsIEFib3J0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgMTAKKyAgICAgICAgIDQuMiAgQ1JDLTE2IE9wdGlvbi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAxMAorICAgICAgICAgNC4zICBYTU9ERU0tMWsgMTAyNCBCeXRlIEJsb2NrLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDExCisKKyAgICAgNS4gIFlNT0RFTSBCYXRjaCBGaWxlIFRyYW5zbWlzc2lvbi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAxMworICAgICAgICAgNS4xICBLTUQvSU1QIEV4Y2VwdGlvbnMgdG8gWU1PREVNLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDE2CisKKyAgICAgNi4gIFlNT0RFTS1nIEZpbGUgVHJhbnNtaXNzaW9uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAxOAorCisgICAgIDcuICBYTU9ERU0gUFJPVE9DT0wgT1ZFUlZJRVcuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgMjAKKyAgICAgICAgIDcuMSAgRGVmaW5pdGlvbnMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAyMAorICAgICAgICAgNy4yICBUcmFuc21pc3Npb24gTWVkaXVtIExldmVsIFByb3RvY29sLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDIwCisgICAgICAgICA3LjMgIEZpbGUgTGV2ZWwgUHJvdG9jb2wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgMjEKKyAgICAgICAgIDcuNCAgUHJvZ3JhbW1pbmcgVGlwcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAyMgorCisgICAgIDguICBYTU9ERU0vQ1JDIE92ZXJ2aWV3Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgMjQKKyAgICAgICAgIDguMSAgQ1JDIENhbGN1bGF0aW9uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAyNAorICAgICAgICAgOC4yICBDUkMgRmlsZSBMZXZlbCBQcm90b2NvbCBDaGFuZ2VzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDI1CisgICAgICAgICA4LjMgIERhdGEgRmxvdyBFeGFtcGxlcyB3aXRoIENSQyBPcHRpb24uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgMjcKKworICAgICA5LiAgTU9SRSBJTkZPUk1BVElPTi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDI5CisgICAgICAgICA5LjEgIFRlbGVHb2R6aWxsYSBCdWxsZXRpbiBCb2FyZC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgMjkKKyAgICAgICAgIDkuMiAgVW5peCBVVUNQIEFjY2Vzcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAyOQorCisgICAgMTAuICBSRVZJU0lPTlMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgMjkKKworICAgIDExLiAgWU1PREVNIFByb2dyYW1zLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDMwCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaSAtCisKKworCisKKworCisKKworCisKKworCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElTVCBPRiBGSUdVUkVTCisKKworICAgICBGaWd1cmUgMS4gIFhNT0RFTS0xayBCbG9ja3MuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDEyCisKKyAgICAgRmlndXJlIDIuICBNaXhlZCAxMDI0IGFuZCAxMjggYnl0ZSBCbG9ja3MuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAxMgorCisgICAgIEZpZ3VyZSAzLiAgWU1PREVNIEJhdGNoIFRyYW5zbWlzc2lvbiBTZXNzaW9uICgxIGZpbGUpLi4uLi4uLi4uLi4uLi4uLiAgMTYKKworICAgICBGaWd1cmUgNC4gIFlNT0RFTSBCYXRjaCBUcmFuc21pc3Npb24gU2Vzc2lvbiAoMiBmaWxlcykuLi4uLi4uLi4uLi4uLi4gIDE2CisKKyAgICAgRmlndXJlIDUuICBZTU9ERU0gQmF0Y2ggVHJhbnNtaXNzaW9uIFNlc3Npb24tMWsgQmxvY2tzLi4uLi4uLi4uLi4uLi4uICAxNgorCisgICAgIEZpZ3VyZSA2LiAgWU1PREVNIEZpbGVuYW1lIGJsb2NrIHRyYW5zbWl0dGVkIGJ5IHN6Li4uLi4uLi4uLi4uLi4uLi4uLiAgMTYKKworICAgICBGaWd1cmUgNy4gIFlNT0RFTSBIZWFkZXIgSW5mb3JtYXRpb24gYW5kIEZlYXR1cmVzLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDE2CisKKyAgICAgRmlndXJlIDguICBZTU9ERU0tZyBUcmFuc21pc3Npb24gU2Vzc2lvbi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAxOQorCisgICAgIEZpZ3VyZSA5LiAgWE1PREVNIE1lc3NhZ2UgQmxvY2sgTGV2ZWwgUHJvdG9jb2wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgMjEKKworICAgIEZpZ3VyZSAxMC4gIERhdGEgZmxvdyBpbmNsdWRpbmcgRXJyb3IgUmVjb3ZlcnkuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIDIyCisKKyAgICBGaWd1cmUgMTEuICBNZXNzYWdlIEJsb2NrIExldmVsIFByb3RvY29sLCBDUkMgbW9kZS4uLi4uLi4uLi4uLi4uLi4uLi4uICAyNAorCisgICAgRmlndXJlIDEyLiAgRXhhbXBsZSBvZiBDUkMgQ2FsY3VsYXRpb24gd3JpdHRlbiBpbiBDLi4uLi4uLi4uLi4uLi4uLi4uLiAgMjUKKworICAgIEZpZ3VyZSAxMy4gIERhdGEgRmxvdzogUmVjZWl2ZXIgaGFzIENSQyBPcHRpb24sIFNlbmRlciBEb2Vzbid0Li4uLi4uLi4gIDI3CisKKyAgICBGaWd1cmUgMTQuICBSZWNlaXZlciBhbmQgU2VuZGVyIEJvdGggaGF2ZSBDUkMgT3B0aW9uLi4uLi4uLi4uLi4uLi4uLi4uICAyOAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGlpIC0KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnVwbG9hZC96b3V0LmMgYi9jb20zMi9saWJ1cGxvYWQvem91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzBkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1cGxvYWQvem91dC5jCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29tcHJlc3MgaW5wdXQgYW5kIGZlZWQgaXQgdG8gYSBibG9jay1vcmllbnRlZCBiYWNrIGVuZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSAidXBsb2FkX2JhY2tlbmQuaCIKKyNpbmNsdWRlICJjdGltZS5oIgorCisjZGVmaW5lIEFMTE9DX0NIVU5LCTY1NTM2CisKK2ludCBpbml0X2RhdGEoc3RydWN0IHVwbG9hZF9iYWNrZW5kICpiZSwgY29uc3QgY2hhciAqYXJndltdKQoreworICAgIGJlLT5ub3cgPSBwb3NpeF90aW1lKCk7CisgICAgYmUtPmFyZ3YgPSBhcmd2OworCisgICAgbWVtc2V0KCZiZS0+enN0cmVhbSwgMCwgc2l6ZW9mIGJlLT56c3RyZWFtKTsKKworICAgIGJlLT56c3RyZWFtLm5leHRfb3V0ICA9IE5VTEw7CisgICAgYmUtPm91dGJ1ZiA9IE5VTEw7CisgICAgYmUtPnpzdHJlYW0uYXZhaWxfb3V0ID0gYmUtPmFsbG9jICA9IDA7CisgICAgYmUtPmRieXRlcyA9IGJlLT56Ynl0ZXMgPSAwOworCisgICAgLyogSW5pdGlhbGl6ZSBhIGd6aXAgZGF0YSBzdHJlYW0gKi8KKyAgICBpZiAoZGVmbGF0ZUluaXQyKCZiZS0+enN0cmVhbSwgOSwgWl9ERUZMQVRFRCwKKwkJICAgICAxNisxNSwgOSwgWl9ERUZBVUxUX1NUUkFURUdZKSA8IDApCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fZGVmbGF0ZShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlLCBpbnQgZmx1c2gpCit7CisgICAgaW50IHJ2OworICAgIGNoYXIgKmJ1ZjsKKworICAgIHdoaWxlICgxKSB7CisJcnYgPSBkZWZsYXRlKCZiZS0+enN0cmVhbSwgZmx1c2gpOworCWJlLT56Ynl0ZXMgPSBiZS0+YWxsb2MgLSBiZS0+enN0cmVhbS5hdmFpbF9vdXQ7CisJaWYgKGJlLT56c3RyZWFtLmF2YWlsX291dCkKKwkgICAgcmV0dXJuIHJ2OwkJICAgLyogTm90IGFuIGlzc3VlIG9mIG91dHB1dCBzcGFjZS4uLiAqLworCisJYnVmID0gcmVhbGxvYyhiZS0+b3V0YnVmLCBiZS0+YWxsb2MgKyBBTExPQ19DSFVOSyk7CisJaWYgKCFidWYpCisJICAgIHJldHVybiBaX01FTV9FUlJPUjsKKwliZS0+b3V0YnVmID0gYnVmOworCWJlLT5hbGxvYyArPSBBTExPQ19DSFVOSzsKKwliZS0+enN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopKGJ1ZiArIGJlLT56Ynl0ZXMpOworCWJlLT56c3RyZWFtLmF2YWlsX291dCA9IGJlLT5hbGxvYyAtIGJlLT56Ynl0ZXM7CisgICAgfQorfQorCisKK2ludCB3cml0ZV9kYXRhKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgICBpbnQgcnYgPSBaX09LOworCisgICAgYmUtPnpzdHJlYW0ubmV4dF9pbiA9ICh2b2lkICopYnVmOworICAgIGJlLT56c3RyZWFtLmF2YWlsX2luID0gbGVuOworCisgICAgYmUtPmRieXRlcyArPSBsZW47CisKKyAgICB3aGlsZSAoYmUtPnpzdHJlYW0uYXZhaWxfaW4pIHsKKwlydiA9IGRvX2RlZmxhdGUoYmUsIFpfTk9fRkxVU0gpOworCWlmIChydiA8IDApIHsKKwkgICAgcHJpbnRmKCJkb19kZWZsYXRlIHJldHVybmVkICVkXG4iLCBydik7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBPdXRwdXQgdGhlIGRhdGEgYW5kIHNodXQgZG93biB0aGUgc3RyZWFtICovCitpbnQgZmx1c2hfZGF0YShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKQoreworICAgIGludCBydiA9IFpfT0s7CisgICAgaW50IGVycj0tMTsKKworICAgIHdoaWxlIChydiAhPSBaX1NUUkVBTV9FTkQpIHsKKwlydiA9IGRvX2RlZmxhdGUoYmUsIFpfRklOSVNIKTsKKwlpZiAocnYgPCAwKQorCSAgICByZXR1cm4gLTE7CisgICAgfQorCisvLyAgICBwcmludGYoIlVwbG9hZGluZyBkYXRhLCAldSBieXRlcy4uLiAiLCBiZS0+emJ5dGVzKTsKKworICAgIGlmICgoZXJyPWJlLT53cml0ZShiZSkpICE9IDApCisJcmV0dXJuIGVycjsKKworICAgIGZyZWUoYmUtPm91dGJ1Zik7CisgICAgYmUtPm91dGJ1ZiA9IE5VTEw7CisgICAgYmUtPmRieXRlcyA9IGJlLT56Ynl0ZXMgPSBiZS0+YWxsb2MgPSAwOworCisvLyAgICBwcmludGYoImRvbmUuXG4iKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvTWFrZWZpbGUgYi9jb20zMi9saWJ1dGlsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGYxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1dGlsL01ha2VmaWxlCkBAIC0wLDAgKzEsNjUgQEAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMjAwMS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMKKyMjICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyMjICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyMjICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorIyMgICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyMjICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIyAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyMjICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisjIyAgIGNvbmRpdGlvbnM6CisjIworIyMgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorIyMgICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMjCisjIyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyMgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyMjICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMjICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyMjICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisjIyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworIyMgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisjIyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyMgVXRpbGl0eSBjb21wYW5pb24gbGlicmFyeSBmb3IgdGhlIENPTTMyIGxpYnJhcnkKKyMjCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvZWxmLm1rCisKK0xJQk9CSlMJICAgPSBhbnNpbGluZS5vIGFuc2lyYXcubyBrZXluYW1lLm8gXAorCSAgICAgc2hhMWhhc2gubyB1bmJhc2U2NC5vIFwKKwkgICAgIG1kNS5vIGNyeXB0LW1kNS5vIHNoYTI1NmNyeXB0Lm8gc2hhNTEyY3J5cHQubyBiYXNlNjQubyBcCisJICAgICBxdWlja3NvcnQubworTE5YTElCT0JKUyA9ICQocGF0c3Vic3QgJS5vLCUubG8sJChMSUJPQkpTKSkKKworYWxsOiBsaWJ1dGlsLmMzMiBsaWJ1dGlsX2xueC5hCisKK2xpYnV0aWwuZWxmOiAkKExJQk9CSlMpCisJJChMRCkgJChMREZMQUdTKSAtc29uYW1lICQocGF0c3Vic3QgJS5lbGYsJS5jMzIsJChARikpIC1vICRAICReCisKK2xpYnV0aWxfbG54LmE6ICQoTE5YTElCT0JKUykKKwlybSAtZiAkQAorCSQoQVIpIGNxICRAICQoTE5YTElCT0JKUykKKwkkKFJBTkxJQikgJEAKKwordGlkeSBkaXN0OgorCXJtIC1mICoubyAqLmxvICoubHN0ICouZWxmIC4qLmQgKi50bXAKKworY2xlYW46IHRpZHkKKwlybSAtZiAqLmxueCBsaWJ1dGlsX2xueC5hCisKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICoubHNzICouYSAqLmMzMiAqLmNvbQorCXJtIC1mICp+IFwjKgorCitpbnN0YWxsOiBhbGwKKwlta2RpciAtbSA3NTUgLXAgJChJTlNUQUxMUk9PVCkkKENPTTMyRElSKQorCWluc3RhbGwgLW0gNjQ0IGxpYnV0aWxfbG54LmEgJChJTlNUQUxMUk9PVCkkKENPTTMyRElSKQorCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS9jb20zMi9saWJ1dGlsL2Fuc2lsaW5lLmMgYi9jb20zMi9saWJ1dGlsL2Fuc2lsaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjNzE0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYnV0aWwvYW5zaWxpbmUuYwpAQCAtMCwwICsxLDgzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYW5zaWxpbmUuYworICoKKyAqIENvbmZpZ3VyZXMgdGhlIGNvbnNvbGUgZm9yIEFOU0kgb3V0cHV0IGluIGxpbmUgbW9kZTsgdmVyc2lvbnMKKyAqIGZvciBDT00zMiBhbmQgTGludXggc3VwcG9ydC4KKyAqLworCisjaWZkZWYgX19DT00zMl9fCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKwordm9pZCBjb25zb2xlX2Fuc2lfc3RkKHZvaWQpCit7CisgICAgb3BlbmNvbnNvbGUoJmRldl9zdGRjb25fciwgJmRldl9hbnNpc2VyaWFsX3cpOworfQorCisjZWxzZQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisKK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyBvcmlnaW5hbF90ZXJtaW9zX3NldHRpbmdzOworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgoY29uc3RydWN0b3IpKSBjb25zb2xlX2luaXQodm9pZCkKK3sKKyAgICB0Y2dldGF0dHIoMCwgJm9yaWdpbmFsX3Rlcm1pb3Nfc2V0dGluZ3MpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgoZGVzdHJ1Y3RvcikpIGNvbnNvbGVfY2xlYW51cCh2b2lkKQoreworICAgIHRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmb3JpZ2luYWxfdGVybWlvc19zZXR0aW5ncyk7Cit9CisKK3ZvaWQgY29uc29sZV9hbnNpX3N0ZCh2b2lkKQoreworICAgIHN0cnVjdCB0ZXJtaW9zIHRpbzsKKworICAgIC8qIERpc2FibGUgc3RkaW8gYnVmZmVyaW5nICovCisgICAgc2V0YnVmKHN0ZGluLCBOVUxMKTsKKyAgICBzZXRidWYoc3Rkb3V0LCBOVUxMKTsKKyAgICBzZXRidWYoc3RkZXJyLCBOVUxMKTsKKworICAgIC8qIFNldCB0aGUgdGVybWlvcyBmbGFnIHNvIHdlIGJlaGF2ZSB0aGUgc2FtZSBhcyBsaWJjb20zMiAqLworICAgIHRjZ2V0YXR0cigwLCAmdGlvKTsKKyAgICB0aW8uY19pZmxhZyAmPSB+SUNSTkw7CisgICAgdGlvLmNfaWZsYWcgfD0gSUdOQ1I7CisgICAgdGlvLmNfbGZsYWcgfD0gSUNBTk9OIHwgRUNITzsKKyAgICBpZiAoIXRpby5jX29mbGFnICYgT1BPU1QpCisJdGlvLmNfb2ZsYWcgPSAwOworICAgIHRpby5jX29mbGFnIHw9IE9QT1NUIHwgT05MQ1I7CisgICAgdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0aW8pOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvYW5zaXJhdy5jIGIvY29tMzIvbGlidXRpbC9hbnNpcmF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3NzY4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYnV0aWwvYW5zaXJhdy5jCkBAIC0wLDAgKzEsMTA0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYW5zaXJhdy5jCisgKgorICogQ29uZmlndXJlcyB0aGUgY29uc29sZSBmb3IgQU5TSSBvdXRwdXQgaW4gcmF3IG1vZGU7IHZlcnNpb25zCisgKiBmb3IgQ09NMzIgYW5kIExpbnV4IHN1cHBvcnQuCisgKi8KKworI2lmZGVmIF9fQ09NMzJfXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisKK3ZvaWQgY29uc29sZV9hbnNpX3Jhdyh2b2lkKQoreworICAgIG9wZW5jb25zb2xlKCZkZXZfcmF3Y29uX3IsICZkZXZfYW5zaXNlcmlhbF93KTsKK30KKworI2Vsc2UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitzdGF0aWMgc3RydWN0IHRlcm1pb3Mgb3JpZ2luYWxfdGVybWlvc19zZXR0aW5nczsKKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKGNvbnN0cnVjdG9yKSkgY29uc29sZV9pbml0KHZvaWQpCit7CisgICAgdGNnZXRhdHRyKDAsICZvcmlnaW5hbF90ZXJtaW9zX3NldHRpbmdzKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKGRlc3RydWN0b3IpKSBjb25zb2xlX2NsZWFudXAodm9pZCkKK3sKKyAgICB0Y3NldGF0dHIoMCwgVENTQU5PVywgJm9yaWdpbmFsX3Rlcm1pb3Nfc2V0dGluZ3MpOworfQorCit2b2lkIGNvbnNvbGVfYW5zaV9yYXcodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGVybWlvcyB0aW87CisKKyAgICAvKiBEaXNhYmxlIHN0ZGlvIGJ1ZmZlcmluZyAqLworICAgIHNldGJ1ZihzdGRpbiwgTlVMTCk7CisgICAgc2V0YnVmKHN0ZG91dCwgTlVMTCk7CisgICAgc2V0YnVmKHN0ZGVyciwgTlVMTCk7CisKKyAgICAvKiBTZXQgdGhlIHRlcm1pb3MgZmxhZyBzbyB3ZSBiZWhhdmUgdGhlIHNhbWUgYXMgbGliY29tMzIgKi8KKyAgICB0Y2dldGF0dHIoMCwgJnRpbyk7CisgICAgdGlvLmNfaWZsYWcgJj0gfklDUk5MOworICAgIHRpby5jX2lmbGFnIHw9IElHTkNSOworICAgIHRpby5jX2xmbGFnICY9IH4oSVNJRyB8IElDQU5PTiB8IEVDSE8pOworICAgIGlmICghdGlvLmNfb2ZsYWcgJiBPUE9TVCkKKwl0aW8uY19vZmxhZyA9IDA7CisgICAgdGlvLmNfb2ZsYWcgfD0gT1BPU1QgfCBPTkxDUjsKKyAgICB0aW8uY19jY1tWTUlOXSA9IDA7CisgICAgdGlvLmNfY2NbVlRJTUVdID0gMTsJLyogRG9uJ3QgMTAwJSBidXN5LXdhaXQgaW4gTGludXggKi8KKyAgICB0Y3NldGF0dHIoMCwgVENTQUZMVVNILCAmdGlvKTsKK30KKworaW50IHJhd19yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHRlcm1pb3MgdGlvLCBydGlvOworCWludCBydjsKKworCXRjZ2V0YXR0cihmZCwgJnRpbyk7CisKKwljZm1ha2VyYXcoJnJ0aW8pOworCXRjc2V0YXR0cihmZCwgMCwgJnJ0aW8pOworCisJcnYgPSByZWFkKGZkLCBidWYsIGNvdW50KTsKKworCS8qIFJlc3RvcmUgc2V0dGluZ3MgKi8KKwl0Y3NldGF0dHIoZmQsIDAsICZ0aW8pOworCisJcmV0dXJuIHJ2OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvYmFzZTY0LmMgYi9jb20zMi9saWJ1dGlsL2Jhc2U2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjEwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1dGlsL2Jhc2U2NC5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBPdXRwdXQgYSBiYXNlNjQgc3RyaW5nLgorICoKKyAqIE9wdGlvbnMgaW5jbHVkZToKKyAqIC0gQ2hhcmFjdGVyIDYyIGFuZCA2MzsKKyAqIC0gVG8gcGFkIG9yIG5vdCB0byBwYWQuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YmFzZTY0Lmg+CisKK3NpemVfdCBnZW5iYXNlNjQoY2hhciAqb3V0cHV0LCBjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKyAgICBzdGF0aWMgY2hhciBjaGFyeltdID0KKwkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrXyI7CisgICAgdWludDhfdCBidWZbM107CisgICAgaW50IGo7CisgICAgY29uc3QgdWludDhfdCAqcDsKKyAgICBjaGFyICpxOworICAgIHVpbnQzMl90IGJ2OworICAgIGludCBsZWZ0ID0gc2l6ZTsKKworICAgIGNoYXJ6WzYyXSA9IChjaGFyKWZsYWdzOworICAgIGNoYXJ6WzYzXSA9IChjaGFyKShmbGFncyA+PiA4KTsKKworICAgIHAgPSBpbnB1dDsKKyAgICBxID0gb3V0cHV0OworCisgICAgd2hpbGUgKGxlZnQgPiAwKSB7CisJaWYgKGxlZnQgPCAzKSB7CisJICAgIGJ1ZlswXSA9IHBbMF07CisJICAgIGJ1ZlsxXSA9IChsZWZ0ID4gMSkgPyBwWzFdIDogMDsKKwkgICAgYnVmWzJdID0gMDsKKwkgICAgcCA9IGJ1ZjsKKwl9CisKKwlidiA9IChwWzBdIDw8IDE2KSB8IChwWzFdIDw8IDgpIHwgcFsyXTsKKwlwICs9IDM7CisJbGVmdCAtPSAzOworCisJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCSAgICAqcSsrID0gY2hhcnpbKGJ2ID4+IDE4KSAmIDB4M2ZdOworCSAgICBidiA8PD0gNjsKKwl9CisgICAgfQorCisgICAgc3dpdGNoIChsZWZ0KSB7CisgICAgY2FzZSAtMToKKwlpZiAoZmxhZ3MgJiBCQVNFNjRfUEFEKQorCSAgICBxWy0xXSA9ICc9JzsKKwllbHNlCisJICAgIHEtLTsKKwlicmVhazsKKworICAgIGNhc2UgLTI6CisJaWYgKGZsYWdzICYgQkFTRTY0X1BBRCkKKwkgICAgcVstMl0gPSBxWy0xXSA9ICc9JzsKKwllbHNlCisJICAgIHEgLT0gMjsKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorCisgICAgKnEgPSAnXDAnOworCisgICAgcmV0dXJuIHEgLSBvdXRwdXQ7Cit9CisKKyNpZmRlZiBURVNUCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBpOworICAgIGNoYXIgYnVmWzQwOTZdOworICAgIGludCBsZW4sIGJ5dGVzOworCisgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCXByaW50ZigiT3JpZ2luYWw6IFwiJXNcIlxuIiwgYXJndltpXSk7CisKKwlsZW4gPSBzdHJsZW4oYXJndltpXSk7CisJYnl0ZXMgPSBnZW5iYXNlNjQoYnVmLCBhcmd2W2ldLCBsZW4sIEJBU0U2NF9NSU1FIHwgQkFTRTY0X1BBRCk7CisJcHJpbnRmKCIgICAgTUlNRTogXCIlc1wiICglZClcbiIsIGJ1ZiwgYnl0ZXMpOworCWJ5dGVzID0gZ2VuYmFzZTY0KGJ1ZiwgYXJndltpXSwgbGVuLCBCQVNFNjRfU0FGRSk7CisJcHJpbnRmKCIgICAgU2FmZTogXCIlc1wiICglZClcbiIsIGJ1ZiwgYnl0ZXMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvY3J5cHQtbWQ1LmMgYi9jb20zMi9saWJ1dGlsL2NyeXB0LW1kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTk1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1dGlsL2NyeXB0LW1kNS5jCkBAIC0wLDAgKzEsMTczIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBQb3VsLUhlbm5pbmcgS2FtcAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtZDUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIFVOSVggcGFzc3dvcmQKKyAqLworCitzdGF0aWMgY2hhciAqX2NyeXB0X3RvNjQoY2hhciAqcywgdWludDMyX3QgdiwgaW50IG4pCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgaXRvYTY0WzY0XSA9ICIuLzAxMjM0NTY3ODkiCisJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCisgICAgd2hpbGUgKC0tbiA+PSAwKSB7CisJKnMrKyA9IGl0b2E2NFt2ICYgMHgzZl07CisJdiA+Pj0gNjsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK2NoYXIgKmNyeXB0X21kNShjb25zdCBjaGFyICpwdywgY29uc3QgY2hhciAqc2FsdCkKK3sKKyAgICBNRDVfQ1RYIGN0eCwgY3R4MTsKKyAgICB1bnNpZ25lZCBsb25nIGw7CisgICAgaW50IHNsLCBwbDsKKyAgICB1aW50MzJfdCBpOworICAgIHVpbnQ4X3QgZmluYWxbTUQ1X1NJWkVdOworICAgIGNvbnN0IGNoYXIgKnNwOworICAgIHN0YXRpYyBjaGFyIHBhc3N3ZFsxMjBdOwkvKiBPdXRwdXQgYnVmZmVyICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgbWFnaWNbXSA9ICIkMSQiOworICAgIGNoYXIgKnA7CisgICAgY29uc3QgaW50IG1hZ2ljX2xlbiA9IHNpemVvZiBtYWdpYyAtIDE7CisgICAgaW50IHB3bGVuID0gc3RybGVuKHB3KTsKKworICAgIC8qIFJlZmluZSB0aGUgU2FsdCBmaXJzdCAqLworICAgIHNwID0gc2FsdDsKKworICAgIC8qIElmIGl0IHN0YXJ0cyB3aXRoIHRoZSBtYWdpYyBzdHJpbmcsIHRoZW4gc2tpcCB0aGF0ICovCisgICAgaWYgKCFzdHJuY21wKHNwLCBtYWdpYywgbWFnaWNfbGVuKSkKKwlzcCArPSBtYWdpY19sZW47CisKKyAgICAvKiBDb21wdXRlIHRoZSBzYWx0IGxlbmd0aDoKKyAgICAgICBpdCBzdG9wcyBhdCB0aGUgZmlyc3QgJyQnLCBtYXggOCBjaGFycyAqLworICAgIGZvciAoc2wgPSAwOyBzbCA8IDggJiYgc3Bbc2xdICYmIHNwW3NsXSAhPSAnJCc7IHNsKyspIDsKKworICAgIE1ENUluaXQoJmN0eCk7CisKKyAgICAvKiBUaGUgcGFzc3dvcmQgZmlyc3QsIHNpbmNlIHRoYXQgaXMgd2hhdCBpcyBtb3N0IHVua25vd24gKi8KKyAgICBNRDVVcGRhdGUoJmN0eCwgcHcsIHB3bGVuKTsKKworICAgIC8qIFRoZW4gb3VyIG1hZ2ljIHN0cmluZyAqLworICAgIE1ENVVwZGF0ZSgmY3R4LCBtYWdpYywgbWFnaWNfbGVuKTsKKworICAgIC8qIFRoZW4gdGhlIHJhdyBzYWx0ICovCisgICAgTUQ1VXBkYXRlKCZjdHgsIHNwLCBzbCk7CisKKyAgICAvKiBUaGVuIGp1c3QgYXMgbWFueSBjaGFyYWN0ZXJzIG9mIHRoZSBNRDUocHcsc2FsdCxwdykgKi8KKyAgICBNRDVJbml0KCZjdHgxKTsKKyAgICBNRDVVcGRhdGUoJmN0eDEsIHB3LCBwd2xlbik7CisgICAgTUQ1VXBkYXRlKCZjdHgxLCBzcCwgc2wpOworICAgIE1ENVVwZGF0ZSgmY3R4MSwgcHcsIHB3bGVuKTsKKyAgICBNRDVGaW5hbChmaW5hbCwgJmN0eDEpOworICAgIGZvciAocGwgPSBwd2xlbjsgcGwgPiAwOyBwbCAtPSBNRDVfU0laRSkKKwlNRDVVcGRhdGUoJmN0eCwgZmluYWwsIHBsID4gTUQ1X1NJWkUgPyBNRDVfU0laRSA6IHBsKTsKKworICAgIC8qIERvbid0IGxlYXZlIGFueXRoaW5nIGFyb3VuZCBpbiB2bSB0aGV5IGNvdWxkIHVzZS4gKi8KKyAgICBtZW1zZXQoZmluYWwsIDAsIHNpemVvZiBmaW5hbCk7CisKKyAgICAvKiBUaGVuIHNvbWV0aGluZyByZWFsbHkgd2VpcmQuLi4gKi8KKyAgICBmb3IgKGkgPSBwd2xlbjsgaTsgaSA+Pj0gMSkKKwlpZiAoaSAmIDEpCisJICAgIE1ENVVwZGF0ZSgmY3R4LCBmaW5hbCwgMSk7CisJZWxzZQorCSAgICBNRDVVcGRhdGUoJmN0eCwgcHcsIDEpOworCisgICAgLyogTm93IG1ha2UgdGhlIG91dHB1dCBzdHJpbmcgKi8KKyAgICBwID0gcGFzc3dkOworCisgICAgbWVtY3B5KHAsIG1hZ2ljLCBtYWdpY19sZW4pOworICAgIHAgKz0gbWFnaWNfbGVuOworCisgICAgbWVtY3B5KHAsIHNwLCBzbCk7CisgICAgcCArPSBzbDsKKworICAgICpwKysgPSAnJCc7CisKKyAgICBNRDVGaW5hbChmaW5hbCwgJmN0eCk7CisKKyAgICAvKgorICAgICAqIGFuZCBub3csIGp1c3QgdG8gbWFrZSBzdXJlIHRoaW5ncyBkb24ndCBydW4gdG9vIGZhc3QKKyAgICAgKiBPbiBhIDYwIE1oeiBQZW50aXVtIHRoaXMgdGFrZXMgMzQgbXNlYywgc28geW91IHdvdWxkCisgICAgICogbmVlZCAzMCBzZWNvbmRzIHRvIGJ1aWxkIGEgMTAwMCBlbnRyeSBkaWN0aW9uYXJ5Li4uCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCU1ENUluaXQoJmN0eDEpOworCWlmIChpICYgMSkKKwkgICAgTUQ1VXBkYXRlKCZjdHgxLCBwdywgcHdsZW4pOworCWVsc2UKKwkgICAgTUQ1VXBkYXRlKCZjdHgxLCBmaW5hbCwgTUQ1X1NJWkUpOworCisJaWYgKGkgJSAzKQorCSAgICBNRDVVcGRhdGUoJmN0eDEsIHNwLCBzbCk7CisKKwlpZiAoaSAlIDcpCisJICAgIE1ENVVwZGF0ZSgmY3R4MSwgcHcsIHB3bGVuKTsKKworCWlmIChpICYgMSkKKwkgICAgTUQ1VXBkYXRlKCZjdHgxLCBmaW5hbCwgTUQ1X1NJWkUpOworCWVsc2UKKwkgICAgTUQ1VXBkYXRlKCZjdHgxLCBwdywgcHdsZW4pOworCU1ENUZpbmFsKGZpbmFsLCAmY3R4MSk7CisgICAgfQorCisgICAgbCA9IChmaW5hbFswXSA8PCAxNikgfCAoZmluYWxbNl0gPDwgOCkgfCBmaW5hbFsxMl07CisgICAgcCA9IF9jcnlwdF90bzY0KHAsIGwsIDQpOworICAgIGwgPSAoZmluYWxbMV0gPDwgMTYpIHwgKGZpbmFsWzddIDw8IDgpIHwgZmluYWxbMTNdOworICAgIHAgPSBfY3J5cHRfdG82NChwLCBsLCA0KTsKKyAgICBsID0gKGZpbmFsWzJdIDw8IDE2KSB8IChmaW5hbFs4XSA8PCA4KSB8IGZpbmFsWzE0XTsKKyAgICBwID0gX2NyeXB0X3RvNjQocCwgbCwgNCk7CisgICAgbCA9IChmaW5hbFszXSA8PCAxNikgfCAoZmluYWxbOV0gPDwgOCkgfCBmaW5hbFsxNV07CisgICAgcCA9IF9jcnlwdF90bzY0KHAsIGwsIDQpOworICAgIGwgPSAoZmluYWxbNF0gPDwgMTYpIHwgKGZpbmFsWzEwXSA8PCA4KSB8IGZpbmFsWzVdOworICAgIHAgPSBfY3J5cHRfdG82NChwLCBsLCA0KTsKKyAgICBsID0gZmluYWxbMTFdOworICAgIHAgPSBfY3J5cHRfdG82NChwLCBsLCAyKTsKKyAgICAqcCA9ICdcMCc7CisKKyAgICAvKiBEb24ndCBsZWF2ZSBhbnl0aGluZyBhcm91bmQgaW4gdm0gdGhleSBjb3VsZCB1c2UuICovCisgICAgbWVtc2V0KGZpbmFsLCAwLCBzaXplb2YgZmluYWwpOworCisgICAgcmV0dXJuIHBhc3N3ZDsKK30KKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkgKz0gMikgeworCXB1dHMoY3J5cHRfbWQ1KGFyZ3ZbaV0sIGFyZ3ZbaSAtIDFdKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS9iYXNlNjQuaCBiL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS9iYXNlNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzE4NTViCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXRpbC9pbmNsdWRlL2Jhc2U2NC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA1LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBiYXNlNjQuaAorICoKKyAqIFNpbXBsZSByb3V0aW5lcyBmb3IgaGFuZGluZyBiYXNlNjQgdGV4dAorICovCisKKyNpZm5kZWYgTElCVVRJTF9CQVNFNjRfSAorI2RlZmluZSBMSUJVVElMX0JBU0U2NF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBCQVNFNjRfUEFECTB4MTAwMDAKKworLyogVGhlcmUgaXMgcGxlbnR5IG9mIGRpc2FncmVlbWVudCB3LnIudC4gdGhlIGxhc3QgZmV3IGNoYXJhY3RlcnMuLi4gKi8KKyNkZWZpbmUgQkFTRTY0X01JTUUJKCcrJyArICgnLycgPDwgOCkpCisjZGVmaW5lIEJBU0U2NF9TQUZFCSgnLScgKyAoJ18nIDw8IDgpKQorI2RlZmluZSBCQVNFNjRfQ1JZUFQJKCcuJyArICgnLycgPDwgOCkpCisjZGVmaW5lIEJBU0U2NF9VUkwJKCcqJyArICgnLScgPDwgOCkpCS8qIEhhdmVuJ3Qgc2VlbiBteXNlbGYgKi8KKyNkZWZpbmUgQkFTRTY0X1JFR0VYCSgnfCcgKyAoJy0nIDw8IDgpKQkvKiBEaXR0by4uLiAqLworCitzaXplX3QgZ2VuYmFzZTY0KGNoYXIgKm91dHB1dCwgY29uc3Qgdm9pZCAqZGlnZXN0LCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKK3NpemVfdCB1bmJhc2U2NCh1bnNpZ25lZCBjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9saWJ1dGlsL2luY2x1ZGUvY29uc29sZXMuaCBiL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS9jb25zb2xlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NjUyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1dGlsL2luY2x1ZGUvY29uc29sZXMuaApAQCAtMCwwICsxLDQwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogY29uc29sZXMuaAorICoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBjb21tb24gY29uc29sZSBjb25maWd1cmF0aW9ucworICovCisKKyNpZm5kZWYgTElCVVRJTF9DT05TT0xFU19ICisjZGVmaW5lIExJQlVUSUxfQ09OU09MRVNfSAorCit2b2lkIGNvbnNvbGVfYW5zaV9zdGQodm9pZCk7Cit2b2lkIGNvbnNvbGVfYW5zaV9yYXcodm9pZCk7CisKKyNlbmRpZiAvKiBMSUJVVElMX0NPTlNPTEVTX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS9nZXRrZXkuaCBiL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS9nZXRrZXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzMzNzIzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXRpbC9pbmNsdWRlL2dldGtleS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBnZXRrZXkuaAorICoKKyAqIEZ1bmN0aW9uIHRvIGdldCBhIGtleSBzeW1ib2wgYW5kIHBhcnNlIGl0CisgKi8KKworI2lmbmRlZiBMSUJVVElMX0dFVEtFWV9ICisjZGVmaW5lIExJQlVUSUxfR0VUS0VZX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisKKyNpZm5kZWYgQ0xLX1RDSworIyBkZWZpbmUgQ0xLX1RDSyBzeXNjb25mKF9TQ19DTEtfVENLKQorI2VuZGlmCisKKyNkZWZpbmUgS0VZX05PTkUJKC0xKQorCisjZGVmaW5lIEtFWV9DVFJMKHgpCSgoeCkgJiAweDAwMWYpCisjZGVmaW5lIEtFWV9CQUNLU1BBQ0UJMHgwMDA4CisjZGVmaW5lIEtFWV9UQUIJCTB4MDAwOQorI2RlZmluZSBLRVlfRU5URVIJMHgwMDBkCisjZGVmaW5lIEtFWV9FU0MJCTB4MDAxYgorI2RlZmluZSBLRVlfREVMCQkweDAwN2YKKworI2RlZmluZSBLRVlfRjEJCTB4MDEwMAorI2RlZmluZSBLRVlfRjIJCTB4MDEwMQorI2RlZmluZSBLRVlfRjMJCTB4MDEwMgorI2RlZmluZSBLRVlfRjQJCTB4MDEwMworI2RlZmluZSBLRVlfRjUJCTB4MDEwNAorI2RlZmluZSBLRVlfRjYJCTB4MDEwNQorI2RlZmluZSBLRVlfRjcJCTB4MDEwNgorI2RlZmluZSBLRVlfRjgJCTB4MDEwNworI2RlZmluZSBLRVlfRjkJCTB4MDEwOAorI2RlZmluZSBLRVlfRjEwCQkweDAxMDkKKyNkZWZpbmUgS0VZX0YxMQkJMHgwMTBBCisjZGVmaW5lIEtFWV9GMTIJCTB4MDEwQgorCisjZGVmaW5lIEtFWV9VUAkJMHgwMTIwCisjZGVmaW5lIEtFWV9ET1dOCTB4MDEyMQorI2RlZmluZSBLRVlfTEVGVAkweDAxMjIKKyNkZWZpbmUgS0VZX1JJR0hUCTB4MDEyMworI2RlZmluZSBLRVlfUEdVUAkweDAxMjQKKyNkZWZpbmUgS0VZX1BHRE4JMHgwMTI1CisjZGVmaW5lIEtFWV9IT01FCTB4MDEyNgorI2RlZmluZSBLRVlfRU5ECQkweDAxMjcKKyNkZWZpbmUgS0VZX0lOU0VSVAkweDAxMjgKKyNkZWZpbmUgS0VZX0RFTEVURQkweDAxMjkKKworI2RlZmluZSBLRVlfTUFYCQkweDAxMmEKKworI2RlZmluZSBLRVlfTUFYTEVOCTgKKworaW50IGdldF9rZXkoRklMRSAqLCBjbG9ja190KTsKK2ludCBrZXlfbmFtZV90b19jb2RlKGNvbnN0IGNoYXIgKik7Citjb25zdCBjaGFyICprZXlfY29kZV90b19uYW1lKGludCk7CitpbnQgZ2V0X2tleV9kZWNvZGUoY2hhciAqLCBpbnQsIGludCAqKTsKKworI2VuZGlmIC8qIExJQlVUSUxfR0VUS0VZX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS9saWJ1dGlsLmggYi9jb20zMi9saWJ1dGlsL2luY2x1ZGUvbGlidXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDZhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1dGlsL2luY2x1ZGUvbGlidXRpbC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA1LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBsaWJ1dGlsLmgKKyAqCisgKiBNaXNjIGxpYnV0aWwgZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZiBMSUJVVElMX0xJQlVUSUxfSAorI2RlZmluZSBMSUJVVElMX0xJQlVUSUxfSAorCisjaWZkZWYgX19DT00zMl9fCisKKyMgaW5jbHVkZSA8c3lzbGludXgvaWRsZS5oPgorCisjIGRlZmluZSBkb19pZGxlIHN5c2xpbnV4X2lkbGUKKworI2Vsc2UgLyogbm90IF9fQ09NMzJfXyAqLworCisjIGluY2x1ZGUgPHNjaGVkLmg+CisKKyMgZGVmaW5lIGRvX2lkbGUgc2NoZWRfeWllbGQKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbGlidXRpbC9pbmNsdWRlL21kNS5oIGIvY29tMzIvbGlidXRpbC9pbmNsdWRlL21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMzhjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1dGlsL2luY2x1ZGUvbWQ1LmgKQEAgLTAsMCArMSw0NiBAQAorLyogTUQ1LkggLSBoZWFkZXIgZmlsZSBmb3IgTUQ1Qy5DCisgKi8KKworLyogQ29weXJpZ2h0IChDKSAxOTkxLTIsIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIENyZWF0ZWQgMTk5MS4gQWxsCityaWdodHMgcmVzZXJ2ZWQuCisKK0xpY2Vuc2UgdG8gY29weSBhbmQgdXNlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGF0IGl0CitpcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0CitBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgc29mdHdhcmUKK29yIHRoaXMgZnVuY3Rpb24uCisKK0xpY2Vuc2UgaXMgYWxzbyBncmFudGVkIHRvIG1ha2UgYW5kIHVzZSBkZXJpdmF0aXZlIHdvcmtzIHByb3ZpZGVkCit0aGF0IHN1Y2ggd29ya3MgYXJlIGlkZW50aWZpZWQgYXMgImRlcml2ZWQgZnJvbSB0aGUgUlNBIERhdGEKK1NlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbAorbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGUgZGVyaXZlZCB3b3JrLgorCitSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyBlaXRoZXIKK3RoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcworc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5IG9mIGFueSBraW5kLgorVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHJldGFpbmVkIGluIGFueSBjb3BpZXMgb2YgYW55IHBhcnQgb2YgdGhpcworZG9jdW1lbnRhdGlvbiBhbmQvb3Igc29mdHdhcmUuCisgKi8KKworI2lmbmRlZiBfTElCVVRJTF9NRDVfSAorI2RlZmluZSBfTElCVVRJTF9NRDVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgTUQ1X1NJWkUgMTYJCS8qIDEyOCBiaXRzICovCisKKy8qIE1ENSBjb250ZXh0LiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHN0YXRlWzRdOwkJLyogc3RhdGUgKEFCQ0QpICovCisgICAgdWludDMyX3QgY291bnRbMl07CQkvKiBudW1iZXIgb2YgYml0cywgbW9kdWxvIDJeNjQgKGxzYiBmaXJzdCkgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07CS8qIGlucHV0IGJ1ZmZlciAqLworfSBNRDVfQ1RYOworCit2b2lkIE1ENUluaXQoTUQ1X0NUWCAqKTsKK3ZvaWQgTUQ1VXBkYXRlKE1ENV9DVFggKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwordm9pZCBNRDVGaW5hbCh1bnNpZ25lZCBjaGFyW01ENV9TSVpFXSwgTUQ1X0NUWCAqKTsKKworY2hhciAqY3J5cHRfbWQ1KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9saWJ1dGlsL2luY2x1ZGUvbWlubWF4LmggYi9jb20zMi9saWJ1dGlsL2luY2x1ZGUvbWlubWF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2ZTM5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS9taW5tYXguaApAQCAtMCwwICsxLDQyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9NSU5NQVhfSAorI2RlZmluZSBfTUlOTUFYX0gKKworLyoKKyAqIG1pbm1heC5oOiBUeXBlLWluZGVwZW5kZW50IHNhZmUgbWluL21heCBtYWNyb3MKKyAqLworCisjZGVmaW5lIG1pbih4LHkpICh7IF9fdHlwZW9mKHgpIHh4ID0gKHgpOyBcCisgICAgICAgICAgICAgICAgICAgIF9fdHlwZW9mKHkpIHl5ID0gKHkpOyBcCisgICAgICAgICAgICAgICAgICAgIHh4IDwgeXkgPyB4eCA6IHl5OyB9KQorI2RlZmluZSBtYXgoeCx5KSAoeyBfX3R5cGVvZih4KSB4eCA9ICh4KTsgXAorICAgICAgICAgICAgICAgICAgICBfX3R5cGVvZih5KSB5eSA9ICh5KTsgXAorICAgICAgICAgICAgICAgICAgICB4eCA+IHl5ID8geHggOiB5eTsgfSkKKworI2VuZGlmIC8qIF9NSU5NQVhfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbGlidXRpbC9pbmNsdWRlL3NoYTEuaCBiL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS9zaGExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzNWU3NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS9zaGExLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBMSUJVVElMX1NIQTFfSAorI2RlZmluZSBMSUJVVElMX1NIQTFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBzdGF0ZVs1XTsKKyAgICB1aW50MzJfdCBjb3VudFsyXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07Cit9IFNIQTFfQ1RYOworCit2b2lkIFNIQTFUcmFuc2Zvcm0odWludDMyX3Qgc3RhdGVbNV0sIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0XSk7Cit2b2lkIFNIQTFJbml0KFNIQTFfQ1RYICogY29udGV4dCk7Cit2b2lkIFNIQTFVcGRhdGUoU0hBMV9DVFggKiBjb250ZXh0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1aW50MzJfdCBsZW4pOwkvKgorCQkJCQkJCQkJCSAgIEpIQiAqLwordm9pZCBTSEExRmluYWwodW5zaWduZWQgY2hhciBkaWdlc3RbMjBdLCBTSEExX0NUWCAqIGNvbnRleHQpOworCisjZW5kaWYgLyogTElCVVRJTF9TSEExX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS94Y3J5cHQuaCBiL2NvbTMyL2xpYnV0aWwvaW5jbHVkZS94Y3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWNlZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXRpbC9pbmNsdWRlL3hjcnlwdC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0xJQlVUSUxfWENSWVBUX0gKKyNkZWZpbmUgX0xJQlVUSUxfWENSWVBUX0gKKworLyogRXh0ZW5kZWQgY3J5cHQoKSBpbXBsZW1lbnRhdGlvbnMgKi8KKworY2hhciAqY3J5cHRfbWQ1KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2NoYXIgKnNoYTI1Nl9jcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitjaGFyICpzaGE1MTJfY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwva2V5bmFtZS5jIGIvY29tMzIvbGlidXRpbC9rZXluYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5ZTY1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYnV0aWwva2V5bmFtZS5jCkBAIC0wLDAgKzEsMTM4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICoga2V5bmFtZS5jCisgKgorICogQ29udmVyc2lvbiBiZXR3ZWVuIHN0cmluZ3MgYW5kIGdldF9rZXkoKSBrZXkgbnVtYmVycy4KKyAqLworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8Z2V0a2V5Lmg+CisjaW5jbHVkZSA8bGlidXRpbC5oPgorCitzdHJ1Y3Qga2V5bmFtZSB7CisgICAgY29uc3QgY2hhciAqc3RyaW5nOworICAgIGludCBrZXk7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGtleW5hbWUga2V5X25hbWVzW10gPSB7CisgICAgeyAiQmFja3NwYWNlIiwgS0VZX0JBQ0tTUEFDRSB9LAorICAgIHsgIlRhYiIsIEtFWV9UQUIgfSwKKyAgICB7ICJFbnRlciIsIEtFWV9FTlRFUiB9LAorICAgIHsgIkVzYyIsIEtFWV9FU0MgfSwKKyAgICB7ICJFc2NhcGUiLCBLRVlfRVNDIH0sCisgICAgeyAiU3BhY2UiLCAnICcgfSwKKyAgICB7ICJePyIsIEtFWV9ERUwgfSwKKyAgICB7ICJGMSIsIEtFWV9GMSB9LAorICAgIHsgIkYyIiwgS0VZX0YyfSwKKyAgICB7ICJGMyIsIEtFWV9GMyB9LAorICAgIHsgIkY0IiwgS0VZX0Y0IH0sCisgICAgeyAiRjUiLCBLRVlfRjUgfSwKKyAgICB7ICJGNiIsIEtFWV9GNiB9LAorICAgIHsgIkY3IiwgS0VZX0Y3IH0sCisgICAgeyAiRjgiLCBLRVlfRjggfSwKKyAgICB7ICJGOSIsIEtFWV9GOSB9LAorICAgIHsgIkYxMCIsIEtFWV9GMTAgfSwKKyAgICB7ICJGMTEiLCBLRVlfRjExIH0sCisgICAgeyAiRjEyIiwgS0VZX0YxMiB9LAorICAgIHsgIlVwIiwgS0VZX1VQIH0sCisgICAgeyAiRG93biIsIEtFWV9ET1dOIH0sCisgICAgeyAiTGVmdCIsIEtFWV9MRUZUIH0sCisgICAgeyAiUmlnaHQiLCBLRVlfUklHSFQgfSwKKyAgICB7ICJQZ1VwIiwgS0VZX1BHVVAgfSwKKyAgICB7ICJQZ0RuIiwgS0VZX1BHRE4gfSwKKyAgICB7ICJIb21lIiwgS0VZX0hPTUUgfSwKKyAgICB7ICJFbmQiLCBLRVlfRU5EIH0sCisgICAgeyAiSW5zZXJ0IiwgS0VZX0lOU0VSVCB9LAorICAgIHsgIkRlbGV0ZSIsIEtFWV9ERUxFVEUgfSwKKyAgICB7IE5VTEwsIEtFWV9OT05FIH0KK307CisKK2ludCBrZXlfbmFtZV90b19jb2RlKGNvbnN0IGNoYXIgKmNvZGUpCit7CisgICAgY29uc3Qgc3RydWN0IGtleW5hbWUgKm5hbWU7CisKKyAgICBpZiAoY29kZVswXSAmJiAhY29kZVsxXSkgeworCS8qIFNpbmdsZSBjaGFyYWN0ZXIgKi8KKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpY29kZVswXTsKKyAgICB9IGVsc2UgaWYgKGNvZGVbMF0gPT0gJ14nICYmIGNvZGVbMV0gJiYgIWNvZGVbMl0pIHsKKwkvKiBDb250cm9sIGNoYXJhY3RlciAqLworCWlmIChjb2RlWzFdID09ICc/JykKKwkgICAgcmV0dXJuIDB4N2Y7CisJZWxzZQorCSAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpY29kZVsxXSAmIDB4OWY7CisgICAgfQorCisKKyAgICBmb3IgKG5hbWUgPSBrZXlfbmFtZXM7IG5hbWUtPnN0cmluZzsgbmFtZSsrKSB7CisJaWYgKCFzdHJjYXNlY21wKG5hbWUtPnN0cmluZywgY29kZSkpCisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbmFtZS0+a2V5OwkvKiBLRVlfTk9ORSBhdCBlbmQgb2YgYXJyYXkgKi8KK30KKworY29uc3QgY2hhciAqa2V5X2NvZGVfdG9fbmFtZShpbnQga2V5KQoreworICAgIHN0YXRpYyBjaGFyIGJ1Zls0XTsKKyAgICBjb25zdCBzdHJ1Y3Qga2V5bmFtZSAqbmFtZTsKKworICAgIGlmIChrZXkgPCAwKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKGtleSA+ICcgJyAmJiBrZXkgPCAweDEwMCkgeworCWlmIChrZXkgJiAweDYwKSB7CisJICAgIGJ1ZlswXSA9IGtleTsKKwkgICAgYnVmWzFdID0gJ1wwJzsKKwl9IGVsc2UgeworCSAgICBidWZbMF0gPSAnXic7CisJICAgIGJ1ZlsxXSA9IGtleSB8IDB4NDA7CisJICAgIGJ1ZlsyXSA9ICdcMCc7CisJfQorCXJldHVybiBidWY7CisgICAgfQorCisgICAgZm9yIChuYW1lID0ga2V5X25hbWVzOyBuYW1lLT5zdHJpbmc7IG5hbWUrKykgeworCWlmIChrZXkgPT0gbmFtZS0+a2V5KQorCSAgICByZXR1cm4gbmFtZS0+c3RyaW5nOworICAgIH0KKworICAgIGlmIChrZXkgPCAnICcpIHsKKwlidWZbMF0gPSAnXic7CisJYnVmWzFdID0ga2V5IHwgMHg0MDsKKwlidWZbMl0gPSAnXDAnOworCXJldHVybiBidWY7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWJ1dGlsL21kNS5jIGIvY29tMzIvbGlidXRpbC9tZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjdlNTFhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXRpbC9tZDUuYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIE1ENUMuQyAtIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuLCBNRDUgbWVzc2FnZS1kaWdlc3QgYWxnb3JpdGhtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTIsIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIENyZWF0ZWQgMTk5MS4gQWxsCisgKiByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgaXQKKyAqIGlzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QKKyAqIEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyBzb2Z0d2FyZQorICogb3IgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBMaWNlbnNlIGlzIGFsc28gZ3JhbnRlZCB0byBtYWtlIGFuZCB1c2UgZGVyaXZhdGl2ZSB3b3JrcyBwcm92aWRlZAorICogdGhhdCBzdWNoIHdvcmtzIGFyZSBpZGVudGlmaWVkIGFzICJkZXJpdmVkIGZyb20gdGhlIFJTQSBEYXRhCisgKiBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwKKyAqIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhlIGRlcml2ZWQgd29yay4KKyAqCisgKiBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyBlaXRoZXIKKyAqIHRoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcworICogc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5IG9mIGFueSBraW5kLgorICoKKyAqIFRoZXNlIG5vdGljZXMgbXVzdCBiZSByZXRhaW5lZCBpbiBhbnkgY29waWVzIG9mIGFueSBwYXJ0IG9mIHRoaXMKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIHNvZnR3YXJlLgorICoKKyAqIFRoaXMgY29kZSBpcyB0aGUgc2FtZSBhcyB0aGUgY29kZSBwdWJsaXNoZWQgYnkgUlNBIEluYy4gIEl0IGhhcyBiZWVuCisgKiBlZGl0ZWQgZm9yIGNsYXJpdHkgYW5kIHN0eWxlIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPG1kNS5oPgorCitzdGF0aWMgdm9pZCBNRDVUcmFuc2Zvcm0odWludDMyX3RbNF0sIGNvbnN0IHVuc2lnbmVkIGNoYXJbNjRdKTsKKworI2RlZmluZSBFbmNvZGUgbWVtY3B5CisjZGVmaW5lIERlY29kZSBtZW1jcHkKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgUEFERElOR1s2NF0gPSB7CisgICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKKy8qIEYsIEcsIEggYW5kIEkgYXJlIGJhc2ljIE1ENSBmdW5jdGlvbnMuICovCisjZGVmaW5lIEYoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQorI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiAofnopKSkKKyNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQorI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCisKKy8qIFJPVEFURV9MRUZUIHJvdGF0ZXMgeCBsZWZ0IG4gYml0cy4gKi8KKyNkZWZpbmUgUk9UQVRFX0xFRlQoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyLShuKSkpKQorCisvKgorICogRkYsIEdHLCBISCwgYW5kIElJIHRyYW5zZm9ybWF0aW9ucyBmb3Igcm91bmRzIDEsIDIsIDMsIGFuZCA0LgorICogUm90YXRpb24gaXMgc2VwYXJhdGUgZnJvbSBhZGRpdGlvbiB0byBwcmV2ZW50IHJlY29tcHV0YXRpb24uCisgKi8KKyNkZWZpbmUgRkYoYSwgYiwgYywgZCwgeCwgcywgYWMpIHsgXAorCShhKSArPSBGICgoYiksIChjKSwgKGQpKSArICh4KSArICh1aW50MzJfdCkoYWMpOyBcCisJKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXAorCShhKSArPSAoYik7IFwKKwl9CisjZGVmaW5lIEdHKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7IFwKKwkoYSkgKz0gRyAoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAodWludDMyX3QpKGFjKTsgXAorCShhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKKwkoYSkgKz0gKGIpOyBcCisJfQorI2RlZmluZSBISChhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCisJKGEpICs9IEggKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKHVpbnQzMl90KShhYyk7IFwKKwkoYSkgPSBST1RBVEVfTEVGVCAoKGEpLCAocykpOyBcCisJKGEpICs9IChiKTsgXAorCX0KKyNkZWZpbmUgSUkoYSwgYiwgYywgZCwgeCwgcywgYWMpIHsgXAorCShhKSArPSBJICgoYiksIChjKSwgKGQpKSArICh4KSArICh1aW50MzJfdCkoYWMpOyBcCisJKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXAorCShhKSArPSAoYik7IFwKKwl9CisKKy8qIE1ENSBpbml0aWFsaXphdGlvbi4gQmVnaW5zIGFuIE1ENSBvcGVyYXRpb24sIHdyaXRpbmcgYSBuZXcgY29udGV4dC4gKi8KKwordm9pZCBNRDVJbml0KE1ENV9DVFggKiBjb250ZXh0KQoreworICAgIGNvbnRleHQtPmNvdW50WzBdID0gY29udGV4dC0+Y291bnRbMV0gPSAwOworCisgICAgLyogTG9hZCBtYWdpYyBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuICAqLworICAgIGNvbnRleHQtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKKyAgICBjb250ZXh0LT5zdGF0ZVsxXSA9IDB4ZWZjZGFiODk7CisgICAgY29udGV4dC0+c3RhdGVbMl0gPSAweDk4YmFkY2ZlOworICAgIGNvbnRleHQtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKK30KKworLyoKKyAqIE1ENSBibG9jayB1cGRhdGUgb3BlcmF0aW9uLiBDb250aW51ZXMgYW4gTUQ1IG1lc3NhZ2UtZGlnZXN0CisgKiBvcGVyYXRpb24sIHByb2Nlc3NpbmcgYW5vdGhlciBtZXNzYWdlIGJsb2NrLCBhbmQgdXBkYXRpbmcgdGhlCisgKiBjb250ZXh0LgorICovCisKK3ZvaWQgTUQ1VXBkYXRlKE1ENV9DVFggKiBjb250ZXh0LCBjb25zdCB2b2lkICppbiwgc2l6ZV90IGlucHV0TGVuKQoreworICAgIHVuc2lnbmVkIGludCBpLCBpZHgsIHBhcnRMZW47CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQgPSBpbjsKKworICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLworICAgIGlkeCA9ICh1bnNpZ25lZCBpbnQpKChjb250ZXh0LT5jb3VudFswXSA+PiAzKSAmIDB4M0YpOworCisgICAgLyogVXBkYXRlIG51bWJlciBvZiBiaXRzICovCisgICAgaWYgKChjb250ZXh0LT5jb3VudFswXSArPSAoKHVpbnQzMl90KSBpbnB1dExlbiA8PCAzKSkKKwk8ICgodWludDMyX3QpIGlucHV0TGVuIDw8IDMpKQorCWNvbnRleHQtPmNvdW50WzFdKys7CisgICAgY29udGV4dC0+Y291bnRbMV0gKz0gKCh1aW50MzJfdCkgaW5wdXRMZW4gPj4gMjkpOworCisgICAgcGFydExlbiA9IDY0IC0gaWR4OworCisgICAgLyogVHJhbnNmb3JtIGFzIG1hbnkgdGltZXMgYXMgcG9zc2libGUuICovCisgICAgaWYgKGlucHV0TGVuID49IHBhcnRMZW4pIHsKKwltZW1jcHkoKHZvaWQgKikmY29udGV4dC0+YnVmZmVyW2lkeF0sIChjb25zdCB2b2lkICopaW5wdXQsIHBhcnRMZW4pOworCU1ENVRyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKKworCWZvciAoaSA9IHBhcnRMZW47IGkgKyA2MyA8IGlucHV0TGVuOyBpICs9IDY0KQorCSAgICBNRDVUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsICZpbnB1dFtpXSk7CisKKwlpZHggPSAwOworICAgIH0gZWxzZQorCWkgPSAwOworCisgICAgLyogQnVmZmVyIHJlbWFpbmluZyBpbnB1dCAqLworICAgIG1lbWNweSgodm9pZCAqKSZjb250ZXh0LT5idWZmZXJbaWR4XSwgKGNvbnN0IHZvaWQgKikmaW5wdXRbaV0sCisJICAgaW5wdXRMZW4gLSBpKTsKK30KKworLyoKKyAqIE1ENSBwYWRkaW5nLiBBZGRzIHBhZGRpbmcgZm9sbG93ZWQgYnkgb3JpZ2luYWwgbGVuZ3RoLgorICovCisKK3N0YXRpYyB2b2lkIE1ENVBhZChNRDVfQ1RYICogY29udGV4dCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGJpdHNbOF07CisgICAgdW5zaWduZWQgaW50IGlkeCwgcGFkTGVuOworCisgICAgLyogU2F2ZSBudW1iZXIgb2YgYml0cyAqLworICAgIEVuY29kZShiaXRzLCBjb250ZXh0LT5jb3VudCwgOCk7CisKKyAgICAvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NC4gKi8KKyAgICBpZHggPSAodW5zaWduZWQgaW50KSgoY29udGV4dC0+Y291bnRbMF0gPj4gMykgJiAweDNmKTsKKyAgICBwYWRMZW4gPSAoaWR4IDwgNTYpID8gKDU2IC0gaWR4KSA6ICgxMjAgLSBpZHgpOworICAgIE1ENVVwZGF0ZShjb250ZXh0LCBQQURESU5HLCBwYWRMZW4pOworCisgICAgLyogQXBwZW5kIGxlbmd0aCAoYmVmb3JlIHBhZGRpbmcpICovCisgICAgTUQ1VXBkYXRlKGNvbnRleHQsIGJpdHMsIDgpOworfQorCisvKgorICogTUQ1IGZpbmFsaXphdGlvbi4gRW5kcyBhbiBNRDUgbWVzc2FnZS1kaWdlc3Qgb3BlcmF0aW9uLCB3cml0aW5nIHRoZQorICogdGhlIG1lc3NhZ2UgZGlnZXN0IGFuZCB6ZXJvaXppbmcgdGhlIGNvbnRleHQuCisgKi8KKwordm9pZCBNRDVGaW5hbCh1bnNpZ25lZCBjaGFyIGRpZ2VzdFsxNl0sIE1ENV9DVFggKiBjb250ZXh0KQoreworICAgIC8qIERvIHBhZGRpbmcuICovCisgICAgTUQ1UGFkKGNvbnRleHQpOworCisgICAgLyogU3RvcmUgc3RhdGUgaW4gZGlnZXN0ICovCisgICAgRW5jb2RlKGRpZ2VzdCwgY29udGV4dC0+c3RhdGUsIDE2KTsKKworICAgIC8qIFplcm9pemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLworICAgIG1lbXNldCgodm9pZCAqKWNvbnRleHQsIDAsIHNpemVvZigqY29udGV4dCkpOworfQorCisvKiBNRDUgYmFzaWMgdHJhbnNmb3JtYXRpb24uIFRyYW5zZm9ybXMgc3RhdGUgYmFzZWQgb24gYmxvY2suICovCisKK3N0YXRpYyB2b2lkIE1ENVRyYW5zZm9ybShzdGF0ZSwgYmxvY2spCit1aW50MzJfdCBzdGF0ZVs0XTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYmxvY2tbNjRdOworeworICAgIHVpbnQzMl90IGEgPSBzdGF0ZVswXSwgYiA9IHN0YXRlWzFdLCBjID0gc3RhdGVbMl0sIGQgPSBzdGF0ZVszXSwgeFsxNl07CisKKyAgICBEZWNvZGUoeCwgYmxvY2ssIDY0KTsKKworICAgIC8qIFJvdW5kIDEgKi8KKyNkZWZpbmUgUzExIDcKKyNkZWZpbmUgUzEyIDEyCisjZGVmaW5lIFMxMyAxNworI2RlZmluZSBTMTQgMjIKKyAgICBGRihhLCBiLCBjLCBkLCB4WzBdLCBTMTEsIDB4ZDc2YWE0NzgpOwkvKiAxICovCisgICAgRkYoZCwgYSwgYiwgYywgeFsxXSwgUzEyLCAweGU4YzdiNzU2KTsJLyogMiAqLworICAgIEZGKGMsIGQsIGEsIGIsIHhbMl0sIFMxMywgMHgyNDIwNzBkYik7CS8qIDMgKi8KKyAgICBGRihiLCBjLCBkLCBhLCB4WzNdLCBTMTQsIDB4YzFiZGNlZWUpOwkvKiA0ICovCisgICAgRkYoYSwgYiwgYywgZCwgeFs0XSwgUzExLCAweGY1N2MwZmFmKTsJLyogNSAqLworICAgIEZGKGQsIGEsIGIsIGMsIHhbNV0sIFMxMiwgMHg0Nzg3YzYyYSk7CS8qIDYgKi8KKyAgICBGRihjLCBkLCBhLCBiLCB4WzZdLCBTMTMsIDB4YTgzMDQ2MTMpOwkvKiA3ICovCisgICAgRkYoYiwgYywgZCwgYSwgeFs3XSwgUzE0LCAweGZkNDY5NTAxKTsJLyogOCAqLworICAgIEZGKGEsIGIsIGMsIGQsIHhbOF0sIFMxMSwgMHg2OTgwOThkOCk7CS8qIDkgKi8KKyAgICBGRihkLCBhLCBiLCBjLCB4WzldLCBTMTIsIDB4OGI0NGY3YWYpOwkvKiAxMCAqLworICAgIEZGKGMsIGQsIGEsIGIsIHhbMTBdLCBTMTMsIDB4ZmZmZjViYjEpOwkvKiAxMSAqLworICAgIEZGKGIsIGMsIGQsIGEsIHhbMTFdLCBTMTQsIDB4ODk1Y2Q3YmUpOwkvKiAxMiAqLworICAgIEZGKGEsIGIsIGMsIGQsIHhbMTJdLCBTMTEsIDB4NmI5MDExMjIpOwkvKiAxMyAqLworICAgIEZGKGQsIGEsIGIsIGMsIHhbMTNdLCBTMTIsIDB4ZmQ5ODcxOTMpOwkvKiAxNCAqLworICAgIEZGKGMsIGQsIGEsIGIsIHhbMTRdLCBTMTMsIDB4YTY3OTQzOGUpOwkvKiAxNSAqLworICAgIEZGKGIsIGMsIGQsIGEsIHhbMTVdLCBTMTQsIDB4NDliNDA4MjEpOwkvKiAxNiAqLworCisgICAgLyogUm91bmQgMiAqLworI2RlZmluZSBTMjEgNQorI2RlZmluZSBTMjIgOQorI2RlZmluZSBTMjMgMTQKKyNkZWZpbmUgUzI0IDIwCisgICAgR0coYSwgYiwgYywgZCwgeFsxXSwgUzIxLCAweGY2MWUyNTYyKTsJLyogMTcgKi8KKyAgICBHRyhkLCBhLCBiLCBjLCB4WzZdLCBTMjIsIDB4YzA0MGIzNDApOwkvKiAxOCAqLworICAgIEdHKGMsIGQsIGEsIGIsIHhbMTFdLCBTMjMsIDB4MjY1ZTVhNTEpOwkvKiAxOSAqLworICAgIEdHKGIsIGMsIGQsIGEsIHhbMF0sIFMyNCwgMHhlOWI2YzdhYSk7CS8qIDIwICovCisgICAgR0coYSwgYiwgYywgZCwgeFs1XSwgUzIxLCAweGQ2MmYxMDVkKTsJLyogMjEgKi8KKyAgICBHRyhkLCBhLCBiLCBjLCB4WzEwXSwgUzIyLCAweDI0NDE0NTMpOwkvKiAyMiAqLworICAgIEdHKGMsIGQsIGEsIGIsIHhbMTVdLCBTMjMsIDB4ZDhhMWU2ODEpOwkvKiAyMyAqLworICAgIEdHKGIsIGMsIGQsIGEsIHhbNF0sIFMyNCwgMHhlN2QzZmJjOCk7CS8qIDI0ICovCisgICAgR0coYSwgYiwgYywgZCwgeFs5XSwgUzIxLCAweDIxZTFjZGU2KTsJLyogMjUgKi8KKyAgICBHRyhkLCBhLCBiLCBjLCB4WzE0XSwgUzIyLCAweGMzMzcwN2Q2KTsJLyogMjYgKi8KKyAgICBHRyhjLCBkLCBhLCBiLCB4WzNdLCBTMjMsIDB4ZjRkNTBkODcpOwkvKiAyNyAqLworICAgIEdHKGIsIGMsIGQsIGEsIHhbOF0sIFMyNCwgMHg0NTVhMTRlZCk7CS8qIDI4ICovCisgICAgR0coYSwgYiwgYywgZCwgeFsxM10sIFMyMSwgMHhhOWUzZTkwNSk7CS8qIDI5ICovCisgICAgR0coZCwgYSwgYiwgYywgeFsyXSwgUzIyLCAweGZjZWZhM2Y4KTsJLyogMzAgKi8KKyAgICBHRyhjLCBkLCBhLCBiLCB4WzddLCBTMjMsIDB4Njc2ZjAyZDkpOwkvKiAzMSAqLworICAgIEdHKGIsIGMsIGQsIGEsIHhbMTJdLCBTMjQsIDB4OGQyYTRjOGEpOwkvKiAzMiAqLworCisgICAgLyogUm91bmQgMyAqLworI2RlZmluZSBTMzEgNAorI2RlZmluZSBTMzIgMTEKKyNkZWZpbmUgUzMzIDE2CisjZGVmaW5lIFMzNCAyMworICAgIEhIKGEsIGIsIGMsIGQsIHhbNV0sIFMzMSwgMHhmZmZhMzk0Mik7CS8qIDMzICovCisgICAgSEgoZCwgYSwgYiwgYywgeFs4XSwgUzMyLCAweDg3NzFmNjgxKTsJLyogMzQgKi8KKyAgICBISChjLCBkLCBhLCBiLCB4WzExXSwgUzMzLCAweDZkOWQ2MTIyKTsJLyogMzUgKi8KKyAgICBISChiLCBjLCBkLCBhLCB4WzE0XSwgUzM0LCAweGZkZTUzODBjKTsJLyogMzYgKi8KKyAgICBISChhLCBiLCBjLCBkLCB4WzFdLCBTMzEsIDB4YTRiZWVhNDQpOwkvKiAzNyAqLworICAgIEhIKGQsIGEsIGIsIGMsIHhbNF0sIFMzMiwgMHg0YmRlY2ZhOSk7CS8qIDM4ICovCisgICAgSEgoYywgZCwgYSwgYiwgeFs3XSwgUzMzLCAweGY2YmI0YjYwKTsJLyogMzkgKi8KKyAgICBISChiLCBjLCBkLCBhLCB4WzEwXSwgUzM0LCAweGJlYmZiYzcwKTsJLyogNDAgKi8KKyAgICBISChhLCBiLCBjLCBkLCB4WzEzXSwgUzMxLCAweDI4OWI3ZWM2KTsJLyogNDEgKi8KKyAgICBISChkLCBhLCBiLCBjLCB4WzBdLCBTMzIsIDB4ZWFhMTI3ZmEpOwkvKiA0MiAqLworICAgIEhIKGMsIGQsIGEsIGIsIHhbM10sIFMzMywgMHhkNGVmMzA4NSk7CS8qIDQzICovCisgICAgSEgoYiwgYywgZCwgYSwgeFs2XSwgUzM0LCAweDQ4ODFkMDUpOwkvKiA0NCAqLworICAgIEhIKGEsIGIsIGMsIGQsIHhbOV0sIFMzMSwgMHhkOWQ0ZDAzOSk7CS8qIDQ1ICovCisgICAgSEgoZCwgYSwgYiwgYywgeFsxMl0sIFMzMiwgMHhlNmRiOTllNSk7CS8qIDQ2ICovCisgICAgSEgoYywgZCwgYSwgYiwgeFsxNV0sIFMzMywgMHgxZmEyN2NmOCk7CS8qIDQ3ICovCisgICAgSEgoYiwgYywgZCwgYSwgeFsyXSwgUzM0LCAweGM0YWM1NjY1KTsJLyogNDggKi8KKworICAgIC8qIFJvdW5kIDQgKi8KKyNkZWZpbmUgUzQxIDYKKyNkZWZpbmUgUzQyIDEwCisjZGVmaW5lIFM0MyAxNQorI2RlZmluZSBTNDQgMjEKKyAgICBJSShhLCBiLCBjLCBkLCB4WzBdLCBTNDEsIDB4ZjQyOTIyNDQpOwkvKiA0OSAqLworICAgIElJKGQsIGEsIGIsIGMsIHhbN10sIFM0MiwgMHg0MzJhZmY5Nyk7CS8qIDUwICovCisgICAgSUkoYywgZCwgYSwgYiwgeFsxNF0sIFM0MywgMHhhYjk0MjNhNyk7CS8qIDUxICovCisgICAgSUkoYiwgYywgZCwgYSwgeFs1XSwgUzQ0LCAweGZjOTNhMDM5KTsJLyogNTIgKi8KKyAgICBJSShhLCBiLCBjLCBkLCB4WzEyXSwgUzQxLCAweDY1NWI1OWMzKTsJLyogNTMgKi8KKyAgICBJSShkLCBhLCBiLCBjLCB4WzNdLCBTNDIsIDB4OGYwY2NjOTIpOwkvKiA1NCAqLworICAgIElJKGMsIGQsIGEsIGIsIHhbMTBdLCBTNDMsIDB4ZmZlZmY0N2QpOwkvKiA1NSAqLworICAgIElJKGIsIGMsIGQsIGEsIHhbMV0sIFM0NCwgMHg4NTg0NWRkMSk7CS8qIDU2ICovCisgICAgSUkoYSwgYiwgYywgZCwgeFs4XSwgUzQxLCAweDZmYTg3ZTRmKTsJLyogNTcgKi8KKyAgICBJSShkLCBhLCBiLCBjLCB4WzE1XSwgUzQyLCAweGZlMmNlNmUwKTsJLyogNTggKi8KKyAgICBJSShjLCBkLCBhLCBiLCB4WzZdLCBTNDMsIDB4YTMwMTQzMTQpOwkvKiA1OSAqLworICAgIElJKGIsIGMsIGQsIGEsIHhbMTNdLCBTNDQsIDB4NGUwODExYTEpOwkvKiA2MCAqLworICAgIElJKGEsIGIsIGMsIGQsIHhbNF0sIFM0MSwgMHhmNzUzN2U4Mik7CS8qIDYxICovCisgICAgSUkoZCwgYSwgYiwgYywgeFsxMV0sIFM0MiwgMHhiZDNhZjIzNSk7CS8qIDYyICovCisgICAgSUkoYywgZCwgYSwgYiwgeFsyXSwgUzQzLCAweDJhZDdkMmJiKTsJLyogNjMgKi8KKyAgICBJSShiLCBjLCBkLCBhLCB4WzldLCBTNDQsIDB4ZWI4NmQzOTEpOwkvKiA2NCAqLworCisgICAgc3RhdGVbMF0gKz0gYTsKKyAgICBzdGF0ZVsxXSArPSBiOworICAgIHN0YXRlWzJdICs9IGM7CisgICAgc3RhdGVbM10gKz0gZDsKKworICAgIC8qIFplcm9pemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLworICAgIG1lbXNldCgodm9pZCAqKXgsIDAsIHNpemVvZih4KSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9saWJ1dGlsL3F1aWNrc29ydC5jIGIvY29tMzIvbGlidXRpbC9xdWlja3NvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFjMGYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXRpbC9xdWlja3NvcnQuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogc29ydC5jIC0gU2FtcGxlIEVMRiBtb2R1bGUgcHJvdmlkaW5nIGEgcXVpY2sgc29ydCBmdW5jdGlvbgorICoKKyAqICBDcmVhdGVkIG9uOiBBdWcgMTEsIDIwMDgKKyAqICAgICAgQXV0aG9yOiBTdGVmYW4gQnVjdXIgPHN0ZWZhbmJAenl0b3IuY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIGlubGluZSB2b2lkIHN3YXAoaW50ICp4LCBpbnQgKnkpCit7CisgICAgaW50IHRtcDsKKyAgICB0bXAgPSAqeDsKKyAgICAqeCA9ICp5OworICAgICp5ID0gdG1wOworfQorCitzdGF0aWMgaW5saW5lIGludCByYW5kaW50KGludCBsLCBpbnQgdSkKK3sKKyAgICByZXR1cm4gbCArIChyYW5kKCkgJSAodSAtIGwgKyAxKSk7Cit9CisKKy8qKgorICogcXVpY2tfc29ydF9yYW5nZSAtIEEgc21hbGwgYW5kIGVmZmljaWVudCB2ZXJzaW9uIG9mIHF1aWNrc29ydC4KKyAqIEBudW1zOiBUaGUgbnVtYmVycyB0byBzb3J0CisgKiBAbDogVGhlIGxvd2VyIGluZGV4IGluIHRoZSB2ZWN0b3IgKGluY2x1c2l2ZSkKKyAqIEB1OiBUaGUgdXBwZXIgaW5kZXggaW4gdGhlIHZlY3RvciAoaW5jbHVzaXZlKQorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyB0YWtlbiBmcm9tICJCZWF1dGlmdWwgQ29kZSIsIGJ5IE8nUmVpbGx5LCB0aGUKKyAqIGJvb2sgc3R1ZGVudHMgcmVjZWl2ZWQgZnJvbSBHb29nbGUgYXMgYSBnaWZ0IGZvciB0aGVpciBhY2NlcHRhbmNlCisgKiBpbiB0aGUgR1NvQyAyMDA4IHByb2dyYW0uIFRoZSBjb2RlIGJlbG9uZ3MgdG8gSm9uIEJlbnRsZXksIHdobworICogd3JvdGUgdGhlIHRoaXJkIGNoYXB0ZXIgb2YgdGhlIGJvb2suIFNpbmNlIEVMRiBtb2R1bGVzIHdlcmUgd3JpdHRlbgorICogYXMgcGFydCBvZiB0aGlzIHByb2dyYW0sIHRoZSBhdXRob3Igb2YgdGhlIG1vZHVsZSBjb25zaWRlcmVkCisgKiB0aGUgYm9vayBoYWQgdG8gYmUgcHV0IHRvIHNvbWUgdXNlLiA6KQorICovCitzdGF0aWMgdm9pZCBxdWlja19zb3J0X3JhbmdlKGludCAqbnVtcywgaW50IGwsIGludCB1KQoreworICAgIGludCBpLCBtOworICAgIGlmIChsID49IHUpCisJcmV0dXJuOworCisgICAgc3dhcCgmbnVtc1tsXSwgJm51bXNbcmFuZGludChsLCB1KV0pOworCisgICAgbSA9IGw7CisgICAgZm9yIChpID0gbCArIDE7IGkgPD0gdTsgaSsrKSB7CisJaWYgKG51bXNbaV0gPCBudW1zW2xdKQorCSAgICBzd2FwKCZudW1zWysrbV0sICZudW1zW2ldKTsKKyAgICB9CisKKyAgICBzd2FwKCZudW1zW2xdLCAmbnVtc1ttXSk7CisKKyAgICBxdWlja19zb3J0X3JhbmdlKG51bXMsIGwsIG0gLSAxKTsKKyAgICBxdWlja19zb3J0X3JhbmdlKG51bXMsIG0gKyAxLCB1KTsKK30KKwordm9pZCBxdWlja19zb3J0KGludCAqbnVtcywgaW50IGNvdW50KQoreworICAgIHF1aWNrX3NvcnRfcmFuZ2UobnVtcywgMCwgY291bnQgLSAxKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvc2hhMWhhc2guYyBiL2NvbTMyL2xpYnV0aWwvc2hhMWhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzc5NjkzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXRpbC9zaGExaGFzaC5jCkBAIC0wLDAgKzEsMzY0IEBACisvKgorU0hBLTEgaW4gQworQnkgU3RldmUgUmVpZCA8c3JlaWRAc2VhLXRvLXNreS5uZXQ+CisxMDAlIFB1YmxpYyBEb21haW4KKworLS0tLS0tLS0tLS0tLS0tLS0KK01vZGlmaWVkIDcvOTgKK0J5IEphbWVzIEguIEJyb3duIDxqYnJvd25AYnVyZ295bmUuY29tPgorU3RpbGwgMTAwJSBQdWJsaWMgRG9tYWluCisKK0NvcnJlY3RlZCBhIHByb2JsZW0gd2hpY2ggZ2VuZXJhdGVkIGltcHJvcGVyIGhhc2ggdmFsdWVzIG9uIDE2IGJpdCBtYWNoaW5lcworUm91dGluZSBTSEExVXBkYXRlIGNoYW5nZWQgZnJvbQorCXZvaWQgU0hBMVVwZGF0ZShTSEExX0NUWCogY29udGV4dCwgdW5zaWduZWQgY2hhciogZGF0YSwgdW5zaWduZWQgaW50CitsZW4pCit0bworCXZvaWQgU0hBMVVwZGF0ZShTSEExX0NUWCogY29udGV4dCwgdW5zaWduZWQgY2hhciogZGF0YSwgdW5zaWduZWQKK2xvbmcgbGVuKQorCitUaGUgJ2xlbicgcGFyYW1ldGVyIHdhcyBkZWNsYXJlZCBhbiBpbnQgd2hpY2ggd29ya3MgZmluZSBvbiAzMiBiaXQgbWFjaGluZXMuCitIb3dldmVyLCBvbiAxNiBiaXQgbWFjaGluZXMgYW4gaW50IGlzIHRvbyBzbWFsbCBmb3IgdGhlIHNoaWZ0cyBiZWluZyBkb25lCithZ2FpbnN0CitpdC4gIFRoaXMgY2F1c2VkIHRoZSBoYXNoIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGluY29ycmVjdCB2YWx1ZXMgaWYgbGVuIHdhcworZ3JlYXRlciB0aGFuIDgxOTEgKDhLIC0gMSkgZHVlIHRvIHRoZSAnbGVuIDw8IDMnIG9uIGxpbmUgMyBvZiBTSEExVXBkYXRlKCkuCisKK1NpbmNlIHRoZSBmaWxlIElPIGluIG1haW4oKSByZWFkcyAxNksgYXQgYSB0aW1lLCBhbnkgZmlsZSA4SyBvciBsYXJnZXIgd291bGQKK2JlIGd1YXJhbnRlZWQgdG8gZ2VuZXJhdGUgdGhlIHdyb25nIGhhc2ggKGUuZy4gVGVzdCBWZWN0b3IgIzMsIGEgbWlsbGlvbgorImEicykuCisKK0kgYWxzbyBjaGFuZ2VkIHRoZSBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZXMgaSAmIGogaW4gU0hBMVVwZGF0ZSB0bwordW5zaWduZWQgbG9uZyBmcm9tIHVuc2lnbmVkIGludCBmb3IgdGhlIHNhbWUgcmVhc29uLgorCitUaGVzZSBjaGFuZ2VzIHNob3VsZCBtYWtlIG5vIGRpZmZlcmVuY2UgdG8gYW55IDMyIGJpdCBpbXBsZW1lbnRhdGlvbnMgc2luY2UKK2FuCitpbnQgYW5kIGEgbG9uZyBhcmUgdGhlIHNhbWUgc2l6ZSBpbiB0aG9zZSBlbnZpcm9ubWVudHMuCisKKy0tCitJIGFsc28gY29ycmVjdGVkIGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzIGdlbmVyYXRlZCBieSBCb3JsYW5kIEMuCisxLiBBZGRlZCAjaW5jbHVkZSA8cHJvY2Vzcy5oPiBmb3IgZXhpdCgpIHByb3RvdHlwZQorMi4gUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgJ2onIGluIFNIQTFGaW5hbAorMy4gQ2hhbmdlZCBleGl0KDApIHRvIHJldHVybigwKSBhdCBlbmQgb2YgbWFpbi4KKworQUxMIGNoYW5nZXMgSSBtYWRlIGNhbiBiZSBsb2NhdGVkIGJ5IHNlYXJjaGluZyBmb3IgY29tbWVudHMgY29udGFpbmluZyAnSkhCJworLS0tLS0tLS0tLS0tLS0tLS0KK01vZGlmaWVkIDgvOTgKK0J5IFN0ZXZlIFJlaWQgPHNyZWlkQHNlYS10by1za3kubmV0PgorU3RpbGwgMTAwJSBwdWJsaWMgZG9tYWluCisKKzEtIFJlbW92ZWQgI2luY2x1ZGUgPHByb2Nlc3MuaD4gYW5kIHVzZWQgcmV0dXJuKCkgaW5zdGVhZCBvZiBleGl0KCkKKzItIEZpeGVkIG92ZXJ3cml0aW5nIG9mIGZpbmFsY291bnQgaW4gU0hBMUZpbmFsKCkgKGRpc2NvdmVyZWQgYnkgQ2hyaXMgSGFsbCkKKzMtIENoYW5nZWQgZW1haWwgYWRkcmVzcyBmcm9tIHN0ZXZlQGVkbXdlYi5jb20gdG8gc3JlaWRAc2VhLXRvLXNreS5uZXQKKworLS0tLS0tLS0tLS0tLS0tLS0KK01vZGlmaWVkIDQvMDEKK0J5IFNhdWwgS3Jhdml0eiA8U2F1bC5LcmF2aXR6QGNlbGVyYS5jb20+CitTdGlsbCAxMDAlIFBECitNb2RpZmllZCB0byBydW4gb24gQ29tcGFxIEFscGhhIGhhcmR3YXJlLgorCistLS0tLS0tLS0tLS0tLS0tLQorTW9kaWZpZWQgMi8wMworQnkgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CitTdGlsbCAxMDAlIFBECitNb2RpZmllZCB0byBydW4gb24gYW55IGhhcmR3YXJlIHdpdGggPGludHR5cGVzLmg+IGFuZCA8bmV0aW5ldC9pbi5oPgorQ2hhbmdlZCB0aGUgZHJpdmVyIHByb2dyYW0KKworKi8KKworLyoKK1Rlc3QgVmVjdG9ycyAoZnJvbSBGSVBTIFBVQiAxODAtMSkKKyJhYmMiCisgIEE5OTkzRTM2IDQ3MDY4MTZBIEJBM0UyNTcxIDc4NTBDMjZDIDlDRDBEODlECisiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiCisgIDg0OTgzRTQ0IDFDM0JEMjZFIEJBQUU0QUExIEY5NTEyOUU1IEU1NDY3MEYxCitBIG1pbGxpb24gcmVwZXRpdGlvbnMgb2YgImEiCisgIDM0QUE5NzNDIEQ0QzREQUE0IEY2MUVFQjJCIERCQUQyNzMxIDY1MzQwMTZGCisqLworCisvKiAjZGVmaW5lIFNIQTFIQU5EU09GRiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CQkvKiBGb3IgaHRvbmwvbnRvaGwvaHRvbnMvbnRvaHMgKi8KKworI2luY2x1ZGUgInNoYTEuaCIKKworI2RlZmluZSByb2wodmFsdWUsIGJpdHMpICgoKHZhbHVlKSA8PCAoYml0cykpIHwgKCh2YWx1ZSkgPj4gKDMyIC0gKGJpdHMpKSkpCisKKy8qIGJsazAoKSBhbmQgYmxrKCkgcGVyZm9ybSB0aGUgaW5pdGlhbCBleHBhbmQuICovCisvKiBJIGdvdCB0aGUgaWRlYSBvZiBleHBhbmRpbmcgZHVyaW5nIHRoZSByb3VuZCBmdW5jdGlvbiBmcm9tIFNTTGVheSAqLworI2RlZmluZSBibGswKGkpIChibG9jay0+bFtpXSA9IG50b2hsKGJsb2NrLT5sW2ldKSkKKyNkZWZpbmUgYmxrKGkpIChibG9jay0+bFtpJjE1XSA9IHJvbChibG9jay0+bFsoaSsxMykmMTVdXmJsb2NrLT5sWyhpKzgpJjE1XSBcCisgICAgXmJsb2NrLT5sWyhpKzIpJjE1XV5ibG9jay0+bFtpJjE1XSwxKSkKKworLyogKFIwK1IxKSwgUjIsIFIzLCBSNCBhcmUgdGhlIGRpZmZlcmVudCBvcGVyYXRpb25zIHVzZWQgaW4gU0hBMSAqLworI2RlZmluZSBSMCh2LHcseCx5LHosaSkgeis9KCh3Jih4XnkpKV55KStibGswKGkpKzB4NUE4Mjc5OTkrcm9sKHYsNSk7dz1yb2wodywzMCk7CisjZGVmaW5lIFIxKHYsdyx4LHkseixpKSB6Kz0oKHcmKHheeSkpXnkpK2JsayhpKSsweDVBODI3OTk5K3JvbCh2LDUpO3c9cm9sKHcsMzApOworI2RlZmluZSBSMih2LHcseCx5LHosaSkgeis9KHdeeF55KStibGsoaSkrMHg2RUQ5RUJBMStyb2wodiw1KTt3PXJvbCh3LDMwKTsKKyNkZWZpbmUgUjModix3LHgseSx6LGkpIHorPSgoKHd8eCkmeSl8KHcmeCkpK2JsayhpKSsweDhGMUJCQ0RDK3JvbCh2LDUpO3c9cm9sKHcsMzApOworI2RlZmluZSBSNCh2LHcseCx5LHosaSkgeis9KHdeeF55KStibGsoaSkrMHhDQTYyQzFENityb2wodiw1KTt3PXJvbCh3LDMwKTsKKworI2lmZGVmIFZFUkJPU0UJCQkvKiBTQUsgKi8KK3ZvaWQgU0hBUHJpbnRDb250ZXh0KFNIQTFfQ1RYICogY29udGV4dCwgY2hhciAqbXNnKQoreworICAgIHByaW50ZigiJXMgKCVkLCVkKSAleCAleCAleCAleCAleFxuIiwKKwkgICBtc2csCisJICAgY29udGV4dC0+Y291bnRbMF0sIGNvbnRleHQtPmNvdW50WzFdLAorCSAgIGNvbnRleHQtPnN0YXRlWzBdLAorCSAgIGNvbnRleHQtPnN0YXRlWzFdLAorCSAgIGNvbnRleHQtPnN0YXRlWzJdLCBjb250ZXh0LT5zdGF0ZVszXSwgY29udGV4dC0+c3RhdGVbNF0pOworfQorI2VuZGlmCisKKy8qIEhhc2ggYSBzaW5nbGUgNTEyLWJpdCBibG9jay4gVGhpcyBpcyB0aGUgY29yZSBvZiB0aGUgYWxnb3JpdGhtLiAqLworCit2b2lkIFNIQTFUcmFuc2Zvcm0odWludDMyX3Qgc3RhdGVbNV0sIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0XSkKK3sKKyAgICB1aW50MzJfdCBhLCBiLCBjLCBkLCBlOworICAgIHR5cGVkZWYgdW5pb24geworCXVuc2lnbmVkIGNoYXIgY1s2NF07CisJdWludDMyX3QgbFsxNl07CisgICAgfSBDSEFSNjRMT05HMTY7CisgICAgQ0hBUjY0TE9ORzE2ICpibG9jazsKKyNpZmRlZiBTSEExSEFORFNPRkYKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB3b3Jrc3BhY2VbNjRdOworICAgIGJsb2NrID0gKENIQVI2NExPTkcxNiAqKSB3b3Jrc3BhY2U7CisgICAgbWVtY3B5KGJsb2NrLCBidWZmZXIsIDY0KTsKKyNlbHNlCisgICAgYmxvY2sgPSAoQ0hBUjY0TE9ORzE2ICopIGJ1ZmZlcjsKKyNlbmRpZgorICAgIC8qIENvcHkgY29udGV4dC0+c3RhdGVbXSB0byB3b3JraW5nIHZhcnMgKi8KKyAgICBhID0gc3RhdGVbMF07CisgICAgYiA9IHN0YXRlWzFdOworICAgIGMgPSBzdGF0ZVsyXTsKKyAgICBkID0gc3RhdGVbM107CisgICAgZSA9IHN0YXRlWzRdOworICAgIC8qIDQgcm91bmRzIG9mIDIwIG9wZXJhdGlvbnMgZWFjaC4gTG9vcCB1bnJvbGxlZC4gKi8KKyAgICBSMChhLCBiLCBjLCBkLCBlLCAwKTsKKyAgICBSMChlLCBhLCBiLCBjLCBkLCAxKTsKKyAgICBSMChkLCBlLCBhLCBiLCBjLCAyKTsKKyAgICBSMChjLCBkLCBlLCBhLCBiLCAzKTsKKyAgICBSMChiLCBjLCBkLCBlLCBhLCA0KTsKKyAgICBSMChhLCBiLCBjLCBkLCBlLCA1KTsKKyAgICBSMChlLCBhLCBiLCBjLCBkLCA2KTsKKyAgICBSMChkLCBlLCBhLCBiLCBjLCA3KTsKKyAgICBSMChjLCBkLCBlLCBhLCBiLCA4KTsKKyAgICBSMChiLCBjLCBkLCBlLCBhLCA5KTsKKyAgICBSMChhLCBiLCBjLCBkLCBlLCAxMCk7CisgICAgUjAoZSwgYSwgYiwgYywgZCwgMTEpOworICAgIFIwKGQsIGUsIGEsIGIsIGMsIDEyKTsKKyAgICBSMChjLCBkLCBlLCBhLCBiLCAxMyk7CisgICAgUjAoYiwgYywgZCwgZSwgYSwgMTQpOworICAgIFIwKGEsIGIsIGMsIGQsIGUsIDE1KTsKKyAgICBSMShlLCBhLCBiLCBjLCBkLCAxNik7CisgICAgUjEoZCwgZSwgYSwgYiwgYywgMTcpOworICAgIFIxKGMsIGQsIGUsIGEsIGIsIDE4KTsKKyAgICBSMShiLCBjLCBkLCBlLCBhLCAxOSk7CisgICAgUjIoYSwgYiwgYywgZCwgZSwgMjApOworICAgIFIyKGUsIGEsIGIsIGMsIGQsIDIxKTsKKyAgICBSMihkLCBlLCBhLCBiLCBjLCAyMik7CisgICAgUjIoYywgZCwgZSwgYSwgYiwgMjMpOworICAgIFIyKGIsIGMsIGQsIGUsIGEsIDI0KTsKKyAgICBSMihhLCBiLCBjLCBkLCBlLCAyNSk7CisgICAgUjIoZSwgYSwgYiwgYywgZCwgMjYpOworICAgIFIyKGQsIGUsIGEsIGIsIGMsIDI3KTsKKyAgICBSMihjLCBkLCBlLCBhLCBiLCAyOCk7CisgICAgUjIoYiwgYywgZCwgZSwgYSwgMjkpOworICAgIFIyKGEsIGIsIGMsIGQsIGUsIDMwKTsKKyAgICBSMihlLCBhLCBiLCBjLCBkLCAzMSk7CisgICAgUjIoZCwgZSwgYSwgYiwgYywgMzIpOworICAgIFIyKGMsIGQsIGUsIGEsIGIsIDMzKTsKKyAgICBSMihiLCBjLCBkLCBlLCBhLCAzNCk7CisgICAgUjIoYSwgYiwgYywgZCwgZSwgMzUpOworICAgIFIyKGUsIGEsIGIsIGMsIGQsIDM2KTsKKyAgICBSMihkLCBlLCBhLCBiLCBjLCAzNyk7CisgICAgUjIoYywgZCwgZSwgYSwgYiwgMzgpOworICAgIFIyKGIsIGMsIGQsIGUsIGEsIDM5KTsKKyAgICBSMyhhLCBiLCBjLCBkLCBlLCA0MCk7CisgICAgUjMoZSwgYSwgYiwgYywgZCwgNDEpOworICAgIFIzKGQsIGUsIGEsIGIsIGMsIDQyKTsKKyAgICBSMyhjLCBkLCBlLCBhLCBiLCA0Myk7CisgICAgUjMoYiwgYywgZCwgZSwgYSwgNDQpOworICAgIFIzKGEsIGIsIGMsIGQsIGUsIDQ1KTsKKyAgICBSMyhlLCBhLCBiLCBjLCBkLCA0Nik7CisgICAgUjMoZCwgZSwgYSwgYiwgYywgNDcpOworICAgIFIzKGMsIGQsIGUsIGEsIGIsIDQ4KTsKKyAgICBSMyhiLCBjLCBkLCBlLCBhLCA0OSk7CisgICAgUjMoYSwgYiwgYywgZCwgZSwgNTApOworICAgIFIzKGUsIGEsIGIsIGMsIGQsIDUxKTsKKyAgICBSMyhkLCBlLCBhLCBiLCBjLCA1Mik7CisgICAgUjMoYywgZCwgZSwgYSwgYiwgNTMpOworICAgIFIzKGIsIGMsIGQsIGUsIGEsIDU0KTsKKyAgICBSMyhhLCBiLCBjLCBkLCBlLCA1NSk7CisgICAgUjMoZSwgYSwgYiwgYywgZCwgNTYpOworICAgIFIzKGQsIGUsIGEsIGIsIGMsIDU3KTsKKyAgICBSMyhjLCBkLCBlLCBhLCBiLCA1OCk7CisgICAgUjMoYiwgYywgZCwgZSwgYSwgNTkpOworICAgIFI0KGEsIGIsIGMsIGQsIGUsIDYwKTsKKyAgICBSNChlLCBhLCBiLCBjLCBkLCA2MSk7CisgICAgUjQoZCwgZSwgYSwgYiwgYywgNjIpOworICAgIFI0KGMsIGQsIGUsIGEsIGIsIDYzKTsKKyAgICBSNChiLCBjLCBkLCBlLCBhLCA2NCk7CisgICAgUjQoYSwgYiwgYywgZCwgZSwgNjUpOworICAgIFI0KGUsIGEsIGIsIGMsIGQsIDY2KTsKKyAgICBSNChkLCBlLCBhLCBiLCBjLCA2Nyk7CisgICAgUjQoYywgZCwgZSwgYSwgYiwgNjgpOworICAgIFI0KGIsIGMsIGQsIGUsIGEsIDY5KTsKKyAgICBSNChhLCBiLCBjLCBkLCBlLCA3MCk7CisgICAgUjQoZSwgYSwgYiwgYywgZCwgNzEpOworICAgIFI0KGQsIGUsIGEsIGIsIGMsIDcyKTsKKyAgICBSNChjLCBkLCBlLCBhLCBiLCA3Myk7CisgICAgUjQoYiwgYywgZCwgZSwgYSwgNzQpOworICAgIFI0KGEsIGIsIGMsIGQsIGUsIDc1KTsKKyAgICBSNChlLCBhLCBiLCBjLCBkLCA3Nik7CisgICAgUjQoZCwgZSwgYSwgYiwgYywgNzcpOworICAgIFI0KGMsIGQsIGUsIGEsIGIsIDc4KTsKKyAgICBSNChiLCBjLCBkLCBlLCBhLCA3OSk7CisgICAgLyogQWRkIHRoZSB3b3JraW5nIHZhcnMgYmFjayBpbnRvIGNvbnRleHQuc3RhdGVbXSAqLworICAgIHN0YXRlWzBdICs9IGE7CisgICAgc3RhdGVbMV0gKz0gYjsKKyAgICBzdGF0ZVsyXSArPSBjOworICAgIHN0YXRlWzNdICs9IGQ7CisgICAgc3RhdGVbNF0gKz0gZTsKKyAgICAvKiBXaXBlIHZhcmlhYmxlcyAqLworICAgIGEgPSBiID0gYyA9IGQgPSBlID0gMDsKK30KKworLyogU0hBMUluaXQgLSBJbml0aWFsaXplIG5ldyBjb250ZXh0ICovCisKK3ZvaWQgU0hBMUluaXQoU0hBMV9DVFggKiBjb250ZXh0KQoreworICAgIC8qIFNIQTEgaW5pdGlhbGl6YXRpb24gY29uc3RhbnRzICovCisgICAgY29udGV4dC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworICAgIGNvbnRleHQtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKyAgICBjb250ZXh0LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisgICAgY29udGV4dC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OworICAgIGNvbnRleHQtPnN0YXRlWzRdID0gMHhDM0QyRTFGMDsKKyAgICBjb250ZXh0LT5jb3VudFswXSA9IGNvbnRleHQtPmNvdW50WzFdID0gMDsKK30KKworLyogUnVuIHlvdXIgZGF0YSB0aHJvdWdoIHRoaXMuICovCisKK3ZvaWQgU0hBMVVwZGF0ZShTSEExX0NUWCAqIGNvbnRleHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sJCQkJLyoKKwkJCQkgICBKSEIgKi8KKyAgICB1aW50MzJfdCBpLCBqOwkJLyogSkhCICovCisKKyNpZmRlZiBWRVJCT1NFCisgICAgU0hBUHJpbnRDb250ZXh0KGNvbnRleHQsICJiZWZvcmUiKTsKKyNlbmRpZgorICAgIGogPSAoY29udGV4dC0+Y291bnRbMF0gPj4gMykgJiA2MzsKKyAgICBpZiAoKGNvbnRleHQtPmNvdW50WzBdICs9IGxlbiA8PCAzKSA8IChsZW4gPDwgMykpCisJY29udGV4dC0+Y291bnRbMV0rKzsKKyAgICBjb250ZXh0LT5jb3VudFsxXSArPSAobGVuID4+IDI5KTsKKyAgICBpZiAoKGogKyBsZW4pID4gNjMpIHsKKwltZW1jcHkoJmNvbnRleHQtPmJ1ZmZlcltqXSwgZGF0YSwgKGkgPSA2NCAtIGopKTsKKwlTSEExVHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBjb250ZXh0LT5idWZmZXIpOworCWZvciAoOyBpICsgNjMgPCBsZW47IGkgKz0gNjQpIHsKKwkgICAgU0hBMVRyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgJmRhdGFbaV0pOworCX0KKwlqID0gMDsKKyAgICB9IGVsc2UKKwlpID0gMDsKKyAgICBtZW1jcHkoJmNvbnRleHQtPmJ1ZmZlcltqXSwgJmRhdGFbaV0sIGxlbiAtIGkpOworI2lmZGVmIFZFUkJPU0UKKyAgICBTSEFQcmludENvbnRleHQoY29udGV4dCwgImFmdGVyICIpOworI2VuZGlmCit9CisKKy8qIEFkZCBwYWRkaW5nIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0LiAqLworCit2b2lkIFNIQTFGaW5hbCh1bnNpZ25lZCBjaGFyIGRpZ2VzdFsyMF0sIFNIQTFfQ1RYICogY29udGV4dCkKK3sKKyAgICB1aW50MzJfdCBpOwkJCS8qIEpIQiAqLworICAgIHVuc2lnbmVkIGNoYXIgZmluYWxjb3VudFs4XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwlmaW5hbGNvdW50W2ldID0gKHVuc2lnbmVkIGNoYXIpKChjb250ZXh0LT5jb3VudFsoaSA+PSA0ID8gMCA6IDEpXQorCQkJCQkgPj4gKCgzIC0gKGkgJiAzKSkgKiA4KSkgJiAyNTUpOwkvKiBFbmRpYW4gaW5kZXBlbmRlbnQgKi8KKyAgICB9CisgICAgU0hBMVVwZGF0ZShjb250ZXh0LCAodW5zaWduZWQgY2hhciAqKSJcMjAwIiwgMSk7CisgICAgd2hpbGUgKChjb250ZXh0LT5jb3VudFswXSAmIDUwNCkgIT0gNDQ4KSB7CisJU0hBMVVwZGF0ZShjb250ZXh0LCAodW5zaWduZWQgY2hhciAqKSJcMCIsIDEpOworICAgIH0KKyAgICBTSEExVXBkYXRlKGNvbnRleHQsIGZpbmFsY291bnQsIDgpOwkvKiBTaG91bGQgY2F1c2UgYSBTSEExVHJhbnNmb3JtKCkKKwkJCQkJICovCisgICAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwlkaWdlc3RbaV0gPSAodW5zaWduZWQgY2hhcikKKwkgICAgKChjb250ZXh0LT5zdGF0ZVtpID4+IDJdID4+ICgoMyAtIChpICYgMykpICogOCkpICYgMjU1KTsKKyAgICB9CisgICAgLyogV2lwZSB2YXJpYWJsZXMgKi8KKyAgICBpID0gMDsJCQkvKiBKSEIgKi8KKyAgICBtZW1zZXQoY29udGV4dC0+YnVmZmVyLCAwLCA2NCk7CisgICAgbWVtc2V0KGNvbnRleHQtPnN0YXRlLCAwLCAyMCk7CisgICAgbWVtc2V0KGNvbnRleHQtPmNvdW50LCAwLCA4KTsKKyAgICBtZW1zZXQoZmluYWxjb3VudCwgMCwgOCk7CS8qIFNXUiAqLworI2lmZGVmIFNIQTFIQU5EU09GRgkJLyogbWFrZSBTSEExVHJhbnNmb3JtIG92ZXJ3cml0ZSBpdCdzIG93biBzdGF0aWMgdmFycyAqLworICAgIFNIQTFUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaXMgbm90IHF1aXRlIHRoZSBNSU1FIGJhc2U2NCBhbGdvcml0aG06IGl0IHVzZXMgXyBpbnN0ZWFkIG9mIC8sCisgICBhbmQgaW5zdGVhZCBvZiBwYWRkaW5nIHRoZSBvdXRwdXQgd2l0aCA9IGNoYXJhY3RlcnMgd2UganVzdCBtYWtlIHRoZQorICAgb3V0cHV0IHNob3J0ZXIuICovCitjaGFyICpteWJhc2U2NCh1aW50OF90IGRpZ2VzdFsyMF0pCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhcnpbXSA9CisJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5K18iOworICAgIHVpbnQ4X3QgaW5wdXRbMjFdOworICAgIHN0YXRpYyBjaGFyIG91dHB1dFsyOF07CisgICAgaW50IGksIGo7CisgICAgdWludDhfdCAqcDsKKyAgICBjaGFyICpxOworICAgIHVpbnQzMl90IGJ2OworCisgICAgbWVtY3B5KGlucHV0LCBkaWdlc3QsIDIwKTsKKyAgICBpbnB1dFsyMF0gPSAwOwkJLyogUGFkIHRvIG11bHRpcGxlIG9mIDMgYnl0ZXMgKi8KKworICAgIHAgPSBpbnB1dDsKKyAgICBxID0gb3V0cHV0OworICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwlidiA9IChwWzBdIDw8IDE2KSB8IChwWzFdIDw8IDgpIHwgcFsyXTsKKwlwICs9IDM7CisJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCSAgICAqcSsrID0gY2hhcnpbKGJ2ID4+IDE4KSAmIDB4M2ZdOworCSAgICBidiA8PD0gNjsKKwl9CisgICAgfQorICAgICotLXEgPSAnXDAnOwkJLyogVGhlIGxhc3QgY2hhcmFjdGVyIGlzIG5vdCBzaWduaWZpY2FudCAqLworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKKyNpZmRlZiBGT1JfVEVTVElOR19PTkxZCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaTsKKyAgICBTSEExX0NUWCBjb250ZXh0OworICAgIHVpbnQ4X3QgZGlnZXN0WzIwXSwgYnVmZmVyWzE2Mzg0XTsKKyAgICBGSUxFICpmaWxlOworCisgICAgaWYgKGFyZ2MgPCAyKSB7CisJZmlsZSA9IHN0ZGluOworICAgIH0gZWxzZSB7CisJaWYgKCEoZmlsZSA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpKSkgeworCSAgICBmcHV0cygiVW5hYmxlIHRvIG9wZW4gZmlsZS4iLCBzdGRlcnIpOworCSAgICByZXR1cm4gKC0xKTsKKwl9CisgICAgfQorICAgIFNIQTFJbml0KCZjb250ZXh0KTsKKyAgICB3aGlsZSAoIWZlb2YoZmlsZSkpIHsJLyogbm90ZTogd2hhdCBpZiBmZXJyb3IoZmlsZSkgKi8KKwlpID0gZnJlYWQoYnVmZmVyLCAxLCAxNjM4NCwgZmlsZSk7CisJU0hBMVVwZGF0ZSgmY29udGV4dCwgYnVmZmVyLCBpKTsKKyAgICB9CisgICAgU0hBMUZpbmFsKGRpZ2VzdCwgJmNvbnRleHQpOworICAgIGZjbG9zZShmaWxlKTsKKworICAgIHB1dHMobXliYXNlNjQoZGlnZXN0KSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9saWJ1dGlsL3NoYTI1NmNyeXB0LmMgYi9jb20zMi9saWJ1dGlsL3NoYTI1NmNyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjN2IwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2xpYnV0aWwvc2hhMjU2Y3J5cHQuYwpAQCAtMCwwICsxLDY4MCBAQAorLyogU0hBMjU2LWJhc2VkIFVuaXggY3J5cHQgaW1wbGVtZW50YXRpb24uCisgICBSZWxlYXNlZCBpbnRvIHRoZSBQdWJsaWMgRG9tYWluIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LiAgKi8KKworI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJ4Y3J5cHQuaCIKKworI2RlZmluZSBNSU4oeCx5KSBtaW4oeCx5KQorI2RlZmluZSBNQVgoeCx5KSBtYXgoeCx5KQorCisvKiBTdHJ1Y3R1cmUgdG8gc2F2ZSBzdGF0ZSBvZiBjb21wdXRhdGlvbiBiZXR3ZWVuIHRoZSBzaW5nbGUgc3RlcHMuICAqLworc3RydWN0IHNoYTI1Nl9jdHggeworICAgIHVpbnQzMl90IEhbOF07CisKKyAgICB1aW50MzJfdCB0b3RhbFsyXTsKKyAgICB1aW50MzJfdCBidWZsZW47CisgICAgY2hhciBidWZmZXJbMTI4XTsJCS8qIE5COiBhbHdheXMgY29ycmVjdGx5IGFsaWduZWQgZm9yIHVpbnQzMl90LiAgKi8KK307CisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBTV0FQKG4pIFwKKyAgICAoKChuKSA8PCAyNCkgfCAoKChuKSAmIDB4ZmYwMCkgPDwgOCkgfCAoKChuKSA+PiA4KSAmIDB4ZmYwMCkgfCAoKG4pID4+IDI0KSkKKyNlbHNlCisjIGRlZmluZSBTV0FQKG4pIChuKQorI2VuZGlmCisKKy8qIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIGJ5dGVzIHVzZWQgdG8gcGFkIHRoZSBidWZmZXIgdG8gdGhlIG5leHQKKyAgIDY0LWJ5dGUgYm91bmRhcnkuICAoRklQUyAxODAtMjo1LjEuMSkgICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmaWxsYnVmWzY0XSA9IHsgMHg4MCwgMCAvKiAsIDAsIDAsIC4uLiAgKi8gIH07CisKKy8qIENvbnN0YW50cyBmb3IgU0hBMjU2IGZyb20gRklQUyAxODAtMjo0LjIuMi4gICovCitzdGF0aWMgY29uc3QgdWludDMyX3QgS1s2NF0gPSB7CisgICAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwKKyAgICAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LAorICAgIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsCisgICAgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCwKKyAgICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLAorICAgIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsCisgICAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywKKyAgICAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LAorICAgIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsCisgICAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwKKyAgICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLAorICAgIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsCisgICAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwKKyAgICAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLAorICAgIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsCisgICAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMgorfTsKKworLyogUHJvY2VzcyBMRU4gYnl0ZXMgb2YgQlVGRkVSLCBhY2N1bXVsYXRpbmcgY29udGV4dCBpbnRvIENUWC4KKyAgIEl0IGlzIGFzc3VtZWQgdGhhdCBMRU4gJSA2NCA9PSAwLiAgKi8KK3N0YXRpYyB2b2lkCitzaGEyNTZfcHJvY2Vzc19ibG9jayhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW4sIHN0cnVjdCBzaGEyNTZfY3R4ICpjdHgpCit7CisgICAgdW5zaWduZWQgaW50IHQ7CisgICAgY29uc3QgdWludDMyX3QgKndvcmRzID0gYnVmZmVyOworICAgIHNpemVfdCBud29yZHMgPSBsZW4gLyBzaXplb2YodWludDMyX3QpOworICAgIHVpbnQzMl90IGEgPSBjdHgtPkhbMF07CisgICAgdWludDMyX3QgYiA9IGN0eC0+SFsxXTsKKyAgICB1aW50MzJfdCBjID0gY3R4LT5IWzJdOworICAgIHVpbnQzMl90IGQgPSBjdHgtPkhbM107CisgICAgdWludDMyX3QgZSA9IGN0eC0+SFs0XTsKKyAgICB1aW50MzJfdCBmID0gY3R4LT5IWzVdOworICAgIHVpbnQzMl90IGcgPSBjdHgtPkhbNl07CisgICAgdWludDMyX3QgaCA9IGN0eC0+SFs3XTsKKworICAgIC8qIEZpcnN0IGluY3JlbWVudCB0aGUgYnl0ZSBjb3VudC4gIEZJUFMgMTgwLTIgc3BlY2lmaWVzIHRoZSBwb3NzaWJsZQorICAgICAgIGxlbmd0aCBvZiB0aGUgZmlsZSB1cCB0byAyXjY0IGJpdHMuICBIZXJlIHdlIG9ubHkgY29tcHV0ZSB0aGUKKyAgICAgICBudW1iZXIgb2YgYnl0ZXMuICBEbyBhIGRvdWJsZSB3b3JkIGluY3JlbWVudC4gICovCisgICAgY3R4LT50b3RhbFswXSArPSBsZW47CisgICAgaWYgKGN0eC0+dG90YWxbMF0gPCBsZW4pCisJKytjdHgtPnRvdGFsWzFdOworCisgICAgLyogUHJvY2VzcyBhbGwgYnl0ZXMgaW4gdGhlIGJ1ZmZlciB3aXRoIDY0IGJ5dGVzIGluIGVhY2ggcm91bmQgb2YKKyAgICAgICB0aGUgbG9vcC4gICovCisgICAgd2hpbGUgKG53b3JkcyA+IDApIHsKKwl1aW50MzJfdCBXWzY0XTsKKwl1aW50MzJfdCBhX3NhdmUgPSBhOworCXVpbnQzMl90IGJfc2F2ZSA9IGI7CisJdWludDMyX3QgY19zYXZlID0gYzsKKwl1aW50MzJfdCBkX3NhdmUgPSBkOworCXVpbnQzMl90IGVfc2F2ZSA9IGU7CisJdWludDMyX3QgZl9zYXZlID0gZjsKKwl1aW50MzJfdCBnX3NhdmUgPSBnOworCXVpbnQzMl90IGhfc2F2ZSA9IGg7CisKKwkvKiBPcGVyYXRvcnMgZGVmaW5lZCBpbiBGSVBTIDE4MC0yOjQuMS4yLiAgKi8KKyNkZWZpbmUgQ2goeCwgeSwgeikgKCh4ICYgeSkgXiAofnggJiB6KSkKKyNkZWZpbmUgTWFqKHgsIHksIHopICgoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeikpCisjZGVmaW5lIFMwKHgpIChDWUNMSUMgKHgsIDIpIF4gQ1lDTElDICh4LCAxMykgXiBDWUNMSUMgKHgsIDIyKSkKKyNkZWZpbmUgUzEoeCkgKENZQ0xJQyAoeCwgNikgXiBDWUNMSUMgKHgsIDExKSBeIENZQ0xJQyAoeCwgMjUpKQorI2RlZmluZSBSMCh4KSAoQ1lDTElDICh4LCA3KSBeIENZQ0xJQyAoeCwgMTgpIF4gKHggPj4gMykpCisjZGVmaW5lIFIxKHgpIChDWUNMSUMgKHgsIDE3KSBeIENZQ0xJQyAoeCwgMTkpIF4gKHggPj4gMTApKQorCisJLyogSXQgaXMgdW5mb3J0dW5hdGUgdGhhdCBDIGRvZXMgbm90IHByb3ZpZGUgYW4gb3BlcmF0b3IgZm9yCisJICAgY3ljbGljIHJvdGF0aW9uLiAgSG9wZSB0aGUgQyBjb21waWxlciBpcyBzbWFydCBlbm91Z2guICAqLworI2RlZmluZSBDWUNMSUModywgcykgKCh3ID4+IHMpIHwgKHcgPDwgKDMyIC0gcykpKQorCisJLyogQ29tcHV0ZSB0aGUgbWVzc2FnZSBzY2hlZHVsZSBhY2NvcmRpbmcgdG8gRklQUyAxODAtMjo2LjIuMiBzdGVwIDIuICAqLworCWZvciAodCA9IDA7IHQgPCAxNjsgKyt0KSB7CisJICAgIFdbdF0gPSBTV0FQKCp3b3Jkcyk7CisJICAgICsrd29yZHM7CisJfQorCWZvciAodCA9IDE2OyB0IDwgNjQ7ICsrdCkKKwkgICAgV1t0XSA9IFIxKFdbdCAtIDJdKSArIFdbdCAtIDddICsgUjAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XTsKKworCS8qIFRoZSBhY3R1YWwgY29tcHV0YXRpb24gYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4yLjIgc3RlcCAzLiAgKi8KKwlmb3IgKHQgPSAwOyB0IDwgNjQ7ICsrdCkgeworCSAgICB1aW50MzJfdCBUMSA9IGggKyBTMShlKSArIENoKGUsIGYsIGcpICsgS1t0XSArIFdbdF07CisJICAgIHVpbnQzMl90IFQyID0gUzAoYSkgKyBNYWooYSwgYiwgYyk7CisJICAgIGggPSBnOworCSAgICBnID0gZjsKKwkgICAgZiA9IGU7CisJICAgIGUgPSBkICsgVDE7CisJICAgIGQgPSBjOworCSAgICBjID0gYjsKKwkgICAgYiA9IGE7CisJICAgIGEgPSBUMSArIFQyOworCX0KKworCS8qIEFkZCB0aGUgc3RhcnRpbmcgdmFsdWVzIG9mIHRoZSBjb250ZXh0IGFjY29yZGluZyB0byBGSVBTIDE4MC0yOjYuMi4yCisJICAgc3RlcCA0LiAgKi8KKwlhICs9IGFfc2F2ZTsKKwliICs9IGJfc2F2ZTsKKwljICs9IGNfc2F2ZTsKKwlkICs9IGRfc2F2ZTsKKwllICs9IGVfc2F2ZTsKKwlmICs9IGZfc2F2ZTsKKwlnICs9IGdfc2F2ZTsKKwloICs9IGhfc2F2ZTsKKworCS8qIFByZXBhcmUgZm9yIHRoZSBuZXh0IHJvdW5kLiAgKi8KKwlud29yZHMgLT0gMTY7CisgICAgfQorCisgICAgLyogUHV0IGNoZWNrc3VtIGluIGNvbnRleHQgZ2l2ZW4gYXMgYXJndW1lbnQuICAqLworICAgIGN0eC0+SFswXSA9IGE7CisgICAgY3R4LT5IWzFdID0gYjsKKyAgICBjdHgtPkhbMl0gPSBjOworICAgIGN0eC0+SFszXSA9IGQ7CisgICAgY3R4LT5IWzRdID0gZTsKKyAgICBjdHgtPkhbNV0gPSBmOworICAgIGN0eC0+SFs2XSA9IGc7CisgICAgY3R4LT5IWzddID0gaDsKK30KKworLyogSW5pdGlhbGl6ZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBzdGF0ZSBvZiBjb21wdXRhdGlvbi4KKyAgIChGSVBTIDE4MC0yOjUuMy4yKSAgKi8KK3N0YXRpYyB2b2lkIHNoYTI1Nl9pbml0X2N0eChzdHJ1Y3Qgc2hhMjU2X2N0eCAqY3R4KQoreworICAgIGN0eC0+SFswXSA9IDB4NmEwOWU2Njc7CisgICAgY3R4LT5IWzFdID0gMHhiYjY3YWU4NTsKKyAgICBjdHgtPkhbMl0gPSAweDNjNmVmMzcyOworICAgIGN0eC0+SFszXSA9IDB4YTU0ZmY1M2E7CisgICAgY3R4LT5IWzRdID0gMHg1MTBlNTI3ZjsKKyAgICBjdHgtPkhbNV0gPSAweDliMDU2ODhjOworICAgIGN0eC0+SFs2XSA9IDB4MWY4M2Q5YWI7CisgICAgY3R4LT5IWzddID0gMHg1YmUwY2QxOTsKKworICAgIGN0eC0+dG90YWxbMF0gPSBjdHgtPnRvdGFsWzFdID0gMDsKKyAgICBjdHgtPmJ1ZmxlbiA9IDA7Cit9CisKKy8qIFByb2Nlc3MgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIGFuZCB0aGUgdXN1YWwKKyAgIHByb2xvZyBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFJFU0JVRi4KKworICAgSU1QT1JUQU5UOiBPbiBzb21lIHN5c3RlbXMgaXQgaXMgcmVxdWlyZWQgdGhhdCBSRVNCVUYgaXMgY29ycmVjdGx5CisgICBhbGlnbmVkIGZvciBhIDMyIGJpdHMgdmFsdWUuICAqLworc3RhdGljIHZvaWQgKnNoYTI1Nl9maW5pc2hfY3R4KHN0cnVjdCBzaGEyNTZfY3R4ICpjdHgsIHZvaWQgKnJlc2J1ZikKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAvKiBUYWtlIHlldCB1bnByb2Nlc3NlZCBieXRlcyBpbnRvIGFjY291bnQuICAqLworICAgIHVpbnQzMl90IGJ5dGVzID0gY3R4LT5idWZsZW47CisgICAgc2l6ZV90IHBhZDsKKworICAgIC8qIE5vdyBjb3VudCByZW1haW5pbmcgYnl0ZXMuICAqLworICAgIGN0eC0+dG90YWxbMF0gKz0gYnl0ZXM7CisgICAgaWYgKGN0eC0+dG90YWxbMF0gPCBieXRlcykKKwkrK2N0eC0+dG90YWxbMV07CisKKyAgICBwYWQgPSBieXRlcyA+PSA1NiA/IDY0ICsgNTYgLSBieXRlcyA6IDU2IC0gYnl0ZXM7CisgICAgbWVtY3B5KCZjdHgtPmJ1ZmZlcltieXRlc10sIGZpbGxidWYsIHBhZCk7CisKKyAgICAvKiBQdXQgdGhlIDY0LWJpdCBmaWxlIGxlbmd0aCBpbiAqYml0cyogYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgKi8KKyAgICAqKHVpbnQzMl90ICopICYgY3R4LT5idWZmZXJbYnl0ZXMgKyBwYWQgKyA0XSA9IFNXQVAoY3R4LT50b3RhbFswXSA8PCAzKTsKKyAgICAqKHVpbnQzMl90ICopICYgY3R4LT5idWZmZXJbYnl0ZXMgKyBwYWRdID0gU1dBUCgoY3R4LT50b3RhbFsxXSA8PCAzKSB8CisJCQkJCQkgICAgKGN0eC0+dG90YWxbMF0gPj4gMjkpKTsKKworICAgIC8qIFByb2Nlc3MgbGFzdCBieXRlcy4gICovCisgICAgc2hhMjU2X3Byb2Nlc3NfYmxvY2soY3R4LT5idWZmZXIsIGJ5dGVzICsgcGFkICsgOCwgY3R4KTsKKworICAgIC8qIFB1dCByZXN1bHQgZnJvbSBDVFggaW4gZmlyc3QgMzIgYnl0ZXMgZm9sbG93aW5nIFJFU0JVRi4gICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkoKHVpbnQzMl90ICopIHJlc2J1ZilbaV0gPSBTV0FQKGN0eC0+SFtpXSk7CisKKyAgICByZXR1cm4gcmVzYnVmOworfQorCitzdGF0aWMgdm9pZAorc2hhMjU2X3Byb2Nlc3NfYnl0ZXMoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuLCBzdHJ1Y3Qgc2hhMjU2X2N0eCAqY3R4KQoreworICAgIC8qIFdoZW4gd2UgYWxyZWFkeSBoYXZlIHNvbWUgYml0cyBpbiBvdXIgaW50ZXJuYWwgYnVmZmVyIGNvbmNhdGVuYXRlCisgICAgICAgYm90aCBpbnB1dHMgZmlyc3QuICAqLworICAgIGlmIChjdHgtPmJ1ZmxlbiAhPSAwKSB7CisJc2l6ZV90IGxlZnRfb3ZlciA9IGN0eC0+YnVmbGVuOworCXNpemVfdCBhZGQgPSAxMjggLSBsZWZ0X292ZXIgPiBsZW4gPyBsZW4gOiAxMjggLSBsZWZ0X292ZXI7CisKKwltZW1jcHkoJmN0eC0+YnVmZmVyW2xlZnRfb3Zlcl0sIGJ1ZmZlciwgYWRkKTsKKwljdHgtPmJ1ZmxlbiArPSBhZGQ7CisKKwlpZiAoY3R4LT5idWZsZW4gPiA2NCkgeworCSAgICBzaGEyNTZfcHJvY2Vzc19ibG9jayhjdHgtPmJ1ZmZlciwgY3R4LT5idWZsZW4gJiB+NjMsIGN0eCk7CisKKwkgICAgY3R4LT5idWZsZW4gJj0gNjM7CisJICAgIC8qIFRoZSByZWdpb25zIGluIHRoZSBmb2xsb3dpbmcgY29weSBvcGVyYXRpb24gY2Fubm90IG92ZXJsYXAuICAqLworCSAgICBtZW1jcHkoY3R4LT5idWZmZXIsICZjdHgtPmJ1ZmZlclsobGVmdF9vdmVyICsgYWRkKSAmIH42M10sCisJCSAgIGN0eC0+YnVmbGVuKTsKKwl9CisKKwlidWZmZXIgPSAoY29uc3QgY2hhciAqKWJ1ZmZlciArIGFkZDsKKwlsZW4gLT0gYWRkOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgYXZhaWxhYmxlIGNvbXBsZXRlIGJsb2Nrcy4gICovCisgICAgaWYgKGxlbiA+PSA2NCkgeworLyogVG8gY2hlY2sgYWxpZ25tZW50IGdjYyBoYXMgYW4gYXBwcm9wcmlhdGUgb3BlcmF0b3IuICBPdGhlcgorICAgY29tcGlsZXJzIGRvbid0LiAgKi8KKyNpZiBfX0dOVUNfXyA+PSAyCisjIGRlZmluZSBVTkFMSUdORURfUChwKSAoKCh1aW50cHRyX3QpIHApICUgX19hbGlnbm9mX18gKHVpbnQzMl90KSAhPSAwKQorI2Vsc2UKKyMgZGVmaW5lIFVOQUxJR05FRF9QKHApICgoKHVpbnRwdHJfdCkgcCkgJSBzaXplb2YgKHVpbnQzMl90KSAhPSAwKQorI2VuZGlmCisJaWYgKFVOQUxJR05FRF9QKGJ1ZmZlcikpCisJICAgIHdoaWxlIChsZW4gPiA2NCkgeworCQlzaGEyNTZfcHJvY2Vzc19ibG9jayhtZW1jcHkoY3R4LT5idWZmZXIsIGJ1ZmZlciwgNjQpLCA2NCwgY3R4KTsKKwkJYnVmZmVyID0gKGNvbnN0IGNoYXIgKilidWZmZXIgKyA2NDsKKwkJbGVuIC09IDY0OworCX0gZWxzZSB7CisJICAgIHNoYTI1Nl9wcm9jZXNzX2Jsb2NrKGJ1ZmZlciwgbGVuICYgfjYzLCBjdHgpOworCSAgICBidWZmZXIgPSAoY29uc3QgY2hhciAqKWJ1ZmZlciArIChsZW4gJiB+NjMpOworCSAgICBsZW4gJj0gNjM7CisJfQorICAgIH0KKworICAgIC8qIE1vdmUgcmVtYWluaW5nIGJ5dGVzIGludG8gaW50ZXJuYWwgYnVmZmVyLiAgKi8KKyAgICBpZiAobGVuID4gMCkgeworCXNpemVfdCBsZWZ0X292ZXIgPSBjdHgtPmJ1ZmxlbjsKKworCW1lbWNweSgmY3R4LT5idWZmZXJbbGVmdF9vdmVyXSwgYnVmZmVyLCBsZW4pOworCWxlZnRfb3ZlciArPSBsZW47CisJaWYgKGxlZnRfb3ZlciA+PSA2NCkgeworCSAgICBzaGEyNTZfcHJvY2Vzc19ibG9jayhjdHgtPmJ1ZmZlciwgNjQsIGN0eCk7CisJICAgIGxlZnRfb3ZlciAtPSA2NDsKKwkgICAgbWVtY3B5KGN0eC0+YnVmZmVyLCAmY3R4LT5idWZmZXJbNjRdLCBsZWZ0X292ZXIpOworCX0KKwljdHgtPmJ1ZmxlbiA9IGxlZnRfb3ZlcjsKKyAgICB9Cit9CisKKy8qIERlZmluZSBvdXIgbWFnaWMgc3RyaW5nIHRvIG1hcmsgc2FsdCBmb3IgU0hBMjU2ICJlbmNyeXB0aW9uIgorICAgcmVwbGFjZW1lbnQuICAqLworc3RhdGljIGNvbnN0IGNoYXIgc2hhMjU2X3NhbHRfcHJlZml4W10gPSAiJDUkIjsKKworLyogUHJlZml4IGZvciBvcHRpb25hbCByb3VuZHMgc3BlY2lmaWNhdGlvbi4gICovCitzdGF0aWMgY29uc3QgY2hhciBzaGEyNTZfcm91bmRzX3ByZWZpeFtdID0gInJvdW5kcz0iOworCisvKiBNYXhpbXVtIHNhbHQgc3RyaW5nIGxlbmd0aC4gICovCisjZGVmaW5lIFNBTFRfTEVOX01BWCAxNlUKKy8qIERlZmF1bHQgbnVtYmVyIG9mIHJvdW5kcyBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuICAqLworI2RlZmluZSBST1VORFNfREVGQVVMVCA1MDAwVUwKKy8qIE1pbmltdW0gbnVtYmVyIG9mIHJvdW5kcy4gICovCisjZGVmaW5lIFJPVU5EU19NSU4gMTAwMFVMCisvKiBNYXhpbXVtIG51bWJlciBvZiByb3VuZHMuICAqLworI2RlZmluZSBST1VORFNfTUFYIDk5OTk5OTk5OVVMCisKKy8qIFRhYmxlIHdpdGggY2hhcmFjdGVycyBmb3IgYmFzZTY0IHRyYW5zZm9ybWF0aW9uLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGI2NHRbNjRdID0KKyAgICAiLi8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKK3N0YXRpYyBjaGFyICpzaGEyNTZfY3J5cHRfcihjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnNhbHQsIGNoYXIgKmJ1ZmZlciwKKwkJCSAgICBpbnQgYnVmbGVuKQoreworICAgIHVuc2lnbmVkIGNoYXIgYWx0X3Jlc3VsdFszMl0KKwlfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oX19hbGlnbm9mX18odWludDMyX3QpKSkpOworICAgIHVuc2lnbmVkIGNoYXIgdGVtcF9yZXN1bHRbMzJdCisJX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKF9fYWxpZ25vZl9fKHVpbnQzMl90KSkpKTsKKyAgICBzdHJ1Y3Qgc2hhMjU2X2N0eCBjdHg7CisgICAgc3RydWN0IHNoYTI1Nl9jdHggYWx0X2N0eDsKKyAgICBzaXplX3Qgc2FsdF9sZW47CisgICAgc2l6ZV90IGtleV9sZW47CisgICAgc2l6ZV90IGNudDsKKyAgICBjaGFyICpjcDsKKyAgICBjaGFyICpjb3BpZWRfa2V5ID0gTlVMTDsKKyAgICBjaGFyICpjb3BpZWRfc2FsdCA9IE5VTEw7CisgICAgY2hhciAqcF9ieXRlczsKKyAgICBjaGFyICpzX2J5dGVzOworICAgIC8qIERlZmF1bHQgbnVtYmVyIG9mIHJvdW5kcy4gICovCisgICAgc2l6ZV90IHJvdW5kcyA9IFJPVU5EU19ERUZBVUxUOworICAgIGJvb2wgcm91bmRzX2N1c3RvbSA9IGZhbHNlOworCisgICAgLyogRmluZCBiZWdpbm5pbmcgb2Ygc2FsdCBzdHJpbmcuICBUaGUgcHJlZml4IHNob3VsZCBub3JtYWxseSBhbHdheXMKKyAgICAgICBiZSBwcmVzZW50LiAgSnVzdCBpbiBjYXNlIGl0IGlzIG5vdC4gICovCisgICAgaWYgKHN0cm5jbXAoc2hhMjU2X3NhbHRfcHJlZml4LCBzYWx0LCBzaXplb2Yoc2hhMjU2X3NhbHRfcHJlZml4KSAtIDEpID09IDApCisJLyogU2tpcCBzYWx0IHByZWZpeC4gICovCisJc2FsdCArPSBzaXplb2Yoc2hhMjU2X3NhbHRfcHJlZml4KSAtIDE7CisKKyAgICBpZiAoc3RybmNtcChzYWx0LCBzaGEyNTZfcm91bmRzX3ByZWZpeCwgc2l6ZW9mKHNoYTI1Nl9yb3VuZHNfcHJlZml4KSAtIDEpCisJPT0gMCkgeworCWNvbnN0IGNoYXIgKm51bSA9IHNhbHQgKyBzaXplb2Yoc2hhMjU2X3JvdW5kc19wcmVmaXgpIC0gMTsKKwljaGFyICplbmRwOworCXVuc2lnbmVkIGxvbmcgaW50IHNyb3VuZHMgPSBzdHJ0b3VsKG51bSwgJmVuZHAsIDEwKTsKKwlpZiAoKmVuZHAgPT0gJyQnKSB7CisJICAgIHNhbHQgPSBlbmRwICsgMTsKKwkgICAgcm91bmRzID0gTUFYKFJPVU5EU19NSU4sIE1JTihzcm91bmRzLCBST1VORFNfTUFYKSk7CisJICAgIHJvdW5kc19jdXN0b20gPSB0cnVlOworCX0KKyAgICB9CisKKyAgICBzYWx0X2xlbiA9IE1JTihzdHJjc3BuKHNhbHQsICIkIiksIFNBTFRfTEVOX01BWCk7CisgICAga2V5X2xlbiA9IHN0cmxlbihrZXkpOworCisgICAgaWYgKChrZXkgLSAoY2hhciAqKTApICUgX19hbGlnbm9mX18odWludDMyX3QpICE9IDApIHsKKwljaGFyICp0bXAgPSAoY2hhciAqKWFsbG9jYShrZXlfbGVuICsgX19hbGlnbm9mX18odWludDMyX3QpKTsKKwlrZXkgPSBjb3BpZWRfa2V5ID0gbWVtY3B5KHRtcCArIF9fYWxpZ25vZl9fKHVpbnQzMl90KQorCQkJCSAgLSAodG1wIC0gKGNoYXIgKikwKSAlIF9fYWxpZ25vZl9fKHVpbnQzMl90KSwKKwkJCQkgIGtleSwga2V5X2xlbik7CisgICAgfQorCisgICAgaWYgKChzYWx0IC0gKGNoYXIgKikwKSAlIF9fYWxpZ25vZl9fKHVpbnQzMl90KSAhPSAwKSB7CisJY2hhciAqdG1wID0gKGNoYXIgKilhbGxvY2Eoc2FsdF9sZW4gKyBfX2FsaWdub2ZfXyh1aW50MzJfdCkpOworCXNhbHQgPSBjb3BpZWRfc2FsdCA9IG1lbWNweSh0bXAgKyBfX2FsaWdub2ZfXyh1aW50MzJfdCkKKwkJCQkgICAgLSAodG1wIC0gKGNoYXIgKikwKSAlIF9fYWxpZ25vZl9fKHVpbnQzMl90KSwKKwkJCQkgICAgc2FsdCwgc2FsdF9sZW4pOworICAgIH0KKworICAgIC8qIFByZXBhcmUgZm9yIHRoZSByZWFsIHdvcmsuICAqLworICAgIHNoYTI1Nl9pbml0X2N0eCgmY3R4KTsKKworICAgIC8qIEFkZCB0aGUga2V5IHN0cmluZy4gICovCisgICAgc2hhMjU2X3Byb2Nlc3NfYnl0ZXMoa2V5LCBrZXlfbGVuLCAmY3R4KTsKKworICAgIC8qIFRoZSBsYXN0IHBhcnQgaXMgdGhlIHNhbHQgc3RyaW5nLiAgVGhpcyBtdXN0IGJlIGF0IG1vc3QgOAorICAgICAgIGNoYXJhY3RlcnMgYW5kIGl0IGVuZHMgYXQgdGhlIGZpcnN0IGAkJyBjaGFyYWN0ZXIgKGZvcgorICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMpLiAgKi8KKyAgICBzaGEyNTZfcHJvY2Vzc19ieXRlcyhzYWx0LCBzYWx0X2xlbiwgJmN0eCk7CisKKyAgICAvKiBDb21wdXRlIGFsdGVybmF0ZSBTSEEyNTYgc3VtIHdpdGggaW5wdXQgS0VZLCBTQUxULCBhbmQgS0VZLiAgVGhlCisgICAgICAgZmluYWwgcmVzdWx0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpcnN0IGNvbnRleHQuICAqLworICAgIHNoYTI1Nl9pbml0X2N0eCgmYWx0X2N0eCk7CisKKyAgICAvKiBBZGQga2V5LiAgKi8KKyAgICBzaGEyNTZfcHJvY2Vzc19ieXRlcyhrZXksIGtleV9sZW4sICZhbHRfY3R4KTsKKworICAgIC8qIEFkZCBzYWx0LiAgKi8KKyAgICBzaGEyNTZfcHJvY2Vzc19ieXRlcyhzYWx0LCBzYWx0X2xlbiwgJmFsdF9jdHgpOworCisgICAgLyogQWRkIGtleSBhZ2Fpbi4gICovCisgICAgc2hhMjU2X3Byb2Nlc3NfYnl0ZXMoa2V5LCBrZXlfbGVuLCAmYWx0X2N0eCk7CisKKyAgICAvKiBOb3cgZ2V0IHJlc3VsdCBvZiB0aGlzICgzMiBieXRlcykgYW5kIGFkZCBpdCB0byB0aGUgb3RoZXIKKyAgICAgICBjb250ZXh0LiAgKi8KKyAgICBzaGEyNTZfZmluaXNoX2N0eCgmYWx0X2N0eCwgYWx0X3Jlc3VsdCk7CisKKyAgICAvKiBBZGQgZm9yIGFueSBjaGFyYWN0ZXIgaW4gdGhlIGtleSBvbmUgYnl0ZSBvZiB0aGUgYWx0ZXJuYXRlIHN1bS4gICovCisgICAgZm9yIChjbnQgPSBrZXlfbGVuOyBjbnQgPiAzMjsgY250IC09IDMyKQorCXNoYTI1Nl9wcm9jZXNzX2J5dGVzKGFsdF9yZXN1bHQsIDMyLCAmY3R4KTsKKyAgICBzaGEyNTZfcHJvY2Vzc19ieXRlcyhhbHRfcmVzdWx0LCBjbnQsICZjdHgpOworCisgICAgLyogVGFrZSB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsZW5ndGggb2YgdGhlIGtleSBhbmQgZm9yIGV2ZXJ5CisgICAgICAgMSBhZGQgdGhlIGFsdGVybmF0ZSBzdW0sIGZvciBldmVyeSAwIHRoZSBrZXkuICAqLworICAgIGZvciAoY250ID0ga2V5X2xlbjsgY250OyBjbnQgPj49IDEpCisJaWYgKChjbnQgJiAxKSAhPSAwKQorCSAgICBzaGEyNTZfcHJvY2Vzc19ieXRlcyhhbHRfcmVzdWx0LCAzMiwgJmN0eCk7CisJZWxzZQorCSAgICBzaGEyNTZfcHJvY2Vzc19ieXRlcyhrZXksIGtleV9sZW4sICZjdHgpOworCisgICAgLyogQ3JlYXRlIGludGVybWVkaWF0ZSByZXN1bHQuICAqLworICAgIHNoYTI1Nl9maW5pc2hfY3R4KCZjdHgsIGFsdF9yZXN1bHQpOworCisgICAgLyogU3RhcnQgY29tcHV0YXRpb24gb2YgUCBieXRlIHNlcXVlbmNlLiAgKi8KKyAgICBzaGEyNTZfaW5pdF9jdHgoJmFsdF9jdHgpOworCisgICAgLyogRm9yIGV2ZXJ5IGNoYXJhY3RlciBpbiB0aGUgcGFzc3dvcmQgYWRkIHRoZSBlbnRpcmUgcGFzc3dvcmQuICAqLworICAgIGZvciAoY250ID0gMDsgY250IDwga2V5X2xlbjsgKytjbnQpCisJc2hhMjU2X3Byb2Nlc3NfYnl0ZXMoa2V5LCBrZXlfbGVuLCAmYWx0X2N0eCk7CisKKyAgICAvKiBGaW5pc2ggdGhlIGRpZ2VzdC4gICovCisgICAgc2hhMjU2X2ZpbmlzaF9jdHgoJmFsdF9jdHgsIHRlbXBfcmVzdWx0KTsKKworICAgIC8qIENyZWF0ZSBieXRlIHNlcXVlbmNlIFAuICAqLworICAgIGNwID0gcF9ieXRlcyA9IGFsbG9jYShrZXlfbGVuKTsKKyAgICBmb3IgKGNudCA9IGtleV9sZW47IGNudCA+PSAzMjsgY250IC09IDMyKQorCWNwID0gbWVtcGNweShjcCwgdGVtcF9yZXN1bHQsIDMyKTsKKyAgICBtZW1jcHkoY3AsIHRlbXBfcmVzdWx0LCBjbnQpOworCisgICAgLyogU3RhcnQgY29tcHV0YXRpb24gb2YgUyBieXRlIHNlcXVlbmNlLiAgKi8KKyAgICBzaGEyNTZfaW5pdF9jdHgoJmFsdF9jdHgpOworCisgICAgLyogRm9yIGV2ZXJ5IGNoYXJhY3RlciBpbiB0aGUgcGFzc3dvcmQgYWRkIHRoZSBlbnRpcmUgcGFzc3dvcmQuICAqLworICAgIGZvciAoY250ID0gMDsgY250IDwgKHNpemVfdCkxNiArIGFsdF9yZXN1bHRbMF07ICsrY250KQorCXNoYTI1Nl9wcm9jZXNzX2J5dGVzKHNhbHQsIHNhbHRfbGVuLCAmYWx0X2N0eCk7CisKKyAgICAvKiBGaW5pc2ggdGhlIGRpZ2VzdC4gICovCisgICAgc2hhMjU2X2ZpbmlzaF9jdHgoJmFsdF9jdHgsIHRlbXBfcmVzdWx0KTsKKworICAgIC8qIENyZWF0ZSBieXRlIHNlcXVlbmNlIFMuICAqLworICAgIGNwID0gc19ieXRlcyA9IGFsbG9jYShzYWx0X2xlbik7CisgICAgZm9yIChjbnQgPSBzYWx0X2xlbjsgY250ID49IDMyOyBjbnQgLT0gMzIpCisJY3AgPSBtZW1wY3B5KGNwLCB0ZW1wX3Jlc3VsdCwgMzIpOworICAgIG1lbWNweShjcCwgdGVtcF9yZXN1bHQsIGNudCk7CisKKyAgICAvKiBSZXBlYXRlZGx5IHJ1biB0aGUgY29sbGVjdGVkIGhhc2ggdmFsdWUgdGhyb3VnaCBTSEEyNTYgdG8gYnVybgorICAgICAgIENQVSBjeWNsZXMuICAqLworICAgIGZvciAoY250ID0gMDsgY250IDwgcm91bmRzOyArK2NudCkgeworCS8qIE5ldyBjb250ZXh0LiAgKi8KKwlzaGEyNTZfaW5pdF9jdHgoJmN0eCk7CisKKwkvKiBBZGQga2V5IG9yIGxhc3QgcmVzdWx0LiAgKi8KKwlpZiAoKGNudCAmIDEpICE9IDApCisJICAgIHNoYTI1Nl9wcm9jZXNzX2J5dGVzKHBfYnl0ZXMsIGtleV9sZW4sICZjdHgpOworCWVsc2UKKwkgICAgc2hhMjU2X3Byb2Nlc3NfYnl0ZXMoYWx0X3Jlc3VsdCwgMzIsICZjdHgpOworCisJLyogQWRkIHNhbHQgZm9yIG51bWJlcnMgbm90IGRpdmlzaWJsZSBieSAzLiAgKi8KKwlpZiAoY250ICUgMyAhPSAwKQorCSAgICBzaGEyNTZfcHJvY2Vzc19ieXRlcyhzX2J5dGVzLCBzYWx0X2xlbiwgJmN0eCk7CisKKwkvKiBBZGQga2V5IGZvciBudW1iZXJzIG5vdCBkaXZpc2libGUgYnkgNy4gICovCisJaWYgKGNudCAlIDcgIT0gMCkKKwkgICAgc2hhMjU2X3Byb2Nlc3NfYnl0ZXMocF9ieXRlcywga2V5X2xlbiwgJmN0eCk7CisKKwkvKiBBZGQga2V5IG9yIGxhc3QgcmVzdWx0LiAgKi8KKwlpZiAoKGNudCAmIDEpICE9IDApCisJICAgIHNoYTI1Nl9wcm9jZXNzX2J5dGVzKGFsdF9yZXN1bHQsIDMyLCAmY3R4KTsKKwllbHNlCisJICAgIHNoYTI1Nl9wcm9jZXNzX2J5dGVzKHBfYnl0ZXMsIGtleV9sZW4sICZjdHgpOworCisJLyogQ3JlYXRlIGludGVybWVkaWF0ZSByZXN1bHQuICAqLworCXNoYTI1Nl9maW5pc2hfY3R4KCZjdHgsIGFsdF9yZXN1bHQpOworICAgIH0KKworICAgIC8qIE5vdyB3ZSBjYW4gY29uc3RydWN0IHRoZSByZXN1bHQgc3RyaW5nLiAgSXQgY29uc2lzdHMgb2YgdGhyZWUKKyAgICAgICBwYXJ0cy4gICovCisgICAgY3AgPSBzdHBuY3B5KGJ1ZmZlciwgc2hhMjU2X3NhbHRfcHJlZml4LCBNQVgoMCwgYnVmbGVuKSk7CisgICAgYnVmbGVuIC09IHNpemVvZihzaGEyNTZfc2FsdF9wcmVmaXgpIC0gMTsKKworICAgIGlmIChyb3VuZHNfY3VzdG9tKSB7CisJaW50IG4gPSBzbnByaW50ZihjcCwgTUFYKDAsIGJ1ZmxlbiksICIlcyV6dSQiLAorCQkJIHNoYTI1Nl9yb3VuZHNfcHJlZml4LCByb3VuZHMpOworCWNwICs9IG47CisJYnVmbGVuIC09IG47CisgICAgfQorCisgICAgY3AgPSBzdHBuY3B5KGNwLCBzYWx0LCBNSU4oKHNpemVfdCkgTUFYKDAsIGJ1ZmxlbiksIHNhbHRfbGVuKSk7CisgICAgYnVmbGVuIC09IE1JTigoc2l6ZV90KSBNQVgoMCwgYnVmbGVuKSwgc2FsdF9sZW4pOworCisgICAgaWYgKGJ1ZmxlbiA+IDApIHsKKwkqY3ArKyA9ICckJzsKKwktLWJ1ZmxlbjsKKyAgICB9CisjZGVmaW5lIGI2NF9mcm9tXzI0Yml0KEIyLCBCMSwgQjAsIE4pCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5zaWduZWQgaW50IHcgPSAoKEIyKSA8PCAxNikgfCAoKEIxKSA8PCA4KSB8IChCMCk7CQkJICAgICAgXAorICAgIGludCBuID0gKE4pOwkJCQkJCQkgICAgICBcCisgICAgd2hpbGUgKG4tLSA+IDAgJiYgYnVmbGVuID4gMCkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJKmNwKysgPSBiNjR0W3cgJiAweDNmXTsJCQkJCQkgICAgICBcCisJLS1idWZsZW47CQkJCQkJCSAgICAgIFwKKwl3ID4+PSA2OwkJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisgICAgYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFswXSwgYWx0X3Jlc3VsdFsxMF0sIGFsdF9yZXN1bHRbMjBdLCA0KTsKKyAgICBiNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzIxXSwgYWx0X3Jlc3VsdFsxXSwgYWx0X3Jlc3VsdFsxMV0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMTJdLCBhbHRfcmVzdWx0WzIyXSwgYWx0X3Jlc3VsdFsyXSwgNCk7CisgICAgYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFszXSwgYWx0X3Jlc3VsdFsxM10sIGFsdF9yZXN1bHRbMjNdLCA0KTsKKyAgICBiNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzI0XSwgYWx0X3Jlc3VsdFs0XSwgYWx0X3Jlc3VsdFsxNF0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMTVdLCBhbHRfcmVzdWx0WzI1XSwgYWx0X3Jlc3VsdFs1XSwgNCk7CisgICAgYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs2XSwgYWx0X3Jlc3VsdFsxNl0sIGFsdF9yZXN1bHRbMjZdLCA0KTsKKyAgICBiNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzI3XSwgYWx0X3Jlc3VsdFs3XSwgYWx0X3Jlc3VsdFsxN10sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMThdLCBhbHRfcmVzdWx0WzI4XSwgYWx0X3Jlc3VsdFs4XSwgNCk7CisgICAgYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs5XSwgYWx0X3Jlc3VsdFsxOV0sIGFsdF9yZXN1bHRbMjldLCA0KTsKKyAgICBiNjRfZnJvbV8yNGJpdCgwLCBhbHRfcmVzdWx0WzMxXSwgYWx0X3Jlc3VsdFszMF0sIDMpOworICAgIGlmIChidWZsZW4gPD0gMCkgeworCWVycm5vID0gRVJBTkdFOworCWJ1ZmZlciA9IE5VTEw7CisgICAgfSBlbHNlCisJKmNwID0gJ1wwJzsJCS8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nLiAgKi8KKworICAgIC8qIENsZWFyIHRoZSBidWZmZXIgZm9yIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0IHNvIHRoYXQgcGVvcGxlCisgICAgICAgYXR0YWNoaW5nIHRvIHByb2Nlc3NlcyBvciByZWFkaW5nIGNvcmUgZHVtcHMgY2Fubm90IGdldCBhbnkKKyAgICAgICBpbmZvcm1hdGlvbi4gIFdlIGRvIGl0IGluIHRoaXMgd2F5IHRvIGNsZWFyIGNvcnJlY3Rfd29yZHNbXQorICAgICAgIGluc2lkZSB0aGUgU0hBMjU2IGltcGxlbWVudGF0aW9uIGFzIHdlbGwuICAqLworICAgIHNoYTI1Nl9pbml0X2N0eCgmY3R4KTsKKyAgICBzaGEyNTZfZmluaXNoX2N0eCgmY3R4LCBhbHRfcmVzdWx0KTsKKyAgICBtZW1zZXQodGVtcF9yZXN1bHQsICdcMCcsIHNpemVvZih0ZW1wX3Jlc3VsdCkpOworICAgIG1lbXNldChwX2J5dGVzLCAnXDAnLCBrZXlfbGVuKTsKKyAgICBtZW1zZXQoc19ieXRlcywgJ1wwJywgc2FsdF9sZW4pOworICAgIG1lbXNldCgmY3R4LCAnXDAnLCBzaXplb2YoY3R4KSk7CisgICAgbWVtc2V0KCZhbHRfY3R4LCAnXDAnLCBzaXplb2YoYWx0X2N0eCkpOworICAgIGlmIChjb3BpZWRfa2V5ICE9IE5VTEwpCisJbWVtc2V0KGNvcGllZF9rZXksICdcMCcsIGtleV9sZW4pOworICAgIGlmIChjb3BpZWRfc2FsdCAhPSBOVUxMKQorCW1lbXNldChjb3BpZWRfc2FsdCwgJ1wwJywgc2FsdF9sZW4pOworCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworLyogVGhpcyBlbnRyeSBwb2ludCBpcyBlcXVpdmFsZW50IHRvIHRoZSBgY3J5cHQnIGZ1bmN0aW9uIGluIFVuaXgKKyAgIGxpYmNzLiAgKi8KK2NoYXIgKnNoYTI1Nl9jcnlwdChjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnNhbHQpCit7CisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBoYXZlIGFuIGFyYml0cmFyeSBsaW1pdCBpbiB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICBwYXNzd29yZC4gIFdlIGNhbiBjb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICByZXN1bHQgaW4gYWR2YW5jZSBhbmQgc28gd2UgY2FuIHByZXBhcmUgdGhlIGJ1ZmZlciB3ZSBwYXNzIHRvCisgICAgICAgYHNoYTI1Nl9jcnlwdF9yJy4gICovCisgICAgc3RhdGljIGNoYXIgKmJ1ZmZlcjsKKyAgICBzdGF0aWMgaW50IGJ1ZmxlbjsKKyAgICBpbnQgbmVlZGVkID0gKHNpemVvZihzaGEyNTZfc2FsdF9wcmVmaXgpIC0gMQorCQkgICsgc2l6ZW9mKHNoYTI1Nl9yb3VuZHNfcHJlZml4KSArIDkgKyAxCisJCSAgKyBzdHJsZW4oc2FsdCkgKyAxICsgNDMgKyAxKTsKKworICAgIGlmIChidWZsZW4gPCBuZWVkZWQpIHsKKwljaGFyICpuZXdfYnVmZmVyID0gKGNoYXIgKilyZWFsbG9jKGJ1ZmZlciwgbmVlZGVkKTsKKwlpZiAobmV3X2J1ZmZlciA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKworCWJ1ZmZlciA9IG5ld19idWZmZXI7CisJYnVmbGVuID0gbmVlZGVkOworICAgIH0KKworICAgIHJldHVybiBzaGEyNTZfY3J5cHRfcihrZXksIHNhbHQsIGJ1ZmZlciwgYnVmbGVuKTsKK30KKworI2lmZGVmIFRFU1QKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmlucHV0OworICAgIGNvbnN0IGNoYXIgcmVzdWx0WzMyXTsKK30gdGVzdHNbXSA9IHsKKyAgICAvKiBUZXN0IHZlY3RvcnMgZnJvbSBGSVBTIDE4MC0yOiBhcHBlbmRpeCBCLjEuICAqLworICAgIHsKKyAgICAiYWJjIiwKKwkgICAgIlx4YmFceDc4XHgxNlx4YmZceDhmXHgwMVx4Y2ZceGVhXHg0MVx4NDFceDQwXHhkZVx4NWRceGFlXHgyMlx4MjMiCisJICAgICJceGIwXHgwM1x4NjFceGEzXHg5Nlx4MTdceDdhXHg5Y1x4YjRceDEwXHhmZlx4NjFceGYyXHgwMFx4MTVceGFkIn0sCisJLyogVGVzdCB2ZWN0b3JzIGZyb20gRklQUyAxODAtMjogYXBwZW5kaXggQi4yLiAgKi8KKyAgICB7CisgICAgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKwkgICAgIlx4MjRceDhkXHg2YVx4NjFceGQyXHgwNlx4MzhceGI4XHhlNVx4YzBceDI2XHg5M1x4MGNceDNlXHg2MFx4MzkiCisJICAgICJceGEzXHgzY1x4ZTRceDU5XHg2NFx4ZmZceDIxXHg2N1x4ZjZceGVjXHhlZFx4ZDRceDE5XHhkYlx4MDZceGMxIn0sCisJLyogVGVzdCB2ZWN0b3JzIGZyb20gdGhlIE5FU1NJRSBwcm9qZWN0LiAgKi8KKyAgICB7CisgICAgIiIsICJceGUzXHhiMFx4YzRceDQyXHg5OFx4ZmNceDFjXHgxNFx4OWFceGZiXHhmNFx4YzhceDk5XHg2Zlx4YjlceDI0IgorCSAgICAiXHgyN1x4YWVceDQxXHhlNFx4NjRceDliXHg5M1x4NGNceGE0XHg5NVx4OTlceDFiXHg3OFx4NTJceGI4XHg1NSJ9LAorICAgIHsKKyAgICAiYSIsICJceGNhXHg5N1x4ODFceDEyXHhjYVx4MWJceGJkXHhjYVx4ZmFceGMyXHgzMVx4YjNceDlhXHgyM1x4ZGNceDRkIgorCSAgICAiXHhhN1x4ODZceGVmXHhmOFx4MTRceDdjXHg0ZVx4NzJceGI5XHg4MFx4NzdceDg1XHhhZlx4ZWVceDQ4XHhiYiJ9LAorICAgIHsKKyAgICAibWVzc2FnZSBkaWdlc3QiLAorCSAgICAiXHhmN1x4ODRceDZmXHg1NVx4Y2ZceDIzXHhlMVx4NGVceGViXHhlYVx4YjVceGI0XHhlMVx4NTVceDBjXHhhZCIKKwkgICAgIlx4NWJceDUwXHg5ZVx4MzNceDQ4XHhmYlx4YzRceGVmXHhhM1x4YTFceDQxXHgzZFx4MzlceDNjXHhiNlx4NTAifSwKKyAgICB7CisgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKwkgICAgIlx4NzFceGM0XHg4MFx4ZGZceDkzXHhkNlx4YWVceDJmXHgxZVx4ZmFceGQxXHg0NFx4N2NceDY2XHhjOVx4NTIiCisJICAgICJceDVlXHgzMVx4NjJceDE4XHhjZlx4NTFceGZjXHg4ZFx4OWVceGQ4XHgzMlx4ZjJceGRhXHhmMVx4OGJceDczIn0sCisgICAgeworICAgICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCisJICAgICJceDI0XHg4ZFx4NmFceDYxXHhkMlx4MDZceDM4XHhiOFx4ZTVceGMwXHgyNlx4OTNceDBjXHgzZVx4NjBceDM5IgorCSAgICAiXHhhM1x4M2NceGU0XHg1OVx4NjRceGZmXHgyMVx4NjdceGY2XHhlY1x4ZWRceGQ0XHgxOVx4ZGJceDA2XHhjMSJ9LAorICAgIHsKKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAorCSAgICAiXHhkYlx4NGJceGZjXHhiZFx4NGRceGEwXHhjZFx4ODVceGE2XHgwY1x4M2NceDM3XHhkM1x4ZmJceGQ4XHg4MCIKKwkgICAgIlx4NWNceDc3XHhmMVx4NWZceGM2XHhiMVx4ZmRceGZlXHg2MVx4NGVceGUwXHhhN1x4YzhceGZkXHhiNFx4YzAifSwKKyAgICB7CisgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKKwkgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKKwkgICAgIlx4ZjNceDcxXHhiY1x4NGFceDMxXHgxZlx4MmJceDAwXHg5ZVx4ZWZceDk1XHgyZFx4ZDhceDNjXHhhOFx4MGUiCisJICAgICJceDJiXHg2MFx4MDJceDZjXHg4ZVx4OTNceDU1XHg5Mlx4ZDBceGY5XHhjM1x4MDhceDQ1XHgzY1x4ODFceDNlIn0KK307CisKKyNkZWZpbmUgbnRlc3RzIChzaXplb2YgKHRlc3RzKSAvIHNpemVvZiAodGVzdHNbMF0pKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpzYWx0OworICAgIGNvbnN0IGNoYXIgKmlucHV0OworICAgIGNvbnN0IGNoYXIgKmV4cGVjdGVkOworfSB0ZXN0czJbXSA9IHsKKyAgICB7CisgICAgIiQ1JHNhbHRzdHJpbmciLCAiSGVsbG8gd29ybGQhIiwKKwkgICAgIiQ1JHNhbHRzdHJpbmckNUI4dllZaVkuQ1Z0MVJsVFRmOEtiWEJIM2hzeFkvR05vb1phQkJHV0VjNSJ9LCB7CisgICAgIiQ1JHJvdW5kcz0xMDAwMCRzYWx0c3RyaW5nc2FsdHN0cmluZyIsICJIZWxsbyB3b3JsZCEiLAorCSAgICAiJDUkcm91bmRzPTEwMDAwJHNhbHRzdHJpbmdzYWx0c3QkM3h2LlZiU0hCYjQxQUw5QXZMZXVqWmtaUkJBd3FGTXoyLiIKKwkgICAgIm9wcWV5NkljQSJ9LCB7CisgICAgIiQ1JHJvdW5kcz01MDAwJHRvb2xvbmdzYWx0c3RyaW5nIiwgIlRoaXMgaXMganVzdCBhIHRlc3QiLAorCSAgICAiJDUkcm91bmRzPTUwMDAkdG9vbG9uZ3NhbHRzdHJpbiRVbi81anpBSE1nT0daNS5tV0pwdVZvbGlsMDdndUhQdk9XOCIKKwkgICAgIm1HUmN2eGE1In0sIHsKKyAgICAiJDUkcm91bmRzPTE0MDAkYW5vdGhlcmxvbmdzYWx0c3RyaW5nIiwKKwkgICAgImEgdmVyeSBtdWNoIGxvbmdlciB0ZXh0IHRvIGVuY3J5cHQuICBUaGlzIG9uZSBldmVuIHN0cmV0Y2hlcyBvdmVyIG1vcmUiCisJICAgICJ0aGFuIG9uZSBsaW5lLiIsCisJICAgICIkNSRyb3VuZHM9MTQwMCRhbm90aGVybG9uZ3NhbHRzJFJ4Lmo4SC5oOEhqRURHb21GVThiRGtYbTNYSVVuenl4ZjEyIgorCSAgICAib1A4NEJucTEifSwgeworICAgICIkNSRyb3VuZHM9Nzc3Nzckc2hvcnQiLAorCSAgICAid2UgaGF2ZSBhIHNob3J0IHNhbHQgc3RyaW5nIGJ1dCBub3QgYSBzaG9ydCBwYXNzd29yZCIsCisJICAgICIkNSRyb3VuZHM9Nzc3Nzckc2hvcnQkSmlPMU8zWnBEQXhHSmVhREl1cUNvRUZ5c0FlMW1aTkpSczNwdzBLUVJkLyJ9LAorICAgIHsKKyAgICAiJDUkcm91bmRzPTEyMzQ1NiRhc2FsdG9mMTZjaGFycy4uIiwgImEgc2hvcnQgc3RyaW5nIiwKKwkgICAgIiQ1JHJvdW5kcz0xMjM0NTYkYXNhbHRvZjE2Y2hhcnMuLiRnUDNWUS82WDdVVUVXM0hrQm4ydzEvUHRxMmp4UHl6Vi8iCisJICAgICJjWkttRi93SnZEIn0sIHsKKyIkNSRyb3VuZHM9MTAkcm91bmRzdG9vbG93IiwgInRoZSBtaW5pbXVtIG51bWJlciBpcyBzdGlsbCBvYnNlcnZlZCIsCisJICAgICIkNSRyb3VuZHM9MTAwMCRyb3VuZHN0b29sb3ckeWZ2d2NXclE4bC9LMERBV3l1UE1ETkhwSVZsVFFlYlk5bC9nTDk3IgorCSAgICAiMmJJQyJ9LH07CisjZGVmaW5lIG50ZXN0czIgKHNpemVvZiAodGVzdHMyKSAvIHNpemVvZiAodGVzdHMyWzBdKSkKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBzdHJ1Y3Qgc2hhMjU2X2N0eCBjdHg7CisgICAgY2hhciBzdW1bMzJdOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBjbnQ7CisKKyAgICBmb3IgKGNudCA9IDA7IGNudCA8IChpbnQpbnRlc3RzOyArK2NudCkgeworCXNoYTI1Nl9pbml0X2N0eCgmY3R4KTsKKwlzaGEyNTZfcHJvY2Vzc19ieXRlcyh0ZXN0c1tjbnRdLmlucHV0LCBzdHJsZW4odGVzdHNbY250XS5pbnB1dCksICZjdHgpOworCXNoYTI1Nl9maW5pc2hfY3R4KCZjdHgsIHN1bSk7CisJaWYgKG1lbWNtcCh0ZXN0c1tjbnRdLnJlc3VsdCwgc3VtLCAzMikgIT0gMCkgeworCSAgICBwcmludGYoInRlc3QgJWQgcnVuICVkIGZhaWxlZFxuIiwgY250LCAxKTsKKwkgICAgcmVzdWx0ID0gMTsKKwl9CisKKwlzaGEyNTZfaW5pdF9jdHgoJmN0eCk7CisJZm9yIChpbnQgaSA9IDA7IHRlc3RzW2NudF0uaW5wdXRbaV0gIT0gJ1wwJzsgKytpKQorCSAgICBzaGEyNTZfcHJvY2Vzc19ieXRlcygmdGVzdHNbY250XS5pbnB1dFtpXSwgMSwgJmN0eCk7CisJc2hhMjU2X2ZpbmlzaF9jdHgoJmN0eCwgc3VtKTsKKwlpZiAobWVtY21wKHRlc3RzW2NudF0ucmVzdWx0LCBzdW0sIDMyKSAhPSAwKSB7CisJICAgIHByaW50ZigidGVzdCAlZCBydW4gJWQgZmFpbGVkXG4iLCBjbnQsIDIpOworCSAgICByZXN1bHQgPSAxOworCX0KKyAgICB9CisKKyAgICAvKiBUZXN0IHZlY3RvciBmcm9tIEZJUFMgMTgwLTI6IGFwcGVuZGl4IEIuMy4gICovCisgICAgY2hhciBidWZbMTAwMF07CisgICAgbWVtc2V0KGJ1ZiwgJ2EnLCBzaXplb2YoYnVmKSk7CisgICAgc2hhMjU2X2luaXRfY3R4KCZjdHgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKQorCXNoYTI1Nl9wcm9jZXNzX2J5dGVzKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZjdHgpOworICAgIHNoYTI1Nl9maW5pc2hfY3R4KCZjdHgsIHN1bSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgZXhwZWN0ZWRbMzJdID0KKwkiXHhjZFx4YzdceDZlXHg1Y1x4OTlceDE0XHhmYlx4OTJceDgxXHhhMVx4YzdceGUyXHg4NFx4ZDdceDNlXHg2NyIKKwkiXHhmMVx4ODBceDlhXHg0OFx4YTRceDk3XHgyMFx4MGVceDA0XHg2ZFx4MzlceGNjXHhjN1x4MTFceDJjXHhkMCI7CisgICAgaWYgKG1lbWNtcChleHBlY3RlZCwgc3VtLCAzMikgIT0gMCkgeworCXByaW50ZigidGVzdCAlZCBmYWlsZWRcbiIsIGNudCk7CisJcmVzdWx0ID0gMTsKKyAgICB9CisKKyAgICBmb3IgKGNudCA9IDA7IGNudCA8IG50ZXN0czI7ICsrY250KSB7CisJY2hhciAqY3AgPSBzaGEyNTZfY3J5cHQodGVzdHMyW2NudF0uaW5wdXQsIHRlc3RzMltjbnRdLnNhbHQpOworCisJaWYgKHN0cmNtcChjcCwgdGVzdHMyW2NudF0uZXhwZWN0ZWQpICE9IDApIHsKKwkgICAgcHJpbnRmKCJ0ZXN0ICVkOiBleHBlY3RlZCBcIiVzXCIsIGdvdCBcIiVzXCJcbiIsCisJCSAgIGNudCwgdGVzdHMyW2NudF0uZXhwZWN0ZWQsIGNwKTsKKwkgICAgcmVzdWx0ID0gMTsKKwl9CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSAwKQorCXB1dHMoImFsbCB0ZXN0cyBPSyIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbGlidXRpbC9zaGE1MTJjcnlwdC5jIGIvY29tMzIvbGlidXRpbC9zaGE1MTJjcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjljMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9saWJ1dGlsL3NoYTUxMmNyeXB0LmMKQEAgLTAsMCArMSw3NDkgQEAKKy8qIFNIQTUxMi1iYXNlZCBVbml4IGNyeXB0IGltcGxlbWVudGF0aW9uLgorICAgUmVsZWFzZWQgaW50byB0aGUgUHVibGljIERvbWFpbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPi4gICovCisKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAieGNyeXB0LmgiCisKKyNkZWZpbmUgTUlOKHgseSkgbWluKHgseSkKKyNkZWZpbmUgTUFYKHgseSkgbWF4KHgseSkKKworLyogU3RydWN0dXJlIHRvIHNhdmUgc3RhdGUgb2YgY29tcHV0YXRpb24gYmV0d2VlbiB0aGUgc2luZ2xlIHN0ZXBzLiAgKi8KK3N0cnVjdCBzaGE1MTJfY3R4IHsKKyAgICB1aW50NjRfdCBIWzhdOworCisgICAgdWludDY0X3QgdG90YWxbMl07CisgICAgdWludDY0X3QgYnVmbGVuOworICAgIGNoYXIgYnVmZmVyWzI1Nl07CQkvKiBOQjogYWx3YXlzIGNvcnJlY3RseSBhbGlnbmVkIGZvciB1aW50NjRfdC4gICovCit9OworCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyBkZWZpbmUgU1dBUChuKSBcCisgICgoKG4pIDw8IDU2KQkJCQkJXAorICAgfCAoKChuKSAmIDB4ZmYwMCkgPDwgNDApCQkJXAorICAgfCAoKChuKSAmIDB4ZmYwMDAwKSA8PCAyNCkJCQlcCisgICB8ICgoKG4pICYgMHhmZjAwMDAwMCkgPDwgOCkJCQlcCisgICB8ICgoKG4pID4+IDgpICYgMHhmZjAwMDAwMCkJCQlcCisgICB8ICgoKG4pID4+IDI0KSAmIDB4ZmYwMDAwKQkJCVwKKyAgIHwgKCgobikgPj4gNDApICYgMHhmZjAwKQkJCVwKKyAgIHwgKChuKSA+PiA1NikpCisjZWxzZQorIyBkZWZpbmUgU1dBUChuKSAobikKKyNlbmRpZgorCisvKiBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZSBieXRlcyB1c2VkIHRvIHBhZCB0aGUgYnVmZmVyIHRvIHRoZSBuZXh0CisgICA2NC1ieXRlIGJvdW5kYXJ5LiAgKEZJUFMgMTgwLTI6NS4xLjIpICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmlsbGJ1ZlsxMjhdID0geyAweDgwLCAwIC8qICwgMCwgMCwgLi4uICAqLyAgfTsKKworLyogQ29uc3RhbnRzIGZvciBTSEE1MTIgZnJvbSBGSVBTIDE4MC0yOjQuMi4zLiAgKi8KK3N0YXRpYyBjb25zdCB1aW50NjRfdCBLWzgwXSA9IHsKKyAgICBVSU5UNjRfQygweDQyOGEyZjk4ZDcyOGFlMjIpLCBVSU5UNjRfQygweDcxMzc0NDkxMjNlZjY1Y2QpLAorICAgIFVJTlQ2NF9DKDB4YjVjMGZiY2ZlYzRkM2IyZiksIFVJTlQ2NF9DKDB4ZTliNWRiYTU4MTg5ZGJiYyksCisgICAgVUlOVDY0X0MoMHgzOTU2YzI1YmYzNDhiNTM4KSwgVUlOVDY0X0MoMHg1OWYxMTFmMWI2MDVkMDE5KSwKKyAgICBVSU5UNjRfQygweDkyM2Y4MmE0YWYxOTRmOWIpLCBVSU5UNjRfQygweGFiMWM1ZWQ1ZGE2ZDgxMTgpLAorICAgIFVJTlQ2NF9DKDB4ZDgwN2FhOThhMzAzMDI0MiksIFVJTlQ2NF9DKDB4MTI4MzViMDE0NTcwNmZiZSksCisgICAgVUlOVDY0X0MoMHgyNDMxODViZTRlZTRiMjhjKSwgVUlOVDY0X0MoMHg1NTBjN2RjM2Q1ZmZiNGUyKSwKKyAgICBVSU5UNjRfQygweDcyYmU1ZDc0ZjI3Yjg5NmYpLCBVSU5UNjRfQygweDgwZGViMWZlM2IxNjk2YjEpLAorICAgIFVJTlQ2NF9DKDB4OWJkYzA2YTcyNWM3MTIzNSksIFVJTlQ2NF9DKDB4YzE5YmYxNzRjZjY5MjY5NCksCisgICAgVUlOVDY0X0MoMHhlNDliNjljMTllZjE0YWQyKSwgVUlOVDY0X0MoMHhlZmJlNDc4NjM4NGYyNWUzKSwKKyAgICBVSU5UNjRfQygweDBmYzE5ZGM2OGI4Y2Q1YjUpLCBVSU5UNjRfQygweDI0MGNhMWNjNzdhYzljNjUpLAorICAgIFVJTlQ2NF9DKDB4MmRlOTJjNmY1OTJiMDI3NSksIFVJTlQ2NF9DKDB4NGE3NDg0YWE2ZWE2ZTQ4MyksCisgICAgVUlOVDY0X0MoMHg1Y2IwYTlkY2JkNDFmYmQ0KSwgVUlOVDY0X0MoMHg3NmY5ODhkYTgzMTE1M2I1KSwKKyAgICBVSU5UNjRfQygweDk4M2U1MTUyZWU2NmRmYWIpLCBVSU5UNjRfQygweGE4MzFjNjZkMmRiNDMyMTApLAorICAgIFVJTlQ2NF9DKDB4YjAwMzI3Yzg5OGZiMjEzZiksIFVJTlQ2NF9DKDB4YmY1OTdmYzdiZWVmMGVlNCksCisgICAgVUlOVDY0X0MoMHhjNmUwMGJmMzNkYTg4ZmMyKSwgVUlOVDY0X0MoMHhkNWE3OTE0NzkzMGFhNzI1KSwKKyAgICBVSU5UNjRfQygweDA2Y2E2MzUxZTAwMzgyNmYpLCBVSU5UNjRfQygweDE0MjkyOTY3MGEwZTZlNzApLAorICAgIFVJTlQ2NF9DKDB4MjdiNzBhODU0NmQyMmZmYyksIFVJTlQ2NF9DKDB4MmUxYjIxMzg1YzI2YzkyNiksCisgICAgVUlOVDY0X0MoMHg0ZDJjNmRmYzVhYzQyYWVkKSwgVUlOVDY0X0MoMHg1MzM4MGQxMzlkOTViM2RmKSwKKyAgICBVSU5UNjRfQygweDY1MGE3MzU0OGJhZjYzZGUpLCBVSU5UNjRfQygweDc2NmEwYWJiM2M3N2IyYTgpLAorICAgIFVJTlQ2NF9DKDB4ODFjMmM5MmU0N2VkYWVlNiksIFVJTlQ2NF9DKDB4OTI3MjJjODUxNDgyMzUzYiksCisgICAgVUlOVDY0X0MoMHhhMmJmZThhMTRjZjEwMzY0KSwgVUlOVDY0X0MoMHhhODFhNjY0YmJjNDIzMDAxKSwKKyAgICBVSU5UNjRfQygweGMyNGI4YjcwZDBmODk3OTEpLCBVSU5UNjRfQygweGM3NmM1MWEzMDY1NGJlMzApLAorICAgIFVJTlQ2NF9DKDB4ZDE5MmU4MTlkNmVmNTIxOCksIFVJTlQ2NF9DKDB4ZDY5OTA2MjQ1NTY1YTkxMCksCisgICAgVUlOVDY0X0MoMHhmNDBlMzU4NTU3NzEyMDJhKSwgVUlOVDY0X0MoMHgxMDZhYTA3MDMyYmJkMWI4KSwKKyAgICBVSU5UNjRfQygweDE5YTRjMTE2YjhkMmQwYzgpLCBVSU5UNjRfQygweDFlMzc2YzA4NTE0MWFiNTMpLAorICAgIFVJTlQ2NF9DKDB4Mjc0ODc3NGNkZjhlZWI5OSksIFVJTlQ2NF9DKDB4MzRiMGJjYjVlMTliNDhhOCksCisgICAgVUlOVDY0X0MoMHgzOTFjMGNiM2M1Yzk1YTYzKSwgVUlOVDY0X0MoMHg0ZWQ4YWE0YWUzNDE4YWNiKSwKKyAgICBVSU5UNjRfQygweDViOWNjYTRmNzc2M2UzNzMpLCBVSU5UNjRfQygweDY4MmU2ZmYzZDZiMmI4YTMpLAorICAgIFVJTlQ2NF9DKDB4NzQ4ZjgyZWU1ZGVmYjJmYyksIFVJTlQ2NF9DKDB4NzhhNTYzNmY0MzE3MmY2MCksCisgICAgVUlOVDY0X0MoMHg4NGM4NzgxNGExZjBhYjcyKSwgVUlOVDY0X0MoMHg4Y2M3MDIwODFhNjQzOWVjKSwKKyAgICBVSU5UNjRfQygweDkwYmVmZmZhMjM2MzFlMjgpLCBVSU5UNjRfQygweGE0NTA2Y2ViZGU4MmJkZTkpLAorICAgIFVJTlQ2NF9DKDB4YmVmOWEzZjdiMmM2NzkxNSksIFVJTlQ2NF9DKDB4YzY3MTc4ZjJlMzcyNTMyYiksCisgICAgVUlOVDY0X0MoMHhjYTI3M2VjZWVhMjY2MTljKSwgVUlOVDY0X0MoMHhkMTg2YjhjNzIxYzBjMjA3KSwKKyAgICBVSU5UNjRfQygweGVhZGE3ZGQ2Y2RlMGViMWUpLCBVSU5UNjRfQygweGY1N2Q0ZjdmZWU2ZWQxNzgpLAorICAgIFVJTlQ2NF9DKDB4MDZmMDY3YWE3MjE3NmZiYSksIFVJTlQ2NF9DKDB4MGE2MzdkYzVhMmM4OThhNiksCisgICAgVUlOVDY0X0MoMHgxMTNmOTgwNGJlZjkwZGFlKSwgVUlOVDY0X0MoMHgxYjcxMGIzNTEzMWM0NzFiKSwKKyAgICBVSU5UNjRfQygweDI4ZGI3N2Y1MjMwNDdkODQpLCBVSU5UNjRfQygweDMyY2FhYjdiNDBjNzI0OTMpLAorICAgIFVJTlQ2NF9DKDB4M2M5ZWJlMGExNWM5YmViYyksIFVJTlQ2NF9DKDB4NDMxZDY3YzQ5YzEwMGQ0YyksCisgICAgVUlOVDY0X0MoMHg0Y2M1ZDRiZWNiM2U0MmI2KSwgVUlOVDY0X0MoMHg1OTdmMjk5Y2ZjNjU3ZTJhKSwKKyAgICBVSU5UNjRfQygweDVmY2I2ZmFiM2FkNmZhZWMpLCBVSU5UNjRfQygweDZjNDQxOThjNGE0NzU4MTcpCit9OworCisvKiBQcm9jZXNzIExFTiBieXRlcyBvZiBCVUZGRVIsIGFjY3VtdWxhdGluZyBjb250ZXh0IGludG8gQ1RYLgorICAgSXQgaXMgYXNzdW1lZCB0aGF0IExFTiAlIDEyOCA9PSAwLiAgKi8KK3N0YXRpYyB2b2lkCitzaGE1MTJfcHJvY2Vzc19ibG9jayhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW4sIHN0cnVjdCBzaGE1MTJfY3R4ICpjdHgpCit7CisgICAgdW5zaWduZWQgaW50IHQ7CisgICAgY29uc3QgdWludDY0X3QgKndvcmRzID0gYnVmZmVyOworICAgIHNpemVfdCBud29yZHMgPSBsZW4gLyBzaXplb2YodWludDY0X3QpOworICAgIHVpbnQ2NF90IGEgPSBjdHgtPkhbMF07CisgICAgdWludDY0X3QgYiA9IGN0eC0+SFsxXTsKKyAgICB1aW50NjRfdCBjID0gY3R4LT5IWzJdOworICAgIHVpbnQ2NF90IGQgPSBjdHgtPkhbM107CisgICAgdWludDY0X3QgZSA9IGN0eC0+SFs0XTsKKyAgICB1aW50NjRfdCBmID0gY3R4LT5IWzVdOworICAgIHVpbnQ2NF90IGcgPSBjdHgtPkhbNl07CisgICAgdWludDY0X3QgaCA9IGN0eC0+SFs3XTsKKworICAgIC8qIEZpcnN0IGluY3JlbWVudCB0aGUgYnl0ZSBjb3VudC4gIEZJUFMgMTgwLTIgc3BlY2lmaWVzIHRoZSBwb3NzaWJsZQorICAgICAgIGxlbmd0aCBvZiB0aGUgZmlsZSB1cCB0byAyXjEyOCBiaXRzLiAgSGVyZSB3ZSBvbmx5IGNvbXB1dGUgdGhlCisgICAgICAgbnVtYmVyIG9mIGJ5dGVzLiAgRG8gYSBkb3VibGUgd29yZCBpbmNyZW1lbnQuICAqLworICAgIGN0eC0+dG90YWxbMF0gKz0gbGVuOworICAgIGlmIChjdHgtPnRvdGFsWzBdIDwgbGVuKQorCSsrY3R4LT50b3RhbFsxXTsKKworICAgIC8qIFByb2Nlc3MgYWxsIGJ5dGVzIGluIHRoZSBidWZmZXIgd2l0aCAxMjggYnl0ZXMgaW4gZWFjaCByb3VuZCBvZgorICAgICAgIHRoZSBsb29wLiAgKi8KKyAgICB3aGlsZSAobndvcmRzID4gMCkgeworCXVpbnQ2NF90IFdbODBdOworCXVpbnQ2NF90IGFfc2F2ZSA9IGE7CisJdWludDY0X3QgYl9zYXZlID0gYjsKKwl1aW50NjRfdCBjX3NhdmUgPSBjOworCXVpbnQ2NF90IGRfc2F2ZSA9IGQ7CisJdWludDY0X3QgZV9zYXZlID0gZTsKKwl1aW50NjRfdCBmX3NhdmUgPSBmOworCXVpbnQ2NF90IGdfc2F2ZSA9IGc7CisJdWludDY0X3QgaF9zYXZlID0gaDsKKworCS8qIE9wZXJhdG9ycyBkZWZpbmVkIGluIEZJUFMgMTgwLTI6NC4xLjIuICAqLworI2RlZmluZSBDaCh4LCB5LCB6KSAoKHggJiB5KSBeICh+eCAmIHopKQorI2RlZmluZSBNYWooeCwgeSwgeikgKCh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KSkKKyNkZWZpbmUgUzAoeCkgKENZQ0xJQyAoeCwgMjgpIF4gQ1lDTElDICh4LCAzNCkgXiBDWUNMSUMgKHgsIDM5KSkKKyNkZWZpbmUgUzEoeCkgKENZQ0xJQyAoeCwgMTQpIF4gQ1lDTElDICh4LCAxOCkgXiBDWUNMSUMgKHgsIDQxKSkKKyNkZWZpbmUgUjAoeCkgKENZQ0xJQyAoeCwgMSkgXiBDWUNMSUMgKHgsIDgpIF4gKHggPj4gNykpCisjZGVmaW5lIFIxKHgpIChDWUNMSUMgKHgsIDE5KSBeIENZQ0xJQyAoeCwgNjEpIF4gKHggPj4gNikpCisKKwkvKiBJdCBpcyB1bmZvcnR1bmF0ZSB0aGF0IEMgZG9lcyBub3QgcHJvdmlkZSBhbiBvcGVyYXRvciBmb3IKKwkgICBjeWNsaWMgcm90YXRpb24uICBIb3BlIHRoZSBDIGNvbXBpbGVyIGlzIHNtYXJ0IGVub3VnaC4gICovCisjZGVmaW5lIENZQ0xJQyh3LCBzKSAoKHcgPj4gcykgfCAodyA8PCAoNjQgLSBzKSkpCisKKwkvKiBDb21wdXRlIHRoZSBtZXNzYWdlIHNjaGVkdWxlIGFjY29yZGluZyB0byBGSVBTIDE4MC0yOjYuMy4yIHN0ZXAgMi4gICovCisJZm9yICh0ID0gMDsgdCA8IDE2OyArK3QpIHsKKwkgICAgV1t0XSA9IFNXQVAoKndvcmRzKTsKKwkgICAgKyt3b3JkczsKKwl9CisJZm9yICh0ID0gMTY7IHQgPCA4MDsgKyt0KQorCSAgICBXW3RdID0gUjEoV1t0IC0gMl0pICsgV1t0IC0gN10gKyBSMChXW3QgLSAxNV0pICsgV1t0IC0gMTZdOworCisJLyogVGhlIGFjdHVhbCBjb21wdXRhdGlvbiBhY2NvcmRpbmcgdG8gRklQUyAxODAtMjo2LjMuMiBzdGVwIDMuICAqLworCWZvciAodCA9IDA7IHQgPCA4MDsgKyt0KSB7CisJICAgIHVpbnQ2NF90IFQxID0gaCArIFMxKGUpICsgQ2goZSwgZiwgZykgKyBLW3RdICsgV1t0XTsKKwkgICAgdWludDY0X3QgVDIgPSBTMChhKSArIE1haihhLCBiLCBjKTsKKwkgICAgaCA9IGc7CisJICAgIGcgPSBmOworCSAgICBmID0gZTsKKwkgICAgZSA9IGQgKyBUMTsKKwkgICAgZCA9IGM7CisJICAgIGMgPSBiOworCSAgICBiID0gYTsKKwkgICAgYSA9IFQxICsgVDI7CisJfQorCisJLyogQWRkIHRoZSBzdGFydGluZyB2YWx1ZXMgb2YgdGhlIGNvbnRleHQgYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4zLjIKKwkgICBzdGVwIDQuICAqLworCWEgKz0gYV9zYXZlOworCWIgKz0gYl9zYXZlOworCWMgKz0gY19zYXZlOworCWQgKz0gZF9zYXZlOworCWUgKz0gZV9zYXZlOworCWYgKz0gZl9zYXZlOworCWcgKz0gZ19zYXZlOworCWggKz0gaF9zYXZlOworCisJLyogUHJlcGFyZSBmb3IgdGhlIG5leHQgcm91bmQuICAqLworCW53b3JkcyAtPSAxNjsKKyAgICB9CisKKyAgICAvKiBQdXQgY2hlY2tzdW0gaW4gY29udGV4dCBnaXZlbiBhcyBhcmd1bWVudC4gICovCisgICAgY3R4LT5IWzBdID0gYTsKKyAgICBjdHgtPkhbMV0gPSBiOworICAgIGN0eC0+SFsyXSA9IGM7CisgICAgY3R4LT5IWzNdID0gZDsKKyAgICBjdHgtPkhbNF0gPSBlOworICAgIGN0eC0+SFs1XSA9IGY7CisgICAgY3R4LT5IWzZdID0gZzsKKyAgICBjdHgtPkhbN10gPSBoOworfQorCisvKiBJbml0aWFsaXplIHN0cnVjdHVyZSBjb250YWluaW5nIHN0YXRlIG9mIGNvbXB1dGF0aW9uLgorICAgKEZJUFMgMTgwLTI6NS4zLjMpICAqLworc3RhdGljIHZvaWQgc2hhNTEyX2luaXRfY3R4KHN0cnVjdCBzaGE1MTJfY3R4ICpjdHgpCit7CisgICAgY3R4LT5IWzBdID0gVUlOVDY0X0MoMHg2YTA5ZTY2N2YzYmNjOTA4KTsKKyAgICBjdHgtPkhbMV0gPSBVSU5UNjRfQygweGJiNjdhZTg1ODRjYWE3M2IpOworICAgIGN0eC0+SFsyXSA9IFVJTlQ2NF9DKDB4M2M2ZWYzNzJmZTk0ZjgyYik7CisgICAgY3R4LT5IWzNdID0gVUlOVDY0X0MoMHhhNTRmZjUzYTVmMWQzNmYxKTsKKyAgICBjdHgtPkhbNF0gPSBVSU5UNjRfQygweDUxMGU1MjdmYWRlNjgyZDEpOworICAgIGN0eC0+SFs1XSA9IFVJTlQ2NF9DKDB4OWIwNTY4OGMyYjNlNmMxZik7CisgICAgY3R4LT5IWzZdID0gVUlOVDY0X0MoMHgxZjgzZDlhYmZiNDFiZDZiKTsKKyAgICBjdHgtPkhbN10gPSBVSU5UNjRfQygweDViZTBjZDE5MTM3ZTIxNzkpOworCisgICAgY3R4LT50b3RhbFswXSA9IGN0eC0+dG90YWxbMV0gPSAwOworICAgIGN0eC0+YnVmbGVuID0gMDsKK30KKworLyogUHJvY2VzcyB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBpbnRlcm5hbCBidWZmZXIgYW5kIHRoZSB1c3VhbAorICAgcHJvbG9nIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gUkVTQlVGLgorCisgICBJTVBPUlRBTlQ6IE9uIHNvbWUgc3lzdGVtcyBpdCBpcyByZXF1aXJlZCB0aGF0IFJFU0JVRiBpcyBjb3JyZWN0bHkKKyAgIGFsaWduZWQgZm9yIGEgMzIgYml0cyB2YWx1ZS4gICovCitzdGF0aWMgdm9pZCAqc2hhNTEyX2ZpbmlzaF9jdHgoc3RydWN0IHNoYTUxMl9jdHggKmN0eCwgdm9pZCAqcmVzYnVmKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIC8qIFRha2UgeWV0IHVucHJvY2Vzc2VkIGJ5dGVzIGludG8gYWNjb3VudC4gICovCisgICAgdWludDY0X3QgYnl0ZXMgPSBjdHgtPmJ1ZmxlbjsKKyAgICBzaXplX3QgcGFkOworCisgICAgLyogTm93IGNvdW50IHJlbWFpbmluZyBieXRlcy4gICovCisgICAgY3R4LT50b3RhbFswXSArPSBieXRlczsKKyAgICBpZiAoY3R4LT50b3RhbFswXSA8IGJ5dGVzKQorCSsrY3R4LT50b3RhbFsxXTsKKworICAgIHBhZCA9IGJ5dGVzID49IDExMiA/IDEyOCArIDExMiAtIGJ5dGVzIDogMTEyIC0gYnl0ZXM7CisgICAgbWVtY3B5KCZjdHgtPmJ1ZmZlcltieXRlc10sIGZpbGxidWYsIHBhZCk7CisKKyAgICAvKiBQdXQgdGhlIDEyOC1iaXQgZmlsZSBsZW5ndGggaW4gKmJpdHMqIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gICovCisgICAgKih1aW50NjRfdCAqKSAmIGN0eC0+YnVmZmVyW2J5dGVzICsgcGFkICsgOF0gPSBTV0FQKGN0eC0+dG90YWxbMF0gPDwgMyk7CisgICAgKih1aW50NjRfdCAqKSAmIGN0eC0+YnVmZmVyW2J5dGVzICsgcGFkXSA9IFNXQVAoKGN0eC0+dG90YWxbMV0gPDwgMykgfAorCQkJCQkJICAgIChjdHgtPnRvdGFsWzBdID4+IDYxKSk7CisKKyAgICAvKiBQcm9jZXNzIGxhc3QgYnl0ZXMuICAqLworICAgIHNoYTUxMl9wcm9jZXNzX2Jsb2NrKGN0eC0+YnVmZmVyLCBieXRlcyArIHBhZCArIDE2LCBjdHgpOworCisgICAgLyogUHV0IHJlc3VsdCBmcm9tIENUWCBpbiBmaXJzdCA2NCBieXRlcyBmb2xsb3dpbmcgUkVTQlVGLiAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCSgodWludDY0X3QgKikgcmVzYnVmKVtpXSA9IFNXQVAoY3R4LT5IW2ldKTsKKworICAgIHJldHVybiByZXNidWY7Cit9CisKK3N0YXRpYyB2b2lkCitzaGE1MTJfcHJvY2Vzc19ieXRlcyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW4sIHN0cnVjdCBzaGE1MTJfY3R4ICpjdHgpCit7CisgICAgLyogV2hlbiB3ZSBhbHJlYWR5IGhhdmUgc29tZSBiaXRzIGluIG91ciBpbnRlcm5hbCBidWZmZXIgY29uY2F0ZW5hdGUKKyAgICAgICBib3RoIGlucHV0cyBmaXJzdC4gICovCisgICAgaWYgKGN0eC0+YnVmbGVuICE9IDApIHsKKwlzaXplX3QgbGVmdF9vdmVyID0gY3R4LT5idWZsZW47CisJc2l6ZV90IGFkZCA9IDI1NiAtIGxlZnRfb3ZlciA+IGxlbiA/IGxlbiA6IDI1NiAtIGxlZnRfb3ZlcjsKKworCW1lbWNweSgmY3R4LT5idWZmZXJbbGVmdF9vdmVyXSwgYnVmZmVyLCBhZGQpOworCWN0eC0+YnVmbGVuICs9IGFkZDsKKworCWlmIChjdHgtPmJ1ZmxlbiA+IDEyOCkgeworCSAgICBzaGE1MTJfcHJvY2Vzc19ibG9jayhjdHgtPmJ1ZmZlciwgY3R4LT5idWZsZW4gJiB+MTI3LCBjdHgpOworCisJICAgIGN0eC0+YnVmbGVuICY9IDEyNzsKKwkgICAgLyogVGhlIHJlZ2lvbnMgaW4gdGhlIGZvbGxvd2luZyBjb3B5IG9wZXJhdGlvbiBjYW5ub3Qgb3ZlcmxhcC4gICovCisJICAgIG1lbWNweShjdHgtPmJ1ZmZlciwgJmN0eC0+YnVmZmVyWyhsZWZ0X292ZXIgKyBhZGQpICYgfjEyN10sCisJCSAgIGN0eC0+YnVmbGVuKTsKKwl9CisKKwlidWZmZXIgPSAoY29uc3QgY2hhciAqKWJ1ZmZlciArIGFkZDsKKwlsZW4gLT0gYWRkOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgYXZhaWxhYmxlIGNvbXBsZXRlIGJsb2Nrcy4gICovCisgICAgaWYgKGxlbiA+PSAxMjgpIHsKKyNpZiAhX1NUUklOR19BUkNIX3VuYWxpZ25lZAorLyogVG8gY2hlY2sgYWxpZ25tZW50IGdjYyBoYXMgYW4gYXBwcm9wcmlhdGUgb3BlcmF0b3IuICBPdGhlcgorICAgY29tcGlsZXJzIGRvbid0LiAgKi8KKyMgaWYgX19HTlVDX18gPj0gMgorIyAgZGVmaW5lIFVOQUxJR05FRF9QKHApICgoKHVpbnRwdHJfdCkgcCkgJSBfX2FsaWdub2ZfXyAodWludDY0X3QpICE9IDApCisjIGVsc2UKKyMgIGRlZmluZSBVTkFMSUdORURfUChwKSAoKCh1aW50cHRyX3QpIHApICUgc2l6ZW9mICh1aW50NjRfdCkgIT0gMCkKKyMgZW5kaWYKKwlpZiAoVU5BTElHTkVEX1AoYnVmZmVyKSkKKwkgICAgd2hpbGUgKGxlbiA+IDEyOCkgeworCQlzaGE1MTJfcHJvY2Vzc19ibG9jayhtZW1jcHkoY3R4LT5idWZmZXIsIGJ1ZmZlciwgMTI4KSwgMTI4LAorCQkJCSAgICAgY3R4KTsKKwkJYnVmZmVyID0gKGNvbnN0IGNoYXIgKilidWZmZXIgKyAxMjg7CisJCWxlbiAtPSAxMjg7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJICAgIHNoYTUxMl9wcm9jZXNzX2Jsb2NrKGJ1ZmZlciwgbGVuICYgfjEyNywgY3R4KTsKKwkgICAgYnVmZmVyID0gKGNvbnN0IGNoYXIgKilidWZmZXIgKyAobGVuICYgfjEyNyk7CisJICAgIGxlbiAmPSAxMjc7CisJfQorICAgIH0KKworICAgIC8qIE1vdmUgcmVtYWluaW5nIGJ5dGVzIGludG8gaW50ZXJuYWwgYnVmZmVyLiAgKi8KKyAgICBpZiAobGVuID4gMCkgeworCXNpemVfdCBsZWZ0X292ZXIgPSBjdHgtPmJ1ZmxlbjsKKworCW1lbWNweSgmY3R4LT5idWZmZXJbbGVmdF9vdmVyXSwgYnVmZmVyLCBsZW4pOworCWxlZnRfb3ZlciArPSBsZW47CisJaWYgKGxlZnRfb3ZlciA+PSAxMjgpIHsKKwkgICAgc2hhNTEyX3Byb2Nlc3NfYmxvY2soY3R4LT5idWZmZXIsIDEyOCwgY3R4KTsKKwkgICAgbGVmdF9vdmVyIC09IDEyODsKKwkgICAgbWVtY3B5KGN0eC0+YnVmZmVyLCAmY3R4LT5idWZmZXJbMTI4XSwgbGVmdF9vdmVyKTsKKwl9CisJY3R4LT5idWZsZW4gPSBsZWZ0X292ZXI7CisgICAgfQorfQorCisvKiBEZWZpbmUgb3VyIG1hZ2ljIHN0cmluZyB0byBtYXJrIHNhbHQgZm9yIFNIQTUxMiAiZW5jcnlwdGlvbiIKKyAgIHJlcGxhY2VtZW50LiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHNoYTUxMl9zYWx0X3ByZWZpeFtdID0gIiQ2JCI7CisKKy8qIFByZWZpeCBmb3Igb3B0aW9uYWwgcm91bmRzIHNwZWNpZmljYXRpb24uICAqLworc3RhdGljIGNvbnN0IGNoYXIgc2hhNTEyX3JvdW5kc19wcmVmaXhbXSA9ICJyb3VuZHM9IjsKKworLyogTWF4aW11bSBzYWx0IHN0cmluZyBsZW5ndGguICAqLworI2RlZmluZSBTQUxUX0xFTl9NQVggMTZVCisvKiBEZWZhdWx0IG51bWJlciBvZiByb3VuZHMgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgUk9VTkRTX0RFRkFVTFQgNTAwMFVMCisvKiBNaW5pbXVtIG51bWJlciBvZiByb3VuZHMuICAqLworI2RlZmluZSBST1VORFNfTUlOIDEwMDBVTAorLyogTWF4aW11bSBudW1iZXIgb2Ygcm91bmRzLiAgKi8KKyNkZWZpbmUgUk9VTkRTX01BWCA5OTk5OTk5OTlVTAorCisvKiBUYWJsZSB3aXRoIGNoYXJhY3RlcnMgZm9yIGJhc2U2NCB0cmFuc2Zvcm1hdGlvbi4gICovCitzdGF0aWMgY29uc3QgY2hhciBiNjR0WzY0XSA9CisgICAgIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCitzdGF0aWMgY2hhciAqc2hhNTEyX2NyeXB0X3IoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICpzYWx0LCBjaGFyICpidWZmZXIsCisJCQkgICAgaW50IGJ1ZmxlbikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGFsdF9yZXN1bHRbNjRdCisJX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKF9fYWxpZ25vZl9fKHVpbnQ2NF90KSkpKTsKKyAgICB1bnNpZ25lZCBjaGFyIHRlbXBfcmVzdWx0WzY0XQorCV9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyhfX2FsaWdub2ZfXyh1aW50NjRfdCkpKSk7CisgICAgc3RydWN0IHNoYTUxMl9jdHggY3R4OworICAgIHN0cnVjdCBzaGE1MTJfY3R4IGFsdF9jdHg7CisgICAgc2l6ZV90IHNhbHRfbGVuOworICAgIHNpemVfdCBrZXlfbGVuOworICAgIHNpemVfdCBjbnQ7CisgICAgY2hhciAqY3A7CisgICAgY2hhciAqY29waWVkX2tleSA9IE5VTEw7CisgICAgY2hhciAqY29waWVkX3NhbHQgPSBOVUxMOworICAgIGNoYXIgKnBfYnl0ZXM7CisgICAgY2hhciAqc19ieXRlczsKKyAgICAvKiBEZWZhdWx0IG51bWJlciBvZiByb3VuZHMuICAqLworICAgIHNpemVfdCByb3VuZHMgPSBST1VORFNfREVGQVVMVDsKKyAgICBib29sIHJvdW5kc19jdXN0b20gPSBmYWxzZTsKKworICAgIC8qIEZpbmQgYmVnaW5uaW5nIG9mIHNhbHQgc3RyaW5nLiAgVGhlIHByZWZpeCBzaG91bGQgbm9ybWFsbHkgYWx3YXlzCisgICAgICAgYmUgcHJlc2VudC4gIEp1c3QgaW4gY2FzZSBpdCBpcyBub3QuICAqLworICAgIGlmIChzdHJuY21wKHNoYTUxMl9zYWx0X3ByZWZpeCwgc2FsdCwgc2l6ZW9mKHNoYTUxMl9zYWx0X3ByZWZpeCkgLSAxKSA9PSAwKQorCS8qIFNraXAgc2FsdCBwcmVmaXguICAqLworCXNhbHQgKz0gc2l6ZW9mKHNoYTUxMl9zYWx0X3ByZWZpeCkgLSAxOworCisgICAgaWYgKHN0cm5jbXAoc2FsdCwgc2hhNTEyX3JvdW5kc19wcmVmaXgsIHNpemVvZihzaGE1MTJfcm91bmRzX3ByZWZpeCkgLSAxKQorCT09IDApIHsKKwljb25zdCBjaGFyICpudW0gPSBzYWx0ICsgc2l6ZW9mKHNoYTUxMl9yb3VuZHNfcHJlZml4KSAtIDE7CisJY2hhciAqZW5kcDsKKwl1bnNpZ25lZCBsb25nIGludCBzcm91bmRzID0gc3RydG91bChudW0sICZlbmRwLCAxMCk7CisJaWYgKCplbmRwID09ICckJykgeworCSAgICBzYWx0ID0gZW5kcCArIDE7CisJICAgIHJvdW5kcyA9IE1BWChST1VORFNfTUlOLCBNSU4oc3JvdW5kcywgUk9VTkRTX01BWCkpOworCSAgICByb3VuZHNfY3VzdG9tID0gdHJ1ZTsKKwl9CisgICAgfQorCisgICAgc2FsdF9sZW4gPSBNSU4oc3RyY3NwbihzYWx0LCAiJCIpLCBTQUxUX0xFTl9NQVgpOworICAgIGtleV9sZW4gPSBzdHJsZW4oa2V5KTsKKworICAgIGlmICgoa2V5IC0gKGNoYXIgKikwKSAlIF9fYWxpZ25vZl9fKHVpbnQ2NF90KSAhPSAwKSB7CisJY2hhciAqdG1wID0gKGNoYXIgKilhbGxvY2Eoa2V5X2xlbiArIF9fYWxpZ25vZl9fKHVpbnQ2NF90KSk7CisJa2V5ID0gY29waWVkX2tleSA9IG1lbWNweSh0bXAgKyBfX2FsaWdub2ZfXyh1aW50NjRfdCkKKwkJCQkgIC0gKHRtcCAtIChjaGFyICopMCkgJSBfX2FsaWdub2ZfXyh1aW50NjRfdCksCisJCQkJICBrZXksIGtleV9sZW4pOworICAgIH0KKworICAgIGlmICgoc2FsdCAtIChjaGFyICopMCkgJSBfX2FsaWdub2ZfXyh1aW50NjRfdCkgIT0gMCkgeworCWNoYXIgKnRtcCA9IChjaGFyICopYWxsb2NhKHNhbHRfbGVuICsgX19hbGlnbm9mX18odWludDY0X3QpKTsKKwlzYWx0ID0gY29waWVkX3NhbHQgPSBtZW1jcHkodG1wICsgX19hbGlnbm9mX18odWludDY0X3QpCisJCQkJICAgIC0gKHRtcCAtIChjaGFyICopMCkgJSBfX2FsaWdub2ZfXyh1aW50NjRfdCksCisJCQkJICAgIHNhbHQsIHNhbHRfbGVuKTsKKyAgICB9CisKKyAgICAvKiBQcmVwYXJlIGZvciB0aGUgcmVhbCB3b3JrLiAgKi8KKyAgICBzaGE1MTJfaW5pdF9jdHgoJmN0eCk7CisKKyAgICAvKiBBZGQgdGhlIGtleSBzdHJpbmcuICAqLworICAgIHNoYTUxMl9wcm9jZXNzX2J5dGVzKGtleSwga2V5X2xlbiwgJmN0eCk7CisKKyAgICAvKiBUaGUgbGFzdCBwYXJ0IGlzIHRoZSBzYWx0IHN0cmluZy4gIFRoaXMgbXVzdCBiZSBhdCBtb3N0IDgKKyAgICAgICBjaGFyYWN0ZXJzIGFuZCBpdCBlbmRzIGF0IHRoZSBmaXJzdCBgJCcgY2hhcmFjdGVyIChmb3IKKyAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zKS4gICovCisgICAgc2hhNTEyX3Byb2Nlc3NfYnl0ZXMoc2FsdCwgc2FsdF9sZW4sICZjdHgpOworCisgICAgLyogQ29tcHV0ZSBhbHRlcm5hdGUgU0hBNTEyIHN1bSB3aXRoIGlucHV0IEtFWSwgU0FMVCwgYW5kIEtFWS4gIFRoZQorICAgICAgIGZpbmFsIHJlc3VsdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBmaXJzdCBjb250ZXh0LiAgKi8KKyAgICBzaGE1MTJfaW5pdF9jdHgoJmFsdF9jdHgpOworCisgICAgLyogQWRkIGtleS4gICovCisgICAgc2hhNTEyX3Byb2Nlc3NfYnl0ZXMoa2V5LCBrZXlfbGVuLCAmYWx0X2N0eCk7CisKKyAgICAvKiBBZGQgc2FsdC4gICovCisgICAgc2hhNTEyX3Byb2Nlc3NfYnl0ZXMoc2FsdCwgc2FsdF9sZW4sICZhbHRfY3R4KTsKKworICAgIC8qIEFkZCBrZXkgYWdhaW4uICAqLworICAgIHNoYTUxMl9wcm9jZXNzX2J5dGVzKGtleSwga2V5X2xlbiwgJmFsdF9jdHgpOworCisgICAgLyogTm93IGdldCByZXN1bHQgb2YgdGhpcyAoNjQgYnl0ZXMpIGFuZCBhZGQgaXQgdG8gdGhlIG90aGVyCisgICAgICAgY29udGV4dC4gICovCisgICAgc2hhNTEyX2ZpbmlzaF9jdHgoJmFsdF9jdHgsIGFsdF9yZXN1bHQpOworCisgICAgLyogQWRkIGZvciBhbnkgY2hhcmFjdGVyIGluIHRoZSBrZXkgb25lIGJ5dGUgb2YgdGhlIGFsdGVybmF0ZSBzdW0uICAqLworICAgIGZvciAoY250ID0ga2V5X2xlbjsgY250ID4gNjQ7IGNudCAtPSA2NCkKKwlzaGE1MTJfcHJvY2Vzc19ieXRlcyhhbHRfcmVzdWx0LCA2NCwgJmN0eCk7CisgICAgc2hhNTEyX3Byb2Nlc3NfYnl0ZXMoYWx0X3Jlc3VsdCwgY250LCAmY3R4KTsKKworICAgIC8qIFRha2UgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYW5kIGZvciBldmVyeQorICAgICAgIDEgYWRkIHRoZSBhbHRlcm5hdGUgc3VtLCBmb3IgZXZlcnkgMCB0aGUga2V5LiAgKi8KKyAgICBmb3IgKGNudCA9IGtleV9sZW47IGNudCA+IDA7IGNudCA+Pj0gMSkKKwlpZiAoKGNudCAmIDEpICE9IDApCisJICAgIHNoYTUxMl9wcm9jZXNzX2J5dGVzKGFsdF9yZXN1bHQsIDY0LCAmY3R4KTsKKwllbHNlCisJICAgIHNoYTUxMl9wcm9jZXNzX2J5dGVzKGtleSwga2V5X2xlbiwgJmN0eCk7CisKKyAgICAvKiBDcmVhdGUgaW50ZXJtZWRpYXRlIHJlc3VsdC4gICovCisgICAgc2hhNTEyX2ZpbmlzaF9jdHgoJmN0eCwgYWx0X3Jlc3VsdCk7CisKKyAgICAvKiBTdGFydCBjb21wdXRhdGlvbiBvZiBQIGJ5dGUgc2VxdWVuY2UuICAqLworICAgIHNoYTUxMl9pbml0X2N0eCgmYWx0X2N0eCk7CisKKyAgICAvKiBGb3IgZXZlcnkgY2hhcmFjdGVyIGluIHRoZSBwYXNzd29yZCBhZGQgdGhlIGVudGlyZSBwYXNzd29yZC4gICovCisgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBrZXlfbGVuOyArK2NudCkKKwlzaGE1MTJfcHJvY2Vzc19ieXRlcyhrZXksIGtleV9sZW4sICZhbHRfY3R4KTsKKworICAgIC8qIEZpbmlzaCB0aGUgZGlnZXN0LiAgKi8KKyAgICBzaGE1MTJfZmluaXNoX2N0eCgmYWx0X2N0eCwgdGVtcF9yZXN1bHQpOworCisgICAgLyogQ3JlYXRlIGJ5dGUgc2VxdWVuY2UgUC4gICovCisgICAgY3AgPSBwX2J5dGVzID0gYWxsb2NhKGtleV9sZW4pOworICAgIGZvciAoY250ID0ga2V5X2xlbjsgY250ID49IDY0OyBjbnQgLT0gNjQpCisJY3AgPSBtZW1wY3B5KGNwLCB0ZW1wX3Jlc3VsdCwgNjQpOworICAgIG1lbWNweShjcCwgdGVtcF9yZXN1bHQsIGNudCk7CisKKyAgICAvKiBTdGFydCBjb21wdXRhdGlvbiBvZiBTIGJ5dGUgc2VxdWVuY2UuICAqLworICAgIHNoYTUxMl9pbml0X2N0eCgmYWx0X2N0eCk7CisKKyAgICAvKiBGb3IgZXZlcnkgY2hhcmFjdGVyIGluIHRoZSBwYXNzd29yZCBhZGQgdGhlIGVudGlyZSBwYXNzd29yZC4gICovCisgICAgZm9yIChjbnQgPSAwOyBjbnQgPCAoc2l6ZV90KTE2ICsgYWx0X3Jlc3VsdFswXTsgKytjbnQpCisJc2hhNTEyX3Byb2Nlc3NfYnl0ZXMoc2FsdCwgc2FsdF9sZW4sICZhbHRfY3R4KTsKKworICAgIC8qIEZpbmlzaCB0aGUgZGlnZXN0LiAgKi8KKyAgICBzaGE1MTJfZmluaXNoX2N0eCgmYWx0X2N0eCwgdGVtcF9yZXN1bHQpOworCisgICAgLyogQ3JlYXRlIGJ5dGUgc2VxdWVuY2UgUy4gICovCisgICAgY3AgPSBzX2J5dGVzID0gYWxsb2NhKHNhbHRfbGVuKTsKKyAgICBmb3IgKGNudCA9IHNhbHRfbGVuOyBjbnQgPj0gNjQ7IGNudCAtPSA2NCkKKwljcCA9IG1lbXBjcHkoY3AsIHRlbXBfcmVzdWx0LCA2NCk7CisgICAgbWVtY3B5KGNwLCB0ZW1wX3Jlc3VsdCwgY250KTsKKworICAgIC8qIFJlcGVhdGVkbHkgcnVuIHRoZSBjb2xsZWN0ZWQgaGFzaCB2YWx1ZSB0aHJvdWdoIFNIQTUxMiB0byBidXJuCisgICAgICAgQ1BVIGN5Y2xlcy4gICovCisgICAgZm9yIChjbnQgPSAwOyBjbnQgPCByb3VuZHM7ICsrY250KSB7CisJLyogTmV3IGNvbnRleHQuICAqLworCXNoYTUxMl9pbml0X2N0eCgmY3R4KTsKKworCS8qIEFkZCBrZXkgb3IgbGFzdCByZXN1bHQuICAqLworCWlmICgoY250ICYgMSkgIT0gMCkKKwkgICAgc2hhNTEyX3Byb2Nlc3NfYnl0ZXMocF9ieXRlcywga2V5X2xlbiwgJmN0eCk7CisJZWxzZQorCSAgICBzaGE1MTJfcHJvY2Vzc19ieXRlcyhhbHRfcmVzdWx0LCA2NCwgJmN0eCk7CisKKwkvKiBBZGQgc2FsdCBmb3IgbnVtYmVycyBub3QgZGl2aXNpYmxlIGJ5IDMuICAqLworCWlmIChjbnQgJSAzICE9IDApCisJICAgIHNoYTUxMl9wcm9jZXNzX2J5dGVzKHNfYnl0ZXMsIHNhbHRfbGVuLCAmY3R4KTsKKworCS8qIEFkZCBrZXkgZm9yIG51bWJlcnMgbm90IGRpdmlzaWJsZSBieSA3LiAgKi8KKwlpZiAoY250ICUgNyAhPSAwKQorCSAgICBzaGE1MTJfcHJvY2Vzc19ieXRlcyhwX2J5dGVzLCBrZXlfbGVuLCAmY3R4KTsKKworCS8qIEFkZCBrZXkgb3IgbGFzdCByZXN1bHQuICAqLworCWlmICgoY250ICYgMSkgIT0gMCkKKwkgICAgc2hhNTEyX3Byb2Nlc3NfYnl0ZXMoYWx0X3Jlc3VsdCwgNjQsICZjdHgpOworCWVsc2UKKwkgICAgc2hhNTEyX3Byb2Nlc3NfYnl0ZXMocF9ieXRlcywga2V5X2xlbiwgJmN0eCk7CisKKwkvKiBDcmVhdGUgaW50ZXJtZWRpYXRlIHJlc3VsdC4gICovCisJc2hhNTEyX2ZpbmlzaF9jdHgoJmN0eCwgYWx0X3Jlc3VsdCk7CisgICAgfQorCisgICAgLyogTm93IHdlIGNhbiBjb25zdHJ1Y3QgdGhlIHJlc3VsdCBzdHJpbmcuICBJdCBjb25zaXN0cyBvZiB0aHJlZQorICAgICAgIHBhcnRzLiAgKi8KKyAgICBjcCA9IHN0cG5jcHkoYnVmZmVyLCBzaGE1MTJfc2FsdF9wcmVmaXgsIE1BWCgwLCBidWZsZW4pKTsKKyAgICBidWZsZW4gLT0gc2l6ZW9mKHNoYTUxMl9zYWx0X3ByZWZpeCkgLSAxOworCisgICAgaWYgKHJvdW5kc19jdXN0b20pIHsKKwlpbnQgbiA9IHNucHJpbnRmKGNwLCBNQVgoMCwgYnVmbGVuKSwgIiVzJXp1JCIsCisJCQkgc2hhNTEyX3JvdW5kc19wcmVmaXgsIHJvdW5kcyk7CisJY3AgKz0gbjsKKwlidWZsZW4gLT0gbjsKKyAgICB9CisKKyAgICBjcCA9IHN0cG5jcHkoY3AsIHNhbHQsIE1JTigoc2l6ZV90KSBNQVgoMCwgYnVmbGVuKSwgc2FsdF9sZW4pKTsKKyAgICBidWZsZW4gLT0gTUlOKChzaXplX3QpIE1BWCgwLCBidWZsZW4pLCBzYWx0X2xlbik7CisKKyAgICBpZiAoYnVmbGVuID4gMCkgeworCSpjcCsrID0gJyQnOworCS0tYnVmbGVuOworICAgIH0KKyNkZWZpbmUgYjY0X2Zyb21fMjRiaXQoQjIsIEIxLCBCMCwgTikJCQkJCSAgICAgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICB1bnNpZ25lZCBpbnQgdyA9ICgoQjIpIDw8IDE2KSB8ICgoQjEpIDw8IDgpIHwgKEIwKTsJCQkgICAgICBcCisgICAgaW50IG4gPSAoTik7CQkJCQkJCSAgICAgIFwKKyAgICB3aGlsZSAobi0tID4gMCAmJiBidWZsZW4gPiAwKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwkqY3ArKyA9IGI2NHRbdyAmIDB4M2ZdOwkJCQkJCSAgICAgIFwKKwktLWJ1ZmxlbjsJCQkJCQkJICAgICAgXAorCXcgPj49IDY7CQkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyAgICBiNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzBdLCBhbHRfcmVzdWx0WzIxXSwgYWx0X3Jlc3VsdFs0Ml0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMjJdLCBhbHRfcmVzdWx0WzQzXSwgYWx0X3Jlc3VsdFsxXSwgNCk7CisgICAgYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs0NF0sIGFsdF9yZXN1bHRbMl0sIGFsdF9yZXN1bHRbMjNdLCA0KTsKKyAgICBiNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzNdLCBhbHRfcmVzdWx0WzI0XSwgYWx0X3Jlc3VsdFs0NV0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMjVdLCBhbHRfcmVzdWx0WzQ2XSwgYWx0X3Jlc3VsdFs0XSwgNCk7CisgICAgYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs0N10sIGFsdF9yZXN1bHRbNV0sIGFsdF9yZXN1bHRbMjZdLCA0KTsKKyAgICBiNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzZdLCBhbHRfcmVzdWx0WzI3XSwgYWx0X3Jlc3VsdFs0OF0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMjhdLCBhbHRfcmVzdWx0WzQ5XSwgYWx0X3Jlc3VsdFs3XSwgNCk7CisgICAgYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs1MF0sIGFsdF9yZXN1bHRbOF0sIGFsdF9yZXN1bHRbMjldLCA0KTsKKyAgICBiNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzldLCBhbHRfcmVzdWx0WzMwXSwgYWx0X3Jlc3VsdFs1MV0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMzFdLCBhbHRfcmVzdWx0WzUyXSwgYWx0X3Jlc3VsdFsxMF0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNTNdLCBhbHRfcmVzdWx0WzExXSwgYWx0X3Jlc3VsdFszMl0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMTJdLCBhbHRfcmVzdWx0WzMzXSwgYWx0X3Jlc3VsdFs1NF0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMzRdLCBhbHRfcmVzdWx0WzU1XSwgYWx0X3Jlc3VsdFsxM10sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNTZdLCBhbHRfcmVzdWx0WzE0XSwgYWx0X3Jlc3VsdFszNV0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMTVdLCBhbHRfcmVzdWx0WzM2XSwgYWx0X3Jlc3VsdFs1N10sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMzddLCBhbHRfcmVzdWx0WzU4XSwgYWx0X3Jlc3VsdFsxNl0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNTldLCBhbHRfcmVzdWx0WzE3XSwgYWx0X3Jlc3VsdFszOF0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbMThdLCBhbHRfcmVzdWx0WzM5XSwgYWx0X3Jlc3VsdFs2MF0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNDBdLCBhbHRfcmVzdWx0WzYxXSwgYWx0X3Jlc3VsdFsxOV0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNjJdLCBhbHRfcmVzdWx0WzIwXSwgYWx0X3Jlc3VsdFs0MV0sIDQpOworICAgIGI2NF9mcm9tXzI0Yml0KDAsIDAsIGFsdF9yZXN1bHRbNjNdLCAyKTsKKworICAgIGlmIChidWZsZW4gPD0gMCkgeworCWVycm5vID0gRVJBTkdFOworCWJ1ZmZlciA9IE5VTEw7CisgICAgfSBlbHNlCisJKmNwID0gJ1wwJzsJCS8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nLiAgKi8KKworICAgIC8qIENsZWFyIHRoZSBidWZmZXIgZm9yIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0IHNvIHRoYXQgcGVvcGxlCisgICAgICAgYXR0YWNoaW5nIHRvIHByb2Nlc3NlcyBvciByZWFkaW5nIGNvcmUgZHVtcHMgY2Fubm90IGdldCBhbnkKKyAgICAgICBpbmZvcm1hdGlvbi4gIFdlIGRvIGl0IGluIHRoaXMgd2F5IHRvIGNsZWFyIGNvcnJlY3Rfd29yZHNbXQorICAgICAgIGluc2lkZSB0aGUgU0hBNTEyIGltcGxlbWVudGF0aW9uIGFzIHdlbGwuICAqLworICAgIHNoYTUxMl9pbml0X2N0eCgmY3R4KTsKKyAgICBzaGE1MTJfZmluaXNoX2N0eCgmY3R4LCBhbHRfcmVzdWx0KTsKKyAgICBtZW1zZXQodGVtcF9yZXN1bHQsICdcMCcsIHNpemVvZih0ZW1wX3Jlc3VsdCkpOworICAgIG1lbXNldChwX2J5dGVzLCAnXDAnLCBrZXlfbGVuKTsKKyAgICBtZW1zZXQoc19ieXRlcywgJ1wwJywgc2FsdF9sZW4pOworICAgIG1lbXNldCgmY3R4LCAnXDAnLCBzaXplb2YoY3R4KSk7CisgICAgbWVtc2V0KCZhbHRfY3R4LCAnXDAnLCBzaXplb2YoYWx0X2N0eCkpOworICAgIGlmIChjb3BpZWRfa2V5ICE9IE5VTEwpCisJbWVtc2V0KGNvcGllZF9rZXksICdcMCcsIGtleV9sZW4pOworICAgIGlmIChjb3BpZWRfc2FsdCAhPSBOVUxMKQorCW1lbXNldChjb3BpZWRfc2FsdCwgJ1wwJywgc2FsdF9sZW4pOworCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworLyogVGhpcyBlbnRyeSBwb2ludCBpcyBlcXVpdmFsZW50IHRvIHRoZSBgY3J5cHQnIGZ1bmN0aW9uIGluIFVuaXgKKyAgIGxpYmNzLiAgKi8KK2NoYXIgKnNoYTUxMl9jcnlwdChjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnNhbHQpCit7CisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBoYXZlIGFuIGFyYml0cmFyeSBsaW1pdCBpbiB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICBwYXNzd29yZC4gIFdlIGNhbiBjb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICByZXN1bHQgaW4gYWR2YW5jZSBhbmQgc28gd2UgY2FuIHByZXBhcmUgdGhlIGJ1ZmZlciB3ZSBwYXNzIHRvCisgICAgICAgYHNoYTUxMl9jcnlwdF9yJy4gICovCisgICAgc3RhdGljIGNoYXIgKmJ1ZmZlcjsKKyAgICBzdGF0aWMgaW50IGJ1ZmxlbjsKKyAgICBpbnQgbmVlZGVkID0gKHNpemVvZihzaGE1MTJfc2FsdF9wcmVmaXgpIC0gMQorCQkgICsgc2l6ZW9mKHNoYTUxMl9yb3VuZHNfcHJlZml4KSArIDkgKyAxCisJCSAgKyBzdHJsZW4oc2FsdCkgKyAxICsgODYgKyAxKTsKKworICAgIGlmIChidWZsZW4gPCBuZWVkZWQpIHsKKwljaGFyICpuZXdfYnVmZmVyID0gKGNoYXIgKilyZWFsbG9jKGJ1ZmZlciwgbmVlZGVkKTsKKwlpZiAobmV3X2J1ZmZlciA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKworCWJ1ZmZlciA9IG5ld19idWZmZXI7CisJYnVmbGVuID0gbmVlZGVkOworICAgIH0KKworICAgIHJldHVybiBzaGE1MTJfY3J5cHRfcihrZXksIHNhbHQsIGJ1ZmZlciwgYnVmbGVuKTsKK30KKworI2lmZGVmIFRFU1QKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmlucHV0OworICAgIGNvbnN0IGNoYXIgcmVzdWx0WzY0XTsKK30gdGVzdHNbXSA9IHsKKyAgICAvKiBUZXN0IHZlY3RvcnMgZnJvbSBGSVBTIDE4MC0yOiBhcHBlbmRpeCBDLjEuICAqLworICAgIHsKKyAgICAiYWJjIiwKKwkgICAgIlx4ZGRceGFmXHgzNVx4YTFceDkzXHg2MVx4N2FceGJhXHhjY1x4NDFceDczXHg0OVx4YWVceDIwXHg0MVx4MzEiCisJICAgICJceDEyXHhlNlx4ZmFceDRlXHg4OVx4YTlceDdlXHhhMlx4MGFceDllXHhlZVx4ZTZceDRiXHg1NVx4ZDNceDlhIgorCSAgICAiXHgyMVx4OTJceDk5XHgyYVx4MjdceDRmXHhjMVx4YThceDM2XHhiYVx4M2NceDIzXHhhM1x4ZmVceGViXHhiZCIKKwkgICAgIlx4NDVceDRkXHg0NFx4MjNceDY0XHgzY1x4ZThceDBlXHgyYVx4OWFceGM5XHg0Zlx4YTVceDRjXHhhNFx4OWYifSwKKwkvKiBUZXN0IHZlY3RvcnMgZnJvbSBGSVBTIDE4MC0yOiBhcHBlbmRpeCBDLjIuICAqLworICAgIHsKKyAgICAiYWJjZGVmZ2hiY2RlZmdoaWNkZWZnaGlqZGVmZ2hpamtlZmdoaWprbGZnaGlqa2xtZ2hpamtsbW4iCisJICAgICJoaWprbG1ub2lqa2xtbm9wamtsbW5vcHFrbG1ub3Bxcmxtbm9wcXJzbW5vcHFyc3Rub3BxcnN0dSIsCisJICAgICJceDhlXHg5NVx4OWJceDc1XHhkYVx4ZTNceDEzXHhkYVx4OGNceGY0XHhmN1x4MjhceDE0XHhmY1x4MTRceDNmIgorCSAgICAiXHg4Zlx4NzdceDc5XHhjNlx4ZWJceDlmXHg3Zlx4YTFceDcyXHg5OVx4YWVceGFkXHhiNlx4ODhceDkwXHgxOCIKKwkgICAgIlx4NTBceDFkXHgyOFx4OWVceDQ5XHgwMFx4ZjdceGU0XHgzM1x4MWJceDk5XHhkZVx4YzRceGI1XHg0M1x4M2EiCisJICAgICJceGM3XHhkM1x4MjlceGVlXHhiNlx4ZGRceDI2XHg1NFx4NWVceDk2XHhlNVx4NWJceDg3XHg0Ylx4ZTlceDA5In0sCisJLyogVGVzdCB2ZWN0b3JzIGZyb20gdGhlIE5FU1NJRSBwcm9qZWN0LiAgKi8KKyAgICB7CisgICAgIiIsICJceGNmXHg4M1x4ZTFceDM1XHg3ZVx4ZWZceGI4XHhiZFx4ZjFceDU0XHgyOFx4NTBceGQ2XHg2ZFx4ODBceDA3IgorCSAgICAiXHhkNlx4MjBceGU0XHgwNVx4MGJceDU3XHgxNVx4ZGNceDgzXHhmNFx4YTlceDIxXHhkM1x4NmNceGU5XHhjZSIKKwkgICAgIlx4NDdceGQwXHhkMVx4M2NceDVkXHg4NVx4ZjJceGIwXHhmZlx4ODNceDE4XHhkMlx4ODdceDdlXHhlY1x4MmYiCisJICAgICJceDYzXHhiOVx4MzFceGJkXHg0N1x4NDFceDdhXHg4MVx4YTVceDM4XHgzMlx4N2FceGY5XHgyN1x4ZGFceDNlIn0sCisgICAgeworICAgICJhIiwgIlx4MWZceDQwXHhmY1x4OTJceGRhXHgyNFx4MTZceDk0XHg3NVx4MDlceDc5XHhlZVx4NmNceGY1XHg4Mlx4ZjIiCisJICAgICJceGQ1XHhkN1x4ZDJceDhlXHgxOFx4MzNceDVkXHhlMFx4NWFceGJjXHg1NFx4ZDBceDU2XHgwZVx4MGZceDUzIgorCSAgICAiXHgwMlx4ODZceDBjXHg2NVx4MmJceGYwXHg4ZFx4NTZceDAyXHg1Mlx4YWFceDVlXHg3NFx4MjFceDA1XHg0NiIKKwkgICAgIlx4ZjNceDY5XHhmYlx4YmJceGNlXHg4Y1x4MTJceGNmXHhjN1x4OTVceDdiXHgyNlx4NTJceGZlXHg5YVx4NzUifSwKKyAgICB7CisgICAgIm1lc3NhZ2UgZGlnZXN0IiwKKwkgICAgIlx4MTBceDdkXHhiZlx4MzhceDlkXHg5ZVx4OWZceDcxXHhhM1x4YTlceDVmXHg2Y1x4MDVceDViXHg5Mlx4NTEiCisJICAgICJceGJjXHg1Mlx4NjhceGMyXHhiZVx4MTZceGQ2XHhjMVx4MzRceDkyXHhlYVx4NDVceGIwXHgxOVx4OWZceDMzIgorCSAgICAiXHgwOVx4ZTFceDY0XHg1NVx4YWJceDFlXHg5Nlx4MTFceDhlXHg4YVx4OTBceDVkXHg1NVx4OTdceGI3XHgyMCIKKwkgICAgIlx4MzhceGRkXHhiM1x4NzJceGE4XHg5OFx4MjZceDA0XHg2ZFx4ZTZceDY2XHg4N1x4YmJceDQyXHgwZVx4N2MifSwKKyAgICB7CisgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKwkgICAgIlx4NGRceGJmXHhmOFx4NmNceGMyXHhjYVx4MWJceGFlXHgxZVx4MTZceDQ2XHg4YVx4MDVceGNiXHg5OFx4ODEiCisJICAgICJceGM5XHg3Zlx4MTdceDUzXHhiY1x4ZTNceDYxXHg5MFx4MzRceDg5XHg4Zlx4YWFceDFhXHhhYlx4ZTRceDI5IgorCSAgICAiXHg5NVx4NWFceDFiXHhmOFx4ZWNceDQ4XHgzZFx4NzRceDIxXHhmZVx4M2NceDE2XHg0Nlx4NjFceDNhXHg1OSIKKwkgICAgIlx4ZWRceDU0XHg0MVx4ZmJceDBmXHgzMlx4MTNceDg5XHhmN1x4N2ZceDQ4XHhhOFx4NzlceGM3XHhiMVx4ZjEifSwKKyAgICB7CisgICAgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKwkgICAgIlx4MjBceDRhXHg4Zlx4YzZceGRkXHhhOFx4MmZceDBhXHgwY1x4ZWRceDdiXHhlYlx4OGVceDA4XHhhNFx4MTYiCisJICAgICJceDU3XHhjMVx4NmVceGY0XHg2OFx4YjJceDI4XHhhOFx4MjdceDliXHhlM1x4MzFceGE3XHgwM1x4YzNceDM1IgorCSAgICAiXHg5Nlx4ZmRceDE1XHhjMVx4M2JceDFiXHgwN1x4ZjlceGFhXHgxZFx4M2JceGVhXHg1N1x4NzhceDljXHhhMCIKKwkgICAgIlx4MzFceGFkXHg4NVx4YzdceGE3XHgxZFx4ZDdceDAzXHg1NFx4ZWNceDYzXHgxMlx4MzhceGNhXHgzNFx4NDUifSwKKyAgICB7CisgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiwKKwkgICAgIlx4MWVceDA3XHhiZVx4MjNceGMyXHg2YVx4ODZceGVhXHgzN1x4ZWFceDgxXHgwY1x4OGVceGM3XHg4MFx4OTMiCisJICAgICJceDUyXHg1MVx4NWFceDk3XHgwZVx4OTJceDUzXHhjMlx4NmZceDUzXHg2Y1x4ZmNceDdhXHg5OVx4OTZceGM0IgorCSAgICAiXHg1Y1x4ODNceDcwXHg1OFx4M2VceDBhXHg3OFx4ZmFceDRhXHg5MFx4MDRceDFkXHg3MVx4YTRceGNlXHhhYiIKKwkgICAgIlx4NzRceDIzXHhmMVx4OWNceDcxXHhiOVx4ZDVceGEzXHhlMFx4MTJceDQ5XHhmMFx4YmVceGJkXHg1OFx4OTQifSwKKyAgICB7CisgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKKwkgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKKwkgICAgIlx4NzJceGVjXHgxZVx4ZjFceDEyXHg0YVx4NDVceGIwXHg0N1x4ZThceGI3XHhjN1x4NWFceDkzXHgyMVx4OTUiCisJICAgICJceDEzXHg1Ylx4YjZceDFkXHhlMlx4NGVceGMwXHhkMVx4OTFceDQwXHg0Mlx4MjRceDZlXHgwYVx4ZWNceDNhIgorCSAgICAiXHgyM1x4NTRceGUwXHg5M1x4ZDdceDZmXHgzMFx4NDhceGI0XHg1Nlx4NzZceDQzXHg0Nlx4OTBceDBjXHhiMSIKKwkgICAgIlx4MzBceGQyXHhhNFx4ZmRceDVkXHhkMVx4NmFceGJiXHg1ZVx4MzBceGJjXHhiOFx4NTBceGRlXHhlOFx4NDMifQorfTsKKworI2RlZmluZSBudGVzdHMgKHNpemVvZiAodGVzdHMpIC8gc2l6ZW9mICh0ZXN0c1swXSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKnNhbHQ7CisgICAgY29uc3QgY2hhciAqaW5wdXQ7CisgICAgY29uc3QgY2hhciAqZXhwZWN0ZWQ7Cit9IHRlc3RzMltdID0geworICAgIHsKKyAgICAiJDYkc2FsdHN0cmluZyIsICJIZWxsbyB3b3JsZCEiLAorCSAgICAiJDYkc2FsdHN0cmluZyRzdm44VW9TVmFwTnRNdXExdWtLUzR0UFFkOGlLd1NNSFdqbC9PODE3RzN1Qm5JRk5qblFKdSIKKwkgICAgImVzSTY4dTRPVExpQkZkY2JZRWRGQ29FT2ZhUzM1aW56MSJ9LCB7CisgICAgIiQ2JHJvdW5kcz0xMDAwMCRzYWx0c3RyaW5nc2FsdHN0cmluZyIsICJIZWxsbyB3b3JsZCEiLAorCSAgICAiJDYkcm91bmRzPTEwMDAwJHNhbHRzdHJpbmdzYWx0c3QkT1cxL082QllIVjZCY1hadThRVmVYYkRXcmEzT2VxaDBzYiIKKwkgICAgIkhiYk1DVk5TbkNNL1Vyam1NMERwOHZPdVplSEJ5L1lUQm1TSzZIOXFzL3kzUm5PYXc1di4ifSwgeworICAgICIkNiRyb3VuZHM9NTAwMCR0b29sb25nc2FsdHN0cmluZyIsICJUaGlzIGlzIGp1c3QgYSB0ZXN0IiwKKwkgICAgIiQ2JHJvdW5kcz01MDAwJHRvb2xvbmdzYWx0c3RyaW4kbFE4am9saGdWUlZoWTRiNXBaS2F5c0NMaTBRQnhHb05lS1EiCisJICAgICJ6UTNnbE1od2xsRjdvR0RaeFVoeDF5eGRZY3ovZTFKU2JxM3k2Sk14eGw4YXVka1VFbTAifSwgeworICAgICIkNiRyb3VuZHM9MTQwMCRhbm90aGVybG9uZ3NhbHRzdHJpbmciLAorCSAgICAiYSB2ZXJ5IG11Y2ggbG9uZ2VyIHRleHQgdG8gZW5jcnlwdC4gIFRoaXMgb25lIGV2ZW4gc3RyZXRjaGVzIG92ZXIgbW9yZSIKKwkgICAgInRoYW4gb25lIGxpbmUuIiwKKwkgICAgIiQ2JHJvdW5kcz0xNDAwJGFub3RoZXJsb25nc2FsdHMkUE9mWXdURW9rOTdWV2NqeElpU09qaXlrdGkuby9wUXMud1AiCisJICAgICJ2TXhRNkZtN0k2SW9ZTjNDbUxzNjZ4OXQwb1N3YnRFVzdvN1VtSkVpRHdHcWQ4cDR1cjEifSwgeworICAgICIkNiRyb3VuZHM9Nzc3Nzckc2hvcnQiLAorCSAgICAid2UgaGF2ZSBhIHNob3J0IHNhbHQgc3RyaW5nIGJ1dCBub3QgYSBzaG9ydCBwYXNzd29yZCIsCisJICAgICIkNiRyb3VuZHM9Nzc3Nzckc2hvcnQkV3VReVcyWVIuaEJOcGpqUmhwWUQvaWZJdzA1eGRmZUV5UW9NeElYYmt2cjBnIgorCSAgICAiZ2UxYTF4M3lSVUxKNUNDYVVlT3hGbXRsY0daZWxGbDVDeHRnZmlBYzAifSwgeworICAgICIkNiRyb3VuZHM9MTIzNDU2JGFzYWx0b2YxNmNoYXJzLi4iLCAiYSBzaG9ydCBzdHJpbmciLAorCSAgICAiJDYkcm91bmRzPTEyMzQ1NiRhc2FsdG9mMTZjaGFycy4uJEJ0Q3dqcU1KR3g1aHJKaFp5d1d2dDBSTEU4dVo0b1B3YyIKKwkgICAgImVsQ2ptdzJrU1l1LkVjNnljVUxldm9CSzI1ZnMyeFhnTU5yQ3pJTVZjZ0VKQXN0SmVvbmoxIn0sIHsKKyIkNiRyb3VuZHM9MTAkcm91bmRzdG9vbG93IiwgInRoZSBtaW5pbXVtIG51bWJlciBpcyBzdGlsbCBvYnNlcnZlZCIsCisJICAgICIkNiRyb3VuZHM9MTAwMCRyb3VuZHN0b29sb3cka1VNc2JlMzA2bjIxcDlSLkZSa1czSUduLlM5TlBOMHg1MFloSDF4IgorCSAgICAiaExzUHVXR3NVU2tsWnQ1OGphVGZGNFpFUXB5VU5HYzBkcWJwQllZQmFISHJzWC4ifSx9OworI2RlZmluZSBudGVzdHMyIChzaXplb2YgKHRlc3RzMikgLyBzaXplb2YgKHRlc3RzMlswXSkpCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgc3RydWN0IHNoYTUxMl9jdHggY3R4OworICAgIGNoYXIgc3VtWzY0XTsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgY250OworCisgICAgZm9yIChjbnQgPSAwOyBjbnQgPCAoaW50KW50ZXN0czsgKytjbnQpIHsKKwlzaGE1MTJfaW5pdF9jdHgoJmN0eCk7CisJc2hhNTEyX3Byb2Nlc3NfYnl0ZXModGVzdHNbY250XS5pbnB1dCwgc3RybGVuKHRlc3RzW2NudF0uaW5wdXQpLCAmY3R4KTsKKwlzaGE1MTJfZmluaXNoX2N0eCgmY3R4LCBzdW0pOworCWlmIChtZW1jbXAodGVzdHNbY250XS5yZXN1bHQsIHN1bSwgNjQpICE9IDApIHsKKwkgICAgcHJpbnRmKCJ0ZXN0ICVkIHJ1biAlZCBmYWlsZWRcbiIsIGNudCwgMSk7CisJICAgIHJlc3VsdCA9IDE7CisJfQorCisJc2hhNTEyX2luaXRfY3R4KCZjdHgpOworCWZvciAoaW50IGkgPSAwOyB0ZXN0c1tjbnRdLmlucHV0W2ldICE9ICdcMCc7ICsraSkKKwkgICAgc2hhNTEyX3Byb2Nlc3NfYnl0ZXMoJnRlc3RzW2NudF0uaW5wdXRbaV0sIDEsICZjdHgpOworCXNoYTUxMl9maW5pc2hfY3R4KCZjdHgsIHN1bSk7CisJaWYgKG1lbWNtcCh0ZXN0c1tjbnRdLnJlc3VsdCwgc3VtLCA2NCkgIT0gMCkgeworCSAgICBwcmludGYoInRlc3QgJWQgcnVuICVkIGZhaWxlZFxuIiwgY250LCAyKTsKKwkgICAgcmVzdWx0ID0gMTsKKwl9CisgICAgfQorCisgICAgLyogVGVzdCB2ZWN0b3IgZnJvbSBGSVBTIDE4MC0yOiBhcHBlbmRpeCBDLjMuICAqLworICAgIGNoYXIgYnVmWzEwMDBdOworICAgIG1lbXNldChidWYsICdhJywgc2l6ZW9mKGJ1ZikpOworICAgIHNoYTUxMl9pbml0X2N0eCgmY3R4KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKKwlzaGE1MTJfcHJvY2Vzc19ieXRlcyhidWYsIHNpemVvZihidWYpLCAmY3R4KTsKKyAgICBzaGE1MTJfZmluaXNoX2N0eCgmY3R4LCBzdW0pOworICAgIHN0YXRpYyBjb25zdCBjaGFyIGV4cGVjdGVkWzY0XSA9CisJIlx4ZTdceDE4XHg0OFx4M2RceDBjXHhlN1x4NjlceDY0XHg0ZVx4MmVceDQyXHhjN1x4YmNceDE1XHhiNFx4NjMiCisJIlx4OGVceDFmXHg5OFx4YjFceDNiXHgyMFx4NDRceDI4XHg1Nlx4MzJceGE4XHgwM1x4YWZceGE5XHg3M1x4ZWIiCisJIlx4ZGVceDBmXHhmMlx4NDRceDg3XHg3ZVx4YTZceDBhXHg0Y1x4YjBceDQzXHgyY1x4ZTVceDc3XHhjM1x4MWIiCisJIlx4ZWJceDAwXHg5Y1x4NWNceDJjXHg0OVx4YWFceDJlXHg0ZVx4YWRceGIyXHgxN1x4YWRceDhjXHhjMFx4OWIiOworICAgIGlmIChtZW1jbXAoZXhwZWN0ZWQsIHN1bSwgNjQpICE9IDApIHsKKwlwcmludGYoInRlc3QgJWQgZmFpbGVkXG4iLCBjbnQpOworCXJlc3VsdCA9IDE7CisgICAgfQorCisgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBudGVzdHMyOyArK2NudCkgeworCWNoYXIgKmNwID0gc2hhNTEyX2NyeXB0KHRlc3RzMltjbnRdLmlucHV0LCB0ZXN0czJbY250XS5zYWx0KTsKKworCWlmIChzdHJjbXAoY3AsIHRlc3RzMltjbnRdLmV4cGVjdGVkKSAhPSAwKSB7CisJICAgIHByaW50ZigidGVzdCAlZDogZXhwZWN0ZWQgXCIlc1wiLCBnb3QgXCIlc1wiXG4iLAorCQkgICBjbnQsIHRlc3RzMltjbnRdLmV4cGVjdGVkLCBjcCk7CisJICAgIHJlc3VsdCA9IDE7CisJfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gMCkKKwlwdXRzKCJhbGwgdGVzdHMgT0siKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2xpYnV0aWwvdW5iYXNlNjQuYyBiL2NvbTMyL2xpYnV0aWwvdW5iYXNlNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2JmM2ZiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbGlidXRpbC91bmJhc2U2NC5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA1LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiB1bmJhc2U2NC5jCisgKgorICogQ29udmVydCBhIHN0cmluZyBpbiBiYXNlNjQgZm9ybWF0IHRvIGEgYnl0ZSBhcnJheS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YmFzZTY0Lmg+CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9iYXNlNjRjaGFyc1tdID0KKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKK3NpemVfdCB1bmJhc2U2NCh1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXosIGNvbnN0IGNoYXIgKnR4dCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgYml0cyA9IDA7CisgICAgaW50IG5iaXRzID0gMDsKKyAgICBjaGFyIGJhc2U2NHRibFsyNTZdOworICAgIGludCBpOworICAgIGNoYXIgdjsKKyAgICBzaXplX3QgbmJ5dGVzID0gMDsKKworICAgIG1lbXNldChiYXNlNjR0YmwsIC0xLCBzaXplb2YgYmFzZTY0dGJsKTsKKworICAgIGZvciAoaSA9IDA7IF9iYXNlNjRjaGFyc1tpXTsgaSsrKSB7CisJYmFzZTY0dGJsW19iYXNlNjRjaGFyc1tpXV0gPSBpOworICAgIH0KKworICAgIC8qIEFsc28gc3VwcG9ydCBmaWxlc3lzdGVtIHNhZmUgYWx0ZXJuYXRlIGJhc2U2NCBlbmNvZGluZyAqLworICAgIGJhc2U2NHRibFsnLiddID0gNjI7CisgICAgYmFzZTY0dGJsWyctJ10gPSA2MjsKKyAgICBiYXNlNjR0YmxbJ18nXSA9IDYzOworCisgICAgd2hpbGUgKCp0eHQpIHsKKwlpZiAoKHYgPSBiYXNlNjR0YmxbKHVuc2lnbmVkIGNoYXIpKnR4dF0pID49IDApIHsKKwkgICAgYml0cyA8PD0gNjsKKwkgICAgYml0cyArPSB2OworCSAgICBuYml0cyArPSA2OworCSAgICBpZiAobmJpdHMgPj0gOCkgeworCQlpZiAobmJ5dGVzIDwgYnVmc2l6KQorCQkgICAgKmJ1ZmZlcisrID0gKGJpdHMgPj4gKG5iaXRzIC0gOCkpOworCQluYnl0ZXMrKzsKKwkJbmJpdHMgLT0gODsKKwkgICAgfQorCX0KKwl0eHQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gbmJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL01ha2VmaWxlIGIvY29tMzIvbHVhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYzdkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvTWFrZWZpbGUKQEAgLTAsMCArMSwxMTQgQEAKKyMgTWFrZWZpbGUgZm9yIGluc3RhbGxpbmcgTHVhCisjIFNlZSBkb2MvcmVhZG1lLmh0bWwgZm9yIGluc3RhbGxhdGlvbiBhbmQgY3VzdG9taXphdGlvbiBpbnN0cnVjdGlvbnMuCisKKyMgPT0gQ0hBTkdFIFRIRSBTRVRUSU5HUyBCRUxPVyBUTyBTVUlUIFlPVVIgRU5WSVJPTk1FTlQgPT09PT09PT09PT09PT09PT09PT09PT0KKworIyBZb3VyIHBsYXRmb3JtLiBTZWUgUExBVFMgZm9yIHBvc3NpYmxlIHZhbHVlcy4KK1BMQVQ9IG5vbmUKKworIyBXaGVyZSB0byBpbnN0YWxsLiBUaGUgaW5zdGFsbGF0aW9uIHN0YXJ0cyBpbiB0aGUgc3JjIGFuZCBkb2MgZGlyZWN0b3JpZXMsCisjIHNvIHRha2UgY2FyZSBpZiBJTlNUQUxMX1RPUCBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aC4gU2VlIHRoZSBsb2NhbCB0YXJnZXQuCisjIFlvdSBtYXkgd2FudCB0byBtYWtlIElOU1RBTExfTE1PRCBhbmQgSU5TVEFMTF9DTU9EIGNvbnNpc3RlbnQgd2l0aAorIyBMVUFfUk9PVCwgTFVBX0xESVIsIGFuZCBMVUFfQ0RJUiBpbiBsdWFjb25mLmguCitJTlNUQUxMX1RPUD0gL3Vzci9sb2NhbAorSU5TVEFMTF9CSU49ICQoSU5TVEFMTF9UT1ApL2JpbgorSU5TVEFMTF9JTkM9ICQoSU5TVEFMTF9UT1ApL2luY2x1ZGUKK0lOU1RBTExfTElCPSAkKElOU1RBTExfVE9QKS9saWIKK0lOU1RBTExfTUFOPSAkKElOU1RBTExfVE9QKS9tYW4vbWFuMQorSU5TVEFMTF9MTU9EPSAkKElOU1RBTExfVE9QKS9zaGFyZS9sdWEvJFYKK0lOU1RBTExfQ01PRD0gJChJTlNUQUxMX1RPUCkvbGliL2x1YS8kVgorCisjIEhvdyB0byBpbnN0YWxsLiBJZiB5b3VyIGluc3RhbGwgcHJvZ3JhbSBkb2VzIG5vdCBzdXBwb3J0ICItcCIsIHRoZW4KKyMgeW91IG1heSBoYXZlIHRvIHJ1biByYW5saWIgb24gdGhlIGluc3RhbGxlZCBsaWJsdWEuYS4KK0lOU1RBTEw9IGluc3RhbGwgLXAKK0lOU1RBTExfRVhFQz0gJChJTlNUQUxMKSAtbSAwNzU1CitJTlNUQUxMX0RBVEE9ICQoSU5TVEFMTCkgLW0gMDY0NAorIworIyBJZiB5b3UgZG9uJ3QgaGF2ZSAiaW5zdGFsbCIgeW91IGNhbiB1c2UgImNwIiBpbnN0ZWFkLgorIyBJTlNUQUxMPSBjcCAtcAorIyBJTlNUQUxMX0VYRUM9ICQoSU5TVEFMTCkKKyMgSU5TVEFMTF9EQVRBPSAkKElOU1RBTEwpCisKKyMgT3RoZXIgdXRpbGl0aWVzLgorTUtESVI9IG1rZGlyIC1wCitSTT0gcm0gLWYKKworIyA9PSBFTkQgT0YgVVNFUiBTRVRUSU5HUyAtLSBOTyBORUVEIFRPIENIQU5HRSBBTllUSElORyBCRUxPVyBUSElTIExJTkUgPT09PT09PQorCisjIENvbnZlbmllbmNlIHBsYXRmb3JtcyB0YXJnZXRzLgorUExBVFM9IGFpeCBhbnNpIGJzZCBmcmVlYnNkIGdlbmVyaWMgbGludXggbWFjb3N4IG1pbmd3IHBvc2l4IHNvbGFyaXMKKworIyBXaGF0IHRvIGluc3RhbGwuCitUT19CSU49IGx1YSBsdWFjCitUT19JTkM9IGx1YS5oIGx1YWNvbmYuaCBsdWFsaWIuaCBsYXV4bGliLmggbHVhLmhwcAorVE9fTElCPSBsaWJsdWEuYQorVE9fTUFOPSBsdWEuMSBsdWFjLjEKKworIyBMdWEgdmVyc2lvbiBhbmQgcmVsZWFzZS4KK1Y9IDUuMgorUj0gJFYuMworCisjIFRhcmdldHMgc3RhcnQgaGVyZS4KK2FsbDoJJChQTEFUKQorCiskKFBMQVRTKSBjbGVhbjoKKwljZCBzcmMgJiYgJChNQUtFKSAkQAorCit0ZXN0OglkdW1teQorCXNyYy9sdWEgLXYKKworaW5zdGFsbDogZHVtbXkKKwljZCBzcmMgJiYgJChNS0RJUikgJChJTlNUQUxMX0JJTikgJChJTlNUQUxMX0lOQykgJChJTlNUQUxMX0xJQikgJChJTlNUQUxMX01BTikgJChJTlNUQUxMX0xNT0QpICQoSU5TVEFMTF9DTU9EKQorCWNkIHNyYyAmJiAkKElOU1RBTExfRVhFQykgJChUT19CSU4pICQoSU5TVEFMTF9CSU4pCisJY2Qgc3JjICYmICQoSU5TVEFMTF9EQVRBKSAkKFRPX0lOQykgJChJTlNUQUxMX0lOQykKKwljZCBzcmMgJiYgJChJTlNUQUxMX0RBVEEpICQoVE9fTElCKSAkKElOU1RBTExfTElCKQorCWNkIGRvYyAmJiAkKElOU1RBTExfREFUQSkgJChUT19NQU4pICQoSU5TVEFMTF9NQU4pCisKK3VuaW5zdGFsbDoKKwljZCBzcmMgJiYgY2QgJChJTlNUQUxMX0JJTikgJiYgJChSTSkgJChUT19CSU4pCisJY2Qgc3JjICYmIGNkICQoSU5TVEFMTF9JTkMpICYmICQoUk0pICQoVE9fSU5DKQorCWNkIHNyYyAmJiBjZCAkKElOU1RBTExfTElCKSAmJiAkKFJNKSAkKFRPX0xJQikKKwljZCBkb2MgJiYgY2QgJChJTlNUQUxMX01BTikgJiYgJChSTSkgJChUT19NQU4pCisKK2xvY2FsOgorCSQoTUFLRSkgaW5zdGFsbCBJTlNUQUxMX1RPUD0uLi9pbnN0YWxsCisKK25vbmU6CisJQGVjaG8gIlBsZWFzZSBkbyAnbWFrZSBQTEFURk9STScgd2hlcmUgUExBVEZPUk0gaXMgb25lIG9mIHRoZXNlOiIKKwlAZWNobyAiICAgJChQTEFUUykiCisJQGVjaG8gIlNlZSBkb2MvcmVhZG1lLmh0bWwgZm9yIGNvbXBsZXRlIGluc3RydWN0aW9ucy4iCisKKyMgbWFrZSBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggdGVzdC8gYW5kIGluc3RhbGwvCitkdW1teToKKworIyBlY2hvIGNvbmZpZyBwYXJhbWV0ZXJzCitlY2hvOgorCUBjZCBzcmMgJiYgJChNQUtFKSAtcyBlY2hvCisJQGVjaG8gIlBMQVQ9ICQoUExBVCkiCisJQGVjaG8gIlY9ICRWIgorCUBlY2hvICJSPSAkUiIKKwlAZWNobyAiVE9fQklOPSAkKFRPX0JJTikiCisJQGVjaG8gIlRPX0lOQz0gJChUT19JTkMpIgorCUBlY2hvICJUT19MSUI9ICQoVE9fTElCKSIKKwlAZWNobyAiVE9fTUFOPSAkKFRPX01BTikiCisJQGVjaG8gIklOU1RBTExfVE9QPSAkKElOU1RBTExfVE9QKSIKKwlAZWNobyAiSU5TVEFMTF9CSU49ICQoSU5TVEFMTF9CSU4pIgorCUBlY2hvICJJTlNUQUxMX0lOQz0gJChJTlNUQUxMX0lOQykiCisJQGVjaG8gIklOU1RBTExfTElCPSAkKElOU1RBTExfTElCKSIKKwlAZWNobyAiSU5TVEFMTF9NQU49ICQoSU5TVEFMTF9NQU4pIgorCUBlY2hvICJJTlNUQUxMX0xNT0Q9ICQoSU5TVEFMTF9MTU9EKSIKKwlAZWNobyAiSU5TVEFMTF9DTU9EPSAkKElOU1RBTExfQ01PRCkiCisJQGVjaG8gIklOU1RBTExfRVhFQz0gJChJTlNUQUxMX0VYRUMpIgorCUBlY2hvICJJTlNUQUxMX0RBVEE9ICQoSU5TVEFMTF9EQVRBKSIKKworIyBlY2hvIHBrZy1jb25maWcgZGF0YQorcGM6CisJQGVjaG8gInZlcnNpb249JFIiCisJQGVjaG8gInByZWZpeD0kKElOU1RBTExfVE9QKSIKKwlAZWNobyAibGliZGlyPSQoSU5TVEFMTF9MSUIpIgorCUBlY2hvICJpbmNsdWRlZGlyPSQoSU5TVEFMTF9JTkMpIgorCisjIGxpc3QgdGFyZ2V0cyB0aGF0IGRvIG5vdCBjcmVhdGUgZmlsZXMgKGJ1dCBub3QgYWxsIG1ha2VzIHVuZGVyc3RhbmQgLlBIT05ZKQorLlBIT05ZOiBhbGwgJChQTEFUUykgY2xlYW4gdGVzdCBpbnN0YWxsIGxvY2FsIG5vbmUgZHVtbXkgZWNobyBwZWNobyBsZWNobworCisjIChlbmQgb2YgTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvUkVBRE1FIGIvY29tMzIvbHVhL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTAzM2FkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL1JFQURNRQpAQCAtMCwwICsxLDYgQEAKKworVGhpcyBpcyBMdWEgNS4yLjMsIHJlbGVhc2VkIG9uIDExIE5vdiAyMDEzLgorCitGb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucywgbGljZW5zZSBkZXRhaWxzLCBhbmQKK2Z1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgTHVhLCBzZWUgZG9jL3JlYWRtZS5odG1sLgorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvZG9jL2NvbnRlbnRzLmh0bWwgYi9jb20zMi9sdWEvZG9jL2NvbnRlbnRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlMjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9kb2MvY29udGVudHMuaHRtbApAQCAtMCwwICsxLDUzMyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkx1YSA1LjIgUmVmZXJlbmNlIE1hbnVhbCAtIGNvbnRlbnRzPC9USVRMRT4KKzxMSU5LIFJFTD0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Imx1YS5jc3MiPgorPE1FVEEgSFRUUC1FUVVJVj0iY29udGVudC10eXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0idGV4dC9jc3MiPgordWwgeworCWxpc3Qtc3R5bGUtdHlwZTogbm9uZSA7CisJbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZSA7Cit9Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWT4KKworPEhSPgorPEgxPgorPEEgSFJFRj0iaHR0cDovL3d3dy5sdWEub3JnLyI+PElNRyBTUkM9ImxvZ28uZ2lmIiBBTFQ9IiIgQk9SREVSPTA+PC9BPgorTHVhIDUuMiBSZWZlcmVuY2UgTWFudWFsCis8L0gxPgorCis8UD4KK1RoZSByZWZlcmVuY2UgbWFudWFsIGlzIHRoZSBvZmZpY2lhbCBkZWZpbml0aW9uIG9mIHRoZSBMdWEgbGFuZ3VhZ2UuCitGb3IgYSBjb21wbGV0ZSBpbnRyb2R1Y3Rpb24gdG8gTHVhIHByb2dyYW1taW5nLCBzZWUgdGhlIGJvb2sKKzxBIEhSRUY9Imh0dHA6Ly93d3cubHVhLm9yZy9waWwvIj5Qcm9ncmFtbWluZyBpbiBMdWE8L0E+LgorCis8UD4KKzxBIEhSRUY9Im1hbnVhbC5odG1sIj5zdGFydDwvQT4KKyZtaWRkb3Q7Cis8QSBIUkVGPSIjY29udGVudHMiPmNvbnRlbnRzPC9BPgorJm1pZGRvdDsKKzxBIEhSRUY9IiNpbmRleCI+aW5kZXg8L0E+Cis8SFI+Cis8U01BTEw+CitDb3B5cmlnaHQgJmNvcHk7IDIwMTEmbmRhc2g7MjAxMyBMdWEub3JnLCBQVUMtUmlvLgorRnJlZWx5IGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCis8QSBIUkVGPSJodHRwOi8vd3d3Lmx1YS5vcmcvbGljZW5zZS5odG1sIj5MdWEgbGljZW5zZTwvQT4uCis8L1NNQUxMPgorCis8SDI+PEEgTkFNRT0iY29udGVudHMiPkNvbnRlbnRzPC9BPjwvSDI+Cis8VUwgc3R5bGU9InBhZGRpbmc6IDAiPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIj4xICZuZGFzaDsgSW50cm9kdWN0aW9uPC9BPgorPFA+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMiI+MiAmbmRhc2g7IEJhc2ljIENvbmNlcHRzPC9BPgorPFVMPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuMSI+Mi4xICZuZGFzaDsgVmFsdWVzIGFuZCBUeXBlczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjIiPjIuMiAmbmRhc2g7IEVudmlyb25tZW50cyBhbmQgdGhlIEdsb2JhbCBFbnZpcm9ubWVudDwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjMiPjIuMyAmbmRhc2g7IEVycm9yIEhhbmRsaW5nPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuNCI+Mi40ICZuZGFzaDsgTWV0YXRhYmxlcyBhbmQgTWV0YW1ldGhvZHM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi41Ij4yLjUgJm5kYXNoOyBHYXJiYWdlIENvbGxlY3Rpb248L0E+Cis8VUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMi41LjEiPjIuNS4xICZuZGFzaDsgR2FyYmFnZS1Db2xsZWN0aW9uIE1ldGFtZXRob2RzPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzIuNS4yIj4yLjUuMiAmbmRhc2g7IFdlYWsgVGFibGVzPC9BPgorPC9VTD4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMyLjYiPjIuNiAmbmRhc2g7IENvcm91dGluZXM8L0E+Cis8L1VMPgorPFA+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMyI+MyAmbmRhc2g7IFRoZSBMYW5ndWFnZTwvQT4KKzxVTD4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjEiPjMuMSAmbmRhc2g7IExleGljYWwgQ29udmVudGlvbnM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy4yIj4zLjIgJm5kYXNoOyBWYXJpYWJsZXM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy4zIj4zLjMgJm5kYXNoOyBTdGF0ZW1lbnRzPC9BPgorPFVMPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzMuMy4xIj4zLjMuMSAmbmRhc2g7IEJsb2NrczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjMuMiI+My4zLjIgJm5kYXNoOyBDaHVua3M8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy4zLjMiPjMuMy4zICZuZGFzaDsgQXNzaWdubWVudDwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjMuNCI+My4zLjQgJm5kYXNoOyBDb250cm9sIFN0cnVjdHVyZXM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy4zLjUiPjMuMy41ICZuZGFzaDsgRm9yIFN0YXRlbWVudDwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjMuNiI+My4zLjYgJm5kYXNoOyBGdW5jdGlvbiBDYWxscyBhcyBTdGF0ZW1lbnRzPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzMuMy43Ij4zLjMuNyAmbmRhc2g7IExvY2FsIERlY2xhcmF0aW9uczwvQT4KKzwvVUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy40Ij4zLjQgJm5kYXNoOyBFeHByZXNzaW9uczwvQT4KKzxVTD4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjQuMSI+My40LjEgJm5kYXNoOyBBcml0aG1ldGljIE9wZXJhdG9yczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjQuMiI+My40LjIgJm5kYXNoOyBDb2VyY2lvbjwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjQuMyI+My40LjMgJm5kYXNoOyBSZWxhdGlvbmFsIE9wZXJhdG9yczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjQuNCI+My40LjQgJm5kYXNoOyBMb2dpY2FsIE9wZXJhdG9yczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjQuNSI+My40LjUgJm5kYXNoOyBDb25jYXRlbmF0aW9uPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzMuNC42Ij4zLjQuNiAmbmRhc2g7IFRoZSBMZW5ndGggT3BlcmF0b3I8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy40LjciPjMuNC43ICZuZGFzaDsgUHJlY2VkZW5jZTwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCMzLjQuOCI+My40LjggJm5kYXNoOyBUYWJsZSBDb25zdHJ1Y3RvcnM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy40LjkiPjMuNC45ICZuZGFzaDsgRnVuY3Rpb24gQ2FsbHM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy40LjEwIj4zLjQuMTAgJm5kYXNoOyBGdW5jdGlvbiBEZWZpbml0aW9uczwvQT4KKzwvVUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjMy41Ij4zLjUgJm5kYXNoOyBWaXNpYmlsaXR5IFJ1bGVzPC9BPgorPC9VTD4KKzxQPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzQiPjQgJm5kYXNoOyBUaGUgQXBwbGljYXRpb24gUHJvZ3JhbSBJbnRlcmZhY2U8L0E+Cis8VUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNC4xIj40LjEgJm5kYXNoOyBUaGUgU3RhY2s8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNC4yIj40LjIgJm5kYXNoOyBTdGFjayBTaXplPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzQuMyI+NC4zICZuZGFzaDsgVmFsaWQgYW5kIEFjY2VwdGFibGUgSW5kaWNlczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM0LjQiPjQuNCAmbmRhc2g7IEMgQ2xvc3VyZXM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNC41Ij40LjUgJm5kYXNoOyBSZWdpc3RyeTwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM0LjYiPjQuNiAmbmRhc2g7IEVycm9yIEhhbmRsaW5nIGluIEM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNC43Ij40LjcgJm5kYXNoOyBIYW5kbGluZyBZaWVsZHMgaW4gQzwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM0LjgiPjQuOCAmbmRhc2g7IEZ1bmN0aW9ucyBhbmQgVHlwZXM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNC45Ij40LjkgJm5kYXNoOyBUaGUgRGVidWcgSW50ZXJmYWNlPC9BPgorPC9VTD4KKzxQPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzUiPjUgJm5kYXNoOyBUaGUgQXV4aWxpYXJ5IExpYnJhcnk8L0E+Cis8VUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNS4xIj41LjEgJm5kYXNoOyBGdW5jdGlvbnMgYW5kIFR5cGVzPC9BPgorPC9VTD4KKzxQPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzYiPjYgJm5kYXNoOyBTdGFuZGFyZCBMaWJyYXJpZXM8L0E+Cis8VUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNi4xIj42LjEgJm5kYXNoOyBCYXNpYyBGdW5jdGlvbnM8L0E+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNi4yIj42LjIgJm5kYXNoOyBDb3JvdXRpbmUgTWFuaXB1bGF0aW9uPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzYuMyI+Ni4zICZuZGFzaDsgTW9kdWxlczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM2LjQiPjYuNCAmbmRhc2g7IFN0cmluZyBNYW5pcHVsYXRpb248L0E+Cis8VUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNi40LjEiPjYuNC4xICZuZGFzaDsgUGF0dGVybnM8L0E+Cis8L1VMPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzYuNSI+Ni41ICZuZGFzaDsgVGFibGUgTWFuaXB1bGF0aW9uPC9BPgorPExJPjxBIEhSRUY9Im1hbnVhbC5odG1sIzYuNiI+Ni42ICZuZGFzaDsgTWF0aGVtYXRpY2FsIEZ1bmN0aW9uczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM2LjciPjYuNyAmbmRhc2g7IEJpdHdpc2UgT3BlcmF0aW9uczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM2LjgiPjYuOCAmbmRhc2g7IElucHV0IGFuZCBPdXRwdXQgRmFjaWxpdGllczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM2LjkiPjYuOSAmbmRhc2g7IE9wZXJhdGluZyBTeXN0ZW0gRmFjaWxpdGllczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM2LjEwIj42LjEwICZuZGFzaDsgVGhlIERlYnVnIExpYnJhcnk8L0E+Cis8L1VMPgorPFA+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjNyI+NyAmbmRhc2g7IEx1YSBTdGFuZGFsb25lPC9BPgorPFA+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjOCI+OCAmbmRhc2g7IEluY29tcGF0aWJpbGl0aWVzIHdpdGggdGhlIFByZXZpb3VzIFZlcnNpb248L0E+Cis8VUw+Cis8TEk+PEEgSFJFRj0ibWFudWFsLmh0bWwjOC4xIj44LjEgJm5kYXNoOyBDaGFuZ2VzIGluIHRoZSBMYW5ndWFnZTwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM4LjIiPjguMiAmbmRhc2g7IENoYW5nZXMgaW4gdGhlIExpYnJhcmllczwvQT4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM4LjMiPjguMyAmbmRhc2g7IENoYW5nZXMgaW4gdGhlIEFQSTwvQT4KKzwvVUw+Cis8UD4KKzxMST48QSBIUkVGPSJtYW51YWwuaHRtbCM5Ij45ICZuZGFzaDsgVGhlIENvbXBsZXRlIFN5bnRheCBvZiBMdWE8L0E+Cis8L1VMPgorCis8SDI+PEEgTkFNRT0iaW5kZXgiPkluZGV4PC9BPjwvSDI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiPgorPFRSIFZBTElHTj0idG9wIj4KKzxURD4KKzxIMz48QSBOQU1FPSJmdW5jdGlvbnMiPkx1YSBmdW5jdGlvbnM8L0E+PC9IMz4KKzxQPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLV9HIj5fRzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtX1ZFUlNJT04iPl9WRVJTSU9OPC9BPjxCUj4KKworPFA+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtYXNzZXJ0Ij5hc3NlcnQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWNvbGxlY3RnYXJiYWdlIj5jb2xsZWN0Z2FyYmFnZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZG9maWxlIj5kb2ZpbGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWVycm9yIj5lcnJvcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZ2V0bWV0YXRhYmxlIj5nZXRtZXRhdGFibGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWlwYWlycyI+aXBhaXJzPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1sb2FkIj5sb2FkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1sb2FkZmlsZSI+bG9hZGZpbGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW5leHQiPm5leHQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXBhaXJzIj5wYWlyczwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcGNhbGwiPnBjYWxsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1wcmludCI+cHJpbnQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXJhd2VxdWFsIj5yYXdlcXVhbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcmF3Z2V0Ij5yYXdnZXQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXJhd2xlbiI+cmF3bGVuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1yYXdzZXQiPnJhd3NldDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcmVxdWlyZSI+cmVxdWlyZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc2VsZWN0Ij5zZWxlY3Q8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXNldG1ldGF0YWJsZSI+c2V0bWV0YXRhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi10b251bWJlciI+dG9udW1iZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXRvc3RyaW5nIj50b3N0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtdHlwZSI+dHlwZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYteHBjYWxsIj54cGNhbGw8L0E+PEJSPgorCis8UD4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1iaXQzMi5hcnNoaWZ0Ij5iaXQzMi5hcnNoaWZ0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1iaXQzMi5iYW5kIj5iaXQzMi5iYW5kPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1iaXQzMi5ibm90Ij5iaXQzMi5ibm90PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1iaXQzMi5ib3IiPmJpdDMyLmJvcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtYml0MzIuYnRlc3QiPmJpdDMyLmJ0ZXN0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1iaXQzMi5ieG9yIj5iaXQzMi5ieG9yPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1iaXQzMi5leHRyYWN0Ij5iaXQzMi5leHRyYWN0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1iaXQzMi5scm90YXRlIj5iaXQzMi5scm90YXRlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1iaXQzMi5sc2hpZnQiPmJpdDMyLmxzaGlmdDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtYml0MzIucmVwbGFjZSI+Yml0MzIucmVwbGFjZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtYml0MzIucnJvdGF0ZSI+Yml0MzIucnJvdGF0ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtYml0MzIucnNoaWZ0Ij5iaXQzMi5yc2hpZnQ8L0E+PEJSPgorCis8UD4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1jb3JvdXRpbmUuY3JlYXRlIj5jb3JvdXRpbmUuY3JlYXRlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1jb3JvdXRpbmUucmVzdW1lIj5jb3JvdXRpbmUucmVzdW1lPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1jb3JvdXRpbmUucnVubmluZyI+Y29yb3V0aW5lLnJ1bm5pbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWNvcm91dGluZS5zdGF0dXMiPmNvcm91dGluZS5zdGF0dXM8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWNvcm91dGluZS53cmFwIj5jb3JvdXRpbmUud3JhcDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtY29yb3V0aW5lLnlpZWxkIj5jb3JvdXRpbmUueWllbGQ8L0E+PEJSPgorCis8UD4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5kZWJ1ZyI+ZGVidWcuZGVidWc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWRlYnVnLmdldHVzZXJ2YWx1ZSI+ZGVidWcuZ2V0dXNlcnZhbHVlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5nZXRob29rIj5kZWJ1Zy5nZXRob29rPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5nZXRpbmZvIj5kZWJ1Zy5nZXRpbmZvPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5nZXRsb2NhbCI+ZGVidWcuZ2V0bG9jYWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWRlYnVnLmdldG1ldGF0YWJsZSI+ZGVidWcuZ2V0bWV0YXRhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5nZXRyZWdpc3RyeSI+ZGVidWcuZ2V0cmVnaXN0cnk8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWRlYnVnLmdldHVwdmFsdWUiPmRlYnVnLmdldHVwdmFsdWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWRlYnVnLnNldHVzZXJ2YWx1ZSI+ZGVidWcuc2V0dXNlcnZhbHVlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5zZXRob29rIj5kZWJ1Zy5zZXRob29rPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5zZXRsb2NhbCI+ZGVidWcuc2V0bG9jYWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWRlYnVnLnNldG1ldGF0YWJsZSI+ZGVidWcuc2V0bWV0YXRhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy5zZXR1cHZhbHVlIj5kZWJ1Zy5zZXR1cHZhbHVlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1kZWJ1Zy50cmFjZWJhY2siPmRlYnVnLnRyYWNlYmFjazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZGVidWcudXB2YWx1ZWlkIj5kZWJ1Zy51cHZhbHVlaWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWRlYnVnLnVwdmFsdWVqb2luIj5kZWJ1Zy51cHZhbHVlam9pbjwvQT48QlI+CisKKzxQPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWZpbGU6Y2xvc2UiPmZpbGU6Y2xvc2U8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWZpbGU6Zmx1c2giPmZpbGU6Zmx1c2g8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWZpbGU6bGluZXMiPmZpbGU6bGluZXM8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWZpbGU6cmVhZCI+ZmlsZTpyZWFkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1maWxlOnNlZWsiPmZpbGU6c2VlazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtZmlsZTpzZXR2YnVmIj5maWxlOnNldHZidWY8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWZpbGU6d3JpdGUiPmZpbGU6d3JpdGU8L0E+PEJSPgorCis8UD4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5jbG9zZSI+aW8uY2xvc2U8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWlvLmZsdXNoIj5pby5mbHVzaDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtaW8uaW5wdXQiPmlvLmlucHV0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5saW5lcyI+aW8ubGluZXM8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWlvLm9wZW4iPmlvLm9wZW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWlvLm91dHB1dCI+aW8ub3V0cHV0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5wb3BlbiI+aW8ucG9wZW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWlvLnJlYWQiPmlvLnJlYWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWlvLnN0ZGVyciI+aW8uc3RkZXJyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby5zdGRpbiI+aW8uc3RkaW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLWlvLnN0ZG91dCI+aW8uc3Rkb3V0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby50bXBmaWxlIj5pby50bXBmaWxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby50eXBlIj5pby50eXBlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1pby53cml0ZSI+aW8ud3JpdGU8L0E+PEJSPgorCis8L1REPgorPFREPgorPEgzPiZuYnNwOzwvSDM+Cis8UD4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmFicyI+bWF0aC5hYnM8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguYWNvcyI+bWF0aC5hY29zPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmFzaW4iPm1hdGguYXNpbjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5hdGFuIj5tYXRoLmF0YW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguYXRhbjIiPm1hdGguYXRhbjI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguY2VpbCI+bWF0aC5jZWlsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmNvcyI+bWF0aC5jb3M8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguY29zaCI+bWF0aC5jb3NoPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmRlZyI+bWF0aC5kZWc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguZXhwIj5tYXRoLmV4cDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5mbG9vciI+bWF0aC5mbG9vcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5mbW9kIj5tYXRoLmZtb2Q8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguZnJleHAiPm1hdGguZnJleHA8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguaHVnZSI+bWF0aC5odWdlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmxkZXhwIj5tYXRoLmxkZXhwPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLmxvZyI+bWF0aC5sb2c8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGgubWF4Ij5tYXRoLm1heDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5taW4iPm1hdGgubWluPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLm1vZGYiPm1hdGgubW9kZjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5waSI+bWF0aC5waTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5wb3ciPm1hdGgucG93PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLnJhZCI+bWF0aC5yYWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGgucmFuZG9tIj5tYXRoLnJhbmRvbTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5yYW5kb21zZWVkIj5tYXRoLnJhbmRvbXNlZWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguc2luIj5tYXRoLnNpbjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtbWF0aC5zaW5oIj5tYXRoLnNpbmg8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGguc3FydCI+bWF0aC5zcXJ0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1tYXRoLnRhbiI+bWF0aC50YW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW1hdGgudGFuaCI+bWF0aC50YW5oPC9BPjxCUj4KKworPFA+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtb3MuY2xvY2siPm9zLmNsb2NrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1vcy5kYXRlIj5vcy5kYXRlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1vcy5kaWZmdGltZSI+b3MuZGlmZnRpbWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW9zLmV4ZWN1dGUiPm9zLmV4ZWN1dGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW9zLmV4aXQiPm9zLmV4aXQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW9zLmdldGVudiI+b3MuZ2V0ZW52PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1vcy5yZW1vdmUiPm9zLnJlbW92ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtb3MucmVuYW1lIj5vcy5yZW5hbWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLW9zLnNldGxvY2FsZSI+b3Muc2V0bG9jYWxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1vcy50aW1lIj5vcy50aW1lPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1vcy50bXBuYW1lIj5vcy50bXBuYW1lPC9BPjxCUj4KKworPFA+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcGFja2FnZS5jb25maWciPnBhY2thZ2UuY29uZmlnPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1wYWNrYWdlLmNwYXRoIj5wYWNrYWdlLmNwYXRoPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1wYWNrYWdlLmxvYWRlZCI+cGFja2FnZS5sb2FkZWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXBhY2thZ2UubG9hZGxpYiI+cGFja2FnZS5sb2FkbGliPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1wYWNrYWdlLnBhdGgiPnBhY2thZ2UucGF0aDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcGFja2FnZS5wcmVsb2FkIj5wYWNrYWdlLnByZWxvYWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXBhY2thZ2Uuc2VhcmNoZXJzIj5wYWNrYWdlLnNlYXJjaGVyczwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtcGFja2FnZS5zZWFyY2hwYXRoIj5wYWNrYWdlLnNlYXJjaHBhdGg8L0E+PEJSPgorCis8UD4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1zdHJpbmcuYnl0ZSI+c3RyaW5nLmJ5dGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5jaGFyIj5zdHJpbmcuY2hhcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLmR1bXAiPnN0cmluZy5kdW1wPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1zdHJpbmcuZmluZCI+c3RyaW5nLmZpbmQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5mb3JtYXQiPnN0cmluZy5mb3JtYXQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5nbWF0Y2giPnN0cmluZy5nbWF0Y2g8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5nc3ViIj5zdHJpbmcuZ3N1YjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLmxlbiI+c3RyaW5nLmxlbjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtc3RyaW5nLmxvd2VyIj5zdHJpbmcubG93ZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5tYXRjaCI+c3RyaW5nLm1hdGNoPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1zdHJpbmcucmVwIj5zdHJpbmcucmVwPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi1zdHJpbmcucmV2ZXJzZSI+c3RyaW5nLnJldmVyc2U8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy5zdWIiPnN0cmluZy5zdWI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXN0cmluZy51cHBlciI+c3RyaW5nLnVwcGVyPC9BPjxCUj4KKworPFA+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtdGFibGUuY29uY2F0Ij50YWJsZS5jb25jYXQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjcGRmLXRhYmxlLmluc2VydCI+dGFibGUuaW5zZXJ0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi10YWJsZS5wYWNrIj50YWJsZS5wYWNrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI3BkZi10YWJsZS5yZW1vdmUiPnRhYmxlLnJlbW92ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtdGFibGUuc29ydCI+dGFibGUuc29ydDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNwZGYtdGFibGUudW5wYWNrIj50YWJsZS51bnBhY2s8L0E+PEJSPgorCis8L1REPgorPFREPgorPEgzPkMgQVBJPC9IMz4KKzxQPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX0FsbG9jIj5sdWFfQWxsb2M8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX0NGdW5jdGlvbiI+bHVhX0NGdW5jdGlvbjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfRGVidWciPmx1YV9EZWJ1ZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfSG9vayI+bHVhX0hvb2s8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX0ludGVnZXIiPmx1YV9JbnRlZ2VyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9OdW1iZXIiPmx1YV9OdW1iZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX1JlYWRlciI+bHVhX1JlYWRlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfU3RhdGUiPmx1YV9TdGF0ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfVW5zaWduZWQiPmx1YV9VbnNpZ25lZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfV3JpdGVyIj5sdWFfV3JpdGVyPC9BPjxCUj4KKworPFA+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfYWJzaW5kZXgiPmx1YV9hYnNpbmRleDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfYXJpdGgiPmx1YV9hcml0aDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfYXRwYW5pYyI+bHVhX2F0cGFuaWM8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2NhbGwiPmx1YV9jYWxsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9jYWxsayI+bHVhX2NhbGxrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9jaGVja3N0YWNrIj5sdWFfY2hlY2tzdGFjazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfY2xvc2UiPmx1YV9jbG9zZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfY29tcGFyZSI+bHVhX2NvbXBhcmU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2NvbmNhdCI+bHVhX2NvbmNhdDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfY29weSI+bHVhX2NvcHk8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2NyZWF0ZXRhYmxlIj5sdWFfY3JlYXRldGFibGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2R1bXAiPmx1YV9kdW1wPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9lcnJvciI+bHVhX2Vycm9yPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nYyI+bHVhX2djPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nZXRhbGxvY2YiPmx1YV9nZXRhbGxvY2Y8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2dldGN0eCI+bHVhX2dldGN0eDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0ZmllbGQiPmx1YV9nZXRmaWVsZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0Z2xvYmFsIj5sdWFfZ2V0Z2xvYmFsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nZXRob29rIj5sdWFfZ2V0aG9vazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0aG9va2NvdW50Ij5sdWFfZ2V0aG9va2NvdW50PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nZXRob29rbWFzayI+bHVhX2dldGhvb2ttYXNrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nZXRpbmZvIj5sdWFfZ2V0aW5mbzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0bG9jYWwiPmx1YV9nZXRsb2NhbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfZ2V0bWV0YXRhYmxlIj5sdWFfZ2V0bWV0YXRhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nZXRzdGFjayI+bHVhX2dldHN0YWNrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nZXR0YWJsZSI+bHVhX2dldHRhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nZXR0b3AiPmx1YV9nZXR0b3A8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2dldHVwdmFsdWUiPmx1YV9nZXR1cHZhbHVlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9nZXR1c2VydmFsdWUiPmx1YV9nZXR1c2VydmFsdWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2luc2VydCI+bHVhX2luc2VydDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfaXNib29sZWFuIj5sdWFfaXNib29sZWFuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9pc2NmdW5jdGlvbiI+bHVhX2lzY2Z1bmN0aW9uPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9pc2Z1bmN0aW9uIj5sdWFfaXNmdW5jdGlvbjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfaXNsaWdodHVzZXJkYXRhIj5sdWFfaXNsaWdodHVzZXJkYXRhPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9pc25pbCI+bHVhX2lzbmlsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9pc25vbmUiPmx1YV9pc25vbmU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzbm9uZW9ybmlsIj5sdWFfaXNub25lb3JuaWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzbnVtYmVyIj5sdWFfaXNudW1iZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzc3RyaW5nIj5sdWFfaXNzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX2lzdGFibGUiPmx1YV9pc3RhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9pc3RocmVhZCI+bHVhX2lzdGhyZWFkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9pc3VzZXJkYXRhIj5sdWFfaXN1c2VyZGF0YTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfbGVuIj5sdWFfbGVuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9sb2FkIj5sdWFfbG9hZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfbmV3c3RhdGUiPmx1YV9uZXdzdGF0ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfbmV3dGFibGUiPmx1YV9uZXd0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfbmV3dGhyZWFkIj5sdWFfbmV3dGhyZWFkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9uZXd1c2VyZGF0YSI+bHVhX25ld3VzZXJkYXRhPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9uZXh0Ij5sdWFfbmV4dDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcGNhbGwiPmx1YV9wY2FsbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcGNhbGxrIj5sdWFfcGNhbGxrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9wb3AiPmx1YV9wb3A8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hib29sZWFuIj5sdWFfcHVzaGJvb2xlYW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hjY2xvc3VyZSI+bHVhX3B1c2hjY2xvc3VyZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaGNmdW5jdGlvbiI+bHVhX3B1c2hjZnVuY3Rpb248L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hmc3RyaW5nIj5sdWFfcHVzaGZzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hnbG9iYWx0YWJsZSI+bHVhX3B1c2hnbG9iYWx0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaGludGVnZXIiPmx1YV9wdXNoaW50ZWdlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaGxpZ2h0dXNlcmRhdGEiPmx1YV9wdXNobGlnaHR1c2VyZGF0YTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaGxpdGVyYWwiPmx1YV9wdXNobGl0ZXJhbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaGxzdHJpbmciPmx1YV9wdXNobHN0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaG5pbCI+bHVhX3B1c2huaWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2hudW1iZXIiPmx1YV9wdXNobnVtYmVyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9wdXNoc3RyaW5nIj5sdWFfcHVzaHN0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaHRocmVhZCI+bHVhX3B1c2h0aHJlYWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3B1c2h1bnNpZ25lZCI+bHVhX3B1c2h1bnNpZ25lZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcHVzaHZhbHVlIj5sdWFfcHVzaHZhbHVlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9wdXNodmZzdHJpbmciPmx1YV9wdXNodmZzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3Jhd2VxdWFsIj5sdWFfcmF3ZXF1YWw8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3Jhd2dldCI+bHVhX3Jhd2dldDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcmF3Z2V0aSI+bHVhX3Jhd2dldGk8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3Jhd2dldHAiPmx1YV9yYXdnZXRwPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9yYXdsZW4iPmx1YV9yYXdsZW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3Jhd3NldCI+bHVhX3Jhd3NldDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfcmF3c2V0aSI+bHVhX3Jhd3NldGk8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3Jhd3NldHAiPmx1YV9yYXdzZXRwPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9yZWdpc3RlciI+bHVhX3JlZ2lzdGVyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9yZW1vdmUiPmx1YV9yZW1vdmU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3JlcGxhY2UiPmx1YV9yZXBsYWNlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9yZXN1bWUiPmx1YV9yZXN1bWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3NldGFsbG9jZiI+bHVhX3NldGFsbG9jZjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfc2V0ZmllbGQiPmx1YV9zZXRmaWVsZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfc2V0Z2xvYmFsIj5sdWFfc2V0Z2xvYmFsPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9zZXRob29rIj5sdWFfc2V0aG9vazwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfc2V0bG9jYWwiPmx1YV9zZXRsb2NhbDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfc2V0bWV0YXRhYmxlIj5sdWFfc2V0bWV0YXRhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9zZXR0YWJsZSI+bHVhX3NldHRhYmxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9zZXR0b3AiPmx1YV9zZXR0b3A8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3NldHVwdmFsdWUiPmx1YV9zZXR1cHZhbHVlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV9zZXR1c2VydmFsdWUiPmx1YV9zZXR1c2VydmFsdWU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3N0YXR1cyI+bHVhX3N0YXR1czwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdG9ib29sZWFuIj5sdWFfdG9ib29sZWFuPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b2NmdW5jdGlvbiI+bHVhX3RvY2Z1bmN0aW9uPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b2ludGVnZXIiPmx1YV90b2ludGVnZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3RvaW50ZWdlcngiPmx1YV90b2ludGVnZXJ4PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b2xzdHJpbmciPmx1YV90b2xzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3RvbnVtYmVyIj5sdWFfdG9udW1iZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3RvbnVtYmVyeCI+bHVhX3RvbnVtYmVyeDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdG9wb2ludGVyIj5sdWFfdG9wb2ludGVyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b3N0cmluZyI+bHVhX3Rvc3RyaW5nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b3RocmVhZCI+bHVhX3RvdGhyZWFkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90b3Vuc2lnbmVkIj5sdWFfdG91bnNpZ25lZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdG91bnNpZ25lZHgiPmx1YV90b3Vuc2lnbmVkeDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdG91c2VyZGF0YSI+bHVhX3RvdXNlcmRhdGE8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3R5cGUiPmx1YV90eXBlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV90eXBlbmFtZSI+bHVhX3R5cGVuYW1lPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YV91cHZhbHVlaWQiPmx1YV91cHZhbHVlaWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3VwdmFsdWVpbmRleCI+bHVhX3VwdmFsdWVpbmRleDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdXB2YWx1ZWpvaW4iPmx1YV91cHZhbHVlam9pbjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFfdmVyc2lvbiI+bHVhX3ZlcnNpb248L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3htb3ZlIj5sdWFfeG1vdmU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3lpZWxkIj5sdWFfeWllbGQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhX3lpZWxkayI+bHVhX3lpZWxkazwvQT48QlI+CisKKzwvVEQ+Cis8VEQ+Cis8SDM+YXV4aWxpYXJ5IGxpYnJhcnk8L0gzPgorPFA+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX0J1ZmZlciI+bHVhTF9CdWZmZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9SZWciPmx1YUxfUmVnPC9BPjxCUj4KKworPFA+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2FkZGNoYXIiPmx1YUxfYWRkY2hhcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2FkZGxzdHJpbmciPmx1YUxfYWRkbHN0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2FkZHNpemUiPmx1YUxfYWRkc2l6ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2FkZHN0cmluZyI+bHVhTF9hZGRzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9hZGR2YWx1ZSI+bHVhTF9hZGR2YWx1ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2FyZ2NoZWNrIj5sdWFMX2FyZ2NoZWNrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfYXJnZXJyb3IiPmx1YUxfYXJnZXJyb3I8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9idWZmaW5pdCI+bHVhTF9idWZmaW5pdDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2J1ZmZpbml0c2l6ZSI+bHVhTF9idWZmaW5pdHNpemU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9jYWxsbWV0YSI+bHVhTF9jYWxsbWV0YTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2NoZWNrYW55Ij5sdWFMX2NoZWNrYW55PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2tpbnQiPmx1YUxfY2hlY2tpbnQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9jaGVja2ludGVnZXIiPmx1YUxfY2hlY2tpbnRlZ2VyPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2tsb25nIj5sdWFMX2NoZWNrbG9uZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2NoZWNrbHN0cmluZyI+bHVhTF9jaGVja2xzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9jaGVja251bWJlciI+bHVhTF9jaGVja251bWJlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2NoZWNrb3B0aW9uIj5sdWFMX2NoZWNrb3B0aW9uPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2tzdGFjayI+bHVhTF9jaGVja3N0YWNrPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2tzdHJpbmciPmx1YUxfY2hlY2tzdHJpbmc8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9jaGVja3R5cGUiPmx1YUxfY2hlY2t0eXBlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2t1ZGF0YSI+bHVhTF9jaGVja3VkYXRhPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2t1bnNpZ25lZCI+bHVhTF9jaGVja3Vuc2lnbmVkPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfY2hlY2t2ZXJzaW9uIj5sdWFMX2NoZWNrdmVyc2lvbjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2RvZmlsZSI+bHVhTF9kb2ZpbGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9kb3N0cmluZyI+bHVhTF9kb3N0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2Vycm9yIj5sdWFMX2Vycm9yPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfZXhlY3Jlc3VsdCI+bHVhTF9leGVjcmVzdWx0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfZmlsZXJlc3VsdCI+bHVhTF9maWxlcmVzdWx0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfZ2V0bWV0YWZpZWxkIj5sdWFMX2dldG1ldGFmaWVsZDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2dldG1ldGF0YWJsZSI+bHVhTF9nZXRtZXRhdGFibGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9nZXRzdWJ0YWJsZSI+bHVhTF9nZXRzdWJ0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2dzdWIiPmx1YUxfZ3N1YjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2xlbiI+bHVhTF9sZW48L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9sb2FkYnVmZmVyIj5sdWFMX2xvYWRidWZmZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9sb2FkYnVmZmVyeCI+bHVhTF9sb2FkYnVmZmVyeDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2xvYWRmaWxlIj5sdWFMX2xvYWRmaWxlPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfbG9hZGZpbGV4Ij5sdWFMX2xvYWRmaWxleDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX2xvYWRzdHJpbmciPmx1YUxfbG9hZHN0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX25ld2xpYiI+bHVhTF9uZXdsaWI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9uZXdsaWJ0YWJsZSI+bHVhTF9uZXdsaWJ0YWJsZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX25ld21ldGF0YWJsZSI+bHVhTF9uZXdtZXRhdGFibGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9uZXdzdGF0ZSI+bHVhTF9uZXdzdGF0ZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX29wZW5saWJzIj5sdWFMX29wZW5saWJzPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfb3B0aW50Ij5sdWFMX29wdGludDwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX29wdGludGVnZXIiPmx1YUxfb3B0aW50ZWdlcjwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX29wdGxvbmciPmx1YUxfb3B0bG9uZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX29wdGxzdHJpbmciPmx1YUxfb3B0bHN0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX29wdG51bWJlciI+bHVhTF9vcHRudW1iZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9vcHRzdHJpbmciPmx1YUxfb3B0c3RyaW5nPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfb3B0dW5zaWduZWQiPmx1YUxfb3B0dW5zaWduZWQ8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9wcmVwYnVmZmVyIj5sdWFMX3ByZXBidWZmZXI8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9wcmVwYnVmZnNpemUiPmx1YUxfcHJlcGJ1ZmZzaXplPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfcHVzaHJlc3VsdCI+bHVhTF9wdXNocmVzdWx0PC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfcHVzaHJlc3VsdHNpemUiPmx1YUxfcHVzaHJlc3VsdHNpemU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9yZWYiPmx1YUxfcmVmPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfcmVxdWlyZWYiPmx1YUxfcmVxdWlyZWY8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF9zZXRmdW5jcyI+bHVhTF9zZXRmdW5jczwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX3NldG1ldGF0YWJsZSI+bHVhTF9zZXRtZXRhdGFibGU8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF90ZXN0dWRhdGEiPmx1YUxfdGVzdHVkYXRhPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfdG9sc3RyaW5nIj5sdWFMX3RvbHN0cmluZzwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX3RyYWNlYmFjayI+bHVhTF90cmFjZWJhY2s8L0E+PEJSPgorPEEgSFJFRj0ibWFudWFsLmh0bWwjbHVhTF90eXBlbmFtZSI+bHVhTF90eXBlbmFtZTwvQT48QlI+Cis8QSBIUkVGPSJtYW51YWwuaHRtbCNsdWFMX3VucmVmIj5sdWFMX3VucmVmPC9BPjxCUj4KKzxBIEhSRUY9Im1hbnVhbC5odG1sI2x1YUxfd2hlcmUiPmx1YUxfd2hlcmU8L0E+PEJSPgorCis8L1REPgorPC9UUj4KKzwvVEFCTEU+CisKKzxIUj4KKzxTTUFMTCBDTEFTUz0iZm9vdGVyIj4KK0xhc3QgdXBkYXRlOgorVHVlIE1hciAxMiAxMToyMjoxOCBCUlQgMjAxMworPC9TTUFMTD4KKzwhLS0KK0xhc3QgY2hhbmdlOiByZXZpc2VkIGZvciBMdWEgNS4yLjIKKy0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9jb20zMi9sdWEvZG9jL2xvZ28uZ2lmIGIvY29tMzIvbHVhL2RvYy9sb2dvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjVlNGFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL2RvYy9sb2dvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvZG9jL2x1YS4xIGIvY29tMzIvbHVhL2RvYy9sdWEuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGJmMDQzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL2RvYy9sdWEuMQpAQCAtMCwwICsxLDExNiBAQAorLlwiICRJZDogbHVhLm1hbix2IDEuMTMgMjAxMS8xMS8xNiAxNzoxNjo1MyBsaGYgRXhwICQKKy5USCBMVUEgMSAiJERhdGU6IDIwMTEvMTEvMTYgMTc6MTY6NTMgJCIKKy5TSCBOQU1FCitsdWEgXC0gTHVhIGludGVycHJldGVyCisuU0ggU1lOT1BTSVMKKy5CIGx1YQorWworLkkgb3B0aW9ucworXQorWworLkkgc2NyaXB0CitbCisuSSBhcmdzCitdCitdCisuU0ggREVTQ1JJUFRJT04KKy5CIGx1YQoraXMgdGhlIHN0YW5kYWxvbmUgTHVhIGludGVycHJldGVyLgorSXQgbG9hZHMgYW5kIGV4ZWN1dGVzIEx1YSBwcm9ncmFtcywKK2VpdGhlciBpbiB0ZXh0dWFsIHNvdXJjZSBmb3JtIG9yCitpbiBwcmVjb21waWxlZCBiaW5hcnkgZm9ybS4KKyhQcmVjb21waWxlZCBiaW5hcmllcyBhcmUgb3V0cHV0IGJ5CisuQlIgbHVhYyAsCit0aGUgTHVhIGNvbXBpbGVyLikKKy5CIGx1YQorY2FuIGJlIHVzZWQgYXMgYSBiYXRjaCBpbnRlcnByZXRlciBhbmQgYWxzbyBpbnRlcmFjdGl2ZWx5LgorLkxQCitUaGUgZ2l2ZW4KKy5JIG9wdGlvbnMKK2FyZSBoYW5kbGVkIGluIG9yZGVyIGFuZCB0aGVuCit0aGUgTHVhIHByb2dyYW0gaW4gZmlsZQorLkkgc2NyaXB0CitpcyBsb2FkZWQgYW5kIGV4ZWN1dGVkLgorVGhlIGdpdmVuCisuSSBhcmdzCithcmUgYXZhaWxhYmxlIHRvCisuSSBzY3JpcHQKK2FzIHN0cmluZ3MgaW4gYSBnbG9iYWwgdGFibGUgbmFtZWQKKy5CUiBhcmcgLgorSWYgbm8gb3B0aW9ucyBvciBhcmd1bWVudHMgYXJlIGdpdmVuLAordGhlbgorLkIgIlwtdiBcLWkiCitpcyBhc3N1bWVkIHdoZW4gdGhlIHN0YW5kYXJkIGlucHV0IGlzIGEgdGVybWluYWw7CitvdGhlcndpc2UsCisuQiAiXC0iCitpcyBhc3N1bWVkLgorLkxQCitJbiBpbnRlcmFjdGl2ZSBtb2RlLAorLkIgbHVhCitwcm9tcHRzIHRoZSB1c2VyLAorcmVhZHMgbGluZXMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQsCithbmQgZXhlY3V0ZXMgdGhlbSBhcyB0aGV5IGFyZSByZWFkLgorSWYgYSBsaW5lIGRvZXMgbm90IGNvbnRhaW4gYSBjb21wbGV0ZSBzdGF0ZW1lbnQsCit0aGVuIGEgc2Vjb25kYXJ5IHByb21wdCBpcyBkaXNwbGF5ZWQgYW5kCitsaW5lcyBhcmUgcmVhZCB1bnRpbCBhIGNvbXBsZXRlIHN0YXRlbWVudCBpcyBmb3JtZWQgb3IKK2Egc3ludGF4IGVycm9yIGlzIGZvdW5kLgorSWYgYSBsaW5lIHN0YXJ0cyB3aXRoCisuQlIgJz0nICwKK3RoZW4KKy5CIGx1YQorZXZhbHVhdGVzIGFuZCBkaXNwbGF5cwordGhlIHZhbHVlcyBvZiB0aGUgZXhwcmVzc2lvbnMgaW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgbGluZS4KKy5MUAorQXQgdGhlIHZlcnkgc3RhcnQsCitiZWZvcmUgZXZlbiBoYW5kbGluZyB0aGUgY29tbWFuZCBsaW5lLAorLkIgbHVhCitjaGVja3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKy5CIExVQV9JTklUXzVfMgorb3IKKy5CUiBMVUFfSU5JVCAsCitpbiB0aGF0IG9yZGVyLgorSWYgdGhlIGNvbnRlbnRzIGlzIG9mIHRoZSBmb3JtCisuUkkgJ0AgZmlsZW5hbWUgJywKK3RoZW4KKy5JIGZpbGVuYW1lCitpcyBleGVjdXRlZC4KK090aGVyd2lzZSwgdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIGEgTHVhIHN0YXRlbWVudCBhbmQgaXMgZXhlY3V0ZWQuCisuU0ggT1BUSU9OUworLlRQCisuQkkgXC1lICIgc3RhdCIKK2V4ZWN1dGUgc3RhdGVtZW50CisuSVIgc3RhdCAuCisuVFAKKy5CIFwtaQorZW50ZXIgaW50ZXJhY3RpdmUgbW9kZSBhZnRlciBleGVjdXRpbmcKKy5JUiBzY3JpcHQgLgorLlRQCisuQkkgXC1sICIgbmFtZSIKK2V4ZWN1dGUgdGhlIGVxdWl2YWxlbnQgb2YKKy5JQiBuYW1lID1yZXF1aXJlKCcgbmFtZSAnKQorYmVmb3JlIGV4ZWN1dGluZworLklSIHNjcmlwdCAuCisuVFAKKy5CIFwtdgorc2hvdyB2ZXJzaW9uIGluZm9ybWF0aW9uLgorLlRQCisuQiBcLUUKK2lnbm9yZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisuVFAKKy5CIFwtXC0KK3N0b3AgaGFuZGxpbmcgb3B0aW9ucy4KKy5UUAorLkIgXC0KK3N0b3AgaGFuZGxpbmcgb3B0aW9ucyBhbmQgZXhlY3V0ZSB0aGUgc3RhbmRhcmQgaW5wdXQgYXMgYSBmaWxlLgorLlNIICJTRUUgQUxTTyIKKy5CUiBsdWFjICgxKQorLmJyCitUaGUgZG9jdW1lbnRhdGlvbiBhdCBsdWEub3JnLAorZXNwZWNpYWxseSBzZWN0aW9uIDcgb2YgdGhlIHJlZmVyZW5jZSBtYW51YWwuCisuU0ggRElBR05PU1RJQ1MKK0Vycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSBzZWxmIGV4cGxhbmF0b3J5LgorLlNIIEFVVEhPUlMKK1IuIEllcnVzYWxpbXNjaHksCitMLiBILiBkZSBGaWd1ZWlyZWRvLAorVy4gQ2VsZXMKKy5cIiBFT0YKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9kb2MvbHVhLmNzcyBiL2NvbTMyL2x1YS9kb2MvbHVhLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDI0NDNhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL2RvYy9sdWEuY3NzCkBAIC0wLDAgKzEsOTYgQEAKK2h0bWwgeworCWJhY2tncm91bmQtY29sb3I6ICNGOEY4RjggOworfQorCitib2R5IHsKKwlib3JkZXI6IHNvbGlkICNhMGEwYTAgMXB4IDsKKwlib3JkZXItcmFkaXVzOiAyMHB4IDsKKwlwYWRkaW5nOiAyNnB4IDsKKwltYXJnaW46IDE2cHggOworCWNvbG9yOiAjMDAwMDAwIDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGIDsKKwlmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiA7CisJdGV4dC1hbGlnbjoganVzdGlmeSA7Cit9CisKK2gxLCBoMiwgaDMsIGg0IHsKKwlmb250LWZhbWlseTogVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmIDsKKwlmb250LXdlaWdodDogbm9ybWFsIDsKKwlmb250LXN0eWxlOiBub3JtYWwgOworfQorCitoMiB7CisJcGFkZGluZy10b3A6IDAuNGVtIDsKKwlwYWRkaW5nLWJvdHRvbTogMC40ZW0gOworCXBhZGRpbmctbGVmdDogMC44ZW0gOworCXBhZGRpbmctcmlnaHQ6IDAuOGVtIDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRDBEMEZGIDsKKwlib3JkZXItcmFkaXVzOiA4cHggOworCWJvcmRlcjogc29saWQgI2EwYTBhMCAxcHggOworfQorCitoMyB7CisJcGFkZGluZy1sZWZ0OiAwLjVlbSA7CisJYm9yZGVyLWxlZnQ6IHNvbGlkICNEMEQwRkYgMWVtIDsKK30KKwordGFibGUgaDMgeworCXBhZGRpbmctbGVmdDogMHB4IDsKKwlib3JkZXItbGVmdDogbm9uZSA7Cit9CisKK2E6bGluayB7CisJY29sb3I6ICMwMDAwODAgOworCWJhY2tncm91bmQtY29sb3I6IGluaGVyaXQgOworCXRleHQtZGVjb3JhdGlvbjogbm9uZSA7Cit9CisKK2E6dmlzaXRlZCB7CisJYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdCA7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lIDsKK30KKworYTpsaW5rOmhvdmVyLCBhOnZpc2l0ZWQ6aG92ZXIgeworCWNvbG9yOiAjMDAwMDgwIDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRDBEMEZGIDsKK30KKworYTpsaW5rOmFjdGl2ZSwgYTp2aXNpdGVkOmFjdGl2ZSB7CisJY29sb3I6ICNGRjAwMDAgOworfQorCitociB7CisJYm9yZGVyOiAwIDsKKwloZWlnaHQ6IDFweCA7CisJY29sb3I6ICNhMGEwYTAgOworCWJhY2tncm91bmQtY29sb3I6ICNhMGEwYTAgOworCWRpc3BsYXk6IG5vbmUgOworfQorCit0YWJsZSBociB7CisJZGlzcGxheTogYmxvY2sgOworfQorCis6dGFyZ2V0IHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4IDsKKwlwYWRkaW5nOiA4cHggOworCWJvcmRlcjogc29saWQgI2EwYTBhMCAycHggOworCWJvcmRlci1yYWRpdXM6IDhweCA7Cit9CisKKy5mb290ZXIgeworCWNvbG9yOiBncmF5IDsKKwlmb250LXNpemU6IHgtc21hbGwgOworfQorCitpbnB1dFt0eXBlPXRleHRdIHsKKwlib3JkZXI6IHNvbGlkICNhMGEwYTAgMnB4IDsKKwlib3JkZXItcmFkaXVzOiAyZW0gOworCS1tb3otYm9yZGVyLXJhZGl1czogMmVtIDsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2ltYWdlcy9zZWFyY2gucG5nJykgOworCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisJYmFja2dyb3VuZC1wb3NpdGlvbjogNHB4IGNlbnRlciA7CisJcGFkZGluZy1sZWZ0OiAyMHB4IDsKKwloZWlnaHQ6IDJlbSA7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9kb2MvbHVhYy4xIGIvY29tMzIvbHVhL2RvYy9sdWFjLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNGVkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9kb2MvbHVhYy4xCkBAIC0wLDAgKzEsMTE4IEBACisuXCIgJElkOiBsdWFjLm1hbix2IDEuMjkgMjAxMS8xMS8xNiAxMzo1Mzo0MCBsaGYgRXhwICQKKy5USCBMVUFDIDEgIiREYXRlOiAyMDExLzExLzE2IDEzOjUzOjQwICQiCisuU0ggTkFNRQorbHVhYyBcLSBMdWEgY29tcGlsZXIKKy5TSCBTWU5PUFNJUworLkIgbHVhYworWworLkkgb3B0aW9ucworXSBbCisuSSBmaWxlbmFtZXMKK10KKy5TSCBERVNDUklQVElPTgorLkIgbHVhYworaXMgdGhlIEx1YSBjb21waWxlci4KK0l0IHRyYW5zbGF0ZXMgcHJvZ3JhbXMgd3JpdHRlbiBpbiB0aGUgTHVhIHByb2dyYW1taW5nIGxhbmd1YWdlCitpbnRvIGJpbmFyeSBmaWxlcyBjb250YWluaW5nIHByZWNvbXBpbGVkIGNodW5rcwordGhhdCBjYW4gYmUgbGF0ZXIgbG9hZGVkIGFuZCBleGVjdXRlZC4KKy5MUAorVGhlIG1haW4gYWR2YW50YWdlcyBvZiBwcmVjb21waWxpbmcgY2h1bmtzIGFyZToKK2Zhc3RlciBsb2FkaW5nLAorcHJvdGVjdGluZyBzb3VyY2UgY29kZSBmcm9tIGFjY2lkZW50YWwgdXNlciBjaGFuZ2VzLAorYW5kCitvZmYtbGluZSBzeW50YXggY2hlY2tpbmcuCitQcmVjb21waWxpbmcgZG9lcyBub3QgaW1wbHkgZmFzdGVyIGV4ZWN1dGlvbgorYmVjYXVzZSBpbiBMdWEgY2h1bmtzIGFyZSBhbHdheXMgY29tcGlsZWQgaW50byBieXRlY29kZXMgYmVmb3JlIGJlaW5nIGV4ZWN1dGVkLgorLkIgbHVhYworc2ltcGx5IGFsbG93cyB0aG9zZSBieXRlY29kZXMgdG8gYmUgc2F2ZWQgaW4gYSBmaWxlIGZvciBsYXRlciBleGVjdXRpb24uCitQcmVjb21waWxlZCBjaHVua3MgYXJlIG5vdCBuZWNlc3NhcmlseSBzbWFsbGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlLgorVGhlIG1haW4gZ29hbCBpbiBwcmVjb21waWxpbmcgaXMgZmFzdGVyIGxvYWRpbmcuCisuTFAKK0luIHRoZSBjb21tYW5kIGxpbmUsCit5b3UgY2FuIG1peAordGV4dCBmaWxlcyBjb250YWluaW5nIEx1YSBzb3VyY2UgYW5kCitiaW5hcnkgZmlsZXMgY29udGFpbmluZyBwcmVjb21waWxlZCBjaHVua3MuCisuQiBsdWFjCitwcm9kdWNlcyBhIHNpbmdsZSBvdXRwdXQgZmlsZSBjb250YWluaW5nIHRoZSBjb21iaW5lZCBieXRlY29kZXMKK2ZvciBhbGwgZmlsZXMgZ2l2ZW4uCitFeGVjdXRpbmcgdGhlIGNvbWJpbmVkIGZpbGUgaXMgZXF1aXZhbGVudCB0byBleGVjdXRpbmcgdGhlIGdpdmVuIGZpbGVzLgorQnkgZGVmYXVsdCwKK3RoZSBvdXRwdXQgZmlsZSBpcyBuYW1lZAorLkJSIGx1YWMub3V0ICwKK2J1dCB5b3UgY2FuIGNoYW5nZSB0aGlzIHdpdGggdGhlCisuQiBcLW8KK29wdGlvbi4KKy5MUAorUHJlY29tcGlsZWQgY2h1bmtzIGFyZQorLkkgbm90Citwb3J0YWJsZSBhY3Jvc3MgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuCitNb3Jlb3ZlciwKK3RoZSBpbnRlcm5hbCBmb3JtYXQgb2YgcHJlY29tcGlsZWQgY2h1bmtzCitpcyBsaWtlbHkgdG8gY2hhbmdlIHdoZW4gYSBuZXcgdmVyc2lvbiBvZiBMdWEgaXMgcmVsZWFzZWQuCitNYWtlIHN1cmUgeW91IHNhdmUgdGhlIHNvdXJjZSBmaWxlcyBvZiBhbGwgTHVhIHByb2dyYW1zIHRoYXQgeW91IHByZWNvbXBpbGUuCisuTFAKKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtbAorcHJvZHVjZSBhIGxpc3Rpbmcgb2YgdGhlIGNvbXBpbGVkIGJ5dGVjb2RlIGZvciBMdWEncyB2aXJ0dWFsIG1hY2hpbmUuCitMaXN0aW5nIGJ5dGVjb2RlcyBpcyB1c2VmdWwgdG8gbGVhcm4gYWJvdXQgTHVhJ3MgdmlydHVhbCBtYWNoaW5lLgorSWYgbm8gZmlsZXMgYXJlIGdpdmVuLCB0aGVuCisuQiBsdWFjCitsb2FkcworLkIgbHVhYy5vdXQKK2FuZCBsaXN0cyBpdHMgY29udGVudHMuCitVc2UKKy5CIFwtbCBcLWwKK2ZvciBhIGZ1bGwgbGlzdGluZy4KKy5UUAorLkJJIFwtbyAiIGZpbGUiCitvdXRwdXQgdG8KKy5JUiBmaWxlICwKK2luc3RlYWQgb2YgdGhlIGRlZmF1bHQKKy5CUiBsdWFjLm91dCAuCisoWW91IGNhbiB1c2UKKy5CICInXC0nIgorZm9yIHN0YW5kYXJkIG91dHB1dCwKK2J1dCBub3Qgb24gcGxhdGZvcm1zIHRoYXQgb3BlbiBzdGFuZGFyZCBvdXRwdXQgaW4gdGV4dCBtb2RlLikKK1RoZSBvdXRwdXQgZmlsZSBtYXkgYmUgb25lIG9mIHRoZSBnaXZlbiBmaWxlcyBiZWNhdXNlCithbGwgZmlsZXMgYXJlIGxvYWRlZCBiZWZvcmUgdGhlIG91dHB1dCBmaWxlIGlzIHdyaXR0ZW4uCitCZSBjYXJlZnVsIG5vdCB0byBvdmVyd3JpdGUgcHJlY2lvdXMgZmlsZXMuCisuVFAKKy5CIFwtcAorbG9hZCBmaWxlcyBidXQgZG8gbm90IGdlbmVyYXRlIGFueSBvdXRwdXQgZmlsZS4KK1VzZWQgbWFpbmx5IGZvciBzeW50YXggY2hlY2tpbmcgYW5kIGZvciB0ZXN0aW5nIHByZWNvbXBpbGVkIGNodW5rczoKK2NvcnJ1cHRlZCBmaWxlcyB3aWxsIHByb2JhYmx5IGdlbmVyYXRlIGVycm9ycyB3aGVuIGxvYWRlZC4KK0lmIG5vIGZpbGVzIGFyZSBnaXZlbiwgdGhlbgorLkIgbHVhYworbG9hZHMKKy5CIGx1YWMub3V0CithbmQgdGVzdHMgaXRzIGNvbnRlbnRzLgorTm8gbWVzc2FnZXMgYXJlIGRpc3BsYXllZCBpZiB0aGUgZmlsZSBsb2FkcyB3aXRob3V0IGVycm9ycy4KKy5UUAorLkIgXC1zCitzdHJpcCBkZWJ1ZyBpbmZvcm1hdGlvbiBiZWZvcmUgd3JpdGluZyB0aGUgb3V0cHV0IGZpbGUuCitUaGlzIHNhdmVzIHNvbWUgc3BhY2UgaW4gdmVyeSBsYXJnZSBjaHVua3MsCitidXQgaWYgZXJyb3JzIG9jY3VyIHdoZW4gcnVubmluZyBhIHN0cmlwcGVkIGNodW5rLAordGhlbiB0aGUgZXJyb3IgbWVzc2FnZXMgbWF5IG5vdCBjb250YWluIHRoZSBmdWxsIGluZm9ybWF0aW9uIHRoZXkgdXN1YWxseSBkby4KK0luIHBhcnRpY3VsYXIsCitsaW5lIG51bWJlcnMgYW5kIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyBhcmUgbG9zdC4KKy5UUAorLkIgXC12CitzaG93IHZlcnNpb24gaW5mb3JtYXRpb24uCisuVFAKKy5CIFwtXC0KK3N0b3AgaGFuZGxpbmcgb3B0aW9ucy4KKy5UUAorLkIgXC0KK3N0b3AgaGFuZGxpbmcgb3B0aW9ucyBhbmQgcHJvY2VzcyBzdGFuZGFyZCBpbnB1dC4KKy5TSCAiU0VFIEFMU08iCisuQlIgbHVhICgxKQorLmJyCitUaGUgZG9jdW1lbnRhdGlvbiBhdCBsdWEub3JnLgorLlNIIERJQUdOT1NUSUNTCitFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgc2VsZiBleHBsYW5hdG9yeS4KKy5TSCBBVVRIT1JTCitSLiBJZXJ1c2FsaW1zY2h5LAorTC4gSC4gZGUgRmlndWVpcmVkbywKK1cuIENlbGVzCisuXCIgRU9GCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvZG9jL21hbnVhbC5jc3MgYi9jb20zMi9sdWEvZG9jL21hbnVhbC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2MTNjZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9kb2MvbWFudWFsLmNzcwpAQCAtMCwwICsxLDI3IEBACitoMyBjb2RlIHsKKwlmb250LWZhbWlseTogaW5oZXJpdCA7CisJZm9udC1zaXplOiBpbmhlcml0IDsKK30KKworcHJlLCBjb2RlIHsKKwlmb250LXNpemU6IDEycHQgOworfQorCitzcGFuLmFwaWkgeworCWZsb2F0OiByaWdodCA7CisJZm9udC1mYW1pbHk6IGluaGVyaXQgOworCWZvbnQtc3R5bGU6IG5vcm1hbCA7CisJZm9udC1zaXplOiBzbWFsbCA7CisJY29sb3I6IGdyYXkgOworfQorCitwK2gxLCB1bCtoMSB7CisJZm9udC1zdHlsZTogbm9ybWFsIDsKKwlwYWRkaW5nLXRvcDogMC40ZW0gOworCXBhZGRpbmctYm90dG9tOiAwLjRlbSA7CisJcGFkZGluZy1sZWZ0OiAxNnB4IDsKKwltYXJnaW4tbGVmdDogLTE2cHggOworCWJhY2tncm91bmQtY29sb3I6ICNEMEQwRkYgOworCWJvcmRlci1yYWRpdXM6IDhweCA7CisJYm9yZGVyOiBzb2xpZCAjMDAwMDgwIDFweCA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9sdWEvZG9jL21hbnVhbC5odG1sIGIvY29tMzIvbHVhL2RvYy9tYW51YWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTM2NTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL2RvYy9tYW51YWwuaHRtbApAQCAtMCwwICsxLDEwNTA3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorCis8aGVhZD4KKzx0aXRsZT5MdWEgNS4yIFJlZmVyZW5jZSBNYW51YWw8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ibHVhLmNzcyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJtYW51YWwuY3NzIj4KKzxNRVRBIEhUVFAtRVFVSVY9ImNvbnRlbnQtdHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keT4KKworPGhyPgorPGgxPgorPGEgaHJlZj0iaHR0cDovL3d3dy5sdWEub3JnLyI+PGltZyBzcmM9ImxvZ28uZ2lmIiBhbHQ9IiIgYm9yZGVyPSIwIj48L2E+CitMdWEgNS4yIFJlZmVyZW5jZSBNYW51YWwKKzwvaDE+CisKK2J5IFJvYmVydG8gSWVydXNhbGltc2NoeSwgTHVpeiBIZW5yaXF1ZSBkZSBGaWd1ZWlyZWRvLCBXYWxkZW1hciBDZWxlcworPHA+Cis8c21hbGw+CitDb3B5cmlnaHQgJmNvcHk7IDIwMTEmbmRhc2g7MjAxMyBMdWEub3JnLCBQVUMtUmlvLgorRnJlZWx5IGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCis8YSBocmVmPSJodHRwOi8vd3d3Lmx1YS5vcmcvbGljZW5zZS5odG1sIj5MdWEgbGljZW5zZTwvYT4uCis8L3NtYWxsPgorPGhyPgorPHA+CisKKzxhIGhyZWY9ImNvbnRlbnRzLmh0bWwjY29udGVudHMiPmNvbnRlbnRzPC9BPgorJm1pZGRvdDsKKzxhIGhyZWY9ImNvbnRlbnRzLmh0bWwjaW5kZXgiPmluZGV4PC9BPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8cD4KKworPCEtLSAkSWQ6IG1hbnVhbC5vZix2IDEuMTAzIDIwMTMvMDMvMTQgMTg6NTE6NTYgcm9iZXJ0byBFeHAgJCAtLT4KKworCisKKworPGgxPjEgJm5kYXNoOyA8YSBuYW1lPSIxIj5JbnRyb2R1Y3Rpb248L2E+PC9oMT4KKworPHA+CitMdWEgaXMgYW4gZXh0ZW5zaW9uIHByb2dyYW1taW5nIGxhbmd1YWdlIGRlc2lnbmVkIHRvIHN1cHBvcnQKK2dlbmVyYWwgcHJvY2VkdXJhbCBwcm9ncmFtbWluZyB3aXRoIGRhdGEgZGVzY3JpcHRpb24KK2ZhY2lsaXRpZXMuCitJdCBhbHNvIG9mZmVycyBnb29kIHN1cHBvcnQgZm9yIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZywKK2Z1bmN0aW9uYWwgcHJvZ3JhbW1pbmcsIGFuZCBkYXRhLWRyaXZlbiBwcm9ncmFtbWluZy4KK0x1YSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgcG93ZXJmdWwsIGxpZ2h0d2VpZ2h0LAorZW1iZWRkYWJsZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZm9yIGFueSBwcm9ncmFtIHRoYXQgbmVlZHMgb25lLgorTHVhIGlzIGltcGxlbWVudGVkIGFzIGEgbGlicmFyeSwgd3JpdHRlbiBpbiA8ZW0+Y2xlYW4gQzwvZW0+LAordGhlIGNvbW1vbiBzdWJzZXQgb2YgU3RhbmRhcmQmbmJzcDtDIGFuZCBDKysuCisKKworPHA+CitCZWluZyBhbiBleHRlbnNpb24gbGFuZ3VhZ2UsIEx1YSBoYXMgbm8gbm90aW9uIG9mIGEgIm1haW4iIHByb2dyYW06CitpdCBvbmx5IHdvcmtzIDxlbT5lbWJlZGRlZDwvZW0+IGluIGEgaG9zdCBjbGllbnQsCitjYWxsZWQgdGhlIDxlbT5lbWJlZGRpbmcgcHJvZ3JhbTwvZW0+IG9yIHNpbXBseSB0aGUgPGVtPmhvc3Q8L2VtPi4KK1RoZSBob3N0IHByb2dyYW0gY2FuIGludm9rZSBmdW5jdGlvbnMgdG8gZXhlY3V0ZSBhIHBpZWNlIG9mIEx1YSBjb2RlLAorY2FuIHdyaXRlIGFuZCByZWFkIEx1YSB2YXJpYWJsZXMsCithbmQgY2FuIHJlZ2lzdGVyIEMmbmJzcDtmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIGJ5IEx1YSBjb2RlLgorVGhyb3VnaCB0aGUgdXNlIG9mIEMmbmJzcDtmdW5jdGlvbnMsIEx1YSBjYW4gYmUgYXVnbWVudGVkIHRvIGNvcGUgd2l0aAorYSB3aWRlIHJhbmdlIG9mIGRpZmZlcmVudCBkb21haW5zLAordGh1cyBjcmVhdGluZyBjdXN0b21pemVkIHByb2dyYW1taW5nIGxhbmd1YWdlcyBzaGFyaW5nIGEgc3ludGFjdGljYWwgZnJhbWV3b3JrLgorVGhlIEx1YSBkaXN0cmlidXRpb24gaW5jbHVkZXMgYSBzYW1wbGUgaG9zdCBwcm9ncmFtIGNhbGxlZCA8Y29kZT5sdWE8L2NvZGU+LAord2hpY2ggdXNlcyB0aGUgTHVhIGxpYnJhcnkgdG8gb2ZmZXIgYSBjb21wbGV0ZSwgc3RhbmRhbG9uZSBMdWEgaW50ZXJwcmV0ZXIsCitmb3IgaW50ZXJhY3RpdmUgb3IgYmF0Y2ggdXNlLgorCisKKzxwPgorTHVhIGlzIGZyZWUgc29mdHdhcmUsCithbmQgaXMgcHJvdmlkZWQgYXMgdXN1YWwgd2l0aCBubyBndWFyYW50ZWVzLAorYXMgc3RhdGVkIGluIGl0cyBsaWNlbnNlLgorVGhlIGltcGxlbWVudGF0aW9uIGRlc2NyaWJlZCBpbiB0aGlzIG1hbnVhbCBpcyBhdmFpbGFibGUKK2F0IEx1YSdzIG9mZmljaWFsIHdlYiBzaXRlLCA8Y29kZT53d3cubHVhLm9yZzwvY29kZT4uCisKKworPHA+CitMaWtlIGFueSBvdGhlciByZWZlcmVuY2UgbWFudWFsLAordGhpcyBkb2N1bWVudCBpcyBkcnkgaW4gcGxhY2VzLgorRm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGUgZGVjaXNpb25zIGJlaGluZCB0aGUgZGVzaWduIG9mIEx1YSwKK3NlZSB0aGUgdGVjaG5pY2FsIHBhcGVycyBhdmFpbGFibGUgYXQgTHVhJ3Mgd2ViIHNpdGUuCitGb3IgYSBkZXRhaWxlZCBpbnRyb2R1Y3Rpb24gdG8gcHJvZ3JhbW1pbmcgaW4gTHVhLAorc2VlIFJvYmVydG8ncyBib29rLCA8ZW0+UHJvZ3JhbW1pbmcgaW4gTHVhPC9lbT4uCisKKworCis8aDE+MiAmbmRhc2g7IDxhIG5hbWU9IjIiPkJhc2ljIENvbmNlcHRzPC9hPjwvaDE+CisKKzxwPgorVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgYmFzaWMgY29uY2VwdHMgb2YgdGhlIGxhbmd1YWdlLgorCisKKworPGgyPjIuMSAmbmRhc2g7IDxhIG5hbWU9IjIuMSI+VmFsdWVzIGFuZCBUeXBlczwvYT48L2gyPgorCis8cD4KK0x1YSBpcyBhIDxlbT5keW5hbWljYWxseSB0eXBlZCBsYW5ndWFnZTwvZW0+LgorVGhpcyBtZWFucyB0aGF0Cit2YXJpYWJsZXMgZG8gbm90IGhhdmUgdHlwZXM7IG9ubHkgdmFsdWVzIGRvLgorVGhlcmUgYXJlIG5vIHR5cGUgZGVmaW5pdGlvbnMgaW4gdGhlIGxhbmd1YWdlLgorQWxsIHZhbHVlcyBjYXJyeSB0aGVpciBvd24gdHlwZS4KKworCis8cD4KK0FsbCB2YWx1ZXMgaW4gTHVhIGFyZSA8ZW0+Zmlyc3QtY2xhc3MgdmFsdWVzPC9lbT4uCitUaGlzIG1lYW5zIHRoYXQgYWxsIHZhbHVlcyBjYW4gYmUgc3RvcmVkIGluIHZhcmlhYmxlcywKK3Bhc3NlZCBhcyBhcmd1bWVudHMgdG8gb3RoZXIgZnVuY3Rpb25zLCBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0cy4KKworCis8cD4KK1RoZXJlIGFyZSBlaWdodCBiYXNpYyB0eXBlcyBpbiBMdWE6Cis8ZW0+bmlsPC9lbT4sIDxlbT5ib29sZWFuPC9lbT4sIDxlbT5udW1iZXI8L2VtPiwKKzxlbT5zdHJpbmc8L2VtPiwgPGVtPmZ1bmN0aW9uPC9lbT4sIDxlbT51c2VyZGF0YTwvZW0+LAorPGVtPnRocmVhZDwvZW0+LCBhbmQgPGVtPnRhYmxlPC9lbT4uCis8ZW0+TmlsPC9lbT4gaXMgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIDxiPm5pbDwvYj4sCit3aG9zZSBtYWluIHByb3BlcnR5IGlzIHRvIGJlIGRpZmZlcmVudCBmcm9tIGFueSBvdGhlciB2YWx1ZTsKK2l0IHVzdWFsbHkgcmVwcmVzZW50cyB0aGUgYWJzZW5jZSBvZiBhIHVzZWZ1bCB2YWx1ZS4KKzxlbT5Cb29sZWFuPC9lbT4gaXMgdGhlIHR5cGUgb2YgdGhlIHZhbHVlcyA8Yj5mYWxzZTwvYj4gYW5kIDxiPnRydWU8L2I+LgorQm90aCA8Yj5uaWw8L2I+IGFuZCA8Yj5mYWxzZTwvYj4gbWFrZSBhIGNvbmRpdGlvbiBmYWxzZTsKK2FueSBvdGhlciB2YWx1ZSBtYWtlcyBpdCB0cnVlLgorPGVtPk51bWJlcjwvZW0+IHJlcHJlc2VudHMgcmVhbCAoZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCkgbnVtYmVycy4KK09wZXJhdGlvbnMgb24gbnVtYmVycyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMgb2YKK3RoZSB1bmRlcmx5aW5nIEMmbmJzcDtpbXBsZW1lbnRhdGlvbiwKK3doaWNoLCBpbiB0dXJuLCB1c3VhbGx5IGZvbGxvd3MgdGhlIElFRUUgNzU0IHN0YW5kYXJkLgorKEl0IGlzIGVhc3kgdG8gYnVpbGQgTHVhIGludGVycHJldGVycyB0aGF0IHVzZSBvdGhlcgoraW50ZXJuYWwgcmVwcmVzZW50YXRpb25zIGZvciBudW1iZXJzLAorc3VjaCBhcyBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0cyBvciBsb25nIGludGVnZXJzOworc2VlIGZpbGUgPGNvZGU+bHVhY29uZi5oPC9jb2RlPi4pCis8ZW0+U3RyaW5nPC9lbT4gcmVwcmVzZW50cyBpbW11dGFibGUgc2VxdWVuY2VzIG9mIGJ5dGVzLgorCitMdWEgaXMgOC1iaXQgY2xlYW46CitzdHJpbmdzIGNhbiBjb250YWluIGFueSA4LWJpdCB2YWx1ZSwKK2luY2x1ZGluZyBlbWJlZGRlZCB6ZXJvcyAoJzxjb2RlPlwwPC9jb2RlPicpLgorCisKKzxwPgorTHVhIGNhbiBjYWxsIChhbmQgbWFuaXB1bGF0ZSkgZnVuY3Rpb25zIHdyaXR0ZW4gaW4gTHVhIGFuZAorZnVuY3Rpb25zIHdyaXR0ZW4gaW4gQworKHNlZSA8YSBocmVmPSIjMy40LjkiPiZzZWN0OzMuNC45PC9hPikuCisKKworPHA+CitUaGUgdHlwZSA8ZW0+dXNlcmRhdGE8L2VtPiBpcyBwcm92aWRlZCB0byBhbGxvdyBhcmJpdHJhcnkgQyZuYnNwO2RhdGEgdG8KK2JlIHN0b3JlZCBpbiBMdWEgdmFyaWFibGVzLgorQSB1c2VyZGF0YSB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiByYXcgbWVtb3J5LgorVGhlcmUgYXJlIHR3byBraW5kcyBvZiB1c2VyZGF0YToKK2Z1bGwgdXNlcmRhdGEsIHdoZXJlIHRoZSBibG9jayBvZiBtZW1vcnkgaXMgbWFuYWdlZCBieSBMdWEsCithbmQgbGlnaHQgdXNlcmRhdGEsIHdoZXJlIHRoZSBibG9jayBvZiBtZW1vcnkgaXMgbWFuYWdlZCBieSB0aGUgaG9zdC4KK1VzZXJkYXRhIGhhcyBubyBwcmVkZWZpbmVkIG9wZXJhdGlvbnMgaW4gTHVhLAorZXhjZXB0IGFzc2lnbm1lbnQgYW5kIGlkZW50aXR5IHRlc3QuCitCeSB1c2luZyA8ZW0+bWV0YXRhYmxlczwvZW0+LAordGhlIHByb2dyYW1tZXIgY2FuIGRlZmluZSBvcGVyYXRpb25zIGZvciBmdWxsIHVzZXJkYXRhIHZhbHVlcworKHNlZSA8YSBocmVmPSIjMi40Ij4mc2VjdDsyLjQ8L2E+KS4KK1VzZXJkYXRhIHZhbHVlcyBjYW5ub3QgYmUgY3JlYXRlZCBvciBtb2RpZmllZCBpbiBMdWEsCitvbmx5IHRocm91Z2ggdGhlIEMmbmJzcDtBUEkuCitUaGlzIGd1YXJhbnRlZXMgdGhlIGludGVncml0eSBvZiBkYXRhIG93bmVkIGJ5IHRoZSBob3N0IHByb2dyYW0uCisKKworPHA+CitUaGUgdHlwZSA8ZW0+dGhyZWFkPC9lbT4gcmVwcmVzZW50cyBpbmRlcGVuZGVudCB0aHJlYWRzIG9mIGV4ZWN1dGlvbgorYW5kIGl0IGlzIHVzZWQgdG8gaW1wbGVtZW50IGNvcm91dGluZXMgKHNlZSA8YSBocmVmPSIjMi42Ij4mc2VjdDsyLjY8L2E+KS4KK0RvIG5vdCBjb25mdXNlIEx1YSB0aHJlYWRzIHdpdGggb3BlcmF0aW5nLXN5c3RlbSB0aHJlYWRzLgorTHVhIHN1cHBvcnRzIGNvcm91dGluZXMgb24gYWxsIHN5c3RlbXMsCitldmVuIHRob3NlIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhyZWFkcy4KKworCis8cD4KK1RoZSB0eXBlIDxlbT50YWJsZTwvZW0+IGltcGxlbWVudHMgYXNzb2NpYXRpdmUgYXJyYXlzLAordGhhdCBpcywgYXJyYXlzIHRoYXQgY2FuIGJlIGluZGV4ZWQgbm90IG9ubHkgd2l0aCBudW1iZXJzLAorYnV0IHdpdGggYW55IEx1YSB2YWx1ZSBleGNlcHQgPGI+bmlsPC9iPiBhbmQgTmFOCisoPGVtPk5vdCBhIE51bWJlcjwvZW0+LCBhIHNwZWNpYWwgbnVtZXJpYyB2YWx1ZSB1c2VkIHRvIHJlcHJlc2VudAordW5kZWZpbmVkIG9yIHVucmVwcmVzZW50YWJsZSByZXN1bHRzLCBzdWNoIGFzIDxjb2RlPjAvMDwvY29kZT4pLgorVGFibGVzIGNhbiBiZSA8ZW0+aGV0ZXJvZ2VuZW91czwvZW0+OwordGhhdCBpcywgdGhleSBjYW4gY29udGFpbiB2YWx1ZXMgb2YgYWxsIHR5cGVzIChleGNlcHQgPGI+bmlsPC9iPikuCitBbnkga2V5IHdpdGggdmFsdWUgPGI+bmlsPC9iPiBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSB0YWJsZS4KK0NvbnZlcnNlbHksIGFueSBrZXkgdGhhdCBpcyBub3QgcGFydCBvZiBhIHRhYmxlIGhhcworYW4gYXNzb2NpYXRlZCB2YWx1ZSA8Yj5uaWw8L2I+LgorCisKKzxwPgorVGFibGVzIGFyZSB0aGUgc29sZSBkYXRhIHN0cnVjdHVyaW5nIG1lY2hhbmlzbSBpbiBMdWE7Cit0aGV5IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBvcmRpbmFyeSBhcnJheXMsIHNlcXVlbmNlcywKK3N5bWJvbCB0YWJsZXMsIHNldHMsIHJlY29yZHMsIGdyYXBocywgdHJlZXMsIGV0Yy4KK1RvIHJlcHJlc2VudCByZWNvcmRzLCBMdWEgdXNlcyB0aGUgZmllbGQgbmFtZSBhcyBhbiBpbmRleC4KK1RoZSBsYW5ndWFnZSBzdXBwb3J0cyB0aGlzIHJlcHJlc2VudGF0aW9uIGJ5Citwcm92aWRpbmcgPGNvZGU+YS5uYW1lPC9jb2RlPiBhcyBzeW50YWN0aWMgc3VnYXIgZm9yIDxjb2RlPmFbIm5hbWUiXTwvY29kZT4uCitUaGVyZSBhcmUgc2V2ZXJhbCBjb252ZW5pZW50IHdheXMgdG8gY3JlYXRlIHRhYmxlcyBpbiBMdWEKKyhzZWUgPGEgaHJlZj0iIzMuNC44Ij4mc2VjdDszLjQuODwvYT4pLgorCisKKzxwPgorV2UgdXNlIHRoZSB0ZXJtIDxlbT5zZXF1ZW5jZTwvZW0+IHRvIGRlbm90ZSBhIHRhYmxlIHdoZXJlCit0aGUgc2V0IG9mIGFsbCBwb3NpdGl2ZSBudW1lcmljIGtleXMgaXMgZXF1YWwgdG8gPGVtPnsxLi5ufTwvZW0+Citmb3Igc29tZSBpbnRlZ2VyIDxlbT5uPC9lbT4sCit3aGljaCBpcyBjYWxsZWQgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgKHNlZSA8YSBocmVmPSIjMy40LjYiPiZzZWN0OzMuNC42PC9hPikuCisKKworPHA+CitMaWtlIGluZGljZXMsCit0aGUgdmFsdWVzIG9mIHRhYmxlIGZpZWxkcyBjYW4gYmUgb2YgYW55IHR5cGUuCitJbiBwYXJ0aWN1bGFyLAorYmVjYXVzZSBmdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIHZhbHVlcywKK3RhYmxlIGZpZWxkcyBjYW4gY29udGFpbiBmdW5jdGlvbnMuCitUaHVzIHRhYmxlcyBjYW4gYWxzbyBjYXJyeSA8ZW0+bWV0aG9kczwvZW0+IChzZWUgPGEgaHJlZj0iIzMuNC4xMCI+JnNlY3Q7My40LjEwPC9hPikuCisKKworPHA+CitUaGUgaW5kZXhpbmcgb2YgdGFibGVzIGZvbGxvd3MKK3RoZSBkZWZpbml0aW9uIG9mIHJhdyBlcXVhbGl0eSBpbiB0aGUgbGFuZ3VhZ2UuCitUaGUgZXhwcmVzc2lvbnMgPGNvZGU+YVtpXTwvY29kZT4gYW5kIDxjb2RlPmFbal08L2NvZGU+CitkZW5vdGUgdGhlIHNhbWUgdGFibGUgZWxlbWVudAoraWYgYW5kIG9ubHkgaWYgPGNvZGU+aTwvY29kZT4gYW5kIDxjb2RlPmo8L2NvZGU+IGFyZSByYXcgZXF1YWwKKyh0aGF0IGlzLCBlcXVhbCB3aXRob3V0IG1ldGFtZXRob2RzKS4KKworCis8cD4KK1RhYmxlcywgZnVuY3Rpb25zLCB0aHJlYWRzLCBhbmQgKGZ1bGwpIHVzZXJkYXRhIHZhbHVlcyBhcmUgPGVtPm9iamVjdHM8L2VtPjoKK3ZhcmlhYmxlcyBkbyBub3QgYWN0dWFsbHkgPGVtPmNvbnRhaW48L2VtPiB0aGVzZSB2YWx1ZXMsCitvbmx5IDxlbT5yZWZlcmVuY2VzPC9lbT4gdG8gdGhlbS4KK0Fzc2lnbm1lbnQsIHBhcmFtZXRlciBwYXNzaW5nLCBhbmQgZnVuY3Rpb24gcmV0dXJucworYWx3YXlzIG1hbmlwdWxhdGUgcmVmZXJlbmNlcyB0byBzdWNoIHZhbHVlczsKK3RoZXNlIG9wZXJhdGlvbnMgZG8gbm90IGltcGx5IGFueSBraW5kIG9mIGNvcHkuCisKKworPHA+CitUaGUgbGlicmFyeSBmdW5jdGlvbiA8YSBocmVmPSIjcGRmLXR5cGUiPjxjb2RlPnR5cGU8L2NvZGU+PC9hPiByZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHR5cGUKK29mIGEgZ2l2ZW4gdmFsdWUgKHNlZSA8YSBocmVmPSIjNi4xIj4mc2VjdDs2LjE8L2E+KS4KKworCisKKworCis8aDI+Mi4yICZuZGFzaDsgPGEgbmFtZT0iMi4yIj5FbnZpcm9ubWVudHMgYW5kIHRoZSBHbG9iYWwgRW52aXJvbm1lbnQ8L2E+PC9oMj4KKworPHA+CitBcyB3aWxsIGJlIGRpc2N1c3NlZCBpbiA8YSBocmVmPSIjMy4yIj4mc2VjdDszLjI8L2E+IGFuZCA8YSBocmVmPSIjMy4zLjMiPiZzZWN0OzMuMy4zPC9hPiwKK2FueSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgbmFtZSA8Y29kZT52YXI8L2NvZGU+IGlzIHN5bnRhY3RpY2FsbHkgdHJhbnNsYXRlZAordG8gPGNvZGU+X0VOVi52YXI8L2NvZGU+LgorTW9yZW92ZXIsIGV2ZXJ5IGNodW5rIGlzIGNvbXBpbGVkIGluIHRoZSBzY29wZSBvZgorYW4gZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGUgY2FsbGVkIDxjb2RlPl9FTlY8L2NvZGU+IChzZWUgPGEgaHJlZj0iIzMuMy4yIj4mc2VjdDszLjMuMjwvYT4pLAorc28gPGNvZGU+X0VOVjwvY29kZT4gaXRzZWxmIGlzIG5ldmVyIGEgZ2xvYmFsIG5hbWUgaW4gYSBjaHVuay4KKworCis8cD4KK0Rlc3BpdGUgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIGV4dGVybmFsIDxjb2RlPl9FTlY8L2NvZGU+IHZhcmlhYmxlIGFuZAordGhlIHRyYW5zbGF0aW9uIG9mIGdsb2JhbCBuYW1lcywKKzxjb2RlPl9FTlY8L2NvZGU+IGlzIGEgY29tcGxldGVseSByZWd1bGFyIG5hbWUuCitJbiBwYXJ0aWN1bGFyLAoreW91IGNhbiBkZWZpbmUgbmV3IHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycyB3aXRoIHRoYXQgbmFtZS4KK0VhY2ggcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIG5hbWUgdXNlcyB0aGUgPGNvZGU+X0VOVjwvY29kZT4gdGhhdCBpcwordmlzaWJsZSBhdCB0aGF0IHBvaW50IGluIHRoZSBwcm9ncmFtLAorZm9sbG93aW5nIHRoZSB1c3VhbCB2aXNpYmlsaXR5IHJ1bGVzIG9mIEx1YSAoc2VlIDxhIGhyZWY9IiMzLjUiPiZzZWN0OzMuNTwvYT4pLgorCisKKzxwPgorQW55IHRhYmxlIHVzZWQgYXMgdGhlIHZhbHVlIG9mIDxjb2RlPl9FTlY8L2NvZGU+IGlzIGNhbGxlZCBhbiA8ZW0+ZW52aXJvbm1lbnQ8L2VtPi4KKworCis8cD4KK0x1YSBrZWVwcyBhIGRpc3Rpbmd1aXNoZWQgZW52aXJvbm1lbnQgY2FsbGVkIHRoZSA8ZW0+Z2xvYmFsIGVudmlyb25tZW50PC9lbT4uCitUaGlzIHZhbHVlIGlzIGtlcHQgYXQgYSBzcGVjaWFsIGluZGV4IGluIHRoZSBDIHJlZ2lzdHJ5IChzZWUgPGEgaHJlZj0iIzQuNSI+JnNlY3Q7NC41PC9hPikuCitJbiBMdWEsIHRoZSB2YXJpYWJsZSA8YSBocmVmPSIjcGRmLV9HIj48Y29kZT5fRzwvY29kZT48L2E+IGlzIGluaXRpYWxpemVkIHdpdGggdGhpcyBzYW1lIHZhbHVlLgorCisKKzxwPgorV2hlbiBMdWEgY29tcGlsZXMgYSBjaHVuaywKK2l0IGluaXRpYWxpemVzIHRoZSB2YWx1ZSBvZiBpdHMgPGNvZGU+X0VOVjwvY29kZT4gdXB2YWx1ZQord2l0aCB0aGUgZ2xvYmFsIGVudmlyb25tZW50IChzZWUgPGEgaHJlZj0iI3BkZi1sb2FkIj48Y29kZT5sb2FkPC9jb2RlPjwvYT4pLgorVGhlcmVmb3JlLCBieSBkZWZhdWx0LAorZ2xvYmFsIHZhcmlhYmxlcyBpbiBMdWEgY29kZSByZWZlciB0byBlbnRyaWVzIGluIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQuCitNb3Jlb3ZlciwgYWxsIHN0YW5kYXJkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGluIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQKK2FuZCBzZXZlcmFsIGZ1bmN0aW9ucyB0aGVyZSBvcGVyYXRlIG9uIHRoYXQgZW52aXJvbm1lbnQuCitZb3UgY2FuIHVzZSA8YSBocmVmPSIjcGRmLWxvYWQiPjxjb2RlPmxvYWQ8L2NvZGU+PC9hPiAob3IgPGEgaHJlZj0iI3BkZi1sb2FkZmlsZSI+PGNvZGU+bG9hZGZpbGU8L2NvZGU+PC9hPikKK3RvIGxvYWQgYSBjaHVuayB3aXRoIGEgZGlmZmVyZW50IGVudmlyb25tZW50LgorKEluIEMsIHlvdSBoYXZlIHRvIGxvYWQgdGhlIGNodW5rIGFuZCB0aGVuIGNoYW5nZSB0aGUgdmFsdWUKK29mIGl0cyBmaXJzdCB1cHZhbHVlLikKKworCis8cD4KK0lmIHlvdSBjaGFuZ2UgdGhlIGdsb2JhbCBlbnZpcm9ubWVudCBpbiB0aGUgcmVnaXN0cnkKKyh0aHJvdWdoIEMgY29kZSBvciB0aGUgZGVidWcgbGlicmFyeSksCithbGwgY2h1bmtzIGxvYWRlZCBhZnRlciB0aGUgY2hhbmdlIHdpbGwgZ2V0IHRoZSBuZXcgZW52aXJvbm1lbnQuCitQcmV2aW91c2x5IGxvYWRlZCBjaHVua3MgYXJlIG5vdCBhZmZlY3RlZCwgaG93ZXZlciwKK2FzIGVhY2ggaGFzIGl0cyBvd24gcmVmZXJlbmNlIHRvIHRoZSBlbnZpcm9ubWVudCBpbiBpdHMgPGNvZGU+X0VOVjwvY29kZT4gdmFyaWFibGUuCitNb3Jlb3ZlciwgdGhlIHZhcmlhYmxlIDxhIGhyZWY9IiNwZGYtX0ciPjxjb2RlPl9HPC9jb2RlPjwvYT4KKyh3aGljaCBpcyBzdG9yZWQgaW4gdGhlIG9yaWdpbmFsIGdsb2JhbCBlbnZpcm9ubWVudCkKK2lzIG5ldmVyIHVwZGF0ZWQgYnkgTHVhLgorCisKKworCisKKzxoMj4yLjMgJm5kYXNoOyA8YSBuYW1lPSIyLjMiPkVycm9yIEhhbmRsaW5nPC9hPjwvaDI+CisKKzxwPgorQmVjYXVzZSBMdWEgaXMgYW4gZW1iZWRkZWQgZXh0ZW5zaW9uIGxhbmd1YWdlLAorYWxsIEx1YSBhY3Rpb25zIHN0YXJ0IGZyb20gQyZuYnNwO2NvZGUgaW4gdGhlIGhvc3QgcHJvZ3JhbQorY2FsbGluZyBhIGZ1bmN0aW9uIGZyb20gdGhlIEx1YSBsaWJyYXJ5IChzZWUgPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4pLgorV2hlbmV2ZXIgYW4gZXJyb3Igb2NjdXJzIGR1cmluZwordGhlIGNvbXBpbGF0aW9uIG9yIGV4ZWN1dGlvbiBvZiBhIEx1YSBjaHVuaywKK2NvbnRyb2wgcmV0dXJucyB0byB0aGUgaG9zdCwKK3doaWNoIGNhbiB0YWtlIGFwcHJvcHJpYXRlIG1lYXN1cmVzCisoc3VjaCBhcyBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlKS4KKworCis8cD4KK0x1YSBjb2RlIGNhbiBleHBsaWNpdGx5IGdlbmVyYXRlIGFuIGVycm9yIGJ5IGNhbGxpbmcgdGhlCis8YSBocmVmPSIjcGRmLWVycm9yIj48Y29kZT5lcnJvcjwvY29kZT48L2E+IGZ1bmN0aW9uLgorSWYgeW91IG5lZWQgdG8gY2F0Y2ggZXJyb3JzIGluIEx1YSwKK3lvdSBjYW4gdXNlIDxhIGhyZWY9IiNwZGYtcGNhbGwiPjxjb2RlPnBjYWxsPC9jb2RlPjwvYT4gb3IgPGEgaHJlZj0iI3BkZi14cGNhbGwiPjxjb2RlPnhwY2FsbDwvY29kZT48L2E+Cit0byBjYWxsIGEgZ2l2ZW4gZnVuY3Rpb24gaW4gPGVtPnByb3RlY3RlZCBtb2RlPC9lbT4uCisKKworPHA+CitXaGVuZXZlciB0aGVyZSBpcyBhbiBlcnJvciwKK2FuIDxlbT5lcnJvciBvYmplY3Q8L2VtPiAoYWxzbyBjYWxsZWQgYW4gPGVtPmVycm9yIG1lc3NhZ2U8L2VtPikKK2lzIHByb3BhZ2F0ZWQgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuCitMdWEgaXRzZWxmIG9ubHkgZ2VuZXJhdGVzIGVycm9ycyB3aGVyZSB0aGUgZXJyb3Igb2JqZWN0IGlzIGEgc3RyaW5nLAorYnV0IHByb2dyYW1zIG1heSBnZW5lcmF0ZSBlcnJvcnMgd2l0aAorYW55IHZhbHVlIGZvciB0aGUgZXJyb3Igb2JqZWN0LgorCisKKzxwPgorV2hlbiB5b3UgdXNlIDxhIGhyZWY9IiNwZGYteHBjYWxsIj48Y29kZT54cGNhbGw8L2NvZGU+PC9hPiBvciA8YSBocmVmPSIjbHVhX3BjYWxsIj48Y29kZT5sdWFfcGNhbGw8L2NvZGU+PC9hPiwKK3lvdSBtYXkgZ2l2ZSBhIDxlbT5tZXNzYWdlIGhhbmRsZXI8L2VtPgordG8gYmUgY2FsbGVkIGluIGNhc2Ugb2YgZXJyb3JzLgorVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZQorYW5kIHJldHVybnMgYSBuZXcgZXJyb3IgbWVzc2FnZS4KK0l0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIGVycm9yIHVud2luZHMgdGhlIHN0YWNrLAorc28gdGhhdCBpdCBjYW4gZ2F0aGVyIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yLAorZm9yIGluc3RhbmNlIGJ5IGluc3BlY3RpbmcgdGhlIHN0YWNrIGFuZCBjcmVhdGluZyBhIHN0YWNrIHRyYWNlYmFjay4KK1RoaXMgbWVzc2FnZSBoYW5kbGVyIGlzIHN0aWxsIHByb3RlY3RlZCBieSB0aGUgcHJvdGVjdGVkIGNhbGw7CitzbywgYW4gZXJyb3IgaW5zaWRlIHRoZSBtZXNzYWdlIGhhbmRsZXIKK3dpbGwgY2FsbCB0aGUgbWVzc2FnZSBoYW5kbGVyIGFnYWluLgorSWYgdGhpcyBsb29wIGdvZXMgb24sIEx1YSBicmVha3MgaXQgYW5kIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZS4KKworCisKKworCis8aDI+Mi40ICZuZGFzaDsgPGEgbmFtZT0iMi40Ij5NZXRhdGFibGVzIGFuZCBNZXRhbWV0aG9kczwvYT48L2gyPgorCis8cD4KK0V2ZXJ5IHZhbHVlIGluIEx1YSBjYW4gaGF2ZSBhIDxlbT5tZXRhdGFibGU8L2VtPi4KK1RoaXMgPGVtPm1ldGF0YWJsZTwvZW0+IGlzIGFuIG9yZGluYXJ5IEx1YSB0YWJsZQordGhhdCBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiB0aGUgb3JpZ2luYWwgdmFsdWUKK3VuZGVyIGNlcnRhaW4gc3BlY2lhbCBvcGVyYXRpb25zLgorWW91IGNhbiBjaGFuZ2Ugc2V2ZXJhbCBhc3BlY3RzIG9mIHRoZSBiZWhhdmlvcgorb2Ygb3BlcmF0aW9ucyBvdmVyIGEgdmFsdWUgYnkgc2V0dGluZyBzcGVjaWZpYyBmaWVsZHMgaW4gaXRzIG1ldGF0YWJsZS4KK0ZvciBpbnN0YW5jZSwgd2hlbiBhIG5vbi1udW1lcmljIHZhbHVlIGlzIHRoZSBvcGVyYW5kIG9mIGFuIGFkZGl0aW9uLAorTHVhIGNoZWNrcyBmb3IgYSBmdW5jdGlvbiBpbiB0aGUgZmllbGQgIjxjb2RlPl9fYWRkPC9jb2RlPiIgb2YgdGhlIHZhbHVlJ3MgbWV0YXRhYmxlLgorSWYgaXQgZmluZHMgb25lLAorTHVhIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYWRkaXRpb24uCisKKworPHA+CitUaGUga2V5cyBpbiBhIG1ldGF0YWJsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSA8ZW0+ZXZlbnQ8L2VtPiBuYW1lczsKK3RoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBhcmUgY2FsbGVkIDxlbT5tZXRhbWV0aG9kczwvZW0+LgorSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRoZSBldmVudCBpcyA8Y29kZT4iYWRkIjwvY29kZT4KK2FuZCB0aGUgbWV0YW1ldGhvZCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyB0aGUgYWRkaXRpb24uCisKKworPHA+CitZb3UgY2FuIHF1ZXJ5IHRoZSBtZXRhdGFibGUgb2YgYW55IHZhbHVlCit1c2luZyB0aGUgPGEgaHJlZj0iI3BkZi1nZXRtZXRhdGFibGUiPjxjb2RlPmdldG1ldGF0YWJsZTwvY29kZT48L2E+IGZ1bmN0aW9uLgorCisKKzxwPgorWW91IGNhbiByZXBsYWNlIHRoZSBtZXRhdGFibGUgb2YgdGFibGVzCit1c2luZyB0aGUgPGEgaHJlZj0iI3BkZi1zZXRtZXRhdGFibGUiPjxjb2RlPnNldG1ldGF0YWJsZTwvY29kZT48L2E+IGZ1bmN0aW9uLgorWW91IGNhbm5vdCBjaGFuZ2UgdGhlIG1ldGF0YWJsZSBvZiBvdGhlciB0eXBlcyBmcm9tIEx1YQorKGV4Y2VwdCBieSB1c2luZyB0aGUgZGVidWcgbGlicmFyeSk7Cit5b3UgbXVzdCB1c2UgdGhlIEMmbmJzcDtBUEkgZm9yIHRoYXQuCisKKworPHA+CitUYWJsZXMgYW5kIGZ1bGwgdXNlcmRhdGEgaGF2ZSBpbmRpdmlkdWFsIG1ldGF0YWJsZXMKKyhhbHRob3VnaCBtdWx0aXBsZSB0YWJsZXMgYW5kIHVzZXJkYXRhIGNhbiBzaGFyZSB0aGVpciBtZXRhdGFibGVzKS4KK1ZhbHVlcyBvZiBhbGwgb3RoZXIgdHlwZXMgc2hhcmUgb25lIHNpbmdsZSBtZXRhdGFibGUgcGVyIHR5cGU7Cit0aGF0IGlzLCB0aGVyZSBpcyBvbmUgc2luZ2xlIG1ldGF0YWJsZSBmb3IgYWxsIG51bWJlcnMsCitvbmUgZm9yIGFsbCBzdHJpbmdzLCBldGMuCitCeSBkZWZhdWx0LCBhIHZhbHVlIGhhcyBubyBtZXRhdGFibGUsCitidXQgdGhlIHN0cmluZyBsaWJyYXJ5IHNldHMgYSBtZXRhdGFibGUgZm9yIHRoZSBzdHJpbmcgdHlwZSAoc2VlIDxhIGhyZWY9IiM2LjQiPiZzZWN0OzYuNDwvYT4pLgorCisKKzxwPgorQSBtZXRhdGFibGUgY29udHJvbHMgaG93IGFuIG9iamVjdCBiZWhhdmVzIGluIGFyaXRobWV0aWMgb3BlcmF0aW9ucywKK29yZGVyIGNvbXBhcmlzb25zLCBjb25jYXRlbmF0aW9uLCBsZW5ndGggb3BlcmF0aW9uLCBhbmQgaW5kZXhpbmcuCitBIG1ldGF0YWJsZSBhbHNvIGNhbiBkZWZpbmUgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQKK3doZW4gYSB1c2VyZGF0YSBvciBhIHRhYmxlIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorV2hlbiBMdWEgcGVyZm9ybXMgb25lIG9mIHRoZXNlIG9wZXJhdGlvbnMgb3ZlciBhIHZhbHVlLAoraXQgY2hlY2tzIHdoZXRoZXIgdGhpcyB2YWx1ZSBoYXMgYSBtZXRhdGFibGUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBldmVudC4KK0lmIHNvLCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQga2V5ICh0aGUgbWV0YW1ldGhvZCkKK2NvbnRyb2xzIGhvdyBMdWEgd2lsbCBwZXJmb3JtIHRoZSBvcGVyYXRpb24uCisKKworPHA+CitNZXRhdGFibGVzIGNvbnRyb2wgdGhlIG9wZXJhdGlvbnMgbGlzdGVkIG5leHQuCitFYWNoIG9wZXJhdGlvbiBpcyBpZGVudGlmaWVkIGJ5IGl0cyBjb3JyZXNwb25kaW5nIG5hbWUuCitUaGUga2V5IGZvciBlYWNoIG9wZXJhdGlvbiBpcyBhIHN0cmluZyB3aXRoIGl0cyBuYW1lIHByZWZpeGVkIGJ5Cit0d28gdW5kZXJzY29yZXMsICc8Y29kZT5fXzwvY29kZT4nOworZm9yIGluc3RhbmNlLCB0aGUga2V5IGZvciBvcGVyYXRpb24gImFkZCIgaXMgdGhlCitzdHJpbmcgIjxjb2RlPl9fYWRkPC9jb2RlPiIuCisKKworPHA+CitUaGUgc2VtYW50aWNzIG9mIHRoZXNlIG9wZXJhdGlvbnMgaXMgYmV0dGVyIGV4cGxhaW5lZCBieSBhIEx1YSBmdW5jdGlvbgorZGVzY3JpYmluZyBob3cgdGhlIGludGVycHJldGVyIGV4ZWN1dGVzIHRoZSBvcGVyYXRpb24uCitUaGUgY29kZSBzaG93biBoZXJlIGluIEx1YSBpcyBvbmx5IGlsbHVzdHJhdGl2ZTsKK3RoZSByZWFsIGJlaGF2aW9yIGlzIGhhcmQgY29kZWQgaW4gdGhlIGludGVycHJldGVyCithbmQgaXQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuIHRoaXMgc2ltdWxhdGlvbi4KK0FsbCBmdW5jdGlvbnMgdXNlZCBpbiB0aGVzZSBkZXNjcmlwdGlvbnMKKyg8YSBocmVmPSIjcGRmLXJhd2dldCI+PGNvZGU+cmF3Z2V0PC9jb2RlPjwvYT4sIDxhIGhyZWY9IiNwZGYtdG9udW1iZXIiPjxjb2RlPnRvbnVtYmVyPC9jb2RlPjwvYT4sIGV0Yy4pCithcmUgZGVzY3JpYmVkIGluIDxhIGhyZWY9IiM2LjEiPiZzZWN0OzYuMTwvYT4uCitJbiBwYXJ0aWN1bGFyLCB0byByZXRyaWV2ZSB0aGUgbWV0YW1ldGhvZCBvZiBhIGdpdmVuIG9iamVjdCwKK3dlIHVzZSB0aGUgZXhwcmVzc2lvbgorCis8cHJlPgorICAgICBtZXRhdGFibGUob2JqKVtldmVudF0KKzwvcHJlPjxwPgorVGhpcyBzaG91bGQgYmUgcmVhZCBhcworCis8cHJlPgorICAgICByYXdnZXQoZ2V0bWV0YXRhYmxlKG9iaikgb3Ige30sIGV2ZW50KQorPC9wcmU+PHA+CitUaGlzIG1lYW5zIHRoYXQgdGhlIGFjY2VzcyB0byBhIG1ldGFtZXRob2QgZG9lcyBub3QgaW52b2tlIG90aGVyIG1ldGFtZXRob2RzLAorYW5kIGFjY2VzcyB0byBvYmplY3RzIHdpdGggbm8gbWV0YXRhYmxlcyBkb2VzIG5vdCBmYWlsCisoaXQgc2ltcGx5IHJlc3VsdHMgaW4gPGI+bmlsPC9iPikuCisKKworPHA+CitGb3IgdGhlIHVuYXJ5IDxjb2RlPi08L2NvZGU+IGFuZCA8Y29kZT4jPC9jb2RlPiBvcGVyYXRvcnMsCit0aGUgbWV0YW1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIGR1bW15IHNlY29uZCBhcmd1bWVudC4KK1RoaXMgZXh0cmEgYXJndW1lbnQgaXMgb25seSB0byBzaW1wbGlmeSBMdWEncyBpbnRlcm5hbHM7CitpdCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMgYW5kIHRoZXJlZm9yZSBpdCBpcyBub3QgcHJlc2VudAoraW4gdGhlIGZvbGxvd2luZyBjb2RlLgorKEZvciBtb3N0IHVzZXMgdGhpcyBleHRyYSBhcmd1bWVudCBpcyBpcnJlbGV2YW50LikKKworCisKKzx1bD4KKworPGxpPjxiPiJhZGQiOiA8L2I+Cit0aGUgPGNvZGU+KzwvY29kZT4gb3BlcmF0aW9uLgorCisKKworPHA+CitUaGUgZnVuY3Rpb24gPGNvZGU+Z2V0YmluaGFuZGxlcjwvY29kZT4gYmVsb3cgZGVmaW5lcyBob3cgTHVhIGNob29zZXMgYSBoYW5kbGVyCitmb3IgYSBiaW5hcnkgb3BlcmF0aW9uLgorRmlyc3QsIEx1YSB0cmllcyB0aGUgZmlyc3Qgb3BlcmFuZC4KK0lmIGl0cyB0eXBlIGRvZXMgbm90IGRlZmluZSBhIGhhbmRsZXIgZm9yIHRoZSBvcGVyYXRpb24sCit0aGVuIEx1YSB0cmllcyB0aGUgc2Vjb25kIG9wZXJhbmQuCisKKzxwcmU+CisgICAgIGZ1bmN0aW9uIGdldGJpbmhhbmRsZXIgKG9wMSwgb3AyLCBldmVudCkKKyAgICAgICByZXR1cm4gbWV0YXRhYmxlKG9wMSlbZXZlbnRdIG9yIG1ldGF0YWJsZShvcDIpW2V2ZW50XQorICAgICBlbmQKKzwvcHJlPjxwPgorQnkgdXNpbmcgdGhpcyBmdW5jdGlvbiwKK3RoZSBiZWhhdmlvciBvZiB0aGUgPGNvZGU+b3AxICsgb3AyPC9jb2RlPiBpcworCis8cHJlPgorICAgICBmdW5jdGlvbiBhZGRfZXZlbnQgKG9wMSwgb3AyKQorICAgICAgIGxvY2FsIG8xLCBvMiA9IHRvbnVtYmVyKG9wMSksIHRvbnVtYmVyKG9wMikKKyAgICAgICBpZiBvMSBhbmQgbzIgdGhlbiAgLS0gYm90aCBvcGVyYW5kcyBhcmUgbnVtZXJpYz8KKyAgICAgICAgIHJldHVybiBvMSArIG8yICAgLS0gJysnIGhlcmUgaXMgdGhlIHByaW1pdGl2ZSAnYWRkJworICAgICAgIGVsc2UgIC0tIGF0IGxlYXN0IG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgbm90IG51bWVyaWMKKyAgICAgICAgIGxvY2FsIGggPSBnZXRiaW5oYW5kbGVyKG9wMSwgb3AyLCAiX19hZGQiKQorICAgICAgICAgaWYgaCB0aGVuCisgICAgICAgICAgIC0tIGNhbGwgdGhlIGhhbmRsZXIgd2l0aCBib3RoIG9wZXJhbmRzCisgICAgICAgICAgIHJldHVybiAoaChvcDEsIG9wMikpCisgICAgICAgICBlbHNlICAtLSBubyBoYW5kbGVyIGF2YWlsYWJsZTogZGVmYXVsdCBiZWhhdmlvcgorICAgICAgICAgICBlcnJvcigmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspCisgICAgICAgICBlbmQKKyAgICAgICBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KKzwvbGk+CisKKzxsaT48Yj4ic3ViIjogPC9iPgordGhlIDxjb2RlPi08L2NvZGU+IG9wZXJhdGlvbi4KKworQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgImFkZCIgb3BlcmF0aW9uLgorPC9saT4KKworPGxpPjxiPiJtdWwiOiA8L2I+Cit0aGUgPGNvZGU+KjwvY29kZT4gb3BlcmF0aW9uLgorCitCZWhhdmlvciBzaW1pbGFyIHRvIHRoZSAiYWRkIiBvcGVyYXRpb24uCis8L2xpPgorCis8bGk+PGI+ImRpdiI6IDwvYj4KK3RoZSA8Y29kZT4vPC9jb2RlPiBvcGVyYXRpb24uCisKK0JlaGF2aW9yIHNpbWlsYXIgdG8gdGhlICJhZGQiIG9wZXJhdGlvbi4KKzwvbGk+CisKKzxsaT48Yj4ibW9kIjogPC9iPgordGhlIDxjb2RlPiU8L2NvZGU+IG9wZXJhdGlvbi4KKworQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgImFkZCIgb3BlcmF0aW9uLAord2l0aCB0aGUgb3BlcmF0aW9uCis8Y29kZT5vMSAtIGZsb29yKG8xL28yKSpvMjwvY29kZT4gYXMgdGhlIHByaW1pdGl2ZSBvcGVyYXRpb24uCis8L2xpPgorCis8bGk+PGI+InBvdyI6IDwvYj4KK3RoZSA8Y29kZT5ePC9jb2RlPiAoZXhwb25lbnRpYXRpb24pIG9wZXJhdGlvbi4KKworQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgImFkZCIgb3BlcmF0aW9uLAord2l0aCB0aGUgZnVuY3Rpb24gPGNvZGU+cG93PC9jb2RlPiAoZnJvbSB0aGUgQyZuYnNwO21hdGggbGlicmFyeSkKK2FzIHRoZSBwcmltaXRpdmUgb3BlcmF0aW9uLgorPC9saT4KKworPGxpPjxiPiJ1bm0iOiA8L2I+Cit0aGUgdW5hcnkgPGNvZGU+LTwvY29kZT4gb3BlcmF0aW9uLgorCisKKzxwcmU+CisgICAgIGZ1bmN0aW9uIHVubV9ldmVudCAob3ApCisgICAgICAgbG9jYWwgbyA9IHRvbnVtYmVyKG9wKQorICAgICAgIGlmIG8gdGhlbiAgLS0gb3BlcmFuZCBpcyBudW1lcmljPworICAgICAgICAgcmV0dXJuIC1vICAtLSAnLScgaGVyZSBpcyB0aGUgcHJpbWl0aXZlICd1bm0nCisgICAgICAgZWxzZSAgLS0gdGhlIG9wZXJhbmQgaXMgbm90IG51bWVyaWMuCisgICAgICAgICAtLSBUcnkgdG8gZ2V0IGEgaGFuZGxlciBmcm9tIHRoZSBvcGVyYW5kCisgICAgICAgICBsb2NhbCBoID0gbWV0YXRhYmxlKG9wKS5fX3VubQorICAgICAgICAgaWYgaCB0aGVuCisgICAgICAgICAgIC0tIGNhbGwgdGhlIGhhbmRsZXIgd2l0aCB0aGUgb3BlcmFuZAorICAgICAgICAgICByZXR1cm4gKGgob3ApKQorICAgICAgICAgZWxzZSAgLS0gbm8gaGFuZGxlciBhdmFpbGFibGU6IGRlZmF1bHQgYmVoYXZpb3IKKyAgICAgICAgICAgZXJyb3IoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KQorICAgICAgICAgZW5kCisgICAgICAgZW5kCisgICAgIGVuZAorPC9wcmU+PHA+Cis8L2xpPgorCis8bGk+PGI+ImNvbmNhdCI6IDwvYj4KK3RoZSA8Y29kZT4uLjwvY29kZT4gKGNvbmNhdGVuYXRpb24pIG9wZXJhdGlvbi4KKworCis8cHJlPgorICAgICBmdW5jdGlvbiBjb25jYXRfZXZlbnQgKG9wMSwgb3AyKQorICAgICAgIGlmICh0eXBlKG9wMSkgPT0gInN0cmluZyIgb3IgdHlwZShvcDEpID09ICJudW1iZXIiKSBhbmQKKyAgICAgICAgICAodHlwZShvcDIpID09ICJzdHJpbmciIG9yIHR5cGUob3AyKSA9PSAibnVtYmVyIikgdGhlbgorICAgICAgICAgcmV0dXJuIG9wMSAuLiBvcDIgIC0tIHByaW1pdGl2ZSBzdHJpbmcgY29uY2F0ZW5hdGlvbgorICAgICAgIGVsc2UKKyAgICAgICAgIGxvY2FsIGggPSBnZXRiaW5oYW5kbGVyKG9wMSwgb3AyLCAiX19jb25jYXQiKQorICAgICAgICAgaWYgaCB0aGVuCisgICAgICAgICAgIHJldHVybiAoaChvcDEsIG9wMikpCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGVycm9yKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OykKKyAgICAgICAgIGVuZAorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorPC9saT4KKworPGxpPjxiPiJsZW4iOiA8L2I+Cit0aGUgPGNvZGU+IzwvY29kZT4gb3BlcmF0aW9uLgorCisKKzxwcmU+CisgICAgIGZ1bmN0aW9uIGxlbl9ldmVudCAob3ApCisgICAgICAgaWYgdHlwZShvcCkgPT0gInN0cmluZyIgdGhlbgorICAgICAgICAgcmV0dXJuIHN0cmxlbihvcCkgICAgICAtLSBwcmltaXRpdmUgc3RyaW5nIGxlbmd0aAorICAgICAgIGVsc2UKKyAgICAgICAgIGxvY2FsIGggPSBtZXRhdGFibGUob3ApLl9fbGVuCisgICAgICAgICBpZiBoIHRoZW4KKyAgICAgICAgICAgcmV0dXJuIChoKG9wKSkgICAgICAgLS0gY2FsbCBoYW5kbGVyIHdpdGggdGhlIG9wZXJhbmQKKyAgICAgICAgIGVsc2VpZiB0eXBlKG9wKSA9PSAidGFibGUiIHRoZW4KKyAgICAgICAgICAgcmV0dXJuICNvcCAgICAgICAgICAgICAgLS0gcHJpbWl0aXZlIHRhYmxlIGxlbmd0aAorICAgICAgICAgZWxzZSAgLS0gbm8gaGFuZGxlciBhdmFpbGFibGU6IGVycm9yCisgICAgICAgICAgIGVycm9yKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OykKKyAgICAgICAgIGVuZAorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorU2VlIDxhIGhyZWY9IiMzLjQuNiI+JnNlY3Q7My40LjY8L2E+IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsZW5ndGggb2YgYSB0YWJsZS4KKzwvbGk+CisKKzxsaT48Yj4iZXEiOiA8L2I+Cit0aGUgPGNvZGU+PT08L2NvZGU+IG9wZXJhdGlvbi4KKworVGhlIGZ1bmN0aW9uIDxjb2RlPmdldGVxdWFsaGFuZGxlcjwvY29kZT4gZGVmaW5lcyBob3cgTHVhIGNob29zZXMgYSBtZXRhbWV0aG9kCitmb3IgZXF1YWxpdHkuCitBIG1ldGFtZXRob2QgaXMgc2VsZWN0ZWQgb25seSB3aGVuIGJvdGggdmFsdWVzCitiZWluZyBjb21wYXJlZCBoYXZlIHRoZSBzYW1lIHR5cGUKK2FuZCB0aGUgc2FtZSBtZXRhbWV0aG9kIGZvciB0aGUgc2VsZWN0ZWQgb3BlcmF0aW9uLAorYW5kIHRoZSB2YWx1ZXMgYXJlIGVpdGhlciB0YWJsZXMgb3IgZnVsbCB1c2VyZGF0YS4KKworPHByZT4KKyAgICAgZnVuY3Rpb24gZ2V0ZXF1YWxoYW5kbGVyIChvcDEsIG9wMikKKyAgICAgICBpZiB0eXBlKG9wMSkgfj0gdHlwZShvcDIpIG9yCisgICAgICAgICAgKHR5cGUob3AxKSB+PSAidGFibGUiIGFuZCB0eXBlKG9wMSkgfj0gInVzZXJkYXRhIikgdGhlbgorICAgICAgICAgcmV0dXJuIG5pbCAgICAgLS0gZGlmZmVyZW50IHZhbHVlcworICAgICAgIGVuZAorICAgICAgIGxvY2FsIG1tMSA9IG1ldGF0YWJsZShvcDEpLl9fZXEKKyAgICAgICBsb2NhbCBtbTIgPSBtZXRhdGFibGUob3AyKS5fX2VxCisgICAgICAgaWYgbW0xID09IG1tMiB0aGVuIHJldHVybiBtbTEgZWxzZSByZXR1cm4gbmlsIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorVGhlICJlcSIgZXZlbnQgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCis8cHJlPgorICAgICBmdW5jdGlvbiBlcV9ldmVudCAob3AxLCBvcDIpCisgICAgICAgaWYgb3AxID09IG9wMiB0aGVuICAgLS0gcHJpbWl0aXZlIGVxdWFsPworICAgICAgICAgcmV0dXJuIHRydWUgICAtLSB2YWx1ZXMgYXJlIGVxdWFsCisgICAgICAgZW5kCisgICAgICAgLS0gdHJ5IG1ldGFtZXRob2QKKyAgICAgICBsb2NhbCBoID0gZ2V0ZXF1YWxoYW5kbGVyKG9wMSwgb3AyKQorICAgICAgIGlmIGggdGhlbgorICAgICAgICAgcmV0dXJuIG5vdCBub3QgaChvcDEsIG9wMikKKyAgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KK05vdGUgdGhhdCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBhIGJvb2xlYW4uCis8L2xpPgorCis8bGk+PGI+Imx0IjogPC9iPgordGhlIDxjb2RlPiZsdDs8L2NvZGU+IG9wZXJhdGlvbi4KKworCis8cHJlPgorICAgICBmdW5jdGlvbiBsdF9ldmVudCAob3AxLCBvcDIpCisgICAgICAgaWYgdHlwZShvcDEpID09ICJudW1iZXIiIGFuZCB0eXBlKG9wMikgPT0gIm51bWJlciIgdGhlbgorICAgICAgICAgcmV0dXJuIG9wMSAmbHQ7IG9wMiAgIC0tIG51bWVyaWMgY29tcGFyaXNvbgorICAgICAgIGVsc2VpZiB0eXBlKG9wMSkgPT0gInN0cmluZyIgYW5kIHR5cGUob3AyKSA9PSAic3RyaW5nIiB0aGVuCisgICAgICAgICByZXR1cm4gb3AxICZsdDsgb3AyICAgLS0gbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uCisgICAgICAgZWxzZQorICAgICAgICAgbG9jYWwgaCA9IGdldGJpbmhhbmRsZXIob3AxLCBvcDIsICJfX2x0IikKKyAgICAgICAgIGlmIGggdGhlbgorICAgICAgICAgICByZXR1cm4gbm90IG5vdCBoKG9wMSwgb3AyKQorICAgICAgICAgZWxzZQorICAgICAgICAgICBlcnJvcigmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspCisgICAgICAgICBlbmQKKyAgICAgICBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KK05vdGUgdGhhdCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBhIGJvb2xlYW4uCis8L2xpPgorCis8bGk+PGI+ImxlIjogPC9iPgordGhlIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRpb24uCisKKworPHByZT4KKyAgICAgZnVuY3Rpb24gbGVfZXZlbnQgKG9wMSwgb3AyKQorICAgICAgIGlmIHR5cGUob3AxKSA9PSAibnVtYmVyIiBhbmQgdHlwZShvcDIpID09ICJudW1iZXIiIHRoZW4KKyAgICAgICAgIHJldHVybiBvcDEgJmx0Oz0gb3AyICAgLS0gbnVtZXJpYyBjb21wYXJpc29uCisgICAgICAgZWxzZWlmIHR5cGUob3AxKSA9PSAic3RyaW5nIiBhbmQgdHlwZShvcDIpID09ICJzdHJpbmciIHRoZW4KKyAgICAgICAgIHJldHVybiBvcDEgJmx0Oz0gb3AyICAgLS0gbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uCisgICAgICAgZWxzZQorICAgICAgICAgbG9jYWwgaCA9IGdldGJpbmhhbmRsZXIob3AxLCBvcDIsICJfX2xlIikKKyAgICAgICAgIGlmIGggdGhlbgorICAgICAgICAgICByZXR1cm4gbm90IG5vdCBoKG9wMSwgb3AyKQorICAgICAgICAgZWxzZQorICAgICAgICAgICBoID0gZ2V0YmluaGFuZGxlcihvcDEsIG9wMiwgIl9fbHQiKQorICAgICAgICAgICBpZiBoIHRoZW4KKyAgICAgICAgICAgICByZXR1cm4gbm90IGgob3AyLCBvcDEpCisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBlcnJvcigmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspCisgICAgICAgICAgIGVuZAorICAgICAgICAgZW5kCisgICAgICAgZW5kCisgICAgIGVuZAorPC9wcmU+PHA+CitOb3RlIHRoYXQsIGluIHRoZSBhYnNlbmNlIG9mIGEgImxlIiBtZXRhbWV0aG9kLAorTHVhIHRyaWVzIHRoZSAibHQiLCBhc3N1bWluZyB0aGF0IDxjb2RlPmEgJmx0Oz0gYjwvY29kZT4gaXMKK2VxdWl2YWxlbnQgdG8gPGNvZGU+bm90IChiICZsdDsgYSk8L2NvZGU+LgorCisKKzxwPgorQXMgd2l0aCB0aGUgb3RoZXIgY29tcGFyaXNvbiBvcGVyYXRvcnMsCit0aGUgcmVzdWx0IGlzIGFsd2F5cyBhIGJvb2xlYW4uCis8L2xpPgorCis8bGk+PGI+ImluZGV4IjogPC9iPgorVGhlIGluZGV4aW5nIGFjY2VzcyA8Y29kZT50YWJsZVtrZXldPC9jb2RlPi4KK05vdGUgdGhhdCB0aGUgbWV0YW1ldGhvZCBpcyB0cmllZCBvbmx5Cit3aGVuIDxjb2RlPmtleTwvY29kZT4gaXMgbm90IHByZXNlbnQgaW4gPGNvZGU+dGFibGU8L2NvZGU+LgorKFdoZW4gPGNvZGU+dGFibGU8L2NvZGU+IGlzIG5vdCBhIHRhYmxlLAorbm8ga2V5IGlzIGV2ZXIgcHJlc2VudCwKK3NvIHRoZSBtZXRhbWV0aG9kIGlzIGFsd2F5cyB0cmllZC4pCisKKworPHByZT4KKyAgICAgZnVuY3Rpb24gZ2V0dGFibGVfZXZlbnQgKHRhYmxlLCBrZXkpCisgICAgICAgbG9jYWwgaAorICAgICAgIGlmIHR5cGUodGFibGUpID09ICJ0YWJsZSIgdGhlbgorICAgICAgICAgbG9jYWwgdiA9IHJhd2dldCh0YWJsZSwga2V5KQorICAgICAgICAgLS0gaWYga2V5IGlzIHByZXNlbnQsIHJldHVybiByYXcgdmFsdWUKKyAgICAgICAgIGlmIHYgfj0gbmlsIHRoZW4gcmV0dXJuIHYgZW5kCisgICAgICAgICBoID0gbWV0YXRhYmxlKHRhYmxlKS5fX2luZGV4CisgICAgICAgICBpZiBoID09IG5pbCB0aGVuIHJldHVybiBuaWwgZW5kCisgICAgICAgZWxzZQorICAgICAgICAgaCA9IG1ldGF0YWJsZSh0YWJsZSkuX19pbmRleAorICAgICAgICAgaWYgaCA9PSBuaWwgdGhlbgorICAgICAgICAgICBlcnJvcigmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspCisgICAgICAgICBlbmQKKyAgICAgICBlbmQKKyAgICAgICBpZiB0eXBlKGgpID09ICJmdW5jdGlvbiIgdGhlbgorICAgICAgICAgcmV0dXJuIChoKHRhYmxlLCBrZXkpKSAgICAgLS0gY2FsbCB0aGUgaGFuZGxlcgorICAgICAgIGVsc2UgcmV0dXJuIGhba2V5XSAgICAgICAgICAgLS0gb3IgcmVwZWF0IG9wZXJhdGlvbiBvbiBpdAorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPjxwPgorPC9saT4KKworPGxpPjxiPiJuZXdpbmRleCI6IDwvYj4KK1RoZSBpbmRleGluZyBhc3NpZ25tZW50IDxjb2RlPnRhYmxlW2tleV0gPSB2YWx1ZTwvY29kZT4uCitOb3RlIHRoYXQgdGhlIG1ldGFtZXRob2QgaXMgdHJpZWQgb25seQord2hlbiA8Y29kZT5rZXk8L2NvZGU+IGlzIG5vdCBwcmVzZW50IGluIDxjb2RlPnRhYmxlPC9jb2RlPi4KKworCis8cHJlPgorICAgICBmdW5jdGlvbiBzZXR0YWJsZV9ldmVudCAodGFibGUsIGtleSwgdmFsdWUpCisgICAgICAgbG9jYWwgaAorICAgICAgIGlmIHR5cGUodGFibGUpID09ICJ0YWJsZSIgdGhlbgorICAgICAgICAgbG9jYWwgdiA9IHJhd2dldCh0YWJsZSwga2V5KQorICAgICAgICAgLS0gaWYga2V5IGlzIHByZXNlbnQsIGRvIHJhdyBhc3NpZ25tZW50CisgICAgICAgICBpZiB2IH49IG5pbCB0aGVuIHJhd3NldCh0YWJsZSwga2V5LCB2YWx1ZSk7IHJldHVybiBlbmQKKyAgICAgICAgIGggPSBtZXRhdGFibGUodGFibGUpLl9fbmV3aW5kZXgKKyAgICAgICAgIGlmIGggPT0gbmlsIHRoZW4gcmF3c2V0KHRhYmxlLCBrZXksIHZhbHVlKTsgcmV0dXJuIGVuZAorICAgICAgIGVsc2UKKyAgICAgICAgIGggPSBtZXRhdGFibGUodGFibGUpLl9fbmV3aW5kZXgKKyAgICAgICAgIGlmIGggPT0gbmlsIHRoZW4KKyAgICAgICAgICAgZXJyb3IoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KQorICAgICAgICAgZW5kCisgICAgICAgZW5kCisgICAgICAgaWYgdHlwZShoKSA9PSAiZnVuY3Rpb24iIHRoZW4KKyAgICAgICAgIGgodGFibGUsIGtleSx2YWx1ZSkgICAgICAgICAgIC0tIGNhbGwgdGhlIGhhbmRsZXIKKyAgICAgICBlbHNlIGhba2V5XSA9IHZhbHVlICAgICAgICAgICAgIC0tIG9yIHJlcGVhdCBvcGVyYXRpb24gb24gaXQKKyAgICAgICBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KKzwvbGk+CisKKzxsaT48Yj4iY2FsbCI6IDwvYj4KK2NhbGxlZCB3aGVuIEx1YSBjYWxscyBhIHZhbHVlLgorCisKKzxwcmU+CisgICAgIGZ1bmN0aW9uIGZ1bmN0aW9uX2V2ZW50IChmdW5jLCAuLi4pCisgICAgICAgaWYgdHlwZShmdW5jKSA9PSAiZnVuY3Rpb24iIHRoZW4KKyAgICAgICAgIHJldHVybiBmdW5jKC4uLikgICAtLSBwcmltaXRpdmUgY2FsbAorICAgICAgIGVsc2UKKyAgICAgICAgIGxvY2FsIGggPSBtZXRhdGFibGUoZnVuYykuX19jYWxsCisgICAgICAgICBpZiBoIHRoZW4KKyAgICAgICAgICAgcmV0dXJuIGgoZnVuYywgLi4uKQorICAgICAgICAgZWxzZQorICAgICAgICAgICBlcnJvcigmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspCisgICAgICAgICBlbmQKKyAgICAgICBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KKzwvbGk+CisKKzwvdWw+CisKKworCisKKzxoMj4yLjUgJm5kYXNoOyA8YSBuYW1lPSIyLjUiPkdhcmJhZ2UgQ29sbGVjdGlvbjwvYT48L2gyPgorCis8cD4KK0x1YSBwZXJmb3JtcyBhdXRvbWF0aWMgbWVtb3J5IG1hbmFnZW1lbnQuCitUaGlzIG1lYW5zIHRoYXQKK3lvdSBoYXZlIHRvIHdvcnJ5IG5laXRoZXIgYWJvdXQgYWxsb2NhdGluZyBtZW1vcnkgZm9yIG5ldyBvYmplY3RzCitub3IgYWJvdXQgZnJlZWluZyBpdCB3aGVuIHRoZSBvYmplY3RzIGFyZSBubyBsb25nZXIgbmVlZGVkLgorTHVhIG1hbmFnZXMgbWVtb3J5IGF1dG9tYXRpY2FsbHkgYnkgcnVubmluZworYSA8ZW0+Z2FyYmFnZSBjb2xsZWN0b3I8L2VtPiB0byBjb2xsZWN0IGFsbCA8ZW0+ZGVhZCBvYmplY3RzPC9lbT4KKyh0aGF0IGlzLCBvYmplY3RzIHRoYXQgYXJlIG5vIGxvbmdlciBhY2Nlc3NpYmxlIGZyb20gTHVhKS4KK0FsbCBtZW1vcnkgdXNlZCBieSBMdWEgaXMgc3ViamVjdCB0byBhdXRvbWF0aWMgbWFuYWdlbWVudDoKK3N0cmluZ3MsIHRhYmxlcywgdXNlcmRhdGEsIGZ1bmN0aW9ucywgdGhyZWFkcywgaW50ZXJuYWwgc3RydWN0dXJlcywgZXRjLgorCisKKzxwPgorTHVhIGltcGxlbWVudHMgYW4gaW5jcmVtZW50YWwgbWFyay1hbmQtc3dlZXAgY29sbGVjdG9yLgorSXQgdXNlcyB0d28gbnVtYmVycyB0byBjb250cm9sIGl0cyBnYXJiYWdlLWNvbGxlY3Rpb24gY3ljbGVzOgordGhlIDxlbT5nYXJiYWdlLWNvbGxlY3RvciBwYXVzZTwvZW0+IGFuZAordGhlIDxlbT5nYXJiYWdlLWNvbGxlY3RvciBzdGVwIG11bHRpcGxpZXI8L2VtPi4KK0JvdGggdXNlIHBlcmNlbnRhZ2UgcG9pbnRzIGFzIHVuaXRzCisoZS5nLiwgYSB2YWx1ZSBvZiAxMDAgbWVhbnMgYW4gaW50ZXJuYWwgdmFsdWUgb2YgMSkuCisKKworPHA+CitUaGUgZ2FyYmFnZS1jb2xsZWN0b3IgcGF1c2UKK2NvbnRyb2xzIGhvdyBsb25nIHRoZSBjb2xsZWN0b3Igd2FpdHMgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IGN5Y2xlLgorTGFyZ2VyIHZhbHVlcyBtYWtlIHRoZSBjb2xsZWN0b3IgbGVzcyBhZ2dyZXNzaXZlLgorVmFsdWVzIHNtYWxsZXIgdGhhbiAxMDAgbWVhbiB0aGUgY29sbGVjdG9yIHdpbGwgbm90IHdhaXQgdG8KK3N0YXJ0IGEgbmV3IGN5Y2xlLgorQSB2YWx1ZSBvZiAyMDAgbWVhbnMgdGhhdCB0aGUgY29sbGVjdG9yIHdhaXRzIGZvciB0aGUgdG90YWwgbWVtb3J5IGluIHVzZQordG8gZG91YmxlIGJlZm9yZSBzdGFydGluZyBhIG5ldyBjeWNsZS4KKworCis8cD4KK1RoZSBnYXJiYWdlLWNvbGxlY3RvciBzdGVwIG11bHRpcGxpZXIKK2NvbnRyb2xzIHRoZSByZWxhdGl2ZSBzcGVlZCBvZiB0aGUgY29sbGVjdG9yIHJlbGF0aXZlIHRvCittZW1vcnkgYWxsb2NhdGlvbi4KK0xhcmdlciB2YWx1ZXMgbWFrZSB0aGUgY29sbGVjdG9yIG1vcmUgYWdncmVzc2l2ZSBidXQgYWxzbyBpbmNyZWFzZQordGhlIHNpemUgb2YgZWFjaCBpbmNyZW1lbnRhbCBzdGVwLgorVmFsdWVzIHNtYWxsZXIgdGhhbiAxMDAgbWFrZSB0aGUgY29sbGVjdG9yIHRvbyBzbG93IGFuZAorY2FuIHJlc3VsdCBpbiB0aGUgY29sbGVjdG9yIG5ldmVyIGZpbmlzaGluZyBhIGN5Y2xlLgorVGhlIGRlZmF1bHQgaXMgMjAwLAord2hpY2ggbWVhbnMgdGhhdCB0aGUgY29sbGVjdG9yIHJ1bnMgYXQgInR3aWNlIgordGhlIHNwZWVkIG9mIG1lbW9yeSBhbGxvY2F0aW9uLgorCisKKzxwPgorSWYgeW91IHNldCB0aGUgc3RlcCBtdWx0aXBsaWVyIHRvIGEgdmVyeSBsYXJnZSBudW1iZXIKKyhsYXJnZXIgdGhhbiAxMCUgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mCitieXRlcyB0aGF0IHRoZSBwcm9ncmFtIG1heSB1c2UpLAordGhlIGNvbGxlY3RvciBiZWhhdmVzIGxpa2UgYSBzdG9wLXRoZS13b3JsZCBjb2xsZWN0b3IuCitJZiB5b3UgdGhlbiBzZXQgdGhlIHBhdXNlIHRvIDIwMCwKK3RoZSBjb2xsZWN0b3IgYmVoYXZlcyBhcyBpbiBvbGQgTHVhIHZlcnNpb25zLAorZG9pbmcgYSBjb21wbGV0ZSBjb2xsZWN0aW9uIGV2ZXJ5IHRpbWUgTHVhIGRvdWJsZXMgaXRzCittZW1vcnkgdXNhZ2UuCisKKworPHA+CitZb3UgY2FuIGNoYW5nZSB0aGVzZSBudW1iZXJzIGJ5IGNhbGxpbmcgPGEgaHJlZj0iI2x1YV9nYyI+PGNvZGU+bHVhX2djPC9jb2RlPjwvYT4gaW4gQworb3IgPGEgaHJlZj0iI3BkZi1jb2xsZWN0Z2FyYmFnZSI+PGNvZGU+Y29sbGVjdGdhcmJhZ2U8L2NvZGU+PC9hPiBpbiBMdWEuCitZb3UgY2FuIGFsc28gdXNlIHRoZXNlIGZ1bmN0aW9ucyB0byBjb250cm9sCit0aGUgY29sbGVjdG9yIGRpcmVjdGx5IChlLmcuLCBzdG9wIGFuZCByZXN0YXJ0IGl0KS4KKworCis8cD4KK0FzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGluIEx1YSA1LjIsCit5b3UgY2FuIGNoYW5nZSB0aGUgY29sbGVjdG9yJ3Mgb3BlcmF0aW9uIG1vZGUKK2Zyb20gaW5jcmVtZW50YWwgdG8gPGVtPmdlbmVyYXRpb25hbDwvZW0+LgorQSA8ZW0+Z2VuZXJhdGlvbmFsIGNvbGxlY3RvcjwvZW0+IGFzc3VtZXMgdGhhdCBtb3N0IG9iamVjdHMgZGllIHlvdW5nLAorYW5kIHRoZXJlZm9yZSBpdCB0cmF2ZXJzZXMgb25seSB5b3VuZyAocmVjZW50bHkgY3JlYXRlZCkgb2JqZWN0cy4KK1RoaXMgYmVoYXZpb3IgY2FuIHJlZHVjZSB0aGUgdGltZSB1c2VkIGJ5IHRoZSBjb2xsZWN0b3IsCitidXQgYWxzbyBpbmNyZWFzZXMgbWVtb3J5IHVzYWdlIChhcyBvbGQgZGVhZCBvYmplY3RzIG1heSBhY2N1bXVsYXRlKS4KK1RvIG1pdGlnYXRlIHRoaXMgc2Vjb25kIHByb2JsZW0sCitmcm9tIHRpbWUgdG8gdGltZSB0aGUgZ2VuZXJhdGlvbmFsIGNvbGxlY3RvciBwZXJmb3JtcyBhIGZ1bGwgY29sbGVjdGlvbi4KK1JlbWVtYmVyIHRoYXQgdGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZTsKK3lvdSBhcmUgd2VsY29tZSB0byB0cnkgaXQsCitidXQgY2hlY2sgeW91ciBnYWlucy4KKworCisKKzxoMz4yLjUuMSAmbmRhc2g7IDxhIG5hbWU9IjIuNS4xIj5HYXJiYWdlLUNvbGxlY3Rpb24gTWV0YW1ldGhvZHM8L2E+PC9oMz4KKworPHA+CitZb3UgY2FuIHNldCBnYXJiYWdlLWNvbGxlY3RvciBtZXRhbWV0aG9kcyBmb3IgdGFibGVzCithbmQsIHVzaW5nIHRoZSBDJm5ic3A7QVBJLAorZm9yIGZ1bGwgdXNlcmRhdGEgKHNlZSA8YSBocmVmPSIjMi40Ij4mc2VjdDsyLjQ8L2E+KS4KK1RoZXNlIG1ldGFtZXRob2RzIGFyZSBhbHNvIGNhbGxlZCA8ZW0+ZmluYWxpemVyczwvZW0+LgorRmluYWxpemVycyBhbGxvdyB5b3UgdG8gY29vcmRpbmF0ZSBMdWEncyBnYXJiYWdlIGNvbGxlY3Rpb24KK3dpdGggZXh0ZXJuYWwgcmVzb3VyY2UgbWFuYWdlbWVudAorKHN1Y2ggYXMgY2xvc2luZyBmaWxlcywgbmV0d29yayBvciBkYXRhYmFzZSBjb25uZWN0aW9ucywKK29yIGZyZWVpbmcgeW91ciBvd24gbWVtb3J5KS4KKworCis8cD4KK0ZvciBhbiBvYmplY3QgKHRhYmxlIG9yIHVzZXJkYXRhKSB0byBiZSBmaW5hbGl6ZWQgd2hlbiBjb2xsZWN0ZWQsCit5b3UgbXVzdCA8ZW0+bWFyazwvZW0+IGl0IGZvciBmaW5hbGl6YXRpb24uCisKK1lvdSBtYXJrIGFuIG9iamVjdCBmb3IgZmluYWxpemF0aW9uIHdoZW4geW91IHNldCBpdHMgbWV0YXRhYmxlCithbmQgdGhlIG1ldGF0YWJsZSBoYXMgYSBmaWVsZCBpbmRleGVkIGJ5IHRoZSBzdHJpbmcgIjxjb2RlPl9fZ2M8L2NvZGU+Ii4KK05vdGUgdGhhdCBpZiB5b3Ugc2V0IGEgbWV0YXRhYmxlIHdpdGhvdXQgYSA8Y29kZT5fX2djPC9jb2RlPiBmaWVsZAorYW5kIGxhdGVyIGNyZWF0ZSB0aGF0IGZpZWxkIGluIHRoZSBtZXRhdGFibGUsCit0aGUgb2JqZWN0IHdpbGwgbm90IGJlIG1hcmtlZCBmb3IgZmluYWxpemF0aW9uLgorSG93ZXZlciwgYWZ0ZXIgYW4gb2JqZWN0IGlzIG1hcmtlZCwKK3lvdSBjYW4gZnJlZWx5IGNoYW5nZSB0aGUgPGNvZGU+X19nYzwvY29kZT4gZmllbGQgb2YgaXRzIG1ldGF0YWJsZS4KKworCis8cD4KK1doZW4gYSBtYXJrZWQgb2JqZWN0IGJlY29tZXMgZ2FyYmFnZSwKK2l0IGlzIG5vdCBjb2xsZWN0ZWQgaW1tZWRpYXRlbHkgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorSW5zdGVhZCwgTHVhIHB1dHMgaXQgaW4gYSBsaXN0LgorQWZ0ZXIgdGhlIGNvbGxlY3Rpb24sCitMdWEgZG9lcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uCitmb3IgZWFjaCBvYmplY3QgaW4gdGhhdCBsaXN0OgorCis8cHJlPgorICAgICBmdW5jdGlvbiBnY19ldmVudCAob2JqKQorICAgICAgIGxvY2FsIGggPSBtZXRhdGFibGUob2JqKS5fX2djCisgICAgICAgaWYgdHlwZShoKSA9PSAiZnVuY3Rpb24iIHRoZW4KKyAgICAgICAgIGgob2JqKQorICAgICAgIGVuZAorICAgICBlbmQKKzwvcHJlPgorCis8cD4KK0F0IHRoZSBlbmQgb2YgZWFjaCBnYXJiYWdlLWNvbGxlY3Rpb24gY3ljbGUsCit0aGUgZmluYWxpemVycyBmb3Igb2JqZWN0cyBhcmUgY2FsbGVkIGluCit0aGUgcmV2ZXJzZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBtYXJrZWQgZm9yIGNvbGxlY3Rpb24sCithbW9uZyB0aG9zZSBjb2xsZWN0ZWQgaW4gdGhhdCBjeWNsZTsKK3RoYXQgaXMsIHRoZSBmaXJzdCBmaW5hbGl6ZXIgdG8gYmUgY2FsbGVkIGlzIHRoZSBvbmUgYXNzb2NpYXRlZAord2l0aCB0aGUgb2JqZWN0IG1hcmtlZCBsYXN0IGluIHRoZSBwcm9ncmFtLgorVGhlIGV4ZWN1dGlvbiBvZiBlYWNoIGZpbmFsaXplciBtYXkgb2NjdXIgYXQgYW55IHBvaW50IGR1cmluZwordGhlIGV4ZWN1dGlvbiBvZiB0aGUgcmVndWxhciBjb2RlLgorCisKKzxwPgorQmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nIGNvbGxlY3RlZCBtdXN0IHN0aWxsIGJlIHVzZWQgYnkgdGhlIGZpbmFsaXplciwKK2l0IChhbmQgb3RoZXIgb2JqZWN0cyBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBpdCkKK211c3QgYmUgPGVtPnJlc3VycmVjdGVkPC9lbT4gYnkgTHVhLgorVXN1YWxseSwgdGhpcyByZXN1cnJlY3Rpb24gaXMgdHJhbnNpZW50LAorYW5kIHRoZSBvYmplY3QgbWVtb3J5IGlzIGZyZWVkIGluIHRoZSBuZXh0IGdhcmJhZ2UtY29sbGVjdGlvbiBjeWNsZS4KK0hvd2V2ZXIsIGlmIHRoZSBmaW5hbGl6ZXIgc3RvcmVzIHRoZSBvYmplY3QgaW4gc29tZSBnbG9iYWwgcGxhY2UKKyhlLmcuLCBhIGdsb2JhbCB2YXJpYWJsZSksCit0aGVuIHRoZXJlIGlzIGEgcGVybWFuZW50IHJlc3VycmVjdGlvbi4KK0luIGFueSBjYXNlLAordGhlIG9iamVjdCBtZW1vcnkgaXMgZnJlZWQgb25seSB3aGVuIGl0IGJlY29tZXMgY29tcGxldGVseSBpbmFjY2Vzc2libGU7CitpdHMgZmluYWxpemVyIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIHR3aWNlLgorCisKKzxwPgorV2hlbiB5b3UgY2xvc2UgYSBzdGF0ZSAoc2VlIDxhIGhyZWY9IiNsdWFfY2xvc2UiPjxjb2RlPmx1YV9jbG9zZTwvY29kZT48L2E+KSwKK0x1YSBjYWxscyB0aGUgZmluYWxpemVycyBvZiBhbGwgb2JqZWN0cyBtYXJrZWQgZm9yIGZpbmFsaXphdGlvbiwKK2ZvbGxvd2luZyB0aGUgcmV2ZXJzZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBtYXJrZWQuCitJZiBhbnkgZmluYWxpemVyIG1hcmtzIG5ldyBvYmplY3RzIGZvciBjb2xsZWN0aW9uIGR1cmluZyB0aGF0IHBoYXNlLAordGhlc2UgbmV3IG9iamVjdHMgd2lsbCBub3QgYmUgZmluYWxpemVkLgorCisKKworCisKKzxoMz4yLjUuMiAmbmRhc2g7IDxhIG5hbWU9IjIuNS4yIj5XZWFrIFRhYmxlczwvYT48L2gzPgorCis8cD4KK0EgPGVtPndlYWsgdGFibGU8L2VtPiBpcyBhIHRhYmxlIHdob3NlIGVsZW1lbnRzIGFyZQorPGVtPndlYWsgcmVmZXJlbmNlczwvZW0+LgorQSB3ZWFrIHJlZmVyZW5jZSBpcyBpZ25vcmVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KK0luIG90aGVyIHdvcmRzLAoraWYgdGhlIG9ubHkgcmVmZXJlbmNlcyB0byBhbiBvYmplY3QgYXJlIHdlYWsgcmVmZXJlbmNlcywKK3RoZW4gdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgY29sbGVjdCB0aGF0IG9iamVjdC4KKworCis8cD4KK0Egd2VhayB0YWJsZSBjYW4gaGF2ZSB3ZWFrIGtleXMsIHdlYWsgdmFsdWVzLCBvciBib3RoLgorQSB0YWJsZSB3aXRoIHdlYWsga2V5cyBhbGxvd3MgdGhlIGNvbGxlY3Rpb24gb2YgaXRzIGtleXMsCitidXQgcHJldmVudHMgdGhlIGNvbGxlY3Rpb24gb2YgaXRzIHZhbHVlcy4KK0EgdGFibGUgd2l0aCBib3RoIHdlYWsga2V5cyBhbmQgd2VhayB2YWx1ZXMgYWxsb3dzIHRoZSBjb2xsZWN0aW9uIG9mCitib3RoIGtleXMgYW5kIHZhbHVlcy4KK0luIGFueSBjYXNlLCBpZiBlaXRoZXIgdGhlIGtleSBvciB0aGUgdmFsdWUgaXMgY29sbGVjdGVkLAordGhlIHdob2xlIHBhaXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0YWJsZS4KK1RoZSB3ZWFrbmVzcyBvZiBhIHRhYmxlIGlzIGNvbnRyb2xsZWQgYnkgdGhlCis8Y29kZT5fX21vZGU8L2NvZGU+IGZpZWxkIG9mIGl0cyBtZXRhdGFibGUuCitJZiB0aGUgPGNvZGU+X19tb2RlPC9jb2RlPiBmaWVsZCBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXImbmJzcDsnPGNvZGU+azwvY29kZT4nLAordGhlIGtleXMgaW4gdGhlIHRhYmxlIGFyZSB3ZWFrLgorSWYgPGNvZGU+X19tb2RlPC9jb2RlPiBjb250YWlucyAnPGNvZGU+djwvY29kZT4nLAordGhlIHZhbHVlcyBpbiB0aGUgdGFibGUgYXJlIHdlYWsuCisKKworPHA+CitBIHRhYmxlIHdpdGggd2VhayBrZXlzIGFuZCBzdHJvbmcgdmFsdWVzCitpcyBhbHNvIGNhbGxlZCBhbiA8ZW0+ZXBoZW1lcm9uIHRhYmxlPC9lbT4uCitJbiBhbiBlcGhlbWVyb24gdGFibGUsCithIHZhbHVlIGlzIGNvbnNpZGVyZWQgcmVhY2hhYmxlIG9ubHkgaWYgaXRzIGtleSBpcyByZWFjaGFibGUuCitJbiBwYXJ0aWN1bGFyLAoraWYgdGhlIG9ubHkgcmVmZXJlbmNlIHRvIGEga2V5IGNvbWVzIHRocm91Z2ggaXRzIHZhbHVlLAordGhlIHBhaXIgaXMgcmVtb3ZlZC4KKworCis8cD4KK0FueSBjaGFuZ2UgaW4gdGhlIHdlYWtuZXNzIG9mIGEgdGFibGUgbWF5IHRha2UgZWZmZWN0IG9ubHkKK2F0IHRoZSBuZXh0IGNvbGxlY3QgY3ljbGUuCitJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgY2hhbmdlIHRoZSB3ZWFrbmVzcyB0byBhIHN0cm9uZ2VyIG1vZGUsCitMdWEgbWF5IHN0aWxsIGNvbGxlY3Qgc29tZSBpdGVtcyBmcm9tIHRoYXQgdGFibGUKK2JlZm9yZSB0aGUgY2hhbmdlIHRha2VzIGVmZmVjdC4KKworCis8cD4KK09ubHkgb2JqZWN0cyB0aGF0IGhhdmUgYW4gZXhwbGljaXQgY29uc3RydWN0aW9uCithcmUgcmVtb3ZlZCBmcm9tIHdlYWsgdGFibGVzLgorVmFsdWVzLCBzdWNoIGFzIG51bWJlcnMgYW5kIGxpZ2h0IEMgZnVuY3Rpb25zLAorYXJlIG5vdCBzdWJqZWN0IHRvIGdhcmJhZ2UgY29sbGVjdGlvbiwKK2FuZCB0aGVyZWZvcmUgYXJlIG5vdCByZW1vdmVkIGZyb20gd2VhayB0YWJsZXMKKyh1bmxlc3MgaXRzIGFzc29jaWF0ZWQgdmFsdWUgaXMgY29sbGVjdGVkKS4KK0FsdGhvdWdoIHN0cmluZ3MgYXJlIHN1YmplY3QgdG8gZ2FyYmFnZSBjb2xsZWN0aW9uLAordGhleSBkbyBub3QgaGF2ZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3Rpb24sCithbmQgdGhlcmVmb3JlIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHdlYWsgdGFibGVzLgorCisKKzxwPgorUmVzdXJyZWN0ZWQgb2JqZWN0cworKHRoYXQgaXMsIG9iamVjdHMgYmVpbmcgZmluYWxpemVkCithbmQgb2JqZWN0cyBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBvYmplY3RzIGJlaW5nIGZpbmFsaXplZCkKK2hhdmUgYSBzcGVjaWFsIGJlaGF2aW9yIGluIHdlYWsgdGFibGVzLgorVGhleSBhcmUgcmVtb3ZlZCBmcm9tIHdlYWsgdmFsdWVzIGJlZm9yZSBydW5uaW5nIHRoZWlyIGZpbmFsaXplcnMsCitidXQgYXJlIHJlbW92ZWQgZnJvbSB3ZWFrIGtleXMgb25seSBpbiB0aGUgbmV4dCBjb2xsZWN0aW9uCithZnRlciBydW5uaW5nIHRoZWlyIGZpbmFsaXplcnMsIHdoZW4gc3VjaCBvYmplY3RzIGFyZSBhY3R1YWxseSBmcmVlZC4KK1RoaXMgYmVoYXZpb3IgYWxsb3dzIHRoZSBmaW5hbGl6ZXIgdG8gYWNjZXNzIHByb3BlcnRpZXMKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IHRocm91Z2ggd2VhayB0YWJsZXMuCisKKworPHA+CitJZiBhIHdlYWsgdGFibGUgaXMgYW1vbmcgdGhlIHJlc3VycmVjdGVkIG9iamVjdHMgaW4gYSBjb2xsZWN0aW9uIGN5Y2xlLAoraXQgbWF5IG5vdCBiZSBwcm9wZXJseSBjbGVhcmVkIHVudGlsIHRoZSBuZXh0IGN5Y2xlLgorCisKKworCisKKworCis8aDI+Mi42ICZuZGFzaDsgPGEgbmFtZT0iMi42Ij5Db3JvdXRpbmVzPC9hPjwvaDI+CisKKzxwPgorTHVhIHN1cHBvcnRzIGNvcm91dGluZXMsCithbHNvIGNhbGxlZCA8ZW0+Y29sbGFib3JhdGl2ZSBtdWx0aXRocmVhZGluZzwvZW0+LgorQSBjb3JvdXRpbmUgaW4gTHVhIHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGhyZWFkIG9mIGV4ZWN1dGlvbi4KK1VubGlrZSB0aHJlYWRzIGluIG11bHRpdGhyZWFkIHN5c3RlbXMsIGhvd2V2ZXIsCithIGNvcm91dGluZSBvbmx5IHN1c3BlbmRzIGl0cyBleGVjdXRpb24gYnkgZXhwbGljaXRseSBjYWxsaW5nCithIHlpZWxkIGZ1bmN0aW9uLgorCisKKzxwPgorWW91IGNyZWF0ZSBhIGNvcm91dGluZSBieSBjYWxsaW5nIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLmNyZWF0ZSI+PGNvZGU+Y29yb3V0aW5lLmNyZWF0ZTwvY29kZT48L2E+LgorSXRzIHNvbGUgYXJndW1lbnQgaXMgYSBmdW5jdGlvbgordGhhdCBpcyB0aGUgbWFpbiBmdW5jdGlvbiBvZiB0aGUgY29yb3V0aW5lLgorVGhlIDxjb2RlPmNyZWF0ZTwvY29kZT4gZnVuY3Rpb24gb25seSBjcmVhdGVzIGEgbmV3IGNvcm91dGluZSBhbmQKK3JldHVybnMgYSBoYW5kbGUgdG8gaXQgKGFuIG9iamVjdCBvZiB0eXBlIDxlbT50aHJlYWQ8L2VtPik7CitpdCBkb2VzIG5vdCBzdGFydCB0aGUgY29yb3V0aW5lLgorCisKKzxwPgorWW91IGV4ZWN1dGUgYSBjb3JvdXRpbmUgYnkgY2FsbGluZyA8YSBocmVmPSIjcGRmLWNvcm91dGluZS5yZXN1bWUiPjxjb2RlPmNvcm91dGluZS5yZXN1bWU8L2NvZGU+PC9hPi4KK1doZW4geW91IGZpcnN0IGNhbGwgPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUucmVzdW1lIj48Y29kZT5jb3JvdXRpbmUucmVzdW1lPC9jb2RlPjwvYT4sCitwYXNzaW5nIGFzIGl0cyBmaXJzdCBhcmd1bWVudAorYSB0aHJlYWQgcmV0dXJuZWQgYnkgPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUuY3JlYXRlIj48Y29kZT5jb3JvdXRpbmUuY3JlYXRlPC9jb2RlPjwvYT4sCit0aGUgY29yb3V0aW5lIHN0YXJ0cyBpdHMgZXhlY3V0aW9uLAorYXQgdGhlIGZpcnN0IGxpbmUgb2YgaXRzIG1haW4gZnVuY3Rpb24uCitFeHRyYSBhcmd1bWVudHMgcGFzc2VkIHRvIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnJlc3VtZSI+PGNvZGU+Y29yb3V0aW5lLnJlc3VtZTwvY29kZT48L2E+IGFyZSBwYXNzZWQgb24KK3RvIHRoZSBjb3JvdXRpbmUgbWFpbiBmdW5jdGlvbi4KK0FmdGVyIHRoZSBjb3JvdXRpbmUgc3RhcnRzIHJ1bm5pbmcsCitpdCBydW5zIHVudGlsIGl0IHRlcm1pbmF0ZXMgb3IgPGVtPnlpZWxkczwvZW0+LgorCisKKzxwPgorQSBjb3JvdXRpbmUgY2FuIHRlcm1pbmF0ZSBpdHMgZXhlY3V0aW9uIGluIHR3byB3YXlzOgorbm9ybWFsbHksIHdoZW4gaXRzIG1haW4gZnVuY3Rpb24gcmV0dXJucworKGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSwgYWZ0ZXIgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24pOworYW5kIGFibm9ybWFsbHksIGlmIHRoZXJlIGlzIGFuIHVucHJvdGVjdGVkIGVycm9yLgorSW4gdGhlIGZpcnN0IGNhc2UsIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnJlc3VtZSI+PGNvZGU+Y29yb3V0aW5lLnJlc3VtZTwvY29kZT48L2E+IHJldHVybnMgPGI+dHJ1ZTwvYj4sCitwbHVzIGFueSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNvcm91dGluZSBtYWluIGZ1bmN0aW9uLgorSW4gY2FzZSBvZiBlcnJvcnMsIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnJlc3VtZSI+PGNvZGU+Y29yb3V0aW5lLnJlc3VtZTwvY29kZT48L2E+IHJldHVybnMgPGI+ZmFsc2U8L2I+CitwbHVzIGFuIGVycm9yIG1lc3NhZ2UuCisKKworPHA+CitBIGNvcm91dGluZSB5aWVsZHMgYnkgY2FsbGluZyA8YSBocmVmPSIjcGRmLWNvcm91dGluZS55aWVsZCI+PGNvZGU+Y29yb3V0aW5lLnlpZWxkPC9jb2RlPjwvYT4uCitXaGVuIGEgY29yb3V0aW5lIHlpZWxkcywKK3RoZSBjb3JyZXNwb25kaW5nIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnJlc3VtZSI+PGNvZGU+Y29yb3V0aW5lLnJlc3VtZTwvY29kZT48L2E+IHJldHVybnMgaW1tZWRpYXRlbHksCitldmVuIGlmIHRoZSB5aWVsZCBoYXBwZW5zIGluc2lkZSBuZXN0ZWQgZnVuY3Rpb24gY2FsbHMKKyh0aGF0IGlzLCBub3QgaW4gdGhlIG1haW4gZnVuY3Rpb24sCitidXQgaW4gYSBmdW5jdGlvbiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNhbGxlZCBieSB0aGUgbWFpbiBmdW5jdGlvbikuCitJbiB0aGUgY2FzZSBvZiBhIHlpZWxkLCA8YSBocmVmPSIjcGRmLWNvcm91dGluZS5yZXN1bWUiPjxjb2RlPmNvcm91dGluZS5yZXN1bWU8L2NvZGU+PC9hPiBhbHNvIHJldHVybnMgPGI+dHJ1ZTwvYj4sCitwbHVzIGFueSB2YWx1ZXMgcGFzc2VkIHRvIDxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLnlpZWxkIj48Y29kZT5jb3JvdXRpbmUueWllbGQ8L2NvZGU+PC9hPi4KK1RoZSBuZXh0IHRpbWUgeW91IHJlc3VtZSB0aGUgc2FtZSBjb3JvdXRpbmUsCitpdCBjb250aW51ZXMgaXRzIGV4ZWN1dGlvbiBmcm9tIHRoZSBwb2ludCB3aGVyZSBpdCB5aWVsZGVkLAord2l0aCB0aGUgY2FsbCB0byA8YSBocmVmPSIjcGRmLWNvcm91dGluZS55aWVsZCI+PGNvZGU+Y29yb3V0aW5lLnlpZWxkPC9jb2RlPjwvYT4gcmV0dXJuaW5nIGFueSBleHRyYQorYXJndW1lbnRzIHBhc3NlZCB0byA8YSBocmVmPSIjcGRmLWNvcm91dGluZS5yZXN1bWUiPjxjb2RlPmNvcm91dGluZS5yZXN1bWU8L2NvZGU+PC9hPi4KKworCis8cD4KK0xpa2UgPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUuY3JlYXRlIj48Y29kZT5jb3JvdXRpbmUuY3JlYXRlPC9jb2RlPjwvYT4sCit0aGUgPGEgaHJlZj0iI3BkZi1jb3JvdXRpbmUud3JhcCI+PGNvZGU+Y29yb3V0aW5lLndyYXA8L2NvZGU+PC9hPiBmdW5jdGlvbiBhbHNvIGNyZWF0ZXMgYSBjb3JvdXRpbmUsCitidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIGNvcm91dGluZSBpdHNlbGYsCitpdCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHJlc3VtZXMgdGhlIGNvcm91dGluZS4KK0FueSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24KK2dvIGFzIGV4dHJhIGFyZ3VtZW50cyB0byA8YSBocmVmPSIjcGRmLWNvcm91dGluZS5yZXN1bWUiPjxjb2RlPmNvcm91dGluZS5yZXN1bWU8L2NvZGU+PC9hPi4KKzxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLndyYXAiPjxjb2RlPmNvcm91dGluZS53cmFwPC9jb2RlPjwvYT4gcmV0dXJucyBhbGwgdGhlIHZhbHVlcyByZXR1cm5lZCBieSA8YSBocmVmPSIjcGRmLWNvcm91dGluZS5yZXN1bWUiPjxjb2RlPmNvcm91dGluZS5yZXN1bWU8L2NvZGU+PC9hPiwKK2V4Y2VwdCB0aGUgZmlyc3Qgb25lICh0aGUgYm9vbGVhbiBlcnJvciBjb2RlKS4KK1VubGlrZSA8YSBocmVmPSIjcGRmLWNvcm91dGluZS5yZXN1bWUiPjxjb2RlPmNvcm91dGluZS5yZXN1bWU8L2NvZGU+PC9hPiwKKzxhIGhyZWY9IiNwZGYtY29yb3V0aW5lLndyYXAiPjxjb2RlPmNvcm91dGluZS53cmFwPC9jb2RlPjwvYT4gZG9lcyBub3QgY2F0Y2ggZXJyb3JzOworYW55IGVycm9yIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlci4KKworCis8cD4KK0FzIGFuIGV4YW1wbGUgb2YgaG93IGNvcm91dGluZXMgd29yaywKK2NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29kZToKKworPHByZT4KKyAgICAgZnVuY3Rpb24gZm9vIChhKQorICAgICAgIHByaW50KCJmb28iLCBhKQorICAgICAgIHJldHVybiBjb3JvdXRpbmUueWllbGQoMiphKQorICAgICBlbmQKKyAgICAgCisgICAgIGNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoYSxiKQorICAgICAgICAgICBwcmludCgiY28tYm9keSIsIGEsIGIpCisgICAgICAgICAgIGxvY2FsIHIgPSBmb28oYSsxKQorICAgICAgICAgICBwcmludCgiY28tYm9keSIsIHIpCisgICAgICAgICAgIGxvY2FsIHIsIHMgPSBjb3JvdXRpbmUueWllbGQoYStiLCBhLWIpCisgICAgICAgICAgIHByaW50KCJjby1ib2R5IiwgciwgcykKKyAgICAgICAgICAgcmV0dXJuIGIsICJlbmQiCisgICAgIGVuZCkKKyAgICAgCisgICAgIHByaW50KCJtYWluIiwgY29yb3V0aW5lLnJlc3VtZShjbywgMSwgMTApKQorICAgICBwcmludCgibWFpbiIsIGNvcm91dGluZS5yZXN1bWUoY28sICJyIikpCisgICAgIHByaW50KCJtYWluIiwgY29yb3V0aW5lLnJlc3VtZShjbywgIngiLCAieSIpKQorICAgICBwcmludCgibWFpbiIsIGNvcm91dGluZS5yZXN1bWUoY28sICJ4IiwgInkiKSkKKzwvcHJlPjxwPgorV2hlbiB5b3UgcnVuIGl0LCBpdCBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIG91dHB1dDoKKworPHByZT4KKyAgICAgY28tYm9keSAxICAgICAgIDEwCisgICAgIGZvbyAgICAgMgorICAgICBtYWluICAgIHRydWUgICAgNAorICAgICBjby1ib2R5IHIKKyAgICAgbWFpbiAgICB0cnVlICAgIDExICAgICAgLTkKKyAgICAgY28tYm9keSB4ICAgICAgIHkKKyAgICAgbWFpbiAgICB0cnVlICAgIDEwICAgICAgZW5kCisgICAgIG1haW4gICAgZmFsc2UgICBjYW5ub3QgcmVzdW1lIGRlYWQgY29yb3V0aW5lCis8L3ByZT4KKworPHA+CitZb3UgY2FuIGFsc28gY3JlYXRlIGFuZCBtYW5pcHVsYXRlIGNvcm91dGluZXMgdGhyb3VnaCB0aGUgQyBBUEk6CitzZWUgZnVuY3Rpb25zIDxhIGhyZWY9IiNsdWFfbmV3dGhyZWFkIj48Y29kZT5sdWFfbmV3dGhyZWFkPC9jb2RlPjwvYT4sIDxhIGhyZWY9IiNsdWFfcmVzdW1lIj48Y29kZT5sdWFfcmVzdW1lPC9jb2RlPjwvYT4sCithbmQgPGEgaHJlZj0iI2x1YV95aWVsZCI+PGNvZGU+bHVhX3lpZWxkPC9jb2RlPjwvYT4uCisKKworCisKKworPGgxPjMgJm5kYXNoOyA8YSBuYW1lPSIzIj5UaGUgTGFuZ3VhZ2U8L2E+PC9oMT4KKworPHA+CitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBsZXhpcywgdGhlIHN5bnRheCwgYW5kIHRoZSBzZW1hbnRpY3Mgb2YgTHVhLgorSW4gb3RoZXIgd29yZHMsCit0aGlzIHNlY3Rpb24gZGVzY3JpYmVzCit3aGljaCB0b2tlbnMgYXJlIHZhbGlkLAoraG93IHRoZXkgY2FuIGJlIGNvbWJpbmVkLAorYW5kIHdoYXQgdGhlaXIgY29tYmluYXRpb25zIG1lYW4uCisKKworPHA+CitMYW5ndWFnZSBjb25zdHJ1Y3RzIHdpbGwgYmUgZXhwbGFpbmVkIHVzaW5nIHRoZSB1c3VhbCBleHRlbmRlZCBCTkYgbm90YXRpb24sCitpbiB3aGljaAorezxlbT5hPC9lbT59Jm5ic3A7bWVhbnMmbmJzcDswIG9yIG1vcmUgPGVtPmE8L2VtPidzLCBhbmQKK1s8ZW0+YTwvZW0+XSZuYnNwO21lYW5zIGFuIG9wdGlvbmFsIDxlbT5hPC9lbT4uCitOb24tdGVybWluYWxzIGFyZSBzaG93biBsaWtlIG5vbi10ZXJtaW5hbCwKK2tleXdvcmRzIGFyZSBzaG93biBsaWtlIDxiPmt3b3JkPC9iPiwKK2FuZCBvdGhlciB0ZXJtaW5hbCBzeW1ib2xzIGFyZSBzaG93biBsaWtlICZsc3F1bzs8Yj49PC9iPiZyc3F1bzsuCitUaGUgY29tcGxldGUgc3ludGF4IG9mIEx1YSBjYW4gYmUgZm91bmQgaW4gPGEgaHJlZj0iIzkiPiZzZWN0Ozk8L2E+CithdCB0aGUgZW5kIG9mIHRoaXMgbWFudWFsLgorCisKKworPGgyPjMuMSAmbmRhc2g7IDxhIG5hbWU9IjMuMSI+TGV4aWNhbCBDb252ZW50aW9uczwvYT48L2gyPgorCis8cD4KK0x1YSBpcyBhIGZyZWUtZm9ybSBsYW5ndWFnZS4KK0l0IGlnbm9yZXMgc3BhY2VzIChpbmNsdWRpbmcgbmV3IGxpbmVzKSBhbmQgY29tbWVudHMKK2JldHdlZW4gbGV4aWNhbCBlbGVtZW50cyAodG9rZW5zKSwKK2V4Y2VwdCBhcyBkZWxpbWl0ZXJzIGJldHdlZW4gbmFtZXMgYW5kIGtleXdvcmRzLgorCisKKzxwPgorPGVtPk5hbWVzPC9lbT4KKyhhbHNvIGNhbGxlZCA8ZW0+aWRlbnRpZmllcnM8L2VtPikKK2luIEx1YSBjYW4gYmUgYW55IHN0cmluZyBvZiBsZXR0ZXJzLAorZGlnaXRzLCBhbmQgdW5kZXJzY29yZXMsCitub3QgYmVnaW5uaW5nIHdpdGggYSBkaWdpdC4KK0lkZW50aWZpZXJzIGFyZSB1c2VkIHRvIG5hbWUgdmFyaWFibGVzLCB0YWJsZSBmaWVsZHMsIGFuZCBsYWJlbHMuCisKKworPHA+CitUaGUgZm9sbG93aW5nIDxlbT5rZXl3b3JkczwvZW0+IGFyZSByZXNlcnZlZAorYW5kIGNhbm5vdCBiZSB1c2VkIGFzIG5hbWVzOgorCisKKzxwcmU+CisgICAgIGFuZCAgICAgICBicmVhayAgICAgZG8gICAgICAgIGVsc2UgICAgICBlbHNlaWYgICAgZW5kCisgICAgIGZhbHNlICAgICBmb3IgICAgICAgZnVuY3Rpb24gIGdvdG8gICAgICBpZiAgICAgICAgaW4KKyAgICAgbG9jYWwgICAgIG5pbCAgICAgICBub3QgICAgICAgb3IgICAgICAgIHJlcGVhdCAgICByZXR1cm4KKyAgICAgdGhlbiAgICAgIHRydWUgICAgICB1bnRpbCAgICAgd2hpbGUKKzwvcHJlPgorCis8cD4KK0x1YSBpcyBhIGNhc2Utc2Vuc2l0aXZlIGxhbmd1YWdlOgorPGNvZGU+YW5kPC9jb2RlPiBpcyBhIHJlc2VydmVkIHdvcmQsIGJ1dCA8Y29kZT5BbmQ8L2NvZGU+IGFuZCA8Y29kZT5BTkQ8L2NvZGU+CithcmUgdHdvIGRpZmZlcmVudCwgdmFsaWQgbmFtZXMuCitBcyBhIGNvbnZlbnRpb24sIG5hbWVzIHN0YXJ0aW5nIHdpdGggYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieQordXBwZXJjYXNlIGxldHRlcnMgKHN1Y2ggYXMgPGEgaHJlZj0iI3BkZi1fVkVSU0lPTiI+PGNvZGU+X1ZFUlNJT048L2NvZGU+PC9hPikKK2FyZSByZXNlcnZlZCBmb3IgdmFyaWFibGVzIHVzZWQgYnkgTHVhLgorCisKKzxwPgorVGhlIGZvbGxvd2luZyBzdHJpbmdzIGRlbm90ZSBvdGhlciB0b2tlbnM6CisKKzxwcmU+CisgICAgICsgICAgIC0gICAgICogICAgIC8gICAgICUgICAgIF4gICAgICMKKyAgICAgPT0gICAgfj0gICAgJmx0Oz0gICAgJmd0Oz0gICAgJmx0OyAgICAgJmd0OyAgICAgPQorICAgICAoICAgICApICAgICB7ICAgICB9ICAgICBbICAgICBdICAgICA6OgorICAgICA7ICAgICA6ICAgICAsICAgICAuICAgICAuLiAgICAuLi4KKzwvcHJlPgorCis8cD4KKzxlbT5MaXRlcmFsIHN0cmluZ3M8L2VtPgorY2FuIGJlIGRlbGltaXRlZCBieSBtYXRjaGluZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcywKK2FuZCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIEMtbGlrZSBlc2NhcGUgc2VxdWVuY2VzOgorJzxjb2RlPlxhPC9jb2RlPicgKGJlbGwpLAorJzxjb2RlPlxiPC9jb2RlPicgKGJhY2tzcGFjZSksCisnPGNvZGU+XGY8L2NvZGU+JyAoZm9ybSBmZWVkKSwKKyc8Y29kZT5cbjwvY29kZT4nIChuZXdsaW5lKSwKKyc8Y29kZT5ccjwvY29kZT4nIChjYXJyaWFnZSByZXR1cm4pLAorJzxjb2RlPlx0PC9jb2RlPicgKGhvcml6b250YWwgdGFiKSwKKyc8Y29kZT5cdjwvY29kZT4nICh2ZXJ0aWNhbCB0YWIpLAorJzxjb2RlPlxcPC9jb2RlPicgKGJhY2tzbGFzaCksCisnPGNvZGU+XCI8L2NvZGU+JyAocXVvdGF0aW9uIG1hcmsgW2RvdWJsZSBxdW90ZV0pLAorYW5kICc8Y29kZT5cJzwvY29kZT4nIChhcG9zdHJvcGhlIFtzaW5nbGUgcXVvdGVdKS4KK0EgYmFja3NsYXNoIGZvbGxvd2VkIGJ5IGEgcmVhbCBuZXdsaW5lCityZXN1bHRzIGluIGEgbmV3bGluZSBpbiB0aGUgc3RyaW5nLgorVGhlIGVzY2FwZSBzZXF1ZW5jZSAnPGNvZGU+XHo8L2NvZGU+JyBza2lwcyB0aGUgZm9sbG93aW5nIHNwYW4KK29mIHdoaXRlLXNwYWNlIGNoYXJhY3RlcnMsCitpbmNsdWRpbmcgbGluZSBicmVha3M7CitpdCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHRvIGJyZWFrIGFuZCBpbmRlbnQgYSBsb25nIGxpdGVyYWwgc3RyaW5nCitpbnRvIG11bHRpcGxlIGxpbmVzIHdpdGhvdXQgYWRkaW5nIHRoZSBuZXdsaW5lcyBhbmQgc3BhY2VzCitpbnRvIHRoZSBzdHJpbmcgY29udGVudHMuCisKKworPHA+CitBIGJ5dGUgaW4gYSBsaXRlcmFsIHN0cmluZyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYnkgaXRzIG51bWVyaWNhbCB2YWx1ZS4KK1RoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgZXNjYXBlIHNlcXVlbmNlIDxjb2RlPlx4PGVtPlhYPC9lbT48L2NvZGU+LAord2hlcmUgPGVtPlhYPC9lbT4gaXMgYSBzZXF1ZW5jZSBvZiBleGFjdGx5IHR3byBoZXhhZGVjaW1hbCBkaWdpdHMsCitvciB3aXRoIHRoZSBlc2NhcGUgc2VxdWVuY2UgPGNvZGU+XDxlbT5kZGQ8L2VtPjwvY29kZT4sCit3aGVyZSA8ZW0+ZGRkPC9lbT4gaXMgYSBzZXF1ZW5jZSBvZiB1cCB0byB0aHJlZSBkZWNpbWFsIGRpZ2l0cy4KKyhOb3RlIHRoYXQgaWYgYSBkZWNpbWFsIGVzY2FwZSBpcyB0byBiZSBmb2xsb3dlZCBieSBhIGRpZ2l0LAoraXQgbXVzdCBiZSBleHByZXNzZWQgdXNpbmcgZXhhY3RseSB0aHJlZSBkaWdpdHMuKQorU3RyaW5ncyBpbiBMdWEgY2FuIGNvbnRhaW4gYW55IDgtYml0IHZhbHVlLCBpbmNsdWRpbmcgZW1iZWRkZWQgemVyb3MsCit3aGljaCBjYW4gYmUgc3BlY2lmaWVkIGFzICc8Y29kZT5cMDwvY29kZT4nLgorCisKKzxwPgorTGl0ZXJhbCBzdHJpbmdzIGNhbiBhbHNvIGJlIGRlZmluZWQgdXNpbmcgYSBsb25nIGZvcm1hdAorZW5jbG9zZWQgYnkgPGVtPmxvbmcgYnJhY2tldHM8L2VtPi4KK1dlIGRlZmluZSBhbiA8ZW0+b3BlbmluZyBsb25nIGJyYWNrZXQgb2YgbGV2ZWwgPGVtPm48L2VtPjwvZW0+IGFzIGFuIG9wZW5pbmcKK3NxdWFyZSBicmFja2V0IGZvbGxvd2VkIGJ5IDxlbT5uPC9lbT4gZXF1YWwgc2lnbnMgZm9sbG93ZWQgYnkgYW5vdGhlcgorb3BlbmluZyBzcXVhcmUgYnJhY2tldC4KK1NvLCBhbiBvcGVuaW5nIGxvbmcgYnJhY2tldCBvZiBsZXZlbCZuYnNwOzAgaXMgd3JpdHRlbiBhcyA8Y29kZT5bWzwvY29kZT4sCithbiBvcGVuaW5nIGxvbmcgYnJhY2tldCBvZiBsZXZlbCZuYnNwOzEgaXMgd3JpdHRlbiBhcyA8Y29kZT5bPVs8L2NvZGU+LAorYW5kIHNvIG9uLgorQSA8ZW0+Y2xvc2luZyBsb25nIGJyYWNrZXQ8L2VtPiBpcyBkZWZpbmVkIHNpbWlsYXJseTsKK2ZvciBpbnN0YW5jZSwgYSBjbG9zaW5nIGxvbmcgYnJhY2tldCBvZiBsZXZlbCZuYnNwOzQgaXMgd3JpdHRlbiBhcyA8Y29kZT5dPT09PV08L2NvZGU+LgorQSA8ZW0+bG9uZyBsaXRlcmFsPC9lbT4gc3RhcnRzIHdpdGggYW4gb3BlbmluZyBsb25nIGJyYWNrZXQgb2YgYW55IGxldmVsIGFuZAorZW5kcyBhdCB0aGUgZmlyc3QgY2xvc2luZyBsb25nIGJyYWNrZXQgb2YgdGhlIHNhbWUgbGV2ZWwuCitJdCBjYW4gY29udGFpbiBhbnkgdGV4dCBleGNlcHQgYSBjbG9zaW5nIGJyYWNrZXQgb2YgdGhlIHByb3BlciBsZXZlbC4KK0xpdGVyYWxzIGluIHRoaXMgYnJhY2tldGVkIGZvcm0gY2FuIHJ1biBmb3Igc2V2ZXJhbCBsaW5lcywKK2RvIG5vdCBpbnRlcnByZXQgYW55IGVzY2FwZSBzZXF1ZW5jZXMsCithbmQgaWdub3JlIGxvbmcgYnJhY2tldHMgb2YgYW55IG90aGVyIGxldmVsLgorQW55IGtpbmQgb2YgZW5kLW9mLWxpbmUgc2VxdWVuY2UKKyhjYXJyaWFnZSByZXR1cm4sIG5ld2xpbmUsIGNhcnJpYWdlIHJldHVybiBmb2xsb3dlZCBieSBuZXdsaW5lLAorb3IgbmV3bGluZSBmb2xsb3dlZCBieSBjYXJyaWFnZSByZXR1cm4pCitpcyBjb252ZXJ0ZWQgdG8gYSBzaW1wbGUgbmV3bGluZS4KKworCis8cD4KK0FueSBieXRlIGluIGEgbGl0ZXJhbCBzdHJpbmcgbm90CitleHBsaWNpdGx5IGFmZmVjdGVkIGJ5IHRoZSBwcmV2aW91cyBydWxlcyByZXByZXNlbnRzIGl0c2VsZi4KK0hvd2V2ZXIsIEx1YSBvcGVucyBmaWxlcyBmb3IgcGFyc2luZyBpbiB0ZXh0IG1vZGUsCithbmQgdGhlIHN5c3RlbSBmaWxlIGZ1bmN0aW9ucyBtYXkgaGF2ZSBwcm9ibGVtcyB3aXRoCitzb21lIGNvbnRyb2wgY2hhcmFjdGVycy4KK1NvLCBpdCBpcyBzYWZlciB0byByZXByZXNlbnQKK25vbi10ZXh0IGRhdGEgYXMgYSBxdW90ZWQgbGl0ZXJhbCB3aXRoCitleHBsaWNpdCBlc2NhcGUgc2VxdWVuY2VzIGZvciBub24tdGV4dCBjaGFyYWN0ZXJzLgorCisKKzxwPgorRm9yIGNvbnZlbmllbmNlLAord2hlbiB0aGUgb3BlbmluZyBsb25nIGJyYWNrZXQgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLAordGhlIG5ld2xpbmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBzdHJpbmcuCitBcyBhbiBleGFtcGxlLCBpbiBhIHN5c3RlbSB1c2luZyBBU0NJSQorKGluIHdoaWNoICc8Y29kZT5hPC9jb2RlPicgaXMgY29kZWQgYXMmbmJzcDs5NywKK25ld2xpbmUgaXMgY29kZWQgYXMmbmJzcDsxMCwgYW5kICc8Y29kZT4xPC9jb2RlPicgaXMgY29kZWQgYXMmbmJzcDs0OSksCit0aGUgZml2ZSBsaXRlcmFsIHN0cmluZ3MgYmVsb3cgZGVub3RlIHRoZSBzYW1lIHN0cmluZzoKKworPHByZT4KKyAgICAgYSA9ICdhbG9cbjEyMyInCisgICAgIGEgPSAiYWxvXG4xMjNcIiIKKyAgICAgYSA9ICdcOTdsb1wxMFwwNDkyMyInCisgICAgIGEgPSBbW2FsbworICAgICAxMjMiXV0KKyAgICAgYSA9IFs9PVsKKyAgICAgYWxvCisgICAgIDEyMyJdPT1dCis8L3ByZT4KKworPHA+CitBIDxlbT5udW1lcmljYWwgY29uc3RhbnQ8L2VtPiBjYW4gYmUgd3JpdHRlbiB3aXRoIGFuIG9wdGlvbmFsIGZyYWN0aW9uYWwgcGFydAorYW5kIGFuIG9wdGlvbmFsIGRlY2ltYWwgZXhwb25lbnQsCittYXJrZWQgYnkgYSBsZXR0ZXIgJzxjb2RlPmU8L2NvZGU+JyBvciAnPGNvZGU+RTwvY29kZT4nLgorTHVhIGFsc28gYWNjZXB0cyBoZXhhZGVjaW1hbCBjb25zdGFudHMsCit3aGljaCBzdGFydCB3aXRoIDxjb2RlPjB4PC9jb2RlPiBvciA8Y29kZT4wWDwvY29kZT4uCitIZXhhZGVjaW1hbCBjb25zdGFudHMgYWxzbyBhY2NlcHQgYW4gb3B0aW9uYWwgZnJhY3Rpb25hbCBwYXJ0CitwbHVzIGFuIG9wdGlvbmFsIGJpbmFyeSBleHBvbmVudCwKK21hcmtlZCBieSBhIGxldHRlciAnPGNvZGU+cDwvY29kZT4nIG9yICc8Y29kZT5QPC9jb2RlPicuCitFeGFtcGxlcyBvZiB2YWxpZCBudW1lcmljYWwgY29uc3RhbnRzIGFyZQorCis8cHJlPgorICAgICAzICAgICAzLjAgICAgIDMuMTQxNiAgICAgMzE0LjE2ZS0yICAgICAwLjMxNDE2RTEKKyAgICAgMHhmZiAgMHgwLjFFICAweEEyM3AtNCAgIDBYMS45MjFGQjU0NDQyRDE4UCsxCis8L3ByZT4KKworPHA+CitBIDxlbT5jb21tZW50PC9lbT4gc3RhcnRzIHdpdGggYSBkb3VibGUgaHlwaGVuICg8Y29kZT4tLTwvY29kZT4pCithbnl3aGVyZSBvdXRzaWRlIGEgc3RyaW5nLgorSWYgdGhlIHRleHQgaW1tZWRpYXRlbHkgYWZ0ZXIgPGNvZGU+LS08L2NvZGU+IGlzIG5vdCBhbiBvcGVuaW5nIGxvbmcgYnJhY2tldCwKK3RoZSBjb21tZW50IGlzIGEgPGVtPnNob3J0IGNvbW1lbnQ8L2VtPiwKK3doaWNoIHJ1bnMgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluZS4KK090aGVyd2lzZSwgaXQgaXMgYSA8ZW0+bG9uZyBjb21tZW50PC9lbT4sCit3aGljaCBydW5zIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nIGNsb3NpbmcgbG9uZyBicmFja2V0LgorTG9uZyBjb21tZW50cyBhcmUgZnJlcXVlbnRseSB1c2VkIHRvIGRpc2FibGUgY29kZSB0ZW1wb3JhcmlseS4KKworCisKKworCis8aDI+My4yICZuZGFzaDsgPGEgbmFtZT0iMy4yIj5WYXJpYWJsZXM8L2E+PC9oMj4KKworPHA+CitWYXJpYWJsZXMgYXJlIHBsYWNlcyB0aGF0IHN0b3JlIHZhbHVlcy4KK1RoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiB2YXJpYWJsZXMgaW4gTHVhOgorZ2xvYmFsIHZhcmlhYmxlcywgbG9jYWwgdmFyaWFibGVzLCBhbmQgdGFibGUgZmllbGRzLgorCisKKzxwPgorQSBzaW5nbGUgbmFtZSBjYW4gZGVub3RlIGEgZ2xvYmFsIHZhcmlhYmxlIG9yIGEgbG9jYWwgdmFyaWFibGUKKyhvciBhIGZ1bmN0aW9uJ3MgZm9ybWFsIHBhcmFtZXRlciwKK3doaWNoIGlzIGEgcGFydGljdWxhciBraW5kIG9mIGxvY2FsIHZhcmlhYmxlKToKKworPHByZT4KKwl2YXIgOjo9IE5hbWUKKzwvcHJlPjxwPgorTmFtZSBkZW5vdGVzIGlkZW50aWZpZXJzLCBhcyBkZWZpbmVkIGluIDxhIGhyZWY9IiMzLjEiPiZzZWN0OzMuMTwvYT4uCisKKworPHA+CitBbnkgdmFyaWFibGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIGdsb2JhbCB1bmxlc3MgZXhwbGljaXRseSBkZWNsYXJlZAorYXMgYSBsb2NhbCAoc2VlIDxhIGhyZWY9IiMzLjMuNyI+JnNlY3Q7My4zLjc8L2E+KS4KK0xvY2FsIHZhcmlhYmxlcyBhcmUgPGVtPmxleGljYWxseSBzY29wZWQ8L2VtPjoKK2xvY2FsIHZhcmlhYmxlcyBjYW4gYmUgZnJlZWx5IGFjY2Vzc2VkIGJ5IGZ1bmN0aW9ucworZGVmaW5lZCBpbnNpZGUgdGhlaXIgc2NvcGUgKHNlZSA8YSBocmVmPSIjMy41Ij4mc2VjdDszLjU8L2E+KS4KKworCis8cD4KK0JlZm9yZSB0aGUgZmlyc3QgYXNzaWdubWVudCB0byBhIHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgPGI+bmlsPC9iPi4KKworCis8cD4KK1NxdWFyZSBicmFja2V0cyBhcmUgdXNlZCB0byBpbmRleCBhIHRhYmxlOgorCis8cHJlPgorCXZhciA6Oj0gcHJlZml4ZXhwICZsc3F1bzs8Yj5bPC9iPiZyc3F1bzsgZXhwICZsc3F1bzs8Yj5dPC9iPiZyc3F1bzsKKzwvcHJlPjxwPgorVGhlIG1lYW5pbmcgb2YgYWNjZXNzZXMgdG8gdGFibGUgZmllbGRzIGNhbiBiZSBjaGFuZ2VkIHZpYSBtZXRhdGFibGVzLgorQW4gYWNjZXNzIHRvIGFuIGluZGV4ZWQgdmFyaWFibGUgPGNvZGU+dFtpXTwvY29kZT4gaXMgZXF1aXZhbGVudCB0bworYSBjYWxsIDxjb2RlPmdldHRhYmxlX2V2ZW50KHQsaSk8L2NvZGU+LgorKFNlZSA8YSBocmVmPSIjMi40Ij4mc2VjdDsyLjQ8L2E+IGZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZQorPGNvZGU+Z2V0dGFibGVfZXZlbnQ8L2NvZGU+IGZ1bmN0aW9uLgorVGhpcyBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZCBvciBjYWxsYWJsZSBpbiBMdWEuCitXZSB1c2UgaXQgaGVyZSBvbmx5IGZvciBleHBsYW5hdG9yeSBwdXJwb3Nlcy4pCisKKworPHA+CitUaGUgc3ludGF4IDxjb2RlPnZhci5OYW1lPC9jb2RlPiBpcyBqdXN0IHN5bnRhY3RpYyBzdWdhciBmb3IKKzxjb2RlPnZhclsiTmFtZSJdPC9jb2RlPjoKKworPHByZT4KKwl2YXIgOjo9IHByZWZpeGV4cCAmbHNxdW87PGI+LjwvYj4mcnNxdW87IE5hbWUKKzwvcHJlPgorCis8cD4KK0FuIGFjY2VzcyB0byBhIGdsb2JhbCB2YXJpYWJsZSA8Y29kZT54PC9jb2RlPgoraXMgZXF1aXZhbGVudCB0byA8Y29kZT5fRU5WLng8L2NvZGU+LgorRHVlIHRvIHRoZSB3YXkgdGhhdCBjaHVua3MgYXJlIGNvbXBpbGVkLAorPGNvZGU+X0VOVjwvY29kZT4gaXMgbmV2ZXIgYSBnbG9iYWwgbmFtZSAoc2VlIDxhIGhyZWY9IiMyLjIiPiZzZWN0OzIuMjwvYT4pLgorCisKKworCisKKzxoMj4zLjMgJm5kYXNoOyA8YSBuYW1lPSIzLjMiPlN0YXRlbWVudHM8L2E+PC9oMj4KKworPHA+CitMdWEgc3VwcG9ydHMgYW4gYWxtb3N0IGNvbnZlbnRpb25hbCBzZXQgb2Ygc3RhdGVtZW50cywKK3NpbWlsYXIgdG8gdGhvc2UgaW4gUGFzY2FsIG9yIEMuCitUaGlzIHNldCBpbmNsdWRlcworYXNzaWdubWVudHMsIGNvbnRyb2wgc3RydWN0dXJlcywgZnVuY3Rpb24gY2FsbHMsCithbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLgorCisKKworPGgzPjMuMy4xICZuZGFzaDsgPGEgbmFtZT0iMy4zLjEiPkJsb2NrczwvYT48L2gzPgorCis8cD4KK0EgYmxvY2sgaXMgYSBsaXN0IG9mIHN0YXRlbWVudHMsCit3aGljaCBhcmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5OgorCis8cHJlPgorCWJsb2NrIDo6PSB7c3RhdH0KKzwvcHJlPjxwPgorTHVhIGhhcyA8ZW0+ZW1wdHkgc3RhdGVtZW50czwvZW0+Cit0aGF0IGFsbG93IHlvdSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzIHdpdGggc2VtaWNvbG9ucywKK3N0YXJ0IGEgYmxvY2sgd2l0aCBhIHNlbWljb2xvbgorb3Igd3JpdGUgdHdvIHNlbWljb2xvbnMgaW4gc2VxdWVuY2U6CisKKzxwcmU+CisJc3RhdCA6Oj0gJmxzcXVvOzxiPjs8L2I+JnJzcXVvOworPC9wcmU+CisKKzxwPgorRnVuY3Rpb24gY2FsbHMgYW5kIGFzc2lnbm1lbnRzCitjYW4gc3RhcnQgd2l0aCBhbiBvcGVuIHBhcmVudGhlc2lzLgorVGhpcyBwb3NzaWJpbGl0eSBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgaW4gTHVhJ3MgZ3JhbW1hci4KK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnQ6CisKKzxwcmU+CisgICAgIGEgPSBiICsgYworICAgICAocHJpbnQgb3IgaW8ud3JpdGUpKCdkb25lJykKKzwvcHJlPjxwPgorVGhlIGdyYW1tYXIgY291bGQgc2VlIGl0IGluIHR3byB3YXlzOgorCis8cHJlPgorICAgICBhID0gYiArIGMocHJpbnQgb3IgaW8ud3JpdGUpKCdkb25lJykKKyAgICAgCisgICAgIGEgPSBiICsgYzsgKHByaW50IG9yIGlvLndyaXRlKSgnZG9uZScpCis8L3ByZT48cD4KK1RoZSBjdXJyZW50IHBhcnNlciBhbHdheXMgc2VlcyBzdWNoIGNvbnN0cnVjdGlvbnMKK2luIHRoZSBmaXJzdCB3YXksCitpbnRlcnByZXRpbmcgdGhlIG9wZW4gcGFyZW50aGVzaXMKK2FzIHRoZSBzdGFydCBvZiB0aGUgYXJndW1lbnRzIHRvIGEgY2FsbC4KK1RvIGF2b2lkIHRoaXMgYW1iaWd1aXR5LAoraXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGFsd2F5cyBwcmVjZWRlIHdpdGggYSBzZW1pY29sb24KK3N0YXRlbWVudHMgdGhhdCBzdGFydCB3aXRoIGEgcGFyZW50aGVzaXM6CisKKzxwcmU+CisgICAgIDsocHJpbnQgb3IgaW8ud3JpdGUpKCdkb25lJykKKzwvcHJlPgorCis8cD4KK0EgYmxvY2sgY2FuIGJlIGV4cGxpY2l0bHkgZGVsaW1pdGVkIHRvIHByb2R1Y2UgYSBzaW5nbGUgc3RhdGVtZW50OgorCis8cHJlPgorCXN0YXQgOjo9IDxiPmRvPC9iPiBibG9jayA8Yj5lbmQ8L2I+Cis8L3ByZT48cD4KK0V4cGxpY2l0IGJsb2NrcyBhcmUgdXNlZnVsCit0byBjb250cm9sIHRoZSBzY29wZSBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCitFeHBsaWNpdCBibG9ja3MgYXJlIGFsc28gc29tZXRpbWVzIHVzZWQgdG8KK2FkZCBhIDxiPnJldHVybjwvYj4gc3RhdGVtZW50IGluIHRoZSBtaWRkbGUKK29mIGFub3RoZXIgYmxvY2sgKHNlZSA8YSBocmVmPSIjMy4zLjQiPiZzZWN0OzMuMy40PC9hPikuCisKKworCisKKworPGgzPjMuMy4yICZuZGFzaDsgPGEgbmFtZT0iMy4zLjIiPkNodW5rczwvYT48L2gzPgorCis8cD4KK1RoZSB1bml0IG9mIGNvbXBpbGF0aW9uIG9mIEx1YSBpcyBjYWxsZWQgYSA8ZW0+Y2h1bms8L2VtPi4KK1N5bnRhY3RpY2FsbHksCithIGNodW5rIGlzIHNpbXBseSBhIGJsb2NrOgorCis8cHJlPgorCWNodW5rIDo6PSBibG9jaworPC9wcmU+CisKKzxwPgorTHVhIGhhbmRsZXMgYSBjaHVuayBhcyB0aGUgYm9keSBvZiBhbiBhbm9ueW1vdXMgZnVuY3Rpb24KK3dpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzCisoc2VlIDxhIGhyZWY9IiMzLjQuMTAiPiZzZWN0OzMuNC4xMDwvYT4pLgorQXMgc3VjaCwgY2h1bmtzIGNhbiBkZWZpbmUgbG9jYWwgdmFyaWFibGVzLAorcmVjZWl2ZSBhcmd1bWVudHMsIGFuZCByZXR1cm4gdmFsdWVzLgorTW9yZW92ZXIsIHN1Y2ggYW5vbnltb3VzIGZ1bmN0aW9uIGlzIGNvbXBpbGVkIGFzIGluIHRoZQorc2NvcGUgb2YgYW4gZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGUgY2FsbGVkIDxjb2RlPl9FTlY8L2NvZGU+IChzZWUgPGEgaHJlZj0iIzIuMiI+JnNlY3Q7Mi4yPC9hPikuCitUaGUgcmVzdWx0aW5nIGZ1bmN0aW9uIGFsd2F5cyBoYXMgPGNvZGU+X0VOVjwvY29kZT4gYXMgaXRzIG9ubHkgdXB2YWx1ZSwKK2V2ZW4gaWYgaXQgZG9lcyBub3QgdXNlIHRoYXQgdmFyaWFibGUuCisKKworPHA+CitBIGNodW5rIGNhbiBiZSBzdG9yZWQgaW4gYSBmaWxlIG9yIGluIGEgc3RyaW5nIGluc2lkZSB0aGUgaG9zdCBwcm9ncmFtLgorVG8gZXhlY3V0ZSBhIGNodW5rLAorTHVhIGZpcnN0IHByZWNvbXBpbGVzIHRoZSBjaHVuayBpbnRvIGluc3RydWN0aW9ucyBmb3IgYSB2aXJ0dWFsIG1hY2hpbmUsCithbmQgdGhlbiBpdCBleGVjdXRlcyB0aGUgY29tcGlsZWQgY29kZQord2l0aCBhbiBpbnRlcnByZXRlciBmb3IgdGhlIHZpcnR1YWwgbWFjaGluZS4KKworCis8cD4KK0NodW5rcyBjYW4gYWxzbyBiZSBwcmVjb21waWxlZCBpbnRvIGJpbmFyeSBmb3JtOworc2VlIHByb2dyYW0gPGNvZGU+bHVhYzwvY29kZT4gZm9yIGRldGFpbHMuCitQcm9ncmFtcyBpbiBzb3VyY2UgYW5kIGNvbXBpbGVkIGZvcm1zIGFyZSBpbnRlcmNoYW5nZWFibGU7CitMdWEgYXV0b21hdGljYWxseSBkZXRlY3RzIHRoZSBmaWxlIHR5cGUgYW5kIGFjdHMgYWNjb3JkaW5nbHkuCisKKworCisKKworCis8aDM+My4zLjMgJm5kYXNoOyA8YSBuYW1lPSIzLjMuMyI+QXNzaWdubWVudDwvYT48L2gzPgorCis8cD4KK0x1YSBhbGxvd3MgbXVsdGlwbGUgYXNzaWdubWVudHMuCitUaGVyZWZvcmUsIHRoZSBzeW50YXggZm9yIGFzc2lnbm1lbnQKK2RlZmluZXMgYSBsaXN0IG9mIHZhcmlhYmxlcyBvbiB0aGUgbGVmdCBzaWRlCithbmQgYSBsaXN0IG9mIGV4cHJlc3Npb25zIG9uIHRoZSByaWdodCBzaWRlLgorVGhlIGVsZW1lbnRzIGluIGJvdGggbGlzdHMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXM6CisKKzxwcmU+CisJc3RhdCA6Oj0gdmFybGlzdCAmbHNxdW87PGI+PTwvYj4mcnNxdW87IGV4cGxpc3QKKwl2YXJsaXN0IDo6PSB2YXIgeyZsc3F1bzs8Yj4sPC9iPiZyc3F1bzsgdmFyfQorCWV4cGxpc3QgOjo9IGV4cCB7JmxzcXVvOzxiPiw8L2I+JnJzcXVvOyBleHB9Cis8L3ByZT48cD4KK0V4cHJlc3Npb25zIGFyZSBkaXNjdXNzZWQgaW4gPGEgaHJlZj0iIzMuNCI+JnNlY3Q7My40PC9hPi4KKworCis8cD4KK0JlZm9yZSB0aGUgYXNzaWdubWVudCwKK3RoZSBsaXN0IG9mIHZhbHVlcyBpcyA8ZW0+YWRqdXN0ZWQ8L2VtPiB0byB0aGUgbGVuZ3RoIG9mCit0aGUgbGlzdCBvZiB2YXJpYWJsZXMuCitJZiB0aGVyZSBhcmUgbW9yZSB2YWx1ZXMgdGhhbiBuZWVkZWQsCit0aGUgZXhjZXNzIHZhbHVlcyBhcmUgdGhyb3duIGF3YXkuCitJZiB0aGVyZSBhcmUgZmV3ZXIgdmFsdWVzIHRoYW4gbmVlZGVkLAordGhlIGxpc3QgaXMgZXh0ZW5kZWQgd2l0aCBhcyBtYW55ICA8Yj5uaWw8L2I+J3MgYXMgbmVlZGVkLgorSWYgdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgZW5kcyB3aXRoIGEgZnVuY3Rpb24gY2FsbCwKK3RoZW4gYWxsIHZhbHVlcyByZXR1cm5lZCBieSB0aGF0IGNhbGwgZW50ZXIgdGhlIGxpc3Qgb2YgdmFsdWVzLAorYmVmb3JlIHRoZSBhZGp1c3RtZW50CisoZXhjZXB0IHdoZW4gdGhlIGNhbGwgaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXM7IHNlZSA8YSBocmVmPSIjMy40Ij4mc2VjdDszLjQ8L2E+KS4KKworCis8cD4KK1RoZSBhc3NpZ25tZW50IHN0YXRlbWVudCBmaXJzdCBldmFsdWF0ZXMgYWxsIGl0cyBleHByZXNzaW9ucworYW5kIG9ubHkgdGhlbiBhcmUgdGhlIGFzc2lnbm1lbnRzIHBlcmZvcm1lZC4KK1RodXMgdGhlIGNvZGUKKworPHByZT4KKyAgICAgaSA9IDMKKyAgICAgaSwgYVtpXSA9IGkrMSwgMjAKKzwvcHJlPjxwPgorc2V0cyA8Y29kZT5hWzNdPC9jb2RlPiB0byAyMCwgd2l0aG91dCBhZmZlY3RpbmcgPGNvZGU+YVs0XTwvY29kZT4KK2JlY2F1c2UgdGhlIDxjb2RlPmk8L2NvZGU+IGluIDxjb2RlPmFbaV08L2NvZGU+IGlzIGV2YWx1YXRlZCAodG8gMykKK2JlZm9yZSBpdCBpcyBhc3NpZ25lZCZuYnNwOzQuCitTaW1pbGFybHksIHRoZSBsaW5lCisKKzxwcmU+CisgICAgIHgsIHkgPSB5LCB4Cis8L3ByZT48cD4KK2V4Y2hhbmdlcyB0aGUgdmFsdWVzIG9mIDxjb2RlPng8L2NvZGU+IGFuZCA8Y29kZT55PC9jb2RlPiwKK2FuZAorCis8cHJlPgorICAgICB4LCB5LCB6ID0geSwgeiwgeAorPC9wcmU+PHA+CitjeWNsaWNhbGx5IHBlcm11dGVzIHRoZSB2YWx1ZXMgb2YgPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LCBhbmQgPGNvZGU+ejwvY29kZT4uCisKKworPHA+CitUaGUgbWVhbmluZyBvZiBhc3NpZ25tZW50cyB0byBnbG9iYWwgdmFyaWFibGVzCithbmQgdGFibGUgZmllbGRzIGNhbiBiZSBjaGFuZ2VkIHZpYSBtZXRhdGFibGVzLgorQW4gYXNzaWdubWVudCB0byBhbiBpbmRleGVkIHZhcmlhYmxlIDxjb2RlPnRbaV0gPSB2YWw8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8KKzxjb2RlPnNldHRhYmxlX2V2ZW50KHQsaSx2YWwpPC9jb2RlPi4KKyhTZWUgPGEgaHJlZj0iIzIuNCI+JnNlY3Q7Mi40PC9hPiBmb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUKKzxjb2RlPnNldHRhYmxlX2V2ZW50PC9jb2RlPiBmdW5jdGlvbi4KK1RoaXMgZnVuY3Rpb24gaXMgbm90IGRlZmluZWQgb3IgY2FsbGFibGUgaW4gTHVhLgorV2UgdXNlIGl0IGhlcmUgb25seSBmb3IgZXhwbGFuYXRvcnkgcHVycG9zZXMuKQorCisKKzxwPgorQW4gYXNzaWdubWVudCB0byBhIGdsb2JhbCB2YXJpYWJsZSA8Y29kZT54ID0gdmFsPC9jb2RlPgoraXMgZXF1aXZhbGVudCB0byB0aGUgYXNzaWdubWVudAorPGNvZGU+X0VOVi54ID0gdmFsPC9jb2RlPiAoc2VlIDxhIGhyZWY9IiMyLjIiPiZzZWN0OzIuMjwvYT4pLgorCisKKworCisKKzxoMz4zLjMuNCAmbmRhc2g7IDxhIG5hbWU9IjMuMy40Ij5Db250cm9sIFN0cnVjdHVyZXM8L2E+PC9oMz48cD4KK1RoZSBjb250cm9sIHN0cnVjdHVyZXMKKzxiPmlmPC9iPiwgPGI+d2hpbGU8L2I+LCBhbmQgPGI+cmVwZWF0PC9iPiBoYXZlIHRoZSB1c3VhbCBtZWFuaW5nIGFuZAorZmFtaWxpYXIgc3ludGF4OgorCisKKworCis8cHJlPgorCXN0YXQgOjo9IDxiPndoaWxlPC9iPiBleHAgPGI+ZG88L2I+IGJsb2NrIDxiPmVuZDwvYj4KKwlzdGF0IDo6PSA8Yj5yZXBlYXQ8L2I+IGJsb2NrIDxiPnVudGlsPC9iPiBleHAKKwlzdGF0IDo6PSA8Yj5pZjwvYj4gZXhwIDxiPnRoZW48L2I+IGJsb2NrIHs8Yj5lbHNlaWY8L2I+IGV4cCA8Yj50aGVuPC9iPiBibG9ja30gWzxiPmVsc2U8L2I+IGJsb2NrXSA8Yj5lbmQ8L2I+Cis8L3ByZT48cD4KK0x1YSBhbHNvIGhhcyBhIDxiPmZvcjwvYj4gc3RhdGVtZW50LCBpbiB0d28gZmxhdm9ycyAoc2VlIDxhIGhyZWY9IiMzLjMuNSI+JnNlY3Q7My4zLjU8L2E+KS4KKworCis8cD4KK1RoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBvZiBhCitjb250cm9sIHN0cnVjdHVyZSBjYW4gcmV0dXJuIGFueSB2YWx1ZS4KK0JvdGggPGI+ZmFsc2U8L2I+IGFuZCA8Yj5uaWw8L2I+IGFyZSBjb25zaWRlcmVkIGZhbHNlLgorQWxsIHZhbHVlcyBkaWZmZXJlbnQgZnJvbSA8Yj5uaWw8L2I+IGFuZCA8Yj5mYWxzZTwvYj4gYXJlIGNvbnNpZGVyZWQgdHJ1ZQorKGluIHBhcnRpY3VsYXIsIHRoZSBudW1iZXIgMCBhbmQgdGhlIGVtcHR5IHN0cmluZyBhcmUgYWxzbyB0cnVlKS4KKworCis8cD4KK0luIHRoZSA8Yj5yZXBlYXQ8L2I+Jm5kYXNoOzxiPnVudGlsPC9iPiBsb29wLAordGhlIGlubmVyIGJsb2NrIGRvZXMgbm90IGVuZCBhdCB0aGUgPGI+dW50aWw8L2I+IGtleXdvcmQsCitidXQgb25seSBhZnRlciB0aGUgY29uZGl0aW9uLgorU28sIHRoZSBjb25kaXRpb24gY2FuIHJlZmVyIHRvIGxvY2FsIHZhcmlhYmxlcworZGVjbGFyZWQgaW5zaWRlIHRoZSBsb29wIGJsb2NrLgorCisKKzxwPgorVGhlIDxiPmdvdG88L2I+IHN0YXRlbWVudCB0cmFuc2ZlcnMgdGhlIHByb2dyYW0gY29udHJvbCB0byBhIGxhYmVsLgorRm9yIHN5bnRhY3RpY2FsIHJlYXNvbnMsCitsYWJlbHMgaW4gTHVhIGFyZSBjb25zaWRlcmVkIHN0YXRlbWVudHMgdG9vOgorCisKKworPHByZT4KKwlzdGF0IDo6PSA8Yj5nb3RvPC9iPiBOYW1lCisJc3RhdCA6Oj0gbGFiZWwKKwlsYWJlbCA6Oj0gJmxzcXVvOzxiPjo6PC9iPiZyc3F1bzsgTmFtZSAmbHNxdW87PGI+Ojo8L2I+JnJzcXVvOworPC9wcmU+CisKKzxwPgorQSBsYWJlbCBpcyB2aXNpYmxlIGluIHRoZSBlbnRpcmUgYmxvY2sgd2hlcmUgaXQgaXMgZGVmaW5lZCwKK2V4Y2VwdAoraW5zaWRlIG5lc3RlZCBibG9ja3Mgd2hlcmUgYSBsYWJlbCB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgZGVmaW5lZCBhbmQKK2luc2lkZSBuZXN0ZWQgZnVuY3Rpb25zLgorQSBnb3RvIG1heSBqdW1wIHRvIGFueSB2aXNpYmxlIGxhYmVsIGFzIGxvbmcgYXMgaXQgZG9lcyBub3QKK2VudGVyIGludG8gdGhlIHNjb3BlIG9mIGEgbG9jYWwgdmFyaWFibGUuCisKKworPHA+CitMYWJlbHMgYW5kIGVtcHR5IHN0YXRlbWVudHMgYXJlIGNhbGxlZCA8ZW0+dm9pZCBzdGF0ZW1lbnRzPC9lbT4sCithcyB0aGV5IHBlcmZvcm0gbm8gYWN0aW9ucy4KKworCis8cD4KK1RoZSA8Yj5icmVhazwvYj4gc3RhdGVtZW50IHRlcm1pbmF0ZXMgdGhlIGV4ZWN1dGlvbiBvZiBhCis8Yj53aGlsZTwvYj4sIDxiPnJlcGVhdDwvYj4sIG9yIDxiPmZvcjwvYj4gbG9vcCwKK3NraXBwaW5nIHRvIHRoZSBuZXh0IHN0YXRlbWVudCBhZnRlciB0aGUgbG9vcDoKKworCis8cHJlPgorCXN0YXQgOjo9IDxiPmJyZWFrPC9iPgorPC9wcmU+PHA+CitBIDxiPmJyZWFrPC9iPiBlbmRzIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIGxvb3AuCisKKworPHA+CitUaGUgPGI+cmV0dXJuPC9iPiBzdGF0ZW1lbnQgaXMgdXNlZCB0byByZXR1cm4gdmFsdWVzCitmcm9tIGEgZnVuY3Rpb24gb3IgYSBjaHVuayAod2hpY2ggaXMgYSBmdW5jdGlvbiBpbiBkaXNndWlzZSkuCisKK0Z1bmN0aW9ucyBjYW4gcmV0dXJuIG1vcmUgdGhhbiBvbmUgdmFsdWUsCitzbyB0aGUgc3ludGF4IGZvciB0aGUgPGI+cmV0dXJuPC9iPiBzdGF0ZW1lbnQgaXMKKworPHByZT4KKwlzdGF0IDo6PSA8Yj5yZXR1cm48L2I+IFtleHBsaXN0XSBbJmxzcXVvOzxiPjs8L2I+JnJzcXVvO10KKzwvcHJlPgorCis8cD4KK1RoZSA8Yj5yZXR1cm48L2I+IHN0YXRlbWVudCBjYW4gb25seSBiZSB3cml0dGVuCithcyB0aGUgbGFzdCBzdGF0ZW1lbnQgb2YgYSBibG9jay4KK0lmIGl0IGlzIHJlYWxseSBuZWNlc3NhcnkgdG8gPGI+cmV0dXJuPC9iPiBpbiB0aGUgbWlkZGxlIG9mIGEgYmxvY2ssCit0aGVuIGFuIGV4cGxpY2l0IGlubmVyIGJsb2NrIGNhbiBiZSB1c2VkLAorYXMgaW4gdGhlIGlkaW9tIDxjb2RlPmRvIHJldHVybiBlbmQ8L2NvZGU+LAorYmVjYXVzZSBub3cgPGI+cmV0dXJuPC9iPiBpcyB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4gaXRzIChpbm5lcikgYmxvY2suCisKKworCisKKworPGgzPjMuMy41ICZuZGFzaDsgPGEgbmFtZT0iMy4zLjUiPkZvciBTdGF0ZW1lbnQ8L2E+PC9oMz4KKworPHA+CisKK1RoZSA8Yj5mb3I8L2I+IHN0YXRlbWVudCBoYXMgdHdvIGZvcm1zOgorb25lIG51bWVyaWMgYW5kIG9uZSBnZW5lcmljLgorCisKKzxwPgorVGhlIG51bWVyaWMgPGI+Zm9yPC9iPiBsb29wIHJlcGVhdHMgYSBibG9jayBvZiBjb2RlIHdoaWxlIGEKK2NvbnRyb2wgdmFyaWFibGUgcnVucyB0aHJvdWdoIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uCitJdCBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6CisKKzxwcmU+CisJc3RhdCA6Oj0gPGI+Zm9yPC9iPiBOYW1lICZsc3F1bzs8Yj49PC9iPiZyc3F1bzsgZXhwICZsc3F1bzs8Yj4sPC9iPiZyc3F1bzsgZXhwIFsmbHNxdW87PGI+LDwvYj4mcnNxdW87IGV4cF0gPGI+ZG88L2I+IGJsb2NrIDxiPmVuZDwvYj4KKzwvcHJlPjxwPgorVGhlIDxlbT5ibG9jazwvZW0+IGlzIHJlcGVhdGVkIGZvciA8ZW0+bmFtZTwvZW0+IHN0YXJ0aW5nIGF0IHRoZSB2YWx1ZSBvZgordGhlIGZpcnN0IDxlbT5leHA8L2VtPiwgdW50aWwgaXQgcGFzc2VzIHRoZSBzZWNvbmQgPGVtPmV4cDwvZW0+IGJ5IHN0ZXBzIG9mIHRoZQordGhpcmQgPGVtPmV4cDwvZW0+LgorTW9yZSBwcmVjaXNlbHksIGEgPGI+Zm9yPC9iPiBzdGF0ZW1lbnQgbGlrZQorCis8cHJlPgorICAgICBmb3IgdiA9IDxlbT5lMTwvZW0+LCA8ZW0+ZTI8L2VtPiwgPGVtPmUzPC9lbT4gZG8gPGVtPmJsb2NrPC9lbT4gZW5kCis8L3ByZT48cD4KK2lzIGVxdWl2YWxlbnQgdG8gdGhlIGNvZGU6CisKKzxwcmU+CisgICAgIGRvCisgICAgICAgbG9jYWwgPGVtPnZhcjwvZW0+LCA8ZW0+bGltaXQ8L2VtPiwgPGVtPnN0ZXA8L2VtPiA9IHRvbnVtYmVyKDxlbT5lMTwvZW0+KSwgdG9udW1iZXIoPGVtPmUyPC9lbT4pLCB0b251bWJlcig8ZW0+ZTM8L2VtPikKKyAgICAgICBpZiBub3QgKDxlbT52YXI8L2VtPiBhbmQgPGVtPmxpbWl0PC9lbT4gYW5kIDxlbT5zdGVwPC9lbT4pIHRoZW4gZXJyb3IoKSBlbmQKKyAgICAgICB3aGlsZSAoPGVtPnN0ZXA8L2VtPiAmZ3Q7IDAgYW5kIDxlbT52YXI8L2VtPiAmbHQ7PSA8ZW0+bGltaXQ8L2VtPikgb3IgKDxlbT5zdGVwPC9lbT4gJmx0Oz0gMCBhbmQgPGVtPnZhcjwvZW0+ICZndDs9IDxlbT5saW1pdDwvZW0+KSBkbworICAgICAgICAgbG9jYWwgdiA9IDxlbT52YXI8L2VtPgorICAgICAgICAgPGVtPmJsb2NrPC9lbT4KKyAgICAgICAgIDxlbT52YXI8L2VtPiA9IDxlbT52YXI8L2VtPiArIDxlbT5zdGVwPC9lbT4KKyAgICAgICBlbmQKKyAgICAgZW5kCis8L3ByZT48cD4KK05vdGUgdGhlIGZvbGxvd2luZzoKKworPHVsPgorCis8bGk+CitBbGwgdGhyZWUgY29udHJvbCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIG9ubHkgb25jZSwKK2JlZm9yZSB0aGUgbG9vcCBzdGFydHMuCitUaGV5IG11c3QgYWxsIHJlc3VsdCBpbiBudW1iZXJzLgorPC9saT4KKworPGxpPgorPGNvZGU+PGVtPnZhcjwvZW0+PC9jb2RlPiwgPGNvZGU+PGVtPmxpbWl0PC9lbT48L2NvZGU+LCBhbmQgPGNvZGU+PGVtPnN0ZXA8L2VtPjwvY29kZT4gYXJlIGludmlzaWJsZSB2YXJpYWJsZXMuCitUaGUgbmFtZXMgc2hvd24gaGVyZSBhcmUgZm9yIGV4cGxhbmF0b3J5IHB1cnBvc2VzIG9ubHkuCis8L2xpPgorCis8bGk+CitJZiB0aGUgdGhpcmQgZXhwcmVzc2lvbiAodGhlIHN0ZXApIGlzIGFic2VudCwKK3RoZW4gYSBzdGVwIG9mJm5ic3A7MSBpcyB1c2VkLgorPC9saT4KKworPGxpPgorWW91IGNhbiB1c2UgPGI+YnJlYWs8L2I+IHRvIGV4aXQgYSA8Yj5mb3I8L2I+IGxvb3AuCis8L2xpPgorCis8bGk+CitUaGUgbG9vcCB2YXJpYWJsZSA8Y29kZT52PC9jb2RlPiBpcyBsb2NhbCB0byB0aGUgbG9vcDsKK3lvdSBjYW5ub3QgdXNlIGl0cyB2YWx1ZSBhZnRlciB0aGUgPGI+Zm9yPC9iPiBlbmRzIG9yIGlzIGJyb2tlbi4KK0lmIHlvdSBuZWVkIHRoaXMgdmFsdWUsCithc3NpZ24gaXQgdG8gYW5vdGhlciB2YXJpYWJsZSBiZWZvcmUgYnJlYWtpbmcgb3IgZXhpdGluZyB0aGUgbG9vcC4KKzwvbGk+CisKKzwvdWw+CisKKzxwPgorVGhlIGdlbmVyaWMgPGI+Zm9yPC9iPiBzdGF0ZW1lbnQgd29ya3Mgb3ZlciBmdW5jdGlvbnMsCitjYWxsZWQgPGVtPml0ZXJhdG9yczwvZW0+LgorT24gZWFjaCBpdGVyYXRpb24sIHRoZSBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvZHVjZSBhIG5ldyB2YWx1ZSwKK3N0b3BwaW5nIHdoZW4gdGhpcyBuZXcgdmFsdWUgaXMgPGI+bmlsPC9iPi4KK1RoZSBnZW5lcmljIDxiPmZvcjwvYj4gbG9vcCBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6CisKKzxwcmU+CisJc3RhdCA6Oj0gPGI+Zm9yPC9iPiBuYW1lbGlzdCA8Yj5pbjwvYj4gZXhwbGlzdCA8Yj5kbzwvYj4gYmxvY2sgPGI+ZW5kPC9iPgorCW5hbWVsaXN0IDo6PSBOYW1lIHsmbHNxdW87PGI+LDwvYj4mcnNxdW87IE5hbWV9Cis8L3ByZT48cD4KK0EgPGI+Zm9yPC9iPiBzdGF0ZW1lbnQgbGlrZQorCis8cHJlPgorICAgICBmb3IgPGVtPnZhcl8xPC9lbT4sICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OywgPGVtPnZhcl9uPC9lbT4gaW4gPGVtPmV4cGxpc3Q8L2VtPiBkbyA8ZW0+YmxvY2s8L2VtPiBlbmQKKzwvcHJlPjxwPgoraXMgZXF1aXZhbGVudCB0byB0aGUgY29kZToKKworPHByZT4KKyAgICAgZG8KKyAgICAgICBsb2NhbCA8ZW0+ZjwvZW0+LCA8ZW0+czwvZW0+LCA8ZW0+dmFyPC9lbT4gPSA8ZW0+ZXhwbGlzdDwvZW0+CisgICAgICAgd2hpbGUgdHJ1ZSBkbworICAgICAgICAgbG9jYWwgPGVtPnZhcl8xPC9lbT4sICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OywgPGVtPnZhcl9uPC9lbT4gPSA8ZW0+ZjwvZW0+KDxlbT5zPC9lbT4sIDxlbT52YXI8L2VtPikKKyAgICAgICAgIGlmIDxlbT52YXJfMTwvZW0+ID09IG5pbCB0aGVuIGJyZWFrIGVuZAorICAgICAgICAgPGVtPnZhcjwvZW0+ID0gPGVtPnZhcl8xPC9lbT4KKyAgICAgICAgIDxlbT5ibG9jazwvZW0+CisgICAgICAgZW5kCisgICAgIGVuZAorPC9wcmU+PHA+CitOb3RlIHRoZSBmb2xsb3dpbmc6CisKKzx1bD4KKworPGxpPgorPGNvZGU+PGVtPmV4cGxpc3Q8L2VtPjwvY29kZT4gaXMgZXZhbHVhdGVkIG9ubHkgb25jZS4KK0l0cyByZXN1bHRzIGFyZSBhbiA8ZW0+aXRlcmF0b3I8L2VtPiBmdW5jdGlvbiwKK2EgPGVtPnN0YXRlPC9lbT4sCithbmQgYW4gaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGZpcnN0IDxlbT5pdGVyYXRvciB2YXJpYWJsZTwvZW0+LgorPC9saT4KKworPGxpPgorPGNvZGU+PGVtPmY8L2VtPjwvY29kZT4sIDxjb2RlPjxlbT5zPC9lbT48L2NvZGU+LCBhbmQgPGNvZGU+PGVtPnZhcjwvZW0+PC9jb2RlPiBhcmUgaW52aXNpYmxlIHZhcmlhYmxlcy4KK1RoZSBuYW1lcyBhcmUgaGVyZSBmb3IgZXhwbGFuYXRvcnkgcHVycG9zZXMgb25seS4KKzwvbGk+CisKKzxsaT4KK1lvdSBjYW4gdXNlIDxiPmJyZWFrPC9iPiB0byBleGl0IGEgPGI+Zm9yPC9iPiBsb29wLgorPC9saT4KKworPGxpPgorVGhlIGxvb3AgdmFyaWFibGVzIDxjb2RlPjxlbT52YXJfaTwvZW0+PC9jb2RlPiBhcmUgbG9jYWwgdG8gdGhlIGxvb3A7Cit5b3UgY2Fubm90IHVzZSB0aGVpciB2YWx1ZXMgYWZ0ZXIgdGhlIDxiPmZvcjwvYj4gZW5kcy4KK0lmIHlvdSBuZWVkIHRoZXNlIHZhbHVlcywKK3RoZW4gYXNzaWduIHRoZW0gdG8gb3RoZXIgdmFyaWFibGVzIGJlZm9yZSBicmVha2luZyBvciBleGl0aW5nIHRoZSBsb29wLgorPC9saT4KKworPC91bD4KKworCisKKworPGgzPjMuMy42ICZuZGFzaDsgPGEgbmFtZT0iMy4zLjYiPkZ1bmN0aW9uIENhbGxzIGFzIFN0YXRlbWVudHM8L2E+PC9oMz48cD4KK1RvIGFsbG93IHBvc3NpYmxlIHNpZGUtZWZmZWN0cywKK2Z1bmN0aW9uIGNhbGxzIGNhbiBiZSBleGVjdXRlZCBhcyBzdGF0ZW1lbnRzOgorCis8cHJlPgorCXN0YXQgOjo9IGZ1bmN0aW9uY2FsbAorPC9wcmU+PHA+CitJbiB0aGlzIGNhc2UsIGFsbCByZXR1cm5lZCB2YWx1ZXMgYXJlIHRocm93biBhd2F5LgorRnVuY3Rpb24gY2FsbHMgYXJlIGV4cGxhaW5lZCBpbiA8YSBocmVmPSIjMy40LjkiPiZzZWN0OzMuNC45PC9hPi4KKworCisKKworCis8aDM+My4zLjcgJm5kYXNoOyA8YSBuYW1lPSIzLjMuNyI+TG9jYWwgRGVjbGFyYXRpb25zPC9hPjwvaDM+PHA+CitMb2NhbCB2YXJpYWJsZXMgY2FuIGJlIGRlY2xhcmVkIGFueXdoZXJlIGluc2lkZSBhIGJsb2NrLgorVGhlIGRlY2xhcmF0aW9uIGNhbiBpbmNsdWRlIGFuIGluaXRpYWwgYXNzaWdubWVudDoKKworPHByZT4KKwlzdGF0IDo6PSA8Yj5sb2NhbDwvYj4gbmFtZWxpc3QgWyZsc3F1bzs8Yj49PC9iPiZyc3F1bzsgZXhwbGlzdF0KKzwvcHJlPjxwPgorSWYgcHJlc2VudCwgYW4gaW5pdGlhbCBhc3NpZ25tZW50IGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MKK29mIGEgbXVsdGlwbGUgYXNzaWdubWVudCAoc2VlIDxhIGhyZWY9IiMzLjMuMyI+JnNlY3Q7My4zLjM8L2E+KS4KK090aGVyd2lzZSwgYWxsIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCA8Yj5uaWw8L2I+LgorCisKKzxwPgorQSBjaHVuayBpcyBhbHNvIGEgYmxvY2sgKHNlZSA8YSBocmVmPSIjMy4zLjIiPiZzZWN0OzMuMy4yPC9hPiksCithbmQgc28gbG9jYWwgdmFyaWFibGVzIGNhbiBiZSBkZWNsYXJlZCBpbiBhIGNodW5rIG91dHNpZGUgYW55IGV4cGxpY2l0IGJsb2NrLgorCisKKzxwPgorVGhlIHZpc2liaWxpdHkgcnVsZXMgZm9yIGxvY2FsIHZhcmlhYmxlcyBhcmUgZXhwbGFpbmVkIGluIDxhIGhyZWY9IiMzLjUiPiZzZWN0OzMuNTwvYT4uCisKKworCisKKworCisKKzxoMj4zLjQgJm5kYXNoOyA8YSBuYW1lPSIzLjQiPkV4cHJlc3Npb25zPC9hPjwvaDI+CisKKzxwPgorVGhlIGJhc2ljIGV4cHJlc3Npb25zIGluIEx1YSBhcmUgdGhlIGZvbGxvd2luZzoKKworPHByZT4KKwlleHAgOjo9IHByZWZpeGV4cAorCWV4cCA6Oj0gPGI+bmlsPC9iPiB8IDxiPmZhbHNlPC9iPiB8IDxiPnRydWU8L2I+CisJZXhwIDo6PSBOdW1iZXIKKwlleHAgOjo9IFN0cmluZworCWV4cCA6Oj0gZnVuY3Rpb25kZWYKKwlleHAgOjo9IHRhYmxlY29uc3RydWN0b3IKKwlleHAgOjo9ICZsc3F1bzs8Yj4uLi48L2I+JnJzcXVvOworCWV4cCA6Oj0gZXhwIGJpbm9wIGV4cAorCWV4cCA6Oj0gdW5vcCBleHAKKwlwcmVmaXhleHAgOjo9IHZhciB8IGZ1bmN0aW9uY2FsbCB8ICZsc3F1bzs8Yj4oPC9iPiZyc3F1bzsgZXhwICZsc3F1bzs8Yj4pPC9iPiZyc3F1bzsKKzwvcHJlPgorCis8cD4KK051bWJlcnMgYW5kIGxpdGVyYWwgc3RyaW5ncyBhcmUgZXhwbGFpbmVkIGluIDxhIGhyZWY9IiMzLjEiPiZzZWN0OzMuMTwvYT47Cit2YXJpYWJsZXMgYXJlIGV4cGxhaW5lZCBpbiA8YSBocmVmPSIjMy4yIj4mc2VjdDszLjI8L2E+OworZnVuY3Rpb24gZGVmaW5pdGlvbnMgYXJlIGV4cGxhaW5lZCBpbiA8YSBocmVmPSIjMy40LjEwIj4mc2VjdDszLjQuMTA8L2E+OworZnVuY3Rpb24gY2FsbHMgYXJlIGV4cGxhaW5lZCBpbiA8YSBocmVmPSIjMy40LjkiPiZzZWN0OzMuNC45PC9hPjsKK3RhYmxlIGNvbnN0cnVjdG9ycyBhcmUgZXhwbGFpbmVkIGluIDxhIGhyZWY9IiMzLjQuOCI+JnNlY3Q7My40Ljg8L2E+LgorVmFyYXJnIGV4cHJlc3Npb25zLAorZGVub3RlZCBieSB0aHJlZSBkb3RzICgnPGNvZGU+Li4uPC9jb2RlPicpLCBjYW4gb25seSBiZSB1c2VkIHdoZW4KK2RpcmVjdGx5IGluc2lkZSBhIHZhcmFyZyBmdW5jdGlvbjsKK3RoZXkgYXJlIGV4cGxhaW5lZCBpbiA8YSBocmVmPSIjMy40LjEwIj4mc2VjdDszLjQuMTA8L2E+LgorCisKKzxwPgorQmluYXJ5IG9wZXJhdG9ycyBjb21wcmlzZSBhcml0aG1ldGljIG9wZXJhdG9ycyAoc2VlIDxhIGhyZWY9IiMzLjQuMSI+JnNlY3Q7My40LjE8L2E+KSwKK3JlbGF0aW9uYWwgb3BlcmF0b3JzIChzZWUgPGEgaHJlZj0iIzMuNC4zIj4mc2VjdDszLjQuMzwvYT4pLCBsb2dpY2FsIG9wZXJhdG9ycyAoc2VlIDxhIGhyZWY9IiMzLjQuNCI+JnNlY3Q7My40LjQ8L2E+KSwKK2FuZCB0aGUgY29uY2F0ZW5hdGlvbiBvcGVyYXRvciAoc2VlIDxhIGhyZWY9IiMzLjQuNSI+JnNlY3Q7My40LjU8L2E+KS4KK1VuYXJ5IG9wZXJhdG9ycyBjb21wcmlzZSB0aGUgdW5hcnkgbWludXMgKHNlZSA8YSBocmVmPSIjMy40LjEiPiZzZWN0OzMuNC4xPC9hPiksCit0aGUgdW5hcnkgPGI+bm90PC9iPiAoc2VlIDxhIGhyZWY9IiMzLjQuNCI+JnNlY3Q7My40LjQ8L2E+KSwKK2FuZCB0aGUgdW5hcnkgPGVtPmxlbmd0aCBvcGVyYXRvcjwvZW0+IChzZWUgPGEgaHJlZj0iIzMuNC42Ij4mc2VjdDszLjQuNjwvYT4pLgorCisKKzxwPgorQm90aCBmdW5jdGlvbiBjYWxscyBhbmQgdmFyYXJnIGV4cHJlc3Npb25zIGNhbiByZXN1bHQgaW4gbXVsdGlwbGUgdmFsdWVzLgorSWYgYSBmdW5jdGlvbiBjYWxsIGlzIHVzZWQgYXMgYSBzdGF0ZW1lbnQgKHNlZSA8YSBocmVmPSIjMy4zLjYiPiZzZWN0OzMuMy42PC9hPiksCit0aGVuIGl0cyByZXR1cm4gbGlzdCBpcyBhZGp1c3RlZCB0byB6ZXJvIGVsZW1lbnRzLAordGh1cyBkaXNjYXJkaW5nIGFsbCByZXR1cm5lZCB2YWx1ZXMuCitJZiBhbiBleHByZXNzaW9uIGlzIHVzZWQgYXMgdGhlIGxhc3QgKG9yIHRoZSBvbmx5KSBlbGVtZW50CitvZiBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMsCit0aGVuIG5vIGFkanVzdG1lbnQgaXMgbWFkZQorKHVubGVzcyB0aGUgZXhwcmVzc2lvbiBpcyBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcykuCitJbiBhbGwgb3RoZXIgY29udGV4dHMsCitMdWEgYWRqdXN0cyB0aGUgcmVzdWx0IGxpc3QgdG8gb25lIGVsZW1lbnQsCitlaXRoZXIgZGlzY2FyZGluZyBhbGwgdmFsdWVzIGV4Y2VwdCB0aGUgZmlyc3Qgb25lCitvciBhZGRpbmcgYSBzaW5nbGUgPGI+bmlsPC9iPiBpZiB0aGVyZSBhcmUgbm8gdmFsdWVzLgorCisKKzxwPgorSGVyZSBhcmUgc29tZSBleGFtcGxlczoKKworPHByZT4KKyAgICAgZigpICAgICAgICAgICAgICAgIC0tIGFkanVzdGVkIHRvIDAgcmVzdWx0cworICAgICBnKGYoKSwgeCkgICAgICAgICAgLS0gZigpIGlzIGFkanVzdGVkIHRvIDEgcmVzdWx0CisgICAgIGcoeCwgZigpKSAgICAgICAgICAtLSBnIGdldHMgeCBwbHVzIGFsbCByZXN1bHRzIGZyb20gZigpCisgICAgIGEsYixjID0gZigpLCB4ICAgICAtLSBmKCkgaXMgYWRqdXN0ZWQgdG8gMSByZXN1bHQgKGMgZ2V0cyBuaWwpCisgICAgIGEsYiA9IC4uLiAgICAgICAgICAtLSBhIGdldHMgdGhlIGZpcnN0IHZhcmFyZyBwYXJhbWV0ZXIsIGIgZ2V0cworICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGhlIHNlY29uZCAoYm90aCBhIGFuZCBiIGNhbiBnZXQgbmlsIGlmIHRoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAtLSBpcyBubyBjb3JyZXNwb25kaW5nIHZhcmFyZyBwYXJhbWV0ZXIpCisgICAgIAorICAgICBhLGIsYyA9IHgsIGYoKSAgICAgLS0gZigpIGlzIGFkanVzdGVkIHRvIDIgcmVzdWx0cworICAgICBhLGIsYyA9IGYoKSAgICAgICAgLS0gZigpIGlzIGFkanVzdGVkIHRvIDMgcmVzdWx0cworICAgICByZXR1cm4gZigpICAgICAgICAgLS0gcmV0dXJucyBhbGwgcmVzdWx0cyBmcm9tIGYoKQorICAgICByZXR1cm4gLi4uICAgICAgICAgLS0gcmV0dXJucyBhbGwgcmVjZWl2ZWQgdmFyYXJnIHBhcmFtZXRlcnMKKyAgICAgcmV0dXJuIHgseSxmKCkgICAgIC0tIHJldHVybnMgeCwgeSwgYW5kIGFsbCByZXN1bHRzIGZyb20gZigpCisgICAgIHtmKCl9ICAgICAgICAgICAgICAtLSBjcmVhdGVzIGEgbGlzdCB3aXRoIGFsbCByZXN1bHRzIGZyb20gZigpCisgICAgIHsuLi59ICAgICAgICAgICAgICAtLSBjcmVhdGVzIGEgbGlzdCB3aXRoIGFsbCB2YXJhcmcgcGFyYW1ldGVycworICAgICB7ZigpLCBuaWx9ICAgICAgICAgLS0gZigpIGlzIGFkanVzdGVkIHRvIDEgcmVzdWx0Cis8L3ByZT4KKworPHA+CitBbnkgZXhwcmVzc2lvbiBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcyBhbHdheXMgcmVzdWx0cyBpbiBvbmx5IG9uZSB2YWx1ZS4KK1RodXMsCis8Y29kZT4oZih4LHkseikpPC9jb2RlPiBpcyBhbHdheXMgYSBzaW5nbGUgdmFsdWUsCitldmVuIGlmIDxjb2RlPmY8L2NvZGU+IHJldHVybnMgc2V2ZXJhbCB2YWx1ZXMuCisoVGhlIHZhbHVlIG9mIDxjb2RlPihmKHgseSx6KSk8L2NvZGU+IGlzIHRoZSBmaXJzdCB2YWx1ZSByZXR1cm5lZCBieSA8Y29kZT5mPC9jb2RlPgorb3IgPGI+bmlsPC9iPiBpZiA8Y29kZT5mPC9jb2RlPiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlcy4pCisKKworCis8aDM+My40LjEgJm5kYXNoOyA8YSBuYW1lPSIzLjQuMSI+QXJpdGhtZXRpYyBPcGVyYXRvcnM8L2E+PC9oMz48cD4KK0x1YSBzdXBwb3J0cyB0aGUgdXN1YWwgYXJpdGhtZXRpYyBvcGVyYXRvcnM6Cit0aGUgYmluYXJ5IDxjb2RlPis8L2NvZGU+IChhZGRpdGlvbiksCis8Y29kZT4tPC9jb2RlPiAoc3VidHJhY3Rpb24pLCA8Y29kZT4qPC9jb2RlPiAobXVsdGlwbGljYXRpb24pLAorPGNvZGU+LzwvY29kZT4gKGRpdmlzaW9uKSwgPGNvZGU+JTwvY29kZT4gKG1vZHVsbyksIGFuZCA8Y29kZT5ePC9jb2RlPiAoZXhwb25lbnRpYXRpb24pOworYW5kIHVuYXJ5IDxjb2RlPi08L2NvZGU+IChtYXRoZW1hdGljYWwgbmVnYXRpb24pLgorSWYgdGhlIG9wZXJhbmRzIGFyZSBudW1iZXJzLCBvciBzdHJpbmdzIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0bworbnVtYmVycyAoc2VlIDxhIGhyZWY9IiMzLjQuMiI+JnNlY3Q7My40LjI8L2E+KSwKK3RoZW4gYWxsIG9wZXJhdGlvbnMgaGF2ZSB0aGUgdXN1YWwgbWVhbmluZy4KK0V4cG9uZW50aWF0aW9uIHdvcmtzIGZvciBhbnkgZXhwb25lbnQuCitGb3IgaW5zdGFuY2UsIDxjb2RlPnheKC0wLjUpPC9jb2RlPiBjb21wdXRlcyB0aGUgaW52ZXJzZSBvZiB0aGUgc3F1YXJlIHJvb3Qgb2YgPGNvZGU+eDwvY29kZT4uCitNb2R1bG8gaXMgZGVmaW5lZCBhcworCis8cHJlPgorICAgICBhICUgYiA9PSBhIC0gbWF0aC5mbG9vcihhL2IpKmIKKzwvcHJlPjxwPgorVGhhdCBpcywgaXQgaXMgdGhlIHJlbWFpbmRlciBvZiBhIGRpdmlzaW9uIHRoYXQgcm91bmRzCit0aGUgcXVvdGllbnQgdG93YXJkcyBtaW51cyBpbmZpbml0eS4KKworCisKKworCis8aDM+My40LjIgJm5kYXNoOyA8YSBuYW1lPSIzLjQuMiI+Q29lcmNpb248L2E+PC9oMz4KKworPHA+CitMdWEgcHJvdmlkZXMgYXV0b21hdGljIGNvbnZlcnNpb24gYmV0d2Vlbgorc3RyaW5nIGFuZCBudW1iZXIgdmFsdWVzIGF0IHJ1biB0aW1lLgorQW55IGFyaXRobWV0aWMgb3BlcmF0aW9uIGFwcGxpZWQgdG8gYSBzdHJpbmcgdHJpZXMgdG8gY29udmVydAordGhpcyBzdHJpbmcgdG8gYSBudW1iZXIsIGZvbGxvd2luZyB0aGUgcnVsZXMgb2YgdGhlIEx1YSBsZXhlci4KKyhUaGUgc3RyaW5nIG1heSBoYXZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBhbmQgYSBzaWduLikKK0NvbnZlcnNlbHksIHdoZW5ldmVyIGEgbnVtYmVyIGlzIHVzZWQgd2hlcmUgYSBzdHJpbmcgaXMgZXhwZWN0ZWQsCit0aGUgbnVtYmVyIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZywgaW4gYSByZWFzb25hYmxlIGZvcm1hdC4KK0ZvciBjb21wbGV0ZSBjb250cm9sIG92ZXIgaG93IG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzLAordXNlIHRoZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IGZ1bmN0aW9uIGZyb20gdGhlIHN0cmluZyBsaWJyYXJ5Cisoc2VlIDxhIGhyZWY9IiNwZGYtc3RyaW5nLmZvcm1hdCI+PGNvZGU+c3RyaW5nLmZvcm1hdDwvY29kZT48L2E+KS4KKworCisKKworCis8aDM+My40LjMgJm5kYXNoOyA8YSBuYW1lPSIzLjQuMyI+UmVsYXRpb25hbCBPcGVyYXRvcnM8L2E+PC9oMz48cD4KK1RoZSByZWxhdGlvbmFsIG9wZXJhdG9ycyBpbiBMdWEgYXJlCisKKzxwcmU+CisgICAgID09ICAgIH49ICAgICZsdDsgICAgICZndDsgICAgICZsdDs9ICAgICZndDs9Cis8L3ByZT48cD4KK1RoZXNlIG9wZXJhdG9ycyBhbHdheXMgcmVzdWx0IGluIDxiPmZhbHNlPC9iPiBvciA8Yj50cnVlPC9iPi4KKworCis8cD4KK0VxdWFsaXR5ICg8Y29kZT49PTwvY29kZT4pIGZpcnN0IGNvbXBhcmVzIHRoZSB0eXBlIG9mIGl0cyBvcGVyYW5kcy4KK0lmIHRoZSB0eXBlcyBhcmUgZGlmZmVyZW50LCB0aGVuIHRoZSByZXN1bHQgaXMgPGI+ZmFsc2U8L2I+LgorT3RoZXJ3aXNlLCB0aGUgdmFsdWVzIG9mIHRoZSBvcGVyYW5kcyBhcmUgY29tcGFyZWQuCitOdW1iZXJzIGFuZCBzdHJpbmdzIGFyZSBjb21wYXJlZCBpbiB0aGUgdXN1YWwgd2F5LgorVGFibGVzLCB1c2VyZGF0YSwgYW5kIHRocmVhZHMKK2FyZSBjb21wYXJlZCBieSByZWZlcmVuY2U6Cit0d28gb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlcXVhbCBvbmx5IGlmIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KK0V2ZXJ5IHRpbWUgeW91IGNyZWF0ZSBhIG5ldyBvYmplY3QKKyhhIHRhYmxlLCB1c2VyZGF0YSwgb3IgdGhyZWFkKSwKK3RoaXMgbmV3IG9iamVjdCBpcyBkaWZmZXJlbnQgZnJvbSBhbnkgcHJldmlvdXNseSBleGlzdGluZyBvYmplY3QuCitDbG9zdXJlcyB3aXRoIHRoZSBzYW1lIHJlZmVyZW5jZSBhcmUgYWx3YXlzIGVxdWFsLgorQ2xvc3VyZXMgd2l0aCBhbnkgZGV0ZWN0YWJsZSBkaWZmZXJlbmNlCisoZGlmZmVyZW50IGJlaGF2aW9yLCBkaWZmZXJlbnQgZGVmaW5pdGlvbikgYXJlIGFsd2F5cyBkaWZmZXJlbnQuCisKKworPHA+CitZb3UgY2FuIGNoYW5nZSB0aGUgd2F5IHRoYXQgTHVhIGNvbXBhcmVzIHRhYmxlcyBhbmQgdXNlcmRhdGEKK2J5IHVzaW5nIHRoZSAiZXEiIG1ldGFtZXRob2QgKHNlZSA8YSBocmVmPSIjMi40Ij4mc2VjdDsyLjQ8L2E+KS4KKworCis8cD4KK1RoZSBjb252ZXJzaW9uIHJ1bGVzIG9mIDxhIGhyZWY9IiMzLjQuMiI+JnNlY3Q7My40LjI8L2E+CitkbyBub3QgYXBwbHkgdG8gZXF1YWxpdHkgY29tcGFyaXNvbnMuCitUaHVzLCA8Y29kZT4iMCI9PTA8L2NvZGU+IGV2YWx1YXRlcyB0byA8Yj5mYWxzZTwvYj4sCithbmQgPGNvZGU+dFswXTwvY29kZT4gYW5kIDxjb2RlPnRbIjAiXTwvY29kZT4gZGVub3RlIGRpZmZlcmVudAorZW50cmllcyBpbiBhIHRhYmxlLgorCisKKzxwPgorVGhlIG9wZXJhdG9yIDxjb2RlPn49PC9jb2RlPiBpcyBleGFjdGx5IHRoZSBuZWdhdGlvbiBvZiBlcXVhbGl0eSAoPGNvZGU+PT08L2NvZGU+KS4KKworCis8cD4KK1RoZSBvcmRlciBvcGVyYXRvcnMgd29yayBhcyBmb2xsb3dzLgorSWYgYm90aCBhcmd1bWVudHMgYXJlIG51bWJlcnMsIHRoZW4gdGhleSBhcmUgY29tcGFyZWQgYXMgc3VjaC4KK090aGVyd2lzZSwgaWYgYm90aCBhcmd1bWVudHMgYXJlIHN0cmluZ3MsCit0aGVuIHRoZWlyIHZhbHVlcyBhcmUgY29tcGFyZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KK090aGVyd2lzZSwgTHVhIHRyaWVzIHRvIGNhbGwgdGhlICJsdCIgb3IgdGhlICJsZSIKK21ldGFtZXRob2QgKHNlZSA8YSBocmVmPSIjMi40Ij4mc2VjdDsyLjQ8L2E+KS4KK0EgY29tcGFyaXNvbiA8Y29kZT5hICZndDsgYjwvY29kZT4gaXMgdHJhbnNsYXRlZCB0byA8Y29kZT5iICZsdDsgYTwvY29kZT4KK2FuZCA8Y29kZT5hICZndDs9IGI8L2NvZGU+IGlzIHRyYW5zbGF0ZWQgdG8gPGNvZGU+YiAmbHQ7PSBhPC9jb2RlPi4KKworCisKKworCis8aDM+My40LjQgJm5kYXNoOyA8YSBuYW1lPSIzLjQuNCI+TG9naWNhbCBPcGVyYXRvcnM8L2E+PC9oMz48cD4KK1RoZSBsb2dpY2FsIG9wZXJhdG9ycyBpbiBMdWEgYXJlCis8Yj5hbmQ8L2I+LCA8Yj5vcjwvYj4sIGFuZCA8Yj5ub3Q8L2I+LgorTGlrZSB0aGUgY29udHJvbCBzdHJ1Y3R1cmVzIChzZWUgPGEgaHJlZj0iIzMuMy40Ij4mc2VjdDszLjMuNDwvYT4pLAorYWxsIGxvZ2ljYWwgb3BlcmF0b3JzIGNvbnNpZGVyIGJvdGggPGI+ZmFsc2U8L2I+IGFuZCA8Yj5uaWw8L2I+IGFzIGZhbHNlCithbmQgYW55dGhpbmcgZWxzZSBhcyB0cnVlLgorCisKKzxwPgorVGhlIG5lZ2F0aW9uIG9wZXJhdG9yIDxiPm5vdDwvYj4gYWx3YXlzIHJldHVybnMgPGI+ZmFsc2U8L2I+IG9yIDxiPnRydWU8L2I+LgorVGhlIGNvbmp1bmN0aW9uIG9wZXJhdG9yIDxiPmFuZDwvYj4gcmV0dXJucyBpdHMgZmlyc3QgYXJndW1lbnQKK2lmIHRoaXMgdmFsdWUgaXMgPGI+ZmFsc2U8L2I+IG9yIDxiPm5pbDwvYj47CitvdGhlcndpc2UsIDxiPmFuZDwvYj4gcmV0dXJucyBpdHMgc2Vjb25kIGFyZ3VtZW50LgorVGhlIGRpc2p1bmN0aW9uIG9wZXJhdG9yIDxiPm9yPC9iPiByZXR1cm5zIGl0cyBmaXJzdCBhcmd1bWVudAoraWYgdGhpcyB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSA8Yj5uaWw8L2I+IGFuZCA8Yj5mYWxzZTwvYj47CitvdGhlcndpc2UsIDxiPm9yPC9iPiByZXR1cm5zIGl0cyBzZWNvbmQgYXJndW1lbnQuCitCb3RoIDxiPmFuZDwvYj4gYW5kIDxiPm9yPC9iPiB1c2Ugc2hvcnQtY3V0IGV2YWx1YXRpb247Cit0aGF0IGlzLAordGhlIHNlY29uZCBvcGVyYW5kIGlzIGV2YWx1YXRlZCBvbmx5IGlmIG5lY2Vzc2FyeS4KK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKKzxwcmU+CisgICAgIDEwIG9yIDIwICAgICAgICAgICAgLS0mZ3Q7IDEwCisgICAgIDEwIG9yIGVycm9yKCkgICAgICAgLS0mZ3Q7IDEwCisgICAgIG5pbCBvciAiYSIgICAgICAgICAgLS0mZ3Q7ICJhIgorICAgICBuaWwgYW5kIDEwICAgICAgICAgIC0tJmd0OyBuaWwKKyAgICAgZmFsc2UgYW5kIGVycm9yKCkgICAtLSZndDsgZmFsc2UKKyAgICAgZmFsc2UgYW5kIG5pbCAgICAgICAtLSZndDsgZmFsc2UKKyAgICAgZmFsc2Ugb3IgbmlsICAgICAgICAtLSZndDsgbmlsCisgICAgIDEwIGFuZCAyMCAgICAgICAgICAgLS0mZ3Q7IDIwCis8L3ByZT48cD4KKyhJbiB0aGlzIG1hbnVhbCwKKzxjb2RlPi0tJmd0OzwvY29kZT4gaW5kaWNhdGVzIHRoZSByZXN1bHQgb2YgdGhlIHByZWNlZGluZyBleHByZXNzaW9uLikKKworCisKKworCis8aDM+My40LjUgJm5kYXNoOyA8YSBuYW1lPSIzLjQuNSI+Q29uY2F0ZW5hdGlvbjwvYT48L2gzPjxwPgorVGhlIHN0cmluZyBjb25jYXRlbmF0aW9uIG9wZXJhdG9yIGluIEx1YSBpcworZGVub3RlZCBieSB0d28gZG90cyAoJzxjb2RlPi4uPC9jb2RlPicpLgorSWYgYm90aCBvcGVyYW5kcyBhcmUgc3RyaW5ncyBvciBudW1iZXJzLCB0aGVuIHRoZXkgYXJlIGNvbnZlcnRlZCB0bworc3RyaW5ncyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG1lbnRpb25lZCBpbiA8YSBocmVmPSIjMy40LjIiPiZzZWN0OzMuNC4yPC9hPi4KK090aGVyd2lzZSwgdGhlIDxjb2RlPl9fY29uY2F0PC9jb2RlPiBtZXRhbWV0aG9kIGlzIGNhbGxlZCAoc2VlIDxhIGhyZWY9IiMyLjQiPiZzZWN0OzIuNDwvYT4pLgorCisKKworCisKKzxoMz4zLjQuNiAmbmRhc2g7IDxhIG5hbWU9IjMuNC42Ij5UaGUgTGVuZ3RoIE9wZXJhdG9yPC9hPjwvaDM+CisKKzxwPgorVGhlIGxlbmd0aCBvcGVyYXRvciBpcyBkZW5vdGVkIGJ5IHRoZSB1bmFyeSBwcmVmaXggb3BlcmF0b3IgPGNvZGU+IzwvY29kZT4uCitUaGUgbGVuZ3RoIG9mIGEgc3RyaW5nIGlzIGl0cyBudW1iZXIgb2YgYnl0ZXMKKyh0aGF0IGlzLCB0aGUgdXN1YWwgbWVhbmluZyBvZiBzdHJpbmcgbGVuZ3RoIHdoZW4gZWFjaAorY2hhcmFjdGVyIGlzIG9uZSBieXRlKS4KKworCis8cD4KK0EgcHJvZ3JhbSBjYW4gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiB0aGUgbGVuZ3RoIG9wZXJhdG9yIGZvcgorYW55IHZhbHVlIGJ1dCBzdHJpbmdzIHRocm91Z2ggdGhlIDxjb2RlPl9fbGVuPC9jb2RlPiBtZXRhbWV0aG9kIChzZWUgPGEgaHJlZj0iIzIuNCI+JnNlY3Q7Mi40PC9hPikuCisKKworPHA+CitVbmxlc3MgYSA8Y29kZT5fX2xlbjwvY29kZT4gbWV0YW1ldGhvZCBpcyBnaXZlbiwKK3RoZSBsZW5ndGggb2YgYSB0YWJsZSA8Y29kZT50PC9jb2RlPiBpcyBvbmx5IGRlZmluZWQgaWYgdGhlCit0YWJsZSBpcyBhIDxlbT5zZXF1ZW5jZTwvZW0+LAordGhhdCBpcywKK3RoZSBzZXQgb2YgaXRzIHBvc2l0aXZlIG51bWVyaWMga2V5cyBpcyBlcXVhbCB0byA8ZW0+ezEuLm59PC9lbT4KK2ZvciBzb21lIGludGVnZXIgPGVtPm48L2VtPi4KK0luIHRoYXQgY2FzZSwgPGVtPm48L2VtPiBpcyBpdHMgbGVuZ3RoLgorTm90ZSB0aGF0IGEgdGFibGUgbGlrZQorCis8cHJlPgorICAgICB7MTAsIDIwLCBuaWwsIDQwfQorPC9wcmU+PHA+CitpcyBub3QgYSBzZXF1ZW5jZSwgYmVjYXVzZSBpdCBoYXMgdGhlIGtleSA8Y29kZT40PC9jb2RlPgorYnV0IGRvZXMgbm90IGhhdmUgdGhlIGtleSA8Y29kZT4zPC9jb2RlPi4KKyhTbywgdGhlcmUgaXMgbm8gPGVtPm48L2VtPiBzdWNoIHRoYXQgdGhlIHNldCA8ZW0+ezEuLm59PC9lbT4gaXMgZXF1YWwKK3RvIHRoZSBzZXQgb2YgcG9zaXRpdmUgbnVtZXJpYyBrZXlzIG9mIHRoYXQgdGFibGUuKQorTm90ZSwgaG93ZXZlciwgdGhhdCBub24tbnVtZXJpYyBrZXlzIGRvIG5vdCBpbnRlcmZlcmUKK3dpdGggd2hldGhlciBhIHRhYmxlIGlzIGEgc2VxdWVuY2UuCisKKworCisKKworPGgzPjMuNC43ICZuZGFzaDsgPGEgbmFtZT0iMy40LjciPlByZWNlZGVuY2U8L2E+PC9oMz48cD4KK09wZXJhdG9yIHByZWNlZGVuY2UgaW4gTHVhIGZvbGxvd3MgdGhlIHRhYmxlIGJlbG93LAorZnJvbSBsb3dlciB0byBoaWdoZXIgcHJpb3JpdHk6CisKKzxwcmU+CisgICAgIG9yCisgICAgIGFuZAorICAgICAmbHQ7ICAgICAmZ3Q7ICAgICAmbHQ7PSAgICAmZ3Q7PSAgICB+PSAgICA9PQorICAgICAuLgorICAgICArICAgICAtCisgICAgICogICAgIC8gICAgICUKKyAgICAgbm90ICAgIyAgICAgLSAodW5hcnkpCisgICAgIF4KKzwvcHJlPjxwPgorQXMgdXN1YWwsCit5b3UgY2FuIHVzZSBwYXJlbnRoZXNlcyB0byBjaGFuZ2UgdGhlIHByZWNlZGVuY2VzIG9mIGFuIGV4cHJlc3Npb24uCitUaGUgY29uY2F0ZW5hdGlvbiAoJzxjb2RlPi4uPC9jb2RlPicpIGFuZCBleHBvbmVudGlhdGlvbiAoJzxjb2RlPl48L2NvZGU+JykKK29wZXJhdG9ycyBhcmUgcmlnaHQgYXNzb2NpYXRpdmUuCitBbGwgb3RoZXIgYmluYXJ5IG9wZXJhdG9ycyBhcmUgbGVmdCBhc3NvY2lhdGl2ZS4KKworCisKKworCis8aDM+My40LjggJm5kYXNoOyA8YSBuYW1lPSIzLjQuOCI+VGFibGUgQ29uc3RydWN0b3JzPC9hPjwvaDM+PHA+CitUYWJsZSBjb25zdHJ1Y3RvcnMgYXJlIGV4cHJlc3Npb25zIHRoYXQgY3JlYXRlIHRhYmxlcy4KK0V2ZXJ5IHRpbWUgYSBjb25zdHJ1Y3RvciBpcyBldmFsdWF0ZWQsIGEgbmV3IHRhYmxlIGlzIGNyZWF0ZWQuCitBIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBlbXB0eSB0YWJsZQorb3IgdG8gY3JlYXRlIGEgdGFibGUgYW5kIGluaXRpYWxpemUgc29tZSBvZiBpdHMgZmllbGRzLgorVGhlIGdlbmVyYWwgc3ludGF4IGZvciBjb25zdHJ1Y3RvcnMgaXMKKworPHByZT4KKwl0YWJsZWNvbnN0cnVjdG9yIDo6PSAmbHNxdW87PGI+ezwvYj4mcnNxdW87IFtmaWVsZGxpc3RdICZsc3F1bzs8Yj59PC9iPiZyc3F1bzsKKwlmaWVsZGxpc3QgOjo9IGZpZWxkIHtmaWVsZHNlcCBmaWVsZH0gW2ZpZWxkc2VwXQorCWZpZWxkIDo6PSAmbHNxdW87PGI+WzwvYj4mcnNxdW87IGV4cCAmbHNxdW87PGI+XTwvYj4mcnNxdW87ICZsc3F1bzs8Yj49PC9iPiZyc3F1bzsgZXhwIHwgTmFtZSAmbHNxdW87PGI+PTwvYj4mcnNxdW87IGV4cCB8IGV4cAorCWZpZWxkc2VwIDo6PSAmbHNxdW87PGI+LDwvYj4mcnNxdW87IHwgJmxzcXVvOzxiPjs8L2I+JnJzcXVvOworPC9wcmU+CisKKzxwPgorRWFjaCBmaWVsZCBvZiB0aGUgZm9ybSA8Y29kZT5bZXhwMV0gPSBleHAyPC9jb2RlPiBhZGRzIHRvIHRoZSBuZXcgdGFibGUgYW4gZW50cnkKK3dpdGgga2V5IDxjb2RlPmV4cDE8L2NvZGU+IGFuZCB2YWx1ZSA8Y29kZT5leHAyPC9jb2RlPi4KK0EgZmllbGQgb2YgdGhlIGZvcm0gPGNvZGU+bmFtZSA9IGV4cDwvY29kZT4gaXMgZXF1aXZhbGVudCB0bworPGNvZGU+WyJuYW1lIl0gPSBleHA8L2NvZGU+LgorRmluYWxseSwgZmllbGRzIG9mIHRoZSBmb3JtIDxjb2RlPmV4cDwvY29kZT4gYXJlIGVxdWl2YWxlbnQgdG8KKzxjb2RlPltpXSA9IGV4cDwvY29kZT4sIHdoZXJlIDxjb2RlPmk8L2NvZGU+IGFyZSBjb25zZWN1dGl2ZSBudW1lcmljYWwgaW50ZWdlcnMsCitzdGFydGluZyB3aXRoIDEuCitGaWVsZHMgaW4gdGhlIG90aGVyIGZvcm1hdHMgZG8gbm90IGFmZmVjdCB0aGlzIGNvdW50aW5nLgorRm9yIGV4YW1wbGUsCisKKzxwcmU+CisgICAgIGEgPSB7IFtmKDEpXSA9IGc7ICJ4IiwgInkiOyB4ID0gMSwgZih4KSwgWzMwXSA9IDIzOyA0NSB9Cis8L3ByZT48cD4KK2lzIGVxdWl2YWxlbnQgdG8KKworPHByZT4KKyAgICAgZG8KKyAgICAgICBsb2NhbCB0ID0ge30KKyAgICAgICB0W2YoMSldID0gZworICAgICAgIHRbMV0gPSAieCIgICAgICAgICAtLSAxc3QgZXhwCisgICAgICAgdFsyXSA9ICJ5IiAgICAgICAgIC0tIDJuZCBleHAKKyAgICAgICB0LnggPSAxICAgICAgICAgICAgLS0gdFsieCJdID0gMQorICAgICAgIHRbM10gPSBmKHgpICAgICAgICAtLSAzcmQgZXhwCisgICAgICAgdFszMF0gPSAyMworICAgICAgIHRbNF0gPSA0NSAgICAgICAgICAtLSA0dGggZXhwCisgICAgICAgYSA9IHQKKyAgICAgZW5kCis8L3ByZT4KKworPHA+CitJZiB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgbGlzdCBoYXMgdGhlIGZvcm0gPGNvZGU+ZXhwPC9jb2RlPgorYW5kIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb24gY2FsbCBvciBhIHZhcmFyZyBleHByZXNzaW9uLAordGhlbiBhbGwgdmFsdWVzIHJldHVybmVkIGJ5IHRoaXMgZXhwcmVzc2lvbiBlbnRlciB0aGUgbGlzdCBjb25zZWN1dGl2ZWx5Cisoc2VlIDxhIGhyZWY9IiMzLjQuOSI+JnNlY3Q7My40Ljk8L2E+KS4KKworCis8cD4KK1RoZSBmaWVsZCBsaXN0IGNhbiBoYXZlIGFuIG9wdGlvbmFsIHRyYWlsaW5nIHNlcGFyYXRvciwKK2FzIGEgY29udmVuaWVuY2UgZm9yIG1hY2hpbmUtZ2VuZXJhdGVkIGNvZGUuCisKKworCisKKworPGgzPjMuNC45ICZuZGFzaDsgPGEgbmFtZT0iMy40LjkiPkZ1bmN0aW9uIENhbGxzPC9hPjwvaDM+PHA+CitBIGZ1bmN0aW9uIGNhbGwgaW4gTHVhIGhhcyB0aGUgZm9sbG93aW5nIHN5bnRheDoKKworPHByZT4KKwlmdW5jdGlvbmNhbGwgOjo9IHByZWZpeGV4cCBhcmdzCis8L3ByZT48cD4KK0luIGEgZnVuY3Rpb24gY2FsbCwKK2ZpcnN0IHByZWZpeGV4cCBhbmQgYXJncyBhcmUgZXZhbHVhdGVkLgorSWYgdGhlIHZhbHVlIG9mIHByZWZpeGV4cCBoYXMgdHlwZSA8ZW0+ZnVuY3Rpb248L2VtPiwKK3RoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKK3dpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KK090aGVyd2lzZSwgdGhlIHByZWZpeGV4cCAiY2FsbCIgbWV0YW1ldGhvZCBpcyBjYWxsZWQsCitoYXZpbmcgYXMgZmlyc3QgcGFyYW1ldGVyIHRoZSB2YWx1ZSBvZiBwcmVmaXhleHAsCitmb2xsb3dlZCBieSB0aGUgb3JpZ2luYWwgY2FsbCBhcmd1bWVudHMKKyhzZWUgPGEgaHJlZj0iIzIuNCI+JnNlY3Q7Mi40PC9hPikuCisKKworPHA+CitUaGUgZm9ybQorCis8cHJlPgorCWZ1bmN0aW9uY2FsbCA6Oj0gcHJlZml4ZXhwICZsc3F1bzs8Yj46PC9iPiZyc3F1bzsgTmFtZSBhcmdzCis8L3ByZT48cD4KK2NhbiBiZSB1c2VkIHRvIGNhbGwgIm1ldGhvZHMiLgorQSBjYWxsIDxjb2RlPnY6bmFtZSg8ZW0+YXJnczwvZW0+KTwvY29kZT4KK2lzIHN5bnRhY3RpYyBzdWdhciBmb3IgPGNvZGU+di5uYW1lKHYsPGVtPmFyZ3M8L2VtPik8L2NvZGU+LAorZXhjZXB0IHRoYXQgPGNvZGU+djwvY29kZT4gaXMgZXZhbHVhdGVkIG9ubHkgb25jZS4KKworCis8cD4KK0FyZ3VtZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorCis8cHJlPgorCWFyZ3MgOjo9ICZsc3F1bzs8Yj4oPC9iPiZyc3F1bzsgW2V4cGxpc3RdICZsc3F1bzs8Yj4pPC9iPiZyc3F1bzsKKwlhcmdzIDo6PSB0YWJsZWNvbnN0cnVjdG9yCisJYXJncyA6Oj0gU3RyaW5nCis8L3ByZT48cD4KK0FsbCBhcmd1bWVudCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGJlZm9yZSB0aGUgY2FsbC4KK0EgY2FsbCBvZiB0aGUgZm9ybSA8Y29kZT5mezxlbT5maWVsZHM8L2VtPn08L2NvZGU+IGlzCitzeW50YWN0aWMgc3VnYXIgZm9yIDxjb2RlPmYoezxlbT5maWVsZHM8L2VtPn0pPC9jb2RlPjsKK3RoYXQgaXMsIHRoZSBhcmd1bWVudCBsaXN0IGlzIGEgc2luZ2xlIG5ldyB0YWJsZS4KK0EgY2FsbCBvZiB0aGUgZm9ybSA8Y29kZT5mJzxlbT5zdHJpbmc8L2VtPic8L2NvZGU+Cisob3IgPGNvZGU+ZiI8ZW0+c3RyaW5nPC9lbT4iPC9jb2RlPiBvciA8Y29kZT5mW1s8ZW0+c3RyaW5nPC9lbT5dXTwvY29kZT4pCitpcyBzeW50YWN0aWMgc3VnYXIgZm9yIDxjb2RlPmYoJzxlbT5zdHJpbmc8L2VtPicpPC9jb2RlPjsKK3RoYXQgaXMsIHRoZSBhcmd1bWVudCBsaXN0IGlzIGEgc2luZ2xlIGxpdGVyYWwgc3RyaW5nLgorCisKKzxwPgorQSBjYWxsIG9mIHRoZSBmb3JtIDxjb2RlPnJldHVybiA8ZW0+ZnVuY3Rpb25jYWxsPC9lbT48L2NvZGU+IGlzIGNhbGxlZAorYSA8ZW0+dGFpbCBjYWxsPC9lbT4uCitMdWEgaW1wbGVtZW50cyA8ZW0+cHJvcGVyIHRhaWwgY2FsbHM8L2VtPgorKG9yIDxlbT5wcm9wZXIgdGFpbCByZWN1cnNpb248L2VtPik6CitpbiBhIHRhaWwgY2FsbCwKK3RoZSBjYWxsZWQgZnVuY3Rpb24gcmV1c2VzIHRoZSBzdGFjayBlbnRyeSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi4KK1RoZXJlZm9yZSwgdGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBuZXN0ZWQgdGFpbCBjYWxscyB0aGF0CithIHByb2dyYW0gY2FuIGV4ZWN1dGUuCitIb3dldmVyLCBhIHRhaWwgY2FsbCBlcmFzZXMgYW55IGRlYnVnIGluZm9ybWF0aW9uIGFib3V0IHRoZQorY2FsbGluZyBmdW5jdGlvbi4KK05vdGUgdGhhdCBhIHRhaWwgY2FsbCBvbmx5IGhhcHBlbnMgd2l0aCBhIHBhcnRpY3VsYXIgc3ludGF4LAord2hlcmUgdGhlIDxiPnJldHVybjwvYj4gaGFzIG9uZSBzaW5nbGUgZnVuY3Rpb24gY2FsbCBhcyBhcmd1bWVudDsKK3RoaXMgc3ludGF4IG1ha2VzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHJldHVybiBleGFjdGx5Cit0aGUgcmV0dXJucyBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9uLgorU28sIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBleGFtcGxlcyBhcmUgdGFpbCBjYWxsczoKKworPHByZT4KKyAgICAgcmV0dXJuIChmKHgpKSAgICAgICAgLS0gcmVzdWx0cyBhZGp1c3RlZCB0byAxCisgICAgIHJldHVybiAyICogZih4KQorICAgICByZXR1cm4geCwgZih4KSAgICAgICAtLSBhZGRpdGlvbmFsIHJlc3VsdHMKKyAgICAgZih4KTsgcmV0dXJuICAgICAgICAgLS0gcmVzdWx0cyBkaXNjYXJkZWQKKyAgICAgcmV0dXJuIHggb3IgZih4KSAgICAgLS0gcmVzdWx0cyBhZGp1c3RlZCB0byAxCis8L3ByZT4KKworCisKKworPGgzPjMuNC4xMCAmbmRhc2g7IDxhIG5hbWU9IjMuNC4xMCI+RnVuY3Rpb24gRGVmaW5pdGlvbnM8L2E+PC9oMz4KKworPHA+CitUaGUgc3ludGF4IGZvciBmdW5jdGlvbiBkZWZpbml0aW9uIGlzCisKKzxwcmU+CisJZnVuY3Rpb25kZWYgOjo9IDxiPmZ1bmN0aW9uPC9iPiBmdW5jYm9keQorCWZ1bmNib2R5IDo6PSAmbHNxdW87PGI+KDwvYj4mcnNxdW87IFtwYXJsaXN0XSAmbHNxdW87PGI+KTwvYj4mcnNxdW87IGJsb2NrIDxiPmVuZDwvYj4KKzwvcHJlPgorCis8cD4KK1RoZSBmb2xsb3dpbmcgc3ludGFjdGljIHN1Z2FyIHNpbXBsaWZpZXMgZnVuY3Rpb24gZGVmaW5pdGlvbnM6CisKKzxwcmU+CisJc3RhdCA6Oj0gPGI+ZnVuY3Rpb248L2I+IGZ1bmNuYW1lIGZ1bmNib2R5CisJc3RhdCA6Oj0gPGI+bG9jYWw8L2I+IDxiPmZ1bmN0aW9uPC9iPiBOYW1lIGZ1bmNib2R5CisJZnVuY25hbWUgOjo9IE5hbWUgeyZsc3F1bzs8Yj4uPC9iPiZyc3F1bzsgTmFtZX0gWyZsc3F1bzs8Yj46PC9iPiZyc3F1bzsgTmFtZV0KKzwvcHJlPjxwPgorVGhlIHN0YXRlbWVudAorCis8cHJlPgorICAgICBmdW5jdGlvbiBmICgpIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT48cD4KK3RyYW5zbGF0ZXMgdG8KKworPHByZT4KKyAgICAgZiA9IGZ1bmN0aW9uICgpIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT48cD4KK1RoZSBzdGF0ZW1lbnQKKworPHByZT4KKyAgICAgZnVuY3Rpb24gdC5hLmIuYy5mICgpIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT48cD4KK3RyYW5zbGF0ZXMgdG8KKworPHByZT4KKyAgICAgdC5hLmIuYy5mID0gZnVuY3Rpb24gKCkgPGVtPmJvZHk8L2VtPiBlbmQKKzwvcHJlPjxwPgorVGhlIHN0YXRlbWVudAorCis8cHJlPgorICAgICBsb2NhbCBmdW5jdGlvbiBmICgpIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT48cD4KK3RyYW5zbGF0ZXMgdG8KKworPHByZT4KKyAgICAgbG9jYWwgZjsgZiA9IGZ1bmN0aW9uICgpIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT48cD4KK25vdCB0bworCis8cHJlPgorICAgICBsb2NhbCBmID0gZnVuY3Rpb24gKCkgPGVtPmJvZHk8L2VtPiBlbmQKKzwvcHJlPjxwPgorKFRoaXMgb25seSBtYWtlcyBhIGRpZmZlcmVuY2Ugd2hlbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24KK2NvbnRhaW5zIHJlZmVyZW5jZXMgdG8gPGNvZGU+ZjwvY29kZT4uKQorCisKKzxwPgorQSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgZXhwcmVzc2lvbiwKK3dob3NlIHZhbHVlIGhhcyB0eXBlIDxlbT5mdW5jdGlvbjwvZW0+LgorV2hlbiBMdWEgcHJlY29tcGlsZXMgYSBjaHVuaywKK2FsbCBpdHMgZnVuY3Rpb24gYm9kaWVzIGFyZSBwcmVjb21waWxlZCB0b28uCitUaGVuLCB3aGVuZXZlciBMdWEgZXhlY3V0ZXMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24sCit0aGUgZnVuY3Rpb24gaXMgPGVtPmluc3RhbnRpYXRlZDwvZW0+IChvciA8ZW0+Y2xvc2VkPC9lbT4pLgorVGhpcyBmdW5jdGlvbiBpbnN0YW5jZSAob3IgPGVtPmNsb3N1cmU8L2VtPikKK2lzIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4KKworCis8cD4KK1BhcmFtZXRlcnMgYWN0IGFzIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZQoraW5pdGlhbGl6ZWQgd2l0aCB0aGUgYXJndW1lbnQgdmFsdWVzOgorCis8cHJlPgorCXBhcmxpc3QgOjo9IG5hbWVsaXN0IFsmbHNxdW87PGI+LDwvYj4mcnNxdW87ICZsc3F1bzs8Yj4uLi48L2I+JnJzcXVvO10gfCAmbHNxdW87PGI+Li4uPC9iPiZyc3F1bzsKKzwvcHJlPjxwPgorV2hlbiBhIGZ1bmN0aW9uIGlzIGNhbGxlZCwKK3RoZSBsaXN0IG9mIGFyZ3VtZW50cyBpcyBhZGp1c3RlZCB0bwordGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzLAordW5sZXNzIHRoZSBmdW5jdGlvbiBpcyBhIDxlbT52YXJhcmcgZnVuY3Rpb248L2VtPiwKK3doaWNoIGlzIGluZGljYXRlZCBieSB0aHJlZSBkb3RzICgnPGNvZGU+Li4uPC9jb2RlPicpCithdCB0aGUgZW5kIG9mIGl0cyBwYXJhbWV0ZXIgbGlzdC4KK0EgdmFyYXJnIGZ1bmN0aW9uIGRvZXMgbm90IGFkanVzdCBpdHMgYXJndW1lbnQgbGlzdDsKK2luc3RlYWQsIGl0IGNvbGxlY3RzIGFsbCBleHRyYSBhcmd1bWVudHMgYW5kIHN1cHBsaWVzIHRoZW0KK3RvIHRoZSBmdW5jdGlvbiB0aHJvdWdoIGEgPGVtPnZhcmFyZyBleHByZXNzaW9uPC9lbT4sCit3aGljaCBpcyBhbHNvIHdyaXR0ZW4gYXMgdGhyZWUgZG90cy4KK1RoZSB2YWx1ZSBvZiB0aGlzIGV4cHJlc3Npb24gaXMgYSBsaXN0IG9mIGFsbCBhY3R1YWwgZXh0cmEgYXJndW1lbnRzLAorc2ltaWxhciB0byBhIGZ1bmN0aW9uIHdpdGggbXVsdGlwbGUgcmVzdWx0cy4KK0lmIGEgdmFyYXJnIGV4cHJlc3Npb24gaXMgdXNlZCBpbnNpZGUgYW5vdGhlciBleHByZXNzaW9uCitvciBpbiB0aGUgbWlkZGxlIG9mIGEgbGlzdCBvZiBleHByZXNzaW9ucywKK3RoZW4gaXRzIHJldHVybiBsaXN0IGlzIGFkanVzdGVkIHRvIG9uZSBlbGVtZW50LgorSWYgdGhlIGV4cHJlc3Npb24gaXMgdXNlZCBhcyB0aGUgbGFzdCBlbGVtZW50IG9mIGEgbGlzdCBvZiBleHByZXNzaW9ucywKK3RoZW4gbm8gYWRqdXN0bWVudCBpcyBtYWRlCisodW5sZXNzIHRoYXQgbGFzdCBleHByZXNzaW9uIGlzIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzKS4KKworCis8cD4KK0FzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CisKKzxwcmU+CisgICAgIGZ1bmN0aW9uIGYoYSwgYikgZW5kCisgICAgIGZ1bmN0aW9uIGcoYSwgYiwgLi4uKSBlbmQKKyAgICAgZnVuY3Rpb24gcigpIHJldHVybiAxLDIsMyBlbmQKKzwvcHJlPjxwPgorVGhlbiwgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIG1hcHBpbmcgZnJvbSBhcmd1bWVudHMgdG8gcGFyYW1ldGVycyBhbmQKK3RvIHRoZSB2YXJhcmcgZXhwcmVzc2lvbjoKKworPHByZT4KKyAgICAgQ0FMTCAgICAgICAgICAgIFBBUkFNRVRFUlMKKyAgICAgCisgICAgIGYoMykgICAgICAgICAgICAgYT0zLCBiPW5pbAorICAgICBmKDMsIDQpICAgICAgICAgIGE9MywgYj00CisgICAgIGYoMywgNCwgNSkgICAgICAgYT0zLCBiPTQKKyAgICAgZihyKCksIDEwKSAgICAgICBhPTEsIGI9MTAKKyAgICAgZihyKCkpICAgICAgICAgICBhPTEsIGI9MgorICAgICAKKyAgICAgZygzKSAgICAgICAgICAgICBhPTMsIGI9bmlsLCAuLi4gLS0mZ3Q7ICAobm90aGluZykKKyAgICAgZygzLCA0KSAgICAgICAgICBhPTMsIGI9NCwgICAuLi4gLS0mZ3Q7ICAobm90aGluZykKKyAgICAgZygzLCA0LCA1LCA4KSAgICBhPTMsIGI9NCwgICAuLi4gLS0mZ3Q7ICA1ICA4CisgICAgIGcoNSwgcigpKSAgICAgICAgYT01LCBiPTEsICAgLi4uIC0tJmd0OyAgMiAgMworPC9wcmU+CisKKzxwPgorUmVzdWx0cyBhcmUgcmV0dXJuZWQgdXNpbmcgdGhlIDxiPnJldHVybjwvYj4gc3RhdGVtZW50IChzZWUgPGEgaHJlZj0iIzMuMy40Ij4mc2VjdDszLjMuNDwvYT4pLgorSWYgY29udHJvbCByZWFjaGVzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbgord2l0aG91dCBlbmNvdW50ZXJpbmcgYSA8Yj5yZXR1cm48L2I+IHN0YXRlbWVudCwKK3RoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgd2l0aCBubyByZXN1bHRzLgorCisKKzxwPgorCitUaGVyZSBpcyBhIHN5c3RlbS1kZXBlbmRlbnQgbGltaXQgb24gdGhlIG51bWJlciBvZiB2YWx1ZXMKK3RoYXQgYSBmdW5jdGlvbiBtYXkgcmV0dXJuLgorVGhpcyBsaW1pdCBpcyBndWFyYW50ZWVkIHRvIGJlIGxhcmdlciB0aGFuIDEwMDAuCisKKworPHA+CitUaGUgPGVtPmNvbG9uPC9lbT4gc3ludGF4CitpcyB1c2VkIGZvciBkZWZpbmluZyA8ZW0+bWV0aG9kczwvZW0+LAordGhhdCBpcywgZnVuY3Rpb25zIHRoYXQgaGF2ZSBhbiBpbXBsaWNpdCBleHRyYSBwYXJhbWV0ZXIgPGNvZGU+c2VsZjwvY29kZT4uCitUaHVzLCB0aGUgc3RhdGVtZW50CisKKzxwcmU+CisgICAgIGZ1bmN0aW9uIHQuYS5iLmM6ZiAoPGVtPnBhcmFtczwvZW0+KSA8ZW0+Ym9keTwvZW0+IGVuZAorPC9wcmU+PHA+CitpcyBzeW50YWN0aWMgc3VnYXIgZm9yCisKKzxwcmU+CisgICAgIHQuYS5iLmMuZiA9IGZ1bmN0aW9uIChzZWxmLCA8ZW0+cGFyYW1zPC9lbT4pIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT4KKworCisKKworCisKKzxoMj4zLjUgJm5kYXNoOyA8YSBuYW1lPSIzLjUiPlZpc2liaWxpdHkgUnVsZXM8L2E+PC9oMj4KKworPHA+CisKK0x1YSBpcyBhIGxleGljYWxseSBzY29wZWQgbGFuZ3VhZ2UuCitUaGUgc2NvcGUgb2YgYSBsb2NhbCB2YXJpYWJsZSBiZWdpbnMgYXQgdGhlIGZpcnN0IHN0YXRlbWVudCBhZnRlcgoraXRzIGRlY2xhcmF0aW9uIGFuZCBsYXN0cyB1bnRpbCB0aGUgbGFzdCBub24tdm9pZCBzdGF0ZW1lbnQKK29mIHRoZSBpbm5lcm1vc3QgYmxvY2sgdGhhdCBpbmNsdWRlcyB0aGUgZGVjbGFyYXRpb24uCitDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKKzxwcmU+CisgICAgIHggPSAxMCAgICAgICAgICAgICAgICAtLSBnbG9iYWwgdmFyaWFibGUKKyAgICAgZG8gICAgICAgICAgICAgICAgICAgIC0tIG5ldyBibG9jaworICAgICAgIGxvY2FsIHggPSB4ICAgICAgICAgLS0gbmV3ICd4Jywgd2l0aCB2YWx1ZSAxMAorICAgICAgIHByaW50KHgpICAgICAgICAgICAgLS0mZ3Q7IDEwCisgICAgICAgeCA9IHgrMQorICAgICAgIGRvICAgICAgICAgICAgICAgICAgLS0gYW5vdGhlciBibG9jaworICAgICAgICAgbG9jYWwgeCA9IHgrMSAgICAgLS0gYW5vdGhlciAneCcKKyAgICAgICAgIHByaW50KHgpICAgICAgICAgIC0tJmd0OyAxMgorICAgICAgIGVuZAorICAgICAgIHByaW50KHgpICAgICAgICAgICAgLS0mZ3Q7IDExCisgICAgIGVuZAorICAgICBwcmludCh4KSAgICAgICAgICAgICAgLS0mZ3Q7IDEwICAodGhlIGdsb2JhbCBvbmUpCis8L3ByZT4KKworPHA+CitOb3RpY2UgdGhhdCwgaW4gYSBkZWNsYXJhdGlvbiBsaWtlIDxjb2RlPmxvY2FsIHggPSB4PC9jb2RlPiwKK3RoZSBuZXcgPGNvZGU+eDwvY29kZT4gYmVpbmcgZGVjbGFyZWQgaXMgbm90IGluIHNjb3BlIHlldCwKK2FuZCBzbyB0aGUgc2Vjb25kIDxjb2RlPng8L2NvZGU+IHJlZmVycyB0byB0aGUgb3V0c2lkZSB2YXJpYWJsZS4KKworCis8cD4KK0JlY2F1c2Ugb2YgdGhlIGxleGljYWwgc2NvcGluZyBydWxlcywKK2xvY2FsIHZhcmlhYmxlcyBjYW4gYmUgZnJlZWx5IGFjY2Vzc2VkIGJ5IGZ1bmN0aW9ucworZGVmaW5lZCBpbnNpZGUgdGhlaXIgc2NvcGUuCitBIGxvY2FsIHZhcmlhYmxlIHVzZWQgYnkgYW4gaW5uZXIgZnVuY3Rpb24gaXMgY2FsbGVkCithbiA8ZW0+dXB2YWx1ZTwvZW0+LCBvciA8ZW0+ZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGU8L2VtPiwKK2luc2lkZSB0aGUgaW5uZXIgZnVuY3Rpb24uCisKKworPHA+CitOb3RpY2UgdGhhdCBlYWNoIGV4ZWN1dGlvbiBvZiBhIDxiPmxvY2FsPC9iPiBzdGF0ZW1lbnQKK2RlZmluZXMgbmV3IGxvY2FsIHZhcmlhYmxlcy4KK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworPHByZT4KKyAgICAgYSA9IHt9CisgICAgIGxvY2FsIHggPSAyMAorICAgICBmb3IgaT0xLDEwIGRvCisgICAgICAgbG9jYWwgeSA9IDAKKyAgICAgICBhW2ldID0gZnVuY3Rpb24gKCkgeT15KzE7IHJldHVybiB4K3kgZW5kCisgICAgIGVuZAorPC9wcmU+PHA+CitUaGUgbG9vcCBjcmVhdGVzIHRlbiBjbG9zdXJlcworKHRoYXQgaXMsIHRlbiBpbnN0YW5jZXMgb2YgdGhlIGFub255bW91cyBmdW5jdGlvbikuCitFYWNoIG9mIHRoZXNlIGNsb3N1cmVzIHVzZXMgYSBkaWZmZXJlbnQgPGNvZGU+eTwvY29kZT4gdmFyaWFibGUsCit3aGlsZSBhbGwgb2YgdGhlbSBzaGFyZSB0aGUgc2FtZSA8Y29kZT54PC9jb2RlPi4KKworCisKKworCis8aDE+NCAmbmRhc2g7IDxhIG5hbWU9IjQiPlRoZSBBcHBsaWNhdGlvbiBQcm9ncmFtIEludGVyZmFjZTwvYT48L2gxPgorCis8cD4KKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgQyZuYnNwO0FQSSBmb3IgTHVhLCB0aGF0IGlzLAordGhlIHNldCBvZiBDJm5ic3A7ZnVuY3Rpb25zIGF2YWlsYWJsZSB0byB0aGUgaG9zdCBwcm9ncmFtIHRvIGNvbW11bmljYXRlCit3aXRoIEx1YS4KK0FsbCBBUEkgZnVuY3Rpb25zIGFuZCByZWxhdGVkIHR5cGVzIGFuZCBjb25zdGFudHMKK2FyZSBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGUgPGEgbmFtZT0icGRmLWx1YS5oIj48Y29kZT5sdWEuaDwvY29kZT48L2E+LgorCisKKzxwPgorRXZlbiB3aGVuIHdlIHVzZSB0aGUgdGVybSAiZnVuY3Rpb24iLAorYW55IGZhY2lsaXR5IGluIHRoZSBBUEkgbWF5IGJlIHByb3ZpZGVkIGFzIGEgbWFjcm8gaW5zdGVhZC4KK0V4Y2VwdCB3aGVyZSBzdGF0ZWQgb3RoZXJ3aXNlLAorYWxsIHN1Y2ggbWFjcm9zIHVzZSBlYWNoIG9mIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UKKyhleGNlcHQgZm9yIHRoZSBmaXJzdCBhcmd1bWVudCwgd2hpY2ggaXMgYWx3YXlzIGEgTHVhIHN0YXRlKSwKK2FuZCBzbyBkbyBub3QgZ2VuZXJhdGUgYW55IGhpZGRlbiBzaWRlLWVmZmVjdHMuCisKKworPHA+CitBcyBpbiBtb3N0IEMmbmJzcDtsaWJyYXJpZXMsCit0aGUgTHVhIEFQSSBmdW5jdGlvbnMgZG8gbm90IGNoZWNrIHRoZWlyIGFyZ3VtZW50cyBmb3IgdmFsaWRpdHkgb3IgY29uc2lzdGVuY3kuCitIb3dldmVyLCB5b3UgY2FuIGNoYW5nZSB0aGlzIGJlaGF2aW9yIGJ5IGNvbXBpbGluZyBMdWEKK3dpdGggdGhlIG1hY3JvIDxhIG5hbWU9InBkZi1MVUFfVVNFX0FQSUNIRUNLIj48Y29kZT5MVUFfVVNFX0FQSUNIRUNLPC9jb2RlPjwvYT4gZGVmaW5lZC4KKworCisKKzxoMj40LjEgJm5kYXNoOyA8YSBuYW1lPSI0LjEiPlRoZSBTdGFjazwvYT48L2gyPgorCis8cD4KK0x1YSB1c2VzIGEgPGVtPnZpcnR1YWwgc3RhY2s8L2VtPiB0byBwYXNzIHZhbHVlcyB0byBhbmQgZnJvbSBDLgorRWFjaCBlbGVtZW50IGluIHRoaXMgc3RhY2sgcmVwcmVzZW50cyBhIEx1YSB2YWx1ZQorKDxiPm5pbDwvYj4sIG51bWJlciwgc3RyaW5nLCBldGMuKS4KKworCis8cD4KK1doZW5ldmVyIEx1YSBjYWxscyBDLCB0aGUgY2FsbGVkIGZ1bmN0aW9uIGdldHMgYSBuZXcgc3RhY2ssCit3aGljaCBpcyBpbmRlcGVuZGVudCBvZiBwcmV2aW91cyBzdGFja3MgYW5kIG9mIHN0YWNrcyBvZgorQyZuYnNwO2Z1bmN0aW9ucyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUuCitUaGlzIHN0YWNrIGluaXRpYWxseSBjb250YWlucyBhbnkgYXJndW1lbnRzIHRvIHRoZSBDJm5ic3A7ZnVuY3Rpb24KK2FuZCBpdCBpcyB3aGVyZSB0aGUgQyZuYnNwO2Z1bmN0aW9uIHB1c2hlcyBpdHMgcmVzdWx0cwordG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAoc2VlIDxhIGhyZWY9IiNsdWFfQ0Z1bmN0aW9uIj48Y29kZT5sdWFfQ0Z1bmN0aW9uPC9jb2RlPjwvYT4pLgorCisKKzxwPgorRm9yIGNvbnZlbmllbmNlLAorbW9zdCBxdWVyeSBvcGVyYXRpb25zIGluIHRoZSBBUEkgZG8gbm90IGZvbGxvdyBhIHN0cmljdCBzdGFjayBkaXNjaXBsaW5lLgorSW5zdGVhZCwgdGhleSBjYW4gcmVmZXIgdG8gYW55IGVsZW1lbnQgaW4gdGhlIHN0YWNrCitieSB1c2luZyBhbiA8ZW0+aW5kZXg8L2VtPjoKK0EgcG9zaXRpdmUgaW5kZXggcmVwcmVzZW50cyBhbiBhYnNvbHV0ZSBzdGFjayBwb3NpdGlvbgorKHN0YXJ0aW5nIGF0Jm5ic3A7MSk7CithIG5lZ2F0aXZlIGluZGV4IHJlcHJlc2VudHMgYW4gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorTW9yZSBzcGVjaWZpY2FsbHksIGlmIHRoZSBzdGFjayBoYXMgPGVtPm48L2VtPiBlbGVtZW50cywKK3RoZW4gaW5kZXgmbmJzcDsxIHJlcHJlc2VudHMgdGhlIGZpcnN0IGVsZW1lbnQKKyh0aGF0IGlzLCB0aGUgZWxlbWVudCB0aGF0IHdhcyBwdXNoZWQgb250byB0aGUgc3RhY2sgZmlyc3QpCithbmQKK2luZGV4Jm5ic3A7PGVtPm48L2VtPiByZXByZXNlbnRzIHRoZSBsYXN0IGVsZW1lbnQ7CitpbmRleCZuYnNwOy0xIGFsc28gcmVwcmVzZW50cyB0aGUgbGFzdCBlbGVtZW50CisodGhhdCBpcywgdGhlIGVsZW1lbnQgYXQgdGhlJm5ic3A7dG9wKQorYW5kIGluZGV4IDxlbT4tbjwvZW0+IHJlcHJlc2VudHMgdGhlIGZpcnN0IGVsZW1lbnQuCisKKworCisKKworPGgyPjQuMiAmbmRhc2g7IDxhIG5hbWU9IjQuMiI+U3RhY2sgU2l6ZTwvYT48L2gyPgorCis8cD4KK1doZW4geW91IGludGVyYWN0IHdpdGggdGhlIEx1YSBBUEksCit5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyBjb25zaXN0ZW5jeS4KK0luIHBhcnRpY3VsYXIsCis8ZW0+eW91IGFyZSByZXNwb25zaWJsZSBmb3IgY29udHJvbGxpbmcgc3RhY2sgb3ZlcmZsb3c8L2VtPi4KK1lvdSBjYW4gdXNlIHRoZSBmdW5jdGlvbiA8YSBocmVmPSIjbHVhX2NoZWNrc3RhY2siPjxjb2RlPmx1YV9jaGVja3N0YWNrPC9jb2RlPjwvYT4KK3RvIGVuc3VyZSB0aGF0IHRoZSBzdGFjayBoYXMgZXh0cmEgc2xvdHMgd2hlbiBwdXNoaW5nIG5ldyBlbGVtZW50cy4KKworCis8cD4KK1doZW5ldmVyIEx1YSBjYWxscyBDLAoraXQgZW5zdXJlcyB0aGF0IHRoZSBzdGFjayBoYXMgYXQgbGVhc3QgPGEgbmFtZT0icGRmLUxVQV9NSU5TVEFDSyI+PGNvZGU+TFVBX01JTlNUQUNLPC9jb2RlPjwvYT4gZXh0cmEgc2xvdHMuCis8Y29kZT5MVUFfTUlOU1RBQ0s8L2NvZGU+IGlzIGRlZmluZWQgYXMgMjAsCitzbyB0aGF0IHVzdWFsbHkgeW91IGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHN0YWNrIHNwYWNlCit1bmxlc3MgeW91ciBjb2RlIGhhcyBsb29wcyBwdXNoaW5nIGVsZW1lbnRzIG9udG8gdGhlIHN0YWNrLgorCisKKzxwPgorV2hlbiB5b3UgY2FsbCBhIEx1YSBmdW5jdGlvbgord2l0aG91dCBhIGZpeGVkIG51bWJlciBvZiByZXN1bHRzIChzZWUgPGEgaHJlZj0iI2x1YV9jYWxsIj48Y29kZT5sdWFfY2FsbDwvY29kZT48L2E+KSwKK0x1YSBlbnN1cmVzIHRoYXQgdGhlIHN0YWNrIGhhcyBlbm91Z2ggc2l6ZSBmb3IgYWxsIHJlc3VsdHMsCitidXQgaXQgZG9lcyBub3QgZW5zdXJlIGFueSBleHRyYSBzcGFjZS4KK1NvLCBiZWZvcmUgcHVzaGluZyBhbnl0aGluZyBpbiB0aGUgc3RhY2sgYWZ0ZXIgc3VjaCBhIGNhbGwKK3lvdSBzaG91bGQgdXNlIDxhIGhyZWY9IiNsdWFfY2hlY2tzdGFjayI+PGNvZGU+bHVhX2NoZWNrc3RhY2s8L2NvZGU+PC9hPi4KKworCisKKworCis8aDI+NC4zICZuZGFzaDsgPGEgbmFtZT0iNC4zIj5WYWxpZCBhbmQgQWNjZXB0YWJsZSBJbmRpY2VzPC9hPjwvaDI+CisKKzxwPgorQW55IGZ1bmN0aW9uIGluIHRoZSBBUEkgdGhhdCByZWNlaXZlcyBzdGFjayBpbmRpY2VzCit3b3JrcyBvbmx5IHdpdGggPGVtPnZhbGlkIGluZGljZXM8L2VtPiBvciA8ZW0+YWNjZXB0YWJsZSBpbmRpY2VzPC9lbT4uCisKKworPHA+CitBIDxlbT52YWxpZCBpbmRleDwvZW0+IGlzIGFuIGluZGV4IHRoYXQgcmVmZXJzIHRvIGEKK3JlYWwgcG9zaXRpb24gd2l0aGluIHRoZSBzdGFjaywgdGhhdCBpcywKK2l0cyBwb3NpdGlvbiBsaWVzIGJldHdlZW4mbmJzcDsxIGFuZCB0aGUgc3RhY2sgdG9wCisoPGNvZGU+MSAmbGU7IGFicyhpbmRleCkgJmxlOyB0b3A8L2NvZGU+KS4KKworVXN1YWxseSwgZnVuY3Rpb25zIHRoYXQgY2FuIG1vZGlmeSB0aGUgdmFsdWUgYXQgYW4gaW5kZXgKK3JlcXVpcmUgdmFsaWQgaW5kaWNlcy4KKworCis8cD4KK1VubGVzcyBvdGhlcndpc2Ugbm90ZWQsCithbnkgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHZhbGlkIGluZGljZXMgYWxzbyBhY2NlcHRzIDxlbT5wc2V1ZG8taW5kaWNlczwvZW0+LAord2hpY2ggcmVwcmVzZW50IHNvbWUgTHVhIHZhbHVlcyB0aGF0IGFyZSBhY2Nlc3NpYmxlIHRvIEMmbmJzcDtjb2RlCitidXQgd2hpY2ggYXJlIG5vdCBpbiB0aGUgc3RhY2suCitQc2V1ZG8taW5kaWNlcyBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5CithbmQgdGhlIHVwdmFsdWVzIG9mIGEgQyZuYnNwO2Z1bmN0aW9uIChzZWUgPGEgaHJlZj0iIzQuNCI+JnNlY3Q7NC40PC9hPikuCisKKworPHA+CitGdW5jdGlvbnMgdGhhdCBkbyBub3QgbmVlZCBhIHNwZWNpZmljIHN0YWNrIHBvc2l0aW9uLAorYnV0IG9ubHkgYSB2YWx1ZSBpbiB0aGUgc3RhY2sgKGUuZy4sIHF1ZXJ5IGZ1bmN0aW9ucyksCitjYW4gYmUgY2FsbGVkIHdpdGggYWNjZXB0YWJsZSBpbmRpY2VzLgorQW4gPGVtPmFjY2VwdGFibGUgaW5kZXg8L2VtPiBjYW4gYmUgYW55IHZhbGlkIGluZGV4LAoraW5jbHVkaW5nIHRoZSBwc2V1ZG8taW5kaWNlcywKK2J1dCBpdCBhbHNvIGNhbiBiZSBhbnkgcG9zaXRpdmUgaW5kZXggYWZ0ZXIgdGhlIHN0YWNrIHRvcAord2l0aGluIHRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBzdGFjaywKK3RoYXQgaXMsIGluZGljZXMgdXAgdG8gdGhlIHN0YWNrIHNpemUuCisoTm90ZSB0aGF0IDAgaXMgbmV2ZXIgYW4gYWNjZXB0YWJsZSBpbmRleC4pCitFeGNlcHQgd2hlbiBub3RlZCBvdGhlcndpc2UsCitmdW5jdGlvbnMgaW4gdGhlIEFQSSB3b3JrIHdpdGggYWNjZXB0YWJsZSBpbmRpY2VzLgorCisKKzxwPgorQWNjZXB0YWJsZSBpbmRpY2VzIHNlcnZlIHRvIGF2b2lkIGV4dHJhIHRlc3RzCithZ2FpbnN0IHRoZSBzdGFjayB0b3Agd2hlbiBxdWVyeWluZyB0aGUgc3RhY2suCitGb3IgaW5zdGFuY2UsIGEgQyZuYnNwO2Z1bmN0aW9uIGNhbiBxdWVyeSBpdHMgdGhpcmQgYXJndW1lbnQKK3dpdGhvdXQgdGhlIG5lZWQgdG8gZmlyc3QgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHRoaXJkIGFyZ3VtZW50LAordGhhdCBpcywgd2l0aG91dCB0aGUgbmVlZCB0byBjaGVjayB3aGV0aGVyIDMgaXMgYSB2YWxpZCBpbmRleC4KKworCis8cD4KK0ZvciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggYWNjZXB0YWJsZSBpbmRpY2VzLAorYW55IG5vbi12YWxpZCBpbmRleCBpcyB0cmVhdGVkIGFzIGlmIGl0Citjb250YWlucyBhIHZhbHVlIG9mIGEgdmlydHVhbCB0eXBlIDxhIG5hbWU9InBkZi1MVUFfVE5PTkUiPjxjb2RlPkxVQV9UTk9ORTwvY29kZT48L2E+LAord2hpY2ggYmVoYXZlcyBsaWtlIGEgbmlsIHZhbHVlLgorCisKKworCisKKzxoMj40LjQgJm5kYXNoOyA8YSBuYW1lPSI0LjQiPkMgQ2xvc3VyZXM8L2E+PC9oMj4KKworPHA+CitXaGVuIGEgQyZuYnNwO2Z1bmN0aW9uIGlzIGNyZWF0ZWQsCitpdCBpcyBwb3NzaWJsZSB0byBhc3NvY2lhdGUgc29tZSB2YWx1ZXMgd2l0aCBpdCwKK3RodXMgY3JlYXRpbmcgYSA8ZW0+QyZuYnNwO2Nsb3N1cmU8L2VtPgorKHNlZSA8YSBocmVmPSIjbHVhX3B1c2hjY2xvc3VyZSI+PGNvZGU+bHVhX3B1c2hjY2xvc3VyZTwvY29kZT48L2E+KTsKK3RoZXNlIHZhbHVlcyBhcmUgY2FsbGVkIDxlbT51cHZhbHVlczwvZW0+IGFuZCBhcmUKK2FjY2Vzc2libGUgdG8gdGhlIGZ1bmN0aW9uIHdoZW5ldmVyIGl0IGlzIGNhbGxlZC4KKworCis8cD4KK1doZW5ldmVyIGEgQyZuYnNwO2Z1bmN0aW9uIGlzIGNhbGxlZCwKK2l0cyB1cHZhbHVlcyBhcmUgbG9jYXRlZCBhdCBzcGVjaWZpYyBwc2V1ZG8taW5kaWNlcy4KK1RoZXNlIHBzZXVkby1pbmRpY2VzIGFyZSBwcm9kdWNlZCBieSB0aGUgbWFjcm8KKzxhIGhyZWY9IiNsdWFfdXB2YWx1ZWluZGV4Ij48Y29kZT5sdWFfdXB2YWx1ZWluZGV4PC9jb2RlPjwvYT4uCitUaGUgZmlyc3QgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZnVuY3Rpb24gaXMgYXQgcG9zaXRpb24KKzxjb2RlPmx1YV91cHZhbHVlaW5kZXgoMSk8L2NvZGU+LCBhbmQgc28gb24uCitBbnkgYWNjZXNzIHRvIDxjb2RlPmx1YV91cHZhbHVlaW5kZXgoPGVtPm48L2VtPik8L2NvZGU+LAord2hlcmUgPGVtPm48L2VtPiBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiB1cHZhbHVlcyBvZiB0aGUKK2N1cnJlbnQgZnVuY3Rpb24gKGJ1dCBub3QgZ3JlYXRlciB0aGFuIDI1NiksCitwcm9kdWNlcyBhbiBhY2NlcHRhYmxlIGJ1dCBpbnZhbGlkIGluZGV4LgorCisKKworCisKKzxoMj40LjUgJm5kYXNoOyA8YSBuYW1lPSI0LjUiPlJlZ2lzdHJ5PC9hPjwvaDI+CisKKzxwPgorTHVhIHByb3ZpZGVzIGEgPGVtPnJlZ2lzdHJ5PC9lbT4sCithIHByZWRlZmluZWQgdGFibGUgdGhhdCBjYW4gYmUgdXNlZCBieSBhbnkgQyZuYnNwO2NvZGUgdG8KK3N0b3JlIHdoYXRldmVyIEx1YSB2YWx1ZXMgaXQgbmVlZHMgdG8gc3RvcmUuCitUaGUgcmVnaXN0cnkgdGFibGUgaXMgYWx3YXlzIGxvY2F0ZWQgYXQgcHNldWRvLWluZGV4Cis8YSBuYW1lPSJwZGYtTFVBX1JFR0lTVFJZSU5ERVgiPjxjb2RlPkxVQV9SRUdJU1RSWUlOREVYPC9jb2RlPjwvYT4sCit3aGljaCBpcyBhIHZhbGlkIGluZGV4LgorQW55IEMmbmJzcDtsaWJyYXJ5IGNhbiBzdG9yZSBkYXRhIGludG8gdGhpcyB0YWJsZSwKK2J1dCBpdCBzaG91bGQgdGFrZSBjYXJlIHRvIGNob29zZSBrZXlzCit0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSB1c2VkCitieSBvdGhlciBsaWJyYXJpZXMsIHRvIGF2b2lkIGNvbGxpc2lvbnMuCitUeXBpY2FsbHksIHlvdSBzaG91bGQgdXNlIGFzIGtleSBhIHN0cmluZyBjb250YWluaW5nIHlvdXIgbGlicmFyeSBuYW1lLAorb3IgYSBsaWdodCB1c2VyZGF0YSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgQyZuYnNwO29iamVjdCBpbiB5b3VyIGNvZGUsCitvciBhbnkgTHVhIG9iamVjdCBjcmVhdGVkIGJ5IHlvdXIgY29kZS4KK0FzIHdpdGggZ2xvYmFsIG5hbWVzLAorc3RyaW5nIGtleXMgc3RhcnRpbmcgd2l0aCBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5Cit1cHBlcmNhc2UgbGV0dGVycyBhcmUgcmVzZXJ2ZWQgZm9yIEx1YS4KKworCis8cD4KK1RoZSBpbnRlZ2VyIGtleXMgaW4gdGhlIHJlZ2lzdHJ5IGFyZSB1c2VkIGJ5IHRoZSByZWZlcmVuY2UgbWVjaGFuaXNtLAoraW1wbGVtZW50ZWQgYnkgdGhlIGF1eGlsaWFyeSBsaWJyYXJ5LAorYW5kIGJ5IHNvbWUgcHJlZGVmaW5lZCB2YWx1ZXMuCitUaGVyZWZvcmUsIGludGVnZXIga2V5cyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzLgorCisKKzxwPgorV2hlbiB5b3UgY3JlYXRlIGEgbmV3IEx1YSBzdGF0ZSwKK2l0cyByZWdpc3RyeSBjb21lcyB3aXRoIHNvbWUgcHJlZGVmaW5lZCB2YWx1ZXMuCitUaGVzZSBwcmVkZWZpbmVkIHZhbHVlcyBhcmUgaW5kZXhlZCB3aXRoIGludGVnZXIga2V5cworZGVmaW5lZCBhcyBjb25zdGFudHMgaW4gPGNvZGU+bHVhLmg8L2NvZGU+LgorVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIGRlZmluZWQ6CisKKzx1bD4KKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX1JJRFhfTUFJTlRIUkVBRCI+PGNvZGU+TFVBX1JJRFhfTUFJTlRIUkVBRDwvY29kZT48L2E+OiA8L2I+IEF0IHRoaXMgaW5kZXggdGhlIHJlZ2lzdHJ5IGhhcwordGhlIG1haW4gdGhyZWFkIG9mIHRoZSBzdGF0ZS4KKyhUaGUgbWFpbiB0aHJlYWQgaXMgdGhlIG9uZSBjcmVhdGVkIHRvZ2V0aGVyIHdpdGggdGhlIHN0YXRlLikKKzwvbGk+CisKKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX1JJRFhfR0xPQkFMUyI+PGNvZGU+TFVBX1JJRFhfR0xPQkFMUzwvY29kZT48L2E+OiA8L2I+IEF0IHRoaXMgaW5kZXggdGhlIHJlZ2lzdHJ5IGhhcwordGhlIGdsb2JhbCBlbnZpcm9ubWVudC4KKzwvbGk+Cis8L3VsPgorCisKKworCis8aDI+NC42ICZuZGFzaDsgPGEgbmFtZT0iNC42Ij5FcnJvciBIYW5kbGluZyBpbiBDPC9hPjwvaDI+CisKKzxwPgorSW50ZXJuYWxseSwgTHVhIHVzZXMgdGhlIEMgPGNvZGU+bG9uZ2ptcDwvY29kZT4gZmFjaWxpdHkgdG8gaGFuZGxlIGVycm9ycy4KKyhZb3UgY2FuIGFsc28gY2hvb3NlIHRvIHVzZSBleGNlcHRpb25zIGlmIHlvdSBjb21waWxlIEx1YSBhcyBDKys7CitzZWFyY2ggZm9yIDxjb2RlPkxVQUlfVEhST1c8L2NvZGU+IGluIHRoZSBzb3VyY2UgY29kZS4pCitXaGVuIEx1YSBmYWNlcyBhbnkgZXJyb3IKKyhzdWNoIGFzIGEgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IsIHR5cGUgZXJyb3JzLCBzeW50YXggZXJyb3JzLAorYW5kIHJ1bnRpbWUgZXJyb3JzKQoraXQgPGVtPnJhaXNlczwvZW0+IGFuIGVycm9yOwordGhhdCBpcywgaXQgZG9lcyBhIGxvbmcganVtcC4KK0EgPGVtPnByb3RlY3RlZCBlbnZpcm9ubWVudDwvZW0+IHVzZXMgPGNvZGU+c2V0am1wPC9jb2RlPgordG8gc2V0IGEgcmVjb3ZlcnkgcG9pbnQ7CithbnkgZXJyb3IganVtcHMgdG8gdGhlIG1vc3QgcmVjZW50IGFjdGl2ZSByZWNvdmVyeSBwb2ludC4KKworCis8cD4KK0lmIGFuIGVycm9yIGhhcHBlbnMgb3V0c2lkZSBhbnkgcHJvdGVjdGVkIGVudmlyb25tZW50LAorTHVhIGNhbGxzIGEgPGVtPnBhbmljIGZ1bmN0aW9uPC9lbT4gKHNlZSA8YSBocmVmPSIjbHVhX2F0cGFuaWMiPjxjb2RlPmx1YV9hdHBhbmljPC9jb2RlPjwvYT4pCithbmQgdGhlbiBjYWxscyA8Y29kZT5hYm9ydDwvY29kZT4sCit0aHVzIGV4aXRpbmcgdGhlIGhvc3QgYXBwbGljYXRpb24uCitZb3VyIHBhbmljIGZ1bmN0aW9uIGNhbiBhdm9pZCB0aGlzIGV4aXQgYnkKK25ldmVyIHJldHVybmluZworKGUuZy4sIGRvaW5nIGEgbG9uZyBqdW1wIHRvIHlvdXIgb3duIHJlY292ZXJ5IHBvaW50IG91dHNpZGUgTHVhKS4KKworCis8cD4KK1RoZSBwYW5pYyBmdW5jdGlvbiBydW5zIGFzIGlmIGl0IHdlcmUgYSBtZXNzYWdlIGhhbmRsZXIgKHNlZSA8YSBocmVmPSIjMi4zIj4mc2VjdDsyLjM8L2E+KTsKK2luIHBhcnRpY3VsYXIsIHRoZSBlcnJvciBtZXNzYWdlIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorSG93ZXZlciwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlcyBhYm91dCBzdGFjayBzcGFjZS4KK1RvIHB1c2ggYW55dGhpbmcgb24gdGhlIHN0YWNrLAordGhlIHBhbmljIGZ1bmN0aW9uIHNob3VsZCBmaXJzdCBjaGVjayB0aGUgYXZhaWxhYmxlIHNwYWNlIChzZWUgPGEgaHJlZj0iIzQuMiI+JnNlY3Q7NC4yPC9hPikuCisKKworPHA+CitNb3N0IGZ1bmN0aW9ucyBpbiB0aGUgQVBJIGNhbiB0aHJvdyBhbiBlcnJvciwKK2ZvciBpbnN0YW5jZSBkdWUgdG8gYSBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KK1RoZSBkb2N1bWVudGF0aW9uIGZvciBlYWNoIGZ1bmN0aW9uIGluZGljYXRlcyB3aGV0aGVyCitpdCBjYW4gdGhyb3cgZXJyb3JzLgorCisKKzxwPgorSW5zaWRlIGEgQyZuYnNwO2Z1bmN0aW9uIHlvdSBjYW4gdGhyb3cgYW4gZXJyb3IgYnkgY2FsbGluZyA8YSBocmVmPSIjbHVhX2Vycm9yIj48Y29kZT5sdWFfZXJyb3I8L2NvZGU+PC9hPi4KKworCisKKworCis8aDI+NC43ICZuZGFzaDsgPGEgbmFtZT0iNC43Ij5IYW5kbGluZyBZaWVsZHMgaW4gQzwvYT48L2gyPgorCis8cD4KK0ludGVybmFsbHksIEx1YSB1c2VzIHRoZSBDIDxjb2RlPmxvbmdqbXA8L2NvZGU+IGZhY2lsaXR5IHRvIHlpZWxkIGEgY29yb3V0aW5lLgorVGhlcmVmb3JlLCBpZiBhIGZ1bmN0aW9uIDxjb2RlPmZvbzwvY29kZT4gY2FsbHMgYW4gQVBJIGZ1bmN0aW9uCithbmQgdGhpcyBBUEkgZnVuY3Rpb24geWllbGRzCisoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSBjYWxsaW5nIGFub3RoZXIgZnVuY3Rpb24gdGhhdCB5aWVsZHMpLAorTHVhIGNhbm5vdCByZXR1cm4gdG8gPGNvZGU+Zm9vPC9jb2RlPiBhbnkgbW9yZSwKK2JlY2F1c2UgdGhlIDxjb2RlPmxvbmdqbXA8L2NvZGU+IHJlbW92ZXMgaXRzIGZyYW1lIGZyb20gdGhlIEMgc3RhY2suCisKKworPHA+CitUbyBhdm9pZCB0aGlzIGtpbmQgb2YgcHJvYmxlbSwKK0x1YSByYWlzZXMgYW4gZXJyb3Igd2hlbmV2ZXIgaXQgdHJpZXMgdG8geWllbGQgYWNyb3NzIGFuIEFQSSBjYWxsLAorZXhjZXB0IGZvciB0aHJlZSBmdW5jdGlvbnM6Cis8YSBocmVmPSIjbHVhX3lpZWxkayI+PGNvZGU+bHVhX3lpZWxkazwvY29kZT48L2E+LCA8YSBocmVmPSIjbHVhX2NhbGxrIj48Y29kZT5sdWFfY2FsbGs8L2NvZGU+PC9hPiwgYW5kIDxhIGhyZWY9IiNsdWFfcGNhbGxrIj48Y29kZT5sdWFfcGNhbGxrPC9jb2RlPjwvYT4uCitBbGwgdGhvc2UgZnVuY3Rpb25zIHJlY2VpdmUgYSA8ZW0+Y29udGludWF0aW9uIGZ1bmN0aW9uPC9lbT4KKyhhcyBhIHBhcmFtZXRlciBjYWxsZWQgPGNvZGU+azwvY29kZT4pIHRvIGNvbnRpbnVlIGV4ZWN1dGlvbiBhZnRlciBhIHlpZWxkLgorCisKKzxwPgorV2UgbmVlZCB0byBzZXQgc29tZSB0ZXJtaW5vbG9neSB0byBleHBsYWluIGNvbnRpbnVhdGlvbnMuCitXZSBoYXZlIGEgQyBmdW5jdGlvbiBjYWxsZWQgZnJvbSBMdWEgd2hpY2ggd2Ugd2lsbCBjYWxsCit0aGUgPGVtPm9yaWdpbmFsIGZ1bmN0aW9uPC9lbT4uCitUaGlzIG9yaWdpbmFsIGZ1bmN0aW9uIHRoZW4gY2FsbHMgb25lIG9mIHRob3NlIHRocmVlIGZ1bmN0aW9ucyBpbiB0aGUgQyBBUEksCit3aGljaCB3ZSB3aWxsIGNhbGwgdGhlIDxlbT5jYWxsZWUgZnVuY3Rpb248L2VtPiwKK3RoYXQgdGhlbiB5aWVsZHMgdGhlIGN1cnJlbnQgdGhyZWFkLgorKFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBjYWxsZWUgZnVuY3Rpb24gaXMgPGEgaHJlZj0iI2x1YV95aWVsZGsiPjxjb2RlPmx1YV95aWVsZGs8L2NvZGU+PC9hPiwKK29yIHdoZW4gdGhlIGNhbGxlZSBmdW5jdGlvbiBpcyBlaXRoZXIgPGEgaHJlZj0iI2x1YV9jYWxsayI+PGNvZGU+bHVhX2NhbGxrPC9jb2RlPjwvYT4gb3IgPGEgaHJlZj0iI2x1YV9wY2FsbGsiPjxjb2RlPmx1YV9wY2FsbGs8L2NvZGU+PC9hPgorYW5kIHRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlbSB5aWVsZHMuKQorCisKKzxwPgorU3VwcG9zZSB0aGUgcnVubmluZyB0aHJlYWQgeWllbGRzIHdoaWxlIGV4ZWN1dGluZyB0aGUgY2FsbGVlIGZ1bmN0aW9uLgorQWZ0ZXIgdGhlIHRocmVhZCByZXN1bWVzLAoraXQgZXZlbnR1YWxseSB3aWxsIGZpbmlzaCBydW5uaW5nIHRoZSBjYWxsZWUgZnVuY3Rpb24uCitIb3dldmVyLAordGhlIGNhbGxlZSBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIHRvIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiwKK2JlY2F1c2UgaXRzIGZyYW1lIGluIHRoZSBDIHN0YWNrIHdhcyBkZXN0cm95ZWQgYnkgdGhlIHlpZWxkLgorSW5zdGVhZCwgTHVhIGNhbGxzIGEgPGVtPmNvbnRpbnVhdGlvbiBmdW5jdGlvbjwvZW0+LAord2hpY2ggd2FzIGdpdmVuIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBjYWxsZWUgZnVuY3Rpb24uCitBcyB0aGUgbmFtZSBpbXBsaWVzLAordGhlIGNvbnRpbnVhdGlvbiBmdW5jdGlvbiBzaG91bGQgY29udGludWUgdGhlIHRhc2sKK29mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4KKworCis8cD4KK0x1YSB0cmVhdHMgdGhlIGNvbnRpbnVhdGlvbiBmdW5jdGlvbiBhcyBpZiBpdCB3ZXJlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4KK1RoZSBjb250aW51YXRpb24gZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIHNhbWUgTHVhIHN0YWNrCitmcm9tIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiwKK2luIHRoZSBzYW1lIHN0YXRlIGl0IHdvdWxkIGJlIGlmIHRoZSBjYWxsZWUgZnVuY3Rpb24gaGFkIHJldHVybmVkLgorKEZvciBpbnN0YW5jZSwKK2FmdGVyIGEgPGEgaHJlZj0iI2x1YV9jYWxsayI+PGNvZGU+bHVhX2NhbGxrPC9jb2RlPjwvYT4gdGhlIGZ1bmN0aW9uIGFuZCBpdHMgYXJndW1lbnRzIGFyZQorcmVtb3ZlZCBmcm9tIHRoZSBzdGFjayBhbmQgcmVwbGFjZWQgYnkgdGhlIHJlc3VsdHMgZnJvbSB0aGUgY2FsbC4pCitJdCBhbHNvIGhhcyB0aGUgc2FtZSB1cHZhbHVlcy4KK1doYXRldmVyIGl0IHJldHVybnMgaXMgaGFuZGxlZCBieSBMdWEgYXMgaWYgaXQgd2VyZSB0aGUgcmV0dXJuCitvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uCisKKworPHA+CitUaGUgb25seSBkaWZmZXJlbmNlIGluIHRoZSBMdWEgc3RhdGUgYmV0d2VlbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24KK2FuZCBpdHMgY29udGludWF0aW9uIGlzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvIDxhIGhyZWY9IiNsdWFfZ2V0Y3R4Ij48Y29kZT5sdWFfZ2V0Y3R4PC9jb2RlPjwvYT4uCisKKworCisKKworPGgyPjQuOCAmbmRhc2g7IDxhIG5hbWU9IjQuOCI+RnVuY3Rpb25zIGFuZCBUeXBlczwvYT48L2gyPgorCis8cD4KK0hlcmUgd2UgbGlzdCBhbGwgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBDJm5ic3A7QVBJIGluCithbHBoYWJldGljYWwgb3JkZXIuCitFYWNoIGZ1bmN0aW9uIGhhcyBhbiBpbmRpY2F0b3IgbGlrZSB0aGlzOgorPHNwYW4gY2xhc3M9ImFwaWkiPlstbywgK3AsIDxlbT54PC9lbT5dPC9zcGFuPgorCisKKzxwPgorVGhlIGZpcnN0IGZpZWxkLCA8Y29kZT5vPC9jb2RlPiwKK2lzIGhvdyBtYW55IGVsZW1lbnRzIHRoZSBmdW5jdGlvbiBwb3BzIGZyb20gdGhlIHN0YWNrLgorVGhlIHNlY29uZCBmaWVsZCwgPGNvZGU+cDwvY29kZT4sCitpcyBob3cgbWFueSBlbGVtZW50cyB0aGUgZnVuY3Rpb24gcHVzaGVzIG9udG8gdGhlIHN0YWNrLgorKEFueSBmdW5jdGlvbiBhbHdheXMgcHVzaGVzIGl0cyByZXN1bHRzIGFmdGVyIHBvcHBpbmcgaXRzIGFyZ3VtZW50cy4pCitBIGZpZWxkIGluIHRoZSBmb3JtIDxjb2RlPnh8eTwvY29kZT4gbWVhbnMgdGhlIGZ1bmN0aW9uIGNhbiBwdXNoIChvciBwb3ApCis8Y29kZT54PC9jb2RlPiBvciA8Y29kZT55PC9jb2RlPiBlbGVtZW50cywKK2RlcGVuZGluZyBvbiB0aGUgc2l0dWF0aW9uOworYW4gaW50ZXJyb2dhdGlvbiBtYXJrICc8Y29kZT4/PC9jb2RlPicgbWVhbnMgdGhhdAord2UgY2Fubm90IGtub3cgaG93IG1hbnkgZWxlbWVudHMgdGhlIGZ1bmN0aW9uIHBvcHMvcHVzaGVzCitieSBsb29raW5nIG9ubHkgYXQgaXRzIGFyZ3VtZW50cworKGUuZy4sIHRoZXkgbWF5IGRlcGVuZCBvbiB3aGF0IGlzIG9uIHRoZSBzdGFjaykuCitUaGUgdGhpcmQgZmllbGQsIDxjb2RlPng8L2NvZGU+LAordGVsbHMgd2hldGhlciB0aGUgZnVuY3Rpb24gbWF5IHRocm93IGVycm9yczoKKyc8Y29kZT4tPC9jb2RlPicgbWVhbnMgdGhlIGZ1bmN0aW9uIG5ldmVyIHRocm93cyBhbnkgZXJyb3I7CisnPGNvZGU+ZTwvY29kZT4nIG1lYW5zIHRoZSBmdW5jdGlvbiBtYXkgdGhyb3cgZXJyb3JzOworJzxjb2RlPnY8L2NvZGU+JyBtZWFucyB0aGUgZnVuY3Rpb24gbWF5IHRocm93IGFuIGVycm9yIG9uIHB1cnBvc2UuCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9hYnNpbmRleCI+PGNvZGU+bHVhX2Fic2luZGV4PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX2Fic2luZGV4IChsdWFfU3RhdGUgKkwsIGludCBpZHgpOzwvcHJlPgorCis8cD4KK0NvbnZlcnRzIHRoZSBhY2NlcHRhYmxlIGluZGV4IDxjb2RlPmlkeDwvY29kZT4gaW50byBhbiBhYnNvbHV0ZSBpbmRleAorKHRoYXQgaXMsIG9uZSB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgc3RhY2sgdG9wKS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9BbGxvYyI+PGNvZGU+bHVhX0FsbG9jPC9jb2RlPjwvYT48L2gzPgorPHByZT50eXBlZGVmIHZvaWQgKiAoKmx1YV9BbGxvYykgKHZvaWQgKnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5zaXplKTs8L3ByZT4KKworPHA+CitUaGUgdHlwZSBvZiB0aGUgbWVtb3J5LWFsbG9jYXRpb24gZnVuY3Rpb24gdXNlZCBieSBMdWEgc3RhdGVzLgorVGhlIGFsbG9jYXRvciBmdW5jdGlvbiBtdXN0IHByb3ZpZGUgYQorZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIDxjb2RlPnJlYWxsb2M8L2NvZGU+LAorYnV0IG5vdCBleGFjdGx5IHRoZSBzYW1lLgorSXRzIGFyZ3VtZW50cyBhcmUKKzxjb2RlPnVkPC9jb2RlPiwgYW4gb3BhcXVlIHBvaW50ZXIgcGFzc2VkIHRvIDxhIGhyZWY9IiNsdWFfbmV3c3RhdGUiPjxjb2RlPmx1YV9uZXdzdGF0ZTwvY29kZT48L2E+OworPGNvZGU+cHRyPC9jb2RlPiwgYSBwb2ludGVyIHRvIHRoZSBibG9jayBiZWluZyBhbGxvY2F0ZWQvcmVhbGxvY2F0ZWQvZnJlZWQ7Cis8Y29kZT5vc2l6ZTwvY29kZT4sIHRoZSBvcmlnaW5hbCBzaXplIG9mIHRoZSBibG9jayBvciBzb21lIGNvZGUgYWJvdXQgd2hhdAoraXMgYmVpbmcgYWxsb2NhdGVkOworPGNvZGU+bnNpemU8L2NvZGU+LCB0aGUgbmV3IHNpemUgb2YgdGhlIGJsb2NrLgorCisKKzxwPgorV2hlbiA8Y29kZT5wdHI8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwKKzxjb2RlPm9zaXplPC9jb2RlPiBpcyB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgcG9pbnRlZCBieSA8Y29kZT5wdHI8L2NvZGU+LAordGhhdCBpcywgdGhlIHNpemUgZ2l2ZW4gd2hlbiBpdCB3YXMgYWxsb2NhdGVkIG9yIHJlYWxsb2NhdGVkLgorCisKKzxwPgorV2hlbiA8Y29kZT5wdHI8L2NvZGU+IGlzIDxjb2RlPk5VTEw8L2NvZGU+LAorPGNvZGU+b3NpemU8L2NvZGU+IGVuY29kZXMgdGhlIGtpbmQgb2Ygb2JqZWN0IHRoYXQgTHVhIGlzIGFsbG9jYXRpbmcuCis8Y29kZT5vc2l6ZTwvY29kZT4gaXMgYW55IG9mCis8YSBocmVmPSIjcGRmLUxVQV9UU1RSSU5HIj48Y29kZT5MVUFfVFNUUklORzwvY29kZT48L2E+LCA8YSBocmVmPSIjcGRmLUxVQV9UVEFCTEUiPjxjb2RlPkxVQV9UVEFCTEU8L2NvZGU+PC9hPiwgPGEgaHJlZj0iI3BkZi1MVUFfVEZVTkNUSU9OIj48Y29kZT5MVUFfVEZVTkNUSU9OPC9jb2RlPjwvYT4sCis8YSBocmVmPSIjcGRmLUxVQV9UVVNFUkRBVEEiPjxjb2RlPkxVQV9UVVNFUkRBVEE8L2NvZGU+PC9hPiwgb3IgPGEgaHJlZj0iI3BkZi1MVUFfVFRIUkVBRCI+PGNvZGU+TFVBX1RUSFJFQUQ8L2NvZGU+PC9hPiB3aGVuIChhbmQgb25seSB3aGVuKQorTHVhIGlzIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBvZiB0aGF0IHR5cGUuCitXaGVuIDxjb2RlPm9zaXplPC9jb2RlPiBpcyBzb21lIG90aGVyIHZhbHVlLAorTHVhIGlzIGFsbG9jYXRpbmcgbWVtb3J5IGZvciBzb21ldGhpbmcgZWxzZS4KKworCis8cD4KK0x1YSBhc3N1bWVzIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3IgZnJvbSB0aGUgYWxsb2NhdG9yIGZ1bmN0aW9uOgorCisKKzxwPgorV2hlbiA8Y29kZT5uc2l6ZTwvY29kZT4gaXMgemVybywKK3RoZSBhbGxvY2F0b3Igc2hvdWxkIGJlaGF2ZSBsaWtlIDxjb2RlPmZyZWU8L2NvZGU+CithbmQgcmV0dXJuIDxjb2RlPk5VTEw8L2NvZGU+LgorCisKKzxwPgorV2hlbiA8Y29kZT5uc2l6ZTwvY29kZT4gaXMgbm90IHplcm8sCit0aGUgYWxsb2NhdG9yIHNob3VsZCBiZWhhdmUgbGlrZSA8Y29kZT5yZWFsbG9jPC9jb2RlPi4KK1RoZSBhbGxvY2F0b3IgcmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPgoraWYgYW5kIG9ubHkgaWYgaXQgY2Fubm90IGZ1bGZpbGwgdGhlIHJlcXVlc3QuCitMdWEgYXNzdW1lcyB0aGF0IHRoZSBhbGxvY2F0b3IgbmV2ZXIgZmFpbHMgd2hlbgorPGNvZGU+b3NpemUgJmd0Oz0gbnNpemU8L2NvZGU+LgorCisKKzxwPgorSGVyZSBpcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGFsbG9jYXRvciBmdW5jdGlvbi4KK0l0IGlzIHVzZWQgaW4gdGhlIGF1eGlsaWFyeSBsaWJyYXJ5IGJ5IDxhIGhyZWY9IiNsdWFMX25ld3N0YXRlIj48Y29kZT5sdWFMX25ld3N0YXRlPC9jb2RlPjwvYT4uCisKKzxwcmU+CisgICAgIHN0YXRpYyB2b2lkICpsX2FsbG9jICh2b2lkICp1ZCwgdm9pZCAqcHRyLCBzaXplX3Qgb3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnNpemUpIHsKKyAgICAgICAodm9pZCl1ZDsgICh2b2lkKW9zaXplOyAgLyogbm90IHVzZWQgKi8KKyAgICAgICBpZiAobnNpemUgPT0gMCkgeworICAgICAgICAgZnJlZShwdHIpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiByZWFsbG9jKHB0ciwgbnNpemUpOworICAgICB9Cis8L3ByZT48cD4KK05vdGUgdGhhdCBTdGFuZGFyZCZuYnNwO0MgZW5zdXJlcwordGhhdCA8Y29kZT5mcmVlKE5VTEwpPC9jb2RlPiBoYXMgbm8gZWZmZWN0IGFuZCB0aGF0Cis8Y29kZT5yZWFsbG9jKE5VTEwsIHNpemUpPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPm1hbGxvYyhzaXplKTwvY29kZT4uCitUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IDxjb2RlPnJlYWxsb2M8L2NvZGU+IGRvZXMgbm90IGZhaWwgd2hlbiBzaHJpbmtpbmcgYSBibG9jay4KKyhBbHRob3VnaCBTdGFuZGFyZCZuYnNwO0MgZG9lcyBub3QgZW5zdXJlIHRoaXMgYmVoYXZpb3IsCitpdCBzZWVtcyB0byBiZSBhIHNhZmUgYXNzdW1wdGlvbi4pCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfYXJpdGgiPjxjb2RlPmx1YV9hcml0aDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLSgyfDEpLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX2FyaXRoIChsdWFfU3RhdGUgKkwsIGludCBvcCk7PC9wcmU+CisKKzxwPgorUGVyZm9ybXMgYW4gYXJpdGhtZXRpYyBvcGVyYXRpb24gb3ZlciB0aGUgdHdvIHZhbHVlcworKG9yIG9uZSwgaW4gdGhlIGNhc2Ugb2YgbmVnYXRpb24pCithdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywKK3dpdGggdGhlIHZhbHVlIGF0IHRoZSB0b3AgYmVpbmcgdGhlIHNlY29uZCBvcGVyYW5kLAorcG9wcyB0aGVzZSB2YWx1ZXMsIGFuZCBwdXNoZXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorVGhlIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNlbWFudGljcyBvZiB0aGUgY29ycmVzcG9uZGluZyBMdWEgb3BlcmF0b3IKKyh0aGF0IGlzLCBpdCBtYXkgY2FsbCBtZXRhbWV0aG9kcykuCisKKworPHA+CitUaGUgdmFsdWUgb2YgPGNvZGU+b3A8L2NvZGU+IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorCis8dWw+CisKKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX09QQUREIj48Y29kZT5MVUFfT1BBREQ8L2NvZGU+PC9hPjogPC9iPiBwZXJmb3JtcyBhZGRpdGlvbiAoPGNvZGU+KzwvY29kZT4pPC9saT4KKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX09QU1VCIj48Y29kZT5MVUFfT1BTVUI8L2NvZGU+PC9hPjogPC9iPiBwZXJmb3JtcyBzdWJ0cmFjdGlvbiAoPGNvZGU+LTwvY29kZT4pPC9saT4KKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX09QTVVMIj48Y29kZT5MVUFfT1BNVUw8L2NvZGU+PC9hPjogPC9iPiBwZXJmb3JtcyBtdWx0aXBsaWNhdGlvbiAoPGNvZGU+KjwvY29kZT4pPC9saT4KKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX09QRElWIj48Y29kZT5MVUFfT1BESVY8L2NvZGU+PC9hPjogPC9iPiBwZXJmb3JtcyBkaXZpc2lvbiAoPGNvZGU+LzwvY29kZT4pPC9saT4KKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX09QTU9EIj48Y29kZT5MVUFfT1BNT0Q8L2NvZGU+PC9hPjogPC9iPiBwZXJmb3JtcyBtb2R1bG8gKDxjb2RlPiU8L2NvZGU+KTwvbGk+Cis8bGk+PGI+PGEgbmFtZT0icGRmLUxVQV9PUFBPVyI+PGNvZGU+TFVBX09QUE9XPC9jb2RlPjwvYT46IDwvYj4gcGVyZm9ybXMgZXhwb25lbnRpYXRpb24gKDxjb2RlPl48L2NvZGU+KTwvbGk+Cis8bGk+PGI+PGEgbmFtZT0icGRmLUxVQV9PUFVOTSI+PGNvZGU+TFVBX09QVU5NPC9jb2RlPjwvYT46IDwvYj4gcGVyZm9ybXMgbWF0aGVtYXRpY2FsIG5lZ2F0aW9uICh1bmFyeSA8Y29kZT4tPC9jb2RlPik8L2xpPgorCis8L3VsPgorCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9hdHBhbmljIj48Y29kZT5sdWFfYXRwYW5pYzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+bHVhX0NGdW5jdGlvbiBsdWFfYXRwYW5pYyAobHVhX1N0YXRlICpMLCBsdWFfQ0Z1bmN0aW9uIHBhbmljZik7PC9wcmU+CisKKzxwPgorU2V0cyBhIG5ldyBwYW5pYyBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgb2xkIG9uZSAoc2VlIDxhIGhyZWY9IiM0LjYiPiZzZWN0OzQuNjwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2NhbGwiPjxjb2RlPmx1YV9jYWxsPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstKG5hcmdzKzEpLCArbnJlc3VsdHMsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9jYWxsIChsdWFfU3RhdGUgKkwsIGludCBuYXJncywgaW50IG5yZXN1bHRzKTs8L3ByZT4KKworPHA+CitDYWxscyBhIGZ1bmN0aW9uLgorCisKKzxwPgorVG8gY2FsbCBhIGZ1bmN0aW9uIHlvdSBtdXN0IHVzZSB0aGUgZm9sbG93aW5nIHByb3RvY29sOgorZmlyc3QsIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgaXMgcHVzaGVkIG9udG8gdGhlIHN0YWNrOwordGhlbiwgdGhlIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24gYXJlIHB1c2hlZAoraW4gZGlyZWN0IG9yZGVyOwordGhhdCBpcywgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHB1c2hlZCBmaXJzdC4KK0ZpbmFsbHkgeW91IGNhbGwgPGEgaHJlZj0iI2x1YV9jYWxsIj48Y29kZT5sdWFfY2FsbDwvY29kZT48L2E+OworPGNvZGU+bmFyZ3M8L2NvZGU+IGlzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoYXQgeW91IHB1c2hlZCBvbnRvIHRoZSBzdGFjay4KK0FsbCBhcmd1bWVudHMgYW5kIHRoZSBmdW5jdGlvbiB2YWx1ZSBhcmUgcG9wcGVkIGZyb20gdGhlIHN0YWNrCit3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCitUaGUgZnVuY3Rpb24gcmVzdWx0cyBhcmUgcHVzaGVkIG9udG8gdGhlIHN0YWNrIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMuCitUaGUgbnVtYmVyIG9mIHJlc3VsdHMgaXMgYWRqdXN0ZWQgdG8gPGNvZGU+bnJlc3VsdHM8L2NvZGU+LAordW5sZXNzIDxjb2RlPm5yZXN1bHRzPC9jb2RlPiBpcyA8YSBuYW1lPSJwZGYtTFVBX01VTFRSRVQiPjxjb2RlPkxVQV9NVUxUUkVUPC9jb2RlPjwvYT4uCitJbiB0aGlzIGNhc2UsIGFsbCByZXN1bHRzIGZyb20gdGhlIGZ1bmN0aW9uIGFyZSBwdXNoZWQuCitMdWEgdGFrZXMgY2FyZSB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZXMgZml0IGludG8gdGhlIHN0YWNrIHNwYWNlLgorVGhlIGZ1bmN0aW9uIHJlc3VsdHMgYXJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjayBpbiBkaXJlY3Qgb3JkZXIKKyh0aGUgZmlyc3QgcmVzdWx0IGlzIHB1c2hlZCBmaXJzdCksCitzbyB0aGF0IGFmdGVyIHRoZSBjYWxsIHRoZSBsYXN0IHJlc3VsdCBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworCis8cD4KK0FueSBlcnJvciBpbnNpZGUgdGhlIGNhbGxlZCBmdW5jdGlvbiBpcyBwcm9wYWdhdGVkIHVwd2FyZHMKKyh3aXRoIGEgPGNvZGU+bG9uZ2ptcDwvY29kZT4pLgorCisKKzxwPgorVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0aGUgaG9zdCBwcm9ncmFtIGNhbiBkbyB0aGUKK2VxdWl2YWxlbnQgdG8gdGhpcyBMdWEgY29kZToKKworPHByZT4KKyAgICAgYSA9IGYoImhvdyIsIHQueCwgMTQpCis8L3ByZT48cD4KK0hlcmUgaXQgaXMgaW4mbmJzcDtDOgorCis8cHJlPgorICAgICBsdWFfZ2V0Z2xvYmFsKEwsICJmIik7ICAgICAgICAgICAgICAgICAgLyogZnVuY3Rpb24gdG8gYmUgY2FsbGVkICovCisgICAgIGx1YV9wdXNoc3RyaW5nKEwsICJob3ciKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiAxc3QgYXJndW1lbnQgKi8KKyAgICAgbHVhX2dldGdsb2JhbChMLCAidCIpOyAgICAgICAgICAgICAgICAgICAgLyogdGFibGUgdG8gYmUgaW5kZXhlZCAqLworICAgICBsdWFfZ2V0ZmllbGQoTCwgLTEsICJ4Iik7ICAgICAgICAvKiBwdXNoIHJlc3VsdCBvZiB0LnggKDJuZCBhcmcpICovCisgICAgIGx1YV9yZW1vdmUoTCwgLTIpOyAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSAndCcgZnJvbSB0aGUgc3RhY2sgKi8KKyAgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIDE0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDNyZCBhcmd1bWVudCAqLworICAgICBsdWFfY2FsbChMLCAzLCAxKTsgICAgIC8qIGNhbGwgJ2YnIHdpdGggMyBhcmd1bWVudHMgYW5kIDEgcmVzdWx0ICovCisgICAgIGx1YV9zZXRnbG9iYWwoTCwgImEiKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGdsb2JhbCAnYScgKi8KKzwvcHJlPjxwPgorTm90ZSB0aGF0IHRoZSBjb2RlIGFib3ZlIGlzICJiYWxhbmNlZCI6CithdCBpdHMgZW5kLCB0aGUgc3RhY2sgaXMgYmFjayB0byBpdHMgb3JpZ2luYWwgY29uZmlndXJhdGlvbi4KK1RoaXMgaXMgY29uc2lkZXJlZCBnb29kIHByb2dyYW1taW5nIHByYWN0aWNlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2NhbGxrIj48Y29kZT5sdWFfY2FsbGs8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0obmFyZ3MgKyAxKSwgK25yZXN1bHRzLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfY2FsbGsgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmdzLCBpbnQgbnJlc3VsdHMsIGludCBjdHgsCisgICAgICAgICAgICAgICAgbHVhX0NGdW5jdGlvbiBrKTs8L3ByZT4KKworPHA+CitUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgZXhhY3RseSBsaWtlIDxhIGhyZWY9IiNsdWFfY2FsbCI+PGNvZGU+bHVhX2NhbGw8L2NvZGU+PC9hPiwKK2J1dCBhbGxvd3MgdGhlIGNhbGxlZCBmdW5jdGlvbiB0byB5aWVsZCAoc2VlIDxhIGhyZWY9IiM0LjciPiZzZWN0OzQuNzwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX0NGdW5jdGlvbiI+PGNvZGU+bHVhX0NGdW5jdGlvbjwvY29kZT48L2E+PC9oMz4KKzxwcmU+dHlwZWRlZiBpbnQgKCpsdWFfQ0Z1bmN0aW9uKSAobHVhX1N0YXRlICpMKTs8L3ByZT4KKworPHA+CitUeXBlIGZvciBDJm5ic3A7ZnVuY3Rpb25zLgorCisKKzxwPgorSW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgcHJvcGVybHkgd2l0aCBMdWEsCithIEMmbmJzcDtmdW5jdGlvbiBtdXN0IHVzZSB0aGUgZm9sbG93aW5nIHByb3RvY29sLAord2hpY2ggZGVmaW5lcyB0aGUgd2F5IHBhcmFtZXRlcnMgYW5kIHJlc3VsdHMgYXJlIHBhc3NlZDoKK2EgQyZuYnNwO2Z1bmN0aW9uIHJlY2VpdmVzIGl0cyBhcmd1bWVudHMgZnJvbSBMdWEgaW4gaXRzIHN0YWNrCitpbiBkaXJlY3Qgb3JkZXIgKHRoZSBmaXJzdCBhcmd1bWVudCBpcyBwdXNoZWQgZmlyc3QpLgorU28sIHdoZW4gdGhlIGZ1bmN0aW9uIHN0YXJ0cywKKzxjb2RlPmx1YV9nZXR0b3AoTCk8L2NvZGU+IHJldHVybnMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcmVjZWl2ZWQgYnkgdGhlIGZ1bmN0aW9uLgorVGhlIGZpcnN0IGFyZ3VtZW50IChpZiBhbnkpIGlzIGF0IGluZGV4IDEKK2FuZCBpdHMgbGFzdCBhcmd1bWVudCBpcyBhdCBpbmRleCA8Y29kZT5sdWFfZ2V0dG9wKEwpPC9jb2RlPi4KK1RvIHJldHVybiB2YWx1ZXMgdG8gTHVhLCBhIEMmbmJzcDtmdW5jdGlvbiBqdXN0IHB1c2hlcyB0aGVtIG9udG8gdGhlIHN0YWNrLAoraW4gZGlyZWN0IG9yZGVyICh0aGUgZmlyc3QgcmVzdWx0IGlzIHB1c2hlZCBmaXJzdCksCithbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlc3VsdHMuCitBbnkgb3RoZXIgdmFsdWUgaW4gdGhlIHN0YWNrIGJlbG93IHRoZSByZXN1bHRzIHdpbGwgYmUgcHJvcGVybHkKK2Rpc2NhcmRlZCBieSBMdWEuCitMaWtlIGEgTHVhIGZ1bmN0aW9uLCBhIEMmbmJzcDtmdW5jdGlvbiBjYWxsZWQgYnkgTHVhIGNhbiBhbHNvIHJldHVybgorbWFueSByZXN1bHRzLgorCisKKzxwPgorQXMgYW4gZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZWNlaXZlcyBhIHZhcmlhYmxlIG51bWJlcgorb2YgbnVtZXJpY2FsIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGVpciBhdmVyYWdlIGFuZCBzdW06CisKKzxwcmU+CisgICAgIHN0YXRpYyBpbnQgZm9vIChsdWFfU3RhdGUgKkwpIHsKKyAgICAgICBpbnQgbiA9IGx1YV9nZXR0b3AoTCk7ICAgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgICAgICBsdWFfTnVtYmVyIHN1bSA9IDA7CisgICAgICAgaW50IGk7CisgICAgICAgZm9yIChpID0gMTsgaSAmbHQ7PSBuOyBpKyspIHsKKyAgICAgICAgIGlmICghbHVhX2lzbnVtYmVyKEwsIGkpKSB7CisgICAgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsICJpbmNvcnJlY3QgYXJndW1lbnQiKTsKKyAgICAgICAgICAgbHVhX2Vycm9yKEwpOworICAgICAgICAgfQorICAgICAgICAgc3VtICs9IGx1YV90b251bWJlcihMLCBpKTsKKyAgICAgICB9CisgICAgICAgbHVhX3B1c2hudW1iZXIoTCwgc3VtL24pOyAgICAgICAgLyogZmlyc3QgcmVzdWx0ICovCisgICAgICAgbHVhX3B1c2hudW1iZXIoTCwgc3VtKTsgICAgICAgICAvKiBzZWNvbmQgcmVzdWx0ICovCisgICAgICAgcmV0dXJuIDI7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXN1bHRzICovCisgICAgIH0KKzwvcHJlPgorCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9jaGVja3N0YWNrIj48Y29kZT5sdWFfY2hlY2tzdGFjazwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9jaGVja3N0YWNrIChsdWFfU3RhdGUgKkwsIGludCBleHRyYSk7PC9wcmU+CisKKzxwPgorRW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCA8Y29kZT5leHRyYTwvY29kZT4gZnJlZSBzdGFjayBzbG90cyBpbiB0aGUgc3RhY2suCitJdCByZXR1cm5zIGZhbHNlIGlmIGl0IGNhbm5vdCBmdWxmaWxsIHRoZSByZXF1ZXN0LAorYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSB0aGUgc3RhY2sgdG8gYmUgbGFyZ2VyIHRoYW4gYSBmaXhlZCBtYXhpbXVtIHNpemUKKyh0eXBpY2FsbHkgYXQgbGVhc3QgYSBmZXcgdGhvdXNhbmQgZWxlbWVudHMpIG9yCitiZWNhdXNlIGl0IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgc3RhY2sgc2l6ZS4KK1RoaXMgZnVuY3Rpb24gbmV2ZXIgc2hyaW5rcyB0aGUgc3RhY2s7CitpZiB0aGUgc3RhY2sgaXMgYWxyZWFkeSBsYXJnZXIgdGhhbiB0aGUgbmV3IHNpemUsCitpdCBpcyBsZWZ0IHVuY2hhbmdlZC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9jbG9zZSI+PGNvZGU+bHVhX2Nsb3NlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YV9jbG9zZSAobHVhX1N0YXRlICpMKTs8L3ByZT4KKworPHA+CitEZXN0cm95cyBhbGwgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gTHVhIHN0YXRlCisoY2FsbGluZyB0aGUgY29ycmVzcG9uZGluZyBnYXJiYWdlLWNvbGxlY3Rpb24gbWV0YW1ldGhvZHMsIGlmIGFueSkKK2FuZCBmcmVlcyBhbGwgZHluYW1pYyBtZW1vcnkgdXNlZCBieSB0aGlzIHN0YXRlLgorT24gc2V2ZXJhbCBwbGF0Zm9ybXMsIHlvdSBtYXkgbm90IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLAorYmVjYXVzZSBhbGwgcmVzb3VyY2VzIGFyZSBuYXR1cmFsbHkgcmVsZWFzZWQgd2hlbiB0aGUgaG9zdCBwcm9ncmFtIGVuZHMuCitPbiB0aGUgb3RoZXIgaGFuZCwgbG9uZy1ydW5uaW5nIHByb2dyYW1zIHRoYXQgY3JlYXRlIG11bHRpcGxlIHN0YXRlcywKK3N1Y2ggYXMgZGFlbW9ucyBvciB3ZWIgc2VydmVycywKK21pZ2h0IG5lZWQgdG8gY2xvc2Ugc3RhdGVzIGFzIHNvb24gYXMgdGhleSBhcmUgbm90IG5lZWRlZC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9jb21wYXJlIj48Y29kZT5sdWFfY29tcGFyZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9jb21wYXJlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleDEsIGludCBpbmRleDIsIGludCBvcCk7PC9wcmU+CisKKzxwPgorQ29tcGFyZXMgdHdvIEx1YSB2YWx1ZXMuCitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IGluZGV4IDxjb2RlPmluZGV4MTwvY29kZT4gc2F0aXNmaWVzIDxjb2RlPm9wPC9jb2RlPgord2hlbiBjb21wYXJlZCB3aXRoIHRoZSB2YWx1ZSBhdCBpbmRleCA8Y29kZT5pbmRleDI8L2NvZGU+LAorZm9sbG93aW5nIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgTHVhIG9wZXJhdG9yCisodGhhdCBpcywgaXQgbWF5IGNhbGwgbWV0YW1ldGhvZHMpLgorT3RoZXJ3aXNlIHJldHVybnMmbmJzcDswLgorQWxzbyByZXR1cm5zJm5ic3A7MCBpZiBhbnkgb2YgdGhlIGluZGljZXMgaXMgbm9uIHZhbGlkLgorCisKKzxwPgorVGhlIHZhbHVlIG9mIDxjb2RlPm9wPC9jb2RlPiBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKKworPHVsPgorCis8bGk+PGI+PGEgbmFtZT0icGRmLUxVQV9PUEVRIj48Y29kZT5MVUFfT1BFUTwvY29kZT48L2E+OiA8L2I+IGNvbXBhcmVzIGZvciBlcXVhbGl0eSAoPGNvZGU+PT08L2NvZGU+KTwvbGk+Cis8bGk+PGI+PGEgbmFtZT0icGRmLUxVQV9PUExUIj48Y29kZT5MVUFfT1BMVDwvY29kZT48L2E+OiA8L2I+IGNvbXBhcmVzIGZvciBsZXNzIHRoYW4gKDxjb2RlPiZsdDs8L2NvZGU+KTwvbGk+Cis8bGk+PGI+PGEgbmFtZT0icGRmLUxVQV9PUExFIj48Y29kZT5MVUFfT1BMRTwvY29kZT48L2E+OiA8L2I+IGNvbXBhcmVzIGZvciBsZXNzIG9yIGVxdWFsICg8Y29kZT4mbHQ7PTwvY29kZT4pPC9saT4KKworPC91bD4KKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfY29uY2F0Ij48Y29kZT5sdWFfY29uY2F0PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstbiwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9jb25jYXQgKGx1YV9TdGF0ZSAqTCwgaW50IG4pOzwvcHJlPgorCis8cD4KK0NvbmNhdGVuYXRlcyB0aGUgPGNvZGU+bjwvY29kZT4gdmFsdWVzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLAorcG9wcyB0aGVtLCBhbmQgbGVhdmVzIHRoZSByZXN1bHQgYXQgdGhlIHRvcC4KK0lmIDxjb2RlPm48L2NvZGU+Jm5ic3A7aXMmbmJzcDsxLCB0aGUgcmVzdWx0IGlzIHRoZSBzaW5nbGUgdmFsdWUgb24gdGhlIHN0YWNrCisodGhhdCBpcywgdGhlIGZ1bmN0aW9uIGRvZXMgbm90aGluZyk7CitpZiA8Y29kZT5uPC9jb2RlPiBpcyAwLCB0aGUgcmVzdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuCitDb25jYXRlbmF0aW9uIGlzIHBlcmZvcm1lZCBmb2xsb3dpbmcgdGhlIHVzdWFsIHNlbWFudGljcyBvZiBMdWEKKyhzZWUgPGEgaHJlZj0iIzMuNC41Ij4mc2VjdDszLjQuNTwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2NvcHkiPjxjb2RlPmx1YV9jb3B5PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YV9jb3B5IChsdWFfU3RhdGUgKkwsIGludCBmcm9taWR4LCBpbnQgdG9pZHgpOzwvcHJlPgorCis8cD4KK01vdmVzIHRoZSBlbGVtZW50IGF0IGluZGV4IDxjb2RlPmZyb21pZHg8L2NvZGU+CitpbnRvIHRoZSB2YWxpZCBpbmRleCA8Y29kZT50b2lkeDwvY29kZT4KK3dpdGhvdXQgc2hpZnRpbmcgYW55IGVsZW1lbnQKKyh0aGVyZWZvcmUgcmVwbGFjaW5nIHRoZSB2YWx1ZSBhdCB0aGF0IHBvc2l0aW9uKS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9jcmVhdGV0YWJsZSI+PGNvZGU+bHVhX2NyZWF0ZXRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9jcmVhdGV0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgbmFyciwgaW50IG5yZWMpOzwvcHJlPgorCis8cD4KK0NyZWF0ZXMgYSBuZXcgZW1wdHkgdGFibGUgYW5kIHB1c2hlcyBpdCBvbnRvIHRoZSBzdGFjay4KK1BhcmFtZXRlciA8Y29kZT5uYXJyPC9jb2RlPiBpcyBhIGhpbnQgZm9yIGhvdyBtYW55IGVsZW1lbnRzIHRoZSB0YWJsZQord2lsbCBoYXZlIGFzIGEgc2VxdWVuY2U7CitwYXJhbWV0ZXIgPGNvZGU+bnJlYzwvY29kZT4gaXMgYSBoaW50IGZvciBob3cgbWFueSBvdGhlciBlbGVtZW50cwordGhlIHRhYmxlIHdpbGwgaGF2ZS4KK0x1YSBtYXkgdXNlIHRoZXNlIGhpbnRzIHRvIHByZWFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG5ldyB0YWJsZS4KK1RoaXMgcHJlLWFsbG9jYXRpb24gaXMgdXNlZnVsIGZvciBwZXJmb3JtYW5jZSB3aGVuIHlvdSBrbm93IGluIGFkdmFuY2UKK2hvdyBtYW55IGVsZW1lbnRzIHRoZSB0YWJsZSB3aWxsIGhhdmUuCitPdGhlcndpc2UgeW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9uIDxhIGhyZWY9IiNsdWFfbmV3dGFibGUiPjxjb2RlPmx1YV9uZXd0YWJsZTwvY29kZT48L2E+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2R1bXAiPjxjb2RlPmx1YV9kdW1wPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX2R1bXAgKGx1YV9TdGF0ZSAqTCwgbHVhX1dyaXRlciB3cml0ZXIsIHZvaWQgKmRhdGEpOzwvcHJlPgorCis8cD4KK0R1bXBzIGEgZnVuY3Rpb24gYXMgYSBiaW5hcnkgY2h1bmsuCitSZWNlaXZlcyBhIEx1YSBmdW5jdGlvbiBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaworYW5kIHByb2R1Y2VzIGEgYmluYXJ5IGNodW5rIHRoYXQsCitpZiBsb2FkZWQgYWdhaW4sCityZXN1bHRzIGluIGEgZnVuY3Rpb24gZXF1aXZhbGVudCB0byB0aGUgb25lIGR1bXBlZC4KK0FzIGl0IHByb2R1Y2VzIHBhcnRzIG9mIHRoZSBjaHVuaywKKzxhIGhyZWY9IiNsdWFfZHVtcCI+PGNvZGU+bHVhX2R1bXA8L2NvZGU+PC9hPiBjYWxscyBmdW5jdGlvbiA8Y29kZT53cml0ZXI8L2NvZGU+IChzZWUgPGEgaHJlZj0iI2x1YV9Xcml0ZXIiPjxjb2RlPmx1YV9Xcml0ZXI8L2NvZGU+PC9hPikKK3dpdGggdGhlIGdpdmVuIDxjb2RlPmRhdGE8L2NvZGU+Cit0byB3cml0ZSB0aGVtLgorCisKKzxwPgorVGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IHRoZSBsYXN0CitjYWxsIHRvIHRoZSB3cml0ZXI7CiswJm5ic3A7bWVhbnMgbm8gZXJyb3JzLgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwb3AgdGhlIEx1YSBmdW5jdGlvbiBmcm9tIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9lcnJvciI+PGNvZGU+bHVhX2Vycm9yPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMSwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhX2Vycm9yIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK0dlbmVyYXRlcyBhIEx1YSBlcnJvci4KK1RoZSBlcnJvciBtZXNzYWdlICh3aGljaCBjYW4gYWN0dWFsbHkgYmUgYSBMdWEgdmFsdWUgb2YgYW55IHR5cGUpCittdXN0IGJlIG9uIHRoZSBzdGFjayB0b3AuCitUaGlzIGZ1bmN0aW9uIGRvZXMgYSBsb25nIGp1bXAsCithbmQgdGhlcmVmb3JlIG5ldmVyIHJldHVybnMKKyhzZWUgPGEgaHJlZj0iI2x1YUxfZXJyb3IiPjxjb2RlPmx1YUxfZXJyb3I8L2NvZGU+PC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2MiPjxjb2RlPmx1YV9nYzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9nYyAobHVhX1N0YXRlICpMLCBpbnQgd2hhdCwgaW50IGRhdGEpOzwvcHJlPgorCis8cD4KK0NvbnRyb2xzIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcGVyZm9ybXMgc2V2ZXJhbCB0YXNrcywKK2FjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciA8Y29kZT53aGF0PC9jb2RlPjoKKworPHVsPgorCis8bGk+PGI+PGNvZGU+TFVBX0dDU1RPUDwvY29kZT46IDwvYj4KK3N0b3BzIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5MVUFfR0NSRVNUQVJUPC9jb2RlPjogPC9iPgorcmVzdGFydHMgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorPC9saT4KKworPGxpPjxiPjxjb2RlPkxVQV9HQ0NPTExFQ1Q8L2NvZGU+OiA8L2I+CitwZXJmb3JtcyBhIGZ1bGwgZ2FyYmFnZS1jb2xsZWN0aW9uIGN5Y2xlLgorPC9saT4KKworPGxpPjxiPjxjb2RlPkxVQV9HQ0NPVU5UPC9jb2RlPjogPC9iPgorcmV0dXJucyB0aGUgY3VycmVudCBhbW91bnQgb2YgbWVtb3J5IChpbiBLYnl0ZXMpIGluIHVzZSBieSBMdWEuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+TFVBX0dDQ09VTlRCPC9jb2RlPjogPC9iPgorcmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIHRoZSBjdXJyZW50IGFtb3VudCBvZiBieXRlcyBvZgorbWVtb3J5IGluIHVzZSBieSBMdWEgYnkgMTAyNC4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5MVUFfR0NTVEVQPC9jb2RlPjogPC9iPgorcGVyZm9ybXMgYW4gaW5jcmVtZW50YWwgc3RlcCBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uCitUaGUgc3RlcCAic2l6ZSIgaXMgY29udHJvbGxlZCBieSA8Y29kZT5kYXRhPC9jb2RlPgorKGxhcmdlciB2YWx1ZXMgbWVhbiBtb3JlIHN0ZXBzKSBpbiBhIG5vbi1zcGVjaWZpZWQgd2F5LgorSWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgc3RlcCBzaXplCit5b3UgbXVzdCBleHBlcmltZW50YWxseSB0dW5lIHRoZSB2YWx1ZSBvZiA8Y29kZT5kYXRhPC9jb2RlPi4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlIHN0ZXAgZmluaXNoZWQgYQorZ2FyYmFnZS1jb2xsZWN0aW9uIGN5Y2xlLgorPC9saT4KKworPGxpPjxiPjxjb2RlPkxVQV9HQ1NFVFBBVVNFPC9jb2RlPjogPC9iPgorc2V0cyA8Y29kZT5kYXRhPC9jb2RlPiBhcyB0aGUgbmV3IHZhbHVlCitmb3IgdGhlIDxlbT5wYXVzZTwvZW0+IG9mIHRoZSBjb2xsZWN0b3IgKHNlZSA8YSBocmVmPSIjMi41Ij4mc2VjdDsyLjU8L2E+KS4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgcGF1c2UuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+TFVBX0dDU0VUU1RFUE1VTDwvY29kZT46IDwvYj4KK3NldHMgPGNvZGU+ZGF0YTwvY29kZT4gYXMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIDxlbT5zdGVwIG11bHRpcGxpZXI8L2VtPiBvZgordGhlIGNvbGxlY3RvciAoc2VlIDxhIGhyZWY9IiMyLjUiPiZzZWN0OzIuNTwvYT4pLgorVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBzdGVwIG11bHRpcGxpZXIuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+TFVBX0dDSVNSVU5OSU5HPC9jb2RlPjogPC9iPgorcmV0dXJucyBhIGJvb2xlYW4gdGhhdCB0ZWxscyB3aGV0aGVyIHRoZSBjb2xsZWN0b3IgaXMgcnVubmluZworKGkuZS4sIG5vdCBzdG9wcGVkKS4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5MVUFfR0NHRU48L2NvZGU+OiA8L2I+CitjaGFuZ2VzIHRoZSBjb2xsZWN0b3IgdG8gZ2VuZXJhdGlvbmFsIG1vZGUKKyhzZWUgPGEgaHJlZj0iIzIuNSI+JnNlY3Q7Mi41PC9hPikuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+TFVBX0dDSU5DPC9jb2RlPjogPC9iPgorY2hhbmdlcyB0aGUgY29sbGVjdG9yIHRvIGluY3JlbWVudGFsIG1vZGUuCitUaGlzIGlzIHRoZSBkZWZhdWx0IG1vZGUuCis8L2xpPgorCis8L3VsPgorCis8cD4KK0ZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlc2Ugb3B0aW9ucywKK3NlZSA8YSBocmVmPSIjcGRmLWNvbGxlY3RnYXJiYWdlIj48Y29kZT5jb2xsZWN0Z2FyYmFnZTwvY29kZT48L2E+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldGFsbG9jZiI+PGNvZGU+bHVhX2dldGFsbG9jZjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+bHVhX0FsbG9jIGx1YV9nZXRhbGxvY2YgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqKnVkKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIHRoZSBtZW1vcnktYWxsb2NhdGlvbiBmdW5jdGlvbiBvZiBhIGdpdmVuIHN0YXRlLgorSWYgPGNvZGU+dWQ8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwgTHVhIHN0b3JlcyBpbiA8Y29kZT4qdWQ8L2NvZGU+IHRoZQorb3BhcXVlIHBvaW50ZXIgcGFzc2VkIHRvIDxhIGhyZWY9IiNsdWFfbmV3c3RhdGUiPjxjb2RlPmx1YV9uZXdzdGF0ZTwvY29kZT48L2E+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldGN0eCI+PGNvZGU+bHVhX2dldGN0eDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9nZXRjdHggKGx1YV9TdGF0ZSAqTCwgaW50ICpjdHgpOzwvcHJlPgorCis8cD4KK1RoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGEgY29udGludWF0aW9uIGZ1bmN0aW9uIChzZWUgPGEgaHJlZj0iIzQuNyI+JnNlY3Q7NC43PC9hPikKK3RvIHJldHJpZXZlIHRoZSBzdGF0dXMgb2YgdGhlIHRocmVhZCBhbmQgYSBjb250ZXh0IGluZm9ybWF0aW9uLgorCisKKzxwPgorV2hlbiBjYWxsZWQgaW4gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLAorPGEgaHJlZj0iI2x1YV9nZXRjdHgiPjxjb2RlPmx1YV9nZXRjdHg8L2NvZGU+PC9hPiBhbHdheXMgcmV0dXJucyA8YSBocmVmPSIjcGRmLUxVQV9PSyI+PGNvZGU+TFVBX09LPC9jb2RlPjwvYT4KK2FuZCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGl0cyBhcmd1bWVudCA8Y29kZT5jdHg8L2NvZGU+LgorV2hlbiBjYWxsZWQgaW5zaWRlIGEgY29udGludWF0aW9uIGZ1bmN0aW9uLAorPGEgaHJlZj0iI2x1YV9nZXRjdHgiPjxjb2RlPmx1YV9nZXRjdHg8L2NvZGU+PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNwZGYtTFVBX1lJRUxEIj48Y29kZT5MVUFfWUlFTEQ8L2NvZGU+PC9hPiBhbmQgc2V0cwordGhlIHZhbHVlIG9mIDxjb2RlPmN0eDwvY29kZT4gdG8gYmUgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24KKyh0aGUgdmFsdWUgcGFzc2VkIGFzIHRoZSA8Y29kZT5jdHg8L2NvZGU+IGFyZ3VtZW50Cit0byB0aGUgY2FsbGVlIHRvZ2V0aGVyIHdpdGggdGhlIGNvbnRpbnVhdGlvbiBmdW5jdGlvbikuCisKKworPHA+CitXaGVuIHRoZSBjYWxsZWUgaXMgPGEgaHJlZj0iI2x1YV9wY2FsbGsiPjxjb2RlPmx1YV9wY2FsbGs8L2NvZGU+PC9hPiwKK0x1YSBtYXkgYWxzbyBjYWxsIGl0cyBjb250aW51YXRpb24gZnVuY3Rpb24KK3RvIGhhbmRsZSBlcnJvcnMgZHVyaW5nIHRoZSBjYWxsLgorVGhhdCBpcywgdXBvbiBhbiBlcnJvciBpbiB0aGUgZnVuY3Rpb24gY2FsbGVkIGJ5IDxhIGhyZWY9IiNsdWFfcGNhbGxrIj48Y29kZT5sdWFfcGNhbGxrPC9jb2RlPjwvYT4sCitMdWEgbWF5IG5vdCByZXR1cm4gdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCitidXQgaW5zdGVhZCBtYXkgY2FsbCB0aGUgY29udGludWF0aW9uIGZ1bmN0aW9uLgorSW4gdGhhdCBjYXNlLCBhIGNhbGwgdG8gPGEgaHJlZj0iI2x1YV9nZXRjdHgiPjxjb2RlPmx1YV9nZXRjdHg8L2NvZGU+PC9hPiB3aWxsIHJldHVybiB0aGUgZXJyb3IgY29kZQorKHRoZSB2YWx1ZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IDxhIGhyZWY9IiNsdWFfcGNhbGxrIj48Y29kZT5sdWFfcGNhbGxrPC9jb2RlPjwvYT4pOwordGhlIHZhbHVlIG9mIDxjb2RlPmN0eDwvY29kZT4gd2lsbCBiZSBzZXQgdG8gdGhlIGNvbnRleHQgaW5mb3JtYXRpb24sCithcyBpbiB0aGUgY2FzZSBvZiBhIHlpZWxkLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldGZpZWxkIj48Y29kZT5sdWFfZ2V0ZmllbGQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX2dldGZpZWxkIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3QgY2hhciAqayk7PC9wcmU+CisKKzxwPgorUHVzaGVzIG9udG8gdGhlIHN0YWNrIHRoZSB2YWx1ZSA8Y29kZT50W2tdPC9jb2RlPiwKK3doZXJlIDxjb2RlPnQ8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCitBcyBpbiBMdWEsIHRoaXMgZnVuY3Rpb24gbWF5IHRyaWdnZXIgYSBtZXRhbWV0aG9kCitmb3IgdGhlICJpbmRleCIgZXZlbnQgKHNlZSA8YSBocmVmPSIjMi40Ij4mc2VjdDsyLjQ8L2E+KS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9nZXRnbG9iYWwiPjxjb2RlPmx1YV9nZXRnbG9iYWw8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX2dldGdsb2JhbCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpuYW1lKTs8L3ByZT4KKworPHA+CitQdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwgPGNvZGU+bmFtZTwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2V0bWV0YXRhYmxlIj48Y29kZT5sdWFfZ2V0bWV0YXRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKygwfDEpLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9nZXRtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitQdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIG1ldGF0YWJsZSBvZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4LgorSWYgdGhlIHZhbHVlIGRvZXMgbm90IGhhdmUgYSBtZXRhdGFibGUsCit0aGUgZnVuY3Rpb24gcmV0dXJucyZuYnNwOzAgYW5kIHB1c2hlcyBub3RoaW5nIG9uIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9nZXR0YWJsZSI+PGNvZGU+bHVhX2dldHRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMSwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9nZXR0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgdmFsdWUgPGNvZGU+dFtrXTwvY29kZT4sCit3aGVyZSA8Y29kZT50PC9jb2RlPiBpcyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4CithbmQgPGNvZGU+azwvY29kZT4gaXMgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBwb3BzIHRoZSBrZXkgZnJvbSB0aGUgc3RhY2sKKyhwdXR0aW5nIHRoZSByZXN1bHRpbmcgdmFsdWUgaW4gaXRzIHBsYWNlKS4KK0FzIGluIEx1YSwgdGhpcyBmdW5jdGlvbiBtYXkgdHJpZ2dlciBhIG1ldGFtZXRob2QKK2ZvciB0aGUgImluZGV4IiBldmVudCAoc2VlIDxhIGhyZWY9IiMyLjQiPiZzZWN0OzIuNDwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldHRvcCI+PGNvZGU+bHVhX2dldHRvcDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9nZXR0b3AgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRvcCBlbGVtZW50IGluIHRoZSBzdGFjay4KK0JlY2F1c2UgaW5kaWNlcyBzdGFydCBhdCZuYnNwOzEsCit0aGlzIHJlc3VsdCBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzdGFjaworKGFuZCBzbyAwJm5ic3A7bWVhbnMgYW4gZW1wdHkgc3RhY2spLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldHVzZXJ2YWx1ZSI+PGNvZGU+bHVhX2dldHVzZXJ2YWx1ZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfZ2V0dXNlcnZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUHVzaGVzIG9udG8gdGhlIHN0YWNrIHRoZSBMdWEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyZGF0YQorYXQgdGhlIGdpdmVuIGluZGV4LgorVGhpcyBMdWEgdmFsdWUgbXVzdCBiZSBhIHRhYmxlIG9yIDxiPm5pbDwvYj4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaW5zZXJ0Ij48Y29kZT5sdWFfaW5zZXJ0PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMSwgKzEsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YV9pbnNlcnQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitNb3ZlcyB0aGUgdG9wIGVsZW1lbnQgaW50byB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgsCitzaGlmdGluZyB1cCB0aGUgZWxlbWVudHMgYWJvdmUgdGhpcyBpbmRleCB0byBvcGVuIHNwYWNlLgorVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYSBwc2V1ZG8taW5kZXgsCitiZWNhdXNlIGEgcHNldWRvLWluZGV4IGlzIG5vdCBhbiBhY3R1YWwgc3RhY2sgcG9zaXRpb24uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfSW50ZWdlciI+PGNvZGU+bHVhX0ludGVnZXI8L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgcHRyZGlmZl90IGx1YV9JbnRlZ2VyOzwvcHJlPgorCis8cD4KK1RoZSB0eXBlIHVzZWQgYnkgdGhlIEx1YSBBUEkgdG8gcmVwcmVzZW50IHNpZ25lZCBpbnRlZ3JhbCB2YWx1ZXMuCisKKworPHA+CitCeSBkZWZhdWx0IGl0IGlzIGEgPGNvZGU+cHRyZGlmZl90PC9jb2RlPiwKK3doaWNoIGlzIHVzdWFsbHkgdGhlIGxhcmdlc3Qgc2lnbmVkIGludGVncmFsIHR5cGUgdGhlIG1hY2hpbmUgaGFuZGxlcworImNvbWZvcnRhYmx5Ii4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9pc2Jvb2xlYW4iPjxjb2RlPmx1YV9pc2Jvb2xlYW48L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfaXNib29sZWFuIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyAxIGlmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgYSBib29sZWFuLAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXNjZnVuY3Rpb24iPjxjb2RlPmx1YV9pc2NmdW5jdGlvbjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9pc2NmdW5jdGlvbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIGEgQyZuYnNwO2Z1bmN0aW9uLAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXNmdW5jdGlvbiI+PGNvZGU+bHVhX2lzZnVuY3Rpb248L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfaXNmdW5jdGlvbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIGEgZnVuY3Rpb24KKyhlaXRoZXIgQyBvciBMdWEpLCBhbmQgMCZuYnNwO290aGVyd2lzZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9pc2xpZ2h0dXNlcmRhdGEiPjxjb2RlPmx1YV9pc2xpZ2h0dXNlcmRhdGE8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfaXNsaWdodHVzZXJkYXRhIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyAxIGlmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgYSBsaWdodCB1c2VyZGF0YSwKK2FuZCAwJm5ic3A7b3RoZXJ3aXNlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2lzbmlsIj48Y29kZT5sdWFfaXNuaWw8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfaXNuaWwgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCBpcyA8Yj5uaWw8L2I+LAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXNub25lIj48Y29kZT5sdWFfaXNub25lPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX2lzbm9uZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgZ2l2ZW4gaW5kZXggaXMgbm90IHZhbGlkLAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXNub25lb3JuaWwiPjxjb2RlPmx1YV9pc25vbmVvcm5pbDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9pc25vbmVvcm5pbCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgZ2l2ZW4gaW5kZXggaXMgbm90IHZhbGlkCitvciBpZiB0aGUgdmFsdWUgYXQgdGhpcyBpbmRleCBpcyA8Yj5uaWw8L2I+LAorYW5kIDAmbmJzcDtvdGhlcndpc2UuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfaXNudW1iZXIiPjxjb2RlPmx1YV9pc251bWJlcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9pc251bWJlciAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIGEgbnVtYmVyCitvciBhIHN0cmluZyBjb252ZXJ0aWJsZSB0byBhIG51bWJlciwKK2FuZCAwJm5ic3A7b3RoZXJ3aXNlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2lzc3RyaW5nIj48Y29kZT5sdWFfaXNzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfaXNzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCBpcyBhIHN0cmluZworb3IgYSBudW1iZXIgKHdoaWNoIGlzIGFsd2F5cyBjb252ZXJ0aWJsZSB0byBhIHN0cmluZyksCithbmQgMCZuYnNwO290aGVyd2lzZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9pc3RhYmxlIj48Y29kZT5sdWFfaXN0YWJsZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9pc3RhYmxlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyAxIGlmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgYSB0YWJsZSwKK2FuZCAwJm5ic3A7b3RoZXJ3aXNlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2lzdGhyZWFkIj48Y29kZT5sdWFfaXN0aHJlYWQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfaXN0aHJlYWQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCBpcyBhIHRocmVhZCwKK2FuZCAwJm5ic3A7b3RoZXJ3aXNlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2lzdXNlcmRhdGEiPjxjb2RlPmx1YV9pc3VzZXJkYXRhPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX2lzdXNlcmRhdGEgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCBpcyBhIHVzZXJkYXRhCisoZWl0aGVyIGZ1bGwgb3IgbGlnaHQpLCBhbmQgMCZuYnNwO290aGVyd2lzZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9sZW4iPjxjb2RlPmx1YV9sZW48L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX2xlbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlICJsZW5ndGgiIG9mIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXg7CitpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSAnPGNvZGU+IzwvY29kZT4nIG9wZXJhdG9yIGluIEx1YSAoc2VlIDxhIGhyZWY9IiMzLjQuNiI+JnNlY3Q7My40LjY8L2E+KS4KK1RoZSByZXN1bHQgaXMgcHVzaGVkIG9uIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9sb2FkIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgIGx1YV9SZWFkZXIgcmVhZGVyLAorICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICBjb25zdCBjaGFyICpzb3VyY2UsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGUpOzwvcHJlPgorCis8cD4KK0xvYWRzIGEgTHVhIGNodW5rICh3aXRob3V0IHJ1bm5pbmcgaXQpLgorSWYgdGhlcmUgYXJlIG5vIGVycm9ycywKKzxjb2RlPmx1YV9sb2FkPC9jb2RlPiBwdXNoZXMgdGhlIGNvbXBpbGVkIGNodW5rIGFzIGEgTHVhCitmdW5jdGlvbiBvbiB0b3Agb2YgdGhlIHN0YWNrLgorT3RoZXJ3aXNlLCBpdCBwdXNoZXMgYW4gZXJyb3IgbWVzc2FnZS4KKworCis8cD4KK1RoZSByZXR1cm4gdmFsdWVzIG9mIDxjb2RlPmx1YV9sb2FkPC9jb2RlPiBhcmU6CisKKzx1bD4KKworPGxpPjxiPjxhIGhyZWY9IiNwZGYtTFVBX09LIj48Y29kZT5MVUFfT0s8L2NvZGU+PC9hPjogPC9iPiBubyBlcnJvcnM7PC9saT4KKworPGxpPjxiPjxhIG5hbWU9InBkZi1MVUFfRVJSU1lOVEFYIj48Y29kZT5MVUFfRVJSU1lOVEFYPC9jb2RlPjwvYT46IDwvYj4KK3N5bnRheCBlcnJvciBkdXJpbmcgcHJlY29tcGlsYXRpb247PC9saT4KKworPGxpPjxiPjxhIGhyZWY9IiNwZGYtTFVBX0VSUk1FTSI+PGNvZGU+TFVBX0VSUk1FTTwvY29kZT48L2E+OiA8L2I+CittZW1vcnkgYWxsb2NhdGlvbiBlcnJvcjs8L2xpPgorCis8bGk+PGI+PGEgaHJlZj0iI3BkZi1MVUFfRVJSR0NNTSI+PGNvZGU+TFVBX0VSUkdDTU08L2NvZGU+PC9hPjogPC9iPgorZXJyb3Igd2hpbGUgcnVubmluZyBhIDxjb2RlPl9fZ2M8L2NvZGU+IG1ldGFtZXRob2QuCisoVGhpcyBlcnJvciBoYXMgbm8gcmVsYXRpb24gd2l0aCB0aGUgY2h1bmsgYmVpbmcgbG9hZGVkLgorSXQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4pCis8L2xpPgorCis8L3VsPgorCis8cD4KK1RoZSA8Y29kZT5sdWFfbG9hZDwvY29kZT4gZnVuY3Rpb24gdXNlcyBhIHVzZXItc3VwcGxpZWQgPGNvZGU+cmVhZGVyPC9jb2RlPiBmdW5jdGlvbgordG8gcmVhZCB0aGUgY2h1bmsgKHNlZSA8YSBocmVmPSIjbHVhX1JlYWRlciI+PGNvZGU+bHVhX1JlYWRlcjwvY29kZT48L2E+KS4KK1RoZSA8Y29kZT5kYXRhPC9jb2RlPiBhcmd1bWVudCBpcyBhbiBvcGFxdWUgdmFsdWUgcGFzc2VkIHRvIHRoZSByZWFkZXIgZnVuY3Rpb24uCisKKworPHA+CitUaGUgPGNvZGU+c291cmNlPC9jb2RlPiBhcmd1bWVudCBnaXZlcyBhIG5hbWUgdG8gdGhlIGNodW5rLAord2hpY2ggaXMgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMgYW5kIGluIGRlYnVnIGluZm9ybWF0aW9uIChzZWUgPGEgaHJlZj0iIzQuOSI+JnNlY3Q7NC45PC9hPikuCisKKworPHA+Cis8Y29kZT5sdWFfbG9hZDwvY29kZT4gYXV0b21hdGljYWxseSBkZXRlY3RzIHdoZXRoZXIgdGhlIGNodW5rIGlzIHRleHQgb3IgYmluYXJ5CithbmQgbG9hZHMgaXQgYWNjb3JkaW5nbHkgKHNlZSBwcm9ncmFtIDxjb2RlPmx1YWM8L2NvZGU+KS4KK1RoZSBzdHJpbmcgPGNvZGU+bW9kZTwvY29kZT4gd29ya3MgYXMgaW4gZnVuY3Rpb24gPGEgaHJlZj0iI3BkZi1sb2FkIj48Y29kZT5sb2FkPC9jb2RlPjwvYT4sCit3aXRoIHRoZSBhZGRpdGlvbiB0aGF0CithIDxjb2RlPk5VTEw8L2NvZGU+IHZhbHVlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHN0cmluZyAiPGNvZGU+YnQ8L2NvZGU+Ii4KKworCis8cD4KKzxjb2RlPmx1YV9sb2FkPC9jb2RlPiB1c2VzIHRoZSBzdGFjayBpbnRlcm5hbGx5LAorc28gdGhlIHJlYWRlciBmdW5jdGlvbiBzaG91bGQgYWx3YXlzIGxlYXZlIHRoZSBzdGFjawordW5tb2RpZmllZCB3aGVuIHJldHVybmluZy4KKworCis8cD4KK0lmIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gaGFzIG9uZSB1cHZhbHVlLAordGhpcyB1cHZhbHVlIGlzIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbCBlbnZpcm9ubWVudAorc3RvcmVkIGF0IGluZGV4IDxjb2RlPkxVQV9SSURYX0dMT0JBTFM8L2NvZGU+IGluIHRoZSByZWdpc3RyeSAoc2VlIDxhIGhyZWY9IiM0LjUiPiZzZWN0OzQuNTwvYT4pLgorV2hlbiBsb2FkaW5nIG1haW4gY2h1bmtzLAordGhpcyB1cHZhbHVlIHdpbGwgYmUgdGhlIDxjb2RlPl9FTlY8L2NvZGU+IHZhcmlhYmxlIChzZWUgPGEgaHJlZj0iIzIuMiI+JnNlY3Q7Mi4yPC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfbmV3c3RhdGUiPjxjb2RlPmx1YV9uZXdzdGF0ZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+bHVhX1N0YXRlICpsdWFfbmV3c3RhdGUgKGx1YV9BbGxvYyBmLCB2b2lkICp1ZCk7PC9wcmU+CisKKzxwPgorQ3JlYXRlcyBhIG5ldyB0aHJlYWQgcnVubmluZyBpbiBhIG5ldywgaW5kZXBlbmRlbnQgc3RhdGUuCitSZXR1cm5zIDxjb2RlPk5VTEw8L2NvZGU+IGlmIGNhbm5vdCBjcmVhdGUgdGhlIHRocmVhZCBvciB0aGUgc3RhdGUKKyhkdWUgdG8gbGFjayBvZiBtZW1vcnkpLgorVGhlIGFyZ3VtZW50IDxjb2RlPmY8L2NvZGU+IGlzIHRoZSBhbGxvY2F0b3IgZnVuY3Rpb247CitMdWEgZG9lcyBhbGwgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoaXMgc3RhdGUgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLgorVGhlIHNlY29uZCBhcmd1bWVudCwgPGNvZGU+dWQ8L2NvZGU+LCBpcyBhbiBvcGFxdWUgcG9pbnRlciB0aGF0IEx1YQorcGFzc2VzIHRvIHRoZSBhbGxvY2F0b3IgaW4gZXZlcnkgY2FsbC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9uZXd0YWJsZSI+PGNvZGU+bHVhX25ld3RhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9uZXd0YWJsZSAobHVhX1N0YXRlICpMKTs8L3ByZT4KKworPHA+CitDcmVhdGVzIGEgbmV3IGVtcHR5IHRhYmxlIGFuZCBwdXNoZXMgaXQgb250byB0aGUgc3RhY2suCitJdCBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPmx1YV9jcmVhdGV0YWJsZShMLCAwLCAwKTwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfbmV3dGhyZWFkIj48Y29kZT5sdWFfbmV3dGhyZWFkPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT5sdWFfU3RhdGUgKmx1YV9uZXd0aHJlYWQgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorQ3JlYXRlcyBhIG5ldyB0aHJlYWQsIHB1c2hlcyBpdCBvbiB0aGUgc3RhY2ssCithbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSA8YSBocmVmPSIjbHVhX1N0YXRlIj48Y29kZT5sdWFfU3RhdGU8L2NvZGU+PC9hPiB0aGF0IHJlcHJlc2VudHMgdGhpcyBuZXcgdGhyZWFkLgorVGhlIG5ldyB0aHJlYWQgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBzaGFyZXMgd2l0aCB0aGUgb3JpZ2luYWwgdGhyZWFkCitpdHMgZ2xvYmFsIGVudmlyb25tZW50LAorYnV0IGhhcyBhbiBpbmRlcGVuZGVudCBleGVjdXRpb24gc3RhY2suCisKKworPHA+CitUaGVyZSBpcyBubyBleHBsaWNpdCBmdW5jdGlvbiB0byBjbG9zZSBvciB0byBkZXN0cm95IGEgdGhyZWFkLgorVGhyZWFkcyBhcmUgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24sCitsaWtlIGFueSBMdWEgb2JqZWN0LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX25ld3VzZXJkYXRhIj48Y29kZT5sdWFfbmV3dXNlcmRhdGE8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgKmx1YV9uZXd1c2VyZGF0YSAobHVhX1N0YXRlICpMLCBzaXplX3Qgc2l6ZSk7PC9wcmU+CisKKzxwPgorVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgYmxvY2sgb2YgbWVtb3J5IHdpdGggdGhlIGdpdmVuIHNpemUsCitwdXNoZXMgb250byB0aGUgc3RhY2sgYSBuZXcgZnVsbCB1c2VyZGF0YSB3aXRoIHRoZSBibG9jayBhZGRyZXNzLAorYW5kIHJldHVybnMgdGhpcyBhZGRyZXNzLgorVGhlIGhvc3QgcHJvZ3JhbSBjYW4gZnJlZWx5IHVzZSB0aGlzIG1lbW9yeS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9uZXh0Ij48Y29kZT5sdWFfbmV4dDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTEsICsoMnwwKSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFfbmV4dCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1BvcHMgYSBrZXkgZnJvbSB0aGUgc3RhY2ssCithbmQgcHVzaGVzIGEga2V5Jm5kYXNoO3ZhbHVlIHBhaXIgZnJvbSB0aGUgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4CisodGhlICJuZXh0IiBwYWlyIGFmdGVyIHRoZSBnaXZlbiBrZXkpLgorSWYgdGhlcmUgYXJlIG5vIG1vcmUgZWxlbWVudHMgaW4gdGhlIHRhYmxlLAordGhlbiA8YSBocmVmPSIjbHVhX25leHQiPjxjb2RlPmx1YV9uZXh0PC9jb2RlPjwvYT4gcmV0dXJucyAwIChhbmQgcHVzaGVzIG5vdGhpbmcpLgorCisKKzxwPgorQSB0eXBpY2FsIHRyYXZlcnNhbCBsb29rcyBsaWtlIHRoaXM6CisKKzxwcmU+CisgICAgIC8qIHRhYmxlIGlzIGluIHRoZSBzdGFjayBhdCBpbmRleCAndCcgKi8KKyAgICAgbHVhX3B1c2huaWwoTCk7ICAvKiBmaXJzdCBrZXkgKi8KKyAgICAgd2hpbGUgKGx1YV9uZXh0KEwsIHQpICE9IDApIHsKKyAgICAgICAvKiB1c2VzICdrZXknIChhdCBpbmRleCAtMikgYW5kICd2YWx1ZScgKGF0IGluZGV4IC0xKSAqLworICAgICAgIHByaW50ZigiJXMgLSAlc1xuIiwKKyAgICAgICAgICAgICAgbHVhX3R5cGVuYW1lKEwsIGx1YV90eXBlKEwsIC0yKSksCisgICAgICAgICAgICAgIGx1YV90eXBlbmFtZShMLCBsdWFfdHlwZShMLCAtMSkpKTsKKyAgICAgICAvKiByZW1vdmVzICd2YWx1ZSc7IGtlZXBzICdrZXknIGZvciBuZXh0IGl0ZXJhdGlvbiAqLworICAgICAgIGx1YV9wb3AoTCwgMSk7CisgICAgIH0KKzwvcHJlPgorCis8cD4KK1doaWxlIHRyYXZlcnNpbmcgYSB0YWJsZSwKK2RvIG5vdCBjYWxsIDxhIGhyZWY9IiNsdWFfdG9sc3RyaW5nIj48Y29kZT5sdWFfdG9sc3RyaW5nPC9jb2RlPjwvYT4gZGlyZWN0bHkgb24gYSBrZXksCit1bmxlc3MgeW91IGtub3cgdGhhdCB0aGUga2V5IGlzIGFjdHVhbGx5IGEgc3RyaW5nLgorUmVjYWxsIHRoYXQgPGEgaHJlZj0iI2x1YV90b2xzdHJpbmciPjxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+PC9hPiBtYXkgY2hhbmdlCit0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4OwordGhpcyBjb25mdXNlcyB0aGUgbmV4dCBjYWxsIHRvIDxhIGhyZWY9IiNsdWFfbmV4dCI+PGNvZGU+bHVhX25leHQ8L2NvZGU+PC9hPi4KKworCis8cD4KK1NlZSBmdW5jdGlvbiA8YSBocmVmPSIjcGRmLW5leHQiPjxjb2RlPm5leHQ8L2NvZGU+PC9hPiBmb3IgdGhlIGNhdmVhdHMgb2YgbW9kaWZ5aW5nCit0aGUgdGFibGUgZHVyaW5nIGl0cyB0cmF2ZXJzYWwuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfTnVtYmVyIj48Y29kZT5sdWFfTnVtYmVyPC9jb2RlPjwvYT48L2gzPgorPHByZT50eXBlZGVmIGRvdWJsZSBsdWFfTnVtYmVyOzwvcHJlPgorCis8cD4KK1RoZSB0eXBlIG9mIG51bWJlcnMgaW4gTHVhLgorQnkgZGVmYXVsdCwgaXQgaXMgZG91YmxlLCBidXQgdGhhdCBjYW4gYmUgY2hhbmdlZCBpbiA8Y29kZT5sdWFjb25mLmg8L2NvZGU+LgorVGhyb3VnaCB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSB5b3UgY2FuIGNoYW5nZQorTHVhIHRvIG9wZXJhdGUgd2l0aCBhbm90aGVyIHR5cGUgZm9yIG51bWJlcnMgKGUuZy4sIGZsb2F0IG9yIGxvbmcpLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3BjYWxsIj48Y29kZT5sdWFfcGNhbGw8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0obmFyZ3MgKyAxKSwgKyhucmVzdWx0c3wxKSwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfcGNhbGwgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmdzLCBpbnQgbnJlc3VsdHMsIGludCBtc2doKTs8L3ByZT4KKworPHA+CitDYWxscyBhIGZ1bmN0aW9uIGluIHByb3RlY3RlZCBtb2RlLgorCisKKzxwPgorQm90aCA8Y29kZT5uYXJnczwvY29kZT4gYW5kIDxjb2RlPm5yZXN1bHRzPC9jb2RlPiBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMKK2luIDxhIGhyZWY9IiNsdWFfY2FsbCI+PGNvZGU+bHVhX2NhbGw8L2NvZGU+PC9hPi4KK0lmIHRoZXJlIGFyZSBubyBlcnJvcnMgZHVyaW5nIHRoZSBjYWxsLAorPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4gYmVoYXZlcyBleGFjdGx5IGxpa2UgPGEgaHJlZj0iI2x1YV9jYWxsIj48Y29kZT5sdWFfY2FsbDwvY29kZT48L2E+LgorSG93ZXZlciwgaWYgdGhlcmUgaXMgYW55IGVycm9yLAorPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4gY2F0Y2hlcyBpdCwKK3B1c2hlcyBhIHNpbmdsZSB2YWx1ZSBvbiB0aGUgc3RhY2sgKHRoZSBlcnJvciBtZXNzYWdlKSwKK2FuZCByZXR1cm5zIGFuIGVycm9yIGNvZGUuCitMaWtlIDxhIGhyZWY9IiNsdWFfY2FsbCI+PGNvZGU+bHVhX2NhbGw8L2NvZGU+PC9hPiwKKzxhIGhyZWY9IiNsdWFfcGNhbGwiPjxjb2RlPmx1YV9wY2FsbDwvY29kZT48L2E+IGFsd2F5cyByZW1vdmVzIHRoZSBmdW5jdGlvbgorYW5kIGl0cyBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2suCisKKworPHA+CitJZiA8Y29kZT5tc2doPC9jb2RlPiBpcyAwLAordGhlbiB0aGUgZXJyb3IgbWVzc2FnZSByZXR1cm5lZCBvbiB0aGUgc3RhY2sKK2lzIGV4YWN0bHkgdGhlIG9yaWdpbmFsIGVycm9yIG1lc3NhZ2UuCitPdGhlcndpc2UsIDxjb2RlPm1zZ2g8L2NvZGU+IGlzIHRoZSBzdGFjayBpbmRleCBvZiBhCis8ZW0+bWVzc2FnZSBoYW5kbGVyPC9lbT4uCisoSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoaXMgaW5kZXggY2Fubm90IGJlIGEgcHNldWRvLWluZGV4LikKK0luIGNhc2Ugb2YgcnVudGltZSBlcnJvcnMsCit0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGVycm9yIG1lc3NhZ2UKK2FuZCBpdHMgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIG1lc3NhZ2UKK3JldHVybmVkIG9uIHRoZSBzdGFjayBieSA8YSBocmVmPSIjbHVhX3BjYWxsIj48Y29kZT5sdWFfcGNhbGw8L2NvZGU+PC9hPi4KKworCis8cD4KK1R5cGljYWxseSwgdGhlIG1lc3NhZ2UgaGFuZGxlciBpcyB1c2VkIHRvIGFkZCBtb3JlIGRlYnVnCitpbmZvcm1hdGlvbiB0byB0aGUgZXJyb3IgbWVzc2FnZSwgc3VjaCBhcyBhIHN0YWNrIHRyYWNlYmFjay4KK1N1Y2ggaW5mb3JtYXRpb24gY2Fubm90IGJlIGdhdGhlcmVkIGFmdGVyIHRoZSByZXR1cm4gb2YgPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4sCitzaW5jZSBieSB0aGVuIHRoZSBzdGFjayBoYXMgdW53b3VuZC4KKworCis8cD4KK1RoZSA8YSBocmVmPSIjbHVhX3BjYWxsIj48Y29kZT5sdWFfcGNhbGw8L2NvZGU+PC9hPiBmdW5jdGlvbiByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzCisoZGVmaW5lZCBpbiA8Y29kZT5sdWEuaDwvY29kZT4pOgorCis8dWw+CisKKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX09LIj48Y29kZT5MVUFfT0s8L2NvZGU+PC9hPiAoMCk6IDwvYj4KK3N1Y2Nlc3MuPC9saT4KKworPGxpPjxiPjxhIG5hbWU9InBkZi1MVUFfRVJSUlVOIj48Y29kZT5MVUFfRVJSUlVOPC9jb2RlPjwvYT46IDwvYj4KK2EgcnVudGltZSBlcnJvci4KKzwvbGk+CisKKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX0VSUk1FTSI+PGNvZGU+TFVBX0VSUk1FTTwvY29kZT48L2E+OiA8L2I+CittZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KK0ZvciBzdWNoIGVycm9ycywgTHVhIGRvZXMgbm90IGNhbGwgdGhlIG1lc3NhZ2UgaGFuZGxlci4KKzwvbGk+CisKKzxsaT48Yj48YSBuYW1lPSJwZGYtTFVBX0VSUkVSUiI+PGNvZGU+TFVBX0VSUkVSUjwvY29kZT48L2E+OiA8L2I+CitlcnJvciB3aGlsZSBydW5uaW5nIHRoZSBtZXNzYWdlIGhhbmRsZXIuCis8L2xpPgorCis8bGk+PGI+PGEgbmFtZT0icGRmLUxVQV9FUlJHQ01NIj48Y29kZT5MVUFfRVJSR0NNTTwvY29kZT48L2E+OiA8L2I+CitlcnJvciB3aGlsZSBydW5uaW5nIGEgPGNvZGU+X19nYzwvY29kZT4gbWV0YW1ldGhvZC4KKyhUaGlzIGVycm9yIHR5cGljYWxseSBoYXMgbm8gcmVsYXRpb24gd2l0aCB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLgorSXQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4pCis8L2xpPgorCis8L3VsPgorCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wY2FsbGsiPjxjb2RlPmx1YV9wY2FsbGs8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0obmFyZ3MgKyAxKSwgKyhucmVzdWx0c3wxKSwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfcGNhbGxrIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgaW50IG5hcmdzLAorICAgICAgICAgICAgICAgIGludCBucmVzdWx0cywKKyAgICAgICAgICAgICAgICBpbnQgZXJyZnVuYywKKyAgICAgICAgICAgICAgICBpbnQgY3R4LAorICAgICAgICAgICAgICAgIGx1YV9DRnVuY3Rpb24gayk7PC9wcmU+CisKKzxwPgorVGhpcyBmdW5jdGlvbiBiZWhhdmVzIGV4YWN0bHkgbGlrZSA8YSBocmVmPSIjbHVhX3BjYWxsIj48Y29kZT5sdWFfcGNhbGw8L2NvZGU+PC9hPiwKK2J1dCBhbGxvd3MgdGhlIGNhbGxlZCBmdW5jdGlvbiB0byB5aWVsZCAoc2VlIDxhIGhyZWY9IiM0LjciPiZzZWN0OzQuNzwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3BvcCI+PGNvZGU+bHVhX3BvcDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLW4sICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcG9wIChsdWFfU3RhdGUgKkwsIGludCBuKTs8L3ByZT4KKworPHA+CitQb3BzIDxjb2RlPm48L2NvZGU+IGVsZW1lbnRzIGZyb20gdGhlIHN0YWNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2hib29sZWFuIj48Y29kZT5sdWFfcHVzaGJvb2xlYW48L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgJm5kYXNoO108L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3B1c2hib29sZWFuIChsdWFfU3RhdGUgKkwsIGludCBiKTs8L3ByZT4KKworPHA+CitQdXNoZXMgYSBib29sZWFuIHZhbHVlIHdpdGggdmFsdWUgPGNvZGU+YjwvY29kZT4gb250byB0aGUgc3RhY2suCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcHVzaGNjbG9zdXJlIj48Y29kZT5sdWFfcHVzaGNjbG9zdXJlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstbiwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9wdXNoY2Nsb3N1cmUgKGx1YV9TdGF0ZSAqTCwgbHVhX0NGdW5jdGlvbiBmbiwgaW50IG4pOzwvcHJlPgorCis8cD4KK1B1c2hlcyBhIG5ldyBDJm5ic3A7Y2xvc3VyZSBvbnRvIHRoZSBzdGFjay4KKworCis8cD4KK1doZW4gYSBDJm5ic3A7ZnVuY3Rpb24gaXMgY3JlYXRlZCwKK2l0IGlzIHBvc3NpYmxlIHRvIGFzc29jaWF0ZSBzb21lIHZhbHVlcyB3aXRoIGl0LAordGh1cyBjcmVhdGluZyBhIEMmbmJzcDtjbG9zdXJlIChzZWUgPGEgaHJlZj0iIzQuNCI+JnNlY3Q7NC40PC9hPik7Cit0aGVzZSB2YWx1ZXMgYXJlIHRoZW4gYWNjZXNzaWJsZSB0byB0aGUgZnVuY3Rpb24gd2hlbmV2ZXIgaXQgaXMgY2FsbGVkLgorVG8gYXNzb2NpYXRlIHZhbHVlcyB3aXRoIGEgQyZuYnNwO2Z1bmN0aW9uLAorZmlyc3QgdGhlc2UgdmFsdWVzIHNob3VsZCBiZSBwdXNoZWQgb250byB0aGUgc3RhY2sKKyh3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB2YWx1ZXMsIHRoZSBmaXJzdCB2YWx1ZSBpcyBwdXNoZWQgZmlyc3QpLgorVGhlbiA8YSBocmVmPSIjbHVhX3B1c2hjY2xvc3VyZSI+PGNvZGU+bHVhX3B1c2hjY2xvc3VyZTwvY29kZT48L2E+CitpcyBjYWxsZWQgdG8gY3JlYXRlIGFuZCBwdXNoIHRoZSBDJm5ic3A7ZnVuY3Rpb24gb250byB0aGUgc3RhY2ssCit3aXRoIHRoZSBhcmd1bWVudCA8Y29kZT5uPC9jb2RlPiB0ZWxsaW5nIGhvdyBtYW55IHZhbHVlcyBzaG91bGQgYmUKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24uCis8YSBocmVmPSIjbHVhX3B1c2hjY2xvc3VyZSI+PGNvZGU+bHVhX3B1c2hjY2xvc3VyZTwvY29kZT48L2E+IGFsc28gcG9wcyB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgc3RhY2suCisKKworPHA+CitUaGUgbWF4aW11bSB2YWx1ZSBmb3IgPGNvZGU+bjwvY29kZT4gaXMgMjU1LgorCisKKzxwPgorV2hlbiA8Y29kZT5uPC9jb2RlPiBpcyB6ZXJvLAordGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgPGVtPmxpZ2h0IEMgZnVuY3Rpb248L2VtPiwKK3doaWNoIGlzIGp1c3QgYSBwb2ludGVyIHRvIHRoZSBDJm5ic3A7ZnVuY3Rpb24uCitJbiB0aGF0IGNhc2UsIGl0IG5ldmVyIHRocm93cyBhIG1lbW9yeSBlcnJvci4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNoY2Z1bmN0aW9uIj48Y29kZT5sdWFfcHVzaGNmdW5jdGlvbjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcHVzaGNmdW5jdGlvbiAobHVhX1N0YXRlICpMLCBsdWFfQ0Z1bmN0aW9uIGYpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBhIEMmbmJzcDtmdW5jdGlvbiBvbnRvIHRoZSBzdGFjay4KK1RoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgYSBwb2ludGVyIHRvIGEgQyBmdW5jdGlvbgorYW5kIHB1c2hlcyBvbnRvIHRoZSBzdGFjayBhIEx1YSB2YWx1ZSBvZiB0eXBlIDxjb2RlPmZ1bmN0aW9uPC9jb2RlPiB0aGF0LAord2hlbiBjYWxsZWQsIGludm9rZXMgdGhlIGNvcnJlc3BvbmRpbmcgQyZuYnNwO2Z1bmN0aW9uLgorCisKKzxwPgorQW55IGZ1bmN0aW9uIHRvIGJlIHJlZ2lzdGVyZWQgaW4gTHVhIG11c3QKK2ZvbGxvdyB0aGUgY29ycmVjdCBwcm90b2NvbCB0byByZWNlaXZlIGl0cyBwYXJhbWV0ZXJzCithbmQgcmV0dXJuIGl0cyByZXN1bHRzIChzZWUgPGEgaHJlZj0iI2x1YV9DRnVuY3Rpb24iPjxjb2RlPmx1YV9DRnVuY3Rpb248L2NvZGU+PC9hPikuCisKKworPHA+Cis8Y29kZT5sdWFfcHVzaGNmdW5jdGlvbjwvY29kZT4gaXMgZGVmaW5lZCBhcyBhIG1hY3JvOgorCis8cHJlPgorICAgICAjZGVmaW5lIGx1YV9wdXNoY2Z1bmN0aW9uKEwsZikgIGx1YV9wdXNoY2Nsb3N1cmUoTCxmLDApCis8L3ByZT48cD4KK05vdGUgdGhhdCA8Y29kZT5mPC9jb2RlPiBpcyB1c2VkIHR3aWNlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2hmc3RyaW5nIj48Y29kZT5sdWFfcHVzaGZzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV9wdXNoZnN0cmluZyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmbXQsIC4uLik7PC9wcmU+CisKKzxwPgorUHVzaGVzIG9udG8gdGhlIHN0YWNrIGEgZm9ybWF0dGVkIHN0cmluZworYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoaXMgc3RyaW5nLgorSXQgaXMgc2ltaWxhciB0byB0aGUgQU5TSSZuYnNwO0MgZnVuY3Rpb24gPGNvZGU+c3ByaW50ZjwvY29kZT4sCitidXQgaGFzIHNvbWUgaW1wb3J0YW50IGRpZmZlcmVuY2VzOgorCis8dWw+CisKKzxsaT4KK1lvdSBkbyBub3QgaGF2ZSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJlc3VsdDoKK3RoZSByZXN1bHQgaXMgYSBMdWEgc3RyaW5nIGFuZCBMdWEgdGFrZXMgY2FyZSBvZiBtZW1vcnkgYWxsb2NhdGlvbgorKGFuZCBkZWFsbG9jYXRpb24sIHRocm91Z2ggZ2FyYmFnZSBjb2xsZWN0aW9uKS4KKzwvbGk+CisKKzxsaT4KK1RoZSBjb252ZXJzaW9uIHNwZWNpZmllcnMgYXJlIHF1aXRlIHJlc3RyaWN0ZWQuCitUaGVyZSBhcmUgbm8gZmxhZ3MsIHdpZHRocywgb3IgcHJlY2lzaW9ucy4KK1RoZSBjb252ZXJzaW9uIHNwZWNpZmllcnMgY2FuIG9ubHkgYmUKKyc8Y29kZT4lJTwvY29kZT4nIChpbnNlcnRzIGEgJzxjb2RlPiU8L2NvZGU+JyBpbiB0aGUgc3RyaW5nKSwKKyc8Y29kZT4lczwvY29kZT4nIChpbnNlcnRzIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZywgd2l0aCBubyBzaXplIHJlc3RyaWN0aW9ucyksCisnPGNvZGU+JWY8L2NvZGU+JyAoaW5zZXJ0cyBhIDxhIGhyZWY9IiNsdWFfTnVtYmVyIj48Y29kZT5sdWFfTnVtYmVyPC9jb2RlPjwvYT4pLAorJzxjb2RlPiVwPC9jb2RlPicgKGluc2VydHMgYSBwb2ludGVyIGFzIGEgaGV4YWRlY2ltYWwgbnVtZXJhbCksCisnPGNvZGU+JWQ8L2NvZGU+JyAoaW5zZXJ0cyBhbiA8Y29kZT5pbnQ8L2NvZGU+KSwgYW5kCisnPGNvZGU+JWM8L2NvZGU+JyAoaW5zZXJ0cyBhbiA8Y29kZT5pbnQ8L2NvZGU+IGFzIGEgYnl0ZSkuCis8L2xpPgorCis8L3VsPgorCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNoZ2xvYmFsdGFibGUiPjxjb2RlPmx1YV9wdXNoZ2xvYmFsdGFibGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgJm5kYXNoO108L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3B1c2hnbG9iYWx0YWJsZSAobHVhX1N0YXRlICpMKTs8L3ByZT4KKworPHA+CitQdXNoZXMgdGhlIGdsb2JhbCBlbnZpcm9ubWVudCBvbnRvIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNoaW50ZWdlciI+PGNvZGU+bHVhX3B1c2hpbnRlZ2VyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YV9wdXNoaW50ZWdlciAobHVhX1N0YXRlICpMLCBsdWFfSW50ZWdlciBuKTs8L3ByZT4KKworPHA+CitQdXNoZXMgYSBudW1iZXIgd2l0aCB2YWx1ZSA8Y29kZT5uPC9jb2RlPiBvbnRvIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNobGlnaHR1c2VyZGF0YSI+PGNvZGU+bHVhX3B1c2hsaWdodHVzZXJkYXRhPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YV9wdXNobGlnaHR1c2VyZGF0YSAobHVhX1N0YXRlICpMLCB2b2lkICpwKTs8L3ByZT4KKworPHA+CitQdXNoZXMgYSBsaWdodCB1c2VyZGF0YSBvbnRvIHRoZSBzdGFjay4KKworCis8cD4KK1VzZXJkYXRhIHJlcHJlc2VudCBDJm5ic3A7dmFsdWVzIGluIEx1YS4KK0EgPGVtPmxpZ2h0IHVzZXJkYXRhPC9lbT4gcmVwcmVzZW50cyBhIHBvaW50ZXIsIGEgPGNvZGU+dm9pZCo8L2NvZGU+LgorSXQgaXMgYSB2YWx1ZSAobGlrZSBhIG51bWJlcik6Cit5b3UgZG8gbm90IGNyZWF0ZSBpdCwgaXQgaGFzIG5vIGluZGl2aWR1YWwgbWV0YXRhYmxlLAorYW5kIGl0IGlzIG5vdCBjb2xsZWN0ZWQgKGFzIGl0IHdhcyBuZXZlciBjcmVhdGVkKS4KK0EgbGlnaHQgdXNlcmRhdGEgaXMgZXF1YWwgdG8gImFueSIKK2xpZ2h0IHVzZXJkYXRhIHdpdGggdGhlIHNhbWUgQyZuYnNwO2FkZHJlc3MuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcHVzaGxpdGVyYWwiPjxjb2RlPmx1YV9wdXNobGl0ZXJhbDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhX3B1c2hsaXRlcmFsIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMpOzwvcHJlPgorCis8cD4KK1RoaXMgbWFjcm8gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjbHVhX3B1c2hsc3RyaW5nIj48Y29kZT5sdWFfcHVzaGxzdHJpbmc8L2NvZGU+PC9hPiwKK2J1dCBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gPGNvZGU+czwvY29kZT4gaXMgYSBsaXRlcmFsIHN0cmluZy4KK0l0IGF1dG9tYXRpY2FsbHkgcHJvdmlkZXMgdGhlIHN0cmluZyBsZW5ndGguCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcHVzaGxzdHJpbmciPjxjb2RlPmx1YV9wdXNobHN0cmluZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhX3B1c2hsc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pOzwvcHJlPgorCis8cD4KK1B1c2hlcyB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgPGNvZGU+czwvY29kZT4gd2l0aCBzaXplIDxjb2RlPmxlbjwvY29kZT4KK29udG8gdGhlIHN0YWNrLgorTHVhIG1ha2VzIChvciByZXVzZXMpIGFuIGludGVybmFsIGNvcHkgb2YgdGhlIGdpdmVuIHN0cmluZywKK3NvIHRoZSBtZW1vcnkgYXQgPGNvZGU+czwvY29kZT4gY2FuIGJlIGZyZWVkIG9yIHJldXNlZCBpbW1lZGlhdGVseSBhZnRlcgordGhlIGZ1bmN0aW9uIHJldHVybnMuCitUaGUgc3RyaW5nIGNhbiBjb250YWluIGFueSBiaW5hcnkgZGF0YSwKK2luY2x1ZGluZyBlbWJlZGRlZCB6ZXJvcy4KKworCis8cD4KK1JldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBjb3B5IG9mIHRoZSBzdHJpbmcuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcHVzaG5pbCI+PGNvZGU+bHVhX3B1c2huaWw8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgJm5kYXNoO108L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3B1c2huaWwgKGx1YV9TdGF0ZSAqTCk7PC9wcmU+CisKKzxwPgorUHVzaGVzIGEgbmlsIHZhbHVlIG9udG8gdGhlIHN0YWNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2hudW1iZXIiPjxjb2RlPmx1YV9wdXNobnVtYmVyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YV9wdXNobnVtYmVyIChsdWFfU3RhdGUgKkwsIGx1YV9OdW1iZXIgbik7PC9wcmU+CisKKzxwPgorUHVzaGVzIGEgbnVtYmVyIHdpdGggdmFsdWUgPGNvZGU+bjwvY29kZT4gb250byB0aGUgc3RhY2suCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcHVzaHN0cmluZyI+PGNvZGU+bHVhX3B1c2hzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV9wdXNoc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMpOzwvcHJlPgorCis8cD4KK1B1c2hlcyB0aGUgemVyby10ZXJtaW5hdGVkIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxjb2RlPnM8L2NvZGU+CitvbnRvIHRoZSBzdGFjay4KK0x1YSBtYWtlcyAob3IgcmV1c2VzKSBhbiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBnaXZlbiBzdHJpbmcsCitzbyB0aGUgbWVtb3J5IGF0IDxjb2RlPnM8L2NvZGU+IGNhbiBiZSBmcmVlZCBvciByZXVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKK3RoZSBmdW5jdGlvbiByZXR1cm5zLgorCisKKzxwPgorUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIGNvcHkgb2YgdGhlIHN0cmluZy4KKworCis8cD4KK0lmIDxjb2RlPnM8L2NvZGU+IGlzIDxjb2RlPk5VTEw8L2NvZGU+LCBwdXNoZXMgPGI+bmlsPC9iPiBhbmQgcmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9wdXNodGhyZWFkIj48Y29kZT5sdWFfcHVzaHRocmVhZDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9wdXNodGhyZWFkIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK1B1c2hlcyB0aGUgdGhyZWFkIHJlcHJlc2VudGVkIGJ5IDxjb2RlPkw8L2NvZGU+IG9udG8gdGhlIHN0YWNrLgorUmV0dXJucyAxIGlmIHRoaXMgdGhyZWFkIGlzIHRoZSBtYWluIHRocmVhZCBvZiBpdHMgc3RhdGUuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcHVzaHVuc2lnbmVkIj48Y29kZT5sdWFfcHVzaHVuc2lnbmVkPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YV9wdXNodW5zaWduZWQgKGx1YV9TdGF0ZSAqTCwgbHVhX1Vuc2lnbmVkIG4pOzwvcHJlPgorCis8cD4KK1B1c2hlcyBhIG51bWJlciB3aXRoIHZhbHVlIDxjb2RlPm48L2NvZGU+IG9udG8gdGhlIHN0YWNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2h2YWx1ZSI+PGNvZGU+bHVhX3B1c2h2YWx1ZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcHVzaHZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUHVzaGVzIGEgY29weSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXgKK29udG8gdGhlIHN0YWNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3B1c2h2ZnN0cmluZyI+PGNvZGU+bHVhX3B1c2h2ZnN0cmluZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhX3B1c2h2ZnN0cmluZyAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdwKTs8L3ByZT4KKworPHA+CitFcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNsdWFfcHVzaGZzdHJpbmciPjxjb2RlPmx1YV9wdXNoZnN0cmluZzwvY29kZT48L2E+LCBleGNlcHQgdGhhdCBpdCByZWNlaXZlcyBhIDxjb2RlPnZhX2xpc3Q8L2NvZGU+CitpbnN0ZWFkIG9mIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9yYXdlcXVhbCI+PGNvZGU+bHVhX3Jhd2VxdWFsPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX3Jhd2VxdWFsIChsdWFfU3RhdGUgKkwsIGludCBpbmRleDEsIGludCBpbmRleDIpOzwvcHJlPgorCis8cD4KK1JldHVybnMgMSBpZiB0aGUgdHdvIHZhbHVlcyBpbiBpbmRpY2VzIDxjb2RlPmluZGV4MTwvY29kZT4gYW5kCis8Y29kZT5pbmRleDI8L2NvZGU+IGFyZSBwcmltaXRpdmVseSBlcXVhbAorKHRoYXQgaXMsIHdpdGhvdXQgY2FsbGluZyBtZXRhbWV0aG9kcykuCitPdGhlcndpc2UgcmV0dXJucyZuYnNwOzAuCitBbHNvIHJldHVybnMmbmJzcDswIGlmIGFueSBvZiB0aGUgaW5kaWNlcyBhcmUgbm9uIHZhbGlkLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3Jhd2dldCI+PGNvZGU+bHVhX3Jhd2dldDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTEsICsxLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcmF3Z2V0IChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorU2ltaWxhciB0byA8YSBocmVmPSIjbHVhX2dldHRhYmxlIj48Y29kZT5sdWFfZ2V0dGFibGU8L2NvZGU+PC9hPiwgYnV0IGRvZXMgYSByYXcgYWNjZXNzCisoaS5lLiwgd2l0aG91dCBtZXRhbWV0aG9kcykuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcmF3Z2V0aSI+PGNvZGU+bHVhX3Jhd2dldGk8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgJm5kYXNoO108L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3Jhd2dldGkgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBpbnQgbik7PC9wcmU+CisKKzxwPgorUHVzaGVzIG9udG8gdGhlIHN0YWNrIHRoZSB2YWx1ZSA8Y29kZT50W25dPC9jb2RlPiwKK3doZXJlIDxjb2RlPnQ8L2NvZGU+IGlzIHRoZSB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCitUaGUgYWNjZXNzIGlzIHJhdzsKK3RoYXQgaXMsIGl0IGRvZXMgbm90IGludm9rZSBtZXRhbWV0aG9kcy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9yYXdnZXRwIj48Y29kZT5sdWFfcmF3Z2V0cDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcmF3Z2V0cCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGNvbnN0IHZvaWQgKnApOzwvcHJlPgorCis8cD4KK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgdmFsdWUgPGNvZGU+dFtrXTwvY29kZT4sCit3aGVyZSA8Y29kZT50PC9jb2RlPiBpcyB0aGUgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4IGFuZAorPGNvZGU+azwvY29kZT4gaXMgdGhlIHBvaW50ZXIgPGNvZGU+cDwvY29kZT4gcmVwcmVzZW50ZWQgYXMgYSBsaWdodCB1c2VyZGF0YS4KK1RoZSBhY2Nlc3MgaXMgcmF3OwordGhhdCBpcywgaXQgZG9lcyBub3QgaW52b2tlIG1ldGFtZXRob2RzLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3Jhd2xlbiI+PGNvZGU+bHVhX3Jhd2xlbjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+c2l6ZV90IGx1YV9yYXdsZW4gKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIHRoZSByYXcgImxlbmd0aCIgb2YgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleDoKK2ZvciBzdHJpbmdzLCB0aGlzIGlzIHRoZSBzdHJpbmcgbGVuZ3RoOworZm9yIHRhYmxlcywgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIHRoZSBsZW5ndGggb3BlcmF0b3IgKCc8Y29kZT4jPC9jb2RlPicpCit3aXRoIG5vIG1ldGFtZXRob2RzOworZm9yIHVzZXJkYXRhLCB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZSBibG9jayBvZiBtZW1vcnkgYWxsb2NhdGVkCitmb3IgdGhlIHVzZXJkYXRhOworZm9yIG90aGVyIHZhbHVlcywgaXQgaXMmbmJzcDswLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3Jhd3NldCI+PGNvZGU+bHVhX3Jhd3NldDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTIsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfcmF3c2V0IChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorU2ltaWxhciB0byA8YSBocmVmPSIjbHVhX3NldHRhYmxlIj48Y29kZT5sdWFfc2V0dGFibGU8L2NvZGU+PC9hPiwgYnV0IGRvZXMgYSByYXcgYXNzaWdubWVudAorKGkuZS4sIHdpdGhvdXQgbWV0YW1ldGhvZHMpLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3Jhd3NldGkiPjxjb2RlPmx1YV9yYXdzZXRpPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMSwgKzAsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9yYXdzZXRpIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgaW50IG4pOzwvcHJlPgorCis8cD4KK0RvZXMgdGhlIGVxdWl2YWxlbnQgb2YgPGNvZGU+dFtuXSA9IHY8L2NvZGU+LAord2hlcmUgPGNvZGU+dDwvY29kZT4gaXMgdGhlIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleAorYW5kIDxjb2RlPnY8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcG9wcyB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2suCitUaGUgYXNzaWdubWVudCBpcyByYXc7Cit0aGF0IGlzLCBpdCBkb2VzIG5vdCBpbnZva2UgbWV0YW1ldGhvZHMuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcmF3c2V0cCI+PGNvZGU+bHVhX3Jhd3NldHA8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMCwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3Jhd3NldHAgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBjb25zdCB2b2lkICpwKTs8L3ByZT4KKworPHA+CitEb2VzIHRoZSBlcXVpdmFsZW50IG9mIDxjb2RlPnRba10gPSB2PC9jb2RlPiwKK3doZXJlIDxjb2RlPnQ8L2NvZGU+IGlzIHRoZSB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsCis8Y29kZT5rPC9jb2RlPiBpcyB0aGUgcG9pbnRlciA8Y29kZT5wPC9jb2RlPiByZXByZXNlbnRlZCBhcyBhIGxpZ2h0IHVzZXJkYXRhLAorYW5kIDxjb2RlPnY8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcG9wcyB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2suCitUaGUgYXNzaWdubWVudCBpcyByYXc7Cit0aGF0IGlzLCBpdCBkb2VzIG5vdCBpbnZva2UgbWV0YW1ldGhvZHMuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfUmVhZGVyIj48Y29kZT5sdWFfUmVhZGVyPC9jb2RlPjwvYT48L2gzPgorPHByZT50eXBlZGVmIGNvbnN0IGNoYXIgKiAoKmx1YV9SZWFkZXIpIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzaXplKTs8L3ByZT4KKworPHA+CitUaGUgcmVhZGVyIGZ1bmN0aW9uIHVzZWQgYnkgPGEgaHJlZj0iI2x1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+LgorRXZlcnkgdGltZSBpdCBuZWVkcyBhbm90aGVyIHBpZWNlIG9mIHRoZSBjaHVuaywKKzxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPiBjYWxscyB0aGUgcmVhZGVyLAorcGFzc2luZyBhbG9uZyBpdHMgPGNvZGU+ZGF0YTwvY29kZT4gcGFyYW1ldGVyLgorVGhlIHJlYWRlciBtdXN0IHJldHVybiBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnkKK3dpdGggYSBuZXcgcGllY2Ugb2YgdGhlIGNodW5rCithbmQgc2V0IDxjb2RlPnNpemU8L2NvZGU+IHRvIHRoZSBibG9jayBzaXplLgorVGhlIGJsb2NrIG11c3QgZXhpc3QgdW50aWwgdGhlIHJlYWRlciBmdW5jdGlvbiBpcyBjYWxsZWQgYWdhaW4uCitUbyBzaWduYWwgdGhlIGVuZCBvZiB0aGUgY2h1bmssCit0aGUgcmVhZGVyIG11c3QgcmV0dXJuIDxjb2RlPk5VTEw8L2NvZGU+IG9yIHNldCA8Y29kZT5zaXplPC9jb2RlPiB0byB6ZXJvLgorVGhlIHJlYWRlciBmdW5jdGlvbiBtYXkgcmV0dXJuIHBpZWNlcyBvZiBhbnkgc2l6ZSBncmVhdGVyIHRoYW4gemVyby4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9yZWdpc3RlciI+PGNvZGU+bHVhX3JlZ2lzdGVyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9yZWdpc3RlciAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpuYW1lLCBsdWFfQ0Z1bmN0aW9uIGYpOzwvcHJlPgorCis8cD4KK1NldHMgdGhlIEMgZnVuY3Rpb24gPGNvZGU+ZjwvY29kZT4gYXMgdGhlIG5ldyB2YWx1ZSBvZiBnbG9iYWwgPGNvZGU+bmFtZTwvY29kZT4uCitJdCBpcyBkZWZpbmVkIGFzIGEgbWFjcm86CisKKzxwcmU+CisgICAgICNkZWZpbmUgbHVhX3JlZ2lzdGVyKEwsbixmKSBcCisgICAgICAgICAgICAobHVhX3B1c2hjZnVuY3Rpb24oTCwgZiksIGx1YV9zZXRnbG9iYWwoTCwgbikpCis8L3ByZT4KKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcmVtb3ZlIj48Y29kZT5sdWFfcmVtb3ZlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMSwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YV9yZW1vdmUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZW1vdmVzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiB2YWxpZCBpbmRleCwKK3NoaWZ0aW5nIGRvd24gdGhlIGVsZW1lbnRzIGFib3ZlIHRoaXMgaW5kZXggdG8gZmlsbCB0aGUgZ2FwLgorVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYSBwc2V1ZG8taW5kZXgsCitiZWNhdXNlIGEgcHNldWRvLWluZGV4IGlzIG5vdCBhbiBhY3R1YWwgc3RhY2sgcG9zaXRpb24uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcmVwbGFjZSI+PGNvZGU+bHVhX3JlcGxhY2U8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3JlcGxhY2UgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitNb3ZlcyB0aGUgdG9wIGVsZW1lbnQgaW50byB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgKK3dpdGhvdXQgc2hpZnRpbmcgYW55IGVsZW1lbnQKKyh0aGVyZWZvcmUgcmVwbGFjaW5nIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgpLAorYW5kIHRoZW4gcG9wcyB0aGUgdG9wIGVsZW1lbnQuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfcmVzdW1lIj48Y29kZT5sdWFfcmVzdW1lPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstPywgKz8sICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX3Jlc3VtZSAobHVhX1N0YXRlICpMLCBsdWFfU3RhdGUgKmZyb20sIGludCBuYXJncyk7PC9wcmU+CisKKzxwPgorU3RhcnRzIGFuZCByZXN1bWVzIGEgY29yb3V0aW5lIGluIGEgZ2l2ZW4gdGhyZWFkLgorCisKKzxwPgorVG8gc3RhcnQgYSBjb3JvdXRpbmUsCit5b3UgcHVzaCBvbnRvIHRoZSB0aHJlYWQgc3RhY2sgdGhlIG1haW4gZnVuY3Rpb24gcGx1cyBhbnkgYXJndW1lbnRzOwordGhlbiB5b3UgY2FsbCA8YSBocmVmPSIjbHVhX3Jlc3VtZSI+PGNvZGU+bHVhX3Jlc3VtZTwvY29kZT48L2E+LAord2l0aCA8Y29kZT5uYXJnczwvY29kZT4gYmVpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCitUaGlzIGNhbGwgcmV0dXJucyB3aGVuIHRoZSBjb3JvdXRpbmUgc3VzcGVuZHMgb3IgZmluaXNoZXMgaXRzIGV4ZWN1dGlvbi4KK1doZW4gaXQgcmV0dXJucywgdGhlIHN0YWNrIGNvbnRhaW5zIGFsbCB2YWx1ZXMgcGFzc2VkIHRvIDxhIGhyZWY9IiNsdWFfeWllbGQiPjxjb2RlPmx1YV95aWVsZDwvY29kZT48L2E+LAorb3IgYWxsIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgYm9keSBmdW5jdGlvbi4KKzxhIGhyZWY9IiNsdWFfcmVzdW1lIj48Y29kZT5sdWFfcmVzdW1lPC9jb2RlPjwvYT4gcmV0dXJucworPGEgaHJlZj0iI3BkZi1MVUFfWUlFTEQiPjxjb2RlPkxVQV9ZSUVMRDwvY29kZT48L2E+IGlmIHRoZSBjb3JvdXRpbmUgeWllbGRzLAorPGEgaHJlZj0iI3BkZi1MVUFfT0siPjxjb2RlPkxVQV9PSzwvY29kZT48L2E+IGlmIHRoZSBjb3JvdXRpbmUgZmluaXNoZXMgaXRzIGV4ZWN1dGlvbgord2l0aG91dCBlcnJvcnMsCitvciBhbiBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZXJyb3JzIChzZWUgPGEgaHJlZj0iI2x1YV9wY2FsbCI+PGNvZGU+bHVhX3BjYWxsPC9jb2RlPjwvYT4pLgorCisKKzxwPgorSW4gY2FzZSBvZiBlcnJvcnMsCit0aGUgc3RhY2sgaXMgbm90IHVud291bmQsCitzbyB5b3UgY2FuIHVzZSB0aGUgZGVidWcgQVBJIG92ZXIgaXQuCitUaGUgZXJyb3IgbWVzc2FnZSBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworCis8cD4KK1RvIHJlc3VtZSBhIGNvcm91dGluZSwKK3lvdSByZW1vdmUgYW55IHJlc3VsdHMgZnJvbSB0aGUgbGFzdCA8YSBocmVmPSIjbHVhX3lpZWxkIj48Y29kZT5sdWFfeWllbGQ8L2NvZGU+PC9hPiwKK3B1dCBvbiBpdHMgc3RhY2sgb25seSB0aGUgdmFsdWVzIHRvCitiZSBwYXNzZWQgYXMgcmVzdWx0cyBmcm9tIDxjb2RlPnlpZWxkPC9jb2RlPiwKK2FuZCB0aGVuIGNhbGwgPGEgaHJlZj0iI2x1YV9yZXN1bWUiPjxjb2RlPmx1YV9yZXN1bWU8L2NvZGU+PC9hPi4KKworCis8cD4KK1RoZSBwYXJhbWV0ZXIgPGNvZGU+ZnJvbTwvY29kZT4gcmVwcmVzZW50cyB0aGUgY29yb3V0aW5lIHRoYXQgaXMgcmVzdW1pbmcgPGNvZGU+TDwvY29kZT4uCitJZiB0aGVyZSBpcyBubyBzdWNoIGNvcm91dGluZSwKK3RoaXMgcGFyYW1ldGVyIGNhbiBiZSA8Y29kZT5OVUxMPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9zZXRhbGxvY2YiPjxjb2RlPmx1YV9zZXRhbGxvY2Y8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3NldGFsbG9jZiAobHVhX1N0YXRlICpMLCBsdWFfQWxsb2MgZiwgdm9pZCAqdWQpOzwvcHJlPgorCis8cD4KK0NoYW5nZXMgdGhlIGFsbG9jYXRvciBmdW5jdGlvbiBvZiBhIGdpdmVuIHN0YXRlIHRvIDxjb2RlPmY8L2NvZGU+Cit3aXRoIHVzZXIgZGF0YSA8Y29kZT51ZDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0ZmllbGQiPjxjb2RlPmx1YV9zZXRmaWVsZDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTEsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfc2V0ZmllbGQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBjb25zdCBjaGFyICprKTs8L3ByZT4KKworPHA+CitEb2VzIHRoZSBlcXVpdmFsZW50IHRvIDxjb2RlPnRba10gPSB2PC9jb2RlPiwKK3doZXJlIDxjb2RlPnQ8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKK2FuZCA8Y29kZT52PC9jb2RlPiBpcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHBvcHMgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrLgorQXMgaW4gTHVhLCB0aGlzIGZ1bmN0aW9uIG1heSB0cmlnZ2VyIGEgbWV0YW1ldGhvZAorZm9yIHRoZSAibmV3aW5kZXgiIGV2ZW50IChzZWUgPGEgaHJlZj0iIzIuNCI+JnNlY3Q7Mi40PC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0Z2xvYmFsIj48Y29kZT5sdWFfc2V0Z2xvYmFsPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMSwgKzAsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YV9zZXRnbG9iYWwgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbmFtZSk7PC9wcmU+CisKKzxwPgorUG9wcyBhIHZhbHVlIGZyb20gdGhlIHN0YWNrIGFuZAorc2V0cyBpdCBhcyB0aGUgbmV3IHZhbHVlIG9mIGdsb2JhbCA8Y29kZT5uYW1lPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9zZXRtZXRhdGFibGUiPjxjb2RlPmx1YV9zZXRtZXRhdGFibGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3NldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1BvcHMgYSB0YWJsZSBmcm9tIHRoZSBzdGFjayBhbmQKK3NldHMgaXQgYXMgdGhlIG5ldyBtZXRhdGFibGUgZm9yIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0dGFibGUiPjxjb2RlPmx1YV9zZXR0YWJsZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTIsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfc2V0dGFibGUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitEb2VzIHRoZSBlcXVpdmFsZW50IHRvIDxjb2RlPnRba10gPSB2PC9jb2RlPiwKK3doZXJlIDxjb2RlPnQ8L2NvZGU+IGlzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsCis8Y29kZT52PC9jb2RlPiBpcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2ssCithbmQgPGNvZGU+azwvY29kZT4gaXMgdGhlIHZhbHVlIGp1c3QgYmVsb3cgdGhlIHRvcC4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcG9wcyBib3RoIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjay4KK0FzIGluIEx1YSwgdGhpcyBmdW5jdGlvbiBtYXkgdHJpZ2dlciBhIG1ldGFtZXRob2QKK2ZvciB0aGUgIm5ld2luZGV4IiBldmVudCAoc2VlIDxhIGhyZWY9IiMyLjQiPiZzZWN0OzIuNDwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3NldHRvcCI+PGNvZGU+bHVhX3NldHRvcDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLT8sICs/LCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfc2V0dG9wIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorQWNjZXB0cyBhbnkgaW5kZXgsIG9yJm5ic3A7MCwKK2FuZCBzZXRzIHRoZSBzdGFjayB0b3AgdG8gdGhpcyBpbmRleC4KK0lmIHRoZSBuZXcgdG9wIGlzIGxhcmdlciB0aGFuIHRoZSBvbGQgb25lLAordGhlbiB0aGUgbmV3IGVsZW1lbnRzIGFyZSBmaWxsZWQgd2l0aCA8Yj5uaWw8L2I+LgorSWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzJm5ic3A7MCwgdGhlbiBhbGwgc3RhY2sgZWxlbWVudHMgYXJlIHJlbW92ZWQuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0dXNlcnZhbHVlIj48Y29kZT5sdWFfc2V0dXNlcnZhbHVlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMSwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YV9zZXR1c2VydmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitQb3BzIGEgdGFibGUgb3IgPGI+bmlsPC9iPiBmcm9tIHRoZSBzdGFjayBhbmQgc2V0cyBpdCBhcwordGhlIG5ldyB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoZSB1c2VyZGF0YSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfU3RhdGUiPjxjb2RlPmx1YV9TdGF0ZTwvY29kZT48L2E+PC9oMz4KKzxwcmU+dHlwZWRlZiBzdHJ1Y3QgbHVhX1N0YXRlIGx1YV9TdGF0ZTs8L3ByZT4KKworPHA+CitBbiBvcGFxdWUgc3RydWN0dXJlIHRoYXQgcG9pbnRzIHRvIGEgdGhyZWFkIGFuZCBpbmRpcmVjdGx5CisodGhyb3VnaCB0aGUgdGhyZWFkKSB0byB0aGUgd2hvbGUgc3RhdGUgb2YgYSBMdWEgaW50ZXJwcmV0ZXIuCitUaGUgTHVhIGxpYnJhcnkgaXMgZnVsbHkgcmVlbnRyYW50OgoraXQgaGFzIG5vIGdsb2JhbCB2YXJpYWJsZXMuCitBbGwgaW5mb3JtYXRpb24gYWJvdXQgYSBzdGF0ZSBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggdGhpcyBzdHJ1Y3R1cmUuCisKKworPHA+CitBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvCitldmVyeSBmdW5jdGlvbiBpbiB0aGUgbGlicmFyeSwgZXhjZXB0IHRvIDxhIGhyZWY9IiNsdWFfbmV3c3RhdGUiPjxjb2RlPmx1YV9uZXdzdGF0ZTwvY29kZT48L2E+LAord2hpY2ggY3JlYXRlcyBhIEx1YSBzdGF0ZSBmcm9tIHNjcmF0Y2guCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc3RhdHVzIj48Y29kZT5sdWFfc3RhdHVzPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX3N0YXR1cyAobHVhX1N0YXRlICpMKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIHRocmVhZCA8Y29kZT5MPC9jb2RlPi4KKworCis8cD4KK1RoZSBzdGF0dXMgY2FuIGJlIDAgKDxhIGhyZWY9IiNwZGYtTFVBX09LIj48Y29kZT5MVUFfT0s8L2NvZGU+PC9hPikgZm9yIGEgbm9ybWFsIHRocmVhZCwKK2FuIGVycm9yIGNvZGUgaWYgdGhlIHRocmVhZCBmaW5pc2hlZCB0aGUgZXhlY3V0aW9uCitvZiBhIDxhIGhyZWY9IiNsdWFfcmVzdW1lIj48Y29kZT5sdWFfcmVzdW1lPC9jb2RlPjwvYT4gd2l0aCBhbiBlcnJvciwKK29yIDxhIG5hbWU9InBkZi1MVUFfWUlFTEQiPjxjb2RlPkxVQV9ZSUVMRDwvY29kZT48L2E+IGlmIHRoZSB0aHJlYWQgaXMgc3VzcGVuZGVkLgorCisKKzxwPgorWW91IGNhbiBvbmx5IGNhbGwgZnVuY3Rpb25zIGluIHRocmVhZHMgd2l0aCBzdGF0dXMgPGEgaHJlZj0iI3BkZi1MVUFfT0siPjxjb2RlPkxVQV9PSzwvY29kZT48L2E+LgorWW91IGNhbiByZXN1bWUgdGhyZWFkcyB3aXRoIHN0YXR1cyA8YSBocmVmPSIjcGRmLUxVQV9PSyI+PGNvZGU+TFVBX09LPC9jb2RlPjwvYT4KKyh0byBzdGFydCBhIG5ldyBjb3JvdXRpbmUpIG9yIDxhIGhyZWY9IiNwZGYtTFVBX1lJRUxEIj48Y29kZT5MVUFfWUlFTEQ8L2NvZGU+PC9hPgorKHRvIHJlc3VtZSBhIGNvcm91dGluZSkuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG9ib29sZWFuIj48Y29kZT5sdWFfdG9ib29sZWFuPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX3RvYm9vbGVhbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK0NvbnZlcnRzIHRoZSBMdWEgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IHRvIGEgQyZuYnNwO2Jvb2xlYW4KK3ZhbHVlICgwJm5ic3A7b3ImbmJzcDsxKS4KK0xpa2UgYWxsIHRlc3RzIGluIEx1YSwKKzxhIGhyZWY9IiNsdWFfdG9ib29sZWFuIj48Y29kZT5sdWFfdG9ib29sZWFuPC9jb2RlPjwvYT4gcmV0dXJucyB0cnVlIGZvciBhbnkgTHVhIHZhbHVlCitkaWZmZXJlbnQgZnJvbSA8Yj5mYWxzZTwvYj4gYW5kIDxiPm5pbDwvYj47CitvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyhJZiB5b3Ugd2FudCB0byBhY2NlcHQgb25seSBhY3R1YWwgYm9vbGVhbiB2YWx1ZXMsCit1c2UgPGEgaHJlZj0iI2x1YV9pc2Jvb2xlYW4iPjxjb2RlPmx1YV9pc2Jvb2xlYW48L2NvZGU+PC9hPiB0byB0ZXN0IHRoZSB2YWx1ZSdzIHR5cGUuKQorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3RvY2Z1bmN0aW9uIj48Y29kZT5sdWFfdG9jZnVuY3Rpb248L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmx1YV9DRnVuY3Rpb24gbHVhX3RvY2Z1bmN0aW9uIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorQ29udmVydHMgYSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggdG8gYSBDJm5ic3A7ZnVuY3Rpb24uCitUaGF0IHZhbHVlIG11c3QgYmUgYSBDJm5ic3A7ZnVuY3Rpb247CitvdGhlcndpc2UsIHJldHVybnMgPGNvZGU+TlVMTDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG9pbnRlZ2VyIj48Y29kZT5sdWFfdG9pbnRlZ2VyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5sdWFfSW50ZWdlciBsdWFfdG9pbnRlZ2VyIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorRXF1aXZhbGVudCB0byA8YSBocmVmPSIjbHVhX3RvaW50ZWdlcngiPjxjb2RlPmx1YV90b2ludGVnZXJ4PC9jb2RlPjwvYT4gd2l0aCA8Y29kZT5pc251bTwvY29kZT4gZXF1YWwgdG8gPGNvZGU+TlVMTDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG9pbnRlZ2VyeCI+PGNvZGU+bHVhX3RvaW50ZWdlcng8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmx1YV9JbnRlZ2VyIGx1YV90b2ludGVnZXJ4IChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgaW50ICppc251bSk7PC9wcmU+CisKKzxwPgorQ29udmVydHMgdGhlIEx1YSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKK3RvIHRoZSBzaWduZWQgaW50ZWdyYWwgdHlwZSA8YSBocmVmPSIjbHVhX0ludGVnZXIiPjxjb2RlPmx1YV9JbnRlZ2VyPC9jb2RlPjwvYT4uCitUaGUgTHVhIHZhbHVlIG11c3QgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcgY29udmVydGlibGUgdG8gYSBudW1iZXIKKyhzZWUgPGEgaHJlZj0iIzMuNC4yIj4mc2VjdDszLjQuMjwvYT4pOworb3RoZXJ3aXNlLCA8Y29kZT5sdWFfdG9pbnRlZ2VyeDwvY29kZT4gcmV0dXJucyZuYnNwOzAuCisKKworPHA+CitJZiB0aGUgbnVtYmVyIGlzIG5vdCBhbiBpbnRlZ2VyLAoraXQgaXMgdHJ1bmNhdGVkIGluIHNvbWUgbm9uLXNwZWNpZmllZCB3YXkuCisKKworPHA+CitJZiA8Y29kZT5pc251bTwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LAoraXRzIHJlZmVyZW50IGlzIGFzc2lnbmVkIGEgYm9vbGVhbiB2YWx1ZSB0aGF0CitpbmRpY2F0ZXMgd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV90b2xzdHJpbmciPjxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV90b2xzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBzaXplX3QgKmxlbik7PC9wcmU+CisKKzxwPgorQ29udmVydHMgdGhlIEx1YSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggdG8gYSBDJm5ic3A7c3RyaW5nLgorSWYgPGNvZGU+bGVuPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sCitpdCBhbHNvIHNldHMgPGNvZGU+KmxlbjwvY29kZT4gd2l0aCB0aGUgc3RyaW5nIGxlbmd0aC4KK1RoZSBMdWEgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIG51bWJlcjsKK290aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgPGNvZGU+TlVMTDwvY29kZT4uCitJZiB0aGUgdmFsdWUgaXMgYSBudW1iZXIsCit0aGVuIDxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+IGFsc28KKzxlbT5jaGFuZ2VzIHRoZSBhY3R1YWwgdmFsdWUgaW4gdGhlIHN0YWNrIHRvIGEgc3RyaW5nPC9lbT4uCisoVGhpcyBjaGFuZ2UgY29uZnVzZXMgPGEgaHJlZj0iI2x1YV9uZXh0Ij48Y29kZT5sdWFfbmV4dDwvY29kZT48L2E+Cit3aGVuIDxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+IGlzIGFwcGxpZWQgdG8ga2V5cyBkdXJpbmcgYSB0YWJsZSB0cmF2ZXJzYWwuKQorCisKKzxwPgorPGNvZGU+bHVhX3RvbHN0cmluZzwvY29kZT4gcmV0dXJucyBhIGZ1bGx5IGFsaWduZWQgcG9pbnRlcgordG8gYSBzdHJpbmcgaW5zaWRlIHRoZSBMdWEgc3RhdGUuCitUaGlzIHN0cmluZyBhbHdheXMgaGFzIGEgemVybyAoJzxjb2RlPlwwPC9jb2RlPicpCithZnRlciBpdHMgbGFzdCBjaGFyYWN0ZXIgKGFzIGluJm5ic3A7QyksCitidXQgY2FuIGNvbnRhaW4gb3RoZXIgemVyb3MgaW4gaXRzIGJvZHkuCitCZWNhdXNlIEx1YSBoYXMgZ2FyYmFnZSBjb2xsZWN0aW9uLAordGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHBvaW50ZXIgcmV0dXJuZWQgYnkgPGNvZGU+bHVhX3RvbHN0cmluZzwvY29kZT4KK3dpbGwgYmUgdmFsaWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGFjay4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV90b251bWJlciI+PGNvZGU+bHVhX3RvbnVtYmVyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5sdWFfTnVtYmVyIGx1YV90b251bWJlciAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK0VxdWl2YWxlbnQgdG8gPGEgaHJlZj0iI2x1YV90b251bWJlcngiPjxjb2RlPmx1YV90b251bWJlcng8L2NvZGU+PC9hPiB3aXRoIDxjb2RlPmlzbnVtPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5OVUxMPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV90b251bWJlcngiPjxjb2RlPmx1YV90b251bWJlcng8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmx1YV9OdW1iZXIgbHVhX3RvbnVtYmVyeCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGludCAqaXNudW0pOzwvcHJlPgorCis8cD4KK0NvbnZlcnRzIHRoZSBMdWEgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4Cit0byB0aGUgQyZuYnNwO3R5cGUgPGEgaHJlZj0iI2x1YV9OdW1iZXIiPjxjb2RlPmx1YV9OdW1iZXI8L2NvZGU+PC9hPiAoc2VlIDxhIGhyZWY9IiNsdWFfTnVtYmVyIj48Y29kZT5sdWFfTnVtYmVyPC9jb2RlPjwvYT4pLgorVGhlIEx1YSB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nIGNvbnZlcnRpYmxlIHRvIGEgbnVtYmVyCisoc2VlIDxhIGhyZWY9IiMzLjQuMiI+JnNlY3Q7My40LjI8L2E+KTsKK290aGVyd2lzZSwgPGEgaHJlZj0iI2x1YV90b251bWJlcngiPjxjb2RlPmx1YV90b251bWJlcng8L2NvZGU+PC9hPiByZXR1cm5zJm5ic3A7MC4KKworCis8cD4KK0lmIDxjb2RlPmlzbnVtPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4sCitpdHMgcmVmZXJlbnQgaXMgYXNzaWduZWQgYSBib29sZWFuIHZhbHVlIHRoYXQKK2luZGljYXRlcyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3RvcG9pbnRlciI+PGNvZGU+bHVhX3RvcG9pbnRlcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+Y29uc3Qgdm9pZCAqbHVhX3RvcG9pbnRlciAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK0NvbnZlcnRzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggdG8gYSBnZW5lcmljCitDJm5ic3A7cG9pbnRlciAoPGNvZGU+dm9pZCo8L2NvZGU+KS4KK1RoZSB2YWx1ZSBjYW4gYmUgYSB1c2VyZGF0YSwgYSB0YWJsZSwgYSB0aHJlYWQsIG9yIGEgZnVuY3Rpb247CitvdGhlcndpc2UsIDxjb2RlPmx1YV90b3BvaW50ZXI8L2NvZGU+IHJldHVybnMgPGNvZGU+TlVMTDwvY29kZT4uCitEaWZmZXJlbnQgb2JqZWN0cyB3aWxsIGdpdmUgZGlmZmVyZW50IHBvaW50ZXJzLgorVGhlcmUgaXMgbm8gd2F5IHRvIGNvbnZlcnQgdGhlIHBvaW50ZXIgYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCisKKworPHA+CitUeXBpY2FsbHkgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgZm9yIGRlYnVnIGluZm9ybWF0aW9uLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3Rvc3RyaW5nIj48Y29kZT5sdWFfdG9zdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV90b3N0cmluZyAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK0VxdWl2YWxlbnQgdG8gPGEgaHJlZj0iI2x1YV90b2xzdHJpbmciPjxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+PC9hPiB3aXRoIDxjb2RlPmxlbjwvY29kZT4gZXF1YWwgdG8gPGNvZGU+TlVMTDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG90aHJlYWQiPjxjb2RlPmx1YV90b3RocmVhZDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+bHVhX1N0YXRlICpsdWFfdG90aHJlYWQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitDb252ZXJ0cyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IHRvIGEgTHVhIHRocmVhZAorKHJlcHJlc2VudGVkIGFzIDxjb2RlPmx1YV9TdGF0ZSo8L2NvZGU+KS4KK1RoaXMgdmFsdWUgbXVzdCBiZSBhIHRocmVhZDsKK290aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgPGNvZGU+TlVMTDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG91bnNpZ25lZCI+PGNvZGU+bHVhX3RvdW5zaWduZWQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmx1YV9VbnNpZ25lZCBsdWFfdG91bnNpZ25lZCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK0VxdWl2YWxlbnQgdG8gPGEgaHJlZj0iI2x1YV90b3Vuc2lnbmVkeCI+PGNvZGU+bHVhX3RvdW5zaWduZWR4PC9jb2RlPjwvYT4gd2l0aCA8Y29kZT5pc251bTwvY29kZT4gZXF1YWwgdG8gPGNvZGU+TlVMTDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG91bnNpZ25lZHgiPjxjb2RlPmx1YV90b3Vuc2lnbmVkeDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+bHVhX1Vuc2lnbmVkIGx1YV90b3Vuc2lnbmVkeCAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGludCAqaXNudW0pOzwvcHJlPgorCis8cD4KK0NvbnZlcnRzIHRoZSBMdWEgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4Cit0byB0aGUgdW5zaWduZWQgaW50ZWdyYWwgdHlwZSA8YSBocmVmPSIjbHVhX1Vuc2lnbmVkIj48Y29kZT5sdWFfVW5zaWduZWQ8L2NvZGU+PC9hPi4KK1RoZSBMdWEgdmFsdWUgbXVzdCBiZSBhIG51bWJlciBvciBhIHN0cmluZyBjb252ZXJ0aWJsZSB0byBhIG51bWJlcgorKHNlZSA8YSBocmVmPSIjMy40LjIiPiZzZWN0OzMuNC4yPC9hPik7CitvdGhlcndpc2UsIDxjb2RlPmx1YV90b3Vuc2lnbmVkeDwvY29kZT4gcmV0dXJucyZuYnNwOzAuCisKKworPHA+CitJZiB0aGUgbnVtYmVyIGlzIG5vdCBhbiBpbnRlZ2VyLAoraXQgaXMgdHJ1bmNhdGVkIGluIHNvbWUgbm9uLXNwZWNpZmllZCB3YXkuCitJZiB0aGUgbnVtYmVyIGlzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHJlcHJlc2VudGFibGUgdmFsdWVzLAoraXQgaXMgbm9ybWFsaXplZCB0byB0aGUgcmVtYWluZGVyIG9mIGl0cyBkaXZpc2lvbiBieQorb25lIG1vcmUgdGhhbiB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIHZhbHVlLgorCisKKzxwPgorSWYgPGNvZGU+aXNudW08L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwKK2l0cyByZWZlcmVudCBpcyBhc3NpZ25lZCBhIGJvb2xlYW4gdmFsdWUgdGhhdAoraW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdG91c2VyZGF0YSI+PGNvZGU+bHVhX3RvdXNlcmRhdGE8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPnZvaWQgKmx1YV90b3VzZXJkYXRhIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorSWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCBpcyBhIGZ1bGwgdXNlcmRhdGEsCityZXR1cm5zIGl0cyBibG9jayBhZGRyZXNzLgorSWYgdGhlIHZhbHVlIGlzIGEgbGlnaHQgdXNlcmRhdGEsCityZXR1cm5zIGl0cyBwb2ludGVyLgorT3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPk5VTEw8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3R5cGUiPjxjb2RlPmx1YV90eXBlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX3R5cGUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTs8L3ByZT4KKworPHA+CitSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgsCitvciA8Y29kZT5MVUFfVE5PTkU8L2NvZGU+IGZvciBhIG5vbi12YWxpZCAoYnV0IGFjY2VwdGFibGUpIGluZGV4LgorVGhlIHR5cGVzIHJldHVybmVkIGJ5IDxhIGhyZWY9IiNsdWFfdHlwZSI+PGNvZGU+bHVhX3R5cGU8L2NvZGU+PC9hPiBhcmUgY29kZWQgYnkgdGhlIGZvbGxvd2luZyBjb25zdGFudHMKK2RlZmluZWQgaW4gPGNvZGU+bHVhLmg8L2NvZGU+OgorPGEgbmFtZT0icGRmLUxVQV9UTklMIj48Y29kZT5MVUFfVE5JTDwvY29kZT48L2E+LAorPGEgbmFtZT0icGRmLUxVQV9UTlVNQkVSIj48Y29kZT5MVUFfVE5VTUJFUjwvY29kZT48L2E+LAorPGEgbmFtZT0icGRmLUxVQV9UQk9PTEVBTiI+PGNvZGU+TFVBX1RCT09MRUFOPC9jb2RlPjwvYT4sCis8YSBuYW1lPSJwZGYtTFVBX1RTVFJJTkciPjxjb2RlPkxVQV9UU1RSSU5HPC9jb2RlPjwvYT4sCis8YSBuYW1lPSJwZGYtTFVBX1RUQUJMRSI+PGNvZGU+TFVBX1RUQUJMRTwvY29kZT48L2E+LAorPGEgbmFtZT0icGRmLUxVQV9URlVOQ1RJT04iPjxjb2RlPkxVQV9URlVOQ1RJT048L2NvZGU+PC9hPiwKKzxhIG5hbWU9InBkZi1MVUFfVFVTRVJEQVRBIj48Y29kZT5MVUFfVFVTRVJEQVRBPC9jb2RlPjwvYT4sCis8YSBuYW1lPSJwZGYtTFVBX1RUSFJFQUQiPjxjb2RlPkxVQV9UVEhSRUFEPC9jb2RlPjwvYT4sCithbmQKKzxhIG5hbWU9InBkZi1MVUFfVExJR0hUVVNFUkRBVEEiPjxjb2RlPkxVQV9UTElHSFRVU0VSREFUQTwvY29kZT48L2E+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3R5cGVuYW1lIj48Y29kZT5sdWFfdHlwZW5hbWU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV90eXBlbmFtZSAobHVhX1N0YXRlICpMLCBpbnQgdHApOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgZW5jb2RlZCBieSB0aGUgdmFsdWUgPGNvZGU+dHA8L2NvZGU+LAord2hpY2ggbXVzdCBiZSBvbmUgdGhlIHZhbHVlcyByZXR1cm5lZCBieSA8YSBocmVmPSIjbHVhX3R5cGUiPjxjb2RlPmx1YV90eXBlPC9jb2RlPjwvYT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfVW5zaWduZWQiPjxjb2RlPmx1YV9VbnNpZ25lZDwvY29kZT48L2E+PC9oMz4KKzxwcmU+dHlwZWRlZiB1bnNpZ25lZCBsb25nIGx1YV9VbnNpZ25lZDs8L3ByZT4KKworPHA+CitUaGUgdHlwZSB1c2VkIGJ5IHRoZSBMdWEgQVBJIHRvIHJlcHJlc2VudCB1bnNpZ25lZCBpbnRlZ3JhbCB2YWx1ZXMuCitJdCBtdXN0IGhhdmUgYXQgbGVhc3QgMzIgYml0cy4KKworCis8cD4KK0J5IGRlZmF1bHQgaXQgaXMgYW4gPGNvZGU+dW5zaWduZWQgaW50PC9jb2RlPiBvciBhbiA8Y29kZT51bnNpZ25lZCBsb25nPC9jb2RlPiwKK3doaWNoZXZlciBjYW4gaG9sZCAzMi1iaXQgdmFsdWVzLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3VwdmFsdWVpbmRleCI+PGNvZGU+bHVhX3VwdmFsdWVpbmRleDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV91cHZhbHVlaW5kZXggKGludCBpKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIHRoZSBwc2V1ZG8taW5kZXggdGhhdCByZXByZXNlbnRzIHRoZSA8Y29kZT5pPC9jb2RlPi10aCB1cHZhbHVlIG9mCit0aGUgcnVubmluZyBmdW5jdGlvbiAoc2VlIDxhIGhyZWY9IiM0LjQiPiZzZWN0OzQuNDwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3ZlcnNpb24iPjxjb2RlPmx1YV92ZXJzaW9uPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT5jb25zdCBsdWFfTnVtYmVyICpsdWFfdmVyc2lvbiAobHVhX1N0YXRlICpMKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSB2ZXJzaW9uIG51bWJlciBzdG9yZWQgaW4gdGhlIEx1YSBjb3JlLgorV2hlbiBjYWxsZWQgd2l0aCBhIHZhbGlkIDxhIGhyZWY9IiNsdWFfU3RhdGUiPjxjb2RlPmx1YV9TdGF0ZTwvY29kZT48L2E+LAorcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgdmVyc2lvbiB1c2VkIHRvIGNyZWF0ZSB0aGF0IHN0YXRlLgorV2hlbiBjYWxsZWQgd2l0aCA8Y29kZT5OVUxMPC9jb2RlPiwKK3JldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHZlcnNpb24gcnVubmluZyB0aGUgY2FsbC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9Xcml0ZXIiPjxjb2RlPmx1YV9Xcml0ZXI8L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgaW50ICgqbHVhX1dyaXRlcikgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1ZCk7PC9wcmU+CisKKzxwPgorVGhlIHR5cGUgb2YgdGhlIHdyaXRlciBmdW5jdGlvbiB1c2VkIGJ5IDxhIGhyZWY9IiNsdWFfZHVtcCI+PGNvZGU+bHVhX2R1bXA8L2NvZGU+PC9hPi4KK0V2ZXJ5IHRpbWUgaXQgcHJvZHVjZXMgYW5vdGhlciBwaWVjZSBvZiBjaHVuaywKKzxhIGhyZWY9IiNsdWFfZHVtcCI+PGNvZGU+bHVhX2R1bXA8L2NvZGU+PC9hPiBjYWxscyB0aGUgd3JpdGVyLAorcGFzc2luZyBhbG9uZyB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gKDxjb2RlPnA8L2NvZGU+KSwKK2l0cyBzaXplICg8Y29kZT5zejwvY29kZT4pLAorYW5kIHRoZSA8Y29kZT5kYXRhPC9jb2RlPiBwYXJhbWV0ZXIgc3VwcGxpZWQgdG8gPGEgaHJlZj0iI2x1YV9kdW1wIj48Y29kZT5sdWFfZHVtcDwvY29kZT48L2E+LgorCisKKzxwPgorVGhlIHdyaXRlciByZXR1cm5zIGFuIGVycm9yIGNvZGU6CiswJm5ic3A7bWVhbnMgbm8gZXJyb3JzOworYW55IG90aGVyIHZhbHVlIG1lYW5zIGFuIGVycm9yIGFuZCBzdG9wcyA8YSBocmVmPSIjbHVhX2R1bXAiPjxjb2RlPmx1YV9kdW1wPC9jb2RlPjwvYT4gZnJvbQorY2FsbGluZyB0aGUgd3JpdGVyIGFnYWluLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3htb3ZlIj48Y29kZT5sdWFfeG1vdmU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0/LCArPywgJm5kYXNoO108L3NwYW4+Cis8cHJlPnZvaWQgbHVhX3htb3ZlIChsdWFfU3RhdGUgKmZyb20sIGx1YV9TdGF0ZSAqdG8sIGludCBuKTs8L3ByZT4KKworPHA+CitFeGNoYW5nZSB2YWx1ZXMgYmV0d2VlbiBkaWZmZXJlbnQgdGhyZWFkcyBvZiB0aGUgc2FtZSBzdGF0ZS4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcG9wcyA8Y29kZT5uPC9jb2RlPiB2YWx1ZXMgZnJvbSB0aGUgc3RhY2sgPGNvZGU+ZnJvbTwvY29kZT4sCithbmQgcHVzaGVzIHRoZW0gb250byB0aGUgc3RhY2sgPGNvZGU+dG88L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3lpZWxkIj48Y29kZT5sdWFfeWllbGQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0/LCArPywgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfeWllbGQgKGx1YV9TdGF0ZSAqTCwgaW50IG5yZXN1bHRzKTs8L3ByZT4KKworPHA+CitUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gPGEgaHJlZj0iI2x1YV95aWVsZGsiPjxjb2RlPmx1YV95aWVsZGs8L2NvZGU+PC9hPiwKK2J1dCBpdCBoYXMgbm8gY29udGludWF0aW9uIChzZWUgPGEgaHJlZj0iIzQuNyI+JnNlY3Q7NC43PC9hPikuCitUaGVyZWZvcmUsIHdoZW4gdGhlIHRocmVhZCByZXN1bWVzLAoraXQgcmV0dXJucyB0byB0aGUgZnVuY3Rpb24gdGhhdCBjYWxsZWQKK3RoZSBmdW5jdGlvbiBjYWxsaW5nIDxjb2RlPmx1YV95aWVsZDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfeWllbGRrIj48Y29kZT5sdWFfeWllbGRrPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstPywgKz8sICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX3lpZWxkayAobHVhX1N0YXRlICpMLCBpbnQgbnJlc3VsdHMsIGludCBjdHgsIGx1YV9DRnVuY3Rpb24gayk7PC9wcmU+CisKKzxwPgorWWllbGRzIGEgY29yb3V0aW5lLgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgYXMgdGhlCityZXR1cm4gZXhwcmVzc2lvbiBvZiBhIEMmbmJzcDtmdW5jdGlvbiwgYXMgZm9sbG93czoKKworPHByZT4KKyAgICAgcmV0dXJuIGx1YV95aWVsZGsgKEwsIG4sIGksIGspOworPC9wcmU+PHA+CitXaGVuIGEgQyZuYnNwO2Z1bmN0aW9uIGNhbGxzIDxhIGhyZWY9IiNsdWFfeWllbGRrIj48Y29kZT5sdWFfeWllbGRrPC9jb2RlPjwvYT4gaW4gdGhhdCB3YXksCit0aGUgcnVubmluZyBjb3JvdXRpbmUgc3VzcGVuZHMgaXRzIGV4ZWN1dGlvbiwKK2FuZCB0aGUgY2FsbCB0byA8YSBocmVmPSIjbHVhX3Jlc3VtZSI+PGNvZGU+bHVhX3Jlc3VtZTwvY29kZT48L2E+IHRoYXQgc3RhcnRlZCB0aGlzIGNvcm91dGluZSByZXR1cm5zLgorVGhlIHBhcmFtZXRlciA8Y29kZT5ucmVzdWx0czwvY29kZT4gaXMgdGhlIG51bWJlciBvZiB2YWx1ZXMgZnJvbSB0aGUgc3RhY2sKK3RoYXQgYXJlIHBhc3NlZCBhcyByZXN1bHRzIHRvIDxhIGhyZWY9IiNsdWFfcmVzdW1lIj48Y29kZT5sdWFfcmVzdW1lPC9jb2RlPjwvYT4uCisKKworPHA+CitXaGVuIHRoZSBjb3JvdXRpbmUgaXMgcmVzdW1lZCBhZ2FpbiwKK0x1YSBjYWxscyB0aGUgZ2l2ZW4gY29udGludWF0aW9uIGZ1bmN0aW9uIDxjb2RlPms8L2NvZGU+IHRvIGNvbnRpbnVlCit0aGUgZXhlY3V0aW9uIG9mIHRoZSBDIGZ1bmN0aW9uIHRoYXQgeWllbGRlZCAoc2VlIDxhIGhyZWY9IiM0LjciPiZzZWN0OzQuNzwvYT4pLgorVGhpcyBjb250aW51YXRpb24gZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIHNhbWUgc3RhY2sKK2Zyb20gdGhlIHByZXZpb3VzIGZ1bmN0aW9uLAord2l0aCB0aGUgcmVzdWx0cyByZW1vdmVkIGFuZAorcmVwbGFjZWQgYnkgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gPGEgaHJlZj0iI2x1YV9yZXN1bWUiPjxjb2RlPmx1YV9yZXN1bWU8L2NvZGU+PC9hPi4KK01vcmVvdmVyLAordGhlIGNvbnRpbnVhdGlvbiBmdW5jdGlvbiBtYXkgYWNjZXNzIHRoZSB2YWx1ZSA8Y29kZT5jdHg8L2NvZGU+CitieSBjYWxsaW5nIDxhIGhyZWY9IiNsdWFfZ2V0Y3R4Ij48Y29kZT5sdWFfZ2V0Y3R4PC9jb2RlPjwvYT4uCisKKworCisKKworCisKKzxoMj40LjkgJm5kYXNoOyA8YSBuYW1lPSI0LjkiPlRoZSBEZWJ1ZyBJbnRlcmZhY2U8L2E+PC9oMj4KKworPHA+CitMdWEgaGFzIG5vIGJ1aWx0LWluIGRlYnVnZ2luZyBmYWNpbGl0aWVzLgorSW5zdGVhZCwgaXQgb2ZmZXJzIGEgc3BlY2lhbCBpbnRlcmZhY2UKK2J5IG1lYW5zIG9mIGZ1bmN0aW9ucyBhbmQgPGVtPmhvb2tzPC9lbT4uCitUaGlzIGludGVyZmFjZSBhbGxvd3MgdGhlIGNvbnN0cnVjdGlvbiBvZiBkaWZmZXJlbnQKK2tpbmRzIG9mIGRlYnVnZ2VycywgcHJvZmlsZXJzLCBhbmQgb3RoZXIgdG9vbHMKK3RoYXQgbmVlZCAiaW5zaWRlIGluZm9ybWF0aW9uIiBmcm9tIHRoZSBpbnRlcnByZXRlci4KKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX0RlYnVnIj48Y29kZT5sdWFfRGVidWc8L2NvZGU+PC9hPjwvaDM+Cis8cHJlPnR5cGVkZWYgc3RydWN0IGx1YV9EZWJ1ZyB7CisgIGludCBldmVudDsKKyAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgIC8qIChuKSAqLworICBjb25zdCBjaGFyICpuYW1ld2hhdDsgICAgICAgLyogKG4pICovCisgIGNvbnN0IGNoYXIgKndoYXQ7ICAgICAgICAgICAvKiAoUykgKi8KKyAgY29uc3QgY2hhciAqc291cmNlOyAgICAgICAgIC8qIChTKSAqLworICBpbnQgY3VycmVudGxpbmU7ICAgICAgICAgICAgLyogKGwpICovCisgIGludCBsaW5lZGVmaW5lZDsgICAgICAgICAgICAvKiAoUykgKi8KKyAgaW50IGxhc3RsaW5lZGVmaW5lZDsgICAgICAgIC8qIChTKSAqLworICB1bnNpZ25lZCBjaGFyIG51cHM7ICAgICAgICAgLyogKHUpIG51bWJlciBvZiB1cHZhbHVlcyAqLworICB1bnNpZ25lZCBjaGFyIG5wYXJhbXM7ICAgICAgLyogKHUpIG51bWJlciBvZiBwYXJhbWV0ZXJzICovCisgIGNoYXIgaXN2YXJhcmc7ICAgICAgICAgICAgICAvKiAodSkgKi8KKyAgY2hhciBpc3RhaWxjYWxsOyAgICAgICAgICAgIC8qICh0KSAqLworICBjaGFyIHNob3J0X3NyY1tMVUFfSURTSVpFXTsgLyogKFMpICovCisgIC8qIHByaXZhdGUgcGFydCAqLworICA8ZW0+b3RoZXIgZmllbGRzPC9lbT4KK30gbHVhX0RlYnVnOzwvcHJlPgorCis8cD4KK0Egc3RydWN0dXJlIHVzZWQgdG8gY2FycnkgZGlmZmVyZW50IHBpZWNlcyBvZgoraW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvbiBvciBhbiBhY3RpdmF0aW9uIHJlY29yZC4KKzxhIGhyZWY9IiNsdWFfZ2V0c3RhY2siPjxjb2RlPmx1YV9nZXRzdGFjazwvY29kZT48L2E+IGZpbGxzIG9ubHkgdGhlIHByaXZhdGUgcGFydAorb2YgdGhpcyBzdHJ1Y3R1cmUsIGZvciBsYXRlciB1c2UuCitUbyBmaWxsIHRoZSBvdGhlciBmaWVsZHMgb2YgPGEgaHJlZj0iI2x1YV9EZWJ1ZyI+PGNvZGU+bHVhX0RlYnVnPC9jb2RlPjwvYT4gd2l0aCB1c2VmdWwgaW5mb3JtYXRpb24sCitjYWxsIDxhIGhyZWY9IiNsdWFfZ2V0aW5mbyI+PGNvZGU+bHVhX2dldGluZm88L2NvZGU+PC9hPi4KKworCis8cD4KK1RoZSBmaWVsZHMgb2YgPGEgaHJlZj0iI2x1YV9EZWJ1ZyI+PGNvZGU+bHVhX0RlYnVnPC9jb2RlPjwvYT4gaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmc6CisKKzx1bD4KKworPGxpPjxiPjxjb2RlPnNvdXJjZTwvY29kZT46IDwvYj4KK3RoZSBzb3VyY2Ugb2YgdGhlIGNodW5rIHRoYXQgY3JlYXRlZCB0aGUgZnVuY3Rpb24uCitJZiA8Y29kZT5zb3VyY2U8L2NvZGU+IHN0YXJ0cyB3aXRoIGEgJzxjb2RlPkA8L2NvZGU+JywKK2l0IG1lYW5zIHRoYXQgdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluIGEgZmlsZSB3aGVyZQordGhlIGZpbGUgbmFtZSBmb2xsb3dzIHRoZSAnPGNvZGU+QDwvY29kZT4nLgorSWYgPGNvZGU+c291cmNlPC9jb2RlPiBzdGFydHMgd2l0aCBhICc8Y29kZT49PC9jb2RlPicsCit0aGUgcmVtYWluZGVyIG9mIGl0cyBjb250ZW50cyBkZXNjcmliZSB0aGUgc291cmNlIGluIGEgdXNlci1kZXBlbmRlbnQgbWFubmVyLgorT3RoZXJ3aXNlLAordGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluIGEgc3RyaW5nIHdoZXJlCis8Y29kZT5zb3VyY2U8L2NvZGU+IGlzIHRoYXQgc3RyaW5nLgorPC9saT4KKworPGxpPjxiPjxjb2RlPnNob3J0X3NyYzwvY29kZT46IDwvYj4KK2EgInByaW50YWJsZSIgdmVyc2lvbiBvZiA8Y29kZT5zb3VyY2U8L2NvZGU+LCB0byBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLgorPC9saT4KKworPGxpPjxiPjxjb2RlPmxpbmVkZWZpbmVkPC9jb2RlPjogPC9iPgordGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiBzdGFydHMuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+bGFzdGxpbmVkZWZpbmVkPC9jb2RlPjogPC9iPgordGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiBlbmRzLgorPC9saT4KKworPGxpPjxiPjxjb2RlPndoYXQ8L2NvZGU+OiA8L2I+Cit0aGUgc3RyaW5nIDxjb2RlPiJMdWEiPC9jb2RlPiBpZiB0aGUgZnVuY3Rpb24gaXMgYSBMdWEgZnVuY3Rpb24sCis8Y29kZT4iQyI8L2NvZGU+IGlmIGl0IGlzIGEgQyZuYnNwO2Z1bmN0aW9uLAorPGNvZGU+Im1haW4iPC9jb2RlPiBpZiBpdCBpcyB0aGUgbWFpbiBwYXJ0IG9mIGEgY2h1bmsuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+Y3VycmVudGxpbmU8L2NvZGU+OiA8L2I+Cit0aGUgY3VycmVudCBsaW5lIHdoZXJlIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBleGVjdXRpbmcuCitXaGVuIG5vIGxpbmUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLAorPGNvZGU+Y3VycmVudGxpbmU8L2NvZGU+IGlzIHNldCB0byAtMS4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5uYW1lPC9jb2RlPjogPC9iPgorYSByZWFzb25hYmxlIG5hbWUgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbi4KK0JlY2F1c2UgZnVuY3Rpb25zIGluIEx1YSBhcmUgZmlyc3QtY2xhc3MgdmFsdWVzLAordGhleSBkbyBub3QgaGF2ZSBhIGZpeGVkIG5hbWU6Citzb21lIGZ1bmN0aW9ucyBjYW4gYmUgdGhlIHZhbHVlIG9mIG11bHRpcGxlIGdsb2JhbCB2YXJpYWJsZXMsCit3aGlsZSBvdGhlcnMgY2FuIGJlIHN0b3JlZCBvbmx5IGluIGEgdGFibGUgZmllbGQuCitUaGUgPGNvZGU+bHVhX2dldGluZm88L2NvZGU+IGZ1bmN0aW9uIGNoZWNrcyBob3cgdGhlIGZ1bmN0aW9uIHdhcworY2FsbGVkIHRvIGZpbmQgYSBzdWl0YWJsZSBuYW1lLgorSWYgaXQgY2Fubm90IGZpbmQgYSBuYW1lLAordGhlbiA8Y29kZT5uYW1lPC9jb2RlPiBpcyBzZXQgdG8gPGNvZGU+TlVMTDwvY29kZT4uCis8L2xpPgorCis8bGk+PGI+PGNvZGU+bmFtZXdoYXQ8L2NvZGU+OiA8L2I+CitleHBsYWlucyB0aGUgPGNvZGU+bmFtZTwvY29kZT4gZmllbGQuCitUaGUgdmFsdWUgb2YgPGNvZGU+bmFtZXdoYXQ8L2NvZGU+IGNhbiBiZQorPGNvZGU+Imdsb2JhbCI8L2NvZGU+LCA8Y29kZT4ibG9jYWwiPC9jb2RlPiwgPGNvZGU+Im1ldGhvZCI8L2NvZGU+LAorPGNvZGU+ImZpZWxkIjwvY29kZT4sIDxjb2RlPiJ1cHZhbHVlIjwvY29kZT4sIG9yIDxjb2RlPiIiPC9jb2RlPiAodGhlIGVtcHR5IHN0cmluZyksCithY2NvcmRpbmcgdG8gaG93IHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLgorKEx1YSB1c2VzIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBubyBvdGhlciBvcHRpb24gc2VlbXMgdG8gYXBwbHkuKQorPC9saT4KKworPGxpPjxiPjxjb2RlPmlzdGFpbGNhbGw8L2NvZGU+OiA8L2I+Cit0cnVlIGlmIHRoaXMgZnVuY3Rpb24gaW52b2NhdGlvbiB3YXMgY2FsbGVkIGJ5IGEgdGFpbCBjYWxsLgorSW4gdGhpcyBjYXNlLCB0aGUgY2FsbGVyIG9mIHRoaXMgbGV2ZWwgaXMgbm90IGluIHRoZSBzdGFjay4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5udXBzPC9jb2RlPjogPC9iPgordGhlIG51bWJlciBvZiB1cHZhbHVlcyBvZiB0aGUgZnVuY3Rpb24uCis8L2xpPgorCis8bGk+PGI+PGNvZGU+bnBhcmFtczwvY29kZT46IDwvYj4KK3RoZSBudW1iZXIgb2YgZml4ZWQgcGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb24KKyhhbHdheXMgMCZuYnNwO2ZvciBDJm5ic3A7ZnVuY3Rpb25zKS4KKzwvbGk+CisKKzxsaT48Yj48Y29kZT5pc3ZhcmFyZzwvY29kZT46IDwvYj4KK3RydWUgaWYgdGhlIGZ1bmN0aW9uIGlzIGEgdmFyYXJnIGZ1bmN0aW9uCisoYWx3YXlzIHRydWUgZm9yIEMmbmJzcDtmdW5jdGlvbnMpLgorPC9saT4KKworPC91bD4KKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2V0aG9vayI+PGNvZGU+bHVhX2dldGhvb2s8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmx1YV9Ib29rIGx1YV9nZXRob29rIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlIGN1cnJlbnQgaG9vayBmdW5jdGlvbi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9nZXRob29rY291bnQiPjxjb2RlPmx1YV9nZXRob29rY291bnQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFfZ2V0aG9va2NvdW50IChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlIGN1cnJlbnQgaG9vayBjb3VudC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9nZXRob29rbWFzayI+PGNvZGU+bHVhX2dldGhvb2ttYXNrPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhX2dldGhvb2ttYXNrIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlIGN1cnJlbnQgaG9vayBtYXNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldGluZm8iPjxjb2RlPmx1YV9nZXRpbmZvPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstKDB8MSksICsoMHwxfDIpLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9nZXRpbmZvIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKndoYXQsIGx1YV9EZWJ1ZyAqYXIpOzwvcHJlPgorCis8cD4KK0dldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBmdW5jdGlvbiBvciBmdW5jdGlvbiBpbnZvY2F0aW9uLgorCisKKzxwPgorVG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24gaW52b2NhdGlvbiwKK3RoZSBwYXJhbWV0ZXIgPGNvZGU+YXI8L2NvZGU+IG11c3QgYmUgYSB2YWxpZCBhY3RpdmF0aW9uIHJlY29yZCB0aGF0IHdhcworZmlsbGVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byA8YSBocmVmPSIjbHVhX2dldHN0YWNrIj48Y29kZT5sdWFfZ2V0c3RhY2s8L2NvZGU+PC9hPiBvcgorZ2l2ZW4gYXMgYXJndW1lbnQgdG8gYSBob29rIChzZWUgPGEgaHJlZj0iI2x1YV9Ib29rIj48Y29kZT5sdWFfSG9vazwvY29kZT48L2E+KS4KKworCis8cD4KK1RvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uIHlvdSBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCithbmQgc3RhcnQgdGhlIDxjb2RlPndoYXQ8L2NvZGU+IHN0cmluZyB3aXRoIHRoZSBjaGFyYWN0ZXIgJzxjb2RlPiZndDs8L2NvZGU+Jy4KKyhJbiB0aGF0IGNhc2UsCis8Y29kZT5sdWFfZ2V0aW5mbzwvY29kZT4gcG9wcyB0aGUgZnVuY3Rpb24gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjay4pCitGb3IgaW5zdGFuY2UsIHRvIGtub3cgaW4gd2hpY2ggbGluZSBhIGZ1bmN0aW9uIDxjb2RlPmY8L2NvZGU+IHdhcyBkZWZpbmVkLAoreW91IGNhbiB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6CisKKzxwcmU+CisgICAgIGx1YV9EZWJ1ZyBhcjsKKyAgICAgbHVhX2dldGdsb2JhbChMLCAiZiIpOyAgLyogZ2V0IGdsb2JhbCAnZicgKi8KKyAgICAgbHVhX2dldGluZm8oTCwgIiZndDtTIiwgJmFtcDthcik7CisgICAgIHByaW50ZigiJWRcbiIsIGFyLmxpbmVkZWZpbmVkKTsKKzwvcHJlPgorCis8cD4KK0VhY2ggY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgPGNvZGU+d2hhdDwvY29kZT4KK3NlbGVjdHMgc29tZSBmaWVsZHMgb2YgdGhlIHN0cnVjdHVyZSA8Y29kZT5hcjwvY29kZT4gdG8gYmUgZmlsbGVkIG9yCithIHZhbHVlIHRvIGJlIHB1c2hlZCBvbiB0aGUgc3RhY2s6CisKKzx1bD4KKworPGxpPjxiPic8Y29kZT5uPC9jb2RlPic6IDwvYj4gZmlsbHMgaW4gdGhlIGZpZWxkIDxjb2RlPm5hbWU8L2NvZGU+IGFuZCA8Y29kZT5uYW1ld2hhdDwvY29kZT47Cis8L2xpPgorCis8bGk+PGI+Jzxjb2RlPlM8L2NvZGU+JzogPC9iPgorZmlsbHMgaW4gdGhlIGZpZWxkcyA8Y29kZT5zb3VyY2U8L2NvZGU+LCA8Y29kZT5zaG9ydF9zcmM8L2NvZGU+LAorPGNvZGU+bGluZWRlZmluZWQ8L2NvZGU+LCA8Y29kZT5sYXN0bGluZWRlZmluZWQ8L2NvZGU+LCBhbmQgPGNvZGU+d2hhdDwvY29kZT47Cis8L2xpPgorCis8bGk+PGI+Jzxjb2RlPmw8L2NvZGU+JzogPC9iPiBmaWxscyBpbiB0aGUgZmllbGQgPGNvZGU+Y3VycmVudGxpbmU8L2NvZGU+OworPC9saT4KKworPGxpPjxiPic8Y29kZT50PC9jb2RlPic6IDwvYj4gZmlsbHMgaW4gdGhlIGZpZWxkIDxjb2RlPmlzdGFpbGNhbGw8L2NvZGU+OworPC9saT4KKworPGxpPjxiPic8Y29kZT51PC9jb2RlPic6IDwvYj4gZmlsbHMgaW4gdGhlIGZpZWxkcworPGNvZGU+bnVwczwvY29kZT4sIDxjb2RlPm5wYXJhbXM8L2NvZGU+LCBhbmQgPGNvZGU+aXN2YXJhcmc8L2NvZGU+OworPC9saT4KKworPGxpPjxiPic8Y29kZT5mPC9jb2RlPic6IDwvYj4KK3B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgZnVuY3Rpb24gdGhhdCBpcworcnVubmluZyBhdCB0aGUgZ2l2ZW4gbGV2ZWw7Cis8L2xpPgorCis8bGk+PGI+Jzxjb2RlPkw8L2NvZGU+JzogPC9iPgorcHVzaGVzIG9udG8gdGhlIHN0YWNrIGEgdGFibGUgd2hvc2UgaW5kaWNlcyBhcmUgdGhlCitudW1iZXJzIG9mIHRoZSBsaW5lcyB0aGF0IGFyZSB2YWxpZCBvbiB0aGUgZnVuY3Rpb24uCisoQSA8ZW0+dmFsaWQgbGluZTwvZW0+IGlzIGEgbGluZSB3aXRoIHNvbWUgYXNzb2NpYXRlZCBjb2RlLAordGhhdCBpcywgYSBsaW5lIHdoZXJlIHlvdSBjYW4gcHV0IGEgYnJlYWsgcG9pbnQuCitOb24tdmFsaWQgbGluZXMgaW5jbHVkZSBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHMuKQorPC9saT4KKworPC91bD4KKworPHA+CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBlcnJvcgorKGZvciBpbnN0YW5jZSwgYW4gaW52YWxpZCBvcHRpb24gaW4gPGNvZGU+d2hhdDwvY29kZT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX2dldGxvY2FsIj48Y29kZT5sdWFfZ2V0bG9jYWw8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArKDB8MSksICZuZGFzaDtdPC9zcGFuPgorPHByZT5jb25zdCBjaGFyICpsdWFfZ2V0bG9jYWwgKGx1YV9TdGF0ZSAqTCwgbHVhX0RlYnVnICphciwgaW50IG4pOzwvcHJlPgorCis8cD4KK0dldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2NhbCB2YXJpYWJsZSBvZgorYSBnaXZlbiBhY3RpdmF0aW9uIHJlY29yZCBvciBhIGdpdmVuIGZ1bmN0aW9uLgorCisKKzxwPgorSW4gdGhlIGZpcnN0IGNhc2UsCit0aGUgcGFyYW1ldGVyIDxjb2RlPmFyPC9jb2RlPiBtdXN0IGJlIGEgdmFsaWQgYWN0aXZhdGlvbiByZWNvcmQgdGhhdCB3YXMKK2ZpbGxlZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gPGEgaHJlZj0iI2x1YV9nZXRzdGFjayI+PGNvZGU+bHVhX2dldHN0YWNrPC9jb2RlPjwvYT4gb3IKK2dpdmVuIGFzIGFyZ3VtZW50IHRvIGEgaG9vayAoc2VlIDxhIGhyZWY9IiNsdWFfSG9vayI+PGNvZGU+bHVhX0hvb2s8L2NvZGU+PC9hPikuCitUaGUgaW5kZXggPGNvZGU+bjwvY29kZT4gc2VsZWN0cyB3aGljaCBsb2NhbCB2YXJpYWJsZSB0byBpbnNwZWN0Oworc2VlIDxhIGhyZWY9IiNwZGYtZGVidWcuZ2V0bG9jYWwiPjxjb2RlPmRlYnVnLmdldGxvY2FsPC9jb2RlPjwvYT4gZm9yIGRldGFpbHMgYWJvdXQgdmFyaWFibGUgaW5kaWNlcworYW5kIG5hbWVzLgorCisKKzxwPgorPGEgaHJlZj0iI2x1YV9nZXRsb2NhbCI+PGNvZGU+bHVhX2dldGxvY2FsPC9jb2RlPjwvYT4gcHVzaGVzIHRoZSB2YXJpYWJsZSdzIHZhbHVlIG9udG8gdGhlIHN0YWNrCithbmQgcmV0dXJucyBpdHMgbmFtZS4KKworCis8cD4KK0luIHRoZSBzZWNvbmQgY2FzZSwgPGNvZGU+YXI8L2NvZGU+IHNob3VsZCBiZSA8Y29kZT5OVUxMPC9jb2RlPiBhbmQgdGhlIGZ1bmN0aW9uCit0byBiZSBpbnNwZWN0ZWQgbXVzdCBiZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KK0luIHRoaXMgY2FzZSwgb25seSBwYXJhbWV0ZXJzIG9mIEx1YSBmdW5jdGlvbnMgYXJlIHZpc2libGUKKyhhcyB0aGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHZhcmlhYmxlcyBhcmUgYWN0aXZlKQorYW5kIG5vIHZhbHVlcyBhcmUgcHVzaGVkIG9udG8gdGhlIHN0YWNrLgorCisKKzxwPgorUmV0dXJucyA8Y29kZT5OVUxMPC9jb2RlPiAoYW5kIHB1c2hlcyBub3RoaW5nKQord2hlbiB0aGUgaW5kZXggaXMgZ3JlYXRlciB0aGFuCit0aGUgbnVtYmVyIG9mIGFjdGl2ZSBsb2NhbCB2YXJpYWJsZXMuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfZ2V0c3RhY2siPjxjb2RlPmx1YV9nZXRzdGFjazwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9nZXRzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgbGV2ZWwsIGx1YV9EZWJ1ZyAqYXIpOzwvcHJlPgorCis8cD4KK0dldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVycHJldGVyIHJ1bnRpbWUgc3RhY2suCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIGZpbGxzIHBhcnRzIG9mIGEgPGEgaHJlZj0iI2x1YV9EZWJ1ZyI+PGNvZGU+bHVhX0RlYnVnPC9jb2RlPjwvYT4gc3RydWN0dXJlIHdpdGgKK2FuIGlkZW50aWZpY2F0aW9uIG9mIHRoZSA8ZW0+YWN0aXZhdGlvbiByZWNvcmQ8L2VtPgorb2YgdGhlIGZ1bmN0aW9uIGV4ZWN1dGluZyBhdCBhIGdpdmVuIGxldmVsLgorTGV2ZWwmbmJzcDswIGlzIHRoZSBjdXJyZW50IHJ1bm5pbmcgZnVuY3Rpb24sCit3aGVyZWFzIGxldmVsIDxlbT5uKzE8L2VtPiBpcyB0aGUgZnVuY3Rpb24gdGhhdCBoYXMgY2FsbGVkIGxldmVsIDxlbT5uPC9lbT4KKyhleGNlcHQgZm9yIHRhaWwgY2FsbHMsIHdoaWNoIGRvIG5vdCBjb3VudCBvbiB0aGUgc3RhY2spLgorV2hlbiB0aGVyZSBhcmUgbm8gZXJyb3JzLCA8YSBocmVmPSIjbHVhX2dldHN0YWNrIj48Y29kZT5sdWFfZ2V0c3RhY2s8L2NvZGU+PC9hPiByZXR1cm5zIDE7Cit3aGVuIGNhbGxlZCB3aXRoIGEgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSBzdGFjayBkZXB0aCwKK2l0IHJldHVybnMgMC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9nZXR1cHZhbHVlIj48Y29kZT5sdWFfZ2V0dXB2YWx1ZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsoMHwxKSwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YV9nZXR1cHZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBmdW5jaW5kZXgsIGludCBuKTs8L3ByZT4KKworPHA+CitHZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgY2xvc3VyZSdzIHVwdmFsdWUuCisoRm9yIEx1YSBmdW5jdGlvbnMsCit1cHZhbHVlcyBhcmUgdGhlIGV4dGVybmFsIGxvY2FsIHZhcmlhYmxlcyB0aGF0IHRoZSBmdW5jdGlvbiB1c2VzLAorYW5kIHRoYXQgYXJlIGNvbnNlcXVlbnRseSBpbmNsdWRlZCBpbiBpdHMgY2xvc3VyZS4pCis8YSBocmVmPSIjbHVhX2dldHVwdmFsdWUiPjxjb2RlPmx1YV9nZXR1cHZhbHVlPC9jb2RlPjwvYT4gZ2V0cyB0aGUgaW5kZXggPGNvZGU+bjwvY29kZT4gb2YgYW4gdXB2YWx1ZSwKK3B1c2hlcyB0aGUgdXB2YWx1ZSdzIHZhbHVlIG9udG8gdGhlIHN0YWNrLAorYW5kIHJldHVybnMgaXRzIG5hbWUuCis8Y29kZT5mdW5jaW5kZXg8L2NvZGU+IHBvaW50cyB0byB0aGUgY2xvc3VyZSBpbiB0aGUgc3RhY2suCisoVXB2YWx1ZXMgaGF2ZSBubyBwYXJ0aWN1bGFyIG9yZGVyLAorYXMgdGhleSBhcmUgYWN0aXZlIHRocm91Z2ggdGhlIHdob2xlIGZ1bmN0aW9uLgorU28sIHRoZXkgYXJlIG51bWJlcmVkIGluIGFuIGFyYml0cmFyeSBvcmRlci4pCisKKworPHA+CitSZXR1cm5zIDxjb2RlPk5VTEw8L2NvZGU+IChhbmQgcHVzaGVzIG5vdGhpbmcpCit3aGVuIHRoZSBpbmRleCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiB1cHZhbHVlcy4KK0ZvciBDJm5ic3A7ZnVuY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4KK2FzIGEgbmFtZSBmb3IgYWxsIHVwdmFsdWVzLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX0hvb2siPjxjb2RlPmx1YV9Ib29rPC9jb2RlPjwvYT48L2gzPgorPHByZT50eXBlZGVmIHZvaWQgKCpsdWFfSG9vaykgKGx1YV9TdGF0ZSAqTCwgbHVhX0RlYnVnICphcik7PC9wcmU+CisKKzxwPgorVHlwZSBmb3IgZGVidWdnaW5nIGhvb2sgZnVuY3Rpb25zLgorCisKKzxwPgorV2hlbmV2ZXIgYSBob29rIGlzIGNhbGxlZCwgaXRzIDxjb2RlPmFyPC9jb2RlPiBhcmd1bWVudCBoYXMgaXRzIGZpZWxkCis8Y29kZT5ldmVudDwvY29kZT4gc2V0IHRvIHRoZSBzcGVjaWZpYyBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgaG9vay4KK0x1YSBpZGVudGlmaWVzIHRoZXNlIGV2ZW50cyB3aXRoIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorPGEgbmFtZT0icGRmLUxVQV9IT09LQ0FMTCI+PGNvZGU+TFVBX0hPT0tDQUxMPC9jb2RlPjwvYT4sIDxhIG5hbWU9InBkZi1MVUFfSE9PS1JFVCI+PGNvZGU+TFVBX0hPT0tSRVQ8L2NvZGU+PC9hPiwKKzxhIG5hbWU9InBkZi1MVUFfSE9PS1RBSUxDQUxMIj48Y29kZT5MVUFfSE9PS1RBSUxDQUxMPC9jb2RlPjwvYT4sIDxhIG5hbWU9InBkZi1MVUFfSE9PS0xJTkUiPjxjb2RlPkxVQV9IT09LTElORTwvY29kZT48L2E+LAorYW5kIDxhIG5hbWU9InBkZi1MVUFfSE9PS0NPVU5UIj48Y29kZT5MVUFfSE9PS0NPVU5UPC9jb2RlPjwvYT4uCitNb3Jlb3ZlciwgZm9yIGxpbmUgZXZlbnRzLCB0aGUgZmllbGQgPGNvZGU+Y3VycmVudGxpbmU8L2NvZGU+IGlzIGFsc28gc2V0LgorVG8gZ2V0IHRoZSB2YWx1ZSBvZiBhbnkgb3RoZXIgZmllbGQgaW4gPGNvZGU+YXI8L2NvZGU+LAordGhlIGhvb2sgbXVzdCBjYWxsIDxhIGhyZWY9IiNsdWFfZ2V0aW5mbyI+PGNvZGU+bHVhX2dldGluZm88L2NvZGU+PC9hPi4KKworCis8cD4KK0ZvciBjYWxsIGV2ZW50cywgPGNvZGU+ZXZlbnQ8L2NvZGU+IGNhbiBiZSA8Y29kZT5MVUFfSE9PS0NBTEw8L2NvZGU+LAordGhlIG5vcm1hbCB2YWx1ZSwgb3IgPGNvZGU+TFVBX0hPT0tUQUlMQ0FMTDwvY29kZT4sIGZvciBhIHRhaWwgY2FsbDsKK2luIHRoaXMgY2FzZSwgdGhlcmUgd2lsbCBiZSBubyBjb3JyZXNwb25kaW5nIHJldHVybiBldmVudC4KKworCis8cD4KK1doaWxlIEx1YSBpcyBydW5uaW5nIGEgaG9vaywgaXQgZGlzYWJsZXMgb3RoZXIgY2FsbHMgdG8gaG9va3MuCitUaGVyZWZvcmUsIGlmIGEgaG9vayBjYWxscyBiYWNrIEx1YSB0byBleGVjdXRlIGEgZnVuY3Rpb24gb3IgYSBjaHVuaywKK3RoaXMgZXhlY3V0aW9uIG9jY3VycyB3aXRob3V0IGFueSBjYWxscyB0byBob29rcy4KKworCis8cD4KK0hvb2sgZnVuY3Rpb25zIGNhbm5vdCBoYXZlIGNvbnRpbnVhdGlvbnMsCit0aGF0IGlzLCB0aGV5IGNhbm5vdCBjYWxsIDxhIGhyZWY9IiNsdWFfeWllbGRrIj48Y29kZT5sdWFfeWllbGRrPC9jb2RlPjwvYT4sCis8YSBocmVmPSIjbHVhX3BjYWxsayI+PGNvZGU+bHVhX3BjYWxsazwvY29kZT48L2E+LCBvciA8YSBocmVmPSIjbHVhX2NhbGxrIj48Y29kZT5sdWFfY2FsbGs8L2NvZGU+PC9hPiB3aXRoIGEgbm9uLW51bGwgPGNvZGU+azwvY29kZT4uCisKKworPHA+CitIb29rIGZ1bmN0aW9ucyBjYW4geWllbGQgdW5kZXIgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorT25seSBjb3VudCBhbmQgbGluZSBldmVudHMgY2FuIHlpZWxkCithbmQgdGhleSBjYW5ub3QgeWllbGQgYW55IHZhbHVlOwordG8geWllbGQgYSBob29rIGZ1bmN0aW9uIG11c3QgZmluaXNoIGl0cyBleGVjdXRpb24KK2NhbGxpbmcgPGEgaHJlZj0iI2x1YV95aWVsZCI+PGNvZGU+bHVhX3lpZWxkPC9jb2RlPjwvYT4gd2l0aCA8Y29kZT5ucmVzdWx0czwvY29kZT4gZXF1YWwgdG8gemVyby4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YV9zZXRob29rIj48Y29kZT5sdWFfc2V0aG9vazwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+aW50IGx1YV9zZXRob29rIChsdWFfU3RhdGUgKkwsIGx1YV9Ib29rIGYsIGludCBtYXNrLCBpbnQgY291bnQpOzwvcHJlPgorCis8cD4KK1NldHMgdGhlIGRlYnVnZ2luZyBob29rIGZ1bmN0aW9uLgorCisKKzxwPgorQXJndW1lbnQgPGNvZGU+ZjwvY29kZT4gaXMgdGhlIGhvb2sgZnVuY3Rpb24uCis8Y29kZT5tYXNrPC9jb2RlPiBzcGVjaWZpZXMgb24gd2hpY2ggZXZlbnRzIHRoZSBob29rIHdpbGwgYmUgY2FsbGVkOgoraXQgaXMgZm9ybWVkIGJ5IGEgYml0d2lzZSBvciBvZiB0aGUgY29uc3RhbnRzCis8YSBuYW1lPSJwZGYtTFVBX01BU0tDQUxMIj48Y29kZT5MVUFfTUFTS0NBTEw8L2NvZGU+PC9hPiwKKzxhIG5hbWU9InBkZi1MVUFfTUFTS1JFVCI+PGNvZGU+TFVBX01BU0tSRVQ8L2NvZGU+PC9hPiwKKzxhIG5hbWU9InBkZi1MVUFfTUFTS0xJTkUiPjxjb2RlPkxVQV9NQVNLTElORTwvY29kZT48L2E+LAorYW5kIDxhIG5hbWU9InBkZi1MVUFfTUFTS0NPVU5UIj48Y29kZT5MVUFfTUFTS0NPVU5UPC9jb2RlPjwvYT4uCitUaGUgPGNvZGU+Y291bnQ8L2NvZGU+IGFyZ3VtZW50IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBtYXNrCitpbmNsdWRlcyA8Y29kZT5MVUFfTUFTS0NPVU5UPC9jb2RlPi4KK0ZvciBlYWNoIGV2ZW50LCB0aGUgaG9vayBpcyBjYWxsZWQgYXMgZXhwbGFpbmVkIGJlbG93OgorCis8dWw+CisKKzxsaT48Yj5UaGUgY2FsbCBob29rOiA8L2I+IGlzIGNhbGxlZCB3aGVuIHRoZSBpbnRlcnByZXRlciBjYWxscyBhIGZ1bmN0aW9uLgorVGhlIGhvb2sgaXMgY2FsbGVkIGp1c3QgYWZ0ZXIgTHVhIGVudGVycyB0aGUgbmV3IGZ1bmN0aW9uLAorYmVmb3JlIHRoZSBmdW5jdGlvbiBnZXRzIGl0cyBhcmd1bWVudHMuCis8L2xpPgorCis8bGk+PGI+VGhlIHJldHVybiBob29rOiA8L2I+IGlzIGNhbGxlZCB3aGVuIHRoZSBpbnRlcnByZXRlciByZXR1cm5zIGZyb20gYSBmdW5jdGlvbi4KK1RoZSBob29rIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBMdWEgbGVhdmVzIHRoZSBmdW5jdGlvbi4KK1RoZXJlIGlzIG5vIHN0YW5kYXJkIHdheSB0byBhY2Nlc3MgdGhlIHZhbHVlcwordG8gYmUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLgorPC9saT4KKworPGxpPjxiPlRoZSBsaW5lIGhvb2s6IDwvYj4gaXMgY2FsbGVkIHdoZW4gdGhlIGludGVycHJldGVyIGlzIGFib3V0IHRvCitzdGFydCB0aGUgZXhlY3V0aW9uIG9mIGEgbmV3IGxpbmUgb2YgY29kZSwKK29yIHdoZW4gaXQganVtcHMgYmFjayBpbiB0aGUgY29kZSAoZXZlbiB0byB0aGUgc2FtZSBsaW5lKS4KKyhUaGlzIGV2ZW50IG9ubHkgaGFwcGVucyB3aGlsZSBMdWEgaXMgZXhlY3V0aW5nIGEgTHVhIGZ1bmN0aW9uLikKKzwvbGk+CisKKzxsaT48Yj5UaGUgY291bnQgaG9vazogPC9iPiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGludGVycHJldGVyIGV4ZWN1dGVzIGV2ZXJ5Cis8Y29kZT5jb3VudDwvY29kZT4gaW5zdHJ1Y3Rpb25zLgorKFRoaXMgZXZlbnQgb25seSBoYXBwZW5zIHdoaWxlIEx1YSBpcyBleGVjdXRpbmcgYSBMdWEgZnVuY3Rpb24uKQorPC9saT4KKworPC91bD4KKworPHA+CitBIGhvb2sgaXMgZGlzYWJsZWQgYnkgc2V0dGluZyA8Y29kZT5tYXNrPC9jb2RlPiB0byB6ZXJvLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhX3NldGxvY2FsIj48Y29kZT5sdWFfc2V0bG9jYWw8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0oMHwxKSwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5jb25zdCBjaGFyICpsdWFfc2V0bG9jYWwgKGx1YV9TdGF0ZSAqTCwgbHVhX0RlYnVnICphciwgaW50IG4pOzwvcHJlPgorCis8cD4KK1NldHMgdGhlIHZhbHVlIG9mIGEgbG9jYWwgdmFyaWFibGUgb2YgYSBnaXZlbiBhY3RpdmF0aW9uIHJlY29yZC4KK1BhcmFtZXRlcnMgPGNvZGU+YXI8L2NvZGU+IGFuZCA8Y29kZT5uPC9jb2RlPiBhcmUgYXMgaW4gPGEgaHJlZj0iI2x1YV9nZXRsb2NhbCI+PGNvZGU+bHVhX2dldGxvY2FsPC9jb2RlPjwvYT4KKyhzZWUgPGEgaHJlZj0iI2x1YV9nZXRsb2NhbCI+PGNvZGU+bHVhX2dldGxvY2FsPC9jb2RlPjwvYT4pLgorPGEgaHJlZj0iI2x1YV9zZXRsb2NhbCI+PGNvZGU+bHVhX3NldGxvY2FsPC9jb2RlPjwvYT4gYXNzaWducyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKK3RvIHRoZSB2YXJpYWJsZSBhbmQgcmV0dXJucyBpdHMgbmFtZS4KK0l0IGFsc28gcG9wcyB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2suCisKKworPHA+CitSZXR1cm5zIDxjb2RlPk5VTEw8L2NvZGU+IChhbmQgcG9wcyBub3RoaW5nKQord2hlbiB0aGUgaW5kZXggaXMgZ3JlYXRlciB0aGFuCit0aGUgbnVtYmVyIG9mIGFjdGl2ZSBsb2NhbCB2YXJpYWJsZXMuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfc2V0dXB2YWx1ZSI+PGNvZGU+bHVhX3NldHVwdmFsdWU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0oMHwxKSwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5jb25zdCBjaGFyICpsdWFfc2V0dXB2YWx1ZSAobHVhX1N0YXRlICpMLCBpbnQgZnVuY2luZGV4LCBpbnQgbik7PC9wcmU+CisKKzxwPgorU2V0cyB0aGUgdmFsdWUgb2YgYSBjbG9zdXJlJ3MgdXB2YWx1ZS4KK0l0IGFzc2lnbnMgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCit0byB0aGUgdXB2YWx1ZSBhbmQgcmV0dXJucyBpdHMgbmFtZS4KK0l0IGFsc28gcG9wcyB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2suCitQYXJhbWV0ZXJzIDxjb2RlPmZ1bmNpbmRleDwvY29kZT4gYW5kIDxjb2RlPm48L2NvZGU+IGFyZSBhcyBpbiB0aGUgPGEgaHJlZj0iI2x1YV9nZXR1cHZhbHVlIj48Y29kZT5sdWFfZ2V0dXB2YWx1ZTwvY29kZT48L2E+Cisoc2VlIDxhIGhyZWY9IiNsdWFfZ2V0dXB2YWx1ZSI+PGNvZGU+bHVhX2dldHVwdmFsdWU8L2NvZGU+PC9hPikuCisKKworPHA+CitSZXR1cm5zIDxjb2RlPk5VTEw8L2NvZGU+IChhbmQgcG9wcyBub3RoaW5nKQord2hlbiB0aGUgaW5kZXggaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgdXB2YWx1ZXMuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdXB2YWx1ZWlkIj48Y29kZT5sdWFfdXB2YWx1ZWlkPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkICpsdWFfdXB2YWx1ZWlkIChsdWFfU3RhdGUgKkwsIGludCBmdW5jaW5kZXgsIGludCBuKTs8L3ByZT4KKworPHA+CitSZXR1cm5zIGFuIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdXB2YWx1ZSBudW1iZXJlZCA8Y29kZT5uPC9jb2RlPgorZnJvbSB0aGUgY2xvc3VyZSBhdCBpbmRleCA8Y29kZT5mdW5jaW5kZXg8L2NvZGU+LgorUGFyYW1ldGVycyA8Y29kZT5mdW5jaW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5uPC9jb2RlPiBhcmUgYXMgaW4gdGhlIDxhIGhyZWY9IiNsdWFfZ2V0dXB2YWx1ZSI+PGNvZGU+bHVhX2dldHVwdmFsdWU8L2NvZGU+PC9hPgorKHNlZSA8YSBocmVmPSIjbHVhX2dldHVwdmFsdWUiPjxjb2RlPmx1YV9nZXR1cHZhbHVlPC9jb2RlPjwvYT4pCisoYnV0IDxjb2RlPm48L2NvZGU+IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiB1cHZhbHVlcykuCisKKworPHA+CitUaGVzZSB1bmlxdWUgaWRlbnRpZmllcnMgYWxsb3cgYSBwcm9ncmFtIHRvIGNoZWNrIHdoZXRoZXIgZGlmZmVyZW50CitjbG9zdXJlcyBzaGFyZSB1cHZhbHVlcy4KK0x1YSBjbG9zdXJlcyB0aGF0IHNoYXJlIGFuIHVwdmFsdWUKKyh0aGF0IGlzLCB0aGF0IGFjY2VzcyBhIHNhbWUgZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGUpCit3aWxsIHJldHVybiBpZGVudGljYWwgaWRzIGZvciB0aG9zZSB1cHZhbHVlIGluZGljZXMuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFfdXB2YWx1ZWpvaW4iPjxjb2RlPmx1YV91cHZhbHVlam9pbjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFfdXB2YWx1ZWpvaW4gKGx1YV9TdGF0ZSAqTCwgaW50IGZ1bmNpbmRleDEsIGludCBuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmdW5jaW5kZXgyLCBpbnQgbjIpOzwvcHJlPgorCis8cD4KK01ha2UgdGhlIDxjb2RlPm4xPC9jb2RlPi10aCB1cHZhbHVlIG9mIHRoZSBMdWEgY2xvc3VyZSBhdCBpbmRleCA8Y29kZT5mdW5jaW5kZXgxPC9jb2RlPgorcmVmZXIgdG8gdGhlIDxjb2RlPm4yPC9jb2RlPi10aCB1cHZhbHVlIG9mIHRoZSBMdWEgY2xvc3VyZSBhdCBpbmRleCA8Y29kZT5mdW5jaW5kZXgyPC9jb2RlPi4KKworCisKKworCisKKworPGgxPjUgJm5kYXNoOyA8YSBuYW1lPSI1Ij5UaGUgQXV4aWxpYXJ5IExpYnJhcnk8L2E+PC9oMT4KKworPHA+CisKK1RoZSA8ZW0+YXV4aWxpYXJ5IGxpYnJhcnk8L2VtPiBwcm92aWRlcyBzZXZlcmFsIGNvbnZlbmllbnQgZnVuY3Rpb25zCit0byBpbnRlcmZhY2UgQyB3aXRoIEx1YS4KK1doaWxlIHRoZSBiYXNpYyBBUEkgcHJvdmlkZXMgdGhlIHByaW1pdGl2ZSBmdW5jdGlvbnMgZm9yIGFsbAoraW50ZXJhY3Rpb25zIGJldHdlZW4gQyBhbmQgTHVhLAordGhlIGF1eGlsaWFyeSBsaWJyYXJ5IHByb3ZpZGVzIGhpZ2hlci1sZXZlbCBmdW5jdGlvbnMgZm9yIHNvbWUKK2NvbW1vbiB0YXNrcy4KKworCis8cD4KK0FsbCBmdW5jdGlvbnMgYW5kIHR5cGVzIGZyb20gdGhlIGF1eGlsaWFyeSBsaWJyYXJ5CithcmUgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZSA8Y29kZT5sYXV4bGliLmg8L2NvZGU+IGFuZAoraGF2ZSBhIHByZWZpeCA8Y29kZT5sdWFMXzwvY29kZT4uCisKKworPHA+CitBbGwgZnVuY3Rpb25zIGluIHRoZSBhdXhpbGlhcnkgbGlicmFyeSBhcmUgYnVpbHQgb24KK3RvcCBvZiB0aGUgYmFzaWMgQVBJLAorYW5kIHNvIHRoZXkgcHJvdmlkZSBub3RoaW5nIHRoYXQgY2Fubm90IGJlIGRvbmUgd2l0aCB0aGF0IEFQSS4KK05ldmVydGhlbGVzcywgdGhlIHVzZSBvZiB0aGUgYXV4aWxpYXJ5IGxpYnJhcnkgZW5zdXJlcworbW9yZSBjb25zaXN0ZW5jeSB0byB5b3VyIGNvZGUuCisKKworPHA+CitTZXZlcmFsIGZ1bmN0aW9ucyBpbiB0aGUgYXV4aWxpYXJ5IGxpYnJhcnkgdXNlIGludGVybmFsbHkgc29tZQorZXh0cmEgc3RhY2sgc2xvdHMuCitXaGVuIGEgZnVuY3Rpb24gaW4gdGhlIGF1eGlsaWFyeSBsaWJyYXJ5IHVzZXMgbGVzcyB0aGFuIGZpdmUgc2xvdHMsCitpdCBkb2VzIG5vdCBjaGVjayB0aGUgc3RhY2sgc2l6ZTsKK2l0IHNpbXBseSBhc3N1bWVzIHRoYXQgdGhlcmUgYXJlIGVub3VnaCBzbG90cy4KKworCis8cD4KK1NldmVyYWwgZnVuY3Rpb25zIGluIHRoZSBhdXhpbGlhcnkgbGlicmFyeSBhcmUgdXNlZCB0bworY2hlY2sgQyZuYnNwO2Z1bmN0aW9uIGFyZ3VtZW50cy4KK0JlY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2UgaXMgZm9ybWF0dGVkIGZvciBhcmd1bWVudHMKKyhlLmcuLCAiPGNvZGU+YmFkIGFyZ3VtZW50ICMxPC9jb2RlPiIpLAoreW91IHNob3VsZCBub3QgdXNlIHRoZXNlIGZ1bmN0aW9ucyBmb3Igb3RoZXIgc3RhY2sgdmFsdWVzLgorCisKKzxwPgorRnVuY3Rpb25zIGNhbGxlZCA8Y29kZT5sdWFMX2NoZWNrKjwvY29kZT4KK2Fsd2F5cyB0aHJvdyBhbiBlcnJvciBpZiB0aGUgY2hlY2sgaXMgbm90IHNhdGlzZmllZC4KKworCisKKzxoMj41LjEgJm5kYXNoOyA8YSBuYW1lPSI1LjEiPkZ1bmN0aW9ucyBhbmQgVHlwZXM8L2E+PC9oMj4KKworPHA+CitIZXJlIHdlIGxpc3QgYWxsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgZnJvbSB0aGUgYXV4aWxpYXJ5IGxpYnJhcnkKK2luIGFscGhhYmV0aWNhbCBvcmRlci4KKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9hZGRjaGFyIj48Y29kZT5sdWFMX2FkZGNoYXI8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0/LCArPywgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9hZGRjaGFyIChsdWFMX0J1ZmZlciAqQiwgY2hhciBjKTs8L3ByZT4KKworPHA+CitBZGRzIHRoZSBieXRlIDxjb2RlPmM8L2NvZGU+IHRvIHRoZSBidWZmZXIgPGNvZGU+QjwvY29kZT4KKyhzZWUgPGEgaHJlZj0iI2x1YUxfQnVmZmVyIj48Y29kZT5sdWFMX0J1ZmZlcjwvY29kZT48L2E+KS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfYWRkbHN0cmluZyI+PGNvZGU+bHVhTF9hZGRsc3RyaW5nPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstPywgKz8sIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YUxfYWRkbHN0cmluZyAobHVhTF9CdWZmZXIgKkIsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsKTs8L3ByZT4KKworPHA+CitBZGRzIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSA8Y29kZT5zPC9jb2RlPiB3aXRoIGxlbmd0aCA8Y29kZT5sPC9jb2RlPiB0bwordGhlIGJ1ZmZlciA8Y29kZT5CPC9jb2RlPgorKHNlZSA8YSBocmVmPSIjbHVhTF9CdWZmZXIiPjxjb2RlPmx1YUxfQnVmZmVyPC9jb2RlPjwvYT4pLgorVGhlIHN0cmluZyBjYW4gY29udGFpbiBlbWJlZGRlZCB6ZXJvcy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfYWRkc2l6ZSI+PGNvZGU+bHVhTF9hZGRzaXplPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstPywgKz8sIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YUxfYWRkc2l6ZSAobHVhTF9CdWZmZXIgKkIsIHNpemVfdCBuKTs8L3ByZT4KKworPHA+CitBZGRzIHRvIHRoZSBidWZmZXIgPGNvZGU+QjwvY29kZT4gKHNlZSA8YSBocmVmPSIjbHVhTF9CdWZmZXIiPjxjb2RlPmx1YUxfQnVmZmVyPC9jb2RlPjwvYT4pCithIHN0cmluZyBvZiBsZW5ndGggPGNvZGU+bjwvY29kZT4gcHJldmlvdXNseSBjb3BpZWQgdG8gdGhlCitidWZmZXIgYXJlYSAoc2VlIDxhIGhyZWY9IiNsdWFMX3ByZXBidWZmZXIiPjxjb2RlPmx1YUxfcHJlcGJ1ZmZlcjwvY29kZT48L2E+KS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfYWRkc3RyaW5nIj48Y29kZT5sdWFMX2FkZHN0cmluZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLT8sICs/LCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX2FkZHN0cmluZyAobHVhTF9CdWZmZXIgKkIsIGNvbnN0IGNoYXIgKnMpOzwvcHJlPgorCis8cD4KK0FkZHMgdGhlIHplcm8tdGVybWluYXRlZCBzdHJpbmcgcG9pbnRlZCB0byBieSA8Y29kZT5zPC9jb2RlPgordG8gdGhlIGJ1ZmZlciA8Y29kZT5CPC9jb2RlPgorKHNlZSA8YSBocmVmPSIjbHVhTF9CdWZmZXIiPjxjb2RlPmx1YUxfQnVmZmVyPC9jb2RlPjwvYT4pLgorVGhlIHN0cmluZyBjYW5ub3QgY29udGFpbiBlbWJlZGRlZCB6ZXJvcy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfYWRkdmFsdWUiPjxjb2RlPmx1YUxfYWRkdmFsdWU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArPywgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9hZGR2YWx1ZSAobHVhTF9CdWZmZXIgKkIpOzwvcHJlPgorCis8cD4KK0FkZHMgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCit0byB0aGUgYnVmZmVyIDxjb2RlPkI8L2NvZGU+Cisoc2VlIDxhIGhyZWY9IiNsdWFMX0J1ZmZlciI+PGNvZGU+bHVhTF9CdWZmZXI8L2NvZGU+PC9hPikuCitQb3BzIHRoZSB2YWx1ZS4KKworCis8cD4KK1RoaXMgaXMgdGhlIG9ubHkgZnVuY3Rpb24gb24gc3RyaW5nIGJ1ZmZlcnMgdGhhdCBjYW4gKGFuZCBtdXN0KQorYmUgY2FsbGVkIHdpdGggYW4gZXh0cmEgZWxlbWVudCBvbiB0aGUgc3RhY2ssCit3aGljaCBpcyB0aGUgdmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhlIGJ1ZmZlci4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfYXJnY2hlY2siPjxjb2RlPmx1YUxfYXJnY2hlY2s8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9hcmdjaGVjayAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgICBpbnQgY29uZCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGFyZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXh0cmFtc2cpOzwvcHJlPgorCis8cD4KK0NoZWNrcyB3aGV0aGVyIDxjb2RlPmNvbmQ8L2NvZGU+IGlzIHRydWUuCitJZiBub3QsIHJhaXNlcyBhbiBlcnJvciB3aXRoIGEgc3RhbmRhcmQgbWVzc2FnZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfYXJnZXJyb3IiPjxjb2RlPmx1YUxfYXJnZXJyb3I8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX2FyZ2Vycm9yIChsdWFfU3RhdGUgKkwsIGludCBhcmcsIGNvbnN0IGNoYXIgKmV4dHJhbXNnKTs8L3ByZT4KKworPHA+CitSYWlzZXMgYW4gZXJyb3Igd2l0aCBhIHN0YW5kYXJkIG1lc3NhZ2UKK3RoYXQgaW5jbHVkZXMgPGNvZGU+ZXh0cmFtc2c8L2NvZGU+IGFzIGEgY29tbWVudC4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gbmV2ZXIgcmV0dXJucywKK2J1dCBpdCBpcyBhbiBpZGlvbSB0byB1c2UgaXQgaW4gQyZuYnNwO2Z1bmN0aW9ucworYXMgPGNvZGU+cmV0dXJuIGx1YUxfYXJnZXJyb3IoPGVtPmFyZ3M8L2VtPik8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9CdWZmZXIiPjxjb2RlPmx1YUxfQnVmZmVyPC9jb2RlPjwvYT48L2gzPgorPHByZT50eXBlZGVmIHN0cnVjdCBsdWFMX0J1ZmZlciBsdWFMX0J1ZmZlcjs8L3ByZT4KKworPHA+CitUeXBlIGZvciBhIDxlbT5zdHJpbmcgYnVmZmVyPC9lbT4uCisKKworPHA+CitBIHN0cmluZyBidWZmZXIgYWxsb3dzIEMmbmJzcDtjb2RlIHRvIGJ1aWxkIEx1YSBzdHJpbmdzIHBpZWNlbWVhbC4KK0l0cyBwYXR0ZXJuIG9mIHVzZSBpcyBhcyBmb2xsb3dzOgorCis8dWw+CisKKzxsaT5GaXJzdCBkZWNsYXJlIGEgdmFyaWFibGUgPGNvZGU+YjwvY29kZT4gb2YgdHlwZSA8YSBocmVmPSIjbHVhTF9CdWZmZXIiPjxjb2RlPmx1YUxfQnVmZmVyPC9jb2RlPjwvYT4uPC9saT4KKworPGxpPlRoZW4gaW5pdGlhbGl6ZSBpdCB3aXRoIGEgY2FsbCA8Y29kZT5sdWFMX2J1ZmZpbml0KEwsICZhbXA7Yik8L2NvZGU+LjwvbGk+CisKKzxsaT4KK1RoZW4gYWRkIHN0cmluZyBwaWVjZXMgdG8gdGhlIGJ1ZmZlciBjYWxsaW5nIGFueSBvZgordGhlIDxjb2RlPmx1YUxfYWRkKjwvY29kZT4gZnVuY3Rpb25zLgorPC9saT4KKworPGxpPgorRmluaXNoIGJ5IGNhbGxpbmcgPGNvZGU+bHVhTF9wdXNocmVzdWx0KCZhbXA7Yik8L2NvZGU+LgorVGhpcyBjYWxsIGxlYXZlcyB0aGUgZmluYWwgc3RyaW5nIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorPC9saT4KKworPC91bD4KKworPHA+CitJZiB5b3Uga25vdyBiZWZvcmVoYW5kIHRoZSB0b3RhbCBzaXplIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLAoreW91IGNhbiB1c2UgdGhlIGJ1ZmZlciBsaWtlIHRoaXM6CisKKzx1bD4KKworPGxpPkZpcnN0IGRlY2xhcmUgYSB2YXJpYWJsZSA8Y29kZT5iPC9jb2RlPiBvZiB0eXBlIDxhIGhyZWY9IiNsdWFMX0J1ZmZlciI+PGNvZGU+bHVhTF9CdWZmZXI8L2NvZGU+PC9hPi48L2xpPgorCis8bGk+VGhlbiBpbml0aWFsaXplIGl0IGFuZCBwcmVhbGxvY2F0ZSBhIHNwYWNlIG9mCitzaXplIDxjb2RlPnN6PC9jb2RlPiB3aXRoIGEgY2FsbCA8Y29kZT5sdWFMX2J1ZmZpbml0c2l6ZShMLCAmYW1wO2IsIHN6KTwvY29kZT4uPC9saT4KKworPGxpPlRoZW4gY29weSB0aGUgc3RyaW5nIGludG8gdGhhdCBzcGFjZS48L2xpPgorCis8bGk+CitGaW5pc2ggYnkgY2FsbGluZyA8Y29kZT5sdWFMX3B1c2hyZXN1bHRzaXplKCZhbXA7Yiwgc3opPC9jb2RlPiwKK3doZXJlIDxjb2RlPnN6PC9jb2RlPiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZworY29waWVkIGludG8gdGhhdCBzcGFjZS4KKzwvbGk+CisKKzwvdWw+CisKKzxwPgorRHVyaW5nIGl0cyBub3JtYWwgb3BlcmF0aW9uLAorYSBzdHJpbmcgYnVmZmVyIHVzZXMgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RhY2sgc2xvdHMuCitTbywgd2hpbGUgdXNpbmcgYSBidWZmZXIsIHlvdSBjYW5ub3QgYXNzdW1lIHRoYXQgeW91IGtub3cgd2hlcmUKK3RoZSB0b3Agb2YgdGhlIHN0YWNrIGlzLgorWW91IGNhbiB1c2UgdGhlIHN0YWNrIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyB0byBidWZmZXIgb3BlcmF0aW9ucworYXMgbG9uZyBhcyB0aGF0IHVzZSBpcyBiYWxhbmNlZDsKK3RoYXQgaXMsCit3aGVuIHlvdSBjYWxsIGEgYnVmZmVyIG9wZXJhdGlvbiwKK3RoZSBzdGFjayBpcyBhdCB0aGUgc2FtZSBsZXZlbAoraXQgd2FzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwcmV2aW91cyBidWZmZXIgb3BlcmF0aW9uLgorKFRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgaXMgPGEgaHJlZj0iI2x1YUxfYWRkdmFsdWUiPjxjb2RlPmx1YUxfYWRkdmFsdWU8L2NvZGU+PC9hPi4pCitBZnRlciBjYWxsaW5nIDxhIGhyZWY9IiNsdWFMX3B1c2hyZXN1bHQiPjxjb2RlPmx1YUxfcHVzaHJlc3VsdDwvY29kZT48L2E+IHRoZSBzdGFjayBpcyBiYWNrIHRvIGl0cworbGV2ZWwgd2hlbiB0aGUgYnVmZmVyIHdhcyBpbml0aWFsaXplZCwKK3BsdXMgdGhlIGZpbmFsIHN0cmluZyBvbiBpdHMgdG9wLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9idWZmaW5pdCI+PGNvZGU+bHVhTF9idWZmaW5pdDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX2J1ZmZpbml0IChsdWFfU3RhdGUgKkwsIGx1YUxfQnVmZmVyICpCKTs8L3ByZT4KKworPHA+CitJbml0aWFsaXplcyBhIGJ1ZmZlciA8Y29kZT5CPC9jb2RlPi4KK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWxsb2NhdGUgYW55IHNwYWNlOwordGhlIGJ1ZmZlciBtdXN0IGJlIGRlY2xhcmVkIGFzIGEgdmFyaWFibGUKKyhzZWUgPGEgaHJlZj0iI2x1YUxfQnVmZmVyIj48Y29kZT5sdWFMX0J1ZmZlcjwvY29kZT48L2E+KS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfYnVmZmluaXRzaXplIj48Y29kZT5sdWFMX2J1ZmZpbml0c2l6ZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLT8sICs/LCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y2hhciAqbHVhTF9idWZmaW5pdHNpemUgKGx1YV9TdGF0ZSAqTCwgbHVhTF9CdWZmZXIgKkIsIHNpemVfdCBzeik7PC9wcmU+CisKKzxwPgorRXF1aXZhbGVudCB0byB0aGUgc2VxdWVuY2UKKzxhIGhyZWY9IiNsdWFMX2J1ZmZpbml0Ij48Y29kZT5sdWFMX2J1ZmZpbml0PC9jb2RlPjwvYT4sIDxhIGhyZWY9IiNsdWFMX3ByZXBidWZmc2l6ZSI+PGNvZGU+bHVhTF9wcmVwYnVmZnNpemU8L2NvZGU+PC9hPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfY2FsbG1ldGEiPjxjb2RlPmx1YUxfY2FsbG1ldGE8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArKDB8MSksIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9jYWxsbWV0YSAobHVhX1N0YXRlICpMLCBpbnQgb2JqLCBjb25zdCBjaGFyICplKTs8L3ByZT4KKworPHA+CitDYWxscyBhIG1ldGFtZXRob2QuCisKKworPHA+CitJZiB0aGUgb2JqZWN0IGF0IGluZGV4IDxjb2RlPm9iajwvY29kZT4gaGFzIGEgbWV0YXRhYmxlIGFuZCB0aGlzCittZXRhdGFibGUgaGFzIGEgZmllbGQgPGNvZGU+ZTwvY29kZT4sCit0aGlzIGZ1bmN0aW9uIGNhbGxzIHRoaXMgZmllbGQgcGFzc2luZyB0aGUgb2JqZWN0IGFzIGl0cyBvbmx5IGFyZ3VtZW50LgorSW4gdGhpcyBjYXNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGFuZCBwdXNoZXMgb250byB0aGUKK3N0YWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgY2FsbC4KK0lmIHRoZXJlIGlzIG5vIG1ldGF0YWJsZSBvciBubyBtZXRhbWV0aG9kLAordGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlICh3aXRob3V0IHB1c2hpbmcgYW55IHZhbHVlIG9uIHRoZSBzdGFjaykuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2NoZWNrYW55Ij48Y29kZT5sdWFMX2NoZWNrYW55PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YUxfY2hlY2thbnkgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZyk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGhhcyBhbiBhcmd1bWVudAorb2YgYW55IHR5cGUgKGluY2x1ZGluZyA8Yj5uaWw8L2I+KSBhdCBwb3NpdGlvbiA8Y29kZT5hcmc8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jaGVja2ludCI+PGNvZGU+bHVhTF9jaGVja2ludDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YUxfY2hlY2tpbnQgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZyk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPmFyZzwvY29kZT4gaXMgYSBudW1iZXIKK2FuZCByZXR1cm5zIHRoaXMgbnVtYmVyIGNhc3QgdG8gYW4gPGNvZGU+aW50PC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfY2hlY2tpbnRlZ2VyIj48Y29kZT5sdWFMX2NoZWNraW50ZWdlcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+bHVhX0ludGVnZXIgbHVhTF9jaGVja2ludGVnZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZyk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPmFyZzwvY29kZT4gaXMgYSBudW1iZXIKK2FuZCByZXR1cm5zIHRoaXMgbnVtYmVyIGNhc3QgdG8gYSA8YSBocmVmPSIjbHVhX0ludGVnZXIiPjxjb2RlPmx1YV9JbnRlZ2VyPC9jb2RlPjwvYT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2NoZWNrbG9uZyI+PGNvZGU+bHVhTF9jaGVja2xvbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmxvbmcgbHVhTF9jaGVja2xvbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZyk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPmFyZzwvY29kZT4gaXMgYSBudW1iZXIKK2FuZCByZXR1cm5zIHRoaXMgbnVtYmVyIGNhc3QgdG8gYSA8Y29kZT5sb25nPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfY2hlY2tsc3RyaW5nIj48Y29kZT5sdWFMX2NoZWNrbHN0cmluZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhTF9jaGVja2xzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZywgc2l6ZV90ICpsKTs8L3ByZT4KKworPHA+CitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+YXJnPC9jb2RlPiBpcyBhIHN0cmluZworYW5kIHJldHVybnMgdGhpcyBzdHJpbmc7CitpZiA8Y29kZT5sPC9jb2RlPiBpcyBub3QgPGNvZGU+TlVMTDwvY29kZT4gZmlsbHMgPGNvZGU+Kmw8L2NvZGU+Cit3aXRoIHRoZSBzdHJpbmcncyBsZW5ndGguCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHVzZXMgPGEgaHJlZj0iI2x1YV90b2xzdHJpbmciPjxjb2RlPmx1YV90b2xzdHJpbmc8L2NvZGU+PC9hPiB0byBnZXQgaXRzIHJlc3VsdCwKK3NvIGFsbCBjb252ZXJzaW9ucyBhbmQgY2F2ZWF0cyBvZiB0aGF0IGZ1bmN0aW9uIGFwcGx5IGhlcmUuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2NoZWNrbnVtYmVyIj48Y29kZT5sdWFMX2NoZWNrbnVtYmVyPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT5sdWFfTnVtYmVyIGx1YUxfY2hlY2tudW1iZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZyk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPmFyZzwvY29kZT4gaXMgYSBudW1iZXIKK2FuZCByZXR1cm5zIHRoaXMgbnVtYmVyLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jaGVja29wdGlvbiI+PGNvZGU+bHVhTF9jaGVja29wdGlvbjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YUxfY2hlY2tvcHRpb24gKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCBsc3RbXSk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPmFyZzwvY29kZT4gaXMgYSBzdHJpbmcgYW5kCitzZWFyY2hlcyBmb3IgdGhpcyBzdHJpbmcgaW4gdGhlIGFycmF5IDxjb2RlPmxzdDwvY29kZT4KKyh3aGljaCBtdXN0IGJlIE5VTEwtdGVybWluYXRlZCkuCitSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIHN0cmluZyB3YXMgZm91bmQuCitSYWlzZXMgYW4gZXJyb3IgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHN0cmluZyBvcgoraWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgZm91bmQuCisKKworPHA+CitJZiA8Y29kZT5kZWY8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiwKK3RoZSBmdW5jdGlvbiB1c2VzIDxjb2RlPmRlZjwvY29kZT4gYXMgYSBkZWZhdWx0IHZhbHVlIHdoZW4KK3RoZXJlIGlzIG5vIGFyZ3VtZW50IDxjb2RlPmFyZzwvY29kZT4gb3Igd2hlbiB0aGlzIGFyZ3VtZW50IGlzIDxiPm5pbDwvYj4uCisKKworPHA+CitUaGlzIGlzIGEgdXNlZnVsIGZ1bmN0aW9uIGZvciBtYXBwaW5nIHN0cmluZ3MgdG8gQyZuYnNwO2VudW1zLgorKFRoZSB1c3VhbCBjb252ZW50aW9uIGluIEx1YSBsaWJyYXJpZXMgaXMKK3RvIHVzZSBzdHJpbmdzIGluc3RlYWQgb2YgbnVtYmVycyB0byBzZWxlY3Qgb3B0aW9ucy4pCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2NoZWNrc3RhY2siPjxjb2RlPmx1YUxfY2hlY2tzdGFjazwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX2NoZWNrc3RhY2sgKGx1YV9TdGF0ZSAqTCwgaW50IHN6LCBjb25zdCBjaGFyICptc2cpOzwvcHJlPgorCis8cD4KK0dyb3dzIHRoZSBzdGFjayBzaXplIHRvIDxjb2RlPnRvcCArIHN6PC9jb2RlPiBlbGVtZW50cywKK3JhaXNpbmcgYW4gZXJyb3IgaWYgdGhlIHN0YWNrIGNhbm5vdCBncm93IHRvIHRoYXQgc2l6ZS4KKzxjb2RlPm1zZzwvY29kZT4gaXMgYW4gYWRkaXRpb25hbCB0ZXh0IHRvIGdvIGludG8gdGhlIGVycm9yIG1lc3NhZ2UKKyhvciA8Y29kZT5OVUxMPC9jb2RlPiBmb3Igbm8gYWRkaXRpb25hbCB0ZXh0KS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfY2hlY2tzdHJpbmciPjxjb2RlPmx1YUxfY2hlY2tzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YUxfY2hlY2tzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZyk7PC9wcmU+CisKKzxwPgorQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPmFyZzwvY29kZT4gaXMgYSBzdHJpbmcKK2FuZCByZXR1cm5zIHRoaXMgc3RyaW5nLgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiB1c2VzIDxhIGhyZWY9IiNsdWFfdG9sc3RyaW5nIj48Y29kZT5sdWFfdG9sc3RyaW5nPC9jb2RlPjwvYT4gdG8gZ2V0IGl0cyByZXN1bHQsCitzbyBhbGwgY29udmVyc2lvbnMgYW5kIGNhdmVhdHMgb2YgdGhhdCBmdW5jdGlvbiBhcHBseSBoZXJlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jaGVja3R5cGUiPjxjb2RlPmx1YUxfY2hlY2t0eXBlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YUxfY2hlY2t0eXBlIChsdWFfU3RhdGUgKkwsIGludCBhcmcsIGludCB0KTs8L3ByZT4KKworPHA+CitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+YXJnPC9jb2RlPiBoYXMgdHlwZSA8Y29kZT50PC9jb2RlPi4KK1NlZSA8YSBocmVmPSIjbHVhX3R5cGUiPjxjb2RlPmx1YV90eXBlPC9jb2RlPjwvYT4gZm9yIHRoZSBlbmNvZGluZyBvZiB0eXBlcyBmb3IgPGNvZGU+dDwvY29kZT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2NoZWNrdWRhdGEiPjxjb2RlPmx1YUxfY2hlY2t1ZGF0YTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCAqbHVhTF9jaGVja3VkYXRhIChsdWFfU3RhdGUgKkwsIGludCBhcmcsIGNvbnN0IGNoYXIgKnRuYW1lKTs8L3ByZT4KKworPHA+CitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+YXJnPC9jb2RlPiBpcyBhIHVzZXJkYXRhCitvZiB0aGUgdHlwZSA8Y29kZT50bmFtZTwvY29kZT4gKHNlZSA8YSBocmVmPSIjbHVhTF9uZXdtZXRhdGFibGUiPjxjb2RlPmx1YUxfbmV3bWV0YXRhYmxlPC9jb2RlPjwvYT4pIGFuZAorcmV0dXJucyB0aGUgdXNlcmRhdGEgYWRkcmVzcyAoc2VlIDxhIGhyZWY9IiNsdWFfdG91c2VyZGF0YSI+PGNvZGU+bHVhX3RvdXNlcmRhdGE8L2NvZGU+PC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2NoZWNrdW5zaWduZWQiPjxjb2RlPmx1YUxfY2hlY2t1bnNpZ25lZDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+bHVhX1Vuc2lnbmVkIGx1YUxfY2hlY2t1bnNpZ25lZCAobHVhX1N0YXRlICpMLCBpbnQgYXJnKTs8L3ByZT4KKworPHA+CitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+YXJnPC9jb2RlPiBpcyBhIG51bWJlcgorYW5kIHJldHVybnMgdGhpcyBudW1iZXIgY2FzdCB0byBhIDxhIGhyZWY9IiNsdWFfVW5zaWduZWQiPjxjb2RlPmx1YV9VbnNpZ25lZDwvY29kZT48L2E+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9jaGVja3ZlcnNpb24iPjxjb2RlPmx1YUxfY2hlY2t2ZXJzaW9uPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YUxfY2hlY2t2ZXJzaW9uIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK0NoZWNrcyB3aGV0aGVyIHRoZSBjb3JlIHJ1bm5pbmcgdGhlIGNhbGwsCit0aGUgY29yZSB0aGF0IGNyZWF0ZWQgdGhlIEx1YSBzdGF0ZSwKK2FuZCB0aGUgY29kZSBtYWtpbmcgdGhlIGNhbGwgYXJlIGFsbCB1c2luZyB0aGUgc2FtZSB2ZXJzaW9uIG9mIEx1YS4KK0Fsc28gY2hlY2tzIHdoZXRoZXIgdGhlIGNvcmUgcnVubmluZyB0aGUgY2FsbAorYW5kIHRoZSBjb3JlIHRoYXQgY3JlYXRlZCB0aGUgTHVhIHN0YXRlCithcmUgdXNpbmcgdGhlIHNhbWUgYWRkcmVzcyBzcGFjZS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfZG9maWxlIj48Y29kZT5sdWFMX2RvZmlsZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICs/LCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YUxfZG9maWxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTs8L3ByZT4KKworPHA+CitMb2FkcyBhbmQgcnVucyB0aGUgZ2l2ZW4gZmlsZS4KK0l0IGlzIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZyBtYWNybzoKKworPHByZT4KKyAgICAgKGx1YUxfbG9hZGZpbGUoTCwgZmlsZW5hbWUpIHx8IGx1YV9wY2FsbChMLCAwLCBMVUFfTVVMVFJFVCwgMCkpCis8L3ByZT48cD4KK0l0IHJldHVybnMgZmFsc2UgaWYgdGhlcmUgYXJlIG5vIGVycm9ycworb3IgdHJ1ZSBpbiBjYXNlIG9mIGVycm9ycy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfZG9zdHJpbmciPjxjb2RlPmx1YUxfZG9zdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArPywgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFMX2Rvc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnN0cik7PC9wcmU+CisKKzxwPgorTG9hZHMgYW5kIHJ1bnMgdGhlIGdpdmVuIHN0cmluZy4KK0l0IGlzIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZyBtYWNybzoKKworPHByZT4KKyAgICAgKGx1YUxfbG9hZHN0cmluZyhMLCBzdHIpIHx8IGx1YV9wY2FsbChMLCAwLCBMVUFfTVVMVFJFVCwgMCkpCis8L3ByZT48cD4KK0l0IHJldHVybnMgZmFsc2UgaWYgdGhlcmUgYXJlIG5vIGVycm9ycworb3IgdHJ1ZSBpbiBjYXNlIG9mIGVycm9ycy4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfZXJyb3IiPjxjb2RlPmx1YUxfZXJyb3I8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX2Vycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTs8L3ByZT4KKworPHA+CitSYWlzZXMgYW4gZXJyb3IuCitUaGUgZXJyb3IgbWVzc2FnZSBmb3JtYXQgaXMgZ2l2ZW4gYnkgPGNvZGU+Zm10PC9jb2RlPgorcGx1cyBhbnkgZXh0cmEgYXJndW1lbnRzLAorZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGVzIG9mIDxhIGhyZWY9IiNsdWFfcHVzaGZzdHJpbmciPjxjb2RlPmx1YV9wdXNoZnN0cmluZzwvY29kZT48L2E+LgorSXQgYWxzbyBhZGRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UgdGhlIGZpbGUgbmFtZSBhbmQKK3RoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsCitpZiB0aGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gbmV2ZXIgcmV0dXJucywKK2J1dCBpdCBpcyBhbiBpZGlvbSB0byB1c2UgaXQgaW4gQyZuYnNwO2Z1bmN0aW9ucworYXMgPGNvZGU+cmV0dXJuIGx1YUxfZXJyb3IoPGVtPmFyZ3M8L2VtPik8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9leGVjcmVzdWx0Ij48Y29kZT5sdWFMX2V4ZWNyZXN1bHQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMywgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX2V4ZWNyZXN1bHQgKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXQpOzwvcHJlPgorCis8cD4KK1RoaXMgZnVuY3Rpb24gcHJvZHVjZXMgdGhlIHJldHVybiB2YWx1ZXMgZm9yCitwcm9jZXNzLXJlbGF0ZWQgZnVuY3Rpb25zIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5CisoPGEgaHJlZj0iI3BkZi1vcy5leGVjdXRlIj48Y29kZT5vcy5leGVjdXRlPC9jb2RlPjwvYT4gYW5kIDxhIGhyZWY9IiNwZGYtaW8uY2xvc2UiPjxjb2RlPmlvLmNsb3NlPC9jb2RlPjwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9maWxlcmVzdWx0Ij48Y29kZT5sdWFMX2ZpbGVyZXN1bHQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArKDF8MyksIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9maWxlcmVzdWx0IChsdWFfU3RhdGUgKkwsIGludCBzdGF0LCBjb25zdCBjaGFyICpmbmFtZSk7PC9wcmU+CisKKzxwPgorVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyB0aGUgcmV0dXJuIHZhbHVlcyBmb3IKK2ZpbGUtcmVsYXRlZCBmdW5jdGlvbnMgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkKKyg8YSBocmVmPSIjcGRmLWlvLm9wZW4iPjxjb2RlPmlvLm9wZW48L2NvZGU+PC9hPiwgPGEgaHJlZj0iI3BkZi1vcy5yZW5hbWUiPjxjb2RlPm9zLnJlbmFtZTwvY29kZT48L2E+LCA8YSBocmVmPSIjcGRmLWZpbGU6c2VlayI+PGNvZGU+ZmlsZTpzZWVrPC9jb2RlPjwvYT4sIGV0Yy4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9nZXRtZXRhZmllbGQiPjxjb2RlPmx1YUxfZ2V0bWV0YWZpZWxkPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKygwfDEpLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+aW50IGx1YUxfZ2V0bWV0YWZpZWxkIChsdWFfU3RhdGUgKkwsIGludCBvYmosIGNvbnN0IGNoYXIgKmUpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgZmllbGQgPGNvZGU+ZTwvY29kZT4gZnJvbSB0aGUgbWV0YXRhYmxlCitvZiB0aGUgb2JqZWN0IGF0IGluZGV4IDxjb2RlPm9iajwvY29kZT4uCitJZiB0aGUgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSBtZXRhdGFibGUsCitvciBpZiB0aGUgbWV0YXRhYmxlIGRvZXMgbm90IGhhdmUgdGhpcyBmaWVsZCwKK3JldHVybnMgZmFsc2UgYW5kIHB1c2hlcyBub3RoaW5nLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9nZXRtZXRhdGFibGUiPjxjb2RlPmx1YUxfZ2V0bWV0YXRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsICZuZGFzaDtdPC9zcGFuPgorPHByZT52b2lkIGx1YUxfZ2V0bWV0YXRhYmxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnRuYW1lKTs8L3ByZT4KKworPHA+CitQdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIG1ldGF0YWJsZSBhc3NvY2lhdGVkIHdpdGggbmFtZSA8Y29kZT50bmFtZTwvY29kZT4KK2luIHRoZSByZWdpc3RyeSAoc2VlIDxhIGhyZWY9IiNsdWFMX25ld21ldGF0YWJsZSI+PGNvZGU+bHVhTF9uZXdtZXRhdGFibGU8L2NvZGU+PC9hPikuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2dldHN1YnRhYmxlIj48Y29kZT5sdWFMX2dldHN1YnRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9nZXRzdWJ0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBjb25zdCBjaGFyICpmbmFtZSk7PC9wcmU+CisKKzxwPgorRW5zdXJlcyB0aGF0IHRoZSB2YWx1ZSA8Y29kZT50W2ZuYW1lXTwvY29kZT4sCit3aGVyZSA8Y29kZT50PC9jb2RlPiBpcyB0aGUgdmFsdWUgYXQgaW5kZXggPGNvZGU+aWR4PC9jb2RlPiwKK2lzIGEgdGFibGUsCithbmQgcHVzaGVzIHRoYXQgdGFibGUgb250byB0aGUgc3RhY2suCitSZXR1cm5zIHRydWUgaWYgaXQgZmluZHMgYSBwcmV2aW91cyB0YWJsZSB0aGVyZQorYW5kIGZhbHNlIGlmIGl0IGNyZWF0ZXMgYSBuZXcgdGFibGUuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2dzdWIiPjxjb2RlPmx1YUxfZ3N1YjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y29uc3QgY2hhciAqbHVhTF9nc3ViIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnIpOzwvcHJlPgorCis8cD4KK0NyZWF0ZXMgYSBjb3B5IG9mIHN0cmluZyA8Y29kZT5zPC9jb2RlPiBieSByZXBsYWNpbmcKK2FueSBvY2N1cnJlbmNlIG9mIHRoZSBzdHJpbmcgPGNvZGU+cDwvY29kZT4KK3dpdGggdGhlIHN0cmluZyA8Y29kZT5yPC9jb2RlPi4KK1B1c2hlcyB0aGUgcmVzdWx0aW5nIHN0cmluZyBvbiB0aGUgc3RhY2sgYW5kIHJldHVybnMgaXQuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX2xlbiI+PGNvZGU+bHVhTF9sZW48L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX2xlbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOzwvcHJlPgorCis8cD4KK1JldHVybnMgdGhlICJsZW5ndGgiIG9mIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKK2FzIGEgbnVtYmVyOworaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgJzxjb2RlPiM8L2NvZGU+JyBvcGVyYXRvciBpbiBMdWEgKHNlZSA8YSBocmVmPSIjMy40LjYiPiZzZWN0OzMuNC42PC9hPikuCitSYWlzZXMgYW4gZXJyb3IgaWYgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhIG51bWJlci4KKyhUaGlzIGNhc2Ugb25seSBjYW4gaGFwcGVuIHRocm91Z2ggbWV0YW1ldGhvZHMuKQorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9sb2FkYnVmZmVyIj48Y29kZT5sdWFMX2xvYWRidWZmZXI8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFMX2xvYWRidWZmZXIgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3osCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTs8L3ByZT4KKworPHA+CitFcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNsdWFMX2xvYWRidWZmZXJ4Ij48Y29kZT5sdWFMX2xvYWRidWZmZXJ4PC9jb2RlPjwvYT4gd2l0aCA8Y29kZT5tb2RlPC9jb2RlPiBlcXVhbCB0byA8Y29kZT5OVUxMPC9jb2RlPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfbG9hZGJ1ZmZlcngiPjxjb2RlPmx1YUxfbG9hZGJ1ZmZlcng8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmludCBsdWFMX2xvYWRidWZmZXJ4IChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3osCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlKTs8L3ByZT4KKworPHA+CitMb2FkcyBhIGJ1ZmZlciBhcyBhIEx1YSBjaHVuay4KK1RoaXMgZnVuY3Rpb24gdXNlcyA8YSBocmVmPSIjbHVhX2xvYWQiPjxjb2RlPmx1YV9sb2FkPC9jb2RlPjwvYT4gdG8gbG9hZCB0aGUgY2h1bmsgaW4gdGhlCitidWZmZXIgcG9pbnRlZCB0byBieSA8Y29kZT5idWZmPC9jb2RlPiB3aXRoIHNpemUgPGNvZGU+c3o8L2NvZGU+LgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIHJlc3VsdHMgYXMgPGEgaHJlZj0iI2x1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+LgorPGNvZGU+bmFtZTwvY29kZT4gaXMgdGhlIGNodW5rIG5hbWUsCit1c2VkIGZvciBkZWJ1ZyBpbmZvcm1hdGlvbiBhbmQgZXJyb3IgbWVzc2FnZXMuCitUaGUgc3RyaW5nIDxjb2RlPm1vZGU8L2NvZGU+IHdvcmtzIGFzIGluIGZ1bmN0aW9uIDxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfbG9hZGZpbGUiPjxjb2RlPmx1YUxfbG9hZGZpbGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX2xvYWRmaWxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTs8L3ByZT4KKworPHA+CitFcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNsdWFMX2xvYWRmaWxleCI+PGNvZGU+bHVhTF9sb2FkZmlsZXg8L2NvZGU+PC9hPiB3aXRoIDxjb2RlPm1vZGU8L2NvZGU+IGVxdWFsIHRvIDxjb2RlPk5VTEw8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9sb2FkZmlsZXgiPjxjb2RlPmx1YUxfbG9hZGZpbGV4PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9sb2FkZmlsZXggKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGUpOzwvcHJlPgorCis8cD4KK0xvYWRzIGEgZmlsZSBhcyBhIEx1YSBjaHVuay4KK1RoaXMgZnVuY3Rpb24gdXNlcyA8YSBocmVmPSIjbHVhX2xvYWQiPjxjb2RlPmx1YV9sb2FkPC9jb2RlPjwvYT4gdG8gbG9hZCB0aGUgY2h1bmsgaW4gdGhlIGZpbGUKK25hbWVkIDxjb2RlPmZpbGVuYW1lPC9jb2RlPi4KK0lmIDxjb2RlPmZpbGVuYW1lPC9jb2RlPiBpcyA8Y29kZT5OVUxMPC9jb2RlPiwKK3RoZW4gaXQgbG9hZHMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQuCitUaGUgZmlyc3QgbGluZSBpbiB0aGUgZmlsZSBpcyBpZ25vcmVkIGlmIGl0IHN0YXJ0cyB3aXRoIGEgPGNvZGU+IzwvY29kZT4uCisKKworPHA+CitUaGUgc3RyaW5nIDxjb2RlPm1vZGU8L2NvZGU+IHdvcmtzIGFzIGluIGZ1bmN0aW9uIDxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPi4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSByZXN1bHRzIGFzIDxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPiwKK2J1dCBpdCBoYXMgYW4gZXh0cmEgZXJyb3IgY29kZSA8YSBuYW1lPSJwZGYtTFVBX0VSUkZJTEUiPjxjb2RlPkxVQV9FUlJGSUxFPC9jb2RlPjwvYT4KK2lmIGl0IGNhbm5vdCBvcGVuL3JlYWQgdGhlIGZpbGUgb3IgdGhlIGZpbGUgaGFzIGEgd3JvbmcgbW9kZS4KKworCis8cD4KK0FzIDxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPiwgdGhpcyBmdW5jdGlvbiBvbmx5IGxvYWRzIHRoZSBjaHVuazsKK2l0IGRvZXMgbm90IHJ1biBpdC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfbG9hZHN0cmluZyI+PGNvZGU+bHVhTF9sb2Fkc3RyaW5nPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsICZuZGFzaDtdPC9zcGFuPgorPHByZT5pbnQgbHVhTF9sb2Fkc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMpOzwvcHJlPgorCis8cD4KK0xvYWRzIGEgc3RyaW5nIGFzIGEgTHVhIGNodW5rLgorVGhpcyBmdW5jdGlvbiB1c2VzIDxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPiB0byBsb2FkIHRoZSBjaHVuayBpbgordGhlIHplcm8tdGVybWluYXRlZCBzdHJpbmcgPGNvZGU+czwvY29kZT4uCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgcmVzdWx0cyBhcyA8YSBocmVmPSIjbHVhX2xvYWQiPjxjb2RlPmx1YV9sb2FkPC9jb2RlPjwvYT4uCisKKworPHA+CitBbHNvIGFzIDxhIGhyZWY9IiNsdWFfbG9hZCI+PGNvZGU+bHVhX2xvYWQ8L2NvZGU+PC9hPiwgdGhpcyBmdW5jdGlvbiBvbmx5IGxvYWRzIHRoZSBjaHVuazsKK2l0IGRvZXMgbm90IHJ1biBpdC4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfbmV3bGliIj48Y29kZT5sdWFMX25ld2xpYjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX25ld2xpYiAobHVhX1N0YXRlICpMLCBjb25zdCBsdWFMX1JlZyAqbCk7PC9wcmU+CisKKzxwPgorQ3JlYXRlcyBhIG5ldyB0YWJsZSBhbmQgcmVnaXN0ZXJzIHRoZXJlCit0aGUgZnVuY3Rpb25zIGluIGxpc3QgPGNvZGU+bDwvY29kZT4uCitJdCBpcyBpbXBsZW1lbnRlZCBhcyB0aGUgZm9sbG93aW5nIG1hY3JvOgorCis8cHJlPgorICAgICAobHVhTF9uZXdsaWJ0YWJsZShMLGwpLCBsdWFMX3NldGZ1bmNzKEwsbCwwKSkKKzwvcHJlPgorCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfbmV3bGlidGFibGUiPjxjb2RlPmx1YUxfbmV3bGlidGFibGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9uZXdsaWJ0YWJsZSAobHVhX1N0YXRlICpMLCBjb25zdCBsdWFMX1JlZyBsW10pOzwvcHJlPgorCis8cD4KK0NyZWF0ZXMgYSBuZXcgdGFibGUgd2l0aCBhIHNpemUgb3B0aW1pemVkCit0byBzdG9yZSBhbGwgZW50cmllcyBpbiB0aGUgYXJyYXkgPGNvZGU+bDwvY29kZT4KKyhidXQgZG9lcyBub3QgYWN0dWFsbHkgc3RvcmUgdGhlbSkuCitJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggPGEgaHJlZj0iI2x1YUxfc2V0ZnVuY3MiPjxjb2RlPmx1YUxfc2V0ZnVuY3M8L2NvZGU+PC9hPgorKHNlZSA8YSBocmVmPSIjbHVhTF9uZXdsaWIiPjxjb2RlPmx1YUxfbmV3bGliPC9jb2RlPjwvYT4pLgorCisKKzxwPgorSXQgaXMgaW1wbGVtZW50ZWQgYXMgYSBtYWNyby4KK1RoZSBhcnJheSA8Y29kZT5sPC9jb2RlPiBtdXN0IGJlIHRoZSBhY3R1YWwgYXJyYXksCitub3QgYSBwb2ludGVyIHRvIGl0LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9uZXdtZXRhdGFibGUiPjxjb2RlPmx1YUxfbmV3bWV0YXRhYmxlPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9uZXdtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqdG5hbWUpOzwvcHJlPgorCis8cD4KK0lmIHRoZSByZWdpc3RyeSBhbHJlYWR5IGhhcyB0aGUga2V5IDxjb2RlPnRuYW1lPC9jb2RlPiwKK3JldHVybnMgMC4KK090aGVyd2lzZSwKK2NyZWF0ZXMgYSBuZXcgdGFibGUgdG8gYmUgdXNlZCBhcyBhIG1ldGF0YWJsZSBmb3IgdXNlcmRhdGEsCithZGRzIGl0IHRvIHRoZSByZWdpc3RyeSB3aXRoIGtleSA8Y29kZT50bmFtZTwvY29kZT4sCithbmQgcmV0dXJucyAxLgorCisKKzxwPgorSW4gYm90aCBjYXNlcyBwdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIGZpbmFsIHZhbHVlIGFzc29jaWF0ZWQKK3dpdGggPGNvZGU+dG5hbWU8L2NvZGU+IGluIHRoZSByZWdpc3RyeS4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfbmV3c3RhdGUiPjxjb2RlPmx1YUxfbmV3c3RhdGU8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgJm5kYXNoO108L3NwYW4+Cis8cHJlPmx1YV9TdGF0ZSAqbHVhTF9uZXdzdGF0ZSAodm9pZCk7PC9wcmU+CisKKzxwPgorQ3JlYXRlcyBhIG5ldyBMdWEgc3RhdGUuCitJdCBjYWxscyA8YSBocmVmPSIjbHVhX25ld3N0YXRlIj48Y29kZT5sdWFfbmV3c3RhdGU8L2NvZGU+PC9hPiB3aXRoIGFuCithbGxvY2F0b3IgYmFzZWQgb24gdGhlIHN0YW5kYXJkJm5ic3A7QyA8Y29kZT5yZWFsbG9jPC9jb2RlPiBmdW5jdGlvbgorYW5kIHRoZW4gc2V0cyBhIHBhbmljIGZ1bmN0aW9uIChzZWUgPGEgaHJlZj0iIzQuNiI+JnNlY3Q7NC42PC9hPikgdGhhdCBwcmludHMKK2FuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCBpbiBjYXNlIG9mIGZhdGFsCitlcnJvcnMuCisKKworPHA+CitSZXR1cm5zIHRoZSBuZXcgc3RhdGUsCitvciA8Y29kZT5OVUxMPC9jb2RlPiBpZiB0aGVyZSBpcyBhIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9vcGVubGlicyI+PGNvZGU+bHVhTF9vcGVubGliczwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX29wZW5saWJzIChsdWFfU3RhdGUgKkwpOzwvcHJlPgorCis8cD4KK09wZW5zIGFsbCBzdGFuZGFyZCBMdWEgbGlicmFyaWVzIGludG8gdGhlIGdpdmVuIHN0YXRlLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9vcHRpbnQiPjxjb2RlPmx1YUxfb3B0aW50PC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT5pbnQgbHVhTF9vcHRpbnQgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZywgaW50IGQpOzwvcHJlPgorCis8cD4KK0lmIHRoZSBmdW5jdGlvbiBhcmd1bWVudCA8Y29kZT5hcmc8L2NvZGU+IGlzIGEgbnVtYmVyLAorcmV0dXJucyB0aGlzIG51bWJlciBjYXN0IHRvIGFuIDxjb2RlPmludDwvY29kZT4uCitJZiB0aGlzIGFyZ3VtZW50IGlzIGFic2VudCBvciBpcyA8Yj5uaWw8L2I+LAorcmV0dXJucyA8Y29kZT5kPC9jb2RlPi4KK090aGVyd2lzZSwgcmFpc2VzIGFuIGVycm9yLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9vcHRpbnRlZ2VyIj48Y29kZT5sdWFMX29wdGludGVnZXI8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmx1YV9JbnRlZ2VyIGx1YUxfb3B0aW50ZWdlciAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFfSW50ZWdlciBkKTs8L3ByZT4KKworPHA+CitJZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+YXJnPC9jb2RlPiBpcyBhIG51bWJlciwKK3JldHVybnMgdGhpcyBudW1iZXIgY2FzdCB0byBhIDxhIGhyZWY9IiNsdWFfSW50ZWdlciI+PGNvZGU+bHVhX0ludGVnZXI8L2NvZGU+PC9hPi4KK0lmIHRoaXMgYXJndW1lbnQgaXMgYWJzZW50IG9yIGlzIDxiPm5pbDwvYj4sCityZXR1cm5zIDxjb2RlPmQ8L2NvZGU+LgorT3RoZXJ3aXNlLCByYWlzZXMgYW4gZXJyb3IuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX29wdGxvbmciPjxjb2RlPmx1YUxfb3B0bG9uZzwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCA8ZW0+djwvZW0+XTwvc3Bhbj4KKzxwcmU+bG9uZyBsdWFMX29wdGxvbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZywgbG9uZyBkKTs8L3ByZT4KKworPHA+CitJZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+YXJnPC9jb2RlPiBpcyBhIG51bWJlciwKK3JldHVybnMgdGhpcyBudW1iZXIgY2FzdCB0byBhIDxjb2RlPmxvbmc8L2NvZGU+LgorSWYgdGhpcyBhcmd1bWVudCBpcyBhYnNlbnQgb3IgaXMgPGI+bmlsPC9iPiwKK3JldHVybnMgPGNvZGU+ZDwvY29kZT4uCitPdGhlcndpc2UsIHJhaXNlcyBhbiBlcnJvci4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfb3B0bHN0cmluZyI+PGNvZGU+bHVhTF9vcHRsc3RyaW5nPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT5jb25zdCBjaGFyICpsdWFMX29wdGxzdHJpbmcgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsKTs8L3ByZT4KKworPHA+CitJZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+YXJnPC9jb2RlPiBpcyBhIHN0cmluZywKK3JldHVybnMgdGhpcyBzdHJpbmcuCitJZiB0aGlzIGFyZ3VtZW50IGlzIGFic2VudCBvciBpcyA8Yj5uaWw8L2I+LAorcmV0dXJucyA8Y29kZT5kPC9jb2RlPi4KK090aGVyd2lzZSwgcmFpc2VzIGFuIGVycm9yLgorCisKKzxwPgorSWYgPGNvZGU+bDwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LAorZmlsbHMgdGhlIHBvc2l0aW9uIDxjb2RlPipsPC9jb2RlPiB3aXRoIHRoZSByZXN1bHQncyBsZW5ndGguCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX29wdG51bWJlciI+PGNvZGU+bHVhTF9vcHRudW1iZXI8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmx1YV9OdW1iZXIgbHVhTF9vcHRudW1iZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZywgbHVhX051bWJlciBkKTs8L3ByZT4KKworPHA+CitJZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgPGNvZGU+YXJnPC9jb2RlPiBpcyBhIG51bWJlciwKK3JldHVybnMgdGhpcyBudW1iZXIuCitJZiB0aGlzIGFyZ3VtZW50IGlzIGFic2VudCBvciBpcyA8Yj5uaWw8L2I+LAorcmV0dXJucyA8Y29kZT5kPC9jb2RlPi4KK090aGVyd2lzZSwgcmFpc2VzIGFuIGVycm9yLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9vcHRzdHJpbmciPjxjb2RlPmx1YUxfb3B0c3RyaW5nPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT52PC9lbT5dPC9zcGFuPgorPHByZT5jb25zdCBjaGFyICpsdWFMX29wdHN0cmluZyAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZCk7PC9wcmU+CisKKzxwPgorSWYgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPmFyZzwvY29kZT4gaXMgYSBzdHJpbmcsCityZXR1cm5zIHRoaXMgc3RyaW5nLgorSWYgdGhpcyBhcmd1bWVudCBpcyBhYnNlbnQgb3IgaXMgPGI+bmlsPC9iPiwKK3JldHVybnMgPGNvZGU+ZDwvY29kZT4uCitPdGhlcndpc2UsIHJhaXNlcyBhbiBlcnJvci4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfb3B0dW5zaWduZWQiPjxjb2RlPmx1YUxfb3B0dW5zaWduZWQ8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMCwgPGVtPnY8L2VtPl08L3NwYW4+Cis8cHJlPmx1YV9VbnNpZ25lZCBsdWFMX29wdHVuc2lnbmVkIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFfVW5zaWduZWQgdSk7PC9wcmU+CisKKzxwPgorSWYgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IDxjb2RlPmFyZzwvY29kZT4gaXMgYSBudW1iZXIsCityZXR1cm5zIHRoaXMgbnVtYmVyIGNhc3QgdG8gYSA8YSBocmVmPSIjbHVhX1Vuc2lnbmVkIj48Y29kZT5sdWFfVW5zaWduZWQ8L2NvZGU+PC9hPi4KK0lmIHRoaXMgYXJndW1lbnQgaXMgYWJzZW50IG9yIGlzIDxiPm5pbDwvYj4sCityZXR1cm5zIDxjb2RlPnU8L2NvZGU+LgorT3RoZXJ3aXNlLCByYWlzZXMgYW4gZXJyb3IuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX3ByZXBidWZmZXIiPjxjb2RlPmx1YUxfcHJlcGJ1ZmZlcjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLT8sICs/LCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y2hhciAqbHVhTF9wcmVwYnVmZmVyIChsdWFMX0J1ZmZlciAqQik7PC9wcmU+CisKKzxwPgorRXF1aXZhbGVudCB0byA8YSBocmVmPSIjbHVhTF9wcmVwYnVmZnNpemUiPjxjb2RlPmx1YUxfcHJlcGJ1ZmZzaXplPC9jb2RlPjwvYT4KK3dpdGggdGhlIHByZWRlZmluZWQgc2l6ZSA8YSBuYW1lPSJwZGYtTFVBTF9CVUZGRVJTSVpFIj48Y29kZT5MVUFMX0JVRkZFUlNJWkU8L2NvZGU+PC9hPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfcHJlcGJ1ZmZzaXplIj48Y29kZT5sdWFMX3ByZXBidWZmc2l6ZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLT8sICs/LCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+Y2hhciAqbHVhTF9wcmVwYnVmZnNpemUgKGx1YUxfQnVmZmVyICpCLCBzaXplX3Qgc3opOzwvcHJlPgorCis8cD4KK1JldHVybnMgYW4gYWRkcmVzcyB0byBhIHNwYWNlIG9mIHNpemUgPGNvZGU+c3o8L2NvZGU+Cit3aGVyZSB5b3UgY2FuIGNvcHkgYSBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYnVmZmVyIDxjb2RlPkI8L2NvZGU+Cisoc2VlIDxhIGhyZWY9IiNsdWFMX0J1ZmZlciI+PGNvZGU+bHVhTF9CdWZmZXI8L2NvZGU+PC9hPikuCitBZnRlciBjb3B5aW5nIHRoZSBzdHJpbmcgaW50byB0aGlzIHNwYWNlIHlvdSBtdXN0IGNhbGwKKzxhIGhyZWY9IiNsdWFMX2FkZHNpemUiPjxjb2RlPmx1YUxfYWRkc2l6ZTwvY29kZT48L2E+IHdpdGggdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0byBhY3R1YWxseSBhZGQKK2l0IHRvIHRoZSBidWZmZXIuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX3B1c2hyZXN1bHQiPjxjb2RlPmx1YUxfcHVzaHJlc3VsdDwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLT8sICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX3B1c2hyZXN1bHQgKGx1YUxfQnVmZmVyICpCKTs8L3ByZT4KKworPHA+CitGaW5pc2hlcyB0aGUgdXNlIG9mIGJ1ZmZlciA8Y29kZT5CPC9jb2RlPiBsZWF2aW5nIHRoZSBmaW5hbCBzdHJpbmcgb24KK3RoZSB0b3Agb2YgdGhlIHN0YWNrLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9wdXNocmVzdWx0c2l6ZSI+PGNvZGU+bHVhTF9wdXNocmVzdWx0c2l6ZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLT8sICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX3B1c2hyZXN1bHRzaXplIChsdWFMX0J1ZmZlciAqQiwgc2l6ZV90IHN6KTs8L3ByZT4KKworPHA+CitFcXVpdmFsZW50IHRvIHRoZSBzZXF1ZW5jZSA8YSBocmVmPSIjbHVhTF9hZGRzaXplIj48Y29kZT5sdWFMX2FkZHNpemU8L2NvZGU+PC9hPiwgPGEgaHJlZj0iI2x1YUxfcHVzaHJlc3VsdCI+PGNvZGU+bHVhTF9wdXNocmVzdWx0PC9jb2RlPjwvYT4uCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX3JlZiI+PGNvZGU+bHVhTF9yZWY8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0xLCArMCwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmludCBsdWFMX3JlZiAobHVhX1N0YXRlICpMLCBpbnQgdCk7PC9wcmU+CisKKzxwPgorQ3JlYXRlcyBhbmQgcmV0dXJucyBhIDxlbT5yZWZlcmVuY2U8L2VtPiwKK2luIHRoZSB0YWJsZSBhdCBpbmRleCA8Y29kZT50PC9jb2RlPiwKK2ZvciB0aGUgb2JqZWN0IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIChhbmQgcG9wcyB0aGUgb2JqZWN0KS4KKworCis8cD4KK0EgcmVmZXJlbmNlIGlzIGEgdW5pcXVlIGludGVnZXIga2V5LgorQXMgbG9uZyBhcyB5b3UgZG8gbm90IG1hbnVhbGx5IGFkZCBpbnRlZ2VyIGtleXMgaW50byB0YWJsZSA8Y29kZT50PC9jb2RlPiwKKzxhIGhyZWY9IiNsdWFMX3JlZiI+PGNvZGU+bHVhTF9yZWY8L2NvZGU+PC9hPiBlbnN1cmVzIHRoZSB1bmlxdWVuZXNzIG9mIHRoZSBrZXkgaXQgcmV0dXJucy4KK1lvdSBjYW4gcmV0cmlldmUgYW4gb2JqZWN0IHJlZmVycmVkIGJ5IHJlZmVyZW5jZSA8Y29kZT5yPC9jb2RlPgorYnkgY2FsbGluZyA8Y29kZT5sdWFfcmF3Z2V0aShMLCB0LCByKTwvY29kZT4uCitGdW5jdGlvbiA8YSBocmVmPSIjbHVhTF91bnJlZiI+PGNvZGU+bHVhTF91bnJlZjwvY29kZT48L2E+IGZyZWVzIGEgcmVmZXJlbmNlIGFuZCBpdHMgYXNzb2NpYXRlZCBvYmplY3QuCisKKworPHA+CitJZiB0aGUgb2JqZWN0IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIDxiPm5pbDwvYj4sCis8YSBocmVmPSIjbHVhTF9yZWYiPjxjb2RlPmx1YUxfcmVmPC9jb2RlPjwvYT4gcmV0dXJucyB0aGUgY29uc3RhbnQgPGEgbmFtZT0icGRmLUxVQV9SRUZOSUwiPjxjb2RlPkxVQV9SRUZOSUw8L2NvZGU+PC9hPi4KK1RoZSBjb25zdGFudCA8YSBuYW1lPSJwZGYtTFVBX05PUkVGIj48Y29kZT5MVUFfTk9SRUY8L2NvZGU+PC9hPiBpcyBndWFyYW50ZWVkIHRvIGJlIGRpZmZlcmVudAorZnJvbSBhbnkgcmVmZXJlbmNlIHJldHVybmVkIGJ5IDxhIGhyZWY9IiNsdWFMX3JlZiI+PGNvZGU+bHVhTF9yZWY8L2NvZGU+PC9hPi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfUmVnIj48Y29kZT5sdWFMX1JlZzwvY29kZT48L2E+PC9oMz4KKzxwcmU+dHlwZWRlZiBzdHJ1Y3QgbHVhTF9SZWcgeworICBjb25zdCBjaGFyICpuYW1lOworICBsdWFfQ0Z1bmN0aW9uIGZ1bmM7Cit9IGx1YUxfUmVnOzwvcHJlPgorCis8cD4KK1R5cGUgZm9yIGFycmF5cyBvZiBmdW5jdGlvbnMgdG8gYmUgcmVnaXN0ZXJlZCBieQorPGEgaHJlZj0iI2x1YUxfc2V0ZnVuY3MiPjxjb2RlPmx1YUxfc2V0ZnVuY3M8L2NvZGU+PC9hPi4KKzxjb2RlPm5hbWU8L2NvZGU+IGlzIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCA8Y29kZT5mdW5jPC9jb2RlPiBpcyBhIHBvaW50ZXIgdG8KK3RoZSBmdW5jdGlvbi4KK0FueSBhcnJheSBvZiA8YSBocmVmPSIjbHVhTF9SZWciPjxjb2RlPmx1YUxfUmVnPC9jb2RlPjwvYT4gbXVzdCBlbmQgd2l0aCBhbiBzZW50aW5lbCBlbnRyeQoraW4gd2hpY2ggYm90aCA8Y29kZT5uYW1lPC9jb2RlPiBhbmQgPGNvZGU+ZnVuYzwvY29kZT4gYXJlIDxjb2RlPk5VTEw8L2NvZGU+LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF9yZXF1aXJlZiI+PGNvZGU+bHVhTF9yZXF1aXJlZjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX3JlcXVpcmVmIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm1vZG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGx1YV9DRnVuY3Rpb24gb3BlbmYsIGludCBnbGIpOzwvcHJlPgorCis8cD4KK0NhbGxzIGZ1bmN0aW9uIDxjb2RlPm9wZW5mPC9jb2RlPiB3aXRoIHN0cmluZyA8Y29kZT5tb2RuYW1lPC9jb2RlPiBhcyBhbiBhcmd1bWVudAorYW5kIHNldHMgdGhlIGNhbGwgcmVzdWx0IGluIDxjb2RlPnBhY2thZ2UubG9hZGVkW21vZG5hbWVdPC9jb2RlPiwKK2FzIGlmIHRoYXQgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkIHRocm91Z2ggPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4uCisKKworPHA+CitJZiA8Y29kZT5nbGI8L2NvZGU+IGlzIHRydWUsCithbHNvIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gZ2xvYmFsIDxjb2RlPm1vZG5hbWU8L2NvZGU+LgorCisKKzxwPgorTGVhdmVzIGEgY29weSBvZiB0aGF0IHJlc3VsdCBvbiB0aGUgc3RhY2suCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX3NldGZ1bmNzIj48Y29kZT5sdWFMX3NldGZ1bmNzPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstbnVwLCArMCwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPnZvaWQgbHVhTF9zZXRmdW5jcyAobHVhX1N0YXRlICpMLCBjb25zdCBsdWFMX1JlZyAqbCwgaW50IG51cCk7PC9wcmU+CisKKzxwPgorUmVnaXN0ZXJzIGFsbCBmdW5jdGlvbnMgaW4gdGhlIGFycmF5IDxjb2RlPmw8L2NvZGU+Cisoc2VlIDxhIGhyZWY9IiNsdWFMX1JlZyI+PGNvZGU+bHVhTF9SZWc8L2NvZGU+PC9hPikgaW50byB0aGUgdGFibGUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sKKyhiZWxvdyBvcHRpb25hbCB1cHZhbHVlcywgc2VlIG5leHQpLgorCisKKzxwPgorV2hlbiA8Y29kZT5udXA8L2NvZGU+IGlzIG5vdCB6ZXJvLAorYWxsIGZ1bmN0aW9ucyBhcmUgY3JlYXRlZCBzaGFyaW5nIDxjb2RlPm51cDwvY29kZT4gdXB2YWx1ZXMsCit3aGljaCBtdXN0IGJlIHByZXZpb3VzbHkgcHVzaGVkIG9uIHRoZSBzdGFjaworb24gdG9wIG9mIHRoZSBsaWJyYXJ5IHRhYmxlLgorVGhlc2UgdmFsdWVzIGFyZSBwb3BwZWQgZnJvbSB0aGUgc3RhY2sgYWZ0ZXIgdGhlIHJlZ2lzdHJhdGlvbi4KKworCisKKworCis8aHI+PGgzPjxhIG5hbWU9Imx1YUxfc2V0bWV0YXRhYmxlIj48Y29kZT5sdWFMX3NldG1ldGF0YWJsZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX3NldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICp0bmFtZSk7PC9wcmU+CisKKzxwPgorU2V0cyB0aGUgbWV0YXRhYmxlIG9mIHRoZSBvYmplY3QgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKK2FzIHRoZSBtZXRhdGFibGUgYXNzb2NpYXRlZCB3aXRoIG5hbWUgPGNvZGU+dG5hbWU8L2NvZGU+CitpbiB0aGUgcmVnaXN0cnkgKHNlZSA8YSBocmVmPSIjbHVhTF9uZXdtZXRhdGFibGUiPjxjb2RlPmx1YUxfbmV3bWV0YXRhYmxlPC9jb2RlPjwvYT4pLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF90ZXN0dWRhdGEiPjxjb2RlPmx1YUxfdGVzdHVkYXRhPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkICpsdWFMX3Rlc3R1ZGF0YSAobHVhX1N0YXRlICpMLCBpbnQgYXJnLCBjb25zdCBjaGFyICp0bmFtZSk7PC9wcmU+CisKKzxwPgorVGhpcyBmdW5jdGlvbiB3b3JrcyBsaWtlIDxhIGhyZWY9IiNsdWFMX2NoZWNrdWRhdGEiPjxjb2RlPmx1YUxfY2hlY2t1ZGF0YTwvY29kZT48L2E+LAorZXhjZXB0IHRoYXQsIHdoZW4gdGhlIHRlc3QgZmFpbHMsCitpdCByZXR1cm5zIDxjb2RlPk5VTEw8L2NvZGU+IGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IuCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX3RvbHN0cmluZyI+PGNvZGU+bHVhTF90b2xzdHJpbmc8L2NvZGU+PC9hPjwvaDM+PHA+Cis8c3BhbiBjbGFzcz0iYXBpaSI+Wy0wLCArMSwgPGVtPmU8L2VtPl08L3NwYW4+Cis8cHJlPmNvbnN0IGNoYXIgKmx1YUxfdG9sc3RyaW5nIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIHNpemVfdCAqbGVuKTs8L3ByZT4KKworPHA+CitDb252ZXJ0cyBhbnkgTHVhIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCB0byBhIEMmbmJzcDtzdHJpbmcKK2luIGEgcmVhc29uYWJsZSBmb3JtYXQuCitUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBwdXNoZWQgb250byB0aGUgc3RhY2sgYW5kIGFsc28KK3JldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4KK0lmIDxjb2RlPmxlbjwvY29kZT4gaXMgbm90IDxjb2RlPk5VTEw8L2NvZGU+LAordGhlIGZ1bmN0aW9uIGFsc28gc2V0cyA8Y29kZT4qbGVuPC9jb2RlPiB3aXRoIHRoZSBzdHJpbmcgbGVuZ3RoLgorCisKKzxwPgorSWYgdGhlIHZhbHVlIGhhcyBhIG1ldGF0YWJsZSB3aXRoIGEgPGNvZGU+Il9fdG9zdHJpbmciPC9jb2RlPiBmaWVsZCwKK3RoZW4gPGNvZGU+bHVhTF90b2xzdHJpbmc8L2NvZGU+IGNhbGxzIHRoZSBjb3JyZXNwb25kaW5nIG1ldGFtZXRob2QKK3dpdGggdGhlIHZhbHVlIGFzIGFyZ3VtZW50LAorYW5kIHVzZXMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBhcyBpdHMgcmVzdWx0LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF90cmFjZWJhY2siPjxjb2RlPmx1YUxfdHJhY2ViYWNrPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzEsIDxlbT5lPC9lbT5dPC9zcGFuPgorPHByZT52b2lkIGx1YUxfdHJhY2ViYWNrIChsdWFfU3RhdGUgKkwsIGx1YV9TdGF0ZSAqTDEsIGNvbnN0IGNoYXIgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCk7PC9wcmU+CisKKzxwPgorQ3JlYXRlcyBhbmQgcHVzaGVzIGEgdHJhY2ViYWNrIG9mIHRoZSBzdGFjayA8Y29kZT5MMTwvY29kZT4uCitJZiA8Y29kZT5tc2c8L2NvZGU+IGlzIG5vdCA8Y29kZT5OVUxMPC9jb2RlPiBpdCBpcyBhcHBlbmRlZAorYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhY2ViYWNrLgorVGhlIDxjb2RlPmxldmVsPC9jb2RlPiBwYXJhbWV0ZXIgdGVsbHMgYXQgd2hpY2ggbGV2ZWwKK3RvIHN0YXJ0IHRoZSB0cmFjZWJhY2suCisKKworCisKKworPGhyPjxoMz48YSBuYW1lPSJsdWFMX3R5cGVuYW1lIj48Y29kZT5sdWFMX3R5cGVuYW1lPC9jb2RlPjwvYT48L2gzPjxwPgorPHNwYW4gY2xhc3M9ImFwaWkiPlstMCwgKzAsICZuZGFzaDtdPC9zcGFuPgorPHByZT5jb25zdCBjaGFyICpsdWFMX3R5cGVuYW1lIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7PC9wcmU+CisKKzxwPgorUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4LgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF91bnJlZiI+PGNvZGU+bHVhTF91bnJlZjwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICswLCAmbmRhc2g7XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX3VucmVmIChsdWFfU3RhdGUgKkwsIGludCB0LCBpbnQgcmVmKTs8L3ByZT4KKworPHA+CitSZWxlYXNlcyByZWZlcmVuY2UgPGNvZGU+cmVmPC9jb2RlPiBmcm9tIHRoZSB0YWJsZSBhdCBpbmRleCA8Y29kZT50PC9jb2RlPgorKHNlZSA8YSBocmVmPSIjbHVhTF9yZWYiPjxjb2RlPmx1YUxfcmVmPC9jb2RlPjwvYT4pLgorVGhlIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUsCitzbyB0aGF0IHRoZSByZWZlcnJlZCBvYmplY3QgY2FuIGJlIGNvbGxlY3RlZC4KK1RoZSByZWZlcmVuY2UgPGNvZGU+cmVmPC9jb2RlPiBpcyBhbHNvIGZyZWVkIHRvIGJlIHVzZWQgYWdhaW4uCisKKworPHA+CitJZiA8Y29kZT5yZWY8L2NvZGU+IGlzIDxhIGhyZWY9IiNwZGYtTFVBX05PUkVGIj48Y29kZT5MVUFfTk9SRUY8L2NvZGU+PC9hPiBvciA8YSBocmVmPSIjcGRmLUxVQV9SRUZOSUwiPjxjb2RlPkxVQV9SRUZOSUw8L2NvZGU+PC9hPiwKKzxhIGhyZWY9IiNsdWFMX3VucmVmIj48Y29kZT5sdWFMX3VucmVmPC9jb2RlPjwvYT4gZG9lcyBub3RoaW5nLgorCisKKworCisKKzxocj48aDM+PGEgbmFtZT0ibHVhTF93aGVyZSI+PGNvZGU+bHVhTF93aGVyZTwvY29kZT48L2E+PC9oMz48cD4KKzxzcGFuIGNsYXNzPSJhcGlpIj5bLTAsICsxLCA8ZW0+ZTwvZW0+XTwvc3Bhbj4KKzxwcmU+dm9pZCBsdWFMX3doZXJlIChsdWFfU3RhdGUgKkwsIGludCBsdmwpOzwvcHJlPgorCis8cD4KK1B1c2hlcyBvbnRvIHRoZSBzdGFjayBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgY3VycmVudCBwb3NpdGlvbgorb2YgdGhlIGNvbnRyb2wgYXQgbGV2ZWwgPGNvZGU+bHZsPC9jb2RlPiBpbiB0aGUgY2FsbCBzdGFjay4KK1R5cGljYWxseSB0aGlzIHN0cmluZyBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKzxwcmU+CisgICAgIDxlbT5jaHVua25hbWU8L2VtPjo8ZW0+Y3VycmVudGxpbmU8L2VtPjoKKzwvcHJlPjxwPgorTGV2ZWwmbmJzcDswIGlzIHRoZSBydW5uaW5nIGZ1bmN0aW9uLAorbGV2ZWwmbmJzcDsxIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxlZCB0aGUgcnVubmluZyBmdW5jdGlvbiwKK2V0Yy4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBidWlsZCBhIHByZWZpeCBmb3IgZXJyb3IgbWVzc2FnZXMuCisKKworCisKKworCisKKzxoMT42ICZuZGFzaDsgPGEgbmFtZT0iNiI+U3RhbmRhcmQgTGlicmFyaWVzPC9hPjwvaDE+CisKKzxwPgorVGhlIHN0YW5kYXJkIEx1YSBsaWJyYXJpZXMgcHJvdmlkZSB1c2VmdWwgZnVuY3Rpb25zCit0aGF0IGFyZSBpbXBsZW1lbnRlZCBkaXJlY3RseSB0aHJvdWdoIHRoZSBDJm5ic3A7QVBJLgorU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBlc3NlbnRpYWwgc2VydmljZXMgdG8gdGhlIGxhbmd1YWdlCisoZS5nLiwgPGEgaHJlZj0iI3BkZi10eXBlIj48Y29kZT50eXBlPC9jb2RlPjwvYT4gYW5kIDxhIGhyZWY9IiNwZGYtZ2V0bWV0YXRhYmxlIj48Y29kZT5nZXRtZXRhdGFibGU8L2NvZGU+PC9hPik7CitvdGhlcnMgcHJvdmlkZSBhY2Nlc3MgdG8gIm91dHNpZGUiIHNlcnZpY2VzIChlLmcuLCBJL08pOworYW5kIG90aGVycyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBMdWEgaXRzZWxmLAorYnV0IGFyZSBxdWl0ZSB1c2VmdWwgb3IgaGF2ZSBjcml0aWNhbCBwZXJmb3JtYW5jZSByZXF1aXJlbWVudHMgdGhhdAorZGVzZXJ2ZSBhbiBpbXBsZW1lbnRhdGlvbiBpbiBDIChlLmcuLCA8YSBocmVmPSIjcGRmLXRhYmxlLnNvcnQiPjxjb2RlPnRhYmxlLnNvcnQ8L2NvZGU+PC9hPikuCisKKworPHA+CitBbGwgbGlicmFyaWVzIGFyZSBpbXBsZW1lbnRlZCB0aHJvdWdoIHRoZSBvZmZpY2lhbCBDJm5ic3A7QVBJCithbmQgYXJlIHByb3ZpZGVkIGFzIHNlcGFyYXRlIEMmbmJzcDttb2R1bGVzLgorQ3VycmVudGx5LCBMdWEgaGFzIHRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgbGlicmFyaWVzOgorCis8dWw+CisKKzxsaT5iYXNpYyBsaWJyYXJ5ICg8YSBocmVmPSIjNi4xIj4mc2VjdDs2LjE8L2E+KTs8L2xpPgorCis8bGk+Y29yb3V0aW5lIGxpYnJhcnkgKDxhIGhyZWY9IiM2LjIiPiZzZWN0OzYuMjwvYT4pOzwvbGk+CisKKzxsaT5wYWNrYWdlIGxpYnJhcnkgKDxhIGhyZWY9IiM2LjMiPiZzZWN0OzYuMzwvYT4pOzwvbGk+CisKKzxsaT5zdHJpbmcgbWFuaXB1bGF0aW9uICg8YSBocmVmPSIjNi40Ij4mc2VjdDs2LjQ8L2E+KTs8L2xpPgorCis8bGk+dGFibGUgbWFuaXB1bGF0aW9uICg8YSBocmVmPSIjNi41Ij4mc2VjdDs2LjU8L2E+KTs8L2xpPgorCis8bGk+bWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyAoPGEgaHJlZj0iIzYuNiI+JnNlY3Q7Ni42PC9hPikgKHNpbiwgbG9nLCBldGMuKTs8L2xpPgorCis8bGk+Yml0d2lzZSBvcGVyYXRpb25zICg8YSBocmVmPSIjNi43Ij4mc2VjdDs2Ljc8L2E+KTs8L2xpPgorCis8bGk+aW5wdXQgYW5kIG91dHB1dCAoPGEgaHJlZj0iIzYuOCI+JnNlY3Q7Ni44PC9hPik7PC9saT4KKworPGxpPm9wZXJhdGluZyBzeXN0ZW0gZmFjaWxpdGllcyAoPGEgaHJlZj0iIzYuOSI+JnNlY3Q7Ni45PC9hPik7PC9saT4KKworPGxpPmRlYnVnIGZhY2lsaXRpZXMgKDxhIGhyZWY9IiM2LjEwIj4mc2VjdDs2LjEwPC9hPikuPC9saT4KKworPC91bD48cD4KK0V4Y2VwdCBmb3IgdGhlIGJhc2ljIGFuZCB0aGUgcGFja2FnZSBsaWJyYXJpZXMsCitlYWNoIGxpYnJhcnkgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbnMgYXMgZmllbGRzIG9mIGEgZ2xvYmFsIHRhYmxlCitvciBhcyBtZXRob2RzIG9mIGl0cyBvYmplY3RzLgorCisKKzxwPgorVG8gaGF2ZSBhY2Nlc3MgdG8gdGhlc2UgbGlicmFyaWVzLAordGhlIEMmbmJzcDtob3N0IHByb2dyYW0gc2hvdWxkIGNhbGwgdGhlIDxhIGhyZWY9IiNsdWFMX29wZW5saWJzIj48Y29kZT5sdWFMX29wZW5saWJzPC9jb2RlPjwvYT4gZnVuY3Rpb24sCit3aGljaCBvcGVucyBhbGwgc3RhbmRhcmQgbGlicmFyaWVzLgorQWx0ZXJuYXRpdmVseSwKK3RoZSBob3N0IHByb2dyYW0gY2FuIG9wZW4gdGhlbSBpbmRpdmlkdWFsbHkgYnkgdXNpbmcKKzxhIGhyZWY9IiNsdWFMX3JlcXVpcmVmIj48Y29kZT5sdWFMX3JlcXVpcmVmPC9jb2RlPjwvYT4gdG8gY2FsbAorPGEgbmFtZT0icGRmLWx1YW9wZW5fYmFzZSI+PGNvZGU+bHVhb3Blbl9iYXNlPC9jb2RlPjwvYT4gKGZvciB0aGUgYmFzaWMgbGlicmFyeSksCis8YSBuYW1lPSJwZGYtbHVhb3Blbl9wYWNrYWdlIj48Y29kZT5sdWFvcGVuX3BhY2thZ2U8L2NvZGU+PC9hPiAoZm9yIHRoZSBwYWNrYWdlIGxpYnJhcnkpLAorPGEgbmFtZT0icGRmLWx1YW9wZW5fY29yb3V0aW5lIj48Y29kZT5sdWFvcGVuX2Nvcm91dGluZTwvY29kZT48L2E+IChmb3IgdGhlIGNvcm91dGluZSBsaWJyYXJ5KSwKKzxhIG5hbWU9InBkZi1sdWFvcGVuX3N0cmluZyI+PGNvZGU+bHVhb3Blbl9zdHJpbmc8L2NvZGU+PC9hPiAoZm9yIHRoZSBzdHJpbmcgbGlicmFyeSksCis8YSBuYW1lPSJwZGYtbHVhb3Blbl90YWJsZSI+PGNvZGU+bHVhb3Blbl90YWJsZTwvY29kZT48L2E+IChmb3IgdGhlIHRhYmxlIGxpYnJhcnkpLAorPGEgbmFtZT0icGRmLWx1YW9wZW5fbWF0aCI+PGNvZGU+bHVhb3Blbl9tYXRoPC9jb2RlPjwvYT4gKGZvciB0aGUgbWF0aGVtYXRpY2FsIGxpYnJhcnkpLAorPGEgbmFtZT0icGRmLWx1YW9wZW5fYml0MzIiPjxjb2RlPmx1YW9wZW5fYml0MzI8L2NvZGU+PC9hPiAoZm9yIHRoZSBiaXQgbGlicmFyeSksCis8YSBuYW1lPSJwZGYtbHVhb3Blbl9pbyI+PGNvZGU+bHVhb3Blbl9pbzwvY29kZT48L2E+IChmb3IgdGhlIEkvTyBsaWJyYXJ5KSwKKzxhIG5hbWU9InBkZi1sdWFvcGVuX29zIj48Y29kZT5sdWFvcGVuX29zPC9jb2RlPjwvYT4gKGZvciB0aGUgT3BlcmF0aW5nIFN5c3RlbSBsaWJyYXJ5KSwKK2FuZCA8YSBuYW1lPSJwZGYtbHVhb3Blbl9kZWJ1ZyI+PGNvZGU+bHVhb3Blbl9kZWJ1ZzwvY29kZT48L2E+IChmb3IgdGhlIGRlYnVnIGxpYnJhcnkpLgorVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBpbiA8YSBuYW1lPSJwZGYtbHVhbGliLmgiPjxjb2RlPmx1YWxpYi5oPC9jb2RlPjwvYT4uCisKKworCis8aDI+Ni4xICZuZGFzaDsgPGEgbmFtZT0iNi4xIj5CYXNpYyBGdW5jdGlvbnM8L2E+PC9oMj4KKworPHA+CitUaGUgYmFzaWMgbGlicmFyeSBwcm92aWRlcyBjb3JlIGZ1bmN0aW9ucyB0byBMdWEuCitJZiB5b3UgZG8gbm90IGluY2x1ZGUgdGhpcyBsaWJyYXJ5IGluIHlvdXIgYXBwbGljYXRpb24sCit5b3Ugc2hvdWxkIGNoZWNrIGNhcmVmdWxseSB3aGV0aGVyIHlvdSBuZWVkIHRvIHByb3ZpZGUKK2ltcGxlbWVudGF0aW9ucyBmb3Igc29tZSBvZiBpdHMgZmFjaWxpdGllcy4KKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWFzc2VydCI+PGNvZGU+YXNzZXJ0ICh2IFssIG1lc3NhZ2VdKTwvY29kZT48L2E+PC9oMz4KK0lzc3VlcyBhbiAgZXJyb3Igd2hlbgordGhlIHZhbHVlIG9mIGl0cyBhcmd1bWVudCA8Y29kZT52PC9jb2RlPiBpcyBmYWxzZSAoaS5lLiwgPGI+bmlsPC9iPiBvciA8Yj5mYWxzZTwvYj4pOworb3RoZXJ3aXNlLCByZXR1cm5zIGFsbCBpdHMgYXJndW1lbnRzLgorPGNvZGU+bWVzc2FnZTwvY29kZT4gaXMgYW4gZXJyb3IgbWVzc2FnZTsKK3doZW4gYWJzZW50LCBpdCBkZWZhdWx0cyB0byAiYXNzZXJ0aW9uIGZhaWxlZCEiCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtY29sbGVjdGdhcmJhZ2UiPjxjb2RlPmNvbGxlY3RnYXJiYWdlIChbb3B0IFssIGFyZ11dKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gaXMgYSBnZW5lcmljIGludGVyZmFjZSB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCitJdCBwZXJmb3JtcyBkaWZmZXJlbnQgZnVuY3Rpb25zIGFjY29yZGluZyB0byBpdHMgZmlyc3QgYXJndW1lbnQsIDxjb2RlPm9wdDwvY29kZT46CisKKzx1bD4KKworPGxpPjxiPiI8Y29kZT5jb2xsZWN0PC9jb2RlPiI6IDwvYj4KK3BlcmZvcm1zIGEgZnVsbCBnYXJiYWdlLWNvbGxlY3Rpb24gY3ljbGUuCitUaGlzIGlzIHRoZSBkZWZhdWx0IG9wdGlvbi4KKzwvbGk+CisKKzxsaT48Yj4iPGNvZGU+c3RvcDwvY29kZT4iOiA8L2I+CitzdG9wcyBhdXRvbWF0aWMgZXhlY3V0aW9uIG9mIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KK1RoZSBjb2xsZWN0b3Igd2lsbCBydW4gb25seSB3aGVuIGV4cGxpY2l0bHkgaW52b2tlZCwKK3VudGlsIGEgY2FsbCB0byByZXN0YXJ0IGl0LgorPC9saT4KKworPGxpPjxiPiI8Y29kZT5yZXN0YXJ0PC9jb2RlPiI6IDwvYj4KK3Jlc3RhcnRzIGF1dG9tYXRpYyBleGVjdXRpb24gb2YgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorPC9saT4KKworPGxpPjxiPiI8Y29kZT5jb3VudDwvY29kZT4iOiA8L2I+CityZXR1cm5zIHRoZSB0b3RhbCBtZW1vcnkgaW4gdXNlIGJ5IEx1YSAoaW4gS2J5dGVzKSBhbmQKK2Egc2Vjb25kIHZhbHVlIHdpdGggdGhlIHRvdGFsIG1lbW9yeSBpbiBieXRlcyBtb2R1bG8gMTAyNC4KK1RoZSBmaXJzdCB2YWx1ZSBoYXMgYSBmcmFjdGlvbmFsIHBhcnQsCitzbyB0aGUgZm9sbG93aW5nIGVxdWFsaXR5IGlzIGFsd2F5cyB0cnVlOgorCis8cHJlPgorICAgICBrLCBiID0gY29sbGVjdGdhcmJhZ2UoImNvdW50IikKKyAgICAgYXNzZXJ0KGsqMTAyNCA9PSBtYXRoLmZsb29yKGspKjEwMjQgKyBiKQorPC9wcmU+PHA+CisoVGhlIHNlY29uZCByZXN1bHQgaXMgdXNlZnVsIHdoZW4gTHVhIGlzIGNvbXBpbGVkCit3aXRoIGEgbm9uIGZsb2F0aW5nLXBvaW50IHR5cGUgZm9yIG51bWJlcnMuKQorPC9saT4KKworPGxpPjxiPiI8Y29kZT5zdGVwPC9jb2RlPiI6IDwvYj4KK3BlcmZvcm1zIGEgZ2FyYmFnZS1jb2xsZWN0aW9uIHN0ZXAuCitUaGUgc3RlcCAic2l6ZSIgaXMgY29udHJvbGxlZCBieSA8Y29kZT5hcmc8L2NvZGU+CisobGFyZ2VyIHZhbHVlcyBtZWFuIG1vcmUgc3RlcHMpIGluIGEgbm9uLXNwZWNpZmllZCB3YXkuCitJZiB5b3Ugd2FudCB0byBjb250cm9sIHRoZSBzdGVwIHNpemUKK3lvdSBtdXN0IGV4cGVyaW1lbnRhbGx5IHR1bmUgdGhlIHZhbHVlIG9mIDxjb2RlPmFyZzwvY29kZT4uCitSZXR1cm5zIDxiPnRydWU8L2I+IGlmIHRoZSBzdGVwIGZpbmlzaGVkIGEgY29sbGVjdGlvbiBjeWNsZS4KKzwvbGk+CisKKzxsaT48Yj4iPGNvZGU+c2V0cGF1c2U8L2NvZGU+IjogPC9iPgorc2V0cyA8Y29kZT5hcmc8L2NvZGU+IGFzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSA8ZW0+cGF1c2U8L2VtPiBvZgordGhlIGNvbGxlY3RvciAoc2VlIDxhIGhyZWY9IiMyLjUiPiZzZWN0OzIuNTwvYT4pLgorUmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUgZm9yIDxlbT5wYXVzZTwvZW0+LgorPC9saT4KKworPGxpPjxiPiI8Y29kZT5zZXRzdGVwbXVsPC9jb2RlPiI6IDwvYj4KK3NldHMgPGNvZGU+YXJnPC9jb2RlPiBhcyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgPGVtPnN0ZXAgbXVsdGlwbGllcjwvZW0+IG9mCit0aGUgY29sbGVjdG9yIChzZWUgPGEgaHJlZj0iIzIuNSI+JnNlY3Q7Mi41PC9hPikuCitSZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgPGVtPnN0ZXA8L2VtPi4KKzwvbGk+CisKKzxsaT48Yj4iPGNvZGU+aXNydW5uaW5nPC9jb2RlPiI6IDwvYj4KK3JldHVybnMgYSBib29sZWFuIHRoYXQgdGVsbHMgd2hldGhlciB0aGUgY29sbGVjdG9yIGlzIHJ1bm5pbmcKKyhpLmUuLCBub3Qgc3RvcHBlZCkuCis8L2xpPgorCis8bGk+PGI+Ijxjb2RlPmdlbmVyYXRpb25hbDwvY29kZT4iOiA8L2I+CitjaGFuZ2VzIHRoZSBjb2xsZWN0b3IgdG8gZ2VuZXJhdGlvbmFsIG1vZGUuCitUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIChzZWUgPGEgaHJlZj0iIzIuNSI+JnNlY3Q7Mi41PC9hPikuCis8L2xpPgorCis8bGk+PGI+Ijxjb2RlPmluY3JlbWVudGFsPC9jb2RlPiI6IDwvYj4KK2NoYW5nZXMgdGhlIGNvbGxlY3RvciB0byBpbmNyZW1lbnRhbCBtb2RlLgorVGhpcyBpcyB0aGUgZGVmYXVsdCBtb2RlLgorPC9saT4KKworPC91bD4KKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZG9maWxlIj48Y29kZT5kb2ZpbGUgKFtmaWxlbmFtZV0pPC9jb2RlPjwvYT48L2gzPgorT3BlbnMgdGhlIG5hbWVkIGZpbGUgYW5kIGV4ZWN1dGVzIGl0cyBjb250ZW50cyBhcyBhIEx1YSBjaHVuay4KK1doZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLAorPGNvZGU+ZG9maWxlPC9jb2RlPiBleGVjdXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHN0YW5kYXJkIGlucHV0ICg8Y29kZT5zdGRpbjwvY29kZT4pLgorUmV0dXJucyBhbGwgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjaHVuay4KK0luIGNhc2Ugb2YgZXJyb3JzLCA8Y29kZT5kb2ZpbGU8L2NvZGU+IHByb3BhZ2F0ZXMgdGhlIGVycm9yCit0byBpdHMgY2FsbGVyICh0aGF0IGlzLCA8Y29kZT5kb2ZpbGU8L2NvZGU+IGRvZXMgbm90IHJ1biBpbiBwcm90ZWN0ZWQgbW9kZSkuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZXJyb3IiPjxjb2RlPmVycm9yIChtZXNzYWdlIFssIGxldmVsXSk8L2NvZGU+PC9hPjwvaDM+CitUZXJtaW5hdGVzIHRoZSBsYXN0IHByb3RlY3RlZCBmdW5jdGlvbiBjYWxsZWQKK2FuZCByZXR1cm5zIDxjb2RlPm1lc3NhZ2U8L2NvZGU+IGFzIHRoZSBlcnJvciBtZXNzYWdlLgorRnVuY3Rpb24gPGNvZGU+ZXJyb3I8L2NvZGU+IG5ldmVyIHJldHVybnMuCisKKworPHA+CitVc3VhbGx5LCA8Y29kZT5lcnJvcjwvY29kZT4gYWRkcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciBwb3NpdGlvbgorYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZSwgaWYgdGhlIG1lc3NhZ2UgaXMgYSBzdHJpbmcuCitUaGUgPGNvZGU+bGV2ZWw8L2NvZGU+IGFyZ3VtZW50IHNwZWNpZmllcyBob3cgdG8gZ2V0IHRoZSBlcnJvciBwb3NpdGlvbi4KK1dpdGggbGV2ZWwmbmJzcDsxICh0aGUgZGVmYXVsdCksIHRoZSBlcnJvciBwb3NpdGlvbiBpcyB3aGVyZSB0aGUKKzxjb2RlPmVycm9yPC9jb2RlPiBmdW5jdGlvbiB3YXMgY2FsbGVkLgorTGV2ZWwmbmJzcDsyIHBvaW50cyB0aGUgZXJyb3IgdG8gd2hlcmUgdGhlIGZ1bmN0aW9uCit0aGF0IGNhbGxlZCA8Y29kZT5lcnJvcjwvY29kZT4gd2FzIGNhbGxlZDsgYW5kIHNvIG9uLgorUGFzc2luZyBhIGxldmVsJm5ic3A7MCBhdm9pZHMgdGhlIGFkZGl0aW9uIG9mIGVycm9yIHBvc2l0aW9uIGluZm9ybWF0aW9uCit0byB0aGUgbWVzc2FnZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1fRyI+PGNvZGU+X0c8L2NvZGU+PC9hPjwvaDM+CitBIGdsb2JhbCB2YXJpYWJsZSAobm90IGEgZnVuY3Rpb24pIHRoYXQKK2hvbGRzIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgKHNlZSA8YSBocmVmPSIjMi4yIj4mc2VjdDsyLjI8L2E+KS4KK0x1YSBpdHNlbGYgZG9lcyBub3QgdXNlIHRoaXMgdmFyaWFibGU7CitjaGFuZ2luZyBpdHMgdmFsdWUgZG9lcyBub3QgYWZmZWN0IGFueSBlbnZpcm9ubWVudCwKK25vciB2aWNlLXZlcnNhLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWdldG1ldGF0YWJsZSI+PGNvZGU+Z2V0bWV0YXRhYmxlIChvYmplY3QpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorSWYgPGNvZGU+b2JqZWN0PC9jb2RlPiBkb2VzIG5vdCBoYXZlIGEgbWV0YXRhYmxlLCByZXR1cm5zIDxiPm5pbDwvYj4uCitPdGhlcndpc2UsCitpZiB0aGUgb2JqZWN0J3MgbWV0YXRhYmxlIGhhcyBhIDxjb2RlPiJfX21ldGF0YWJsZSI8L2NvZGU+IGZpZWxkLAorcmV0dXJucyB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KK090aGVyd2lzZSwgcmV0dXJucyB0aGUgbWV0YXRhYmxlIG9mIHRoZSBnaXZlbiBvYmplY3QuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaXBhaXJzIj48Y29kZT5pcGFpcnMgKHQpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorSWYgPGNvZGU+dDwvY29kZT4gaGFzIGEgbWV0YW1ldGhvZCA8Y29kZT5fX2lwYWlyczwvY29kZT4sCitjYWxscyBpdCB3aXRoIDxjb2RlPnQ8L2NvZGU+IGFzIGFyZ3VtZW50IGFuZCByZXR1cm5zIHRoZSBmaXJzdCB0aHJlZQorcmVzdWx0cyBmcm9tIHRoZSBjYWxsLgorCisKKzxwPgorT3RoZXJ3aXNlLAorcmV0dXJucyB0aHJlZSB2YWx1ZXM6IGFuIGl0ZXJhdG9yIGZ1bmN0aW9uLCB0aGUgdGFibGUgPGNvZGU+dDwvY29kZT4sIGFuZCAwLAorc28gdGhhdCB0aGUgY29uc3RydWN0aW9uCisKKzxwcmU+CisgICAgIGZvciBpLHYgaW4gaXBhaXJzKHQpIGRvIDxlbT5ib2R5PC9lbT4gZW5kCis8L3ByZT48cD4KK3dpbGwgaXRlcmF0ZSBvdmVyIHRoZSBwYWlycyAoPGNvZGU+MSx0WzFdPC9jb2RlPiksICg8Y29kZT4yLHRbMl08L2NvZGU+KSwgLi4uLAordXAgdG8gdGhlIGZpcnN0IGludGVnZXIga2V5IGFic2VudCBmcm9tIHRoZSB0YWJsZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1sb2FkIj48Y29kZT5sb2FkIChsZCBbLCBzb3VyY2UgWywgbW9kZSBbLCBlbnZdXV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorTG9hZHMgYSBjaHVuay4KKworCis8cD4KK0lmIDxjb2RlPmxkPC9jb2RlPiBpcyBhIHN0cmluZywgdGhlIGNodW5rIGlzIHRoaXMgc3RyaW5nLgorSWYgPGNvZGU+bGQ8L2NvZGU+IGlzIGEgZnVuY3Rpb24sCis8Y29kZT5sb2FkPC9jb2RlPiBjYWxscyBpdCByZXBlYXRlZGx5IHRvIGdldCB0aGUgY2h1bmsgcGllY2VzLgorRWFjaCBjYWxsIHRvIDxjb2RlPmxkPC9jb2RlPiBtdXN0IHJldHVybiBhIHN0cmluZyB0aGF0IGNvbmNhdGVuYXRlcword2l0aCBwcmV2aW91cyByZXN1bHRzLgorQSByZXR1cm4gb2YgYW4gZW1wdHkgc3RyaW5nLCA8Yj5uaWw8L2I+LCBvciBubyB2YWx1ZSBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIGNodW5rLgorCisKKzxwPgorSWYgdGhlcmUgYXJlIG5vIHN5bnRhY3RpYyBlcnJvcnMsCityZXR1cm5zIHRoZSBjb21waWxlZCBjaHVuayBhcyBhIGZ1bmN0aW9uOworb3RoZXJ3aXNlLCByZXR1cm5zIDxiPm5pbDwvYj4gcGx1cyB0aGUgZXJyb3IgbWVzc2FnZS4KKworCis8cD4KK0lmIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gaGFzIHVwdmFsdWVzLAordGhlIGZpcnN0IHVwdmFsdWUgaXMgc2V0IHRvIHRoZSB2YWx1ZSBvZiA8Y29kZT5lbnY8L2NvZGU+LAoraWYgdGhhdCBwYXJhbWV0ZXIgaXMgZ2l2ZW4sCitvciB0byB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbCBlbnZpcm9ubWVudC4KKyhXaGVuIHlvdSBsb2FkIGEgbWFpbiBjaHVuaywKK3RoZSByZXN1bHRpbmcgZnVuY3Rpb24gd2lsbCBhbHdheXMgaGF2ZSBleGFjdGx5IG9uZSB1cHZhbHVlLAordGhlIDxjb2RlPl9FTlY8L2NvZGU+IHZhcmlhYmxlIChzZWUgPGEgaHJlZj0iIzIuMiI+JnNlY3Q7Mi4yPC9hPikuCitXaGVuIHlvdSBsb2FkIGEgYmluYXJ5IGNodW5rIGNyZWF0ZWQgZnJvbSBhIGZ1bmN0aW9uIChzZWUgPGEgaHJlZj0iI3BkZi1zdHJpbmcuZHVtcCI+PGNvZGU+c3RyaW5nLmR1bXA8L2NvZGU+PC9hPiksCit0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIGNhbiBoYXZlIGFyYml0cmFyeSB1cHZhbHVlcy4pCisKKworPHA+Cis8Y29kZT5zb3VyY2U8L2NvZGU+IGlzIHVzZWQgYXMgdGhlIHNvdXJjZSBvZiB0aGUgY2h1bmsgZm9yIGVycm9yIG1lc3NhZ2VzCithbmQgZGVidWcgaW5mb3JtYXRpb24gKHNlZSA8YSBocmVmPSIjNC45Ij4mc2VjdDs0Ljk8L2E+KS4KK1doZW4gYWJzZW50LAoraXQgZGVmYXVsdHMgdG8gPGNvZGU+bGQ8L2NvZGU+LCBpZiA8Y29kZT5sZDwvY29kZT4gaXMgYSBzdHJpbmcsCitvciB0byAiPGNvZGU+PShsb2FkKTwvY29kZT4iIG90aGVyd2lzZS4KKworCis8cD4KK1RoZSBzdHJpbmcgPGNvZGU+bW9kZTwvY29kZT4gY29udHJvbHMgd2hldGhlciB0aGUgY2h1bmsgY2FuIGJlIHRleHQgb3IgYmluYXJ5CisodGhhdCBpcywgYSBwcmVjb21waWxlZCBjaHVuaykuCitJdCBtYXkgYmUgdGhlIHN0cmluZyAiPGNvZGU+YjwvY29kZT4iIChvbmx5IGJpbmFyeSBjaHVua3MpLAorIjxjb2RlPnQ8L2NvZGU+IiAob25seSB0ZXh0IGNodW5rcyksCitvciAiPGNvZGU+YnQ8L2NvZGU+IiAoYm90aCBiaW5hcnkgYW5kIHRleHQpLgorVGhlIGRlZmF1bHQgaXMgIjxjb2RlPmJ0PC9jb2RlPiIuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbG9hZGZpbGUiPjxjb2RlPmxvYWRmaWxlIChbZmlsZW5hbWUgWywgbW9kZSBbLCBlbnZdXV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorU2ltaWxhciB0byA8YSBocmVmPSIjcGRmLWxvYWQiPjxjb2RlPmxvYWQ8L2NvZGU+PC9hPiwKK2J1dCBnZXRzIHRoZSBjaHVuayBmcm9tIGZpbGUgPGNvZGU+ZmlsZW5hbWU8L2NvZGU+CitvciBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwKK2lmIG5vIGZpbGUgbmFtZSBpcyBnaXZlbi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1uZXh0Ij48Y29kZT5uZXh0ICh0YWJsZSBbLCBpbmRleF0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQWxsb3dzIGEgcHJvZ3JhbSB0byB0cmF2ZXJzZSBhbGwgZmllbGRzIG9mIGEgdGFibGUuCitJdHMgZmlyc3QgYXJndW1lbnQgaXMgYSB0YWJsZSBhbmQgaXRzIHNlY29uZCBhcmd1bWVudAoraXMgYW4gaW5kZXggaW4gdGhpcyB0YWJsZS4KKzxjb2RlPm5leHQ8L2NvZGU+IHJldHVybnMgdGhlIG5leHQgaW5kZXggb2YgdGhlIHRhYmxlCithbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUuCitXaGVuIGNhbGxlZCB3aXRoIDxiPm5pbDwvYj4gYXMgaXRzIHNlY29uZCBhcmd1bWVudCwKKzxjb2RlPm5leHQ8L2NvZGU+IHJldHVybnMgYW4gaW5pdGlhbCBpbmRleAorYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlLgorV2hlbiBjYWxsZWQgd2l0aCB0aGUgbGFzdCBpbmRleCwKK29yIHdpdGggPGI+bmlsPC9iPiBpbiBhbiBlbXB0eSB0YWJsZSwKKzxjb2RlPm5leHQ8L2NvZGU+IHJldHVybnMgPGI+bmlsPC9iPi4KK0lmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYWJzZW50LCB0aGVuIGl0IGlzIGludGVycHJldGVkIGFzIDxiPm5pbDwvYj4uCitJbiBwYXJ0aWN1bGFyLAoreW91IGNhbiB1c2UgPGNvZGU+bmV4dCh0KTwvY29kZT4gdG8gY2hlY2sgd2hldGhlciBhIHRhYmxlIGlzIGVtcHR5LgorCisKKzxwPgorVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBpbmRpY2VzIGFyZSBlbnVtZXJhdGVkIGlzIG5vdCBzcGVjaWZpZWQsCis8ZW0+ZXZlbiBmb3IgbnVtZXJpYyBpbmRpY2VzPC9lbT4uCisoVG8gdHJhdmVyc2UgYSB0YWJsZSBpbiBudW1lcmljIG9yZGVyLAordXNlIGEgbnVtZXJpY2FsIDxiPmZvcjwvYj4uKQorCisKKzxwPgorVGhlIGJlaGF2aW9yIG9mIDxjb2RlPm5leHQ8L2NvZGU+IGlzIHVuZGVmaW5lZCBpZiwKK2R1cmluZyB0aGUgdHJhdmVyc2FsLAoreW91IGFzc2lnbiBhbnkgdmFsdWUgdG8gYSBub24tZXhpc3RlbnQgZmllbGQgaW4gdGhlIHRhYmxlLgorWW91IG1heSBob3dldmVyIG1vZGlmeSBleGlzdGluZyBmaWVsZHMuCitJbiBwYXJ0aWN1bGFyLCB5b3UgbWF5IGNsZWFyIGV4aXN0aW5nIGZpZWxkcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1wYWlycyI+PGNvZGU+cGFpcnMgKHQpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorSWYgPGNvZGU+dDwvY29kZT4gaGFzIGEgbWV0YW1ldGhvZCA8Y29kZT5fX3BhaXJzPC9jb2RlPiwKK2NhbGxzIGl0IHdpdGggPGNvZGU+dDwvY29kZT4gYXMgYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIGZpcnN0IHRocmVlCityZXN1bHRzIGZyb20gdGhlIGNhbGwuCisKKworPHA+CitPdGhlcndpc2UsCityZXR1cm5zIHRocmVlIHZhbHVlczogdGhlIDxhIGhyZWY9IiNwZGYtbmV4dCI+PGNvZGU+bmV4dDwvY29kZT48L2E+IGZ1bmN0aW9uLCB0aGUgdGFibGUgPGNvZGU+dDwvY29kZT4sIGFuZCA8Yj5uaWw8L2I+LAorc28gdGhhdCB0aGUgY29uc3RydWN0aW9uCisKKzxwcmU+CisgICAgIGZvciBrLHYgaW4gcGFpcnModCkgZG8gPGVtPmJvZHk8L2VtPiBlbmQKKzwvcHJlPjxwPgord2lsbCBpdGVyYXRlIG92ZXIgYWxsIGtleSZuZGFzaDt2YWx1ZSBwYWlycyBvZiB0YWJsZSA8Y29kZT50PC9jb2RlPi4KKworCis8cD4KK1NlZSBmdW5jdGlvbiA8YSBocmVmPSIjcGRmLW5leHQiPjxjb2RlPm5leHQ8L2NvZGU+PC9hPiBmb3IgdGhlIGNhdmVhdHMgb2YgbW9kaWZ5aW5nCit0aGUgdGFibGUgZHVyaW5nIGl0cyB0cmF2ZXJzYWwuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcGNhbGwiPjxjb2RlPnBjYWxsIChmIFssIGFyZzEsICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90O10pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQ2FsbHMgZnVuY3Rpb24gPGNvZGU+ZjwvY29kZT4gd2l0aAordGhlIGdpdmVuIGFyZ3VtZW50cyBpbiA8ZW0+cHJvdGVjdGVkIG1vZGU8L2VtPi4KK1RoaXMgbWVhbnMgdGhhdCBhbnkgZXJyb3IgaW5zaWRlJm5ic3A7PGNvZGU+ZjwvY29kZT4gaXMgbm90IHByb3BhZ2F0ZWQ7CitpbnN0ZWFkLCA8Y29kZT5wY2FsbDwvY29kZT4gY2F0Y2hlcyB0aGUgZXJyb3IKK2FuZCByZXR1cm5zIGEgc3RhdHVzIGNvZGUuCitJdHMgZmlyc3QgcmVzdWx0IGlzIHRoZSBzdGF0dXMgY29kZSAoYSBib29sZWFuKSwKK3doaWNoIGlzIHRydWUgaWYgdGhlIGNhbGwgc3VjY2VlZHMgd2l0aG91dCBlcnJvcnMuCitJbiBzdWNoIGNhc2UsIDxjb2RlPnBjYWxsPC9jb2RlPiBhbHNvIHJldHVybnMgYWxsIHJlc3VsdHMgZnJvbSB0aGUgY2FsbCwKK2FmdGVyIHRoaXMgZmlyc3QgcmVzdWx0LgorSW4gY2FzZSBvZiBhbnkgZXJyb3IsIDxjb2RlPnBjYWxsPC9jb2RlPiByZXR1cm5zIDxiPmZhbHNlPC9iPiBwbHVzIHRoZSBlcnJvciBtZXNzYWdlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXByaW50Ij48Y29kZT5wcmludCAoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KTwvY29kZT48L2E+PC9oMz4KK1JlY2VpdmVzIGFueSBudW1iZXIgb2YgYXJndW1lbnRzCithbmQgcHJpbnRzIHRoZWlyIHZhbHVlcyB0byA8Y29kZT5zdGRvdXQ8L2NvZGU+LAordXNpbmcgdGhlIDxhIGhyZWY9IiNwZGYtdG9zdHJpbmciPjxjb2RlPnRvc3RyaW5nPC9jb2RlPjwvYT4gZnVuY3Rpb24gdG8gY29udmVydCBlYWNoIGFyZ3VtZW50IHRvIGEgc3RyaW5nLgorPGNvZGU+cHJpbnQ8L2NvZGU+IGlzIG5vdCBpbnRlbmRlZCBmb3IgZm9ybWF0dGVkIG91dHB1dCwKK2J1dCBvbmx5IGFzIGEgcXVpY2sgd2F5IHRvIHNob3cgYSB2YWx1ZSwKK2ZvciBpbnN0YW5jZSBmb3IgZGVidWdnaW5nLgorRm9yIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciB0aGUgb3V0cHV0LAordXNlIDxhIGhyZWY9IiNwZGYtc3RyaW5nLmZvcm1hdCI+PGNvZGU+c3RyaW5nLmZvcm1hdDwvY29kZT48L2E+IGFuZCA8YSBocmVmPSIjcGRmLWlvLndyaXRlIj48Y29kZT5pby53cml0ZTwvY29kZT48L2E+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXJhd2VxdWFsIj48Y29kZT5yYXdlcXVhbCAodjEsIHYyKTwvY29kZT48L2E+PC9oMz4KK0NoZWNrcyB3aGV0aGVyIDxjb2RlPnYxPC9jb2RlPiBpcyBlcXVhbCB0byA8Y29kZT52MjwvY29kZT4sCit3aXRob3V0IGludm9raW5nIGFueSBtZXRhbWV0aG9kLgorUmV0dXJucyBhIGJvb2xlYW4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcmF3Z2V0Ij48Y29kZT5yYXdnZXQgKHRhYmxlLCBpbmRleCk8L2NvZGU+PC9hPjwvaDM+CitHZXRzIHRoZSByZWFsIHZhbHVlIG9mIDxjb2RlPnRhYmxlW2luZGV4XTwvY29kZT4sCit3aXRob3V0IGludm9raW5nIGFueSBtZXRhbWV0aG9kLgorPGNvZGU+dGFibGU8L2NvZGU+IG11c3QgYmUgYSB0YWJsZTsKKzxjb2RlPmluZGV4PC9jb2RlPiBtYXkgYmUgYW55IHZhbHVlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXJhd2xlbiI+PGNvZGU+cmF3bGVuICh2KTwvY29kZT48L2E+PC9oMz4KK1JldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0IDxjb2RlPnY8L2NvZGU+LAord2hpY2ggbXVzdCBiZSBhIHRhYmxlIG9yIGEgc3RyaW5nLAord2l0aG91dCBpbnZva2luZyBhbnkgbWV0YW1ldGhvZC4KK1JldHVybnMgYW4gaW50ZWdlciBudW1iZXIuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcmF3c2V0Ij48Y29kZT5yYXdzZXQgKHRhYmxlLCBpbmRleCwgdmFsdWUpPC9jb2RlPjwvYT48L2gzPgorU2V0cyB0aGUgcmVhbCB2YWx1ZSBvZiA8Y29kZT50YWJsZVtpbmRleF08L2NvZGU+IHRvIDxjb2RlPnZhbHVlPC9jb2RlPiwKK3dpdGhvdXQgaW52b2tpbmcgYW55IG1ldGFtZXRob2QuCis8Y29kZT50YWJsZTwvY29kZT4gbXVzdCBiZSBhIHRhYmxlLAorPGNvZGU+aW5kZXg8L2NvZGU+IGFueSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSA8Yj5uaWw8L2I+IGFuZCBOYU4sCithbmQgPGNvZGU+dmFsdWU8L2NvZGU+IGFueSBMdWEgdmFsdWUuCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgPGNvZGU+dGFibGU8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXNlbGVjdCI+PGNvZGU+c2VsZWN0IChpbmRleCwgJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0lmIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBhIG51bWJlciwKK3JldHVybnMgYWxsIGFyZ3VtZW50cyBhZnRlciBhcmd1bWVudCBudW1iZXIgPGNvZGU+aW5kZXg8L2NvZGU+OworYSBuZWdhdGl2ZSBudW1iZXIgaW5kZXhlcyBmcm9tIHRoZSBlbmQgKC0xIGlzIHRoZSBsYXN0IGFyZ3VtZW50KS4KK090aGVyd2lzZSwgPGNvZGU+aW5kZXg8L2NvZGU+IG11c3QgYmUgdGhlIHN0cmluZyA8Y29kZT4iIyI8L2NvZGU+LAorYW5kIDxjb2RlPnNlbGVjdDwvY29kZT4gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGV4dHJhIGFyZ3VtZW50cyBpdCByZWNlaXZlZC4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zZXRtZXRhdGFibGUiPjxjb2RlPnNldG1ldGF0YWJsZSAodGFibGUsIG1ldGF0YWJsZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIHRoZSBtZXRhdGFibGUgZm9yIHRoZSBnaXZlbiB0YWJsZS4KKyhZb3UgY2Fubm90IGNoYW5nZSB0aGUgbWV0YXRhYmxlIG9mIG90aGVyIHR5cGVzIGZyb20gTHVhLCBvbmx5IGZyb20mbmJzcDtDLikKK0lmIDxjb2RlPm1ldGF0YWJsZTwvY29kZT4gaXMgPGI+bmlsPC9iPiwKK3JlbW92ZXMgdGhlIG1ldGF0YWJsZSBvZiB0aGUgZ2l2ZW4gdGFibGUuCitJZiB0aGUgb3JpZ2luYWwgbWV0YXRhYmxlIGhhcyBhIDxjb2RlPiJfX21ldGF0YWJsZSI8L2NvZGU+IGZpZWxkLAorcmFpc2VzIGFuIGVycm9yLgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIDxjb2RlPnRhYmxlPC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi10b251bWJlciI+PGNvZGU+dG9udW1iZXIgKGUgWywgYmFzZV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorV2hlbiBjYWxsZWQgd2l0aCBubyA8Y29kZT5iYXNlPC9jb2RlPiwKKzxjb2RlPnRvbnVtYmVyPC9jb2RlPiB0cmllcyB0byBjb252ZXJ0IGl0cyBhcmd1bWVudCB0byBhIG51bWJlci4KK0lmIHRoZSBhcmd1bWVudCBpcyBhbHJlYWR5IGEgbnVtYmVyIG9yCithIHN0cmluZyBjb252ZXJ0aWJsZSB0byBhIG51bWJlciAoc2VlIDxhIGhyZWY9IiMzLjQuMiI+JnNlY3Q7My40LjI8L2E+KSwKK3RoZW4gPGNvZGU+dG9udW1iZXI8L2NvZGU+IHJldHVybnMgdGhpcyBudW1iZXI7CitvdGhlcndpc2UsIGl0IHJldHVybnMgPGI+bmlsPC9iPi4KKworCis8cD4KK1doZW4gY2FsbGVkIHdpdGggPGNvZGU+YmFzZTwvY29kZT4sCit0aGVuIDxjb2RlPmU8L2NvZGU+IHNob3VsZCBiZSBhIHN0cmluZyB0byBiZSBpbnRlcnByZXRlZCBhcworYW4gaW50ZWdlciBudW1lcmFsIGluIHRoYXQgYmFzZS4KK1RoZSBiYXNlIG1heSBiZSBhbnkgaW50ZWdlciBiZXR3ZWVuIDIgYW5kIDM2LCBpbmNsdXNpdmUuCitJbiBiYXNlcyBhYm92ZSZuYnNwOzEwLCB0aGUgbGV0dGVyICc8Y29kZT5BPC9jb2RlPicgKGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlKQorcmVwcmVzZW50cyZuYnNwOzEwLCAnPGNvZGU+QjwvY29kZT4nIHJlcHJlc2VudHMmbmJzcDsxMSwgYW5kIHNvIGZvcnRoLAord2l0aCAnPGNvZGU+WjwvY29kZT4nIHJlcHJlc2VudGluZyAzNS4KK0lmIHRoZSBzdHJpbmcgPGNvZGU+ZTwvY29kZT4gaXMgbm90IGEgdmFsaWQgbnVtZXJhbCBpbiB0aGUgZ2l2ZW4gYmFzZSwKK3RoZSBmdW5jdGlvbiByZXR1cm5zIDxiPm5pbDwvYj4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtdG9zdHJpbmciPjxjb2RlPnRvc3RyaW5nICh2KTwvY29kZT48L2E+PC9oMz4KK1JlY2VpdmVzIGEgdmFsdWUgb2YgYW55IHR5cGUgYW5kCitjb252ZXJ0cyBpdCB0byBhIHN0cmluZyBpbiBhIHJlYXNvbmFibGUgZm9ybWF0LgorKEZvciBjb21wbGV0ZSBjb250cm9sIG9mIGhvdyBudW1iZXJzIGFyZSBjb252ZXJ0ZWQsCit1c2UgPGEgaHJlZj0iI3BkZi1zdHJpbmcuZm9ybWF0Ij48Y29kZT5zdHJpbmcuZm9ybWF0PC9jb2RlPjwvYT4uKQorCisKKzxwPgorSWYgdGhlIG1ldGF0YWJsZSBvZiA8Y29kZT52PC9jb2RlPiBoYXMgYSA8Y29kZT4iX190b3N0cmluZyI8L2NvZGU+IGZpZWxkLAordGhlbiA8Y29kZT50b3N0cmluZzwvY29kZT4gY2FsbHMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUKK3dpdGggPGNvZGU+djwvY29kZT4gYXMgYXJndW1lbnQsCithbmQgdXNlcyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIGFzIGl0cyByZXN1bHQuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtdHlwZSI+PGNvZGU+dHlwZSAodik8L2NvZGU+PC9hPjwvaDM+CitSZXR1cm5zIHRoZSB0eXBlIG9mIGl0cyBvbmx5IGFyZ3VtZW50LCBjb2RlZCBhcyBhIHN0cmluZy4KK1RoZSBwb3NzaWJsZSByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gYXJlCisiPGNvZGU+bmlsPC9jb2RlPiIgKGEgc3RyaW5nLCBub3QgdGhlIHZhbHVlIDxiPm5pbDwvYj4pLAorIjxjb2RlPm51bWJlcjwvY29kZT4iLAorIjxjb2RlPnN0cmluZzwvY29kZT4iLAorIjxjb2RlPmJvb2xlYW48L2NvZGU+IiwKKyI8Y29kZT50YWJsZTwvY29kZT4iLAorIjxjb2RlPmZ1bmN0aW9uPC9jb2RlPiIsCisiPGNvZGU+dGhyZWFkPC9jb2RlPiIsCithbmQgIjxjb2RlPnVzZXJkYXRhPC9jb2RlPiIuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtX1ZFUlNJT04iPjxjb2RlPl9WRVJTSU9OPC9jb2RlPjwvYT48L2gzPgorQSBnbG9iYWwgdmFyaWFibGUgKG5vdCBhIGZ1bmN0aW9uKSB0aGF0Citob2xkcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXJyZW50IGludGVycHJldGVyIHZlcnNpb24uCitUaGUgY3VycmVudCBjb250ZW50cyBvZiB0aGlzIHZhcmlhYmxlIGlzICI8Y29kZT5MdWEgNS4yPC9jb2RlPiIuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYteHBjYWxsIj48Y29kZT54cGNhbGwgKGYsIG1zZ2ggWywgYXJnMSwgJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7XSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gPGEgaHJlZj0iI3BkZi1wY2FsbCI+PGNvZGU+cGNhbGw8L2NvZGU+PC9hPiwKK2V4Y2VwdCB0aGF0IGl0IHNldHMgYSBuZXcgbWVzc2FnZSBoYW5kbGVyIDxjb2RlPm1zZ2g8L2NvZGU+LgorCisKKworCisKKworCis8aDI+Ni4yICZuZGFzaDsgPGEgbmFtZT0iNi4yIj5Db3JvdXRpbmUgTWFuaXB1bGF0aW9uPC9hPjwvaDI+CisKKzxwPgorVGhlIG9wZXJhdGlvbnMgcmVsYXRlZCB0byBjb3JvdXRpbmVzIGNvbXByaXNlIGEgc3ViLWxpYnJhcnkgb2YKK3RoZSBiYXNpYyBsaWJyYXJ5IGFuZCBjb21lIGluc2lkZSB0aGUgdGFibGUgPGEgbmFtZT0icGRmLWNvcm91dGluZSI+PGNvZGU+Y29yb3V0aW5lPC9jb2RlPjwvYT4uCitTZWUgPGEgaHJlZj0iIzIuNiI+JnNlY3Q7Mi42PC9hPiBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIG9mIGNvcm91dGluZXMuCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1jb3JvdXRpbmUuY3JlYXRlIj48Y29kZT5jb3JvdXRpbmUuY3JlYXRlIChmKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0NyZWF0ZXMgYSBuZXcgY29yb3V0aW5lLCB3aXRoIGJvZHkgPGNvZGU+ZjwvY29kZT4uCis8Y29kZT5mPC9jb2RlPiBtdXN0IGJlIGEgTHVhIGZ1bmN0aW9uLgorUmV0dXJucyB0aGlzIG5ldyBjb3JvdXRpbmUsCithbiBvYmplY3Qgd2l0aCB0eXBlIDxjb2RlPiJ0aHJlYWQiPC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1jb3JvdXRpbmUucmVzdW1lIj48Y29kZT5jb3JvdXRpbmUucmVzdW1lIChjbyBbLCB2YWwxLCAmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDtdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1N0YXJ0cyBvciBjb250aW51ZXMgdGhlIGV4ZWN1dGlvbiBvZiBjb3JvdXRpbmUgPGNvZGU+Y288L2NvZGU+LgorVGhlIGZpcnN0IHRpbWUgeW91IHJlc3VtZSBhIGNvcm91dGluZSwKK2l0IHN0YXJ0cyBydW5uaW5nIGl0cyBib2R5LgorVGhlIHZhbHVlcyA8Y29kZT52YWwxPC9jb2RlPiwgLi4uIGFyZSBwYXNzZWQKK2FzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGJvZHkgZnVuY3Rpb24uCitJZiB0aGUgY29yb3V0aW5lIGhhcyB5aWVsZGVkLAorPGNvZGU+cmVzdW1lPC9jb2RlPiByZXN0YXJ0cyBpdDsKK3RoZSB2YWx1ZXMgPGNvZGU+dmFsMTwvY29kZT4sIC4uLiBhcmUgcGFzc2VkCithcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSB5aWVsZC4KKworCis8cD4KK0lmIHRoZSBjb3JvdXRpbmUgcnVucyB3aXRob3V0IGFueSBlcnJvcnMsCis8Y29kZT5yZXN1bWU8L2NvZGU+IHJldHVybnMgPGI+dHJ1ZTwvYj4gcGx1cyBhbnkgdmFsdWVzIHBhc3NlZCB0byA8Y29kZT55aWVsZDwvY29kZT4KKyhpZiB0aGUgY29yb3V0aW5lIHlpZWxkcykgb3IgYW55IHZhbHVlcyByZXR1cm5lZCBieSB0aGUgYm9keSBmdW5jdGlvbgorKGlmIHRoZSBjb3JvdXRpbmUgdGVybWluYXRlcykuCitJZiB0aGVyZSBpcyBhbnkgZXJyb3IsCis8Y29kZT5yZXN1bWU8L2NvZGU+IHJldHVybnMgPGI+ZmFsc2U8L2I+IHBsdXMgdGhlIGVycm9yIG1lc3NhZ2UuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtY29yb3V0aW5lLnJ1bm5pbmciPjxjb2RlPmNvcm91dGluZS5ydW5uaW5nICgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgcnVubmluZyBjb3JvdXRpbmUgcGx1cyBhIGJvb2xlYW4sCit0cnVlIHdoZW4gdGhlIHJ1bm5pbmcgY29yb3V0aW5lIGlzIHRoZSBtYWluIG9uZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1jb3JvdXRpbmUuc3RhdHVzIj48Y29kZT5jb3JvdXRpbmUuc3RhdHVzIChjbyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBzdGF0dXMgb2YgY29yb3V0aW5lIDxjb2RlPmNvPC9jb2RlPiwgYXMgYSBzdHJpbmc6Cis8Y29kZT4icnVubmluZyI8L2NvZGU+LAoraWYgdGhlIGNvcm91dGluZSBpcyBydW5uaW5nICh0aGF0IGlzLCBpdCBjYWxsZWQgPGNvZGU+c3RhdHVzPC9jb2RlPik7Cis8Y29kZT4ic3VzcGVuZGVkIjwvY29kZT4sIGlmIHRoZSBjb3JvdXRpbmUgaXMgc3VzcGVuZGVkIGluIGEgY2FsbCB0byA8Y29kZT55aWVsZDwvY29kZT4sCitvciBpZiBpdCBoYXMgbm90IHN0YXJ0ZWQgcnVubmluZyB5ZXQ7Cis8Y29kZT4ibm9ybWFsIjwvY29kZT4gaWYgdGhlIGNvcm91dGluZSBpcyBhY3RpdmUgYnV0IG5vdCBydW5uaW5nCisodGhhdCBpcywgaXQgaGFzIHJlc3VtZWQgYW5vdGhlciBjb3JvdXRpbmUpOworYW5kIDxjb2RlPiJkZWFkIjwvY29kZT4gaWYgdGhlIGNvcm91dGluZSBoYXMgZmluaXNoZWQgaXRzIGJvZHkgZnVuY3Rpb24sCitvciBpZiBpdCBoYXMgc3RvcHBlZCB3aXRoIGFuIGVycm9yLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWNvcm91dGluZS53cmFwIj48Y29kZT5jb3JvdXRpbmUud3JhcCAoZik8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitDcmVhdGVzIGEgbmV3IGNvcm91dGluZSwgd2l0aCBib2R5IDxjb2RlPmY8L2NvZGU+LgorPGNvZGU+ZjwvY29kZT4gbXVzdCBiZSBhIEx1YSBmdW5jdGlvbi4KK1JldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJlc3VtZXMgdGhlIGNvcm91dGluZSBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkLgorQW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGJlaGF2ZSBhcyB0aGUKK2V4dHJhIGFyZ3VtZW50cyB0byA8Y29kZT5yZXN1bWU8L2NvZGU+LgorUmV0dXJucyB0aGUgc2FtZSB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+cmVzdW1lPC9jb2RlPiwKK2V4Y2VwdCB0aGUgZmlyc3QgYm9vbGVhbi4KK0luIGNhc2Ugb2YgZXJyb3IsIHByb3BhZ2F0ZXMgdGhlIGVycm9yLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWNvcm91dGluZS55aWVsZCI+PGNvZGU+Y29yb3V0aW5lLnlpZWxkICgmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorU3VzcGVuZHMgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbGluZyBjb3JvdXRpbmUuCitBbnkgYXJndW1lbnRzIHRvIDxjb2RlPnlpZWxkPC9jb2RlPiBhcmUgcGFzc2VkIGFzIGV4dHJhIHJlc3VsdHMgdG8gPGNvZGU+cmVzdW1lPC9jb2RlPi4KKworCisKKworCisKKworPGgyPjYuMyAmbmRhc2g7IDxhIG5hbWU9IjYuMyI+TW9kdWxlczwvYT48L2gyPgorCis8cD4KK1RoZSBwYWNrYWdlIGxpYnJhcnkgcHJvdmlkZXMgYmFzaWMKK2ZhY2lsaXRpZXMgZm9yIGxvYWRpbmcgbW9kdWxlcyBpbiBMdWEuCitJdCBleHBvcnRzIG9uZSBmdW5jdGlvbiBkaXJlY3RseSBpbiB0aGUgZ2xvYmFsIGVudmlyb25tZW50OgorPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4uCitFdmVyeXRoaW5nIGVsc2UgaXMgZXhwb3J0ZWQgaW4gYSB0YWJsZSA8YSBuYW1lPSJwZGYtcGFja2FnZSI+PGNvZGU+cGFja2FnZTwvY29kZT48L2E+LgorCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcmVxdWlyZSI+PGNvZGU+cmVxdWlyZSAobW9kbmFtZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitMb2FkcyB0aGUgZ2l2ZW4gbW9kdWxlLgorVGhlIGZ1bmN0aW9uIHN0YXJ0cyBieSBsb29raW5nIGludG8gdGhlIDxhIGhyZWY9IiNwZGYtcGFja2FnZS5sb2FkZWQiPjxjb2RlPnBhY2thZ2UubG9hZGVkPC9jb2RlPjwvYT4gdGFibGUKK3RvIGRldGVybWluZSB3aGV0aGVyIDxjb2RlPm1vZG5hbWU8L2NvZGU+IGlzIGFscmVhZHkgbG9hZGVkLgorSWYgaXQgaXMsIHRoZW4gPGNvZGU+cmVxdWlyZTwvY29kZT4gcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkCithdCA8Y29kZT5wYWNrYWdlLmxvYWRlZFttb2RuYW1lXTwvY29kZT4uCitPdGhlcndpc2UsIGl0IHRyaWVzIHRvIGZpbmQgYSA8ZW0+bG9hZGVyPC9lbT4gZm9yIHRoZSBtb2R1bGUuCisKKworPHA+CitUbyBmaW5kIGEgbG9hZGVyLAorPGNvZGU+cmVxdWlyZTwvY29kZT4gaXMgZ3VpZGVkIGJ5IHRoZSA8YSBocmVmPSIjcGRmLXBhY2thZ2Uuc2VhcmNoZXJzIj48Y29kZT5wYWNrYWdlLnNlYXJjaGVyczwvY29kZT48L2E+IHNlcXVlbmNlLgorQnkgY2hhbmdpbmcgdGhpcyBzZXF1ZW5jZSwKK3dlIGNhbiBjaGFuZ2UgaG93IDxjb2RlPnJlcXVpcmU8L2NvZGU+IGxvb2tzIGZvciBhIG1vZHVsZS4KK1RoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb24gaXMgYmFzZWQgb24gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorZm9yIDxhIGhyZWY9IiNwZGYtcGFja2FnZS5zZWFyY2hlcnMiPjxjb2RlPnBhY2thZ2Uuc2VhcmNoZXJzPC9jb2RlPjwvYT4uCisKKworPHA+CitGaXJzdCA8Y29kZT5yZXF1aXJlPC9jb2RlPiBxdWVyaWVzIDxjb2RlPnBhY2thZ2UucHJlbG9hZFttb2RuYW1lXTwvY29kZT4uCitJZiBpdCBoYXMgYSB2YWx1ZSwKK3RoaXMgdmFsdWUgKHdoaWNoIHNob3VsZCBiZSBhIGZ1bmN0aW9uKSBpcyB0aGUgbG9hZGVyLgorT3RoZXJ3aXNlIDxjb2RlPnJlcXVpcmU8L2NvZGU+IHNlYXJjaGVzIGZvciBhIEx1YSBsb2FkZXIgdXNpbmcgdGhlCitwYXRoIHN0b3JlZCBpbiA8YSBocmVmPSIjcGRmLXBhY2thZ2UucGF0aCI+PGNvZGU+cGFja2FnZS5wYXRoPC9jb2RlPjwvYT4uCitJZiB0aGF0IGFsc28gZmFpbHMsIGl0IHNlYXJjaGVzIGZvciBhIEMmbmJzcDtsb2FkZXIgdXNpbmcgdGhlCitwYXRoIHN0b3JlZCBpbiA8YSBocmVmPSIjcGRmLXBhY2thZ2UuY3BhdGgiPjxjb2RlPnBhY2thZ2UuY3BhdGg8L2NvZGU+PC9hPi4KK0lmIHRoYXQgYWxzbyBmYWlscywKK2l0IHRyaWVzIGFuIDxlbT5hbGwtaW4tb25lPC9lbT4gbG9hZGVyIChzZWUgPGEgaHJlZj0iI3BkZi1wYWNrYWdlLnNlYXJjaGVycyI+PGNvZGU+cGFja2FnZS5zZWFyY2hlcnM8L2NvZGU+PC9hPikuCisKKworPHA+CitPbmNlIGEgbG9hZGVyIGlzIGZvdW5kLAorPGNvZGU+cmVxdWlyZTwvY29kZT4gY2FsbHMgdGhlIGxvYWRlciB3aXRoIHR3byBhcmd1bWVudHM6Cis8Y29kZT5tb2RuYW1lPC9jb2RlPiBhbmQgYW4gZXh0cmEgdmFsdWUgZGVwZW5kZW50IG9uIGhvdyBpdCBnb3QgdGhlIGxvYWRlci4KKyhJZiB0aGUgbG9hZGVyIGNhbWUgZnJvbSBhIGZpbGUsCit0aGlzIGV4dHJhIHZhbHVlIGlzIHRoZSBmaWxlIG5hbWUuKQorSWYgdGhlIGxvYWRlciByZXR1cm5zIGFueSBub24tbmlsIHZhbHVlLAorPGNvZGU+cmVxdWlyZTwvY29kZT4gYXNzaWducyB0aGUgcmV0dXJuZWQgdmFsdWUgdG8gPGNvZGU+cGFja2FnZS5sb2FkZWRbbW9kbmFtZV08L2NvZGU+LgorSWYgdGhlIGxvYWRlciBkb2VzIG5vdCByZXR1cm4gYSBub24tbmlsIHZhbHVlIGFuZAoraGFzIG5vdCBhc3NpZ25lZCBhbnkgdmFsdWUgdG8gPGNvZGU+cGFja2FnZS5sb2FkZWRbbW9kbmFtZV08L2NvZGU+LAordGhlbiA8Y29kZT5yZXF1aXJlPC9jb2RlPiBhc3NpZ25zIDxiPnRydWU8L2I+IHRvIHRoaXMgZW50cnkuCitJbiBhbnkgY2FzZSwgPGNvZGU+cmVxdWlyZTwvY29kZT4gcmV0dXJucyB0aGUKK2ZpbmFsIHZhbHVlIG9mIDxjb2RlPnBhY2thZ2UubG9hZGVkW21vZG5hbWVdPC9jb2RlPi4KKworCis8cD4KK0lmIHRoZXJlIGlzIGFueSBlcnJvciBsb2FkaW5nIG9yIHJ1bm5pbmcgdGhlIG1vZHVsZSwKK29yIGlmIGl0IGNhbm5vdCBmaW5kIGFueSBsb2FkZXIgZm9yIHRoZSBtb2R1bGUsCit0aGVuIDxjb2RlPnJlcXVpcmU8L2NvZGU+IHJhaXNlcyBhbiBlcnJvci4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1wYWNrYWdlLmNvbmZpZyI+PGNvZGU+cGFja2FnZS5jb25maWc8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitBIHN0cmluZyBkZXNjcmliaW5nIHNvbWUgY29tcGlsZS10aW1lIGNvbmZpZ3VyYXRpb25zIGZvciBwYWNrYWdlcy4KK1RoaXMgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgbGluZXM6CisKKzx1bD4KKworPGxpPlRoZSBmaXJzdCBsaW5lIGlzIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHN0cmluZy4KK0RlZmF1bHQgaXMgJzxjb2RlPlw8L2NvZGU+JyBmb3IgV2luZG93cyBhbmQgJzxjb2RlPi88L2NvZGU+JyBmb3IgYWxsIG90aGVyIHN5c3RlbXMuPC9saT4KKworPGxpPlRoZSBzZWNvbmQgbGluZSBpcyB0aGUgY2hhcmFjdGVyIHRoYXQgc2VwYXJhdGVzIHRlbXBsYXRlcyBpbiBhIHBhdGguCitEZWZhdWx0IGlzICc8Y29kZT47PC9jb2RlPicuPC9saT4KKworPGxpPlRoZSB0aGlyZCBsaW5lIGlzIHRoZSBzdHJpbmcgdGhhdCBtYXJrcyB0aGUKK3N1YnN0aXR1dGlvbiBwb2ludHMgaW4gYSB0ZW1wbGF0ZS4KK0RlZmF1bHQgaXMgJzxjb2RlPj88L2NvZGU+Jy48L2xpPgorCis8bGk+VGhlIGZvdXJ0aCBsaW5lIGlzIGEgc3RyaW5nIHRoYXQsIGluIGEgcGF0aCBpbiBXaW5kb3dzLAoraXMgcmVwbGFjZWQgYnkgdGhlIGV4ZWN1dGFibGUncyBkaXJlY3RvcnkuCitEZWZhdWx0IGlzICc8Y29kZT4hPC9jb2RlPicuPC9saT4KKworPGxpPlRoZSBmaWZ0aCBsaW5lIGlzIGEgbWFyayB0byBpZ25vcmUgYWxsIHRleHQgYmVmb3JlIGl0Cit3aGVuIGJ1aWxkaW5nIHRoZSA8Y29kZT5sdWFvcGVuXzwvY29kZT4gZnVuY3Rpb24gbmFtZS4KK0RlZmF1bHQgaXMgJzxjb2RlPi08L2NvZGU+Jy48L2xpPgorCis8L3VsPgorCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1wYWNrYWdlLmNwYXRoIj48Y29kZT5wYWNrYWdlLmNwYXRoPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorVGhlIHBhdGggdXNlZCBieSA8YSBocmVmPSIjcGRmLXJlcXVpcmUiPjxjb2RlPnJlcXVpcmU8L2NvZGU+PC9hPiB0byBzZWFyY2ggZm9yIGEgQyZuYnNwO2xvYWRlci4KKworCis8cD4KK0x1YSBpbml0aWFsaXplcyB0aGUgQyZuYnNwO3BhdGggPGEgaHJlZj0iI3BkZi1wYWNrYWdlLmNwYXRoIj48Y29kZT5wYWNrYWdlLmNwYXRoPC9jb2RlPjwvYT4gaW4gdGhlIHNhbWUgd2F5CitpdCBpbml0aWFsaXplcyB0aGUgTHVhIHBhdGggPGEgaHJlZj0iI3BkZi1wYWNrYWdlLnBhdGgiPjxjb2RlPnBhY2thZ2UucGF0aDwvY29kZT48L2E+LAordXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDxhIG5hbWU9InBkZi1MVUFfQ1BBVEhfNV8yIj48Y29kZT5MVUFfQ1BBVEhfNV8yPC9jb2RlPjwvYT4KK29yIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8YSBuYW1lPSJwZGYtTFVBX0NQQVRIIj48Y29kZT5MVUFfQ1BBVEg8L2NvZGU+PC9hPgorb3IgYSBkZWZhdWx0IHBhdGggZGVmaW5lZCBpbiA8Y29kZT5sdWFjb25mLmg8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXBhY2thZ2UubG9hZGVkIj48Y29kZT5wYWNrYWdlLmxvYWRlZDwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0EgdGFibGUgdXNlZCBieSA8YSBocmVmPSIjcGRmLXJlcXVpcmUiPjxjb2RlPnJlcXVpcmU8L2NvZGU+PC9hPiB0byBjb250cm9sIHdoaWNoCittb2R1bGVzIGFyZSBhbHJlYWR5IGxvYWRlZC4KK1doZW4geW91IHJlcXVpcmUgYSBtb2R1bGUgPGNvZGU+bW9kbmFtZTwvY29kZT4gYW5kCis8Y29kZT5wYWNrYWdlLmxvYWRlZFttb2RuYW1lXTwvY29kZT4gaXMgbm90IGZhbHNlLAorPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4gc2ltcGx5IHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCB0aGVyZS4KKworCis8cD4KK1RoaXMgdmFyaWFibGUgaXMgb25seSBhIHJlZmVyZW5jZSB0byB0aGUgcmVhbCB0YWJsZTsKK2Fzc2lnbm1lbnRzIHRvIHRoaXMgdmFyaWFibGUgZG8gbm90IGNoYW5nZSB0aGUKK3RhYmxlIHVzZWQgYnkgPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcGFja2FnZS5sb2FkbGliIj48Y29kZT5wYWNrYWdlLmxvYWRsaWIgKGxpYm5hbWUsIGZ1bmNuYW1lKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0R5bmFtaWNhbGx5IGxpbmtzIHRoZSBob3N0IHByb2dyYW0gd2l0aCB0aGUgQyZuYnNwO2xpYnJhcnkgPGNvZGU+bGlibmFtZTwvY29kZT4uCisKKworPHA+CitJZiA8Y29kZT5mdW5jbmFtZTwvY29kZT4gaXMgIjxjb2RlPio8L2NvZGU+IiwKK3RoZW4gaXQgb25seSBsaW5rcyB3aXRoIHRoZSBsaWJyYXJ5LAorbWFraW5nIHRoZSBzeW1ib2xzIGV4cG9ydGVkIGJ5IHRoZSBsaWJyYXJ5CithdmFpbGFibGUgdG8gb3RoZXIgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcmllcy4KK090aGVyd2lzZSwKK2l0IGxvb2tzIGZvciBhIGZ1bmN0aW9uIDxjb2RlPmZ1bmNuYW1lPC9jb2RlPiBpbnNpZGUgdGhlIGxpYnJhcnkKK2FuZCByZXR1cm5zIHRoaXMgZnVuY3Rpb24gYXMgYSBDJm5ic3A7ZnVuY3Rpb24uCitTbywgPGNvZGU+ZnVuY25hbWU8L2NvZGU+IG11c3QgZm9sbG93IHRoZSA8YSBocmVmPSIjbHVhX0NGdW5jdGlvbiI+PGNvZGU+bHVhX0NGdW5jdGlvbjwvY29kZT48L2E+IHByb3RvdHlwZQorKHNlZSA8YSBocmVmPSIjbHVhX0NGdW5jdGlvbiI+PGNvZGU+bHVhX0NGdW5jdGlvbjwvY29kZT48L2E+KS4KKworCis8cD4KK1RoaXMgaXMgYSBsb3ctbGV2ZWwgZnVuY3Rpb24uCitJdCBjb21wbGV0ZWx5IGJ5cGFzc2VzIHRoZSBwYWNrYWdlIGFuZCBtb2R1bGUgc3lzdGVtLgorVW5saWtlIDxhIGhyZWY9IiNwZGYtcmVxdWlyZSI+PGNvZGU+cmVxdWlyZTwvY29kZT48L2E+LAoraXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgcGF0aCBzZWFyY2hpbmcgYW5kCitkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGFkZHMgZXh0ZW5zaW9ucy4KKzxjb2RlPmxpYm5hbWU8L2NvZGU+IG11c3QgYmUgdGhlIGNvbXBsZXRlIGZpbGUgbmFtZSBvZiB0aGUgQyZuYnNwO2xpYnJhcnksCitpbmNsdWRpbmcgaWYgbmVjZXNzYXJ5IGEgcGF0aCBhbmQgYW4gZXh0ZW5zaW9uLgorPGNvZGU+ZnVuY25hbWU8L2NvZGU+IG11c3QgYmUgdGhlIGV4YWN0IG5hbWUgZXhwb3J0ZWQgYnkgdGhlIEMmbmJzcDtsaWJyYXJ5Cisod2hpY2ggbWF5IGRlcGVuZCBvbiB0aGUgQyZuYnNwO2NvbXBpbGVyIGFuZCBsaW5rZXIgdXNlZCkuCisKKworPHA+CitUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgU3RhbmRhcmQmbmJzcDtDLgorQXMgc3VjaCwgaXQgaXMgb25seSBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMKKyhXaW5kb3dzLCBMaW51eCwgTWFjIE9TIFgsIFNvbGFyaXMsIEJTRCwKK3BsdXMgb3RoZXIgVW5peCBzeXN0ZW1zIHRoYXQgc3VwcG9ydCB0aGUgPGNvZGU+ZGxmY248L2NvZGU+IHN0YW5kYXJkKS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1wYWNrYWdlLnBhdGgiPjxjb2RlPnBhY2thZ2UucGF0aDwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1RoZSBwYXRoIHVzZWQgYnkgPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4gdG8gc2VhcmNoIGZvciBhIEx1YSBsb2FkZXIuCisKKworPHA+CitBdCBzdGFydC11cCwgTHVhIGluaXRpYWxpemVzIHRoaXMgdmFyaWFibGUgd2l0aAordGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8YSBuYW1lPSJwZGYtTFVBX1BBVEhfNV8yIj48Y29kZT5MVUFfUEFUSF81XzI8L2NvZGU+PC9hPiBvcgordGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDxhIG5hbWU9InBkZi1MVUFfUEFUSCI+PGNvZGU+TFVBX1BBVEg8L2NvZGU+PC9hPiBvcgord2l0aCBhIGRlZmF1bHQgcGF0aCBkZWZpbmVkIGluIDxjb2RlPmx1YWNvbmYuaDwvY29kZT4sCitpZiB0aG9zZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG5vdCBkZWZpbmVkLgorQW55ICI8Y29kZT47OzwvY29kZT4iIGluIHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKK2lzIHJlcGxhY2VkIGJ5IHRoZSBkZWZhdWx0IHBhdGguCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtcGFja2FnZS5wcmVsb2FkIj48Y29kZT5wYWNrYWdlLnByZWxvYWQ8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitBIHRhYmxlIHRvIHN0b3JlIGxvYWRlcnMgZm9yIHNwZWNpZmljIG1vZHVsZXMKKyhzZWUgPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4pLgorCisKKzxwPgorVGhpcyB2YXJpYWJsZSBpcyBvbmx5IGEgcmVmZXJlbmNlIHRvIHRoZSByZWFsIHRhYmxlOworYXNzaWdubWVudHMgdG8gdGhpcyB2YXJpYWJsZSBkbyBub3QgY2hhbmdlIHRoZQordGFibGUgdXNlZCBieSA8YSBocmVmPSIjcGRmLXJlcXVpcmUiPjxjb2RlPnJlcXVpcmU8L2NvZGU+PC9hPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1wYWNrYWdlLnNlYXJjaGVycyI+PGNvZGU+cGFja2FnZS5zZWFyY2hlcnM8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitBIHRhYmxlIHVzZWQgYnkgPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4gdG8gY29udHJvbCBob3cgdG8gbG9hZCBtb2R1bGVzLgorCisKKzxwPgorRWFjaCBlbnRyeSBpbiB0aGlzIHRhYmxlIGlzIGEgPGVtPnNlYXJjaGVyIGZ1bmN0aW9uPC9lbT4uCitXaGVuIGxvb2tpbmcgZm9yIGEgbW9kdWxlLAorPGEgaHJlZj0iI3BkZi1yZXF1aXJlIj48Y29kZT5yZXF1aXJlPC9jb2RlPjwvYT4gY2FsbHMgZWFjaCBvZiB0aGVzZSBzZWFyY2hlcnMgaW4gYXNjZW5kaW5nIG9yZGVyLAord2l0aCB0aGUgbW9kdWxlIG5hbWUgKHRoZSBhcmd1bWVudCBnaXZlbiB0byA8YSBocmVmPSIjcGRmLXJlcXVpcmUiPjxjb2RlPnJlcXVpcmU8L2NvZGU+PC9hPikgYXMgaXRzCitzb2xlIHBhcmFtZXRlci4KK1RoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGFub3RoZXIgZnVuY3Rpb24gKHRoZSBtb2R1bGUgPGVtPmxvYWRlcjwvZW0+KQorcGx1cyBhbiBleHRyYSB2YWx1ZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoYXQgbG9hZGVyLAorb3IgYSBzdHJpbmcgZXhwbGFpbmluZyB3aHkgaXQgZGlkIG5vdCBmaW5kIHRoYXQgbW9kdWxlCisob3IgPGI+bmlsPC9iPiBpZiBpdCBoYXMgbm90aGluZyB0byBzYXkpLgorCisKKzxwPgorTHVhIGluaXRpYWxpemVzIHRoaXMgdGFibGUgd2l0aCBmb3VyIHNlYXJjaGVyIGZ1bmN0aW9ucy4KKworCis8cD4KK1RoZSBmaXJzdCBzZWFyY2hlciBzaW1wbHkgbG9va3MgZm9yIGEgbG9hZGVyIGluIHRoZQorPGEgaHJlZj0iI3BkZi1wYWNrYWdlLnByZWxvYWQiPjxjb2RlPnBhY2thZ2UucHJlbG9hZDwvY29kZT48L2E+IHRhYmxlLgorCisKKzxwPgorVGhlIHNlY29uZCBzZWFyY2hlciBsb29rcyBmb3IgYSBsb2FkZXIgYXMgYSBMdWEgbGlicmFyeSwKK3VzaW5nIHRoZSBwYXRoIHN0b3JlZCBhdCA8YSBocmVmPSIjcGRmLXBhY2thZ2UucGF0aCI+PGNvZGU+cGFja2FnZS5wYXRoPC9jb2RlPjwvYT4uCitUaGUgc2VhcmNoIGlzIGRvbmUgYXMgZGVzY3JpYmVkIGluIGZ1bmN0aW9uIDxhIGhyZWY9IiNwZGYtcGFja2FnZS5zZWFyY2hwYXRoIj48Y29kZT5wYWNrYWdlLnNlYXJjaHBhdGg8L2NvZGU+PC9hPi4KKworCis8cD4KK1RoZSB0aGlyZCBzZWFyY2hlciBsb29rcyBmb3IgYSBsb2FkZXIgYXMgYSBDJm5ic3A7bGlicmFyeSwKK3VzaW5nIHRoZSBwYXRoIGdpdmVuIGJ5IHRoZSB2YXJpYWJsZSA8YSBocmVmPSIjcGRmLXBhY2thZ2UuY3BhdGgiPjxjb2RlPnBhY2thZ2UuY3BhdGg8L2NvZGU+PC9hPi4KK0FnYWluLAordGhlIHNlYXJjaCBpcyBkb25lIGFzIGRlc2NyaWJlZCBpbiBmdW5jdGlvbiA8YSBocmVmPSIjcGRmLXBhY2thZ2Uuc2VhcmNocGF0aCI+PGNvZGU+cGFja2FnZS5zZWFyY2hwYXRoPC9jb2RlPjwvYT4uCitGb3IgaW5zdGFuY2UsCitpZiB0aGUgQyZuYnNwO3BhdGggaXMgdGhlIHN0cmluZworCis8cHJlPgorICAgICAiLi8/LnNvOy4vPy5kbGw7L3Vzci9sb2NhbC8/L2luaXQuc28iCis8L3ByZT48cD4KK3RoZSBzZWFyY2hlciBmb3IgbW9kdWxlIDxjb2RlPmZvbzwvY29kZT4KK3dpbGwgdHJ5IHRvIG9wZW4gdGhlIGZpbGVzIDxjb2RlPi4vZm9vLnNvPC9jb2RlPiwgPGNvZGU+Li9mb28uZGxsPC9jb2RlPiwKK2FuZCA8Y29kZT4vdXNyL2xvY2FsL2Zvby9pbml0LnNvPC9jb2RlPiwgaW4gdGhhdCBvcmRlci4KK09uY2UgaXQgZmluZHMgYSBDJm5ic3A7bGlicmFyeSwKK3RoaXMgc2VhcmNoZXIgZmlyc3QgdXNlcyBhIGR5bmFtaWMgbGluayBmYWNpbGl0eSB0byBsaW5rIHRoZQorYXBwbGljYXRpb24gd2l0aCB0aGUgbGlicmFyeS4KK1RoZW4gaXQgdHJpZXMgdG8gZmluZCBhIEMmbmJzcDtmdW5jdGlvbiBpbnNpZGUgdGhlIGxpYnJhcnkgdG8KK2JlIHVzZWQgYXMgdGhlIGxvYWRlci4KK1RoZSBuYW1lIG9mIHRoaXMgQyZuYnNwO2Z1bmN0aW9uIGlzIHRoZSBzdHJpbmcgIjxjb2RlPmx1YW9wZW5fPC9jb2RlPiIKK2NvbmNhdGVuYXRlZCB3aXRoIGEgY29weSBvZiB0aGUgbW9kdWxlIG5hbWUgd2hlcmUgZWFjaCBkb3QKK2lzIHJlcGxhY2VkIGJ5IGFuIHVuZGVyc2NvcmUuCitNb3Jlb3ZlciwgaWYgdGhlIG1vZHVsZSBuYW1lIGhhcyBhIGh5cGhlbiwKK2l0cyBwcmVmaXggdXAgdG8gKGFuZCBpbmNsdWRpbmcpIHRoZSBmaXJzdCBoeXBoZW4gaXMgcmVtb3ZlZC4KK0ZvciBpbnN0YW5jZSwgaWYgdGhlIG1vZHVsZSBuYW1lIGlzIDxjb2RlPmEudjEtYi5jPC9jb2RlPiwKK3RoZSBmdW5jdGlvbiBuYW1lIHdpbGwgYmUgPGNvZGU+bHVhb3Blbl9iX2M8L2NvZGU+LgorCisKKzxwPgorVGhlIGZvdXJ0aCBzZWFyY2hlciB0cmllcyBhbiA8ZW0+YWxsLWluLW9uZSBsb2FkZXI8L2VtPi4KK0l0IHNlYXJjaGVzIHRoZSBDJm5ic3A7cGF0aCBmb3IgYSBsaWJyYXJ5IGZvcgordGhlIHJvb3QgbmFtZSBvZiB0aGUgZ2l2ZW4gbW9kdWxlLgorRm9yIGluc3RhbmNlLCB3aGVuIHJlcXVpcmluZyA8Y29kZT5hLmIuYzwvY29kZT4sCitpdCB3aWxsIHNlYXJjaCBmb3IgYSBDJm5ic3A7bGlicmFyeSBmb3IgPGNvZGU+YTwvY29kZT4uCitJZiBmb3VuZCwgaXQgbG9va3MgaW50byBpdCBmb3IgYW4gb3BlbiBmdW5jdGlvbiBmb3IKK3RoZSBzdWJtb2R1bGU7CitpbiBvdXIgZXhhbXBsZSwgdGhhdCB3b3VsZCBiZSA8Y29kZT5sdWFvcGVuX2FfYl9jPC9jb2RlPi4KK1dpdGggdGhpcyBmYWNpbGl0eSwgYSBwYWNrYWdlIGNhbiBwYWNrIHNldmVyYWwgQyZuYnNwO3N1Ym1vZHVsZXMKK2ludG8gb25lIHNpbmdsZSBsaWJyYXJ5LAord2l0aCBlYWNoIHN1Ym1vZHVsZSBrZWVwaW5nIGl0cyBvcmlnaW5hbCBvcGVuIGZ1bmN0aW9uLgorCisKKzxwPgorQWxsIHNlYXJjaGVycyBleGNlcHQgdGhlIGZpcnN0IG9uZSAocHJlbG9hZCkgcmV0dXJuIGFzIHRoZSBleHRyYSB2YWx1ZQordGhlIGZpbGUgbmFtZSB3aGVyZSB0aGUgbW9kdWxlIHdhcyBmb3VuZCwKK2FzIHJldHVybmVkIGJ5IDxhIGhyZWY9IiNwZGYtcGFja2FnZS5zZWFyY2hwYXRoIj48Y29kZT5wYWNrYWdlLnNlYXJjaHBhdGg8L2NvZGU+PC9hPi4KK1RoZSBmaXJzdCBzZWFyY2hlciByZXR1cm5zIG5vIGV4dHJhIHZhbHVlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXBhY2thZ2Uuc2VhcmNocGF0aCI+PGNvZGU+cGFja2FnZS5zZWFyY2hwYXRoIChuYW1lLCBwYXRoIFssIHNlcCBbLCByZXBdXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZWFyY2hlcyBmb3IgdGhlIGdpdmVuIDxjb2RlPm5hbWU8L2NvZGU+IGluIHRoZSBnaXZlbiA8Y29kZT5wYXRoPC9jb2RlPi4KKworCis8cD4KK0EgcGF0aCBpcyBhIHN0cmluZyBjb250YWluaW5nIGEgc2VxdWVuY2Ugb2YKKzxlbT50ZW1wbGF0ZXM8L2VtPiBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucy4KK0ZvciBlYWNoIHRlbXBsYXRlLAordGhlIGZ1bmN0aW9uIHJlcGxhY2VzIGVhY2ggaW50ZXJyb2dhdGlvbiBtYXJrIChpZiBhbnkpCitpbiB0aGUgdGVtcGxhdGUgd2l0aCBhIGNvcHkgb2YgPGNvZGU+bmFtZTwvY29kZT4KK3doZXJlaW4gYWxsIG9jY3VycmVuY2VzIG9mIDxjb2RlPnNlcDwvY29kZT4KKyhhIGRvdCwgYnkgZGVmYXVsdCkKK3dlcmUgcmVwbGFjZWQgYnkgPGNvZGU+cmVwPC9jb2RlPgorKHRoZSBzeXN0ZW0ncyBkaXJlY3Rvcnkgc2VwYXJhdG9yLCBieSBkZWZhdWx0KSwKK2FuZCB0aGVuIHRyaWVzIHRvIG9wZW4gdGhlIHJlc3VsdGluZyBmaWxlIG5hbWUuCisKKworPHA+CitGb3IgaW5zdGFuY2UsIGlmIHRoZSBwYXRoIGlzIHRoZSBzdHJpbmcKKworPHByZT4KKyAgICAgIi4vPy5sdWE7Li8/LmxjOy91c3IvbG9jYWwvPy9pbml0Lmx1YSIKKzwvcHJlPjxwPgordGhlIHNlYXJjaCBmb3IgdGhlIG5hbWUgPGNvZGU+Zm9vLmE8L2NvZGU+Cit3aWxsIHRyeSB0byBvcGVuIHRoZSBmaWxlcworPGNvZGU+Li9mb28vYS5sdWE8L2NvZGU+LCA8Y29kZT4uL2Zvby9hLmxjPC9jb2RlPiwgYW5kCis8Y29kZT4vdXNyL2xvY2FsL2Zvby9hL2luaXQubHVhPC9jb2RlPiwgaW4gdGhhdCBvcmRlci4KKworCis8cD4KK1JldHVybnMgdGhlIHJlc3VsdGluZyBuYW1lIG9mIHRoZSBmaXJzdCBmaWxlIHRoYXQgaXQgY2FuCitvcGVuIGluIHJlYWQgbW9kZSAoYWZ0ZXIgY2xvc2luZyB0aGUgZmlsZSksCitvciA8Yj5uaWw8L2I+IHBsdXMgYW4gZXJyb3IgbWVzc2FnZSBpZiBub25lIHN1Y2NlZWRzLgorKFRoaXMgZXJyb3IgbWVzc2FnZSBsaXN0cyBhbGwgZmlsZSBuYW1lcyBpdCB0cmllZCB0byBvcGVuLikKKworCisKKworCisKKworPGgyPjYuNCAmbmRhc2g7IDxhIG5hbWU9IjYuNCI+U3RyaW5nIE1hbmlwdWxhdGlvbjwvYT48L2gyPgorCis8cD4KK1RoaXMgbGlicmFyeSBwcm92aWRlcyBnZW5lcmljIGZ1bmN0aW9ucyBmb3Igc3RyaW5nIG1hbmlwdWxhdGlvbiwKK3N1Y2ggYXMgZmluZGluZyBhbmQgZXh0cmFjdGluZyBzdWJzdHJpbmdzLCBhbmQgcGF0dGVybiBtYXRjaGluZy4KK1doZW4gaW5kZXhpbmcgYSBzdHJpbmcgaW4gTHVhLCB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGF0IHBvc2l0aW9uJm5ic3A7MQorKG5vdCBhdCZuYnNwOzAsIGFzIGluIEMpLgorSW5kaWNlcyBhcmUgYWxsb3dlZCB0byBiZSBuZWdhdGl2ZSBhbmQgYXJlIGludGVycHJldGVkIGFzIGluZGV4aW5nIGJhY2t3YXJkcywKK2Zyb20gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorVGh1cywgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGF0IHBvc2l0aW9uIC0xLCBhbmQgc28gb24uCisKKworPHA+CitUaGUgc3RyaW5nIGxpYnJhcnkgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbnMgaW5zaWRlIHRoZSB0YWJsZQorPGEgbmFtZT0icGRmLXN0cmluZyI+PGNvZGU+c3RyaW5nPC9jb2RlPjwvYT4uCitJdCBhbHNvIHNldHMgYSBtZXRhdGFibGUgZm9yIHN0cmluZ3MKK3doZXJlIHRoZSA8Y29kZT5fX2luZGV4PC9jb2RlPiBmaWVsZCBwb2ludHMgdG8gdGhlIDxjb2RlPnN0cmluZzwvY29kZT4gdGFibGUuCitUaGVyZWZvcmUsIHlvdSBjYW4gdXNlIHRoZSBzdHJpbmcgZnVuY3Rpb25zIGluIG9iamVjdC1vcmllbnRlZCBzdHlsZS4KK0ZvciBpbnN0YW5jZSwgPGNvZGU+c3RyaW5nLmJ5dGUocyxpKTwvY29kZT4KK2NhbiBiZSB3cml0dGVuIGFzIDxjb2RlPnM6Ynl0ZShpKTwvY29kZT4uCisKKworPHA+CitUaGUgc3RyaW5nIGxpYnJhcnkgYXNzdW1lcyBvbmUtYnl0ZSBjaGFyYWN0ZXIgZW5jb2RpbmdzLgorCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLmJ5dGUiPjxjb2RlPnN0cmluZy5ieXRlIChzIFssIGkgWywgal1dKTwvY29kZT48L2E+PC9oMz4KK1JldHVybnMgdGhlIGludGVybmFsIG51bWVyaWNhbCBjb2RlcyBvZiB0aGUgY2hhcmFjdGVycyA8Y29kZT5zW2ldPC9jb2RlPiwKKzxjb2RlPnNbaSsxXTwvY29kZT4sIC4uLiwgPGNvZGU+c1tqXTwvY29kZT4uCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+aTwvY29kZT4gaXMmbmJzcDsxOwordGhlIGRlZmF1bHQgdmFsdWUgZm9yIDxjb2RlPmo8L2NvZGU+IGlzJm5ic3A7PGNvZGU+aTwvY29kZT4uCitUaGVzZSBpbmRpY2VzIGFyZSBjb3JyZWN0ZWQKK2ZvbGxvd2luZyB0aGUgc2FtZSBydWxlcyBvZiBmdW5jdGlvbiA8YSBocmVmPSIjcGRmLXN0cmluZy5zdWIiPjxjb2RlPnN0cmluZy5zdWI8L2NvZGU+PC9hPi4KKworCis8cD4KK051bWVyaWNhbCBjb2RlcyBhcmUgbm90IG5lY2Vzc2FyaWx5IHBvcnRhYmxlIGFjcm9zcyBwbGF0Zm9ybXMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLmNoYXIiPjxjb2RlPnN0cmluZy5jaGFyICgmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPjwvYT48L2gzPgorUmVjZWl2ZXMgemVybyBvciBtb3JlIGludGVnZXJzLgorUmV0dXJucyBhIHN0cmluZyB3aXRoIGxlbmd0aCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cywKK2luIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGhhcyB0aGUgaW50ZXJuYWwgbnVtZXJpY2FsIGNvZGUgZXF1YWwKK3RvIGl0cyBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LgorCisKKzxwPgorTnVtZXJpY2FsIGNvZGVzIGFyZSBub3QgbmVjZXNzYXJpbHkgcG9ydGFibGUgYWNyb3NzIHBsYXRmb3Jtcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcuZHVtcCI+PGNvZGU+c3RyaW5nLmR1bXAgKGZ1bmN0aW9uKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24sCitzbyB0aGF0IGEgbGF0ZXIgPGEgaHJlZj0iI3BkZi1sb2FkIj48Y29kZT5sb2FkPC9jb2RlPjwvYT4gb24gdGhpcyBzdHJpbmcgcmV0dXJucworYSBjb3B5IG9mIHRoZSBmdW5jdGlvbiAoYnV0IHdpdGggbmV3IHVwdmFsdWVzKS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcuZmluZCI+PGNvZGU+c3RyaW5nLmZpbmQgKHMsIHBhdHRlcm4gWywgaW5pdCBbLCBwbGFpbl1dKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0xvb2tzIGZvciB0aGUgZmlyc3QgbWF0Y2ggb2YKKzxjb2RlPnBhdHRlcm48L2NvZGU+IGluIHRoZSBzdHJpbmcgPGNvZGU+czwvY29kZT4uCitJZiBpdCBmaW5kcyBhIG1hdGNoLCB0aGVuIDxjb2RlPmZpbmQ8L2NvZGU+IHJldHVybnMgdGhlIGluZGljZXMgb2YmbmJzcDs8Y29kZT5zPC9jb2RlPgord2hlcmUgdGhpcyBvY2N1cnJlbmNlIHN0YXJ0cyBhbmQgZW5kczsKK290aGVyd2lzZSwgaXQgcmV0dXJucyA8Yj5uaWw8L2I+LgorQSB0aGlyZCwgb3B0aW9uYWwgbnVtZXJpY2FsIGFyZ3VtZW50IDxjb2RlPmluaXQ8L2NvZGU+IHNwZWNpZmllcword2hlcmUgdG8gc3RhcnQgdGhlIHNlYXJjaDsKK2l0cyBkZWZhdWx0IHZhbHVlIGlzJm5ic3A7MSBhbmQgY2FuIGJlIG5lZ2F0aXZlLgorQSB2YWx1ZSBvZiA8Yj50cnVlPC9iPiBhcyBhIGZvdXJ0aCwgb3B0aW9uYWwgYXJndW1lbnQgPGNvZGU+cGxhaW48L2NvZGU+Cit0dXJucyBvZmYgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgZmFjaWxpdGllcywKK3NvIHRoZSBmdW5jdGlvbiBkb2VzIGEgcGxhaW4gImZpbmQgc3Vic3RyaW5nIiBvcGVyYXRpb24sCit3aXRoIG5vIGNoYXJhY3RlcnMgaW4gPGNvZGU+cGF0dGVybjwvY29kZT4gYmVpbmcgY29uc2lkZXJlZCBtYWdpYy4KK05vdGUgdGhhdCBpZiA8Y29kZT5wbGFpbjwvY29kZT4gaXMgZ2l2ZW4sIHRoZW4gPGNvZGU+aW5pdDwvY29kZT4gbXVzdCBiZSBnaXZlbiBhcyB3ZWxsLgorCisKKzxwPgorSWYgdGhlIHBhdHRlcm4gaGFzIGNhcHR1cmVzLAordGhlbiBpbiBhIHN1Y2Nlc3NmdWwgbWF0Y2gKK3RoZSBjYXB0dXJlZCB2YWx1ZXMgYXJlIGFsc28gcmV0dXJuZWQsCithZnRlciB0aGUgdHdvIGluZGljZXMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLmZvcm1hdCI+PGNvZGU+c3RyaW5nLmZvcm1hdCAoZm9ybWF0c3RyaW5nLCAmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIGl0cyB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzCitmb2xsb3dpbmcgdGhlIGRlc2NyaXB0aW9uIGdpdmVuIGluIGl0cyBmaXJzdCBhcmd1bWVudCAod2hpY2ggbXVzdCBiZSBhIHN0cmluZykuCitUaGUgZm9ybWF0IHN0cmluZyBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBBTlNJJm5ic3A7QyBmdW5jdGlvbiA8Y29kZT5zcHJpbnRmPC9jb2RlPi4KK1RoZSBvbmx5IGRpZmZlcmVuY2VzIGFyZSB0aGF0IHRoZSBvcHRpb25zL21vZGlmaWVycworPGNvZGU+KjwvY29kZT4sIDxjb2RlPmg8L2NvZGU+LCA8Y29kZT5MPC9jb2RlPiwgPGNvZGU+bDwvY29kZT4sIDxjb2RlPm48L2NvZGU+LAorYW5kIDxjb2RlPnA8L2NvZGU+IGFyZSBub3Qgc3VwcG9ydGVkCithbmQgdGhhdCB0aGVyZSBpcyBhbiBleHRyYSBvcHRpb24sIDxjb2RlPnE8L2NvZGU+LgorVGhlIDxjb2RlPnE8L2NvZGU+IG9wdGlvbiBmb3JtYXRzIGEgc3RyaW5nIGJldHdlZW4gZG91YmxlIHF1b3RlcywKK3VzaW5nIGVzY2FwZSBzZXF1ZW5jZXMgd2hlbiBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQKK2l0IGNhbiBzYWZlbHkgYmUgcmVhZCBiYWNrIGJ5IHRoZSBMdWEgaW50ZXJwcmV0ZXIuCitGb3IgaW5zdGFuY2UsIHRoZSBjYWxsCisKKzxwcmU+CisgICAgIHN0cmluZy5mb3JtYXQoJyVxJywgJ2Egc3RyaW5nIHdpdGggInF1b3RlcyIgYW5kIFxuIG5ldyBsaW5lJykKKzwvcHJlPjxwPgorbWF5IHByb2R1Y2UgdGhlIHN0cmluZzoKKworPHByZT4KKyAgICAgImEgc3RyaW5nIHdpdGggXCJxdW90ZXNcIiBhbmQgXAorICAgICAgbmV3IGxpbmUiCis8L3ByZT4KKworPHA+CitPcHRpb25zCis8Y29kZT5BPC9jb2RlPiBhbmQgPGNvZGU+YTwvY29kZT4gKHdoZW4gYXZhaWxhYmxlKSwKKzxjb2RlPkU8L2NvZGU+LCA8Y29kZT5lPC9jb2RlPiwgPGNvZGU+ZjwvY29kZT4sCis8Y29kZT5HPC9jb2RlPiwgYW5kIDxjb2RlPmc8L2NvZGU+IGFsbCBleHBlY3QgYSBudW1iZXIgYXMgYXJndW1lbnQuCitPcHRpb25zIDxjb2RlPmM8L2NvZGU+LCA8Y29kZT5kPC9jb2RlPiwKKzxjb2RlPmk8L2NvZGU+LCA8Y29kZT5vPC9jb2RlPiwgPGNvZGU+dTwvY29kZT4sIDxjb2RlPlg8L2NvZGU+LCBhbmQgPGNvZGU+eDwvY29kZT4KK2Fsc28gZXhwZWN0IGEgbnVtYmVyLAorYnV0IHRoZSByYW5nZSBvZiB0aGF0IG51bWJlciBtYXkgYmUgbGltaXRlZCBieQordGhlIHVuZGVybHlpbmcgQyZuYnNwO2ltcGxlbWVudGF0aW9uLgorRm9yIG9wdGlvbnMgPGNvZGU+bzwvY29kZT4sIDxjb2RlPnU8L2NvZGU+LCA8Y29kZT5YPC9jb2RlPiwgYW5kIDxjb2RlPng8L2NvZGU+LAordGhlIG51bWJlciBjYW5ub3QgYmUgbmVnYXRpdmUuCitPcHRpb24gPGNvZGU+cTwvY29kZT4gZXhwZWN0cyBhIHN0cmluZzsKK29wdGlvbiA8Y29kZT5zPC9jb2RlPiBleHBlY3RzIGEgc3RyaW5nIHdpdGhvdXQgZW1iZWRkZWQgemVyb3MuCitJZiB0aGUgYXJndW1lbnQgdG8gb3B0aW9uIDxjb2RlPnM8L2NvZGU+IGlzIG5vdCBhIHN0cmluZywKK2l0IGlzIGNvbnZlcnRlZCB0byBvbmUgZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGVzIG9mIDxhIGhyZWY9IiNwZGYtdG9zdHJpbmciPjxjb2RlPnRvc3RyaW5nPC9jb2RlPjwvYT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLmdtYXRjaCI+PGNvZGU+c3RyaW5nLmdtYXRjaCAocywgcGF0dGVybik8L2NvZGU+PC9hPjwvaDM+CitSZXR1cm5zIGFuIGl0ZXJhdG9yIGZ1bmN0aW9uIHRoYXQsCitlYWNoIHRpbWUgaXQgaXMgY2FsbGVkLAorcmV0dXJucyB0aGUgbmV4dCBjYXB0dXJlcyBmcm9tIDxjb2RlPnBhdHRlcm48L2NvZGU+IG92ZXIgdGhlIHN0cmluZyA8Y29kZT5zPC9jb2RlPi4KK0lmIDxjb2RlPnBhdHRlcm48L2NvZGU+IHNwZWNpZmllcyBubyBjYXB0dXJlcywKK3RoZW4gdGhlIHdob2xlIG1hdGNoIGlzIHByb2R1Y2VkIGluIGVhY2ggY2FsbC4KKworCis8cD4KK0FzIGFuIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgbG9vcAord2lsbCBpdGVyYXRlIG92ZXIgYWxsIHRoZSB3b3JkcyBmcm9tIHN0cmluZyA8Y29kZT5zPC9jb2RlPiwKK3ByaW50aW5nIG9uZSBwZXIgbGluZToKKworPHByZT4KKyAgICAgcyA9ICJoZWxsbyB3b3JsZCBmcm9tIEx1YSIKKyAgICAgZm9yIHcgaW4gc3RyaW5nLmdtYXRjaChzLCAiJWErIikgZG8KKyAgICAgICBwcmludCh3KQorICAgICBlbmQKKzwvcHJlPjxwPgorVGhlIG5leHQgZXhhbXBsZSBjb2xsZWN0cyBhbGwgcGFpcnMgPGNvZGU+a2V5PXZhbHVlPC9jb2RlPiBmcm9tIHRoZQorZ2l2ZW4gc3RyaW5nIGludG8gYSB0YWJsZToKKworPHByZT4KKyAgICAgdCA9IHt9CisgICAgIHMgPSAiZnJvbT13b3JsZCwgdG89THVhIgorICAgICBmb3IgaywgdiBpbiBzdHJpbmcuZ21hdGNoKHMsICIoJXcrKT0oJXcrKSIpIGRvCisgICAgICAgdFtrXSA9IHYKKyAgICAgZW5kCis8L3ByZT4KKworPHA+CitGb3IgdGhpcyBmdW5jdGlvbiwgYSBjYXJldCAnPGNvZGU+XjwvY29kZT4nIGF0IHRoZSBzdGFydCBvZiBhIHBhdHRlcm4gZG9lcyBub3QKK3dvcmsgYXMgYW4gYW5jaG9yLCBhcyB0aGlzIHdvdWxkIHByZXZlbnQgdGhlIGl0ZXJhdGlvbi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcuZ3N1YiI+PGNvZGU+c3RyaW5nLmdzdWIgKHMsIHBhdHRlcm4sIHJlcGwgWywgbl0pPC9jb2RlPjwvYT48L2gzPgorUmV0dXJucyBhIGNvcHkgb2YgPGNvZGU+czwvY29kZT4KK2luIHdoaWNoIGFsbCAob3IgdGhlIGZpcnN0IDxjb2RlPm48L2NvZGU+LCBpZiBnaXZlbikKK29jY3VycmVuY2VzIG9mIHRoZSA8Y29kZT5wYXR0ZXJuPC9jb2RlPiBoYXZlIGJlZW4KK3JlcGxhY2VkIGJ5IGEgcmVwbGFjZW1lbnQgc3RyaW5nIHNwZWNpZmllZCBieSA8Y29kZT5yZXBsPC9jb2RlPiwKK3doaWNoIGNhbiBiZSBhIHN0cmluZywgYSB0YWJsZSwgb3IgYSBmdW5jdGlvbi4KKzxjb2RlPmdzdWI8L2NvZGU+IGFsc28gcmV0dXJucywgYXMgaXRzIHNlY29uZCB2YWx1ZSwKK3RoZSB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyB0aGF0IG9jY3VycmVkLgorVGhlIG5hbWUgPGNvZGU+Z3N1YjwvY29kZT4gY29tZXMgZnJvbSA8ZW0+R2xvYmFsIFNVQnN0aXR1dGlvbjwvZW0+LgorCisKKzxwPgorSWYgPGNvZGU+cmVwbDwvY29kZT4gaXMgYSBzdHJpbmcsIHRoZW4gaXRzIHZhbHVlIGlzIHVzZWQgZm9yIHJlcGxhY2VtZW50LgorVGhlIGNoYXJhY3RlciZuYnNwOzxjb2RlPiU8L2NvZGU+IHdvcmtzIGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXI6Cithbnkgc2VxdWVuY2UgaW4gPGNvZGU+cmVwbDwvY29kZT4gb2YgdGhlIGZvcm0gPGNvZGU+JTxlbT5kPC9lbT48L2NvZGU+LAord2l0aCA8ZW0+ZDwvZW0+IGJldHdlZW4gMSBhbmQgOSwKK3N0YW5kcyBmb3IgdGhlIHZhbHVlIG9mIHRoZSA8ZW0+ZDwvZW0+LXRoIGNhcHR1cmVkIHN1YnN0cmluZy4KK1RoZSBzZXF1ZW5jZSA8Y29kZT4lMDwvY29kZT4gc3RhbmRzIGZvciB0aGUgd2hvbGUgbWF0Y2guCitUaGUgc2VxdWVuY2UgPGNvZGU+JSU8L2NvZGU+IHN0YW5kcyBmb3IgYSBzaW5nbGUmbmJzcDs8Y29kZT4lPC9jb2RlPi4KKworCis8cD4KK0lmIDxjb2RlPnJlcGw8L2NvZGU+IGlzIGEgdGFibGUsIHRoZW4gdGhlIHRhYmxlIGlzIHF1ZXJpZWQgZm9yIGV2ZXJ5IG1hdGNoLAordXNpbmcgdGhlIGZpcnN0IGNhcHR1cmUgYXMgdGhlIGtleS4KKworCis8cD4KK0lmIDxjb2RlPnJlcGw8L2NvZGU+IGlzIGEgZnVuY3Rpb24sIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSBhCittYXRjaCBvY2N1cnMsIHdpdGggYWxsIGNhcHR1cmVkIHN1YnN0cmluZ3MgcGFzc2VkIGFzIGFyZ3VtZW50cywKK2luIG9yZGVyLgorCisKKzxwPgorSW4gYW55IGNhc2UsCitpZiB0aGUgcGF0dGVybiBzcGVjaWZpZXMgbm8gY2FwdHVyZXMsCit0aGVuIGl0IGJlaGF2ZXMgYXMgaWYgdGhlIHdob2xlIHBhdHRlcm4gd2FzIGluc2lkZSBhIGNhcHR1cmUuCisKKworPHA+CitJZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHRhYmxlIHF1ZXJ5IG9yIGJ5IHRoZSBmdW5jdGlvbiBjYWxsCitpcyBhIHN0cmluZyBvciBhIG51bWJlciwKK3RoZW4gaXQgaXMgdXNlZCBhcyB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nOworb3RoZXJ3aXNlLCBpZiBpdCBpcyA8Yj5mYWxzZTwvYj4gb3IgPGI+bmlsPC9iPiwKK3RoZW4gdGhlcmUgaXMgbm8gcmVwbGFjZW1lbnQKKyh0aGF0IGlzLCB0aGUgb3JpZ2luYWwgbWF0Y2ggaXMga2VwdCBpbiB0aGUgc3RyaW5nKS4KKworCis8cD4KK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKKzxwcmU+CisgICAgIHggPSBzdHJpbmcuZ3N1YigiaGVsbG8gd29ybGQiLCAiKCV3KykiLCAiJTEgJTEiKQorICAgICAtLSZndDsgeD0iaGVsbG8gaGVsbG8gd29ybGQgd29ybGQiCisgICAgIAorICAgICB4ID0gc3RyaW5nLmdzdWIoImhlbGxvIHdvcmxkIiwgIiV3KyIsICIlMCAlMCIsIDEpCisgICAgIC0tJmd0OyB4PSJoZWxsbyBoZWxsbyB3b3JsZCIKKyAgICAgCisgICAgIHggPSBzdHJpbmcuZ3N1YigiaGVsbG8gd29ybGQgZnJvbSBMdWEiLCAiKCV3KyklcyooJXcrKSIsICIlMiAlMSIpCisgICAgIC0tJmd0OyB4PSJ3b3JsZCBoZWxsbyBMdWEgZnJvbSIKKyAgICAgCisgICAgIHggPSBzdHJpbmcuZ3N1YigiaG9tZSA9ICRIT01FLCB1c2VyID0gJFVTRVIiLCAiJSQoJXcrKSIsIG9zLmdldGVudikKKyAgICAgLS0mZ3Q7IHg9ImhvbWUgPSAvaG9tZS9yb2JlcnRvLCB1c2VyID0gcm9iZXJ0byIKKyAgICAgCisgICAgIHggPSBzdHJpbmcuZ3N1YigiNCs1ID0gJHJldHVybiA0KzUkIiwgIiUkKC4tKSUkIiwgZnVuY3Rpb24gKHMpCisgICAgICAgICAgIHJldHVybiBsb2FkKHMpKCkKKyAgICAgICAgIGVuZCkKKyAgICAgLS0mZ3Q7IHg9IjQrNSA9IDkiCisgICAgIAorICAgICBsb2NhbCB0ID0ge25hbWU9Imx1YSIsIHZlcnNpb249IjUuMiJ9CisgICAgIHggPSBzdHJpbmcuZ3N1YigiJG5hbWUtJHZlcnNpb24udGFyLmd6IiwgIiUkKCV3KykiLCB0KQorICAgICAtLSZndDsgeD0ibHVhLTUuMi50YXIuZ3oiCis8L3ByZT4KKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLmxlbiI+PGNvZGU+c3RyaW5nLmxlbiAocyk8L2NvZGU+PC9hPjwvaDM+CitSZWNlaXZlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBpdHMgbGVuZ3RoLgorVGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4gaGFzIGxlbmd0aCAwLgorRW1iZWRkZWQgemVyb3MgYXJlIGNvdW50ZWQsCitzbyA8Y29kZT4iYVwwMDBiY1wwMDAiPC9jb2RlPiBoYXMgbGVuZ3RoIDUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLmxvd2VyIj48Y29kZT5zdHJpbmcubG93ZXIgKHMpPC9jb2RlPjwvYT48L2gzPgorUmVjZWl2ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgc3RyaW5nIHdpdGggYWxsCit1cHBlcmNhc2UgbGV0dGVycyBjaGFuZ2VkIHRvIGxvd2VyY2FzZS4KK0FsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KK1RoZSBkZWZpbml0aW9uIG9mIHdoYXQgYW4gdXBwZXJjYXNlIGxldHRlciBpcyBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGxvY2FsZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcubWF0Y2giPjxjb2RlPnN0cmluZy5tYXRjaCAocywgcGF0dGVybiBbLCBpbml0XSk8L2NvZGU+PC9hPjwvaDM+CitMb29rcyBmb3IgdGhlIGZpcnN0IDxlbT5tYXRjaDwvZW0+IG9mCis8Y29kZT5wYXR0ZXJuPC9jb2RlPiBpbiB0aGUgc3RyaW5nIDxjb2RlPnM8L2NvZGU+LgorSWYgaXQgZmluZHMgb25lLCB0aGVuIDxjb2RlPm1hdGNoPC9jb2RlPiByZXR1cm5zCit0aGUgY2FwdHVyZXMgZnJvbSB0aGUgcGF0dGVybjsKK290aGVyd2lzZSBpdCByZXR1cm5zIDxiPm5pbDwvYj4uCitJZiA8Y29kZT5wYXR0ZXJuPC9jb2RlPiBzcGVjaWZpZXMgbm8gY2FwdHVyZXMsCit0aGVuIHRoZSB3aG9sZSBtYXRjaCBpcyByZXR1cm5lZC4KK0EgdGhpcmQsIG9wdGlvbmFsIG51bWVyaWNhbCBhcmd1bWVudCA8Y29kZT5pbml0PC9jb2RlPiBzcGVjaWZpZXMKK3doZXJlIHRvIHN0YXJ0IHRoZSBzZWFyY2g7CitpdHMgZGVmYXVsdCB2YWx1ZSBpcyZuYnNwOzEgYW5kIGNhbiBiZSBuZWdhdGl2ZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1zdHJpbmcucmVwIj48Y29kZT5zdHJpbmcucmVwIChzLCBuIFssIHNlcF0pPC9jb2RlPjwvYT48L2gzPgorUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIDxjb2RlPm48L2NvZGU+IGNvcGllcyBvZgordGhlIHN0cmluZyA8Y29kZT5zPC9jb2RlPiBzZXBhcmF0ZWQgYnkgdGhlIHN0cmluZyA8Y29kZT5zZXA8L2NvZGU+LgorVGhlIGRlZmF1bHQgdmFsdWUgZm9yIDxjb2RlPnNlcDwvY29kZT4gaXMgdGhlIGVtcHR5IHN0cmluZworKHRoYXQgaXMsIG5vIHNlcGFyYXRvcikuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLnJldmVyc2UiPjxjb2RlPnN0cmluZy5yZXZlcnNlIChzKTwvY29kZT48L2E+PC9oMz4KK1JldHVybnMgYSBzdHJpbmcgdGhhdCBpcyB0aGUgc3RyaW5nIDxjb2RlPnM8L2NvZGU+IHJldmVyc2VkLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXN0cmluZy5zdWIiPjxjb2RlPnN0cmluZy5zdWIgKHMsIGkgWywgal0pPC9jb2RlPjwvYT48L2gzPgorUmV0dXJucyB0aGUgc3Vic3RyaW5nIG9mIDxjb2RlPnM8L2NvZGU+IHRoYXQKK3N0YXJ0cyBhdCA8Y29kZT5pPC9jb2RlPiAgYW5kIGNvbnRpbnVlcyB1bnRpbCA8Y29kZT5qPC9jb2RlPjsKKzxjb2RlPmk8L2NvZGU+IGFuZCA8Y29kZT5qPC9jb2RlPiBjYW4gYmUgbmVnYXRpdmUuCitJZiA8Y29kZT5qPC9jb2RlPiBpcyBhYnNlbnQsIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSBlcXVhbCB0byAtMQorKHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBzdHJpbmcgbGVuZ3RoKS4KK0luIHBhcnRpY3VsYXIsCit0aGUgY2FsbCA8Y29kZT5zdHJpbmcuc3ViKHMsMSxqKTwvY29kZT4gcmV0dXJucyBhIHByZWZpeCBvZiA8Y29kZT5zPC9jb2RlPgord2l0aCBsZW5ndGggPGNvZGU+ajwvY29kZT4sCithbmQgPGNvZGU+c3RyaW5nLnN1YihzLCAtaSk8L2NvZGU+IHJldHVybnMgYSBzdWZmaXggb2YgPGNvZGU+czwvY29kZT4KK3dpdGggbGVuZ3RoIDxjb2RlPmk8L2NvZGU+LgorCisKKzxwPgorSWYsIGFmdGVyIHRoZSB0cmFuc2xhdGlvbiBvZiBuZWdhdGl2ZSBpbmRpY2VzLAorPGNvZGU+aTwvY29kZT4gaXMgbGVzcyB0aGFuIDEsCitpdCBpcyBjb3JyZWN0ZWQgdG8gMS4KK0lmIDxjb2RlPmo8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3RyaW5nIGxlbmd0aCwKK2l0IGlzIGNvcnJlY3RlZCB0byB0aGF0IGxlbmd0aC4KK0lmLCBhZnRlciB0aGVzZSBjb3JyZWN0aW9ucywKKzxjb2RlPmk8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT5qPC9jb2RlPiwKK3RoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtc3RyaW5nLnVwcGVyIj48Y29kZT5zdHJpbmcudXBwZXIgKHMpPC9jb2RlPjwvYT48L2gzPgorUmVjZWl2ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgc3RyaW5nIHdpdGggYWxsCitsb3dlcmNhc2UgbGV0dGVycyBjaGFuZ2VkIHRvIHVwcGVyY2FzZS4KK0FsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KK1RoZSBkZWZpbml0aW9uIG9mIHdoYXQgYSBsb3dlcmNhc2UgbGV0dGVyIGlzIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgorCisKKworPGgzPjYuNC4xICZuZGFzaDsgPGEgbmFtZT0iNi40LjEiPlBhdHRlcm5zPC9hPjwvaDM+CisKKworPGg0PkNoYXJhY3RlciBDbGFzczo8L2g0PjxwPgorQSA8ZW0+Y2hhcmFjdGVyIGNsYXNzPC9lbT4gaXMgdXNlZCB0byByZXByZXNlbnQgYSBzZXQgb2YgY2hhcmFjdGVycy4KK1RoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zIGFyZSBhbGxvd2VkIGluIGRlc2NyaWJpbmcgYSBjaGFyYWN0ZXIgY2xhc3M6CisKKzx1bD4KKworPGxpPjxiPjxlbT54PC9lbT46IDwvYj4KKyh3aGVyZSA8ZW0+eDwvZW0+IGlzIG5vdCBvbmUgb2YgdGhlIDxlbT5tYWdpYyBjaGFyYWN0ZXJzPC9lbT4KKzxjb2RlPl4kKCklLltdKistPzwvY29kZT4pCityZXByZXNlbnRzIHRoZSBjaGFyYWN0ZXIgPGVtPng8L2VtPiBpdHNlbGYuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+LjwvY29kZT46IDwvYj4gKGEgZG90KSByZXByZXNlbnRzIGFsbCBjaGFyYWN0ZXJzLjwvbGk+CisKKzxsaT48Yj48Y29kZT4lYTwvY29kZT46IDwvYj4gcmVwcmVzZW50cyBhbGwgbGV0dGVycy48L2xpPgorCis8bGk+PGI+PGNvZGU+JWM8L2NvZGU+OiA8L2I+IHJlcHJlc2VudHMgYWxsIGNvbnRyb2wgY2hhcmFjdGVycy48L2xpPgorCis8bGk+PGI+PGNvZGU+JWQ8L2NvZGU+OiA8L2I+IHJlcHJlc2VudHMgYWxsIGRpZ2l0cy48L2xpPgorCis8bGk+PGI+PGNvZGU+JWc8L2NvZGU+OiA8L2I+IHJlcHJlc2VudHMgYWxsIHByaW50YWJsZSBjaGFyYWN0ZXJzIGV4Y2VwdCBzcGFjZS48L2xpPgorCis8bGk+PGI+PGNvZGU+JWw8L2NvZGU+OiA8L2I+IHJlcHJlc2VudHMgYWxsIGxvd2VyY2FzZSBsZXR0ZXJzLjwvbGk+CisKKzxsaT48Yj48Y29kZT4lcDwvY29kZT46IDwvYj4gcmVwcmVzZW50cyBhbGwgcHVuY3R1YXRpb24gY2hhcmFjdGVycy48L2xpPgorCis8bGk+PGI+PGNvZGU+JXM8L2NvZGU+OiA8L2I+IHJlcHJlc2VudHMgYWxsIHNwYWNlIGNoYXJhY3RlcnMuPC9saT4KKworPGxpPjxiPjxjb2RlPiV1PC9jb2RlPjogPC9iPiByZXByZXNlbnRzIGFsbCB1cHBlcmNhc2UgbGV0dGVycy48L2xpPgorCis8bGk+PGI+PGNvZGU+JXc8L2NvZGU+OiA8L2I+IHJlcHJlc2VudHMgYWxsIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLjwvbGk+CisKKzxsaT48Yj48Y29kZT4leDwvY29kZT46IDwvYj4gcmVwcmVzZW50cyBhbGwgaGV4YWRlY2ltYWwgZGlnaXRzLjwvbGk+CisKKzxsaT48Yj48Y29kZT4lPGVtPng8L2VtPjwvY29kZT46IDwvYj4gKHdoZXJlIDxlbT54PC9lbT4gaXMgYW55IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyKQorcmVwcmVzZW50cyB0aGUgY2hhcmFjdGVyIDxlbT54PC9lbT4uCitUaGlzIGlzIHRoZSBzdGFuZGFyZCB3YXkgdG8gZXNjYXBlIHRoZSBtYWdpYyBjaGFyYWN0ZXJzLgorQW55IHB1bmN0dWF0aW9uIGNoYXJhY3RlciAoZXZlbiB0aGUgbm9uIG1hZ2ljKQorY2FuIGJlIHByZWNlZGVkIGJ5IGEgJzxjb2RlPiU8L2NvZGU+Jword2hlbiB1c2VkIHRvIHJlcHJlc2VudCBpdHNlbGYgaW4gYSBwYXR0ZXJuLgorPC9saT4KKworPGxpPjxiPjxjb2RlPls8ZW0+c2V0PC9lbT5dPC9jb2RlPjogPC9iPgorcmVwcmVzZW50cyB0aGUgY2xhc3Mgd2hpY2ggaXMgdGhlIHVuaW9uIG9mIGFsbAorY2hhcmFjdGVycyBpbiA8ZW0+c2V0PC9lbT4uCitBIHJhbmdlIG9mIGNoYXJhY3RlcnMgY2FuIGJlIHNwZWNpZmllZCBieQorc2VwYXJhdGluZyB0aGUgZW5kIGNoYXJhY3RlcnMgb2YgdGhlIHJhbmdlLAoraW4gYXNjZW5kaW5nIG9yZGVyLCB3aXRoIGEgJzxjb2RlPi08L2NvZGU+JywKK0FsbCBjbGFzc2VzIDxjb2RlPiU8L2NvZGU+PGVtPng8L2VtPiBkZXNjcmliZWQgYWJvdmUgY2FuIGFsc28gYmUgdXNlZCBhcworY29tcG9uZW50cyBpbiA8ZW0+c2V0PC9lbT4uCitBbGwgb3RoZXIgY2hhcmFjdGVycyBpbiA8ZW0+c2V0PC9lbT4gcmVwcmVzZW50IHRoZW1zZWx2ZXMuCitGb3IgZXhhbXBsZSwgPGNvZGU+WyV3X108L2NvZGU+IChvciA8Y29kZT5bXyV3XTwvY29kZT4pCityZXByZXNlbnRzIGFsbCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBwbHVzIHRoZSB1bmRlcnNjb3JlLAorPGNvZGU+WzAtN108L2NvZGU+IHJlcHJlc2VudHMgdGhlIG9jdGFsIGRpZ2l0cywKK2FuZCA8Y29kZT5bMC03JWwlLV08L2NvZGU+IHJlcHJlc2VudHMgdGhlIG9jdGFsIGRpZ2l0cyBwbHVzCit0aGUgbG93ZXJjYXNlIGxldHRlcnMgcGx1cyB0aGUgJzxjb2RlPi08L2NvZGU+JyBjaGFyYWN0ZXIuCisKKworPHA+CitUaGUgaW50ZXJhY3Rpb24gYmV0d2VlbiByYW5nZXMgYW5kIGNsYXNzZXMgaXMgbm90IGRlZmluZWQuCitUaGVyZWZvcmUsIHBhdHRlcm5zIGxpa2UgPGNvZGU+WyVhLXpdPC9jb2RlPiBvciA8Y29kZT5bYS0lJV08L2NvZGU+CitoYXZlIG5vIG1lYW5pbmcuCis8L2xpPgorCis8bGk+PGI+PGNvZGU+W148ZW0+c2V0PC9lbT5dPC9jb2RlPjogPC9iPgorcmVwcmVzZW50cyB0aGUgY29tcGxlbWVudCBvZiA8ZW0+c2V0PC9lbT4sCit3aGVyZSA8ZW0+c2V0PC9lbT4gaXMgaW50ZXJwcmV0ZWQgYXMgYWJvdmUuCis8L2xpPgorCis8L3VsPjxwPgorRm9yIGFsbCBjbGFzc2VzIHJlcHJlc2VudGVkIGJ5IHNpbmdsZSBsZXR0ZXJzICg8Y29kZT4lYTwvY29kZT4sIDxjb2RlPiVjPC9jb2RlPiwgZXRjLiksCit0aGUgY29ycmVzcG9uZGluZyB1cHBlcmNhc2UgbGV0dGVyIHJlcHJlc2VudHMgdGhlIGNvbXBsZW1lbnQgb2YgdGhlIGNsYXNzLgorRm9yIGluc3RhbmNlLCA8Y29kZT4lUzwvY29kZT4gcmVwcmVzZW50cyBhbGwgbm9uLXNwYWNlIGNoYXJhY3RlcnMuCisKKworPHA+CitUaGUgZGVmaW5pdGlvbnMgb2YgbGV0dGVyLCBzcGFjZSwgYW5kIG90aGVyIGNoYXJhY3RlciBncm91cHMKK2RlcGVuZCBvbiB0aGUgY3VycmVudCBsb2NhbGUuCitJbiBwYXJ0aWN1bGFyLCB0aGUgY2xhc3MgPGNvZGU+W2Etel08L2NvZGU+IG1heSBub3QgYmUgZXF1aXZhbGVudCB0byA8Y29kZT4lbDwvY29kZT4uCisKKworCisKKworPGg0PlBhdHRlcm4gSXRlbTo8L2g0PjxwPgorQSA8ZW0+cGF0dGVybiBpdGVtPC9lbT4gY2FuIGJlCisKKzx1bD4KKworPGxpPgorYSBzaW5nbGUgY2hhcmFjdGVyIGNsYXNzLAord2hpY2ggbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBpbiB0aGUgY2xhc3M7Cis8L2xpPgorCis8bGk+CithIHNpbmdsZSBjaGFyYWN0ZXIgY2xhc3MgZm9sbG93ZWQgYnkgJzxjb2RlPio8L2NvZGU+JywKK3doaWNoIG1hdGNoZXMgMCBvciBtb3JlIHJlcGV0aXRpb25zIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNsYXNzLgorVGhlc2UgcmVwZXRpdGlvbiBpdGVtcyB3aWxsIGFsd2F5cyBtYXRjaCB0aGUgbG9uZ2VzdCBwb3NzaWJsZSBzZXF1ZW5jZTsKKzwvbGk+CisKKzxsaT4KK2Egc2luZ2xlIGNoYXJhY3RlciBjbGFzcyBmb2xsb3dlZCBieSAnPGNvZGU+KzwvY29kZT4nLAord2hpY2ggbWF0Y2hlcyAxIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgY2hhcmFjdGVycyBpbiB0aGUgY2xhc3MuCitUaGVzZSByZXBldGl0aW9uIGl0ZW1zIHdpbGwgYWx3YXlzIG1hdGNoIHRoZSBsb25nZXN0IHBvc3NpYmxlIHNlcXVlbmNlOworPC9saT4KKworPGxpPgorYSBzaW5nbGUgY2hhcmFjdGVyIGNsYXNzIGZvbGxvd2VkIGJ5ICc8Y29kZT4tPC9jb2RlPicsCit3aGljaCBhbHNvIG1hdGNoZXMgMCBvciBtb3JlIHJlcGV0aXRpb25zIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNsYXNzLgorVW5saWtlICc8Y29kZT4qPC9jb2RlPicsCit0aGVzZSByZXBldGl0aW9uIGl0ZW1zIHdpbGwgYWx3YXlzIG1hdGNoIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSBzZXF1ZW5jZTsKKzwvbGk+CisKKzxsaT4KK2Egc2luZ2xlIGNoYXJhY3RlciBjbGFzcyBmb2xsb3dlZCBieSAnPGNvZGU+PzwvY29kZT4nLAord2hpY2ggbWF0Y2hlcyAwIG9yIDEgb2NjdXJyZW5jZSBvZiBhIGNoYXJhY3RlciBpbiB0aGUgY2xhc3M7Cis8L2xpPgorCis8bGk+Cis8Y29kZT4lPGVtPm48L2VtPjwvY29kZT4sIGZvciA8ZW0+bjwvZW0+IGJldHdlZW4gMSBhbmQgOTsKK3N1Y2ggaXRlbSBtYXRjaGVzIGEgc3Vic3RyaW5nIGVxdWFsIHRvIHRoZSA8ZW0+bjwvZW0+LXRoIGNhcHR1cmVkIHN0cmluZworKHNlZSBiZWxvdyk7Cis8L2xpPgorCis8bGk+Cis8Y29kZT4lYjxlbT54eTwvZW0+PC9jb2RlPiwgd2hlcmUgPGVtPng8L2VtPiBhbmQgPGVtPnk8L2VtPiBhcmUgdHdvIGRpc3RpbmN0IGNoYXJhY3RlcnM7CitzdWNoIGl0ZW0gbWF0Y2hlcyBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCZuYnNwOzxlbT54PC9lbT4sIGVuZCB3aXRoJm5ic3A7PGVtPnk8L2VtPiwKK2FuZCB3aGVyZSB0aGUgPGVtPng8L2VtPiBhbmQgPGVtPnk8L2VtPiBhcmUgPGVtPmJhbGFuY2VkPC9lbT4uCitUaGlzIG1lYW5zIHRoYXQsIGlmIG9uZSByZWFkcyB0aGUgc3RyaW5nIGZyb20gbGVmdCB0byByaWdodCwKK2NvdW50aW5nIDxlbT4rMTwvZW0+IGZvciBhbiA8ZW0+eDwvZW0+IGFuZCA8ZW0+LTE8L2VtPiBmb3IgYSA8ZW0+eTwvZW0+LAordGhlIGVuZGluZyA8ZW0+eTwvZW0+IGlzIHRoZSBmaXJzdCA8ZW0+eTwvZW0+IHdoZXJlIHRoZSBjb3VudCByZWFjaGVzIDAuCitGb3IgaW5zdGFuY2UsIHRoZSBpdGVtIDxjb2RlPiViKCk8L2NvZGU+IG1hdGNoZXMgZXhwcmVzc2lvbnMgd2l0aAorYmFsYW5jZWQgcGFyZW50aGVzZXMuCis8L2xpPgorCis8bGk+Cis8Y29kZT4lZls8ZW0+c2V0PC9lbT5dPC9jb2RlPiwgYSA8ZW0+ZnJvbnRpZXIgcGF0dGVybjwvZW0+Oworc3VjaCBpdGVtIG1hdGNoZXMgYW4gZW1wdHkgc3RyaW5nIGF0IGFueSBwb3NpdGlvbiBzdWNoIHRoYXQKK3RoZSBuZXh0IGNoYXJhY3RlciBiZWxvbmdzIHRvIDxlbT5zZXQ8L2VtPgorYW5kIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgZG9lcyBub3QgYmVsb25nIHRvIDxlbT5zZXQ8L2VtPi4KK1RoZSBzZXQgPGVtPnNldDwvZW0+IGlzIGludGVycHJldGVkIGFzIHByZXZpb3VzbHkgZGVzY3JpYmVkLgorVGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZCBvZiB0aGUgc3ViamVjdCBhcmUgaGFuZGxlZCBhcyBpZgordGhleSB3ZXJlIHRoZSBjaGFyYWN0ZXIgJzxjb2RlPlwwPC9jb2RlPicuCis8L2xpPgorCis8L3VsPgorCisKKworCis8aDQ+UGF0dGVybjo8L2g0PjxwPgorQSA8ZW0+cGF0dGVybjwvZW0+IGlzIGEgc2VxdWVuY2Ugb2YgcGF0dGVybiBpdGVtcy4KK0EgY2FyZXQgJzxjb2RlPl48L2NvZGU+JyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcGF0dGVybiBhbmNob3JzIHRoZSBtYXRjaCBhdCB0aGUKK2JlZ2lubmluZyBvZiB0aGUgc3ViamVjdCBzdHJpbmcuCitBICc8Y29kZT4kPC9jb2RlPicgYXQgdGhlIGVuZCBvZiBhIHBhdHRlcm4gYW5jaG9ycyB0aGUgbWF0Y2ggYXQgdGhlCitlbmQgb2YgdGhlIHN1YmplY3Qgc3RyaW5nLgorQXQgb3RoZXIgcG9zaXRpb25zLAorJzxjb2RlPl48L2NvZGU+JyBhbmQgJzxjb2RlPiQ8L2NvZGU+JyBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgcmVwcmVzZW50IHRoZW1zZWx2ZXMuCisKKworCisKKworPGg0PkNhcHR1cmVzOjwvaDQ+PHA+CitBIHBhdHRlcm4gY2FuIGNvbnRhaW4gc3ViLXBhdHRlcm5zIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzOwordGhleSBkZXNjcmliZSA8ZW0+Y2FwdHVyZXM8L2VtPi4KK1doZW4gYSBtYXRjaCBzdWNjZWVkcywgdGhlIHN1YnN0cmluZ3Mgb2YgdGhlIHN1YmplY3Qgc3RyaW5nCit0aGF0IG1hdGNoIGNhcHR1cmVzIGFyZSBzdG9yZWQgKDxlbT5jYXB0dXJlZDwvZW0+KSBmb3IgZnV0dXJlIHVzZS4KK0NhcHR1cmVzIGFyZSBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgbGVmdCBwYXJlbnRoZXNlcy4KK0ZvciBpbnN0YW5jZSwgaW4gdGhlIHBhdHRlcm4gPGNvZGU+IihhKiguKSV3KCVzKikpIjwvY29kZT4sCit0aGUgcGFydCBvZiB0aGUgc3RyaW5nIG1hdGNoaW5nIDxjb2RlPiJhKiguKSV3KCVzKikiPC9jb2RlPiBpcworc3RvcmVkIGFzIHRoZSBmaXJzdCBjYXB0dXJlIChhbmQgdGhlcmVmb3JlIGhhcyBudW1iZXImbmJzcDsxKTsKK3RoZSBjaGFyYWN0ZXIgbWF0Y2hpbmcgIjxjb2RlPi48L2NvZGU+IiBpcyBjYXB0dXJlZCB3aXRoIG51bWJlciZuYnNwOzIsCithbmQgdGhlIHBhcnQgbWF0Y2hpbmcgIjxjb2RlPiVzKjwvY29kZT4iIGhhcyBudW1iZXImbmJzcDszLgorCisKKzxwPgorQXMgYSBzcGVjaWFsIGNhc2UsIHRoZSBlbXB0eSBjYXB0dXJlIDxjb2RlPigpPC9jb2RlPiBjYXB0dXJlcwordGhlIGN1cnJlbnQgc3RyaW5nIHBvc2l0aW9uIChhIG51bWJlcikuCitGb3IgaW5zdGFuY2UsIGlmIHdlIGFwcGx5IHRoZSBwYXR0ZXJuIDxjb2RlPiIoKWFhKCkiPC9jb2RlPiBvbiB0aGUKK3N0cmluZyA8Y29kZT4iZmxhYWFwIjwvY29kZT4sIHRoZXJlIHdpbGwgYmUgdHdvIGNhcHR1cmVzOiAzJm5ic3A7YW5kJm5ic3A7NS4KKworCisKKworCisKKworCisKKworCis8aDI+Ni41ICZuZGFzaDsgPGEgbmFtZT0iNi41Ij5UYWJsZSBNYW5pcHVsYXRpb248L2E+PC9oMj4KKworPHA+CitUaGlzIGxpYnJhcnkgcHJvdmlkZXMgZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIHRhYmxlIG1hbmlwdWxhdGlvbi4KK0l0IHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25zIGluc2lkZSB0aGUgdGFibGUgPGEgbmFtZT0icGRmLXRhYmxlIj48Y29kZT50YWJsZTwvY29kZT48L2E+LgorCisKKzxwPgorUmVtZW1iZXIgdGhhdCwgd2hlbmV2ZXIgYW4gb3BlcmF0aW9uIG5lZWRzIHRoZSBsZW5ndGggb2YgYSB0YWJsZSwKK3RoZSB0YWJsZSBzaG91bGQgYmUgYSBwcm9wZXIgc2VxdWVuY2UKK29yIGhhdmUgYSA8Y29kZT5fX2xlbjwvY29kZT4gbWV0YW1ldGhvZCAoc2VlIDxhIGhyZWY9IiMzLjQuNiI+JnNlY3Q7My40LjY8L2E+KS4KK0FsbCBmdW5jdGlvbnMgaWdub3JlIG5vbi1udW1lcmljIGtleXMKK2luIHRhYmxlcyBnaXZlbiBhcyBhcmd1bWVudHMuCisKKworPHA+CitGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKK2FsbCB0YWJsZSBhY2Nlc3NlcyAoZ2V0L3NldCkgcGVyZm9ybWVkIGJ5IHRoZXNlIGZ1bmN0aW9ucyBhcmUgcmF3LgorCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtdGFibGUuY29uY2F0Ij48Y29kZT50YWJsZS5jb25jYXQgKGxpc3QgWywgc2VwIFssIGkgWywgal1dXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitHaXZlbiBhIGxpc3Qgd2hlcmUgYWxsIGVsZW1lbnRzIGFyZSBzdHJpbmdzIG9yIG51bWJlcnMsCityZXR1cm5zIHRoZSBzdHJpbmcgPGNvZGU+bGlzdFtpXS4uc2VwLi5saXN0W2krMV0gJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7IHNlcC4ubGlzdFtqXTwvY29kZT4uCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+c2VwPC9jb2RlPiBpcyB0aGUgZW1wdHkgc3RyaW5nLAordGhlIGRlZmF1bHQgZm9yIDxjb2RlPmk8L2NvZGU+IGlzIDEsCithbmQgdGhlIGRlZmF1bHQgZm9yIDxjb2RlPmo8L2NvZGU+IGlzIDxjb2RlPiNsaXN0PC9jb2RlPi4KK0lmIDxjb2RlPmk8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiA8Y29kZT5qPC9jb2RlPiwgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXRhYmxlLmluc2VydCI+PGNvZGU+dGFibGUuaW5zZXJ0IChsaXN0LCBbcG9zLF0gdmFsdWUpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorSW5zZXJ0cyBlbGVtZW50IDxjb2RlPnZhbHVlPC9jb2RlPiBhdCBwb3NpdGlvbiA8Y29kZT5wb3M8L2NvZGU+IGluIDxjb2RlPmxpc3Q8L2NvZGU+LAorc2hpZnRpbmcgdXAgdGhlIGVsZW1lbnRzCis8Y29kZT5saXN0W3Bvc10sIGxpc3RbcG9zKzFdLCAmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDssIGxpc3RbI2xpc3RdPC9jb2RlPi4KK1RoZSBkZWZhdWx0IHZhbHVlIGZvciA8Y29kZT5wb3M8L2NvZGU+IGlzIDxjb2RlPiNsaXN0KzE8L2NvZGU+LAorc28gdGhhdCBhIGNhbGwgPGNvZGU+dGFibGUuaW5zZXJ0KHQseCk8L2NvZGU+IGluc2VydHMgPGNvZGU+eDwvY29kZT4gYXQgdGhlIGVuZAorb2YgbGlzdCA8Y29kZT50PC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi10YWJsZS5wYWNrIj48Y29kZT50YWJsZS5wYWNrICgmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyBhIG5ldyB0YWJsZSB3aXRoIGFsbCBwYXJhbWV0ZXJzIHN0b3JlZCBpbnRvIGtleXMgMSwgMiwgZXRjLgorYW5kIHdpdGggYSBmaWVsZCAiPGNvZGU+bjwvY29kZT4iIHdpdGggdGhlIHRvdGFsIG51bWJlciBvZiBwYXJhbWV0ZXJzLgorTm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgdGFibGUgbWF5IG5vdCBiZSBhIHNlcXVlbmNlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXRhYmxlLnJlbW92ZSI+PGNvZGU+dGFibGUucmVtb3ZlIChsaXN0IFssIHBvc10pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmVtb3ZlcyBmcm9tIDxjb2RlPmxpc3Q8L2NvZGU+IHRoZSBlbGVtZW50IGF0IHBvc2l0aW9uIDxjb2RlPnBvczwvY29kZT4sCityZXR1cm5pbmcgdGhlIHZhbHVlIG9mIHRoZSByZW1vdmVkIGVsZW1lbnQuCitXaGVuIDxjb2RlPnBvczwvY29kZT4gaXMgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDxjb2RlPiNsaXN0PC9jb2RlPiwKK2l0IHNoaWZ0cyBkb3duIHRoZSBlbGVtZW50cworPGNvZGU+bGlzdFtwb3MrMV0sIGxpc3RbcG9zKzJdLCAmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDssIGxpc3RbI2xpc3RdPC9jb2RlPgorYW5kIGVyYXNlcyBlbGVtZW50IDxjb2RlPmxpc3RbI2xpc3RdPC9jb2RlPjsKK1RoZSBpbmRleCA8Y29kZT5wb3M8L2NvZGU+IGNhbiBhbHNvIGJlIDAgd2hlbiA8Y29kZT4jbGlzdDwvY29kZT4gaXMgMCwKK29yIDxjb2RlPiNsaXN0ICsgMTwvY29kZT47CitpbiB0aG9zZSBjYXNlcywgdGhlIGZ1bmN0aW9uIGVyYXNlcyB0aGUgZWxlbWVudCA8Y29kZT5saXN0W3Bvc108L2NvZGU+LgorCisKKzxwPgorVGhlIGRlZmF1bHQgdmFsdWUgZm9yIDxjb2RlPnBvczwvY29kZT4gaXMgPGNvZGU+I2xpc3Q8L2NvZGU+LAorc28gdGhhdCBhIGNhbGwgPGNvZGU+dGFibGUucmVtb3ZlKHQpPC9jb2RlPiByZW1vdmVzIHRoZSBsYXN0IGVsZW1lbnQKK29mIGxpc3QgPGNvZGU+dDwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtdGFibGUuc29ydCI+PGNvZGU+dGFibGUuc29ydCAobGlzdCBbLCBjb21wXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTb3J0cyBsaXN0IGVsZW1lbnRzIGluIGEgZ2l2ZW4gb3JkZXIsIDxlbT5pbi1wbGFjZTwvZW0+LAorZnJvbSA8Y29kZT5saXN0WzFdPC9jb2RlPiB0byA8Y29kZT5saXN0WyNsaXN0XTwvY29kZT4uCitJZiA8Y29kZT5jb21wPC9jb2RlPiBpcyBnaXZlbiwKK3RoZW4gaXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdHdvIGxpc3QgZWxlbWVudHMKK2FuZCByZXR1cm5zIHRydWUgd2hlbiB0aGUgZmlyc3QgZWxlbWVudCBtdXN0IGNvbWUKK2JlZm9yZSB0aGUgc2Vjb25kIGluIHRoZSBmaW5hbCBvcmRlcgorKHNvIHRoYXQgPGNvZGU+bm90IGNvbXAobGlzdFtpKzFdLGxpc3RbaV0pPC9jb2RlPiB3aWxsIGJlIHRydWUgYWZ0ZXIgdGhlIHNvcnQpLgorSWYgPGNvZGU+Y29tcDwvY29kZT4gaXMgbm90IGdpdmVuLAordGhlbiB0aGUgc3RhbmRhcmQgTHVhIG9wZXJhdG9yIDxjb2RlPiZsdDs8L2NvZGU+IGlzIHVzZWQgaW5zdGVhZC4KKworCis8cD4KK1RoZSBzb3J0IGFsZ29yaXRobSBpcyBub3Qgc3RhYmxlOwordGhhdCBpcywgZWxlbWVudHMgY29uc2lkZXJlZCBlcXVhbCBieSB0aGUgZ2l2ZW4gb3JkZXIKK21heSBoYXZlIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9ucyBjaGFuZ2VkIGJ5IHRoZSBzb3J0LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLXRhYmxlLnVucGFjayI+PGNvZGU+dGFibGUudW5wYWNrIChsaXN0IFssIGkgWywgal1dKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGdpdmVuIHRhYmxlLgorVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCisKKzxwcmU+CisgICAgIHJldHVybiBsaXN0W2ldLCBsaXN0W2krMV0sICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OywgbGlzdFtqXQorPC9wcmU+PHA+CitCeSBkZWZhdWx0LCA8Y29kZT5pPC9jb2RlPiBpcyZuYnNwOzEgYW5kIDxjb2RlPmo8L2NvZGU+IGlzIDxjb2RlPiNsaXN0PC9jb2RlPi4KKworCisKKworCisKKworPGgyPjYuNiAmbmRhc2g7IDxhIG5hbWU9IjYuNiI+TWF0aGVtYXRpY2FsIEZ1bmN0aW9uczwvYT48L2gyPgorCis8cD4KK1RoaXMgbGlicmFyeSBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIHN0YW5kYXJkIEMmbmJzcDttYXRoIGxpYnJhcnkuCitJdCBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9ucyBpbnNpZGUgdGhlIHRhYmxlIDxhIG5hbWU9InBkZi1tYXRoIj48Y29kZT5tYXRoPC9jb2RlPjwvYT4uCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLmFicyI+PGNvZGU+bWF0aC5hYnMgKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgPGNvZGU+eDwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5hY29zIj48Y29kZT5tYXRoLmFjb3MgKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYXJjIGNvc2luZSBvZiA8Y29kZT54PC9jb2RlPiAoaW4gcmFkaWFucykuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5hc2luIj48Y29kZT5tYXRoLmFzaW4gKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYXJjIHNpbmUgb2YgPGNvZGU+eDwvY29kZT4gKGluIHJhZGlhbnMpLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGguYXRhbiI+PGNvZGU+bWF0aC5hdGFuICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGFyYyB0YW5nZW50IG9mIDxjb2RlPng8L2NvZGU+IChpbiByYWRpYW5zKS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLmF0YW4yIj48Y29kZT5tYXRoLmF0YW4yICh5LCB4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGFyYyB0YW5nZW50IG9mIDxjb2RlPnkveDwvY29kZT4gKGluIHJhZGlhbnMpLAorYnV0IHVzZXMgdGhlIHNpZ25zIG9mIGJvdGggcGFyYW1ldGVycyB0byBmaW5kIHRoZQorcXVhZHJhbnQgb2YgdGhlIHJlc3VsdC4KKyhJdCBhbHNvIGhhbmRsZXMgY29ycmVjdGx5IHRoZSBjYXNlIG9mIDxjb2RlPng8L2NvZGU+IGJlaW5nIHplcm8uKQorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGguY2VpbCI+PGNvZGU+bWF0aC5jZWlsICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHNtYWxsZXN0IGludGVnZXIgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+eDwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5jb3MiPjxjb2RlPm1hdGguY29zICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGNvc2luZSBvZiA8Y29kZT54PC9jb2RlPiAoYXNzdW1lZCB0byBiZSBpbiByYWRpYW5zKS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLmNvc2giPjxjb2RlPm1hdGguY29zaCAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiA8Y29kZT54PC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLmRlZyI+PGNvZGU+bWF0aC5kZWcgKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYW5nbGUgPGNvZGU+eDwvY29kZT4gKGdpdmVuIGluIHJhZGlhbnMpIGluIGRlZ3JlZXMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5leHAiPjxjb2RlPm1hdGguZXhwICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHZhbHVlIDxlbT5lPHN1cD54PC9zdXA+PC9lbT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5mbG9vciI+PGNvZGU+bWF0aC5mbG9vciAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBsYXJnZXN0IGludGVnZXIgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPng8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGguZm1vZCI+PGNvZGU+bWF0aC5mbW9kICh4LCB5KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHJlbWFpbmRlciBvZiB0aGUgZGl2aXNpb24gb2YgPGNvZGU+eDwvY29kZT4gYnkgPGNvZGU+eTwvY29kZT4KK3RoYXQgcm91bmRzIHRoZSBxdW90aWVudCB0b3dhcmRzIHplcm8uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5mcmV4cCI+PGNvZGU+bWF0aC5mcmV4cCAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIDxjb2RlPm08L2NvZGU+IGFuZCA8Y29kZT5lPC9jb2RlPiBzdWNoIHRoYXQgPGVtPnggPSBtMjxzdXA+ZTwvc3VwPjwvZW0+LAorPGNvZGU+ZTwvY29kZT4gaXMgYW4gaW50ZWdlciBhbmQgdGhlIGFic29sdXRlIHZhbHVlIG9mIDxjb2RlPm08L2NvZGU+IGlzCitpbiB0aGUgcmFuZ2UgPGVtPlswLjUsIDEpPC9lbT4KKyhvciB6ZXJvIHdoZW4gPGNvZGU+eDwvY29kZT4gaXMgemVybykuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5odWdlIj48Y29kZT5tYXRoLmh1Z2U8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitUaGUgdmFsdWUgPGNvZGU+SFVHRV9WQUw8L2NvZGU+LAorYSB2YWx1ZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byBhbnkgb3RoZXIgbnVtZXJpY2FsIHZhbHVlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgubGRleHAiPjxjb2RlPm1hdGgubGRleHAgKG0sIGUpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyA8ZW0+bTI8c3VwPmU8L3N1cD48L2VtPiAoPGNvZGU+ZTwvY29kZT4gc2hvdWxkIGJlIGFuIGludGVnZXIpLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgubG9nIj48Y29kZT5tYXRoLmxvZyAoeCBbLCBiYXNlXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBsb2dhcml0aG0gb2YgPGNvZGU+eDwvY29kZT4gaW4gdGhlIGdpdmVuIGJhc2UuCitUaGUgZGVmYXVsdCBmb3IgPGNvZGU+YmFzZTwvY29kZT4gaXMgPGVtPmU8L2VtPgorKHNvIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIDxjb2RlPng8L2NvZGU+KS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLm1heCI+PGNvZGU+bWF0aC5tYXggKHgsICZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlIGFtb25nIGl0cyBhcmd1bWVudHMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5taW4iPjxjb2RlPm1hdGgubWluICh4LCAmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZSBhbW9uZyBpdHMgYXJndW1lbnRzLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgubW9kZiI+PGNvZGU+bWF0aC5tb2RmICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdHdvIG51bWJlcnMsCit0aGUgaW50ZWdyYWwgcGFydCBvZiA8Y29kZT54PC9jb2RlPiBhbmQgdGhlIGZyYWN0aW9uYWwgcGFydCBvZiA8Y29kZT54PC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLnBpIj48Y29kZT5tYXRoLnBpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorVGhlIHZhbHVlIG9mIDxlbT4mcGk7PC9lbT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5wb3ciPjxjb2RlPm1hdGgucG93ICh4LCB5KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgPGVtPng8c3VwPnk8L3N1cD48L2VtPi4KKyhZb3UgY2FuIGFsc28gdXNlIHRoZSBleHByZXNzaW9uIDxjb2RlPnheeTwvY29kZT4gdG8gY29tcHV0ZSB0aGlzIHZhbHVlLikKKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLnJhZCI+PGNvZGU+bWF0aC5yYWQgKHgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgYW5nbGUgPGNvZGU+eDwvY29kZT4gKGdpdmVuIGluIGRlZ3JlZXMpIGluIHJhZGlhbnMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtbWF0aC5yYW5kb20iPjxjb2RlPm1hdGgucmFuZG9tIChbbSBbLCBuXV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIHNpbXBsZQorcHNldWRvLXJhbmRvbSBnZW5lcmF0b3IgZnVuY3Rpb24gPGNvZGU+cmFuZDwvY29kZT4gcHJvdmlkZWQgYnkgU3RhbmRhcmQmbmJzcDtDLgorKE5vIGd1YXJhbnRlZXMgY2FuIGJlIGdpdmVuIGZvciBpdHMgc3RhdGlzdGljYWwgcHJvcGVydGllcy4pCisKKworPHA+CitXaGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywKK3JldHVybnMgYSB1bmlmb3JtIHBzZXVkby1yYW5kb20gcmVhbCBudW1iZXIKK2luIHRoZSByYW5nZSA8ZW0+WzAsMSk8L2VtPi4gIAorV2hlbiBjYWxsZWQgd2l0aCBhbiBpbnRlZ2VyIG51bWJlciA8Y29kZT5tPC9jb2RlPiwKKzxjb2RlPm1hdGgucmFuZG9tPC9jb2RlPiByZXR1cm5zCithIHVuaWZvcm0gcHNldWRvLXJhbmRvbSBpbnRlZ2VyIGluIHRoZSByYW5nZSA8ZW0+WzEsIG1dPC9lbT4uCitXaGVuIGNhbGxlZCB3aXRoIHR3byBpbnRlZ2VyIG51bWJlcnMgPGNvZGU+bTwvY29kZT4gYW5kIDxjb2RlPm48L2NvZGU+LAorPGNvZGU+bWF0aC5yYW5kb208L2NvZGU+IHJldHVybnMgYSB1bmlmb3JtIHBzZXVkby1yYW5kb20KK2ludGVnZXIgaW4gdGhlIHJhbmdlIDxlbT5bbSwgbl08L2VtPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLnJhbmRvbXNlZWQiPjxjb2RlPm1hdGgucmFuZG9tc2VlZCAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIDxjb2RlPng8L2NvZGU+IGFzIHRoZSAic2VlZCIKK2ZvciB0aGUgcHNldWRvLXJhbmRvbSBnZW5lcmF0b3I6CitlcXVhbCBzZWVkcyBwcm9kdWNlIGVxdWFsIHNlcXVlbmNlcyBvZiBudW1iZXJzLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGguc2luIj48Y29kZT5tYXRoLnNpbiAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBzaW5lIG9mIDxjb2RlPng8L2NvZGU+IChhc3N1bWVkIHRvIGJlIGluIHJhZGlhbnMpLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGguc2luaCI+PGNvZGU+bWF0aC5zaW5oICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGh5cGVyYm9saWMgc2luZSBvZiA8Y29kZT54PC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1tYXRoLnNxcnQiPjxjb2RlPm1hdGguc3FydCAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiA8Y29kZT54PC9jb2RlPi4KKyhZb3UgY2FuIGFsc28gdXNlIHRoZSBleHByZXNzaW9uIDxjb2RlPnheMC41PC9jb2RlPiB0byBjb21wdXRlIHRoaXMgdmFsdWUuKQorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgudGFuIj48Y29kZT5tYXRoLnRhbiAoeCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSB0YW5nZW50IG9mIDxjb2RlPng8L2NvZGU+IChhc3N1bWVkIHRvIGJlIGluIHJhZGlhbnMpLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW1hdGgudGFuaCI+PGNvZGU+bWF0aC50YW5oICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGh5cGVyYm9saWMgdGFuZ2VudCBvZiA8Y29kZT54PC9jb2RlPi4KKworCisKKworCisKKworPGgyPjYuNyAmbmRhc2g7IDxhIG5hbWU9IjYuNyI+Qml0d2lzZSBPcGVyYXRpb25zPC9hPjwvaDI+CisKKzxwPgorVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIGJpdHdpc2Ugb3BlcmF0aW9ucy4KK0l0IHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25zIGluc2lkZSB0aGUgdGFibGUgPGEgbmFtZT0icGRmLWJpdDMyIj48Y29kZT5iaXQzMjwvY29kZT48L2E+LgorCisKKzxwPgorVW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsCithbGwgZnVuY3Rpb25zIGFjY2VwdCBudW1lcmljIGFyZ3VtZW50cyBpbiB0aGUgcmFuZ2UKKzxlbT4oLTI8c3VwPjUxPC9zdXA+LCsyPHN1cD41MTwvc3VwPik8L2VtPjsKK2VhY2ggYXJndW1lbnQgaXMgbm9ybWFsaXplZCB0bwordGhlIHJlbWFpbmRlciBvZiBpdHMgZGl2aXNpb24gYnkgPGVtPjI8c3VwPjMyPC9zdXA+PC9lbT4KK2FuZCB0cnVuY2F0ZWQgdG8gYW4gaW50ZWdlciAoaW4gc29tZSB1bnNwZWNpZmllZCB3YXkpLAorc28gdGhhdCBpdHMgZmluYWwgdmFsdWUgZmFsbHMgaW4gdGhlIHJhbmdlIDxlbT5bMCwyPHN1cD4zMjwvc3VwPiAtIDFdPC9lbT4uCitTaW1pbGFybHksIGFsbCByZXN1bHRzIGFyZSBpbiB0aGUgcmFuZ2UgPGVtPlswLDI8c3VwPjMyPC9zdXA+IC0gMV08L2VtPi4KK05vdGUgdGhhdCA8Y29kZT5iaXQzMi5ibm90KDApPC9jb2RlPiBpcyA8Y29kZT4weEZGRkZGRkZGPC9jb2RlPiwKK3doaWNoIGlzIGRpZmZlcmVudCBmcm9tIDxjb2RlPi0xPC9jb2RlPi4KKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWJpdDMyLmFyc2hpZnQiPjxjb2RlPmJpdDMyLmFyc2hpZnQgKHgsIGRpc3ApPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgbnVtYmVyIDxjb2RlPng8L2NvZGU+IHNoaWZ0ZWQgPGNvZGU+ZGlzcDwvY29kZT4gYml0cyB0byB0aGUgcmlnaHQuCitUaGUgbnVtYmVyIDxjb2RlPmRpc3A8L2NvZGU+IG1heSBiZSBhbnkgcmVwcmVzZW50YWJsZSBpbnRlZ2VyLgorTmVnYXRpdmUgZGlzcGxhY2VtZW50cyBzaGlmdCB0byB0aGUgbGVmdC4KKworCis8cD4KK1RoaXMgc2hpZnQgb3BlcmF0aW9uIGlzIHdoYXQgaXMgY2FsbGVkIGFyaXRobWV0aWMgc2hpZnQuCitWYWNhbnQgYml0cyBvbiB0aGUgbGVmdCBhcmUgZmlsbGVkCit3aXRoIGNvcGllcyBvZiB0aGUgaGlnaGVyIGJpdCBvZiA8Y29kZT54PC9jb2RlPjsKK3ZhY2FudCBiaXRzIG9uIHRoZSByaWdodCBhcmUgZmlsbGVkIHdpdGggemVyb3MuCitJbiBwYXJ0aWN1bGFyLAorZGlzcGxhY2VtZW50cyB3aXRoIGFic29sdXRlIHZhbHVlcyBoaWdoZXIgdGhhbiAzMQorcmVzdWx0IGluIHplcm8gb3IgPGNvZGU+MHhGRkZGRkZGRjwvY29kZT4gKGFsbCBvcmlnaW5hbCBiaXRzIGFyZSBzaGlmdGVkIG91dCkuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtYml0MzIuYmFuZCI+PGNvZGU+Yml0MzIuYmFuZCAoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGJpdHdpc2UgPGVtPmFuZDwvZW0+IG9mIGl0cyBvcGVyYW5kcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1iaXQzMi5ibm90Ij48Y29kZT5iaXQzMi5ibm90ICh4KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIGJpdHdpc2UgbmVnYXRpb24gb2YgPGNvZGU+eDwvY29kZT4uCitGb3IgYW55IGludGVnZXIgPGNvZGU+eDwvY29kZT4sCit0aGUgZm9sbG93aW5nIGlkZW50aXR5IGhvbGRzOgorCis8cHJlPgorICAgICBhc3NlcnQoYml0MzIuYm5vdCh4KSA9PSAoLTEgLSB4KSAlIDJeMzIpCis8L3ByZT4KKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtYml0MzIuYm9yIj48Y29kZT5iaXQzMi5ib3IgKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBiaXR3aXNlIDxlbT5vcjwvZW0+IG9mIGl0cyBvcGVyYW5kcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1iaXQzMi5idGVzdCI+PGNvZGU+Yml0MzIuYnRlc3QgKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIGEgYm9vbGVhbiBzaWduYWxpbmcKK3doZXRoZXIgdGhlIGJpdHdpc2UgPGVtPmFuZDwvZW0+IG9mIGl0cyBvcGVyYW5kcyBpcyBkaWZmZXJlbnQgZnJvbSB6ZXJvLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWJpdDMyLmJ4b3IiPjxjb2RlPmJpdDMyLmJ4b3IgKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBiaXR3aXNlIDxlbT5leGNsdXNpdmUgb3I8L2VtPiBvZiBpdHMgb3BlcmFuZHMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtYml0MzIuZXh0cmFjdCI+PGNvZGU+Yml0MzIuZXh0cmFjdCAobiwgZmllbGQgWywgd2lkdGhdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHVuc2lnbmVkIG51bWJlciBmb3JtZWQgYnkgdGhlIGJpdHMKKzxjb2RlPmZpZWxkPC9jb2RlPiB0byA8Y29kZT5maWVsZCArIHdpZHRoIC0gMTwvY29kZT4gZnJvbSA8Y29kZT5uPC9jb2RlPi4KK0JpdHMgYXJlIG51bWJlcmVkIGZyb20gMCAobGVhc3Qgc2lnbmlmaWNhbnQpIHRvIDMxIChtb3N0IHNpZ25pZmljYW50KS4KK0FsbCBhY2Nlc3NlZCBiaXRzIG11c3QgYmUgaW4gdGhlIHJhbmdlIDxlbT5bMCwgMzFdPC9lbT4uCisKKworPHA+CitUaGUgZGVmYXVsdCBmb3IgPGNvZGU+d2lkdGg8L2NvZGU+IGlzIDEuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtYml0MzIucmVwbGFjZSI+PGNvZGU+Yml0MzIucmVwbGFjZSAobiwgdiwgZmllbGQgWywgd2lkdGhdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgYSBjb3B5IG9mIDxjb2RlPm48L2NvZGU+IHdpdGgKK3RoZSBiaXRzIDxjb2RlPmZpZWxkPC9jb2RlPiB0byA8Y29kZT5maWVsZCArIHdpZHRoIC0gMTwvY29kZT4KK3JlcGxhY2VkIGJ5IHRoZSB2YWx1ZSA8Y29kZT52PC9jb2RlPi4KK1NlZSA8YSBocmVmPSIjcGRmLWJpdDMyLmV4dHJhY3QiPjxjb2RlPmJpdDMyLmV4dHJhY3Q8L2NvZGU+PC9hPiBmb3IgZGV0YWlscyBhYm91dCA8Y29kZT5maWVsZDwvY29kZT4gYW5kIDxjb2RlPndpZHRoPC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1iaXQzMi5scm90YXRlIj48Y29kZT5iaXQzMi5scm90YXRlICh4LCBkaXNwKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIG51bWJlciA8Y29kZT54PC9jb2RlPiByb3RhdGVkIDxjb2RlPmRpc3A8L2NvZGU+IGJpdHMgdG8gdGhlIGxlZnQuCitUaGUgbnVtYmVyIDxjb2RlPmRpc3A8L2NvZGU+IG1heSBiZSBhbnkgcmVwcmVzZW50YWJsZSBpbnRlZ2VyLgorCisKKzxwPgorRm9yIGFueSB2YWxpZCBkaXNwbGFjZW1lbnQsCit0aGUgZm9sbG93aW5nIGlkZW50aXR5IGhvbGRzOgorCis8cHJlPgorICAgICBhc3NlcnQoYml0MzIubHJvdGF0ZSh4LCBkaXNwKSA9PSBiaXQzMi5scm90YXRlKHgsIGRpc3AgJSAzMikpCis8L3ByZT48cD4KK0luIHBhcnRpY3VsYXIsCituZWdhdGl2ZSBkaXNwbGFjZW1lbnRzIHJvdGF0ZSB0byB0aGUgcmlnaHQuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtYml0MzIubHNoaWZ0Ij48Y29kZT5iaXQzMi5sc2hpZnQgKHgsIGRpc3ApPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgbnVtYmVyIDxjb2RlPng8L2NvZGU+IHNoaWZ0ZWQgPGNvZGU+ZGlzcDwvY29kZT4gYml0cyB0byB0aGUgbGVmdC4KK1RoZSBudW1iZXIgPGNvZGU+ZGlzcDwvY29kZT4gbWF5IGJlIGFueSByZXByZXNlbnRhYmxlIGludGVnZXIuCitOZWdhdGl2ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0IHRvIHRoZSByaWdodC4KK0luIGFueSBkaXJlY3Rpb24sIHZhY2FudCBiaXRzIGFyZSBmaWxsZWQgd2l0aCB6ZXJvcy4KK0luIHBhcnRpY3VsYXIsCitkaXNwbGFjZW1lbnRzIHdpdGggYWJzb2x1dGUgdmFsdWVzIGhpZ2hlciB0aGFuIDMxCityZXN1bHQgaW4gemVybyAoYWxsIGJpdHMgYXJlIHNoaWZ0ZWQgb3V0KS4KKworCis8cD4KK0ZvciBwb3NpdGl2ZSBkaXNwbGFjZW1lbnRzLAordGhlIGZvbGxvd2luZyBlcXVhbGl0eSBob2xkczoKKworPHByZT4KKyAgICAgYXNzZXJ0KGJpdDMyLmxzaGlmdChiLCBkaXNwKSA9PSAoYiAqIDJeZGlzcCkgJSAyXjMyKQorPC9wcmU+CisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWJpdDMyLnJyb3RhdGUiPjxjb2RlPmJpdDMyLnJyb3RhdGUgKHgsIGRpc3ApPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgbnVtYmVyIDxjb2RlPng8L2NvZGU+IHJvdGF0ZWQgPGNvZGU+ZGlzcDwvY29kZT4gYml0cyB0byB0aGUgcmlnaHQuCitUaGUgbnVtYmVyIDxjb2RlPmRpc3A8L2NvZGU+IG1heSBiZSBhbnkgcmVwcmVzZW50YWJsZSBpbnRlZ2VyLgorCisKKzxwPgorRm9yIGFueSB2YWxpZCBkaXNwbGFjZW1lbnQsCit0aGUgZm9sbG93aW5nIGlkZW50aXR5IGhvbGRzOgorCis8cHJlPgorICAgICBhc3NlcnQoYml0MzIucnJvdGF0ZSh4LCBkaXNwKSA9PSBiaXQzMi5ycm90YXRlKHgsIGRpc3AgJSAzMikpCis8L3ByZT48cD4KK0luIHBhcnRpY3VsYXIsCituZWdhdGl2ZSBkaXNwbGFjZW1lbnRzIHJvdGF0ZSB0byB0aGUgbGVmdC4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1iaXQzMi5yc2hpZnQiPjxjb2RlPmJpdDMyLnJzaGlmdCAoeCwgZGlzcCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBudW1iZXIgPGNvZGU+eDwvY29kZT4gc2hpZnRlZCA8Y29kZT5kaXNwPC9jb2RlPiBiaXRzIHRvIHRoZSByaWdodC4KK1RoZSBudW1iZXIgPGNvZGU+ZGlzcDwvY29kZT4gbWF5IGJlIGFueSByZXByZXNlbnRhYmxlIGludGVnZXIuCitOZWdhdGl2ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0IHRvIHRoZSBsZWZ0LgorSW4gYW55IGRpcmVjdGlvbiwgdmFjYW50IGJpdHMgYXJlIGZpbGxlZCB3aXRoIHplcm9zLgorSW4gcGFydGljdWxhciwKK2Rpc3BsYWNlbWVudHMgd2l0aCBhYnNvbHV0ZSB2YWx1ZXMgaGlnaGVyIHRoYW4gMzEKK3Jlc3VsdCBpbiB6ZXJvIChhbGwgYml0cyBhcmUgc2hpZnRlZCBvdXQpLgorCisKKzxwPgorRm9yIHBvc2l0aXZlIGRpc3BsYWNlbWVudHMsCit0aGUgZm9sbG93aW5nIGVxdWFsaXR5IGhvbGRzOgorCis8cHJlPgorICAgICBhc3NlcnQoYml0MzIucnNoaWZ0KGIsIGRpc3ApID09IG1hdGguZmxvb3IoYiAlIDJeMzIgLyAyXmRpc3ApKQorPC9wcmU+CisKKzxwPgorVGhpcyBzaGlmdCBvcGVyYXRpb24gaXMgd2hhdCBpcyBjYWxsZWQgbG9naWNhbCBzaGlmdC4KKworCisKKworCisKKworPGgyPjYuOCAmbmRhc2g7IDxhIG5hbWU9IjYuOCI+SW5wdXQgYW5kIE91dHB1dCBGYWNpbGl0aWVzPC9hPjwvaDI+CisKKzxwPgorVGhlIEkvTyBsaWJyYXJ5IHByb3ZpZGVzIHR3byBkaWZmZXJlbnQgc3R5bGVzIGZvciBmaWxlIG1hbmlwdWxhdGlvbi4KK1RoZSBmaXJzdCBvbmUgdXNlcyBpbXBsaWNpdCBmaWxlIGRlc2NyaXB0b3JzOwordGhhdCBpcywgdGhlcmUgYXJlIG9wZXJhdGlvbnMgdG8gc2V0IGEgZGVmYXVsdCBpbnB1dCBmaWxlIGFuZCBhCitkZWZhdWx0IG91dHB1dCBmaWxlLAorYW5kIGFsbCBpbnB1dC9vdXRwdXQgb3BlcmF0aW9ucyBhcmUgb3ZlciB0aGVzZSBkZWZhdWx0IGZpbGVzLgorVGhlIHNlY29uZCBzdHlsZSB1c2VzIGV4cGxpY2l0IGZpbGUgZGVzY3JpcHRvcnMuCisKKworPHA+CitXaGVuIHVzaW5nIGltcGxpY2l0IGZpbGUgZGVzY3JpcHRvcnMsCithbGwgb3BlcmF0aW9ucyBhcmUgc3VwcGxpZWQgYnkgdGFibGUgPGEgbmFtZT0icGRmLWlvIj48Y29kZT5pbzwvY29kZT48L2E+LgorV2hlbiB1c2luZyBleHBsaWNpdCBmaWxlIGRlc2NyaXB0b3JzLAordGhlIG9wZXJhdGlvbiA8YSBocmVmPSIjcGRmLWlvLm9wZW4iPjxjb2RlPmlvLm9wZW48L2NvZGU+PC9hPiByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yCithbmQgdGhlbiBhbGwgb3BlcmF0aW9ucyBhcmUgc3VwcGxpZWQgYXMgbWV0aG9kcyBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yLgorCisKKzxwPgorVGhlIHRhYmxlIDxjb2RlPmlvPC9jb2RlPiBhbHNvIHByb3ZpZGVzCit0aHJlZSBwcmVkZWZpbmVkIGZpbGUgZGVzY3JpcHRvcnMgd2l0aCB0aGVpciB1c3VhbCBtZWFuaW5ncyBmcm9tIEM6Cis8YSBuYW1lPSJwZGYtaW8uc3RkaW4iPjxjb2RlPmlvLnN0ZGluPC9jb2RlPjwvYT4sIDxhIG5hbWU9InBkZi1pby5zdGRvdXQiPjxjb2RlPmlvLnN0ZG91dDwvY29kZT48L2E+LCBhbmQgPGEgbmFtZT0icGRmLWlvLnN0ZGVyciI+PGNvZGU+aW8uc3RkZXJyPC9jb2RlPjwvYT4uCitUaGUgSS9PIGxpYnJhcnkgbmV2ZXIgY2xvc2VzIHRoZXNlIGZpbGVzLgorCisKKzxwPgorVW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsCithbGwgSS9PIGZ1bmN0aW9ucyByZXR1cm4gPGI+bmlsPC9iPiBvbiBmYWlsdXJlCisocGx1cyBhbiBlcnJvciBtZXNzYWdlIGFzIGEgc2Vjb25kIHJlc3VsdCBhbmQKK2Egc3lzdGVtLWRlcGVuZGVudCBlcnJvciBjb2RlIGFzIGEgdGhpcmQgcmVzdWx0KQorYW5kIHNvbWUgdmFsdWUgZGlmZmVyZW50IGZyb20gPGI+bmlsPC9iPiBvbiBzdWNjZXNzLgorT24gbm9uLVBvc2l4IHN5c3RlbXMsCit0aGUgY29tcHV0YXRpb24gb2YgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGVycm9yIGNvZGUKK2luIGNhc2Ugb2YgZXJyb3JzCittYXkgYmUgbm90IHRocmVhZCBzYWZlLAorYmVjYXVzZSB0aGV5IHJlbHkgb24gdGhlIGdsb2JhbCBDIHZhcmlhYmxlIDxjb2RlPmVycm5vPC9jb2RlPi4KKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWlvLmNsb3NlIj48Y29kZT5pby5jbG9zZSAoW2ZpbGVdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0VxdWl2YWxlbnQgdG8gPGNvZGU+ZmlsZTpjbG9zZSgpPC9jb2RlPi4KK1dpdGhvdXQgYSA8Y29kZT5maWxlPC9jb2RlPiwgY2xvc2VzIHRoZSBkZWZhdWx0IG91dHB1dCBmaWxlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWlvLmZsdXNoIj48Y29kZT5pby5mbHVzaCAoKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0VxdWl2YWxlbnQgdG8gPGNvZGU+aW8ub3V0cHV0KCk6Zmx1c2goKTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8uaW5wdXQiPjxjb2RlPmlvLmlucHV0IChbZmlsZV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorV2hlbiBjYWxsZWQgd2l0aCBhIGZpbGUgbmFtZSwgaXQgb3BlbnMgdGhlIG5hbWVkIGZpbGUgKGluIHRleHQgbW9kZSksCithbmQgc2V0cyBpdHMgaGFuZGxlIGFzIHRoZSBkZWZhdWx0IGlucHV0IGZpbGUuCitXaGVuIGNhbGxlZCB3aXRoIGEgZmlsZSBoYW5kbGUsCitpdCBzaW1wbHkgc2V0cyB0aGlzIGZpbGUgaGFuZGxlIGFzIHRoZSBkZWZhdWx0IGlucHV0IGZpbGUuCitXaGVuIGNhbGxlZCB3aXRob3V0IHBhcmFtZXRlcnMsCitpdCByZXR1cm5zIHRoZSBjdXJyZW50IGRlZmF1bHQgaW5wdXQgZmlsZS4KKworCis8cD4KK0luIGNhc2Ugb2YgZXJyb3JzIHRoaXMgZnVuY3Rpb24gcmFpc2VzIHRoZSBlcnJvciwKK2luc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yIGNvZGUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8ubGluZXMiPjxjb2RlPmlvLmxpbmVzIChbZmlsZW5hbWUgJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7XSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitPcGVucyB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGluIHJlYWQgbW9kZQorYW5kIHJldHVybnMgYW4gaXRlcmF0b3IgZnVuY3Rpb24gdGhhdAord29ya3MgbGlrZSA8Y29kZT5maWxlOmxpbmVzKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+IG92ZXIgdGhlIG9wZW5lZCBmaWxlLgorV2hlbiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gZGV0ZWN0cyB0aGUgZW5kIG9mIGZpbGUsCitpdCByZXR1cm5zIDxiPm5pbDwvYj4gKHRvIGZpbmlzaCB0aGUgbG9vcCkgYW5kIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBmaWxlLgorCisKKzxwPgorVGhlIGNhbGwgPGNvZGU+aW8ubGluZXMoKTwvY29kZT4gKHdpdGggbm8gZmlsZSBuYW1lKSBpcyBlcXVpdmFsZW50Cit0byA8Y29kZT5pby5pbnB1dCgpOmxpbmVzKCk8L2NvZGU+OwordGhhdCBpcywgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbGluZXMgb2YgdGhlIGRlZmF1bHQgaW5wdXQgZmlsZS4KK0luIHRoaXMgY2FzZSBpdCBkb2VzIG5vdCBjbG9zZSB0aGUgZmlsZSB3aGVuIHRoZSBsb29wIGVuZHMuCisKKworPHA+CitJbiBjYXNlIG9mIGVycm9ycyB0aGlzIGZ1bmN0aW9uIHJhaXNlcyB0aGUgZXJyb3IsCitpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvciBjb2RlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWlvLm9wZW4iPjxjb2RlPmlvLm9wZW4gKGZpbGVuYW1lIFssIG1vZGVdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gb3BlbnMgYSBmaWxlLAoraW4gdGhlIG1vZGUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgPGNvZGU+bW9kZTwvY29kZT4uCitJdCByZXR1cm5zIGEgbmV3IGZpbGUgaGFuZGxlLAorb3IsIGluIGNhc2Ugb2YgZXJyb3JzLCA8Yj5uaWw8L2I+IHBsdXMgYW4gZXJyb3IgbWVzc2FnZS4KKworCis8cD4KK1RoZSA8Y29kZT5tb2RlPC9jb2RlPiBzdHJpbmcgY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorCis8dWw+Cis8bGk+PGI+Ijxjb2RlPnI8L2NvZGU+IjogPC9iPiByZWFkIG1vZGUgKHRoZSBkZWZhdWx0KTs8L2xpPgorPGxpPjxiPiI8Y29kZT53PC9jb2RlPiI6IDwvYj4gd3JpdGUgbW9kZTs8L2xpPgorPGxpPjxiPiI8Y29kZT5hPC9jb2RlPiI6IDwvYj4gYXBwZW5kIG1vZGU7PC9saT4KKzxsaT48Yj4iPGNvZGU+cis8L2NvZGU+IjogPC9iPiB1cGRhdGUgbW9kZSwgYWxsIHByZXZpb3VzIGRhdGEgaXMgcHJlc2VydmVkOzwvbGk+Cis8bGk+PGI+Ijxjb2RlPncrPC9jb2RlPiI6IDwvYj4gdXBkYXRlIG1vZGUsIGFsbCBwcmV2aW91cyBkYXRhIGlzIGVyYXNlZDs8L2xpPgorPGxpPjxiPiI8Y29kZT5hKzwvY29kZT4iOiA8L2I+IGFwcGVuZCB1cGRhdGUgbW9kZSwgcHJldmlvdXMgZGF0YSBpcyBwcmVzZXJ2ZWQsCisgIHdyaXRpbmcgaXMgb25seSBhbGxvd2VkIGF0IHRoZSBlbmQgb2YgZmlsZS48L2xpPgorPC91bD48cD4KK1RoZSA8Y29kZT5tb2RlPC9jb2RlPiBzdHJpbmcgY2FuIGFsc28gaGF2ZSBhICc8Y29kZT5iPC9jb2RlPicgYXQgdGhlIGVuZCwKK3doaWNoIGlzIG5lZWRlZCBpbiBzb21lIHN5c3RlbXMgdG8gb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1pby5vdXRwdXQiPjxjb2RlPmlvLm91dHB1dCAoW2ZpbGVdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1NpbWlsYXIgdG8gPGEgaHJlZj0iI3BkZi1pby5pbnB1dCI+PGNvZGU+aW8uaW5wdXQ8L2NvZGU+PC9hPiwgYnV0IG9wZXJhdGVzIG92ZXIgdGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8ucG9wZW4iPjxjb2RlPmlvLnBvcGVuIChwcm9nIFssIG1vZGVdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gaXMgc3lzdGVtIGRlcGVuZGVudCBhbmQgaXMgbm90IGF2YWlsYWJsZQorb24gYWxsIHBsYXRmb3Jtcy4KKworCis8cD4KK1N0YXJ0cyBwcm9ncmFtIDxjb2RlPnByb2c8L2NvZGU+IGluIGEgc2VwYXJhdGVkIHByb2Nlc3MgYW5kIHJldHVybnMKK2EgZmlsZSBoYW5kbGUgdGhhdCB5b3UgY2FuIHVzZSB0byByZWFkIGRhdGEgZnJvbSB0aGlzIHByb2dyYW0KKyhpZiA8Y29kZT5tb2RlPC9jb2RlPiBpcyA8Y29kZT4iciI8L2NvZGU+LCB0aGUgZGVmYXVsdCkKK29yIHRvIHdyaXRlIGRhdGEgdG8gdGhpcyBwcm9ncmFtCisoaWYgPGNvZGU+bW9kZTwvY29kZT4gaXMgPGNvZGU+InciPC9jb2RlPikuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8ucmVhZCI+PGNvZGU+aW8ucmVhZCAoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0VxdWl2YWxlbnQgdG8gPGNvZGU+aW8uaW5wdXQoKTpyZWFkKCZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90Oyk8L2NvZGU+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWlvLnRtcGZpbGUiPjxjb2RlPmlvLnRtcGZpbGUgKCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIGEgaGFuZGxlIGZvciBhIHRlbXBvcmFyeSBmaWxlLgorVGhpcyBmaWxlIGlzIG9wZW5lZCBpbiB1cGRhdGUgbW9kZQorYW5kIGl0IGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ncmFtIGVuZHMuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8udHlwZSI+PGNvZGU+aW8udHlwZSAob2JqKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0NoZWNrcyB3aGV0aGVyIDxjb2RlPm9iajwvY29kZT4gaXMgYSB2YWxpZCBmaWxlIGhhbmRsZS4KK1JldHVybnMgdGhlIHN0cmluZyA8Y29kZT4iZmlsZSI8L2NvZGU+IGlmIDxjb2RlPm9iajwvY29kZT4gaXMgYW4gb3BlbiBmaWxlIGhhbmRsZSwKKzxjb2RlPiJjbG9zZWQgZmlsZSI8L2NvZGU+IGlmIDxjb2RlPm9iajwvY29kZT4gaXMgYSBjbG9zZWQgZmlsZSBoYW5kbGUsCitvciA8Yj5uaWw8L2I+IGlmIDxjb2RlPm9iajwvY29kZT4gaXMgbm90IGEgZmlsZSBoYW5kbGUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtaW8ud3JpdGUiPjxjb2RlPmlvLndyaXRlICgmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorRXF1aXZhbGVudCB0byA8Y29kZT5pby5vdXRwdXQoKTp3cml0ZSgmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1maWxlOmNsb3NlIj48Y29kZT5maWxlOmNsb3NlICgpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorQ2xvc2VzIDxjb2RlPmZpbGU8L2NvZGU+LgorTm90ZSB0aGF0IGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5IGNsb3NlZCB3aGVuCit0aGVpciBoYW5kbGVzIGFyZSBnYXJiYWdlIGNvbGxlY3RlZCwKK2J1dCB0aGF0IHRha2VzIGFuIHVucHJlZGljdGFibGUgYW1vdW50IG9mIHRpbWUgdG8gaGFwcGVuLgorCisKKzxwPgorV2hlbiBjbG9zaW5nIGEgZmlsZSBoYW5kbGUgY3JlYXRlZCB3aXRoIDxhIGhyZWY9IiNwZGYtaW8ucG9wZW4iPjxjb2RlPmlvLnBvcGVuPC9jb2RlPjwvYT4sCis8YSBocmVmPSIjcGRmLWZpbGU6Y2xvc2UiPjxjb2RlPmZpbGU6Y2xvc2U8L2NvZGU+PC9hPiByZXR1cm5zIHRoZSBzYW1lIHZhbHVlcworcmV0dXJuZWQgYnkgPGEgaHJlZj0iI3BkZi1vcy5leGVjdXRlIj48Y29kZT5vcy5leGVjdXRlPC9jb2RlPjwvYT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZmlsZTpmbHVzaCI+PGNvZGU+ZmlsZTpmbHVzaCAoKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1NhdmVzIGFueSB3cml0dGVuIGRhdGEgdG8gPGNvZGU+ZmlsZTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZmlsZTpsaW5lcyI+PGNvZGU+ZmlsZTpsaW5lcyAoJm1pZGRvdDsmbWlkZG90OyZtaWRkb3Q7KTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgYW4gaXRlcmF0b3IgZnVuY3Rpb24gdGhhdCwKK2VhY2ggdGltZSBpdCBpcyBjYWxsZWQsCityZWFkcyB0aGUgZmlsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGZvcm1hdHMuCitXaGVuIG5vIGZvcm1hdCBpcyBnaXZlbiwKK3VzZXMgIipsIiBhcyBhIGRlZmF1bHQuCitBcyBhbiBleGFtcGxlLCB0aGUgY29uc3RydWN0aW9uCisKKzxwcmU+CisgICAgIGZvciBjIGluIGZpbGU6bGluZXMoMSkgZG8gPGVtPmJvZHk8L2VtPiBlbmQKKzwvcHJlPjxwPgord2lsbCBpdGVyYXRlIG92ZXIgYWxsIGNoYXJhY3RlcnMgb2YgdGhlIGZpbGUsCitzdGFydGluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KK1VubGlrZSA8YSBocmVmPSIjcGRmLWlvLmxpbmVzIj48Y29kZT5pby5saW5lczwvY29kZT48L2E+LCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNsb3NlIHRoZSBmaWxlCit3aGVuIHRoZSBsb29wIGVuZHMuCisKKworPHA+CitJbiBjYXNlIG9mIGVycm9ycyB0aGlzIGZ1bmN0aW9uIHJhaXNlcyB0aGUgZXJyb3IsCitpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvciBjb2RlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWZpbGU6cmVhZCI+PGNvZGU+ZmlsZTpyZWFkICgmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmVhZHMgdGhlIGZpbGUgPGNvZGU+ZmlsZTwvY29kZT4sCithY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGZvcm1hdHMsIHdoaWNoIHNwZWNpZnkgd2hhdCB0byByZWFkLgorRm9yIGVhY2ggZm9ybWF0LAordGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgKG9yIGEgbnVtYmVyKSB3aXRoIHRoZSBjaGFyYWN0ZXJzIHJlYWQsCitvciA8Yj5uaWw8L2I+IGlmIGl0IGNhbm5vdCByZWFkIGRhdGEgd2l0aCB0aGUgc3BlY2lmaWVkIGZvcm1hdC4KK1doZW4gY2FsbGVkIHdpdGhvdXQgZm9ybWF0cywKK2l0IHVzZXMgYSBkZWZhdWx0IGZvcm1hdCB0aGF0IHJlYWRzIHRoZSBuZXh0IGxpbmUKKyhzZWUgYmVsb3cpLgorCisKKzxwPgorVGhlIGF2YWlsYWJsZSBmb3JtYXRzIGFyZQorCis8dWw+CisKKzxsaT48Yj4iPGNvZGU+Km48L2NvZGU+IjogPC9iPgorcmVhZHMgYSBudW1iZXI7Cit0aGlzIGlzIHRoZSBvbmx5IGZvcm1hdCB0aGF0IHJldHVybnMgYSBudW1iZXIgaW5zdGVhZCBvZiBhIHN0cmluZy4KKzwvbGk+CisKKzxsaT48Yj4iPGNvZGU+KmE8L2NvZGU+IjogPC9iPgorcmVhZHMgdGhlIHdob2xlIGZpbGUsIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorT24gZW5kIG9mIGZpbGUsIGl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KKzwvbGk+CisKKzxsaT48Yj4iPGNvZGU+Kmw8L2NvZGU+IjogPC9iPgorcmVhZHMgdGhlIG5leHQgbGluZSBza2lwcGluZyB0aGUgZW5kIG9mIGxpbmUsCityZXR1cm5pbmcgPGI+bmlsPC9iPiBvbiBlbmQgb2YgZmlsZS4KK1RoaXMgaXMgdGhlIGRlZmF1bHQgZm9ybWF0LgorPC9saT4KKworPGxpPjxiPiI8Y29kZT4qTDwvY29kZT4iOiA8L2I+CityZWFkcyB0aGUgbmV4dCBsaW5lIGtlZXBpbmcgdGhlIGVuZCBvZiBsaW5lIChpZiBwcmVzZW50KSwKK3JldHVybmluZyA8Yj5uaWw8L2I+IG9uIGVuZCBvZiBmaWxlLgorPC9saT4KKworPGxpPjxiPjxlbT5udW1iZXI8L2VtPjogPC9iPgorcmVhZHMgYSBzdHJpbmcgd2l0aCB1cCB0byB0aGlzIG51bWJlciBvZiBieXRlcywKK3JldHVybmluZyA8Yj5uaWw8L2I+IG9uIGVuZCBvZiBmaWxlLgorSWYgbnVtYmVyIGlzIHplcm8sCitpdCByZWFkcyBub3RoaW5nIGFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywKK29yIDxiPm5pbDwvYj4gb24gZW5kIG9mIGZpbGUuCis8L2xpPgorCis8L3VsPgorCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1maWxlOnNlZWsiPjxjb2RlPmZpbGU6c2VlayAoW3doZW5jZSBbLCBvZmZzZXRdXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIGFuZCBnZXRzIHRoZSBmaWxlIHBvc2l0aW9uLAorbWVhc3VyZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLAordG8gdGhlIHBvc2l0aW9uIGdpdmVuIGJ5IDxjb2RlPm9mZnNldDwvY29kZT4gcGx1cyBhIGJhc2UKK3NwZWNpZmllZCBieSB0aGUgc3RyaW5nIDxjb2RlPndoZW5jZTwvY29kZT4sIGFzIGZvbGxvd3M6CisKKzx1bD4KKzxsaT48Yj4iPGNvZGU+c2V0PC9jb2RlPiI6IDwvYj4gYmFzZSBpcyBwb3NpdGlvbiAwIChiZWdpbm5pbmcgb2YgdGhlIGZpbGUpOzwvbGk+Cis8bGk+PGI+Ijxjb2RlPmN1cjwvY29kZT4iOiA8L2I+IGJhc2UgaXMgY3VycmVudCBwb3NpdGlvbjs8L2xpPgorPGxpPjxiPiI8Y29kZT5lbmQ8L2NvZGU+IjogPC9iPiBiYXNlIGlzIGVuZCBvZiBmaWxlOzwvbGk+Cis8L3VsPjxwPgorSW4gY2FzZSBvZiBzdWNjZXNzLCA8Y29kZT5zZWVrPC9jb2RlPiByZXR1cm5zIHRoZSBmaW5hbCBmaWxlIHBvc2l0aW9uLAorbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorSWYgPGNvZGU+c2VlazwvY29kZT4gZmFpbHMsIGl0IHJldHVybnMgPGI+bmlsPC9iPiwKK3BsdXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisKKworPHA+CitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+d2hlbmNlPC9jb2RlPiBpcyA8Y29kZT4iY3VyIjwvY29kZT4sCithbmQgZm9yIDxjb2RlPm9mZnNldDwvY29kZT4gaXMgMC4KK1RoZXJlZm9yZSwgdGhlIGNhbGwgPGNvZGU+ZmlsZTpzZWVrKCk8L2NvZGU+IHJldHVybnMgdGhlIGN1cnJlbnQKK2ZpbGUgcG9zaXRpb24sIHdpdGhvdXQgY2hhbmdpbmcgaXQ7Cit0aGUgY2FsbCA8Y29kZT5maWxlOnNlZWsoInNldCIpPC9jb2RlPiBzZXRzIHRoZSBwb3NpdGlvbiB0byB0aGUKK2JlZ2lubmluZyBvZiB0aGUgZmlsZSAoYW5kIHJldHVybnMgMCk7CithbmQgdGhlIGNhbGwgPGNvZGU+ZmlsZTpzZWVrKCJlbmQiKTwvY29kZT4gc2V0cyB0aGUgcG9zaXRpb24gdG8gdGhlCitlbmQgb2YgdGhlIGZpbGUsIGFuZCByZXR1cm5zIGl0cyBzaXplLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWZpbGU6c2V0dmJ1ZiI+PGNvZGU+ZmlsZTpzZXR2YnVmIChtb2RlIFssIHNpemVdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1NldHMgdGhlIGJ1ZmZlcmluZyBtb2RlIGZvciBhbiBvdXRwdXQgZmlsZS4KK1RoZXJlIGFyZSB0aHJlZSBhdmFpbGFibGUgbW9kZXM6CisKKzx1bD4KKworPGxpPjxiPiI8Y29kZT5ubzwvY29kZT4iOiA8L2I+CitubyBidWZmZXJpbmc7IHRoZSByZXN1bHQgb2YgYW55IG91dHB1dCBvcGVyYXRpb24gYXBwZWFycyBpbW1lZGlhdGVseS4KKzwvbGk+CisKKzxsaT48Yj4iPGNvZGU+ZnVsbDwvY29kZT4iOiA8L2I+CitmdWxsIGJ1ZmZlcmluZzsgb3V0cHV0IG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb25seQord2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb3Igd2hlbgoreW91IGV4cGxpY2l0bHkgPGNvZGU+Zmx1c2g8L2NvZGU+IHRoZSBmaWxlIChzZWUgPGEgaHJlZj0iI3BkZi1pby5mbHVzaCI+PGNvZGU+aW8uZmx1c2g8L2NvZGU+PC9hPikuCis8L2xpPgorCis8bGk+PGI+Ijxjb2RlPmxpbmU8L2NvZGU+IjogPC9iPgorbGluZSBidWZmZXJpbmc7IG91dHB1dCBpcyBidWZmZXJlZCB1bnRpbCBhIG5ld2xpbmUgaXMgb3V0cHV0CitvciB0aGVyZSBpcyBhbnkgaW5wdXQgZnJvbSBzb21lIHNwZWNpYWwgZmlsZXMKKyhzdWNoIGFzIGEgdGVybWluYWwgZGV2aWNlKS4KKzwvbGk+CisKKzwvdWw+PHA+CitGb3IgdGhlIGxhc3QgdHdvIGNhc2VzLCA8Y29kZT5zaXplPC9jb2RlPgorc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGluIGJ5dGVzLgorVGhlIGRlZmF1bHQgaXMgYW4gYXBwcm9wcmlhdGUgc2l6ZS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1maWxlOndyaXRlIj48Y29kZT5maWxlOndyaXRlICgmbWlkZG90OyZtaWRkb3Q7Jm1pZGRvdDspPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorV3JpdGVzIHRoZSB2YWx1ZSBvZiBlYWNoIG9mIGl0cyBhcmd1bWVudHMgdG8gPGNvZGU+ZmlsZTwvY29kZT4uCitUaGUgYXJndW1lbnRzIG11c3QgYmUgc3RyaW5ncyBvciBudW1iZXJzLgorCisKKzxwPgorSW4gY2FzZSBvZiBzdWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgPGNvZGU+ZmlsZTwvY29kZT4uCitPdGhlcndpc2UgaXQgcmV0dXJucyA8Yj5uaWw8L2I+IHBsdXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisKKworCisKKworCisKKzxoMj42LjkgJm5kYXNoOyA8YSBuYW1lPSI2LjkiPk9wZXJhdGluZyBTeXN0ZW0gRmFjaWxpdGllczwvYT48L2gyPgorCis8cD4KK1RoaXMgbGlicmFyeSBpcyBpbXBsZW1lbnRlZCB0aHJvdWdoIHRhYmxlIDxhIG5hbWU9InBkZi1vcyI+PGNvZGU+b3M8L2NvZGU+PC9hPi4KKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW9zLmNsb2NrIj48Y29kZT5vcy5jbG9jayAoKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgYW1vdW50IGluIHNlY29uZHMgb2YgQ1BVIHRpbWUKK3VzZWQgYnkgdGhlIHByb2dyYW0uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MuZGF0ZSI+PGNvZGU+b3MuZGF0ZSAoW2Zvcm1hdCBbLCB0aW1lXV0pPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyBhIHN0cmluZyBvciBhIHRhYmxlIGNvbnRhaW5pbmcgZGF0ZSBhbmQgdGltZSwKK2Zvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHN0cmluZyA8Y29kZT5mb3JtYXQ8L2NvZGU+LgorCisKKzxwPgorSWYgdGhlIDxjb2RlPnRpbWU8L2NvZGU+IGFyZ3VtZW50IGlzIHByZXNlbnQsCit0aGlzIGlzIHRoZSB0aW1lIHRvIGJlIGZvcm1hdHRlZAorKHNlZSB0aGUgPGEgaHJlZj0iI3BkZi1vcy50aW1lIj48Y29kZT5vcy50aW1lPC9jb2RlPjwvYT4gZnVuY3Rpb24gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZSkuCitPdGhlcndpc2UsIDxjb2RlPmRhdGU8L2NvZGU+IGZvcm1hdHMgdGhlIGN1cnJlbnQgdGltZS4KKworCis8cD4KK0lmIDxjb2RlPmZvcm1hdDwvY29kZT4gc3RhcnRzIHdpdGggJzxjb2RlPiE8L2NvZGU+JywKK3RoZW4gdGhlIGRhdGUgaXMgZm9ybWF0dGVkIGluIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lLgorQWZ0ZXIgdGhpcyBvcHRpb25hbCBjaGFyYWN0ZXIsCitpZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIHRoZSBzdHJpbmcgIjxjb2RlPip0PC9jb2RlPiIsCit0aGVuIDxjb2RlPmRhdGU8L2NvZGU+IHJldHVybnMgYSB0YWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorPGNvZGU+eWVhcjwvY29kZT4gKGZvdXIgZGlnaXRzKSwgPGNvZGU+bW9udGg8L2NvZGU+ICgxJm5kYXNoOzEyKSwgPGNvZGU+ZGF5PC9jb2RlPiAoMSZuZGFzaDszMSksCis8Y29kZT5ob3VyPC9jb2RlPiAoMCZuZGFzaDsyMyksIDxjb2RlPm1pbjwvY29kZT4gKDAmbmRhc2g7NTkpLCA8Y29kZT5zZWM8L2NvZGU+ICgwJm5kYXNoOzYxKSwKKzxjb2RlPndkYXk8L2NvZGU+ICh3ZWVrZGF5LCBTdW5kYXkgaXMmbmJzcDsxKSwKKzxjb2RlPnlkYXk8L2NvZGU+IChkYXkgb2YgdGhlIHllYXIpLAorYW5kIDxjb2RlPmlzZHN0PC9jb2RlPiAoZGF5bGlnaHQgc2F2aW5nIGZsYWcsIGEgYm9vbGVhbikuCitUaGlzIGxhc3QgZmllbGQgbWF5IGJlIGFic2VudAoraWYgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuCisKKworPHA+CitJZiA8Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIG5vdCAiPGNvZGU+KnQ8L2NvZGU+IiwKK3RoZW4gPGNvZGU+ZGF0ZTwvY29kZT4gcmV0dXJucyB0aGUgZGF0ZSBhcyBhIHN0cmluZywKK2Zvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgcnVsZXMgYXMgdGhlIEFOU0kmbmJzcDtDIGZ1bmN0aW9uIDxjb2RlPnN0cmZ0aW1lPC9jb2RlPi4KKworCis8cD4KK1doZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLAorPGNvZGU+ZGF0ZTwvY29kZT4gcmV0dXJucyBhIHJlYXNvbmFibGUgZGF0ZSBhbmQgdGltZSByZXByZXNlbnRhdGlvbiB0aGF0IGRlcGVuZHMgb24KK3RoZSBob3N0IHN5c3RlbSBhbmQgb24gdGhlIGN1cnJlbnQgbG9jYWxlCisodGhhdCBpcywgPGNvZGU+b3MuZGF0ZSgpPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPm9zLmRhdGUoIiVjIik8L2NvZGU+KS4KKworCis8cD4KK09uIG5vbi1Qb3NpeCBzeXN0ZW1zLAordGhpcyBmdW5jdGlvbiBtYXkgYmUgbm90IHRocmVhZCBzYWZlCitiZWNhdXNlIG9mIGl0cyByZWxpYW5jZSBvbiBDJm5ic3A7ZnVuY3Rpb24gPGNvZGU+Z210aW1lPC9jb2RlPiBhbmQgQyZuYnNwO2Z1bmN0aW9uIDxjb2RlPmxvY2FsdGltZTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MuZGlmZnRpbWUiPjxjb2RlPm9zLmRpZmZ0aW1lICh0MiwgdDEpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSB0aW1lIDxjb2RlPnQxPC9jb2RlPiB0byB0aW1lIDxjb2RlPnQyPC9jb2RlPi4KK0luIFBPU0lYLCBXaW5kb3dzLCBhbmQgc29tZSBvdGhlciBzeXN0ZW1zLAordGhpcyB2YWx1ZSBpcyBleGFjdGx5IDxjb2RlPnQyPC9jb2RlPjxlbT4tPC9lbT48Y29kZT50MTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MuZXhlY3V0ZSI+PGNvZGU+b3MuZXhlY3V0ZSAoW2NvbW1hbmRdKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgQU5TSSZuYnNwO0MgZnVuY3Rpb24gPGNvZGU+c3lzdGVtPC9jb2RlPi4KK0l0IHBhc3NlcyA8Y29kZT5jb21tYW5kPC9jb2RlPiB0byBiZSBleGVjdXRlZCBieSBhbiBvcGVyYXRpbmcgc3lzdGVtIHNoZWxsLgorSXRzIGZpcnN0IHJlc3VsdCBpcyA8Yj50cnVlPC9iPgoraWYgdGhlIGNvbW1hbmQgdGVybWluYXRlZCBzdWNjZXNzZnVsbHksCitvciA8Yj5uaWw8L2I+IG90aGVyd2lzZS4KK0FmdGVyIHRoaXMgZmlyc3QgcmVzdWx0Cit0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyBhbmQgYSBudW1iZXIsCithcyBmb2xsb3dzOgorCis8dWw+CisKKzxsaT48Yj4iPGNvZGU+ZXhpdDwvY29kZT4iOiA8L2I+Cit0aGUgY29tbWFuZCB0ZXJtaW5hdGVkIG5vcm1hbGx5OwordGhlIGZvbGxvd2luZyBudW1iZXIgaXMgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjb21tYW5kLgorPC9saT4KKworPGxpPjxiPiI8Y29kZT5zaWduYWw8L2NvZGU+IjogPC9iPgordGhlIGNvbW1hbmQgd2FzIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWw7Cit0aGUgZm9sbG93aW5nIG51bWJlciBpcyB0aGUgc2lnbmFsIHRoYXQgdGVybWluYXRlZCB0aGUgY29tbWFuZC4KKzwvbGk+CisKKzwvdWw+CisKKzxwPgorV2hlbiBjYWxsZWQgd2l0aG91dCBhIDxjb2RlPmNvbW1hbmQ8L2NvZGU+LAorPGNvZGU+b3MuZXhlY3V0ZTwvY29kZT4gcmV0dXJucyBhIGJvb2xlYW4gdGhhdCBpcyB0cnVlIGlmIGEgc2hlbGwgaXMgYXZhaWxhYmxlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW9zLmV4aXQiPjxjb2RlPm9zLmV4aXQgKFtjb2RlIFssIGNsb3NlXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitDYWxscyB0aGUgQU5TSSZuYnNwO0MgZnVuY3Rpb24gPGNvZGU+ZXhpdDwvY29kZT4gdG8gdGVybWluYXRlIHRoZSBob3N0IHByb2dyYW0uCitJZiA8Y29kZT5jb2RlPC9jb2RlPiBpcyA8Yj50cnVlPC9iPiwKK3RoZSByZXR1cm5lZCBzdGF0dXMgaXMgPGNvZGU+RVhJVF9TVUNDRVNTPC9jb2RlPjsKK2lmIDxjb2RlPmNvZGU8L2NvZGU+IGlzIDxiPmZhbHNlPC9iPiwKK3RoZSByZXR1cm5lZCBzdGF0dXMgaXMgPGNvZGU+RVhJVF9GQUlMVVJFPC9jb2RlPjsKK2lmIDxjb2RlPmNvZGU8L2NvZGU+IGlzIGEgbnVtYmVyLAordGhlIHJldHVybmVkIHN0YXR1cyBpcyB0aGlzIG51bWJlci4KK1RoZSBkZWZhdWx0IHZhbHVlIGZvciA8Y29kZT5jb2RlPC9jb2RlPiBpcyA8Yj50cnVlPC9iPi4KKworCis8cD4KK0lmIHRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgPGNvZGU+Y2xvc2U8L2NvZGU+IGlzIHRydWUsCitjbG9zZXMgdGhlIEx1YSBzdGF0ZSBiZWZvcmUgZXhpdGluZy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1vcy5nZXRlbnYiPjxjb2RlPm9zLmdldGVudiAodmFybmFtZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Y29kZT52YXJuYW1lPC9jb2RlPiwKK29yIDxiPm5pbDwvYj4gaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW9zLnJlbW92ZSI+PGNvZGU+b3MucmVtb3ZlIChmaWxlbmFtZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitEZWxldGVzIHRoZSBmaWxlIChvciBlbXB0eSBkaXJlY3RvcnksIG9uIFBPU0lYIHN5c3RlbXMpCit3aXRoIHRoZSBnaXZlbiBuYW1lLgorSWYgdGhpcyBmdW5jdGlvbiBmYWlscywgaXQgcmV0dXJucyA8Yj5uaWw8L2I+LAorcGx1cyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvciBhbmQgdGhlIGVycm9yIGNvZGUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MucmVuYW1lIj48Y29kZT5vcy5yZW5hbWUgKG9sZG5hbWUsIG5ld25hbWUpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorUmVuYW1lcyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lZCA8Y29kZT5vbGRuYW1lPC9jb2RlPiB0byA8Y29kZT5uZXduYW1lPC9jb2RlPi4KK0lmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIGl0IHJldHVybnMgPGI+bmlsPC9iPiwKK3BsdXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgYW5kIHRoZSBlcnJvciBjb2RlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLW9zLnNldGxvY2FsZSI+PGNvZGU+b3Muc2V0bG9jYWxlIChsb2NhbGUgWywgY2F0ZWdvcnldKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1NldHMgdGhlIGN1cnJlbnQgbG9jYWxlIG9mIHRoZSBwcm9ncmFtLgorPGNvZGU+bG9jYWxlPC9jb2RlPiBpcyBhIHN5c3RlbS1kZXBlbmRlbnQgc3RyaW5nIHNwZWNpZnlpbmcgYSBsb2NhbGU7Cis8Y29kZT5jYXRlZ29yeTwvY29kZT4gaXMgYW4gb3B0aW9uYWwgc3RyaW5nIGRlc2NyaWJpbmcgd2hpY2ggY2F0ZWdvcnkgdG8gY2hhbmdlOgorPGNvZGU+ImFsbCI8L2NvZGU+LCA8Y29kZT4iY29sbGF0ZSI8L2NvZGU+LCA8Y29kZT4iY3R5cGUiPC9jb2RlPiwKKzxjb2RlPiJtb25ldGFyeSI8L2NvZGU+LCA8Y29kZT4ibnVtZXJpYyI8L2NvZGU+LCBvciA8Y29kZT4idGltZSI8L2NvZGU+OwordGhlIGRlZmF1bHQgY2F0ZWdvcnkgaXMgPGNvZGU+ImFsbCI8L2NvZGU+LgorVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5ldyBsb2NhbGUsCitvciA8Yj5uaWw8L2I+IGlmIHRoZSByZXF1ZXN0IGNhbm5vdCBiZSBob25vcmVkLgorCisKKzxwPgorSWYgPGNvZGU+bG9jYWxlPC9jb2RlPiBpcyB0aGUgZW1wdHkgc3RyaW5nLAordGhlIGN1cnJlbnQgbG9jYWxlIGlzIHNldCB0byBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIG5hdGl2ZSBsb2NhbGUuCitJZiA8Y29kZT5sb2NhbGU8L2NvZGU+IGlzIHRoZSBzdHJpbmcgIjxjb2RlPkM8L2NvZGU+IiwKK3RoZSBjdXJyZW50IGxvY2FsZSBpcyBzZXQgdG8gdGhlIHN0YW5kYXJkIEMgbG9jYWxlLgorCisKKzxwPgorV2hlbiBjYWxsZWQgd2l0aCA8Yj5uaWw8L2I+IGFzIHRoZSBmaXJzdCBhcmd1bWVudCwKK3RoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGxvY2FsZQorZm9yIHRoZSBnaXZlbiBjYXRlZ29yeS4KKworCis8cD4KK1RoaXMgZnVuY3Rpb24gbWF5IGJlIG5vdCB0aHJlYWQgc2FmZQorYmVjYXVzZSBvZiBpdHMgcmVsaWFuY2Ugb24gQyZuYnNwO2Z1bmN0aW9uIDxjb2RlPnNldGxvY2FsZTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MudGltZSI+PGNvZGU+b3MudGltZSAoW3RhYmxlXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgd2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsCitvciBhIHRpbWUgcmVwcmVzZW50aW5nIHRoZSBkYXRlIGFuZCB0aW1lIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gdGFibGUuCitUaGlzIHRhYmxlIG11c3QgaGF2ZSBmaWVsZHMgPGNvZGU+eWVhcjwvY29kZT4sIDxjb2RlPm1vbnRoPC9jb2RlPiwgYW5kIDxjb2RlPmRheTwvY29kZT4sCithbmQgbWF5IGhhdmUgZmllbGRzCis8Y29kZT5ob3VyPC9jb2RlPiAoZGVmYXVsdCBpcyAxMiksCis8Y29kZT5taW48L2NvZGU+IChkZWZhdWx0IGlzIDApLAorPGNvZGU+c2VjPC9jb2RlPiAoZGVmYXVsdCBpcyAwKSwKK2FuZCA8Y29kZT5pc2RzdDwvY29kZT4gKGRlZmF1bHQgaXMgPGI+bmlsPC9iPikuCitGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBmaWVsZHMsIHNlZSB0aGUgPGEgaHJlZj0iI3BkZi1vcy5kYXRlIj48Y29kZT5vcy5kYXRlPC9jb2RlPjwvYT4gZnVuY3Rpb24uCisKKworPHA+CitUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBudW1iZXIsIHdob3NlIG1lYW5pbmcgZGVwZW5kcyBvbiB5b3VyIHN5c3RlbS4KK0luIFBPU0lYLCBXaW5kb3dzLCBhbmQgc29tZSBvdGhlciBzeXN0ZW1zLAordGhpcyBudW1iZXIgY291bnRzIHRoZSBudW1iZXIKK29mIHNlY29uZHMgc2luY2Ugc29tZSBnaXZlbiBzdGFydCB0aW1lICh0aGUgImVwb2NoIikuCitJbiBvdGhlciBzeXN0ZW1zLCB0aGUgbWVhbmluZyBpcyBub3Qgc3BlY2lmaWVkLAorYW5kIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgPGNvZGU+dGltZTwvY29kZT4gY2FuIGJlIHVzZWQgb25seSBhcyBhbiBhcmd1bWVudCB0bworPGEgaHJlZj0iI3BkZi1vcy5kYXRlIj48Y29kZT5vcy5kYXRlPC9jb2RlPjwvYT4gYW5kIDxhIGhyZWY9IiNwZGYtb3MuZGlmZnRpbWUiPjxjb2RlPm9zLmRpZmZ0aW1lPC9jb2RlPjwvYT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtb3MudG1wbmFtZSI+PGNvZGU+b3MudG1wbmFtZSAoKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgYSBzdHJpbmcgd2l0aCBhIGZpbGUgbmFtZSB0aGF0IGNhbgorYmUgdXNlZCBmb3IgYSB0ZW1wb3JhcnkgZmlsZS4KK1RoZSBmaWxlIG11c3QgYmUgZXhwbGljaXRseSBvcGVuZWQgYmVmb3JlIGl0cyB1c2UKK2FuZCBleHBsaWNpdGx5IHJlbW92ZWQgd2hlbiBubyBsb25nZXIgbmVlZGVkLgorCisKKzxwPgorT24gUE9TSVggc3lzdGVtcywKK3RoaXMgZnVuY3Rpb24gYWxzbyBjcmVhdGVzIGEgZmlsZSB3aXRoIHRoYXQgbmFtZSwKK3RvIGF2b2lkIHNlY3VyaXR5IHJpc2tzLgorKFNvbWVvbmUgZWxzZSBtaWdodCBjcmVhdGUgdGhlIGZpbGUgd2l0aCB3cm9uZyBwZXJtaXNzaW9ucworaW4gdGhlIHRpbWUgYmV0d2VlbiBnZXR0aW5nIHRoZSBuYW1lIGFuZCBjcmVhdGluZyB0aGUgZmlsZS4pCitZb3Ugc3RpbGwgaGF2ZSB0byBvcGVuIHRoZSBmaWxlIHRvIHVzZSBpdAorYW5kIHRvIHJlbW92ZSBpdCAoZXZlbiBpZiB5b3UgZG8gbm90IHVzZSBpdCkuCisKKworPHA+CitXaGVuIHBvc3NpYmxlLAoreW91IG1heSBwcmVmZXIgdG8gdXNlIDxhIGhyZWY9IiNwZGYtaW8udG1wZmlsZSI+PGNvZGU+aW8udG1wZmlsZTwvY29kZT48L2E+LAord2hpY2ggYXV0b21hdGljYWxseSByZW1vdmVzIHRoZSBmaWxlIHdoZW4gdGhlIHByb2dyYW0gZW5kcy4KKworCisKKworCisKKworPGgyPjYuMTAgJm5kYXNoOyA8YSBuYW1lPSI2LjEwIj5UaGUgRGVidWcgTGlicmFyeTwvYT48L2gyPgorCis8cD4KK1RoaXMgbGlicmFyeSBwcm92aWRlcwordGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRlYnVnIGludGVyZmFjZSAoPGEgaHJlZj0iIzQuOSI+JnNlY3Q7NC45PC9hPikgdG8gTHVhIHByb2dyYW1zLgorWW91IHNob3VsZCBleGVydCBjYXJlIHdoZW4gdXNpbmcgdGhpcyBsaWJyYXJ5LgorU2V2ZXJhbCBvZiBpdHMgZnVuY3Rpb25zCit2aW9sYXRlIGJhc2ljIGFzc3VtcHRpb25zIGFib3V0IEx1YSBjb2RlCisoZS5nLiwgdGhhdCB2YXJpYWJsZXMgbG9jYWwgdG8gYSBmdW5jdGlvbgorY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gb3V0c2lkZTsKK3RoYXQgdXNlcmRhdGEgbWV0YXRhYmxlcyBjYW5ub3QgYmUgY2hhbmdlZCBieSBMdWEgY29kZTsKK3RoYXQgTHVhIHByb2dyYW1zIGRvIG5vdCBjcmFzaCkKK2FuZCB0aGVyZWZvcmUgY2FuIGNvbXByb21pc2Ugb3RoZXJ3aXNlIHNlY3VyZSBjb2RlLgorTW9yZW92ZXIsIHNvbWUgZnVuY3Rpb25zIGluIHRoaXMgbGlicmFyeSBtYXkgYmUgc2xvdy4KKworCis8cD4KK0FsbCBmdW5jdGlvbnMgaW4gdGhpcyBsaWJyYXJ5IGFyZSBwcm92aWRlZAoraW5zaWRlIHRoZSA8YSBuYW1lPSJwZGYtZGVidWciPjxjb2RlPmRlYnVnPC9jb2RlPjwvYT4gdGFibGUuCitBbGwgZnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvdmVyIGEgdGhyZWFkCitoYXZlIGFuIG9wdGlvbmFsIGZpcnN0IGFyZ3VtZW50IHdoaWNoIGlzIHRoZQordGhyZWFkIHRvIG9wZXJhdGUgb3Zlci4KK1RoZSBkZWZhdWx0IGlzIGFsd2F5cyB0aGUgY3VycmVudCB0aHJlYWQuCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5kZWJ1ZyI+PGNvZGU+ZGVidWcuZGVidWcgKCk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitFbnRlcnMgYW4gaW50ZXJhY3RpdmUgbW9kZSB3aXRoIHRoZSB1c2VyLAorcnVubmluZyBlYWNoIHN0cmluZyB0aGF0IHRoZSB1c2VyIGVudGVycy4KK1VzaW5nIHNpbXBsZSBjb21tYW5kcyBhbmQgb3RoZXIgZGVidWcgZmFjaWxpdGllcywKK3RoZSB1c2VyIGNhbiBpbnNwZWN0IGdsb2JhbCBhbmQgbG9jYWwgdmFyaWFibGVzLAorY2hhbmdlIHRoZWlyIHZhbHVlcywgZXZhbHVhdGUgZXhwcmVzc2lvbnMsIGFuZCBzbyBvbi4KK0EgbGluZSBjb250YWluaW5nIG9ubHkgdGhlIHdvcmQgPGNvZGU+Y29udDwvY29kZT4gZmluaXNoZXMgdGhpcyBmdW5jdGlvbiwKK3NvIHRoYXQgdGhlIGNhbGxlciBjb250aW51ZXMgaXRzIGV4ZWN1dGlvbi4KKworCis8cD4KK05vdGUgdGhhdCBjb21tYW5kcyBmb3IgPGNvZGU+ZGVidWcuZGVidWc8L2NvZGU+IGFyZSBub3QgbGV4aWNhbGx5IG5lc3RlZAord2l0aGluIGFueSBmdW5jdGlvbiBhbmQgc28gaGF2ZSBubyBkaXJlY3QgYWNjZXNzIHRvIGxvY2FsIHZhcmlhYmxlcy4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5nZXRob29rIj48Y29kZT5kZWJ1Zy5nZXRob29rIChbdGhyZWFkXSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBjdXJyZW50IGhvb2sgc2V0dGluZ3Mgb2YgdGhlIHRocmVhZCwgYXMgdGhyZWUgdmFsdWVzOgordGhlIGN1cnJlbnQgaG9vayBmdW5jdGlvbiwgdGhlIGN1cnJlbnQgaG9vayBtYXNrLAorYW5kIHRoZSBjdXJyZW50IGhvb2sgY291bnQKKyhhcyBzZXQgYnkgdGhlIDxhIGhyZWY9IiNwZGYtZGVidWcuc2V0aG9vayI+PGNvZGU+ZGVidWcuc2V0aG9vazwvY29kZT48L2E+IGZ1bmN0aW9uKS4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5nZXRpbmZvIj48Y29kZT5kZWJ1Zy5nZXRpbmZvIChbdGhyZWFkLF0gZiBbLCB3aGF0XSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIGEgdGFibGUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uLgorWW91IGNhbiBnaXZlIHRoZSBmdW5jdGlvbiBkaXJlY3RseQorb3IgeW91IGNhbiBnaXZlIGEgbnVtYmVyIGFzIHRoZSB2YWx1ZSBvZiA8Y29kZT5mPC9jb2RlPiwKK3doaWNoIG1lYW5zIHRoZSBmdW5jdGlvbiBydW5uaW5nIGF0IGxldmVsIDxjb2RlPmY8L2NvZGU+IG9mIHRoZSBjYWxsIHN0YWNrCitvZiB0aGUgZ2l2ZW4gdGhyZWFkOgorbGV2ZWwmbmJzcDswIGlzIHRoZSBjdXJyZW50IGZ1bmN0aW9uICg8Y29kZT5nZXRpbmZvPC9jb2RlPiBpdHNlbGYpOworbGV2ZWwmbmJzcDsxIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxlZCA8Y29kZT5nZXRpbmZvPC9jb2RlPgorKGV4Y2VwdCBmb3IgdGFpbCBjYWxscywgd2hpY2ggZG8gbm90IGNvdW50IG9uIHRoZSBzdGFjayk7CithbmQgc28gb24uCitJZiA8Y29kZT5mPC9jb2RlPiBpcyBhIG51bWJlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBmdW5jdGlvbnMsCit0aGVuIDxjb2RlPmdldGluZm88L2NvZGU+IHJldHVybnMgPGI+bmlsPC9iPi4KKworCis8cD4KK1RoZSByZXR1cm5lZCB0YWJsZSBjYW4gY29udGFpbiBhbGwgdGhlIGZpZWxkcyByZXR1cm5lZCBieSA8YSBocmVmPSIjbHVhX2dldGluZm8iPjxjb2RlPmx1YV9nZXRpbmZvPC9jb2RlPjwvYT4sCit3aXRoIHRoZSBzdHJpbmcgPGNvZGU+d2hhdDwvY29kZT4gZGVzY3JpYmluZyB3aGljaCBmaWVsZHMgdG8gZmlsbCBpbi4KK1RoZSBkZWZhdWx0IGZvciA8Y29kZT53aGF0PC9jb2RlPiBpcyB0byBnZXQgYWxsIGluZm9ybWF0aW9uIGF2YWlsYWJsZSwKK2V4Y2VwdCB0aGUgdGFibGUgb2YgdmFsaWQgbGluZXMuCitJZiBwcmVzZW50LAordGhlIG9wdGlvbiAnPGNvZGU+ZjwvY29kZT4nCithZGRzIGEgZmllbGQgbmFtZWQgPGNvZGU+ZnVuYzwvY29kZT4gd2l0aCB0aGUgZnVuY3Rpb24gaXRzZWxmLgorSWYgcHJlc2VudCwKK3RoZSBvcHRpb24gJzxjb2RlPkw8L2NvZGU+JworYWRkcyBhIGZpZWxkIG5hbWVkIDxjb2RlPmFjdGl2ZWxpbmVzPC9jb2RlPiB3aXRoIHRoZSB0YWJsZSBvZgordmFsaWQgbGluZXMuCisKKworPHA+CitGb3IgaW5zdGFuY2UsIHRoZSBleHByZXNzaW9uIDxjb2RlPmRlYnVnLmdldGluZm8oMSwibiIpLm5hbWU8L2NvZGU+IHJldHVybnMKK2EgdGFibGUgd2l0aCBhIG5hbWUgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLAoraWYgYSByZWFzb25hYmxlIG5hbWUgY2FuIGJlIGZvdW5kLAorYW5kIHRoZSBleHByZXNzaW9uIDxjb2RlPmRlYnVnLmdldGluZm8ocHJpbnQpPC9jb2RlPgorcmV0dXJucyBhIHRhYmxlIHdpdGggYWxsIGF2YWlsYWJsZSBpbmZvcm1hdGlvbgorYWJvdXQgdGhlIDxhIGhyZWY9IiNwZGYtcHJpbnQiPjxjb2RlPnByaW50PC9jb2RlPjwvYT4gZnVuY3Rpb24uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZGVidWcuZ2V0bG9jYWwiPjxjb2RlPmRlYnVnLmdldGxvY2FsIChbdGhyZWFkLF0gZiwgbG9jYWwpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuYW1lIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlCit3aXRoIGluZGV4IDxjb2RlPmxvY2FsPC9jb2RlPiBvZiB0aGUgZnVuY3Rpb24gYXQgbGV2ZWwgPGNvZGU+ZjwvY29kZT4gb2YgdGhlIHN0YWNrLgorVGhpcyBmdW5jdGlvbiBhY2Nlc3NlcyBub3Qgb25seSBleHBsaWNpdCBsb2NhbCB2YXJpYWJsZXMsCitidXQgYWxzbyBwYXJhbWV0ZXJzLCB0ZW1wb3JhcmllcywgZXRjLgorCisKKzxwPgorVGhlIGZpcnN0IHBhcmFtZXRlciBvciBsb2NhbCB2YXJpYWJsZSBoYXMgaW5kZXgmbmJzcDsxLCBhbmQgc28gb24sCit1bnRpbCB0aGUgbGFzdCBhY3RpdmUgdmFyaWFibGUuCitOZWdhdGl2ZSBpbmRpY2VzIHJlZmVyIHRvIHZhcmFyZyBwYXJhbWV0ZXJzOworLTEgaXMgdGhlIGZpcnN0IHZhcmFyZyBwYXJhbWV0ZXIuCitUaGUgZnVuY3Rpb24gcmV0dXJucyA8Yj5uaWw8L2I+IGlmIHRoZXJlIGlzIG5vIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIGluZGV4LAorYW5kIHJhaXNlcyBhbiBlcnJvciB3aGVuIGNhbGxlZCB3aXRoIGEgbGV2ZWwgb3V0IG9mIHJhbmdlLgorKFlvdSBjYW4gY2FsbCA8YSBocmVmPSIjcGRmLWRlYnVnLmdldGluZm8iPjxjb2RlPmRlYnVnLmdldGluZm88L2NvZGU+PC9hPiB0byBjaGVjayB3aGV0aGVyIHRoZSBsZXZlbCBpcyB2YWxpZC4pCisKKworPHA+CitWYXJpYWJsZSBuYW1lcyBzdGFydGluZyB3aXRoICc8Y29kZT4oPC9jb2RlPicgKG9wZW4gcGFyZW50aGVzaXMpCityZXByZXNlbnQgaW50ZXJuYWwgdmFyaWFibGVzCisobG9vcCBjb250cm9sIHZhcmlhYmxlcywgdGVtcG9yYXJpZXMsIHZhcmFyZ3MsIGFuZCBDJm5ic3A7ZnVuY3Rpb24gbG9jYWxzKS4KKworCis8cD4KK1RoZSBwYXJhbWV0ZXIgPGNvZGU+ZjwvY29kZT4gbWF5IGFsc28gYmUgYSBmdW5jdGlvbi4KK0luIHRoYXQgY2FzZSwgPGNvZGU+Z2V0bG9jYWw8L2NvZGU+IHJldHVybnMgb25seSB0aGUgbmFtZSBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLmdldG1ldGF0YWJsZSI+PGNvZGU+ZGVidWcuZ2V0bWV0YXRhYmxlICh2YWx1ZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBtZXRhdGFibGUgb2YgdGhlIGdpdmVuIDxjb2RlPnZhbHVlPC9jb2RlPgorb3IgPGI+bmlsPC9iPiBpZiBpdCBkb2VzIG5vdCBoYXZlIGEgbWV0YXRhYmxlLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLmdldHJlZ2lzdHJ5Ij48Y29kZT5kZWJ1Zy5nZXRyZWdpc3RyeSAoKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgdGhlIHJlZ2lzdHJ5IHRhYmxlIChzZWUgPGEgaHJlZj0iIzQuNSI+JnNlY3Q7NC41PC9hPikuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZGVidWcuZ2V0dXB2YWx1ZSI+PGNvZGU+ZGVidWcuZ2V0dXB2YWx1ZSAoZiwgdXApPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuYW1lIGFuZCB0aGUgdmFsdWUgb2YgdGhlIHVwdmFsdWUKK3dpdGggaW5kZXggPGNvZGU+dXA8L2NvZGU+IG9mIHRoZSBmdW5jdGlvbiA8Y29kZT5mPC9jb2RlPi4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIDxiPm5pbDwvYj4gaWYgdGhlcmUgaXMgbm8gdXB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBpbmRleC4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5nZXR1c2VydmFsdWUiPjxjb2RlPmRlYnVnLmdldHVzZXJ2YWx1ZSAodSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitSZXR1cm5zIHRoZSBMdWEgdmFsdWUgYXNzb2NpYXRlZCB0byA8Y29kZT51PC9jb2RlPi4KK0lmIDxjb2RlPnU8L2NvZGU+IGlzIG5vdCBhIHVzZXJkYXRhLAorcmV0dXJucyA8Yj5uaWw8L2I+LgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLnNldGhvb2siPjxjb2RlPmRlYnVnLnNldGhvb2sgKFt0aHJlYWQsXSBob29rLCBtYXNrIFssIGNvdW50XSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhIGhvb2suCitUaGUgc3RyaW5nIDxjb2RlPm1hc2s8L2NvZGU+IGFuZCB0aGUgbnVtYmVyIDxjb2RlPmNvdW50PC9jb2RlPiBkZXNjcmliZQord2hlbiB0aGUgaG9vayB3aWxsIGJlIGNhbGxlZC4KK1RoZSBzdHJpbmcgbWFzayBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMsCit3aXRoIHRoZSBnaXZlbiBtZWFuaW5nOgorCis8dWw+Cis8bGk+PGI+Jzxjb2RlPmM8L2NvZGU+JzogPC9iPiB0aGUgaG9vayBpcyBjYWxsZWQgZXZlcnkgdGltZSBMdWEgY2FsbHMgYSBmdW5jdGlvbjs8L2xpPgorPGxpPjxiPic8Y29kZT5yPC9jb2RlPic6IDwvYj4gdGhlIGhvb2sgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgTHVhIHJldHVybnMgZnJvbSBhIGZ1bmN0aW9uOzwvbGk+Cis8bGk+PGI+Jzxjb2RlPmw8L2NvZGU+JzogPC9iPiB0aGUgaG9vayBpcyBjYWxsZWQgZXZlcnkgdGltZSBMdWEgZW50ZXJzIGEgbmV3IGxpbmUgb2YgY29kZS48L2xpPgorPC91bD48cD4KK1dpdGggYSA8Y29kZT5jb3VudDwvY29kZT4gZGlmZmVyZW50IGZyb20gemVybywKK3RoZSBob29rIGlzIGNhbGxlZCBhZnRlciBldmVyeSA8Y29kZT5jb3VudDwvY29kZT4gaW5zdHJ1Y3Rpb25zLgorCisKKzxwPgorV2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsCis8YSBocmVmPSIjcGRmLWRlYnVnLnNldGhvb2siPjxjb2RlPmRlYnVnLnNldGhvb2s8L2NvZGU+PC9hPiB0dXJucyBvZmYgdGhlIGhvb2suCisKKworPHA+CitXaGVuIHRoZSBob29rIGlzIGNhbGxlZCwgaXRzIGZpcnN0IHBhcmFtZXRlciBpcyBhIHN0cmluZworZGVzY3JpYmluZyB0aGUgZXZlbnQgdGhhdCBoYXMgdHJpZ2dlcmVkIGl0cyBjYWxsOgorPGNvZGU+ImNhbGwiPC9jb2RlPiAob3IgPGNvZGU+InRhaWwgY2FsbCI8L2NvZGU+KSwKKzxjb2RlPiJyZXR1cm4iPC9jb2RlPiwKKzxjb2RlPiJsaW5lIjwvY29kZT4sIGFuZCA8Y29kZT4iY291bnQiPC9jb2RlPi4KK0ZvciBsaW5lIGV2ZW50cywKK3RoZSBob29rIGFsc28gZ2V0cyB0aGUgbmV3IGxpbmUgbnVtYmVyIGFzIGl0cyBzZWNvbmQgcGFyYW1ldGVyLgorSW5zaWRlIGEgaG9vaywKK3lvdSBjYW4gY2FsbCA8Y29kZT5nZXRpbmZvPC9jb2RlPiB3aXRoIGxldmVsJm5ic3A7MiB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAordGhlIHJ1bm5pbmcgZnVuY3Rpb24KKyhsZXZlbCZuYnNwOzAgaXMgdGhlIDxjb2RlPmdldGluZm88L2NvZGU+IGZ1bmN0aW9uLAorYW5kIGxldmVsJm5ic3A7MSBpcyB0aGUgaG9vayBmdW5jdGlvbikuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZGVidWcuc2V0bG9jYWwiPjxjb2RlPmRlYnVnLnNldGxvY2FsIChbdGhyZWFkLF0gbGV2ZWwsIGxvY2FsLCB2YWx1ZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitUaGlzIGZ1bmN0aW9uIGFzc2lnbnMgdGhlIHZhbHVlIDxjb2RlPnZhbHVlPC9jb2RlPiB0byB0aGUgbG9jYWwgdmFyaWFibGUKK3dpdGggaW5kZXggPGNvZGU+bG9jYWw8L2NvZGU+IG9mIHRoZSBmdW5jdGlvbiBhdCBsZXZlbCA8Y29kZT5sZXZlbDwvY29kZT4gb2YgdGhlIHN0YWNrLgorVGhlIGZ1bmN0aW9uIHJldHVybnMgPGI+bmlsPC9iPiBpZiB0aGVyZSBpcyBubyBsb2NhbAordmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gaW5kZXgsCithbmQgcmFpc2VzIGFuIGVycm9yIHdoZW4gY2FsbGVkIHdpdGggYSA8Y29kZT5sZXZlbDwvY29kZT4gb3V0IG9mIHJhbmdlLgorKFlvdSBjYW4gY2FsbCA8Y29kZT5nZXRpbmZvPC9jb2RlPiB0byBjaGVjayB3aGV0aGVyIHRoZSBsZXZlbCBpcyB2YWxpZC4pCitPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLgorCisKKzxwPgorU2VlIDxhIGhyZWY9IiNwZGYtZGVidWcuZ2V0bG9jYWwiPjxjb2RlPmRlYnVnLmdldGxvY2FsPC9jb2RlPjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3ZhcmlhYmxlIGluZGljZXMgYW5kIG5hbWVzLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLnNldG1ldGF0YWJsZSI+PGNvZGU+ZGVidWcuc2V0bWV0YXRhYmxlICh2YWx1ZSwgdGFibGUpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorU2V0cyB0aGUgbWV0YXRhYmxlIGZvciB0aGUgZ2l2ZW4gPGNvZGU+dmFsdWU8L2NvZGU+IHRvIHRoZSBnaXZlbiA8Y29kZT50YWJsZTwvY29kZT4KKyh3aGljaCBjYW4gYmUgPGI+bmlsPC9iPikuCitSZXR1cm5zIDxjb2RlPnZhbHVlPC9jb2RlPi4KKworCisKKworPHA+Cis8aHI+PGgzPjxhIG5hbWU9InBkZi1kZWJ1Zy5zZXR1cHZhbHVlIj48Y29kZT5kZWJ1Zy5zZXR1cHZhbHVlIChmLCB1cCwgdmFsdWUpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorVGhpcyBmdW5jdGlvbiBhc3NpZ25zIHRoZSB2YWx1ZSA8Y29kZT52YWx1ZTwvY29kZT4gdG8gdGhlIHVwdmFsdWUKK3dpdGggaW5kZXggPGNvZGU+dXA8L2NvZGU+IG9mIHRoZSBmdW5jdGlvbiA8Y29kZT5mPC9jb2RlPi4KK1RoZSBmdW5jdGlvbiByZXR1cm5zIDxiPm5pbDwvYj4gaWYgdGhlcmUgaXMgbm8gdXB2YWx1ZQord2l0aCB0aGUgZ2l2ZW4gaW5kZXguCitPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHVwdmFsdWUuCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZGVidWcuc2V0dXNlcnZhbHVlIj48Y29kZT5kZWJ1Zy5zZXR1c2VydmFsdWUgKHVkYXRhLCB2YWx1ZSk8L2NvZGU+PC9hPjwvaDM+CisKKworPHA+CitTZXRzIHRoZSBnaXZlbiA8Y29kZT52YWx1ZTwvY29kZT4gYXMKK3RoZSBMdWEgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gPGNvZGU+dWRhdGE8L2NvZGU+LgorPGNvZGU+dmFsdWU8L2NvZGU+IG11c3QgYmUgYSB0YWJsZSBvciA8Yj5uaWw8L2I+OworPGNvZGU+dWRhdGE8L2NvZGU+IG11c3QgYmUgYSBmdWxsIHVzZXJkYXRhLgorCisKKzxwPgorUmV0dXJucyA8Y29kZT51ZGF0YTwvY29kZT4uCisKKworCisKKzxwPgorPGhyPjxoMz48YSBuYW1lPSJwZGYtZGVidWcudHJhY2ViYWNrIj48Y29kZT5kZWJ1Zy50cmFjZWJhY2sgKFt0aHJlYWQsXSBbbWVzc2FnZSBbLCBsZXZlbF1dKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK0lmIDxjb2RlPm1lc3NhZ2U8L2NvZGU+IGlzIHByZXNlbnQgYnV0IGlzIG5laXRoZXIgYSBzdHJpbmcgbm9yIDxiPm5pbDwvYj4sCit0aGlzIGZ1bmN0aW9uIHJldHVybnMgPGNvZGU+bWVzc2FnZTwvY29kZT4gd2l0aG91dCBmdXJ0aGVyIHByb2Nlc3NpbmcuCitPdGhlcndpc2UsCitpdCByZXR1cm5zIGEgc3RyaW5nIHdpdGggYSB0cmFjZWJhY2sgb2YgdGhlIGNhbGwgc3RhY2suCitBbiBvcHRpb25hbCA8Y29kZT5tZXNzYWdlPC9jb2RlPiBzdHJpbmcgaXMgYXBwZW5kZWQKK2F0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYWNlYmFjay4KK0FuIG9wdGlvbmFsIDxjb2RlPmxldmVsPC9jb2RlPiBudW1iZXIgdGVsbHMgYXQgd2hpY2ggbGV2ZWwKK3RvIHN0YXJ0IHRoZSB0cmFjZWJhY2sKKyhkZWZhdWx0IGlzIDEsIHRoZSBmdW5jdGlvbiBjYWxsaW5nIDxjb2RlPnRyYWNlYmFjazwvY29kZT4pLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLnVwdmFsdWVpZCI+PGNvZGU+ZGVidWcudXB2YWx1ZWlkIChmLCBuKTwvY29kZT48L2E+PC9oMz4KKworCis8cD4KK1JldHVybnMgYW4gdW5pcXVlIGlkZW50aWZpZXIgKGFzIGEgbGlnaHQgdXNlcmRhdGEpCitmb3IgdGhlIHVwdmFsdWUgbnVtYmVyZWQgPGNvZGU+bjwvY29kZT4KK2Zyb20gdGhlIGdpdmVuIGZ1bmN0aW9uLgorCisKKzxwPgorVGhlc2UgdW5pcXVlIGlkZW50aWZpZXJzIGFsbG93IGEgcHJvZ3JhbSB0byBjaGVjayB3aGV0aGVyIGRpZmZlcmVudAorY2xvc3VyZXMgc2hhcmUgdXB2YWx1ZXMuCitMdWEgY2xvc3VyZXMgdGhhdCBzaGFyZSBhbiB1cHZhbHVlCisodGhhdCBpcywgdGhhdCBhY2Nlc3MgYSBzYW1lIGV4dGVybmFsIGxvY2FsIHZhcmlhYmxlKQord2lsbCByZXR1cm4gaWRlbnRpY2FsIGlkcyBmb3IgdGhvc2UgdXB2YWx1ZSBpbmRpY2VzLgorCisKKworCis8cD4KKzxocj48aDM+PGEgbmFtZT0icGRmLWRlYnVnLnVwdmFsdWVqb2luIj48Y29kZT5kZWJ1Zy51cHZhbHVlam9pbiAoZjEsIG4xLCBmMiwgbjIpPC9jb2RlPjwvYT48L2gzPgorCisKKzxwPgorTWFrZSB0aGUgPGNvZGU+bjE8L2NvZGU+LXRoIHVwdmFsdWUgb2YgdGhlIEx1YSBjbG9zdXJlIDxjb2RlPmYxPC9jb2RlPgorcmVmZXIgdG8gdGhlIDxjb2RlPm4yPC9jb2RlPi10aCB1cHZhbHVlIG9mIHRoZSBMdWEgY2xvc3VyZSA8Y29kZT5mMjwvY29kZT4uCisKKworCisKKworCisKKzxoMT43ICZuZGFzaDsgPGEgbmFtZT0iNyI+THVhIFN0YW5kYWxvbmU8L2E+PC9oMT4KKworPHA+CitBbHRob3VnaCBMdWEgaGFzIGJlZW4gZGVzaWduZWQgYXMgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlLAordG8gYmUgZW1iZWRkZWQgaW4gYSBob3N0IEMmbmJzcDtwcm9ncmFtLAoraXQgaXMgYWxzbyBmcmVxdWVudGx5IHVzZWQgYXMgYSBzdGFuZGFsb25lIGxhbmd1YWdlLgorQW4gaW50ZXJwcmV0ZXIgZm9yIEx1YSBhcyBhIHN0YW5kYWxvbmUgbGFuZ3VhZ2UsCitjYWxsZWQgc2ltcGx5IDxjb2RlPmx1YTwvY29kZT4sCitpcyBwcm92aWRlZCB3aXRoIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24uCitUaGUgc3RhbmRhbG9uZSBpbnRlcnByZXRlciBpbmNsdWRlcworYWxsIHN0YW5kYXJkIGxpYnJhcmllcywgaW5jbHVkaW5nIHRoZSBkZWJ1ZyBsaWJyYXJ5LgorSXRzIHVzYWdlIGlzOgorCis8cHJlPgorICAgICBsdWEgW29wdGlvbnNdIFtzY3JpcHQgW2FyZ3NdXQorPC9wcmU+PHA+CitUaGUgb3B0aW9ucyBhcmU6CisKKzx1bD4KKzxsaT48Yj48Y29kZT4tZSA8ZW0+c3RhdDwvZW0+PC9jb2RlPjogPC9iPiBleGVjdXRlcyBzdHJpbmcgPGVtPnN0YXQ8L2VtPjs8L2xpPgorPGxpPjxiPjxjb2RlPi1sIDxlbT5tb2Q8L2VtPjwvY29kZT46IDwvYj4gInJlcXVpcmVzIiA8ZW0+bW9kPC9lbT47PC9saT4KKzxsaT48Yj48Y29kZT4taTwvY29kZT46IDwvYj4gZW50ZXJzIGludGVyYWN0aXZlIG1vZGUgYWZ0ZXIgcnVubmluZyA8ZW0+c2NyaXB0PC9lbT47PC9saT4KKzxsaT48Yj48Y29kZT4tdjwvY29kZT46IDwvYj4gcHJpbnRzIHZlcnNpb24gaW5mb3JtYXRpb247PC9saT4KKzxsaT48Yj48Y29kZT4tRTwvY29kZT46IDwvYj4gaWdub3JlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXM7PC9saT4KKzxsaT48Yj48Y29kZT4tLTwvY29kZT46IDwvYj4gc3RvcHMgaGFuZGxpbmcgb3B0aW9uczs8L2xpPgorPGxpPjxiPjxjb2RlPi08L2NvZGU+OiA8L2I+IGV4ZWN1dGVzIDxjb2RlPnN0ZGluPC9jb2RlPiBhcyBhIGZpbGUgYW5kIHN0b3BzIGhhbmRsaW5nIG9wdGlvbnMuPC9saT4KKzwvdWw+PHA+CitBZnRlciBoYW5kbGluZyBpdHMgb3B0aW9ucywgPGNvZGU+bHVhPC9jb2RlPiBydW5zIHRoZSBnaXZlbiA8ZW0+c2NyaXB0PC9lbT4sCitwYXNzaW5nIHRvIGl0IHRoZSBnaXZlbiA8ZW0+YXJnczwvZW0+IGFzIHN0cmluZyBhcmd1bWVudHMuCitXaGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywKKzxjb2RlPmx1YTwvY29kZT4gYmVoYXZlcyBhcyA8Y29kZT5sdWEgLXYgLWk8L2NvZGU+Cit3aGVuIHRoZSBzdGFuZGFyZCBpbnB1dCAoPGNvZGU+c3RkaW48L2NvZGU+KSBpcyBhIHRlcm1pbmFsLAorYW5kIGFzIDxjb2RlPmx1YSAtPC9jb2RlPiBvdGhlcndpc2UuCisKKworPHA+CitXaGVuIGNhbGxlZCB3aXRob3V0IG9wdGlvbiA8Y29kZT4tRTwvY29kZT4sIAordGhlIGludGVycHJldGVyIGNoZWNrcyBmb3IgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgPGEgbmFtZT0icGRmLUxVQV9JTklUXzVfMiI+PGNvZGU+TFVBX0lOSVRfNV8yPC9jb2RlPjwvYT4KKyhvciA8YSBuYW1lPSJwZGYtTFVBX0lOSVQiPjxjb2RlPkxVQV9JTklUPC9jb2RlPjwvYT4gaWYgaXQgaXMgbm90IGRlZmluZWQpCitiZWZvcmUgcnVubmluZyBhbnkgYXJndW1lbnQuCitJZiB0aGUgdmFyaWFibGUgY29udGVudCBoYXMgdGhlIGZvcm1hdCA8Y29kZT5APGVtPmZpbGVuYW1lPC9lbT48L2NvZGU+LAordGhlbiA8Y29kZT5sdWE8L2NvZGU+IGV4ZWN1dGVzIHRoZSBmaWxlLgorT3RoZXJ3aXNlLCA8Y29kZT5sdWE8L2NvZGU+IGV4ZWN1dGVzIHRoZSBzdHJpbmcgaXRzZWxmLgorCisKKzxwPgorV2hlbiBjYWxsZWQgd2l0aCBvcHRpb24gPGNvZGU+LUU8L2NvZGU+LAorYmVzaWRlcyBpZ25vcmluZyA8Y29kZT5MVUFfSU5JVDwvY29kZT4sCitMdWEgYWxzbyBpZ25vcmVzCit0aGUgdmFsdWVzIG9mIDxjb2RlPkxVQV9QQVRIPC9jb2RlPiBhbmQgPGNvZGU+TFVBX0NQQVRIPC9jb2RlPiwKK3NldHRpbmcgdGhlIHZhbHVlcyBvZgorPGEgaHJlZj0iI3BkZi1wYWNrYWdlLnBhdGgiPjxjb2RlPnBhY2thZ2UucGF0aDwvY29kZT48L2E+IGFuZCA8YSBocmVmPSIjcGRmLXBhY2thZ2UuY3BhdGgiPjxjb2RlPnBhY2thZ2UuY3BhdGg8L2NvZGU+PC9hPgord2l0aCB0aGUgZGVmYXVsdCBwYXRocyBkZWZpbmVkIGluIDxjb2RlPmx1YWNvbmYuaDwvY29kZT4uCisKKworPHA+CitBbGwgb3B0aW9ucyBhcmUgaGFuZGxlZCBpbiBvcmRlciwgZXhjZXB0IDxjb2RlPi1pPC9jb2RlPiBhbmQgPGNvZGU+LUU8L2NvZGU+LgorRm9yIGluc3RhbmNlLCBhbiBpbnZvY2F0aW9uIGxpa2UKKworPHByZT4KKyAgICAgJCBsdWEgLWUnYT0xJyAtZSAncHJpbnQoYSknIHNjcmlwdC5sdWEKKzwvcHJlPjxwPgord2lsbCBmaXJzdCBzZXQgPGNvZGU+YTwvY29kZT4gdG8gMSwgdGhlbiBwcmludCB0aGUgdmFsdWUgb2YgPGNvZGU+YTwvY29kZT4sCithbmQgZmluYWxseSBydW4gdGhlIGZpbGUgPGNvZGU+c2NyaXB0Lmx1YTwvY29kZT4gd2l0aCBubyBhcmd1bWVudHMuCisoSGVyZSA8Y29kZT4kPC9jb2RlPiBpcyB0aGUgc2hlbGwgcHJvbXB0LiBZb3VyIHByb21wdCBtYXkgYmUgZGlmZmVyZW50LikKKworCis8cD4KK0JlZm9yZSBzdGFydGluZyB0byBydW4gdGhlIHNjcmlwdCwKKzxjb2RlPmx1YTwvY29kZT4gY29sbGVjdHMgYWxsIGFyZ3VtZW50cyBpbiB0aGUgY29tbWFuZCBsaW5lCitpbiBhIGdsb2JhbCB0YWJsZSBjYWxsZWQgPGNvZGU+YXJnPC9jb2RlPi4KK1RoZSBzY3JpcHQgbmFtZSBpcyBzdG9yZWQgYXQgaW5kZXggMCwKK3RoZSBmaXJzdCBhcmd1bWVudCBhZnRlciB0aGUgc2NyaXB0IG5hbWUgZ29lcyB0byBpbmRleCAxLAorYW5kIHNvIG9uLgorQW55IGFyZ3VtZW50cyBiZWZvcmUgdGhlIHNjcmlwdCBuYW1lCisodGhhdCBpcywgdGhlIGludGVycHJldGVyIG5hbWUgcGx1cyB0aGUgb3B0aW9ucykKK2dvIHRvIG5lZ2F0aXZlIGluZGljZXMuCitGb3IgaW5zdGFuY2UsIGluIHRoZSBjYWxsCisKKzxwcmU+CisgICAgICQgbHVhIC1sYSBiLmx1YSB0MSB0MgorPC9wcmU+PHA+Cit0aGUgaW50ZXJwcmV0ZXIgZmlyc3QgcnVucyB0aGUgZmlsZSA8Y29kZT5hLmx1YTwvY29kZT4sCit0aGVuIGNyZWF0ZXMgYSB0YWJsZQorCis8cHJlPgorICAgICBhcmcgPSB7IFstMl0gPSAibHVhIiwgWy0xXSA9ICItbGEiLAorICAgICAgICAgICAgIFswXSA9ICJiLmx1YSIsCisgICAgICAgICAgICAgWzFdID0gInQxIiwgWzJdID0gInQyIiB9Cis8L3ByZT48cD4KK2FuZCBmaW5hbGx5IHJ1bnMgdGhlIGZpbGUgPGNvZGU+Yi5sdWE8L2NvZGU+LgorVGhlIHNjcmlwdCBpcyBjYWxsZWQgd2l0aCA8Y29kZT5hcmdbMV08L2NvZGU+LCA8Y29kZT5hcmdbMl08L2NvZGU+LCAuLi4KK2FzIGFyZ3VtZW50czsKK2l0IGNhbiBhbHNvIGFjY2VzcyB0aGVzZSBhcmd1bWVudHMgd2l0aCB0aGUgdmFyYXJnIGV4cHJlc3Npb24gJzxjb2RlPi4uLjwvY29kZT4nLgorCisKKzxwPgorSW4gaW50ZXJhY3RpdmUgbW9kZSwKK2lmIHlvdSB3cml0ZSBhbiBpbmNvbXBsZXRlIHN0YXRlbWVudCwKK3RoZSBpbnRlcnByZXRlciB3YWl0cyBmb3IgaXRzIGNvbXBsZXRpb24KK2J5IGlzc3VpbmcgYSBkaWZmZXJlbnQgcHJvbXB0LgorCisKKzxwPgorSW4gY2FzZSBvZiB1bnByb3RlY3RlZCBlcnJvcnMgaW4gdGhlIHNjcmlwdCwKK3RoZSBpbnRlcnByZXRlciByZXBvcnRzIHRoZSBlcnJvciB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtLgorSWYgdGhlIGVycm9yIG9iamVjdCBpcyBhIHN0cmluZywKK3RoZSBpbnRlcnByZXRlciBhZGRzIGEgc3RhY2sgdHJhY2ViYWNrIHRvIGl0LgorT3RoZXJ3aXNlLCBpZiB0aGUgZXJyb3Igb2JqZWN0IGhhcyBhIG1ldGFtZXRob2QgPGNvZGU+X190b3N0cmluZzwvY29kZT4sCit0aGUgaW50ZXJwcmV0ZXIgY2FsbHMgdGhpcyBtZXRhbWV0aG9kIHRvIHByb2R1Y2UgdGhlIGZpbmFsIG1lc3NhZ2UuCitGaW5hbGx5LCBpZiB0aGUgZXJyb3Igb2JqZWN0IGlzIDxiPm5pbDwvYj4sCit0aGUgaW50ZXJwcmV0ZXIgZG9lcyBub3QgcmVwb3J0IHRoZSBlcnJvci4KKworCis8cD4KK1doZW4gZmluaXNoaW5nIG5vcm1hbGx5LAordGhlIGludGVycHJldGVyIGNsb3NlcyBpdHMgbWFpbiBMdWEgc3RhdGUKKyhzZWUgPGEgaHJlZj0iI2x1YV9jbG9zZSI+PGNvZGU+bHVhX2Nsb3NlPC9jb2RlPjwvYT4pLgorVGhlIHNjcmlwdCBjYW4gYXZvaWQgdGhpcyBzdGVwIGJ5CitjYWxsaW5nIDxhIGhyZWY9IiNwZGYtb3MuZXhpdCI+PGNvZGU+b3MuZXhpdDwvY29kZT48L2E+IHRvIHRlcm1pbmF0ZS4KKworCis8cD4KK1RvIGFsbG93IHRoZSB1c2Ugb2YgTHVhIGFzIGEKK3NjcmlwdCBpbnRlcnByZXRlciBpbiBVbml4IHN5c3RlbXMsCit0aGUgc3RhbmRhbG9uZSBpbnRlcnByZXRlciBza2lwcwordGhlIGZpcnN0IGxpbmUgb2YgYSBjaHVuayBpZiBpdCBzdGFydHMgd2l0aCA8Y29kZT4jPC9jb2RlPi4KK1RoZXJlZm9yZSwgTHVhIHNjcmlwdHMgY2FuIGJlIG1hZGUgaW50byBleGVjdXRhYmxlIHByb2dyYW1zCitieSB1c2luZyA8Y29kZT5jaG1vZCAreDwvY29kZT4gYW5kIHRoZSZuYnNwOzxjb2RlPiMhPC9jb2RlPiBmb3JtLAorYXMgaW4KKworPHByZT4KKyAgICAgIyEvdXNyL2xvY2FsL2Jpbi9sdWEKKzwvcHJlPjxwPgorKE9mIGNvdXJzZSwKK3RoZSBsb2NhdGlvbiBvZiB0aGUgTHVhIGludGVycHJldGVyIG1heSBiZSBkaWZmZXJlbnQgaW4geW91ciBtYWNoaW5lLgorSWYgPGNvZGU+bHVhPC9jb2RlPiBpcyBpbiB5b3VyIDxjb2RlPlBBVEg8L2NvZGU+LAordGhlbgorCis8cHJlPgorICAgICAjIS91c3IvYmluL2VudiBsdWEKKzwvcHJlPjxwPgoraXMgYSBtb3JlIHBvcnRhYmxlIHNvbHV0aW9uLikKKworCisKKzxoMT44ICZuZGFzaDsgPGEgbmFtZT0iOCI+SW5jb21wYXRpYmlsaXRpZXMgd2l0aCB0aGUgUHJldmlvdXMgVmVyc2lvbjwvYT48L2gxPgorCis8cD4KK0hlcmUgd2UgbGlzdCB0aGUgaW5jb21wYXRpYmlsaXRpZXMgdGhhdCB5b3UgbWF5IGZpbmQgd2hlbiBtb3ZpbmcgYSBwcm9ncmFtCitmcm9tIEx1YSZuYnNwOzUuMSB0byBMdWEmbmJzcDs1LjIuCitZb3UgY2FuIGF2b2lkIHNvbWUgaW5jb21wYXRpYmlsaXRpZXMgYnkgY29tcGlsaW5nIEx1YSB3aXRoCithcHByb3ByaWF0ZSBvcHRpb25zIChzZWUgZmlsZSA8Y29kZT5sdWFjb25mLmg8L2NvZGU+KS4KK0hvd2V2ZXIsCithbGwgdGhlc2UgY29tcGF0aWJpbGl0eSBvcHRpb25zIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIEx1YS4KK1NpbWlsYXJseSwKK2FsbCBmZWF0dXJlcyBtYXJrZWQgYXMgZGVwcmVjYXRlZCBpbiBMdWEmbmJzcDs1LjEKK2hhdmUgYmVlbiByZW1vdmVkIGluIEx1YSZuYnNwOzUuMi4KKworCisKKzxoMj44LjEgJm5kYXNoOyA8YSBuYW1lPSI4LjEiPkNoYW5nZXMgaW4gdGhlIExhbmd1YWdlPC9hPjwvaDI+Cis8dWw+CisKKzxsaT4KK1RoZSBjb25jZXB0IG9mIDxlbT5lbnZpcm9ubWVudDwvZW0+IGNoYW5nZWQuCitPbmx5IEx1YSBmdW5jdGlvbnMgaGF2ZSBlbnZpcm9ubWVudHMuCitUbyBzZXQgdGhlIGVudmlyb25tZW50IG9mIGEgTHVhIGZ1bmN0aW9uLAordXNlIHRoZSB2YXJpYWJsZSA8Y29kZT5fRU5WPC9jb2RlPiBvciB0aGUgZnVuY3Rpb24gPGEgaHJlZj0iI3BkZi1sb2FkIj48Y29kZT5sb2FkPC9jb2RlPjwvYT4uCisKKworPHA+CitDIGZ1bmN0aW9ucyBubyBsb25nZXIgaGF2ZSBlbnZpcm9ubWVudHMuCitVc2UgYW4gdXB2YWx1ZSB3aXRoIGEgc2hhcmVkIHRhYmxlIGlmIHlvdSBuZWVkIHRvIGtlZXAKK3NoYXJlZCBzdGF0ZSBhbW9uZyBzZXZlcmFsIEMgZnVuY3Rpb25zLgorKFlvdSBtYXkgdXNlIDxhIGhyZWY9IiNsdWFMX3NldGZ1bmNzIj48Y29kZT5sdWFMX3NldGZ1bmNzPC9jb2RlPjwvYT4gdG8gb3BlbiBhIEMgbGlicmFyeQord2l0aCBhbGwgZnVuY3Rpb25zIHNoYXJpbmcgYSBjb21tb24gdXB2YWx1ZS4pCisKKworPHA+CitUbyBtYW5pcHVsYXRlIHRoZSAiZW52aXJvbm1lbnQiIG9mIGEgdXNlcmRhdGEKKyh3aGljaCBpcyBub3cgY2FsbGVkIHVzZXIgdmFsdWUpLAordXNlIHRoZSBuZXcgZnVuY3Rpb25zCis8YSBocmVmPSIjbHVhX2dldHVzZXJ2YWx1ZSI+PGNvZGU+bHVhX2dldHVzZXJ2YWx1ZTwvY29kZT48L2E+IGFuZCA8YSBocmVmPSIjbHVhX3NldHVzZXJ2YWx1ZSI+PGNvZGU+bHVhX3NldHVzZXJ2YWx1ZTwvY29kZT48L2E+LgorPC9saT4KKworPGxpPgorTHVhIGlkZW50aWZpZXJzIGNhbm5vdCB1c2UgbG9jYWxlLWRlcGVuZGVudCBsZXR0ZXJzLgorPC9saT4KKworPGxpPgorRG9pbmcgYSBzdGVwIG9yIGEgZnVsbCBjb2xsZWN0aW9uIGluIHRoZSBnYXJiYWdlIGNvbGxlY3RvcgorZG9lcyBub3QgcmVzdGFydCB0aGUgY29sbGVjdG9yIGlmIGl0IGhhcyBiZWVuIHN0b3BwZWQuCis8L2xpPgorCis8bGk+CitXZWFrIHRhYmxlcyB3aXRoIHdlYWsga2V5cyBub3cgcGVyZm9ybSBsaWtlIDxlbT5lcGhlbWVyb24gdGFibGVzPC9lbT4uCis8L2xpPgorCis8bGk+CitUaGUgZXZlbnQgPGVtPnRhaWwgcmV0dXJuPC9lbT4gaW4gZGVidWcgaG9va3Mgd2FzIHJlbW92ZWQuCitJbnN0ZWFkLCB0YWlsIGNhbGxzIGdlbmVyYXRlIGEgc3BlY2lhbCBuZXcgZXZlbnQsCis8ZW0+dGFpbCBjYWxsPC9lbT4sIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIGNhbiBrbm93IHRoYXQKK3RoZXJlIHdpbGwgbm90IGJlIGEgY29ycmVzcG9uZGluZyByZXR1cm4gZXZlbnQuCis8L2xpPgorCis8bGk+CitFcXVhbGl0eSBiZXR3ZWVuIGZ1bmN0aW9uIHZhbHVlcyBoYXMgY2hhbmdlZC4KK05vdywgYSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBub3QgY3JlYXRlIGEgbmV3IHZhbHVlOworaXQgbWF5IHJldXNlIHNvbWUgcHJldmlvdXMgdmFsdWUgaWYgdGhlcmUgaXMgbm8KK29ic2VydmFibGUgZGlmZmVyZW5jZSB0byB0aGUgbmV3IGZ1bmN0aW9uLgorPC9saT4KKworPC91bD4KKworCisKKworPGgyPjguMiAmbmRhc2g7IDxhIG5hbWU9IjguMiI+Q2hhbmdlcyBpbiB0aGUgTGlicmFyaWVzPC9hPjwvaDI+Cis8dWw+CisKKzxsaT4KK0Z1bmN0aW9uIDxjb2RlPm1vZHVsZTwvY29kZT4gaXMgZGVwcmVjYXRlZC4KK0l0IGlzIGVhc3kgdG8gc2V0IHVwIGEgbW9kdWxlIHdpdGggcmVndWxhciBMdWEgY29kZS4KK01vZHVsZXMgYXJlIG5vdCBleHBlY3RlZCB0byBzZXQgZ2xvYmFsIHZhcmlhYmxlcy4KKzwvbGk+CisKKzxsaT4KK0Z1bmN0aW9ucyA8Y29kZT5zZXRmZW52PC9jb2RlPiBhbmQgPGNvZGU+Z2V0ZmVudjwvY29kZT4gd2VyZSByZW1vdmVkLAorYmVjYXVzZSBvZiB0aGUgY2hhbmdlcyBpbiBlbnZpcm9ubWVudHMuCis8L2xpPgorCis8bGk+CitGdW5jdGlvbiA8Y29kZT5tYXRoLmxvZzEwPC9jb2RlPiBpcyBkZXByZWNhdGVkLgorVXNlIDxhIGhyZWY9IiNwZGYtbWF0aC5sb2ciPjxjb2RlPm1hdGgubG9nPC9jb2RlPjwvYT4gd2l0aCAxMCBhcyBpdHMgc2Vjb25kIGFyZ3VtZW50LCBpbnN0ZWFkLgorPC9saT4KKworPGxpPgorRnVuY3Rpb24gPGNvZGU+bG9hZHN0cmluZzwvY29kZT4gaXMgZGVwcmVjYXRlZC4KK1VzZSA8Y29kZT5sb2FkPC9jb2RlPiBpbnN0ZWFkOyBpdCBub3cgYWNjZXB0cyBzdHJpbmcgYXJndW1lbnRzCithbmQgYXJlIGV4YWN0bHkgZXF1aXZhbGVudCB0byA8Y29kZT5sb2Fkc3RyaW5nPC9jb2RlPi4KKzwvbGk+CisKKzxsaT4KK0Z1bmN0aW9uIDxjb2RlPnRhYmxlLm1heG48L2NvZGU+IGlzIGRlcHJlY2F0ZWQuCitXcml0ZSBpdCBpbiBMdWEgaWYgeW91IHJlYWxseSBuZWVkIGl0LgorPC9saT4KKworPGxpPgorRnVuY3Rpb24gPGNvZGU+b3MuZXhlY3V0ZTwvY29kZT4gbm93IHJldHVybnMgPGI+dHJ1ZTwvYj4gd2hlbiBjb21tYW5kCit0ZXJtaW5hdGVzIHN1Y2Nlc3NmdWxseSBhbmQgPGI+bmlsPC9iPiBwbHVzIGVycm9yIGluZm9ybWF0aW9uCitvdGhlcndpc2UuCis8L2xpPgorCis8bGk+CitGdW5jdGlvbiA8Y29kZT51bnBhY2s8L2NvZGU+IHdhcyBtb3ZlZCBpbnRvIHRoZSB0YWJsZSBsaWJyYXJ5CithbmQgdGhlcmVmb3JlIG11c3QgYmUgY2FsbGVkIGFzIDxhIGhyZWY9IiNwZGYtdGFibGUudW5wYWNrIj48Y29kZT50YWJsZS51bnBhY2s8L2NvZGU+PC9hPi4KKzwvbGk+CisKKzxsaT4KK0NoYXJhY3RlciBjbGFzcyA8Y29kZT4lejwvY29kZT4gaW4gcGF0dGVybnMgaXMgZGVwcmVjYXRlZCwKK2FzIG5vdyBwYXR0ZXJucyBtYXkgY29udGFpbiAnPGNvZGU+XDA8L2NvZGU+JyBhcyBhIHJlZ3VsYXIgY2hhcmFjdGVyLgorPC9saT4KKworPGxpPgorVGhlIHRhYmxlIDxjb2RlPnBhY2thZ2UubG9hZGVyczwvY29kZT4gd2FzIHJlbmFtZWQgPGNvZGU+cGFja2FnZS5zZWFyY2hlcnM8L2NvZGU+LgorPC9saT4KKworPGxpPgorTHVhIGRvZXMgbm90IGhhdmUgYnl0ZWNvZGUgdmVyaWZpY2F0aW9uIGFueW1vcmUuCitTbywgYWxsIGZ1bmN0aW9ucyB0aGF0IGxvYWQgY29kZQorKDxhIGhyZWY9IiNwZGYtbG9hZCI+PGNvZGU+bG9hZDwvY29kZT48L2E+IGFuZCA8YSBocmVmPSIjcGRmLWxvYWRmaWxlIj48Y29kZT5sb2FkZmlsZTwvY29kZT48L2E+KQorYXJlIHBvdGVudGlhbGx5IGluc2VjdXJlIHdoZW4gbG9hZGluZyB1bnRydXN0ZWQgYmluYXJ5IGRhdGEuCisoQWN0dWFsbHksIHRob3NlIGZ1bmN0aW9ucyB3ZXJlIGFscmVhZHkgaW5zZWN1cmUgYmVjYXVzZQorb2YgZmxhd3MgaW4gdGhlIHZlcmlmaWNhdGlvbiBhbGdvcml0aG0uKQorV2hlbiBpbiBkb3VidCwKK3VzZSB0aGUgPGNvZGU+bW9kZTwvY29kZT4gYXJndW1lbnQgb2YgdGhvc2UgZnVuY3Rpb25zCit0byByZXN0cmljdCB0aGVtIHRvIGxvYWRpbmcgdGV4dHVhbCBjaHVua3MuCis8L2xpPgorCis8bGk+CitUaGUgc3RhbmRhcmQgcGF0aHMgaW4gdGhlIG9mZmljaWFsIGRpc3RyaWJ1dGlvbiBtYXkKK2NoYW5nZSBiZXR3ZWVuIHZlcnNpb25zLgorPC9saT4KKworPC91bD4KKworCisKKworPGgyPjguMyAmbmRhc2g7IDxhIG5hbWU9IjguMyI+Q2hhbmdlcyBpbiB0aGUgQVBJPC9hPjwvaDI+Cis8dWw+CisKKzxsaT4KK1BzZXVkb2luZGV4IDxjb2RlPkxVQV9HTE9CQUxTSU5ERVg8L2NvZGU+IHdhcyByZW1vdmVkLgorWW91IG11c3QgZ2V0IHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgZnJvbSB0aGUgcmVnaXN0cnkKKyhzZWUgPGEgaHJlZj0iIzQuNSI+JnNlY3Q7NC41PC9hPikuCis8L2xpPgorCis8bGk+CitQc2V1ZG9pbmRleCA8Y29kZT5MVUFfRU5WSVJPTklOREVYPC9jb2RlPgorYW5kIGZ1bmN0aW9ucyA8Y29kZT5sdWFfZ2V0ZmVudjwvY29kZT4vPGNvZGU+bHVhX3NldGZlbnY8L2NvZGU+Cit3ZXJlIHJlbW92ZWQsCithcyBDJm5ic3A7ZnVuY3Rpb25zIG5vIGxvbmdlciBoYXZlIGVudmlyb25tZW50cy4KKzwvbGk+CisKKzxsaT4KK0Z1bmN0aW9uIDxjb2RlPmx1YUxfcmVnaXN0ZXI8L2NvZGU+IGlzIGRlcHJlY2F0ZWQuCitVc2UgPGEgaHJlZj0iI2x1YUxfc2V0ZnVuY3MiPjxjb2RlPmx1YUxfc2V0ZnVuY3M8L2NvZGU+PC9hPiBzbyB0aGF0IHlvdXIgbW9kdWxlIGRvZXMgbm90IGNyZWF0ZSBnbG9iYWxzLgorKE1vZHVsZXMgYXJlIG5vdCBleHBlY3RlZCB0byBzZXQgZ2xvYmFsIHZhcmlhYmxlcyBhbnltb3JlLikKKzwvbGk+CisKKzxsaT4KK1RoZSA8Y29kZT5vc2l6ZTwvY29kZT4gYXJndW1lbnQgdG8gdGhlIGFsbG9jYXRpb24gZnVuY3Rpb24KK21heSBub3QgYmUgemVybyB3aGVuIGNyZWF0aW5nIGEgbmV3IGJsb2NrLAordGhhdCBpcywgd2hlbiA8Y29kZT5wdHI8L2NvZGU+IGlzIDxjb2RlPk5VTEw8L2NvZGU+Cisoc2VlIDxhIGhyZWY9IiNsdWFfQWxsb2MiPjxjb2RlPmx1YV9BbGxvYzwvY29kZT48L2E+KS4KK1VzZSBvbmx5IHRoZSB0ZXN0IDxjb2RlPnB0ciA9PSBOVUxMPC9jb2RlPiB0byBjaGVjayB3aGV0aGVyCit0aGUgYmxvY2sgaXMgbmV3LgorPC9saT4KKworPGxpPgorRmluYWxpemVycyAoPGNvZGU+X19nYzwvY29kZT4gbWV0YW1ldGhvZHMpIGZvciB1c2VyZGF0YSBhcmUgY2FsbGVkIGluIHRoZQorcmV2ZXJzZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBtYXJrZWQgZm9yIGZpbmFsaXphdGlvbiwKK25vdCB0aGF0IHRoZXkgd2VyZSBjcmVhdGVkIChzZWUgPGEgaHJlZj0iIzIuNS4xIj4mc2VjdDsyLjUuMTwvYT4pLgorKE1vc3QgdXNlcmRhdGEgYXJlIG1hcmtlZCBpbW1lZGlhdGVseSBhZnRlciB0aGV5IGFyZSBjcmVhdGVkLikKK01vcmVvdmVyLAoraWYgdGhlIG1ldGF0YWJsZSBkb2VzIG5vdCBoYXZlIGEgPGNvZGU+X19nYzwvY29kZT4gZmllbGQgd2hlbiBzZXQsCit0aGUgZmluYWxpemVyIHdpbGwgbm90IGJlIGNhbGxlZCwKK2V2ZW4gaWYgaXQgaXMgc2V0IGxhdGVyLgorPC9saT4KKworPGxpPgorPGNvZGU+bHVhTF90eXBlcnJvcjwvY29kZT4gd2FzIHJlbW92ZWQuCitXcml0ZSB5b3VyIG93biB2ZXJzaW9uIGlmIHlvdSBuZWVkIGl0LgorPC9saT4KKworPGxpPgorRnVuY3Rpb24gPGNvZGU+bHVhX2NwY2FsbDwvY29kZT4gaXMgZGVwcmVjYXRlZC4KK1lvdSBjYW4gc2ltcGx5IHB1c2ggdGhlIGZ1bmN0aW9uIHdpdGggPGEgaHJlZj0iI2x1YV9wdXNoY2Z1bmN0aW9uIj48Y29kZT5sdWFfcHVzaGNmdW5jdGlvbjwvY29kZT48L2E+CithbmQgY2FsbCBpdCB3aXRoIDxhIGhyZWY9IiNsdWFfcGNhbGwiPjxjb2RlPmx1YV9wY2FsbDwvY29kZT48L2E+LgorPC9saT4KKworPGxpPgorRnVuY3Rpb25zIDxjb2RlPmx1YV9lcXVhbDwvY29kZT4gYW5kIDxjb2RlPmx1YV9sZXNzdGhhbjwvY29kZT4gYXJlIGRlcHJlY2F0ZWQuCitVc2UgdGhlIG5ldyA8YSBocmVmPSIjbHVhX2NvbXBhcmUiPjxjb2RlPmx1YV9jb21wYXJlPC9jb2RlPjwvYT4gd2l0aCBhcHByb3ByaWF0ZSBvcHRpb25zIGluc3RlYWQuCis8L2xpPgorCis8bGk+CitGdW5jdGlvbiA8Y29kZT5sdWFfb2JqbGVuPC9jb2RlPiB3YXMgcmVuYW1lZCA8YSBocmVmPSIjbHVhX3Jhd2xlbiI+PGNvZGU+bHVhX3Jhd2xlbjwvY29kZT48L2E+LgorPC9saT4KKworPGxpPgorRnVuY3Rpb24gPGEgaHJlZj0iI2x1YV9sb2FkIj48Y29kZT5sdWFfbG9hZDwvY29kZT48L2E+IGhhcyBhbiBleHRyYSBwYXJhbWV0ZXIsIDxjb2RlPm1vZGU8L2NvZGU+LgorUGFzcyA8Y29kZT5OVUxMPC9jb2RlPiB0byBzaW11bGF0ZSB0aGUgb2xkIGJlaGF2aW9yLgorPC9saT4KKworPGxpPgorRnVuY3Rpb24gPGEgaHJlZj0iI2x1YV9yZXN1bWUiPjxjb2RlPmx1YV9yZXN1bWU8L2NvZGU+PC9hPiBoYXMgYW4gZXh0cmEgcGFyYW1ldGVyLCA8Y29kZT5mcm9tPC9jb2RlPi4KK1Bhc3MgPGNvZGU+TlVMTDwvY29kZT4gb3IgdGhlIHRocmVhZCBkb2luZyB0aGUgY2FsbC4KKzwvbGk+CisKKzwvdWw+CisKKworCisKKzxoMT45ICZuZGFzaDsgPGEgbmFtZT0iOSI+VGhlIENvbXBsZXRlIFN5bnRheCBvZiBMdWE8L2E+PC9oMT4KKworPHA+CitIZXJlIGlzIHRoZSBjb21wbGV0ZSBzeW50YXggb2YgTHVhIGluIGV4dGVuZGVkIEJORi4KKyhJdCBkb2VzIG5vdCBkZXNjcmliZSBvcGVyYXRvciBwcmVjZWRlbmNlcy4pCisKKworCisKKzxwcmU+CisKKwljaHVuayA6Oj0gYmxvY2sKKworCWJsb2NrIDo6PSB7c3RhdH0gW3JldHN0YXRdCisKKwlzdGF0IDo6PSAgJmxzcXVvOzxiPjs8L2I+JnJzcXVvOyB8IAorCQkgdmFybGlzdCAmbHNxdW87PGI+PTwvYj4mcnNxdW87IGV4cGxpc3QgfCAKKwkJIGZ1bmN0aW9uY2FsbCB8IAorCQkgbGFiZWwgfCAKKwkJIDxiPmJyZWFrPC9iPiB8IAorCQkgPGI+Z290bzwvYj4gTmFtZSB8IAorCQkgPGI+ZG88L2I+IGJsb2NrIDxiPmVuZDwvYj4gfCAKKwkJIDxiPndoaWxlPC9iPiBleHAgPGI+ZG88L2I+IGJsb2NrIDxiPmVuZDwvYj4gfCAKKwkJIDxiPnJlcGVhdDwvYj4gYmxvY2sgPGI+dW50aWw8L2I+IGV4cCB8IAorCQkgPGI+aWY8L2I+IGV4cCA8Yj50aGVuPC9iPiBibG9jayB7PGI+ZWxzZWlmPC9iPiBleHAgPGI+dGhlbjwvYj4gYmxvY2t9IFs8Yj5lbHNlPC9iPiBibG9ja10gPGI+ZW5kPC9iPiB8IAorCQkgPGI+Zm9yPC9iPiBOYW1lICZsc3F1bzs8Yj49PC9iPiZyc3F1bzsgZXhwICZsc3F1bzs8Yj4sPC9iPiZyc3F1bzsgZXhwIFsmbHNxdW87PGI+LDwvYj4mcnNxdW87IGV4cF0gPGI+ZG88L2I+IGJsb2NrIDxiPmVuZDwvYj4gfCAKKwkJIDxiPmZvcjwvYj4gbmFtZWxpc3QgPGI+aW48L2I+IGV4cGxpc3QgPGI+ZG88L2I+IGJsb2NrIDxiPmVuZDwvYj4gfCAKKwkJIDxiPmZ1bmN0aW9uPC9iPiBmdW5jbmFtZSBmdW5jYm9keSB8IAorCQkgPGI+bG9jYWw8L2I+IDxiPmZ1bmN0aW9uPC9iPiBOYW1lIGZ1bmNib2R5IHwgCisJCSA8Yj5sb2NhbDwvYj4gbmFtZWxpc3QgWyZsc3F1bzs8Yj49PC9iPiZyc3F1bzsgZXhwbGlzdF0gCisKKwlyZXRzdGF0IDo6PSA8Yj5yZXR1cm48L2I+IFtleHBsaXN0XSBbJmxzcXVvOzxiPjs8L2I+JnJzcXVvO10KKworCWxhYmVsIDo6PSAmbHNxdW87PGI+Ojo8L2I+JnJzcXVvOyBOYW1lICZsc3F1bzs8Yj46OjwvYj4mcnNxdW87CisKKwlmdW5jbmFtZSA6Oj0gTmFtZSB7JmxzcXVvOzxiPi48L2I+JnJzcXVvOyBOYW1lfSBbJmxzcXVvOzxiPjo8L2I+JnJzcXVvOyBOYW1lXQorCisJdmFybGlzdCA6Oj0gdmFyIHsmbHNxdW87PGI+LDwvYj4mcnNxdW87IHZhcn0KKworCXZhciA6Oj0gIE5hbWUgfCBwcmVmaXhleHAgJmxzcXVvOzxiPls8L2I+JnJzcXVvOyBleHAgJmxzcXVvOzxiPl08L2I+JnJzcXVvOyB8IHByZWZpeGV4cCAmbHNxdW87PGI+LjwvYj4mcnNxdW87IE5hbWUgCisKKwluYW1lbGlzdCA6Oj0gTmFtZSB7JmxzcXVvOzxiPiw8L2I+JnJzcXVvOyBOYW1lfQorCisJZXhwbGlzdCA6Oj0gZXhwIHsmbHNxdW87PGI+LDwvYj4mcnNxdW87IGV4cH0KKworCWV4cCA6Oj0gIDxiPm5pbDwvYj4gfCA8Yj5mYWxzZTwvYj4gfCA8Yj50cnVlPC9iPiB8IE51bWJlciB8IFN0cmluZyB8ICZsc3F1bzs8Yj4uLi48L2I+JnJzcXVvOyB8IGZ1bmN0aW9uZGVmIHwgCisJCSBwcmVmaXhleHAgfCB0YWJsZWNvbnN0cnVjdG9yIHwgZXhwIGJpbm9wIGV4cCB8IHVub3AgZXhwIAorCisJcHJlZml4ZXhwIDo6PSB2YXIgfCBmdW5jdGlvbmNhbGwgfCAmbHNxdW87PGI+KDwvYj4mcnNxdW87IGV4cCAmbHNxdW87PGI+KTwvYj4mcnNxdW87CisKKwlmdW5jdGlvbmNhbGwgOjo9ICBwcmVmaXhleHAgYXJncyB8IHByZWZpeGV4cCAmbHNxdW87PGI+OjwvYj4mcnNxdW87IE5hbWUgYXJncyAKKworCWFyZ3MgOjo9ICAmbHNxdW87PGI+KDwvYj4mcnNxdW87IFtleHBsaXN0XSAmbHNxdW87PGI+KTwvYj4mcnNxdW87IHwgdGFibGVjb25zdHJ1Y3RvciB8IFN0cmluZyAKKworCWZ1bmN0aW9uZGVmIDo6PSA8Yj5mdW5jdGlvbjwvYj4gZnVuY2JvZHkKKworCWZ1bmNib2R5IDo6PSAmbHNxdW87PGI+KDwvYj4mcnNxdW87IFtwYXJsaXN0XSAmbHNxdW87PGI+KTwvYj4mcnNxdW87IGJsb2NrIDxiPmVuZDwvYj4KKworCXBhcmxpc3QgOjo9IG5hbWVsaXN0IFsmbHNxdW87PGI+LDwvYj4mcnNxdW87ICZsc3F1bzs8Yj4uLi48L2I+JnJzcXVvO10gfCAmbHNxdW87PGI+Li4uPC9iPiZyc3F1bzsKKworCXRhYmxlY29uc3RydWN0b3IgOjo9ICZsc3F1bzs8Yj57PC9iPiZyc3F1bzsgW2ZpZWxkbGlzdF0gJmxzcXVvOzxiPn08L2I+JnJzcXVvOworCisJZmllbGRsaXN0IDo6PSBmaWVsZCB7ZmllbGRzZXAgZmllbGR9IFtmaWVsZHNlcF0KKworCWZpZWxkIDo6PSAmbHNxdW87PGI+WzwvYj4mcnNxdW87IGV4cCAmbHNxdW87PGI+XTwvYj4mcnNxdW87ICZsc3F1bzs8Yj49PC9iPiZyc3F1bzsgZXhwIHwgTmFtZSAmbHNxdW87PGI+PTwvYj4mcnNxdW87IGV4cCB8IGV4cAorCisJZmllbGRzZXAgOjo9ICZsc3F1bzs8Yj4sPC9iPiZyc3F1bzsgfCAmbHNxdW87PGI+OzwvYj4mcnNxdW87CisKKwliaW5vcCA6Oj0gJmxzcXVvOzxiPis8L2I+JnJzcXVvOyB8ICZsc3F1bzs8Yj4tPC9iPiZyc3F1bzsgfCAmbHNxdW87PGI+KjwvYj4mcnNxdW87IHwgJmxzcXVvOzxiPi88L2I+JnJzcXVvOyB8ICZsc3F1bzs8Yj5ePC9iPiZyc3F1bzsgfCAmbHNxdW87PGI+JTwvYj4mcnNxdW87IHwgJmxzcXVvOzxiPi4uPC9iPiZyc3F1bzsgfCAKKwkJICZsc3F1bzs8Yj4mbHQ7PC9iPiZyc3F1bzsgfCAmbHNxdW87PGI+Jmx0Oz08L2I+JnJzcXVvOyB8ICZsc3F1bzs8Yj4mZ3Q7PC9iPiZyc3F1bzsgfCAmbHNxdW87PGI+Jmd0Oz08L2I+JnJzcXVvOyB8ICZsc3F1bzs8Yj49PTwvYj4mcnNxdW87IHwgJmxzcXVvOzxiPn49PC9iPiZyc3F1bzsgfCAKKwkJIDxiPmFuZDwvYj4gfCA8Yj5vcjwvYj4KKworCXVub3AgOjo9ICZsc3F1bzs8Yj4tPC9iPiZyc3F1bzsgfCA8Yj5ub3Q8L2I+IHwgJmxzcXVvOzxiPiM8L2I+JnJzcXVvOworCis8L3ByZT4KKworPHA+CisKKworCisKKworCisKKzxIUj4KKzxTTUFMTCBDTEFTUz0iZm9vdGVyIj4KK0xhc3QgdXBkYXRlOgorVGh1IE1hciAyMSAxMjo1ODo1OSBCUlQgMjAxMworPC9TTUFMTD4KKzwhLS0KK0xhc3QgY2hhbmdlOiByZXZpc2VkIGZvciBMdWEgNS4yLjIKKy0tPgorCis8L2JvZHk+PC9odG1sPgorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvZG9jL29zaS1jZXJ0aWZpZWQtNzJ4NjAucG5nIGIvY29tMzIvbHVhL2RvYy9vc2ktY2VydGlmaWVkLTcyeDYwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmNWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL2RvYy9vc2ktY2VydGlmaWVkLTcyeDYwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvZG9jL3JlYWRtZS5odG1sIGIvY29tMzIvbHVhL2RvYy9yZWFkbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNlYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL2RvYy9yZWFkbWUuaHRtbApAQCAtMCwwICsxLDQxMyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkx1YSA1LjIgcmVhZG1lPC9USVRMRT4KKzxMSU5LIFJFTD0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Imx1YS5jc3MiPgorPE1FVEEgSFRUUC1FUVVJVj0iY29udGVudC10eXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0idGV4dC9jc3MiPgorYmxvY2txdW90ZSwgLmRpc3BsYXkgeworCWJvcmRlcjogc29saWQgI2EwYTBhMCAycHggOworCWJvcmRlci1yYWRpdXM6IDhweCA7CisJcGFkZGluZzogMWVtIDsKKwltYXJnaW46IDBweCA7Cit9CisKKy5kaXNwbGF5IHsKKwl3b3JkLXNwYWNpbmc6IDAuMjVlbSA7Cit9CisKK2RsLmRpc3BsYXkgZGQgeworCXBhZGRpbmctYm90dG9tOiAwLjJlbSA7Cit9CisKK3R0LCBrYmQsIGNvZGUgeworCWZvbnQtc2l6ZTogMTJwdCA7Cit9Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWT4KKworPEhSPgorPEgxPgorPEEgSFJFRj0iaHR0cDovL3d3dy5sdWEub3JnLyI+PElNRyBTUkM9ImxvZ28uZ2lmIiBBTFQ9Ikx1YSIgQk9SREVSPTA+PC9BPgorV2VsY29tZSB0byBMdWEgNS4yCis8L0gxPgorCis8UD4KKzxBIEhSRUY9IiNhYm91dCI+YWJvdXQ8L0E+CismbWlkZG90OworPEEgSFJFRj0iI2luc3RhbGwiPmluc3RhbGxhdGlvbjwvQT4KKyZtaWRkb3Q7Cis8QSBIUkVGPSIjY2hhbmdlcyI+Y2hhbmdlczwvQT4KKyZtaWRkb3Q7Cis8QSBIUkVGPSIjbGljZW5zZSI+bGljZW5zZTwvQT4KKyZtaWRkb3Q7Cis8QSBIUkVGPSJjb250ZW50cy5odG1sIj5yZWZlcmVuY2UgbWFudWFsPC9BPgorCis8SDI+PEEgTkFNRT0iYWJvdXQiPkFib3V0IEx1YTwvQT48L0gyPgorCis8UD4KK0x1YSBpcyBhIHBvd2VyZnVsLCBmYXN0LCBsaWdodHdlaWdodCwgZW1iZWRkYWJsZSBzY3JpcHRpbmcgbGFuZ3VhZ2UKK2RldmVsb3BlZCBieSBhCis8QSBIUkVGPSJodHRwOi8vd3d3Lmx1YS5vcmcvYXV0aG9ycy5odG1sIj50ZWFtPC9BPgorYXQKKzxBIEhSRUY9Imh0dHA6Ly93d3cucHVjLXJpby5ici8iPlBVQy1SaW88L0E+LAordGhlIFBvbnRpZmljYWwgQ2F0aG9saWMgVW5pdmVyc2l0eSBvZiBSaW8gZGUgSmFuZWlybyBpbiBCcmF6aWwuCitMdWEgaXMKKzxBIEhSRUY9IiNsaWNlbnNlIj5mcmVlIHNvZnR3YXJlPC9BPgordXNlZCBpbiBtYW55IHByb2R1Y3RzIGFuZCBwcm9qZWN0cyBhcm91bmQgdGhlIHdvcmxkLgorCis8UD4KK0x1YSdzCis8QSBIUkVGPSJodHRwOi8vd3d3Lmx1YS5vcmcvIj5vZmZpY2lhbCB3ZWIgc2l0ZTwvQT4KK3Byb3ZpZGVzIGNvbXBsZXRlIGluZm9ybWF0aW9uCithYm91dCBMdWEsCitpbmNsdWRpbmcKK2FuCis8QSBIUkVGPSJodHRwOi8vd3d3Lmx1YS5vcmcvYWJvdXQuaHRtbCI+ZXhlY3V0aXZlIHN1bW1hcnk8L0E+CithbmQKK3VwZGF0ZWQKKzxBIEhSRUY9Imh0dHA6Ly93d3cubHVhLm9yZy9kb2NzLmh0bWwiPmRvY3VtZW50YXRpb248L0E+LAorZXNwZWNpYWxseSB0aGUKKzxBIEhSRUY9Imh0dHA6Ly93d3cubHVhLm9yZy9tYW51YWwvNS4yLyI+cmVmZXJlbmNlIG1hbnVhbDwvQT4sCit3aGljaCBtYXkgZGlmZmVyIHNsaWdodGx5IGZyb20gdGhlCis8QSBIUkVGPSJjb250ZW50cy5odG1sIj5sb2NhbCBjb3B5PC9BPgorZGlzdHJpYnV0ZWQgaW4gdGhpcyBwYWNrYWdlLgorCis8SDI+PEEgTkFNRT0iaW5zdGFsbCI+SW5zdGFsbGluZyBMdWE8L0E+PC9IMj4KKworPFA+CitMdWEgaXMgZGlzdHJpYnV0ZWQgaW4KKzxBIEhSRUY9Imh0dHA6Ly93d3cubHVhLm9yZy9mdHAvIj5zb3VyY2U8L0E+Citmb3JtLgorWW91IG5lZWQgdG8gYnVpbGQgaXQgYmVmb3JlIHVzaW5nIGl0LgorQnVpbGRpbmcgTHVhIHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQKK2JlY2F1c2UKK0x1YSBpcyBpbXBsZW1lbnRlZCBpbiBwdXJlIEFOU0kgQyBhbmQgY29tcGlsZXMgdW5tb2RpZmllZCBpbiBhbGwga25vd24KK3BsYXRmb3JtcyB0aGF0IGhhdmUgYW4gQU5TSSBDIGNvbXBpbGVyLgorTHVhIGFsc28gY29tcGlsZXMgdW5tb2RpZmllZCBhcyBDKysuCitUaGUgaW5zdHJ1Y3Rpb25zIGdpdmVuIGJlbG93IGZvciBidWlsZGluZyBMdWEgYXJlIGZvciBVbml4LWxpa2UgcGxhdGZvcm1zLgorU2VlIGFsc28KKzxBIEhSRUY9IiNvdGhlciI+aW5zdHJ1Y3Rpb25zIGZvciBvdGhlciBzeXN0ZW1zPC9BPgorYW5kCis8QSBIUkVGPSIjY3VzdG9taXphdGlvbiI+Y3VzdG9taXphdGlvbiBvcHRpb25zPC9BPi4KKworPFA+CitJZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgdGltZSBvciB0aGUgaW5jbGluYXRpb24gdG8gY29tcGlsZSBMdWEgeW91cnNlbGYsCitnZXQgYSBiaW5hcnkgZnJvbQorPEEgSFJFRj0iaHR0cDovL2x1YS11c2Vycy5vcmcvd2lraS9MdWFCaW5hcmllcyI+THVhQmluYXJpZXM8L0E+LgorVHJ5IGFsc28KKzxBIEhSRUY9Imh0dHA6Ly9sdWFmb3J3aW5kb3dzLmx1YWZvcmdlLm5ldC8iPkx1YSBmb3IgV2luZG93czwvQT4sCithbiBlYXN5LXRvLXVzZSBkaXN0cmlidXRpb24gb2YgTHVhIHRoYXQgaW5jbHVkZXMgbWFueSB1c2VmdWwgbGlicmFyaWVzLgorCis8SDM+QnVpbGRpbmcgTHVhPC9IMz4KKworPFA+CitJbiBtb3N0IFVuaXgtbGlrZSBwbGF0Zm9ybXMsIHNpbXBseSBkbyAiPEtCRD5tYWtlPC9LQkQ+IiB3aXRoIGEgc3VpdGFibGUgdGFyZ2V0LgorSGVyZSBhcmUgdGhlIGRldGFpbHMuCisKKzxPTD4KKzxMST4KK09wZW4gYSB0ZXJtaW5hbCB3aW5kb3cgYW5kIG1vdmUgdG8KK3RoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LCB3aGljaCBpcyBuYW1lZCA8VFQ+bHVhLTUuMi4zPC9UVD4uCitUaGUgTWFrZWZpbGUgdGhlcmUgY29udHJvbHMgYm90aCB0aGUgYnVpbGQgcHJvY2VzcyBhbmQgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLgorPFA+Cis8TEk+CisgIERvICI8S0JEPm1ha2U8L0tCRD4iIGFuZCBzZWUgaWYgeW91ciBwbGF0Zm9ybSBpcyBsaXN0ZWQuCisgIFRoZSBwbGF0Zm9ybXMgY3VycmVudGx5IHN1cHBvcnRlZCBhcmU6Cis8UD4KKzxQIENMQVNTPSJkaXNwbGF5Ij4KKyAgIGFpeCBhbnNpIGJzZCBmcmVlYnNkIGdlbmVyaWMgbGludXggbWFjb3N4IG1pbmd3IHBvc2l4IHNvbGFyaXMKKzwvUD4KKzxQPgorICBJZiB5b3VyIHBsYXRmb3JtIGlzIGxpc3RlZCwganVzdCBkbyAiPEtCRD5tYWtlIHh4eDwvS0JEPiIsIHdoZXJlIHh4eAorICBpcyB5b3VyIHBsYXRmb3JtIG5hbWUuCis8UD4KKyAgSWYgeW91ciBwbGF0Zm9ybSBpcyBub3QgbGlzdGVkLCB0cnkgdGhlIGNsb3Nlc3Qgb25lIG9yIHBvc2l4LCBnZW5lcmljLAorICBhbnNpLCBpbiB0aGlzIG9yZGVyLgorPFA+Cis8TEk+CitUaGUgY29tcGlsYXRpb24gdGFrZXMgb25seSBhIGZldyBtb21lbnRzCithbmQgcHJvZHVjZXMgdGhyZWUgZmlsZXMgaW4gdGhlIDxUVD5zcmM8L1RUPiBkaXJlY3Rvcnk6CitsdWEgKHRoZSBpbnRlcnByZXRlciksCitsdWFjICh0aGUgY29tcGlsZXIpLAorYW5kIGxpYmx1YS5hICh0aGUgbGlicmFyeSkuCis8UD4KKzxMST4KKyAgVG8gY2hlY2sgdGhhdCBMdWEgaGFzIGJlZW4gYnVpbHQgY29ycmVjdGx5LCBkbyAiPEtCRD5tYWtlIHRlc3Q8L0tCRD4iCisgIGFmdGVyIGJ1aWxkaW5nIEx1YS4gVGhpcyB3aWxsIHJ1biB0aGUgaW50ZXJwcmV0ZXIgYW5kIHByaW50IGl0cyB2ZXJzaW9uIHN0cmluZy4KKzwvT0w+Cis8UD4KK0lmIHlvdSdyZSBydW5uaW5nIExpbnV4IGFuZCBnZXQgY29tcGlsYXRpb24gZXJyb3JzLAorbWFrZSBzdXJlIHlvdSBoYXZlIGluc3RhbGxlZCB0aGUgPFRUPnJlYWRsaW5lPC9UVD4gZGV2ZWxvcG1lbnQgcGFja2FnZS4KK0lmIHlvdSBnZXQgbGluayBlcnJvcnMgYWZ0ZXIgdGhhdCwKK3RoZW4gdHJ5ICI8S0JEPm1ha2UgbGludXggTVlMSUJTPS1sdGVybWNhcDwvS0JEPiIuCisKKzxIMz5JbnN0YWxsaW5nIEx1YTwvSDM+Cis8UD4KKyAgT25jZSB5b3UgaGF2ZSBidWlsdCBMdWEsIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIGl0IGluIGFuIG9mZmljaWFsCisgIHBsYWNlIGluIHlvdXIgc3lzdGVtLiBJbiB0aGlzIGNhc2UsIGRvICI8S0JEPm1ha2UgaW5zdGFsbDwvS0JEPiIuIFRoZSBvZmZpY2lhbAorICBwbGFjZSBhbmQgdGhlIHdheSB0byBpbnN0YWxsIGZpbGVzIGFyZSBkZWZpbmVkIGluIHRoZSBNYWtlZmlsZS4gWW91J2xsCisgIHByb2JhYmx5IG5lZWQgdGhlIHJpZ2h0IHBlcm1pc3Npb25zIHRvIGluc3RhbGwgZmlsZXMuCisKKzxQPgorICBUbyBidWlsZCBhbmQgaW5zdGFsbCBMdWEgaW4gb25lIHN0ZXAsIGRvICI8S0JEPm1ha2UgeHh4IGluc3RhbGw8L0tCRD4iLAorICB3aGVyZSB4eHggaXMgeW91ciBwbGF0Zm9ybSBuYW1lLgorCis8UD4KKyAgVG8gaW5zdGFsbCBMdWEgbG9jYWxseSwgZG8gIjxLQkQ+bWFrZSBsb2NhbDwvS0JEPiIuCisgIFRoaXMgd2lsbCBjcmVhdGUgYSBkaXJlY3RvcnkgPFRUPmluc3RhbGw8L1RUPiB3aXRoIHN1YmRpcmVjdG9yaWVzCisgIDxUVD5iaW48L1RUPiwgPFRUPmluY2x1ZGU8L1RUPiwgPFRUPmxpYjwvVFQ+LCA8VFQ+bWFuPC9UVD4sCisgIGFuZCBpbnN0YWxsIEx1YSBhcyBsaXN0ZWQgYmVsb3cuCisKKyAgVG8gaW5zdGFsbCBMdWEgbG9jYWxseSwgYnV0IGluIHNvbWUgb3RoZXIgZGlyZWN0b3J5LCBkbworICAiPEtCRD5tYWtlIGluc3RhbGwgSU5TVEFMTF9UT1A9eHh4PC9LQkQ+Iiwgd2hlcmUgeHh4IGlzIHlvdXIgY2hvc2VuIGRpcmVjdG9yeS4KKworPERMIENMQVNTPSJkaXNwbGF5Ij4KKzxEVD4KKyAgICBiaW46Cis8REQ+CisgICAgbHVhIGx1YWMKKzxEVD4KKyAgICBpbmNsdWRlOgorPEREPgorICAgIGx1YS5oIGx1YWNvbmYuaCBsdWFsaWIuaCBsYXV4bGliLmggbHVhLmhwcAorPERUPgorICAgIGxpYjoKKzxERD4KKyAgICBsaWJsdWEuYQorPERUPgorICAgIG1hbi9tYW4xOgorPEREPgorICAgIGx1YS4xIGx1YWMuMQorPC9ETD4KKworPFA+CisgIFRoZXNlIGFyZSB0aGUgb25seSBkaXJlY3RvcmllcyB5b3UgbmVlZCBmb3IgZGV2ZWxvcG1lbnQuCisgIElmIHlvdSBvbmx5IHdhbnQgdG8gcnVuIEx1YSBwcm9ncmFtcywKKyAgeW91IG9ubHkgbmVlZCB0aGUgZmlsZXMgaW4gYmluIGFuZCBtYW4uCisgIFRoZSBmaWxlcyBpbiBpbmNsdWRlIGFuZCBsaWIgYXJlIG5lZWRlZCBmb3IKKyAgZW1iZWRkaW5nIEx1YSBpbiBDIG9yIEMrKyBwcm9ncmFtcy4KKworPEgzPjxBIE5BTUU9ImN1c3RvbWl6YXRpb24iPkN1c3RvbWl6YXRpb248L0E+PC9IMz4KKzxQPgorICBUaHJlZSBraW5kcyBvZiB0aGluZ3MgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgZWRpdGluZyBhIGZpbGU6Cis8VUw+CisgICAgPExJPiBXaGVyZSBhbmQgaG93IHRvIGluc3RhbGwgTHVhICZtZGFzaDsgZWRpdCA8VFQ+TWFrZWZpbGU8L1RUPi4KKyAgICA8TEk+IEhvdyB0byBidWlsZCBMdWEgJm1kYXNoOyBlZGl0IDxUVD5zcmMvTWFrZWZpbGU8L1RUPi4KKyAgICA8TEk+IEx1YSBmZWF0dXJlcyAmbWRhc2g7IGVkaXQgPFRUPnNyYy9sdWFjb25mLmg8L1RUPi4KKzwvVUw+CisKKzxQPgorICBZb3UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBlZGl0IHRoZSBNYWtlZmlsZXMgYmVjYXVzZSB5b3UgbWF5IHNldCB0aGUKKyAgcmVsZXZhbnQgdmFyaWFibGVzIGluIHRoZSBjb21tYW5kIGxpbmUgd2hlbiBpbnZva2luZyBtYWtlLgorICBOZXZlcnRoZWxlc3MsIGl0J3MgcHJvYmFibHkgYmVzdCB0byBlZGl0IGFuZCBzYXZlIHRoZSBNYWtlZmlsZXMgdG8KKyAgcmVjb3JkIHRoZSBjaGFuZ2VzIHlvdSBuZWVkLgorCis8UD4KKyAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBzb21lIEx1YSBmZWF0dXJlcywgeW91J2xsIG5lZWQKKyAgdG8gZWRpdCA8VFQ+c3JjL2x1YWNvbmYuaDwvVFQ+IGJlZm9yZSBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBMdWEuCisgIFRoZSBlZGl0ZWQgZmlsZSB3aWxsIGJlIHRoZSBvbmUgaW5zdGFsbGVkLCBhbmQKKyAgaXQgd2lsbCBiZSB1c2VkIGJ5IGFueSBMdWEgY2xpZW50cyB0aGF0IHlvdSBidWlsZCwgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LgorICBGdXJ0aGVyIGN1c3RvbWl6YXRpb24gaXMgYXZhaWxhYmxlIHRvIGV4cGVydHMgYnkgZWRpdGluZyB0aGUgTHVhIHNvdXJjZXMuCisKKzxQPgorICBXZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB5b3UgZW5hYmxlIGR5bmFtaWMgbG9hZGluZyBpbiA8VFQ+c3JjL2x1YWNvbmYuaDwvVFQ+LgorICBUaGlzIGlzIGRvbmUgYXV0b21hdGljYWxseSBmb3IgYWxsIHBsYXRmb3JtcyBsaXN0ZWQgYWJvdmUgdGhhdCBoYXZlCisgIHRoaXMgZmVhdHVyZSBhbmQgYWxzbyBmb3IgV2luZG93cy4KKworPEgzPjxBIE5BTUU9Im90aGVyIj5CdWlsZGluZyBMdWEgb24gb3RoZXIgc3lzdGVtczwvQT48L0gzPgorCis8UD4KKyAgSWYgeW91J3JlIG5vdCB1c2luZyB0aGUgdXN1YWwgVW5peCB0b29scywgdGhlbiB0aGUgaW5zdHJ1Y3Rpb25zIGZvcgorICBidWlsZGluZyBMdWEgZGVwZW5kIG9uIHRoZSBjb21waWxlciB5b3UgdXNlLiBZb3UnbGwgbmVlZCB0byBjcmVhdGUKKyAgcHJvamVjdHMgKG9yIHdoYXRldmVyIHlvdXIgY29tcGlsZXIgdXNlcykgZm9yIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LAorICB0aGUgaW50ZXJwcmV0ZXIsIGFuZCB0aGUgY29tcGlsZXIsIGFzIGZvbGxvd3M6CisKKzxETCBDTEFTUz0iZGlzcGxheSI+Cis8RFQ+CitsaWJyYXJ5OgorPEREPgorbGFwaS5jIGxjb2RlLmMgbGN0eXBlLmMgbGRlYnVnLmMgbGRvLmMgbGR1bXAuYyBsZnVuYy5jIGxnYy5jIGxsZXguYworbG1lbS5jIGxvYmplY3QuYyBsb3Bjb2Rlcy5jIGxwYXJzZXIuYyBsc3RhdGUuYyBsc3RyaW5nLmMgbHRhYmxlLmMKK2x0bS5jIGx1bmR1bXAuYyBsdm0uYyBsemlvLmMKK2xhdXhsaWIuYyBsYmFzZWxpYi5jIGxiaXRsaWIuYyBsY29yb2xpYi5jIGxkYmxpYi5jIGxpb2xpYi5jCitsbWF0aGxpYi5jIGxvc2xpYi5jIGxzdHJsaWIuYyBsdGFibGliLmMgbG9hZGxpYi5jIGxpbml0LmMKKzxEVD4KK2ludGVycHJldGVyOgorPEREPgorICBsaWJyYXJ5LCBsdWEuYworPERUPgorY29tcGlsZXI6Cis8REQ+CisgIGxpYnJhcnksIGx1YWMuYworPC9ETD4KKworPFA+CisgIFRvIHVzZSBMdWEgYXMgYSBsaWJyYXJ5IGluIHlvdXIgb3duIHByb2dyYW1zIHlvdSdsbCBuZWVkIHRvIGtub3cgaG93IHRvCisgIGNyZWF0ZSBhbmQgdXNlIGxpYnJhcmllcyB3aXRoIHlvdXIgY29tcGlsZXIuIE1vcmVvdmVyLCB0byBkeW5hbWljYWxseSBsb2FkCisgIEMgbGlicmFyaWVzIGZvciBMdWEgeW91J2xsIG5lZWQgdG8ga25vdyBob3cgdG8gY3JlYXRlIGR5bmFtaWMgbGlicmFyaWVzCisgIGFuZCB5b3UnbGwgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgTHVhIEFQSSBmdW5jdGlvbnMgYXJlIGFjY2Vzc2libGUgdG8KKyAgdGhvc2UgZHluYW1pYyBsaWJyYXJpZXMgJm1kYXNoOyBidXQgPEVNPmRvbid0PC9FTT4gbGluayB0aGUgTHVhIGxpYnJhcnkKKyAgaW50byBlYWNoIGR5bmFtaWMgbGlicmFyeS4gRm9yIFVuaXgsIHdlIHJlY29tbWVuZCB0aGF0IHRoZSBMdWEgbGlicmFyeQorICBiZSBsaW5rZWQgc3RhdGljYWxseSBpbnRvIHRoZSBob3N0IHByb2dyYW0gYW5kIGl0cyBzeW1ib2xzIGV4cG9ydGVkIGZvcgorICBkeW5hbWljIGxpbmtpbmc7IDxUVD5zcmMvTWFrZWZpbGU8L1RUPiBkb2VzIHRoaXMgZm9yIHRoZSBMdWEgaW50ZXJwcmV0ZXIuCisgIEZvciBXaW5kb3dzLCB3ZSByZWNvbW1lbmQgdGhhdCB0aGUgTHVhIGxpYnJhcnkgYmUgYSBETEwuCisKKzxQPgorICBBcyBtZW50aW9uZWQgYWJvdmUsIHlvdSBtYXkgZWRpdCA8VFQ+c3JjL2x1YWNvbmYuaDwvVFQ+IHRvIGN1c3RvbWl6ZQorICBzb21lIGZlYXR1cmVzIGJlZm9yZSBidWlsZGluZyBMdWEuCisKKzxIMj48QSBOQU1FPSJjaGFuZ2VzIj5DaGFuZ2VzIHNpbmNlIEx1YSA1LjE8L0E+PC9IMj4KKworPFA+CitIZXJlIGFyZSB0aGUgbWFpbiBjaGFuZ2VzIGludHJvZHVjZWQgaW4gTHVhIDUuMi4KK1RoZQorPEEgSFJFRj0iY29udGVudHMuaHRtbCI+cmVmZXJlbmNlIG1hbnVhbDwvQT4KK2xpc3RzIHRoZQorPEEgSFJFRj0ibWFudWFsLmh0bWwjOCI+aW5jb21wYXRpYmlsaXRpZXM8L0E+IHRoYXQgaGFkIHRvIGJlIGludHJvZHVjZWQuCisKKzxIMz5NYWluIGNoYW5nZXM8L0gzPgorPFVMPgorPExJPiB5aWVsZGFibGUgcGNhbGwgYW5kIG1ldGFtZXRob2RzCis8TEk+IG5ldyBsZXhpY2FsIHNjaGVtZSBmb3IgZ2xvYmFscworPExJPiBlcGhlbWVyb24gdGFibGVzCis8TEk+IG5ldyBsaWJyYXJ5IGZvciBiaXR3aXNlIG9wZXJhdGlvbnMKKzxMST4gbGlnaHQgQyBmdW5jdGlvbnMKKzxMST4gZW1lcmdlbmN5IGdhcmJhZ2UgY29sbGVjdG9yCis8TEk+IDxDT0RFPmdvdG88L0NPREU+IHN0YXRlbWVudAorPExJPiBmaW5hbGl6ZXJzIGZvciB0YWJsZXMKKzwvVUw+CisKK0hlcmUgYXJlIHRoZSBvdGhlciBjaGFuZ2VzIGludHJvZHVjZWQgaW4gTHVhIDUuMjoKKzxIMz5MYW5ndWFnZTwvSDM+Cis8VUw+Cis8TEk+IG5vIG1vcmUgZmVudiBmb3IgdGhyZWFkcyBvciBmdW5jdGlvbnMKKzxMST4gdGFibGVzIGhvbm9yIHRoZSA8Q09ERT5fX2xlbjwvQ09ERT4gbWV0YW1ldGhvZAorPExJPiBoZXggYW5kIDxDT0RFPlx6PC9DT0RFPiBlc2NhcGVzIGluIHN0cmluZ3MKKzxMST4gc3VwcG9ydCBmb3IgaGV4YWRlY2ltYWwgZmxvYXRzCis8TEk+IG9yZGVyIG1ldGFtZXRob2RzIHdvcmsgZm9yIGRpZmZlcmVudCB0eXBlcworPExJPiBubyBtb3JlIHZlcmlmaWNhdGlvbiBvZiBvcGNvZGUgY29uc2lzdGVuY3kKKzxMST4gaG9vayBldmVudCAidGFpbCByZXR1cm4iIHJlcGxhY2VkIGJ5ICJ0YWlsIGNhbGwiCis8TEk+IGVtcHR5IHN0YXRlbWVudAorPExJPiA8Q09ERT5icmVhazwvQ09ERT4gc3RhdGVtZW50IG1heSBhcHBlYXIgaW4gdGhlIG1pZGRsZSBvZiBhIGJsb2NrCis8L1VMPgorCis8SDM+TGlicmFyaWVzPC9IMz4KKzxVTD4KKzxMST4gYXJndW1lbnRzIGZvciBmdW5jdGlvbiBjYWxsZWQgdGhyb3VnaCA8Q09ERT54cGNhbGw8L0NPREU+Cis8TEk+IG9wdGlvbmFsICdtb2RlJyBhcmd1bWVudCB0byBsb2FkIGFuZCBsb2FkZmlsZSAodG8gY29udHJvbCBiaW5hcnkgeCB0ZXh0KQorPExJPiBvcHRpb25hbCAnZW52JyBhcmd1bWVudCB0byBsb2FkIGFuZCBsb2FkZmlsZSAoZW52aXJvbm1lbnQgZm9yIGxvYWRlZCBjaHVuaykKKzxMST4gPENPREU+bG9hZGxpYjwvQ09ERT4gbWF5IGxvYWQgbGlicmFyaWVzIHdpdGggZ2xvYmFsIG5hbWVzIChSVExEX0dMT0JBTCkKKzxMST4gbmV3IGZ1bmN0aW9uIDxDT0RFPnBhY2thZ2Uuc2VhcmNocGF0aDwvQ09ERT4KKzxMST4gbW9kdWxlcyByZWNlaXZlIHRoZWlyIHBhdGhzIHdoZW4gbG9hZGVkCis8TEk+IG9wdGlvbmFsIGJhc2UgaW4gPENPREU+bWF0aC5sb2c8L0NPREU+Cis8TEk+IG9wdGlvbmFsIHNlcGFyYXRvciBpbiA8Q09ERT5zdHJpbmcucmVwPC9DT0RFPgorPExJPiA8Q09ERT5maWxlOndyaXRlPC9DT0RFPiByZXR1cm5zIDxDT0RFPmZpbGU8L0NPREU+Cis8TEk+IGNsb3NpbmcgYSBwaXBlIHJldHVybnMgZXhpdCBzdGF0dXMKKzxMST4gPENPREU+b3MuZXhpdDwvQ09ERT4gbWF5IGNsb3NlIHN0YXRlCis8TEk+IG5ldyBtZXRhbWV0aG9kcyA8Q09ERT5fX3BhaXJzPC9DT0RFPiBhbmQgPENPREU+X19pcGFpcnM8L0NPREU+Cis8TEk+IG5ldyBvcHRpb24gJ2lzcnVubmluZycgZm9yIDxDT0RFPmNvbGxlY3RnYXJiYWdlPC9DT0RFPiBhbmQgPENPREU+bHVhX2djPC9DT0RFPgorPExJPiBmcm9udGllciBwYXR0ZXJucworPExJPiA8Q09ERT5cMDwvQ09ERT4gaW4gcGF0dGVybnMKKzxMST4gbmV3IG9wdGlvbiA8Q09ERT4qTDwvQ09ERT4gZm9yIDxDT0RFPmlvLnJlYWQ8L0NPREU+Cis8TEk+IG9wdGlvbnMgZm9yIDxDT0RFPmlvLmxpbmVzPC9DT0RFPgorPExJPiA8Q09ERT5kZWJ1Zy5nZXRsb2NhbDwvQ09ERT4gY2FuIGFjY2VzcyBmdW5jdGlvbiB2YXJhcmdzCis8L1VMPgorCis8SDM+QyBBUEk8L0gzPgorPFVMPgorPExJPiBtYWluIHRocmVhZCBwcmVkZWZpbmVkIGluIHRoZSByZWdpc3RyeQorPExJPiBuZXcgZnVuY3Rpb25zCis8Q09ERT5sdWFfYWJzaW5kZXg8L0NPREU+LAorPENPREU+bHVhX2FyaXRoPC9DT0RFPiwKKzxDT0RFPmx1YV9jb21wYXJlPC9DT0RFPiwKKzxDT0RFPmx1YV9jb3B5PC9DT0RFPiwKKzxDT0RFPmx1YV9sZW48L0NPREU+LAorPENPREU+bHVhX3Jhd2dldHA8L0NPREU+LAorPENPREU+bHVhX3Jhd3NldHA8L0NPREU+LAorPENPREU+bHVhX3VwdmFsdWVpZDwvQ09ERT4sCis8Q09ERT5sdWFfdXB2YWx1ZWpvaW48L0NPREU+LAorPENPREU+bHVhX3ZlcnNpb248L0NPREU+LgorPExJPiBuZXcgZnVuY3Rpb25zCis8Q09ERT5sdWFMX2NoZWNrdmVyc2lvbjwvQ09ERT4sCis8Q09ERT5sdWFMX3NldG1ldGF0YWJsZTwvQ09ERT4sCis8Q09ERT5sdWFMX3Rlc3R1ZGF0YTwvQ09ERT4sCis8Q09ERT5sdWFMX3RvbHN0cmluZzwvQ09ERT4uCis8TEk+IDxDT0RFPmx1YV9wdXNoc3RyaW5nPC9DT0RFPiBhbmQgPENPREU+cHVzaGxzdHJpbmc8L0NPREU+IHJldHVybiBzdHJpbmcKKzxMST4gPENPREU+bnBhcmFtczwvQ09ERT4gYW5kIDxDT0RFPmlzdmFyYXJnPC9DT0RFPiBhdmFpbGFibGUgaW4gZGVidWcgQVBJCis8TEk+IG5ldyA8Q09ERT5sdWFfVW5zaWduZWQ8L0NPREU+Cis8L1VMPgorCis8SDM+SW1wbGVtZW50YXRpb248L0gzPgorPFVMPgorPExJPiBtYXggY29uc3RhbnRzIHBlciBmdW5jdGlvbiByYWlzZWQgdG8gMjxTVVA+MjY8L1NVUD4KKzxMST4gZ2VuZXJhdGlvbmFsIG1vZGUgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbiAoZXhwZXJpbWVudGFsKQorPExJPiBOYU4gdHJpY2sgKGV4cGVyaW1lbnRhbCkKKzxMST4gaW50ZXJuYWwgKGltbXV0YWJsZSkgdmVyc2lvbiBvZiBjdHlwZXMKKzxMST4gc2ltcGxlciBpbXBsZW1lbnRhdGlvbiBmb3Igc3RyaW5nIGJ1ZmZlcnMKKzxMST4gcGFyc2VyIHVzZXMgbXVjaCBsZXNzIEMtc3RhY2sgc3BhY2UgKG5vIG1vcmUgYXV0byBhcnJheXMpCis8L1VMPgorCis8SDM+THVhIHN0YW5kYWxvbmUgaW50ZXJwcmV0ZXI8L0gzPgorPFVMPgorPExJPiBuZXcgPENPREU+LUU8L0NPREU+IG9wdGlvbiB0byBhdm9pZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKzxMST4gaGFuZGxpbmcgb2Ygbm9uLXN0cmluZyBlcnJvciBtZXNzYWdlcworPC9VTD4KKworPEgyPjxBIE5BTUU9ImxpY2Vuc2UiPkxpY2Vuc2U8L0E+PC9IMj4KKzxBIEhSRUY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvZG9jcy9kZWZpbml0aW9uLnBocCI+Cis8SU1HIFNSQz0ib3NpLWNlcnRpZmllZC03Mng2MC5wbmciIEFMSUdOPSJyaWdodCIgQk9SREVSPSIwIiBBTFQ9Iltvc2kgY2VydGlmaWVkXSIgU1RZTEU9InBhZGRpbmctbGVmdDogMzBweCA7Ij4KKzwvQT4KKworPFA+CitMdWEgaXMgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCis8QSBIUkVGPSJodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLmh0bWwiPk1JVCBsaWNlbnNlPC9BPgorcmVwcm9kdWNlZCBiZWxvdzsKK2l0IG1heSBiZSB1c2VkIGZvciBhbnkgcHVycG9zZSwgaW5jbHVkaW5nIGNvbW1lcmNpYWwgcHVycG9zZXMsCithdCBhYnNvbHV0ZWx5IG5vIGNvc3Qgd2l0aG91dCBoYXZpbmcgdG8gYXNrIHVzLgorCitUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IGlmIHlvdSBkbyB1c2UgTHVhLAordGhlbiB5b3Ugc2hvdWxkIGdpdmUgdXMgY3JlZGl0IGJ5IGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBzb21ld2hlcmUgaW4geW91ciBwcm9kdWN0IG9yIGl0cyBkb2N1bWVudGF0aW9uLgorCitGb3IgZGV0YWlscywgc2VlCis8QSBIUkVGPSJodHRwOi8vd3d3Lmx1YS5vcmcvbGljZW5zZS5odG1sIj50aGlzPC9BPi4KKworPEJMT0NLUVVPVEUgU1RZTEU9InBhZGRpbmctYm90dG9tOiAwZW0iPgorQ29weXJpZ2h0ICZjb3B5OyAxOTk0Jm5kYXNoOzIwMTMgTHVhLm9yZywgUFVDLVJpby4KKworPFA+CitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCis8UD4KK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworPFA+CitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorPC9CTE9DS1FVT1RFPgorPFA+CisKKzxIUj4KKzxTTUFMTCBDTEFTUz0iZm9vdGVyIj4KK0xhc3QgdXBkYXRlOgorU2F0IE5vdiAgOSAyMjozOToxNiBCUlNUIDIwMTMKKzwvU01BTEw+Cis8IS0tCitMYXN0IGNoYW5nZTogcmV2aXNlZCBmb3IgTHVhIDUuMi4zCistLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL2RvYy9zeXNsaW51eC5hc2MgYi9jb20zMi9sdWEvZG9jL3N5c2xpbnV4LmFzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjRjNTFmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL2RvYy9zeXNsaW51eC5hc2MKQEAgLTAsMCArMSwyOTIgQEAKK1N5c2xpbnV4IExVQSBVc2VyIEd1aWRlCis9PT09PT09PT09PT09PT09PT09PT09PQorTWFyY2VsIFJpdHRlciA8TWFyY2VsLlJpdHRlckBycnplLnVuaS1lcmxhbmdlbi5kZT4KKworSW52b2NhdGlvbgorLS0tLS0tLS0tLQorCitSdW5uaW5nICtsdWEuYzMyKyBvbmx5IHJlc3VsdHMgaW4gYW4gaW50ZXJhY3RpdmUgc2hlbGwuCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KK0tFUk5FTCBsdWEuYzMyCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworQnkgdXNpbmcgdGhlICtBUFBFTkQrIHBhcmFtZXRlciB5b3UgY2FuIHNwZWNpZnkgYSBsdWEKK3NjcmlwdCB0byBiZSBleGVjdXRlZDoKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorS0VSTkVMIGx1YS5jMzIKK0FQUEVORCAvdGVzdGl0Lmx1YQorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKK01vZHVsZXMKKy0tLS0tLS0KKworTW9kdWxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgbG9hZGVkIGludG8gdGhlIG5hbWVzcGFjZQorYmVmb3JlIHVzZSwgZm9yIGV4YW1wbGU6CisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KK3N5c2xpbnV4ID0gcmVxdWlyZSAoInN5c2xpbnV4IikKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCitTWVNMSU5VWAorfn5+fn5+fn4KKworLnN5c2xpbnV4LnZlcnNpb24oKQorCitSZXR1cm5zIHZlcnNpb24gc3RyaW5nCisKKy5zeXNsaW51eC5kZXJpdmF0aXZlKCkKKworUmV0dXJucyBydW5uaW5nIFN5c2xpbnV4J3MgZGVyaXZhdGl2ZSAoSVNPTElOVVgsIFBYRUxJTlVYIG9yIFNZU0xJTlVYKS4KK1NlZSBjb20zMi9sdWEvdGVzdC9zeXNsaW51eC1kZXJpdmF0aXZlLmx1YSBmb3IgYW4gZXhhbXBsZS4KKworLnN5c2xpbnV4LnNsZWVwKHMpCisKK1NsZWVwIGZvciArcysgc2Vjb25kcworCisuc3lzbGludXgubXNsZWVwKG1zKQorCitTbGVlcCBmb3IgK21zKyBtaWxsaXNlY29uZHMKKworLnJ1bl9jb21tYW5kKGNvbW1hbmQpCisKK0V4ZWN1dGUgc3lzbGludXggY29tbWFuZCBsaW5lICtjb21tYW5kKy4KKworX0V4YW1wbGVfOgorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisJc3lzbGludXgucnVuX2NvbW1hbmQoIm1lbWRpc2sgaW5pdHJkPS9kb3MvQklPUy9GU0MtUDc5MzUtMTA4LmltZyByYXciKQorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKKy5ydW5fZGVmYXVsdCgpCisKK0ZJWE1FCisKKy5sb2NhbF9ib290KCkKKworRklYTUUKKworLmZpbmFsX2NsZWFudXAoKQorCitGSVhNRQorCisuYm9vdF9saW51eChrZXJuZWwsIGNtZGxpbmUsIFttZW1fbGltaXRdLCBbdmlkZW9tb2RlXSkKKworRklYTUUKKworLnJ1bl9rZXJuZWxfaW1hZ2Uoa2VybmVsLCBjbWRsaW5lLCBpcGFwcGVuZF9mbGFncywgdHlwZSkKKworRklYTUUKKworLmxvYWRmaWxlKGZpbG5hbWUpCisKK0xvYWQgZmlsZSArZmlsZW5hbWUrICh2aWEgVEZUUCkKKworLmZpbGVzaXplKGZpbGUpCisKK1JldHVybiBzaXplIG9mICtmaWxlKyAobG9hZGVkIGJ5IGxvYWRmaWxlKCkpCisKKy5maWxlbmFtZShmaWxlKQorCitSZXR1cm4gbmFtZSBvZiArZmlsZSsgKGxvYWRlZCBieSBsb2FkZmlsZSgpKQorCisuaW4gaXRyYW1mc19pbml0KCkKKworUmV0dXJuIGVtcHR5IGluaXRyYW1mcyBvYmplY3QKKworLmluaXRyYW1mc19sb2FkX2FyY2hpdmUoaW5pdHJhbWZzLCBmaWxlbmFtZSkKKworTG9hZCBjb250ZW50cyBvZiArZmlsZW5hbWUrIGludG8gK2luaXRyYW1mcysuIEluaXRpYWxpemUKKytpbml0cmFtZnMrIHdpdGggaW5pdHJhbWZzX2luaXQoKSBiZWZvcmUgdXNlLgorCisuaW5pdHJhbWZzX2FkZF9maWxlKGluaXRyYW1mcywgZmlsZSkKKworQWRkcyArZmlsZSsgdG8gK2luaXRyYW1mcysuICtpbml0cmFtZnMrIG5lZWRzIHRvIGJlCitpbml0aWFsaXplZCwgK2ZpbGUrIGhhcyBiZWVuIGxvYWRlZCBieSBsb2FkZmlsZSgpLgorCitfRXhhbXBsZV86CisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwktLSBnZXQgbmljZSBvdXRwdXQKKwlwcmludGYgPSBmdW5jdGlvbihzLC4uLikKKwkgICAgICAgICAgIHJldHVybiBpby53cml0ZShzOmZvcm1hdCguLi4pKQorCSAgICAgICAgIGVuZCAtLSBmdW5jdGlvbgorCQorCWtlcm5lbCA9IHN5c2xpbnV4LmxvYWRmaWxlKCIvU3VTRS0xMS4xL3g4Nl82NC9saW51eCIpCisJCisJcHJpbnRmKCJGaWxlbmFtZS9zaXplOiAlcyAlZFxuIiwgc3lzbGludXguZmlsZW5hbWUoa2VybmVsKSwgc3lzbGludXguZmlsZXNpemUoa2VybmVsKSkKKwkKKwlpbml0cmQgPSBzeXNsaW51eC5sb2FkZmlsZSgiL1N1U0UtMTEuMS94ODZfNjQvaW5pdHJkIikKKwkKKwlwcmludGYoIkZpbGVuYW1lL3NpemU6ICVzICVkXG4iLCBzeXNsaW51eC5maWxlbmFtZShpbml0cmQpLCBzeXNsaW51eC5maWxlc2l6ZShpbml0cmQpKQorCQorCWluaXRyZCA9IHN5c2xpbnV4LmluaXRyYW1mc19pbml0KCkKKwlzeXNsaW51eC5pbml0cmFtZnNfbG9hZF9hcmNoaXZlKGluaXRyZCwgIi9TdVNFLTExLjEveDg2XzY0L2luaXRyZCIpOworCQorCXN5c2xpbnV4LmJvb3RfaXQoa2VybmVsLCBpbml0cmQsICJpbml0PS9iaW4vYmFzaCIpCisJCisJc3lzbGludXguc2xlZXAoMjApCisJCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworCisKK0RNSQorfn5+CisKKy5kbWlfc3VwcG9ydGVkKCkKKworUmV0dXJucyArdHJ1ZSsgaWYgRE1JIGlzIHN1cHBvcnRlZCBvbiBtYWNoaW5lLCArZmFsc2UrIG90aGVyd2lzZS4KKworLmRtaV9nZXR0YWJsZSgpCisKK1JldHVybnMgYSBsaXN0IGlmIGtleS12YWx1ZSBwYWlycy4gVGhlIGtleSBpcyBvbmUgb2YgdGhlIERNSSBwcm9wZXJ0eSBzdHJpbmdzOgorRklYTUUgbGlzdAorCitfRXhhbXBsZV86CisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwlpZiAoZG1pLnN1cHBvcnRlZCgpKSB0aGVuCisJCisJICBkbWl0YWJsZSA9IGRtaS5nZXR0YWJsZSgpCisJCisJICBmb3Igayx2IGluIHBhaXJzKGRtaXRhYmxlKSBkbworCSAgICBwcmludChrLCB2KQorCSAgZW5kCisJCisJICBwcmludChkbWl0YWJsZVsic3lzdGVtLm1hbnVmYWN0dXJlciJdKQorCSAgcHJpbnQoZG1pdGFibGVbInN5c3RlbS5wcm9kdWN0X25hbWUiXSkKKwkgIHByaW50KGRtaXRhYmxlWyJiaW9zLmJpb3NfcmV2aXNpb24iXSkKKwkKKwkgIGlmICggc3RyaW5nLm1hdGNoKGRtaXRhYmxlWyJzeXN0ZW0ucHJvZHVjdF9uYW1lIl0sICJFU1BSSU1PIFA3OTM1IikgKSB0aGVuCisJICAgIHByaW50KCJNYXRjaGVzIikKKwkgICAgc3lzbGludXgucnVuX2NvbW1hbmQoIm1lbWRpc2sgaW5pdHJkPS9kb3MvQklPUy9GU0MtUDc5MzUtMTA4LmltZyByYXciKQorCSAgZWxzZQorCSAgICBwcmludCgiRG9lcyBub3QgbWF0Y2giKQorCSAgICBzeXNsaW51eC5ydW5fY29tbWFuZCgibWVtZGlzayBpbml0cmQ9L2Rvcy9CSU9TL0ZTQy1QNzkzNS0xMDguaW1nIHJhdyIpCisJICBlbmQKKwkKKwllbmQKKworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKKworUENJCit+fn4KKworLnBjaV9nZXRpbmZvKCkKKworUmV0dXJuIGxpc3Qgb2YgdmFsdWUgcGFpcnMgKGRldmljZV9pbmRleCwgZGV2aWNlKSBvZiBhbGwgUENJIGRldmljZXMuCisKKy5wY2lfZ2V0aWRsaXN0KGZpbGVuYW1lKQorCitMb2FkIGEgdGFiIHNlcGFyYXRlZCBsaXN0IG9mIFBDSSBJRHMgYW5kIHRoZWlyIGRlc2NyaXB0aW9uLiAKK1NhbXBsZSBmaWxlcyBjYW4gYmUgZm91bmQgaGVyZTogaHR0cDovL3BjaWlkcy5zb3VyY2Vmb3JnZS5uZXQvCisKKworX0V4YW1wbGVfOgorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCistLSBnZXQgbmljZSBvdXRwdXQKK3ByaW50ZiA9IGZ1bmN0aW9uKHMsLi4uKQorICAgICAgICAgICByZXR1cm4gaW8ud3JpdGUoczpmb3JtYXQoLi4uKSkKKyAgICAgICAgIGVuZAorCistLSBnZXQgZGV2aWNlIGluZm8KK3BjaWluZm8gPSBwY2kuZ2V0aW5mbygpCisKKy0tIGdldCBwbGFpbiB0ZXh0IGRldmljZSBkZXNjcmlwdGlvbgorcGNpaWRzID0gcGNpLmdldGlkbGlzdCgiL3BjaS5pZHMiKQorCistLSBsaXN0IGFsbCBwY2kgYnVzc2VzCitmb3IgZGluZCxkZXZpY2UgaW4gcGFpcnMocGNpaW5mbykgZG8KKworICAtLSBzZWFyY2ggZm9yIGRldmljZSBkZXNjcmlwdGlvbgorICBzZWFyY2ggPSBzdHJpbmcuZm9ybWF0KCIlMDR4JTA0eCIsIGRldmljZVsndmVuZG9yJ10sIGRldmljZVsncHJvZHVjdCddKQorCisgIHByaW50ZigiICUwNHg6JTA0eDolMDR4OiUwNHggPSAiLCBkZXZpY2VbJ3ZlbmRvciddLCBkZXZpY2VbJ3Byb2R1Y3QnXSwKKwkJCWRldmljZVsnc3ViX3ZlbmRvciddLCBkZXZpY2VbJ3N1Yl9wcm9kdWN0J10pCisKKyAgaWYgKCBwY2lpZHNbc2VhcmNoXSApIHRoZW4KKyAgICAgICAgIHByaW50ZigiJXNcbiIsIHBjaWlkc1tzZWFyY2hdKQorICBlbHNlCisgICAgICAgICBwcmludGYoIlVua25vd25cbiIpCisgIGVuZAorZW5kCisKKy0tIHByaW50KHBjaWlkc1siODA4NiJdKQorLS0gcHJpbnQocGNpaWRzWyIxMDU0MzAwOSJdKQorLS0gcHJpbnQocGNpaWRzWyIwMDcwMDAwMyJdKQorLS0gcHJpbnQocGNpaWRzWyIwMDcwZTgxNyJdKQorLS0gcHJpbnQocGNpaWRzWyIxMDAyNDM3YTEwMDI0MzdhIl0pCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworCitWRVNBCit+fn5+CisKKy5nZXRtb2RlcygpCisKK1JldHVybiBsaXN0IG9mIGF2YWlsYWJsZSBWRVNBIG1vZGVzLgorCitfRXhhbXBsZV86CisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwktLSBnZXQgbmljZSBvdXRwdXQKKwlwcmludGYgPSBmdW5jdGlvbihzLC4uLikKKwkgICAgICAgICAgIHJldHVybiBpby53cml0ZShzOmZvcm1hdCguLi4pKQorCSAgICAgICAgIGVuZAorCQorCS0tIGxpc3QgYXZhaWxhYmxlIHZlc2EgbW9kZXMKKwktLSBvbmx5IG9uZSBzdXBwb3J0ZWQgcmlnaHQgbm93LCBub3Qgb2YgbXVjaCB1c2UKKwltb2RlcyA9IHZlc2EuZ2V0bW9kZXMoKQorCQorCWZvciBtaW5kLG1vZGUgaW4gcGFpcnMobW9kZXMpIGRvCisJICAgcHJpbnRmKCIlMDR4OiAlZHglZHglZFxuIiwgbW9kZVsnbW9kZSddLCBtb2RlWydocmVzJ10sIG1vZGVbJ3ZyZXMnXSwgbW9kZVsnYnBwJ10pCisJZW5kCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworCisuc2V0bW9kZSgpCisKK1NldCAob25seSBjdXJyZW50bHkgc3VwcG9ydGVkKSBWRVNBIG1vZGUuCisKKy5sb2FkX2JhY2tncm91bmQoZmlsZW5hbWUpCisKK0xvYWQgK2ZpbGVuYW1lKyBmcm9tIFRGVFAsIGFuZCB1c2UgaXQgYXMgYmFja2dyb3VuZCBpbWFnZS4KKworX0V4YW1wbGVfOgorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisJLS0gZ2V0IG5pY2Ugb3V0cHV0CisJcHJpbnRmID0gZnVuY3Rpb24ocywuLi4pCisJICAgICAgICAgICByZXR1cm4gaW8ud3JpdGUoczpmb3JtYXQoLi4uKSkKKwkgICAgICAgICBlbmQKKwkKKwktLSBsZXRzIGdvIHRvIGdyYXBoaWNzIGxhbmQKKwl2ZXNhLnNldG1vZGUoKQorCQorCXByaW50ZigiSGVsbG8gV29ybGQhIC0gVkVTQSBtb2RlIikKKwkKKwktLSBzb21lIHRleHQgdG8gZGlzcGxheSAidHlwaW5nIHN0eWxlIgorCXRleHRsaW5lPVtbCisJRnJvbSBzeXNsaW51eCBHU09DIDIwMDkgaG9tZSBwYWdlOgorCQorCUZpbmlzaCB0aGUgTHVhIGVuZ2luZQorCQorCVdlIGFscmVhZHkgaGF2ZSBhIEx1YSBpbnRlcnByZXRlciBpbnRlZ3JhdGVkIHdpdGggdGhlIFN5c2xpbnV4IGJ1aWxkLiBIb3dldmVyLCByaWdodCBub3cgaXQgaXMgbm90IHZlcnkgdXNlZnVsLiBXZSBuZWVkIHRvIGNyZWF0ZSBhIHNldCBvZiBiaW5kaW5ncyB0byB0aGUgU3lzbGludXggZnVuY3Rpb25hbGl0eSwgYW5kIGhhdmUgYW4gYXJyYXkgb2YgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMgc28gdXNlcnMgY2FuIHVzZSB0aGVtLgorCQorCVRoaXMgaXMgbm90IGEgZG9jdW1lbnRhdGlvbiBwcm9qZWN0LCBidXQgdGhlIGRvY3VtZW50YXRpb24gZGVsaXZlcmFibGUgd2lsbCBiZSBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvciB0aGlzIG9uZSwgc2luY2UgdGhlIGludGVuZGVkIHRhcmdldCBpcyBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMsIG5vdCBkZXZlbG9wZXJzLgorCV1dCisJCisJCisJLS0gZG8gZGlzcGxheSBsb29wCisJLS0ga2VlcCBpbiBtaW5kOiBiYWNrZ3JvdW5kIGNoYW5nZSB3aWxsIG5vdCBlcmFzZSB0ZXh0IQorCXdoaWxlICggdHJ1ZSApIGRvCisJCisJdmVzYS5sb2FkX2JhY2tncm91bmQoIi9iYWNrZ3JvdW5kMS5qcGciKQorCQorCXN5c2xpbnV4LnNsZWVwKDEpCisJCisJZm9yIGkgPSAxLCAjdGV4dGxpbmUgZG8KKwkgICAgbG9jYWwgYyA9IHRleHRsaW5lOnN1YihpLGkpCisJICAgIHByaW50ZigiJXMiLCBjKQorCSAgICBzeXNsaW51eC5tc2xlZXAoMjAwKQorCWVuZAorCQorCXN5c2xpbnV4LnNsZWVwKDEwKQorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9NYWtlZmlsZSBiL2NvbTMyL2x1YS9zcmMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhMTQxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvTWFrZWZpbGUKQEAgLTAsMCArMSw3NSBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyMjICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMjIEx1YSBNYWtlZmlsZQorIyMKKworVlBBVEggPSAkKFNSQykKK2luY2x1ZGUgJChNQUtFRElSKS9lbGYubWsKKworTE5YTElCUwkgICA9IAorCisjIFRlbXBvcmFyaWx5IGFsbG93IHdhcm5pbmdzIG5vdCBiZWluZyB0cmVhdGVkIGFzIGVycm9ycworI0dDQ1dBUk4JICArPSAtV25vLWVycm9yCisKK0NGTEFHUyAgICArPSAtRFNZU0xJTlVYCitNT0RVTEVTCSAgPSBsdWEuYzMyCitNT0RVTEVTICAgKz0gY3B1LmMzMgorTU9EVUxFUyAgICs9IGRoY3AuYzMyCitNT0RVTEVTICAgKz0gZG1pLmMzMgorTU9EVUxFUyAgICs9IGxmcy5jMzIKK01PRFVMRVMgICArPSBwY2kuYzMyCitNT0RVTEVTICAgKz0gc3lzbGludXguYzMyCitNT0RVTEVTICAgKz0gdmVzYS5jMzIKK01PRFVMRVMgICArPSBjbWVudS5jMzIKK1RFU1RGSUxFUyA9CisKK09CSlMJICA9IGx1YS5vCisKK0xJQkxVQSAgICA9IGxpYmx1YS5jMzIKKworTElCTFVBX09CSlMgOj0gbGFwaS5vIGxjb2RlLm8gbGN0eXBlLm8gbGRlYnVnLm8gbGRvLm8gbGR1bXAubyBsZnVuYy5vCitMSUJMVUFfT0JKUyArPSBsZ2MubyBsbGV4Lm8gbG1lbS5vIGxvYmplY3QubyBsb3Bjb2Rlcy5vIGxwYXJzZXIubworTElCTFVBX09CSlMgKz0gbHN0YXRlLm8gbHN0cmluZy5vIGx0YWJsZS5vIGx0bS5vIGx1bmR1bXAubyBsdm0ubyBsemlvLm8KKworTElCTFVBX09CSlMgKz0gbGF1eGxpYi5vIGxiYXNlbGliLm8gbGJpdGxpYi5vIGxjb3JvbGliLm8gbGRibGliLm8gbGlvbGliLm8KK0xJQkxVQV9PQkpTICs9IGxvc2xpYi5vIGxzdHJsaWIubyBsdGFibGliLm8gbG9hZGxpYi5vIGxpbml0Lm8KKworQ0ZMQUdTICs9IC1ETFVBX0FOU0kKKworYWxsOiAkKE1PRFVMRVMpICQoVEVTVEZJTEVTKQorCitsaWJsdWEuZWxmIDogJChMSUJMVUFfT0JKUykKKwkkKExEKSAkKExERkxBR1MpIC1zaGFyZWQgLXNvbmFtZSAkKHBhdHN1YnN0ICUuZWxmLCUuYzMyLCQoQEYpKSBcCisJCS1vICRAICReCisKK2x1YS5lbGYgOiAkKE9CSlMpICQoTElCTFVBKSAkKENfTElCUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICReCisKK2NtZW51Lm8gOiBDRkxBR1MgKz0gLUkkKGNvbTMyKS9jbWVudS9saWJtZW51CitjbWVudS5lbGYgOiAkKG9iamRpcikvY29tMzIvY21lbnUvbGlibWVudS9saWJtZW51LmMzMgorCit0aWR5IGRpc3Q6CisJcm0gLWYgKi5vICoubG8gKi5sc3QgKi5lbGYgLiouZCAqLnRtcAorCitjbGVhbjogdGlkeQorCXJtIC1mICoubG54CisKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICoubHNzICouYzMyICouY29tCisJcm0gLWYgKn4gXCMqCisKK2luc3RhbGw6CisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvY21lbnUuYyBiL2NvbTMyL2x1YS9zcmMvY21lbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjEyODYxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9jbWVudS5jCkBAIC0wLDAgKzEsOTAgQEAKKyNpbmNsdWRlICJjbWVudS5oIgorCisjaW5jbHVkZSAibHVhLmgiCisjaW5jbHVkZSAibGF1eGxpYi5oIgorI2luY2x1ZGUgImx1YWxpYi5oIgorCitzdGF0aWMgaW50IGxfaW5pdCAobHVhX1N0YXRlICpMKQoreworICBpbml0X21lbnVzeXN0ZW0gKGx1YUxfb3B0c3RyaW5nIChMLCAxLCBOVUxMKSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxfc2V0X3dpbmRvd19zaXplIChsdWFfU3RhdGUgKkwpCit7CisgIHNldF93aW5kb3dfc2l6ZSAobHVhTF9jaGVja2ludCAoTCwgMSksIGx1YUxfY2hlY2tpbnQgKEwsIDIpLAorICAgICAgICAgICAgICAgICAgIGx1YUxfY2hlY2tpbnQgKEwsIDMpLCBsdWFMX2NoZWNraW50IChMLCA0KSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxfYWRkX21lbnUgKGx1YV9TdGF0ZSAqTCkKK3sKKyAgbHVhX3B1c2hpbnRlZ2VyIChMLCBhZGRfbWVudSAobHVhTF9jaGVja3N0cmluZyAoTCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YUxfb3B0aW50IChMLCAyLCAtMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9hZGRfbmFtZWRfbWVudSAobHVhX1N0YXRlICpMKQoreworICBsdWFfcHVzaGludGVnZXIgKEwsIGFkZF9uYW1lZF9tZW51IChsdWFMX2NoZWNrc3RyaW5nIChMLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhTF9jaGVja3N0cmluZyAoTCwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YUxfb3B0aW50IChMLCAzLCAtMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9hZGRfaXRlbSAobHVhX1N0YXRlICpMKQoreworICBhZGRfaXRlbSAobHVhTF9jaGVja3N0cmluZyAoTCwgMSksIGx1YUxfY2hlY2tzdHJpbmcgKEwsIDIpLCBsdWFMX2NoZWNraW50IChMLCAzKSwKKyAgICAgICAgICAgIGx1YUxfb3B0c3RyaW5nIChMLCA0LCBOVUxMKSwgbHVhTF9vcHRpbnQgKEwsIDUsIDApKTsKKyAgcmV0dXJuIDA7IC8qIEZJWE1FIHJldHVybiBtZW51aXRlbSBmb3IgYWR2YW5jZWQgZnVuY3Rpb25zICovCit9CisKK3N0YXRpYyBpbnQgbF9hZGRfc2VwIChsdWFfU3RhdGUgKkwpCit7CisgIGFkZF9zZXAgKCk7CisgIHJldHVybiAwOyAvKiBGSVhNRSByZXR1cm4gbWVudWl0ZW0gZm9yIGFkdmFuY2VkIGZ1bmN0aW9ucyAqLworfQorCitzdGF0aWMgaW50IGxfZmluZF9tZW51X251bSAobHVhX1N0YXRlICpMKQoreworICBsdWFfcHVzaGludGVnZXIgKEwsIGZpbmRfbWVudV9udW0gKGx1YUxfY2hlY2tzdHJpbmcgKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxfc2hvd21lbnVzIChsdWFfU3RhdGUgKkwpCit7CisgIHRfbWVudWl0ZW0gKnJlcGx5ID0gc2hvd21lbnVzIChsdWFMX2NoZWNraW50IChMLCAxKSk7CisgIGlmICghcmVwbHkpIHJldHVybiAwOworICBsdWFfcHVzaGludGVnZXIgKEwsIHJlcGx5LT5hY3Rpb24pOworICBsdWFfcHVzaHN0cmluZyAoTCwgcmVwbHktPmRhdGEpOworICByZXR1cm4gMjsKK30KKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIG1lbnVsaWJbXSA9IHsKKyAgeyJpbml0IiwgbF9pbml0fSwKKyAgeyJzZXRfd2luZG93X3NpemUiLCBsX3NldF93aW5kb3dfc2l6ZX0sCisgIHsiYWRkX21lbnUiLCBsX2FkZF9tZW51fSwKKyAgeyJhZGRfbmFtZWRfbWVudSIsIGxfYWRkX25hbWVkX21lbnV9LAorICB7ImFkZF9pdGVtIiwgbF9hZGRfaXRlbX0sCisgIHsiYWRkX3NlcCIsIGxfYWRkX3NlcH0sCisgIHsiZmluZF9tZW51X251bSIsIGxfZmluZF9tZW51X251bX0sCisgIHsic2hvd21lbnVzIiwgbF9zaG93bWVudXN9LAorICB7TlVMTCwgTlVMTH0KK307CisKK0xVQUxJQl9BUEkgaW50IGx1YW9wZW5fY21lbnUgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld2xpYihMLCBtZW51bGliKTsKKyAgbHVhX25ld3RhYmxlIChMKTsKKyNkZWZpbmUgZXhwb3J0X29wdCh4KSBsdWFfcHVzaGludGVnZXIgKEwsIE9QVF8jI3gpOyBsdWFfc2V0ZmllbGQgKEwsIC0yLCAjeCk7CisgIGV4cG9ydF9vcHQgKElOQUNUSVZFKTsKKyAgZXhwb3J0X29wdCAoU1VCTUVOVSk7CisgIGV4cG9ydF9vcHQgKFJVTik7CisgIGV4cG9ydF9vcHQgKEVYSVRNRU5VKTsKKyAgZXhwb3J0X29wdCAoQ0hFQ0tCT1gpOworICBleHBvcnRfb3B0IChSQURJT01FTlUpOworICBleHBvcnRfb3B0IChTRVApOworICBleHBvcnRfb3B0IChJTlZJU0lCTEUpOworICBleHBvcnRfb3B0IChSQURJT0lURU0pOworICBsdWFfc2V0ZmllbGQgKEwsIC0yLCAiYWN0aW9uIik7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9jcHUuYyBiL2NvbTMyL2x1YS9zcmMvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4MjJjZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvY3B1LmMKQEAgLTAsMCArMSwxNTggQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsbHVhX2NwdSAgICAgICAvKiBEZWZpbmUgdGhlIGxpYnJhcnkgKi8KKworLyogSW5jbHVkZSB0aGUgTHVhIEFQSSBoZWFkZXIgZmlsZXMgKi8KKyNpbmNsdWRlImx1YS5oIgorI2luY2x1ZGUibGF1eGxpYi5oIgorI2luY2x1ZGUibHVhbGliLmgiCisjaW5jbHVkZSJjcHVpZC5oIgorCitzdGF0aWMgdm9pZCBhZGRfc3RyaW5nX2l0ZW0obHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICppdGVtLCBjb25zdCBjaGFyICp2YWx1ZV9zdHIpIHsKKyBsdWFfcHVzaHN0cmluZyhMLGl0ZW0pOworIGx1YV9wdXNoc3RyaW5nKEwsdmFsdWVfc3RyKTsKKyBsdWFfc2V0dGFibGUoTCwtMyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9pbnRfaXRlbShsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKml0ZW0sIGludCB2YWx1ZV9pbnQpIHsKKyBsdWFfcHVzaHN0cmluZyhMLGl0ZW0pOworIGx1YV9wdXNobnVtYmVyKEwsdmFsdWVfaW50KTsKKyBsdWFfc2V0dGFibGUoTCwtMyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9mbGFnKGx1YV9TdGF0ZSAqTCwgYm9vbCB2YWx1ZSwgY29uc3QgY2hhciAqdmFsdWVfc3RyKSB7CisgY2hhciBidWZmZXJbMzJdID0geyAwIH07Cisgc25wcmludGYoYnVmZmVyLHNpemVvZihidWZmZXIpLCAiZmxhZ3MuJXMiLHZhbHVlX3N0cik7CisgbHVhX3B1c2hzdHJpbmcoTCxidWZmZXIpOworLy8gcHJpbnRmKCIlcz0lZFxuIix2YWx1ZV9zdHIsdmFsdWUpOworCisgaWYgKHZhbHVlID09IHRydWUpIHsKKyAgbHVhX3B1c2hzdHJpbmcoTCwieWVzIik7CisgfSBlbHNlIHsKKyAgbHVhX3B1c2hzdHJpbmcoTCwibm8iKTsKKyB9CisKKyBsdWFfc2V0dGFibGUoTCwtMyk7Cit9CisKK3N0YXRpYyBpbnQgY3B1X2dldGZsYWdzKGx1YV9TdGF0ZSAqTCkKK3sKKyAgc19jcHUgbHVhX2NwdTsKKyAgCisgIGRldGVjdF9jcHUoJmx1YV9jcHUpOworCisgIGx1YV9uZXd0YWJsZShMKTsKKworICBhZGRfc3RyaW5nX2l0ZW0oTCwgInZlbmRvciIsIGx1YV9jcHUudmVuZG9yKTsKKyAgYWRkX3N0cmluZ19pdGVtKEwsICJtb2RlbCIsIGx1YV9jcHUubW9kZWwpOworICBhZGRfaW50X2l0ZW0oTCwgImNvcmVzIiwgbHVhX2NwdS5udW1fY29yZXMpOworICBhZGRfaW50X2l0ZW0oTCwgImwxX2luc3RydWN0aW9uX2NhY2hlIiwgbHVhX2NwdS5sMV9pbnN0cnVjdGlvbl9jYWNoZV9zaXplKTsKKyAgYWRkX2ludF9pdGVtKEwsICJsMV9kYXRhX2NhY2hlIiwgbHVhX2NwdS5sMV9kYXRhX2NhY2hlX3NpemUpOworICBhZGRfaW50X2l0ZW0oTCwgImwyX2NhY2hlIiwgbHVhX2NwdS5sMl9jYWNoZV9zaXplKTsKKyAgYWRkX2ludF9pdGVtKEwsICJmYW1pbHlfaWQiLCBsdWFfY3B1LmZhbWlseSk7CisgIGFkZF9pbnRfaXRlbShMLCAibW9kZWxfaWQiLCBsdWFfY3B1Lm1vZGVsX2lkKTsKKyAgYWRkX2ludF9pdGVtKEwsICJzdGVwcGluZyIsIGx1YV9jcHUuc3RlcHBpbmcpOworCisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuZnB1LCAiZnB1Iik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3Mudm1lLCAidm1lIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuZGUsICJkZSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBzZSwgInBzZSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnRzYywgInRzYyIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLm1zciwgIm1zciIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBhZSwgInBhZSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLm1jZSwgIm1jZSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmN4OCwgImN4OCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmFwaWMsICJhcGljIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3Muc2VwLCAic2VwIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MubXRyciwgIm10cnIiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5wZ2UsICJwZ2UiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5tY2EsICJtY2EiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5jbW92LCAiY21vdiIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBhdCwgInBhdCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBzZV8zNiwgInBzZV8zNiIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBzbiwgInBzbiIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmNsZmxzaCwgImNsZmxzaCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmR0cywgImR0cyIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmFjcGksICJhY3BpIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MubW14LCAibW14Iik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3Muc3NlLCAic3NlIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3Muc3NlMiwgInNzZTIiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5zcywgInNzIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuaHR0LCAiaHQiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5hY2MsICJhY2MiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5zeXNjYWxsLCAic3lzY2FsbCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLm1wLCAibXAiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5ueCwgIm54Iik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MubW14ZXh0LCAibW14ZXh0Iik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MubG0sICJsbSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLm5vd2V4dCwgIjNkbm93ZXh0Iik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3Mubm93LCAiM2Rub3chIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3Muc3ZtLCAic3ZtIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3Mudm14LCAidm14Iik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MucGJlLCAicGJlIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuZnhzcl9vcHQsICJmeHNyX29wdCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmdicGFnZXMsICJnYnBhZ2VzIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MucmR0c2NwLCAicmR0c2NwIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MucG5pLCAicG5pIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MucGNsbXVscWQsICJwY2xtdWxxZCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmR0ZXM2NCwgImR0ZXM2NCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnNteCwgInNteCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmVzdCwgImVzdCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnRtMiwgInRtMiIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnNzZTMsICJzc2UzIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuZm1hLCAiZm1hIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuY3gxNiwgImN4MTYiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy54dHByLCAieHRwciIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBkY20sICJwZGNtIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuZGNhLCAiZGNhIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MueG1tNF8xLCAieG1tNF8xIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MueG1tNF8yLCAieG1tNF8yIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MueDJhcGljLCAieDJhcGljIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MubW92YmUsICJtb3ZiZSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBvcGNudCwgInBvcGNudCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmFlcywgImFlcyIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnhzYXZlLCAieHNhdmUiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5vc3hzYXZlLCAib3N4c2F2ZSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmF2eCwgImF2eCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmh5cGVydmlzb3IsICJoeXBlcnZpc29yIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuYWNlMiwgImFjZTIiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5hY2UyX2VuLCAiYWNlMl9lbiIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBoZSwgInBoZSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBoZV9lbiwgInBoZV9lbiIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBtbSwgInBtbSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnBtbV9lbiwgInBtbV9lbiIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLmV4dGFwaWMsICJleHRhcGljIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuY3I4X2xlZ2FjeSwgImNyOF9sZWdhY3kiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5hYm0sICJhYm0iKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5zc2U0YSwgInNzZTRhIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MubWlzYWxpZ25zc2UsICJtaXNhbGlnbnNzZSIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLm5vd3ByZWZldGNoLCAiM2Rub3dwcmVmZXRjaCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLm9zdncsICJvc3Z3Iik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3MuaWJzLCAiaWJzIik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3Muc3NlNSwgInNzZTUiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5za2luaXQsICJza2luaXQiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy53ZHQsICJ3ZHQiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5pZGEsICJpZGEiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5hcmF0LCAiYXJhdCIpOworICBhZGRfZmxhZyhMLCBsdWFfY3B1LmZsYWdzLnRwcl9zaGFkb3csICJ0cHJfc2hhZG93Iik7CisgIGFkZF9mbGFnKEwsIGx1YV9jcHUuZmxhZ3Mudm5taSwgInZubWkiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5mbGV4cHJpb3JpdHksICJmbGV4cHJpb3JpdHkiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy5lcHQsICJlcHQiKTsKKyAgYWRkX2ZsYWcoTCwgbHVhX2NwdS5mbGFncy52cGlkLCAidnBpZCIpOworCisgIC8qIHJldHVybiBudW1iZXIgb2YgcmV0dXJuIHZhbHVlcyBvbiBzdGFjayAqLworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIGNwdWxpYltdID0geworICB7ImZsYWdzIiwgY3B1X2dldGZsYWdzfSwKKyAge05VTEwsIE5VTEx9Cit9OworCisKK0xVQUxJQl9BUEkgaW50IGx1YW9wZW5fY3B1KGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld2xpYihMLCBjcHVsaWIpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9kaGNwLmMgYi9jb20zMi9sdWEvc3JjL2RoY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGEzOTM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9kaGNwLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAxMSBUaW1vdGh5IEogR2xlYXNvbiA8dGltbWdsZWFzb25fYXRfZ21haWwuY29tPiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGRoY3AuYworICoKKyAqIEFkZHMgREhDUElORk8gZnVuY3Rpb25hbGl0eSB0byB0aGUgbHVhLmMzMiBiaW5hcnkKKyAqCisgKiBnZXR0YWJsZSgpIHJldHVybnMgYSB0YWJsZSBvZiB0aGUgQk9PVFAgbWVzc2FnZSBmaWVsZHMgcmV0dXJuZWQgYnkKKyAqIHRoZSBESENQIHNlcnZlciBmb3IgdXNlIGluIGEgTHVhIHB4ZWJvb3Qgc2NyaXB0CisgKiBTZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTU0MgorICoKKyAqCWx1YSBrZXkgdmFsdWUJCVJGQyBrZXkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICoJb3Bjb2RlCQkJb3AJIG1lc3NhZ2Ugb3Bjb2RlIAorICoJaGFyZHdhcmUudHlwZQkJaHR5cGUJIEhhcmR3YXJlIGFkZHJlc3MgdHlwZSAKKyAqCWhhcmR3YXJlLmxlbmd0aAkJaGxlbgkgSGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggCisgKglob3BzCQkJaG9wcwkgVXNlZCBieSByZWxheSBhZ2VudHMgCisgKgl0cmFuc2FjdGlvbi5pZAkJeGlkCSB0cmFuc2FjdGlvbiBpZCAKKyAqCWVsYXBzZWQuc2Vjb25kcwkJc2VjcwkgU2VjcyBlbGFwc2VkIHNpbmNlIGNsaWVudCBib290IAorICoJZmxhZ3MJCQlmbGFncwkgREhDUCBGbGFncyBmaWVsZCAKKyAqCWNsaWVudC5pcC5hZGRyCQljaWFkZHIJIGNsaWVudCBJUCBhZGRyIAorICoJeW91ci5pcC5hZGRyCQl5aWFkZHIJICdZb3VyJyBJUCBhZGRyLiAoZnJvbSBzZXJ2ZXIpIAorICoJc2VydmVyLmlwLmFkZHIJCXNpYWRkcgkgQm9vdCBzZXJ2ZXIgSVAgYWRkciAKKyAqCWdhdGV3YXkuaXAuYWRkcgkJZ2lhZGRyCSBSZWxheSBhZ2VudCBJUCBhZGRyIAorICoJY2xpZW50Lm1hYwkJY2hhZGRyCSBDbGllbnQgaGFyZHdhcmUgYWRkciAKKyAqCXNlcnZlci5ob3N0bmFtZQkJc25hbWUJIE9wdGwuIGJvb3Qgc2VydmVyIGhvc3RuYW1lIAorICogCWJvb3QuZmlsZQkJZmlsZQkgYm9vdCBmaWxlIG5hbWUgKGFzY2lpIHBhdGgpIAorICoJbWFnaWMuY29va2llCQljb29raWUJIE1hZ2ljIGNvb2tpZSAKKyAqCisgKiBnZXRvcHRpb25zKCkgcmV0dXJucyBhIHRhYmxlIG9mIHRoZSBESENQIE9wdGlvbnMgZmllbGQgb2YgdGhlIEJPT1RQCisgKiBtZXNzYWdlIHJldHVybmVkIGJ5IHRoZSBESENQIHNlcnZlciBmb3IgdXNlIGluIGEgTHVhIHB4ZWJvb3Qgc2NyaXB0LgorICogTWFueSBvZiB0aGUgb3B0aW9ucyBhcmUgcmV1cm5lZCBmb3JtYXR0ZWQgaW4gYXMgc3RyaW5ncyBpbiBhIHN0YW5kYXJkLAorICogcmVjb2duaXphYmxlIGZvcm1hdCwgc3VjaCBhcyBJUCBhZGRyZXNzZXMuCisgKgorICogMSwgMiwgYW5kIDQgYnl0ZSBudW1lcmljYWwgb3B0aW9ucyBhcmUgcmV0dXJuZWQgYXMgaW50ZWdlcnMuIAorICoKKyAqIE90aGVyIE9wdGlvbnMgd2l0aCBub24tc3RhbmRhcmQgZm9ybWF0cyBhcmUgcmV0dXJuZWQgYXMgc3RyaW5ncyBvZiB0aGUgCisgKiByYXcgYmluYXJ5IG51bWJlciB0aGF0IHdhcyByZXR1cm5lZCBieSB0aGUgREhDUCBzZXJ2ZXIgYW5kIG11c3QgYmUgZGVjb2RlZAorICogaW4gYSBMdWEgc2NyaXB0IAorICoKKyAqIFRoZSBPcHRpb25zIHRhYmxlIHJldHVybnMgdGhlIE9wdGlvbiBjb2RlIGFzIHRoZSBrZXkgZXhjZXB0IHdoZXJlIHRoZXJlCisgKiBhcmUgbXVsdGlwbGUgdmFsdWVzIHJldHVybmVkLiBJbiB0aG9zZSBjYXNlcywgYW4gZXh0cmEga2V5IGluY3JlbWVudCBudW1iZXIKKyAqIGlzIGFkZGVkIHRvIGFsbG93IGluZGl2aWR1YWwgYWNjZXNzIHRvIGVhY2ggT3B0aW9uIHZhbHVlLgorICogCisgKglsdWEga2V5IHZhbHVlCQl2YWx1ZSBOYW1lCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqCTEJCQlTdWJuZXQgTWFzaworICoJNi4xCQkJRE5TIFNlcnZlciBbZWxlbWVudCAxXQorICoJNi4yCQkJRE5TIFNlcnZlciBbZWxlbWVudCAyXQorICoJNi4zCQkJRE5TIFNlcnZlciBbZWxlbWVudCAzXQorICoJMjA5CQkJUFhFIENvbmZpZ3VyYXRpb24gRmlsZQorICoJMjEuMQkJCVBvbGljeSBGaWx0ZXIgW2VsZW1lbnQgMV0KKyAqCTIxLjIJCQlQb2xpY3kgRmlsdGVyIFtlbGVtZW50IDJdCisgKgkKKyAqIE9wdGlvbnMgdGhhdCBjYW4gaGF2ZSBhIGxpc3Qgb2YgdmFsdWVzLCBidXQgY29udGFpbiBvbmx5IG9uZSAobGlrZSBPcHRpb24gNikKKyAqIHdpbGwgbm90IHJldHVybiB3aXRoIC5zdWIga2V5IHZhbHVlcy4JCisgKgorICogVXNhZ2U6CisgICAgICAgICAgICB0ID0gZGhjcC5nZXR0YWJsZSgpCisKKyAgICAgICAgICAgIGZvciBrLHYgaW4gcGFpcnModCkgZG8KKyAgICAgICAgICAgICAgcHJpbnQoay4uIiA6ICIuLnYpCisgICAgICAgICAgICBlbmQKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJkaGNwLmgiCisjaW5jbHVkZSAibHVhLmgiCisjaW5jbHVkZSAibGF1eGxpYi5oIgorI2luY2x1ZGUgImx1YWxpYi5oIgorI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZS5oPgorCisjZGVmaW5lIFNUUl9CVUZfU0laRQkxMjkgLyogU2l6ZWQgdG8gYWNjb21kYXRlIEZpbGUgZmllbGQgaW4gQk9PVFAgbWVzc2FnZSAqLworCit2b2lkCitpcF9hZGRyZXNzX2xpc3QobHVhX1N0YXRlICpMLCB1aW50OF90KiB2YWx1ZSwgdWludDhfdCBsZW4sIHVpbnQ4X3Qgb3B0aW9uICkKK3sKKyAgc3RhdGljIGNoYXIJb3BfbmFtZVs2NF07CisgIHN0YXRpYyBjaGFyCW9wX3ZhbHVlWzI1NV07CisgIGludAkJbG9vcDsKKworICBsb29wID0gbGVuLzQ7CisKKyAgaWYgKCBsb29wID09IDEpIHsKKyAgICBzcHJpbnRmKG9wX25hbWUsICIldSIsIG9wdGlvbik7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgb3BfbmFtZSk7CisgICAgc3ByaW50ZihvcF92YWx1ZSwgIiV1LiV1LiV1LiV1IiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM10pOworICAgIGx1YV9wdXNoc3RyaW5nKEwsIG9wX3ZhbHVlKTsKKyAgICBsdWFfc2V0dGFibGUoTCwtMyk7CisgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBkb25lID0gMDsgZG9uZSA8IGxvb3A7IGRvbmUrKyl7CisJc3ByaW50ZihvcF9uYW1lLCAiJXUuJWQiLCBvcHRpb24sIGRvbmUrMSk7CisJbHVhX3B1c2hzdHJpbmcoTCwgb3BfbmFtZSk7CisJc3ByaW50ZihvcF92YWx1ZSwgIiV1LiV1LiV1LiV1IiwgdmFsdWVbMCsoZG9uZSo0KV0sIHZhbHVlWzErKGRvbmUqNCldLCB2YWx1ZVsyKyhkb25lKjQpXSwgdmFsdWVbMysoZG9uZSo0KV0pOworCWx1YV9wdXNoc3RyaW5nKEwsIG9wX3ZhbHVlKTsKKwlsdWFfc2V0dGFibGUoTCwtMyk7CisgICAgICB9CisgIH0KKworfQorCitzdGF0aWMgaW50IGRoY3BfZ2V0b3B0aW9ucyhsdWFfU3RhdGUgKkwpCit7CisgIHZvaWQqCQlkaGNwZGF0YSA9IDA7CisgIGRoY3BfdCoJZGhjcCA9IDA7CisgIHNpemVfdAlkaGNwbGVuID0gMDsKKworICAvKiBBcHBlbmQgdGhlIERIQ1AgaW5mbyAqLworICBpZiAocHhlX2dldF9jYWNoZWRfaW5mbyhQWEVOVl9QQUNLRVRfVFlQRV9ESENQX0FDSywKKyAgICAmZGhjcGRhdGEsICZkaGNwbGVuKSkKKyAgeworICAgIHJldHVybiAwOworICB9CisKKyAgZGhjcCA9IChkaGNwX3QqKWRoY3BkYXRhOworCisgIGx1YV9uZXd0YWJsZShMKTsKKworICBpbnQJCWRvbmUgPSAwOworICB1aW50OF90KglwdHIgPSAodWludDhfdCopJmRoY3AtPm9wdGlvbnM7CisgIHVpbnQ4X3QJbGVuOworICB1aW50OF90CW9wdGlvbjsKKyAgdWludDhfdCoJdmFsdWU7CisgIHN0YXRpYyBjaGFyCW9wX25hbWVbNjRdOworCisgIGRvIHsKKyAgICAgIG9wdGlvbiA9ICpwdHIrKzsKKyAgICAgIGxlbiA9ICpwdHIrKzsKKyAgICAgIHZhbHVlID0gcHRyOworICAgICAgcHRyICs9IGxlbjsKKyAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisvLyBJUCBBZGRyZXNzIGZvcm1hdHRlZCBsaXN0cywgaW5jbHVkaW5nIHNpbmdsZXMKKwljYXNlIDE6CisJY2FzZSAzOgorCWNhc2UgNDoKKwljYXNlIDU6CisJY2FzZSA2OgorCWNhc2UgNzoKKwljYXNlIDg6CisJY2FzZSA5OgorCWNhc2UgMTA6CisJY2FzZSAxMToKKwljYXNlIDE2OgorCWNhc2UgMjE6IC8qIFBvbGljeSBGaWx0ZXJzIC0gYWRkcmVzcy9tYXNrICovCisJY2FzZSAyODoKKwljYXNlIDMyOgorCWNhc2UgMzM6IC8qIFN0YXRpYyByb3V0ZXMgLSBkZXN0aW5hdGlvbi9yb3V0ZXIgKi8KKwljYXNlIDQxOgorCWNhc2UgNDI6CisJY2FzZSA0NDoKKwljYXNlIDQ1OgorCWNhc2UgNDc6CisJY2FzZSA0ODoKKwljYXNlIDQ5OgorCWNhc2UgNTA6CisJY2FzZSA1MToKKwljYXNlIDU0OgorCWNhc2UgNjU6CisJY2FzZSA2ODoKKwljYXNlIDY5OgorCWNhc2UgNzA6CisJY2FzZSA3MToKKwljYXNlIDcyOgorCWNhc2UgNzM6CisJY2FzZSA3NDoKKwljYXNlIDc1OgorCWNhc2UgNzY6CisJICBpcF9hZGRyZXNzX2xpc3QoTCwgdmFsdWUsIGxlbiwgb3B0aW9uKTsKKyAgICAgICAgICBicmVhazsKKy8vIDRieXRlIG9wdGlvbnMgLSBudW1lcmljYWwKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDI0OgorICAgICAgICBjYXNlIDM1OgorICAgICAgICBjYXNlIDM4OgorICAgICAgICBjYXNlIDU4OgorICAgICAgICBjYXNlIDU5OgorICAgICAgICBjYXNlIDIxMToKKwkgIHNwcmludGYob3BfbmFtZSwgIiV1Iiwgb3B0aW9uKTsKKwkgIGx1YV9wdXNoc3RyaW5nKEwsIG9wX25hbWUpOworCSAgbHVhX3B1c2hpbnRlZ2VyKEwsIG50b2hsKCoobG9uZyopdmFsdWUpKTsKKwkgIGx1YV9zZXR0YWJsZShMLC0zKTsKKyAgICAgICAgICBicmVhazsKKy8vIDJieXRlIG9wdGlvbnMgLW51bWVyaWNhbAorICAgICAgICBjYXNlIDEzOgorICAgICAgICBjYXNlIDIyOgorICAgICAgICBjYXNlIDI2OgorICAgICAgICBjYXNlIDU3OgorCSAgc3ByaW50ZihvcF9uYW1lLCAiJXUiLCBvcHRpb24pOworCSAgbHVhX3B1c2hzdHJpbmcoTCwgb3BfbmFtZSk7CisJICBsdWFfcHVzaGludGVnZXIoTCwgbnRvaHMoKihzaG9ydCopdmFsdWUpKTsKKwkgIGx1YV9zZXR0YWJsZShMLC0zKTsKKyAgICAgICAgICBicmVhazsKKy8vIDFieXRlIG9wdGlvbnMgLSBudW1lcmljYWwKKyAgICAgICAgY2FzZSAxOToKKyAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgY2FzZSAyOToKKyAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgY2FzZSAzMToKKyAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgY2FzZSAzOToKKyAgICAgICAgY2FzZSA0NjoKKyAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgY2FzZSA1MzoKKwkgIHNwcmludGYob3BfbmFtZSwgIiV1Iiwgb3B0aW9uKTsKKwkgIGx1YV9wdXNoc3RyaW5nKEwsIG9wX25hbWUpOworCSAgbHVhX3B1c2hpbnRlZ2VyKEwsICp2YWx1ZSk7CisJICBsdWFfc2V0dGFibGUoTCwtMyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjU1OiAKKyAgICAgICAgICBkb25lID0gMTsKKwkgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgc3ByaW50ZihvcF9uYW1lLCAiJXUiLCBvcHRpb24pOworCSAgbHVhX3B1c2hzdHJpbmcoTCwgb3BfbmFtZSk7CisJICBsdWFfcHVzaGxzdHJpbmcoTCwgKGNvbnN0IGNoYXIqKXZhbHVlLCBsZW4pOworCSAgbHVhX3NldHRhYmxlKEwsLTMpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSB3aGlsZSAoIWRvbmUpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CWRoY3BfZ2V0dGFibGUobHVhX1N0YXRlICpMKQoreworICB2b2lkKgkJZGhjcGRhdGEgPSAwOworICBkaGNwX3QqCWRoY3AgPSAwOworICBzaXplX3QJZGhjcGxlbiA9IDA7CisgIHN0YXRpYyBjaGFyCWRoY3BfYXJnW1NUUl9CVUZfU0laRV07CisKKyAgLyogQXBwZW5kIHRoZSBESENQIGluZm8gKi8KKyAgaWYgKHB4ZV9nZXRfY2FjaGVkX2luZm8oUFhFTlZfUEFDS0VUX1RZUEVfREhDUF9BQ0ssCisgICAgJmRoY3BkYXRhLCAmZGhjcGxlbikpCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGRoY3AgPSAoZGhjcF90KilkaGNwZGF0YTsKKworCisgIGx1YV9uZXd0YWJsZShMKTsKKworICBsdWFfcHVzaHN0cmluZyhMLCAib3Bjb2RlIik7CisgIGx1YV9wdXNoaW50ZWdlcihMLCBkaGNwLT5vcCk7CisgIGx1YV9zZXR0YWJsZShMLC0zKTsKKworICBsdWFfcHVzaHN0cmluZyhMLCAiaGFyZHdhcmUudHlwZSIpOworICBsdWFfcHVzaGludGVnZXIoTCwgZGhjcC0+aHR5cGUpOworICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgbHVhX3B1c2hzdHJpbmcoTCwgImhhcmR3YXJlLmxlbmd0aCIpOworICBsdWFfcHVzaGludGVnZXIoTCwgZGhjcC0+aGxlbik7CisgIGx1YV9zZXR0YWJsZShMLC0zKTsKKworICBsdWFfcHVzaHN0cmluZyhMLCAiaG9wcyIpOworICBsdWFfcHVzaGludGVnZXIoTCwgZGhjcC0+aG9wcyk7CisgIGx1YV9zZXR0YWJsZShMLC0zKTsKKworICBsdWFfcHVzaHN0cmluZyhMLCAidHJhbnNhY3Rpb24uaWQiKTsKKyAgbHVhX3B1c2hpbnRlZ2VyKEwsIG50b2hsKGRoY3AtPnhpZCkpOworICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgbHVhX3B1c2hzdHJpbmcoTCwgImVsYXBzZWQuc2Vjb25kcyIpOworICBsdWFfcHVzaGludGVnZXIoTCwgbnRvaHMoZGhjcC0+c2VjcykpOworICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgbHVhX3B1c2hzdHJpbmcoTCwgImZsYWdzIik7CisgIGx1YV9wdXNoaW50ZWdlcihMLCBudG9ocyhkaGNwLT5mbGFncykpOworICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgc3ByaW50ZihkaGNwX2FyZywgIiV1LiV1LiV1LiV1IiwgZGhjcC0+Y2lhZGRyWzBdLCBkaGNwLT5jaWFkZHJbMV0sIGRoY3AtPmNpYWRkclsyXSwgZGhjcC0+Y2lhZGRyWzNdKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgImNsaWVudC5pcC5hZGRyIik7CisgIGx1YV9wdXNoc3RyaW5nKEwsIGRoY3BfYXJnKTsKKyAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgIHNwcmludGYoZGhjcF9hcmcsICIldS4ldS4ldS4ldSIsIGRoY3AtPnlpYWRkclswXSwgZGhjcC0+eWlhZGRyWzFdLCBkaGNwLT55aWFkZHJbMl0sIGRoY3AtPnlpYWRkclszXSk7CisgIGx1YV9wdXNoc3RyaW5nKEwsICJ5b3VyLmlwLmFkZHIiKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZGhjcF9hcmcpOworICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgc3ByaW50ZihkaGNwX2FyZywgIiV1LiV1LiV1LiV1IiwgZGhjcC0+c2lhZGRyWzBdLCBkaGNwLT5zaWFkZHJbMV0sIGRoY3AtPnNpYWRkclsyXSwgZGhjcC0+c2lhZGRyWzNdKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgInNlcnZlci5pcC5hZGRyIik7CisgIGx1YV9wdXNoc3RyaW5nKEwsIGRoY3BfYXJnKTsKKyAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgIHNwcmludGYoZGhjcF9hcmcsICIldS4ldS4ldS4ldSIsIGRoY3AtPmdpYWRkclswXSwgZGhjcC0+Z2lhZGRyWzFdLCBkaGNwLT5naWFkZHJbMl0sIGRoY3AtPmdpYWRkclszXSk7CisgIGx1YV9wdXNoc3RyaW5nKEwsICJnYXRld2F5LmlwLmFkZHIiKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZGhjcF9hcmcpOworICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgc3ByaW50ZihkaGNwX2FyZywgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKyAgICAgICAgICAgICAgICAgICAgZGhjcC0+Y2hhZGRyWzBdLCBkaGNwLT5jaGFkZHJbMV0sIGRoY3AtPmNoYWRkclsyXSwKKyAgICAgICAgICAgICAgICAgICAgZGhjcC0+Y2hhZGRyWzNdLCBkaGNwLT5jaGFkZHJbNF0sIGRoY3AtPmNoYWRkcls1XSk7CisgIGx1YV9wdXNoc3RyaW5nKEwsICJjbGllbnQubWFjIik7CisgIGx1YV9wdXNoc3RyaW5nKEwsIGRoY3BfYXJnKTsKKyAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgIHNucHJpbnRmKGRoY3BfYXJnLCBTVFJfQlVGX1NJWkUsICIlcyIsIGRoY3AtPnNuYW1lKTsKKyAgZGhjcF9hcmdbU1RSX0JVRl9TSVpFLTFdID0gMDsgCS8qIEd1YXJhbnRlZSBmb3IgbHVhX3B1c2hzdHJpbmcgdGhhdCBkaGNwX2FyZyBpcyAwIHRlcm1pbmF0ZWQgLyovCisgIGx1YV9wdXNoc3RyaW5nKEwsICJzZXJ2ZXIuaG9zdG5hbWUiKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZGhjcF9hcmcpOworICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgc25wcmludGYoZGhjcF9hcmcsIFNUUl9CVUZfU0laRSwgIiVzIiwgZGhjcC0+ZmlsZSk7CisgIGRoY3BfYXJnW1NUUl9CVUZfU0laRS0xXSA9IDA7IAkvKiBHdWFyYW50ZWUgZm9yIGx1YV9wdXNoc3RyaW5nIHRoYXQgZGhjcF9hcmcgaXMgMCB0ZXJtaW5hdGVkIC8qLworICBsdWFfcHVzaHN0cmluZyhMLCAiYm9vdC5maWxlIik7CisgIGx1YV9wdXNoc3RyaW5nKEwsIGRoY3BfYXJnKTsKKyAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgIHNwcmludGYoZGhjcF9hcmcsICIldS4ldS4ldS4ldSIsIGRoY3AtPmNvb2tpZVswXSwgZGhjcC0+Y29va2llWzFdLCBkaGNwLT5jb29raWVbMl0sIGRoY3AtPmNvb2tpZVszXSk7CisgIGx1YV9wdXNoc3RyaW5nKEwsICJtYWdpYy5jb29raWUiKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZGhjcF9hcmcpOworICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBkaGNwbGliW10gPSB7CisgIHsiZ2V0dGFibGUiLCBkaGNwX2dldHRhYmxlfSwKKyAgeyJnZXRvcHRpb25zIiwgZGhjcF9nZXRvcHRpb25zfSwKKyAge05VTEwsIE5VTEx9Cit9OworCitMVUFMSUJfQVBJIGludCBsdWFvcGVuX2RoY3AgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld2xpYihMLCBkaGNwbGliKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2RoY3AuaCBiL2NvbTMyL2x1YS9zcmMvZGhjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOThjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2RoY3AuaApAQCAtMCwwICsxLDQ5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNyBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMTEgVGltb3RoeSBKIEdsZWFzb24gPHRpbW1nbGVhc29uX2F0X2dtYWlsLmNvbT4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgZGhjcCB7CisgIHVpbnQ4X3QJb3A7CQkJLyogbWVzc2FnZSBvcGNvZGUgKi8KKyAgdWludDhfdAlodHlwZTsJCQkvKiBIYXJkd2FyZSBhZGRyZXNzIHR5cGUgKi8KKyAgdWludDhfdAlobGVuOwkJCS8qIEhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisgIHVpbnQ4X3QJaG9wczsJCQkvKiBVc2VkIGJ5IHJlbGF5IGFnZW50cyAqLworICB1aW50MzJfdAl4aWQ7CQkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKyAgdWludDE2X3QJc2VjczsJCQkvKiBTZWNzIGVsYXBzZWQgc2luY2UgY2xpZW50IGJvb3QgKi8KKyAgdWludDE2X3QJZmxhZ3M7CQkJLyogREhDUCBGbGFncyBmaWVsZCAqLworICB1aW50OF90CWNpYWRkcls0XTsJCS8qIGNsaWVudCBJUCBhZGRyICovCisgIHVpbnQ4X3QJeWlhZGRyWzRdOwkJLyogJ1lvdXInIElQIGFkZHIuIChmcm9tIHNlcnZlcikgKi8KKyAgdWludDhfdAlzaWFkZHJbNF07CQkvKiBCb290IHNlcnZlciBJUCBhZGRyICovCisgIHVpbnQ4X3QJZ2lhZGRyWzRdOwkJLyogUmVsYXkgYWdlbnQgSVAgYWRkciAqLworICB1aW50OF90CWNoYWRkclsxNl07CQkvKiBDbGllbnQgaGFyZHdhcmUgYWRkciAqLworICB1aW50OF90CXNuYW1lWzY0XTsJCS8qIE9wdGwuIGJvb3Qgc2VydmVyIGhvc3RuYW1lICovCisgIHVpbnQ4X3QJZmlsZVsxMjhdOwkJLyogYm9vdCBmaWxlIG5hbWUgKGFzY2lpIHBhdGgpICovCisgIHVpbnQ4X3QJY29va2llWzRdOwkJLyogTWFnaWMgY29va2llICovCisgIHVpbnQ4X3QJb3B0aW9uc1sxMDIwXTsJCS8qIE9wdGlvbnMgKi8KK30gZGhjcF90OworCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2RtaS5jIGIvY29tMzIvbHVhL3NyYy9kbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDc1NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9kbWkuYwpAQCAtMCwwICsxLDUzNSBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGxkbWlsaWJfYyAgICAgICAvKiBEZWZpbmUgdGhlIGxpYnJhcnkgKi8KKworLyogSW5jbHVkZSB0aGUgTHVhIEFQSSBoZWFkZXIgZmlsZXMgKi8KKyNpbmNsdWRlICJsdWEuaCIKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisjaW5jbHVkZSAiZG1pL2RtaS5oIgorCitzdGF0aWMgdm9pZCBhZGRfc3RyaW5nX2l0ZW0obHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICppdGVtLCBjb25zdCBjaGFyICp2YWx1ZV9zdHIpIHsKKyBsdWFfcHVzaHN0cmluZyhMLGl0ZW0pOworIGx1YV9wdXNoc3RyaW5nKEwsdmFsdWVfc3RyKTsKKyBsdWFfc2V0dGFibGUoTCwtMyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9pbnRfaXRlbShsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKml0ZW0sIGludCB2YWx1ZV9pbnQpIHsKKyBsdWFfcHVzaHN0cmluZyhMLGl0ZW0pOworIGx1YV9wdXNobnVtYmVyKEwsdmFsdWVfaW50KTsKKyBsdWFfc2V0dGFibGUoTCwtMyk7Cit9CisKK3R5cGVkZWYgaW50ICgqdGFibGVfZm4pKGx1YV9TdGF0ZSosIHNfZG1pKik7CisKKy8qIEFkZCBhIEx1YV9TdHJpbmcgZW50cnkgdG8gdGhlIHRhYmxlIG9uIHN0YWNrCisgICB4eHhfUCBpcyB0aGUgcG9pdGVyIHZlcnNpb24gKGkuZS4sIHBCYXNlIGlzIGEgcG9pbnRlcikKKyAgIHh4eF9TIGlzIHRoZSBzdGFpYyB2ZXJzaW9uIChpLmUuLCBCYXNlIGlzIHRoZSBzdHJ1Y3QpCisqLworI2RlZmluZSBMVUFfQUREX1NUUl9QKHBMdWFfc3RhdGUsIHBCYXNlLCBGaWVsZCkgXAorICBhZGRfc3RyaW5nX2l0ZW0ocEx1YV9zdGF0ZSwgI0ZpZWxkLCBwQmFzZS0+RmllbGQpOworI2RlZmluZSBMVUFfQUREX1NUUl9TKHBMdWFfc3RhdGUsIEJhc2UsIEZpZWxkKSBcCisgIGFkZF9zdHJpbmdfaXRlbShwTHVhX3N0YXRlLCAjRmllbGQsIEJhc2UuRmllbGQpOworCisvKiBBZGQgYSBMdWFfTnVtYmVyIGVudHJ5IHRvIHRoZSB0YWJsZSBvbiBzdGFjaworICAgeHh4X1AgaXMgdGhlIHBvaXRlciB2ZXJzaW9uIChpLmUuLCBwQmFzZSBpcyBhIHBvaW50ZXIpCisgICB4eHhfUyBpcyB0aGUgc3RhaWMgdmVyc2lvbiAoaS5lLiwgQmFzZSBpcyB0aGUgc3RydWN0KQorKi8KKyNkZWZpbmUgTFVBX0FERF9OVU1fUChwTHVhX3N0YXRlLCBwQmFzZSwgRmllbGQpIFwKKyAgYWRkX2ludF9pdGVtKHBMdWFfc3RhdGUsICNGaWVsZCwgcEJhc2UtPkZpZWxkKTsKKyNkZWZpbmUgTFVBX0FERF9OVU1fUyhwTHVhX3N0YXRlLCBCYXNlLCBGaWVsZCkgXAorICBhZGRfaW50X2l0ZW0ocEx1YV9zdGF0ZSwgI0ZpZWxkLCBCYXNlLkZpZWxkKTsKKworLyogQWRkIGEgc3ViLURNSSB0YWJsZSB0byB0aGUgdGFibGUgb24gc3RhY2sKKyAgIEFsbCAoKnRhYmxlX2ZuKSgpIGhhdmUgdG8gYmUgbmFtZWQgYXMgZ2V0Xzx0YWJlbF9uYW1lPl90YWJsZSgpIGZvciB0aGlzCisgICBtYWNybyB0byB3b3JrLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBiaW9zIHN1YnRhYmxlLCB0aGUgdGFibGVfZm4gaXMKKyAgIGdldF9iaW9zX3RhYmxlKCkgYW5kIHRoZSBzdWJ0YWJsZSBuYW1lIGlzICJiaW9zIi4KKyAgIEFsbCAoKnRhYmxlX2ZuKSgpIGhhdmUgdG8gcmV0dXJuIDEgaWYgYSBzdWJ0YWJsZSBpcyBjcmVhdGVkIG9uIHRoZSBzdGFjaworICAgb3IgMCBpZiB0aGUgc3VidGFibGUgaXMgbm90IGNyZWF0ZWQgKG5vIGNvcnJlc3BvbmRpbmcgZGltIHN1YnRhYmxlIGZvdW5kKS4KKyovCisjZGVmaW5lIExVQV9BRERfVEFCTEUocEx1YV9zdGF0ZSwgcERtaSwgdGJfbmFtZSkgXAorICBhZGRfZG1pX3N1Yl90YWJsZShwTHVhX3N0YXRlLCBwRG1pLCAjdGJfbmFtZSwgZ2V0XyAjIyB0Yl9uYW1lICMjIF90YWJsZSk7CisKKworc3RhdGljIHZvaWQgYWRkX2RtaV9zdWJfdGFibGUobHVhX1N0YXRlICpMLCBzX2RtaSAqZG1pX3B0ciwgY2hhciAqdGFibGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2ZuIGdldF90YWJsZV9mbikKK3sKKyAgaWYgKGdldF90YWJsZV9mbihMLCBkbWlfcHRyKSkgeyAgLyogb25seSBhZGRpbmcgaXQgd2hlbiBpdCBpcyB0aGVyZSAqLworICAgIGx1YV9wdXNoc3RyaW5nKEwsIHRhYmxlX25hbWUpOworICAgIGx1YV9pbnNlcnQoTCwgLTIpOworICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKyAgfQorfQorCisKK3ZvaWQgZ2V0X2Jvb2xfdGFibGUobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzdHJfdGFibGVbXSwgaW50IG5fZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmJvb2xfdGFibGUpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbl9lbGVtOyBpKyspIHsKKyAgICBpZiAoIXN0cl90YWJsZVtpXSB8fCAhKnN0cl90YWJsZVtpXSkgIC8qIGF2aW9kIE5VTEwvZW1wdHkgc3RyaW5nICovCisgICAgICBjb250aW51ZTsKKworICAgIGx1YV9wdXNoc3RyaW5nKEwsIHN0cl90YWJsZVtpXSk7CisgICAgbHVhX3B1c2hib29sZWFuKEwsIGJvb2xfdGFibGVbaV0pOworICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKyAgfQorfQorCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBETUkgc3VidGFibGVzCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBnZXRfYmlvc190YWJsZShsdWFfU3RhdGUgKkwsIHNfZG1pICpkbWlfcHRyKQoreworICBzX2Jpb3MgKmJpb3MgPSAmZG1pX3B0ci0+YmlvczsKKworICBpZiAoIWJpb3MtPmZpbGxlZCkKKyAgICByZXR1cm4gMDsKKyAgLyogYmlvcyAqLworICBsdWFfbmV3dGFibGUoTCk7CisgIExVQV9BRERfU1RSX1AoTCwgYmlvcywgdmVuZG9yKQorICBMVUFfQUREX1NUUl9QKEwsIGJpb3MsIHZlcnNpb24pCisgIExVQV9BRERfU1RSX1AoTCwgYmlvcywgcmVsZWFzZV9kYXRlKQorICBMVUFfQUREX1NUUl9QKEwsIGJpb3MsIGJpb3NfcmV2aXNpb24pCisgIExVQV9BRERfU1RSX1AoTCwgYmlvcywgZmlybXdhcmVfcmV2aXNpb24pCisgIExVQV9BRERfTlVNX1AoTCwgYmlvcywgYWRkcmVzcykKKyAgTFVBX0FERF9OVU1fUChMLCBiaW9zLCBydW50aW1lX3NpemUpCisgIExVQV9BRERfU1RSX1AoTCwgYmlvcywgcnVudGltZV9zaXplX3VuaXQpCisgIExVQV9BRERfTlVNX1AoTCwgYmlvcywgcm9tX3NpemUpCisgIExVQV9BRERfU1RSX1AoTCwgYmlvcywgcm9tX3NpemVfdW5pdCkKKworICAvKiBiaW9zIGNoYXJhY3RlcmlzdGljcyAqLworICBsdWFfcHVzaHN0cmluZyhMLCAiY2hhcnMiKTsKKyAgbHVhX25ld3RhYmxlKEwpOworICBnZXRfYm9vbF90YWJsZShMLCBiaW9zX2NoYXJhY19zdHJpbmdzLAorICAgICAgICAgICAgICAgICBzaXplb2Yoc19jaGFyYWN0ZXJpc3RpY3MpL3NpemVvZihib29sKSwKKyAgICAgICAgICAgICAgICAgKGJvb2wgKikoJmJpb3MtPmNoYXJhY3RlcmlzdGljcykpOworICBnZXRfYm9vbF90YWJsZShMLCBiaW9zX2NoYXJhY194MV9zdHJpbmdzLAorICAgICAgICAgICAgICAgICBzaXplb2Yoc19jaGFyYWN0ZXJpc3RpY3NfeDEpL3NpemVvZihib29sKSwKKyAgICAgICAgICAgICAgICAgKGJvb2wgKikoJmJpb3MtPmNoYXJhY3RlcmlzdGljc194MSkpOworICBnZXRfYm9vbF90YWJsZShMLCBiaW9zX2NoYXJhY194Ml9zdHJpbmdzLAorICAgICAgICAgICAgICAgICBzaXplb2Yoc19jaGFyYWN0ZXJpc3RpY3NfeDIpL3NpemVvZihib29sKSwKKyAgICAgICAgICAgICAgICAgKGJvb2wgKikoJmJpb3MtPmNoYXJhY3RlcmlzdGljc194MikpOworICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBnZXRfc3lzdGVtX3RhYmxlKGx1YV9TdGF0ZSAqTCwgc19kbWkgKmRtaV9wdHIpCit7CisgIHNfc3lzdGVtICpzeXN0ZW0gPSAmZG1pX3B0ci0+c3lzdGVtOworCisgIGlmICghc3lzdGVtLT5maWxsZWQpCisgICAgcmV0dXJuIDA7CisgIC8qIHN5c3RlbSAqLworICBsdWFfbmV3dGFibGUoTCk7CisgIExVQV9BRERfU1RSX1AoTCwgc3lzdGVtLCBtYW51ZmFjdHVyZXIpCisgIExVQV9BRERfU1RSX1AoTCwgc3lzdGVtLCBwcm9kdWN0X25hbWUpCisgIExVQV9BRERfU1RSX1AoTCwgc3lzdGVtLCB2ZXJzaW9uKQorICBMVUFfQUREX1NUUl9QKEwsIHN5c3RlbSwgc2VyaWFsKQorICBMVUFfQUREX1NUUl9QKEwsIHN5c3RlbSwgdXVpZCkKKyAgTFVBX0FERF9TVFJfUChMLCBzeXN0ZW0sIHdha2V1cF90eXBlKQorICBMVUFfQUREX1NUUl9QKEwsIHN5c3RlbSwgc2t1X251bWJlcikKKyAgTFVBX0FERF9TVFJfUChMLCBzeXN0ZW0sIGZhbWlseSkKKyAgTFVBX0FERF9TVFJfUChMLCBzeXN0ZW0sIHN5c3RlbV9ib290X3N0YXR1cykKKyAgTFVBX0FERF9TVFJfUChMLCBzeXN0ZW0sIGNvbmZpZ3VyYXRpb25fb3B0aW9ucykKKworICAvKiBzeXN0ZW0gcmVzZXQgKi8KKyAgaWYgKHN5c3RlbS0+c3lzdGVtX3Jlc2V0LmZpbGxlZCkgeworICAgIGx1YV9wdXNoc3RyaW5nKEwsICJyZXNldCIpOworICAgIGx1YV9uZXd0YWJsZShMKTsKKyAgICBMVUFfQUREX05VTV9TKEwsIHN5c3RlbS0+c3lzdGVtX3Jlc2V0LCBzdGF0dXMpCisgICAgTFVBX0FERF9OVU1fUyhMLCBzeXN0ZW0tPnN5c3RlbV9yZXNldCwgd2F0Y2hkb2cpCisgICAgTFVBX0FERF9TVFJfUyhMLCBzeXN0ZW0tPnN5c3RlbV9yZXNldCwgYm9vdF9vcHRpb24pCisgICAgTFVBX0FERF9TVFJfUyhMLCBzeXN0ZW0tPnN5c3RlbV9yZXNldCwgYm9vdF9vcHRpb25fb25fbGltaXQpCisJICBMVUFfQUREX1NUUl9TKEwsIHN5c3RlbS0+c3lzdGVtX3Jlc2V0LCByZXNldF9jb3VudCkKKwkgIExVQV9BRERfU1RSX1MoTCwgc3lzdGVtLT5zeXN0ZW1fcmVzZXQsIHJlc2V0X2xpbWl0KQorCSAgTFVBX0FERF9TVFJfUyhMLCBzeXN0ZW0tPnN5c3RlbV9yZXNldCwgdGltZXJfaW50ZXJ2YWwpCisJICBMVUFfQUREX1NUUl9TKEwsIHN5c3RlbS0+c3lzdGVtX3Jlc2V0LCB0aW1lb3V0KQorICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKyAgfQorCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZ2V0X2Jhc2VfYm9hcmRfdGFibGUobHVhX1N0YXRlICpMLCBzX2RtaSAqZG1pX3B0cikKK3sKKyAgc19iYXNlX2JvYXJkICpiYXNlX2JvYXJkID0gJmRtaV9wdHItPmJhc2VfYm9hcmQ7CisgIGludCBuX2RldiA9IHNpemVvZihiYXNlX2JvYXJkLT5kZXZpY2VzX2luZm9ybWF0aW9uKSAvCisgICAgICAgICAgICAgIHNpemVvZihiYXNlX2JvYXJkLT5kZXZpY2VzX2luZm9ybWF0aW9uWzBdKTsKKyAgaW50IGksIGosIGhhc19kZXY7CisKKyAgaWYgKCFiYXNlX2JvYXJkLT5maWxsZWQpCisgICAgcmV0dXJuIDA7CisgIC8qIGJhc2VfYm9hcmQgKi8KKyAgbHVhX25ld3RhYmxlKEwpOworICBMVUFfQUREX1NUUl9QKEwsIGJhc2VfYm9hcmQsIG1hbnVmYWN0dXJlcikKKyAgTFVBX0FERF9TVFJfUChMLCBiYXNlX2JvYXJkLCBwcm9kdWN0X25hbWUpCisgIExVQV9BRERfU1RSX1AoTCwgYmFzZV9ib2FyZCwgdmVyc2lvbikKKyAgTFVBX0FERF9TVFJfUChMLCBiYXNlX2JvYXJkLCBzZXJpYWwpCisgIExVQV9BRERfU1RSX1AoTCwgYmFzZV9ib2FyZCwgYXNzZXRfdGFnKQorICBMVUFfQUREX1NUUl9QKEwsIGJhc2VfYm9hcmQsIGxvY2F0aW9uKQorICBMVUFfQUREX1NUUl9QKEwsIGJhc2VfYm9hcmQsIHR5cGUpCisKKyAgLyogYmFzZSBib2FyZCBmZWF0dXJlcyAqLworICBsdWFfcHVzaHN0cmluZyhMLCAiZmVhdHVyZXMiKTsKKyAgbHVhX25ld3RhYmxlKEwpOworICBnZXRfYm9vbF90YWJsZShMLCBiYXNlX2JvYXJkX2ZlYXR1cmVzX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgIHNpemVvZihzX2Jhc2VfYm9hcmRfZmVhdHVyZXMpL3NpemVvZihib29sKSwKKyAgICAgICAgICAgICAgICAgKGJvb2wgKikoJmJhc2VfYm9hcmQtPmZlYXR1cmVzKSk7CisgIGx1YV9zZXR0YWJsZShMLC0zKTsKKworICAvKiBvbi1ib2FyZCBkZXZpY2VzICovCisgIGZvciAoaGFzX2RldiA9IDAsIGkgPSAwOyBpIDwgbl9kZXY7IGkrKykKKyAgICBpZiAoKmJhc2VfYm9hcmQtPmRldmljZXNfaW5mb3JtYXRpb25baV0udHlwZSkKKyAgICAgIGhhc19kZXYrKzsKKworICBpZiAoaGFzX2RldikgeworICAgIGx1YV9wdXNoc3RyaW5nKEwsICJkZXZpY2VzIik7CisgICAgbHVhX25ld3RhYmxlKEwpOworICAgIGZvciAoaSA9IDAsIGogPSAxOyBpIDwgbl9kZXY7IGkrKykgeworICAgICAgaWYgKCEqYmFzZV9ib2FyZC0+ZGV2aWNlc19pbmZvcm1hdGlvbltpXS50eXBlKSAgLyogZW1wdHkgZGV2aWNlICovCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBsdWFfcHVzaGludGVnZXIoTCwgaisrKTsKKyAgICAgIGx1YV9uZXd0YWJsZShMKTsKKyAgICAgIExVQV9BRERfU1RSX1MoTCwgYmFzZV9ib2FyZC0+ZGV2aWNlc19pbmZvcm1hdGlvbltpXSwgdHlwZSkKKyAgICAgIExVQV9BRERfU1RSX1MoTCwgYmFzZV9ib2FyZC0+ZGV2aWNlc19pbmZvcm1hdGlvbltpXSwgZGVzY3JpcHRpb24pCisgICAgICBMVUFfQUREX05VTV9TKEwsIGJhc2VfYm9hcmQtPmRldmljZXNfaW5mb3JtYXRpb25baV0sIHN0YXR1cykKKyAgICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKyAgICB9CisgICAgbHVhX3NldHRhYmxlKEwsLTMpOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBnZXRfY2hhc3Npc190YWJsZShsdWFfU3RhdGUgKkwsIHNfZG1pICpkbWlfcHRyKQoreworICBzX2NoYXNzaXMgKmNoYXNzaXMgPSAmZG1pX3B0ci0+Y2hhc3NpczsKKworICBpZiAoIWNoYXNzaXMtPmZpbGxlZCkKKyAgICByZXR1cm4gMDsKKyAgLyogY2hhc3NpcyAqLworICBsdWFfbmV3dGFibGUoTCk7CisgIExVQV9BRERfU1RSX1AoTCwgY2hhc3NpcywgbWFudWZhY3R1cmVyKQorICBMVUFfQUREX1NUUl9QKEwsIGNoYXNzaXMsIHR5cGUpCisgIExVQV9BRERfU1RSX1AoTCwgY2hhc3NpcywgbG9jaykKKyAgTFVBX0FERF9TVFJfUChMLCBjaGFzc2lzLCB2ZXJzaW9uKQorICBMVUFfQUREX1NUUl9QKEwsIGNoYXNzaXMsIHNlcmlhbCkKKyAgTFVBX0FERF9TVFJfUChMLCBjaGFzc2lzLCBhc3NldF90YWcpCisgIExVQV9BRERfU1RSX1AoTCwgY2hhc3NpcywgYm9vdF91cF9zdGF0ZSkKKyAgTFVBX0FERF9TVFJfUChMLCBjaGFzc2lzLCBwb3dlcl9zdXBwbHlfc3RhdGUpCisgIExVQV9BRERfU1RSX1AoTCwgY2hhc3NpcywgdGhlcm1hbF9zdGF0ZSkKKyAgTFVBX0FERF9TVFJfUChMLCBjaGFzc2lzLCBzZWN1cml0eV9zdGF0dXMpCisgIExVQV9BRERfU1RSX1AoTCwgY2hhc3Npcywgb2VtX2luZm9ybWF0aW9uKQorICBMVUFfQUREX05VTV9QKEwsIGNoYXNzaXMsIGhlaWdodCkKKyAgTFVBX0FERF9OVU1fUChMLCBjaGFzc2lzLCBuYl9wb3dlcl9jb3JkcykKKworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGdldF9wcm9jZXNzb3JfdGFibGUobHVhX1N0YXRlICpMLCBzX2RtaSAqZG1pX3B0cikKK3sKKyAgc19wcm9jZXNzb3IgKnByb2Nlc3NvciA9ICZkbWlfcHRyLT5wcm9jZXNzb3I7CisgIHNfc2lnbmF0dXJlICpzaWduYXR1cmUgPSAmcHJvY2Vzc29yLT5zaWduYXR1cmU7CisKKyAgaWYgKCFwcm9jZXNzb3ItPmZpbGxlZCkKKyAgICByZXR1cm4gMDsKKyAgLyogcHJvY2Vzc29yICovCisgIGx1YV9uZXd0YWJsZShMKTsKKyAgTFVBX0FERF9TVFJfUChMLCBwcm9jZXNzb3IsIHNvY2tldF9kZXNpZ25hdGlvbikKKyAgTFVBX0FERF9TVFJfUChMLCBwcm9jZXNzb3IsIHR5cGUpCisgIExVQV9BRERfU1RSX1AoTCwgcHJvY2Vzc29yLCBmYW1pbHkpCisgIExVQV9BRERfU1RSX1AoTCwgcHJvY2Vzc29yLCBtYW51ZmFjdHVyZXIpCisgIExVQV9BRERfU1RSX1AoTCwgcHJvY2Vzc29yLCB2ZXJzaW9uKQorICBMVUFfQUREX05VTV9QKEwsIHByb2Nlc3NvciwgZXh0ZXJuYWxfY2xvY2spCisgIExVQV9BRERfTlVNX1AoTCwgcHJvY2Vzc29yLCBtYXhfc3BlZWQpCisgIExVQV9BRERfTlVNX1AoTCwgcHJvY2Vzc29yLCBjdXJyZW50X3NwZWVkKQorICBMVUFfQUREX05VTV9QKEwsIHByb2Nlc3Nvciwgdm9sdGFnZV9tdikKKyAgTFVBX0FERF9TVFJfUChMLCBwcm9jZXNzb3IsIHN0YXR1cykKKyAgTFVBX0FERF9TVFJfUChMLCBwcm9jZXNzb3IsIHVwZ3JhZGUpCisgIExVQV9BRERfU1RSX1AoTCwgcHJvY2Vzc29yLCBjYWNoZTEpCisgIExVQV9BRERfU1RSX1AoTCwgcHJvY2Vzc29yLCBjYWNoZTIpCisgIExVQV9BRERfU1RSX1AoTCwgcHJvY2Vzc29yLCBjYWNoZTMpCisgIExVQV9BRERfU1RSX1AoTCwgcHJvY2Vzc29yLCBzZXJpYWwpCisgIExVQV9BRERfU1RSX1AoTCwgcHJvY2Vzc29yLCBwYXJ0X251bWJlcikKKyAgTFVBX0FERF9TVFJfUChMLCBwcm9jZXNzb3IsIGlkKQorICBMVUFfQUREX05VTV9QKEwsIHByb2Nlc3NvciwgY29yZV9jb3VudCkKKyAgTFVBX0FERF9OVU1fUChMLCBwcm9jZXNzb3IsIGNvcmVfZW5hYmxlZCkKKyAgTFVBX0FERF9OVU1fUChMLCBwcm9jZXNzb3IsIHRocmVhZF9jb3VudCkKKworICAvKiBwcm9jZXNzb3Igc2lnbmF0dXJlICovCisgIGx1YV9wdXNoc3RyaW5nKEwsICJzaWduYXR1cmUiKTsKKyAgbHVhX25ld3RhYmxlKEwpOworICBMVUFfQUREX05VTV9QKEwsIHNpZ25hdHVyZSwgdHlwZSkKKyAgTFVBX0FERF9OVU1fUChMLCBzaWduYXR1cmUsIGZhbWlseSkKKyAgTFVBX0FERF9OVU1fUChMLCBzaWduYXR1cmUsIG1vZGVsKQorICBMVUFfQUREX05VTV9QKEwsIHNpZ25hdHVyZSwgc3RlcHBpbmcpCisgIExVQV9BRERfTlVNX1AoTCwgc2lnbmF0dXJlLCBtaW5vcl9zdGVwcGluZykKKyAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgIC8qIHByb2Nlc3NvciBmbGFncyAqLworICBsdWFfcHVzaHN0cmluZyhMLCAiZmxhZ3MiKTsKKyAgbHVhX25ld3RhYmxlKEwpOworICBnZXRfYm9vbF90YWJsZShMLCBjcHVfZmxhZ3Nfc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHNfZG1pX2NwdV9mbGFncykvc2l6ZW9mKGJvb2wpLAorICAgICAgICAgICAgICAgICAoYm9vbCAqKSgmcHJvY2Vzc29yLT5jcHVfZmxhZ3MpKTsKKyAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZ2V0X2JhdHRlcnlfdGFibGUobHVhX1N0YXRlICpMLCBzX2RtaSAqZG1pX3B0cikKK3sKKyAgc19iYXR0ZXJ5ICpiYXR0ZXJ5ID0gJmRtaV9wdHItPmJhdHRlcnk7CisKKyAgaWYgKCFiYXR0ZXJ5LT5maWxsZWQpCisgICAgcmV0dXJuIDA7CisgIC8qIGJhdHRlcnkgKi8KKyAgbHVhX25ld3RhYmxlKEwpOworICBMVUFfQUREX1NUUl9QKEwsIGJhdHRlcnksIGxvY2F0aW9uKQorICBMVUFfQUREX1NUUl9QKEwsIGJhdHRlcnksIG1hbnVmYWN0dXJlcikKKyAgTFVBX0FERF9TVFJfUChMLCBiYXR0ZXJ5LCBtYW51ZmFjdHVyZV9kYXRlKQorICBMVUFfQUREX1NUUl9QKEwsIGJhdHRlcnksIHNlcmlhbCkKKyAgTFVBX0FERF9TVFJfUChMLCBiYXR0ZXJ5LCBuYW1lKQorICBMVUFfQUREX1NUUl9QKEwsIGJhdHRlcnksIGNoZW1pc3RyeSkKKyAgTFVBX0FERF9TVFJfUChMLCBiYXR0ZXJ5LCBkZXNpZ25fY2FwYWNpdHkpCisgIExVQV9BRERfU1RSX1AoTCwgYmF0dGVyeSwgZGVzaWduX3ZvbHRhZ2UpCisgIExVQV9BRERfU1RSX1AoTCwgYmF0dGVyeSwgc2JkcykKKyAgTFVBX0FERF9TVFJfUChMLCBiYXR0ZXJ5LCBzYmRzX3NlcmlhbCkKKyAgTFVBX0FERF9TVFJfUChMLCBiYXR0ZXJ5LCBtYXhpbXVtX2Vycm9yKQorICBMVUFfQUREX1NUUl9QKEwsIGJhdHRlcnksIHNiZHNfbWFudWZhY3R1cmVfZGF0ZSkKKyAgTFVBX0FERF9TVFJfUChMLCBiYXR0ZXJ5LCBzYmRzX2NoZW1pc3RyeSkKKyAgTFVBX0FERF9TVFJfUChMLCBiYXR0ZXJ5LCBvZW1faW5mbykKKworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGdldF9tZW1vcnlfdGFibGUobHVhX1N0YXRlICpMLCBzX2RtaSAqZG1pX3B0cikKK3sKKyAgc19tZW1vcnkgKm1lbW9yeSA9IGRtaV9wdHItPm1lbW9yeTsKKyAgaW50IGksIGosIG5fbWVtID0gZG1pX3B0ci0+bWVtb3J5X2NvdW50OworCisgIGlmIChuX21lbSA8PSAwKSAgLyogIG5vIG1lbW9yeSBpbmZvICovCisgICAgcmV0dXJuIDA7CisKKyAgLyogbWVtb3J5ICovCisgIGx1YV9uZXd0YWJsZShMKTsKKyAgZm9yIChqID0gMSwgaSA9IDA7IGkgPCBuX21lbTsgaSsrKSB7CisgICAgaWYgKCFtZW1vcnlbaV0uZmlsbGVkKQorICAgICAgY29udGludWU7CisKKyAgICBsdWFfcHVzaGludGVnZXIoTCwgaisrKTsKKyAgICBsdWFfbmV3dGFibGUoTCk7CisgICAgTFVBX0FERF9TVFJfUyhMLCBtZW1vcnlbaV0sIG1hbnVmYWN0dXJlcikKKyAgICBMVUFfQUREX1NUUl9TKEwsIG1lbW9yeVtpXSwgZXJyb3IpCisgICAgTFVBX0FERF9TVFJfUyhMLCBtZW1vcnlbaV0sIHRvdGFsX3dpZHRoKQorICAgIExVQV9BRERfU1RSX1MoTCwgbWVtb3J5W2ldLCBkYXRhX3dpZHRoKQorICAgIExVQV9BRERfU1RSX1MoTCwgbWVtb3J5W2ldLCBzaXplKQorICAgIExVQV9BRERfU1RSX1MoTCwgbWVtb3J5W2ldLCBmb3JtX2ZhY3RvcikKKyAgICBMVUFfQUREX1NUUl9TKEwsIG1lbW9yeVtpXSwgZGV2aWNlX3NldCkKKyAgICBMVUFfQUREX1NUUl9TKEwsIG1lbW9yeVtpXSwgZGV2aWNlX2xvY2F0b3IpCisgICAgTFVBX0FERF9TVFJfUyhMLCBtZW1vcnlbaV0sIGJhbmtfbG9jYXRvcikKKyAgICBMVUFfQUREX1NUUl9TKEwsIG1lbW9yeVtpXSwgdHlwZSkKKyAgICBMVUFfQUREX1NUUl9TKEwsIG1lbW9yeVtpXSwgdHlwZV9kZXRhaWwpCisgICAgTFVBX0FERF9TVFJfUyhMLCBtZW1vcnlbaV0sIHNwZWVkKQorICAgIExVQV9BRERfU1RSX1MoTCwgbWVtb3J5W2ldLCBzZXJpYWwpCisgICAgTFVBX0FERF9TVFJfUyhMLCBtZW1vcnlbaV0sIGFzc2V0X3RhZykKKyAgICBMVUFfQUREX1NUUl9TKEwsIG1lbW9yeVtpXSwgcGFydF9udW1iZXIpCisgICAgbHVhX3NldHRhYmxlKEwsLTMpOworICB9CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZ2V0X21lbW9yeV9tb2R1bGVfdGFibGUobHVhX1N0YXRlICpMLCBzX2RtaSAqZG1pX3B0cikKK3sKKyAgc19tZW1vcnlfbW9kdWxlICptZW1vcnlfbW9kdWxlID0gZG1pX3B0ci0+bWVtb3J5X21vZHVsZTsKKyAgaW50IGksIGosIG5fbWVtID0gZG1pX3B0ci0+bWVtb3J5X21vZHVsZV9jb3VudDsKKworICBpZiAobl9tZW0gPD0gMCkgIC8qICBubyBtZW1vcnkgbW9kdWxlIGluZm8gKi8KKyAgICByZXR1cm4gMDsKKworICAvKiBtZW1vcnkgbW9kdWxlICovCisgIGx1YV9uZXd0YWJsZShMKTsKKyAgZm9yIChqID0gMSwgaSA9IDA7IGkgPCBuX21lbTsgaSsrKSB7CisgICAgaWYgKCFtZW1vcnlfbW9kdWxlW2ldLmZpbGxlZCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIGorKyk7CisgICAgbHVhX25ld3RhYmxlKEwpOworICAgIExVQV9BRERfU1RSX1MoTCwgbWVtb3J5X21vZHVsZVtpXSwgc29ja2V0X2Rlc2lnbmF0aW9uKQorICAgIExVQV9BRERfU1RSX1MoTCwgbWVtb3J5X21vZHVsZVtpXSwgYmFua19jb25uZWN0aW9ucykKKyAgICBMVUFfQUREX1NUUl9TKEwsIG1lbW9yeV9tb2R1bGVbaV0sIHNwZWVkKQorICAgIExVQV9BRERfU1RSX1MoTCwgbWVtb3J5X21vZHVsZVtpXSwgdHlwZSkKKyAgICBMVUFfQUREX1NUUl9TKEwsIG1lbW9yeV9tb2R1bGVbaV0sIGluc3RhbGxlZF9zaXplKQorICAgIExVQV9BRERfU1RSX1MoTCwgbWVtb3J5X21vZHVsZVtpXSwgZW5hYmxlZF9zaXplKQorICAgIExVQV9BRERfU1RSX1MoTCwgbWVtb3J5X21vZHVsZVtpXSwgZXJyb3Jfc3RhdHVzKQorICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGdldF9jYWNoZV90YWJsZShsdWFfU3RhdGUgKkwsIHNfZG1pICpkbWlfcHRyKQoreworICBzX2NhY2hlICpjYWNoZSA9IGRtaV9wdHItPmNhY2hlOworICBpbnQgaSwgbl9jYWNoZSA9IGRtaV9wdHItPmNhY2hlX2NvdW50OworCisgIGlmIChuX2NhY2hlIDw9IDApICAvKiAgbm8gY2FjaGUgaW5mbyAqLworICAgIHJldHVybiAwOworCisgIC8qIG1lbW9yeSAqLworICBsdWFfbmV3dGFibGUoTCk7CisgIGZvciAoaSA9IDA7IGkgPCBuX2NhY2hlOyBpKyspIHsKKyAgICBsdWFfcHVzaGludGVnZXIoTCwgaSArIDEpOworICAgIGx1YV9uZXd0YWJsZShMKTsKKyAgICBMVUFfQUREX1NUUl9TKEwsIGNhY2hlW2ldLCBzb2NrZXRfZGVzaWduYXRpb24pCisgICAgTFVBX0FERF9TVFJfUyhMLCBjYWNoZVtpXSwgY29uZmlndXJhdGlvbikKKyAgICBMVUFfQUREX1NUUl9TKEwsIGNhY2hlW2ldLCBtb2RlKQorICAgIExVQV9BRERfU1RSX1MoTCwgY2FjaGVbaV0sIGxvY2F0aW9uKQorICAgIExVQV9BRERfTlVNX1MoTCwgY2FjaGVbaV0sIGluc3RhbGxlZF9zaXplKQorICAgIExVQV9BRERfTlVNX1MoTCwgY2FjaGVbaV0sIG1heF9zaXplKQorICAgIExVQV9BRERfU1RSX1MoTCwgY2FjaGVbaV0sIHN1cHBvcnRlZF9zcmFtX3R5cGVzKQorICAgIExVQV9BRERfU1RSX1MoTCwgY2FjaGVbaV0sIGluc3RhbGxlZF9zcmFtX3R5cGVzKQorICAgIExVQV9BRERfTlVNX1MoTCwgY2FjaGVbaV0sIHNwZWVkKQorICAgIExVQV9BRERfU1RSX1MoTCwgY2FjaGVbaV0sIGVycm9yX2NvcnJlY3Rpb25fdHlwZSkKKyAgICBMVUFfQUREX1NUUl9TKEwsIGNhY2hlW2ldLCBzeXN0ZW1fdHlwZSkKKyAgICBMVUFfQUREX1NUUl9TKEwsIGNhY2hlW2ldLCBhc3NvY2lhdGl2aXR5KQorICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGdldF9oYXJkd2FyZV9zZWN1cml0eV90YWJsZShsdWFfU3RhdGUgKkwsIHNfZG1pICpkbWlfcHRyKQoreworICBpZiAoIWRtaV9wdHItPmhhcmR3YXJlX3NlY3VyaXR5LmZpbGxlZCkKKyAgICByZXR1cm4gMDsKKyAgLyogaGFyZHdhcmVfc2VjdXJpdHkgKi8KKyAgbHVhX25ld3RhYmxlKEwpOworICBMVUFfQUREX1NUUl9TKEwsIGRtaV9wdHItPmhhcmR3YXJlX3NlY3VyaXR5LCBwb3dlcl9vbl9wYXNzd2Rfc3RhdHVzKQorCUxVQV9BRERfU1RSX1MoTCwgZG1pX3B0ci0+aGFyZHdhcmVfc2VjdXJpdHksIGtleWJvYXJkX3Bhc3N3ZF9zdGF0dXMpCisJTFVBX0FERF9TVFJfUyhMLCBkbWlfcHRyLT5oYXJkd2FyZV9zZWN1cml0eSwgYWRtaW5pc3RyYXRvcl9wYXNzd2Rfc3RhdHVzKQorCUxVQV9BRERfU1RSX1MoTCwgZG1pX3B0ci0+aGFyZHdhcmVfc2VjdXJpdHksIGZyb250X3BhbmVsX3Jlc2V0X3N0YXR1cykKKworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGdldF9kbWlfaW5mb190YWJsZShsdWFfU3RhdGUgKkwsIHNfZG1pICpkbWlfcHRyKQoreworICBkbWlfdGFibGUgKmRtaXRhYmxlID0gJmRtaV9wdHItPmRtaXRhYmxlOworCisgIC8qIGRtaSBpbmZvICovCisgIGx1YV9uZXd0YWJsZShMKTsKKyAgTFVBX0FERF9OVU1fUChMLCBkbWl0YWJsZSwgbnVtKQorICBMVUFfQUREX05VTV9QKEwsIGRtaXRhYmxlLCBsZW4pCisgIExVQV9BRERfTlVNX1AoTCwgZG1pdGFibGUsIHZlcikKKyAgTFVBX0FERF9OVU1fUChMLCBkbWl0YWJsZSwgYmFzZSkKKyAgTFVBX0FERF9OVU1fUChMLCBkbWl0YWJsZSwgbWFqb3JfdmVyc2lvbikKKyAgTFVBX0FERF9OVU1fUChMLCBkbWl0YWJsZSwgbWlub3JfdmVyc2lvbikKKworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGdldF9pcG1pX3RhYmxlKGx1YV9TdGF0ZSAqTCwgc19kbWkgKmRtaV9wdHIpCit7CisgIHNfaXBtaSAqaXBtaSA9ICZkbWlfcHRyLT5pcG1pOworCisgIGlmICghaXBtaS0+ZmlsbGVkKQorICAgIHJldHVybiAwOworICAvKiBpcG1pICovCisgIGx1YV9uZXd0YWJsZShMKTsKKyAgTFVBX0FERF9TVFJfUChMLCBpcG1pLCBpbnRlcmZhY2VfdHlwZSkKKyAgTFVBX0FERF9OVU1fUChMLCBpcG1pLCBtYWpvcl9zcGVjaWZpY2F0aW9uX3ZlcnNpb24pCisgIExVQV9BRERfTlVNX1AoTCwgaXBtaSwgbWlub3Jfc3BlY2lmaWNhdGlvbl92ZXJzaW9uKQorICBMVUFfQUREX05VTV9QKEwsIGlwbWksIEkyQ19zbGF2ZV9hZGRyZXNzKQorICBMVUFfQUREX05VTV9QKEwsIGlwbWksIG52X2FkZHJlc3MpCisgIExVQV9BRERfTlVNX1AoTCwgaXBtaSwgYmFzZV9hZGRyZXNzKQorICBMVUFfQUREX05VTV9QKEwsIGlwbWksIGlycSkKKworICByZXR1cm4gMTsKK30KKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBFbmQgb2YgRE1JIHN1YnRhYmxlcworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCitzdGF0aWMgaW50IGRtaV9nZXR0YWJsZShsdWFfU3RhdGUgKkwpCit7CisgIHNfZG1pIGRtaTsKKworICBsdWFfbmV3dGFibGUoTCk7CisKKyAgaWYgKCAhIGRtaV9pdGVyYXRlKCZkbWkpICkgeworICAgICAgICAgIHByaW50ZigiTm8gRE1JIFN0cnVjdHVyZSBmb3VuZFxuIik7CisgICAgICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgcGFyc2VfZG1pdGFibGUoJmRtaSk7CisKKyAgTFVBX0FERF9OVU1fUyhMLCBkbWksIG1lbW9yeV9tb2R1bGVfY291bnQpCisgIExVQV9BRERfTlVNX1MoTCwgZG1pLCBtZW1vcnlfY291bnQpCisgIExVQV9BRERfTlVNX1MoTCwgZG1pLCBjYWNoZV9jb3VudCkKKyAgTFVBX0FERF9TVFJfUyhMLCBkbWksIG9lbV9zdHJpbmdzKQorCisgIExVQV9BRERfVEFCTEUoTCwgJmRtaSwgYmlvcykKKyAgTFVBX0FERF9UQUJMRShMLCAmZG1pLCBzeXN0ZW0pCisgIExVQV9BRERfVEFCTEUoTCwgJmRtaSwgYmFzZV9ib2FyZCkKKyAgTFVBX0FERF9UQUJMRShMLCAmZG1pLCBjaGFzc2lzKQorICBMVUFfQUREX1RBQkxFKEwsICZkbWksIHByb2Nlc3NvcikKKyAgTFVBX0FERF9UQUJMRShMLCAmZG1pLCBiYXR0ZXJ5KQorICBMVUFfQUREX1RBQkxFKEwsICZkbWksIG1lbW9yeSkKKyAgTFVBX0FERF9UQUJMRShMLCAmZG1pLCBtZW1vcnlfbW9kdWxlKQorICBMVUFfQUREX1RBQkxFKEwsICZkbWksIGNhY2hlKQorICBMVUFfQUREX1RBQkxFKEwsICZkbWksIGlwbWkpCisgIExVQV9BRERfVEFCTEUoTCwgJmRtaSwgaGFyZHdhcmVfc2VjdXJpdHkpCisgIExVQV9BRERfVEFCTEUoTCwgJmRtaSwgZG1pX2luZm8pCisKKyAgLyogc2V0IGdsb2JhbCB2YXJpYWJsZTogbHVhX3NldGdsb2JhbChMLCAiZG1pdGFibGUiKTsgKi8KKworICAvKiByZXR1cm4gbnVtYmVyIG9mIHJldHVybiB2YWx1ZXMgb24gc3RhY2sgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBkbWlfc3VwcG9ydGVkKGx1YV9TdGF0ZSAqTCkKK3sKKyAgc19kbWkgZG1pOworCisgIGlmICggZG1pX2l0ZXJhdGUoJmRtaSkgKSB7CisgICAgbHVhX3B1c2hib29sZWFuKEwsIDEpOworICB9IGVsc2UgeworICAgIGx1YV9wdXNoYm9vbGVhbihMLCAwKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgZG1pbGliW10gPSB7CisgIHsiZ2V0dGFibGUiLCBkbWlfZ2V0dGFibGV9LAorICB7InN1cHBvcnRlZCIsIGRtaV9zdXBwb3J0ZWR9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworTFVBTElCX0FQSSBpbnQgbHVhb3Blbl9kbWkgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld2xpYihMLCBkbWlsaWIpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sYXBpLmMgYi9jb20zMi9sdWEvc3JjL2xhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDExNDMxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sYXBpLmMKQEAgLTAsMCArMSwxMjg0IEBACisvKgorKiogJElkOiBsYXBpLmMsdiAyLjE3MS4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBMdWEgQVBJCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbGFwaV9jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxhcGkuaCIKKyNpbmNsdWRlICJsZGVidWcuaCIKKyNpbmNsdWRlICJsZG8uaCIKKyNpbmNsdWRlICJsZnVuYy5oIgorI2luY2x1ZGUgImxnYy5oIgorI2luY2x1ZGUgImxtZW0uaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHN0cmluZy5oIgorI2luY2x1ZGUgImx0YWJsZS5oIgorI2luY2x1ZGUgImx0bS5oIgorI2luY2x1ZGUgImx1bmR1bXAuaCIKKyNpbmNsdWRlICJsdm0uaCIKKworCisKK2NvbnN0IGNoYXIgbHVhX2lkZW50W10gPQorICAiJEx1YVZlcnNpb246ICIgTFVBX0NPUFlSSUdIVCAiICQiCisgICIkTHVhQXV0aG9yczogIiBMVUFfQVVUSE9SUyAiICQiOworCisKKy8qIHZhbHVlIGF0IGEgbm9uLXZhbGlkIGluZGV4ICovCisjZGVmaW5lIE5PTlZBTElEVkFMVUUJCWNhc3QoVFZhbHVlICosIGx1YU9fbmlsb2JqZWN0KQorCisvKiBjb3JyZXNwb25kaW5nIHRlc3QgKi8KKyNkZWZpbmUgaXN2YWxpZChvKQkoKG8pICE9IGx1YU9fbmlsb2JqZWN0KQorCisvKiB0ZXN0IGZvciBwc2V1ZG8gaW5kZXggKi8KKyNkZWZpbmUgaXNwc2V1ZG8oaSkJCSgoaSkgPD0gTFVBX1JFR0lTVFJZSU5ERVgpCisKKy8qIHRlc3QgZm9yIHZhbGlkIGJ1dCBub3QgcHNldWRvIGluZGV4ICovCisjZGVmaW5lIGlzc3RhY2tpbmRleChpLCBvKQkoaXN2YWxpZChvKSAmJiAhaXNwc2V1ZG8oaSkpCisKKyNkZWZpbmUgYXBpX2NoZWNrdmFsaWRpbmRleChMLCBvKSAgYXBpX2NoZWNrKEwsIGlzdmFsaWQobyksICJpbnZhbGlkIGluZGV4IikKKworI2RlZmluZSBhcGlfY2hlY2tzdGFja2luZGV4KEwsIGksIG8pICBcCisJYXBpX2NoZWNrKEwsIGlzc3RhY2tpbmRleChpLCBvKSwgImluZGV4IG5vdCBpbiB0aGUgc3RhY2siKQorCisKK3N0YXRpYyBUVmFsdWUgKmluZGV4MmFkZHIgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBDYWxsSW5mbyAqY2kgPSBMLT5jaTsKKyAgaWYgKGlkeCA+IDApIHsKKyAgICBUVmFsdWUgKm8gPSBjaS0+ZnVuYyArIGlkeDsKKyAgICBhcGlfY2hlY2soTCwgaWR4IDw9IGNpLT50b3AgLSAoY2ktPmZ1bmMgKyAxKSwgInVuYWNjZXB0YWJsZSBpbmRleCIpOworICAgIGlmIChvID49IEwtPnRvcCkgcmV0dXJuIE5PTlZBTElEVkFMVUU7CisgICAgZWxzZSByZXR1cm4gbzsKKyAgfQorICBlbHNlIGlmICghaXNwc2V1ZG8oaWR4KSkgeyAgLyogbmVnYXRpdmUgaW5kZXggKi8KKyAgICBhcGlfY2hlY2soTCwgaWR4ICE9IDAgJiYgLWlkeCA8PSBMLT50b3AgLSAoY2ktPmZ1bmMgKyAxKSwgImludmFsaWQgaW5kZXgiKTsKKyAgICByZXR1cm4gTC0+dG9wICsgaWR4OworICB9CisgIGVsc2UgaWYgKGlkeCA9PSBMVUFfUkVHSVNUUllJTkRFWCkKKyAgICByZXR1cm4gJkcoTCktPmxfcmVnaXN0cnk7CisgIGVsc2UgeyAgLyogdXB2YWx1ZXMgKi8KKyAgICBpZHggPSBMVUFfUkVHSVNUUllJTkRFWCAtIGlkeDsKKyAgICBhcGlfY2hlY2soTCwgaWR4IDw9IE1BWFVQVkFMICsgMSwgInVwdmFsdWUgaW5kZXggdG9vIGxhcmdlIik7CisgICAgaWYgKHR0aXNsY2YoY2ktPmZ1bmMpKSAgLyogbGlnaHQgQyBmdW5jdGlvbj8gKi8KKyAgICAgIHJldHVybiBOT05WQUxJRFZBTFVFOyAgLyogaXQgaGFzIG5vIHVwdmFsdWVzICovCisgICAgZWxzZSB7CisgICAgICBDQ2xvc3VyZSAqZnVuYyA9IGNsQ3ZhbHVlKGNpLT5mdW5jKTsKKyAgICAgIHJldHVybiAoaWR4IDw9IGZ1bmMtPm51cHZhbHVlcykgPyAmZnVuYy0+dXB2YWx1ZVtpZHgtMV0gOiBOT05WQUxJRFZBTFVFOworICAgIH0KKyAgfQorfQorCisKKy8qCisqKiB0byBiZSBjYWxsZWQgYnkgJ2x1YV9jaGVja3N0YWNrJyBpbiBwcm90ZWN0ZWQgbW9kZSwgdG8gZ3JvdyBzdGFjaworKiogY2FwdHVyaW5nIG1lbW9yeSBlcnJvcnMKKyovCitzdGF0aWMgdm9pZCBncm93c3RhY2sgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQpIHsKKyAgaW50IHNpemUgPSAqKGludCAqKXVkOworICBsdWFEX2dyb3dzdGFjayhMLCBzaXplKTsKK30KKworCitMVUFfQVBJIGludCBsdWFfY2hlY2tzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgc2l6ZSkgeworICBpbnQgcmVzOworICBDYWxsSW5mbyAqY2kgPSBMLT5jaTsKKyAgbHVhX2xvY2soTCk7CisgIGlmIChMLT5zdGFja19sYXN0IC0gTC0+dG9wID4gc2l6ZSkgIC8qIHN0YWNrIGxhcmdlIGVub3VnaD8gKi8KKyAgICByZXMgPSAxOyAgLyogeWVzOyBjaGVjayBpcyBPSyAqLworICBlbHNlIHsgIC8qIG5vOyBuZWVkIHRvIGdyb3cgc3RhY2sgKi8KKyAgICBpbnQgaW51c2UgPSBjYXN0X2ludChMLT50b3AgLSBMLT5zdGFjaykgKyBFWFRSQV9TVEFDSzsKKyAgICBpZiAoaW51c2UgPiBMVUFJX01BWFNUQUNLIC0gc2l6ZSkgIC8qIGNhbiBncm93IHdpdGhvdXQgb3ZlcmZsb3c/ICovCisgICAgICByZXMgPSAwOyAgLyogbm8gKi8KKyAgICBlbHNlICAvKiB0cnkgdG8gZ3JvdyBzdGFjayAqLworICAgICAgcmVzID0gKGx1YURfcmF3cnVucHJvdGVjdGVkKEwsICZncm93c3RhY2ssICZzaXplKSA9PSBMVUFfT0spOworICB9CisgIGlmIChyZXMgJiYgY2ktPnRvcCA8IEwtPnRvcCArIHNpemUpCisgICAgY2ktPnRvcCA9IEwtPnRvcCArIHNpemU7ICAvKiBhZGp1c3QgZnJhbWUgdG9wICovCisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiByZXM7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV94bW92ZSAobHVhX1N0YXRlICpmcm9tLCBsdWFfU3RhdGUgKnRvLCBpbnQgbikgeworICBpbnQgaTsKKyAgaWYgKGZyb20gPT0gdG8pIHJldHVybjsKKyAgbHVhX2xvY2sodG8pOworICBhcGlfY2hlY2tuZWxlbXMoZnJvbSwgbik7CisgIGFwaV9jaGVjayhmcm9tLCBHKGZyb20pID09IEcodG8pLCAibW92aW5nIGFtb25nIGluZGVwZW5kZW50IHN0YXRlcyIpOworICBhcGlfY2hlY2soZnJvbSwgdG8tPmNpLT50b3AgLSB0by0+dG9wID49IG4sICJub3QgZW5vdWdoIGVsZW1lbnRzIHRvIG1vdmUiKTsKKyAgZnJvbS0+dG9wIC09IG47CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBzZXRvYmoycyh0bywgdG8tPnRvcCsrLCBmcm9tLT50b3AgKyBpKTsKKyAgfQorICBsdWFfdW5sb2NrKHRvKTsKK30KKworCitMVUFfQVBJIGx1YV9DRnVuY3Rpb24gbHVhX2F0cGFuaWMgKGx1YV9TdGF0ZSAqTCwgbHVhX0NGdW5jdGlvbiBwYW5pY2YpIHsKKyAgbHVhX0NGdW5jdGlvbiBvbGQ7CisgIGx1YV9sb2NrKEwpOworICBvbGQgPSBHKEwpLT5wYW5pYzsKKyAgRyhMKS0+cGFuaWMgPSBwYW5pY2Y7CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBvbGQ7Cit9CisKKworTFVBX0FQSSBjb25zdCBsdWFfTnVtYmVyICpsdWFfdmVyc2lvbiAobHVhX1N0YXRlICpMKSB7CisgIHN0YXRpYyBjb25zdCBsdWFfTnVtYmVyIHZlcnNpb24gPSBMVUFfVkVSU0lPTl9OVU07CisgIGlmIChMID09IE5VTEwpIHJldHVybiAmdmVyc2lvbjsKKyAgZWxzZSByZXR1cm4gRyhMKS0+dmVyc2lvbjsKK30KKworCisKKy8qCisqKiBiYXNpYyBzdGFjayBtYW5pcHVsYXRpb24KKyovCisKKworLyoKKyoqIGNvbnZlcnQgYW4gYWNjZXB0YWJsZSBzdGFjayBpbmRleCBpbnRvIGFuIGFic29sdXRlIGluZGV4CisqLworTFVBX0FQSSBpbnQgbHVhX2Fic2luZGV4IChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgcmV0dXJuIChpZHggPiAwIHx8IGlzcHNldWRvKGlkeCkpCisgICAgICAgICA/IGlkeAorICAgICAgICAgOiBjYXN0X2ludChMLT50b3AgLSBMLT5jaS0+ZnVuYyArIGlkeCk7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX2dldHRvcCAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBjYXN0X2ludChMLT50b3AgLSAoTC0+Y2ktPmZ1bmMgKyAxKSk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9zZXR0b3AgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCBmdW5jID0gTC0+Y2ktPmZ1bmM7CisgIGx1YV9sb2NrKEwpOworICBpZiAoaWR4ID49IDApIHsKKyAgICBhcGlfY2hlY2soTCwgaWR4IDw9IEwtPnN0YWNrX2xhc3QgLSAoZnVuYyArIDEpLCAibmV3IHRvcCB0b28gbGFyZ2UiKTsKKyAgICB3aGlsZSAoTC0+dG9wIDwgKGZ1bmMgKyAxKSArIGlkeCkKKyAgICAgIHNldG5pbHZhbHVlKEwtPnRvcCsrKTsKKyAgICBMLT50b3AgPSAoZnVuYyArIDEpICsgaWR4OworICB9CisgIGVsc2UgeworICAgIGFwaV9jaGVjayhMLCAtKGlkeCsxKSA8PSAoTC0+dG9wIC0gKGZ1bmMgKyAxKSksICJpbnZhbGlkIG5ldyB0b3AiKTsKKyAgICBMLT50b3AgKz0gaWR4KzE7ICAvKiBgc3VidHJhY3QnIGluZGV4IChpbmRleCBpcyBuZWdhdGl2ZSkgKi8KKyAgfQorICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcmVtb3ZlIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgcDsKKyAgbHVhX2xvY2soTCk7CisgIHAgPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIGFwaV9jaGVja3N0YWNraW5kZXgoTCwgaWR4LCBwKTsKKyAgd2hpbGUgKCsrcCA8IEwtPnRvcCkgc2V0b2JqczJzKEwsIHAtMSwgcCk7CisgIEwtPnRvcC0tOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfaW5zZXJ0IChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgcDsKKyAgU3RrSWQgcTsKKyAgbHVhX2xvY2soTCk7CisgIHAgPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIGFwaV9jaGVja3N0YWNraW5kZXgoTCwgaWR4LCBwKTsKKyAgZm9yIChxID0gTC0+dG9wOyBxID4gcDsgcS0tKSAgLyogdXNlIEwtPnRvcCBhcyBhIHRlbXBvcmFyeSAqLworICAgIHNldG9ianMycyhMLCBxLCBxIC0gMSk7CisgIHNldG9ianMycyhMLCBwLCBMLT50b3ApOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK3N0YXRpYyB2b2lkIG1vdmV0byAobHVhX1N0YXRlICpMLCBUVmFsdWUgKmZyLCBpbnQgaWR4KSB7CisgIFRWYWx1ZSAqdG8gPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIGFwaV9jaGVja3ZhbGlkaW5kZXgoTCwgdG8pOworICBzZXRvYmooTCwgdG8sIGZyKTsKKyAgaWYgKGlkeCA8IExVQV9SRUdJU1RSWUlOREVYKSAgLyogZnVuY3Rpb24gdXB2YWx1ZT8gKi8KKyAgICBsdWFDX2JhcnJpZXIoTCwgY2xDdmFsdWUoTC0+Y2ktPmZ1bmMpLCBmcik7CisgIC8qIExVQV9SRUdJU1RSWUlOREVYIGRvZXMgbm90IG5lZWQgZ2MgYmFycmllcgorICAgICAoY29sbGVjdG9yIHJldmlzaXRzIGl0IGJlZm9yZSBmaW5pc2hpbmcgY29sbGVjdGlvbikgKi8KK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3JlcGxhY2UgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIDEpOworICBtb3ZldG8oTCwgTC0+dG9wIC0gMSwgaWR4KTsKKyAgTC0+dG9wLS07CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9jb3B5IChsdWFfU3RhdGUgKkwsIGludCBmcm9taWR4LCBpbnQgdG9pZHgpIHsKKyAgVFZhbHVlICpmcjsKKyAgbHVhX2xvY2soTCk7CisgIGZyID0gaW5kZXgyYWRkcihMLCBmcm9taWR4KTsKKyAgbW92ZXRvKEwsIGZyLCB0b2lkeCk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9wdXNodmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBsdWFfbG9jayhMKTsKKyAgc2V0b2JqMnMoTCwgTC0+dG9wLCBpbmRleDJhZGRyKEwsIGlkeCkpOworICBhcGlfaW5jcl90b3AoTCk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworCisvKgorKiogYWNjZXNzIGZ1bmN0aW9ucyAoc3RhY2sgLT4gQykKKyovCisKKworTFVBX0FQSSBpbnQgbHVhX3R5cGUgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCBvID0gaW5kZXgyYWRkcihMLCBpZHgpOworICByZXR1cm4gKGlzdmFsaWQobykgPyB0dHlwZW52KG8pIDogTFVBX1ROT05FKTsKK30KKworCitMVUFfQVBJIGNvbnN0IGNoYXIgKmx1YV90eXBlbmFtZSAobHVhX1N0YXRlICpMLCBpbnQgdCkgeworICBVTlVTRUQoTCk7CisgIHJldHVybiB0dHlwZW5hbWUodCk7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX2lzY2Z1bmN0aW9uIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgbyA9IGluZGV4MmFkZHIoTCwgaWR4KTsKKyAgcmV0dXJuICh0dGlzbGNmKG8pIHx8ICh0dGlzQ2Nsb3N1cmUobykpKTsKK30KKworCitMVUFfQVBJIGludCBsdWFfaXNudW1iZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBUVmFsdWUgbjsKKyAgY29uc3QgVFZhbHVlICpvID0gaW5kZXgyYWRkcihMLCBpZHgpOworICByZXR1cm4gdG9udW1iZXIobywgJm4pOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9pc3N0cmluZyAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIGludCB0ID0gbHVhX3R5cGUoTCwgaWR4KTsKKyAgcmV0dXJuICh0ID09IExVQV9UU1RSSU5HIHx8IHQgPT0gTFVBX1ROVU1CRVIpOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9pc3VzZXJkYXRhIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgY29uc3QgVFZhbHVlICpvID0gaW5kZXgyYWRkcihMLCBpZHgpOworICByZXR1cm4gKHR0aXN1c2VyZGF0YShvKSB8fCB0dGlzbGlnaHR1c2VyZGF0YShvKSk7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX3Jhd2VxdWFsIChsdWFfU3RhdGUgKkwsIGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgU3RrSWQgbzEgPSBpbmRleDJhZGRyKEwsIGluZGV4MSk7CisgIFN0a0lkIG8yID0gaW5kZXgyYWRkcihMLCBpbmRleDIpOworICByZXR1cm4gKGlzdmFsaWQobzEpICYmIGlzdmFsaWQobzIpKSA/IGx1YVZfcmF3ZXF1YWxvYmoobzEsIG8yKSA6IDA7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9hcml0aCAobHVhX1N0YXRlICpMLCBpbnQgb3ApIHsKKyAgU3RrSWQgbzE7ICAvKiAxc3Qgb3BlcmFuZCAqLworICBTdGtJZCBvMjsgIC8qIDJuZCBvcGVyYW5kICovCisgIGx1YV9sb2NrKEwpOworICBpZiAob3AgIT0gTFVBX09QVU5NKSAvKiBhbGwgb3RoZXIgb3BlcmF0aW9ucyBleHBlY3QgdHdvIG9wZXJhbmRzICovCisgICAgYXBpX2NoZWNrbmVsZW1zKEwsIDIpOworICBlbHNlIHsgIC8qIGZvciB1bmFyeSBtaW51cywgYWRkIGZha2UgMm5kIG9wZXJhbmQgKi8KKyAgICBhcGlfY2hlY2tuZWxlbXMoTCwgMSk7CisgICAgc2V0b2JqczJzKEwsIEwtPnRvcCwgTC0+dG9wIC0gMSk7CisgICAgTC0+dG9wKys7CisgIH0KKyAgbzEgPSBMLT50b3AgLSAyOworICBvMiA9IEwtPnRvcCAtIDE7CisgIGlmICh0dGlzbnVtYmVyKG8xKSAmJiB0dGlzbnVtYmVyKG8yKSkgeworICAgIHNldG52YWx1ZShvMSwgbHVhT19hcml0aChvcCwgbnZhbHVlKG8xKSwgbnZhbHVlKG8yKSkpOworICB9CisgIGVsc2UKKyAgICBsdWFWX2FyaXRoKEwsIG8xLCBvMSwgbzIsIGNhc3QoVE1TLCBvcCAtIExVQV9PUEFERCArIFRNX0FERCkpOworICBMLT50b3AtLTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIGludCBsdWFfY29tcGFyZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyLCBpbnQgb3ApIHsKKyAgU3RrSWQgbzEsIG8yOworICBpbnQgaSA9IDA7CisgIGx1YV9sb2NrKEwpOyAgLyogbWF5IGNhbGwgdGFnIG1ldGhvZCAqLworICBvMSA9IGluZGV4MmFkZHIoTCwgaW5kZXgxKTsKKyAgbzIgPSBpbmRleDJhZGRyKEwsIGluZGV4Mik7CisgIGlmIChpc3ZhbGlkKG8xKSAmJiBpc3ZhbGlkKG8yKSkgeworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgIGNhc2UgTFVBX09QRVE6IGkgPSBlcXVhbG9iaihMLCBvMSwgbzIpOyBicmVhazsKKyAgICAgIGNhc2UgTFVBX09QTFQ6IGkgPSBsdWFWX2xlc3N0aGFuKEwsIG8xLCBvMik7IGJyZWFrOworICAgICAgY2FzZSBMVUFfT1BMRTogaSA9IGx1YVZfbGVzc2VxdWFsKEwsIG8xLCBvMik7IGJyZWFrOworICAgICAgZGVmYXVsdDogYXBpX2NoZWNrKEwsIDAsICJpbnZhbGlkIG9wdGlvbiIpOworICAgIH0KKyAgfQorICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gaTsKK30KKworCitMVUFfQVBJIGx1YV9OdW1iZXIgbHVhX3RvbnVtYmVyeCAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBpbnQgKmlzbnVtKSB7CisgIFRWYWx1ZSBuOworICBjb25zdCBUVmFsdWUgKm8gPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIGlmICh0b251bWJlcihvLCAmbikpIHsKKyAgICBpZiAoaXNudW0pICppc251bSA9IDE7CisgICAgcmV0dXJuIG52YWx1ZShvKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoaXNudW0pICppc251bSA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworCitMVUFfQVBJIGx1YV9JbnRlZ2VyIGx1YV90b2ludGVnZXJ4IChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGludCAqaXNudW0pIHsKKyAgVFZhbHVlIG47CisgIGNvbnN0IFRWYWx1ZSAqbyA9IGluZGV4MmFkZHIoTCwgaWR4KTsKKyAgaWYgKHRvbnVtYmVyKG8sICZuKSkgeworICAgIGx1YV9JbnRlZ2VyIHJlczsKKyAgICBsdWFfTnVtYmVyIG51bSA9IG52YWx1ZShvKTsKKyAgICBsdWFfbnVtYmVyMmludGVnZXIocmVzLCBudW0pOworICAgIGlmIChpc251bSkgKmlzbnVtID0gMTsKKyAgICByZXR1cm4gcmVzOworICB9CisgIGVsc2UgeworICAgIGlmIChpc251bSkgKmlzbnVtID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisKK0xVQV9BUEkgbHVhX1Vuc2lnbmVkIGx1YV90b3Vuc2lnbmVkeCAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBpbnQgKmlzbnVtKSB7CisgIFRWYWx1ZSBuOworICBjb25zdCBUVmFsdWUgKm8gPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIGlmICh0b251bWJlcihvLCAmbikpIHsKKyAgICBsdWFfVW5zaWduZWQgcmVzOworICAgIGx1YV9OdW1iZXIgbnVtID0gbnZhbHVlKG8pOworICAgIGx1YV9udW1iZXIydW5zaWduZWQocmVzLCBudW0pOworICAgIGlmIChpc251bSkgKmlzbnVtID0gMTsKKyAgICByZXR1cm4gcmVzOworICB9CisgIGVsc2UgeworICAgIGlmIChpc251bSkgKmlzbnVtID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisKK0xVQV9BUEkgaW50IGx1YV90b2Jvb2xlYW4gKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBjb25zdCBUVmFsdWUgKm8gPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIHJldHVybiAhbF9pc2ZhbHNlKG8pOworfQorCisKK0xVQV9BUEkgY29uc3QgY2hhciAqbHVhX3RvbHN0cmluZyAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBzaXplX3QgKmxlbikgeworICBTdGtJZCBvID0gaW5kZXgyYWRkcihMLCBpZHgpOworICBpZiAoIXR0aXNzdHJpbmcobykpIHsKKyAgICBsdWFfbG9jayhMKTsgIC8qIGBsdWFWX3Rvc3RyaW5nJyBtYXkgY3JlYXRlIGEgbmV3IHN0cmluZyAqLworICAgIGlmICghbHVhVl90b3N0cmluZyhMLCBvKSkgeyAgLyogY29udmVyc2lvbiBmYWlsZWQ/ICovCisgICAgICBpZiAobGVuICE9IE5VTEwpICpsZW4gPSAwOworICAgICAgbHVhX3VubG9jayhMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsdWFDX2NoZWNrR0MoTCk7CisgICAgbyA9IGluZGV4MmFkZHIoTCwgaWR4KTsgIC8qIHByZXZpb3VzIGNhbGwgbWF5IHJlYWxsb2NhdGUgdGhlIHN0YWNrICovCisgICAgbHVhX3VubG9jayhMKTsKKyAgfQorICBpZiAobGVuICE9IE5VTEwpICpsZW4gPSB0c3ZhbHVlKG8pLT5sZW47CisgIHJldHVybiBzdmFsdWUobyk7Cit9CisKKworTFVBX0FQSSBzaXplX3QgbHVhX3Jhd2xlbiAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIG8gPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIHN3aXRjaCAodHR5cGVudihvKSkgeworICAgIGNhc2UgTFVBX1RTVFJJTkc6IHJldHVybiB0c3ZhbHVlKG8pLT5sZW47CisgICAgY2FzZSBMVUFfVFVTRVJEQVRBOiByZXR1cm4gdXZhbHVlKG8pLT5sZW47CisgICAgY2FzZSBMVUFfVFRBQkxFOiByZXR1cm4gbHVhSF9nZXRuKGh2YWx1ZShvKSk7CisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KK30KKworCitMVUFfQVBJIGx1YV9DRnVuY3Rpb24gbHVhX3RvY2Z1bmN0aW9uIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgbyA9IGluZGV4MmFkZHIoTCwgaWR4KTsKKyAgaWYgKHR0aXNsY2YobykpIHJldHVybiBmdmFsdWUobyk7CisgIGVsc2UgaWYgKHR0aXNDY2xvc3VyZShvKSkKKyAgICByZXR1cm4gY2xDdmFsdWUobyktPmY7CisgIGVsc2UgcmV0dXJuIE5VTEw7ICAvKiBub3QgYSBDIGZ1bmN0aW9uICovCit9CisKKworTFVBX0FQSSB2b2lkICpsdWFfdG91c2VyZGF0YSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIG8gPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIHN3aXRjaCAodHR5cGVudihvKSkgeworICAgIGNhc2UgTFVBX1RVU0VSREFUQTogcmV0dXJuIChyYXd1dmFsdWUobykgKyAxKTsKKyAgICBjYXNlIExVQV9UTElHSFRVU0VSREFUQTogcmV0dXJuIHB2YWx1ZShvKTsKKyAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsKKyAgfQorfQorCisKK0xVQV9BUEkgbHVhX1N0YXRlICpsdWFfdG90aHJlYWQgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCBvID0gaW5kZXgyYWRkcihMLCBpZHgpOworICByZXR1cm4gKCF0dGlzdGhyZWFkKG8pKSA/IE5VTEwgOiB0aHZhbHVlKG8pOworfQorCisKK0xVQV9BUEkgY29uc3Qgdm9pZCAqbHVhX3RvcG9pbnRlciAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIG8gPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIHN3aXRjaCAodHR5cGUobykpIHsKKyAgICBjYXNlIExVQV9UVEFCTEU6IHJldHVybiBodmFsdWUobyk7CisgICAgY2FzZSBMVUFfVExDTDogcmV0dXJuIGNsTHZhbHVlKG8pOworICAgIGNhc2UgTFVBX1RDQ0w6IHJldHVybiBjbEN2YWx1ZShvKTsKKyAgICBjYXNlIExVQV9UTENGOiByZXR1cm4gY2FzdCh2b2lkICosIGNhc3Qoc2l6ZV90LCBmdmFsdWUobykpKTsKKyAgICBjYXNlIExVQV9UVEhSRUFEOiByZXR1cm4gdGh2YWx1ZShvKTsKKyAgICBjYXNlIExVQV9UVVNFUkRBVEE6CisgICAgY2FzZSBMVUFfVExJR0hUVVNFUkRBVEE6CisgICAgICByZXR1cm4gbHVhX3RvdXNlcmRhdGEoTCwgaWR4KTsKKyAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsKKyAgfQorfQorCisKKworLyoKKyoqIHB1c2ggZnVuY3Rpb25zIChDIC0+IHN0YWNrKQorKi8KKworCitMVUFfQVBJIHZvaWQgbHVhX3B1c2huaWwgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfbG9jayhMKTsKKyAgc2V0bmlsdmFsdWUoTC0+dG9wKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcHVzaG51bWJlciAobHVhX1N0YXRlICpMLCBsdWFfTnVtYmVyIG4pIHsKKyAgbHVhX2xvY2soTCk7CisgIHNldG52YWx1ZShMLT50b3AsIG4pOworICBsdWFpX2NoZWNrbnVtKEwsIEwtPnRvcCwKKyAgICBsdWFHX3J1bmVycm9yKEwsICJDIEFQSSAtIGF0dGVtcHQgdG8gcHVzaCBhIHNpZ25hbGluZyBOYU4iKSk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3B1c2hpbnRlZ2VyIChsdWFfU3RhdGUgKkwsIGx1YV9JbnRlZ2VyIG4pIHsKKyAgbHVhX2xvY2soTCk7CisgIHNldG52YWx1ZShMLT50b3AsIGNhc3RfbnVtKG4pKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcHVzaHVuc2lnbmVkIChsdWFfU3RhdGUgKkwsIGx1YV9VbnNpZ25lZCB1KSB7CisgIGx1YV9OdW1iZXIgbjsKKyAgbHVhX2xvY2soTCk7CisgIG4gPSBsdWFfdW5zaWduZWQybnVtYmVyKHUpOworICBzZXRudmFsdWUoTC0+dG9wLCBuKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgY29uc3QgY2hhciAqbHVhX3B1c2hsc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pIHsKKyAgVFN0cmluZyAqdHM7CisgIGx1YV9sb2NrKEwpOworICBsdWFDX2NoZWNrR0MoTCk7CisgIHRzID0gbHVhU19uZXdsc3RyKEwsIHMsIGxlbik7CisgIHNldHN2YWx1ZTJzKEwsIEwtPnRvcCwgdHMpOworICBhcGlfaW5jcl90b3AoTCk7CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBnZXRzdHIodHMpOworfQorCisKK0xVQV9BUEkgY29uc3QgY2hhciAqbHVhX3B1c2hzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcykgeworICBpZiAocyA9PSBOVUxMKSB7CisgICAgbHVhX3B1c2huaWwoTCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSB7CisgICAgVFN0cmluZyAqdHM7CisgICAgbHVhX2xvY2soTCk7CisgICAgbHVhQ19jaGVja0dDKEwpOworICAgIHRzID0gbHVhU19uZXcoTCwgcyk7CisgICAgc2V0c3ZhbHVlMnMoTCwgTC0+dG9wLCB0cyk7CisgICAgYXBpX2luY3JfdG9wKEwpOworICAgIGx1YV91bmxvY2soTCk7CisgICAgcmV0dXJuIGdldHN0cih0cyk7CisgIH0KK30KKworCitMVUFfQVBJIGNvbnN0IGNoYXIgKmx1YV9wdXNodmZzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3ApIHsKKyAgY29uc3QgY2hhciAqcmV0OworICBsdWFfbG9jayhMKTsKKyAgbHVhQ19jaGVja0dDKEwpOworICByZXQgPSBsdWFPX3B1c2h2ZnN0cmluZyhMLCBmbXQsIGFyZ3ApOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gcmV0OworfQorCisKK0xVQV9BUEkgY29uc3QgY2hhciAqbHVhX3B1c2hmc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgIGNvbnN0IGNoYXIgKnJldDsKKyAgdmFfbGlzdCBhcmdwOworICBsdWFfbG9jayhMKTsKKyAgbHVhQ19jaGVja0dDKEwpOworICB2YV9zdGFydChhcmdwLCBmbXQpOworICByZXQgPSBsdWFPX3B1c2h2ZnN0cmluZyhMLCBmbXQsIGFyZ3ApOworICB2YV9lbmQoYXJncCk7CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiByZXQ7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9wdXNoY2Nsb3N1cmUgKGx1YV9TdGF0ZSAqTCwgbHVhX0NGdW5jdGlvbiBmbiwgaW50IG4pIHsKKyAgbHVhX2xvY2soTCk7CisgIGlmIChuID09IDApIHsKKyAgICBzZXRmdmFsdWUoTC0+dG9wLCBmbik7CisgIH0KKyAgZWxzZSB7CisgICAgQ2xvc3VyZSAqY2w7CisgICAgYXBpX2NoZWNrbmVsZW1zKEwsIG4pOworICAgIGFwaV9jaGVjayhMLCBuIDw9IE1BWFVQVkFMLCAidXB2YWx1ZSBpbmRleCB0b28gbGFyZ2UiKTsKKyAgICBsdWFDX2NoZWNrR0MoTCk7CisgICAgY2wgPSBsdWFGX25ld0NjbG9zdXJlKEwsIG4pOworICAgIGNsLT5jLmYgPSBmbjsKKyAgICBMLT50b3AgLT0gbjsKKyAgICB3aGlsZSAobi0tKQorICAgICAgc2V0b2JqMm4oTCwgJmNsLT5jLnVwdmFsdWVbbl0sIEwtPnRvcCArIG4pOworICAgIHNldGNsQ3ZhbHVlKEwsIEwtPnRvcCwgY2wpOworICB9CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3B1c2hib29sZWFuIChsdWFfU3RhdGUgKkwsIGludCBiKSB7CisgIGx1YV9sb2NrKEwpOworICBzZXRidmFsdWUoTC0+dG9wLCAoYiAhPSAwKSk7ICAvKiBlbnN1cmUgdGhhdCB0cnVlIGlzIDEgKi8KKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcHVzaGxpZ2h0dXNlcmRhdGEgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqcCkgeworICBsdWFfbG9jayhMKTsKKyAgc2V0cHZhbHVlKEwtPnRvcCwgcCk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIGludCBsdWFfcHVzaHRocmVhZCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9sb2NrKEwpOworICBzZXR0aHZhbHVlKEwsIEwtPnRvcCwgTCk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIChHKEwpLT5tYWludGhyZWFkID09IEwpOworfQorCisKKworLyoKKyoqIGdldCBmdW5jdGlvbnMgKEx1YSAtPiBzdGFjaykKKyovCisKKworTFVBX0FQSSB2b2lkIGx1YV9nZXRnbG9iYWwgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqdmFyKSB7CisgIFRhYmxlICpyZWcgPSBodmFsdWUoJkcoTCktPmxfcmVnaXN0cnkpOworICBjb25zdCBUVmFsdWUgKmd0OyAgLyogZ2xvYmFsIHRhYmxlICovCisgIGx1YV9sb2NrKEwpOworICBndCA9IGx1YUhfZ2V0aW50KHJlZywgTFVBX1JJRFhfR0xPQkFMUyk7CisgIHNldHN2YWx1ZTJzKEwsIEwtPnRvcCsrLCBsdWFTX25ldyhMLCB2YXIpKTsKKyAgbHVhVl9nZXR0YWJsZShMLCBndCwgTC0+dG9wIC0gMSwgTC0+dG9wIC0gMSk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9nZXR0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIHQ7CisgIGx1YV9sb2NrKEwpOworICB0ID0gaW5kZXgyYWRkcihMLCBpZHgpOworICBsdWFWX2dldHRhYmxlKEwsIHQsIEwtPnRvcCAtIDEsIEwtPnRvcCAtIDEpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfZ2V0ZmllbGQgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwgY29uc3QgY2hhciAqaykgeworICBTdGtJZCB0OworICBsdWFfbG9jayhMKTsKKyAgdCA9IGluZGV4MmFkZHIoTCwgaWR4KTsKKyAgc2V0c3ZhbHVlMnMoTCwgTC0+dG9wLCBsdWFTX25ldyhMLCBrKSk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhVl9nZXR0YWJsZShMLCB0LCBMLT50b3AgLSAxLCBMLT50b3AgLSAxKTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3Jhd2dldCAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIHQ7CisgIGx1YV9sb2NrKEwpOworICB0ID0gaW5kZXgyYWRkcihMLCBpZHgpOworICBhcGlfY2hlY2soTCwgdHRpc3RhYmxlKHQpLCAidGFibGUgZXhwZWN0ZWQiKTsKKyAgc2V0b2JqMnMoTCwgTC0+dG9wIC0gMSwgbHVhSF9nZXQoaHZhbHVlKHQpLCBMLT50b3AgLSAxKSk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9yYXdnZXRpIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGludCBuKSB7CisgIFN0a0lkIHQ7CisgIGx1YV9sb2NrKEwpOworICB0ID0gaW5kZXgyYWRkcihMLCBpZHgpOworICBhcGlfY2hlY2soTCwgdHRpc3RhYmxlKHQpLCAidGFibGUgZXhwZWN0ZWQiKTsKKyAgc2V0b2JqMnMoTCwgTC0+dG9wLCBsdWFIX2dldGludChodmFsdWUodCksIG4pKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfcmF3Z2V0cCAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBjb25zdCB2b2lkICpwKSB7CisgIFN0a0lkIHQ7CisgIFRWYWx1ZSBrOworICBsdWFfbG9jayhMKTsKKyAgdCA9IGluZGV4MmFkZHIoTCwgaWR4KTsKKyAgYXBpX2NoZWNrKEwsIHR0aXN0YWJsZSh0KSwgInRhYmxlIGV4cGVjdGVkIik7CisgIHNldHB2YWx1ZSgmaywgY2FzdCh2b2lkICosIHApKTsKKyAgc2V0b2JqMnMoTCwgTC0+dG9wLCBsdWFIX2dldChodmFsdWUodCksICZrKSk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX2NyZWF0ZXRhYmxlIChsdWFfU3RhdGUgKkwsIGludCBuYXJyYXksIGludCBucmVjKSB7CisgIFRhYmxlICp0OworICBsdWFfbG9jayhMKTsKKyAgbHVhQ19jaGVja0dDKEwpOworICB0ID0gbHVhSF9uZXcoTCk7CisgIHNldGh2YWx1ZShMLCBMLT50b3AsIHQpOworICBhcGlfaW5jcl90b3AoTCk7CisgIGlmIChuYXJyYXkgPiAwIHx8IG5yZWMgPiAwKQorICAgIGx1YUhfcmVzaXplKEwsIHQsIG5hcnJheSwgbnJlYyk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX2dldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgb2JqaW5kZXgpIHsKKyAgY29uc3QgVFZhbHVlICpvYmo7CisgIFRhYmxlICptdCA9IE5VTEw7CisgIGludCByZXM7CisgIGx1YV9sb2NrKEwpOworICBvYmogPSBpbmRleDJhZGRyKEwsIG9iamluZGV4KTsKKyAgc3dpdGNoICh0dHlwZW52KG9iaikpIHsKKyAgICBjYXNlIExVQV9UVEFCTEU6CisgICAgICBtdCA9IGh2YWx1ZShvYmopLT5tZXRhdGFibGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIExVQV9UVVNFUkRBVEE6CisgICAgICBtdCA9IHV2YWx1ZShvYmopLT5tZXRhdGFibGU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbXQgPSBHKEwpLT5tdFt0dHlwZW52KG9iaildOworICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKG10ID09IE5VTEwpCisgICAgcmVzID0gMDsKKyAgZWxzZSB7CisgICAgc2V0aHZhbHVlKEwsIEwtPnRvcCwgbXQpOworICAgIGFwaV9pbmNyX3RvcChMKTsKKyAgICByZXMgPSAxOworICB9CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiByZXM7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9nZXR1c2VydmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCBvOworICBsdWFfbG9jayhMKTsKKyAgbyA9IGluZGV4MmFkZHIoTCwgaWR4KTsKKyAgYXBpX2NoZWNrKEwsIHR0aXN1c2VyZGF0YShvKSwgInVzZXJkYXRhIGV4cGVjdGVkIik7CisgIGlmICh1dmFsdWUobyktPmVudikgeworICAgIHNldGh2YWx1ZShMLCBMLT50b3AsIHV2YWx1ZShvKS0+ZW52KTsKKyAgfSBlbHNlCisgICAgc2V0bmlsdmFsdWUoTC0+dG9wKTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworfQorCisKKy8qCisqKiBzZXQgZnVuY3Rpb25zIChzdGFjayAtPiBMdWEpCisqLworCisKK0xVQV9BUEkgdm9pZCBsdWFfc2V0Z2xvYmFsIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnZhcikgeworICBUYWJsZSAqcmVnID0gaHZhbHVlKCZHKEwpLT5sX3JlZ2lzdHJ5KTsKKyAgY29uc3QgVFZhbHVlICpndDsgIC8qIGdsb2JhbCB0YWJsZSAqLworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIDEpOworICBndCA9IGx1YUhfZ2V0aW50KHJlZywgTFVBX1JJRFhfR0xPQkFMUyk7CisgIHNldHN2YWx1ZTJzKEwsIEwtPnRvcCsrLCBsdWFTX25ldyhMLCB2YXIpKTsKKyAgbHVhVl9zZXR0YWJsZShMLCBndCwgTC0+dG9wIC0gMSwgTC0+dG9wIC0gMik7CisgIEwtPnRvcCAtPSAyOyAgLyogcG9wIHZhbHVlIGFuZCBrZXkgKi8KKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3NldHRhYmxlIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgdDsKKyAgbHVhX2xvY2soTCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCAyKTsKKyAgdCA9IGluZGV4MmFkZHIoTCwgaWR4KTsKKyAgbHVhVl9zZXR0YWJsZShMLCB0LCBMLT50b3AgLSAyLCBMLT50b3AgLSAxKTsKKyAgTC0+dG9wIC09IDI7ICAvKiBwb3AgaW5kZXggYW5kIHZhbHVlICovCisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9zZXRmaWVsZCAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBjb25zdCBjaGFyICprKSB7CisgIFN0a0lkIHQ7CisgIGx1YV9sb2NrKEwpOworICBhcGlfY2hlY2tuZWxlbXMoTCwgMSk7CisgIHQgPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIHNldHN2YWx1ZTJzKEwsIEwtPnRvcCsrLCBsdWFTX25ldyhMLCBrKSk7CisgIGx1YVZfc2V0dGFibGUoTCwgdCwgTC0+dG9wIC0gMSwgTC0+dG9wIC0gMik7CisgIEwtPnRvcCAtPSAyOyAgLyogcG9wIHZhbHVlIGFuZCBrZXkgKi8KKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3Jhd3NldCAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIHQ7CisgIGx1YV9sb2NrKEwpOworICBhcGlfY2hlY2tuZWxlbXMoTCwgMik7CisgIHQgPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIGFwaV9jaGVjayhMLCB0dGlzdGFibGUodCksICJ0YWJsZSBleHBlY3RlZCIpOworICBzZXRvYmoydChMLCBsdWFIX3NldChMLCBodmFsdWUodCksIEwtPnRvcC0yKSwgTC0+dG9wLTEpOworICBpbnZhbGlkYXRlVE1jYWNoZShodmFsdWUodCkpOworICBsdWFDX2JhcnJpZXJiYWNrKEwsIGdjdmFsdWUodCksIEwtPnRvcC0xKTsKKyAgTC0+dG9wIC09IDI7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9yYXdzZXRpIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGludCBuKSB7CisgIFN0a0lkIHQ7CisgIGx1YV9sb2NrKEwpOworICBhcGlfY2hlY2tuZWxlbXMoTCwgMSk7CisgIHQgPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIGFwaV9jaGVjayhMLCB0dGlzdGFibGUodCksICJ0YWJsZSBleHBlY3RlZCIpOworICBsdWFIX3NldGludChMLCBodmFsdWUodCksIG4sIEwtPnRvcCAtIDEpOworICBsdWFDX2JhcnJpZXJiYWNrKEwsIGdjdmFsdWUodCksIEwtPnRvcC0xKTsKKyAgTC0+dG9wLS07CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9yYXdzZXRwIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGNvbnN0IHZvaWQgKnApIHsKKyAgU3RrSWQgdDsKKyAgVFZhbHVlIGs7CisgIGx1YV9sb2NrKEwpOworICBhcGlfY2hlY2tuZWxlbXMoTCwgMSk7CisgIHQgPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIGFwaV9jaGVjayhMLCB0dGlzdGFibGUodCksICJ0YWJsZSBleHBlY3RlZCIpOworICBzZXRwdmFsdWUoJmssIGNhc3Qodm9pZCAqLCBwKSk7CisgIHNldG9iajJ0KEwsIGx1YUhfc2V0KEwsIGh2YWx1ZSh0KSwgJmspLCBMLT50b3AgLSAxKTsKKyAgbHVhQ19iYXJyaWVyYmFjayhMLCBnY3ZhbHVlKHQpLCBMLT50b3AgLSAxKTsKKyAgTC0+dG9wLS07CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX3NldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgb2JqaW5kZXgpIHsKKyAgVFZhbHVlICpvYmo7CisgIFRhYmxlICptdDsKKyAgbHVhX2xvY2soTCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCAxKTsKKyAgb2JqID0gaW5kZXgyYWRkcihMLCBvYmppbmRleCk7CisgIGlmICh0dGlzbmlsKEwtPnRvcCAtIDEpKQorICAgIG10ID0gTlVMTDsKKyAgZWxzZSB7CisgICAgYXBpX2NoZWNrKEwsIHR0aXN0YWJsZShMLT50b3AgLSAxKSwgInRhYmxlIGV4cGVjdGVkIik7CisgICAgbXQgPSBodmFsdWUoTC0+dG9wIC0gMSk7CisgIH0KKyAgc3dpdGNoICh0dHlwZW52KG9iaikpIHsKKyAgICBjYXNlIExVQV9UVEFCTEU6IHsKKyAgICAgIGh2YWx1ZShvYmopLT5tZXRhdGFibGUgPSBtdDsKKyAgICAgIGlmIChtdCkgeworICAgICAgICBsdWFDX29iamJhcnJpZXJiYWNrKEwsIGdjdmFsdWUob2JqKSwgbXQpOworICAgICAgICBsdWFDX2NoZWNrZmluYWxpemVyKEwsIGdjdmFsdWUob2JqKSwgbXQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX1RVU0VSREFUQTogeworICAgICAgdXZhbHVlKG9iaiktPm1ldGF0YWJsZSA9IG10OworICAgICAgaWYgKG10KSB7CisgICAgICAgIGx1YUNfb2JqYmFycmllcihMLCByYXd1dmFsdWUob2JqKSwgbXQpOworICAgICAgICBsdWFDX2NoZWNrZmluYWxpemVyKEwsIGdjdmFsdWUob2JqKSwgbXQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIEcoTCktPm10W3R0eXBlbnYob2JqKV0gPSBtdDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBMLT50b3AtLTsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIDE7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9zZXR1c2VydmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCkgeworICBTdGtJZCBvOworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIDEpOworICBvID0gaW5kZXgyYWRkcihMLCBpZHgpOworICBhcGlfY2hlY2soTCwgdHRpc3VzZXJkYXRhKG8pLCAidXNlcmRhdGEgZXhwZWN0ZWQiKTsKKyAgaWYgKHR0aXNuaWwoTC0+dG9wIC0gMSkpCisgICAgdXZhbHVlKG8pLT5lbnYgPSBOVUxMOworICBlbHNlIHsKKyAgICBhcGlfY2hlY2soTCwgdHRpc3RhYmxlKEwtPnRvcCAtIDEpLCAidGFibGUgZXhwZWN0ZWQiKTsKKyAgICB1dmFsdWUobyktPmVudiA9IGh2YWx1ZShMLT50b3AgLSAxKTsKKyAgICBsdWFDX29iamJhcnJpZXIoTCwgZ2N2YWx1ZShvKSwgaHZhbHVlKEwtPnRvcCAtIDEpKTsKKyAgfQorICBMLT50b3AtLTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCisvKgorKiogYGxvYWQnIGFuZCBgY2FsbCcgZnVuY3Rpb25zIChydW4gTHVhIGNvZGUpCisqLworCisKKyNkZWZpbmUgY2hlY2tyZXN1bHRzKEwsbmEsbnIpIFwKKyAgICAgYXBpX2NoZWNrKEwsIChucikgPT0gTFVBX01VTFRSRVQgfHwgKEwtPmNpLT50b3AgLSBMLT50b3AgPj0gKG5yKSAtIChuYSkpLCBcCisJInJlc3VsdHMgZnJvbSBmdW5jdGlvbiBvdmVyZmxvdyBjdXJyZW50IHN0YWNrIHNpemUiKQorCisKK0xVQV9BUEkgaW50IGx1YV9nZXRjdHggKGx1YV9TdGF0ZSAqTCwgaW50ICpjdHgpIHsKKyAgaWYgKEwtPmNpLT5jYWxsc3RhdHVzICYgQ0lTVF9ZSUVMREVEKSB7CisgICAgaWYgKGN0eCkgKmN0eCA9IEwtPmNpLT51LmMuY3R4OworICAgIHJldHVybiBMLT5jaS0+dS5jLnN0YXR1czsKKyAgfQorICBlbHNlIHJldHVybiBMVUFfT0s7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9jYWxsayAobHVhX1N0YXRlICpMLCBpbnQgbmFyZ3MsIGludCBucmVzdWx0cywgaW50IGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGx1YV9DRnVuY3Rpb24gaykgeworICBTdGtJZCBmdW5jOworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrKEwsIGsgPT0gTlVMTCB8fCAhaXNMdWEoTC0+Y2kpLAorICAgICJjYW5ub3QgdXNlIGNvbnRpbnVhdGlvbnMgaW5zaWRlIGhvb2tzIik7CisgIGFwaV9jaGVja25lbGVtcyhMLCBuYXJncysxKTsKKyAgYXBpX2NoZWNrKEwsIEwtPnN0YXR1cyA9PSBMVUFfT0ssICJjYW5ub3QgZG8gY2FsbHMgb24gbm9uLW5vcm1hbCB0aHJlYWQiKTsKKyAgY2hlY2tyZXN1bHRzKEwsIG5hcmdzLCBucmVzdWx0cyk7CisgIGZ1bmMgPSBMLT50b3AgLSAobmFyZ3MrMSk7CisgIGlmIChrICE9IE5VTEwgJiYgTC0+bm55ID09IDApIHsgIC8qIG5lZWQgdG8gcHJlcGFyZSBjb250aW51YXRpb24/ICovCisgICAgTC0+Y2ktPnUuYy5rID0gazsgIC8qIHNhdmUgY29udGludWF0aW9uICovCisgICAgTC0+Y2ktPnUuYy5jdHggPSBjdHg7ICAvKiBzYXZlIGNvbnRleHQgKi8KKyAgICBsdWFEX2NhbGwoTCwgZnVuYywgbnJlc3VsdHMsIDEpOyAgLyogZG8gdGhlIGNhbGwgKi8KKyAgfQorICBlbHNlICAvKiBubyBjb250aW51YXRpb24gb3Igbm8geWllbGRhYmxlICovCisgICAgbHVhRF9jYWxsKEwsIGZ1bmMsIG5yZXN1bHRzLCAwKTsgIC8qIGp1c3QgZG8gdGhlIGNhbGwgKi8KKyAgYWRqdXN0cmVzdWx0cyhMLCBucmVzdWx0cyk7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworCisvKgorKiogRXhlY3V0ZSBhIHByb3RlY3RlZCBjYWxsLgorKi8KK3N0cnVjdCBDYWxsUyB7ICAvKiBkYXRhIHRvIGBmX2NhbGwnICovCisgIFN0a0lkIGZ1bmM7CisgIGludCBucmVzdWx0czsKK307CisKKworc3RhdGljIHZvaWQgZl9jYWxsIChsdWFfU3RhdGUgKkwsIHZvaWQgKnVkKSB7CisgIHN0cnVjdCBDYWxsUyAqYyA9IGNhc3Qoc3RydWN0IENhbGxTICosIHVkKTsKKyAgbHVhRF9jYWxsKEwsIGMtPmZ1bmMsIGMtPm5yZXN1bHRzLCAwKTsKK30KKworCisKK0xVQV9BUEkgaW50IGx1YV9wY2FsbGsgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmdzLCBpbnQgbnJlc3VsdHMsIGludCBlcnJmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN0eCwgbHVhX0NGdW5jdGlvbiBrKSB7CisgIHN0cnVjdCBDYWxsUyBjOworICBpbnQgc3RhdHVzOworICBwdHJkaWZmX3QgZnVuYzsKKyAgbHVhX2xvY2soTCk7CisgIGFwaV9jaGVjayhMLCBrID09IE5VTEwgfHwgIWlzTHVhKEwtPmNpKSwKKyAgICAiY2Fubm90IHVzZSBjb250aW51YXRpb25zIGluc2lkZSBob29rcyIpOworICBhcGlfY2hlY2tuZWxlbXMoTCwgbmFyZ3MrMSk7CisgIGFwaV9jaGVjayhMLCBMLT5zdGF0dXMgPT0gTFVBX09LLCAiY2Fubm90IGRvIGNhbGxzIG9uIG5vbi1ub3JtYWwgdGhyZWFkIik7CisgIGNoZWNrcmVzdWx0cyhMLCBuYXJncywgbnJlc3VsdHMpOworICBpZiAoZXJyZnVuYyA9PSAwKQorICAgIGZ1bmMgPSAwOworICBlbHNlIHsKKyAgICBTdGtJZCBvID0gaW5kZXgyYWRkcihMLCBlcnJmdW5jKTsKKyAgICBhcGlfY2hlY2tzdGFja2luZGV4KEwsIGVycmZ1bmMsIG8pOworICAgIGZ1bmMgPSBzYXZlc3RhY2soTCwgbyk7CisgIH0KKyAgYy5mdW5jID0gTC0+dG9wIC0gKG5hcmdzKzEpOyAgLyogZnVuY3Rpb24gdG8gYmUgY2FsbGVkICovCisgIGlmIChrID09IE5VTEwgfHwgTC0+bm55ID4gMCkgeyAgLyogbm8gY29udGludWF0aW9uIG9yIG5vIHlpZWxkYWJsZT8gKi8KKyAgICBjLm5yZXN1bHRzID0gbnJlc3VsdHM7ICAvKiBkbyBhICdjb252ZW50aW9uYWwnIHByb3RlY3RlZCBjYWxsICovCisgICAgc3RhdHVzID0gbHVhRF9wY2FsbChMLCBmX2NhbGwsICZjLCBzYXZlc3RhY2soTCwgYy5mdW5jKSwgZnVuYyk7CisgIH0KKyAgZWxzZSB7ICAvKiBwcmVwYXJlIGNvbnRpbnVhdGlvbiAoY2FsbCBpcyBhbHJlYWR5IHByb3RlY3RlZCBieSAncmVzdW1lJykgKi8KKyAgICBDYWxsSW5mbyAqY2kgPSBMLT5jaTsKKyAgICBjaS0+dS5jLmsgPSBrOyAgLyogc2F2ZSBjb250aW51YXRpb24gKi8KKyAgICBjaS0+dS5jLmN0eCA9IGN0eDsgIC8qIHNhdmUgY29udGV4dCAqLworICAgIC8qIHNhdmUgaW5mb3JtYXRpb24gZm9yIGVycm9yIHJlY292ZXJ5ICovCisgICAgY2ktPmV4dHJhID0gc2F2ZXN0YWNrKEwsIGMuZnVuYyk7CisgICAgY2ktPnUuYy5vbGRfYWxsb3dob29rID0gTC0+YWxsb3dob29rOworICAgIGNpLT51LmMub2xkX2VycmZ1bmMgPSBMLT5lcnJmdW5jOworICAgIEwtPmVycmZ1bmMgPSBmdW5jOworICAgIC8qIG1hcmsgdGhhdCBmdW5jdGlvbiBtYXkgZG8gZXJyb3IgcmVjb3ZlcnkgKi8KKyAgICBjaS0+Y2FsbHN0YXR1cyB8PSBDSVNUX1lQQ0FMTDsKKyAgICBsdWFEX2NhbGwoTCwgYy5mdW5jLCBucmVzdWx0cywgMSk7ICAvKiBkbyB0aGUgY2FsbCAqLworICAgIGNpLT5jYWxsc3RhdHVzICY9IH5DSVNUX1lQQ0FMTDsKKyAgICBMLT5lcnJmdW5jID0gY2ktPnUuYy5vbGRfZXJyZnVuYzsKKyAgICBzdGF0dXMgPSBMVUFfT0s7ICAvKiBpZiBpdCBpcyBoZXJlLCB0aGVyZSB3ZXJlIG5vIGVycm9ycyAqLworICB9CisgIGFkanVzdHJlc3VsdHMoTCwgbnJlc3VsdHMpOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gc3RhdHVzOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9sb2FkIChsdWFfU3RhdGUgKkwsIGx1YV9SZWFkZXIgcmVhZGVyLCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNodW5rbmFtZSwgY29uc3QgY2hhciAqbW9kZSkgeworICBaSU8gejsKKyAgaW50IHN0YXR1czsKKyAgbHVhX2xvY2soTCk7CisgIGlmICghY2h1bmtuYW1lKSBjaHVua25hbWUgPSAiPyI7CisgIGx1YVpfaW5pdChMLCAmeiwgcmVhZGVyLCBkYXRhKTsKKyAgc3RhdHVzID0gbHVhRF9wcm90ZWN0ZWRwYXJzZXIoTCwgJnosIGNodW5rbmFtZSwgbW9kZSk7CisgIGlmIChzdGF0dXMgPT0gTFVBX09LKSB7ICAvKiBubyBlcnJvcnM/ICovCisgICAgTENsb3N1cmUgKmYgPSBjbEx2YWx1ZShMLT50b3AgLSAxKTsgIC8qIGdldCBuZXdseSBjcmVhdGVkIGZ1bmN0aW9uICovCisgICAgaWYgKGYtPm51cHZhbHVlcyA9PSAxKSB7ICAvKiBkb2VzIGl0IGhhdmUgb25lIHVwdmFsdWU/ICovCisgICAgICAvKiBnZXQgZ2xvYmFsIHRhYmxlIGZyb20gcmVnaXN0cnkgKi8KKyAgICAgIFRhYmxlICpyZWcgPSBodmFsdWUoJkcoTCktPmxfcmVnaXN0cnkpOworICAgICAgY29uc3QgVFZhbHVlICpndCA9IGx1YUhfZ2V0aW50KHJlZywgTFVBX1JJRFhfR0xPQkFMUyk7CisgICAgICAvKiBzZXQgZ2xvYmFsIHRhYmxlIGFzIDFzdCB1cHZhbHVlIG9mICdmJyAobWF5IGJlIExVQV9FTlYpICovCisgICAgICBzZXRvYmooTCwgZi0+dXB2YWxzWzBdLT52LCBndCk7CisgICAgICBsdWFDX2JhcnJpZXIoTCwgZi0+dXB2YWxzWzBdLCBndCk7CisgICAgfQorICB9CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX2R1bXAgKGx1YV9TdGF0ZSAqTCwgbHVhX1dyaXRlciB3cml0ZXIsIHZvaWQgKmRhdGEpIHsKKyAgaW50IHN0YXR1czsKKyAgVFZhbHVlICpvOworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIDEpOworICBvID0gTC0+dG9wIC0gMTsKKyAgaWYgKGlzTGZ1bmN0aW9uKG8pKQorICAgIHN0YXR1cyA9IGx1YVVfZHVtcChMLCBnZXRwcm90byhvKSwgd3JpdGVyLCBkYXRhLCAwKTsKKyAgZWxzZQorICAgIHN0YXR1cyA9IDE7CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX3N0YXR1cyAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBMLT5zdGF0dXM7Cit9CisKKworLyoKKyoqIEdhcmJhZ2UtY29sbGVjdGlvbiBmdW5jdGlvbgorKi8KKworTFVBX0FQSSBpbnQgbHVhX2djIChsdWFfU3RhdGUgKkwsIGludCB3aGF0LCBpbnQgZGF0YSkgeworICBpbnQgcmVzID0gMDsKKyAgZ2xvYmFsX1N0YXRlICpnOworICBsdWFfbG9jayhMKTsKKyAgZyA9IEcoTCk7CisgIHN3aXRjaCAod2hhdCkgeworICAgIGNhc2UgTFVBX0dDU1RPUDogeworICAgICAgZy0+Z2NydW5uaW5nID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9HQ1JFU1RBUlQ6IHsKKyAgICAgIGx1YUVfc2V0ZGVidChnLCAwKTsKKyAgICAgIGctPmdjcnVubmluZyA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfR0NDT0xMRUNUOiB7CisgICAgICBsdWFDX2Z1bGxnYyhMLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9HQ0NPVU5UOiB7CisgICAgICAvKiBHQyB2YWx1ZXMgYXJlIGV4cHJlc3NlZCBpbiBLYnl0ZXM6ICNieXRlcy8yXjEwICovCisgICAgICByZXMgPSBjYXN0X2ludChnZXR0b3RhbGJ5dGVzKGcpID4+IDEwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9HQ0NPVU5UQjogeworICAgICAgcmVzID0gY2FzdF9pbnQoZ2V0dG90YWxieXRlcyhnKSAmIDB4M2ZmKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9HQ1NURVA6IHsKKyAgICAgIGlmIChnLT5nY2tpbmQgPT0gS0dDX0dFTikgeyAgLyogZ2VuZXJhdGlvbmFsIG1vZGU/ICovCisgICAgICAgIHJlcyA9IChnLT5HQ2VzdGltYXRlID09IDApOyAgLyogdHJ1ZSBpZiBpdCB3aWxsIGRvIG1ham9yIGNvbGxlY3Rpb24gKi8KKyAgICAgICAgbHVhQ19mb3JjZXN0ZXAoTCk7ICAvKiBkbyBhIHNpbmdsZSBzdGVwICovCisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICBsdV9tZW0gZGVidCA9IGNhc3QobHVfbWVtLCBkYXRhKSAqIDEwMjQgLSBHQ1NURVBTSVpFOworICAgICAgIGlmIChnLT5nY3J1bm5pbmcpCisgICAgICAgICBkZWJ0ICs9IGctPkdDZGVidDsgIC8qIGluY2x1ZGUgY3VycmVudCBkZWJ0ICovCisgICAgICAgbHVhRV9zZXRkZWJ0KGcsIGRlYnQpOworICAgICAgIGx1YUNfZm9yY2VzdGVwKEwpOworICAgICAgIGlmIChnLT5nY3N0YXRlID09IEdDU3BhdXNlKSAgLyogZW5kIG9mIGN5Y2xlPyAqLworICAgICAgICAgcmVzID0gMTsgIC8qIHNpZ25hbCBpdCAqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX0dDU0VUUEFVU0U6IHsKKyAgICAgIHJlcyA9IGctPmdjcGF1c2U7CisgICAgICBnLT5nY3BhdXNlID0gZGF0YTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9HQ1NFVE1BSk9SSU5DOiB7CisgICAgICByZXMgPSBnLT5nY21ham9yaW5jOworICAgICAgZy0+Z2NtYWpvcmluYyA9IGRhdGE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfR0NTRVRTVEVQTVVMOiB7CisgICAgICByZXMgPSBnLT5nY3N0ZXBtdWw7CisgICAgICBnLT5nY3N0ZXBtdWwgPSBkYXRhOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX0dDSVNSVU5OSU5HOiB7CisgICAgICByZXMgPSBnLT5nY3J1bm5pbmc7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfR0NHRU46IHsgIC8qIGNoYW5nZSBjb2xsZWN0b3IgdG8gZ2VuZXJhdGlvbmFsIG1vZGUgKi8KKyAgICAgIGx1YUNfY2hhbmdlbW9kZShMLCBLR0NfR0VOKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9HQ0lOQzogeyAgLyogY2hhbmdlIGNvbGxlY3RvciB0byBpbmNyZW1lbnRhbCBtb2RlICovCisgICAgICBsdWFDX2NoYW5nZW1vZGUoTCwgS0dDX05PUk1BTCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogcmVzID0gLTE7ICAvKiBpbnZhbGlkIG9wdGlvbiAqLworICB9CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiByZXM7Cit9CisKKworCisvKgorKiogbWlzY2VsbGFuZW91cyBmdW5jdGlvbnMKKyovCisKKworTFVBX0FQSSBpbnQgbHVhX2Vycm9yIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX2xvY2soTCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCAxKTsKKyAgbHVhR19lcnJvcm1zZyhMKTsKKyAgLyogY29kZSB1bnJlYWNoYWJsZTsgd2lsbCB1bmxvY2sgd2hlbiBjb250cm9sIGFjdHVhbGx5IGxlYXZlcyB0aGUga2VybmVsICovCisgIHJldHVybiAwOyAgLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KK30KKworCitMVUFfQVBJIGludCBsdWFfbmV4dCAobHVhX1N0YXRlICpMLCBpbnQgaWR4KSB7CisgIFN0a0lkIHQ7CisgIGludCBtb3JlOworICBsdWFfbG9jayhMKTsKKyAgdCA9IGluZGV4MmFkZHIoTCwgaWR4KTsKKyAgYXBpX2NoZWNrKEwsIHR0aXN0YWJsZSh0KSwgInRhYmxlIGV4cGVjdGVkIik7CisgIG1vcmUgPSBsdWFIX25leHQoTCwgaHZhbHVlKHQpLCBMLT50b3AgLSAxKTsKKyAgaWYgKG1vcmUpIHsKKyAgICBhcGlfaW5jcl90b3AoTCk7CisgIH0KKyAgZWxzZSAgLyogbm8gbW9yZSBlbGVtZW50cyAqLworICAgIEwtPnRvcCAtPSAxOyAgLyogcmVtb3ZlIGtleSAqLworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gbW9yZTsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX2NvbmNhdCAobHVhX1N0YXRlICpMLCBpbnQgbikgeworICBsdWFfbG9jayhMKTsKKyAgYXBpX2NoZWNrbmVsZW1zKEwsIG4pOworICBpZiAobiA+PSAyKSB7CisgICAgbHVhQ19jaGVja0dDKEwpOworICAgIGx1YVZfY29uY2F0KEwsIG4pOworICB9CisgIGVsc2UgaWYgKG4gPT0gMCkgeyAgLyogcHVzaCBlbXB0eSBzdHJpbmcgKi8KKyAgICBzZXRzdmFsdWUycyhMLCBMLT50b3AsIGx1YVNfbmV3bHN0cihMLCAiIiwgMCkpOworICAgIGFwaV9pbmNyX3RvcChMKTsKKyAgfQorICAvKiBlbHNlIG4gPT0gMTsgbm90aGluZyB0byBkbyAqLworICBsdWFfdW5sb2NrKEwpOworfQorCisKK0xVQV9BUEkgdm9pZCBsdWFfbGVuIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgU3RrSWQgdDsKKyAgbHVhX2xvY2soTCk7CisgIHQgPSBpbmRleDJhZGRyKEwsIGlkeCk7CisgIGx1YVZfb2JqbGVuKEwsIEwtPnRvcCwgdCk7CisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhX3VubG9jayhMKTsKK30KKworCitMVUFfQVBJIGx1YV9BbGxvYyBsdWFfZ2V0YWxsb2NmIChsdWFfU3RhdGUgKkwsIHZvaWQgKip1ZCkgeworICBsdWFfQWxsb2MgZjsKKyAgbHVhX2xvY2soTCk7CisgIGlmICh1ZCkgKnVkID0gRyhMKS0+dWQ7CisgIGYgPSBHKEwpLT5mcmVhbGxvYzsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIGY7Cit9CisKKworTFVBX0FQSSB2b2lkIGx1YV9zZXRhbGxvY2YgKGx1YV9TdGF0ZSAqTCwgbHVhX0FsbG9jIGYsIHZvaWQgKnVkKSB7CisgIGx1YV9sb2NrKEwpOworICBHKEwpLT51ZCA9IHVkOworICBHKEwpLT5mcmVhbGxvYyA9IGY7CisgIGx1YV91bmxvY2soTCk7Cit9CisKKworTFVBX0FQSSB2b2lkICpsdWFfbmV3dXNlcmRhdGEgKGx1YV9TdGF0ZSAqTCwgc2l6ZV90IHNpemUpIHsKKyAgVWRhdGEgKnU7CisgIGx1YV9sb2NrKEwpOworICBsdWFDX2NoZWNrR0MoTCk7CisgIHUgPSBsdWFTX25ld3VkYXRhKEwsIHNpemUsIE5VTEwpOworICBzZXR1dmFsdWUoTCwgTC0+dG9wLCB1KTsKKyAgYXBpX2luY3JfdG9wKEwpOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gdSArIDE7Cit9CisKKworCitzdGF0aWMgY29uc3QgY2hhciAqYXV4X3VwdmFsdWUgKFN0a0lkIGZpLCBpbnQgbiwgVFZhbHVlICoqdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ09iamVjdCAqKm93bmVyKSB7CisgIHN3aXRjaCAodHR5cGUoZmkpKSB7CisgICAgY2FzZSBMVUFfVENDTDogeyAgLyogQyBjbG9zdXJlICovCisgICAgICBDQ2xvc3VyZSAqZiA9IGNsQ3ZhbHVlKGZpKTsKKyAgICAgIGlmICghKDEgPD0gbiAmJiBuIDw9IGYtPm51cHZhbHVlcykpIHJldHVybiBOVUxMOworICAgICAgKnZhbCA9ICZmLT51cHZhbHVlW24tMV07CisgICAgICBpZiAob3duZXIpICpvd25lciA9IG9iajJnY28oZik7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIGNhc2UgTFVBX1RMQ0w6IHsgIC8qIEx1YSBjbG9zdXJlICovCisgICAgICBMQ2xvc3VyZSAqZiA9IGNsTHZhbHVlKGZpKTsKKyAgICAgIFRTdHJpbmcgKm5hbWU7CisgICAgICBQcm90byAqcCA9IGYtPnA7CisgICAgICBpZiAoISgxIDw9IG4gJiYgbiA8PSBwLT5zaXpldXB2YWx1ZXMpKSByZXR1cm4gTlVMTDsKKyAgICAgICp2YWwgPSBmLT51cHZhbHNbbi0xXS0+djsKKyAgICAgIGlmIChvd25lcikgKm93bmVyID0gb2JqMmdjbyhmLT51cHZhbHNbbiAtIDFdKTsKKyAgICAgIG5hbWUgPSBwLT51cHZhbHVlc1tuLTFdLm5hbWU7CisgICAgICByZXR1cm4gKG5hbWUgPT0gTlVMTCkgPyAiIiA6IGdldHN0cihuYW1lKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7ICAvKiBub3QgYSBjbG9zdXJlICovCisgIH0KK30KKworCitMVUFfQVBJIGNvbnN0IGNoYXIgKmx1YV9nZXR1cHZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBmdW5jaW5kZXgsIGludCBuKSB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIFRWYWx1ZSAqdmFsID0gTlVMTDsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgIGx1YV9sb2NrKEwpOworICBuYW1lID0gYXV4X3VwdmFsdWUoaW5kZXgyYWRkcihMLCBmdW5jaW5kZXgpLCBuLCAmdmFsLCBOVUxMKTsKKyAgaWYgKG5hbWUpIHsKKyAgICBzZXRvYmoycyhMLCBMLT50b3AsIHZhbCk7CisgICAgYXBpX2luY3JfdG9wKEwpOworICB9CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBuYW1lOworfQorCisKK0xVQV9BUEkgY29uc3QgY2hhciAqbHVhX3NldHVwdmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGZ1bmNpbmRleCwgaW50IG4pIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgVFZhbHVlICp2YWwgPSBOVUxMOyAgLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KKyAgR0NPYmplY3QgKm93bmVyID0gTlVMTDsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgIFN0a0lkIGZpOworICBsdWFfbG9jayhMKTsKKyAgZmkgPSBpbmRleDJhZGRyKEwsIGZ1bmNpbmRleCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCAxKTsKKyAgbmFtZSA9IGF1eF91cHZhbHVlKGZpLCBuLCAmdmFsLCAmb3duZXIpOworICBpZiAobmFtZSkgeworICAgIEwtPnRvcC0tOworICAgIHNldG9iaihMLCB2YWwsIEwtPnRvcCk7CisgICAgbHVhQ19iYXJyaWVyKEwsIG93bmVyLCBMLT50b3ApOworICB9CisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBuYW1lOworfQorCisKK3N0YXRpYyBVcFZhbCAqKmdldHVwdmFscmVmIChsdWFfU3RhdGUgKkwsIGludCBmaWR4LCBpbnQgbiwgTENsb3N1cmUgKipwZikgeworICBMQ2xvc3VyZSAqZjsKKyAgU3RrSWQgZmkgPSBpbmRleDJhZGRyKEwsIGZpZHgpOworICBhcGlfY2hlY2soTCwgdHRpc0xjbG9zdXJlKGZpKSwgIkx1YSBmdW5jdGlvbiBleHBlY3RlZCIpOworICBmID0gY2xMdmFsdWUoZmkpOworICBhcGlfY2hlY2soTCwgKDEgPD0gbiAmJiBuIDw9IGYtPnAtPnNpemV1cHZhbHVlcyksICJpbnZhbGlkIHVwdmFsdWUgaW5kZXgiKTsKKyAgaWYgKHBmKSAqcGYgPSBmOworICByZXR1cm4gJmYtPnVwdmFsc1tuIC0gMV07ICAvKiBnZXQgaXRzIHVwdmFsdWUgcG9pbnRlciAqLworfQorCisKK0xVQV9BUEkgdm9pZCAqbHVhX3VwdmFsdWVpZCAobHVhX1N0YXRlICpMLCBpbnQgZmlkeCwgaW50IG4pIHsKKyAgU3RrSWQgZmkgPSBpbmRleDJhZGRyKEwsIGZpZHgpOworICBzd2l0Y2ggKHR0eXBlKGZpKSkgeworICAgIGNhc2UgTFVBX1RMQ0w6IHsgIC8qIGx1YSBjbG9zdXJlICovCisgICAgICByZXR1cm4gKmdldHVwdmFscmVmKEwsIGZpZHgsIG4sIE5VTEwpOworICAgIH0KKyAgICBjYXNlIExVQV9UQ0NMOiB7ICAvKiBDIGNsb3N1cmUgKi8KKyAgICAgIENDbG9zdXJlICpmID0gY2xDdmFsdWUoZmkpOworICAgICAgYXBpX2NoZWNrKEwsIDEgPD0gbiAmJiBuIDw9IGYtPm51cHZhbHVlcywgImludmFsaWQgdXB2YWx1ZSBpbmRleCIpOworICAgICAgcmV0dXJuICZmLT51cHZhbHVlW24gLSAxXTsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgYXBpX2NoZWNrKEwsIDAsICJjbG9zdXJlIGV4cGVjdGVkIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KK30KKworCitMVUFfQVBJIHZvaWQgbHVhX3VwdmFsdWVqb2luIChsdWFfU3RhdGUgKkwsIGludCBmaWR4MSwgaW50IG4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlkeDIsIGludCBuMikgeworICBMQ2xvc3VyZSAqZjE7CisgIFVwVmFsICoqdXAxID0gZ2V0dXB2YWxyZWYoTCwgZmlkeDEsIG4xLCAmZjEpOworICBVcFZhbCAqKnVwMiA9IGdldHVwdmFscmVmKEwsIGZpZHgyLCBuMiwgTlVMTCk7CisgICp1cDEgPSAqdXAyOworICBsdWFDX29iamJhcnJpZXIoTCwgZjEsICp1cDIpOworfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xhcGkuaCBiL2NvbTMyL2x1YS9zcmMvbGFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDM0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xhcGkuaApAQCAtMCwwICsxLDI0IEBACisvKgorKiogJElkOiBsYXBpLmgsdiAyLjcuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmcm9tIEx1YSBBUEkKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaWZuZGVmIGxhcGlfaAorI2RlZmluZSBsYXBpX2gKKworCisjaW5jbHVkZSAibGxpbWl0cy5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorCisjZGVmaW5lIGFwaV9pbmNyX3RvcChMKSAgIHtMLT50b3ArKzsgYXBpX2NoZWNrKEwsIEwtPnRvcCA8PSBMLT5jaS0+dG9wLCBcCisJCQkJInN0YWNrIG92ZXJmbG93Iik7fQorCisjZGVmaW5lIGFkanVzdHJlc3VsdHMoTCxucmVzKSBcCisgICAgeyBpZiAoKG5yZXMpID09IExVQV9NVUxUUkVUICYmIEwtPmNpLT50b3AgPCBMLT50b3ApIEwtPmNpLT50b3AgPSBMLT50b3A7IH0KKworI2RlZmluZSBhcGlfY2hlY2tuZWxlbXMoTCxuKQlhcGlfY2hlY2soTCwgKG4pIDwgKEwtPnRvcCAtIEwtPmNpLT5mdW5jKSwgXAorCQkJCSAgIm5vdCBlbm91Z2ggZWxlbWVudHMgaW4gdGhlIHN0YWNrIikKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGF1eGxpYi5jIGIvY29tMzIvbHVhL3NyYy9sYXV4bGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjOTI5NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbGF1eGxpYi5jCkBAIC0wLDAgKzEsOTYxIEBACisvKgorKiogJElkOiBsYXV4bGliLmMsdiAxLjI0OC4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciBidWlsZGluZyBMdWEgbGlicmFyaWVzCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKy8qIFRoaXMgZmlsZSB1c2VzIG9ubHkgdGhlIG9mZmljaWFsIEFQSSBvZiBMdWEuCisqKiBBbnkgZnVuY3Rpb24gZGVjbGFyZWQgaGVyZSBjb3VsZCBiZSB3cml0dGVuIGFzIGFuIGFwcGxpY2F0aW9uIGZ1bmN0aW9uLgorKi8KKworI2RlZmluZSBsYXV4bGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFRyYWNlYmFjaworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCisjZGVmaW5lIExFVkVMUzEJMTIJLyogc2l6ZSBvZiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhY2sgKi8KKyNkZWZpbmUgTEVWRUxTMgkxMAkvKiBzaXplIG9mIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgc3RhY2sgKi8KKworCisKKy8qCisqKiBzZWFyY2ggZm9yICdvYmppZHgnIGluIHRhYmxlIGF0IGluZGV4IC0xLgorKiogcmV0dXJuIDEgKyBzdHJpbmcgYXQgdG9wIGlmIGZpbmQgYSBnb29kIG5hbWUuCisqLworc3RhdGljIGludCBmaW5kZmllbGQgKGx1YV9TdGF0ZSAqTCwgaW50IG9iamlkeCwgaW50IGxldmVsKSB7CisgIGlmIChsZXZlbCA9PSAwIHx8ICFsdWFfaXN0YWJsZShMLCAtMSkpCisgICAgcmV0dXJuIDA7ICAvKiBub3QgZm91bmQgKi8KKyAgbHVhX3B1c2huaWwoTCk7ICAvKiBzdGFydCAnbmV4dCcgbG9vcCAqLworICB3aGlsZSAobHVhX25leHQoTCwgLTIpKSB7ICAvKiBmb3IgZWFjaCBwYWlyIGluIHRhYmxlICovCisgICAgaWYgKGx1YV90eXBlKEwsIC0yKSA9PSBMVUFfVFNUUklORykgeyAgLyogaWdub3JlIG5vbi1zdHJpbmcga2V5cyAqLworICAgICAgaWYgKGx1YV9yYXdlcXVhbChMLCBvYmppZHgsIC0xKSkgeyAgLyogZm91bmQgb2JqZWN0PyAqLworICAgICAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIHZhbHVlIChidXQga2VlcCBuYW1lKSAqLworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGZpbmRmaWVsZChMLCBvYmppZHgsIGxldmVsIC0gMSkpIHsgIC8qIHRyeSByZWN1cnNpdmVseSAqLworICAgICAgICBsdWFfcmVtb3ZlKEwsIC0yKTsgIC8qIHJlbW92ZSB0YWJsZSAoYnV0IGtlZXAgbmFtZSkgKi8KKyAgICAgICAgbHVhX3B1c2hsaXRlcmFsKEwsICIuIik7CisgICAgICAgIGx1YV9pbnNlcnQoTCwgLTIpOyAgLyogcGxhY2UgJy4nIGJldHdlZW4gdGhlIHR3byBuYW1lcyAqLworICAgICAgICBsdWFfY29uY2F0KEwsIDMpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgICAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSB2YWx1ZSAqLworICB9CisgIHJldHVybiAwOyAgLyogbm90IGZvdW5kICovCit9CisKKworc3RhdGljIGludCBwdXNoZ2xvYmFsZnVuY25hbWUgKGx1YV9TdGF0ZSAqTCwgbHVhX0RlYnVnICphcikgeworICBpbnQgdG9wID0gbHVhX2dldHRvcChMKTsKKyAgbHVhX2dldGluZm8oTCwgImYiLCBhcik7ICAvKiBwdXNoIGZ1bmN0aW9uICovCisgIGx1YV9wdXNoZ2xvYmFsdGFibGUoTCk7CisgIGlmIChmaW5kZmllbGQoTCwgdG9wICsgMSwgMikpIHsKKyAgICBsdWFfY29weShMLCAtMSwgdG9wICsgMSk7ICAvKiBtb3ZlIG5hbWUgdG8gcHJvcGVyIHBsYWNlICovCisgICAgbHVhX3BvcChMLCAyKTsgIC8qIHJlbW92ZSBwdXNoZWQgdmFsdWVzICovCisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSB7CisgICAgbHVhX3NldHRvcChMLCB0b3ApOyAgLyogcmVtb3ZlIGZ1bmN0aW9uIGFuZCBnbG9iYWwgdGFibGUgKi8KKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHB1c2hmdW5jbmFtZSAobHVhX1N0YXRlICpMLCBsdWFfRGVidWcgKmFyKSB7CisgIGlmICgqYXItPm5hbWV3aGF0ICE9ICdcMCcpICAvKiBpcyB0aGVyZSBhIG5hbWU/ICovCisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJmdW5jdGlvbiAiIExVQV9RUywgYXItPm5hbWUpOworICBlbHNlIGlmICgqYXItPndoYXQgPT0gJ20nKSAgLyogbWFpbj8gKi8KKyAgICAgIGx1YV9wdXNobGl0ZXJhbChMLCAibWFpbiBjaHVuayIpOworICBlbHNlIGlmICgqYXItPndoYXQgPT0gJ0MnKSB7CisgICAgaWYgKHB1c2hnbG9iYWxmdW5jbmFtZShMLCBhcikpIHsKKyAgICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiZnVuY3Rpb24gIiBMVUFfUVMsIGx1YV90b3N0cmluZyhMLCAtMSkpOworICAgICAgbHVhX3JlbW92ZShMLCAtMik7ICAvKiByZW1vdmUgbmFtZSAqLworICAgIH0KKyAgICBlbHNlCisgICAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIj8iKTsKKyAgfQorICBlbHNlCisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJmdW5jdGlvbiA8JXM6JWQ+IiwgYXItPnNob3J0X3NyYywgYXItPmxpbmVkZWZpbmVkKTsKK30KKworCitzdGF0aWMgaW50IGNvdW50bGV2ZWxzIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX0RlYnVnIGFyOworICBpbnQgbGkgPSAxLCBsZSA9IDE7CisgIC8qIGZpbmQgYW4gdXBwZXIgYm91bmQgKi8KKyAgd2hpbGUgKGx1YV9nZXRzdGFjayhMLCBsZSwgJmFyKSkgeyBsaSA9IGxlOyBsZSAqPSAyOyB9CisgIC8qIGRvIGEgYmluYXJ5IHNlYXJjaCAqLworICB3aGlsZSAobGkgPCBsZSkgeworICAgIGludCBtID0gKGxpICsgbGUpLzI7CisgICAgaWYgKGx1YV9nZXRzdGFjayhMLCBtLCAmYXIpKSBsaSA9IG0gKyAxOworICAgIGVsc2UgbGUgPSBtOworICB9CisgIHJldHVybiBsZSAtIDE7Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfdHJhY2ViYWNrIChsdWFfU3RhdGUgKkwsIGx1YV9TdGF0ZSAqTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZywgaW50IGxldmVsKSB7CisgIGx1YV9EZWJ1ZyBhcjsKKyAgaW50IHRvcCA9IGx1YV9nZXR0b3AoTCk7CisgIGludCBudW1sZXZlbHMgPSBjb3VudGxldmVscyhMMSk7CisgIGludCBtYXJrID0gKG51bWxldmVscyA+IExFVkVMUzEgKyBMRVZFTFMyKSA/IExFVkVMUzEgOiAwOworICBpZiAobXNnKSBsdWFfcHVzaGZzdHJpbmcoTCwgIiVzXG4iLCBtc2cpOworICBsdWFfcHVzaGxpdGVyYWwoTCwgInN0YWNrIHRyYWNlYmFjazoiKTsKKyAgd2hpbGUgKGx1YV9nZXRzdGFjayhMMSwgbGV2ZWwrKywgJmFyKSkgeworICAgIGlmIChsZXZlbCA9PSBtYXJrKSB7ICAvKiB0b28gbWFueSBsZXZlbHM/ICovCisgICAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIlxuXHQuLi4iKTsgIC8qIGFkZCBhICcuLi4nICovCisgICAgICBsZXZlbCA9IG51bWxldmVscyAtIExFVkVMUzI7ICAvKiBhbmQgc2tpcCB0byBsYXN0IG9uZXMgKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBsdWFfZ2V0aW5mbyhMMSwgIlNsbnQiLCAmYXIpOworICAgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJcblx0JXM6IiwgYXIuc2hvcnRfc3JjKTsKKyAgICAgIGlmIChhci5jdXJyZW50bGluZSA+IDApCisgICAgICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiJWQ6IiwgYXIuY3VycmVudGxpbmUpOworICAgICAgbHVhX3B1c2hsaXRlcmFsKEwsICIgaW4gIik7CisgICAgICBwdXNoZnVuY25hbWUoTCwgJmFyKTsKKyAgICAgIGlmIChhci5pc3RhaWxjYWxsKQorICAgICAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIlxuXHQoLi4udGFpbCBjYWxscy4uLikiKTsKKyAgICAgIGx1YV9jb25jYXQoTCwgbHVhX2dldHRvcChMKSAtIHRvcCk7CisgICAgfQorICB9CisgIGx1YV9jb25jYXQoTCwgbHVhX2dldHRvcChMKSAtIHRvcCk7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogRXJyb3ItcmVwb3J0IGZ1bmN0aW9ucworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworTFVBTElCX0FQSSBpbnQgbHVhTF9hcmdlcnJvciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgY29uc3QgY2hhciAqZXh0cmFtc2cpIHsKKyAgbHVhX0RlYnVnIGFyOworICBpZiAoIWx1YV9nZXRzdGFjayhMLCAwLCAmYXIpKSAgLyogbm8gc3RhY2sgZnJhbWU/ICovCisgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgImJhZCBhcmd1bWVudCAjJWQgKCVzKSIsIG5hcmcsIGV4dHJhbXNnKTsKKyAgbHVhX2dldGluZm8oTCwgIm4iLCAmYXIpOworICBpZiAoc3RyY21wKGFyLm5hbWV3aGF0LCAibWV0aG9kIikgPT0gMCkgeworICAgIG5hcmctLTsgIC8qIGRvIG5vdCBjb3VudCBgc2VsZicgKi8KKyAgICBpZiAobmFyZyA9PSAwKSAgLyogZXJyb3IgaXMgaW4gdGhlIHNlbGYgYXJndW1lbnQgaXRzZWxmPyAqLworICAgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgImNhbGxpbmcgIiBMVUFfUVMgIiBvbiBiYWQgc2VsZiAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyLm5hbWUsIGV4dHJhbXNnKTsKKyAgfQorICBpZiAoYXIubmFtZSA9PSBOVUxMKQorICAgIGFyLm5hbWUgPSAocHVzaGdsb2JhbGZ1bmNuYW1lKEwsICZhcikpID8gbHVhX3Rvc3RyaW5nKEwsIC0xKSA6ICI/IjsKKyAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgImJhZCBhcmd1bWVudCAjJWQgdG8gIiBMVUFfUVMgIiAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hcmcsIGFyLm5hbWUsIGV4dHJhbXNnKTsKK30KKworCitzdGF0aWMgaW50IHR5cGVlcnJvciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgY29uc3QgY2hhciAqdG5hbWUpIHsKKyAgY29uc3QgY2hhciAqbXNnID0gbHVhX3B1c2hmc3RyaW5nKEwsICIlcyBleHBlY3RlZCwgZ290ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuYW1lLCBsdWFMX3R5cGVuYW1lKEwsIG5hcmcpKTsKKyAgcmV0dXJuIGx1YUxfYXJnZXJyb3IoTCwgbmFyZywgbXNnKTsKK30KKworCitzdGF0aWMgdm9pZCB0YWdfZXJyb3IgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIGludCB0YWcpIHsKKyAgdHlwZWVycm9yKEwsIG5hcmcsIGx1YV90eXBlbmFtZShMLCB0YWcpKTsKK30KKworCitMVUFMSUJfQVBJIHZvaWQgbHVhTF93aGVyZSAobHVhX1N0YXRlICpMLCBpbnQgbGV2ZWwpIHsKKyAgbHVhX0RlYnVnIGFyOworICBpZiAobHVhX2dldHN0YWNrKEwsIGxldmVsLCAmYXIpKSB7ICAvKiBjaGVjayBmdW5jdGlvbiBhdCBsZXZlbCAqLworICAgIGx1YV9nZXRpbmZvKEwsICJTbCIsICZhcik7ICAvKiBnZXQgaW5mbyBhYm91dCBpdCAqLworICAgIGlmIChhci5jdXJyZW50bGluZSA+IDApIHsgIC8qIGlzIHRoZXJlIGluZm8/ICovCisgICAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVzOiVkOiAiLCBhci5zaG9ydF9zcmMsIGFyLmN1cnJlbnRsaW5lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgbHVhX3B1c2hsaXRlcmFsKEwsICIiKTsgIC8qIGVsc2UsIG5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4uLiAqLworfQorCisKK0xVQUxJQl9BUEkgaW50IGx1YUxfZXJyb3IgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdwOworICB2YV9zdGFydChhcmdwLCBmbXQpOworICBsdWFMX3doZXJlKEwsIDEpOworICBsdWFfcHVzaHZmc3RyaW5nKEwsIGZtdCwgYXJncCk7CisgIHZhX2VuZChhcmdwKTsKKyAgbHVhX2NvbmNhdChMLCAyKTsKKyAgcmV0dXJuIGx1YV9lcnJvcihMKTsKK30KKworCitMVUFMSUJfQVBJIGludCBsdWFMX2ZpbGVyZXN1bHQgKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXQsIGNvbnN0IGNoYXIgKmZuYW1lKSB7CisgIGludCBlbiA9IGVycm5vOyAgLyogY2FsbHMgdG8gTHVhIEFQSSBtYXkgY2hhbmdlIHRoaXMgdmFsdWUgKi8KKyAgaWYgKHN0YXQpIHsKKyAgICBsdWFfcHVzaGJvb2xlYW4oTCwgMSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSB7CisgICAgbHVhX3B1c2huaWwoTCk7CisgICAgaWYgKGZuYW1lKQorICAgICAgbHVhX3B1c2hmc3RyaW5nKEwsICIlczogJXMiLCBmbmFtZSwgc3RyZXJyb3IoZW4pKTsKKyAgICBlbHNlCisgICAgICBsdWFfcHVzaHN0cmluZyhMLCBzdHJlcnJvcihlbikpOworICAgIGx1YV9wdXNoaW50ZWdlcihMLCBlbik7CisgICAgcmV0dXJuIDM7CisgIH0KK30KKworCisjaWYgIWRlZmluZWQoaW5zcGVjdHN0YXQpCS8qIHsgKi8KKworI2lmIGRlZmluZWQoTFVBX1VTRV9QT1NJWCkKKworI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKy8qCisqKiB1c2UgYXBwcm9wcmlhdGUgbWFjcm9zIHRvIGludGVycHJldCAncGNsb3NlJyByZXR1cm4gc3RhdHVzCisqLworI2RlZmluZSBpbnNwZWN0c3RhdChzdGF0LHdoYXQpICBcCisgICBpZiAoV0lGRVhJVEVEKHN0YXQpKSB7IHN0YXQgPSBXRVhJVFNUQVRVUyhzdGF0KTsgfSBcCisgICBlbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0KSkgeyBzdGF0ID0gV1RFUk1TSUcoc3RhdCk7IHdoYXQgPSAic2lnbmFsIjsgfQorCisjZWxzZQorCisjZGVmaW5lIGluc3BlY3RzdGF0KHN0YXQsd2hhdCkgIC8qIG5vIG9wICovCisKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogfSAqLworCisKK0xVQUxJQl9BUEkgaW50IGx1YUxfZXhlY3Jlc3VsdCAobHVhX1N0YXRlICpMLCBpbnQgc3RhdCkgeworICBjb25zdCBjaGFyICp3aGF0ID0gImV4aXQiOyAgLyogdHlwZSBvZiB0ZXJtaW5hdGlvbiAqLworICBpZiAoc3RhdCA9PSAtMSkgIC8qIGVycm9yPyAqLworICAgIHJldHVybiBsdWFMX2ZpbGVyZXN1bHQoTCwgMCwgTlVMTCk7CisgIGVsc2UgeworICAgIGluc3BlY3RzdGF0KHN0YXQsIHdoYXQpOyAgLyogaW50ZXJwcmV0IHJlc3VsdCAqLworICAgIGlmICgqd2hhdCA9PSAnZScgJiYgc3RhdCA9PSAwKSAgLyogc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbj8gKi8KKyAgICAgIGx1YV9wdXNoYm9vbGVhbihMLCAxKTsKKyAgICBlbHNlCisgICAgICBsdWFfcHVzaG5pbChMKTsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCB3aGF0KTsKKyAgICBsdWFfcHVzaGludGVnZXIoTCwgc3RhdCk7CisgICAgcmV0dXJuIDM7ICAvKiByZXR1cm4gdHJ1ZS9uaWwsd2hhdCxjb2RlICovCisgIH0KK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBVc2VyZGF0YSdzIG1ldGF0YWJsZSBtYW5pcHVsYXRpb24KKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK0xVQUxJQl9BUEkgaW50IGx1YUxfbmV3bWV0YXRhYmxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnRuYW1lKSB7CisgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIHRuYW1lKTsgIC8qIHRyeSB0byBnZXQgbWV0YXRhYmxlICovCisgIGlmICghbHVhX2lzbmlsKEwsIC0xKSkgIC8qIG5hbWUgYWxyZWFkeSBpbiB1c2U/ICovCisgICAgcmV0dXJuIDA7ICAvKiBsZWF2ZSBwcmV2aW91cyB2YWx1ZSBvbiB0b3AsIGJ1dCByZXR1cm4gMCAqLworICBsdWFfcG9wKEwsIDEpOworICBsdWFfbmV3dGFibGUoTCk7ICAvKiBjcmVhdGUgbWV0YXRhYmxlICovCisgIGx1YV9wdXNodmFsdWUoTCwgLTEpOworICBsdWFfc2V0ZmllbGQoTCwgTFVBX1JFR0lTVFJZSU5ERVgsIHRuYW1lKTsgIC8qIHJlZ2lzdHJ5Lm5hbWUgPSBtZXRhdGFibGUgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfc2V0bWV0YXRhYmxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnRuYW1lKSB7CisgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIHRuYW1lKTsKKyAgbHVhX3NldG1ldGF0YWJsZShMLCAtMik7Cit9CisKKworTFVBTElCX0FQSSB2b2lkICpsdWFMX3Rlc3R1ZGF0YSAobHVhX1N0YXRlICpMLCBpbnQgdWQsIGNvbnN0IGNoYXIgKnRuYW1lKSB7CisgIHZvaWQgKnAgPSBsdWFfdG91c2VyZGF0YShMLCB1ZCk7CisgIGlmIChwICE9IE5VTEwpIHsgIC8qIHZhbHVlIGlzIGEgdXNlcmRhdGE/ICovCisgICAgaWYgKGx1YV9nZXRtZXRhdGFibGUoTCwgdWQpKSB7ICAvKiBkb2VzIGl0IGhhdmUgYSBtZXRhdGFibGU/ICovCisgICAgICBsdWFMX2dldG1ldGF0YWJsZShMLCB0bmFtZSk7ICAvKiBnZXQgY29ycmVjdCBtZXRhdGFibGUgKi8KKyAgICAgIGlmICghbHVhX3Jhd2VxdWFsKEwsIC0xLCAtMikpICAvKiBub3QgdGhlIHNhbWU/ICovCisgICAgICAgIHAgPSBOVUxMOyAgLyogdmFsdWUgaXMgYSB1c2VyZGF0YSB3aXRoIHdyb25nIG1ldGF0YWJsZSAqLworICAgICAgbHVhX3BvcChMLCAyKTsgIC8qIHJlbW92ZSBib3RoIG1ldGF0YWJsZXMgKi8KKyAgICAgIHJldHVybiBwOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsgIC8qIHZhbHVlIGlzIG5vdCBhIHVzZXJkYXRhIHdpdGggYSBtZXRhdGFibGUgKi8KK30KKworCitMVUFMSUJfQVBJIHZvaWQgKmx1YUxfY2hlY2t1ZGF0YSAobHVhX1N0YXRlICpMLCBpbnQgdWQsIGNvbnN0IGNoYXIgKnRuYW1lKSB7CisgIHZvaWQgKnAgPSBsdWFMX3Rlc3R1ZGF0YShMLCB1ZCwgdG5hbWUpOworICBpZiAocCA9PSBOVUxMKSB0eXBlZXJyb3IoTCwgdWQsIHRuYW1lKTsKKyAgcmV0dXJuIHA7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogQXJndW1lbnQgY2hlY2sgZnVuY3Rpb25zCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitMVUFMSUJfQVBJIGludCBsdWFMX2NoZWNrb3B0aW9uIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLCBjb25zdCBjaGFyICpkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCBsc3RbXSkgeworICBjb25zdCBjaGFyICpuYW1lID0gKGRlZikgPyBsdWFMX29wdHN0cmluZyhMLCBuYXJnLCBkZWYpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhTF9jaGVja3N0cmluZyhMLCBuYXJnKTsKKyAgaW50IGk7CisgIGZvciAoaT0wOyBsc3RbaV07IGkrKykKKyAgICBpZiAoc3RyY21wKGxzdFtpXSwgbmFtZSkgPT0gMCkKKyAgICAgIHJldHVybiBpOworICByZXR1cm4gbHVhTF9hcmdlcnJvcihMLCBuYXJnLAorICAgICAgICAgICAgICAgICAgICAgICBsdWFfcHVzaGZzdHJpbmcoTCwgImludmFsaWQgb3B0aW9uICIgTFVBX1FTLCBuYW1lKSk7Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfY2hlY2tzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgc3BhY2UsIGNvbnN0IGNoYXIgKm1zZykgeworICAvKiBrZWVwIHNvbWUgZXh0cmEgc3BhY2UgdG8gcnVuIGVycm9yIHJvdXRpbmVzLCBpZiBuZWVkZWQgKi8KKyAgY29uc3QgaW50IGV4dHJhID0gTFVBX01JTlNUQUNLOworICBpZiAoIWx1YV9jaGVja3N0YWNrKEwsIHNwYWNlICsgZXh0cmEpKSB7CisgICAgaWYgKG1zZykKKyAgICAgIGx1YUxfZXJyb3IoTCwgInN0YWNrIG92ZXJmbG93ICglcykiLCBtc2cpOworICAgIGVsc2UKKyAgICAgIGx1YUxfZXJyb3IoTCwgInN0YWNrIG92ZXJmbG93Iik7CisgIH0KK30KKworCitMVUFMSUJfQVBJIHZvaWQgbHVhTF9jaGVja3R5cGUgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIGludCB0KSB7CisgIGlmIChsdWFfdHlwZShMLCBuYXJnKSAhPSB0KQorICAgIHRhZ19lcnJvcihMLCBuYXJnLCB0KTsKK30KKworCitMVUFMSUJfQVBJIHZvaWQgbHVhTF9jaGVja2FueSAobHVhX1N0YXRlICpMLCBpbnQgbmFyZykgeworICBpZiAobHVhX3R5cGUoTCwgbmFyZykgPT0gTFVBX1ROT05FKQorICAgIGx1YUxfYXJnZXJyb3IoTCwgbmFyZywgInZhbHVlIGV4cGVjdGVkIik7Cit9CisKKworTFVBTElCX0FQSSBjb25zdCBjaGFyICpsdWFMX2NoZWNrbHN0cmluZyAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywgc2l6ZV90ICpsZW4pIHsKKyAgY29uc3QgY2hhciAqcyA9IGx1YV90b2xzdHJpbmcoTCwgbmFyZywgbGVuKTsKKyAgaWYgKCFzKSB0YWdfZXJyb3IoTCwgbmFyZywgTFVBX1RTVFJJTkcpOworICByZXR1cm4gczsKK30KKworCitMVUFMSUJfQVBJIGNvbnN0IGNoYXIgKmx1YUxfb3B0bHN0cmluZyAobHVhX1N0YXRlICpMLCBpbnQgbmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZWYsIHNpemVfdCAqbGVuKSB7CisgIGlmIChsdWFfaXNub25lb3JuaWwoTCwgbmFyZykpIHsKKyAgICBpZiAobGVuKQorICAgICAgKmxlbiA9IChkZWYgPyBzdHJsZW4oZGVmKSA6IDApOworICAgIHJldHVybiBkZWY7CisgIH0KKyAgZWxzZSByZXR1cm4gbHVhTF9jaGVja2xzdHJpbmcoTCwgbmFyZywgbGVuKTsKK30KKworCitMVUFMSUJfQVBJIGx1YV9OdW1iZXIgbHVhTF9jaGVja251bWJlciAobHVhX1N0YXRlICpMLCBpbnQgbmFyZykgeworICBpbnQgaXNudW07CisgIGx1YV9OdW1iZXIgZCA9IGx1YV90b251bWJlcngoTCwgbmFyZywgJmlzbnVtKTsKKyAgaWYgKCFpc251bSkKKyAgICB0YWdfZXJyb3IoTCwgbmFyZywgTFVBX1ROVU1CRVIpOworICByZXR1cm4gZDsKK30KKworCitMVUFMSUJfQVBJIGx1YV9OdW1iZXIgbHVhTF9vcHRudW1iZXIgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcsIGx1YV9OdW1iZXIgZGVmKSB7CisgIHJldHVybiBsdWFMX29wdChMLCBsdWFMX2NoZWNrbnVtYmVyLCBuYXJnLCBkZWYpOworfQorCisKK0xVQUxJQl9BUEkgbHVhX0ludGVnZXIgbHVhTF9jaGVja2ludGVnZXIgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcpIHsKKyAgaW50IGlzbnVtOworICBsdWFfSW50ZWdlciBkID0gbHVhX3RvaW50ZWdlcngoTCwgbmFyZywgJmlzbnVtKTsKKyAgaWYgKCFpc251bSkKKyAgICB0YWdfZXJyb3IoTCwgbmFyZywgTFVBX1ROVU1CRVIpOworICByZXR1cm4gZDsKK30KKworCitMVUFMSUJfQVBJIGx1YV9VbnNpZ25lZCBsdWFMX2NoZWNrdW5zaWduZWQgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcmcpIHsKKyAgaW50IGlzbnVtOworICBsdWFfVW5zaWduZWQgZCA9IGx1YV90b3Vuc2lnbmVkeChMLCBuYXJnLCAmaXNudW0pOworICBpZiAoIWlzbnVtKQorICAgIHRhZ19lcnJvcihMLCBuYXJnLCBMVUFfVE5VTUJFUik7CisgIHJldHVybiBkOworfQorCisKK0xVQUxJQl9BUEkgbHVhX0ludGVnZXIgbHVhTF9vcHRpbnRlZ2VyIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhX0ludGVnZXIgZGVmKSB7CisgIHJldHVybiBsdWFMX29wdChMLCBsdWFMX2NoZWNraW50ZWdlciwgbmFyZywgZGVmKTsKK30KKworCitMVUFMSUJfQVBJIGx1YV9VbnNpZ25lZCBsdWFMX29wdHVuc2lnbmVkIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFfVW5zaWduZWQgZGVmKSB7CisgIHJldHVybiBsdWFMX29wdChMLCBsdWFMX2NoZWNrdW5zaWduZWQsIG5hcmcsIGRlZik7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogR2VuZXJpYyBCdWZmZXIgbWFuaXB1bGF0aW9uCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorKiogY2hlY2sgd2hldGhlciBidWZmZXIgaXMgdXNpbmcgYSB1c2VyZGF0YSBvbiB0aGUgc3RhY2sgYXMgYSB0ZW1wb3JhcnkKKyoqIGJ1ZmZlcgorKi8KKyNkZWZpbmUgYnVmZm9uc3RhY2soQikJKChCKS0+YiAhPSAoQiktPmluaXRiKQorCisKKy8qCisqKiByZXR1cm5zIGEgcG9pbnRlciB0byBhIGZyZWUgYXJlYSB3aXRoIGF0IGxlYXN0ICdzeicgYnl0ZXMKKyovCitMVUFMSUJfQVBJIGNoYXIgKmx1YUxfcHJlcGJ1ZmZzaXplIChsdWFMX0J1ZmZlciAqQiwgc2l6ZV90IHN6KSB7CisgIGx1YV9TdGF0ZSAqTCA9IEItPkw7CisgIGlmIChCLT5zaXplIC0gQi0+biA8IHN6KSB7ICAvKiBub3QgZW5vdWdoIHNwYWNlPyAqLworICAgIGNoYXIgKm5ld2J1ZmY7CisgICAgc2l6ZV90IG5ld3NpemUgPSBCLT5zaXplICogMjsgIC8qIGRvdWJsZSBidWZmZXIgc2l6ZSAqLworICAgIGlmIChuZXdzaXplIC0gQi0+biA8IHN6KSAgLyogbm90IGJpZyBlbm91Z2g/ICovCisgICAgICBuZXdzaXplID0gQi0+biArIHN6OworICAgIGlmIChuZXdzaXplIDwgQi0+biB8fCBuZXdzaXplIC0gQi0+biA8IHN6KQorICAgICAgbHVhTF9lcnJvcihMLCAiYnVmZmVyIHRvbyBsYXJnZSIpOworICAgIC8qIGNyZWF0ZSBsYXJnZXIgYnVmZmVyICovCisgICAgbmV3YnVmZiA9IChjaGFyICopbHVhX25ld3VzZXJkYXRhKEwsIG5ld3NpemUgKiBzaXplb2YoY2hhcikpOworICAgIC8qIG1vdmUgY29udGVudCB0byBuZXcgYnVmZmVyICovCisgICAgbWVtY3B5KG5ld2J1ZmYsIEItPmIsIEItPm4gKiBzaXplb2YoY2hhcikpOworICAgIGlmIChidWZmb25zdGFjayhCKSkKKyAgICAgIGx1YV9yZW1vdmUoTCwgLTIpOyAgLyogcmVtb3ZlIG9sZCBidWZmZXIgKi8KKyAgICBCLT5iID0gbmV3YnVmZjsKKyAgICBCLT5zaXplID0gbmV3c2l6ZTsKKyAgfQorICByZXR1cm4gJkItPmJbQi0+bl07Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfYWRkbHN0cmluZyAobHVhTF9CdWZmZXIgKkIsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsKSB7CisgIGNoYXIgKmIgPSBsdWFMX3ByZXBidWZmc2l6ZShCLCBsKTsKKyAgbWVtY3B5KGIsIHMsIGwgKiBzaXplb2YoY2hhcikpOworICBsdWFMX2FkZHNpemUoQiwgbCk7Cit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfYWRkc3RyaW5nIChsdWFMX0J1ZmZlciAqQiwgY29uc3QgY2hhciAqcykgeworICBsdWFMX2FkZGxzdHJpbmcoQiwgcywgc3RybGVuKHMpKTsKK30KKworCitMVUFMSUJfQVBJIHZvaWQgbHVhTF9wdXNocmVzdWx0IChsdWFMX0J1ZmZlciAqQikgeworICBsdWFfU3RhdGUgKkwgPSBCLT5MOworICBsdWFfcHVzaGxzdHJpbmcoTCwgQi0+YiwgQi0+bik7CisgIGlmIChidWZmb25zdGFjayhCKSkKKyAgICBsdWFfcmVtb3ZlKEwsIC0yKTsgIC8qIHJlbW92ZSBvbGQgYnVmZmVyICovCit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfcHVzaHJlc3VsdHNpemUgKGx1YUxfQnVmZmVyICpCLCBzaXplX3Qgc3opIHsKKyAgbHVhTF9hZGRzaXplKEIsIHN6KTsKKyAgbHVhTF9wdXNocmVzdWx0KEIpOworfQorCisKK0xVQUxJQl9BUEkgdm9pZCBsdWFMX2FkZHZhbHVlIChsdWFMX0J1ZmZlciAqQikgeworICBsdWFfU3RhdGUgKkwgPSBCLT5MOworICBzaXplX3QgbDsKKyAgY29uc3QgY2hhciAqcyA9IGx1YV90b2xzdHJpbmcoTCwgLTEsICZsKTsKKyAgaWYgKGJ1ZmZvbnN0YWNrKEIpKQorICAgIGx1YV9pbnNlcnQoTCwgLTIpOyAgLyogcHV0IHZhbHVlIGJlbG93IGJ1ZmZlciAqLworICBsdWFMX2FkZGxzdHJpbmcoQiwgcywgbCk7CisgIGx1YV9yZW1vdmUoTCwgKGJ1ZmZvbnN0YWNrKEIpKSA/IC0yIDogLTEpOyAgLyogcmVtb3ZlIHZhbHVlICovCit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfYnVmZmluaXQgKGx1YV9TdGF0ZSAqTCwgbHVhTF9CdWZmZXIgKkIpIHsKKyAgQi0+TCA9IEw7CisgIEItPmIgPSBCLT5pbml0YjsKKyAgQi0+biA9IDA7CisgIEItPnNpemUgPSBMVUFMX0JVRkZFUlNJWkU7Cit9CisKKworTFVBTElCX0FQSSBjaGFyICpsdWFMX2J1ZmZpbml0c2l6ZSAobHVhX1N0YXRlICpMLCBsdWFMX0J1ZmZlciAqQiwgc2l6ZV90IHN6KSB7CisgIGx1YUxfYnVmZmluaXQoTCwgQik7CisgIHJldHVybiBsdWFMX3ByZXBidWZmc2l6ZShCLCBzeik7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogUmVmZXJlbmNlIHN5c3RlbQorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyogaW5kZXggb2YgZnJlZS1saXN0IGhlYWRlciAqLworI2RlZmluZSBmcmVlbGlzdAkwCisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9yZWYgKGx1YV9TdGF0ZSAqTCwgaW50IHQpIHsKKyAgaW50IHJlZjsKKyAgaWYgKGx1YV9pc25pbChMLCAtMSkpIHsKKyAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIGZyb20gc3RhY2sgKi8KKyAgICByZXR1cm4gTFVBX1JFRk5JTDsgIC8qIGBuaWwnIGhhcyBhIHVuaXF1ZSBmaXhlZCByZWZlcmVuY2UgKi8KKyAgfQorICB0ID0gbHVhX2Fic2luZGV4KEwsIHQpOworICBsdWFfcmF3Z2V0aShMLCB0LCBmcmVlbGlzdCk7ICAvKiBnZXQgZmlyc3QgZnJlZSBlbGVtZW50ICovCisgIHJlZiA9IChpbnQpbHVhX3RvaW50ZWdlcihMLCAtMSk7ICAvKiByZWYgPSB0W2ZyZWVsaXN0XSAqLworICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIGl0IGZyb20gc3RhY2sgKi8KKyAgaWYgKHJlZiAhPSAwKSB7ICAvKiBhbnkgZnJlZSBlbGVtZW50PyAqLworICAgIGx1YV9yYXdnZXRpKEwsIHQsIHJlZik7ICAvKiByZW1vdmUgaXQgZnJvbSBsaXN0ICovCisgICAgbHVhX3Jhd3NldGkoTCwgdCwgZnJlZWxpc3QpOyAgLyogKHRbZnJlZWxpc3RdID0gdFtyZWZdKSAqLworICB9CisgIGVsc2UgIC8qIG5vIGZyZWUgZWxlbWVudHMgKi8KKyAgICByZWYgPSAoaW50KWx1YV9yYXdsZW4oTCwgdCkgKyAxOyAgLyogZ2V0IGEgbmV3IHJlZmVyZW5jZSAqLworICBsdWFfcmF3c2V0aShMLCB0LCByZWYpOworICByZXR1cm4gcmVmOworfQorCisKK0xVQUxJQl9BUEkgdm9pZCBsdWFMX3VucmVmIChsdWFfU3RhdGUgKkwsIGludCB0LCBpbnQgcmVmKSB7CisgIGlmIChyZWYgPj0gMCkgeworICAgIHQgPSBsdWFfYWJzaW5kZXgoTCwgdCk7CisgICAgbHVhX3Jhd2dldGkoTCwgdCwgZnJlZWxpc3QpOworICAgIGx1YV9yYXdzZXRpKEwsIHQsIHJlZik7ICAvKiB0W3JlZl0gPSB0W2ZyZWVsaXN0XSAqLworICAgIGx1YV9wdXNoaW50ZWdlcihMLCByZWYpOworICAgIGx1YV9yYXdzZXRpKEwsIHQsIGZyZWVsaXN0KTsgIC8qIHRbZnJlZWxpc3RdID0gcmVmICovCisgIH0KK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBMb2FkIGZ1bmN0aW9ucworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgTG9hZEYgeworICBpbnQgbjsgIC8qIG51bWJlciBvZiBwcmUtcmVhZCBjaGFyYWN0ZXJzICovCisgIEZJTEUgKmY7ICAvKiBmaWxlIGJlaW5nIHJlYWQgKi8KKyAgY2hhciBidWZmW0xVQUxfQlVGRkVSU0laRV07ICAvKiBhcmVhIGZvciByZWFkaW5nIGZpbGUgKi8KK30gTG9hZEY7CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldEYgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQsIHNpemVfdCAqc2l6ZSkgeworICBMb2FkRiAqbGYgPSAoTG9hZEYgKil1ZDsKKyAgKHZvaWQpTDsgIC8qIG5vdCB1c2VkICovCisgIGlmIChsZi0+biA+IDApIHsgIC8qIGFyZSB0aGVyZSBwcmUtcmVhZCBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQ/ICovCisgICAgKnNpemUgPSBsZi0+bjsgIC8qIHJldHVybiB0aGVtIChjaGFycyBhbHJlYWR5IGluIGJ1ZmZlcikgKi8KKyAgICBsZi0+biA9IDA7ICAvKiBubyBtb3JlIHByZS1yZWFkIGNoYXJhY3RlcnMgKi8KKyAgfQorICBlbHNlIHsgIC8qIHJlYWQgYSBibG9jayBmcm9tIGZpbGUgKi8KKyAgICAvKiAnZnJlYWQnIGNhbiByZXR1cm4gPiAwICphbmQqIHNldCB0aGUgRU9GIGZsYWcuIElmIG5leHQgY2FsbCB0bworICAgICAgICdnZXRGJyBjYWxsZWQgJ2ZyZWFkJywgaXQgbWlnaHQgc3RpbGwgd2FpdCBmb3IgdXNlciBpbnB1dC4KKyAgICAgICBUaGUgbmV4dCBjaGVjayBhdm9pZHMgdGhpcyBwcm9ibGVtLiAqLworICAgIGlmIChmZW9mKGxmLT5mKSkgcmV0dXJuIE5VTEw7CisgICAgKnNpemUgPSBmcmVhZChsZi0+YnVmZiwgMSwgc2l6ZW9mKGxmLT5idWZmKSwgbGYtPmYpOyAgLyogcmVhZCBibG9jayAqLworICB9CisgIHJldHVybiBsZi0+YnVmZjsKK30KKworCitzdGF0aWMgaW50IGVycmZpbGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqd2hhdCwgaW50IGZuYW1laW5kZXgpIHsKKyAgY29uc3QgY2hhciAqc2VyciA9IHN0cmVycm9yKGVycm5vKTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBsdWFfdG9zdHJpbmcoTCwgZm5hbWVpbmRleCkgKyAxOworICBsdWFfcHVzaGZzdHJpbmcoTCwgImNhbm5vdCAlcyAlczogJXMiLCB3aGF0LCBmaWxlbmFtZSwgc2Vycik7CisgIGx1YV9yZW1vdmUoTCwgZm5hbWVpbmRleCk7CisgIHJldHVybiBMVUFfRVJSRklMRTsKK30KKworCitzdGF0aWMgaW50IHNraXBCT00gKExvYWRGICpsZikgeworICBjb25zdCBjaGFyICpwID0gIlx4RUZceEJCXHhCRiI7ICAvKiBVdGY4IEJPTSBtYXJrICovCisgIGludCBjOworICBsZi0+biA9IDA7CisgIGRvIHsKKyAgICBjID0gZ2V0YyhsZi0+Zik7CisgICAgaWYgKGMgPT0gRU9GIHx8IGMgIT0gKihjb25zdCB1bnNpZ25lZCBjaGFyICopcCsrKSByZXR1cm4gYzsKKyAgICBsZi0+YnVmZltsZi0+bisrXSA9IGM7ICAvKiB0byBiZSByZWFkIGJ5IHRoZSBwYXJzZXIgKi8KKyAgfSB3aGlsZSAoKnAgIT0gJ1wwJyk7CisgIGxmLT5uID0gMDsgIC8qIHByZWZpeCBtYXRjaGVkOyBkaXNjYXJkIGl0ICovCisgIHJldHVybiBnZXRjKGxmLT5mKTsgIC8qIHJldHVybiBuZXh0IGNoYXJhY3RlciAqLworfQorCisKKy8qCisqKiByZWFkcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGZpbGUgJ2YnIGFuZCBza2lwcyBhbiBvcHRpb25hbCBCT00gbWFyaworKiogaW4gaXRzIGJlZ2lubmluZyBwbHVzIGl0cyBmaXJzdCBsaW5lIGlmIGl0IHN0YXJ0cyB3aXRoICcjJy4gUmV0dXJucworKiogdHJ1ZSBpZiBpdCBza2lwcGVkIHRoZSBmaXJzdCBsaW5lLiAgSW4gYW55IGNhc2UsICcqY3AnIGhhcyB0aGUKKyoqIGZpcnN0ICJ2YWxpZCIgY2hhcmFjdGVyIG9mIHRoZSBmaWxlIChhZnRlciB0aGUgb3B0aW9uYWwgQk9NIGFuZAorKiogYSBmaXJzdC1saW5lIGNvbW1lbnQpLgorKi8KK3N0YXRpYyBpbnQgc2tpcGNvbW1lbnQgKExvYWRGICpsZiwgaW50ICpjcCkgeworICBpbnQgYyA9ICpjcCA9IHNraXBCT00obGYpOworICBpZiAoYyA9PSAnIycpIHsgIC8qIGZpcnN0IGxpbmUgaXMgYSBjb21tZW50IChVbml4IGV4ZWMuIGZpbGUpPyAqLworICAgIGRvIHsgIC8qIHNraXAgZmlyc3QgbGluZSAqLworICAgICAgYyA9IGdldGMobGYtPmYpOworICAgIH0gd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJykgOworICAgICpjcCA9IGdldGMobGYtPmYpOyAgLyogc2tpcCBlbmQtb2YtbGluZSwgaWYgcHJlc2VudCAqLworICAgIHJldHVybiAxOyAgLyogdGhlcmUgd2FzIGEgY29tbWVudCAqLworICB9CisgIGVsc2UgcmV0dXJuIDA7ICAvKiBubyBjb21tZW50ICovCit9CisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9sb2FkZmlsZXggKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlKSB7CisgIExvYWRGIGxmOworICBpbnQgc3RhdHVzLCByZWFkc3RhdHVzOworICBpbnQgYzsKKyAgaW50IGZuYW1laW5kZXggPSBsdWFfZ2V0dG9wKEwpICsgMTsgIC8qIGluZGV4IG9mIGZpbGVuYW1lIG9uIHRoZSBzdGFjayAqLworICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkgeworICAgIGx1YV9wdXNobGl0ZXJhbChMLCAiPXN0ZGluIik7CisgICAgbGYuZiA9IHN0ZGluOworICB9CisgIGVsc2UgeworICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiQCVzIiwgZmlsZW5hbWUpOworICAgIGxmLmYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICBpZiAobGYuZiA9PSBOVUxMKSByZXR1cm4gZXJyZmlsZShMLCAib3BlbiIsIGZuYW1laW5kZXgpOworICB9CisgIGlmIChza2lwY29tbWVudCgmbGYsICZjKSkgIC8qIHJlYWQgaW5pdGlhbCBwb3J0aW9uICovCisgICAgbGYuYnVmZltsZi5uKytdID0gJ1xuJzsgIC8qIGFkZCBsaW5lIHRvIGNvcnJlY3QgbGluZSBudW1iZXJzICovCisjaWZuZGVmIFNZU0xJTlVYCisgIGlmIChjID09IExVQV9TSUdOQVRVUkVbMF0gJiYgZmlsZW5hbWUpIHsgIC8qIGJpbmFyeSBmaWxlPyAqLworICAgIGxmLmYgPSBmcmVvcGVuKGZpbGVuYW1lLCAicmIiLCBsZi5mKTsgIC8qIHJlb3BlbiBpbiBiaW5hcnkgbW9kZSAqLworICAgIGlmIChsZi5mID09IE5VTEwpIHJldHVybiBlcnJmaWxlKEwsICJyZW9wZW4iLCBmbmFtZWluZGV4KTsKKyAgICBza2lwY29tbWVudCgmbGYsICZjKTsgIC8qIHJlLXJlYWQgaW5pdGlhbCBwb3J0aW9uICovCisgIH0KKyNlbmRpZgorICBpZiAoYyAhPSBFT0YpCisgICAgbGYuYnVmZltsZi5uKytdID0gYzsgIC8qICdjJyBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJlYW0gKi8KKyAgc3RhdHVzID0gbHVhX2xvYWQoTCwgZ2V0RiwgJmxmLCBsdWFfdG9zdHJpbmcoTCwgLTEpLCBtb2RlKTsKKyAgcmVhZHN0YXR1cyA9IGZlcnJvcihsZi5mKTsKKyAgaWYgKGZpbGVuYW1lKSBmY2xvc2UobGYuZik7ICAvKiBjbG9zZSBmaWxlIChldmVuIGluIGNhc2Ugb2YgZXJyb3JzKSAqLworICBpZiAocmVhZHN0YXR1cykgeworICAgIGx1YV9zZXR0b3AoTCwgZm5hbWVpbmRleCk7ICAvKiBpZ25vcmUgcmVzdWx0cyBmcm9tIGBsdWFfbG9hZCcgKi8KKyAgICByZXR1cm4gZXJyZmlsZShMLCAicmVhZCIsIGZuYW1laW5kZXgpOworICB9CisgIGx1YV9yZW1vdmUoTCwgZm5hbWVpbmRleCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgTG9hZFMgeworICBjb25zdCBjaGFyICpzOworICBzaXplX3Qgc2l6ZTsKK30gTG9hZFM7CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldFMgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQsIHNpemVfdCAqc2l6ZSkgeworICBMb2FkUyAqbHMgPSAoTG9hZFMgKil1ZDsKKyAgKHZvaWQpTDsgIC8qIG5vdCB1c2VkICovCisgIGlmIChscy0+c2l6ZSA9PSAwKSByZXR1cm4gTlVMTDsKKyAgKnNpemUgPSBscy0+c2l6ZTsKKyAgbHMtPnNpemUgPSAwOworICByZXR1cm4gbHMtPnM7Cit9CisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9sb2FkYnVmZmVyeCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpidWZmLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpIHsKKyAgTG9hZFMgbHM7CisgIGxzLnMgPSBidWZmOworICBscy5zaXplID0gc2l6ZTsKKyAgcmV0dXJuIGx1YV9sb2FkKEwsIGdldFMsICZscywgbmFtZSwgbW9kZSk7Cit9CisKKworTFVBTElCX0FQSSBpbnQgbHVhTF9sb2Fkc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMpIHsKKyAgcmV0dXJuIGx1YUxfbG9hZGJ1ZmZlcihMLCBzLCBzdHJsZW4ocyksIHMpOworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCitMVUFMSUJfQVBJIGludCBsdWFMX2dldG1ldGFmaWVsZCAobHVhX1N0YXRlICpMLCBpbnQgb2JqLCBjb25zdCBjaGFyICpldmVudCkgeworICBpZiAoIWx1YV9nZXRtZXRhdGFibGUoTCwgb2JqKSkgIC8qIG5vIG1ldGF0YWJsZT8gKi8KKyAgICByZXR1cm4gMDsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZXZlbnQpOworICBsdWFfcmF3Z2V0KEwsIC0yKTsKKyAgaWYgKGx1YV9pc25pbChMLCAtMSkpIHsKKyAgICBsdWFfcG9wKEwsIDIpOyAgLyogcmVtb3ZlIG1ldGF0YWJsZSBhbmQgbWV0YWZpZWxkICovCisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSB7CisgICAgbHVhX3JlbW92ZShMLCAtMik7ICAvKiByZW1vdmUgb25seSBtZXRhdGFibGUgKi8KKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisKK0xVQUxJQl9BUEkgaW50IGx1YUxfY2FsbG1ldGEgKGx1YV9TdGF0ZSAqTCwgaW50IG9iaiwgY29uc3QgY2hhciAqZXZlbnQpIHsKKyAgb2JqID0gbHVhX2Fic2luZGV4KEwsIG9iaik7CisgIGlmICghbHVhTF9nZXRtZXRhZmllbGQoTCwgb2JqLCBldmVudCkpICAvKiBubyBtZXRhZmllbGQ/ICovCisgICAgcmV0dXJuIDA7CisgIGx1YV9wdXNodmFsdWUoTCwgb2JqKTsKKyAgbHVhX2NhbGwoTCwgMSwgMSk7CisgIHJldHVybiAxOworfQorCisKK0xVQUxJQl9BUEkgaW50IGx1YUxfbGVuIChsdWFfU3RhdGUgKkwsIGludCBpZHgpIHsKKyAgaW50IGw7CisgIGludCBpc251bTsKKyAgbHVhX2xlbihMLCBpZHgpOworICBsID0gKGludClsdWFfdG9pbnRlZ2VyeChMLCAtMSwgJmlzbnVtKTsKKyAgaWYgKCFpc251bSkKKyAgICBsdWFMX2Vycm9yKEwsICJvYmplY3QgbGVuZ3RoIGlzIG5vdCBhIG51bWJlciIpOworICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIG9iamVjdCAqLworICByZXR1cm4gbDsKK30KKworCitMVUFMSUJfQVBJIGNvbnN0IGNoYXIgKmx1YUxfdG9sc3RyaW5nIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIHNpemVfdCAqbGVuKSB7CisgIGlmICghbHVhTF9jYWxsbWV0YShMLCBpZHgsICJfX3Rvc3RyaW5nIikpIHsgIC8qIG5vIG1ldGFmaWVsZD8gKi8KKyAgICBzd2l0Y2ggKGx1YV90eXBlKEwsIGlkeCkpIHsKKyAgICAgIGNhc2UgTFVBX1ROVU1CRVI6CisgICAgICBjYXNlIExVQV9UU1RSSU5HOgorICAgICAgICBsdWFfcHVzaHZhbHVlKEwsIGlkeCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMVUFfVEJPT0xFQU46CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIChsdWFfdG9ib29sZWFuKEwsIGlkeCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMVUFfVE5JTDoKKyAgICAgICAgbHVhX3B1c2hsaXRlcmFsKEwsICJuaWwiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVzOiAlcCIsIGx1YUxfdHlwZW5hbWUoTCwgaWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhX3RvcG9pbnRlcihMLCBpZHgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBsdWFfdG9sc3RyaW5nKEwsIC0xLCBsZW4pOworfQorCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBDb21wYXRpYmlsaXR5IHdpdGggNS4xIG1vZHVsZSBmdW5jdGlvbnMKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWYgZGVmaW5lZChMVUFfQ09NUEFUX01PRFVMRSkKKworc3RhdGljIGNvbnN0IGNoYXIgKmx1YUxfZmluZHRhYmxlIChsdWFfU3RhdGUgKkwsIGludCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgc3poaW50KSB7CisgIGNvbnN0IGNoYXIgKmU7CisgIGlmIChpZHgpIGx1YV9wdXNodmFsdWUoTCwgaWR4KTsKKyAgZG8geworICAgIGUgPSBzdHJjaHIoZm5hbWUsICcuJyk7CisgICAgaWYgKGUgPT0gTlVMTCkgZSA9IGZuYW1lICsgc3RybGVuKGZuYW1lKTsKKyAgICBsdWFfcHVzaGxzdHJpbmcoTCwgZm5hbWUsIGUgLSBmbmFtZSk7CisgICAgbHVhX3Jhd2dldChMLCAtMik7CisgICAgaWYgKGx1YV9pc25pbChMLCAtMSkpIHsgIC8qIG5vIHN1Y2ggZmllbGQ/ICovCisgICAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIHRoaXMgbmlsICovCisgICAgICBsdWFfY3JlYXRldGFibGUoTCwgMCwgKCplID09ICcuJyA/IDEgOiBzemhpbnQpKTsgLyogbmV3IHRhYmxlIGZvciBmaWVsZCAqLworICAgICAgbHVhX3B1c2hsc3RyaW5nKEwsIGZuYW1lLCBlIC0gZm5hbWUpOworICAgICAgbHVhX3B1c2h2YWx1ZShMLCAtMik7CisgICAgICBsdWFfc2V0dGFibGUoTCwgLTQpOyAgLyogc2V0IG5ldyB0YWJsZSBpbnRvIGZpZWxkICovCisgICAgfQorICAgIGVsc2UgaWYgKCFsdWFfaXN0YWJsZShMLCAtMSkpIHsgIC8qIGZpZWxkIGhhcyBhIG5vbi10YWJsZSB2YWx1ZT8gKi8KKyAgICAgIGx1YV9wb3AoTCwgMik7ICAvKiByZW1vdmUgdGFibGUgYW5kIHZhbHVlICovCisgICAgICByZXR1cm4gZm5hbWU7ICAvKiByZXR1cm4gcHJvYmxlbWF0aWMgcGFydCBvZiB0aGUgbmFtZSAqLworICAgIH0KKyAgICBsdWFfcmVtb3ZlKEwsIC0yKTsgIC8qIHJlbW92ZSBwcmV2aW91cyB0YWJsZSAqLworICAgIGZuYW1lID0gZSArIDE7CisgIH0gd2hpbGUgKCplID09ICcuJyk7CisgIHJldHVybiBOVUxMOworfQorCisKKy8qCisqKiBDb3VudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBsdWFMX1JlZyBsaXN0LgorKi8KK3N0YXRpYyBpbnQgbGlic2l6ZSAoY29uc3QgbHVhTF9SZWcgKmwpIHsKKyAgaW50IHNpemUgPSAwOworICBmb3IgKDsgbCAmJiBsLT5uYW1lOyBsKyspIHNpemUrKzsKKyAgcmV0dXJuIHNpemU7Cit9CisKKworLyoKKyoqIEZpbmQgb3IgY3JlYXRlIGEgbW9kdWxlIHRhYmxlIHdpdGggYSBnaXZlbiBuYW1lLiBUaGUgZnVuY3Rpb24KKyoqIGZpcnN0IGxvb2tzIGF0IHRoZSBfTE9BREVEIHRhYmxlIGFuZCwgaWYgdGhhdCBmYWlscywgdHJ5IGEKKyoqIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHRoYXQgbmFtZS4gSW4gYW55IGNhc2UsIGxlYXZlcyBvbiB0aGUgc3RhY2sKKyoqIHRoZSBtb2R1bGUgdGFibGUuCisqLworTFVBTElCX0FQSSB2b2lkIGx1YUxfcHVzaG1vZHVsZSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICptb2RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVoaW50KSB7CisgIGx1YUxfZmluZHRhYmxlKEwsIExVQV9SRUdJU1RSWUlOREVYLCAiX0xPQURFRCIsIDEpOyAgLyogZ2V0IF9MT0FERUQgdGFibGUgKi8KKyAgbHVhX2dldGZpZWxkKEwsIC0xLCBtb2RuYW1lKTsgIC8qIGdldCBfTE9BREVEW21vZG5hbWVdICovCisgIGlmICghbHVhX2lzdGFibGUoTCwgLTEpKSB7ICAvKiBub3QgZm91bmQ/ICovCisgICAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSBwcmV2aW91cyByZXN1bHQgKi8KKyAgICAvKiB0cnkgZ2xvYmFsIHZhcmlhYmxlIChhbmQgY3JlYXRlIG9uZSBpZiBpdCBkb2VzIG5vdCBleGlzdCkgKi8KKyAgICBsdWFfcHVzaGdsb2JhbHRhYmxlKEwpOworICAgIGlmIChsdWFMX2ZpbmR0YWJsZShMLCAwLCBtb2RuYW1lLCBzaXplaGludCkgIT0gTlVMTCkKKyAgICAgIGx1YUxfZXJyb3IoTCwgIm5hbWUgY29uZmxpY3QgZm9yIG1vZHVsZSAiIExVQV9RUywgbW9kbmFtZSk7CisgICAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7CisgICAgbHVhX3NldGZpZWxkKEwsIC0zLCBtb2RuYW1lKTsgIC8qIF9MT0FERURbbW9kbmFtZV0gPSBuZXcgdGFibGUgKi8KKyAgfQorICBsdWFfcmVtb3ZlKEwsIC0yKTsgIC8qIHJlbW92ZSBfTE9BREVEIHRhYmxlICovCit9CisKKworTFVBTElCX0FQSSB2b2lkIGx1YUxfb3BlbmxpYiAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpsaWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGx1YUxfUmVnICpsLCBpbnQgbnVwKSB7CisgIGx1YUxfY2hlY2t2ZXJzaW9uKEwpOworICBpZiAobGlibmFtZSkgeworICAgIGx1YUxfcHVzaG1vZHVsZShMLCBsaWJuYW1lLCBsaWJzaXplKGwpKTsgIC8qIGdldC9jcmVhdGUgbGlicmFyeSB0YWJsZSAqLworICAgIGx1YV9pbnNlcnQoTCwgLShudXAgKyAxKSk7ICAvKiBtb3ZlIGxpYnJhcnkgdGFibGUgdG8gYmVsb3cgdXB2YWx1ZXMgKi8KKyAgfQorICBpZiAobCkKKyAgICBsdWFMX3NldGZ1bmNzKEwsIGwsIG51cCk7CisgIGVsc2UKKyAgICBsdWFfcG9wKEwsIG51cCk7ICAvKiByZW1vdmUgdXB2YWx1ZXMgKi8KK30KKworI2VuZGlmCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisqKiBzZXQgZnVuY3Rpb25zIGZyb20gbGlzdCAnbCcgaW50byB0YWJsZSBhdCB0b3AgLSAnbnVwJzsgZWFjaAorKiogZnVuY3Rpb24gZ2V0cyB0aGUgJ251cCcgZWxlbWVudHMgYXQgdGhlIHRvcCBhcyB1cHZhbHVlcy4KKyoqIFJldHVybnMgd2l0aCBvbmx5IHRoZSB0YWJsZSBhdCB0aGUgc3RhY2suCisqLworTFVBTElCX0FQSSB2b2lkIGx1YUxfc2V0ZnVuY3MgKGx1YV9TdGF0ZSAqTCwgY29uc3QgbHVhTF9SZWcgKmwsIGludCBudXApIHsKKyAgbHVhTF9jaGVja3ZlcnNpb24oTCk7CisgIGx1YUxfY2hlY2tzdGFjayhMLCBudXAsICJ0b28gbWFueSB1cHZhbHVlcyIpOworICBmb3IgKDsgbC0+bmFtZSAhPSBOVUxMOyBsKyspIHsgIC8qIGZpbGwgdGhlIHRhYmxlIHdpdGggZ2l2ZW4gZnVuY3Rpb25zICovCisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG51cDsgaSsrKSAgLyogY29weSB1cHZhbHVlcyB0byB0aGUgdG9wICovCisgICAgICBsdWFfcHVzaHZhbHVlKEwsIC1udXApOworICAgIGx1YV9wdXNoY2Nsb3N1cmUoTCwgbC0+ZnVuYywgbnVwKTsgIC8qIGNsb3N1cmUgd2l0aCB0aG9zZSB1cHZhbHVlcyAqLworICAgIGx1YV9zZXRmaWVsZChMLCAtKG51cCArIDIpLCBsLT5uYW1lKTsKKyAgfQorICBsdWFfcG9wKEwsIG51cCk7ICAvKiByZW1vdmUgdXB2YWx1ZXMgKi8KK30KKworCisvKgorKiogZW5zdXJlIHRoYXQgc3RhY2tbaWR4XVtmbmFtZV0gaGFzIGEgdGFibGUgYW5kIHB1c2ggdGhhdCB0YWJsZQorKiogaW50byB0aGUgc3RhY2sKKyovCitMVUFMSUJfQVBJIGludCBsdWFMX2dldHN1YnRhYmxlIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGNvbnN0IGNoYXIgKmZuYW1lKSB7CisgIGx1YV9nZXRmaWVsZChMLCBpZHgsIGZuYW1lKTsKKyAgaWYgKGx1YV9pc3RhYmxlKEwsIC0xKSkgcmV0dXJuIDE7ICAvKiB0YWJsZSBhbHJlYWR5IHRoZXJlICovCisgIGVsc2UgeworICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgcHJldmlvdXMgcmVzdWx0ICovCisgICAgaWR4ID0gbHVhX2Fic2luZGV4KEwsIGlkeCk7CisgICAgbHVhX25ld3RhYmxlKEwpOworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOyAgLyogY29weSB0byBiZSBsZWZ0IGF0IHRvcCAqLworICAgIGx1YV9zZXRmaWVsZChMLCBpZHgsIGZuYW1lKTsgIC8qIGFzc2lnbiBuZXcgdGFibGUgdG8gZmllbGQgKi8KKyAgICByZXR1cm4gMDsgIC8qIGZhbHNlLCBiZWNhdXNlIGRpZCBub3QgZmluZCB0YWJsZSB0aGVyZSAqLworICB9Cit9CisKKworLyoKKyoqIHN0cmlwcGVkLWRvd24gJ3JlcXVpcmUnLiBDYWxscyAnb3BlbmYnIHRvIG9wZW4gYSBtb2R1bGUsCisqKiByZWdpc3RlcnMgdGhlIHJlc3VsdCBpbiAncGFja2FnZS5sb2FkZWQnIHRhYmxlIGFuZCwgaWYgJ2dsYicKKyoqIGlzIHRydWUsIGFsc28gcmVnaXN0ZXJzIHRoZSByZXN1bHQgaW4gdGhlIGdsb2JhbCB0YWJsZS4KKyoqIExlYXZlcyByZXN1bHRpbmcgbW9kdWxlIG9uIHRoZSB0b3AuCisqLworTFVBTElCX0FQSSB2b2lkIGx1YUxfcmVxdWlyZWYgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbW9kbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFfQ0Z1bmN0aW9uIG9wZW5mLCBpbnQgZ2xiKSB7CisgIGx1YV9wdXNoY2Z1bmN0aW9uKEwsIG9wZW5mKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgbW9kbmFtZSk7ICAvKiBhcmd1bWVudCB0byBvcGVuIGZ1bmN0aW9uICovCisgIGx1YV9jYWxsKEwsIDEsIDEpOyAgLyogb3BlbiBtb2R1bGUgKi8KKyAgbHVhTF9nZXRzdWJ0YWJsZShMLCBMVUFfUkVHSVNUUllJTkRFWCwgIl9MT0FERUQiKTsKKyAgbHVhX3B1c2h2YWx1ZShMLCAtMik7ICAvKiBtYWtlIGNvcHkgb2YgbW9kdWxlIChjYWxsIHJlc3VsdCkgKi8KKyAgbHVhX3NldGZpZWxkKEwsIC0yLCBtb2RuYW1lKTsgIC8qIF9MT0FERURbbW9kbmFtZV0gPSBtb2R1bGUgKi8KKyAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSBfTE9BREVEIHRhYmxlICovCisgIGlmIChnbGIpIHsKKyAgICBsdWFfcHVzaHZhbHVlKEwsIC0xKTsgIC8qIGNvcHkgb2YgJ21vZCcgKi8KKyAgICBsdWFfc2V0Z2xvYmFsKEwsIG1vZG5hbWUpOyAgLyogX0dbbW9kbmFtZV0gPSBtb2R1bGUgKi8KKyAgfQorfQorCisKK0xVQUxJQl9BUEkgY29uc3QgY2hhciAqbHVhTF9nc3ViIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyKSB7CisgIGNvbnN0IGNoYXIgKndpbGQ7CisgIHNpemVfdCBsID0gc3RybGVuKHApOworICBsdWFMX0J1ZmZlciBiOworICBsdWFMX2J1ZmZpbml0KEwsICZiKTsKKyAgd2hpbGUgKCh3aWxkID0gc3Ryc3RyKHMsIHApKSAhPSBOVUxMKSB7CisgICAgbHVhTF9hZGRsc3RyaW5nKCZiLCBzLCB3aWxkIC0gcyk7ICAvKiBwdXNoIHByZWZpeCAqLworICAgIGx1YUxfYWRkc3RyaW5nKCZiLCByKTsgIC8qIHB1c2ggcmVwbGFjZW1lbnQgaW4gcGxhY2Ugb2YgcGF0dGVybiAqLworICAgIHMgPSB3aWxkICsgbDsgIC8qIGNvbnRpbnVlIGFmdGVyIGBwJyAqLworICB9CisgIGx1YUxfYWRkc3RyaW5nKCZiLCBzKTsgIC8qIHB1c2ggbGFzdCBzdWZmaXggKi8KKyAgbHVhTF9wdXNocmVzdWx0KCZiKTsKKyAgcmV0dXJuIGx1YV90b3N0cmluZyhMLCAtMSk7Cit9CisKKworc3RhdGljIHZvaWQgKmxfYWxsb2MgKHZvaWQgKnVkLCB2b2lkICpwdHIsIHNpemVfdCBvc2l6ZSwgc2l6ZV90IG5zaXplKSB7CisgICh2b2lkKXVkOyAodm9pZClvc2l6ZTsgIC8qIG5vdCB1c2VkICovCisgIGlmIChuc2l6ZSA9PSAwKSB7CisgICAgZnJlZShwdHIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gcmVhbGxvYyhwdHIsIG5zaXplKTsKK30KKworCitzdGF0aWMgaW50IHBhbmljIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhaV93cml0ZXN0cmluZ2Vycm9yKCJQQU5JQzogdW5wcm90ZWN0ZWQgZXJyb3IgaW4gY2FsbCB0byBMdWEgQVBJICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgbHVhX3Rvc3RyaW5nKEwsIC0xKSk7CisgIHJldHVybiAwOyAgLyogcmV0dXJuIHRvIEx1YSB0byBhYm9ydCAqLworfQorCisKK0xVQUxJQl9BUEkgbHVhX1N0YXRlICpsdWFMX25ld3N0YXRlICh2b2lkKSB7CisgIGx1YV9TdGF0ZSAqTCA9IGx1YV9uZXdzdGF0ZShsX2FsbG9jLCBOVUxMKTsKKyAgaWYgKEwpIGx1YV9hdHBhbmljKEwsICZwYW5pYyk7CisgIHJldHVybiBMOworfQorCisKK0xVQUxJQl9BUEkgdm9pZCBsdWFMX2NoZWNrdmVyc2lvbl8gKGx1YV9TdGF0ZSAqTCwgbHVhX051bWJlciB2ZXIpIHsKKyAgY29uc3QgbHVhX051bWJlciAqdiA9IGx1YV92ZXJzaW9uKEwpOworICBpZiAodiAhPSBsdWFfdmVyc2lvbihOVUxMKSkKKyAgICBsdWFMX2Vycm9yKEwsICJtdWx0aXBsZSBMdWEgVk1zIGRldGVjdGVkIik7CisgIGVsc2UgaWYgKCp2ICE9IHZlcikKKyAgICBsdWFMX2Vycm9yKEwsICJ2ZXJzaW9uIG1pc21hdGNoOiBhcHAuIG5lZWRzICVmLCBMdWEgY29yZSBwcm92aWRlcyAlZiIsCisgICAgICAgICAgICAgICAgICB2ZXIsICp2KTsKKyAgLyogY2hlY2sgY29udmVyc2lvbnMgbnVtYmVyIC0+IGludGVnZXIgdHlwZXMgKi8KKyAgbHVhX3B1c2hudW1iZXIoTCwgLShsdWFfTnVtYmVyKTB4MTIzNCk7CisgIGlmIChsdWFfdG9pbnRlZ2VyKEwsIC0xKSAhPSAtMHgxMjM0IHx8CisgICAgICBsdWFfdG91bnNpZ25lZChMLCAtMSkgIT0gKGx1YV9VbnNpZ25lZCktMHgxMjM0KQorICAgIGx1YUxfZXJyb3IoTCwgImJhZCBjb252ZXJzaW9uIG51bWJlci0+aW50OyIKKyAgICAgICAgICAgICAgICAgICIgbXVzdCByZWNvbXBpbGUgTHVhIHdpdGggcHJvcGVyIHNldHRpbmdzIik7CisgIGx1YV9wb3AoTCwgMSk7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGF1eGxpYi5oIGIvY29tMzIvbHVhL3NyYy9sYXV4bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiMDIzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbGF1eGxpYi5oCkBAIC0wLDAgKzEsMjEyIEBACisvKgorKiogJElkOiBsYXV4bGliLmgsdiAxLjEyMC4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciBidWlsZGluZyBMdWEgbGlicmFyaWVzCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaWZuZGVmIGxhdXhsaWJfaAorI2RlZmluZSBsYXV4bGliX2gKKworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImx1YS5oIgorCisKKworLyogZXh0cmEgZXJyb3IgY29kZSBmb3IgYGx1YUxfbG9hZCcgKi8KKyNkZWZpbmUgTFVBX0VSUkZJTEUgICAgIChMVUFfRVJSRVJSKzEpCisKKwordHlwZWRlZiBzdHJ1Y3QgbHVhTF9SZWcgeworICBjb25zdCBjaGFyICpuYW1lOworICBsdWFfQ0Z1bmN0aW9uIGZ1bmM7Cit9IGx1YUxfUmVnOworCisKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF9jaGVja3ZlcnNpb25fKSAobHVhX1N0YXRlICpMLCBsdWFfTnVtYmVyIHZlcik7CisjZGVmaW5lIGx1YUxfY2hlY2t2ZXJzaW9uKEwpCWx1YUxfY2hlY2t2ZXJzaW9uXyhMLCBMVUFfVkVSU0lPTl9OVU0pCisKK0xVQUxJQl9BUEkgaW50IChsdWFMX2dldG1ldGFmaWVsZCkgKGx1YV9TdGF0ZSAqTCwgaW50IG9iaiwgY29uc3QgY2hhciAqZSk7CitMVUFMSUJfQVBJIGludCAobHVhTF9jYWxsbWV0YSkgKGx1YV9TdGF0ZSAqTCwgaW50IG9iaiwgY29uc3QgY2hhciAqZSk7CitMVUFMSUJfQVBJIGNvbnN0IGNoYXIgKihsdWFMX3RvbHN0cmluZykgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwgc2l6ZV90ICpsZW4pOworTFVBTElCX0FQSSBpbnQgKGx1YUxfYXJnZXJyb3IpIChsdWFfU3RhdGUgKkwsIGludCBudW1hcmcsIGNvbnN0IGNoYXIgKmV4dHJhbXNnKTsKK0xVQUxJQl9BUEkgY29uc3QgY2hhciAqKGx1YUxfY2hlY2tsc3RyaW5nKSAobHVhX1N0YXRlICpMLCBpbnQgbnVtQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbCk7CitMVUFMSUJfQVBJIGNvbnN0IGNoYXIgKihsdWFMX29wdGxzdHJpbmcpIChsdWFfU3RhdGUgKkwsIGludCBudW1BcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZWYsIHNpemVfdCAqbCk7CitMVUFMSUJfQVBJIGx1YV9OdW1iZXIgKGx1YUxfY2hlY2tudW1iZXIpIChsdWFfU3RhdGUgKkwsIGludCBudW1BcmcpOworTFVBTElCX0FQSSBsdWFfTnVtYmVyIChsdWFMX29wdG51bWJlcikgKGx1YV9TdGF0ZSAqTCwgaW50IG5BcmcsIGx1YV9OdW1iZXIgZGVmKTsKKworTFVBTElCX0FQSSBsdWFfSW50ZWdlciAobHVhTF9jaGVja2ludGVnZXIpIChsdWFfU3RhdGUgKkwsIGludCBudW1BcmcpOworTFVBTElCX0FQSSBsdWFfSW50ZWdlciAobHVhTF9vcHRpbnRlZ2VyKSAobHVhX1N0YXRlICpMLCBpbnQgbkFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YV9JbnRlZ2VyIGRlZik7CitMVUFMSUJfQVBJIGx1YV9VbnNpZ25lZCAobHVhTF9jaGVja3Vuc2lnbmVkKSAobHVhX1N0YXRlICpMLCBpbnQgbnVtQXJnKTsKK0xVQUxJQl9BUEkgbHVhX1Vuc2lnbmVkIChsdWFMX29wdHVuc2lnbmVkKSAobHVhX1N0YXRlICpMLCBpbnQgbnVtQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFfVW5zaWduZWQgZGVmKTsKKworTFVBTElCX0FQSSB2b2lkIChsdWFMX2NoZWNrc3RhY2spIChsdWFfU3RhdGUgKkwsIGludCBzeiwgY29uc3QgY2hhciAqbXNnKTsKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF9jaGVja3R5cGUpIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLCBpbnQgdCk7CitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfY2hlY2thbnkpIChsdWFfU3RhdGUgKkwsIGludCBuYXJnKTsKKworTFVBTElCX0FQSSBpbnQgICAobHVhTF9uZXdtZXRhdGFibGUpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnRuYW1lKTsKK0xVQUxJQl9BUEkgdm9pZCAgKGx1YUxfc2V0bWV0YXRhYmxlKSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICp0bmFtZSk7CitMVUFMSUJfQVBJIHZvaWQgKihsdWFMX3Rlc3R1ZGF0YSkgKGx1YV9TdGF0ZSAqTCwgaW50IHVkLCBjb25zdCBjaGFyICp0bmFtZSk7CitMVUFMSUJfQVBJIHZvaWQgKihsdWFMX2NoZWNrdWRhdGEpIChsdWFfU3RhdGUgKkwsIGludCB1ZCwgY29uc3QgY2hhciAqdG5hbWUpOworCitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfd2hlcmUpIChsdWFfU3RhdGUgKkwsIGludCBsdmwpOworTFVBTElCX0FQSSBpbnQgKGx1YUxfZXJyb3IpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworTFVBTElCX0FQSSBpbnQgKGx1YUxfY2hlY2tvcHRpb24pIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLCBjb25zdCBjaGFyICpkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGxzdFtdKTsKKworTFVBTElCX0FQSSBpbnQgKGx1YUxfZmlsZXJlc3VsdCkgKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXQsIGNvbnN0IGNoYXIgKmZuYW1lKTsKK0xVQUxJQl9BUEkgaW50IChsdWFMX2V4ZWNyZXN1bHQpIChsdWFfU3RhdGUgKkwsIGludCBzdGF0KTsKKworLyogcHJlLWRlZmluZWQgcmVmZXJlbmNlcyAqLworI2RlZmluZSBMVUFfTk9SRUYgICAgICAgKC0yKQorI2RlZmluZSBMVUFfUkVGTklMICAgICAgKC0xKQorCitMVUFMSUJfQVBJIGludCAobHVhTF9yZWYpIChsdWFfU3RhdGUgKkwsIGludCB0KTsKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF91bnJlZikgKGx1YV9TdGF0ZSAqTCwgaW50IHQsIGludCByZWYpOworCitMVUFMSUJfQVBJIGludCAobHVhTF9sb2FkZmlsZXgpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlKTsKKworI2RlZmluZSBsdWFMX2xvYWRmaWxlKEwsZikJbHVhTF9sb2FkZmlsZXgoTCxmLE5VTEwpCisKK0xVQUxJQl9BUEkgaW50IChsdWFMX2xvYWRidWZmZXJ4KSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpidWZmLCBzaXplX3Qgc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpOworTFVBTElCX0FQSSBpbnQgKGx1YUxfbG9hZHN0cmluZykgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcyk7CisKK0xVQUxJQl9BUEkgbHVhX1N0YXRlICoobHVhTF9uZXdzdGF0ZSkgKHZvaWQpOworCitMVUFMSUJfQVBJIGludCAobHVhTF9sZW4pIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworCitMVUFMSUJfQVBJIGNvbnN0IGNoYXIgKihsdWFMX2dzdWIpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnIpOworCitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfc2V0ZnVuY3MpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGx1YUxfUmVnICpsLCBpbnQgbnVwKTsKKworTFVBTElCX0FQSSBpbnQgKGx1YUxfZ2V0c3VidGFibGUpIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGNvbnN0IGNoYXIgKmZuYW1lKTsKKworTFVBTElCX0FQSSB2b2lkIChsdWFMX3RyYWNlYmFjaykgKGx1YV9TdGF0ZSAqTCwgbHVhX1N0YXRlICpMMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptc2csIGludCBsZXZlbCk7CisKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF9yZXF1aXJlZikgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbW9kbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YV9DRnVuY3Rpb24gb3BlbmYsIGludCBnbGIpOworCisvKgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBzb21lIHVzZWZ1bCBtYWNyb3MKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCisjZGVmaW5lIGx1YUxfbmV3bGlidGFibGUoTCxsKQlcCisgIGx1YV9jcmVhdGV0YWJsZShMLCAwLCBzaXplb2YobCkvc2l6ZW9mKChsKVswXSkgLSAxKQorCisjZGVmaW5lIGx1YUxfbmV3bGliKEwsbCkJKGx1YUxfbmV3bGlidGFibGUoTCxsKSwgbHVhTF9zZXRmdW5jcyhMLGwsMCkpCisKKyNkZWZpbmUgbHVhTF9hcmdjaGVjayhMLCBjb25kLG51bWFyZyxleHRyYW1zZykJXAorCQkoKHZvaWQpKChjb25kKSB8fCBsdWFMX2FyZ2Vycm9yKEwsIChudW1hcmcpLCAoZXh0cmFtc2cpKSkpCisjZGVmaW5lIGx1YUxfY2hlY2tzdHJpbmcoTCxuKQkobHVhTF9jaGVja2xzdHJpbmcoTCwgKG4pLCBOVUxMKSkKKyNkZWZpbmUgbHVhTF9vcHRzdHJpbmcoTCxuLGQpCShsdWFMX29wdGxzdHJpbmcoTCwgKG4pLCAoZCksIE5VTEwpKQorI2RlZmluZSBsdWFMX2NoZWNraW50KEwsbikJKChpbnQpbHVhTF9jaGVja2ludGVnZXIoTCwgKG4pKSkKKyNkZWZpbmUgbHVhTF9vcHRpbnQoTCxuLGQpCSgoaW50KWx1YUxfb3B0aW50ZWdlcihMLCAobiksIChkKSkpCisjZGVmaW5lIGx1YUxfY2hlY2tsb25nKEwsbikJKChsb25nKWx1YUxfY2hlY2tpbnRlZ2VyKEwsIChuKSkpCisjZGVmaW5lIGx1YUxfb3B0bG9uZyhMLG4sZCkJKChsb25nKWx1YUxfb3B0aW50ZWdlcihMLCAobiksIChkKSkpCisKKyNkZWZpbmUgbHVhTF90eXBlbmFtZShMLGkpCWx1YV90eXBlbmFtZShMLCBsdWFfdHlwZShMLChpKSkpCisKKyNkZWZpbmUgbHVhTF9kb2ZpbGUoTCwgZm4pIFwKKwkobHVhTF9sb2FkZmlsZShMLCBmbikgfHwgbHVhX3BjYWxsKEwsIDAsIExVQV9NVUxUUkVULCAwKSkKKworI2RlZmluZSBsdWFMX2Rvc3RyaW5nKEwsIHMpIFwKKwkobHVhTF9sb2Fkc3RyaW5nKEwsIHMpIHx8IGx1YV9wY2FsbChMLCAwLCBMVUFfTVVMVFJFVCwgMCkpCisKKyNkZWZpbmUgbHVhTF9nZXRtZXRhdGFibGUoTCxuKQkobHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCAobikpKQorCisjZGVmaW5lIGx1YUxfb3B0KEwsZixuLGQpCShsdWFfaXNub25lb3JuaWwoTCwobikpID8gKGQpIDogZihMLChuKSkpCisKKyNkZWZpbmUgbHVhTF9sb2FkYnVmZmVyKEwscyxzeixuKQlsdWFMX2xvYWRidWZmZXJ4KEwscyxzeixuLE5VTEwpCisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIEdlbmVyaWMgQnVmZmVyIG1hbmlwdWxhdGlvbgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgbHVhTF9CdWZmZXIgeworICBjaGFyICpiOyAgLyogYnVmZmVyIGFkZHJlc3MgKi8KKyAgc2l6ZV90IHNpemU7ICAvKiBidWZmZXIgc2l6ZSAqLworICBzaXplX3QgbjsgIC8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGJ1ZmZlciAqLworICBsdWFfU3RhdGUgKkw7CisgIGNoYXIgaW5pdGJbTFVBTF9CVUZGRVJTSVpFXTsgIC8qIGluaXRpYWwgYnVmZmVyICovCit9IGx1YUxfQnVmZmVyOworCisKKyNkZWZpbmUgbHVhTF9hZGRjaGFyKEIsYykgXAorICAoKHZvaWQpKChCKS0+biA8IChCKS0+c2l6ZSB8fCBsdWFMX3ByZXBidWZmc2l6ZSgoQiksIDEpKSwgXAorICAgKChCKS0+YlsoQiktPm4rK10gPSAoYykpKQorCisjZGVmaW5lIGx1YUxfYWRkc2l6ZShCLHMpCSgoQiktPm4gKz0gKHMpKQorCitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfYnVmZmluaXQpIChsdWFfU3RhdGUgKkwsIGx1YUxfQnVmZmVyICpCKTsKK0xVQUxJQl9BUEkgY2hhciAqKGx1YUxfcHJlcGJ1ZmZzaXplKSAobHVhTF9CdWZmZXIgKkIsIHNpemVfdCBzeik7CitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfYWRkbHN0cmluZykgKGx1YUxfQnVmZmVyICpCLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbCk7CitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfYWRkc3RyaW5nKSAobHVhTF9CdWZmZXIgKkIsIGNvbnN0IGNoYXIgKnMpOworTFVBTElCX0FQSSB2b2lkIChsdWFMX2FkZHZhbHVlKSAobHVhTF9CdWZmZXIgKkIpOworTFVBTElCX0FQSSB2b2lkIChsdWFMX3B1c2hyZXN1bHQpIChsdWFMX0J1ZmZlciAqQik7CitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfcHVzaHJlc3VsdHNpemUpIChsdWFMX0J1ZmZlciAqQiwgc2l6ZV90IHN6KTsKK0xVQUxJQl9BUEkgY2hhciAqKGx1YUxfYnVmZmluaXRzaXplKSAobHVhX1N0YXRlICpMLCBsdWFMX0J1ZmZlciAqQiwgc2l6ZV90IHN6KTsKKworI2RlZmluZSBsdWFMX3ByZXBidWZmZXIoQikJbHVhTF9wcmVwYnVmZnNpemUoQiwgTFVBTF9CVUZGRVJTSVpFKQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogRmlsZSBoYW5kbGVzIGZvciBJTyBsaWJyYXJ5CisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorKiogQSBmaWxlIGhhbmRsZSBpcyBhIHVzZXJkYXRhIHdpdGggbWV0YXRhYmxlICdMVUFfRklMRUhBTkRMRScgYW5kCisqKiBpbml0aWFsIHN0cnVjdHVyZSAnbHVhTF9TdHJlYW0nIChpdCBtYXkgY29udGFpbiBvdGhlciBmaWVsZHMKKyoqIGFmdGVyIHRoYXQgaW5pdGlhbCBzdHJ1Y3R1cmUpLgorKi8KKworI2RlZmluZSBMVUFfRklMRUhBTkRMRSAgICAgICAgICAiRklMRSoiCisKKwordHlwZWRlZiBzdHJ1Y3QgbHVhTF9TdHJlYW0geworICBGSUxFICpmOyAgLyogc3RyZWFtIChOVUxMIGZvciBpbmNvbXBsZXRlbHkgY3JlYXRlZCBzdHJlYW1zKSAqLworICBsdWFfQ0Z1bmN0aW9uIGNsb3NlZjsgIC8qIHRvIGNsb3NlIHN0cmVhbSAoTlVMTCBmb3IgY2xvc2VkIHN0cmVhbXMpICovCit9IGx1YUxfU3RyZWFtOworCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCisvKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIG1vZHVsZSBzeXN0ZW0gKi8KKyNpZiBkZWZpbmVkKExVQV9DT01QQVRfTU9EVUxFKQorCitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfcHVzaG1vZHVsZSkgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbW9kbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVoaW50KTsKK0xVQUxJQl9BUEkgdm9pZCAobHVhTF9vcGVubGliKSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpsaWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsdWFMX1JlZyAqbCwgaW50IG51cCk7CisKKyNkZWZpbmUgbHVhTF9yZWdpc3RlcihMLG4sbCkJKGx1YUxfb3BlbmxpYihMLChuKSwobCksMCkpCisKKyNlbmRpZgorCisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGJhc2VsaWIuYyBiL2NvbTMyL2x1YS9zcmMvbGJhc2VsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjU1YjNjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sYmFzZWxpYi5jCkBAIC0wLDAgKzEsNDU4IEBACisvKgorKiogJElkOiBsYmFzZWxpYi5jLHYgMS4yNzYuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogQmFzaWMgbGlicmFyeQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGxiYXNlbGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKworc3RhdGljIGludCBsdWFCX3ByaW50IChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IG4gPSBsdWFfZ2V0dG9wKEwpOyAgLyogbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworICBpbnQgaTsKKyAgbHVhX2dldGdsb2JhbChMLCAidG9zdHJpbmciKTsKKyAgZm9yIChpPTE7IGk8PW47IGkrKykgeworICAgIGNvbnN0IGNoYXIgKnM7CisgICAgc2l6ZV90IGw7CisgICAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7ICAvKiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgKi8KKyAgICBsdWFfcHVzaHZhbHVlKEwsIGkpOyAgIC8qIHZhbHVlIHRvIHByaW50ICovCisgICAgbHVhX2NhbGwoTCwgMSwgMSk7CisgICAgcyA9IGx1YV90b2xzdHJpbmcoTCwgLTEsICZsKTsgIC8qIGdldCByZXN1bHQgKi8KKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwKKyAgICAgICAgIExVQV9RTCgidG9zdHJpbmciKSAiIG11c3QgcmV0dXJuIGEgc3RyaW5nIHRvICIgTFVBX1FMKCJwcmludCIpKTsKKyAgICBpZiAoaT4xKSBsdWFpX3dyaXRlc3RyaW5nKCJcdCIsIDEpOworICAgIGx1YWlfd3JpdGVzdHJpbmcocywgbCk7CisgICAgbHVhX3BvcChMLCAxKTsgIC8qIHBvcCByZXN1bHQgKi8KKyAgfQorICBsdWFpX3dyaXRlbGluZSgpOworICByZXR1cm4gMDsKK30KKworCisjZGVmaW5lIFNQQUNFQ0hBUlMJIiBcZlxuXHJcdFx2IgorCitzdGF0aWMgaW50IGx1YUJfdG9udW1iZXIgKGx1YV9TdGF0ZSAqTCkgeworICBpZiAobHVhX2lzbm9uZW9ybmlsKEwsIDIpKSB7ICAvKiBzdGFuZGFyZCBjb252ZXJzaW9uICovCisgICAgaW50IGlzbnVtOworICAgIGx1YV9OdW1iZXIgbiA9IGx1YV90b251bWJlcngoTCwgMSwgJmlzbnVtKTsKKyAgICBpZiAoaXNudW0pIHsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIG4pOworICAgICAgcmV0dXJuIDE7CisgICAgfSAgLyogZWxzZSBub3QgYSBudW1iZXI7IG11c3QgYmUgc29tZXRoaW5nICovCisgICAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgfQorICBlbHNlIHsKKyAgICBzaXplX3QgbDsKKyAgICBjb25zdCBjaGFyICpzID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMSwgJmwpOworICAgIGNvbnN0IGNoYXIgKmUgPSBzICsgbDsgIC8qIGVuZCBwb2ludCBmb3IgJ3MnICovCisgICAgaW50IGJhc2UgPSBsdWFMX2NoZWNraW50KEwsIDIpOworICAgIGludCBuZWcgPSAwOworICAgIGx1YUxfYXJnY2hlY2soTCwgMiA8PSBiYXNlICYmIGJhc2UgPD0gMzYsIDIsICJiYXNlIG91dCBvZiByYW5nZSIpOworICAgIHMgKz0gc3Ryc3BuKHMsIFNQQUNFQ0hBUlMpOyAgLyogc2tpcCBpbml0aWFsIHNwYWNlcyAqLworICAgIGlmICgqcyA9PSAnLScpIHsgcysrOyBuZWcgPSAxOyB9ICAvKiBoYW5kbGUgc2lnbmFsICovCisgICAgZWxzZSBpZiAoKnMgPT0gJysnKSBzKys7CisgICAgaWYgKGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpKnMpKSB7CisgICAgICBsdWFfTnVtYmVyIG4gPSAwOworICAgICAgZG8geworICAgICAgICBpbnQgZGlnaXQgPSAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikqcykpID8gKnMgLSAnMCcKKyAgICAgICAgICAgICAgICAgICAgICAgOiB0b3VwcGVyKCh1bnNpZ25lZCBjaGFyKSpzKSAtICdBJyArIDEwOworICAgICAgICBpZiAoZGlnaXQgPj0gYmFzZSkgYnJlYWs7ICAvKiBpbnZhbGlkIG51bWVyYWw7IGZvcmNlIGEgZmFpbCAqLworICAgICAgICBuID0gbiAqIChsdWFfTnVtYmVyKWJhc2UgKyAobHVhX051bWJlcilkaWdpdDsKKyAgICAgICAgcysrOworICAgICAgfSB3aGlsZSAoaXNhbG51bSgodW5zaWduZWQgY2hhcikqcykpOworICAgICAgcyArPSBzdHJzcG4ocywgU1BBQ0VDSEFSUyk7ICAvKiBza2lwIHRyYWlsaW5nIHNwYWNlcyAqLworICAgICAgaWYgKHMgPT0gZSkgeyAgLyogbm8gaW52YWxpZCB0cmFpbGluZyBjaGFyYWN0ZXJzPyAqLworICAgICAgICBsdWFfcHVzaG51bWJlcihMLCAobmVnKSA/IC1uIDogbik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfSAgLyogZWxzZSBub3QgYSBudW1iZXIgKi8KKyAgICB9ICAvKiBlbHNlIG5vdCBhIG51bWJlciAqLworICB9CisgIGx1YV9wdXNobmlsKEwpOyAgLyogbm90IGEgbnVtYmVyICovCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl9lcnJvciAobHVhX1N0YXRlICpMKSB7CisgIGludCBsZXZlbCA9IGx1YUxfb3B0aW50KEwsIDIsIDEpOworICBsdWFfc2V0dG9wKEwsIDEpOworICBpZiAobHVhX2lzc3RyaW5nKEwsIDEpICYmIGxldmVsID4gMCkgeyAgLyogYWRkIGV4dHJhIGluZm9ybWF0aW9uPyAqLworICAgIGx1YUxfd2hlcmUoTCwgbGV2ZWwpOworICAgIGx1YV9wdXNodmFsdWUoTCwgMSk7CisgICAgbHVhX2NvbmNhdChMLCAyKTsKKyAgfQorICByZXR1cm4gbHVhX2Vycm9yKEwpOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl9nZXRtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrYW55KEwsIDEpOworICBpZiAoIWx1YV9nZXRtZXRhdGFibGUoTCwgMSkpIHsKKyAgICBsdWFfcHVzaG5pbChMKTsKKyAgICByZXR1cm4gMTsgIC8qIG5vIG1ldGF0YWJsZSAqLworICB9CisgIGx1YUxfZ2V0bWV0YWZpZWxkKEwsIDEsICJfX21ldGF0YWJsZSIpOworICByZXR1cm4gMTsgIC8qIHJldHVybnMgZWl0aGVyIF9fbWV0YXRhYmxlIGZpZWxkIChpZiBwcmVzZW50KSBvciBtZXRhdGFibGUgKi8KK30KKworCitzdGF0aWMgaW50IGx1YUJfc2V0bWV0YXRhYmxlIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IHQgPSBsdWFfdHlwZShMLCAyKTsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMSwgTFVBX1RUQUJMRSk7CisgIGx1YUxfYXJnY2hlY2soTCwgdCA9PSBMVUFfVE5JTCB8fCB0ID09IExVQV9UVEFCTEUsIDIsCisgICAgICAgICAgICAgICAgICAgICJuaWwgb3IgdGFibGUgZXhwZWN0ZWQiKTsKKyAgaWYgKGx1YUxfZ2V0bWV0YWZpZWxkKEwsIDEsICJfX21ldGF0YWJsZSIpKQorICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICJjYW5ub3QgY2hhbmdlIGEgcHJvdGVjdGVkIG1ldGF0YWJsZSIpOworICBsdWFfc2V0dG9wKEwsIDIpOworICBsdWFfc2V0bWV0YXRhYmxlKEwsIDEpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGx1YUJfcmF3ZXF1YWwgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrYW55KEwsIDEpOworICBsdWFMX2NoZWNrYW55KEwsIDIpOworICBsdWFfcHVzaGJvb2xlYW4oTCwgbHVhX3Jhd2VxdWFsKEwsIDEsIDIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX3Jhd2xlbiAobHVhX1N0YXRlICpMKSB7CisgIGludCB0ID0gbHVhX3R5cGUoTCwgMSk7CisgIGx1YUxfYXJnY2hlY2soTCwgdCA9PSBMVUFfVFRBQkxFIHx8IHQgPT0gTFVBX1RTVFJJTkcsIDEsCisgICAgICAgICAgICAgICAgICAgInRhYmxlIG9yIHN0cmluZyBleHBlY3RlZCIpOworICBsdWFfcHVzaGludGVnZXIoTCwgbHVhX3Jhd2xlbihMLCAxKSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl9yYXdnZXQgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgbHVhTF9jaGVja2FueShMLCAyKTsKKyAgbHVhX3NldHRvcChMLCAyKTsKKyAgbHVhX3Jhd2dldChMLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbHVhQl9yYXdzZXQgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgbHVhTF9jaGVja2FueShMLCAyKTsKKyAgbHVhTF9jaGVja2FueShMLCAzKTsKKyAgbHVhX3NldHRvcChMLCAzKTsKKyAgbHVhX3Jhd3NldChMLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX2NvbGxlY3RnYXJiYWdlIChsdWFfU3RhdGUgKkwpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG9wdHNbXSA9IHsic3RvcCIsICJyZXN0YXJ0IiwgImNvbGxlY3QiLAorICAgICJjb3VudCIsICJzdGVwIiwgInNldHBhdXNlIiwgInNldHN0ZXBtdWwiLAorICAgICJzZXRtYWpvcmluYyIsICJpc3J1bm5pbmciLCAiZ2VuZXJhdGlvbmFsIiwgImluY3JlbWVudGFsIiwgTlVMTH07CisgIHN0YXRpYyBjb25zdCBpbnQgb3B0c251bVtdID0ge0xVQV9HQ1NUT1AsIExVQV9HQ1JFU1RBUlQsIExVQV9HQ0NPTExFQ1QsCisgICAgTFVBX0dDQ09VTlQsIExVQV9HQ1NURVAsIExVQV9HQ1NFVFBBVVNFLCBMVUFfR0NTRVRTVEVQTVVMLAorICAgIExVQV9HQ1NFVE1BSk9SSU5DLCBMVUFfR0NJU1JVTk5JTkcsIExVQV9HQ0dFTiwgTFVBX0dDSU5DfTsKKyAgaW50IG8gPSBvcHRzbnVtW2x1YUxfY2hlY2tvcHRpb24oTCwgMSwgImNvbGxlY3QiLCBvcHRzKV07CisgIGludCBleCA9IGx1YUxfb3B0aW50KEwsIDIsIDApOworICBpbnQgcmVzID0gbHVhX2djKEwsIG8sIGV4KTsKKyAgc3dpdGNoIChvKSB7CisgICAgY2FzZSBMVUFfR0NDT1VOVDogeworICAgICAgaW50IGIgPSBsdWFfZ2MoTCwgTFVBX0dDQ09VTlRCLCAwKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHJlcyArICgobHVhX051bWJlciliLzEwMjQpKTsKKyAgICAgIGx1YV9wdXNoaW50ZWdlcihMLCBiKTsKKyAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBjYXNlIExVQV9HQ1NURVA6IGNhc2UgTFVBX0dDSVNSVU5OSU5HOiB7CisgICAgICBsdWFfcHVzaGJvb2xlYW4oTCwgcmVzKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBsdWFfcHVzaGludGVnZXIoTCwgcmVzKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyBpbnQgbHVhQl90eXBlIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgbHVhTF90eXBlbmFtZShMLCAxKSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgcGFpcnNtZXRhIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50IGlzemVybywKKyAgICAgICAgICAgICAgICAgICAgICBsdWFfQ0Z1bmN0aW9uIGl0ZXIpIHsKKyAgaWYgKCFsdWFMX2dldG1ldGFmaWVsZChMLCAxLCBtZXRob2QpKSB7ICAvKiBubyBtZXRhbWV0aG9kPyAqLworICAgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9UVEFCTEUpOyAgLyogYXJndW1lbnQgbXVzdCBiZSBhIHRhYmxlICovCisgICAgbHVhX3B1c2hjZnVuY3Rpb24oTCwgaXRlcik7ICAvKiB3aWxsIHJldHVybiBnZW5lcmF0b3IsICovCisgICAgbHVhX3B1c2h2YWx1ZShMLCAxKTsgIC8qIHN0YXRlLCAqLworICAgIGlmIChpc3plcm8pIGx1YV9wdXNoaW50ZWdlcihMLCAwKTsgIC8qIGFuZCBpbml0aWFsIHZhbHVlICovCisgICAgZWxzZSBsdWFfcHVzaG5pbChMKTsKKyAgfQorICBlbHNlIHsKKyAgICBsdWFfcHVzaHZhbHVlKEwsIDEpOyAgLyogYXJndW1lbnQgJ3NlbGYnIHRvIG1ldGFtZXRob2QgKi8KKyAgICBsdWFfY2FsbChMLCAxLCAzKTsgIC8qIGdldCAzIHZhbHVlcyBmcm9tIG1ldGFtZXRob2QgKi8KKyAgfQorICByZXR1cm4gMzsKK30KKworCitzdGF0aWMgaW50IGx1YUJfbmV4dCAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9UVEFCTEUpOworICBsdWFfc2V0dG9wKEwsIDIpOyAgLyogY3JlYXRlIGEgMm5kIGFyZ3VtZW50IGlmIHRoZXJlIGlzbid0IG9uZSAqLworICBpZiAobHVhX25leHQoTCwgMSkpCisgICAgcmV0dXJuIDI7CisgIGVsc2UgeworICAgIGx1YV9wdXNobmlsKEwpOworICAgIHJldHVybiAxOworICB9Cit9CisKKworc3RhdGljIGludCBsdWFCX3BhaXJzIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIHBhaXJzbWV0YShMLCAiX19wYWlycyIsIDAsIGx1YUJfbmV4dCk7Cit9CisKKworc3RhdGljIGludCBpcGFpcnNhdXggKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgaSA9IGx1YUxfY2hlY2tpbnQoTCwgMik7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9UVEFCTEUpOworICBpKys7ICAvKiBuZXh0IHZhbHVlICovCisgIGx1YV9wdXNoaW50ZWdlcihMLCBpKTsKKyAgbHVhX3Jhd2dldGkoTCwgMSwgaSk7CisgIHJldHVybiAobHVhX2lzbmlsKEwsIC0xKSkgPyAxIDogMjsKK30KKworCitzdGF0aWMgaW50IGx1YUJfaXBhaXJzIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIHBhaXJzbWV0YShMLCAiX19pcGFpcnMiLCAxLCBpcGFpcnNhdXgpOworfQorCisKK3N0YXRpYyBpbnQgbG9hZF9hdXggKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXR1cywgaW50IGVudmlkeCkgeworICBpZiAoc3RhdHVzID09IExVQV9PSykgeworICAgIGlmIChlbnZpZHggIT0gMCkgeyAgLyogJ2VudicgcGFyYW1ldGVyPyAqLworICAgICAgbHVhX3B1c2h2YWx1ZShMLCBlbnZpZHgpOyAgLyogZW52aXJvbm1lbnQgZm9yIGxvYWRlZCBmdW5jdGlvbiAqLworICAgICAgaWYgKCFsdWFfc2V0dXB2YWx1ZShMLCAtMiwgMSkpICAvKiBzZXQgaXQgYXMgMXN0IHVwdmFsdWUgKi8KKyAgICAgICAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSAnZW52JyBpZiBub3QgdXNlZCBieSBwcmV2aW91cyBjYWxsICovCisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIGVsc2UgeyAgLyogZXJyb3IgKG1lc3NhZ2UgaXMgb24gdG9wIG9mIHRoZSBzdGFjaykgKi8KKyAgICBsdWFfcHVzaG5pbChMKTsKKyAgICBsdWFfaW5zZXJ0KEwsIC0yKTsgIC8qIHB1dCBiZWZvcmUgZXJyb3IgbWVzc2FnZSAqLworICAgIHJldHVybiAyOyAgLyogcmV0dXJuIG5pbCBwbHVzIGVycm9yIG1lc3NhZ2UgKi8KKyAgfQorfQorCisKK3N0YXRpYyBpbnQgbHVhQl9sb2FkZmlsZSAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKmZuYW1lID0gbHVhTF9vcHRzdHJpbmcoTCwgMSwgTlVMTCk7CisgIGNvbnN0IGNoYXIgKm1vZGUgPSBsdWFMX29wdHN0cmluZyhMLCAyLCBOVUxMKTsKKyAgaW50IGVudiA9ICghbHVhX2lzbm9uZShMLCAzKSA/IDMgOiAwKTsgIC8qICdlbnYnIGluZGV4IG9yIDAgaWYgbm8gJ2VudicgKi8KKyAgaW50IHN0YXR1cyA9IGx1YUxfbG9hZGZpbGV4KEwsIGZuYW1lLCBtb2RlKTsKKyAgcmV0dXJuIGxvYWRfYXV4KEwsIHN0YXR1cywgZW52KTsKK30KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogR2VuZXJpYyBSZWFkIGZ1bmN0aW9uCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKKy8qCisqKiByZXNlcnZlZCBzbG90LCBhYm92ZSBhbGwgYXJndW1lbnRzLCB0byBob2xkIGEgY29weSBvZiB0aGUgcmV0dXJuZWQKKyoqIHN0cmluZyB0byBhdm9pZCBpdCBiZWluZyBjb2xsZWN0ZWQgd2hpbGUgcGFyc2VkLiAnbG9hZCcgaGFzIGZvdXIKKyoqIG9wdGlvbmFsIGFyZ3VtZW50cyAoY2h1bmssIHNvdXJjZSBuYW1lLCBtb2RlLCBhbmQgZW52aXJvbm1lbnQpLgorKi8KKyNkZWZpbmUgUkVTRVJWRURTTE9UCTUKKworCisvKgorKiogUmVhZGVyIGZvciBnZW5lcmljIGBsb2FkJyBmdW5jdGlvbjogYGx1YV9sb2FkJyB1c2VzIHRoZQorKiogc3RhY2sgZm9yIGludGVybmFsIHN0dWZmLCBzbyB0aGUgcmVhZGVyIGNhbm5vdCBjaGFuZ2UgdGhlCisqKiBzdGFjayB0b3AuIEluc3RlYWQsIGl0IGtlZXBzIGl0cyByZXN1bHRpbmcgc3RyaW5nIGluIGEKKyoqIHJlc2VydmVkIHNsb3QgaW5zaWRlIHRoZSBzdGFjay4KKyovCitzdGF0aWMgY29uc3QgY2hhciAqZ2VuZXJpY19yZWFkZXIgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQsIHNpemVfdCAqc2l6ZSkgeworICAodm9pZCkodWQpOyAgLyogbm90IHVzZWQgKi8KKyAgbHVhTF9jaGVja3N0YWNrKEwsIDIsICJ0b28gbWFueSBuZXN0ZWQgZnVuY3Rpb25zIik7CisgIGx1YV9wdXNodmFsdWUoTCwgMSk7ICAvKiBnZXQgZnVuY3Rpb24gKi8KKyAgbHVhX2NhbGwoTCwgMCwgMSk7ICAvKiBjYWxsIGl0ICovCisgIGlmIChsdWFfaXNuaWwoTCwgLTEpKSB7CisgICAgbHVhX3BvcChMLCAxKTsgIC8qIHBvcCByZXN1bHQgKi8KKyAgICAqc2l6ZSA9IDA7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoIWx1YV9pc3N0cmluZyhMLCAtMSkpCisgICAgbHVhTF9lcnJvcihMLCAicmVhZGVyIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgc3RyaW5nIik7CisgIGx1YV9yZXBsYWNlKEwsIFJFU0VSVkVEU0xPVCk7ICAvKiBzYXZlIHN0cmluZyBpbiByZXNlcnZlZCBzbG90ICovCisgIHJldHVybiBsdWFfdG9sc3RyaW5nKEwsIFJFU0VSVkVEU0xPVCwgc2l6ZSk7Cit9CisKKworc3RhdGljIGludCBsdWFCX2xvYWQgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgc3RhdHVzOworICBzaXplX3QgbDsKKyAgY29uc3QgY2hhciAqcyA9IGx1YV90b2xzdHJpbmcoTCwgMSwgJmwpOworICBjb25zdCBjaGFyICptb2RlID0gbHVhTF9vcHRzdHJpbmcoTCwgMywgImJ0Iik7CisgIGludCBlbnYgPSAoIWx1YV9pc25vbmUoTCwgNCkgPyA0IDogMCk7ICAvKiAnZW52JyBpbmRleCBvciAwIGlmIG5vICdlbnYnICovCisgIGlmIChzICE9IE5VTEwpIHsgIC8qIGxvYWRpbmcgYSBzdHJpbmc/ICovCisgICAgY29uc3QgY2hhciAqY2h1bmtuYW1lID0gbHVhTF9vcHRzdHJpbmcoTCwgMiwgcyk7CisgICAgc3RhdHVzID0gbHVhTF9sb2FkYnVmZmVyeChMLCBzLCBsLCBjaHVua25hbWUsIG1vZGUpOworICB9CisgIGVsc2UgeyAgLyogbG9hZGluZyBmcm9tIGEgcmVhZGVyIGZ1bmN0aW9uICovCisgICAgY29uc3QgY2hhciAqY2h1bmtuYW1lID0gbHVhTF9vcHRzdHJpbmcoTCwgMiwgIj0obG9hZCkiKTsKKyAgICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVEZVTkNUSU9OKTsKKyAgICBsdWFfc2V0dG9wKEwsIFJFU0VSVkVEU0xPVCk7ICAvKiBjcmVhdGUgcmVzZXJ2ZWQgc2xvdCAqLworICAgIHN0YXR1cyA9IGx1YV9sb2FkKEwsIGdlbmVyaWNfcmVhZGVyLCBOVUxMLCBjaHVua25hbWUsIG1vZGUpOworICB9CisgIHJldHVybiBsb2FkX2F1eChMLCBzdGF0dXMsIGVudik7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitzdGF0aWMgaW50IGRvZmlsZWNvbnQgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gbHVhX2dldHRvcChMKSAtIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX2RvZmlsZSAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKmZuYW1lID0gbHVhTF9vcHRzdHJpbmcoTCwgMSwgTlVMTCk7CisgIGx1YV9zZXR0b3AoTCwgMSk7CisgIGlmIChsdWFMX2xvYWRmaWxlKEwsIGZuYW1lKSAhPSBMVUFfT0spCisgICAgcmV0dXJuIGx1YV9lcnJvcihMKTsKKyAgbHVhX2NhbGxrKEwsIDAsIExVQV9NVUxUUkVULCAwLCBkb2ZpbGVjb250KTsKKyAgcmV0dXJuIGRvZmlsZWNvbnQoTCk7Cit9CisKKworc3RhdGljIGludCBsdWFCX2Fzc2VydCAobHVhX1N0YXRlICpMKSB7CisgIGlmICghbHVhX3RvYm9vbGVhbihMLCAxKSkKKyAgICByZXR1cm4gbHVhTF9lcnJvcihMLCAiJXMiLCBsdWFMX29wdHN0cmluZyhMLCAyLCAiYXNzZXJ0aW9uIGZhaWxlZCEiKSk7CisgIHJldHVybiBsdWFfZ2V0dG9wKEwpOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl9zZWxlY3QgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgbiA9IGx1YV9nZXR0b3AoTCk7CisgIGlmIChsdWFfdHlwZShMLCAxKSA9PSBMVUFfVFNUUklORyAmJiAqbHVhX3Rvc3RyaW5nKEwsIDEpID09ICcjJykgeworICAgIGx1YV9wdXNoaW50ZWdlcihMLCBuLTEpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgeworICAgIGludCBpID0gbHVhTF9jaGVja2ludChMLCAxKTsKKyAgICBpZiAoaSA8IDApIGkgPSBuICsgaTsKKyAgICBlbHNlIGlmIChpID4gbikgaSA9IG47CisgICAgbHVhTF9hcmdjaGVjayhMLCAxIDw9IGksIDEsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gbiAtIGk7CisgIH0KK30KKworCitzdGF0aWMgaW50IGZpbmlzaHBjYWxsIChsdWFfU3RhdGUgKkwsIGludCBzdGF0dXMpIHsKKyAgaWYgKCFsdWFfY2hlY2tzdGFjayhMLCAxKSkgeyAgLyogbm8gc3BhY2UgZm9yIGV4dHJhIGJvb2xlYW4/ICovCisgICAgbHVhX3NldHRvcChMLCAwKTsgIC8qIGNyZWF0ZSBzcGFjZSBmb3IgcmV0dXJuIHZhbHVlcyAqLworICAgIGx1YV9wdXNoYm9vbGVhbihMLCAwKTsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAic3RhY2sgb3ZlcmZsb3ciKTsKKyAgICByZXR1cm4gMjsgIC8qIHJldHVybiBmYWxzZSwgbXNnICovCisgIH0KKyAgbHVhX3B1c2hib29sZWFuKEwsIHN0YXR1cyk7ICAvKiBmaXJzdCByZXN1bHQgKHN0YXR1cykgKi8KKyAgbHVhX3JlcGxhY2UoTCwgMSk7ICAvKiBwdXQgZmlyc3QgcmVzdWx0IGluIGZpcnN0IHNsb3QgKi8KKyAgcmV0dXJuIGx1YV9nZXR0b3AoTCk7Cit9CisKKworc3RhdGljIGludCBwY2FsbGNvbnQgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgc3RhdHVzID0gbHVhX2dldGN0eChMLCBOVUxMKTsKKyAgcmV0dXJuIGZpbmlzaHBjYWxsKEwsIChzdGF0dXMgPT0gTFVBX1lJRUxEKSk7Cit9CisKKworc3RhdGljIGludCBsdWFCX3BjYWxsIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IHN0YXR1czsKKyAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgbHVhX3B1c2huaWwoTCk7CisgIGx1YV9pbnNlcnQoTCwgMSk7ICAvKiBjcmVhdGUgc3BhY2UgZm9yIHN0YXR1cyByZXN1bHQgKi8KKyAgc3RhdHVzID0gbHVhX3BjYWxsayhMLCBsdWFfZ2V0dG9wKEwpIC0gMiwgTFVBX01VTFRSRVQsIDAsIDAsIHBjYWxsY29udCk7CisgIHJldHVybiBmaW5pc2hwY2FsbChMLCAoc3RhdHVzID09IExVQV9PSykpOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl94cGNhbGwgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgc3RhdHVzOworICBpbnQgbiA9IGx1YV9nZXR0b3AoTCk7CisgIGx1YUxfYXJnY2hlY2soTCwgbiA+PSAyLCAyLCAidmFsdWUgZXhwZWN0ZWQiKTsKKyAgbHVhX3B1c2h2YWx1ZShMLCAxKTsgIC8qIGV4Y2hhbmdlIGZ1bmN0aW9uLi4uICovCisgIGx1YV9jb3B5KEwsIDIsIDEpOyAgLyogLi4uYW5kIGVycm9yIGhhbmRsZXIgKi8KKyAgbHVhX3JlcGxhY2UoTCwgMik7CisgIHN0YXR1cyA9IGx1YV9wY2FsbGsoTCwgbiAtIDIsIExVQV9NVUxUUkVULCAxLCAwLCBwY2FsbGNvbnQpOworICByZXR1cm4gZmluaXNocGNhbGwoTCwgKHN0YXR1cyA9PSBMVUFfT0spKTsKK30KKworCitzdGF0aWMgaW50IGx1YUJfdG9zdHJpbmcgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrYW55KEwsIDEpOworICBsdWFMX3RvbHN0cmluZyhMLCAxLCBOVUxMKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIGJhc2VfZnVuY3NbXSA9IHsKKyAgeyJhc3NlcnQiLCBsdWFCX2Fzc2VydH0sCisgIHsiY29sbGVjdGdhcmJhZ2UiLCBsdWFCX2NvbGxlY3RnYXJiYWdlfSwKKyAgeyJkb2ZpbGUiLCBsdWFCX2RvZmlsZX0sCisgIHsiZXJyb3IiLCBsdWFCX2Vycm9yfSwKKyAgeyJnZXRtZXRhdGFibGUiLCBsdWFCX2dldG1ldGF0YWJsZX0sCisgIHsiaXBhaXJzIiwgbHVhQl9pcGFpcnN9LAorICB7ImxvYWRmaWxlIiwgbHVhQl9sb2FkZmlsZX0sCisgIHsibG9hZCIsIGx1YUJfbG9hZH0sCisjaWYgZGVmaW5lZChMVUFfQ09NUEFUX0xPQURTVFJJTkcpCisgIHsibG9hZHN0cmluZyIsIGx1YUJfbG9hZH0sCisjZW5kaWYKKyAgeyJuZXh0IiwgbHVhQl9uZXh0fSwKKyAgeyJwYWlycyIsIGx1YUJfcGFpcnN9LAorICB7InBjYWxsIiwgbHVhQl9wY2FsbH0sCisgIHsicHJpbnQiLCBsdWFCX3ByaW50fSwKKyAgeyJyYXdlcXVhbCIsIGx1YUJfcmF3ZXF1YWx9LAorICB7InJhd2xlbiIsIGx1YUJfcmF3bGVufSwKKyAgeyJyYXdnZXQiLCBsdWFCX3Jhd2dldH0sCisgIHsicmF3c2V0IiwgbHVhQl9yYXdzZXR9LAorICB7InNlbGVjdCIsIGx1YUJfc2VsZWN0fSwKKyAgeyJzZXRtZXRhdGFibGUiLCBsdWFCX3NldG1ldGF0YWJsZX0sCisgIHsidG9udW1iZXIiLCBsdWFCX3RvbnVtYmVyfSwKKyAgeyJ0b3N0cmluZyIsIGx1YUJfdG9zdHJpbmd9LAorICB7InR5cGUiLCBsdWFCX3R5cGV9LAorICB7InhwY2FsbCIsIGx1YUJfeHBjYWxsfSwKKyAge05VTEwsIE5VTEx9Cit9OworCisKK0xVQU1PRF9BUEkgaW50IGx1YW9wZW5fYmFzZSAobHVhX1N0YXRlICpMKSB7CisgIC8qIHNldCBnbG9iYWwgX0cgKi8KKyAgbHVhX3B1c2hnbG9iYWx0YWJsZShMKTsKKyAgbHVhX3B1c2hnbG9iYWx0YWJsZShMKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAiX0ciKTsKKyAgLyogb3BlbiBsaWIgaW50byBnbG9iYWwgdGFibGUgKi8KKyAgbHVhTF9zZXRmdW5jcyhMLCBiYXNlX2Z1bmNzLCAwKTsKKyAgbHVhX3B1c2hsaXRlcmFsKEwsIExVQV9WRVJTSU9OKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAiX1ZFUlNJT04iKTsgIC8qIHNldCBnbG9iYWwgX1ZFUlNJT04gKi8KKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGJpdGxpYi5jIGIvY29tMzIvbHVhL3NyYy9sYml0bGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjN2I2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbGJpdGxpYi5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorKiogJElkOiBsYml0bGliLmMsdiAxLjE4LjEuMiAyMDEzLzA3LzA5IDE4OjAxOjQxIHJvYmVydG8gRXhwICQKKyoqIFN0YW5kYXJkIGxpYnJhcnkgZm9yIGJpdHdpc2Ugb3BlcmF0aW9ucworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNkZWZpbmUgbGJpdGxpYl9jCisjZGVmaW5lIExVQV9MSUIKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGF1eGxpYi5oIgorI2luY2x1ZGUgImx1YWxpYi5oIgorCisKKy8qIG51bWJlciBvZiBiaXRzIHRvIGNvbnNpZGVyIGluIGEgbnVtYmVyICovCisjaWYgIWRlZmluZWQoTFVBX05CSVRTKQorI2RlZmluZSBMVUFfTkJJVFMJMzIKKyNlbmRpZgorCisKKyNkZWZpbmUgQUxMT05FUwkJKH4oKCh+KGx1YV9VbnNpZ25lZCkwKSA8PCAoTFVBX05CSVRTIC0gMSkpIDw8IDEpKQorCisvKiBtYWNybyB0byB0cmltIGV4dHJhIGJpdHMgKi8KKyNkZWZpbmUgdHJpbSh4KQkJKCh4KSAmIEFMTE9ORVMpCisKKworLyogYnVpbGRzIGEgbnVtYmVyIHdpdGggJ24nIG9uZXMgKDEgPD0gbiA8PSBMVUFfTkJJVFMpICovCisjZGVmaW5lIG1hc2sobikJCSh+KChBTExPTkVTIDw8IDEpIDw8ICgobikgLSAxKSkpCisKKwordHlwZWRlZiBsdWFfVW5zaWduZWQgYl91aW50OworCisKKworc3RhdGljIGJfdWludCBhbmRhdXggKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgaSwgbiA9IGx1YV9nZXR0b3AoTCk7CisgIGJfdWludCByID0gfihiX3VpbnQpMDsKKyAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspCisgICAgciAmPSBsdWFMX2NoZWNrdW5zaWduZWQoTCwgaSk7CisgIHJldHVybiB0cmltKHIpOworfQorCisKK3N0YXRpYyBpbnQgYl9hbmQgKGx1YV9TdGF0ZSAqTCkgeworICBiX3VpbnQgciA9IGFuZGF1eChMKTsKKyAgbHVhX3B1c2h1bnNpZ25lZChMLCByKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBiX3Rlc3QgKGx1YV9TdGF0ZSAqTCkgeworICBiX3VpbnQgciA9IGFuZGF1eChMKTsKKyAgbHVhX3B1c2hib29sZWFuKEwsIHIgIT0gMCk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgYl9vciAobHVhX1N0YXRlICpMKSB7CisgIGludCBpLCBuID0gbHVhX2dldHRvcChMKTsKKyAgYl91aW50IHIgPSAwOworICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykKKyAgICByIHw9IGx1YUxfY2hlY2t1bnNpZ25lZChMLCBpKTsKKyAgbHVhX3B1c2h1bnNpZ25lZChMLCB0cmltKHIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBiX3hvciAobHVhX1N0YXRlICpMKSB7CisgIGludCBpLCBuID0gbHVhX2dldHRvcChMKTsKKyAgYl91aW50IHIgPSAwOworICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykKKyAgICByIF49IGx1YUxfY2hlY2t1bnNpZ25lZChMLCBpKTsKKyAgbHVhX3B1c2h1bnNpZ25lZChMLCB0cmltKHIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBiX25vdCAobHVhX1N0YXRlICpMKSB7CisgIGJfdWludCByID0gfmx1YUxfY2hlY2t1bnNpZ25lZChMLCAxKTsKKyAgbHVhX3B1c2h1bnNpZ25lZChMLCB0cmltKHIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBiX3NoaWZ0IChsdWFfU3RhdGUgKkwsIGJfdWludCByLCBpbnQgaSkgeworICBpZiAoaSA8IDApIHsgIC8qIHNoaWZ0IHJpZ2h0PyAqLworICAgIGkgPSAtaTsKKyAgICByID0gdHJpbShyKTsKKyAgICBpZiAoaSA+PSBMVUFfTkJJVFMpIHIgPSAwOworICAgIGVsc2UgciA+Pj0gaTsKKyAgfQorICBlbHNlIHsgIC8qIHNoaWZ0IGxlZnQgKi8KKyAgICBpZiAoaSA+PSBMVUFfTkJJVFMpIHIgPSAwOworICAgIGVsc2UgciA8PD0gaTsKKyAgICByID0gdHJpbShyKTsKKyAgfQorICBsdWFfcHVzaHVuc2lnbmVkKEwsIHIpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGJfbHNoaWZ0IChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIGJfc2hpZnQoTCwgbHVhTF9jaGVja3Vuc2lnbmVkKEwsIDEpLCBsdWFMX2NoZWNraW50KEwsIDIpKTsKK30KKworCitzdGF0aWMgaW50IGJfcnNoaWZ0IChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIGJfc2hpZnQoTCwgbHVhTF9jaGVja3Vuc2lnbmVkKEwsIDEpLCAtbHVhTF9jaGVja2ludChMLCAyKSk7Cit9CisKKworc3RhdGljIGludCBiX2Fyc2hpZnQgKGx1YV9TdGF0ZSAqTCkgeworICBiX3VpbnQgciA9IGx1YUxfY2hlY2t1bnNpZ25lZChMLCAxKTsKKyAgaW50IGkgPSBsdWFMX2NoZWNraW50KEwsIDIpOworICBpZiAoaSA8IDAgfHwgIShyICYgKChiX3VpbnQpMSA8PCAoTFVBX05CSVRTIC0gMSkpKSkKKyAgICByZXR1cm4gYl9zaGlmdChMLCByLCAtaSk7CisgIGVsc2UgeyAgLyogYXJpdGhtZXRpYyBzaGlmdCBmb3IgJ25lZ2F0aXZlJyBudW1iZXIgKi8KKyAgICBpZiAoaSA+PSBMVUFfTkJJVFMpIHIgPSBBTExPTkVTOworICAgIGVsc2UKKyAgICAgIHIgPSB0cmltKChyID4+IGkpIHwgfih+KGJfdWludCkwID4+IGkpKTsgIC8qIGFkZCBzaWduYWwgYml0ICovCisgICAgbHVhX3B1c2h1bnNpZ25lZChMLCByKTsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgYl9yb3QgKGx1YV9TdGF0ZSAqTCwgaW50IGkpIHsKKyAgYl91aW50IHIgPSBsdWFMX2NoZWNrdW5zaWduZWQoTCwgMSk7CisgIGkgJj0gKExVQV9OQklUUyAtIDEpOyAgLyogaSA9IGkgJSBOQklUUyAqLworICByID0gdHJpbShyKTsKKyAgaWYgKGkgIT0gMCkgIC8qIGF2b2lkIHVuZGVmaW5lZCBzaGlmdCBvZiBMVUFfTkJJVFMgd2hlbiBpID09IDAgKi8KKyAgICByID0gKHIgPDwgaSkgfCAociA+PiAoTFVBX05CSVRTIC0gaSkpOworICBsdWFfcHVzaHVuc2lnbmVkKEwsIHRyaW0ocikpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGJfbHJvdCAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBiX3JvdChMLCBsdWFMX2NoZWNraW50KEwsIDIpKTsKK30KKworCitzdGF0aWMgaW50IGJfcnJvdCAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBiX3JvdChMLCAtbHVhTF9jaGVja2ludChMLCAyKSk7Cit9CisKKworLyoKKyoqIGdldCBmaWVsZCBhbmQgd2lkdGggYXJndW1lbnRzIGZvciBmaWVsZC1tYW5pcHVsYXRpb24gZnVuY3Rpb25zLAorKiogY2hlY2tpbmcgd2hldGhlciB0aGV5IGFyZSB2YWxpZC4KKyoqICgnbHVhTF9lcnJvcicgY2FsbGVkIHdpdGhvdXQgJ3JldHVybicgdG8gYXZvaWQgbGF0ZXIgd2FybmluZ3MgYWJvdXQKKyoqICd3aWR0aCcgYmVpbmcgdXNlZCB1bmluaXRpYWxpemVkLikKKyovCitzdGF0aWMgaW50IGZpZWxkYXJncyAobHVhX1N0YXRlICpMLCBpbnQgZmFyZywgaW50ICp3aWR0aCkgeworICBpbnQgZiA9IGx1YUxfY2hlY2tpbnQoTCwgZmFyZyk7CisgIGludCB3ID0gbHVhTF9vcHRpbnQoTCwgZmFyZyArIDEsIDEpOworICBsdWFMX2FyZ2NoZWNrKEwsIDAgPD0gZiwgZmFyZywgImZpZWxkIGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICBsdWFMX2FyZ2NoZWNrKEwsIDAgPCB3LCBmYXJnICsgMSwgIndpZHRoIG11c3QgYmUgcG9zaXRpdmUiKTsKKyAgaWYgKGYgKyB3ID4gTFVBX05CSVRTKQorICAgIGx1YUxfZXJyb3IoTCwgInRyeWluZyB0byBhY2Nlc3Mgbm9uLWV4aXN0ZW50IGJpdHMiKTsKKyAgKndpZHRoID0gdzsKKyAgcmV0dXJuIGY7Cit9CisKKworc3RhdGljIGludCBiX2V4dHJhY3QgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgdzsKKyAgYl91aW50IHIgPSBsdWFMX2NoZWNrdW5zaWduZWQoTCwgMSk7CisgIGludCBmID0gZmllbGRhcmdzKEwsIDIsICZ3KTsKKyAgciA9IChyID4+IGYpICYgbWFzayh3KTsKKyAgbHVhX3B1c2h1bnNpZ25lZChMLCByKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBiX3JlcGxhY2UgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgdzsKKyAgYl91aW50IHIgPSBsdWFMX2NoZWNrdW5zaWduZWQoTCwgMSk7CisgIGJfdWludCB2ID0gbHVhTF9jaGVja3Vuc2lnbmVkKEwsIDIpOworICBpbnQgZiA9IGZpZWxkYXJncyhMLCAzLCAmdyk7CisgIGludCBtID0gbWFzayh3KTsKKyAgdiAmPSBtOyAgLyogZXJhc2UgYml0cyBvdXRzaWRlIGdpdmVuIHdpZHRoICovCisgIHIgPSAociAmIH4obSA8PCBmKSkgfCAodiA8PCBmKTsKKyAgbHVhX3B1c2h1bnNpZ25lZChMLCByKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIGJpdGxpYltdID0geworICB7ImFyc2hpZnQiLCBiX2Fyc2hpZnR9LAorICB7ImJhbmQiLCBiX2FuZH0sCisgIHsiYm5vdCIsIGJfbm90fSwKKyAgeyJib3IiLCBiX29yfSwKKyAgeyJieG9yIiwgYl94b3J9LAorICB7ImJ0ZXN0IiwgYl90ZXN0fSwKKyAgeyJleHRyYWN0IiwgYl9leHRyYWN0fSwKKyAgeyJscm90YXRlIiwgYl9scm90fSwKKyAgeyJsc2hpZnQiLCBiX2xzaGlmdH0sCisgIHsicmVwbGFjZSIsIGJfcmVwbGFjZX0sCisgIHsicnJvdGF0ZSIsIGJfcnJvdH0sCisgIHsicnNoaWZ0IiwgYl9yc2hpZnR9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworCitMVUFNT0RfQVBJIGludCBsdWFvcGVuX2JpdDMyIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9uZXdsaWIoTCwgYml0bGliKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGNvZGUuYyBiL2NvbTMyL2x1YS9zcmMvbGNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjBiOTVjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sY29kZS5jCkBAIC0wLDAgKzEsODgxIEBACisvKgorKiogJElkOiBsY29kZS5jLHYgMi42Mi4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBDb2RlIGdlbmVyYXRvciBmb3IgTHVhCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgbGNvZGVfYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsY29kZS5oIgorI2luY2x1ZGUgImxkZWJ1Zy5oIgorI2luY2x1ZGUgImxkby5oIgorI2luY2x1ZGUgImxnYy5oIgorI2luY2x1ZGUgImxsZXguaCIKKyNpbmNsdWRlICJsbWVtLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxvcGNvZGVzLmgiCisjaW5jbHVkZSAibHBhcnNlci5oIgorI2luY2x1ZGUgImxzdHJpbmcuaCIKKyNpbmNsdWRlICJsdGFibGUuaCIKKyNpbmNsdWRlICJsdm0uaCIKKworCisjZGVmaW5lIGhhc2p1bXBzKGUpCSgoZSktPnQgIT0gKGUpLT5mKQorCisKK3N0YXRpYyBpbnQgaXNudW1lcmFsKGV4cGRlc2MgKmUpIHsKKyAgcmV0dXJuIChlLT5rID09IFZLTlVNICYmIGUtPnQgPT0gTk9fSlVNUCAmJiBlLT5mID09IE5PX0pVTVApOworfQorCisKK3ZvaWQgbHVhS19uaWwgKEZ1bmNTdGF0ZSAqZnMsIGludCBmcm9tLCBpbnQgbikgeworICBJbnN0cnVjdGlvbiAqcHJldmlvdXM7CisgIGludCBsID0gZnJvbSArIG4gLSAxOyAgLyogbGFzdCByZWdpc3RlciB0byBzZXQgbmlsICovCisgIGlmIChmcy0+cGMgPiBmcy0+bGFzdHRhcmdldCkgeyAgLyogbm8ganVtcHMgdG8gY3VycmVudCBwb3NpdGlvbj8gKi8KKyAgICBwcmV2aW91cyA9ICZmcy0+Zi0+Y29kZVtmcy0+cGMtMV07CisgICAgaWYgKEdFVF9PUENPREUoKnByZXZpb3VzKSA9PSBPUF9MT0FETklMKSB7CisgICAgICBpbnQgcGZyb20gPSBHRVRBUkdfQSgqcHJldmlvdXMpOworICAgICAgaW50IHBsID0gcGZyb20gKyBHRVRBUkdfQigqcHJldmlvdXMpOworICAgICAgaWYgKChwZnJvbSA8PSBmcm9tICYmIGZyb20gPD0gcGwgKyAxKSB8fAorICAgICAgICAgIChmcm9tIDw9IHBmcm9tICYmIHBmcm9tIDw9IGwgKyAxKSkgeyAgLyogY2FuIGNvbm5lY3QgYm90aD8gKi8KKyAgICAgICAgaWYgKHBmcm9tIDwgZnJvbSkgZnJvbSA9IHBmcm9tOyAgLyogZnJvbSA9IG1pbihmcm9tLCBwZnJvbSkgKi8KKyAgICAgICAgaWYgKHBsID4gbCkgbCA9IHBsOyAgLyogbCA9IG1heChsLCBwbCkgKi8KKyAgICAgICAgU0VUQVJHX0EoKnByZXZpb3VzLCBmcm9tKTsKKyAgICAgICAgU0VUQVJHX0IoKnByZXZpb3VzLCBsIC0gZnJvbSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9ICAvKiBlbHNlIGdvIHRocm91Z2ggKi8KKyAgfQorICBsdWFLX2NvZGVBQkMoZnMsIE9QX0xPQUROSUwsIGZyb20sIG4gLSAxLCAwKTsgIC8qIGVsc2Ugbm8gb3B0aW1pemF0aW9uICovCit9CisKKworaW50IGx1YUtfanVtcCAoRnVuY1N0YXRlICpmcykgeworICBpbnQganBjID0gZnMtPmpwYzsgIC8qIHNhdmUgbGlzdCBvZiBqdW1wcyB0byBoZXJlICovCisgIGludCBqOworICBmcy0+anBjID0gTk9fSlVNUDsKKyAgaiA9IGx1YUtfY29kZUFzQngoZnMsIE9QX0pNUCwgMCwgTk9fSlVNUCk7CisgIGx1YUtfY29uY2F0KGZzLCAmaiwganBjKTsgIC8qIGtlZXAgdGhlbSBvbiBob2xkICovCisgIHJldHVybiBqOworfQorCisKK3ZvaWQgbHVhS19yZXQgKEZ1bmNTdGF0ZSAqZnMsIGludCBmaXJzdCwgaW50IG5yZXQpIHsKKyAgbHVhS19jb2RlQUJDKGZzLCBPUF9SRVRVUk4sIGZpcnN0LCBucmV0KzEsIDApOworfQorCisKK3N0YXRpYyBpbnQgY29uZGp1bXAgKEZ1bmNTdGF0ZSAqZnMsIE9wQ29kZSBvcCwgaW50IEEsIGludCBCLCBpbnQgQykgeworICBsdWFLX2NvZGVBQkMoZnMsIG9wLCBBLCBCLCBDKTsKKyAgcmV0dXJuIGx1YUtfanVtcChmcyk7Cit9CisKKworc3RhdGljIHZvaWQgZml4anVtcCAoRnVuY1N0YXRlICpmcywgaW50IHBjLCBpbnQgZGVzdCkgeworICBJbnN0cnVjdGlvbiAqam1wID0gJmZzLT5mLT5jb2RlW3BjXTsKKyAgaW50IG9mZnNldCA9IGRlc3QtKHBjKzEpOworICBsdWFfYXNzZXJ0KGRlc3QgIT0gTk9fSlVNUCk7CisgIGlmIChhYnMob2Zmc2V0KSA+IE1BWEFSR19zQngpCisgICAgbHVhWF9zeW50YXhlcnJvcihmcy0+bHMsICJjb250cm9sIHN0cnVjdHVyZSB0b28gbG9uZyIpOworICBTRVRBUkdfc0J4KCpqbXAsIG9mZnNldCk7Cit9CisKKworLyoKKyoqIHJldHVybnMgY3VycmVudCBgcGMnIGFuZCBtYXJrcyBpdCBhcyBhIGp1bXAgdGFyZ2V0ICh0byBhdm9pZCB3cm9uZworKiogb3B0aW1pemF0aW9ucyB3aXRoIGNvbnNlY3V0aXZlIGluc3RydWN0aW9ucyBub3QgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2spLgorKi8KK2ludCBsdWFLX2dldGxhYmVsIChGdW5jU3RhdGUgKmZzKSB7CisgIGZzLT5sYXN0dGFyZ2V0ID0gZnMtPnBjOworICByZXR1cm4gZnMtPnBjOworfQorCisKK3N0YXRpYyBpbnQgZ2V0anVtcCAoRnVuY1N0YXRlICpmcywgaW50IHBjKSB7CisgIGludCBvZmZzZXQgPSBHRVRBUkdfc0J4KGZzLT5mLT5jb2RlW3BjXSk7CisgIGlmIChvZmZzZXQgPT0gTk9fSlVNUCkgIC8qIHBvaW50IHRvIGl0c2VsZiByZXByZXNlbnRzIGVuZCBvZiBsaXN0ICovCisgICAgcmV0dXJuIE5PX0pVTVA7ICAvKiBlbmQgb2YgbGlzdCAqLworICBlbHNlCisgICAgcmV0dXJuIChwYysxKStvZmZzZXQ7ICAvKiB0dXJuIG9mZnNldCBpbnRvIGFic29sdXRlIHBvc2l0aW9uICovCit9CisKKworc3RhdGljIEluc3RydWN0aW9uICpnZXRqdW1wY29udHJvbCAoRnVuY1N0YXRlICpmcywgaW50IHBjKSB7CisgIEluc3RydWN0aW9uICpwaSA9ICZmcy0+Zi0+Y29kZVtwY107CisgIGlmIChwYyA+PSAxICYmIHRlc3RUTW9kZShHRVRfT1BDT0RFKCoocGktMSkpKSkKKyAgICByZXR1cm4gcGktMTsKKyAgZWxzZQorICAgIHJldHVybiBwaTsKK30KKworCisvKgorKiogY2hlY2sgd2hldGhlciBsaXN0IGhhcyBhbnkganVtcCB0aGF0IGRvIG5vdCBwcm9kdWNlIGEgdmFsdWUKKyoqIChvciBwcm9kdWNlIGFuIGludmVydGVkIHZhbHVlKQorKi8KK3N0YXRpYyBpbnQgbmVlZF92YWx1ZSAoRnVuY1N0YXRlICpmcywgaW50IGxpc3QpIHsKKyAgZm9yICg7IGxpc3QgIT0gTk9fSlVNUDsgbGlzdCA9IGdldGp1bXAoZnMsIGxpc3QpKSB7CisgICAgSW5zdHJ1Y3Rpb24gaSA9ICpnZXRqdW1wY29udHJvbChmcywgbGlzdCk7CisgICAgaWYgKEdFVF9PUENPREUoaSkgIT0gT1BfVEVTVFNFVCkgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7ICAvKiBub3QgZm91bmQgKi8KK30KKworCitzdGF0aWMgaW50IHBhdGNodGVzdHJlZyAoRnVuY1N0YXRlICpmcywgaW50IG5vZGUsIGludCByZWcpIHsKKyAgSW5zdHJ1Y3Rpb24gKmkgPSBnZXRqdW1wY29udHJvbChmcywgbm9kZSk7CisgIGlmIChHRVRfT1BDT0RFKCppKSAhPSBPUF9URVNUU0VUKQorICAgIHJldHVybiAwOyAgLyogY2Fubm90IHBhdGNoIG90aGVyIGluc3RydWN0aW9ucyAqLworICBpZiAocmVnICE9IE5PX1JFRyAmJiByZWcgIT0gR0VUQVJHX0IoKmkpKQorICAgIFNFVEFSR19BKCppLCByZWcpOworICBlbHNlICAvKiBubyByZWdpc3RlciB0byBwdXQgdmFsdWUgb3IgcmVnaXN0ZXIgYWxyZWFkeSBoYXMgdGhlIHZhbHVlICovCisgICAgKmkgPSBDUkVBVEVfQUJDKE9QX1RFU1QsIEdFVEFSR19CKCppKSwgMCwgR0VUQVJHX0MoKmkpKTsKKworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgdm9pZCByZW1vdmV2YWx1ZXMgKEZ1bmNTdGF0ZSAqZnMsIGludCBsaXN0KSB7CisgIGZvciAoOyBsaXN0ICE9IE5PX0pVTVA7IGxpc3QgPSBnZXRqdW1wKGZzLCBsaXN0KSkKKyAgICAgIHBhdGNodGVzdHJlZyhmcywgbGlzdCwgTk9fUkVHKTsKK30KKworCitzdGF0aWMgdm9pZCBwYXRjaGxpc3RhdXggKEZ1bmNTdGF0ZSAqZnMsIGludCBsaXN0LCBpbnQgdnRhcmdldCwgaW50IHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR0YXJnZXQpIHsKKyAgd2hpbGUgKGxpc3QgIT0gTk9fSlVNUCkgeworICAgIGludCBuZXh0ID0gZ2V0anVtcChmcywgbGlzdCk7CisgICAgaWYgKHBhdGNodGVzdHJlZyhmcywgbGlzdCwgcmVnKSkKKyAgICAgIGZpeGp1bXAoZnMsIGxpc3QsIHZ0YXJnZXQpOworICAgIGVsc2UKKyAgICAgIGZpeGp1bXAoZnMsIGxpc3QsIGR0YXJnZXQpOyAgLyoganVtcCB0byBkZWZhdWx0IHRhcmdldCAqLworICAgIGxpc3QgPSBuZXh0OworICB9Cit9CisKKworc3RhdGljIHZvaWQgZGlzY2hhcmdlanBjIChGdW5jU3RhdGUgKmZzKSB7CisgIHBhdGNobGlzdGF1eChmcywgZnMtPmpwYywgZnMtPnBjLCBOT19SRUcsIGZzLT5wYyk7CisgIGZzLT5qcGMgPSBOT19KVU1QOworfQorCisKK3ZvaWQgbHVhS19wYXRjaGxpc3QgKEZ1bmNTdGF0ZSAqZnMsIGludCBsaXN0LCBpbnQgdGFyZ2V0KSB7CisgIGlmICh0YXJnZXQgPT0gZnMtPnBjKQorICAgIGx1YUtfcGF0Y2h0b2hlcmUoZnMsIGxpc3QpOworICBlbHNlIHsKKyAgICBsdWFfYXNzZXJ0KHRhcmdldCA8IGZzLT5wYyk7CisgICAgcGF0Y2hsaXN0YXV4KGZzLCBsaXN0LCB0YXJnZXQsIE5PX1JFRywgdGFyZ2V0KTsKKyAgfQorfQorCisKK0xVQUlfRlVOQyB2b2lkIGx1YUtfcGF0Y2hjbG9zZSAoRnVuY1N0YXRlICpmcywgaW50IGxpc3QsIGludCBsZXZlbCkgeworICBsZXZlbCsrOyAgLyogYXJndW1lbnQgaXMgKzEgdG8gcmVzZXJ2ZSAwIGFzIG5vbi1vcCAqLworICB3aGlsZSAobGlzdCAhPSBOT19KVU1QKSB7CisgICAgaW50IG5leHQgPSBnZXRqdW1wKGZzLCBsaXN0KTsKKyAgICBsdWFfYXNzZXJ0KEdFVF9PUENPREUoZnMtPmYtPmNvZGVbbGlzdF0pID09IE9QX0pNUCAmJgorICAgICAgICAgICAgICAgIChHRVRBUkdfQShmcy0+Zi0+Y29kZVtsaXN0XSkgPT0gMCB8fAorICAgICAgICAgICAgICAgICBHRVRBUkdfQShmcy0+Zi0+Y29kZVtsaXN0XSkgPj0gbGV2ZWwpKTsKKyAgICBTRVRBUkdfQShmcy0+Zi0+Y29kZVtsaXN0XSwgbGV2ZWwpOworICAgIGxpc3QgPSBuZXh0OworICB9Cit9CisKKwordm9pZCBsdWFLX3BhdGNodG9oZXJlIChGdW5jU3RhdGUgKmZzLCBpbnQgbGlzdCkgeworICBsdWFLX2dldGxhYmVsKGZzKTsKKyAgbHVhS19jb25jYXQoZnMsICZmcy0+anBjLCBsaXN0KTsKK30KKworCit2b2lkIGx1YUtfY29uY2F0IChGdW5jU3RhdGUgKmZzLCBpbnQgKmwxLCBpbnQgbDIpIHsKKyAgaWYgKGwyID09IE5PX0pVTVApIHJldHVybjsKKyAgZWxzZSBpZiAoKmwxID09IE5PX0pVTVApCisgICAgKmwxID0gbDI7CisgIGVsc2UgeworICAgIGludCBsaXN0ID0gKmwxOworICAgIGludCBuZXh0OworICAgIHdoaWxlICgobmV4dCA9IGdldGp1bXAoZnMsIGxpc3QpKSAhPSBOT19KVU1QKSAgLyogZmluZCBsYXN0IGVsZW1lbnQgKi8KKyAgICAgIGxpc3QgPSBuZXh0OworICAgIGZpeGp1bXAoZnMsIGxpc3QsIGwyKTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgbHVhS19jb2RlIChGdW5jU3RhdGUgKmZzLCBJbnN0cnVjdGlvbiBpKSB7CisgIFByb3RvICpmID0gZnMtPmY7CisgIGRpc2NoYXJnZWpwYyhmcyk7ICAvKiBgcGMnIHdpbGwgY2hhbmdlICovCisgIC8qIHB1dCBuZXcgaW5zdHJ1Y3Rpb24gaW4gY29kZSBhcnJheSAqLworICBsdWFNX2dyb3d2ZWN0b3IoZnMtPmxzLT5MLCBmLT5jb2RlLCBmcy0+cGMsIGYtPnNpemVjb2RlLCBJbnN0cnVjdGlvbiwKKyAgICAgICAgICAgICAgICAgIE1BWF9JTlQsICJvcGNvZGVzIik7CisgIGYtPmNvZGVbZnMtPnBjXSA9IGk7CisgIC8qIHNhdmUgY29ycmVzcG9uZGluZyBsaW5lIGluZm9ybWF0aW9uICovCisgIGx1YU1fZ3Jvd3ZlY3Rvcihmcy0+bHMtPkwsIGYtPmxpbmVpbmZvLCBmcy0+cGMsIGYtPnNpemVsaW5laW5mbywgaW50LAorICAgICAgICAgICAgICAgICAgTUFYX0lOVCwgIm9wY29kZXMiKTsKKyAgZi0+bGluZWluZm9bZnMtPnBjXSA9IGZzLT5scy0+bGFzdGxpbmU7CisgIHJldHVybiBmcy0+cGMrKzsKK30KKworCitpbnQgbHVhS19jb2RlQUJDIChGdW5jU3RhdGUgKmZzLCBPcENvZGUgbywgaW50IGEsIGludCBiLCBpbnQgYykgeworICBsdWFfYXNzZXJ0KGdldE9wTW9kZShvKSA9PSBpQUJDKTsKKyAgbHVhX2Fzc2VydChnZXRCTW9kZShvKSAhPSBPcEFyZ04gfHwgYiA9PSAwKTsKKyAgbHVhX2Fzc2VydChnZXRDTW9kZShvKSAhPSBPcEFyZ04gfHwgYyA9PSAwKTsKKyAgbHVhX2Fzc2VydChhIDw9IE1BWEFSR19BICYmIGIgPD0gTUFYQVJHX0IgJiYgYyA8PSBNQVhBUkdfQyk7CisgIHJldHVybiBsdWFLX2NvZGUoZnMsIENSRUFURV9BQkMobywgYSwgYiwgYykpOworfQorCisKK2ludCBsdWFLX2NvZGVBQnggKEZ1bmNTdGF0ZSAqZnMsIE9wQ29kZSBvLCBpbnQgYSwgdW5zaWduZWQgaW50IGJjKSB7CisgIGx1YV9hc3NlcnQoZ2V0T3BNb2RlKG8pID09IGlBQnggfHwgZ2V0T3BNb2RlKG8pID09IGlBc0J4KTsKKyAgbHVhX2Fzc2VydChnZXRDTW9kZShvKSA9PSBPcEFyZ04pOworICBsdWFfYXNzZXJ0KGEgPD0gTUFYQVJHX0EgJiYgYmMgPD0gTUFYQVJHX0J4KTsKKyAgcmV0dXJuIGx1YUtfY29kZShmcywgQ1JFQVRFX0FCeChvLCBhLCBiYykpOworfQorCisKK3N0YXRpYyBpbnQgY29kZWV4dHJhYXJnIChGdW5jU3RhdGUgKmZzLCBpbnQgYSkgeworICBsdWFfYXNzZXJ0KGEgPD0gTUFYQVJHX0F4KTsKKyAgcmV0dXJuIGx1YUtfY29kZShmcywgQ1JFQVRFX0F4KE9QX0VYVFJBQVJHLCBhKSk7Cit9CisKKworaW50IGx1YUtfY29kZWsgKEZ1bmNTdGF0ZSAqZnMsIGludCByZWcsIGludCBrKSB7CisgIGlmIChrIDw9IE1BWEFSR19CeCkKKyAgICByZXR1cm4gbHVhS19jb2RlQUJ4KGZzLCBPUF9MT0FESywgcmVnLCBrKTsKKyAgZWxzZSB7CisgICAgaW50IHAgPSBsdWFLX2NvZGVBQngoZnMsIE9QX0xPQURLWCwgcmVnLCAwKTsKKyAgICBjb2RlZXh0cmFhcmcoZnMsIGspOworICAgIHJldHVybiBwOworICB9Cit9CisKKwordm9pZCBsdWFLX2NoZWNrc3RhY2sgKEZ1bmNTdGF0ZSAqZnMsIGludCBuKSB7CisgIGludCBuZXdzdGFjayA9IGZzLT5mcmVlcmVnICsgbjsKKyAgaWYgKG5ld3N0YWNrID4gZnMtPmYtPm1heHN0YWNrc2l6ZSkgeworICAgIGlmIChuZXdzdGFjayA+PSBNQVhTVEFDSykKKyAgICAgIGx1YVhfc3ludGF4ZXJyb3IoZnMtPmxzLCAiZnVuY3Rpb24gb3IgZXhwcmVzc2lvbiB0b28gY29tcGxleCIpOworICAgIGZzLT5mLT5tYXhzdGFja3NpemUgPSBjYXN0X2J5dGUobmV3c3RhY2spOworICB9Cit9CisKKwordm9pZCBsdWFLX3Jlc2VydmVyZWdzIChGdW5jU3RhdGUgKmZzLCBpbnQgbikgeworICBsdWFLX2NoZWNrc3RhY2soZnMsIG4pOworICBmcy0+ZnJlZXJlZyArPSBuOworfQorCisKK3N0YXRpYyB2b2lkIGZyZWVyZWcgKEZ1bmNTdGF0ZSAqZnMsIGludCByZWcpIHsKKyAgaWYgKCFJU0socmVnKSAmJiByZWcgPj0gZnMtPm5hY3R2YXIpIHsKKyAgICBmcy0+ZnJlZXJlZy0tOworICAgIGx1YV9hc3NlcnQocmVnID09IGZzLT5mcmVlcmVnKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGZyZWVleHAgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpIHsKKyAgaWYgKGUtPmsgPT0gVk5PTlJFTE9DKQorICAgIGZyZWVyZWcoZnMsIGUtPnUuaW5mbyk7Cit9CisKKworc3RhdGljIGludCBhZGRrIChGdW5jU3RhdGUgKmZzLCBUVmFsdWUgKmtleSwgVFZhbHVlICp2KSB7CisgIGx1YV9TdGF0ZSAqTCA9IGZzLT5scy0+TDsKKyAgVFZhbHVlICppZHggPSBsdWFIX3NldChMLCBmcy0+aCwga2V5KTsKKyAgUHJvdG8gKmYgPSBmcy0+ZjsKKyAgaW50IGssIG9sZHNpemU7CisgIGlmICh0dGlzbnVtYmVyKGlkeCkpIHsKKyAgICBsdWFfTnVtYmVyIG4gPSBudmFsdWUoaWR4KTsKKyAgICBsdWFfbnVtYmVyMmludChrLCBuKTsKKyAgICBpZiAobHVhVl9yYXdlcXVhbG9iaigmZi0+a1trXSwgdikpCisgICAgICByZXR1cm4gazsKKyAgICAvKiBlbHNlIG1heSBiZSBhIGNvbGxpc2lvbiAoZS5nLiwgYmV0d2VlbiAwLjAgYW5kICJcMFwwXDBcMFwwXDBcMFwwIik7CisgICAgICAgZ28gdGhyb3VnaCBhbmQgY3JlYXRlIGEgbmV3IGVudHJ5IGZvciB0aGlzIHZhbHVlICovCisgIH0KKyAgLyogY29uc3RhbnQgbm90IGZvdW5kOyBjcmVhdGUgYSBuZXcgZW50cnkgKi8KKyAgb2xkc2l6ZSA9IGYtPnNpemVrOworICBrID0gZnMtPm5rOworICAvKiBudW1lcmljYWwgdmFsdWUgZG9lcyBub3QgbmVlZCBHQyBiYXJyaWVyOworICAgICB0YWJsZSBoYXMgbm8gbWV0YXRhYmxlLCBzbyBpdCBkb2VzIG5vdCBuZWVkIHRvIGludmFsaWRhdGUgY2FjaGUgKi8KKyAgc2V0bnZhbHVlKGlkeCwgY2FzdF9udW0oaykpOworICBsdWFNX2dyb3d2ZWN0b3IoTCwgZi0+aywgaywgZi0+c2l6ZWssIFRWYWx1ZSwgTUFYQVJHX0F4LCAiY29uc3RhbnRzIik7CisgIHdoaWxlIChvbGRzaXplIDwgZi0+c2l6ZWspIHNldG5pbHZhbHVlKCZmLT5rW29sZHNpemUrK10pOworICBzZXRvYmooTCwgJmYtPmtba10sIHYpOworICBmcy0+bmsrKzsKKyAgbHVhQ19iYXJyaWVyKEwsIGYsIHYpOworICByZXR1cm4gazsKK30KKworCitpbnQgbHVhS19zdHJpbmdLIChGdW5jU3RhdGUgKmZzLCBUU3RyaW5nICpzKSB7CisgIFRWYWx1ZSBvOworICBzZXRzdmFsdWUoZnMtPmxzLT5MLCAmbywgcyk7CisgIHJldHVybiBhZGRrKGZzLCAmbywgJm8pOworfQorCisKK2ludCBsdWFLX251bWJlcksgKEZ1bmNTdGF0ZSAqZnMsIGx1YV9OdW1iZXIgcikgeworICBpbnQgbjsKKyAgbHVhX1N0YXRlICpMID0gZnMtPmxzLT5MOworICBUVmFsdWUgbzsKKyAgc2V0bnZhbHVlKCZvLCByKTsKKyAgaWYgKHIgPT0gMCB8fCBsdWFpX251bWlzbmFuKE5VTEwsIHIpKSB7ICAvKiBoYW5kbGUgLTAgYW5kIE5hTiAqLworICAgIC8qIHVzZSByYXcgcmVwcmVzZW50YXRpb24gYXMga2V5IHRvIGF2b2lkIG51bWVyaWMgcHJvYmxlbXMgKi8KKyAgICBzZXRzdmFsdWUoTCwgTC0+dG9wKyssIGx1YVNfbmV3bHN0cihMLCAoY2hhciAqKSZyLCBzaXplb2YocikpKTsKKyAgICBuID0gYWRkayhmcywgTC0+dG9wIC0gMSwgJm8pOworICAgIEwtPnRvcC0tOworICB9CisgIGVsc2UKKyAgICBuID0gYWRkayhmcywgJm8sICZvKTsgIC8qIHJlZ3VsYXIgY2FzZSAqLworICByZXR1cm4gbjsKK30KKworCitzdGF0aWMgaW50IGJvb2xLIChGdW5jU3RhdGUgKmZzLCBpbnQgYikgeworICBUVmFsdWUgbzsKKyAgc2V0YnZhbHVlKCZvLCBiKTsKKyAgcmV0dXJuIGFkZGsoZnMsICZvLCAmbyk7Cit9CisKKworc3RhdGljIGludCBuaWxLIChGdW5jU3RhdGUgKmZzKSB7CisgIFRWYWx1ZSBrLCB2OworICBzZXRuaWx2YWx1ZSgmdik7CisgIC8qIGNhbm5vdCB1c2UgbmlsIGFzIGtleTsgaW5zdGVhZCB1c2UgdGFibGUgaXRzZWxmIHRvIHJlcHJlc2VudCBuaWwgKi8KKyAgc2V0aHZhbHVlKGZzLT5scy0+TCwgJmssIGZzLT5oKTsKKyAgcmV0dXJuIGFkZGsoZnMsICZrLCAmdik7Cit9CisKKwordm9pZCBsdWFLX3NldHJldHVybnMgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUsIGludCBucmVzdWx0cykgeworICBpZiAoZS0+ayA9PSBWQ0FMTCkgeyAgLyogZXhwcmVzc2lvbiBpcyBhbiBvcGVuIGZ1bmN0aW9uIGNhbGw/ICovCisgICAgU0VUQVJHX0MoZ2V0Y29kZShmcywgZSksIG5yZXN1bHRzKzEpOworICB9CisgIGVsc2UgaWYgKGUtPmsgPT0gVlZBUkFSRykgeworICAgIFNFVEFSR19CKGdldGNvZGUoZnMsIGUpLCBucmVzdWx0cysxKTsKKyAgICBTRVRBUkdfQShnZXRjb2RlKGZzLCBlKSwgZnMtPmZyZWVyZWcpOworICAgIGx1YUtfcmVzZXJ2ZXJlZ3MoZnMsIDEpOworICB9Cit9CisKKwordm9pZCBsdWFLX3NldG9uZXJldCAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSkgeworICBpZiAoZS0+ayA9PSBWQ0FMTCkgeyAgLyogZXhwcmVzc2lvbiBpcyBhbiBvcGVuIGZ1bmN0aW9uIGNhbGw/ICovCisgICAgZS0+ayA9IFZOT05SRUxPQzsKKyAgICBlLT51LmluZm8gPSBHRVRBUkdfQShnZXRjb2RlKGZzLCBlKSk7CisgIH0KKyAgZWxzZSBpZiAoZS0+ayA9PSBWVkFSQVJHKSB7CisgICAgU0VUQVJHX0IoZ2V0Y29kZShmcywgZSksIDIpOworICAgIGUtPmsgPSBWUkVMT0NBQkxFOyAgLyogY2FuIHJlbG9jYXRlIGl0cyBzaW1wbGUgcmVzdWx0ICovCisgIH0KK30KKworCit2b2lkIGx1YUtfZGlzY2hhcmdldmFycyAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSkgeworICBzd2l0Y2ggKGUtPmspIHsKKyAgICBjYXNlIFZMT0NBTDogeworICAgICAgZS0+ayA9IFZOT05SRUxPQzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZVUFZBTDogeworICAgICAgZS0+dS5pbmZvID0gbHVhS19jb2RlQUJDKGZzLCBPUF9HRVRVUFZBTCwgMCwgZS0+dS5pbmZvLCAwKTsKKyAgICAgIGUtPmsgPSBWUkVMT0NBQkxFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVklOREVYRUQ6IHsKKyAgICAgIE9wQ29kZSBvcCA9IE9QX0dFVFRBQlVQOyAgLyogYXNzdW1lICd0JyBpcyBpbiBhbiB1cHZhbHVlICovCisgICAgICBmcmVlcmVnKGZzLCBlLT51LmluZC5pZHgpOworICAgICAgaWYgKGUtPnUuaW5kLnZ0ID09IFZMT0NBTCkgeyAgLyogJ3QnIGlzIGluIGEgcmVnaXN0ZXI/ICovCisgICAgICAgIGZyZWVyZWcoZnMsIGUtPnUuaW5kLnQpOworICAgICAgICBvcCA9IE9QX0dFVFRBQkxFOworICAgICAgfQorICAgICAgZS0+dS5pbmZvID0gbHVhS19jb2RlQUJDKGZzLCBvcCwgMCwgZS0+dS5pbmQudCwgZS0+dS5pbmQuaWR4KTsKKyAgICAgIGUtPmsgPSBWUkVMT0NBQkxFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVlZBUkFSRzoKKyAgICBjYXNlIFZDQUxMOiB7CisgICAgICBsdWFLX3NldG9uZXJldChmcywgZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogYnJlYWs7ICAvKiB0aGVyZSBpcyBvbmUgdmFsdWUgYXZhaWxhYmxlIChzb21ld2hlcmUpICovCisgIH0KK30KKworCitzdGF0aWMgaW50IGNvZGVfbGFiZWwgKEZ1bmNTdGF0ZSAqZnMsIGludCBBLCBpbnQgYiwgaW50IGp1bXApIHsKKyAgbHVhS19nZXRsYWJlbChmcyk7ICAvKiB0aG9zZSBpbnN0cnVjdGlvbnMgbWF5IGJlIGp1bXAgdGFyZ2V0cyAqLworICByZXR1cm4gbHVhS19jb2RlQUJDKGZzLCBPUF9MT0FEQk9PTCwgQSwgYiwganVtcCk7Cit9CisKKworc3RhdGljIHZvaWQgZGlzY2hhcmdlMnJlZyAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSwgaW50IHJlZykgeworICBsdWFLX2Rpc2NoYXJnZXZhcnMoZnMsIGUpOworICBzd2l0Y2ggKGUtPmspIHsKKyAgICBjYXNlIFZOSUw6IHsKKyAgICAgIGx1YUtfbmlsKGZzLCByZWcsIDEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVkZBTFNFOiBjYXNlIFZUUlVFOiB7CisgICAgICBsdWFLX2NvZGVBQkMoZnMsIE9QX0xPQURCT09MLCByZWcsIGUtPmsgPT0gVlRSVUUsIDApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVks6IHsKKyAgICAgIGx1YUtfY29kZWsoZnMsIHJlZywgZS0+dS5pbmZvKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZLTlVNOiB7CisgICAgICBsdWFLX2NvZGVrKGZzLCByZWcsIGx1YUtfbnVtYmVySyhmcywgZS0+dS5udmFsKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWUkVMT0NBQkxFOiB7CisgICAgICBJbnN0cnVjdGlvbiAqcGMgPSAmZ2V0Y29kZShmcywgZSk7CisgICAgICBTRVRBUkdfQSgqcGMsIHJlZyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWTk9OUkVMT0M6IHsKKyAgICAgIGlmIChyZWcgIT0gZS0+dS5pbmZvKQorICAgICAgICBsdWFLX2NvZGVBQkMoZnMsIE9QX01PVkUsIHJlZywgZS0+dS5pbmZvLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBsdWFfYXNzZXJ0KGUtPmsgPT0gVlZPSUQgfHwgZS0+ayA9PSBWSk1QKTsKKyAgICAgIHJldHVybjsgIC8qIG5vdGhpbmcgdG8gZG8uLi4gKi8KKyAgICB9CisgIH0KKyAgZS0+dS5pbmZvID0gcmVnOworICBlLT5rID0gVk5PTlJFTE9DOworfQorCisKK3N0YXRpYyB2b2lkIGRpc2NoYXJnZTJhbnlyZWcgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpIHsKKyAgaWYgKGUtPmsgIT0gVk5PTlJFTE9DKSB7CisgICAgbHVhS19yZXNlcnZlcmVncyhmcywgMSk7CisgICAgZGlzY2hhcmdlMnJlZyhmcywgZSwgZnMtPmZyZWVyZWctMSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBleHAycmVnIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplLCBpbnQgcmVnKSB7CisgIGRpc2NoYXJnZTJyZWcoZnMsIGUsIHJlZyk7CisgIGlmIChlLT5rID09IFZKTVApCisgICAgbHVhS19jb25jYXQoZnMsICZlLT50LCBlLT51LmluZm8pOyAgLyogcHV0IHRoaXMganVtcCBpbiBgdCcgbGlzdCAqLworICBpZiAoaGFzanVtcHMoZSkpIHsKKyAgICBpbnQgZmluYWw7ICAvKiBwb3NpdGlvbiBhZnRlciB3aG9sZSBleHByZXNzaW9uICovCisgICAgaW50IHBfZiA9IE5PX0pVTVA7ICAvKiBwb3NpdGlvbiBvZiBhbiBldmVudHVhbCBMT0FEIGZhbHNlICovCisgICAgaW50IHBfdCA9IE5PX0pVTVA7ICAvKiBwb3NpdGlvbiBvZiBhbiBldmVudHVhbCBMT0FEIHRydWUgKi8KKyAgICBpZiAobmVlZF92YWx1ZShmcywgZS0+dCkgfHwgbmVlZF92YWx1ZShmcywgZS0+ZikpIHsKKyAgICAgIGludCBmaiA9IChlLT5rID09IFZKTVApID8gTk9fSlVNUCA6IGx1YUtfanVtcChmcyk7CisgICAgICBwX2YgPSBjb2RlX2xhYmVsKGZzLCByZWcsIDAsIDEpOworICAgICAgcF90ID0gY29kZV9sYWJlbChmcywgcmVnLCAxLCAwKTsKKyAgICAgIGx1YUtfcGF0Y2h0b2hlcmUoZnMsIGZqKTsKKyAgICB9CisgICAgZmluYWwgPSBsdWFLX2dldGxhYmVsKGZzKTsKKyAgICBwYXRjaGxpc3RhdXgoZnMsIGUtPmYsIGZpbmFsLCByZWcsIHBfZik7CisgICAgcGF0Y2hsaXN0YXV4KGZzLCBlLT50LCBmaW5hbCwgcmVnLCBwX3QpOworICB9CisgIGUtPmYgPSBlLT50ID0gTk9fSlVNUDsKKyAgZS0+dS5pbmZvID0gcmVnOworICBlLT5rID0gVk5PTlJFTE9DOworfQorCisKK3ZvaWQgbHVhS19leHAybmV4dHJlZyAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSkgeworICBsdWFLX2Rpc2NoYXJnZXZhcnMoZnMsIGUpOworICBmcmVlZXhwKGZzLCBlKTsKKyAgbHVhS19yZXNlcnZlcmVncyhmcywgMSk7CisgIGV4cDJyZWcoZnMsIGUsIGZzLT5mcmVlcmVnIC0gMSk7Cit9CisKKworaW50IGx1YUtfZXhwMmFueXJlZyAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSkgeworICBsdWFLX2Rpc2NoYXJnZXZhcnMoZnMsIGUpOworICBpZiAoZS0+ayA9PSBWTk9OUkVMT0MpIHsKKyAgICBpZiAoIWhhc2p1bXBzKGUpKSByZXR1cm4gZS0+dS5pbmZvOyAgLyogZXhwIGlzIGFscmVhZHkgaW4gYSByZWdpc3RlciAqLworICAgIGlmIChlLT51LmluZm8gPj0gZnMtPm5hY3R2YXIpIHsgIC8qIHJlZy4gaXMgbm90IGEgbG9jYWw/ICovCisgICAgICBleHAycmVnKGZzLCBlLCBlLT51LmluZm8pOyAgLyogcHV0IHZhbHVlIG9uIGl0ICovCisgICAgICByZXR1cm4gZS0+dS5pbmZvOworICAgIH0KKyAgfQorICBsdWFLX2V4cDJuZXh0cmVnKGZzLCBlKTsgIC8qIGRlZmF1bHQgKi8KKyAgcmV0dXJuIGUtPnUuaW5mbzsKK30KKworCit2b2lkIGx1YUtfZXhwMmFueXJlZ3VwIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKSB7CisgIGlmIChlLT5rICE9IFZVUFZBTCB8fCBoYXNqdW1wcyhlKSkKKyAgICBsdWFLX2V4cDJhbnlyZWcoZnMsIGUpOworfQorCisKK3ZvaWQgbHVhS19leHAydmFsIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKSB7CisgIGlmIChoYXNqdW1wcyhlKSkKKyAgICBsdWFLX2V4cDJhbnlyZWcoZnMsIGUpOworICBlbHNlCisgICAgbHVhS19kaXNjaGFyZ2V2YXJzKGZzLCBlKTsKK30KKworCitpbnQgbHVhS19leHAyUksgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpIHsKKyAgbHVhS19leHAydmFsKGZzLCBlKTsKKyAgc3dpdGNoIChlLT5rKSB7CisgICAgY2FzZSBWVFJVRToKKyAgICBjYXNlIFZGQUxTRToKKyAgICBjYXNlIFZOSUw6IHsKKyAgICAgIGlmIChmcy0+bmsgPD0gTUFYSU5ERVhSSykgeyAgLyogY29uc3RhbnQgZml0cyBpbiBSSyBvcGVyYW5kPyAqLworICAgICAgICBlLT51LmluZm8gPSAoZS0+ayA9PSBWTklMKSA/IG5pbEsoZnMpIDogYm9vbEsoZnMsIChlLT5rID09IFZUUlVFKSk7CisgICAgICAgIGUtPmsgPSBWSzsKKyAgICAgICAgcmV0dXJuIFJLQVNLKGUtPnUuaW5mbyk7CisgICAgICB9CisgICAgICBlbHNlIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZLTlVNOiB7CisgICAgICBlLT51LmluZm8gPSBsdWFLX251bWJlcksoZnMsIGUtPnUubnZhbCk7CisgICAgICBlLT5rID0gVks7CisgICAgICAvKiBnbyB0aHJvdWdoICovCisgICAgfQorICAgIGNhc2UgVks6IHsKKyAgICAgIGlmIChlLT51LmluZm8gPD0gTUFYSU5ERVhSSykgIC8qIGNvbnN0YW50IGZpdHMgaW4gYXJnQz8gKi8KKyAgICAgICAgcmV0dXJuIFJLQVNLKGUtPnUuaW5mbyk7CisgICAgICBlbHNlIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorICAvKiBub3QgYSBjb25zdGFudCBpbiB0aGUgcmlnaHQgcmFuZ2U6IHB1dCBpdCBpbiBhIHJlZ2lzdGVyICovCisgIHJldHVybiBsdWFLX2V4cDJhbnlyZWcoZnMsIGUpOworfQorCisKK3ZvaWQgbHVhS19zdG9yZXZhciAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqdmFyLCBleHBkZXNjICpleCkgeworICBzd2l0Y2ggKHZhci0+aykgeworICAgIGNhc2UgVkxPQ0FMOiB7CisgICAgICBmcmVlZXhwKGZzLCBleCk7CisgICAgICBleHAycmVnKGZzLCBleCwgdmFyLT51LmluZm8pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFZVUFZBTDogeworICAgICAgaW50IGUgPSBsdWFLX2V4cDJhbnlyZWcoZnMsIGV4KTsKKyAgICAgIGx1YUtfY29kZUFCQyhmcywgT1BfU0VUVVBWQUwsIGUsIHZhci0+dS5pbmZvLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZJTkRFWEVEOiB7CisgICAgICBPcENvZGUgb3AgPSAodmFyLT51LmluZC52dCA9PSBWTE9DQUwpID8gT1BfU0VUVEFCTEUgOiBPUF9TRVRUQUJVUDsKKyAgICAgIGludCBlID0gbHVhS19leHAyUksoZnMsIGV4KTsKKyAgICAgIGx1YUtfY29kZUFCQyhmcywgb3AsIHZhci0+dS5pbmQudCwgdmFyLT51LmluZC5pZHgsIGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIGx1YV9hc3NlcnQoMCk7ICAvKiBpbnZhbGlkIHZhciBraW5kIHRvIHN0b3JlICovCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZnJlZWV4cChmcywgZXgpOworfQorCisKK3ZvaWQgbHVhS19zZWxmIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplLCBleHBkZXNjICprZXkpIHsKKyAgaW50IGVyZWc7CisgIGx1YUtfZXhwMmFueXJlZyhmcywgZSk7CisgIGVyZWcgPSBlLT51LmluZm87ICAvKiByZWdpc3RlciB3aGVyZSAnZScgd2FzIHBsYWNlZCAqLworICBmcmVlZXhwKGZzLCBlKTsKKyAgZS0+dS5pbmZvID0gZnMtPmZyZWVyZWc7ICAvKiBiYXNlIHJlZ2lzdGVyIGZvciBvcF9zZWxmICovCisgIGUtPmsgPSBWTk9OUkVMT0M7CisgIGx1YUtfcmVzZXJ2ZXJlZ3MoZnMsIDIpOyAgLyogZnVuY3Rpb24gYW5kICdzZWxmJyBwcm9kdWNlZCBieSBvcF9zZWxmICovCisgIGx1YUtfY29kZUFCQyhmcywgT1BfU0VMRiwgZS0+dS5pbmZvLCBlcmVnLCBsdWFLX2V4cDJSSyhmcywga2V5KSk7CisgIGZyZWVleHAoZnMsIGtleSk7Cit9CisKKworc3RhdGljIHZvaWQgaW52ZXJ0anVtcCAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSkgeworICBJbnN0cnVjdGlvbiAqcGMgPSBnZXRqdW1wY29udHJvbChmcywgZS0+dS5pbmZvKTsKKyAgbHVhX2Fzc2VydCh0ZXN0VE1vZGUoR0VUX09QQ09ERSgqcGMpKSAmJiBHRVRfT1BDT0RFKCpwYykgIT0gT1BfVEVTVFNFVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9PUENPREUoKnBjKSAhPSBPUF9URVNUKTsKKyAgU0VUQVJHX0EoKnBjLCAhKEdFVEFSR19BKCpwYykpKTsKK30KKworCitzdGF0aWMgaW50IGp1bXBvbmNvbmQgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUsIGludCBjb25kKSB7CisgIGlmIChlLT5rID09IFZSRUxPQ0FCTEUpIHsKKyAgICBJbnN0cnVjdGlvbiBpZSA9IGdldGNvZGUoZnMsIGUpOworICAgIGlmIChHRVRfT1BDT0RFKGllKSA9PSBPUF9OT1QpIHsKKyAgICAgIGZzLT5wYy0tOyAgLyogcmVtb3ZlIHByZXZpb3VzIE9QX05PVCAqLworICAgICAgcmV0dXJuIGNvbmRqdW1wKGZzLCBPUF9URVNULCBHRVRBUkdfQihpZSksIDAsICFjb25kKTsKKyAgICB9CisgICAgLyogZWxzZSBnbyB0aHJvdWdoICovCisgIH0KKyAgZGlzY2hhcmdlMmFueXJlZyhmcywgZSk7CisgIGZyZWVleHAoZnMsIGUpOworICByZXR1cm4gY29uZGp1bXAoZnMsIE9QX1RFU1RTRVQsIE5PX1JFRywgZS0+dS5pbmZvLCBjb25kKTsKK30KKworCit2b2lkIGx1YUtfZ29pZnRydWUgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpIHsKKyAgaW50IHBjOyAgLyogcGMgb2YgbGFzdCBqdW1wICovCisgIGx1YUtfZGlzY2hhcmdldmFycyhmcywgZSk7CisgIHN3aXRjaCAoZS0+aykgeworICAgIGNhc2UgVkpNUDogeworICAgICAgaW52ZXJ0anVtcChmcywgZSk7CisgICAgICBwYyA9IGUtPnUuaW5mbzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZLOiBjYXNlIFZLTlVNOiBjYXNlIFZUUlVFOiB7CisgICAgICBwYyA9IE5PX0pVTVA7ICAvKiBhbHdheXMgdHJ1ZTsgZG8gbm90aGluZyAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIHBjID0ganVtcG9uY29uZChmcywgZSwgMCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgbHVhS19jb25jYXQoZnMsICZlLT5mLCBwYyk7ICAvKiBpbnNlcnQgbGFzdCBqdW1wIGluIGBmJyBsaXN0ICovCisgIGx1YUtfcGF0Y2h0b2hlcmUoZnMsIGUtPnQpOworICBlLT50ID0gTk9fSlVNUDsKK30KKworCit2b2lkIGx1YUtfZ29pZmZhbHNlIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKSB7CisgIGludCBwYzsgIC8qIHBjIG9mIGxhc3QganVtcCAqLworICBsdWFLX2Rpc2NoYXJnZXZhcnMoZnMsIGUpOworICBzd2l0Y2ggKGUtPmspIHsKKyAgICBjYXNlIFZKTVA6IHsKKyAgICAgIHBjID0gZS0+dS5pbmZvOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVk5JTDogY2FzZSBWRkFMU0U6IHsKKyAgICAgIHBjID0gTk9fSlVNUDsgIC8qIGFsd2F5cyBmYWxzZTsgZG8gbm90aGluZyAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIHBjID0ganVtcG9uY29uZChmcywgZSwgMSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgbHVhS19jb25jYXQoZnMsICZlLT50LCBwYyk7ICAvKiBpbnNlcnQgbGFzdCBqdW1wIGluIGB0JyBsaXN0ICovCisgIGx1YUtfcGF0Y2h0b2hlcmUoZnMsIGUtPmYpOworICBlLT5mID0gTk9fSlVNUDsKK30KKworCitzdGF0aWMgdm9pZCBjb2Rlbm90IChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplKSB7CisgIGx1YUtfZGlzY2hhcmdldmFycyhmcywgZSk7CisgIHN3aXRjaCAoZS0+aykgeworICAgIGNhc2UgVk5JTDogY2FzZSBWRkFMU0U6IHsKKyAgICAgIGUtPmsgPSBWVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZLOiBjYXNlIFZLTlVNOiBjYXNlIFZUUlVFOiB7CisgICAgICBlLT5rID0gVkZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVkpNUDogeworICAgICAgaW52ZXJ0anVtcChmcywgZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWUkVMT0NBQkxFOgorICAgIGNhc2UgVk5PTlJFTE9DOiB7CisgICAgICBkaXNjaGFyZ2UyYW55cmVnKGZzLCBlKTsKKyAgICAgIGZyZWVleHAoZnMsIGUpOworICAgICAgZS0+dS5pbmZvID0gbHVhS19jb2RlQUJDKGZzLCBPUF9OT1QsIDAsIGUtPnUuaW5mbywgMCk7CisgICAgICBlLT5rID0gVlJFTE9DQUJMRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBsdWFfYXNzZXJ0KDApOyAgLyogY2Fubm90IGhhcHBlbiAqLworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8qIGludGVyY2hhbmdlIHRydWUgYW5kIGZhbHNlIGxpc3RzICovCisgIHsgaW50IHRlbXAgPSBlLT5mOyBlLT5mID0gZS0+dDsgZS0+dCA9IHRlbXA7IH0KKyAgcmVtb3ZldmFsdWVzKGZzLCBlLT5mKTsKKyAgcmVtb3ZldmFsdWVzKGZzLCBlLT50KTsKK30KKworCit2b2lkIGx1YUtfaW5kZXhlZCAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqdCwgZXhwZGVzYyAqaykgeworICBsdWFfYXNzZXJ0KCFoYXNqdW1wcyh0KSk7CisgIHQtPnUuaW5kLnQgPSB0LT51LmluZm87CisgIHQtPnUuaW5kLmlkeCA9IGx1YUtfZXhwMlJLKGZzLCBrKTsKKyAgdC0+dS5pbmQudnQgPSAodC0+ayA9PSBWVVBWQUwpID8gVlVQVkFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNoZWNrX2V4cCh2a2lzaW5yZWcodC0+ayksIFZMT0NBTCk7CisgIHQtPmsgPSBWSU5ERVhFRDsKK30KKworCitzdGF0aWMgaW50IGNvbnN0Zm9sZGluZyAoT3BDb2RlIG9wLCBleHBkZXNjICplMSwgZXhwZGVzYyAqZTIpIHsKKyAgbHVhX051bWJlciByOworICBpZiAoIWlzbnVtZXJhbChlMSkgfHwgIWlzbnVtZXJhbChlMikpIHJldHVybiAwOworICBpZiAoKG9wID09IE9QX0RJViB8fCBvcCA9PSBPUF9NT0QpICYmIGUyLT51Lm52YWwgPT0gMCkKKyAgICByZXR1cm4gMDsgIC8qIGRvIG5vdCBhdHRlbXB0IHRvIGRpdmlkZSBieSAwICovCisgIHIgPSBsdWFPX2FyaXRoKG9wIC0gT1BfQUREICsgTFVBX09QQURELCBlMS0+dS5udmFsLCBlMi0+dS5udmFsKTsKKyAgZTEtPnUubnZhbCA9IHI7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIGNvZGVhcml0aCAoRnVuY1N0YXRlICpmcywgT3BDb2RlIG9wLAorICAgICAgICAgICAgICAgICAgICAgICBleHBkZXNjICplMSwgZXhwZGVzYyAqZTIsIGludCBsaW5lKSB7CisgIGlmIChjb25zdGZvbGRpbmcob3AsIGUxLCBlMikpCisgICAgcmV0dXJuOworICBlbHNlIHsKKyAgICBpbnQgbzIgPSAob3AgIT0gT1BfVU5NICYmIG9wICE9IE9QX0xFTikgPyBsdWFLX2V4cDJSSyhmcywgZTIpIDogMDsKKyAgICBpbnQgbzEgPSBsdWFLX2V4cDJSSyhmcywgZTEpOworICAgIGlmIChvMSA+IG8yKSB7CisgICAgICBmcmVlZXhwKGZzLCBlMSk7CisgICAgICBmcmVlZXhwKGZzLCBlMik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZnJlZWV4cChmcywgZTIpOworICAgICAgZnJlZWV4cChmcywgZTEpOworICAgIH0KKyAgICBlMS0+dS5pbmZvID0gbHVhS19jb2RlQUJDKGZzLCBvcCwgMCwgbzEsIG8yKTsKKyAgICBlMS0+ayA9IFZSRUxPQ0FCTEU7CisgICAgbHVhS19maXhsaW5lKGZzLCBsaW5lKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNvZGVjb21wIChGdW5jU3RhdGUgKmZzLCBPcENvZGUgb3AsIGludCBjb25kLCBleHBkZXNjICplMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBkZXNjICplMikgeworICBpbnQgbzEgPSBsdWFLX2V4cDJSSyhmcywgZTEpOworICBpbnQgbzIgPSBsdWFLX2V4cDJSSyhmcywgZTIpOworICBmcmVlZXhwKGZzLCBlMik7CisgIGZyZWVleHAoZnMsIGUxKTsKKyAgaWYgKGNvbmQgPT0gMCAmJiBvcCAhPSBPUF9FUSkgeworICAgIGludCB0ZW1wOyAgLyogZXhjaGFuZ2UgYXJncyB0byByZXBsYWNlIGJ5IGA8JyBvciBgPD0nICovCisgICAgdGVtcCA9IG8xOyBvMSA9IG8yOyBvMiA9IHRlbXA7ICAvKiBvMSA8PT0+IG8yICovCisgICAgY29uZCA9IDE7CisgIH0KKyAgZTEtPnUuaW5mbyA9IGNvbmRqdW1wKGZzLCBvcCwgY29uZCwgbzEsIG8yKTsKKyAgZTEtPmsgPSBWSk1QOworfQorCisKK3ZvaWQgbHVhS19wcmVmaXggKEZ1bmNTdGF0ZSAqZnMsIFVuT3ByIG9wLCBleHBkZXNjICplLCBpbnQgbGluZSkgeworICBleHBkZXNjIGUyOworICBlMi50ID0gZTIuZiA9IE5PX0pVTVA7IGUyLmsgPSBWS05VTTsgZTIudS5udmFsID0gMDsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgT1BSX01JTlVTOiB7CisgICAgICBpZiAoaXNudW1lcmFsKGUpKSAgLyogbWludXMgY29uc3RhbnQ/ICovCisgICAgICAgIGUtPnUubnZhbCA9IGx1YWlfbnVtdW5tKE5VTEwsIGUtPnUubnZhbCk7ICAvKiBmb2xkIGl0ICovCisgICAgICBlbHNlIHsKKyAgICAgICAgbHVhS19leHAyYW55cmVnKGZzLCBlKTsKKyAgICAgICAgY29kZWFyaXRoKGZzLCBPUF9VTk0sIGUsICZlMiwgbGluZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfTk9UOiBjb2Rlbm90KGZzLCBlKTsgYnJlYWs7CisgICAgY2FzZSBPUFJfTEVOOiB7CisgICAgICBsdWFLX2V4cDJhbnlyZWcoZnMsIGUpOyAgLyogY2Fubm90IG9wZXJhdGUgb24gY29uc3RhbnRzICovCisgICAgICBjb2RlYXJpdGgoZnMsIE9QX0xFTiwgZSwgJmUyLCBsaW5lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBsdWFfYXNzZXJ0KDApOworICB9Cit9CisKKwordm9pZCBsdWFLX2luZml4IChGdW5jU3RhdGUgKmZzLCBCaW5PcHIgb3AsIGV4cGRlc2MgKnYpIHsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgT1BSX0FORDogeworICAgICAgbHVhS19nb2lmdHJ1ZShmcywgdik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfT1I6IHsKKyAgICAgIGx1YUtfZ29pZmZhbHNlKGZzLCB2KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE9QUl9DT05DQVQ6IHsKKyAgICAgIGx1YUtfZXhwMm5leHRyZWcoZnMsIHYpOyAgLyogb3BlcmFuZCBtdXN0IGJlIG9uIHRoZSBgc3RhY2snICovCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfQUREOiBjYXNlIE9QUl9TVUI6IGNhc2UgT1BSX01VTDogY2FzZSBPUFJfRElWOgorICAgIGNhc2UgT1BSX01PRDogY2FzZSBPUFJfUE9XOiB7CisgICAgICBpZiAoIWlzbnVtZXJhbCh2KSkgbHVhS19leHAyUksoZnMsIHYpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIGx1YUtfZXhwMlJLKGZzLCB2KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgbHVhS19wb3NmaXggKEZ1bmNTdGF0ZSAqZnMsIEJpbk9wciBvcCwKKyAgICAgICAgICAgICAgICAgIGV4cGRlc2MgKmUxLCBleHBkZXNjICplMiwgaW50IGxpbmUpIHsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgT1BSX0FORDogeworICAgICAgbHVhX2Fzc2VydChlMS0+dCA9PSBOT19KVU1QKTsgIC8qIGxpc3QgbXVzdCBiZSBjbG9zZWQgKi8KKyAgICAgIGx1YUtfZGlzY2hhcmdldmFycyhmcywgZTIpOworICAgICAgbHVhS19jb25jYXQoZnMsICZlMi0+ZiwgZTEtPmYpOworICAgICAgKmUxID0gKmUyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgT1BSX09SOiB7CisgICAgICBsdWFfYXNzZXJ0KGUxLT5mID09IE5PX0pVTVApOyAgLyogbGlzdCBtdXN0IGJlIGNsb3NlZCAqLworICAgICAgbHVhS19kaXNjaGFyZ2V2YXJzKGZzLCBlMik7CisgICAgICBsdWFLX2NvbmNhdChmcywgJmUyLT50LCBlMS0+dCk7CisgICAgICAqZTEgPSAqZTI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfQ09OQ0FUOiB7CisgICAgICBsdWFLX2V4cDJ2YWwoZnMsIGUyKTsKKyAgICAgIGlmIChlMi0+ayA9PSBWUkVMT0NBQkxFICYmIEdFVF9PUENPREUoZ2V0Y29kZShmcywgZTIpKSA9PSBPUF9DT05DQVQpIHsKKyAgICAgICAgbHVhX2Fzc2VydChlMS0+dS5pbmZvID09IEdFVEFSR19CKGdldGNvZGUoZnMsIGUyKSktMSk7CisgICAgICAgIGZyZWVleHAoZnMsIGUxKTsKKyAgICAgICAgU0VUQVJHX0IoZ2V0Y29kZShmcywgZTIpLCBlMS0+dS5pbmZvKTsKKyAgICAgICAgZTEtPmsgPSBWUkVMT0NBQkxFOyBlMS0+dS5pbmZvID0gZTItPnUuaW5mbzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBsdWFLX2V4cDJuZXh0cmVnKGZzLCBlMik7ICAvKiBvcGVyYW5kIG11c3QgYmUgb24gdGhlICdzdGFjaycgKi8KKyAgICAgICAgY29kZWFyaXRoKGZzLCBPUF9DT05DQVQsIGUxLCBlMiwgbGluZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfQUREOiBjYXNlIE9QUl9TVUI6IGNhc2UgT1BSX01VTDogY2FzZSBPUFJfRElWOgorICAgIGNhc2UgT1BSX01PRDogY2FzZSBPUFJfUE9XOiB7CisgICAgICBjb2RlYXJpdGgoZnMsIGNhc3QoT3BDb2RlLCBvcCAtIE9QUl9BREQgKyBPUF9BREQpLCBlMSwgZTIsIGxpbmUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgT1BSX0VROiBjYXNlIE9QUl9MVDogY2FzZSBPUFJfTEU6IHsKKyAgICAgIGNvZGVjb21wKGZzLCBjYXN0KE9wQ29kZSwgb3AgLSBPUFJfRVEgKyBPUF9FUSksIDEsIGUxLCBlMik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUFJfTkU6IGNhc2UgT1BSX0dUOiBjYXNlIE9QUl9HRTogeworICAgICAgY29kZWNvbXAoZnMsIGNhc3QoT3BDb2RlLCBvcCAtIE9QUl9ORSArIE9QX0VRKSwgMCwgZTEsIGUyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBsdWFfYXNzZXJ0KDApOworICB9Cit9CisKKwordm9pZCBsdWFLX2ZpeGxpbmUgKEZ1bmNTdGF0ZSAqZnMsIGludCBsaW5lKSB7CisgIGZzLT5mLT5saW5laW5mb1tmcy0+cGMgLSAxXSA9IGxpbmU7Cit9CisKKwordm9pZCBsdWFLX3NldGxpc3QgKEZ1bmNTdGF0ZSAqZnMsIGludCBiYXNlLCBpbnQgbmVsZW1zLCBpbnQgdG9zdG9yZSkgeworICBpbnQgYyA9ICAobmVsZW1zIC0gMSkvTEZJRUxEU19QRVJfRkxVU0ggKyAxOworICBpbnQgYiA9ICh0b3N0b3JlID09IExVQV9NVUxUUkVUKSA/IDAgOiB0b3N0b3JlOworICBsdWFfYXNzZXJ0KHRvc3RvcmUgIT0gMCk7CisgIGlmIChjIDw9IE1BWEFSR19DKQorICAgIGx1YUtfY29kZUFCQyhmcywgT1BfU0VUTElTVCwgYmFzZSwgYiwgYyk7CisgIGVsc2UgaWYgKGMgPD0gTUFYQVJHX0F4KSB7CisgICAgbHVhS19jb2RlQUJDKGZzLCBPUF9TRVRMSVNULCBiYXNlLCBiLCAwKTsKKyAgICBjb2RlZXh0cmFhcmcoZnMsIGMpOworICB9CisgIGVsc2UKKyAgICBsdWFYX3N5bnRheGVycm9yKGZzLT5scywgImNvbnN0cnVjdG9yIHRvbyBsb25nIik7CisgIGZzLT5mcmVlcmVnID0gYmFzZSArIDE7ICAvKiBmcmVlIHJlZ2lzdGVycyB3aXRoIGxpc3QgdmFsdWVzICovCit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGNvZGUuaCBiL2NvbTMyL2x1YS9zcmMvbGNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE0MjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sY29kZS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisqKiAkSWQ6IGxjb2RlLmgsdiAxLjU4LjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIENvZGUgZ2VuZXJhdG9yIGZvciBMdWEKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaWZuZGVmIGxjb2RlX2gKKyNkZWZpbmUgbGNvZGVfaAorCisjaW5jbHVkZSAibGxleC5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsb3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxwYXJzZXIuaCIKKworCisvKgorKiogTWFya3MgdGhlIGVuZCBvZiBhIHBhdGNoIGxpc3QuIEl0IGlzIGFuIGludmFsaWQgdmFsdWUgYm90aCBhcyBhbiBhYnNvbHV0ZQorKiogYWRkcmVzcywgYW5kIGFzIGEgbGlzdCBsaW5rICh3b3VsZCBsaW5rIGFuIGVsZW1lbnQgdG8gaXRzZWxmKS4KKyovCisjZGVmaW5lIE5PX0pVTVAgKC0xKQorCisKKy8qCisqKiBncmVwICJPUkRFUiBPUFIiIGlmIHlvdSBjaGFuZ2UgdGhlc2UgZW51bXMgIChPUkRFUiBPUCkKKyovCit0eXBlZGVmIGVudW0gQmluT3ByIHsKKyAgT1BSX0FERCwgT1BSX1NVQiwgT1BSX01VTCwgT1BSX0RJViwgT1BSX01PRCwgT1BSX1BPVywKKyAgT1BSX0NPTkNBVCwKKyAgT1BSX0VRLCBPUFJfTFQsIE9QUl9MRSwKKyAgT1BSX05FLCBPUFJfR1QsIE9QUl9HRSwKKyAgT1BSX0FORCwgT1BSX09SLAorICBPUFJfTk9CSU5PUFIKK30gQmluT3ByOworCisKK3R5cGVkZWYgZW51bSBVbk9wciB7IE9QUl9NSU5VUywgT1BSX05PVCwgT1BSX0xFTiwgT1BSX05PVU5PUFIgfSBVbk9wcjsKKworCisjZGVmaW5lIGdldGNvZGUoZnMsZSkJKChmcyktPmYtPmNvZGVbKGUpLT51LmluZm9dKQorCisjZGVmaW5lIGx1YUtfY29kZUFzQngoZnMsbyxBLHNCeCkJbHVhS19jb2RlQUJ4KGZzLG8sQSwoc0J4KStNQVhBUkdfc0J4KQorCisjZGVmaW5lIGx1YUtfc2V0bXVsdHJldChmcyxlKQlsdWFLX3NldHJldHVybnMoZnMsIGUsIExVQV9NVUxUUkVUKQorCisjZGVmaW5lIGx1YUtfanVtcHRvKGZzLHQpCWx1YUtfcGF0Y2hsaXN0KGZzLCBsdWFLX2p1bXAoZnMpLCB0KQorCitMVUFJX0ZVTkMgaW50IGx1YUtfY29kZUFCeCAoRnVuY1N0YXRlICpmcywgT3BDb2RlIG8sIGludCBBLCB1bnNpZ25lZCBpbnQgQngpOworTFVBSV9GVU5DIGludCBsdWFLX2NvZGVBQkMgKEZ1bmNTdGF0ZSAqZnMsIE9wQ29kZSBvLCBpbnQgQSwgaW50IEIsIGludCBDKTsKK0xVQUlfRlVOQyBpbnQgbHVhS19jb2RlayAoRnVuY1N0YXRlICpmcywgaW50IHJlZywgaW50IGspOworTFVBSV9GVU5DIHZvaWQgbHVhS19maXhsaW5lIChGdW5jU3RhdGUgKmZzLCBpbnQgbGluZSk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX25pbCAoRnVuY1N0YXRlICpmcywgaW50IGZyb20sIGludCBuKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfcmVzZXJ2ZXJlZ3MgKEZ1bmNTdGF0ZSAqZnMsIGludCBuKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfY2hlY2tzdGFjayAoRnVuY1N0YXRlICpmcywgaW50IG4pOworTFVBSV9GVU5DIGludCBsdWFLX3N0cmluZ0sgKEZ1bmNTdGF0ZSAqZnMsIFRTdHJpbmcgKnMpOworTFVBSV9GVU5DIGludCBsdWFLX251bWJlcksgKEZ1bmNTdGF0ZSAqZnMsIGx1YV9OdW1iZXIgcik7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX2Rpc2NoYXJnZXZhcnMgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpOworTFVBSV9GVU5DIGludCBsdWFLX2V4cDJhbnlyZWcgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpOworTFVBSV9GVU5DIHZvaWQgbHVhS19leHAyYW55cmVndXAgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpOworTFVBSV9GVU5DIHZvaWQgbHVhS19leHAybmV4dHJlZyAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX2V4cDJ2YWwgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpOworTFVBSV9GVU5DIGludCBsdWFLX2V4cDJSSyAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX3NlbGYgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUsIGV4cGRlc2MgKmtleSk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX2luZGV4ZWQgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKnQsIGV4cGRlc2MgKmspOworTFVBSV9GVU5DIHZvaWQgbHVhS19nb2lmdHJ1ZSAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX2dvaWZmYWxzZSAoRnVuY1N0YXRlICpmcywgZXhwZGVzYyAqZSk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX3N0b3JldmFyIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICp2YXIsIGV4cGRlc2MgKmUpOworTFVBSV9GVU5DIHZvaWQgbHVhS19zZXRyZXR1cm5zIChGdW5jU3RhdGUgKmZzLCBleHBkZXNjICplLCBpbnQgbnJlc3VsdHMpOworTFVBSV9GVU5DIHZvaWQgbHVhS19zZXRvbmVyZXQgKEZ1bmNTdGF0ZSAqZnMsIGV4cGRlc2MgKmUpOworTFVBSV9GVU5DIGludCBsdWFLX2p1bXAgKEZ1bmNTdGF0ZSAqZnMpOworTFVBSV9GVU5DIHZvaWQgbHVhS19yZXQgKEZ1bmNTdGF0ZSAqZnMsIGludCBmaXJzdCwgaW50IG5yZXQpOworTFVBSV9GVU5DIHZvaWQgbHVhS19wYXRjaGxpc3QgKEZ1bmNTdGF0ZSAqZnMsIGludCBsaXN0LCBpbnQgdGFyZ2V0KTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfcGF0Y2h0b2hlcmUgKEZ1bmNTdGF0ZSAqZnMsIGludCBsaXN0KTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfcGF0Y2hjbG9zZSAoRnVuY1N0YXRlICpmcywgaW50IGxpc3QsIGludCBsZXZlbCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX2NvbmNhdCAoRnVuY1N0YXRlICpmcywgaW50ICpsMSwgaW50IGwyKTsKK0xVQUlfRlVOQyBpbnQgbHVhS19nZXRsYWJlbCAoRnVuY1N0YXRlICpmcyk7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX3ByZWZpeCAoRnVuY1N0YXRlICpmcywgVW5PcHIgb3AsIGV4cGRlc2MgKnYsIGludCBsaW5lKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUtfaW5maXggKEZ1bmNTdGF0ZSAqZnMsIEJpbk9wciBvcCwgZXhwZGVzYyAqdik7CitMVUFJX0ZVTkMgdm9pZCBsdWFLX3Bvc2ZpeCAoRnVuY1N0YXRlICpmcywgQmluT3ByIG9wLCBleHBkZXNjICp2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBkZXNjICp2MiwgaW50IGxpbmUpOworTFVBSV9GVU5DIHZvaWQgbHVhS19zZXRsaXN0IChGdW5jU3RhdGUgKmZzLCBpbnQgYmFzZSwgaW50IG5lbGVtcywgaW50IHRvc3RvcmUpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sY29yb2xpYi5jIGIvY29tMzIvbHVhL3NyYy9sY29yb2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNGY2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xjb3JvbGliLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisqKiAkSWQ6IGxjb3JvbGliLmMsdiAxLjUuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogQ29yb3V0aW5lIExpYnJhcnkKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisjZGVmaW5lIGxjb3JvbGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKworc3RhdGljIGludCBhdXhyZXN1bWUgKGx1YV9TdGF0ZSAqTCwgbHVhX1N0YXRlICpjbywgaW50IG5hcmcpIHsKKyAgaW50IHN0YXR1czsKKyAgaWYgKCFsdWFfY2hlY2tzdGFjayhjbywgbmFyZykpIHsKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgInRvbyBtYW55IGFyZ3VtZW50cyB0byByZXN1bWUiKTsKKyAgICByZXR1cm4gLTE7ICAvKiBlcnJvciBmbGFnICovCisgIH0KKyAgaWYgKGx1YV9zdGF0dXMoY28pID09IExVQV9PSyAmJiBsdWFfZ2V0dG9wKGNvKSA9PSAwKSB7CisgICAgbHVhX3B1c2hsaXRlcmFsKEwsICJjYW5ub3QgcmVzdW1lIGRlYWQgY29yb3V0aW5lIik7CisgICAgcmV0dXJuIC0xOyAgLyogZXJyb3IgZmxhZyAqLworICB9CisgIGx1YV94bW92ZShMLCBjbywgbmFyZyk7CisgIHN0YXR1cyA9IGx1YV9yZXN1bWUoY28sIEwsIG5hcmcpOworICBpZiAoc3RhdHVzID09IExVQV9PSyB8fCBzdGF0dXMgPT0gTFVBX1lJRUxEKSB7CisgICAgaW50IG5yZXMgPSBsdWFfZ2V0dG9wKGNvKTsKKyAgICBpZiAoIWx1YV9jaGVja3N0YWNrKEwsIG5yZXMgKyAxKSkgeworICAgICAgbHVhX3BvcChjbywgbnJlcyk7ICAvKiByZW1vdmUgcmVzdWx0cyBhbnl3YXkgKi8KKyAgICAgIGx1YV9wdXNobGl0ZXJhbChMLCAidG9vIG1hbnkgcmVzdWx0cyB0byByZXN1bWUiKTsKKyAgICAgIHJldHVybiAtMTsgIC8qIGVycm9yIGZsYWcgKi8KKyAgICB9CisgICAgbHVhX3htb3ZlKGNvLCBMLCBucmVzKTsgIC8qIG1vdmUgeWllbGRlZCB2YWx1ZXMgKi8KKyAgICByZXR1cm4gbnJlczsKKyAgfQorICBlbHNlIHsKKyAgICBsdWFfeG1vdmUoY28sIEwsIDEpOyAgLyogbW92ZSBlcnJvciBtZXNzYWdlICovCisgICAgcmV0dXJuIC0xOyAgLyogZXJyb3IgZmxhZyAqLworICB9Cit9CisKKworc3RhdGljIGludCBsdWFCX2NvcmVzdW1lIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX1N0YXRlICpjbyA9IGx1YV90b3RocmVhZChMLCAxKTsKKyAgaW50IHI7CisgIGx1YUxfYXJnY2hlY2soTCwgY28sIDEsICJjb3JvdXRpbmUgZXhwZWN0ZWQiKTsKKyAgciA9IGF1eHJlc3VtZShMLCBjbywgbHVhX2dldHRvcChMKSAtIDEpOworICBpZiAociA8IDApIHsKKyAgICBsdWFfcHVzaGJvb2xlYW4oTCwgMCk7CisgICAgbHVhX2luc2VydChMLCAtMik7CisgICAgcmV0dXJuIDI7ICAvKiByZXR1cm4gZmFsc2UgKyBlcnJvciBtZXNzYWdlICovCisgIH0KKyAgZWxzZSB7CisgICAgbHVhX3B1c2hib29sZWFuKEwsIDEpOworICAgIGx1YV9pbnNlcnQoTCwgLShyICsgMSkpOworICAgIHJldHVybiByICsgMTsgIC8qIHJldHVybiB0cnVlICsgYHJlc3VtZScgcmV0dXJucyAqLworICB9Cit9CisKKworc3RhdGljIGludCBsdWFCX2F1eHdyYXAgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfU3RhdGUgKmNvID0gbHVhX3RvdGhyZWFkKEwsIGx1YV91cHZhbHVlaW5kZXgoMSkpOworICBpbnQgciA9IGF1eHJlc3VtZShMLCBjbywgbHVhX2dldHRvcChMKSk7CisgIGlmIChyIDwgMCkgeworICAgIGlmIChsdWFfaXNzdHJpbmcoTCwgLTEpKSB7ICAvKiBlcnJvciBvYmplY3QgaXMgYSBzdHJpbmc/ICovCisgICAgICBsdWFMX3doZXJlKEwsIDEpOyAgLyogYWRkIGV4dHJhIGluZm8gKi8KKyAgICAgIGx1YV9pbnNlcnQoTCwgLTIpOworICAgICAgbHVhX2NvbmNhdChMLCAyKTsKKyAgICB9CisgICAgcmV0dXJuIGx1YV9lcnJvcihMKTsgIC8qIHByb3BhZ2F0ZSBlcnJvciAqLworICB9CisgIHJldHVybiByOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl9jb2NyZWF0ZSAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9TdGF0ZSAqTkw7CisgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9URlVOQ1RJT04pOworICBOTCA9IGx1YV9uZXd0aHJlYWQoTCk7CisgIGx1YV9wdXNodmFsdWUoTCwgMSk7ICAvKiBtb3ZlIGZ1bmN0aW9uIHRvIHRvcCAqLworICBsdWFfeG1vdmUoTCwgTkwsIDEpOyAgLyogbW92ZSBmdW5jdGlvbiBmcm9tIEwgdG8gTkwgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX2Nvd3JhcCAobHVhX1N0YXRlICpMKSB7CisgIGx1YUJfY29jcmVhdGUoTCk7CisgIGx1YV9wdXNoY2Nsb3N1cmUoTCwgbHVhQl9hdXh3cmFwLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsdWFCX3lpZWxkIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIGx1YV95aWVsZChMLCBsdWFfZ2V0dG9wKEwpKTsKK30KKworCitzdGF0aWMgaW50IGx1YUJfY29zdGF0dXMgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfU3RhdGUgKmNvID0gbHVhX3RvdGhyZWFkKEwsIDEpOworICBsdWFMX2FyZ2NoZWNrKEwsIGNvLCAxLCAiY29yb3V0aW5lIGV4cGVjdGVkIik7CisgIGlmIChMID09IGNvKSBsdWFfcHVzaGxpdGVyYWwoTCwgInJ1bm5pbmciKTsKKyAgZWxzZSB7CisgICAgc3dpdGNoIChsdWFfc3RhdHVzKGNvKSkgeworICAgICAgY2FzZSBMVUFfWUlFTEQ6CisgICAgICAgIGx1YV9wdXNobGl0ZXJhbChMLCAic3VzcGVuZGVkIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMVUFfT0s6IHsKKyAgICAgICAgbHVhX0RlYnVnIGFyOworICAgICAgICBpZiAobHVhX2dldHN0YWNrKGNvLCAwLCAmYXIpID4gMCkgIC8qIGRvZXMgaXQgaGF2ZSBmcmFtZXM/ICovCisgICAgICAgICAgbHVhX3B1c2hsaXRlcmFsKEwsICJub3JtYWwiKTsgIC8qIGl0IGlzIHJ1bm5pbmcgKi8KKyAgICAgICAgZWxzZSBpZiAobHVhX2dldHRvcChjbykgPT0gMCkKKyAgICAgICAgICAgIGx1YV9wdXNobGl0ZXJhbChMLCAiZGVhZCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgbHVhX3B1c2hsaXRlcmFsKEwsICJzdXNwZW5kZWQiKTsgIC8qIGluaXRpYWwgc3RhdGUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OiAgLyogc29tZSBlcnJvciBvY2N1cnJlZCAqLworICAgICAgICBsdWFfcHVzaGxpdGVyYWwoTCwgImRlYWQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgbHVhQl9jb3J1bm5pbmcgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgaXNtYWluID0gbHVhX3B1c2h0aHJlYWQoTCk7CisgIGx1YV9wdXNoYm9vbGVhbihMLCBpc21haW4pOworICByZXR1cm4gMjsKK30KKworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgY29fZnVuY3NbXSA9IHsKKyAgeyJjcmVhdGUiLCBsdWFCX2NvY3JlYXRlfSwKKyAgeyJyZXN1bWUiLCBsdWFCX2NvcmVzdW1lfSwKKyAgeyJydW5uaW5nIiwgbHVhQl9jb3J1bm5pbmd9LAorICB7InN0YXR1cyIsIGx1YUJfY29zdGF0dXN9LAorICB7IndyYXAiLCBsdWFCX2Nvd3JhcH0sCisgIHsieWllbGQiLCBsdWFCX3lpZWxkfSwKKyAge05VTEwsIE5VTEx9Cit9OworCisKKworTFVBTU9EX0FQSSBpbnQgbHVhb3Blbl9jb3JvdXRpbmUgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld2xpYihMLCBjb19mdW5jcyk7CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xjdHlwZS5jIGIvY29tMzIvbHVhL3NyYy9sY3R5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Y4Y2FkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sY3R5cGUuYwpAQCAtMCwwICsxLDUyIEBACisvKgorKiogJElkOiBsY3R5cGUuYyx2IDEuMTEuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogJ2N0eXBlJyBmdW5jdGlvbnMgZm9yIEx1YQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNkZWZpbmUgbGN0eXBlX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImxjdHlwZS5oIgorCisjaWYgIUxVQV9VU0VfQ1RZUEUJLyogeyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisKK0xVQUlfRERFRiBjb25zdCBsdV9ieXRlIGx1YWlfY3R5cGVfW1VDSEFSX01BWCArIDJdID0geworICAweDAwLCAgLyogRU9aICovCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLAkvKiAwLiAqLworICAweDAwLCAgMHgwOCwgIDB4MDgsICAweDA4LCAgMHgwOCwgIDB4MDgsICAweDAwLCAgMHgwMCwKKyAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCS8qIDEuICovCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLAorICAweDBjLCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwJLyogMi4gKi8KKyAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDQsCisgIDB4MTYsICAweDE2LCAgMHgxNiwgIDB4MTYsICAweDE2LCAgMHgxNiwgIDB4MTYsICAweDE2LAkvKiAzLiAqLworICAweDE2LCAgMHgxNiwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwKKyAgMHgwNCwgIDB4MTUsICAweDE1LCAgMHgxNSwgIDB4MTUsICAweDE1LCAgMHgxNSwgIDB4MDUsCS8qIDQuICovCisgIDB4MDUsICAweDA1LCAgMHgwNSwgIDB4MDUsICAweDA1LCAgMHgwNSwgIDB4MDUsICAweDA1LAorICAweDA1LCAgMHgwNSwgIDB4MDUsICAweDA1LCAgMHgwNSwgIDB4MDUsICAweDA1LCAgMHgwNSwJLyogNS4gKi8KKyAgMHgwNSwgIDB4MDUsICAweDA1LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDUsCisgIDB4MDQsICAweDE1LCAgMHgxNSwgIDB4MTUsICAweDE1LCAgMHgxNSwgIDB4MTUsICAweDA1LAkvKiA2LiAqLworICAweDA1LCAgMHgwNSwgIDB4MDUsICAweDA1LCAgMHgwNSwgIDB4MDUsICAweDA1LCAgMHgwNSwKKyAgMHgwNSwgIDB4MDUsICAweDA1LCAgMHgwNSwgIDB4MDUsICAweDA1LCAgMHgwNSwgIDB4MDUsCS8qIDcuICovCisgIDB4MDUsICAweDA1LCAgMHgwNSwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDAwLAorICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwJLyogOC4gKi8KKyAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLAkvKiA5LiAqLworICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKKyAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCS8qIGEuICovCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLAorICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwJLyogYi4gKi8KKyAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLAkvKiBjLiAqLworICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKKyAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCS8qIGQuICovCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLAorICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwJLyogZS4gKi8KKyAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLAkvKiBmLiAqLworICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKK307CisKKyNlbmRpZgkJCS8qIH0gKi8KZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGN0eXBlLmggYi9jb20zMi9sdWEvc3JjL2xjdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWIyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xjdHlwZS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisqKiAkSWQ6IGxjdHlwZS5oLHYgMS4xMi4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiAnY3R5cGUnIGZ1bmN0aW9ucyBmb3IgTHVhCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsY3R5cGVfaAorI2RlZmluZSBsY3R5cGVfaAorCisjaW5jbHVkZSAibHVhLmgiCisKKworLyoKKyoqIFdBUk5JTkc6IHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIGRvIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kCisqKiB0byB0aGUgc2ltaWxhciBmdW5jdGlvbnMgaW4gdGhlIHN0YW5kYXJkIEMgY3R5cGUuaC4gVGhleSBhcmUKKyoqIG9wdGltaXplZCBmb3IgdGhlIHNwZWNpZmljIG5lZWRzIG9mIEx1YQorKi8KKworI2lmICFkZWZpbmVkKExVQV9VU0VfQ1RZUEUpCisKKyNpZiAnQScgPT0gNjUgJiYgJzAnID09IDQ4CisvKiBBU0NJSSBjYXNlOiBjYW4gdXNlIGl0cyBvd24gdGFibGVzOyBmYXN0ZXIgYW5kIGZpeGVkICovCisjZGVmaW5lIExVQV9VU0VfQ1RZUEUJMAorI2Vsc2UKKy8qIG11c3QgdXNlIHN0YW5kYXJkIEMgY3R5cGUgKi8KKyNkZWZpbmUgTFVBX1VTRV9DVFlQRQkxCisjZW5kaWYKKworI2VuZGlmCisKKworI2lmICFMVUFfVVNFX0NUWVBFCS8qIHsgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAibGxpbWl0cy5oIgorCisKKyNkZWZpbmUgQUxQSEFCSVQJMAorI2RlZmluZSBESUdJVEJJVAkxCisjZGVmaW5lIFBSSU5UQklUCTIKKyNkZWZpbmUgU1BBQ0VCSVQJMworI2RlZmluZSBYRElHSVRCSVQJNAorCisKKyNkZWZpbmUgTUFTSyhCKQkJKDEgPDwgKEIpKQorCisKKy8qCisqKiBhZGQgMSB0byBjaGFyIHRvIGFsbG93IGluZGV4IC0xIChFT1opCisqLworI2RlZmluZSB0ZXN0cHJvcChjLHApCShsdWFpX2N0eXBlX1soYykrMV0gJiAocCkpCisKKy8qCisqKiAnbGFscGhhJyAoTHVhIGFscGhhYmV0aWMpIGFuZCAnbGFsbnVtJyAoTHVhIGFscGhhbnVtZXJpYykgYm90aCBpbmNsdWRlICdfJworKi8KKyNkZWZpbmUgbGlzbGFscGhhKGMpCXRlc3Rwcm9wKGMsIE1BU0soQUxQSEFCSVQpKQorI2RlZmluZSBsaXNsYWxudW0oYykJdGVzdHByb3AoYywgKE1BU0soQUxQSEFCSVQpIHwgTUFTSyhESUdJVEJJVCkpKQorI2RlZmluZSBsaXNkaWdpdChjKQl0ZXN0cHJvcChjLCBNQVNLKERJR0lUQklUKSkKKyNkZWZpbmUgbGlzc3BhY2UoYykJdGVzdHByb3AoYywgTUFTSyhTUEFDRUJJVCkpCisjZGVmaW5lIGxpc3ByaW50KGMpCXRlc3Rwcm9wKGMsIE1BU0soUFJJTlRCSVQpKQorI2RlZmluZSBsaXN4ZGlnaXQoYykJdGVzdHByb3AoYywgTUFTSyhYRElHSVRCSVQpKQorCisvKgorKiogdGhpcyAnbHRvbG93ZXInIG9ubHkgd29ya3MgZm9yIGFscGhhYmV0aWMgY2hhcmFjdGVycworKi8KKyNkZWZpbmUgbHRvbG93ZXIoYykJKChjKSB8ICgnQScgXiAnYScpKQorCisKKy8qIHR3byBtb3JlIGVudHJpZXMgZm9yIDAgYW5kIC0xIChFT1opICovCitMVUFJX0RERUMgY29uc3QgbHVfYnl0ZSBsdWFpX2N0eXBlX1tVQ0hBUl9NQVggKyAyXTsKKworCisjZWxzZQkJCS8qIH17ICovCisKKy8qCisqKiB1c2Ugc3RhbmRhcmQgQyBjdHlwZXMKKyovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisKKyNkZWZpbmUgbGlzbGFscGhhKGMpCShpc2FscGhhKGMpIHx8IChjKSA9PSAnXycpCisjZGVmaW5lIGxpc2xhbG51bShjKQkoaXNhbG51bShjKSB8fCAoYykgPT0gJ18nKQorI2RlZmluZSBsaXNkaWdpdChjKQkoaXNkaWdpdChjKSkKKyNkZWZpbmUgbGlzc3BhY2UoYykJKGlzc3BhY2UoYykpCisjZGVmaW5lIGxpc3ByaW50KGMpCShpc3ByaW50KGMpKQorI2RlZmluZSBsaXN4ZGlnaXQoYykJKGlzeGRpZ2l0KGMpKQorCisjZGVmaW5lIGx0b2xvd2VyKGMpCSh0b2xvd2VyKGMpKQorCisjZW5kaWYJCQkvKiB9ICovCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xkYmxpYi5jIGIvY29tMzIvbHVhL3NyYy9sZGJsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGZlM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sZGJsaWIuYwpAQCAtMCwwICsxLDM5OCBAQAorLyoKKyoqICRJZDogbGRibGliLmMsdiAxLjEzMi4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBJbnRlcmZhY2UgZnJvbSBMdWEgdG8gaXRzIGRlYnVnIEFQSQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbGRibGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKworI2RlZmluZSBIT09LS0VZCQkiX0hLRVkiCisKKworCitzdGF0aWMgaW50IGRiX2dldHJlZ2lzdHJ5IChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2h2YWx1ZShMLCBMVUFfUkVHSVNUUllJTkRFWCk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZGJfZ2V0bWV0YXRhYmxlIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgaWYgKCFsdWFfZ2V0bWV0YXRhYmxlKEwsIDEpKSB7CisgICAgbHVhX3B1c2huaWwoTCk7ICAvKiBubyBtZXRhdGFibGUgKi8KKyAgfQorICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGRiX3NldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMKSB7CisgIGludCB0ID0gbHVhX3R5cGUoTCwgMik7CisgIGx1YUxfYXJnY2hlY2soTCwgdCA9PSBMVUFfVE5JTCB8fCB0ID09IExVQV9UVEFCTEUsIDIsCisgICAgICAgICAgICAgICAgICAgICJuaWwgb3IgdGFibGUgZXhwZWN0ZWQiKTsKKyAgbHVhX3NldHRvcChMLCAyKTsKKyAgbHVhX3NldG1ldGF0YWJsZShMLCAxKTsKKyAgcmV0dXJuIDE7ICAvKiByZXR1cm4gMXN0IGFyZ3VtZW50ICovCit9CisKKworc3RhdGljIGludCBkYl9nZXR1c2VydmFsdWUgKGx1YV9TdGF0ZSAqTCkgeworICBpZiAobHVhX3R5cGUoTCwgMSkgIT0gTFVBX1RVU0VSREFUQSkKKyAgICBsdWFfcHVzaG5pbChMKTsKKyAgZWxzZQorICAgIGx1YV9nZXR1c2VydmFsdWUoTCwgMSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZGJfc2V0dXNlcnZhbHVlIChsdWFfU3RhdGUgKkwpIHsKKyAgaWYgKGx1YV90eXBlKEwsIDEpID09IExVQV9UTElHSFRVU0VSREFUQSkKKyAgICBsdWFMX2FyZ2Vycm9yKEwsIDEsICJmdWxsIHVzZXJkYXRhIGV4cGVjdGVkLCBnb3QgbGlnaHQgdXNlcmRhdGEiKTsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMSwgTFVBX1RVU0VSREFUQSk7CisgIGlmICghbHVhX2lzbm9uZW9ybmlsKEwsIDIpKQorICAgIGx1YUxfY2hlY2t0eXBlKEwsIDIsIExVQV9UVEFCTEUpOworICBsdWFfc2V0dG9wKEwsIDIpOworICBsdWFfc2V0dXNlcnZhbHVlKEwsIDEpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgdm9pZCBzZXR0YWJzcyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICppLCBjb25zdCBjaGFyICp2KSB7CisgIGx1YV9wdXNoc3RyaW5nKEwsIHYpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsIGkpOworfQorCisKK3N0YXRpYyB2b2lkIHNldHRhYnNpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmksIGludCB2KSB7CisgIGx1YV9wdXNoaW50ZWdlcihMLCB2KTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCBpKTsKK30KKworCitzdGF0aWMgdm9pZCBzZXR0YWJzYiAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICppLCBpbnQgdikgeworICBsdWFfcHVzaGJvb2xlYW4oTCwgdik7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgaSk7Cit9CisKKworc3RhdGljIGx1YV9TdGF0ZSAqZ2V0dGhyZWFkIChsdWFfU3RhdGUgKkwsIGludCAqYXJnKSB7CisgIGlmIChsdWFfaXN0aHJlYWQoTCwgMSkpIHsKKyAgICAqYXJnID0gMTsKKyAgICByZXR1cm4gbHVhX3RvdGhyZWFkKEwsIDEpOworICB9CisgIGVsc2UgeworICAgICphcmcgPSAwOworICAgIHJldHVybiBMOworICB9Cit9CisKKworc3RhdGljIHZvaWQgdHJlYXRzdGFja29wdGlvbiAobHVhX1N0YXRlICpMLCBsdWFfU3RhdGUgKkwxLCBjb25zdCBjaGFyICpmbmFtZSkgeworICBpZiAoTCA9PSBMMSkgeworICAgIGx1YV9wdXNodmFsdWUoTCwgLTIpOworICAgIGx1YV9yZW1vdmUoTCwgLTMpOworICB9CisgIGVsc2UKKyAgICBsdWFfeG1vdmUoTDEsIEwsIDEpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsIGZuYW1lKTsKK30KKworCitzdGF0aWMgaW50IGRiX2dldGluZm8gKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfRGVidWcgYXI7CisgIGludCBhcmc7CisgIGx1YV9TdGF0ZSAqTDEgPSBnZXR0aHJlYWQoTCwgJmFyZyk7CisgIGNvbnN0IGNoYXIgKm9wdGlvbnMgPSBsdWFMX29wdHN0cmluZyhMLCBhcmcrMiwgImZsblN0dSIpOworICBpZiAobHVhX2lzbnVtYmVyKEwsIGFyZysxKSkgeworICAgIGlmICghbHVhX2dldHN0YWNrKEwxLCAoaW50KWx1YV90b2ludGVnZXIoTCwgYXJnKzEpLCAmYXIpKSB7CisgICAgICBsdWFfcHVzaG5pbChMKTsgIC8qIGxldmVsIG91dCBvZiByYW5nZSAqLworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGx1YV9pc2Z1bmN0aW9uKEwsIGFyZysxKSkgeworICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiPiVzIiwgb3B0aW9ucyk7CisgICAgb3B0aW9ucyA9IGx1YV90b3N0cmluZyhMLCAtMSk7CisgICAgbHVhX3B1c2h2YWx1ZShMLCBhcmcrMSk7CisgICAgbHVhX3htb3ZlKEwsIEwxLCAxKTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIGx1YUxfYXJnZXJyb3IoTCwgYXJnKzEsICJmdW5jdGlvbiBvciBsZXZlbCBleHBlY3RlZCIpOworICBpZiAoIWx1YV9nZXRpbmZvKEwxLCBvcHRpb25zLCAmYXIpKQorICAgIHJldHVybiBsdWFMX2FyZ2Vycm9yKEwsIGFyZysyLCAiaW52YWxpZCBvcHRpb24iKTsKKyAgbHVhX2NyZWF0ZXRhYmxlKEwsIDAsIDIpOworICBpZiAoc3RyY2hyKG9wdGlvbnMsICdTJykpIHsKKyAgICBzZXR0YWJzcyhMLCAic291cmNlIiwgYXIuc291cmNlKTsKKyAgICBzZXR0YWJzcyhMLCAic2hvcnRfc3JjIiwgYXIuc2hvcnRfc3JjKTsKKyAgICBzZXR0YWJzaShMLCAibGluZWRlZmluZWQiLCBhci5saW5lZGVmaW5lZCk7CisgICAgc2V0dGFic2koTCwgImxhc3RsaW5lZGVmaW5lZCIsIGFyLmxhc3RsaW5lZGVmaW5lZCk7CisgICAgc2V0dGFic3MoTCwgIndoYXQiLCBhci53aGF0KTsKKyAgfQorICBpZiAoc3RyY2hyKG9wdGlvbnMsICdsJykpCisgICAgc2V0dGFic2koTCwgImN1cnJlbnRsaW5lIiwgYXIuY3VycmVudGxpbmUpOworICBpZiAoc3RyY2hyKG9wdGlvbnMsICd1JykpIHsKKyAgICBzZXR0YWJzaShMLCAibnVwcyIsIGFyLm51cHMpOworICAgIHNldHRhYnNpKEwsICJucGFyYW1zIiwgYXIubnBhcmFtcyk7CisgICAgc2V0dGFic2IoTCwgImlzdmFyYXJnIiwgYXIuaXN2YXJhcmcpOworICB9CisgIGlmIChzdHJjaHIob3B0aW9ucywgJ24nKSkgeworICAgIHNldHRhYnNzKEwsICJuYW1lIiwgYXIubmFtZSk7CisgICAgc2V0dGFic3MoTCwgIm5hbWV3aGF0IiwgYXIubmFtZXdoYXQpOworICB9CisgIGlmIChzdHJjaHIob3B0aW9ucywgJ3QnKSkKKyAgICBzZXR0YWJzYihMLCAiaXN0YWlsY2FsbCIsIGFyLmlzdGFpbGNhbGwpOworICBpZiAoc3RyY2hyKG9wdGlvbnMsICdMJykpCisgICAgdHJlYXRzdGFja29wdGlvbihMLCBMMSwgImFjdGl2ZWxpbmVzIik7CisgIGlmIChzdHJjaHIob3B0aW9ucywgJ2YnKSkKKyAgICB0cmVhdHN0YWNrb3B0aW9uKEwsIEwxLCAiZnVuYyIpOworICByZXR1cm4gMTsgIC8qIHJldHVybiB0YWJsZSAqLworfQorCisKK3N0YXRpYyBpbnQgZGJfZ2V0bG9jYWwgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYXJnOworICBsdWFfU3RhdGUgKkwxID0gZ2V0dGhyZWFkKEwsICZhcmcpOworICBsdWFfRGVidWcgYXI7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGludCBudmFyID0gbHVhTF9jaGVja2ludChMLCBhcmcrMik7ICAvKiBsb2NhbC12YXJpYWJsZSBpbmRleCAqLworICBpZiAobHVhX2lzZnVuY3Rpb24oTCwgYXJnICsgMSkpIHsgIC8qIGZ1bmN0aW9uIGFyZ3VtZW50PyAqLworICAgIGx1YV9wdXNodmFsdWUoTCwgYXJnICsgMSk7ICAvKiBwdXNoIGZ1bmN0aW9uICovCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgbHVhX2dldGxvY2FsKEwsIE5VTEwsIG52YXIpKTsgIC8qIHB1c2ggbG9jYWwgbmFtZSAqLworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgeyAgLyogc3RhY2stbGV2ZWwgYXJndW1lbnQgKi8KKyAgICBpZiAoIWx1YV9nZXRzdGFjayhMMSwgbHVhTF9jaGVja2ludChMLCBhcmcrMSksICZhcikpICAvKiBvdXQgb2YgcmFuZ2U/ICovCisgICAgICByZXR1cm4gbHVhTF9hcmdlcnJvcihMLCBhcmcrMSwgImxldmVsIG91dCBvZiByYW5nZSIpOworICAgIG5hbWUgPSBsdWFfZ2V0bG9jYWwoTDEsICZhciwgbnZhcik7CisgICAgaWYgKG5hbWUpIHsKKyAgICAgIGx1YV94bW92ZShMMSwgTCwgMSk7ICAvKiBwdXNoIGxvY2FsIHZhbHVlICovCisgICAgICBsdWFfcHVzaHN0cmluZyhMLCBuYW1lKTsgIC8qIHB1c2ggbmFtZSAqLworICAgICAgbHVhX3B1c2h2YWx1ZShMLCAtMik7ICAvKiByZS1vcmRlciAqLworICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbHVhX3B1c2huaWwoTCk7ICAvKiBubyBuYW1lIChub3IgdmFsdWUpICovCisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgaW50IGRiX3NldGxvY2FsIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGFyZzsKKyAgbHVhX1N0YXRlICpMMSA9IGdldHRocmVhZChMLCAmYXJnKTsKKyAgbHVhX0RlYnVnIGFyOworICBpZiAoIWx1YV9nZXRzdGFjayhMMSwgbHVhTF9jaGVja2ludChMLCBhcmcrMSksICZhcikpICAvKiBvdXQgb2YgcmFuZ2U/ICovCisgICAgcmV0dXJuIGx1YUxfYXJnZXJyb3IoTCwgYXJnKzEsICJsZXZlbCBvdXQgb2YgcmFuZ2UiKTsKKyAgbHVhTF9jaGVja2FueShMLCBhcmcrMyk7CisgIGx1YV9zZXR0b3AoTCwgYXJnKzMpOworICBsdWFfeG1vdmUoTCwgTDEsIDEpOworICBsdWFfcHVzaHN0cmluZyhMLCBsdWFfc2V0bG9jYWwoTDEsICZhciwgbHVhTF9jaGVja2ludChMLCBhcmcrMikpKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBhdXh1cHZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBnZXQpIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IG4gPSBsdWFMX2NoZWNraW50KEwsIDIpOworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVEZVTkNUSU9OKTsKKyAgbmFtZSA9IGdldCA/IGx1YV9nZXR1cHZhbHVlKEwsIDEsIG4pIDogbHVhX3NldHVwdmFsdWUoTCwgMSwgbik7CisgIGlmIChuYW1lID09IE5VTEwpIHJldHVybiAwOworICBsdWFfcHVzaHN0cmluZyhMLCBuYW1lKTsKKyAgbHVhX2luc2VydChMLCAtKGdldCsxKSk7CisgIHJldHVybiBnZXQgKyAxOworfQorCisKK3N0YXRpYyBpbnQgZGJfZ2V0dXB2YWx1ZSAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBhdXh1cHZhbHVlKEwsIDEpOworfQorCisKK3N0YXRpYyBpbnQgZGJfc2V0dXB2YWx1ZSAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2thbnkoTCwgMyk7CisgIHJldHVybiBhdXh1cHZhbHVlKEwsIDApOworfQorCisKK3N0YXRpYyBpbnQgY2hlY2t1cHZhbCAobHVhX1N0YXRlICpMLCBpbnQgYXJnZiwgaW50IGFyZ251cCkgeworICBsdWFfRGVidWcgYXI7CisgIGludCBudXAgPSBsdWFMX2NoZWNraW50KEwsIGFyZ251cCk7CisgIGx1YUxfY2hlY2t0eXBlKEwsIGFyZ2YsIExVQV9URlVOQ1RJT04pOworICBsdWFfcHVzaHZhbHVlKEwsIGFyZ2YpOworICBsdWFfZ2V0aW5mbyhMLCAiPnUiLCAmYXIpOworICBsdWFMX2FyZ2NoZWNrKEwsIDEgPD0gbnVwICYmIG51cCA8PSBhci5udXBzLCBhcmdudXAsICJpbnZhbGlkIHVwdmFsdWUgaW5kZXgiKTsKKyAgcmV0dXJuIG51cDsKK30KKworCitzdGF0aWMgaW50IGRiX3VwdmFsdWVpZCAobHVhX1N0YXRlICpMKSB7CisgIGludCBuID0gY2hlY2t1cHZhbChMLCAxLCAyKTsKKyAgbHVhX3B1c2hsaWdodHVzZXJkYXRhKEwsIGx1YV91cHZhbHVlaWQoTCwgMSwgbikpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGRiX3VwdmFsdWVqb2luIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IG4xID0gY2hlY2t1cHZhbChMLCAxLCAyKTsKKyAgaW50IG4yID0gY2hlY2t1cHZhbChMLCAzLCA0KTsKKyAgbHVhTF9hcmdjaGVjayhMLCAhbHVhX2lzY2Z1bmN0aW9uKEwsIDEpLCAxLCAiTHVhIGZ1bmN0aW9uIGV4cGVjdGVkIik7CisgIGx1YUxfYXJnY2hlY2soTCwgIWx1YV9pc2NmdW5jdGlvbihMLCAzKSwgMywgIkx1YSBmdW5jdGlvbiBleHBlY3RlZCIpOworICBsdWFfdXB2YWx1ZWpvaW4oTCwgMSwgbjEsIDMsIG4yKTsKKyAgcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBnZXRob29rdGFibGUoTCkJbHVhTF9nZXRzdWJ0YWJsZShMLCBMVUFfUkVHSVNUUllJTkRFWCwgSE9PS0tFWSkKKworCitzdGF0aWMgdm9pZCBob29rZiAobHVhX1N0YXRlICpMLCBsdWFfRGVidWcgKmFyKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBob29rbmFtZXNbXSA9CisgICAgeyJjYWxsIiwgInJldHVybiIsICJsaW5lIiwgImNvdW50IiwgInRhaWwgY2FsbCJ9OworICBnZXRob29rdGFibGUoTCk7CisgIGx1YV9wdXNodGhyZWFkKEwpOworICBsdWFfcmF3Z2V0KEwsIC0yKTsKKyAgaWYgKGx1YV9pc2Z1bmN0aW9uKEwsIC0xKSkgeworICAgIGx1YV9wdXNoc3RyaW5nKEwsIGhvb2tuYW1lc1soaW50KWFyLT5ldmVudF0pOworICAgIGlmIChhci0+Y3VycmVudGxpbmUgPj0gMCkKKyAgICAgIGx1YV9wdXNoaW50ZWdlcihMLCBhci0+Y3VycmVudGxpbmUpOworICAgIGVsc2UgbHVhX3B1c2huaWwoTCk7CisgICAgbHVhX2Fzc2VydChsdWFfZ2V0aW5mbyhMLCAibFMiLCBhcikpOworICAgIGx1YV9jYWxsKEwsIDIsIDApOworICB9Cit9CisKKworc3RhdGljIGludCBtYWtlbWFzayAoY29uc3QgY2hhciAqc21hc2ssIGludCBjb3VudCkgeworICBpbnQgbWFzayA9IDA7CisgIGlmIChzdHJjaHIoc21hc2ssICdjJykpIG1hc2sgfD0gTFVBX01BU0tDQUxMOworICBpZiAoc3RyY2hyKHNtYXNrLCAncicpKSBtYXNrIHw9IExVQV9NQVNLUkVUOworICBpZiAoc3RyY2hyKHNtYXNrLCAnbCcpKSBtYXNrIHw9IExVQV9NQVNLTElORTsKKyAgaWYgKGNvdW50ID4gMCkgbWFzayB8PSBMVUFfTUFTS0NPVU5UOworICByZXR1cm4gbWFzazsKK30KKworCitzdGF0aWMgY2hhciAqdW5tYWtlbWFzayAoaW50IG1hc2ssIGNoYXIgKnNtYXNrKSB7CisgIGludCBpID0gMDsKKyAgaWYgKG1hc2sgJiBMVUFfTUFTS0NBTEwpIHNtYXNrW2krK10gPSAnYyc7CisgIGlmIChtYXNrICYgTFVBX01BU0tSRVQpIHNtYXNrW2krK10gPSAncic7CisgIGlmIChtYXNrICYgTFVBX01BU0tMSU5FKSBzbWFza1tpKytdID0gJ2wnOworICBzbWFza1tpXSA9ICdcMCc7CisgIHJldHVybiBzbWFzazsKK30KKworCitzdGF0aWMgaW50IGRiX3NldGhvb2sgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYXJnLCBtYXNrLCBjb3VudDsKKyAgbHVhX0hvb2sgZnVuYzsKKyAgbHVhX1N0YXRlICpMMSA9IGdldHRocmVhZChMLCAmYXJnKTsKKyAgaWYgKGx1YV9pc25vbmVvcm5pbChMLCBhcmcrMSkpIHsKKyAgICBsdWFfc2V0dG9wKEwsIGFyZysxKTsKKyAgICBmdW5jID0gTlVMTDsgbWFzayA9IDA7IGNvdW50ID0gMDsgIC8qIHR1cm4gb2ZmIGhvb2tzICovCisgIH0KKyAgZWxzZSB7CisgICAgY29uc3QgY2hhciAqc21hc2sgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIGFyZysyKTsKKyAgICBsdWFMX2NoZWNrdHlwZShMLCBhcmcrMSwgTFVBX1RGVU5DVElPTik7CisgICAgY291bnQgPSBsdWFMX29wdGludChMLCBhcmcrMywgMCk7CisgICAgZnVuYyA9IGhvb2tmOyBtYXNrID0gbWFrZW1hc2soc21hc2ssIGNvdW50KTsKKyAgfQorICBpZiAoZ2V0aG9va3RhYmxlKEwpID09IDApIHsgIC8qIGNyZWF0aW5nIGhvb2sgdGFibGU/ICovCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgImsiKTsKKyAgICBsdWFfc2V0ZmllbGQoTCwgLTIsICJfX21vZGUiKTsgIC8qKiBob29rdGFibGUuX19tb2RlID0gImsiICovCisgICAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7CisgICAgbHVhX3NldG1ldGF0YWJsZShMLCAtMik7ICAvKiBzZXRtZXRhdGFibGUoaG9va3RhYmxlKSA9IGhvb2t0YWJsZSAqLworICB9CisgIGx1YV9wdXNodGhyZWFkKEwxKTsgbHVhX3htb3ZlKEwxLCBMLCAxKTsKKyAgbHVhX3B1c2h2YWx1ZShMLCBhcmcrMSk7CisgIGx1YV9yYXdzZXQoTCwgLTMpOyAgLyogc2V0IG5ldyBob29rICovCisgIGx1YV9zZXRob29rKEwxLCBmdW5jLCBtYXNrLCBjb3VudCk7ICAvKiBzZXQgaG9va3MgKi8KKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkYl9nZXRob29rIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGFyZzsKKyAgbHVhX1N0YXRlICpMMSA9IGdldHRocmVhZChMLCAmYXJnKTsKKyAgY2hhciBidWZmWzVdOworICBpbnQgbWFzayA9IGx1YV9nZXRob29rbWFzayhMMSk7CisgIGx1YV9Ib29rIGhvb2sgPSBsdWFfZ2V0aG9vayhMMSk7CisgIGlmIChob29rICE9IE5VTEwgJiYgaG9vayAhPSBob29rZikgIC8qIGV4dGVybmFsIGhvb2s/ICovCisgICAgbHVhX3B1c2hsaXRlcmFsKEwsICJleHRlcm5hbCBob29rIik7CisgIGVsc2UgeworICAgIGdldGhvb2t0YWJsZShMKTsKKyAgICBsdWFfcHVzaHRocmVhZChMMSk7IGx1YV94bW92ZShMMSwgTCwgMSk7CisgICAgbHVhX3Jhd2dldChMLCAtMik7ICAgLyogZ2V0IGhvb2sgKi8KKyAgICBsdWFfcmVtb3ZlKEwsIC0yKTsgIC8qIHJlbW92ZSBob29rIHRhYmxlICovCisgIH0KKyAgbHVhX3B1c2hzdHJpbmcoTCwgdW5tYWtlbWFzayhtYXNrLCBidWZmKSk7CisgIGx1YV9wdXNoaW50ZWdlcihMLCBsdWFfZ2V0aG9va2NvdW50KEwxKSk7CisgIHJldHVybiAzOworfQorCisKK3N0YXRpYyBpbnQgZGJfZGVidWcgKGx1YV9TdGF0ZSAqTCkgeworICBmb3IgKDs7KSB7CisgICAgY2hhciBidWZmZXJbMjUwXTsKKyAgICBsdWFpX3dyaXRlc3RyaW5nZXJyb3IoIiVzIiwgImx1YV9kZWJ1Zz4gIik7CisgICAgaWYgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHN0ZGluKSA9PSAwIHx8CisgICAgICAgIHN0cmNtcChidWZmZXIsICJjb250XG4iKSA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGx1YUxfbG9hZGJ1ZmZlcihMLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCAiPShkZWJ1ZyBjb21tYW5kKSIpIHx8CisgICAgICAgIGx1YV9wY2FsbChMLCAwLCAwLCAwKSkKKyAgICAgIGx1YWlfd3JpdGVzdHJpbmdlcnJvcigiJXNcbiIsIGx1YV90b3N0cmluZyhMLCAtMSkpOworICAgIGx1YV9zZXR0b3AoTCwgMCk7ICAvKiByZW1vdmUgZXZlbnR1YWwgcmV0dXJucyAqLworICB9Cit9CisKKworc3RhdGljIGludCBkYl90cmFjZWJhY2sgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYXJnOworICBsdWFfU3RhdGUgKkwxID0gZ2V0dGhyZWFkKEwsICZhcmcpOworICBjb25zdCBjaGFyICptc2cgPSBsdWFfdG9zdHJpbmcoTCwgYXJnICsgMSk7CisgIGlmIChtc2cgPT0gTlVMTCAmJiAhbHVhX2lzbm9uZW9ybmlsKEwsIGFyZyArIDEpKSAgLyogbm9uLXN0cmluZyAnbXNnJz8gKi8KKyAgICBsdWFfcHVzaHZhbHVlKEwsIGFyZyArIDEpOyAgLyogcmV0dXJuIGl0IHVudG91Y2hlZCAqLworICBlbHNlIHsKKyAgICBpbnQgbGV2ZWwgPSBsdWFMX29wdGludChMLCBhcmcgKyAyLCAoTCA9PSBMMSkgPyAxIDogMCk7CisgICAgbHVhTF90cmFjZWJhY2soTCwgTDEsIG1zZywgbGV2ZWwpOworICB9CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBkYmxpYltdID0geworICB7ImRlYnVnIiwgZGJfZGVidWd9LAorICB7ImdldHVzZXJ2YWx1ZSIsIGRiX2dldHVzZXJ2YWx1ZX0sCisgIHsiZ2V0aG9vayIsIGRiX2dldGhvb2t9LAorICB7ImdldGluZm8iLCBkYl9nZXRpbmZvfSwKKyAgeyJnZXRsb2NhbCIsIGRiX2dldGxvY2FsfSwKKyAgeyJnZXRyZWdpc3RyeSIsIGRiX2dldHJlZ2lzdHJ5fSwKKyAgeyJnZXRtZXRhdGFibGUiLCBkYl9nZXRtZXRhdGFibGV9LAorICB7ImdldHVwdmFsdWUiLCBkYl9nZXR1cHZhbHVlfSwKKyAgeyJ1cHZhbHVlam9pbiIsIGRiX3VwdmFsdWVqb2lufSwKKyAgeyJ1cHZhbHVlaWQiLCBkYl91cHZhbHVlaWR9LAorICB7InNldHVzZXJ2YWx1ZSIsIGRiX3NldHVzZXJ2YWx1ZX0sCisgIHsic2V0aG9vayIsIGRiX3NldGhvb2t9LAorICB7InNldGxvY2FsIiwgZGJfc2V0bG9jYWx9LAorICB7InNldG1ldGF0YWJsZSIsIGRiX3NldG1ldGF0YWJsZX0sCisgIHsic2V0dXB2YWx1ZSIsIGRiX3NldHVwdmFsdWV9LAorICB7InRyYWNlYmFjayIsIGRiX3RyYWNlYmFja30sCisgIHtOVUxMLCBOVUxMfQorfTsKKworCitMVUFNT0RfQVBJIGludCBsdWFvcGVuX2RlYnVnIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9uZXdsaWIoTCwgZGJsaWIpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sZGVidWcuYyBiL2NvbTMyL2x1YS9zcmMvbGRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkNjYzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbGRlYnVnLmMKQEAgLTAsMCArMSw1OTMgQEAKKy8qCisqKiAkSWQ6IGxkZWJ1Zy5jLHYgMi45MC4xLjMgMjAxMy8wNS8xNiAxNjowNDoxNSByb2JlcnRvIEV4cCAkCisqKiBEZWJ1ZyBJbnRlcmZhY2UKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisjZGVmaW5lIGxkZWJ1Z19jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxhcGkuaCIKKyNpbmNsdWRlICJsY29kZS5oIgorI2luY2x1ZGUgImxkZWJ1Zy5oIgorI2luY2x1ZGUgImxkby5oIgorI2luY2x1ZGUgImxmdW5jLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxvcGNvZGVzLmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHN0cmluZy5oIgorI2luY2x1ZGUgImx0YWJsZS5oIgorI2luY2x1ZGUgImx0bS5oIgorI2luY2x1ZGUgImx2bS5oIgorCisKKworI2RlZmluZSBub0x1YUNsb3N1cmUoZikJCSgoZikgPT0gTlVMTCB8fCAoZiktPmMudHQgPT0gTFVBX1RDQ0wpCisKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldGZ1bmNuYW1lIChsdWFfU3RhdGUgKkwsIENhbGxJbmZvICpjaSwgY29uc3QgY2hhciAqKm5hbWUpOworCisKK3N0YXRpYyBpbnQgY3VycmVudHBjIChDYWxsSW5mbyAqY2kpIHsKKyAgbHVhX2Fzc2VydChpc0x1YShjaSkpOworICByZXR1cm4gcGNSZWwoY2ktPnUubC5zYXZlZHBjLCBjaV9mdW5jKGNpKS0+cCk7Cit9CisKKworc3RhdGljIGludCBjdXJyZW50bGluZSAoQ2FsbEluZm8gKmNpKSB7CisgIHJldHVybiBnZXRmdW5jbGluZShjaV9mdW5jKGNpKS0+cCwgY3VycmVudHBjKGNpKSk7Cit9CisKKworLyoKKyoqIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhc3luY2hyb25vdXMgKGUuZy4gZHVyaW5nIGEgc2lnbmFsKQorKi8KK0xVQV9BUEkgaW50IGx1YV9zZXRob29rIChsdWFfU3RhdGUgKkwsIGx1YV9Ib29rIGZ1bmMsIGludCBtYXNrLCBpbnQgY291bnQpIHsKKyAgaWYgKGZ1bmMgPT0gTlVMTCB8fCBtYXNrID09IDApIHsgIC8qIHR1cm4gb2ZmIGhvb2tzPyAqLworICAgIG1hc2sgPSAwOworICAgIGZ1bmMgPSBOVUxMOworICB9CisgIGlmIChpc0x1YShMLT5jaSkpCisgICAgTC0+b2xkcGMgPSBMLT5jaS0+dS5sLnNhdmVkcGM7CisgIEwtPmhvb2sgPSBmdW5jOworICBMLT5iYXNlaG9va2NvdW50ID0gY291bnQ7CisgIHJlc2V0aG9va2NvdW50KEwpOworICBMLT5ob29rbWFzayA9IGNhc3RfYnl0ZShtYXNrKTsKKyAgcmV0dXJuIDE7Cit9CisKKworTFVBX0FQSSBsdWFfSG9vayBsdWFfZ2V0aG9vayAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBMLT5ob29rOworfQorCisKK0xVQV9BUEkgaW50IGx1YV9nZXRob29rbWFzayAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBMLT5ob29rbWFzazsKK30KKworCitMVUFfQVBJIGludCBsdWFfZ2V0aG9va2NvdW50IChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIEwtPmJhc2Vob29rY291bnQ7Cit9CisKKworTFVBX0FQSSBpbnQgbHVhX2dldHN0YWNrIChsdWFfU3RhdGUgKkwsIGludCBsZXZlbCwgbHVhX0RlYnVnICphcikgeworICBpbnQgc3RhdHVzOworICBDYWxsSW5mbyAqY2k7CisgIGlmIChsZXZlbCA8IDApIHJldHVybiAwOyAgLyogaW52YWxpZCAobmVnYXRpdmUpIGxldmVsICovCisgIGx1YV9sb2NrKEwpOworICBmb3IgKGNpID0gTC0+Y2k7IGxldmVsID4gMCAmJiBjaSAhPSAmTC0+YmFzZV9jaTsgY2kgPSBjaS0+cHJldmlvdXMpCisgICAgbGV2ZWwtLTsKKyAgaWYgKGxldmVsID09IDAgJiYgY2kgIT0gJkwtPmJhc2VfY2kpIHsgIC8qIGxldmVsIGZvdW5kPyAqLworICAgIHN0YXR1cyA9IDE7CisgICAgYXItPmlfY2kgPSBjaTsKKyAgfQorICBlbHNlIHN0YXR1cyA9IDA7ICAvKiBubyBzdWNoIGxldmVsICovCisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnVwdmFsbmFtZSAoUHJvdG8gKnAsIGludCB1dikgeworICBUU3RyaW5nICpzID0gY2hlY2tfZXhwKHV2IDwgcC0+c2l6ZXVwdmFsdWVzLCBwLT51cHZhbHVlc1t1dl0ubmFtZSk7CisgIGlmIChzID09IE5VTEwpIHJldHVybiAiPyI7CisgIGVsc2UgcmV0dXJuIGdldHN0cihzKTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqZmluZHZhcmFyZyAoQ2FsbEluZm8gKmNpLCBpbnQgbiwgU3RrSWQgKnBvcykgeworICBpbnQgbnBhcmFtcyA9IGNsTHZhbHVlKGNpLT5mdW5jKS0+cC0+bnVtcGFyYW1zOworICBpZiAobiA+PSBjaS0+dS5sLmJhc2UgLSBjaS0+ZnVuYyAtIG5wYXJhbXMpCisgICAgcmV0dXJuIE5VTEw7ICAvKiBubyBzdWNoIHZhcmFyZyAqLworICBlbHNlIHsKKyAgICAqcG9zID0gY2ktPmZ1bmMgKyBucGFyYW1zICsgbjsKKyAgICByZXR1cm4gIigqdmFyYXJnKSI7ICAvKiBnZW5lcmljIG5hbWUgZm9yIGFueSB2YXJhcmcgKi8KKyAgfQorfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kbG9jYWwgKGx1YV9TdGF0ZSAqTCwgQ2FsbEluZm8gKmNpLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0a0lkICpwb3MpIHsKKyAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgIFN0a0lkIGJhc2U7CisgIGlmIChpc0x1YShjaSkpIHsKKyAgICBpZiAobiA8IDApICAvKiBhY2Nlc3MgdG8gdmFyYXJnIHZhbHVlcz8gKi8KKyAgICAgIHJldHVybiBmaW5kdmFyYXJnKGNpLCAtbiwgcG9zKTsKKyAgICBlbHNlIHsKKyAgICAgIGJhc2UgPSBjaS0+dS5sLmJhc2U7CisgICAgICBuYW1lID0gbHVhRl9nZXRsb2NhbG5hbWUoY2lfZnVuYyhjaSktPnAsIG4sIGN1cnJlbnRwYyhjaSkpOworICAgIH0KKyAgfQorICBlbHNlCisgICAgYmFzZSA9IGNpLT5mdW5jICsgMTsKKyAgaWYgKG5hbWUgPT0gTlVMTCkgeyAgLyogbm8gJ3N0YW5kYXJkJyBuYW1lPyAqLworICAgIFN0a0lkIGxpbWl0ID0gKGNpID09IEwtPmNpKSA/IEwtPnRvcCA6IGNpLT5uZXh0LT5mdW5jOworICAgIGlmIChsaW1pdCAtIGJhc2UgPj0gbiAmJiBuID4gMCkgIC8qIGlzICduJyBpbnNpZGUgJ2NpJyBzdGFjaz8gKi8KKyAgICAgIG5hbWUgPSAiKCp0ZW1wb3JhcnkpIjsgIC8qIGdlbmVyaWMgbmFtZSBmb3IgYW55IHZhbGlkIHNsb3QgKi8KKyAgICBlbHNlCisgICAgICByZXR1cm4gTlVMTDsgIC8qIG5vIG5hbWUgKi8KKyAgfQorICAqcG9zID0gYmFzZSArIChuIC0gMSk7CisgIHJldHVybiBuYW1lOworfQorCisKK0xVQV9BUEkgY29uc3QgY2hhciAqbHVhX2dldGxvY2FsIChsdWFfU3RhdGUgKkwsIGNvbnN0IGx1YV9EZWJ1ZyAqYXIsIGludCBuKSB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx1YV9sb2NrKEwpOworICBpZiAoYXIgPT0gTlVMTCkgeyAgLyogaW5mb3JtYXRpb24gYWJvdXQgbm9uLWFjdGl2ZSBmdW5jdGlvbj8gKi8KKyAgICBpZiAoIWlzTGZ1bmN0aW9uKEwtPnRvcCAtIDEpKSAgLyogbm90IGEgTHVhIGZ1bmN0aW9uPyAqLworICAgICAgbmFtZSA9IE5VTEw7CisgICAgZWxzZSAgLyogY29uc2lkZXIgbGl2ZSB2YXJpYWJsZXMgYXQgZnVuY3Rpb24gc3RhcnQgKHBhcmFtZXRlcnMpICovCisgICAgICBuYW1lID0gbHVhRl9nZXRsb2NhbG5hbWUoY2xMdmFsdWUoTC0+dG9wIC0gMSktPnAsIG4sIDApOworICB9CisgIGVsc2UgeyAgLyogYWN0aXZlIGZ1bmN0aW9uOyBnZXQgaW5mb3JtYXRpb24gdGhyb3VnaCAnYXInICovCisgICAgU3RrSWQgcG9zID0gMDsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgICAgbmFtZSA9IGZpbmRsb2NhbChMLCBhci0+aV9jaSwgbiwgJnBvcyk7CisgICAgaWYgKG5hbWUpIHsKKyAgICAgIHNldG9iajJzKEwsIEwtPnRvcCwgcG9zKTsKKyAgICAgIGFwaV9pbmNyX3RvcChMKTsKKyAgICB9CisgIH0KKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKKworTFVBX0FQSSBjb25zdCBjaGFyICpsdWFfc2V0bG9jYWwgKGx1YV9TdGF0ZSAqTCwgY29uc3QgbHVhX0RlYnVnICphciwgaW50IG4pIHsKKyAgU3RrSWQgcG9zID0gMDsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgIGNvbnN0IGNoYXIgKm5hbWUgPSBmaW5kbG9jYWwoTCwgYXItPmlfY2ksIG4sICZwb3MpOworICBsdWFfbG9jayhMKTsKKyAgaWYgKG5hbWUpCisgICAgc2V0b2JqczJzKEwsIHBvcywgTC0+dG9wIC0gMSk7CisgIEwtPnRvcC0tOyAgLyogcG9wIHZhbHVlICovCisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiBuYW1lOworfQorCisKK3N0YXRpYyB2b2lkIGZ1bmNpbmZvIChsdWFfRGVidWcgKmFyLCBDbG9zdXJlICpjbCkgeworICBpZiAobm9MdWFDbG9zdXJlKGNsKSkgeworICAgIGFyLT5zb3VyY2UgPSAiPVtDXSI7CisgICAgYXItPmxpbmVkZWZpbmVkID0gLTE7CisgICAgYXItPmxhc3RsaW5lZGVmaW5lZCA9IC0xOworICAgIGFyLT53aGF0ID0gIkMiOworICB9CisgIGVsc2UgeworICAgIFByb3RvICpwID0gY2wtPmwucDsKKyAgICBhci0+c291cmNlID0gcC0+c291cmNlID8gZ2V0c3RyKHAtPnNvdXJjZSkgOiAiPT8iOworICAgIGFyLT5saW5lZGVmaW5lZCA9IHAtPmxpbmVkZWZpbmVkOworICAgIGFyLT5sYXN0bGluZWRlZmluZWQgPSBwLT5sYXN0bGluZWRlZmluZWQ7CisgICAgYXItPndoYXQgPSAoYXItPmxpbmVkZWZpbmVkID09IDApID8gIm1haW4iIDogIkx1YSI7CisgIH0KKyAgbHVhT19jaHVua2lkKGFyLT5zaG9ydF9zcmMsIGFyLT5zb3VyY2UsIExVQV9JRFNJWkUpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbGxlY3R2YWxpZGxpbmVzIChsdWFfU3RhdGUgKkwsIENsb3N1cmUgKmYpIHsKKyAgaWYgKG5vTHVhQ2xvc3VyZShmKSkgeworICAgIHNldG5pbHZhbHVlKEwtPnRvcCk7CisgICAgYXBpX2luY3JfdG9wKEwpOworICB9CisgIGVsc2UgeworICAgIGludCBpOworICAgIFRWYWx1ZSB2OworICAgIGludCAqbGluZWluZm8gPSBmLT5sLnAtPmxpbmVpbmZvOworICAgIFRhYmxlICp0ID0gbHVhSF9uZXcoTCk7ICAvKiBuZXcgdGFibGUgdG8gc3RvcmUgYWN0aXZlIGxpbmVzICovCisgICAgc2V0aHZhbHVlKEwsIEwtPnRvcCwgdCk7ICAvKiBwdXNoIGl0IG9uIHN0YWNrICovCisgICAgYXBpX2luY3JfdG9wKEwpOworICAgIHNldGJ2YWx1ZSgmdiwgMSk7ICAvKiBib29sZWFuICd0cnVlJyB0byBiZSB0aGUgdmFsdWUgb2YgYWxsIGluZGljZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZi0+bC5wLT5zaXplbGluZWluZm87IGkrKykgIC8qIGZvciBhbGwgbGluZXMgd2l0aCBjb2RlICovCisgICAgICBsdWFIX3NldGludChMLCB0LCBsaW5laW5mb1tpXSwgJnYpOyAgLyogdGFibGVbbGluZV0gPSB0cnVlICovCisgIH0KK30KKworCitzdGF0aWMgaW50IGF1eGdldGluZm8gKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqd2hhdCwgbHVhX0RlYnVnICphciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSAqZiwgQ2FsbEluZm8gKmNpKSB7CisgIGludCBzdGF0dXMgPSAxOworICBmb3IgKDsgKndoYXQ7IHdoYXQrKykgeworICAgIHN3aXRjaCAoKndoYXQpIHsKKyAgICAgIGNhc2UgJ1MnOiB7CisgICAgICAgIGZ1bmNpbmZvKGFyLCBmKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdsJzogeworICAgICAgICBhci0+Y3VycmVudGxpbmUgPSAoY2kgJiYgaXNMdWEoY2kpKSA/IGN1cnJlbnRsaW5lKGNpKSA6IC0xOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ3UnOiB7CisgICAgICAgIGFyLT5udXBzID0gKGYgPT0gTlVMTCkgPyAwIDogZi0+Yy5udXB2YWx1ZXM7CisgICAgICAgIGlmIChub0x1YUNsb3N1cmUoZikpIHsKKyAgICAgICAgICBhci0+aXN2YXJhcmcgPSAxOworICAgICAgICAgIGFyLT5ucGFyYW1zID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBhci0+aXN2YXJhcmcgPSBmLT5sLnAtPmlzX3ZhcmFyZzsKKyAgICAgICAgICBhci0+bnBhcmFtcyA9IGYtPmwucC0+bnVtcGFyYW1zOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAndCc6IHsKKyAgICAgICAgYXItPmlzdGFpbGNhbGwgPSAoY2kpID8gY2ktPmNhbGxzdGF0dXMgJiBDSVNUX1RBSUwgOiAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ24nOiB7CisgICAgICAgIC8qIGNhbGxpbmcgZnVuY3Rpb24gaXMgYSBrbm93biBMdWEgZnVuY3Rpb24/ICovCisgICAgICAgIGlmIChjaSAmJiAhKGNpLT5jYWxsc3RhdHVzICYgQ0lTVF9UQUlMKSAmJiBpc0x1YShjaS0+cHJldmlvdXMpKQorICAgICAgICAgIGFyLT5uYW1ld2hhdCA9IGdldGZ1bmNuYW1lKEwsIGNpLT5wcmV2aW91cywgJmFyLT5uYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFyLT5uYW1ld2hhdCA9IE5VTEw7CisgICAgICAgIGlmIChhci0+bmFtZXdoYXQgPT0gTlVMTCkgeworICAgICAgICAgIGFyLT5uYW1ld2hhdCA9ICIiOyAgLyogbm90IGZvdW5kICovCisgICAgICAgICAgYXItPm5hbWUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnTCc6CisgICAgICBjYXNlICdmJzogIC8qIGhhbmRsZWQgYnkgbHVhX2dldGluZm8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBzdGF0dXMgPSAwOyAgLyogaW52YWxpZCBvcHRpb24gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworCitMVUFfQVBJIGludCBsdWFfZ2V0aW5mbyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICp3aGF0LCBsdWFfRGVidWcgKmFyKSB7CisgIGludCBzdGF0dXM7CisgIENsb3N1cmUgKmNsOworICBDYWxsSW5mbyAqY2k7CisgIFN0a0lkIGZ1bmM7CisgIGx1YV9sb2NrKEwpOworICBpZiAoKndoYXQgPT0gJz4nKSB7CisgICAgY2kgPSBOVUxMOworICAgIGZ1bmMgPSBMLT50b3AgLSAxOworICAgIGFwaV9jaGVjayhMLCB0dGlzZnVuY3Rpb24oZnVuYyksICJmdW5jdGlvbiBleHBlY3RlZCIpOworICAgIHdoYXQrKzsgIC8qIHNraXAgdGhlICc+JyAqLworICAgIEwtPnRvcC0tOyAgLyogcG9wIGZ1bmN0aW9uICovCisgIH0KKyAgZWxzZSB7CisgICAgY2kgPSBhci0+aV9jaTsKKyAgICBmdW5jID0gY2ktPmZ1bmM7CisgICAgbHVhX2Fzc2VydCh0dGlzZnVuY3Rpb24oY2ktPmZ1bmMpKTsKKyAgfQorICBjbCA9IHR0aXNjbG9zdXJlKGZ1bmMpID8gY2x2YWx1ZShmdW5jKSA6IE5VTEw7CisgIHN0YXR1cyA9IGF1eGdldGluZm8oTCwgd2hhdCwgYXIsIGNsLCBjaSk7CisgIGlmIChzdHJjaHIod2hhdCwgJ2YnKSkgeworICAgIHNldG9ianMycyhMLCBMLT50b3AsIGZ1bmMpOworICAgIGFwaV9pbmNyX3RvcChMKTsKKyAgfQorICBpZiAoc3RyY2hyKHdoYXQsICdMJykpCisgICAgY29sbGVjdHZhbGlkbGluZXMoTCwgY2wpOworICBsdWFfdW5sb2NrKEwpOworICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBTeW1ib2xpYyBFeGVjdXRpb24KKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRvYmpuYW1lIChQcm90byAqcCwgaW50IGxhc3RwYywgaW50IHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmFtZSk7CisKKworLyoKKyoqIGZpbmQgYSAibmFtZSIgZm9yIHRoZSBSSyB2YWx1ZSAnYycKKyovCitzdGF0aWMgdm9pZCBrbmFtZSAoUHJvdG8gKnAsIGludCBwYywgaW50IGMsIGNvbnN0IGNoYXIgKipuYW1lKSB7CisgIGlmIChJU0soYykpIHsgIC8qIGlzICdjJyBhIGNvbnN0YW50PyAqLworICAgIFRWYWx1ZSAqa3ZhbHVlID0gJnAtPmtbSU5ERVhLKGMpXTsKKyAgICBpZiAodHRpc3N0cmluZyhrdmFsdWUpKSB7ICAvKiBsaXRlcmFsIGNvbnN0YW50PyAqLworICAgICAgKm5hbWUgPSBzdmFsdWUoa3ZhbHVlKTsgIC8qIGl0IGlzIGl0cyBvd24gbmFtZSAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBlbHNlIG5vIHJlYXNvbmFibGUgbmFtZSBmb3VuZCAqLworICB9CisgIGVsc2UgeyAgLyogJ2MnIGlzIGEgcmVnaXN0ZXIgKi8KKyAgICBjb25zdCBjaGFyICp3aGF0ID0gZ2V0b2JqbmFtZShwLCBwYywgYywgbmFtZSk7IC8qIHNlYXJjaCBmb3IgJ2MnICovCisgICAgaWYgKHdoYXQgJiYgKndoYXQgPT0gJ2MnKSB7ICAvKiBmb3VuZCBhIGNvbnN0YW50IG5hbWU/ICovCisgICAgICByZXR1cm47ICAvKiAnbmFtZScgYWxyZWFkeSBmaWxsZWQgKi8KKyAgICB9CisgICAgLyogZWxzZSBubyByZWFzb25hYmxlIG5hbWUgZm91bmQgKi8KKyAgfQorICAqbmFtZSA9ICI/IjsgIC8qIG5vIHJlYXNvbmFibGUgbmFtZSBmb3VuZCAqLworfQorCisKK3N0YXRpYyBpbnQgZmlsdGVycGMgKGludCBwYywgaW50IGptcHRhcmdldCkgeworICBpZiAocGMgPCBqbXB0YXJnZXQpICAvKiBpcyBjb2RlIGNvbmRpdGlvbmFsIChpbnNpZGUgYSBqdW1wKT8gKi8KKyAgICByZXR1cm4gLTE7ICAvKiBjYW5ub3Qga25vdyB3aG8gc2V0cyB0aGF0IHJlZ2lzdGVyICovCisgIGVsc2UgcmV0dXJuIHBjOyAgLyogY3VycmVudCBwb3NpdGlvbiBzZXRzIHRoYXQgcmVnaXN0ZXIgKi8KK30KKworCisvKgorKiogdHJ5IHRvIGZpbmQgbGFzdCBpbnN0cnVjdGlvbiBiZWZvcmUgJ2xhc3RwYycgdGhhdCBtb2RpZmllZCByZWdpc3RlciAncmVnJworKi8KK3N0YXRpYyBpbnQgZmluZHNldHJlZyAoUHJvdG8gKnAsIGludCBsYXN0cGMsIGludCByZWcpIHsKKyAgaW50IHBjOworICBpbnQgc2V0cmVnID0gLTE7ICAvKiBrZWVwIGxhc3QgaW5zdHJ1Y3Rpb24gdGhhdCBjaGFuZ2VkICdyZWcnICovCisgIGludCBqbXB0YXJnZXQgPSAwOyAgLyogYW55IGNvZGUgYmVmb3JlIHRoaXMgYWRkcmVzcyBpcyBjb25kaXRpb25hbCAqLworICBmb3IgKHBjID0gMDsgcGMgPCBsYXN0cGM7IHBjKyspIHsKKyAgICBJbnN0cnVjdGlvbiBpID0gcC0+Y29kZVtwY107CisgICAgT3BDb2RlIG9wID0gR0VUX09QQ09ERShpKTsKKyAgICBpbnQgYSA9IEdFVEFSR19BKGkpOworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgIGNhc2UgT1BfTE9BRE5JTDogeworICAgICAgICBpbnQgYiA9IEdFVEFSR19CKGkpOworICAgICAgICBpZiAoYSA8PSByZWcgJiYgcmVnIDw9IGEgKyBiKSAgLyogc2V0IHJlZ2lzdGVycyBmcm9tICdhJyB0byAnYStiJyAqLworICAgICAgICAgIHNldHJlZyA9IGZpbHRlcnBjKHBjLCBqbXB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfVEZPUkNBTEw6IHsKKyAgICAgICAgaWYgKHJlZyA+PSBhICsgMikgIC8qIGFmZmVjdCBhbGwgcmVncyBhYm92ZSBpdHMgYmFzZSAqLworICAgICAgICAgIHNldHJlZyA9IGZpbHRlcnBjKHBjLCBqbXB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfQ0FMTDoKKyAgICAgIGNhc2UgT1BfVEFJTENBTEw6IHsKKyAgICAgICAgaWYgKHJlZyA+PSBhKSAgLyogYWZmZWN0IGFsbCByZWdpc3RlcnMgYWJvdmUgYmFzZSAqLworICAgICAgICAgIHNldHJlZyA9IGZpbHRlcnBjKHBjLCBqbXB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfSk1QOiB7CisgICAgICAgIGludCBiID0gR0VUQVJHX3NCeChpKTsKKyAgICAgICAgaW50IGRlc3QgPSBwYyArIDEgKyBiOworICAgICAgICAvKiBqdW1wIGlzIGZvcndhcmQgYW5kIGRvIG5vdCBza2lwIGBsYXN0cGMnPyAqLworICAgICAgICBpZiAocGMgPCBkZXN0ICYmIGRlc3QgPD0gbGFzdHBjKSB7CisgICAgICAgICAgaWYgKGRlc3QgPiBqbXB0YXJnZXQpCisgICAgICAgICAgICBqbXB0YXJnZXQgPSBkZXN0OyAgLyogdXBkYXRlICdqbXB0YXJnZXQnICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIE9QX1RFU1Q6IHsKKyAgICAgICAgaWYgKHJlZyA9PSBhKSAgLyoganVtcGVkIGNvZGUgY2FuIGNoYW5nZSAnYScgKi8KKyAgICAgICAgICBzZXRyZWcgPSBmaWx0ZXJwYyhwYywgam1wdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAodGVzdEFNb2RlKG9wKSAmJiByZWcgPT0gYSkgIC8qIGFueSBpbnN0cnVjdGlvbiB0aGF0IHNldCBBICovCisgICAgICAgICAgc2V0cmVnID0gZmlsdGVycGMocGMsIGptcHRhcmdldCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc2V0cmVnOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRvYmpuYW1lIChQcm90byAqcCwgaW50IGxhc3RwYywgaW50IHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmFtZSkgeworICBpbnQgcGM7CisgICpuYW1lID0gbHVhRl9nZXRsb2NhbG5hbWUocCwgcmVnICsgMSwgbGFzdHBjKTsKKyAgaWYgKCpuYW1lKSAgLyogaXMgYSBsb2NhbD8gKi8KKyAgICByZXR1cm4gImxvY2FsIjsKKyAgLyogZWxzZSB0cnkgc3ltYm9saWMgZXhlY3V0aW9uICovCisgIHBjID0gZmluZHNldHJlZyhwLCBsYXN0cGMsIHJlZyk7CisgIGlmIChwYyAhPSAtMSkgeyAgLyogY291bGQgZmluZCBpbnN0cnVjdGlvbj8gKi8KKyAgICBJbnN0cnVjdGlvbiBpID0gcC0+Y29kZVtwY107CisgICAgT3BDb2RlIG9wID0gR0VUX09QQ09ERShpKTsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgICBjYXNlIE9QX01PVkU6IHsKKyAgICAgICAgaW50IGIgPSBHRVRBUkdfQihpKTsgIC8qIG1vdmUgZnJvbSAnYicgdG8gJ2EnICovCisgICAgICAgIGlmIChiIDwgR0VUQVJHX0EoaSkpCisgICAgICAgICAgcmV0dXJuIGdldG9iam5hbWUocCwgcGMsIGIsIG5hbWUpOyAgLyogZ2V0IG5hbWUgZm9yICdiJyAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgT1BfR0VUVEFCVVA6CisgICAgICBjYXNlIE9QX0dFVFRBQkxFOiB7CisgICAgICAgIGludCBrID0gR0VUQVJHX0MoaSk7ICAvKiBrZXkgaW5kZXggKi8KKyAgICAgICAgaW50IHQgPSBHRVRBUkdfQihpKTsgIC8qIHRhYmxlIGluZGV4ICovCisgICAgICAgIGNvbnN0IGNoYXIgKnZuID0gKG9wID09IE9QX0dFVFRBQkxFKSAgLyogbmFtZSBvZiBpbmRleGVkIHZhcmlhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBsdWFGX2dldGxvY2FsbmFtZShwLCB0ICsgMSwgcGMpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiB1cHZhbG5hbWUocCwgdCk7CisgICAgICAgIGtuYW1lKHAsIHBjLCBrLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuICh2biAmJiBzdHJjbXAodm4sIExVQV9FTlYpID09IDApID8gImdsb2JhbCIgOiAiZmllbGQiOworICAgICAgfQorICAgICAgY2FzZSBPUF9HRVRVUFZBTDogeworICAgICAgICAqbmFtZSA9IHVwdmFsbmFtZShwLCBHRVRBUkdfQihpKSk7CisgICAgICAgIHJldHVybiAidXB2YWx1ZSI7CisgICAgICB9CisgICAgICBjYXNlIE9QX0xPQURLOgorICAgICAgY2FzZSBPUF9MT0FES1g6IHsKKyAgICAgICAgaW50IGIgPSAob3AgPT0gT1BfTE9BREspID8gR0VUQVJHX0J4KGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdFVEFSR19BeChwLT5jb2RlW3BjICsgMV0pOworICAgICAgICBpZiAodHRpc3N0cmluZygmcC0+a1tiXSkpIHsKKyAgICAgICAgICAqbmFtZSA9IHN2YWx1ZSgmcC0+a1tiXSk7CisgICAgICAgICAgcmV0dXJuICJjb25zdGFudCI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIE9QX1NFTEY6IHsKKyAgICAgICAgaW50IGsgPSBHRVRBUkdfQyhpKTsgIC8qIGtleSBpbmRleCAqLworICAgICAgICBrbmFtZShwLCBwYywgaywgbmFtZSk7CisgICAgICAgIHJldHVybiAibWV0aG9kIjsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IGJyZWFrOyAgLyogZ28gdGhyb3VnaCB0byByZXR1cm4gTlVMTCAqLworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsgIC8qIGNvdWxkIG5vdCBmaW5kIHJlYXNvbmFibGUgbmFtZSAqLworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRmdW5jbmFtZSAobHVhX1N0YXRlICpMLCBDYWxsSW5mbyAqY2ksIGNvbnN0IGNoYXIgKipuYW1lKSB7CisgIFRNUyB0bTsKKyAgUHJvdG8gKnAgPSBjaV9mdW5jKGNpKS0+cDsgIC8qIGNhbGxpbmcgZnVuY3Rpb24gKi8KKyAgaW50IHBjID0gY3VycmVudHBjKGNpKTsgIC8qIGNhbGxpbmcgaW5zdHJ1Y3Rpb24gaW5kZXggKi8KKyAgSW5zdHJ1Y3Rpb24gaSA9IHAtPmNvZGVbcGNdOyAgLyogY2FsbGluZyBpbnN0cnVjdGlvbiAqLworICBzd2l0Y2ggKEdFVF9PUENPREUoaSkpIHsKKyAgICBjYXNlIE9QX0NBTEw6CisgICAgY2FzZSBPUF9UQUlMQ0FMTDogIC8qIGdldCBmdW5jdGlvbiBuYW1lICovCisgICAgICByZXR1cm4gZ2V0b2JqbmFtZShwLCBwYywgR0VUQVJHX0EoaSksIG5hbWUpOworICAgIGNhc2UgT1BfVEZPUkNBTEw6IHsgIC8qIGZvciBpdGVyYXRvciAqLworICAgICAgKm5hbWUgPSAiZm9yIGl0ZXJhdG9yIjsKKyAgICAgICByZXR1cm4gImZvciBpdGVyYXRvciI7CisgICAgfQorICAgIC8qIGFsbCBvdGhlciBpbnN0cnVjdGlvbnMgY2FuIGNhbGwgb25seSB0aHJvdWdoIG1ldGFtZXRob2RzICovCisgICAgY2FzZSBPUF9TRUxGOgorICAgIGNhc2UgT1BfR0VUVEFCVVA6CisgICAgY2FzZSBPUF9HRVRUQUJMRTogdG0gPSBUTV9JTkRFWDsgYnJlYWs7CisgICAgY2FzZSBPUF9TRVRUQUJVUDoKKyAgICBjYXNlIE9QX1NFVFRBQkxFOiB0bSA9IFRNX05FV0lOREVYOyBicmVhazsKKyAgICBjYXNlIE9QX0VROiB0bSA9IFRNX0VROyBicmVhazsKKyAgICBjYXNlIE9QX0FERDogdG0gPSBUTV9BREQ7IGJyZWFrOworICAgIGNhc2UgT1BfU1VCOiB0bSA9IFRNX1NVQjsgYnJlYWs7CisgICAgY2FzZSBPUF9NVUw6IHRtID0gVE1fTVVMOyBicmVhazsKKyAgICBjYXNlIE9QX0RJVjogdG0gPSBUTV9ESVY7IGJyZWFrOworICAgIGNhc2UgT1BfTU9EOiB0bSA9IFRNX01PRDsgYnJlYWs7CisgICAgY2FzZSBPUF9QT1c6IHRtID0gVE1fUE9XOyBicmVhazsKKyAgICBjYXNlIE9QX1VOTTogdG0gPSBUTV9VTk07IGJyZWFrOworICAgIGNhc2UgT1BfTEVOOiB0bSA9IFRNX0xFTjsgYnJlYWs7CisgICAgY2FzZSBPUF9MVDogdG0gPSBUTV9MVDsgYnJlYWs7CisgICAgY2FzZSBPUF9MRTogdG0gPSBUTV9MRTsgYnJlYWs7CisgICAgY2FzZSBPUF9DT05DQVQ6IHRtID0gVE1fQ09OQ0FUOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7ICAvKiBlbHNlIG5vIHVzZWZ1bCBuYW1lIGNhbiBiZSBmb3VuZCAqLworICB9CisgICpuYW1lID0gZ2V0c3RyKEcoTCktPnRtbmFtZVt0bV0pOworICByZXR1cm4gIm1ldGFtZXRob2QiOworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCisvKgorKiogb25seSBBTlNJIHdheSB0byBjaGVjayB3aGV0aGVyIGEgcG9pbnRlciBwb2ludHMgdG8gYW4gYXJyYXkKKyoqICh1c2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2VzLCBzbyBlZmZpY2llbmN5IGlzIG5vdCBhIGJpZyBjb25jZXJuKQorKi8KK3N0YXRpYyBpbnQgaXNpbnN0YWNrIChDYWxsSW5mbyAqY2ksIGNvbnN0IFRWYWx1ZSAqbykgeworICBTdGtJZCBwOworICBmb3IgKHAgPSBjaS0+dS5sLmJhc2U7IHAgPCBjaS0+dG9wOyBwKyspCisgICAgaWYgKG8gPT0gcCkgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXR1cHZhbG5hbWUgKENhbGxJbmZvICpjaSwgY29uc3QgVFZhbHVlICpvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5hbWUpIHsKKyAgTENsb3N1cmUgKmMgPSBjaV9mdW5jKGNpKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBjLT5udXB2YWx1ZXM7IGkrKykgeworICAgIGlmIChjLT51cHZhbHNbaV0tPnYgPT0gbykgeworICAgICAgKm5hbWUgPSB1cHZhbG5hbWUoYy0+cCwgaSk7CisgICAgICByZXR1cm4gInVwdmFsdWUiOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworCitsX25vcmV0IGx1YUdfdHlwZWVycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqbywgY29uc3QgY2hhciAqb3ApIHsKKyAgQ2FsbEluZm8gKmNpID0gTC0+Y2k7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICBjb25zdCBjaGFyICp0ID0gb2JqdHlwZW5hbWUobyk7CisgIGNvbnN0IGNoYXIgKmtpbmQgPSBOVUxMOworICBpZiAoaXNMdWEoY2kpKSB7CisgICAga2luZCA9IGdldHVwdmFsbmFtZShjaSwgbywgJm5hbWUpOyAgLyogY2hlY2sgd2hldGhlciAnbycgaXMgYW4gdXB2YWx1ZSAqLworICAgIGlmICgha2luZCAmJiBpc2luc3RhY2soY2ksIG8pKSAgLyogbm8/IHRyeSBhIHJlZ2lzdGVyICovCisgICAgICBraW5kID0gZ2V0b2JqbmFtZShjaV9mdW5jKGNpKS0+cCwgY3VycmVudHBjKGNpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfaW50KG8gLSBjaS0+dS5sLmJhc2UpLCAmbmFtZSk7CisgIH0KKyAgaWYgKGtpbmQpCisgICAgbHVhR19ydW5lcnJvcihMLCAiYXR0ZW1wdCB0byAlcyAlcyAiIExVQV9RUyAiIChhICVzIHZhbHVlKSIsCisgICAgICAgICAgICAgICAgb3AsIGtpbmQsIG5hbWUsIHQpOworICBlbHNlCisgICAgbHVhR19ydW5lcnJvcihMLCAiYXR0ZW1wdCB0byAlcyBhICVzIHZhbHVlIiwgb3AsIHQpOworfQorCisKK2xfbm9yZXQgbHVhR19jb25jYXRlcnJvciAobHVhX1N0YXRlICpMLCBTdGtJZCBwMSwgU3RrSWQgcDIpIHsKKyAgaWYgKHR0aXNzdHJpbmcocDEpIHx8IHR0aXNudW1iZXIocDEpKSBwMSA9IHAyOworICBsdWFfYXNzZXJ0KCF0dGlzc3RyaW5nKHAxKSAmJiAhdHRpc251bWJlcihwMSkpOworICBsdWFHX3R5cGVlcnJvcihMLCBwMSwgImNvbmNhdGVuYXRlIik7Cit9CisKKworbF9ub3JldCBsdWFHX2FyaXRoZXJyb3IgKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpwMSwgY29uc3QgVFZhbHVlICpwMikgeworICBUVmFsdWUgdGVtcDsKKyAgaWYgKGx1YVZfdG9udW1iZXIocDEsICZ0ZW1wKSA9PSBOVUxMKQorICAgIHAyID0gcDE7ICAvKiBmaXJzdCBvcGVyYW5kIGlzIHdyb25nICovCisgIGx1YUdfdHlwZWVycm9yKEwsIHAyLCAicGVyZm9ybSBhcml0aG1ldGljIG9uIik7Cit9CisKKworbF9ub3JldCBsdWFHX29yZGVyZXJyb3IgKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpwMSwgY29uc3QgVFZhbHVlICpwMikgeworICBjb25zdCBjaGFyICp0MSA9IG9ianR5cGVuYW1lKHAxKTsKKyAgY29uc3QgY2hhciAqdDIgPSBvYmp0eXBlbmFtZShwMik7CisgIGlmICh0MSA9PSB0MikKKyAgICBsdWFHX3J1bmVycm9yKEwsICJhdHRlbXB0IHRvIGNvbXBhcmUgdHdvICVzIHZhbHVlcyIsIHQxKTsKKyAgZWxzZQorICAgIGx1YUdfcnVuZXJyb3IoTCwgImF0dGVtcHQgdG8gY29tcGFyZSAlcyB3aXRoICVzIiwgdDEsIHQyKTsKK30KKworCitzdGF0aWMgdm9pZCBhZGRpbmZvIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm1zZykgeworICBDYWxsSW5mbyAqY2kgPSBMLT5jaTsKKyAgaWYgKGlzTHVhKGNpKSkgeyAgLyogaXMgTHVhIGNvZGU/ICovCisgICAgY2hhciBidWZmW0xVQV9JRFNJWkVdOyAgLyogYWRkIGZpbGU6bGluZSBpbmZvcm1hdGlvbiAqLworICAgIGludCBsaW5lID0gY3VycmVudGxpbmUoY2kpOworICAgIFRTdHJpbmcgKnNyYyA9IGNpX2Z1bmMoY2kpLT5wLT5zb3VyY2U7CisgICAgaWYgKHNyYykKKyAgICAgIGx1YU9fY2h1bmtpZChidWZmLCBnZXRzdHIoc3JjKSwgTFVBX0lEU0laRSk7CisgICAgZWxzZSB7ICAvKiBubyBzb3VyY2UgYXZhaWxhYmxlOyB1c2UgIj8iIGluc3RlYWQgKi8KKyAgICAgIGJ1ZmZbMF0gPSAnPyc7IGJ1ZmZbMV0gPSAnXDAnOworICAgIH0KKyAgICBsdWFPX3B1c2hmc3RyaW5nKEwsICIlczolZDogJXMiLCBidWZmLCBsaW5lLCBtc2cpOworICB9Cit9CisKKworbF9ub3JldCBsdWFHX2Vycm9ybXNnIChsdWFfU3RhdGUgKkwpIHsKKyAgaWYgKEwtPmVycmZ1bmMgIT0gMCkgeyAgLyogaXMgdGhlcmUgYW4gZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb24/ICovCisgICAgU3RrSWQgZXJyZnVuYyA9IHJlc3RvcmVzdGFjayhMLCBMLT5lcnJmdW5jKTsKKyAgICBpZiAoIXR0aXNmdW5jdGlvbihlcnJmdW5jKSkgbHVhRF90aHJvdyhMLCBMVUFfRVJSRVJSKTsKKyAgICBzZXRvYmpzMnMoTCwgTC0+dG9wLCBMLT50b3AgLSAxKTsgIC8qIG1vdmUgYXJndW1lbnQgKi8KKyAgICBzZXRvYmpzMnMoTCwgTC0+dG9wIC0gMSwgZXJyZnVuYyk7ICAvKiBwdXNoIGZ1bmN0aW9uICovCisgICAgTC0+dG9wKys7CisgICAgbHVhRF9jYWxsKEwsIEwtPnRvcCAtIDIsIDEsIDApOyAgLyogY2FsbCBpdCAqLworICB9CisgIGx1YURfdGhyb3coTCwgTFVBX0VSUlJVTik7Cit9CisKKworbF9ub3JldCBsdWFHX3J1bmVycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJncDsKKyAgdmFfc3RhcnQoYXJncCwgZm10KTsKKyAgYWRkaW5mbyhMLCBsdWFPX3B1c2h2ZnN0cmluZyhMLCBmbXQsIGFyZ3ApKTsKKyAgdmFfZW5kKGFyZ3ApOworICBsdWFHX2Vycm9ybXNnKEwpOworfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xkZWJ1Zy5oIGIvY29tMzIvbHVhL3NyYy9sZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDQ1Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sZGVidWcuaApAQCAtMCwwICsxLDM0IEBACisvKgorKiogJElkOiBsZGVidWcuaCx2IDIuNy4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBBdXhpbGlhcnkgZnVuY3Rpb25zIGZyb20gRGVidWcgSW50ZXJmYWNlIG1vZHVsZQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbGRlYnVnX2gKKyNkZWZpbmUgbGRlYnVnX2gKKworCisjaW5jbHVkZSAibHN0YXRlLmgiCisKKworI2RlZmluZSBwY1JlbChwYywgcCkJKGNhc3QoaW50LCAocGMpIC0gKHApLT5jb2RlKSAtIDEpCisKKyNkZWZpbmUgZ2V0ZnVuY2xpbmUoZixwYykJKCgoZiktPmxpbmVpbmZvKSA/IChmKS0+bGluZWluZm9bcGNdIDogMCkKKworI2RlZmluZSByZXNldGhvb2tjb3VudChMKQkoTC0+aG9va2NvdW50ID0gTC0+YmFzZWhvb2tjb3VudCkKKworLyogQWN0aXZlIEx1YSBmdW5jdGlvbiAoZ2l2ZW4gY2FsbCBpbmZvKSAqLworI2RlZmluZSBjaV9mdW5jKGNpKQkJKGNsTHZhbHVlKChjaSktPmZ1bmMpKQorCisKK0xVQUlfRlVOQyBsX25vcmV0IGx1YUdfdHlwZWVycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wbmFtZSk7CitMVUFJX0ZVTkMgbF9ub3JldCBsdWFHX2NvbmNhdGVycm9yIChsdWFfU3RhdGUgKkwsIFN0a0lkIHAxLCBTdGtJZCBwMik7CitMVUFJX0ZVTkMgbF9ub3JldCBsdWFHX2FyaXRoZXJyb3IgKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVmFsdWUgKnAyKTsKK0xVQUlfRlVOQyBsX25vcmV0IGx1YUdfb3JkZXJlcnJvciAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKnAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRWYWx1ZSAqcDIpOworTFVBSV9GVU5DIGxfbm9yZXQgbHVhR19ydW5lcnJvciAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitMVUFJX0ZVTkMgbF9ub3JldCBsdWFHX2Vycm9ybXNnIChsdWFfU3RhdGUgKkwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGRvLmMgYi9jb20zMi9sdWEvc3JjL2xkby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZGQ1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xkby5jCkBAIC0wLDAgKzEsNjgxIEBACisvKgorKiogJElkOiBsZG8uYyx2IDIuMTA4LjEuMyAyMDEzLzExLzA4IDE4OjIyOjUwIHJvYmVydG8gRXhwICQKKyoqIFN0YWNrIGFuZCBDYWxsIHN0cnVjdHVyZSBvZiBMdWEKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsZG9fYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXBpLmgiCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGZ1bmMuaCIKKyNpbmNsdWRlICJsZ2MuaCIKKyNpbmNsdWRlICJsbWVtLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxvcGNvZGVzLmgiCisjaW5jbHVkZSAibHBhcnNlci5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorI2luY2x1ZGUgImxzdHJpbmcuaCIKKyNpbmNsdWRlICJsdGFibGUuaCIKKyNpbmNsdWRlICJsdG0uaCIKKyNpbmNsdWRlICJsdW5kdW1wLmgiCisjaW5jbHVkZSAibHZtLmgiCisjaW5jbHVkZSAibHppby5oIgorCisKKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogRXJyb3ItcmVjb3ZlcnkgZnVuY3Rpb25zCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorKiogTFVBSV9USFJPVy9MVUFJX1RSWSBkZWZpbmUgaG93IEx1YSBkb2VzIGV4Y2VwdGlvbiBoYW5kbGluZy4gQnkKKyoqIGRlZmF1bHQsIEx1YSBoYW5kbGVzIGVycm9ycyB3aXRoIGV4Y2VwdGlvbnMgd2hlbiBjb21waWxpbmcgYXMKKyoqIEMrKyBjb2RlLCB3aXRoIF9sb25nam1wL19zZXRqbXAgd2hlbiBhc2tlZCB0byB1c2UgdGhlbSwgYW5kIHdpdGgKKyoqIGxvbmdqbXAvc2V0am1wIG90aGVyd2lzZS4KKyovCisjaWYgIWRlZmluZWQoTFVBSV9USFJPVykKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKExVQV9VU0VfTE9OR0pNUCkKKy8qIEMrKyBleGNlcHRpb25zICovCisjZGVmaW5lIExVQUlfVEhST1coTCxjKQkJdGhyb3coYykKKyNkZWZpbmUgTFVBSV9UUlkoTCxjLGEpIFwKKwl0cnkgeyBhIH0gY2F0Y2goLi4uKSB7IGlmICgoYyktPnN0YXR1cyA9PSAwKSAoYyktPnN0YXR1cyA9IC0xOyB9CisjZGVmaW5lIGx1YWlfam1wYnVmCQlpbnQgIC8qIGR1bW15IHZhcmlhYmxlICovCisKKyNlbGlmIGRlZmluZWQoTFVBX1VTRV9VTE9OR0pNUCkKKy8qIGluIFVuaXgsIHRyeSBfbG9uZ2ptcC9fc2V0am1wIChtb3JlIGVmZmljaWVudCkgKi8KKyNkZWZpbmUgTFVBSV9USFJPVyhMLGMpCQlfbG9uZ2ptcCgoYyktPmIsIDEpCisjZGVmaW5lIExVQUlfVFJZKEwsYyxhKQkJaWYgKF9zZXRqbXAoKGMpLT5iKSA9PSAwKSB7IGEgfQorI2RlZmluZSBsdWFpX2ptcGJ1ZgkJam1wX2J1ZgorCisjZWxzZQorLyogZGVmYXVsdCBoYW5kbGluZyB3aXRoIGxvbmcganVtcHMgKi8KKyNkZWZpbmUgTFVBSV9USFJPVyhMLGMpCQlsb25nam1wKChjKS0+YiwgMSkKKyNkZWZpbmUgTFVBSV9UUlkoTCxjLGEpCQlpZiAoc2V0am1wKChjKS0+YikgPT0gMCkgeyBhIH0KKyNkZWZpbmUgbHVhaV9qbXBidWYJCWptcF9idWYKKworI2VuZGlmCisKKyNlbmRpZgorCisKKworLyogY2hhaW4gbGlzdCBvZiBsb25nIGp1bXAgYnVmZmVycyAqLworc3RydWN0IGx1YV9sb25nam1wIHsKKyAgc3RydWN0IGx1YV9sb25nam1wICpwcmV2aW91czsKKyAgbHVhaV9qbXBidWYgYjsKKyAgdm9sYXRpbGUgaW50IHN0YXR1czsgIC8qIGVycm9yIGNvZGUgKi8KK307CisKKworc3RhdGljIHZvaWQgc2V0ZXJyb3JvYmogKGx1YV9TdGF0ZSAqTCwgaW50IGVycmNvZGUsIFN0a0lkIG9sZHRvcCkgeworICBzd2l0Y2ggKGVycmNvZGUpIHsKKyAgICBjYXNlIExVQV9FUlJNRU06IHsgIC8qIG1lbW9yeSBlcnJvcj8gKi8KKyAgICAgIHNldHN2YWx1ZTJzKEwsIG9sZHRvcCwgRyhMKS0+bWVtZXJybXNnKTsgLyogcmV1c2UgcHJlcmVnaXN0ZXJlZCBtc2cuICovCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfRVJSRVJSOiB7CisgICAgICBzZXRzdmFsdWUycyhMLCBvbGR0b3AsIGx1YVNfbmV3bGl0ZXJhbChMLCAiZXJyb3IgaW4gZXJyb3IgaGFuZGxpbmciKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgc2V0b2JqczJzKEwsIG9sZHRvcCwgTC0+dG9wIC0gMSk7ICAvKiBlcnJvciBtZXNzYWdlIG9uIGN1cnJlbnQgdG9wICovCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgTC0+dG9wID0gb2xkdG9wICsgMTsKK30KKworCitsX25vcmV0IGx1YURfdGhyb3cgKGx1YV9TdGF0ZSAqTCwgaW50IGVycmNvZGUpIHsKKyAgaWYgKEwtPmVycm9ySm1wKSB7ICAvKiB0aHJlYWQgaGFzIGFuIGVycm9yIGhhbmRsZXI/ICovCisgICAgTC0+ZXJyb3JKbXAtPnN0YXR1cyA9IGVycmNvZGU7ICAvKiBzZXQgc3RhdHVzICovCisgICAgTFVBSV9USFJPVyhMLCBMLT5lcnJvckptcCk7ICAvKiBqdW1wIHRvIGl0ICovCisgIH0KKyAgZWxzZSB7ICAvKiB0aHJlYWQgaGFzIG5vIGVycm9yIGhhbmRsZXIgKi8KKyAgICBMLT5zdGF0dXMgPSBjYXN0X2J5dGUoZXJyY29kZSk7ICAvKiBtYXJrIGl0IGFzIGRlYWQgKi8KKyAgICBpZiAoRyhMKS0+bWFpbnRocmVhZC0+ZXJyb3JKbXApIHsgIC8qIG1haW4gdGhyZWFkIGhhcyBhIGhhbmRsZXI/ICovCisgICAgICBzZXRvYmpzMnMoTCwgRyhMKS0+bWFpbnRocmVhZC0+dG9wKyssIEwtPnRvcCAtIDEpOyAgLyogY29weSBlcnJvciBvYmouICovCisgICAgICBsdWFEX3Rocm93KEcoTCktPm1haW50aHJlYWQsIGVycmNvZGUpOyAgLyogcmUtdGhyb3cgaW4gbWFpbiB0aHJlYWQgKi8KKyAgICB9CisgICAgZWxzZSB7ICAvKiBubyBoYW5kbGVyIGF0IGFsbDsgYWJvcnQgKi8KKyAgICAgIGlmIChHKEwpLT5wYW5pYykgeyAgLyogcGFuaWMgZnVuY3Rpb24/ICovCisgICAgICAgIGx1YV91bmxvY2soTCk7CisgICAgICAgIEcoTCktPnBhbmljKEwpOyAgLyogY2FsbCBpdCAobGFzdCBjaGFuY2UgdG8ganVtcCBvdXQpICovCisgICAgICB9CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgfQorfQorCisKK2ludCBsdWFEX3Jhd3J1bnByb3RlY3RlZCAobHVhX1N0YXRlICpMLCBQZnVuYyBmLCB2b2lkICp1ZCkgeworICB1bnNpZ25lZCBzaG9ydCBvbGRuQ2NhbGxzID0gTC0+bkNjYWxsczsKKyAgc3RydWN0IGx1YV9sb25nam1wIGxqOworICBsai5zdGF0dXMgPSBMVUFfT0s7CisgIGxqLnByZXZpb3VzID0gTC0+ZXJyb3JKbXA7ICAvKiBjaGFpbiBuZXcgZXJyb3IgaGFuZGxlciAqLworICBMLT5lcnJvckptcCA9ICZsajsKKyAgTFVBSV9UUlkoTCwgJmxqLAorICAgICgqZikoTCwgdWQpOworICApOworICBMLT5lcnJvckptcCA9IGxqLnByZXZpb3VzOyAgLyogcmVzdG9yZSBvbGQgZXJyb3IgaGFuZGxlciAqLworICBMLT5uQ2NhbGxzID0gb2xkbkNjYWxsczsKKyAgcmV0dXJuIGxqLnN0YXR1czsKK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKK3N0YXRpYyB2b2lkIGNvcnJlY3RzdGFjayAobHVhX1N0YXRlICpMLCBUVmFsdWUgKm9sZHN0YWNrKSB7CisgIENhbGxJbmZvICpjaTsKKyAgR0NPYmplY3QgKnVwOworICBMLT50b3AgPSAoTC0+dG9wIC0gb2xkc3RhY2spICsgTC0+c3RhY2s7CisgIGZvciAodXAgPSBMLT5vcGVudXB2YWw7IHVwICE9IE5VTEw7IHVwID0gdXAtPmdjaC5uZXh0KQorICAgIGdjbzJ1dih1cCktPnYgPSAoZ2NvMnV2KHVwKS0+diAtIG9sZHN0YWNrKSArIEwtPnN0YWNrOworICBmb3IgKGNpID0gTC0+Y2k7IGNpICE9IE5VTEw7IGNpID0gY2ktPnByZXZpb3VzKSB7CisgICAgY2ktPnRvcCA9IChjaS0+dG9wIC0gb2xkc3RhY2spICsgTC0+c3RhY2s7CisgICAgY2ktPmZ1bmMgPSAoY2ktPmZ1bmMgLSBvbGRzdGFjaykgKyBMLT5zdGFjazsKKyAgICBpZiAoaXNMdWEoY2kpKQorICAgICAgY2ktPnUubC5iYXNlID0gKGNpLT51LmwuYmFzZSAtIG9sZHN0YWNrKSArIEwtPnN0YWNrOworICB9Cit9CisKKworLyogc29tZSBzcGFjZSBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKyNkZWZpbmUgRVJST1JTVEFDS1NJWkUJKExVQUlfTUFYU1RBQ0sgKyAyMDApCisKKwordm9pZCBsdWFEX3JlYWxsb2NzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgbmV3c2l6ZSkgeworICBUVmFsdWUgKm9sZHN0YWNrID0gTC0+c3RhY2s7CisgIGludCBsaW0gPSBMLT5zdGFja3NpemU7CisgIGx1YV9hc3NlcnQobmV3c2l6ZSA8PSBMVUFJX01BWFNUQUNLIHx8IG5ld3NpemUgPT0gRVJST1JTVEFDS1NJWkUpOworICBsdWFfYXNzZXJ0KEwtPnN0YWNrX2xhc3QgLSBMLT5zdGFjayA9PSBMLT5zdGFja3NpemUgLSBFWFRSQV9TVEFDSyk7CisgIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCBMLT5zdGFjaywgTC0+c3RhY2tzaXplLCBuZXdzaXplLCBUVmFsdWUpOworICBmb3IgKDsgbGltIDwgbmV3c2l6ZTsgbGltKyspCisgICAgc2V0bmlsdmFsdWUoTC0+c3RhY2sgKyBsaW0pOyAvKiBlcmFzZSBuZXcgc2VnbWVudCAqLworICBMLT5zdGFja3NpemUgPSBuZXdzaXplOworICBMLT5zdGFja19sYXN0ID0gTC0+c3RhY2sgKyBuZXdzaXplIC0gRVhUUkFfU1RBQ0s7CisgIGNvcnJlY3RzdGFjayhMLCBvbGRzdGFjayk7Cit9CisKKwordm9pZCBsdWFEX2dyb3dzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgbikgeworICBpbnQgc2l6ZSA9IEwtPnN0YWNrc2l6ZTsKKyAgaWYgKHNpemUgPiBMVUFJX01BWFNUQUNLKSAgLyogZXJyb3IgYWZ0ZXIgZXh0cmEgc2l6ZT8gKi8KKyAgICBsdWFEX3Rocm93KEwsIExVQV9FUlJFUlIpOworICBlbHNlIHsKKyAgICBpbnQgbmVlZGVkID0gY2FzdF9pbnQoTC0+dG9wIC0gTC0+c3RhY2spICsgbiArIEVYVFJBX1NUQUNLOworICAgIGludCBuZXdzaXplID0gMiAqIHNpemU7CisgICAgaWYgKG5ld3NpemUgPiBMVUFJX01BWFNUQUNLKSBuZXdzaXplID0gTFVBSV9NQVhTVEFDSzsKKyAgICBpZiAobmV3c2l6ZSA8IG5lZWRlZCkgbmV3c2l6ZSA9IG5lZWRlZDsKKyAgICBpZiAobmV3c2l6ZSA+IExVQUlfTUFYU1RBQ0spIHsgIC8qIHN0YWNrIG92ZXJmbG93PyAqLworICAgICAgbHVhRF9yZWFsbG9jc3RhY2soTCwgRVJST1JTVEFDS1NJWkUpOworICAgICAgbHVhR19ydW5lcnJvcihMLCAic3RhY2sgb3ZlcmZsb3ciKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgbHVhRF9yZWFsbG9jc3RhY2soTCwgbmV3c2l6ZSk7CisgIH0KK30KKworCitzdGF0aWMgaW50IHN0YWNraW51c2UgKGx1YV9TdGF0ZSAqTCkgeworICBDYWxsSW5mbyAqY2k7CisgIFN0a0lkIGxpbSA9IEwtPnRvcDsKKyAgZm9yIChjaSA9IEwtPmNpOyBjaSAhPSBOVUxMOyBjaSA9IGNpLT5wcmV2aW91cykgeworICAgIGx1YV9hc3NlcnQoY2ktPnRvcCA8PSBMLT5zdGFja19sYXN0KTsKKyAgICBpZiAobGltIDwgY2ktPnRvcCkgbGltID0gY2ktPnRvcDsKKyAgfQorICByZXR1cm4gY2FzdF9pbnQobGltIC0gTC0+c3RhY2spICsgMTsgIC8qIHBhcnQgb2Ygc3RhY2sgaW4gdXNlICovCit9CisKKwordm9pZCBsdWFEX3Nocmlua3N0YWNrIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGludXNlID0gc3RhY2tpbnVzZShMKTsKKyAgaW50IGdvb2RzaXplID0gaW51c2UgKyAoaW51c2UgLyA4KSArIDIqRVhUUkFfU1RBQ0s7CisgIGlmIChnb29kc2l6ZSA+IExVQUlfTUFYU1RBQ0spIGdvb2RzaXplID0gTFVBSV9NQVhTVEFDSzsKKyAgaWYgKGludXNlID4gTFVBSV9NQVhTVEFDSyB8fCAgLyogaGFuZGxpbmcgc3RhY2sgb3ZlcmZsb3c/ICovCisgICAgICBnb29kc2l6ZSA+PSBMLT5zdGFja3NpemUpICAvKiB3b3VsZCBncm93IGluc3RlYWQgb2Ygc2hyaW5rPyAqLworICAgIGNvbmRtb3Zlc3RhY2soTCk7ICAvKiBkb24ndCBjaGFuZ2Ugc3RhY2sgKGNoYW5nZSBvbmx5IGZvciBkZWJ1Z2dpbmcpICovCisgIGVsc2UKKyAgICBsdWFEX3JlYWxsb2NzdGFjayhMLCBnb29kc2l6ZSk7ICAvKiBzaHJpbmsgaXQgKi8KK30KKworCit2b2lkIGx1YURfaG9vayAobHVhX1N0YXRlICpMLCBpbnQgZXZlbnQsIGludCBsaW5lKSB7CisgIGx1YV9Ib29rIGhvb2sgPSBMLT5ob29rOworICBpZiAoaG9vayAmJiBMLT5hbGxvd2hvb2spIHsKKyAgICBDYWxsSW5mbyAqY2kgPSBMLT5jaTsKKyAgICBwdHJkaWZmX3QgdG9wID0gc2F2ZXN0YWNrKEwsIEwtPnRvcCk7CisgICAgcHRyZGlmZl90IGNpX3RvcCA9IHNhdmVzdGFjayhMLCBjaS0+dG9wKTsKKyAgICBsdWFfRGVidWcgYXI7CisgICAgYXIuZXZlbnQgPSBldmVudDsKKyAgICBhci5jdXJyZW50bGluZSA9IGxpbmU7CisgICAgYXIuaV9jaSA9IGNpOworICAgIGx1YURfY2hlY2tzdGFjayhMLCBMVUFfTUlOU1RBQ0spOyAgLyogZW5zdXJlIG1pbmltdW0gc3RhY2sgc2l6ZSAqLworICAgIGNpLT50b3AgPSBMLT50b3AgKyBMVUFfTUlOU1RBQ0s7CisgICAgbHVhX2Fzc2VydChjaS0+dG9wIDw9IEwtPnN0YWNrX2xhc3QpOworICAgIEwtPmFsbG93aG9vayA9IDA7ICAvKiBjYW5ub3QgY2FsbCBob29rcyBpbnNpZGUgYSBob29rICovCisgICAgY2ktPmNhbGxzdGF0dXMgfD0gQ0lTVF9IT09LRUQ7CisgICAgbHVhX3VubG9jayhMKTsKKyAgICAoKmhvb2spKEwsICZhcik7CisgICAgbHVhX2xvY2soTCk7CisgICAgbHVhX2Fzc2VydCghTC0+YWxsb3dob29rKTsKKyAgICBMLT5hbGxvd2hvb2sgPSAxOworICAgIGNpLT50b3AgPSByZXN0b3Jlc3RhY2soTCwgY2lfdG9wKTsKKyAgICBMLT50b3AgPSByZXN0b3Jlc3RhY2soTCwgdG9wKTsKKyAgICBjaS0+Y2FsbHN0YXR1cyAmPSB+Q0lTVF9IT09LRUQ7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBjYWxsaG9vayAobHVhX1N0YXRlICpMLCBDYWxsSW5mbyAqY2kpIHsKKyAgaW50IGhvb2sgPSBMVUFfSE9PS0NBTEw7CisgIGNpLT51Lmwuc2F2ZWRwYysrOyAgLyogaG9va3MgYXNzdW1lICdwYycgaXMgYWxyZWFkeSBpbmNyZW1lbnRlZCAqLworICBpZiAoaXNMdWEoY2ktPnByZXZpb3VzKSAmJgorICAgICAgR0VUX09QQ09ERSgqKGNpLT5wcmV2aW91cy0+dS5sLnNhdmVkcGMgLSAxKSkgPT0gT1BfVEFJTENBTEwpIHsKKyAgICBjaS0+Y2FsbHN0YXR1cyB8PSBDSVNUX1RBSUw7CisgICAgaG9vayA9IExVQV9IT09LVEFJTENBTEw7CisgIH0KKyAgbHVhRF9ob29rKEwsIGhvb2ssIC0xKTsKKyAgY2ktPnUubC5zYXZlZHBjLS07ICAvKiBjb3JyZWN0ICdwYycgKi8KK30KKworCitzdGF0aWMgU3RrSWQgYWRqdXN0X3ZhcmFyZ3MgKGx1YV9TdGF0ZSAqTCwgUHJvdG8gKnAsIGludCBhY3R1YWwpIHsKKyAgaW50IGk7CisgIGludCBuZml4YXJncyA9IHAtPm51bXBhcmFtczsKKyAgU3RrSWQgYmFzZSwgZml4ZWQ7CisgIGx1YV9hc3NlcnQoYWN0dWFsID49IG5maXhhcmdzKTsKKyAgLyogbW92ZSBmaXhlZCBwYXJhbWV0ZXJzIHRvIGZpbmFsIHBvc2l0aW9uICovCisgIGx1YURfY2hlY2tzdGFjayhMLCBwLT5tYXhzdGFja3NpemUpOyAgLyogY2hlY2sgYWdhaW4gZm9yIG5ldyAnYmFzZScgKi8KKyAgZml4ZWQgPSBMLT50b3AgLSBhY3R1YWw7ICAvKiBmaXJzdCBmaXhlZCBhcmd1bWVudCAqLworICBiYXNlID0gTC0+dG9wOyAgLyogZmluYWwgcG9zaXRpb24gb2YgZmlyc3QgYXJndW1lbnQgKi8KKyAgZm9yIChpPTA7IGk8bmZpeGFyZ3M7IGkrKykgeworICAgIHNldG9ianMycyhMLCBMLT50b3ArKywgZml4ZWQgKyBpKTsKKyAgICBzZXRuaWx2YWx1ZShmaXhlZCArIGkpOworICB9CisgIHJldHVybiBiYXNlOworfQorCisKK3N0YXRpYyBTdGtJZCB0cnlmdW5jVE0gKGx1YV9TdGF0ZSAqTCwgU3RrSWQgZnVuYykgeworICBjb25zdCBUVmFsdWUgKnRtID0gbHVhVF9nZXR0bWJ5b2JqKEwsIGZ1bmMsIFRNX0NBTEwpOworICBTdGtJZCBwOworICBwdHJkaWZmX3QgZnVuY3IgPSBzYXZlc3RhY2soTCwgZnVuYyk7CisgIGlmICghdHRpc2Z1bmN0aW9uKHRtKSkKKyAgICBsdWFHX3R5cGVlcnJvcihMLCBmdW5jLCAiY2FsbCIpOworICAvKiBPcGVuIGEgaG9sZSBpbnNpZGUgdGhlIHN0YWNrIGF0IGBmdW5jJyAqLworICBmb3IgKHAgPSBMLT50b3A7IHAgPiBmdW5jOyBwLS0pIHNldG9ianMycyhMLCBwLCBwLTEpOworICBpbmNyX3RvcChMKTsKKyAgZnVuYyA9IHJlc3RvcmVzdGFjayhMLCBmdW5jcik7ICAvKiBwcmV2aW91cyBjYWxsIG1heSBjaGFuZ2Ugc3RhY2sgKi8KKyAgc2V0b2JqMnMoTCwgZnVuYywgdG0pOyAgLyogdGFnIG1ldGhvZCBpcyB0aGUgbmV3IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCAqLworICByZXR1cm4gZnVuYzsKK30KKworCisKKyNkZWZpbmUgbmV4dF9jaShMKSAoTC0+Y2kgPSAoTC0+Y2ktPm5leHQgPyBMLT5jaS0+bmV4dCA6IGx1YUVfZXh0ZW5kQ0koTCkpKQorCisKKy8qCisqKiByZXR1cm5zIHRydWUgaWYgZnVuY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQgKEMgZnVuY3Rpb24pCisqLworaW50IGx1YURfcHJlY2FsbCAobHVhX1N0YXRlICpMLCBTdGtJZCBmdW5jLCBpbnQgbnJlc3VsdHMpIHsKKyAgbHVhX0NGdW5jdGlvbiBmOworICBDYWxsSW5mbyAqY2k7CisgIGludCBuOyAgLyogbnVtYmVyIG9mIGFyZ3VtZW50cyAoTHVhKSBvciByZXR1cm5zIChDKSAqLworICBwdHJkaWZmX3QgZnVuY3IgPSBzYXZlc3RhY2soTCwgZnVuYyk7CisgIHN3aXRjaCAodHR5cGUoZnVuYykpIHsKKyAgICBjYXNlIExVQV9UTENGOiAgLyogbGlnaHQgQyBmdW5jdGlvbiAqLworICAgICAgZiA9IGZ2YWx1ZShmdW5jKTsKKyAgICAgIGdvdG8gQ2Z1bmM7CisgICAgY2FzZSBMVUFfVENDTDogeyAgLyogQyBjbG9zdXJlICovCisgICAgICBmID0gY2xDdmFsdWUoZnVuYyktPmY7CisgICAgIENmdW5jOgorICAgICAgbHVhRF9jaGVja3N0YWNrKEwsIExVQV9NSU5TVEFDSyk7ICAvKiBlbnN1cmUgbWluaW11bSBzdGFjayBzaXplICovCisgICAgICBjaSA9IG5leHRfY2koTCk7ICAvKiBub3cgJ2VudGVyJyBuZXcgZnVuY3Rpb24gKi8KKyAgICAgIGNpLT5ucmVzdWx0cyA9IG5yZXN1bHRzOworICAgICAgY2ktPmZ1bmMgPSByZXN0b3Jlc3RhY2soTCwgZnVuY3IpOworICAgICAgY2ktPnRvcCA9IEwtPnRvcCArIExVQV9NSU5TVEFDSzsKKyAgICAgIGx1YV9hc3NlcnQoY2ktPnRvcCA8PSBMLT5zdGFja19sYXN0KTsKKyAgICAgIGNpLT5jYWxsc3RhdHVzID0gMDsKKyAgICAgIGx1YUNfY2hlY2tHQyhMKTsgIC8qIHN0YWNrIGdyb3cgdXNlcyBtZW1vcnkgKi8KKyAgICAgIGlmIChMLT5ob29rbWFzayAmIExVQV9NQVNLQ0FMTCkKKyAgICAgICAgbHVhRF9ob29rKEwsIExVQV9IT09LQ0FMTCwgLTEpOworICAgICAgbHVhX3VubG9jayhMKTsKKyAgICAgIG4gPSAoKmYpKEwpOyAgLyogZG8gdGhlIGFjdHVhbCBjYWxsICovCisgICAgICBsdWFfbG9jayhMKTsKKyAgICAgIGFwaV9jaGVja25lbGVtcyhMLCBuKTsKKyAgICAgIGx1YURfcG9zY2FsbChMLCBMLT50b3AgLSBuKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBjYXNlIExVQV9UTENMOiB7ICAvKiBMdWEgZnVuY3Rpb246IHByZXBhcmUgaXRzIGNhbGwgKi8KKyAgICAgIFN0a0lkIGJhc2U7CisgICAgICBQcm90byAqcCA9IGNsTHZhbHVlKGZ1bmMpLT5wOworICAgICAgbiA9IGNhc3RfaW50KEwtPnRvcCAtIGZ1bmMpIC0gMTsgIC8qIG51bWJlciBvZiByZWFsIGFyZ3VtZW50cyAqLworICAgICAgbHVhRF9jaGVja3N0YWNrKEwsIHAtPm1heHN0YWNrc2l6ZSk7CisgICAgICBmb3IgKDsgbiA8IHAtPm51bXBhcmFtczsgbisrKQorICAgICAgICBzZXRuaWx2YWx1ZShMLT50b3ArKyk7ICAvKiBjb21wbGV0ZSBtaXNzaW5nIGFyZ3VtZW50cyAqLworICAgICAgaWYgKCFwLT5pc192YXJhcmcpIHsKKyAgICAgICAgZnVuYyA9IHJlc3RvcmVzdGFjayhMLCBmdW5jcik7CisgICAgICAgIGJhc2UgPSBmdW5jICsgMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBiYXNlID0gYWRqdXN0X3ZhcmFyZ3MoTCwgcCwgbik7CisgICAgICAgIGZ1bmMgPSByZXN0b3Jlc3RhY2soTCwgZnVuY3IpOyAgLyogcHJldmlvdXMgY2FsbCBjYW4gY2hhbmdlIHN0YWNrICovCisgICAgICB9CisgICAgICBjaSA9IG5leHRfY2koTCk7ICAvKiBub3cgJ2VudGVyJyBuZXcgZnVuY3Rpb24gKi8KKyAgICAgIGNpLT5ucmVzdWx0cyA9IG5yZXN1bHRzOworICAgICAgY2ktPmZ1bmMgPSBmdW5jOworICAgICAgY2ktPnUubC5iYXNlID0gYmFzZTsKKyAgICAgIGNpLT50b3AgPSBiYXNlICsgcC0+bWF4c3RhY2tzaXplOworICAgICAgbHVhX2Fzc2VydChjaS0+dG9wIDw9IEwtPnN0YWNrX2xhc3QpOworICAgICAgY2ktPnUubC5zYXZlZHBjID0gcC0+Y29kZTsgIC8qIHN0YXJ0aW5nIHBvaW50ICovCisgICAgICBjaS0+Y2FsbHN0YXR1cyA9IENJU1RfTFVBOworICAgICAgTC0+dG9wID0gY2ktPnRvcDsKKyAgICAgIGx1YUNfY2hlY2tHQyhMKTsgIC8qIHN0YWNrIGdyb3cgdXNlcyBtZW1vcnkgKi8KKyAgICAgIGlmIChMLT5ob29rbWFzayAmIExVQV9NQVNLQ0FMTCkKKyAgICAgICAgY2FsbGhvb2soTCwgY2kpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGRlZmF1bHQ6IHsgIC8qIG5vdCBhIGZ1bmN0aW9uICovCisgICAgICBmdW5jID0gdHJ5ZnVuY1RNKEwsIGZ1bmMpOyAgLyogcmV0cnkgd2l0aCAnZnVuY3Rpb24nIHRhZyBtZXRob2QgKi8KKyAgICAgIHJldHVybiBsdWFEX3ByZWNhbGwoTCwgZnVuYywgbnJlc3VsdHMpOyAgLyogbm93IGl0IG11c3QgYmUgYSBmdW5jdGlvbiAqLworICAgIH0KKyAgfQorfQorCisKK2ludCBsdWFEX3Bvc2NhbGwgKGx1YV9TdGF0ZSAqTCwgU3RrSWQgZmlyc3RSZXN1bHQpIHsKKyAgU3RrSWQgcmVzOworICBpbnQgd2FudGVkLCBpOworICBDYWxsSW5mbyAqY2kgPSBMLT5jaTsKKyAgaWYgKEwtPmhvb2ttYXNrICYgKExVQV9NQVNLUkVUIHwgTFVBX01BU0tMSU5FKSkgeworICAgIGlmIChMLT5ob29rbWFzayAmIExVQV9NQVNLUkVUKSB7CisgICAgICBwdHJkaWZmX3QgZnIgPSBzYXZlc3RhY2soTCwgZmlyc3RSZXN1bHQpOyAgLyogaG9vayBtYXkgY2hhbmdlIHN0YWNrICovCisgICAgICBsdWFEX2hvb2soTCwgTFVBX0hPT0tSRVQsIC0xKTsKKyAgICAgIGZpcnN0UmVzdWx0ID0gcmVzdG9yZXN0YWNrKEwsIGZyKTsKKyAgICB9CisgICAgTC0+b2xkcGMgPSBjaS0+cHJldmlvdXMtPnUubC5zYXZlZHBjOyAgLyogJ29sZHBjJyBmb3IgY2FsbGVyIGZ1bmN0aW9uICovCisgIH0KKyAgcmVzID0gY2ktPmZ1bmM7ICAvKiByZXMgPT0gZmluYWwgcG9zaXRpb24gb2YgMXN0IHJlc3VsdCAqLworICB3YW50ZWQgPSBjaS0+bnJlc3VsdHM7CisgIEwtPmNpID0gY2kgPSBjaS0+cHJldmlvdXM7ICAvKiBiYWNrIHRvIGNhbGxlciAqLworICAvKiBtb3ZlIHJlc3VsdHMgdG8gY29ycmVjdCBwbGFjZSAqLworICBmb3IgKGkgPSB3YW50ZWQ7IGkgIT0gMCAmJiBmaXJzdFJlc3VsdCA8IEwtPnRvcDsgaS0tKQorICAgIHNldG9ianMycyhMLCByZXMrKywgZmlyc3RSZXN1bHQrKyk7CisgIHdoaWxlIChpLS0gPiAwKQorICAgIHNldG5pbHZhbHVlKHJlcysrKTsKKyAgTC0+dG9wID0gcmVzOworICByZXR1cm4gKHdhbnRlZCAtIExVQV9NVUxUUkVUKTsgIC8qIDAgaWZmIHdhbnRlZCA9PSBMVUFfTVVMVFJFVCAqLworfQorCisKKy8qCisqKiBDYWxsIGEgZnVuY3Rpb24gKEMgb3IgTHVhKS4gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpcyBhdCAqZnVuYy4KKyoqIFRoZSBhcmd1bWVudHMgYXJlIG9uIHRoZSBzdGFjaywgcmlnaHQgYWZ0ZXIgdGhlIGZ1bmN0aW9uLgorKiogV2hlbiByZXR1cm5zLCBhbGwgdGhlIHJlc3VsdHMgYXJlIG9uIHRoZSBzdGFjaywgc3RhcnRpbmcgYXQgdGhlIG9yaWdpbmFsCisqKiBmdW5jdGlvbiBwb3NpdGlvbi4KKyovCit2b2lkIGx1YURfY2FsbCAobHVhX1N0YXRlICpMLCBTdGtJZCBmdW5jLCBpbnQgblJlc3VsdHMsIGludCBhbGxvd3lpZWxkKSB7CisgIGlmICgrK0wtPm5DY2FsbHMgPj0gTFVBSV9NQVhDQ0FMTFMpIHsKKyAgICBpZiAoTC0+bkNjYWxscyA9PSBMVUFJX01BWENDQUxMUykKKyAgICAgIGx1YUdfcnVuZXJyb3IoTCwgIkMgc3RhY2sgb3ZlcmZsb3ciKTsKKyAgICBlbHNlIGlmIChMLT5uQ2NhbGxzID49IChMVUFJX01BWENDQUxMUyArIChMVUFJX01BWENDQUxMUz4+MykpKQorICAgICAgbHVhRF90aHJvdyhMLCBMVUFfRVJSRVJSKTsgIC8qIGVycm9yIHdoaWxlIGhhbmRpbmcgc3RhY2sgZXJyb3IgKi8KKyAgfQorICBpZiAoIWFsbG93eWllbGQpIEwtPm5ueSsrOworICBpZiAoIWx1YURfcHJlY2FsbChMLCBmdW5jLCBuUmVzdWx0cykpICAvKiBpcyBhIEx1YSBmdW5jdGlvbj8gKi8KKyAgICBsdWFWX2V4ZWN1dGUoTCk7ICAvKiBjYWxsIGl0ICovCisgIGlmICghYWxsb3d5aWVsZCkgTC0+bm55LS07CisgIEwtPm5DY2FsbHMtLTsKK30KKworCitzdGF0aWMgdm9pZCBmaW5pc2hDY2FsbCAobHVhX1N0YXRlICpMKSB7CisgIENhbGxJbmZvICpjaSA9IEwtPmNpOworICBpbnQgbjsKKyAgbHVhX2Fzc2VydChjaS0+dS5jLmsgIT0gTlVMTCk7ICAvKiBtdXN0IGhhdmUgYSBjb250aW51YXRpb24gKi8KKyAgbHVhX2Fzc2VydChMLT5ubnkgPT0gMCk7CisgIGlmIChjaS0+Y2FsbHN0YXR1cyAmIENJU1RfWVBDQUxMKSB7ICAvKiB3YXMgaW5zaWRlIGEgcGNhbGw/ICovCisgICAgY2ktPmNhbGxzdGF0dXMgJj0gfkNJU1RfWVBDQUxMOyAgLyogZmluaXNoICdsdWFfcGNhbGwnICovCisgICAgTC0+ZXJyZnVuYyA9IGNpLT51LmMub2xkX2VycmZ1bmM7CisgIH0KKyAgLyogZmluaXNoICdsdWFfY2FsbGsnLydsdWFfcGNhbGwnICovCisgIGFkanVzdHJlc3VsdHMoTCwgY2ktPm5yZXN1bHRzKTsKKyAgLyogY2FsbCBjb250aW51YXRpb24gZnVuY3Rpb24gKi8KKyAgaWYgKCEoY2ktPmNhbGxzdGF0dXMgJiBDSVNUX1NUQVQpKSAgLyogbm8gY2FsbCBzdGF0dXM/ICovCisgICAgY2ktPnUuYy5zdGF0dXMgPSBMVUFfWUlFTEQ7ICAvKiAnZGVmYXVsdCcgc3RhdHVzICovCisgIGx1YV9hc3NlcnQoY2ktPnUuYy5zdGF0dXMgIT0gTFVBX09LKTsKKyAgY2ktPmNhbGxzdGF0dXMgPSAoY2ktPmNhbGxzdGF0dXMgJiB+KENJU1RfWVBDQUxMIHwgQ0lTVF9TVEFUKSkgfCBDSVNUX1lJRUxERUQ7CisgIGx1YV91bmxvY2soTCk7CisgIG4gPSAoKmNpLT51LmMuaykoTCk7CisgIGx1YV9sb2NrKEwpOworICBhcGlfY2hlY2tuZWxlbXMoTCwgbik7CisgIC8qIGZpbmlzaCAnbHVhRF9wcmVjYWxsJyAqLworICBsdWFEX3Bvc2NhbGwoTCwgTC0+dG9wIC0gbik7Cit9CisKKworc3RhdGljIHZvaWQgdW5yb2xsIChsdWFfU3RhdGUgKkwsIHZvaWQgKnVkKSB7CisgIFVOVVNFRCh1ZCk7CisgIGZvciAoOzspIHsKKyAgICBpZiAoTC0+Y2kgPT0gJkwtPmJhc2VfY2kpICAvKiBzdGFjayBpcyBlbXB0eT8gKi8KKyAgICAgIHJldHVybjsgIC8qIGNvcm91dGluZSBmaW5pc2hlZCBub3JtYWxseSAqLworICAgIGlmICghaXNMdWEoTC0+Y2kpKSAgLyogQyBmdW5jdGlvbj8gKi8KKyAgICAgIGZpbmlzaENjYWxsKEwpOworICAgIGVsc2UgeyAgLyogTHVhIGZ1bmN0aW9uICovCisgICAgICBsdWFWX2ZpbmlzaE9wKEwpOyAgLyogZmluaXNoIGludGVycnVwdGVkIGluc3RydWN0aW9uICovCisgICAgICBsdWFWX2V4ZWN1dGUoTCk7ICAvKiBleGVjdXRlIGRvd24gdG8gaGlnaGVyIEMgJ2JvdW5kYXJ5JyAqLworICAgIH0KKyAgfQorfQorCisKKy8qCisqKiBjaGVjayB3aGV0aGVyIHRocmVhZCBoYXMgYSBzdXNwZW5kZWQgcHJvdGVjdGVkIGNhbGwKKyovCitzdGF0aWMgQ2FsbEluZm8gKmZpbmRwY2FsbCAobHVhX1N0YXRlICpMKSB7CisgIENhbGxJbmZvICpjaTsKKyAgZm9yIChjaSA9IEwtPmNpOyBjaSAhPSBOVUxMOyBjaSA9IGNpLT5wcmV2aW91cykgeyAgLyogc2VhcmNoIGZvciBhIHBjYWxsICovCisgICAgaWYgKGNpLT5jYWxsc3RhdHVzICYgQ0lTVF9ZUENBTEwpCisgICAgICByZXR1cm4gY2k7CisgIH0KKyAgcmV0dXJuIE5VTEw7ICAvKiBubyBwZW5kaW5nIHBjYWxsICovCit9CisKKworc3RhdGljIGludCByZWNvdmVyIChsdWFfU3RhdGUgKkwsIGludCBzdGF0dXMpIHsKKyAgU3RrSWQgb2xkdG9wOworICBDYWxsSW5mbyAqY2kgPSBmaW5kcGNhbGwoTCk7CisgIGlmIChjaSA9PSBOVUxMKSByZXR1cm4gMDsgIC8qIG5vIHJlY292ZXJ5IHBvaW50ICovCisgIC8qICJmaW5pc2giIGx1YURfcGNhbGwgKi8KKyAgb2xkdG9wID0gcmVzdG9yZXN0YWNrKEwsIGNpLT5leHRyYSk7CisgIGx1YUZfY2xvc2UoTCwgb2xkdG9wKTsKKyAgc2V0ZXJyb3JvYmooTCwgc3RhdHVzLCBvbGR0b3ApOworICBMLT5jaSA9IGNpOworICBMLT5hbGxvd2hvb2sgPSBjaS0+dS5jLm9sZF9hbGxvd2hvb2s7CisgIEwtPm5ueSA9IDA7ICAvKiBzaG91bGQgYmUgemVybyB0byBiZSB5aWVsZGFibGUgKi8KKyAgbHVhRF9zaHJpbmtzdGFjayhMKTsKKyAgTC0+ZXJyZnVuYyA9IGNpLT51LmMub2xkX2VycmZ1bmM7CisgIGNpLT5jYWxsc3RhdHVzIHw9IENJU1RfU1RBVDsgIC8qIGNhbGwgaGFzIGVycm9yIHN0YXR1cyAqLworICBjaS0+dS5jLnN0YXR1cyA9IHN0YXR1czsgIC8qIChoZXJlIGl0IGlzKSAqLworICByZXR1cm4gMTsgIC8qIGNvbnRpbnVlIHJ1bm5pbmcgdGhlIGNvcm91dGluZSAqLworfQorCisKKy8qCisqKiBzaWduYWwgYW4gZXJyb3IgaW4gdGhlIGNhbGwgdG8gJ3Jlc3VtZScsIG5vdCBpbiB0aGUgZXhlY3V0aW9uIG9mIHRoZQorKiogY29yb3V0aW5lIGl0c2VsZi4gKFN1Y2ggZXJyb3JzIHNob3VsZCBub3QgYmUgaGFuZGxlZCBieSBhbnkgY29yb3V0aW5lCisqKiBlcnJvciBoYW5kbGVyIGFuZCBzaG91bGQgbm90IGtpbGwgdGhlIGNvcm91dGluZS4pCisqLworc3RhdGljIGxfbm9yZXQgcmVzdW1lX2Vycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm1zZywgU3RrSWQgZmlyc3RBcmcpIHsKKyAgTC0+dG9wID0gZmlyc3RBcmc7ICAvKiByZW1vdmUgYXJncyBmcm9tIHRoZSBzdGFjayAqLworICBzZXRzdmFsdWUycyhMLCBMLT50b3AsIGx1YVNfbmV3KEwsIG1zZykpOyAgLyogcHVzaCBlcnJvciBtZXNzYWdlICovCisgIGFwaV9pbmNyX3RvcChMKTsKKyAgbHVhRF90aHJvdyhMLCAtMSk7ICAvKiBqdW1wIGJhY2sgdG8gJ2x1YV9yZXN1bWUnICovCit9CisKKworLyoKKyoqIGRvIHRoZSB3b3JrIGZvciAnbHVhX3Jlc3VtZScgaW4gcHJvdGVjdGVkIG1vZGUKKyovCitzdGF0aWMgdm9pZCByZXN1bWUgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQpIHsKKyAgaW50IG5DY2FsbHMgPSBMLT5uQ2NhbGxzOworICBTdGtJZCBmaXJzdEFyZyA9IGNhc3QoU3RrSWQsIHVkKTsKKyAgQ2FsbEluZm8gKmNpID0gTC0+Y2k7CisgIGlmIChuQ2NhbGxzID49IExVQUlfTUFYQ0NBTExTKQorICAgIHJlc3VtZV9lcnJvcihMLCAiQyBzdGFjayBvdmVyZmxvdyIsIGZpcnN0QXJnKTsKKyAgaWYgKEwtPnN0YXR1cyA9PSBMVUFfT0spIHsgIC8qIG1heSBiZSBzdGFydGluZyBhIGNvcm91dGluZSAqLworICAgIGlmIChjaSAhPSAmTC0+YmFzZV9jaSkgIC8qIG5vdCBpbiBiYXNlIGxldmVsPyAqLworICAgICAgcmVzdW1lX2Vycm9yKEwsICJjYW5ub3QgcmVzdW1lIG5vbi1zdXNwZW5kZWQgY29yb3V0aW5lIiwgZmlyc3RBcmcpOworICAgIC8qIGNvcm91dGluZSBpcyBpbiBiYXNlIGxldmVsOyBzdGFydCBydW5uaW5nIGl0ICovCisgICAgaWYgKCFsdWFEX3ByZWNhbGwoTCwgZmlyc3RBcmcgLSAxLCBMVUFfTVVMVFJFVCkpICAvKiBMdWEgZnVuY3Rpb24/ICovCisgICAgICBsdWFWX2V4ZWN1dGUoTCk7ICAvKiBjYWxsIGl0ICovCisgIH0KKyAgZWxzZSBpZiAoTC0+c3RhdHVzICE9IExVQV9ZSUVMRCkKKyAgICByZXN1bWVfZXJyb3IoTCwgImNhbm5vdCByZXN1bWUgZGVhZCBjb3JvdXRpbmUiLCBmaXJzdEFyZyk7CisgIGVsc2UgeyAgLyogcmVzdW1pbmcgZnJvbSBwcmV2aW91cyB5aWVsZCAqLworICAgIEwtPnN0YXR1cyA9IExVQV9PSzsKKyAgICBjaS0+ZnVuYyA9IHJlc3RvcmVzdGFjayhMLCBjaS0+ZXh0cmEpOworICAgIGlmIChpc0x1YShjaSkpICAvKiB5aWVsZGVkIGluc2lkZSBhIGhvb2s/ICovCisgICAgICBsdWFWX2V4ZWN1dGUoTCk7ICAvKiBqdXN0IGNvbnRpbnVlIHJ1bm5pbmcgTHVhIGNvZGUgKi8KKyAgICBlbHNlIHsgIC8qICdjb21tb24nIHlpZWxkICovCisgICAgICBpZiAoY2ktPnUuYy5rICE9IE5VTEwpIHsgIC8qIGRvZXMgaXQgaGF2ZSBhIGNvbnRpbnVhdGlvbj8gKi8KKyAgICAgICAgaW50IG47CisgICAgICAgIGNpLT51LmMuc3RhdHVzID0gTFVBX1lJRUxEOyAgLyogJ2RlZmF1bHQnIHN0YXR1cyAqLworICAgICAgICBjaS0+Y2FsbHN0YXR1cyB8PSBDSVNUX1lJRUxERUQ7CisgICAgICAgIGx1YV91bmxvY2soTCk7CisgICAgICAgIG4gPSAoKmNpLT51LmMuaykoTCk7ICAvKiBjYWxsIGNvbnRpbnVhdGlvbiAqLworICAgICAgICBsdWFfbG9jayhMKTsKKyAgICAgICAgYXBpX2NoZWNrbmVsZW1zKEwsIG4pOworICAgICAgICBmaXJzdEFyZyA9IEwtPnRvcCAtIG47ICAvKiB5aWVsZCByZXN1bHRzIGNvbWUgZnJvbSBjb250aW51YXRpb24gKi8KKyAgICAgIH0KKyAgICAgIGx1YURfcG9zY2FsbChMLCBmaXJzdEFyZyk7ICAvKiBmaW5pc2ggJ2x1YURfcHJlY2FsbCcgKi8KKyAgICB9CisgICAgdW5yb2xsKEwsIE5VTEwpOworICB9CisgIGx1YV9hc3NlcnQobkNjYWxscyA9PSBMLT5uQ2NhbGxzKTsKK30KKworCitMVUFfQVBJIGludCBsdWFfcmVzdW1lIChsdWFfU3RhdGUgKkwsIGx1YV9TdGF0ZSAqZnJvbSwgaW50IG5hcmdzKSB7CisgIGludCBzdGF0dXM7CisgIGludCBvbGRubnkgPSBMLT5ubnk7ICAvKiBzYXZlICdubnknICovCisgIGx1YV9sb2NrKEwpOworICBsdWFpX3VzZXJzdGF0ZXJlc3VtZShMLCBuYXJncyk7CisgIEwtPm5DY2FsbHMgPSAoZnJvbSkgPyBmcm9tLT5uQ2NhbGxzICsgMSA6IDE7CisgIEwtPm5ueSA9IDA7ICAvKiBhbGxvdyB5aWVsZHMgKi8KKyAgYXBpX2NoZWNrbmVsZW1zKEwsIChMLT5zdGF0dXMgPT0gTFVBX09LKSA/IG5hcmdzICsgMSA6IG5hcmdzKTsKKyAgc3RhdHVzID0gbHVhRF9yYXdydW5wcm90ZWN0ZWQoTCwgcmVzdW1lLCBMLT50b3AgLSBuYXJncyk7CisgIGlmIChzdGF0dXMgPT0gLTEpICAvKiBlcnJvciBjYWxsaW5nICdsdWFfcmVzdW1lJz8gKi8KKyAgICBzdGF0dXMgPSBMVUFfRVJSUlVOOworICBlbHNlIHsgIC8qIHlpZWxkIG9yIHJlZ3VsYXIgZXJyb3IgKi8KKyAgICB3aGlsZSAoc3RhdHVzICE9IExVQV9PSyAmJiBzdGF0dXMgIT0gTFVBX1lJRUxEKSB7ICAvKiBlcnJvcj8gKi8KKyAgICAgIGlmIChyZWNvdmVyKEwsIHN0YXR1cykpICAvKiByZWNvdmVyIHBvaW50PyAqLworICAgICAgICBzdGF0dXMgPSBsdWFEX3Jhd3J1bnByb3RlY3RlZChMLCB1bnJvbGwsIE5VTEwpOyAgLyogcnVuIGNvbnRpbnVhdGlvbiAqLworICAgICAgZWxzZSB7ICAvKiB1bnJlY292ZXJhYmxlIGVycm9yICovCisgICAgICAgIEwtPnN0YXR1cyA9IGNhc3RfYnl0ZShzdGF0dXMpOyAgLyogbWFyayB0aHJlYWQgYXMgYGRlYWQnICovCisgICAgICAgIHNldGVycm9yb2JqKEwsIHN0YXR1cywgTC0+dG9wKTsKKyAgICAgICAgTC0+Y2ktPnRvcCA9IEwtPnRvcDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGx1YV9hc3NlcnQoc3RhdHVzID09IEwtPnN0YXR1cyk7CisgIH0KKyAgTC0+bm55ID0gb2xkbm55OyAgLyogcmVzdG9yZSAnbm55JyAqLworICBMLT5uQ2NhbGxzLS07CisgIGx1YV9hc3NlcnQoTC0+bkNjYWxscyA9PSAoKGZyb20pID8gZnJvbS0+bkNjYWxscyA6IDApKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCitMVUFfQVBJIGludCBsdWFfeWllbGRrIChsdWFfU3RhdGUgKkwsIGludCBucmVzdWx0cywgaW50IGN0eCwgbHVhX0NGdW5jdGlvbiBrKSB7CisgIENhbGxJbmZvICpjaSA9IEwtPmNpOworICBsdWFpX3VzZXJzdGF0ZXlpZWxkKEwsIG5yZXN1bHRzKTsKKyAgbHVhX2xvY2soTCk7CisgIGFwaV9jaGVja25lbGVtcyhMLCBucmVzdWx0cyk7CisgIGlmIChMLT5ubnkgPiAwKSB7CisgICAgaWYgKEwgIT0gRyhMKS0+bWFpbnRocmVhZCkKKyAgICAgIGx1YUdfcnVuZXJyb3IoTCwgImF0dGVtcHQgdG8geWllbGQgYWNyb3NzIGEgQy1jYWxsIGJvdW5kYXJ5Iik7CisgICAgZWxzZQorICAgICAgbHVhR19ydW5lcnJvcihMLCAiYXR0ZW1wdCB0byB5aWVsZCBmcm9tIG91dHNpZGUgYSBjb3JvdXRpbmUiKTsKKyAgfQorICBMLT5zdGF0dXMgPSBMVUFfWUlFTEQ7CisgIGNpLT5leHRyYSA9IHNhdmVzdGFjayhMLCBjaS0+ZnVuYyk7ICAvKiBzYXZlIGN1cnJlbnQgJ2Z1bmMnICovCisgIGlmIChpc0x1YShjaSkpIHsgIC8qIGluc2lkZSBhIGhvb2s/ICovCisgICAgYXBpX2NoZWNrKEwsIGsgPT0gTlVMTCwgImhvb2tzIGNhbm5vdCBjb250aW51ZSBhZnRlciB5aWVsZGluZyIpOworICB9CisgIGVsc2UgeworICAgIGlmICgoY2ktPnUuYy5rID0gaykgIT0gTlVMTCkgIC8qIGlzIHRoZXJlIGEgY29udGludWF0aW9uPyAqLworICAgICAgY2ktPnUuYy5jdHggPSBjdHg7ICAvKiBzYXZlIGNvbnRleHQgKi8KKyAgICBjaS0+ZnVuYyA9IEwtPnRvcCAtIG5yZXN1bHRzIC0gMTsgIC8qIHByb3RlY3Qgc3RhY2sgYmVsb3cgcmVzdWx0cyAqLworICAgIGx1YURfdGhyb3coTCwgTFVBX1lJRUxEKTsKKyAgfQorICBsdWFfYXNzZXJ0KGNpLT5jYWxsc3RhdHVzICYgQ0lTVF9IT09LRUQpOyAgLyogbXVzdCBiZSBpbnNpZGUgYSBob29rICovCisgIGx1YV91bmxvY2soTCk7CisgIHJldHVybiAwOyAgLyogcmV0dXJuIHRvICdsdWFEX2hvb2snICovCit9CisKKworaW50IGx1YURfcGNhbGwgKGx1YV9TdGF0ZSAqTCwgUGZ1bmMgZnVuYywgdm9pZCAqdSwKKyAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgb2xkX3RvcCwgcHRyZGlmZl90IGVmKSB7CisgIGludCBzdGF0dXM7CisgIENhbGxJbmZvICpvbGRfY2kgPSBMLT5jaTsKKyAgbHVfYnl0ZSBvbGRfYWxsb3dob29rcyA9IEwtPmFsbG93aG9vazsKKyAgdW5zaWduZWQgc2hvcnQgb2xkX25ueSA9IEwtPm5ueTsKKyAgcHRyZGlmZl90IG9sZF9lcnJmdW5jID0gTC0+ZXJyZnVuYzsKKyAgTC0+ZXJyZnVuYyA9IGVmOworICBzdGF0dXMgPSBsdWFEX3Jhd3J1bnByb3RlY3RlZChMLCBmdW5jLCB1KTsKKyAgaWYgKHN0YXR1cyAhPSBMVUFfT0spIHsgIC8qIGFuIGVycm9yIG9jY3VycmVkPyAqLworICAgIFN0a0lkIG9sZHRvcCA9IHJlc3RvcmVzdGFjayhMLCBvbGRfdG9wKTsKKyAgICBsdWFGX2Nsb3NlKEwsIG9sZHRvcCk7ICAvKiBjbG9zZSBwb3NzaWJsZSBwZW5kaW5nIGNsb3N1cmVzICovCisgICAgc2V0ZXJyb3JvYmooTCwgc3RhdHVzLCBvbGR0b3ApOworICAgIEwtPmNpID0gb2xkX2NpOworICAgIEwtPmFsbG93aG9vayA9IG9sZF9hbGxvd2hvb2tzOworICAgIEwtPm5ueSA9IG9sZF9ubnk7CisgICAgbHVhRF9zaHJpbmtzdGFjayhMKTsKKyAgfQorICBMLT5lcnJmdW5jID0gb2xkX2VycmZ1bmM7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKworCisvKgorKiogRXhlY3V0ZSBhIHByb3RlY3RlZCBwYXJzZXIuCisqLworc3RydWN0IFNQYXJzZXIgeyAgLyogZGF0YSB0byBgZl9wYXJzZXInICovCisgIFpJTyAqejsKKyAgTWJ1ZmZlciBidWZmOyAgLyogZHluYW1pYyBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgc2Nhbm5lciAqLworICBEeW5kYXRhIGR5ZDsgIC8qIGR5bmFtaWMgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBwYXJzZXIgKi8KKyAgY29uc3QgY2hhciAqbW9kZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKK307CisKKworc3RhdGljIHZvaWQgY2hlY2ttb2RlIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm1vZGUsIGNvbnN0IGNoYXIgKngpIHsKKyAgaWYgKG1vZGUgJiYgc3RyY2hyKG1vZGUsIHhbMF0pID09IE5VTEwpIHsKKyAgICBsdWFPX3B1c2hmc3RyaW5nKEwsCisgICAgICAgImF0dGVtcHQgdG8gbG9hZCBhICVzIGNodW5rIChtb2RlIGlzICIgTFVBX1FTICIpIiwgeCwgbW9kZSk7CisgICAgbHVhRF90aHJvdyhMLCBMVUFfRVJSU1lOVEFYKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGZfcGFyc2VyIChsdWFfU3RhdGUgKkwsIHZvaWQgKnVkKSB7CisgIGludCBpOworICBDbG9zdXJlICpjbDsKKyAgc3RydWN0IFNQYXJzZXIgKnAgPSBjYXN0KHN0cnVjdCBTUGFyc2VyICosIHVkKTsKKyAgaW50IGMgPSB6Z2V0YyhwLT56KTsgIC8qIHJlYWQgZmlyc3QgY2hhcmFjdGVyICovCisgIGlmIChjID09IExVQV9TSUdOQVRVUkVbMF0pIHsKKyAgICBjaGVja21vZGUoTCwgcC0+bW9kZSwgImJpbmFyeSIpOworICAgIGNsID0gbHVhVV91bmR1bXAoTCwgcC0+eiwgJnAtPmJ1ZmYsIHAtPm5hbWUpOworICB9CisgIGVsc2UgeworICAgIGNoZWNrbW9kZShMLCBwLT5tb2RlLCAidGV4dCIpOworICAgIGNsID0gbHVhWV9wYXJzZXIoTCwgcC0+eiwgJnAtPmJ1ZmYsICZwLT5keWQsIHAtPm5hbWUsIGMpOworICB9CisgIGx1YV9hc3NlcnQoY2wtPmwubnVwdmFsdWVzID09IGNsLT5sLnAtPnNpemV1cHZhbHVlcyk7CisgIGZvciAoaSA9IDA7IGkgPCBjbC0+bC5udXB2YWx1ZXM7IGkrKykgeyAgLyogaW5pdGlhbGl6ZSB1cHZhbHVlcyAqLworICAgIFVwVmFsICp1cCA9IGx1YUZfbmV3dXB2YWwoTCk7CisgICAgY2wtPmwudXB2YWxzW2ldID0gdXA7CisgICAgbHVhQ19vYmpiYXJyaWVyKEwsIGNsLCB1cCk7CisgIH0KK30KKworCitpbnQgbHVhRF9wcm90ZWN0ZWRwYXJzZXIgKGx1YV9TdGF0ZSAqTCwgWklPICp6LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGUpIHsKKyAgc3RydWN0IFNQYXJzZXIgcDsKKyAgaW50IHN0YXR1czsKKyAgTC0+bm55Kys7ICAvKiBjYW5ub3QgeWllbGQgZHVyaW5nIHBhcnNpbmcgKi8KKyAgcC56ID0gejsgcC5uYW1lID0gbmFtZTsgcC5tb2RlID0gbW9kZTsKKyAgcC5keWQuYWN0dmFyLmFyciA9IE5VTEw7IHAuZHlkLmFjdHZhci5zaXplID0gMDsKKyAgcC5keWQuZ3QuYXJyID0gTlVMTDsgcC5keWQuZ3Quc2l6ZSA9IDA7CisgIHAuZHlkLmxhYmVsLmFyciA9IE5VTEw7IHAuZHlkLmxhYmVsLnNpemUgPSAwOworICBsdWFaX2luaXRidWZmZXIoTCwgJnAuYnVmZik7CisgIHN0YXR1cyA9IGx1YURfcGNhbGwoTCwgZl9wYXJzZXIsICZwLCBzYXZlc3RhY2soTCwgTC0+dG9wKSwgTC0+ZXJyZnVuYyk7CisgIGx1YVpfZnJlZWJ1ZmZlcihMLCAmcC5idWZmKTsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgcC5keWQuYWN0dmFyLmFyciwgcC5keWQuYWN0dmFyLnNpemUpOworICBsdWFNX2ZyZWVhcnJheShMLCBwLmR5ZC5ndC5hcnIsIHAuZHlkLmd0LnNpemUpOworICBsdWFNX2ZyZWVhcnJheShMLCBwLmR5ZC5sYWJlbC5hcnIsIHAuZHlkLmxhYmVsLnNpemUpOworICBMLT5ubnktLTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xkby5oIGIvY29tMzIvbHVhL3NyYy9sZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2QzMDgyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sZG8uaApAQCAtMCwwICsxLDQ2IEBACisvKgorKiogJElkOiBsZG8uaCx2IDIuMjAuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogU3RhY2sgYW5kIENhbGwgc3RydWN0dXJlIG9mIEx1YQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbGRvX2gKKyNkZWZpbmUgbGRvX2gKKworCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorI2luY2x1ZGUgImx6aW8uaCIKKworCisjZGVmaW5lIGx1YURfY2hlY2tzdGFjayhMLG4pCWlmIChMLT5zdGFja19sYXN0IC0gTC0+dG9wIDw9IChuKSkgXAorCQkJCSAgICBsdWFEX2dyb3dzdGFjayhMLCBuKTsgZWxzZSBjb25kbW92ZXN0YWNrKEwpOworCisKKyNkZWZpbmUgaW5jcl90b3AoTCkge0wtPnRvcCsrOyBsdWFEX2NoZWNrc3RhY2soTCwwKTt9CisKKyNkZWZpbmUgc2F2ZXN0YWNrKEwscCkJCSgoY2hhciAqKShwKSAtIChjaGFyICopTC0+c3RhY2spCisjZGVmaW5lIHJlc3RvcmVzdGFjayhMLG4pCSgoVFZhbHVlICopKChjaGFyICopTC0+c3RhY2sgKyAobikpKQorCisKKy8qIHR5cGUgb2YgcHJvdGVjdGVkIGZ1bmN0aW9ucywgdG8gYmUgcmFuIGJ5IGBydW5wcm90ZWN0ZWQnICovCit0eXBlZGVmIHZvaWQgKCpQZnVuYykgKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQpOworCitMVUFJX0ZVTkMgaW50IGx1YURfcHJvdGVjdGVkcGFyc2VyIChsdWFfU3RhdGUgKkwsIFpJTyAqeiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZSk7CitMVUFJX0ZVTkMgdm9pZCBsdWFEX2hvb2sgKGx1YV9TdGF0ZSAqTCwgaW50IGV2ZW50LCBpbnQgbGluZSk7CitMVUFJX0ZVTkMgaW50IGx1YURfcHJlY2FsbCAobHVhX1N0YXRlICpMLCBTdGtJZCBmdW5jLCBpbnQgbnJlc3VsdHMpOworTFVBSV9GVU5DIHZvaWQgbHVhRF9jYWxsIChsdWFfU3RhdGUgKkwsIFN0a0lkIGZ1bmMsIGludCBuUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3d5aWVsZCk7CitMVUFJX0ZVTkMgaW50IGx1YURfcGNhbGwgKGx1YV9TdGF0ZSAqTCwgUGZ1bmMgZnVuYywgdm9pZCAqdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgb2xkdG9wLCBwdHJkaWZmX3QgZWYpOworTFVBSV9GVU5DIGludCBsdWFEX3Bvc2NhbGwgKGx1YV9TdGF0ZSAqTCwgU3RrSWQgZmlyc3RSZXN1bHQpOworTFVBSV9GVU5DIHZvaWQgbHVhRF9yZWFsbG9jc3RhY2sgKGx1YV9TdGF0ZSAqTCwgaW50IG5ld3NpemUpOworTFVBSV9GVU5DIHZvaWQgbHVhRF9ncm93c3RhY2sgKGx1YV9TdGF0ZSAqTCwgaW50IG4pOworTFVBSV9GVU5DIHZvaWQgbHVhRF9zaHJpbmtzdGFjayAobHVhX1N0YXRlICpMKTsKKworTFVBSV9GVU5DIGxfbm9yZXQgbHVhRF90aHJvdyAobHVhX1N0YXRlICpMLCBpbnQgZXJyY29kZSk7CitMVUFJX0ZVTkMgaW50IGx1YURfcmF3cnVucHJvdGVjdGVkIChsdWFfU3RhdGUgKkwsIFBmdW5jIGYsIHZvaWQgKnVkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGR1bXAuYyBiL2NvbTMyL2x1YS9zcmMvbGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWZhMmNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sZHVtcC5jCkBAIC0wLDAgKzEsMTczIEBACisvKgorKiogJElkOiBsZHVtcC5jLHYgMi4xNy4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBzYXZlIHByZWNvbXBpbGVkIEx1YSBjaHVua3MKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNkZWZpbmUgbGR1bXBfYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHVuZHVtcC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgbHVhX1N0YXRlKiBMOworIGx1YV9Xcml0ZXIgd3JpdGVyOworIHZvaWQqIGRhdGE7CisgaW50IHN0cmlwOworIGludCBzdGF0dXM7Cit9IER1bXBTdGF0ZTsKKworI2RlZmluZSBEdW1wTWVtKGIsbixzaXplLEQpCUR1bXBCbG9jayhiLChuKSooc2l6ZSksRCkKKyNkZWZpbmUgRHVtcFZhcih4LEQpCQlEdW1wTWVtKCZ4LDEsc2l6ZW9mKHgpLEQpCisKK3N0YXRpYyB2b2lkIER1bXBCbG9jayhjb25zdCB2b2lkKiBiLCBzaXplX3Qgc2l6ZSwgRHVtcFN0YXRlKiBEKQoreworIGlmIChELT5zdGF0dXM9PTApCisgeworICBsdWFfdW5sb2NrKEQtPkwpOworICBELT5zdGF0dXM9KCpELT53cml0ZXIpKEQtPkwsYixzaXplLEQtPmRhdGEpOworICBsdWFfbG9jayhELT5MKTsKKyB9Cit9CisKK3N0YXRpYyB2b2lkIER1bXBDaGFyKGludCB5LCBEdW1wU3RhdGUqIEQpCit7CisgY2hhciB4PShjaGFyKXk7CisgRHVtcFZhcih4LEQpOworfQorCitzdGF0aWMgdm9pZCBEdW1wSW50KGludCB4LCBEdW1wU3RhdGUqIEQpCit7CisgRHVtcFZhcih4LEQpOworfQorCitzdGF0aWMgdm9pZCBEdW1wTnVtYmVyKGx1YV9OdW1iZXIgeCwgRHVtcFN0YXRlKiBEKQoreworIER1bXBWYXIoeCxEKTsKK30KKworc3RhdGljIHZvaWQgRHVtcFZlY3Rvcihjb25zdCB2b2lkKiBiLCBpbnQgbiwgc2l6ZV90IHNpemUsIER1bXBTdGF0ZSogRCkKK3sKKyBEdW1wSW50KG4sRCk7CisgRHVtcE1lbShiLG4sc2l6ZSxEKTsKK30KKworc3RhdGljIHZvaWQgRHVtcFN0cmluZyhjb25zdCBUU3RyaW5nKiBzLCBEdW1wU3RhdGUqIEQpCit7CisgaWYgKHM9PU5VTEwpCisgeworICBzaXplX3Qgc2l6ZT0wOworICBEdW1wVmFyKHNpemUsRCk7CisgfQorIGVsc2UKKyB7CisgIHNpemVfdCBzaXplPXMtPnRzdi5sZW4rMTsJCS8qIGluY2x1ZGUgdHJhaWxpbmcgJ1wwJyAqLworICBEdW1wVmFyKHNpemUsRCk7CisgIER1bXBCbG9jayhnZXRzdHIocyksc2l6ZSpzaXplb2YoY2hhciksRCk7CisgfQorfQorCisjZGVmaW5lIER1bXBDb2RlKGYsRCkJIER1bXBWZWN0b3IoZi0+Y29kZSxmLT5zaXplY29kZSxzaXplb2YoSW5zdHJ1Y3Rpb24pLEQpCisKK3N0YXRpYyB2b2lkIER1bXBGdW5jdGlvbihjb25zdCBQcm90byogZiwgRHVtcFN0YXRlKiBEKTsKKworc3RhdGljIHZvaWQgRHVtcENvbnN0YW50cyhjb25zdCBQcm90byogZiwgRHVtcFN0YXRlKiBEKQoreworIGludCBpLG49Zi0+c2l6ZWs7CisgRHVtcEludChuLEQpOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIGNvbnN0IFRWYWx1ZSogbz0mZi0+a1tpXTsKKyAgRHVtcENoYXIodHR5cGVudihvKSxEKTsKKyAgc3dpdGNoICh0dHlwZW52KG8pKQorICB7CisgICBjYXNlIExVQV9UTklMOgorCWJyZWFrOworICAgY2FzZSBMVUFfVEJPT0xFQU46CisJRHVtcENoYXIoYnZhbHVlKG8pLEQpOworCWJyZWFrOworICAgY2FzZSBMVUFfVE5VTUJFUjoKKwlEdW1wTnVtYmVyKG52YWx1ZShvKSxEKTsKKwlicmVhazsKKyAgIGNhc2UgTFVBX1RTVFJJTkc6CisJRHVtcFN0cmluZyhyYXd0c3ZhbHVlKG8pLEQpOworCWJyZWFrOworICAgIGRlZmF1bHQ6IGx1YV9hc3NlcnQoMCk7CisgIH0KKyB9Cisgbj1mLT5zaXplcDsKKyBEdW1wSW50KG4sRCk7CisgZm9yIChpPTA7IGk8bjsgaSsrKSBEdW1wRnVuY3Rpb24oZi0+cFtpXSxEKTsKK30KKworc3RhdGljIHZvaWQgRHVtcFVwdmFsdWVzKGNvbnN0IFByb3RvKiBmLCBEdW1wU3RhdGUqIEQpCit7CisgaW50IGksbj1mLT5zaXpldXB2YWx1ZXM7CisgRHVtcEludChuLEQpOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIER1bXBDaGFyKGYtPnVwdmFsdWVzW2ldLmluc3RhY2ssRCk7CisgIER1bXBDaGFyKGYtPnVwdmFsdWVzW2ldLmlkeCxEKTsKKyB9Cit9CisKK3N0YXRpYyB2b2lkIER1bXBEZWJ1Zyhjb25zdCBQcm90byogZiwgRHVtcFN0YXRlKiBEKQoreworIGludCBpLG47CisgRHVtcFN0cmluZygoRC0+c3RyaXApID8gTlVMTCA6IGYtPnNvdXJjZSxEKTsKKyBuPSAoRC0+c3RyaXApID8gMCA6IGYtPnNpemVsaW5laW5mbzsKKyBEdW1wVmVjdG9yKGYtPmxpbmVpbmZvLG4sc2l6ZW9mKGludCksRCk7Cisgbj0gKEQtPnN0cmlwKSA/IDAgOiBmLT5zaXplbG9jdmFyczsKKyBEdW1wSW50KG4sRCk7CisgZm9yIChpPTA7IGk8bjsgaSsrKQorIHsKKyAgRHVtcFN0cmluZyhmLT5sb2N2YXJzW2ldLnZhcm5hbWUsRCk7CisgIER1bXBJbnQoZi0+bG9jdmFyc1tpXS5zdGFydHBjLEQpOworICBEdW1wSW50KGYtPmxvY3ZhcnNbaV0uZW5kcGMsRCk7CisgfQorIG49IChELT5zdHJpcCkgPyAwIDogZi0+c2l6ZXVwdmFsdWVzOworIER1bXBJbnQobixEKTsKKyBmb3IgKGk9MDsgaTxuOyBpKyspIER1bXBTdHJpbmcoZi0+dXB2YWx1ZXNbaV0ubmFtZSxEKTsKK30KKworc3RhdGljIHZvaWQgRHVtcEZ1bmN0aW9uKGNvbnN0IFByb3RvKiBmLCBEdW1wU3RhdGUqIEQpCit7CisgRHVtcEludChmLT5saW5lZGVmaW5lZCxEKTsKKyBEdW1wSW50KGYtPmxhc3RsaW5lZGVmaW5lZCxEKTsKKyBEdW1wQ2hhcihmLT5udW1wYXJhbXMsRCk7CisgRHVtcENoYXIoZi0+aXNfdmFyYXJnLEQpOworIER1bXBDaGFyKGYtPm1heHN0YWNrc2l6ZSxEKTsKKyBEdW1wQ29kZShmLEQpOworIER1bXBDb25zdGFudHMoZixEKTsKKyBEdW1wVXB2YWx1ZXMoZixEKTsKKyBEdW1wRGVidWcoZixEKTsKK30KKworc3RhdGljIHZvaWQgRHVtcEhlYWRlcihEdW1wU3RhdGUqIEQpCit7CisgbHVfYnl0ZSBoW0xVQUNfSEVBREVSU0laRV07CisgbHVhVV9oZWFkZXIoaCk7CisgRHVtcEJsb2NrKGgsTFVBQ19IRUFERVJTSVpFLEQpOworfQorCisvKgorKiogZHVtcCBMdWEgZnVuY3Rpb24gYXMgcHJlY29tcGlsZWQgY2h1bmsKKyovCitpbnQgbHVhVV9kdW1wIChsdWFfU3RhdGUqIEwsIGNvbnN0IFByb3RvKiBmLCBsdWFfV3JpdGVyIHcsIHZvaWQqIGRhdGEsIGludCBzdHJpcCkKK3sKKyBEdW1wU3RhdGUgRDsKKyBELkw9TDsKKyBELndyaXRlcj13OworIEQuZGF0YT1kYXRhOworIEQuc3RyaXA9c3RyaXA7CisgRC5zdGF0dXM9MDsKKyBEdW1wSGVhZGVyKCZEKTsKKyBEdW1wRnVuY3Rpb24oZiwmRCk7CisgcmV0dXJuIEQuc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sZnMuYyBiL2NvbTMyL2x1YS9zcmMvbGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkYTcyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbGZzLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisqKiBDb2RlIGltcGxlbWVudGluZyByZWFkIG9ubHkgZnVuY3Rpb25hbGl0eSBjb3BpZWQgZnJvbQorKiogc3JjL2xmcy5jIGF0IGNvbW1pdCAyZmQ5ODljZDZjNzc3NTgzYmUxYzkzNjE2MDE4YzU1YjJjYmIxYmNmOgorKioKKyoqIEx1YUZpbGVTeXN0ZW0gMS42LjIKKyoqIENvcHlyaWdodCAyMDAzLTIwMTQgS2VwbGVyIFByb2plY3QKKyoqIGh0dHA6Ly93d3cua2VwbGVycHJvamVjdC5vcmcvbHVhZmlsZXN5c3RlbQorKioKKyoqIEZpbGUgc3lzdGVtIG1hbmlwdWxhdGlvbiBsaWJyYXJ5LgorKiogVGhpcyBsaWJyYXJ5IG9mZmVycyB0aGVzZSBmdW5jdGlvbnM6CisqKiBsZnMuYXR0cmlidXRlcyAoZmlsZXBhdGggWywgYXR0cmlidXRlbmFtZV0pCisqKiBsZnMuY2hkaXIgKHBhdGgpCisqKiBsZnMuY3VycmVudGRpciAoKQorKiogbGZzLmRpciAocGF0aCkKKyoqCisqKiAkSWQ6IGxmcy5jLHYgMS42MSAyMDA5LzA3LzA0IDAyOjEwOjE2IG1hc2NhcmVuaGFzIEV4cCAkCisqLworCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJsdWEuaCIKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKyNkZWZpbmUgY2hkaXJfZXJyb3IJc3RyZXJyb3IoZXJybm8pCisKKy8qIFNpemUgb2YgcGF0aCBidWZmZXIgc3RyaW5nLCBzdG9sZW4gZnJvbSBwd2QuYyAqLworI2lmbmRlZiBQQVRIX01BWAorIyAgaWZkZWYgTkFNRV9NQVgKKyMgICAgZGVmaW5lIFBBVEhfTUFYICAgTkFNRV9NQVgKKyMgIGVsaWYgRklMRU5BTUVfTUFYCisjICAgIGRlZmluZSBQQVRIX01BWCAgIEZJTEVOQU1FX01BWAorIyAgZWxzZQorIyAgICBkZWZpbmUgUEFUSF9NQVggICAyNTYKKyMgIGVuZGlmICAgICAgIC8qIE5BTUVfTUFYICovCisjZW5kaWYgLyogUEFUSF9NQVggKi8KKworCisjZGVmaW5lIERJUl9NRVRBVEFCTEUgImRpcmVjdG9yeSBtZXRhdGFibGUiCit0eXBlZGVmIHN0cnVjdCBkaXJfZGF0YSB7CisgICAgICAgIGludCAgY2xvc2VkOworICAgICAgICBESVIgKmRpcjsKK30gZGlyX2RhdGE7CisKKworI2RlZmluZSBTVEFUX1NUUlVDVCBzdHJ1Y3Qgc3RhdAorI2RlZmluZSBTVEFUX0ZVTkMgc3RhdF92aWFfZnN0YXQKKworLyogRW11bGF0ZSBzdGF0IHZpYSBmc3RhdCAqLworaW50IHN0YXRfdmlhX2ZzdGF0IChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqYnVmKQoreworICBpbnQgZmQgPSBvcGVuIChwYXRoLCBPX1JET05MWSk7CisgIGlmIChmZCA9PSAtMSkgeworICAgIERJUiAqZGlyID0gb3BlbmRpciAocGF0aCk7CisgICAgaWYgKCFkaXIpIHJldHVybiAtMTsKKyAgICBjbG9zZWRpciAoZGlyKTsKKyAgICBidWYtPnN0X21vZGU9U19JRkRJUjsKKyAgICBidWYtPnN0X3NpemU9MDsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZnN0YXQgKGZkLCBidWYpID09IC0xKSB7CisgICAgaW50IGVyciA9IGVycm5vOworICAgIGNsb3NlIChmZCk7CisgICAgZXJybm8gPSBlcnI7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNsb3NlIChmZCk7CisgIHJldHVybiAwOworfQorCisvKgorKiogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSB3b3JraW5nIChjdXJyZW50KSBkaXJlY3RvcnkKKyovCitzdGF0aWMgaW50IGNoYW5nZV9kaXIgKGx1YV9TdGF0ZSAqTCkgeworICAgICAgICBjb25zdCBjaGFyICpwYXRoID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgICAgICAgaWYgKGNoZGlyKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgbHVhX3B1c2huaWwgKEwpOworICAgICAgICAgICAgICAgIGx1YV9wdXNoZnN0cmluZyAoTCwiVW5hYmxlIHRvIGNoYW5nZSB3b3JraW5nIGRpcmVjdG9yeSB0byAnJXMnXG4lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgY2hkaXJfZXJyb3IpOworICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGx1YV9wdXNoYm9vbGVhbiAoTCwgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KK30KKworCisvKgorKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorKiogSWYgdW5hYmxlIHRvIGdldCB0aGUgY3VycmVudCBkaXJlY3RvcnksIGl0IHJldHVybnMgbmlsCisqKiBhbmQgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IKKyovCitzdGF0aWMgaW50IGdldF9kaXIgKGx1YV9TdGF0ZSAqTCkgeworICBjaGFyICpwYXRoOworICAvKiBQYXNzaW5nIChOVUxMLCAwKSBpcyBub3QgZ3VhcmFudGVlZCB0byB3b3JrLiBVc2UgYSB0ZW1wIGJ1ZmZlciBhbmQgc2l6ZSBpbnN0ZWFkLiAqLworICBjaGFyIGJ1ZltQQVRIX01BWF07CisgIGlmICgocGF0aCA9IGdldGN3ZChidWYsIFBBVEhfTUFYKSkgPT0gTlVMTCkgeworICAgIGx1YV9wdXNobmlsKEwpOworICAgIGx1YV9wdXNoc3RyaW5nKEwsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgZWxzZSB7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgcGF0aCk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworCisvKgorKiogRGlyZWN0b3J5IGl0ZXJhdG9yCisqLworc3RhdGljIGludCBkaXJfaXRlciAobHVhX1N0YXRlICpMKSB7CisgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudHJ5OworICAgICAgICBkaXJfZGF0YSAqZCA9IChkaXJfZGF0YSAqKWx1YUxfY2hlY2t1ZGF0YSAoTCwgMSwgRElSX01FVEFUQUJMRSk7CisgICAgICAgIGx1YUxfYXJnY2hlY2sgKEwsIGQtPmNsb3NlZCA9PSAwLCAxLCAiY2xvc2VkIGRpcmVjdG9yeSIpOworICAgICAgICBpZiAoKGVudHJ5ID0gcmVhZGRpciAoZC0+ZGlyKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGx1YV9wdXNoc3RyaW5nIChMLCBlbnRyeS0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBubyBtb3JlIGVudHJpZXMgPT4gY2xvc2UgZGlyZWN0b3J5ICovCisgICAgICAgICAgICAgICAgY2xvc2VkaXIgKGQtPmRpcik7CisgICAgICAgICAgICAgICAgZC0+Y2xvc2VkID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorfQorCisKKy8qCisqKiBDbG9zZXMgZGlyZWN0b3J5IGl0ZXJhdG9ycworKi8KK3N0YXRpYyBpbnQgZGlyX2Nsb3NlIChsdWFfU3RhdGUgKkwpIHsKKyAgICAgICAgZGlyX2RhdGEgKmQgPSAoZGlyX2RhdGEgKilsdWFfdG91c2VyZGF0YSAoTCwgMSk7CisgICAgICAgIGlmICghZC0+Y2xvc2VkICYmIGQtPmRpcikgeworICAgICAgICAgICAgICAgIGNsb3NlZGlyIChkLT5kaXIpOworICAgICAgICB9CisgICAgICAgIGQtPmNsb3NlZCA9IDE7CisgICAgICAgIHJldHVybiAwOworfQorCisKKy8qCisqKiBGYWN0b3J5IG9mIGRpcmVjdG9yeSBpdGVyYXRvcnMKKyovCitzdGF0aWMgaW50IGRpcl9pdGVyX2ZhY3RvcnkgKGx1YV9TdGF0ZSAqTCkgeworICAgICAgICBjb25zdCBjaGFyICpwYXRoID0gbHVhTF9jaGVja3N0cmluZyAoTCwgMSk7CisgICAgICAgIGRpcl9kYXRhICpkOworICAgICAgICBsdWFfcHVzaGNmdW5jdGlvbiAoTCwgZGlyX2l0ZXIpOworICAgICAgICBkID0gKGRpcl9kYXRhICopIGx1YV9uZXd1c2VyZGF0YSAoTCwgc2l6ZW9mKGRpcl9kYXRhKSk7CisgICAgICAgIGx1YUxfZ2V0bWV0YXRhYmxlIChMLCBESVJfTUVUQVRBQkxFKTsKKyAgICAgICAgbHVhX3NldG1ldGF0YWJsZSAoTCwgLTIpOworICAgICAgICBkLT5jbG9zZWQgPSAwOworICAgICAgICBkLT5kaXIgPSBvcGVuZGlyIChwYXRoKTsKKyAgICAgICAgaWYgKGQtPmRpciA9PSBOVUxMKQorICAgICAgICAgIGx1YUxfZXJyb3IgKEwsICJjYW5ub3Qgb3BlbiAlczogJXMiLCBwYXRoLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIDI7Cit9CisKKworLyoKKyoqIENyZWF0ZXMgZGlyZWN0b3J5IG1ldGF0YWJsZS4KKyovCitzdGF0aWMgaW50IGRpcl9jcmVhdGVfbWV0YSAobHVhX1N0YXRlICpMKSB7CisgICAgICAgIGx1YUxfbmV3bWV0YXRhYmxlIChMLCBESVJfTUVUQVRBQkxFKTsKKworICAgICAgICAvKiBNZXRob2QgdGFibGUgKi8KKyAgICAgICAgbHVhX25ld3RhYmxlKEwpOworICAgICAgICBsdWFfcHVzaGNmdW5jdGlvbiAoTCwgZGlyX2l0ZXIpOworICAgICAgICBsdWFfc2V0ZmllbGQoTCwgLTIsICJuZXh0Iik7CisgICAgICAgIGx1YV9wdXNoY2Z1bmN0aW9uIChMLCBkaXJfY2xvc2UpOworICAgICAgICBsdWFfc2V0ZmllbGQoTCwgLTIsICJjbG9zZSIpOworCisgICAgICAgIC8qIE1ldGFtZXRob2RzICovCisgICAgICAgIGx1YV9zZXRmaWVsZChMLCAtMiwgIl9faW5kZXgiKTsKKyAgICAgICAgbHVhX3B1c2hjZnVuY3Rpb24gKEwsIGRpcl9jbG9zZSk7CisgICAgICAgIGx1YV9zZXRmaWVsZCAoTCwgLTIsICJfX2djIik7CisgICAgICAgIHJldHVybiAxOworfQorCisKKy8qCisqKiBDb252ZXJ0IHRoZSBpbm9kZSBwcm90ZWN0aW9uIG1vZGUgdG8gYSBzdHJpbmcuCisqLworc3RhdGljIGNvbnN0IGNoYXIgKm1vZGUyc3RyaW5nIChtb2RlX3QgbW9kZSkgeworICBpZiAoIFNfSVNSRUcobW9kZSkgKQorICAgIHJldHVybiAiZmlsZSI7CisgIGVsc2UgaWYgKCBTX0lTRElSKG1vZGUpICkKKyAgICByZXR1cm4gImRpcmVjdG9yeSI7CisgIGVsc2UgaWYgKCBTX0lTTE5LKG1vZGUpICkKKyAgICAgICAgcmV0dXJuICJsaW5rIjsKKyAgZWxzZSBpZiAoIFNfSVNTT0NLKG1vZGUpICkKKyAgICByZXR1cm4gInNvY2tldCI7CisgIGVsc2UgaWYgKCBTX0lTRklGTyhtb2RlKSApCisgICAgICAgIHJldHVybiAibmFtZWQgcGlwZSI7CisgIGVsc2UgaWYgKCBTX0lTQ0hSKG1vZGUpICkKKyAgICAgICAgcmV0dXJuICJjaGFyIGRldmljZSI7CisgIGVsc2UgaWYgKCBTX0lTQkxLKG1vZGUpICkKKyAgICAgICAgcmV0dXJuICJibG9jayBkZXZpY2UiOworICBlbHNlCisgICAgICAgIHJldHVybiAib3RoZXIiOworfQorCisKKy8qIGlub2RlIHByb3RlY3Rpb24gbW9kZSAqLworc3RhdGljIHZvaWQgcHVzaF9zdF9tb2RlIChsdWFfU3RhdGUgKkwsIFNUQVRfU1RSVUNUICppbmZvKSB7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nIChMLCBtb2RlMnN0cmluZyAoaW5mby0+c3RfbW9kZSkpOworfQorLyogZmlsZSBzaXplLCBpbiBieXRlcyAqLworc3RhdGljIHZvaWQgcHVzaF9zdF9zaXplIChsdWFfU3RhdGUgKkwsIFNUQVRfU1RSVUNUICppbmZvKSB7CisgICAgICAgIGx1YV9wdXNobnVtYmVyIChMLCAobHVhX051bWJlcilpbmZvLT5zdF9zaXplKTsKK30KK3N0YXRpYyB2b2lkIHB1c2hfaW52YWxpZCAobHVhX1N0YXRlICpMLCBTVEFUX1NUUlVDVCAqaW5mbykgeworICBsdWFMX2Vycm9yKEwsICJpbnZhbGlkIGF0dHJpYnV0ZSBuYW1lIik7CisgIGluZm8tPnN0X3NpemUgPSAwOyAvKiBuZXZlciByZWFjaGVkICovCit9CisKK3R5cGVkZWYgdm9pZCAoKl9wdXNoX2Z1bmN0aW9uKSAobHVhX1N0YXRlICpMLCBTVEFUX1NUUlVDVCAqaW5mbyk7CisKK3N0cnVjdCBfc3RhdF9tZW1iZXJzIHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgX3B1c2hfZnVuY3Rpb24gcHVzaDsKK307CisKK3N0cnVjdCBfc3RhdF9tZW1iZXJzIG1lbWJlcnNbXSA9IHsKKyAgICAgICAgeyAibW9kZSIsICAgICAgICAgcHVzaF9zdF9tb2RlIH0sCisgICAgICAgIHsgInNpemUiLCAgICAgICAgIHB1c2hfc3Rfc2l6ZSB9LAorICAgICAgICB7IE5VTEwsIHB1c2hfaW52YWxpZCB9Cit9OworCisvKgorKiogR2V0IGZpbGUgb3Igc3ltYm9saWMgbGluayBpbmZvcm1hdGlvbgorKi8KK3N0YXRpYyBpbnQgX2ZpbGVfaW5mb18gKGx1YV9TdGF0ZSAqTCwgaW50ICgqc3QpKGNvbnN0IGNoYXIqLCBTVEFUX1NUUlVDVCopKSB7CisgICAgICAgIGludCBpOworICAgICAgICBTVEFUX1NUUlVDVCBpbmZvOworICAgICAgICBjb25zdCBjaGFyICpmaWxlID0gbHVhTF9jaGVja3N0cmluZyAoTCwgMSk7CisKKyAgICAgICAgaWYgKHN0KGZpbGUsICZpbmZvKSkgeworICAgICAgICAgICAgICAgIGx1YV9wdXNobmlsIChMKTsKKyAgICAgICAgICAgICAgICBsdWFfcHVzaGZzdHJpbmcgKEwsICJjYW5ub3Qgb2J0YWluIGluZm9ybWF0aW9uIGZyb20gZmlsZSBgJXMnIiwgZmlsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGx1YV9pc3N0cmluZyAoTCwgMikpIHsKKyAgICAgICAgICAgICAgICBpbnQgdjsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZW1iZXIgPSBsdWFfdG9zdHJpbmcgKEwsIDIpOworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAgKG1lbWJlciwgIm1vZGUiKSA9PSAwKSB2ID0gMDsKKyNpZm5kZWYgX1dJTjMyCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChtZW1iZXIsICJibG9ja3MiKSAgPT0gMCkgdiA9IDExOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobWVtYmVyLCAiYmxrc2l6ZSIpID09IDApIHYgPSAxMjsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGVsc2UgLyogbG9vayBmb3IgbWVtYmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHYgPSAxOyBtZW1iZXJzW3ZdLm5hbWU7IHYrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCptZW1iZXJzW3ZdLm5hbWUgPT0gKm1lbWJlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBwdXNoIG1lbWJlciB2YWx1ZSBhbmQgcmV0dXJuICovCisgICAgICAgICAgICAgICAgbWVtYmVyc1t2XS5wdXNoIChMLCAmaW5mbyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoIWx1YV9pc3RhYmxlIChMLCAyKSkKKyAgICAgICAgICAgICAgICAvKiBjcmVhdGVzIGEgdGFibGUgaWYgbm9uZSBpcyBnaXZlbiAqLworICAgICAgICAgICAgICAgIGx1YV9uZXd0YWJsZSAoTCk7CisgICAgICAgIC8qIHN0b3JlcyBhbGwgbWVtYmVycyBpbiB0YWJsZSBvbiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgICAgIGZvciAoaSA9IDA7IG1lbWJlcnNbaV0ubmFtZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbHVhX3B1c2hzdHJpbmcgKEwsIG1lbWJlcnNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgbWVtYmVyc1tpXS5wdXNoIChMLCAmaW5mbyk7CisgICAgICAgICAgICAgICAgbHVhX3Jhd3NldCAoTCwgLTMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworfQorCisKKy8qCisqKiBHZXQgZmlsZSBpbmZvcm1hdGlvbiB1c2luZyBzdGF0LgorKi8KK3N0YXRpYyBpbnQgZmlsZV9pbmZvIChsdWFfU3RhdGUgKkwpIHsKKyAgICAgICAgcmV0dXJuIF9maWxlX2luZm9fIChMLCBTVEFUX0ZVTkMpOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgZnNsaWJbXSA9IHsKKyAgICAgICAgeyJhdHRyaWJ1dGVzIiwgZmlsZV9pbmZvfSwKKyAgICAgICAgeyJjaGRpciIsIGNoYW5nZV9kaXJ9LAorICAgICAgICB7ImN1cnJlbnRkaXIiLCBnZXRfZGlyfSwKKyAgICAgICAgeyJkaXIiLCBkaXJfaXRlcl9mYWN0b3J5fSwKKyAgICAgICAge05VTEwsIE5VTEx9LAorfTsKKworTFVBTElCX0FQSSBpbnQgbHVhb3Blbl9sZnMgKGx1YV9TdGF0ZSAqTCkgeworICBkaXJfY3JlYXRlX21ldGEgKEwpOworICBsdWFMX25ld2xpYiAoTCwgZnNsaWIpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGZ1bmMuYyBiL2NvbTMyL2x1YS9zcmMvbGZ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTBlMTUyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sZnVuYy5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorKiogJElkOiBsZnVuYy5jLHYgMi4zMC4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBBdXhpbGlhcnkgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgcHJvdG90eXBlcyBhbmQgY2xvc3VyZXMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBsZnVuY19jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxmdW5jLmgiCisjaW5jbHVkZSAibGdjLmgiCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKworCisKK0Nsb3N1cmUgKmx1YUZfbmV3Q2Nsb3N1cmUgKGx1YV9TdGF0ZSAqTCwgaW50IG4pIHsKKyAgQ2xvc3VyZSAqYyA9ICZsdWFDX25ld29iaihMLCBMVUFfVENDTCwgc2l6ZUNjbG9zdXJlKG4pLCBOVUxMLCAwKS0+Y2w7CisgIGMtPmMubnVwdmFsdWVzID0gY2FzdF9ieXRlKG4pOworICByZXR1cm4gYzsKK30KKworCitDbG9zdXJlICpsdWFGX25ld0xjbG9zdXJlIChsdWFfU3RhdGUgKkwsIGludCBuKSB7CisgIENsb3N1cmUgKmMgPSAmbHVhQ19uZXdvYmooTCwgTFVBX1RMQ0wsIHNpemVMY2xvc3VyZShuKSwgTlVMTCwgMCktPmNsOworICBjLT5sLnAgPSBOVUxMOworICBjLT5sLm51cHZhbHVlcyA9IGNhc3RfYnl0ZShuKTsKKyAgd2hpbGUgKG4tLSkgYy0+bC51cHZhbHNbbl0gPSBOVUxMOworICByZXR1cm4gYzsKK30KKworCitVcFZhbCAqbHVhRl9uZXd1cHZhbCAobHVhX1N0YXRlICpMKSB7CisgIFVwVmFsICp1diA9ICZsdWFDX25ld29iaihMLCBMVUFfVFVQVkFMLCBzaXplb2YoVXBWYWwpLCBOVUxMLCAwKS0+dXY7CisgIHV2LT52ID0gJnV2LT51LnZhbHVlOworICBzZXRuaWx2YWx1ZSh1di0+dik7CisgIHJldHVybiB1djsKK30KKworCitVcFZhbCAqbHVhRl9maW5kdXB2YWwgKGx1YV9TdGF0ZSAqTCwgU3RrSWQgbGV2ZWwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgR0NPYmplY3QgKipwcCA9ICZMLT5vcGVudXB2YWw7CisgIFVwVmFsICpwOworICBVcFZhbCAqdXY7CisgIHdoaWxlICgqcHAgIT0gTlVMTCAmJiAocCA9IGdjbzJ1digqcHApKS0+diA+PSBsZXZlbCkgeworICAgIEdDT2JqZWN0ICpvID0gb2JqMmdjbyhwKTsKKyAgICBsdWFfYXNzZXJ0KHAtPnYgIT0gJnAtPnUudmFsdWUpOworICAgIGx1YV9hc3NlcnQoIWlzb2xkKG8pIHx8IGlzb2xkKG9iajJnY28oTCkpKTsKKyAgICBpZiAocC0+diA9PSBsZXZlbCkgeyAgLyogZm91bmQgYSBjb3JyZXNwb25kaW5nIHVwdmFsdWU/ICovCisgICAgICBpZiAoaXNkZWFkKGcsIG8pKSAgLyogaXMgaXQgZGVhZD8gKi8KKyAgICAgICAgY2hhbmdld2hpdGUobyk7ICAvKiByZXN1cnJlY3QgaXQgKi8KKyAgICAgIHJldHVybiBwOworICAgIH0KKyAgICBwcCA9ICZwLT5uZXh0OworICB9CisgIC8qIG5vdCBmb3VuZDogY3JlYXRlIGEgbmV3IG9uZSAqLworICB1diA9ICZsdWFDX25ld29iaihMLCBMVUFfVFVQVkFMLCBzaXplb2YoVXBWYWwpLCBwcCwgMCktPnV2OworICB1di0+diA9IGxldmVsOyAgLyogY3VycmVudCB2YWx1ZSBsaXZlcyBpbiB0aGUgc3RhY2sgKi8KKyAgdXYtPnUubC5wcmV2ID0gJmctPnV2aGVhZDsgIC8qIGRvdWJsZSBsaW5rIGl0IGluIGB1dmhlYWQnIGxpc3QgKi8KKyAgdXYtPnUubC5uZXh0ID0gZy0+dXZoZWFkLnUubC5uZXh0OworICB1di0+dS5sLm5leHQtPnUubC5wcmV2ID0gdXY7CisgIGctPnV2aGVhZC51LmwubmV4dCA9IHV2OworICBsdWFfYXNzZXJ0KHV2LT51LmwubmV4dC0+dS5sLnByZXYgPT0gdXYgJiYgdXYtPnUubC5wcmV2LT51LmwubmV4dCA9PSB1dik7CisgIHJldHVybiB1djsKK30KKworCitzdGF0aWMgdm9pZCB1bmxpbmt1cHZhbCAoVXBWYWwgKnV2KSB7CisgIGx1YV9hc3NlcnQodXYtPnUubC5uZXh0LT51LmwucHJldiA9PSB1diAmJiB1di0+dS5sLnByZXYtPnUubC5uZXh0ID09IHV2KTsKKyAgdXYtPnUubC5uZXh0LT51LmwucHJldiA9IHV2LT51LmwucHJldjsgIC8qIHJlbW92ZSBmcm9tIGB1dmhlYWQnIGxpc3QgKi8KKyAgdXYtPnUubC5wcmV2LT51LmwubmV4dCA9IHV2LT51LmwubmV4dDsKK30KKworCit2b2lkIGx1YUZfZnJlZXVwdmFsIChsdWFfU3RhdGUgKkwsIFVwVmFsICp1dikgeworICBpZiAodXYtPnYgIT0gJnV2LT51LnZhbHVlKSAgLyogaXMgaXQgb3Blbj8gKi8KKyAgICB1bmxpbmt1cHZhbCh1dik7ICAvKiByZW1vdmUgZnJvbSBvcGVuIGxpc3QgKi8KKyAgbHVhTV9mcmVlKEwsIHV2KTsgIC8qIGZyZWUgdXB2YWx1ZSAqLworfQorCisKK3ZvaWQgbHVhRl9jbG9zZSAobHVhX1N0YXRlICpMLCBTdGtJZCBsZXZlbCkgeworICBVcFZhbCAqdXY7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIHdoaWxlIChMLT5vcGVudXB2YWwgIT0gTlVMTCAmJiAodXYgPSBnY28ydXYoTC0+b3BlbnVwdmFsKSktPnYgPj0gbGV2ZWwpIHsKKyAgICBHQ09iamVjdCAqbyA9IG9iajJnY28odXYpOworICAgIGx1YV9hc3NlcnQoIWlzYmxhY2sobykgJiYgdXYtPnYgIT0gJnV2LT51LnZhbHVlKTsKKyAgICBMLT5vcGVudXB2YWwgPSB1di0+bmV4dDsgIC8qIHJlbW92ZSBmcm9tIGBvcGVuJyBsaXN0ICovCisgICAgaWYgKGlzZGVhZChnLCBvKSkKKyAgICAgIGx1YUZfZnJlZXVwdmFsKEwsIHV2KTsgIC8qIGZyZWUgdXB2YWx1ZSAqLworICAgIGVsc2UgeworICAgICAgdW5saW5rdXB2YWwodXYpOyAgLyogcmVtb3ZlIHVwdmFsdWUgZnJvbSAndXZoZWFkJyBsaXN0ICovCisgICAgICBzZXRvYmooTCwgJnV2LT51LnZhbHVlLCB1di0+dik7ICAvKiBtb3ZlIHZhbHVlIHRvIHVwdmFsdWUgc2xvdCAqLworICAgICAgdXYtPnYgPSAmdXYtPnUudmFsdWU7ICAvKiBub3cgY3VycmVudCB2YWx1ZSBsaXZlcyBoZXJlICovCisgICAgICBnY2gobyktPm5leHQgPSBnLT5hbGxnYzsgIC8qIGxpbmsgdXB2YWx1ZSBpbnRvICdhbGxnYycgbGlzdCAqLworICAgICAgZy0+YWxsZ2MgPSBvOworICAgICAgbHVhQ19jaGVja3VwdmFsY29sb3IoZywgdXYpOworICAgIH0KKyAgfQorfQorCisKK1Byb3RvICpsdWFGX25ld3Byb3RvIChsdWFfU3RhdGUgKkwpIHsKKyAgUHJvdG8gKmYgPSAmbHVhQ19uZXdvYmooTCwgTFVBX1RQUk9UTywgc2l6ZW9mKFByb3RvKSwgTlVMTCwgMCktPnA7CisgIGYtPmsgPSBOVUxMOworICBmLT5zaXplayA9IDA7CisgIGYtPnAgPSBOVUxMOworICBmLT5zaXplcCA9IDA7CisgIGYtPmNvZGUgPSBOVUxMOworICBmLT5jYWNoZSA9IE5VTEw7CisgIGYtPnNpemVjb2RlID0gMDsKKyAgZi0+bGluZWluZm8gPSBOVUxMOworICBmLT5zaXplbGluZWluZm8gPSAwOworICBmLT51cHZhbHVlcyA9IE5VTEw7CisgIGYtPnNpemV1cHZhbHVlcyA9IDA7CisgIGYtPm51bXBhcmFtcyA9IDA7CisgIGYtPmlzX3ZhcmFyZyA9IDA7CisgIGYtPm1heHN0YWNrc2l6ZSA9IDA7CisgIGYtPmxvY3ZhcnMgPSBOVUxMOworICBmLT5zaXplbG9jdmFycyA9IDA7CisgIGYtPmxpbmVkZWZpbmVkID0gMDsKKyAgZi0+bGFzdGxpbmVkZWZpbmVkID0gMDsKKyAgZi0+c291cmNlID0gTlVMTDsKKyAgcmV0dXJuIGY7Cit9CisKKwordm9pZCBsdWFGX2ZyZWVwcm90byAobHVhX1N0YXRlICpMLCBQcm90byAqZikgeworICBsdWFNX2ZyZWVhcnJheShMLCBmLT5jb2RlLCBmLT5zaXplY29kZSk7CisgIGx1YU1fZnJlZWFycmF5KEwsIGYtPnAsIGYtPnNpemVwKTsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgZi0+aywgZi0+c2l6ZWspOworICBsdWFNX2ZyZWVhcnJheShMLCBmLT5saW5laW5mbywgZi0+c2l6ZWxpbmVpbmZvKTsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgZi0+bG9jdmFycywgZi0+c2l6ZWxvY3ZhcnMpOworICBsdWFNX2ZyZWVhcnJheShMLCBmLT51cHZhbHVlcywgZi0+c2l6ZXVwdmFsdWVzKTsKKyAgbHVhTV9mcmVlKEwsIGYpOworfQorCisKKy8qCisqKiBMb29rIGZvciBuLXRoIGxvY2FsIHZhcmlhYmxlIGF0IGxpbmUgYGxpbmUnIGluIGZ1bmN0aW9uIGBmdW5jJy4KKyoqIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQuCisqLworY29uc3QgY2hhciAqbHVhRl9nZXRsb2NhbG5hbWUgKGNvbnN0IFByb3RvICpmLCBpbnQgbG9jYWxfbnVtYmVyLCBpbnQgcGMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGk8Zi0+c2l6ZWxvY3ZhcnMgJiYgZi0+bG9jdmFyc1tpXS5zdGFydHBjIDw9IHBjOyBpKyspIHsKKyAgICBpZiAocGMgPCBmLT5sb2N2YXJzW2ldLmVuZHBjKSB7ICAvKiBpcyB2YXJpYWJsZSBhY3RpdmU/ICovCisgICAgICBsb2NhbF9udW1iZXItLTsKKyAgICAgIGlmIChsb2NhbF9udW1iZXIgPT0gMCkKKyAgICAgICAgcmV0dXJuIGdldHN0cihmLT5sb2N2YXJzW2ldLnZhcm5hbWUpOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsgIC8qIG5vdCBmb3VuZCAqLworfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xmdW5jLmggYi9jb20zMi9sdWEvc3JjL2xmdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwZDNhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbGZ1bmMuaApAQCAtMCwwICsxLDMzIEBACisvKgorKiogJElkOiBsZnVuYy5oLHYgMi44LjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIEF1eGlsaWFyeSBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBwcm90b3R5cGVzIGFuZCBjbG9zdXJlcworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbGZ1bmNfaAorI2RlZmluZSBsZnVuY19oCisKKworI2luY2x1ZGUgImxvYmplY3QuaCIKKworCisjZGVmaW5lIHNpemVDY2xvc3VyZShuKQkoY2FzdChpbnQsIHNpemVvZihDQ2xvc3VyZSkpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3QoaW50LCBzaXplb2YoVFZhbHVlKSooKG4pLTEpKSkKKworI2RlZmluZSBzaXplTGNsb3N1cmUobikJKGNhc3QoaW50LCBzaXplb2YoTENsb3N1cmUpKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0KGludCwgc2l6ZW9mKFRWYWx1ZSAqKSooKG4pLTEpKSkKKworCitMVUFJX0ZVTkMgUHJvdG8gKmx1YUZfbmV3cHJvdG8gKGx1YV9TdGF0ZSAqTCk7CitMVUFJX0ZVTkMgQ2xvc3VyZSAqbHVhRl9uZXdDY2xvc3VyZSAobHVhX1N0YXRlICpMLCBpbnQgbmVsZW1zKTsKK0xVQUlfRlVOQyBDbG9zdXJlICpsdWFGX25ld0xjbG9zdXJlIChsdWFfU3RhdGUgKkwsIGludCBuZWxlbXMpOworTFVBSV9GVU5DIFVwVmFsICpsdWFGX25ld3VwdmFsIChsdWFfU3RhdGUgKkwpOworTFVBSV9GVU5DIFVwVmFsICpsdWFGX2ZpbmR1cHZhbCAobHVhX1N0YXRlICpMLCBTdGtJZCBsZXZlbCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFGX2Nsb3NlIChsdWFfU3RhdGUgKkwsIFN0a0lkIGxldmVsKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUZfZnJlZXByb3RvIChsdWFfU3RhdGUgKkwsIFByb3RvICpmKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUZfZnJlZXVwdmFsIChsdWFfU3RhdGUgKkwsIFVwVmFsICp1dik7CitMVUFJX0ZVTkMgY29uc3QgY2hhciAqbHVhRl9nZXRsb2NhbG5hbWUgKGNvbnN0IFByb3RvICpmdW5jLCBpbnQgbG9jYWxfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGMpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sZ2MuYyBiL2NvbTMyL2x1YS9zcmMvbGdjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0NjBkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbGdjLmMKQEAgLTAsMCArMSwxMjIwIEBACisvKgorKiogJElkOiBsZ2MuYyx2IDIuMTQwLjEuMiAyMDEzLzA0LzI2IDE4OjIyOjA1IHJvYmVydG8gRXhwICQKKyoqIEdhcmJhZ2UgQ29sbGVjdG9yCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGxnY19jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxkZWJ1Zy5oIgorI2luY2x1ZGUgImxkby5oIgorI2luY2x1ZGUgImxmdW5jLmgiCisjaW5jbHVkZSAibGdjLmgiCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisjaW5jbHVkZSAibHRtLmgiCisKKworCisvKgorKiogY29zdCBvZiBzd2VlcGluZyBvbmUgZWxlbWVudCAodGhlIHNpemUgb2YgYSBzbWFsbCBvYmplY3QgZGl2aWRlZAorKiogYnkgc29tZSBhZGp1c3QgZm9yIHRoZSBzd2VlcCBzcGVlZCkKKyovCisjZGVmaW5lIEdDU1dFRVBDT1NUCSgoc2l6ZW9mKFRTdHJpbmcpICsgNCkgLyA0KQorCisvKiBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byBzd2VlcCBpbiBlYWNoIHNpbmdsZSBzdGVwICovCisjZGVmaW5lIEdDU1dFRVBNQVgJKGNhc3RfaW50KChHQ1NURVBTSVpFIC8gR0NTV0VFUENPU1QpIC8gNCkpCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGZpbmFsaXplcnMgdG8gY2FsbCBpbiBlYWNoIEdDIHN0ZXAgKi8KKyNkZWZpbmUgR0NGSU5BTElaRU5VTQk0CisKKworLyoKKyoqIG1hY3JvIHRvIGFkanVzdCAnc3RlcG11bCc6ICdzdGVwbXVsJyBpcyBhY3R1YWxseSB1c2VkIGxpa2UKKyoqICdzdGVwbXVsIC8gU1RFUE1VTEFESicgKHZhbHVlIGNob3NlbiBieSB0ZXN0cykKKyovCisjZGVmaW5lIFNURVBNVUxBREoJCTIwMAorCisKKy8qCisqKiBtYWNybyB0byBhZGp1c3QgJ3BhdXNlJzogJ3BhdXNlJyBpcyBhY3R1YWxseSB1c2VkIGxpa2UKKyoqICdwYXVzZSAvIFBBVVNFQURKJyAodmFsdWUgY2hvc2VuIGJ5IHRlc3RzKQorKi8KKyNkZWZpbmUgUEFVU0VBREoJCTEwMAorCisKKy8qCisqKiAnbWFrZXdoaXRlJyBlcmFzZXMgYWxsIGNvbG9yIGJpdHMgcGx1cyB0aGUgb2xkIGJpdCBhbmQgdGhlbgorKiogc2V0cyBvbmx5IHRoZSBjdXJyZW50IHdoaXRlIGJpdAorKi8KKyNkZWZpbmUgbWFza2NvbG9ycwkofihiaXQybWFzayhCTEFDS0JJVCwgT0xEQklUKSB8IFdISVRFQklUUykpCisjZGVmaW5lIG1ha2V3aGl0ZShnLHgpCVwKKyAoZ2NoKHgpLT5tYXJrZWQgPSBjYXN0X2J5dGUoKGdjaCh4KS0+bWFya2VkICYgbWFza2NvbG9ycykgfCBsdWFDX3doaXRlKGcpKSkKKworI2RlZmluZSB3aGl0ZTJncmF5KHgpCXJlc2V0Yml0cyhnY2goeCktPm1hcmtlZCwgV0hJVEVCSVRTKQorI2RlZmluZSBibGFjazJncmF5KHgpCXJlc2V0Yml0KGdjaCh4KS0+bWFya2VkLCBCTEFDS0JJVCkKKworCisjZGVmaW5lIGlzZmluYWxpemVkKHgpCQl0ZXN0Yml0KGdjaCh4KS0+bWFya2VkLCBGSU5BTElaRURCSVQpCisKKyNkZWZpbmUgY2hlY2tkZWFka2V5KG4pCWx1YV9hc3NlcnQoIXR0aXNkZWFka2V5KGdrZXkobikpIHx8IHR0aXNuaWwoZ3ZhbChuKSkpCisKKworI2RlZmluZSBjaGVja2NvbnNpc3RlbmN5KG9iaikgIFwKKyAgbHVhX2xvbmdhc3NlcnQoIWlzY29sbGVjdGFibGUob2JqKSB8fCByaWdodHR0KG9iaikpCisKKworI2RlZmluZSBtYXJrdmFsdWUoZyxvKSB7IGNoZWNrY29uc2lzdGVuY3kobyk7IFwKKyAgaWYgKHZhbGlzd2hpdGUobykpIHJlYWxseW1hcmtvYmplY3QoZyxnY3ZhbHVlKG8pKTsgfQorCisjZGVmaW5lIG1hcmtvYmplY3QoZyx0KSB7IGlmICgodCkgJiYgaXN3aGl0ZShvYmoyZ2NvKHQpKSkgXAorCQlyZWFsbHltYXJrb2JqZWN0KGcsIG9iajJnY28odCkpOyB9CisKK3N0YXRpYyB2b2lkIHJlYWxseW1hcmtvYmplY3QgKGdsb2JhbF9TdGF0ZSAqZywgR0NPYmplY3QgKm8pOworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBHZW5lcmljIGZ1bmN0aW9ucworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCisvKgorKiogb25lIGFmdGVyIGxhc3QgZWxlbWVudCBpbiBhIGhhc2ggYXJyYXkKKyovCisjZGVmaW5lIGdub2RlbGFzdChoKQlnbm9kZShoLCBjYXN0KHNpemVfdCwgc2l6ZW5vZGUoaCkpKQorCisKKy8qCisqKiBsaW5rIHRhYmxlICdoJyBpbnRvIGxpc3QgcG9pbnRlZCBieSAncCcKKyovCisjZGVmaW5lIGxpbmt0YWJsZShoLHApCSgoaCktPmdjbGlzdCA9ICoocCksICoocCkgPSBvYmoyZ2NvKGgpKQorCisKKy8qCisqKiBpZiBrZXkgaXMgbm90IG1hcmtlZCwgbWFyayBpdHMgZW50cnkgYXMgZGVhZCAodGhlcmVmb3JlIHJlbW92aW5nIGl0CisqKiBmcm9tIHRoZSB0YWJsZSkKKyovCitzdGF0aWMgdm9pZCByZW1vdmVlbnRyeSAoTm9kZSAqbikgeworICBsdWFfYXNzZXJ0KHR0aXNuaWwoZ3ZhbChuKSkpOworICBpZiAodmFsaXN3aGl0ZShna2V5KG4pKSkKKyAgICBzZXRkZWFkdmFsdWUoZ2tleShuKSk7ICAvKiB1bnVzZWQgYW5kIHVubWFya2VkIGtleTsgcmVtb3ZlIGl0ICovCit9CisKKworLyoKKyoqIHRlbGxzIHdoZXRoZXIgYSBrZXkgb3IgdmFsdWUgY2FuIGJlIGNsZWFyZWQgZnJvbSBhIHdlYWsKKyoqIHRhYmxlLiBOb24tY29sbGVjdGFibGUgb2JqZWN0cyBhcmUgbmV2ZXIgcmVtb3ZlZCBmcm9tIHdlYWsKKyoqIHRhYmxlcy4gU3RyaW5ncyBiZWhhdmUgYXMgYHZhbHVlcycsIHNvIGFyZSBuZXZlciByZW1vdmVkIHRvby4gZm9yCisqKiBvdGhlciBvYmplY3RzOiBpZiByZWFsbHkgY29sbGVjdGVkLCBjYW5ub3Qga2VlcCB0aGVtOyBmb3Igb2JqZWN0cworKiogYmVpbmcgZmluYWxpemVkLCBrZWVwIHRoZW0gaW4ga2V5cywgYnV0IG5vdCBpbiB2YWx1ZXMKKyovCitzdGF0aWMgaW50IGlzY2xlYXJlZCAoZ2xvYmFsX1N0YXRlICpnLCBjb25zdCBUVmFsdWUgKm8pIHsKKyAgaWYgKCFpc2NvbGxlY3RhYmxlKG8pKSByZXR1cm4gMDsKKyAgZWxzZSBpZiAodHRpc3N0cmluZyhvKSkgeworICAgIG1hcmtvYmplY3QoZywgcmF3dHN2YWx1ZShvKSk7ICAvKiBzdHJpbmdzIGFyZSBgdmFsdWVzJywgc28gYXJlIG5ldmVyIHdlYWsgKi8KKyAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIHJldHVybiBpc3doaXRlKGdjdmFsdWUobykpOworfQorCisKKy8qCisqKiBiYXJyaWVyIHRoYXQgbW92ZXMgY29sbGVjdG9yIGZvcndhcmQsIHRoYXQgaXMsIG1hcmsgdGhlIHdoaXRlIG9iamVjdAorKiogYmVpbmcgcG9pbnRlZCBieSBhIGJsYWNrIG9iamVjdC4KKyovCit2b2lkIGx1YUNfYmFycmllcl8gKGx1YV9TdGF0ZSAqTCwgR0NPYmplY3QgKm8sIEdDT2JqZWN0ICp2KSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGx1YV9hc3NlcnQoaXNibGFjayhvKSAmJiBpc3doaXRlKHYpICYmICFpc2RlYWQoZywgdikgJiYgIWlzZGVhZChnLCBvKSk7CisgIGx1YV9hc3NlcnQoZy0+Z2NzdGF0ZSAhPSBHQ1NwYXVzZSk7CisgIGx1YV9hc3NlcnQoZ2NoKG8pLT50dCAhPSBMVUFfVFRBQkxFKTsKKyAgaWYgKGtlZXBpbnZhcmlhbnRvdXQoZykpICAvKiBtdXN0IGtlZXAgaW52YXJpYW50PyAqLworICAgIHJlYWxseW1hcmtvYmplY3QoZywgdik7ICAvKiByZXN0b3JlIGludmFyaWFudCAqLworICBlbHNlIHsgIC8qIHN3ZWVwIHBoYXNlICovCisgICAgbHVhX2Fzc2VydChpc3N3ZWVwcGhhc2UoZykpOworICAgIG1ha2V3aGl0ZShnLCBvKTsgIC8qIG1hcmsgbWFpbiBvYmouIGFzIHdoaXRlIHRvIGF2b2lkIG90aGVyIGJhcnJpZXJzICovCisgIH0KK30KKworCisvKgorKiogYmFycmllciB0aGF0IG1vdmVzIGNvbGxlY3RvciBiYWNrd2FyZCwgdGhhdCBpcywgbWFyayB0aGUgYmxhY2sgb2JqZWN0CisqKiBwb2ludGluZyB0byBhIHdoaXRlIG9iamVjdCBhcyBncmF5IGFnYWluLiAoQ3VycmVudCBpbXBsZW1lbnRhdGlvbgorKiogb25seSB3b3JrcyBmb3IgdGFibGVzOyBhY2Nlc3MgdG8gJ2djbGlzdCcgaXMgbm90IHVuaWZvcm0gYWNyb3NzCisqKiBkaWZmZXJlbnQgdHlwZXMuKQorKi8KK3ZvaWQgbHVhQ19iYXJyaWVyYmFja18gKGx1YV9TdGF0ZSAqTCwgR0NPYmplY3QgKm8pIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgbHVhX2Fzc2VydChpc2JsYWNrKG8pICYmICFpc2RlYWQoZywgbykgJiYgZ2NoKG8pLT50dCA9PSBMVUFfVFRBQkxFKTsKKyAgYmxhY2syZ3JheShvKTsgIC8qIG1ha2Ugb2JqZWN0IGdyYXkgKGFnYWluKSAqLworICBnY28ydChvKS0+Z2NsaXN0ID0gZy0+Z3JheWFnYWluOworICBnLT5ncmF5YWdhaW4gPSBvOworfQorCisKKy8qCisqKiBiYXJyaWVyIGZvciBwcm90b3R5cGVzLiBXaGVuIGNyZWF0aW5nIGZpcnN0IGNsb3N1cmUgKGNhY2hlIGlzCisqKiBOVUxMKSwgdXNlIGEgZm9yd2FyZCBiYXJyaWVyOyB0aGlzIG1heSBiZSB0aGUgb25seSBjbG9zdXJlIG9mIHRoZQorKiogcHJvdG90eXBlIChpZiBpdCBpcyBhICJyZWd1bGFyIiBmdW5jdGlvbiwgd2l0aCBhIHNpbmdsZSBpbnN0YW5jZSkKKyoqIGFuZCB0aGUgcHJvdG90eXBlIG1heSBiZSBiaWcsIHNvIGl0IGlzIGJldHRlciB0byBhdm9pZCB0cmF2ZXJzaW5nCisqKiBpdCBhZ2Fpbi4gT3RoZXJ3aXNlLCB1c2UgYSBiYWNrd2FyZCBiYXJyaWVyLCB0byBhdm9pZCBtYXJraW5nIGFsbAorKiogcG9zc2libGUgaW5zdGFuY2VzLgorKi8KK0xVQUlfRlVOQyB2b2lkIGx1YUNfYmFycmllcnByb3RvXyAobHVhX1N0YXRlICpMLCBQcm90byAqcCwgQ2xvc3VyZSAqYykgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBsdWFfYXNzZXJ0KGlzYmxhY2sob2JqMmdjbyhwKSkpOworICBpZiAocC0+Y2FjaGUgPT0gTlVMTCkgeyAgLyogZmlyc3QgdGltZT8gKi8KKyAgICBsdWFDX29iamJhcnJpZXIoTCwgcCwgYyk7CisgIH0KKyAgZWxzZSB7ICAvKiB1c2UgYSBiYWNrd2FyZCBiYXJyaWVyICovCisgICAgYmxhY2syZ3JheShvYmoyZ2NvKHApKTsgIC8qIG1ha2UgcHJvdG90eXBlIGdyYXkgKGFnYWluKSAqLworICAgIHAtPmdjbGlzdCA9IGctPmdyYXlhZ2FpbjsKKyAgICBnLT5ncmF5YWdhaW4gPSBvYmoyZ2NvKHApOworICB9Cit9CisKKworLyoKKyoqIGNoZWNrIGNvbG9yIChhbmQgaW52YXJpYW50cykgZm9yIGFuIHVwdmFsdWUgdGhhdCB3YXMgY2xvc2VkLAorKiogaS5lLiwgbW92ZWQgaW50byB0aGUgJ2FsbGdjJyBsaXN0CisqLwordm9pZCBsdWFDX2NoZWNrdXB2YWxjb2xvciAoZ2xvYmFsX1N0YXRlICpnLCBVcFZhbCAqdXYpIHsKKyAgR0NPYmplY3QgKm8gPSBvYmoyZ2NvKHV2KTsKKyAgbHVhX2Fzc2VydCghaXNibGFjayhvKSk7ICAvKiBvcGVuIHVwdmFsdWVzIGFyZSBuZXZlciBibGFjayAqLworICBpZiAoaXNncmF5KG8pKSB7CisgICAgaWYgKGtlZXBpbnZhcmlhbnQoZykpIHsKKyAgICAgIHJlc2V0b2xkYml0KG8pOyAgLyogc2VlIE1PVkUgT0xEIHJ1bGUgKi8KKyAgICAgIGdyYXkyYmxhY2sobyk7ICAvKiBpdCBpcyBiZWluZyB2aXNpdGVkIG5vdyAqLworICAgICAgbWFya3ZhbHVlKGcsIHV2LT52KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBsdWFfYXNzZXJ0KGlzc3dlZXBwaGFzZShnKSk7CisgICAgICBtYWtld2hpdGUoZywgbyk7CisgICAgfQorICB9Cit9CisKKworLyoKKyoqIGNyZWF0ZSBhIG5ldyBjb2xsZWN0YWJsZSBvYmplY3QgKHdpdGggZ2l2ZW4gdHlwZSBhbmQgc2l6ZSkgYW5kIGxpbmsKKyoqIGl0IHRvICcqbGlzdCcuICdvZmZzZXQnIHRlbGxzIGhvdyBtYW55IGJ5dGVzIHRvIGFsbG9jYXRlIGJlZm9yZSB0aGUKKyoqIG9iamVjdCBpdHNlbGYgKHVzZWQgb25seSBieSBzdGF0ZXMpLgorKi8KK0dDT2JqZWN0ICpsdWFDX25ld29iaiAobHVhX1N0YXRlICpMLCBpbnQgdHQsIHNpemVfdCBzeiwgR0NPYmplY3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0KSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGNoYXIgKnJhdyA9IGNhc3QoY2hhciAqLCBsdWFNX25ld29iamVjdChMLCBub3ZhcmlhbnQodHQpLCBzeikpOworICBHQ09iamVjdCAqbyA9IG9iajJnY28ocmF3ICsgb2Zmc2V0KTsKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICBsaXN0ID0gJmctPmFsbGdjOyAgLyogc3RhbmRhcmQgbGlzdCBmb3IgY29sbGVjdGFibGUgb2JqZWN0cyAqLworICBnY2gobyktPm1hcmtlZCA9IGx1YUNfd2hpdGUoZyk7CisgIGdjaChvKS0+dHQgPSB0dDsKKyAgZ2NoKG8pLT5uZXh0ID0gKmxpc3Q7CisgICpsaXN0ID0gbzsKKyAgcmV0dXJuIG87Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBNYXJrIGZ1bmN0aW9ucworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCisvKgorKiogbWFyayBhbiBvYmplY3QuIFVzZXJkYXRhLCBzdHJpbmdzLCBhbmQgY2xvc2VkIHVwdmFsdWVzIGFyZSB2aXNpdGVkCisqKiBhbmQgdHVybmVkIGJsYWNrIGhlcmUuIE90aGVyIG9iamVjdHMgYXJlIG1hcmtlZCBncmF5IGFuZCBhZGRlZAorKiogdG8gYXBwcm9wcmlhdGUgbGlzdCB0byBiZSB2aXNpdGVkIChhbmQgdHVybmVkIGJsYWNrKSBsYXRlci4gKE9wZW4KKyoqIHVwdmFsdWVzIGFyZSBhbHJlYWR5IGxpbmtlZCBpbiAnaGVhZHV2JyBsaXN0LikKKyovCitzdGF0aWMgdm9pZCByZWFsbHltYXJrb2JqZWN0IChnbG9iYWxfU3RhdGUgKmcsIEdDT2JqZWN0ICpvKSB7CisgIGx1X21lbSBzaXplOworICB3aGl0ZTJncmF5KG8pOworICBzd2l0Y2ggKGdjaChvKS0+dHQpIHsKKyAgICBjYXNlIExVQV9UU0hSU1RSOgorICAgIGNhc2UgTFVBX1RMTkdTVFI6IHsKKyAgICAgIHNpemUgPSBzaXplc3RyaW5nKGdjbzJ0cyhvKSk7CisgICAgICBicmVhazsgIC8qIG5vdGhpbmcgZWxzZSB0byBtYXJrOyBtYWtlIGl0IGJsYWNrICovCisgICAgfQorICAgIGNhc2UgTFVBX1RVU0VSREFUQTogeworICAgICAgVGFibGUgKm10ID0gZ2NvMnUobyktPm1ldGF0YWJsZTsKKyAgICAgIG1hcmtvYmplY3QoZywgbXQpOworICAgICAgbWFya29iamVjdChnLCBnY28ydShvKS0+ZW52KTsKKyAgICAgIHNpemUgPSBzaXpldWRhdGEoZ2NvMnUobykpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX1RVUFZBTDogeworICAgICAgVXBWYWwgKnV2ID0gZ2NvMnV2KG8pOworICAgICAgbWFya3ZhbHVlKGcsIHV2LT52KTsKKyAgICAgIGlmICh1di0+diAhPSAmdXYtPnUudmFsdWUpICAvKiBvcGVuPyAqLworICAgICAgICByZXR1cm47ICAvKiBvcGVuIHVwdmFsdWVzIHJlbWFpbiBncmF5ICovCisgICAgICBzaXplID0gc2l6ZW9mKFVwVmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9UTENMOiB7CisgICAgICBnY28ybGNsKG8pLT5nY2xpc3QgPSBnLT5ncmF5OworICAgICAgZy0+Z3JheSA9IG87CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgTFVBX1RDQ0w6IHsKKyAgICAgIGdjbzJjY2wobyktPmdjbGlzdCA9IGctPmdyYXk7CisgICAgICBnLT5ncmF5ID0gbzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBMVUFfVFRBQkxFOiB7CisgICAgICBsaW5rdGFibGUoZ2NvMnQobyksICZnLT5ncmF5KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBMVUFfVFRIUkVBRDogeworICAgICAgZ2NvMnRoKG8pLT5nY2xpc3QgPSBnLT5ncmF5OworICAgICAgZy0+Z3JheSA9IG87CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgTFVBX1RQUk9UTzogeworICAgICAgZ2NvMnAobyktPmdjbGlzdCA9IGctPmdyYXk7CisgICAgICBnLT5ncmF5ID0gbzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVmYXVsdDogbHVhX2Fzc2VydCgwKTsgcmV0dXJuOworICB9CisgIGdyYXkyYmxhY2sobyk7CisgIGctPkdDbWVtdHJhdiArPSBzaXplOworfQorCisKKy8qCisqKiBtYXJrIG1ldGFtZXRob2RzIGZvciBiYXNpYyB0eXBlcworKi8KK3N0YXRpYyB2b2lkIG1hcmttdCAoZ2xvYmFsX1N0YXRlICpnKSB7CisgIGludCBpOworICBmb3IgKGk9MDsgaSA8IExVQV9OVU1UQUdTOyBpKyspCisgICAgbWFya29iamVjdChnLCBnLT5tdFtpXSk7Cit9CisKKworLyoKKyoqIG1hcmsgYWxsIG9iamVjdHMgaW4gbGlzdCBvZiBiZWluZy1maW5hbGl6ZWQKKyovCitzdGF0aWMgdm9pZCBtYXJrYmVpbmdmbnogKGdsb2JhbF9TdGF0ZSAqZykgeworICBHQ09iamVjdCAqbzsKKyAgZm9yIChvID0gZy0+dG9iZWZuejsgbyAhPSBOVUxMOyBvID0gZ2NoKG8pLT5uZXh0KSB7CisgICAgbWFrZXdoaXRlKGcsIG8pOworICAgIHJlYWxseW1hcmtvYmplY3QoZywgbyk7CisgIH0KK30KKworCisvKgorKiogbWFyayBhbGwgdmFsdWVzIHN0b3JlZCBpbiBtYXJrZWQgb3BlbiB1cHZhbHVlcy4gKFNlZSBjb21tZW50IGluCisqKiAnbHN0YXRlLmgnLikKKyovCitzdGF0aWMgdm9pZCByZW1hcmt1cHZhbHMgKGdsb2JhbF9TdGF0ZSAqZykgeworICBVcFZhbCAqdXY7CisgIGZvciAodXYgPSBnLT51dmhlYWQudS5sLm5leHQ7IHV2ICE9ICZnLT51dmhlYWQ7IHV2ID0gdXYtPnUubC5uZXh0KSB7CisgICAgaWYgKGlzZ3JheShvYmoyZ2NvKHV2KSkpCisgICAgICBtYXJrdmFsdWUoZywgdXYtPnYpOworICB9Cit9CisKKworLyoKKyoqIG1hcmsgcm9vdCBzZXQgYW5kIHJlc2V0IGFsbCBncmF5IGxpc3RzLCB0byBzdGFydCBhIG5ldworKiogaW5jcmVtZW50YWwgKG9yIGZ1bGwpIGNvbGxlY3Rpb24KKyovCitzdGF0aWMgdm9pZCByZXN0YXJ0Y29sbGVjdGlvbiAoZ2xvYmFsX1N0YXRlICpnKSB7CisgIGctPmdyYXkgPSBnLT5ncmF5YWdhaW4gPSBOVUxMOworICBnLT53ZWFrID0gZy0+YWxsd2VhayA9IGctPmVwaGVtZXJvbiA9IE5VTEw7CisgIG1hcmtvYmplY3QoZywgZy0+bWFpbnRocmVhZCk7CisgIG1hcmt2YWx1ZShnLCAmZy0+bF9yZWdpc3RyeSk7CisgIG1hcmttdChnKTsKKyAgbWFya2JlaW5nZm56KGcpOyAgLyogbWFyayBhbnkgZmluYWxpemluZyBvYmplY3QgbGVmdCBmcm9tIHByZXZpb3VzIGN5Y2xlICovCit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogVHJhdmVyc2UgZnVuY3Rpb25zCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgdm9pZCB0cmF2ZXJzZXdlYWt2YWx1ZSAoZ2xvYmFsX1N0YXRlICpnLCBUYWJsZSAqaCkgeworICBOb2RlICpuLCAqbGltaXQgPSBnbm9kZWxhc3QoaCk7CisgIC8qIGlmIHRoZXJlIGlzIGFycmF5IHBhcnQsIGFzc3VtZSBpdCBtYXkgaGF2ZSB3aGl0ZSB2YWx1ZXMgKGRvIG5vdAorICAgICB0cmF2ZXJzZSBpdCBqdXN0IHRvIGNoZWNrKSAqLworICBpbnQgaGFzY2xlYXJzID0gKGgtPnNpemVhcnJheSA+IDApOworICBmb3IgKG4gPSBnbm9kZShoLCAwKTsgbiA8IGxpbWl0OyBuKyspIHsKKyAgICBjaGVja2RlYWRrZXkobik7CisgICAgaWYgKHR0aXNuaWwoZ3ZhbChuKSkpICAvKiBlbnRyeSBpcyBlbXB0eT8gKi8KKyAgICAgIHJlbW92ZWVudHJ5KG4pOyAgLyogcmVtb3ZlIGl0ICovCisgICAgZWxzZSB7CisgICAgICBsdWFfYXNzZXJ0KCF0dGlzbmlsKGdrZXkobikpKTsKKyAgICAgIG1hcmt2YWx1ZShnLCBna2V5KG4pKTsgIC8qIG1hcmsga2V5ICovCisgICAgICBpZiAoIWhhc2NsZWFycyAmJiBpc2NsZWFyZWQoZywgZ3ZhbChuKSkpICAvKiBpcyB0aGVyZSBhIHdoaXRlIHZhbHVlPyAqLworICAgICAgICBoYXNjbGVhcnMgPSAxOyAgLyogdGFibGUgd2lsbCBoYXZlIHRvIGJlIGNsZWFyZWQgKi8KKyAgICB9CisgIH0KKyAgaWYgKGhhc2NsZWFycykKKyAgICBsaW5rdGFibGUoaCwgJmctPndlYWspOyAgLyogaGFzIHRvIGJlIGNsZWFyZWQgbGF0ZXIgKi8KKyAgZWxzZSAgLyogbm8gd2hpdGUgdmFsdWVzICovCisgICAgbGlua3RhYmxlKGgsICZnLT5ncmF5YWdhaW4pOyAgLyogbm8gbmVlZCB0byBjbGVhbiAqLworfQorCisKK3N0YXRpYyBpbnQgdHJhdmVyc2VlcGhlbWVyb24gKGdsb2JhbF9TdGF0ZSAqZywgVGFibGUgKmgpIHsKKyAgaW50IG1hcmtlZCA9IDA7ICAvKiB0cnVlIGlmIGFuIG9iamVjdCBpcyBtYXJrZWQgaW4gdGhpcyB0cmF2ZXJzYWwgKi8KKyAgaW50IGhhc2NsZWFycyA9IDA7ICAvKiB0cnVlIGlmIHRhYmxlIGhhcyB3aGl0ZSBrZXlzICovCisgIGludCBwcm9wID0gMDsgIC8qIHRydWUgaWYgdGFibGUgaGFzIGVudHJ5ICJ3aGl0ZS1rZXkgLT4gd2hpdGUtdmFsdWUiICovCisgIE5vZGUgKm4sICpsaW1pdCA9IGdub2RlbGFzdChoKTsKKyAgaW50IGk7CisgIC8qIHRyYXZlcnNlIGFycmF5IHBhcnQgKG51bWVyaWMga2V5cyBhcmUgJ3N0cm9uZycpICovCisgIGZvciAoaSA9IDA7IGkgPCBoLT5zaXplYXJyYXk7IGkrKykgeworICAgIGlmICh2YWxpc3doaXRlKCZoLT5hcnJheVtpXSkpIHsKKyAgICAgIG1hcmtlZCA9IDE7CisgICAgICByZWFsbHltYXJrb2JqZWN0KGcsIGdjdmFsdWUoJmgtPmFycmF5W2ldKSk7CisgICAgfQorICB9CisgIC8qIHRyYXZlcnNlIGhhc2ggcGFydCAqLworICBmb3IgKG4gPSBnbm9kZShoLCAwKTsgbiA8IGxpbWl0OyBuKyspIHsKKyAgICBjaGVja2RlYWRrZXkobik7CisgICAgaWYgKHR0aXNuaWwoZ3ZhbChuKSkpICAvKiBlbnRyeSBpcyBlbXB0eT8gKi8KKyAgICAgIHJlbW92ZWVudHJ5KG4pOyAgLyogcmVtb3ZlIGl0ICovCisgICAgZWxzZSBpZiAoaXNjbGVhcmVkKGcsIGdrZXkobikpKSB7ICAvKiBrZXkgaXMgbm90IG1hcmtlZCAoeWV0KT8gKi8KKyAgICAgIGhhc2NsZWFycyA9IDE7ICAvKiB0YWJsZSBtdXN0IGJlIGNsZWFyZWQgKi8KKyAgICAgIGlmICh2YWxpc3doaXRlKGd2YWwobikpKSAgLyogdmFsdWUgbm90IG1hcmtlZCB5ZXQ/ICovCisgICAgICAgIHByb3AgPSAxOyAgLyogbXVzdCBwcm9wYWdhdGUgYWdhaW4gKi8KKyAgICB9CisgICAgZWxzZSBpZiAodmFsaXN3aGl0ZShndmFsKG4pKSkgeyAgLyogdmFsdWUgbm90IG1hcmtlZCB5ZXQ/ICovCisgICAgICBtYXJrZWQgPSAxOworICAgICAgcmVhbGx5bWFya29iamVjdChnLCBnY3ZhbHVlKGd2YWwobikpKTsgIC8qIG1hcmsgaXQgbm93ICovCisgICAgfQorICB9CisgIGlmIChwcm9wKQorICAgIGxpbmt0YWJsZShoLCAmZy0+ZXBoZW1lcm9uKTsgIC8qIGhhdmUgdG8gcHJvcGFnYXRlIGFnYWluICovCisgIGVsc2UgaWYgKGhhc2NsZWFycykgIC8qIGRvZXMgdGFibGUgaGF2ZSB3aGl0ZSBrZXlzPyAqLworICAgIGxpbmt0YWJsZShoLCAmZy0+YWxsd2Vhayk7ICAvKiBtYXkgaGF2ZSB0byBjbGVhbiB3aGl0ZSBrZXlzICovCisgIGVsc2UgIC8qIG5vIHdoaXRlIGtleXMgKi8KKyAgICBsaW5rdGFibGUoaCwgJmctPmdyYXlhZ2Fpbik7ICAvKiBubyBuZWVkIHRvIGNsZWFuICovCisgIHJldHVybiBtYXJrZWQ7Cit9CisKKworc3RhdGljIHZvaWQgdHJhdmVyc2VzdHJvbmd0YWJsZSAoZ2xvYmFsX1N0YXRlICpnLCBUYWJsZSAqaCkgeworICBOb2RlICpuLCAqbGltaXQgPSBnbm9kZWxhc3QoaCk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgaC0+c2l6ZWFycmF5OyBpKyspICAvKiB0cmF2ZXJzZSBhcnJheSBwYXJ0ICovCisgICAgbWFya3ZhbHVlKGcsICZoLT5hcnJheVtpXSk7CisgIGZvciAobiA9IGdub2RlKGgsIDApOyBuIDwgbGltaXQ7IG4rKykgeyAgLyogdHJhdmVyc2UgaGFzaCBwYXJ0ICovCisgICAgY2hlY2tkZWFka2V5KG4pOworICAgIGlmICh0dGlzbmlsKGd2YWwobikpKSAgLyogZW50cnkgaXMgZW1wdHk/ICovCisgICAgICByZW1vdmVlbnRyeShuKTsgIC8qIHJlbW92ZSBpdCAqLworICAgIGVsc2UgeworICAgICAgbHVhX2Fzc2VydCghdHRpc25pbChna2V5KG4pKSk7CisgICAgICBtYXJrdmFsdWUoZywgZ2tleShuKSk7ICAvKiBtYXJrIGtleSAqLworICAgICAgbWFya3ZhbHVlKGcsIGd2YWwobikpOyAgLyogbWFyayB2YWx1ZSAqLworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyBsdV9tZW0gdHJhdmVyc2V0YWJsZSAoZ2xvYmFsX1N0YXRlICpnLCBUYWJsZSAqaCkgeworICBjb25zdCBjaGFyICp3ZWFra2V5LCAqd2Vha3ZhbHVlOworICBjb25zdCBUVmFsdWUgKm1vZGUgPSBnZmFzdHRtKGcsIGgtPm1ldGF0YWJsZSwgVE1fTU9ERSk7CisgIG1hcmtvYmplY3QoZywgaC0+bWV0YXRhYmxlKTsKKyAgaWYgKG1vZGUgJiYgdHRpc3N0cmluZyhtb2RlKSAmJiAgLyogaXMgdGhlcmUgYSB3ZWFrIG1vZGU/ICovCisgICAgICAoKHdlYWtrZXkgPSBzdHJjaHIoc3ZhbHVlKG1vZGUpLCAnaycpKSwKKyAgICAgICAod2Vha3ZhbHVlID0gc3RyY2hyKHN2YWx1ZShtb2RlKSwgJ3YnKSksCisgICAgICAgKHdlYWtrZXkgfHwgd2Vha3ZhbHVlKSkpIHsgIC8qIGlzIHJlYWxseSB3ZWFrPyAqLworICAgIGJsYWNrMmdyYXkob2JqMmdjbyhoKSk7ICAvKiBrZWVwIHRhYmxlIGdyYXkgKi8KKyAgICBpZiAoIXdlYWtrZXkpICAvKiBzdHJvbmcga2V5cz8gKi8KKyAgICAgIHRyYXZlcnNld2Vha3ZhbHVlKGcsIGgpOworICAgIGVsc2UgaWYgKCF3ZWFrdmFsdWUpICAvKiBzdHJvbmcgdmFsdWVzPyAqLworICAgICAgdHJhdmVyc2VlcGhlbWVyb24oZywgaCk7CisgICAgZWxzZSAgLyogYWxsIHdlYWsgKi8KKyAgICAgIGxpbmt0YWJsZShoLCAmZy0+YWxsd2Vhayk7ICAvKiBub3RoaW5nIHRvIHRyYXZlcnNlIG5vdyAqLworICB9CisgIGVsc2UgIC8qIG5vdCB3ZWFrICovCisgICAgdHJhdmVyc2VzdHJvbmd0YWJsZShnLCBoKTsKKyAgcmV0dXJuIHNpemVvZihUYWJsZSkgKyBzaXplb2YoVFZhbHVlKSAqIGgtPnNpemVhcnJheSArCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5vZGUpICogY2FzdChzaXplX3QsIHNpemVub2RlKGgpKTsKK30KKworCitzdGF0aWMgaW50IHRyYXZlcnNlcHJvdG8gKGdsb2JhbF9TdGF0ZSAqZywgUHJvdG8gKmYpIHsKKyAgaW50IGk7CisgIGlmIChmLT5jYWNoZSAmJiBpc3doaXRlKG9iajJnY28oZi0+Y2FjaGUpKSkKKyAgICBmLT5jYWNoZSA9IE5VTEw7ICAvKiBhbGxvdyBjYWNoZSB0byBiZSBjb2xsZWN0ZWQgKi8KKyAgbWFya29iamVjdChnLCBmLT5zb3VyY2UpOworICBmb3IgKGkgPSAwOyBpIDwgZi0+c2l6ZWs7IGkrKykgIC8qIG1hcmsgbGl0ZXJhbHMgKi8KKyAgICBtYXJrdmFsdWUoZywgJmYtPmtbaV0pOworICBmb3IgKGkgPSAwOyBpIDwgZi0+c2l6ZXVwdmFsdWVzOyBpKyspICAvKiBtYXJrIHVwdmFsdWUgbmFtZXMgKi8KKyAgICBtYXJrb2JqZWN0KGcsIGYtPnVwdmFsdWVzW2ldLm5hbWUpOworICBmb3IgKGkgPSAwOyBpIDwgZi0+c2l6ZXA7IGkrKykgIC8qIG1hcmsgbmVzdGVkIHByb3RvcyAqLworICAgIG1hcmtvYmplY3QoZywgZi0+cFtpXSk7CisgIGZvciAoaSA9IDA7IGkgPCBmLT5zaXplbG9jdmFyczsgaSsrKSAgLyogbWFyayBsb2NhbC12YXJpYWJsZSBuYW1lcyAqLworICAgIG1hcmtvYmplY3QoZywgZi0+bG9jdmFyc1tpXS52YXJuYW1lKTsKKyAgcmV0dXJuIHNpemVvZihQcm90bykgKyBzaXplb2YoSW5zdHJ1Y3Rpb24pICogZi0+c2l6ZWNvZGUgKworICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQcm90byAqKSAqIGYtPnNpemVwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVFZhbHVlKSAqIGYtPnNpemVrICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIGYtPnNpemVsaW5laW5mbyArCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExvY1ZhcikgKiBmLT5zaXplbG9jdmFycyArCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFVwdmFsZGVzYykgKiBmLT5zaXpldXB2YWx1ZXM7Cit9CisKKworc3RhdGljIGx1X21lbSB0cmF2ZXJzZUNjbG9zdXJlIChnbG9iYWxfU3RhdGUgKmcsIENDbG9zdXJlICpjbCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGNsLT5udXB2YWx1ZXM7IGkrKykgIC8qIG1hcmsgaXRzIHVwdmFsdWVzICovCisgICAgbWFya3ZhbHVlKGcsICZjbC0+dXB2YWx1ZVtpXSk7CisgIHJldHVybiBzaXplQ2Nsb3N1cmUoY2wtPm51cHZhbHVlcyk7Cit9CisKK3N0YXRpYyBsdV9tZW0gdHJhdmVyc2VMY2xvc3VyZSAoZ2xvYmFsX1N0YXRlICpnLCBMQ2xvc3VyZSAqY2wpIHsKKyAgaW50IGk7CisgIG1hcmtvYmplY3QoZywgY2wtPnApOyAgLyogbWFyayBpdHMgcHJvdG90eXBlICovCisgIGZvciAoaSA9IDA7IGkgPCBjbC0+bnVwdmFsdWVzOyBpKyspICAvKiBtYXJrIGl0cyB1cHZhbHVlcyAqLworICAgIG1hcmtvYmplY3QoZywgY2wtPnVwdmFsc1tpXSk7CisgIHJldHVybiBzaXplTGNsb3N1cmUoY2wtPm51cHZhbHVlcyk7Cit9CisKKworc3RhdGljIGx1X21lbSB0cmF2ZXJzZXN0YWNrIChnbG9iYWxfU3RhdGUgKmcsIGx1YV9TdGF0ZSAqdGgpIHsKKyAgaW50IG4gPSAwOworICBTdGtJZCBvID0gdGgtPnN0YWNrOworICBpZiAobyA9PSBOVUxMKQorICAgIHJldHVybiAxOyAgLyogc3RhY2sgbm90IGNvbXBsZXRlbHkgYnVpbHQgeWV0ICovCisgIGZvciAoOyBvIDwgdGgtPnRvcDsgbysrKSAgLyogbWFyayBsaXZlIGVsZW1lbnRzIGluIHRoZSBzdGFjayAqLworICAgIG1hcmt2YWx1ZShnLCBvKTsKKyAgaWYgKGctPmdjc3RhdGUgPT0gR0NTYXRvbWljKSB7ICAvKiBmaW5hbCB0cmF2ZXJzYWw/ICovCisgICAgU3RrSWQgbGltID0gdGgtPnN0YWNrICsgdGgtPnN0YWNrc2l6ZTsgIC8qIHJlYWwgZW5kIG9mIHN0YWNrICovCisgICAgZm9yICg7IG8gPCBsaW07IG8rKykgIC8qIGNsZWFyIG5vdC1tYXJrZWQgc3RhY2sgc2xpY2UgKi8KKyAgICAgIHNldG5pbHZhbHVlKG8pOworICB9CisgIGVsc2UgeyAgLyogY291bnQgY2FsbCBpbmZvcyB0byBjb21wdXRlIHNpemUgKi8KKyAgICBDYWxsSW5mbyAqY2k7CisgICAgZm9yIChjaSA9ICZ0aC0+YmFzZV9jaTsgY2kgIT0gdGgtPmNpOyBjaSA9IGNpLT5uZXh0KQorICAgICAgbisrOworICB9CisgIHJldHVybiBzaXplb2YobHVhX1N0YXRlKSArIHNpemVvZihUVmFsdWUpICogdGgtPnN0YWNrc2l6ZSArCisgICAgICAgICBzaXplb2YoQ2FsbEluZm8pICogbjsKK30KKworCisvKgorKiogdHJhdmVyc2Ugb25lIGdyYXkgb2JqZWN0LCB0dXJuaW5nIGl0IHRvIGJsYWNrIChleGNlcHQgZm9yIHRocmVhZHMsCisqKiB3aGljaCBhcmUgYWx3YXlzIGdyYXkpLgorKi8KK3N0YXRpYyB2b2lkIHByb3BhZ2F0ZW1hcmsgKGdsb2JhbF9TdGF0ZSAqZykgeworICBsdV9tZW0gc2l6ZTsKKyAgR0NPYmplY3QgKm8gPSBnLT5ncmF5OworICBsdWFfYXNzZXJ0KGlzZ3JheShvKSk7CisgIGdyYXkyYmxhY2sobyk7CisgIHN3aXRjaCAoZ2NoKG8pLT50dCkgeworICAgIGNhc2UgTFVBX1RUQUJMRTogeworICAgICAgVGFibGUgKmggPSBnY28ydChvKTsKKyAgICAgIGctPmdyYXkgPSBoLT5nY2xpc3Q7ICAvKiByZW1vdmUgZnJvbSAnZ3JheScgbGlzdCAqLworICAgICAgc2l6ZSA9IHRyYXZlcnNldGFibGUoZywgaCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfVExDTDogeworICAgICAgTENsb3N1cmUgKmNsID0gZ2NvMmxjbChvKTsKKyAgICAgIGctPmdyYXkgPSBjbC0+Z2NsaXN0OyAgLyogcmVtb3ZlIGZyb20gJ2dyYXknIGxpc3QgKi8KKyAgICAgIHNpemUgPSB0cmF2ZXJzZUxjbG9zdXJlKGcsIGNsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9UQ0NMOiB7CisgICAgICBDQ2xvc3VyZSAqY2wgPSBnY28yY2NsKG8pOworICAgICAgZy0+Z3JheSA9IGNsLT5nY2xpc3Q7ICAvKiByZW1vdmUgZnJvbSAnZ3JheScgbGlzdCAqLworICAgICAgc2l6ZSA9IHRyYXZlcnNlQ2Nsb3N1cmUoZywgY2wpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX1RUSFJFQUQ6IHsKKyAgICAgIGx1YV9TdGF0ZSAqdGggPSBnY28ydGgobyk7CisgICAgICBnLT5ncmF5ID0gdGgtPmdjbGlzdDsgIC8qIHJlbW92ZSBmcm9tICdncmF5JyBsaXN0ICovCisgICAgICB0aC0+Z2NsaXN0ID0gZy0+Z3JheWFnYWluOworICAgICAgZy0+Z3JheWFnYWluID0gbzsgIC8qIGluc2VydCBpbnRvICdncmF5YWdhaW4nIGxpc3QgKi8KKyAgICAgIGJsYWNrMmdyYXkobyk7CisgICAgICBzaXplID0gdHJhdmVyc2VzdGFjayhnLCB0aCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfVFBST1RPOiB7CisgICAgICBQcm90byAqcCA9IGdjbzJwKG8pOworICAgICAgZy0+Z3JheSA9IHAtPmdjbGlzdDsgIC8qIHJlbW92ZSBmcm9tICdncmF5JyBsaXN0ICovCisgICAgICBzaXplID0gdHJhdmVyc2Vwcm90byhnLCBwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBsdWFfYXNzZXJ0KDApOyByZXR1cm47CisgIH0KKyAgZy0+R0NtZW10cmF2ICs9IHNpemU7Cit9CisKKworc3RhdGljIHZvaWQgcHJvcGFnYXRlYWxsIChnbG9iYWxfU3RhdGUgKmcpIHsKKyAgd2hpbGUgKGctPmdyYXkpIHByb3BhZ2F0ZW1hcmsoZyk7Cit9CisKKworc3RhdGljIHZvaWQgcHJvcGFnYXRlbGlzdCAoZ2xvYmFsX1N0YXRlICpnLCBHQ09iamVjdCAqbCkgeworICBsdWFfYXNzZXJ0KGctPmdyYXkgPT0gTlVMTCk7ICAvKiBubyBncmF5cyBsZWZ0ICovCisgIGctPmdyYXkgPSBsOworICBwcm9wYWdhdGVhbGwoZyk7ICAvKiB0cmF2ZXJzZSBhbGwgZWxlbWVudHMgZnJvbSAnbCcgKi8KK30KKworLyoKKyoqIHJldHJhdmVyc2UgYWxsIGdyYXkgbGlzdHMuIEJlY2F1c2UgdGFibGVzIG1heSBiZSByZWluc2VydGVkIGluIG90aGVyCisqKiBsaXN0cyB3aGVuIHRyYXZlcnNlZCwgdHJhdmVyc2UgdGhlIG9yaWdpbmFsIGxpc3RzIHRvIGF2b2lkIHRyYXZlcnNpbmcKKyoqIHR3aWNlIHRoZSBzYW1lIHRhYmxlICh3aGljaCBpcyBub3Qgd3JvbmcsIGJ1dCBpbmVmZmljaWVudCkKKyovCitzdGF0aWMgdm9pZCByZXRyYXZlcnNlZ3JheXMgKGdsb2JhbF9TdGF0ZSAqZykgeworICBHQ09iamVjdCAqd2VhayA9IGctPndlYWs7ICAvKiBzYXZlIG9yaWdpbmFsIGxpc3RzICovCisgIEdDT2JqZWN0ICpncmF5YWdhaW4gPSBnLT5ncmF5YWdhaW47CisgIEdDT2JqZWN0ICplcGhlbWVyb24gPSBnLT5lcGhlbWVyb247CisgIGctPndlYWsgPSBnLT5ncmF5YWdhaW4gPSBnLT5lcGhlbWVyb24gPSBOVUxMOworICBwcm9wYWdhdGVhbGwoZyk7ICAvKiB0cmF2ZXJzZSBtYWluIGdyYXkgbGlzdCAqLworICBwcm9wYWdhdGVsaXN0KGcsIGdyYXlhZ2Fpbik7CisgIHByb3BhZ2F0ZWxpc3QoZywgd2Vhayk7CisgIHByb3BhZ2F0ZWxpc3QoZywgZXBoZW1lcm9uKTsKK30KKworCitzdGF0aWMgdm9pZCBjb252ZXJnZWVwaGVtZXJvbnMgKGdsb2JhbF9TdGF0ZSAqZykgeworICBpbnQgY2hhbmdlZDsKKyAgZG8geworICAgIEdDT2JqZWN0ICp3OworICAgIEdDT2JqZWN0ICpuZXh0ID0gZy0+ZXBoZW1lcm9uOyAgLyogZ2V0IGVwaGVtZXJvbiBsaXN0ICovCisgICAgZy0+ZXBoZW1lcm9uID0gTlVMTDsgIC8qIHRhYmxlcyB3aWxsIHJldHVybiB0byB0aGlzIGxpc3Qgd2hlbiB0cmF2ZXJzZWQgKi8KKyAgICBjaGFuZ2VkID0gMDsKKyAgICB3aGlsZSAoKHcgPSBuZXh0KSAhPSBOVUxMKSB7CisgICAgICBuZXh0ID0gZ2NvMnQodyktPmdjbGlzdDsKKyAgICAgIGlmICh0cmF2ZXJzZWVwaGVtZXJvbihnLCBnY28ydCh3KSkpIHsgIC8qIHRyYXZlcnNlIG1hcmtlZCBzb21lIHZhbHVlPyAqLworICAgICAgICBwcm9wYWdhdGVhbGwoZyk7ICAvKiBwcm9wYWdhdGUgY2hhbmdlcyAqLworICAgICAgICBjaGFuZ2VkID0gMTsgIC8qIHdpbGwgaGF2ZSB0byByZXZpc2l0IGFsbCBlcGhlbWVyb24gdGFibGVzICovCisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChjaGFuZ2VkKTsKK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBTd2VlcCBGdW5jdGlvbnMKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworLyoKKyoqIGNsZWFyIGVudHJpZXMgd2l0aCB1bm1hcmtlZCBrZXlzIGZyb20gYWxsIHdlYWt0YWJsZXMgaW4gbGlzdCAnbCcgdXAKKyoqIHRvIGVsZW1lbnQgJ2YnCisqLworc3RhdGljIHZvaWQgY2xlYXJrZXlzIChnbG9iYWxfU3RhdGUgKmcsIEdDT2JqZWN0ICpsLCBHQ09iamVjdCAqZikgeworICBmb3IgKDsgbCAhPSBmOyBsID0gZ2NvMnQobCktPmdjbGlzdCkgeworICAgIFRhYmxlICpoID0gZ2NvMnQobCk7CisgICAgTm9kZSAqbiwgKmxpbWl0ID0gZ25vZGVsYXN0KGgpOworICAgIGZvciAobiA9IGdub2RlKGgsIDApOyBuIDwgbGltaXQ7IG4rKykgeworICAgICAgaWYgKCF0dGlzbmlsKGd2YWwobikpICYmIChpc2NsZWFyZWQoZywgZ2tleShuKSkpKSB7CisgICAgICAgIHNldG5pbHZhbHVlKGd2YWwobikpOyAgLyogcmVtb3ZlIHZhbHVlIC4uLiAqLworICAgICAgICByZW1vdmVlbnRyeShuKTsgIC8qIGFuZCByZW1vdmUgZW50cnkgZnJvbSB0YWJsZSAqLworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8qCisqKiBjbGVhciBlbnRyaWVzIHdpdGggdW5tYXJrZWQgdmFsdWVzIGZyb20gYWxsIHdlYWt0YWJsZXMgaW4gbGlzdCAnbCcgdXAKKyoqIHRvIGVsZW1lbnQgJ2YnCisqLworc3RhdGljIHZvaWQgY2xlYXJ2YWx1ZXMgKGdsb2JhbF9TdGF0ZSAqZywgR0NPYmplY3QgKmwsIEdDT2JqZWN0ICpmKSB7CisgIGZvciAoOyBsICE9IGY7IGwgPSBnY28ydChsKS0+Z2NsaXN0KSB7CisgICAgVGFibGUgKmggPSBnY28ydChsKTsKKyAgICBOb2RlICpuLCAqbGltaXQgPSBnbm9kZWxhc3QoaCk7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGgtPnNpemVhcnJheTsgaSsrKSB7CisgICAgICBUVmFsdWUgKm8gPSAmaC0+YXJyYXlbaV07CisgICAgICBpZiAoaXNjbGVhcmVkKGcsIG8pKSAgLyogdmFsdWUgd2FzIGNvbGxlY3RlZD8gKi8KKyAgICAgICAgc2V0bmlsdmFsdWUobyk7ICAvKiByZW1vdmUgdmFsdWUgKi8KKyAgICB9CisgICAgZm9yIChuID0gZ25vZGUoaCwgMCk7IG4gPCBsaW1pdDsgbisrKSB7CisgICAgICBpZiAoIXR0aXNuaWwoZ3ZhbChuKSkgJiYgaXNjbGVhcmVkKGcsIGd2YWwobikpKSB7CisgICAgICAgIHNldG5pbHZhbHVlKGd2YWwobikpOyAgLyogcmVtb3ZlIHZhbHVlIC4uLiAqLworICAgICAgICByZW1vdmVlbnRyeShuKTsgIC8qIGFuZCByZW1vdmUgZW50cnkgZnJvbSB0YWJsZSAqLworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGZyZWVvYmogKGx1YV9TdGF0ZSAqTCwgR0NPYmplY3QgKm8pIHsKKyAgc3dpdGNoIChnY2gobyktPnR0KSB7CisgICAgY2FzZSBMVUFfVFBST1RPOiBsdWFGX2ZyZWVwcm90byhMLCBnY28ycChvKSk7IGJyZWFrOworICAgIGNhc2UgTFVBX1RMQ0w6IHsKKyAgICAgIGx1YU1fZnJlZW1lbShMLCBvLCBzaXplTGNsb3N1cmUoZ2NvMmxjbChvKS0+bnVwdmFsdWVzKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBMVUFfVENDTDogeworICAgICAgbHVhTV9mcmVlbWVtKEwsIG8sIHNpemVDY2xvc3VyZShnY28yY2NsKG8pLT5udXB2YWx1ZXMpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIExVQV9UVVBWQUw6IGx1YUZfZnJlZXVwdmFsKEwsIGdjbzJ1dihvKSk7IGJyZWFrOworICAgIGNhc2UgTFVBX1RUQUJMRTogbHVhSF9mcmVlKEwsIGdjbzJ0KG8pKTsgYnJlYWs7CisgICAgY2FzZSBMVUFfVFRIUkVBRDogbHVhRV9mcmVldGhyZWFkKEwsIGdjbzJ0aChvKSk7IGJyZWFrOworICAgIGNhc2UgTFVBX1RVU0VSREFUQTogbHVhTV9mcmVlbWVtKEwsIG8sIHNpemV1ZGF0YShnY28ydShvKSkpOyBicmVhazsKKyAgICBjYXNlIExVQV9UU0hSU1RSOgorICAgICAgRyhMKS0+c3RydC5udXNlLS07CisgICAgICAvKiBnbyB0aHJvdWdoICovCisgICAgY2FzZSBMVUFfVExOR1NUUjogeworICAgICAgbHVhTV9mcmVlbWVtKEwsIG8sIHNpemVzdHJpbmcoZ2NvMnRzKG8pKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogbHVhX2Fzc2VydCgwKTsKKyAgfQorfQorCisKKyNkZWZpbmUgc3dlZXB3aG9sZWxpc3QoTCxwKQlzd2VlcGxpc3QoTCxwLE1BWF9MVU1FTSkKK3N0YXRpYyBHQ09iamVjdCAqKnN3ZWVwbGlzdCAobHVhX1N0YXRlICpMLCBHQ09iamVjdCAqKnAsIGx1X21lbSBjb3VudCk7CisKKworLyoKKyoqIHN3ZWVwIHRoZSAob3BlbikgdXB2YWx1ZXMgb2YgYSB0aHJlYWQgYW5kIHJlc2l6ZSBpdHMgc3RhY2sgYW5kCisqKiBsaXN0IG9mIGNhbGwtaW5mbyBzdHJ1Y3R1cmVzLgorKi8KK3N0YXRpYyB2b2lkIHN3ZWVwdGhyZWFkIChsdWFfU3RhdGUgKkwsIGx1YV9TdGF0ZSAqTDEpIHsKKyAgaWYgKEwxLT5zdGFjayA9PSBOVUxMKSByZXR1cm47ICAvKiBzdGFjayBub3QgY29tcGxldGVseSBidWlsdCB5ZXQgKi8KKyAgc3dlZXB3aG9sZWxpc3QoTCwgJkwxLT5vcGVudXB2YWwpOyAgLyogc3dlZXAgb3BlbiB1cHZhbHVlcyAqLworICBsdWFFX2ZyZWVDSShMMSk7ICAvKiBmcmVlIGV4dHJhIENhbGxJbmZvIHNsb3RzICovCisgIC8qIHNob3VsZCBub3QgY2hhbmdlIHRoZSBzdGFjayBkdXJpbmcgYW4gZW1lcmdlbmN5IGdjIGN5Y2xlICovCisgIGlmIChHKEwpLT5nY2tpbmQgIT0gS0dDX0VNRVJHRU5DWSkKKyAgICBsdWFEX3Nocmlua3N0YWNrKEwxKTsKK30KKworCisvKgorKiogc3dlZXAgYXQgbW9zdCAnY291bnQnIGVsZW1lbnRzIGZyb20gYSBsaXN0IG9mIEdDT2JqZWN0cyBlcmFzaW5nIGRlYWQKKyoqIG9iamVjdHMsIHdoZXJlIGEgZGVhZCAobm90IGFsaXZlKSBvYmplY3QgaXMgb25lIG1hcmtlZCB3aXRoIHRoZSAib2xkIgorKiogKG5vbiBjdXJyZW50KSB3aGl0ZSBhbmQgbm90IGZpeGVkLgorKiogSW4gbm9uLWdlbmVyYXRpb25hbCBtb2RlLCBjaGFuZ2UgYWxsIG5vbi1kZWFkIG9iamVjdHMgYmFjayB0byB3aGl0ZSwKKyoqIHByZXBhcmluZyBmb3IgbmV4dCBjb2xsZWN0aW9uIGN5Y2xlLgorKiogSW4gZ2VuZXJhdGlvbmFsIG1vZGUsIGtlZXAgYmxhY2sgb2JqZWN0cyBibGFjaywgYW5kIGFsc28gbWFyayB0aGVtIGFzCisqKiBvbGQ7IHN0b3Agd2hlbiBoaXR0aW5nIGFuIG9sZCBvYmplY3QsIGFzIGFsbCBvYmplY3RzIGFmdGVyIHRoYXQKKyoqIG9uZSB3aWxsIGJlIG9sZCB0b28uCisqKiBXaGVuIG9iamVjdCBpcyBhIHRocmVhZCwgc3dlZXAgaXRzIGxpc3Qgb2Ygb3BlbiB1cHZhbHVlcyB0b28uCisqLworc3RhdGljIEdDT2JqZWN0ICoqc3dlZXBsaXN0IChsdWFfU3RhdGUgKkwsIEdDT2JqZWN0ICoqcCwgbHVfbWVtIGNvdW50KSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGludCBvdyA9IG90aGVyd2hpdGUoZyk7CisgIGludCB0b2NsZWFyLCB0b3NldDsgIC8qIGJpdHMgdG8gY2xlYXIgYW5kIHRvIHNldCBpbiBhbGwgbGl2ZSBvYmplY3RzICovCisgIGludCB0b3N0b3A7ICAvKiBzdG9wIHN3ZWVwIHdoZW4gdGhpcyBpcyB0cnVlICovCisgIGlmIChpc2dlbmVyYXRpb25hbChnKSkgeyAgLyogZ2VuZXJhdGlvbmFsIG1vZGU/ICovCisgICAgdG9jbGVhciA9IH4wOyAgLyogY2xlYXIgbm90aGluZyAqLworICAgIHRvc2V0ID0gYml0bWFzayhPTERCSVQpOyAgLyogc2V0IHRoZSBvbGQgYml0IG9mIGFsbCBzdXJ2aXZpbmcgb2JqZWN0cyAqLworICAgIHRvc3RvcCA9IGJpdG1hc2soT0xEQklUKTsgIC8qIGRvIG5vdCBzd2VlcCBvbGQgZ2VuZXJhdGlvbiAqLworICB9CisgIGVsc2UgeyAgLyogbm9ybWFsIG1vZGUgKi8KKyAgICB0b2NsZWFyID0gbWFza2NvbG9yczsgIC8qIGNsZWFyIGFsbCBjb2xvciBiaXRzICsgb2xkIGJpdCAqLworICAgIHRvc2V0ID0gbHVhQ193aGl0ZShnKTsgIC8qIG1ha2Ugb2JqZWN0IHdoaXRlICovCisgICAgdG9zdG9wID0gMDsgIC8qIGRvIG5vdCBzdG9wICovCisgIH0KKyAgd2hpbGUgKCpwICE9IE5VTEwgJiYgY291bnQtLSA+IDApIHsKKyAgICBHQ09iamVjdCAqY3VyciA9ICpwOworICAgIGludCBtYXJrZWQgPSBnY2goY3VyciktPm1hcmtlZDsKKyAgICBpZiAoaXNkZWFkbShvdywgbWFya2VkKSkgeyAgLyogaXMgJ2N1cnInIGRlYWQ/ICovCisgICAgICAqcCA9IGdjaChjdXJyKS0+bmV4dDsgIC8qIHJlbW92ZSAnY3VycicgZnJvbSBsaXN0ICovCisgICAgICBmcmVlb2JqKEwsIGN1cnIpOyAgLyogZXJhc2UgJ2N1cnInICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKHRlc3RiaXRzKG1hcmtlZCwgdG9zdG9wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiBzdG9wIHN3ZWVwaW5nIHRoaXMgbGlzdCAqLworICAgICAgaWYgKGdjaChjdXJyKS0+dHQgPT0gTFVBX1RUSFJFQUQpCisgICAgICAgIHN3ZWVwdGhyZWFkKEwsIGdjbzJ0aChjdXJyKSk7ICAvKiBzd2VlcCB0aHJlYWQncyB1cHZhbHVlcyAqLworICAgICAgLyogdXBkYXRlIG1hcmtzICovCisgICAgICBnY2goY3VyciktPm1hcmtlZCA9IGNhc3RfYnl0ZSgobWFya2VkICYgdG9jbGVhcikgfCB0b3NldCk7CisgICAgICBwID0gJmdjaChjdXJyKS0+bmV4dDsgIC8qIGdvIHRvIG5leHQgZWxlbWVudCAqLworICAgIH0KKyAgfQorICByZXR1cm4gKCpwID09IE5VTEwpID8gTlVMTCA6IHA7Cit9CisKKworLyoKKyoqIHN3ZWVwIGEgbGlzdCB1bnRpbCBhIGxpdmUgb2JqZWN0IChvciBlbmQgb2YgbGlzdCkKKyovCitzdGF0aWMgR0NPYmplY3QgKipzd2VlcHRvbGl2ZSAobHVhX1N0YXRlICpMLCBHQ09iamVjdCAqKnAsIGludCAqbikgeworICBHQ09iamVjdCAqKiBvbGQgPSBwOworICBpbnQgaSA9IDA7CisgIGRvIHsKKyAgICBpKys7CisgICAgcCA9IHN3ZWVwbGlzdChMLCBwLCAxKTsKKyAgfSB3aGlsZSAocCA9PSBvbGQpOworICBpZiAobikgKm4gKz0gaTsKKyAgcmV0dXJuIHA7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogRmluYWxpemF0aW9uCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgdm9pZCBjaGVja1NpemVzIChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgaWYgKGctPmdja2luZCAhPSBLR0NfRU1FUkdFTkNZKSB7ICAvKiBkbyBub3QgY2hhbmdlIHNpemVzIGluIGVtZXJnZW5jeSAqLworICAgIGludCBocyA9IGctPnN0cnQuc2l6ZSAvIDI7ICAvKiBoYWxmIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdGFibGUgKi8KKyAgICBpZiAoZy0+c3RydC5udXNlIDwgY2FzdChsdV9pbnQzMiwgaHMpKSAgLyogdXNpbmcgbGVzcyB0aGFuIHRoYXQgaGFsZj8gKi8KKyAgICAgIGx1YVNfcmVzaXplKEwsIGhzKTsgIC8qIGhhbHZlIGl0cyBzaXplICovCisgICAgbHVhWl9mcmVlYnVmZmVyKEwsICZnLT5idWZmKTsgIC8qIGZyZWUgY29uY2F0ZW5hdGlvbiBidWZmZXIgKi8KKyAgfQorfQorCisKK3N0YXRpYyBHQ09iamVjdCAqdWRhdGEyZmluYWxpemUgKGdsb2JhbF9TdGF0ZSAqZykgeworICBHQ09iamVjdCAqbyA9IGctPnRvYmVmbno7ICAvKiBnZXQgZmlyc3QgZWxlbWVudCAqLworICBsdWFfYXNzZXJ0KGlzZmluYWxpemVkKG8pKTsKKyAgZy0+dG9iZWZueiA9IGdjaChvKS0+bmV4dDsgIC8qIHJlbW92ZSBpdCBmcm9tICd0b2JlZm56JyBsaXN0ICovCisgIGdjaChvKS0+bmV4dCA9IGctPmFsbGdjOyAgLyogcmV0dXJuIGl0IHRvICdhbGxnYycgbGlzdCAqLworICBnLT5hbGxnYyA9IG87CisgIHJlc2V0Yml0KGdjaChvKS0+bWFya2VkLCBTRVBBUkFURUQpOyAgLyogbWFyayB0aGF0IGl0IGlzIG5vdCBpbiAndG9iZWZueicgKi8KKyAgbHVhX2Fzc2VydCghaXNvbGQobykpOyAgLyogc2VlIE1PVkUgT0xEIHJ1bGUgKi8KKyAgaWYgKCFrZWVwaW52YXJpYW50b3V0KGcpKSAgLyogbm90IGtlZXBpbmcgaW52YXJpYW50PyAqLworICAgIG1ha2V3aGl0ZShnLCBvKTsgIC8qICJzd2VlcCIgb2JqZWN0ICovCisgIHJldHVybiBvOworfQorCisKK3N0YXRpYyB2b2lkIGRvdGhlY2FsbCAobHVhX1N0YXRlICpMLCB2b2lkICp1ZCkgeworICBVTlVTRUQodWQpOworICBsdWFEX2NhbGwoTCwgTC0+dG9wIC0gMiwgMCwgMCk7Cit9CisKKworc3RhdGljIHZvaWQgR0NUTSAobHVhX1N0YXRlICpMLCBpbnQgcHJvcGFnYXRlZXJyb3JzKSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGNvbnN0IFRWYWx1ZSAqdG07CisgIFRWYWx1ZSB2OworICBzZXRnY292YWx1ZShMLCAmdiwgdWRhdGEyZmluYWxpemUoZykpOworICB0bSA9IGx1YVRfZ2V0dG1ieW9iaihMLCAmdiwgVE1fR0MpOworICBpZiAodG0gIT0gTlVMTCAmJiB0dGlzZnVuY3Rpb24odG0pKSB7ICAvKiBpcyB0aGVyZSBhIGZpbmFsaXplcj8gKi8KKyAgICBpbnQgc3RhdHVzOworICAgIGx1X2J5dGUgb2xkYWggPSBMLT5hbGxvd2hvb2s7CisgICAgaW50IHJ1bm5pbmcgID0gZy0+Z2NydW5uaW5nOworICAgIEwtPmFsbG93aG9vayA9IDA7ICAvKiBzdG9wIGRlYnVnIGhvb2tzIGR1cmluZyBHQyBtZXRhbWV0aG9kICovCisgICAgZy0+Z2NydW5uaW5nID0gMDsgIC8qIGF2b2lkIEdDIHN0ZXBzICovCisgICAgc2V0b2JqMnMoTCwgTC0+dG9wLCB0bSk7ICAvKiBwdXNoIGZpbmFsaXplci4uLiAqLworICAgIHNldG9iajJzKEwsIEwtPnRvcCArIDEsICZ2KTsgIC8qIC4uLiBhbmQgaXRzIGFyZ3VtZW50ICovCisgICAgTC0+dG9wICs9IDI7ICAvKiBhbmQgKG5leHQgbGluZSkgY2FsbCB0aGUgZmluYWxpemVyICovCisgICAgc3RhdHVzID0gbHVhRF9wY2FsbChMLCBkb3RoZWNhbGwsIE5VTEwsIHNhdmVzdGFjayhMLCBMLT50b3AgLSAyKSwgMCk7CisgICAgTC0+YWxsb3dob29rID0gb2xkYWg7ICAvKiByZXN0b3JlIGhvb2tzICovCisgICAgZy0+Z2NydW5uaW5nID0gcnVubmluZzsgIC8qIHJlc3RvcmUgc3RhdGUgKi8KKyAgICBpZiAoc3RhdHVzICE9IExVQV9PSyAmJiBwcm9wYWdhdGVlcnJvcnMpIHsgIC8qIGVycm9yIHdoaWxlIHJ1bm5pbmcgX19nYz8gKi8KKyAgICAgIGlmIChzdGF0dXMgPT0gTFVBX0VSUlJVTikgeyAgLyogaXMgdGhlcmUgYW4gZXJyb3Igb2JqZWN0PyAqLworICAgICAgICBjb25zdCBjaGFyICptc2cgPSAodHRpc3N0cmluZyhMLT50b3AgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN2YWx1ZShMLT50b3AgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm5vIG1lc3NhZ2UiOworICAgICAgICBsdWFPX3B1c2hmc3RyaW5nKEwsICJlcnJvciBpbiBfX2djIG1ldGFtZXRob2QgKCVzKSIsIG1zZyk7CisgICAgICAgIHN0YXR1cyA9IExVQV9FUlJHQ01NOyAgLyogZXJyb3IgaW4gX19nYyBtZXRhbWV0aG9kICovCisgICAgICB9CisgICAgICBsdWFEX3Rocm93KEwsIHN0YXR1cyk7ICAvKiByZS10aHJvdyBlcnJvciAqLworICAgIH0KKyAgfQorfQorCisKKy8qCisqKiBtb3ZlIGFsbCB1bnJlYWNoYWJsZSBvYmplY3RzIChvciAnYWxsJyBvYmplY3RzKSB0aGF0IG5lZWQKKyoqIGZpbmFsaXphdGlvbiBmcm9tIGxpc3QgJ2Zpbm9iaicgdG8gbGlzdCAndG9iZWZueicgKHRvIGJlIGZpbmFsaXplZCkKKyovCitzdGF0aWMgdm9pZCBzZXBhcmF0ZXRvYmVmbnogKGx1YV9TdGF0ZSAqTCwgaW50IGFsbCkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBHQ09iamVjdCAqKnAgPSAmZy0+Zmlub2JqOworICBHQ09iamVjdCAqY3VycjsKKyAgR0NPYmplY3QgKipsYXN0bmV4dCA9ICZnLT50b2JlZm56OworICAvKiBmaW5kIGxhc3QgJ25leHQnIGZpZWxkIGluICd0b2JlZm56JyBsaXN0ICh0byBhZGQgZWxlbWVudHMgaW4gaXRzIGVuZCkgKi8KKyAgd2hpbGUgKCpsYXN0bmV4dCAhPSBOVUxMKQorICAgIGxhc3RuZXh0ID0gJmdjaCgqbGFzdG5leHQpLT5uZXh0OworICB3aGlsZSAoKGN1cnIgPSAqcCkgIT0gTlVMTCkgeyAgLyogdHJhdmVyc2UgYWxsIGZpbmFsaXphYmxlIG9iamVjdHMgKi8KKyAgICBsdWFfYXNzZXJ0KCFpc2ZpbmFsaXplZChjdXJyKSk7CisgICAgbHVhX2Fzc2VydCh0ZXN0Yml0KGdjaChjdXJyKS0+bWFya2VkLCBTRVBBUkFURUQpKTsKKyAgICBpZiAoIShpc3doaXRlKGN1cnIpIHx8IGFsbCkpICAvKiBub3QgYmVpbmcgY29sbGVjdGVkPyAqLworICAgICAgcCA9ICZnY2goY3VyciktPm5leHQ7ICAvKiBkb24ndCBib3RoZXIgd2l0aCBpdCAqLworICAgIGVsc2UgeworICAgICAgbF9zZXRiaXQoZ2NoKGN1cnIpLT5tYXJrZWQsIEZJTkFMSVpFREJJVCk7IC8qIHdvbid0IGJlIGZpbmFsaXplZCBhZ2FpbiAqLworICAgICAgKnAgPSBnY2goY3VyciktPm5leHQ7ICAvKiByZW1vdmUgJ2N1cnInIGZyb20gJ2Zpbm9iaicgbGlzdCAqLworICAgICAgZ2NoKGN1cnIpLT5uZXh0ID0gKmxhc3RuZXh0OyAgLyogbGluayBhdCB0aGUgZW5kIG9mICd0b2JlZm56JyBsaXN0ICovCisgICAgICAqbGFzdG5leHQgPSBjdXJyOworICAgICAgbGFzdG5leHQgPSAmZ2NoKGN1cnIpLT5uZXh0OworICAgIH0KKyAgfQorfQorCisKKy8qCisqKiBpZiBvYmplY3QgJ28nIGhhcyBhIGZpbmFsaXplciwgcmVtb3ZlIGl0IGZyb20gJ2FsbGdjJyBsaXN0IChtdXN0CisqKiBzZWFyY2ggdGhlIGxpc3QgdG8gZmluZCBpdCkgYW5kIGxpbmsgaXQgaW4gJ2Zpbm9iaicgbGlzdC4KKyovCit2b2lkIGx1YUNfY2hlY2tmaW5hbGl6ZXIgKGx1YV9TdGF0ZSAqTCwgR0NPYmplY3QgKm8sIFRhYmxlICptdCkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBpZiAodGVzdGJpdChnY2gobyktPm1hcmtlZCwgU0VQQVJBVEVEKSB8fCAvKiBvYmouIGlzIGFscmVhZHkgc2VwYXJhdGVkLi4uICovCisgICAgICBpc2ZpbmFsaXplZChvKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC4uLiBvciBpcyBmaW5hbGl6ZWQuLi4gKi8KKyAgICAgIGdmYXN0dG0oZywgbXQsIFRNX0dDKSA9PSBOVUxMKSAgICAgICAgICAgICAgICAvKiBvciBoYXMgbm8gZmluYWxpemVyPyAqLworICAgIHJldHVybjsgIC8qIG5vdGhpbmcgdG8gYmUgZG9uZSAqLworICBlbHNlIHsgIC8qIG1vdmUgJ28nIHRvICdmaW5vYmonIGxpc3QgKi8KKyAgICBHQ09iamVjdCAqKnA7CisgICAgR0NoZWFkZXIgKmhvID0gZ2NoKG8pOworICAgIGlmIChnLT5zd2VlcGdjID09ICZoby0+bmV4dCkgeyAgLyogYXZvaWQgcmVtb3ZpbmcgY3VycmVudCBzd2VlcCBvYmplY3QgKi8KKyAgICAgIGx1YV9hc3NlcnQoaXNzd2VlcHBoYXNlKGcpKTsKKyAgICAgIGctPnN3ZWVwZ2MgPSBzd2VlcHRvbGl2ZShMLCBnLT5zd2VlcGdjLCBOVUxMKTsKKyAgICB9CisgICAgLyogc2VhcmNoIGZvciBwb2ludGVyIHBvaW50aW5nIHRvICdvJyAqLworICAgIGZvciAocCA9ICZnLT5hbGxnYzsgKnAgIT0gbzsgcCA9ICZnY2goKnApLT5uZXh0KSB7IC8qIGVtcHR5ICovIH0KKyAgICAqcCA9IGhvLT5uZXh0OyAgLyogcmVtb3ZlICdvJyBmcm9tIHJvb3QgbGlzdCAqLworICAgIGhvLT5uZXh0ID0gZy0+Zmlub2JqOyAgLyogbGluayBpdCBpbiBsaXN0ICdmaW5vYmonICovCisgICAgZy0+Zmlub2JqID0gbzsKKyAgICBsX3NldGJpdChoby0+bWFya2VkLCBTRVBBUkFURUQpOyAgLyogbWFyayBpdCBhcyBzdWNoICovCisgICAgaWYgKCFrZWVwaW52YXJpYW50b3V0KGcpKSAgLyogbm90IGtlZXBpbmcgaW52YXJpYW50PyAqLworICAgICAgbWFrZXdoaXRlKGcsIG8pOyAgLyogInN3ZWVwIiBvYmplY3QgKi8KKyAgICBlbHNlCisgICAgICByZXNldG9sZGJpdChvKTsgIC8qIHNlZSBNT1ZFIE9MRCBydWxlICovCisgIH0KK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBHQyBjb250cm9sCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKKy8qCisqKiBzZXQgYSByZWFzb25hYmxlICJ0aW1lIiB0byB3YWl0IGJlZm9yZSBzdGFydGluZyBhIG5ldyBHQyBjeWNsZTsKKyoqIGN5Y2xlIHdpbGwgc3RhcnQgd2hlbiBtZW1vcnkgdXNlIGhpdHMgdGhyZXNob2xkCisqLworc3RhdGljIHZvaWQgc2V0cGF1c2UgKGdsb2JhbF9TdGF0ZSAqZywgbF9tZW0gZXN0aW1hdGUpIHsKKyAgbF9tZW0gZGVidCwgdGhyZXNob2xkOworICBlc3RpbWF0ZSA9IGVzdGltYXRlIC8gUEFVU0VBREo7ICAvKiBhZGp1c3QgJ2VzdGltYXRlJyAqLworICB0aHJlc2hvbGQgPSAoZy0+Z2NwYXVzZSA8IE1BWF9MTUVNIC8gZXN0aW1hdGUpICAvKiBvdmVyZmxvdz8gKi8KKyAgICAgICAgICAgID8gZXN0aW1hdGUgKiBnLT5nY3BhdXNlICAvKiBubyBvdmVyZmxvdyAqLworICAgICAgICAgICAgOiBNQVhfTE1FTTsgIC8qIG92ZXJmbG93OyB0cnVuY2F0ZSB0byBtYXhpbXVtICovCisgIGRlYnQgPSAtY2FzdChsX21lbSwgdGhyZXNob2xkIC0gZ2V0dG90YWxieXRlcyhnKSk7CisgIGx1YUVfc2V0ZGVidChnLCBkZWJ0KTsKK30KKworCisjZGVmaW5lIHN3ZWVwcGhhc2VzICBcCisJKGJpdG1hc2soR0NTc3dlZXBzdHJpbmcpIHwgYml0bWFzayhHQ1Nzd2VlcHVkYXRhKSB8IGJpdG1hc2soR0NTc3dlZXApKQorCisKKy8qCisqKiBlbnRlciBmaXJzdCBzd2VlcCBwaGFzZSAoc3RyaW5ncykgYW5kIHByZXBhcmUgcG9pbnRlcnMgZm9yIG90aGVyCisqKiBzd2VlcCBwaGFzZXMuICBUaGUgY2FsbHMgdG8gJ3N3ZWVwdG9saXZlJyBtYWtlIHBvaW50ZXJzIHBvaW50IHRvIGFuCisqKiBvYmplY3QgaW5zaWRlIHRoZSBsaXN0IChpbnN0ZWFkIG9mIHRvIHRoZSBoZWFkZXIpLCBzbyB0aGF0IHRoZSByZWFsCisqKiBzd2VlcCBkbyBub3QgbmVlZCB0byBza2lwIG9iamVjdHMgY3JlYXRlZCBiZXR3ZWVuICJub3ciIGFuZCB0aGUgc3RhcnQKKyoqIG9mIHRoZSByZWFsIHN3ZWVwLgorKiogUmV0dXJucyBob3cgbWFueSBvYmplY3RzIGl0IHN3ZXB0LgorKi8KK3N0YXRpYyBpbnQgZW50ZXJzd2VlcCAobHVhX1N0YXRlICpMKSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGludCBuID0gMDsKKyAgZy0+Z2NzdGF0ZSA9IEdDU3N3ZWVwc3RyaW5nOworICBsdWFfYXNzZXJ0KGctPnN3ZWVwZ2MgPT0gTlVMTCAmJiBnLT5zd2VlcGZpbiA9PSBOVUxMKTsKKyAgLyogcHJlcGFyZSB0byBzd2VlcCBzdHJpbmdzLCBmaW5hbGl6YWJsZSBvYmplY3RzLCBhbmQgcmVndWxhciBvYmplY3RzICovCisgIGctPnN3ZWVwc3RyZ2MgPSAwOworICBnLT5zd2VlcGZpbiA9IHN3ZWVwdG9saXZlKEwsICZnLT5maW5vYmosICZuKTsKKyAgZy0+c3dlZXBnYyA9IHN3ZWVwdG9saXZlKEwsICZnLT5hbGxnYywgJm4pOworICByZXR1cm4gbjsKK30KKworCisvKgorKiogY2hhbmdlIEdDIG1vZGUKKyovCit2b2lkIGx1YUNfY2hhbmdlbW9kZSAobHVhX1N0YXRlICpMLCBpbnQgbW9kZSkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBpZiAobW9kZSA9PSBnLT5nY2tpbmQpIHJldHVybjsgIC8qIG5vdGhpbmcgdG8gY2hhbmdlICovCisgIGlmIChtb2RlID09IEtHQ19HRU4pIHsgIC8qIGNoYW5nZSB0byBnZW5lcmF0aW9uYWwgbW9kZSAqLworICAgIC8qIG1ha2Ugc3VyZSBncmF5IGxpc3RzIGFyZSBjb25zaXN0ZW50ICovCisgICAgbHVhQ19ydW50aWxzdGF0ZShMLCBiaXRtYXNrKEdDU3Byb3BhZ2F0ZSkpOworICAgIGctPkdDZXN0aW1hdGUgPSBnZXR0b3RhbGJ5dGVzKGcpOworICAgIGctPmdja2luZCA9IEtHQ19HRU47CisgIH0KKyAgZWxzZSB7ICAvKiBjaGFuZ2UgdG8gaW5jcmVtZW50YWwgbW9kZSAqLworICAgIC8qIHN3ZWVwIGFsbCBvYmplY3RzIHRvIHR1cm4gdGhlbSBiYWNrIHRvIHdoaXRlCisgICAgICAgKGFzIHdoaXRlIGhhcyBub3QgY2hhbmdlZCwgbm90aGluZyBleHRyYSB3aWxsIGJlIGNvbGxlY3RlZCkgKi8KKyAgICBnLT5nY2tpbmQgPSBLR0NfTk9STUFMOworICAgIGVudGVyc3dlZXAoTCk7CisgICAgbHVhQ19ydW50aWxzdGF0ZShMLCB+c3dlZXBwaGFzZXMpOworICB9Cit9CisKKworLyoKKyoqIGNhbGwgYWxsIHBlbmRpbmcgZmluYWxpemVycworKi8KK3N0YXRpYyB2b2lkIGNhbGxhbGxwZW5kaW5nZmluYWxpemVycyAobHVhX1N0YXRlICpMLCBpbnQgcHJvcGFnYXRlZXJyb3JzKSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIHdoaWxlIChnLT50b2JlZm56KSB7CisgICAgcmVzZXRvbGRiaXQoZy0+dG9iZWZueik7CisgICAgR0NUTShMLCBwcm9wYWdhdGVlcnJvcnMpOworICB9Cit9CisKKwordm9pZCBsdWFDX2ZyZWVhbGxvYmplY3RzIChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgaW50IGk7CisgIHNlcGFyYXRldG9iZWZueihMLCAxKTsgIC8qIHNlcGFyYXRlIGFsbCBvYmplY3RzIHdpdGggZmluYWxpemVycyAqLworICBsdWFfYXNzZXJ0KGctPmZpbm9iaiA9PSBOVUxMKTsKKyAgY2FsbGFsbHBlbmRpbmdmaW5hbGl6ZXJzKEwsIDApOworICBnLT5jdXJyZW50d2hpdGUgPSBXSElURUJJVFM7IC8qIHRoaXMgIndoaXRlIiBtYWtlcyBhbGwgb2JqZWN0cyBsb29rIGRlYWQgKi8KKyAgZy0+Z2NraW5kID0gS0dDX05PUk1BTDsKKyAgc3dlZXB3aG9sZWxpc3QoTCwgJmctPmZpbm9iaik7ICAvKiBmaW5hbGl6ZXJzIGNhbiBjcmVhdGUgb2Jqcy4gaW4gJ2Zpbm9iaicgKi8KKyAgc3dlZXB3aG9sZWxpc3QoTCwgJmctPmFsbGdjKTsKKyAgZm9yIChpID0gMDsgaSA8IGctPnN0cnQuc2l6ZTsgaSsrKSAgLyogZnJlZSBhbGwgc3RyaW5nIGxpc3RzICovCisgICAgc3dlZXB3aG9sZWxpc3QoTCwgJmctPnN0cnQuaGFzaFtpXSk7CisgIGx1YV9hc3NlcnQoZy0+c3RydC5udXNlID09IDApOworfQorCisKK3N0YXRpYyBsX21lbSBhdG9taWMgKGx1YV9TdGF0ZSAqTCkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBsX21lbSB3b3JrID0gLWNhc3QobF9tZW0sIGctPkdDbWVtdHJhdik7ICAvKiBzdGFydCBjb3VudGluZyB3b3JrICovCisgIEdDT2JqZWN0ICpvcmlnd2VhaywgKm9yaWdhbGw7CisgIGx1YV9hc3NlcnQoIWlzd2hpdGUob2JqMmdjbyhnLT5tYWludGhyZWFkKSkpOworICBtYXJrb2JqZWN0KGcsIEwpOyAgLyogbWFyayBydW5uaW5nIHRocmVhZCAqLworICAvKiByZWdpc3RyeSBhbmQgZ2xvYmFsIG1ldGF0YWJsZXMgbWF5IGJlIGNoYW5nZWQgYnkgQVBJICovCisgIG1hcmt2YWx1ZShnLCAmZy0+bF9yZWdpc3RyeSk7CisgIG1hcmttdChnKTsgIC8qIG1hcmsgYmFzaWMgbWV0YXRhYmxlcyAqLworICAvKiByZW1hcmsgb2NjYXNpb25hbCB1cHZhbHVlcyBvZiAobWF5YmUpIGRlYWQgdGhyZWFkcyAqLworICByZW1hcmt1cHZhbHMoZyk7CisgIHByb3BhZ2F0ZWFsbChnKTsgIC8qIHByb3BhZ2F0ZSBjaGFuZ2VzICovCisgIHdvcmsgKz0gZy0+R0NtZW10cmF2OyAgLyogc3RvcCBjb3VudGluZyAoZG8gbm90IChyZSljb3VudCBncmF5cykgKi8KKyAgLyogdHJhdmVyc2Ugb2JqZWN0cyBjYXVnaHQgYnkgd3JpdGUgYmFycmllciBhbmQgYnkgJ3JlbWFya3VwdmFscycgKi8KKyAgcmV0cmF2ZXJzZWdyYXlzKGcpOworICB3b3JrIC09IGctPkdDbWVtdHJhdjsgIC8qIHJlc3RhcnQgY291bnRpbmcgKi8KKyAgY29udmVyZ2VlcGhlbWVyb25zKGcpOworICAvKiBhdCB0aGlzIHBvaW50LCBhbGwgc3Ryb25nbHkgYWNjZXNzaWJsZSBvYmplY3RzIGFyZSBtYXJrZWQuICovCisgIC8qIGNsZWFyIHZhbHVlcyBmcm9tIHdlYWsgdGFibGVzLCBiZWZvcmUgY2hlY2tpbmcgZmluYWxpemVycyAqLworICBjbGVhcnZhbHVlcyhnLCBnLT53ZWFrLCBOVUxMKTsKKyAgY2xlYXJ2YWx1ZXMoZywgZy0+YWxsd2VhaywgTlVMTCk7CisgIG9yaWd3ZWFrID0gZy0+d2Vhazsgb3JpZ2FsbCA9IGctPmFsbHdlYWs7CisgIHdvcmsgKz0gZy0+R0NtZW10cmF2OyAgLyogc3RvcCBjb3VudGluZyAob2JqZWN0cyBiZWluZyBmaW5hbGl6ZWQpICovCisgIHNlcGFyYXRldG9iZWZueihMLCAwKTsgIC8qIHNlcGFyYXRlIG9iamVjdHMgdG8gYmUgZmluYWxpemVkICovCisgIG1hcmtiZWluZ2ZueihnKTsgIC8qIG1hcmsgb2JqZWN0cyB0aGF0IHdpbGwgYmUgZmluYWxpemVkICovCisgIHByb3BhZ2F0ZWFsbChnKTsgIC8qIHJlbWFyaywgdG8gcHJvcGFnYXRlIGBwcmVzZXJ2ZW5lc3MnICovCisgIHdvcmsgLT0gZy0+R0NtZW10cmF2OyAgLyogcmVzdGFydCBjb3VudGluZyAqLworICBjb252ZXJnZWVwaGVtZXJvbnMoZyk7CisgIC8qIGF0IHRoaXMgcG9pbnQsIGFsbCByZXN1cnJlY3RlZCBvYmplY3RzIGFyZSBtYXJrZWQuICovCisgIC8qIHJlbW92ZSBkZWFkIG9iamVjdHMgZnJvbSB3ZWFrIHRhYmxlcyAqLworICBjbGVhcmtleXMoZywgZy0+ZXBoZW1lcm9uLCBOVUxMKTsgIC8qIGNsZWFyIGtleXMgZnJvbSBhbGwgZXBoZW1lcm9uIHRhYmxlcyAqLworICBjbGVhcmtleXMoZywgZy0+YWxsd2VhaywgTlVMTCk7ICAvKiBjbGVhciBrZXlzIGZyb20gYWxsIGFsbHdlYWsgdGFibGVzICovCisgIC8qIGNsZWFyIHZhbHVlcyBmcm9tIHJlc3VycmVjdGVkIHdlYWsgdGFibGVzICovCisgIGNsZWFydmFsdWVzKGcsIGctPndlYWssIG9yaWd3ZWFrKTsKKyAgY2xlYXJ2YWx1ZXMoZywgZy0+YWxsd2Vhaywgb3JpZ2FsbCk7CisgIGctPmN1cnJlbnR3aGl0ZSA9IGNhc3RfYnl0ZShvdGhlcndoaXRlKGcpKTsgIC8qIGZsaXAgY3VycmVudCB3aGl0ZSAqLworICB3b3JrICs9IGctPkdDbWVtdHJhdjsgIC8qIGNvbXBsZXRlIGNvdW50aW5nICovCisgIHJldHVybiB3b3JrOyAgLyogZXN0aW1hdGUgb2YgbWVtb3J5IG1hcmtlZCBieSAnYXRvbWljJyAqLworfQorCisKK3N0YXRpYyBsdV9tZW0gc2luZ2xlc3RlcCAobHVhX1N0YXRlICpMKSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIHN3aXRjaCAoZy0+Z2NzdGF0ZSkgeworICAgIGNhc2UgR0NTcGF1c2U6IHsKKyAgICAgIC8qIHN0YXJ0IHRvIGNvdW50IG1lbW9yeSB0cmF2ZXJzZWQgKi8KKyAgICAgIGctPkdDbWVtdHJhdiA9IGctPnN0cnQuc2l6ZSAqIHNpemVvZihHQ09iamVjdCopOworICAgICAgbHVhX2Fzc2VydCghaXNnZW5lcmF0aW9uYWwoZykpOworICAgICAgcmVzdGFydGNvbGxlY3Rpb24oZyk7CisgICAgICBnLT5nY3N0YXRlID0gR0NTcHJvcGFnYXRlOworICAgICAgcmV0dXJuIGctPkdDbWVtdHJhdjsKKyAgICB9CisgICAgY2FzZSBHQ1Nwcm9wYWdhdGU6IHsKKyAgICAgIGlmIChnLT5ncmF5KSB7CisgICAgICAgIGx1X21lbSBvbGR0cmF2ID0gZy0+R0NtZW10cmF2OworICAgICAgICBwcm9wYWdhdGVtYXJrKGcpOworICAgICAgICByZXR1cm4gZy0+R0NtZW10cmF2IC0gb2xkdHJhdjsgIC8qIG1lbW9yeSB0cmF2ZXJzZWQgaW4gdGhpcyBzdGVwICovCisgICAgICB9CisgICAgICBlbHNlIHsgIC8qIG5vIG1vcmUgYGdyYXknIG9iamVjdHMgKi8KKyAgICAgICAgbHVfbWVtIHdvcms7CisgICAgICAgIGludCBzdzsKKyAgICAgICAgZy0+Z2NzdGF0ZSA9IEdDU2F0b21pYzsgIC8qIGZpbmlzaCBtYXJrIHBoYXNlICovCisgICAgICAgIGctPkdDZXN0aW1hdGUgPSBnLT5HQ21lbXRyYXY7ICAvKiBzYXZlIHdoYXQgd2FzIGNvdW50ZWQgKi87CisgICAgICAgIHdvcmsgPSBhdG9taWMoTCk7ICAvKiBhZGQgd2hhdCB3YXMgdHJhdmVyc2VkIGJ5ICdhdG9taWMnICovCisgICAgICAgIGctPkdDZXN0aW1hdGUgKz0gd29yazsgIC8qIGVzdGltYXRlIG9mIHRvdGFsIG1lbW9yeSB0cmF2ZXJzZWQgKi8gCisgICAgICAgIHN3ID0gZW50ZXJzd2VlcChMKTsKKyAgICAgICAgcmV0dXJuIHdvcmsgKyBzdyAqIEdDU1dFRVBDT1NUOworICAgICAgfQorICAgIH0KKyAgICBjYXNlIEdDU3N3ZWVwc3RyaW5nOiB7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBHQ1NXRUVQTUFYICYmIGctPnN3ZWVwc3RyZ2MgKyBpIDwgZy0+c3RydC5zaXplOyBpKyspCisgICAgICAgIHN3ZWVwd2hvbGVsaXN0KEwsICZnLT5zdHJ0Lmhhc2hbZy0+c3dlZXBzdHJnYyArIGldKTsKKyAgICAgIGctPnN3ZWVwc3RyZ2MgKz0gaTsKKyAgICAgIGlmIChnLT5zd2VlcHN0cmdjID49IGctPnN0cnQuc2l6ZSkgIC8qIG5vIG1vcmUgc3RyaW5ncyB0byBzd2VlcD8gKi8KKyAgICAgICAgZy0+Z2NzdGF0ZSA9IEdDU3N3ZWVwdWRhdGE7CisgICAgICByZXR1cm4gaSAqIEdDU1dFRVBDT1NUOworICAgIH0KKyAgICBjYXNlIEdDU3N3ZWVwdWRhdGE6IHsKKyAgICAgIGlmIChnLT5zd2VlcGZpbikgeworICAgICAgICBnLT5zd2VlcGZpbiA9IHN3ZWVwbGlzdChMLCBnLT5zd2VlcGZpbiwgR0NTV0VFUE1BWCk7CisgICAgICAgIHJldHVybiBHQ1NXRUVQTUFYKkdDU1dFRVBDT1NUOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGctPmdjc3RhdGUgPSBHQ1Nzd2VlcDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgR0NTc3dlZXA6IHsKKyAgICAgIGlmIChnLT5zd2VlcGdjKSB7CisgICAgICAgIGctPnN3ZWVwZ2MgPSBzd2VlcGxpc3QoTCwgZy0+c3dlZXBnYywgR0NTV0VFUE1BWCk7CisgICAgICAgIHJldHVybiBHQ1NXRUVQTUFYKkdDU1dFRVBDT1NUOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8qIHN3ZWVwIG1haW4gdGhyZWFkICovCisgICAgICAgIEdDT2JqZWN0ICptdCA9IG9iajJnY28oZy0+bWFpbnRocmVhZCk7CisgICAgICAgIHN3ZWVwbGlzdChMLCAmbXQsIDEpOworICAgICAgICBjaGVja1NpemVzKEwpOworICAgICAgICBnLT5nY3N0YXRlID0gR0NTcGF1c2U7ICAvKiBmaW5pc2ggY29sbGVjdGlvbiAqLworICAgICAgICByZXR1cm4gR0NTV0VFUENPU1Q7CisgICAgICB9CisgICAgfQorICAgIGRlZmF1bHQ6IGx1YV9hc3NlcnQoMCk7IHJldHVybiAwOworICB9Cit9CisKKworLyoKKyoqIGFkdmFuY2VzIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB1bnRpbCBpdCByZWFjaGVzIGEgc3RhdGUgYWxsb3dlZAorKiogYnkgJ3N0YXRlbWFzaycKKyovCit2b2lkIGx1YUNfcnVudGlsc3RhdGUgKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXRlc21hc2spIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgd2hpbGUgKCF0ZXN0Yml0KHN0YXRlc21hc2ssIGctPmdjc3RhdGUpKQorICAgIHNpbmdsZXN0ZXAoTCk7Cit9CisKKworc3RhdGljIHZvaWQgZ2VuZXJhdGlvbmFsY29sbGVjdGlvbiAobHVhX1N0YXRlICpMKSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGx1YV9hc3NlcnQoZy0+Z2NzdGF0ZSA9PSBHQ1Nwcm9wYWdhdGUpOworICBpZiAoZy0+R0Nlc3RpbWF0ZSA9PSAwKSB7ICAvKiBzaWduYWwgZm9yIGFub3RoZXIgbWFqb3IgY29sbGVjdGlvbj8gKi8KKyAgICBsdWFDX2Z1bGxnYyhMLCAwKTsgIC8qIHBlcmZvcm0gYSBmdWxsIHJlZ3VsYXIgY29sbGVjdGlvbiAqLworICAgIGctPkdDZXN0aW1hdGUgPSBnZXR0b3RhbGJ5dGVzKGcpOyAgLyogdXBkYXRlIGNvbnRyb2wgKi8KKyAgfQorICBlbHNlIHsKKyAgICBsdV9tZW0gZXN0aW1hdGUgPSBnLT5HQ2VzdGltYXRlOworICAgIGx1YUNfcnVudGlsc3RhdGUoTCwgYml0bWFzayhHQ1NwYXVzZSkpOyAgLyogcnVuIGNvbXBsZXRlIChtaW5vcikgY3ljbGUgKi8KKyAgICBnLT5nY3N0YXRlID0gR0NTcHJvcGFnYXRlOyAgLyogc2tpcCByZXN0YXJ0ICovCisgICAgaWYgKGdldHRvdGFsYnl0ZXMoZykgPiAoZXN0aW1hdGUgLyAxMDApICogZy0+Z2NtYWpvcmluYykKKyAgICAgIGctPkdDZXN0aW1hdGUgPSAwOyAgLyogc2lnbmFsIGZvciBhIG1ham9yIGNvbGxlY3Rpb24gKi8KKyAgICBlbHNlCisgICAgICBnLT5HQ2VzdGltYXRlID0gZXN0aW1hdGU7ICAvKiBrZWVwIGVzdGltYXRlIGZyb20gbGFzdCBtYWpvciBjb2xsLiAqLworCisgIH0KKyAgc2V0cGF1c2UoZywgZ2V0dG90YWxieXRlcyhnKSk7CisgIGx1YV9hc3NlcnQoZy0+Z2NzdGF0ZSA9PSBHQ1Nwcm9wYWdhdGUpOworfQorCisKK3N0YXRpYyB2b2lkIGluY3N0ZXAgKGx1YV9TdGF0ZSAqTCkgeworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICBsX21lbSBkZWJ0ID0gZy0+R0NkZWJ0OworICBpbnQgc3RlcG11bCA9IGctPmdjc3RlcG11bDsKKyAgaWYgKHN0ZXBtdWwgPCA0MCkgc3RlcG11bCA9IDQwOyAgLyogYXZvaWQgcmlkaWN1bG91cyBsb3cgdmFsdWVzIChhbmQgMCkgKi8KKyAgLyogY29udmVydCBkZWJ0IGZyb20gS2IgdG8gJ3dvcmsgdW5pdHMnIChhdm9pZCB6ZXJvIGRlYnQgYW5kIG92ZXJmbG93cykgKi8KKyAgZGVidCA9IChkZWJ0IC8gU1RFUE1VTEFESikgKyAxOworICBkZWJ0ID0gKGRlYnQgPCBNQVhfTE1FTSAvIHN0ZXBtdWwpID8gZGVidCAqIHN0ZXBtdWwgOiBNQVhfTE1FTTsKKyAgZG8geyAgLyogYWx3YXlzIHBlcmZvcm0gYXQgbGVhc3Qgb25lIHNpbmdsZSBzdGVwICovCisgICAgbHVfbWVtIHdvcmsgPSBzaW5nbGVzdGVwKEwpOyAgLyogZG8gc29tZSB3b3JrICovCisgICAgZGVidCAtPSB3b3JrOworICB9IHdoaWxlIChkZWJ0ID4gLUdDU1RFUFNJWkUgJiYgZy0+Z2NzdGF0ZSAhPSBHQ1NwYXVzZSk7CisgIGlmIChnLT5nY3N0YXRlID09IEdDU3BhdXNlKQorICAgIHNldHBhdXNlKGcsIGctPkdDZXN0aW1hdGUpOyAgLyogcGF1c2UgdW50aWwgbmV4dCBjeWNsZSAqLworICBlbHNlIHsKKyAgICBkZWJ0ID0gKGRlYnQgLyBzdGVwbXVsKSAqIFNURVBNVUxBREo7ICAvKiBjb252ZXJ0ICd3b3JrIHVuaXRzJyB0byBLYiAqLworICAgIGx1YUVfc2V0ZGVidChnLCBkZWJ0KTsKKyAgfQorfQorCisKKy8qCisqKiBwZXJmb3JtcyBhIGJhc2ljIEdDIHN0ZXAKKyovCit2b2lkIGx1YUNfZm9yY2VzdGVwIChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgaW50IGk7CisgIGlmIChpc2dlbmVyYXRpb25hbChnKSkgZ2VuZXJhdGlvbmFsY29sbGVjdGlvbihMKTsKKyAgZWxzZSBpbmNzdGVwKEwpOworICAvKiBydW4gYSBmZXcgZmluYWxpemVycyAob3IgYWxsIG9mIHRoZW0gYXQgdGhlIGVuZCBvZiBhIGNvbGxlY3QgY3ljbGUpICovCisgIGZvciAoaSA9IDA7IGctPnRvYmVmbnogJiYgKGkgPCBHQ0ZJTkFMSVpFTlVNIHx8IGctPmdjc3RhdGUgPT0gR0NTcGF1c2UpOyBpKyspCisgICAgR0NUTShMLCAxKTsgIC8qIGNhbGwgb25lIGZpbmFsaXplciAqLworfQorCisKKy8qCisqKiBwZXJmb3JtcyBhIGJhc2ljIEdDIHN0ZXAgb25seSBpZiBjb2xsZWN0b3IgaXMgcnVubmluZworKi8KK3ZvaWQgbHVhQ19zdGVwIChsdWFfU3RhdGUgKkwpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgaWYgKGctPmdjcnVubmluZykgbHVhQ19mb3JjZXN0ZXAoTCk7CisgIGVsc2UgbHVhRV9zZXRkZWJ0KGcsIC1HQ1NURVBTSVpFKTsgIC8qIGF2b2lkIGJlaW5nIGNhbGxlZCB0b28gb2Z0ZW4gKi8KK30KKworCisKKy8qCisqKiBwZXJmb3JtcyBhIGZ1bGwgR0MgY3ljbGU7IGlmICJpc2VtZXJnZW5jeSIsIGRvZXMgbm90IGNhbGwKKyoqIGZpbmFsaXplcnMgKHdoaWNoIGNvdWxkIGNoYW5nZSBzdGFjayBwb3NpdGlvbnMpCisqLwordm9pZCBsdWFDX2Z1bGxnYyAobHVhX1N0YXRlICpMLCBpbnQgaXNlbWVyZ2VuY3kpIHsKKyAgZ2xvYmFsX1N0YXRlICpnID0gRyhMKTsKKyAgaW50IG9yaWdraW5kID0gZy0+Z2NraW5kOworICBsdWFfYXNzZXJ0KG9yaWdraW5kICE9IEtHQ19FTUVSR0VOQ1kpOworICBpZiAoaXNlbWVyZ2VuY3kpICAvKiBkbyBub3QgcnVuIGZpbmFsaXplcnMgZHVyaW5nIGVtZXJnZW5jeSBHQyAqLworICAgIGctPmdja2luZCA9IEtHQ19FTUVSR0VOQ1k7CisgIGVsc2UgeworICAgIGctPmdja2luZCA9IEtHQ19OT1JNQUw7CisgICAgY2FsbGFsbHBlbmRpbmdmaW5hbGl6ZXJzKEwsIDEpOworICB9CisgIGlmIChrZWVwaW52YXJpYW50KGcpKSB7ICAvKiBtYXkgdGhlcmUgYmUgc29tZSBibGFjayBvYmplY3RzPyAqLworICAgIC8qIG11c3Qgc3dlZXAgYWxsIG9iamVjdHMgdG8gdHVybiB0aGVtIGJhY2sgdG8gd2hpdGUKKyAgICAgICAoYXMgd2hpdGUgaGFzIG5vdCBjaGFuZ2VkLCBub3RoaW5nIHdpbGwgYmUgY29sbGVjdGVkKSAqLworICAgIGVudGVyc3dlZXAoTCk7CisgIH0KKyAgLyogZmluaXNoIGFueSBwZW5kaW5nIHN3ZWVwIHBoYXNlIHRvIHN0YXJ0IGEgbmV3IGN5Y2xlICovCisgIGx1YUNfcnVudGlsc3RhdGUoTCwgYml0bWFzayhHQ1NwYXVzZSkpOworICBsdWFDX3J1bnRpbHN0YXRlKEwsIH5iaXRtYXNrKEdDU3BhdXNlKSk7ICAvKiBzdGFydCBuZXcgY29sbGVjdGlvbiAqLworICBsdWFDX3J1bnRpbHN0YXRlKEwsIGJpdG1hc2soR0NTcGF1c2UpKTsgIC8qIHJ1biBlbnRpcmUgY29sbGVjdGlvbiAqLworICBpZiAob3JpZ2tpbmQgPT0gS0dDX0dFTikgeyAgLyogZ2VuZXJhdGlvbmFsIG1vZGU/ICovCisgICAgLyogZ2VuZXJhdGlvbmFsIG1vZGUgbXVzdCBiZSBrZXB0IGluIHByb3BhZ2F0ZSBwaGFzZSAqLworICAgIGx1YUNfcnVudGlsc3RhdGUoTCwgYml0bWFzayhHQ1Nwcm9wYWdhdGUpKTsKKyAgfQorICBnLT5nY2tpbmQgPSBvcmlna2luZDsKKyAgc2V0cGF1c2UoZywgZ2V0dG90YWxieXRlcyhnKSk7CisgIGlmICghaXNlbWVyZ2VuY3kpICAgLyogZG8gbm90IHJ1biBmaW5hbGl6ZXJzIGR1cmluZyBlbWVyZ2VuY3kgR0MgKi8KKyAgICBjYWxsYWxscGVuZGluZ2ZpbmFsaXplcnMoTCwgMSk7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xnYy5oIGIvY29tMzIvbHVhL3NyYy9sZ2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGJiMWNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sZ2MuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyoqICRJZDogbGdjLmgsdiAyLjU4LjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIEdhcmJhZ2UgQ29sbGVjdG9yCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsZ2NfaAorI2RlZmluZSBsZ2NfaAorCisKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisKKy8qCisqKiBDb2xsZWN0YWJsZSBvYmplY3RzIG1heSBoYXZlIG9uZSBvZiB0aHJlZSBjb2xvcnM6IHdoaXRlLCB3aGljaAorKiogbWVhbnMgdGhlIG9iamVjdCBpcyBub3QgbWFya2VkOyBncmF5LCB3aGljaCBtZWFucyB0aGUKKyoqIG9iamVjdCBpcyBtYXJrZWQsIGJ1dCBpdHMgcmVmZXJlbmNlcyBtYXkgYmUgbm90IG1hcmtlZDsgYW5kCisqKiBibGFjaywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIHJlZmVyZW5jZXMgYXJlIG1hcmtlZC4KKyoqIFRoZSBtYWluIGludmFyaWFudCBvZiB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IsIHdoaWxlIG1hcmtpbmcgb2JqZWN0cywKKyoqIGlzIHRoYXQgYSBibGFjayBvYmplY3QgY2FuIG5ldmVyIHBvaW50IHRvIGEgd2hpdGUgb25lLiBNb3Jlb3ZlciwKKyoqIGFueSBncmF5IG9iamVjdCBtdXN0IGJlIGluIGEgImdyYXkgbGlzdCIgKGdyYXksIGdyYXlhZ2Fpbiwgd2VhaywKKyoqIGFsbHdlYWssIGVwaGVtZXJvbikgc28gdGhhdCBpdCBjYW4gYmUgdmlzaXRlZCBhZ2FpbiBiZWZvcmUgZmluaXNoaW5nCisqKiB0aGUgY29sbGVjdGlvbiBjeWNsZS4gVGhlc2UgbGlzdHMgaGF2ZSBubyBtZWFuaW5nIHdoZW4gdGhlIGludmFyaWFudAorKiogaXMgbm90IGJlaW5nIGVuZm9yY2VkIChlLmcuLCBzd2VlcCBwaGFzZSkuCisqLworCisKKworLyogaG93IG11Y2ggdG8gYWxsb2NhdGUgYmVmb3JlIG5leHQgR0Mgc3RlcCAqLworI2lmICFkZWZpbmVkKEdDU1RFUFNJWkUpCisvKiB+MTAwIHNtYWxsIHN0cmluZ3MgKi8KKyNkZWZpbmUgR0NTVEVQU0laRQkoY2FzdF9pbnQoMTAwICogc2l6ZW9mKFRTdHJpbmcpKSkKKyNlbmRpZgorCisKKy8qCisqKiBQb3NzaWJsZSBzdGF0ZXMgb2YgdGhlIEdhcmJhZ2UgQ29sbGVjdG9yCisqLworI2RlZmluZSBHQ1Nwcm9wYWdhdGUJMAorI2RlZmluZSBHQ1NhdG9taWMJMQorI2RlZmluZSBHQ1Nzd2VlcHN0cmluZwkyCisjZGVmaW5lIEdDU3N3ZWVwdWRhdGEJMworI2RlZmluZSBHQ1Nzd2VlcAk0CisjZGVmaW5lIEdDU3BhdXNlCTUKKworCisjZGVmaW5lIGlzc3dlZXBwaGFzZShnKSAgXAorCShHQ1Nzd2VlcHN0cmluZyA8PSAoZyktPmdjc3RhdGUgJiYgKGcpLT5nY3N0YXRlIDw9IEdDU3N3ZWVwKQorCisjZGVmaW5lIGlzZ2VuZXJhdGlvbmFsKGcpCSgoZyktPmdja2luZCA9PSBLR0NfR0VOKQorCisvKgorKiogbWFjcm9zIHRvIHRlbGwgd2hlbiBtYWluIGludmFyaWFudCAod2hpdGUgb2JqZWN0cyBjYW5ub3QgcG9pbnQgdG8gYmxhY2sKKyoqIG9uZXMpIG11c3QgYmUga2VwdC4gRHVyaW5nIGEgbm9uLWdlbmVyYXRpb25hbCBjb2xsZWN0aW9uLCB0aGUgc3dlZXAKKyoqIHBoYXNlIG1heSBicmVhayB0aGUgaW52YXJpYW50LCBhcyBvYmplY3RzIHR1cm5lZCB3aGl0ZSBtYXkgcG9pbnQgdG8KKyoqIHN0aWxsLWJsYWNrIG9iamVjdHMuIFRoZSBpbnZhcmlhbnQgaXMgcmVzdG9yZWQgd2hlbiBzd2VlcCBlbmRzIGFuZAorKiogYWxsIG9iamVjdHMgYXJlIHdoaXRlIGFnYWluLiBEdXJpbmcgYSBnZW5lcmF0aW9uYWwgY29sbGVjdGlvbiwgdGhlCisqKiBpbnZhcmlhbnQgbXVzdCBiZSBrZXB0IGFsbCB0aW1lcy4KKyovCisKKyNkZWZpbmUga2VlcGludmFyaWFudChnKQkoaXNnZW5lcmF0aW9uYWwoZykgfHwgZy0+Z2NzdGF0ZSA8PSBHQ1NhdG9taWMpCisKKworLyoKKyoqIE91dHNpZGUgdGhlIGNvbGxlY3RvciwgdGhlIHN0YXRlIGluIGdlbmVyYXRpb25hbCBtb2RlIGlzIGtlcHQgaW4KKyoqICdwcm9wYWdhdGUnLCBzbyAna2VlcGludmFyaWFudCcgaXMgYWx3YXlzIHRydWUuCisqLworI2RlZmluZSBrZWVwaW52YXJpYW50b3V0KGcpICBcCisgIGNoZWNrX2V4cChnLT5nY3N0YXRlID09IEdDU3Byb3BhZ2F0ZSB8fCAhaXNnZW5lcmF0aW9uYWwoZyksICBcCisgICAgICAgICAgICBnLT5nY3N0YXRlIDw9IEdDU2F0b21pYykKKworCisvKgorKiogc29tZSB1c2VmdWwgYml0IHRyaWNrcworKi8KKyNkZWZpbmUgcmVzZXRiaXRzKHgsbSkJCSgoeCkgJj0gY2FzdChsdV9ieXRlLCB+KG0pKSkKKyNkZWZpbmUgc2V0Yml0cyh4LG0pCQkoKHgpIHw9IChtKSkKKyNkZWZpbmUgdGVzdGJpdHMoeCxtKQkJKCh4KSAmIChtKSkKKyNkZWZpbmUgYml0bWFzayhiKQkJKDE8PChiKSkKKyNkZWZpbmUgYml0Mm1hc2soYjEsYjIpCQkoYml0bWFzayhiMSkgfCBiaXRtYXNrKGIyKSkKKyNkZWZpbmUgbF9zZXRiaXQoeCxiKQkJc2V0Yml0cyh4LCBiaXRtYXNrKGIpKQorI2RlZmluZSByZXNldGJpdCh4LGIpCQlyZXNldGJpdHMoeCwgYml0bWFzayhiKSkKKyNkZWZpbmUgdGVzdGJpdCh4LGIpCQl0ZXN0Yml0cyh4LCBiaXRtYXNrKGIpKQorCisKKy8qIExheW91dCBmb3IgYml0IHVzZSBpbiBgbWFya2VkJyBmaWVsZDogKi8KKyNkZWZpbmUgV0hJVEUwQklUCTAgIC8qIG9iamVjdCBpcyB3aGl0ZSAodHlwZSAwKSAqLworI2RlZmluZSBXSElURTFCSVQJMSAgLyogb2JqZWN0IGlzIHdoaXRlICh0eXBlIDEpICovCisjZGVmaW5lIEJMQUNLQklUCTIgIC8qIG9iamVjdCBpcyBibGFjayAqLworI2RlZmluZSBGSU5BTElaRURCSVQJMyAgLyogb2JqZWN0IGhhcyBiZWVuIHNlcGFyYXRlZCBmb3IgZmluYWxpemF0aW9uICovCisjZGVmaW5lIFNFUEFSQVRFRAk0ICAvKiBvYmplY3QgaXMgaW4gJ2Zpbm9iaicgbGlzdCBvciBpbiAndG9iZWZueicgKi8KKyNkZWZpbmUgRklYRURCSVQJNSAgLyogb2JqZWN0IGlzIGZpeGVkIChzaG91bGQgbm90IGJlIGNvbGxlY3RlZCkgKi8KKyNkZWZpbmUgT0xEQklUCQk2ICAvKiBvYmplY3QgaXMgb2xkIChvbmx5IGluIGdlbmVyYXRpb25hbCBtb2RlKSAqLworLyogYml0IDcgaXMgY3VycmVudGx5IHVzZWQgYnkgdGVzdHMgKGx1YUxfY2hlY2ttZW1vcnkpICovCisKKyNkZWZpbmUgV0hJVEVCSVRTCWJpdDJtYXNrKFdISVRFMEJJVCwgV0hJVEUxQklUKQorCisKKyNkZWZpbmUgaXN3aGl0ZSh4KSAgICAgIHRlc3RiaXRzKCh4KS0+Z2NoLm1hcmtlZCwgV0hJVEVCSVRTKQorI2RlZmluZSBpc2JsYWNrKHgpICAgICAgdGVzdGJpdCgoeCktPmdjaC5tYXJrZWQsIEJMQUNLQklUKQorI2RlZmluZSBpc2dyYXkoeCkgIC8qIG5laXRoZXIgd2hpdGUgbm9yIGJsYWNrICovICBcCisJKCF0ZXN0Yml0cygoeCktPmdjaC5tYXJrZWQsIFdISVRFQklUUyB8IGJpdG1hc2soQkxBQ0tCSVQpKSkKKworI2RlZmluZSBpc29sZCh4KQl0ZXN0Yml0KCh4KS0+Z2NoLm1hcmtlZCwgT0xEQklUKQorCisvKiBNT1ZFIE9MRCBydWxlOiB3aGVuZXZlciBhbiBvYmplY3QgaXMgbW92ZWQgdG8gdGhlIGJlZ2lubmluZyBvZgorICAgYSBHQyBsaXN0LCBpdHMgb2xkIGJpdCBtdXN0IGJlIGNsZWFyZWQgKi8KKyNkZWZpbmUgcmVzZXRvbGRiaXQobykJcmVzZXRiaXQoKG8pLT5nY2gubWFya2VkLCBPTERCSVQpCisKKyNkZWZpbmUgb3RoZXJ3aGl0ZShnKQkoZy0+Y3VycmVudHdoaXRlIF4gV0hJVEVCSVRTKQorI2RlZmluZSBpc2RlYWRtKG93LG0pCSghKCgobSkgXiBXSElURUJJVFMpICYgKG93KSkpCisjZGVmaW5lIGlzZGVhZChnLHYpCWlzZGVhZG0ob3RoZXJ3aGl0ZShnKSwgKHYpLT5nY2gubWFya2VkKQorCisjZGVmaW5lIGNoYW5nZXdoaXRlKHgpCSgoeCktPmdjaC5tYXJrZWQgXj0gV0hJVEVCSVRTKQorI2RlZmluZSBncmF5MmJsYWNrKHgpCWxfc2V0Yml0KCh4KS0+Z2NoLm1hcmtlZCwgQkxBQ0tCSVQpCisKKyNkZWZpbmUgdmFsaXN3aGl0ZSh4KQkoaXNjb2xsZWN0YWJsZSh4KSAmJiBpc3doaXRlKGdjdmFsdWUoeCkpKQorCisjZGVmaW5lIGx1YUNfd2hpdGUoZykJY2FzdChsdV9ieXRlLCAoZyktPmN1cnJlbnR3aGl0ZSAmIFdISVRFQklUUykKKworCisjZGVmaW5lIGx1YUNfY29uZEdDKEwsYykgXAorCXtpZiAoRyhMKS0+R0NkZWJ0ID4gMCkge2M7fTsgY29uZGNoYW5nZW1lbShMKTt9CisjZGVmaW5lIGx1YUNfY2hlY2tHQyhMKQkJbHVhQ19jb25kR0MoTCwgbHVhQ19zdGVwKEwpOykKKworCisjZGVmaW5lIGx1YUNfYmFycmllcihMLHAsdikgeyBpZiAodmFsaXN3aGl0ZSh2KSAmJiBpc2JsYWNrKG9iajJnY28ocCkpKSAgXAorCWx1YUNfYmFycmllcl8oTCxvYmoyZ2NvKHApLGdjdmFsdWUodikpOyB9CisKKyNkZWZpbmUgbHVhQ19iYXJyaWVyYmFjayhMLHAsdikgeyBpZiAodmFsaXN3aGl0ZSh2KSAmJiBpc2JsYWNrKG9iajJnY28ocCkpKSAgXAorCWx1YUNfYmFycmllcmJhY2tfKEwscCk7IH0KKworI2RlZmluZSBsdWFDX29iamJhcnJpZXIoTCxwLG8pICBcCisJeyBpZiAoaXN3aGl0ZShvYmoyZ2NvKG8pKSAmJiBpc2JsYWNrKG9iajJnY28ocCkpKSBcCisJCWx1YUNfYmFycmllcl8oTCxvYmoyZ2NvKHApLG9iajJnY28obykpOyB9CisKKyNkZWZpbmUgbHVhQ19vYmpiYXJyaWVyYmFjayhMLHAsbykgIFwKKyAgIHsgaWYgKGlzd2hpdGUob2JqMmdjbyhvKSkgJiYgaXNibGFjayhvYmoyZ2NvKHApKSkgbHVhQ19iYXJyaWVyYmFja18oTCxwKTsgfQorCisjZGVmaW5lIGx1YUNfYmFycmllcnByb3RvKEwscCxjKSBcCisgICB7IGlmIChpc2JsYWNrKG9iajJnY28ocCkpKSBsdWFDX2JhcnJpZXJwcm90b18oTCxwLGMpOyB9CisKK0xVQUlfRlVOQyB2b2lkIGx1YUNfZnJlZWFsbG9iamVjdHMgKGx1YV9TdGF0ZSAqTCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFDX3N0ZXAgKGx1YV9TdGF0ZSAqTCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFDX2ZvcmNlc3RlcCAobHVhX1N0YXRlICpMKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUNfcnVudGlsc3RhdGUgKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXRlc21hc2spOworTFVBSV9GVU5DIHZvaWQgbHVhQ19mdWxsZ2MgKGx1YV9TdGF0ZSAqTCwgaW50IGlzZW1lcmdlbmN5KTsKK0xVQUlfRlVOQyBHQ09iamVjdCAqbHVhQ19uZXdvYmogKGx1YV9TdGF0ZSAqTCwgaW50IHR0LCBzaXplX3Qgc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ09iamVjdCAqKmxpc3QsIGludCBvZmZzZXQpOworTFVBSV9GVU5DIHZvaWQgbHVhQ19iYXJyaWVyXyAobHVhX1N0YXRlICpMLCBHQ09iamVjdCAqbywgR0NPYmplY3QgKnYpOworTFVBSV9GVU5DIHZvaWQgbHVhQ19iYXJyaWVyYmFja18gKGx1YV9TdGF0ZSAqTCwgR0NPYmplY3QgKm8pOworTFVBSV9GVU5DIHZvaWQgbHVhQ19iYXJyaWVycHJvdG9fIChsdWFfU3RhdGUgKkwsIFByb3RvICpwLCBDbG9zdXJlICpjKTsKK0xVQUlfRlVOQyB2b2lkIGx1YUNfY2hlY2tmaW5hbGl6ZXIgKGx1YV9TdGF0ZSAqTCwgR0NPYmplY3QgKm8sIFRhYmxlICptdCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFDX2NoZWNrdXB2YWxjb2xvciAoZ2xvYmFsX1N0YXRlICpnLCBVcFZhbCAqdXYpOworTFVBSV9GVU5DIHZvaWQgbHVhQ19jaGFuZ2Vtb2RlIChsdWFfU3RhdGUgKkwsIGludCBtb2RlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xpbml0LmMgYi9jb20zMi9sdWEvc3JjL2xpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwZGZhNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbGluaXQuYwpAQCAtMCwwICsxLDY5IEBACisvKgorKiogJElkOiBsaW5pdC5jLHYgMS4zMi4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBJbml0aWFsaXphdGlvbiBvZiBsaWJyYXJpZXMgZm9yIGx1YS5jIGFuZCBvdGhlciBjbGllbnRzCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisvKgorKiogSWYgeW91IGVtYmVkIEx1YSBpbiB5b3VyIHByb2dyYW0gYW5kIG5lZWQgdG8gb3BlbiB0aGUgc3RhbmRhcmQKKyoqIGxpYnJhcmllcywgY2FsbCBsdWFMX29wZW5saWJzIGluIHlvdXIgcHJvZ3JhbS4gSWYgeW91IG5lZWQgYQorKiogZGlmZmVyZW50IHNldCBvZiBsaWJyYXJpZXMsIGNvcHkgdGhpcyBmaWxlIHRvIHlvdXIgcHJvamVjdCBhbmQgZWRpdAorKiogaXQgdG8gc3VpdCB5b3VyIG5lZWRzLgorKi8KKworCisjZGVmaW5lIGxpbml0X2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsdWFsaWIuaCIKKyNpbmNsdWRlICJsYXV4bGliLmgiCisKKworLyoKKyoqIHRoZXNlIGxpYnMgYXJlIGxvYWRlZCBieSBsdWEuYyBhbmQgYXJlIHJlYWRpbHkgYXZhaWxhYmxlIHRvIGFueSBMdWEKKyoqIHByb2dyYW0KKyovCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgbG9hZGVkbGlic1tdID0geworICB7Il9HIiwgbHVhb3Blbl9iYXNlfSwKKyAge0xVQV9MT0FETElCTkFNRSwgbHVhb3Blbl9wYWNrYWdlfSwKKyAge0xVQV9DT0xJQk5BTUUsIGx1YW9wZW5fY29yb3V0aW5lfSwKKyAge0xVQV9UQUJMSUJOQU1FLCBsdWFvcGVuX3RhYmxlfSwKKyAge0xVQV9JT0xJQk5BTUUsIGx1YW9wZW5faW99LAorICB7TFVBX09TTElCTkFNRSwgbHVhb3Blbl9vc30sCisgIHtMVUFfU1RSTElCTkFNRSwgbHVhb3Blbl9zdHJpbmd9LAorICB7TFVBX0JJVExJQk5BTUUsIGx1YW9wZW5fYml0MzJ9LAorI2lmbmRlZiBMVUFfTlVNQkVSX0lOVEVHUkFMCisgIHtMVUFfTUFUSExJQk5BTUUsIGx1YW9wZW5fbWF0aH0sCisjZW5kaWYKKyAge0xVQV9EQkxJQk5BTUUsIGx1YW9wZW5fZGVidWd9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworLyoKKyoqIHRoZXNlIGxpYnMgYXJlIHByZWxvYWRlZCBhbmQgbXVzdCBiZSByZXF1aXJlZCBiZWZvcmUgdXNlZAorKi8KK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBwcmVsb2FkZWRsaWJzW10gPSB7CisgIHtOVUxMLCBOVUxMfQorfTsKKworCitMVUFMSUJfQVBJIHZvaWQgbHVhTF9vcGVubGlicyAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGx1YUxfUmVnICpsaWI7CisgIC8qIGNhbGwgb3BlbiBmdW5jdGlvbnMgZnJvbSAnbG9hZGVkbGlicycgYW5kIHNldCByZXN1bHRzIHRvIGdsb2JhbCB0YWJsZSAqLworICBmb3IgKGxpYiA9IGxvYWRlZGxpYnM7IGxpYi0+ZnVuYzsgbGliKyspIHsKKyAgICBsdWFMX3JlcXVpcmVmKEwsIGxpYi0+bmFtZSwgbGliLT5mdW5jLCAxKTsKKyAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIGxpYiAqLworICB9CisgIC8qIGFkZCBvcGVuIGZ1bmN0aW9ucyBmcm9tICdwcmVsb2FkZWRsaWJzJyBpbnRvICdwYWNrYWdlLnByZWxvYWQnIHRhYmxlICovCisgIGx1YUxfZ2V0c3VidGFibGUoTCwgTFVBX1JFR0lTVFJZSU5ERVgsICJfUFJFTE9BRCIpOworICBmb3IgKGxpYiA9IHByZWxvYWRlZGxpYnM7IGxpYi0+ZnVuYzsgbGliKyspIHsKKyAgICBsdWFfcHVzaGNmdW5jdGlvbihMLCBsaWItPmZ1bmMpOworICAgIGx1YV9zZXRmaWVsZChMLCAtMiwgbGliLT5uYW1lKTsKKyAgfQorICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIF9QUkVMT0FEIHRhYmxlICovCit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGlvbGliLmMgYi9jb20zMi9sdWEvc3JjL2xpb2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmIyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xpb2xpYi5jCkBAIC0wLDAgKzEsNjg2IEBACisvKgorKiogJElkOiBsaW9saWIuYyx2IDIuMTEyLjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIFN0YW5kYXJkIEkvTyAoYW5kIHN5c3RlbSkgbGlicmFyeQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworLyoKKyoqIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGNvbWUgYmVmb3JlIHRoZSBpbmNsdXNpb24gb2YgJ3N0ZGlvLmgnOyBpdAorKiogc2hvdWxkIG5vdCBhZmZlY3Qgbm9uLVBPU0lYIHN5c3RlbXMKKyovCisjaWYgIWRlZmluZWQoX0ZJTEVfT0ZGU0VUX0JJVFMpCisjZGVmaW5lCV9MQVJHRUZJTEVfU09VUkNFCTEKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMJNjQKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbGlvbGliX2MKKyNkZWZpbmUgTFVBX0xJQgorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKworI2lmICFkZWZpbmVkKGx1YV9jaGVja21vZGUpCisKKy8qCisqKiBDaGVjayB3aGV0aGVyICdtb2RlJyBtYXRjaGVzICdbcndhXSUrP2I/Jy4KKyoqIENoYW5nZSB0aGlzIG1hY3JvIHRvIGFjY2VwdCBvdGhlciBtb2RlcyBmb3IgJ2ZvcGVuJyBiZXNpZGVzCisqKiB0aGUgc3RhbmRhcmQgb25lcy4KKyovCisjZGVmaW5lIGx1YV9jaGVja21vZGUobW9kZSkgXAorCSgqbW9kZSAhPSAnXDAnICYmIHN0cmNocigicndhIiwgKihtb2RlKyspKSAhPSBOVUxMICYmCVwKKwkoKm1vZGUgIT0gJysnIHx8ICsrbW9kZSkgJiYgIC8qIHNraXAgaWYgY2hhciBpcyAnKycgKi8JXAorCSgqbW9kZSAhPSAnYicgfHwgKyttb2RlKSAmJiAgLyogc2tpcCBpZiBjaGFyIGlzICdiJyAqLwlcCisJKCptb2RlID09ICdcMCcpKQorCisjZW5kaWYKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIGx1YV9wb3BlbiBzcGF3bnMgYSBuZXcgcHJvY2VzcyBjb25uZWN0ZWQgdG8gdGhlIGN1cnJlbnQKKyoqIG9uZSB0aHJvdWdoIHRoZSBmaWxlIHN0cmVhbXMuCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgIWRlZmluZWQobHVhX3BvcGVuKQkvKiB7ICovCisKKyNpZiBkZWZpbmVkKExVQV9VU0VfUE9QRU4pCS8qIHsgKi8KKworI2RlZmluZSBsdWFfcG9wZW4oTCxjLG0pCSgodm9pZClMLCBmZmx1c2goTlVMTCksIHBvcGVuKGMsbSkpCisjZGVmaW5lIGx1YV9wY2xvc2UoTCxmaWxlKQkoKHZvaWQpTCwgcGNsb3NlKGZpbGUpKQorCisjZWxpZiBkZWZpbmVkKExVQV9XSU4pCQkvKiB9eyAqLworCisjZGVmaW5lIGx1YV9wb3BlbihMLGMsbSkJCSgodm9pZClMLCBfcG9wZW4oYyxtKSkKKyNkZWZpbmUgbHVhX3BjbG9zZShMLGZpbGUpCQkoKHZvaWQpTCwgX3BjbG9zZShmaWxlKSkKKworCisjZWxzZQkJCQkvKiB9eyAqLworCisjZGVmaW5lIGx1YV9wb3BlbihMLGMsbSkJCSgodm9pZCkoKHZvaWQpYywgbSksICBcCisJCWx1YUxfZXJyb3IoTCwgTFVBX1FMKCJwb3BlbiIpICIgbm90IHN1cHBvcnRlZCIpLCAoRklMRSopMCkKKyNkZWZpbmUgbHVhX3BjbG9zZShMLGZpbGUpCQkoKHZvaWQpKCh2b2lkKUwsIGZpbGUpLCAtMSkKKworCisjZW5kaWYJCQkJLyogfSAqLworCisjZW5kaWYJCQkvKiB9ICovCisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogbHVhX2ZzZWVrOiBjb25maWd1cmF0aW9uIGZvciBsb25nZXIgb2Zmc2V0cworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmICFkZWZpbmVkKGx1YV9mc2VlaykJJiYgIWRlZmluZWQoTFVBX0FOU0kpCS8qIHsgKi8KKworI2lmIGRlZmluZWQoTFVBX1VTRV9QT1NJWCkJLyogeyAqLworCisjZGVmaW5lIGxfZnNlZWsoZixvLHcpCQlmc2Vla28oZixvLHcpCisjZGVmaW5lIGxfZnRlbGwoZikJCWZ0ZWxsbyhmKQorI2RlZmluZSBsX3NlZWtudW0JCW9mZl90CisKKyNlbGlmIGRlZmluZWQoTFVBX1dJTikgJiYgIWRlZmluZWQoX0NSVElNUF9UWVBFSU5GTykgXAorICAgJiYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDE0MDApCS8qIH17ICovCisvKiBXaW5kb3dzIChidXQgbm90IERESykgYW5kIFZpc3VhbCBDKysgMjAwNSBvciBoaWdoZXIgKi8KKworI2RlZmluZSBsX2ZzZWVrKGYsbyx3KQkJX2ZzZWVraTY0KGYsbyx3KQorI2RlZmluZSBsX2Z0ZWxsKGYpCQlfZnRlbGxpNjQoZikKKyNkZWZpbmUgbF9zZWVrbnVtCQlfX2ludDY0CisKKyNlbmRpZgkvKiB9ICovCisKKyNlbmRpZgkJCS8qIH0gKi8KKworCisjaWYgIWRlZmluZWQobF9mc2VlaykJCS8qIGRlZmF1bHQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgbF9mc2VlayhmLG8sdykJCWZzZWVrKGYsbyx3KQorI2RlZmluZSBsX2Z0ZWxsKGYpCQlmdGVsbChmKQorI2RlZmluZSBsX3NlZWtudW0JCWxvbmcKKyNlbmRpZgorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworI2RlZmluZSBJT19QUkVGSVgJIl9JT18iCisjZGVmaW5lIElPX0lOUFVUCShJT19QUkVGSVggImlucHV0IikKKyNkZWZpbmUgSU9fT1VUUFVUCShJT19QUkVGSVggIm91dHB1dCIpCisKKwordHlwZWRlZiBsdWFMX1N0cmVhbSBMU3RyZWFtOworCisKKyNkZWZpbmUgdG9sc3RyZWFtKEwpCSgoTFN0cmVhbSAqKWx1YUxfY2hlY2t1ZGF0YShMLCAxLCBMVUFfRklMRUhBTkRMRSkpCisKKyNkZWZpbmUgaXNjbG9zZWQocCkJKChwKS0+Y2xvc2VmID09IE5VTEwpCisKKworc3RhdGljIGludCBpb190eXBlIChsdWFfU3RhdGUgKkwpIHsKKyAgTFN0cmVhbSAqcDsKKyAgbHVhTF9jaGVja2FueShMLCAxKTsKKyAgcCA9IChMU3RyZWFtICopbHVhTF90ZXN0dWRhdGEoTCwgMSwgTFVBX0ZJTEVIQU5ETEUpOworICBpZiAocCA9PSBOVUxMKQorICAgIGx1YV9wdXNobmlsKEwpOyAgLyogbm90IGEgZmlsZSAqLworICBlbHNlIGlmIChpc2Nsb3NlZChwKSkKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgImNsb3NlZCBmaWxlIik7CisgIGVsc2UKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgImZpbGUiKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBmX3Rvc3RyaW5nIChsdWFfU3RhdGUgKkwpIHsKKyAgTFN0cmVhbSAqcCA9IHRvbHN0cmVhbShMKTsKKyAgaWYgKGlzY2xvc2VkKHApKQorICAgIGx1YV9wdXNobGl0ZXJhbChMLCAiZmlsZSAoY2xvc2VkKSIpOworICBlbHNlCisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJmaWxlICglcCkiLCBwLT5mKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIEZJTEUgKnRvZmlsZSAobHVhX1N0YXRlICpMKSB7CisgIExTdHJlYW0gKnAgPSB0b2xzdHJlYW0oTCk7CisgIGlmIChpc2Nsb3NlZChwKSkKKyAgICBsdWFMX2Vycm9yKEwsICJhdHRlbXB0IHRvIHVzZSBhIGNsb3NlZCBmaWxlIik7CisgIGx1YV9hc3NlcnQocC0+Zik7CisgIHJldHVybiBwLT5mOworfQorCisKKy8qCisqKiBXaGVuIGNyZWF0aW5nIGZpbGUgaGFuZGxlcywgYWx3YXlzIGNyZWF0ZXMgYSBgY2xvc2VkJyBmaWxlIGhhbmRsZQorKiogYmVmb3JlIG9wZW5pbmcgdGhlIGFjdHVhbCBmaWxlOyBzbywgaWYgdGhlcmUgaXMgYSBtZW1vcnkgZXJyb3IsIHRoZQorKiogZmlsZSBpcyBub3QgbGVmdCBvcGVuZWQuCisqLworc3RhdGljIExTdHJlYW0gKm5ld3ByZWZpbGUgKGx1YV9TdGF0ZSAqTCkgeworICBMU3RyZWFtICpwID0gKExTdHJlYW0gKilsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKExTdHJlYW0pKTsKKyAgcC0+Y2xvc2VmID0gTlVMTDsgIC8qIG1hcmsgZmlsZSBoYW5kbGUgYXMgJ2Nsb3NlZCcgKi8KKyAgbHVhTF9zZXRtZXRhdGFibGUoTCwgTFVBX0ZJTEVIQU5ETEUpOworICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgaW50IGF1eF9jbG9zZSAobHVhX1N0YXRlICpMKSB7CisgIExTdHJlYW0gKnAgPSB0b2xzdHJlYW0oTCk7CisgIGx1YV9DRnVuY3Rpb24gY2YgPSBwLT5jbG9zZWY7CisgIHAtPmNsb3NlZiA9IE5VTEw7ICAvKiBtYXJrIHN0cmVhbSBhcyBjbG9zZWQgKi8KKyAgcmV0dXJuICgqY2YpKEwpOyAgLyogY2xvc2UgaXQgKi8KK30KKworCitzdGF0aWMgaW50IGlvX2Nsb3NlIChsdWFfU3RhdGUgKkwpIHsKKyAgaWYgKGx1YV9pc25vbmUoTCwgMSkpICAvKiBubyBhcmd1bWVudD8gKi8KKyAgICBsdWFfZ2V0ZmllbGQoTCwgTFVBX1JFR0lTVFJZSU5ERVgsIElPX09VVFBVVCk7ICAvKiB1c2Ugc3RhbmRhcmQgb3V0cHV0ICovCisgIHRvZmlsZShMKTsgIC8qIG1ha2Ugc3VyZSBhcmd1bWVudCBpcyBhbiBvcGVuIHN0cmVhbSAqLworICByZXR1cm4gYXV4X2Nsb3NlKEwpOworfQorCisKK3N0YXRpYyBpbnQgZl9nYyAobHVhX1N0YXRlICpMKSB7CisgIExTdHJlYW0gKnAgPSB0b2xzdHJlYW0oTCk7CisgIGlmICghaXNjbG9zZWQocCkgJiYgcC0+ZiAhPSBOVUxMKQorICAgIGF1eF9jbG9zZShMKTsgIC8qIGlnbm9yZSBjbG9zZWQgYW5kIGluY29tcGxldGVseSBvcGVuIGZpbGVzICovCisgIHJldHVybiAwOworfQorCisKKy8qCisqKiBmdW5jdGlvbiB0byBjbG9zZSByZWd1bGFyIGZpbGVzCisqLworc3RhdGljIGludCBpb19mY2xvc2UgKGx1YV9TdGF0ZSAqTCkgeworICBMU3RyZWFtICpwID0gdG9sc3RyZWFtKEwpOworICBpbnQgcmVzID0gZmNsb3NlKHAtPmYpOworICByZXR1cm4gbHVhTF9maWxlcmVzdWx0KEwsIChyZXMgPT0gMCksIE5VTEwpOworfQorCisKK3N0YXRpYyBMU3RyZWFtICpuZXdmaWxlIChsdWFfU3RhdGUgKkwpIHsKKyAgTFN0cmVhbSAqcCA9IG5ld3ByZWZpbGUoTCk7CisgIHAtPmYgPSBOVUxMOworICBwLT5jbG9zZWYgPSAmaW9fZmNsb3NlOworICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgdm9pZCBvcGVuY2hlY2sgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpIHsKKyAgTFN0cmVhbSAqcCA9IG5ld2ZpbGUoTCk7CisgIHAtPmYgPSBmb3BlbihmbmFtZSwgbW9kZSk7CisgIGlmIChwLT5mID09IE5VTEwpCisgICAgbHVhTF9lcnJvcihMLCAiY2Fubm90IG9wZW4gZmlsZSAiIExVQV9RUyAiICglcykiLCBmbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworCitzdGF0aWMgaW50IGlvX29wZW4gKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGNvbnN0IGNoYXIgKm1vZGUgPSBsdWFMX29wdHN0cmluZyhMLCAyLCAiciIpOworICBMU3RyZWFtICpwID0gbmV3ZmlsZShMKTsKKyAgY29uc3QgY2hhciAqbWQgPSBtb2RlOyAgLyogdG8gdHJhdmVyc2UvY2hlY2sgbW9kZSAqLworICBsdWFMX2FyZ2NoZWNrKEwsIGx1YV9jaGVja21vZGUobWQpLCAyLCAiaW52YWxpZCBtb2RlIik7CisgIHAtPmYgPSBmb3BlbihmaWxlbmFtZSwgbW9kZSk7CisgIHJldHVybiAocC0+ZiA9PSBOVUxMKSA/IGx1YUxfZmlsZXJlc3VsdChMLCAwLCBmaWxlbmFtZSkgOiAxOworfQorCisKKy8qCisqKiBmdW5jdGlvbiB0byBjbG9zZSAncG9wZW4nIGZpbGVzCisqLworc3RhdGljIGludCBpb19wY2xvc2UgKGx1YV9TdGF0ZSAqTCkgeworICBMU3RyZWFtICpwID0gdG9sc3RyZWFtKEwpOworICByZXR1cm4gbHVhTF9leGVjcmVzdWx0KEwsIGx1YV9wY2xvc2UoTCwgcC0+ZikpOworfQorCisKK3N0YXRpYyBpbnQgaW9fcG9wZW4gKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGNvbnN0IGNoYXIgKm1vZGUgPSBsdWFMX29wdHN0cmluZyhMLCAyLCAiciIpOworICBMU3RyZWFtICpwID0gbmV3cHJlZmlsZShMKTsKKyAgcC0+ZiA9IGx1YV9wb3BlbihMLCBmaWxlbmFtZSwgbW9kZSk7CisgIHAtPmNsb3NlZiA9ICZpb19wY2xvc2U7CisgIHJldHVybiAocC0+ZiA9PSBOVUxMKSA/IGx1YUxfZmlsZXJlc3VsdChMLCAwLCBmaWxlbmFtZSkgOiAxOworfQorCisKKyNpZm5kZWYgU1lTTElOVVgKK3N0YXRpYyBpbnQgaW9fdG1wZmlsZSAobHVhX1N0YXRlICpMKSB7CisgIExTdHJlYW0gKnAgPSBuZXdmaWxlKEwpOworICBwLT5mID0gdG1wZmlsZSgpOworICByZXR1cm4gKHAtPmYgPT0gTlVMTCkgPyBsdWFMX2ZpbGVyZXN1bHQoTCwgMCwgTlVMTCkgOiAxOworfQorI2VuZGlmCisKKworc3RhdGljIEZJTEUgKmdldGlvZmlsZSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmaW5kZXgpIHsKKyAgTFN0cmVhbSAqcDsKKyAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCBmaW5kZXgpOworICBwID0gKExTdHJlYW0gKilsdWFfdG91c2VyZGF0YShMLCAtMSk7CisgIGlmIChpc2Nsb3NlZChwKSkKKyAgICBsdWFMX2Vycm9yKEwsICJzdGFuZGFyZCAlcyBmaWxlIGlzIGNsb3NlZCIsIGZpbmRleCArIHN0cmxlbihJT19QUkVGSVgpKTsKKyAgcmV0dXJuIHAtPmY7Cit9CisKKworc3RhdGljIGludCBnX2lvZmlsZSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmLCBjb25zdCBjaGFyICptb2RlKSB7CisgIGlmICghbHVhX2lzbm9uZW9ybmlsKEwsIDEpKSB7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBsdWFfdG9zdHJpbmcoTCwgMSk7CisgICAgaWYgKGZpbGVuYW1lKQorICAgICAgb3BlbmNoZWNrKEwsIGZpbGVuYW1lLCBtb2RlKTsKKyAgICBlbHNlIHsKKyAgICAgIHRvZmlsZShMKTsgIC8qIGNoZWNrIHRoYXQgaXQncyBhIHZhbGlkIGZpbGUgaGFuZGxlICovCisgICAgICBsdWFfcHVzaHZhbHVlKEwsIDEpOworICAgIH0KKyAgICBsdWFfc2V0ZmllbGQoTCwgTFVBX1JFR0lTVFJZSU5ERVgsIGYpOworICB9CisgIC8qIHJldHVybiBjdXJyZW50IHZhbHVlICovCisgIGx1YV9nZXRmaWVsZChMLCBMVUFfUkVHSVNUUllJTkRFWCwgZik7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgaW9faW5wdXQgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gZ19pb2ZpbGUoTCwgSU9fSU5QVVQsICJyIik7Cit9CisKKworc3RhdGljIGludCBpb19vdXRwdXQgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gZ19pb2ZpbGUoTCwgSU9fT1VUUFVULCAidyIpOworfQorCisKK3N0YXRpYyBpbnQgaW9fcmVhZGxpbmUgKGx1YV9TdGF0ZSAqTCk7CisKKworc3RhdGljIHZvaWQgYXV4X2xpbmVzIChsdWFfU3RhdGUgKkwsIGludCB0b2Nsb3NlKSB7CisgIGludCBpOworICBpbnQgbiA9IGx1YV9nZXR0b3AoTCkgLSAxOyAgLyogbnVtYmVyIG9mIGFyZ3VtZW50cyB0byByZWFkICovCisgIC8qIGVuc3VyZSB0aGF0IGFyZ3VtZW50cyB3aWxsIGZpdCBoZXJlIGFuZCBpbnRvICdpb19yZWFkbGluZScgc3RhY2sgKi8KKyAgbHVhTF9hcmdjaGVjayhMLCBuIDw9IExVQV9NSU5TVEFDSyAtIDMsIExVQV9NSU5TVEFDSyAtIDMsICJ0b28gbWFueSBvcHRpb25zIik7CisgIGx1YV9wdXNodmFsdWUoTCwgMSk7ICAvKiBmaWxlIGhhbmRsZSAqLworICBsdWFfcHVzaGludGVnZXIoTCwgbik7ICAvKiBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHJlYWQgKi8KKyAgbHVhX3B1c2hib29sZWFuKEwsIHRvY2xvc2UpOyAgLyogY2xvc2Uvbm90IGNsb3NlIGZpbGUgd2hlbiBmaW5pc2hlZCAqLworICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykgbHVhX3B1c2h2YWx1ZShMLCBpICsgMSk7ICAvKiBjb3B5IGFyZ3VtZW50cyAqLworICBsdWFfcHVzaGNjbG9zdXJlKEwsIGlvX3JlYWRsaW5lLCAzICsgbik7Cit9CisKKworc3RhdGljIGludCBmX2xpbmVzIChsdWFfU3RhdGUgKkwpIHsKKyAgdG9maWxlKEwpOyAgLyogY2hlY2sgdGhhdCBpdCdzIGEgdmFsaWQgZmlsZSBoYW5kbGUgKi8KKyAgYXV4X2xpbmVzKEwsIDApOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGlvX2xpbmVzIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IHRvY2xvc2U7CisgIGlmIChsdWFfaXNub25lKEwsIDEpKSBsdWFfcHVzaG5pbChMKTsgIC8qIGF0IGxlYXN0IG9uZSBhcmd1bWVudCAqLworICBpZiAobHVhX2lzbmlsKEwsIDEpKSB7ICAvKiBubyBmaWxlIG5hbWU/ICovCisgICAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCBJT19JTlBVVCk7ICAvKiBnZXQgZGVmYXVsdCBpbnB1dCAqLworICAgIGx1YV9yZXBsYWNlKEwsIDEpOyAgLyogcHV0IGl0IGF0IGluZGV4IDEgKi8KKyAgICB0b2ZpbGUoTCk7ICAvKiBjaGVjayB0aGF0IGl0J3MgYSB2YWxpZCBmaWxlIGhhbmRsZSAqLworICAgIHRvY2xvc2UgPSAwOyAgLyogZG8gbm90IGNsb3NlIGl0IGFmdGVyIGl0ZXJhdGlvbiAqLworICB9CisgIGVsc2UgeyAgLyogb3BlbiBhIG5ldyBmaWxlICovCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICAgIG9wZW5jaGVjayhMLCBmaWxlbmFtZSwgInIiKTsKKyAgICBsdWFfcmVwbGFjZShMLCAxKTsgIC8qIHB1dCBmaWxlIGF0IGluZGV4IDEgKi8KKyAgICB0b2Nsb3NlID0gMTsgIC8qIGNsb3NlIGl0IGFmdGVyIGl0ZXJhdGlvbiAqLworICB9CisgIGF1eF9saW5lcyhMLCB0b2Nsb3NlKTsKKyAgcmV0dXJuIDE7Cit9CisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFJFQUQKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworI2lmbmRlZiBTWVNMSU5VWAorc3RhdGljIGludCByZWFkX251bWJlciAobHVhX1N0YXRlICpMLCBGSUxFICpmKSB7CisgIGx1YV9OdW1iZXIgZDsKKyAgaWYgKGZzY2FuZihmLCBMVUFfTlVNQkVSX1NDQU4sICZkKSA9PSAxKSB7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgZCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSB7CisgICBsdWFfcHVzaG5pbChMKTsgIC8qICJyZXN1bHQiIHRvIGJlIHJlbW92ZWQgKi8KKyAgIHJldHVybiAwOyAgLyogcmVhZCBmYWlscyAqLworICB9Cit9CisKKworc3RhdGljIGludCB0ZXN0X2VvZiAobHVhX1N0YXRlICpMLCBGSUxFICpmKSB7CisgIGludCBjID0gZ2V0YyhmKTsKKyAgdW5nZXRjKGMsIGYpOworICBsdWFfcHVzaGxzdHJpbmcoTCwgTlVMTCwgMCk7CisgIHJldHVybiAoYyAhPSBFT0YpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgdGVzdF9lb2YgKGx1YV9TdGF0ZSAqTCwgRklMRSAqZikgeworICAodm9pZClmOworICBsdWFfcHVzaGxzdHJpbmcoTCwgTlVMTCwgMCk7CisgIHJldHVybiAxOworfQorI2VuZGlmCisKKworc3RhdGljIGludCByZWFkX2xpbmUgKGx1YV9TdGF0ZSAqTCwgRklMRSAqZiwgaW50IGNob3ApIHsKKyAgbHVhTF9CdWZmZXIgYjsKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIGZvciAoOzspIHsKKyAgICBzaXplX3QgbDsKKyAgICBjaGFyICpwID0gbHVhTF9wcmVwYnVmZmVyKCZiKTsKKyAgICBpZiAoZmdldHMocCwgTFVBTF9CVUZGRVJTSVpFLCBmKSA9PSBOVUxMKSB7ICAvKiBlb2Y/ICovCisgICAgICBsdWFMX3B1c2hyZXN1bHQoJmIpOyAgLyogY2xvc2UgYnVmZmVyICovCisgICAgICByZXR1cm4gKGx1YV9yYXdsZW4oTCwgLTEpID4gMCk7ICAvKiBjaGVjayB3aGV0aGVyIHJlYWQgc29tZXRoaW5nICovCisgICAgfQorICAgIGwgPSBzdHJsZW4ocCk7CisgICAgaWYgKGwgPT0gMCB8fCBwW2wtMV0gIT0gJ1xuJykKKyAgICAgIGx1YUxfYWRkc2l6ZSgmYiwgbCk7CisgICAgZWxzZSB7CisgICAgICBsdWFMX2FkZHNpemUoJmIsIGwgLSBjaG9wKTsgIC8qIGNob3AgJ2VvbCcgaWYgbmVlZGVkICovCisgICAgICBsdWFMX3B1c2hyZXN1bHQoJmIpOyAgLyogY2xvc2UgYnVmZmVyICovCisgICAgICByZXR1cm4gMTsgIC8qIHJlYWQgYXQgbGVhc3QgYW4gYGVvbCcgKi8KKyAgICB9CisgIH0KK30KKworCisjZGVmaW5lIE1BWF9TSVpFX1QJKH4oc2l6ZV90KTApCisKK3N0YXRpYyB2b2lkIHJlYWRfYWxsIChsdWFfU3RhdGUgKkwsIEZJTEUgKmYpIHsKKyAgc2l6ZV90IHJsZW4gPSBMVUFMX0JVRkZFUlNJWkU7ICAvKiBob3cgbXVjaCB0byByZWFkIGluIGVhY2ggY3ljbGUgKi8KKyAgbHVhTF9CdWZmZXIgYjsKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIGZvciAoOzspIHsKKyAgICBjaGFyICpwID0gbHVhTF9wcmVwYnVmZnNpemUoJmIsIHJsZW4pOworICAgIHNpemVfdCBuciA9IGZyZWFkKHAsIHNpemVvZihjaGFyKSwgcmxlbiwgZik7CisgICAgbHVhTF9hZGRzaXplKCZiLCBucik7CisgICAgaWYgKG5yIDwgcmxlbikgYnJlYWs7ICAvKiBlb2Y/ICovCisgICAgZWxzZSBpZiAocmxlbiA8PSAoTUFYX1NJWkVfVCAvIDQpKSAgLyogYXZvaWQgYnVmZmVycyB0b28gbGFyZ2UgKi8KKyAgICAgIHJsZW4gKj0gMjsgIC8qIGRvdWJsZSBidWZmZXIgc2l6ZSBhdCBlYWNoIGl0ZXJhdGlvbiAqLworICB9CisgIGx1YUxfcHVzaHJlc3VsdCgmYik7ICAvKiBjbG9zZSBidWZmZXIgKi8KK30KKworCitzdGF0aWMgaW50IHJlYWRfY2hhcnMgKGx1YV9TdGF0ZSAqTCwgRklMRSAqZiwgc2l6ZV90IG4pIHsKKyAgc2l6ZV90IG5yOyAgLyogbnVtYmVyIG9mIGNoYXJzIGFjdHVhbGx5IHJlYWQgKi8KKyAgY2hhciAqcDsKKyAgbHVhTF9CdWZmZXIgYjsKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIHAgPSBsdWFMX3ByZXBidWZmc2l6ZSgmYiwgbik7ICAvKiBwcmVwYXJlIGJ1ZmZlciB0byByZWFkIHdob2xlIGJsb2NrICovCisgIG5yID0gZnJlYWQocCwgc2l6ZW9mKGNoYXIpLCBuLCBmKTsgIC8qIHRyeSB0byByZWFkICduJyBjaGFycyAqLworICBsdWFMX2FkZHNpemUoJmIsIG5yKTsKKyAgbHVhTF9wdXNocmVzdWx0KCZiKTsgIC8qIGNsb3NlIGJ1ZmZlciAqLworICByZXR1cm4gKG5yID4gMCk7ICAvKiB0cnVlIGlmZiByZWFkIHNvbWV0aGluZyAqLworfQorCisKK3N0YXRpYyBpbnQgZ19yZWFkIChsdWFfU3RhdGUgKkwsIEZJTEUgKmYsIGludCBmaXJzdCkgeworICBpbnQgbmFyZ3MgPSBsdWFfZ2V0dG9wKEwpIC0gMTsKKyAgaW50IHN1Y2Nlc3M7CisgIGludCBuOworICBjbGVhcmVycihmKTsKKyAgaWYgKG5hcmdzID09IDApIHsgIC8qIG5vIGFyZ3VtZW50cz8gKi8KKyAgICBzdWNjZXNzID0gcmVhZF9saW5lKEwsIGYsIDEpOworICAgIG4gPSBmaXJzdCsxOyAgLyogdG8gcmV0dXJuIDEgcmVzdWx0ICovCisgIH0KKyAgZWxzZSB7ICAvKiBlbnN1cmUgc3RhY2sgc3BhY2UgZm9yIGFsbCByZXN1bHRzIGFuZCBmb3IgYXV4bGliJ3MgYnVmZmVyICovCisgICAgbHVhTF9jaGVja3N0YWNrKEwsIG5hcmdzK0xVQV9NSU5TVEFDSywgInRvbyBtYW55IGFyZ3VtZW50cyIpOworICAgIHN1Y2Nlc3MgPSAxOworICAgIGZvciAobiA9IGZpcnN0OyBuYXJncy0tICYmIHN1Y2Nlc3M7IG4rKykgeworICAgICAgaWYgKGx1YV90eXBlKEwsIG4pID09IExVQV9UTlVNQkVSKSB7CisgICAgICAgIHNpemVfdCBsID0gKHNpemVfdClsdWFfdG9pbnRlZ2VyKEwsIG4pOworICAgICAgICBzdWNjZXNzID0gKGwgPT0gMCkgPyB0ZXN0X2VvZihMLCBmKSA6IHJlYWRfY2hhcnMoTCwgZiwgbCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IGx1YV90b3N0cmluZyhMLCBuKTsKKyAgICAgICAgbHVhTF9hcmdjaGVjayhMLCBwICYmIHBbMF0gPT0gJyonLCBuLCAiaW52YWxpZCBvcHRpb24iKTsKKyAgICAgICAgc3dpdGNoIChwWzFdKSB7CisgICAgICAgICAgY2FzZSAnbic6ICAvKiBudW1iZXIgKi8KKyNpZm5kZWYgU1lTTElOVVgKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSByZWFkX251bWJlcihMLCBmKTsKKyNlbHNlCisgICAgICAgICAgICByZXR1cm4gbHVhTF9hcmdlcnJvcihMLCBuLCAiXCIqbnVtYmVyXCIgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdsJzogIC8qIGxpbmUgKi8KKyAgICAgICAgICAgIHN1Y2Nlc3MgPSByZWFkX2xpbmUoTCwgZiwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdMJzogIC8qIGxpbmUgd2l0aCBlbmQtb2YtbGluZSAqLworICAgICAgICAgICAgc3VjY2VzcyA9IHJlYWRfbGluZShMLCBmLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2EnOiAgLyogZmlsZSAqLworICAgICAgICAgICAgcmVhZF9hbGwoTCwgZik7ICAvKiByZWFkIGVudGlyZSBmaWxlICovCisgICAgICAgICAgICBzdWNjZXNzID0gMTsgLyogYWx3YXlzIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbHVhTF9hcmdlcnJvcihMLCBuLCAiaW52YWxpZCBmb3JtYXQiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoZmVycm9yKGYpKQorICAgIHJldHVybiBsdWFMX2ZpbGVyZXN1bHQoTCwgMCwgTlVMTCk7CisgIGlmICghc3VjY2VzcykgeworICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgbGFzdCByZXN1bHQgKi8KKyAgICBsdWFfcHVzaG5pbChMKTsgIC8qIHB1c2ggbmlsIGluc3RlYWQgKi8KKyAgfQorICByZXR1cm4gbiAtIGZpcnN0OworfQorCisKK3N0YXRpYyBpbnQgaW9fcmVhZCAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBnX3JlYWQoTCwgZ2V0aW9maWxlKEwsIElPX0lOUFVUKSwgMSk7Cit9CisKKworc3RhdGljIGludCBmX3JlYWQgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gZ19yZWFkKEwsIHRvZmlsZShMKSwgMik7Cit9CisKKworc3RhdGljIGludCBpb19yZWFkbGluZSAobHVhX1N0YXRlICpMKSB7CisgIExTdHJlYW0gKnAgPSAoTFN0cmVhbSAqKWx1YV90b3VzZXJkYXRhKEwsIGx1YV91cHZhbHVlaW5kZXgoMSkpOworICBpbnQgaTsKKyAgaW50IG4gPSAoaW50KWx1YV90b2ludGVnZXIoTCwgbHVhX3VwdmFsdWVpbmRleCgyKSk7CisgIGlmIChpc2Nsb3NlZChwKSkgIC8qIGZpbGUgaXMgYWxyZWFkeSBjbG9zZWQ/ICovCisgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgImZpbGUgaXMgYWxyZWFkeSBjbG9zZWQiKTsKKyAgbHVhX3NldHRvcChMICwgMSk7CisgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKSAgLyogcHVzaCBhcmd1bWVudHMgdG8gJ2dfcmVhZCcgKi8KKyAgICBsdWFfcHVzaHZhbHVlKEwsIGx1YV91cHZhbHVlaW5kZXgoMyArIGkpKTsKKyAgbiA9IGdfcmVhZChMLCBwLT5mLCAyKTsgIC8qICduJyBpcyBudW1iZXIgb2YgcmVzdWx0cyAqLworICBsdWFfYXNzZXJ0KG4gPiAwKTsgIC8qIHNob3VsZCByZXR1cm4gYXQgbGVhc3QgYSBuaWwgKi8KKyAgaWYgKCFsdWFfaXNuaWwoTCwgLW4pKSAgLyogcmVhZCBhdCBsZWFzdCBvbmUgdmFsdWU/ICovCisgICAgcmV0dXJuIG47ICAvKiByZXR1cm4gdGhlbSAqLworICBlbHNlIHsgIC8qIGZpcnN0IHJlc3VsdCBpcyBuaWw6IEVPRiBvciBlcnJvciAqLworICAgIGlmIChuID4gMSkgeyAgLyogaXMgdGhlcmUgZXJyb3IgaW5mb3JtYXRpb24/ICovCisgICAgICAvKiAybmQgcmVzdWx0IGlzIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICIlcyIsIGx1YV90b3N0cmluZyhMLCAtbiArIDEpKTsKKyAgICB9CisgICAgaWYgKGx1YV90b2Jvb2xlYW4oTCwgbHVhX3VwdmFsdWVpbmRleCgzKSkpIHsgIC8qIGdlbmVyYXRvciBjcmVhdGVkIGZpbGU/ICovCisgICAgICBsdWFfc2V0dG9wKEwsIDApOworICAgICAgbHVhX3B1c2h2YWx1ZShMLCBsdWFfdXB2YWx1ZWluZGV4KDEpKTsKKyAgICAgIGF1eF9jbG9zZShMKTsgIC8qIGNsb3NlIGl0ICovCisgICAgfQorICAgIHJldHVybiAwOworICB9Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitzdGF0aWMgaW50IGdfd3JpdGUgKGx1YV9TdGF0ZSAqTCwgRklMRSAqZiwgaW50IGFyZykgeworICBpbnQgbmFyZ3MgPSBsdWFfZ2V0dG9wKEwpIC0gYXJnOworICBpbnQgc3RhdHVzID0gMTsKKyAgZm9yICg7IG5hcmdzLS07IGFyZysrKSB7CisgICAgaWYgKGx1YV90eXBlKEwsIGFyZykgPT0gTFVBX1ROVU1CRVIpIHsKKyAgICAgIC8qIG9wdGltaXphdGlvbjogY291bGQgYmUgZG9uZSBleGFjdGx5IGFzIGZvciBzdHJpbmdzICovCisgICAgICBzdGF0dXMgPSBzdGF0dXMgJiYKKyAgICAgICAgICBmcHJpbnRmKGYsIExVQV9OVU1CRVJfRk1ULCBsdWFfdG9udW1iZXIoTCwgYXJnKSkgPiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNpemVfdCBsOworICAgICAgY29uc3QgY2hhciAqcyA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIGFyZywgJmwpOworICAgICAgc3RhdHVzID0gc3RhdHVzICYmIChmd3JpdGUocywgc2l6ZW9mKGNoYXIpLCBsLCBmKSA9PSBsKTsKKyAgICB9CisgIH0KKyAgaWYgKHN0YXR1cykgcmV0dXJuIDE7ICAvKiBmaWxlIGhhbmRsZSBhbHJlYWR5IG9uIHN0YWNrIHRvcCAqLworICBlbHNlIHJldHVybiBsdWFMX2ZpbGVyZXN1bHQoTCwgc3RhdHVzLCBOVUxMKTsKK30KKworCitzdGF0aWMgaW50IGlvX3dyaXRlIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIGdfd3JpdGUoTCwgZ2V0aW9maWxlKEwsIElPX09VVFBVVCksIDEpOworfQorCisKK3N0YXRpYyBpbnQgZl93cml0ZSAobHVhX1N0YXRlICpMKSB7CisgIEZJTEUgKmYgPSB0b2ZpbGUoTCk7CisgIGx1YV9wdXNodmFsdWUoTCwgMSk7ICAvKiBwdXNoIGZpbGUgYXQgdGhlIHN0YWNrIHRvcCAodG8gYmUgcmV0dXJuZWQpICovCisgIHJldHVybiBnX3dyaXRlKEwsIGYsIDIpOworfQorCisKKyNpZm5kZWYgU1lTTElOVVgKK3N0YXRpYyBpbnQgZl9zZWVrIChsdWFfU3RhdGUgKkwpIHsKKyAgc3RhdGljIGNvbnN0IGludCBtb2RlW10gPSB7U0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORH07CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtb2RlbmFtZXNbXSA9IHsic2V0IiwgImN1ciIsICJlbmQiLCBOVUxMfTsKKyAgRklMRSAqZiA9IHRvZmlsZShMKTsKKyAgaW50IG9wID0gbHVhTF9jaGVja29wdGlvbihMLCAyLCAiY3VyIiwgbW9kZW5hbWVzKTsKKyAgbHVhX051bWJlciBwMyA9IGx1YUxfb3B0bnVtYmVyKEwsIDMsIDApOworICBsX3NlZWtudW0gb2Zmc2V0ID0gKGxfc2Vla251bSlwMzsKKyAgbHVhTF9hcmdjaGVjayhMLCAobHVhX051bWJlcilvZmZzZXQgPT0gcDMsIDMsCisgICAgICAgICAgICAgICAgICAibm90IGFuIGludGVnZXIgaW4gcHJvcGVyIHJhbmdlIik7CisgIG9wID0gbF9mc2VlayhmLCBvZmZzZXQsIG1vZGVbb3BdKTsKKyAgaWYgKG9wKQorICAgIHJldHVybiBsdWFMX2ZpbGVyZXN1bHQoTCwgMCwgTlVMTCk7ICAvKiBlcnJvciAqLworICBlbHNlIHsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAobHVhX051bWJlcilsX2Z0ZWxsKGYpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgZl9zZXR2YnVmIChsdWFfU3RhdGUgKkwpIHsKKyAgc3RhdGljIGNvbnN0IGludCBtb2RlW10gPSB7X0lPTkJGLCBfSU9GQkYsIF9JT0xCRn07CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtb2RlbmFtZXNbXSA9IHsibm8iLCAiZnVsbCIsICJsaW5lIiwgTlVMTH07CisgIEZJTEUgKmYgPSB0b2ZpbGUoTCk7CisgIGludCBvcCA9IGx1YUxfY2hlY2tvcHRpb24oTCwgMiwgTlVMTCwgbW9kZW5hbWVzKTsKKyAgbHVhX0ludGVnZXIgc3ogPSBsdWFMX29wdGludGVnZXIoTCwgMywgTFVBTF9CVUZGRVJTSVpFKTsKKyAgaW50IHJlcyA9IHNldHZidWYoZiwgTlVMTCwgbW9kZVtvcF0sIHN6KTsKKyAgcmV0dXJuIGx1YUxfZmlsZXJlc3VsdChMLCByZXMgPT0gMCwgTlVMTCk7Cit9CisjZW5kaWYKKworCisKK3N0YXRpYyBpbnQgaW9fZmx1c2ggKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gbHVhTF9maWxlcmVzdWx0KEwsIGZmbHVzaChnZXRpb2ZpbGUoTCwgSU9fT1VUUFVUKSkgPT0gMCwgTlVMTCk7Cit9CisKKworc3RhdGljIGludCBmX2ZsdXNoIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIGx1YUxfZmlsZXJlc3VsdChMLCBmZmx1c2godG9maWxlKEwpKSA9PSAwLCBOVUxMKTsKK30KKworCisvKgorKiogZnVuY3Rpb25zIGZvciAnaW8nIGxpYnJhcnkKKyovCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgaW9saWJbXSA9IHsKKyAgeyJjbG9zZSIsIGlvX2Nsb3NlfSwKKyAgeyJmbHVzaCIsIGlvX2ZsdXNofSwKKyAgeyJpbnB1dCIsIGlvX2lucHV0fSwKKyAgeyJsaW5lcyIsIGlvX2xpbmVzfSwKKyAgeyJvcGVuIiwgaW9fb3Blbn0sCisgIHsib3V0cHV0IiwgaW9fb3V0cHV0fSwKKyAgeyJwb3BlbiIsIGlvX3BvcGVufSwKKyAgeyJyZWFkIiwgaW9fcmVhZH0sCisjaWZuZGVmIFNZU0xJTlVYCisgIHsidG1wZmlsZSIsIGlvX3RtcGZpbGV9LAorI2VuZGlmCisgIHsidHlwZSIsIGlvX3R5cGV9LAorICB7IndyaXRlIiwgaW9fd3JpdGV9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworLyoKKyoqIG1ldGhvZHMgZm9yIGZpbGUgaGFuZGxlcworKi8KK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBmbGliW10gPSB7CisgIHsiY2xvc2UiLCBpb19jbG9zZX0sCisgIHsiZmx1c2giLCBmX2ZsdXNofSwKKyAgeyJsaW5lcyIsIGZfbGluZXN9LAorICB7InJlYWQiLCBmX3JlYWR9LAorI2lmbmRlZiBTWVNMSU5VWAorICB7InNlZWsiLCBmX3NlZWt9LAorICB7InNldHZidWYiLCBmX3NldHZidWZ9LAorI2VuZGlmCisgIHsid3JpdGUiLCBmX3dyaXRlfSwKKyAgeyJfX2djIiwgZl9nY30sCisgIHsiX190b3N0cmluZyIsIGZfdG9zdHJpbmd9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworc3RhdGljIHZvaWQgY3JlYXRlbWV0YSAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfbmV3bWV0YXRhYmxlKEwsIExVQV9GSUxFSEFORExFKTsgIC8qIGNyZWF0ZSBtZXRhdGFibGUgZm9yIGZpbGUgaGFuZGxlcyAqLworICBsdWFfcHVzaHZhbHVlKEwsIC0xKTsgIC8qIHB1c2ggbWV0YXRhYmxlICovCisgIGx1YV9zZXRmaWVsZChMLCAtMiwgIl9faW5kZXgiKTsgIC8qIG1ldGF0YWJsZS5fX2luZGV4ID0gbWV0YXRhYmxlICovCisgIGx1YUxfc2V0ZnVuY3MoTCwgZmxpYiwgMCk7ICAvKiBhZGQgZmlsZSBtZXRob2RzIHRvIG5ldyBtZXRhdGFibGUgKi8KKyAgbHVhX3BvcChMLCAxKTsgIC8qIHBvcCBuZXcgbWV0YXRhYmxlICovCit9CisKKworLyoKKyoqIGZ1bmN0aW9uIHRvIChub3QpIGNsb3NlIHRoZSBzdGFuZGFyZCBmaWxlcyBzdGRpbiwgc3Rkb3V0LCBhbmQgc3RkZXJyCisqLworc3RhdGljIGludCBpb19ub2Nsb3NlIChsdWFfU3RhdGUgKkwpIHsKKyAgTFN0cmVhbSAqcCA9IHRvbHN0cmVhbShMKTsKKyAgcC0+Y2xvc2VmID0gJmlvX25vY2xvc2U7ICAvKiBrZWVwIGZpbGUgb3BlbmVkICovCisgIGx1YV9wdXNobmlsKEwpOworICBsdWFfcHVzaGxpdGVyYWwoTCwgImNhbm5vdCBjbG9zZSBzdGFuZGFyZCBmaWxlIik7CisgIHJldHVybiAyOworfQorCisKK3N0YXRpYyB2b2lkIGNyZWF0ZXN0ZGZpbGUgKGx1YV9TdGF0ZSAqTCwgRklMRSAqZiwgY29uc3QgY2hhciAqaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lKSB7CisgIExTdHJlYW0gKnAgPSBuZXdwcmVmaWxlKEwpOworICBwLT5mID0gZjsKKyAgcC0+Y2xvc2VmID0gJmlvX25vY2xvc2U7CisgIGlmIChrICE9IE5VTEwpIHsKKyAgICBsdWFfcHVzaHZhbHVlKEwsIC0xKTsKKyAgICBsdWFfc2V0ZmllbGQoTCwgTFVBX1JFR0lTVFJZSU5ERVgsIGspOyAgLyogYWRkIGZpbGUgdG8gcmVnaXN0cnkgKi8KKyAgfQorICBsdWFfc2V0ZmllbGQoTCwgLTIsIGZuYW1lKTsgIC8qIGFkZCBmaWxlIHRvIG1vZHVsZSAqLworfQorCisKK0xVQU1PRF9BUEkgaW50IGx1YW9wZW5faW8gKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld2xpYihMLCBpb2xpYik7ICAvKiBuZXcgbW9kdWxlICovCisgIGNyZWF0ZW1ldGEoTCk7CisgIC8qIGNyZWF0ZSAoYW5kIHNldCkgZGVmYXVsdCBmaWxlcyAqLworICBjcmVhdGVzdGRmaWxlKEwsIHN0ZGluLCBJT19JTlBVVCwgInN0ZGluIik7CisgIGNyZWF0ZXN0ZGZpbGUoTCwgc3Rkb3V0LCBJT19PVVRQVVQsICJzdGRvdXQiKTsKKyAgY3JlYXRlc3RkZmlsZShMLCBzdGRlcnIsIE5VTEwsICJzdGRlcnIiKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbGxleC5jIGIvY29tMzIvbHVhL3NyYy9sbGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmNDFiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbGxleC5jCkBAIC0wLDAgKzEsNTM0IEBACisvKgorKiogJElkOiBsbGV4LmMsdiAyLjYzLjEuMiAyMDEzLzA4LzMwIDE1OjQ5OjQxIHJvYmVydG8gRXhwICQKKyoqIExleGljYWwgQW5hbHl6ZXIKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpZm5kZWYgU1lTTElOVVgKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbHNlCisjZGVmaW5lIGdldGxvY2FsZWRlY3BvaW50KCkgJy4nCisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsbGV4X2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGN0eXBlLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGxleC5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJscGFyc2VyLmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHN0cmluZy5oIgorI2luY2x1ZGUgImx0YWJsZS5oIgorI2luY2x1ZGUgImx6aW8uaCIKKworCisKKyNkZWZpbmUgbmV4dChscykgKGxzLT5jdXJyZW50ID0gemdldGMobHMtPnopKQorCisKKworI2RlZmluZSBjdXJySXNOZXdsaW5lKGxzKQkobHMtPmN1cnJlbnQgPT0gJ1xuJyB8fCBscy0+Y3VycmVudCA9PSAnXHInKQorCisKKy8qIE9SREVSIFJFU0VSVkVEICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbHVhWF90b2tlbnMgW10gPSB7CisgICAgImFuZCIsICJicmVhayIsICJkbyIsICJlbHNlIiwgImVsc2VpZiIsCisgICAgImVuZCIsICJmYWxzZSIsICJmb3IiLCAiZnVuY3Rpb24iLCAiZ290byIsICJpZiIsCisgICAgImluIiwgImxvY2FsIiwgIm5pbCIsICJub3QiLCAib3IiLCAicmVwZWF0IiwKKyAgICAicmV0dXJuIiwgInRoZW4iLCAidHJ1ZSIsICJ1bnRpbCIsICJ3aGlsZSIsCisgICAgIi4uIiwgIi4uLiIsICI9PSIsICI+PSIsICI8PSIsICJ+PSIsICI6OiIsICI8ZW9mPiIsCisgICAgIjxudW1iZXI+IiwgIjxuYW1lPiIsICI8c3RyaW5nPiIKK307CisKKworI2RlZmluZSBzYXZlX2FuZF9uZXh0KGxzKSAoc2F2ZShscywgbHMtPmN1cnJlbnQpLCBuZXh0KGxzKSkKKworCitzdGF0aWMgbF9ub3JldCBsZXhlcnJvciAoTGV4U3RhdGUgKmxzLCBjb25zdCBjaGFyICptc2csIGludCB0b2tlbik7CisKKworc3RhdGljIHZvaWQgc2F2ZSAoTGV4U3RhdGUgKmxzLCBpbnQgYykgeworICBNYnVmZmVyICpiID0gbHMtPmJ1ZmY7CisgIGlmIChsdWFaX2J1ZmZsZW4oYikgKyAxID4gbHVhWl9zaXplYnVmZmVyKGIpKSB7CisgICAgc2l6ZV90IG5ld3NpemU7CisgICAgaWYgKGx1YVpfc2l6ZWJ1ZmZlcihiKSA+PSBNQVhfU0laRVQvMikKKyAgICAgIGxleGVycm9yKGxzLCAibGV4aWNhbCBlbGVtZW50IHRvbyBsb25nIiwgMCk7CisgICAgbmV3c2l6ZSA9IGx1YVpfc2l6ZWJ1ZmZlcihiKSAqIDI7CisgICAgbHVhWl9yZXNpemVidWZmZXIobHMtPkwsIGIsIG5ld3NpemUpOworICB9CisgIGItPmJ1ZmZlcltsdWFaX2J1ZmZsZW4oYikrK10gPSBjYXN0KGNoYXIsIGMpOworfQorCisKK3ZvaWQgbHVhWF9pbml0IChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGk7CisgIGZvciAoaT0wOyBpPE5VTV9SRVNFUlZFRDsgaSsrKSB7CisgICAgVFN0cmluZyAqdHMgPSBsdWFTX25ldyhMLCBsdWFYX3Rva2Vuc1tpXSk7CisgICAgbHVhU19maXgodHMpOyAgLyogcmVzZXJ2ZWQgd29yZHMgYXJlIG5ldmVyIGNvbGxlY3RlZCAqLworICAgIHRzLT50c3YuZXh0cmEgPSBjYXN0X2J5dGUoaSsxKTsgIC8qIHJlc2VydmVkIHdvcmQgKi8KKyAgfQorfQorCisKK2NvbnN0IGNoYXIgKmx1YVhfdG9rZW4yc3RyIChMZXhTdGF0ZSAqbHMsIGludCB0b2tlbikgeworICBpZiAodG9rZW4gPCBGSVJTVF9SRVNFUlZFRCkgeyAgLyogc2luZ2xlLWJ5dGUgc3ltYm9scz8gKi8KKyAgICBsdWFfYXNzZXJ0KHRva2VuID09IGNhc3QodW5zaWduZWQgY2hhciwgdG9rZW4pKTsKKyAgICByZXR1cm4gKGxpc3ByaW50KHRva2VuKSkgPyBsdWFPX3B1c2hmc3RyaW5nKGxzLT5MLCBMVUFfUUwoIiVjIiksIHRva2VuKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFPX3B1c2hmc3RyaW5nKGxzLT5MLCAiY2hhciglZCkiLCB0b2tlbik7CisgIH0KKyAgZWxzZSB7CisgICAgY29uc3QgY2hhciAqcyA9IGx1YVhfdG9rZW5zW3Rva2VuIC0gRklSU1RfUkVTRVJWRURdOworICAgIGlmICh0b2tlbiA8IFRLX0VPUykgIC8qIGZpeGVkIGZvcm1hdCAoc3ltYm9scyBhbmQgcmVzZXJ2ZWQgd29yZHMpPyAqLworICAgICAgcmV0dXJuIGx1YU9fcHVzaGZzdHJpbmcobHMtPkwsIExVQV9RUywgcyk7CisgICAgZWxzZSAgLyogbmFtZXMsIHN0cmluZ3MsIGFuZCBudW1lcmFscyAqLworICAgICAgcmV0dXJuIHM7CisgIH0KK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqdHh0VG9rZW4gKExleFN0YXRlICpscywgaW50IHRva2VuKSB7CisgIHN3aXRjaCAodG9rZW4pIHsKKyAgICBjYXNlIFRLX05BTUU6CisgICAgY2FzZSBUS19TVFJJTkc6CisgICAgY2FzZSBUS19OVU1CRVI6CisgICAgICBzYXZlKGxzLCAnXDAnKTsKKyAgICAgIHJldHVybiBsdWFPX3B1c2hmc3RyaW5nKGxzLT5MLCBMVUFfUVMsIGx1YVpfYnVmZmVyKGxzLT5idWZmKSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBsdWFYX3Rva2VuMnN0cihscywgdG9rZW4pOworICB9Cit9CisKKworc3RhdGljIGxfbm9yZXQgbGV4ZXJyb3IgKExleFN0YXRlICpscywgY29uc3QgY2hhciAqbXNnLCBpbnQgdG9rZW4pIHsKKyAgY2hhciBidWZmW0xVQV9JRFNJWkVdOworICBsdWFPX2NodW5raWQoYnVmZiwgZ2V0c3RyKGxzLT5zb3VyY2UpLCBMVUFfSURTSVpFKTsKKyAgbXNnID0gbHVhT19wdXNoZnN0cmluZyhscy0+TCwgIiVzOiVkOiAlcyIsIGJ1ZmYsIGxzLT5saW5lbnVtYmVyLCBtc2cpOworICBpZiAodG9rZW4pCisgICAgbHVhT19wdXNoZnN0cmluZyhscy0+TCwgIiVzIG5lYXIgJXMiLCBtc2csIHR4dFRva2VuKGxzLCB0b2tlbikpOworICBsdWFEX3Rocm93KGxzLT5MLCBMVUFfRVJSU1lOVEFYKTsKK30KKworCitsX25vcmV0IGx1YVhfc3ludGF4ZXJyb3IgKExleFN0YXRlICpscywgY29uc3QgY2hhciAqbXNnKSB7CisgIGxleGVycm9yKGxzLCBtc2csIGxzLT50LnRva2VuKTsKK30KKworCisvKgorKiogY3JlYXRlcyBhIG5ldyBzdHJpbmcgYW5kIGFuY2hvcnMgaXQgaW4gZnVuY3Rpb24ncyB0YWJsZSBzbyB0aGF0CisqKiBpdCB3aWxsIG5vdCBiZSBjb2xsZWN0ZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24ncyBjb21waWxhdGlvbgorKiogKGJ5IHRoYXQgdGltZSBpdCBzaG91bGQgYmUgYW5jaG9yZWQgaW4gZnVuY3Rpb24ncyBwcm90b3R5cGUpCisqLworVFN0cmluZyAqbHVhWF9uZXdzdHJpbmcgKExleFN0YXRlICpscywgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbCkgeworICBsdWFfU3RhdGUgKkwgPSBscy0+TDsKKyAgVFZhbHVlICpvOyAgLyogZW50cnkgZm9yIGBzdHInICovCisgIFRTdHJpbmcgKnRzID0gbHVhU19uZXdsc3RyKEwsIHN0ciwgbCk7ICAvKiBjcmVhdGUgbmV3IHN0cmluZyAqLworICBzZXRzdmFsdWUycyhMLCBMLT50b3ArKywgdHMpOyAgLyogdGVtcG9yYXJpbHkgYW5jaG9yIGl0IGluIHN0YWNrICovCisgIG8gPSBsdWFIX3NldChMLCBscy0+ZnMtPmgsIEwtPnRvcCAtIDEpOworICBpZiAodHRpc25pbChvKSkgeyAgLyogbm90IGluIHVzZSB5ZXQ/IChzZWUgJ2FkZEsnKSAqLworICAgIC8qIGJvb2xlYW4gdmFsdWUgZG9lcyBub3QgbmVlZCBHQyBiYXJyaWVyOworICAgICAgIHRhYmxlIGhhcyBubyBtZXRhdGFibGUsIHNvIGl0IGRvZXMgbm90IG5lZWQgdG8gaW52YWxpZGF0ZSBjYWNoZSAqLworICAgIHNldGJ2YWx1ZShvLCAxKTsgIC8qIHRbc3RyaW5nXSA9IHRydWUgKi8KKyAgICBsdWFDX2NoZWNrR0MoTCk7CisgIH0KKyAgZWxzZSB7ICAvKiBzdHJpbmcgYWxyZWFkeSBwcmVzZW50ICovCisgICAgdHMgPSByYXd0c3ZhbHVlKGtleWZyb212YWwobykpOyAgLyogcmUtdXNlIHZhbHVlIHByZXZpb3VzbHkgc3RvcmVkICovCisgIH0KKyAgTC0+dG9wLS07ICAvKiByZW1vdmUgc3RyaW5nIGZyb20gc3RhY2sgKi8KKyAgcmV0dXJuIHRzOworfQorCisKKy8qCisqKiBpbmNyZW1lbnQgbGluZSBudW1iZXIgYW5kIHNraXBzIG5ld2xpbmUgc2VxdWVuY2UgKGFueSBvZgorKiogXG4sIFxyLCBcblxyLCBvciBcclxuKQorKi8KK3N0YXRpYyB2b2lkIGluY2xpbmVudW1iZXIgKExleFN0YXRlICpscykgeworICBpbnQgb2xkID0gbHMtPmN1cnJlbnQ7CisgIGx1YV9hc3NlcnQoY3VycklzTmV3bGluZShscykpOworICBuZXh0KGxzKTsgIC8qIHNraXAgYFxuJyBvciBgXHInICovCisgIGlmIChjdXJySXNOZXdsaW5lKGxzKSAmJiBscy0+Y3VycmVudCAhPSBvbGQpCisgICAgbmV4dChscyk7ICAvKiBza2lwIGBcblxyJyBvciBgXHJcbicgKi8KKyAgaWYgKCsrbHMtPmxpbmVudW1iZXIgPj0gTUFYX0lOVCkKKyAgICBsdWFYX3N5bnRheGVycm9yKGxzLCAiY2h1bmsgaGFzIHRvbyBtYW55IGxpbmVzIik7Cit9CisKKwordm9pZCBsdWFYX3NldGlucHV0IChsdWFfU3RhdGUgKkwsIExleFN0YXRlICpscywgWklPICp6LCBUU3RyaW5nICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdGNoYXIpIHsKKyAgbHMtPmRlY3BvaW50ID0gJy4nOworICBscy0+TCA9IEw7CisgIGxzLT5jdXJyZW50ID0gZmlyc3RjaGFyOworICBscy0+bG9va2FoZWFkLnRva2VuID0gVEtfRU9TOyAgLyogbm8gbG9vay1haGVhZCB0b2tlbiAqLworICBscy0+eiA9IHo7CisgIGxzLT5mcyA9IE5VTEw7CisgIGxzLT5saW5lbnVtYmVyID0gMTsKKyAgbHMtPmxhc3RsaW5lID0gMTsKKyAgbHMtPnNvdXJjZSA9IHNvdXJjZTsKKyAgbHMtPmVudm4gPSBsdWFTX25ldyhMLCBMVUFfRU5WKTsgIC8qIGNyZWF0ZSBlbnYgbmFtZSAqLworICBsdWFTX2ZpeChscy0+ZW52bik7ICAvKiBuZXZlciBjb2xsZWN0IHRoaXMgbmFtZSAqLworICBsdWFaX3Jlc2l6ZWJ1ZmZlcihscy0+TCwgbHMtPmJ1ZmYsIExVQV9NSU5CVUZGRVIpOyAgLyogaW5pdGlhbGl6ZSBidWZmZXIgKi8KK30KKworCisKKy8qCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBMRVhJQ0FMIEFOQUxZWkVSCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKKworc3RhdGljIGludCBjaGVja19uZXh0IChMZXhTdGF0ZSAqbHMsIGNvbnN0IGNoYXIgKnNldCkgeworICBpZiAobHMtPmN1cnJlbnQgPT0gJ1wwJyB8fCAhc3RyY2hyKHNldCwgbHMtPmN1cnJlbnQpKQorICAgIHJldHVybiAwOworICBzYXZlX2FuZF9uZXh0KGxzKTsKKyAgcmV0dXJuIDE7Cit9CisKKworLyoKKyoqIGNoYW5nZSBhbGwgY2hhcmFjdGVycyAnZnJvbScgaW4gYnVmZmVyIHRvICd0bycKKyovCitzdGF0aWMgdm9pZCBidWZmcmVwbGFjZSAoTGV4U3RhdGUgKmxzLCBjaGFyIGZyb20sIGNoYXIgdG8pIHsKKyAgc2l6ZV90IG4gPSBsdWFaX2J1ZmZsZW4obHMtPmJ1ZmYpOworICBjaGFyICpwID0gbHVhWl9idWZmZXIobHMtPmJ1ZmYpOworICB3aGlsZSAobi0tKQorICAgIGlmIChwW25dID09IGZyb20pIHBbbl0gPSB0bzsKK30KKworCisjaWYgIWRlZmluZWQoZ2V0bG9jYWxlZGVjcG9pbnQpCisjZGVmaW5lIGdldGxvY2FsZWRlY3BvaW50KCkJKGxvY2FsZWNvbnYoKS0+ZGVjaW1hbF9wb2ludFswXSkKKyNlbmRpZgorCisKKyNkZWZpbmUgYnVmZjJkKGIsZSkJbHVhT19zdHIyZChsdWFaX2J1ZmZlcihiKSwgbHVhWl9idWZmbGVuKGIpIC0gMSwgZSkKKworLyoKKyoqIGluIGNhc2Ugb2YgZm9ybWF0IGVycm9yLCB0cnkgdG8gY2hhbmdlIGRlY2ltYWwgcG9pbnQgc2VwYXJhdG9yIHRvCisqKiB0aGUgb25lIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbG9jYWxlIGFuZCBjaGVjayBhZ2FpbgorKi8KK3N0YXRpYyB2b2lkIHRyeWRlY3BvaW50IChMZXhTdGF0ZSAqbHMsIFNlbUluZm8gKnNlbWluZm8pIHsKKyAgY2hhciBvbGQgPSBscy0+ZGVjcG9pbnQ7CisgIGxzLT5kZWNwb2ludCA9IGdldGxvY2FsZWRlY3BvaW50KCk7CisgIGJ1ZmZyZXBsYWNlKGxzLCBvbGQsIGxzLT5kZWNwb2ludCk7ICAvKiB0cnkgbmV3IGRlY2ltYWwgc2VwYXJhdG9yICovCisgIGlmICghYnVmZjJkKGxzLT5idWZmLCAmc2VtaW5mby0+cikpIHsKKyAgICAvKiBmb3JtYXQgZXJyb3Igd2l0aCBjb3JyZWN0IGRlY2ltYWwgcG9pbnQ6IG5vIG1vcmUgb3B0aW9ucyAqLworICAgIGJ1ZmZyZXBsYWNlKGxzLCBscy0+ZGVjcG9pbnQsICcuJyk7ICAvKiB1bmRvIGNoYW5nZSAoZm9yIGVycm9yIG1lc3NhZ2UpICovCisgICAgbGV4ZXJyb3IobHMsICJtYWxmb3JtZWQgbnVtYmVyIiwgVEtfTlVNQkVSKTsKKyAgfQorfQorCisKKy8qIExVQV9OVU1CRVIgKi8KKy8qCisqKiB0aGlzIGZ1bmN0aW9uIGlzIHF1aXRlIGxpYmVyYWwgaW4gd2hhdCBpdCBhY2NlcHRzLCBhcyAnbHVhT19zdHIyZCcKKyoqIHdpbGwgcmVqZWN0IGlsbC1mb3JtZWQgbnVtZXJhbHMuCisqLworc3RhdGljIHZvaWQgcmVhZF9udW1lcmFsIChMZXhTdGF0ZSAqbHMsIFNlbUluZm8gKnNlbWluZm8pIHsKKyAgY29uc3QgY2hhciAqZXhwbyA9ICJFZSI7CisgIGludCBmaXJzdCA9IGxzLT5jdXJyZW50OworICBsdWFfYXNzZXJ0KGxpc2RpZ2l0KGxzLT5jdXJyZW50KSk7CisgIHNhdmVfYW5kX25leHQobHMpOworICBpZiAoZmlyc3QgPT0gJzAnICYmIGNoZWNrX25leHQobHMsICJYeCIpKSAgLyogaGV4YWRlY2ltYWw/ICovCisgICAgZXhwbyA9ICJQcCI7CisgIGZvciAoOzspIHsKKyAgICBpZiAoY2hlY2tfbmV4dChscywgZXhwbykpICAvKiBleHBvbmVudCBwYXJ0PyAqLworICAgICAgY2hlY2tfbmV4dChscywgIistIik7ICAvKiBvcHRpb25hbCBleHBvbmVudCBzaWduICovCisgICAgaWYgKGxpc3hkaWdpdChscy0+Y3VycmVudCkgfHwgbHMtPmN1cnJlbnQgPT0gJy4nKQorICAgICAgc2F2ZV9hbmRfbmV4dChscyk7CisgICAgZWxzZSAgYnJlYWs7CisgIH0KKyAgc2F2ZShscywgJ1wwJyk7CisgIGJ1ZmZyZXBsYWNlKGxzLCAnLicsIGxzLT5kZWNwb2ludCk7ICAvKiBmb2xsb3cgbG9jYWxlIGZvciBkZWNpbWFsIHBvaW50ICovCisgIGlmICghYnVmZjJkKGxzLT5idWZmLCAmc2VtaW5mby0+cikpICAvKiBmb3JtYXQgZXJyb3I/ICovCisgICAgdHJ5ZGVjcG9pbnQobHMsIHNlbWluZm8pOyAvKiB0cnkgdG8gdXBkYXRlIGRlY2ltYWwgcG9pbnQgc2VwYXJhdG9yICovCit9CisKKworLyoKKyoqIHNraXAgYSBzZXF1ZW5jZSAnWz0qWycgb3IgJ109Kl0nIGFuZCByZXR1cm4gaXRzIG51bWJlciBvZiAnPSdzIG9yCisqKiAtMSBpZiBzZXF1ZW5jZSBpcyBtYWxmb3JtZWQKKyovCitzdGF0aWMgaW50IHNraXBfc2VwIChMZXhTdGF0ZSAqbHMpIHsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHMgPSBscy0+Y3VycmVudDsKKyAgbHVhX2Fzc2VydChzID09ICdbJyB8fCBzID09ICddJyk7CisgIHNhdmVfYW5kX25leHQobHMpOworICB3aGlsZSAobHMtPmN1cnJlbnQgPT0gJz0nKSB7CisgICAgc2F2ZV9hbmRfbmV4dChscyk7CisgICAgY291bnQrKzsKKyAgfQorICByZXR1cm4gKGxzLT5jdXJyZW50ID09IHMpID8gY291bnQgOiAoLWNvdW50KSAtIDE7Cit9CisKKworc3RhdGljIHZvaWQgcmVhZF9sb25nX3N0cmluZyAoTGV4U3RhdGUgKmxzLCBTZW1JbmZvICpzZW1pbmZvLCBpbnQgc2VwKSB7CisgIHNhdmVfYW5kX25leHQobHMpOyAgLyogc2tpcCAybmQgYFsnICovCisgIGlmIChjdXJySXNOZXdsaW5lKGxzKSkgIC8qIHN0cmluZyBzdGFydHMgd2l0aCBhIG5ld2xpbmU/ICovCisgICAgaW5jbGluZW51bWJlcihscyk7ICAvKiBza2lwIGl0ICovCisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKGxzLT5jdXJyZW50KSB7CisgICAgICBjYXNlIEVPWjoKKyAgICAgICAgbGV4ZXJyb3IobHMsIChzZW1pbmZvKSA/ICJ1bmZpbmlzaGVkIGxvbmcgc3RyaW5nIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5maW5pc2hlZCBsb25nIGNvbW1lbnQiLCBUS19FT1MpOworICAgICAgICBicmVhazsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgICAgICBjYXNlICddJzogeworICAgICAgICBpZiAoc2tpcF9zZXAobHMpID09IHNlcCkgeworICAgICAgICAgIHNhdmVfYW5kX25leHQobHMpOyAgLyogc2tpcCAybmQgYF0nICovCisgICAgICAgICAgZ290byBlbmRsb29wOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnXG4nOiBjYXNlICdccic6IHsKKyAgICAgICAgc2F2ZShscywgJ1xuJyk7CisgICAgICAgIGluY2xpbmVudW1iZXIobHMpOworICAgICAgICBpZiAoIXNlbWluZm8pIGx1YVpfcmVzZXRidWZmZXIobHMtPmJ1ZmYpOyAgLyogYXZvaWQgd2FzdGluZyBzcGFjZSAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgaWYgKHNlbWluZm8pIHNhdmVfYW5kX25leHQobHMpOworICAgICAgICBlbHNlIG5leHQobHMpOworICAgICAgfQorICAgIH0KKyAgfSBlbmRsb29wOgorICBpZiAoc2VtaW5mbykKKyAgICBzZW1pbmZvLT50cyA9IGx1YVhfbmV3c3RyaW5nKGxzLCBsdWFaX2J1ZmZlcihscy0+YnVmZikgKyAoMiArIHNlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhWl9idWZmbGVuKGxzLT5idWZmKSAtIDIqKDIgKyBzZXApKTsKK30KKworCitzdGF0aWMgdm9pZCBlc2NlcnJvciAoTGV4U3RhdGUgKmxzLCBpbnQgKmMsIGludCBuLCBjb25zdCBjaGFyICptc2cpIHsKKyAgaW50IGk7CisgIGx1YVpfcmVzZXRidWZmZXIobHMtPmJ1ZmYpOyAgLyogcHJlcGFyZSBlcnJvciBtZXNzYWdlICovCisgIHNhdmUobHMsICdcXCcpOworICBmb3IgKGkgPSAwOyBpIDwgbiAmJiBjW2ldICE9IEVPWjsgaSsrKQorICAgIHNhdmUobHMsIGNbaV0pOworICBsZXhlcnJvcihscywgbXNnLCBUS19TVFJJTkcpOworfQorCisKK3N0YXRpYyBpbnQgcmVhZGhleGFlc2MgKExleFN0YXRlICpscykgeworICBpbnQgY1szXSwgaTsgIC8qIGtlZXAgaW5wdXQgZm9yIGVycm9yIG1lc3NhZ2UgKi8KKyAgaW50IHIgPSAwOyAgLyogcmVzdWx0IGFjY3VtdWxhdG9yICovCisgIGNbMF0gPSAneCc7ICAvKiBmb3IgZXJyb3IgbWVzc2FnZSAqLworICBmb3IgKGkgPSAxOyBpIDwgMzsgaSsrKSB7ICAvKiByZWFkIHR3byBoZXhhZGVjaW1hbCBkaWdpdHMgKi8KKyAgICBjW2ldID0gbmV4dChscyk7CisgICAgaWYgKCFsaXN4ZGlnaXQoY1tpXSkpCisgICAgICBlc2NlcnJvcihscywgYywgaSArIDEsICJoZXhhZGVjaW1hbCBkaWdpdCBleHBlY3RlZCIpOworICAgIHIgPSAociA8PCA0KSArIGx1YU9faGV4YXZhbHVlKGNbaV0pOworICB9CisgIHJldHVybiByOworfQorCisKK3N0YXRpYyBpbnQgcmVhZGRlY2VzYyAoTGV4U3RhdGUgKmxzKSB7CisgIGludCBjWzNdLCBpOworICBpbnQgciA9IDA7ICAvKiByZXN1bHQgYWNjdW11bGF0b3IgKi8KKyAgZm9yIChpID0gMDsgaSA8IDMgJiYgbGlzZGlnaXQobHMtPmN1cnJlbnQpOyBpKyspIHsgIC8qIHJlYWQgdXAgdG8gMyBkaWdpdHMgKi8KKyAgICBjW2ldID0gbHMtPmN1cnJlbnQ7CisgICAgciA9IDEwKnIgKyBjW2ldIC0gJzAnOworICAgIG5leHQobHMpOworICB9CisgIGlmIChyID4gVUNIQVJfTUFYKQorICAgIGVzY2Vycm9yKGxzLCBjLCBpLCAiZGVjaW1hbCBlc2NhcGUgdG9vIGxhcmdlIik7CisgIHJldHVybiByOworfQorCisKK3N0YXRpYyB2b2lkIHJlYWRfc3RyaW5nIChMZXhTdGF0ZSAqbHMsIGludCBkZWwsIFNlbUluZm8gKnNlbWluZm8pIHsKKyAgc2F2ZV9hbmRfbmV4dChscyk7ICAvKiBrZWVwIGRlbGltaXRlciAoZm9yIGVycm9yIG1lc3NhZ2VzKSAqLworICB3aGlsZSAobHMtPmN1cnJlbnQgIT0gZGVsKSB7CisgICAgc3dpdGNoIChscy0+Y3VycmVudCkgeworICAgICAgY2FzZSBFT1o6CisgICAgICAgIGxleGVycm9yKGxzLCAidW5maW5pc2hlZCBzdHJpbmciLCBUS19FT1MpOworICAgICAgICBicmVhazsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgICAgICBjYXNlICdcbic6CisgICAgICBjYXNlICdccic6CisgICAgICAgIGxleGVycm9yKGxzLCAidW5maW5pc2hlZCBzdHJpbmciLCBUS19TVFJJTkcpOworICAgICAgICBicmVhazsgIC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisgICAgICBjYXNlICdcXCc6IHsgIC8qIGVzY2FwZSBzZXF1ZW5jZXMgKi8KKyAgICAgICAgaW50IGM7ICAvKiBmaW5hbCBjaGFyYWN0ZXIgdG8gYmUgc2F2ZWQgKi8KKyAgICAgICAgbmV4dChscyk7ICAvKiBkbyBub3Qgc2F2ZSB0aGUgYFwnICovCisgICAgICAgIHN3aXRjaCAobHMtPmN1cnJlbnQpIHsKKyAgICAgICAgICBjYXNlICdhJzogYyA9ICdcYSc7IGdvdG8gcmVhZF9zYXZlOworICAgICAgICAgIGNhc2UgJ2InOiBjID0gJ1xiJzsgZ290byByZWFkX3NhdmU7CisgICAgICAgICAgY2FzZSAnZic6IGMgPSAnXGYnOyBnb3RvIHJlYWRfc2F2ZTsKKyAgICAgICAgICBjYXNlICduJzogYyA9ICdcbic7IGdvdG8gcmVhZF9zYXZlOworICAgICAgICAgIGNhc2UgJ3InOiBjID0gJ1xyJzsgZ290byByZWFkX3NhdmU7CisgICAgICAgICAgY2FzZSAndCc6IGMgPSAnXHQnOyBnb3RvIHJlYWRfc2F2ZTsKKyAgICAgICAgICBjYXNlICd2JzogYyA9ICdcdic7IGdvdG8gcmVhZF9zYXZlOworICAgICAgICAgIGNhc2UgJ3gnOiBjID0gcmVhZGhleGFlc2MobHMpOyBnb3RvIHJlYWRfc2F2ZTsKKyAgICAgICAgICBjYXNlICdcbic6IGNhc2UgJ1xyJzoKKyAgICAgICAgICAgIGluY2xpbmVudW1iZXIobHMpOyBjID0gJ1xuJzsgZ290byBvbmx5X3NhdmU7CisgICAgICAgICAgY2FzZSAnXFwnOiBjYXNlICdcIic6IGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIGMgPSBscy0+Y3VycmVudDsgZ290byByZWFkX3NhdmU7CisgICAgICAgICAgY2FzZSBFT1o6IGdvdG8gbm9fc2F2ZTsgIC8qIHdpbGwgcmFpc2UgYW4gZXJyb3IgbmV4dCBsb29wICovCisgICAgICAgICAgY2FzZSAneic6IHsgIC8qIHphcCBmb2xsb3dpbmcgc3BhbiBvZiBzcGFjZXMgKi8KKyAgICAgICAgICAgIG5leHQobHMpOyAgLyogc2tpcCB0aGUgJ3onICovCisgICAgICAgICAgICB3aGlsZSAobGlzc3BhY2UobHMtPmN1cnJlbnQpKSB7CisgICAgICAgICAgICAgIGlmIChjdXJySXNOZXdsaW5lKGxzKSkgaW5jbGluZW51bWJlcihscyk7CisgICAgICAgICAgICAgIGVsc2UgbmV4dChscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIG5vX3NhdmU7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIGlmICghbGlzZGlnaXQobHMtPmN1cnJlbnQpKQorICAgICAgICAgICAgICBlc2NlcnJvcihscywgJmxzLT5jdXJyZW50LCAxLCAiaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UiKTsKKyAgICAgICAgICAgIC8qIGRpZ2l0YWwgZXNjYXBlIFxkZGQgKi8KKyAgICAgICAgICAgIGMgPSByZWFkZGVjZXNjKGxzKTsKKyAgICAgICAgICAgIGdvdG8gb25seV9zYXZlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgIHJlYWRfc2F2ZTogbmV4dChscyk7ICAvKiByZWFkIG5leHQgY2hhcmFjdGVyICovCisgICAgICAgb25seV9zYXZlOiBzYXZlKGxzLCBjKTsgIC8qIHNhdmUgJ2MnICovCisgICAgICAgbm9fc2F2ZTogYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBzYXZlX2FuZF9uZXh0KGxzKTsKKyAgICB9CisgIH0KKyAgc2F2ZV9hbmRfbmV4dChscyk7ICAvKiBza2lwIGRlbGltaXRlciAqLworICBzZW1pbmZvLT50cyA9IGx1YVhfbmV3c3RyaW5nKGxzLCBsdWFaX2J1ZmZlcihscy0+YnVmZikgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFaX2J1ZmZsZW4obHMtPmJ1ZmYpIC0gMik7Cit9CisKKworc3RhdGljIGludCBsbGV4IChMZXhTdGF0ZSAqbHMsIFNlbUluZm8gKnNlbWluZm8pIHsKKyAgbHVhWl9yZXNldGJ1ZmZlcihscy0+YnVmZik7CisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKGxzLT5jdXJyZW50KSB7CisgICAgICBjYXNlICdcbic6IGNhc2UgJ1xyJzogeyAgLyogbGluZSBicmVha3MgKi8KKyAgICAgICAgaW5jbGluZW51bWJlcihscyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnICc6IGNhc2UgJ1xmJzogY2FzZSAnXHQnOiBjYXNlICdcdic6IHsgIC8qIHNwYWNlcyAqLworICAgICAgICBuZXh0KGxzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICctJzogeyAgLyogJy0nIG9yICctLScgKGNvbW1lbnQpICovCisgICAgICAgIG5leHQobHMpOworICAgICAgICBpZiAobHMtPmN1cnJlbnQgIT0gJy0nKSByZXR1cm4gJy0nOworICAgICAgICAvKiBlbHNlIGlzIGEgY29tbWVudCAqLworICAgICAgICBuZXh0KGxzKTsKKyAgICAgICAgaWYgKGxzLT5jdXJyZW50ID09ICdbJykgeyAgLyogbG9uZyBjb21tZW50PyAqLworICAgICAgICAgIGludCBzZXAgPSBza2lwX3NlcChscyk7CisgICAgICAgICAgbHVhWl9yZXNldGJ1ZmZlcihscy0+YnVmZik7ICAvKiBgc2tpcF9zZXAnIG1heSBkaXJ0eSB0aGUgYnVmZmVyICovCisgICAgICAgICAgaWYgKHNlcCA+PSAwKSB7CisgICAgICAgICAgICByZWFkX2xvbmdfc3RyaW5nKGxzLCBOVUxMLCBzZXApOyAgLyogc2tpcCBsb25nIGNvbW1lbnQgKi8KKyAgICAgICAgICAgIGx1YVpfcmVzZXRidWZmZXIobHMtPmJ1ZmYpOyAgLyogcHJldmlvdXMgY2FsbCBtYXkgZGlydHkgdGhlIGJ1ZmYuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogZWxzZSBzaG9ydCBjb21tZW50ICovCisgICAgICAgIHdoaWxlICghY3VycklzTmV3bGluZShscykgJiYgbHMtPmN1cnJlbnQgIT0gRU9aKQorICAgICAgICAgIG5leHQobHMpOyAgLyogc2tpcCB1bnRpbCBlbmQgb2YgbGluZSAob3IgZW5kIG9mIGZpbGUpICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnWyc6IHsgIC8qIGxvbmcgc3RyaW5nIG9yIHNpbXBseSAnWycgKi8KKyAgICAgICAgaW50IHNlcCA9IHNraXBfc2VwKGxzKTsKKyAgICAgICAgaWYgKHNlcCA+PSAwKSB7CisgICAgICAgICAgcmVhZF9sb25nX3N0cmluZyhscywgc2VtaW5mbywgc2VwKTsKKyAgICAgICAgICByZXR1cm4gVEtfU1RSSU5HOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNlcCA9PSAtMSkgcmV0dXJuICdbJzsKKyAgICAgICAgZWxzZSBsZXhlcnJvcihscywgImludmFsaWQgbG9uZyBzdHJpbmcgZGVsaW1pdGVyIiwgVEtfU1RSSU5HKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgJz0nOiB7CisgICAgICAgIG5leHQobHMpOworICAgICAgICBpZiAobHMtPmN1cnJlbnQgIT0gJz0nKSByZXR1cm4gJz0nOworICAgICAgICBlbHNlIHsgbmV4dChscyk7IHJldHVybiBUS19FUTsgfQorICAgICAgfQorICAgICAgY2FzZSAnPCc6IHsKKyAgICAgICAgbmV4dChscyk7CisgICAgICAgIGlmIChscy0+Y3VycmVudCAhPSAnPScpIHJldHVybiAnPCc7CisgICAgICAgIGVsc2UgeyBuZXh0KGxzKTsgcmV0dXJuIFRLX0xFOyB9CisgICAgICB9CisgICAgICBjYXNlICc+JzogeworICAgICAgICBuZXh0KGxzKTsKKyAgICAgICAgaWYgKGxzLT5jdXJyZW50ICE9ICc9JykgcmV0dXJuICc+JzsKKyAgICAgICAgZWxzZSB7IG5leHQobHMpOyByZXR1cm4gVEtfR0U7IH0KKyAgICAgIH0KKyAgICAgIGNhc2UgJ34nOiB7CisgICAgICAgIG5leHQobHMpOworICAgICAgICBpZiAobHMtPmN1cnJlbnQgIT0gJz0nKSByZXR1cm4gJ34nOworICAgICAgICBlbHNlIHsgbmV4dChscyk7IHJldHVybiBUS19ORTsgfQorICAgICAgfQorICAgICAgY2FzZSAnOic6IHsKKyAgICAgICAgbmV4dChscyk7CisgICAgICAgIGlmIChscy0+Y3VycmVudCAhPSAnOicpIHJldHVybiAnOic7CisgICAgICAgIGVsc2UgeyBuZXh0KGxzKTsgcmV0dXJuIFRLX0RCQ09MT047IH0KKyAgICAgIH0KKyAgICAgIGNhc2UgJyInOiBjYXNlICdcJyc6IHsgIC8qIHNob3J0IGxpdGVyYWwgc3RyaW5ncyAqLworICAgICAgICByZWFkX3N0cmluZyhscywgbHMtPmN1cnJlbnQsIHNlbWluZm8pOworICAgICAgICByZXR1cm4gVEtfU1RSSU5HOworICAgICAgfQorICAgICAgY2FzZSAnLic6IHsgIC8qICcuJywgJy4uJywgJy4uLicsIG9yIG51bWJlciAqLworICAgICAgICBzYXZlX2FuZF9uZXh0KGxzKTsKKyAgICAgICAgaWYgKGNoZWNrX25leHQobHMsICIuIikpIHsKKyAgICAgICAgICBpZiAoY2hlY2tfbmV4dChscywgIi4iKSkKKyAgICAgICAgICAgIHJldHVybiBUS19ET1RTOyAgIC8qICcuLi4nICovCisgICAgICAgICAgZWxzZSByZXR1cm4gVEtfQ09OQ0FUOyAgIC8qICcuLicgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghbGlzZGlnaXQobHMtPmN1cnJlbnQpKSByZXR1cm4gJy4nOworICAgICAgICAvKiBlbHNlIGdvIHRocm91Z2ggKi8KKyAgICAgIH0KKyAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzogeworICAgICAgICByZWFkX251bWVyYWwobHMsIHNlbWluZm8pOworICAgICAgICByZXR1cm4gVEtfTlVNQkVSOworICAgICAgfQorICAgICAgY2FzZSBFT1o6IHsKKyAgICAgICAgcmV0dXJuIFRLX0VPUzsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgaWYgKGxpc2xhbHBoYShscy0+Y3VycmVudCkpIHsgIC8qIGlkZW50aWZpZXIgb3IgcmVzZXJ2ZWQgd29yZD8gKi8KKyAgICAgICAgICBUU3RyaW5nICp0czsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBzYXZlX2FuZF9uZXh0KGxzKTsKKyAgICAgICAgICB9IHdoaWxlIChsaXNsYWxudW0obHMtPmN1cnJlbnQpKTsKKyAgICAgICAgICB0cyA9IGx1YVhfbmV3c3RyaW5nKGxzLCBsdWFaX2J1ZmZlcihscy0+YnVmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhWl9idWZmbGVuKGxzLT5idWZmKSk7CisgICAgICAgICAgc2VtaW5mby0+dHMgPSB0czsKKyAgICAgICAgICBpZiAoaXNyZXNlcnZlZCh0cykpICAvKiByZXNlcnZlZCB3b3JkPyAqLworICAgICAgICAgICAgcmV0dXJuIHRzLT50c3YuZXh0cmEgLSAxICsgRklSU1RfUkVTRVJWRUQ7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gVEtfTkFNRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7ICAvKiBzaW5nbGUtY2hhciB0b2tlbnMgKCsgLSAvIC4uLikgKi8KKyAgICAgICAgICBpbnQgYyA9IGxzLT5jdXJyZW50OworICAgICAgICAgIG5leHQobHMpOworICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKwordm9pZCBsdWFYX25leHQgKExleFN0YXRlICpscykgeworICBscy0+bGFzdGxpbmUgPSBscy0+bGluZW51bWJlcjsKKyAgaWYgKGxzLT5sb29rYWhlYWQudG9rZW4gIT0gVEtfRU9TKSB7ICAvKiBpcyB0aGVyZSBhIGxvb2stYWhlYWQgdG9rZW4/ICovCisgICAgbHMtPnQgPSBscy0+bG9va2FoZWFkOyAgLyogdXNlIHRoaXMgb25lICovCisgICAgbHMtPmxvb2thaGVhZC50b2tlbiA9IFRLX0VPUzsgIC8qIGFuZCBkaXNjaGFyZ2UgaXQgKi8KKyAgfQorICBlbHNlCisgICAgbHMtPnQudG9rZW4gPSBsbGV4KGxzLCAmbHMtPnQuc2VtaW5mbyk7ICAvKiByZWFkIG5leHQgdG9rZW4gKi8KK30KKworCitpbnQgbHVhWF9sb29rYWhlYWQgKExleFN0YXRlICpscykgeworICBsdWFfYXNzZXJ0KGxzLT5sb29rYWhlYWQudG9rZW4gPT0gVEtfRU9TKTsKKyAgbHMtPmxvb2thaGVhZC50b2tlbiA9IGxsZXgobHMsICZscy0+bG9va2FoZWFkLnNlbWluZm8pOworICByZXR1cm4gbHMtPmxvb2thaGVhZC50b2tlbjsKK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sbGV4LmggYi9jb20zMi9sdWEvc3JjL2xsZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGFjZGQzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sbGV4LmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyoqICRJZDogbGxleC5oLHYgMS43Mi4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBMZXhpY2FsIEFuYWx5emVyCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsbGV4X2gKKyNkZWZpbmUgbGxleF9oCisKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHppby5oIgorCisKKyNkZWZpbmUgRklSU1RfUkVTRVJWRUQJMjU3CisKKworCisvKgorKiBXQVJOSU5HOiBpZiB5b3UgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGlzIGVudW1lcmF0aW9uLAorKiBncmVwICJPUkRFUiBSRVNFUlZFRCIKKyovCitlbnVtIFJFU0VSVkVEIHsKKyAgLyogdGVybWluYWwgc3ltYm9scyBkZW5vdGVkIGJ5IHJlc2VydmVkIHdvcmRzICovCisgIFRLX0FORCA9IEZJUlNUX1JFU0VSVkVELCBUS19CUkVBSywKKyAgVEtfRE8sIFRLX0VMU0UsIFRLX0VMU0VJRiwgVEtfRU5ELCBUS19GQUxTRSwgVEtfRk9SLCBUS19GVU5DVElPTiwKKyAgVEtfR09UTywgVEtfSUYsIFRLX0lOLCBUS19MT0NBTCwgVEtfTklMLCBUS19OT1QsIFRLX09SLCBUS19SRVBFQVQsCisgIFRLX1JFVFVSTiwgVEtfVEhFTiwgVEtfVFJVRSwgVEtfVU5USUwsIFRLX1dISUxFLAorICAvKiBvdGhlciB0ZXJtaW5hbCBzeW1ib2xzICovCisgIFRLX0NPTkNBVCwgVEtfRE9UUywgVEtfRVEsIFRLX0dFLCBUS19MRSwgVEtfTkUsIFRLX0RCQ09MT04sIFRLX0VPUywKKyAgVEtfTlVNQkVSLCBUS19OQU1FLCBUS19TVFJJTkcKK307CisKKy8qIG51bWJlciBvZiByZXNlcnZlZCB3b3JkcyAqLworI2RlZmluZSBOVU1fUkVTRVJWRUQJKGNhc3QoaW50LCBUS19XSElMRS1GSVJTVF9SRVNFUlZFRCsxKSkKKworCit0eXBlZGVmIHVuaW9uIHsKKyAgbHVhX051bWJlciByOworICBUU3RyaW5nICp0czsKK30gU2VtSW5mbzsgIC8qIHNlbWFudGljcyBpbmZvcm1hdGlvbiAqLworCisKK3R5cGVkZWYgc3RydWN0IFRva2VuIHsKKyAgaW50IHRva2VuOworICBTZW1JbmZvIHNlbWluZm87Cit9IFRva2VuOworCisKKy8qIHN0YXRlIG9mIHRoZSBsZXhlciBwbHVzIHN0YXRlIG9mIHRoZSBwYXJzZXIgd2hlbiBzaGFyZWQgYnkgYWxsCisgICBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IExleFN0YXRlIHsKKyAgaW50IGN1cnJlbnQ7ICAvKiBjdXJyZW50IGNoYXJhY3RlciAoY2hhcmludCkgKi8KKyAgaW50IGxpbmVudW1iZXI7ICAvKiBpbnB1dCBsaW5lIGNvdW50ZXIgKi8KKyAgaW50IGxhc3RsaW5lOyAgLyogbGluZSBvZiBsYXN0IHRva2VuIGBjb25zdW1lZCcgKi8KKyAgVG9rZW4gdDsgIC8qIGN1cnJlbnQgdG9rZW4gKi8KKyAgVG9rZW4gbG9va2FoZWFkOyAgLyogbG9vayBhaGVhZCB0b2tlbiAqLworICBzdHJ1Y3QgRnVuY1N0YXRlICpmczsgIC8qIGN1cnJlbnQgZnVuY3Rpb24gKHBhcnNlcikgKi8KKyAgc3RydWN0IGx1YV9TdGF0ZSAqTDsKKyAgWklPICp6OyAgLyogaW5wdXQgc3RyZWFtICovCisgIE1idWZmZXIgKmJ1ZmY7ICAvKiBidWZmZXIgZm9yIHRva2VucyAqLworICBzdHJ1Y3QgRHluZGF0YSAqZHlkOyAgLyogZHluYW1pYyBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIHBhcnNlciAqLworICBUU3RyaW5nICpzb3VyY2U7ICAvKiBjdXJyZW50IHNvdXJjZSBuYW1lICovCisgIFRTdHJpbmcgKmVudm47ICAvKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lICovCisgIGNoYXIgZGVjcG9pbnQ7ICAvKiBsb2NhbGUgZGVjaW1hbCBwb2ludCAqLworfSBMZXhTdGF0ZTsKKworCitMVUFJX0ZVTkMgdm9pZCBsdWFYX2luaXQgKGx1YV9TdGF0ZSAqTCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFYX3NldGlucHV0IChsdWFfU3RhdGUgKkwsIExleFN0YXRlICpscywgWklPICp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFN0cmluZyAqc291cmNlLCBpbnQgZmlyc3RjaGFyKTsKK0xVQUlfRlVOQyBUU3RyaW5nICpsdWFYX25ld3N0cmluZyAoTGV4U3RhdGUgKmxzLCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsKTsKK0xVQUlfRlVOQyB2b2lkIGx1YVhfbmV4dCAoTGV4U3RhdGUgKmxzKTsKK0xVQUlfRlVOQyBpbnQgbHVhWF9sb29rYWhlYWQgKExleFN0YXRlICpscyk7CitMVUFJX0ZVTkMgbF9ub3JldCBsdWFYX3N5bnRheGVycm9yIChMZXhTdGF0ZSAqbHMsIGNvbnN0IGNoYXIgKnMpOworTFVBSV9GVU5DIGNvbnN0IGNoYXIgKmx1YVhfdG9rZW4yc3RyIChMZXhTdGF0ZSAqbHMsIGludCB0b2tlbik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xsaW1pdHMuaCBiL2NvbTMyL2x1YS9zcmMvbGxpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MmRkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xsaW1pdHMuaApAQCAtMCwwICsxLDMwOSBAQAorLyoKKyoqICRJZDogbGxpbWl0cy5oLHYgMS4xMDMuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogTGltaXRzLCBiYXNpYyB0eXBlcywgYW5kIHNvbWUgb3RoZXIgYGluc3RhbGxhdGlvbi1kZXBlbmRlbnQnIGRlZmluaXRpb25zCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsbGltaXRzX2gKKyNkZWZpbmUgbGxpbWl0c19oCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKyNpbmNsdWRlICJsdWEuaCIKKworCit0eXBlZGVmIHVuc2lnbmVkIExVQV9JTlQzMiBsdV9pbnQzMjsKKwordHlwZWRlZiBMVUFJX1VNRU0gbHVfbWVtOworCit0eXBlZGVmIExVQUlfTUVNIGxfbWVtOworCisKKworLyogY2hhcnMgdXNlZCBhcyBzbWFsbCBuYXR1cmFscyAoc28gdGhhdCBgY2hhcicgaXMgcmVzZXJ2ZWQgZm9yIGNoYXJhY3RlcnMpICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgbHVfYnl0ZTsKKworCisjZGVmaW5lIE1BWF9TSVpFVAkoKHNpemVfdCkofihzaXplX3QpMCktMikKKworI2RlZmluZSBNQVhfTFVNRU0JKChsdV9tZW0pKH4obHVfbWVtKTApLTIpCisKKyNkZWZpbmUgTUFYX0xNRU0JKChsX21lbSkgKChNQVhfTFVNRU0gPj4gMSkgLSAyKSkKKworCisjZGVmaW5lIE1BWF9JTlQgKElOVF9NQVgtMikgIC8qIG1heGltdW0gdmFsdWUgb2YgYW4gaW50ICgtMiBmb3Igc2FmZXR5KSAqLworCisvKgorKiogY29udmVyc2lvbiBvZiBwb2ludGVyIHRvIGludGVnZXIKKyoqIHRoaXMgaXMgZm9yIGhhc2hpbmcgb25seTsgdGhlcmUgaXMgbm8gcHJvYmxlbSBpZiB0aGUgaW50ZWdlcgorKiogY2Fubm90IGhvbGQgdGhlIHdob2xlIHBvaW50ZXIgdmFsdWUKKyovCisjZGVmaW5lIEludFBvaW50KHApICAoKHVuc2lnbmVkIGludCkobHVfbWVtKShwKSkKKworCisKKy8qIHR5cGUgdG8gZW5zdXJlIG1heGltdW0gYWxpZ25tZW50ICovCisjaWYgIWRlZmluZWQoTFVBSV9VU0VSX0FMSUdOTUVOVF9UKQorI2RlZmluZSBMVUFJX1VTRVJfQUxJR05NRU5UX1QJdW5pb24geyBkb3VibGUgdTsgdm9pZCAqczsgbG9uZyBsOyB9CisjZW5kaWYKKwordHlwZWRlZiBMVUFJX1VTRVJfQUxJR05NRU5UX1QgTF9VbWF4YWxpZ247CisKKworLyogcmVzdWx0IG9mIGEgYHVzdWFsIGFyZ3VtZW50IGNvbnZlcnNpb24nIG92ZXIgbHVhX051bWJlciAqLwordHlwZWRlZiBMVUFJX1VBQ05VTUJFUiBsX3VhY051bWJlcjsKKworCisvKiBpbnRlcm5hbCBhc3NlcnRpb25zIGZvciBpbi1ob3VzZSBkZWJ1Z2dpbmcgKi8KKyNpZiBkZWZpbmVkKGx1YV9hc3NlcnQpCisjZGVmaW5lIGNoZWNrX2V4cChjLGUpCQkobHVhX2Fzc2VydChjKSwgKGUpKQorLyogdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBjb25kaXRpb25zIHRvbyBsb25nICovCisjZGVmaW5lIGx1YV9sb25nYXNzZXJ0KGMpCXsgaWYgKCEoYykpIGx1YV9hc3NlcnQoMCk7IH0KKyNlbHNlCisjZGVmaW5lIGx1YV9hc3NlcnQoYykJCSgodm9pZCkwKQorI2RlZmluZSBjaGVja19leHAoYyxlKQkJKGUpCisjZGVmaW5lIGx1YV9sb25nYXNzZXJ0KGMpCSgodm9pZCkwKQorI2VuZGlmCisKKy8qCisqKiBhc3NlcnRpb24gZm9yIGNoZWNraW5nIEFQSSBjYWxscworKi8KKyNpZiAhZGVmaW5lZChsdWFpX2FwaWNoZWNrKQorCisjaWYgZGVmaW5lZChMVUFfVVNFX0FQSUNIRUNLKQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2RlZmluZSBsdWFpX2FwaWNoZWNrKEwsZSkJYXNzZXJ0KGUpCisjZWxzZQorI2RlZmluZSBsdWFpX2FwaWNoZWNrKEwsZSkJbHVhX2Fzc2VydChlKQorI2VuZGlmCisKKyNlbmRpZgorCisjZGVmaW5lIGFwaV9jaGVjayhsLGUsbXNnKQlsdWFpX2FwaWNoZWNrKGwsKGUpICYmIG1zZykKKworCisjaWYgIWRlZmluZWQoVU5VU0VEKQorI2RlZmluZSBVTlVTRUQoeCkJKCh2b2lkKSh4KSkJLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KKyNlbmRpZgorCisKKyNkZWZpbmUgY2FzdCh0LCBleHApCSgodCkoZXhwKSkKKworI2RlZmluZSBjYXN0X2J5dGUoaSkJY2FzdChsdV9ieXRlLCAoaSkpCisjZGVmaW5lIGNhc3RfbnVtKGkpCWNhc3QobHVhX051bWJlciwgKGkpKQorI2RlZmluZSBjYXN0X2ludChpKQljYXN0KGludCwgKGkpKQorI2RlZmluZSBjYXN0X3VjaGFyKGkpCWNhc3QodW5zaWduZWQgY2hhciwgKGkpKQorCisKKy8qCisqKiBub24tcmV0dXJuIHR5cGUKKyovCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgbF9ub3JldAkJdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBsX25vcmV0CQl2b2lkIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxzZQorI2RlZmluZSBsX25vcmV0CQl2b2lkCisjZW5kaWYKKworCisKKy8qCisqKiBtYXhpbXVtIGRlcHRoIGZvciBuZXN0ZWQgQyBjYWxscyBhbmQgc3ludGFjdGljYWwgbmVzdGVkIG5vbi10ZXJtaW5hbHMKKyoqIGluIGEgcHJvZ3JhbS4gKFZhbHVlIG11c3QgZml0IGluIGFuIHVuc2lnbmVkIHNob3J0IGludC4pCisqLworI2lmICFkZWZpbmVkKExVQUlfTUFYQ0NBTExTKQorI2RlZmluZSBMVUFJX01BWENDQUxMUwkJMjAwCisjZW5kaWYKKworLyoKKyoqIG1heGltdW0gbnVtYmVyIG9mIHVwdmFsdWVzIGluIGEgY2xvc3VyZSAoYm90aCBDIGFuZCBMdWEpLiAoVmFsdWUKKyoqIG11c3QgZml0IGluIGFuIHVuc2lnbmVkIGNoYXIuKQorKi8KKyNkZWZpbmUgTUFYVVBWQUwJVUNIQVJfTUFYCisKKworLyoKKyoqIHR5cGUgZm9yIHZpcnR1YWwtbWFjaGluZSBpbnN0cnVjdGlvbnMKKyoqIG11c3QgYmUgYW4gdW5zaWduZWQgd2l0aCAoYXQgbGVhc3QpIDQgYnl0ZXMgKHNlZSBkZXRhaWxzIGluIGxvcGNvZGVzLmgpCisqLwordHlwZWRlZiBsdV9pbnQzMiBJbnN0cnVjdGlvbjsKKworCisKKy8qIG1heGltdW0gc3RhY2sgZm9yIGEgTHVhIGZ1bmN0aW9uICovCisjZGVmaW5lIE1BWFNUQUNLCTI1MAorCisKKworLyogbWluaW11bSBzaXplIGZvciB0aGUgc3RyaW5nIHRhYmxlIChtdXN0IGJlIHBvd2VyIG9mIDIpICovCisjaWYgIWRlZmluZWQoTUlOU1RSVEFCU0laRSkKKyNkZWZpbmUgTUlOU1RSVEFCU0laRQkzMgorI2VuZGlmCisKKworLyogbWluaW11bSBzaXplIGZvciBzdHJpbmcgYnVmZmVyICovCisjaWYgIWRlZmluZWQoTFVBX01JTkJVRkZFUikKKyNkZWZpbmUgTFVBX01JTkJVRkZFUgkzMgorI2VuZGlmCisKKworI2lmICFkZWZpbmVkKGx1YV9sb2NrKQorI2RlZmluZSBsdWFfbG9jayhMKSAgICAgKCh2b2lkKSAwKQorI2RlZmluZSBsdWFfdW5sb2NrKEwpICAgKCh2b2lkKSAwKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChsdWFpX3RocmVhZHlpZWxkKQorI2RlZmluZSBsdWFpX3RocmVhZHlpZWxkKEwpICAgICB7bHVhX3VubG9jayhMKTsgbHVhX2xvY2soTCk7fQorI2VuZGlmCisKKworLyoKKyoqIHRoZXNlIG1hY3JvcyBhbGxvdyB1c2VyLXNwZWNpZmljIGFjdGlvbnMgb24gdGhyZWFkcyB3aGVuIHlvdSBkZWZpbmVkCisqKiBMVUFJX0VYVFJBU1BBQ0UgYW5kIG5lZWQgdG8gZG8gc29tZXRoaW5nIGV4dHJhIHdoZW4gYSB0aHJlYWQgaXMKKyoqIGNyZWF0ZWQvZGVsZXRlZC9yZXN1bWVkL3lpZWxkZWQuCisqLworI2lmICFkZWZpbmVkKGx1YWlfdXNlcnN0YXRlb3BlbikKKyNkZWZpbmUgbHVhaV91c2Vyc3RhdGVvcGVuKEwpCQkoKHZvaWQpTCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQobHVhaV91c2Vyc3RhdGVjbG9zZSkKKyNkZWZpbmUgbHVhaV91c2Vyc3RhdGVjbG9zZShMKQkJKCh2b2lkKUwpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKGx1YWlfdXNlcnN0YXRldGhyZWFkKQorI2RlZmluZSBsdWFpX3VzZXJzdGF0ZXRocmVhZChMLEwxKQkoKHZvaWQpTCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQobHVhaV91c2Vyc3RhdGVmcmVlKQorI2RlZmluZSBsdWFpX3VzZXJzdGF0ZWZyZWUoTCxMMSkJKCh2b2lkKUwpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKGx1YWlfdXNlcnN0YXRlcmVzdW1lKQorI2RlZmluZSBsdWFpX3VzZXJzdGF0ZXJlc3VtZShMLG4pICAgICAgICgodm9pZClMKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChsdWFpX3VzZXJzdGF0ZXlpZWxkKQorI2RlZmluZSBsdWFpX3VzZXJzdGF0ZXlpZWxkKEwsbikgICAgICAgICgodm9pZClMKQorI2VuZGlmCisKKy8qCisqKiBsdWFfbnVtYmVyMmludCBpcyBhIG1hY3JvIHRvIGNvbnZlcnQgbHVhX051bWJlciB0byBpbnQuCisqKiBsdWFfbnVtYmVyMmludGVnZXIgaXMgYSBtYWNybyB0byBjb252ZXJ0IGx1YV9OdW1iZXIgdG8gbHVhX0ludGVnZXIuCisqKiBsdWFfbnVtYmVyMnVuc2lnbmVkIGlzIGEgbWFjcm8gdG8gY29udmVydCBhIGx1YV9OdW1iZXIgdG8gYSBsdWFfVW5zaWduZWQuCisqKiBsdWFfdW5zaWduZWQybnVtYmVyIGlzIGEgbWFjcm8gdG8gY29udmVydCBhIGx1YV9VbnNpZ25lZCB0byBhIGx1YV9OdW1iZXIuCisqKiBsdWFpX2hhc2hudW0gaXMgYSBtYWNybyB0byBoYXNoIGEgbHVhX051bWJlciB2YWx1ZSBpbnRvIGFuIGludGVnZXIuCisqKiBUaGUgaGFzaCBtdXN0IGJlIGRldGVybWluaXN0aWMgYW5kIGdpdmUgcmVhc29uYWJsZSB2YWx1ZXMgZm9yCisqKiBib3RoIHNtYWxsIGFuZCBsYXJnZSB2YWx1ZXMgKG91dHNpZGUgdGhlIHJhbmdlIG9mIGludGVnZXJzKS4KKyovCisKKyNpZiBkZWZpbmVkKE1TX0FTTVRSSUNLKSB8fCBkZWZpbmVkKExVQV9NU0FTTVRSSUNLKQkvKiB7ICovCisvKiB0cmljayB3aXRoIE1pY3Jvc29mdCBhc3NlbWJsZXIgZm9yIFg4NiAqLworCisjZGVmaW5lIGx1YV9udW1iZXIyaW50KGksbikgIF9fYXNtIHtfX2FzbSBmbGQgbiAgIF9fYXNtIGZpc3RwIGl9CisjZGVmaW5lIGx1YV9udW1iZXIyaW50ZWdlcihpLG4pCQlsdWFfbnVtYmVyMmludChpLCBuKQorI2RlZmluZSBsdWFfbnVtYmVyMnVuc2lnbmVkKGksbikgIFwKKyAge19faW50NjQgbDsgX19hc20ge19fYXNtIGZsZCBuICAgX19hc20gZmlzdHAgbH0gaSA9ICh1bnNpZ25lZCBpbnQpbDt9CisKKworI2VsaWYgZGVmaW5lZChMVUFfSUVFRTc1NFRSSUNLKQkJLyogfXsgKi8KKy8qIHRoZSBuZXh0IHRyaWNrIHNob3VsZCB3b3JrIG9uIGFueSBtYWNoaW5lIHVzaW5nIElFRUU3NTQgd2l0aAorICAgYSAzMi1iaXQgaW50IHR5cGUgKi8KKwordW5pb24gbHVhaV9DYXN0IHsgZG91YmxlIGxfZDsgTFVBX0lOVDMyIGxfcFsyXTsgfTsKKworI2lmICFkZWZpbmVkKExVQV9JRUVFRU5ESUFOKQkvKiB7ICovCisjZGVmaW5lIExVQUlfRVhUUkFJRUVFCVwKKyAgc3RhdGljIGNvbnN0IHVuaW9uIGx1YWlfQ2FzdCBpZWVlZW5kaWFuID0gey0oMzMuMCArIDY3NTUzOTk0NDEwNTU3NDQuMCl9OworI2RlZmluZSBMVUFfSUVFRUVORElBTkxPQwkoaWVlZWVuZGlhbi5sX3BbMV0gPT0gMzMpCisjZWxzZQorI2RlZmluZSBMVUFfSUVFRUVORElBTkxPQwlMVUFfSUVFRUVORElBTgorI2RlZmluZSBMVUFJX0VYVFJBSUVFRQkJLyogZW1wdHkgKi8KKyNlbmRpZgkJCQkvKiB9ICovCisKKyNkZWZpbmUgbHVhX251bWJlcjJpbnQzMihpLG4sdCkgXAorICB7IExVQUlfRVhUUkFJRUVFIFwKKyAgICB2b2xhdGlsZSB1bmlvbiBsdWFpX0Nhc3QgdTsgdS5sX2QgPSAobikgKyA2NzU1Mzk5NDQxMDU1NzQ0LjA7IFwKKyAgICAoaSkgPSAodCl1LmxfcFtMVUFfSUVFRUVORElBTkxPQ107IH0KKworI2RlZmluZSBsdWFpX2hhc2hudW0oaSxuKSAgXAorICB7IHZvbGF0aWxlIHVuaW9uIGx1YWlfQ2FzdCB1OyB1LmxfZCA9IChuKSArIDEuMDsgIC8qIGF2b2lkIC0wICovIFwKKyAgICAoaSkgPSB1LmxfcFswXTsgKGkpICs9IHUubF9wWzFdOyB9ICAvKiBhZGQgZG91YmxlIGJpdHMgZm9yIGhpcyBoYXNoICovCisKKyNkZWZpbmUgbHVhX251bWJlcjJpbnQoaSxuKQkJbHVhX251bWJlcjJpbnQzMihpLCBuLCBpbnQpCisjZGVmaW5lIGx1YV9udW1iZXIydW5zaWduZWQoaSxuKQlsdWFfbnVtYmVyMmludDMyKGksIG4sIGx1YV9VbnNpZ25lZCkKKworLyogdGhlIHRyaWNrIGNhbiBiZSBleHBhbmRlZCB0byBsdWFfSW50ZWdlciB3aGVuIGl0IGlzIGEgMzItYml0IHZhbHVlICovCisjaWYgZGVmaW5lZChMVUFfSUVFRUxMKQorI2RlZmluZSBsdWFfbnVtYmVyMmludGVnZXIoaSxuKQkJbHVhX251bWJlcjJpbnQzMihpLCBuLCBsdWFfSW50ZWdlcikKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogfSAqLworCisKKy8qIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYWx3YXlzIHdvcmssIGJ1dCBtYXkgYmUgc2xvdyAqLworCisjaWYgIWRlZmluZWQobHVhX251bWJlcjJpbnQpCisjZGVmaW5lIGx1YV9udW1iZXIyaW50KGksbikJKChpKT0oaW50KShuKSkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQobHVhX251bWJlcjJpbnRlZ2VyKQorI2RlZmluZSBsdWFfbnVtYmVyMmludGVnZXIoaSxuKQkoKGkpPShsdWFfSW50ZWdlcikobikpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKGx1YV9udW1iZXIydW5zaWduZWQpCS8qIHsgKi8KKy8qIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiBhc3N1cmVzIHByb3BlciBtb2R1bG8gYmVoYXZpb3IgKi8KKyNpZiBkZWZpbmVkKExVQV9OVU1CRVJfRE9VQkxFKSB8fCBkZWZpbmVkKExVQV9OVU1CRVJfRkxPQVQpCisjaW5jbHVkZSA8bWF0aC5oPgorI2RlZmluZSBTVVBVTlNJR05FRAkoKGx1YV9OdW1iZXIpKH4obHVhX1Vuc2lnbmVkKTApICsgMSkKKyNkZWZpbmUgbHVhX251bWJlcjJ1bnNpZ25lZChpLG4pICBcCisJKChpKT0obHVhX1Vuc2lnbmVkKSgobikgLSBmbG9vcigobikvU1VQVU5TSUdORUQpKlNVUFVOU0lHTkVEKSkKKyNlbHNlCisjZGVmaW5lIGx1YV9udW1iZXIydW5zaWduZWQoaSxuKQkoKGkpPShsdWFfVW5zaWduZWQpKG4pKQorI2VuZGlmCisjZW5kaWYJCQkJLyogfSAqLworCisKKyNpZiAhZGVmaW5lZChsdWFfdW5zaWduZWQybnVtYmVyKQorLyogb24gc2V2ZXJhbCBtYWNoaW5lcywgY29lcmNpb24gZnJvbSB1bnNpZ25lZCB0byBkb3VibGUgaXMgc2xvdywKKyAgIHNvIGl0IG1heSBiZSB3b3J0aCB0byBhdm9pZCAqLworI2RlZmluZSBsdWFfdW5zaWduZWQybnVtYmVyKHUpICBcCisgICAgKCgodSkgPD0gKGx1YV9VbnNpZ25lZClJTlRfTUFYKSA/IChsdWFfTnVtYmVyKShpbnQpKHUpIDogKGx1YV9OdW1iZXIpKHUpKQorI2VuZGlmCisKKworCisjaWYgZGVmaW5lZChsdGFibGVfYykgJiYgIWRlZmluZWQobHVhaV9oYXNobnVtKQorCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUgbHVhaV9oYXNobnVtKGksbikgeyBpbnQgZTsgIFwKKyAgbiA9IGxfbWF0aG9wKGZyZXhwKShuLCAmZSkgKiAobHVhX051bWJlcikoSU5UX01BWCAtIERCTF9NQVhfRVhQKTsgIFwKKyAgbHVhX251bWJlcjJpbnQoaSwgbik7IGkgKz0gZTsgfQorCisjZW5kaWYKKworCisKKy8qCisqKiBtYWNybyB0byBjb250cm9sIGluY2x1c2lvbiBvZiBzb21lIGhhcmQgdGVzdHMgb24gc3RhY2sgcmVhbGxvY2F0aW9uCisqLworI2lmICFkZWZpbmVkKEhBUkRTVEFDS1RFU1RTKQorI2RlZmluZSBjb25kbW92ZXN0YWNrKEwpCSgodm9pZCkwKQorI2Vsc2UKKy8qIHJlYWxsb2Mgc3RhY2sga2VlcGluZyBpdHMgc2l6ZSAqLworI2RlZmluZSBjb25kbW92ZXN0YWNrKEwpCWx1YURfcmVhbGxvY3N0YWNrKChMKSwgKEwpLT5zdGFja3NpemUpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBUkRNRU1URVNUUykKKyNkZWZpbmUgY29uZGNoYW5nZW1lbShMKQljb25kbW92ZXN0YWNrKEwpCisjZWxzZQorI2RlZmluZSBjb25kY2hhbmdlbWVtKEwpICBcCisJKCh2b2lkKSghKEcoTCktPmdjcnVubmluZykgfHwgKGx1YUNfZnVsbGdjKEwsIDApLCAxKSkpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xtYXRobGliLmMgYi9jb20zMi9sdWEvc3JjL2xtYXRobGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlMmYzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbG1hdGhsaWIuYwpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyoqICRJZDogbG1hdGhsaWIuYyx2IDEuODMuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogU3RhbmRhcmQgbWF0aGVtYXRpY2FsIGxpYnJhcnkKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUgbG1hdGhsaWJfYworI2RlZmluZSBMVUFfTElCCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxhdXhsaWIuaCIKKyNpbmNsdWRlICJsdWFsaWIuaCIKKworCisjdW5kZWYgUEkKKyNkZWZpbmUgUEkJKChsdWFfTnVtYmVyKSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpKQorI2RlZmluZSBSQURJQU5TX1BFUl9ERUdSRUUJKChsdWFfTnVtYmVyKShQSS8xODAuMCkpCisKKworCitzdGF0aWMgaW50IG1hdGhfYWJzIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoZmFicykobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX3NpbiAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGxfbWF0aG9wKHNpbikobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX3NpbmggKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG51bWJlcihMLCBsX21hdGhvcChzaW5oKShsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfY29zIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoY29zKShsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfY29zaCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGxfbWF0aG9wKGNvc2gpKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF90YW4gKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG51bWJlcihMLCBsX21hdGhvcCh0YW4pKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF90YW5oIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AodGFuaCkobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2FzaW4gKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG51bWJlcihMLCBsX21hdGhvcChhc2luKShsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfYWNvcyAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGxfbWF0aG9wKGFjb3MpKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9hdGFuIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoYXRhbikobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2F0YW4yIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoYXRhbjIpKGx1YUxfY2hlY2tudW1iZXIoTCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YUxfY2hlY2tudW1iZXIoTCwgMikpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9jZWlsIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoY2VpbCkobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2Zsb29yIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoZmxvb3IpKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9mbW9kIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoZm1vZCkobHVhTF9jaGVja251bWJlcihMLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfbW9kZiAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9OdW1iZXIgaXA7CisgIGx1YV9OdW1iZXIgZnAgPSBsX21hdGhvcChtb2RmKShsdWFMX2NoZWNrbnVtYmVyKEwsIDEpLCAmaXApOworICBsdWFfcHVzaG51bWJlcihMLCBpcCk7CisgIGx1YV9wdXNobnVtYmVyKEwsIGZwKTsKKyAgcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9zcXJ0IChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3Aoc3FydCkobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX3BvdyAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9OdW1iZXIgeCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisgIGx1YV9OdW1iZXIgeSA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgIGx1YV9wdXNobnVtYmVyKEwsIGxfbWF0aG9wKHBvdykoeCwgeSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2xvZyAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9OdW1iZXIgeCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisgIGx1YV9OdW1iZXIgcmVzOworICBpZiAobHVhX2lzbm9uZW9ybmlsKEwsIDIpKQorICAgIHJlcyA9IGxfbWF0aG9wKGxvZykoeCk7CisgIGVsc2UgeworICAgIGx1YV9OdW1iZXIgYmFzZSA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgICAgaWYgKGJhc2UgPT0gKGx1YV9OdW1iZXIpMTAuMCkgcmVzID0gbF9tYXRob3AobG9nMTApKHgpOworICAgIGVsc2UgcmVzID0gbF9tYXRob3AobG9nKSh4KS9sX21hdGhvcChsb2cpKGJhc2UpOworICB9CisgIGx1YV9wdXNobnVtYmVyKEwsIHJlcyk7CisgIHJldHVybiAxOworfQorCisjaWYgZGVmaW5lZChMVUFfQ09NUEFUX0xPRzEwKQorc3RhdGljIGludCBtYXRoX2xvZzEwIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AobG9nMTApKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpKTsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBtYXRoX2V4cCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGxfbWF0aG9wKGV4cCkobHVhTF9jaGVja251bWJlcihMLCAxKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXRoX2RlZyAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGx1YUxfY2hlY2tudW1iZXIoTCwgMSkvUkFESUFOU19QRVJfREVHUkVFKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9yYWQgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG51bWJlcihMLCBsdWFMX2NoZWNrbnVtYmVyKEwsIDEpKlJBRElBTlNfUEVSX0RFR1JFRSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGhfZnJleHAgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgZTsKKyAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoZnJleHApKGx1YUxfY2hlY2tudW1iZXIoTCwgMSksICZlKSk7CisgIGx1YV9wdXNoaW50ZWdlcihMLCBlKTsKKyAgcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgbWF0aF9sZGV4cCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9OdW1iZXIgeCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisgIGludCBlcCA9IGx1YUxfY2hlY2tpbnQoTCwgMik7CisgIGx1YV9wdXNobnVtYmVyKEwsIGxfbWF0aG9wKGxkZXhwKSh4LCBlcCkpOworICByZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyBpbnQgbWF0aF9taW4gKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgbiA9IGx1YV9nZXR0b3AoTCk7ICAvKiBudW1iZXIgb2YgYXJndW1lbnRzICovCisgIGx1YV9OdW1iZXIgZG1pbiA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisgIGludCBpOworICBmb3IgKGk9MjsgaTw9bjsgaSsrKSB7CisgICAgbHVhX051bWJlciBkID0gbHVhTF9jaGVja251bWJlcihMLCBpKTsKKyAgICBpZiAoZCA8IGRtaW4pCisgICAgICBkbWluID0gZDsKKyAgfQorICBsdWFfcHVzaG51bWJlcihMLCBkbWluKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBtYXRoX21heCAobHVhX1N0YXRlICpMKSB7CisgIGludCBuID0gbHVhX2dldHRvcChMKTsgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgbHVhX051bWJlciBkbWF4ID0gbHVhTF9jaGVja251bWJlcihMLCAxKTsKKyAgaW50IGk7CisgIGZvciAoaT0yOyBpPD1uOyBpKyspIHsKKyAgICBsdWFfTnVtYmVyIGQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIGkpOworICAgIGlmIChkID4gZG1heCkKKyAgICAgIGRtYXggPSBkOworICB9CisgIGx1YV9wdXNobnVtYmVyKEwsIGRtYXgpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IG1hdGhfcmFuZG9tIChsdWFfU3RhdGUgKkwpIHsKKyAgLyogdGhlIGAlJyBhdm9pZHMgdGhlIChyYXJlKSBjYXNlIG9mIHI9PTEsIGFuZCBpcyBuZWVkZWQgYWxzbyBiZWNhdXNlIG9uCisgICAgIHNvbWUgc3lzdGVtcyAoU3VuT1MhKSBgcmFuZCgpJyBtYXkgcmV0dXJuIGEgdmFsdWUgbGFyZ2VyIHRoYW4gUkFORF9NQVggKi8KKyAgbHVhX051bWJlciByID0gKGx1YV9OdW1iZXIpKHJhbmQoKSVSQU5EX01BWCkgLyAobHVhX051bWJlcilSQU5EX01BWDsKKyAgc3dpdGNoIChsdWFfZ2V0dG9wKEwpKSB7ICAvKiBjaGVjayBudW1iZXIgb2YgYXJndW1lbnRzICovCisgICAgY2FzZSAwOiB7ICAvKiBubyBhcmd1bWVudHMgKi8KKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHIpOyAgLyogTnVtYmVyIGJldHdlZW4gMCBhbmQgMSAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMTogeyAgLyogb25seSB1cHBlciBsaW1pdCAqLworICAgICAgbHVhX051bWJlciB1ID0gbHVhTF9jaGVja251bWJlcihMLCAxKTsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgKGx1YV9OdW1iZXIpMS4wIDw9IHUsIDEsICJpbnRlcnZhbCBpcyBlbXB0eSIpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoZmxvb3IpKHIqdSkgKyAobHVhX051bWJlcikoMS4wKSk7ICAvKiBbMSwgdV0gKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDI6IHsgIC8qIGxvd2VyIGFuZCB1cHBlciBsaW1pdHMgKi8KKyAgICAgIGx1YV9OdW1iZXIgbCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisgICAgICBsdWFfTnVtYmVyIHUgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsIDw9IHUsIDIsICJpbnRlcnZhbCBpcyBlbXB0eSIpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgbF9tYXRob3AoZmxvb3IpKHIqKHUtbCsxKSkgKyBsKTsgIC8qIFtsLCB1XSAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiBsdWFMX2Vycm9yKEwsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBtYXRoX3JhbmRvbXNlZWQgKGx1YV9TdGF0ZSAqTCkgeworICBzcmFuZChsdWFMX2NoZWNrdW5zaWduZWQoTCwgMSkpOworICAodm9pZClyYW5kKCk7IC8qIGRpc2NhcmQgZmlyc3QgdmFsdWUgdG8gYXZvaWQgdW5kZXNpcmFibGUgY29ycmVsYXRpb25zICovCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBtYXRobGliW10gPSB7CisgIHsiYWJzIiwgICBtYXRoX2Fic30sCisgIHsiYWNvcyIsICBtYXRoX2Fjb3N9LAorICB7ImFzaW4iLCAgbWF0aF9hc2lufSwKKyAgeyJhdGFuMiIsIG1hdGhfYXRhbjJ9LAorICB7ImF0YW4iLCAgbWF0aF9hdGFufSwKKyAgeyJjZWlsIiwgIG1hdGhfY2VpbH0sCisgIHsiY29zaCIsICAgbWF0aF9jb3NofSwKKyAgeyJjb3MiLCAgIG1hdGhfY29zfSwKKyAgeyJkZWciLCAgIG1hdGhfZGVnfSwKKyAgeyJleHAiLCAgIG1hdGhfZXhwfSwKKyAgeyJmbG9vciIsIG1hdGhfZmxvb3J9LAorICB7ImZtb2QiLCAgIG1hdGhfZm1vZH0sCisgIHsiZnJleHAiLCBtYXRoX2ZyZXhwfSwKKyAgeyJsZGV4cCIsIG1hdGhfbGRleHB9LAorI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9MT0cxMCkKKyAgeyJsb2cxMCIsIG1hdGhfbG9nMTB9LAorI2VuZGlmCisgIHsibG9nIiwgICBtYXRoX2xvZ30sCisgIHsibWF4IiwgICBtYXRoX21heH0sCisgIHsibWluIiwgICBtYXRoX21pbn0sCisgIHsibW9kZiIsICAgbWF0aF9tb2RmfSwKKyAgeyJwb3ciLCAgIG1hdGhfcG93fSwKKyAgeyJyYWQiLCAgIG1hdGhfcmFkfSwKKyAgeyJyYW5kb20iLCAgICAgbWF0aF9yYW5kb219LAorICB7InJhbmRvbXNlZWQiLCBtYXRoX3JhbmRvbXNlZWR9LAorICB7InNpbmgiLCAgIG1hdGhfc2luaH0sCisgIHsic2luIiwgICBtYXRoX3Npbn0sCisgIHsic3FydCIsICBtYXRoX3NxcnR9LAorICB7InRhbmgiLCAgIG1hdGhfdGFuaH0sCisgIHsidGFuIiwgICBtYXRoX3Rhbn0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworCisvKgorKiogT3BlbiBtYXRoIGxpYnJhcnkKKyovCitMVUFNT0RfQVBJIGludCBsdWFvcGVuX21hdGggKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld2xpYihMLCBtYXRobGliKTsKKyAgbHVhX3B1c2hudW1iZXIoTCwgUEkpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsICJwaSIpOworI2lmbmRlZiBMVUFfTlVNQkVSX0lOVEVHUkFMCisgIGx1YV9wdXNobnVtYmVyKEwsIEhVR0VfVkFMKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAiaHVnZSIpOworI2VuZGlmCisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xtZW0uYyBiL2NvbTMyL2x1YS9zcmMvbG1lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzQzZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xtZW0uYwpAQCAtMCwwICsxLDk5IEBACisvKgorKiogJElkOiBsbWVtLmMsdiAxLjg0LjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIEludGVyZmFjZSB0byBNZW1vcnkgTWFuYWdlcgorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIGxtZW1fYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsZGVidWcuaCIKKyNpbmNsdWRlICJsZG8uaCIKKyNpbmNsdWRlICJsZ2MuaCIKKyNpbmNsdWRlICJsbWVtLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorCisKKworLyoKKyoqIEFib3V0IHRoZSByZWFsbG9jIGZ1bmN0aW9uOgorKiogdm9pZCAqIGZyZWFsbG9jICh2b2lkICp1ZCwgdm9pZCAqcHRyLCBzaXplX3Qgb3NpemUsIHNpemVfdCBuc2l6ZSk7CisqKiAoYG9zaXplJyBpcyB0aGUgb2xkIHNpemUsIGBuc2l6ZScgaXMgdGhlIG5ldyBzaXplKQorKioKKyoqICogZnJlYWxsb2ModWQsIE5VTEwsIHgsIHMpIGNyZWF0ZXMgYSBuZXcgYmxvY2sgb2Ygc2l6ZSBgcycgKG5vCisqKiBtYXR0ZXIgJ3gnKS4KKyoqCisqKiAqIGZyZWFsbG9jKHVkLCBwLCB4LCAwKSBmcmVlcyB0aGUgYmxvY2sgYHAnCisqKiAoaW4gdGhpcyBzcGVjaWZpYyBjYXNlLCBmcmVhbGxvYyBtdXN0IHJldHVybiBOVUxMKTsKKyoqIHBhcnRpY3VsYXJseSwgZnJlYWxsb2ModWQsIE5VTEwsIDAsIDApIGRvZXMgbm90aGluZworKiogKHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gZnJlZShOVUxMKSBpbiBBTlNJIEMpCisqKgorKiogZnJlYWxsb2MgcmV0dXJucyBOVUxMIGlmIGl0IGNhbm5vdCBjcmVhdGUgb3IgcmVhbGxvY2F0ZSB0aGUgYXJlYQorKiogKGFueSByZWFsbG9jYXRpb24gdG8gYW4gZXF1YWwgb3Igc21hbGxlciBzaXplIGNhbm5vdCBmYWlsISkKKyovCisKKworCisjZGVmaW5lIE1JTlNJWkVBUlJBWQk0CisKKwordm9pZCAqbHVhTV9ncm93YXV4XyAobHVhX1N0YXRlICpMLCB2b2lkICpibG9jaywgaW50ICpzaXplLCBzaXplX3Qgc2l6ZV9lbGVtcywKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW1pdCwgY29uc3QgY2hhciAqd2hhdCkgeworICB2b2lkICpuZXdibG9jazsKKyAgaW50IG5ld3NpemU7CisgIGlmICgqc2l6ZSA+PSBsaW1pdC8yKSB7ICAvKiBjYW5ub3QgZG91YmxlIGl0PyAqLworICAgIGlmICgqc2l6ZSA+PSBsaW1pdCkgIC8qIGNhbm5vdCBncm93IGV2ZW4gYSBsaXR0bGU/ICovCisgICAgICBsdWFHX3J1bmVycm9yKEwsICJ0b28gbWFueSAlcyAobGltaXQgaXMgJWQpIiwgd2hhdCwgbGltaXQpOworICAgIG5ld3NpemUgPSBsaW1pdDsgIC8qIHN0aWxsIGhhdmUgYXQgbGVhc3Qgb25lIGZyZWUgcGxhY2UgKi8KKyAgfQorICBlbHNlIHsKKyAgICBuZXdzaXplID0gKCpzaXplKSoyOworICAgIGlmIChuZXdzaXplIDwgTUlOU0laRUFSUkFZKQorICAgICAgbmV3c2l6ZSA9IE1JTlNJWkVBUlJBWTsgIC8qIG1pbmltdW0gc2l6ZSAqLworICB9CisgIG5ld2Jsb2NrID0gbHVhTV9yZWFsbG9jdihMLCBibG9jaywgKnNpemUsIG5ld3NpemUsIHNpemVfZWxlbXMpOworICAqc2l6ZSA9IG5ld3NpemU7ICAvKiB1cGRhdGUgb25seSB3aGVuIGV2ZXJ5dGhpbmcgZWxzZSBpcyBPSyAqLworICByZXR1cm4gbmV3YmxvY2s7Cit9CisKKworbF9ub3JldCBsdWFNX3Rvb2JpZyAobHVhX1N0YXRlICpMKSB7CisgIGx1YUdfcnVuZXJyb3IoTCwgIm1lbW9yeSBhbGxvY2F0aW9uIGVycm9yOiBibG9jayB0b28gYmlnIik7Cit9CisKKworCisvKgorKiogZ2VuZXJpYyBhbGxvY2F0aW9uIHJvdXRpbmUuCisqLwordm9pZCAqbHVhTV9yZWFsbG9jXyAobHVhX1N0YXRlICpMLCB2b2lkICpibG9jaywgc2l6ZV90IG9zaXplLCBzaXplX3QgbnNpemUpIHsKKyAgdm9pZCAqbmV3YmxvY2s7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIHNpemVfdCByZWFsb3NpemUgPSAoYmxvY2spID8gb3NpemUgOiAwOworICBsdWFfYXNzZXJ0KChyZWFsb3NpemUgPT0gMCkgPT0gKGJsb2NrID09IE5VTEwpKTsKKyNpZiBkZWZpbmVkKEhBUkRNRU1URVNUUykKKyAgaWYgKG5zaXplID4gcmVhbG9zaXplICYmIGctPmdjcnVubmluZykKKyAgICBsdWFDX2Z1bGxnYyhMLCAxKTsgIC8qIGZvcmNlIGEgR0Mgd2hlbmV2ZXIgcG9zc2libGUgKi8KKyNlbmRpZgorICBuZXdibG9jayA9ICgqZy0+ZnJlYWxsb2MpKGctPnVkLCBibG9jaywgb3NpemUsIG5zaXplKTsKKyAgaWYgKG5ld2Jsb2NrID09IE5VTEwgJiYgbnNpemUgPiAwKSB7CisgICAgYXBpX2NoZWNrKEwsIG5zaXplID4gcmVhbG9zaXplLAorICAgICAgICAgICAgICAgICAicmVhbGxvYyBjYW5ub3QgZmFpbCB3aGVuIHNocmlua2luZyBhIGJsb2NrIik7CisgICAgaWYgKGctPmdjcnVubmluZykgeworICAgICAgbHVhQ19mdWxsZ2MoTCwgMSk7ICAvKiB0cnkgdG8gZnJlZSBzb21lIG1lbW9yeS4uLiAqLworICAgICAgbmV3YmxvY2sgPSAoKmctPmZyZWFsbG9jKShnLT51ZCwgYmxvY2ssIG9zaXplLCBuc2l6ZSk7ICAvKiB0cnkgYWdhaW4gKi8KKyAgICB9CisgICAgaWYgKG5ld2Jsb2NrID09IE5VTEwpCisgICAgICBsdWFEX3Rocm93KEwsIExVQV9FUlJNRU0pOworICB9CisgIGx1YV9hc3NlcnQoKG5zaXplID09IDApID09IChuZXdibG9jayA9PSBOVUxMKSk7CisgIGctPkdDZGVidCA9IChnLT5HQ2RlYnQgKyBuc2l6ZSkgLSByZWFsb3NpemU7CisgIHJldHVybiBuZXdibG9jazsKK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sbWVtLmggYi9jb20zMi9sdWEvc3JjL2xtZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRmNGUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sbWVtLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyoqICRJZDogbG1lbS5oLHYgMS40MC4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBJbnRlcmZhY2UgdG8gTWVtb3J5IE1hbmFnZXIKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaWZuZGVmIGxtZW1faAorI2RlZmluZSBsbWVtX2gKKworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsbGltaXRzLmgiCisjaW5jbHVkZSAibHVhLmgiCisKKworLyoKKyoqIFRoaXMgbWFjcm8gYXZvaWRzIHRoZSBydW50aW1lIGRpdmlzaW9uIE1BWF9TSVpFVC8oZSksIGFzICdlJyBpcworKiogYWx3YXlzIGNvbnN0YW50LgorKiogVGhlIG1hY3JvIGlzIHNvbWV3aGF0IGNvbXBsZXggdG8gYXZvaWQgd2FybmluZ3M6CisqKiArMSBhdm9pZHMgd2FybmluZ3Mgb2YgImNvbXBhcmlzb24gaGFzIGNvbnN0YW50IHJlc3VsdCI7CisqKiBjYXN0IHRvICd2b2lkJyBhdm9pZHMgd2FybmluZ3Mgb2YgInZhbHVlIHVudXNlZCIuCisqLworI2RlZmluZSBsdWFNX3JlYWxsb2N2KEwsYixvbixuLGUpIFwKKyAgKGNhc3Qodm9pZCwgXAorICAgICAoY2FzdChzaXplX3QsIChuKSsxKSA+IE1BWF9TSVpFVC8oZSkpID8gKGx1YU1fdG9vYmlnKEwpLCAwKSA6IDApLCBcCisgICBsdWFNX3JlYWxsb2NfKEwsIChiKSwgKG9uKSooZSksIChuKSooZSkpKQorCisjZGVmaW5lIGx1YU1fZnJlZW1lbShMLCBiLCBzKQlsdWFNX3JlYWxsb2NfKEwsIChiKSwgKHMpLCAwKQorI2RlZmluZSBsdWFNX2ZyZWUoTCwgYikJCWx1YU1fcmVhbGxvY18oTCwgKGIpLCBzaXplb2YoKihiKSksIDApCisjZGVmaW5lIGx1YU1fZnJlZWFycmF5KEwsIGIsIG4pICAgbHVhTV9yZWFsbG9jdihMLCAoYiksIG4sIDAsIHNpemVvZigoYilbMF0pKQorCisjZGVmaW5lIGx1YU1fbWFsbG9jKEwscykJbHVhTV9yZWFsbG9jXyhMLCBOVUxMLCAwLCAocykpCisjZGVmaW5lIGx1YU1fbmV3KEwsdCkJCWNhc3QodCAqLCBsdWFNX21hbGxvYyhMLCBzaXplb2YodCkpKQorI2RlZmluZSBsdWFNX25ld3ZlY3RvcihMLG4sdCkgXAorCQljYXN0KHQgKiwgbHVhTV9yZWFsbG9jdihMLCBOVUxMLCAwLCBuLCBzaXplb2YodCkpKQorCisjZGVmaW5lIGx1YU1fbmV3b2JqZWN0KEwsdGFnLHMpCWx1YU1fcmVhbGxvY18oTCwgTlVMTCwgdGFnLCAocykpCisKKyNkZWZpbmUgbHVhTV9ncm93dmVjdG9yKEwsdixuZWxlbXMsc2l6ZSx0LGxpbWl0LGUpIFwKKyAgICAgICAgICBpZiAoKG5lbGVtcykrMSA+IChzaXplKSkgXAorICAgICAgICAgICAgKCh2KT1jYXN0KHQgKiwgbHVhTV9ncm93YXV4XyhMLHYsJihzaXplKSxzaXplb2YodCksbGltaXQsZSkpKQorCisjZGVmaW5lIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCB2LG9sZG4sbix0KSBcCisgICAoKHYpPWNhc3QodCAqLCBsdWFNX3JlYWxsb2N2KEwsIHYsIG9sZG4sIG4sIHNpemVvZih0KSkpKQorCitMVUFJX0ZVTkMgbF9ub3JldCBsdWFNX3Rvb2JpZyAobHVhX1N0YXRlICpMKTsKKworLyogbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseSAqLworTFVBSV9GVU5DIHZvaWQgKmx1YU1fcmVhbGxvY18gKGx1YV9TdGF0ZSAqTCwgdm9pZCAqYmxvY2ssIHNpemVfdCBvbGRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKTsKK0xVQUlfRlVOQyB2b2lkICpsdWFNX2dyb3dhdXhfIChsdWFfU3RhdGUgKkwsIHZvaWQgKmJsb2NrLCBpbnQgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfZWxlbSwgaW50IGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKndoYXQpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sb2FkbGliLmMgYi9jb20zMi9sdWEvc3JjL2xvYWRsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDkzNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sb2FkbGliLmMKQEAgLTAsMCArMSw4MDIgQEAKKy8qCisqKiAkSWQ6IGxvYWRsaWIuYyx2IDEuMTExLjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIER5bmFtaWMgbGlicmFyeSBsb2FkZXIgZm9yIEx1YQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyoqCisqKiBUaGlzIG1vZHVsZSBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBsb2FkbGliIGZvciBVbml4IHN5c3RlbXMKKyoqIHRoYXQgaGF2ZSBkbGZjbiwgYW4gaW1wbGVtZW50YXRpb24gZm9yIFdpbmRvd3MsIGFuZCBhIHN0dWIgZm9yIG90aGVyCisqKiBzeXN0ZW1zLgorKi8KKworCisvKgorKiogaWYgbmVlZGVkLCBpbmNsdWRlcyB3aW5kb3dzIGhlYWRlciBiZWZvcmUgZXZlcnl0aGluZyBlbHNlCisqLworI2lmIGRlZmluZWQoX1dJTjMyKQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisvKiBCYXNlIHRoZSBMdWEgcGF0aHMgb24gdGhlIFN5c2xpbnV4IHBhdGggKi8KKyNpZmRlZiBTWVNMSU5VWAorI2luY2x1ZGUgPGZzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKyNkZWZpbmUgbG9hZGxpYl9jCisjZGVmaW5lIExVQV9MSUIKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGF1eGxpYi5oIgorI2luY2x1ZGUgImx1YWxpYi5oIgorCisKKy8qCisqKiBMVUFfUEFUSCBhbmQgTFVBX0NQQVRIIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGVudmlyb25tZW50CisqKiB2YXJpYWJsZXMgdGhhdCBMdWEgY2hlY2sgdG8gc2V0IGl0cyBwYXRocy4KKyovCisjaWYgIWRlZmluZWQoTFVBX1BBVEgpCisjZGVmaW5lIExVQV9QQVRICSJMVUFfUEFUSCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTFVBX0NQQVRIKQorI2RlZmluZSBMVUFfQ1BBVEgJIkxVQV9DUEFUSCIKKyNlbmRpZgorCisjZGVmaW5lIExVQV9QQVRIU1VGRklYCQkiXyIgTFVBX1ZFUlNJT05fTUFKT1IgIl8iIExVQV9WRVJTSU9OX01JTk9SCisKKyNkZWZpbmUgTFVBX1BBVEhWRVJTSU9OCQlMVUFfUEFUSCBMVUFfUEFUSFNVRkZJWAorI2RlZmluZSBMVUFfQ1BBVEhWRVJTSU9OCUxVQV9DUEFUSCBMVUFfUEFUSFNVRkZJWAorCisvKgorKiogTFVBX1BBVEhfU0VQIGlzIHRoZSBjaGFyYWN0ZXIgdGhhdCBzZXBhcmF0ZXMgdGVtcGxhdGVzIGluIGEgcGF0aC4KKyoqIExVQV9QQVRIX01BUksgaXMgdGhlIHN0cmluZyB0aGF0IG1hcmtzIHRoZSBzdWJzdGl0dXRpb24gcG9pbnRzIGluIGEKKyoqIHRlbXBsYXRlLgorKiogTFVBX0VYRUNfRElSIGluIGEgV2luZG93cyBwYXRoIGlzIHJlcGxhY2VkIGJ5IHRoZSBleGVjdXRhYmxlJ3MKKyoqIGRpcmVjdG9yeS4KKyoqIExVQV9JR01BUksgaXMgYSBtYXJrIHRvIGlnbm9yZSBhbGwgYmVmb3JlIGl0IHdoZW4gYnVpbGRpbmcgdGhlCisqKiBsdWFvcGVuXyBmdW5jdGlvbiBuYW1lLgorKi8KKyNpZiAhZGVmaW5lZCAoTFVBX1BBVEhfU0VQKQorI2RlZmluZSBMVUFfUEFUSF9TRVAJCSI7IgorI2VuZGlmCisjaWYgIWRlZmluZWQgKExVQV9QQVRIX01BUkspCisjZGVmaW5lIExVQV9QQVRIX01BUksJCSI/IgorI2VuZGlmCisjaWYgIWRlZmluZWQgKExVQV9FWEVDX0RJUikKKyNkZWZpbmUgTFVBX0VYRUNfRElSCQkiISIKKyNlbmRpZgorI2lmICFkZWZpbmVkIChMVUFfSUdNQVJLKQorI2RlZmluZSBMVUFfSUdNQVJLCQkiLSIKKyNlbmRpZgorCisKKy8qCisqKiBMVUFfQ1NVQlNFUCBpcyB0aGUgY2hhcmFjdGVyIHRoYXQgcmVwbGFjZXMgZG90cyBpbiBzdWJtb2R1bGUgbmFtZXMKKyoqIHdoZW4gc2VhcmNoaW5nIGZvciBhIEMgbG9hZGVyLgorKiogTFVBX0xTVUJTRVAgaXMgdGhlIGNoYXJhY3RlciB0aGF0IHJlcGxhY2VzIGRvdHMgaW4gc3VibW9kdWxlIG5hbWVzCisqKiB3aGVuIHNlYXJjaGluZyBmb3IgYSBMdWEgbG9hZGVyLgorKi8KKyNpZiAhZGVmaW5lZChMVUFfQ1NVQlNFUCkKKyNkZWZpbmUgTFVBX0NTVUJTRVAJCUxVQV9ESVJTRVAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTFVBX0xTVUJTRVApCisjZGVmaW5lIExVQV9MU1VCU0VQCQlMVUFfRElSU0VQCisjZW5kaWYKKworCisvKiBwcmVmaXggZm9yIG9wZW4gZnVuY3Rpb25zIGluIEMgbGlicmFyaWVzICovCisjZGVmaW5lIExVQV9QT0YJCSJsdWFvcGVuXyIKKworLyogc2VwYXJhdG9yIGZvciBvcGVuIGZ1bmN0aW9ucyBpbiBDIGxpYnJhcmllcyAqLworI2RlZmluZSBMVUFfT0ZTRVAJIl8iCisKKworLyogdGFibGUgKGluIHRoZSByZWdpc3RyeSkgdGhhdCBrZWVwcyBoYW5kbGVzIGZvciBhbGwgbG9hZGVkIEMgbGlicmFyaWVzICovCisjZGVmaW5lIENMSUJTCQkiX0NMSUJTIgorCisjZGVmaW5lIExJQl9GQUlMCSJvcGVuIgorCisKKy8qIGVycm9yIGNvZGVzIGZvciBsbF9sb2FkZnVuYyAqLworI2RlZmluZSBFUlJMSUIJCTEKKyNkZWZpbmUgRVJSRlVOQwkJMgorCisjZGVmaW5lIHNldHByb2dkaXIoTCkJCSgodm9pZCkwKQorCisKKy8qCisqKiBzeXN0ZW0tZGVwZW5kZW50IGZ1bmN0aW9ucworKi8KK3N0YXRpYyB2b2lkIGxsX3VubG9hZGxpYiAodm9pZCAqbGliKTsKK3N0YXRpYyB2b2lkICpsbF9sb2FkIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBzZWVnbGIpOworc3RhdGljIGx1YV9DRnVuY3Rpb24gbGxfc3ltIChsdWFfU3RhdGUgKkwsIHZvaWQgKmxpYiwgY29uc3QgY2hhciAqc3ltKTsKKworCisKKyNpZiBkZWZpbmVkKExVQV9VU0VfRExPUEVOKQorLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgbG9hZGxpYiBiYXNlZCBvbiB0aGUgZGxmY24gaW50ZXJmYWNlLgorKiogVGhlIGRsZmNuIGludGVyZmFjZSBpcyBhdmFpbGFibGUgaW4gTGludXgsIFN1bk9TLCBTb2xhcmlzLCBJUklYLCBGcmVlQlNELAorKiogTmV0QlNELCBBSVggNC4yLCBIUFVYIDExLCBhbmQgIHByb2JhYmx5IG1vc3Qgb3RoZXIgVW5peCBmbGF2b3JzLCBhdCBsZWFzdAorKiogYXMgYW4gZW11bGF0aW9uIGxheWVyIG9uIHRvcCBvZiBuYXRpdmUgZnVuY3Rpb25zLgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2luY2x1ZGUgPGRsZmNuLmg+CisKK3N0YXRpYyB2b2lkIGxsX3VubG9hZGxpYiAodm9pZCAqbGliKSB7CisgIGRsY2xvc2UobGliKTsKK30KKworCitzdGF0aWMgdm9pZCAqbGxfbG9hZCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgc2VlZ2xiKSB7CisgIHZvaWQgKmxpYiA9IGRsb3BlbihwYXRoLCBSVExEX05PVyB8IChzZWVnbGIgPyBSVExEX0dMT0JBTCA6IFJUTERfTE9DQUwpKTsKKyAgaWYgKGxpYiA9PSBOVUxMKSBsdWFfcHVzaHN0cmluZyhMLCBkbGVycm9yKCkpOworICByZXR1cm4gbGliOworfQorCisKK3N0YXRpYyBsdWFfQ0Z1bmN0aW9uIGxsX3N5bSAobHVhX1N0YXRlICpMLCB2b2lkICpsaWIsIGNvbnN0IGNoYXIgKnN5bSkgeworICBsdWFfQ0Z1bmN0aW9uIGYgPSAobHVhX0NGdW5jdGlvbilkbHN5bShsaWIsIHN5bSk7CisgIGlmIChmID09IE5VTEwpIGx1YV9wdXNoc3RyaW5nKEwsIGRsZXJyb3IoKSk7CisgIHJldHVybiBmOworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCisjZWxpZiBkZWZpbmVkKExVQV9ETF9ETEwpCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgbG9hZGxpYiBmb3IgV2luZG93cyB1c2luZyBuYXRpdmUgZnVuY3Rpb25zLgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyN1bmRlZiBzZXRwcm9nZGlyCisKKy8qCisqKiBvcHRpb25hbCBmbGFncyBmb3IgTG9hZExpYnJhcnlFeAorKi8KKyNpZiAhZGVmaW5lZChMVUFfTExFX0ZMQUdTKQorI2RlZmluZSBMVUFfTExFX0ZMQUdTCTAKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIHNldHByb2dkaXIgKGx1YV9TdGF0ZSAqTCkgeworICBjaGFyIGJ1ZmZbTUFYX1BBVEggKyAxXTsKKyAgY2hhciAqbGI7CisgIERXT1JEIG5zaXplID0gc2l6ZW9mKGJ1ZmYpL3NpemVvZihjaGFyKTsKKyAgRFdPUkQgbiA9IEdldE1vZHVsZUZpbGVOYW1lQShOVUxMLCBidWZmLCBuc2l6ZSk7CisgIGlmIChuID09IDAgfHwgbiA9PSBuc2l6ZSB8fCAobGIgPSBzdHJyY2hyKGJ1ZmYsICdcXCcpKSA9PSBOVUxMKQorICAgIGx1YUxfZXJyb3IoTCwgInVuYWJsZSB0byBnZXQgTW9kdWxlRmlsZU5hbWUiKTsKKyAgZWxzZSB7CisgICAgKmxiID0gJ1wwJzsKKyAgICBsdWFMX2dzdWIoTCwgbHVhX3Rvc3RyaW5nKEwsIC0xKSwgTFVBX0VYRUNfRElSLCBidWZmKTsKKyAgICBsdWFfcmVtb3ZlKEwsIC0yKTsgIC8qIHJlbW92ZSBvcmlnaW5hbCBzdHJpbmcgKi8KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHB1c2hlcnJvciAobHVhX1N0YXRlICpMKSB7CisgIGludCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICBjaGFyIGJ1ZmZlclsxMjhdOworICBpZiAoRm9ybWF0TWVzc2FnZUEoRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKKyAgICAgIE5VTEwsIGVycm9yLCAwLCBidWZmZXIsIHNpemVvZihidWZmZXIpL3NpemVvZihjaGFyKSwgTlVMTCkpCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgYnVmZmVyKTsKKyAgZWxzZQorICAgIGx1YV9wdXNoZnN0cmluZyhMLCAic3lzdGVtIGVycm9yICVkXG4iLCBlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkIGxsX3VubG9hZGxpYiAodm9pZCAqbGliKSB7CisgIEZyZWVMaWJyYXJ5KChITU9EVUxFKWxpYik7Cit9CisKKworc3RhdGljIHZvaWQgKmxsX2xvYWQgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcGF0aCwgaW50IHNlZWdsYikgeworICBITU9EVUxFIGxpYiA9IExvYWRMaWJyYXJ5RXhBKHBhdGgsIE5VTEwsIExVQV9MTEVfRkxBR1MpOworICAodm9pZCkoc2VlZ2xiKTsgIC8qIG5vdCB1c2VkOiBzeW1ib2xzIGFyZSAnZ2xvYmFsJyBieSBkZWZhdWx0ICovCisgIGlmIChsaWIgPT0gTlVMTCkgcHVzaGVycm9yKEwpOworICByZXR1cm4gbGliOworfQorCisKK3N0YXRpYyBsdWFfQ0Z1bmN0aW9uIGxsX3N5bSAobHVhX1N0YXRlICpMLCB2b2lkICpsaWIsIGNvbnN0IGNoYXIgKnN5bSkgeworICBsdWFfQ0Z1bmN0aW9uIGYgPSAobHVhX0NGdW5jdGlvbilHZXRQcm9jQWRkcmVzcygoSE1PRFVMRSlsaWIsIHN5bSk7CisgIGlmIChmID09IE5VTEwpIHB1c2hlcnJvcihMKTsKKyAgcmV0dXJuIGY7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisjZWxpZiBkZWZpbmVkKFNZU0xJTlVYKQorLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGxvYWRsaWIgZm9yIHRoZSBTeXNsaW51eCBDT00zMiBtb2R1bGUgc3lzdGVtLgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpbmNsdWRlIDxzeXMvbW9kdWxlLmg+CisKK3N0YXRpYyB2b2lkIGxsX3VubG9hZGxpYiAodm9pZCAqbGliKSB7CisgIG1vZHVsZV91bmxvYWQgKChzdHJ1Y3QgZWxmX21vZHVsZSAqKWxpYik7Cit9CisKKworc3RhdGljIHZvaWQgKmxsX2xvYWQgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcGF0aCwgaW50IHNlZWdsYikgeworICBpbnQgZXJyOworICBzdHJ1Y3QgZWxmX21vZHVsZSAqbGliID0gbW9kdWxlX2FsbG9jIChwYXRoKTsKKyAgaWYgKGxpYiA9PSBOVUxMKSB7CisgICAgbHVhX3B1c2hzdHJpbmcgKEwsICJtb2R1bGUgbm90IGZvdW5kIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgKHZvaWQpc2VlZ2xiOyAvKiBnY2MsIGlnbm9yZSBpdCAqLworICBlcnIgPSBtb2R1bGVfbG9hZCAobGliKTsKKyAgaWYgKGVycikgeworICAgIHByaW50ZiAoIm1vZHVsZSBsb2FkIGVycm9yOiAlZFxuIiwgZXJyKTsKKyAgICBsdWFfcHVzaHN0cmluZyAoTCwgImZhaWxlZCB0byBsb2FkIG1vZHVsZSIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAodm9pZCAqKWxpYjsKK30KKworCitzdGF0aWMgbHVhX0NGdW5jdGlvbiBsbF9zeW0gKGx1YV9TdGF0ZSAqTCwgdm9pZCAqbGliLCBjb25zdCBjaGFyICpzeW0pIHsKKyAgRWxmX1N5bSAqcCA9IG1vZHVsZV9maW5kX3N5bWJvbCAoc3ltLCAoc3RydWN0IGVsZl9tb2R1bGUgKilsaWIpOworICBpZiAocCA9PSBOVUxMKSB7CisgICAgbHVhX3B1c2hzdHJpbmcgKEwsICJzeW1ib2wgbm90IGZvdW5kIGluIG1vZHVsZSIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAobHVhX0NGdW5jdGlvbiltb2R1bGVfZ2V0X2Fic29sdXRlKHAtPnN0X3ZhbHVlLCAoc3RydWN0IGVsZl9tb2R1bGUgKilsaWIpOworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCisjZWxzZQorLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIEZhbGxiYWNrIGZvciBvdGhlciBzeXN0ZW1zCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjdW5kZWYgTElCX0ZBSUwKKyNkZWZpbmUgTElCX0ZBSUwJImFic2VudCIKKworCisjZGVmaW5lIERMTVNHCSJkeW5hbWljIGxpYnJhcmllcyBub3QgZW5hYmxlZDsgY2hlY2sgeW91ciBMdWEgaW5zdGFsbGF0aW9uIgorCisKK3N0YXRpYyB2b2lkIGxsX3VubG9hZGxpYiAodm9pZCAqbGliKSB7CisgICh2b2lkKShsaWIpOyAgLyogbm90IHVzZWQgKi8KK30KKworCitzdGF0aWMgdm9pZCAqbGxfbG9hZCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgc2VlZ2xiKSB7CisgICh2b2lkKShwYXRoKTsgKHZvaWQpKHNlZWdsYik7ICAvKiBub3QgdXNlZCAqLworICBsdWFfcHVzaGxpdGVyYWwoTCwgRExNU0cpOworICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgbHVhX0NGdW5jdGlvbiBsbF9zeW0gKGx1YV9TdGF0ZSAqTCwgdm9pZCAqbGliLCBjb25zdCBjaGFyICpzeW0pIHsKKyAgKHZvaWQpKGxpYik7ICh2b2lkKShzeW0pOyAgLyogbm90IHVzZWQgKi8KKyAgbHVhX3B1c2hsaXRlcmFsKEwsIERMTVNHKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkICpsbF9jaGVja2NsaWIgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcGF0aCkgeworICB2b2lkICpwbGliOworICBsdWFfZ2V0ZmllbGQoTCwgTFVBX1JFR0lTVFJZSU5ERVgsIENMSUJTKTsKKyAgbHVhX2dldGZpZWxkKEwsIC0xLCBwYXRoKTsKKyAgcGxpYiA9IGx1YV90b3VzZXJkYXRhKEwsIC0xKTsgIC8qIHBsaWIgPSBDTElCU1twYXRoXSAqLworICBsdWFfcG9wKEwsIDIpOyAgLyogcG9wIENMSUJTIHRhYmxlIGFuZCAncGxpYicgKi8KKyAgcmV0dXJuIHBsaWI7Cit9CisKKworc3RhdGljIHZvaWQgbGxfYWRkdG9jbGliIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnBhdGgsIHZvaWQgKnBsaWIpIHsKKyAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCBDTElCUyk7CisgIGx1YV9wdXNobGlnaHR1c2VyZGF0YShMLCBwbGliKTsKKyAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7CisgIGx1YV9zZXRmaWVsZChMLCAtMywgcGF0aCk7ICAvKiBDTElCU1twYXRoXSA9IHBsaWIgKi8KKyAgbHVhX3Jhd3NldGkoTCwgLTIsIGx1YUxfbGVuKEwsIC0yKSArIDEpOyAgLyogQ0xJQlNbI0NMSUJTICsgMV0gPSBwbGliICovCisgIGx1YV9wb3AoTCwgMSk7ICAvKiBwb3AgQ0xJQlMgdGFibGUgKi8KK30KKworCisvKgorKiogX19nYyB0YWcgbWV0aG9kIGZvciBDTElCUyB0YWJsZTogY2FsbHMgJ2xsX3VubG9hZGxpYicgZm9yIGFsbCBsaWIKKyoqIGhhbmRsZXMgaW4gbGlzdCBDTElCUworKi8KK3N0YXRpYyBpbnQgZ2N0bSAobHVhX1N0YXRlICpMKSB7CisgIGludCBuID0gbHVhTF9sZW4oTCwgMSk7CisgIGZvciAoOyBuID49IDE7IG4tLSkgeyAgLyogZm9yIGVhY2ggaGFuZGxlLCBpbiByZXZlcnNlIG9yZGVyICovCisgICAgbHVhX3Jhd2dldGkoTCwgMSwgbik7ICAvKiBnZXQgaGFuZGxlIENMSUJTW25dICovCisgICAgbGxfdW5sb2FkbGliKGx1YV90b3VzZXJkYXRhKEwsIC0xKSk7CisgICAgbHVhX3BvcChMLCAxKTsgIC8qIHBvcCBoYW5kbGUgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGxsX2xvYWRmdW5jIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnN5bSkgeworICB2b2lkICpyZWcgPSBsbF9jaGVja2NsaWIoTCwgcGF0aCk7ICAvKiBjaGVjayBsb2FkZWQgQyBsaWJyYXJpZXMgKi8KKyAgaWYgKHJlZyA9PSBOVUxMKSB7ICAvKiBtdXN0IGxvYWQgbGlicmFyeT8gKi8KKyAgICByZWcgPSBsbF9sb2FkKEwsIHBhdGgsICpzeW0gPT0gJyonKTsKKyAgICBpZiAocmVnID09IE5VTEwpIHJldHVybiBFUlJMSUI7ICAvKiB1bmFibGUgdG8gbG9hZCBsaWJyYXJ5ICovCisgICAgbGxfYWRkdG9jbGliKEwsIHBhdGgsIHJlZyk7CisgIH0KKyAgaWYgKCpzeW0gPT0gJyonKSB7ICAvKiBsb2FkaW5nIG9ubHkgbGlicmFyeSAobm8gZnVuY3Rpb24pPyAqLworICAgIGx1YV9wdXNoYm9vbGVhbihMLCAxKTsgIC8qIHJldHVybiAndHJ1ZScgKi8KKyAgICByZXR1cm4gMDsgIC8qIG5vIGVycm9ycyAqLworICB9CisgIGVsc2UgeworICAgIGx1YV9DRnVuY3Rpb24gZiA9IGxsX3N5bShMLCByZWcsIHN5bSk7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgIHJldHVybiBFUlJGVU5DOyAgLyogdW5hYmxlIHRvIGZpbmQgZnVuY3Rpb24gKi8KKyAgICBsdWFfcHVzaGNmdW5jdGlvbihMLCBmKTsgIC8qIGVsc2UgY3JlYXRlIG5ldyBmdW5jdGlvbiAqLworICAgIHJldHVybiAwOyAgLyogbm8gZXJyb3JzICovCisgIH0KK30KKworCitzdGF0aWMgaW50IGxsX2xvYWRsaWIgKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpwYXRoID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgY29uc3QgY2hhciAqaW5pdCA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMik7CisgIGludCBzdGF0ID0gbGxfbG9hZGZ1bmMoTCwgcGF0aCwgaW5pdCk7CisgIGlmIChzdGF0ID09IDApICAvKiBubyBlcnJvcnM/ICovCisgICAgcmV0dXJuIDE7ICAvKiByZXR1cm4gdGhlIGxvYWRlZCBmdW5jdGlvbiAqLworICBlbHNlIHsgIC8qIGVycm9yOyBlcnJvciBtZXNzYWdlIGlzIG9uIHN0YWNrIHRvcCAqLworICAgIGx1YV9wdXNobmlsKEwpOworICAgIGx1YV9pbnNlcnQoTCwgLTIpOworICAgIGx1YV9wdXNoc3RyaW5nKEwsIChzdGF0ID09IEVSUkxJQikgPyAgTElCX0ZBSUwgOiAiaW5pdCIpOworICAgIHJldHVybiAzOyAgLyogcmV0dXJuIG5pbCwgZXJyb3IgbWVzc2FnZSwgYW5kIHdoZXJlICovCisgIH0KK30KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiAncmVxdWlyZScgZnVuY3Rpb24KKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworc3RhdGljIGludCByZWFkYWJsZSAoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOyAgLyogdHJ5IHRvIG9wZW4gZmlsZSAqLworICBpZiAoZiA9PSBOVUxMKSByZXR1cm4gMDsgIC8qIG9wZW4gZmFpbGVkICovCisgIGZjbG9zZShmKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnB1c2huZXh0dGVtcGxhdGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcGF0aCkgeworICBjb25zdCBjaGFyICpsOworICB3aGlsZSAoKnBhdGggPT0gKkxVQV9QQVRIX1NFUCkgcGF0aCsrOyAgLyogc2tpcCBzZXBhcmF0b3JzICovCisgIGlmICgqcGF0aCA9PSAnXDAnKSByZXR1cm4gTlVMTDsgIC8qIG5vIG1vcmUgdGVtcGxhdGVzICovCisgIGwgPSBzdHJjaHIocGF0aCwgKkxVQV9QQVRIX1NFUCk7ICAvKiBmaW5kIG5leHQgc2VwYXJhdG9yICovCisgIGlmIChsID09IE5VTEwpIGwgPSBwYXRoICsgc3RybGVuKHBhdGgpOworICBsdWFfcHVzaGxzdHJpbmcoTCwgcGF0aCwgbCAtIHBhdGgpOyAgLyogdGVtcGxhdGUgKi8KKyAgcmV0dXJuIGw7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnNlYXJjaHBhdGggKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXJzZXApIHsKKyAgbHVhTF9CdWZmZXIgbXNnOyAgLyogdG8gYnVpbGQgZXJyb3IgbWVzc2FnZSAqLworICBsdWFMX2J1ZmZpbml0KEwsICZtc2cpOworICBpZiAoKnNlcCAhPSAnXDAnKSAgLyogbm9uLWVtcHR5IHNlcGFyYXRvcj8gKi8KKyAgICBuYW1lID0gbHVhTF9nc3ViKEwsIG5hbWUsIHNlcCwgZGlyc2VwKTsgIC8qIHJlcGxhY2UgaXQgYnkgJ2RpcnNlcCcgKi8KKyAgd2hpbGUgKChwYXRoID0gcHVzaG5leHR0ZW1wbGF0ZShMLCBwYXRoKSkgIT0gTlVMTCkgeworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gbHVhTF9nc3ViKEwsIGx1YV90b3N0cmluZyhMLCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFVBX1BBVEhfTUFSSywgbmFtZSk7CisgICAgbHVhX3JlbW92ZShMLCAtMik7ICAvKiByZW1vdmUgcGF0aCB0ZW1wbGF0ZSAqLworICAgIGlmIChyZWFkYWJsZShmaWxlbmFtZSkpICAvKiBkb2VzIGZpbGUgZXhpc3QgYW5kIGlzIHJlYWRhYmxlPyAqLworICAgICAgcmV0dXJuIGZpbGVuYW1lOyAgLyogcmV0dXJuIHRoYXQgZmlsZSBuYW1lICovCisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJcblx0bm8gZmlsZSAiIExVQV9RUywgZmlsZW5hbWUpOworICAgIGx1YV9yZW1vdmUoTCwgLTIpOyAgLyogcmVtb3ZlIGZpbGUgbmFtZSAqLworICAgIGx1YUxfYWRkdmFsdWUoJm1zZyk7ICAvKiBjb25jYXRlbmF0ZSBlcnJvciBtc2cuIGVudHJ5ICovCisgIH0KKyAgbHVhTF9wdXNocmVzdWx0KCZtc2cpOyAgLyogY3JlYXRlIGVycm9yIG1lc3NhZ2UgKi8KKyAgcmV0dXJuIE5VTEw7ICAvKiBub3QgZm91bmQgKi8KK30KKworCitzdGF0aWMgaW50IGxsX3NlYXJjaHBhdGggKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpmID0gc2VhcmNocGF0aChMLCBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFMX29wdHN0cmluZyhMLCAzLCAiLiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdWFMX29wdHN0cmluZyhMLCA0LCBMVUFfRElSU0VQKSk7CisgIGlmIChmICE9IE5VTEwpIHJldHVybiAxOworICBlbHNlIHsgIC8qIGVycm9yIG1lc3NhZ2UgaXMgb24gdG9wIG9mIHRoZSBzdGFjayAqLworICAgIGx1YV9wdXNobmlsKEwpOworICAgIGx1YV9pbnNlcnQoTCwgLTIpOworICAgIHJldHVybiAyOyAgLyogcmV0dXJuIG5pbCArIGVycm9yIG1lc3NhZ2UgKi8KKyAgfQorfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kZmlsZSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRpcnNlcCkgeworICBjb25zdCBjaGFyICpwYXRoOworICBsdWFfZ2V0ZmllbGQoTCwgbHVhX3VwdmFsdWVpbmRleCgxKSwgcG5hbWUpOworICBwYXRoID0gbHVhX3Rvc3RyaW5nKEwsIC0xKTsKKyAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICBsdWFMX2Vycm9yKEwsIExVQV9RTCgicGFja2FnZS4lcyIpICIgbXVzdCBiZSBhIHN0cmluZyIsIHBuYW1lKTsKKyAgcmV0dXJuIHNlYXJjaHBhdGgoTCwgbmFtZSwgcGF0aCwgIi4iLCBkaXJzZXApOworfQorCisKK3N0YXRpYyBpbnQgY2hlY2tsb2FkIChsdWFfU3RhdGUgKkwsIGludCBzdGF0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkgeworICBpZiAoc3RhdCkgeyAgLyogbW9kdWxlIGxvYWRlZCBzdWNjZXNzZnVsbHk/ICovCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgZmlsZW5hbWUpOyAgLyogd2lsbCBiZSAybmQgYXJndW1lbnQgdG8gbW9kdWxlICovCisgICAgcmV0dXJuIDI7ICAvKiByZXR1cm4gb3BlbiBmdW5jdGlvbiBhbmQgZmlsZSBuYW1lICovCisgIH0KKyAgZWxzZQorICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICJlcnJvciBsb2FkaW5nIG1vZHVsZSAiIExVQV9RUworICAgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSBmaWxlICIgTFVBX1FTICI6XG5cdCVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhX3Rvc3RyaW5nKEwsIDEpLCBmaWxlbmFtZSwgbHVhX3Rvc3RyaW5nKEwsIC0xKSk7Cit9CisKKworc3RhdGljIGludCBzZWFyY2hlcl9MdWEgKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgY29uc3QgY2hhciAqbmFtZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGZpbGVuYW1lID0gZmluZGZpbGUoTCwgbmFtZSwgInBhdGgiLCBMVUFfTFNVQlNFUCk7CisgIGlmIChmaWxlbmFtZSA9PSBOVUxMKSByZXR1cm4gMTsgIC8qIG1vZHVsZSBub3QgZm91bmQgaW4gdGhpcyBwYXRoICovCisgIHJldHVybiBjaGVja2xvYWQoTCwgKGx1YUxfbG9hZGZpbGUoTCwgZmlsZW5hbWUpID09IExVQV9PSyksIGZpbGVuYW1lKTsKK30KKworCitzdGF0aWMgaW50IGxvYWRmdW5jIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RuYW1lKSB7CisgIGNvbnN0IGNoYXIgKmZ1bmNuYW1lOworICBjb25zdCBjaGFyICptYXJrOworICBtb2RuYW1lID0gbHVhTF9nc3ViKEwsIG1vZG5hbWUsICIuIiwgTFVBX09GU0VQKTsKKyAgbWFyayA9IHN0cmNocihtb2RuYW1lLCAqTFVBX0lHTUFSSyk7CisgIGlmIChtYXJrKSB7CisgICAgaW50IHN0YXQ7CisgICAgZnVuY25hbWUgPSBsdWFfcHVzaGxzdHJpbmcoTCwgbW9kbmFtZSwgbWFyayAtIG1vZG5hbWUpOworICAgIGZ1bmNuYW1lID0gbHVhX3B1c2hmc3RyaW5nKEwsIExVQV9QT0YiJXMiLCBmdW5jbmFtZSk7CisgICAgc3RhdCA9IGxsX2xvYWRmdW5jKEwsIGZpbGVuYW1lLCBmdW5jbmFtZSk7CisgICAgaWYgKHN0YXQgIT0gRVJSRlVOQykgcmV0dXJuIHN0YXQ7CisgICAgbW9kbmFtZSA9IG1hcmsgKyAxOyAgLyogZWxzZSBnbyBhaGVhZCBhbmQgdHJ5IG9sZC1zdHlsZSBuYW1lICovCisgIH0KKyAgZnVuY25hbWUgPSBsdWFfcHVzaGZzdHJpbmcoTCwgTFVBX1BPRiIlcyIsIG1vZG5hbWUpOworICByZXR1cm4gbGxfbG9hZGZ1bmMoTCwgZmlsZW5hbWUsIGZ1bmNuYW1lKTsKK30KKworCitzdGF0aWMgaW50IHNlYXJjaGVyX0MgKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpuYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBmaW5kZmlsZShMLCBuYW1lLCAiY3BhdGgiLCBMVUFfQ1NVQlNFUCk7CisgIGlmIChmaWxlbmFtZSA9PSBOVUxMKSByZXR1cm4gMTsgIC8qIG1vZHVsZSBub3QgZm91bmQgaW4gdGhpcyBwYXRoICovCisgIHJldHVybiBjaGVja2xvYWQoTCwgKGxvYWRmdW5jKEwsIGZpbGVuYW1lLCBuYW1lKSA9PSAwKSwgZmlsZW5hbWUpOworfQorCisKK3N0YXRpYyBpbnQgc2VhcmNoZXJfQ3Jvb3QgKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgY29uc3QgY2hhciAqbmFtZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGNvbnN0IGNoYXIgKnAgPSBzdHJjaHIobmFtZSwgJy4nKTsKKyAgaW50IHN0YXQ7CisgIGlmIChwID09IE5VTEwpIHJldHVybiAwOyAgLyogaXMgcm9vdCAqLworICBsdWFfcHVzaGxzdHJpbmcoTCwgbmFtZSwgcCAtIG5hbWUpOworICBmaWxlbmFtZSA9IGZpbmRmaWxlKEwsIGx1YV90b3N0cmluZyhMLCAtMSksICJjcGF0aCIsIExVQV9DU1VCU0VQKTsKKyAgaWYgKGZpbGVuYW1lID09IE5VTEwpIHJldHVybiAxOyAgLyogcm9vdCBub3QgZm91bmQgKi8KKyAgaWYgKChzdGF0ID0gbG9hZGZ1bmMoTCwgZmlsZW5hbWUsIG5hbWUpKSAhPSAwKSB7CisgICAgaWYgKHN0YXQgIT0gRVJSRlVOQykKKyAgICAgIHJldHVybiBjaGVja2xvYWQoTCwgMCwgZmlsZW5hbWUpOyAgLyogcmVhbCBlcnJvciAqLworICAgIGVsc2UgeyAgLyogb3BlbiBmdW5jdGlvbiBub3QgZm91bmQgKi8KKyAgICAgIGx1YV9wdXNoZnN0cmluZyhMLCAiXG5cdG5vIG1vZHVsZSAiIExVQV9RUyAiIGluIGZpbGUgIiBMVUFfUVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZmlsZW5hbWUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGx1YV9wdXNoc3RyaW5nKEwsIGZpbGVuYW1lKTsgIC8qIHdpbGwgYmUgMm5kIGFyZ3VtZW50IHRvIG1vZHVsZSAqLworICByZXR1cm4gMjsKK30KKworCitzdGF0aWMgaW50IHNlYXJjaGVyX3ByZWxvYWQgKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpuYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCAiX1BSRUxPQUQiKTsKKyAgbHVhX2dldGZpZWxkKEwsIC0xLCBuYW1lKTsKKyAgaWYgKGx1YV9pc25pbChMLCAtMSkpICAvKiBub3QgZm91bmQ/ICovCisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJcblx0bm8gZmllbGQgcGFja2FnZS5wcmVsb2FkWyclcyddIiwgbmFtZSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIGZpbmRsb2FkZXIgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbmFtZSkgeworICBpbnQgaTsKKyAgbHVhTF9CdWZmZXIgbXNnOyAgLyogdG8gYnVpbGQgZXJyb3IgbWVzc2FnZSAqLworICBsdWFMX2J1ZmZpbml0KEwsICZtc2cpOworICBsdWFfZ2V0ZmllbGQoTCwgbHVhX3VwdmFsdWVpbmRleCgxKSwgInNlYXJjaGVycyIpOyAgLyogd2lsbCBiZSBhdCBpbmRleCAzICovCisgIGlmICghbHVhX2lzdGFibGUoTCwgMykpCisgICAgbHVhTF9lcnJvcihMLCBMVUFfUUwoInBhY2thZ2Uuc2VhcmNoZXJzIikgIiBtdXN0IGJlIGEgdGFibGUiKTsKKyAgLyogIGl0ZXJhdGUgb3ZlciBhdmFpbGFibGUgc2VhcmNoZXJzIHRvIGZpbmQgYSBsb2FkZXIgKi8KKyAgZm9yIChpID0gMTsgOyBpKyspIHsKKyAgICBsdWFfcmF3Z2V0aShMLCAzLCBpKTsgIC8qIGdldCBhIHNlYXJjaGVyICovCisgICAgaWYgKGx1YV9pc25pbChMLCAtMSkpIHsgIC8qIG5vIG1vcmUgc2VhcmNoZXJzPyAqLworICAgICAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSBuaWwgKi8KKyAgICAgIGx1YUxfcHVzaHJlc3VsdCgmbXNnKTsgIC8qIGNyZWF0ZSBlcnJvciBtZXNzYWdlICovCisgICAgICBsdWFMX2Vycm9yKEwsICJtb2R1bGUgIiBMVUFfUVMgIiBub3QgZm91bmQ6JXMiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBsdWFfdG9zdHJpbmcoTCwgLTEpKTsKKyAgICB9CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgbmFtZSk7CisgICAgbHVhX2NhbGwoTCwgMSwgMik7ICAvKiBjYWxsIGl0ICovCisgICAgaWYgKGx1YV9pc2Z1bmN0aW9uKEwsIC0yKSkgIC8qIGRpZCBpdCBmaW5kIGEgbG9hZGVyPyAqLworICAgICAgcmV0dXJuOyAgLyogbW9kdWxlIGxvYWRlciBmb3VuZCAqLworICAgIGVsc2UgaWYgKGx1YV9pc3N0cmluZyhMLCAtMikpIHsgIC8qIHNlYXJjaGVyIHJldHVybmVkIGVycm9yIG1lc3NhZ2U/ICovCisgICAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIGV4dHJhIHJldHVybiAqLworICAgICAgbHVhTF9hZGR2YWx1ZSgmbXNnKTsgIC8qIGNvbmNhdGVuYXRlIGVycm9yIG1lc3NhZ2UgKi8KKyAgICB9CisgICAgZWxzZQorICAgICAgbHVhX3BvcChMLCAyKTsgIC8qIHJlbW92ZSBib3RoIHJldHVybnMgKi8KKyAgfQorfQorCisKK3N0YXRpYyBpbnQgbGxfcmVxdWlyZSAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICBsdWFfc2V0dG9wKEwsIDEpOyAgLyogX0xPQURFRCB0YWJsZSB3aWxsIGJlIGF0IGluZGV4IDIgKi8KKyAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCAiX0xPQURFRCIpOworICBsdWFfZ2V0ZmllbGQoTCwgMiwgbmFtZSk7ICAvKiBfTE9BREVEW25hbWVdICovCisgIGlmIChsdWFfdG9ib29sZWFuKEwsIC0xKSkgIC8qIGlzIGl0IHRoZXJlPyAqLworICAgIHJldHVybiAxOyAgLyogcGFja2FnZSBpcyBhbHJlYWR5IGxvYWRlZCAqLworICAvKiBlbHNlIG11c3QgbG9hZCBwYWNrYWdlICovCisgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgJ2dldGZpZWxkJyByZXN1bHQgKi8KKyAgZmluZGxvYWRlcihMLCBuYW1lKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgbmFtZSk7ICAvKiBwYXNzIG5hbWUgYXMgYXJndW1lbnQgdG8gbW9kdWxlIGxvYWRlciAqLworICBsdWFfaW5zZXJ0KEwsIC0yKTsgIC8qIG5hbWUgaXMgMXN0IGFyZ3VtZW50IChiZWZvcmUgc2VhcmNoIGRhdGEpICovCisgIGx1YV9jYWxsKEwsIDIsIDEpOyAgLyogcnVuIGxvYWRlciB0byBsb2FkIG1vZHVsZSAqLworICBpZiAoIWx1YV9pc25pbChMLCAtMSkpICAvKiBub24tbmlsIHJldHVybj8gKi8KKyAgICBsdWFfc2V0ZmllbGQoTCwgMiwgbmFtZSk7ICAvKiBfTE9BREVEW25hbWVdID0gcmV0dXJuZWQgdmFsdWUgKi8KKyAgbHVhX2dldGZpZWxkKEwsIDIsIG5hbWUpOworICBpZiAobHVhX2lzbmlsKEwsIC0xKSkgeyAgIC8qIG1vZHVsZSBkaWQgbm90IHNldCBhIHZhbHVlPyAqLworICAgIGx1YV9wdXNoYm9vbGVhbihMLCAxKTsgIC8qIHVzZSB0cnVlIGFzIHJlc3VsdCAqLworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOyAgLyogZXh0cmEgY29weSB0byBiZSByZXR1cm5lZCAqLworICAgIGx1YV9zZXRmaWVsZChMLCAyLCBuYW1lKTsgIC8qIF9MT0FERURbbmFtZV0gPSB0cnVlICovCisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiAnbW9kdWxlJyBmdW5jdGlvbgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZiBkZWZpbmVkKExVQV9DT01QQVRfTU9EVUxFKQorCisvKgorKiogY2hhbmdlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgb2YgY2FsbGluZyBmdW5jdGlvbgorKi8KK3N0YXRpYyB2b2lkIHNldF9lbnYgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfRGVidWcgYXI7CisgIGlmIChsdWFfZ2V0c3RhY2soTCwgMSwgJmFyKSA9PSAwIHx8CisgICAgICBsdWFfZ2V0aW5mbyhMLCAiZiIsICZhcikgPT0gMCB8fCAgLyogZ2V0IGNhbGxpbmcgZnVuY3Rpb24gKi8KKyAgICAgIGx1YV9pc2NmdW5jdGlvbihMLCAtMSkpCisgICAgbHVhTF9lcnJvcihMLCBMVUFfUUwoIm1vZHVsZSIpICIgbm90IGNhbGxlZCBmcm9tIGEgTHVhIGZ1bmN0aW9uIik7CisgIGx1YV9wdXNodmFsdWUoTCwgLTIpOyAgLyogY29weSBuZXcgZW52aXJvbm1lbnQgdGFibGUgdG8gdG9wICovCisgIGx1YV9zZXR1cHZhbHVlKEwsIC0yLCAxKTsKKyAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSBmdW5jdGlvbiAqLworfQorCisKK3N0YXRpYyB2b2lkIGRvb3B0aW9ucyAobHVhX1N0YXRlICpMLCBpbnQgbikgeworICBpbnQgaTsKKyAgZm9yIChpID0gMjsgaSA8PSBuOyBpKyspIHsKKyAgICBpZiAobHVhX2lzZnVuY3Rpb24oTCwgaSkpIHsgIC8qIGF2b2lkICdjYWxsaW5nJyBleHRyYSBpbmZvLiAqLworICAgICAgbHVhX3B1c2h2YWx1ZShMLCBpKTsgIC8qIGdldCBvcHRpb24gKGEgZnVuY3Rpb24pICovCisgICAgICBsdWFfcHVzaHZhbHVlKEwsIC0yKTsgIC8qIG1vZHVsZSAqLworICAgICAgbHVhX2NhbGwoTCwgMSwgMCk7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgbW9kaW5pdCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICptb2RuYW1lKSB7CisgIGNvbnN0IGNoYXIgKmRvdDsKKyAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgIl9NIik7ICAvKiBtb2R1bGUuX00gPSBtb2R1bGUgKi8KKyAgbHVhX3B1c2hzdHJpbmcoTCwgbW9kbmFtZSk7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgIl9OQU1FIik7CisgIGRvdCA9IHN0cnJjaHIobW9kbmFtZSwgJy4nKTsgIC8qIGxvb2sgZm9yIGxhc3QgZG90IGluIG1vZHVsZSBuYW1lICovCisgIGlmIChkb3QgPT0gTlVMTCkgZG90ID0gbW9kbmFtZTsKKyAgZWxzZSBkb3QrKzsKKyAgLyogc2V0IF9QQUNLQUdFIGFzIHBhY2thZ2UgbmFtZSAoZnVsbCBtb2R1bGUgbmFtZSBtaW51cyBsYXN0IHBhcnQpICovCisgIGx1YV9wdXNobHN0cmluZyhMLCBtb2RuYW1lLCBkb3QgLSBtb2RuYW1lKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAiX1BBQ0tBR0UiKTsKK30KKworCitzdGF0aWMgaW50IGxsX21vZHVsZSAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKm1vZG5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICBpbnQgbGFzdGFyZyA9IGx1YV9nZXR0b3AoTCk7ICAvKiBsYXN0IHBhcmFtZXRlciAqLworICBsdWFMX3B1c2htb2R1bGUoTCwgbW9kbmFtZSwgMSk7ICAvKiBnZXQvY3JlYXRlIG1vZHVsZSB0YWJsZSAqLworICAvKiBjaGVjayB3aGV0aGVyIHRhYmxlIGFscmVhZHkgaGFzIGEgX05BTUUgZmllbGQgKi8KKyAgbHVhX2dldGZpZWxkKEwsIC0xLCAiX05BTUUiKTsKKyAgaWYgKCFsdWFfaXNuaWwoTCwgLTEpKSAgLyogaXMgdGFibGUgYW4gaW5pdGlhbGl6ZWQgbW9kdWxlPyAqLworICAgIGx1YV9wb3AoTCwgMSk7CisgIGVsc2UgeyAgLyogbm87IGluaXRpYWxpemUgaXQgKi8KKyAgICBsdWFfcG9wKEwsIDEpOworICAgIG1vZGluaXQoTCwgbW9kbmFtZSk7CisgIH0KKyAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7CisgIHNldF9lbnYoTCk7CisgIGRvb3B0aW9ucyhMLCBsYXN0YXJnKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsbF9zZWVhbGwgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgaWYgKCFsdWFfZ2V0bWV0YXRhYmxlKEwsIDEpKSB7CisgICAgbHVhX2NyZWF0ZXRhYmxlKEwsIDAsIDEpOyAvKiBjcmVhdGUgbmV3IG1ldGF0YWJsZSAqLworICAgIGx1YV9wdXNodmFsdWUoTCwgLTEpOworICAgIGx1YV9zZXRtZXRhdGFibGUoTCwgMSk7CisgIH0KKyAgbHVhX3B1c2hnbG9iYWx0YWJsZShMKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCAiX19pbmRleCIpOyAgLyogbXQuX19pbmRleCA9IF9HICovCisgIHJldHVybiAwOworfQorCisjZW5kaWYKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisKKy8qIGF1eGlsaWFyeSBtYXJrIChmb3IgaW50ZXJuYWwgdXNlKSAqLworI2RlZmluZSBBVVhNQVJLCQkiXDEiCisKKworI2lmZGVmIFNZU0xJTlVYCitzdGF0aWMgdm9pZCBzZXRwYXRoIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgY29uc3QgY2hhciAqZW52bmFtZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudm5hbWUyLCBjb25zdCBjaGFyICpkZWYpIHsKKyAgc3RydWN0IHBhdGhfZW50cnkgKmVudHJ5OworICBsdWFMX0J1ZmZlciBiOworICBsdWFMX2J1ZmZpbml0IChMLCAmYik7CisgICh2b2lkKWVudm5hbWUxOworICAodm9pZCllbnZuYW1lMjsKKyAgbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJlBBVEgsIGxpc3QpIHsKKyAgICBjb25zdCBjaGFyICplID0gZW50cnktPnN0cjsKKyAgICBpbnQgbmVlZF9zbGFzaCA9IGVbc3RybGVuKGUpLTFdICE9ICcvJzsKKyAgICB2b2lkIGFkZCAoY29uc3QgY2hhciAqc3RlbSkgeworICAgICAgbHVhTF9hZGRzdHJpbmcgKCZiLCBlKTsKKyAgICAgIGlmIChuZWVkX3NsYXNoKSBsdWFMX2FkZGNoYXIgKCZiLCAnLycpOworICAgICAgbHVhTF9hZGRzdHJpbmcgKCZiLCBzdGVtKTsKKyAgICAgIGx1YUxfYWRkc3RyaW5nICgmYiwgZGVmKTsKKyAgICAgIGx1YUxfYWRkY2hhciAoJmIsICc7Jyk7CisgICAgfQorICAgIGFkZCAoIj8iKTsKKyAgICBhZGQgKCI/L2luaXQiKTsKKyAgfQorICBsdWFMX2FkZHN0cmluZyAoJmIsICIuLz8iKTsKKyAgbHVhTF9hZGRzdHJpbmcgKCZiLCBkZWYpOworICBsdWFMX3B1c2hyZXN1bHQgKCZiKTsKKyAgbHVhX3NldGZpZWxkKEwsIC0yLCBmaWVsZG5hbWUpOworfQorI2Vsc2UKKy8qCisqKiByZXR1cm4gcmVnaXN0cnkuTFVBX05PRU5WIGFzIGEgYm9vbGVhbgorKi8KK3N0YXRpYyBpbnQgbm9lbnYgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYjsKKyAgbHVhX2dldGZpZWxkKEwsIExVQV9SRUdJU1RSWUlOREVYLCAiTFVBX05PRU5WIik7CisgIGIgPSBsdWFfdG9ib29sZWFuKEwsIC0xKTsKKyAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSB2YWx1ZSAqLworICByZXR1cm4gYjsKK30KKworCitzdGF0aWMgdm9pZCBzZXRwYXRoIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgY29uc3QgY2hhciAqZW52bmFtZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudm5hbWUyLCBjb25zdCBjaGFyICpkZWYpIHsKKyAgY29uc3QgY2hhciAqcGF0aCA9IGdldGVudihlbnZuYW1lMSk7CisgIGlmIChwYXRoID09IE5VTEwpICAvKiBubyBlbnZpcm9ubWVudCB2YXJpYWJsZT8gKi8KKyAgICBwYXRoID0gZ2V0ZW52KGVudm5hbWUyKTsgIC8qIHRyeSBhbHRlcm5hdGl2ZSBuYW1lICovCisgIGlmIChwYXRoID09IE5VTEwgfHwgbm9lbnYoTCkpICAvKiBubyBlbnZpcm9ubWVudCB2YXJpYWJsZT8gKi8KKyAgICBsdWFfcHVzaHN0cmluZyhMLCBkZWYpOyAgLyogdXNlIGRlZmF1bHQgKi8KKyAgZWxzZSB7CisgICAgLyogcmVwbGFjZSAiOzsiIGJ5ICI7QVVYTUFSSzsiIGFuZCB0aGVuIEFVWE1BUksgYnkgZGVmYXVsdCBwYXRoICovCisgICAgcGF0aCA9IGx1YUxfZ3N1YihMLCBwYXRoLCBMVUFfUEFUSF9TRVAgTFVBX1BBVEhfU0VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFVBX1BBVEhfU0VQIEFVWE1BUksgTFVBX1BBVEhfU0VQKTsKKyAgICBsdWFMX2dzdWIoTCwgcGF0aCwgQVVYTUFSSywgZGVmKTsKKyAgICBsdWFfcmVtb3ZlKEwsIC0yKTsKKyAgfQorICBzZXRwcm9nZGlyKEwpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsIGZpZWxkbmFtZSk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgcGtfZnVuY3NbXSA9IHsKKyAgeyJsb2FkbGliIiwgbGxfbG9hZGxpYn0sCisgIHsic2VhcmNocGF0aCIsIGxsX3NlYXJjaHBhdGh9LAorI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9NT0RVTEUpCisgIHsic2VlYWxsIiwgbGxfc2VlYWxsfSwKKyNlbmRpZgorICB7TlVMTCwgTlVMTH0KK307CisKKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIGxsX2Z1bmNzW10gPSB7CisjaWYgZGVmaW5lZChMVUFfQ09NUEFUX01PRFVMRSkKKyAgeyJtb2R1bGUiLCBsbF9tb2R1bGV9LAorI2VuZGlmCisgIHsicmVxdWlyZSIsIGxsX3JlcXVpcmV9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworc3RhdGljIHZvaWQgY3JlYXRlc2VhcmNoZXJzdGFibGUgKGx1YV9TdGF0ZSAqTCkgeworICBzdGF0aWMgY29uc3QgbHVhX0NGdW5jdGlvbiBzZWFyY2hlcnNbXSA9CisgICAge3NlYXJjaGVyX3ByZWxvYWQsIHNlYXJjaGVyX0x1YSwgc2VhcmNoZXJfQywgc2VhcmNoZXJfQ3Jvb3QsIE5VTEx9OworICBpbnQgaTsKKyAgLyogY3JlYXRlICdzZWFyY2hlcnMnIHRhYmxlICovCisgIGx1YV9jcmVhdGV0YWJsZShMLCBzaXplb2Yoc2VhcmNoZXJzKS9zaXplb2Yoc2VhcmNoZXJzWzBdKSAtIDEsIDApOworICAvKiBmaWxsIGl0IHdpdGggcHJlLWRlZmluZWQgc2VhcmNoZXJzICovCisgIGZvciAoaT0wOyBzZWFyY2hlcnNbaV0gIT0gTlVMTDsgaSsrKSB7CisgICAgbHVhX3B1c2h2YWx1ZShMLCAtMik7ICAvKiBzZXQgJ3BhY2thZ2UnIGFzIHVwdmFsdWUgZm9yIGFsbCBzZWFyY2hlcnMgKi8KKyAgICBsdWFfcHVzaGNjbG9zdXJlKEwsIHNlYXJjaGVyc1tpXSwgMSk7CisgICAgbHVhX3Jhd3NldGkoTCwgLTIsIGkrMSk7CisgIH0KK30KKworCitMVUFNT0RfQVBJIGludCBsdWFvcGVuX3BhY2thZ2UgKGx1YV9TdGF0ZSAqTCkgeworICAvKiBjcmVhdGUgdGFibGUgQ0xJQlMgdG8ga2VlcCB0cmFjayBvZiBsb2FkZWQgQyBsaWJyYXJpZXMgKi8KKyAgbHVhTF9nZXRzdWJ0YWJsZShMLCBMVUFfUkVHSVNUUllJTkRFWCwgQ0xJQlMpOworICBsdWFfY3JlYXRldGFibGUoTCwgMCwgMSk7ICAvKiBtZXRhdGFibGUgZm9yIENMSUJTICovCisgIGx1YV9wdXNoY2Z1bmN0aW9uKEwsIGdjdG0pOworICBsdWFfc2V0ZmllbGQoTCwgLTIsICJfX2djIik7ICAvKiBzZXQgZmluYWxpemVyIGZvciBDTElCUyB0YWJsZSAqLworICBsdWFfc2V0bWV0YXRhYmxlKEwsIC0yKTsKKyAgLyogY3JlYXRlIGBwYWNrYWdlJyB0YWJsZSAqLworICBsdWFMX25ld2xpYihMLCBwa19mdW5jcyk7CisgIGNyZWF0ZXNlYXJjaGVyc3RhYmxlKEwpOworI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9MT0FERVJTKQorICBsdWFfcHVzaHZhbHVlKEwsIC0xKTsgIC8qIG1ha2UgYSBjb3B5IG9mICdzZWFyY2hlcnMnIHRhYmxlICovCisgIGx1YV9zZXRmaWVsZChMLCAtMywgImxvYWRlcnMiKTsgIC8qIHB1dCBpdCBpbiBmaWVsZCBgbG9hZGVycycgKi8KKyNlbmRpZgorICBsdWFfc2V0ZmllbGQoTCwgLTIsICJzZWFyY2hlcnMiKTsgIC8qIHB1dCBpdCBpbiBmaWVsZCAnc2VhcmNoZXJzJyAqLworICAvKiBzZXQgZmllbGQgJ3BhdGgnICovCisgIHNldHBhdGgoTCwgInBhdGgiLCBMVUFfUEFUSFZFUlNJT04sIExVQV9QQVRILCBMVUFfUEFUSF9ERUZBVUxUKTsKKyAgLyogc2V0IGZpZWxkICdjcGF0aCcgKi8KKyAgc2V0cGF0aChMLCAiY3BhdGgiLCBMVUFfQ1BBVEhWRVJTSU9OLCBMVUFfQ1BBVEgsIExVQV9DUEFUSF9ERUZBVUxUKTsKKyAgLyogc3RvcmUgY29uZmlnIGluZm9ybWF0aW9uICovCisgIGx1YV9wdXNobGl0ZXJhbChMLCBMVUFfRElSU0VQICJcbiIgTFVBX1BBVEhfU0VQICJcbiIgTFVBX1BBVEhfTUFSSyAiXG4iCisgICAgICAgICAgICAgICAgICAgICBMVUFfRVhFQ19ESVIgIlxuIiBMVUFfSUdNQVJLICJcbiIpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsICJjb25maWciKTsKKyAgLyogc2V0IGZpZWxkIGBsb2FkZWQnICovCisgIGx1YUxfZ2V0c3VidGFibGUoTCwgTFVBX1JFR0lTVFJZSU5ERVgsICJfTE9BREVEIik7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgImxvYWRlZCIpOworICAvKiBzZXQgZmllbGQgYHByZWxvYWQnICovCisgIGx1YUxfZ2V0c3VidGFibGUoTCwgTFVBX1JFR0lTVFJZSU5ERVgsICJfUFJFTE9BRCIpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsICJwcmVsb2FkIik7CisgIGx1YV9wdXNoZ2xvYmFsdGFibGUoTCk7CisgIGx1YV9wdXNodmFsdWUoTCwgLTIpOyAgLyogc2V0ICdwYWNrYWdlJyBhcyB1cHZhbHVlIGZvciBuZXh0IGxpYiAqLworICBsdWFMX3NldGZ1bmNzKEwsIGxsX2Z1bmNzLCAxKTsgIC8qIG9wZW4gbGliIGludG8gZ2xvYmFsIHRhYmxlICovCisgIGx1YV9wb3AoTCwgMSk7ICAvKiBwb3AgZ2xvYmFsIHRhYmxlICovCisgIHJldHVybiAxOyAgLyogcmV0dXJuICdwYWNrYWdlJyB0YWJsZSAqLworfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xvYmplY3QuYyBiL2NvbTMyL2x1YS9zcmMvbG9iamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmQ5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xvYmplY3QuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyoqICRJZDogbG9iamVjdC5jLHYgMi41OC4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBTb21lIGdlbmVyaWMgZnVuY3Rpb25zIG92ZXIgTHVhIG9iamVjdHMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsb2JqZWN0X2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGN0eXBlLmgiCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibG1lbS5oIgorI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisjaW5jbHVkZSAibHZtLmgiCisKKworCitMVUFJX0RERUYgY29uc3QgVFZhbHVlIGx1YU9fbmlsb2JqZWN0XyA9IHtOSUxDT05TVEFOVH07CisKKworLyoKKyoqIGNvbnZlcnRzIGFuIGludGVnZXIgdG8gYSAiZmxvYXRpbmcgcG9pbnQgYnl0ZSIsIHJlcHJlc2VudGVkIGFzCisqKiAoZWVlZWV4eHgpLCB3aGVyZSB0aGUgcmVhbCB2YWx1ZSBpcyAoMXh4eCkgKiAyXihlZWVlZSAtIDEpIGlmCisqKiBlZWVlZSAhPSAwIGFuZCAoeHh4KSBvdGhlcndpc2UuCisqLworaW50IGx1YU9faW50MmZiICh1bnNpZ25lZCBpbnQgeCkgeworICBpbnQgZSA9IDA7ICAvKiBleHBvbmVudCAqLworICBpZiAoeCA8IDgpIHJldHVybiB4OworICB3aGlsZSAoeCA+PSAweDEwKSB7CisgICAgeCA9ICh4KzEpID4+IDE7CisgICAgZSsrOworICB9CisgIHJldHVybiAoKGUrMSkgPDwgMykgfCAoY2FzdF9pbnQoeCkgLSA4KTsKK30KKworCisvKiBjb252ZXJ0cyBiYWNrICovCitpbnQgbHVhT19mYjJpbnQgKGludCB4KSB7CisgIGludCBlID0gKHggPj4gMykgJiAweDFmOworICBpZiAoZSA9PSAwKSByZXR1cm4geDsKKyAgZWxzZSByZXR1cm4gKCh4ICYgNykgKyA4KSA8PCAoZSAtIDEpOworfQorCisKK2ludCBsdWFPX2NlaWxsb2cyICh1bnNpZ25lZCBpbnQgeCkgeworICBzdGF0aWMgY29uc3QgbHVfYnl0ZSBsb2dfMlsyNTZdID0geworICAgIDAsMSwyLDIsMywzLDMsMyw0LDQsNCw0LDQsNCw0LDQsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSwKKyAgICA2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCisgICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorICAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKyAgICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsCisgICAgOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LAorICAgIDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKyAgICA4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgKKyAgfTsKKyAgaW50IGwgPSAwOworICB4LS07CisgIHdoaWxlICh4ID49IDI1NikgeyBsICs9IDg7IHggPj49IDg7IH0KKyAgcmV0dXJuIGwgKyBsb2dfMlt4XTsKK30KKworCitsdWFfTnVtYmVyIGx1YU9fYXJpdGggKGludCBvcCwgbHVhX051bWJlciB2MSwgbHVhX051bWJlciB2MikgeworICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBMVUFfT1BBREQ6IHJldHVybiBsdWFpX251bWFkZChOVUxMLCB2MSwgdjIpOworICAgIGNhc2UgTFVBX09QU1VCOiByZXR1cm4gbHVhaV9udW1zdWIoTlVMTCwgdjEsIHYyKTsKKyAgICBjYXNlIExVQV9PUE1VTDogcmV0dXJuIGx1YWlfbnVtbXVsKE5VTEwsIHYxLCB2Mik7CisgICAgY2FzZSBMVUFfT1BESVY6IHJldHVybiBsdWFpX251bWRpdihOVUxMLCB2MSwgdjIpOworICAgIGNhc2UgTFVBX09QTU9EOiByZXR1cm4gbHVhaV9udW1tb2QoTlVMTCwgdjEsIHYyKTsKKyAgICBjYXNlIExVQV9PUFBPVzogcmV0dXJuIGx1YWlfbnVtcG93KE5VTEwsIHYxLCB2Mik7CisgICAgY2FzZSBMVUFfT1BVTk06IHJldHVybiBsdWFpX251bXVubShOVUxMLCB2MSk7CisgICAgZGVmYXVsdDogbHVhX2Fzc2VydCgwKTsgcmV0dXJuIDA7CisgIH0KK30KKworCitpbnQgbHVhT19oZXhhdmFsdWUgKGludCBjKSB7CisgIGlmIChsaXNkaWdpdChjKSkgcmV0dXJuIGMgLSAnMCc7CisgIGVsc2UgcmV0dXJuIGx0b2xvd2VyKGMpIC0gJ2EnICsgMTA7Cit9CisKKworI2lmICFkZWZpbmVkKGx1YV9zdHJ4Mm51bWJlcikKKworI2luY2x1ZGUgPG1hdGguaD4KKworCitzdGF0aWMgaW50IGlzbmVnIChjb25zdCBjaGFyICoqcykgeworICBpZiAoKipzID09ICctJykgeyAoKnMpKys7IHJldHVybiAxOyB9CisgIGVsc2UgaWYgKCoqcyA9PSAnKycpICgqcykrKzsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGx1YV9OdW1iZXIgcmVhZGhleGEgKGNvbnN0IGNoYXIgKipzLCBsdWFfTnVtYmVyIHIsIGludCAqY291bnQpIHsKKyAgZm9yICg7IGxpc3hkaWdpdChjYXN0X3VjaGFyKCoqcykpOyAoKnMpKyspIHsgIC8qIHJlYWQgaW50ZWdlciBwYXJ0ICovCisgICAgciA9IChyICogY2FzdF9udW0oMTYuMCkpICsgY2FzdF9udW0obHVhT19oZXhhdmFsdWUoY2FzdF91Y2hhcigqKnMpKSk7CisgICAgKCpjb3VudCkrKzsKKyAgfQorICByZXR1cm4gcjsKK30KKworCisvKgorKiogY29udmVydCBhbiBoZXhhZGVjaW1hbCBudW1lcmljIHN0cmluZyB0byBhIG51bWJlciwgZm9sbG93aW5nCisqKiBDOTkgc3BlY2lmaWNhdGlvbiBmb3IgJ3N0cnRvZCcKKyovCitzdGF0aWMgbHVhX051bWJlciBsdWFfc3RyeDJudW1iZXIgKGNvbnN0IGNoYXIgKnMsIGNoYXIgKiplbmRwdHIpIHsKKyAgbHVhX051bWJlciByID0gMC4wOworICBpbnQgZSA9IDAsIGkgPSAwOworICBpbnQgbmVnID0gMDsgIC8qIDEgaWYgbnVtYmVyIGlzIG5lZ2F0aXZlICovCisgICplbmRwdHIgPSBjYXN0KGNoYXIgKiwgcyk7ICAvKiBub3RoaW5nIGlzIHZhbGlkIHlldCAqLworICB3aGlsZSAobGlzc3BhY2UoY2FzdF91Y2hhcigqcykpKSBzKys7ICAvKiBza2lwIGluaXRpYWwgc3BhY2VzICovCisgIG5lZyA9IGlzbmVnKCZzKTsgIC8qIGNoZWNrIHNpZ25hbCAqLworICBpZiAoISgqcyA9PSAnMCcgJiYgKCoocyArIDEpID09ICd4JyB8fCAqKHMgKyAxKSA9PSAnWCcpKSkgIC8qIGNoZWNrICcweCcgKi8KKyAgICByZXR1cm4gMC4wOyAgLyogaW52YWxpZCBmb3JtYXQgKG5vICcweCcpICovCisgIHMgKz0gMjsgIC8qIHNraXAgJzB4JyAqLworICByID0gcmVhZGhleGEoJnMsIHIsICZpKTsgIC8qIHJlYWQgaW50ZWdlciBwYXJ0ICovCisgIGlmICgqcyA9PSAnLicpIHsKKyAgICBzKys7ICAvKiBza2lwIGRvdCAqLworICAgIHIgPSByZWFkaGV4YSgmcywgciwgJmUpOyAgLyogcmVhZCBmcmFjdGlvbmFsIHBhcnQgKi8KKyAgfQorICBpZiAoaSA9PSAwICYmIGUgPT0gMCkKKyAgICByZXR1cm4gMC4wOyAgLyogaW52YWxpZCBmb3JtYXQgKG5vIGRpZ2l0KSAqLworICBlICo9IC00OyAgLyogZWFjaCBmcmFjdGlvbmFsIGRpZ2l0IGRpdmlkZXMgdmFsdWUgYnkgMl4tNCAqLworICAqZW5kcHRyID0gY2FzdChjaGFyICosIHMpOyAgLyogdmFsaWQgdXAgdG8gaGVyZSAqLworICBpZiAoKnMgPT0gJ3AnIHx8ICpzID09ICdQJykgeyAgLyogZXhwb25lbnQgcGFydD8gKi8KKyAgICBpbnQgZXhwMSA9IDA7CisgICAgaW50IG5lZzE7CisgICAgcysrOyAgLyogc2tpcCAncCcgKi8KKyAgICBuZWcxID0gaXNuZWcoJnMpOyAgLyogc2lnbmFsICovCisgICAgaWYgKCFsaXNkaWdpdChjYXN0X3VjaGFyKCpzKSkpCisgICAgICBnb3RvIHJldDsgIC8qIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZGlnaXQgKi8KKyAgICB3aGlsZSAobGlzZGlnaXQoY2FzdF91Y2hhcigqcykpKSAgLyogcmVhZCBleHBvbmVudCAqLworICAgICAgZXhwMSA9IGV4cDEgKiAxMCArICoocysrKSAtICcwJzsKKyAgICBpZiAobmVnMSkgZXhwMSA9IC1leHAxOworICAgIGUgKz0gZXhwMTsKKyAgfQorICAqZW5kcHRyID0gY2FzdChjaGFyICosIHMpOyAgLyogdmFsaWQgdXAgdG8gaGVyZSAqLworIHJldDoKKyAgaWYgKG5lZykgciA9IC1yOworICByZXR1cm4gbF9tYXRob3AobGRleHApKHIsIGUpOworfQorCisjZW5kaWYKKworCitpbnQgbHVhT19zdHIyZCAoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgbHVhX051bWJlciAqcmVzdWx0KSB7CisgIGNoYXIgKmVuZHB0cjsKKyAgaWYgKHN0cnBicmsocywgIm5OIikpICAvKiByZWplY3QgJ2luZicgYW5kICduYW4nICovCisgICAgcmV0dXJuIDA7CisgIGVsc2UgaWYgKHN0cnBicmsocywgInhYIikpICAvKiBoZXhhPyAqLworICAgICpyZXN1bHQgPSBsdWFfc3RyeDJudW1iZXIocywgJmVuZHB0cik7CisgIGVsc2UKKyAgICAqcmVzdWx0ID0gbHVhX3N0cjJudW1iZXIocywgJmVuZHB0cik7CisgIGlmIChlbmRwdHIgPT0gcykgcmV0dXJuIDA7ICAvKiBub3RoaW5nIHJlY29nbml6ZWQgKi8KKyAgd2hpbGUgKGxpc3NwYWNlKGNhc3RfdWNoYXIoKmVuZHB0cikpKSBlbmRwdHIrKzsKKyAgcmV0dXJuIChlbmRwdHIgPT0gcyArIGxlbik7ICAvKiBPSyBpZiBubyB0cmFpbGluZyBjaGFyYWN0ZXJzICovCit9CisKKworCitzdGF0aWMgdm9pZCBwdXNoc3RyIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGwpIHsKKyAgc2V0c3ZhbHVlMnMoTCwgTC0+dG9wKyssIGx1YVNfbmV3bHN0cihMLCBzdHIsIGwpKTsKK30KKworCisvKiB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgb25seSBgJWQnLCBgJWMnLCAlZiwgJXAsIGFuZCBgJXMnIGZvcm1hdHMgKi8KK2NvbnN0IGNoYXIgKmx1YU9fcHVzaHZmc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdwKSB7CisgIGludCBuID0gMDsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIgKmUgPSBzdHJjaHIoZm10LCAnJScpOworICAgIGlmIChlID09IE5VTEwpIGJyZWFrOworICAgIGx1YURfY2hlY2tzdGFjayhMLCAyKTsgIC8qIGZtdCArIGl0ZW0gKi8KKyAgICBwdXNoc3RyKEwsIGZtdCwgZSAtIGZtdCk7CisgICAgc3dpdGNoICgqKGUrMSkpIHsKKyAgICAgIGNhc2UgJ3MnOiB7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkgcyA9ICIobnVsbCkiOworICAgICAgICBwdXNoc3RyKEwsIHMsIHN0cmxlbihzKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnYyc6IHsKKyAgICAgICAgY2hhciBidWZmOworICAgICAgICBidWZmID0gY2FzdChjaGFyLCB2YV9hcmcoYXJncCwgaW50KSk7CisgICAgICAgIHB1c2hzdHIoTCwgJmJ1ZmYsIDEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ2QnOiB7CisgICAgICAgIHNldG52YWx1ZShMLT50b3ArKywgY2FzdF9udW0odmFfYXJnKGFyZ3AsIGludCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdmJzogeworICAgICAgICBzZXRudmFsdWUoTC0+dG9wKyssIGNhc3RfbnVtKHZhX2FyZyhhcmdwLCBsX3VhY051bWJlcikpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdwJzogeworICAgICAgICBjaGFyIGJ1ZmZbNCpzaXplb2Yodm9pZCAqKSArIDhdOyAvKiBzaG91bGQgYmUgZW5vdWdoIHNwYWNlIGZvciBhIGAlcCcgKi8KKyAgICAgICAgaW50IGwgPSBzcHJpbnRmKGJ1ZmYsICIlcCIsIHZhX2FyZyhhcmdwLCB2b2lkICopKTsKKyAgICAgICAgcHVzaHN0cihMLCBidWZmLCBsKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICclJzogeworICAgICAgICBwdXNoc3RyKEwsICIlIiwgMSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDogeworICAgICAgICBsdWFHX3J1bmVycm9yKEwsCisgICAgICAgICAgICAiaW52YWxpZCBvcHRpb24gIiBMVUFfUUwoIiUlJWMiKSAiIHRvICIgTFVBX1FMKCJsdWFfcHVzaGZzdHJpbmciKSwKKyAgICAgICAgICAgICooZSArIDEpKTsKKyAgICAgIH0KKyAgICB9CisgICAgbiArPSAyOworICAgIGZtdCA9IGUrMjsKKyAgfQorICBsdWFEX2NoZWNrc3RhY2soTCwgMSk7CisgIHB1c2hzdHIoTCwgZm10LCBzdHJsZW4oZm10KSk7CisgIGlmIChuID4gMCkgbHVhVl9jb25jYXQoTCwgbiArIDEpOworICByZXR1cm4gc3ZhbHVlKEwtPnRvcCAtIDEpOworfQorCisKK2NvbnN0IGNoYXIgKmx1YU9fcHVzaGZzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZm10LCAuLi4pIHsKKyAgY29uc3QgY2hhciAqbXNnOworICB2YV9saXN0IGFyZ3A7CisgIHZhX3N0YXJ0KGFyZ3AsIGZtdCk7CisgIG1zZyA9IGx1YU9fcHVzaHZmc3RyaW5nKEwsIGZtdCwgYXJncCk7CisgIHZhX2VuZChhcmdwKTsKKyAgcmV0dXJuIG1zZzsKK30KKworCisvKiBudW1iZXIgb2YgY2hhcnMgb2YgYSBsaXRlcmFsIHN0cmluZyB3aXRob3V0IHRoZSBlbmRpbmcgXDAgKi8KKyNkZWZpbmUgTEwoeCkJKHNpemVvZih4KS9zaXplb2YoY2hhcikgLSAxKQorCisjZGVmaW5lIFJFVFMJIi4uLiIKKyNkZWZpbmUgUFJFCSJbc3RyaW5nIFwiIgorI2RlZmluZSBQT1MJIlwiXSIKKworI2RlZmluZSBhZGRzdHIoYSxiLGwpCSggbWVtY3B5KGEsYiwobCkgKiBzaXplb2YoY2hhcikpLCBhICs9IChsKSApCisKK3ZvaWQgbHVhT19jaHVua2lkIChjaGFyICpvdXQsIGNvbnN0IGNoYXIgKnNvdXJjZSwgc2l6ZV90IGJ1ZmZsZW4pIHsKKyAgc2l6ZV90IGwgPSBzdHJsZW4oc291cmNlKTsKKyAgaWYgKCpzb3VyY2UgPT0gJz0nKSB7ICAvKiAnbGl0ZXJhbCcgc291cmNlICovCisgICAgaWYgKGwgPD0gYnVmZmxlbikgIC8qIHNtYWxsIGVub3VnaD8gKi8KKyAgICAgIG1lbWNweShvdXQsIHNvdXJjZSArIDEsIGwgKiBzaXplb2YoY2hhcikpOworICAgIGVsc2UgeyAgLyogdHJ1bmNhdGUgaXQgKi8KKyAgICAgIGFkZHN0cihvdXQsIHNvdXJjZSArIDEsIGJ1ZmZsZW4gLSAxKTsKKyAgICAgICpvdXQgPSAnXDAnOworICAgIH0KKyAgfQorICBlbHNlIGlmICgqc291cmNlID09ICdAJykgeyAgLyogZmlsZSBuYW1lICovCisgICAgaWYgKGwgPD0gYnVmZmxlbikgIC8qIHNtYWxsIGVub3VnaD8gKi8KKyAgICAgIG1lbWNweShvdXQsIHNvdXJjZSArIDEsIGwgKiBzaXplb2YoY2hhcikpOworICAgIGVsc2UgeyAgLyogYWRkICcuLi4nIGJlZm9yZSByZXN0IG9mIG5hbWUgKi8KKyAgICAgIGFkZHN0cihvdXQsIFJFVFMsIExMKFJFVFMpKTsKKyAgICAgIGJ1ZmZsZW4gLT0gTEwoUkVUUyk7CisgICAgICBtZW1jcHkob3V0LCBzb3VyY2UgKyAxICsgbCAtIGJ1ZmZsZW4sIGJ1ZmZsZW4gKiBzaXplb2YoY2hhcikpOworICAgIH0KKyAgfQorICBlbHNlIHsgIC8qIHN0cmluZzsgZm9ybWF0IGFzIFtzdHJpbmcgInNvdXJjZSJdICovCisgICAgY29uc3QgY2hhciAqbmwgPSBzdHJjaHIoc291cmNlLCAnXG4nKTsgIC8qIGZpbmQgZmlyc3QgbmV3IGxpbmUgKGlmIGFueSkgKi8KKyAgICBhZGRzdHIob3V0LCBQUkUsIExMKFBSRSkpOyAgLyogYWRkIHByZWZpeCAqLworICAgIGJ1ZmZsZW4gLT0gTEwoUFJFIFJFVFMgUE9TKSArIDE7ICAvKiBzYXZlIHNwYWNlIGZvciBwcmVmaXgrc3VmZml4KydcMCcgKi8KKyAgICBpZiAobCA8IGJ1ZmZsZW4gJiYgbmwgPT0gTlVMTCkgeyAgLyogc21hbGwgb25lLWxpbmUgc291cmNlPyAqLworICAgICAgYWRkc3RyKG91dCwgc291cmNlLCBsKTsgIC8qIGtlZXAgaXQgKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAobmwgIT0gTlVMTCkgbCA9IG5sIC0gc291cmNlOyAgLyogc3RvcCBhdCBmaXJzdCBuZXdsaW5lICovCisgICAgICBpZiAobCA+IGJ1ZmZsZW4pIGwgPSBidWZmbGVuOworICAgICAgYWRkc3RyKG91dCwgc291cmNlLCBsKTsKKyAgICAgIGFkZHN0cihvdXQsIFJFVFMsIExMKFJFVFMpKTsKKyAgICB9CisgICAgbWVtY3B5KG91dCwgUE9TLCAoTEwoUE9TKSArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xvYmplY3QuaCBiL2NvbTMyL2x1YS9zcmMvbG9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjMwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xvYmplY3QuaApAQCAtMCwwICsxLDYwNyBAQAorLyoKKyoqICRJZDogbG9iamVjdC5oLHYgMi43MS4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBUeXBlIGRlZmluaXRpb25zIGZvciBMdWEgb2JqZWN0cworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2lmbmRlZiBsb2JqZWN0X2gKKyNkZWZpbmUgbG9iamVjdF9oCisKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisKKyNpbmNsdWRlICJsbGltaXRzLmgiCisjaW5jbHVkZSAibHVhLmgiCisKKworLyoKKyoqIEV4dHJhIHRhZ3MgZm9yIG5vbi12YWx1ZXMKKyovCisjZGVmaW5lIExVQV9UUFJPVE8JTFVBX05VTVRBR1MKKyNkZWZpbmUgTFVBX1RVUFZBTAkoTFVBX05VTVRBR1MrMSkKKyNkZWZpbmUgTFVBX1RERUFES0VZCShMVUFfTlVNVEFHUysyKQorCisvKgorKiogbnVtYmVyIG9mIGFsbCBwb3NzaWJsZSB0YWdzIChpbmNsdWRpbmcgTFVBX1ROT05FIGJ1dCBleGNsdWRpbmcgREVBREtFWSkKKyovCisjZGVmaW5lIExVQV9UT1RBTFRBR1MJKExVQV9UVVBWQUwrMikKKworCisvKgorKiogdGFncyBmb3IgVGFnZ2VkIFZhbHVlcyBoYXZlIHRoZSBmb2xsb3dpbmcgdXNlIG9mIGJpdHM6CisqKiBiaXRzIDAtMzogYWN0dWFsIHRhZyAoYSBMVUFfVCogdmFsdWUpCisqKiBiaXRzIDQtNTogdmFyaWFudCBiaXRzCisqKiBiaXQgNjogd2hldGhlciB2YWx1ZSBpcyBjb2xsZWN0YWJsZQorKi8KKworI2RlZmluZSBWQVJCSVRTCQkoMyA8PCA0KQorCisKKy8qCisqKiBMVUFfVEZVTkNUSU9OIHZhcmlhbnRzOgorKiogMCAtIEx1YSBmdW5jdGlvbgorKiogMSAtIGxpZ2h0IEMgZnVuY3Rpb24KKyoqIDIgLSByZWd1bGFyIEMgZnVuY3Rpb24gKGNsb3N1cmUpCisqLworCisvKiBWYXJpYW50IHRhZ3MgZm9yIGZ1bmN0aW9ucyAqLworI2RlZmluZSBMVUFfVExDTAkoTFVBX1RGVU5DVElPTiB8ICgwIDw8IDQpKSAgLyogTHVhIGNsb3N1cmUgKi8KKyNkZWZpbmUgTFVBX1RMQ0YJKExVQV9URlVOQ1RJT04gfCAoMSA8PCA0KSkgIC8qIGxpZ2h0IEMgZnVuY3Rpb24gKi8KKyNkZWZpbmUgTFVBX1RDQ0wJKExVQV9URlVOQ1RJT04gfCAoMiA8PCA0KSkgIC8qIEMgY2xvc3VyZSAqLworCisKKy8qIFZhcmlhbnQgdGFncyBmb3Igc3RyaW5ncyAqLworI2RlZmluZSBMVUFfVFNIUlNUUgkoTFVBX1RTVFJJTkcgfCAoMCA8PCA0KSkgIC8qIHNob3J0IHN0cmluZ3MgKi8KKyNkZWZpbmUgTFVBX1RMTkdTVFIJKExVQV9UU1RSSU5HIHwgKDEgPDwgNCkpICAvKiBsb25nIHN0cmluZ3MgKi8KKworCisvKiBCaXQgbWFyayBmb3IgY29sbGVjdGFibGUgdHlwZXMgKi8KKyNkZWZpbmUgQklUX0lTQ09MTEVDVEFCTEUJKDEgPDwgNikKKworLyogbWFyayBhIHRhZyBhcyBjb2xsZWN0YWJsZSAqLworI2RlZmluZSBjdGIodCkJCQkoKHQpIHwgQklUX0lTQ09MTEVDVEFCTEUpCisKKworLyoKKyoqIFVuaW9uIG9mIGFsbCBjb2xsZWN0YWJsZSBvYmplY3RzCisqLwordHlwZWRlZiB1bmlvbiBHQ09iamVjdCBHQ09iamVjdDsKKworCisvKgorKiogQ29tbW9uIEhlYWRlciBmb3IgYWxsIGNvbGxlY3RhYmxlIG9iamVjdHMgKGluIG1hY3JvIGZvcm0sIHRvIGJlCisqKiBpbmNsdWRlZCBpbiBvdGhlciBvYmplY3RzKQorKi8KKyNkZWZpbmUgQ29tbW9uSGVhZGVyCUdDT2JqZWN0ICpuZXh0OyBsdV9ieXRlIHR0OyBsdV9ieXRlIG1hcmtlZAorCisKKy8qCisqKiBDb21tb24gaGVhZGVyIGluIHN0cnVjdCBmb3JtCisqLwordHlwZWRlZiBzdHJ1Y3QgR0NoZWFkZXIgeworICBDb21tb25IZWFkZXI7Cit9IEdDaGVhZGVyOworCisKKworLyoKKyoqIFVuaW9uIG9mIGFsbCBMdWEgdmFsdWVzCisqLwordHlwZWRlZiB1bmlvbiBWYWx1ZSBWYWx1ZTsKKworCisjZGVmaW5lIG51bWZpZWxkCWx1YV9OdW1iZXIgbjsgICAgLyogbnVtYmVycyAqLworCisKKworLyoKKyoqIFRhZ2dlZCBWYWx1ZXMuIFRoaXMgaXMgdGhlIGJhc2ljIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlcyBpbiBMdWEsCisqKiBhbiBhY3R1YWwgdmFsdWUgcGx1cyBhIHRhZyB3aXRoIGl0cyB0eXBlLgorKi8KKworI2RlZmluZSBUVmFsdWVmaWVsZHMJVmFsdWUgdmFsdWVfOyBpbnQgdHRfCisKK3R5cGVkZWYgc3RydWN0IGx1YV9UVmFsdWUgVFZhbHVlOworCisKKy8qIG1hY3JvIGRlZmluaW5nIGEgbmlsIHZhbHVlICovCisjZGVmaW5lIE5JTENPTlNUQU5UCXtOVUxMfSwgTFVBX1ROSUwKKworCisjZGVmaW5lIHZhbF8obykJCSgobyktPnZhbHVlXykKKyNkZWZpbmUgbnVtXyhvKQkJKHZhbF8obykubikKKworCisvKiByYXcgdHlwZSB0YWcgb2YgYSBUVmFsdWUgKi8KKyNkZWZpbmUgcnR0eXBlKG8pCSgobyktPnR0XykKKworLyogdGFnIHdpdGggbm8gdmFyaWFudHMgKGJpdHMgMC0zKSAqLworI2RlZmluZSBub3ZhcmlhbnQoeCkJKCh4KSAmIDB4MEYpCisKKy8qIHR5cGUgdGFnIG9mIGEgVFZhbHVlIChiaXRzIDAtMyBmb3IgdGFncyArIHZhcmlhbnQgYml0cyA0LTUpICovCisjZGVmaW5lIHR0eXBlKG8pCShydHR5cGUobykgJiAweDNGKQorCisvKiB0eXBlIHRhZyBvZiBhIFRWYWx1ZSB3aXRoIG5vIHZhcmlhbnRzIChiaXRzIDAtMykgKi8KKyNkZWZpbmUgdHR5cGVudihvKQkobm92YXJpYW50KHJ0dHlwZShvKSkpCisKKworLyogTWFjcm9zIHRvIHRlc3QgdHlwZSAqLworI2RlZmluZSBjaGVja3RhZyhvLHQpCQkocnR0eXBlKG8pID09ICh0KSkKKyNkZWZpbmUgY2hlY2t0eXBlKG8sdCkJCSh0dHlwZW52KG8pID09ICh0KSkKKyNkZWZpbmUgdHRpc251bWJlcihvKQkJY2hlY2t0YWcoKG8pLCBMVUFfVE5VTUJFUikKKyNkZWZpbmUgdHRpc25pbChvKQkJY2hlY2t0YWcoKG8pLCBMVUFfVE5JTCkKKyNkZWZpbmUgdHRpc2Jvb2xlYW4obykJCWNoZWNrdGFnKChvKSwgTFVBX1RCT09MRUFOKQorI2RlZmluZSB0dGlzbGlnaHR1c2VyZGF0YShvKQljaGVja3RhZygobyksIExVQV9UTElHSFRVU0VSREFUQSkKKyNkZWZpbmUgdHRpc3N0cmluZyhvKQkJY2hlY2t0eXBlKChvKSwgTFVBX1RTVFJJTkcpCisjZGVmaW5lIHR0aXNzaHJzdHJpbmcobykJY2hlY2t0YWcoKG8pLCBjdGIoTFVBX1RTSFJTVFIpKQorI2RlZmluZSB0dGlzbG5nc3RyaW5nKG8pCWNoZWNrdGFnKChvKSwgY3RiKExVQV9UTE5HU1RSKSkKKyNkZWZpbmUgdHRpc3RhYmxlKG8pCQljaGVja3RhZygobyksIGN0YihMVUFfVFRBQkxFKSkKKyNkZWZpbmUgdHRpc2Z1bmN0aW9uKG8pCQljaGVja3R5cGUobywgTFVBX1RGVU5DVElPTikKKyNkZWZpbmUgdHRpc2Nsb3N1cmUobykJCSgocnR0eXBlKG8pICYgMHgxRikgPT0gTFVBX1RGVU5DVElPTikKKyNkZWZpbmUgdHRpc0NjbG9zdXJlKG8pCQljaGVja3RhZygobyksIGN0YihMVUFfVENDTCkpCisjZGVmaW5lIHR0aXNMY2xvc3VyZShvKQkJY2hlY2t0YWcoKG8pLCBjdGIoTFVBX1RMQ0wpKQorI2RlZmluZSB0dGlzbGNmKG8pCQljaGVja3RhZygobyksIExVQV9UTENGKQorI2RlZmluZSB0dGlzdXNlcmRhdGEobykJCWNoZWNrdGFnKChvKSwgY3RiKExVQV9UVVNFUkRBVEEpKQorI2RlZmluZSB0dGlzdGhyZWFkKG8pCQljaGVja3RhZygobyksIGN0YihMVUFfVFRIUkVBRCkpCisjZGVmaW5lIHR0aXNkZWFka2V5KG8pCQljaGVja3RhZygobyksIExVQV9UREVBREtFWSkKKworI2RlZmluZSB0dGlzZXF1YWwobzEsbzIpCShydHR5cGUobzEpID09IHJ0dHlwZShvMikpCisKKy8qIE1hY3JvcyB0byBhY2Nlc3MgdmFsdWVzICovCisjZGVmaW5lIG52YWx1ZShvKQljaGVja19leHAodHRpc251bWJlcihvKSwgbnVtXyhvKSkKKyNkZWZpbmUgZ2N2YWx1ZShvKQljaGVja19leHAoaXNjb2xsZWN0YWJsZShvKSwgdmFsXyhvKS5nYykKKyNkZWZpbmUgcHZhbHVlKG8pCWNoZWNrX2V4cCh0dGlzbGlnaHR1c2VyZGF0YShvKSwgdmFsXyhvKS5wKQorI2RlZmluZSByYXd0c3ZhbHVlKG8pCWNoZWNrX2V4cCh0dGlzc3RyaW5nKG8pLCAmdmFsXyhvKS5nYy0+dHMpCisjZGVmaW5lIHRzdmFsdWUobykJKCZyYXd0c3ZhbHVlKG8pLT50c3YpCisjZGVmaW5lIHJhd3V2YWx1ZShvKQljaGVja19leHAodHRpc3VzZXJkYXRhKG8pLCAmdmFsXyhvKS5nYy0+dSkKKyNkZWZpbmUgdXZhbHVlKG8pCSgmcmF3dXZhbHVlKG8pLT51dikKKyNkZWZpbmUgY2x2YWx1ZShvKQljaGVja19leHAodHRpc2Nsb3N1cmUobyksICZ2YWxfKG8pLmdjLT5jbCkKKyNkZWZpbmUgY2xMdmFsdWUobykJY2hlY2tfZXhwKHR0aXNMY2xvc3VyZShvKSwgJnZhbF8obykuZ2MtPmNsLmwpCisjZGVmaW5lIGNsQ3ZhbHVlKG8pCWNoZWNrX2V4cCh0dGlzQ2Nsb3N1cmUobyksICZ2YWxfKG8pLmdjLT5jbC5jKQorI2RlZmluZSBmdmFsdWUobykJY2hlY2tfZXhwKHR0aXNsY2YobyksIHZhbF8obykuZikKKyNkZWZpbmUgaHZhbHVlKG8pCWNoZWNrX2V4cCh0dGlzdGFibGUobyksICZ2YWxfKG8pLmdjLT5oKQorI2RlZmluZSBidmFsdWUobykJY2hlY2tfZXhwKHR0aXNib29sZWFuKG8pLCB2YWxfKG8pLmIpCisjZGVmaW5lIHRodmFsdWUobykJY2hlY2tfZXhwKHR0aXN0aHJlYWQobyksICZ2YWxfKG8pLmdjLT50aCkKKy8qIGEgZGVhZCB2YWx1ZSBtYXkgZ2V0IHRoZSAnZ2MnIGZpZWxkLCBidXQgY2Fubm90IGFjY2VzcyBpdHMgY29udGVudHMgKi8KKyNkZWZpbmUgZGVhZHZhbHVlKG8pCWNoZWNrX2V4cCh0dGlzZGVhZGtleShvKSwgY2FzdCh2b2lkICosIHZhbF8obykuZ2MpKQorCisjZGVmaW5lIGxfaXNmYWxzZShvKQkodHRpc25pbChvKSB8fCAodHRpc2Jvb2xlYW4obykgJiYgYnZhbHVlKG8pID09IDApKQorCisKKyNkZWZpbmUgaXNjb2xsZWN0YWJsZShvKQkocnR0eXBlKG8pICYgQklUX0lTQ09MTEVDVEFCTEUpCisKKworLyogTWFjcm9zIGZvciBpbnRlcm5hbCB0ZXN0cyAqLworI2RlZmluZSByaWdodHR0KG9iaikJCSh0dHlwZShvYmopID09IGdjdmFsdWUob2JqKS0+Z2NoLnR0KQorCisjZGVmaW5lIGNoZWNrbGl2ZW5lc3MoZyxvYmopIFwKKwlsdWFfbG9uZ2Fzc2VydCghaXNjb2xsZWN0YWJsZShvYmopIHx8IFwKKwkJCShyaWdodHR0KG9iaikgJiYgIWlzZGVhZChnLGdjdmFsdWUob2JqKSkpKQorCisKKy8qIE1hY3JvcyB0byBzZXQgdmFsdWVzICovCisjZGVmaW5lIHNldHR0XyhvLHQpCSgobyktPnR0Xz0odCkpCisKKyNkZWZpbmUgc2V0bnZhbHVlKG9iaix4KSBcCisgIHsgVFZhbHVlICppbz0ob2JqKTsgbnVtXyhpbyk9KHgpOyBzZXR0dF8oaW8sIExVQV9UTlVNQkVSKTsgfQorCisjZGVmaW5lIHNldG5pbHZhbHVlKG9iaikgc2V0dHRfKG9iaiwgTFVBX1ROSUwpCisKKyNkZWZpbmUgc2V0ZnZhbHVlKG9iaix4KSBcCisgIHsgVFZhbHVlICppbz0ob2JqKTsgdmFsXyhpbykuZj0oeCk7IHNldHR0XyhpbywgTFVBX1RMQ0YpOyB9CisKKyNkZWZpbmUgc2V0cHZhbHVlKG9iaix4KSBcCisgIHsgVFZhbHVlICppbz0ob2JqKTsgdmFsXyhpbykucD0oeCk7IHNldHR0XyhpbywgTFVBX1RMSUdIVFVTRVJEQVRBKTsgfQorCisjZGVmaW5lIHNldGJ2YWx1ZShvYmoseCkgXAorICB7IFRWYWx1ZSAqaW89KG9iaik7IHZhbF8oaW8pLmI9KHgpOyBzZXR0dF8oaW8sIExVQV9UQk9PTEVBTik7IH0KKworI2RlZmluZSBzZXRnY292YWx1ZShMLG9iaix4KSBcCisgIHsgVFZhbHVlICppbz0ob2JqKTsgR0NPYmplY3QgKmlfZz0oeCk7IFwKKyAgICB2YWxfKGlvKS5nYz1pX2c7IHNldHR0XyhpbywgY3RiKGdjaChpX2cpLT50dCkpOyB9CisKKyNkZWZpbmUgc2V0c3ZhbHVlKEwsb2JqLHgpIFwKKyAgeyBUVmFsdWUgKmlvPShvYmopOyBcCisgICAgVFN0cmluZyAqeF8gPSAoeCk7IFwKKyAgICB2YWxfKGlvKS5nYz1jYXN0KEdDT2JqZWN0ICosIHhfKTsgc2V0dHRfKGlvLCBjdGIoeF8tPnRzdi50dCkpOyBcCisgICAgY2hlY2tsaXZlbmVzcyhHKEwpLGlvKTsgfQorCisjZGVmaW5lIHNldHV2YWx1ZShMLG9iaix4KSBcCisgIHsgVFZhbHVlICppbz0ob2JqKTsgXAorICAgIHZhbF8oaW8pLmdjPWNhc3QoR0NPYmplY3QgKiwgKHgpKTsgc2V0dHRfKGlvLCBjdGIoTFVBX1RVU0VSREFUQSkpOyBcCisgICAgY2hlY2tsaXZlbmVzcyhHKEwpLGlvKTsgfQorCisjZGVmaW5lIHNldHRodmFsdWUoTCxvYmoseCkgXAorICB7IFRWYWx1ZSAqaW89KG9iaik7IFwKKyAgICB2YWxfKGlvKS5nYz1jYXN0KEdDT2JqZWN0ICosICh4KSk7IHNldHR0XyhpbywgY3RiKExVQV9UVEhSRUFEKSk7IFwKKyAgICBjaGVja2xpdmVuZXNzKEcoTCksaW8pOyB9CisKKyNkZWZpbmUgc2V0Y2xMdmFsdWUoTCxvYmoseCkgXAorICB7IFRWYWx1ZSAqaW89KG9iaik7IFwKKyAgICB2YWxfKGlvKS5nYz1jYXN0KEdDT2JqZWN0ICosICh4KSk7IHNldHR0XyhpbywgY3RiKExVQV9UTENMKSk7IFwKKyAgICBjaGVja2xpdmVuZXNzKEcoTCksaW8pOyB9CisKKyNkZWZpbmUgc2V0Y2xDdmFsdWUoTCxvYmoseCkgXAorICB7IFRWYWx1ZSAqaW89KG9iaik7IFwKKyAgICB2YWxfKGlvKS5nYz1jYXN0KEdDT2JqZWN0ICosICh4KSk7IHNldHR0XyhpbywgY3RiKExVQV9UQ0NMKSk7IFwKKyAgICBjaGVja2xpdmVuZXNzKEcoTCksaW8pOyB9CisKKyNkZWZpbmUgc2V0aHZhbHVlKEwsb2JqLHgpIFwKKyAgeyBUVmFsdWUgKmlvPShvYmopOyBcCisgICAgdmFsXyhpbykuZ2M9Y2FzdChHQ09iamVjdCAqLCAoeCkpOyBzZXR0dF8oaW8sIGN0YihMVUFfVFRBQkxFKSk7IFwKKyAgICBjaGVja2xpdmVuZXNzKEcoTCksaW8pOyB9CisKKyNkZWZpbmUgc2V0ZGVhZHZhbHVlKG9iaikJc2V0dHRfKG9iaiwgTFVBX1RERUFES0VZKQorCisKKworI2RlZmluZSBzZXRvYmooTCxvYmoxLG9iajIpIFwKKwl7IGNvbnN0IFRWYWx1ZSAqaW8yPShvYmoyKTsgVFZhbHVlICppbzE9KG9iajEpOyBcCisJICBpbzEtPnZhbHVlXyA9IGlvMi0+dmFsdWVfOyBpbzEtPnR0XyA9IGlvMi0+dHRfOyBcCisJICBjaGVja2xpdmVuZXNzKEcoTCksaW8xKTsgfQorCisKKy8qCisqKiBkaWZmZXJlbnQgdHlwZXMgb2YgYXNzaWdubWVudHMsIGFjY29yZGluZyB0byBkZXN0aW5hdGlvbgorKi8KKworLyogZnJvbSBzdGFjayB0byAoc2FtZSkgc3RhY2sgKi8KKyNkZWZpbmUgc2V0b2JqczJzCXNldG9iagorLyogdG8gc3RhY2sgKG5vdCBmcm9tIHNhbWUgc3RhY2spICovCisjZGVmaW5lIHNldG9iajJzCXNldG9iagorI2RlZmluZSBzZXRzdmFsdWUycwlzZXRzdmFsdWUKKyNkZWZpbmUgc2V0aHZhbHVlMnMJc2V0aHZhbHVlCisjZGVmaW5lIHNldHB0dmFsdWUycwlzZXRwdHZhbHVlCisvKiBmcm9tIHRhYmxlIHRvIHNhbWUgdGFibGUgKi8KKyNkZWZpbmUgc2V0b2JqdDJ0CXNldG9iagorLyogdG8gdGFibGUgKi8KKyNkZWZpbmUgc2V0b2JqMnQJc2V0b2JqCisvKiB0byBuZXcgb2JqZWN0ICovCisjZGVmaW5lIHNldG9iajJuCXNldG9iagorI2RlZmluZSBzZXRzdmFsdWUybglzZXRzdmFsdWUKKworCisvKiBjaGVjayB3aGV0aGVyIGEgbnVtYmVyIGlzIHZhbGlkICh1c2VmdWwgb25seSBmb3IgTmFOIHRyaWNrKSAqLworI2RlZmluZSBsdWFpX2NoZWNrbnVtKEwsbyxjKQl7IC8qIGVtcHR5ICovIH0KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogTmFOIFRyaWNrCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmIGRlZmluZWQoTFVBX05BTlRSSUNLKQorCisvKgorKiogbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgaW4gdGhlICdkXycgZmllbGQuIEFsbCBvdGhlciB2YWx1ZXMgaGF2ZSB0aGUKKyoqIHZhbHVlIChOTk1BUksgfCB0YWcpIGluICd0dF9fJy4gQSBudW1iZXIgd2l0aCBzdWNoIHBhdHRlcm4gd291bGQgYmUKKyoqIGEgInNpZ25hbGVkIE5hTiIsIHdoaWNoIGlzIG5ldmVyIGdlbmVyYXRlZCBieSByZWd1bGFyIG9wZXJhdGlvbnMgYnkKKyoqIHRoZSBDUFUgKG5vciBieSAnc3RydG9kJykKKyovCisKKy8qIGFsbG93cyBmb3IgZXh0ZXJuYWwgaW1wbGVtZW50YXRpb24gZm9yIHBhcnQgb2YgdGhlIHRyaWNrICovCisjaWYgIWRlZmluZWQoTk5NQVJLKQkvKiB7ICovCisKKworI2lmICFkZWZpbmVkKExVQV9JRUVFRU5ESUFOKQorI2Vycm9yIG9wdGlvbiAnTFVBX05BTlRSSUNLJyBuZWVkcyAnTFVBX0lFRUVFTkRJQU4nCisjZW5kaWYKKworCisjZGVmaW5lIE5OTUFSSwkJMHg3RkY3QTUwMAorI2RlZmluZSBOTk1BU0sJCTB4N0ZGRkZGMDAKKworI3VuZGVmIFRWYWx1ZWZpZWxkcworI3VuZGVmIE5JTENPTlNUQU5UCisKKyNpZiAoTFVBX0lFRUVFTkRJQU4gPT0gMCkJLyogeyAqLworCisvKiBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIFRWYWx1ZWZpZWxkcyAgXAorCXVuaW9uIHsgc3RydWN0IHsgVmFsdWUgdl9fOyBpbnQgdHRfXzsgfSBpOyBkb3VibGUgZF9fOyB9IHUKKyNkZWZpbmUgTklMQ09OU1RBTlQJe3t7TlVMTH0sIHRhZzJ0dChMVUFfVE5JTCl9fQorLyogZmllbGQtYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSB2XyhvKQkJKChvKS0+dS5pLnZfXykKKyNkZWZpbmUgZF8obykJCSgobyktPnUuZF9fKQorI2RlZmluZSB0dF8obykJCSgobyktPnUuaS50dF9fKQorCisjZWxzZQkJCQkvKiB9eyAqLworCisvKiBiaWcgZW5kaWFuICovCisjZGVmaW5lIFRWYWx1ZWZpZWxkcyAgXAorCXVuaW9uIHsgc3RydWN0IHsgaW50IHR0X187IFZhbHVlIHZfXzsgfSBpOyBkb3VibGUgZF9fOyB9IHUKKyNkZWZpbmUgTklMQ09OU1RBTlQJe3t0YWcydHQoTFVBX1ROSUwpLCB7TlVMTH19fQorLyogZmllbGQtYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSB2XyhvKQkJKChvKS0+dS5pLnZfXykKKyNkZWZpbmUgZF8obykJCSgobyktPnUuZF9fKQorI2RlZmluZSB0dF8obykJCSgobyktPnUuaS50dF9fKQorCisjZW5kaWYJCQkJLyogfSAqLworCisjZW5kaWYJCQkvKiB9ICovCisKKworLyogY29ycmVzcG9uZGVuY2Ugd2l0aCBzdGFuZGFyZCByZXByZXNlbnRhdGlvbiAqLworI3VuZGVmIHZhbF8KKyNkZWZpbmUgdmFsXyhvKQkJdl8obykKKyN1bmRlZiBudW1fCisjZGVmaW5lIG51bV8obykJCWRfKG8pCisKKworI3VuZGVmIG51bWZpZWxkCisjZGVmaW5lIG51bWZpZWxkCS8qIG5vIHN1Y2ggZmllbGQ7IG51bWJlcnMgYXJlIHRoZSBlbnRpcmUgc3RydWN0ICovCisKKy8qIGJhc2ljIGNoZWNrIHRvIGRpc3Rpbmd1aXNoIG51bWJlcnMgZnJvbSBub24tbnVtYmVycyAqLworI3VuZGVmIHR0aXNudW1iZXIKKyNkZWZpbmUgdHRpc251bWJlcihvKQkoKHR0XyhvKSAmIE5OTUFTSykgIT0gTk5NQVJLKQorCisjZGVmaW5lIHRhZzJ0dCh0KQkoTk5NQVJLIHwgKHQpKQorCisjdW5kZWYgcnR0eXBlCisjZGVmaW5lIHJ0dHlwZShvKQkodHRpc251bWJlcihvKSA/IExVQV9UTlVNQkVSIDogdHRfKG8pICYgMHhmZikKKworI3VuZGVmIHNldHR0XworI2RlZmluZSBzZXR0dF8obyx0KQkodHRfKG8pID0gdGFnMnR0KHQpKQorCisjdW5kZWYgc2V0bnZhbHVlCisjZGVmaW5lIHNldG52YWx1ZShvYmoseCkgXAorCXsgVFZhbHVlICppb189KG9iaik7IG51bV8oaW9fKT0oeCk7IGx1YV9hc3NlcnQodHRpc251bWJlcihpb18pKTsgfQorCisjdW5kZWYgc2V0b2JqCisjZGVmaW5lIHNldG9iaihMLG9iajEsb2JqMikgXAorCXsgY29uc3QgVFZhbHVlICpvMl89KG9iajIpOyBUVmFsdWUgKm8xXz0ob2JqMSk7IFwKKwkgIG8xXy0+dSA9IG8yXy0+dTsgXAorCSAgY2hlY2tsaXZlbmVzcyhHKEwpLG8xXyk7IH0KKworCisvKgorKiogdGhlc2UgcmVkZWZpbml0aW9ucyBhcmUgbm90IG1hbmRhdG9yeSwgYnV0IHRoZXNlIGZvcm1zIGFyZSBtb3JlIGVmZmljaWVudAorKi8KKworI3VuZGVmIGNoZWNrdGFnCisjdW5kZWYgY2hlY2t0eXBlCisjZGVmaW5lIGNoZWNrdGFnKG8sdCkJKHR0XyhvKSA9PSB0YWcydHQodCkpCisjZGVmaW5lIGNoZWNrdHlwZShvLHQpCShjdGIodHRfKG8pIHwgVkFSQklUUykgPT0gY3RiKHRhZzJ0dCh0KSB8IFZBUkJJVFMpKQorCisjdW5kZWYgdHRpc2VxdWFsCisjZGVmaW5lIHR0aXNlcXVhbChvMSxvMikgIFwKKwkodHRpc251bWJlcihvMSkgPyB0dGlzbnVtYmVyKG8yKSA6ICh0dF8obzEpID09IHR0XyhvMikpKQorCisKKyN1bmRlZiBsdWFpX2NoZWNrbnVtCisjZGVmaW5lIGx1YWlfY2hlY2tudW0oTCxvLGMpCXsgaWYgKCF0dGlzbnVtYmVyKG8pKSBjOyB9CisKKyNlbmRpZgorLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKworLyoKKyoqIHs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIHR5cGVzIGFuZCBwcm90b3R5cGVzCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKK3VuaW9uIFZhbHVlIHsKKyAgR0NPYmplY3QgKmdjOyAgICAvKiBjb2xsZWN0YWJsZSBvYmplY3RzICovCisgIHZvaWQgKnA7ICAgICAgICAgLyogbGlnaHQgdXNlcmRhdGEgKi8KKyAgaW50IGI7ICAgICAgICAgICAvKiBib29sZWFucyAqLworICBsdWFfQ0Z1bmN0aW9uIGY7IC8qIGxpZ2h0IEMgZnVuY3Rpb25zICovCisgIG51bWZpZWxkICAgICAgICAgLyogbnVtYmVycyAqLworfTsKKworCitzdHJ1Y3QgbHVhX1RWYWx1ZSB7CisgIFRWYWx1ZWZpZWxkczsKK307CisKKwordHlwZWRlZiBUVmFsdWUgKlN0a0lkOyAgLyogaW5kZXggdG8gc3RhY2sgZWxlbWVudHMgKi8KKworCisKKworLyoKKyoqIEhlYWRlciBmb3Igc3RyaW5nIHZhbHVlOyBzdHJpbmcgYnl0ZXMgZm9sbG93IHRoZSBlbmQgb2YgdGhpcyBzdHJ1Y3R1cmUKKyovCit0eXBlZGVmIHVuaW9uIFRTdHJpbmcgeworICBMX1VtYXhhbGlnbiBkdW1teTsgIC8qIGVuc3VyZXMgbWF4aW11bSBhbGlnbm1lbnQgZm9yIHN0cmluZ3MgKi8KKyAgc3RydWN0IHsKKyAgICBDb21tb25IZWFkZXI7CisgICAgbHVfYnl0ZSBleHRyYTsgIC8qIHJlc2VydmVkIHdvcmRzIGZvciBzaG9ydCBzdHJpbmdzOyAiaGFzIGhhc2giIGZvciBsb25ncyAqLworICAgIHVuc2lnbmVkIGludCBoYXNoOworICAgIHNpemVfdCBsZW47ICAvKiBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdHJpbmcgKi8KKyAgfSB0c3Y7Cit9IFRTdHJpbmc7CisKKworLyogZ2V0IHRoZSBhY3R1YWwgc3RyaW5nIChhcnJheSBvZiBieXRlcykgZnJvbSBhIFRTdHJpbmcgKi8KKyNkZWZpbmUgZ2V0c3RyKHRzKQljYXN0KGNvbnN0IGNoYXIgKiwgKHRzKSArIDEpCisKKy8qIGdldCB0aGUgYWN0dWFsIHN0cmluZyAoYXJyYXkgb2YgYnl0ZXMpIGZyb20gYSBMdWEgdmFsdWUgKi8KKyNkZWZpbmUgc3ZhbHVlKG8pICAgICAgIGdldHN0cihyYXd0c3ZhbHVlKG8pKQorCisKKy8qCisqKiBIZWFkZXIgZm9yIHVzZXJkYXRhOyBtZW1vcnkgYXJlYSBmb2xsb3dzIHRoZSBlbmQgb2YgdGhpcyBzdHJ1Y3R1cmUKKyovCit0eXBlZGVmIHVuaW9uIFVkYXRhIHsKKyAgTF9VbWF4YWxpZ24gZHVtbXk7ICAvKiBlbnN1cmVzIG1heGltdW0gYWxpZ25tZW50IGZvciBgbG9jYWwnIHVkYXRhICovCisgIHN0cnVjdCB7CisgICAgQ29tbW9uSGVhZGVyOworICAgIHN0cnVjdCBUYWJsZSAqbWV0YXRhYmxlOworICAgIHN0cnVjdCBUYWJsZSAqZW52OworICAgIHNpemVfdCBsZW47ICAvKiBudW1iZXIgb2YgYnl0ZXMgKi8KKyAgfSB1djsKK30gVWRhdGE7CisKKworCisvKgorKiogRGVzY3JpcHRpb24gb2YgYW4gdXB2YWx1ZSBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcworKi8KK3R5cGVkZWYgc3RydWN0IFVwdmFsZGVzYyB7CisgIFRTdHJpbmcgKm5hbWU7ICAvKiB1cHZhbHVlIG5hbWUgKGZvciBkZWJ1ZyBpbmZvcm1hdGlvbikgKi8KKyAgbHVfYnl0ZSBpbnN0YWNrOyAgLyogd2hldGhlciBpdCBpcyBpbiBzdGFjayAqLworICBsdV9ieXRlIGlkeDsgIC8qIGluZGV4IG9mIHVwdmFsdWUgKGluIHN0YWNrIG9yIGluIG91dGVyIGZ1bmN0aW9uJ3MgbGlzdCkgKi8KK30gVXB2YWxkZXNjOworCisKKy8qCisqKiBEZXNjcmlwdGlvbiBvZiBhIGxvY2FsIHZhcmlhYmxlIGZvciBmdW5jdGlvbiBwcm90b3R5cGVzCisqKiAodXNlZCBmb3IgZGVidWcgaW5mb3JtYXRpb24pCisqLwordHlwZWRlZiBzdHJ1Y3QgTG9jVmFyIHsKKyAgVFN0cmluZyAqdmFybmFtZTsKKyAgaW50IHN0YXJ0cGM7ICAvKiBmaXJzdCBwb2ludCB3aGVyZSB2YXJpYWJsZSBpcyBhY3RpdmUgKi8KKyAgaW50IGVuZHBjOyAgICAvKiBmaXJzdCBwb2ludCB3aGVyZSB2YXJpYWJsZSBpcyBkZWFkICovCit9IExvY1ZhcjsKKworCisvKgorKiogRnVuY3Rpb24gUHJvdG90eXBlcworKi8KK3R5cGVkZWYgc3RydWN0IFByb3RvIHsKKyAgQ29tbW9uSGVhZGVyOworICBUVmFsdWUgKms7ICAvKiBjb25zdGFudHMgdXNlZCBieSB0aGUgZnVuY3Rpb24gKi8KKyAgSW5zdHJ1Y3Rpb24gKmNvZGU7CisgIHN0cnVjdCBQcm90byAqKnA7ICAvKiBmdW5jdGlvbnMgZGVmaW5lZCBpbnNpZGUgdGhlIGZ1bmN0aW9uICovCisgIGludCAqbGluZWluZm87ICAvKiBtYXAgZnJvbSBvcGNvZGVzIHRvIHNvdXJjZSBsaW5lcyAoZGVidWcgaW5mb3JtYXRpb24pICovCisgIExvY1ZhciAqbG9jdmFyczsgIC8qIGluZm9ybWF0aW9uIGFib3V0IGxvY2FsIHZhcmlhYmxlcyAoZGVidWcgaW5mb3JtYXRpb24pICovCisgIFVwdmFsZGVzYyAqdXB2YWx1ZXM7ICAvKiB1cHZhbHVlIGluZm9ybWF0aW9uICovCisgIHVuaW9uIENsb3N1cmUgKmNhY2hlOyAgLyogbGFzdCBjcmVhdGVkIGNsb3N1cmUgd2l0aCB0aGlzIHByb3RvdHlwZSAqLworICBUU3RyaW5nICAqc291cmNlOyAgLyogdXNlZCBmb3IgZGVidWcgaW5mb3JtYXRpb24gKi8KKyAgaW50IHNpemV1cHZhbHVlczsgIC8qIHNpemUgb2YgJ3VwdmFsdWVzJyAqLworICBpbnQgc2l6ZWs7ICAvKiBzaXplIG9mIGBrJyAqLworICBpbnQgc2l6ZWNvZGU7CisgIGludCBzaXplbGluZWluZm87CisgIGludCBzaXplcDsgIC8qIHNpemUgb2YgYHAnICovCisgIGludCBzaXplbG9jdmFyczsKKyAgaW50IGxpbmVkZWZpbmVkOworICBpbnQgbGFzdGxpbmVkZWZpbmVkOworICBHQ09iamVjdCAqZ2NsaXN0OworICBsdV9ieXRlIG51bXBhcmFtczsgIC8qIG51bWJlciBvZiBmaXhlZCBwYXJhbWV0ZXJzICovCisgIGx1X2J5dGUgaXNfdmFyYXJnOworICBsdV9ieXRlIG1heHN0YWNrc2l6ZTsgIC8qIG1heGltdW0gc3RhY2sgdXNlZCBieSB0aGlzIGZ1bmN0aW9uICovCit9IFByb3RvOworCisKKworLyoKKyoqIEx1YSBVcHZhbHVlcworKi8KK3R5cGVkZWYgc3RydWN0IFVwVmFsIHsKKyAgQ29tbW9uSGVhZGVyOworICBUVmFsdWUgKnY7ICAvKiBwb2ludHMgdG8gc3RhY2sgb3IgdG8gaXRzIG93biB2YWx1ZSAqLworICB1bmlvbiB7CisgICAgVFZhbHVlIHZhbHVlOyAgLyogdGhlIHZhbHVlICh3aGVuIGNsb3NlZCkgKi8KKyAgICBzdHJ1Y3QgeyAgLyogZG91YmxlIGxpbmtlZCBsaXN0ICh3aGVuIG9wZW4pICovCisgICAgICBzdHJ1Y3QgVXBWYWwgKnByZXY7CisgICAgICBzdHJ1Y3QgVXBWYWwgKm5leHQ7CisgICAgfSBsOworICB9IHU7Cit9IFVwVmFsOworCisKKy8qCisqKiBDbG9zdXJlcworKi8KKworI2RlZmluZSBDbG9zdXJlSGVhZGVyIFwKKwlDb21tb25IZWFkZXI7IGx1X2J5dGUgbnVwdmFsdWVzOyBHQ09iamVjdCAqZ2NsaXN0CisKK3R5cGVkZWYgc3RydWN0IENDbG9zdXJlIHsKKyAgQ2xvc3VyZUhlYWRlcjsKKyAgbHVhX0NGdW5jdGlvbiBmOworICBUVmFsdWUgdXB2YWx1ZVsxXTsgIC8qIGxpc3Qgb2YgdXB2YWx1ZXMgKi8KK30gQ0Nsb3N1cmU7CisKKwordHlwZWRlZiBzdHJ1Y3QgTENsb3N1cmUgeworICBDbG9zdXJlSGVhZGVyOworICBzdHJ1Y3QgUHJvdG8gKnA7CisgIFVwVmFsICp1cHZhbHNbMV07ICAvKiBsaXN0IG9mIHVwdmFsdWVzICovCit9IExDbG9zdXJlOworCisKK3R5cGVkZWYgdW5pb24gQ2xvc3VyZSB7CisgIENDbG9zdXJlIGM7CisgIExDbG9zdXJlIGw7Cit9IENsb3N1cmU7CisKKworI2RlZmluZSBpc0xmdW5jdGlvbihvKQl0dGlzTGNsb3N1cmUobykKKworI2RlZmluZSBnZXRwcm90byhvKQkoY2xMdmFsdWUobyktPnApCisKKworLyoKKyoqIFRhYmxlcworKi8KKwordHlwZWRlZiB1bmlvbiBUS2V5IHsKKyAgc3RydWN0IHsKKyAgICBUVmFsdWVmaWVsZHM7CisgICAgc3RydWN0IE5vZGUgKm5leHQ7ICAvKiBmb3IgY2hhaW5pbmcgKi8KKyAgfSBuazsKKyAgVFZhbHVlIHR2azsKK30gVEtleTsKKworCit0eXBlZGVmIHN0cnVjdCBOb2RlIHsKKyAgVFZhbHVlIGlfdmFsOworICBUS2V5IGlfa2V5OworfSBOb2RlOworCisKK3R5cGVkZWYgc3RydWN0IFRhYmxlIHsKKyAgQ29tbW9uSGVhZGVyOworICBsdV9ieXRlIGZsYWdzOyAgLyogMTw8cCBtZWFucyB0YWdtZXRob2QocCkgaXMgbm90IHByZXNlbnQgKi8KKyAgbHVfYnl0ZSBsc2l6ZW5vZGU7ICAvKiBsb2cyIG9mIHNpemUgb2YgYG5vZGUnIGFycmF5ICovCisgIHN0cnVjdCBUYWJsZSAqbWV0YXRhYmxlOworICBUVmFsdWUgKmFycmF5OyAgLyogYXJyYXkgcGFydCAqLworICBOb2RlICpub2RlOworICBOb2RlICpsYXN0ZnJlZTsgIC8qIGFueSBmcmVlIHBvc2l0aW9uIGlzIGJlZm9yZSB0aGlzIHBvc2l0aW9uICovCisgIEdDT2JqZWN0ICpnY2xpc3Q7CisgIGludCBzaXplYXJyYXk7ICAvKiBzaXplIG9mIGBhcnJheScgYXJyYXkgKi8KK30gVGFibGU7CisKKworCisvKgorKiogYG1vZHVsZScgb3BlcmF0aW9uIGZvciBoYXNoaW5nIChzaXplIGlzIGFsd2F5cyBhIHBvd2VyIG9mIDIpCisqLworI2RlZmluZSBsbW9kKHMsc2l6ZSkgXAorCShjaGVja19leHAoKHNpemUmKHNpemUtMSkpPT0wLCAoY2FzdChpbnQsIChzKSAmICgoc2l6ZSktMSkpKSkpCisKKworI2RlZmluZSB0d290byh4KQkoMTw8KHgpKQorI2RlZmluZSBzaXplbm9kZSh0KQkodHdvdG8oKHQpLT5sc2l6ZW5vZGUpKQorCisKKy8qCisqKiAoYWRkcmVzcyBvZikgYSBmaXhlZCBuaWwgdmFsdWUKKyovCisjZGVmaW5lIGx1YU9fbmlsb2JqZWN0CQkoJmx1YU9fbmlsb2JqZWN0XykKKworCitMVUFJX0RERUMgY29uc3QgVFZhbHVlIGx1YU9fbmlsb2JqZWN0XzsKKworCitMVUFJX0ZVTkMgaW50IGx1YU9faW50MmZiICh1bnNpZ25lZCBpbnQgeCk7CitMVUFJX0ZVTkMgaW50IGx1YU9fZmIyaW50IChpbnQgeCk7CitMVUFJX0ZVTkMgaW50IGx1YU9fY2VpbGxvZzIgKHVuc2lnbmVkIGludCB4KTsKK0xVQUlfRlVOQyBsdWFfTnVtYmVyIGx1YU9fYXJpdGggKGludCBvcCwgbHVhX051bWJlciB2MSwgbHVhX051bWJlciB2Mik7CitMVUFJX0ZVTkMgaW50IGx1YU9fc3RyMmQgKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIGx1YV9OdW1iZXIgKnJlc3VsdCk7CitMVUFJX0ZVTkMgaW50IGx1YU9faGV4YXZhbHVlIChpbnQgYyk7CitMVUFJX0ZVTkMgY29uc3QgY2hhciAqbHVhT19wdXNodmZzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncCk7CitMVUFJX0ZVTkMgY29uc3QgY2hhciAqbHVhT19wdXNoZnN0cmluZyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitMVUFJX0ZVTkMgdm9pZCBsdWFPX2NodW5raWQgKGNoYXIgKm91dCwgY29uc3QgY2hhciAqc291cmNlLCBzaXplX3QgbGVuKTsKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sb3Bjb2Rlcy5jIGIvY29tMzIvbHVhL3NyYy9sb3Bjb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTBkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xvcGNvZGVzLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisqKiAkSWQ6IGxvcGNvZGVzLmMsdiAxLjQ5LjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIE9wY29kZXMgZm9yIEx1YSB2aXJ0dWFsIG1hY2hpbmUKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNkZWZpbmUgbG9wY29kZXNfYworI2RlZmluZSBMVUFfQ09SRQorCisKKyNpbmNsdWRlICJsb3Bjb2Rlcy5oIgorCisKKy8qIE9SREVSIE9QICovCisKK0xVQUlfRERFRiBjb25zdCBjaGFyICpjb25zdCBsdWFQX29wbmFtZXNbTlVNX09QQ09ERVMrMV0gPSB7CisgICJNT1ZFIiwKKyAgIkxPQURLIiwKKyAgIkxPQURLWCIsCisgICJMT0FEQk9PTCIsCisgICJMT0FETklMIiwKKyAgIkdFVFVQVkFMIiwKKyAgIkdFVFRBQlVQIiwKKyAgIkdFVFRBQkxFIiwKKyAgIlNFVFRBQlVQIiwKKyAgIlNFVFVQVkFMIiwKKyAgIlNFVFRBQkxFIiwKKyAgIk5FV1RBQkxFIiwKKyAgIlNFTEYiLAorICAiQUREIiwKKyAgIlNVQiIsCisgICJNVUwiLAorICAiRElWIiwKKyAgIk1PRCIsCisgICJQT1ciLAorICAiVU5NIiwKKyAgIk5PVCIsCisgICJMRU4iLAorICAiQ09OQ0FUIiwKKyAgIkpNUCIsCisgICJFUSIsCisgICJMVCIsCisgICJMRSIsCisgICJURVNUIiwKKyAgIlRFU1RTRVQiLAorICAiQ0FMTCIsCisgICJUQUlMQ0FMTCIsCisgICJSRVRVUk4iLAorICAiRk9STE9PUCIsCisgICJGT1JQUkVQIiwKKyAgIlRGT1JDQUxMIiwKKyAgIlRGT1JMT09QIiwKKyAgIlNFVExJU1QiLAorICAiQ0xPU1VSRSIsCisgICJWQVJBUkciLAorICAiRVhUUkFBUkciLAorICBOVUxMCit9OworCisKKyNkZWZpbmUgb3Btb2RlKHQsYSxiLGMsbSkgKCgodCk8PDcpIHwgKChhKTw8NikgfCAoKGIpPDw0KSB8ICgoYyk8PDIpIHwgKG0pKQorCitMVUFJX0RERUYgY29uc3QgbHVfYnl0ZSBsdWFQX29wbW9kZXNbTlVNX09QQ09ERVNdID0geworLyogICAgICAgVCAgQSAgICBCICAgICAgIEMgICAgIG1vZGUJCSAgIG9wY29kZQkqLworICBvcG1vZGUoMCwgMSwgT3BBcmdSLCBPcEFyZ04sIGlBQkMpCQkvKiBPUF9NT1ZFICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ0ssIE9wQXJnTiwgaUFCeCkJCS8qIE9QX0xPQURLICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ04sIE9wQXJnTiwgaUFCeCkJCS8qIE9QX0xPQURLWCAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdVLCBPcEFyZ1UsIGlBQkMpCQkvKiBPUF9MT0FEQk9PTCAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdVLCBPcEFyZ04sIGlBQkMpCQkvKiBPUF9MT0FETklMICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1UsIE9wQXJnTiwgaUFCQykJCS8qIE9QX0dFVFVQVkFMICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1UsIE9wQXJnSywgaUFCQykJCS8qIE9QX0dFVFRBQlVQICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnSywgaUFCQykJCS8qIE9QX0dFVFRBQkxFICovCisgLG9wbW9kZSgwLCAwLCBPcEFyZ0ssIE9wQXJnSywgaUFCQykJCS8qIE9QX1NFVFRBQlVQICovCisgLG9wbW9kZSgwLCAwLCBPcEFyZ1UsIE9wQXJnTiwgaUFCQykJCS8qIE9QX1NFVFVQVkFMICovCisgLG9wbW9kZSgwLCAwLCBPcEFyZ0ssIE9wQXJnSywgaUFCQykJCS8qIE9QX1NFVFRBQkxFICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1UsIE9wQXJnVSwgaUFCQykJCS8qIE9QX05FV1RBQkxFICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnSywgaUFCQykJCS8qIE9QX1NFTEYgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnSywgT3BBcmdLLCBpQUJDKQkJLyogT1BfQUREICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ0ssIE9wQXJnSywgaUFCQykJCS8qIE9QX1NVQiAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdLLCBPcEFyZ0ssIGlBQkMpCQkvKiBPUF9NVUwgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnSywgT3BBcmdLLCBpQUJDKQkJLyogT1BfRElWICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ0ssIE9wQXJnSywgaUFCQykJCS8qIE9QX01PRCAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdLLCBPcEFyZ0ssIGlBQkMpCQkvKiBPUF9QT1cgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnUiwgT3BBcmdOLCBpQUJDKQkJLyogT1BfVU5NICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnTiwgaUFCQykJCS8qIE9QX05PVCAqLworICxvcG1vZGUoMCwgMSwgT3BBcmdSLCBPcEFyZ04sIGlBQkMpCQkvKiBPUF9MRU4gKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnUiwgT3BBcmdSLCBpQUJDKQkJLyogT1BfQ09OQ0FUICovCisgLG9wbW9kZSgwLCAwLCBPcEFyZ1IsIE9wQXJnTiwgaUFzQngpCQkvKiBPUF9KTVAgKi8KKyAsb3Btb2RlKDEsIDAsIE9wQXJnSywgT3BBcmdLLCBpQUJDKQkJLyogT1BfRVEgKi8KKyAsb3Btb2RlKDEsIDAsIE9wQXJnSywgT3BBcmdLLCBpQUJDKQkJLyogT1BfTFQgKi8KKyAsb3Btb2RlKDEsIDAsIE9wQXJnSywgT3BBcmdLLCBpQUJDKQkJLyogT1BfTEUgKi8KKyAsb3Btb2RlKDEsIDAsIE9wQXJnTiwgT3BBcmdVLCBpQUJDKQkJLyogT1BfVEVTVCAqLworICxvcG1vZGUoMSwgMSwgT3BBcmdSLCBPcEFyZ1UsIGlBQkMpCQkvKiBPUF9URVNUU0VUICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1UsIE9wQXJnVSwgaUFCQykJCS8qIE9QX0NBTEwgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnVSwgT3BBcmdVLCBpQUJDKQkJLyogT1BfVEFJTENBTEwgKi8KKyAsb3Btb2RlKDAsIDAsIE9wQXJnVSwgT3BBcmdOLCBpQUJDKQkJLyogT1BfUkVUVVJOICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnTiwgaUFzQngpCQkvKiBPUF9GT1JMT09QICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnTiwgaUFzQngpCQkvKiBPUF9GT1JQUkVQICovCisgLG9wbW9kZSgwLCAwLCBPcEFyZ04sIE9wQXJnVSwgaUFCQykJCS8qIE9QX1RGT1JDQUxMICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1IsIE9wQXJnTiwgaUFzQngpCQkvKiBPUF9URk9STE9PUCAqLworICxvcG1vZGUoMCwgMCwgT3BBcmdVLCBPcEFyZ1UsIGlBQkMpCQkvKiBPUF9TRVRMSVNUICovCisgLG9wbW9kZSgwLCAxLCBPcEFyZ1UsIE9wQXJnTiwgaUFCeCkJCS8qIE9QX0NMT1NVUkUgKi8KKyAsb3Btb2RlKDAsIDEsIE9wQXJnVSwgT3BBcmdOLCBpQUJDKQkJLyogT1BfVkFSQVJHICovCisgLG9wbW9kZSgwLCAwLCBPcEFyZ1UsIE9wQXJnVSwgaUF4KQkJLyogT1BfRVhUUkFBUkcgKi8KK307CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbG9wY29kZXMuaCBiL2NvbTMyL2x1YS9zcmMvbG9wY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWY1NzkxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sb3Bjb2Rlcy5oCkBAIC0wLDAgKzEsMjg4IEBACisvKgorKiogJElkOiBsb3Bjb2Rlcy5oLHYgMS4xNDIuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogT3Bjb2RlcyBmb3IgTHVhIHZpcnR1YWwgbWFjaGluZQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbG9wY29kZXNfaAorI2RlZmluZSBsb3Bjb2Rlc19oCisKKyNpbmNsdWRlICJsbGltaXRzLmgiCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgV2UgYXNzdW1lIHRoYXQgaW5zdHJ1Y3Rpb25zIGFyZSB1bnNpZ25lZCBudW1iZXJzLgorICBBbGwgaW5zdHJ1Y3Rpb25zIGhhdmUgYW4gb3Bjb2RlIGluIHRoZSBmaXJzdCA2IGJpdHMuCisgIEluc3RydWN0aW9ucyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGZpZWxkczoKKwlgQScgOiA4IGJpdHMKKwlgQicgOiA5IGJpdHMKKwlgQycgOiA5IGJpdHMKKwknQXgnIDogMjYgYml0cyAoJ0EnLCAnQicsIGFuZCAnQycgdG9nZXRoZXIpCisJYEJ4JyA6IDE4IGJpdHMgKGBCJyBhbmQgYEMnIHRvZ2V0aGVyKQorCWBzQngnIDogc2lnbmVkIEJ4CisKKyAgQSBzaWduZWQgYXJndW1lbnQgaXMgcmVwcmVzZW50ZWQgaW4gZXhjZXNzIEs7IHRoYXQgaXMsIHRoZSBudW1iZXIKKyAgdmFsdWUgaXMgdGhlIHVuc2lnbmVkIHZhbHVlIG1pbnVzIEsuIEsgaXMgZXhhY3RseSB0aGUgbWF4aW11bSB2YWx1ZQorICBmb3IgdGhhdCBhcmd1bWVudCAoc28gdGhhdCAtbWF4IGlzIHJlcHJlc2VudGVkIGJ5IDAsIGFuZCArbWF4IGlzCisgIHJlcHJlc2VudGVkIGJ5IDIqbWF4KSwgd2hpY2ggaXMgaGFsZiB0aGUgbWF4aW11bSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKKyAgdW5zaWduZWQgYXJndW1lbnQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKK2VudW0gT3BNb2RlIHtpQUJDLCBpQUJ4LCBpQXNCeCwgaUF4fTsgIC8qIGJhc2ljIGluc3RydWN0aW9uIGZvcm1hdCAqLworCisKKy8qCisqKiBzaXplIGFuZCBwb3NpdGlvbiBvZiBvcGNvZGUgYXJndW1lbnRzLgorKi8KKyNkZWZpbmUgU0laRV9DCQk5CisjZGVmaW5lIFNJWkVfQgkJOQorI2RlZmluZSBTSVpFX0J4CQkoU0laRV9DICsgU0laRV9CKQorI2RlZmluZSBTSVpFX0EJCTgKKyNkZWZpbmUgU0laRV9BeAkJKFNJWkVfQyArIFNJWkVfQiArIFNJWkVfQSkKKworI2RlZmluZSBTSVpFX09QCQk2CisKKyNkZWZpbmUgUE9TX09QCQkwCisjZGVmaW5lIFBPU19BCQkoUE9TX09QICsgU0laRV9PUCkKKyNkZWZpbmUgUE9TX0MJCShQT1NfQSArIFNJWkVfQSkKKyNkZWZpbmUgUE9TX0IJCShQT1NfQyArIFNJWkVfQykKKyNkZWZpbmUgUE9TX0J4CQlQT1NfQworI2RlZmluZSBQT1NfQXgJCVBPU19BCisKKworLyoKKyoqIGxpbWl0cyBmb3Igb3Bjb2RlIGFyZ3VtZW50cy4KKyoqIHdlIHVzZSAoc2lnbmVkKSBpbnQgdG8gbWFuaXB1bGF0ZSBtb3N0IGFyZ3VtZW50cywKKyoqIHNvIHRoZXkgbXVzdCBmaXQgaW4gTFVBSV9CSVRTSU5ULTEgYml0cyAoLTEgZm9yIHNpZ24pCisqLworI2lmIFNJWkVfQnggPCBMVUFJX0JJVFNJTlQtMQorI2RlZmluZSBNQVhBUkdfQnggICAgICAgICgoMTw8U0laRV9CeCktMSkKKyNkZWZpbmUgTUFYQVJHX3NCeCAgICAgICAgKE1BWEFSR19CeD4+MSkgICAgICAgICAvKiBgc0J4JyBpcyBzaWduZWQgKi8KKyNlbHNlCisjZGVmaW5lIE1BWEFSR19CeCAgICAgICAgTUFYX0lOVAorI2RlZmluZSBNQVhBUkdfc0J4ICAgICAgICBNQVhfSU5UCisjZW5kaWYKKworI2lmIFNJWkVfQXggPCBMVUFJX0JJVFNJTlQtMQorI2RlZmluZSBNQVhBUkdfQXgJKCgxPDxTSVpFX0F4KS0xKQorI2Vsc2UKKyNkZWZpbmUgTUFYQVJHX0F4CU1BWF9JTlQKKyNlbmRpZgorCisKKyNkZWZpbmUgTUFYQVJHX0EgICAgICAgICgoMTw8U0laRV9BKS0xKQorI2RlZmluZSBNQVhBUkdfQiAgICAgICAgKCgxPDxTSVpFX0IpLTEpCisjZGVmaW5lIE1BWEFSR19DICAgICAgICAoKDE8PFNJWkVfQyktMSkKKworCisvKiBjcmVhdGVzIGEgbWFzayB3aXRoIGBuJyAxIGJpdHMgYXQgcG9zaXRpb24gYHAnICovCisjZGVmaW5lIE1BU0sxKG4scCkJKCh+KCh+KEluc3RydWN0aW9uKTApPDwobikpKTw8KHApKQorCisvKiBjcmVhdGVzIGEgbWFzayB3aXRoIGBuJyAwIGJpdHMgYXQgcG9zaXRpb24gYHAnICovCisjZGVmaW5lIE1BU0swKG4scCkJKH5NQVNLMShuLHApKQorCisvKgorKiogdGhlIGZvbGxvd2luZyBtYWNyb3MgaGVscCB0byBtYW5pcHVsYXRlIGluc3RydWN0aW9ucworKi8KKworI2RlZmluZSBHRVRfT1BDT0RFKGkpCShjYXN0KE9wQ29kZSwgKChpKT4+UE9TX09QKSAmIE1BU0sxKFNJWkVfT1AsMCkpKQorI2RlZmluZSBTRVRfT1BDT0RFKGksbykJKChpKSA9ICgoKGkpJk1BU0swKFNJWkVfT1AsUE9TX09QKSkgfCBcCisJCSgoY2FzdChJbnN0cnVjdGlvbiwgbyk8PFBPU19PUCkmTUFTSzEoU0laRV9PUCxQT1NfT1ApKSkpCisKKyNkZWZpbmUgZ2V0YXJnKGkscG9zLHNpemUpCShjYXN0KGludCwgKChpKT4+cG9zKSAmIE1BU0sxKHNpemUsMCkpKQorI2RlZmluZSBzZXRhcmcoaSx2LHBvcyxzaXplKQkoKGkpID0gKCgoaSkmTUFTSzAoc2l6ZSxwb3MpKSB8IFwKKyAgICAgICAgICAgICAgICAoKGNhc3QoSW5zdHJ1Y3Rpb24sIHYpPDxwb3MpJk1BU0sxKHNpemUscG9zKSkpKQorCisjZGVmaW5lIEdFVEFSR19BKGkpCWdldGFyZyhpLCBQT1NfQSwgU0laRV9BKQorI2RlZmluZSBTRVRBUkdfQShpLHYpCXNldGFyZyhpLCB2LCBQT1NfQSwgU0laRV9BKQorCisjZGVmaW5lIEdFVEFSR19CKGkpCWdldGFyZyhpLCBQT1NfQiwgU0laRV9CKQorI2RlZmluZSBTRVRBUkdfQihpLHYpCXNldGFyZyhpLCB2LCBQT1NfQiwgU0laRV9CKQorCisjZGVmaW5lIEdFVEFSR19DKGkpCWdldGFyZyhpLCBQT1NfQywgU0laRV9DKQorI2RlZmluZSBTRVRBUkdfQyhpLHYpCXNldGFyZyhpLCB2LCBQT1NfQywgU0laRV9DKQorCisjZGVmaW5lIEdFVEFSR19CeChpKQlnZXRhcmcoaSwgUE9TX0J4LCBTSVpFX0J4KQorI2RlZmluZSBTRVRBUkdfQngoaSx2KQlzZXRhcmcoaSwgdiwgUE9TX0J4LCBTSVpFX0J4KQorCisjZGVmaW5lIEdFVEFSR19BeChpKQlnZXRhcmcoaSwgUE9TX0F4LCBTSVpFX0F4KQorI2RlZmluZSBTRVRBUkdfQXgoaSx2KQlzZXRhcmcoaSwgdiwgUE9TX0F4LCBTSVpFX0F4KQorCisjZGVmaW5lIEdFVEFSR19zQngoaSkJKEdFVEFSR19CeChpKS1NQVhBUkdfc0J4KQorI2RlZmluZSBTRVRBUkdfc0J4KGksYikJU0VUQVJHX0J4KChpKSxjYXN0KHVuc2lnbmVkIGludCwgKGIpK01BWEFSR19zQngpKQorCisKKyNkZWZpbmUgQ1JFQVRFX0FCQyhvLGEsYixjKQkoKGNhc3QoSW5zdHJ1Y3Rpb24sIG8pPDxQT1NfT1ApIFwKKwkJCXwgKGNhc3QoSW5zdHJ1Y3Rpb24sIGEpPDxQT1NfQSkgXAorCQkJfCAoY2FzdChJbnN0cnVjdGlvbiwgYik8PFBPU19CKSBcCisJCQl8IChjYXN0KEluc3RydWN0aW9uLCBjKTw8UE9TX0MpKQorCisjZGVmaW5lIENSRUFURV9BQngobyxhLGJjKQkoKGNhc3QoSW5zdHJ1Y3Rpb24sIG8pPDxQT1NfT1ApIFwKKwkJCXwgKGNhc3QoSW5zdHJ1Y3Rpb24sIGEpPDxQT1NfQSkgXAorCQkJfCAoY2FzdChJbnN0cnVjdGlvbiwgYmMpPDxQT1NfQngpKQorCisjZGVmaW5lIENSRUFURV9BeChvLGEpCQkoKGNhc3QoSW5zdHJ1Y3Rpb24sIG8pPDxQT1NfT1ApIFwKKwkJCXwgKGNhc3QoSW5zdHJ1Y3Rpb24sIGEpPDxQT1NfQXgpKQorCisKKy8qCisqKiBNYWNyb3MgdG8gb3BlcmF0ZSBSSyBpbmRpY2VzCisqLworCisvKiB0aGlzIGJpdCAxIG1lYW5zIGNvbnN0YW50ICgwIG1lYW5zIHJlZ2lzdGVyKSAqLworI2RlZmluZSBCSVRSSwkJKDEgPDwgKFNJWkVfQiAtIDEpKQorCisvKiB0ZXN0IHdoZXRoZXIgdmFsdWUgaXMgYSBjb25zdGFudCAqLworI2RlZmluZSBJU0soeCkJCSgoeCkgJiBCSVRSSykKKworLyogZ2V0cyB0aGUgaW5kZXggb2YgdGhlIGNvbnN0YW50ICovCisjZGVmaW5lIElOREVYSyhyKQkoKGludCkocikgJiB+QklUUkspCisKKyNkZWZpbmUgTUFYSU5ERVhSSwkoQklUUksgLSAxKQorCisvKiBjb2RlIGEgY29uc3RhbnQgaW5kZXggYXMgYSBSSyB2YWx1ZSAqLworI2RlZmluZSBSS0FTSyh4KQkoKHgpIHwgQklUUkspCisKKworLyoKKyoqIGludmFsaWQgcmVnaXN0ZXIgdGhhdCBmaXRzIGluIDggYml0cworKi8KKyNkZWZpbmUgTk9fUkVHCQlNQVhBUkdfQQorCisKKy8qCisqKiBSKHgpIC0gcmVnaXN0ZXIKKyoqIEtzdCh4KSAtIGNvbnN0YW50IChpbiBjb25zdGFudCB0YWJsZSkKKyoqIFJLKHgpID09IGlmIElTSyh4KSB0aGVuIEtzdChJTkRFWEsoeCkpIGVsc2UgUih4KQorKi8KKworCisvKgorKiogZ3JlcCAiT1JERVIgT1AiIGlmIHlvdSBjaGFuZ2UgdGhlc2UgZW51bXMKKyovCisKK3R5cGVkZWYgZW51bSB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWUJCWFyZ3MJZGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitPUF9NT1ZFLC8qCUEgQglSKEEpIDo9IFIoQikJCQkJCSovCitPUF9MT0FESywvKglBIEJ4CVIoQSkgOj0gS3N0KEJ4KQkJCQkJKi8KK09QX0xPQURLWCwvKglBIAlSKEEpIDo9IEtzdChleHRyYSBhcmcpCQkJCSovCitPUF9MT0FEQk9PTCwvKglBIEIgQwlSKEEpIDo9IChCb29sKUI7IGlmIChDKSBwYysrCQkJKi8KK09QX0xPQUROSUwsLyoJQSBCCVIoQSksIFIoQSsxKSwgLi4uLCBSKEErQikgOj0gbmlsCQkqLworT1BfR0VUVVBWQUwsLyoJQSBCCVIoQSkgOj0gVXBWYWx1ZVtCXQkJCQkqLworCitPUF9HRVRUQUJVUCwvKglBIEIgQwlSKEEpIDo9IFVwVmFsdWVbQl1bUksoQyldCQkJKi8KK09QX0dFVFRBQkxFLC8qCUEgQiBDCVIoQSkgOj0gUihCKVtSSyhDKV0JCQkJKi8KKworT1BfU0VUVEFCVVAsLyoJQSBCIEMJVXBWYWx1ZVtBXVtSSyhCKV0gOj0gUksoQykJCQkqLworT1BfU0VUVVBWQUwsLyoJQSBCCVVwVmFsdWVbQl0gOj0gUihBKQkJCQkqLworT1BfU0VUVEFCTEUsLyoJQSBCIEMJUihBKVtSSyhCKV0gOj0gUksoQykJCQkJKi8KKworT1BfTkVXVEFCTEUsLyoJQSBCIEMJUihBKSA6PSB7fSAoc2l6ZSA9IEIsQykJCQkJKi8KKworT1BfU0VMRiwvKglBIEIgQwlSKEErMSkgOj0gUihCKTsgUihBKSA6PSBSKEIpW1JLKEMpXQkJKi8KKworT1BfQURELC8qCUEgQiBDCVIoQSkgOj0gUksoQikgKyBSSyhDKQkJCQkqLworT1BfU1VCLC8qCUEgQiBDCVIoQSkgOj0gUksoQikgLSBSSyhDKQkJCQkqLworT1BfTVVMLC8qCUEgQiBDCVIoQSkgOj0gUksoQikgKiBSSyhDKQkJCQkqLworT1BfRElWLC8qCUEgQiBDCVIoQSkgOj0gUksoQikgLyBSSyhDKQkJCQkqLworT1BfTU9ELC8qCUEgQiBDCVIoQSkgOj0gUksoQikgJSBSSyhDKQkJCQkqLworT1BfUE9XLC8qCUEgQiBDCVIoQSkgOj0gUksoQikgXiBSSyhDKQkJCQkqLworT1BfVU5NLC8qCUEgQglSKEEpIDo9IC1SKEIpCQkJCQkqLworT1BfTk9ULC8qCUEgQglSKEEpIDo9IG5vdCBSKEIpCQkJCSovCitPUF9MRU4sLyoJQSBCCVIoQSkgOj0gbGVuZ3RoIG9mIFIoQikJCQkJKi8KKworT1BfQ09OQ0FULC8qCUEgQiBDCVIoQSkgOj0gUihCKS4uIC4uLiAuLlIoQykJCQkqLworCitPUF9KTVAsLyoJQSBzQngJcGMrPXNCeDsgaWYgKEEpIGNsb3NlIGFsbCB1cHZhbHVlcyA+PSBSKEEpICsgMQkqLworT1BfRVEsLyoJQSBCIEMJaWYgKChSSyhCKSA9PSBSSyhDKSkgfj0gQSkgdGhlbiBwYysrCQkqLworT1BfTFQsLyoJQSBCIEMJaWYgKChSSyhCKSA8ICBSSyhDKSkgfj0gQSkgdGhlbiBwYysrCQkqLworT1BfTEUsLyoJQSBCIEMJaWYgKChSSyhCKSA8PSBSSyhDKSkgfj0gQSkgdGhlbiBwYysrCQkqLworCitPUF9URVNULC8qCUEgQwlpZiBub3QgKFIoQSkgPD0+IEMpIHRoZW4gcGMrKwkJCSovCitPUF9URVNUU0VULC8qCUEgQiBDCWlmIChSKEIpIDw9PiBDKSB0aGVuIFIoQSkgOj0gUihCKSBlbHNlIHBjKysJKi8KKworT1BfQ0FMTCwvKglBIEIgQwlSKEEpLCAuLi4gLFIoQStDLTIpIDo9IFIoQSkoUihBKzEpLCAuLi4gLFIoQStCLTEpKSAqLworT1BfVEFJTENBTEwsLyoJQSBCIEMJcmV0dXJuIFIoQSkoUihBKzEpLCAuLi4gLFIoQStCLTEpKQkJKi8KK09QX1JFVFVSTiwvKglBIEIJcmV0dXJuIFIoQSksIC4uLiAsUihBK0ItMikJKHNlZSBub3RlKQkqLworCitPUF9GT1JMT09QLC8qCUEgc0J4CVIoQSkrPVIoQSsyKTsKKwkJCWlmIFIoQSkgPD89IFIoQSsxKSB0aGVuIHsgcGMrPXNCeDsgUihBKzMpPVIoQSkgfSovCitPUF9GT1JQUkVQLC8qCUEgc0J4CVIoQSktPVIoQSsyKTsgcGMrPXNCeAkJCQkqLworCitPUF9URk9SQ0FMTCwvKglBIEMJUihBKzMpLCAuLi4gLFIoQSsyK0MpIDo9IFIoQSkoUihBKzEpLCBSKEErMikpOwkqLworT1BfVEZPUkxPT1AsLyoJQSBzQngJaWYgUihBKzEpIH49IG5pbCB0aGVuIHsgUihBKT1SKEErMSk7IHBjICs9IHNCeCB9Ki8KKworT1BfU0VUTElTVCwvKglBIEIgQwlSKEEpWyhDLTEpKkZQRitpXSA6PSBSKEEraSksIDEgPD0gaSA8PSBCCSovCisKK09QX0NMT1NVUkUsLyoJQSBCeAlSKEEpIDo9IGNsb3N1cmUoS1BST1RPW0J4XSkJCQkqLworCitPUF9WQVJBUkcsLyoJQSBCCVIoQSksIFIoQSsxKSwgLi4uLCBSKEErQi0yKSA9IHZhcmFyZwkJKi8KKworT1BfRVhUUkFBUkcvKglBeAlleHRyYSAobGFyZ2VyKSBhcmd1bWVudCBmb3IgcHJldmlvdXMgb3Bjb2RlCSovCit9IE9wQ29kZTsKKworCisjZGVmaW5lIE5VTV9PUENPREVTCShjYXN0KGludCwgT1BfRVhUUkFBUkcpICsgMSkKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE5vdGVzOgorICAoKikgSW4gT1BfQ0FMTCwgaWYgKEIgPT0gMCkgdGhlbiBCID0gdG9wLiBJZiAoQyA9PSAwKSwgdGhlbiBgdG9wJyBpcworICBzZXQgdG8gbGFzdF9yZXN1bHQrMSwgc28gbmV4dCBvcGVuIGluc3RydWN0aW9uIChPUF9DQUxMLCBPUF9SRVRVUk4sCisgIE9QX1NFVExJU1QpIG1heSB1c2UgYHRvcCcuCisKKyAgKCopIEluIE9QX1ZBUkFSRywgaWYgKEIgPT0gMCkgdGhlbiB1c2UgYWN0dWFsIG51bWJlciBvZiB2YXJhcmdzIGFuZAorICBzZXQgdG9wIChsaWtlIGluIE9QX0NBTEwgd2l0aCBDID09IDApLgorCisgICgqKSBJbiBPUF9SRVRVUk4sIGlmIChCID09IDApIHRoZW4gcmV0dXJuIHVwIHRvIGB0b3AnLgorCisgICgqKSBJbiBPUF9TRVRMSVNULCBpZiAoQiA9PSAwKSB0aGVuIEIgPSBgdG9wJzsgaWYgKEMgPT0gMCkgdGhlbiBuZXh0CisgICdpbnN0cnVjdGlvbicgaXMgRVhUUkFBUkcocmVhbCBDKS4KKworICAoKikgSW4gT1BfTE9BREtYLCB0aGUgbmV4dCAnaW5zdHJ1Y3Rpb24nIGlzIGFsd2F5cyBFWFRSQUFSRy4KKworICAoKikgRm9yIGNvbXBhcmlzb25zLCBBIHNwZWNpZmllcyB3aGF0IGNvbmRpdGlvbiB0aGUgdGVzdCBzaG91bGQgYWNjZXB0CisgICh0cnVlIG9yIGZhbHNlKS4KKworICAoKikgQWxsIGBza2lwcycgKHBjKyspIGFzc3VtZSB0aGF0IG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBqdW1wLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qCisqKiBtYXNrcyBmb3IgaW5zdHJ1Y3Rpb24gcHJvcGVydGllcy4gVGhlIGZvcm1hdCBpczoKKyoqIGJpdHMgMC0xOiBvcCBtb2RlCisqKiBiaXRzIDItMzogQyBhcmcgbW9kZQorKiogYml0cyA0LTU6IEIgYXJnIG1vZGUKKyoqIGJpdCA2OiBpbnN0cnVjdGlvbiBzZXQgcmVnaXN0ZXIgQQorKiogYml0IDc6IG9wZXJhdG9yIGlzIGEgdGVzdCAobmV4dCBpbnN0cnVjdGlvbiBtdXN0IGJlIGEganVtcCkKKyovCisKK2VudW0gT3BBcmdNYXNrIHsKKyAgT3BBcmdOLCAgLyogYXJndW1lbnQgaXMgbm90IHVzZWQgKi8KKyAgT3BBcmdVLCAgLyogYXJndW1lbnQgaXMgdXNlZCAqLworICBPcEFyZ1IsICAvKiBhcmd1bWVudCBpcyBhIHJlZ2lzdGVyIG9yIGEganVtcCBvZmZzZXQgKi8KKyAgT3BBcmdLICAgLyogYXJndW1lbnQgaXMgYSBjb25zdGFudCBvciByZWdpc3Rlci9jb25zdGFudCAqLworfTsKKworTFVBSV9EREVDIGNvbnN0IGx1X2J5dGUgbHVhUF9vcG1vZGVzW05VTV9PUENPREVTXTsKKworI2RlZmluZSBnZXRPcE1vZGUobSkJKGNhc3QoZW51bSBPcE1vZGUsIGx1YVBfb3Btb2Rlc1ttXSAmIDMpKQorI2RlZmluZSBnZXRCTW9kZShtKQkoY2FzdChlbnVtIE9wQXJnTWFzaywgKGx1YVBfb3Btb2Rlc1ttXSA+PiA0KSAmIDMpKQorI2RlZmluZSBnZXRDTW9kZShtKQkoY2FzdChlbnVtIE9wQXJnTWFzaywgKGx1YVBfb3Btb2Rlc1ttXSA+PiAyKSAmIDMpKQorI2RlZmluZSB0ZXN0QU1vZGUobSkJKGx1YVBfb3Btb2Rlc1ttXSAmICgxIDw8IDYpKQorI2RlZmluZSB0ZXN0VE1vZGUobSkJKGx1YVBfb3Btb2Rlc1ttXSAmICgxIDw8IDcpKQorCisKK0xVQUlfRERFQyBjb25zdCBjaGFyICpjb25zdCBsdWFQX29wbmFtZXNbTlVNX09QQ09ERVMrMV07ICAvKiBvcGNvZGUgbmFtZXMgKi8KKworCisvKiBudW1iZXIgb2YgbGlzdCBpdGVtcyB0byBhY2N1bXVsYXRlIGJlZm9yZSBhIFNFVExJU1QgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgTEZJRUxEU19QRVJfRkxVU0gJNTAKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbG9zbGliLmMgYi9jb20zMi9sdWEvc3JjL2xvc2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTMxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xvc2xpYi5jCkBAIC0wLDAgKzEsMzM3IEBACisvKgorKiogJElkOiBsb3NsaWIuYyx2IDEuNDAuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogU3RhbmRhcmQgT3BlcmF0aW5nIFN5c3RlbSBsaWJyYXJ5CisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZm5kZWYgU1lTTElOVVgKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2RlZmluZSBsb3NsaWJfYworI2RlZmluZSBMVUFfTElCCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxhdXhsaWIuaCIKKyNpbmNsdWRlICJsdWFsaWIuaCIKKworCisjaWZuZGVmIFNZU0xJTlVYCisvKgorKiogbGlzdCBvZiB2YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllcnMgZm9yIHRoZSAnc3RyZnRpbWUnIGZ1bmN0aW9uCisqLworI2lmICFkZWZpbmVkKExVQV9TVFJGVElNRU9QVElPTlMpCisKKyNpZiAhZGVmaW5lZChMVUFfVVNFX1BPU0lYKQorI2RlZmluZSBMVUFfU1RSRlRJTUVPUFRJT05TCXsgImFBYkJjZEhJam1NcFNVd1d4WHlZeiUiLCAiIiB9CisjZWxzZQorI2RlZmluZSBMVUFfU1RSRlRJTUVPUFRJT05TIFwKKwl7ICJhQWJCY0NkRGVGZ0doSElqbU1ucHJSU3RUdVVWd1d4WHlZelolIiwgIiIgXAorCSAgIiIsICJFIiwgImNDeFh5WSIsICBcCisJICAiTyIsICJkZUhJbU1TdVVWd1d5IiB9CisjZW5kaWYKKworI2VuZGlmCisKKworCisvKgorKiogQnkgZGVmYXVsdCwgTHVhIHVzZXMgdG1wbmFtIGV4Y2VwdCB3aGVuIFBPU0lYIGlzIGF2YWlsYWJsZSwgd2hlcmUgaXQKKyoqIHVzZXMgbWtzdGVtcC4KKyovCisjaWYgZGVmaW5lZChMVUFfVVNFX01LU1RFTVApCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZGVmaW5lIExVQV9UTVBOQU1CVUZTSVpFCTMyCisjZGVmaW5lIGx1YV90bXBuYW0oYixlKSB7IFwKKyAgICAgICAgc3RyY3B5KGIsICIvdG1wL2x1YV9YWFhYWFgiKTsgXAorICAgICAgICBlID0gbWtzdGVtcChiKTsgXAorICAgICAgICBpZiAoZSAhPSAtMSkgY2xvc2UoZSk7IFwKKyAgICAgICAgZSA9IChlID09IC0xKTsgfQorCisjZWxpZiAhZGVmaW5lZChsdWFfdG1wbmFtKQorCisjZGVmaW5lIExVQV9UTVBOQU1CVUZTSVpFCUxfdG1wbmFtCisjZGVmaW5lIGx1YV90bXBuYW0oYixlKQkJeyBlID0gKHRtcG5hbShiKSA9PSBOVUxMKTsgfQorCisjZW5kaWYKKworCisvKgorKiogQnkgZGVmYXVsdCwgTHVhIHVzZXMgZ210aW1lL2xvY2FsdGltZSwgZXhjZXB0IHdoZW4gUE9TSVggaXMgYXZhaWxhYmxlLAorKiogd2hlcmUgaXQgdXNlcyBnbXRpbWVfci9sb2NhbHRpbWVfcgorKi8KKyNpZiBkZWZpbmVkKExVQV9VU0VfR01USU1FX1IpCisKKyNkZWZpbmUgbF9nbXRpbWUodCxyKQkJZ210aW1lX3IodCxyKQorI2RlZmluZSBsX2xvY2FsdGltZSh0LHIpCWxvY2FsdGltZV9yKHQscikKKworI2VsaWYgIWRlZmluZWQobF9nbXRpbWUpCisKKyNkZWZpbmUgbF9nbXRpbWUodCxyKQkJKCh2b2lkKXIsIGdtdGltZSh0KSkKKyNkZWZpbmUgbF9sb2NhbHRpbWUodCxyKSAgCSgodm9pZClyLCBsb2NhbHRpbWUodCkpCisKKyNlbmRpZgorCisKKworc3RhdGljIGludCBvc19leGVjdXRlIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqY21kID0gbHVhTF9vcHRzdHJpbmcoTCwgMSwgTlVMTCk7CisgIGludCBzdGF0ID0gc3lzdGVtKGNtZCk7CisgIGlmIChjbWQgIT0gTlVMTCkKKyAgICByZXR1cm4gbHVhTF9leGVjcmVzdWx0KEwsIHN0YXQpOworICBlbHNlIHsKKyAgICBsdWFfcHVzaGJvb2xlYW4oTCwgc3RhdCk7ICAvKiB0cnVlIGlmIHRoZXJlIGlzIGEgc2hlbGwgKi8KKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgb3NfcmVtb3ZlIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICByZXR1cm4gbHVhTF9maWxlcmVzdWx0KEwsIHJlbW92ZShmaWxlbmFtZSkgPT0gMCwgZmlsZW5hbWUpOworfQorCisKK3N0YXRpYyBpbnQgb3NfcmVuYW1lIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZnJvbW5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICBjb25zdCBjaGFyICp0b25hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworICByZXR1cm4gbHVhTF9maWxlcmVzdWx0KEwsIHJlbmFtZShmcm9tbmFtZSwgdG9uYW1lKSA9PSAwLCBOVUxMKTsKK30KKworCitzdGF0aWMgaW50IG9zX3RtcG5hbWUgKGx1YV9TdGF0ZSAqTCkgeworICBjaGFyIGJ1ZmZbTFVBX1RNUE5BTUJVRlNJWkVdOworICBpbnQgZXJyOworICBsdWFfdG1wbmFtKGJ1ZmYsIGVycik7CisgIGlmIChlcnIpCisgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgInVuYWJsZSB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBmaWxlbmFtZSIpOworICBsdWFfcHVzaHN0cmluZyhMLCBidWZmKTsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogU1lTTElOVVggKi8KKworCitzdGF0aWMgaW50IG9zX2dldGVudiAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNoc3RyaW5nKEwsIGdldGVudihsdWFMX2NoZWNrc3RyaW5nKEwsIDEpKSk7ICAvKiBpZiBOVUxMIHB1c2ggbmlsICovCisgIHJldHVybiAxOworfQorCisKKyNpZm5kZWYgU1lTTElOVVgKK3N0YXRpYyBpbnQgb3NfY2xvY2sgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG51bWJlcihMLCAoKGx1YV9OdW1iZXIpY2xvY2soKSkvKGx1YV9OdW1iZXIpQ0xPQ0tTX1BFUl9TRUMpOworICByZXR1cm4gMTsKK30KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogVGltZS9EYXRlIG9wZXJhdGlvbnMKKyoqIHsgeWVhcj0lWSwgbW9udGg9JW0sIGRheT0lZCwgaG91cj0lSCwgbWluPSVNLCBzZWM9JVMsCisqKiAgIHdkYXk9JXcrMSwgeWRheT0laiwgaXNkc3Q9PyB9CisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgdm9pZCBzZXRmaWVsZCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICprZXksIGludCB2YWx1ZSkgeworICBsdWFfcHVzaGludGVnZXIoTCwgdmFsdWUpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsIGtleSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGJvb2xmaWVsZCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICprZXksIGludCB2YWx1ZSkgeworICBpZiAodmFsdWUgPCAwKSAgLyogdW5kZWZpbmVkPyAqLworICAgIHJldHVybjsgIC8qIGRvZXMgbm90IHNldCBmaWVsZCAqLworICBsdWFfcHVzaGJvb2xlYW4oTCwgdmFsdWUpOworICBsdWFfc2V0ZmllbGQoTCwgLTIsIGtleSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0Ym9vbGZpZWxkIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmtleSkgeworICBpbnQgcmVzOworICBsdWFfZ2V0ZmllbGQoTCwgLTEsIGtleSk7CisgIHJlcyA9IGx1YV9pc25pbChMLCAtMSkgPyAtMSA6IGx1YV90b2Jvb2xlYW4oTCwgLTEpOworICBsdWFfcG9wKEwsIDEpOworICByZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBpbnQgZ2V0ZmllbGQgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqa2V5LCBpbnQgZCkgeworICBpbnQgcmVzLCBpc251bTsKKyAgbHVhX2dldGZpZWxkKEwsIC0xLCBrZXkpOworICByZXMgPSAoaW50KWx1YV90b2ludGVnZXJ4KEwsIC0xLCAmaXNudW0pOworICBpZiAoIWlzbnVtKSB7CisgICAgaWYgKGQgPCAwKQorICAgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgImZpZWxkICIgTFVBX1FTICIgbWlzc2luZyBpbiBkYXRlIHRhYmxlIiwga2V5KTsKKyAgICByZXMgPSBkOworICB9CisgIGx1YV9wb3AoTCwgMSk7CisgIHJldHVybiByZXM7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmNoZWNrb3B0aW9uIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmNvbnYsIGNoYXIgKmJ1ZmYpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG9wdGlvbnNbXSA9IExVQV9TVFJGVElNRU9QVElPTlM7CisgIHVuc2lnbmVkIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG9wdGlvbnMpL3NpemVvZihvcHRpb25zWzBdKTsgaSArPSAyKSB7CisgICAgaWYgKCpjb252ICE9ICdcMCcgJiYgc3RyY2hyKG9wdGlvbnNbaV0sICpjb252KSAhPSBOVUxMKSB7CisgICAgICBidWZmWzFdID0gKmNvbnY7CisgICAgICBpZiAoKm9wdGlvbnNbaSArIDFdID09ICdcMCcpIHsgIC8qIG9uZS1jaGFyIGNvbnZlcnNpb24gc3BlY2lmaWVyPyAqLworICAgICAgICBidWZmWzJdID0gJ1wwJzsgIC8qIGVuZCBidWZmZXIgKi8KKyAgICAgICAgcmV0dXJuIGNvbnYgKyAxOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKihjb252ICsgMSkgIT0gJ1wwJyAmJgorICAgICAgICAgICAgICAgc3RyY2hyKG9wdGlvbnNbaSArIDFdLCAqKGNvbnYgKyAxKSkgIT0gTlVMTCkgeworICAgICAgICBidWZmWzJdID0gKihjb252ICsgMSk7ICAvKiB2YWxpZCB0d28tY2hhciBjb252ZXJzaW9uIHNwZWNpZmllciAqLworICAgICAgICBidWZmWzNdID0gJ1wwJzsgIC8qIGVuZCBidWZmZXIgKi8KKyAgICAgICAgcmV0dXJuIGNvbnYgKyAyOworICAgICAgfQorICAgIH0KKyAgfQorICBsdWFMX2FyZ2Vycm9yKEwsIDEsCisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyICclJSVzJyIsIGNvbnYpKTsKKyAgcmV0dXJuIGNvbnY7ICAvKiB0byBhdm9pZCB3YXJuaW5ncyAqLworfQorCisKK3N0YXRpYyBpbnQgb3NfZGF0ZSAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFMX29wdHN0cmluZyhMLCAxLCAiJWMiKTsKKyAgdGltZV90IHQgPSBsdWFMX29wdChMLCAodGltZV90KWx1YUxfY2hlY2tudW1iZXIsIDIsIHRpbWUoTlVMTCkpOworICBzdHJ1Y3QgdG0gdG1yLCAqc3RtOworICBpZiAoKnMgPT0gJyEnKSB7ICAvKiBVVEM/ICovCisgICAgc3RtID0gbF9nbXRpbWUoJnQsICZ0bXIpOworICAgIHMrKzsgIC8qIHNraXAgYCEnICovCisgIH0KKyAgZWxzZQorICAgIHN0bSA9IGxfbG9jYWx0aW1lKCZ0LCAmdG1yKTsKKyAgaWYgKHN0bSA9PSBOVUxMKSAgLyogaW52YWxpZCBkYXRlPyAqLworICAgIGx1YV9wdXNobmlsKEwpOworICBlbHNlIGlmIChzdHJjbXAocywgIip0IikgPT0gMCkgeworICAgIGx1YV9jcmVhdGV0YWJsZShMLCAwLCA5KTsgIC8qIDkgPSBudW1iZXIgb2YgZmllbGRzICovCisgICAgc2V0ZmllbGQoTCwgInNlYyIsIHN0bS0+dG1fc2VjKTsKKyAgICBzZXRmaWVsZChMLCAibWluIiwgc3RtLT50bV9taW4pOworICAgIHNldGZpZWxkKEwsICJob3VyIiwgc3RtLT50bV9ob3VyKTsKKyAgICBzZXRmaWVsZChMLCAiZGF5Iiwgc3RtLT50bV9tZGF5KTsKKyAgICBzZXRmaWVsZChMLCAibW9udGgiLCBzdG0tPnRtX21vbisxKTsKKyAgICBzZXRmaWVsZChMLCAieWVhciIsIHN0bS0+dG1feWVhcisxOTAwKTsKKyAgICBzZXRmaWVsZChMLCAid2RheSIsIHN0bS0+dG1fd2RheSsxKTsKKyAgICBzZXRmaWVsZChMLCAieWRheSIsIHN0bS0+dG1feWRheSsxKTsKKyAgICBzZXRib29sZmllbGQoTCwgImlzZHN0Iiwgc3RtLT50bV9pc2RzdCk7CisgIH0KKyAgZWxzZSB7CisgICAgY2hhciBjY1s0XTsKKyAgICBsdWFMX0J1ZmZlciBiOworICAgIGNjWzBdID0gJyUnOworICAgIGx1YUxfYnVmZmluaXQoTCwgJmIpOworICAgIHdoaWxlICgqcykgeworICAgICAgaWYgKCpzICE9ICclJykgIC8qIG5vIGNvbnZlcnNpb24gc3BlY2lmaWVyPyAqLworICAgICAgICBsdWFMX2FkZGNoYXIoJmIsICpzKyspOworICAgICAgZWxzZSB7CisgICAgICAgIHNpemVfdCByZXNsZW47CisgICAgICAgIGNoYXIgYnVmZlsyMDBdOyAgLyogc2hvdWxkIGJlIGJpZyBlbm91Z2ggZm9yIGFueSBjb252ZXJzaW9uIHJlc3VsdCAqLworICAgICAgICBzID0gY2hlY2tvcHRpb24oTCwgcyArIDEsIGNjKTsKKyAgICAgICAgcmVzbGVuID0gc3RyZnRpbWUoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCBjYywgc3RtKTsKKyAgICAgICAgbHVhTF9hZGRsc3RyaW5nKCZiLCBidWZmLCByZXNsZW4pOworICAgICAgfQorICAgIH0KKyAgICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICB9CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgb3NfdGltZSAobHVhX1N0YXRlICpMKSB7CisgIHRpbWVfdCB0OworICBpZiAobHVhX2lzbm9uZW9ybmlsKEwsIDEpKSAgLyogY2FsbGVkIHdpdGhvdXQgYXJncz8gKi8KKyAgICB0ID0gdGltZShOVUxMKTsgIC8qIGdldCBjdXJyZW50IHRpbWUgKi8KKyAgZWxzZSB7CisgICAgc3RydWN0IHRtIHRzOworICAgIGx1YUxfY2hlY2t0eXBlKEwsIDEsIExVQV9UVEFCTEUpOworICAgIGx1YV9zZXR0b3AoTCwgMSk7ICAvKiBtYWtlIHN1cmUgdGFibGUgaXMgYXQgdGhlIHRvcCAqLworICAgIHRzLnRtX3NlYyA9IGdldGZpZWxkKEwsICJzZWMiLCAwKTsKKyAgICB0cy50bV9taW4gPSBnZXRmaWVsZChMLCAibWluIiwgMCk7CisgICAgdHMudG1faG91ciA9IGdldGZpZWxkKEwsICJob3VyIiwgMTIpOworICAgIHRzLnRtX21kYXkgPSBnZXRmaWVsZChMLCAiZGF5IiwgLTEpOworICAgIHRzLnRtX21vbiA9IGdldGZpZWxkKEwsICJtb250aCIsIC0xKSAtIDE7CisgICAgdHMudG1feWVhciA9IGdldGZpZWxkKEwsICJ5ZWFyIiwgLTEpIC0gMTkwMDsKKyAgICB0cy50bV9pc2RzdCA9IGdldGJvb2xmaWVsZChMLCAiaXNkc3QiKTsKKyAgICB0ID0gbWt0aW1lKCZ0cyk7CisgIH0KKyAgaWYgKHQgPT0gKHRpbWVfdCkoLTEpKQorICAgIGx1YV9wdXNobmlsKEwpOworICBlbHNlCisgICAgbHVhX3B1c2hudW1iZXIoTCwgKGx1YV9OdW1iZXIpdCk7CisgIHJldHVybiAxOworfQorCisKKyNpZm5kZWYgTFVBX05VTUJFUl9JTlRFR1JBTAorc3RhdGljIGludCBvc19kaWZmdGltZSAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNobnVtYmVyKEwsIGRpZmZ0aW1lKCh0aW1lX3QpKGx1YUxfY2hlY2tudW1iZXIoTCwgMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGltZV90KShsdWFMX29wdG51bWJlcihMLCAyLCAwKSkpKTsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKK3N0YXRpYyBpbnQgb3Nfc2V0bG9jYWxlIChsdWFfU3RhdGUgKkwpIHsKKyAgc3RhdGljIGNvbnN0IGludCBjYXRbXSA9IHtMQ19BTEwsIExDX0NPTExBVEUsIExDX0NUWVBFLCBMQ19NT05FVEFSWSwKKyAgICAgICAgICAgICAgICAgICAgICBMQ19OVU1FUklDLCBMQ19USU1FfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNhdG5hbWVzW10gPSB7ImFsbCIsICJjb2xsYXRlIiwgImN0eXBlIiwgIm1vbmV0YXJ5IiwKKyAgICAgIm51bWVyaWMiLCAidGltZSIsIE5VTEx9OworICBjb25zdCBjaGFyICpsID0gbHVhTF9vcHRzdHJpbmcoTCwgMSwgTlVMTCk7CisgIGludCBvcCA9IGx1YUxfY2hlY2tvcHRpb24oTCwgMiwgImFsbCIsIGNhdG5hbWVzKTsKKyAgbHVhX3B1c2hzdHJpbmcoTCwgc2V0bG9jYWxlKGNhdFtvcF0sIGwpKTsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogU1lTTElOVVggKi8KKworCitzdGF0aWMgaW50IG9zX2V4aXQgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgc3RhdHVzOworICBpZiAobHVhX2lzYm9vbGVhbihMLCAxKSkKKyAgICBzdGF0dXMgPSAobHVhX3RvYm9vbGVhbihMLCAxKSA/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRSk7CisgIGVsc2UKKyAgICBzdGF0dXMgPSBsdWFMX29wdGludChMLCAxLCBFWElUX1NVQ0NFU1MpOworICBpZiAobHVhX3RvYm9vbGVhbihMLCAyKSkKKyAgICBsdWFfY2xvc2UoTCk7CisgIGlmIChMKSBleGl0KHN0YXR1cyk7ICAvKiAnaWYnIHRvIGF2b2lkIHdhcm5pbmdzIGZvciB1bnJlYWNoYWJsZSAncmV0dXJuJyAqLworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgc3lzbGliW10gPSB7CisjaWZuZGVmIFNZU0xJTlVYCisgIHsiY2xvY2siLCAgICAgb3NfY2xvY2t9LAorICB7ImRhdGUiLCAgICAgIG9zX2RhdGV9LAorI2lmbmRlZiBMVUFfTlVNQkVSX0lOVEVHUkFMCisgIHsiZGlmZnRpbWUiLCAgb3NfZGlmZnRpbWV9LAorI2VuZGlmCisgIHsiZXhlY3V0ZSIsICAgb3NfZXhlY3V0ZX0sCisjZW5kaWYKKyAgeyJleGl0IiwgICAgICBvc19leGl0fSwKKyAgeyJnZXRlbnYiLCAgICBvc19nZXRlbnZ9LAorI2lmbmRlZiBTWVNMSU5VWAorICB7InJlbW92ZSIsICAgIG9zX3JlbW92ZX0sCisgIHsicmVuYW1lIiwgICAgb3NfcmVuYW1lfSwKKyAgeyJzZXRsb2NhbGUiLCBvc19zZXRsb2NhbGV9LAorICB7InRpbWUiLCAgICAgIG9zX3RpbWV9LAorICB7InRtcG5hbWUiLCAgIG9zX3RtcG5hbWV9LAorI2VuZGlmCisgIHtOVUxMLCBOVUxMfQorfTsKKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKworTFVBTU9EX0FQSSBpbnQgbHVhb3Blbl9vcyAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfbmV3bGliKEwsIHN5c2xpYik7CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xwYXJzZXIuYyBiL2NvbTMyL2x1YS9zcmMvbHBhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMWE5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xwYXJzZXIuYwpAQCAtMCwwICsxLDE2MzggQEAKKy8qCisqKiAkSWQ6IGxwYXJzZXIuYyx2IDIuMTMwLjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIEx1YSBQYXJzZXIKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBscGFyc2VyX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGNvZGUuaCIKKyNpbmNsdWRlICJsZGVidWcuaCIKKyNpbmNsdWRlICJsZG8uaCIKKyNpbmNsdWRlICJsZnVuYy5oIgorI2luY2x1ZGUgImxsZXguaCIKKyNpbmNsdWRlICJsbWVtLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxvcGNvZGVzLmgiCisjaW5jbHVkZSAibHBhcnNlci5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorI2luY2x1ZGUgImxzdHJpbmcuaCIKKyNpbmNsdWRlICJsdGFibGUuaCIKKworCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBwZXIgZnVuY3Rpb24gKG11c3QgYmUgc21hbGxlcgorICAgdGhhbiAyNTAsIGR1ZSB0byB0aGUgYnl0ZWNvZGUgZm9ybWF0KSAqLworI2RlZmluZSBNQVhWQVJTCQkyMDAKKworCisjZGVmaW5lIGhhc211bHRyZXQoaykJCSgoaykgPT0gVkNBTEwgfHwgKGspID09IFZWQVJBUkcpCisKKworCisvKgorKiogbm9kZXMgZm9yIGJsb2NrIGxpc3QgKGxpc3Qgb2YgYWN0aXZlIGJsb2NrcykKKyovCit0eXBlZGVmIHN0cnVjdCBCbG9ja0NudCB7CisgIHN0cnVjdCBCbG9ja0NudCAqcHJldmlvdXM7ICAvKiBjaGFpbiAqLworICBzaG9ydCBmaXJzdGxhYmVsOyAgLyogaW5kZXggb2YgZmlyc3QgbGFiZWwgaW4gdGhpcyBibG9jayAqLworICBzaG9ydCBmaXJzdGdvdG87ICAvKiBpbmRleCBvZiBmaXJzdCBwZW5kaW5nIGdvdG8gaW4gdGhpcyBibG9jayAqLworICBsdV9ieXRlIG5hY3R2YXI7ICAvKiAjIGFjdGl2ZSBsb2NhbHMgb3V0c2lkZSB0aGUgYmxvY2sgKi8KKyAgbHVfYnl0ZSB1cHZhbDsgIC8qIHRydWUgaWYgc29tZSB2YXJpYWJsZSBpbiB0aGUgYmxvY2sgaXMgYW4gdXB2YWx1ZSAqLworICBsdV9ieXRlIGlzbG9vcDsgIC8qIHRydWUgaWYgYGJsb2NrJyBpcyBhIGxvb3AgKi8KK30gQmxvY2tDbnQ7CisKKworCisvKgorKiogcHJvdG90eXBlcyBmb3IgcmVjdXJzaXZlIG5vbi10ZXJtaW5hbCBmdW5jdGlvbnMKKyovCitzdGF0aWMgdm9pZCBzdGF0ZW1lbnQgKExleFN0YXRlICpscyk7CitzdGF0aWMgdm9pZCBleHByIChMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKnYpOworCisKK3N0YXRpYyB2b2lkIGFuY2hvcl90b2tlbiAoTGV4U3RhdGUgKmxzKSB7CisgIC8qIGxhc3QgdG9rZW4gZnJvbSBvdXRlciBmdW5jdGlvbiBtdXN0IGJlIEVPUyAqLworICBsdWFfYXNzZXJ0KGxzLT5mcyAhPSBOVUxMIHx8IGxzLT50LnRva2VuID09IFRLX0VPUyk7CisgIGlmIChscy0+dC50b2tlbiA9PSBUS19OQU1FIHx8IGxzLT50LnRva2VuID09IFRLX1NUUklORykgeworICAgIFRTdHJpbmcgKnRzID0gbHMtPnQuc2VtaW5mby50czsKKyAgICBsdWFYX25ld3N0cmluZyhscywgZ2V0c3RyKHRzKSwgdHMtPnRzdi5sZW4pOworICB9Cit9CisKKworLyogc2VtYW50aWMgZXJyb3IgKi8KK3N0YXRpYyBsX25vcmV0IHNlbWVycm9yIChMZXhTdGF0ZSAqbHMsIGNvbnN0IGNoYXIgKm1zZykgeworICBscy0+dC50b2tlbiA9IDA7ICAvKiByZW1vdmUgJ25lYXIgdG8nIGZyb20gZmluYWwgbWVzc2FnZSAqLworICBsdWFYX3N5bnRheGVycm9yKGxzLCBtc2cpOworfQorCisKK3N0YXRpYyBsX25vcmV0IGVycm9yX2V4cGVjdGVkIChMZXhTdGF0ZSAqbHMsIGludCB0b2tlbikgeworICBsdWFYX3N5bnRheGVycm9yKGxzLAorICAgICAgbHVhT19wdXNoZnN0cmluZyhscy0+TCwgIiVzIGV4cGVjdGVkIiwgbHVhWF90b2tlbjJzdHIobHMsIHRva2VuKSkpOworfQorCisKK3N0YXRpYyBsX25vcmV0IGVycm9ybGltaXQgKEZ1bmNTdGF0ZSAqZnMsIGludCBsaW1pdCwgY29uc3QgY2hhciAqd2hhdCkgeworICBsdWFfU3RhdGUgKkwgPSBmcy0+bHMtPkw7CisgIGNvbnN0IGNoYXIgKm1zZzsKKyAgaW50IGxpbmUgPSBmcy0+Zi0+bGluZWRlZmluZWQ7CisgIGNvbnN0IGNoYXIgKndoZXJlID0gKGxpbmUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICA/ICJtYWluIGZ1bmN0aW9uIgorICAgICAgICAgICAgICAgICAgICAgIDogbHVhT19wdXNoZnN0cmluZyhMLCAiZnVuY3Rpb24gYXQgbGluZSAlZCIsIGxpbmUpOworICBtc2cgPSBsdWFPX3B1c2hmc3RyaW5nKEwsICJ0b28gbWFueSAlcyAobGltaXQgaXMgJWQpIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgbGltaXQsIHdoZXJlKTsKKyAgbHVhWF9zeW50YXhlcnJvcihmcy0+bHMsIG1zZyk7Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tsaW1pdCAoRnVuY1N0YXRlICpmcywgaW50IHYsIGludCBsLCBjb25zdCBjaGFyICp3aGF0KSB7CisgIGlmICh2ID4gbCkgZXJyb3JsaW1pdChmcywgbCwgd2hhdCk7Cit9CisKKworc3RhdGljIGludCB0ZXN0bmV4dCAoTGV4U3RhdGUgKmxzLCBpbnQgYykgeworICBpZiAobHMtPnQudG9rZW4gPT0gYykgeworICAgIGx1YVhfbmV4dChscyk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBjaGVjayAoTGV4U3RhdGUgKmxzLCBpbnQgYykgeworICBpZiAobHMtPnQudG9rZW4gIT0gYykKKyAgICBlcnJvcl9leHBlY3RlZChscywgYyk7Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tuZXh0IChMZXhTdGF0ZSAqbHMsIGludCBjKSB7CisgIGNoZWNrKGxzLCBjKTsKKyAgbHVhWF9uZXh0KGxzKTsKK30KKworCisjZGVmaW5lIGNoZWNrX2NvbmRpdGlvbihscyxjLG1zZykJeyBpZiAoIShjKSkgbHVhWF9zeW50YXhlcnJvcihscywgbXNnKTsgfQorCisKKworc3RhdGljIHZvaWQgY2hlY2tfbWF0Y2ggKExleFN0YXRlICpscywgaW50IHdoYXQsIGludCB3aG8sIGludCB3aGVyZSkgeworICBpZiAoIXRlc3RuZXh0KGxzLCB3aGF0KSkgeworICAgIGlmICh3aGVyZSA9PSBscy0+bGluZW51bWJlcikKKyAgICAgIGVycm9yX2V4cGVjdGVkKGxzLCB3aGF0KTsKKyAgICBlbHNlIHsKKyAgICAgIGx1YVhfc3ludGF4ZXJyb3IobHMsIGx1YU9fcHVzaGZzdHJpbmcobHMtPkwsCisgICAgICAgICAgICAgIiVzIGV4cGVjdGVkICh0byBjbG9zZSAlcyBhdCBsaW5lICVkKSIsCisgICAgICAgICAgICAgIGx1YVhfdG9rZW4yc3RyKGxzLCB3aGF0KSwgbHVhWF90b2tlbjJzdHIobHMsIHdobyksIHdoZXJlKSk7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIFRTdHJpbmcgKnN0cl9jaGVja25hbWUgKExleFN0YXRlICpscykgeworICBUU3RyaW5nICp0czsKKyAgY2hlY2sobHMsIFRLX05BTUUpOworICB0cyA9IGxzLT50LnNlbWluZm8udHM7CisgIGx1YVhfbmV4dChscyk7CisgIHJldHVybiB0czsKK30KKworCitzdGF0aWMgdm9pZCBpbml0X2V4cCAoZXhwZGVzYyAqZSwgZXhwa2luZCBrLCBpbnQgaSkgeworICBlLT5mID0gZS0+dCA9IE5PX0pVTVA7CisgIGUtPmsgPSBrOworICBlLT51LmluZm8gPSBpOworfQorCisKK3N0YXRpYyB2b2lkIGNvZGVzdHJpbmcgKExleFN0YXRlICpscywgZXhwZGVzYyAqZSwgVFN0cmluZyAqcykgeworICBpbml0X2V4cChlLCBWSywgbHVhS19zdHJpbmdLKGxzLT5mcywgcykpOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrbmFtZSAoTGV4U3RhdGUgKmxzLCBleHBkZXNjICplKSB7CisgIGNvZGVzdHJpbmcobHMsIGUsIHN0cl9jaGVja25hbWUobHMpKTsKK30KKworCitzdGF0aWMgaW50IHJlZ2lzdGVybG9jYWx2YXIgKExleFN0YXRlICpscywgVFN0cmluZyAqdmFybmFtZSkgeworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBQcm90byAqZiA9IGZzLT5mOworICBpbnQgb2xkc2l6ZSA9IGYtPnNpemVsb2N2YXJzOworICBsdWFNX2dyb3d2ZWN0b3IobHMtPkwsIGYtPmxvY3ZhcnMsIGZzLT5ubG9jdmFycywgZi0+c2l6ZWxvY3ZhcnMsCisgICAgICAgICAgICAgICAgICBMb2NWYXIsIFNIUlRfTUFYLCAibG9jYWwgdmFyaWFibGVzIik7CisgIHdoaWxlIChvbGRzaXplIDwgZi0+c2l6ZWxvY3ZhcnMpIGYtPmxvY3ZhcnNbb2xkc2l6ZSsrXS52YXJuYW1lID0gTlVMTDsKKyAgZi0+bG9jdmFyc1tmcy0+bmxvY3ZhcnNdLnZhcm5hbWUgPSB2YXJuYW1lOworICBsdWFDX29iamJhcnJpZXIobHMtPkwsIGYsIHZhcm5hbWUpOworICByZXR1cm4gZnMtPm5sb2N2YXJzKys7Cit9CisKKworc3RhdGljIHZvaWQgbmV3X2xvY2FsdmFyIChMZXhTdGF0ZSAqbHMsIFRTdHJpbmcgKm5hbWUpIHsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgRHluZGF0YSAqZHlkID0gbHMtPmR5ZDsKKyAgaW50IHJlZyA9IHJlZ2lzdGVybG9jYWx2YXIobHMsIG5hbWUpOworICBjaGVja2xpbWl0KGZzLCBkeWQtPmFjdHZhci5uICsgMSAtIGZzLT5maXJzdGxvY2FsLAorICAgICAgICAgICAgICAgICAgTUFYVkFSUywgImxvY2FsIHZhcmlhYmxlcyIpOworICBsdWFNX2dyb3d2ZWN0b3IobHMtPkwsIGR5ZC0+YWN0dmFyLmFyciwgZHlkLT5hY3R2YXIubiArIDEsCisgICAgICAgICAgICAgICAgICBkeWQtPmFjdHZhci5zaXplLCBWYXJkZXNjLCBNQVhfSU5ULCAibG9jYWwgdmFyaWFibGVzIik7CisgIGR5ZC0+YWN0dmFyLmFycltkeWQtPmFjdHZhci5uKytdLmlkeCA9IGNhc3Qoc2hvcnQsIHJlZyk7Cit9CisKKworc3RhdGljIHZvaWQgbmV3X2xvY2FsdmFybGl0ZXJhbF8gKExleFN0YXRlICpscywgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHN6KSB7CisgIG5ld19sb2NhbHZhcihscywgbHVhWF9uZXdzdHJpbmcobHMsIG5hbWUsIHN6KSk7Cit9CisKKyNkZWZpbmUgbmV3X2xvY2FsdmFybGl0ZXJhbChscyx2KSBcCisJbmV3X2xvY2FsdmFybGl0ZXJhbF8obHMsICIiIHYsIChzaXplb2Yodikvc2l6ZW9mKGNoYXIpKS0xKQorCisKK3N0YXRpYyBMb2NWYXIgKmdldGxvY3ZhciAoRnVuY1N0YXRlICpmcywgaW50IGkpIHsKKyAgaW50IGlkeCA9IGZzLT5scy0+ZHlkLT5hY3R2YXIuYXJyW2ZzLT5maXJzdGxvY2FsICsgaV0uaWR4OworICBsdWFfYXNzZXJ0KGlkeCA8IGZzLT5ubG9jdmFycyk7CisgIHJldHVybiAmZnMtPmYtPmxvY3ZhcnNbaWR4XTsKK30KKworCitzdGF0aWMgdm9pZCBhZGp1c3Rsb2NhbHZhcnMgKExleFN0YXRlICpscywgaW50IG52YXJzKSB7CisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGZzLT5uYWN0dmFyID0gY2FzdF9ieXRlKGZzLT5uYWN0dmFyICsgbnZhcnMpOworICBmb3IgKDsgbnZhcnM7IG52YXJzLS0pIHsKKyAgICBnZXRsb2N2YXIoZnMsIGZzLT5uYWN0dmFyIC0gbnZhcnMpLT5zdGFydHBjID0gZnMtPnBjOworICB9Cit9CisKKworc3RhdGljIHZvaWQgcmVtb3ZldmFycyAoRnVuY1N0YXRlICpmcywgaW50IHRvbGV2ZWwpIHsKKyAgZnMtPmxzLT5keWQtPmFjdHZhci5uIC09IChmcy0+bmFjdHZhciAtIHRvbGV2ZWwpOworICB3aGlsZSAoZnMtPm5hY3R2YXIgPiB0b2xldmVsKQorICAgIGdldGxvY3ZhcihmcywgLS1mcy0+bmFjdHZhciktPmVuZHBjID0gZnMtPnBjOworfQorCisKK3N0YXRpYyBpbnQgc2VhcmNodXB2YWx1ZSAoRnVuY1N0YXRlICpmcywgVFN0cmluZyAqbmFtZSkgeworICBpbnQgaTsKKyAgVXB2YWxkZXNjICp1cCA9IGZzLT5mLT51cHZhbHVlczsKKyAgZm9yIChpID0gMDsgaSA8IGZzLT5udXBzOyBpKyspIHsKKyAgICBpZiAobHVhU19lcXN0cih1cFtpXS5uYW1lLCBuYW1lKSkgcmV0dXJuIGk7CisgIH0KKyAgcmV0dXJuIC0xOyAgLyogbm90IGZvdW5kICovCit9CisKKworc3RhdGljIGludCBuZXd1cHZhbHVlIChGdW5jU3RhdGUgKmZzLCBUU3RyaW5nICpuYW1lLCBleHBkZXNjICp2KSB7CisgIFByb3RvICpmID0gZnMtPmY7CisgIGludCBvbGRzaXplID0gZi0+c2l6ZXVwdmFsdWVzOworICBjaGVja2xpbWl0KGZzLCBmcy0+bnVwcyArIDEsIE1BWFVQVkFMLCAidXB2YWx1ZXMiKTsKKyAgbHVhTV9ncm93dmVjdG9yKGZzLT5scy0+TCwgZi0+dXB2YWx1ZXMsIGZzLT5udXBzLCBmLT5zaXpldXB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICBVcHZhbGRlc2MsIE1BWFVQVkFMLCAidXB2YWx1ZXMiKTsKKyAgd2hpbGUgKG9sZHNpemUgPCBmLT5zaXpldXB2YWx1ZXMpIGYtPnVwdmFsdWVzW29sZHNpemUrK10ubmFtZSA9IE5VTEw7CisgIGYtPnVwdmFsdWVzW2ZzLT5udXBzXS5pbnN0YWNrID0gKHYtPmsgPT0gVkxPQ0FMKTsKKyAgZi0+dXB2YWx1ZXNbZnMtPm51cHNdLmlkeCA9IGNhc3RfYnl0ZSh2LT51LmluZm8pOworICBmLT51cHZhbHVlc1tmcy0+bnVwc10ubmFtZSA9IG5hbWU7CisgIGx1YUNfb2JqYmFycmllcihmcy0+bHMtPkwsIGYsIG5hbWUpOworICByZXR1cm4gZnMtPm51cHMrKzsKK30KKworCitzdGF0aWMgaW50IHNlYXJjaHZhciAoRnVuY1N0YXRlICpmcywgVFN0cmluZyAqbikgeworICBpbnQgaTsKKyAgZm9yIChpID0gY2FzdF9pbnQoZnMtPm5hY3R2YXIpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZiAobHVhU19lcXN0cihuLCBnZXRsb2N2YXIoZnMsIGkpLT52YXJuYW1lKSkKKyAgICAgIHJldHVybiBpOworICB9CisgIHJldHVybiAtMTsgIC8qIG5vdCBmb3VuZCAqLworfQorCisKKy8qCisgIE1hcmsgYmxvY2sgd2hlcmUgdmFyaWFibGUgYXQgZ2l2ZW4gbGV2ZWwgd2FzIGRlZmluZWQKKyAgKHRvIGVtaXQgY2xvc2UgaW5zdHJ1Y3Rpb25zIGxhdGVyKS4KKyovCitzdGF0aWMgdm9pZCBtYXJrdXB2YWwgKEZ1bmNTdGF0ZSAqZnMsIGludCBsZXZlbCkgeworICBCbG9ja0NudCAqYmwgPSBmcy0+Ymw7CisgIHdoaWxlIChibC0+bmFjdHZhciA+IGxldmVsKSBibCA9IGJsLT5wcmV2aW91czsKKyAgYmwtPnVwdmFsID0gMTsKK30KKworCisvKgorICBGaW5kIHZhcmlhYmxlIHdpdGggZ2l2ZW4gbmFtZSAnbicuIElmIGl0IGlzIGFuIHVwdmFsdWUsIGFkZCB0aGlzCisgIHVwdmFsdWUgaW50byBhbGwgaW50ZXJtZWRpYXRlIGZ1bmN0aW9ucy4KKyovCitzdGF0aWMgaW50IHNpbmdsZXZhcmF1eCAoRnVuY1N0YXRlICpmcywgVFN0cmluZyAqbiwgZXhwZGVzYyAqdmFyLCBpbnQgYmFzZSkgeworICBpZiAoZnMgPT0gTlVMTCkgIC8qIG5vIG1vcmUgbGV2ZWxzPyAqLworICAgIHJldHVybiBWVk9JRDsgIC8qIGRlZmF1bHQgaXMgZ2xvYmFsICovCisgIGVsc2UgeworICAgIGludCB2ID0gc2VhcmNodmFyKGZzLCBuKTsgIC8qIGxvb2sgdXAgbG9jYWxzIGF0IGN1cnJlbnQgbGV2ZWwgKi8KKyAgICBpZiAodiA+PSAwKSB7ICAvKiBmb3VuZD8gKi8KKyAgICAgIGluaXRfZXhwKHZhciwgVkxPQ0FMLCB2KTsgIC8qIHZhcmlhYmxlIGlzIGxvY2FsICovCisgICAgICBpZiAoIWJhc2UpCisgICAgICAgIG1hcmt1cHZhbChmcywgdik7ICAvKiBsb2NhbCB3aWxsIGJlIHVzZWQgYXMgYW4gdXB2YWwgKi8KKyAgICAgIHJldHVybiBWTE9DQUw7CisgICAgfQorICAgIGVsc2UgeyAgLyogbm90IGZvdW5kIGFzIGxvY2FsIGF0IGN1cnJlbnQgbGV2ZWw7IHRyeSB1cHZhbHVlcyAqLworICAgICAgaW50IGlkeCA9IHNlYXJjaHVwdmFsdWUoZnMsIG4pOyAgLyogdHJ5IGV4aXN0aW5nIHVwdmFsdWVzICovCisgICAgICBpZiAoaWR4IDwgMCkgeyAgLyogbm90IGZvdW5kPyAqLworICAgICAgICBpZiAoc2luZ2xldmFyYXV4KGZzLT5wcmV2LCBuLCB2YXIsIDApID09IFZWT0lEKSAvKiB0cnkgdXBwZXIgbGV2ZWxzICovCisgICAgICAgICAgcmV0dXJuIFZWT0lEOyAgLyogbm90IGZvdW5kOyBpcyBhIGdsb2JhbCAqLworICAgICAgICAvKiBlbHNlIHdhcyBMT0NBTCBvciBVUFZBTCAqLworICAgICAgICBpZHggID0gbmV3dXB2YWx1ZShmcywgbiwgdmFyKTsgIC8qIHdpbGwgYmUgYSBuZXcgdXB2YWx1ZSAqLworICAgICAgfQorICAgICAgaW5pdF9leHAodmFyLCBWVVBWQUwsIGlkeCk7CisgICAgICByZXR1cm4gVlVQVkFMOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHNpbmdsZXZhciAoTGV4U3RhdGUgKmxzLCBleHBkZXNjICp2YXIpIHsKKyAgVFN0cmluZyAqdmFybmFtZSA9IHN0cl9jaGVja25hbWUobHMpOworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBpZiAoc2luZ2xldmFyYXV4KGZzLCB2YXJuYW1lLCB2YXIsIDEpID09IFZWT0lEKSB7ICAvKiBnbG9iYWwgbmFtZT8gKi8KKyAgICBleHBkZXNjIGtleTsKKyAgICBzaW5nbGV2YXJhdXgoZnMsIGxzLT5lbnZuLCB2YXIsIDEpOyAgLyogZ2V0IGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAgbHVhX2Fzc2VydCh2YXItPmsgPT0gVkxPQ0FMIHx8IHZhci0+ayA9PSBWVVBWQUwpOworICAgIGNvZGVzdHJpbmcobHMsICZrZXksIHZhcm5hbWUpOyAgLyoga2V5IGlzIHZhcmlhYmxlIG5hbWUgKi8KKyAgICBsdWFLX2luZGV4ZWQoZnMsIHZhciwgJmtleSk7ICAvKiBlbnZbdmFybmFtZV0gKi8KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGFkanVzdF9hc3NpZ24gKExleFN0YXRlICpscywgaW50IG52YXJzLCBpbnQgbmV4cHMsIGV4cGRlc2MgKmUpIHsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgaW50IGV4dHJhID0gbnZhcnMgLSBuZXhwczsKKyAgaWYgKGhhc211bHRyZXQoZS0+aykpIHsKKyAgICBleHRyYSsrOyAgLyogaW5jbHVkZXMgY2FsbCBpdHNlbGYgKi8KKyAgICBpZiAoZXh0cmEgPCAwKSBleHRyYSA9IDA7CisgICAgbHVhS19zZXRyZXR1cm5zKGZzLCBlLCBleHRyYSk7ICAvKiBsYXN0IGV4cC4gcHJvdmlkZXMgdGhlIGRpZmZlcmVuY2UgKi8KKyAgICBpZiAoZXh0cmEgPiAxKSBsdWFLX3Jlc2VydmVyZWdzKGZzLCBleHRyYS0xKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoZS0+ayAhPSBWVk9JRCkgbHVhS19leHAybmV4dHJlZyhmcywgZSk7ICAvKiBjbG9zZSBsYXN0IGV4cHJlc3Npb24gKi8KKyAgICBpZiAoZXh0cmEgPiAwKSB7CisgICAgICBpbnQgcmVnID0gZnMtPmZyZWVyZWc7CisgICAgICBsdWFLX3Jlc2VydmVyZWdzKGZzLCBleHRyYSk7CisgICAgICBsdWFLX25pbChmcywgcmVnLCBleHRyYSk7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgZW50ZXJsZXZlbCAoTGV4U3RhdGUgKmxzKSB7CisgIGx1YV9TdGF0ZSAqTCA9IGxzLT5MOworICArK0wtPm5DY2FsbHM7CisgIGNoZWNrbGltaXQobHMtPmZzLCBMLT5uQ2NhbGxzLCBMVUFJX01BWENDQUxMUywgIkMgbGV2ZWxzIik7Cit9CisKKworI2RlZmluZSBsZWF2ZWxldmVsKGxzKQkoKGxzKS0+TC0+bkNjYWxscy0tKQorCisKK3N0YXRpYyB2b2lkIGNsb3NlZ290byAoTGV4U3RhdGUgKmxzLCBpbnQgZywgTGFiZWxkZXNjICpsYWJlbCkgeworICBpbnQgaTsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgTGFiZWxsaXN0ICpnbCA9ICZscy0+ZHlkLT5ndDsKKyAgTGFiZWxkZXNjICpndCA9ICZnbC0+YXJyW2ddOworICBsdWFfYXNzZXJ0KGx1YVNfZXFzdHIoZ3QtPm5hbWUsIGxhYmVsLT5uYW1lKSk7CisgIGlmIChndC0+bmFjdHZhciA8IGxhYmVsLT5uYWN0dmFyKSB7CisgICAgVFN0cmluZyAqdm5hbWUgPSBnZXRsb2N2YXIoZnMsIGd0LT5uYWN0dmFyKS0+dmFybmFtZTsKKyAgICBjb25zdCBjaGFyICptc2cgPSBsdWFPX3B1c2hmc3RyaW5nKGxzLT5MLAorICAgICAgIjxnb3RvICVzPiBhdCBsaW5lICVkIGp1bXBzIGludG8gdGhlIHNjb3BlIG9mIGxvY2FsICIgTFVBX1FTLAorICAgICAgZ2V0c3RyKGd0LT5uYW1lKSwgZ3QtPmxpbmUsIGdldHN0cih2bmFtZSkpOworICAgIHNlbWVycm9yKGxzLCBtc2cpOworICB9CisgIGx1YUtfcGF0Y2hsaXN0KGZzLCBndC0+cGMsIGxhYmVsLT5wYyk7CisgIC8qIHJlbW92ZSBnb3RvIGZyb20gcGVuZGluZyBsaXN0ICovCisgIGZvciAoaSA9IGc7IGkgPCBnbC0+biAtIDE7IGkrKykKKyAgICBnbC0+YXJyW2ldID0gZ2wtPmFycltpICsgMV07CisgIGdsLT5uLS07Cit9CisKKworLyoKKyoqIHRyeSB0byBjbG9zZSBhIGdvdG8gd2l0aCBleGlzdGluZyBsYWJlbHM7IHRoaXMgc29sdmVzIGJhY2t3YXJkIGp1bXBzCisqLworc3RhdGljIGludCBmaW5kbGFiZWwgKExleFN0YXRlICpscywgaW50IGcpIHsKKyAgaW50IGk7CisgIEJsb2NrQ250ICpibCA9IGxzLT5mcy0+Ymw7CisgIER5bmRhdGEgKmR5ZCA9IGxzLT5keWQ7CisgIExhYmVsZGVzYyAqZ3QgPSAmZHlkLT5ndC5hcnJbZ107CisgIC8qIGNoZWNrIGxhYmVscyBpbiBjdXJyZW50IGJsb2NrIGZvciBhIG1hdGNoICovCisgIGZvciAoaSA9IGJsLT5maXJzdGxhYmVsOyBpIDwgZHlkLT5sYWJlbC5uOyBpKyspIHsKKyAgICBMYWJlbGRlc2MgKmxiID0gJmR5ZC0+bGFiZWwuYXJyW2ldOworICAgIGlmIChsdWFTX2Vxc3RyKGxiLT5uYW1lLCBndC0+bmFtZSkpIHsgIC8qIGNvcnJlY3QgbGFiZWw/ICovCisgICAgICBpZiAoZ3QtPm5hY3R2YXIgPiBsYi0+bmFjdHZhciAmJgorICAgICAgICAgIChibC0+dXB2YWwgfHwgZHlkLT5sYWJlbC5uID4gYmwtPmZpcnN0bGFiZWwpKQorICAgICAgICBsdWFLX3BhdGNoY2xvc2UobHMtPmZzLCBndC0+cGMsIGxiLT5uYWN0dmFyKTsKKyAgICAgIGNsb3NlZ290byhscywgZywgbGIpOyAgLyogY2xvc2UgaXQgKi8KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsgIC8qIGxhYmVsIG5vdCBmb3VuZDsgY2Fubm90IGNsb3NlIGdvdG8gKi8KK30KKworCitzdGF0aWMgaW50IG5ld2xhYmVsZW50cnkgKExleFN0YXRlICpscywgTGFiZWxsaXN0ICpsLCBUU3RyaW5nICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgaW50IHBjKSB7CisgIGludCBuID0gbC0+bjsKKyAgbHVhTV9ncm93dmVjdG9yKGxzLT5MLCBsLT5hcnIsIG4sIGwtPnNpemUsCisgICAgICAgICAgICAgICAgICBMYWJlbGRlc2MsIFNIUlRfTUFYLCAibGFiZWxzL2dvdG9zIik7CisgIGwtPmFycltuXS5uYW1lID0gbmFtZTsKKyAgbC0+YXJyW25dLmxpbmUgPSBsaW5lOworICBsLT5hcnJbbl0ubmFjdHZhciA9IGxzLT5mcy0+bmFjdHZhcjsKKyAgbC0+YXJyW25dLnBjID0gcGM7CisgIGwtPm4rKzsKKyAgcmV0dXJuIG47Cit9CisKKworLyoKKyoqIGNoZWNrIHdoZXRoZXIgbmV3IGxhYmVsICdsYicgbWF0Y2hlcyBhbnkgcGVuZGluZyBnb3RvcyBpbiBjdXJyZW50CisqKiBibG9jazsgc29sdmVzIGZvcndhcmQganVtcHMKKyovCitzdGF0aWMgdm9pZCBmaW5kZ290b3MgKExleFN0YXRlICpscywgTGFiZWxkZXNjICpsYikgeworICBMYWJlbGxpc3QgKmdsID0gJmxzLT5keWQtPmd0OworICBpbnQgaSA9IGxzLT5mcy0+YmwtPmZpcnN0Z290bzsKKyAgd2hpbGUgKGkgPCBnbC0+bikgeworICAgIGlmIChsdWFTX2Vxc3RyKGdsLT5hcnJbaV0ubmFtZSwgbGItPm5hbWUpKQorICAgICAgY2xvc2Vnb3RvKGxzLCBpLCBsYik7CisgICAgZWxzZQorICAgICAgaSsrOworICB9Cit9CisKKworLyoKKyoqICJleHBvcnQiIHBlbmRpbmcgZ290b3MgdG8gb3V0ZXIgbGV2ZWwsIHRvIGNoZWNrIHRoZW0gYWdhaW5zdAorKiogb3V0ZXIgbGFiZWxzOyBpZiB0aGUgYmxvY2sgYmVpbmcgZXhpdGVkIGhhcyB1cHZhbHVlcywgYW5kCisqKiB0aGUgZ290byBleGl0cyB0aGUgc2NvcGUgb2YgYW55IHZhcmlhYmxlICh3aGljaCBjYW4gYmUgdGhlCisqKiB1cHZhbHVlKSwgY2xvc2UgdGhvc2UgdmFyaWFibGVzIGJlaW5nIGV4aXRlZC4KKyovCitzdGF0aWMgdm9pZCBtb3ZlZ290b3NvdXQgKEZ1bmNTdGF0ZSAqZnMsIEJsb2NrQ250ICpibCkgeworICBpbnQgaSA9IGJsLT5maXJzdGdvdG87CisgIExhYmVsbGlzdCAqZ2wgPSAmZnMtPmxzLT5keWQtPmd0OworICAvKiBjb3JyZWN0IHBlbmRpbmcgZ290b3MgdG8gY3VycmVudCBibG9jayBhbmQgdHJ5IHRvIGNsb3NlIGl0CisgICAgIHdpdGggdmlzaWJsZSBsYWJlbHMgKi8KKyAgd2hpbGUgKGkgPCBnbC0+bikgeworICAgIExhYmVsZGVzYyAqZ3QgPSAmZ2wtPmFycltpXTsKKyAgICBpZiAoZ3QtPm5hY3R2YXIgPiBibC0+bmFjdHZhcikgeworICAgICAgaWYgKGJsLT51cHZhbCkKKyAgICAgICAgbHVhS19wYXRjaGNsb3NlKGZzLCBndC0+cGMsIGJsLT5uYWN0dmFyKTsKKyAgICAgIGd0LT5uYWN0dmFyID0gYmwtPm5hY3R2YXI7CisgICAgfQorICAgIGlmICghZmluZGxhYmVsKGZzLT5scywgaSkpCisgICAgICBpKys7ICAvKiBtb3ZlIHRvIG5leHQgb25lICovCisgIH0KK30KKworCitzdGF0aWMgdm9pZCBlbnRlcmJsb2NrIChGdW5jU3RhdGUgKmZzLCBCbG9ja0NudCAqYmwsIGx1X2J5dGUgaXNsb29wKSB7CisgIGJsLT5pc2xvb3AgPSBpc2xvb3A7CisgIGJsLT5uYWN0dmFyID0gZnMtPm5hY3R2YXI7CisgIGJsLT5maXJzdGxhYmVsID0gZnMtPmxzLT5keWQtPmxhYmVsLm47CisgIGJsLT5maXJzdGdvdG8gPSBmcy0+bHMtPmR5ZC0+Z3QubjsKKyAgYmwtPnVwdmFsID0gMDsKKyAgYmwtPnByZXZpb3VzID0gZnMtPmJsOworICBmcy0+YmwgPSBibDsKKyAgbHVhX2Fzc2VydChmcy0+ZnJlZXJlZyA9PSBmcy0+bmFjdHZhcik7Cit9CisKKworLyoKKyoqIGNyZWF0ZSBhIGxhYmVsIG5hbWVkICJicmVhayIgdG8gcmVzb2x2ZSBicmVhayBzdGF0ZW1lbnRzCisqLworc3RhdGljIHZvaWQgYnJlYWtsYWJlbCAoTGV4U3RhdGUgKmxzKSB7CisgIFRTdHJpbmcgKm4gPSBsdWFTX25ldyhscy0+TCwgImJyZWFrIik7CisgIGludCBsID0gbmV3bGFiZWxlbnRyeShscywgJmxzLT5keWQtPmxhYmVsLCBuLCAwLCBscy0+ZnMtPnBjKTsKKyAgZmluZGdvdG9zKGxzLCAmbHMtPmR5ZC0+bGFiZWwuYXJyW2xdKTsKK30KKworLyoKKyoqIGdlbmVyYXRlcyBhbiBlcnJvciBmb3IgYW4gdW5kZWZpbmVkICdnb3RvJzsgY2hvb3NlIGFwcHJvcHJpYXRlCisqKiBtZXNzYWdlIHdoZW4gbGFiZWwgbmFtZSBpcyBhIHJlc2VydmVkIHdvcmQgKHdoaWNoIGNhbiBvbmx5IGJlICdicmVhaycpCisqLworc3RhdGljIGxfbm9yZXQgdW5kZWZnb3RvIChMZXhTdGF0ZSAqbHMsIExhYmVsZGVzYyAqZ3QpIHsKKyAgY29uc3QgY2hhciAqbXNnID0gaXNyZXNlcnZlZChndC0+bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgPyAiPCVzPiBhdCBsaW5lICVkIG5vdCBpbnNpZGUgYSBsb29wIgorICAgICAgICAgICAgICAgICAgICA6ICJubyB2aXNpYmxlIGxhYmVsICIgTFVBX1FTICIgZm9yIDxnb3RvPiBhdCBsaW5lICVkIjsKKyAgbXNnID0gbHVhT19wdXNoZnN0cmluZyhscy0+TCwgbXNnLCBnZXRzdHIoZ3QtPm5hbWUpLCBndC0+bGluZSk7CisgIHNlbWVycm9yKGxzLCBtc2cpOworfQorCisKK3N0YXRpYyB2b2lkIGxlYXZlYmxvY2sgKEZ1bmNTdGF0ZSAqZnMpIHsKKyAgQmxvY2tDbnQgKmJsID0gZnMtPmJsOworICBMZXhTdGF0ZSAqbHMgPSBmcy0+bHM7CisgIGlmIChibC0+cHJldmlvdXMgJiYgYmwtPnVwdmFsKSB7CisgICAgLyogY3JlYXRlIGEgJ2p1bXAgdG8gaGVyZScgdG8gY2xvc2UgdXB2YWx1ZXMgKi8KKyAgICBpbnQgaiA9IGx1YUtfanVtcChmcyk7CisgICAgbHVhS19wYXRjaGNsb3NlKGZzLCBqLCBibC0+bmFjdHZhcik7CisgICAgbHVhS19wYXRjaHRvaGVyZShmcywgaik7CisgIH0KKyAgaWYgKGJsLT5pc2xvb3ApCisgICAgYnJlYWtsYWJlbChscyk7ICAvKiBjbG9zZSBwZW5kaW5nIGJyZWFrcyAqLworICBmcy0+YmwgPSBibC0+cHJldmlvdXM7CisgIHJlbW92ZXZhcnMoZnMsIGJsLT5uYWN0dmFyKTsKKyAgbHVhX2Fzc2VydChibC0+bmFjdHZhciA9PSBmcy0+bmFjdHZhcik7CisgIGZzLT5mcmVlcmVnID0gZnMtPm5hY3R2YXI7ICAvKiBmcmVlIHJlZ2lzdGVycyAqLworICBscy0+ZHlkLT5sYWJlbC5uID0gYmwtPmZpcnN0bGFiZWw7ICAvKiByZW1vdmUgbG9jYWwgbGFiZWxzICovCisgIGlmIChibC0+cHJldmlvdXMpICAvKiBpbm5lciBibG9jaz8gKi8KKyAgICBtb3ZlZ290b3NvdXQoZnMsIGJsKTsgIC8qIHVwZGF0ZSBwZW5kaW5nIGdvdG9zIHRvIG91dGVyIGJsb2NrICovCisgIGVsc2UgaWYgKGJsLT5maXJzdGdvdG8gPCBscy0+ZHlkLT5ndC5uKSAgLyogcGVuZGluZyBnb3RvcyBpbiBvdXRlciBibG9jaz8gKi8KKyAgICB1bmRlZmdvdG8obHMsICZscy0+ZHlkLT5ndC5hcnJbYmwtPmZpcnN0Z290b10pOyAgLyogZXJyb3IgKi8KK30KKworCisvKgorKiogYWRkcyBhIG5ldyBwcm90b3R5cGUgaW50byBsaXN0IG9mIHByb3RvdHlwZXMKKyovCitzdGF0aWMgUHJvdG8gKmFkZHByb3RvdHlwZSAoTGV4U3RhdGUgKmxzKSB7CisgIFByb3RvICpjbHA7CisgIGx1YV9TdGF0ZSAqTCA9IGxzLT5MOworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBQcm90byAqZiA9IGZzLT5mOyAgLyogcHJvdG90eXBlIG9mIGN1cnJlbnQgZnVuY3Rpb24gKi8KKyAgaWYgKGZzLT5ucCA+PSBmLT5zaXplcCkgeworICAgIGludCBvbGRzaXplID0gZi0+c2l6ZXA7CisgICAgbHVhTV9ncm93dmVjdG9yKEwsIGYtPnAsIGZzLT5ucCwgZi0+c2l6ZXAsIFByb3RvICosIE1BWEFSR19CeCwgImZ1bmN0aW9ucyIpOworICAgIHdoaWxlIChvbGRzaXplIDwgZi0+c2l6ZXApIGYtPnBbb2xkc2l6ZSsrXSA9IE5VTEw7CisgIH0KKyAgZi0+cFtmcy0+bnArK10gPSBjbHAgPSBsdWFGX25ld3Byb3RvKEwpOworICBsdWFDX29iamJhcnJpZXIoTCwgZiwgY2xwKTsKKyAgcmV0dXJuIGNscDsKK30KKworCisvKgorKiogY29kZXMgaW5zdHJ1Y3Rpb24gdG8gY3JlYXRlIG5ldyBjbG9zdXJlIGluIHBhcmVudCBmdW5jdGlvbi4KKyoqIFRoZSBPUF9DTE9TVVJFIGluc3RydWN0aW9uIG11c3QgdXNlIHRoZSBsYXN0IGF2YWlsYWJsZSByZWdpc3RlciwKKyoqIHNvIHRoYXQsIGlmIGl0IGludm9rZXMgdGhlIEdDLCB0aGUgR0Mga25vd3Mgd2hpY2ggcmVnaXN0ZXJzCisqKiBhcmUgaW4gdXNlIGF0IHRoYXQgdGltZS4KKyovCitzdGF0aWMgdm9pZCBjb2RlY2xvc3VyZSAoTGV4U3RhdGUgKmxzLCBleHBkZXNjICp2KSB7CisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnMtPnByZXY7CisgIGluaXRfZXhwKHYsIFZSRUxPQ0FCTEUsIGx1YUtfY29kZUFCeChmcywgT1BfQ0xPU1VSRSwgMCwgZnMtPm5wIC0gMSkpOworICBsdWFLX2V4cDJuZXh0cmVnKGZzLCB2KTsgIC8qIGZpeCBpdCBhdCB0aGUgbGFzdCByZWdpc3RlciAqLworfQorCisKK3N0YXRpYyB2b2lkIG9wZW5fZnVuYyAoTGV4U3RhdGUgKmxzLCBGdW5jU3RhdGUgKmZzLCBCbG9ja0NudCAqYmwpIHsKKyAgbHVhX1N0YXRlICpMID0gbHMtPkw7CisgIFByb3RvICpmOworICBmcy0+cHJldiA9IGxzLT5mczsgIC8qIGxpbmtlZCBsaXN0IG9mIGZ1bmNzdGF0ZXMgKi8KKyAgZnMtPmxzID0gbHM7CisgIGxzLT5mcyA9IGZzOworICBmcy0+cGMgPSAwOworICBmcy0+bGFzdHRhcmdldCA9IDA7CisgIGZzLT5qcGMgPSBOT19KVU1QOworICBmcy0+ZnJlZXJlZyA9IDA7CisgIGZzLT5uayA9IDA7CisgIGZzLT5ucCA9IDA7CisgIGZzLT5udXBzID0gMDsKKyAgZnMtPm5sb2N2YXJzID0gMDsKKyAgZnMtPm5hY3R2YXIgPSAwOworICBmcy0+Zmlyc3Rsb2NhbCA9IGxzLT5keWQtPmFjdHZhci5uOworICBmcy0+YmwgPSBOVUxMOworICBmID0gZnMtPmY7CisgIGYtPnNvdXJjZSA9IGxzLT5zb3VyY2U7CisgIGYtPm1heHN0YWNrc2l6ZSA9IDI7ICAvKiByZWdpc3RlcnMgMC8xIGFyZSBhbHdheXMgdmFsaWQgKi8KKyAgZnMtPmggPSBsdWFIX25ldyhMKTsKKyAgLyogYW5jaG9yIHRhYmxlIG9mIGNvbnN0YW50cyAodG8gYXZvaWQgYmVpbmcgY29sbGVjdGVkKSAqLworICBzZXRodmFsdWUycyhMLCBMLT50b3AsIGZzLT5oKTsKKyAgaW5jcl90b3AoTCk7CisgIGVudGVyYmxvY2soZnMsIGJsLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCBjbG9zZV9mdW5jIChMZXhTdGF0ZSAqbHMpIHsKKyAgbHVhX1N0YXRlICpMID0gbHMtPkw7CisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIFByb3RvICpmID0gZnMtPmY7CisgIGx1YUtfcmV0KGZzLCAwLCAwKTsgIC8qIGZpbmFsIHJldHVybiAqLworICBsZWF2ZWJsb2NrKGZzKTsKKyAgbHVhTV9yZWFsbG9jdmVjdG9yKEwsIGYtPmNvZGUsIGYtPnNpemVjb2RlLCBmcy0+cGMsIEluc3RydWN0aW9uKTsKKyAgZi0+c2l6ZWNvZGUgPSBmcy0+cGM7CisgIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCBmLT5saW5laW5mbywgZi0+c2l6ZWxpbmVpbmZvLCBmcy0+cGMsIGludCk7CisgIGYtPnNpemVsaW5laW5mbyA9IGZzLT5wYzsKKyAgbHVhTV9yZWFsbG9jdmVjdG9yKEwsIGYtPmssIGYtPnNpemVrLCBmcy0+bmssIFRWYWx1ZSk7CisgIGYtPnNpemVrID0gZnMtPm5rOworICBsdWFNX3JlYWxsb2N2ZWN0b3IoTCwgZi0+cCwgZi0+c2l6ZXAsIGZzLT5ucCwgUHJvdG8gKik7CisgIGYtPnNpemVwID0gZnMtPm5wOworICBsdWFNX3JlYWxsb2N2ZWN0b3IoTCwgZi0+bG9jdmFycywgZi0+c2l6ZWxvY3ZhcnMsIGZzLT5ubG9jdmFycywgTG9jVmFyKTsKKyAgZi0+c2l6ZWxvY3ZhcnMgPSBmcy0+bmxvY3ZhcnM7CisgIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCBmLT51cHZhbHVlcywgZi0+c2l6ZXVwdmFsdWVzLCBmcy0+bnVwcywgVXB2YWxkZXNjKTsKKyAgZi0+c2l6ZXVwdmFsdWVzID0gZnMtPm51cHM7CisgIGx1YV9hc3NlcnQoZnMtPmJsID09IE5VTEwpOworICBscy0+ZnMgPSBmcy0+cHJldjsKKyAgLyogbGFzdCB0b2tlbiByZWFkIHdhcyBhbmNob3JlZCBpbiBkZWZ1bmN0IGZ1bmN0aW9uOyBtdXN0IHJlLWFuY2hvciBpdCAqLworICBhbmNob3JfdG9rZW4obHMpOworICBMLT50b3AtLTsgIC8qIHBvcCB0YWJsZSBvZiBjb25zdGFudHMgKi8KKyAgbHVhQ19jaGVja0dDKEwpOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogR1JBTU1BUiBSVUxFUyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qCisqKiBjaGVjayB3aGV0aGVyIGN1cnJlbnQgdG9rZW4gaXMgaW4gdGhlIGZvbGxvdyBzZXQgb2YgYSBibG9jay4KKyoqICd1bnRpbCcgY2xvc2VzIHN5bnRhY3RpY2FsIGJsb2NrcywgYnV0IGRvIG5vdCBjbG9zZSBzY29wZSwKKyoqIHNvIGl0IGhhbmRsZWQgaW4gc2VwYXJhdGUuCisqLworc3RhdGljIGludCBibG9ja19mb2xsb3cgKExleFN0YXRlICpscywgaW50IHdpdGh1bnRpbCkgeworICBzd2l0Y2ggKGxzLT50LnRva2VuKSB7CisgICAgY2FzZSBUS19FTFNFOiBjYXNlIFRLX0VMU0VJRjoKKyAgICBjYXNlIFRLX0VORDogY2FzZSBUS19FT1M6CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFRLX1VOVElMOiByZXR1cm4gd2l0aHVudGlsOworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9Cit9CisKKworc3RhdGljIHZvaWQgc3RhdGxpc3QgKExleFN0YXRlICpscykgeworICAvKiBzdGF0bGlzdCAtPiB7IHN0YXQgW2A7J10gfSAqLworICB3aGlsZSAoIWJsb2NrX2ZvbGxvdyhscywgMSkpIHsKKyAgICBpZiAobHMtPnQudG9rZW4gPT0gVEtfUkVUVVJOKSB7CisgICAgICBzdGF0ZW1lbnQobHMpOworICAgICAgcmV0dXJuOyAgLyogJ3JldHVybicgbXVzdCBiZSBsYXN0IHN0YXRlbWVudCAqLworICAgIH0KKyAgICBzdGF0ZW1lbnQobHMpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgZmllbGRzZWwgKExleFN0YXRlICpscywgZXhwZGVzYyAqdikgeworICAvKiBmaWVsZHNlbCAtPiBbJy4nIHwgJzonXSBOQU1FICovCisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGV4cGRlc2Mga2V5OworICBsdWFLX2V4cDJhbnlyZWd1cChmcywgdik7CisgIGx1YVhfbmV4dChscyk7ICAvKiBza2lwIHRoZSBkb3Qgb3IgY29sb24gKi8KKyAgY2hlY2tuYW1lKGxzLCAma2V5KTsKKyAgbHVhS19pbmRleGVkKGZzLCB2LCAma2V5KTsKK30KKworCitzdGF0aWMgdm9pZCB5aW5kZXggKExleFN0YXRlICpscywgZXhwZGVzYyAqdikgeworICAvKiBpbmRleCAtPiAnWycgZXhwciAnXScgKi8KKyAgbHVhWF9uZXh0KGxzKTsgIC8qIHNraXAgdGhlICdbJyAqLworICBleHByKGxzLCB2KTsKKyAgbHVhS19leHAydmFsKGxzLT5mcywgdik7CisgIGNoZWNrbmV4dChscywgJ10nKTsKK30KKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFJ1bGVzIGZvciBDb25zdHJ1Y3RvcnMKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKK3N0cnVjdCBDb25zQ29udHJvbCB7CisgIGV4cGRlc2MgdjsgIC8qIGxhc3QgbGlzdCBpdGVtIHJlYWQgKi8KKyAgZXhwZGVzYyAqdDsgIC8qIHRhYmxlIGRlc2NyaXB0b3IgKi8KKyAgaW50IG5oOyAgLyogdG90YWwgbnVtYmVyIG9mIGByZWNvcmQnIGVsZW1lbnRzICovCisgIGludCBuYTsgIC8qIHRvdGFsIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqLworICBpbnQgdG9zdG9yZTsgIC8qIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyBwZW5kaW5nIHRvIGJlIHN0b3JlZCAqLworfTsKKworCitzdGF0aWMgdm9pZCByZWNmaWVsZCAoTGV4U3RhdGUgKmxzLCBzdHJ1Y3QgQ29uc0NvbnRyb2wgKmNjKSB7CisgIC8qIHJlY2ZpZWxkIC0+IChOQU1FIHwgYFsnZXhwMWBdJykgPSBleHAxICovCisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGludCByZWcgPSBscy0+ZnMtPmZyZWVyZWc7CisgIGV4cGRlc2Mga2V5LCB2YWw7CisgIGludCBya2tleTsKKyAgaWYgKGxzLT50LnRva2VuID09IFRLX05BTUUpIHsKKyAgICBjaGVja2xpbWl0KGZzLCBjYy0+bmgsIE1BWF9JTlQsICJpdGVtcyBpbiBhIGNvbnN0cnVjdG9yIik7CisgICAgY2hlY2tuYW1lKGxzLCAma2V5KTsKKyAgfQorICBlbHNlICAvKiBscy0+dC50b2tlbiA9PSAnWycgKi8KKyAgICB5aW5kZXgobHMsICZrZXkpOworICBjYy0+bmgrKzsKKyAgY2hlY2tuZXh0KGxzLCAnPScpOworICBya2tleSA9IGx1YUtfZXhwMlJLKGZzLCAma2V5KTsKKyAgZXhwcihscywgJnZhbCk7CisgIGx1YUtfY29kZUFCQyhmcywgT1BfU0VUVEFCTEUsIGNjLT50LT51LmluZm8sIHJra2V5LCBsdWFLX2V4cDJSSyhmcywgJnZhbCkpOworICBmcy0+ZnJlZXJlZyA9IHJlZzsgIC8qIGZyZWUgcmVnaXN0ZXJzICovCit9CisKKworc3RhdGljIHZvaWQgY2xvc2VsaXN0ZmllbGQgKEZ1bmNTdGF0ZSAqZnMsIHN0cnVjdCBDb25zQ29udHJvbCAqY2MpIHsKKyAgaWYgKGNjLT52LmsgPT0gVlZPSUQpIHJldHVybjsgIC8qIHRoZXJlIGlzIG5vIGxpc3QgaXRlbSAqLworICBsdWFLX2V4cDJuZXh0cmVnKGZzLCAmY2MtPnYpOworICBjYy0+di5rID0gVlZPSUQ7CisgIGlmIChjYy0+dG9zdG9yZSA9PSBMRklFTERTX1BFUl9GTFVTSCkgeworICAgIGx1YUtfc2V0bGlzdChmcywgY2MtPnQtPnUuaW5mbywgY2MtPm5hLCBjYy0+dG9zdG9yZSk7ICAvKiBmbHVzaCAqLworICAgIGNjLT50b3N0b3JlID0gMDsgIC8qIG5vIG1vcmUgaXRlbXMgcGVuZGluZyAqLworICB9Cit9CisKKworc3RhdGljIHZvaWQgbGFzdGxpc3RmaWVsZCAoRnVuY1N0YXRlICpmcywgc3RydWN0IENvbnNDb250cm9sICpjYykgeworICBpZiAoY2MtPnRvc3RvcmUgPT0gMCkgcmV0dXJuOworICBpZiAoaGFzbXVsdHJldChjYy0+di5rKSkgeworICAgIGx1YUtfc2V0bXVsdHJldChmcywgJmNjLT52KTsKKyAgICBsdWFLX3NldGxpc3QoZnMsIGNjLT50LT51LmluZm8sIGNjLT5uYSwgTFVBX01VTFRSRVQpOworICAgIGNjLT5uYS0tOyAgLyogZG8gbm90IGNvdW50IGxhc3QgZXhwcmVzc2lvbiAodW5rbm93biBudW1iZXIgb2YgZWxlbWVudHMpICovCisgIH0KKyAgZWxzZSB7CisgICAgaWYgKGNjLT52LmsgIT0gVlZPSUQpCisgICAgICBsdWFLX2V4cDJuZXh0cmVnKGZzLCAmY2MtPnYpOworICAgIGx1YUtfc2V0bGlzdChmcywgY2MtPnQtPnUuaW5mbywgY2MtPm5hLCBjYy0+dG9zdG9yZSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBsaXN0ZmllbGQgKExleFN0YXRlICpscywgc3RydWN0IENvbnNDb250cm9sICpjYykgeworICAvKiBsaXN0ZmllbGQgLT4gZXhwICovCisgIGV4cHIobHMsICZjYy0+dik7CisgIGNoZWNrbGltaXQobHMtPmZzLCBjYy0+bmEsIE1BWF9JTlQsICJpdGVtcyBpbiBhIGNvbnN0cnVjdG9yIik7CisgIGNjLT5uYSsrOworICBjYy0+dG9zdG9yZSsrOworfQorCisKK3N0YXRpYyB2b2lkIGZpZWxkIChMZXhTdGF0ZSAqbHMsIHN0cnVjdCBDb25zQ29udHJvbCAqY2MpIHsKKyAgLyogZmllbGQgLT4gbGlzdGZpZWxkIHwgcmVjZmllbGQgKi8KKyAgc3dpdGNoKGxzLT50LnRva2VuKSB7CisgICAgY2FzZSBUS19OQU1FOiB7ICAvKiBtYXkgYmUgJ2xpc3RmaWVsZCcgb3IgJ3JlY2ZpZWxkJyAqLworICAgICAgaWYgKGx1YVhfbG9va2FoZWFkKGxzKSAhPSAnPScpICAvKiBleHByZXNzaW9uPyAqLworICAgICAgICBsaXN0ZmllbGQobHMsIGNjKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmVjZmllbGQobHMsIGNjKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdbJzogeworICAgICAgcmVjZmllbGQobHMsIGNjKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBsaXN0ZmllbGQobHMsIGNjKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNvbnN0cnVjdG9yIChMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKnQpIHsKKyAgLyogY29uc3RydWN0b3IgLT4gJ3snIFsgZmllbGQgeyBzZXAgZmllbGQgfSBbc2VwXSBdICd9JworICAgICBzZXAgLT4gJywnIHwgJzsnICovCisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGludCBsaW5lID0gbHMtPmxpbmVudW1iZXI7CisgIGludCBwYyA9IGx1YUtfY29kZUFCQyhmcywgT1BfTkVXVEFCTEUsIDAsIDAsIDApOworICBzdHJ1Y3QgQ29uc0NvbnRyb2wgY2M7CisgIGNjLm5hID0gY2MubmggPSBjYy50b3N0b3JlID0gMDsKKyAgY2MudCA9IHQ7CisgIGluaXRfZXhwKHQsIFZSRUxPQ0FCTEUsIHBjKTsKKyAgaW5pdF9leHAoJmNjLnYsIFZWT0lELCAwKTsgIC8qIG5vIHZhbHVlICh5ZXQpICovCisgIGx1YUtfZXhwMm5leHRyZWcobHMtPmZzLCB0KTsgIC8qIGZpeCBpdCBhdCBzdGFjayB0b3AgKi8KKyAgY2hlY2tuZXh0KGxzLCAneycpOworICBkbyB7CisgICAgbHVhX2Fzc2VydChjYy52LmsgPT0gVlZPSUQgfHwgY2MudG9zdG9yZSA+IDApOworICAgIGlmIChscy0+dC50b2tlbiA9PSAnfScpIGJyZWFrOworICAgIGNsb3NlbGlzdGZpZWxkKGZzLCAmY2MpOworICAgIGZpZWxkKGxzLCAmY2MpOworICB9IHdoaWxlICh0ZXN0bmV4dChscywgJywnKSB8fCB0ZXN0bmV4dChscywgJzsnKSk7CisgIGNoZWNrX21hdGNoKGxzLCAnfScsICd7JywgbGluZSk7CisgIGxhc3RsaXN0ZmllbGQoZnMsICZjYyk7CisgIFNFVEFSR19CKGZzLT5mLT5jb2RlW3BjXSwgbHVhT19pbnQyZmIoY2MubmEpKTsgLyogc2V0IGluaXRpYWwgYXJyYXkgc2l6ZSAqLworICBTRVRBUkdfQyhmcy0+Zi0+Y29kZVtwY10sIGx1YU9faW50MmZiKGNjLm5oKSk7ICAvKiBzZXQgaW5pdGlhbCB0YWJsZSBzaXplICovCit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworCitzdGF0aWMgdm9pZCBwYXJsaXN0IChMZXhTdGF0ZSAqbHMpIHsKKyAgLyogcGFybGlzdCAtPiBbIHBhcmFtIHsgYCwnIHBhcmFtIH0gXSAqLworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBQcm90byAqZiA9IGZzLT5mOworICBpbnQgbnBhcmFtcyA9IDA7CisgIGYtPmlzX3ZhcmFyZyA9IDA7CisgIGlmIChscy0+dC50b2tlbiAhPSAnKScpIHsgIC8qIGlzIGBwYXJsaXN0JyBub3QgZW1wdHk/ICovCisgICAgZG8geworICAgICAgc3dpdGNoIChscy0+dC50b2tlbikgeworICAgICAgICBjYXNlIFRLX05BTUU6IHsgIC8qIHBhcmFtIC0+IE5BTUUgKi8KKyAgICAgICAgICBuZXdfbG9jYWx2YXIobHMsIHN0cl9jaGVja25hbWUobHMpKTsKKyAgICAgICAgICBucGFyYW1zKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUS19ET1RTOiB7ICAvKiBwYXJhbSAtPiBgLi4uJyAqLworICAgICAgICAgIGx1YVhfbmV4dChscyk7CisgICAgICAgICAgZi0+aXNfdmFyYXJnID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiBsdWFYX3N5bnRheGVycm9yKGxzLCAiPG5hbWU+IG9yICIgTFVBX1FMKCIuLi4iKSAiIGV4cGVjdGVkIik7CisgICAgICB9CisgICAgfSB3aGlsZSAoIWYtPmlzX3ZhcmFyZyAmJiB0ZXN0bmV4dChscywgJywnKSk7CisgIH0KKyAgYWRqdXN0bG9jYWx2YXJzKGxzLCBucGFyYW1zKTsKKyAgZi0+bnVtcGFyYW1zID0gY2FzdF9ieXRlKGZzLT5uYWN0dmFyKTsKKyAgbHVhS19yZXNlcnZlcmVncyhmcywgZnMtPm5hY3R2YXIpOyAgLyogcmVzZXJ2ZSByZWdpc3RlciBmb3IgcGFyYW1ldGVycyAqLworfQorCisKK3N0YXRpYyB2b2lkIGJvZHkgKExleFN0YXRlICpscywgZXhwZGVzYyAqZSwgaW50IGlzbWV0aG9kLCBpbnQgbGluZSkgeworICAvKiBib2R5IC0+ICBgKCcgcGFybGlzdCBgKScgYmxvY2sgRU5EICovCisgIEZ1bmNTdGF0ZSBuZXdfZnM7CisgIEJsb2NrQ250IGJsOworICBuZXdfZnMuZiA9IGFkZHByb3RvdHlwZShscyk7CisgIG5ld19mcy5mLT5saW5lZGVmaW5lZCA9IGxpbmU7CisgIG9wZW5fZnVuYyhscywgJm5ld19mcywgJmJsKTsKKyAgY2hlY2tuZXh0KGxzLCAnKCcpOworICBpZiAoaXNtZXRob2QpIHsKKyAgICBuZXdfbG9jYWx2YXJsaXRlcmFsKGxzLCAic2VsZiIpOyAgLyogY3JlYXRlICdzZWxmJyBwYXJhbWV0ZXIgKi8KKyAgICBhZGp1c3Rsb2NhbHZhcnMobHMsIDEpOworICB9CisgIHBhcmxpc3QobHMpOworICBjaGVja25leHQobHMsICcpJyk7CisgIHN0YXRsaXN0KGxzKTsKKyAgbmV3X2ZzLmYtPmxhc3RsaW5lZGVmaW5lZCA9IGxzLT5saW5lbnVtYmVyOworICBjaGVja19tYXRjaChscywgVEtfRU5ELCBUS19GVU5DVElPTiwgbGluZSk7CisgIGNvZGVjbG9zdXJlKGxzLCBlKTsKKyAgY2xvc2VfZnVuYyhscyk7Cit9CisKKworc3RhdGljIGludCBleHBsaXN0IChMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKnYpIHsKKyAgLyogZXhwbGlzdCAtPiBleHByIHsgYCwnIGV4cHIgfSAqLworICBpbnQgbiA9IDE7ICAvKiBhdCBsZWFzdCBvbmUgZXhwcmVzc2lvbiAqLworICBleHByKGxzLCB2KTsKKyAgd2hpbGUgKHRlc3RuZXh0KGxzLCAnLCcpKSB7CisgICAgbHVhS19leHAybmV4dHJlZyhscy0+ZnMsIHYpOworICAgIGV4cHIobHMsIHYpOworICAgIG4rKzsKKyAgfQorICByZXR1cm4gbjsKK30KKworCitzdGF0aWMgdm9pZCBmdW5jYXJncyAoTGV4U3RhdGUgKmxzLCBleHBkZXNjICpmLCBpbnQgbGluZSkgeworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBleHBkZXNjIGFyZ3M7CisgIGludCBiYXNlLCBucGFyYW1zOworICBzd2l0Y2ggKGxzLT50LnRva2VuKSB7CisgICAgY2FzZSAnKCc6IHsgIC8qIGZ1bmNhcmdzIC0+IGAoJyBbIGV4cGxpc3QgXSBgKScgKi8KKyAgICAgIGx1YVhfbmV4dChscyk7CisgICAgICBpZiAobHMtPnQudG9rZW4gPT0gJyknKSAgLyogYXJnIGxpc3QgaXMgZW1wdHk/ICovCisgICAgICAgIGFyZ3MuayA9IFZWT0lEOworICAgICAgZWxzZSB7CisgICAgICAgIGV4cGxpc3QobHMsICZhcmdzKTsKKyAgICAgICAgbHVhS19zZXRtdWx0cmV0KGZzLCAmYXJncyk7CisgICAgICB9CisgICAgICBjaGVja19tYXRjaChscywgJyknLCAnKCcsIGxpbmUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ3snOiB7ICAvKiBmdW5jYXJncyAtPiBjb25zdHJ1Y3RvciAqLworICAgICAgY29uc3RydWN0b3IobHMsICZhcmdzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRLX1NUUklORzogeyAgLyogZnVuY2FyZ3MgLT4gU1RSSU5HICovCisgICAgICBjb2Rlc3RyaW5nKGxzLCAmYXJncywgbHMtPnQuc2VtaW5mby50cyk7CisgICAgICBsdWFYX25leHQobHMpOyAgLyogbXVzdCB1c2UgYHNlbWluZm8nIGJlZm9yZSBgbmV4dCcgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBsdWFYX3N5bnRheGVycm9yKGxzLCAiZnVuY3Rpb24gYXJndW1lbnRzIGV4cGVjdGVkIik7CisgICAgfQorICB9CisgIGx1YV9hc3NlcnQoZi0+ayA9PSBWTk9OUkVMT0MpOworICBiYXNlID0gZi0+dS5pbmZvOyAgLyogYmFzZSByZWdpc3RlciBmb3IgY2FsbCAqLworICBpZiAoaGFzbXVsdHJldChhcmdzLmspKQorICAgIG5wYXJhbXMgPSBMVUFfTVVMVFJFVDsgIC8qIG9wZW4gY2FsbCAqLworICBlbHNlIHsKKyAgICBpZiAoYXJncy5rICE9IFZWT0lEKQorICAgICAgbHVhS19leHAybmV4dHJlZyhmcywgJmFyZ3MpOyAgLyogY2xvc2UgbGFzdCBhcmd1bWVudCAqLworICAgIG5wYXJhbXMgPSBmcy0+ZnJlZXJlZyAtIChiYXNlKzEpOworICB9CisgIGluaXRfZXhwKGYsIFZDQUxMLCBsdWFLX2NvZGVBQkMoZnMsIE9QX0NBTEwsIGJhc2UsIG5wYXJhbXMrMSwgMikpOworICBsdWFLX2ZpeGxpbmUoZnMsIGxpbmUpOworICBmcy0+ZnJlZXJlZyA9IGJhc2UrMTsgIC8qIGNhbGwgcmVtb3ZlIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgYW5kIGxlYXZlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmxlc3MgY2hhbmdlZCkgb25lIHJlc3VsdCAqLworfQorCisKKworCisvKgorKiogez09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIEV4cHJlc3Npb24gcGFyc2luZworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworc3RhdGljIHZvaWQgcHJpbWFyeWV4cCAoTGV4U3RhdGUgKmxzLCBleHBkZXNjICp2KSB7CisgIC8qIHByaW1hcnlleHAgLT4gTkFNRSB8ICcoJyBleHByICcpJyAqLworICBzd2l0Y2ggKGxzLT50LnRva2VuKSB7CisgICAgY2FzZSAnKCc6IHsKKyAgICAgIGludCBsaW5lID0gbHMtPmxpbmVudW1iZXI7CisgICAgICBsdWFYX25leHQobHMpOworICAgICAgZXhwcihscywgdik7CisgICAgICBjaGVja19tYXRjaChscywgJyknLCAnKCcsIGxpbmUpOworICAgICAgbHVhS19kaXNjaGFyZ2V2YXJzKGxzLT5mcywgdik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVEtfTkFNRTogeworICAgICAgc2luZ2xldmFyKGxzLCB2KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgbHVhWF9zeW50YXhlcnJvcihscywgInVuZXhwZWN0ZWQgc3ltYm9sIik7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgc3VmZml4ZWRleHAgKExleFN0YXRlICpscywgZXhwZGVzYyAqdikgeworICAvKiBzdWZmaXhlZGV4cCAtPgorICAgICAgIHByaW1hcnlleHAgeyAnLicgTkFNRSB8ICdbJyBleHAgJ10nIHwgJzonIE5BTUUgZnVuY2FyZ3MgfCBmdW5jYXJncyB9ICovCisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGludCBsaW5lID0gbHMtPmxpbmVudW1iZXI7CisgIHByaW1hcnlleHAobHMsIHYpOworICBmb3IgKDs7KSB7CisgICAgc3dpdGNoIChscy0+dC50b2tlbikgeworICAgICAgY2FzZSAnLic6IHsgIC8qIGZpZWxkc2VsICovCisgICAgICAgIGZpZWxkc2VsKGxzLCB2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdbJzogeyAgLyogYFsnIGV4cDEgYF0nICovCisgICAgICAgIGV4cGRlc2Mga2V5OworICAgICAgICBsdWFLX2V4cDJhbnlyZWd1cChmcywgdik7CisgICAgICAgIHlpbmRleChscywgJmtleSk7CisgICAgICAgIGx1YUtfaW5kZXhlZChmcywgdiwgJmtleSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnOic6IHsgIC8qIGA6JyBOQU1FIGZ1bmNhcmdzICovCisgICAgICAgIGV4cGRlc2Mga2V5OworICAgICAgICBsdWFYX25leHQobHMpOworICAgICAgICBjaGVja25hbWUobHMsICZrZXkpOworICAgICAgICBsdWFLX3NlbGYoZnMsIHYsICZrZXkpOworICAgICAgICBmdW5jYXJncyhscywgdiwgbGluZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnKCc6IGNhc2UgVEtfU1RSSU5HOiBjYXNlICd7JzogeyAgLyogZnVuY2FyZ3MgKi8KKyAgICAgICAgbHVhS19leHAybmV4dHJlZyhmcywgdik7CisgICAgICAgIGZ1bmNhcmdzKGxzLCB2LCBsaW5lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OiByZXR1cm47CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgc2ltcGxlZXhwIChMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKnYpIHsKKyAgLyogc2ltcGxlZXhwIC0+IE5VTUJFUiB8IFNUUklORyB8IE5JTCB8IFRSVUUgfCBGQUxTRSB8IC4uLiB8CisgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciB8IEZVTkNUSU9OIGJvZHkgfCBzdWZmaXhlZGV4cCAqLworICBzd2l0Y2ggKGxzLT50LnRva2VuKSB7CisgICAgY2FzZSBUS19OVU1CRVI6IHsKKyAgICAgIGluaXRfZXhwKHYsIFZLTlVNLCAwKTsKKyAgICAgIHYtPnUubnZhbCA9IGxzLT50LnNlbWluZm8ucjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRLX1NUUklORzogeworICAgICAgY29kZXN0cmluZyhscywgdiwgbHMtPnQuc2VtaW5mby50cyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19OSUw6IHsKKyAgICAgIGluaXRfZXhwKHYsIFZOSUwsIDApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVEtfVFJVRTogeworICAgICAgaW5pdF9leHAodiwgVlRSVUUsIDApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVEtfRkFMU0U6IHsKKyAgICAgIGluaXRfZXhwKHYsIFZGQUxTRSwgMCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19ET1RTOiB7ICAvKiB2YXJhcmcgKi8KKyAgICAgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgICAgICBjaGVja19jb25kaXRpb24obHMsIGZzLT5mLT5pc192YXJhcmcsCisgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCB1c2UgIiBMVUFfUUwoIi4uLiIpICIgb3V0c2lkZSBhIHZhcmFyZyBmdW5jdGlvbiIpOworICAgICAgaW5pdF9leHAodiwgVlZBUkFSRywgbHVhS19jb2RlQUJDKGZzLCBPUF9WQVJBUkcsIDAsIDEsIDApKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICd7JzogeyAgLyogY29uc3RydWN0b3IgKi8KKyAgICAgIGNvbnN0cnVjdG9yKGxzLCB2KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBUS19GVU5DVElPTjogeworICAgICAgbHVhWF9uZXh0KGxzKTsKKyAgICAgIGJvZHkobHMsIHYsIDAsIGxzLT5saW5lbnVtYmVyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgc3VmZml4ZWRleHAobHMsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBsdWFYX25leHQobHMpOworfQorCisKK3N0YXRpYyBVbk9wciBnZXR1bm9wciAoaW50IG9wKSB7CisgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIFRLX05PVDogcmV0dXJuIE9QUl9OT1Q7CisgICAgY2FzZSAnLSc6IHJldHVybiBPUFJfTUlOVVM7CisgICAgY2FzZSAnIyc6IHJldHVybiBPUFJfTEVOOworICAgIGRlZmF1bHQ6IHJldHVybiBPUFJfTk9VTk9QUjsKKyAgfQorfQorCisKK3N0YXRpYyBCaW5PcHIgZ2V0Ymlub3ByIChpbnQgb3ApIHsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgJysnOiByZXR1cm4gT1BSX0FERDsKKyAgICBjYXNlICctJzogcmV0dXJuIE9QUl9TVUI7CisgICAgY2FzZSAnKic6IHJldHVybiBPUFJfTVVMOworICAgIGNhc2UgJy8nOiByZXR1cm4gT1BSX0RJVjsKKyAgICBjYXNlICclJzogcmV0dXJuIE9QUl9NT0Q7CisgICAgY2FzZSAnXic6IHJldHVybiBPUFJfUE9XOworICAgIGNhc2UgVEtfQ09OQ0FUOiByZXR1cm4gT1BSX0NPTkNBVDsKKyAgICBjYXNlIFRLX05FOiByZXR1cm4gT1BSX05FOworICAgIGNhc2UgVEtfRVE6IHJldHVybiBPUFJfRVE7CisgICAgY2FzZSAnPCc6IHJldHVybiBPUFJfTFQ7CisgICAgY2FzZSBUS19MRTogcmV0dXJuIE9QUl9MRTsKKyAgICBjYXNlICc+JzogcmV0dXJuIE9QUl9HVDsKKyAgICBjYXNlIFRLX0dFOiByZXR1cm4gT1BSX0dFOworICAgIGNhc2UgVEtfQU5EOiByZXR1cm4gT1BSX0FORDsKKyAgICBjYXNlIFRLX09SOiByZXR1cm4gT1BSX09SOworICAgIGRlZmF1bHQ6IHJldHVybiBPUFJfTk9CSU5PUFI7CisgIH0KK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgbHVfYnl0ZSBsZWZ0OyAgLyogbGVmdCBwcmlvcml0eSBmb3IgZWFjaCBiaW5hcnkgb3BlcmF0b3IgKi8KKyAgbHVfYnl0ZSByaWdodDsgLyogcmlnaHQgcHJpb3JpdHkgKi8KK30gcHJpb3JpdHlbXSA9IHsgIC8qIE9SREVSIE9QUiAqLworICAgezYsIDZ9LCB7NiwgNn0sIHs3LCA3fSwgezcsIDd9LCB7NywgN30sICAvKiBgKycgYC0nIGAqJyBgLycgYCUnICovCisgICB7MTAsIDl9LCB7NSwgNH0sICAgICAgICAgICAgICAgICAvKiBeLCAuLiAocmlnaHQgYXNzb2NpYXRpdmUpICovCisgICB7MywgM30sIHszLCAzfSwgezMsIDN9LCAgICAgICAgICAvKiA9PSwgPCwgPD0gKi8KKyAgIHszLCAzfSwgezMsIDN9LCB7MywgM30sICAgICAgICAgIC8qIH49LCA+LCA+PSAqLworICAgezIsIDJ9LCB7MSwgMX0gICAgICAgICAgICAgICAgICAgLyogYW5kLCBvciAqLworfTsKKworI2RlZmluZSBVTkFSWV9QUklPUklUWQk4ICAvKiBwcmlvcml0eSBmb3IgdW5hcnkgb3BlcmF0b3JzICovCisKKworLyoKKyoqIHN1YmV4cHIgLT4gKHNpbXBsZWV4cCB8IHVub3Agc3ViZXhwcikgeyBiaW5vcCBzdWJleHByIH0KKyoqIHdoZXJlIGBiaW5vcCcgaXMgYW55IGJpbmFyeSBvcGVyYXRvciB3aXRoIGEgcHJpb3JpdHkgaGlnaGVyIHRoYW4gYGxpbWl0JworKi8KK3N0YXRpYyBCaW5PcHIgc3ViZXhwciAoTGV4U3RhdGUgKmxzLCBleHBkZXNjICp2LCBpbnQgbGltaXQpIHsKKyAgQmluT3ByIG9wOworICBVbk9wciB1b3A7CisgIGVudGVybGV2ZWwobHMpOworICB1b3AgPSBnZXR1bm9wcihscy0+dC50b2tlbik7CisgIGlmICh1b3AgIT0gT1BSX05PVU5PUFIpIHsKKyAgICBpbnQgbGluZSA9IGxzLT5saW5lbnVtYmVyOworICAgIGx1YVhfbmV4dChscyk7CisgICAgc3ViZXhwcihscywgdiwgVU5BUllfUFJJT1JJVFkpOworICAgIGx1YUtfcHJlZml4KGxzLT5mcywgdW9wLCB2LCBsaW5lKTsKKyAgfQorICBlbHNlIHNpbXBsZWV4cChscywgdik7CisgIC8qIGV4cGFuZCB3aGlsZSBvcGVyYXRvcnMgaGF2ZSBwcmlvcml0aWVzIGhpZ2hlciB0aGFuIGBsaW1pdCcgKi8KKyAgb3AgPSBnZXRiaW5vcHIobHMtPnQudG9rZW4pOworICB3aGlsZSAob3AgIT0gT1BSX05PQklOT1BSICYmIHByaW9yaXR5W29wXS5sZWZ0ID4gbGltaXQpIHsKKyAgICBleHBkZXNjIHYyOworICAgIEJpbk9wciBuZXh0b3A7CisgICAgaW50IGxpbmUgPSBscy0+bGluZW51bWJlcjsKKyAgICBsdWFYX25leHQobHMpOworICAgIGx1YUtfaW5maXgobHMtPmZzLCBvcCwgdik7CisgICAgLyogcmVhZCBzdWItZXhwcmVzc2lvbiB3aXRoIGhpZ2hlciBwcmlvcml0eSAqLworICAgIG5leHRvcCA9IHN1YmV4cHIobHMsICZ2MiwgcHJpb3JpdHlbb3BdLnJpZ2h0KTsKKyAgICBsdWFLX3Bvc2ZpeChscy0+ZnMsIG9wLCB2LCAmdjIsIGxpbmUpOworICAgIG9wID0gbmV4dG9wOworICB9CisgIGxlYXZlbGV2ZWwobHMpOworICByZXR1cm4gb3A7ICAvKiByZXR1cm4gZmlyc3QgdW50cmVhdGVkIG9wZXJhdG9yICovCit9CisKKworc3RhdGljIHZvaWQgZXhwciAoTGV4U3RhdGUgKmxzLCBleHBkZXNjICp2KSB7CisgIHN1YmV4cHIobHMsIHYsIDApOworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogUnVsZXMgZm9yIFN0YXRlbWVudHMKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKK3N0YXRpYyB2b2lkIGJsb2NrIChMZXhTdGF0ZSAqbHMpIHsKKyAgLyogYmxvY2sgLT4gc3RhdGxpc3QgKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgQmxvY2tDbnQgYmw7CisgIGVudGVyYmxvY2soZnMsICZibCwgMCk7CisgIHN0YXRsaXN0KGxzKTsKKyAgbGVhdmVibG9jayhmcyk7Cit9CisKKworLyoKKyoqIHN0cnVjdHVyZSB0byBjaGFpbiBhbGwgdmFyaWFibGVzIGluIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhbgorKiogYXNzaWdubWVudAorKi8KK3N0cnVjdCBMSFNfYXNzaWduIHsKKyAgc3RydWN0IExIU19hc3NpZ24gKnByZXY7CisgIGV4cGRlc2MgdjsgIC8qIHZhcmlhYmxlIChnbG9iYWwsIGxvY2FsLCB1cHZhbHVlLCBvciBpbmRleGVkKSAqLworfTsKKworCisvKgorKiogY2hlY2sgd2hldGhlciwgaW4gYW4gYXNzaWdubWVudCB0byBhbiB1cHZhbHVlL2xvY2FsIHZhcmlhYmxlLCB0aGUKKyoqIHVwdmFsdWUvbG9jYWwgdmFyaWFibGUgaXMgYmVnaW4gdXNlZCBpbiBhIHByZXZpb3VzIGFzc2lnbm1lbnQgdG8gYQorKiogdGFibGUuIElmIHNvLCBzYXZlIG9yaWdpbmFsIHVwdmFsdWUvbG9jYWwgdmFsdWUgaW4gYSBzYWZlIHBsYWNlIGFuZAorKiogdXNlIHRoaXMgc2FmZSBjb3B5IGluIHRoZSBwcmV2aW91cyBhc3NpZ25tZW50LgorKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2NvbmZsaWN0IChMZXhTdGF0ZSAqbHMsIHN0cnVjdCBMSFNfYXNzaWduICpsaCwgZXhwZGVzYyAqdikgeworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBpbnQgZXh0cmEgPSBmcy0+ZnJlZXJlZzsgIC8qIGV2ZW50dWFsIHBvc2l0aW9uIHRvIHNhdmUgbG9jYWwgdmFyaWFibGUgKi8KKyAgaW50IGNvbmZsaWN0ID0gMDsKKyAgZm9yICg7IGxoOyBsaCA9IGxoLT5wcmV2KSB7ICAvKiBjaGVjayBhbGwgcHJldmlvdXMgYXNzaWdubWVudHMgKi8KKyAgICBpZiAobGgtPnYuayA9PSBWSU5ERVhFRCkgeyAgLyogYXNzaWduaW5nIHRvIGEgdGFibGU/ICovCisgICAgICAvKiB0YWJsZSBpcyB0aGUgdXB2YWx1ZS9sb2NhbCBiZWluZyBhc3NpZ25lZCBub3c/ICovCisgICAgICBpZiAobGgtPnYudS5pbmQudnQgPT0gdi0+ayAmJiBsaC0+di51LmluZC50ID09IHYtPnUuaW5mbykgeworICAgICAgICBjb25mbGljdCA9IDE7CisgICAgICAgIGxoLT52LnUuaW5kLnZ0ID0gVkxPQ0FMOworICAgICAgICBsaC0+di51LmluZC50ID0gZXh0cmE7ICAvKiBwcmV2aW91cyBhc3NpZ25tZW50IHdpbGwgdXNlIHNhZmUgY29weSAqLworICAgICAgfQorICAgICAgLyogaW5kZXggaXMgdGhlIGxvY2FsIGJlaW5nIGFzc2lnbmVkPyAoaW5kZXggY2Fubm90IGJlIHVwdmFsdWUpICovCisgICAgICBpZiAodi0+ayA9PSBWTE9DQUwgJiYgbGgtPnYudS5pbmQuaWR4ID09IHYtPnUuaW5mbykgeworICAgICAgICBjb25mbGljdCA9IDE7CisgICAgICAgIGxoLT52LnUuaW5kLmlkeCA9IGV4dHJhOyAgLyogcHJldmlvdXMgYXNzaWdubWVudCB3aWxsIHVzZSBzYWZlIGNvcHkgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGNvbmZsaWN0KSB7CisgICAgLyogY29weSB1cHZhbHVlL2xvY2FsIHZhbHVlIHRvIGEgdGVtcG9yYXJ5IChpbiBwb3NpdGlvbiAnZXh0cmEnKSAqLworICAgIE9wQ29kZSBvcCA9ICh2LT5rID09IFZMT0NBTCkgPyBPUF9NT1ZFIDogT1BfR0VUVVBWQUw7CisgICAgbHVhS19jb2RlQUJDKGZzLCBvcCwgZXh0cmEsIHYtPnUuaW5mbywgMCk7CisgICAgbHVhS19yZXNlcnZlcmVncyhmcywgMSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBhc3NpZ25tZW50IChMZXhTdGF0ZSAqbHMsIHN0cnVjdCBMSFNfYXNzaWduICpsaCwgaW50IG52YXJzKSB7CisgIGV4cGRlc2MgZTsKKyAgY2hlY2tfY29uZGl0aW9uKGxzLCB2a2lzdmFyKGxoLT52LmspLCAic3ludGF4IGVycm9yIik7CisgIGlmICh0ZXN0bmV4dChscywgJywnKSkgeyAgLyogYXNzaWdubWVudCAtPiAnLCcgc3VmZml4ZWRleHAgYXNzaWdubWVudCAqLworICAgIHN0cnVjdCBMSFNfYXNzaWduIG52OworICAgIG52LnByZXYgPSBsaDsKKyAgICBzdWZmaXhlZGV4cChscywgJm52LnYpOworICAgIGlmIChudi52LmsgIT0gVklOREVYRUQpCisgICAgICBjaGVja19jb25mbGljdChscywgbGgsICZudi52KTsKKyAgICBjaGVja2xpbWl0KGxzLT5mcywgbnZhcnMgKyBscy0+TC0+bkNjYWxscywgTFVBSV9NQVhDQ0FMTFMsCisgICAgICAgICAgICAgICAgICAgICJDIGxldmVscyIpOworICAgIGFzc2lnbm1lbnQobHMsICZudiwgbnZhcnMrMSk7CisgIH0KKyAgZWxzZSB7ICAvKiBhc3NpZ25tZW50IC0+IGA9JyBleHBsaXN0ICovCisgICAgaW50IG5leHBzOworICAgIGNoZWNrbmV4dChscywgJz0nKTsKKyAgICBuZXhwcyA9IGV4cGxpc3QobHMsICZlKTsKKyAgICBpZiAobmV4cHMgIT0gbnZhcnMpIHsKKyAgICAgIGFkanVzdF9hc3NpZ24obHMsIG52YXJzLCBuZXhwcywgJmUpOworICAgICAgaWYgKG5leHBzID4gbnZhcnMpCisgICAgICAgIGxzLT5mcy0+ZnJlZXJlZyAtPSBuZXhwcyAtIG52YXJzOyAgLyogcmVtb3ZlIGV4dHJhIHZhbHVlcyAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGx1YUtfc2V0b25lcmV0KGxzLT5mcywgJmUpOyAgLyogY2xvc2UgbGFzdCBleHByZXNzaW9uICovCisgICAgICBsdWFLX3N0b3JldmFyKGxzLT5mcywgJmxoLT52LCAmZSk7CisgICAgICByZXR1cm47ICAvKiBhdm9pZCBkZWZhdWx0ICovCisgICAgfQorICB9CisgIGluaXRfZXhwKCZlLCBWTk9OUkVMT0MsIGxzLT5mcy0+ZnJlZXJlZy0xKTsgIC8qIGRlZmF1bHQgYXNzaWdubWVudCAqLworICBsdWFLX3N0b3JldmFyKGxzLT5mcywgJmxoLT52LCAmZSk7Cit9CisKKworc3RhdGljIGludCBjb25kIChMZXhTdGF0ZSAqbHMpIHsKKyAgLyogY29uZCAtPiBleHAgKi8KKyAgZXhwZGVzYyB2OworICBleHByKGxzLCAmdik7ICAvKiByZWFkIGNvbmRpdGlvbiAqLworICBpZiAodi5rID09IFZOSUwpIHYuayA9IFZGQUxTRTsgIC8qIGBmYWxzZXMnIGFyZSBhbGwgZXF1YWwgaGVyZSAqLworICBsdWFLX2dvaWZ0cnVlKGxzLT5mcywgJnYpOworICByZXR1cm4gdi5mOworfQorCisKK3N0YXRpYyB2b2lkIGdvdG9zdGF0IChMZXhTdGF0ZSAqbHMsIGludCBwYykgeworICBpbnQgbGluZSA9IGxzLT5saW5lbnVtYmVyOworICBUU3RyaW5nICpsYWJlbDsKKyAgaW50IGc7CisgIGlmICh0ZXN0bmV4dChscywgVEtfR09UTykpCisgICAgbGFiZWwgPSBzdHJfY2hlY2tuYW1lKGxzKTsKKyAgZWxzZSB7CisgICAgbHVhWF9uZXh0KGxzKTsgIC8qIHNraXAgYnJlYWsgKi8KKyAgICBsYWJlbCA9IGx1YVNfbmV3KGxzLT5MLCAiYnJlYWsiKTsKKyAgfQorICBnID0gbmV3bGFiZWxlbnRyeShscywgJmxzLT5keWQtPmd0LCBsYWJlbCwgbGluZSwgcGMpOworICBmaW5kbGFiZWwobHMsIGcpOyAgLyogY2xvc2UgaXQgaWYgbGFiZWwgYWxyZWFkeSBkZWZpbmVkICovCit9CisKKworLyogY2hlY2sgZm9yIHJlcGVhdGVkIGxhYmVscyBvbiB0aGUgc2FtZSBibG9jayAqLworc3RhdGljIHZvaWQgY2hlY2tyZXBlYXRlZCAoRnVuY1N0YXRlICpmcywgTGFiZWxsaXN0ICpsbCwgVFN0cmluZyAqbGFiZWwpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IGZzLT5ibC0+Zmlyc3RsYWJlbDsgaSA8IGxsLT5uOyBpKyspIHsKKyAgICBpZiAobHVhU19lcXN0cihsYWJlbCwgbGwtPmFycltpXS5uYW1lKSkgeworICAgICAgY29uc3QgY2hhciAqbXNnID0gbHVhT19wdXNoZnN0cmluZyhmcy0+bHMtPkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCAiIExVQV9RUyAiIGFscmVhZHkgZGVmaW5lZCBvbiBsaW5lICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0c3RyKGxhYmVsKSwgbGwtPmFycltpXS5saW5lKTsKKyAgICAgIHNlbWVycm9yKGZzLT5scywgbXNnKTsKKyAgICB9CisgIH0KK30KKworCisvKiBza2lwIG5vLW9wIHN0YXRlbWVudHMgKi8KK3N0YXRpYyB2b2lkIHNraXBub29wc3RhdCAoTGV4U3RhdGUgKmxzKSB7CisgIHdoaWxlIChscy0+dC50b2tlbiA9PSAnOycgfHwgbHMtPnQudG9rZW4gPT0gVEtfREJDT0xPTikKKyAgICBzdGF0ZW1lbnQobHMpOworfQorCisKK3N0YXRpYyB2b2lkIGxhYmVsc3RhdCAoTGV4U3RhdGUgKmxzLCBUU3RyaW5nICpsYWJlbCwgaW50IGxpbmUpIHsKKyAgLyogbGFiZWwgLT4gJzo6JyBOQU1FICc6OicgKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgTGFiZWxsaXN0ICpsbCA9ICZscy0+ZHlkLT5sYWJlbDsKKyAgaW50IGw7ICAvKiBpbmRleCBvZiBuZXcgbGFiZWwgYmVpbmcgY3JlYXRlZCAqLworICBjaGVja3JlcGVhdGVkKGZzLCBsbCwgbGFiZWwpOyAgLyogY2hlY2sgZm9yIHJlcGVhdGVkIGxhYmVscyAqLworICBjaGVja25leHQobHMsIFRLX0RCQ09MT04pOyAgLyogc2tpcCBkb3VibGUgY29sb24gKi8KKyAgLyogY3JlYXRlIG5ldyBlbnRyeSBmb3IgdGhpcyBsYWJlbCAqLworICBsID0gbmV3bGFiZWxlbnRyeShscywgbGwsIGxhYmVsLCBsaW5lLCBmcy0+cGMpOworICBza2lwbm9vcHN0YXQobHMpOyAgLyogc2tpcCBvdGhlciBuby1vcCBzdGF0ZW1lbnRzICovCisgIGlmIChibG9ja19mb2xsb3cobHMsIDApKSB7ICAvKiBsYWJlbCBpcyBsYXN0IG5vLW9wIHN0YXRlbWVudCBpbiB0aGUgYmxvY2s/ICovCisgICAgLyogYXNzdW1lIHRoYXQgbG9jYWxzIGFyZSBhbHJlYWR5IG91dCBvZiBzY29wZSAqLworICAgIGxsLT5hcnJbbF0ubmFjdHZhciA9IGZzLT5ibC0+bmFjdHZhcjsKKyAgfQorICBmaW5kZ290b3MobHMsICZsbC0+YXJyW2xdKTsKK30KKworCitzdGF0aWMgdm9pZCB3aGlsZXN0YXQgKExleFN0YXRlICpscywgaW50IGxpbmUpIHsKKyAgLyogd2hpbGVzdGF0IC0+IFdISUxFIGNvbmQgRE8gYmxvY2sgRU5EICovCisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGludCB3aGlsZWluaXQ7CisgIGludCBjb25kZXhpdDsKKyAgQmxvY2tDbnQgYmw7CisgIGx1YVhfbmV4dChscyk7ICAvKiBza2lwIFdISUxFICovCisgIHdoaWxlaW5pdCA9IGx1YUtfZ2V0bGFiZWwoZnMpOworICBjb25kZXhpdCA9IGNvbmQobHMpOworICBlbnRlcmJsb2NrKGZzLCAmYmwsIDEpOworICBjaGVja25leHQobHMsIFRLX0RPKTsKKyAgYmxvY2sobHMpOworICBsdWFLX2p1bXB0byhmcywgd2hpbGVpbml0KTsKKyAgY2hlY2tfbWF0Y2gobHMsIFRLX0VORCwgVEtfV0hJTEUsIGxpbmUpOworICBsZWF2ZWJsb2NrKGZzKTsKKyAgbHVhS19wYXRjaHRvaGVyZShmcywgY29uZGV4aXQpOyAgLyogZmFsc2UgY29uZGl0aW9ucyBmaW5pc2ggdGhlIGxvb3AgKi8KK30KKworCitzdGF0aWMgdm9pZCByZXBlYXRzdGF0IChMZXhTdGF0ZSAqbHMsIGludCBsaW5lKSB7CisgIC8qIHJlcGVhdHN0YXQgLT4gUkVQRUFUIGJsb2NrIFVOVElMIGNvbmQgKi8KKyAgaW50IGNvbmRleGl0OworICBGdW5jU3RhdGUgKmZzID0gbHMtPmZzOworICBpbnQgcmVwZWF0X2luaXQgPSBsdWFLX2dldGxhYmVsKGZzKTsKKyAgQmxvY2tDbnQgYmwxLCBibDI7CisgIGVudGVyYmxvY2soZnMsICZibDEsIDEpOyAgLyogbG9vcCBibG9jayAqLworICBlbnRlcmJsb2NrKGZzLCAmYmwyLCAwKTsgIC8qIHNjb3BlIGJsb2NrICovCisgIGx1YVhfbmV4dChscyk7ICAvKiBza2lwIFJFUEVBVCAqLworICBzdGF0bGlzdChscyk7CisgIGNoZWNrX21hdGNoKGxzLCBUS19VTlRJTCwgVEtfUkVQRUFULCBsaW5lKTsKKyAgY29uZGV4aXQgPSBjb25kKGxzKTsgIC8qIHJlYWQgY29uZGl0aW9uIChpbnNpZGUgc2NvcGUgYmxvY2spICovCisgIGlmIChibDIudXB2YWwpICAvKiB1cHZhbHVlcz8gKi8KKyAgICBsdWFLX3BhdGNoY2xvc2UoZnMsIGNvbmRleGl0LCBibDIubmFjdHZhcik7CisgIGxlYXZlYmxvY2soZnMpOyAgLyogZmluaXNoIHNjb3BlICovCisgIGx1YUtfcGF0Y2hsaXN0KGZzLCBjb25kZXhpdCwgcmVwZWF0X2luaXQpOyAgLyogY2xvc2UgdGhlIGxvb3AgKi8KKyAgbGVhdmVibG9jayhmcyk7ICAvKiBmaW5pc2ggbG9vcCAqLworfQorCisKK3N0YXRpYyBpbnQgZXhwMSAoTGV4U3RhdGUgKmxzKSB7CisgIGV4cGRlc2MgZTsKKyAgaW50IHJlZzsKKyAgZXhwcihscywgJmUpOworICBsdWFLX2V4cDJuZXh0cmVnKGxzLT5mcywgJmUpOworICBsdWFfYXNzZXJ0KGUuayA9PSBWTk9OUkVMT0MpOworICByZWcgPSBlLnUuaW5mbzsKKyAgcmV0dXJuIHJlZzsKK30KKworCitzdGF0aWMgdm9pZCBmb3Jib2R5IChMZXhTdGF0ZSAqbHMsIGludCBiYXNlLCBpbnQgbGluZSwgaW50IG52YXJzLCBpbnQgaXNudW0pIHsKKyAgLyogZm9yYm9keSAtPiBETyBibG9jayAqLworICBCbG9ja0NudCBibDsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgaW50IHByZXAsIGVuZGZvcjsKKyAgYWRqdXN0bG9jYWx2YXJzKGxzLCAzKTsgIC8qIGNvbnRyb2wgdmFyaWFibGVzICovCisgIGNoZWNrbmV4dChscywgVEtfRE8pOworICBwcmVwID0gaXNudW0gPyBsdWFLX2NvZGVBc0J4KGZzLCBPUF9GT1JQUkVQLCBiYXNlLCBOT19KVU1QKSA6IGx1YUtfanVtcChmcyk7CisgIGVudGVyYmxvY2soZnMsICZibCwgMCk7ICAvKiBzY29wZSBmb3IgZGVjbGFyZWQgdmFyaWFibGVzICovCisgIGFkanVzdGxvY2FsdmFycyhscywgbnZhcnMpOworICBsdWFLX3Jlc2VydmVyZWdzKGZzLCBudmFycyk7CisgIGJsb2NrKGxzKTsKKyAgbGVhdmVibG9jayhmcyk7ICAvKiBlbmQgb2Ygc2NvcGUgZm9yIGRlY2xhcmVkIHZhcmlhYmxlcyAqLworICBsdWFLX3BhdGNodG9oZXJlKGZzLCBwcmVwKTsKKyAgaWYgKGlzbnVtKSAgLyogbnVtZXJpYyBmb3I/ICovCisgICAgZW5kZm9yID0gbHVhS19jb2RlQXNCeChmcywgT1BfRk9STE9PUCwgYmFzZSwgTk9fSlVNUCk7CisgIGVsc2UgeyAgLyogZ2VuZXJpYyBmb3IgKi8KKyAgICBsdWFLX2NvZGVBQkMoZnMsIE9QX1RGT1JDQUxMLCBiYXNlLCAwLCBudmFycyk7CisgICAgbHVhS19maXhsaW5lKGZzLCBsaW5lKTsKKyAgICBlbmRmb3IgPSBsdWFLX2NvZGVBc0J4KGZzLCBPUF9URk9STE9PUCwgYmFzZSArIDIsIE5PX0pVTVApOworICB9CisgIGx1YUtfcGF0Y2hsaXN0KGZzLCBlbmRmb3IsIHByZXAgKyAxKTsKKyAgbHVhS19maXhsaW5lKGZzLCBsaW5lKTsKK30KKworCitzdGF0aWMgdm9pZCBmb3JudW0gKExleFN0YXRlICpscywgVFN0cmluZyAqdmFybmFtZSwgaW50IGxpbmUpIHsKKyAgLyogZm9ybnVtIC0+IE5BTUUgPSBleHAxLGV4cDFbLGV4cDFdIGZvcmJvZHkgKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgaW50IGJhc2UgPSBmcy0+ZnJlZXJlZzsKKyAgbmV3X2xvY2FsdmFybGl0ZXJhbChscywgIihmb3IgaW5kZXgpIik7CisgIG5ld19sb2NhbHZhcmxpdGVyYWwobHMsICIoZm9yIGxpbWl0KSIpOworICBuZXdfbG9jYWx2YXJsaXRlcmFsKGxzLCAiKGZvciBzdGVwKSIpOworICBuZXdfbG9jYWx2YXIobHMsIHZhcm5hbWUpOworICBjaGVja25leHQobHMsICc9Jyk7CisgIGV4cDEobHMpOyAgLyogaW5pdGlhbCB2YWx1ZSAqLworICBjaGVja25leHQobHMsICcsJyk7CisgIGV4cDEobHMpOyAgLyogbGltaXQgKi8KKyAgaWYgKHRlc3RuZXh0KGxzLCAnLCcpKQorICAgIGV4cDEobHMpOyAgLyogb3B0aW9uYWwgc3RlcCAqLworICBlbHNlIHsgIC8qIGRlZmF1bHQgc3RlcCA9IDEgKi8KKyAgICBsdWFLX2NvZGVrKGZzLCBmcy0+ZnJlZXJlZywgbHVhS19udW1iZXJLKGZzLCAxKSk7CisgICAgbHVhS19yZXNlcnZlcmVncyhmcywgMSk7CisgIH0KKyAgZm9yYm9keShscywgYmFzZSwgbGluZSwgMSwgMSk7Cit9CisKKworc3RhdGljIHZvaWQgZm9ybGlzdCAoTGV4U3RhdGUgKmxzLCBUU3RyaW5nICppbmRleG5hbWUpIHsKKyAgLyogZm9ybGlzdCAtPiBOQU1FIHssTkFNRX0gSU4gZXhwbGlzdCBmb3Jib2R5ICovCisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGV4cGRlc2MgZTsKKyAgaW50IG52YXJzID0gNDsgIC8qIGdlbiwgc3RhdGUsIGNvbnRyb2wsIHBsdXMgYXQgbGVhc3Qgb25lIGRlY2xhcmVkIHZhciAqLworICBpbnQgbGluZTsKKyAgaW50IGJhc2UgPSBmcy0+ZnJlZXJlZzsKKyAgLyogY3JlYXRlIGNvbnRyb2wgdmFyaWFibGVzICovCisgIG5ld19sb2NhbHZhcmxpdGVyYWwobHMsICIoZm9yIGdlbmVyYXRvcikiKTsKKyAgbmV3X2xvY2FsdmFybGl0ZXJhbChscywgIihmb3Igc3RhdGUpIik7CisgIG5ld19sb2NhbHZhcmxpdGVyYWwobHMsICIoZm9yIGNvbnRyb2wpIik7CisgIC8qIGNyZWF0ZSBkZWNsYXJlZCB2YXJpYWJsZXMgKi8KKyAgbmV3X2xvY2FsdmFyKGxzLCBpbmRleG5hbWUpOworICB3aGlsZSAodGVzdG5leHQobHMsICcsJykpIHsKKyAgICBuZXdfbG9jYWx2YXIobHMsIHN0cl9jaGVja25hbWUobHMpKTsKKyAgICBudmFycysrOworICB9CisgIGNoZWNrbmV4dChscywgVEtfSU4pOworICBsaW5lID0gbHMtPmxpbmVudW1iZXI7CisgIGFkanVzdF9hc3NpZ24obHMsIDMsIGV4cGxpc3QobHMsICZlKSwgJmUpOworICBsdWFLX2NoZWNrc3RhY2soZnMsIDMpOyAgLyogZXh0cmEgc3BhY2UgdG8gY2FsbCBnZW5lcmF0b3IgKi8KKyAgZm9yYm9keShscywgYmFzZSwgbGluZSwgbnZhcnMgLSAzLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCBmb3JzdGF0IChMZXhTdGF0ZSAqbHMsIGludCBsaW5lKSB7CisgIC8qIGZvcnN0YXQgLT4gRk9SIChmb3JudW0gfCBmb3JsaXN0KSBFTkQgKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgVFN0cmluZyAqdmFybmFtZTsKKyAgQmxvY2tDbnQgYmw7CisgIGVudGVyYmxvY2soZnMsICZibCwgMSk7ICAvKiBzY29wZSBmb3IgbG9vcCBhbmQgY29udHJvbCB2YXJpYWJsZXMgKi8KKyAgbHVhWF9uZXh0KGxzKTsgIC8qIHNraXAgYGZvcicgKi8KKyAgdmFybmFtZSA9IHN0cl9jaGVja25hbWUobHMpOyAgLyogZmlyc3QgdmFyaWFibGUgbmFtZSAqLworICBzd2l0Y2ggKGxzLT50LnRva2VuKSB7CisgICAgY2FzZSAnPSc6IGZvcm51bShscywgdmFybmFtZSwgbGluZSk7IGJyZWFrOworICAgIGNhc2UgJywnOiBjYXNlIFRLX0lOOiBmb3JsaXN0KGxzLCB2YXJuYW1lKTsgYnJlYWs7CisgICAgZGVmYXVsdDogbHVhWF9zeW50YXhlcnJvcihscywgTFVBX1FMKCI9IikgIiBvciAiIExVQV9RTCgiaW4iKSAiIGV4cGVjdGVkIik7CisgIH0KKyAgY2hlY2tfbWF0Y2gobHMsIFRLX0VORCwgVEtfRk9SLCBsaW5lKTsKKyAgbGVhdmVibG9jayhmcyk7ICAvKiBsb29wIHNjb3BlIChgYnJlYWsnIGp1bXBzIHRvIHRoaXMgcG9pbnQpICovCit9CisKKworc3RhdGljIHZvaWQgdGVzdF90aGVuX2Jsb2NrIChMZXhTdGF0ZSAqbHMsIGludCAqZXNjYXBlbGlzdCkgeworICAvKiB0ZXN0X3RoZW5fYmxvY2sgLT4gW0lGIHwgRUxTRUlGXSBjb25kIFRIRU4gYmxvY2sgKi8KKyAgQmxvY2tDbnQgYmw7CisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIGV4cGRlc2MgdjsKKyAgaW50IGpmOyAgLyogaW5zdHJ1Y3Rpb24gdG8gc2tpcCAndGhlbicgY29kZSAoaWYgY29uZGl0aW9uIGlzIGZhbHNlKSAqLworICBsdWFYX25leHQobHMpOyAgLyogc2tpcCBJRiBvciBFTFNFSUYgKi8KKyAgZXhwcihscywgJnYpOyAgLyogcmVhZCBjb25kaXRpb24gKi8KKyAgY2hlY2tuZXh0KGxzLCBUS19USEVOKTsKKyAgaWYgKGxzLT50LnRva2VuID09IFRLX0dPVE8gfHwgbHMtPnQudG9rZW4gPT0gVEtfQlJFQUspIHsKKyAgICBsdWFLX2dvaWZmYWxzZShscy0+ZnMsICZ2KTsgIC8qIHdpbGwganVtcCB0byBsYWJlbCBpZiBjb25kaXRpb24gaXMgdHJ1ZSAqLworICAgIGVudGVyYmxvY2soZnMsICZibCwgMCk7ICAvKiBtdXN0IGVudGVyIGJsb2NrIGJlZm9yZSAnZ290bycgKi8KKyAgICBnb3Rvc3RhdChscywgdi50KTsgIC8qIGhhbmRsZSBnb3RvL2JyZWFrICovCisgICAgc2tpcG5vb3BzdGF0KGxzKTsgIC8qIHNraXAgb3RoZXIgbm8tb3Agc3RhdGVtZW50cyAqLworICAgIGlmIChibG9ja19mb2xsb3cobHMsIDApKSB7ICAvKiAnZ290bycgaXMgdGhlIGVudGlyZSBibG9jaz8gKi8KKyAgICAgIGxlYXZlYmxvY2soZnMpOworICAgICAgcmV0dXJuOyAgLyogYW5kIHRoYXQgaXMgaXQgKi8KKyAgICB9CisgICAgZWxzZSAgLyogbXVzdCBza2lwIG92ZXIgJ3RoZW4nIHBhcnQgaWYgY29uZGl0aW9uIGlzIGZhbHNlICovCisgICAgICBqZiA9IGx1YUtfanVtcChmcyk7CisgIH0KKyAgZWxzZSB7ICAvKiByZWd1bGFyIGNhc2UgKG5vdCBnb3RvL2JyZWFrKSAqLworICAgIGx1YUtfZ29pZnRydWUobHMtPmZzLCAmdik7ICAvKiBza2lwIG92ZXIgYmxvY2sgaWYgY29uZGl0aW9uIGlzIGZhbHNlICovCisgICAgZW50ZXJibG9jayhmcywgJmJsLCAwKTsKKyAgICBqZiA9IHYuZjsKKyAgfQorICBzdGF0bGlzdChscyk7ICAvKiBgdGhlbicgcGFydCAqLworICBsZWF2ZWJsb2NrKGZzKTsKKyAgaWYgKGxzLT50LnRva2VuID09IFRLX0VMU0UgfHwKKyAgICAgIGxzLT50LnRva2VuID09IFRLX0VMU0VJRikgIC8qIGZvbGxvd2VkIGJ5ICdlbHNlJy8nZWxzZWlmJz8gKi8KKyAgICBsdWFLX2NvbmNhdChmcywgZXNjYXBlbGlzdCwgbHVhS19qdW1wKGZzKSk7ICAvKiBtdXN0IGp1bXAgb3ZlciBpdCAqLworICBsdWFLX3BhdGNodG9oZXJlKGZzLCBqZik7Cit9CisKKworc3RhdGljIHZvaWQgaWZzdGF0IChMZXhTdGF0ZSAqbHMsIGludCBsaW5lKSB7CisgIC8qIGlmc3RhdCAtPiBJRiBjb25kIFRIRU4gYmxvY2sge0VMU0VJRiBjb25kIFRIRU4gYmxvY2t9IFtFTFNFIGJsb2NrXSBFTkQgKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgaW50IGVzY2FwZWxpc3QgPSBOT19KVU1QOyAgLyogZXhpdCBsaXN0IGZvciBmaW5pc2hlZCBwYXJ0cyAqLworICB0ZXN0X3RoZW5fYmxvY2sobHMsICZlc2NhcGVsaXN0KTsgIC8qIElGIGNvbmQgVEhFTiBibG9jayAqLworICB3aGlsZSAobHMtPnQudG9rZW4gPT0gVEtfRUxTRUlGKQorICAgIHRlc3RfdGhlbl9ibG9jayhscywgJmVzY2FwZWxpc3QpOyAgLyogRUxTRUlGIGNvbmQgVEhFTiBibG9jayAqLworICBpZiAodGVzdG5leHQobHMsIFRLX0VMU0UpKQorICAgIGJsb2NrKGxzKTsgIC8qIGBlbHNlJyBwYXJ0ICovCisgIGNoZWNrX21hdGNoKGxzLCBUS19FTkQsIFRLX0lGLCBsaW5lKTsKKyAgbHVhS19wYXRjaHRvaGVyZShmcywgZXNjYXBlbGlzdCk7ICAvKiBwYXRjaCBlc2NhcGUgbGlzdCB0byAnaWYnIGVuZCAqLworfQorCisKK3N0YXRpYyB2b2lkIGxvY2FsZnVuYyAoTGV4U3RhdGUgKmxzKSB7CisgIGV4cGRlc2MgYjsKKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgbmV3X2xvY2FsdmFyKGxzLCBzdHJfY2hlY2tuYW1lKGxzKSk7ICAvKiBuZXcgbG9jYWwgdmFyaWFibGUgKi8KKyAgYWRqdXN0bG9jYWx2YXJzKGxzLCAxKTsgIC8qIGVudGVyIGl0cyBzY29wZSAqLworICBib2R5KGxzLCAmYiwgMCwgbHMtPmxpbmVudW1iZXIpOyAgLyogZnVuY3Rpb24gY3JlYXRlZCBpbiBuZXh0IHJlZ2lzdGVyICovCisgIC8qIGRlYnVnIGluZm9ybWF0aW9uIHdpbGwgb25seSBzZWUgdGhlIHZhcmlhYmxlIGFmdGVyIHRoaXMgcG9pbnQhICovCisgIGdldGxvY3ZhcihmcywgYi51LmluZm8pLT5zdGFydHBjID0gZnMtPnBjOworfQorCisKK3N0YXRpYyB2b2lkIGxvY2Fsc3RhdCAoTGV4U3RhdGUgKmxzKSB7CisgIC8qIHN0YXQgLT4gTE9DQUwgTkFNRSB7YCwnIE5BTUV9IFtgPScgZXhwbGlzdF0gKi8KKyAgaW50IG52YXJzID0gMDsKKyAgaW50IG5leHBzOworICBleHBkZXNjIGU7CisgIGRvIHsKKyAgICBuZXdfbG9jYWx2YXIobHMsIHN0cl9jaGVja25hbWUobHMpKTsKKyAgICBudmFycysrOworICB9IHdoaWxlICh0ZXN0bmV4dChscywgJywnKSk7CisgIGlmICh0ZXN0bmV4dChscywgJz0nKSkKKyAgICBuZXhwcyA9IGV4cGxpc3QobHMsICZlKTsKKyAgZWxzZSB7CisgICAgZS5rID0gVlZPSUQ7CisgICAgbmV4cHMgPSAwOworICB9CisgIGFkanVzdF9hc3NpZ24obHMsIG52YXJzLCBuZXhwcywgJmUpOworICBhZGp1c3Rsb2NhbHZhcnMobHMsIG52YXJzKTsKK30KKworCitzdGF0aWMgaW50IGZ1bmNuYW1lIChMZXhTdGF0ZSAqbHMsIGV4cGRlc2MgKnYpIHsKKyAgLyogZnVuY25hbWUgLT4gTkFNRSB7ZmllbGRzZWx9IFtgOicgTkFNRV0gKi8KKyAgaW50IGlzbWV0aG9kID0gMDsKKyAgc2luZ2xldmFyKGxzLCB2KTsKKyAgd2hpbGUgKGxzLT50LnRva2VuID09ICcuJykKKyAgICBmaWVsZHNlbChscywgdik7CisgIGlmIChscy0+dC50b2tlbiA9PSAnOicpIHsKKyAgICBpc21ldGhvZCA9IDE7CisgICAgZmllbGRzZWwobHMsIHYpOworICB9CisgIHJldHVybiBpc21ldGhvZDsKK30KKworCitzdGF0aWMgdm9pZCBmdW5jc3RhdCAoTGV4U3RhdGUgKmxzLCBpbnQgbGluZSkgeworICAvKiBmdW5jc3RhdCAtPiBGVU5DVElPTiBmdW5jbmFtZSBib2R5ICovCisgIGludCBpc21ldGhvZDsKKyAgZXhwZGVzYyB2LCBiOworICBsdWFYX25leHQobHMpOyAgLyogc2tpcCBGVU5DVElPTiAqLworICBpc21ldGhvZCA9IGZ1bmNuYW1lKGxzLCAmdik7CisgIGJvZHkobHMsICZiLCBpc21ldGhvZCwgbGluZSk7CisgIGx1YUtfc3RvcmV2YXIobHMtPmZzLCAmdiwgJmIpOworICBsdWFLX2ZpeGxpbmUobHMtPmZzLCBsaW5lKTsgIC8qIGRlZmluaXRpb24gYGhhcHBlbnMnIGluIHRoZSBmaXJzdCBsaW5lICovCit9CisKKworc3RhdGljIHZvaWQgZXhwcnN0YXQgKExleFN0YXRlICpscykgeworICAvKiBzdGF0IC0+IGZ1bmMgfCBhc3NpZ25tZW50ICovCisgIEZ1bmNTdGF0ZSAqZnMgPSBscy0+ZnM7CisgIHN0cnVjdCBMSFNfYXNzaWduIHY7CisgIHN1ZmZpeGVkZXhwKGxzLCAmdi52KTsKKyAgaWYgKGxzLT50LnRva2VuID09ICc9JyB8fCBscy0+dC50b2tlbiA9PSAnLCcpIHsgLyogc3RhdCAtPiBhc3NpZ25tZW50ID8gKi8KKyAgICB2LnByZXYgPSBOVUxMOworICAgIGFzc2lnbm1lbnQobHMsICZ2LCAxKTsKKyAgfQorICBlbHNlIHsgIC8qIHN0YXQgLT4gZnVuYyAqLworICAgIGNoZWNrX2NvbmRpdGlvbihscywgdi52LmsgPT0gVkNBTEwsICJzeW50YXggZXJyb3IiKTsKKyAgICBTRVRBUkdfQyhnZXRjb2RlKGZzLCAmdi52KSwgMSk7ICAvKiBjYWxsIHN0YXRlbWVudCB1c2VzIG5vIHJlc3VsdHMgKi8KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHJldHN0YXQgKExleFN0YXRlICpscykgeworICAvKiBzdGF0IC0+IFJFVFVSTiBbZXhwbGlzdF0gWyc7J10gKi8KKyAgRnVuY1N0YXRlICpmcyA9IGxzLT5mczsKKyAgZXhwZGVzYyBlOworICBpbnQgZmlyc3QsIG5yZXQ7ICAvKiByZWdpc3RlcnMgd2l0aCByZXR1cm5lZCB2YWx1ZXMgKi8KKyAgaWYgKGJsb2NrX2ZvbGxvdyhscywgMSkgfHwgbHMtPnQudG9rZW4gPT0gJzsnKQorICAgIGZpcnN0ID0gbnJldCA9IDA7ICAvKiByZXR1cm4gbm8gdmFsdWVzICovCisgIGVsc2UgeworICAgIG5yZXQgPSBleHBsaXN0KGxzLCAmZSk7ICAvKiBvcHRpb25hbCByZXR1cm4gdmFsdWVzICovCisgICAgaWYgKGhhc211bHRyZXQoZS5rKSkgeworICAgICAgbHVhS19zZXRtdWx0cmV0KGZzLCAmZSk7CisgICAgICBpZiAoZS5rID09IFZDQUxMICYmIG5yZXQgPT0gMSkgeyAgLyogdGFpbCBjYWxsPyAqLworICAgICAgICBTRVRfT1BDT0RFKGdldGNvZGUoZnMsJmUpLCBPUF9UQUlMQ0FMTCk7CisgICAgICAgIGx1YV9hc3NlcnQoR0VUQVJHX0EoZ2V0Y29kZShmcywmZSkpID09IGZzLT5uYWN0dmFyKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZnMtPm5hY3R2YXI7CisgICAgICBucmV0ID0gTFVBX01VTFRSRVQ7ICAvKiByZXR1cm4gYWxsIHZhbHVlcyAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChucmV0ID09IDEpICAvKiBvbmx5IG9uZSBzaW5nbGUgdmFsdWU/ICovCisgICAgICAgIGZpcnN0ID0gbHVhS19leHAyYW55cmVnKGZzLCAmZSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgbHVhS19leHAybmV4dHJlZyhmcywgJmUpOyAgLyogdmFsdWVzIG11c3QgZ28gdG8gdGhlIGBzdGFjaycgKi8KKyAgICAgICAgZmlyc3QgPSBmcy0+bmFjdHZhcjsgIC8qIHJldHVybiBhbGwgYGFjdGl2ZScgdmFsdWVzICovCisgICAgICAgIGx1YV9hc3NlcnQobnJldCA9PSBmcy0+ZnJlZXJlZyAtIGZpcnN0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgbHVhS19yZXQoZnMsIGZpcnN0LCBucmV0KTsKKyAgdGVzdG5leHQobHMsICc7Jyk7ICAvKiBza2lwIG9wdGlvbmFsIHNlbWljb2xvbiAqLworfQorCisKK3N0YXRpYyB2b2lkIHN0YXRlbWVudCAoTGV4U3RhdGUgKmxzKSB7CisgIGludCBsaW5lID0gbHMtPmxpbmVudW1iZXI7ICAvKiBtYXkgYmUgbmVlZGVkIGZvciBlcnJvciBtZXNzYWdlcyAqLworICBlbnRlcmxldmVsKGxzKTsKKyAgc3dpdGNoIChscy0+dC50b2tlbikgeworICAgIGNhc2UgJzsnOiB7ICAvKiBzdGF0IC0+ICc7JyAoZW1wdHkgc3RhdGVtZW50KSAqLworICAgICAgbHVhWF9uZXh0KGxzKTsgIC8qIHNraXAgJzsnICovCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19JRjogeyAgLyogc3RhdCAtPiBpZnN0YXQgKi8KKyAgICAgIGlmc3RhdChscywgbGluZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19XSElMRTogeyAgLyogc3RhdCAtPiB3aGlsZXN0YXQgKi8KKyAgICAgIHdoaWxlc3RhdChscywgbGluZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19ETzogeyAgLyogc3RhdCAtPiBETyBibG9jayBFTkQgKi8KKyAgICAgIGx1YVhfbmV4dChscyk7ICAvKiBza2lwIERPICovCisgICAgICBibG9jayhscyk7CisgICAgICBjaGVja19tYXRjaChscywgVEtfRU5ELCBUS19ETywgbGluZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19GT1I6IHsgIC8qIHN0YXQgLT4gZm9yc3RhdCAqLworICAgICAgZm9yc3RhdChscywgbGluZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19SRVBFQVQ6IHsgIC8qIHN0YXQgLT4gcmVwZWF0c3RhdCAqLworICAgICAgcmVwZWF0c3RhdChscywgbGluZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19GVU5DVElPTjogeyAgLyogc3RhdCAtPiBmdW5jc3RhdCAqLworICAgICAgZnVuY3N0YXQobHMsIGxpbmUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVEtfTE9DQUw6IHsgIC8qIHN0YXQgLT4gbG9jYWxzdGF0ICovCisgICAgICBsdWFYX25leHQobHMpOyAgLyogc2tpcCBMT0NBTCAqLworICAgICAgaWYgKHRlc3RuZXh0KGxzLCBUS19GVU5DVElPTikpICAvKiBsb2NhbCBmdW5jdGlvbj8gKi8KKyAgICAgICAgbG9jYWxmdW5jKGxzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbG9jYWxzdGF0KGxzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRLX0RCQ09MT046IHsgIC8qIHN0YXQgLT4gbGFiZWwgKi8KKyAgICAgIGx1YVhfbmV4dChscyk7ICAvKiBza2lwIGRvdWJsZSBjb2xvbiAqLworICAgICAgbGFiZWxzdGF0KGxzLCBzdHJfY2hlY2tuYW1lKGxzKSwgbGluZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUS19SRVRVUk46IHsgIC8qIHN0YXQgLT4gcmV0c3RhdCAqLworICAgICAgbHVhWF9uZXh0KGxzKTsgIC8qIHNraXAgUkVUVVJOICovCisgICAgICByZXRzdGF0KGxzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRLX0JSRUFLOiAgIC8qIHN0YXQgLT4gYnJlYWtzdGF0ICovCisgICAgY2FzZSBUS19HT1RPOiB7ICAvKiBzdGF0IC0+ICdnb3RvJyBOQU1FICovCisgICAgICBnb3Rvc3RhdChscywgbHVhS19qdW1wKGxzLT5mcykpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsgIC8qIHN0YXQgLT4gZnVuYyB8IGFzc2lnbm1lbnQgKi8KKyAgICAgIGV4cHJzdGF0KGxzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBsdWFfYXNzZXJ0KGxzLT5mcy0+Zi0+bWF4c3RhY2tzaXplID49IGxzLT5mcy0+ZnJlZXJlZyAmJgorICAgICAgICAgICAgIGxzLT5mcy0+ZnJlZXJlZyA+PSBscy0+ZnMtPm5hY3R2YXIpOworICBscy0+ZnMtPmZyZWVyZWcgPSBscy0+ZnMtPm5hY3R2YXI7ICAvKiBmcmVlIHJlZ2lzdGVycyAqLworICBsZWF2ZWxldmVsKGxzKTsKK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKgorKiogY29tcGlsZXMgdGhlIG1haW4gZnVuY3Rpb24sIHdoaWNoIGlzIGEgcmVndWxhciB2YXJhcmcgZnVuY3Rpb24gd2l0aCBhbgorKiogdXB2YWx1ZSBuYW1lZCBMVUFfRU5WCisqLworc3RhdGljIHZvaWQgbWFpbmZ1bmMgKExleFN0YXRlICpscywgRnVuY1N0YXRlICpmcykgeworICBCbG9ja0NudCBibDsKKyAgZXhwZGVzYyB2OworICBvcGVuX2Z1bmMobHMsIGZzLCAmYmwpOworICBmcy0+Zi0+aXNfdmFyYXJnID0gMTsgIC8qIG1haW4gZnVuY3Rpb24gaXMgYWx3YXlzIHZhcmFyZyAqLworICBpbml0X2V4cCgmdiwgVkxPQ0FMLCAwKTsgIC8qIGNyZWF0ZSBhbmQuLi4gKi8KKyAgbmV3dXB2YWx1ZShmcywgbHMtPmVudm4sICZ2KTsgIC8qIC4uLnNldCBlbnZpcm9ubWVudCB1cHZhbHVlICovCisgIGx1YVhfbmV4dChscyk7ICAvKiByZWFkIGZpcnN0IHRva2VuICovCisgIHN0YXRsaXN0KGxzKTsgIC8qIHBhcnNlIG1haW4gYm9keSAqLworICBjaGVjayhscywgVEtfRU9TKTsKKyAgY2xvc2VfZnVuYyhscyk7Cit9CisKKworQ2xvc3VyZSAqbHVhWV9wYXJzZXIgKGx1YV9TdGF0ZSAqTCwgWklPICp6LCBNYnVmZmVyICpidWZmLAorICAgICAgICAgICAgICAgICAgICAgIER5bmRhdGEgKmR5ZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZpcnN0Y2hhcikgeworICBMZXhTdGF0ZSBsZXhzdGF0ZTsKKyAgRnVuY1N0YXRlIGZ1bmNzdGF0ZTsKKyAgQ2xvc3VyZSAqY2wgPSBsdWFGX25ld0xjbG9zdXJlKEwsIDEpOyAgLyogY3JlYXRlIG1haW4gY2xvc3VyZSAqLworICAvKiBhbmNob3IgY2xvc3VyZSAodG8gYXZvaWQgYmVpbmcgY29sbGVjdGVkKSAqLworICBzZXRjbEx2YWx1ZShMLCBMLT50b3AsIGNsKTsKKyAgaW5jcl90b3AoTCk7CisgIGZ1bmNzdGF0ZS5mID0gY2wtPmwucCA9IGx1YUZfbmV3cHJvdG8oTCk7CisgIGZ1bmNzdGF0ZS5mLT5zb3VyY2UgPSBsdWFTX25ldyhMLCBuYW1lKTsgIC8qIGNyZWF0ZSBhbmQgYW5jaG9yIFRTdHJpbmcgKi8KKyAgbGV4c3RhdGUuYnVmZiA9IGJ1ZmY7CisgIGxleHN0YXRlLmR5ZCA9IGR5ZDsKKyAgZHlkLT5hY3R2YXIubiA9IGR5ZC0+Z3QubiA9IGR5ZC0+bGFiZWwubiA9IDA7CisgIGx1YVhfc2V0aW5wdXQoTCwgJmxleHN0YXRlLCB6LCBmdW5jc3RhdGUuZi0+c291cmNlLCBmaXJzdGNoYXIpOworICBtYWluZnVuYygmbGV4c3RhdGUsICZmdW5jc3RhdGUpOworICBsdWFfYXNzZXJ0KCFmdW5jc3RhdGUucHJldiAmJiBmdW5jc3RhdGUubnVwcyA9PSAxICYmICFsZXhzdGF0ZS5mcyk7CisgIC8qIGFsbCBzY29wZXMgc2hvdWxkIGJlIGNvcnJlY3RseSBmaW5pc2hlZCAqLworICBsdWFfYXNzZXJ0KGR5ZC0+YWN0dmFyLm4gPT0gMCAmJiBkeWQtPmd0Lm4gPT0gMCAmJiBkeWQtPmxhYmVsLm4gPT0gMCk7CisgIHJldHVybiBjbDsgIC8qIGl0J3Mgb24gdGhlIHN0YWNrIHRvbyAqLworfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xwYXJzZXIuaCBiL2NvbTMyL2x1YS9zcmMvbHBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDZlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xwYXJzZXIuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyoqICRJZDogbHBhcnNlci5oLHYgMS43MC4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBMdWEgUGFyc2VyCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBscGFyc2VyX2gKKyNkZWZpbmUgbHBhcnNlcl9oCisKKyNpbmNsdWRlICJsbGltaXRzLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImx6aW8uaCIKKworCisvKgorKiogRXhwcmVzc2lvbiBkZXNjcmlwdG9yCisqLworCit0eXBlZGVmIGVudW0geworICBWVk9JRCwJLyogbm8gdmFsdWUgKi8KKyAgVk5JTCwKKyAgVlRSVUUsCisgIFZGQUxTRSwKKyAgVkssCQkvKiBpbmZvID0gaW5kZXggb2YgY29uc3RhbnQgaW4gYGsnICovCisgIFZLTlVNLAkvKiBudmFsID0gbnVtZXJpY2FsIHZhbHVlICovCisgIFZOT05SRUxPQywJLyogaW5mbyA9IHJlc3VsdCByZWdpc3RlciAqLworICBWTE9DQUwsCS8qIGluZm8gPSBsb2NhbCByZWdpc3RlciAqLworICBWVVBWQUwsICAgICAgIC8qIGluZm8gPSBpbmRleCBvZiB1cHZhbHVlIGluICd1cHZhbHVlcycgKi8KKyAgVklOREVYRUQsCS8qIHQgPSB0YWJsZSByZWdpc3Rlci91cHZhbHVlOyBpZHggPSBpbmRleCBSL0sgKi8KKyAgVkpNUCwJCS8qIGluZm8gPSBpbnN0cnVjdGlvbiBwYyAqLworICBWUkVMT0NBQkxFLAkvKiBpbmZvID0gaW5zdHJ1Y3Rpb24gcGMgKi8KKyAgVkNBTEwsCS8qIGluZm8gPSBpbnN0cnVjdGlvbiBwYyAqLworICBWVkFSQVJHCS8qIGluZm8gPSBpbnN0cnVjdGlvbiBwYyAqLworfSBleHBraW5kOworCisKKyNkZWZpbmUgdmtpc3ZhcihrKQkoVkxPQ0FMIDw9IChrKSAmJiAoaykgPD0gVklOREVYRUQpCisjZGVmaW5lIHZraXNpbnJlZyhrKQkoKGspID09IFZOT05SRUxPQyB8fCAoaykgPT0gVkxPQ0FMKQorCit0eXBlZGVmIHN0cnVjdCBleHBkZXNjIHsKKyAgZXhwa2luZCBrOworICB1bmlvbiB7CisgICAgc3RydWN0IHsgIC8qIGZvciBpbmRleGVkIHZhcmlhYmxlcyAoVklOREVYRUQpICovCisgICAgICBzaG9ydCBpZHg7ICAvKiBpbmRleCAoUi9LKSAqLworICAgICAgbHVfYnl0ZSB0OyAgLyogdGFibGUgKHJlZ2lzdGVyIG9yIHVwdmFsdWUpICovCisgICAgICBsdV9ieXRlIHZ0OyAgLyogd2hldGhlciAndCcgaXMgcmVnaXN0ZXIgKFZMT0NBTCkgb3IgdXB2YWx1ZSAoVlVQVkFMKSAqLworICAgIH0gaW5kOworICAgIGludCBpbmZvOyAgLyogZm9yIGdlbmVyaWMgdXNlICovCisgICAgbHVhX051bWJlciBudmFsOyAgLyogZm9yIFZLTlVNICovCisgIH0gdTsKKyAgaW50IHQ7ICAvKiBwYXRjaCBsaXN0IG9mIGBleGl0IHdoZW4gdHJ1ZScgKi8KKyAgaW50IGY7ICAvKiBwYXRjaCBsaXN0IG9mIGBleGl0IHdoZW4gZmFsc2UnICovCit9IGV4cGRlc2M7CisKKworLyogZGVzY3JpcHRpb24gb2YgYWN0aXZlIGxvY2FsIHZhcmlhYmxlICovCit0eXBlZGVmIHN0cnVjdCBWYXJkZXNjIHsKKyAgc2hvcnQgaWR4OyAgLyogdmFyaWFibGUgaW5kZXggaW4gc3RhY2sgKi8KK30gVmFyZGVzYzsKKworCisvKiBkZXNjcmlwdGlvbiBvZiBwZW5kaW5nIGdvdG8gc3RhdGVtZW50cyBhbmQgbGFiZWwgc3RhdGVtZW50cyAqLwordHlwZWRlZiBzdHJ1Y3QgTGFiZWxkZXNjIHsKKyAgVFN0cmluZyAqbmFtZTsgIC8qIGxhYmVsIGlkZW50aWZpZXIgKi8KKyAgaW50IHBjOyAgLyogcG9zaXRpb24gaW4gY29kZSAqLworICBpbnQgbGluZTsgIC8qIGxpbmUgd2hlcmUgaXQgYXBwZWFyZWQgKi8KKyAgbHVfYnl0ZSBuYWN0dmFyOyAgLyogbG9jYWwgbGV2ZWwgd2hlcmUgaXQgYXBwZWFycyBpbiBjdXJyZW50IGJsb2NrICovCit9IExhYmVsZGVzYzsKKworCisvKiBsaXN0IG9mIGxhYmVscyBvciBnb3RvcyAqLwordHlwZWRlZiBzdHJ1Y3QgTGFiZWxsaXN0IHsKKyAgTGFiZWxkZXNjICphcnI7ICAvKiBhcnJheSAqLworICBpbnQgbjsgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIHVzZSAqLworICBpbnQgc2l6ZTsgIC8qIGFycmF5IHNpemUgKi8KK30gTGFiZWxsaXN0OworCisKKy8qIGR5bmFtaWMgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBwYXJzZXIgKi8KK3R5cGVkZWYgc3RydWN0IER5bmRhdGEgeworICBzdHJ1Y3QgeyAgLyogbGlzdCBvZiBhY3RpdmUgbG9jYWwgdmFyaWFibGVzICovCisgICAgVmFyZGVzYyAqYXJyOworICAgIGludCBuOworICAgIGludCBzaXplOworICB9IGFjdHZhcjsKKyAgTGFiZWxsaXN0IGd0OyAgLyogbGlzdCBvZiBwZW5kaW5nIGdvdG9zICovCisgIExhYmVsbGlzdCBsYWJlbDsgICAvKiBsaXN0IG9mIGFjdGl2ZSBsYWJlbHMgKi8KK30gRHluZGF0YTsKKworCisvKiBjb250cm9sIG9mIGJsb2NrcyAqLworc3RydWN0IEJsb2NrQ250OyAgLyogZGVmaW5lZCBpbiBscGFyc2VyLmMgKi8KKworCisvKiBzdGF0ZSBuZWVkZWQgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYSBnaXZlbiBmdW5jdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgRnVuY1N0YXRlIHsKKyAgUHJvdG8gKmY7ICAvKiBjdXJyZW50IGZ1bmN0aW9uIGhlYWRlciAqLworICBUYWJsZSAqaDsgIC8qIHRhYmxlIHRvIGZpbmQgKGFuZCByZXVzZSkgZWxlbWVudHMgaW4gYGsnICovCisgIHN0cnVjdCBGdW5jU3RhdGUgKnByZXY7ICAvKiBlbmNsb3NpbmcgZnVuY3Rpb24gKi8KKyAgc3RydWN0IExleFN0YXRlICpsczsgIC8qIGxleGljYWwgc3RhdGUgKi8KKyAgc3RydWN0IEJsb2NrQ250ICpibDsgIC8qIGNoYWluIG9mIGN1cnJlbnQgYmxvY2tzICovCisgIGludCBwYzsgIC8qIG5leHQgcG9zaXRpb24gdG8gY29kZSAoZXF1aXZhbGVudCB0byBgbmNvZGUnKSAqLworICBpbnQgbGFzdHRhcmdldDsgICAvKiAnbGFiZWwnIG9mIGxhc3QgJ2p1bXAgbGFiZWwnICovCisgIGludCBqcGM7ICAvKiBsaXN0IG9mIHBlbmRpbmcganVtcHMgdG8gYHBjJyAqLworICBpbnQgbms7ICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYGsnICovCisgIGludCBucDsgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBgcCcgKi8KKyAgaW50IGZpcnN0bG9jYWw7ICAvKiBpbmRleCBvZiBmaXJzdCBsb2NhbCB2YXIgKGluIER5bmRhdGEgYXJyYXkpICovCisgIHNob3J0IG5sb2N2YXJzOyAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluICdmLT5sb2N2YXJzJyAqLworICBsdV9ieXRlIG5hY3R2YXI7ICAvKiBudW1iZXIgb2YgYWN0aXZlIGxvY2FsIHZhcmlhYmxlcyAqLworICBsdV9ieXRlIG51cHM7ICAvKiBudW1iZXIgb2YgdXB2YWx1ZXMgKi8KKyAgbHVfYnl0ZSBmcmVlcmVnOyAgLyogZmlyc3QgZnJlZSByZWdpc3RlciAqLworfSBGdW5jU3RhdGU7CisKKworTFVBSV9GVU5DIENsb3N1cmUgKmx1YVlfcGFyc2VyIChsdWFfU3RhdGUgKkwsIFpJTyAqeiwgTWJ1ZmZlciAqYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluZGF0YSAqZHlkLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmlyc3RjaGFyKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbHN0YXRlLmMgYi9jb20zMi9sdWEvc3JjL2xzdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2Q3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2xzdGF0ZS5jCkBAIC0wLDAgKzEsMzI4IEBACisvKgorKiogJElkOiBsc3RhdGUuYyx2IDIuOTkuMS4yIDIwMTMvMTEvMDggMTc6NDU6MzEgcm9iZXJ0byBFeHAgJAorKiogR2xvYmFsIFN0YXRlCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbHN0YXRlX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGFwaS5oIgorI2luY2x1ZGUgImxkZWJ1Zy5oIgorI2luY2x1ZGUgImxkby5oIgorI2luY2x1ZGUgImxmdW5jLmgiCisjaW5jbHVkZSAibGdjLmgiCisjaW5jbHVkZSAibGxleC5oIgorI2luY2x1ZGUgImxtZW0uaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisjaW5jbHVkZSAibHRtLmgiCisKKworI2lmICFkZWZpbmVkKExVQUlfR0NQQVVTRSkKKyNkZWZpbmUgTFVBSV9HQ1BBVVNFCTIwMCAgLyogMjAwJSAqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChMVUFJX0dDTUFKT1IpCisjZGVmaW5lIExVQUlfR0NNQUpPUgkyMDAgIC8qIDIwMCUgKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTFVBSV9HQ01VTCkKKyNkZWZpbmUgTFVBSV9HQ01VTAkyMDAgLyogR0MgcnVucyAndHdpY2UgdGhlIHNwZWVkJyBvZiBtZW1vcnkgYWxsb2NhdGlvbiAqLworI2VuZGlmCisKKworI2RlZmluZSBNRU1FUlJNU0cJIm5vdCBlbm91Z2ggbWVtb3J5IgorCisKKy8qCisqKiBhIG1hY3JvIHRvIGhlbHAgdGhlIGNyZWF0aW9uIG9mIGEgdW5pcXVlIHJhbmRvbSBzZWVkIHdoZW4gYSBzdGF0ZSBpcworKiogY3JlYXRlZDsgdGhlIHNlZWQgaXMgdXNlZCB0byByYW5kb21pemUgaGFzaGVzLgorKi8KKyNpZiAhZGVmaW5lZChsdWFpX21ha2VzZWVkKQorI2lmbmRlZiBTWVNMSU5VWAorI2luY2x1ZGUgPHRpbWUuaD4KKyNkZWZpbmUgbHVhaV9tYWtlc2VlZCgpCQljYXN0KHVuc2lnbmVkIGludCwgdGltZShOVUxMKSkKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjZGVmaW5lIGx1YWlfbWFrZXNlZWQoKQkJY2FzdCh1bnNpZ25lZCBpbnQsIHRpbWVzKE5VTEwpKQorI2VuZGlmIC8qIFNZU0xJTlVYICovCisjZW5kaWYKKworCisKKy8qCisqKiB0aHJlYWQgc3RhdGUgKyBleHRyYSBzcGFjZQorKi8KK3R5cGVkZWYgc3RydWN0IExYIHsKKyNpZiBkZWZpbmVkKExVQUlfRVhUUkFTUEFDRSkKKyAgY2hhciBidWZmW0xVQUlfRVhUUkFTUEFDRV07CisjZW5kaWYKKyAgbHVhX1N0YXRlIGw7Cit9IExYOworCisKKy8qCisqKiBNYWluIHRocmVhZCBjb21iaW5lcyBhIHRocmVhZCBzdGF0ZSBhbmQgdGhlIGdsb2JhbCBzdGF0ZQorKi8KK3R5cGVkZWYgc3RydWN0IExHIHsKKyAgTFggbDsKKyAgZ2xvYmFsX1N0YXRlIGc7Cit9IExHOworCisKKworI2RlZmluZSBmcm9tc3RhdGUoTCkJKGNhc3QoTFggKiwgY2FzdChsdV9ieXRlICosIChMKSkgLSBvZmZzZXRvZihMWCwgbCkpKQorCisKKy8qCisqKiBDb21wdXRlIGFuIGluaXRpYWwgc2VlZCBhcyByYW5kb20gYXMgcG9zc2libGUuIEluIEFOU0ksIHJlbHkgb24KKyoqIEFkZHJlc3MgU3BhY2UgTGF5b3V0IFJhbmRvbWl6YXRpb24gKGlmIHByZXNlbnQpIHRvIGluY3JlYXNlCisqKiByYW5kb21uZXNzLi4KKyovCisjZGVmaW5lIGFkZGJ1ZmYoYixwLGUpIFwKKyAgeyBzaXplX3QgdCA9IGNhc3Qoc2l6ZV90LCBlKTsgXAorICAgIG1lbWNweShidWZmICsgcCwgJnQsIHNpemVvZih0KSk7IHAgKz0gc2l6ZW9mKHQpOyB9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWFrZXNlZWQgKGx1YV9TdGF0ZSAqTCkgeworICBjaGFyIGJ1ZmZbNCAqIHNpemVvZihzaXplX3QpXTsKKyAgdW5zaWduZWQgaW50IGggPSBsdWFpX21ha2VzZWVkKCk7CisgIGludCBwID0gMDsKKyAgYWRkYnVmZihidWZmLCBwLCBMKTsgIC8qIGhlYXAgdmFyaWFibGUgKi8KKyAgYWRkYnVmZihidWZmLCBwLCAmaCk7ICAvKiBsb2NhbCB2YXJpYWJsZSAqLworICBhZGRidWZmKGJ1ZmYsIHAsIGx1YU9fbmlsb2JqZWN0KTsgIC8qIGdsb2JhbCB2YXJpYWJsZSAqLworICBhZGRidWZmKGJ1ZmYsIHAsICZsdWFfbmV3c3RhdGUpOyAgLyogcHVibGljIGZ1bmN0aW9uICovCisgIGx1YV9hc3NlcnQocCA9PSBzaXplb2YoYnVmZikpOworICByZXR1cm4gbHVhU19oYXNoKGJ1ZmYsIHAsIGgpOworfQorCisKKy8qCisqKiBzZXQgR0NkZWJ0IHRvIGEgbmV3IHZhbHVlIGtlZXBpbmcgdGhlIHZhbHVlICh0b3RhbGJ5dGVzICsgR0NkZWJ0KQorKiogaW52YXJpYW50CisqLwordm9pZCBsdWFFX3NldGRlYnQgKGdsb2JhbF9TdGF0ZSAqZywgbF9tZW0gZGVidCkgeworICBnLT50b3RhbGJ5dGVzIC09IChkZWJ0IC0gZy0+R0NkZWJ0KTsKKyAgZy0+R0NkZWJ0ID0gZGVidDsKK30KKworCitDYWxsSW5mbyAqbHVhRV9leHRlbmRDSSAobHVhX1N0YXRlICpMKSB7CisgIENhbGxJbmZvICpjaSA9IGx1YU1fbmV3KEwsIENhbGxJbmZvKTsKKyAgbHVhX2Fzc2VydChMLT5jaS0+bmV4dCA9PSBOVUxMKTsKKyAgTC0+Y2ktPm5leHQgPSBjaTsKKyAgY2ktPnByZXZpb3VzID0gTC0+Y2k7CisgIGNpLT5uZXh0ID0gTlVMTDsKKyAgcmV0dXJuIGNpOworfQorCisKK3ZvaWQgbHVhRV9mcmVlQ0kgKGx1YV9TdGF0ZSAqTCkgeworICBDYWxsSW5mbyAqY2kgPSBMLT5jaTsKKyAgQ2FsbEluZm8gKm5leHQgPSBjaS0+bmV4dDsKKyAgY2ktPm5leHQgPSBOVUxMOworICB3aGlsZSAoKGNpID0gbmV4dCkgIT0gTlVMTCkgeworICAgIG5leHQgPSBjaS0+bmV4dDsKKyAgICBsdWFNX2ZyZWUoTCwgY2kpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgc3RhY2tfaW5pdCAobHVhX1N0YXRlICpMMSwgbHVhX1N0YXRlICpMKSB7CisgIGludCBpOyBDYWxsSW5mbyAqY2k7CisgIC8qIGluaXRpYWxpemUgc3RhY2sgYXJyYXkgKi8KKyAgTDEtPnN0YWNrID0gbHVhTV9uZXd2ZWN0b3IoTCwgQkFTSUNfU1RBQ0tfU0laRSwgVFZhbHVlKTsKKyAgTDEtPnN0YWNrc2l6ZSA9IEJBU0lDX1NUQUNLX1NJWkU7CisgIGZvciAoaSA9IDA7IGkgPCBCQVNJQ19TVEFDS19TSVpFOyBpKyspCisgICAgc2V0bmlsdmFsdWUoTDEtPnN0YWNrICsgaSk7ICAvKiBlcmFzZSBuZXcgc3RhY2sgKi8KKyAgTDEtPnRvcCA9IEwxLT5zdGFjazsKKyAgTDEtPnN0YWNrX2xhc3QgPSBMMS0+c3RhY2sgKyBMMS0+c3RhY2tzaXplIC0gRVhUUkFfU1RBQ0s7CisgIC8qIGluaXRpYWxpemUgZmlyc3QgY2kgKi8KKyAgY2kgPSAmTDEtPmJhc2VfY2k7CisgIGNpLT5uZXh0ID0gY2ktPnByZXZpb3VzID0gTlVMTDsKKyAgY2ktPmNhbGxzdGF0dXMgPSAwOworICBjaS0+ZnVuYyA9IEwxLT50b3A7CisgIHNldG5pbHZhbHVlKEwxLT50b3ArKyk7ICAvKiAnZnVuY3Rpb24nIGVudHJ5IGZvciB0aGlzICdjaScgKi8KKyAgY2ktPnRvcCA9IEwxLT50b3AgKyBMVUFfTUlOU1RBQ0s7CisgIEwxLT5jaSA9IGNpOworfQorCisKK3N0YXRpYyB2b2lkIGZyZWVzdGFjayAobHVhX1N0YXRlICpMKSB7CisgIGlmIChMLT5zdGFjayA9PSBOVUxMKQorICAgIHJldHVybjsgIC8qIHN0YWNrIG5vdCBjb21wbGV0ZWx5IGJ1aWx0IHlldCAqLworICBMLT5jaSA9ICZMLT5iYXNlX2NpOyAgLyogZnJlZSB0aGUgZW50aXJlICdjaScgbGlzdCAqLworICBsdWFFX2ZyZWVDSShMKTsKKyAgbHVhTV9mcmVlYXJyYXkoTCwgTC0+c3RhY2ssIEwtPnN0YWNrc2l6ZSk7ICAvKiBmcmVlIHN0YWNrIGFycmF5ICovCit9CisKKworLyoKKyoqIENyZWF0ZSByZWdpc3RyeSB0YWJsZSBhbmQgaXRzIHByZWRlZmluZWQgdmFsdWVzCisqLworc3RhdGljIHZvaWQgaW5pdF9yZWdpc3RyeSAobHVhX1N0YXRlICpMLCBnbG9iYWxfU3RhdGUgKmcpIHsKKyAgVFZhbHVlIG10OworICAvKiBjcmVhdGUgcmVnaXN0cnkgKi8KKyAgVGFibGUgKnJlZ2lzdHJ5ID0gbHVhSF9uZXcoTCk7CisgIHNldGh2YWx1ZShMLCAmZy0+bF9yZWdpc3RyeSwgcmVnaXN0cnkpOworICBsdWFIX3Jlc2l6ZShMLCByZWdpc3RyeSwgTFVBX1JJRFhfTEFTVCwgMCk7CisgIC8qIHJlZ2lzdHJ5W0xVQV9SSURYX01BSU5USFJFQURdID0gTCAqLworICBzZXR0aHZhbHVlKEwsICZtdCwgTCk7CisgIGx1YUhfc2V0aW50KEwsIHJlZ2lzdHJ5LCBMVUFfUklEWF9NQUlOVEhSRUFELCAmbXQpOworICAvKiByZWdpc3RyeVtMVUFfUklEWF9HTE9CQUxTXSA9IHRhYmxlIG9mIGdsb2JhbHMgKi8KKyAgc2V0aHZhbHVlKEwsICZtdCwgbHVhSF9uZXcoTCkpOworICBsdWFIX3NldGludChMLCByZWdpc3RyeSwgTFVBX1JJRFhfR0xPQkFMUywgJm10KTsKK30KKworCisvKgorKiogb3BlbiBwYXJ0cyBvZiB0aGUgc3RhdGUgdGhhdCBtYXkgY2F1c2UgbWVtb3J5LWFsbG9jYXRpb24gZXJyb3JzCisqLworc3RhdGljIHZvaWQgZl9sdWFvcGVuIChsdWFfU3RhdGUgKkwsIHZvaWQgKnVkKSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIFVOVVNFRCh1ZCk7CisgIHN0YWNrX2luaXQoTCwgTCk7ICAvKiBpbml0IHN0YWNrICovCisgIGluaXRfcmVnaXN0cnkoTCwgZyk7CisgIGx1YVNfcmVzaXplKEwsIE1JTlNUUlRBQlNJWkUpOyAgLyogaW5pdGlhbCBzaXplIG9mIHN0cmluZyB0YWJsZSAqLworICBsdWFUX2luaXQoTCk7CisgIGx1YVhfaW5pdChMKTsKKyAgLyogcHJlLWNyZWF0ZSBtZW1vcnktZXJyb3IgbWVzc2FnZSAqLworICBnLT5tZW1lcnJtc2cgPSBsdWFTX25ld2xpdGVyYWwoTCwgTUVNRVJSTVNHKTsKKyAgbHVhU19maXgoZy0+bWVtZXJybXNnKTsgIC8qIGl0IHNob3VsZCBuZXZlciBiZSBjb2xsZWN0ZWQgKi8KKyAgZy0+Z2NydW5uaW5nID0gMTsgIC8qIGFsbG93IGdjICovCisgIGctPnZlcnNpb24gPSBsdWFfdmVyc2lvbihOVUxMKTsKKyAgbHVhaV91c2Vyc3RhdGVvcGVuKEwpOworfQorCisKKy8qCisqKiBwcmVpbml0aWFsaXplIGEgc3RhdGUgd2l0aCBjb25zaXN0ZW50IHZhbHVlcyB3aXRob3V0IGFsbG9jYXRpbmcKKyoqIGFueSBtZW1vcnkgKHRvIGF2b2lkIGVycm9ycykKKyovCitzdGF0aWMgdm9pZCBwcmVpbml0X3N0YXRlIChsdWFfU3RhdGUgKkwsIGdsb2JhbF9TdGF0ZSAqZykgeworICBHKEwpID0gZzsKKyAgTC0+c3RhY2sgPSBOVUxMOworICBMLT5jaSA9IE5VTEw7CisgIEwtPnN0YWNrc2l6ZSA9IDA7CisgIEwtPmVycm9ySm1wID0gTlVMTDsKKyAgTC0+bkNjYWxscyA9IDA7CisgIEwtPmhvb2sgPSBOVUxMOworICBMLT5ob29rbWFzayA9IDA7CisgIEwtPmJhc2Vob29rY291bnQgPSAwOworICBMLT5hbGxvd2hvb2sgPSAxOworICByZXNldGhvb2tjb3VudChMKTsKKyAgTC0+b3BlbnVwdmFsID0gTlVMTDsKKyAgTC0+bm55ID0gMTsKKyAgTC0+c3RhdHVzID0gTFVBX09LOworICBMLT5lcnJmdW5jID0gMDsKK30KKworCitzdGF0aWMgdm9pZCBjbG9zZV9zdGF0ZSAobHVhX1N0YXRlICpMKSB7CisgIGdsb2JhbF9TdGF0ZSAqZyA9IEcoTCk7CisgIGx1YUZfY2xvc2UoTCwgTC0+c3RhY2spOyAgLyogY2xvc2UgYWxsIHVwdmFsdWVzIGZvciB0aGlzIHRocmVhZCAqLworICBsdWFDX2ZyZWVhbGxvYmplY3RzKEwpOyAgLyogY29sbGVjdCBhbGwgb2JqZWN0cyAqLworICBpZiAoZy0+dmVyc2lvbikgIC8qIGNsb3NpbmcgYSBmdWxseSBidWlsdCBzdGF0ZT8gKi8KKyAgICBsdWFpX3VzZXJzdGF0ZWNsb3NlKEwpOworICBsdWFNX2ZyZWVhcnJheShMLCBHKEwpLT5zdHJ0Lmhhc2gsIEcoTCktPnN0cnQuc2l6ZSk7CisgIGx1YVpfZnJlZWJ1ZmZlcihMLCAmZy0+YnVmZik7CisgIGZyZWVzdGFjayhMKTsKKyAgbHVhX2Fzc2VydChnZXR0b3RhbGJ5dGVzKGcpID09IHNpemVvZihMRykpOworICAoKmctPmZyZWFsbG9jKShnLT51ZCwgZnJvbXN0YXRlKEwpLCBzaXplb2YoTEcpLCAwKTsgIC8qIGZyZWUgbWFpbiBibG9jayAqLworfQorCisKK0xVQV9BUEkgbHVhX1N0YXRlICpsdWFfbmV3dGhyZWFkIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX1N0YXRlICpMMTsKKyAgbHVhX2xvY2soTCk7CisgIGx1YUNfY2hlY2tHQyhMKTsKKyAgTDEgPSAmbHVhQ19uZXdvYmooTCwgTFVBX1RUSFJFQUQsIHNpemVvZihMWCksIE5VTEwsIG9mZnNldG9mKExYLCBsKSktPnRoOworICBzZXR0aHZhbHVlKEwsIEwtPnRvcCwgTDEpOworICBhcGlfaW5jcl90b3AoTCk7CisgIHByZWluaXRfc3RhdGUoTDEsIEcoTCkpOworICBMMS0+aG9va21hc2sgPSBMLT5ob29rbWFzazsKKyAgTDEtPmJhc2Vob29rY291bnQgPSBMLT5iYXNlaG9va2NvdW50OworICBMMS0+aG9vayA9IEwtPmhvb2s7CisgIHJlc2V0aG9va2NvdW50KEwxKTsKKyAgbHVhaV91c2Vyc3RhdGV0aHJlYWQoTCwgTDEpOworICBzdGFja19pbml0KEwxLCBMKTsgIC8qIGluaXQgc3RhY2sgKi8KKyAgbHVhX3VubG9jayhMKTsKKyAgcmV0dXJuIEwxOworfQorCisKK3ZvaWQgbHVhRV9mcmVldGhyZWFkIChsdWFfU3RhdGUgKkwsIGx1YV9TdGF0ZSAqTDEpIHsKKyAgTFggKmwgPSBmcm9tc3RhdGUoTDEpOworICBsdWFGX2Nsb3NlKEwxLCBMMS0+c3RhY2spOyAgLyogY2xvc2UgYWxsIHVwdmFsdWVzIGZvciB0aGlzIHRocmVhZCAqLworICBsdWFfYXNzZXJ0KEwxLT5vcGVudXB2YWwgPT0gTlVMTCk7CisgIGx1YWlfdXNlcnN0YXRlZnJlZShMLCBMMSk7CisgIGZyZWVzdGFjayhMMSk7CisgIGx1YU1fZnJlZShMLCBsKTsKK30KKworCitMVUFfQVBJIGx1YV9TdGF0ZSAqbHVhX25ld3N0YXRlIChsdWFfQWxsb2MgZiwgdm9pZCAqdWQpIHsKKyAgaW50IGk7CisgIGx1YV9TdGF0ZSAqTDsKKyAgZ2xvYmFsX1N0YXRlICpnOworICBMRyAqbCA9IGNhc3QoTEcgKiwgKCpmKSh1ZCwgTlVMTCwgTFVBX1RUSFJFQUQsIHNpemVvZihMRykpKTsKKyAgaWYgKGwgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIEwgPSAmbC0+bC5sOworICBnID0gJmwtPmc7CisgIEwtPm5leHQgPSBOVUxMOworICBMLT50dCA9IExVQV9UVEhSRUFEOworICBnLT5jdXJyZW50d2hpdGUgPSBiaXQybWFzayhXSElURTBCSVQsIEZJWEVEQklUKTsKKyAgTC0+bWFya2VkID0gbHVhQ193aGl0ZShnKTsKKyAgZy0+Z2NraW5kID0gS0dDX05PUk1BTDsKKyAgcHJlaW5pdF9zdGF0ZShMLCBnKTsKKyAgZy0+ZnJlYWxsb2MgPSBmOworICBnLT51ZCA9IHVkOworICBnLT5tYWludGhyZWFkID0gTDsKKyAgZy0+c2VlZCA9IG1ha2VzZWVkKEwpOworICBnLT51dmhlYWQudS5sLnByZXYgPSAmZy0+dXZoZWFkOworICBnLT51dmhlYWQudS5sLm5leHQgPSAmZy0+dXZoZWFkOworICBnLT5nY3J1bm5pbmcgPSAwOyAgLyogbm8gR0Mgd2hpbGUgYnVpbGRpbmcgc3RhdGUgKi8KKyAgZy0+R0Nlc3RpbWF0ZSA9IDA7CisgIGctPnN0cnQuc2l6ZSA9IDA7CisgIGctPnN0cnQubnVzZSA9IDA7CisgIGctPnN0cnQuaGFzaCA9IE5VTEw7CisgIHNldG5pbHZhbHVlKCZnLT5sX3JlZ2lzdHJ5KTsKKyAgbHVhWl9pbml0YnVmZmVyKEwsICZnLT5idWZmKTsKKyAgZy0+cGFuaWMgPSBOVUxMOworICBnLT52ZXJzaW9uID0gTlVMTDsKKyAgZy0+Z2NzdGF0ZSA9IEdDU3BhdXNlOworICBnLT5hbGxnYyA9IE5VTEw7CisgIGctPmZpbm9iaiA9IE5VTEw7CisgIGctPnRvYmVmbnogPSBOVUxMOworICBnLT5zd2VlcGdjID0gZy0+c3dlZXBmaW4gPSBOVUxMOworICBnLT5ncmF5ID0gZy0+Z3JheWFnYWluID0gTlVMTDsKKyAgZy0+d2VhayA9IGctPmVwaGVtZXJvbiA9IGctPmFsbHdlYWsgPSBOVUxMOworICBnLT50b3RhbGJ5dGVzID0gc2l6ZW9mKExHKTsKKyAgZy0+R0NkZWJ0ID0gMDsKKyAgZy0+Z2NwYXVzZSA9IExVQUlfR0NQQVVTRTsKKyAgZy0+Z2NtYWpvcmluYyA9IExVQUlfR0NNQUpPUjsKKyAgZy0+Z2NzdGVwbXVsID0gTFVBSV9HQ01VTDsKKyAgZm9yIChpPTA7IGkgPCBMVUFfTlVNVEFHUzsgaSsrKSBnLT5tdFtpXSA9IE5VTEw7CisgIGlmIChsdWFEX3Jhd3J1bnByb3RlY3RlZChMLCBmX2x1YW9wZW4sIE5VTEwpICE9IExVQV9PSykgeworICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yOiBmcmVlIHBhcnRpYWwgc3RhdGUgKi8KKyAgICBjbG9zZV9zdGF0ZShMKTsKKyAgICBMID0gTlVMTDsKKyAgfQorICByZXR1cm4gTDsKK30KKworCitMVUFfQVBJIHZvaWQgbHVhX2Nsb3NlIChsdWFfU3RhdGUgKkwpIHsKKyAgTCA9IEcoTCktPm1haW50aHJlYWQ7ICAvKiBvbmx5IHRoZSBtYWluIHRocmVhZCBjYW4gYmUgY2xvc2VkICovCisgIGx1YV9sb2NrKEwpOworICBjbG9zZV9zdGF0ZShMKTsKK30KKworCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2xzdGF0ZS5oIGIvY29tMzIvbHVhL3NyYy9sc3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWZmZDlhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sc3RhdGUuaApAQCAtMCwwICsxLDIyOCBAQAorLyoKKyoqICRJZDogbHN0YXRlLmgsdiAyLjgyLjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIEdsb2JhbCBTdGF0ZQorKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpZm5kZWYgbHN0YXRlX2gKKyNkZWZpbmUgbHN0YXRlX2gKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImx0bS5oIgorI2luY2x1ZGUgImx6aW8uaCIKKworCisvKgorCisqKiBTb21lIG5vdGVzIGFib3V0IGdhcmJhZ2UtY29sbGVjdGVkIG9iamVjdHM6ICBBbGwgb2JqZWN0cyBpbiBMdWEgbXVzdAorKiogYmUga2VwdCBzb21laG93IGFjY2Vzc2libGUgdW50aWwgYmVpbmcgZnJlZWQuCisqKgorKiogTHVhIGtlZXBzIG1vc3Qgb2JqZWN0cyBsaW5rZWQgaW4gbGlzdCBnLT5hbGxnYy4gVGhlIGxpbmsgdXNlcyBmaWVsZAorKiogJ25leHQnIG9mIHRoZSBDb21tb25IZWFkZXIuCisqKgorKiogU3RyaW5ncyBhcmUga2VwdCBpbiBzZXZlcmFsIGxpc3RzIGhlYWRlZCBieSB0aGUgYXJyYXkgZy0+c3RydC5oYXNoLgorKioKKyoqIE9wZW4gdXB2YWx1ZXMgYXJlIG5vdCBzdWJqZWN0IHRvIGluZGVwZW5kZW50IGdhcmJhZ2UgY29sbGVjdGlvbi4gVGhleQorKiogYXJlIGNvbGxlY3RlZCB0b2dldGhlciB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgdGhyZWFkcy4gTHVhIGtlZXBzIGEKKyoqIGRvdWJsZS1saW5rZWQgbGlzdCB3aXRoIGFsbCBvcGVuIHVwdmFsdWVzIChnLT51dmhlYWQpIHNvIHRoYXQgaXQgY2FuCisqKiBtYXJrIG9iamVjdHMgcmVmZXJyZWQgYnkgdGhlbS4gKFRoZXkgYXJlIGFsd2F5cyBncmF5LCBzbyB0aGV5IG11c3QKKyoqIGJlIHJlbWFya2VkIGluIHRoZSBhdG9taWMgc3RlcC4gVXN1YWxseSB0aGVpciBjb250ZW50cyB3b3VsZCBiZSBtYXJrZWQKKyoqIHdoZW4gdHJhdmVyc2luZyB0aGUgcmVzcGVjdGl2ZSB0aHJlYWRzLCBidXQgdGhlIHRocmVhZCBtYXkgYWxyZWFkeSBiZQorKiogZGVhZCwgd2hpbGUgdGhlIHVwdmFsdWUgaXMgc3RpbGwgYWNjZXNzaWJsZSB0aHJvdWdoIGNsb3N1cmVzLikKKyoqCisqKiBPYmplY3RzIHdpdGggZmluYWxpemVycyBhcmUga2VwdCBpbiB0aGUgbGlzdCBnLT5maW5vYmouCisqKgorKiogVGhlIGxpc3QgZy0+dG9iZWZueiBsaW5rcyBhbGwgb2JqZWN0cyBiZWluZyBmaW5hbGl6ZWQuCisKKyovCisKKworc3RydWN0IGx1YV9sb25nam1wOyAgLyogZGVmaW5lZCBpbiBsZG8uYyAqLworCisKKworLyogZXh0cmEgc3RhY2sgc3BhY2UgdG8gaGFuZGxlIFRNIGNhbGxzIGFuZCBzb21lIG90aGVyIGV4dHJhcyAqLworI2RlZmluZSBFWFRSQV9TVEFDSyAgIDUKKworCisjZGVmaW5lIEJBU0lDX1NUQUNLX1NJWkUgICAgICAgICgyKkxVQV9NSU5TVEFDSykKKworCisvKiBraW5kcyBvZiBHYXJiYWdlIENvbGxlY3Rpb24gKi8KKyNkZWZpbmUgS0dDX05PUk1BTAkwCisjZGVmaW5lIEtHQ19FTUVSR0VOQ1kJMQkvKiBnYyB3YXMgZm9yY2VkIGJ5IGFuIGFsbG9jYXRpb24gZmFpbHVyZSAqLworI2RlZmluZSBLR0NfR0VOCQkyCS8qIGdlbmVyYXRpb25hbCBjb2xsZWN0aW9uICovCisKKwordHlwZWRlZiBzdHJ1Y3Qgc3RyaW5ndGFibGUgeworICBHQ09iamVjdCAqKmhhc2g7CisgIGx1X2ludDMyIG51c2U7ICAvKiBudW1iZXIgb2YgZWxlbWVudHMgKi8KKyAgaW50IHNpemU7Cit9IHN0cmluZ3RhYmxlOworCisKKy8qCisqKiBpbmZvcm1hdGlvbiBhYm91dCBhIGNhbGwKKyovCit0eXBlZGVmIHN0cnVjdCBDYWxsSW5mbyB7CisgIFN0a0lkIGZ1bmM7ICAvKiBmdW5jdGlvbiBpbmRleCBpbiB0aGUgc3RhY2sgKi8KKyAgU3RrSWQJdG9wOyAgLyogdG9wIGZvciB0aGlzIGZ1bmN0aW9uICovCisgIHN0cnVjdCBDYWxsSW5mbyAqcHJldmlvdXMsICpuZXh0OyAgLyogZHluYW1pYyBjYWxsIGxpbmsgKi8KKyAgc2hvcnQgbnJlc3VsdHM7ICAvKiBleHBlY3RlZCBudW1iZXIgb2YgcmVzdWx0cyBmcm9tIHRoaXMgZnVuY3Rpb24gKi8KKyAgbHVfYnl0ZSBjYWxsc3RhdHVzOworICBwdHJkaWZmX3QgZXh0cmE7CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeyAgLyogb25seSBmb3IgTHVhIGZ1bmN0aW9ucyAqLworICAgICAgU3RrSWQgYmFzZTsgIC8qIGJhc2UgZm9yIHRoaXMgZnVuY3Rpb24gKi8KKyAgICAgIGNvbnN0IEluc3RydWN0aW9uICpzYXZlZHBjOworICAgIH0gbDsKKyAgICBzdHJ1Y3QgeyAgLyogb25seSBmb3IgQyBmdW5jdGlvbnMgKi8KKyAgICAgIGludCBjdHg7ICAvKiBjb250ZXh0IGluZm8uIGluIGNhc2Ugb2YgeWllbGRzICovCisgICAgICBsdWFfQ0Z1bmN0aW9uIGs7ICAvKiBjb250aW51YXRpb24gaW4gY2FzZSBvZiB5aWVsZHMgKi8KKyAgICAgIHB0cmRpZmZfdCBvbGRfZXJyZnVuYzsKKyAgICAgIGx1X2J5dGUgb2xkX2FsbG93aG9vazsKKyAgICAgIGx1X2J5dGUgc3RhdHVzOworICAgIH0gYzsKKyAgfSB1OworfSBDYWxsSW5mbzsKKworCisvKgorKiogQml0cyBpbiBDYWxsSW5mbyBzdGF0dXMKKyovCisjZGVmaW5lIENJU1RfTFVBCSgxPDwwKQkvKiBjYWxsIGlzIHJ1bm5pbmcgYSBMdWEgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQ0lTVF9IT09LRUQJKDE8PDEpCS8qIGNhbGwgaXMgcnVubmluZyBhIGRlYnVnIGhvb2sgKi8KKyNkZWZpbmUgQ0lTVF9SRUVOVFJZCSgxPDwyKQkvKiBjYWxsIGlzIHJ1bm5pbmcgb24gc2FtZSBpbnZvY2F0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YVZfZXhlY3V0ZSBvZiBwcmV2aW91cyBjYWxsICovCisjZGVmaW5lIENJU1RfWUlFTERFRAkoMTw8MykJLyogY2FsbCByZWVudGVyZWQgYWZ0ZXIgc3VzcGVuc2lvbiAqLworI2RlZmluZSBDSVNUX1lQQ0FMTAkoMTw8NCkJLyogY2FsbCBpcyBhIHlpZWxkYWJsZSBwcm90ZWN0ZWQgY2FsbCAqLworI2RlZmluZSBDSVNUX1NUQVQJKDE8PDUpCS8qIGNhbGwgaGFzIGFuIGVycm9yIHN0YXR1cyAocGNhbGwpICovCisjZGVmaW5lIENJU1RfVEFJTAkoMTw8NikJLyogY2FsbCB3YXMgdGFpbCBjYWxsZWQgKi8KKyNkZWZpbmUgQ0lTVF9IT09LWUlFTEQJKDE8PDcpCS8qIGxhc3QgaG9vayBjYWxsZWQgeWllbGRlZCAqLworCisKKyNkZWZpbmUgaXNMdWEoY2kpCSgoY2kpLT5jYWxsc3RhdHVzICYgQ0lTVF9MVUEpCisKKworLyoKKyoqIGBnbG9iYWwgc3RhdGUnLCBzaGFyZWQgYnkgYWxsIHRocmVhZHMgb2YgdGhpcyBzdGF0ZQorKi8KK3R5cGVkZWYgc3RydWN0IGdsb2JhbF9TdGF0ZSB7CisgIGx1YV9BbGxvYyBmcmVhbGxvYzsgIC8qIGZ1bmN0aW9uIHRvIHJlYWxsb2NhdGUgbWVtb3J5ICovCisgIHZvaWQgKnVkOyAgICAgICAgIC8qIGF1eGlsaWFyeSBkYXRhIHRvIGBmcmVhbGxvYycgKi8KKyAgbHVfbWVtIHRvdGFsYnl0ZXM7ICAvKiBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGFsbG9jYXRlZCAtIEdDZGVidCAqLworICBsX21lbSBHQ2RlYnQ7ICAvKiBieXRlcyBhbGxvY2F0ZWQgbm90IHlldCBjb21wZW5zYXRlZCBieSB0aGUgY29sbGVjdG9yICovCisgIGx1X21lbSBHQ21lbXRyYXY7ICAvKiBtZW1vcnkgdHJhdmVyc2VkIGJ5IHRoZSBHQyAqLworICBsdV9tZW0gR0Nlc3RpbWF0ZTsgIC8qIGFuIGVzdGltYXRlIG9mIHRoZSBub24tZ2FyYmFnZSBtZW1vcnkgaW4gdXNlICovCisgIHN0cmluZ3RhYmxlIHN0cnQ7ICAvKiBoYXNoIHRhYmxlIGZvciBzdHJpbmdzICovCisgIFRWYWx1ZSBsX3JlZ2lzdHJ5OworICB1bnNpZ25lZCBpbnQgc2VlZDsgIC8qIHJhbmRvbWl6ZWQgc2VlZCBmb3IgaGFzaGVzICovCisgIGx1X2J5dGUgY3VycmVudHdoaXRlOworICBsdV9ieXRlIGdjc3RhdGU7ICAvKiBzdGF0ZSBvZiBnYXJiYWdlIGNvbGxlY3RvciAqLworICBsdV9ieXRlIGdja2luZDsgIC8qIGtpbmQgb2YgR0MgcnVubmluZyAqLworICBsdV9ieXRlIGdjcnVubmluZzsgIC8qIHRydWUgaWYgR0MgaXMgcnVubmluZyAqLworICBpbnQgc3dlZXBzdHJnYzsgIC8qIHBvc2l0aW9uIG9mIHN3ZWVwIGluIGBzdHJ0JyAqLworICBHQ09iamVjdCAqYWxsZ2M7ICAvKiBsaXN0IG9mIGFsbCBjb2xsZWN0YWJsZSBvYmplY3RzICovCisgIEdDT2JqZWN0ICpmaW5vYmo7ICAvKiBsaXN0IG9mIGNvbGxlY3RhYmxlIG9iamVjdHMgd2l0aCBmaW5hbGl6ZXJzICovCisgIEdDT2JqZWN0ICoqc3dlZXBnYzsgIC8qIGN1cnJlbnQgcG9zaXRpb24gb2Ygc3dlZXAgaW4gbGlzdCAnYWxsZ2MnICovCisgIEdDT2JqZWN0ICoqc3dlZXBmaW47ICAvKiBjdXJyZW50IHBvc2l0aW9uIG9mIHN3ZWVwIGluIGxpc3QgJ2Zpbm9iaicgKi8KKyAgR0NPYmplY3QgKmdyYXk7ICAvKiBsaXN0IG9mIGdyYXkgb2JqZWN0cyAqLworICBHQ09iamVjdCAqZ3JheWFnYWluOyAgLyogbGlzdCBvZiBvYmplY3RzIHRvIGJlIHRyYXZlcnNlZCBhdG9taWNhbGx5ICovCisgIEdDT2JqZWN0ICp3ZWFrOyAgLyogbGlzdCBvZiB0YWJsZXMgd2l0aCB3ZWFrIHZhbHVlcyAqLworICBHQ09iamVjdCAqZXBoZW1lcm9uOyAgLyogbGlzdCBvZiBlcGhlbWVyb24gdGFibGVzICh3ZWFrIGtleXMpICovCisgIEdDT2JqZWN0ICphbGx3ZWFrOyAgLyogbGlzdCBvZiBhbGwtd2VhayB0YWJsZXMgKi8KKyAgR0NPYmplY3QgKnRvYmVmbno7ICAvKiBsaXN0IG9mIHVzZXJkYXRhIHRvIGJlIEdDICovCisgIFVwVmFsIHV2aGVhZDsgIC8qIGhlYWQgb2YgZG91YmxlLWxpbmtlZCBsaXN0IG9mIGFsbCBvcGVuIHVwdmFsdWVzICovCisgIE1idWZmZXIgYnVmZjsgIC8qIHRlbXBvcmFyeSBidWZmZXIgZm9yIHN0cmluZyBjb25jYXRlbmF0aW9uICovCisgIGludCBnY3BhdXNlOyAgLyogc2l6ZSBvZiBwYXVzZSBiZXR3ZWVuIHN1Y2Nlc3NpdmUgR0NzICovCisgIGludCBnY21ham9yaW5jOyAgLyogcGF1c2UgYmV0d2VlbiBtYWpvciBjb2xsZWN0aW9ucyAob25seSBpbiBnZW4uIG1vZGUpICovCisgIGludCBnY3N0ZXBtdWw7ICAvKiBHQyBgZ3JhbnVsYXJpdHknICovCisgIGx1YV9DRnVuY3Rpb24gcGFuaWM7ICAvKiB0byBiZSBjYWxsZWQgaW4gdW5wcm90ZWN0ZWQgZXJyb3JzICovCisgIHN0cnVjdCBsdWFfU3RhdGUgKm1haW50aHJlYWQ7CisgIGNvbnN0IGx1YV9OdW1iZXIgKnZlcnNpb247ICAvKiBwb2ludGVyIHRvIHZlcnNpb24gbnVtYmVyICovCisgIFRTdHJpbmcgKm1lbWVycm1zZzsgIC8qIG1lbW9yeS1lcnJvciBtZXNzYWdlICovCisgIFRTdHJpbmcgKnRtbmFtZVtUTV9OXTsgIC8qIGFycmF5IHdpdGggdGFnLW1ldGhvZCBuYW1lcyAqLworICBzdHJ1Y3QgVGFibGUgKm10W0xVQV9OVU1UQUdTXTsgIC8qIG1ldGF0YWJsZXMgZm9yIGJhc2ljIHR5cGVzICovCit9IGdsb2JhbF9TdGF0ZTsKKworCisvKgorKiogYHBlciB0aHJlYWQnIHN0YXRlCisqLworc3RydWN0IGx1YV9TdGF0ZSB7CisgIENvbW1vbkhlYWRlcjsKKyAgbHVfYnl0ZSBzdGF0dXM7CisgIFN0a0lkIHRvcDsgIC8qIGZpcnN0IGZyZWUgc2xvdCBpbiB0aGUgc3RhY2sgKi8KKyAgZ2xvYmFsX1N0YXRlICpsX0c7CisgIENhbGxJbmZvICpjaTsgIC8qIGNhbGwgaW5mbyBmb3IgY3VycmVudCBmdW5jdGlvbiAqLworICBjb25zdCBJbnN0cnVjdGlvbiAqb2xkcGM7ICAvKiBsYXN0IHBjIHRyYWNlZCAqLworICBTdGtJZCBzdGFja19sYXN0OyAgLyogbGFzdCBmcmVlIHNsb3QgaW4gdGhlIHN0YWNrICovCisgIFN0a0lkIHN0YWNrOyAgLyogc3RhY2sgYmFzZSAqLworICBpbnQgc3RhY2tzaXplOworICB1bnNpZ25lZCBzaG9ydCBubnk7ICAvKiBudW1iZXIgb2Ygbm9uLXlpZWxkYWJsZSBjYWxscyBpbiBzdGFjayAqLworICB1bnNpZ25lZCBzaG9ydCBuQ2NhbGxzOyAgLyogbnVtYmVyIG9mIG5lc3RlZCBDIGNhbGxzICovCisgIGx1X2J5dGUgaG9va21hc2s7CisgIGx1X2J5dGUgYWxsb3dob29rOworICBpbnQgYmFzZWhvb2tjb3VudDsKKyAgaW50IGhvb2tjb3VudDsKKyAgbHVhX0hvb2sgaG9vazsKKyAgR0NPYmplY3QgKm9wZW51cHZhbDsgIC8qIGxpc3Qgb2Ygb3BlbiB1cHZhbHVlcyBpbiB0aGlzIHN0YWNrICovCisgIEdDT2JqZWN0ICpnY2xpc3Q7CisgIHN0cnVjdCBsdWFfbG9uZ2ptcCAqZXJyb3JKbXA7ICAvKiBjdXJyZW50IGVycm9yIHJlY292ZXIgcG9pbnQgKi8KKyAgcHRyZGlmZl90IGVycmZ1bmM7ICAvKiBjdXJyZW50IGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9uIChzdGFjayBpbmRleCkgKi8KKyAgQ2FsbEluZm8gYmFzZV9jaTsgIC8qIENhbGxJbmZvIGZvciBmaXJzdCBsZXZlbCAoQyBjYWxsaW5nIEx1YSkgKi8KK307CisKKworI2RlZmluZSBHKEwpCShMLT5sX0cpCisKKworLyoKKyoqIFVuaW9uIG9mIGFsbCBjb2xsZWN0YWJsZSBvYmplY3RzCisqLwordW5pb24gR0NPYmplY3QgeworICBHQ2hlYWRlciBnY2g7ICAvKiBjb21tb24gaGVhZGVyICovCisgIHVuaW9uIFRTdHJpbmcgdHM7CisgIHVuaW9uIFVkYXRhIHU7CisgIHVuaW9uIENsb3N1cmUgY2w7CisgIHN0cnVjdCBUYWJsZSBoOworICBzdHJ1Y3QgUHJvdG8gcDsKKyAgc3RydWN0IFVwVmFsIHV2OworICBzdHJ1Y3QgbHVhX1N0YXRlIHRoOyAgLyogdGhyZWFkICovCit9OworCisKKyNkZWZpbmUgZ2NoKG8pCQkoJihvKS0+Z2NoKQorCisvKiBtYWNyb3MgdG8gY29udmVydCBhIEdDT2JqZWN0IGludG8gYSBzcGVjaWZpYyB2YWx1ZSAqLworI2RlZmluZSByYXdnY28ydHMobykgIFwKKwljaGVja19leHAobm92YXJpYW50KChvKS0+Z2NoLnR0KSA9PSBMVUFfVFNUUklORywgJigobyktPnRzKSkKKyNkZWZpbmUgZ2NvMnRzKG8pCSgmcmF3Z2NvMnRzKG8pLT50c3YpCisjZGVmaW5lIHJhd2djbzJ1KG8pCWNoZWNrX2V4cCgobyktPmdjaC50dCA9PSBMVUFfVFVTRVJEQVRBLCAmKChvKS0+dSkpCisjZGVmaW5lIGdjbzJ1KG8pCSgmcmF3Z2NvMnUobyktPnV2KQorI2RlZmluZSBnY28ybGNsKG8pCWNoZWNrX2V4cCgobyktPmdjaC50dCA9PSBMVUFfVExDTCwgJigobyktPmNsLmwpKQorI2RlZmluZSBnY28yY2NsKG8pCWNoZWNrX2V4cCgobyktPmdjaC50dCA9PSBMVUFfVENDTCwgJigobyktPmNsLmMpKQorI2RlZmluZSBnY28yY2wobykgIFwKKwljaGVja19leHAobm92YXJpYW50KChvKS0+Z2NoLnR0KSA9PSBMVUFfVEZVTkNUSU9OLCAmKChvKS0+Y2wpKQorI2RlZmluZSBnY28ydChvKQljaGVja19leHAoKG8pLT5nY2gudHQgPT0gTFVBX1RUQUJMRSwgJigobyktPmgpKQorI2RlZmluZSBnY28ycChvKQljaGVja19leHAoKG8pLT5nY2gudHQgPT0gTFVBX1RQUk9UTywgJigobyktPnApKQorI2RlZmluZSBnY28ydXYobykJY2hlY2tfZXhwKChvKS0+Z2NoLnR0ID09IExVQV9UVVBWQUwsICYoKG8pLT51dikpCisjZGVmaW5lIGdjbzJ0aChvKQljaGVja19leHAoKG8pLT5nY2gudHQgPT0gTFVBX1RUSFJFQUQsICYoKG8pLT50aCkpCisKKy8qIG1hY3JvIHRvIGNvbnZlcnQgYW55IEx1YSBvYmplY3QgaW50byBhIEdDT2JqZWN0ICovCisjZGVmaW5lIG9iajJnY28odikJKGNhc3QoR0NPYmplY3QgKiwgKHYpKSkKKworCisvKiBhY3R1YWwgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIGFsbG9jYXRlZCAqLworI2RlZmluZSBnZXR0b3RhbGJ5dGVzKGcpCSgoZyktPnRvdGFsYnl0ZXMgKyAoZyktPkdDZGVidCkKKworTFVBSV9GVU5DIHZvaWQgbHVhRV9zZXRkZWJ0IChnbG9iYWxfU3RhdGUgKmcsIGxfbWVtIGRlYnQpOworTFVBSV9GVU5DIHZvaWQgbHVhRV9mcmVldGhyZWFkIChsdWFfU3RhdGUgKkwsIGx1YV9TdGF0ZSAqTDEpOworTFVBSV9GVU5DIENhbGxJbmZvICpsdWFFX2V4dGVuZENJIChsdWFfU3RhdGUgKkwpOworTFVBSV9GVU5DIHZvaWQgbHVhRV9mcmVlQ0kgKGx1YV9TdGF0ZSAqTCk7CisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbHN0cmluZy5jIGIvY29tMzIvbHVhL3NyYy9sc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5NmM4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbHN0cmluZy5jCkBAIC0wLDAgKzEsMTg1IEBACisvKgorKiogJElkOiBsc3RyaW5nLmMsdiAyLjI2LjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIFN0cmluZyB0YWJsZSAoa2VlcHMgYWxsIHN0cmluZ3MgaGFuZGxlZCBieSBMdWEpCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbHN0cmluZ19jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxtZW0uaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHN0cmluZy5oIgorCisKKy8qCisqKiBMdWEgd2lsbCB1c2UgYXQgbW9zdCB+KDJeTFVBSV9IQVNITElNSVQpIGJ5dGVzIGZyb20gYSBzdHJpbmcgdG8KKyoqIGNvbXB1dGUgaXRzIGhhc2gKKyovCisjaWYgIWRlZmluZWQoTFVBSV9IQVNITElNSVQpCisjZGVmaW5lIExVQUlfSEFTSExJTUlUCQk1CisjZW5kaWYKKworCisvKgorKiogZXF1YWxpdHkgZm9yIGxvbmcgc3RyaW5ncworKi8KK2ludCBsdWFTX2VxbG5nc3RyIChUU3RyaW5nICphLCBUU3RyaW5nICpiKSB7CisgIHNpemVfdCBsZW4gPSBhLT50c3YubGVuOworICBsdWFfYXNzZXJ0KGEtPnRzdi50dCA9PSBMVUFfVExOR1NUUiAmJiBiLT50c3YudHQgPT0gTFVBX1RMTkdTVFIpOworICByZXR1cm4gKGEgPT0gYikgfHwgIC8qIHNhbWUgaW5zdGFuY2Ugb3IuLi4gKi8KKyAgICAoKGxlbiA9PSBiLT50c3YubGVuKSAmJiAgLyogZXF1YWwgbGVuZ3RoIGFuZCAuLi4gKi8KKyAgICAgKG1lbWNtcChnZXRzdHIoYSksIGdldHN0cihiKSwgbGVuKSA9PSAwKSk7ICAvKiBlcXVhbCBjb250ZW50cyAqLworfQorCisKKy8qCisqKiBlcXVhbGl0eSBmb3Igc3RyaW5ncworKi8KK2ludCBsdWFTX2Vxc3RyIChUU3RyaW5nICphLCBUU3RyaW5nICpiKSB7CisgIHJldHVybiAoYS0+dHN2LnR0ID09IGItPnRzdi50dCkgJiYKKyAgICAgICAgIChhLT50c3YudHQgPT0gTFVBX1RTSFJTVFIgPyBlcXNocnN0cihhLCBiKSA6IGx1YVNfZXFsbmdzdHIoYSwgYikpOworfQorCisKK3Vuc2lnbmVkIGludCBsdWFTX2hhc2ggKGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGwsIHVuc2lnbmVkIGludCBzZWVkKSB7CisgIHVuc2lnbmVkIGludCBoID0gc2VlZCBeIGNhc3QodW5zaWduZWQgaW50LCBsKTsKKyAgc2l6ZV90IGwxOworICBzaXplX3Qgc3RlcCA9IChsID4+IExVQUlfSEFTSExJTUlUKSArIDE7CisgIGZvciAobDEgPSBsOyBsMSA+PSBzdGVwOyBsMSAtPSBzdGVwKQorICAgIGggPSBoIF4gKChoPDw1KSArIChoPj4yKSArIGNhc3RfYnl0ZShzdHJbbDEgLSAxXSkpOworICByZXR1cm4gaDsKK30KKworCisvKgorKiogcmVzaXplcyB0aGUgc3RyaW5nIHRhYmxlCisqLwordm9pZCBsdWFTX3Jlc2l6ZSAobHVhX1N0YXRlICpMLCBpbnQgbmV3c2l6ZSkgeworICBpbnQgaTsKKyAgc3RyaW5ndGFibGUgKnRiID0gJkcoTCktPnN0cnQ7CisgIC8qIGNhbm5vdCByZXNpemUgd2hpbGUgR0MgaXMgdHJhdmVyc2luZyBzdHJpbmdzICovCisgIGx1YUNfcnVudGlsc3RhdGUoTCwgfmJpdG1hc2soR0NTc3dlZXBzdHJpbmcpKTsKKyAgaWYgKG5ld3NpemUgPiB0Yi0+c2l6ZSkgeworICAgIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCB0Yi0+aGFzaCwgdGItPnNpemUsIG5ld3NpemUsIEdDT2JqZWN0ICopOworICAgIGZvciAoaSA9IHRiLT5zaXplOyBpIDwgbmV3c2l6ZTsgaSsrKSB0Yi0+aGFzaFtpXSA9IE5VTEw7CisgIH0KKyAgLyogcmVoYXNoICovCisgIGZvciAoaT0wOyBpPHRiLT5zaXplOyBpKyspIHsKKyAgICBHQ09iamVjdCAqcCA9IHRiLT5oYXNoW2ldOworICAgIHRiLT5oYXNoW2ldID0gTlVMTDsKKyAgICB3aGlsZSAocCkgeyAgLyogZm9yIGVhY2ggbm9kZSBpbiB0aGUgbGlzdCAqLworICAgICAgR0NPYmplY3QgKm5leHQgPSBnY2gocCktPm5leHQ7ICAvKiBzYXZlIG5leHQgKi8KKyAgICAgIHVuc2lnbmVkIGludCBoID0gbG1vZChnY28ydHMocCktPmhhc2gsIG5ld3NpemUpOyAgLyogbmV3IHBvc2l0aW9uICovCisgICAgICBnY2gocCktPm5leHQgPSB0Yi0+aGFzaFtoXTsgIC8qIGNoYWluIGl0ICovCisgICAgICB0Yi0+aGFzaFtoXSA9IHA7CisgICAgICByZXNldG9sZGJpdChwKTsgIC8qIHNlZSBNT1ZFIE9MRCBydWxlICovCisgICAgICBwID0gbmV4dDsKKyAgICB9CisgIH0KKyAgaWYgKG5ld3NpemUgPCB0Yi0+c2l6ZSkgeworICAgIC8qIHNocmlua2luZyBzbGljZSBtdXN0IGJlIGVtcHR5ICovCisgICAgbHVhX2Fzc2VydCh0Yi0+aGFzaFtuZXdzaXplXSA9PSBOVUxMICYmIHRiLT5oYXNoW3RiLT5zaXplIC0gMV0gPT0gTlVMTCk7CisgICAgbHVhTV9yZWFsbG9jdmVjdG9yKEwsIHRiLT5oYXNoLCB0Yi0+c2l6ZSwgbmV3c2l6ZSwgR0NPYmplY3QgKik7CisgIH0KKyAgdGItPnNpemUgPSBuZXdzaXplOworfQorCisKKy8qCisqKiBjcmVhdGVzIGEgbmV3IHN0cmluZyBvYmplY3QKKyovCitzdGF0aWMgVFN0cmluZyAqY3JlYXRlc3Ryb2JqIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCB1bnNpZ25lZCBpbnQgaCwgR0NPYmplY3QgKipsaXN0KSB7CisgIFRTdHJpbmcgKnRzOworICBzaXplX3QgdG90YWxzaXplOyAgLyogdG90YWwgc2l6ZSBvZiBUU3RyaW5nIG9iamVjdCAqLworICB0b3RhbHNpemUgPSBzaXplb2YoVFN0cmluZykgKyAoKGwgKyAxKSAqIHNpemVvZihjaGFyKSk7CisgIHRzID0gJmx1YUNfbmV3b2JqKEwsIHRhZywgdG90YWxzaXplLCBsaXN0LCAwKS0+dHM7CisgIHRzLT50c3YubGVuID0gbDsKKyAgdHMtPnRzdi5oYXNoID0gaDsKKyAgdHMtPnRzdi5leHRyYSA9IDA7CisgIG1lbWNweSh0cysxLCBzdHIsIGwqc2l6ZW9mKGNoYXIpKTsKKyAgKChjaGFyICopKHRzKzEpKVtsXSA9ICdcMCc7ICAvKiBlbmRpbmcgMCAqLworICByZXR1cm4gdHM7Cit9CisKKworLyoKKyoqIGNyZWF0ZXMgYSBuZXcgc2hvcnQgc3RyaW5nLCBpbnNlcnRpbmcgaXQgaW50byBzdHJpbmcgdGFibGUKKyovCitzdGF0aWMgVFN0cmluZyAqbmV3c2hyc3RyIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaCkgeworICBHQ09iamVjdCAqKmxpc3Q7ICAvKiAocG9pbnRlciB0bykgbGlzdCB3aGVyZSBpdCB3aWxsIGJlIGluc2VydGVkICovCisgIHN0cmluZ3RhYmxlICp0YiA9ICZHKEwpLT5zdHJ0OworICBUU3RyaW5nICpzOworICBpZiAodGItPm51c2UgPj0gY2FzdChsdV9pbnQzMiwgdGItPnNpemUpICYmIHRiLT5zaXplIDw9IE1BWF9JTlQvMikKKyAgICBsdWFTX3Jlc2l6ZShMLCB0Yi0+c2l6ZSoyKTsgIC8qIHRvbyBjcm93ZGVkICovCisgIGxpc3QgPSAmdGItPmhhc2hbbG1vZChoLCB0Yi0+c2l6ZSldOworICBzID0gY3JlYXRlc3Ryb2JqKEwsIHN0ciwgbCwgTFVBX1RTSFJTVFIsIGgsIGxpc3QpOworICB0Yi0+bnVzZSsrOworICByZXR1cm4gczsKK30KKworCisvKgorKiogY2hlY2tzIHdoZXRoZXIgc2hvcnQgc3RyaW5nIGV4aXN0cyBhbmQgcmV1c2VzIGl0IG9yIGNyZWF0ZXMgYSBuZXcgb25lCisqLworc3RhdGljIFRTdHJpbmcgKmludGVybnNocnN0ciAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsKSB7CisgIEdDT2JqZWN0ICpvOworICBnbG9iYWxfU3RhdGUgKmcgPSBHKEwpOworICB1bnNpZ25lZCBpbnQgaCA9IGx1YVNfaGFzaChzdHIsIGwsIGctPnNlZWQpOworICBmb3IgKG8gPSBnLT5zdHJ0Lmhhc2hbbG1vZChoLCBnLT5zdHJ0LnNpemUpXTsKKyAgICAgICBvICE9IE5VTEw7CisgICAgICAgbyA9IGdjaChvKS0+bmV4dCkgeworICAgIFRTdHJpbmcgKnRzID0gcmF3Z2NvMnRzKG8pOworICAgIGlmIChoID09IHRzLT50c3YuaGFzaCAmJgorICAgICAgICBsID09IHRzLT50c3YubGVuICYmCisgICAgICAgIChtZW1jbXAoc3RyLCBnZXRzdHIodHMpLCBsICogc2l6ZW9mKGNoYXIpKSA9PSAwKSkgeworICAgICAgaWYgKGlzZGVhZChHKEwpLCBvKSkgIC8qIHN0cmluZyBpcyBkZWFkIChidXQgd2FzIG5vdCBjb2xsZWN0ZWQgeWV0KT8gKi8KKyAgICAgICAgY2hhbmdld2hpdGUobyk7ICAvKiByZXN1cnJlY3QgaXQgKi8KKyAgICAgIHJldHVybiB0czsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5ld3NocnN0cihMLCBzdHIsIGwsIGgpOyAgLyogbm90IGZvdW5kOyBjcmVhdGUgYSBuZXcgc3RyaW5nICovCit9CisKKworLyoKKyoqIG5ldyBzdHJpbmcgKHdpdGggZXhwbGljaXQgbGVuZ3RoKQorKi8KK1RTdHJpbmcgKmx1YVNfbmV3bHN0ciAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsKSB7CisgIGlmIChsIDw9IExVQUlfTUFYU0hPUlRMRU4pICAvKiBzaG9ydCBzdHJpbmc/ICovCisgICAgcmV0dXJuIGludGVybnNocnN0cihMLCBzdHIsIGwpOworICBlbHNlIHsKKyAgICBpZiAobCArIDEgPiAoTUFYX1NJWkVUIC0gc2l6ZW9mKFRTdHJpbmcpKS9zaXplb2YoY2hhcikpCisgICAgICBsdWFNX3Rvb2JpZyhMKTsKKyAgICByZXR1cm4gY3JlYXRlc3Ryb2JqKEwsIHN0ciwgbCwgTFVBX1RMTkdTVFIsIEcoTCktPnNlZWQsIE5VTEwpOworICB9Cit9CisKKworLyoKKyoqIG5ldyB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nCisqLworVFN0cmluZyAqbHVhU19uZXcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqc3RyKSB7CisgIHJldHVybiBsdWFTX25ld2xzdHIoTCwgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKKworVWRhdGEgKmx1YVNfbmV3dWRhdGEgKGx1YV9TdGF0ZSAqTCwgc2l6ZV90IHMsIFRhYmxlICplKSB7CisgIFVkYXRhICp1OworICBpZiAocyA+IE1BWF9TSVpFVCAtIHNpemVvZihVZGF0YSkpCisgICAgbHVhTV90b29iaWcoTCk7CisgIHUgPSAmbHVhQ19uZXdvYmooTCwgTFVBX1RVU0VSREFUQSwgc2l6ZW9mKFVkYXRhKSArIHMsIE5VTEwsIDApLT51OworICB1LT51di5sZW4gPSBzOworICB1LT51di5tZXRhdGFibGUgPSBOVUxMOworICB1LT51di5lbnYgPSBlOworICByZXR1cm4gdTsKK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sc3RyaW5nLmggYi9jb20zMi9sdWEvc3JjL2xzdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBlN2YxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sc3RyaW5nLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyoqICRJZDogbHN0cmluZy5oLHYgMS40OS4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBTdHJpbmcgdGFibGUgKGtlZXAgYWxsIHN0cmluZ3MgaGFuZGxlZCBieSBMdWEpCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsc3RyaW5nX2gKKyNkZWZpbmUgbHN0cmluZ19oCisKKyNpbmNsdWRlICJsZ2MuaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisKKworI2RlZmluZSBzaXplc3RyaW5nKHMpCShzaXplb2YodW5pb24gVFN0cmluZykrKChzKS0+bGVuKzEpKnNpemVvZihjaGFyKSkKKworI2RlZmluZSBzaXpldWRhdGEodSkJKHNpemVvZih1bmlvbiBVZGF0YSkrKHUpLT5sZW4pCisKKyNkZWZpbmUgbHVhU19uZXdsaXRlcmFsKEwsIHMpCShsdWFTX25ld2xzdHIoTCwgIiIgcywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihzKS9zaXplb2YoY2hhcikpLTEpKQorCisjZGVmaW5lIGx1YVNfZml4KHMpCWxfc2V0Yml0KChzKS0+dHN2Lm1hcmtlZCwgRklYRURCSVQpCisKKworLyoKKyoqIHRlc3Qgd2hldGhlciBhIHN0cmluZyBpcyBhIHJlc2VydmVkIHdvcmQKKyovCisjZGVmaW5lIGlzcmVzZXJ2ZWQocykJKChzKS0+dHN2LnR0ID09IExVQV9UU0hSU1RSICYmIChzKS0+dHN2LmV4dHJhID4gMCkKKworCisvKgorKiogZXF1YWxpdHkgZm9yIHNob3J0IHN0cmluZ3MsIHdoaWNoIGFyZSBhbHdheXMgaW50ZXJuYWxpemVkCisqLworI2RlZmluZSBlcXNocnN0cihhLGIpCWNoZWNrX2V4cCgoYSktPnRzdi50dCA9PSBMVUFfVFNIUlNUUiwgKGEpID09IChiKSkKKworCitMVUFJX0ZVTkMgdW5zaWduZWQgaW50IGx1YVNfaGFzaCAoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbCwgdW5zaWduZWQgaW50IHNlZWQpOworTFVBSV9GVU5DIGludCBsdWFTX2VxbG5nc3RyIChUU3RyaW5nICphLCBUU3RyaW5nICpiKTsKK0xVQUlfRlVOQyBpbnQgbHVhU19lcXN0ciAoVFN0cmluZyAqYSwgVFN0cmluZyAqYik7CitMVUFJX0ZVTkMgdm9pZCBsdWFTX3Jlc2l6ZSAobHVhX1N0YXRlICpMLCBpbnQgbmV3c2l6ZSk7CitMVUFJX0ZVTkMgVWRhdGEgKmx1YVNfbmV3dWRhdGEgKGx1YV9TdGF0ZSAqTCwgc2l6ZV90IHMsIFRhYmxlICplKTsKK0xVQUlfRlVOQyBUU3RyaW5nICpsdWFTX25ld2xzdHIgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbCk7CitMVUFJX0ZVTkMgVFN0cmluZyAqbHVhU19uZXcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqc3RyKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbHN0cmxpYi5jIGIvY29tMzIvbHVhL3NyYy9sc3RybGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2MWZkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbHN0cmxpYi5jCkBAIC0wLDAgKzEsMTAxOSBAQAorLyoKKyoqICRJZDogbHN0cmxpYi5jLHYgMS4xNzguMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogU3RhbmRhcmQgbGlicmFyeSBmb3Igc3RyaW5nIG9wZXJhdGlvbnMgYW5kIHBhdHRlcm4tbWF0Y2hpbmcKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbHN0cmxpYl9jCisjZGVmaW5lIExVQV9MSUIKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGF1eGxpYi5oIgorI2luY2x1ZGUgImx1YWxpYi5oIgorCisKKy8qCisqKiBtYXhpbXVtIG51bWJlciBvZiBjYXB0dXJlcyB0aGF0IGEgcGF0dGVybiBjYW4gZG8gZHVyaW5nCisqKiBwYXR0ZXJuLW1hdGNoaW5nLiBUaGlzIGxpbWl0IGlzIGFyYml0cmFyeS4KKyovCisjaWYgIWRlZmluZWQoTFVBX01BWENBUFRVUkVTKQorI2RlZmluZSBMVUFfTUFYQ0FQVFVSRVMJCTMyCisjZW5kaWYKKworCisvKiBtYWNybyB0byBgdW5zaWduJyBhIGNoYXJhY3RlciAqLworI2RlZmluZSB1Y2hhcihjKQkoKHVuc2lnbmVkIGNoYXIpKGMpKQorCisKKworc3RhdGljIGludCBzdHJfbGVuIChsdWFfU3RhdGUgKkwpIHsKKyAgc2l6ZV90IGw7CisgIGx1YUxfY2hlY2tsc3RyaW5nKEwsIDEsICZsKTsKKyAgbHVhX3B1c2hpbnRlZ2VyKEwsIChsdWFfSW50ZWdlcilsKTsKKyAgcmV0dXJuIDE7Cit9CisKKworLyogdHJhbnNsYXRlIGEgcmVsYXRpdmUgc3RyaW5nIHBvc2l0aW9uOiBuZWdhdGl2ZSBtZWFucyBiYWNrIGZyb20gZW5kICovCitzdGF0aWMgc2l6ZV90IHBvc3JlbGF0IChwdHJkaWZmX3QgcG9zLCBzaXplX3QgbGVuKSB7CisgIGlmIChwb3MgPj0gMCkgcmV0dXJuIChzaXplX3QpcG9zOworICBlbHNlIGlmICgwdSAtIChzaXplX3QpcG9zID4gbGVuKSByZXR1cm4gMDsKKyAgZWxzZSByZXR1cm4gbGVuIC0gKChzaXplX3QpLXBvcykgKyAxOworfQorCisKK3N0YXRpYyBpbnQgc3RyX3N1YiAobHVhX1N0YXRlICpMKSB7CisgIHNpemVfdCBsOworICBjb25zdCBjaGFyICpzID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMSwgJmwpOworICBzaXplX3Qgc3RhcnQgPSBwb3NyZWxhdChsdWFMX2NoZWNraW50ZWdlcihMLCAyKSwgbCk7CisgIHNpemVfdCBlbmQgPSBwb3NyZWxhdChsdWFMX29wdGludGVnZXIoTCwgMywgLTEpLCBsKTsKKyAgaWYgKHN0YXJ0IDwgMSkgc3RhcnQgPSAxOworICBpZiAoZW5kID4gbCkgZW5kID0gbDsKKyAgaWYgKHN0YXJ0IDw9IGVuZCkKKyAgICBsdWFfcHVzaGxzdHJpbmcoTCwgcyArIHN0YXJ0IC0gMSwgZW5kIC0gc3RhcnQgKyAxKTsKKyAgZWxzZSBsdWFfcHVzaGxpdGVyYWwoTCwgIiIpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHN0cl9yZXZlcnNlIChsdWFfU3RhdGUgKkwpIHsKKyAgc2l6ZV90IGwsIGk7CisgIGx1YUxfQnVmZmVyIGI7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFMX2NoZWNrbHN0cmluZyhMLCAxLCAmbCk7CisgIGNoYXIgKnAgPSBsdWFMX2J1ZmZpbml0c2l6ZShMLCAmYiwgbCk7CisgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspCisgICAgcFtpXSA9IHNbbCAtIGkgLSAxXTsKKyAgbHVhTF9wdXNocmVzdWx0c2l6ZSgmYiwgbCk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgc3RyX2xvd2VyIChsdWFfU3RhdGUgKkwpIHsKKyAgc2l6ZV90IGw7CisgIHNpemVfdCBpOworICBsdWFMX0J1ZmZlciBiOworICBjb25zdCBjaGFyICpzID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMSwgJmwpOworICBjaGFyICpwID0gbHVhTF9idWZmaW5pdHNpemUoTCwgJmIsIGwpOworICBmb3IgKGk9MDsgaTxsOyBpKyspCisgICAgcFtpXSA9IHRvbG93ZXIodWNoYXIoc1tpXSkpOworICBsdWFMX3B1c2hyZXN1bHRzaXplKCZiLCBsKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBzdHJfdXBwZXIgKGx1YV9TdGF0ZSAqTCkgeworICBzaXplX3QgbDsKKyAgc2l6ZV90IGk7CisgIGx1YUxfQnVmZmVyIGI7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFMX2NoZWNrbHN0cmluZyhMLCAxLCAmbCk7CisgIGNoYXIgKnAgPSBsdWFMX2J1ZmZpbml0c2l6ZShMLCAmYiwgbCk7CisgIGZvciAoaT0wOyBpPGw7IGkrKykKKyAgICBwW2ldID0gdG91cHBlcih1Y2hhcihzW2ldKSk7CisgIGx1YUxfcHVzaHJlc3VsdHNpemUoJmIsIGwpOworICByZXR1cm4gMTsKK30KKworCisvKiByZWFzb25hYmxlIGxpbWl0IHRvIGF2b2lkIGFyaXRobWV0aWMgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTUFYU0laRQkJKCh+KHNpemVfdCkwKSA+PiAxKQorCitzdGF0aWMgaW50IHN0cl9yZXAgKGx1YV9TdGF0ZSAqTCkgeworICBzaXplX3QgbCwgbHNlcDsKKyAgY29uc3QgY2hhciAqcyA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIDEsICZsKTsKKyAgaW50IG4gPSBsdWFMX2NoZWNraW50KEwsIDIpOworICBjb25zdCBjaGFyICpzZXAgPSBsdWFMX29wdGxzdHJpbmcoTCwgMywgIiIsICZsc2VwKTsKKyAgaWYgKG4gPD0gMCkgbHVhX3B1c2hsaXRlcmFsKEwsICIiKTsKKyAgZWxzZSBpZiAobCArIGxzZXAgPCBsIHx8IGwgKyBsc2VwID49IE1BWFNJWkUgLyBuKSAgLyogbWF5IG92ZXJmbG93PyAqLworICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICJyZXN1bHRpbmcgc3RyaW5nIHRvbyBsYXJnZSIpOworICBlbHNlIHsKKyAgICBzaXplX3QgdG90YWxsZW4gPSBuICogbCArIChuIC0gMSkgKiBsc2VwOworICAgIGx1YUxfQnVmZmVyIGI7CisgICAgY2hhciAqcCA9IGx1YUxfYnVmZmluaXRzaXplKEwsICZiLCB0b3RhbGxlbik7CisgICAgd2hpbGUgKG4tLSA+IDEpIHsgIC8qIGZpcnN0IG4tMSBjb3BpZXMgKGZvbGxvd2VkIGJ5IHNlcGFyYXRvcikgKi8KKyAgICAgIG1lbWNweShwLCBzLCBsICogc2l6ZW9mKGNoYXIpKTsgcCArPSBsOworICAgICAgaWYgKGxzZXAgPiAwKSB7ICAvKiBhdm9pZCBlbXB0eSAnbWVtY3B5JyAobWF5IGJlIGV4cGVuc2l2ZSkgKi8KKyAgICAgICAgbWVtY3B5KHAsIHNlcCwgbHNlcCAqIHNpemVvZihjaGFyKSk7IHAgKz0gbHNlcDsKKyAgICAgIH0KKyAgICB9CisgICAgbWVtY3B5KHAsIHMsIGwgKiBzaXplb2YoY2hhcikpOyAgLyogbGFzdCBjb3B5IChub3QgZm9sbG93ZWQgYnkgc2VwYXJhdG9yKSAqLworICAgIGx1YUxfcHVzaHJlc3VsdHNpemUoJmIsIHRvdGFsbGVuKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHN0cl9ieXRlIChsdWFfU3RhdGUgKkwpIHsKKyAgc2l6ZV90IGw7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFMX2NoZWNrbHN0cmluZyhMLCAxLCAmbCk7CisgIHNpemVfdCBwb3NpID0gcG9zcmVsYXQobHVhTF9vcHRpbnRlZ2VyKEwsIDIsIDEpLCBsKTsKKyAgc2l6ZV90IHBvc2UgPSBwb3NyZWxhdChsdWFMX29wdGludGVnZXIoTCwgMywgcG9zaSksIGwpOworICBpbnQgbiwgaTsKKyAgaWYgKHBvc2kgPCAxKSBwb3NpID0gMTsKKyAgaWYgKHBvc2UgPiBsKSBwb3NlID0gbDsKKyAgaWYgKHBvc2kgPiBwb3NlKSByZXR1cm4gMDsgIC8qIGVtcHR5IGludGVydmFsOyByZXR1cm4gbm8gdmFsdWVzICovCisgIG4gPSAoaW50KShwb3NlIC0gIHBvc2kgKyAxKTsKKyAgaWYgKHBvc2kgKyBuIDw9IHBvc2UpICAvKiAoc2l6ZV90IC0+IGludCkgb3ZlcmZsb3c/ICovCisgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgInN0cmluZyBzbGljZSB0b28gbG9uZyIpOworICBsdWFMX2NoZWNrc3RhY2soTCwgbiwgInN0cmluZyBzbGljZSB0b28gbG9uZyIpOworICBmb3IgKGk9MDsgaTxuOyBpKyspCisgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIHVjaGFyKHNbcG9zaStpLTFdKSk7CisgIHJldHVybiBuOworfQorCisKK3N0YXRpYyBpbnQgc3RyX2NoYXIgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgbiA9IGx1YV9nZXR0b3AoTCk7ICAvKiBudW1iZXIgb2YgYXJndW1lbnRzICovCisgIGludCBpOworICBsdWFMX0J1ZmZlciBiOworICBjaGFyICpwID0gbHVhTF9idWZmaW5pdHNpemUoTCwgJmIsIG4pOworICBmb3IgKGk9MTsgaTw9bjsgaSsrKSB7CisgICAgaW50IGMgPSBsdWFMX2NoZWNraW50KEwsIGkpOworICAgIGx1YUxfYXJnY2hlY2soTCwgdWNoYXIoYykgPT0gYywgaSwgInZhbHVlIG91dCBvZiByYW5nZSIpOworICAgIHBbaSAtIDFdID0gdWNoYXIoYyk7CisgIH0KKyAgbHVhTF9wdXNocmVzdWx0c2l6ZSgmYiwgbik7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgd3JpdGVyIChsdWFfU3RhdGUgKkwsIGNvbnN0IHZvaWQqIGIsIHNpemVfdCBzaXplLCB2b2lkKiBCKSB7CisgICh2b2lkKUw7CisgIGx1YUxfYWRkbHN0cmluZygobHVhTF9CdWZmZXIqKSBCLCAoY29uc3QgY2hhciAqKWIsIHNpemUpOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHN0cl9kdW1wIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9CdWZmZXIgYjsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMSwgTFVBX1RGVU5DVElPTik7CisgIGx1YV9zZXR0b3AoTCwgMSk7CisgIGx1YUxfYnVmZmluaXQoTCwmYik7CisgIGlmIChsdWFfZHVtcChMLCB3cml0ZXIsICZiKSAhPSAwKQorICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICJ1bmFibGUgdG8gZHVtcCBnaXZlbiBmdW5jdGlvbiIpOworICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICByZXR1cm4gMTsKK30KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBQQVRURVJOIE1BVENISU5HCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKKyNkZWZpbmUgQ0FQX1VORklOSVNIRUQJKC0xKQorI2RlZmluZSBDQVBfUE9TSVRJT04JKC0yKQorCisKK3R5cGVkZWYgc3RydWN0IE1hdGNoU3RhdGUgeworICBpbnQgbWF0Y2hkZXB0aDsgIC8qIGNvbnRyb2wgZm9yIHJlY3Vyc2l2ZSBkZXB0aCAodG8gYXZvaWQgQyBzdGFjayBvdmVyZmxvdykgKi8KKyAgY29uc3QgY2hhciAqc3JjX2luaXQ7ICAvKiBpbml0IG9mIHNvdXJjZSBzdHJpbmcgKi8KKyAgY29uc3QgY2hhciAqc3JjX2VuZDsgIC8qIGVuZCAoJ1wwJykgb2Ygc291cmNlIHN0cmluZyAqLworICBjb25zdCBjaGFyICpwX2VuZDsgIC8qIGVuZCAoJ1wwJykgb2YgcGF0dGVybiAqLworICBsdWFfU3RhdGUgKkw7CisgIGludCBsZXZlbDsgIC8qIHRvdGFsIG51bWJlciBvZiBjYXB0dXJlcyAoZmluaXNoZWQgb3IgdW5maW5pc2hlZCkgKi8KKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICppbml0OworICAgIHB0cmRpZmZfdCBsZW47CisgIH0gY2FwdHVyZVtMVUFfTUFYQ0FQVFVSRVNdOworfSBNYXRjaFN0YXRlOworCisKKy8qIHJlY3Vyc2l2ZSBmdW5jdGlvbiAqLworc3RhdGljIGNvbnN0IGNoYXIgKm1hdGNoIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCk7CisKKworLyogbWF4aW11bSByZWN1cnNpb24gZGVwdGggZm9yICdtYXRjaCcgKi8KKyNpZiAhZGVmaW5lZChNQVhDQ0FMTFMpCisjZGVmaW5lIE1BWENDQUxMUwkyMDAKKyNlbmRpZgorCisKKyNkZWZpbmUgTF9FU0MJCSclJworI2RlZmluZSBTUEVDSUFMUwkiXiQqKz8uKFslLSIKKworCitzdGF0aWMgaW50IGNoZWNrX2NhcHR1cmUgKE1hdGNoU3RhdGUgKm1zLCBpbnQgbCkgeworICBsIC09ICcxJzsKKyAgaWYgKGwgPCAwIHx8IGwgPj0gbXMtPmxldmVsIHx8IG1zLT5jYXB0dXJlW2xdLmxlbiA9PSBDQVBfVU5GSU5JU0hFRCkKKyAgICByZXR1cm4gbHVhTF9lcnJvcihtcy0+TCwgImludmFsaWQgY2FwdHVyZSBpbmRleCAlJSVkIiwgbCArIDEpOworICByZXR1cm4gbDsKK30KKworCitzdGF0aWMgaW50IGNhcHR1cmVfdG9fY2xvc2UgKE1hdGNoU3RhdGUgKm1zKSB7CisgIGludCBsZXZlbCA9IG1zLT5sZXZlbDsKKyAgZm9yIChsZXZlbC0tOyBsZXZlbD49MDsgbGV2ZWwtLSkKKyAgICBpZiAobXMtPmNhcHR1cmVbbGV2ZWxdLmxlbiA9PSBDQVBfVU5GSU5JU0hFRCkgcmV0dXJuIGxldmVsOworICByZXR1cm4gbHVhTF9lcnJvcihtcy0+TCwgImludmFsaWQgcGF0dGVybiBjYXB0dXJlIik7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmNsYXNzZW5kIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcCkgeworICBzd2l0Y2ggKCpwKyspIHsKKyAgICBjYXNlIExfRVNDOiB7CisgICAgICBpZiAocCA9PSBtcy0+cF9lbmQpCisgICAgICAgIGx1YUxfZXJyb3IobXMtPkwsICJtYWxmb3JtZWQgcGF0dGVybiAoZW5kcyB3aXRoICIgTFVBX1FMKCIlJSIpICIpIik7CisgICAgICByZXR1cm4gcCsxOworICAgIH0KKyAgICBjYXNlICdbJzogeworICAgICAgaWYgKCpwID09ICdeJykgcCsrOworICAgICAgZG8geyAgLyogbG9vayBmb3IgYSBgXScgKi8KKyAgICAgICAgaWYgKHAgPT0gbXMtPnBfZW5kKQorICAgICAgICAgIGx1YUxfZXJyb3IobXMtPkwsICJtYWxmb3JtZWQgcGF0dGVybiAobWlzc2luZyAiIExVQV9RTCgiXSIpICIpIik7CisgICAgICAgIGlmICgqKHArKykgPT0gTF9FU0MgJiYgcCA8IG1zLT5wX2VuZCkKKyAgICAgICAgICBwKys7ICAvKiBza2lwIGVzY2FwZXMgKGUuZy4gYCVdJykgKi8KKyAgICAgIH0gd2hpbGUgKCpwICE9ICddJyk7CisgICAgICByZXR1cm4gcCsxOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gcDsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgaW50IG1hdGNoX2NsYXNzIChpbnQgYywgaW50IGNsKSB7CisgIGludCByZXM7CisgIHN3aXRjaCAodG9sb3dlcihjbCkpIHsKKyAgICBjYXNlICdhJyA6IHJlcyA9IGlzYWxwaGEoYyk7IGJyZWFrOworICAgIGNhc2UgJ2MnIDogcmVzID0gaXNjbnRybChjKTsgYnJlYWs7CisgICAgY2FzZSAnZCcgOiByZXMgPSBpc2RpZ2l0KGMpOyBicmVhazsKKyAgICBjYXNlICdnJyA6IHJlcyA9IGlzZ3JhcGgoYyk7IGJyZWFrOworICAgIGNhc2UgJ2wnIDogcmVzID0gaXNsb3dlcihjKTsgYnJlYWs7CisgICAgY2FzZSAncCcgOiByZXMgPSBpc3B1bmN0KGMpOyBicmVhazsKKyAgICBjYXNlICdzJyA6IHJlcyA9IGlzc3BhY2UoYyk7IGJyZWFrOworICAgIGNhc2UgJ3UnIDogcmVzID0gaXN1cHBlcihjKTsgYnJlYWs7CisgICAgY2FzZSAndycgOiByZXMgPSBpc2FsbnVtKGMpOyBicmVhazsKKyAgICBjYXNlICd4JyA6IHJlcyA9IGlzeGRpZ2l0KGMpOyBicmVhazsKKyAgICBjYXNlICd6JyA6IHJlcyA9IChjID09IDApOyBicmVhazsgIC8qIGRlcHJlY2F0ZWQgb3B0aW9uICovCisgICAgZGVmYXVsdDogcmV0dXJuIChjbCA9PSBjKTsKKyAgfQorICByZXR1cm4gKGlzbG93ZXIoY2wpID8gcmVzIDogIXJlcyk7Cit9CisKKworc3RhdGljIGludCBtYXRjaGJyYWNrZXRjbGFzcyAoaW50IGMsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKmVjKSB7CisgIGludCBzaWcgPSAxOworICBpZiAoKihwKzEpID09ICdeJykgeworICAgIHNpZyA9IDA7CisgICAgcCsrOyAgLyogc2tpcCB0aGUgYF4nICovCisgIH0KKyAgd2hpbGUgKCsrcCA8IGVjKSB7CisgICAgaWYgKCpwID09IExfRVNDKSB7CisgICAgICBwKys7CisgICAgICBpZiAobWF0Y2hfY2xhc3MoYywgdWNoYXIoKnApKSkKKyAgICAgICAgcmV0dXJuIHNpZzsKKyAgICB9CisgICAgZWxzZSBpZiAoKCoocCsxKSA9PSAnLScpICYmIChwKzIgPCBlYykpIHsKKyAgICAgIHArPTI7CisgICAgICBpZiAodWNoYXIoKihwLTIpKSA8PSBjICYmIGMgPD0gdWNoYXIoKnApKQorICAgICAgICByZXR1cm4gc2lnOworICAgIH0KKyAgICBlbHNlIGlmICh1Y2hhcigqcCkgPT0gYykgcmV0dXJuIHNpZzsKKyAgfQorICByZXR1cm4gIXNpZzsKK30KKworCitzdGF0aWMgaW50IHNpbmdsZW1hdGNoIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVwKSB7CisgIGlmIChzID49IG1zLT5zcmNfZW5kKQorICAgIHJldHVybiAwOworICBlbHNlIHsKKyAgICBpbnQgYyA9IHVjaGFyKCpzKTsKKyAgICBzd2l0Y2ggKCpwKSB7CisgICAgICBjYXNlICcuJzogcmV0dXJuIDE7ICAvKiBtYXRjaGVzIGFueSBjaGFyICovCisgICAgICBjYXNlIExfRVNDOiByZXR1cm4gbWF0Y2hfY2xhc3MoYywgdWNoYXIoKihwKzEpKSk7CisgICAgICBjYXNlICdbJzogcmV0dXJuIG1hdGNoYnJhY2tldGNsYXNzKGMsIHAsIGVwLTEpOworICAgICAgZGVmYXVsdDogIHJldHVybiAodWNoYXIoKnApID09IGMpOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICptYXRjaGJhbGFuY2UgKE1hdGNoU3RhdGUgKm1zLCBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwKSB7CisgIGlmIChwID49IG1zLT5wX2VuZCAtIDEpCisgICAgbHVhTF9lcnJvcihtcy0+TCwgIm1hbGZvcm1lZCBwYXR0ZXJuICIKKyAgICAgICAgICAgICAgICAgICAgICAiKG1pc3NpbmcgYXJndW1lbnRzIHRvICIgTFVBX1FMKCIlJWIiKSAiKSIpOworICBpZiAoKnMgIT0gKnApIHJldHVybiBOVUxMOworICBlbHNlIHsKKyAgICBpbnQgYiA9ICpwOworICAgIGludCBlID0gKihwKzEpOworICAgIGludCBjb250ID0gMTsKKyAgICB3aGlsZSAoKytzIDwgbXMtPnNyY19lbmQpIHsKKyAgICAgIGlmICgqcyA9PSBlKSB7CisgICAgICAgIGlmICgtLWNvbnQgPT0gMCkgcmV0dXJuIHMrMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCpzID09IGIpIGNvbnQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7ICAvKiBzdHJpbmcgZW5kcyBvdXQgb2YgYmFsYW5jZSAqLworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICptYXhfZXhwYW5kIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKmVwKSB7CisgIHB0cmRpZmZfdCBpID0gMDsgIC8qIGNvdW50cyBtYXhpbXVtIGV4cGFuZCBmb3IgaXRlbSAqLworICB3aGlsZSAoc2luZ2xlbWF0Y2gobXMsIHMgKyBpLCBwLCBlcCkpCisgICAgaSsrOworICAvKiBrZWVwcyB0cnlpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbWF4aW11bSByZXBldGl0aW9ucyAqLworICB3aGlsZSAoaT49MCkgeworICAgIGNvbnN0IGNoYXIgKnJlcyA9IG1hdGNoKG1zLCAocytpKSwgZXArMSk7CisgICAgaWYgKHJlcykgcmV0dXJuIHJlczsKKyAgICBpLS07ICAvKiBlbHNlIGRpZG4ndCBtYXRjaDsgcmVkdWNlIDEgcmVwZXRpdGlvbiB0byB0cnkgYWdhaW4gKi8KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqbWluX2V4cGFuZCAoTWF0Y2hTdGF0ZSAqbXMsIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICplcCkgeworICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciAqcmVzID0gbWF0Y2gobXMsIHMsIGVwKzEpOworICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICAgIHJldHVybiByZXM7CisgICAgZWxzZSBpZiAoc2luZ2xlbWF0Y2gobXMsIHMsIHAsIGVwKSkKKyAgICAgIHMrKzsgIC8qIHRyeSB3aXRoIG9uZSBtb3JlIHJlcGV0aXRpb24gKi8KKyAgICBlbHNlIHJldHVybiBOVUxMOworICB9Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnN0YXJ0X2NhcHR1cmUgKE1hdGNoU3RhdGUgKm1zLCBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCwgaW50IHdoYXQpIHsKKyAgY29uc3QgY2hhciAqcmVzOworICBpbnQgbGV2ZWwgPSBtcy0+bGV2ZWw7CisgIGlmIChsZXZlbCA+PSBMVUFfTUFYQ0FQVFVSRVMpIGx1YUxfZXJyb3IobXMtPkwsICJ0b28gbWFueSBjYXB0dXJlcyIpOworICBtcy0+Y2FwdHVyZVtsZXZlbF0uaW5pdCA9IHM7CisgIG1zLT5jYXB0dXJlW2xldmVsXS5sZW4gPSB3aGF0OworICBtcy0+bGV2ZWwgPSBsZXZlbCsxOworICBpZiAoKHJlcz1tYXRjaChtcywgcywgcCkpID09IE5VTEwpICAvKiBtYXRjaCBmYWlsZWQ/ICovCisgICAgbXMtPmxldmVsLS07ICAvKiB1bmRvIGNhcHR1cmUgKi8KKyAgcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqZW5kX2NhcHR1cmUgKE1hdGNoU3RhdGUgKm1zLCBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnApIHsKKyAgaW50IGwgPSBjYXB0dXJlX3RvX2Nsb3NlKG1zKTsKKyAgY29uc3QgY2hhciAqcmVzOworICBtcy0+Y2FwdHVyZVtsXS5sZW4gPSBzIC0gbXMtPmNhcHR1cmVbbF0uaW5pdDsgIC8qIGNsb3NlIGNhcHR1cmUgKi8KKyAgaWYgKChyZXMgPSBtYXRjaChtcywgcywgcCkpID09IE5VTEwpICAvKiBtYXRjaCBmYWlsZWQ/ICovCisgICAgbXMtPmNhcHR1cmVbbF0ubGVuID0gQ0FQX1VORklOSVNIRUQ7ICAvKiB1bmRvIGNhcHR1cmUgKi8KKyAgcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqbWF0Y2hfY2FwdHVyZSAoTWF0Y2hTdGF0ZSAqbXMsIGNvbnN0IGNoYXIgKnMsIGludCBsKSB7CisgIHNpemVfdCBsZW47CisgIGwgPSBjaGVja19jYXB0dXJlKG1zLCBsKTsKKyAgbGVuID0gbXMtPmNhcHR1cmVbbF0ubGVuOworICBpZiAoKHNpemVfdCkobXMtPnNyY19lbmQtcykgPj0gbGVuICYmCisgICAgICBtZW1jbXAobXMtPmNhcHR1cmVbbF0uaW5pdCwgcywgbGVuKSA9PSAwKQorICAgIHJldHVybiBzK2xlbjsKKyAgZWxzZSByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqbWF0Y2ggKE1hdGNoU3RhdGUgKm1zLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpwKSB7CisgIGlmIChtcy0+bWF0Y2hkZXB0aC0tID09IDApCisgICAgbHVhTF9lcnJvcihtcy0+TCwgInBhdHRlcm4gdG9vIGNvbXBsZXgiKTsKKyAgaW5pdDogLyogdXNpbmcgZ290bydzIHRvIG9wdGltaXplIHRhaWwgcmVjdXJzaW9uICovCisgIGlmIChwICE9IG1zLT5wX2VuZCkgeyAgLyogZW5kIG9mIHBhdHRlcm4/ICovCisgICAgc3dpdGNoICgqcCkgeworICAgICAgY2FzZSAnKCc6IHsgIC8qIHN0YXJ0IGNhcHR1cmUgKi8KKyAgICAgICAgaWYgKCoocCArIDEpID09ICcpJykgIC8qIHBvc2l0aW9uIGNhcHR1cmU/ICovCisgICAgICAgICAgcyA9IHN0YXJ0X2NhcHR1cmUobXMsIHMsIHAgKyAyLCBDQVBfUE9TSVRJT04pOworICAgICAgICBlbHNlCisgICAgICAgICAgcyA9IHN0YXJ0X2NhcHR1cmUobXMsIHMsIHAgKyAxLCBDQVBfVU5GSU5JU0hFRCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnKSc6IHsgIC8qIGVuZCBjYXB0dXJlICovCisgICAgICAgIHMgPSBlbmRfY2FwdHVyZShtcywgcywgcCArIDEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJyQnOiB7CisgICAgICAgIGlmICgocCArIDEpICE9IG1zLT5wX2VuZCkgIC8qIGlzIHRoZSBgJCcgdGhlIGxhc3QgY2hhciBpbiBwYXR0ZXJuPyAqLworICAgICAgICAgIGdvdG8gZGZsdDsgIC8qIG5vOyBnbyB0byBkZWZhdWx0ICovCisgICAgICAgIHMgPSAocyA9PSBtcy0+c3JjX2VuZCkgPyBzIDogTlVMTDsgIC8qIGNoZWNrIGVuZCBvZiBzdHJpbmcgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIExfRVNDOiB7ICAvKiBlc2NhcGVkIHNlcXVlbmNlcyBub3QgaW4gdGhlIGZvcm1hdCBjbGFzc1sqKz8tXT8gKi8KKyAgICAgICAgc3dpdGNoICgqKHAgKyAxKSkgeworICAgICAgICAgIGNhc2UgJ2InOiB7ICAvKiBiYWxhbmNlZCBzdHJpbmc/ICovCisgICAgICAgICAgICBzID0gbWF0Y2hiYWxhbmNlKG1zLCBzLCBwICsgMik7CisgICAgICAgICAgICBpZiAocyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIHAgKz0gNDsgZ290byBpbml0OyAgLyogcmV0dXJuIG1hdGNoKG1zLCBzLCBwICsgNCk7ICovCisgICAgICAgICAgICB9ICAvKiBlbHNlIGZhaWwgKHMgPT0gTlVMTCkgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlICdmJzogeyAgLyogZnJvbnRpZXI/ICovCisgICAgICAgICAgICBjb25zdCBjaGFyICplcDsgY2hhciBwcmV2aW91czsKKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgIGlmICgqcCAhPSAnWycpCisgICAgICAgICAgICAgIGx1YUxfZXJyb3IobXMtPkwsICJtaXNzaW5nICIgTFVBX1FMKCJbIikgIiBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVUFfUUwoIiUlZiIpICIgaW4gcGF0dGVybiIpOworICAgICAgICAgICAgZXAgPSBjbGFzc2VuZChtcywgcCk7ICAvKiBwb2ludHMgdG8gd2hhdCBpcyBuZXh0ICovCisgICAgICAgICAgICBwcmV2aW91cyA9IChzID09IG1zLT5zcmNfaW5pdCkgPyAnXDAnIDogKihzIC0gMSk7CisgICAgICAgICAgICBpZiAoIW1hdGNoYnJhY2tldGNsYXNzKHVjaGFyKHByZXZpb3VzKSwgcCwgZXAgLSAxKSAmJgorICAgICAgICAgICAgICAgbWF0Y2hicmFja2V0Y2xhc3ModWNoYXIoKnMpLCBwLCBlcCAtIDEpKSB7CisgICAgICAgICAgICAgIHAgPSBlcDsgZ290byBpbml0OyAgLyogcmV0dXJuIG1hdGNoKG1zLCBzLCBlcCk7ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzID0gTlVMTDsgIC8qIG1hdGNoIGZhaWxlZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOgorICAgICAgICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgorICAgICAgICAgIGNhc2UgJzgnOiBjYXNlICc5JzogeyAgLyogY2FwdHVyZSByZXN1bHRzICglMC0lOSk/ICovCisgICAgICAgICAgICBzID0gbWF0Y2hfY2FwdHVyZShtcywgcywgdWNoYXIoKihwICsgMSkpKTsKKyAgICAgICAgICAgIGlmIChzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgcCArPSAyOyBnb3RvIGluaXQ7ICAvKiByZXR1cm4gbWF0Y2gobXMsIHMsIHAgKyAyKSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6IGdvdG8gZGZsdDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IGRmbHQ6IHsgIC8qIHBhdHRlcm4gY2xhc3MgcGx1cyBvcHRpb25hbCBzdWZmaXggKi8KKyAgICAgICAgY29uc3QgY2hhciAqZXAgPSBjbGFzc2VuZChtcywgcCk7ICAvKiBwb2ludHMgdG8gb3B0aW9uYWwgc3VmZml4ICovCisgICAgICAgIC8qIGRvZXMgbm90IG1hdGNoIGF0IGxlYXN0IG9uY2U/ICovCisgICAgICAgIGlmICghc2luZ2xlbWF0Y2gobXMsIHMsIHAsIGVwKSkgeworICAgICAgICAgIGlmICgqZXAgPT0gJyonIHx8ICplcCA9PSAnPycgfHwgKmVwID09ICctJykgeyAgLyogYWNjZXB0IGVtcHR5PyAqLworICAgICAgICAgICAgcCA9IGVwICsgMTsgZ290byBpbml0OyAgLyogcmV0dXJuIG1hdGNoKG1zLCBzLCBlcCArIDEpOyAqLworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlICAvKiAnKycgb3Igbm8gc3VmZml4ICovCisgICAgICAgICAgICBzID0gTlVMTDsgIC8qIGZhaWwgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgIC8qIG1hdGNoZWQgb25jZSAqLworICAgICAgICAgIHN3aXRjaCAoKmVwKSB7ICAvKiBoYW5kbGUgb3B0aW9uYWwgc3VmZml4ICovCisgICAgICAgICAgICBjYXNlICc/JzogeyAgLyogb3B0aW9uYWwgKi8KKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzOworICAgICAgICAgICAgICBpZiAoKHJlcyA9IG1hdGNoKG1zLCBzICsgMSwgZXAgKyAxKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBzID0gcmVzOworICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwID0gZXAgKyAxOyBnb3RvIGluaXQ7ICAvKiBlbHNlIHJldHVybiBtYXRjaChtcywgcywgZXAgKyAxKTsgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgJysnOiAgLyogMSBvciBtb3JlIHJlcGV0aXRpb25zICovCisgICAgICAgICAgICAgIHMrKzsgIC8qIDEgbWF0Y2ggYWxyZWFkeSBkb25lICovCisgICAgICAgICAgICAgIC8qIGdvIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgJyonOiAgLyogMCBvciBtb3JlIHJlcGV0aXRpb25zICovCisgICAgICAgICAgICAgIHMgPSBtYXhfZXhwYW5kKG1zLCBzLCBwLCBlcCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnLSc6ICAvKiAwIG9yIG1vcmUgcmVwZXRpdGlvbnMgKG1pbmltdW0pICovCisgICAgICAgICAgICAgIHMgPSBtaW5fZXhwYW5kKG1zLCBzLCBwLCBlcCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogIC8qIG5vIHN1ZmZpeCAqLworICAgICAgICAgICAgICBzKys7IHAgPSBlcDsgZ290byBpbml0OyAgLyogcmV0dXJuIG1hdGNoKG1zLCBzICsgMSwgZXApOyAqLworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgbXMtPm1hdGNoZGVwdGgrKzsKKyAgcmV0dXJuIHM7Cit9CisKKworCitzdGF0aWMgY29uc3QgY2hhciAqbG1lbWZpbmQgKGNvbnN0IGNoYXIgKnMxLCBzaXplX3QgbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqczIsIHNpemVfdCBsMikgeworICBpZiAobDIgPT0gMCkgcmV0dXJuIHMxOyAgLyogZW1wdHkgc3RyaW5ncyBhcmUgZXZlcnl3aGVyZSAqLworICBlbHNlIGlmIChsMiA+IGwxKSByZXR1cm4gTlVMTDsgIC8qIGF2b2lkcyBhIG5lZ2F0aXZlIGBsMScgKi8KKyAgZWxzZSB7CisgICAgY29uc3QgY2hhciAqaW5pdDsgIC8qIHRvIHNlYXJjaCBmb3IgYSBgKnMyJyBpbnNpZGUgYHMxJyAqLworICAgIGwyLS07ICAvKiAxc3QgY2hhciB3aWxsIGJlIGNoZWNrZWQgYnkgYG1lbWNocicgKi8KKyAgICBsMSA9IGwxLWwyOyAgLyogYHMyJyBjYW5ub3QgYmUgZm91bmQgYWZ0ZXIgdGhhdCAqLworICAgIHdoaWxlIChsMSA+IDAgJiYgKGluaXQgPSAoY29uc3QgY2hhciAqKW1lbWNocihzMSwgKnMyLCBsMSkpICE9IE5VTEwpIHsKKyAgICAgIGluaXQrKzsgICAvKiAxc3QgY2hhciBpcyBhbHJlYWR5IGNoZWNrZWQgKi8KKyAgICAgIGlmIChtZW1jbXAoaW5pdCwgczIrMSwgbDIpID09IDApCisgICAgICAgIHJldHVybiBpbml0LTE7CisgICAgICBlbHNlIHsgIC8qIGNvcnJlY3QgYGwxJyBhbmQgYHMxJyB0byB0cnkgYWdhaW4gKi8KKyAgICAgICAgbDEgLT0gaW5pdC1zMTsKKyAgICAgICAgczEgPSBpbml0OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsgIC8qIG5vdCBmb3VuZCAqLworICB9Cit9CisKKworc3RhdGljIHZvaWQgcHVzaF9vbmVjYXB0dXJlIChNYXRjaFN0YXRlICptcywgaW50IGksIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZSkgeworICBpZiAoaSA+PSBtcy0+bGV2ZWwpIHsKKyAgICBpZiAoaSA9PSAwKSAgLyogbXMtPmxldmVsID09IDAsIHRvbyAqLworICAgICAgbHVhX3B1c2hsc3RyaW5nKG1zLT5MLCBzLCBlIC0gcyk7ICAvKiBhZGQgd2hvbGUgbWF0Y2ggKi8KKyAgICBlbHNlCisgICAgICBsdWFMX2Vycm9yKG1zLT5MLCAiaW52YWxpZCBjYXB0dXJlIGluZGV4Iik7CisgIH0KKyAgZWxzZSB7CisgICAgcHRyZGlmZl90IGwgPSBtcy0+Y2FwdHVyZVtpXS5sZW47CisgICAgaWYgKGwgPT0gQ0FQX1VORklOSVNIRUQpIGx1YUxfZXJyb3IobXMtPkwsICJ1bmZpbmlzaGVkIGNhcHR1cmUiKTsKKyAgICBpZiAobCA9PSBDQVBfUE9TSVRJT04pCisgICAgICBsdWFfcHVzaGludGVnZXIobXMtPkwsIG1zLT5jYXB0dXJlW2ldLmluaXQgLSBtcy0+c3JjX2luaXQgKyAxKTsKKyAgICBlbHNlCisgICAgICBsdWFfcHVzaGxzdHJpbmcobXMtPkwsIG1zLT5jYXB0dXJlW2ldLmluaXQsIGwpOworICB9Cit9CisKKworc3RhdGljIGludCBwdXNoX2NhcHR1cmVzIChNYXRjaFN0YXRlICptcywgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZSkgeworICBpbnQgaTsKKyAgaW50IG5sZXZlbHMgPSAobXMtPmxldmVsID09IDAgJiYgcykgPyAxIDogbXMtPmxldmVsOworICBsdWFMX2NoZWNrc3RhY2sobXMtPkwsIG5sZXZlbHMsICJ0b28gbWFueSBjYXB0dXJlcyIpOworICBmb3IgKGkgPSAwOyBpIDwgbmxldmVsczsgaSsrKQorICAgIHB1c2hfb25lY2FwdHVyZShtcywgaSwgcywgZSk7CisgIHJldHVybiBubGV2ZWxzOyAgLyogbnVtYmVyIG9mIHN0cmluZ3MgcHVzaGVkICovCit9CisKKworLyogY2hlY2sgd2hldGhlciBwYXR0ZXJuIGhhcyBubyBzcGVjaWFsIGNoYXJhY3RlcnMgKi8KK3N0YXRpYyBpbnQgbm9zcGVjaWFscyAoY29uc3QgY2hhciAqcCwgc2l6ZV90IGwpIHsKKyAgc2l6ZV90IHVwdG8gPSAwOworICBkbyB7CisgICAgaWYgKHN0cnBicmsocCArIHVwdG8sIFNQRUNJQUxTKSkKKyAgICAgIHJldHVybiAwOyAgLyogcGF0dGVybiBoYXMgYSBzcGVjaWFsIGNoYXJhY3RlciAqLworICAgIHVwdG8gKz0gc3RybGVuKHAgKyB1cHRvKSArIDE7ICAvKiBtYXkgaGF2ZSBtb3JlIGFmdGVyIFwwICovCisgIH0gd2hpbGUgKHVwdG8gPD0gbCk7CisgIHJldHVybiAxOyAgLyogbm8gc3BlY2lhbCBjaGFycyBmb3VuZCAqLworfQorCisKK3N0YXRpYyBpbnQgc3RyX2ZpbmRfYXV4IChsdWFfU3RhdGUgKkwsIGludCBmaW5kKSB7CisgIHNpemVfdCBscywgbHA7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFMX2NoZWNrbHN0cmluZyhMLCAxLCAmbHMpOworICBjb25zdCBjaGFyICpwID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMiwgJmxwKTsKKyAgc2l6ZV90IGluaXQgPSBwb3NyZWxhdChsdWFMX29wdGludGVnZXIoTCwgMywgMSksIGxzKTsKKyAgaWYgKGluaXQgPCAxKSBpbml0ID0gMTsKKyAgZWxzZSBpZiAoaW5pdCA+IGxzICsgMSkgeyAgLyogc3RhcnQgYWZ0ZXIgc3RyaW5nJ3MgZW5kPyAqLworICAgIGx1YV9wdXNobmlsKEwpOyAgLyogY2Fubm90IGZpbmQgYW55dGhpbmcgKi8KKyAgICByZXR1cm4gMTsKKyAgfQorICAvKiBleHBsaWNpdCByZXF1ZXN0IG9yIG5vIHNwZWNpYWwgY2hhcmFjdGVycz8gKi8KKyAgaWYgKGZpbmQgJiYgKGx1YV90b2Jvb2xlYW4oTCwgNCkgfHwgbm9zcGVjaWFscyhwLCBscCkpKSB7CisgICAgLyogZG8gYSBwbGFpbiBzZWFyY2ggKi8KKyAgICBjb25zdCBjaGFyICpzMiA9IGxtZW1maW5kKHMgKyBpbml0IC0gMSwgbHMgLSBpbml0ICsgMSwgcCwgbHApOworICAgIGlmIChzMikgeworICAgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIHMyIC0gcyArIDEpOworICAgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIHMyIC0gcyArIGxwKTsKKyAgICAgIHJldHVybiAyOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBNYXRjaFN0YXRlIG1zOworICAgIGNvbnN0IGNoYXIgKnMxID0gcyArIGluaXQgLSAxOworICAgIGludCBhbmNob3IgPSAoKnAgPT0gJ14nKTsKKyAgICBpZiAoYW5jaG9yKSB7CisgICAgICBwKys7IGxwLS07ICAvKiBza2lwIGFuY2hvciBjaGFyYWN0ZXIgKi8KKyAgICB9CisgICAgbXMuTCA9IEw7CisgICAgbXMubWF0Y2hkZXB0aCA9IE1BWENDQUxMUzsKKyAgICBtcy5zcmNfaW5pdCA9IHM7CisgICAgbXMuc3JjX2VuZCA9IHMgKyBsczsKKyAgICBtcy5wX2VuZCA9IHAgKyBscDsKKyAgICBkbyB7CisgICAgICBjb25zdCBjaGFyICpyZXM7CisgICAgICBtcy5sZXZlbCA9IDA7CisgICAgICBsdWFfYXNzZXJ0KG1zLm1hdGNoZGVwdGggPT0gTUFYQ0NBTExTKTsKKyAgICAgIGlmICgocmVzPW1hdGNoKCZtcywgczEsIHApKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChmaW5kKSB7CisgICAgICAgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIHMxIC0gcyArIDEpOyAgLyogc3RhcnQgKi8KKyAgICAgICAgICBsdWFfcHVzaGludGVnZXIoTCwgcmVzIC0gcyk7ICAgLyogZW5kICovCisgICAgICAgICAgcmV0dXJuIHB1c2hfY2FwdHVyZXMoJm1zLCBOVUxMLCAwKSArIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBwdXNoX2NhcHR1cmVzKCZtcywgczEsIHJlcyk7CisgICAgICB9CisgICAgfSB3aGlsZSAoczErKyA8IG1zLnNyY19lbmQgJiYgIWFuY2hvcik7CisgIH0KKyAgbHVhX3B1c2huaWwoTCk7ICAvKiBub3QgZm91bmQgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBzdHJfZmluZCAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBzdHJfZmluZF9hdXgoTCwgMSk7Cit9CisKKworc3RhdGljIGludCBzdHJfbWF0Y2ggKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gc3RyX2ZpbmRfYXV4KEwsIDApOworfQorCisKK3N0YXRpYyBpbnQgZ21hdGNoX2F1eCAobHVhX1N0YXRlICpMKSB7CisgIE1hdGNoU3RhdGUgbXM7CisgIHNpemVfdCBscywgbHA7CisgIGNvbnN0IGNoYXIgKnMgPSBsdWFfdG9sc3RyaW5nKEwsIGx1YV91cHZhbHVlaW5kZXgoMSksICZscyk7CisgIGNvbnN0IGNoYXIgKnAgPSBsdWFfdG9sc3RyaW5nKEwsIGx1YV91cHZhbHVlaW5kZXgoMiksICZscCk7CisgIGNvbnN0IGNoYXIgKnNyYzsKKyAgbXMuTCA9IEw7CisgIG1zLm1hdGNoZGVwdGggPSBNQVhDQ0FMTFM7CisgIG1zLnNyY19pbml0ID0gczsKKyAgbXMuc3JjX2VuZCA9IHMrbHM7CisgIG1zLnBfZW5kID0gcCArIGxwOworICBmb3IgKHNyYyA9IHMgKyAoc2l6ZV90KWx1YV90b2ludGVnZXIoTCwgbHVhX3VwdmFsdWVpbmRleCgzKSk7CisgICAgICAgc3JjIDw9IG1zLnNyY19lbmQ7CisgICAgICAgc3JjKyspIHsKKyAgICBjb25zdCBjaGFyICplOworICAgIG1zLmxldmVsID0gMDsKKyAgICBsdWFfYXNzZXJ0KG1zLm1hdGNoZGVwdGggPT0gTUFYQ0NBTExTKTsKKyAgICBpZiAoKGUgPSBtYXRjaCgmbXMsIHNyYywgcCkpICE9IE5VTEwpIHsKKyAgICAgIGx1YV9JbnRlZ2VyIG5ld3N0YXJ0ID0gZS1zOworICAgICAgaWYgKGUgPT0gc3JjKSBuZXdzdGFydCsrOyAgLyogZW1wdHkgbWF0Y2g/IGdvIGF0IGxlYXN0IG9uZSBwb3NpdGlvbiAqLworICAgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIG5ld3N0YXJ0KTsKKyAgICAgIGx1YV9yZXBsYWNlKEwsIGx1YV91cHZhbHVlaW5kZXgoMykpOworICAgICAgcmV0dXJuIHB1c2hfY2FwdHVyZXMoJm1zLCBzcmMsIGUpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsgIC8qIG5vdCBmb3VuZCAqLworfQorCisKK3N0YXRpYyBpbnQgZ21hdGNoIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgbHVhTF9jaGVja3N0cmluZyhMLCAyKTsKKyAgbHVhX3NldHRvcChMLCAyKTsKKyAgbHVhX3B1c2hpbnRlZ2VyKEwsIDApOworICBsdWFfcHVzaGNjbG9zdXJlKEwsIGdtYXRjaF9hdXgsIDMpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgdm9pZCBhZGRfcyAoTWF0Y2hTdGF0ZSAqbXMsIGx1YUxfQnVmZmVyICpiLCBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZSkgeworICBzaXplX3QgbCwgaTsKKyAgY29uc3QgY2hhciAqbmV3cyA9IGx1YV90b2xzdHJpbmcobXMtPkwsIDMsICZsKTsKKyAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworICAgIGlmIChuZXdzW2ldICE9IExfRVNDKQorICAgICAgbHVhTF9hZGRjaGFyKGIsIG5ld3NbaV0pOworICAgIGVsc2UgeworICAgICAgaSsrOyAgLyogc2tpcCBFU0MgKi8KKyAgICAgIGlmICghaXNkaWdpdCh1Y2hhcihuZXdzW2ldKSkpIHsKKyAgICAgICAgaWYgKG5ld3NbaV0gIT0gTF9FU0MpCisgICAgICAgICAgbHVhTF9lcnJvcihtcy0+TCwgImludmFsaWQgdXNlIG9mICIgTFVBX1FMKCIlYyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIHJlcGxhY2VtZW50IHN0cmluZyIsIExfRVNDKTsKKyAgICAgICAgbHVhTF9hZGRjaGFyKGIsIG5ld3NbaV0pOworICAgICAgfQorICAgICAgZWxzZSBpZiAobmV3c1tpXSA9PSAnMCcpCisgICAgICAgICAgbHVhTF9hZGRsc3RyaW5nKGIsIHMsIGUgLSBzKTsKKyAgICAgIGVsc2UgeworICAgICAgICBwdXNoX29uZWNhcHR1cmUobXMsIG5ld3NbaV0gLSAnMScsIHMsIGUpOworICAgICAgICBsdWFMX2FkZHZhbHVlKGIpOyAgLyogYWRkIGNhcHR1cmUgdG8gYWNjdW11bGF0ZWQgcmVzdWx0ICovCisgICAgICB9CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgYWRkX3ZhbHVlIChNYXRjaFN0YXRlICptcywgbHVhTF9CdWZmZXIgKmIsIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplLCBpbnQgdHIpIHsKKyAgbHVhX1N0YXRlICpMID0gbXMtPkw7CisgIHN3aXRjaCAodHIpIHsKKyAgICBjYXNlIExVQV9URlVOQ1RJT046IHsKKyAgICAgIGludCBuOworICAgICAgbHVhX3B1c2h2YWx1ZShMLCAzKTsKKyAgICAgIG4gPSBwdXNoX2NhcHR1cmVzKG1zLCBzLCBlKTsKKyAgICAgIGx1YV9jYWxsKEwsIG4sIDEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTFVBX1RUQUJMRTogeworICAgICAgcHVzaF9vbmVjYXB0dXJlKG1zLCAwLCBzLCBlKTsKKyAgICAgIGx1YV9nZXR0YWJsZShMLCAzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7ICAvKiBMVUFfVE5VTUJFUiBvciBMVUFfVFNUUklORyAqLworICAgICAgYWRkX3MobXMsIGIsIHMsIGUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBpZiAoIWx1YV90b2Jvb2xlYW4oTCwgLTEpKSB7ICAvKiBuaWwgb3IgZmFsc2U/ICovCisgICAgbHVhX3BvcChMLCAxKTsKKyAgICBsdWFfcHVzaGxzdHJpbmcoTCwgcywgZSAtIHMpOyAgLyoga2VlcCBvcmlnaW5hbCB0ZXh0ICovCisgIH0KKyAgZWxzZSBpZiAoIWx1YV9pc3N0cmluZyhMLCAtMSkpCisgICAgbHVhTF9lcnJvcihMLCAiaW52YWxpZCByZXBsYWNlbWVudCB2YWx1ZSAoYSAlcykiLCBsdWFMX3R5cGVuYW1lKEwsIC0xKSk7CisgIGx1YUxfYWRkdmFsdWUoYik7ICAvKiBhZGQgcmVzdWx0IHRvIGFjY3VtdWxhdG9yICovCit9CisKKworc3RhdGljIGludCBzdHJfZ3N1YiAobHVhX1N0YXRlICpMKSB7CisgIHNpemVfdCBzcmNsLCBscDsKKyAgY29uc3QgY2hhciAqc3JjID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMSwgJnNyY2wpOworICBjb25zdCBjaGFyICpwID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMiwgJmxwKTsKKyAgaW50IHRyID0gbHVhX3R5cGUoTCwgMyk7CisgIHNpemVfdCBtYXhfcyA9IGx1YUxfb3B0aW50ZWdlcihMLCA0LCBzcmNsKzEpOworICBpbnQgYW5jaG9yID0gKCpwID09ICdeJyk7CisgIHNpemVfdCBuID0gMDsKKyAgTWF0Y2hTdGF0ZSBtczsKKyAgbHVhTF9CdWZmZXIgYjsKKyAgbHVhTF9hcmdjaGVjayhMLCB0ciA9PSBMVUFfVE5VTUJFUiB8fCB0ciA9PSBMVUFfVFNUUklORyB8fAorICAgICAgICAgICAgICAgICAgIHRyID09IExVQV9URlVOQ1RJT04gfHwgdHIgPT0gTFVBX1RUQUJMRSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nL2Z1bmN0aW9uL3RhYmxlIGV4cGVjdGVkIik7CisgIGx1YUxfYnVmZmluaXQoTCwgJmIpOworICBpZiAoYW5jaG9yKSB7CisgICAgcCsrOyBscC0tOyAgLyogc2tpcCBhbmNob3IgY2hhcmFjdGVyICovCisgIH0KKyAgbXMuTCA9IEw7CisgIG1zLm1hdGNoZGVwdGggPSBNQVhDQ0FMTFM7CisgIG1zLnNyY19pbml0ID0gc3JjOworICBtcy5zcmNfZW5kID0gc3JjK3NyY2w7CisgIG1zLnBfZW5kID0gcCArIGxwOworICB3aGlsZSAobiA8IG1heF9zKSB7CisgICAgY29uc3QgY2hhciAqZTsKKyAgICBtcy5sZXZlbCA9IDA7CisgICAgbHVhX2Fzc2VydChtcy5tYXRjaGRlcHRoID09IE1BWENDQUxMUyk7CisgICAgZSA9IG1hdGNoKCZtcywgc3JjLCBwKTsKKyAgICBpZiAoZSkgeworICAgICAgbisrOworICAgICAgYWRkX3ZhbHVlKCZtcywgJmIsIHNyYywgZSwgdHIpOworICAgIH0KKyAgICBpZiAoZSAmJiBlPnNyYykgLyogbm9uIGVtcHR5IG1hdGNoPyAqLworICAgICAgc3JjID0gZTsgIC8qIHNraXAgaXQgKi8KKyAgICBlbHNlIGlmIChzcmMgPCBtcy5zcmNfZW5kKQorICAgICAgbHVhTF9hZGRjaGFyKCZiLCAqc3JjKyspOworICAgIGVsc2UgYnJlYWs7CisgICAgaWYgKGFuY2hvcikgYnJlYWs7CisgIH0KKyAgbHVhTF9hZGRsc3RyaW5nKCZiLCBzcmMsIG1zLnNyY19lbmQtc3JjKTsKKyAgbHVhTF9wdXNocmVzdWx0KCZiKTsKKyAgbHVhX3B1c2hpbnRlZ2VyKEwsIG4pOyAgLyogbnVtYmVyIG9mIHN1YnN0aXR1dGlvbnMgKi8KKyAgcmV0dXJuIDI7Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBTVFJJTkcgRk9STUFUCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorKiogTFVBX0lOVEZSTUxFTiBpcyB0aGUgbGVuZ3RoIG1vZGlmaWVyIGZvciBpbnRlZ2VyIGNvbnZlcnNpb25zIGluCisqKiAnc3RyaW5nLmZvcm1hdCc7IExVQV9JTlRGUk1fVCBpcyB0aGUgaW50ZWdlciB0eXBlIGNvcnJlc3BvbmRpbmcgdG8KKyoqIHRoZSBwcmV2aW91cyBsZW5ndGgKKyovCisjaWYgIWRlZmluZWQoTFVBX0lOVEZSTUxFTikJLyogeyAqLworI2lmIGRlZmluZWQoTFVBX1VTRV9MT05HTE9ORykKKworI2RlZmluZSBMVUFfSU5URlJNTEVOCQkibGwiCisjZGVmaW5lIExVQV9JTlRGUk1fVAkJbG9uZyBsb25nCisKKyNlbHNlCisKKyNkZWZpbmUgTFVBX0lOVEZSTUxFTgkJImwiCisjZGVmaW5lIExVQV9JTlRGUk1fVAkJbG9uZworCisjZW5kaWYKKyNlbmRpZgkJCQkvKiB9ICovCisKKworLyoKKyoqIExVQV9GTFRGUk1MRU4gaXMgdGhlIGxlbmd0aCBtb2RpZmllciBmb3IgZmxvYXQgY29udmVyc2lvbnMgaW4KKyoqICdzdHJpbmcuZm9ybWF0JzsgTFVBX0ZMVEZSTV9UIGlzIHRoZSBmbG9hdCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8KKyoqIHRoZSBwcmV2aW91cyBsZW5ndGgKKyovCisjaWYgIWRlZmluZWQoTFVBX0ZMVEZSTUxFTikKKworI2RlZmluZSBMVUFfRkxURlJNTEVOCQkiIgorI2RlZmluZSBMVUFfRkxURlJNX1QJCWRvdWJsZQorCisjZW5kaWYKKworCisvKiBtYXhpbXVtIHNpemUgb2YgZWFjaCBmb3JtYXR0ZWQgaXRlbSAoPiBsZW4oZm9ybWF0KCclOTkuOTlmJywgLTFlMzA4KSkpICovCisjZGVmaW5lIE1BWF9JVEVNCTUxMgorLyogdmFsaWQgZmxhZ3MgaW4gYSBmb3JtYXQgc3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBGTEFHUwkiLSsgIzAiCisvKgorKiogbWF4aW11bSBzaXplIG9mIGVhY2ggZm9ybWF0IHNwZWNpZmljYXRpb24gKHN1Y2ggYXMgJyUtMDk5Ljk5ZCcpCisqKiAoKzEwIGFjY291bnRzIGZvciAlOTkuOTl4IHBsdXMgbWFyZ2luIG9mIGVycm9yKQorKi8KKyNkZWZpbmUgTUFYX0ZPUk1BVAkoc2l6ZW9mKEZMQUdTKSArIHNpemVvZihMVUFfSU5URlJNTEVOKSArIDEwKQorCisKK3N0YXRpYyB2b2lkIGFkZHF1b3RlZCAobHVhX1N0YXRlICpMLCBsdWFMX0J1ZmZlciAqYiwgaW50IGFyZykgeworICBzaXplX3QgbDsKKyAgY29uc3QgY2hhciAqcyA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIGFyZywgJmwpOworICBsdWFMX2FkZGNoYXIoYiwgJyInKTsKKyAgd2hpbGUgKGwtLSkgeworICAgIGlmICgqcyA9PSAnIicgfHwgKnMgPT0gJ1xcJyB8fCAqcyA9PSAnXG4nKSB7CisgICAgICBsdWFMX2FkZGNoYXIoYiwgJ1xcJyk7CisgICAgICBsdWFMX2FkZGNoYXIoYiwgKnMpOworICAgIH0KKyAgICBlbHNlIGlmICgqcyA9PSAnXDAnIHx8IGlzY250cmwodWNoYXIoKnMpKSkgeworICAgICAgY2hhciBidWZmWzEwXTsKKyAgICAgIGlmICghaXNkaWdpdCh1Y2hhcigqKHMrMSkpKSkKKyAgICAgICAgc3ByaW50ZihidWZmLCAiXFwlZCIsIChpbnQpdWNoYXIoKnMpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3ByaW50ZihidWZmLCAiXFwlMDNkIiwgKGludCl1Y2hhcigqcykpOworICAgICAgbHVhTF9hZGRzdHJpbmcoYiwgYnVmZik7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGx1YUxfYWRkY2hhcihiLCAqcyk7CisgICAgcysrOworICB9CisgIGx1YUxfYWRkY2hhcihiLCAnIicpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2NhbmZvcm1hdCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzdHJmcm10LCBjaGFyICpmb3JtKSB7CisgIGNvbnN0IGNoYXIgKnAgPSBzdHJmcm10OworICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiBzdHJjaHIoRkxBR1MsICpwKSAhPSBOVUxMKSBwKys7ICAvKiBza2lwIGZsYWdzICovCisgIGlmICgoc2l6ZV90KShwIC0gc3RyZnJtdCkgPj0gc2l6ZW9mKEZMQUdTKS9zaXplb2YoY2hhcikpCisgICAgbHVhTF9lcnJvcihMLCAiaW52YWxpZCBmb3JtYXQgKHJlcGVhdGVkIGZsYWdzKSIpOworICBpZiAoaXNkaWdpdCh1Y2hhcigqcCkpKSBwKys7ICAvKiBza2lwIHdpZHRoICovCisgIGlmIChpc2RpZ2l0KHVjaGFyKCpwKSkpIHArKzsgIC8qICgyIGRpZ2l0cyBhdCBtb3N0KSAqLworICBpZiAoKnAgPT0gJy4nKSB7CisgICAgcCsrOworICAgIGlmIChpc2RpZ2l0KHVjaGFyKCpwKSkpIHArKzsgIC8qIHNraXAgcHJlY2lzaW9uICovCisgICAgaWYgKGlzZGlnaXQodWNoYXIoKnApKSkgcCsrOyAgLyogKDIgZGlnaXRzIGF0IG1vc3QpICovCisgIH0KKyAgaWYgKGlzZGlnaXQodWNoYXIoKnApKSkKKyAgICBsdWFMX2Vycm9yKEwsICJpbnZhbGlkIGZvcm1hdCAod2lkdGggb3IgcHJlY2lzaW9uIHRvbyBsb25nKSIpOworICAqKGZvcm0rKykgPSAnJSc7CisgIG1lbWNweShmb3JtLCBzdHJmcm10LCAocCAtIHN0cmZybXQgKyAxKSAqIHNpemVvZihjaGFyKSk7CisgIGZvcm0gKz0gcCAtIHN0cmZybXQgKyAxOworICAqZm9ybSA9ICdcMCc7CisgIHJldHVybiBwOworfQorCisKKy8qCisqKiBhZGQgbGVuZ3RoIG1vZGlmaWVyIGludG8gZm9ybWF0cworKi8KK3N0YXRpYyB2b2lkIGFkZGxlbm1vZCAoY2hhciAqZm9ybSwgY29uc3QgY2hhciAqbGVubW9kKSB7CisgIHNpemVfdCBsID0gc3RybGVuKGZvcm0pOworICBzaXplX3QgbG0gPSBzdHJsZW4obGVubW9kKTsKKyAgY2hhciBzcGVjID0gZm9ybVtsIC0gMV07CisgIHN0cmNweShmb3JtICsgbCAtIDEsIGxlbm1vZCk7CisgIGZvcm1bbCArIGxtIC0gMV0gPSBzcGVjOworICBmb3JtW2wgKyBsbV0gPSAnXDAnOworfQorCisKK3N0YXRpYyBpbnQgc3RyX2Zvcm1hdCAobHVhX1N0YXRlICpMKSB7CisgIGludCB0b3AgPSBsdWFfZ2V0dG9wKEwpOworICBpbnQgYXJnID0gMTsKKyAgc2l6ZV90IHNmbDsKKyAgY29uc3QgY2hhciAqc3RyZnJtdCA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIGFyZywgJnNmbCk7CisgIGNvbnN0IGNoYXIgKnN0cmZybXRfZW5kID0gc3RyZnJtdCtzZmw7CisgIGx1YUxfQnVmZmVyIGI7CisgIGx1YUxfYnVmZmluaXQoTCwgJmIpOworICB3aGlsZSAoc3RyZnJtdCA8IHN0cmZybXRfZW5kKSB7CisgICAgaWYgKCpzdHJmcm10ICE9IExfRVNDKQorICAgICAgbHVhTF9hZGRjaGFyKCZiLCAqc3RyZnJtdCsrKTsKKyAgICBlbHNlIGlmICgqKytzdHJmcm10ID09IExfRVNDKQorICAgICAgbHVhTF9hZGRjaGFyKCZiLCAqc3RyZnJtdCsrKTsgIC8qICUlICovCisgICAgZWxzZSB7IC8qIGZvcm1hdCBpdGVtICovCisgICAgICBjaGFyIGZvcm1bTUFYX0ZPUk1BVF07ICAvKiB0byBzdG9yZSB0aGUgZm9ybWF0IChgJS4uLicpICovCisgICAgICBjaGFyICpidWZmID0gbHVhTF9wcmVwYnVmZnNpemUoJmIsIE1BWF9JVEVNKTsgIC8qIHRvIHB1dCBmb3JtYXR0ZWQgaXRlbSAqLworICAgICAgaW50IG5iID0gMDsgIC8qIG51bWJlciBvZiBieXRlcyBpbiBhZGRlZCBpdGVtICovCisgICAgICBpZiAoKythcmcgPiB0b3ApCisgICAgICAgIGx1YUxfYXJnZXJyb3IoTCwgYXJnLCAibm8gdmFsdWUiKTsKKyAgICAgIHN0cmZybXQgPSBzY2FuZm9ybWF0KEwsIHN0cmZybXQsIGZvcm0pOworICAgICAgc3dpdGNoICgqc3RyZnJtdCsrKSB7CisgICAgICAgIGNhc2UgJ2MnOiB7CisgICAgICAgICAgbmIgPSBzcHJpbnRmKGJ1ZmYsIGZvcm0sIGx1YUxfY2hlY2tpbnQoTCwgYXJnKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAnZCc6IGNhc2UgJ2knOiB7CisgICAgICAgICAgbHVhX051bWJlciBuID0gbHVhTF9jaGVja251bWJlcihMLCBhcmcpOworICAgICAgICAgIExVQV9JTlRGUk1fVCBuaSA9IChMVUFfSU5URlJNX1QpbjsKKyAgICAgICAgICBsdWFfTnVtYmVyIGRpZmYgPSBuIC0gKGx1YV9OdW1iZXIpbmk7CisgICAgICAgICAgbHVhTF9hcmdjaGVjayhMLCAtMSA8IGRpZmYgJiYgZGlmZiA8IDEsIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYSBudW1iZXIgaW4gcHJvcGVyIHJhbmdlIik7CisgICAgICAgICAgYWRkbGVubW9kKGZvcm0sIExVQV9JTlRGUk1MRU4pOworICAgICAgICAgIG5iID0gc3ByaW50ZihidWZmLCBmb3JtLCBuaSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAnbyc6IGNhc2UgJ3UnOiBjYXNlICd4JzogY2FzZSAnWCc6IHsKKyAgICAgICAgICBsdWFfTnVtYmVyIG4gPSBsdWFMX2NoZWNrbnVtYmVyKEwsIGFyZyk7CisgICAgICAgICAgdW5zaWduZWQgTFVBX0lOVEZSTV9UIG5pID0gKHVuc2lnbmVkIExVQV9JTlRGUk1fVCluOworICAgICAgICAgIGx1YV9OdW1iZXIgZGlmZiA9IG4gLSAobHVhX051bWJlciluaTsKKyAgICAgICAgICBsdWFMX2FyZ2NoZWNrKEwsIC0xIDwgZGlmZiAmJiBkaWZmIDwgMSwgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhIG5vbi1uZWdhdGl2ZSBudW1iZXIgaW4gcHJvcGVyIHJhbmdlIik7CisgICAgICAgICAgYWRkbGVubW9kKGZvcm0sIExVQV9JTlRGUk1MRU4pOworICAgICAgICAgIG5iID0gc3ByaW50ZihidWZmLCBmb3JtLCBuaSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAnZSc6IGNhc2UgJ0UnOiBjYXNlICdmJzoKKyNpZiBkZWZpbmVkKExVQV9VU0VfQUZPUk1BVCkKKyAgICAgICAgY2FzZSAnYSc6IGNhc2UgJ0EnOgorI2VuZGlmCisgICAgICAgIGNhc2UgJ2cnOiBjYXNlICdHJzogeworICAgICAgICAgIGFkZGxlbm1vZChmb3JtLCBMVUFfRkxURlJNTEVOKTsKKyAgICAgICAgICBuYiA9IHNwcmludGYoYnVmZiwgZm9ybSwgKExVQV9GTFRGUk1fVClsdWFMX2NoZWNrbnVtYmVyKEwsIGFyZykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgJ3EnOiB7CisgICAgICAgICAgYWRkcXVvdGVkKEwsICZiLCBhcmcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgJ3MnOiB7CisgICAgICAgICAgc2l6ZV90IGw7CisgICAgICAgICAgY29uc3QgY2hhciAqcyA9IGx1YUxfdG9sc3RyaW5nKEwsIGFyZywgJmwpOworICAgICAgICAgIGlmICghc3RyY2hyKGZvcm0sICcuJykgJiYgbCA+PSAxMDApIHsKKyAgICAgICAgICAgIC8qIG5vIHByZWNpc2lvbiBhbmQgc3RyaW5nIGlzIHRvbyBsb25nIHRvIGJlIGZvcm1hdHRlZDsKKyAgICAgICAgICAgICAgIGtlZXAgb3JpZ2luYWwgc3RyaW5nICovCisgICAgICAgICAgICBsdWFMX2FkZHZhbHVlKCZiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5iID0gc3ByaW50ZihidWZmLCBmb3JtLCBzKTsKKyAgICAgICAgICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgcmVzdWx0IGZyb20gJ2x1YUxfdG9sc3RyaW5nJyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsgIC8qIGFsc28gdHJlYXQgY2FzZXMgYHBuTGxoJyAqLworICAgICAgICAgIHJldHVybiBsdWFMX2Vycm9yKEwsICJpbnZhbGlkIG9wdGlvbiAiIExVQV9RTCgiJSUlYyIpICIgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExVQV9RTCgiZm9ybWF0IiksICooc3RyZnJtdCAtIDEpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbHVhTF9hZGRzaXplKCZiLCBuYik7CisgICAgfQorICB9CisgIGx1YUxfcHVzaHJlc3VsdCgmYik7CisgIHJldHVybiAxOworfQorCisvKiB9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIHN0cmxpYltdID0geworICB7ImJ5dGUiLCBzdHJfYnl0ZX0sCisgIHsiY2hhciIsIHN0cl9jaGFyfSwKKyAgeyJkdW1wIiwgc3RyX2R1bXB9LAorICB7ImZpbmQiLCBzdHJfZmluZH0sCisgIHsiZm9ybWF0Iiwgc3RyX2Zvcm1hdH0sCisgIHsiZ21hdGNoIiwgZ21hdGNofSwKKyAgeyJnc3ViIiwgc3RyX2dzdWJ9LAorICB7ImxlbiIsIHN0cl9sZW59LAorICB7Imxvd2VyIiwgc3RyX2xvd2VyfSwKKyAgeyJtYXRjaCIsIHN0cl9tYXRjaH0sCisgIHsicmVwIiwgc3RyX3JlcH0sCisgIHsicmV2ZXJzZSIsIHN0cl9yZXZlcnNlfSwKKyAgeyJzdWIiLCBzdHJfc3VifSwKKyAgeyJ1cHBlciIsIHN0cl91cHBlcn0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworCitzdGF0aWMgdm9pZCBjcmVhdGVtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfY3JlYXRldGFibGUoTCwgMCwgMSk7ICAvKiB0YWJsZSB0byBiZSBtZXRhdGFibGUgZm9yIHN0cmluZ3MgKi8KKyAgbHVhX3B1c2hsaXRlcmFsKEwsICIiKTsgIC8qIGR1bW15IHN0cmluZyAqLworICBsdWFfcHVzaHZhbHVlKEwsIC0yKTsgIC8qIGNvcHkgdGFibGUgKi8KKyAgbHVhX3NldG1ldGF0YWJsZShMLCAtMik7ICAvKiBzZXQgdGFibGUgYXMgbWV0YXRhYmxlIGZvciBzdHJpbmdzICovCisgIGx1YV9wb3AoTCwgMSk7ICAvKiBwb3AgZHVtbXkgc3RyaW5nICovCisgIGx1YV9wdXNodmFsdWUoTCwgLTIpOyAgLyogZ2V0IHN0cmluZyBsaWJyYXJ5ICovCisgIGx1YV9zZXRmaWVsZChMLCAtMiwgIl9faW5kZXgiKTsgIC8qIG1ldGF0YWJsZS5fX2luZGV4ID0gc3RyaW5nICovCisgIGx1YV9wb3AoTCwgMSk7ICAvKiBwb3AgbWV0YXRhYmxlICovCit9CisKKworLyoKKyoqIE9wZW4gc3RyaW5nIGxpYnJhcnkKKyovCitMVUFNT0RfQVBJIGludCBsdWFvcGVuX3N0cmluZyAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfbmV3bGliKEwsIHN0cmxpYik7CisgIGNyZWF0ZW1ldGF0YWJsZShMKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbHRhYmxlLmMgYi9jb20zMi9sdWEvc3JjL2x0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOTcxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2x0YWJsZS5jCkBAIC0wLDAgKzEsNTg5IEBACisvKgorKiogJElkOiBsdGFibGUuYyx2IDIuNzIuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogTHVhIHRhYmxlcyAoaGFzaCkKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKy8qCisqKiBJbXBsZW1lbnRhdGlvbiBvZiB0YWJsZXMgKGFrYSBhcnJheXMsIG9iamVjdHMsIG9yIGhhc2ggdGFibGVzKS4KKyoqIFRhYmxlcyBrZWVwIGl0cyBlbGVtZW50cyBpbiB0d28gcGFydHM6IGFuIGFycmF5IHBhcnQgYW5kIGEgaGFzaCBwYXJ0LgorKiogTm9uLW5lZ2F0aXZlIGludGVnZXIga2V5cyBhcmUgYWxsIGNhbmRpZGF0ZXMgdG8gYmUga2VwdCBpbiB0aGUgYXJyYXkKKyoqIHBhcnQuIFRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgYXJyYXkgaXMgdGhlIGxhcmdlc3QgYG4nIHN1Y2ggdGhhdCBhdAorKiogbGVhc3QgaGFsZiB0aGUgc2xvdHMgYmV0d2VlbiAwIGFuZCBuIGFyZSBpbiB1c2UuCisqKiBIYXNoIHVzZXMgYSBtaXggb2YgY2hhaW5lZCBzY2F0dGVyIHRhYmxlIHdpdGggQnJlbnQncyB2YXJpYXRpb24uCisqKiBBIG1haW4gaW52YXJpYW50IG9mIHRoZXNlIHRhYmxlcyBpcyB0aGF0LCBpZiBhbiBlbGVtZW50IGlzIG5vdAorKiogaW4gaXRzIG1haW4gcG9zaXRpb24gKGkuZS4gdGhlIGBvcmlnaW5hbCcgcG9zaXRpb24gdGhhdCBpdHMgaGFzaCBnaXZlcworKiogdG8gaXQpLCB0aGVuIHRoZSBjb2xsaWRpbmcgZWxlbWVudCBpcyBpbiBpdHMgb3duIG1haW4gcG9zaXRpb24uCisqKiBIZW5jZSBldmVuIHdoZW4gdGhlIGxvYWQgZmFjdG9yIHJlYWNoZXMgMTAwJSwgcGVyZm9ybWFuY2UgcmVtYWlucyBnb29kLgorKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGx0YWJsZV9jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsdWEuaCIKKworI2luY2x1ZGUgImxkZWJ1Zy5oIgorI2luY2x1ZGUgImxkby5oIgorI2luY2x1ZGUgImxnYy5oIgorI2luY2x1ZGUgImxtZW0uaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHN0cmluZy5oIgorI2luY2x1ZGUgImx0YWJsZS5oIgorI2luY2x1ZGUgImx2bS5oIgorCisKKy8qCisqKiBtYXggc2l6ZSBvZiBhcnJheSBwYXJ0IGlzIDJeTUFYQklUUworKi8KKyNpZiBMVUFJX0JJVFNJTlQgPj0gMzIKKyNkZWZpbmUgTUFYQklUUwkJMzAKKyNlbHNlCisjZGVmaW5lIE1BWEJJVFMJCShMVUFJX0JJVFNJTlQtMikKKyNlbmRpZgorCisjZGVmaW5lIE1BWEFTSVpFCSgxIDw8IE1BWEJJVFMpCisKKworI2RlZmluZSBoYXNocG93Mih0LG4pCQkoZ25vZGUodCwgbG1vZCgobiksIHNpemVub2RlKHQpKSkpCisKKyNkZWZpbmUgaGFzaHN0cih0LHN0cikJCWhhc2hwb3cyKHQsIChzdHIpLT50c3YuaGFzaCkKKyNkZWZpbmUgaGFzaGJvb2xlYW4odCxwKQloYXNocG93Mih0LCBwKQorCisKKy8qCisqKiBmb3Igc29tZSB0eXBlcywgaXQgaXMgYmV0dGVyIHRvIGF2b2lkIG1vZHVsdXMgYnkgcG93ZXIgb2YgMiwgYXMKKyoqIHRoZXkgdGVuZCB0byBoYXZlIG1hbnkgMiBmYWN0b3JzLgorKi8KKyNkZWZpbmUgaGFzaG1vZCh0LG4pCShnbm9kZSh0LCAoKG4pICUgKChzaXplbm9kZSh0KS0xKXwxKSkpKQorCisKKyNkZWZpbmUgaGFzaHBvaW50ZXIodCxwKQloYXNobW9kKHQsIEludFBvaW50KHApKQorCisKKyNkZWZpbmUgZHVtbXlub2RlCQkoJmR1bW15bm9kZV8pCisKKyNkZWZpbmUgaXNkdW1teShuKQkJKChuKSA9PSBkdW1teW5vZGUpCisKK3N0YXRpYyBjb25zdCBOb2RlIGR1bW15bm9kZV8gPSB7CisgIHtOSUxDT05TVEFOVH0sICAvKiB2YWx1ZSAqLworICB7e05JTENPTlNUQU5ULCBOVUxMfX0gIC8qIGtleSAqLworfTsKKworCisvKgorKiogaGFzaCBmb3IgbHVhX051bWJlcnMKKyovCisvKiBUYWtlbiBmcm9tIEx1YSA1LjEgdG8gYXZvaWQgZnJleHAoKSAqLworI2RlZmluZSBudW1pbnRzCWNhc3RfaW50KHNpemVvZihsdWFfTnVtYmVyKS9zaXplb2YoaW50KSkKK3N0YXRpYyBOb2RlICpoYXNobnVtIChjb25zdCBUYWJsZSAqdCwgbHVhX051bWJlciBuKSB7CisgIHVuc2lnbmVkIGludCBhW251bWludHNdOworICBpbnQgaTsKKyAgaWYgKGx1YWlfbnVtZXEobiwgMCkpICAvKiBhdm9pZCBwcm9ibGVtcyB3aXRoIC0wICovCisgICAgcmV0dXJuIGdub2RlKHQsIDApOworICBtZW1jcHkoYSwgJm4sIHNpemVvZihhKSk7CisgIGZvciAoaSA9IDE7IGkgPCBudW1pbnRzOyBpKyspIGFbMF0gKz0gYVtpXTsKKyAgcmV0dXJuIGhhc2htb2QodCwgYVswXSk7Cit9CisKKworCisvKgorKiogcmV0dXJucyB0aGUgYG1haW4nIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgaW4gYSB0YWJsZSAodGhhdCBpcywgdGhlIGluZGV4CisqKiBvZiBpdHMgaGFzaCB2YWx1ZSkKKyovCitzdGF0aWMgTm9kZSAqbWFpbnBvc2l0aW9uIChjb25zdCBUYWJsZSAqdCwgY29uc3QgVFZhbHVlICprZXkpIHsKKyAgc3dpdGNoICh0dHlwZShrZXkpKSB7CisgICAgY2FzZSBMVUFfVE5VTUJFUjoKKyAgICAgIHJldHVybiBoYXNobnVtKHQsIG52YWx1ZShrZXkpKTsKKyAgICBjYXNlIExVQV9UTE5HU1RSOiB7CisgICAgICBUU3RyaW5nICpzID0gcmF3dHN2YWx1ZShrZXkpOworICAgICAgaWYgKHMtPnRzdi5leHRyYSA9PSAwKSB7ICAvKiBubyBoYXNoPyAqLworICAgICAgICBzLT50c3YuaGFzaCA9IGx1YVNfaGFzaChnZXRzdHIocyksIHMtPnRzdi5sZW4sIHMtPnRzdi5oYXNoKTsKKyAgICAgICAgcy0+dHN2LmV4dHJhID0gMTsgIC8qIG5vdyBpdCBoYXMgaXRzIGhhc2ggKi8KKyAgICAgIH0KKyAgICAgIHJldHVybiBoYXNoc3RyKHQsIHJhd3RzdmFsdWUoa2V5KSk7CisgICAgfQorICAgIGNhc2UgTFVBX1RTSFJTVFI6CisgICAgICByZXR1cm4gaGFzaHN0cih0LCByYXd0c3ZhbHVlKGtleSkpOworICAgIGNhc2UgTFVBX1RCT09MRUFOOgorICAgICAgcmV0dXJuIGhhc2hib29sZWFuKHQsIGJ2YWx1ZShrZXkpKTsKKyAgICBjYXNlIExVQV9UTElHSFRVU0VSREFUQToKKyAgICAgIHJldHVybiBoYXNocG9pbnRlcih0LCBwdmFsdWUoa2V5KSk7CisgICAgY2FzZSBMVUFfVExDRjoKKyAgICAgIHJldHVybiBoYXNocG9pbnRlcih0LCBmdmFsdWUoa2V5KSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBoYXNocG9pbnRlcih0LCBnY3ZhbHVlKGtleSkpOworICB9Cit9CisKKworLyoKKyoqIHJldHVybnMgdGhlIGluZGV4IGZvciBga2V5JyBpZiBga2V5JyBpcyBhbiBhcHByb3ByaWF0ZSBrZXkgdG8gbGl2ZSBpbgorKiogdGhlIGFycmF5IHBhcnQgb2YgdGhlIHRhYmxlLCAtMSBvdGhlcndpc2UuCisqLworc3RhdGljIGludCBhcnJheWluZGV4IChjb25zdCBUVmFsdWUgKmtleSkgeworICBpZiAodHRpc251bWJlcihrZXkpKSB7CisgICAgbHVhX051bWJlciBuID0gbnZhbHVlKGtleSk7CisgICAgaW50IGs7CisgICAgbHVhX251bWJlcjJpbnQoaywgbik7CisgICAgaWYgKGx1YWlfbnVtZXEoY2FzdF9udW0oayksIG4pKQorICAgICAgcmV0dXJuIGs7CisgIH0KKyAgcmV0dXJuIC0xOyAgLyogYGtleScgZGlkIG5vdCBtYXRjaCBzb21lIGNvbmRpdGlvbiAqLworfQorCisKKy8qCisqKiByZXR1cm5zIHRoZSBpbmRleCBvZiBhIGBrZXknIGZvciB0YWJsZSB0cmF2ZXJzYWxzLiBGaXJzdCBnb2VzIGFsbAorKiogZWxlbWVudHMgaW4gdGhlIGFycmF5IHBhcnQsIHRoZW4gZWxlbWVudHMgaW4gdGhlIGhhc2ggcGFydC4gVGhlCisqKiBiZWdpbm5pbmcgb2YgYSB0cmF2ZXJzYWwgaXMgc2lnbmFsZWQgYnkgLTEuCisqLworc3RhdGljIGludCBmaW5kaW5kZXggKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIFN0a0lkIGtleSkgeworICBpbnQgaTsKKyAgaWYgKHR0aXNuaWwoa2V5KSkgcmV0dXJuIC0xOyAgLyogZmlyc3QgaXRlcmF0aW9uICovCisgIGkgPSBhcnJheWluZGV4KGtleSk7CisgIGlmICgwIDwgaSAmJiBpIDw9IHQtPnNpemVhcnJheSkgIC8qIGlzIGBrZXknIGluc2lkZSBhcnJheSBwYXJ0PyAqLworICAgIHJldHVybiBpLTE7ICAvKiB5ZXM7IHRoYXQncyB0aGUgaW5kZXggKGNvcnJlY3RlZCB0byBDKSAqLworICBlbHNlIHsKKyAgICBOb2RlICpuID0gbWFpbnBvc2l0aW9uKHQsIGtleSk7CisgICAgZm9yICg7OykgeyAgLyogY2hlY2sgd2hldGhlciBga2V5JyBpcyBzb21ld2hlcmUgaW4gdGhlIGNoYWluICovCisgICAgICAvKiBrZXkgbWF5IGJlIGRlYWQgYWxyZWFkeSwgYnV0IGl0IGlzIG9rIHRvIHVzZSBpdCBpbiBgbmV4dCcgKi8KKyAgICAgIGlmIChsdWFWX3Jhd2VxdWFsb2JqKGdrZXkobiksIGtleSkgfHwKKyAgICAgICAgICAgICh0dGlzZGVhZGtleShna2V5KG4pKSAmJiBpc2NvbGxlY3RhYmxlKGtleSkgJiYKKyAgICAgICAgICAgICBkZWFkdmFsdWUoZ2tleShuKSkgPT0gZ2N2YWx1ZShrZXkpKSkgeworICAgICAgICBpID0gY2FzdF9pbnQobiAtIGdub2RlKHQsIDApKTsgIC8qIGtleSBpbmRleCBpbiBoYXNoIHRhYmxlICovCisgICAgICAgIC8qIGhhc2ggZWxlbWVudHMgYXJlIG51bWJlcmVkIGFmdGVyIGFycmF5IG9uZXMgKi8KKyAgICAgICAgcmV0dXJuIGkgKyB0LT5zaXplYXJyYXk7CisgICAgICB9CisgICAgICBlbHNlIG4gPSBnbmV4dChuKTsKKyAgICAgIGlmIChuID09IE5VTEwpCisgICAgICAgIGx1YUdfcnVuZXJyb3IoTCwgImludmFsaWQga2V5IHRvICIgTFVBX1FMKCJuZXh0IikpOyAgLyoga2V5IG5vdCBmb3VuZCAqLworICAgIH0KKyAgfQorfQorCisKK2ludCBsdWFIX25leHQgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIFN0a0lkIGtleSkgeworICBpbnQgaSA9IGZpbmRpbmRleChMLCB0LCBrZXkpOyAgLyogZmluZCBvcmlnaW5hbCBlbGVtZW50ICovCisgIGZvciAoaSsrOyBpIDwgdC0+c2l6ZWFycmF5OyBpKyspIHsgIC8qIHRyeSBmaXJzdCBhcnJheSBwYXJ0ICovCisgICAgaWYgKCF0dGlzbmlsKCZ0LT5hcnJheVtpXSkpIHsgIC8qIGEgbm9uLW5pbCB2YWx1ZT8gKi8KKyAgICAgIHNldG52YWx1ZShrZXksIGNhc3RfbnVtKGkrMSkpOworICAgICAgc2V0b2JqMnMoTCwga2V5KzEsICZ0LT5hcnJheVtpXSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgZm9yIChpIC09IHQtPnNpemVhcnJheTsgaSA8IHNpemVub2RlKHQpOyBpKyspIHsgIC8qIHRoZW4gaGFzaCBwYXJ0ICovCisgICAgaWYgKCF0dGlzbmlsKGd2YWwoZ25vZGUodCwgaSkpKSkgeyAgLyogYSBub24tbmlsIHZhbHVlPyAqLworICAgICAgc2V0b2JqMnMoTCwga2V5LCBna2V5KGdub2RlKHQsIGkpKSk7CisgICAgICBzZXRvYmoycyhMLCBrZXkrMSwgZ3ZhbChnbm9kZSh0LCBpKSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOyAgLyogbm8gbW9yZSBlbGVtZW50cyAqLworfQorCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogUmVoYXNoCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCitzdGF0aWMgaW50IGNvbXB1dGVzaXplcyAoaW50IG51bXNbXSwgaW50ICpuYXJyYXkpIHsKKyAgaW50IGk7CisgIGludCB0d290b2k7ICAvKiAyXmkgKi8KKyAgaW50IGEgPSAwOyAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHNtYWxsZXIgdGhhbiAyXmkgKi8KKyAgaW50IG5hID0gMDsgIC8qIG51bWJlciBvZiBlbGVtZW50cyB0byBnbyB0byBhcnJheSBwYXJ0ICovCisgIGludCBuID0gMDsgIC8qIG9wdGltYWwgc2l6ZSBmb3IgYXJyYXkgcGFydCAqLworICBmb3IgKGkgPSAwLCB0d290b2kgPSAxOyB0d290b2kvMiA8ICpuYXJyYXk7IGkrKywgdHdvdG9pICo9IDIpIHsKKyAgICBpZiAobnVtc1tpXSA+IDApIHsKKyAgICAgIGEgKz0gbnVtc1tpXTsKKyAgICAgIGlmIChhID4gdHdvdG9pLzIpIHsgIC8qIG1vcmUgdGhhbiBoYWxmIGVsZW1lbnRzIHByZXNlbnQ/ICovCisgICAgICAgIG4gPSB0d290b2k7ICAvKiBvcHRpbWFsIHNpemUgKHRpbGwgbm93KSAqLworICAgICAgICBuYSA9IGE7ICAvKiBhbGwgZWxlbWVudHMgc21hbGxlciB0aGFuIG4gd2lsbCBnbyB0byBhcnJheSBwYXJ0ICovCisgICAgICB9CisgICAgfQorICAgIGlmIChhID09ICpuYXJyYXkpIGJyZWFrOyAgLyogYWxsIGVsZW1lbnRzIGFscmVhZHkgY291bnRlZCAqLworICB9CisgICpuYXJyYXkgPSBuOworICBsdWFfYXNzZXJ0KCpuYXJyYXkvMiA8PSBuYSAmJiBuYSA8PSAqbmFycmF5KTsKKyAgcmV0dXJuIG5hOworfQorCisKK3N0YXRpYyBpbnQgY291bnRpbnQgKGNvbnN0IFRWYWx1ZSAqa2V5LCBpbnQgKm51bXMpIHsKKyAgaW50IGsgPSBhcnJheWluZGV4KGtleSk7CisgIGlmICgwIDwgayAmJiBrIDw9IE1BWEFTSVpFKSB7ICAvKiBpcyBga2V5JyBhbiBhcHByb3ByaWF0ZSBhcnJheSBpbmRleD8gKi8KKyAgICBudW1zW2x1YU9fY2VpbGxvZzIoayldKys7ICAvKiBjb3VudCBhcyBzdWNoICovCisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbnVtdXNlYXJyYXkgKGNvbnN0IFRhYmxlICp0LCBpbnQgKm51bXMpIHsKKyAgaW50IGxnOworICBpbnQgdHRsZzsgIC8qIDJebGcgKi8KKyAgaW50IGF1c2UgPSAwOyAgLyogc3VtbWF0aW9uIG9mIGBudW1zJyAqLworICBpbnQgaSA9IDE7ICAvKiBjb3VudCB0byB0cmF2ZXJzZSBhbGwgYXJyYXkga2V5cyAqLworICBmb3IgKGxnPTAsIHR0bGc9MTsgbGc8PU1BWEJJVFM7IGxnKyssIHR0bGcqPTIpIHsgIC8qIGZvciBlYWNoIHNsaWNlICovCisgICAgaW50IGxjID0gMDsgIC8qIGNvdW50ZXIgKi8KKyAgICBpbnQgbGltID0gdHRsZzsKKyAgICBpZiAobGltID4gdC0+c2l6ZWFycmF5KSB7CisgICAgICBsaW0gPSB0LT5zaXplYXJyYXk7ICAvKiBhZGp1c3QgdXBwZXIgbGltaXQgKi8KKyAgICAgIGlmIChpID4gbGltKQorICAgICAgICBicmVhazsgIC8qIG5vIG1vcmUgZWxlbWVudHMgdG8gY291bnQgKi8KKyAgICB9CisgICAgLyogY291bnQgZWxlbWVudHMgaW4gcmFuZ2UgKDJeKGxnLTEpLCAyXmxnXSAqLworICAgIGZvciAoOyBpIDw9IGxpbTsgaSsrKSB7CisgICAgICBpZiAoIXR0aXNuaWwoJnQtPmFycmF5W2ktMV0pKQorICAgICAgICBsYysrOworICAgIH0KKyAgICBudW1zW2xnXSArPSBsYzsKKyAgICBhdXNlICs9IGxjOworICB9CisgIHJldHVybiBhdXNlOworfQorCisKK3N0YXRpYyBpbnQgbnVtdXNlaGFzaCAoY29uc3QgVGFibGUgKnQsIGludCAqbnVtcywgaW50ICpwbmFzaXplKSB7CisgIGludCB0b3RhbHVzZSA9IDA7ICAvKiB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgKi8KKyAgaW50IGF1c2UgPSAwOyAgLyogc3VtbWF0aW9uIG9mIGBudW1zJyAqLworICBpbnQgaSA9IHNpemVub2RlKHQpOworICB3aGlsZSAoaS0tKSB7CisgICAgTm9kZSAqbiA9ICZ0LT5ub2RlW2ldOworICAgIGlmICghdHRpc25pbChndmFsKG4pKSkgeworICAgICAgYXVzZSArPSBjb3VudGludChna2V5KG4pLCBudW1zKTsKKyAgICAgIHRvdGFsdXNlKys7CisgICAgfQorICB9CisgICpwbmFzaXplICs9IGF1c2U7CisgIHJldHVybiB0b3RhbHVzZTsKK30KKworCitzdGF0aWMgdm9pZCBzZXRhcnJheXZlY3RvciAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCwgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGx1YU1fcmVhbGxvY3ZlY3RvcihMLCB0LT5hcnJheSwgdC0+c2l6ZWFycmF5LCBzaXplLCBUVmFsdWUpOworICBmb3IgKGk9dC0+c2l6ZWFycmF5OyBpPHNpemU7IGkrKykKKyAgICAgc2V0bmlsdmFsdWUoJnQtPmFycmF5W2ldKTsKKyAgdC0+c2l6ZWFycmF5ID0gc2l6ZTsKK30KKworCitzdGF0aWMgdm9pZCBzZXRub2RldmVjdG9yIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBpbnQgc2l6ZSkgeworICBpbnQgbHNpemU7CisgIGlmIChzaXplID09IDApIHsgIC8qIG5vIGVsZW1lbnRzIHRvIGhhc2ggcGFydD8gKi8KKyAgICB0LT5ub2RlID0gY2FzdChOb2RlICosIGR1bW15bm9kZSk7ICAvKiB1c2UgY29tbW9uIGBkdW1teW5vZGUnICovCisgICAgbHNpemUgPSAwOworICB9CisgIGVsc2UgeworICAgIGludCBpOworICAgIGxzaXplID0gbHVhT19jZWlsbG9nMihzaXplKTsKKyAgICBpZiAobHNpemUgPiBNQVhCSVRTKQorICAgICAgbHVhR19ydW5lcnJvcihMLCAidGFibGUgb3ZlcmZsb3ciKTsKKyAgICBzaXplID0gdHdvdG8obHNpemUpOworICAgIHQtPm5vZGUgPSBsdWFNX25ld3ZlY3RvcihMLCBzaXplLCBOb2RlKTsKKyAgICBmb3IgKGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgIE5vZGUgKm4gPSBnbm9kZSh0LCBpKTsKKyAgICAgIGduZXh0KG4pID0gTlVMTDsKKyAgICAgIHNldG5pbHZhbHVlKGdrZXkobikpOworICAgICAgc2V0bmlsdmFsdWUoZ3ZhbChuKSk7CisgICAgfQorICB9CisgIHQtPmxzaXplbm9kZSA9IGNhc3RfYnl0ZShsc2l6ZSk7CisgIHQtPmxhc3RmcmVlID0gZ25vZGUodCwgc2l6ZSk7ICAvKiBhbGwgcG9zaXRpb25zIGFyZSBmcmVlICovCit9CisKKwordm9pZCBsdWFIX3Jlc2l6ZSAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCwgaW50IG5hc2l6ZSwgaW50IG5oc2l6ZSkgeworICBpbnQgaTsKKyAgaW50IG9sZGFzaXplID0gdC0+c2l6ZWFycmF5OworICBpbnQgb2xkaHNpemUgPSB0LT5sc2l6ZW5vZGU7CisgIE5vZGUgKm5vbGQgPSB0LT5ub2RlOyAgLyogc2F2ZSBvbGQgaGFzaCAuLi4gKi8KKyAgaWYgKG5hc2l6ZSA+IG9sZGFzaXplKSAgLyogYXJyYXkgcGFydCBtdXN0IGdyb3c/ICovCisgICAgc2V0YXJyYXl2ZWN0b3IoTCwgdCwgbmFzaXplKTsKKyAgLyogY3JlYXRlIG5ldyBoYXNoIHBhcnQgd2l0aCBhcHByb3ByaWF0ZSBzaXplICovCisgIHNldG5vZGV2ZWN0b3IoTCwgdCwgbmhzaXplKTsKKyAgaWYgKG5hc2l6ZSA8IG9sZGFzaXplKSB7ICAvKiBhcnJheSBwYXJ0IG11c3Qgc2hyaW5rPyAqLworICAgIHQtPnNpemVhcnJheSA9IG5hc2l6ZTsKKyAgICAvKiByZS1pbnNlcnQgZWxlbWVudHMgZnJvbSB2YW5pc2hpbmcgc2xpY2UgKi8KKyAgICBmb3IgKGk9bmFzaXplOyBpPG9sZGFzaXplOyBpKyspIHsKKyAgICAgIGlmICghdHRpc25pbCgmdC0+YXJyYXlbaV0pKQorICAgICAgICBsdWFIX3NldGludChMLCB0LCBpICsgMSwgJnQtPmFycmF5W2ldKTsKKyAgICB9CisgICAgLyogc2hyaW5rIGFycmF5ICovCisgICAgbHVhTV9yZWFsbG9jdmVjdG9yKEwsIHQtPmFycmF5LCBvbGRhc2l6ZSwgbmFzaXplLCBUVmFsdWUpOworICB9CisgIC8qIHJlLWluc2VydCBlbGVtZW50cyBmcm9tIGhhc2ggcGFydCAqLworICBmb3IgKGkgPSB0d290byhvbGRoc2l6ZSkgLSAxOyBpID49IDA7IGktLSkgeworICAgIE5vZGUgKm9sZCA9IG5vbGQraTsKKyAgICBpZiAoIXR0aXNuaWwoZ3ZhbChvbGQpKSkgeworICAgICAgLyogZG9lc24ndCBuZWVkIGJhcnJpZXIvaW52YWxpZGF0ZSBjYWNoZSwgYXMgZW50cnkgd2FzCisgICAgICAgICBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHRhYmxlICovCisgICAgICBzZXRvYmp0MnQoTCwgbHVhSF9zZXQoTCwgdCwgZ2tleShvbGQpKSwgZ3ZhbChvbGQpKTsKKyAgICB9CisgIH0KKyAgaWYgKCFpc2R1bW15KG5vbGQpKQorICAgIGx1YU1fZnJlZWFycmF5KEwsIG5vbGQsIGNhc3Qoc2l6ZV90LCB0d290byhvbGRoc2l6ZSkpKTsgLyogZnJlZSBvbGQgYXJyYXkgKi8KK30KKworCit2b2lkIGx1YUhfcmVzaXplYXJyYXkgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIGludCBuYXNpemUpIHsKKyAgaW50IG5zaXplID0gaXNkdW1teSh0LT5ub2RlKSA/IDAgOiBzaXplbm9kZSh0KTsKKyAgbHVhSF9yZXNpemUoTCwgdCwgbmFzaXplLCBuc2l6ZSk7Cit9CisKKworc3RhdGljIHZvaWQgcmVoYXNoIChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBjb25zdCBUVmFsdWUgKmVrKSB7CisgIGludCBuYXNpemUsIG5hOworICBpbnQgbnVtc1tNQVhCSVRTKzFdOyAgLyogbnVtc1tpXSA9IG51bWJlciBvZiBrZXlzIHdpdGggMl4oaS0xKSA8IGsgPD0gMl5pICovCisgIGludCBpOworICBpbnQgdG90YWx1c2U7CisgIGZvciAoaT0wOyBpPD1NQVhCSVRTOyBpKyspIG51bXNbaV0gPSAwOyAgLyogcmVzZXQgY291bnRzICovCisgIG5hc2l6ZSA9IG51bXVzZWFycmF5KHQsIG51bXMpOyAgLyogY291bnQga2V5cyBpbiBhcnJheSBwYXJ0ICovCisgIHRvdGFsdXNlID0gbmFzaXplOyAgLyogYWxsIHRob3NlIGtleXMgYXJlIGludGVnZXIga2V5cyAqLworICB0b3RhbHVzZSArPSBudW11c2VoYXNoKHQsIG51bXMsICZuYXNpemUpOyAgLyogY291bnQga2V5cyBpbiBoYXNoIHBhcnQgKi8KKyAgLyogY291bnQgZXh0cmEga2V5ICovCisgIG5hc2l6ZSArPSBjb3VudGludChlaywgbnVtcyk7CisgIHRvdGFsdXNlKys7CisgIC8qIGNvbXB1dGUgbmV3IHNpemUgZm9yIGFycmF5IHBhcnQgKi8KKyAgbmEgPSBjb21wdXRlc2l6ZXMobnVtcywgJm5hc2l6ZSk7CisgIC8qIHJlc2l6ZSB0aGUgdGFibGUgdG8gbmV3IGNvbXB1dGVkIHNpemVzICovCisgIGx1YUhfcmVzaXplKEwsIHQsIG5hc2l6ZSwgdG90YWx1c2UgLSBuYSk7Cit9CisKKworCisvKgorKiogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKworVGFibGUgKmx1YUhfbmV3IChsdWFfU3RhdGUgKkwpIHsKKyAgVGFibGUgKnQgPSAmbHVhQ19uZXdvYmooTCwgTFVBX1RUQUJMRSwgc2l6ZW9mKFRhYmxlKSwgTlVMTCwgMCktPmg7CisgIHQtPm1ldGF0YWJsZSA9IE5VTEw7CisgIHQtPmZsYWdzID0gY2FzdF9ieXRlKH4wKTsKKyAgdC0+YXJyYXkgPSBOVUxMOworICB0LT5zaXplYXJyYXkgPSAwOworICBzZXRub2RldmVjdG9yKEwsIHQsIDApOworICByZXR1cm4gdDsKK30KKworCit2b2lkIGx1YUhfZnJlZSAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCkgeworICBpZiAoIWlzZHVtbXkodC0+bm9kZSkpCisgICAgbHVhTV9mcmVlYXJyYXkoTCwgdC0+bm9kZSwgY2FzdChzaXplX3QsIHNpemVub2RlKHQpKSk7CisgIGx1YU1fZnJlZWFycmF5KEwsIHQtPmFycmF5LCB0LT5zaXplYXJyYXkpOworICBsdWFNX2ZyZWUoTCwgdCk7Cit9CisKKworc3RhdGljIE5vZGUgKmdldGZyZWVwb3MgKFRhYmxlICp0KSB7CisgIHdoaWxlICh0LT5sYXN0ZnJlZSA+IHQtPm5vZGUpIHsKKyAgICB0LT5sYXN0ZnJlZS0tOworICAgIGlmICh0dGlzbmlsKGdrZXkodC0+bGFzdGZyZWUpKSkKKyAgICAgIHJldHVybiB0LT5sYXN0ZnJlZTsKKyAgfQorICByZXR1cm4gTlVMTDsgIC8qIGNvdWxkIG5vdCBmaW5kIGEgZnJlZSBwbGFjZSAqLworfQorCisKKworLyoKKyoqIGluc2VydHMgYSBuZXcga2V5IGludG8gYSBoYXNoIHRhYmxlOyBmaXJzdCwgY2hlY2sgd2hldGhlciBrZXkncyBtYWluCisqKiBwb3NpdGlvbiBpcyBmcmVlLiBJZiBub3QsIGNoZWNrIHdoZXRoZXIgY29sbGlkaW5nIG5vZGUgaXMgaW4gaXRzIG1haW4KKyoqIHBvc2l0aW9uIG9yIG5vdDogaWYgaXQgaXMgbm90LCBtb3ZlIGNvbGxpZGluZyBub2RlIHRvIGFuIGVtcHR5IHBsYWNlIGFuZAorKiogcHV0IG5ldyBrZXkgaW4gaXRzIG1haW4gcG9zaXRpb247IG90aGVyd2lzZSAoY29sbGlkaW5nIG5vZGUgaXMgaW4gaXRzIG1haW4KKyoqIHBvc2l0aW9uKSwgbmV3IGtleSBnb2VzIHRvIGFuIGVtcHR5IHBvc2l0aW9uLgorKi8KK1RWYWx1ZSAqbHVhSF9uZXdrZXkgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIGNvbnN0IFRWYWx1ZSAqa2V5KSB7CisgIE5vZGUgKm1wOworICBpZiAodHRpc25pbChrZXkpKSBsdWFHX3J1bmVycm9yKEwsICJ0YWJsZSBpbmRleCBpcyBuaWwiKTsKKyAgZWxzZSBpZiAodHRpc251bWJlcihrZXkpICYmIGx1YWlfbnVtaXNuYW4oTCwgbnZhbHVlKGtleSkpKQorICAgIGx1YUdfcnVuZXJyb3IoTCwgInRhYmxlIGluZGV4IGlzIE5hTiIpOworICBtcCA9IG1haW5wb3NpdGlvbih0LCBrZXkpOworICBpZiAoIXR0aXNuaWwoZ3ZhbChtcCkpIHx8IGlzZHVtbXkobXApKSB7ICAvKiBtYWluIHBvc2l0aW9uIGlzIHRha2VuPyAqLworICAgIE5vZGUgKm90aGVybjsKKyAgICBOb2RlICpuID0gZ2V0ZnJlZXBvcyh0KTsgIC8qIGdldCBhIGZyZWUgcGxhY2UgKi8KKyAgICBpZiAobiA9PSBOVUxMKSB7ICAvKiBjYW5ub3QgZmluZCBhIGZyZWUgcGxhY2U/ICovCisgICAgICByZWhhc2goTCwgdCwga2V5KTsgIC8qIGdyb3cgdGFibGUgKi8KKyAgICAgIC8qIHdoYXRldmVyIGNhbGxlZCAnbmV3a2V5JyB0YWtlIGNhcmUgb2YgVE0gY2FjaGUgYW5kIEdDIGJhcnJpZXIgKi8KKyAgICAgIHJldHVybiBsdWFIX3NldChMLCB0LCBrZXkpOyAgLyogaW5zZXJ0IGtleSBpbnRvIGdyb3duIHRhYmxlICovCisgICAgfQorICAgIGx1YV9hc3NlcnQoIWlzZHVtbXkobikpOworICAgIG90aGVybiA9IG1haW5wb3NpdGlvbih0LCBna2V5KG1wKSk7CisgICAgaWYgKG90aGVybiAhPSBtcCkgeyAgLyogaXMgY29sbGlkaW5nIG5vZGUgb3V0IG9mIGl0cyBtYWluIHBvc2l0aW9uPyAqLworICAgICAgLyogeWVzOyBtb3ZlIGNvbGxpZGluZyBub2RlIGludG8gZnJlZSBwb3NpdGlvbiAqLworICAgICAgd2hpbGUgKGduZXh0KG90aGVybikgIT0gbXApIG90aGVybiA9IGduZXh0KG90aGVybik7ICAvKiBmaW5kIHByZXZpb3VzICovCisgICAgICBnbmV4dChvdGhlcm4pID0gbjsgIC8qIHJlZG8gdGhlIGNoYWluIHdpdGggYG4nIGluIHBsYWNlIG9mIGBtcCcgKi8KKyAgICAgICpuID0gKm1wOyAgLyogY29weSBjb2xsaWRpbmcgbm9kZSBpbnRvIGZyZWUgcG9zLiAobXAtPm5leHQgYWxzbyBnb2VzKSAqLworICAgICAgZ25leHQobXApID0gTlVMTDsgIC8qIG5vdyBgbXAnIGlzIGZyZWUgKi8KKyAgICAgIHNldG5pbHZhbHVlKGd2YWwobXApKTsKKyAgICB9CisgICAgZWxzZSB7ICAvKiBjb2xsaWRpbmcgbm9kZSBpcyBpbiBpdHMgb3duIG1haW4gcG9zaXRpb24gKi8KKyAgICAgIC8qIG5ldyBub2RlIHdpbGwgZ28gaW50byBmcmVlIHBvc2l0aW9uICovCisgICAgICBnbmV4dChuKSA9IGduZXh0KG1wKTsgIC8qIGNoYWluIG5ldyBwb3NpdGlvbiAqLworICAgICAgZ25leHQobXApID0gbjsKKyAgICAgIG1wID0gbjsKKyAgICB9CisgIH0KKyAgc2V0b2JqMnQoTCwgZ2tleShtcCksIGtleSk7CisgIGx1YUNfYmFycmllcmJhY2soTCwgb2JqMmdjbyh0KSwga2V5KTsKKyAgbHVhX2Fzc2VydCh0dGlzbmlsKGd2YWwobXApKSk7CisgIHJldHVybiBndmFsKG1wKTsKK30KKworCisvKgorKiogc2VhcmNoIGZ1bmN0aW9uIGZvciBpbnRlZ2VycworKi8KK2NvbnN0IFRWYWx1ZSAqbHVhSF9nZXRpbnQgKFRhYmxlICp0LCBpbnQga2V5KSB7CisgIC8qICgxIDw9IGtleSAmJiBrZXkgPD0gdC0+c2l6ZWFycmF5KSAqLworICBpZiAoY2FzdCh1bnNpZ25lZCBpbnQsIGtleS0xKSA8IGNhc3QodW5zaWduZWQgaW50LCB0LT5zaXplYXJyYXkpKQorICAgIHJldHVybiAmdC0+YXJyYXlba2V5LTFdOworICBlbHNlIHsKKyAgICBsdWFfTnVtYmVyIG5rID0gY2FzdF9udW0oa2V5KTsKKyAgICBOb2RlICpuID0gaGFzaG51bSh0LCBuayk7CisgICAgZG8geyAgLyogY2hlY2sgd2hldGhlciBga2V5JyBpcyBzb21ld2hlcmUgaW4gdGhlIGNoYWluICovCisgICAgICBpZiAodHRpc251bWJlcihna2V5KG4pKSAmJiBsdWFpX251bWVxKG52YWx1ZShna2V5KG4pKSwgbmspKQorICAgICAgICByZXR1cm4gZ3ZhbChuKTsgIC8qIHRoYXQncyBpdCAqLworICAgICAgZWxzZSBuID0gZ25leHQobik7CisgICAgfSB3aGlsZSAobik7CisgICAgcmV0dXJuIGx1YU9fbmlsb2JqZWN0OworICB9Cit9CisKKworLyoKKyoqIHNlYXJjaCBmdW5jdGlvbiBmb3Igc2hvcnQgc3RyaW5ncworKi8KK2NvbnN0IFRWYWx1ZSAqbHVhSF9nZXRzdHIgKFRhYmxlICp0LCBUU3RyaW5nICprZXkpIHsKKyAgTm9kZSAqbiA9IGhhc2hzdHIodCwga2V5KTsKKyAgbHVhX2Fzc2VydChrZXktPnRzdi50dCA9PSBMVUFfVFNIUlNUUik7CisgIGRvIHsgIC8qIGNoZWNrIHdoZXRoZXIgYGtleScgaXMgc29tZXdoZXJlIGluIHRoZSBjaGFpbiAqLworICAgIGlmICh0dGlzc2hyc3RyaW5nKGdrZXkobikpICYmIGVxc2hyc3RyKHJhd3RzdmFsdWUoZ2tleShuKSksIGtleSkpCisgICAgICByZXR1cm4gZ3ZhbChuKTsgIC8qIHRoYXQncyBpdCAqLworICAgIGVsc2UgbiA9IGduZXh0KG4pOworICB9IHdoaWxlIChuKTsKKyAgcmV0dXJuIGx1YU9fbmlsb2JqZWN0OworfQorCisKKy8qCisqKiBtYWluIHNlYXJjaCBmdW5jdGlvbgorKi8KK2NvbnN0IFRWYWx1ZSAqbHVhSF9nZXQgKFRhYmxlICp0LCBjb25zdCBUVmFsdWUgKmtleSkgeworICBzd2l0Y2ggKHR0eXBlKGtleSkpIHsKKyAgICBjYXNlIExVQV9UU0hSU1RSOiByZXR1cm4gbHVhSF9nZXRzdHIodCwgcmF3dHN2YWx1ZShrZXkpKTsKKyAgICBjYXNlIExVQV9UTklMOiByZXR1cm4gbHVhT19uaWxvYmplY3Q7CisgICAgY2FzZSBMVUFfVE5VTUJFUjogeworICAgICAgaW50IGs7CisgICAgICBsdWFfTnVtYmVyIG4gPSBudmFsdWUoa2V5KTsKKyAgICAgIGx1YV9udW1iZXIyaW50KGssIG4pOworICAgICAgaWYgKGx1YWlfbnVtZXEoY2FzdF9udW0oayksIG4pKSAvKiBpbmRleCBpcyBpbnQ/ICovCisgICAgICAgIHJldHVybiBsdWFIX2dldGludCh0LCBrKTsgIC8qIHVzZSBzcGVjaWFsaXplZCB2ZXJzaW9uICovCisgICAgICAvKiBlbHNlIGdvIHRocm91Z2ggKi8KKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgTm9kZSAqbiA9IG1haW5wb3NpdGlvbih0LCBrZXkpOworICAgICAgZG8geyAgLyogY2hlY2sgd2hldGhlciBga2V5JyBpcyBzb21ld2hlcmUgaW4gdGhlIGNoYWluICovCisgICAgICAgIGlmIChsdWFWX3Jhd2VxdWFsb2JqKGdrZXkobiksIGtleSkpCisgICAgICAgICAgcmV0dXJuIGd2YWwobik7ICAvKiB0aGF0J3MgaXQgKi8KKyAgICAgICAgZWxzZSBuID0gZ25leHQobik7CisgICAgICB9IHdoaWxlIChuKTsKKyAgICAgIHJldHVybiBsdWFPX25pbG9iamVjdDsKKyAgICB9CisgIH0KK30KKworCisvKgorKiogYmV3YXJlOiB3aGVuIHVzaW5nIHRoaXMgZnVuY3Rpb24geW91IHByb2JhYmx5IG5lZWQgdG8gY2hlY2sgYSBHQworKiogYmFycmllciBhbmQgaW52YWxpZGF0ZSB0aGUgVE0gY2FjaGUuCisqLworVFZhbHVlICpsdWFIX3NldCAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCwgY29uc3QgVFZhbHVlICprZXkpIHsKKyAgY29uc3QgVFZhbHVlICpwID0gbHVhSF9nZXQodCwga2V5KTsKKyAgaWYgKHAgIT0gbHVhT19uaWxvYmplY3QpCisgICAgcmV0dXJuIGNhc3QoVFZhbHVlICosIHApOworICBlbHNlIHJldHVybiBsdWFIX25ld2tleShMLCB0LCBrZXkpOworfQorCisKK3ZvaWQgbHVhSF9zZXRpbnQgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIGludCBrZXksIFRWYWx1ZSAqdmFsdWUpIHsKKyAgY29uc3QgVFZhbHVlICpwID0gbHVhSF9nZXRpbnQodCwga2V5KTsKKyAgVFZhbHVlICpjZWxsOworICBpZiAocCAhPSBsdWFPX25pbG9iamVjdCkKKyAgICBjZWxsID0gY2FzdChUVmFsdWUgKiwgcCk7CisgIGVsc2UgeworICAgIFRWYWx1ZSBrOworICAgIHNldG52YWx1ZSgmaywgY2FzdF9udW0oa2V5KSk7CisgICAgY2VsbCA9IGx1YUhfbmV3a2V5KEwsIHQsICZrKTsKKyAgfQorICBzZXRvYmoydChMLCBjZWxsLCB2YWx1ZSk7Cit9CisKKworc3RhdGljIGludCB1bmJvdW5kX3NlYXJjaCAoVGFibGUgKnQsIHVuc2lnbmVkIGludCBqKSB7CisgIHVuc2lnbmVkIGludCBpID0gajsgIC8qIGkgaXMgemVybyBvciBhIHByZXNlbnQgaW5kZXggKi8KKyAgaisrOworICAvKiBmaW5kIGBpJyBhbmQgYGonIHN1Y2ggdGhhdCBpIGlzIHByZXNlbnQgYW5kIGogaXMgbm90ICovCisgIHdoaWxlICghdHRpc25pbChsdWFIX2dldGludCh0LCBqKSkpIHsKKyAgICBpID0gajsKKyAgICBqICo9IDI7CisgICAgaWYgKGogPiBjYXN0KHVuc2lnbmVkIGludCwgTUFYX0lOVCkpIHsgIC8qIG92ZXJmbG93PyAqLworICAgICAgLyogdGFibGUgd2FzIGJ1aWx0IHdpdGggYmFkIHB1cnBvc2VzOiByZXNvcnQgdG8gbGluZWFyIHNlYXJjaCAqLworICAgICAgaSA9IDE7CisgICAgICB3aGlsZSAoIXR0aXNuaWwobHVhSF9nZXRpbnQodCwgaSkpKSBpKys7CisgICAgICByZXR1cm4gaSAtIDE7CisgICAgfQorICB9CisgIC8qIG5vdyBkbyBhIGJpbmFyeSBzZWFyY2ggYmV0d2VlbiB0aGVtICovCisgIHdoaWxlIChqIC0gaSA+IDEpIHsKKyAgICB1bnNpZ25lZCBpbnQgbSA9IChpK2opLzI7CisgICAgaWYgKHR0aXNuaWwobHVhSF9nZXRpbnQodCwgbSkpKSBqID0gbTsKKyAgICBlbHNlIGkgPSBtOworICB9CisgIHJldHVybiBpOworfQorCisKKy8qCisqKiBUcnkgdG8gZmluZCBhIGJvdW5kYXJ5IGluIHRhYmxlIGB0Jy4gQSBgYm91bmRhcnknIGlzIGFuIGludGVnZXIgaW5kZXgKKyoqIHN1Y2ggdGhhdCB0W2ldIGlzIG5vbi1uaWwgYW5kIHRbaSsxXSBpcyBuaWwgKGFuZCAwIGlmIHRbMV0gaXMgbmlsKS4KKyovCitpbnQgbHVhSF9nZXRuIChUYWJsZSAqdCkgeworICB1bnNpZ25lZCBpbnQgaiA9IHQtPnNpemVhcnJheTsKKyAgaWYgKGogPiAwICYmIHR0aXNuaWwoJnQtPmFycmF5W2ogLSAxXSkpIHsKKyAgICAvKiB0aGVyZSBpcyBhIGJvdW5kYXJ5IGluIHRoZSBhcnJheSBwYXJ0OiAoYmluYXJ5KSBzZWFyY2ggZm9yIGl0ICovCisgICAgdW5zaWduZWQgaW50IGkgPSAwOworICAgIHdoaWxlIChqIC0gaSA+IDEpIHsKKyAgICAgIHVuc2lnbmVkIGludCBtID0gKGkraikvMjsKKyAgICAgIGlmICh0dGlzbmlsKCZ0LT5hcnJheVttIC0gMV0pKSBqID0gbTsKKyAgICAgIGVsc2UgaSA9IG07CisgICAgfQorICAgIHJldHVybiBpOworICB9CisgIC8qIGVsc2UgbXVzdCBmaW5kIGEgYm91bmRhcnkgaW4gaGFzaCBwYXJ0ICovCisgIGVsc2UgaWYgKGlzZHVtbXkodC0+bm9kZSkpICAvKiBoYXNoIHBhcnQgaXMgZW1wdHk/ICovCisgICAgcmV0dXJuIGo7ICAvKiB0aGF0IGlzIGVhc3kuLi4gKi8KKyAgZWxzZSByZXR1cm4gdW5ib3VuZF9zZWFyY2godCwgaik7Cit9CisKKworCisjaWYgZGVmaW5lZChMVUFfREVCVUcpCisKK05vZGUgKmx1YUhfbWFpbnBvc2l0aW9uIChjb25zdCBUYWJsZSAqdCwgY29uc3QgVFZhbHVlICprZXkpIHsKKyAgcmV0dXJuIG1haW5wb3NpdGlvbih0LCBrZXkpOworfQorCitpbnQgbHVhSF9pc2R1bW15IChOb2RlICpuKSB7IHJldHVybiBpc2R1bW15KG4pOyB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sdGFibGUuaCBiL2NvbTMyL2x1YS9zcmMvbHRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5NDQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbHRhYmxlLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyoqICRJZDogbHRhYmxlLmgsdiAyLjE2LjEuMiAyMDEzLzA4LzMwIDE1OjQ5OjQxIHJvYmVydG8gRXhwICQKKyoqIEx1YSB0YWJsZXMgKGhhc2gpCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsdGFibGVfaAorI2RlZmluZSBsdGFibGVfaAorCisjaW5jbHVkZSAibG9iamVjdC5oIgorCisKKyNkZWZpbmUgZ25vZGUodCxpKQkoJih0KS0+bm9kZVtpXSkKKyNkZWZpbmUgZ2tleShuKQkJKCYobiktPmlfa2V5LnR2aykKKyNkZWZpbmUgZ3ZhbChuKQkJKCYobiktPmlfdmFsKQorI2RlZmluZSBnbmV4dChuKQkoKG4pLT5pX2tleS5uay5uZXh0KQorCisjZGVmaW5lIGludmFsaWRhdGVUTWNhY2hlKHQpCSgodCktPmZsYWdzID0gMCkKKworLyogcmV0dXJucyB0aGUga2V5LCBnaXZlbiB0aGUgdmFsdWUgb2YgYSB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBrZXlmcm9tdmFsKHYpIFwKKyAgKGdrZXkoY2FzdChOb2RlICosIGNhc3QoY2hhciAqLCAodikpIC0gb2Zmc2V0b2YoTm9kZSwgaV92YWwpKSkpCisKKworTFVBSV9GVU5DIGNvbnN0IFRWYWx1ZSAqbHVhSF9nZXRpbnQgKFRhYmxlICp0LCBpbnQga2V5KTsKK0xVQUlfRlVOQyB2b2lkIGx1YUhfc2V0aW50IChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBpbnQga2V5LCBUVmFsdWUgKnZhbHVlKTsKK0xVQUlfRlVOQyBjb25zdCBUVmFsdWUgKmx1YUhfZ2V0c3RyIChUYWJsZSAqdCwgVFN0cmluZyAqa2V5KTsKK0xVQUlfRlVOQyBjb25zdCBUVmFsdWUgKmx1YUhfZ2V0IChUYWJsZSAqdCwgY29uc3QgVFZhbHVlICprZXkpOworTFVBSV9GVU5DIFRWYWx1ZSAqbHVhSF9uZXdrZXkgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIGNvbnN0IFRWYWx1ZSAqa2V5KTsKK0xVQUlfRlVOQyBUVmFsdWUgKmx1YUhfc2V0IChsdWFfU3RhdGUgKkwsIFRhYmxlICp0LCBjb25zdCBUVmFsdWUgKmtleSk7CitMVUFJX0ZVTkMgVGFibGUgKmx1YUhfbmV3IChsdWFfU3RhdGUgKkwpOworTFVBSV9GVU5DIHZvaWQgbHVhSF9yZXNpemUgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIGludCBuYXNpemUsIGludCBuaHNpemUpOworTFVBSV9GVU5DIHZvaWQgbHVhSF9yZXNpemVhcnJheSAobHVhX1N0YXRlICpMLCBUYWJsZSAqdCwgaW50IG5hc2l6ZSk7CitMVUFJX0ZVTkMgdm9pZCBsdWFIX2ZyZWUgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQpOworTFVBSV9GVU5DIGludCBsdWFIX25leHQgKGx1YV9TdGF0ZSAqTCwgVGFibGUgKnQsIFN0a0lkIGtleSk7CitMVUFJX0ZVTkMgaW50IGx1YUhfZ2V0biAoVGFibGUgKnQpOworCisKKyNpZiBkZWZpbmVkKExVQV9ERUJVRykKK0xVQUlfRlVOQyBOb2RlICpsdWFIX21haW5wb3NpdGlvbiAoY29uc3QgVGFibGUgKnQsIGNvbnN0IFRWYWx1ZSAqa2V5KTsKK0xVQUlfRlVOQyBpbnQgbHVhSF9pc2R1bW15IChOb2RlICpuKTsKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sdGFibGliLmMgYi9jb20zMi9sdWEvc3JjL2x0YWJsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDAxMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sdGFibGliLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisqKiAkSWQ6IGx0YWJsaWIuYyx2IDEuNjUuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogTGlicmFyeSBmb3IgVGFibGUgTWFuaXB1bGF0aW9uCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNkZWZpbmUgbHRhYmxpYl9jCisjZGVmaW5lIExVQV9MSUIKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGF1eGxpYi5oIgorI2luY2x1ZGUgImx1YWxpYi5oIgorCisKKyNkZWZpbmUgYXV4X2dldG4oTCxuKQkobHVhTF9jaGVja3R5cGUoTCwgbiwgTFVBX1RUQUJMRSksIGx1YUxfbGVuKEwsIG4pKQorCisKKworI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9NQVhOKQorc3RhdGljIGludCBtYXhuIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX051bWJlciBtYXggPSAwOworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgbHVhX3B1c2huaWwoTCk7ICAvKiBmaXJzdCBrZXkgKi8KKyAgd2hpbGUgKGx1YV9uZXh0KEwsIDEpKSB7CisgICAgbHVhX3BvcChMLCAxKTsgIC8qIHJlbW92ZSB2YWx1ZSAqLworICAgIGlmIChsdWFfdHlwZShMLCAtMSkgPT0gTFVBX1ROVU1CRVIpIHsKKyAgICAgIGx1YV9OdW1iZXIgdiA9IGx1YV90b251bWJlcihMLCAtMSk7CisgICAgICBpZiAodiA+IG1heCkgbWF4ID0gdjsKKyAgICB9CisgIH0KKyAgbHVhX3B1c2hudW1iZXIoTCwgbWF4KTsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IHRpbnNlcnQgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgZSA9IGF1eF9nZXRuKEwsIDEpICsgMTsgIC8qIGZpcnN0IGVtcHR5IGVsZW1lbnQgKi8KKyAgaW50IHBvczsgIC8qIHdoZXJlIHRvIGluc2VydCBuZXcgZWxlbWVudCAqLworICBzd2l0Y2ggKGx1YV9nZXR0b3AoTCkpIHsKKyAgICBjYXNlIDI6IHsgIC8qIGNhbGxlZCB3aXRoIG9ubHkgMiBhcmd1bWVudHMgKi8KKyAgICAgIHBvcyA9IGU7ICAvKiBpbnNlcnQgbmV3IGVsZW1lbnQgYXQgdGhlIGVuZCAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMzogeworICAgICAgaW50IGk7CisgICAgICBwb3MgPSBsdWFMX2NoZWNraW50KEwsIDIpOyAgLyogMm5kIGFyZ3VtZW50IGlzIHRoZSBwb3NpdGlvbiAqLworICAgICAgbHVhTF9hcmdjaGVjayhMLCAxIDw9IHBvcyAmJiBwb3MgPD0gZSwgMiwgInBvc2l0aW9uIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIGZvciAoaSA9IGU7IGkgPiBwb3M7IGktLSkgeyAgLyogbW92ZSB1cCBlbGVtZW50cyAqLworICAgICAgICBsdWFfcmF3Z2V0aShMLCAxLCBpLTEpOworICAgICAgICBsdWFfcmF3c2V0aShMLCAxLCBpKTsgIC8qIHRbaV0gPSB0W2ktMV0gKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXR1cm4gbHVhTF9lcnJvcihMLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byAiIExVQV9RTCgiaW5zZXJ0IikpOworICAgIH0KKyAgfQorICBsdWFfcmF3c2V0aShMLCAxLCBwb3MpOyAgLyogdFtwb3NdID0gdiAqLworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHRyZW1vdmUgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgc2l6ZSA9IGF1eF9nZXRuKEwsIDEpOworICBpbnQgcG9zID0gbHVhTF9vcHRpbnQoTCwgMiwgc2l6ZSk7CisgIGlmIChwb3MgIT0gc2l6ZSkgIC8qIHZhbGlkYXRlICdwb3MnIGlmIGdpdmVuICovCisgICAgbHVhTF9hcmdjaGVjayhMLCAxIDw9IHBvcyAmJiBwb3MgPD0gc2l6ZSArIDEsIDEsICJwb3NpdGlvbiBvdXQgb2YgYm91bmRzIik7CisgIGx1YV9yYXdnZXRpKEwsIDEsIHBvcyk7ICAvKiByZXN1bHQgPSB0W3Bvc10gKi8KKyAgZm9yICggOyBwb3MgPCBzaXplOyBwb3MrKykgeworICAgIGx1YV9yYXdnZXRpKEwsIDEsIHBvcysxKTsKKyAgICBsdWFfcmF3c2V0aShMLCAxLCBwb3MpOyAgLyogdFtwb3NdID0gdFtwb3MrMV0gKi8KKyAgfQorICBsdWFfcHVzaG5pbChMKTsKKyAgbHVhX3Jhd3NldGkoTCwgMSwgcG9zKTsgIC8qIHRbcG9zXSA9IG5pbCAqLworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgdm9pZCBhZGRmaWVsZCAobHVhX1N0YXRlICpMLCBsdWFMX0J1ZmZlciAqYiwgaW50IGkpIHsKKyAgbHVhX3Jhd2dldGkoTCwgMSwgaSk7CisgIGlmICghbHVhX2lzc3RyaW5nKEwsIC0xKSkKKyAgICBsdWFMX2Vycm9yKEwsICJpbnZhbGlkIHZhbHVlICglcykgYXQgaW5kZXggJWQgaW4gdGFibGUgZm9yICIKKyAgICAgICAgICAgICAgICAgIExVQV9RTCgiY29uY2F0IiksIGx1YUxfdHlwZW5hbWUoTCwgLTEpLCBpKTsKKyAgbHVhTF9hZGR2YWx1ZShiKTsKK30KKworCitzdGF0aWMgaW50IHRjb25jYXQgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX0J1ZmZlciBiOworICBzaXplX3QgbHNlcDsKKyAgaW50IGksIGxhc3Q7CisgIGNvbnN0IGNoYXIgKnNlcCA9IGx1YUxfb3B0bHN0cmluZyhMLCAyLCAiIiwgJmxzZXApOworICBsdWFMX2NoZWNrdHlwZShMLCAxLCBMVUFfVFRBQkxFKTsKKyAgaSA9IGx1YUxfb3B0aW50KEwsIDMsIDEpOworICBsYXN0ID0gbHVhTF9vcHQoTCwgbHVhTF9jaGVja2ludCwgNCwgbHVhTF9sZW4oTCwgMSkpOworICBsdWFMX2J1ZmZpbml0KEwsICZiKTsKKyAgZm9yICg7IGkgPCBsYXN0OyBpKyspIHsKKyAgICBhZGRmaWVsZChMLCAmYiwgaSk7CisgICAgbHVhTF9hZGRsc3RyaW5nKCZiLCBzZXAsIGxzZXApOworICB9CisgIGlmIChpID09IGxhc3QpICAvKiBhZGQgbGFzdCB2YWx1ZSAoaWYgaW50ZXJ2YWwgd2FzIG5vdCBlbXB0eSkgKi8KKyAgICBhZGRmaWVsZChMLCAmYiwgaSk7CisgIGx1YUxfcHVzaHJlc3VsdCgmYik7CisgIHJldHVybiAxOworfQorCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBQYWNrL3VucGFjaworKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIGludCBwYWNrIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IG4gPSBsdWFfZ2V0dG9wKEwpOyAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHBhY2sgKi8KKyAgbHVhX2NyZWF0ZXRhYmxlKEwsIG4sIDEpOyAgLyogY3JlYXRlIHJlc3VsdCB0YWJsZSAqLworICBsdWFfcHVzaGludGVnZXIoTCwgbik7CisgIGx1YV9zZXRmaWVsZChMLCAtMiwgIm4iKTsgIC8qIHQubiA9IG51bWJlciBvZiBlbGVtZW50cyAqLworICBpZiAobiA+IDApIHsgIC8qIGF0IGxlYXN0IG9uZSBlbGVtZW50PyAqLworICAgIGludCBpOworICAgIGx1YV9wdXNodmFsdWUoTCwgMSk7CisgICAgbHVhX3Jhd3NldGkoTCwgLTIsIDEpOyAgLyogaW5zZXJ0IGZpcnN0IGVsZW1lbnQgKi8KKyAgICBsdWFfcmVwbGFjZShMLCAxKTsgIC8qIG1vdmUgdGFibGUgaW50byBpbmRleCAxICovCisgICAgZm9yIChpID0gbjsgaSA+PSAyOyBpLS0pICAvKiBhc3NpZ24gb3RoZXIgZWxlbWVudHMgKi8KKyAgICAgIGx1YV9yYXdzZXRpKEwsIDEsIGkpOworICB9CisgIHJldHVybiAxOyAgLyogcmV0dXJuIHRhYmxlICovCit9CisKKworc3RhdGljIGludCB1bnBhY2sgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgaSwgZSwgbjsKKyAgbHVhTF9jaGVja3R5cGUoTCwgMSwgTFVBX1RUQUJMRSk7CisgIGkgPSBsdWFMX29wdGludChMLCAyLCAxKTsKKyAgZSA9IGx1YUxfb3B0KEwsIGx1YUxfY2hlY2tpbnQsIDMsIGx1YUxfbGVuKEwsIDEpKTsKKyAgaWYgKGkgPiBlKSByZXR1cm4gMDsgIC8qIGVtcHR5IHJhbmdlICovCisgIG4gPSBlIC0gaSArIDE7ICAvKiBudW1iZXIgb2YgZWxlbWVudHMgKi8KKyAgaWYgKG4gPD0gMCB8fCAhbHVhX2NoZWNrc3RhY2soTCwgbikpICAvKiBuIDw9IDAgbWVhbnMgYXJpdGguIG92ZXJmbG93ICovCisgICAgcmV0dXJuIGx1YUxfZXJyb3IoTCwgInRvbyBtYW55IHJlc3VsdHMgdG8gdW5wYWNrIik7CisgIGx1YV9yYXdnZXRpKEwsIDEsIGkpOyAgLyogcHVzaCBhcmdbaV0gKGF2b2lkaW5nIG92ZXJmbG93IHByb2JsZW1zKSAqLworICB3aGlsZSAoaSsrIDwgZSkgIC8qIHB1c2ggYXJnW2kgKyAxLi4uZV0gKi8KKyAgICBsdWFfcmF3Z2V0aShMLCAxLCBpKTsKKyAgcmV0dXJuIG47Cit9CisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBRdWlja3NvcnQKKyoqIChiYXNlZCBvbiBgQWxnb3JpdGhtcyBpbiBNT0RVTEEtMycsIFJvYmVydCBTZWRnZXdpY2s7CisqKiAgQWRkaXNvbi1XZXNsZXksIDE5OTMuKQorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCitzdGF0aWMgdm9pZCBzZXQyIChsdWFfU3RhdGUgKkwsIGludCBpLCBpbnQgaikgeworICBsdWFfcmF3c2V0aShMLCAxLCBpKTsKKyAgbHVhX3Jhd3NldGkoTCwgMSwgaik7Cit9CisKK3N0YXRpYyBpbnQgc29ydF9jb21wIChsdWFfU3RhdGUgKkwsIGludCBhLCBpbnQgYikgeworICBpZiAoIWx1YV9pc25pbChMLCAyKSkgeyAgLyogZnVuY3Rpb24/ICovCisgICAgaW50IHJlczsKKyAgICBsdWFfcHVzaHZhbHVlKEwsIDIpOworICAgIGx1YV9wdXNodmFsdWUoTCwgYS0xKTsgIC8qIC0xIHRvIGNvbXBlbnNhdGUgZnVuY3Rpb24gKi8KKyAgICBsdWFfcHVzaHZhbHVlKEwsIGItMik7ICAvKiAtMiB0byBjb21wZW5zYXRlIGZ1bmN0aW9uIGFuZCBgYScgKi8KKyAgICBsdWFfY2FsbChMLCAyLCAxKTsKKyAgICByZXMgPSBsdWFfdG9ib29sZWFuKEwsIC0xKTsKKyAgICBsdWFfcG9wKEwsIDEpOworICAgIHJldHVybiByZXM7CisgIH0KKyAgZWxzZSAgLyogYSA8IGI/ICovCisgICAgcmV0dXJuIGx1YV9jb21wYXJlKEwsIGEsIGIsIExVQV9PUExUKTsKK30KKworc3RhdGljIHZvaWQgYXV4c29ydCAobHVhX1N0YXRlICpMLCBpbnQgbCwgaW50IHUpIHsKKyAgd2hpbGUgKGwgPCB1KSB7ICAvKiBmb3IgdGFpbCByZWN1cnNpb24gKi8KKyAgICBpbnQgaSwgajsKKyAgICAvKiBzb3J0IGVsZW1lbnRzIGFbbF0sIGFbKGwrdSkvMl0gYW5kIGFbdV0gKi8KKyAgICBsdWFfcmF3Z2V0aShMLCAxLCBsKTsKKyAgICBsdWFfcmF3Z2V0aShMLCAxLCB1KTsKKyAgICBpZiAoc29ydF9jb21wKEwsIC0xLCAtMikpICAvKiBhW3VdIDwgYVtsXT8gKi8KKyAgICAgIHNldDIoTCwgbCwgdSk7ICAvKiBzd2FwIGFbbF0gLSBhW3VdICovCisgICAgZWxzZQorICAgICAgbHVhX3BvcChMLCAyKTsKKyAgICBpZiAodS1sID09IDEpIGJyZWFrOyAgLyogb25seSAyIGVsZW1lbnRzICovCisgICAgaSA9IChsK3UpLzI7CisgICAgbHVhX3Jhd2dldGkoTCwgMSwgaSk7CisgICAgbHVhX3Jhd2dldGkoTCwgMSwgbCk7CisgICAgaWYgKHNvcnRfY29tcChMLCAtMiwgLTEpKSAgLyogYVtpXTxhW2xdPyAqLworICAgICAgc2V0MihMLCBpLCBsKTsKKyAgICBlbHNlIHsKKyAgICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgYVtsXSAqLworICAgICAgbHVhX3Jhd2dldGkoTCwgMSwgdSk7CisgICAgICBpZiAoc29ydF9jb21wKEwsIC0xLCAtMikpICAvKiBhW3VdPGFbaV0/ICovCisgICAgICAgIHNldDIoTCwgaSwgdSk7CisgICAgICBlbHNlCisgICAgICAgIGx1YV9wb3AoTCwgMik7CisgICAgfQorICAgIGlmICh1LWwgPT0gMikgYnJlYWs7ICAvKiBvbmx5IDMgZWxlbWVudHMgKi8KKyAgICBsdWFfcmF3Z2V0aShMLCAxLCBpKTsgIC8qIFBpdm90ICovCisgICAgbHVhX3B1c2h2YWx1ZShMLCAtMSk7CisgICAgbHVhX3Jhd2dldGkoTCwgMSwgdS0xKTsKKyAgICBzZXQyKEwsIGksIHUtMSk7CisgICAgLyogYVtsXSA8PSBQID09IGFbdS0xXSA8PSBhW3VdLCBvbmx5IG5lZWQgdG8gc29ydCBmcm9tIGwrMSB0byB1LTIgKi8KKyAgICBpID0gbDsgaiA9IHUtMTsKKyAgICBmb3IgKDs7KSB7ICAvKiBpbnZhcmlhbnQ6IGFbbC4uaV0gPD0gUCA8PSBhW2ouLnVdICovCisgICAgICAvKiByZXBlYXQgKytpIHVudGlsIGFbaV0gPj0gUCAqLworICAgICAgd2hpbGUgKGx1YV9yYXdnZXRpKEwsIDEsICsraSksIHNvcnRfY29tcChMLCAtMSwgLTIpKSB7CisgICAgICAgIGlmIChpPj11KSBsdWFMX2Vycm9yKEwsICJpbnZhbGlkIG9yZGVyIGZ1bmN0aW9uIGZvciBzb3J0aW5nIik7CisgICAgICAgIGx1YV9wb3AoTCwgMSk7ICAvKiByZW1vdmUgYVtpXSAqLworICAgICAgfQorICAgICAgLyogcmVwZWF0IC0taiB1bnRpbCBhW2pdIDw9IFAgKi8KKyAgICAgIHdoaWxlIChsdWFfcmF3Z2V0aShMLCAxLCAtLWopLCBzb3J0X2NvbXAoTCwgLTMsIC0xKSkgeworICAgICAgICBpZiAoajw9bCkgbHVhTF9lcnJvcihMLCAiaW52YWxpZCBvcmRlciBmdW5jdGlvbiBmb3Igc29ydGluZyIpOworICAgICAgICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIGFbal0gKi8KKyAgICAgIH0KKyAgICAgIGlmIChqPGkpIHsKKyAgICAgICAgbHVhX3BvcChMLCAzKTsgIC8qIHBvcCBwaXZvdCwgYVtpXSwgYVtqXSAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNldDIoTCwgaSwgaik7CisgICAgfQorICAgIGx1YV9yYXdnZXRpKEwsIDEsIHUtMSk7CisgICAgbHVhX3Jhd2dldGkoTCwgMSwgaSk7CisgICAgc2V0MihMLCB1LTEsIGkpOyAgLyogc3dhcCBwaXZvdCAoYVt1LTFdKSB3aXRoIGFbaV0gKi8KKyAgICAvKiBhW2wuLmktMV0gPD0gYVtpXSA9PSBQIDw9IGFbaSsxLi51XSAqLworICAgIC8qIGFkanVzdCBzbyB0aGF0IHNtYWxsZXIgaGFsZiBpcyBpbiBbai4uaV0gYW5kIGxhcmdlciBvbmUgaW4gW2wuLnVdICovCisgICAgaWYgKGktbCA8IHUtaSkgeworICAgICAgaj1sOyBpPWktMTsgbD1pKzI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaj1pKzE7IGk9dTsgdT1qLTI7CisgICAgfQorICAgIGF1eHNvcnQoTCwgaiwgaSk7ICAvKiBjYWxsIHJlY3Vyc2l2ZWx5IHRoZSBzbWFsbGVyIG9uZSAqLworICB9ICAvKiByZXBlYXQgdGhlIHJvdXRpbmUgZm9yIHRoZSBsYXJnZXIgb25lICovCit9CisKK3N0YXRpYyBpbnQgc29ydCAobHVhX1N0YXRlICpMKSB7CisgIGludCBuID0gYXV4X2dldG4oTCwgMSk7CisgIGx1YUxfY2hlY2tzdGFjayhMLCA0MCwgIiIpOyAgLyogYXNzdW1lIGFycmF5IGlzIHNtYWxsZXIgdGhhbiAyXjQwICovCisgIGlmICghbHVhX2lzbm9uZW9ybmlsKEwsIDIpKSAgLyogaXMgdGhlcmUgYSAybmQgYXJndW1lbnQ/ICovCisgICAgbHVhTF9jaGVja3R5cGUoTCwgMiwgTFVBX1RGVU5DVElPTik7CisgIGx1YV9zZXR0b3AoTCwgMik7ICAvKiBtYWtlIHN1cmUgdGhlcmUgaXMgdHdvIGFyZ3VtZW50cyAqLworICBhdXhzb3J0KEwsIDEsIG4pOworICByZXR1cm4gMDsKK30KKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyB0YWJfZnVuY3NbXSA9IHsKKyAgeyJjb25jYXQiLCB0Y29uY2F0fSwKKyNpZiBkZWZpbmVkKExVQV9DT01QQVRfTUFYTikKKyAgeyJtYXhuIiwgbWF4bn0sCisjZW5kaWYKKyAgeyJpbnNlcnQiLCB0aW5zZXJ0fSwKKyAgeyJwYWNrIiwgcGFja30sCisgIHsidW5wYWNrIiwgdW5wYWNrfSwKKyAgeyJyZW1vdmUiLCB0cmVtb3ZlfSwKKyAgeyJzb3J0Iiwgc29ydH0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworCitMVUFNT0RfQVBJIGludCBsdWFvcGVuX3RhYmxlIChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9uZXdsaWIoTCwgdGFiX2Z1bmNzKTsKKyNpZiBkZWZpbmVkKExVQV9DT01QQVRfVU5QQUNLKQorICAvKiBfRy51bnBhY2sgPSB0YWJsZS51bnBhY2sgKi8KKyAgbHVhX2dldGZpZWxkKEwsIC0xLCAidW5wYWNrIik7CisgIGx1YV9zZXRnbG9iYWwoTCwgInVucGFjayIpOworI2VuZGlmCisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2x0bS5jIGIvY29tMzIvbHVhL3NyYy9sdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI0ZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sdG0uYwpAQCAtMCwwICsxLDc3IEBACisvKgorKiogJElkOiBsdG0uYyx2IDIuMTQuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogVGFnIG1ldGhvZHMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsdG1fYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHN0YXRlLmgiCisjaW5jbHVkZSAibHN0cmluZy5oIgorI2luY2x1ZGUgImx0YWJsZS5oIgorI2luY2x1ZGUgImx0bS5oIgorCisKK3N0YXRpYyBjb25zdCBjaGFyIHVkYXRhdHlwZW5hbWVbXSA9ICJ1c2VyZGF0YSI7CisKK0xVQUlfRERFRiBjb25zdCBjaGFyICpjb25zdCBsdWFUX3R5cGVuYW1lc19bTFVBX1RPVEFMVEFHU10gPSB7CisgICJubyB2YWx1ZSIsCisgICJuaWwiLCAiYm9vbGVhbiIsIHVkYXRhdHlwZW5hbWUsICJudW1iZXIiLAorICAic3RyaW5nIiwgInRhYmxlIiwgImZ1bmN0aW9uIiwgdWRhdGF0eXBlbmFtZSwgInRocmVhZCIsCisgICJwcm90byIsICJ1cHZhbCIgIC8qIHRoZXNlIGxhc3QgdHdvIGNhc2VzIGFyZSB1c2VkIGZvciB0ZXN0cyBvbmx5ICovCit9OworCisKK3ZvaWQgbHVhVF9pbml0IChsdWFfU3RhdGUgKkwpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGx1YVRfZXZlbnRuYW1lW10gPSB7ICAvKiBPUkRFUiBUTSAqLworICAgICJfX2luZGV4IiwgIl9fbmV3aW5kZXgiLAorICAgICJfX2djIiwgIl9fbW9kZSIsICJfX2xlbiIsICJfX2VxIiwKKyAgICAiX19hZGQiLCAiX19zdWIiLCAiX19tdWwiLCAiX19kaXYiLCAiX19tb2QiLAorICAgICJfX3BvdyIsICJfX3VubSIsICJfX2x0IiwgIl9fbGUiLAorICAgICJfX2NvbmNhdCIsICJfX2NhbGwiCisgIH07CisgIGludCBpOworICBmb3IgKGk9MDsgaTxUTV9OOyBpKyspIHsKKyAgICBHKEwpLT50bW5hbWVbaV0gPSBsdWFTX25ldyhMLCBsdWFUX2V2ZW50bmFtZVtpXSk7CisgICAgbHVhU19maXgoRyhMKS0+dG1uYW1lW2ldKTsgIC8qIG5ldmVyIGNvbGxlY3QgdGhlc2UgbmFtZXMgKi8KKyAgfQorfQorCisKKy8qCisqKiBmdW5jdGlvbiB0byBiZSB1c2VkIHdpdGggbWFjcm8gImZhc3R0bSI6IG9wdGltaXplZCBmb3IgYWJzZW5jZSBvZgorKiogdGFnIG1ldGhvZHMKKyovCitjb25zdCBUVmFsdWUgKmx1YVRfZ2V0dG0gKFRhYmxlICpldmVudHMsIFRNUyBldmVudCwgVFN0cmluZyAqZW5hbWUpIHsKKyAgY29uc3QgVFZhbHVlICp0bSA9IGx1YUhfZ2V0c3RyKGV2ZW50cywgZW5hbWUpOworICBsdWFfYXNzZXJ0KGV2ZW50IDw9IFRNX0VRKTsKKyAgaWYgKHR0aXNuaWwodG0pKSB7ICAvKiBubyB0YWcgbWV0aG9kPyAqLworICAgIGV2ZW50cy0+ZmxhZ3MgfD0gY2FzdF9ieXRlKDF1PDxldmVudCk7ICAvKiBjYWNoZSB0aGlzIGZhY3QgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIHJldHVybiB0bTsKK30KKworCitjb25zdCBUVmFsdWUgKmx1YVRfZ2V0dG1ieW9iaiAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKm8sIFRNUyBldmVudCkgeworICBUYWJsZSAqbXQ7CisgIHN3aXRjaCAodHR5cGVudihvKSkgeworICAgIGNhc2UgTFVBX1RUQUJMRToKKyAgICAgIG10ID0gaHZhbHVlKG8pLT5tZXRhdGFibGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIExVQV9UVVNFUkRBVEE6CisgICAgICBtdCA9IHV2YWx1ZShvKS0+bWV0YXRhYmxlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG10ID0gRyhMKS0+bXRbdHR5cGVudihvKV07CisgIH0KKyAgcmV0dXJuIChtdCA/IGx1YUhfZ2V0c3RyKG10LCBHKEwpLT50bW5hbWVbZXZlbnRdKSA6IGx1YU9fbmlsb2JqZWN0KTsKK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sdG0uaCBiL2NvbTMyL2x1YS9zcmMvbHRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4OWM4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbHRtLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyoqICRJZDogbHRtLmgsdiAyLjExLjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIFRhZyBtZXRob2RzCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsdG1faAorI2RlZmluZSBsdG1faAorCisKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisKKworLyoKKyogV0FSTklORzogaWYgeW91IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhpcyBlbnVtZXJhdGlvbiwKKyogZ3JlcCAiT1JERVIgVE0iCisqLwordHlwZWRlZiBlbnVtIHsKKyAgVE1fSU5ERVgsCisgIFRNX05FV0lOREVYLAorICBUTV9HQywKKyAgVE1fTU9ERSwKKyAgVE1fTEVOLAorICBUTV9FUSwgIC8qIGxhc3QgdGFnIG1ldGhvZCB3aXRoIGBmYXN0JyBhY2Nlc3MgKi8KKyAgVE1fQURELAorICBUTV9TVUIsCisgIFRNX01VTCwKKyAgVE1fRElWLAorICBUTV9NT0QsCisgIFRNX1BPVywKKyAgVE1fVU5NLAorICBUTV9MVCwKKyAgVE1fTEUsCisgIFRNX0NPTkNBVCwKKyAgVE1fQ0FMTCwKKyAgVE1fTgkJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBlbnVtICovCit9IFRNUzsKKworCisKKyNkZWZpbmUgZ2Zhc3R0bShnLGV0LGUpICgoZXQpID09IE5VTEwgPyBOVUxMIDogXAorICAoKGV0KS0+ZmxhZ3MgJiAoMXU8PChlKSkpID8gTlVMTCA6IGx1YVRfZ2V0dG0oZXQsIGUsIChnKS0+dG1uYW1lW2VdKSkKKworI2RlZmluZSBmYXN0dG0obCxldCxlKQlnZmFzdHRtKEcobCksIGV0LCBlKQorCisjZGVmaW5lIHR0eXBlbmFtZSh4KQlsdWFUX3R5cGVuYW1lc19bKHgpICsgMV0KKyNkZWZpbmUgb2JqdHlwZW5hbWUoeCkJdHR5cGVuYW1lKHR0eXBlbnYoeCkpCisKK0xVQUlfRERFQyBjb25zdCBjaGFyICpjb25zdCBsdWFUX3R5cGVuYW1lc19bTFVBX1RPVEFMVEFHU107CisKKworTFVBSV9GVU5DIGNvbnN0IFRWYWx1ZSAqbHVhVF9nZXR0bSAoVGFibGUgKmV2ZW50cywgVE1TIGV2ZW50LCBUU3RyaW5nICplbmFtZSk7CitMVUFJX0ZVTkMgY29uc3QgVFZhbHVlICpsdWFUX2dldHRtYnlvYmogKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNUyBldmVudCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFUX2luaXQgKGx1YV9TdGF0ZSAqTCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sdWEuYyBiL2NvbTMyL2x1YS9zcmMvbHVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyY2ZlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbHVhLmMKQEAgLTAsMCArMSw1MDcgQEAKKy8qCisqKiAkSWQ6IGx1YS5jLHYgMS4yMDYuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogTHVhIHN0YW5kLWFsb25lIGludGVycHJldGVyCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaWZkZWYgU1lTTElOVVgKKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjZGVmaW5lIHNpZ25hbCh4LHkpCisjZWxzZQorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsdWFfYworCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsYXV4bGliLmgiCisjaW5jbHVkZSAibHVhbGliLmgiCisKKworI2lmICFkZWZpbmVkKExVQV9QUk9NUFQpCisjZGVmaW5lIExVQV9QUk9NUFQJCSI+ICIKKyNkZWZpbmUgTFVBX1BST01QVDIJCSI+PiAiCisjZW5kaWYKKworI2lmICFkZWZpbmVkKExVQV9QUk9HTkFNRSkKKyNkZWZpbmUgTFVBX1BST0dOQU1FCQkibHVhIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChMVUFfTUFYSU5QVVQpCisjZGVmaW5lIExVQV9NQVhJTlBVVAkJNTEyCisjZW5kaWYKKworI2lmICFkZWZpbmVkKExVQV9JTklUKQorI2RlZmluZSBMVUFfSU5JVAkJIkxVQV9JTklUIgorI2VuZGlmCisKKyNkZWZpbmUgTFVBX0lOSVRWRVJTSU9OICBcCisJTFVBX0lOSVQgIl8iIExVQV9WRVJTSU9OX01BSk9SICJfIiBMVUFfVkVSU0lPTl9NSU5PUgorCisKKy8qCisqKiBsdWFfc3RkaW5faXNfdHR5IGRldGVjdHMgd2hldGhlciB0aGUgc3RhbmRhcmQgaW5wdXQgaXMgYSAndHR5JyAodGhhdAorKiogaXMsIHdoZXRoZXIgd2UncmUgcnVubmluZyBsdWEgaW50ZXJhY3RpdmVseSkuCisqLworI2lmIGRlZmluZWQoTFVBX1VTRV9JU0FUVFkpCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZGVmaW5lIGx1YV9zdGRpbl9pc190dHkoKQlpc2F0dHkoMCkKKyNlbGlmIGRlZmluZWQoTFVBX1dJTikKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIGx1YV9zdGRpbl9pc190dHkoKQlfaXNhdHR5KF9maWxlbm8oc3RkaW4pKQorI2Vsc2UKKyNkZWZpbmUgbHVhX3N0ZGluX2lzX3R0eSgpCTEgIC8qIGFzc3VtZSBzdGRpbiBpcyBhIHR0eSAqLworI2VuZGlmCisKKworLyoKKyoqIGx1YV9yZWFkbGluZSBkZWZpbmVzIGhvdyB0byBzaG93IGEgcHJvbXB0IGFuZCB0aGVuIHJlYWQgYSBsaW5lIGZyb20KKyoqIHRoZSBzdGFuZGFyZCBpbnB1dC4KKyoqIGx1YV9zYXZlbGluZSBkZWZpbmVzIGhvdyB0byAic2F2ZSIgYSByZWFkIGxpbmUgaW4gYSAiaGlzdG9yeSIuCisqKiBsdWFfZnJlZWxpbmUgZGVmaW5lcyBob3cgdG8gZnJlZSBhIGxpbmUgcmVhZCBieSBsdWFfcmVhZGxpbmUuCisqLworI2lmIGRlZmluZWQoTFVBX1VTRV9SRUFETElORSkKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKyNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+CisjZGVmaW5lIGx1YV9yZWFkbGluZShMLGIscCkJKCh2b2lkKUwsICgoYik9cmVhZGxpbmUocCkpICE9IE5VTEwpCisjZGVmaW5lIGx1YV9zYXZlbGluZShMLGlkeCkgXAorICAgICAgICBpZiAobHVhX3Jhd2xlbihMLGlkeCkgPiAwKSAgLyogbm9uLWVtcHR5IGxpbmU/ICovIFwKKyAgICAgICAgICBhZGRfaGlzdG9yeShsdWFfdG9zdHJpbmcoTCwgaWR4KSk7ICAvKiBhZGQgaXQgdG8gaGlzdG9yeSAqLworI2RlZmluZSBsdWFfZnJlZWxpbmUoTCxiKQkoKHZvaWQpTCwgZnJlZShiKSkKKworI2VsaWYgIWRlZmluZWQobHVhX3JlYWRsaW5lKQorCisjZGVmaW5lIGx1YV9yZWFkbGluZShMLGIscCkgXAorICAgICAgICAoKHZvaWQpTCwgZnB1dHMocCwgc3Rkb3V0KSwgZmZsdXNoKHN0ZG91dCksICAvKiBzaG93IHByb21wdCAqLyBcCisgICAgICAgIGZnZXRzKGIsIExVQV9NQVhJTlBVVCwgc3RkaW4pICE9IE5VTEwpICAvKiBnZXQgbGluZSAqLworI2RlZmluZSBsdWFfc2F2ZWxpbmUoTCxpZHgpCXsgKHZvaWQpTDsgKHZvaWQpaWR4OyB9CisjZGVmaW5lIGx1YV9mcmVlbGluZShMLGIpCXsgKHZvaWQpTDsgKHZvaWQpYjsgfQorCisjZW5kaWYKKworCisKKworc3RhdGljIGx1YV9TdGF0ZSAqZ2xvYmFsTCA9IE5VTEw7CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9nbmFtZSA9IExVQV9QUk9HTkFNRTsKKworCisKKyNpZm5kZWYgU1lTTElOVVgKK3N0YXRpYyB2b2lkIGxzdG9wIChsdWFfU3RhdGUgKkwsIGx1YV9EZWJ1ZyAqYXIpIHsKKyAgKHZvaWQpYXI7ICAvKiB1bnVzZWQgYXJnLiAqLworICBsdWFfc2V0aG9vayhMLCBOVUxMLCAwLCAwKTsKKyAgbHVhTF9lcnJvcihMLCAiaW50ZXJydXB0ZWQhIik7Cit9CisKKworc3RhdGljIHZvaWQgbGFjdGlvbiAoaW50IGkpIHsKKyAgc2lnbmFsKGksIFNJR19ERkwpOyAvKiBpZiBhbm90aGVyIFNJR0lOVCBoYXBwZW5zIGJlZm9yZSBsc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZSBwcm9jZXNzIChkZWZhdWx0IGFjdGlvbikgKi8KKyAgbHVhX3NldGhvb2soZ2xvYmFsTCwgbHN0b3AsIExVQV9NQVNLQ0FMTCB8IExVQV9NQVNLUkVUIHwgTFVBX01BU0tDT1VOVCwgMSk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBwcmludF91c2FnZSAoY29uc3QgY2hhciAqYmFkb3B0aW9uKSB7CisgIGx1YWlfd3JpdGVzdHJpbmdlcnJvcigiJXM6ICIsIHByb2duYW1lKTsKKyAgaWYgKGJhZG9wdGlvblsxXSA9PSAnZScgfHwgYmFkb3B0aW9uWzFdID09ICdsJykKKyAgICBsdWFpX3dyaXRlc3RyaW5nZXJyb3IoIiclcycgbmVlZHMgYXJndW1lbnRcbiIsIGJhZG9wdGlvbik7CisgIGVsc2UKKyAgICBsdWFpX3dyaXRlc3RyaW5nZXJyb3IoInVucmVjb2duaXplZCBvcHRpb24gJyVzJ1xuIiwgYmFkb3B0aW9uKTsKKyAgbHVhaV93cml0ZXN0cmluZ2Vycm9yKAorICAidXNhZ2U6ICVzIFtvcHRpb25zXSBbc2NyaXB0IFthcmdzXV1cbiIKKyAgIkF2YWlsYWJsZSBvcHRpb25zIGFyZTpcbiIKKyAgIiAgLWUgc3RhdCAgZXhlY3V0ZSBzdHJpbmcgIiBMVUFfUUwoInN0YXQiKSAiXG4iCisgICIgIC1pICAgICAgIGVudGVyIGludGVyYWN0aXZlIG1vZGUgYWZ0ZXIgZXhlY3V0aW5nICIgTFVBX1FMKCJzY3JpcHQiKSAiXG4iCisgICIgIC1sIG5hbWUgIHJlcXVpcmUgbGlicmFyeSAiIExVQV9RTCgibmFtZSIpICJcbiIKKyAgIiAgLXYgICAgICAgc2hvdyB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCisgICIgIC1FICAgICAgIGlnbm9yZSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiIKKyAgIiAgLS0gICAgICAgc3RvcCBoYW5kbGluZyBvcHRpb25zXG4iCisgICIgIC0gICAgICAgIHN0b3AgaGFuZGxpbmcgb3B0aW9ucyBhbmQgZXhlY3V0ZSBzdGRpblxuIgorICAsCisgIHByb2duYW1lKTsKK30KKworCitzdGF0aWMgdm9pZCBsX21lc3NhZ2UgKGNvbnN0IGNoYXIgKnBuYW1lLCBjb25zdCBjaGFyICptc2cpIHsKKyAgaWYgKHBuYW1lKSBsdWFpX3dyaXRlc3RyaW5nZXJyb3IoIiVzOiAiLCBwbmFtZSk7CisgIGx1YWlfd3JpdGVzdHJpbmdlcnJvcigiJXNcbiIsIG1zZyk7Cit9CisKKworc3RhdGljIGludCByZXBvcnQgKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXR1cykgeworICBpZiAoc3RhdHVzICE9IExVQV9PSyAmJiAhbHVhX2lzbmlsKEwsIC0xKSkgeworICAgIGNvbnN0IGNoYXIgKm1zZyA9IGx1YV90b3N0cmluZyhMLCAtMSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKSBtc2cgPSAiKGVycm9yIG9iamVjdCBpcyBub3QgYSBzdHJpbmcpIjsKKyAgICBsX21lc3NhZ2UocHJvZ25hbWUsIG1zZyk7CisgICAgbHVhX3BvcChMLCAxKTsKKyAgICAvKiBmb3JjZSBhIGNvbXBsZXRlIGdhcmJhZ2UgY29sbGVjdGlvbiBpbiBjYXNlIG9mIGVycm9ycyAqLworICAgIGx1YV9nYyhMLCBMVUFfR0NDT0xMRUNULCAwKTsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qIHRoZSBuZXh0IGZ1bmN0aW9uIGlzIGNhbGxlZCB1bnByb3RlY3RlZCwgc28gaXQgbXVzdCBhdm9pZCBlcnJvcnMgKi8KK3N0YXRpYyB2b2lkIGZpbmFscmVwb3J0IChsdWFfU3RhdGUgKkwsIGludCBzdGF0dXMpIHsKKyAgaWYgKHN0YXR1cyAhPSBMVUFfT0spIHsKKyAgICBjb25zdCBjaGFyICptc2cgPSAobHVhX3R5cGUoTCwgLTEpID09IExVQV9UU1RSSU5HKSA/IGx1YV90b3N0cmluZyhMLCAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgaWYgKG1zZyA9PSBOVUxMKSBtc2cgPSAiKGVycm9yIG9iamVjdCBpcyBub3QgYSBzdHJpbmcpIjsKKyAgICBsX21lc3NhZ2UocHJvZ25hbWUsIG1zZyk7CisgICAgbHVhX3BvcChMLCAxKTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgdHJhY2ViYWNrIChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqbXNnID0gbHVhX3Rvc3RyaW5nKEwsIDEpOworICBpZiAobXNnKQorICAgIGx1YUxfdHJhY2ViYWNrKEwsIEwsIG1zZywgMSk7CisgIGVsc2UgaWYgKCFsdWFfaXNub25lb3JuaWwoTCwgMSkpIHsgIC8qIGlzIHRoZXJlIGFuIGVycm9yIG9iamVjdD8gKi8KKyAgICBpZiAoIWx1YUxfY2FsbG1ldGEoTCwgMSwgIl9fdG9zdHJpbmciKSkgIC8qIHRyeSBpdHMgJ3Rvc3RyaW5nJyBtZXRhbWV0aG9kICovCisgICAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIihubyBlcnJvciBtZXNzYWdlKSIpOworICB9CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZG9jYWxsIChsdWFfU3RhdGUgKkwsIGludCBuYXJnLCBpbnQgbnJlcykgeworICBpbnQgc3RhdHVzOworICBpbnQgYmFzZSA9IGx1YV9nZXR0b3AoTCkgLSBuYXJnOyAgLyogZnVuY3Rpb24gaW5kZXggKi8KKyAgbHVhX3B1c2hjZnVuY3Rpb24oTCwgdHJhY2ViYWNrKTsgIC8qIHB1c2ggdHJhY2ViYWNrIGZ1bmN0aW9uICovCisgIGx1YV9pbnNlcnQoTCwgYmFzZSk7ICAvKiBwdXQgaXQgdW5kZXIgY2h1bmsgYW5kIGFyZ3MgKi8KKyAgZ2xvYmFsTCA9IEw7ICAvKiB0byBiZSBhdmFpbGFibGUgdG8gJ2xhY3Rpb24nICovCisgIHNpZ25hbChTSUdJTlQsIGxhY3Rpb24pOworICBzdGF0dXMgPSBsdWFfcGNhbGwoTCwgbmFyZywgbnJlcywgYmFzZSk7CisgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworICBsdWFfcmVtb3ZlKEwsIGJhc2UpOyAgLyogcmVtb3ZlIHRyYWNlYmFjayBmdW5jdGlvbiAqLworICByZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24gKHZvaWQpIHsKKyAgbHVhaV93cml0ZXN0cmluZyhMVUFfQ09QWVJJR0hULCBzdHJsZW4oTFVBX0NPUFlSSUdIVCkpOworICBsdWFpX3dyaXRlbGluZSgpOworfQorCisKK3N0YXRpYyBpbnQgZ2V0YXJncyAobHVhX1N0YXRlICpMLCBjaGFyICoqYXJndiwgaW50IG4pIHsKKyAgaW50IG5hcmc7CisgIGludCBpOworICBpbnQgYXJnYyA9IDA7CisgIHdoaWxlIChhcmd2W2FyZ2NdKSBhcmdjKys7ICAvKiBjb3VudCB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzICovCisgIG5hcmcgPSBhcmdjIC0gKG4gKyAxKTsgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgdG8gdGhlIHNjcmlwdCAqLworICBsdWFMX2NoZWNrc3RhY2soTCwgbmFyZyArIDMsICJ0b28gbWFueSBhcmd1bWVudHMgdG8gc2NyaXB0Iik7CisgIGZvciAoaT1uKzE7IGkgPCBhcmdjOyBpKyspCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgYXJndltpXSk7CisgIGx1YV9jcmVhdGV0YWJsZShMLCBuYXJnLCBuICsgMSk7CisgIGZvciAoaT0wOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgYXJndltpXSk7CisgICAgbHVhX3Jhd3NldGkoTCwgLTIsIGkgLSBuKTsKKyAgfQorICByZXR1cm4gbmFyZzsKK30KKworCitzdGF0aWMgaW50IGRvZmlsZSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpuYW1lKSB7CisgIGludCBzdGF0dXMgPSBsdWFMX2xvYWRmaWxlKEwsIG5hbWUpOworICBpZiAoc3RhdHVzID09IExVQV9PSykgc3RhdHVzID0gZG9jYWxsKEwsIDAsIDApOworICByZXR1cm4gcmVwb3J0KEwsIHN0YXR1cyk7Cit9CisKKworc3RhdGljIGludCBkb3N0cmluZyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpuYW1lKSB7CisgIGludCBzdGF0dXMgPSBsdWFMX2xvYWRidWZmZXIoTCwgcywgc3RybGVuKHMpLCBuYW1lKTsKKyAgaWYgKHN0YXR1cyA9PSBMVUFfT0spIHN0YXR1cyA9IGRvY2FsbChMLCAwLCAwKTsKKyAgcmV0dXJuIHJlcG9ydChMLCBzdGF0dXMpOworfQorCisKK3N0YXRpYyBpbnQgZG9saWJyYXJ5IChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgaW50IHN0YXR1czsKKyAgbHVhX2dldGdsb2JhbChMLCAicmVxdWlyZSIpOworICBsdWFfcHVzaHN0cmluZyhMLCBuYW1lKTsKKyAgc3RhdHVzID0gZG9jYWxsKEwsIDEsIDEpOyAgLyogY2FsbCAncmVxdWlyZShuYW1lKScgKi8KKyAgaWYgKHN0YXR1cyA9PSBMVUFfT0spCisgICAgbHVhX3NldGdsb2JhbChMLCBuYW1lKTsgIC8qIGdsb2JhbFtuYW1lXSA9IHJlcXVpcmUgcmV0dXJuICovCisgIHJldHVybiByZXBvcnQoTCwgc3RhdHVzKTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3Byb21wdCAobHVhX1N0YXRlICpMLCBpbnQgZmlyc3RsaW5lKSB7CisgIGNvbnN0IGNoYXIgKnA7CisgIGx1YV9nZXRnbG9iYWwoTCwgZmlyc3RsaW5lID8gIl9QUk9NUFQiIDogIl9QUk9NUFQyIik7CisgIHAgPSBsdWFfdG9zdHJpbmcoTCwgLTEpOworICBpZiAocCA9PSBOVUxMKSBwID0gKGZpcnN0bGluZSA/IExVQV9QUk9NUFQgOiBMVUFfUFJPTVBUMik7CisgIHJldHVybiBwOworfQorCisvKiBtYXJrIGluIGVycm9yIG1lc3NhZ2VzIGZvciBpbmNvbXBsZXRlIHN0YXRlbWVudHMgKi8KKyNkZWZpbmUgRU9GTUFSSwkJIjxlb2Y+IgorI2RlZmluZSBtYXJrbGVuCQkoc2l6ZW9mKEVPRk1BUkspL3NpemVvZihjaGFyKSAtIDEpCisKK3N0YXRpYyBpbnQgaW5jb21wbGV0ZSAobHVhX1N0YXRlICpMLCBpbnQgc3RhdHVzKSB7CisgIGlmIChzdGF0dXMgPT0gTFVBX0VSUlNZTlRBWCkgeworICAgIHNpemVfdCBsbXNnOworICAgIGNvbnN0IGNoYXIgKm1zZyA9IGx1YV90b2xzdHJpbmcoTCwgLTEsICZsbXNnKTsKKyAgICBpZiAobG1zZyA+PSBtYXJrbGVuICYmIHN0cmNtcChtc2cgKyBsbXNnIC0gbWFya2xlbiwgRU9GTUFSSykgPT0gMCkgeworICAgICAgbHVhX3BvcChMLCAxKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsgIC8qIGVsc2UuLi4gKi8KK30KKworCitzdGF0aWMgaW50IHB1c2hsaW5lIChsdWFfU3RhdGUgKkwsIGludCBmaXJzdGxpbmUpIHsKKyAgY2hhciBidWZmZXJbTFVBX01BWElOUFVUXTsKKyAgY2hhciAqYiA9IGJ1ZmZlcjsKKyAgc2l6ZV90IGw7CisgIGNvbnN0IGNoYXIgKnBybXQgPSBnZXRfcHJvbXB0KEwsIGZpcnN0bGluZSk7CisgIGludCByZWFkc3RhdHVzID0gbHVhX3JlYWRsaW5lKEwsIGIsIHBybXQpOworICBsdWFfcG9wKEwsIDEpOyAgLyogcmVtb3ZlIHJlc3VsdCBmcm9tICdnZXRfcHJvbXB0JyAqLworICBpZiAocmVhZHN0YXR1cyA9PSAwKQorICAgIHJldHVybiAwOyAgLyogbm8gaW5wdXQgKi8KKyAgbCA9IHN0cmxlbihiKTsKKyAgaWYgKGwgPiAwICYmIGJbbC0xXSA9PSAnXG4nKSAgLyogbGluZSBlbmRzIHdpdGggbmV3bGluZT8gKi8KKyAgICBiW2wtMV0gPSAnXDAnOyAgLyogcmVtb3ZlIGl0ICovCisgIGlmIChmaXJzdGxpbmUgJiYgYlswXSA9PSAnPScpICAvKiBmaXJzdCBsaW5lIHN0YXJ0cyB3aXRoIGA9JyA/ICovCisgICAgbHVhX3B1c2hmc3RyaW5nKEwsICJyZXR1cm4gJXMiLCBiKzEpOyAgLyogY2hhbmdlIGl0IHRvIGByZXR1cm4nICovCisgIGVsc2UKKyAgICBsdWFfcHVzaHN0cmluZyhMLCBiKTsKKyAgbHVhX2ZyZWVsaW5lKEwsIGIpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGxvYWRsaW5lIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IHN0YXR1czsKKyAgbHVhX3NldHRvcChMLCAwKTsKKyAgaWYgKCFwdXNobGluZShMLCAxKSkKKyAgICByZXR1cm4gLTE7ICAvKiBubyBpbnB1dCAqLworICBmb3IgKDs7KSB7ICAvKiByZXBlYXQgdW50aWwgZ2V0cyBhIGNvbXBsZXRlIGxpbmUgKi8KKyAgICBzaXplX3QgbDsKKyAgICBjb25zdCBjaGFyICpsaW5lID0gbHVhX3RvbHN0cmluZyhMLCAxLCAmbCk7CisgICAgc3RhdHVzID0gbHVhTF9sb2FkYnVmZmVyKEwsIGxpbmUsIGwsICI9c3RkaW4iKTsKKyAgICBpZiAoIWluY29tcGxldGUoTCwgc3RhdHVzKSkgYnJlYWs7ICAvKiBjYW5ub3QgdHJ5IHRvIGFkZCBsaW5lcz8gKi8KKyAgICBpZiAoIXB1c2hsaW5lKEwsIDApKSAgLyogbm8gbW9yZSBpbnB1dD8gKi8KKyAgICAgIHJldHVybiAtMTsKKyAgICBsdWFfcHVzaGxpdGVyYWwoTCwgIlxuIik7ICAvKiBhZGQgYSBuZXcgbGluZS4uLiAqLworICAgIGx1YV9pbnNlcnQoTCwgLTIpOyAgLyogLi4uYmV0d2VlbiB0aGUgdHdvIGxpbmVzICovCisgICAgbHVhX2NvbmNhdChMLCAzKTsgIC8qIGpvaW4gdGhlbSAqLworICB9CisgIGx1YV9zYXZlbGluZShMLCAxKTsKKyAgbHVhX3JlbW92ZShMLCAxKTsgIC8qIHJlbW92ZSBsaW5lICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIHZvaWQgZG90dHkgKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgc3RhdHVzOworICBjb25zdCBjaGFyICpvbGRwcm9nbmFtZSA9IHByb2duYW1lOworICBwcm9nbmFtZSA9IE5VTEw7CisgIHdoaWxlICgoc3RhdHVzID0gbG9hZGxpbmUoTCkpICE9IC0xKSB7CisgICAgaWYgKHN0YXR1cyA9PSBMVUFfT0spIHN0YXR1cyA9IGRvY2FsbChMLCAwLCBMVUFfTVVMVFJFVCk7CisgICAgcmVwb3J0KEwsIHN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyA9PSBMVUFfT0sgJiYgbHVhX2dldHRvcChMKSA+IDApIHsgIC8qIGFueSByZXN1bHQgdG8gcHJpbnQ/ICovCisgICAgICBsdWFMX2NoZWNrc3RhY2soTCwgTFVBX01JTlNUQUNLLCAidG9vIG1hbnkgcmVzdWx0cyB0byBwcmludCIpOworICAgICAgbHVhX2dldGdsb2JhbChMLCAicHJpbnQiKTsKKyAgICAgIGx1YV9pbnNlcnQoTCwgMSk7CisgICAgICBpZiAobHVhX3BjYWxsKEwsIGx1YV9nZXR0b3AoTCktMSwgMCwgMCkgIT0gTFVBX09LKQorICAgICAgICBsX21lc3NhZ2UocHJvZ25hbWUsIGx1YV9wdXNoZnN0cmluZyhMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBjYWxsaW5nICIgTFVBX1FMKCJwcmludCIpICIgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhX3Rvc3RyaW5nKEwsIC0xKSkpOworICAgIH0KKyAgfQorICBsdWFfc2V0dG9wKEwsIDApOyAgLyogY2xlYXIgc3RhY2sgKi8KKyAgbHVhaV93cml0ZWxpbmUoKTsKKyAgcHJvZ25hbWUgPSBvbGRwcm9nbmFtZTsKK30KKworCitzdGF0aWMgaW50IGhhbmRsZV9zY3JpcHQgKGx1YV9TdGF0ZSAqTCwgY2hhciAqKmFyZ3YsIGludCBuKSB7CisgIGludCBzdGF0dXM7CisgIGNvbnN0IGNoYXIgKmZuYW1lOworICBpbnQgbmFyZyA9IGdldGFyZ3MoTCwgYXJndiwgbik7ICAvKiBjb2xsZWN0IGFyZ3VtZW50cyAqLworICBsdWFfc2V0Z2xvYmFsKEwsICJhcmciKTsKKyAgZm5hbWUgPSBhcmd2W25dOworICBpZiAoc3RyY21wKGZuYW1lLCAiLSIpID09IDAgJiYgc3RyY21wKGFyZ3Zbbi0xXSwgIi0tIikgIT0gMCkKKyAgICBmbmFtZSA9IE5VTEw7ICAvKiBzdGRpbiAqLworICBzdGF0dXMgPSBsdWFMX2xvYWRmaWxlKEwsIGZuYW1lKTsKKyAgbHVhX2luc2VydChMLCAtKG5hcmcrMSkpOworICBpZiAoc3RhdHVzID09IExVQV9PSykKKyAgICBzdGF0dXMgPSBkb2NhbGwoTCwgbmFyZywgTFVBX01VTFRSRVQpOworICBlbHNlCisgICAgbHVhX3BvcChMLCBuYXJnKTsKKyAgcmV0dXJuIHJlcG9ydChMLCBzdGF0dXMpOworfQorCisKKy8qIGNoZWNrIHRoYXQgYXJndW1lbnQgaGFzIG5vIGV4dHJhIGNoYXJhY3RlcnMgYXQgdGhlIGVuZCAqLworI2RlZmluZSBub2V4dHJhY2hhcnMoeCkJCXtpZiAoKHgpWzJdICE9ICdcMCcpIHJldHVybiAtMTt9CisKKworLyogaW5kaWNlcyBvZiB2YXJpb3VzIGFyZ3VtZW50IGluZGljYXRvcnMgaW4gYXJyYXkgYXJncyAqLworI2RlZmluZSBoYXNfaQkJMAkvKiAtaSAqLworI2RlZmluZSBoYXNfdgkJMQkvKiAtdiAqLworI2RlZmluZSBoYXNfZQkJMgkvKiAtZSAqLworI2RlZmluZSBoYXNfRQkJMwkvKiAtRSAqLworCisjZGVmaW5lIG51bV9oYXMJCTQJLyogbnVtYmVyIG9mICdoYXNfKicgKi8KKworCitzdGF0aWMgaW50IGNvbGxlY3RhcmdzIChjaGFyICoqYXJndiwgaW50ICphcmdzKSB7CisgIGludCBpOworICBmb3IgKGkgPSAxOyBhcmd2W2ldICE9IE5VTEw7IGkrKykgeworICAgIGlmIChhcmd2W2ldWzBdICE9ICctJykgIC8qIG5vdCBhbiBvcHRpb24/ICovCisgICAgICAgIHJldHVybiBpOworICAgIHN3aXRjaCAoYXJndltpXVsxXSkgeyAgLyogb3B0aW9uICovCisgICAgICBjYXNlICctJzoKKyAgICAgICAgbm9leHRyYWNoYXJzKGFyZ3ZbaV0pOworICAgICAgICByZXR1cm4gKGFyZ3ZbaSsxXSAhPSBOVUxMID8gaSsxIDogMCk7CisgICAgICBjYXNlICdcMCc6CisgICAgICAgIHJldHVybiBpOworICAgICAgY2FzZSAnRSc6CisgICAgICAgIGFyZ3NbaGFzX0VdID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdpJzoKKyAgICAgICAgbm9leHRyYWNoYXJzKGFyZ3ZbaV0pOworICAgICAgICBhcmdzW2hhc19pXSA9IDE7ICAvKiBnbyB0aHJvdWdoICovCisgICAgICBjYXNlICd2JzoKKyAgICAgICAgbm9leHRyYWNoYXJzKGFyZ3ZbaV0pOworICAgICAgICBhcmdzW2hhc192XSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnZSc6CisgICAgICAgIGFyZ3NbaGFzX2VdID0gMTsgIC8qIGdvIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgJ2wnOiAgLyogYm90aCBvcHRpb25zIG5lZWQgYW4gYXJndW1lbnQgKi8KKyAgICAgICAgaWYgKGFyZ3ZbaV1bMl0gPT0gJ1wwJykgeyAgLyogbm8gY29uY2F0ZW5hdGVkIGFyZ3VtZW50PyAqLworICAgICAgICAgIGkrKzsgIC8qIHRyeSBuZXh0ICdhcmd2JyAqLworICAgICAgICAgIGlmIChhcmd2W2ldID09IE5VTEwgfHwgYXJndltpXVswXSA9PSAnLScpCisgICAgICAgICAgICByZXR1cm4gLShpIC0gMSk7ICAvKiBubyBuZXh0IGFyZ3VtZW50IG9yIGl0IGlzIGFub3RoZXIgb3B0aW9uICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgLyogaW52YWxpZCBvcHRpb247IHJldHVybiBpdHMgaW5kZXguLi4gKi8KKyAgICAgICAgcmV0dXJuIC1pOyAgLyogLi4uYXMgYSBuZWdhdGl2ZSB2YWx1ZSAqLworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJ1bmFyZ3MgKGx1YV9TdGF0ZSAqTCwgY2hhciAqKmFyZ3YsIGludCBuKSB7CisgIGludCBpOworICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisgICAgbHVhX2Fzc2VydChhcmd2W2ldWzBdID09ICctJyk7CisgICAgc3dpdGNoIChhcmd2W2ldWzFdKSB7ICAvKiBvcHRpb24gKi8KKyAgICAgIGNhc2UgJ2UnOiB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNodW5rID0gYXJndltpXSArIDI7CisgICAgICAgIGlmICgqY2h1bmsgPT0gJ1wwJykgY2h1bmsgPSBhcmd2WysraV07CisgICAgICAgIGx1YV9hc3NlcnQoY2h1bmsgIT0gTlVMTCk7CisgICAgICAgIGlmIChkb3N0cmluZyhMLCBjaHVuaywgIj0oY29tbWFuZCBsaW5lKSIpICE9IExVQV9PSykKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdsJzogeworICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3ZbaV0gKyAyOworICAgICAgICBpZiAoKmZpbGVuYW1lID09ICdcMCcpIGZpbGVuYW1lID0gYXJndlsrK2ldOworICAgICAgICBsdWFfYXNzZXJ0KGZpbGVuYW1lICE9IE5VTEwpOworICAgICAgICBpZiAoZG9saWJyYXJ5KEwsIGZpbGVuYW1lKSAhPSBMVUFfT0spCisgICAgICAgICAgcmV0dXJuIDA7ICAvKiBzdG9wIGlmIGZpbGUgZmFpbHMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBoYW5kbGVfbHVhaW5pdCAobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSAiPSIgTFVBX0lOSVRWRVJTSU9OOworICBjb25zdCBjaGFyICppbml0ID0gZ2V0ZW52KG5hbWUgKyAxKTsKKyAgaWYgKGluaXQgPT0gTlVMTCkgeworICAgIG5hbWUgPSAiPSIgTFVBX0lOSVQ7CisgICAgaW5pdCA9IGdldGVudihuYW1lICsgMSk7ICAvKiB0cnkgYWx0ZXJuYXRpdmUgbmFtZSAqLworICB9CisgIGlmIChpbml0ID09IE5VTEwpIHJldHVybiBMVUFfT0s7CisgIGVsc2UgaWYgKGluaXRbMF0gPT0gJ0AnKQorICAgIHJldHVybiBkb2ZpbGUoTCwgaW5pdCsxKTsKKyAgZWxzZQorICAgIHJldHVybiBkb3N0cmluZyhMLCBpbml0LCBuYW1lKTsKK30KKworCitzdGF0aWMgaW50IHBtYWluIChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGFyZ2MgPSAoaW50KWx1YV90b2ludGVnZXIoTCwgMSk7CisgIGNoYXIgKiphcmd2ID0gKGNoYXIgKiopbHVhX3RvdXNlcmRhdGEoTCwgMik7CisgIGludCBzY3JpcHQ7CisgIGludCBhcmdzW251bV9oYXNdOworICBhcmdzW2hhc19pXSA9IGFyZ3NbaGFzX3ZdID0gYXJnc1toYXNfZV0gPSBhcmdzW2hhc19FXSA9IDA7CisgIGlmIChhcmd2WzBdICYmIGFyZ3ZbMF1bMF0pIHByb2duYW1lID0gYXJndlswXTsKKyAgc2NyaXB0ID0gY29sbGVjdGFyZ3MoYXJndiwgYXJncyk7CisgIGlmIChzY3JpcHQgPCAwKSB7ICAvKiBpbnZhbGlkIGFyZz8gKi8KKyAgICBwcmludF91c2FnZShhcmd2Wy1zY3JpcHRdKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoYXJnc1toYXNfdl0pIHByaW50X3ZlcnNpb24oKTsKKyAgaWYgKGFyZ3NbaGFzX0VdKSB7ICAvKiBvcHRpb24gJy1FJz8gKi8KKyAgICBsdWFfcHVzaGJvb2xlYW4oTCwgMSk7ICAvKiBzaWduYWwgZm9yIGxpYnJhcmllcyB0byBpZ25vcmUgZW52LiB2YXJzLiAqLworICAgIGx1YV9zZXRmaWVsZChMLCBMVUFfUkVHSVNUUllJTkRFWCwgIkxVQV9OT0VOViIpOworICB9CisgIC8qIG9wZW4gc3RhbmRhcmQgbGlicmFyaWVzICovCisgIGx1YUxfY2hlY2t2ZXJzaW9uKEwpOworICBsdWFfZ2MoTCwgTFVBX0dDU1RPUCwgMCk7ICAvKiBzdG9wIGNvbGxlY3RvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KKyAgbHVhTF9vcGVubGlicyhMKTsgIC8qIG9wZW4gbGlicmFyaWVzICovCisgIGx1YV9nYyhMLCBMVUFfR0NSRVNUQVJULCAwKTsKKyAgaWYgKCFhcmdzW2hhc19FXSAmJiBoYW5kbGVfbHVhaW5pdChMKSAhPSBMVUFfT0spCisgICAgcmV0dXJuIDA7ICAvKiBlcnJvciBydW5uaW5nIExVQV9JTklUICovCisgIC8qIGV4ZWN1dGUgYXJndW1lbnRzIC1lIGFuZCAtbCAqLworICBpZiAoIXJ1bmFyZ3MoTCwgYXJndiwgKHNjcmlwdCA+IDApID8gc2NyaXB0IDogYXJnYykpIHJldHVybiAwOworICAvKiBleGVjdXRlIG1haW4gc2NyaXB0IChpZiB0aGVyZSBpcyBvbmUpICovCisgIGlmIChzY3JpcHQgJiYgaGFuZGxlX3NjcmlwdChMLCBhcmd2LCBzY3JpcHQpICE9IExVQV9PSykgcmV0dXJuIDA7CisgIGlmIChhcmdzW2hhc19pXSkgIC8qIC1pIG9wdGlvbj8gKi8KKyAgICBkb3R0eShMKTsKKyAgZWxzZSBpZiAoc2NyaXB0ID09IDAgJiYgIWFyZ3NbaGFzX2VdICYmICFhcmdzW2hhc192XSkgeyAgLyogbm8gYXJndW1lbnRzPyAqLworICAgIGlmIChsdWFfc3RkaW5faXNfdHR5KCkpIHsKKyAgICAgIHByaW50X3ZlcnNpb24oKTsKKyAgICAgIGRvdHR5KEwpOworICAgIH0KKyAgICBlbHNlIGRvZmlsZShMLCBOVUxMKTsgIC8qIGV4ZWN1dGVzIHN0ZGluIGFzIGEgZmlsZSAqLworICB9CisgIGx1YV9wdXNoYm9vbGVhbihMLCAxKTsgIC8qIHNpZ25hbCBubyBlcnJvcnMgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBpbnQgc3RhdHVzLCByZXN1bHQ7CisgIGx1YV9TdGF0ZSAqTCA9IGx1YUxfbmV3c3RhdGUoKTsgIC8qIGNyZWF0ZSBzdGF0ZSAqLworICBpZiAoTCA9PSBOVUxMKSB7CisgICAgbF9tZXNzYWdlKGFyZ3ZbMF0sICJjYW5ub3QgY3JlYXRlIHN0YXRlOiBub3QgZW5vdWdoIG1lbW9yeSIpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyNpZmRlZiBTWVNMSU5VWAorICBvcGVuY29uc29sZSgmZGV2X3N0ZGNvbl9yLCAmZGV2X3N0ZGNvbl93KTsKKyNlbmRpZgorICAvKiBjYWxsICdwbWFpbicgaW4gcHJvdGVjdGVkIG1vZGUgKi8KKyAgbHVhX3B1c2hjZnVuY3Rpb24oTCwgJnBtYWluKTsKKyAgbHVhX3B1c2hpbnRlZ2VyKEwsIGFyZ2MpOyAgLyogMXN0IGFyZ3VtZW50ICovCisgIGx1YV9wdXNobGlnaHR1c2VyZGF0YShMLCBhcmd2KTsgLyogMm5kIGFyZ3VtZW50ICovCisgIHN0YXR1cyA9IGx1YV9wY2FsbChMLCAyLCAxLCAwKTsKKyAgcmVzdWx0ID0gbHVhX3RvYm9vbGVhbihMLCAtMSk7ICAvKiBnZXQgcmVzdWx0ICovCisgIGZpbmFscmVwb3J0KEwsIHN0YXR1cyk7CisgIGx1YV9jbG9zZShMKTsKKyAgcmV0dXJuIChyZXN1bHQgJiYgc3RhdHVzID09IExVQV9PSykgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkU7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbHVhLmggYi9jb20zMi9sdWEvc3JjL2x1YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzY2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2x1YS5oCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorKiogJElkOiBsdWEuaCx2IDEuMjg1LjEuMiAyMDEzLzExLzExIDEyOjA5OjE2IHJvYmVydG8gRXhwICQKKyoqIEx1YSAtIEEgU2NyaXB0aW5nIExhbmd1YWdlCisqKiBMdWEub3JnLCBQVUMtUmlvLCBCcmF6aWwgKGh0dHA6Ly93d3cubHVhLm9yZykKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlCisqLworCisKKyNpZm5kZWYgbHVhX2gKKyNkZWZpbmUgbHVhX2gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKyNpbmNsdWRlICJsdWFjb25mLmgiCisKKyNpZmRlZiBTWVNMSU5VWAorI2RlZmluZSBjbGVhcmVycih4KSAodm9pZCkwCisjZGVmaW5lIGZlb2YoeCkgMAorI2RlZmluZSBmZXJyb3IoeCkgMAorI2VuZGlmCisKKyNkZWZpbmUgTFVBX1ZFUlNJT05fTUFKT1IJIjUiCisjZGVmaW5lIExVQV9WRVJTSU9OX01JTk9SCSIyIgorI2RlZmluZSBMVUFfVkVSU0lPTl9OVU0JCTUwMgorI2RlZmluZSBMVUFfVkVSU0lPTl9SRUxFQVNFCSIzIgorCisjZGVmaW5lIExVQV9WRVJTSU9OCSJMdWEgIiBMVUFfVkVSU0lPTl9NQUpPUiAiLiIgTFVBX1ZFUlNJT05fTUlOT1IKKyNkZWZpbmUgTFVBX1JFTEVBU0UJTFVBX1ZFUlNJT04gIi4iIExVQV9WRVJTSU9OX1JFTEVBU0UKKyNkZWZpbmUgTFVBX0NPUFlSSUdIVAlMVUFfUkVMRUFTRSAiICBDb3B5cmlnaHQgKEMpIDE5OTQtMjAxMyBMdWEub3JnLCBQVUMtUmlvIgorI2RlZmluZSBMVUFfQVVUSE9SUwkiUi4gSWVydXNhbGltc2NoeSwgTC4gSC4gZGUgRmlndWVpcmVkbywgVy4gQ2VsZXMiCisKKworLyogbWFyayBmb3IgcHJlY29tcGlsZWQgY29kZSAoJzxlc2M+THVhJykgKi8KKyNkZWZpbmUgTFVBX1NJR05BVFVSRQkiXDAzM0x1YSIKKworLyogb3B0aW9uIGZvciBtdWx0aXBsZSByZXR1cm5zIGluICdsdWFfcGNhbGwnIGFuZCAnbHVhX2NhbGwnICovCisjZGVmaW5lIExVQV9NVUxUUkVUCSgtMSkKKworCisvKgorKiogcHNldWRvLWluZGljZXMKKyovCisjZGVmaW5lIExVQV9SRUdJU1RSWUlOREVYCUxVQUlfRklSU1RQU0VVRE9JRFgKKyNkZWZpbmUgbHVhX3VwdmFsdWVpbmRleChpKQkoTFVBX1JFR0lTVFJZSU5ERVggLSAoaSkpCisKKworLyogdGhyZWFkIHN0YXR1cyAqLworI2RlZmluZSBMVUFfT0sJCTAKKyNkZWZpbmUgTFVBX1lJRUxECTEKKyNkZWZpbmUgTFVBX0VSUlJVTgkyCisjZGVmaW5lIExVQV9FUlJTWU5UQVgJMworI2RlZmluZSBMVUFfRVJSTUVNCTQKKyNkZWZpbmUgTFVBX0VSUkdDTU0JNQorI2RlZmluZSBMVUFfRVJSRVJSCTYKKworCit0eXBlZGVmIHN0cnVjdCBsdWFfU3RhdGUgbHVhX1N0YXRlOworCit0eXBlZGVmIGludCAoKmx1YV9DRnVuY3Rpb24pIChsdWFfU3RhdGUgKkwpOworCisKKy8qCisqKiBmdW5jdGlvbnMgdGhhdCByZWFkL3dyaXRlIGJsb2NrcyB3aGVuIGxvYWRpbmcvZHVtcGluZyBMdWEgY2h1bmtzCisqLwordHlwZWRlZiBjb25zdCBjaGFyICogKCpsdWFfUmVhZGVyKSAobHVhX1N0YXRlICpMLCB2b2lkICp1ZCwgc2l6ZV90ICpzeik7CisKK3R5cGVkZWYgaW50ICgqbHVhX1dyaXRlcikgKGx1YV9TdGF0ZSAqTCwgY29uc3Qgdm9pZCogcCwgc2l6ZV90IHN6LCB2b2lkKiB1ZCk7CisKKworLyoKKyoqIHByb3RvdHlwZSBmb3IgbWVtb3J5LWFsbG9jYXRpb24gZnVuY3Rpb25zCisqLwordHlwZWRlZiB2b2lkICogKCpsdWFfQWxsb2MpICh2b2lkICp1ZCwgdm9pZCAqcHRyLCBzaXplX3Qgb3NpemUsIHNpemVfdCBuc2l6ZSk7CisKKworLyoKKyoqIGJhc2ljIHR5cGVzCisqLworI2RlZmluZSBMVUFfVE5PTkUJCSgtMSkKKworI2RlZmluZSBMVUFfVE5JTAkJMAorI2RlZmluZSBMVUFfVEJPT0xFQU4JCTEKKyNkZWZpbmUgTFVBX1RMSUdIVFVTRVJEQVRBCTIKKyNkZWZpbmUgTFVBX1ROVU1CRVIJCTMKKyNkZWZpbmUgTFVBX1RTVFJJTkcJCTQKKyNkZWZpbmUgTFVBX1RUQUJMRQkJNQorI2RlZmluZSBMVUFfVEZVTkNUSU9OCQk2CisjZGVmaW5lIExVQV9UVVNFUkRBVEEJCTcKKyNkZWZpbmUgTFVBX1RUSFJFQUQJCTgKKworI2RlZmluZSBMVUFfTlVNVEFHUwkJOQorCisKKworLyogbWluaW11bSBMdWEgc3RhY2sgYXZhaWxhYmxlIHRvIGEgQyBmdW5jdGlvbiAqLworI2RlZmluZSBMVUFfTUlOU1RBQ0sJMjAKKworCisvKiBwcmVkZWZpbmVkIHZhbHVlcyBpbiB0aGUgcmVnaXN0cnkgKi8KKyNkZWZpbmUgTFVBX1JJRFhfTUFJTlRIUkVBRAkxCisjZGVmaW5lIExVQV9SSURYX0dMT0JBTFMJMgorI2RlZmluZSBMVUFfUklEWF9MQVNUCQlMVUFfUklEWF9HTE9CQUxTCisKKworLyogdHlwZSBvZiBudW1iZXJzIGluIEx1YSAqLwordHlwZWRlZiBMVUFfTlVNQkVSIGx1YV9OdW1iZXI7CisKKworLyogdHlwZSBmb3IgaW50ZWdlciBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgTFVBX0lOVEVHRVIgbHVhX0ludGVnZXI7CisKKy8qIHVuc2lnbmVkIGludGVnZXIgdHlwZSAqLwordHlwZWRlZiBMVUFfVU5TSUdORUQgbHVhX1Vuc2lnbmVkOworCisKKworLyoKKyoqIGdlbmVyaWMgZXh0cmEgaW5jbHVkZSBmaWxlCisqLworI2lmIGRlZmluZWQoTFVBX1VTRVJfSCkKKyNpbmNsdWRlIExVQV9VU0VSX0gKKyNlbmRpZgorCisKKy8qCisqKiBSQ1MgaWRlbnQgc3RyaW5nCisqLworZXh0ZXJuIGNvbnN0IGNoYXIgbHVhX2lkZW50W107CisKKworLyoKKyoqIHN0YXRlIG1hbmlwdWxhdGlvbgorKi8KK0xVQV9BUEkgbHVhX1N0YXRlICoobHVhX25ld3N0YXRlKSAobHVhX0FsbG9jIGYsIHZvaWQgKnVkKTsKK0xVQV9BUEkgdm9pZCAgICAgICAobHVhX2Nsb3NlKSAobHVhX1N0YXRlICpMKTsKK0xVQV9BUEkgbHVhX1N0YXRlICoobHVhX25ld3RocmVhZCkgKGx1YV9TdGF0ZSAqTCk7CisKK0xVQV9BUEkgbHVhX0NGdW5jdGlvbiAobHVhX2F0cGFuaWMpIChsdWFfU3RhdGUgKkwsIGx1YV9DRnVuY3Rpb24gcGFuaWNmKTsKKworCitMVUFfQVBJIGNvbnN0IGx1YV9OdW1iZXIgKihsdWFfdmVyc2lvbikgKGx1YV9TdGF0ZSAqTCk7CisKKworLyoKKyoqIGJhc2ljIHN0YWNrIG1hbmlwdWxhdGlvbgorKi8KK0xVQV9BUEkgaW50ICAgKGx1YV9hYnNpbmRleCkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIGludCAgIChsdWFfZ2V0dG9wKSAobHVhX1N0YXRlICpMKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9zZXR0b3ApIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX3B1c2h2YWx1ZSkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIHZvaWQgIChsdWFfcmVtb3ZlKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9pbnNlcnQpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX3JlcGxhY2UpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX2NvcHkpIChsdWFfU3RhdGUgKkwsIGludCBmcm9taWR4LCBpbnQgdG9pZHgpOworTFVBX0FQSSBpbnQgICAobHVhX2NoZWNrc3RhY2spIChsdWFfU3RhdGUgKkwsIGludCBzeik7CisKK0xVQV9BUEkgdm9pZCAgKGx1YV94bW92ZSkgKGx1YV9TdGF0ZSAqZnJvbSwgbHVhX1N0YXRlICp0bywgaW50IG4pOworCisKKy8qCisqKiBhY2Nlc3MgZnVuY3Rpb25zIChzdGFjayAtPiBDKQorKi8KKworTFVBX0FQSSBpbnQgICAgICAgICAgICAgKGx1YV9pc251bWJlcikgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIGludCAgICAgICAgICAgICAobHVhX2lzc3RyaW5nKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgaW50ICAgICAgICAgICAgIChsdWFfaXNjZnVuY3Rpb24pIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSBpbnQgICAgICAgICAgICAgKGx1YV9pc3VzZXJkYXRhKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKK0xVQV9BUEkgaW50ICAgICAgICAgICAgIChsdWFfdHlwZSkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIGNvbnN0IGNoYXIgICAgICoobHVhX3R5cGVuYW1lKSAobHVhX1N0YXRlICpMLCBpbnQgdHApOworCitMVUFfQVBJIGx1YV9OdW1iZXIgICAgICAobHVhX3RvbnVtYmVyeCkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwgaW50ICppc251bSk7CitMVUFfQVBJIGx1YV9JbnRlZ2VyICAgICAobHVhX3RvaW50ZWdlcngpIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGludCAqaXNudW0pOworTFVBX0FQSSBsdWFfVW5zaWduZWQgICAgKGx1YV90b3Vuc2lnbmVkeCkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwgaW50ICppc251bSk7CitMVUFfQVBJIGludCAgICAgICAgICAgICAobHVhX3RvYm9vbGVhbikgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIGNvbnN0IGNoYXIgICAgICoobHVhX3RvbHN0cmluZykgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwgc2l6ZV90ICpsZW4pOworTFVBX0FQSSBzaXplX3QgICAgICAgICAgKGx1YV9yYXdsZW4pIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSBsdWFfQ0Z1bmN0aW9uICAgKGx1YV90b2NmdW5jdGlvbikgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIHZvaWQJICAgICAgICoobHVhX3RvdXNlcmRhdGEpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSBsdWFfU3RhdGUgICAgICAqKGx1YV90b3RocmVhZCkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CitMVUFfQVBJIGNvbnN0IHZvaWQgICAgICoobHVhX3RvcG9pbnRlcikgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CisKKworLyoKKyoqIENvbXBhcmlzb24gYW5kIGFyaXRobWV0aWMgZnVuY3Rpb25zCisqLworCisjZGVmaW5lIExVQV9PUEFERAkwCS8qIE9SREVSIFRNICovCisjZGVmaW5lIExVQV9PUFNVQgkxCisjZGVmaW5lIExVQV9PUE1VTAkyCisjZGVmaW5lIExVQV9PUERJVgkzCisjZGVmaW5lIExVQV9PUE1PRAk0CisjZGVmaW5lIExVQV9PUFBPVwk1CisjZGVmaW5lIExVQV9PUFVOTQk2CisKK0xVQV9BUEkgdm9pZCAgKGx1YV9hcml0aCkgKGx1YV9TdGF0ZSAqTCwgaW50IG9wKTsKKworI2RlZmluZSBMVUFfT1BFUQkwCisjZGVmaW5lIExVQV9PUExUCTEKKyNkZWZpbmUgTFVBX09QTEUJMgorCitMVUFfQVBJIGludCAgIChsdWFfcmF3ZXF1YWwpIChsdWFfU3RhdGUgKkwsIGludCBpZHgxLCBpbnQgaWR4Mik7CitMVUFfQVBJIGludCAgIChsdWFfY29tcGFyZSkgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeDEsIGludCBpZHgyLCBpbnQgb3ApOworCisKKy8qCisqKiBwdXNoIGZ1bmN0aW9ucyAoQyAtPiBzdGFjaykKKyovCitMVUFfQVBJIHZvaWQgICAgICAgIChsdWFfcHVzaG5pbCkgKGx1YV9TdGF0ZSAqTCk7CitMVUFfQVBJIHZvaWQgICAgICAgIChsdWFfcHVzaG51bWJlcikgKGx1YV9TdGF0ZSAqTCwgbHVhX051bWJlciBuKTsKK0xVQV9BUEkgdm9pZCAgICAgICAgKGx1YV9wdXNoaW50ZWdlcikgKGx1YV9TdGF0ZSAqTCwgbHVhX0ludGVnZXIgbik7CitMVUFfQVBJIHZvaWQgICAgICAgIChsdWFfcHVzaHVuc2lnbmVkKSAobHVhX1N0YXRlICpMLCBsdWFfVW5zaWduZWQgbik7CitMVUFfQVBJIGNvbnN0IGNoYXIgKihsdWFfcHVzaGxzdHJpbmcpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsKTsKK0xVQV9BUEkgY29uc3QgY2hhciAqKGx1YV9wdXNoc3RyaW5nKSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzKTsKK0xVQV9BUEkgY29uc3QgY2hhciAqKGx1YV9wdXNodmZzdHJpbmcpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncCk7CitMVUFfQVBJIGNvbnN0IGNoYXIgKihsdWFfcHVzaGZzdHJpbmcpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9wdXNoY2Nsb3N1cmUpIChsdWFfU3RhdGUgKkwsIGx1YV9DRnVuY3Rpb24gZm4sIGludCBuKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9wdXNoYm9vbGVhbikgKGx1YV9TdGF0ZSAqTCwgaW50IGIpOworTFVBX0FQSSB2b2lkICAobHVhX3B1c2hsaWdodHVzZXJkYXRhKSAobHVhX1N0YXRlICpMLCB2b2lkICpwKTsKK0xVQV9BUEkgaW50ICAgKGx1YV9wdXNodGhyZWFkKSAobHVhX1N0YXRlICpMKTsKKworCisvKgorKiogZ2V0IGZ1bmN0aW9ucyAoTHVhIC0+IHN0YWNrKQorKi8KK0xVQV9BUEkgdm9pZCAgKGx1YV9nZXRnbG9iYWwpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnZhcik7CitMVUFfQVBJIHZvaWQgIChsdWFfZ2V0dGFibGUpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX2dldGZpZWxkKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBjb25zdCBjaGFyICprKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9yYXdnZXQpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX3Jhd2dldGkpIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGludCBuKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9yYXdnZXRwKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBjb25zdCB2b2lkICpwKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9jcmVhdGV0YWJsZSkgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcnIsIGludCBucmVjKTsKK0xVQV9BUEkgdm9pZCAqKGx1YV9uZXd1c2VyZGF0YSkgKGx1YV9TdGF0ZSAqTCwgc2l6ZV90IHN6KTsKK0xVQV9BUEkgaW50ICAgKGx1YV9nZXRtZXRhdGFibGUpIChsdWFfU3RhdGUgKkwsIGludCBvYmppbmRleCk7CitMVUFfQVBJIHZvaWQgIChsdWFfZ2V0dXNlcnZhbHVlKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKKworCisvKgorKiogc2V0IGZ1bmN0aW9ucyAoc3RhY2sgLT4gTHVhKQorKi8KK0xVQV9BUEkgdm9pZCAgKGx1YV9zZXRnbG9iYWwpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnZhcik7CitMVUFfQVBJIHZvaWQgIChsdWFfc2V0dGFibGUpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX3NldGZpZWxkKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBjb25zdCBjaGFyICprKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9yYXdzZXQpIChsdWFfU3RhdGUgKkwsIGludCBpZHgpOworTFVBX0FQSSB2b2lkICAobHVhX3Jhd3NldGkpIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGludCBuKTsKK0xVQV9BUEkgdm9pZCAgKGx1YV9yYXdzZXRwKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBjb25zdCB2b2lkICpwKTsKK0xVQV9BUEkgaW50ICAgKGx1YV9zZXRtZXRhdGFibGUpIChsdWFfU3RhdGUgKkwsIGludCBvYmppbmRleCk7CitMVUFfQVBJIHZvaWQgIChsdWFfc2V0dXNlcnZhbHVlKSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKKworCisvKgorKiogJ2xvYWQnIGFuZCAnY2FsbCcgZnVuY3Rpb25zIChsb2FkIGFuZCBydW4gTHVhIGNvZGUpCisqLworTFVBX0FQSSB2b2lkICAobHVhX2NhbGxrKSAobHVhX1N0YXRlICpMLCBpbnQgbmFyZ3MsIGludCBucmVzdWx0cywgaW50IGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YV9DRnVuY3Rpb24gayk7CisjZGVmaW5lIGx1YV9jYWxsKEwsbixyKQkJbHVhX2NhbGxrKEwsIChuKSwgKHIpLCAwLCBOVUxMKQorCitMVUFfQVBJIGludCAgIChsdWFfZ2V0Y3R4KSAobHVhX1N0YXRlICpMLCBpbnQgKmN0eCk7CisKK0xVQV9BUEkgaW50ICAgKGx1YV9wY2FsbGspIChsdWFfU3RhdGUgKkwsIGludCBuYXJncywgaW50IG5yZXN1bHRzLCBpbnQgZXJyZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4LCBsdWFfQ0Z1bmN0aW9uIGspOworI2RlZmluZSBsdWFfcGNhbGwoTCxuLHIsZikJbHVhX3BjYWxsayhMLCAobiksIChyKSwgKGYpLCAwLCBOVUxMKQorCitMVUFfQVBJIGludCAgIChsdWFfbG9hZCkgKGx1YV9TdGF0ZSAqTCwgbHVhX1JlYWRlciByZWFkZXIsIHZvaWQgKmR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNodW5rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlKTsKKworTFVBX0FQSSBpbnQgKGx1YV9kdW1wKSAobHVhX1N0YXRlICpMLCBsdWFfV3JpdGVyIHdyaXRlciwgdm9pZCAqZGF0YSk7CisKKworLyoKKyoqIGNvcm91dGluZSBmdW5jdGlvbnMKKyovCitMVUFfQVBJIGludCAgKGx1YV95aWVsZGspIChsdWFfU3RhdGUgKkwsIGludCBucmVzdWx0cywgaW50IGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YV9DRnVuY3Rpb24gayk7CisjZGVmaW5lIGx1YV95aWVsZChMLG4pCQlsdWFfeWllbGRrKEwsIChuKSwgMCwgTlVMTCkKK0xVQV9BUEkgaW50ICAobHVhX3Jlc3VtZSkgKGx1YV9TdGF0ZSAqTCwgbHVhX1N0YXRlICpmcm9tLCBpbnQgbmFyZyk7CitMVUFfQVBJIGludCAgKGx1YV9zdGF0dXMpIChsdWFfU3RhdGUgKkwpOworCisvKgorKiogZ2FyYmFnZS1jb2xsZWN0aW9uIGZ1bmN0aW9uIGFuZCBvcHRpb25zCisqLworCisjZGVmaW5lIExVQV9HQ1NUT1AJCTAKKyNkZWZpbmUgTFVBX0dDUkVTVEFSVAkJMQorI2RlZmluZSBMVUFfR0NDT0xMRUNUCQkyCisjZGVmaW5lIExVQV9HQ0NPVU5UCQkzCisjZGVmaW5lIExVQV9HQ0NPVU5UQgkJNAorI2RlZmluZSBMVUFfR0NTVEVQCQk1CisjZGVmaW5lIExVQV9HQ1NFVFBBVVNFCQk2CisjZGVmaW5lIExVQV9HQ1NFVFNURVBNVUwJNworI2RlZmluZSBMVUFfR0NTRVRNQUpPUklOQwk4CisjZGVmaW5lIExVQV9HQ0lTUlVOTklORwkJOQorI2RlZmluZSBMVUFfR0NHRU4JCTEwCisjZGVmaW5lIExVQV9HQ0lOQwkJMTEKKworTFVBX0FQSSBpbnQgKGx1YV9nYykgKGx1YV9TdGF0ZSAqTCwgaW50IHdoYXQsIGludCBkYXRhKTsKKworCisvKgorKiogbWlzY2VsbGFuZW91cyBmdW5jdGlvbnMKKyovCisKK0xVQV9BUEkgaW50ICAgKGx1YV9lcnJvcikgKGx1YV9TdGF0ZSAqTCk7CisKK0xVQV9BUEkgaW50ICAgKGx1YV9uZXh0KSAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTsKKworTFVBX0FQSSB2b2lkICAobHVhX2NvbmNhdCkgKGx1YV9TdGF0ZSAqTCwgaW50IG4pOworTFVBX0FQSSB2b2lkICAobHVhX2xlbikgICAgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCk7CisKK0xVQV9BUEkgbHVhX0FsbG9jIChsdWFfZ2V0YWxsb2NmKSAobHVhX1N0YXRlICpMLCB2b2lkICoqdWQpOworTFVBX0FQSSB2b2lkICAgICAgKGx1YV9zZXRhbGxvY2YpIChsdWFfU3RhdGUgKkwsIGx1YV9BbGxvYyBmLCB2b2lkICp1ZCk7CisKKworCisvKgorKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBzb21lIHVzZWZ1bCBtYWNyb3MKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2RlZmluZSBsdWFfdG9udW1iZXIoTCxpKQlsdWFfdG9udW1iZXJ4KEwsaSxOVUxMKQorI2RlZmluZSBsdWFfdG9pbnRlZ2VyKEwsaSkJbHVhX3RvaW50ZWdlcngoTCxpLE5VTEwpCisjZGVmaW5lIGx1YV90b3Vuc2lnbmVkKEwsaSkJbHVhX3RvdW5zaWduZWR4KEwsaSxOVUxMKQorCisjZGVmaW5lIGx1YV9wb3AoTCxuKQkJbHVhX3NldHRvcChMLCAtKG4pLTEpCisKKyNkZWZpbmUgbHVhX25ld3RhYmxlKEwpCQlsdWFfY3JlYXRldGFibGUoTCwgMCwgMCkKKworI2RlZmluZSBsdWFfcmVnaXN0ZXIoTCxuLGYpIChsdWFfcHVzaGNmdW5jdGlvbihMLCAoZikpLCBsdWFfc2V0Z2xvYmFsKEwsIChuKSkpCisKKyNkZWZpbmUgbHVhX3B1c2hjZnVuY3Rpb24oTCxmKQlsdWFfcHVzaGNjbG9zdXJlKEwsIChmKSwgMCkKKworI2RlZmluZSBsdWFfaXNmdW5jdGlvbihMLG4pCShsdWFfdHlwZShMLCAobikpID09IExVQV9URlVOQ1RJT04pCisjZGVmaW5lIGx1YV9pc3RhYmxlKEwsbikJKGx1YV90eXBlKEwsIChuKSkgPT0gTFVBX1RUQUJMRSkKKyNkZWZpbmUgbHVhX2lzbGlnaHR1c2VyZGF0YShMLG4pCShsdWFfdHlwZShMLCAobikpID09IExVQV9UTElHSFRVU0VSREFUQSkKKyNkZWZpbmUgbHVhX2lzbmlsKEwsbikJCShsdWFfdHlwZShMLCAobikpID09IExVQV9UTklMKQorI2RlZmluZSBsdWFfaXNib29sZWFuKEwsbikJKGx1YV90eXBlKEwsIChuKSkgPT0gTFVBX1RCT09MRUFOKQorI2RlZmluZSBsdWFfaXN0aHJlYWQoTCxuKQkobHVhX3R5cGUoTCwgKG4pKSA9PSBMVUFfVFRIUkVBRCkKKyNkZWZpbmUgbHVhX2lzbm9uZShMLG4pCQkobHVhX3R5cGUoTCwgKG4pKSA9PSBMVUFfVE5PTkUpCisjZGVmaW5lIGx1YV9pc25vbmVvcm5pbChMLCBuKQkobHVhX3R5cGUoTCwgKG4pKSA8PSAwKQorCisjZGVmaW5lIGx1YV9wdXNobGl0ZXJhbChMLCBzKQlcCisJbHVhX3B1c2hsc3RyaW5nKEwsICIiIHMsIChzaXplb2Yocykvc2l6ZW9mKGNoYXIpKS0xKQorCisjZGVmaW5lIGx1YV9wdXNoZ2xvYmFsdGFibGUoTCkgIFwKKwlsdWFfcmF3Z2V0aShMLCBMVUFfUkVHSVNUUllJTkRFWCwgTFVBX1JJRFhfR0xPQkFMUykKKworI2RlZmluZSBsdWFfdG9zdHJpbmcoTCxpKQlsdWFfdG9sc3RyaW5nKEwsIChpKSwgTlVMTCkKKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogRGVidWcgQVBJCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCisvKgorKiogRXZlbnQgY29kZXMKKyovCisjZGVmaW5lIExVQV9IT09LQ0FMTAkwCisjZGVmaW5lIExVQV9IT09LUkVUCTEKKyNkZWZpbmUgTFVBX0hPT0tMSU5FCTIKKyNkZWZpbmUgTFVBX0hPT0tDT1VOVAkzCisjZGVmaW5lIExVQV9IT09LVEFJTENBTEwgNAorCisKKy8qCisqKiBFdmVudCBtYXNrcworKi8KKyNkZWZpbmUgTFVBX01BU0tDQUxMCSgxIDw8IExVQV9IT09LQ0FMTCkKKyNkZWZpbmUgTFVBX01BU0tSRVQJKDEgPDwgTFVBX0hPT0tSRVQpCisjZGVmaW5lIExVQV9NQVNLTElORQkoMSA8PCBMVUFfSE9PS0xJTkUpCisjZGVmaW5lIExVQV9NQVNLQ09VTlQJKDEgPDwgTFVBX0hPT0tDT1VOVCkKKwordHlwZWRlZiBzdHJ1Y3QgbHVhX0RlYnVnIGx1YV9EZWJ1ZzsgIC8qIGFjdGl2YXRpb24gcmVjb3JkICovCisKKworLyogRnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBieSB0aGUgZGVidWdnZXIgaW4gc3BlY2lmaWMgZXZlbnRzICovCit0eXBlZGVmIHZvaWQgKCpsdWFfSG9vaykgKGx1YV9TdGF0ZSAqTCwgbHVhX0RlYnVnICphcik7CisKKworTFVBX0FQSSBpbnQgKGx1YV9nZXRzdGFjaykgKGx1YV9TdGF0ZSAqTCwgaW50IGxldmVsLCBsdWFfRGVidWcgKmFyKTsKK0xVQV9BUEkgaW50IChsdWFfZ2V0aW5mbykgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqd2hhdCwgbHVhX0RlYnVnICphcik7CitMVUFfQVBJIGNvbnN0IGNoYXIgKihsdWFfZ2V0bG9jYWwpIChsdWFfU3RhdGUgKkwsIGNvbnN0IGx1YV9EZWJ1ZyAqYXIsIGludCBuKTsKK0xVQV9BUEkgY29uc3QgY2hhciAqKGx1YV9zZXRsb2NhbCkgKGx1YV9TdGF0ZSAqTCwgY29uc3QgbHVhX0RlYnVnICphciwgaW50IG4pOworTFVBX0FQSSBjb25zdCBjaGFyICoobHVhX2dldHVwdmFsdWUpIChsdWFfU3RhdGUgKkwsIGludCBmdW5jaW5kZXgsIGludCBuKTsKK0xVQV9BUEkgY29uc3QgY2hhciAqKGx1YV9zZXR1cHZhbHVlKSAobHVhX1N0YXRlICpMLCBpbnQgZnVuY2luZGV4LCBpbnQgbik7CisKK0xVQV9BUEkgdm9pZCAqKGx1YV91cHZhbHVlaWQpIChsdWFfU3RhdGUgKkwsIGludCBmaWR4LCBpbnQgbik7CitMVUFfQVBJIHZvaWQgIChsdWFfdXB2YWx1ZWpvaW4pIChsdWFfU3RhdGUgKkwsIGludCBmaWR4MSwgaW50IG4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlkeDIsIGludCBuMik7CisKK0xVQV9BUEkgaW50IChsdWFfc2V0aG9vaykgKGx1YV9TdGF0ZSAqTCwgbHVhX0hvb2sgZnVuYywgaW50IG1hc2ssIGludCBjb3VudCk7CitMVUFfQVBJIGx1YV9Ib29rIChsdWFfZ2V0aG9vaykgKGx1YV9TdGF0ZSAqTCk7CitMVUFfQVBJIGludCAobHVhX2dldGhvb2ttYXNrKSAobHVhX1N0YXRlICpMKTsKK0xVQV9BUEkgaW50IChsdWFfZ2V0aG9va2NvdW50KSAobHVhX1N0YXRlICpMKTsKKworCitzdHJ1Y3QgbHVhX0RlYnVnIHsKKyAgaW50IGV2ZW50OworICBjb25zdCBjaGFyICpuYW1lOwkvKiAobikgKi8KKyAgY29uc3QgY2hhciAqbmFtZXdoYXQ7CS8qIChuKSAnZ2xvYmFsJywgJ2xvY2FsJywgJ2ZpZWxkJywgJ21ldGhvZCcgKi8KKyAgY29uc3QgY2hhciAqd2hhdDsJLyogKFMpICdMdWEnLCAnQycsICdtYWluJywgJ3RhaWwnICovCisgIGNvbnN0IGNoYXIgKnNvdXJjZTsJLyogKFMpICovCisgIGludCBjdXJyZW50bGluZTsJLyogKGwpICovCisgIGludCBsaW5lZGVmaW5lZDsJLyogKFMpICovCisgIGludCBsYXN0bGluZWRlZmluZWQ7CS8qIChTKSAqLworICB1bnNpZ25lZCBjaGFyIG51cHM7CS8qICh1KSBudW1iZXIgb2YgdXB2YWx1ZXMgKi8KKyAgdW5zaWduZWQgY2hhciBucGFyYW1zOy8qICh1KSBudW1iZXIgb2YgcGFyYW1ldGVycyAqLworICBjaGFyIGlzdmFyYXJnOyAgICAgICAgLyogKHUpICovCisgIGNoYXIgaXN0YWlsY2FsbDsJLyogKHQpICovCisgIGNoYXIgc2hvcnRfc3JjW0xVQV9JRFNJWkVdOyAvKiAoUykgKi8KKyAgLyogcHJpdmF0ZSBwYXJ0ICovCisgIHN0cnVjdCBDYWxsSW5mbyAqaV9jaTsgIC8qIGFjdGl2ZSBmdW5jdGlvbiAqLworfTsKKworLyogfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5NC0yMDEzIEx1YS5vcmcsIFBVQy1SaW8uCisqCisqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKgorKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyoKKyogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sdWEuaHBwIGIvY29tMzIvbHVhL3NyYy9sdWEuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNDE3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2x1YS5ocHAKQEAgLTAsMCArMSw5IEBACisvLyBsdWEuaHBwCisvLyBMdWEgaGVhZGVyIGZpbGVzIGZvciBDKysKKy8vIDw8ZXh0ZXJuICJDIj4+IG5vdCBzdXBwbGllZCBhdXRvbWF0aWNhbGx5IGJlY2F1c2UgTHVhIGFsc28gY29tcGlsZXMgYXMgQysrCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImx1YWxpYi5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKK30KZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbHVhYy5jIGIvY29tMzIvbHVhL3NyYy9sdWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwOTcwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbHVhYy5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorKiogJElkOiBsdWFjLmMsdiAxLjY5IDIwMTEvMTEvMjkgMTc6NDY6MzMgbGhmIEV4cCAkCisqKiBMdWEgY29tcGlsZXIgKHNhdmVzIGJ5dGVjb2RlcyB0byBmaWxlczsgYWxzbyBsaXN0IGJ5dGVjb2RlcykKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGx1YWNfYworI2RlZmluZSBMVUFfQ09SRQorCisjaW5jbHVkZSAibHVhLmgiCisjaW5jbHVkZSAibGF1eGxpYi5oIgorCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxzdGF0ZS5oIgorI2luY2x1ZGUgImx1bmR1bXAuaCIKKworc3RhdGljIHZvaWQgUHJpbnRGdW5jdGlvbihjb25zdCBQcm90byogZiwgaW50IGZ1bGwpOworI2RlZmluZSBsdWFVX3ByaW50CVByaW50RnVuY3Rpb24KKworI2RlZmluZSBQUk9HTkFNRQkibHVhYyIJCS8qIGRlZmF1bHQgcHJvZ3JhbSBuYW1lICovCisjZGVmaW5lIE9VVFBVVAkJUFJPR05BTUUgIi5vdXQiCS8qIGRlZmF1bHQgb3V0cHV0IGZpbGUgKi8KKworc3RhdGljIGludCBsaXN0aW5nPTA7CQkJLyogbGlzdCBieXRlY29kZXM/ICovCitzdGF0aWMgaW50IGR1bXBpbmc9MTsJCQkvKiBkdW1wIGJ5dGVjb2Rlcz8gKi8KK3N0YXRpYyBpbnQgc3RyaXBwaW5nPTA7CQkJLyogc3RyaXAgZGVidWcgaW5mb3JtYXRpb24/ICovCitzdGF0aWMgY2hhciBPdXRwdXRbXT17IE9VVFBVVCB9OwkvKiBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUgKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBvdXRwdXQ9T3V0cHV0OwkvKiBhY3R1YWwgb3V0cHV0IGZpbGUgbmFtZSAqLworc3RhdGljIGNvbnN0IGNoYXIqIHByb2duYW1lPVBST0dOQU1FOwkvKiBhY3R1YWwgcHJvZ3JhbSBuYW1lICovCisKK3N0YXRpYyB2b2lkIGZhdGFsKGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7CisgZnByaW50ZihzdGRlcnIsIiVzOiAlc1xuIixwcm9nbmFtZSxtZXNzYWdlKTsKKyBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK3N0YXRpYyB2b2lkIGNhbm5vdChjb25zdCBjaGFyKiB3aGF0KQoreworIGZwcmludGYoc3RkZXJyLCIlczogY2Fubm90ICVzICVzOiAlc1xuIixwcm9nbmFtZSx3aGF0LG91dHB1dCxzdHJlcnJvcihlcnJubykpOworIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciogbWVzc2FnZSkKK3sKKyBpZiAoKm1lc3NhZ2U9PSctJykKKyAgZnByaW50ZihzdGRlcnIsIiVzOiB1bnJlY29nbml6ZWQgb3B0aW9uICIgTFVBX1FTICJcbiIscHJvZ25hbWUsbWVzc2FnZSk7CisgZWxzZQorICBmcHJpbnRmKHN0ZGVyciwiJXM6ICVzXG4iLHByb2duYW1lLG1lc3NhZ2UpOworIGZwcmludGYoc3RkZXJyLAorICAidXNhZ2U6ICVzIFtvcHRpb25zXSBbZmlsZW5hbWVzXVxuIgorICAiQXZhaWxhYmxlIG9wdGlvbnMgYXJlOlxuIgorICAiICAtbCAgICAgICBsaXN0ICh1c2UgLWwgLWwgZm9yIGZ1bGwgbGlzdGluZylcbiIKKyAgIiAgLW8gbmFtZSAgb3V0cHV0IHRvIGZpbGUgIiBMVUFfUUwoIm5hbWUiKSAiIChkZWZhdWx0IGlzIFwiJXNcIilcbiIKKyAgIiAgLXAgICAgICAgcGFyc2Ugb25seVxuIgorICAiICAtcyAgICAgICBzdHJpcCBkZWJ1ZyBpbmZvcm1hdGlvblxuIgorICAiICAtdiAgICAgICBzaG93IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKKyAgIiAgLS0gICAgICAgc3RvcCBoYW5kbGluZyBvcHRpb25zXG4iCisgICIgIC0gICAgICAgIHN0b3AgaGFuZGxpbmcgb3B0aW9ucyBhbmQgcHJvY2VzcyBzdGRpblxuIgorICAscHJvZ25hbWUsT3V0cHV0KTsKKyBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKyNkZWZpbmUgSVMocykJKHN0cmNtcChhcmd2W2ldLHMpPT0wKQorCitzdGF0aWMgaW50IGRvYXJncyhpbnQgYXJnYywgY2hhciogYXJndltdKQoreworIGludCBpOworIGludCB2ZXJzaW9uPTA7CisgaWYgKGFyZ3ZbMF0hPU5VTEwgJiYgKmFyZ3ZbMF0hPTApIHByb2duYW1lPWFyZ3ZbMF07CisgZm9yIChpPTE7IGk8YXJnYzsgaSsrKQorIHsKKyAgaWYgKCphcmd2W2ldIT0nLScpCQkJLyogZW5kIG9mIG9wdGlvbnM7IGtlZXAgaXQgKi8KKyAgIGJyZWFrOworICBlbHNlIGlmIChJUygiLS0iKSkJCQkvKiBlbmQgb2Ygb3B0aW9uczsgc2tpcCBpdCAqLworICB7CisgICArK2k7CisgICBpZiAodmVyc2lvbikgKyt2ZXJzaW9uOworICAgYnJlYWs7CisgIH0KKyAgZWxzZSBpZiAoSVMoIi0iKSkJCQkvKiBlbmQgb2Ygb3B0aW9uczsgdXNlIHN0ZGluICovCisgICBicmVhazsKKyAgZWxzZSBpZiAoSVMoIi1sIikpCQkJLyogbGlzdCAqLworICAgKytsaXN0aW5nOworICBlbHNlIGlmIChJUygiLW8iKSkJCQkvKiBvdXRwdXQgZmlsZSAqLworICB7CisgICBvdXRwdXQ9YXJndlsrK2ldOworICAgaWYgKG91dHB1dD09TlVMTCB8fCAqb3V0cHV0PT0wIHx8ICgqb3V0cHV0PT0nLScgJiYgb3V0cHV0WzFdIT0wKSkKKyAgICB1c2FnZShMVUFfUUwoIi1vIikgIiBuZWVkcyBhcmd1bWVudCIpOworICAgaWYgKElTKCItIikpIG91dHB1dD1OVUxMOworICB9CisgIGVsc2UgaWYgKElTKCItcCIpKQkJCS8qIHBhcnNlIG9ubHkgKi8KKyAgIGR1bXBpbmc9MDsKKyAgZWxzZSBpZiAoSVMoIi1zIikpCQkJLyogc3RyaXAgZGVidWcgaW5mb3JtYXRpb24gKi8KKyAgIHN0cmlwcGluZz0xOworICBlbHNlIGlmIChJUygiLXYiKSkJCQkvKiBzaG93IHZlcnNpb24gKi8KKyAgICsrdmVyc2lvbjsKKyAgZWxzZQkJCQkJLyogdW5rbm93biBvcHRpb24gKi8KKyAgIHVzYWdlKGFyZ3ZbaV0pOworIH0KKyBpZiAoaT09YXJnYyAmJiAobGlzdGluZyB8fCAhZHVtcGluZykpCisgeworICBkdW1waW5nPTA7CisgIGFyZ3ZbLS1pXT1PdXRwdXQ7CisgfQorIGlmICh2ZXJzaW9uKQorIHsKKyAgcHJpbnRmKCIlc1xuIixMVUFfQ09QWVJJR0hUKTsKKyAgaWYgKHZlcnNpb249PWFyZ2MtMSkgZXhpdChFWElUX1NVQ0NFU1MpOworIH0KKyByZXR1cm4gaTsKK30KKworI2RlZmluZSBGVU5DVElPTiAiKGZ1bmN0aW9uKCllbmQpKCk7IgorCitzdGF0aWMgY29uc3QgY2hhciogcmVhZGVyKGx1YV9TdGF0ZSAqTCwgdm9pZCAqdWQsIHNpemVfdCAqc2l6ZSkKK3sKKyBVTlVTRUQoTCk7CisgaWYgKCgqKGludCopdWQpLS0pCisgeworICAqc2l6ZT1zaXplb2YoRlVOQ1RJT04pLTE7CisgIHJldHVybiBGVU5DVElPTjsKKyB9CisgZWxzZQorIHsKKyAgKnNpemU9MDsKKyAgcmV0dXJuIE5VTEw7CisgfQorfQorCisjZGVmaW5lIHRvcHJvdG8oTCxpKSBnZXRwcm90byhMLT50b3ArKGkpKQorCitzdGF0aWMgY29uc3QgUHJvdG8qIGNvbWJpbmUobHVhX1N0YXRlKiBMLCBpbnQgbikKK3sKKyBpZiAobj09MSkKKyAgcmV0dXJuIHRvcHJvdG8oTCwtMSk7CisgZWxzZQorIHsKKyAgUHJvdG8qIGY7CisgIGludCBpPW47CisgIGlmIChsdWFfbG9hZChMLHJlYWRlciwmaSwiPSgiIFBST0dOQU1FICIpIixOVUxMKSE9TFVBX09LKSBmYXRhbChsdWFfdG9zdHJpbmcoTCwtMSkpOworICBmPXRvcHJvdG8oTCwtMSk7CisgIGZvciAoaT0wOyBpPG47IGkrKykKKyAgeworICAgZi0+cFtpXT10b3Byb3RvKEwsaS1uLTEpOworICAgaWYgKGYtPnBbaV0tPnNpemV1cHZhbHVlcz4wKSBmLT5wW2ldLT51cHZhbHVlc1swXS5pbnN0YWNrPTA7CisgIH0KKyAgZi0+c2l6ZWxpbmVpbmZvPTA7CisgIHJldHVybiBmOworIH0KK30KKworc3RhdGljIGludCB3cml0ZXIobHVhX1N0YXRlKiBMLCBjb25zdCB2b2lkKiBwLCBzaXplX3Qgc2l6ZSwgdm9pZCogdSkKK3sKKyBVTlVTRUQoTCk7CisgcmV0dXJuIChmd3JpdGUocCxzaXplLDEsKEZJTEUqKXUpIT0xKSAmJiAoc2l6ZSE9MCk7Cit9CisKK3N0YXRpYyBpbnQgcG1haW4obHVhX1N0YXRlKiBMKQoreworIGludCBhcmdjPShpbnQpbHVhX3RvaW50ZWdlcihMLDEpOworIGNoYXIqKiBhcmd2PShjaGFyKiopbHVhX3RvdXNlcmRhdGEoTCwyKTsKKyBjb25zdCBQcm90byogZjsKKyBpbnQgaTsKKyBpZiAoIWx1YV9jaGVja3N0YWNrKEwsYXJnYykpIGZhdGFsKCJ0b28gbWFueSBpbnB1dCBmaWxlcyIpOworIGZvciAoaT0wOyBpPGFyZ2M7IGkrKykKKyB7CisgIGNvbnN0IGNoYXIqIGZpbGVuYW1lPUlTKCItIikgPyBOVUxMIDogYXJndltpXTsKKyAgaWYgKGx1YUxfbG9hZGZpbGUoTCxmaWxlbmFtZSkhPUxVQV9PSykgZmF0YWwobHVhX3Rvc3RyaW5nKEwsLTEpKTsKKyB9CisgZj1jb21iaW5lKEwsYXJnYyk7CisgaWYgKGxpc3RpbmcpIGx1YVVfcHJpbnQoZixsaXN0aW5nPjEpOworIGlmIChkdW1waW5nKQorIHsKKyAgRklMRSogRD0gKG91dHB1dD09TlVMTCkgPyBzdGRvdXQgOiBmb3BlbihvdXRwdXQsIndiIik7CisgIGlmIChEPT1OVUxMKSBjYW5ub3QoIm9wZW4iKTsKKyAgbHVhX2xvY2soTCk7CisgIGx1YVVfZHVtcChMLGYsd3JpdGVyLEQsc3RyaXBwaW5nKTsKKyAgbHVhX3VubG9jayhMKTsKKyAgaWYgKGZlcnJvcihEKSkgY2Fubm90KCJ3cml0ZSIpOworICBpZiAoZmNsb3NlKEQpKSBjYW5ub3QoImNsb3NlIik7CisgfQorIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworIGx1YV9TdGF0ZSogTDsKKyBpbnQgaT1kb2FyZ3MoYXJnYyxhcmd2KTsKKyBhcmdjLT1pOyBhcmd2Kz1pOworIGlmIChhcmdjPD0wKSB1c2FnZSgibm8gaW5wdXQgZmlsZXMgZ2l2ZW4iKTsKKyBMPWx1YUxfbmV3c3RhdGUoKTsKKyBpZiAoTD09TlVMTCkgZmF0YWwoImNhbm5vdCBjcmVhdGUgc3RhdGU6IG5vdCBlbm91Z2ggbWVtb3J5Iik7CisgbHVhX3B1c2hjZnVuY3Rpb24oTCwmcG1haW4pOworIGx1YV9wdXNoaW50ZWdlcihMLGFyZ2MpOworIGx1YV9wdXNobGlnaHR1c2VyZGF0YShMLGFyZ3YpOworIGlmIChsdWFfcGNhbGwoTCwyLDAsMCkhPUxVQV9PSykgZmF0YWwobHVhX3Rvc3RyaW5nKEwsLTEpKTsKKyBsdWFfY2xvc2UoTCk7CisgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworLyoKKyoqICRJZDogcHJpbnQuYyx2IDEuNjkgMjAxMy8wNy8wNCAwMTowMzo0NiBsaGYgRXhwICQKKyoqIHByaW50IGJ5dGVjb2RlcworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgbHVhY19jCisjZGVmaW5lIExVQV9DT1JFCisKKyNpbmNsdWRlICJsZGVidWcuaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibG9wY29kZXMuaCIKKworI2RlZmluZSBWT0lEKHApCQkoKGNvbnN0IHZvaWQqKShwKSkKKworc3RhdGljIHZvaWQgUHJpbnRTdHJpbmcoY29uc3QgVFN0cmluZyogdHMpCit7CisgY29uc3QgY2hhciogcz1nZXRzdHIodHMpOworIHNpemVfdCBpLG49dHMtPnRzdi5sZW47CisgcHJpbnRmKCIlYyIsJyInKTsKKyBmb3IgKGk9MDsgaTxuOyBpKyspCisgeworICBpbnQgYz0oaW50KSh1bnNpZ25lZCBjaGFyKXNbaV07CisgIHN3aXRjaCAoYykKKyAgeworICAgY2FzZSAnIic6ICBwcmludGYoIlxcXCIiKTsgYnJlYWs7CisgICBjYXNlICdcXCc6IHByaW50ZigiXFxcXCIpOyBicmVhazsKKyAgIGNhc2UgJ1xhJzogcHJpbnRmKCJcXGEiKTsgYnJlYWs7CisgICBjYXNlICdcYic6IHByaW50ZigiXFxiIik7IGJyZWFrOworICAgY2FzZSAnXGYnOiBwcmludGYoIlxcZiIpOyBicmVhazsKKyAgIGNhc2UgJ1xuJzogcHJpbnRmKCJcXG4iKTsgYnJlYWs7CisgICBjYXNlICdccic6IHByaW50ZigiXFxyIik7IGJyZWFrOworICAgY2FzZSAnXHQnOiBwcmludGYoIlxcdCIpOyBicmVhazsKKyAgIGNhc2UgJ1x2JzogcHJpbnRmKCJcXHYiKTsgYnJlYWs7CisgICBkZWZhdWx0OglpZiAoaXNwcmludChjKSkKKyAgIAkJCXByaW50ZigiJWMiLGMpOworCQllbHNlCisJCQlwcmludGYoIlxcJTAzZCIsYyk7CisgIH0KKyB9CisgcHJpbnRmKCIlYyIsJyInKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRDb25zdGFudChjb25zdCBQcm90byogZiwgaW50IGkpCit7CisgY29uc3QgVFZhbHVlKiBvPSZmLT5rW2ldOworIHN3aXRjaCAodHR5cGVudihvKSkKKyB7CisgIGNhc2UgTFVBX1ROSUw6CisJcHJpbnRmKCJuaWwiKTsKKwlicmVhazsKKyAgY2FzZSBMVUFfVEJPT0xFQU46CisJcHJpbnRmKGJ2YWx1ZShvKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCWJyZWFrOworICBjYXNlIExVQV9UTlVNQkVSOgorCXByaW50ZihMVUFfTlVNQkVSX0ZNVCxudmFsdWUobykpOworCWJyZWFrOworICBjYXNlIExVQV9UU1RSSU5HOgorCVByaW50U3RyaW5nKHJhd3RzdmFsdWUobykpOworCWJyZWFrOworICBkZWZhdWx0OgkJCQkvKiBjYW5ub3QgaGFwcGVuICovCisJcHJpbnRmKCI/IHR5cGU9JWQiLHR0eXBlKG8pKTsKKwlicmVhazsKKyB9Cit9CisKKyNkZWZpbmUgVVBWQUxOQU1FKHgpICgoZi0+dXB2YWx1ZXNbeF0ubmFtZSkgPyBnZXRzdHIoZi0+dXB2YWx1ZXNbeF0ubmFtZSkgOiAiLSIpCisjZGVmaW5lIE1ZSyh4KQkJKC0xLSh4KSkKKworc3RhdGljIHZvaWQgUHJpbnRDb2RlKGNvbnN0IFByb3RvKiBmKQoreworIGNvbnN0IEluc3RydWN0aW9uKiBjb2RlPWYtPmNvZGU7CisgaW50IHBjLG49Zi0+c2l6ZWNvZGU7CisgZm9yIChwYz0wOyBwYzxuOyBwYysrKQorIHsKKyAgSW5zdHJ1Y3Rpb24gaT1jb2RlW3BjXTsKKyAgT3BDb2RlIG89R0VUX09QQ09ERShpKTsKKyAgaW50IGE9R0VUQVJHX0EoaSk7CisgIGludCBiPUdFVEFSR19CKGkpOworICBpbnQgYz1HRVRBUkdfQyhpKTsKKyAgaW50IGF4PUdFVEFSR19BeChpKTsKKyAgaW50IGJ4PUdFVEFSR19CeChpKTsKKyAgaW50IHNieD1HRVRBUkdfc0J4KGkpOworICBpbnQgbGluZT1nZXRmdW5jbGluZShmLHBjKTsKKyAgcHJpbnRmKCJcdCVkXHQiLHBjKzEpOworICBpZiAobGluZT4wKSBwcmludGYoIlslZF1cdCIsbGluZSk7IGVsc2UgcHJpbnRmKCJbLV1cdCIpOworICBwcmludGYoIiUtOXNcdCIsbHVhUF9vcG5hbWVzW29dKTsKKyAgc3dpdGNoIChnZXRPcE1vZGUobykpCisgIHsKKyAgIGNhc2UgaUFCQzoKKyAgICBwcmludGYoIiVkIixhKTsKKyAgICBpZiAoZ2V0Qk1vZGUobykhPU9wQXJnTikgcHJpbnRmKCIgJWQiLElTSyhiKSA/IChNWUsoSU5ERVhLKGIpKSkgOiBiKTsKKyAgICBpZiAoZ2V0Q01vZGUobykhPU9wQXJnTikgcHJpbnRmKCIgJWQiLElTSyhjKSA/IChNWUsoSU5ERVhLKGMpKSkgOiBjKTsKKyAgICBicmVhazsKKyAgIGNhc2UgaUFCeDoKKyAgICBwcmludGYoIiVkIixhKTsKKyAgICBpZiAoZ2V0Qk1vZGUobyk9PU9wQXJnSykgcHJpbnRmKCIgJWQiLE1ZSyhieCkpOworICAgIGlmIChnZXRCTW9kZShvKT09T3BBcmdVKSBwcmludGYoIiAlZCIsYngpOworICAgIGJyZWFrOworICAgY2FzZSBpQXNCeDoKKyAgICBwcmludGYoIiVkICVkIixhLHNieCk7CisgICAgYnJlYWs7CisgICBjYXNlIGlBeDoKKyAgICBwcmludGYoIiVkIixNWUsoYXgpKTsKKyAgICBicmVhazsKKyAgfQorICBzd2l0Y2ggKG8pCisgIHsKKyAgIGNhc2UgT1BfTE9BREs6CisgICAgcHJpbnRmKCJcdDsgIik7IFByaW50Q29uc3RhbnQoZixieCk7CisgICAgYnJlYWs7CisgICBjYXNlIE9QX0dFVFVQVkFMOgorICAgY2FzZSBPUF9TRVRVUFZBTDoKKyAgICBwcmludGYoIlx0OyAlcyIsVVBWQUxOQU1FKGIpKTsKKyAgICBicmVhazsKKyAgIGNhc2UgT1BfR0VUVEFCVVA6CisgICAgcHJpbnRmKCJcdDsgJXMiLFVQVkFMTkFNRShiKSk7CisgICAgaWYgKElTSyhjKSkgeyBwcmludGYoIiAiKTsgUHJpbnRDb25zdGFudChmLElOREVYSyhjKSk7IH0KKyAgICBicmVhazsKKyAgIGNhc2UgT1BfU0VUVEFCVVA6CisgICAgcHJpbnRmKCJcdDsgJXMiLFVQVkFMTkFNRShhKSk7CisgICAgaWYgKElTSyhiKSkgeyBwcmludGYoIiAiKTsgUHJpbnRDb25zdGFudChmLElOREVYSyhiKSk7IH0KKyAgICBpZiAoSVNLKGMpKSB7IHByaW50ZigiICIpOyBQcmludENvbnN0YW50KGYsSU5ERVhLKGMpKTsgfQorICAgIGJyZWFrOworICAgY2FzZSBPUF9HRVRUQUJMRToKKyAgIGNhc2UgT1BfU0VMRjoKKyAgICBpZiAoSVNLKGMpKSB7IHByaW50ZigiXHQ7ICIpOyBQcmludENvbnN0YW50KGYsSU5ERVhLKGMpKTsgfQorICAgIGJyZWFrOworICAgY2FzZSBPUF9TRVRUQUJMRToKKyAgIGNhc2UgT1BfQUREOgorICAgY2FzZSBPUF9TVUI6CisgICBjYXNlIE9QX01VTDoKKyAgIGNhc2UgT1BfRElWOgorICAgY2FzZSBPUF9QT1c6CisgICBjYXNlIE9QX0VROgorICAgY2FzZSBPUF9MVDoKKyAgIGNhc2UgT1BfTEU6CisgICAgaWYgKElTSyhiKSB8fCBJU0soYykpCisgICAgeworICAgICBwcmludGYoIlx0OyAiKTsKKyAgICAgaWYgKElTSyhiKSkgUHJpbnRDb25zdGFudChmLElOREVYSyhiKSk7IGVsc2UgcHJpbnRmKCItIik7CisgICAgIHByaW50ZigiICIpOworICAgICBpZiAoSVNLKGMpKSBQcmludENvbnN0YW50KGYsSU5ERVhLKGMpKTsgZWxzZSBwcmludGYoIi0iKTsKKyAgICB9CisgICAgYnJlYWs7CisgICBjYXNlIE9QX0pNUDoKKyAgIGNhc2UgT1BfRk9STE9PUDoKKyAgIGNhc2UgT1BfRk9SUFJFUDoKKyAgIGNhc2UgT1BfVEZPUkxPT1A6CisgICAgcHJpbnRmKCJcdDsgdG8gJWQiLHNieCtwYysyKTsKKyAgICBicmVhazsKKyAgIGNhc2UgT1BfQ0xPU1VSRToKKyAgICBwcmludGYoIlx0OyAlcCIsVk9JRChmLT5wW2J4XSkpOworICAgIGJyZWFrOworICAgY2FzZSBPUF9TRVRMSVNUOgorICAgIGlmIChjPT0wKSBwcmludGYoIlx0OyAlZCIsKGludCljb2RlWysrcGNdKTsgZWxzZSBwcmludGYoIlx0OyAlZCIsYyk7CisgICAgYnJlYWs7CisgICBjYXNlIE9QX0VYVFJBQVJHOgorICAgIHByaW50ZigiXHQ7ICIpOyBQcmludENvbnN0YW50KGYsYXgpOworICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICBwcmludGYoIlxuIik7CisgfQorfQorCisjZGVmaW5lIFNTKHgpCSgoeD09MSk/IiI6InMiKQorI2RlZmluZSBTKHgpCShpbnQpKHgpLFNTKHgpCisKK3N0YXRpYyB2b2lkIFByaW50SGVhZGVyKGNvbnN0IFByb3RvKiBmKQoreworIGNvbnN0IGNoYXIqIHM9Zi0+c291cmNlID8gZ2V0c3RyKGYtPnNvdXJjZSkgOiAiPT8iOworIGlmICgqcz09J0AnIHx8ICpzPT0nPScpCisgIHMrKzsKKyBlbHNlIGlmICgqcz09TFVBX1NJR05BVFVSRVswXSkKKyAgcz0iKGJzdHJpbmcpIjsKKyBlbHNlCisgIHM9IihzdHJpbmcpIjsKKyBwcmludGYoIlxuJXMgPCVzOiVkLCVkPiAoJWQgaW5zdHJ1Y3Rpb24lcyBhdCAlcClcbiIsCisgCShmLT5saW5lZGVmaW5lZD09MCk/Im1haW4iOiJmdW5jdGlvbiIscywKKwlmLT5saW5lZGVmaW5lZCxmLT5sYXN0bGluZWRlZmluZWQsCisJUyhmLT5zaXplY29kZSksVk9JRChmKSk7CisgcHJpbnRmKCIlZCVzIHBhcmFtJXMsICVkIHNsb3QlcywgJWQgdXB2YWx1ZSVzLCAiLAorCShpbnQpKGYtPm51bXBhcmFtcyksZi0+aXNfdmFyYXJnPyIrIjoiIixTUyhmLT5udW1wYXJhbXMpLAorCVMoZi0+bWF4c3RhY2tzaXplKSxTKGYtPnNpemV1cHZhbHVlcykpOworIHByaW50ZigiJWQgbG9jYWwlcywgJWQgY29uc3RhbnQlcywgJWQgZnVuY3Rpb24lc1xuIiwKKwlTKGYtPnNpemVsb2N2YXJzKSxTKGYtPnNpemVrKSxTKGYtPnNpemVwKSk7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50RGVidWcoY29uc3QgUHJvdG8qIGYpCit7CisgaW50IGksbjsKKyBuPWYtPnNpemVrOworIHByaW50ZigiY29uc3RhbnRzICglZCkgZm9yICVwOlxuIixuLFZPSUQoZikpOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIHByaW50ZigiXHQlZFx0IixpKzEpOworICBQcmludENvbnN0YW50KGYsaSk7CisgIHByaW50ZigiXG4iKTsKKyB9Cisgbj1mLT5zaXplbG9jdmFyczsKKyBwcmludGYoImxvY2FscyAoJWQpIGZvciAlcDpcbiIsbixWT0lEKGYpKTsKKyBmb3IgKGk9MDsgaTxuOyBpKyspCisgeworICBwcmludGYoIlx0JWRcdCVzXHQlZFx0JWRcbiIsCisgIGksZ2V0c3RyKGYtPmxvY3ZhcnNbaV0udmFybmFtZSksZi0+bG9jdmFyc1tpXS5zdGFydHBjKzEsZi0+bG9jdmFyc1tpXS5lbmRwYysxKTsKKyB9Cisgbj1mLT5zaXpldXB2YWx1ZXM7CisgcHJpbnRmKCJ1cHZhbHVlcyAoJWQpIGZvciAlcDpcbiIsbixWT0lEKGYpKTsKKyBmb3IgKGk9MDsgaTxuOyBpKyspCisgeworICBwcmludGYoIlx0JWRcdCVzXHQlZFx0JWRcbiIsCisgIGksVVBWQUxOQU1FKGkpLGYtPnVwdmFsdWVzW2ldLmluc3RhY2ssZi0+dXB2YWx1ZXNbaV0uaWR4KTsKKyB9Cit9CisKK3N0YXRpYyB2b2lkIFByaW50RnVuY3Rpb24oY29uc3QgUHJvdG8qIGYsIGludCBmdWxsKQoreworIGludCBpLG49Zi0+c2l6ZXA7CisgUHJpbnRIZWFkZXIoZik7CisgUHJpbnRDb2RlKGYpOworIGlmIChmdWxsKSBQcmludERlYnVnKGYpOworIGZvciAoaT0wOyBpPG47IGkrKykgUHJpbnRGdW5jdGlvbihmLT5wW2ldLGZ1bGwpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sdWFjb25mLmggYi9jb20zMi9sdWEvc3JjL2x1YWNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFiOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sdWFjb25mLmgKQEAgLTAsMCArMSw2MDkgQEAKKy8qCisqKiAkSWQ6IGx1YWNvbmYuaCx2IDEuMTc2LjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgTHVhCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaWZuZGVmIGxjb25maWdfaAorI2RlZmluZSBsY29uZmlnX2gKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8qCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIFNlYXJjaCBmb3IgIkBAIiB0byBmaW5kIGFsbCBjb25maWd1cmFibGUgZGVmaW5pdGlvbnMuCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisKKy8qCitAQCBMVUFfQU5TSSBjb250cm9scyB0aGUgdXNlIG9mIG5vbi1hbnNpIGZlYXR1cmVzLgorKiogQ0hBTkdFIGl0IChkZWZpbmUgaXQpIGlmIHlvdSB3YW50IEx1YSB0byBhdm9pZCB0aGUgdXNlIG9mIGFueQorKiogbm9uLWFuc2kgZmVhdHVyZSBvciBsaWJyYXJ5LgorKi8KKyNpZiAhZGVmaW5lZChMVUFfQU5TSSkgJiYgZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCisjZGVmaW5lIExVQV9BTlNJCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoTFVBX0FOU0kpICYmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQorI2RlZmluZSBMVUFfV0lOCQkvKiBlbmFibGUgZ29vZGllcyBmb3IgcmVndWxhciBXaW5kb3dzIHBsYXRmb3JtcyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKExVQV9XSU4pCisjZGVmaW5lIExVQV9ETF9ETEwKKyNkZWZpbmUgTFVBX1VTRV9BRk9STUFUCQkvKiBhc3N1bWUgJ3ByaW50ZicgaGFuZGxlcyAnYUEnIHNwZWNpZmllcnMgKi8KKyNlbmRpZgorCisKKworI2lmIGRlZmluZWQoTFVBX1VTRV9MSU5VWCkKKyNkZWZpbmUgTFVBX1VTRV9QT1NJWAorI2RlZmluZSBMVUFfVVNFX0RMT1BFTgkJLyogbmVlZHMgYW4gZXh0cmEgbGlicmFyeTogLWxkbCAqLworI2RlZmluZSBMVUFfVVNFX1JFQURMSU5FCS8qIG5lZWRzIHNvbWUgZXh0cmEgbGlicmFyaWVzICovCisjZGVmaW5lIExVQV9VU0VfU1RSVE9ESEVYCS8qIGFzc3VtZSAnc3RydG9kJyBoYW5kbGVzIGhleCBmb3JtYXRzICovCisjZGVmaW5lIExVQV9VU0VfQUZPUk1BVAkJLyogYXNzdW1lICdwcmludGYnIGhhbmRsZXMgJ2FBJyBzcGVjaWZpZXJzICovCisjZGVmaW5lIExVQV9VU0VfTE9OR0xPTkcJLyogYXNzdW1lIHN1cHBvcnQgZm9yIGxvbmcgbG9uZyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKExVQV9VU0VfTUFDT1NYKQorI2RlZmluZSBMVUFfVVNFX1BPU0lYCisjZGVmaW5lIExVQV9VU0VfRExPUEVOCQkvKiBkb2VzIG5vdCBuZWVkIC1sZGwgKi8KKyNkZWZpbmUgTFVBX1VTRV9SRUFETElORQkvKiBuZWVkcyBhbiBleHRyYSBsaWJyYXJ5OiAtbHJlYWRsaW5lICovCisjZGVmaW5lIExVQV9VU0VfU1RSVE9ESEVYCS8qIGFzc3VtZSAnc3RydG9kJyBoYW5kbGVzIGhleCBmb3JtYXRzICovCisjZGVmaW5lIExVQV9VU0VfQUZPUk1BVAkJLyogYXNzdW1lICdwcmludGYnIGhhbmRsZXMgJ2FBJyBzcGVjaWZpZXJzICovCisjZGVmaW5lIExVQV9VU0VfTE9OR0xPTkcJLyogYXNzdW1lIHN1cHBvcnQgZm9yIGxvbmcgbG9uZyAqLworI2VuZGlmCisKKworCisvKgorQEAgTFVBX1VTRV9QT1NJWCBpbmNsdWRlcyBhbGwgZnVuY3Rpb25hbGl0eSBsaXN0ZWQgYXMgWC9PcGVuIFN5c3RlbQorQCogSW50ZXJmYWNlcyBFeHRlbnNpb24gKFhTSSkuCisqKiBDSEFOR0UgaXQgKGRlZmluZSBpdCkgaWYgeW91ciBzeXN0ZW0gaXMgWFNJIGNvbXBhdGlibGUuCisqLworI2lmIGRlZmluZWQoTFVBX1VTRV9QT1NJWCkKKyNkZWZpbmUgTFVBX1VTRV9NS1NURU1QCisjZGVmaW5lIExVQV9VU0VfSVNBVFRZCisjZGVmaW5lIExVQV9VU0VfUE9QRU4KKyNkZWZpbmUgTFVBX1VTRV9VTE9OR0pNUAorI2RlZmluZSBMVUFfVVNFX0dNVElNRV9SCisjZW5kaWYKKworCisKKy8qCitAQCBMVUFfUEFUSF9ERUZBVUxUIGlzIHRoZSBkZWZhdWx0IHBhdGggdGhhdCBMdWEgdXNlcyB0byBsb29rIGZvcgorQCogTHVhIGxpYnJhcmllcy4KK0BAIExVQV9DUEFUSF9ERUZBVUxUIGlzIHRoZSBkZWZhdWx0IHBhdGggdGhhdCBMdWEgdXNlcyB0byBsb29rIGZvcgorQCogQyBsaWJyYXJpZXMuCisqKiBDSEFOR0UgdGhlbSBpZiB5b3VyIG1hY2hpbmUgaGFzIGEgbm9uLWNvbnZlbnRpb25hbCBkaXJlY3RvcnkKKyoqIGhpZXJhcmNoeSBvciBpZiB5b3Ugd2FudCB0byBpbnN0YWxsIHlvdXIgbGlicmFyaWVzIGluCisqKiBub24tY29udmVudGlvbmFsIGRpcmVjdG9yaWVzLgorKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikJLyogeyAqLworLyoKKyoqIEluIFdpbmRvd3MsIGFueSBleGNsYW1hdGlvbiBtYXJrICgnIScpIGluIHRoZSBwYXRoIGlzIHJlcGxhY2VkIGJ5IHRoZQorKiogcGF0aCBvZiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBleGVjdXRhYmxlIGZpbGUgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyovCisjZGVmaW5lIExVQV9MRElSCSIhXFxsdWFcXCIKKyNkZWZpbmUgTFVBX0NESVIJIiFcXCIKKyNkZWZpbmUgTFVBX1BBVEhfREVGQVVMVCAgXAorCQlMVUFfTERJUiI/Lmx1YTsiICBMVUFfTERJUiI/XFxpbml0Lmx1YTsiIFwKKwkJTFVBX0NESVIiPy5sdWE7IiAgTFVBX0NESVIiP1xcaW5pdC5sdWE7IiAiLlxcPy5sdWEiCisjZGVmaW5lIExVQV9DUEFUSF9ERUZBVUxUIFwKKwkJTFVBX0NESVIiPy5kbGw7IiBMVUFfQ0RJUiJsb2FkYWxsLmRsbDsiICIuXFw/LmRsbCIKKworI2VsaWYgZGVmaW5lZChTWVNMSU5VWCkKKy8qIEV4dGVuc2lvbnMgZm9yIGNvbnZlcnRpbmcgdGhlIFN5c2xpbnV4IHBhdGggaW50byBwYWNrYWdlIGxvYWQgcGF0aHMgKi8KKyNkZWZpbmUgTFVBX1BBVEhfREVGQVVMVCAgIi5sdWEiCisjZGVmaW5lIExVQV9DUEFUSF9ERUZBVUxUICIuYzMyIgorI2Vsc2UJCQkvKiB9eyAqLworCisjZGVmaW5lIExVQV9WRElSCUxVQV9WRVJTSU9OX01BSk9SICIuIiBMVUFfVkVSU0lPTl9NSU5PUiAiLyIKKyNkZWZpbmUgTFVBX1JPT1QJIi91c3IvbG9jYWwvIgorI2RlZmluZSBMVUFfTERJUglMVUFfUk9PVCAic2hhcmUvbHVhLyIgTFVBX1ZESVIKKyNkZWZpbmUgTFVBX0NESVIJTFVBX1JPT1QgImxpYi9sdWEvIiBMVUFfVkRJUgorI2RlZmluZSBMVUFfUEFUSF9ERUZBVUxUICBcCisJCUxVQV9MRElSIj8ubHVhOyIgIExVQV9MRElSIj8vaW5pdC5sdWE7IiBcCisJCUxVQV9DRElSIj8ubHVhOyIgIExVQV9DRElSIj8vaW5pdC5sdWE7IiAiLi8/Lmx1YSIKKyNkZWZpbmUgTFVBX0NQQVRIX0RFRkFVTFQgXAorCQlMVUFfQ0RJUiI/LnNvOyIgTFVBX0NESVIibG9hZGFsbC5zbzsiICIuLz8uc28iCisjZW5kaWYJCQkvKiB9ICovCisKKworLyoKK0BAIExVQV9ESVJTRVAgaXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgKGZvciBzdWJtb2R1bGVzKS4KKyoqIENIQU5HRSBpdCBpZiB5b3VyIG1hY2hpbmUgZG9lcyBub3QgdXNlICIvIiBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvcgorKiogYW5kIGlzIG5vdCBXaW5kb3dzLiAoT24gV2luZG93cyBMdWEgYXV0b21hdGljYWxseSB1c2VzICJcIi4pCisqLworI2lmIGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBMVUFfRElSU0VQCSJcXCIKKyNlbHNlCisjZGVmaW5lIExVQV9ESVJTRVAJIi8iCisjZW5kaWYKKworCisvKgorQEAgTFVBX0VOViBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgY3VycmVudAorQEAgZW52aXJvbm1lbnQsIHVzZWQgdG8gYWNjZXNzIGdsb2JhbCBuYW1lcy4KKyoqIENIQU5HRSBpdCBpZiB5b3UgZG8gbm90IGxpa2UgdGhpcyBuYW1lLgorKi8KKyNkZWZpbmUgTFVBX0VOVgkJIl9FTlYiCisKKworLyoKK0BAIExVQV9BUEkgaXMgYSBtYXJrIGZvciBhbGwgY29yZSBBUEkgZnVuY3Rpb25zLgorQEAgTFVBTElCX0FQSSBpcyBhIG1hcmsgZm9yIGFsbCBhdXhpbGlhcnkgbGlicmFyeSBmdW5jdGlvbnMuCitAQCBMVUFNT0RfQVBJIGlzIGEgbWFyayBmb3IgYWxsIHN0YW5kYXJkIGxpYnJhcnkgb3BlbmluZyBmdW5jdGlvbnMuCisqKiBDSEFOR0UgdGhlbSBpZiB5b3UgbmVlZCB0byBkZWZpbmUgdGhvc2UgZnVuY3Rpb25zIGluIHNvbWUgc3BlY2lhbCB3YXkuCisqKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBvbmUgV2luZG93cyBETEwgd2l0aCB0aGUgY29yZSBhbmQKKyoqIHRoZSBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byB1c2UgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIChkZWZpbmUKKyoqIExVQV9CVUlMRF9BU19ETEwgdG8gZ2V0IGl0KS4KKyovCisjaWYgZGVmaW5lZChMVUFfQlVJTERfQVNfRExMKQkvKiB7ICovCisKKyNpZiBkZWZpbmVkKExVQV9DT1JFKSB8fCBkZWZpbmVkKExVQV9MSUIpCS8qIHsgKi8KKyNkZWZpbmUgTFVBX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNlbHNlCQkJCQkJLyogfXsgKi8KKyNkZWZpbmUgTFVBX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbmRpZgkJCQkJCS8qIH0gKi8KKworI2Vsc2UJCQkJLyogfXsgKi8KKworI2RlZmluZSBMVUFfQVBJCQlleHRlcm4KKworI2VuZGlmCQkJCS8qIH0gKi8KKworCisvKiBtb3JlIG9mdGVuIHRoYW4gbm90IHRoZSBsaWJzIGdvIHRvZ2V0aGVyIHdpdGggdGhlIGNvcmUgKi8KKyNkZWZpbmUgTFVBTElCX0FQSQlMVUFfQVBJCisjZGVmaW5lIExVQU1PRF9BUEkJTFVBTElCX0FQSQorCisKKy8qCitAQCBMVUFJX0ZVTkMgaXMgYSBtYXJrIGZvciBhbGwgZXh0ZXJuIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgdG8gYmUKK0AqIGV4cG9ydGVkIHRvIG91dHNpZGUgbW9kdWxlcy4KK0BAIExVQUlfRERFRiBhbmQgTFVBSV9EREVDIGFyZSBtYXJrcyBmb3IgYWxsIGV4dGVybiAoY29uc3QpIHZhcmlhYmxlcworQCogdGhhdCBhcmUgbm90IHRvIGJlIGV4cG9ydGVkIHRvIG91dHNpZGUgbW9kdWxlcyAoTFVBSV9EREVGIGZvcgorQCogZGVmaW5pdGlvbnMgYW5kIExVQUlfRERFQyBmb3IgZGVjbGFyYXRpb25zKS4KKyoqIENIQU5HRSB0aGVtIGlmIHlvdSBuZWVkIHRvIG1hcmsgdGhlbSBpbiBzb21lIHNwZWNpYWwgd2F5LiBFbGYvZ2NjCisqKiAodmVyc2lvbnMgMy4yIGFuZCBsYXRlcikgbWFyayB0aGVtIGFzICJoaWRkZW4iIHRvIG9wdGltaXplIGFjY2VzcworKiogd2hlbiBMdWEgaXMgY29tcGlsZWQgYXMgYSBzaGFyZWQgbGlicmFyeS4gTm90IGFsbCBlbGYgdGFyZ2V0cyBzdXBwb3J0CisqKiB0aGlzIGF0dHJpYnV0ZS4gVW5mb3J0dW5hdGVseSwgZ2NjIGRvZXMgbm90IG9mZmVyIGEgd2F5IHRvIGNoZWNrCisqKiB3aGV0aGVyIHRoZSB0YXJnZXQgb2ZmZXJzIHRoYXQgc3VwcG9ydCwgYW5kIHRob3NlIHdpdGhvdXQgc3VwcG9ydAorKiogZ2l2ZSBhIHdhcm5pbmcgYWJvdXQgaXQuIFRvIGF2b2lkIHRoZXNlIHdhcm5pbmdzLCBjaGFuZ2UgdG8gdGhlCisqKiBkZWZhdWx0IGRlZmluaXRpb24uCisqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18qMTAwICsgX19HTlVDX01JTk9SX18pID49IDMwMikgJiYgXAorICAgIGRlZmluZWQoX19FTEZfXykJCS8qIHsgKi8KKyNkZWZpbmUgTFVBSV9GVU5DCV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkgZXh0ZXJuCisjZGVmaW5lIExVQUlfRERFQwlMVUFJX0ZVTkMKKyNkZWZpbmUgTFVBSV9EREVGCS8qIGVtcHR5ICovCisKKyNlbHNlCQkJCS8qIH17ICovCisjZGVmaW5lIExVQUlfRlVOQwlleHRlcm4KKyNkZWZpbmUgTFVBSV9EREVDCWV4dGVybgorI2RlZmluZSBMVUFJX0RERUYJLyogZW1wdHkgKi8KKyNlbmRpZgkJCQkvKiB9ICovCisKKworCisvKgorQEAgTFVBX1FMIGRlc2NyaWJlcyBob3cgZXJyb3IgbWVzc2FnZXMgcXVvdGUgcHJvZ3JhbSBlbGVtZW50cy4KKyoqIENIQU5HRSBpdCBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBhcHBlYXJhbmNlLgorKi8KKyNkZWZpbmUgTFVBX1FMKHgpCSInIiB4ICInIgorI2RlZmluZSBMVUFfUVMJCUxVQV9RTCgiJXMiKQorCisKKy8qCitAQCBMVUFfSURTSVpFIGdpdmVzIHRoZSBtYXhpbXVtIHNpemUgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc291cmNlCitAKiBvZiBhIGZ1bmN0aW9uIGluIGRlYnVnIGluZm9ybWF0aW9uLgorKiogQ0hBTkdFIGl0IGlmIHlvdSB3YW50IGEgZGlmZmVyZW50IHNpemUuCisqLworI2RlZmluZSBMVUFfSURTSVpFCTYwCisKKworLyoKK0BAIGx1YWlfd3JpdGVzdHJpbmcvbHVhaV93cml0ZWxpbmUgZGVmaW5lIGhvdyAncHJpbnQnIHByaW50cyBpdHMgcmVzdWx0cy4KKyoqIFRoZXkgYXJlIG9ubHkgdXNlZCBpbiBsaWJyYXJpZXMgYW5kIHRoZSBzdGFuZC1hbG9uZSBwcm9ncmFtLiAoVGhlICNpZgorKiogYXZvaWRzIGluY2x1ZGluZyAnc3RkaW8uaCcgZXZlcnl3aGVyZS4pCisqLworI2lmIGRlZmluZWQoTFVBX0xJQikgfHwgZGVmaW5lZChsdWFfYykKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBsdWFpX3dyaXRlc3RyaW5nKHMsbCkJZndyaXRlKChzKSwgc2l6ZW9mKGNoYXIpLCAobCksIHN0ZG91dCkKKyNkZWZpbmUgbHVhaV93cml0ZWxpbmUoKQkobHVhaV93cml0ZXN0cmluZygiXG4iLCAxKSwgZmZsdXNoKHN0ZG91dCkpCisjZW5kaWYKKworLyoKK0BAIGx1YWlfd3JpdGVzdHJpbmdlcnJvciBkZWZpbmVzIGhvdyB0byBwcmludCBlcnJvciBtZXNzYWdlcy4KKyoqIChBIGZvcm1hdCBzdHJpbmcgd2l0aCBvbmUgYXJndW1lbnQgaXMgZW5vdWdoIGZvciBMdWEuLi4pCisqLworI2RlZmluZSBsdWFpX3dyaXRlc3RyaW5nZXJyb3IocyxwKSBcCisJKGZwcmludGYoc3RkZXJyLCAocyksIChwKSksIGZmbHVzaChzdGRlcnIpKQorCisKKy8qCitAQCBMVUFJX01BWFNIT1JUTEVOIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3Igc2hvcnQgc3RyaW5ncywgdGhhdCBpcywKKyoqIHN0cmluZ3MgdGhhdCBhcmUgaW50ZXJuYWxpemVkLiAoQ2Fubm90IGJlIHNtYWxsZXIgdGhhbiByZXNlcnZlZCB3b3JkcworKiogb3IgdGFncyBmb3IgbWV0YW1ldGhvZHMsIGFzIHRoZXNlIHN0cmluZ3MgbXVzdCBiZSBpbnRlcm5hbGl6ZWQ7CisqKiAjKCJmdW5jdGlvbiIpID0gOCwgIygiX19uZXdpbmRleCIpID0gMTAuKQorKi8KKyNkZWZpbmUgTFVBSV9NQVhTSE9SVExFTiAgICAgICAgNDAKKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBDb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnMKKyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKy8qCitAQCBMVUFfQ09NUEFUX0FMTCBjb250cm9scyBhbGwgY29tcGF0aWJpbGl0eSBvcHRpb25zLgorKiogWW91IGNhbiBkZWZpbmUgaXQgdG8gZ2V0IGFsbCBvcHRpb25zLCBvciBjaGFuZ2Ugc3BlY2lmaWMgb3B0aW9ucworKiogdG8gZml0IHlvdXIgc3BlY2lmaWMgbmVlZHMuCisqLworI2lmIGRlZmluZWQoTFVBX0NPTVBBVF9BTEwpCS8qIHsgKi8KKworLyoKK0BAIExVQV9DT01QQVRfVU5QQUNLIGNvbnRyb2xzIHRoZSBwcmVzZW5jZSBvZiBnbG9iYWwgJ3VucGFjaycuCisqKiBZb3UgY2FuIHJlcGxhY2UgaXQgd2l0aCAndGFibGUudW5wYWNrJy4KKyovCisjZGVmaW5lIExVQV9DT01QQVRfVU5QQUNLCisKKy8qCitAQCBMVUFfQ09NUEFUX0xPQURFUlMgY29udHJvbHMgdGhlIHByZXNlbmNlIG9mIHRhYmxlICdwYWNrYWdlLmxvYWRlcnMnLgorKiogWW91IGNhbiByZXBsYWNlIGl0IHdpdGggJ3BhY2thZ2Uuc2VhcmNoZXJzJy4KKyovCisjZGVmaW5lIExVQV9DT01QQVRfTE9BREVSUworCisvKgorQEAgbWFjcm8gJ2x1YV9jcGNhbGwnIGVtdWxhdGVzIGRlcHJlY2F0ZWQgZnVuY3Rpb24gbHVhX2NwY2FsbC4KKyoqIFlvdSBjYW4gY2FsbCB5b3VyIEMgZnVuY3Rpb24gZGlyZWN0bHkgKHdpdGggbGlnaHQgQyBmdW5jdGlvbnMpLgorKi8KKyNkZWZpbmUgbHVhX2NwY2FsbChMLGYsdSkgIFwKKwkobHVhX3B1c2hjZnVuY3Rpb24oTCwgKGYpKSwgXAorCSBsdWFfcHVzaGxpZ2h0dXNlcmRhdGEoTCwodSkpLCBcCisJIGx1YV9wY2FsbChMLDEsMCwwKSkKKworCisvKgorQEAgTFVBX0NPTVBBVF9MT0cxMCBkZWZpbmVzIHRoZSBmdW5jdGlvbiAnbG9nMTAnIGluIHRoZSBtYXRoIGxpYnJhcnkuCisqKiBZb3UgY2FuIHJld3JpdGUgJ2xvZzEwKHgpJyBhcyAnbG9nKHgsIDEwKScuCisqLworI2RlZmluZSBMVUFfQ09NUEFUX0xPRzEwCisKKy8qCitAQCBMVUFfQ09NUEFUX0xPQURTVFJJTkcgZGVmaW5lcyB0aGUgZnVuY3Rpb24gJ2xvYWRzdHJpbmcnIGluIHRoZSBiYXNlCisqKiBsaWJyYXJ5LiBZb3UgY2FuIHJld3JpdGUgJ2xvYWRzdHJpbmcocyknIGFzICdsb2FkKHMpJy4KKyovCisjZGVmaW5lIExVQV9DT01QQVRfTE9BRFNUUklORworCisvKgorQEAgTFVBX0NPTVBBVF9NQVhOIGRlZmluZXMgdGhlIGZ1bmN0aW9uICdtYXhuJyBpbiB0aGUgdGFibGUgbGlicmFyeS4KKyovCisjZGVmaW5lIExVQV9DT01QQVRfTUFYTgorCisvKgorQEAgVGhlIGZvbGxvd2luZyBtYWNyb3Mgc3VwcGx5IHRyaXZpYWwgY29tcGF0aWJpbGl0eSBmb3Igc29tZQorKiogY2hhbmdlcyBpbiB0aGUgQVBJLiBUaGUgbWFjcm9zIHRoZW1zZWx2ZXMgZG9jdW1lbnQgaG93IHRvCisqKiBjaGFuZ2UgeW91ciBjb2RlIHRvIGF2b2lkIHVzaW5nIHRoZW0uCisqLworI2RlZmluZSBsdWFfc3RybGVuKEwsaSkJCWx1YV9yYXdsZW4oTCwgKGkpKQorCisjZGVmaW5lIGx1YV9vYmpsZW4oTCxpKQkJbHVhX3Jhd2xlbihMLCAoaSkpCisKKyNkZWZpbmUgbHVhX2VxdWFsKEwsaWR4MSxpZHgyKQkJbHVhX2NvbXBhcmUoTCwoaWR4MSksKGlkeDIpLExVQV9PUEVRKQorI2RlZmluZSBsdWFfbGVzc3RoYW4oTCxpZHgxLGlkeDIpCWx1YV9jb21wYXJlKEwsKGlkeDEpLChpZHgyKSxMVUFfT1BMVCkKKworLyoKK0BAIExVQV9DT01QQVRfTU9EVUxFIGNvbnRyb2xzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cworKiogbW9kdWxlIGZ1bmN0aW9ucyAnbW9kdWxlJyAoTHVhKSBhbmQgJ2x1YUxfcmVnaXN0ZXInIChDKS4KKyovCisjZGVmaW5lIExVQV9DT01QQVRfTU9EVUxFCisKKyNlbmRpZgkJCQkvKiB9ICovCisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisKKy8qCitAQCBMVUFJX0JJVFNJTlQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYW4gaW50LgorKiogQ0hBTkdFIGhlcmUgaWYgTHVhIGNhbm5vdCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgbnVtYmVyIG9mIGJpdHMgb2YKKyoqIHlvdXIgbWFjaGluZS4gUHJvYmFibHkgeW91IGRvIG5vdCBuZWVkIHRvIGNoYW5nZSB0aGlzLgorKi8KKy8qIGF2b2lkIG92ZXJmbG93cyBpbiBjb21wYXJpc29uICovCisjaWYgSU5UX01BWC0yMCA8IDMyNzYwCQkvKiB7ICovCisjZGVmaW5lIExVQUlfQklUU0lOVAkxNgorI2VsaWYgSU5UX01BWCA+IDIxNDc0ODM2NDBMCS8qIH17ICovCisvKiBpbnQgaGFzIGF0IGxlYXN0IDMyIGJpdHMgKi8KKyNkZWZpbmUgTFVBSV9CSVRTSU5UCTMyCisjZWxzZQkJCQkvKiB9eyAqLworI2Vycm9yICJ5b3UgbXVzdCBkZWZpbmUgTFVBX0JJVFNJTlQgd2l0aCBudW1iZXIgb2YgYml0cyBpbiBhbiBpbnRlZ2VyIgorI2VuZGlmCQkJCS8qIH0gKi8KKworCisvKgorQEAgTFVBX0lOVDMyIGlzIGFuIHNpZ25lZCBpbnRlZ2VyIHdpdGggZXhhY3RseSAzMiBiaXRzLgorQEAgTFVBSV9VTUVNIGlzIGFuIHVuc2lnbmVkIGludGVnZXIgYmlnIGVub3VnaCB0byBjb3VudCB0aGUgdG90YWwKK0AqIG1lbW9yeSB1c2VkIGJ5IEx1YS4KK0BAIExVQUlfTUVNIGlzIGEgc2lnbmVkIGludGVnZXIgYmlnIGVub3VnaCB0byBjb3VudCB0aGUgdG90YWwgbWVtb3J5CitAKiB1c2VkIGJ5IEx1YS4KKyoqIENIQU5HRSBoZXJlIGlmIGZvciBzb21lIHdlaXJkIHJlYXNvbiB0aGUgZGVmYXVsdCBkZWZpbml0aW9ucyBhcmUgbm90CisqKiBnb29kIGVub3VnaCBmb3IgeW91ciBtYWNoaW5lLiBQcm9iYWJseSB5b3UgZG8gbm90IG5lZWQgdG8gY2hhbmdlCisqKiB0aGlzLgorKi8KKyNpZiBMVUFJX0JJVFNJTlQgPj0gMzIJCS8qIHsgKi8KKyNkZWZpbmUgTFVBX0lOVDMyCWludAorI2RlZmluZSBMVUFJX1VNRU0Jc2l6ZV90CisjZGVmaW5lIExVQUlfTUVNCXB0cmRpZmZfdAorI2Vsc2UJCQkJLyogfXsgKi8KKy8qIDE2LWJpdCBpbnRzICovCisjZGVmaW5lIExVQV9JTlQzMglsb25nCisjZGVmaW5lIExVQUlfVU1FTQl1bnNpZ25lZCBsb25nCisjZGVmaW5lIExVQUlfTUVNCWxvbmcKKyNlbmRpZgkJCQkvKiB9ICovCisKKworLyoKK0BAIExVQUlfTUFYU1RBQ0sgbGltaXRzIHRoZSBzaXplIG9mIHRoZSBMdWEgc3RhY2suCisqKiBDSEFOR0UgaXQgaWYgeW91IG5lZWQgYSBkaWZmZXJlbnQgbGltaXQuIFRoaXMgbGltaXQgaXMgYXJiaXRyYXJ5OworKiogaXRzIG9ubHkgcHVycG9zZSBpcyB0byBzdG9wIEx1YSB0byBjb25zdW1lIHVubGltaXRlZCBzdGFjaworKiogc3BhY2UgKGFuZCB0byByZXNlcnZlIHNvbWUgbnVtYmVycyBmb3IgcHNldWRvLWluZGljZXMpLgorKi8KKyNpZiBMVUFJX0JJVFNJTlQgPj0gMzIKKyNkZWZpbmUgTFVBSV9NQVhTVEFDSwkJMTAwMDAwMAorI2Vsc2UKKyNkZWZpbmUgTFVBSV9NQVhTVEFDSwkJMTUwMDAKKyNlbmRpZgorCisvKiByZXNlcnZlIHNvbWUgc3BhY2UgZm9yIGVycm9yIGhhbmRsaW5nICovCisjZGVmaW5lIExVQUlfRklSU1RQU0VVRE9JRFgJKC1MVUFJX01BWFNUQUNLIC0gMTAwMCkKKworCisKKworLyoKK0BAIExVQUxfQlVGRkVSU0laRSBpcyB0aGUgYnVmZmVyIHNpemUgdXNlZCBieSB0aGUgbGF1eGxpYiBidWZmZXIgc3lzdGVtLgorKiogQ0hBTkdFIGl0IGlmIGl0IHVzZXMgdG9vIG11Y2ggQy1zdGFjayBzcGFjZS4KKyovCisjZGVmaW5lIExVQUxfQlVGRkVSU0laRQkJQlVGU0laCisKKworCisKKy8qCisqKiB7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitAQCBMVUFfTlVNQkVSIGlzIHRoZSB0eXBlIG9mIG51bWJlcnMgaW4gTHVhLgorKiogQ0hBTkdFIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgb25seSBpZiB5b3Ugd2FudCB0byBidWlsZCBMdWEKKyoqIHdpdGggYSBudW1iZXIgdHlwZSBkaWZmZXJlbnQgZnJvbSBkb3VibGUuIFlvdSBtYXkgYWxzbyBuZWVkIHRvCisqKiBjaGFuZ2UgbHVhX251bWJlcjJpbnQgJiBsdWFfbnVtYmVyMmludGVnZXIuCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKiBEZWZpbmUgTFVBX05VTUJFUl9JTlRFR1JBTCB0byBwcm9kdWNlIGEgc3lzdGVtIHRoYXQgdXNlcyBubworICAgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyBieSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBMdWEgbnVtYmVycyBmcm9tCisgICBkb3VibGUgdG8gbG9uZy4gIEl0IGltcGxlbWVudHMgZGl2aXNpb24gYW5kIG1vZHVsdXMgc28gdGhhdCAKKworICAgeCA9PSAoeCAvIHkpICogeSArIHggJSB5LiAgCisgICAKKyAgIFRoZSBleHBvbmVudGlhdGlvbiBmdW5jdGlvbiByZXR1cm5zIHplcm8gZm9yIG5lZ2F0aXZlIGV4cG9uZW50cy4KKyAgIERlZmluaW5nIExVQV9OVU1CRVJfSU5URUdSQUwgYWxzbyByZW1vdmVzIHRoZSBkaWZmdGltZSBmdW5jdGlvbiwKKyAgIGFuZCB0aGUgbWF0aCBtb2R1bGUgc2hvdWxkIG5vdCBiZSB1c2VkLiAgVGhlIHN0cmluZy5mb3JtYXQgZnVuY3Rpb24KKyAgIG5vIGxvbmdlciBoYW5kbGVzIHRoZSBmbG9hdGluZyBwb2ludCBkaXJlY3RpdmVzICVlLCAlRSwgJWYsICVnLCBhbmQKKyAgICVHLiAqLworCisjZGVmaW5lIExVQV9OVU1CRVJfSU5URUdSQUwKKyNpZmRlZiBMVUFfTlVNQkVSX0lOVEVHUkFMCisjZGVmaW5lIExVQV9OVU1CRVIJbG9uZworI2Vsc2UKKyNkZWZpbmUgTFVBX05VTUJFUl9ET1VCTEUKKyNkZWZpbmUgTFVBX05VTUJFUglkb3VibGUKKyNlbmRpZgorCisvKgorQEAgTFVBSV9VQUNOVU1CRVIgaXMgdGhlIHJlc3VsdCBvZiBhbiAndXN1YWwgYXJndW1lbnQgY29udmVyc2lvbicKK0AqIG92ZXIgYSBudW1iZXIuCisqLworI2RlZmluZSBMVUFJX1VBQ05VTUJFUglMVUFfTlVNQkVSCisKKworLyoKK0BAIExVQV9OVU1CRVJfU0NBTiBpcyB0aGUgZm9ybWF0IGZvciByZWFkaW5nIG51bWJlcnMuCitAQCBMVUFfTlVNQkVSX0ZNVCBpcyB0aGUgZm9ybWF0IGZvciB3cml0aW5nIG51bWJlcnMuCitAQCBsdWFfbnVtYmVyMnN0ciBjb252ZXJ0cyBhIG51bWJlciB0byBhIHN0cmluZy4KK0BAIExVQUlfTUFYTlVNQkVSMlNUUiBpcyBtYXhpbXVtIHNpemUgb2YgcHJldmlvdXMgY29udmVyc2lvbi4KKyovCisjaWZkZWYgTFVBX05VTUJFUl9JTlRFR1JBTAorI2RlZmluZSBMVUFfTlVNQkVSX1NDQU4JCSIlbGQiCisjZGVmaW5lIExVQV9OVU1CRVJfRk1UCQkiJWxkIgorI2Vsc2UKKyNkZWZpbmUgTFVBX05VTUJFUl9TQ0FOCQkiJWxmIgorI2RlZmluZSBMVUFfTlVNQkVSX0ZNVAkJIiUuMTRnIgorI2VuZGlmCisjZGVmaW5lIGx1YV9udW1iZXIyc3RyKHMsbikJc3ByaW50ZigocyksIExVQV9OVU1CRVJfRk1ULCAobikpCisjZGVmaW5lIExVQUlfTUFYTlVNQkVSMlNUUgkzMiAvKiAxNiBkaWdpdHMsIHNpZ24sIHBvaW50LCBhbmQgXDAgKi8KKworCisvKgorQEAgbF9tYXRob3AgYWxsb3dzIHRoZSBhZGRpdGlvbiBvZiBhbiAnbCcgb3IgJ2YnIHRvIGFsbCBtYXRoIG9wZXJhdGlvbnMKKyovCisjZGVmaW5lIGxfbWF0aG9wKHgpCQkoeCkKKworCisvKgorQEAgbHVhX3N0cjJudW1iZXIgY29udmVydHMgYSBkZWNpbWFsIG51bWVyaWMgc3RyaW5nIHRvIGEgbnVtYmVyLgorQEAgbHVhX3N0cngybnVtYmVyIGNvbnZlcnRzIGFuIGhleGFkZWNpbWFsIG51bWVyaWMgc3RyaW5nIHRvIGEgbnVtYmVyLgorKiogSW4gQzk5LCAnc3RydG9kJyBkb2VzIGJvdGggY29udmVyc2lvbnMuIEM4OSwgaG93ZXZlciwgaGFzIG5vIGZ1bmN0aW9uCisqKiB0byBjb252ZXJ0IGZsb2F0aW5nIGhleGFkZWNpbWFsIHN0cmluZ3MgdG8gbnVtYmVycy4gRm9yIHRoZXNlCisqKiBzeXN0ZW1zLCB5b3UgY2FuIGxlYXZlICdsdWFfc3RyeDJudW1iZXInIHVuZGVmaW5lZCBhbmQgTHVhIHdpbGwKKyoqIHByb3ZpZGUgaXRzIG93biBpbXBsZW1lbnRhdGlvbi4KKyovCisjaWZkZWYgTFVBX05VTUJFUl9JTlRFR1JBTAorI2RlZmluZSBsdWFfc3RyMm51bWJlcihzLHApCXN0cnRvbCgocyksIChwKSwgMTApCisjZWxzZQorI2RlZmluZSBsdWFfc3RyMm51bWJlcihzLHApCXN0cnRvZCgocyksIChwKSkKKyNlbmRpZgorCisjaWZkZWYgU1lTTElOVVgKKyNkZWZpbmUgbHVhX3N0cngybnVtYmVyKHMscCkJc3RydG9sKChzKSwgKHApLCAxNikKKyNlbmRpZgorCisKKy8qCitAQCBUaGUgbHVhaV9udW0qIG1hY3JvcyBkZWZpbmUgdGhlIHByaW1pdGl2ZSBvcGVyYXRpb25zIG92ZXIgbnVtYmVycy4KKyovCisKKyNpZm5kZWYgTFVBX05VTUJFUl9JTlRFR1JBTAorLyogdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIG5lZWQgdGhlIG1hdGggbGlicmFyeSAqLworI2lmIGRlZmluZWQobG9iamVjdF9jKSB8fCBkZWZpbmVkKGx2bV9jKQorI2luY2x1ZGUgPG1hdGguaD4KKyNkZWZpbmUgbHVhaV9udW1tb2QoTCxhLGIpCSgoYSkgLSBsX21hdGhvcChmbG9vcikoKGEpLyhiKSkqKGIpKQorI2RlZmluZSBsdWFpX251bXBvdyhMLGEsYikJKGxfbWF0aG9wKHBvdykoYSxiKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIHRoZXNlIGFyZSBxdWl0ZSBzdGFuZGFyZCBvcGVyYXRpb25zICovCisjaWYgZGVmaW5lZChMVUFfQ09SRSkKKyNkZWZpbmUgbHVhaV9udW1hZGQoTCxhLGIpCSgoYSkrKGIpKQorI2RlZmluZSBsdWFpX251bXN1YihMLGEsYikJKChhKS0oYikpCisjZGVmaW5lIGx1YWlfbnVtbXVsKEwsYSxiKQkoKGEpKihiKSkKKyNpZmRlZiBMVUFfTlVNQkVSX0lOVEVHUkFMCisjZGVmaW5lIGx1YWlfbnVtZGl2KEwsYSxiKQkJXAorICAoLTEvMj8JCQkJXAorICAgKGEpLyhiKToJCQkJXAorICAgKCgoYSk8MCk9PSgoYik8MCl8fChhKSUoYik9PTA/CVwKKyAgICAoYSkvKGIpOgkJCQlcCisgICAgKGEpLyhiKS0xKSkKKyNkZWZpbmUgbHVhaV9udW1tb2QoTCxhLGIpCQlcCisgICgtMS8yPwkJCQlcCisgICAoYSklKGIpOgkJCQlcCisgICAoKChhKTwwKT09KChiKTwwKXx8KGEpJShiKT09MD8JXAorICAgIChhKSUoYik6CQkJCVwKKyAgICAoYSklKGIpKyhiKSkpCisjZGVmaW5lIGx1YWlfbG51bWRpdihMLGEsYikJCVwKKyAgKChiKT09MD8JCQkJXAorICAgKGx1YUdfcnVuZXJyb3IoTCwiZGl2aWRlIGJ5IHplcm8iKSwwKTogXAorICAgbHVhaV9udW1kaXYoYSxiKSkKKyNkZWZpbmUgbHVhaV9sbnVtbW9kKEwsYSxiKQkJXAorICAoKGIpPT0wPwkJCQlcCisgICAobHVhR19ydW5lcnJvcihMLCJtb2R1bG8gYnkgemVybyIpLDApOiBcCisgICBsdWFpX251bW1vZChhLGIpKQorTFVBX05VTUJFUiBsdWFpX2lwb3codm9pZCAqTCwgTFVBX05VTUJFUiwgTFVBX05VTUJFUik7CisjZGVmaW5lIGx1YWlfbnVtcG93KEwsYSxiKQkobHVhaV9pcG93KEwsYSxiKSkKKyNlbHNlCisjZGVmaW5lIGx1YWlfbnVtZGl2KEwsYSxiKQkoKGEpLyhiKSkKKyNlbmRpZgorI2RlZmluZSBsdWFpX251bXVubShMLGEpCSgtKGEpKQorI2RlZmluZSBsdWFpX251bWVxKGEsYikJCSgoYSk9PShiKSkKKyNkZWZpbmUgbHVhaV9udW1sdChMLGEsYikJKChhKTwoYikpCisjZGVmaW5lIGx1YWlfbnVtbGUoTCxhLGIpCSgoYSk8PShiKSkKKyNkZWZpbmUgbHVhaV9udW1pc25hbihMLGEpCSghbHVhaV9udW1lcSgoYSksIChhKSkpCisjZW5kaWYKKworCisKKy8qCitAQCBMVUFfSU5URUdFUiBpcyB0aGUgaW50ZWdyYWwgdHlwZSB1c2VkIGJ5IGx1YV9wdXNoaW50ZWdlci9sdWFfdG9pbnRlZ2VyLgorKiogQ0hBTkdFIHRoYXQgaWYgcHRyZGlmZl90IGlzIG5vdCBhZGVxdWF0ZSBvbiB5b3VyIG1hY2hpbmUuIChPbiBtb3N0CisqKiBtYWNoaW5lcywgcHRyZGlmZl90IGdpdmVzIGEgZ29vZCBjaG9pY2UgYmV0d2VlbiBpbnQgb3IgbG9uZy4pCisqLworI2RlZmluZSBMVUFfSU5URUdFUglsb25nCisvKiBDaGFuZ2VkIHRvIGxvbmcgZm9yIHVzZSB3aXRoIGludGVncmFsIEx1YSBudW1iZXJzLiAqLworCisvKgorQEAgTFVBX1VOU0lHTkVEIGlzIHRoZSBpbnRlZ3JhbCB0eXBlIHVzZWQgYnkgbHVhX3B1c2h1bnNpZ25lZC9sdWFfdG91bnNpZ25lZC4KKyoqIEl0IG11c3QgaGF2ZSBhdCBsZWFzdCAzMiBiaXRzLgorKi8KKyNkZWZpbmUgTFVBX1VOU0lHTkVECXVuc2lnbmVkIExVQV9JTlQzMgorCisKKworLyoKKyoqIFNvbWUgdHJpY2tzIHdpdGggZG91YmxlcworKi8KKworI2lmIGRlZmluZWQoTFVBX05VTUJFUl9ET1VCTEUpICYmICFkZWZpbmVkKExVQV9BTlNJKQkvKiB7ICovCisvKgorKiogVGhlIG5leHQgZGVmaW5pdGlvbnMgYWN0aXZhdGUgc29tZSB0cmlja3MgdG8gc3BlZWQgdXAgdGhlCisqKiBjb252ZXJzaW9uIGZyb20gZG91YmxlcyB0byBpbnRlZ2VyIHR5cGVzLCBtYWlubHkgdG8gTFVBX1VOU0lHTkVELgorKioKK0BAIExVQV9NU0FTTVRSSUNLIHVzZXMgTWljcm9zb2Z0IGFzc2VtYmxlciB0byBhdm9pZCBjbGFzaGVzIHdpdGggYQorKiogRGlyZWN0WCBpZGlvc3luY3Jhc3kuCisqKgorQEAgTFVBX0lFRUU3NTRUUklDSyB1c2VzIGEgdHJpY2sgdGhhdCBzaG91bGQgd29yayBvbiBhbnkgbWFjaGluZQorKiogdXNpbmcgSUVFRTc1NCB3aXRoIGEgMzItYml0IGludGVnZXIgdHlwZS4KKyoqCitAQCBMVUFfSUVFRUxMIGV4dGVuZHMgdGhlIHRyaWNrIHRvIExVQV9JTlRFR0VSOyBzaG91bGQgb25seSBiZQorKiogZGVmaW5lZCB3aGVuIExVQV9JTlRFR0VSIGlzIGEgMzItYml0IGludGVnZXIuCisqKgorQEAgTFVBX0lFRUVFTkRJQU4gaXMgdGhlIGVuZGlhbm5lc3Mgb2YgZG91YmxlcyBpbiB5b3VyIG1hY2hpbmUKKyoqICgwIGZvciBsaXR0bGUgZW5kaWFuLCAxIGZvciBiaWcgZW5kaWFuKTsgaWYgbm90IGRlZmluZWQsIEx1YSB3aWxsCisqKiBjaGVjayBpdCBkeW5hbWljYWxseSBmb3IgTFVBX0lFRUU3NTRUUklDSyAoYnV0IG5vdCBmb3IgTFVBX05BTlRSSUNLKS4KKyoqCitAQCBMVUFfTkFOVFJJQ0sgY29udHJvbHMgdGhlIHVzZSBvZiBhIHRyaWNrIHRvIHBhY2sgYWxsIHR5cGVzIGludG8KKyoqIGEgc2luZ2xlIGRvdWJsZSB2YWx1ZSwgdXNpbmcgTmFOIHZhbHVlcyB0byByZXByZXNlbnQgbm9uLW51bWJlcgorKiogdmFsdWVzLiBUaGUgdHJpY2sgb25seSB3b3JrcyBvbiAzMi1iaXQgbWFjaGluZXMgKGludHMgYW5kIHBvaW50ZXJzCisqKiBhcmUgMzItYml0IHZhbHVlcykgd2l0aCBudW1iZXJzIHJlcHJlc2VudGVkIGFzIElFRUUgNzU0LTIwMDggZG91YmxlcworKiogd2l0aCBjb252ZW50aW9uYWwgZW5kaWFuZXNzICgxMjM0NTY3OCBvciA4NzY1NDMyMSksIGluIENQVXMgdGhhdCBkbworKiogbm90IHByb2R1Y2Ugc2lnbmFsaW5nIE5hTiB2YWx1ZXMgKGFsbCBOYU5zIGFyZSBxdWlldCkuCisqLworCisvKiBNaWNyb3NvZnQgY29tcGlsZXIgb24gYSBQZW50aXVtICgzMiBiaXQpID8gKi8KKyNpZiBkZWZpbmVkKExVQV9XSU4pICYmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikJLyogeyAqLworCisjZGVmaW5lIExVQV9NU0FTTVRSSUNLCisjZGVmaW5lIExVQV9JRUVFRU5ESUFOCQkwCisjZGVmaW5lIExVQV9OQU5UUklDSworCisKKy8qIHBlbnRpdW0gMzIgYml0cz8gKi8KKyNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9fWDg2X18pIC8qIH17ICovCisKKyNkZWZpbmUgTFVBX0lFRUU3NTRUUklDSworI2RlZmluZSBMVUFfSUVFRUxMCisjZGVmaW5lIExVQV9JRUVFRU5ESUFOCQkwCisjZGVmaW5lIExVQV9OQU5UUklDSworCisvKiBwZW50aXVtIDY0IGJpdHM/ICovCisjZWxpZiBkZWZpbmVkKF9feDg2XzY0KQkJCQkJCS8qIH17ICovCisKKyNkZWZpbmUgTFVBX0lFRUU3NTRUUklDSworI2RlZmluZSBMVUFfSUVFRUVORElBTgkJMAorCisjZWxpZiBkZWZpbmVkKF9fUE9XRVJQQ19fKSB8fCBkZWZpbmVkKF9fcHBjX18pCQkJLyogfXsgKi8KKworI2RlZmluZSBMVUFfSUVFRTc1NFRSSUNLCisjZGVmaW5lIExVQV9JRUVFRU5ESUFOCQkxCisKKyNlbHNlCQkJCQkJCQkvKiB9eyAqLworCisvKiBhc3N1bWUgSUVFRTc1NCBhbmQgYSAzMi1iaXQgaW50ZWdlciB0eXBlICovCisjZGVmaW5lIExVQV9JRUVFNzU0VFJJQ0sKKworI2VuZGlmCQkJCQkJCQkvKiB9ICovCisKKyNlbmRpZgkJCQkJCQkvKiB9ICovCisKKy8qIH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorKiogTG9jYWwgY29uZmlndXJhdGlvbi4gWW91IGNhbiB1c2UgdGhpcyBzcGFjZSB0byBhZGQgeW91ciByZWRlZmluaXRpb25zCisqKiB3aXRob3V0IG1vZGlmeWluZyB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBmaWxlLgorKi8KKworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2x1YWxpYi5oIGIvY29tMzIvbHVhL3NyYy9sdWFsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTgyMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sdWFsaWIuaApAQCAtMCwwICsxLDU1IEBACisvKgorKiogJElkOiBsdWFsaWIuaCx2IDEuNDMuMS4xIDIwMTMvMDQvMTIgMTg6NDg6NDcgcm9iZXJ0byBFeHAgJAorKiogTHVhIHN0YW5kYXJkIGxpYnJhcmllcworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKworI2lmbmRlZiBsdWFsaWJfaAorI2RlZmluZSBsdWFsaWJfaAorCisjaW5jbHVkZSAibHVhLmgiCisKKworCitMVUFNT0RfQVBJIGludCAobHVhb3Blbl9iYXNlKSAobHVhX1N0YXRlICpMKTsKKworI2RlZmluZSBMVUFfQ09MSUJOQU1FCSJjb3JvdXRpbmUiCitMVUFNT0RfQVBJIGludCAobHVhb3Blbl9jb3JvdXRpbmUpIChsdWFfU3RhdGUgKkwpOworCisjZGVmaW5lIExVQV9UQUJMSUJOQU1FCSJ0YWJsZSIKK0xVQU1PRF9BUEkgaW50IChsdWFvcGVuX3RhYmxlKSAobHVhX1N0YXRlICpMKTsKKworI2RlZmluZSBMVUFfSU9MSUJOQU1FCSJpbyIKK0xVQU1PRF9BUEkgaW50IChsdWFvcGVuX2lvKSAobHVhX1N0YXRlICpMKTsKKworI2RlZmluZSBMVUFfT1NMSUJOQU1FCSJvcyIKK0xVQU1PRF9BUEkgaW50IChsdWFvcGVuX29zKSAobHVhX1N0YXRlICpMKTsKKworI2RlZmluZSBMVUFfU1RSTElCTkFNRQkic3RyaW5nIgorTFVBTU9EX0FQSSBpbnQgKGx1YW9wZW5fc3RyaW5nKSAobHVhX1N0YXRlICpMKTsKKworI2RlZmluZSBMVUFfQklUTElCTkFNRQkiYml0MzIiCitMVUFNT0RfQVBJIGludCAobHVhb3Blbl9iaXQzMikgKGx1YV9TdGF0ZSAqTCk7CisKKyNkZWZpbmUgTFVBX01BVEhMSUJOQU1FCSJtYXRoIgorTFVBTU9EX0FQSSBpbnQgKGx1YW9wZW5fbWF0aCkgKGx1YV9TdGF0ZSAqTCk7CisKKyNkZWZpbmUgTFVBX0RCTElCTkFNRQkiZGVidWciCitMVUFNT0RfQVBJIGludCAobHVhb3Blbl9kZWJ1ZykgKGx1YV9TdGF0ZSAqTCk7CisKKyNkZWZpbmUgTFVBX0xPQURMSUJOQU1FCSJwYWNrYWdlIgorTFVBTU9EX0FQSSBpbnQgKGx1YW9wZW5fcGFja2FnZSkgKGx1YV9TdGF0ZSAqTCk7CisKKworLyogb3BlbiBhbGwgcHJldmlvdXMgbGlicmFyaWVzICovCitMVUFMSUJfQVBJIHZvaWQgKGx1YUxfb3BlbmxpYnMpIChsdWFfU3RhdGUgKkwpOworCisKKworI2lmICFkZWZpbmVkKGx1YV9hc3NlcnQpCisjZGVmaW5lIGx1YV9hc3NlcnQoeCkJKCh2b2lkKTApCisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbHVuZHVtcC5jIGIvY29tMzIvbHVhL3NyYy9sdW5kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2M2NiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL2x1YS9zcmMvbHVuZHVtcC5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorKiogJElkOiBsdW5kdW1wLmMsdiAyLjIyLjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIGxvYWQgcHJlY29tcGlsZWQgTHVhIGNodW5rcworKiogU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gbHVhLmgKKyovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsdW5kdW1wX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGZ1bmMuaCIKKyNpbmNsdWRlICJsbWVtLmgiCisjaW5jbHVkZSAibG9iamVjdC5oIgorI2luY2x1ZGUgImxzdHJpbmcuaCIKKyNpbmNsdWRlICJsdW5kdW1wLmgiCisjaW5jbHVkZSAibHppby5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgbHVhX1N0YXRlKiBMOworIFpJTyogWjsKKyBNYnVmZmVyKiBiOworIGNvbnN0IGNoYXIqIG5hbWU7Cit9IExvYWRTdGF0ZTsKKworc3RhdGljIGxfbm9yZXQgZXJyb3IoTG9hZFN0YXRlKiBTLCBjb25zdCBjaGFyKiB3aHkpCit7CisgbHVhT19wdXNoZnN0cmluZyhTLT5MLCIlczogJXMgcHJlY29tcGlsZWQgY2h1bmsiLFMtPm5hbWUsd2h5KTsKKyBsdWFEX3Rocm93KFMtPkwsTFVBX0VSUlNZTlRBWCk7Cit9CisKKyNkZWZpbmUgTG9hZE1lbShTLGIsbixzaXplKQlMb2FkQmxvY2soUyxiLChuKSooc2l6ZSkpCisjZGVmaW5lIExvYWRCeXRlKFMpCQkobHVfYnl0ZSlMb2FkQ2hhcihTKQorI2RlZmluZSBMb2FkVmFyKFMseCkJCUxvYWRNZW0oUywmeCwxLHNpemVvZih4KSkKKyNkZWZpbmUgTG9hZFZlY3RvcihTLGIsbixzaXplKQlMb2FkTWVtKFMsYixuLHNpemUpCisKKyNpZiAhZGVmaW5lZChsdWFpX3ZlcmlmeWNvZGUpCisjZGVmaW5lIGx1YWlfdmVyaWZ5Y29kZShMLGIsZikJLyogZW1wdHkgKi8KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBMb2FkQmxvY2soTG9hZFN0YXRlKiBTLCB2b2lkKiBiLCBzaXplX3Qgc2l6ZSkKK3sKKyBpZiAobHVhWl9yZWFkKFMtPlosYixzaXplKSE9MCkgZXJyb3IoUywidHJ1bmNhdGVkIik7Cit9CisKK3N0YXRpYyBpbnQgTG9hZENoYXIoTG9hZFN0YXRlKiBTKQoreworIGNoYXIgeDsKKyBMb2FkVmFyKFMseCk7CisgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbnQgTG9hZEludChMb2FkU3RhdGUqIFMpCit7CisgaW50IHg7CisgTG9hZFZhcihTLHgpOworIGlmICh4PDApIGVycm9yKFMsImNvcnJ1cHRlZCIpOworIHJldHVybiB4OworfQorCitzdGF0aWMgbHVhX051bWJlciBMb2FkTnVtYmVyKExvYWRTdGF0ZSogUykKK3sKKyBsdWFfTnVtYmVyIHg7CisgTG9hZFZhcihTLHgpOworIHJldHVybiB4OworfQorCitzdGF0aWMgVFN0cmluZyogTG9hZFN0cmluZyhMb2FkU3RhdGUqIFMpCit7Cisgc2l6ZV90IHNpemU7CisgTG9hZFZhcihTLHNpemUpOworIGlmIChzaXplPT0wKQorICByZXR1cm4gTlVMTDsKKyBlbHNlCisgeworICBjaGFyKiBzPWx1YVpfb3BlbnNwYWNlKFMtPkwsUy0+YixzaXplKTsKKyAgTG9hZEJsb2NrKFMscyxzaXplKnNpemVvZihjaGFyKSk7CisgIHJldHVybiBsdWFTX25ld2xzdHIoUy0+TCxzLHNpemUtMSk7CQkvKiByZW1vdmUgdHJhaWxpbmcgJ1wwJyAqLworIH0KK30KKworc3RhdGljIHZvaWQgTG9hZENvZGUoTG9hZFN0YXRlKiBTLCBQcm90byogZikKK3sKKyBpbnQgbj1Mb2FkSW50KFMpOworIGYtPmNvZGU9bHVhTV9uZXd2ZWN0b3IoUy0+TCxuLEluc3RydWN0aW9uKTsKKyBmLT5zaXplY29kZT1uOworIExvYWRWZWN0b3IoUyxmLT5jb2RlLG4sc2l6ZW9mKEluc3RydWN0aW9uKSk7Cit9CisKK3N0YXRpYyB2b2lkIExvYWRGdW5jdGlvbihMb2FkU3RhdGUqIFMsIFByb3RvKiBmKTsKKworc3RhdGljIHZvaWQgTG9hZENvbnN0YW50cyhMb2FkU3RhdGUqIFMsIFByb3RvKiBmKQoreworIGludCBpLG47Cisgbj1Mb2FkSW50KFMpOworIGYtPms9bHVhTV9uZXd2ZWN0b3IoUy0+TCxuLFRWYWx1ZSk7CisgZi0+c2l6ZWs9bjsKKyBmb3IgKGk9MDsgaTxuOyBpKyspIHNldG5pbHZhbHVlKCZmLT5rW2ldKTsKKyBmb3IgKGk9MDsgaTxuOyBpKyspCisgeworICBUVmFsdWUqIG89JmYtPmtbaV07CisgIGludCB0PUxvYWRDaGFyKFMpOworICBzd2l0Y2ggKHQpCisgIHsKKyAgIGNhc2UgTFVBX1ROSUw6CisJc2V0bmlsdmFsdWUobyk7CisJYnJlYWs7CisgICBjYXNlIExVQV9UQk9PTEVBTjoKKwlzZXRidmFsdWUobyxMb2FkQ2hhcihTKSk7CisJYnJlYWs7CisgICBjYXNlIExVQV9UTlVNQkVSOgorCXNldG52YWx1ZShvLExvYWROdW1iZXIoUykpOworCWJyZWFrOworICAgY2FzZSBMVUFfVFNUUklORzoKKwlzZXRzdmFsdWUybihTLT5MLG8sTG9hZFN0cmluZyhTKSk7CisJYnJlYWs7CisgICAgZGVmYXVsdDogbHVhX2Fzc2VydCgwKTsKKyAgfQorIH0KKyBuPUxvYWRJbnQoUyk7CisgZi0+cD1sdWFNX25ld3ZlY3RvcihTLT5MLG4sUHJvdG8qKTsKKyBmLT5zaXplcD1uOworIGZvciAoaT0wOyBpPG47IGkrKykgZi0+cFtpXT1OVUxMOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIGYtPnBbaV09bHVhRl9uZXdwcm90byhTLT5MKTsKKyAgTG9hZEZ1bmN0aW9uKFMsZi0+cFtpXSk7CisgfQorfQorCitzdGF0aWMgdm9pZCBMb2FkVXB2YWx1ZXMoTG9hZFN0YXRlKiBTLCBQcm90byogZikKK3sKKyBpbnQgaSxuOworIG49TG9hZEludChTKTsKKyBmLT51cHZhbHVlcz1sdWFNX25ld3ZlY3RvcihTLT5MLG4sVXB2YWxkZXNjKTsKKyBmLT5zaXpldXB2YWx1ZXM9bjsKKyBmb3IgKGk9MDsgaTxuOyBpKyspIGYtPnVwdmFsdWVzW2ldLm5hbWU9TlVMTDsKKyBmb3IgKGk9MDsgaTxuOyBpKyspCisgeworICBmLT51cHZhbHVlc1tpXS5pbnN0YWNrPUxvYWRCeXRlKFMpOworICBmLT51cHZhbHVlc1tpXS5pZHg9TG9hZEJ5dGUoUyk7CisgfQorfQorCitzdGF0aWMgdm9pZCBMb2FkRGVidWcoTG9hZFN0YXRlKiBTLCBQcm90byogZikKK3sKKyBpbnQgaSxuOworIGYtPnNvdXJjZT1Mb2FkU3RyaW5nKFMpOworIG49TG9hZEludChTKTsKKyBmLT5saW5laW5mbz1sdWFNX25ld3ZlY3RvcihTLT5MLG4saW50KTsKKyBmLT5zaXplbGluZWluZm89bjsKKyBMb2FkVmVjdG9yKFMsZi0+bGluZWluZm8sbixzaXplb2YoaW50KSk7Cisgbj1Mb2FkSW50KFMpOworIGYtPmxvY3ZhcnM9bHVhTV9uZXd2ZWN0b3IoUy0+TCxuLExvY1Zhcik7CisgZi0+c2l6ZWxvY3ZhcnM9bjsKKyBmb3IgKGk9MDsgaTxuOyBpKyspIGYtPmxvY3ZhcnNbaV0udmFybmFtZT1OVUxMOworIGZvciAoaT0wOyBpPG47IGkrKykKKyB7CisgIGYtPmxvY3ZhcnNbaV0udmFybmFtZT1Mb2FkU3RyaW5nKFMpOworICBmLT5sb2N2YXJzW2ldLnN0YXJ0cGM9TG9hZEludChTKTsKKyAgZi0+bG9jdmFyc1tpXS5lbmRwYz1Mb2FkSW50KFMpOworIH0KKyBuPUxvYWRJbnQoUyk7CisgZm9yIChpPTA7IGk8bjsgaSsrKSBmLT51cHZhbHVlc1tpXS5uYW1lPUxvYWRTdHJpbmcoUyk7Cit9CisKK3N0YXRpYyB2b2lkIExvYWRGdW5jdGlvbihMb2FkU3RhdGUqIFMsIFByb3RvKiBmKQoreworIGYtPmxpbmVkZWZpbmVkPUxvYWRJbnQoUyk7CisgZi0+bGFzdGxpbmVkZWZpbmVkPUxvYWRJbnQoUyk7CisgZi0+bnVtcGFyYW1zPUxvYWRCeXRlKFMpOworIGYtPmlzX3ZhcmFyZz1Mb2FkQnl0ZShTKTsKKyBmLT5tYXhzdGFja3NpemU9TG9hZEJ5dGUoUyk7CisgTG9hZENvZGUoUyxmKTsKKyBMb2FkQ29uc3RhbnRzKFMsZik7CisgTG9hZFVwdmFsdWVzKFMsZik7CisgTG9hZERlYnVnKFMsZik7Cit9CisKKy8qIHRoZSBjb2RlIGJlbG93IG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBjb2RlIGluIGx1YVVfaGVhZGVyICovCisjZGVmaW5lIE4wCUxVQUNfSEVBREVSU0laRQorI2RlZmluZSBOMQkoc2l6ZW9mKExVQV9TSUdOQVRVUkUpLXNpemVvZihjaGFyKSkKKyNkZWZpbmUgTjIJTjErMgorI2RlZmluZSBOMwlOMis2CisKK3N0YXRpYyB2b2lkIExvYWRIZWFkZXIoTG9hZFN0YXRlKiBTKQoreworIGx1X2J5dGUgaFtMVUFDX0hFQURFUlNJWkVdOworIGx1X2J5dGUgc1tMVUFDX0hFQURFUlNJWkVdOworIGx1YVVfaGVhZGVyKGgpOworIG1lbWNweShzLGgsc2l6ZW9mKGNoYXIpKTsJCQkvKiBmaXJzdCBjaGFyIGFscmVhZHkgcmVhZCAqLworIExvYWRCbG9jayhTLHMrc2l6ZW9mKGNoYXIpLExVQUNfSEVBREVSU0laRS1zaXplb2YoY2hhcikpOworIGlmIChtZW1jbXAoaCxzLE4wKT09MCkgcmV0dXJuOworIGlmIChtZW1jbXAoaCxzLE4xKSE9MCkgZXJyb3IoUywibm90IGEiKTsKKyBpZiAobWVtY21wKGgscyxOMikhPTApIGVycm9yKFMsInZlcnNpb24gbWlzbWF0Y2ggaW4iKTsKKyBpZiAobWVtY21wKGgscyxOMykhPTApIGVycm9yKFMsImluY29tcGF0aWJsZSIpOyBlbHNlIGVycm9yKFMsImNvcnJ1cHRlZCIpOworfQorCisvKgorKiogbG9hZCBwcmVjb21waWxlZCBjaHVuaworKi8KK0Nsb3N1cmUqIGx1YVVfdW5kdW1wIChsdWFfU3RhdGUqIEwsIFpJTyogWiwgTWJ1ZmZlciogYnVmZiwgY29uc3QgY2hhciogbmFtZSkKK3sKKyBMb2FkU3RhdGUgUzsKKyBDbG9zdXJlKiBjbDsKKyBpZiAoKm5hbWU9PSdAJyB8fCAqbmFtZT09Jz0nKQorICBTLm5hbWU9bmFtZSsxOworIGVsc2UgaWYgKCpuYW1lPT1MVUFfU0lHTkFUVVJFWzBdKQorICBTLm5hbWU9ImJpbmFyeSBzdHJpbmciOworIGVsc2UKKyAgUy5uYW1lPW5hbWU7CisgUy5MPUw7CisgUy5aPVo7CisgUy5iPWJ1ZmY7CisgTG9hZEhlYWRlcigmUyk7CisgY2w9bHVhRl9uZXdMY2xvc3VyZShMLDEpOworIHNldGNsTHZhbHVlKEwsTC0+dG9wLGNsKTsgaW5jcl90b3AoTCk7CisgY2wtPmwucD1sdWFGX25ld3Byb3RvKEwpOworIExvYWRGdW5jdGlvbigmUyxjbC0+bC5wKTsKKyBpZiAoY2wtPmwucC0+c2l6ZXVwdmFsdWVzICE9IDEpCisgeworICBQcm90byogcD1jbC0+bC5wOworICBjbD1sdWFGX25ld0xjbG9zdXJlKEwsY2wtPmwucC0+c2l6ZXVwdmFsdWVzKTsKKyAgY2wtPmwucD1wOworICBzZXRjbEx2YWx1ZShMLEwtPnRvcC0xLGNsKTsKKyB9CisgbHVhaV92ZXJpZnljb2RlKEwsYnVmZixjbC0+bC5wKTsKKyByZXR1cm4gY2w7Cit9CisKKyNkZWZpbmUgTVlJTlQocykJKHNbMF0tJzAnKQorI2RlZmluZSBWRVJTSU9OCQlNWUlOVChMVUFfVkVSU0lPTl9NQUpPUikqMTYrTVlJTlQoTFVBX1ZFUlNJT05fTUlOT1IpCisjZGVmaW5lIEZPUk1BVAkJMAkJLyogdGhpcyBpcyB0aGUgb2ZmaWNpYWwgZm9ybWF0ICovCisKKy8qCisqIG1ha2UgaGVhZGVyIGZvciBwcmVjb21waWxlZCBjaHVua3MKKyogaWYgeW91IGNoYW5nZSB0aGUgY29kZSBiZWxvdyBiZSBzdXJlIHRvIHVwZGF0ZSBMb2FkSGVhZGVyIGFuZCBGT1JNQVQgYWJvdmUKKyogYW5kIExVQUNfSEVBREVSU0laRSBpbiBsdW5kdW1wLmgKKyovCit2b2lkIGx1YVVfaGVhZGVyIChsdV9ieXRlKiBoKQoreworIGludCB4PTE7CisgbWVtY3B5KGgsTFVBX1NJR05BVFVSRSxzaXplb2YoTFVBX1NJR05BVFVSRSktc2l6ZW9mKGNoYXIpKTsKKyBoKz1zaXplb2YoTFVBX1NJR05BVFVSRSktc2l6ZW9mKGNoYXIpOworICpoKys9Y2FzdF9ieXRlKFZFUlNJT04pOworICpoKys9Y2FzdF9ieXRlKEZPUk1BVCk7CisgKmgrKz1jYXN0X2J5dGUoKihjaGFyKikmeCk7CQkJLyogZW5kaWFubmVzcyAqLworICpoKys9Y2FzdF9ieXRlKHNpemVvZihpbnQpKTsKKyAqaCsrPWNhc3RfYnl0ZShzaXplb2Yoc2l6ZV90KSk7CisgKmgrKz1jYXN0X2J5dGUoc2l6ZW9mKEluc3RydWN0aW9uKSk7CisgKmgrKz1jYXN0X2J5dGUoc2l6ZW9mKGx1YV9OdW1iZXIpKTsKKyAqaCsrPWNhc3RfYnl0ZSgoKGx1YV9OdW1iZXIpMC41KT09MCk7CQkvKiBpcyBsdWFfTnVtYmVyIGludGVncmFsPyAqLworIG1lbWNweShoLExVQUNfVEFJTCxzaXplb2YoTFVBQ19UQUlMKS1zaXplb2YoY2hhcikpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9sdW5kdW1wLmggYi9jb20zMi9sdWEvc3JjL2x1bmR1bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjU1ZGIyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sdW5kdW1wLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyoqICRJZDogbHVuZHVtcC5oLHYgMS4zOS4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBsb2FkIHByZWNvbXBpbGVkIEx1YSBjaHVua3MKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisjaWZuZGVmIGx1bmR1bXBfaAorI2RlZmluZSBsdW5kdW1wX2gKKworI2luY2x1ZGUgImxvYmplY3QuaCIKKyNpbmNsdWRlICJsemlvLmgiCisKKy8qIGxvYWQgb25lIGNodW5rOyBmcm9tIGx1bmR1bXAuYyAqLworTFVBSV9GVU5DIENsb3N1cmUqIGx1YVVfdW5kdW1wIChsdWFfU3RhdGUqIEwsIFpJTyogWiwgTWJ1ZmZlciogYnVmZiwgY29uc3QgY2hhciogbmFtZSk7CisKKy8qIG1ha2UgaGVhZGVyOyBmcm9tIGx1bmR1bXAuYyAqLworTFVBSV9GVU5DIHZvaWQgbHVhVV9oZWFkZXIgKGx1X2J5dGUqIGgpOworCisvKiBkdW1wIG9uZSBjaHVuazsgZnJvbSBsZHVtcC5jICovCitMVUFJX0ZVTkMgaW50IGx1YVVfZHVtcCAobHVhX1N0YXRlKiBMLCBjb25zdCBQcm90byogZiwgbHVhX1dyaXRlciB3LCB2b2lkKiBkYXRhLCBpbnQgc3RyaXApOworCisvKiBkYXRhIHRvIGNhdGNoIGNvbnZlcnNpb24gZXJyb3JzICovCisjZGVmaW5lIExVQUNfVEFJTAkJIlx4MTlceDkzXHJcblx4MWFcbiIKKworLyogc2l6ZSBpbiBieXRlcyBvZiBoZWFkZXIgb2YgYmluYXJ5IGZpbGVzICovCisjZGVmaW5lIExVQUNfSEVBREVSU0laRQkJKHNpemVvZihMVUFfU0lHTkFUVVJFKS1zaXplb2YoY2hhcikrMis2K3NpemVvZihMVUFDX1RBSUwpLXNpemVvZihjaGFyKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2x2bS5jIGIvY29tMzIvbHVhL3NyYy9sdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdkNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9sdm0uYwpAQCAtMCwwICsxLDg5MCBAQAorLyoKKyoqICRJZDogbHZtLmMsdiAyLjE1NS4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBMdWEgdmlydHVhbCBtYWNoaW5lCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworCisjaWZkZWYgU1lTTElOVVgKKyNkZWZpbmUgc3RyY29sbCBzdHJjbXAKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgbHZtX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGRlYnVnLmgiCisjaW5jbHVkZSAibGRvLmgiCisjaW5jbHVkZSAibGZ1bmMuaCIKKyNpbmNsdWRlICJsZ2MuaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibG9wY29kZXMuaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsc3RyaW5nLmgiCisjaW5jbHVkZSAibHRhYmxlLmgiCisjaW5jbHVkZSAibHRtLmgiCisjaW5jbHVkZSAibHZtLmgiCisKKworI2lmZGVmIExVQV9OVU1CRVJfSU5URUdSQUwKK0xVQV9OVU1CRVIgbHVhaV9pcG93KHZvaWQgKkwsIExVQV9OVU1CRVIgYSwgTFVBX05VTUJFUiBiKSB7CisgICh2b2lkKUw7CisgIGlmIChiIDwgMCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZSBpZiAoYiA9PSAwKQorICAgIHJldHVybiAxOworICBlbHNlIHsKKyAgICBMVUFfTlVNQkVSIGMgPSAxOworICAgIGZvciAoOzspIHsKKyAgICAgIGlmIChiICYgMSkKKwljICo9IGE7CisgICAgICBiID0gYiA+PiAxOworICAgICAgaWYgKGIgPT0gMCkKKwlyZXR1cm4gYzsKKyAgICAgIGEgKj0gYTsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKiBsaW1pdCBmb3IgdGFibGUgdGFnLW1ldGhvZCBjaGFpbnMgKHRvIGF2b2lkIGxvb3BzKSAqLworI2RlZmluZSBNQVhUQUdMT09QCTEwMAorCisKK2NvbnN0IFRWYWx1ZSAqbHVhVl90b251bWJlciAoY29uc3QgVFZhbHVlICpvYmosIFRWYWx1ZSAqbikgeworICBsdWFfTnVtYmVyIG51bTsKKyAgaWYgKHR0aXNudW1iZXIob2JqKSkgcmV0dXJuIG9iajsKKyAgaWYgKHR0aXNzdHJpbmcob2JqKSAmJiBsdWFPX3N0cjJkKHN2YWx1ZShvYmopLCB0c3ZhbHVlKG9iaiktPmxlbiwgJm51bSkpIHsKKyAgICBzZXRudmFsdWUobiwgbnVtKTsKKyAgICByZXR1cm4gbjsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworaW50IGx1YVZfdG9zdHJpbmcgKGx1YV9TdGF0ZSAqTCwgU3RrSWQgb2JqKSB7CisgIGlmICghdHRpc251bWJlcihvYmopKQorICAgIHJldHVybiAwOworICBlbHNlIHsKKyAgICBjaGFyIHNbTFVBSV9NQVhOVU1CRVIyU1RSXTsKKyAgICBsdWFfTnVtYmVyIG4gPSBudmFsdWUob2JqKTsKKyAgICBpbnQgbCA9IGx1YV9udW1iZXIyc3RyKHMsIG4pOworICAgIHNldHN2YWx1ZTJzKEwsIG9iaiwgbHVhU19uZXdsc3RyKEwsIHMsIGwpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRyYWNlZXhlYyAobHVhX1N0YXRlICpMKSB7CisgIENhbGxJbmZvICpjaSA9IEwtPmNpOworICBsdV9ieXRlIG1hc2sgPSBMLT5ob29rbWFzazsKKyAgaW50IGNvdW50aG9vayA9ICgobWFzayAmIExVQV9NQVNLQ09VTlQpICYmIEwtPmhvb2tjb3VudCA9PSAwKTsKKyAgaWYgKGNvdW50aG9vaykKKyAgICByZXNldGhvb2tjb3VudChMKTsgIC8qIHJlc2V0IGNvdW50ICovCisgIGlmIChjaS0+Y2FsbHN0YXR1cyAmIENJU1RfSE9PS1lJRUxEKSB7ICAvKiBjYWxsZWQgaG9vayBsYXN0IHRpbWU/ICovCisgICAgY2ktPmNhbGxzdGF0dXMgJj0gfkNJU1RfSE9PS1lJRUxEOyAgLyogZXJhc2UgbWFyayAqLworICAgIHJldHVybjsgIC8qIGRvIG5vdCBjYWxsIGhvb2sgYWdhaW4gKFZNIHlpZWxkZWQsIHNvIGl0IGRpZCBub3QgbW92ZSkgKi8KKyAgfQorICBpZiAoY291bnRob29rKQorICAgIGx1YURfaG9vayhMLCBMVUFfSE9PS0NPVU5ULCAtMSk7ICAvKiBjYWxsIGNvdW50IGhvb2sgKi8KKyAgaWYgKG1hc2sgJiBMVUFfTUFTS0xJTkUpIHsKKyAgICBQcm90byAqcCA9IGNpX2Z1bmMoY2kpLT5wOworICAgIGludCBucGMgPSBwY1JlbChjaS0+dS5sLnNhdmVkcGMsIHApOworICAgIGludCBuZXdsaW5lID0gZ2V0ZnVuY2xpbmUocCwgbnBjKTsKKyAgICBpZiAobnBjID09IDAgfHwgIC8qIGNhbGwgbGluZWhvb2sgd2hlbiBlbnRlciBhIG5ldyBmdW5jdGlvbiwgKi8KKyAgICAgICAgY2ktPnUubC5zYXZlZHBjIDw9IEwtPm9sZHBjIHx8ICAvKiB3aGVuIGp1bXAgYmFjayAobG9vcCksIG9yIHdoZW4gKi8KKyAgICAgICAgbmV3bGluZSAhPSBnZXRmdW5jbGluZShwLCBwY1JlbChMLT5vbGRwYywgcCkpKSAgLyogZW50ZXIgYSBuZXcgbGluZSAqLworICAgICAgbHVhRF9ob29rKEwsIExVQV9IT09LTElORSwgbmV3bGluZSk7ICAvKiBjYWxsIGxpbmUgaG9vayAqLworICB9CisgIEwtPm9sZHBjID0gY2ktPnUubC5zYXZlZHBjOworICBpZiAoTC0+c3RhdHVzID09IExVQV9ZSUVMRCkgeyAgLyogZGlkIGhvb2sgeWllbGQ/ICovCisgICAgaWYgKGNvdW50aG9vaykKKyAgICAgIEwtPmhvb2tjb3VudCA9IDE7ICAvKiB1bmRvIGRlY3JlbWVudCB0byB6ZXJvICovCisgICAgY2ktPnUubC5zYXZlZHBjLS07ICAvKiB1bmRvIGluY3JlbWVudCAocmVzdW1lIHdpbGwgaW5jcmVtZW50IGl0IGFnYWluKSAqLworICAgIGNpLT5jYWxsc3RhdHVzIHw9IENJU1RfSE9PS1lJRUxEOyAgLyogbWFyayB0aGF0IGl0IHlpZWxkZWQgKi8KKyAgICBjaS0+ZnVuYyA9IEwtPnRvcCAtIDE7ICAvKiBwcm90ZWN0IHN0YWNrIGJlbG93IHJlc3VsdHMgKi8KKyAgICBsdWFEX3Rocm93KEwsIExVQV9ZSUVMRCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBjYWxsVE0gKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpmLCBjb25zdCBUVmFsdWUgKnAxLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUVmFsdWUgKnAyLCBUVmFsdWUgKnAzLCBpbnQgaGFzcmVzKSB7CisgIHB0cmRpZmZfdCByZXN1bHQgPSBzYXZlc3RhY2soTCwgcDMpOworICBzZXRvYmoycyhMLCBMLT50b3ArKywgZik7ICAvKiBwdXNoIGZ1bmN0aW9uICovCisgIHNldG9iajJzKEwsIEwtPnRvcCsrLCBwMSk7ICAvKiAxc3QgYXJndW1lbnQgKi8KKyAgc2V0b2JqMnMoTCwgTC0+dG9wKyssIHAyKTsgIC8qIDJuZCBhcmd1bWVudCAqLworICBpZiAoIWhhc3JlcykgIC8qIG5vIHJlc3VsdD8gJ3AzJyBpcyB0aGlyZCBhcmd1bWVudCAqLworICAgIHNldG9iajJzKEwsIEwtPnRvcCsrLCBwMyk7ICAvKiAzcmQgYXJndW1lbnQgKi8KKyAgLyogbWV0YW1ldGhvZCBtYXkgeWllbGQgb25seSB3aGVuIGNhbGxlZCBmcm9tIEx1YSBjb2RlICovCisgIGx1YURfY2FsbChMLCBMLT50b3AgLSAoNCAtIGhhc3JlcyksIGhhc3JlcywgaXNMdWEoTC0+Y2kpKTsKKyAgaWYgKGhhc3JlcykgeyAgLyogaWYgaGFzIHJlc3VsdCwgbW92ZSBpdCB0byBpdHMgcGxhY2UgKi8KKyAgICBwMyA9IHJlc3RvcmVzdGFjayhMLCByZXN1bHQpOworICAgIHNldG9ianMycyhMLCBwMywgLS1MLT50b3ApOworICB9Cit9CisKKwordm9pZCBsdWFWX2dldHRhYmxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqdCwgVFZhbHVlICprZXksIFN0a0lkIHZhbCkgeworICBpbnQgbG9vcDsKKyAgZm9yIChsb29wID0gMDsgbG9vcCA8IE1BWFRBR0xPT1A7IGxvb3ArKykgeworICAgIGNvbnN0IFRWYWx1ZSAqdG07CisgICAgaWYgKHR0aXN0YWJsZSh0KSkgeyAgLyogYHQnIGlzIGEgdGFibGU/ICovCisgICAgICBUYWJsZSAqaCA9IGh2YWx1ZSh0KTsKKyAgICAgIGNvbnN0IFRWYWx1ZSAqcmVzID0gbHVhSF9nZXQoaCwga2V5KTsgLyogZG8gYSBwcmltaXRpdmUgZ2V0ICovCisgICAgICBpZiAoIXR0aXNuaWwocmVzKSB8fCAgLyogcmVzdWx0IGlzIG5vdCBuaWw/ICovCisgICAgICAgICAgKHRtID0gZmFzdHRtKEwsIGgtPm1ldGF0YWJsZSwgVE1fSU5ERVgpKSA9PSBOVUxMKSB7IC8qIG9yIG5vIFRNPyAqLworICAgICAgICBzZXRvYmoycyhMLCB2YWwsIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIGVsc2Ugd2lsbCB0cnkgdGhlIHRhZyBtZXRob2QgKi8KKyAgICB9CisgICAgZWxzZSBpZiAodHRpc25pbCh0bSA9IGx1YVRfZ2V0dG1ieW9iaihMLCB0LCBUTV9JTkRFWCkpKQorICAgICAgbHVhR190eXBlZXJyb3IoTCwgdCwgImluZGV4Iik7CisgICAgaWYgKHR0aXNmdW5jdGlvbih0bSkpIHsKKyAgICAgIGNhbGxUTShMLCB0bSwgdCwga2V5LCB2YWwsIDEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0ID0gdG07ICAvKiBlbHNlIHJlcGVhdCB3aXRoICd0bScgKi8KKyAgfQorICBsdWFHX3J1bmVycm9yKEwsICJsb29wIGluIGdldHRhYmxlIik7Cit9CisKKwordm9pZCBsdWFWX3NldHRhYmxlIChsdWFfU3RhdGUgKkwsIGNvbnN0IFRWYWx1ZSAqdCwgVFZhbHVlICprZXksIFN0a0lkIHZhbCkgeworICBpbnQgbG9vcDsKKyAgZm9yIChsb29wID0gMDsgbG9vcCA8IE1BWFRBR0xPT1A7IGxvb3ArKykgeworICAgIGNvbnN0IFRWYWx1ZSAqdG07CisgICAgaWYgKHR0aXN0YWJsZSh0KSkgeyAgLyogYHQnIGlzIGEgdGFibGU/ICovCisgICAgICBUYWJsZSAqaCA9IGh2YWx1ZSh0KTsKKyAgICAgIFRWYWx1ZSAqb2xkdmFsID0gY2FzdChUVmFsdWUgKiwgbHVhSF9nZXQoaCwga2V5KSk7CisgICAgICAvKiBpZiBwcmV2aW91cyB2YWx1ZSBpcyBub3QgbmlsLCB0aGVyZSBtdXN0IGJlIGEgcHJldmlvdXMgZW50cnkKKyAgICAgICAgIGluIHRoZSB0YWJsZTsgbW9yZW92ZXIsIGEgbWV0YW1ldGhvZCBoYXMgbm8gcmVsZXZhbmNlICovCisgICAgICBpZiAoIXR0aXNuaWwob2xkdmFsKSB8fAorICAgICAgICAgLyogcHJldmlvdXMgdmFsdWUgaXMgbmlsOyBtdXN0IGNoZWNrIHRoZSBtZXRhbWV0aG9kICovCisgICAgICAgICAoKHRtID0gZmFzdHRtKEwsIGgtPm1ldGF0YWJsZSwgVE1fTkVXSU5ERVgpKSA9PSBOVUxMICYmCisgICAgICAgICAvKiBubyBtZXRhbWV0aG9kOyBpcyB0aGVyZSBhIHByZXZpb3VzIGVudHJ5IGluIHRoZSB0YWJsZT8gKi8KKyAgICAgICAgIChvbGR2YWwgIT0gbHVhT19uaWxvYmplY3QgfHwKKyAgICAgICAgIC8qIG5vIHByZXZpb3VzIGVudHJ5OyBtdXN0IGNyZWF0ZSBvbmUuIChUaGUgbmV4dCB0ZXN0IGlzCisgICAgICAgICAgICBhbHdheXMgdHJ1ZTsgd2Ugb25seSBuZWVkIHRoZSBhc3NpZ25tZW50LikgKi8KKyAgICAgICAgIChvbGR2YWwgPSBsdWFIX25ld2tleShMLCBoLCBrZXkpLCAxKSkpKSB7CisgICAgICAgIC8qIG5vIG1ldGFtZXRob2QgYW5kIChub3cpIHRoZXJlIGlzIGFuIGVudHJ5IHdpdGggZ2l2ZW4ga2V5ICovCisgICAgICAgIHNldG9iajJ0KEwsIG9sZHZhbCwgdmFsKTsgIC8qIGFzc2lnbiBuZXcgdmFsdWUgdG8gdGhhdCBlbnRyeSAqLworICAgICAgICBpbnZhbGlkYXRlVE1jYWNoZShoKTsKKyAgICAgICAgbHVhQ19iYXJyaWVyYmFjayhMLCBvYmoyZ2NvKGgpLCB2YWwpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvKiBlbHNlIHdpbGwgdHJ5IHRoZSBtZXRhbWV0aG9kICovCisgICAgfQorICAgIGVsc2UgIC8qIG5vdCBhIHRhYmxlOyBjaGVjayBtZXRhbWV0aG9kICovCisgICAgICBpZiAodHRpc25pbCh0bSA9IGx1YVRfZ2V0dG1ieW9iaihMLCB0LCBUTV9ORVdJTkRFWCkpKQorICAgICAgICBsdWFHX3R5cGVlcnJvcihMLCB0LCAiaW5kZXgiKTsKKyAgICAvKiB0aGVyZSBpcyBhIG1ldGFtZXRob2QgKi8KKyAgICBpZiAodHRpc2Z1bmN0aW9uKHRtKSkgeworICAgICAgY2FsbFRNKEwsIHRtLCB0LCBrZXksIHZhbCwgMCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHQgPSB0bTsgIC8qIGVsc2UgcmVwZWF0IHdpdGggJ3RtJyAqLworICB9CisgIGx1YUdfcnVuZXJyb3IoTCwgImxvb3AgaW4gc2V0dGFibGUiKTsKK30KKworCitzdGF0aWMgaW50IGNhbGxfYmluVE0gKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpwMSwgY29uc3QgVFZhbHVlICpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RrSWQgcmVzLCBUTVMgZXZlbnQpIHsKKyAgY29uc3QgVFZhbHVlICp0bSA9IGx1YVRfZ2V0dG1ieW9iaihMLCBwMSwgZXZlbnQpOyAgLyogdHJ5IGZpcnN0IG9wZXJhbmQgKi8KKyAgaWYgKHR0aXNuaWwodG0pKQorICAgIHRtID0gbHVhVF9nZXR0bWJ5b2JqKEwsIHAyLCBldmVudCk7ICAvKiB0cnkgc2Vjb25kIG9wZXJhbmQgKi8KKyAgaWYgKHR0aXNuaWwodG0pKSByZXR1cm4gMDsKKyAgY2FsbFRNKEwsIHRtLCBwMSwgcDIsIHJlcywgMSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBjb25zdCBUVmFsdWUgKmdldF9lcXVhbFRNIChsdWFfU3RhdGUgKkwsIFRhYmxlICptdDEsIFRhYmxlICptdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1TIGV2ZW50KSB7CisgIGNvbnN0IFRWYWx1ZSAqdG0xID0gZmFzdHRtKEwsIG10MSwgZXZlbnQpOworICBjb25zdCBUVmFsdWUgKnRtMjsKKyAgaWYgKHRtMSA9PSBOVUxMKSByZXR1cm4gTlVMTDsgIC8qIG5vIG1ldGFtZXRob2QgKi8KKyAgaWYgKG10MSA9PSBtdDIpIHJldHVybiB0bTE7ICAvKiBzYW1lIG1ldGF0YWJsZXMgPT4gc2FtZSBtZXRhbWV0aG9kcyAqLworICB0bTIgPSBmYXN0dG0oTCwgbXQyLCBldmVudCk7CisgIGlmICh0bTIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7ICAvKiBubyBtZXRhbWV0aG9kICovCisgIGlmIChsdWFWX3Jhd2VxdWFsb2JqKHRtMSwgdG0yKSkgIC8qIHNhbWUgbWV0YW1ldGhvZHM/ICovCisgICAgcmV0dXJuIHRtMTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGludCBjYWxsX29yZGVyVE0gKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpwMSwgY29uc3QgVFZhbHVlICpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUTVMgZXZlbnQpIHsKKyAgaWYgKCFjYWxsX2JpblRNKEwsIHAxLCBwMiwgTC0+dG9wLCBldmVudCkpCisgICAgcmV0dXJuIC0xOyAgLyogbm8gbWV0YW1ldGhvZCAqLworICBlbHNlCisgICAgcmV0dXJuICFsX2lzZmFsc2UoTC0+dG9wKTsKK30KKworCitzdGF0aWMgaW50IGxfc3RyY21wIChjb25zdCBUU3RyaW5nICpscywgY29uc3QgVFN0cmluZyAqcnMpIHsKKyAgY29uc3QgY2hhciAqbCA9IGdldHN0cihscyk7CisgIHNpemVfdCBsbCA9IGxzLT50c3YubGVuOworICBjb25zdCBjaGFyICpyID0gZ2V0c3RyKHJzKTsKKyAgc2l6ZV90IGxyID0gcnMtPnRzdi5sZW47CisgIGZvciAoOzspIHsKKyAgICBpbnQgdGVtcCA9IHN0cmNvbGwobCwgcik7CisgICAgaWYgKHRlbXAgIT0gMCkgcmV0dXJuIHRlbXA7CisgICAgZWxzZSB7ICAvKiBzdHJpbmdzIGFyZSBlcXVhbCB1cCB0byBhIGBcMCcgKi8KKyAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4obCk7ICAvKiBpbmRleCBvZiBmaXJzdCBgXDAnIGluIGJvdGggc3RyaW5ncyAqLworICAgICAgaWYgKGxlbiA9PSBscikgIC8qIHIgaXMgZmluaXNoZWQ/ICovCisgICAgICAgIHJldHVybiAobGVuID09IGxsKSA/IDAgOiAxOworICAgICAgZWxzZSBpZiAobGVuID09IGxsKSAgLyogbCBpcyBmaW5pc2hlZD8gKi8KKyAgICAgICAgcmV0dXJuIC0xOyAgLyogbCBpcyBzbWFsbGVyIHRoYW4gciAoYmVjYXVzZSByIGlzIG5vdCBmaW5pc2hlZCkgKi8KKyAgICAgIC8qIGJvdGggc3RyaW5ncyBsb25nZXIgdGhhbiBgbGVuJzsgZ28gb24gY29tcGFyaW5nIChhZnRlciB0aGUgYFwwJykgKi8KKyAgICAgIGxlbisrOworICAgICAgbCArPSBsZW47IGxsIC09IGxlbjsgciArPSBsZW47IGxyIC09IGxlbjsKKyAgICB9CisgIH0KK30KKworCitpbnQgbHVhVl9sZXNzdGhhbiAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKmwsIGNvbnN0IFRWYWx1ZSAqcikgeworICBpbnQgcmVzOworICBpZiAodHRpc251bWJlcihsKSAmJiB0dGlzbnVtYmVyKHIpKQorICAgIHJldHVybiBsdWFpX251bWx0KEwsIG52YWx1ZShsKSwgbnZhbHVlKHIpKTsKKyAgZWxzZSBpZiAodHRpc3N0cmluZyhsKSAmJiB0dGlzc3RyaW5nKHIpKQorICAgIHJldHVybiBsX3N0cmNtcChyYXd0c3ZhbHVlKGwpLCByYXd0c3ZhbHVlKHIpKSA8IDA7CisgIGVsc2UgaWYgKChyZXMgPSBjYWxsX29yZGVyVE0oTCwgbCwgciwgVE1fTFQpKSA8IDApCisgICAgbHVhR19vcmRlcmVycm9yKEwsIGwsIHIpOworICByZXR1cm4gcmVzOworfQorCisKK2ludCBsdWFWX2xlc3NlcXVhbCAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKmwsIGNvbnN0IFRWYWx1ZSAqcikgeworICBpbnQgcmVzOworICBpZiAodHRpc251bWJlcihsKSAmJiB0dGlzbnVtYmVyKHIpKQorICAgIHJldHVybiBsdWFpX251bWxlKEwsIG52YWx1ZShsKSwgbnZhbHVlKHIpKTsKKyAgZWxzZSBpZiAodHRpc3N0cmluZyhsKSAmJiB0dGlzc3RyaW5nKHIpKQorICAgIHJldHVybiBsX3N0cmNtcChyYXd0c3ZhbHVlKGwpLCByYXd0c3ZhbHVlKHIpKSA8PSAwOworICBlbHNlIGlmICgocmVzID0gY2FsbF9vcmRlclRNKEwsIGwsIHIsIFRNX0xFKSkgPj0gMCkgIC8qIGZpcnN0IHRyeSBgbGUnICovCisgICAgcmV0dXJuIHJlczsKKyAgZWxzZSBpZiAoKHJlcyA9IGNhbGxfb3JkZXJUTShMLCByLCBsLCBUTV9MVCkpIDwgMCkgIC8qIGVsc2UgdHJ5IGBsdCcgKi8KKyAgICBsdWFHX29yZGVyZXJyb3IoTCwgbCwgcik7CisgIHJldHVybiAhcmVzOworfQorCisKKy8qCisqKiBlcXVhbGl0eSBvZiBMdWEgdmFsdWVzLiBMID09IE5VTEwgbWVhbnMgcmF3IGVxdWFsaXR5IChubyBtZXRhbWV0aG9kcykKKyovCitpbnQgbHVhVl9lcXVhbG9ial8gKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICp0MSwgY29uc3QgVFZhbHVlICp0MikgeworICBjb25zdCBUVmFsdWUgKnRtOworICBsdWFfYXNzZXJ0KHR0aXNlcXVhbCh0MSwgdDIpKTsKKyAgc3dpdGNoICh0dHlwZSh0MSkpIHsKKyAgICBjYXNlIExVQV9UTklMOiByZXR1cm4gMTsKKyAgICBjYXNlIExVQV9UTlVNQkVSOiByZXR1cm4gbHVhaV9udW1lcShudmFsdWUodDEpLCBudmFsdWUodDIpKTsKKyAgICBjYXNlIExVQV9UQk9PTEVBTjogcmV0dXJuIGJ2YWx1ZSh0MSkgPT0gYnZhbHVlKHQyKTsgIC8qIHRydWUgbXVzdCBiZSAxICEhICovCisgICAgY2FzZSBMVUFfVExJR0hUVVNFUkRBVEE6IHJldHVybiBwdmFsdWUodDEpID09IHB2YWx1ZSh0Mik7CisgICAgY2FzZSBMVUFfVExDRjogcmV0dXJuIGZ2YWx1ZSh0MSkgPT0gZnZhbHVlKHQyKTsKKyAgICBjYXNlIExVQV9UU0hSU1RSOiByZXR1cm4gZXFzaHJzdHIocmF3dHN2YWx1ZSh0MSksIHJhd3RzdmFsdWUodDIpKTsKKyAgICBjYXNlIExVQV9UTE5HU1RSOiByZXR1cm4gbHVhU19lcWxuZ3N0cihyYXd0c3ZhbHVlKHQxKSwgcmF3dHN2YWx1ZSh0MikpOworICAgIGNhc2UgTFVBX1RVU0VSREFUQTogeworICAgICAgaWYgKHV2YWx1ZSh0MSkgPT0gdXZhbHVlKHQyKSkgcmV0dXJuIDE7CisgICAgICBlbHNlIGlmIChMID09IE5VTEwpIHJldHVybiAwOworICAgICAgdG0gPSBnZXRfZXF1YWxUTShMLCB1dmFsdWUodDEpLT5tZXRhdGFibGUsIHV2YWx1ZSh0MiktPm1ldGF0YWJsZSwgVE1fRVEpOworICAgICAgYnJlYWs7ICAvKiB3aWxsIHRyeSBUTSAqLworICAgIH0KKyAgICBjYXNlIExVQV9UVEFCTEU6IHsKKyAgICAgIGlmIChodmFsdWUodDEpID09IGh2YWx1ZSh0MikpIHJldHVybiAxOworICAgICAgZWxzZSBpZiAoTCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICAgIHRtID0gZ2V0X2VxdWFsVE0oTCwgaHZhbHVlKHQxKS0+bWV0YXRhYmxlLCBodmFsdWUodDIpLT5tZXRhdGFibGUsIFRNX0VRKTsKKyAgICAgIGJyZWFrOyAgLyogd2lsbCB0cnkgVE0gKi8KKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGx1YV9hc3NlcnQoaXNjb2xsZWN0YWJsZSh0MSkpOworICAgICAgcmV0dXJuIGdjdmFsdWUodDEpID09IGdjdmFsdWUodDIpOworICB9CisgIGlmICh0bSA9PSBOVUxMKSByZXR1cm4gMDsgIC8qIG5vIFRNPyAqLworICBjYWxsVE0oTCwgdG0sIHQxLCB0MiwgTC0+dG9wLCAxKTsgIC8qIGNhbGwgVE0gKi8KKyAgcmV0dXJuICFsX2lzZmFsc2UoTC0+dG9wKTsKK30KKworCit2b2lkIGx1YVZfY29uY2F0IChsdWFfU3RhdGUgKkwsIGludCB0b3RhbCkgeworICBsdWFfYXNzZXJ0KHRvdGFsID49IDIpOworICBkbyB7CisgICAgU3RrSWQgdG9wID0gTC0+dG9wOworICAgIGludCBuID0gMjsgIC8qIG51bWJlciBvZiBlbGVtZW50cyBoYW5kbGVkIGluIHRoaXMgcGFzcyAoYXQgbGVhc3QgMikgKi8KKyAgICBpZiAoISh0dGlzc3RyaW5nKHRvcC0yKSB8fCB0dGlzbnVtYmVyKHRvcC0yKSkgfHwgIXRvc3RyaW5nKEwsIHRvcC0xKSkgeworICAgICAgaWYgKCFjYWxsX2JpblRNKEwsIHRvcC0yLCB0b3AtMSwgdG9wLTIsIFRNX0NPTkNBVCkpCisgICAgICAgIGx1YUdfY29uY2F0ZXJyb3IoTCwgdG9wLTIsIHRvcC0xKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHN2YWx1ZSh0b3AtMSktPmxlbiA9PSAwKSAgLyogc2Vjb25kIG9wZXJhbmQgaXMgZW1wdHk/ICovCisgICAgICAodm9pZCl0b3N0cmluZyhMLCB0b3AgLSAyKTsgIC8qIHJlc3VsdCBpcyBmaXJzdCBvcGVyYW5kICovCisgICAgZWxzZSBpZiAodHRpc3N0cmluZyh0b3AtMikgJiYgdHN2YWx1ZSh0b3AtMiktPmxlbiA9PSAwKSB7CisgICAgICBzZXRvYmpzMnMoTCwgdG9wIC0gMiwgdG9wIC0gMSk7ICAvKiByZXN1bHQgaXMgc2Vjb25kIG9wLiAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIGF0IGxlYXN0IHR3byBub24tZW1wdHkgc3RyaW5nIHZhbHVlczsgZ2V0IGFzIG1hbnkgYXMgcG9zc2libGUgKi8KKyAgICAgIHNpemVfdCB0bCA9IHRzdmFsdWUodG9wLTEpLT5sZW47CisgICAgICBjaGFyICpidWZmZXI7CisgICAgICBpbnQgaTsKKyAgICAgIC8qIGNvbGxlY3QgdG90YWwgbGVuZ3RoICovCisgICAgICBmb3IgKGkgPSAxOyBpIDwgdG90YWwgJiYgdG9zdHJpbmcoTCwgdG9wLWktMSk7IGkrKykgeworICAgICAgICBzaXplX3QgbCA9IHRzdmFsdWUodG9wLWktMSktPmxlbjsKKyAgICAgICAgaWYgKGwgPj0gKE1BWF9TSVpFVC9zaXplb2YoY2hhcikpIC0gdGwpCisgICAgICAgICAgbHVhR19ydW5lcnJvcihMLCAic3RyaW5nIGxlbmd0aCBvdmVyZmxvdyIpOworICAgICAgICB0bCArPSBsOworICAgICAgfQorICAgICAgYnVmZmVyID0gbHVhWl9vcGVuc3BhY2UoTCwgJkcoTCktPmJ1ZmYsIHRsKTsKKyAgICAgIHRsID0gMDsKKyAgICAgIG4gPSBpOworICAgICAgZG8geyAgLyogY29uY2F0IGFsbCBzdHJpbmdzICovCisgICAgICAgIHNpemVfdCBsID0gdHN2YWx1ZSh0b3AtaSktPmxlbjsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlcit0bCwgc3ZhbHVlKHRvcC1pKSwgbCAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIHRsICs9IGw7CisgICAgICB9IHdoaWxlICgtLWkgPiAwKTsKKyAgICAgIHNldHN2YWx1ZTJzKEwsIHRvcC1uLCBsdWFTX25ld2xzdHIoTCwgYnVmZmVyLCB0bCkpOworICAgIH0KKyAgICB0b3RhbCAtPSBuLTE7ICAvKiBnb3QgJ24nIHN0cmluZ3MgdG8gY3JlYXRlIDEgbmV3ICovCisgICAgTC0+dG9wIC09IG4tMTsgIC8qIHBvcHBlZCAnbicgc3RyaW5ncyBhbmQgcHVzaGVkIG9uZSAqLworICB9IHdoaWxlICh0b3RhbCA+IDEpOyAgLyogcmVwZWF0IHVudGlsIG9ubHkgMSByZXN1bHQgbGVmdCAqLworfQorCisKK3ZvaWQgbHVhVl9vYmpsZW4gKGx1YV9TdGF0ZSAqTCwgU3RrSWQgcmEsIGNvbnN0IFRWYWx1ZSAqcmIpIHsKKyAgY29uc3QgVFZhbHVlICp0bTsKKyAgc3dpdGNoICh0dHlwZW52KHJiKSkgeworICAgIGNhc2UgTFVBX1RUQUJMRTogeworICAgICAgVGFibGUgKmggPSBodmFsdWUocmIpOworICAgICAgdG0gPSBmYXN0dG0oTCwgaC0+bWV0YXRhYmxlLCBUTV9MRU4pOworICAgICAgaWYgKHRtKSBicmVhazsgIC8qIG1ldGFtZXRob2Q/IGJyZWFrIHN3aXRjaCB0byBjYWxsIGl0ICovCisgICAgICBzZXRudmFsdWUocmEsIGNhc3RfbnVtKGx1YUhfZ2V0bihoKSkpOyAgLyogZWxzZSBwcmltaXRpdmUgbGVuICovCisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgTFVBX1RTVFJJTkc6IHsKKyAgICAgIHNldG52YWx1ZShyYSwgY2FzdF9udW0odHN2YWx1ZShyYiktPmxlbikpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkZWZhdWx0OiB7ICAvKiB0cnkgbWV0YW1ldGhvZCAqLworICAgICAgdG0gPSBsdWFUX2dldHRtYnlvYmooTCwgcmIsIFRNX0xFTik7CisgICAgICBpZiAodHRpc25pbCh0bSkpICAvKiBubyBtZXRhbWV0aG9kPyAqLworICAgICAgICBsdWFHX3R5cGVlcnJvcihMLCByYiwgImdldCBsZW5ndGggb2YiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBjYWxsVE0oTCwgdG0sIHJiLCByYiwgcmEsIDEpOworfQorCisKK3ZvaWQgbHVhVl9hcml0aCAobHVhX1N0YXRlICpMLCBTdGtJZCByYSwgY29uc3QgVFZhbHVlICpyYiwKKyAgICAgICAgICAgICAgICAgY29uc3QgVFZhbHVlICpyYywgVE1TIG9wKSB7CisgIFRWYWx1ZSB0ZW1wYiwgdGVtcGM7CisgIGNvbnN0IFRWYWx1ZSAqYiwgKmM7CisgIGlmICgoYiA9IGx1YVZfdG9udW1iZXIocmIsICZ0ZW1wYikpICE9IE5VTEwgJiYKKyAgICAgIChjID0gbHVhVl90b251bWJlcihyYywgJnRlbXBjKSkgIT0gTlVMTCkgeworICAgIGx1YV9OdW1iZXIgcmVzID0gbHVhT19hcml0aChvcCAtIFRNX0FERCArIExVQV9PUEFERCwgbnZhbHVlKGIpLCBudmFsdWUoYykpOworICAgIHNldG52YWx1ZShyYSwgcmVzKTsKKyAgfQorICBlbHNlIGlmICghY2FsbF9iaW5UTShMLCByYiwgcmMsIHJhLCBvcCkpCisgICAgbHVhR19hcml0aGVycm9yKEwsIHJiLCByYyk7Cit9CisKKworLyoKKyoqIGNoZWNrIHdoZXRoZXIgY2FjaGVkIGNsb3N1cmUgaW4gcHJvdG90eXBlICdwJyBtYXkgYmUgcmV1c2VkLCB0aGF0IGlzLAorKiogd2hldGhlciB0aGVyZSBpcyBhIGNhY2hlZCBjbG9zdXJlIHdpdGggdGhlIHNhbWUgdXB2YWx1ZXMgbmVlZGVkIGJ5CisqKiBuZXcgY2xvc3VyZSB0byBiZSBjcmVhdGVkLgorKi8KK3N0YXRpYyBDbG9zdXJlICpnZXRjYWNoZWQgKFByb3RvICpwLCBVcFZhbCAqKmVuY3VwLCBTdGtJZCBiYXNlKSB7CisgIENsb3N1cmUgKmMgPSBwLT5jYWNoZTsKKyAgaWYgKGMgIT0gTlVMTCkgeyAgLyogaXMgdGhlcmUgYSBjYWNoZWQgY2xvc3VyZT8gKi8KKyAgICBpbnQgbnVwID0gcC0+c2l6ZXVwdmFsdWVzOworICAgIFVwdmFsZGVzYyAqdXYgPSBwLT51cHZhbHVlczsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVwOyBpKyspIHsgIC8qIGNoZWNrIHdoZXRoZXIgaXQgaGFzIHJpZ2h0IHVwdmFsdWVzICovCisgICAgICBUVmFsdWUgKnYgPSB1dltpXS5pbnN0YWNrID8gYmFzZSArIHV2W2ldLmlkeCA6IGVuY3VwW3V2W2ldLmlkeF0tPnY7CisgICAgICBpZiAoYy0+bC51cHZhbHNbaV0tPnYgIT0gdikKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiB3cm9uZyB1cHZhbHVlOyBjYW5ub3QgcmV1c2UgY2xvc3VyZSAqLworICAgIH0KKyAgfQorICByZXR1cm4gYzsgIC8qIHJldHVybiBjYWNoZWQgY2xvc3VyZSAob3IgTlVMTCBpZiBubyBjYWNoZWQgY2xvc3VyZSkgKi8KK30KKworCisvKgorKiogY3JlYXRlIGEgbmV3IEx1YSBjbG9zdXJlLCBwdXNoIGl0IGluIHRoZSBzdGFjaywgYW5kIGluaXRpYWxpemUKKyoqIGl0cyB1cHZhbHVlcy4gTm90ZSB0aGF0IHRoZSBjYWxsIHRvICdsdWFDX2JhcnJpZXJwcm90bycgbXVzdCBjb21lCisqKiBiZWZvcmUgdGhlIGFzc2lnbm1lbnQgdG8gJ3AtPmNhY2hlJywgYXMgdGhlIGZ1bmN0aW9uIG5lZWRzIHRoZQorKiogb3JpZ2luYWwgdmFsdWUgb2YgdGhhdCBmaWVsZC4KKyovCitzdGF0aWMgdm9pZCBwdXNoY2xvc3VyZSAobHVhX1N0YXRlICpMLCBQcm90byAqcCwgVXBWYWwgKiplbmN1cCwgU3RrSWQgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdGtJZCByYSkgeworICBpbnQgbnVwID0gcC0+c2l6ZXVwdmFsdWVzOworICBVcHZhbGRlc2MgKnV2ID0gcC0+dXB2YWx1ZXM7CisgIGludCBpOworICBDbG9zdXJlICpuY2wgPSBsdWFGX25ld0xjbG9zdXJlKEwsIG51cCk7CisgIG5jbC0+bC5wID0gcDsKKyAgc2V0Y2xMdmFsdWUoTCwgcmEsIG5jbCk7ICAvKiBhbmNob3IgbmV3IGNsb3N1cmUgaW4gc3RhY2sgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51cDsgaSsrKSB7ICAvKiBmaWxsIGluIGl0cyB1cHZhbHVlcyAqLworICAgIGlmICh1dltpXS5pbnN0YWNrKSAgLyogdXB2YWx1ZSByZWZlcnMgdG8gbG9jYWwgdmFyaWFibGU/ICovCisgICAgICBuY2wtPmwudXB2YWxzW2ldID0gbHVhRl9maW5kdXB2YWwoTCwgYmFzZSArIHV2W2ldLmlkeCk7CisgICAgZWxzZSAgLyogZ2V0IHVwdmFsdWUgZnJvbSBlbmNsb3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgIG5jbC0+bC51cHZhbHNbaV0gPSBlbmN1cFt1dltpXS5pZHhdOworICB9CisgIGx1YUNfYmFycmllcnByb3RvKEwsIHAsIG5jbCk7CisgIHAtPmNhY2hlID0gbmNsOyAgLyogc2F2ZSBpdCBvbiBjYWNoZSBmb3IgcmV1c2UgKi8KK30KKworCisvKgorKiogZmluaXNoIGV4ZWN1dGlvbiBvZiBhbiBvcGNvZGUgaW50ZXJydXB0ZWQgYnkgYW4geWllbGQKKyovCit2b2lkIGx1YVZfZmluaXNoT3AgKGx1YV9TdGF0ZSAqTCkgeworICBDYWxsSW5mbyAqY2kgPSBMLT5jaTsKKyAgU3RrSWQgYmFzZSA9IGNpLT51LmwuYmFzZTsKKyAgSW5zdHJ1Y3Rpb24gaW5zdCA9ICooY2ktPnUubC5zYXZlZHBjIC0gMSk7ICAvKiBpbnRlcnJ1cHRlZCBpbnN0cnVjdGlvbiAqLworICBPcENvZGUgb3AgPSBHRVRfT1BDT0RFKGluc3QpOworICBzd2l0Y2ggKG9wKSB7ICAvKiBmaW5pc2ggaXRzIGV4ZWN1dGlvbiAqLworICAgIGNhc2UgT1BfQUREOiBjYXNlIE9QX1NVQjogY2FzZSBPUF9NVUw6IGNhc2UgT1BfRElWOgorICAgIGNhc2UgT1BfTU9EOiBjYXNlIE9QX1BPVzogY2FzZSBPUF9VTk06IGNhc2UgT1BfTEVOOgorICAgIGNhc2UgT1BfR0VUVEFCVVA6IGNhc2UgT1BfR0VUVEFCTEU6IGNhc2UgT1BfU0VMRjogeworICAgICAgc2V0b2JqczJzKEwsIGJhc2UgKyBHRVRBUkdfQShpbnN0KSwgLS1MLT50b3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgT1BfTEU6IGNhc2UgT1BfTFQ6IGNhc2UgT1BfRVE6IHsKKyAgICAgIGludCByZXMgPSAhbF9pc2ZhbHNlKEwtPnRvcCAtIDEpOworICAgICAgTC0+dG9wLS07CisgICAgICAvKiBtZXRhbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoZW4gb3BlcmFuZCBpcyBLICovCisgICAgICBsdWFfYXNzZXJ0KCFJU0soR0VUQVJHX0IoaW5zdCkpKTsKKyAgICAgIGlmIChvcCA9PSBPUF9MRSAmJiAgLyogIjw9IiB1c2luZyAiPCIgaW5zdGVhZD8gKi8KKyAgICAgICAgICB0dGlzbmlsKGx1YVRfZ2V0dG1ieW9iaihMLCBiYXNlICsgR0VUQVJHX0IoaW5zdCksIFRNX0xFKSkpCisgICAgICAgIHJlcyA9ICFyZXM7ICAvKiBpbnZlcnQgcmVzdWx0ICovCisgICAgICBsdWFfYXNzZXJ0KEdFVF9PUENPREUoKmNpLT51Lmwuc2F2ZWRwYykgPT0gT1BfSk1QKTsKKyAgICAgIGlmIChyZXMgIT0gR0VUQVJHX0EoaW5zdCkpICAvKiBjb25kaXRpb24gZmFpbGVkPyAqLworICAgICAgICBjaS0+dS5sLnNhdmVkcGMrKzsgIC8qIHNraXAganVtcCBpbnN0cnVjdGlvbiAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgT1BfQ09OQ0FUOiB7CisgICAgICBTdGtJZCB0b3AgPSBMLT50b3AgLSAxOyAgLyogdG9wIHdoZW4gJ2NhbGxfYmluVE0nIHdhcyBjYWxsZWQgKi8KKyAgICAgIGludCBiID0gR0VUQVJHX0IoaW5zdCk7ICAgICAgLyogZmlyc3QgZWxlbWVudCB0byBjb25jYXRlbmF0ZSAqLworICAgICAgaW50IHRvdGFsID0gY2FzdF9pbnQodG9wIC0gMSAtIChiYXNlICsgYikpOyAgLyogeWV0IHRvIGNvbmNhdGVuYXRlICovCisgICAgICBzZXRvYmoycyhMLCB0b3AgLSAyLCB0b3ApOyAgLyogcHV0IFRNIHJlc3VsdCBpbiBwcm9wZXIgcG9zaXRpb24gKi8KKyAgICAgIGlmICh0b3RhbCA+IDEpIHsgIC8qIGFyZSB0aGVyZSBlbGVtZW50cyB0byBjb25jYXQ/ICovCisgICAgICAgIEwtPnRvcCA9IHRvcCAtIDE7ICAvKiB0b3AgaXMgb25lIGFmdGVyIGxhc3QgZWxlbWVudCAoYXQgdG9wLTIpICovCisgICAgICAgIGx1YVZfY29uY2F0KEwsIHRvdGFsKTsgIC8qIGNvbmNhdCB0aGVtIChtYXkgeWllbGQgYWdhaW4pICovCisgICAgICB9CisgICAgICAvKiBtb3ZlIGZpbmFsIHJlc3VsdCB0byBmaW5hbCBwb3NpdGlvbiAqLworICAgICAgc2V0b2JqMnMoTCwgY2ktPnUubC5iYXNlICsgR0VUQVJHX0EoaW5zdCksIEwtPnRvcCAtIDEpOworICAgICAgTC0+dG9wID0gY2ktPnRvcDsgIC8qIHJlc3RvcmUgdG9wICovCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUF9URk9SQ0FMTDogeworICAgICAgbHVhX2Fzc2VydChHRVRfT1BDT0RFKCpjaS0+dS5sLnNhdmVkcGMpID09IE9QX1RGT1JMT09QKTsKKyAgICAgIEwtPnRvcCA9IGNpLT50b3A7ICAvKiBjb3JyZWN0IHRvcCAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgT1BfQ0FMTDogeworICAgICAgaWYgKEdFVEFSR19DKGluc3QpIC0gMSA+PSAwKSAgLyogbnJlc3VsdHMgPj0gMD8gKi8KKyAgICAgICAgTC0+dG9wID0gY2ktPnRvcDsgIC8qIGFkanVzdCByZXN1bHRzICovCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPUF9UQUlMQ0FMTDogY2FzZSBPUF9TRVRUQUJVUDogY2FzZSBPUF9TRVRUQUJMRToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IGx1YV9hc3NlcnQoMCk7CisgIH0KK30KKworCisKKy8qCisqKiBzb21lIG1hY3JvcyBmb3IgY29tbW9uIHRhc2tzIGluIGBsdWFWX2V4ZWN1dGUnCisqLworCisjaWYgIWRlZmluZWQgbHVhaV9ydW50aW1lY2hlY2sKKyNkZWZpbmUgbHVhaV9ydW50aW1lY2hlY2soTCwgYykJCS8qIHZvaWQgKi8KKyNlbmRpZgorCisKKyNkZWZpbmUgUkEoaSkJKGJhc2UrR0VUQVJHX0EoaSkpCisvKiB0byBiZSB1c2VkIGFmdGVyIHBvc3NpYmxlIHN0YWNrIHJlYWxsb2NhdGlvbiAqLworI2RlZmluZSBSQihpKQljaGVja19leHAoZ2V0Qk1vZGUoR0VUX09QQ09ERShpKSkgPT0gT3BBcmdSLCBiYXNlK0dFVEFSR19CKGkpKQorI2RlZmluZSBSQyhpKQljaGVja19leHAoZ2V0Q01vZGUoR0VUX09QQ09ERShpKSkgPT0gT3BBcmdSLCBiYXNlK0dFVEFSR19DKGkpKQorI2RlZmluZSBSS0IoaSkJY2hlY2tfZXhwKGdldEJNb2RlKEdFVF9PUENPREUoaSkpID09IE9wQXJnSywgXAorCUlTSyhHRVRBUkdfQihpKSkgPyBrK0lOREVYSyhHRVRBUkdfQihpKSkgOiBiYXNlK0dFVEFSR19CKGkpKQorI2RlZmluZSBSS0MoaSkJY2hlY2tfZXhwKGdldENNb2RlKEdFVF9PUENPREUoaSkpID09IE9wQXJnSywgXAorCUlTSyhHRVRBUkdfQyhpKSkgPyBrK0lOREVYSyhHRVRBUkdfQyhpKSkgOiBiYXNlK0dFVEFSR19DKGkpKQorI2RlZmluZSBLQngoaSkgIFwKKyAgKGsgKyAoR0VUQVJHX0J4KGkpICE9IDAgPyBHRVRBUkdfQngoaSkgLSAxIDogR0VUQVJHX0F4KCpjaS0+dS5sLnNhdmVkcGMrKykpKQorCisKKy8qIGV4ZWN1dGUgYSBqdW1wIGluc3RydWN0aW9uICovCisjZGVmaW5lIGRvanVtcChjaSxpLGUpIFwKKyAgeyBpbnQgYSA9IEdFVEFSR19BKGkpOyBcCisgICAgaWYgKGEgPiAwKSBsdWFGX2Nsb3NlKEwsIGNpLT51LmwuYmFzZSArIGEgLSAxKTsgXAorICAgIGNpLT51Lmwuc2F2ZWRwYyArPSBHRVRBUkdfc0J4KGkpICsgZTsgfQorCisvKiBmb3IgdGVzdCBpbnN0cnVjdGlvbnMsIGV4ZWN1dGUgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBmb2xsb3dzIGl0ICovCisjZGVmaW5lIGRvbmV4dGp1bXAoY2kpCXsgaSA9ICpjaS0+dS5sLnNhdmVkcGM7IGRvanVtcChjaSwgaSwgMSk7IH0KKworCisjZGVmaW5lIFByb3RlY3QoeCkJeyB7eDt9OyBiYXNlID0gY2ktPnUubC5iYXNlOyB9CisKKyNkZWZpbmUgY2hlY2tHQyhMLGMpICBcCisgIFByb3RlY3QoIGx1YUNfY29uZEdDKEwse0wtPnRvcCA9IChjKTsgIC8qIGxpbWl0IG9mIGxpdmUgdmFsdWVzICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbHVhQ19zdGVwKEwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEwtPnRvcCA9IGNpLT50b3A7fSkgIC8qIHJlc3RvcmUgdG9wICovIFwKKyAgICAgICAgICAgbHVhaV90aHJlYWR5aWVsZChMKTsgKQorCisKKyNkZWZpbmUgYXJpdGhfb3Aob3AsdG0pIHsgXAorICAgICAgICBUVmFsdWUgKnJiID0gUktCKGkpOyBcCisgICAgICAgIFRWYWx1ZSAqcmMgPSBSS0MoaSk7IFwKKyAgICAgICAgaWYgKHR0aXNudW1iZXIocmIpICYmIHR0aXNudW1iZXIocmMpKSB7IFwKKyAgICAgICAgICBsdWFfTnVtYmVyIG5iID0gbnZhbHVlKHJiKSwgbmMgPSBudmFsdWUocmMpOyBcCisgICAgICAgICAgc2V0bnZhbHVlKHJhLCBvcChMLCBuYiwgbmMpKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSB7IFByb3RlY3QobHVhVl9hcml0aChMLCByYSwgcmIsIHJjLCB0bSkpOyB9IH0KKworCisjZGVmaW5lIHZtZGlzcGF0Y2gobykJc3dpdGNoKG8pCisjZGVmaW5lIHZtY2FzZShsLGIpCWNhc2UgbDoge2J9ICBicmVhazsKKyNkZWZpbmUgdm1jYXNlbmIobCxiKQljYXNlIGw6IHtifQkJLyogbmIgPSBubyBicmVhayAqLworCit2b2lkIGx1YVZfZXhlY3V0ZSAobHVhX1N0YXRlICpMKSB7CisgIENhbGxJbmZvICpjaSA9IEwtPmNpOworICBMQ2xvc3VyZSAqY2w7CisgIFRWYWx1ZSAqazsKKyAgU3RrSWQgYmFzZTsKKyBuZXdmcmFtZTogIC8qIHJlZW50cnkgcG9pbnQgd2hlbiBmcmFtZSBjaGFuZ2VzIChjYWxsL3JldHVybikgKi8KKyAgbHVhX2Fzc2VydChjaSA9PSBMLT5jaSk7CisgIGNsID0gY2xMdmFsdWUoY2ktPmZ1bmMpOworICBrID0gY2wtPnAtPms7CisgIGJhc2UgPSBjaS0+dS5sLmJhc2U7CisgIC8qIG1haW4gbG9vcCBvZiBpbnRlcnByZXRlciAqLworICBmb3IgKDs7KSB7CisgICAgSW5zdHJ1Y3Rpb24gaSA9ICooY2ktPnUubC5zYXZlZHBjKyspOworICAgIFN0a0lkIHJhOworICAgIGlmICgoTC0+aG9va21hc2sgJiAoTFVBX01BU0tMSU5FIHwgTFVBX01BU0tDT1VOVCkpICYmCisgICAgICAgICgtLUwtPmhvb2tjb3VudCA9PSAwIHx8IEwtPmhvb2ttYXNrICYgTFVBX01BU0tMSU5FKSkgeworICAgICAgUHJvdGVjdCh0cmFjZWV4ZWMoTCkpOworICAgIH0KKyAgICAvKiBXQVJOSU5HOiBzZXZlcmFsIGNhbGxzIG1heSByZWFsbG9jIHRoZSBzdGFjayBhbmQgaW52YWxpZGF0ZSBgcmEnICovCisgICAgcmEgPSBSQShpKTsKKyAgICBsdWFfYXNzZXJ0KGJhc2UgPT0gY2ktPnUubC5iYXNlKTsKKyAgICBsdWFfYXNzZXJ0KGJhc2UgPD0gTC0+dG9wICYmIEwtPnRvcCA8IEwtPnN0YWNrICsgTC0+c3RhY2tzaXplKTsKKyAgICB2bWRpc3BhdGNoIChHRVRfT1BDT0RFKGkpKSB7CisgICAgICB2bWNhc2UoT1BfTU9WRSwKKyAgICAgICAgc2V0b2JqczJzKEwsIHJhLCBSQihpKSk7CisgICAgICApCisgICAgICB2bWNhc2UoT1BfTE9BREssCisgICAgICAgIFRWYWx1ZSAqcmIgPSBrICsgR0VUQVJHX0J4KGkpOworICAgICAgICBzZXRvYmoycyhMLCByYSwgcmIpOworICAgICAgKQorICAgICAgdm1jYXNlKE9QX0xPQURLWCwKKyAgICAgICAgVFZhbHVlICpyYjsKKyAgICAgICAgbHVhX2Fzc2VydChHRVRfT1BDT0RFKCpjaS0+dS5sLnNhdmVkcGMpID09IE9QX0VYVFJBQVJHKTsKKyAgICAgICAgcmIgPSBrICsgR0VUQVJHX0F4KCpjaS0+dS5sLnNhdmVkcGMrKyk7CisgICAgICAgIHNldG9iajJzKEwsIHJhLCByYik7CisgICAgICApCisgICAgICB2bWNhc2UoT1BfTE9BREJPT0wsCisgICAgICAgIHNldGJ2YWx1ZShyYSwgR0VUQVJHX0IoaSkpOworICAgICAgICBpZiAoR0VUQVJHX0MoaSkpIGNpLT51Lmwuc2F2ZWRwYysrOyAgLyogc2tpcCBuZXh0IGluc3RydWN0aW9uIChpZiBDKSAqLworICAgICAgKQorICAgICAgdm1jYXNlKE9QX0xPQUROSUwsCisgICAgICAgIGludCBiID0gR0VUQVJHX0IoaSk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBzZXRuaWx2YWx1ZShyYSsrKTsKKyAgICAgICAgfSB3aGlsZSAoYi0tKTsKKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9HRVRVUFZBTCwKKyAgICAgICAgaW50IGIgPSBHRVRBUkdfQihpKTsKKyAgICAgICAgc2V0b2JqMnMoTCwgcmEsIGNsLT51cHZhbHNbYl0tPnYpOworICAgICAgKQorICAgICAgdm1jYXNlKE9QX0dFVFRBQlVQLAorICAgICAgICBpbnQgYiA9IEdFVEFSR19CKGkpOworICAgICAgICBQcm90ZWN0KGx1YVZfZ2V0dGFibGUoTCwgY2wtPnVwdmFsc1tiXS0+diwgUktDKGkpLCByYSkpOworICAgICAgKQorICAgICAgdm1jYXNlKE9QX0dFVFRBQkxFLAorICAgICAgICBQcm90ZWN0KGx1YVZfZ2V0dGFibGUoTCwgUkIoaSksIFJLQyhpKSwgcmEpKTsKKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9TRVRUQUJVUCwKKyAgICAgICAgaW50IGEgPSBHRVRBUkdfQShpKTsKKyAgICAgICAgUHJvdGVjdChsdWFWX3NldHRhYmxlKEwsIGNsLT51cHZhbHNbYV0tPnYsIFJLQihpKSwgUktDKGkpKSk7CisgICAgICApCisgICAgICB2bWNhc2UoT1BfU0VUVVBWQUwsCisgICAgICAgIFVwVmFsICp1diA9IGNsLT51cHZhbHNbR0VUQVJHX0IoaSldOworICAgICAgICBzZXRvYmooTCwgdXYtPnYsIHJhKTsKKyAgICAgICAgbHVhQ19iYXJyaWVyKEwsIHV2LCByYSk7CisgICAgICApCisgICAgICB2bWNhc2UoT1BfU0VUVEFCTEUsCisgICAgICAgIFByb3RlY3QobHVhVl9zZXR0YWJsZShMLCByYSwgUktCKGkpLCBSS0MoaSkpKTsKKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9ORVdUQUJMRSwKKyAgICAgICAgaW50IGIgPSBHRVRBUkdfQihpKTsKKyAgICAgICAgaW50IGMgPSBHRVRBUkdfQyhpKTsKKyAgICAgICAgVGFibGUgKnQgPSBsdWFIX25ldyhMKTsKKyAgICAgICAgc2V0aHZhbHVlKEwsIHJhLCB0KTsKKyAgICAgICAgaWYgKGIgIT0gMCB8fCBjICE9IDApCisgICAgICAgICAgbHVhSF9yZXNpemUoTCwgdCwgbHVhT19mYjJpbnQoYiksIGx1YU9fZmIyaW50KGMpKTsKKyAgICAgICAgY2hlY2tHQyhMLCByYSArIDEpOworICAgICAgKQorICAgICAgdm1jYXNlKE9QX1NFTEYsCisgICAgICAgIFN0a0lkIHJiID0gUkIoaSk7CisgICAgICAgIHNldG9ianMycyhMLCByYSsxLCByYik7CisgICAgICAgIFByb3RlY3QobHVhVl9nZXR0YWJsZShMLCByYiwgUktDKGkpLCByYSkpOworICAgICAgKQorICAgICAgdm1jYXNlKE9QX0FERCwKKyAgICAgICAgYXJpdGhfb3AobHVhaV9udW1hZGQsIFRNX0FERCk7CisgICAgICApCisgICAgICB2bWNhc2UoT1BfU1VCLAorICAgICAgICBhcml0aF9vcChsdWFpX251bXN1YiwgVE1fU1VCKTsKKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9NVUwsCisgICAgICAgIGFyaXRoX29wKGx1YWlfbnVtbXVsLCBUTV9NVUwpOworICAgICAgKQorICAgICAgdm1jYXNlKE9QX0RJViwKKyAgICAgICAgYXJpdGhfb3AobHVhaV9udW1kaXYsIFRNX0RJVik7CisgICAgICApCisgICAgICB2bWNhc2UoT1BfTU9ELAorICAgICAgICBhcml0aF9vcChsdWFpX251bW1vZCwgVE1fTU9EKTsKKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9QT1csCisgICAgICAgIGFyaXRoX29wKGx1YWlfbnVtcG93LCBUTV9QT1cpOworICAgICAgKQorICAgICAgdm1jYXNlKE9QX1VOTSwKKyAgICAgICAgVFZhbHVlICpyYiA9IFJCKGkpOworICAgICAgICBpZiAodHRpc251bWJlcihyYikpIHsKKyAgICAgICAgICBsdWFfTnVtYmVyIG5iID0gbnZhbHVlKHJiKTsKKyAgICAgICAgICBzZXRudmFsdWUocmEsIGx1YWlfbnVtdW5tKEwsIG5iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgUHJvdGVjdChsdWFWX2FyaXRoKEwsIHJhLCByYiwgcmIsIFRNX1VOTSkpOworICAgICAgICB9CisgICAgICApCisgICAgICB2bWNhc2UoT1BfTk9ULAorICAgICAgICBUVmFsdWUgKnJiID0gUkIoaSk7CisgICAgICAgIGludCByZXMgPSBsX2lzZmFsc2UocmIpOyAgLyogbmV4dCBhc3NpZ25tZW50IG1heSBjaGFuZ2UgdGhpcyB2YWx1ZSAqLworICAgICAgICBzZXRidmFsdWUocmEsIHJlcyk7CisgICAgICApCisgICAgICB2bWNhc2UoT1BfTEVOLAorICAgICAgICBQcm90ZWN0KGx1YVZfb2JqbGVuKEwsIHJhLCBSQihpKSkpOworICAgICAgKQorICAgICAgdm1jYXNlKE9QX0NPTkNBVCwKKyAgICAgICAgaW50IGIgPSBHRVRBUkdfQihpKTsKKyAgICAgICAgaW50IGMgPSBHRVRBUkdfQyhpKTsKKyAgICAgICAgU3RrSWQgcmI7CisgICAgICAgIEwtPnRvcCA9IGJhc2UgKyBjICsgMTsgIC8qIG1hcmsgdGhlIGVuZCBvZiBjb25jYXQgb3BlcmFuZHMgKi8KKyAgICAgICAgUHJvdGVjdChsdWFWX2NvbmNhdChMLCBjIC0gYiArIDEpKTsKKyAgICAgICAgcmEgPSBSQShpKTsgIC8qICdsdWF2X2NvbmNhdCcgbWF5IGludm9rZSBUTXMgYW5kIG1vdmUgdGhlIHN0YWNrICovCisgICAgICAgIHJiID0gYiArIGJhc2U7CisgICAgICAgIHNldG9ianMycyhMLCByYSwgcmIpOworICAgICAgICBjaGVja0dDKEwsIChyYSA+PSByYiA/IHJhICsgMSA6IHJiKSk7CisgICAgICAgIEwtPnRvcCA9IGNpLT50b3A7ICAvKiByZXN0b3JlIHRvcCAqLworICAgICAgKQorICAgICAgdm1jYXNlKE9QX0pNUCwKKyAgICAgICAgZG9qdW1wKGNpLCBpLCAwKTsKKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9FUSwKKyAgICAgICAgVFZhbHVlICpyYiA9IFJLQihpKTsKKyAgICAgICAgVFZhbHVlICpyYyA9IFJLQyhpKTsKKyAgICAgICAgUHJvdGVjdCgKKyAgICAgICAgICBpZiAoY2FzdF9pbnQoZXF1YWxvYmooTCwgcmIsIHJjKSkgIT0gR0VUQVJHX0EoaSkpCisgICAgICAgICAgICBjaS0+dS5sLnNhdmVkcGMrKzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBkb25leHRqdW1wKGNpKTsKKyAgICAgICAgKQorICAgICAgKQorICAgICAgdm1jYXNlKE9QX0xULAorICAgICAgICBQcm90ZWN0KAorICAgICAgICAgIGlmIChsdWFWX2xlc3N0aGFuKEwsIFJLQihpKSwgUktDKGkpKSAhPSBHRVRBUkdfQShpKSkKKyAgICAgICAgICAgIGNpLT51Lmwuc2F2ZWRwYysrOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRvbmV4dGp1bXAoY2kpOworICAgICAgICApCisgICAgICApCisgICAgICB2bWNhc2UoT1BfTEUsCisgICAgICAgIFByb3RlY3QoCisgICAgICAgICAgaWYgKGx1YVZfbGVzc2VxdWFsKEwsIFJLQihpKSwgUktDKGkpKSAhPSBHRVRBUkdfQShpKSkKKyAgICAgICAgICAgIGNpLT51Lmwuc2F2ZWRwYysrOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRvbmV4dGp1bXAoY2kpOworICAgICAgICApCisgICAgICApCisgICAgICB2bWNhc2UoT1BfVEVTVCwKKyAgICAgICAgaWYgKEdFVEFSR19DKGkpID8gbF9pc2ZhbHNlKHJhKSA6ICFsX2lzZmFsc2UocmEpKQorICAgICAgICAgICAgY2ktPnUubC5zYXZlZHBjKys7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIGRvbmV4dGp1bXAoY2kpOworICAgICAgKQorICAgICAgdm1jYXNlKE9QX1RFU1RTRVQsCisgICAgICAgIFRWYWx1ZSAqcmIgPSBSQihpKTsKKyAgICAgICAgaWYgKEdFVEFSR19DKGkpID8gbF9pc2ZhbHNlKHJiKSA6ICFsX2lzZmFsc2UocmIpKQorICAgICAgICAgIGNpLT51Lmwuc2F2ZWRwYysrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBzZXRvYmpzMnMoTCwgcmEsIHJiKTsKKyAgICAgICAgICBkb25leHRqdW1wKGNpKTsKKyAgICAgICAgfQorICAgICAgKQorICAgICAgdm1jYXNlKE9QX0NBTEwsCisgICAgICAgIGludCBiID0gR0VUQVJHX0IoaSk7CisgICAgICAgIGludCBucmVzdWx0cyA9IEdFVEFSR19DKGkpIC0gMTsKKyAgICAgICAgaWYgKGIgIT0gMCkgTC0+dG9wID0gcmErYjsgIC8qIGVsc2UgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gc2V0IHRvcCAqLworICAgICAgICBpZiAobHVhRF9wcmVjYWxsKEwsIHJhLCBucmVzdWx0cykpIHsgIC8qIEMgZnVuY3Rpb24/ICovCisgICAgICAgICAgaWYgKG5yZXN1bHRzID49IDApIEwtPnRvcCA9IGNpLT50b3A7ICAvKiBhZGp1c3QgcmVzdWx0cyAqLworICAgICAgICAgIGJhc2UgPSBjaS0+dS5sLmJhc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7ICAvKiBMdWEgZnVuY3Rpb24gKi8KKyAgICAgICAgICBjaSA9IEwtPmNpOworICAgICAgICAgIGNpLT5jYWxsc3RhdHVzIHw9IENJU1RfUkVFTlRSWTsKKyAgICAgICAgICBnb3RvIG5ld2ZyYW1lOyAgLyogcmVzdGFydCBsdWFWX2V4ZWN1dGUgb3ZlciBuZXcgTHVhIGZ1bmN0aW9uICovCisgICAgICAgIH0KKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9UQUlMQ0FMTCwKKyAgICAgICAgaW50IGIgPSBHRVRBUkdfQihpKTsKKyAgICAgICAgaWYgKGIgIT0gMCkgTC0+dG9wID0gcmErYjsgIC8qIGVsc2UgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gc2V0IHRvcCAqLworICAgICAgICBsdWFfYXNzZXJ0KEdFVEFSR19DKGkpIC0gMSA9PSBMVUFfTVVMVFJFVCk7CisgICAgICAgIGlmIChsdWFEX3ByZWNhbGwoTCwgcmEsIExVQV9NVUxUUkVUKSkgIC8qIEMgZnVuY3Rpb24/ICovCisgICAgICAgICAgYmFzZSA9IGNpLT51LmwuYmFzZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogdGFpbCBjYWxsOiBwdXQgY2FsbGVkIGZyYW1lIChuKSBpbiBwbGFjZSBvZiBjYWxsZXIgb25lIChvKSAqLworICAgICAgICAgIENhbGxJbmZvICpuY2kgPSBMLT5jaTsgIC8qIGNhbGxlZCBmcmFtZSAqLworICAgICAgICAgIENhbGxJbmZvICpvY2kgPSBuY2ktPnByZXZpb3VzOyAgLyogY2FsbGVyIGZyYW1lICovCisgICAgICAgICAgU3RrSWQgbmZ1bmMgPSBuY2ktPmZ1bmM7ICAvKiBjYWxsZWQgZnVuY3Rpb24gKi8KKyAgICAgICAgICBTdGtJZCBvZnVuYyA9IG9jaS0+ZnVuYzsgIC8qIGNhbGxlciBmdW5jdGlvbiAqLworICAgICAgICAgIC8qIGxhc3Qgc3RhY2sgc2xvdCBmaWxsZWQgYnkgJ3ByZWNhbGwnICovCisgICAgICAgICAgU3RrSWQgbGltID0gbmNpLT51LmwuYmFzZSArIGdldHByb3RvKG5mdW5jKS0+bnVtcGFyYW1zOworICAgICAgICAgIGludCBhdXg7CisgICAgICAgICAgLyogY2xvc2UgYWxsIHVwdmFsdWVzIGZyb20gcHJldmlvdXMgY2FsbCAqLworICAgICAgICAgIGlmIChjbC0+cC0+c2l6ZXAgPiAwKSBsdWFGX2Nsb3NlKEwsIG9jaS0+dS5sLmJhc2UpOworICAgICAgICAgIC8qIG1vdmUgbmV3IGZyYW1lIGludG8gb2xkIG9uZSAqLworICAgICAgICAgIGZvciAoYXV4ID0gMDsgbmZ1bmMgKyBhdXggPCBsaW07IGF1eCsrKQorICAgICAgICAgICAgc2V0b2JqczJzKEwsIG9mdW5jICsgYXV4LCBuZnVuYyArIGF1eCk7CisgICAgICAgICAgb2NpLT51LmwuYmFzZSA9IG9mdW5jICsgKG5jaS0+dS5sLmJhc2UgLSBuZnVuYyk7ICAvKiBjb3JyZWN0IGJhc2UgKi8KKyAgICAgICAgICBvY2ktPnRvcCA9IEwtPnRvcCA9IG9mdW5jICsgKEwtPnRvcCAtIG5mdW5jKTsgIC8qIGNvcnJlY3QgdG9wICovCisgICAgICAgICAgb2NpLT51Lmwuc2F2ZWRwYyA9IG5jaS0+dS5sLnNhdmVkcGM7CisgICAgICAgICAgb2NpLT5jYWxsc3RhdHVzIHw9IENJU1RfVEFJTDsgIC8qIGZ1bmN0aW9uIHdhcyB0YWlsIGNhbGxlZCAqLworICAgICAgICAgIGNpID0gTC0+Y2kgPSBvY2k7ICAvKiByZW1vdmUgbmV3IGZyYW1lICovCisgICAgICAgICAgbHVhX2Fzc2VydChMLT50b3AgPT0gb2NpLT51LmwuYmFzZSArIGdldHByb3RvKG9mdW5jKS0+bWF4c3RhY2tzaXplKTsKKyAgICAgICAgICBnb3RvIG5ld2ZyYW1lOyAgLyogcmVzdGFydCBsdWFWX2V4ZWN1dGUgb3ZlciBuZXcgTHVhIGZ1bmN0aW9uICovCisgICAgICAgIH0KKyAgICAgICkKKyAgICAgIHZtY2FzZW5iKE9QX1JFVFVSTiwKKyAgICAgICAgaW50IGIgPSBHRVRBUkdfQihpKTsKKyAgICAgICAgaWYgKGIgIT0gMCkgTC0+dG9wID0gcmErYi0xOworICAgICAgICBpZiAoY2wtPnAtPnNpemVwID4gMCkgbHVhRl9jbG9zZShMLCBiYXNlKTsKKyAgICAgICAgYiA9IGx1YURfcG9zY2FsbChMLCByYSk7CisgICAgICAgIGlmICghKGNpLT5jYWxsc3RhdHVzICYgQ0lTVF9SRUVOVFJZKSkgIC8qICdjaScgc3RpbGwgdGhlIGNhbGxlZCBvbmUgKi8KKyAgICAgICAgICByZXR1cm47ICAvKiBleHRlcm5hbCBpbnZvY2F0aW9uOiByZXR1cm4gKi8KKyAgICAgICAgZWxzZSB7ICAvKiBpbnZvY2F0aW9uIHZpYSByZWVudHJ5OiBjb250aW51ZSBleGVjdXRpb24gKi8KKyAgICAgICAgICBjaSA9IEwtPmNpOworICAgICAgICAgIGlmIChiKSBMLT50b3AgPSBjaS0+dG9wOworICAgICAgICAgIGx1YV9hc3NlcnQoaXNMdWEoY2kpKTsKKyAgICAgICAgICBsdWFfYXNzZXJ0KEdFVF9PUENPREUoKigoY2kpLT51Lmwuc2F2ZWRwYyAtIDEpKSA9PSBPUF9DQUxMKTsKKyAgICAgICAgICBnb3RvIG5ld2ZyYW1lOyAgLyogcmVzdGFydCBsdWFWX2V4ZWN1dGUgb3ZlciBuZXcgTHVhIGZ1bmN0aW9uICovCisgICAgICAgIH0KKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9GT1JMT09QLAorICAgICAgICBsdWFfTnVtYmVyIHN0ZXAgPSBudmFsdWUocmErMik7CisgICAgICAgIGx1YV9OdW1iZXIgaWR4ID0gbHVhaV9udW1hZGQoTCwgbnZhbHVlKHJhKSwgc3RlcCk7IC8qIGluY3JlbWVudCBpbmRleCAqLworICAgICAgICBsdWFfTnVtYmVyIGxpbWl0ID0gbnZhbHVlKHJhKzEpOworICAgICAgICBpZiAobHVhaV9udW1sdChMLCAwLCBzdGVwKSA/IGx1YWlfbnVtbGUoTCwgaWR4LCBsaW1pdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsdWFpX251bWxlKEwsIGxpbWl0LCBpZHgpKSB7CisgICAgICAgICAgY2ktPnUubC5zYXZlZHBjICs9IEdFVEFSR19zQngoaSk7ICAvKiBqdW1wIGJhY2sgKi8KKyAgICAgICAgICBzZXRudmFsdWUocmEsIGlkeCk7ICAvKiB1cGRhdGUgaW50ZXJuYWwgaW5kZXguLi4gKi8KKyAgICAgICAgICBzZXRudmFsdWUocmErMywgaWR4KTsgIC8qIC4uLmFuZCBleHRlcm5hbCBpbmRleCAqLworICAgICAgICB9CisgICAgICApCisgICAgICB2bWNhc2UoT1BfRk9SUFJFUCwKKyAgICAgICAgY29uc3QgVFZhbHVlICppbml0ID0gcmE7CisgICAgICAgIGNvbnN0IFRWYWx1ZSAqcGxpbWl0ID0gcmErMTsKKyAgICAgICAgY29uc3QgVFZhbHVlICpwc3RlcCA9IHJhKzI7CisgICAgICAgIGlmICghdG9udW1iZXIoaW5pdCwgcmEpKQorICAgICAgICAgIGx1YUdfcnVuZXJyb3IoTCwgTFVBX1FMKCJmb3IiKSAiIGluaXRpYWwgdmFsdWUgbXVzdCBiZSBhIG51bWJlciIpOworICAgICAgICBlbHNlIGlmICghdG9udW1iZXIocGxpbWl0LCByYSsxKSkKKyAgICAgICAgICBsdWFHX3J1bmVycm9yKEwsIExVQV9RTCgiZm9yIikgIiBsaW1pdCBtdXN0IGJlIGEgbnVtYmVyIik7CisgICAgICAgIGVsc2UgaWYgKCF0b251bWJlcihwc3RlcCwgcmErMikpCisgICAgICAgICAgbHVhR19ydW5lcnJvcihMLCBMVUFfUUwoImZvciIpICIgc3RlcCBtdXN0IGJlIGEgbnVtYmVyIik7CisgICAgICAgIHNldG52YWx1ZShyYSwgbHVhaV9udW1zdWIoTCwgbnZhbHVlKHJhKSwgbnZhbHVlKHBzdGVwKSkpOworICAgICAgICBjaS0+dS5sLnNhdmVkcGMgKz0gR0VUQVJHX3NCeChpKTsKKyAgICAgICkKKyAgICAgIHZtY2FzZW5iKE9QX1RGT1JDQUxMLAorICAgICAgICBTdGtJZCBjYiA9IHJhICsgMzsgIC8qIGNhbGwgYmFzZSAqLworICAgICAgICBzZXRvYmpzMnMoTCwgY2IrMiwgcmErMik7CisgICAgICAgIHNldG9ianMycyhMLCBjYisxLCByYSsxKTsKKyAgICAgICAgc2V0b2JqczJzKEwsIGNiLCByYSk7CisgICAgICAgIEwtPnRvcCA9IGNiICsgMzsgIC8qIGZ1bmMuICsgMiBhcmdzIChzdGF0ZSBhbmQgaW5kZXgpICovCisgICAgICAgIFByb3RlY3QobHVhRF9jYWxsKEwsIGNiLCBHRVRBUkdfQyhpKSwgMSkpOworICAgICAgICBMLT50b3AgPSBjaS0+dG9wOworICAgICAgICBpID0gKihjaS0+dS5sLnNhdmVkcGMrKyk7ICAvKiBnbyB0byBuZXh0IGluc3RydWN0aW9uICovCisgICAgICAgIHJhID0gUkEoaSk7CisgICAgICAgIGx1YV9hc3NlcnQoR0VUX09QQ09ERShpKSA9PSBPUF9URk9STE9PUCk7CisgICAgICAgIGdvdG8gbF90Zm9ybG9vcDsKKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9URk9STE9PUCwKKyAgICAgICAgbF90Zm9ybG9vcDoKKyAgICAgICAgaWYgKCF0dGlzbmlsKHJhICsgMSkpIHsgIC8qIGNvbnRpbnVlIGxvb3A/ICovCisgICAgICAgICAgc2V0b2JqczJzKEwsIHJhLCByYSArIDEpOyAgLyogc2F2ZSBjb250cm9sIHZhcmlhYmxlICovCisgICAgICAgICAgIGNpLT51Lmwuc2F2ZWRwYyArPSBHRVRBUkdfc0J4KGkpOyAgLyoganVtcCBiYWNrICovCisgICAgICAgIH0KKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9TRVRMSVNULAorICAgICAgICBpbnQgbiA9IEdFVEFSR19CKGkpOworICAgICAgICBpbnQgYyA9IEdFVEFSR19DKGkpOworICAgICAgICBpbnQgbGFzdDsKKyAgICAgICAgVGFibGUgKmg7CisgICAgICAgIGlmIChuID09IDApIG4gPSBjYXN0X2ludChMLT50b3AgLSByYSkgLSAxOworICAgICAgICBpZiAoYyA9PSAwKSB7CisgICAgICAgICAgbHVhX2Fzc2VydChHRVRfT1BDT0RFKCpjaS0+dS5sLnNhdmVkcGMpID09IE9QX0VYVFJBQVJHKTsKKyAgICAgICAgICBjID0gR0VUQVJHX0F4KCpjaS0+dS5sLnNhdmVkcGMrKyk7CisgICAgICAgIH0KKyAgICAgICAgbHVhaV9ydW50aW1lY2hlY2soTCwgdHRpc3RhYmxlKHJhKSk7CisgICAgICAgIGggPSBodmFsdWUocmEpOworICAgICAgICBsYXN0ID0gKChjLTEpKkxGSUVMRFNfUEVSX0ZMVVNIKSArIG47CisgICAgICAgIGlmIChsYXN0ID4gaC0+c2l6ZWFycmF5KSAgLyogbmVlZHMgbW9yZSBzcGFjZT8gKi8KKyAgICAgICAgICBsdWFIX3Jlc2l6ZWFycmF5KEwsIGgsIGxhc3QpOyAgLyogcHJlLWFsbG9jYXRlIGl0IGF0IG9uY2UgKi8KKyAgICAgICAgZm9yICg7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICBUVmFsdWUgKnZhbCA9IHJhK247CisgICAgICAgICAgbHVhSF9zZXRpbnQoTCwgaCwgbGFzdC0tLCB2YWwpOworICAgICAgICAgIGx1YUNfYmFycmllcmJhY2soTCwgb2JqMmdjbyhoKSwgdmFsKTsKKyAgICAgICAgfQorICAgICAgICBMLT50b3AgPSBjaS0+dG9wOyAgLyogY29ycmVjdCB0b3AgKGluIGNhc2Ugb2YgcHJldmlvdXMgb3BlbiBjYWxsKSAqLworICAgICAgKQorICAgICAgdm1jYXNlKE9QX0NMT1NVUkUsCisgICAgICAgIFByb3RvICpwID0gY2wtPnAtPnBbR0VUQVJHX0J4KGkpXTsKKyAgICAgICAgQ2xvc3VyZSAqbmNsID0gZ2V0Y2FjaGVkKHAsIGNsLT51cHZhbHMsIGJhc2UpOyAgLyogY2FjaGVkIGNsb3N1cmUgKi8KKyAgICAgICAgaWYgKG5jbCA9PSBOVUxMKSAgLyogbm8gbWF0Y2g/ICovCisgICAgICAgICAgcHVzaGNsb3N1cmUoTCwgcCwgY2wtPnVwdmFscywgYmFzZSwgcmEpOyAgLyogY3JlYXRlIGEgbmV3IG9uZSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgc2V0Y2xMdmFsdWUoTCwgcmEsIG5jbCk7ICAvKiBwdXNoIGNhc2hlZCBjbG9zdXJlICovCisgICAgICAgIGNoZWNrR0MoTCwgcmEgKyAxKTsKKyAgICAgICkKKyAgICAgIHZtY2FzZShPUF9WQVJBUkcsCisgICAgICAgIGludCBiID0gR0VUQVJHX0IoaSkgLSAxOworICAgICAgICBpbnQgajsKKyAgICAgICAgaW50IG4gPSBjYXN0X2ludChiYXNlIC0gY2ktPmZ1bmMpIC0gY2wtPnAtPm51bXBhcmFtcyAtIDE7CisgICAgICAgIGlmIChiIDwgMCkgeyAgLyogQiA9PSAwPyAqLworICAgICAgICAgIGIgPSBuOyAgLyogZ2V0IGFsbCB2YXIuIGFyZ3VtZW50cyAqLworICAgICAgICAgIFByb3RlY3QobHVhRF9jaGVja3N0YWNrKEwsIG4pKTsKKyAgICAgICAgICByYSA9IFJBKGkpOyAgLyogcHJldmlvdXMgY2FsbCBtYXkgY2hhbmdlIHRoZSBzdGFjayAqLworICAgICAgICAgIEwtPnRvcCA9IHJhICsgbjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgYjsgaisrKSB7CisgICAgICAgICAgaWYgKGogPCBuKSB7CisgICAgICAgICAgICBzZXRvYmpzMnMoTCwgcmEgKyBqLCBiYXNlIC0gbiArIGopOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNldG5pbHZhbHVlKHJhICsgaik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICApCisgICAgICB2bWNhc2UoT1BfRVhUUkFBUkcsCisgICAgICAgIGx1YV9hc3NlcnQoMCk7CisgICAgICApCisgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS9zcmMvbHZtLmggYi9jb20zMi9sdWEvc3JjL2x2bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODAyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2x2bS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisqKiAkSWQ6IGx2bS5oLHYgMi4xOC4xLjEgMjAxMy8wNC8xMiAxODo0ODo0NyByb2JlcnRvIEV4cCAkCisqKiBMdWEgdmlydHVhbCBtYWNoaW5lCisqKiBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBsdWEuaAorKi8KKworI2lmbmRlZiBsdm1faAorI2RlZmluZSBsdm1faAorCisKKyNpbmNsdWRlICJsZG8uaCIKKyNpbmNsdWRlICJsb2JqZWN0LmgiCisjaW5jbHVkZSAibHRtLmgiCisKKworI2RlZmluZSB0b3N0cmluZyhMLG8pICh0dGlzc3RyaW5nKG8pIHx8IChsdWFWX3Rvc3RyaW5nKEwsIG8pKSkKKworI2RlZmluZSB0b251bWJlcihvLG4pCSh0dGlzbnVtYmVyKG8pIHx8ICgoKG8pID0gbHVhVl90b251bWJlcihvLG4pKSAhPSBOVUxMKSkKKworI2RlZmluZSBlcXVhbG9iaihMLG8xLG8yKSAgKHR0aXNlcXVhbChvMSwgbzIpICYmIGx1YVZfZXF1YWxvYmpfKEwsIG8xLCBvMikpCisKKyNkZWZpbmUgbHVhVl9yYXdlcXVhbG9iaihvMSxvMikJCWVxdWFsb2JqKE5VTEwsbzEsbzIpCisKKworLyogbm90IHRvIGNhbGxlZCBkaXJlY3RseSAqLworTFVBSV9GVU5DIGludCBsdWFWX2VxdWFsb2JqXyAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKnQxLCBjb25zdCBUVmFsdWUgKnQyKTsKKworCitMVUFJX0ZVTkMgaW50IGx1YVZfbGVzc3RoYW4gKGx1YV9TdGF0ZSAqTCwgY29uc3QgVFZhbHVlICpsLCBjb25zdCBUVmFsdWUgKnIpOworTFVBSV9GVU5DIGludCBsdWFWX2xlc3NlcXVhbCAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKmwsIGNvbnN0IFRWYWx1ZSAqcik7CitMVUFJX0ZVTkMgY29uc3QgVFZhbHVlICpsdWFWX3RvbnVtYmVyIChjb25zdCBUVmFsdWUgKm9iaiwgVFZhbHVlICpuKTsKK0xVQUlfRlVOQyBpbnQgbHVhVl90b3N0cmluZyAobHVhX1N0YXRlICpMLCBTdGtJZCBvYmopOworTFVBSV9GVU5DIHZvaWQgbHVhVl9nZXR0YWJsZSAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKnQsIFRWYWx1ZSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGtJZCB2YWwpOworTFVBSV9GVU5DIHZvaWQgbHVhVl9zZXR0YWJsZSAobHVhX1N0YXRlICpMLCBjb25zdCBUVmFsdWUgKnQsIFRWYWx1ZSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGtJZCB2YWwpOworTFVBSV9GVU5DIHZvaWQgbHVhVl9maW5pc2hPcCAobHVhX1N0YXRlICpMKTsKK0xVQUlfRlVOQyB2b2lkIGx1YVZfZXhlY3V0ZSAobHVhX1N0YXRlICpMKTsKK0xVQUlfRlVOQyB2b2lkIGx1YVZfY29uY2F0IChsdWFfU3RhdGUgKkwsIGludCB0b3RhbCk7CitMVUFJX0ZVTkMgdm9pZCBsdWFWX2FyaXRoIChsdWFfU3RhdGUgKkwsIFN0a0lkIHJhLCBjb25zdCBUVmFsdWUgKnJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFZhbHVlICpyYywgVE1TIG9wKTsKK0xVQUlfRlVOQyB2b2lkIGx1YVZfb2JqbGVuIChsdWFfU3RhdGUgKkwsIFN0a0lkIHJhLCBjb25zdCBUVmFsdWUgKnJiKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2x6aW8uYyBiL2NvbTMyL2x1YS9zcmMvbHppby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWZlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2x6aW8uYwpAQCAtMCwwICsxLDc2IEBACisvKgorKiogJElkOiBsemlvLmMsdiAxLjM1LjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIEJ1ZmZlcmVkIHN0cmVhbXMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBsemlvX2MKKyNkZWZpbmUgTFVBX0NPUkUKKworI2luY2x1ZGUgImx1YS5oIgorCisjaW5jbHVkZSAibGxpbWl0cy5oIgorI2luY2x1ZGUgImxtZW0uaCIKKyNpbmNsdWRlICJsc3RhdGUuaCIKKyNpbmNsdWRlICJsemlvLmgiCisKKworaW50IGx1YVpfZmlsbCAoWklPICp6KSB7CisgIHNpemVfdCBzaXplOworICBsdWFfU3RhdGUgKkwgPSB6LT5MOworICBjb25zdCBjaGFyICpidWZmOworICBsdWFfdW5sb2NrKEwpOworICBidWZmID0gei0+cmVhZGVyKEwsIHotPmRhdGEsICZzaXplKTsKKyAgbHVhX2xvY2soTCk7CisgIGlmIChidWZmID09IE5VTEwgfHwgc2l6ZSA9PSAwKQorICAgIHJldHVybiBFT1o7CisgIHotPm4gPSBzaXplIC0gMTsgIC8qIGRpc2NvdW50IGNoYXIgYmVpbmcgcmV0dXJuZWQgKi8KKyAgei0+cCA9IGJ1ZmY7CisgIHJldHVybiBjYXN0X3VjaGFyKCooei0+cCsrKSk7Cit9CisKKwordm9pZCBsdWFaX2luaXQgKGx1YV9TdGF0ZSAqTCwgWklPICp6LCBsdWFfUmVhZGVyIHJlYWRlciwgdm9pZCAqZGF0YSkgeworICB6LT5MID0gTDsKKyAgei0+cmVhZGVyID0gcmVhZGVyOworICB6LT5kYXRhID0gZGF0YTsKKyAgei0+biA9IDA7CisgIHotPnAgPSBOVUxMOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWFkIC0tLSAqLworc2l6ZV90IGx1YVpfcmVhZCAoWklPICp6LCB2b2lkICpiLCBzaXplX3QgbikgeworICB3aGlsZSAobikgeworICAgIHNpemVfdCBtOworICAgIGlmICh6LT5uID09IDApIHsgIC8qIG5vIGJ5dGVzIGluIGJ1ZmZlcj8gKi8KKyAgICAgIGlmIChsdWFaX2ZpbGwoeikgPT0gRU9aKSAgLyogdHJ5IHRvIHJlYWQgbW9yZSAqLworICAgICAgICByZXR1cm4gbjsgIC8qIG5vIG1vcmUgaW5wdXQ7IHJldHVybiBudW1iZXIgb2YgbWlzc2luZyBieXRlcyAqLworICAgICAgZWxzZSB7CisgICAgICAgIHotPm4rKzsgIC8qIGx1YVpfZmlsbCBjb25zdW1lZCBmaXJzdCBieXRlOyBwdXQgaXQgYmFjayAqLworICAgICAgICB6LT5wLS07CisgICAgICB9CisgICAgfQorICAgIG0gPSAobiA8PSB6LT5uKSA/IG4gOiB6LT5uOyAgLyogbWluLiBiZXR3ZWVuIG4gYW5kIHotPm4gKi8KKyAgICBtZW1jcHkoYiwgei0+cCwgbSk7CisgICAgei0+biAtPSBtOworICAgIHotPnAgKz0gbTsKKyAgICBiID0gKGNoYXIgKiliICsgbTsKKyAgICBuIC09IG07CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworY2hhciAqbHVhWl9vcGVuc3BhY2UgKGx1YV9TdGF0ZSAqTCwgTWJ1ZmZlciAqYnVmZiwgc2l6ZV90IG4pIHsKKyAgaWYgKG4gPiBidWZmLT5idWZmc2l6ZSkgeworICAgIGlmIChuIDwgTFVBX01JTkJVRkZFUikgbiA9IExVQV9NSU5CVUZGRVI7CisgICAgbHVhWl9yZXNpemVidWZmZXIoTCwgYnVmZiwgbik7CisgIH0KKyAgcmV0dXJuIGJ1ZmYtPmJ1ZmZlcjsKK30KKworCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL2x6aW8uaCBiL2NvbTMyL2x1YS9zcmMvbHppby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MWY3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL2x6aW8uaApAQCAtMCwwICsxLDY1IEBACisvKgorKiogJElkOiBsemlvLmgsdiAxLjI2LjEuMSAyMDEzLzA0LzEyIDE4OjQ4OjQ3IHJvYmVydG8gRXhwICQKKyoqIEJ1ZmZlcmVkIHN0cmVhbXMKKyoqIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGx1YS5oCisqLworCisKKyNpZm5kZWYgbHppb19oCisjZGVmaW5lIGx6aW9faAorCisjaW5jbHVkZSAibHVhLmgiCisKKyNpbmNsdWRlICJsbWVtLmgiCisKKworI2RlZmluZSBFT1oJKC0xKQkJCS8qIGVuZCBvZiBzdHJlYW0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgWmlvIFpJTzsKKworI2RlZmluZSB6Z2V0Yyh6KSAgKCgoeiktPm4tLSk+MCA/ICBjYXN0X3VjaGFyKCooeiktPnArKykgOiBsdWFaX2ZpbGwoeikpCisKKwordHlwZWRlZiBzdHJ1Y3QgTWJ1ZmZlciB7CisgIGNoYXIgKmJ1ZmZlcjsKKyAgc2l6ZV90IG47CisgIHNpemVfdCBidWZmc2l6ZTsKK30gTWJ1ZmZlcjsKKworI2RlZmluZSBsdWFaX2luaXRidWZmZXIoTCwgYnVmZikgKChidWZmKS0+YnVmZmVyID0gTlVMTCwgKGJ1ZmYpLT5idWZmc2l6ZSA9IDApCisKKyNkZWZpbmUgbHVhWl9idWZmZXIoYnVmZikJKChidWZmKS0+YnVmZmVyKQorI2RlZmluZSBsdWFaX3NpemVidWZmZXIoYnVmZikJKChidWZmKS0+YnVmZnNpemUpCisjZGVmaW5lIGx1YVpfYnVmZmxlbihidWZmKQkoKGJ1ZmYpLT5uKQorCisjZGVmaW5lIGx1YVpfcmVzZXRidWZmZXIoYnVmZikgKChidWZmKS0+biA9IDApCisKKworI2RlZmluZSBsdWFaX3Jlc2l6ZWJ1ZmZlcihMLCBidWZmLCBzaXplKSBcCisJKGx1YU1fcmVhbGxvY3ZlY3RvcihMLCAoYnVmZiktPmJ1ZmZlciwgKGJ1ZmYpLT5idWZmc2l6ZSwgc2l6ZSwgY2hhciksIFwKKwkoYnVmZiktPmJ1ZmZzaXplID0gc2l6ZSkKKworI2RlZmluZSBsdWFaX2ZyZWVidWZmZXIoTCwgYnVmZikJbHVhWl9yZXNpemVidWZmZXIoTCwgYnVmZiwgMCkKKworCitMVUFJX0ZVTkMgY2hhciAqbHVhWl9vcGVuc3BhY2UgKGx1YV9TdGF0ZSAqTCwgTWJ1ZmZlciAqYnVmZiwgc2l6ZV90IG4pOworTFVBSV9GVU5DIHZvaWQgbHVhWl9pbml0IChsdWFfU3RhdGUgKkwsIFpJTyAqeiwgbHVhX1JlYWRlciByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CitMVUFJX0ZVTkMgc2l6ZV90IGx1YVpfcmVhZCAoWklPKiB6LCB2b2lkKiBiLCBzaXplX3Qgbik7CS8qIHJlYWQgbmV4dCBuIGJ5dGVzICovCisKKworCisvKiAtLS0tLS0tLS0gUHJpdmF0ZSBQYXJ0IC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgWmlvIHsKKyAgc2l6ZV90IG47CQkJLyogYnl0ZXMgc3RpbGwgdW5yZWFkICovCisgIGNvbnN0IGNoYXIgKnA7CQkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZmZlciAqLworICBsdWFfUmVhZGVyIHJlYWRlcjsJCS8qIHJlYWRlciBmdW5jdGlvbiAqLworICB2b2lkKiBkYXRhOwkJCS8qIGFkZGl0aW9uYWwgZGF0YSAqLworICBsdWFfU3RhdGUgKkw7CQkJLyogTHVhIHN0YXRlIChmb3IgcmVhZGVyKSAqLworfTsKKworCitMVUFJX0ZVTkMgaW50IGx1YVpfZmlsbCAoWklPICp6KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb20zMi9sdWEvc3JjL3BjaS5jIGIvY29tMzIvbHVhL3NyYy9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQwMjBmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy9wY2kuYwpAQCAtMCwwICsxLDE3NSBAQAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjZGVmaW5lIGxwY2lsaWJfYyAgICAgICAvKiBEZWZpbmUgdGhlIGxpYnJhcnkgKi8KKworI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKyNpbmNsdWRlICJsdWFsaWIuaCIKKyNpbmNsdWRlIDxzeXMvcGNpLmg+CisKKy8qIHJlbW92aW5nIGFueSBcbiBmb3VuZCBpbiBhIHN0cmluZyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2VvbChjaGFyICpzdHJpbmcpCit7CisgICAgaW50IGogPSBzdHJsZW4oc3RyaW5nKTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykKKyAgICAgICAgaWYgKHN0cmluZ1tpXSA9PSAnXG4nKQorICAgICAgICAgICAgc3RyaW5nW2ldID0gMDsKK30KKworc3RhdGljIGludCBwY2lfZ2V0aW5mbyhsdWFfU3RhdGUgKkwpCit7CisgIHN0cnVjdCBwY2lfZG9tYWluICpwY2lfZG9tYWluOworICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpX2RldmljZTsKKyAgaW50IHBjaV9kZXYgPSAxOworCisgIHBjaV9kb21haW4gPSBwY2lfc2NhbigpOworCisgIGx1YV9uZXd0YWJsZShMKTsJLyogbGlzdCBvZiBidXNzZXMgKi8KKworICBmb3JfZWFjaF9wY2lfZnVuYyhwY2lfZGV2aWNlLCBwY2lfZG9tYWluKSB7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgcGNpX2RldisrKTsKKworICAgIGx1YV9uZXd0YWJsZShMKTsgLyogZGV2aWNlIGluZm9zICovCisKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiYnVzIik7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgX19wY2lfYnVzKTsKKyAgICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAic2xvdCIpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIF9fcGNpX3Nsb3QpOworICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKworICAgIGx1YV9wdXNoc3RyaW5nKEwsICJmdW5jIik7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgX19wY2lfZnVuYyk7CisgICAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgInZlbmRvciIpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIHBjaV9kZXZpY2UtPnZlbmRvcik7CisgICAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgInByb2R1Y3QiKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCBwY2lfZGV2aWNlLT5wcm9kdWN0KTsKKyAgICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAic3ViX3ZlbmRvciIpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIHBjaV9kZXZpY2UtPnN1Yl92ZW5kb3IpOworICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKworICAgIGx1YV9wdXNoc3RyaW5nKEwsICJzdWJfcHJvZHVjdCIpOworICAgIGx1YV9wdXNobnVtYmVyKEwsIHBjaV9kZXZpY2UtPnN1Yl9wcm9kdWN0KTsKKyAgICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgICBsdWFfc2V0dGFibGUoTCwtMyk7IC8qIGVuZCBkZXZpY2UgaW5mb3MgKi8KKyAgfQorCisgIHJldHVybiAxOworfQorCisvKiBUcnkgdG8gbWF0Y2ggYW55IHBjaSBkZXZpY2UgdG8gdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBtb2R1bGUgKi8KKy8qIGl0IHVzZXMgdGhlIG1vZHVsZXMucGNpbWFwIGZyb20gdGhlIGJvb3QgZGV2aWNlKi8KK3N0YXRpYyBpbnQgcGNpX2dldGlkbGlzdChsdWFfU3RhdGUgKkwpCit7CisgIGNvbnN0IGNoYXIgKnBjaWlkZmlsZTsKKyAgY2hhciBsaW5lWzEwMjRdOworICBjaGFyIHZlbmRvclsyNTVdOworICBjaGFyIHZlbmRvcl9pZFs1XTsKKyAgY2hhciBwcm9kdWN0WzI1NV07CisgIGNoYXIgcHJvZHVjdHZlbmRvcls5XTsKKyAgY2hhciBwcm9kdWN0dmVuZG9yc3ViWzE3XTsKKyAgRklMRSAqZjsKKworICBpZiAobHVhX2dldHRvcChMKSA9PSAxKSB7CisgICAgcGNpaWRmaWxlID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBwY2lpZGZpbGUgPSAicGNpLmlkcyI7CisgIH0KKworICBsdWFfbmV3dGFibGUoTCk7CS8qIGxpc3Qgb2YgdmVuZG9ycyAqLworCisgIC8qIE9wZW5pbmcgdGhlIHBjaS5pZHMgZnJvbSB0aGUgYm9vdCBkZXZpY2UqLworICBmPWZvcGVuKHBjaWlkZmlsZSwiciIpOworICBpZiAoIWYpCisgICAgICAgIHJldHVybiAtMTsKKworICAvKiBmb3IgZWFjaCBsaW5lIHdlIGZvdW5kIGluIHRoZSBwY2kuaWRzKi8KKyAgd2hpbGUgKCBmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikgKSB7CisgICAgLyogU2tpcHBpbmcgdW5jZXNzYXJ5IGxpbmVzICovCisgICAgaWYgKChsaW5lWzBdID09ICcjJykgfHwgKGxpbmVbMF0gPT0gJyAnKSB8fCAobGluZVswXSA9PSAnQycpIHx8CisJKGxpbmVbMF0gPT0gMTApKQorICAgICAgICBjb250aW51ZTsKKworICAgIC8qIElmIHRoZSBsaW5lIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHRhYiwgaXQgbWVhbnMgdGhhdCdzIGEgdmVuZG9yIGlkICovCisgICAgaWYgKGxpbmVbMF0gIT0gJ1x0JykgeworCisJLyogdGhlIDR0aCBmaXJzdCBjaGFycyBhcmUgdGhlIHZlbmRvcl9pZCAqLworICAgICAgICBzdHJsY3B5KHZlbmRvcl9pZCxsaW5lLDQpOworCisJLyogdGhlIHZlbmRvciBuYW1lIGlzIHRoZSBuZXh0IGZpZWxkKi8KKyAgICAgICAgdmVuZG9yX2lkWzRdPTA7CisgICAgICAgIHN0cmxjcHkodmVuZG9yLHNraXBzcGFjZShzdHJzdHIobGluZSwiICIpKSwyNTUpOworICAgICAgICByZW1vdmVfZW9sKHZlbmRvcik7CisKKwkvKiBmZmZmIGlzIGFuIGludmFsaWQgdmVuZG9yIGlkICovCisJaWYgKHN0cnN0cih2ZW5kb3JfaWQsImZmZmYiKSkgYnJlYWs7CisKKwlsdWFfcHVzaHN0cmluZyhMLCB2ZW5kb3JfaWQpOworCWx1YV9wdXNoc3RyaW5nKEwsIHZlbmRvcik7CisJbHVhX3NldHRhYmxlKEwsLTMpOworCisgICAgLyogaWYgd2UgaGF2ZSBhIHRhYiArIGEgY2hhciwgaXQgbWVhbnMgdGhpcyBpcyBhIHByb2R1Y3QgaWQgKi8KKyAgICB9IGVsc2UgaWYgKChsaW5lWzBdID09ICdcdCcpICYmIChsaW5lWzFdICE9ICdcdCcpKSB7CisKKwkvKiB0aGUgcHJvZHVjdCBuYW1lIHRoZSBzZWNvbmQgZmllbGQgKi8KKyAgICAgICAgc3RybGNweShwcm9kdWN0LHNraXBzcGFjZShzdHJzdHIobGluZSwiICIpKSwyNTUpOworICAgICAgICByZW1vdmVfZW9sKHByb2R1Y3QpOworCisJLyogdGhlIDR0aCBmaXJzdCBjaGFycyBhcmUgdGhlIHZlbmRvcl9pZCAqLworCXN0cmxjcHkocHJvZHVjdHZlbmRvcix2ZW5kb3JfaWQsNCk7CisJLyogdGhlIHByb2R1Y3QgaWQgaXMgZmlyc3QgZmllbGQgKi8KKwlzdHJsY3B5KHByb2R1Y3R2ZW5kb3IrNCwmbGluZVsxXSw0KTsKKyAgICAgICAgcHJvZHVjdHZlbmRvcls4XT0wOworCisJbHVhX3B1c2hzdHJpbmcoTCwgcHJvZHVjdHZlbmRvcik7CisJbHVhX3B1c2hzdHJpbmcoTCwgcHJvZHVjdCk7CisJbHVhX3NldHRhYmxlKEwsLTMpOworCisgICAgLyogaWYgd2UgaGF2ZSB0d28gdGFicywgaXQgbWVhbnMgdGhpcyBpcyBhIHN1YiBwcm9kdWN0ICovCisgICAgfSBlbHNlIGlmICgobGluZVswXSA9PSAnXHQnKSAmJiAobGluZVsxXSA9PSAnXHQnKSkgeworCisgICAgICAvKiB0aGUgcHJvZHVjdCBuYW1lIGlzIGxhc3QgZmllbGQgKi8KKyAgICAgIHN0cmxjcHkocHJvZHVjdCxza2lwc3BhY2Uoc3Ryc3RyKGxpbmUsIiAiKSksMjU1KTsKKyAgICAgIHN0cmxjcHkocHJvZHVjdCxza2lwc3BhY2Uoc3Ryc3RyKHByb2R1Y3QsIiAiKSksMjU1KTsKKyAgICAgIHJlbW92ZV9lb2wocHJvZHVjdCk7CisKKyAgICAgIHN0cmxjcHkocHJvZHVjdHZlbmRvcnN1YiwgcHJvZHVjdHZlbmRvciw4KTsKKyAgICAgIHN0cmxjcHkocHJvZHVjdHZlbmRvcnN1Yis4LCAmbGluZVsyXSw0KTsKKyAgICAgIHN0cmxjcHkocHJvZHVjdHZlbmRvcnN1YisxMiwgJmxpbmVbN10sNCk7CisgICAgICBwcm9kdWN0dmVuZG9yc3ViWzE2XT0wOworCisgICAgICBsdWFfcHVzaHN0cmluZyhMLCBwcm9kdWN0dmVuZG9yc3ViKTsKKyAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIHByb2R1Y3QpOworICAgICAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgICAgfQorICB9CisgIGZjbG9zZShmKTsKKyAgcmV0dXJuKDEpOworfQorCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgcGNpbGliW10gPSB7CisgIHsiZ2V0aW5mbyIsIHBjaV9nZXRpbmZvfSwKKyAgeyJnZXRpZGxpc3QiLCBwY2lfZ2V0aWRsaXN0fSwKKyAge05VTEwsIE5VTEx9Cit9OworCisvKiBUaGlzIGRlZmluZXMgYSBmdW5jdGlvbiB0aGF0IG9wZW5zIHVwIHlvdXIgbGlicmFyeS4gKi8KKworTFVBTElCX0FQSSBpbnQgbHVhb3Blbl9wY2kgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld2xpYihMLCBwY2lsaWIpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy9zeXNsaW51eC5jIGIvY29tMzIvbHVhL3NyYy9zeXNsaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNzAyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvc3JjL3N5c2xpbnV4LmMKQEAgLTAsMCArMSw1MjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxnZXRrZXkuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9ib290Lmg+CisKKyNkZWZpbmUgbG5ldGxpYl9jCQkvKiBEZWZpbmUgdGhlIGxpYnJhcnkgKi8KKworI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKyNpbmNsdWRlICJsdWFsaWIuaCIKKyNpbmNsdWRlICJzeXNsaW51eC9ib290LmgiCisjaW5jbHVkZSAic3lzbGludXgvbG9hZGZpbGUuaCIKKyNpbmNsdWRlICJzeXNsaW51eC9saW51eC5oIgorI2luY2x1ZGUgInN5c2xpbnV4L2NvbmZpZy5oIgorI2luY2x1ZGUgInN5c2xpbnV4L3JlYm9vdC5oIgorCitpbnQgX19wYXJzZV9hcmd2KGNoYXIgKioqYXJndiwgY29uc3QgY2hhciAqc3RyKTsKKworI2RlZmluZSBTWVNMSU5VWF9GSUxFICJzeXNsaW51eF9maWxlIgorCit0eXBlZGVmIHN0cnVjdCBzeXNsaW51eF9maWxlIHsKKyAgICBjaGFyICpkYXRhOworICAgIGNoYXIgKm5hbWU7CisgICAgc2l6ZV90IHNpemU7Cit9IHN5c2xpbnV4X2ZpbGU7CisKKy8qCisgKiBNb3N0IGNvZGUgdGFrZW4gZnJvbToKKyAqCWNvbTMyL21vZHVsZXMvbGludXguYworICovCisKKy8qIEZpbmQgdGhlIGxhc3QgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgbGluZSBhcmd1bWVudAorICAgKHdoaWNoIHNob3VsZCBpbmNsdWRlIHRoZSBmaW5hbCA9OyBkbyBub3QgdXNlIGZvciBib29sZWFuIGFyZ3VtZW50cykgKi8KK3N0YXRpYyBjaGFyICpmaW5kX2FyZ3VtZW50KGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICphcmd1bWVudCkKK3sKKyAgICBpbnQgbGEgPSBzdHJsZW4oYXJndW1lbnQpOworICAgIGNoYXIgKiphcmc7CisgICAgY2hhciAqcHRyID0gTlVMTDsKKworICAgIGZvciAoYXJnID0gYXJndjsgKmFyZzsgYXJnKyspIHsKKwlpZiAoIW1lbWNtcCgqYXJnLCBhcmd1bWVudCwgbGEpKQorCSAgICBwdHIgPSAqYXJnICsgbGE7CisgICAgfQorCisgICAgcmV0dXJuIHB0cjsKK30KKworLyogR2V0IGEgdmFsdWUgd2l0aCBhIHBvdGVudGlhbCBzdWZmaXggKGsvbS9nL3QvcC9lKSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzdWZmaXhfbnVtYmVyKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjaGFyICplcDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdjsKKyAgICBpbnQgc2hpZnQ7CisKKyAgICB2ID0gc3RydG91bGwoc3RyLCAmZXAsIDApOworICAgIHN3aXRjaCAoKmVwIHwgMHgyMCkgeworICAgIGNhc2UgJ2snOgorCXNoaWZ0ID0gMTA7CisJYnJlYWs7CisgICAgY2FzZSAnbSc6CisJc2hpZnQgPSAyMDsKKwlicmVhazsKKyAgICBjYXNlICdnJzoKKwlzaGlmdCA9IDMwOworCWJyZWFrOworICAgIGNhc2UgJ3QnOgorCXNoaWZ0ID0gNDA7CisJYnJlYWs7CisgICAgY2FzZSAncCc6CisJc2hpZnQgPSA1MDsKKwlicmVhazsKKyAgICBjYXNlICdlJzoKKwlzaGlmdCA9IDYwOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJc2hpZnQgPSAwOworCWJyZWFrOworICAgIH0KKyAgICB2IDw8PSBzaGlmdDsKKworICAgIHJldHVybiB2OworfQorCisvKiBUcnVuY2F0ZSB0byAzMiBiaXRzLCB3aXRoIHNhdHVyYXRlICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHNhdHVyYXRlMzIodW5zaWduZWQgbG9uZyBsb25nIHYpCit7CisgICAgcmV0dXJuICh2ID4gMHhmZmZmZmZmZikgPyAweGZmZmZmZmZmIDogKHVpbnQzMl90KSB2OworfQorCisvKiBTdGl0Y2ggdG9nZXRoZXIgdGhlIGNvbW1hbmQgbGluZSBmcm9tIGEgc2V0IG9mIGFyZ3YncyAqLworc3RhdGljIGNoYXIgKm1ha2VfY21kbGluZShjaGFyICoqYXJndikKK3sKKyAgICBjaGFyICoqYXJnOworICAgIHNpemVfdCBieXRlczsKKyAgICBjaGFyICpjbWRsaW5lLCAqcDsKKworICAgIGJ5dGVzID0gMTsJCQkvKiBKdXN0IGluIGNhc2Ugd2UgaGF2ZSBhIHplcm8tZW50cnkgY21kbGluZSAqLworICAgIGZvciAoYXJnID0gYXJndjsgKmFyZzsgYXJnKyspIHsKKwlieXRlcyArPSBzdHJsZW4oKmFyZykgKyAxOworICAgIH0KKworICAgIHAgPSBjbWRsaW5lID0gbWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAoIWNtZGxpbmUpCisJcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGFyZyA9IGFyZ3Y7ICphcmc7IGFyZysrKSB7CisJaW50IGxlbiA9IHN0cmxlbigqYXJnKTsKKwltZW1jcHkocCwgKmFyZywgbGVuKTsKKwlwW2xlbl0gPSAnICc7CisJcCArPSBsZW4gKyAxOworICAgIH0KKworICAgIGlmIChwID4gY21kbGluZSkKKwlwLS07CQkJLyogUmVtb3ZlIHRoZSBsYXN0IHNwYWNlICovCisgICAgKnAgPSAnXDAnOworCisgICAgcmV0dXJuIGNtZGxpbmU7Cit9CisKK3N0YXRpYyBpbnQgc2xfcnVuX2NvbW1hbmQobHVhX1N0YXRlICogTCkKK3sKKyAgICBjb25zdCBjaGFyICpjbWQgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOwkvKiBSZWFkcyB0aGUgc3RyaW5nIHBhcmFtZXRlciAqLworICAgIHN5c2xpbnV4X3J1bl9jb21tYW5kKGNtZCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGRvIGRlZmF1bHQgYm9vdCAqLworc3RhdGljIGludCBzbF9ydW5fZGVmYXVsdChsdWFfU3RhdGUgKiBMKQoreworICAgIC8qIFByZXZlbnRpbmcgR0NDIHRvIGNvbXBsYWluIGFnYWluc3QgdW51c2VkIEwgKi8KKyAgICBMPUw7CisgICAgc3lzbGludXhfcnVuX2RlZmF1bHQoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogZG8gbG9jYWwgYm9vdCAqLworc3RhdGljIGludCBzbF9sb2NhbF9ib290KGx1YV9TdGF0ZSAqIEwpCit7CisgICAgdWludDE2X3QgZmxhZ3MgPSBsdWFMX2NoZWNraW50KEwsIDEpOworICAgIHN5c2xpbnV4X2xvY2FsX2Jvb3QoZmxhZ3MpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsX2ZpbmFsX2NsZWFudXAobHVhX1N0YXRlICogTCkKK3sKKyAgICB1aW50MTZfdCBmbGFncyA9IGx1YUxfY2hlY2tpbnQoTCwgMSk7CisgICAgc3lzbGludXhfbG9jYWxfYm9vdChmbGFncyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGJvb3QgbGludXgga2VybmVsIGFuZCBpbml0cmQgKi8KK3N0YXRpYyBpbnQgc2xfYm9vdF9saW51eChsdWFfU3RhdGUgKiBMKQoreworICAgIGNvbnN0IGNoYXIgKmtlcm5lbCA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgICAgY29uc3QgY2hhciAqY21kbGluZSA9IGx1YUxfb3B0c3RyaW5nKEwsIDIsICIiKTsKKyAgICBjaGFyICppbml0cmQ7CisgICAgdm9pZCAqa2VybmVsX2RhdGEsICpmaWxlX2RhdGE7CisgICAgc2l6ZV90IGtlcm5lbF9sZW4sIGZpbGVfbGVuOworICAgIHN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mczsKKyAgICBjaGFyICpuZXdjbWRsaW5lOworICAgIHVpbnQzMl90IG1lbV9saW1pdCA9IGx1YUxfb3B0aW50KEwsIDMsIDApOworICAgIHVpbnQxNl90IHZpZGVvX21vZGUgPSBsdWFMX29wdGludChMLCA0LCAwKTsKKyAgICBpbnQgcmV0OworICAgIGNoYXIgKiphcmd2LCAqKmFyZ3AsICphcmcsICpwOworCisgICAgKHZvaWQpbWVtX2xpbWl0OworICAgICh2b2lkKXZpZGVvX21vZGU7CisKKyAgICByZXQgPSBfX3BhcnNlX2FyZ3YoJmFyZ3YsIGNtZGxpbmUpOworCisgICAgbmV3Y21kbGluZSA9IG1hbGxvYyhzdHJsZW4oa2VybmVsKSArIDEyKTsKKyAgICBpZiAoIW5ld2NtZGxpbmUpCisJcHJpbnRmKCJNZW0gYWxsb2MgZmFpbGVkOiBjbWRsaW5lXG4iKTsKKworICAgIHN0cmNweShuZXdjbWRsaW5lLCAiQk9PVF9JTUFHRT0iKTsKKyAgICBzdHJjcHkobmV3Y21kbGluZSArIHN0cmxlbihuZXdjbWRsaW5lKSwga2VybmVsKTsKKyAgICBhcmd2WzBdID0gbmV3Y21kbGluZTsKKyAgICBhcmdwID0gYXJndjsKKworICAgIC8qIERFQlVHCisgICAgICAgZm9yIChpPTA7IGk8cmV0OyBpKyspCisgICAgICAgcHJpbnRmKCIlZDogJXNcbiIsIGksIGFyZ3ZbaV0pOworICAgICAqLworCisgICAgbmV3Y21kbGluZSA9IG1ha2VfY21kbGluZShhcmdwKTsKKyAgICBpZiAoIW5ld2NtZGxpbmUpCisJcHJpbnRmKCJDcmVhdGluZyBjb21tYW5kIGxpbmUgZmFpbGVkIVxuIik7CisKKyAgICAvKiBERUJVRworICAgICAgIHByaW50ZigiQ29tbWFuZCBsaW5lOiAlc1xuIiwgbmV3Y21kbGluZSk7CisgICAgICAgbXNsZWVwKDEwMDApOworICAgICAqLworCisgICAgcHJpbnRmKCJMb2FkaW5nIGtlcm5lbCAlcy4uLlxuIiwga2VybmVsKTsKKyAgICBpZiAobG9hZGZpbGUoa2VybmVsLCAma2VybmVsX2RhdGEsICZrZXJuZWxfbGVuKSkKKwlwcmludGYoImZhaWxlZCFcbiIpOworICAgIGVsc2UKKwlwcmludGYoIm9rXG4iKTsKKworICAgIGluaXRyYW1mcyA9IGluaXRyYW1mc19pbml0KCk7CisgICAgaWYgKCFpbml0cmFtZnMpCisJcHJpbnRmKCJJbml0aWFsaXppbmcgaW5pdHJkIGZhaWxlZCFcbiIpOworCisgICAgaWYgKChhcmcgPSBmaW5kX2FyZ3VtZW50KGFyZ3AsICJpbml0cmQ9IikpKSB7CisJZG8geworCSAgICBwID0gc3RyY2hyKGFyZywgJywnKTsKKwkgICAgaWYgKHApCisJCSpwID0gJ1wwJzsKKworCSAgICBpbml0cmQgPSBhcmc7CisJICAgIHByaW50ZigiTG9hZGluZyBpbml0cmQgJXMuLi4gIiwgaW5pdHJkKTsKKwkgICAgaWYgKGluaXRyYW1mc19sb2FkX2FyY2hpdmUoaW5pdHJhbWZzLCBpbml0cmQpKSB7CisJCXByaW50ZigiZmFpbGVkIVxuIik7CisJICAgIH0KKwkgICAgcHJpbnRmKCJva1xuIik7CisKKwkgICAgaWYgKHApCisJCSpwKysgPSAnLCc7CisJfSB3aGlsZSAoKGFyZyA9IHApKTsKKyAgICB9CisKKyAgICByZXQgPSBzeXNsaW51eF9ib290X2xpbnV4KGtlcm5lbF9kYXRhLCBrZXJuZWxfbGVuLCBpbml0cmFtZnMsIE5VTEwsIG5ld2NtZGxpbmUpOworCisgICAgcHJpbnRmKCJzeXNsaW51eF9ib290X2xpbnV4IHJldHVybmVkICVkXG4iLCByZXQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHNsZWVwIGZvciBzZWMgc2Vjb25kcyAqLworc3RhdGljIGludCBzbF9zbGVlcChsdWFfU3RhdGUgKiBMKQoreworICAgIHVuc2lnbmVkIGludCBzZWMgPSBsdWFMX2NoZWNraW50KEwsIDEpOworICAgIHNsZWVwKHNlYyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHNsZWVwIGZvciBtc2VjIG1pbGxpc2Vjb25kcyAqLworc3RhdGljIGludCBzbF9tc2xlZXAobHVhX1N0YXRlICogTCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbXNlYyA9IGx1YUxfY2hlY2tpbnQoTCwgMSk7CisgICAgbXNsZWVwKG1zZWMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsX3J1bl9rZXJuZWxfaW1hZ2UobHVhX1N0YXRlICogTCkKK3sKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgICAgY29uc3QgY2hhciAqY21kbGluZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMik7CisgICAgdWludDMyX3QgaXBhcHBlbmRfZmxhZ3MgPSBsdWFMX2NoZWNraW50KEwsIDMpOworICAgIHVpbnQzMl90IHR5cGUgPSBsdWFMX2NoZWNraW50KEwsIDQpOworCisgICAgc3lzbGludXhfcnVuX2tlcm5lbF9pbWFnZShmaWxlbmFtZSwgY21kbGluZSwgaXBhcHBlbmRfZmxhZ3MsIHR5cGUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsX2xvYWRmaWxlKGx1YV9TdGF0ZSAqIEwpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICAgIHN5c2xpbnV4X2ZpbGUgKmZpbGU7CisKKyAgICB2b2lkICpmaWxlX2RhdGE7CisgICAgc2l6ZV90IGZpbGVfbGVuOworCisgICAgaWYgKGxvYWRmaWxlKGZpbGVuYW1lLCAmZmlsZV9kYXRhLCAmZmlsZV9sZW4pKSB7CisJbHVhX3B1c2hzdHJpbmcoTCwgIkNvdWxkIG5vdCBsb2FkIGZpbGUiKTsKKwlsdWFfZXJyb3IoTCk7CisgICAgfQorCisgICAgZmlsZSA9IG1hbGxvYyhzaXplb2Yoc3lzbGludXhfZmlsZSkpOworICAgIHN0cmxjcHkoZmlsZS0+bmFtZSxmaWxlbmFtZSxzaXplb2Yoc3lzbGludXhfZmlsZSkpOworICAgIGZpbGUtPnNpemUgPSBmaWxlX2xlbjsKKyAgICBmaWxlLT5kYXRhID0gZmlsZV9kYXRhOworCisgICAgbHVhX3B1c2hsaWdodHVzZXJkYXRhKEwsIGZpbGUpOworICAgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIFNZU0xJTlVYX0ZJTEUpOworICAgIGx1YV9zZXRtZXRhdGFibGUoTCwgLTIpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2xfZmlsZXNpemUobHVhX1N0YXRlICogTCkKK3sKKyAgICBjb25zdCBzeXNsaW51eF9maWxlICpmaWxlID0gbHVhTF9jaGVja3VkYXRhKEwsIDEsIFNZU0xJTlVYX0ZJTEUpOworCisgICAgbHVhX3B1c2hpbnRlZ2VyKEwsIGZpbGUtPnNpemUpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2xfZmlsZW5hbWUobHVhX1N0YXRlICogTCkKK3sKKyAgICBjb25zdCBzeXNsaW51eF9maWxlICpmaWxlID0gbHVhTF9jaGVja3VkYXRhKEwsIDEsIFNZU0xJTlVYX0ZJTEUpOworCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgZmlsZS0+bmFtZSk7CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzbF9pbml0cmFtZnNfaW5pdChsdWFfU3RhdGUgKiBMKQoreworICAgIHN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mczsKKworICAgIGluaXRyYW1mcyA9IGluaXRyYW1mc19pbml0KCk7CisgICAgaWYgKCFpbml0cmFtZnMpCisJcHJpbnRmKCJJbml0aWFsaXppbmcgaW5pdHJkIGZhaWxlZCFcbiIpOworCisgICAgbHVhX3B1c2hsaWdodHVzZXJkYXRhKEwsIGluaXRyYW1mcyk7CisgICAgbHVhTF9nZXRtZXRhdGFibGUoTCwgU1lTTElOVVhfRklMRSk7CisgICAgbHVhX3NldG1ldGF0YWJsZShMLCAtMik7CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzbF9pbml0cmFtZnNfbG9hZF9hcmNoaXZlKGx1YV9TdGF0ZSAqIEwpCit7CisgICAgc3RydWN0IGluaXRyYW1mcyAqaW5pdHJhbWZzID0gbHVhTF9jaGVja3VkYXRhKEwsIDEsIFNZU0xJTlVYX0ZJTEUpOworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gbHVhTF9jaGVja3N0cmluZyhMLCAyKTsKKworICAgIGlmIChpbml0cmFtZnNfbG9hZF9hcmNoaXZlKGluaXRyYW1mcywgZmlsZW5hbWUpKSB7CisJcHJpbnRmKCJmYWlsZWQhXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbF9pbml0cmFtZnNfYWRkX2ZpbGUobHVhX1N0YXRlICogTCkKK3sKKyAgICBzdHJ1Y3QgaW5pdHJhbWZzICppbml0cmFtZnMgPSBsdWFMX2NoZWNrdWRhdGEoTCwgMSwgU1lTTElOVVhfRklMRSk7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworICAgIHZvaWQgKmZpbGVfZGF0YSA9IE5VTEw7CisgICAgc2l6ZV90IGZpbGVfbGVuID0gMDsKKworICAgIHJldHVybiBpbml0cmFtZnNfYWRkX2ZpbGUoaW5pdHJhbWZzLCBmaWxlX2RhdGEsIGZpbGVfbGVuLCBmaWxlX2xlbiwKKwkJCSAgICAgIGZpbGVuYW1lLCAwLCAwNzU1KTsKK30KKworc3RhdGljIGludCBzbF9ib290X2l0KGx1YV9TdGF0ZSAqIEwpCit7CisgICAgY29uc3Qgc3lzbGludXhfZmlsZSAqa2VybmVsID0gbHVhTF9jaGVja3VkYXRhKEwsIDEsIFNZU0xJTlVYX0ZJTEUpOworICAgIHN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mcyA9IGx1YUxfY2hlY2t1ZGF0YShMLCAyLCBTWVNMSU5VWF9GSUxFKTsKKyAgICBjb25zdCBjaGFyICpjbWRsaW5lID0gbHVhTF9vcHRzdHJpbmcoTCwgMywgIiIpOworICAgIHVpbnQzMl90IG1lbV9saW1pdCA9IGx1YUxfb3B0aW50KEwsIDQsIDApOworICAgIHVpbnQxNl90IHZpZGVvX21vZGUgPSBsdWFMX29wdGludChMLCA1LCAwKTsKKyAgICAvKiBQcmV2ZW50aW5nIGdjYyB0byBjb21wbGFpbiBhYm91dCB1bnVzZWQgdmFyaWFibGVzICovCisgICAgKHZvaWQpdmlkZW9fbW9kZTsKKyAgICAodm9pZCltZW1fbGltaXQ7CisKKyAgICByZXR1cm4gc3lzbGludXhfYm9vdF9saW51eChrZXJuZWwtPmRhdGEsIGtlcm5lbC0+c2l6ZSwKKwkJCSAgICAgICBpbml0cmFtZnMsIE5VTEwsIChjaGFyICopY21kbGluZSk7Cit9CisKK3N0YXRpYyBpbnQgc2xfY29uZmlnX2ZpbGUobHVhX1N0YXRlICogTCkKK3sKKyAgICBjb25zdCBjaGFyICpjb25maWdfZmlsZSA9IHN5c2xpbnV4X2NvbmZpZ19maWxlKCk7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgY29uZmlnX2ZpbGUpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNsX3JlYm9vdChsdWFfU3RhdGUgKiBMKQoreworICAgIGludCB3YXJtX2Jvb3QgPSBsdWFMX29wdGludChMLCAxLCAwKTsKKyAgICAvKiBleHBsaWNpdGx5IGNvbnZlcnQgaXQgdG8gMSBvciAwICovCisgICAgd2FybV9ib290ID0gd2FybV9ib290PyAxIDogMDsKKyAgICBzeXNsaW51eF9yZWJvb3Qod2FybV9ib290KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbF9pcGFwcGVuZF9zdHJzKGx1YV9TdGF0ZSAqIEwpCit7CisgICAgaW50IGk7CisgICAgY29uc3Qgc3RydWN0IHN5c2xpbnV4X2lwYXBwZW5kX3N0cmluZ3MgKmlwX3N0cnMgPSBzeXNsaW51eF9pcGFwcGVuZF9zdHJpbmdzKCk7CisgICAgbHVhX25ld3RhYmxlKEwpOworICAgIGZvciAoaSA9IDA7IGkgPCBpcF9zdHJzLT5jb3VudDsgaSsrKSB7CisgICAgICAgIGx1YV9wdXNoaW50ZWdlcihMLCBpICsgMSk7CisgICAgICAgIGx1YV9wdXNoc3RyaW5nKEwsIGlwX3N0cnMtPnB0cltpXSk7CisgICAgICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2xfZGVyaXZhdGl2ZShsdWFfU3RhdGUgKiBMKQoreworICAgIGNvbnN0IHN0cnVjdCBzeXNsaW51eF92ZXJzaW9uICpzdjsKKworICAgIHN2ID0gc3lzbGludXhfdmVyc2lvbigpOworCisgICAgc3dpdGNoIChzdi0+ZmlsZXN5c3RlbSkgeworICAgIGNhc2UgU1lTTElOVVhfRlNfU1lTTElOVVg6CisJbHVhX3B1c2hzdHJpbmcoTCwgIlNZU0xJTlVYIik7CisJYnJlYWs7CisgICAgY2FzZSBTWVNMSU5VWF9GU19QWEVMSU5VWDoKKwlsdWFfcHVzaHN0cmluZyhMLCAiUFhFTElOVVgiKTsKKwlicmVhazsKKyAgICBjYXNlIFNZU0xJTlVYX0ZTX0lTT0xJTlVYOgorCWx1YV9wdXNoc3RyaW5nKEwsICJJU09MSU5VWCIpOworCWJyZWFrOworICAgIGNhc2UgU1lTTElOVVhfRlNfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorCWx1YV9wdXNoc3RyaW5nKEwsICJVbmtub3duIFN5c2xpbnV4IGRlcml2YXRpdmUiKTsKKwlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzbF92ZXJzaW9uKGx1YV9TdGF0ZSAqIEwpCit7CisgICAgY29uc3Qgc3RydWN0IHN5c2xpbnV4X3ZlcnNpb24gKnN2OworCisgICAgc3YgPSBzeXNsaW51eF92ZXJzaW9uKCk7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgc3YtPnZlcnNpb25fc3RyaW5nKTsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNsX2dldF9rZXkgKGx1YV9TdGF0ZSAqIEwpCit7CisgICAgaW50IHRpbWVvdXQgPSBsdWFMX2NoZWNraW50IChMLCAxKTsKKyAgICBsdWFfcHVzaGludGVnZXIgKEwsIGdldF9rZXkgKHN0ZGluLCB0aW1lb3V0KSk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2xfS0VZX0NUUkwgKGx1YV9TdGF0ZSAqIEwpCit7CisgICAgbHVhX3B1c2hpbnRlZ2VyIChMLCBLRVlfQ1RSTCAobHVhTF9jaGVja2ludCAoTCwgMSkpKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIHN5c2xpbnV4bGliW10gPSB7CisgICAgeyJydW5fY29tbWFuZCIsIHNsX3J1bl9jb21tYW5kfSwKKyAgICB7InJ1bl9kZWZhdWx0Iiwgc2xfcnVuX2RlZmF1bHR9LAorICAgIHsibG9jYWxfYm9vdCIsIHNsX2xvY2FsX2Jvb3R9LAorICAgIHsiZmluYWxfY2xlYW51cCIsIHNsX2ZpbmFsX2NsZWFudXB9LAorICAgIHsiYm9vdF9saW51eCIsIHNsX2Jvb3RfbGludXh9LAorICAgIHsicnVuX2tlcm5lbF9pbWFnZSIsIHNsX3J1bl9rZXJuZWxfaW1hZ2V9LAorICAgIHsic2xlZXAiLCBzbF9zbGVlcH0sCisgICAgeyJtc2xlZXAiLCBzbF9tc2xlZXB9LAorICAgIHsibG9hZGZpbGUiLCBzbF9sb2FkZmlsZX0sCisgICAgeyJmaWxlc2l6ZSIsIHNsX2ZpbGVzaXplfSwKKyAgICB7ImZpbGVuYW1lIiwgc2xfZmlsZW5hbWV9LAorICAgIHsiaW5pdHJhbWZzX2luaXQiLCBzbF9pbml0cmFtZnNfaW5pdH0sCisgICAgeyJpbml0cmFtZnNfbG9hZF9hcmNoaXZlIiwgc2xfaW5pdHJhbWZzX2xvYWRfYXJjaGl2ZX0sCisgICAgeyJpbml0cmFtZnNfYWRkX2ZpbGUiLCBzbF9pbml0cmFtZnNfYWRkX2ZpbGV9LAorICAgIHsiYm9vdF9pdCIsIHNsX2Jvb3RfaXR9LAorICAgIHsiY29uZmlnX2ZpbGUiLCBzbF9jb25maWdfZmlsZX0sCisgICAgeyJpcGFwcGVuZF9zdHJzIiwgc2xfaXBhcHBlbmRfc3Ryc30sCisgICAgeyJyZWJvb3QiLCBzbF9yZWJvb3R9LAorICAgIHsiZGVyaXZhdGl2ZSIsIHNsX2Rlcml2YXRpdmV9LAorICAgIHsidmVyc2lvbiIsIHNsX3ZlcnNpb259LAorICAgIHsiZ2V0X2tleSIsIHNsX2dldF9rZXl9LAorICAgIHsiS0VZX0NUUkwiLCBzbF9LRVlfQ1RSTH0sCisgICAge05VTEwsIE5VTEx9Cit9OworCisvKiBUaGlzIGRlZmluZXMgYSBmdW5jdGlvbiB0aGF0IG9wZW5zIHVwIHlvdXIgbGlicmFyeS4gKi8KKworTFVBTElCX0FQSSBpbnQgbHVhb3Blbl9zeXNsaW51eChsdWFfU3RhdGUgKiBMKQoreworCisgICAgbHVhTF9uZXdtZXRhdGFibGUoTCwgU1lTTElOVVhfRklMRSk7CisKKyAgICBsdWFMX25ld2xpYihMLCBzeXNsaW51eGxpYik7CisKKyAgICBsdWFfbmV3dGFibGUgKEwpOworI2RlZmluZSBleHBvcnRfa2V5KHgpIGx1YV9wdXNoaW50ZWdlciAoTCwgS0VZXyMjeCk7IGx1YV9zZXRmaWVsZCAoTCwgLTIsICN4KTsKKyAgICBleHBvcnRfa2V5IChOT05FKTsKKyAgICBleHBvcnRfa2V5IChCQUNLU1BBQ0UpOworICAgIGV4cG9ydF9rZXkgKFRBQik7CisgICAgZXhwb3J0X2tleSAoRU5URVIpOworICAgIGV4cG9ydF9rZXkgKEVTQyk7CisgICAgZXhwb3J0X2tleSAoREVMKTsKKyAgICBleHBvcnRfa2V5IChGMSk7CisgICAgZXhwb3J0X2tleSAoRjIpOworICAgIGV4cG9ydF9rZXkgKEYzKTsKKyAgICBleHBvcnRfa2V5IChGNCk7CisgICAgZXhwb3J0X2tleSAoRjUpOworICAgIGV4cG9ydF9rZXkgKEY2KTsKKyAgICBleHBvcnRfa2V5IChGNyk7CisgICAgZXhwb3J0X2tleSAoRjgpOworICAgIGV4cG9ydF9rZXkgKEY5KTsKKyAgICBleHBvcnRfa2V5IChGMTApOworICAgIGV4cG9ydF9rZXkgKEYxMSk7CisgICAgZXhwb3J0X2tleSAoRjEyKTsKKyAgICBleHBvcnRfa2V5IChVUCk7CisgICAgZXhwb3J0X2tleSAoRE9XTik7CisgICAgZXhwb3J0X2tleSAoTEVGVCk7CisgICAgZXhwb3J0X2tleSAoUklHSFQpOworICAgIGV4cG9ydF9rZXkgKFBHVVApOworICAgIGV4cG9ydF9rZXkgKFBHRE4pOworICAgIGV4cG9ydF9rZXkgKEhPTUUpOworICAgIGV4cG9ydF9rZXkgKEVORCk7CisgICAgZXhwb3J0X2tleSAoSU5TRVJUKTsKKyAgICBleHBvcnRfa2V5IChERUxFVEUpOworICAgIGx1YV9zZXRmaWVsZCAoTCwgLTIsICJLRVkiKTsKKworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbHVhL3NyYy92ZXNhLmMgYi9jb20zMi9sdWEvc3JjL3Zlc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGUwMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3NyYy92ZXNhLmMKQEAgLTAsMCArMSwxMzkgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKyNpbmNsdWRlICJsdWFsaWIuaCIKKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2NvbnNvbGUuaCIKKyNpbmNsdWRlICIuLi8uLi9saWIvc3lzL3Zlc2EvdmVzYS5oIgorI2luY2x1ZGUgIi4uLy4uL2xpYi9zeXMvdmVzYS92aWRlby5oIgorCitpbnQgdmVzYWNvbl9sb2FkX2JhY2tncm91bmQoY29uc3QgY2hhciAqZmlsZW5hbWUpOworCitzdGF0aWMgaW50IHZlc2FfZ2V0bW9kZXMobHVhX1N0YXRlICpMKQoreworICBjb20zMnN5c190IHJtOworICB1aW50MTZfdCBtb2RlLCAqbW9kZV9wdHI7CisgIHN0cnVjdCB2ZXNhX2dlbmVyYWxfaW5mbyAqZ2k7CisgIHN0cnVjdCB2ZXNhX21vZGVfaW5mbyAqbWk7CisgIGludCBubW9kZSA9IDE7CisgIGludCBydiA9IC0xOworCisgIGdpID0gbG1hbGxvYyhzaXplb2YgKmdpKTsKKyAgaWYgKCFnaSkKKyAgICAgIHJldHVybiAtMTsKKworICBtaSA9IGxtYWxsb2Moc2l6ZW9mICptaSk7CisgIGlmICghbWkpCisgICAgICBnb3RvIG91dDsKKworICBtZW1zZXQoJnJtLCAwLCBzaXplb2Yocm0pKTsKKyAgbWVtc2V0KGdpLCAwLCBzaXplb2YgKmdpKTsKKworICBnaS0+c2lnbmF0dXJlID0gVkJFMl9NQUdJQzsgICAvKiBHZXQgVkJFMiBleHRlbmRlZCBkYXRhICovCisgIHJtLmVheC53WzBdID0gMHg0RjAwOyAgICAgICAgIC8qIEdldCBTVkdBIGdlbmVyYWwgaW5mb3JtYXRpb24gKi8KKyAgcm0uZWRpLndbMF0gPSBPRkZTKGdpKTsKKyAgcm0uZXMgICAgICA9IFNFRyhnaSk7CisgIF9faW50Y2FsbCgweDEwLCAmcm0sICZybSk7CisKKyAgaWYgKCBybS5lYXgud1swXSAhPSAweDAwNEYgKQorICAgIGdvdG8gb3V0OyAgICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIGZhaWxlZCAqLworICBpZiAoIGdpLT5zaWduYXR1cmUgIT0gVkVTQV9NQUdJQyApIHsKKyAgICBydiA9IC0yOyAgICAgICAgICAgICAgICAgICAvKiBObyBtYWdpYyAqLworICAgIGdvdG8gb3V0OworICB9CisgIGlmICggZ2ktPnZlcnNpb24gPCAweDAxMDIgKSB7CisgICAgcnYgPSAtMzsgICAgICAgICAgICAgICAgICAgLyogVkVTQSAxLjIrIHJlcXVpcmVkICovCisgICAgZ290byBvdXQ7CisgIH0KKworICBsdWFfbmV3dGFibGUoTCk7ICAgICAgLyogbGlzdCBvZiBtb2RlcyAqLworCisgIC8qIENvcHkgZ2VuZXJhbCBpbmZvICovCisgIG1lbWNweSgmX192ZXNhX2luZm8uZ2ksIGdpLCBzaXplb2YgKmdpKTsKKworICAvKiBTZWFyY2ggZm9yIGEgNjQweDQ4MCBtb2RlIHdpdGggYSBzdWl0YWJsZSBjb2xvciBhbmQgbWVtb3J5IG1vZGVsLi4uICovCisKKyAgbW9kZV9wdHIgPSBHRVRfUFRSKGdpLT52aWRlb19tb2RlX3B0cik7CisKKyAgd2hpbGUgKChtb2RlID0gKm1vZGVfcHRyKyspICE9IDB4RkZGRikgeworICAgIG1vZGUgJj0gMHgxRkY7ICAgICAgICAgICAgICAvKiBUaGUgcmVzdCBhcmUgYXR0cmlidXRlcyBvZiBzb3J0cyAqLworCisgICAgcHJpbnRmKCJGb3VuZCBtb2RlOiAweCUwNHggKCVkeCVkeCVkKVxuIiwgbW9kZSwgbWktPmhfcmVzLCBtaS0+dl9yZXMsIG1pLT5icHApOworCisgICAgbWVtc2V0KCZybSwgMCwgc2l6ZW9mKHJtKSk7CisgICAgbWVtc2V0KG1pLCAwLCBzaXplb2YgKm1pKTsKKyAgICBybS5lYXgud1swXSA9IDB4NEYwMTsgICAgICAgLyogR2V0IFNWR0EgbW9kZSBpbmZvcm1hdGlvbiAqLworICAgIHJtLmVjeC53WzBdID0gbW9kZTsKKyAgICBybS5lZGkud1swXSA9IE9GRlMobWkpOworICAgIHJtLmVzICA9IFNFRyhtaSk7CisgICAgX19pbnRjYWxsKDB4MTAsICZybSwgJnJtKTsKKworICAgIC8qIE11c3QgYmUgYSBzdXBwb3J0ZWQgbW9kZSAqLworICAgIGlmICggcm0uZWF4LndbMF0gIT0gMHgwMDRmICkKKyAgICAgIGNvbnRpbnVlOworCisgICAgbHVhX3B1c2hudW1iZXIoTCwgbm1vZGUrKyk7CisgICAgbHVhX25ld3RhYmxlKEwpOyAvKiBtb2RlIGluZm8gKi8KKworICAgIGx1YV9wdXNoc3RyaW5nKEwsICJtb2RlIik7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgbW9kZSk7CisgICAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgImhyZXMiKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCBtaS0+aF9yZXMpOworICAgIGx1YV9zZXR0YWJsZShMLC0zKTsKKworICAgIGx1YV9wdXNoc3RyaW5nKEwsICJ2cmVzIik7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgbWktPnZfcmVzKTsKKyAgICBsdWFfc2V0dGFibGUoTCwtMyk7CisKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiYnBwIik7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgbWktPmJwcCk7CisgICAgbHVhX3NldHRhYmxlKEwsLTMpOworCisgICAgbHVhX3NldHRhYmxlKEwsIC0zKTsgLyogYWRkIHRvIG1vZGUgbGlzdCAqLworCisgIH0KKworICBydiA9IDE7CitvdXQ6CisgIGxmcmVlKG1pKTsKKyAgbGZyZWUoZ2kpOworICByZXR1cm4gcnY7Cit9CisKKworc3RhdGljIGludCB2ZXNhX3NldG1vZGUobHVhX1N0YXRlICpMKQoreworICAvKiBQcmV2ZW50aW5nIEdDQyB0byBjb21wbGFpbiBhYm91dCB1bnVzZWQgTCovCisgIEw9TDsKKyAgb3BlbmNvbnNvbGUoJmRldl9yYXdjb25fciwgJmRldl92ZXNhc2VyaWFsX3cpOworCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmVzYV9sb2FkX2JhY2tncm91bmQobHVhX1N0YXRlICpMKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisKKyAgdmVzYWNvbl9sb2FkX2JhY2tncm91bmQoZmlsZW5hbWUpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgdmVzYWxpYltdID0geworICB7ImdldG1vZGVzIiwgdmVzYV9nZXRtb2Rlc30sCisgIHsic2V0bW9kZSIsIHZlc2Ffc2V0bW9kZX0sCisgIHsibG9hZF9iYWNrZ3JvdW5kIiwgdmVzYV9sb2FkX2JhY2tncm91bmR9LAorICB7TlVMTCwgTlVMTH0KK307CisKKy8qIFRoaXMgZGVmaW5lcyBhIGZ1bmN0aW9uIHRoYXQgb3BlbnMgdXAgeW91ciBsaWJyYXJ5LiAqLworCitMVUFMSUJfQVBJIGludCBsdWFvcGVuX3Zlc2EgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld2xpYihMLCB2ZXNhbGliKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2NvbTMyL2x1YS90ZXN0L2F1dG9tZW51Lmx1YSBiL2NvbTMyL2x1YS90ZXN0L2F1dG9tZW51Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTY2Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbHVhL3Rlc3QvYXV0b21lbnUubHVhCkBAIC0wLDAgKzEsMTUyIEBACistLVtbCitBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBib290IG1lbnUgb2YgdGhlIGluc3RhbGxlZCBMaW51eCBrZXJuZWxzCisKK0V4YW1wbGU6CisKK20gPSByZXF1aXJlICJhdXRvbWVudSIKK20ucnVuIHsgZGlyID0gIi8iLAorICAgICAgICBkZWZhdWx0ID0gMSwKKyAgICAgICAgdGltZW91dCA9IDUsCisgICAgICAgIGFwcGVuZCA9ICJyb290PS9kZXYvaGRhMiBybyIsCit9CisKK1RPRE86CistIGFkZCBob29rcworLSBkZW1vIGFkZGluZyBicmVhayBvcHRpb25zIGZyb20gdXNlciBjb25maWcKKy0ga2VybmVsIGZsYXZvciBwcmVmZXJlbmNlIChwYWUvcnQpCitdXQorCitsb2NhbCBsZnMgPSByZXF1aXJlICJsZnMiCitsb2NhbCBzbCA9IHJlcXVpcmUgInN5c2xpbnV4IgorCitsb2NhbCBzaW5nbGUgPSBmYWxzZQorbG9jYWwgdmVyYm9zaXR5ID0gMgorCitsb2NhbCBmdW5jdGlvbiBtb2RpZmllcnMgKCkKKyAgIHJldHVybiAoc2luZ2xlIGFuZCAiIHNpbmdsZSIgb3IgIiIpIC4uICh7IiBxdWlldCIsIiIsIiBkZWJ1ZyJ9KVt2ZXJib3NpdHldCitlbmQKKworbG9jYWwgZnVuY3Rpb24gc2NhbiAocGFyYW1zKQorICAgbG9jYWwgc2VwID0gc3RyaW5nLnN1YiAocGFyYW1zLmRpciwgLTEpID09ICIvIiBhbmQgIiIgb3IgIi8iCisgICBpZiBub3QgcGFyYW1zLml0ZW1zIHRoZW4gcGFyYW1zLml0ZW1zID0ge30gZW5kCisgICBmb3IgbmFtZSBpbiBsZnMuZGlyIChwYXJhbXMuZGlyKSBkbworICAgICAgbG9jYWwgcGF0aCA9IHBhcmFtcy5kaXIgLi4gc2VwIC4uIG5hbWUKKyAgICAgIGlmIGxmcy5hdHRyaWJ1dGVzIChwYXRoLCAibW9kZSIpID09ICJmaWxlIiB0aGVuCisgICAgICAgICBsb2NhbCBmcm9tLHRvLHZlcnNpb24gPSBzdHJpbmcuZmluZCAobmFtZSwgIl52bWxpbnV6JS0oLiopIikKKyAgICAgICAgIGlmIGZyb20gdGhlbgorICAgICAgICAgICAgbG9jYWwgaW5pdHJkID0gcGFyYW1zLmRpciAuLiBzZXAgLi4gImluaXRyZC5pbWctIiAuLiB2ZXJzaW9uCisgICAgICAgICAgICBsb2NhbCBpbml0cmRfcGFyYW0gPSAiIgorICAgICAgICAgICAgaWYgbGZzLmF0dHJpYnV0ZXMgKGluaXRyZCwgInNpemUiKSB0aGVuCisgICAgICAgICAgICAgICBpbml0cmRfcGFyYW0gPSAiaW5pdHJkPSIgLi4gaW5pdHJkIC4uICIgIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICB0YWJsZS5pbnNlcnQgKHBhcmFtcy5pdGVtcywgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93ID0gZnVuY3Rpb24gKCkgcmV0dXJuIG5hbWUgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHNsLmJvb3RfbGludXggKHBhdGgsIGluaXRyZF9wYXJhbSAuLiBwYXJhbXMuYXBwZW5kIC4uIG1vZGlmaWVycyAoKSkgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgZW5kCitlbmQKKworbG9jYWwgZnVuY3Rpb24gdmVyc2lvbl9ndCAodjEsIHYyKQorICAgbG9jYWwgbmVnYXRpdmVzID0geyJyYyIsICJwcmUifQorICAgbG9jYWwgbTEsIHIxID0gc3RyaW5nLm1hdGNoICh2MSwgIl4oJUQqKSguKikiKQorICAgbG9jYWwgbTIsIHIyID0gc3RyaW5nLm1hdGNoICh2MiwgIl4oJUQqKSguKikiKQorICAgaWYgbTEgfj0gbTIgdGhlbgorICAgICAgZm9yIF8sIHN1ZmZpeCBpbiBpcGFpcnMgKG5lZ2F0aXZlcykgZG8KKyAgICAgICAgIHN1ZmZpeCA9ICItIiAuLiBzdWZmaXgKKyAgICAgICAgIGlmIG0xID09IHN1ZmZpeCBhbmQgbTIgfj0gc3VmZml4IHRoZW4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICAgZWxzZWlmIG0xIH49IHN1ZmZpeCBhbmQgbTIgPT0gc3VmZml4IHRoZW4KKyAgICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIG0xID4gbTIKKyAgIGVuZAorICAgbTEsIHIxID0gc3RyaW5nLm1hdGNoIChyMSwgIl4oJWQqKSguKikiKQorICAgbTIsIHIyID0gc3RyaW5nLm1hdGNoIChyMiwgIl4oJWQqKSguKikiKQorICAgbTEgPSB0b251bWJlciAobTEpIG9yIDAKKyAgIG0yID0gdG9udW1iZXIgKG0yKSBvciAwCisgICBpZiBtMSB+PSBtMiB0aGVuCisgICAgICByZXR1cm4gbTEgPiBtMgorICAgZW5kCisgICBpZiByMSA9PSAiIiBhbmQgcjIgPT0gIiIgdGhlbgorICAgICAgcmV0dXJuIGZhbHNlCisgICBlbmQKKyAgIHJldHVybiB2ZXJzaW9uX2d0IChyMSwgcjIpCitlbmQKKworbG9jYWwgZnVuY3Rpb24ga2VybmVsX2d0IChrMSwgazIpCisgICByZXR1cm4gdmVyc2lvbl9ndCAoazEudmVyc2lvbiwgazIudmVyc2lvbikKK2VuZAorCitsb2NhbCBmdW5jdGlvbiBwcmludF9vcl9jYWxsICh4LCBkZWYpCisgICBsb2NhbCB0ID0gdHlwZSAoeCkKKyAgIGlmIHQgPT0gIm5pbCIgdGhlbgorICAgICAgaWYgZGVmIHRoZW4gcHJpbnQgKGRlZikgZW5kCisgICBlbHNlaWYgdCA9PSAiZnVuY3Rpb24iIHRoZW4KKyAgICAgIHggKCkKKyAgIGVsc2UKKyAgICAgIHByaW50ICh4KQorICAgZW5kCitlbmQKKworbG9jYWwgZnVuY3Rpb24gZHJhdyAocGFyYW1zKQorICAgcHJpbnRfb3JfY2FsbCAocGFyYW1zLnRpdGxlLCAiXG49PT0gQm9vdCBtZW51ID09PSIpCisgICBmb3IgaSwgaXRlbSBpbiBpcGFpcnMgKHBhcmFtcy5pdGVtcykgZG8KKyAgICAgIHByaW50ICgoaSA9PSBwYXJhbXMuZGVmYXVsdCBhbmQgIiA+ICIgb3IgIiAgICIpIC4uIGkgLi4gIiAgIiAuLiBpdGVtLnNob3cgKCkpCisgICBlbmQKKyAgIHByaW50ICgiXG5LZXJuZWwgYXJndW1lbnRzOlxuICAiIC4uIHBhcmFtcy5hcHBlbmQgLi4gbW9kaWZpZXJzICgpKQorICAgcHJpbnQgKCJcbkhpdCBhIG51bWJlciB0byBzZWxlY3QgZnJvbSB0aGUgbWVudSxcbiAgICBFTlRFUiB0byBhY2NlcHQgZGVmYXVsdCxcbiAgICBFU0MgdG8gZXhpdFxuIG9yIGFueSBvdGhlciBrZXkgdG8gcHJpbnQgbWVudSBhZ2FpbiIpCitlbmQKKworbG9jYWwgZnVuY3Rpb24gY2hvb3NlIChwYXJhbXMpCisgICBkcmF3IChwYXJhbXMpCisgICBwcmludCAoIlxuQm9vdGluZyBpbiAiIC4uIHBhcmFtcy50aW1lb3V0IC4uICIgcy4uLiIpCisgICB3aGlsZSB0cnVlIGRvCisgICAgICBsb2NhbCBpID0gc2wuZ2V0X2tleSAocGFyYW1zLnRpbWVvdXQgKiAxMDAwKQorICAgICAgaWYgaSA9PSBzbC5LRVkuRVNDIHRoZW4KKyAgICAgICAgIGJyZWFrCisgICAgICBlbHNlCisgICAgICAgICBpZiBpID09IHNsLktFWS5OT05FIG9yIGkgPT0gc2wuS0VZLkVOVEVSIHRoZW4KKyAgICAgICAgICAgIGkgPSBwYXJhbXMuZGVmYXVsdAorICAgICAgICAgZWxzZWlmIGkgPT0gc2wuS0VZLkRPV04gdGhlbgorICAgICAgICAgICAgcGFyYW1zLmRlZmF1bHQgPSBwYXJhbXMuZGVmYXVsdCA8ICNwYXJhbXMuaXRlbXMgYW5kIHBhcmFtcy5kZWZhdWx0ICsgMSBvciAjcGFyYW1zLml0ZW1zCisgICAgICAgICBlbHNlaWYgaSA9PSBzbC5LRVkuVVAgdGhlbgorICAgICAgICAgICAgcGFyYW1zLmRlZmF1bHQgPSBwYXJhbXMuZGVmYXVsdCA+IDEgYW5kIHBhcmFtcy5kZWZhdWx0IC0gMSBvciAxCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBpID0gaSAtIHN0cmluZy5ieXRlICIwIgorICAgICAgICAgZW5kCisgICAgICAgICBpZiBwYXJhbXMuaXRlbXNbaV0gdGhlbgorICAgICAgICAgICAgcGFyYW1zLml0ZW1zW2ldLmV4ZWN1dGUgKCkKKyAgICAgICAgIGVuZAorICAgICAgICAgcGFyYW1zLnRpbWVvdXQgPSAwCisgICAgICAgICBkcmF3IChwYXJhbXMpCisgICAgICBlbmQKKyAgIGVuZAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIHJ1biAocGFyYW1zKQorICAgc2NhbiAocGFyYW1zKQorICAgaWYgbm90IG5leHQgKHBhcmFtcy5pdGVtcykgdGhlbgorICAgICAgcHJpbnQgKCJObyBrZXJuZWxzIGZvdW5kIGluIGRpcmVjdG9yeSAiIC4uIHBhcmFtcy5kaXIpCisgICAgICBvcy5leGl0IChmYWxzZSkKKyAgIGVuZAorICAgdGFibGUuc29ydCAocGFyYW1zLml0ZW1zLCBrZXJuZWxfZ3QpCisgICB0YWJsZS5pbnNlcnQgKHBhcmFtcy5pdGVtcywgeworICAgICAgICAgICAgICAgICAgICBzaG93ID0gZnVuY3Rpb24gKCkgcmV0dXJuICJTaW5nbGUgdXNlcjogIiAuLiAoc2luZ2xlIGFuZCAidHJ1ZSIgb3IgImZhbHNlIikgZW5kLAorICAgICAgICAgICAgICAgICAgICBleGVjdXRlID0gZnVuY3Rpb24gKCkgc2luZ2xlID0gbm90IHNpbmdsZSBlbmQKKyAgICAgICAgICAgICAgICAgfSkKKyAgIHRhYmxlLmluc2VydCAocGFyYW1zLml0ZW1zLCB7CisgICAgICAgICAgICAgICAgICAgIHNob3cgPSBmdW5jdGlvbiAoKSByZXR1cm4gIlZlcmJvc2l0eTogIiAuLiAoeyJxdWlldCIsIm5vcm1hbCIsImRlYnVnIn0pW3ZlcmJvc2l0eV0gZW5kLAorICAgICAgICAgICAgICAgICAgICBleGVjdXRlID0gZnVuY3Rpb24gKCkgdmVyYm9zaXR5ID0gdmVyYm9zaXR5IDwgMyBhbmQgdmVyYm9zaXR5ICsgMSBvciAxIGVuZAorICAgICAgICAgICAgICAgICB9KQorICAgY2hvb3NlIChwYXJhbXMpCitlbmQKKworcmV0dXJuIHsKKyAgIHNjYW4gPSBzY2FuLAorICAgY2hvb3NlID0gY2hvb3NlLAorICAgcnVuID0gcnVuCit9CmRpZmYgLS1naXQgYS9jb20zMi9sdWEvdGVzdC9zaW1wbGVtZW51Lmx1YSBiL2NvbTMyL2x1YS90ZXN0L3NpbXBsZW1lbnUubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhODZkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9sdWEvdGVzdC9zaW1wbGVtZW51Lmx1YQpAQCAtMCwwICsxLDM0IEBACistLSBBIHRyYW5zbGF0aW9uIG9mIGNvbTMyL2NtZW51L3NpbXBsZS5jIGludG8gTHVhCisKK2xvY2FsIG0gPSByZXF1aXJlICJjbWVudSIKK2xvY2FsIHNsID0gcmVxdWlyZSAic3lzbGludXgiCisKK20uaW5pdCgpCittLnNldF93aW5kb3dfc2l6ZSgxLCAxLCAyMywgNzgpCitsb2NhbCB0ZXN0aW5nID0gbS5hZGRfbmFtZWRfbWVudSgidGVzdGluZyIsICIgVGVzdGluZyAiKQorLS0gZGVtb25zdHJhdGUgaWRlbnRpZnlpbmcgKG5hbWVkKSBzdWJtZW51IGJ5IG51bWJlcjoKK20uYWRkX2l0ZW0oIlNlbGYgTG9vcCIsICJHbyB0byB0ZXN0aW5nIiwgbS5hY3Rpb24uU1VCTUVOVSwgbmlsLCB0ZXN0aW5nKQorbS5hZGRfaXRlbSgiTWVtb3J5IFRlc3QiLCAiUGVyZm9ybSBleHRlbnNpdmUgbWVtb3J5IHRlc3RpbmciLCBtLmFjdGlvbi5SVU4sICJtZW10ZXN0IikKK20uYWRkX2l0ZW0oIkV4aXQgdGhpcyBtZW51IiwgIkdvIG9uZSBsZXZlbCB1cCIsIG0uYWN0aW9uLkVYSVRNRU5VLCAiZXhpdCIpCisKK2xvY2FsIHJlc2N1ZSA9IG0uYWRkX21lbnUoIiBSZXNjdWUgT3B0aW9ucyAiKQorbS5hZGRfaXRlbSgiTGludXggUmVzY3VlIiwgImxpbnJlc2MiLCBtLmFjdGlvbi5SVU4sICJsaW5yZXNjIikKK20uYWRkX2l0ZW0oIkRvcyBSZXNjdWUiLCAiZG9zcmVzYyIsIG0uYWN0aW9uLlJVTiwgImRvc3Jlc2MiKQorbS5hZGRfaXRlbSgiV2luZG93cyBSZXNjdWUiLCAid2lucmVzYyIsIG0uYWN0aW9uLlJVTiwgIndpbnJlc2MiKQorbS5hZGRfaXRlbSgiRXhpdCB0aGlzIG1lbnUiLCAiR28gb25lIGxldmVsIHVwIiwgbS5hY3Rpb24uRVhJVE1FTlUsICJleGl0IikKKworbS5hZGRfbmFtZWRfbWVudSgibWFpbiIsICIgTWFpbiBNZW51ICIpCittLmFkZF9pdGVtKCJQcmVwYXJlIiwgInByZXAiLCBtLmFjdGlvbi5SVU4sICJwcmVwIikKK20uYWRkX2l0ZW0oIlJlc2N1ZSBvcHRpb25zLi4uIiwgIlRyb3VibGVzaG9vdCBhIHN5c3RlbSIsIG0uYWN0aW9uLlNVQk1FTlUsIG5pbCwgcmVzY3VlKQorLS0gZGVtb25zdHJhdGUgaWRlbnRpZnlpbmcgc3VibWVudSBieSBuYW1lOgorbS5hZGRfaXRlbSgiVGVzdGluZy4uLiIsICJPcHRpb25zIHRvIHRlc3QgaGFyZHdhcmUiLCBtLmFjdGlvbi5TVUJNRU5VLCAidGVzdGluZyIpCittLmFkZF9pdGVtKCJFeGl0IHRvIHByb21wdCIsICJFeGl0IHRoZSBtZW51IHN5c3RlbSIsIG0uYWN0aW9uLkVYSVRNRU5VLCAiZXhpdCIpCisKKy0tIGRlbW9uc3RyYXRlIGZpbmRpbmcgbWVudSBleHBsaWNpdGx5OgorbG9jYWwgYWN0aW9uLCBkYXRhID0gbS5zaG93bWVudXMobS5maW5kX21lbnVfbnVtKCJtYWluIikpCisKK2lmIGFjdGlvbiA9PSBtLmFjdGlvbi5SVU4gdGhlbgorICBzbC5ydW5fY29tbWFuZCAoZGF0YSkKK2Vsc2UKKyAgcHJpbnQgKGFjdGlvbiwgZGF0YSkKK2VuZApkaWZmIC0tZ2l0IGEvY29tMzIvbWJvb3QvTWFrZWZpbGUgYi9jb20zMi9tYm9vdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTE2NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbWJvb3QvTWFrZWZpbGUKQEAgLTAsMCArMSw0NSBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisjIyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIyBNdWx0aWJvb3QgbW9kdWxlCisjIworCitWUEFUSCA9ICQoU1JDKQoraW5jbHVkZSAkKE1BS0VESVIpL2VsZi5taworCitMTlhMSUJTCSAgID0gJChvYmpkaXIpL2NvbTMyL2xpYnV0aWwvbGlidXRpbF9sbnguYQorCitNT0RVTEVTCSAgPSBtYm9vdC5jMzIKK1RFU1RGSUxFUyA9CisKK09CSlMgPSBtYm9vdC5vIG1hcC5vIG1lbS5vIGluaXR2ZXNhLm8gYXBtLm8gc29sYXJpcy5vIHN5c2xpbnV4Lm8KKworYWxsOiAkKE1PRFVMRVMpICQoVEVTVEZJTEVTKQorCittYm9vdC5lbGYgOiAkKE9CSlMpICQoQ19MSUJTKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJF4KKwordGlkeSBkaXN0OgorCXJtIC1mICoubyAqLmxvICouYSAqLmxzdCAqLmVsZiAuKi5kICoudG1wCisKK2NsZWFuOiB0aWR5CisJcm0gLWYgKi5sbngKKworc3BvdGxlc3M6IGNsZWFuCisJcm0gLWYgKi5sc3MgKi5jMzIgKi5jb20KKwlybSAtZiAqfiBcIyoKKworaW5zdGFsbDoKKworLWluY2x1ZGUgLiouZApkaWZmIC0tZ2l0IGEvY29tMzIvbWJvb3QvYXBtLmMgYi9jb20zMi9tYm9vdC9hcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmI2YjYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbWJvb3QvYXBtLmMKQEAgLTAsMCArMSw4OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogICBCYXNlZCBvbiBjb2RlIGZyb20gdGhlIExpbnV4IGtlcm5lbDoKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcworICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIE9yaWdpbmFsIEFQTSBCSU9TIGNoZWNraW5nIGJ5IFN0ZXBoZW4gUm90aHdlbGwsIE1heSAxOTk0CisgKiAgIChzZnJAY2FuYi5hdXVnLm9yZy5hdSkKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYXBtLmMKKyAqCisgKiBBUE0gaW5mb3JtYXRpb24gZm9yIE11bHRpYm9vdAorICovCisKKyNpbmNsdWRlICJtYm9vdC5oIgorI2luY2x1ZGUgPGNvbTMyLmg+CisKK3ZvaWQgbWJvb3RfYXBtKHZvaWQpCit7CisgICAgc3RhdGljIHN0cnVjdCBhcG1faW5mbyBhcG07CisgICAgY29tMzJzeXNfdCBpcmVnLCBvcmVnOworCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisKKyAgICBpcmVnLmVheC53WzBdID0gMHg1MzAwOworICAgIF9faW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworCisgICAgaWYgKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpCisJcmV0dXJuOwkJCS8qIE5vIEFQTSBCSU9TICovCisKKyAgICBpZiAob3JlZy5lYngud1swXSAhPSAweDUwNGQpCisJcmV0dXJuOwkJCS8qIE5vICJQTSIgc2lnbmF0dXJlICovCisKKyAgICBpZiAoIShvcmVnLmVjeC53WzBdICYgMHgwMikpCisJcmV0dXJuOwkJCS8qIDMyIGJpdHMgbm90IHN1cHBvcnRlZCAqLworCisgICAgLyogRGlzY29ubmVjdCBmaXJzdCwganVzdCBpbiBjYXNlICovCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisgICAgaXJlZy5lYXguYlswXSA9IDB4MDQ7CisgICAgX19pbnRjYWxsKDB4MTUsICZpcmVnLCAmb3JlZyk7CisKKyAgICAvKiAzMi1iaXQgY29ubmVjdCAqLworICAgIGlyZWcuZWF4LmJbMF0gPSAweDAzOworICAgIF9faW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworCisgICAgYXBtLmNzZWcgPSBvcmVnLmVheC53WzBdOworICAgIGFwbS5vZmZzZXQgPSBvcmVnLmVieC5sOworICAgIGFwbS5jc2VnXzE2ID0gb3JlZy5lY3gud1swXTsKKyAgICBhcG0uZHNlZ18xNiA9IG9yZWcuZWR4LndbMF07CisgICAgYXBtLmNzZWdfbGVuID0gb3JlZy5lc2kud1swXTsKKyAgICBhcG0uY3NlZ18xNl9sZW4gPSBvcmVnLmVzaS53WzFdOworICAgIGFwbS5kc2VnXzE2X2xlbiA9IG9yZWcuZWRpLndbMF07CisKKyAgICAvKiBSZWRvIHRoZSBpbnN0YWxsYXRpb24gY2hlY2sgYXMgdGhlIDMyLWJpdCBjb25uZWN0OworICAgICAgIHNvbWUgQklPU2VzIHJldHVybiBkaWZmZXJlbnQgZmxhZ3MgdGhpcyB3YXkuLi4gKi8KKworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworICAgIGlyZWcuZWF4LmJbMF0gPSAweDAwOworICAgIF9faW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworCisgICAgaWYgKChvcmVnLmVmbGFncy5sICYgRUZMQUdTX0NGKSB8fCAob3JlZy5lYngud1swXSAhPSAweDUwNGQpKSB7CisJLyogRmFpbHVyZSB3aXRoIDMyLWJpdCBjb25uZWN0LCB0cnkgdG8gZGlzY29uZWN0IGFuZCBpZ25vcmUgKi8KKwlpcmVnLmVheC5iWzBdID0gMHgwNDsKKwlfX2ludGNhbGwoMHgxNSwgJmlyZWcsIE5VTEwpOworCXJldHVybjsKKyAgICB9CisKKyAgICBhcG0udmVyc2lvbiA9IG9yZWcuZWF4LndbMF07CisKKyAgICBtYmluZm8uYXBtX3RhYmxlID0gbWFwX2RhdGEoJmFwbSwgc2l6ZW9mIGFwbSwgNCwgZmFsc2UpOworICAgIGlmIChtYmluZm8uYXBtX3RhYmxlKQorCW1iaW5mby5mbGFncyB8PSBNQl9JTkZPX0FQTV9UQUJMRTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21ib290L2luaXR2ZXNhLmMgYi9jb20zMi9tYm9vdC9pbml0dmVzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTFlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tYm9vdC9pbml0dmVzYS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMTk5OS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogaW5pdHZlc2EuYworICoKKyAqIFF1ZXJ5IHRoZSBWRVNBIEJJT1MgYW5kIHNlbGVjdCBhIDY0MHg0ODB4MzIgbW9kZSB3aXRoIGxvY2FsIG1hcHBpbmcKKyAqIHN1cHBvcnQsIGlmIG9uZSBleGlzdHMuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxncmFwaGljcy5oPgorCisjaW5jbHVkZSAidmVzYS5oIgorI2luY2x1ZGUgIm1ib290LmgiCisKK3N0cnVjdCB2ZXNhX2luZm8gdmVzYV9pbmZvOworCit2b2lkIHNldF9ncmFwaGljc19tb2RlKGNvbnN0IHN0cnVjdCBtdWx0aWJvb3RfaGVhZGVyICptYmgsCisJCSAgICAgICBzdHJ1Y3QgbXVsdGlib290X2luZm8gKm1iaSkKK3sKKyAgICBjb20zMnN5c190IHJtOworICAgIHVpbnQxNl90IG1vZGUsIGJlc3Rtb2RlLCAqbW9kZV9wdHI7CisgICAgc3RydWN0IHZlc2FfZ2VuZXJhbF9pbmZvICpnaTsKKyAgICBzdHJ1Y3QgdmVzYV9tb2RlX2luZm8gKm1pOworICAgIGludCBweGYsIGJlc3RweGY7CisgICAgaW50IHdhbnR4LCB3YW50eTsKKyAgICBpbnQgZXJyLCBiZXN0ZXJyOworICAgIGJvb2wgYmV0dGVyOworICAgIGFkZHJfdCB2aWFkZHI7CisKKyAgICAvKiBPbmx5IGRvIHRoaXMgaWYgcmVxdWVzdGVkIGJ5IHRoZSBPUyBpbWFnZSAqLworICAgIGlmICghKG1iaC0+ZmxhZ3MgJiBNVUxUSUJPT1RfVklERU9fTU9ERSkgfHwgbWJoLT5tb2RlX3R5cGUgIT0gMCkKKwlyZXR1cm47CisKKyAgICBnaSA9IGxtYWxsb2Moc2l6ZW9mICpnaSk7CisgICAgaWYgKCFnaSkKKwlyZXR1cm47CisKKyAgICBtaSA9IGxtYWxsb2Moc2l6ZW9mICptaSk7CisgICAgaWYgKCFtaSkKKwlnb3RvIG91dDsKKworICAgIG1lbXNldCgmcm0sIDAsIHNpemVvZiBybSk7CisgICAgbWVtc2V0KGdpLCAwLCBzaXplb2YgKmdpKTsKKworICAgIGdpLT5zaWduYXR1cmUgPSBWQkUyX01BR0lDOwkvKiBHZXQgVkJFMiBleHRlbmRlZCBkYXRhICovCisgICAgcm0uZWF4LndbMF0gPSAweDRGMDA7CS8qIEdldCBTVkdBIGdlbmVyYWwgaW5mb3JtYXRpb24gKi8KKyAgICBybS5lZGkud1swXSA9IE9GRlMoZ2kpOworICAgIHJtLmVzID0gU0VHKGdpKTsKKyAgICBfX2ludGNhbGwoMHgxMCwgJnJtLCAmcm0pOworCisgICAgaWYgKHJtLmVheC53WzBdICE9IDB4MDA0RikKKwlnb3RvIG91dDsJCS8qIEZ1bmN0aW9uIGNhbGwgZmFpbGVkICovCisgICAgaWYgKGdpLT5zaWduYXR1cmUgIT0gVkVTQV9NQUdJQykKKwlnb3RvIG91dDsJCS8qIE5vIG1hZ2ljICovCisgICAgaWYgKGdpLT52ZXJzaW9uIDwgMHgwMTAyKQorCWdvdG8gb3V0OwkJLyogVkVTQSAxLjIrIHJlcXVpcmVkICovCisKKyAgICBtZW1jcHkoJnZlc2FfaW5mby5naSwgZ2ksIHNpemVvZiAqZ2kpOworCisgICAgLyogU2VhcmNoIGZvciBhIHN1aXRhYmxlIG1vZGUgd2l0aCBhIHN1aXRhYmxlIGNvbG9yIGFuZCBtZW1vcnkgbW9kZWwuLi4gKi8KKworICAgIG1vZGVfcHRyID0gR0VUX1BUUihnaS0+dmlkZW9fbW9kZV9wdHIpOworICAgIGJlc3Rtb2RlID0gMDsKKyAgICBiZXN0cHhmID0gMDsKKyAgICB3YW50eCA9IG1iaC0+d2lkdGggID8gbWJoLT53aWR0aCAgOiAweGZmZmY7CisgICAgd2FudHkgPSBtYmgtPmhlaWdodCA/IG1iaC0+aGVpZ2h0IDogMHhmZmZmOworICAgIGJlc3RlcnIgPSB3YW50eCArIHdhbnR5OworCisgICAgd2hpbGUgKChtb2RlID0gKm1vZGVfcHRyKyspICE9IDB4RkZGRikgeworCW1vZGUgJj0gMHgxRkY7CQkvKiBUaGUgcmVzdCBhcmUgYXR0cmlidXRlcyBvZiBzb3J0cyAqLworCisgICAgICAgIG1lbXNldCgmcm0sIDAsIHNpemVvZiBybSk7CisJbWVtc2V0KG1pLCAwLCBzaXplb2YgKm1pKTsKKwlybS5lYXgud1swXSA9IDB4NEYwMTsJLyogR2V0IFNWR0EgbW9kZSBpbmZvcm1hdGlvbiAqLworCXJtLmVjeC53WzBdID0gbW9kZTsKKwlybS5lZGkud1swXSA9IE9GRlMobWkpOworCXJtLmVzID0gU0VHKG1pKTsKKwlfX2ludGNhbGwoMHgxMCwgJnJtLCAmcm0pOworCisJLyogTXVzdCBiZSBhIHN1cHBvcnRlZCBtb2RlICovCisJaWYgKHJtLmVheC53WzBdICE9IDB4MDA0ZikKKwkgICAgY29udGludWU7CisKKwkvKiBNdXN0IGJlIGFuIExGQiBjb2xvciBncmFwaGljcyBtb2RlIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUuCisKKwkgICBUaGUgYml0cyB0ZXN0ZWQgYXJlOgorCSAgIDcgLSBsaW5lYXIgZnJhbWUgYnVmZmVyCisJICAgNCAtIGdyYXBoaWNzIG1vZGUKKwkgICAzIC0gY29sb3IgbW9kZQorCSAgIDEgLSBtb2RlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSAobWFuZGF0b3J5IGluIFZCRSAxLjIrKQorCSAgIDAgLSBtb2RlIHN1cHBvcnRlZCBieSBoYXJkd2FyZQorCSAqLworCWlmICgobWktPm1vZGVfYXR0ciAmIDB4MDA5YikgIT0gMHgwMDliKQorCSAgICBjb250aW51ZTsKKworCS8qIFdlIGRvbid0IHN1cHBvcnQgbXVsdGliYW5rIChpbnRlcmxhY2VkIG1lbW9yeSkgbW9kZXMgKi8KKwkvKgorCSAqICBOb3RlOiBUaGUgQm9jaHMgVkVTQSBCSU9TICh2YmUuYyAxLjU4IDIwMDYvMDgvMTkpIHZpb2xhdGVzIHRoZQorCSAqIHNwZWNpZmljYXRpb24gd2hpY2ggc3RhdGVzIHRoYXQgYmFua3MgPT0gMSBmb3IgdW5iYW5rZWQgbW9kZXM7CisJICogZm9ydHVuYXRlbHkgaXQgZG9lcyByZXBvcnQgYmFua19zaXplID09IDAgZm9yIHRob3NlLgorCSAqLworCWlmIChtaS0+YmFua3MgPiAxICYmIG1pLT5iYW5rX3NpemUpCisJICAgIGNvbnRpbnVlOworCisJLyogTXVzdCBlaXRoZXIgYmUgYSBwYWNrZWQtcGl4ZWwgbW9kZSBvciBhIGRpcmVjdCBjb2xvciBtb2RlCisJICAgKGRlcGVuZGluZyBvbiBWRVNBIHZlcnNpb24gKTsgbXVzdCBiZSBhIHN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgKi8KKworCWlmIChtaS0+YnBwID09IDMyICYmCisJICAgIChtaS0+bWVtb3J5X2xheW91dCA9PSA0IHx8CisJICAgICAobWktPm1lbW9yeV9sYXlvdXQgPT0gNiAmJiBtaS0+cnBvcyA9PSAxNiAmJiBtaS0+Z3BvcyA9PSA4ICYmCisJICAgICAgbWktPmJwb3MgPT0gMCkpKQorCSAgICBweGYgPSAzMjsKKwllbHNlIGlmIChtaS0+YnBwID09IDI0ICYmCisJCSAobWktPm1lbW9yeV9sYXlvdXQgPT0gNCB8fAorCQkgIChtaS0+bWVtb3J5X2xheW91dCA9PSA2ICYmIG1pLT5ycG9zID09IDE2ICYmIG1pLT5ncG9zID09IDggJiYKKwkJICAgbWktPmJwb3MgPT0gMCkpKQorCSAgICBweGYgPSAyNDsKKwllbHNlIGlmIChtaS0+YnBwID09IDE2ICYmCisJCSAobWktPm1lbW9yeV9sYXlvdXQgPT0gNCB8fAorCQkgIChtaS0+bWVtb3J5X2xheW91dCA9PSA2ICYmIG1pLT5ycG9zID09IDExICYmIG1pLT5ncG9zID09IDUgJiYKKwkJICAgbWktPmJwb3MgPT0gMCkpKQorCSAgICBweGYgPSAxNjsKKwllbHNlIGlmIChtaS0+YnBwID09IDE1ICYmCisJCSAobWktPm1lbW9yeV9sYXlvdXQgPT0gNCB8fAorCQkgIChtaS0+bWVtb3J5X2xheW91dCA9PSA2ICYmIG1pLT5ycG9zID09IDEwICYmIG1pLT5ncG9zID09IDUgJiYKKwkJICAgbWktPmJwb3MgPT0gMCkpKQorCSAgICBweGYgPSAxNTsKKwllbHNlCisJICAgIGNvbnRpbnVlOworCisJYmV0dGVyID0gZmFsc2U7CisJZXJyID0gYWJzKG1pLT5oX3JlcyAtIHdhbnR4KSArIGFicyhtaS0+dl9yZXMgLSB3YW50eSk7CisKKyNkZWZpbmUgSVNfR09PRChtaSwgYmVzdHgsIGJlc3R5KSBcCisJKChtaSktPmhfcmVzID49IChiZXN0eCkgJiYgKG1pKS0+dl9yZXMgPj0gKGJlc3R5KSkKKworCWlmICghYmVzdHB4ZikKKwkgICAgYmV0dGVyID0gdHJ1ZTsKKwllbHNlIGlmICghSVNfR09PRCgmdmVzYV9pbmZvLm1pLCB3YW50eCwgd2FudHkpICYmCisJCSBJU19HT09EKG1pLCB3YW50eCwgd2FudHkpKQorCSAgICAvKiBUaGlzIG1hdGNoZXMgY3JpdGVyaWEsIHdoaWNoIHRoZSBwcmV2aW91cyBvbmUgZGlkbid0ICovCisJICAgIGJldHRlciA9IHRydWU7CisJZWxzZSBpZiAoSVNfR09PRCgmdmVzYV9pbmZvLm1pLCB3YW50eCwgd2FudHkpICYmCisJCSAhSVNfR09PRChtaSwgd2FudHgsIHdhbnR5KSkKKwkgICAgLyogVGhpcyBkb2Vzbid0IG1hdGNoIGNyaXRlcmlhLCBhbmQgdGhlIHByZXZpb3VzIG9uZSBkaWQgKi8KKwkgICAgYmV0dGVyID0gZmFsc2U7CisJZWxzZSBpZiAoZXJyIDwgYmVzdGVycikKKwkgICAgYmV0dGVyID0gdHJ1ZTsKKwllbHNlIGlmIChlcnIgPT0gYmVzdGVyciAmJiAocHhmID09IChpbnQpbWJoLT5kZXB0aCB8fCBweGYgPiBiZXN0cHhmKSkKKwkgICAgYmV0dGVyID0gdHJ1ZTsKKworCWlmIChiZXR0ZXIpIHsKKwkgICAgYmVzdG1vZGUgPSBtb2RlOworCSAgICBiZXN0cHhmID0gcHhmOworCSAgICBtZW1jcHkoJnZlc2FfaW5mby5taSwgbWksIHNpemVvZiAqbWkpOworCX0KKyAgICB9CisKKyAgICBpZiAoIWJlc3RweGYpCisJZ290byBvdXQ7CQkvKiBObyBtb2RlIGZvdW5kICovCisKKyAgICBtaSA9ICZ2ZXNhX2luZm8ubWk7CisgICAgbW9kZSA9IGJlc3Rtb2RlOworCisgICAgLyogTm93IHNldCB2aWRlbyBtb2RlICovCisgICAgbWVtc2V0KCZybSwgMCwgc2l6ZW9mIHJtKTsKKyAgICBybS5lYXgud1swXSA9IDB4NEYwMjsJLyogU2V0IFNWR0EgdmlkZW8gbW9kZSAqLworICAgIG1vZGUgfD0gMHg0MDAwOwkJLyogUmVxdWVzdCBsaW5lYXIgZnJhbWVidWZmZXIgKi8KKyAgICBybS5lYngud1swXSA9IG1vZGU7CisgICAgX19pbnRjYWxsKDB4MTAsICZybSwgJnJtKTsKKyAgICBpZiAocm0uZWF4LndbMF0gIT0gMHgwMDRGKQorCWdvdG8gb3V0OwkJLyogRmFpbGVkIHRvIHNldCBtb2RlICovCisKKyAgICBtYmktPmZsYWdzIHw9IE1CX0lORk9fVklERU9fSU5GTzsKKyAgICBtYmktPnZiZV9tb2RlID0gbW9kZTsKKyAgICB2aWFkZHIgPSBtYXBfZGF0YSgmdmVzYV9pbmZvLCBzaXplb2YgdmVzYV9pbmZvLCA0LCAwKTsKKyAgICBtYmktPnZiZV9jb250cm9sX2luZm8gPSB2aWFkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgdmVzYV9pbmZvLCBnaSk7CisgICAgbWJpLT52YmVfbW9kZV9pbmZvID0gdmlhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZlc2FfaW5mbywgbWkpOworCisgICAgLyogR2V0IHRoZSBWQkUgMi54IFBNIGVudHJ5IHBvaW50IGlmIHN1cHBvcnRlZCAqLworICAgIHJtLmVheC53WzBdID0gMHg0RjBBOworICAgIHJtLmVieC53WzBdID0gMDsKKyAgICBfX2ludGNhbGwoMHgxMCwgJnJtLCAmcm0pOworICAgIGlmIChybS5lYXgud1swXSA9PSAweDAwNEYpIHsKKwltYmktPnZiZV9pbnRlcmZhY2Vfc2VnID0gcm0uZXM7CisJbWJpLT52YmVfaW50ZXJmYWNlX29mZiA9IHJtLmVkaS53WzBdOworCW1iaS0+dmJlX2ludGVyZmFjZV9sZW4gPSBybS5lY3gud1swXTsKKyAgICB9CisKKyAgICAvKiBJbiB0aGVvcnkgdGhpcyBzaG91bGQgYmU6CisgICAgICoKKyAgICAgKiBVc2luZ1ZnYSA9IChtaS0+bW9kZV9hdHRyICYgNCkgPyAweDAwMDcgOiAweDAwMGY7CisgICAgICoKKyAgICAgKiBIb3dldmVyLCB0aGF0IHdvdWxkIGFzc3VtZSBhbGwgc3lzdGVtcyB0aGF0IGNsYWltIHRvIGhhbmRsZSB0ZXh0CisgICAgICogb3V0cHV0IGluIFZFU0EgbW9kZXMgYWN0dWFsbHkgZG8gdGhhdC4uLgorICAgICAqLworICAgIGdyYXBoaWNzX3VzaW5nX3ZnYSgweDBGLCB2ZXNhX2luZm8ubWkuaF9yZXMsIHZlc2FfaW5mby5taS52X3Jlcyk7CisKK291dDoKKyAgICBsZnJlZShtaSk7CisgICAgbGZyZWUoZ2kpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbWJvb3QvbWFwLmMgYi9jb20zMi9tYm9vdC9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGYzYjIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbWJvb3QvbWFwLmMKQEAgLTAsMCArMSwzNTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1hcC5jCisgKgorICogRnVuY3Rpb25zIHRoYXQgZGVhbCB3aXRoIHRoZSBtZW1vcnkgbWFwIG9mIHZhcmlvdXMgb2JqZWN0cworICovCisKKyNpbmNsdWRlICJtYm9vdC5oIgorCitzdGF0aWMgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICptbCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbW1hcCA9IE5VTEwsICphbWFwID0gTlVMTDsKK3N0YXRpYyBhZGRyX3QgbWJvb3RfaGlnaF93YXRlcl9tYXJrID0gMHgxMDAwMDA7CisKKy8qCisgKiBOb3RlOiBhbHRob3VnaCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGluIHRoZSBzcGVjLCBhdCBsZWFzdCBYZW4gbWFrZXMKKyAqIGFzc3VtcHRpb25zIGFzIHRvIHdoZXJlIGluIHRoZSBtZW1vcnkgc3BhY2UgR3J1YiB3b3VsZCBoYXZlIGxvYWRlZAorICogY2VydGFpbiB0aGluZ3MuICBUbyBzdXBwb3J0IHRoYXQsIGlmICJoaWdoIiBpcyBzZXQsIHRoZW4gYWxsb2NhdGUgdGhpcworICogYXQgYW4gYWRkcmVzcyBzdHJpY3RseSBhYm92ZSBhbnkgcHJldmlvdXMgYWxsb2NhdGlvbnMuCisgKgorICogQXMgYSBwcmVjYXV0aW9uLCB0aGlzIGFsc28gcGFkcyB0aGUgZGF0YSB3aXRoIHplcm8gdXAgdG8gdGhlIG5leHQKKyAqIGFsaWdubWVudCBkYXR1bS4KKyAqLworYWRkcl90IG1hcF9kYXRhKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sIHNpemVfdCBhbGlnbiwgaW50IGZsYWdzKQoreworICAgIGFkZHJfdCBzdGFydCA9IChmbGFncyAmIE1BUF9ISUdIKSA/IG1ib290X2hpZ2hfd2F0ZXJfbWFyayA6IDB4MjAwMDsKKyAgICBhZGRyX3QgcGFkID0gKGZsYWdzICYgTUFQX05PUEFEKSA/IDAgOiAtbGVuICYgKGFsaWduIC0gMSk7CisgICAgYWRkcl90IHhsZW4gPSBsZW4gKyBwYWQ7CisKKyAgICBpZiAoc3lzbGludXhfbWVtbWFwX2ZpbmRfdHlwZShhbWFwLCBTTVRfRlJFRSwgJnN0YXJ0LCAmeGxlbiwgYWxpZ24pIHx8CisJc3lzbGludXhfYWRkX21lbW1hcCgmYW1hcCwgc3RhcnQsIGxlbiArIHBhZCwgU01UX0FMTE9DKSB8fAorCXN5c2xpbnV4X2FkZF9tb3ZlbGlzdCgmbWwsIHN0YXJ0LCAoYWRkcl90KSBkYXRhLCBsZW4pIHx8CisJKHBhZCAmJiBzeXNsaW51eF9hZGRfbWVtbWFwKCZtbWFwLCBzdGFydCArIGxlbiwgcGFkLCBTTVRfWkVSTykpKSB7CisJcHJpbnRmKCJDYW5ub3QgbWFwICV6dSBieXRlc1xuIiwgbGVuICsgcGFkKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBkcHJpbnRmKCJNYXBwaW5nIDB4JTA4eCBieXRlcyAoJSN4IHBhZCkgYXQgMHglMDh4XG4iLCBsZW4sIHBhZCwgc3RhcnQpOworCisgICAgaWYgKHN0YXJ0ICsgbGVuICsgcGFkID4gbWJvb3RfaGlnaF93YXRlcl9tYXJrKQorCW1ib290X2hpZ2hfd2F0ZXJfbWFyayA9IHN0YXJ0ICsgbGVuICsgcGFkOworCisgICAgcmV0dXJuIHN0YXJ0OworfQorCithZGRyX3QgbWFwX3N0cmluZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgaWYgKCFzdHJpbmcpCisJcmV0dXJuIDA7CisgICAgZWxzZQorCXJldHVybiBtYXBfZGF0YShzdHJpbmcsIHN0cmxlbihzdHJpbmcpICsgMSwgMSwgMCk7Cit9CisKK2ludCBpbml0X21hcCh2b2lkKQoreworICAgIC8qCisgICAgICogTm90ZTogbW1hcCBpcyB0aGUgbWVtb3J5IG1hcCAoY29udGFpbmluZyBmcmVlIGFuZCB6ZXJvZWQgcmVnaW9ucykKKyAgICAgKiBuZWVkZWQgYnkgc3lzbGludXhfc2h1ZmZsZV9ib290X3BtKCk7IGFtYXAgaXMgYSBtYXAgd2hlcmUgd2Uga2VlcAorICAgICAqIHRyYWNrIG91cnNlbHZlcyB3aGljaCB0YXJnZXQgbWVtb3J5IHJhbmdlcyBoYXZlIGFscmVhZHkgYmVlbgorICAgICAqIGFsbG9jYXRlZC4KKyAgICAgKi8KKyAgICBtbWFwID0gc3lzbGludXhfbWVtb3J5X21hcCgpOworICAgIGFtYXAgPSBzeXNsaW51eF9kdXBfbWVtbWFwKG1tYXApOworICAgIGlmICghbW1hcCB8fCAhYW1hcCkgeworCWVycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgaW5pdGlhbCBtZW1vcnkgbWFwIVxuIik7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGRwcmludGYoIkluaXRpYWwgbWVtb3J5IG1hcDpcbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbWVtbWFwKG1tYXApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBtdWx0aWJvb3RfaGVhZGVyICptYXBfaW1hZ2Uodm9pZCAqcHRyLCBzaXplX3QgbGVuKQoreworICAgIHN0cnVjdCBtdWx0aWJvb3RfaGVhZGVyICptYmg7CisgICAgaW50IG1iaF9sZW47CisgICAgY2hhciAqY3B0ciA9IHB0cjsKKyAgICBFbGYzMl9FaGRyICplaCA9IHB0cjsKKyAgICBFbGYzMl9QaGRyICpwaDsKKyAgICBFbGYzMl9TaGRyICpzaDsKKyAgICB1bnNpZ25lZCBpbnQgaSwgbWJoX29mZnNldDsKKyAgICB1aW50MzJfdCBiYWRfZmxhZ3M7CisKKyAgICAvKgorICAgICAqIFNlYXJjaCBmb3IgdGhlIG11bHRpYm9vdCBoZWFkZXIuLi4KKyAgICAgKi8KKyAgICBtYmhfbGVuID0gMDsKKyAgICBmb3IgKG1iaF9vZmZzZXQgPSAwOyBtYmhfb2Zmc2V0IDwgTVVMVElCT09UX1NFQVJDSDsgbWJoX29mZnNldCArPSA0KSB7CisJbWJoID0gKHN0cnVjdCBtdWx0aWJvb3RfaGVhZGVyICopKChjaGFyICopcHRyICsgbWJoX29mZnNldCk7CisJaWYgKG1iaC0+bWFnaWMgIT0gTVVMVElCT09UX01BR0lDKQorCSAgICBjb250aW51ZTsKKwlpZiAobWJoLT5tYWdpYyArIG1iaC0+ZmxhZ3MgKyBtYmgtPmNoZWNrc3VtKQorCSAgICBjb250aW51ZTsKKwlpZiAobWJoLT5mbGFncyAmIE1VTFRJQk9PVF9WSURFT19NT0RFKQorCSAgICBtYmhfbGVuID0gNDg7CisJZWxzZSBpZiAobWJoLT5mbGFncyAmIE1VTFRJQk9PVF9BT1VUX0tMVURHRSkKKwkgICAgbWJoX2xlbiA9IDMyOworCWVsc2UKKwkgICAgbWJoX2xlbiA9IDEyOworCisJaWYgKG1iaF9vZmZzZXQgKyBtYmhfbGVuID4gbGVuKQorCSAgICBtYmhfbGVuID0gMDsJLyogSW52YWxpZC4uLiAqLworCWVsc2UKKwkgICAgYnJlYWs7CQkvKiBGb3VuZCBzb21ldGhpbmcuLi4gKi8KKyAgICB9CisKKyAgICBpZiAobWJoX2xlbikgeworCWJhZF9mbGFncyA9IG1iaC0+ZmxhZ3MgJiBNVUxUSUJPT1RfVU5TVVBQT1JURUQ7CisJaWYgKGJhZF9mbGFncykgeworCSAgICBwcmludGYoIlVuc3VwcG9ydGVkIE11bHRpYm9vdCBmbGFncyBzZXQ6ICUjeFxuIiwgYmFkX2ZsYWdzKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAgIGlmIChsZW4gPCBzaXplb2YoRWxmMzJfRWhkcikgfHwKKwltZW1jbXAoZWgtPmVfaWRlbnQsICJceDdmIiAiRUxGXDFcMVwxIiwgNikgfHwKKwkoZWgtPmVfbWFjaGluZSAhPSBFTV8zODYgJiYgZWgtPmVfbWFjaGluZSAhPSBFTV80ODYgJiYKKwkgZWgtPmVfbWFjaGluZSAhPSBFTV9YODZfNjQpIHx8CisJZWgtPmVfdmVyc2lvbiAhPSBFVl9DVVJSRU5UIHx8CisJZWgtPmVfZWhzaXplIDwgc2l6ZW9mKEVsZjMyX0VoZHIpIHx8IGVoLT5lX2Voc2l6ZSA+PSBsZW4gfHwKKwllaC0+ZV9waGVudHNpemUgPCBzaXplb2YoRWxmMzJfUGhkcikgfHwKKwkhZWgtPmVfcGhudW0gfHwgZWgtPmVfcGhvZmYgKyBlaC0+ZV9waGVudHNpemUgKiBlaC0+ZV9waG51bSA+IGxlbikKKwllaCA9IE5VTEw7CQkvKiBObyB2YWxpZCBFTEYgaGVhZGVyIGZvdW5kICovCisKKyAgICAvKiBJcyB0aGlzIGEgU29sYXJpcyBrZXJuZWw/ICovCisgICAgaWYgKCFzZXQuc29sYXJpcyAmJiBlaCAmJiBrZXJuZWxfaXNfc29sYXJpcyhlaCkpCisJb3B0LnNvbGFyaXMgPSB0cnVlOworCisgICAgLyoKKyAgICAgKiBOb3RlOiB0aGUgTXVsdGlib290IFNwZWNpZmljYXRpb24gaW1wbGllcyB0aGF0IEFPVVRfS0xVREdFIHNob3VsZAorICAgICAqIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoZSBFTEYgaGVhZGVyLiAgSG93ZXZlciwgR3J1YiBkaXNhZ3JlZXMsIGFuZAorICAgICAqIEdydWIgaXMgInRoZSByZWZlcmVuY2UgYm9vdGxvYWRlciIgZm9yIHRoZSBNdWx0aWJvb3QgU3BlY2lmaWNhdGlvbi4KKyAgICAgKiBUaGlzIGlzIGluc2FuZSwgc2luY2UgaXQgbWFrZXMgdGhlIEFPVVRfS0xVREdFIGJpdCBmdW5jdGlvbmFsbHkKKyAgICAgKiB1c2VsZXNzLCBidXQgYXQgbGVhc3QgU29sYXJpcyBhcHBhcmVudGx5IGRlcGVuZHMgb24gdGhpcyBiZWhhdmlvci4KKyAgICAgKi8KKyAgICBpZiAoZWggJiYgIShvcHQuYW91dCAmJiBtYmhfbGVuICYmIChtYmgtPmZsYWdzICYgTVVMVElCT09UX0FPVVRfS0xVREdFKSkpIHsKKwlyZWdzLmVpcCA9IGVoLT5lX2VudHJ5OwkvKiBDYW4gYmUgb3ZlcnJpZGRlbiBmdXJ0aGVyIGRvd24uLi4gKi8KKworCXBoID0gKEVsZjMyX1BoZHIgKikgKGNwdHIgKyBlaC0+ZV9waG9mZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZWgtPmVfcGhudW07IGkrKykgeworCSAgICBpZiAocGgtPnBfdHlwZSA9PSBQVF9MT0FEIHx8IHBoLT5wX3R5cGUgPT0gUFRfUEhEUikgeworCQkvKgorCQkgKiBUaGlzIGxvYWRzIGF0IHBfcGFkZHIsIHdoaWNoIG1hdGNoZXMgR3J1Yi4gIEhvd2V2ZXIsIGlmCisJCSAqIGVfZW50cnkgZmFsbHMgd2l0aGluIHRoZSBwX3ZhZGRyIHJhbmdlIG9mIHRoaXMgUEhEUiwgdGhlbgorCQkgKiBhZGp1c3QgaXQgdG8gbWF0Y2ggdGhlIHBfcGFkZHIgcmFuZ2UuLi4gdGhpcyBpcyBob3cgR3J1YgorCQkgKiBiZWhhdmVzLCBzbyBpdCdzIGJ5IGRlZmluaXRpb24gY29ycmVjdCAoaXQgZG9lc24ndCBoYXZlIHRvCisJCSAqIG1ha2Ugc2Vuc2UuLi4pCisJCSAqLworCQlhZGRyX3QgYWRkciA9IHBoLT5wX3BhZGRyOworCQlhZGRyX3QgbXNpemUgPSBwaC0+cF9tZW1zejsKKwkJYWRkcl90IGRzaXplID0gbWluKG1zaXplLCBwaC0+cF9maWxlc3opOworCisJCWlmIChlaC0+ZV9lbnRyeSA+PSBwaC0+cF92YWRkcgorCQkgICAgJiYgZWgtPmVfZW50cnkgPCBwaC0+cF92YWRkciArIG1zaXplKQorCQkgICAgcmVncy5laXAgPSBlaC0+ZV9lbnRyeSArIChwaC0+cF9wYWRkciAtIHBoLT5wX3ZhZGRyKTsKKworCQlkcHJpbnRmKCJTZWdtZW50IGF0IDB4JTA4eCBkYXRhIDB4JTA4eCBsZW4gMHglMDh4XG4iLAorCQkJYWRkciwgZHNpemUsIG1zaXplKTsKKworCQlpZiAoc3lzbGludXhfbWVtbWFwX3R5cGUoYW1hcCwgYWRkciwgbXNpemUpICE9IFNNVF9GUkVFKSB7CisJCSAgICBwcmludGYKKwkJCSgiTWVtb3J5IHNlZ21lbnQgYXQgMHglMDh4IChsZW4gMHglMDh4KSBpcyB1bmF2YWlsYWJsZVxuIiwKKwkJCSBhZGRyLCBtc2l6ZSk7CisJCSAgICByZXR1cm4gTlVMTDsJLyogTWVtb3J5IHJlZ2lvbiB1bmF2YWlsYWJsZSAqLworCQl9CisKKwkJLyogTWFyayB0aGlzIHJlZ2lvbiBhcyBhbGxvY2F0ZWQgaW4gdGhlIGF2YWlsYWJsZSBtYXAgKi8KKwkJaWYgKHN5c2xpbnV4X2FkZF9tZW1tYXAoJmFtYXAsIGFkZHIsIG1zaXplLCBTTVRfQUxMT0MpKSB7CisJCSAgICBlcnJvcigiT3ZlcmxhcHBpbmcgc2VnbWVudHMgZm91bmQgaW4gRUxGIGhlYWRlclxuIik7CisJCSAgICByZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmIChwaC0+cF9maWxlc3opIHsKKwkJICAgIC8qIERhdGEgcHJlc2VudCByZWdpb24uICBDcmVhdGUgYSBtb3ZlIGVudHJ5IGZvciBpdC4gKi8KKwkJICAgIGlmIChzeXNsaW51eF9hZGRfbW92ZWxpc3QKKwkJCSgmbWwsIGFkZHIsIChhZGRyX3QpIGNwdHIgKyBwaC0+cF9vZmZzZXQsIGRzaXplKSkgeworCQkJZXJyb3IoIkZhaWxlZCB0byBtYXAgUEhEUiBkYXRhXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQkgICAgfQorCQl9CisJCWlmIChtc2l6ZSA+IGRzaXplKSB7CisJCSAgICAvKiBaZXJvLWZpbGxlZCByZWdpb24uICBNYXJrIGFzIGEgemVybyByZWdpb24gaW4gdGhlIG1lbW9yeSBtYXAuICovCisJCSAgICBpZiAoc3lzbGludXhfYWRkX21lbW1hcAorCQkJKCZtbWFwLCBhZGRyICsgZHNpemUsIG1zaXplIC0gZHNpemUsIFNNVF9aRVJPKSkgeworCQkJZXJyb3IoIkZhaWxlZCB0byBtYXAgUEhEUiB6ZXJvIHJlZ2lvblxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJICAgIH0KKwkJfQorCQlpZiAoYWRkciArIG1zaXplID4gbWJvb3RfaGlnaF93YXRlcl9tYXJrKQorCQkgICAgbWJvb3RfaGlnaF93YXRlcl9tYXJrID0gYWRkciArIG1zaXplOworCSAgICB9IGVsc2UgeworCQkvKiBJZ25vcmUgdGhpcyBwcm9ncmFtIGhlYWRlciAqLworCSAgICB9CisKKwkgICAgcGggPSAoRWxmMzJfUGhkciAqKSAoKGNoYXIgKilwaCArIGVoLT5lX3BoZW50c2l6ZSk7CisJfQorCisJLyogTG9hZCB0aGUgRUxGIHN5bWJvbCB0YWJsZSAqLworCWlmIChlaC0+ZV9zaG9mZikgeworCSAgICBhZGRyX3QgYWRkciwgbGVuOworCisJICAgIHNoID0gKEVsZjMyX1NoZHIgKikgKChjaGFyICopZWggKyBlaC0+ZV9zaG9mZik7CisKKwkgICAgbGVuID0gZWgtPmVfc2hlbnRzaXplICogZWgtPmVfc2hudW07CisJICAgIC8qCisJICAgICAqIEFsaWduIHRoaXMsIGJ1dCBkb24ndCBwYWQgLS0gaW4gZ2VuZXJhbCB0aGlzIG1lYW5zIGEgYnVuY2ggb2YKKwkgICAgICogc21hbGxlciBzZWN0aW9ucyBnZXRzIHBhY2tlZCBpbnRvIGEgc2luZ2xlIHBhZ2UuCisJICAgICAqLworCSAgICBhZGRyID0gbWFwX2RhdGEoc2gsIGxlbiwgNDA5NiwgTUFQX0hJR0ggfCBNQVBfTk9QQUQpOworCSAgICBpZiAoIWFkZHIpIHsKKwkJZXJyb3IoIkZhaWxlZCB0byBtYXAgc3ltYm9sIHRhYmxlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJICAgIH0KKworCSAgICBtYmluZm8uZmxhZ3MgfD0gTUJfSU5GT19FTEZfU0hEUjsKKwkgICAgbWJpbmZvLnN5bXMuZS5hZGRyID0gYWRkcjsKKwkgICAgbWJpbmZvLnN5bXMuZS5udW0gPSBlaC0+ZV9zaG51bTsKKwkgICAgbWJpbmZvLnN5bXMuZS5zaXplID0gZWgtPmVfc2hlbnRzaXplOworCSAgICBtYmluZm8uc3ltcy5lLnNobmR4ID0gZWgtPmVfc2hzdHJuZHg7CisKKwkgICAgZm9yIChpID0gMDsgaSA8IGVoLT5lX3NobnVtOyBpKyspIHsKKwkJYWRkcl90IGFsaWduOworCisJCWlmICghc2hbaV0uc2hfc2l6ZSkKKwkJICAgIGNvbnRpbnVlOwkvKiBFbXB0eSBzZWN0aW9uICovCisJCWlmIChzaFtpXS5zaF9mbGFncyAmIFNIRl9BTExPQykKKwkJICAgIGNvbnRpbnVlOwkvKiBTSEZfQUxMT0Mgc2VjdGlvbnMgc2hvdWxkIGhhdmUgUEhEUnMgKi8KKworCQlhbGlnbiA9IHNoW2ldLnNoX2FkZHJhbGlnbiA/IHNoW2ldLnNoX2FkZHJhbGlnbiA6IDA7CisJCWFkZHIgPSBtYXBfZGF0YSgoY2hhciAqKXB0ciArIHNoW2ldLnNoX29mZnNldCwgc2hbaV0uc2hfc2l6ZSwKKwkJCQlhbGlnbiwgTUFQX0hJR0gpOworCQlpZiAoIWFkZHIpIHsKKwkJICAgIGVycm9yKCJGYWlsZWQgdG8gbWFwIHN5bWJvbCBzZWN0aW9uXG4iKTsKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisJCXNoW2ldLnNoX2FkZHIgPSBhZGRyOworCSAgICB9CisJfQorICAgIH0gZWxzZSBpZiAobWJoX2xlbiAmJiAobWJoLT5mbGFncyAmIE1VTFRJQk9PVF9BT1VUX0tMVURHRSkpIHsKKwkvKgorCSAqIGEub3V0IGtsdWRnZSB0aGluZy4uLgorCSAqLworCWNoYXIgKmRhdGFfcHRyOworCWFkZHJfdCBkYXRhX2xlbiwgYnNzX2xlbjsKKwlhZGRyX3QgYnNzX2FkZHI7CisKKwlyZWdzLmVpcCA9IG1iaC0+ZW50cnlfYWRkcjsKKworCWRhdGFfcHRyID0gKGNoYXIgKiltYmggLSAobWJoLT5oZWFkZXJfYWRkciAtIG1iaC0+bG9hZF9hZGRyKTsKKworCWlmIChtYmgtPmxvYWRfZW5kX2FkZHIpCisJICAgIGRhdGFfbGVuID0gbWJoLT5sb2FkX2VuZF9hZGRyIC0gbWJoLT5sb2FkX2FkZHI7CisJZWxzZQorCSAgICBkYXRhX2xlbiA9IGxlbiAtIG1iaF9vZmZzZXQgKyAobWJoLT5oZWFkZXJfYWRkciAtIG1iaC0+bG9hZF9hZGRyKTsKKworCWJzc19hZGRyID0gbWJoLT5sb2FkX2FkZHIgKyBkYXRhX2xlbjsKKworCWlmIChtYmgtPmJzc19lbmRfYWRkcikKKwkgICAgYnNzX2xlbiA9IG1iaC0+YnNzX2VuZF9hZGRyIC0gbWJoLT5sb2FkX2VuZF9hZGRyOworCWVsc2UKKwkgICAgYnNzX2xlbiA9IDA7CisKKwlpZiAoc3lzbGludXhfbWVtbWFwX3R5cGUoYW1hcCwgbWJoLT5sb2FkX2FkZHIsIGRhdGFfbGVuICsgYnNzX2xlbikKKwkgICAgIT0gU01UX0ZSRUUpIHsKKwkgICAgcHJpbnRmKCJNZW1vcnkgc2VnbWVudCBhdCAweCUwOHggKGxlbiAweCUwOHgpIGlzIHVuYXZhaWxhYmxlXG4iLAorCQkgICBtYmgtPmxvYWRfYWRkciwgZGF0YV9sZW4gKyBic3NfbGVuKTsKKwkgICAgcmV0dXJuIE5VTEw7CQkvKiBNZW1vcnkgcmVnaW9uIHVuYXZhaWxhYmxlICovCisJfQorCWlmIChzeXNsaW51eF9hZGRfbWVtbWFwKCZhbWFwLCBtYmgtPmxvYWRfYWRkciwKKwkJCQlkYXRhX2xlbiArIGJzc19sZW4sIFNNVF9BTExPQykpIHsKKwkgICAgZXJyb3IoIkZhaWxlZCB0byBjbGFpbSBhLm91dCBhZGRyZXNzIHNwYWNlIVxuIik7CisJICAgIHJldHVybiBOVUxMOworCX0KKwlpZiAoZGF0YV9sZW4pCisJICAgIGlmIChzeXNsaW51eF9hZGRfbW92ZWxpc3QoJm1sLCBtYmgtPmxvYWRfYWRkciwgKGFkZHJfdCkgZGF0YV9wdHIsCisJCQkJICAgICAgZGF0YV9sZW4pKSB7CisJCWVycm9yKCJGYWlsZWQgdG8gbWFwIGEub3V0IGRhdGFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwkgICAgfQorCWlmIChic3NfbGVuKQorCSAgICBpZiAoc3lzbGludXhfYWRkX21lbW1hcAorCQkoJm1tYXAsIGJzc19hZGRyLCBic3NfbGVuLCBTTVRfWkVSTykpIHsKKwkJZXJyb3IoIkZhaWxlZCB0byBtYXAgYS5vdXQgYnNzXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJICAgIH0KKwlpZiAoYnNzX2FkZHIgKyBic3NfbGVuID4gbWJvb3RfaGlnaF93YXRlcl9tYXJrKQorCSAgICBtYm9vdF9oaWdoX3dhdGVyX21hcmsgPSBic3NfYWRkciArIGJzc19sZW47CisgICAgfSBlbHNlIHsKKwllcnJvcgorCSAgICAoIkludmFsaWQgTXVsdGlib290IGltYWdlOiBuZWl0aGVyIEVMRiBoZWFkZXIgbm9yIGEub3V0IGtsdWRnZSBmb3VuZFxuIik7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG1iaDsKK30KKworLyoKKyAqIFNldCB1cCBhIHN0YWNrLiAgVGhpcyBpc24ndCBhY3R1YWxseSByZXF1aXJlZCBieSB0aGUgc3BlYywgYnV0IGl0IHNlZW1zCisgKiBsaWtlIGEgcHJ1ZGVudCB0aGluZyB0byBkby4gIEFsc28sIHB1dCBlbm91Z2ggemVyb3MgYXQgdGhlIHRvcCBvZiB0aGUKKyAqIHN0YWNrIHRoYXQgc29tZXRoaW5nIHRoYXQgbG9va3MgZm9yIGFuIEVMRiBpbnZvY2F0aW9uIHJlY29yZCB3aWxsIGtub3cKKyAqIHRoZXJlIGlzbid0IG9uZS4KKyAqLworc3RhdGljIHZvaWQgbWJvb3RfbWFwX3N0YWNrKHZvaWQpCit7CisgICAgYWRkcl90IHN0YXJ0LCBsZW47CisKKyAgICBpZiAoc3lzbGludXhfbWVtbWFwX2xhcmdlc3QoYW1hcCwgU01UX0ZSRUUsICZzdGFydCwgJmxlbikgfHwgbGVuIDwgNjQpCisJcmV0dXJuOwkJCS8qIE5vdCBtdWNoIHdlIGNhbiBkbywgaGVyZS4uLiAqLworCisgICAgcmVncy5lc3AgPSAoc3RhcnQgKyBsZW4gLSAzMikgJiB+MTU7CisgICAgZHByaW50ZigiTWFwcGluZyBzdGFjayBhdCAweCUwOHhcbiIsIHJlZ3MuZXNwKTsKKyAgICBzeXNsaW51eF9hZGRfbWVtbWFwKCZtbWFwLCByZWdzLmVzcCwgMzIsIFNNVF9aRVJPKTsKK30KKwordm9pZCBtYm9vdF9ydW4oaW50IGJvb3RmbGFncykKK3sKKyAgICBtYm9vdF9tYXBfc3RhY2soKTsKKworICAgIGRwcmludGYoIlJ1bm5pbmcsIGVpcCA9IDB4JTA4eCwgZWJ4ID0gMHglMDh4XG4iLCByZWdzLmVpcCwgcmVncy5lYngpOworCisgICAgcmVncy5lYXggPSBNVUxUSUJPT1RfVkFMSUQ7CisgICAgc3lzbGludXhfc2h1ZmZsZV9ib290X3BtKG1sLCBtbWFwLCBib290ZmxhZ3MsICZyZWdzKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21ib290L21iX2hlYWRlci5oIGIvY29tMzIvbWJvb3QvbWJfaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyNmQzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21ib290L21iX2hlYWRlci5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMCAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBNQk9PVF9NQl9IRUFERVJfSAorI2RlZmluZSBNQk9PVF9NQl9IRUFERVJfSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworLyoKKyAqICBNdWx0aUJvb3QgSGVhZGVyIGRlc2NyaXB0aW9uCisgKi8KKworc3RydWN0IG11bHRpYm9vdF9oZWFkZXIgeworICAgIC8qIE11c3QgYmUgTVVMVElCT09UX01BR0lDIC0gc2VlIGJlbG93LiAgKi8KKyAgICB1aW50MzJfdCBtYWdpYzsKKworICAgIC8qIEZlYXR1cmUgZmxhZ3MgLSBzZWUgYmVsb3cuICAqLworICAgIHVpbnQzMl90IGZsYWdzOworCisgICAgLyoKKyAgICAgKiBDaGVja3N1bQorICAgICAqCisgICAgICogVGhlIGFib3ZlIGZpZWxkcyBwbHVzIHRoaXMgb25lIG11c3QgZXF1YWwgMCBtb2QgMl4zMi4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBjaGVja3N1bTsKKworICAgIC8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGlmIE1VTFRJQk9PVF9BT1VUX0tMVURHRSBpcyBzZXQuICAqLworICAgIHVpbnQzMl90IGhlYWRlcl9hZGRyOworICAgIHVpbnQzMl90IGxvYWRfYWRkcjsKKyAgICB1aW50MzJfdCBsb2FkX2VuZF9hZGRyOworICAgIHVpbnQzMl90IGJzc19lbmRfYWRkcjsKKyAgICB1aW50MzJfdCBlbnRyeV9hZGRyOworCisgICAgLyogVGhlc2UgYXJlIG9ubHkgdmFsaWQgaWYgTVVMVElCT09UX1ZJREVPX01PREUgaXMgc2V0LiAgKi8KKyAgICB1aW50MzJfdCBtb2RlX3R5cGU7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGRlcHRoOworfTsKKworLyoKKyAqIFRoZSBlbnRpcmUgbXVsdGlib290X2hlYWRlciBtdXN0IGJlIGNvbnRhaW5lZAorICogd2l0aGluIHRoZSBmaXJzdCBNVUxUSUJPT1RfU0VBUkNIIGJ5dGVzIG9mIHRoZSBrZXJuZWwgaW1hZ2UuCisgKi8KKyNkZWZpbmUgTVVMVElCT09UX1NFQVJDSAkJODE5MgorCisvKiBNYWdpYyB2YWx1ZSBpZGVudGlmeWluZyB0aGUgbXVsdGlib290X2hlYWRlci4gICovCisjZGVmaW5lIE1VTFRJQk9PVF9NQUdJQwkJCTB4MUJBREIwMDIKKworLyoKKyAqIEZlYXR1cmVzIGZsYWdzIGZvciAnZmxhZ3MnLgorICogSWYgYSBib290IGxvYWRlciBzZWVzIGEgZmxhZyBpbiBNVUxUSUJPT1RfTVVTVEtOT1cgc2V0CisgKiBhbmQgaXQgZG9lc24ndCB1bmRlcnN0YW5kIGl0LCBpdCBtdXN0IGZhaWwuCisgKi8KKyNkZWZpbmUgTVVMVElCT09UX01VU1RLTk9XCQkweDAwMDBGRkZGCisKKy8qIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBmbGFncy4uLiAgdGhpcyBpcyBhIGtpbmQgb2YgdmVyc2lvbiBudW1iZXIuICAqLworI2RlZmluZSBNVUxUSUJPT1RfVU5TVVBQT1JURUQJCTB4MDAwMEZGRjgKKworLyogQWxpZ24gYWxsIGJvb3QgbW9kdWxlcyBvbiBpMzg2IHBhZ2UgKDRLQikgYm91bmRhcmllcy4gICovCisjZGVmaW5lIE1VTFRJQk9PVF9QQUdFX0FMSUdOCQkweDAwMDAwMDAxCisKKy8qIE11c3QgcGFzcyBtZW1vcnkgaW5mb3JtYXRpb24gdG8gT1MuICAqLworI2RlZmluZSBNVUxUSUJPT1RfTUVNT1JZX0lORk8JCTB4MDAwMDAwMDIKKworLyogTXVzdCBwYXNzIHZpZGVvIGluZm9ybWF0aW9uIHRvIE9TLiAgKi8KKyNkZWZpbmUgTVVMVElCT09UX1ZJREVPX01PREUJCTB4MDAwMDAwMDQKKworLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGUgdXNlIG9mIHRoZSBhZGRyZXNzIGZpZWxkcyBpbiB0aGUgaGVhZGVyLiAgKi8KKyNkZWZpbmUgTVVMVElCT09UX0FPVVRfS0xVREdFCQkweDAwMDEwMDAwCisKKyNlbmRpZiAvKiBNQk9PVF9NQl9IRUFERVJfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbWJvb3QvbWJfaW5mby5oIGIvY29tMzIvbWJvb3QvbWJfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2E3MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tYm9vdC9tYl9pbmZvLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogIFRoZSBzdHJ1Y3R1cmUgdHlwZSAibW9kX2xpc3QiIGlzIHVzZWQgYnkgdGhlICJtdWx0aWJvb3RfaW5mbyIgc3RydWN0dXJlLgorICovCisKKyNpZm5kZWYgTUJPT1RfTUJfSU5GT19ICisjZGVmaW5lIE1CT09UX01CX0lORk9fSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworc3RydWN0IG1vZF9saXN0IHsKKyAgICAvKiB0aGUgbWVtb3J5IHVzZWQgZ29lcyBmcm9tIGJ5dGVzICdtb2Rfc3RhcnQnIHRvICdtb2RfZW5kLTEnIGluY2x1c2l2ZSAqLworICAgIHVpbnQzMl90IG1vZF9zdGFydDsKKyAgICB1aW50MzJfdCBtb2RfZW5kOworCisgICAgLyogTW9kdWxlIGNvbW1hbmQgbGluZSAqLworICAgIHVpbnQzMl90IGNtZGxpbmU7CisKKyAgICAvKiBwYWRkaW5nIHRvIHRha2UgaXQgdG8gMTYgYnl0ZXMgKG11c3QgYmUgemVybykgKi8KKyAgICB1aW50MzJfdCBwYWQ7Cit9OworCisvKgorICogIElOVC0xNSwgQVg9RTgyMCBzdHlsZSAiQWRkcmVzc1JhbmdlRGVzY3JpcHRvciIKKyAqICAuLi53aXRoIGEgInNpemUiIHBhcmFtZXRlciBvbiB0aGUgZnJvbnQgd2hpY2ggaXMgdGhlIHN0cnVjdHVyZSBzaXplIC0gNCwKKyAqICBwb2ludGluZyB0byB0aGUgbmV4dCBvbmUsIHVwIHVudGlsIHRoZSBmdWxsIGJ1ZmZlciBsZW5ndGggb2YgdGhlIG1lbW9yeQorICogIG1hcCBoYXMgYmVlbiByZWFjaGVkLgorICovCisKK3N0cnVjdCBBZGRyUmFuZ2VEZXNjIHsKKyAgICB1aW50MzJfdCBzaXplOworICAgIHVpbnQ2NF90IEJhc2VBZGRyOworICAgIHVpbnQ2NF90IExlbmd0aDsKKyAgICB1aW50MzJfdCBUeXBlOworICAgIC8qIHVuc3BlY2lmaWVkIG9wdGlvbmFsIHBhZGRpbmcuLi4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiB1c2FibGUgbWVtb3J5ICJUeXBlIiwgYWxsIG90aGVycyBhcmUgcmVzZXJ2ZWQuICAqLworI2RlZmluZSBNQl9BUkRfTUVNT1JZCQkxCisKKy8qIERyaXZlIEluZm8gc3RydWN0dXJlLiAgKi8KK3N0cnVjdCBkcml2ZV9pbmZvIHsKKyAgICAvKiBUaGUgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCisgICAgdWludDMyX3Qgc2l6ZTsKKworICAgIC8qIFRoZSBCSU9TIGRyaXZlIG51bWJlci4gICovCisgICAgdWludDhfdCBkcml2ZV9udW1iZXI7CisKKyAgICAvKiBUaGUgYWNjZXNzIG1vZGUgKHNlZSBiZWxvdykuICAqLworICAgIHVpbnQ4X3QgZHJpdmVfbW9kZTsKKworICAgIC8qIFRoZSBCSU9TIGdlb21ldHJ5LiAgKi8KKyAgICB1aW50MTZfdCBkcml2ZV9jeWxpbmRlcnM7CisgICAgdWludDhfdCBkcml2ZV9oZWFkczsKKyAgICB1aW50OF90IGRyaXZlX3NlY3RvcnM7CisKKyAgICAvKiBUaGUgYXJyYXkgb2YgSS9PIHBvcnRzIHVzZWQgZm9yIHRoZSBkcml2ZS4gICovCisgICAgdWludDE2X3QgZHJpdmVfcG9ydHNbMF07Cit9OworCisvKiBEcml2ZSBNb2RlLiAgKi8KKyNkZWZpbmUgTUJfRElfQ0hTX01PREUJCTAKKyNkZWZpbmUgTUJfRElfTEJBX01PREUJCTEKKworLyogQVBNIEJJT1MgaW5mby4gICovCitzdHJ1Y3QgYXBtX2luZm8geworICAgIHVpbnQxNl90IHZlcnNpb247CisgICAgdWludDE2X3QgY3NlZzsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDE2X3QgY3NlZ18xNjsKKyAgICB1aW50MTZfdCBkc2VnXzE2OworICAgIHVpbnQxNl90IGNzZWdfbGVuOworICAgIHVpbnQxNl90IGNzZWdfMTZfbGVuOworICAgIHVpbnQxNl90IGRzZWdfMTZfbGVuOworfTsKKworLyoKKyAqICBNdWx0aUJvb3QgSW5mbyBkZXNjcmlwdGlvbgorICoKKyAqICBUaGlzIGlzIHRoZSBzdHJ1Y3QgcGFzc2VkIHRvIHRoZSBib290IGltYWdlLiAgVGhpcyBpcyBkb25lIGJ5IHBsYWNpbmcKKyAqICBpdHMgYWRkcmVzcyBpbiB0aGUgRUFYIHJlZ2lzdGVyLgorICovCisKK3N0cnVjdCBtdWx0aWJvb3RfaW5mbyB7CisgICAgLyogTXVsdGlCb290IGluZm8gdmVyc2lvbiBudW1iZXIgKi8KKyAgICB1aW50MzJfdCBmbGFnczsKKworICAgIC8qIEF2YWlsYWJsZSBtZW1vcnkgZnJvbSBCSU9TICovCisgICAgdWludDMyX3QgbWVtX2xvd2VyOworICAgIHVpbnQzMl90IG1lbV91cHBlcjsKKworICAgIC8qICJyb290IiBwYXJ0aXRpb24gKi8KKyAgICB1aW50MzJfdCBib290X2RldmljZTsKKworICAgIC8qIEtlcm5lbCBjb21tYW5kIGxpbmUgKi8KKyAgICB1aW50MzJfdCBjbWRsaW5lOworCisgICAgLyogQm9vdC1Nb2R1bGUgbGlzdCAqLworICAgIHVpbnQzMl90IG1vZHNfY291bnQ7CisgICAgdWludDMyX3QgbW9kc19hZGRyOworCisgICAgdW5pb24geworCXN0cnVjdCB7CisJICAgIC8qIChhLm91dCkgS2VybmVsIHN5bWJvbCB0YWJsZSBpbmZvICovCisJICAgIHVpbnQzMl90IHRhYnNpemU7CisJICAgIHVpbnQzMl90IHN0cnNpemU7CisJICAgIHVpbnQzMl90IGFkZHI7CisJICAgIHVpbnQzMl90IHBhZDsKKwl9IGE7CisJc3RydWN0IHsKKwkgICAgLyogKEVMRikgS2VybmVsIHNlY3Rpb24gaGVhZGVyIHRhYmxlICovCisJICAgIHVpbnQzMl90IG51bTsKKwkgICAgdWludDMyX3Qgc2l6ZTsKKwkgICAgdWludDMyX3QgYWRkcjsKKwkgICAgdWludDMyX3Qgc2huZHg7CisJfSBlOworICAgIH0gc3ltczsKKworICAgIC8qIE1lbW9yeSBNYXBwaW5nIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IG1tYXBfbGVuZ3RoOworICAgIHVpbnQzMl90IG1tYXBfYWRkcjsKKworICAgIC8qIERyaXZlIEluZm8gYnVmZmVyICovCisgICAgdWludDMyX3QgZHJpdmVzX2xlbmd0aDsKKyAgICB1aW50MzJfdCBkcml2ZXNfYWRkcjsKKworICAgIC8qIFJPTSBjb25maWd1cmF0aW9uIHRhYmxlICovCisgICAgdWludDMyX3QgY29uZmlnX3RhYmxlOworCisgICAgLyogQm9vdCBMb2FkZXIgTmFtZSAqLworICAgIHVpbnQzMl90IGJvb3RfbG9hZGVyX25hbWU7CisKKyAgICAvKiBBUE0gdGFibGUgKi8KKyAgICB1aW50MzJfdCBhcG1fdGFibGU7CisKKyAgICAvKiBWaWRlbyAqLworICAgIHVpbnQzMl90IHZiZV9jb250cm9sX2luZm87CisgICAgdWludDMyX3QgdmJlX21vZGVfaW5mbzsKKyAgICB1aW50MTZfdCB2YmVfbW9kZTsKKyAgICB1aW50MTZfdCB2YmVfaW50ZXJmYWNlX3NlZzsKKyAgICB1aW50MTZfdCB2YmVfaW50ZXJmYWNlX29mZjsKKyAgICB1aW50MTZfdCB2YmVfaW50ZXJmYWNlX2xlbjsKK307CisKKy8qCisgKiAgRmxhZ3MgdG8gYmUgc2V0IGluIHRoZSAnZmxhZ3MnIHBhcmFtZXRlciBhYm92ZQorICovCisKKy8qIGlzIHRoZXJlIGJhc2ljIGxvd2VyL3VwcGVyIG1lbW9yeSBpbmZvcm1hdGlvbj8gKi8KKyNkZWZpbmUgTUJfSU5GT19NRU1PUlkJCQkweDAwMDAwMDAxCisvKiBpcyB0aGVyZSBhIGJvb3QgZGV2aWNlIHNldD8gKi8KKyNkZWZpbmUgTUJfSU5GT19CT09UREVWCQkJMHgwMDAwMDAwMgorLyogaXMgdGhlIGNvbW1hbmQtbGluZSBkZWZpbmVkPyAqLworI2RlZmluZSBNQl9JTkZPX0NNRExJTkUJCQkweDAwMDAwMDA0CisvKiBhcmUgdGhlcmUgbW9kdWxlcyB0byBkbyBzb21ldGhpbmcgd2l0aD8gKi8KKyNkZWZpbmUgTUJfSU5GT19NT0RTCQkJMHgwMDAwMDAwOAorCisvKiBUaGVzZSBuZXh0IHR3byBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisKKy8qIGlzIHRoZXJlIGEgc3ltYm9sIHRhYmxlIGxvYWRlZD8gKi8KKyNkZWZpbmUgTUJfSU5GT19BT1VUX1NZTVMJCTB4MDAwMDAwMTAKKy8qIGlzIHRoZXJlIGFuIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZT8gKi8KKyNkZWZpbmUgTUJfSU5GT19FTEZfU0hEUgkJMHgwMDAwMDAyMAorCisvKiBpcyB0aGVyZSBhIGZ1bGwgbWVtb3J5IG1hcD8gKi8KKyNkZWZpbmUgTUJfSU5GT19NRU1fTUFQCQkJMHgwMDAwMDA0MAorCisvKiBJcyB0aGVyZSBkcml2ZSBpbmZvPyAgKi8KKyNkZWZpbmUgTUJfSU5GT19EUklWRV9JTkZPCQkweDAwMDAwMDgwCisKKy8qIElzIHRoZXJlIGEgY29uZmlnIHRhYmxlPyAgKi8KKyNkZWZpbmUgTUJfSU5GT19DT05GSUdfVEFCTEUJCTB4MDAwMDAxMDAKKworLyogSXMgdGhlcmUgYSBib290IGxvYWRlciBuYW1lPyAgKi8KKyNkZWZpbmUgTUJfSU5GT19CT09UX0xPQURFUl9OQU1FCTB4MDAwMDAyMDAKKworLyogSXMgdGhlcmUgYSBBUE0gdGFibGU/ICAqLworI2RlZmluZSBNQl9JTkZPX0FQTV9UQUJMRQkJMHgwMDAwMDQwMAorCisvKiBJcyB0aGVyZSB2aWRlbyBpbmZvcm1hdGlvbj8gICovCisjZGVmaW5lIE1CX0lORk9fVklERU9fSU5GTwkJMHgwMDAwMDgwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgdmFsdWUgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBFQVggcmVnaXN0ZXIuCisgKi8KKworI2RlZmluZSBNVUxUSUJPT1RfVkFMSUQJCQkweDJCQURCMDAyCisKKyNlbmRpZiAvKiBNQk9PVF9NQl9JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL21ib290L21ib290LmMgYi9jb20zMi9tYm9vdC9tYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTY3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tYm9vdC9tYm9vdC5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBtYm9vdC5jCisgKgorICogTW9kdWxlIHRvIGxvYWQgYSBtdWx0aWJvb3Qga2VybmVsCisgKi8KKworI2luY2x1ZGUgIm1ib290LmgiCisKK3N0cnVjdCBtdWx0aWJvb3RfaW5mbyBtYmluZm87CitzdHJ1Y3Qgc3lzbGludXhfcG1fcmVncyByZWdzOworc3RydWN0IG15X29wdGlvbnMgb3B0LCBzZXQ7CisKK3N0cnVjdCBtb2R1bGVfZGF0YSB7CisgICAgdm9pZCAqZGF0YTsKKyAgICBzaXplX3QgbGVuOworICAgIGNvbnN0IGNoYXIgKmNtZGxpbmU7Cit9OworCitzdGF0aWMgaW50IG1hcF9tb2R1bGVzKHN0cnVjdCBtb2R1bGVfZGF0YSAqbW9kdWxlcywgaW50IG5tb2R1bGVzKQoreworICAgIHN0cnVjdCBtb2RfbGlzdCAqbW9kX2xpc3Q7CisgICAgYWRkcl90IG1hcF9saXN0ID0gMDsKKyAgICBzaXplX3QgbGlzdF9zaXplID0gbm1vZHVsZXMgKiBzaXplb2YgKm1vZF9saXN0OworICAgIGludCBpOworCisgICAgbW9kX2xpc3QgPSBtYWxsb2MobGlzdF9zaXplKTsKKyAgICBpZiAoIW1vZF9saXN0KSB7CisJcHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgbW9kdWxlIGxpc3RcbiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBtYXBfbGlzdCA9IG1hcF9kYXRhKG1vZF9saXN0LCBsaXN0X3NpemUsIDE2LCAwKTsKKyAgICBpZiAoIW1hcF9saXN0KSB7CisJcHJpbnRmKCJDYW5ub3QgbWFwIG1vZHVsZSBsaXN0XG4iKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5tb2R1bGVzOyBpKyspIHsKKwlhZGRyX3QgbW9kX21hcCA9IDA7CisJYWRkcl90IGNtZF9tYXAgPSAwOworCisJZHByaW50ZigiTW9kdWxlICVkIGNtZGxpbmU6IFwiJXNcIlxuIiwgaSwgbW9kdWxlc1tpXS5jbWRsaW5lKTsKKworCWNtZF9tYXAgPSBtYXBfc3RyaW5nKG1vZHVsZXNbaV0uY21kbGluZSk7CisKKwltb2RfbWFwID0gbWFwX2RhdGEobW9kdWxlc1tpXS5kYXRhLCBtb2R1bGVzW2ldLmxlbiwgNDA5NiwgTUFQX0hJR0gpOworCWlmICghbW9kX21hcCkgeworCSAgICBwcmludGYoIkZhaWxlZCB0byBtYXAgbW9kdWxlIChtZW1vcnkgZnJhZ21lbnRhdGlvbiBpc3N1ZT8pXG4iKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwltb2RfbGlzdFtpXS5tb2Rfc3RhcnQgPSBtb2RfbWFwOworCW1vZF9saXN0W2ldLm1vZF9lbmQgPSBtb2RfbWFwICsgbW9kdWxlc1tpXS5sZW47CisJbW9kX2xpc3RbaV0uY21kbGluZSA9IGNtZF9tYXA7CisJbW9kX2xpc3RbaV0ucGFkID0gMDsKKyAgICB9CisKKyAgICBtYmluZm8uZmxhZ3MgfD0gTUJfSU5GT19NT0RTOworICAgIG1iaW5mby5tb2RzX2NvdW50ID0gbm1vZHVsZXM7CisgICAgbWJpbmZvLm1vZHNfYWRkciA9IG1hcF9saXN0OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9tb2R1bGVzKGNoYXIgKiphcmd2LCBzdHJ1Y3QgbW9kdWxlX2RhdGEgKiptZHApCit7CisgICAgY2hhciAqKmFyZ3AsICoqYXJneDsKKyAgICBzdHJ1Y3QgbW9kdWxlX2RhdGEgKm1wOworICAgIGludCBydjsKKyAgICBpbnQgbW9kdWxlX2NvdW50ID0gMTsKKyAgICBpbnQgYXJnbGVuOworICAgIGNvbnN0IGNoYXIgbW9kdWxlX3NlcGFyYXRvcltdID0gIi0tLSI7CisKKyAgICBmb3IgKGFyZ3AgPSBhcmd2OyAqYXJncDsgYXJncCsrKSB7CisJaWYgKCFzdHJjbXAoKmFyZ3AsIG1vZHVsZV9zZXBhcmF0b3IpKQorCSAgICBtb2R1bGVfY291bnQrKzsKKyAgICB9CisKKyAgICAqbWRwID0gbXAgPSBtYWxsb2MobW9kdWxlX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBtb2R1bGVfZGF0YSkpOworICAgIGlmICghbXApIHsKKwllcnJvcigiT3V0IG9mIG1lbW9yeSFcbiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBhcmdwID0gYXJndjsKKyAgICB3aGlsZSAoKmFyZ3ApIHsKKwkvKiBOb3RlOiBpdCBzZWVtcyBHcnViIHRyYW5zcGFyZW50bHkgZGVjb21wcmVzc2VzIGFsbCBjb21wcmVzc2VkIGZpbGVzLAorCSAgIG5vdCBqdXN0IHRoZSBwcmltYXJ5IGtlcm5lbC4gKi8KKwlwcmludGYoIkxvYWRpbmcgJXMuLi4gIiwgKmFyZ3ApOworCXJ2ID0gemxvYWRmaWxlKCphcmdwLCAmbXAtPmRhdGEsICZtcC0+bGVuKTsKKworCWlmIChydikgeworCSAgICBwcmludGYoImZhaWxlZCFcbiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCXByaW50Zigib2tcbiIpOworCisJLyogCisJICogTm90ZTogR3J1YiBpbmNsdWRlcyB0aGUga2VybmVsIGZpbGVuYW1lIGluIHRoZSBjb21tYW5kIGxpbmUsIHNvIHdlCisJICogd2FudCB0byBtYXRjaCB0aGF0IGJlaGF2aW9yLgorCSAqLworCWFyZ2xlbiA9IDA7CisJZm9yIChhcmd4ID0gYXJncDsgKmFyZ3ggJiYgc3RyY21wKCphcmd4LCBtb2R1bGVfc2VwYXJhdG9yKTsgYXJneCsrKQorCSAgICBhcmdsZW4gKz0gc3RybGVuKCphcmd4KSArIDE7CisKKwlpZiAoYXJnbGVuID09IDApIHsKKwkgICAgbXAtPmNtZGxpbmUgPSBzdHJkdXAoIiIpOworCX0gZWxzZSB7CisJICAgIGNoYXIgKnA7CisJICAgIG1wLT5jbWRsaW5lID0gcCA9IG1hbGxvYyhhcmdsZW4pOworCSAgICBmb3IgKDsgKmFyZ3AgJiYgc3RyY21wKCphcmdwLCBtb2R1bGVfc2VwYXJhdG9yKTsgYXJncCsrKSB7CisJCXAgPSBzdHBjcHkocCwgKmFyZ3ApOworCQkqcCsrID0gJyAnOworCSAgICB9CisJICAgICotLXAgPSAnXDAnOworCX0KKwltcCsrOworCWlmICgqYXJncCkKKwkgICAgYXJncCsrOwkJLyogQWR2YW5jZSBwYXN0IG1vZHVsZV9zZXBhcmF0b3IgKi8KKyAgICB9CisKKyAgICByZXR1cm4gbW9kdWxlX2NvdW50OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBubW9kdWxlczsKKyAgICBzdHJ1Y3QgbW9kdWxlX2RhdGEgKm1vZHVsZXM7CisgICAgc3RydWN0IG11bHRpYm9vdF9oZWFkZXIgKm1iaDsKKyAgICBib29sIGtlZXBweGUgPSBmYWxzZTsKKworICAgIG9wZW5jb25zb2xlKCZkZXZfbnVsbF9yLCAmZGV2X3N0ZGNvbl93KTsKKworICAgICh2b2lkKWFyZ2M7CQkJLyogVW51c2VkICovCisgICAgYXJndisrOworCisgICAgd2hpbGUgKCphcmd2KSB7CisJYm9vbCB2ID0gdHJ1ZTsKKwljb25zdCBjaGFyICpwID0gKmFyZ3Y7CisKKwlpZiAoIW1lbWNtcChwLCAiLW5vIiwgMykpIHsKKwkgICAgdiA9IGZhbHNlOworCSAgICBwICs9IDM7CisJfQorCisJaWYgKCFzdHJjbXAocCwgIi1zb2xhcmlzIikpIHsKKwkgICAgb3B0LnNvbGFyaXMgPSB2OworCSAgICBzZXQuc29sYXJpcyA9IHRydWU7CisJfSBlbHNlIGlmICghc3RyY21wKHAsICItYW91dCIpKSB7CisJICAgIG9wdC5hb3V0ID0gdjsKKwkgICAgc2V0LmFvdXQgPSB0cnVlOworCX0gZWxzZQorCSAgICBicmVhazsKKwlhcmd2Kys7CisgICAgfQorCisgICAgaWYgKCEqYXJndikgeworCWVycm9yCisJICAgICgiVXNhZ2U6IG1ib290LmMzMiBbb3B0c10gbWJvb3RfZmlsZSBhcmdzLi4uIFstLS0gbW9kdWxlIGFyZ3MuLi5dLi4uXG4iCisJICAgICAiT3B0aW9uczpcbiIKKwkgICAgICIgIC1zb2xhcmlzICBFbmFibGUgU29sYXJpcyBESENQIGluZm9ybWF0aW9uIHBhc3NpbmdcbiIKKwkgICAgICIgIC1hb3V0ICAgICBVc2UgdGhlIFwiYS5vdXQga2x1ZGdlXCIgaWYgZW5hYmxlZCwgZXZlbiBmb3IgRUxGXG4iCisJICAgICAiICAgICAgICAgICAgVGhpcyBtYXRjaGVzIHRoZSBNdWx0aWJvb3Qgc3BlYywgYnV0IGRpZmZlcnMgZnJvbSBHcnViXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBMb2FkIHRoZSBmaWxlcyAqLworICAgIG5tb2R1bGVzID0gZ2V0X21vZHVsZXMoYXJndiwgJm1vZHVsZXMpOworICAgIGlmIChubW9kdWxlcyA8IDEpIHsKKwllcnJvcigiTm8gZmlsZXMgZm91bmQhXG4iKTsKKwlyZXR1cm4gMTsJCS8qIEZhaWx1cmUgKi8KKyAgICB9CisKKyAgICBpZiAoaW5pdF9tYXAoKSkKKwlyZXR1cm4gMTsJCS8qIEZhaWxlZCB0byBhbGxvY2F0ZSBpbml0aWFsIG1hcCAqLworCisgICAgLyoKKyAgICAgKiBNYXAgdGhlIHByaW1hcnkgaW1hZ2UuICBUaGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBtYXBwaW5nIGFueXRoaW5nCisgICAgICogZWxzZSwgc2luY2UgaXQgd2lsbCBoYXZlIGZpeGVkIGFkZHJlc3MgcmVxdWlyZW1lbnRzLgorICAgICAqLworICAgIG1iaCA9IG1hcF9pbWFnZShtb2R1bGVzWzBdLmRhdGEsIG1vZHVsZXNbMF0ubGVuKTsKKyAgICBpZiAoIW1iaCkKKwlyZXR1cm4gMTsKKworICAgIC8qIE1hcCB0aGUgbWJpbmZvIHN0cnVjdHVyZSAqLworICAgIHJlZ3MuZWJ4ID0gbWFwX2RhdGEoJm1iaW5mbywgc2l6ZW9mIG1iaW5mbywgNCwgMCk7CisgICAgaWYgKCFyZWdzLmVieCkgeworCWVycm9yKCJGYWlsZWQgdG8gbWFwIE11bHRpYm9vdCBpbmZvIHN0cnVjdHVyZSFcbiIpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qIE1hcCB0aGUgcHJpbWFyeSBjb21tYW5kIGxpbmUgKi8KKyAgICBpZiAobW9kdWxlc1swXS5jbWRsaW5lKSB7CisJbWJpbmZvLmNtZGxpbmUgPSBtYXBfc3RyaW5nKG1vZHVsZXNbMF0uY21kbGluZSk7CisJZHByaW50ZigiTWFpbiBjbWRsaW5lOiBcIiVzXCJcbiIsIG1vZHVsZXNbMF0uY21kbGluZSk7CisJaWYgKG1iaW5mby5jbWRsaW5lKQorCSAgICBtYmluZm8uZmxhZ3MgfD0gTUJfSU5GT19DTURMSU5FOworICAgIH0KKworICAgIC8qIE1hcCBhdXhpbGxpYXJ5IGltYWdlcyAqLworICAgIGlmIChubW9kdWxlcyA+IDEpIHsKKwlpZiAobWFwX21vZHVsZXMobW9kdWxlcyArIDEsIG5tb2R1bGVzIC0gMSkpCisJICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIEFkZCBhdXhpbGxpYXJ5IGluZm9ybWF0aW9uICovCisgICAgbWJvb3RfbWFrZV9tZW1tYXAoKTsKKyAgICBtYm9vdF9hcG0oKTsKKyAgICBtYm9vdF9zeXNsaW51eF9pbmZvKCk7CisKKyAgICBpZiAob3B0LnNvbGFyaXMpCisJbWJvb3Rfc29sYXJpc19kaGNwX2hhY2soKTsKKworICAgIC8qIFNldCB0aGUgZ3JhcGhpY3MgbW9kZSBpZiByZXF1ZXN0ZWQgKi8KKyAgICBzZXRfZ3JhcGhpY3NfbW9kZShtYmgsICZtYmluZm8pOworCisgICAgLyogUnVuIGl0ICovCisgICAgbWJvb3RfcnVuKGtlZXBweGUgPyAzIDogMCk7CisgICAgZXJyb3IoIm1ib290LmMzMjogYm9vdCBmYWlsZWRcbiIpOworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbWJvb3QvbWJvb3QuaCBiL2NvbTMyL21ib290L21ib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2Y2EyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21ib290L21ib290LmgKQEAgLTAsMCArMSw5OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbWJvb3QuaAorICoKKyAqIE1vZHVsZSB0byBsb2FkIGEgbXVsdGlib290IGtlcm5lbAorICovCisKKyNpZm5kZWYgTUJPT1RfSAorCisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorCisjaW5jbHVkZSA8c3lzbGludXgvbG9hZGZpbGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tb3ZlYml0cy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3RwbS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSAibWJfaGVhZGVyLmgiCisjaW5jbHVkZSAibWJfaW5mby5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqbXNnKQoreworICAgIGZwdXRzKG1zZywgc3RkZXJyKTsKK30KKworLyogbWJvb3QuYyAqLworZXh0ZXJuIHN0cnVjdCBtdWx0aWJvb3RfaW5mbyBtYmluZm87CitleHRlcm4gc3RydWN0IHN5c2xpbnV4X3BtX3JlZ3MgcmVnczsKK2V4dGVybiBzdHJ1Y3QgbXlfb3B0aW9ucyB7CisgICAgYm9vbCBzb2xhcmlzOworICAgIGJvb2wgYW91dDsKK30gb3B0LCBzZXQ7CisKKy8qIG1hcC5jICovCisjZGVmaW5lIE1BUF9ISUdICTEKKyNkZWZpbmUgTUFQX05PUEFECTIKK2FkZHJfdCBtYXBfZGF0YShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCBzaXplX3QgYWxpZ24sIGludCBmbGFncyk7CithZGRyX3QgbWFwX3N0cmluZyhjb25zdCBjaGFyICpzdHJpbmcpOworc3RydWN0IG11bHRpYm9vdF9oZWFkZXIgKm1hcF9pbWFnZSh2b2lkICpwdHIsIHNpemVfdCBsZW4pOwordm9pZCBtYm9vdF9ydW4oaW50IGJvb3RmbGFncyk7CitpbnQgaW5pdF9tYXAodm9pZCk7CisKKy8qIG1lbS5jICovCit2b2lkIG1ib290X21ha2VfbWVtbWFwKHZvaWQpOworCisvKiBhcG0uYyAqLwordm9pZCBtYm9vdF9hcG0odm9pZCk7CisKKy8qIHNvbGFyaXMuYyAqLworYm9vbCBrZXJuZWxfaXNfc29sYXJpcyhjb25zdCBFbGYzMl9FaGRyICopOwordm9pZCBtYm9vdF9zb2xhcmlzX2RoY3BfaGFjayh2b2lkKTsKKworLyogc3lzbGludXguYyAqLwordm9pZCBtYm9vdF9zeXNsaW51eF9pbmZvKHZvaWQpOworCisvKiBpbml0dmVzYS5jICovCit2b2lkIHNldF9ncmFwaGljc19tb2RlKGNvbnN0IHN0cnVjdCBtdWx0aWJvb3RfaGVhZGVyICptYmgsCisJCSAgICAgICBzdHJ1Y3QgbXVsdGlib290X2luZm8gKm1iaSk7CisKKyNlbmRpZiAvKiBNQk9PVF9IICovCmRpZmYgLS1naXQgYS9jb20zMi9tYm9vdC9tZW0uYyBiL2NvbTMyL21ib290L21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzU1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tYm9vdC9tZW0uYwpAQCAtMCwwICsxLDIyMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBtZW0uYworICoKKyAqIE9idGFpbiBhIG1lbW9yeSBtYXAgZm9yIGEgTXVsdGlib290IE9TCisgKgorICogVGhpcyBkaWZmZXJzIGZyb20gdGhlIGxpYmNvbTMyIG1lbW9yeSBtYXAgZnVuY3Rpb25zIGluIHRoYXQgaXQgZG9lc24ndAorICogYXR0ZW1wdCB0byBmaWx0ZXIgb3V0IG1lbW9yeSByZWdpb25zLi4uCisgKi8KKworI2luY2x1ZGUgIm1ib290LmgiCisjaW5jbHVkZSA8Y29tMzIuaD4KKworc3RydWN0IGU4MjBfZW50cnkgeworICAgIHVpbnQ2NF90IHN0YXJ0OworICAgIHVpbnQ2NF90IGxlbjsKKyAgICB1aW50MzJfdCB0eXBlOworfTsKKworI2RlZmluZSBSQU5HRV9BTExPQ19CTE9DSwkxMjgKKworc3RhdGljIGludCBtYm9vdF9zY2FuX21lbW9yeShzdHJ1Y3QgQWRkclJhbmdlRGVzYyAqKmFyZHAsIHVpbnQzMl90ICogZG9zbWVtKQoreworICAgIGNvbTMyc3lzX3QgaXJlZywgb3JlZzsKKyAgICBzdHJ1Y3QgZTgyMF9lbnRyeSAqZTgyMGJ1ZjsKKyAgICBzdHJ1Y3QgQWRkclJhbmdlRGVzYyAqYXJkOworICAgIHNpemVfdCBhcmRfY291bnQsIGFyZF9zcGFjZTsKKyAgICBpbnQgcnYgPSAwOworCisgICAgLyogVXNlIElOVCAxMmggdG8gZ2V0IERPUyBtZW1vcnkgKi8KKyAgICBfX2ludGNhbGwoMHgxMiwgJl9fY29tMzJfemVyb19yZWdzLCAmb3JlZyk7CisgICAgKmRvc21lbSA9IG9yZWcuZWF4LndbMF0gPDwgMTA7CisgICAgaWYgKCpkb3NtZW0gPCAzMiAqIDEwMjQgfHwgKmRvc21lbSA+IDY0MCAqIDEwMjQpIHsKKwkvKiBJTlQgMTJoIHJlcG9ydHMgbm9uc2Vuc2UuLi4gbm93IHdoYXQ/ICovCisJdWludDE2X3QgZWJkYV9zZWcgPSAqKHVpbnQxNl90ICopIDB4NDBlOworCWlmIChlYmRhX3NlZyA+PSAweDgwMDAgJiYgZWJkYV9zZWcgPCAweGEwMDApCisJICAgICpkb3NtZW0gPSBlYmRhX3NlZyA8PCA0OworCWVsc2UKKwkgICAgKmRvc21lbSA9IDY0MCAqIDEwMjQ7CS8qIEhvcGUgZm9yIHRoZSBiZXN0Li4uICovCisgICAgfQorCisgICAgZTgyMGJ1ZiA9IGxtYWxsb2Moc2l6ZW9mKCplODIwYnVmKSk7CisgICAgaWYgKCFlODIwYnVmKQorCXJldHVybiAwOworCisgICAgLyogQWxsb2NhdGUgaW5pdGlhbCBzcGFjZSAqLworICAgICphcmRwID0gYXJkID0gbWFsbG9jKFJBTkdFX0FMTE9DX0JMT0NLICogc2l6ZW9mICphcmQpOworICAgIGlmICghYXJkKQorCWdvdG8gb3V0OworCisgICAgYXJkX2NvdW50ID0gMDsKKyAgICBhcmRfc3BhY2UgPSBSQU5HRV9BTExPQ19CTE9DSzsKKworICAgIC8qIEZpcnN0IHRyeSBJTlQgMTVoIEFYPUU4MjBoICovCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisgICAgaXJlZy5lYXgubCA9IDB4ZTgyMDsKKyAgICBpcmVnLmVkeC5sID0gMHg1MzRkNDE1MDsKKyAgICAvKiBpcmVnLmVieC5sICAgID0gMDsgKi8KKyAgICBpcmVnLmVjeC5sID0gc2l6ZW9mKCplODIwYnVmKTsKKyAgICBpcmVnLmVzID0gU0VHKGU4MjBidWYpOworICAgIGlyZWcuZWRpLndbMF0gPSBPRkZTKGU4MjBidWYpOworICAgIG1lbXNldChlODIwYnVmLCAwLCBzaXplb2YgKmU4MjBidWYpOworCisgICAgZG8geworCV9faW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworCisJaWYgKChvcmVnLmVmbGFncy5sICYgRUZMQUdTX0NGKSB8fAorCSAgICAob3JlZy5lYXgubCAhPSAweDUzNGQ0MTUwKSB8fCAob3JlZy5lY3gubCA8IDIwKSkKKwkgICAgYnJlYWs7CisKKwlpZiAoYXJkX2NvdW50ID49IGFyZF9zcGFjZSkgeworCSAgICBhcmRfc3BhY2UgKz0gUkFOR0VfQUxMT0NfQkxPQ0s7CisJICAgICphcmRwID0gYXJkID0gcmVhbGxvYyhhcmQsIGFyZF9zcGFjZSAqIHNpemVvZiAqYXJkKTsKKwkgICAgaWYgKCFhcmQpIHsKKwkJcnYgPSBhcmRfY291bnQ7CisJCWdvdG8gb3V0OworCSAgICB9CisJfQorCisJYXJkW2FyZF9jb3VudF0uc2l6ZSA9IDIwOworCWFyZFthcmRfY291bnRdLkJhc2VBZGRyID0gZTgyMGJ1Zi0+c3RhcnQ7CisJYXJkW2FyZF9jb3VudF0uTGVuZ3RoID0gZTgyMGJ1Zi0+bGVuOworCWFyZFthcmRfY291bnRdLlR5cGUgPSBlODIwYnVmLT50eXBlOworCWFyZF9jb3VudCsrOworCisJaXJlZy5lYngubCA9IG9yZWcuZWJ4Lmw7CisgICAgfSB3aGlsZSAob3JlZy5lYngubCk7CisKKyAgICBpZiAoYXJkX2NvdW50KSB7CisJcnYgPSBhcmRfY291bnQ7CisJZ290byBvdXQ7CisgICAgfTsKKworICAgIGFyZFswXS5zaXplID0gMjA7CisgICAgYXJkWzBdLkJhc2VBZGRyID0gMDsKKyAgICBhcmRbMF0uTGVuZ3RoID0gKmRvc21lbSA8PCAxMDsKKyAgICBhcmRbMF0uVHlwZSA9IDE7CisKKyAgICAvKiBOZXh0IHRyeSBJTlQgMTVoIEFYPUU4MDFoICovCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisgICAgaXJlZy5lYXgud1swXSA9IDB4ZTgwMTsKKyAgICBfX2ludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKKworICAgIGlmICghKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpICYmIG9yZWcuZWN4LndbMF0pIHsKKwlhcmRbMV0uc2l6ZSA9IDIwOworCWFyZFsxXS5CYXNlQWRkciA9IDEgPDwgMjA7CisJYXJkWzFdLkxlbmd0aCA9IG9yZWcuZWN4LndbMF0gPDwgMTA7CisJYXJkWzFdLlR5cGUgPSAxOworCisJaWYgKG9yZWcuZWR4LndbMF0pIHsKKwkgICAgYXJkWzJdLnNpemUgPSAyMDsKKwkgICAgYXJkWzJdLkJhc2VBZGRyID0gMTYgPDwgMjA7CisJICAgIGFyZFsyXS5MZW5ndGggPSBvcmVnLmVkeC53WzBdIDw8IDE2OworCSAgICBhcmRbMl0uVHlwZSA9IDE7CisJICAgIHJ2ID0gMzsKKwl9IGVsc2UgeworCSAgICBydiA9IDI7CisJfQorCisJZ290byBvdXQ7CisgICAgfQorCisgICAgLyogRmluYWxseSB0cnkgSU5UIDE1aCBBSD04OGggKi8KKyAgICBtZW1zZXQoJmlyZWcsIDAsIHNpemVvZiBpcmVnKTsKKyAgICBpcmVnLmVheC53WzBdID0gMHg4ODAwOworICAgIF9faW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworICAgIGlmICghKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpICYmIG9yZWcuZWF4LndbMF0pIHsKKwlhcmRbMV0uc2l6ZSA9IDIwOworCWFyZFsxXS5CYXNlQWRkciA9IDEgPDwgMjA7CisJYXJkWzFdLkxlbmd0aCA9IG9yZWcuZWN4LndbMF0gPDwgMTA7CisJYXJkWzFdLlR5cGUgPSAxOworCXJ2ID0gMjsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICBydiA9IDE7CQkJLyogLi4uIHByb2JsZW1hdGljIC4uLiAqLworb3V0OgorICAgIGxmcmVlKGU4MjBidWYpOworICAgIHJldHVybiBydjsKK30KKwordm9pZCBtYm9vdF9tYWtlX21lbW1hcCh2b2lkKQoreworICAgIGludCBpLCBubWFwOworICAgIHN0cnVjdCBBZGRyUmFuZ2VEZXNjICphcmQ7CisgICAgdWludDMyX3QgbG93bWVtLCBoaWdobWVtOworICAgIHVpbnQzMl90IGhpZ2hyc3ZkOworCisgICAgLyogQWx3YXlzIHJlcG9ydCBET1MgbWVtb3J5IGFzICJsb3dtZW0iLCB0aGlzIG1heSBiZSBvdmVybHkgY29uc2VydmF0aXZlCisgICAgICAgKGUuZy4gaWYgd2UncmUgZHJvcHBpbmcgUFhFKSwgYnV0IGl0IHNob3VsZCBiZSAqc2FmZSouLi4gKi8KKworICAgIG5tYXAgPSBtYm9vdF9zY2FuX21lbW9yeSgmYXJkLCAmbG93bWVtKTsKKworICAgIGhpZ2htZW0gPSAweDEwMDAwMDsKKyAgICBoaWdocnN2ZCA9IDB4ZmZmMDAwMDA7CisKK2FnYWluOgorICAgIGZvciAoaSA9IDA7IGkgPCBubWFwOyBpKyspIHsKKwl1aW50NjRfdCBzdGFydCwgZW5kOworCisJc3RhcnQgPSBhcmRbaV0uQmFzZUFkZHI7CisJZW5kID0gc3RhcnQgKyBhcmRbaV0uTGVuZ3RoOworCisJaWYgKGVuZCA8IHN0YXJ0KQorCSAgICBlbmQgPSB+MFVMTDsKKworCWlmIChzdGFydCAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkKKwkgICAgY29udGludWU7CQkvKiBOb3QgaW50ZXJlc3RlZCBpbiA2NC1iaXQgbWVtb3J5ICovCisKKwlpZiAoc3RhcnQgPCBoaWdobWVtKQorCSAgICBzdGFydCA9IGhpZ2htZW07CisKKwlpZiAoZW5kIDw9IHN0YXJ0KQorCSAgICBjb250aW51ZTsKKworCWlmIChhcmRbaV0uVHlwZSA9PSAxICYmIHN0YXJ0ID09IGhpZ2htZW0pIHsKKwkgICAgaGlnaG1lbSA9IGVuZDsKKwkgICAgZ290byBhZ2FpbjsKKwl9IGVsc2UgaWYgKGFyZFtpXS5UeXBlICE9IDEgJiYgc3RhcnQgPCBoaWdocnN2ZCkKKwkgICAgaGlnaHJzdmQgPSBzdGFydDsKKyAgICB9CisKKyAgICBpZiAoaGlnaG1lbSA+IGhpZ2hyc3ZkKQorCWhpZ2htZW0gPSBoaWdocnN2ZDsKKworICAgIG1iaW5mby5tZW1fbG93ZXIgPSBsb3dtZW0gPj4gMTA7CisgICAgbWJpbmZvLm1lbV91cHBlciA9IChoaWdobWVtIC0gMHgxMDAwMDApID4+IDEwOworICAgIG1iaW5mby5mbGFncyB8PSBNQl9JTkZPX01FTU9SWTsKKworICAgIC8qIFRoZSBzcGVjIHNheXMgdGhpcyBhZGRyZXNzIHNob3VsZCBiZSArNCwgYnV0IEdydWIgZGlzYWdyZWVzICovCisgICAgbWJpbmZvLm1tYXBfYWRkciA9IG1hcF9kYXRhKGFyZCwgbm1hcCAqIHNpemVvZiAqYXJkLCA0LCBmYWxzZSk7CisgICAgaWYgKG1iaW5mby5tbWFwX2FkZHIpIHsKKwltYmluZm8ubW1hcF9sZW5ndGggPSBubWFwICogc2l6ZW9mICphcmQ7CisJbWJpbmZvLmZsYWdzIHw9IE1CX0lORk9fTUVNX01BUDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tYm9vdC9zb2xhcmlzLmMgYi9jb20zMi9tYm9vdC9zb2xhcmlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxNTNkZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21ib290L3NvbGFyaXMuYwpAQCAtMCwwICsxLDYyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzb2xhcmlzLmMKKyAqCisgKiBTb2xhcmlzIERIQ1AgaGFjaworICoKKyAqIFNvbGFyaXMgdXNlcyBhIG5vbnN0YW5kYXJkIGhhY2sgdG8gcGFzcyBESENQIGluZm9ybWF0aW9uIGZyb20gYSBuZXRib290LgorICovCisKKyNpbmNsdWRlICJtYm9vdC5oIgorI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorCitib29sIGtlcm5lbF9pc19zb2xhcmlzKGNvbnN0IEVsZjMyX0VoZHIgKmVoKQoreworICAgIHJldHVybiBlaC0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gNjsJLyogQUJJID09IFNvbGFyaXMgKi8KK30KKwordm9pZCBtYm9vdF9zb2xhcmlzX2RoY3BfaGFjayh2b2lkKQoreworICAgIHZvaWQgKmRoY3BkYXRhOworICAgIHNpemVfdCBkaGNwbGVuOworCisgICAgaWYgKHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbygpLT5jLmZpbGVzeXN0ZW0gIT0gU1lTTElOVVhfRlNfUFhFTElOVVgpCisJcmV0dXJuOworICAgIAorICAgIGlmICghcHhlX2dldF9jYWNoZWRfaW5mbyhQWEVOVl9QQUNLRVRfVFlQRV9ESENQX0FDSywgJmRoY3BkYXRhLCAmZGhjcGxlbikpIHsKKwltYmluZm8uZHJpdmVzX2FkZHIgPSBtYXBfZGF0YShkaGNwZGF0YSwgZGhjcGxlbiwgNCwgMCk7CisJaWYgKG1iaW5mby5kcml2ZXNfYWRkcikgeworCSAgICBtYmluZm8uZHJpdmVzX2xlbmd0aCA9IGRoY3BsZW47CisJICAgIG1iaW5mby5ib290X2RldmljZSA9IDB4MjBmZmZmZmY7CisJICAgIG1iaW5mby5mbGFncyA9CisJCShtYmluZm8uZmxhZ3MgJiB+TUJfSU5GT19EUklWRV9JTkZPKSB8IE1CX0lORk9fQk9PVERFVjsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvbWJvb3Qvc3lzbGludXguYyBiL2NvbTMyL21ib290L3N5c2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlMzg1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21ib290L3N5c2xpbnV4LmMKQEAgLTAsMCArMSw0NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2xpbnV4LmMKKyAqCisgKiBTeXNsaW51eC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgdGhlIGtlcm5lbAorICovCisKKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJtYm9vdC5oIgorCit2b2lkIG1ib290X3N5c2xpbnV4X2luZm8odm9pZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3Qgc3lzbGludXhfdmVyc2lvbiAqc3Y7CisKKyAgICBzdiA9IHN5c2xpbnV4X3ZlcnNpb24oKTsKKyAgICBtYmluZm8uYm9vdF9sb2FkZXJfbmFtZSA9IG1hcF9zdHJpbmcoc3YtPnZlcnNpb25fc3RyaW5nKTsKKyAgICBpZiAobWJpbmZvLmJvb3RfbG9hZGVyX25hbWUpCisJbWJpbmZvLmZsYWdzIHw9IE1CX0lORk9fQk9PVF9MT0FERVJfTkFNRTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21ib290L3Zlc2EuaCBiL2NvbTMyL21ib290L3Zlc2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2MwODRhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbWJvb3QvdmVzYS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMTk5OS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQl9TWVNfVkVTQV9ICisjZGVmaW5lIExJQl9TWVNfVkVTQV9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisKKy8qIFZFU0EgR2VuZXJhbCBJbmZvcm1hdGlvbiB0YWJsZSAqLworc3RydWN0IHZlc2FfZ2VuZXJhbF9pbmZvIHsKKyAgICB1aW50MzJfdCBzaWduYXR1cmU7CQkvKiBNYWdpYyBudW1iZXIgPSAiVkVTQSIgKi8KKyAgICB1aW50MTZfdCB2ZXJzaW9uOworICAgIGZhcl9wdHJfdCB2ZW5kb3Jfc3RyaW5nOworICAgIHVpbnQ4X3QgY2FwYWJpbGl0aWVzWzRdOworICAgIGZhcl9wdHJfdCB2aWRlb19tb2RlX3B0cjsKKyAgICB1aW50MTZfdCB0b3RhbF9tZW1vcnk7CisKKyAgICB1aW50MTZfdCBvZW1fc29mdHdhcmVfcmV2OworICAgIGZhcl9wdHJfdCBvZW1fdmVuZG9yX25hbWVfcHRyOworICAgIGZhcl9wdHJfdCBvZW1fcHJvZHVjdF9uYW1lX3B0cjsKKyAgICBmYXJfcHRyX3Qgb2VtX3Byb2R1Y3RfcmV2X3B0cjsKKworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMjIyXTsKKyAgICB1aW50OF90IG9lbV9kYXRhWzI1Nl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBWRVNBX01BR0lDICgnVicgKyAoJ0UnIDw8IDgpICsgKCdTJyA8PCAxNikgKyAoJ0EnIDw8IDI0KSkKKyNkZWZpbmUgVkJFMl9NQUdJQyAoJ1YnICsgKCdCJyA8PCA4KSArICgnRScgPDwgMTYpICsgKCcyJyA8PCAyNCkpCisKK3N0cnVjdCB2ZXNhX21vZGVfaW5mbyB7CisgICAgdWludDE2X3QgbW9kZV9hdHRyOworICAgIHVpbnQ4X3Qgd2luX2F0dHJbMl07CisgICAgdWludDE2X3Qgd2luX2dyYWluOworICAgIHVpbnQxNl90IHdpbl9zaXplOworICAgIHVpbnQxNl90IHdpbl9zZWdbMl07CisgICAgZmFyX3B0cl90IHdpbl9zY2hlbWU7CisgICAgdWludDE2X3QgbG9naWNhbF9zY2FuOworCisgICAgdWludDE2X3QgaF9yZXM7CisgICAgdWludDE2X3Qgdl9yZXM7CisgICAgdWludDhfdCBjaGFyX3dpZHRoOworICAgIHVpbnQ4X3QgY2hhcl9oZWlnaHQ7CisgICAgdWludDhfdCBtZW1vcnlfcGxhbmVzOworICAgIHVpbnQ4X3QgYnBwOworICAgIHVpbnQ4X3QgYmFua3M7CisgICAgdWludDhfdCBtZW1vcnlfbGF5b3V0OworICAgIHVpbnQ4X3QgYmFua19zaXplOworICAgIHVpbnQ4X3QgaW1hZ2VfcGFnZXM7CisgICAgdWludDhfdCBwYWdlX2Z1bmN0aW9uOworCisgICAgdWludDhfdCBybWFzazsKKyAgICB1aW50OF90IHJwb3M7CisgICAgdWludDhfdCBnbWFzazsKKyAgICB1aW50OF90IGdwb3M7CisgICAgdWludDhfdCBibWFzazsKKyAgICB1aW50OF90IGJwb3M7CisgICAgdWludDhfdCByZXN2X21hc2s7CisgICAgdWludDhfdCByZXN2X3BvczsKKyAgICB1aW50OF90IGRjbV9pbmZvOworCisgICAgdWludDhfdCAqbGZiX3B0cjsJCS8qIExpbmVhciBmcmFtZSBidWZmZXIgYWRkcmVzcyAqLworICAgIHVpbnQ4X3QgKm9mZnNjcmVlbl9wdHI7CS8qIE9mZnNjcmVlbiBtZW1vcnkgYWRkcmVzcyAqLworICAgIHVpbnQxNl90IG9mZnNjcmVlbl9zaXplOworCisgICAgdWludDhfdCByZXNlcnZlZFsyMDZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB2ZXNhX2luZm8geworICAgIHN0cnVjdCB2ZXNhX2dlbmVyYWxfaW5mbyBnaTsKKyAgICBzdHJ1Y3QgdmVzYV9tb2RlX2luZm8gbWk7Cit9OworCitleHRlcm4gc3RydWN0IHZlc2FfaW5mbyB2ZXNhX2luZm87CisKKyNlbmRpZiAvKiBMSUJfU1lTX1ZFU0FfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbWVudS9NYWtlZmlsZSBiL2NvbTMyL21lbnUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyZDU5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21lbnUvTWFrZWZpbGUKQEAgLTAsMCArMSw0OCBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisjIyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIyBTaW1wbGUgbWVudSBzeXN0ZW0KKyMjCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvZWxmLm1rCisKK0xOWExJQlMJICAgPSAkKG9iamRpcikvY29tMzIvbGlidXRpbC9saWJ1dGlsX2xueC5hCisKK01PRFVMRVMJICA9IG1lbnUuYzMyIHZlc2FtZW51LmMzMgorVEVTVEZJTEVTID0KKworQ09NTU9OT0JKUyA9IG1lbnVtYWluLm8gcmVhZGNvbmZpZy5vIHBhc3N3ZC5vIGRyYWluLm8gXAorCQlwcmludG1zZy5vIGNvbG9ycy5vIGJhY2tncm91bmQubyByZWZzdHIubworCithbGw6ICQoTU9EVUxFUykgJChURVNURklMRVMpCisKK21lbnUuZWxmIDogbWVudS5vICQoQ09NTU9OT0JKUykgJChDX0xJQlMpCisJJChMRCkgJChMREZMQUdTKSAtbyAkQCAkXgorCit2ZXNhbWVudS5lbGYgOiB2ZXNhbWVudS5vICQoQ09NTU9OT0JKUykgJChDX0xJQlMpCisJJChMRCkgJChMREZMQUdTKSAtbyAkQCAkXgorCit0aWR5IGRpc3Q6CisJcm0gLWYgKi5vICoubG8gKi5hICoubHN0ICouZWxmIC4qLmQgKi50bXAKKworY2xlYW46IHRpZHkKKwlybSAtZiAqLmxueAorCitzcG90bGVzczogY2xlYW4KKwlybSAtZiAqLmxzcyAqLmMzMiAqLmNvbQorCXJtIC1mICp+IFwjKgorCitpbnN0YWxsOgorCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS9jb20zMi9tZW51L2JhY2tncm91bmQuYyBiL2NvbTMyL21lbnUvYmFja2dyb3VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTBlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tZW51L2JhY2tncm91bmQuYwpAQCAtMCwwICsxLDI2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGNvbnNvbGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibWVudS5oIgorCitjb25zdCBjaGFyICpjdXJyZW50X2JhY2tncm91bmQgPSBOVUxMOworCit2b2lkIHNldF9iYWNrZ3JvdW5kKGNvbnN0IGNoYXIgKm5ld19iYWNrZ3JvdW5kKQoreworICAgIGlmICghY3VycmVudF9iYWNrZ3JvdW5kIHx8ICFuZXdfYmFja2dyb3VuZCB8fAorCXN0cmNtcChjdXJyZW50X2JhY2tncm91bmQsIG5ld19iYWNrZ3JvdW5kKSkgeworCWRyYXdfYmFja2dyb3VuZChuZXdfYmFja2dyb3VuZCk7CisJY3VycmVudF9iYWNrZ3JvdW5kID0gbmV3X2JhY2tncm91bmQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvbWVudS9jb2xvcnMuYyBiL2NvbTMyL21lbnUvY29sb3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3MzJiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21lbnUvY29sb3JzLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbG9ydGJsLmg+CisjaW5jbHVkZSAibWVudS5oIgorCisvKgorICogVGhlIGNvbG9yL2F0dHJpYnV0ZSBpbmRleGVzIChcMSNYLCBcMiNYWCwgXDMjWFhYKSBhcmUgYXMgZm9sbG93cworICoKKyAqIDAwIC0gc2NyZWVuCQlSZXN0IG9mIHRoZSBzY3JlZW4KKyAqIDAxIC0gYm9yZGVyCQlCb3JkZXIgYXJlYQorICogMDIgLSB0aXRsZQkJVGl0bGUgYmFyCisgKiAwMyAtIHVuc2VsCQlVbnNlbGVjdGVkIG1lbnUgaXRlbQorICogMDQgLSBob3RrZXkJCVVuc2VsZWN0ZWQgaG90a2V5CisgKiAwNSAtIHNlbAkJU2VsZWN0aW9uIGJhcgorICogMDYgLSBob3RzZWwJCVNlbGVjdGVkIGhvdGtleQorICogMDcgLSBzY3JvbGxiYXIJU2Nyb2xsIGJhcgorICogMDggLSB0YWJtc2cJCVByZXNzIFtUYWJdIG1lc3NhZ2UKKyAqIDA5IC0gY21kbWFyawkJQ29tbWFuZCBsaW5lIG1hcmtlcgorICogMTAgLSBjbWRsaW5lCQlDb21tYW5kIGxpbmUKKyAqIDExIC0gcHdkYm9yZGVyCVBhc3N3b3JkIGJveCBib3JkZXIKKyAqIDEyIC0gcHdkaGVhZGVyCVBhc3N3b3JkIGJveCBoZWFkZXIKKyAqIDEzIC0gcHdkZW50cnkJUGFzc3dvcmQgYm94IGNvbnRlbnRzCisgKiAxNCAtIHRpbWVvdXRfbXNnCVRpbWVvdXQgbWVzc2FnZQorICogMTUgLSB0aW1lb3V0CQlUaW1lb3V0IGNvdW50ZXIKKyAqIDE2IC0gaGVscAkJQ3VycmVudCBlbnRyeSBoZWxwIHRleHQKKyAqIDE3IC0gZGlzYWJsZWQgICAgICAgIERpc2FibGVkIG1lbnUgaXRlbQorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29sb3JfdGFibGUgZGVmYXVsdF9jb2xvcnNbXSA9IHsKKyAgICB7InNjcmVlbiIsICIzNzs0MCIsIDB4ODBmZmZmZmYsIDB4MDAwMDAwMDAsIFNIQURPV19OT1JNQUx9LAorICAgIHsiYm9yZGVyIiwgIjMwOzQ0IiwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgU0hBRE9XX05PUk1BTH0sCisgICAgeyJ0aXRsZSIsICIxOzM2OzQ0IiwgMHhjMDAwOTBmMCwgMHgwMDAwMDAwMCwgU0hBRE9XX05PUk1BTH0sCisgICAgeyJ1bnNlbCIsICIzNzs0NCIsIDB4OTBmZmZmZmYsIDB4MDAwMDAwMDAsIFNIQURPV19OT1JNQUx9LAorICAgIHsiaG90a2V5IiwgIjE7Mzc7NDQiLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKKyAgICB7InNlbCIsICI3OzM3OzQwIiwgMHhlMDAwMDAwMCwgMHgyMGZmODAwMCwgU0hBRE9XX0FMTH0sCisgICAgeyJob3RzZWwiLCAiMTs3OzM3OzQwIiwgMHhlMDQwMDAwMCwgMHgyMGZmODAwMCwgU0hBRE9XX0FMTH0sCisgICAgeyJzY3JvbGxiYXIiLCAiMzA7NDQiLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKKyAgICB7InRhYm1zZyIsICIzMTs0MCIsIDB4OTBmZmZmMDAsIDB4MDAwMDAwMDAsIFNIQURPV19OT1JNQUx9LAorICAgIHsiY21kbWFyayIsICIxOzM2OzQwIiwgMHhjMDAwZmZmZiwgMHgwMDAwMDAwMCwgU0hBRE9XX05PUk1BTH0sCisgICAgeyJjbWRsaW5lIiwgIjM3OzQwIiwgMHhjMGZmZmZmZiwgMHgwMDAwMDAwMCwgU0hBRE9XX05PUk1BTH0sCisgICAgeyJwd2Rib3JkZXIiLCAiMzA7NDciLCAweDgwZmZmZmZmLCAweDIwZmZmZmZmLCBTSEFET1dfTk9STUFMfSwKKyAgICB7InB3ZGhlYWRlciIsICIzMTs0NyIsIDB4ODBmZjgwODAsIDB4MjBmZmZmZmYsIFNIQURPV19OT1JNQUx9LAorICAgIHsicHdkZW50cnkiLCAiMzA7NDciLCAweDgwZmZmZmZmLCAweDIwZmZmZmZmLCBTSEFET1dfTk9STUFMfSwKKyAgICB7InRpbWVvdXRfbXNnIiwgIjM3OzQwIiwgMHg4MGZmZmZmZiwgMHgwMDAwMDAwMCwgU0hBRE9XX05PUk1BTH0sCisgICAgeyJ0aW1lb3V0IiwgIjE7Mzc7NDAiLCAweGMwZmZmZmZmLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKKyAgICB7ImhlbHAiLCAiMzc7NDAiLCAweGMwZmZmZmZmLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKKyAgICB7ImRpc2FibGVkIiwgIjE7MzA7NDQiLCAweDYwY2NjY2NjLCAweDAwMDAwMDAwLCBTSEFET1dfTk9STUFMfSwKK307CisKKyNkZWZpbmUgTkNPTE9SUyAoc2l6ZW9mIGRlZmF1bHRfY29sb3JzL3NpemVvZiBkZWZhdWx0X2NvbG9yc1swXSkKK2NvbnN0IGludCBtZXNzYWdlX2Jhc2VfY29sb3IgPSBOQ09MT1JTOworY29uc3QgaW50IG1lbnVfY29sb3JfdGFibGVfc2l6ZSA9IE5DT0xPUlMgKyAyNTY7CisKKy8qIEFsZ29yaXRobWljYWxseSBnZW5lcmF0ZSB0aGUgbXNnWFggY29sb3JzICovCit2b2lkIHNldF9tc2dfY29sb3JzX2dsb2JhbChzdHJ1Y3QgY29sb3JfdGFibGUgKnRibCwKKwkJCSAgIHVuc2lnbmVkIGludCBmZywgdW5zaWduZWQgaW50IGJnLAorCQkJICAgZW51bSBjb2xvcl90YWJsZV9zaGFkb3cgc2hhZG93KQoreworICAgIHN0cnVjdCBjb2xvcl90YWJsZSAqY3AgPSB0YmwgKyBtZXNzYWdlX2Jhc2VfY29sb3I7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdW5zaWduZWQgaW50IGZnYSwgYmdhOworICAgIHVuc2lnbmVkIGludCBmZ2gsIGJnaDsKKyAgICB1bnNpZ25lZCBpbnQgZmdfaWR4LCBiZ19pZHg7CisgICAgdW5zaWduZWQgaW50IGZnX3JnYiwgYmdfcmdiOworCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwYzJyZ2JbOF0gPQorCXsgMHgwMDAwMDAsIDB4MDAwMGZmLCAweDAwZmYwMCwgMHgwMGZmZmYsIDB4ZmYwMDAwLCAweGZmMDBmZiwgMHhmZmZmMDAsCisJMHhmZmZmZmYKKyAgICB9OworCisgICAgLyogQ29udmVydGluZyBQQyBSR0JJIHRvIHNlbnNpYmxlIFJHQkEgdmFsdWVzIGlzIGFuICJpbnRlcmVzdGluZyIKKyAgICAgICBwcm9wb3NpdGlvbi4gIFRoaXMgYWxnb3JpdGhtIG1heSBuZWVkIHBsZW50eSBvZiB0d2Vha2luZy4gKi8KKworICAgIGZnYSA9IGZnICYgMHhmZjAwMDAwMDsKKyAgICBmZ2ggPSAoKGZnID4+IDEpICYgMHhmZjAwMDAwMCkgfCAweDgwMDAwMDAwOworCisgICAgYmdhID0gYmcgJiAweGZmMDAwMDAwOworICAgIGJnaCA9ICgoYmcgPj4gMSkgJiAweGZmMDAwMDAwKSB8IDB4ODAwMDAwMDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwlmZ19pZHggPSBpICYgMTU7CisJYmdfaWR4ID0gaSA+PiA0OworCisJZmdfcmdiID0gcGMycmdiW2ZnX2lkeCAmIDddICYgZmc7CisJYmdfcmdiID0gcGMycmdiW2JnX2lkeCAmIDddICYgYmc7CisKKwlpZiAoZmdfaWR4ICYgOCkgeworCSAgICAvKiBIaWdoIGludGVuc2l0eSBmb3JlZ3JvdW5kICovCisJICAgIGZnX3JnYiB8PSBmZ2g7CisJfSBlbHNlIHsKKwkgICAgZmdfcmdiIHw9IGZnYTsKKwl9CisKKwlpZiAoYmdfaWR4ID09IDApIHsKKwkgICAgLyogRGVmYXVsdCBibGFjayBiYWNrZ3JvdW5kLCBhc3N1bWUgdHJhbnNwYXJlbnQgKi8KKwkgICAgYmdfcmdiID0gMDsKKwl9IGVsc2UgaWYgKGJnX2lkeCAmIDgpIHsKKwkgICAgYmdfcmdiIHw9IGJnaDsKKwl9IGVsc2UgeworCSAgICBiZ19yZ2IgfD0gYmdhOworCX0KKworCWNwLT5hcmdiX2ZnID0gZmdfcmdiOworCWNwLT5hcmdiX2JnID0gYmdfcmdiOworCWNwLT5zaGFkb3cgPSBzaGFkb3c7CisJY3ArKzsKKyAgICB9Cit9CisKK3N0cnVjdCBjb2xvcl90YWJsZSAqZGVmYXVsdF9jb2xvcl90YWJsZSh2b2lkKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIGNvbnN0IHN0cnVjdCBjb2xvcl90YWJsZSAqZHA7CisgICAgc3RydWN0IGNvbG9yX3RhYmxlICpjcDsKKyAgICBzdHJ1Y3QgY29sb3JfdGFibGUgKmNvbG9yX3RhYmxlOworICAgIHN0YXRpYyBjb25zdCBpbnQgcGMyYW5zaVs4XSA9IHsgMCwgNCwgMiwgNiwgMSwgNSwgMywgNyB9OworICAgIHN0YXRpYyBjaGFyIG1zZ19uYW1lc1s2ICogMjU2XTsKKyAgICBjaGFyICptcDsKKworICAgIGNvbG9yX3RhYmxlID0gY2FsbG9jKE5DT0xPUlMgKyAyNTYsIHNpemVvZihzdHJ1Y3QgY29sb3JfdGFibGUpKTsKKworICAgIGRwID0gZGVmYXVsdF9jb2xvcnM7CisgICAgY3AgPSBjb2xvcl90YWJsZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQ09MT1JTOyBpKyspIHsKKwkqY3AgPSAqZHA7CisJY3AtPmFuc2kgPSByZWZzdHJkdXAoZHAtPmFuc2kpOworCWNwKys7CisJZHArKzsKKyAgICB9CisKKyAgICBtcCA9IG1zZ19uYW1lczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwljcC0+bmFtZSA9IG1wOworCW1wICs9IHNwcmludGYobXAsICJtc2clMDJ4IiwgaSkgKyAxOworCisJcnNwcmludGYoJmNwLT5hbnNpLCAiJXMzJWQ7NCVkIiwgKGkgJiA4KSA/ICIxOyIgOiAiIiwKKwkJIHBjMmFuc2lbaSAmIDddLCBwYzJhbnNpWyhpID4+IDQpICYgN10pOworCWNwKys7CisgICAgfQorCisgIC8qKiogWFhYOiBUaGlzIG5lZWRzIHRvIG1vdmUgdG8gcnVuX21lbnUoKSAqKiovCisgICAgY29uc29sZV9jb2xvcl90YWJsZSA9IGNvbG9yX3RhYmxlOworICAgIGNvbnNvbGVfY29sb3JfdGFibGVfc2l6ZSA9IE5DT0xPUlMgKyAyNTY7CisKKyAgICBzZXRfbXNnX2NvbG9yc19nbG9iYWwoY29sb3JfdGFibGUsIE1TR19DT0xPUlNfREVGX0ZHLAorCQkJICBNU0dfQ09MT1JTX0RFRl9CRywgTVNHX0NPTE9SU19ERUZfU0hBRE9XKTsKKworICAgIHJldHVybiBjb2xvcl90YWJsZTsKK30KKworc3RydWN0IGNvbG9yX3RhYmxlICpjb3B5X2NvbG9yX3RhYmxlKGNvbnN0IHN0cnVjdCBjb2xvcl90YWJsZSAqbWFzdGVyKQoreworICAgIGNvbnN0IHN0cnVjdCBjb2xvcl90YWJsZSAqZHA7CisgICAgc3RydWN0IGNvbG9yX3RhYmxlICpjb2xvcl90YWJsZSwgKmNwOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgY29sb3JfdGFibGUgPSBjYWxsb2MoTkNPTE9SUyArIDI1Niwgc2l6ZW9mKHN0cnVjdCBjb2xvcl90YWJsZSkpOworCisgICAgZHAgPSBtYXN0ZXI7CisgICAgY3AgPSBjb2xvcl90YWJsZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQ09MT1JTICsgMjU2OyBpKyspIHsKKwkqY3AgPSAqZHA7CisJY3AtPmFuc2kgPSByZWZzdHJfZ2V0KGRwLT5hbnNpKTsKKwljcCsrOworCWRwKys7CisgICAgfQorCisgICAgcmV0dXJuIGNvbG9yX3RhYmxlOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbWVudS9kcmFpbi5jIGIvY29tMzIvbWVudS9kcmFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWZkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tZW51L2RyYWluLmMKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisKK3ZvaWQgZHJhaW5fa2V5Ym9hcmQodm9pZCkKK3sKKyAgICAvKiBQcmV2ZW50ICJnaG9zdCB0eXBpbmciIGFuZCBrZXlib2FyZCBidWZmZXIgc25vb3BpbmcgKi8KKyAgICB2b2xhdGlsZSBjaGFyIGp1bms7CisgICAgaW50IHJ2OworCisgICAgZG8geworCXJ2ID0gcmVhZCgwLCAoY2hhciAqKSZqdW5rLCAxKTsKKyAgICB9IHdoaWxlIChydiA+IDApOworCisgICAganVuayA9IDA7CisKKyAgICBjbGkoKTsKKyAgICAqKHZvbGF0aWxlIHVpbnQ4X3QgKikweDQxOSA9IDA7CS8qIEFsdC1YWFgga2V5Ym9hcmQgYXJlYSAqLworICAgICoodm9sYXRpbGUgdWludDE2X3QgKikweDQxYSA9IDB4MWU7CS8qIEtleWJvYXJkIGJ1ZmZlciBlbXB0eSAqLworICAgICoodm9sYXRpbGUgdWludDE2X3QgKikweDQxYyA9IDB4MWU7CisgICAgbWVtc2V0KCh2b2lkICopMHg0MWUsIDAsIDMyKTsJLyogQ2xlYXIgdGhlIGFjdHVhbCBrZXlib2FyZCBidWZmZXIgKi8KKyAgICBzdGkoKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21lbnUvbWVudS5jIGIvY29tMzIvbWVudS9tZW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3YWY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21lbnUvbWVudS5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBtZW51LmMKKyAqCisgKiBTaW1wbGUgbWVudSBzeXN0ZW0gd2hpY2ggZGlzcGxheXMgYSBsaXN0IGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0CisgKiBhIGNvbW1hbmQgbGluZSBhbmQvb3IgZWRpdCBpdC4KKyAqLworCisjaW5jbHVkZSA8Y29uc29sZXMuaD4KKyNpbmNsdWRlICJtZW51LmgiCisKK2ludCBkcmF3X2JhY2tncm91bmQoY29uc3QgY2hhciAqYXJnKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8uLi4gKi8KKyAgICAodm9pZClhcmc7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X3Jlc29sdXRpb24oaW50IHgsIGludCB5KQoreworICAgICh2b2lkKXg7CisgICAgKHZvaWQpeTsKK30KKwordm9pZCBsb2NhbF9jdXJzb3JfZW5hYmxlKGJvb2wgZW5hYmxlZCkKK3sKKyAgICAodm9pZCllbmFibGVkOworfQorCit2b2lkIHN0YXJ0X2NvbnNvbGUodm9pZCkKK3sKKyAgICBjb25zb2xlX2Fuc2lfcmF3KCk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tZW51L21lbnVtYWluLmMgYi9jb20zMi9tZW51L21lbnVtYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjYjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21lbnUvbWVudW1haW4uYwpAQCAtMCwwICsxLDExNjYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTQgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1lbnVtYWluLmMKKyAqCisgKiBTaW1wbGUgbWVudSBzeXN0ZW0gd2hpY2ggZGlzcGxheXMgYSBsaXN0IGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0CisgKiBhIGNvbW1hbmQgbGluZSBhbmQvb3IgZWRpdCBpdC4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbnNvbGVzLmg+CisjaW5jbHVkZSA8Z2V0a2V5Lmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYWR2Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorCisjaW5jbHVkZSAibWVudS5oIgorCisvKiBUaGUgc3ltYm9sICJjbSIgYWx3YXlzIHJlZmVycyB0byB0aGUgY3VycmVudCBtZW51IGFjcm9zcyB0aGlzIGZpbGUuLi4gKi8KK3N0YXRpYyBzdHJ1Y3QgbWVudSAqY207CisKK2NvbnN0IHN0cnVjdCBtZW51X3BhcmFtZXRlciBtcGFybVtOUEFSQU1TXSA9IHsKKyAgICBbUF9XSURUSF0gPSB7IndpZHRoIiwgMH0sCisgICAgW1BfTUFSR0lOXSA9IHsibWFyZ2luIiwgMTB9LAorICAgIFtQX1BBU1NXRF9NQVJHSU5dID0geyJwYXNzd29yZG1hcmdpbiIsIDN9LAorICAgIFtQX01FTlVfUk9XU10gPSB7InJvd3MiLCAxMn0sCisgICAgW1BfVEFCTVNHX1JPV10gPSB7InRhYm1zZ3JvdyIsIDE4fSwKKyAgICBbUF9DTURMSU5FX1JPV10gPSB7ImNtZGxpbmVyb3ciLCAxOH0sCisgICAgW1BfRU5EX1JPV10gPSB7ImVuZHJvdyIsIC0xfSwKKyAgICBbUF9QQVNTV0RfUk9XXSA9IHsicGFzc3dvcmRyb3ciLCAxMX0sCisgICAgW1BfVElNRU9VVF9ST1ddID0geyJ0aW1lb3V0cm93IiwgMjB9LAorICAgIFtQX0hFTFBNU0dfUk9XXSA9IHsiaGVscG1zZ3JvdyIsIDIyfSwKKyAgICBbUF9IRUxQTVNHRU5EX1JPV10gPSB7ImhlbHBtc2dlbmRyb3ciLCAtMX0sCisgICAgW1BfSFNISUZUXSA9IHsiaHNoaWZ0IiwgMH0sCisgICAgW1BfVlNISUZUXSA9IHsidnNoaWZ0IiwgMH0sCisgICAgW1BfSElEREVOX1JPV10gPSB7ImhpZGRlbnJvdyIsIC0yfSwKK307CisKKy8qIFRoZXNlIG1hY3JvcyBhc3N1bWUgImNtIiBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWVudSAqLworI2RlZmluZSBXSURUSAkJKGNtLT5tcGFybVtQX1dJRFRIXSkKKyNkZWZpbmUgTUFSR0lOCQkoY20tPm1wYXJtW1BfTUFSR0lOXSkKKyNkZWZpbmUgUEFTU1dEX01BUkdJTgkoY20tPm1wYXJtW1BfUEFTU1dEX01BUkdJTl0pCisjZGVmaW5lIE1FTlVfUk9XUwkoY20tPm1wYXJtW1BfTUVOVV9ST1dTXSkKKyNkZWZpbmUgVEFCTVNHX1JPVwkoY20tPm1wYXJtW1BfVEFCTVNHX1JPV10rVlNISUZUKQorI2RlZmluZSBDTURMSU5FX1JPVwkoY20tPm1wYXJtW1BfQ01ETElORV9ST1ddK1ZTSElGVCkKKyNkZWZpbmUgRU5EX1JPVwkJKGNtLT5tcGFybVtQX0VORF9ST1ddKQorI2RlZmluZSBQQVNTV0RfUk9XCShjbS0+bXBhcm1bUF9QQVNTV0RfUk9XXStWU0hJRlQpCisjZGVmaW5lIFRJTUVPVVRfUk9XCShjbS0+bXBhcm1bUF9USU1FT1VUX1JPV10rVlNISUZUKQorI2RlZmluZSBIRUxQTVNHX1JPVwkoY20tPm1wYXJtW1BfSEVMUE1TR19ST1ddK1ZTSElGVCkKKyNkZWZpbmUgSEVMUE1TR0VORF9ST1cJKGNtLT5tcGFybVtQX0hFTFBNU0dFTkRfUk9XXSkKKyNkZWZpbmUgSFNISUZUCQkoY20tPm1wYXJtW1BfSFNISUZUXSkKKyNkZWZpbmUgVlNISUZUCQkoY20tPm1wYXJtW1BfVlNISUZUXSkKKyNkZWZpbmUgSElEREVOX1JPVwkoY20tPm1wYXJtW1BfSElEREVOX1JPV10pCisKK3N0YXRpYyBjaGFyICpwYWRfbGluZShjb25zdCBjaGFyICp0ZXh0LCBpbnQgYWxpZ24sIGludCB3aWR0aCkKK3sKKyAgICBzdGF0aWMgY2hhciBidWZmZXJbTUFYX0NNRExJTkVfTEVOXTsKKyAgICBpbnQgbiwgcDsKKworICAgIGlmICh3aWR0aCA+PSAoaW50KXNpemVvZiBidWZmZXIpCisJcmV0dXJuIE5VTEw7CQkvKiBDYW4ndCBkbyBpdCAqLworCisgICAgbiA9IHN0cmxlbih0ZXh0KTsKKyAgICBpZiAobiA+PSB3aWR0aCkKKwluID0gd2lkdGg7CisKKyAgICBtZW1zZXQoYnVmZmVyLCAnICcsIHdpZHRoKTsKKyAgICBidWZmZXJbd2lkdGhdID0gMDsKKyAgICBwID0gKCh3aWR0aCAtIG4pICogYWxpZ24pID4+IDE7CisgICAgbWVtY3B5KGJ1ZmZlciArIHAsIHRleHQsIG4pOworCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworLyogRGlzcGxheSBhbiBlbnRyeSwgd2l0aCBwb3NzaWJsZSBob3RrZXkgaGlnaGxpZ2h0LiAgQXNzdW1lcworICAgdGhhdCB0aGUgY3VycmVudCBhdHRyaWJ1dGUgaXMgdGhlIG5vbi1ob3RrZXkgb25lLCBhbmQgd2lsbAorICAgZ3VhcmFudGVlIHRoYXQgYXMgYW4gZXhpdCBjb25kaXRpb24gYXMgd2VsbC4gKi8KK3N0YXRpYyB2b2lkCitkaXNwbGF5X2VudHJ5KGNvbnN0IHN0cnVjdCBtZW51X2VudHJ5ICplbnRyeSwgY29uc3QgY2hhciAqYXR0cmliLAorCSAgICAgIGNvbnN0IGNoYXIgKmhvdGF0dHJpYiwgaW50IHdpZHRoKQoreworICAgIGNvbnN0IGNoYXIgKnAgPSBlbnRyeS0+ZGlzcGxheW5hbWU7CisgICAgY2hhciBtYXJrZXI7CisKKyAgICBpZiAoIXApCisJcCA9ICIiOworCisgICAgc3dpdGNoIChlbnRyeS0+YWN0aW9uKSB7CisgICAgY2FzZSBNQV9TVUJNRU5VOgorCW1hcmtlciA9ICc+JzsKKwlicmVhazsKKyAgICBjYXNlIE1BX0VYSVQ6CisJbWFya2VyID0gJzwnOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJbWFya2VyID0gMDsKKwlicmVhazsKKyAgICB9CisKKyAgICBpZiAobWFya2VyKQorCXdpZHRoIC09IDI7CisKKyAgICB3aGlsZSAod2lkdGgpIHsKKwlpZiAoKnApIHsKKwkgICAgaWYgKCpwID09ICdeJykgeworCQlwKys7CisJCWlmICgqcCAmJiAoKHVuc2lnbmVkIGNoYXIpKnAgJiB+MHgyMCkgPT0gZW50cnktPmhvdGtleSkgeworCQkgICAgZnB1dHMoaG90YXR0cmliLCBzdGRvdXQpOworCQkgICAgcHV0Y2hhcigqcCsrKTsKKwkJICAgIGZwdXRzKGF0dHJpYiwgc3Rkb3V0KTsKKwkJICAgIHdpZHRoLS07CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJcHV0Y2hhcigqcCsrKTsKKwkJd2lkdGgtLTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHB1dGNoYXIoJyAnKTsKKwkgICAgd2lkdGgtLTsKKwl9CisgICAgfQorCisgICAgaWYgKG1hcmtlcikgeworCXB1dGNoYXIoJyAnKTsKKwlwdXRjaGFyKG1hcmtlcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X3JvdyhpbnQgeSwgaW50IHNlbCwgaW50IHRvcCwgaW50IHNidG9wLCBpbnQgc2Jib3QpCit7CisgICAgaW50IGkgPSAoeSAtIDQgLSBWU0hJRlQpICsgdG9wOworICAgIGludCBkaXMgPSAoaSA8IGNtLT5uZW50cmllcykgJiYgaXNfZGlzYWJsZWQoY20tPm1lbnVfZW50cmllc1tpXSk7CisKKyAgICBwcmludGYoIlwwMzNbJWQ7JWRIXDEjMVwwMTZ4XDAxNyVzICIsCisJICAgeSwgTUFSR0lOICsgMSArIEhTSElGVCwKKwkgICAoaSA9PSBzZWwpID8gIlwxIzUiIDogZGlzID8gIlwyIzE3IiA6ICJcMSMzIik7CisKKyAgICBpZiAoaSA+PSBjbS0+bmVudHJpZXMpIHsKKwlmcHV0cyhwYWRfbGluZSgiIiwgMCwgV0lEVEggLSAyICogTUFSR0lOIC0gNCksIHN0ZG91dCk7CisgICAgfSBlbHNlIHsKKwlkaXNwbGF5X2VudHJ5KGNtLT5tZW51X2VudHJpZXNbaV0sCisJCSAgICAgIChpID09IHNlbCkgPyAiXDEjNSIgOiBkaXMgPyAiXDIjMTciIDogIlwxIzMiLAorCQkgICAgICAoaSA9PSBzZWwpID8gIlwxIzYiIDogZGlzID8gIlwyIzE3IiA6ICJcMSM0IiwKKwkJICAgICAgV0lEVEggLSAyICogTUFSR0lOIC0gNCk7CisgICAgfQorCisgICAgaWYgKGNtLT5uZW50cmllcyA8PSBNRU5VX1JPV1MpIHsKKwlwcmludGYoIiBcMSMxXDAxNnhcMDE3Iik7CisgICAgfSBlbHNlIGlmIChzYnRvcCA+IDApIHsKKwlpZiAoeSA+PSBzYnRvcCAmJiB5IDw9IHNiYm90KQorCSAgICBwcmludGYoIiBcMSM3XDAxNmFcMDE3Iik7CisJZWxzZQorCSAgICBwcmludGYoIiBcMSMxXDAxNnhcMDE3Iik7CisgICAgfSBlbHNlIHsKKwlwdXRjaGFyKCcgJyk7CQkvKiBEb24ndCBtb2RpZnkgdGhlIHNjcm9sbGJhciAqLworICAgIH0KK30KKworc3RhdGljIGptcF9idWYgdGltZW91dF9qdW1wOworCitpbnQgbXlnZXRrZXkoY2xvY2tfdCB0aW1lb3V0KQoreworICAgIGNsb2NrX3QgdDAsIHQ7CisgICAgY2xvY2tfdCB0dG8sIHRvOworICAgIGludCBrZXk7CisKKyAgICBpZiAoIXRvdGFsdGltZW91dCkKKwlyZXR1cm4gZ2V0X2tleShzdGRpbiwgdGltZW91dCk7CisKKyAgICBmb3IgKDs7KSB7CisJdHRvID0gbWluKHRvdGFsdGltZW91dCwgSU5UX01BWCk7CisJdG8gPSB0aW1lb3V0ID8gbWluKHR0bywgdGltZW91dCkgOiB0dG87CisKKwl0MCA9IHRpbWVzKE5VTEwpOworCWtleSA9IGdldF9rZXkoc3RkaW4sIHRvKTsKKwl0ID0gdGltZXMoTlVMTCkgLSB0MDsKKworCWlmICh0b3RhbHRpbWVvdXQgPD0gdCkKKwkgICAgbG9uZ2ptcCh0aW1lb3V0X2p1bXAsIDEpOworCisJdG90YWx0aW1lb3V0IC09IHQ7CisKKwlpZiAoa2V5ICE9IEtFWV9OT05FKQorCSAgICByZXR1cm4ga2V5OworCisJaWYgKHRpbWVvdXQpIHsKKwkgICAgaWYgKHRpbWVvdXQgPD0gdCkKKwkJcmV0dXJuIEtFWV9OT05FOworCisJICAgIHRpbWVvdXQgLT0gdDsKKwl9CisgICAgfQorfQorCitzdGF0aWMgaW50IGFza19wYXNzd2QoY29uc3QgY2hhciAqbWVudV9lbnRyeSkKK3sKKyAgICBjaGFyIHVzZXJfcGFzc3dkW1dJRFRIXSwgKnA7CisgICAgaW50IGRvbmU7CisgICAgaW50IGtleTsKKyAgICBpbnQgeDsKKyAgICBpbnQgcnY7CisKKyAgICBwcmludGYoIlwwMzNbJWQ7JWRIXDIjMTFcMDE2bCIsIFBBU1NXRF9ST1csIFBBU1NXRF9NQVJHSU4gKyAxKTsKKyAgICBmb3IgKHggPSAyOyB4IDw9IFdJRFRIIC0gMiAqIFBBU1NXRF9NQVJHSU4gLSAxOyB4KyspCisJcHV0Y2hhcigncScpOworCisgICAgcHJpbnRmKCJrXDAzM1slZDslZEh4IiwgUEFTU1dEX1JPVyArIDEsIFBBU1NXRF9NQVJHSU4gKyAxKTsKKyAgICBmb3IgKHggPSAyOyB4IDw9IFdJRFRIIC0gMiAqIFBBU1NXRF9NQVJHSU4gLSAxOyB4KyspCisJcHV0Y2hhcignICcpOworCisgICAgcHJpbnRmKCJ4XDAzM1slZDslZEhtIiwgUEFTU1dEX1JPVyArIDIsIFBBU1NXRF9NQVJHSU4gKyAxKTsKKyAgICBmb3IgKHggPSAyOyB4IDw9IFdJRFRIIC0gMiAqIFBBU1NXRF9NQVJHSU4gLSAxOyB4KyspCisJcHV0Y2hhcigncScpOworCisgICAgcHJpbnRmKCJqXDAxN1wwMzNbJWQ7JWRIXDIjMTIgJXMgXDAzM1slZDslZEhcMiMxMyIsCisJICAgUEFTU1dEX1JPVywgKFdJRFRIIC0gKHN0cmxlbihjbS0+bWVzc2FnZXNbTVNHX1BBU1NQUk9NUFRdKSArIDIpKSAvIDIsCisJICAgY20tPm1lc3NhZ2VzW01TR19QQVNTUFJPTVBUXSwgUEFTU1dEX1JPVyArIDEsIFBBU1NXRF9NQVJHSU4gKyAzKTsKKworICAgIGRyYWluX2tleWJvYXJkKCk7CisKKyAgICAvKiBBY3R1YWxseSBhbGxvdyB1c2VyIHRvIHR5cGUgYSBwYXNzd29yZCwgdGhlbiBjb21wYXJlIHRvIHRoZSBTSEExICovCisgICAgZG9uZSA9IDA7CisgICAgcCA9IHVzZXJfcGFzc3dkOworCisgICAgd2hpbGUgKCFkb25lKSB7CisJa2V5ID0gbXlnZXRrZXkoMCk7CisKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgS0VZX0VOVEVSOgorCWNhc2UgS0VZX0NUUkwoJ0onKToKKwkgICAgZG9uZSA9IDE7CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfRVNDOgorCWNhc2UgS0VZX0NUUkwoJ0MnKToKKwkgICAgcCA9IHVzZXJfcGFzc3dkOwkvKiBObyBwYXNzd29yZCBlbnRlcmVkICovCisJICAgIGRvbmUgPSAxOworCSAgICBicmVhazsKKworCWNhc2UgS0VZX0JBQ0tTUEFDRToKKwljYXNlIEtFWV9ERUw6CisJY2FzZSBLRVlfREVMRVRFOgorCSAgICBpZiAocCA+IHVzZXJfcGFzc3dkKSB7CisJCXByaW50ZigiXGIgXGIiKTsKKwkJcC0tOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfQ1RSTCgnVScpOgorCSAgICB3aGlsZSAocCA+IHVzZXJfcGFzc3dkKSB7CisJCXByaW50ZigiXGIgXGIiKTsKKwkJcC0tOworCSAgICB9CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgaWYgKGtleSA+PSAnICcgJiYga2V5IDw9IDB4RkYgJiYKKwkJKHAgLSB1c2VyX3Bhc3N3ZCkgPCBXSURUSCAtIDIgKiBQQVNTV0RfTUFSR0lOIC0gNSkgeworCQkqcCsrID0ga2V5OworCQlwdXRjaGFyKCcqJyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGlmIChwID09IHVzZXJfcGFzc3dkKQorCXJldHVybiAwOwkJLyogTm8gcGFzc3dvcmQgZW50ZXJlZCAqLworCisgICAgKnAgPSAnXDAnOworCisgICAgcnYgPSAoY20tPm1lbnVfbWFzdGVyX3Bhc3N3ZCAmJgorCSAgcGFzc3dkX2NvbXBhcmUoY20tPm1lbnVfbWFzdGVyX3Bhc3N3ZCwgdXNlcl9wYXNzd2QpKQorCXx8IChtZW51X2VudHJ5ICYmIHBhc3N3ZF9jb21wYXJlKG1lbnVfZW50cnksIHVzZXJfcGFzc3dkKSk7CisKKyAgICAvKiBDbGVhbiB1cCAqLworICAgIG1lbXNldCh1c2VyX3Bhc3N3ZCwgMCwgV0lEVEgpOworICAgIGRyYWluX2tleWJvYXJkKCk7CisKKyAgICByZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfbWVudShpbnQgc2VsLCBpbnQgdG9wLCBpbnQgZWRpdF9saW5lKQoreworICAgIGludCB4LCB5OworICAgIGludCBzYnRvcCA9IDAsIHNiYm90ID0gMDsKKyAgICBjb25zdCBjaGFyICp0YWJtc2c7CisgICAgaW50IHRhYm1zZ19sZW47CisKKyAgICBpZiAoY20tPm5lbnRyaWVzID4gTUVOVV9ST1dTKSB7CisJaW50IHNibGVuID0gbWF4KE1FTlVfUk9XUyAqIE1FTlVfUk9XUyAvIGNtLT5uZW50cmllcywgMSk7CisJc2J0b3AgPSAoTUVOVV9ST1dTIC0gc2JsZW4gKyAxKSAqIHRvcCAvIChjbS0+bmVudHJpZXMgLSBNRU5VX1JPV1MgKyAxKTsKKwlzYmJvdCA9IHNidG9wICsgc2JsZW4gLSAxOworCXNidG9wICs9IDQ7CisJc2Jib3QgKz0gNDsJCS8qIFN0YXJ0aW5nIHJvdyBvZiBzY3JvbGxiYXIgKi8KKyAgICB9CisKKyAgICBwcmludGYoIlwwMzNbJWQ7JWRIXDEjMVwwMTZsIiwgVlNISUZUICsgMSwgSFNISUZUICsgTUFSR0lOICsgMSk7CisgICAgZm9yICh4ID0gMiArIEhTSElGVDsgeCA8PSAoV0lEVEggLSAyICogTUFSR0lOIC0gMSkgKyBIU0hJRlQ7IHgrKykKKwlwdXRjaGFyKCdxJyk7CisKKyAgICBwcmludGYoImtcMDMzWyVkOyVkSFwxIzF4XDAxN1wxIzIgJXMgXDEjMVwwMTZ4IiwKKwkgICBWU0hJRlQgKyAyLAorCSAgIEhTSElGVCArIE1BUkdJTiArIDEsIHBhZF9saW5lKGNtLT50aXRsZSwgMSwgV0lEVEggLSAyICogTUFSR0lOIC0gNCkpOworCisgICAgcHJpbnRmKCJcMDMzWyVkOyVkSFwxIzF0IiwgVlNISUZUICsgMywgSFNISUZUICsgTUFSR0lOICsgMSk7CisgICAgZm9yICh4ID0gMiArIEhTSElGVDsgeCA8PSAoV0lEVEggLSAyICogTUFSR0lOIC0gMSkgKyBIU0hJRlQ7IHgrKykKKwlwdXRjaGFyKCdxJyk7CisgICAgZnB1dHMoInVcMDE3Iiwgc3Rkb3V0KTsKKworICAgIGZvciAoeSA9IDQgKyBWU0hJRlQ7IHkgPCA0ICsgVlNISUZUICsgTUVOVV9ST1dTOyB5KyspCisJZHJhd19yb3coeSwgc2VsLCB0b3AsIHNidG9wLCBzYmJvdCk7CisKKyAgICBwcmludGYoIlwwMzNbJWQ7JWRIXDEjMVwwMTZtIiwgeSwgSFNISUZUICsgTUFSR0lOICsgMSk7CisgICAgZm9yICh4ID0gMiArIEhTSElGVDsgeCA8PSAoV0lEVEggLSAyICogTUFSR0lOIC0gMSkgKyBIU0hJRlQ7IHgrKykKKwlwdXRjaGFyKCdxJyk7CisgICAgZnB1dHMoImpcMDE3Iiwgc3Rkb3V0KTsKKworICAgIGlmIChlZGl0X2xpbmUgJiYgY20tPmFsbG93ZWRpdCAmJiAhY20tPm1lbnVfbWFzdGVyX3Bhc3N3ZCkKKwl0YWJtc2cgPSBjbS0+bWVzc2FnZXNbTVNHX1RBQl07CisgICAgZWxzZQorCXRhYm1zZyA9IGNtLT5tZXNzYWdlc1tNU0dfTk9UQUJdOworCisgICAgdGFibXNnX2xlbiA9IHN0cmxlbih0YWJtc2cpOworCisgICAgcHJpbnRmKCJcMSM4XDAzM1slZDslZEglcyIsCisJICAgVEFCTVNHX1JPVywgMSArIEhTSElGVCArICgoV0lEVEggLSB0YWJtc2dfbGVuKSA+PiAxKSwgdGFibXNnKTsKKyAgICBwcmludGYoIlwxIzBcMDMzWyVkOzFIIiwgRU5EX1JPVyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX3NjcmVlbih2b2lkKQoreworICAgIGZwdXRzKCJcMDMzZVwwMzMlQFwwMzMpMFwwMzMoQlwxIzBcMDMzWz8yNWxcMDMzWzJKIiwgc3Rkb3V0KTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9oZWxwKGNvbnN0IGNoYXIgKnRleHQpCit7CisgICAgaW50IHJvdzsKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgaWYgKCF0ZXh0KSB7CisJdGV4dCA9ICIiOworCXByaW50ZigiXDEjMFwwMzNbJWQ7MUgiLCBIRUxQTVNHX1JPVyk7CisgICAgfSBlbHNlIHsKKwlwcmludGYoIlwyIzE2XDAzM1slZDsxSCIsIEhFTFBNU0dfUk9XKTsKKyAgICB9CisKKyAgICBmb3IgKHAgPSB0ZXh0LCByb3cgPSBIRUxQTVNHX1JPVzsgKnAgJiYgcm93IDw9IEhFTFBNU0dFTkRfUk9XOyBwKyspIHsKKwlzd2l0Y2ggKCpwKSB7CisJY2FzZSAnXHInOgorCWNhc2UgJ1xmJzoKKwljYXNlICdcdic6CisJY2FzZSAnXDAzMyc6CisJICAgIGJyZWFrOworCWNhc2UgJ1xuJzoKKwkgICAgcHJpbnRmKCJcMDMzW0tcMDMzWyVkOzFIIiwgKytyb3cpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBwdXRjaGFyKCpwKTsKKwl9CisgICAgfQorCisgICAgZnB1dHMoIlwwMzNbSyIsIHN0ZG91dCk7CisKKyAgICB3aGlsZSAocm93IDw9IEhFTFBNU0dFTkRfUk9XKSB7CisJcHJpbnRmKCJcMDMzW0tcMDMzWyVkOzFIIiwgKytyb3cpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2hvd19ma2V5KGludCBrZXkpCit7CisgICAgaW50IGZrZXk7CisKKyAgICB3aGlsZSAoMSkgeworCXN3aXRjaCAoa2V5KSB7CisJY2FzZSBLRVlfRjE6CisJICAgIGZrZXkgPSAwOworCSAgICBicmVhazsKKwljYXNlIEtFWV9GMjoKKwkgICAgZmtleSA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0YzOgorCSAgICBma2V5ID0gMjsKKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfRjQ6CisJICAgIGZrZXkgPSAzOworCSAgICBicmVhazsKKwljYXNlIEtFWV9GNToKKwkgICAgZmtleSA9IDQ7CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0Y2OgorCSAgICBma2V5ID0gNTsKKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfRjc6CisJICAgIGZrZXkgPSA2OworCSAgICBicmVhazsKKwljYXNlIEtFWV9GODoKKwkgICAgZmtleSA9IDc7CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0Y5OgorCSAgICBma2V5ID0gODsKKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfRjEwOgorCSAgICBma2V5ID0gOTsKKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfRjExOgorCSAgICBma2V5ID0gMTA7CisJICAgIGJyZWFrOworCWNhc2UgS0VZX0YxMjoKKwkgICAgZmtleSA9IDExOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBma2V5ID0gLTE7CisJICAgIGJyZWFrOworCX0KKworCWlmIChma2V5ID09IC0xKQorCSAgICBicmVhazsKKworCWlmIChjbS0+ZmtleWhlbHBbZmtleV0udGV4dG5hbWUpCisJICAgIGtleSA9IHNob3dfbWVzc2FnZV9maWxlKGNtLT5ma2V5aGVscFtma2V5XS50ZXh0bmFtZSwKKwkJCQkgICAgY20tPmZrZXloZWxwW2ZrZXldLmJhY2tncm91bmQpOworCWVsc2UKKwkgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZWRpdF9jbWRsaW5lKGNvbnN0IGNoYXIgKmlucHV0LCBpbnQgdG9wKQoreworICAgIHN0YXRpYyBjaGFyIGNtZGxpbmVbTUFYX0NNRExJTkVfTEVOXTsKKyAgICBpbnQga2V5LCBsZW4sIHByZXZfbGVuLCBjdXJzb3I7CisgICAgaW50IHJlZHJhdyA9IDE7CQkvKiBXZSBlbnRlciB3aXRoIHRoZSBtZW51IGFscmVhZHkgZHJhd24gKi8KKworICAgIHN0cmxjcHkoY21kbGluZSwgaW5wdXQsIE1BWF9DTURMSU5FX0xFTik7CisgICAgY21kbGluZVtNQVhfQ01ETElORV9MRU4gLSAxXSA9ICdcMCc7CisKKyAgICBsZW4gPSBjdXJzb3IgPSBzdHJsZW4oY21kbGluZSk7CisgICAgcHJldl9sZW4gPSAwOworCisgICAgZm9yICg7OykgeworCWlmIChyZWRyYXcgPiAxKSB7CisJICAgIC8qIENsZWFyIGFuZCByZWRyYXcgd2hvbGUgc2NyZWVuICovCisJICAgIC8qIEVuYWJsZSBBU0NJSSBvbiBHMCBhbmQgREVDIFZUIG9uIEcxOyBkbyBpdCBpbiB0aGlzIG9yZGVyCisJICAgICAgIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgTGludXggY29uc29sZSAqLworCSAgICBjbGVhcl9zY3JlZW4oKTsKKwkgICAgZHJhd19tZW51KC0xLCB0b3AsIDEpOworCSAgICBwcmV2X2xlbiA9IDA7CisJfQorCisJaWYgKHJlZHJhdyA+IDApIHsKKwkgICAgLyogUmVkcmF3IHRoZSBjb21tYW5kIGxpbmUgKi8KKwkgICAgcHJpbnRmKCJcMDMzWz8yNWxcMDMzWyVkOzFIXDEjOT4gXDIjMTAlcyIsCisJCSAgIENNRExJTkVfUk9XLCBwYWRfbGluZShjbWRsaW5lLCAwLCBtYXgobGVuLCBwcmV2X2xlbikpKTsKKwkgICAgcHJpbnRmKCJcMiMxMFwwMzNbJWQ7M0glc1wwMzNbPzI1aCIsCisJCSAgIENNRExJTkVfUk9XLCBwYWRfbGluZShjbWRsaW5lLCAwLCBjdXJzb3IpKTsKKwkgICAgcHJldl9sZW4gPSBsZW47CisJICAgIHJlZHJhdyA9IDA7CisJfQorCisJa2V5ID0gbXlnZXRrZXkoMCk7CisKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgS0VZX0NUUkwoJ0wnKToKKwkgICAgcmVkcmF3ID0gMjsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9FTlRFUjoKKwljYXNlIEtFWV9DVFJMKCdKJyk6CisJICAgIHJldHVybiBjbWRsaW5lOworCisJY2FzZSBLRVlfRVNDOgorCWNhc2UgS0VZX0NUUkwoJ0MnKToKKwkgICAgcmV0dXJuIE5VTEw7CisKKwljYXNlIEtFWV9CQUNLU1BBQ0U6CisJY2FzZSBLRVlfREVMOgorCSAgICBpZiAoY3Vyc29yKSB7CisJCW1lbW1vdmUoY21kbGluZSArIGN1cnNvciAtIDEsIGNtZGxpbmUgKyBjdXJzb3IsCisJCQlsZW4gLSBjdXJzb3IgKyAxKTsKKwkJbGVuLS07CisJCWN1cnNvci0tOworCQlyZWRyYXcgPSAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfQ1RSTCgnRCcpOgorCWNhc2UgS0VZX0RFTEVURToKKwkgICAgaWYgKGN1cnNvciA8IGxlbikgeworCQltZW1tb3ZlKGNtZGxpbmUgKyBjdXJzb3IsIGNtZGxpbmUgKyBjdXJzb3IgKyAxLCBsZW4gLSBjdXJzb3IpOworCQlsZW4tLTsKKwkJcmVkcmF3ID0gMTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX0NUUkwoJ1UnKToKKwkgICAgaWYgKGxlbikgeworCQlsZW4gPSBjdXJzb3IgPSAwOworCQljbWRsaW5lW2xlbl0gPSAnXDAnOworCQlyZWRyYXcgPSAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfQ1RSTCgnVycpOgorCSAgICBpZiAoY3Vyc29yKSB7CisJCWludCBwcmV2Y3Vyc29yID0gY3Vyc29yOworCisJCXdoaWxlIChjdXJzb3IgJiYgbXlfaXNzcGFjZShjbWRsaW5lW2N1cnNvciAtIDFdKSkKKwkJICAgIGN1cnNvci0tOworCisJCXdoaWxlIChjdXJzb3IgJiYgIW15X2lzc3BhY2UoY21kbGluZVtjdXJzb3IgLSAxXSkpCisJCSAgICBjdXJzb3ItLTsKKworCQltZW1tb3ZlKGNtZGxpbmUgKyBjdXJzb3IsIGNtZGxpbmUgKyBwcmV2Y3Vyc29yLAorCQkJbGVuIC0gcHJldmN1cnNvciArIDEpOworCQlsZW4gLT0gKHByZXZjdXJzb3IgLSBjdXJzb3IpOworCQlyZWRyYXcgPSAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfTEVGVDoKKwljYXNlIEtFWV9DVFJMKCdCJyk6CisJICAgIGlmIChjdXJzb3IpIHsKKwkJY3Vyc29yLS07CisJCXJlZHJhdyA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9SSUdIVDoKKwljYXNlIEtFWV9DVFJMKCdGJyk6CisJICAgIGlmIChjdXJzb3IgPCBsZW4pIHsKKwkJcHV0Y2hhcihjbWRsaW5lW2N1cnNvcisrXSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9DVFJMKCdLJyk6CisJICAgIGlmIChjdXJzb3IgPCBsZW4pIHsKKwkJY21kbGluZVtsZW4gPSBjdXJzb3JdID0gJ1wwJzsKKwkJcmVkcmF3ID0gMTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX0hPTUU6CisJY2FzZSBLRVlfQ1RSTCgnQScpOgorCSAgICBpZiAoY3Vyc29yKSB7CisJCWN1cnNvciA9IDA7CisJCXJlZHJhdyA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9FTkQ6CisJY2FzZSBLRVlfQ1RSTCgnRScpOgorCSAgICBpZiAoY3Vyc29yICE9IGxlbikgeworCQljdXJzb3IgPSBsZW47CisJCXJlZHJhdyA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9GMToKKwljYXNlIEtFWV9GMjoKKwljYXNlIEtFWV9GMzoKKwljYXNlIEtFWV9GNDoKKwljYXNlIEtFWV9GNToKKwljYXNlIEtFWV9GNjoKKwljYXNlIEtFWV9GNzoKKwljYXNlIEtFWV9GODoKKwljYXNlIEtFWV9GOToKKwljYXNlIEtFWV9GMTA6CisJY2FzZSBLRVlfRjExOgorCWNhc2UgS0VZX0YxMjoKKwkgICAgc2hvd19ma2V5KGtleSk7CisJICAgIHJlZHJhdyA9IDE7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgaWYgKGtleSA+PSAnICcgJiYga2V5IDw9IDB4RkYgJiYgbGVuIDwgTUFYX0NNRExJTkVfTEVOIC0gMSkgeworCQlpZiAoY3Vyc29yID09IGxlbikgeworCQkgICAgY21kbGluZVtsZW5dID0ga2V5OworCQkgICAgY21kbGluZVsrK2xlbl0gPSAnXDAnOworCQkgICAgY3Vyc29yKys7CisJCSAgICBwdXRjaGFyKGtleSk7CisJCSAgICBwcmV2X2xlbisrOworCQl9IGVsc2UgeworCQkgICAgbWVtbW92ZShjbWRsaW5lICsgY3Vyc29yICsgMSwgY21kbGluZSArIGN1cnNvciwKKwkJCSAgICBsZW4gLSBjdXJzb3IgKyAxKTsKKwkJICAgIGNtZGxpbmVbY3Vyc29yKytdID0ga2V5OworCQkgICAgbGVuKys7CisJCSAgICByZWRyYXcgPSAxOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfdGltZW91dF9tZXNzYWdlKGludCB0b2wsIGludCByb3csIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBzdGF0aWMgaW50IGxhc3RfbXNnX2xlbiA9IDA7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBpbnQgbmMgPSAwLCBubmMsIHBhZGM7CisgICAgY29uc3QgY2hhciAqdHAgPSBtc2c7CisgICAgY2hhciB0YzsKKyAgICBjaGFyICp0cSA9IGJ1ZjsKKworICAgIHdoaWxlICgoc2l6ZV90KSAodHEgLSBidWYpIDwgKHNpemVvZiBidWYgLSAxNikgJiYgKHRjID0gKnRwKSkgeworCXRwKys7CisJaWYgKHRjID09ICcjJykgeworCSAgICBubmMgPSBzcHJpbnRmKHRxLCAiXDIjMTUlZFwyIzE0IiwgdG9sKTsKKwkgICAgdHEgKz0gbm5jOworCSAgICBuYyArPSBubmMgLSA4OwkvKiA4IGZvcm1hdHRpbmcgY2hhcmFjdGVycyAqLworCX0gZWxzZSBpZiAodGMgPT0gJ3snKSB7CisJICAgIC8qIERlYWwgd2l0aCB7c2luZ3VsYXJbLGR1YWxdLHBsdXJhbH0gY29uc3RydWN0cyAqLworCSAgICBzdHJ1Y3QgeworCQljb25zdCBjaGFyICpzLCAqZTsKKwkgICAgfSB0eFszXTsKKwkgICAgY29uc3QgY2hhciAqdHBwOworCSAgICBpbnQgbiA9IDA7CisKKwkgICAgbWVtc2V0KHR4LCAwLCBzaXplb2YgdHgpOworCisJICAgIHR4WzBdLnMgPSB0cDsKKworCSAgICB3aGlsZSAoKnRwICYmICp0cCAhPSAnfScpIHsKKwkJaWYgKCp0cCA9PSAnLCcgJiYgbiA8IDIpIHsKKwkJICAgIHR4W25dLmUgPSB0cDsKKwkJICAgIG4rKzsKKwkJICAgIHR4W25dLnMgPSB0cCArIDE7CisJCX0KKwkJdHArKzsKKwkgICAgfQorCSAgICB0eFtuXS5lID0gdHA7CisKKwkgICAgaWYgKCp0cCkKKwkJdHArKzsJCS8qIFNraXAgZmluYWwgYnJhY2tldCAqLworCisJICAgIGlmICghdHhbMV0ucykKKwkJdHhbMV0gPSB0eFswXTsKKwkgICAgaWYgKCF0eFsyXS5zKQorCQl0eFsyXSA9IHR4WzFdOworCisJICAgIC8qIE5vdyBbMF0gaXMgc2luZ3VsYXIsIFsxXSBpcyBkdWFsLCBhbmQgWzJdIGlzIHBsdXJhbCwKKwkgICAgICAgZXZlbiBpZiB0aGUgdXNlciBvbmx5IHNwZWNpZmllZCBzb21lIG9mIHRoZW0uICovCisKKwkgICAgc3dpdGNoICh0b2wpIHsKKwkgICAgY2FzZSAxOgorCQluID0gMDsKKwkJYnJlYWs7CisJICAgIGNhc2UgMjoKKwkJbiA9IDE7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQluID0gMjsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICBmb3IgKHRwcCA9IHR4W25dLnM7IHRwcCA8IHR4W25dLmU7IHRwcCsrKSB7CisJCWlmICgoc2l6ZV90KSAodHEgLSBidWYpIDwgKHNpemVvZiBidWYpKSB7CisJCSAgICAqdHErKyA9ICp0cHA7CisJCSAgICBuYysrOworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICAqdHErKyA9IHRjOworCSAgICBuYysrOworCX0KKyAgICB9CisgICAgKnRxID0gJ1wwJzsKKworICAgIGlmIChuYyA+PSBsYXN0X21zZ19sZW4pIHsKKwlwYWRjID0gMDsKKyAgICB9IGVsc2UgeworCXBhZGMgPSAobGFzdF9tc2dfbGVuIC0gbmMgKyAxKSA+PiAxOworICAgIH0KKworICAgIHByaW50ZigiXDAzM1slZDslZEhcMiMxNCUqcyVzJSpzIiwgcm93LAorCSAgIEhTSElGVCArIDEgKyAoKFdJRFRIIC0gbmMpID4+IDEpIC0gcGFkYywKKwkgICBwYWRjLCAiIiwgYnVmLCBwYWRjLCAiIik7CisKKyAgICBsYXN0X21zZ19sZW4gPSBuYzsKK30KKworLyogU2V0IHRoZSBiYWNrZ3JvdW5kIHNjcmVlbiwgZXRjLiAqLworc3RhdGljIHZvaWQgcHJlcGFyZV9zY3JlZW5fZm9yX21lbnUodm9pZCkKK3sKKyAgICBjb25zb2xlX2NvbG9yX3RhYmxlID0gY20tPmNvbG9yX3RhYmxlOworICAgIGNvbnNvbGVfY29sb3JfdGFibGVfc2l6ZSA9IG1lbnVfY29sb3JfdGFibGVfc2l6ZTsKKyAgICBzZXRfYmFja2dyb3VuZChjbS0+bWVudV9iYWNrZ3JvdW5kKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRvX2hpZGRlbl9tZW51KHZvaWQpCit7CisgICAgaW50IGtleTsKKyAgICBpbnQgdGltZW91dF9sZWZ0LCB0aGlzX3RpbWVvdXQ7CisKKyAgICBjbGVhcl9zY3JlZW4oKTsKKworICAgIGlmICghc2V0am1wKHRpbWVvdXRfanVtcCkpIHsKKwl0aW1lb3V0X2xlZnQgPSBjbS0+dGltZW91dDsKKworCXdoaWxlICghY20tPnRpbWVvdXQgfHwgdGltZW91dF9sZWZ0KSB7CisJICAgIGludCB0b2wgPSB0aW1lb3V0X2xlZnQgLyBDTEtfVENLOworCisJICAgIHByaW50X3RpbWVvdXRfbWVzc2FnZSh0b2wsIEhJRERFTl9ST1csIGNtLT5tZXNzYWdlc1tNU0dfQVVUT0JPT1RdKTsKKworCSAgICB0aGlzX3RpbWVvdXQgPSBtaW4odGltZW91dF9sZWZ0LCBDTEtfVENLKTsKKwkgICAga2V5ID0gbXlnZXRrZXkodGhpc190aW1lb3V0KTsKKworCSAgICBpZiAoa2V5ICE9IEtFWV9OT05FKSB7CisJCS8qIENsZWFyIHRoZSBtZXNzYWdlIGZyb20gdGhlIHNjcmVlbiAqLworCQlwcmludF90aW1lb3V0X21lc3NhZ2UoMCwgSElEREVOX1JPVywgIiIpOworCQlyZXR1cm4gaGlkZV9rZXlba2V5XTsgLyogTlVMTCBpZiBubyBNRU5VIEhJREVLRVkgaW4gZWZmZWN0ICovCisJICAgIH0KKworCSAgICB0aW1lb3V0X2xlZnQgLT0gdGhpc190aW1lb3V0OworCX0KKyAgICB9CisKKyAgICAvKiBDbGVhciB0aGUgbWVzc2FnZSBmcm9tIHRoZSBzY3JlZW4gKi8KKyAgICBwcmludF90aW1lb3V0X21lc3NhZ2UoMCwgSElEREVOX1JPVywgIiIpOworCisgICAgaWYgKGNtLT5vbnRpbWVvdXQpCisJcmV0dXJuIGNtLT5vbnRpbWVvdXQ7CisgICAgZWxzZQorCXJldHVybiBjbS0+bWVudV9lbnRyaWVzW2NtLT5kZWZlbnRyeV0tPmNtZGxpbmU7IC8qIERlZmF1bHQgZW50cnkgKi8KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnJ1bl9tZW51KHZvaWQpCit7CisgICAgaW50IGtleTsKKyAgICBpbnQgZG9uZSA9IDA7CisgICAgdm9sYXRpbGUgaW50IGVudHJ5ID0gY20tPmN1cmVudHJ5OworICAgIGludCBwcmV2X2VudHJ5ID0gLTE7CisgICAgdm9sYXRpbGUgaW50IHRvcCA9IGNtLT5jdXJ0b3A7CisgICAgaW50IHByZXZfdG9wID0gLTE7CisgICAgaW50IGNsZWFyID0gMSwgdG9fY2xlYXI7CisgICAgY29uc3QgY2hhciAqY21kbGluZSA9IE5VTEw7CisgICAgdm9sYXRpbGUgY2xvY2tfdCBrZXlfdGltZW91dCwgdGltZW91dF9sZWZ0LCB0aGlzX3RpbWVvdXQ7CisgICAgY29uc3Qgc3RydWN0IG1lbnVfZW50cnkgKm1lOworICAgIGJvb2wgaG90a2V5ID0gZmFsc2U7CisKKyAgICAvKiBOb3RlOiBmb3IgYm90aCBrZXlfdGltZW91dCBhbmQgdGltZW91dCA9PSAwIG1lYW5zIG5vIGxpbWl0ICovCisgICAgdGltZW91dF9sZWZ0ID0ga2V5X3RpbWVvdXQgPSBjbS0+dGltZW91dDsKKworICAgIC8qIElmIHdlJ3JlIGluIHNoaWZ0a2V5IG1vZGUsIGV4aXQgaW1tZWRpYXRlbHkgdW5sZXNzIGEgc2hpZnQga2V5CisgICAgICAgaXMgcHJlc3NlZCAqLworICAgIGlmIChzaGlmdGtleSAmJiAhc2hpZnRfaXNfaGVsZCgpKSB7CisJcmV0dXJuIGNtLT5tZW51X2VudHJpZXNbY20tPmRlZmVudHJ5XS0+Y21kbGluZTsKKyAgICB9IGVsc2UgeworCXNoaWZ0a2V5ID0gMDsKKyAgICB9CisKKyAgICAvKiBEbyB0aGlzIGJlZm9yZSBoaWRkZW5tZW51IGhhbmRsaW5nLCBzbyB3ZSBzaG93IHRoZSBiYWNrZ3JvdW5kICovCisgICAgcHJlcGFyZV9zY3JlZW5fZm9yX21lbnUoKTsKKworICAgIC8qIEhhbmRsZSBoaWRkZW5tZW51ICovCisgICAgaWYgKGhpZGRlbm1lbnUpIHsKKwljbWRsaW5lID0gZG9faGlkZGVuX21lbnUoKTsKKwlpZiAoY21kbGluZSkKKwkgICAgcmV0dXJuIGNtZGxpbmU7CisKKwkvKiBPdGhlcndpc2UgZGlzcGxheSB0aGUgbWVudSBub3c7IHRoZSB0aW1lb3V0IGhhcyBhbHJlYWR5IGJlZW4KKwkgICBjYW5jZWxsZWQsIHNpbmNlIHRoZSB1c2VyIHByZXNzZWQgYSBrZXkuICovCisJaGlkZGVubWVudSA9IDA7CisJa2V5X3RpbWVvdXQgPSAwOworICAgIH0KKworICAgIC8qIEhhbmRsZSBib3RoIGxvY2FsIGFuZCBnbG9iYWwgdGltZW91dCAqLworICAgIGlmIChzZXRqbXAodGltZW91dF9qdW1wKSkgeworCWVudHJ5ID0gY20tPmRlZmVudHJ5OworCisJaWYgKHRvcCA8IDAgfHwgdG9wIDwgZW50cnkgLSBNRU5VX1JPV1MgKyAxKQorCSAgICB0b3AgPSBtYXgoMCwgZW50cnkgLSBNRU5VX1JPV1MgKyAxKTsKKwllbHNlIGlmICh0b3AgPiBlbnRyeSB8fCB0b3AgPiBtYXgoMCwgY20tPm5lbnRyaWVzIC0gTUVOVV9ST1dTKSkKKwkgICAgdG9wID0gbWluKGVudHJ5LCBtYXgoMCwgY20tPm5lbnRyaWVzIC0gTUVOVV9ST1dTKSk7CisKKwlkcmF3X21lbnUoY20tPm9udGltZW91dCA/IC0xIDogZW50cnksIHRvcCwgMSk7CisJY21kbGluZSA9CisJICAgIGNtLT5vbnRpbWVvdXQgPyBjbS0+b250aW1lb3V0IDogY20tPm1lbnVfZW50cmllc1tlbnRyeV0tPmNtZGxpbmU7CisJZG9uZSA9IDE7CisgICAgfQorCisgICAgd2hpbGUgKCFkb25lKSB7CisJaWYgKGVudHJ5IDw9IDApIHsKKwkgICAgZW50cnkgPSAwOworCSAgICB3aGlsZSAoZW50cnkgPCBjbS0+bmVudHJpZXMgJiYgaXNfZGlzYWJsZWQoY20tPm1lbnVfZW50cmllc1tlbnRyeV0pKQorCQllbnRyeSsrOworCX0KKwlpZiAoZW50cnkgPj0gY20tPm5lbnRyaWVzIC0gMSkgeworCSAgICBlbnRyeSA9IGNtLT5uZW50cmllcyAtIDE7CisJICAgIHdoaWxlIChlbnRyeSA+IDAgJiYgaXNfZGlzYWJsZWQoY20tPm1lbnVfZW50cmllc1tlbnRyeV0pKQorCQllbnRyeS0tOworCX0KKworCW1lID0gY20tPm1lbnVfZW50cmllc1tlbnRyeV07CisKKwlpZiAodG9wIDwgMCB8fCB0b3AgPCBlbnRyeSAtIE1FTlVfUk9XUyArIDEpCisJICAgIHRvcCA9IG1heCgwLCBlbnRyeSAtIE1FTlVfUk9XUyArIDEpOworCWVsc2UgaWYgKHRvcCA+IGVudHJ5IHx8IHRvcCA+IG1heCgwLCBjbS0+bmVudHJpZXMgLSBNRU5VX1JPV1MpKQorCSAgICB0b3AgPSBtaW4oZW50cnksIG1heCgwLCBjbS0+bmVudHJpZXMgLSBNRU5VX1JPV1MpKTsKKworCS8qIFN0YXJ0IHdpdGggYSBjbGVhciBzY3JlZW4gKi8KKwlpZiAoY2xlYXIpIHsKKwkgICAgLyogQ2xlYXIgYW5kIHJlZHJhdyB3aG9sZSBzY3JlZW4gKi8KKwkgICAgLyogRW5hYmxlIEFTQ0lJIG9uIEcwIGFuZCBERUMgVlQgb24gRzE7IGRvIGl0IGluIHRoaXMgb3JkZXIKKwkgICAgICAgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSBMaW51eCBjb25zb2xlICovCisJICAgIGlmIChjbGVhciA+PSAyKQorCQlwcmVwYXJlX3NjcmVlbl9mb3JfbWVudSgpOworCSAgICBjbGVhcl9zY3JlZW4oKTsKKwkgICAgY2xlYXIgPSAwOworCSAgICBwcmV2X2VudHJ5ID0gcHJldl90b3AgPSAtMTsKKwl9CisKKwlpZiAodG9wICE9IHByZXZfdG9wKSB7CisJICAgIGRyYXdfbWVudShlbnRyeSwgdG9wLCAxKTsKKwkgICAgZGlzcGxheV9oZWxwKG1lLT5oZWxwdGV4dCk7CisJfSBlbHNlIGlmIChlbnRyeSAhPSBwcmV2X2VudHJ5KSB7CisJICAgIGRyYXdfcm93KHByZXZfZW50cnkgLSB0b3AgKyA0ICsgVlNISUZULCBlbnRyeSwgdG9wLCAwLCAwKTsKKwkgICAgZHJhd19yb3coZW50cnkgLSB0b3AgKyA0ICsgVlNISUZULCBlbnRyeSwgdG9wLCAwLCAwKTsKKwkgICAgZGlzcGxheV9oZWxwKG1lLT5oZWxwdGV4dCk7CisJfQorCisJcHJldl9lbnRyeSA9IGVudHJ5OworCXByZXZfdG9wID0gdG9wOworCWNtLT5jdXJlbnRyeSA9IGVudHJ5OworCWNtLT5jdXJ0b3AgPSB0b3A7CisKKwkvKiBDdXJzb3IgbW92ZW1lbnQgY2FuY2VscyB0aW1lb3V0ICovCisJaWYgKGVudHJ5ICE9IGNtLT5kZWZlbnRyeSkKKwkgICAga2V5X3RpbWVvdXQgPSAwOworCisJaWYgKGtleV90aW1lb3V0KSB7CisJICAgIGludCB0b2wgPSB0aW1lb3V0X2xlZnQgLyBDTEtfVENLOworCSAgICBwcmludF90aW1lb3V0X21lc3NhZ2UodG9sLCBUSU1FT1VUX1JPVywgY20tPm1lc3NhZ2VzW01TR19BVVRPQk9PVF0pOworCSAgICB0b19jbGVhciA9IDE7CisJfSBlbHNlIHsKKwkgICAgdG9fY2xlYXIgPSAwOworCX0KKworCWlmIChob3RrZXkgJiYgbWUtPmltbWVkaWF0ZSkgeworCSAgICAvKiBJZiB0aGUgaG90a2V5IHdhcyBmbGFnZ2VkIGltbWVkaWF0ZSwgc2ltdWxhdGUgcHJlc3NpbmcgRU5URVIgKi8KKwkgICAga2V5ID0gS0VZX0VOVEVSOworCX0gZWxzZSB7CisJICAgIHRoaXNfdGltZW91dCA9IG1pbihtaW4oa2V5X3RpbWVvdXQsIHRpbWVvdXRfbGVmdCksCisJCQkgICAgICAgKGNsb2NrX3QpIENMS19UQ0spOworCSAgICBrZXkgPSBteWdldGtleSh0aGlzX3RpbWVvdXQpOworCisJICAgIGlmIChrZXkgIT0gS0VZX05PTkUpIHsKKwkJdGltZW91dF9sZWZ0ID0ga2V5X3RpbWVvdXQ7CisJCWlmICh0b19jbGVhcikKKwkJICAgIHByaW50ZigiXDAzM1slZDsxSFwxIzBcMDMzW0siLCBUSU1FT1VUX1JPVyk7CisJICAgIH0KKwl9CisKKwlob3RrZXkgPSBmYWxzZTsKKworCXN3aXRjaCAoa2V5KSB7CisJY2FzZSBLRVlfTk9ORToJCS8qIFRpbWVvdXQgKi8KKwkgICAgLyogVGhpcyBpcyBzb21ld2hhdCBoYWNreSwgYnV0IHRoaXMgYXQgbGVhc3QgbGV0cyB0aGUgdXNlcgorCSAgICAgICBrbm93IHdoYXQncyBnb2luZyBvbiwgYW5kIHN0aWxsIGRlYWxzIHdpdGggInBoYW50b20gaW5wdXRzIgorCSAgICAgICBlLmcuIG9uIHNlcmlhbCBwb3J0cy4KKworCSAgICAgICBXYXJuaW5nOiBhIHRpbWVvdXQgd2lsbCBib290IHRoZSBkZWZhdWx0IGVudHJ5IHdpdGhvdXQgYW55CisJICAgICAgIHBhc3N3b3JkISAqLworCSAgICBpZiAoa2V5X3RpbWVvdXQpIHsKKwkJaWYgKHRpbWVvdXRfbGVmdCA8PSB0aGlzX3RpbWVvdXQpCisJCSAgICBsb25nam1wKHRpbWVvdXRfanVtcCwgMSk7CisKKwkJdGltZW91dF9sZWZ0IC09IHRoaXNfdGltZW91dDsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX0NUUkwoJ0wnKToKKwkgICAgY2xlYXIgPSAxOworCSAgICBicmVhazsKKworCWNhc2UgS0VZX0VOVEVSOgorCWNhc2UgS0VZX0NUUkwoJ0onKToKKwkgICAga2V5X3RpbWVvdXQgPSAwOwkvKiBDYW5jZWxzIHRpbWVvdXQgKi8KKwkgICAgaWYgKG1lLT5wYXNzd2QpIHsKKwkJY2xlYXIgPSAxOworCQlkb25lID0gYXNrX3Bhc3N3ZChtZS0+cGFzc3dkKTsKKwkgICAgfSBlbHNlIHsKKwkJZG9uZSA9IDE7CisJICAgIH0KKwkgICAgY21kbGluZSA9IE5VTEw7CisJICAgIGlmIChkb25lKSB7CisJCXN3aXRjaCAobWUtPmFjdGlvbikgeworCQljYXNlIE1BX0NNRDoKKwkJICAgIGNtZGxpbmUgPSBtZS0+Y21kbGluZTsKKwkJICAgIGJyZWFrOworCQljYXNlIE1BX1NVQk1FTlU6CisJCWNhc2UgTUFfR09UTzoKKwkJY2FzZSBNQV9FWElUOgorCQkgICAgZG9uZSA9IDA7CisJCSAgICBjbGVhciA9IDI7CisJCSAgICBjbSA9IG1lLT5zdWJtZW51OworCQkgICAgZW50cnkgPSBjbS0+Y3VyZW50cnk7CisJCSAgICB0b3AgPSBjbS0+Y3VydG9wOworCQkgICAgYnJlYWs7CisJCWNhc2UgTUFfUVVJVDoKKwkJICAgIC8qIFF1aXQgbWVudSBzeXN0ZW0gKi8KKwkJICAgIGRvbmUgPSAxOworCQkgICAgY2xlYXIgPSAxOworCQkgICAgZHJhd19yb3coZW50cnkgLSB0b3AgKyA0ICsgVlNISUZULCAtMSwgdG9wLCAwLCAwKTsKKwkJICAgIGJyZWFrOworCQljYXNlIE1BX0hFTFA6CisJCSAgICBrZXkgPSBzaG93X21lc3NhZ2VfZmlsZShtZS0+Y21kbGluZSwgbWUtPmJhY2tncm91bmQpOworCQkgICAgLyogSWYgdGhlIGV4aXQgd2FzIGFuIEYta2V5LCBkaXNwbGF5IHRoYXQgaGVscCBzY3JlZW4gKi8KKwkJICAgIHNob3dfZmtleShrZXkpOworCQkgICAgZG9uZSA9IDA7CisJCSAgICBjbGVhciA9IDE7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIGRvbmUgPSAwOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgICBpZiAoZG9uZSAmJiAhbWUtPnBhc3N3ZCkgeworCQkvKiBPbmx5IHNhdmUgYSBuZXcgZGVmYXVsdCBpZiB3ZSBkb24ndCBoYXZlIGEgcGFzc3dvcmQuLi4gKi8KKwkJaWYgKG1lLT5zYXZlICYmIG1lLT5sYWJlbCkgeworCQkgICAgc3lzbGludXhfc2V0YWR2KEFEVl9NRU5VU0FWRSwgc3RybGVuKG1lLT5sYWJlbCksIG1lLT5sYWJlbCk7CisJCSAgICBzeXNsaW51eF9hZHZfd3JpdGUoKTsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfVVA6CisJY2FzZSBLRVlfQ1RSTCgnUCcpOgorCSAgICB3aGlsZSAoZW50cnkgPiAwKSB7CisJCWVudHJ5LS07CisJCWlmIChlbnRyeSA8IHRvcCkKKwkJICAgIHRvcCAtPSBNRU5VX1JPV1M7CisJCWlmICghaXNfZGlzYWJsZWQoY20tPm1lbnVfZW50cmllc1tlbnRyeV0pKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9ET1dOOgorCWNhc2UgS0VZX0NUUkwoJ04nKToKKwkgICAgd2hpbGUgKGVudHJ5IDwgY20tPm5lbnRyaWVzIC0gMSkgeworCQllbnRyeSsrOworCQlpZiAoZW50cnkgPj0gdG9wICsgTUVOVV9ST1dTKQorCQkgICAgdG9wICs9IE1FTlVfUk9XUzsKKwkJaWYgKCFpc19kaXNhYmxlZChjbS0+bWVudV9lbnRyaWVzW2VudHJ5XSkpCisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX1BHVVA6CisJY2FzZSBLRVlfTEVGVDoKKwljYXNlIEtFWV9DVFJMKCdCJyk6CisJY2FzZSAnPCc6CisJICAgIGVudHJ5IC09IE1FTlVfUk9XUzsKKwkgICAgdG9wIC09IE1FTlVfUk9XUzsKKwkgICAgd2hpbGUgKGVudHJ5ID4gMCAmJiBpc19kaXNhYmxlZChjbS0+bWVudV9lbnRyaWVzW2VudHJ5XSkpIHsKKwkJZW50cnktLTsKKwkJaWYgKGVudHJ5IDwgdG9wKQorCQkgICAgdG9wIC09IE1FTlVfUk9XUzsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX1BHRE46CisJY2FzZSBLRVlfUklHSFQ6CisJY2FzZSBLRVlfQ1RSTCgnRicpOgorCWNhc2UgJz4nOgorCWNhc2UgJyAnOgorCSAgICBlbnRyeSArPSBNRU5VX1JPV1M7CisJICAgIHRvcCArPSBNRU5VX1JPV1M7CisJICAgIHdoaWxlIChlbnRyeSA8IGNtLT5uZW50cmllcyAtIDEKKwkJICAgJiYgaXNfZGlzYWJsZWQoY20tPm1lbnVfZW50cmllc1tlbnRyeV0pKSB7CisJCWVudHJ5Kys7CisJCWlmIChlbnRyeSA+PSB0b3AgKyBNRU5VX1JPV1MpCisJCSAgICB0b3AgKz0gTUVOVV9ST1dTOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAnLSc6CisJICAgIHdoaWxlIChlbnRyeSA+IDApIHsKKwkJZW50cnktLTsKKwkJdG9wLS07CisJCWlmICghaXNfZGlzYWJsZWQoY20tPm1lbnVfZW50cmllc1tlbnRyeV0pKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICcrJzoKKwkgICAgd2hpbGUgKGVudHJ5IDwgY20tPm5lbnRyaWVzIC0gMSkgeworCQllbnRyeSsrOworCQl0b3ArKzsKKwkJaWYgKCFpc19kaXNhYmxlZChjbS0+bWVudV9lbnRyaWVzW2VudHJ5XSkpCisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgS0VZX0NUUkwoJ0EnKToKKwljYXNlIEtFWV9IT01FOgorCSAgICB0b3AgPSBlbnRyeSA9IDA7CisJICAgIGJyZWFrOworCisJY2FzZSBLRVlfQ1RSTCgnRScpOgorCWNhc2UgS0VZX0VORDoKKwkgICAgZW50cnkgPSBjbS0+bmVudHJpZXMgLSAxOworCSAgICB0b3AgPSBtYXgoMCwgY20tPm5lbnRyaWVzIC0gTUVOVV9ST1dTKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9GMToKKwljYXNlIEtFWV9GMjoKKwljYXNlIEtFWV9GMzoKKwljYXNlIEtFWV9GNDoKKwljYXNlIEtFWV9GNToKKwljYXNlIEtFWV9GNjoKKwljYXNlIEtFWV9GNzoKKwljYXNlIEtFWV9GODoKKwljYXNlIEtFWV9GOToKKwljYXNlIEtFWV9GMTA6CisJY2FzZSBLRVlfRjExOgorCWNhc2UgS0VZX0YxMjoKKwkgICAgc2hvd19ma2V5KGtleSk7CisJICAgIGNsZWFyID0gMTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtFWV9UQUI6CisJICAgIGlmIChjbS0+YWxsb3dlZGl0ICYmIG1lLT5hY3Rpb24gPT0gTUFfQ01EKSB7CisJCWludCBvayA9IDE7CisKKwkJa2V5X3RpbWVvdXQgPSAwOwkvKiBDYW5jZWxzIHRpbWVvdXQgKi8KKwkJZHJhd19yb3coZW50cnkgLSB0b3AgKyA0ICsgVlNISUZULCAtMSwgdG9wLCAwLCAwKTsKKworCQlpZiAoY20tPm1lbnVfbWFzdGVyX3Bhc3N3ZCkgeworCQkgICAgb2sgPSBhc2tfcGFzc3dkKE5VTEwpOworCQkgICAgY2xlYXJfc2NyZWVuKCk7CisJCSAgICBkcmF3X21lbnUoLTEsIHRvcCwgMCk7CisJCX0gZWxzZSB7CisJCSAgICAvKiBFcmFzZSBbVGFiXSBtZXNzYWdlIGFuZCBoZWxwIHRleHQgKi8KKwkJICAgIHByaW50ZigiXDAzM1slZDsxSFwxIzBcMDMzW0siLCBUQUJNU0dfUk9XKTsKKwkJICAgIGRpc3BsYXlfaGVscChOVUxMKTsKKwkJfQorCisJCWlmIChvaykgeworCQkgICAgY21kbGluZSA9IGVkaXRfY21kbGluZShtZS0+Y21kbGluZSwgdG9wKTsKKwkJICAgIGRvbmUgPSAhIWNtZGxpbmU7CisJCSAgICBjbGVhciA9IDE7CS8qIEluIGNhc2Ugd2UgaGl0IFtFc2NdIGFuZCBkb25lIGlzIG51bGwgKi8KKwkJfSBlbHNlIHsKKwkJICAgIGRyYXdfcm93KGVudHJ5IC0gdG9wICsgNCArIFZTSElGVCwgZW50cnksIHRvcCwgMCwgMCk7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIEtFWV9DVFJMKCdDJyk6CS8qIEN0cmwtQyAqLworCWNhc2UgS0VZX0VTQzoJCS8qIEVzYyAqLworCSAgICBpZiAoY20tPnBhcmVudCkgeworCQljbSA9IGNtLT5wYXJlbnQ7CisJCWNsZWFyID0gMjsKKwkJZW50cnkgPSBjbS0+Y3VyZW50cnk7CisJCXRvcCA9IGNtLT5jdXJ0b3A7CisJICAgIH0gZWxzZSBpZiAoY20tPmFsbG93ZWRpdCkgeworCQlkb25lID0gMTsKKwkJY2xlYXIgPSAxOworCQlrZXlfdGltZW91dCA9IDA7CisKKwkJZHJhd19yb3coZW50cnkgLSB0b3AgKyA0ICsgVlNISUZULCAtMSwgdG9wLCAwLCAwKTsKKworCQlpZiAoY20tPm1lbnVfbWFzdGVyX3Bhc3N3ZCkKKwkJICAgIGRvbmUgPSBhc2tfcGFzc3dkKE5VTEwpOworCSAgICB9CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGlmIChrZXkgPiAwICYmIGtleSA8IDB4RkYpIHsKKwkJa2V5ICY9IH4weDIwOwkvKiBVcHBlciBjYXNlICovCisJCWlmIChjbS0+bWVudV9ob3RrZXlzW2tleV0pIHsKKwkJICAgIGtleV90aW1lb3V0ID0gMDsKKwkJICAgIGVudHJ5ID0gY20tPm1lbnVfaG90a2V5c1trZXldLT5lbnRyeTsKKwkJICAgIC8qIFNob3VsZCB3ZSBjb21taXQgYXQgdGhpcyBwb2ludD8gKi8KKwkJICAgIGhvdGtleSA9IHRydWU7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgcHJpbnRmKCJcMDMzWz8yNWgiKTsJLyogU2hvdyBjdXJzb3IgKi8KKworICAgIC8qIFJldHVybiB0aGUgbGFiZWwgbmFtZSBzbyBsb2NhbGJvb3QgYW5kIGlwYXBwZW5kIHdvcmsgKi8KKyAgICByZXR1cm4gY21kbGluZTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBjb25zdCBjaGFyICpjbWRsaW5lOworICAgIHN0cnVjdCBtZW51ICptOworICAgIGludCByb3dzLCBjb2xzOworICAgIGludCBpOworCisgICAgKHZvaWQpYXJnYzsKKworICAgIHBhcnNlX2NvbmZpZ3MoYXJndiArIDEpOworCisgICAgLyoKKyAgICAgKiBXZSBkb24ndCBzdGFydCB0aGUgY29uc29sZSB1bnRpbCB3ZSBoYXZlIHBhcnNlZCB0aGUgY29uZmlndXJhdGlvbgorICAgICAqIGZpbGUsIHNpbmNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgbWlnaHQgaW1wYWN0IHRoZSBjb25zb2xlCisgICAgICogY29uZmlndXJhdGlvbiwgZS5nLiBNRU5VIFJFU09MVVRJT04uCisgICAgICovCisgICAgc3RhcnRfY29uc29sZSgpOworICAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZyb3dzLCAmY29scykpIHsKKwkvKiBVbmtub3duIHNjcmVlbiBzaXplPyAqLworCXJvd3MgPSAyNDsKKwljb2xzID0gODA7CisgICAgfQorCisgICAgLyogU29tZSBwb3N0cHJvY2Vzc2luZyBmb3IgYWxsIG1lbnVzICovCisgICAgZm9yIChtID0gbWVudV9saXN0OyBtOyBtID0gbS0+bmV4dCkgeworCWlmICghbS0+bXBhcm1bUF9XSURUSF0pCisJICAgIG0tPm1wYXJtW1BfV0lEVEhdID0gY29sczsKKworCS8qIElmIGFueW9uZSBoYXMgc3BlY2lmaWVkIG5lZ2F0aXZlIHBhcmFtZXRlcnMsIGNvbnNpZGVyIHRoZW0KKwkgICByZWxhdGl2ZSB0byB0aGUgYm90dG9tIHJvdyBvZiB0aGUgc2NyZWVuLiAqLworCWZvciAoaSA9IDA7IGkgPCBOUEFSQU1TOyBpKyspCisJICAgIGlmIChtLT5tcGFybVtpXSA8IDApCisJCW0tPm1wYXJtW2ldID0gbWF4KG0tPm1wYXJtW2ldICsgcm93cywgMCk7CisgICAgfQorCisgICAgY20gPSBzdGFydF9tZW51OworCisgICAgaWYgKCFjbS0+bmVudHJpZXMpIHsKKwlmcHV0cygiSW5pdGlhbCBtZW51IGhhcyBubyBMQUJFTCBlbnRyaWVzIVxuIiwgc3Rkb3V0KTsKKwlyZXR1cm4gMTsJCS8qIEVycm9yISAqLworICAgIH0KKworICAgIGZvciAoOzspIHsKKwlsb2NhbF9jdXJzb3JfZW5hYmxlKHRydWUpOworCWNtZGxpbmUgPSBydW5fbWVudSgpOworCisJaWYgKGNsZWFybWVudSkKKwkgICAgY2xlYXJfc2NyZWVuKCk7CisKKwlsb2NhbF9jdXJzb3JfZW5hYmxlKGZhbHNlKTsKKwlwcmludGYoIlwwMzNbPzI1aFwwMzNbJWQ7MUhcMDMzWzBtIiwgRU5EX1JPVyk7CisKKwlpZiAoY21kbGluZSkgeworCSAgICB1aW50MzJfdCB0eXBlID0gcGFyc2VfaW1hZ2VfdHlwZShjbWRsaW5lKTsKKworCSAgICBleGVjdXRlKGNtZGxpbmUsIHR5cGUsIGZhbHNlKTsKKwkgICAgaWYgKGNtLT5vbmVycm9yKSB7CisJCXR5cGUgPSBwYXJzZV9pbWFnZV90eXBlKGNtLT5vbmVycm9yKTsKKwkJZXhlY3V0ZShjbS0+b25lcnJvciwgdHlwZSwgdHJ1ZSk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICByZXR1cm4gMDsJCS8qIEV4aXQgKi8KKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvbWVudS9wYXNzd2QuYyBiL2NvbTMyL21lbnUvcGFzc3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjZmQwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21lbnUvcGFzc3dkLmMKQEAgLTAsMCArMSw5NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHhjcnlwdC5oPgorI2luY2x1ZGUgPHNoYTEuaD4KKyNpbmNsdWRlIDxiYXNlNjQuaD4KKworI2luY2x1ZGUgIm1lbnUuaCIKKworc3RhdGljIGludCBwYXNzd2RfY29tcGFyZV9zaGExKGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgY2hhciAqZW50cnkpCit7CisgICAgc3RydWN0IHsKKwlTSEExX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXSwgcHdkc2hhMVsyMF07CisgICAgfSBkOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaW50IHJ2OworCisgICAgU0hBMUluaXQoJmQuY3R4KTsKKworICAgIGlmICgocCA9IHN0cmNocihwYXNzd2QgKyAzLCAnJCcpKSkgeworCVNIQTFVcGRhdGUoJmQuY3R4LCAodm9pZCAqKXBhc3N3ZCArIDMsIHAgLSAocGFzc3dkICsgMykpOworCXArKzsKKyAgICB9IGVsc2UgeworCXAgPSBwYXNzd2QgKyAzOwkJLyogQXNzdW1lIG5vIHNhbHQgKi8KKyAgICB9CisKKyAgICBTSEExVXBkYXRlKCZkLmN0eCwgKHZvaWQgKillbnRyeSwgc3RybGVuKGVudHJ5KSk7CisgICAgU0hBMUZpbmFsKGQuc2hhMSwgJmQuY3R4KTsKKworICAgIG1lbXNldChkLnB3ZHNoYTEsIDAsIDIwKTsKKyAgICB1bmJhc2U2NChkLnB3ZHNoYTEsIDIwLCBwKTsKKworICAgIHJ2ID0gIW1lbWNtcChkLnNoYTEsIGQucHdkc2hhMSwgMjApOworCisgICAgbWVtc2V0KCZkLCAwLCBzaXplb2YgZCk7CisgICAgcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHBhc3N3ZF9jb21wYXJlX21kNShjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IGNoYXIgKmVudHJ5KQoreworICAgIGNvbnN0IGNoYXIgKmNyeXB0ZWQgPSBjcnlwdF9tZDUoZW50cnksIHBhc3N3ZCArIDMpOworICAgIGludCBsZW4gPSBzdHJsZW4oY3J5cHRlZCk7CisKKyAgICByZXR1cm4gIXN0cm5jbXAoY3J5cHRlZCwgcGFzc3dkLCBsZW4pICYmCisJKHBhc3N3ZFtsZW5dID09ICdcMCcgfHwgcGFzc3dkW2xlbl0gPT0gJyQnKTsKK30KKworc3RhdGljIGludCBwYXNzd2RfY29tcGFyZV9zaGEyNTYoY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCBjaGFyICplbnRyeSkKK3sKKyAgICBjb25zdCBjaGFyICpjcnlwdGVkID0gc2hhMjU2X2NyeXB0KGVudHJ5LCBwYXNzd2QgKyAzKTsKKyAgICBpbnQgbGVuID0gc3RybGVuKGNyeXB0ZWQpOworCisgICAgcmV0dXJuICFzdHJuY21wKGNyeXB0ZWQsIHBhc3N3ZCwgbGVuKSAmJgorCShwYXNzd2RbbGVuXSA9PSAnXDAnIHx8IHBhc3N3ZFtsZW5dID09ICckJyk7Cit9CisKK3N0YXRpYyBpbnQgcGFzc3dkX2NvbXBhcmVfc2hhNTEyKGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgY2hhciAqZW50cnkpCit7CisgICAgY29uc3QgY2hhciAqY3J5cHRlZCA9IHNoYTUxMl9jcnlwdChlbnRyeSwgcGFzc3dkICsgMyk7CisgICAgaW50IGxlbiA9IHN0cmxlbihjcnlwdGVkKTsKKworICAgIHJldHVybiAhc3RybmNtcChjcnlwdGVkLCBwYXNzd2QsIGxlbikgJiYKKwkocGFzc3dkW2xlbl0gPT0gJ1wwJyB8fCBwYXNzd2RbbGVuXSA9PSAnJCcpOworfQorCitpbnQgcGFzc3dkX2NvbXBhcmUoY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCBjaGFyICplbnRyeSkKK3sKKyAgICBpZiAocGFzc3dkWzBdICE9ICckJyB8fCAhcGFzc3dkWzFdIHx8IHBhc3N3ZFsyXSAhPSAnJCcpIHsKKwkvKiBQbGFpbnRleHQgcGFzc3dkLCB5dWNrISAqLworCXJldHVybiAhc3RyY21wKGVudHJ5LCBwYXNzd2QpOworICAgIH0gZWxzZSB7CisJc3dpdGNoIChwYXNzd2RbMV0pIHsKKwljYXNlICcxJzoKKwkgICAgcmV0dXJuIHBhc3N3ZF9jb21wYXJlX21kNShwYXNzd2QsIGVudHJ5KTsKKwljYXNlICc0JzoKKwkgICAgcmV0dXJuIHBhc3N3ZF9jb21wYXJlX3NoYTEocGFzc3dkLCBlbnRyeSk7CisJY2FzZSAnNSc6CisJICAgIHJldHVybiBwYXNzd2RfY29tcGFyZV9zaGEyNTYocGFzc3dkLCBlbnRyeSk7CisJY2FzZSAnNic6CisJICAgIHJldHVybiBwYXNzd2RfY29tcGFyZV9zaGE1MTIocGFzc3dkLCBlbnRyeSk7CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIDA7CQkvKiBVbmtub3duIGVuY3J5cHRpb24gYWxnb3JpdGhtIC0+IGZhbHNlICovCisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbTMyL21lbnUvcHJpbnRtc2cuYyBiL2NvbTMyL21lbnUvcHJpbnRtc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNlYWMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbWVudS9wcmludG1zZy5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbnNvbGVzLmg+CisjaW5jbHVkZSA8Z2V0a2V5Lmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2hhMS5oPgorI2luY2x1ZGUgPGJhc2U2NC5oPgorI2luY2x1ZGUgPGNvbG9ydGJsLmg+CisjaWZkZWYgX19DT00zMl9fCisjaW5jbHVkZSA8Y29tMzIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibWVudS5oIgorCitzdGF0aWMgaW50IGRyYXdfbWVzc2FnZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIEZJTEUgKmY7CisgICAgaW50IGNoOworICAgIGVudW0gbXNnbmFtZV9zdGF0ZSB7CisJc3RfaW5pdCwJCS8qIEJhc2Ugc3RhdGUgKi8KKwlzdF9zaV8xLAkJLyogPFNJPiBkaWdpdCAxICovCisJc3Rfc2lfMiwJCS8qIDxTST4gZGlnaXQgMiAqLworCXN0X3NraXBsaW5lLAkJLyogU2tpcCB1bnRpbCBOTCAqLworICAgIH0gc3RhdGUgPSBzdF9pbml0OworICAgIGludCBlb2YgPSAwOworICAgIGludCBhdHRyID0gMDsKKworICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICBpZiAoIWYpCisJcmV0dXJuIC0xOworCisgICAgLyogQ2xlYXIgc2NyZWVuLCBoaWRlIGN1cnNvciwgZGVmYXVsdCBhdHRyaWJ1dGUgKi8KKyAgICBwcmludGYoIlwwMzNlXDAzMyUlQFwwMzMpMFwwMzMoQlwzIyUwM2RcMDMzWz8yNWxcMDMzWzJKXDAzM1tIIiwKKwkgICBtZXNzYWdlX2Jhc2VfY29sb3IgKyAweDA3KTsKKworICAgIHdoaWxlICghZW9mICYmIChjaCA9IGdldGMoZikpICE9IEVPRikgeworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIHN0X2luaXQ6CisJICAgIHN3aXRjaCAoY2gpIHsKKwkgICAgY2FzZSAnXGYnOgorCQlmcHV0cygiXDAzM1sySlwwMzNbSCIsIHN0ZG91dCk7CisJCWJyZWFrOworCSAgICBjYXNlIDE1OgkJLyogU0kgKi8KKwkJc3RhdGUgPSBzdF9zaV8xOworCQlicmVhazsKKwkgICAgY2FzZSAyNDoKKwkJc3RhdGUgPSBzdF9za2lwbGluZTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMjY6CisJCWVvZiA9IDE7CisJCWJyZWFrOworCSAgICBjYXNlICdcYSc6CisJICAgIGNhc2UgJ1xuJzoKKwkgICAgY2FzZSAnXHInOgorCQlwdXRjaGFyKGNoKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWlmIChjaCA+PSAzMikKKwkJICAgIHB1dGNoYXIoY2gpOworCQlicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2Ugc3Rfc2lfMToKKwkgICAgYXR0ciA9IGhleHZhbChjaCkgPDwgNDsKKwkgICAgc3RhdGUgPSBzdF9zaV8yOworCSAgICBicmVhazsKKworCWNhc2Ugc3Rfc2lfMjoKKwkgICAgYXR0ciB8PSBoZXh2YWwoY2gpOworCSAgICBwcmludGYoIlwzIyUwM2QiLCBhdHRyICsgbWVzc2FnZV9iYXNlX2NvbG9yKTsKKwkgICAgc3RhdGUgPSBzdF9pbml0OworCSAgICBicmVhazsKKworCWNhc2Ugc3Rfc2tpcGxpbmU6CisJICAgIGlmIChjaCA9PSAnXG4nKQorCQlzdGF0ZSA9IHN0X2luaXQ7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBmY2xvc2UoZik7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzaG93X21lc3NhZ2VfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqYmFja2dyb3VuZCkKK3sKKyAgICBpbnQgcnYgPSBLRVlfTk9ORTsKKyAgICBjb25zdCBjaGFyICpvbGRfYmFja2dyb3VuZCA9IE5VTEw7CisKKyAgICBpZiAoYmFja2dyb3VuZCkgeworCW9sZF9iYWNrZ3JvdW5kID0gY3VycmVudF9iYWNrZ3JvdW5kOworCXNldF9iYWNrZ3JvdW5kKGJhY2tncm91bmQpOworICAgIH0KKworICAgIGlmICghKHJ2ID0gZHJhd19tZXNzYWdlX2ZpbGUoZmlsZW5hbWUpKSkKKwlydiA9IG15Z2V0a2V5KDApOwkvKiBXYWl0IGZvciBrZXlwcmVzcyAqLworCisgICAgaWYgKG9sZF9iYWNrZ3JvdW5kKQorCXNldF9iYWNrZ3JvdW5kKG9sZF9iYWNrZ3JvdW5kKTsKKworICAgIHJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21lbnUvcmVhZGNvbmZpZy5jIGIvY29tMzIvbWVudS9yZWFkY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4MTRiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21lbnUvcmVhZGNvbmZpZy5jCkBAIC0wLDAgKzEsMTE3NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGNvbG9ydGJsLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9hZHYuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgIm1lbnUuaCIKKworLyogRW1wdHkgcmVmc3RyaW5nICovCitjb25zdCBjaGFyICplbXB0eV9zdHJpbmc7CisKKy8qIFJvb3QgbWVudSwgc3RhcnRpbmcgbWVudSwgaGlkZGVuIG1lbnUsIGFuZCBsaXN0IG9mIGFsbCBtZW51cyAqLworc3RydWN0IG1lbnUgKnJvb3RfbWVudSwgKnN0YXJ0X21lbnUsICpoaWRlX21lbnUsICptZW51X2xpc3Q7CisKKy8qIFRoZXNlIGFyZSBnbG9iYWwgcGFyYW1ldGVycyByZWdhcmRsZXNzIG9mIHdoaWNoIG1lbnUgd2UncmUgZGlzcGxheWluZyAqLworaW50IHNoaWZ0a2V5ID0gMDsJCS8qIE9ubHkgZGlzcGxheSBtZW51IGlmIHNoaWZ0IGtleSBwcmVzc2VkICovCitpbnQgaGlkZGVubWVudSA9IDA7CitpbnQgY2xlYXJtZW51ID0gMDsKK2xvbmcgbG9uZyB0b3RhbHRpbWVvdXQgPSAwOworY29uc3QgY2hhciAqaGlkZV9rZXlbS0VZX01BWF07CisKKy8qIEtlZXAgdHJhY2sgb2YgZ2xvYmFsIGRlZmF1bHQgKi8KK3N0YXRpYyBpbnQgaGFzX3VpID0gMDsJCS8qIERFRkFVTFQgb25seSBjb3VudHMgaWYgVUkgaXMgZm91bmQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpnbG9iYWxkZWZhdWx0ID0gTlVMTDsKK3N0YXRpYyBib29sIG1lbnVzYXZlID0gZmFsc2U7CS8qIFRydWUgaWYgdGhlcmUgaXMgYW55ICJtZW51IHNhdmUiICovCisKKy8qIExpbmtlZCBsaXN0IG9mIGFsbCBlbnRpcmVzLCBoaWRkZW4gb3Igbm90OyB1c2VkIGJ5IHVubGFiZWwoKSAqLworc3RhdGljIHN0cnVjdCBtZW51X2VudHJ5ICphbGxfZW50cmllczsKK3N0YXRpYyBzdHJ1Y3QgbWVudV9lbnRyeSAqKmFsbF9lbnRyaWVzX2VuZCA9ICZhbGxfZW50cmllczsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZXNzYWdlcyBtZXNzYWdlc1tNU0dfQ09VTlRdID0geworICAgIFtNU0dfQVVUT0JPT1RdID0geyJhdXRvYm9vdCIsICJBdXRvbWF0aWMgYm9vdCBpbiAjIHNlY29uZHssc30uLi4ifSwKKyAgICBbTVNHX1RBQl0gPSB7InRhYm1zZyIsICJQcmVzcyBbVGFiXSB0byBlZGl0IG9wdGlvbnMifSwKKyAgICBbTVNHX05PVEFCXSA9IHsibm90YWJtc2ciLCAiIn0sCisgICAgW01TR19QQVNTUFJPTVBUXSA9IHsicGFzc3Byb21wdCIsICJQYXNzd29yZCByZXF1aXJlZCJ9LAorfTsKKworI2RlZmluZSBhc3RyZHVwKHgpICh7IGNoYXIgKl9feCA9ICh4KTsgXAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX24gPSBzdHJsZW4oX194KSArIDE7IFwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICpfX3AgPSBhbGxvY2EoX19uKTsgXAorICAgICAgICAgICAgICAgICAgICAgIGlmICggX19wICkgbWVtY3B5KF9fcCwgX194LCBfX24pOyBcCisgICAgICAgICAgICAgICAgICAgICAgX19wOyB9KQorCisvKiBNdXN0IG1hdGNoIGVudW0ga2VybmVsX3R5cGUgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrZXJuZWxfdHlwZXNbXSA9IHsKKyAgICAibm9uZSIsCisgICAgImxvY2FsYm9vdCIsCisgICAgImtlcm5lbCIsCisgICAgImxpbnV4IiwKKyAgICAiYm9vdCIsCisgICAgImJzcyIsCisgICAgInB4ZSIsCisgICAgImZkaW1hZ2UiLAorICAgICJjb21ib290IiwKKyAgICAiY29tMzIiLAorICAgICJjb25maWciLAorICAgIE5VTEwKK307CisKKy8qCisgKiBTZWFyY2ggdGhlIGxpc3Qgb2YgYWxsIG1lbnVzIGZvciBhIHNwZWNpZmljIGxhYmVsCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWVudSAqZmluZF9tZW51KGNvbnN0IGNoYXIgKmxhYmVsKQoreworICAgIHN0cnVjdCBtZW51ICptOworCisgICAgZm9yIChtID0gbWVudV9saXN0OyBtOyBtID0gbS0+bmV4dCkgeworCWlmICghc3RyY21wKGxhYmVsLCBtLT5sYWJlbCkpCisJICAgIHJldHVybiBtOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisjZGVmaW5lIE1BWF9MSU5FIDQwOTYKKworLyogU3RyaXAgXiBmcm9tIGEgc3RyaW5nLCByZXR1cm5pbmcgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIHJlZnN0cmluZworICAgaWYgbm9uZSBwcmVzZW50ICovCitzdGF0aWMgY29uc3QgY2hhciAqc3RyaXBfY2FyZXQoY29uc3QgY2hhciAqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKnAsICpyOworICAgIGNoYXIgKnE7CisgICAgaW50IGNhcmV0cyA9IDA7CisKKyAgICBwID0gc3RyOworICAgIGZvciAoOzspIHsKKwlwID0gc3RyY2hyKHAsICdeJyk7CisJaWYgKCFwKQorCSAgICBicmVhazsKKwljYXJldHMrKzsKKwlwKys7CisgICAgfQorCisgICAgaWYgKCFjYXJldHMpCisJcmV0dXJuIHJlZnN0cl9nZXQoc3RyKTsKKworICAgIHIgPSBxID0gcmVmc3RyX2FsbG9jKHN0cmxlbihzdHIpIC0gY2FyZXRzKTsKKyAgICBmb3IgKHAgPSBzdHI7ICpwOyBwKyspCisJaWYgKCpwICE9ICdeJykKKwkgICAgKnErKyA9ICpwOworCisgICAgKnEgPSAnXDAnOwkJCS8qIHJlZnN0cl9hbGxvYygpIGFscmVhZHkgZGlkIHRoaXMuLi4gKi8KKworICAgIHJldHVybiByOworfQorCisvKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGF0IGEgY2VydGFpbiBrZXl3b3JkIChjYXNlIGluc2Vuc2l0aXZlKSAqLworLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBwYXN0IHRoZSBrZXl3b3JkICovCitzdGF0aWMgY2hhciAqbG9va2luZ19hdChjaGFyICpsaW5lLCBjb25zdCBjaGFyICprd2QpCit7CisgICAgY2hhciAqcCA9IGxpbmU7CisgICAgY29uc3QgY2hhciAqcSA9IGt3ZDsKKworICAgIHdoaWxlICgqcCAmJiAqcSAmJiAoKCpwIF4gKnEpICYgfjB4MjApID09IDApIHsKKwlwKys7CisJcSsrOworICAgIH0KKworICAgIGlmICgqcSkKKwlyZXR1cm4gTlVMTDsJCS8qIERpZG4ndCBzZWUgdGhlIGtleXdvcmQgKi8KKworICAgIHJldHVybiBteV9pc3NwYWNlKCpwKSA/IHAgOiBOVUxMOwkvKiBNdXN0IGJlIEVPTCBvciB3aGl0ZXNwYWNlICovCit9CisKKy8qIEdldCBhIHNpbmdsZSB3b3JkIGludG8gYSBuZXcgcmVmc3RyOyBhZHZhbmNlcyB0aGUgaW5wdXQgcG9pbnRlciAqLworc3RhdGljIGNoYXIgKmdldF93b3JkKGNoYXIgKnN0ciwgY2hhciAqKndvcmQpCit7CisgICAgY2hhciAqcCA9IHN0cjsKKyAgICBjaGFyICpxOworCisgICAgd2hpbGUgKCpwICYmICFteV9pc3NwYWNlKCpwKSkKKwlwKys7CisKKyAgICAqd29yZCA9IHEgPSByZWZzdHJfYWxsb2MocCAtIHN0cik7CisgICAgbWVtY3B5KHEsIHN0ciwgcCAtIHN0cik7CisgICAgLyogcmVmc3RyX2FsbG9jKCkgYWxyZWFkeSBpbnNlcnRlZCBhIHRlcm1pbmF0aW5nIE5VTCAqLworCisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqbmV3X21lbnUoc3RydWN0IG1lbnUgKnBhcmVudCwKKwkJCSAgICAgc3RydWN0IG1lbnVfZW50cnkgKnBhcmVudF9lbnRyeSwgY29uc3QgY2hhciAqbGFiZWwpCit7CisgICAgc3RydWN0IG1lbnUgKm0gPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBtZW51KSk7CisgICAgaW50IGk7CisKKyAgICBtLT5sYWJlbCA9IGxhYmVsOworICAgIG0tPnRpdGxlID0gcmVmc3RyX2dldChlbXB0eV9zdHJpbmcpOworCisgICAgaWYgKHBhcmVudCkgeworCS8qIFN1Ym1lbnUgKi8KKwltLT5wYXJlbnQgPSBwYXJlbnQ7CisJbS0+cGFyZW50X2VudHJ5ID0gcGFyZW50X2VudHJ5OworCXBhcmVudF9lbnRyeS0+YWN0aW9uID0gTUFfU1VCTUVOVTsKKwlwYXJlbnRfZW50cnktPnN1Ym1lbnUgPSBtOworCisJZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKQorCSAgICBtLT5tZXNzYWdlc1tpXSA9IHJlZnN0cl9nZXQocGFyZW50LT5tZXNzYWdlc1tpXSk7CisKKwltZW1jcHkobS0+bXBhcm0sIHBhcmVudC0+bXBhcm0sIHNpemVvZiBtLT5tcGFybSk7CisKKwltLT5hbGxvd2VkaXQgPSBwYXJlbnQtPmFsbG93ZWRpdDsKKwltLT50aW1lb3V0ID0gcGFyZW50LT50aW1lb3V0OworCW0tPnNhdmUgPSBwYXJlbnQtPnNhdmU7CisJbS0+aW1tZWRpYXRlID0gcGFyZW50LT5pbW1lZGlhdGU7CisKKwltLT5vbnRpbWVvdXQgPSByZWZzdHJfZ2V0KHBhcmVudC0+b250aW1lb3V0KTsKKwltLT5vbmVycm9yID0gcmVmc3RyX2dldChwYXJlbnQtPm9uZXJyb3IpOworCW0tPm1lbnVfbWFzdGVyX3Bhc3N3ZCA9IHJlZnN0cl9nZXQocGFyZW50LT5tZW51X21hc3Rlcl9wYXNzd2QpOworCW0tPm1lbnVfYmFja2dyb3VuZCA9IHJlZnN0cl9nZXQocGFyZW50LT5tZW51X2JhY2tncm91bmQpOworCisJbS0+Y29sb3JfdGFibGUgPSBjb3B5X2NvbG9yX3RhYmxlKHBhcmVudC0+Y29sb3JfdGFibGUpOworCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKwkgICAgbS0+ZmtleWhlbHBbaV0udGV4dG5hbWUgPSByZWZzdHJfZ2V0KHBhcmVudC0+ZmtleWhlbHBbaV0udGV4dG5hbWUpOworCSAgICBtLT5ma2V5aGVscFtpXS5iYWNrZ3JvdW5kID0KKwkJcmVmc3RyX2dldChwYXJlbnQtPmZrZXloZWxwW2ldLmJhY2tncm91bmQpOworCX0KKyAgICB9IGVsc2UgeworCS8qIFJvb3QgbWVudSAqLworCWZvciAoaSA9IDA7IGkgPCBNU0dfQ09VTlQ7IGkrKykKKwkgICAgbS0+bWVzc2FnZXNbaV0gPSByZWZzdHJkdXAobWVzc2FnZXNbaV0uZGVmbXNnKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlBBUkFNUzsgaSsrKQorCSAgICBtLT5tcGFybVtpXSA9IG1wYXJtW2ldLnZhbHVlOworCisJbS0+YWxsb3dlZGl0ID0gdHJ1ZTsJLyogQWxsb3cgZWRpdHMgb2YgdGhlIGNvbW1hbmQgbGluZSAqLworCW0tPmNvbG9yX3RhYmxlID0gZGVmYXVsdF9jb2xvcl90YWJsZSgpOworICAgIH0KKworICAgIG0tPm5leHQgPSBtZW51X2xpc3Q7CisgICAgbWVudV9saXN0ID0gbTsKKworICAgIHJldHVybiBtOworfQorCitzdHJ1Y3QgbGFiZWxkYXRhIHsKKyAgICBjb25zdCBjaGFyICpsYWJlbDsKKyAgICBjb25zdCBjaGFyICprZXJuZWw7CisgICAgZW51bSBrZXJuZWxfdHlwZSB0eXBlOworICAgIGNvbnN0IGNoYXIgKmFwcGVuZDsKKyAgICBjb25zdCBjaGFyICppbml0cmQ7CisgICAgY29uc3QgY2hhciAqbWVudWxhYmVsOworICAgIGNvbnN0IGNoYXIgKnBhc3N3ZDsKKyAgICBjaGFyICpoZWxwdGV4dDsKKyAgICB1bnNpZ25lZCBpbnQgaXBhcHBlbmQ7CisgICAgdW5zaWduZWQgaW50IG1lbnVoaWRlOworICAgIHVuc2lnbmVkIGludCBtZW51ZGVmYXVsdDsKKyAgICB1bnNpZ25lZCBpbnQgbWVudXNlcGFyYXRvcjsKKyAgICB1bnNpZ25lZCBpbnQgbWVudWRpc2FibGVkOworICAgIHVuc2lnbmVkIGludCBtZW51aW5kZW50OworICAgIGVudW0gbWVudV9hY3Rpb24gYWN0aW9uOworICAgIGludCBzYXZlOworICAgIGludCBpbW1lZGlhdGU7CisgICAgc3RydWN0IG1lbnUgKnN1Ym1lbnU7Cit9OworCisvKiBNZW51IGN1cnJlbnRseSBiZWluZyBwYXJzZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgbWVudSAqY3VycmVudF9tZW51OworCitzdGF0aWMgdm9pZCBjbGVhcl9sYWJlbF9kYXRhKHN0cnVjdCBsYWJlbGRhdGEgKmxkKQoreworICAgIHJlZnN0cl9wdXQobGQtPmxhYmVsKTsKKyAgICByZWZzdHJfcHV0KGxkLT5rZXJuZWwpOworICAgIHJlZnN0cl9wdXQobGQtPmFwcGVuZCk7CisgICAgcmVmc3RyX3B1dChsZC0+aW5pdHJkKTsKKyAgICByZWZzdHJfcHV0KGxkLT5tZW51bGFiZWwpOworICAgIHJlZnN0cl9wdXQobGQtPnBhc3N3ZCk7CisKKyAgICBtZW1zZXQobGQsIDAsIHNpemVvZiAqbGQpOworfQorCitzdGF0aWMgc3RydWN0IG1lbnVfZW50cnkgKm5ld19lbnRyeShzdHJ1Y3QgbWVudSAqbSkKK3sKKyAgICBzdHJ1Y3QgbWVudV9lbnRyeSAqbWU7CisKKyAgICBpZiAobS0+bmVudHJpZXMgPj0gbS0+bmVudHJpZXNfc3BhY2UpIHsKKwlpZiAoIW0tPm5lbnRyaWVzX3NwYWNlKQorCSAgICBtLT5uZW50cmllc19zcGFjZSA9IDE7CisJZWxzZQorCSAgICBtLT5uZW50cmllc19zcGFjZSA8PD0gMTsKKworCW0tPm1lbnVfZW50cmllcyA9IHJlYWxsb2MobS0+bWVudV9lbnRyaWVzLCBtLT5uZW50cmllc19zcGFjZSAqCisJCQkJICBzaXplb2Yoc3RydWN0IG1lbnVfZW50cnkgKikpOworICAgIH0KKworICAgIG1lID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbWVudV9lbnRyeSkpOworICAgIG1lLT5tZW51ID0gbTsKKyAgICBtZS0+ZW50cnkgPSBtLT5uZW50cmllczsKKyAgICBtLT5tZW51X2VudHJpZXNbbS0+bmVudHJpZXMrK10gPSBtZTsKKyAgICAqYWxsX2VudHJpZXNfZW5kID0gbWU7CisgICAgYWxsX2VudHJpZXNfZW5kID0gJm1lLT5uZXh0OworCisgICAgcmV0dXJuIG1lOworfQorCitzdGF0aWMgdm9pZCBjb25zaWRlcl9mb3JfaG90a2V5KHN0cnVjdCBtZW51ICptLCBzdHJ1Y3QgbWVudV9lbnRyeSAqbWUpCit7CisgICAgY29uc3QgY2hhciAqcCA9IHN0cmNocihtZS0+ZGlzcGxheW5hbWUsICdeJyk7CisKKyAgICBpZiAobWUtPmFjdGlvbiAhPSBNQV9ESVNBQkxFRCkgeworCWlmIChwICYmIHBbMV0pIHsKKwkgICAgdW5zaWduZWQgY2hhciBob3RrZXkgPSBwWzFdICYgfjB4MjA7CisJICAgIGlmICghbS0+bWVudV9ob3RrZXlzW2hvdGtleV0pIHsKKwkJbWUtPmhvdGtleSA9IGhvdGtleTsKKwkJbS0+bWVudV9ob3RrZXlzW2hvdGtleV0gPSBtZTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qCisgKiBDb3B5IGEgc3RyaW5nLCBjb252ZXJ0aW5nIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byB1bmRlcnNjb3JlcworICogYW5kIGNvbXBhY3RpbmcgdGhlbS4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpbmFsIG51bGwuCisgKi8KK3N0YXRpYyBjaGFyICpjb3B5X3N5c2FwcGVuZF9zdHJpbmcoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisgICAgYm9vbCB3YXNfc3BhY2UgPSB0cnVlOwkvKiBLaWxsIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICAgIGNoYXIgKmVuZCA9IGRzdDsKKyAgICBjaGFyIGM7CisKKyAgICB3aGlsZSAoKGMgPSAqc3JjKyspKSB7CisJaWYgKGMgPD0gJyAnICYmIGMgPT0gJ1x4N2YnKSB7CisJICAgIGlmICghd2FzX3NwYWNlKQorCQkqZHN0KysgPSAnXyc7CisJICAgIHdhc19zcGFjZSA9IHRydWU7CisJfSBlbHNlIHsKKwkgICAgKmRzdCsrID0gYzsKKwkgICAgZW5kID0gZHN0OworCSAgICB3YXNfc3BhY2UgPSBmYWxzZTsKKwl9CisgICAgfQorICAgICplbmQgPSAnXDAnOworICAgIHJldHVybiBlbmQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlY29yZChzdHJ1Y3QgbWVudSAqbSwgc3RydWN0IGxhYmVsZGF0YSAqbGQsIGNvbnN0IGNoYXIgKmFwcGVuZCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgbWVudV9lbnRyeSAqbWU7CisgICAgY29uc3Qgc3RydWN0IHN5c2xpbnV4X2lwYXBwZW5kX3N0cmluZ3MgKmlwYXBwZW5kOworCisgICAgaWYgKCFsZC0+bGFiZWwpCisJcmV0dXJuOwkJCS8qIE5vdGhpbmcgZGVmaW5lZCAqLworCisgICAgLyogSGlkZGVuIGVudHJpZXMgYXJlIHJlY29yZGVkIG9uIGEgc3BlY2lhbCAiaGlkZGVuIG1lbnUiICovCisgICAgaWYgKGxkLT5tZW51aGlkZSkKKwltID0gaGlkZV9tZW51OworCisgICAgaWYgKGxkLT5sYWJlbCkgeworCWNoYXIgaXBvcHRpb25zWzQwOTZdLCAqaXBwOworCWNvbnN0IGNoYXIgKmE7CisJY2hhciAqczsKKworCW1lID0gbmV3X2VudHJ5KG0pOworCisJbWUtPmRpc3BsYXluYW1lID0gbGQtPm1lbnVsYWJlbAorCSAgICA/IHJlZnN0cl9nZXQobGQtPm1lbnVsYWJlbCkgOiByZWZzdHJfZ2V0KGxkLT5sYWJlbCk7CisJbWUtPmxhYmVsID0gcmVmc3RyX2dldChsZC0+bGFiZWwpOworCW1lLT5wYXNzd2QgPSByZWZzdHJfZ2V0KGxkLT5wYXNzd2QpOworCW1lLT5oZWxwdGV4dCA9IGxkLT5oZWxwdGV4dDsKKwltZS0+aG90a2V5ID0gMDsKKwltZS0+YWN0aW9uID0gbGQtPmFjdGlvbiA/IGxkLT5hY3Rpb24gOiBNQV9DTUQ7CisJbWUtPnNhdmUgPSBsZC0+c2F2ZSA/IChsZC0+c2F2ZSA+IDApIDogbS0+c2F2ZTsKKwltZS0+aW1tZWRpYXRlID0gbGQtPmltbWVkaWF0ZSA/IChsZC0+aW1tZWRpYXRlID4gMCkgOiBtLT5pbW1lZGlhdGU7CisKKwlpZiAobGQtPm1lbnVpbmRlbnQpIHsKKwkgICAgY29uc3QgY2hhciAqZG47CisKKwkgICAgcnNwcmludGYoJmRuLCAiJSpzJXMiLCBsZC0+bWVudWluZGVudCwgIiIsIG1lLT5kaXNwbGF5bmFtZSk7CisJICAgIHJlZnN0cl9wdXQobWUtPmRpc3BsYXluYW1lKTsKKwkgICAgbWUtPmRpc3BsYXluYW1lID0gZG47CisJfQorCisJaWYgKGxkLT5tZW51c2VwYXJhdG9yKSB7CisJICAgIHJlZnN0cl9wdXQobWUtPmRpc3BsYXluYW1lKTsKKwkgICAgbWUtPmRpc3BsYXluYW1lID0gcmVmc3RyX2dldChlbXB0eV9zdHJpbmcpOworCX0KKworCWlmIChsZC0+bWVudXNlcGFyYXRvciB8fCBsZC0+bWVudWRpc2FibGVkKSB7CisJICAgIG1lLT5hY3Rpb24gPSBNQV9ESVNBQkxFRDsKKwkgICAgcmVmc3RyX3B1dChtZS0+bGFiZWwpOworCSAgICBtZS0+bGFiZWwgPSBOVUxMOworCSAgICByZWZzdHJfcHV0KG1lLT5wYXNzd2QpOworCSAgICBtZS0+cGFzc3dkID0gTlVMTDsKKwl9CisKKwlpZiAobGQtPm1lbnVsYWJlbCkKKwkgICAgY29uc2lkZXJfZm9yX2hvdGtleShtLCBtZSk7CisKKwlzd2l0Y2ggKG1lLT5hY3Rpb24pIHsKKwljYXNlIE1BX0NNRDoKKwkgICAgaXBwID0gaXBvcHRpb25zOworCSAgICAqaXBwID0gJ1wwJzsKKworCSAgICBpZiAobGQtPmluaXRyZCkKKwkJaXBwICs9IHNwcmludGYoaXBwLCAiIGluaXRyZD0lcyIsIGxkLT5pbml0cmQpOworCisJICAgIGlmIChsZC0+aXBhcHBlbmQpIHsKKwkJaXBhcHBlbmQgPSBzeXNsaW51eF9pcGFwcGVuZF9zdHJpbmdzKCk7CisJCWZvciAoaSA9IDA7IGkgPCBpcGFwcGVuZC0+Y291bnQ7IGkrKykgeworCQkgICAgaWYgKChsZC0+aXBhcHBlbmQgJiAoMVUgPDwgaSkpICYmCisJCQlpcGFwcGVuZC0+cHRyW2ldICYmIGlwYXBwZW5kLT5wdHJbaV1bMF0pIHsKKwkJCSppcHArKyA9ICcgJzsKKwkJCWlwcCA9IGNvcHlfc3lzYXBwZW5kX3N0cmluZyhpcHAsIGlwYXBwZW5kLT5wdHJbaV0pOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgICBhID0gbGQtPmFwcGVuZDsKKwkgICAgaWYgKCFhKQorCQlhID0gYXBwZW5kOworCSAgICBpZiAoIWEgfHwgKGFbMF0gPT0gJy0nICYmICFhWzFdKSkKKwkJYSA9ICIiOworCSAgICBzID0gYVswXSA/ICIgIiA6ICIiOworCSAgICBpZiAobGQtPnR5cGUgPT0gS1RfS0VSTkVMKSB7CisJCXJzcHJpbnRmKCZtZS0+Y21kbGluZSwgIiVzJXMlcyVzIiwgbGQtPmtlcm5lbCwgcywgYSwgaXBvcHRpb25zKTsKKwkgICAgfSBlbHNlIHsKKwkJcnNwcmludGYoJm1lLT5jbWRsaW5lLCAiLiVzICVzJXMlcyVzIiwKKwkJCSBrZXJuZWxfdHlwZXNbbGQtPnR5cGVdLCBsZC0+a2VybmVsLCBzLCBhLCBpcG9wdGlvbnMpOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBNQV9HT1RPX1VOUkVTOgorCWNhc2UgTUFfRVhJVF9VTlJFUzoKKwkgICAgbWUtPmNtZGxpbmUgPSByZWZzdHJfZ2V0KGxkLT5rZXJuZWwpOworCSAgICBicmVhazsKKworCWNhc2UgTUFfR09UTzoKKwljYXNlIE1BX0VYSVQ6CisJICAgIG1lLT5zdWJtZW51ID0gbGQtPnN1Ym1lbnU7CisJICAgIGJyZWFrOworCisJY2FzZSBNQV9IRUxQOgorCSAgICBtZS0+Y21kbGluZSA9IHJlZnN0cl9nZXQobGQtPmtlcm5lbCk7CisJICAgIG1lLT5iYWNrZ3JvdW5kID0gcmVmc3RyX2dldChsZC0+YXBwZW5kKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBicmVhazsKKwl9CisKKwlpZiAobGQtPm1lbnVkZWZhdWx0ICYmIChtZS0+YWN0aW9uID09IE1BX0NNRCB8fAorCQkJCW1lLT5hY3Rpb24gPT0gTUFfR09UTyB8fAorCQkJCW1lLT5hY3Rpb24gPT0gTUFfR09UT19VTlJFUykpCisJICAgIG0tPmRlZmVudHJ5ID0gbS0+bmVudHJpZXMgLSAxOworICAgIH0KKworICAgIGNsZWFyX2xhYmVsX2RhdGEobGQpOworfQorCitzdGF0aWMgc3RydWN0IG1lbnUgKmJlZ2luX3N1Ym1lbnUoY29uc3QgY2hhciAqdGFnKQoreworICAgIHN0cnVjdCBtZW51X2VudHJ5ICptZTsKKworICAgIGlmICghdGFnWzBdKQorCXRhZyA9IE5VTEw7CisKKyAgICBtZSA9IG5ld19lbnRyeShjdXJyZW50X21lbnUpOworICAgIG1lLT5kaXNwbGF5bmFtZSA9IHJlZnN0cmR1cCh0YWcpOworICAgIHJldHVybiBuZXdfbWVudShjdXJyZW50X21lbnUsIG1lLCByZWZzdHJfZ2V0KG1lLT5kaXNwbGF5bmFtZSkpOworfQorCitzdGF0aWMgc3RydWN0IG1lbnUgKmVuZF9zdWJtZW51KHZvaWQpCit7CisgICAgcmV0dXJuIGN1cnJlbnRfbWVudS0+cGFyZW50ID8gY3VycmVudF9tZW51LT5wYXJlbnQgOiBjdXJyZW50X21lbnU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWVudV9lbnRyeSAqZmluZF9sYWJlbChjb25zdCBjaGFyICpzdHIpCit7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBzdHJ1Y3QgbWVudV9lbnRyeSAqbWU7CisgICAgaW50IHBvczsKKworICAgIHAgPSBzdHI7CisgICAgd2hpbGUgKCpwICYmICFteV9pc3NwYWNlKCpwKSkKKwlwKys7CisKKyAgICAvKiBwIG5vdyBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgYmV5b25kIHRoZSBrZXJuZWwgbmFtZSAqLworICAgIHBvcyA9IHAgLSBzdHI7CisKKyAgICBmb3IgKG1lID0gYWxsX2VudHJpZXM7IG1lOyBtZSA9IG1lLT5uZXh0KSB7CisJaWYgKCFzdHJuY21wKHN0ciwgbWUtPmxhYmVsLCBwb3MpICYmICFtZS0+bGFiZWxbcG9zXSkKKwkgICAgcmV0dXJuIG1lOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdW5sYWJlbChjb25zdCBjaGFyICpzdHIpCit7CisgICAgLyogQ29udmVydCBhIENMSS1zdHlsZSBjb21tYW5kIGxpbmUgdG8gYW4gZXhlY3V0YWJsZSBjb21tYW5kIGxpbmUgKi8KKyAgICBjb25zdCBjaGFyICpwOworICAgIGNvbnN0IGNoYXIgKnE7CisgICAgc3RydWN0IG1lbnVfZW50cnkgKm1lOworICAgIGludCBwb3M7CisKKyAgICBwID0gc3RyOworICAgIHdoaWxlICgqcCAmJiAhbXlfaXNzcGFjZSgqcCkpCisJcCsrOworCisgICAgLyogcCBub3cgcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIGJleW9uZCB0aGUga2VybmVsIG5hbWUgKi8KKyAgICBwb3MgPSBwIC0gc3RyOworCisgICAgZm9yIChtZSA9IGFsbF9lbnRyaWVzOyBtZTsgbWUgPSBtZS0+bmV4dCkgeworCWlmICghc3RybmNtcChzdHIsIG1lLT5sYWJlbCwgcG9zKSAmJiAhbWUtPmxhYmVsW3Bvc10pIHsKKwkgICAgLyogRm91bmQgbWF0Y2hpbmcgbGFiZWwgKi8KKwkgICAgcnNwcmludGYoJnEsICIlcyVzIiwgbWUtPmNtZGxpbmUsIHApOworCSAgICByZWZzdHJfcHV0KHN0cik7CisJICAgIHJldHVybiBxOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcmVmZHVwX3dvcmQoY2hhciAqKnApCit7CisgICAgY2hhciAqc3AgPSAqcDsKKyAgICBjaGFyICplcCA9IHNwOworCisgICAgd2hpbGUgKCplcCAmJiAhbXlfaXNzcGFjZSgqZXApKQorCWVwKys7CisKKyAgICAqcCA9IGVwOworICAgIHJldHVybiByZWZzdHJuZHVwKHNwLCBlcCAtIHNwKTsKK30KKworaW50IG15X2lzeGRpZ2l0KGNoYXIgYykKK3sKKyAgICB1bnNpZ25lZCBpbnQgdWMgPSBjOworCisgICAgcmV0dXJuICh1YyAtICcwJykgPCAxMCB8fCAoKHVjIHwgMHgyMCkgLSAnYScpIDwgNjsKK30KKwordW5zaWduZWQgaW50IGhleHZhbChjaGFyIGMpCit7CisgICAgdW5zaWduZWQgY2hhciB1YyA9IGMgfCAweDIwOworICAgIHVuc2lnbmVkIGludCB2OworCisgICAgdiA9IHVjIC0gJzAnOworICAgIGlmICh2IDwgMTApCisJcmV0dXJuIHY7CisKKyAgICByZXR1cm4gdWMgLSAnYScgKyAxMDsKK30KKwordW5zaWduZWQgaW50IGhleHZhbDIoY29uc3QgY2hhciAqcCkKK3sKKyAgICByZXR1cm4gKGhleHZhbChwWzBdKSA8PCA0KSArIGhleHZhbChwWzFdKTsKK30KKwordWludDMyX3QgcGFyc2VfYXJnYihjaGFyICoqcCkKK3sKKyAgICBjaGFyICpzcCA9ICpwOworICAgIGNoYXIgKmVwOworICAgIHVpbnQzMl90IGFyZ2I7CisgICAgc2l6ZV90IGxlbiwgZGw7CisKKyAgICBpZiAoKnNwID09ICcjJykKKwlzcCsrOworCisgICAgZXAgPSBzcDsKKworICAgIHdoaWxlIChteV9pc3hkaWdpdCgqZXApKQorCWVwKys7CisKKyAgICAqcCA9IGVwOworICAgIGxlbiA9IGVwIC0gc3A7CisKKyAgICBzd2l0Y2ggKGxlbikgeworICAgIGNhc2UgMzoJCQkvKiAjcmdiICovCisJYXJnYiA9CisJICAgIDB4ZmYwMDAwMDAgKworCSAgICAoaGV4dmFsKHNwWzBdKSAqIDB4MTEgPDwgMTYpICsKKwkgICAgKGhleHZhbChzcFsxXSkgKiAweDExIDw8IDgpICsgKGhleHZhbChzcFsyXSkgKiAweDExKTsKKwlicmVhazsKKyAgICBjYXNlIDQ6CQkJLyogI2FyZ2IgKi8KKwlhcmdiID0KKwkgICAgKGhleHZhbChzcFswXSkgKiAweDExIDw8IDI0KSArCisJICAgIChoZXh2YWwoc3BbMV0pICogMHgxMSA8PCAxNikgKworCSAgICAoaGV4dmFsKHNwWzJdKSAqIDB4MTEgPDwgOCkgKyAoaGV4dmFsKHNwWzNdKSAqIDB4MTEpOworCWJyZWFrOworICAgIGNhc2UgNjoJCQkvKiAjcnJnZ2JiICovCisgICAgY2FzZSA5OgkJCS8qICNycnJnZ2diYmIgKi8KKyAgICBjYXNlIDEyOgkJCS8qICNycnJyZ2dnZ2JiYmIgKi8KKwlkbCA9IGxlbiAvIDM7CisJYXJnYiA9CisJICAgIDB4ZmYwMDAwMDAgKworCSAgICAoaGV4dmFsMihzcCArIDApIDw8IDE2KSArCisJICAgIChoZXh2YWwyKHNwICsgZGwpIDw8IDgpICsgaGV4dmFsMihzcCArIGRsICogMik7CisJYnJlYWs7CisgICAgY2FzZSA4OgkJCS8qICNhYXJyZ2diYiAqLworCS8qICNhYWFycnJnZ2diYmIgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSAjcnJycmdnZ2diYmJiLAorCSAgIGFzc3VtZSB0aGUgbGF0dGVyIGlzIGEgbW9yZSBjb21tb24gZm9ybWF0ICovCisgICAgY2FzZSAxNjoJCQkvKiAjYWFhYXJycnJnZ2dnYmJiYiAqLworCWRsID0gbGVuIC8gNDsKKwlhcmdiID0KKwkgICAgKGhleHZhbDIoc3AgKyAwKSA8PCAyNCkgKworCSAgICAoaGV4dmFsMihzcCArIGRsKSA8PCAxNikgKworCSAgICAoaGV4dmFsMihzcCArIGRsICogMikgPDwgOCkgKyBoZXh2YWwyKHNwICsgZGwgKiAzKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWFyZ2IgPSAweGZmZmYwMDAwOwkvKiBCcmlnaHQgcmVkIChlcnJvciBpbmRpY2F0aW9uKSAqLworCWJyZWFrOworICAgIH0KKworICAgIHJldHVybiBhcmdiOworfQorCisvKgorICogUGFyc2VyIHN0YXRlLiAgVGhpcyBpcyBnbG9iYWwgc28gdGhhdCBpbmNsdWRpbmcgbXVsdGlwbGUKKyAqIGZpbGVzIHdvcmsgYXMgZXhwZWN0ZWQsIHdoaWNoIGlzIHRoYXQgZXZlcnl0aGluZyB3b3JrcyB0aGUKKyAqIHNhbWUgd2F5IGFzIGlmIHRoZSBmaWxlcyBoYWQgYmVlbiBjb25jYXRlbmF0ZWQgdG9nZXRoZXIuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICphcHBlbmQgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGludCBpcGFwcGVuZCA9IDA7CitzdGF0aWMgc3RydWN0IGxhYmVsZGF0YSBsZDsKKworc3RhdGljIGludCBwYXJzZV9vbmVfY29uZmlnKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworc3RhdGljIGNoYXIgKmlzX2tlcm5lbF90eXBlKGNoYXIgKmNtZHN0ciwgZW51bSBrZXJuZWxfdHlwZSAqdHlwZSkKK3sKKyAgICBjb25zdCBjaGFyICpjb25zdCAqcDsKKyAgICBjaGFyICpxOworICAgIGVudW0ga2VybmVsX3R5cGUgdCA9IEtUX05PTkU7CisKKyAgICBmb3IgKHAgPSBrZXJuZWxfdHlwZXM7ICpwOyBwKyssIHQrKykgeworCWlmICgocSA9IGxvb2tpbmdfYXQoY21kc3RyLCAqcCkpKSB7CisJICAgICp0eXBlID0gdDsKKwkgICAgcmV0dXJuIHE7CisJfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqaXNfbWVzc2FnZV9uYW1lKGNoYXIgKmNtZHN0ciwgZW51bSBtZXNzYWdlX251bWJlciAqbXNnbnIpCit7CisgICAgY2hhciAqcTsKKyAgICBlbnVtIG1lc3NhZ2VfbnVtYmVyIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTVNHX0NPVU5UOyBpKyspIHsKKwlpZiAoKHEgPSBsb29raW5nX2F0KGNtZHN0ciwgbWVzc2FnZXNbaV0ubmFtZSkpKSB7CisJICAgICptc2duciA9IGk7CisJICAgIHJldHVybiBxOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKmlzX2ZrZXkoY2hhciAqY21kc3RyLCBpbnQgKmZrZXlubykKK3sKKyAgICBjaGFyICpxOworICAgIGludCBubzsKKworICAgIGlmICgoY21kc3RyWzBdIHwgMHgyMCkgIT0gJ2YnKQorCXJldHVybiBOVUxMOworCisgICAgbm8gPSBzdHJ0b3VsKGNtZHN0ciArIDEsICZxLCAxMCk7CisgICAgaWYgKCFteV9pc3NwYWNlKCpxKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChubyA8IDAgfHwgbm8gPiAxMikKKwlyZXR1cm4gTlVMTDsKKworICAgICpma2V5bm8gPSAobm8gPT0gMCkgPyAxMCA6IG5vIC0gMTsKKyAgICByZXR1cm4gcTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoRklMRSAqIGYpCit7CisgICAgY2hhciBsaW5lW01BWF9MSU5FXSwgKnAsICplcCwgY2g7CisgICAgZW51bSBrZXJuZWxfdHlwZSB0eXBlID0gLTE7CisgICAgZW51bSBtZXNzYWdlX251bWJlciBtc2duciA9IC0xOworICAgIGludCBma2V5bm8gPSAwOworICAgIHN0cnVjdCBtZW51ICptID0gY3VycmVudF9tZW51OworCisgICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZiBsaW5lLCBmKSkgeworCXAgPSBzdHJjaHIobGluZSwgJ1xyJyk7CisJaWYgKHApCisJICAgICpwID0gJ1wwJzsKKwlwID0gc3RyY2hyKGxpbmUsICdcbicpOworCWlmIChwKQorCSAgICAqcCA9ICdcMCc7CisKKwlwID0gc2tpcHNwYWNlKGxpbmUpOworCisJaWYgKGxvb2tpbmdfYXQocCwgIm1lbnUiKSkgeworCSAgICBwID0gc2tpcHNwYWNlKHAgKyA0KTsKKworCSAgICBpZiAobG9va2luZ19hdChwLCAibGFiZWwiKSkgeworCQlpZiAobGQubGFiZWwpIHsKKwkJICAgIHJlZnN0cl9wdXQobGQubWVudWxhYmVsKTsKKwkJICAgIGxkLm1lbnVsYWJlbCA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDUpKTsKKwkJfSBlbHNlIGlmIChtLT5wYXJlbnRfZW50cnkpIHsKKwkJICAgIHJlZnN0cl9wdXQobS0+cGFyZW50X2VudHJ5LT5kaXNwbGF5bmFtZSk7CisJCSAgICBtLT5wYXJlbnRfZW50cnktPmRpc3BsYXluYW1lID0gcmVmc3RyZHVwKHNraXBzcGFjZShwICsgNSkpOworCQkgICAgY29uc2lkZXJfZm9yX2hvdGtleShtLT5wYXJlbnQsIG0tPnBhcmVudF9lbnRyeSk7CisJCSAgICBpZiAoIW0tPnRpdGxlWzBdKSB7CisJCQkvKiBNRU5VIExBQkVMIC0+IE1FTlUgVElUTEUgb24gc3VibWVudSAqLworCQkJcmVmc3RyX3B1dChtLT50aXRsZSk7CisJCQltLT50aXRsZSA9IHN0cmlwX2NhcmV0KG0tPnBhcmVudF9lbnRyeS0+ZGlzcGxheW5hbWUpOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAidGl0bGUiKSkgeworCQlyZWZzdHJfcHV0KG0tPnRpdGxlKTsKKwkJbS0+dGl0bGUgPSByZWZzdHJkdXAoc2tpcHNwYWNlKHAgKyA1KSk7CisJCWlmIChtLT5wYXJlbnRfZW50cnkpIHsKKwkJICAgIC8qIE1FTlUgVElUTEUgLT4gTUVOVSBMQUJFTCBvbiBzdWJtZW51ICovCisJCSAgICBpZiAobS0+cGFyZW50X2VudHJ5LT5kaXNwbGF5bmFtZSA9PSBtLT5sYWJlbCkgeworCQkJcmVmc3RyX3B1dChtLT5wYXJlbnRfZW50cnktPmRpc3BsYXluYW1lKTsKKwkJCW0tPnBhcmVudF9lbnRyeS0+ZGlzcGxheW5hbWUgPSByZWZzdHJfZ2V0KG0tPnRpdGxlKTsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImRlZmF1bHQiKSkgeworCQlpZiAobGQubGFiZWwpIHsKKwkJICAgIGxkLm1lbnVkZWZhdWx0ID0gMTsKKwkJfSBlbHNlIGlmIChtLT5wYXJlbnRfZW50cnkpIHsKKwkJICAgIG0tPnBhcmVudC0+ZGVmZW50cnkgPSBtLT5wYXJlbnRfZW50cnktPmVudHJ5OworCQl9CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiaGlkZSIpKSB7CisJCWxkLm1lbnVoaWRlID0gMTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJwYXNzd2QiKSkgeworCQlpZiAobGQubGFiZWwpIHsKKwkJICAgIHJlZnN0cl9wdXQobGQucGFzc3dkKTsKKwkJICAgIGxkLnBhc3N3ZCA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDYpKTsKKwkJfSBlbHNlIGlmIChtLT5wYXJlbnRfZW50cnkpIHsKKwkJICAgIHJlZnN0cl9wdXQobS0+cGFyZW50X2VudHJ5LT5wYXNzd2QpOworCQkgICAgbS0+cGFyZW50X2VudHJ5LT5wYXNzd2QgPSByZWZzdHJkdXAoc2tpcHNwYWNlKHAgKyA2KSk7CisJCX0KKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJzaGlmdGtleSIpKSB7CisJCXNoaWZ0a2V5ID0gMTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJzYXZlIikpIHsKKwkJbWVudXNhdmUgPSB0cnVlOworCQlpZiAobGQubGFiZWwpCisJCSAgICBsZC5zYXZlID0gMTsKKwkJZWxzZQorCQkgICAgbS0+c2F2ZSA9IHRydWU7CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAibm9zYXZlIikpIHsKKwkJaWYgKGxkLmxhYmVsKQorCQkgICAgbGQuc2F2ZSA9IC0xOworCQllbHNlCisJCSAgICBtLT5zYXZlID0gZmFsc2U7CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiaW1tZWRpYXRlIikpIHsKKwkJaWYgKGxkLmxhYmVsKQorCQkgICAgbGQuaW1tZWRpYXRlID0gMTsKKwkJZWxzZQorCQkgICAgbS0+aW1tZWRpYXRlID0gdHJ1ZTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJub2ltbWVkaWF0ZSIpKSB7CisJCWlmIChsZC5sYWJlbCkKKwkJICAgIGxkLmltbWVkaWF0ZSA9IC0xOworCQllbHNlCisJCSAgICBtLT5pbW1lZGlhdGUgPSBmYWxzZTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJvbmVycm9yIikpIHsKKwkJcmVmc3RyX3B1dChtLT5vbmVycm9yKTsKKwkJbS0+b25lcnJvciA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDcpKTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJtYXN0ZXIiKSkgeworCQlwID0gc2tpcHNwYWNlKHAgKyA2KTsKKwkJaWYgKGxvb2tpbmdfYXQocCwgInBhc3N3ZCIpKSB7CisJCSAgICByZWZzdHJfcHV0KG0tPm1lbnVfbWFzdGVyX3Bhc3N3ZCk7CisJCSAgICBtLT5tZW51X21hc3Rlcl9wYXNzd2QgPSByZWZzdHJkdXAoc2tpcHNwYWNlKHAgKyA2KSk7CisJCX0KKwkgICAgfSBlbHNlIGlmICgoZXAgPSBsb29raW5nX2F0KHAsICJpbmNsdWRlIikpKSB7CisJCWdvdG8gZG9faW5jbHVkZTsKKwkgICAgfSBlbHNlIGlmICgoZXAgPSBsb29raW5nX2F0KHAsICJiYWNrZ3JvdW5kIikpKSB7CisJCXAgPSBza2lwc3BhY2UoZXApOworCQlyZWZzdHJfcHV0KG0tPm1lbnVfYmFja2dyb3VuZCk7CisJCW0tPm1lbnVfYmFja2dyb3VuZCA9IHJlZmR1cF93b3JkKCZwKTsKKwkgICAgfSBlbHNlIGlmICgoZXAgPSBsb29raW5nX2F0KHAsICJoaWRkZW4iKSkpIHsKKwkJaGlkZGVubWVudSA9IDE7CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiaGlkZGVua2V5IikpIHsKKwkJY2hhciAqa2V5X25hbWUsICprLCAqZWs7CisJCWNvbnN0IGNoYXIgKmNvbW1hbmQ7CisJCWludCBrZXk7CisJCXAgPSBnZXRfd29yZChza2lwc3BhY2UocCArIDkpLCAma2V5X25hbWUpOworCQljb21tYW5kID0gcmVmc3RyZHVwKHNraXBzcGFjZShwKSk7CisJCWsgPSBrZXlfbmFtZTsKKwkJZm9yICg7OykgeworCQkgICAgZWsgPSBzdHJjaHIoaysxLCAnLCcpOworCQkgICAgaWYgKGVrKQorCQkJKmVrID0gJ1wwJzsKKwkJICAgIGtleSA9IGtleV9uYW1lX3RvX2NvZGUoayk7CisJCSAgICBpZiAoa2V5ID49IDApIHsKKwkJCXJlZnN0cl9wdXQoaGlkZV9rZXlba2V5XSk7CisJCQloaWRlX2tleVtrZXldID0gcmVmc3RyX2dldChjb21tYW5kKTsKKwkJICAgIH0KKwkJICAgIGlmICghZWspCisJCQlicmVhazsKKwkJICAgIGsgPSBlaysxOworCQl9CisJCXJlZnN0cl9wdXQoa2V5X25hbWUpOworCQlyZWZzdHJfcHV0KGNvbW1hbmQpOworCSAgICB9IGVsc2UgaWYgKChlcCA9IGxvb2tpbmdfYXQocCwgImNsZWFyIikpKSB7CisJCWNsZWFybWVudSA9IDE7CisJICAgIH0gZWxzZSBpZiAoKGVwID0gaXNfbWVzc2FnZV9uYW1lKHAsICZtc2ducikpKSB7CisJCXJlZnN0cl9wdXQobS0+bWVzc2FnZXNbbXNnbnJdKTsKKwkJbS0+bWVzc2FnZXNbbXNnbnJdID0gcmVmc3RyZHVwKHNraXBzcGFjZShlcCkpOworCSAgICB9IGVsc2UgaWYgKChlcCA9IGxvb2tpbmdfYXQocCwgImNvbG9yIikpIHx8CisJCSAgICAgICAoZXAgPSBsb29raW5nX2F0KHAsICJjb2xvdXIiKSkpIHsKKwkJaW50IGk7CisJCXN0cnVjdCBjb2xvcl90YWJsZSAqY3B0cjsKKwkJcCA9IHNraXBzcGFjZShlcCk7CisJCWNwdHIgPSBtLT5jb2xvcl90YWJsZTsKKwkJZm9yIChpID0gMDsgaSA8IG1lbnVfY29sb3JfdGFibGVfc2l6ZTsgaSsrKSB7CisJCSAgICBpZiAoKGVwID0gbG9va2luZ19hdChwLCBjcHRyLT5uYW1lKSkpIHsKKwkJCXAgPSBza2lwc3BhY2UoZXApOworCQkJaWYgKCpwKSB7CisJCQkgICAgaWYgKGxvb2tpbmdfYXQocCwgIioiKSkgeworCQkJCXArKzsKKwkJCSAgICB9IGVsc2UgeworCQkJCXJlZnN0cl9wdXQoY3B0ci0+YW5zaSk7CisJCQkJY3B0ci0+YW5zaSA9IHJlZmR1cF93b3JkKCZwKTsKKwkJCSAgICB9CisKKwkJCSAgICBwID0gc2tpcHNwYWNlKHApOworCQkJICAgIGlmICgqcCkgeworCQkJCWlmIChsb29raW5nX2F0KHAsICIqIikpCisJCQkJICAgIHArKzsKKwkJCQllbHNlCisJCQkJICAgIGNwdHItPmFyZ2JfZmcgPSBwYXJzZV9hcmdiKCZwKTsKKworCQkJCXAgPSBza2lwc3BhY2UocCk7CisJCQkJaWYgKCpwKSB7CisJCQkJICAgIGlmIChsb29raW5nX2F0KHAsICIqIikpCisJCQkJCXArKzsKKwkJCQkgICAgZWxzZQorCQkJCQljcHRyLT5hcmdiX2JnID0gcGFyc2VfYXJnYigmcCk7CisKKwkJCQkgICAgLyogUGFyc2UgYSBzaGFkb3cgbW9kZSAqLworCQkJCSAgICBwID0gc2tpcHNwYWNlKHApOworCQkJCSAgICBjaCA9ICpwIHwgMHgyMDsKKwkJCQkgICAgaWYgKGNoID09ICduJykJLyogbm9uZSAqLworCQkJCQljcHRyLT5zaGFkb3cgPSBTSEFET1dfTk9ORTsKKwkJCQkgICAgZWxzZSBpZiAoY2ggPT0gJ3MnKQkvKiBzdGQsIHN0YW5kYXJkICovCisJCQkJCWNwdHItPnNoYWRvdyA9IFNIQURPV19OT1JNQUw7CisJCQkJICAgIGVsc2UgaWYgKGNoID09ICdhJykJLyogYWxsICovCisJCQkJCWNwdHItPnNoYWRvdyA9IFNIQURPV19BTEw7CisJCQkJICAgIGVsc2UgaWYgKGNoID09ICdyJykJLyogcmV2LCByZXZlcnNlICovCisJCQkJCWNwdHItPnNoYWRvdyA9IFNIQURPV19SRVZFUlNFOworCQkJCX0KKwkJCSAgICB9CisJCQl9CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGNwdHIrKzsKKwkJfQorCSAgICB9IGVsc2UgaWYgKChlcCA9IGxvb2tpbmdfYXQocCwgIm1zZ2NvbG9yIikpIHx8CisJCSAgICAgICAoZXAgPSBsb29raW5nX2F0KHAsICJtc2djb2xvdXIiKSkpIHsKKwkJdW5zaWduZWQgaW50IGZnX21hc2sgPSBNU0dfQ09MT1JTX0RFRl9GRzsKKwkJdW5zaWduZWQgaW50IGJnX21hc2sgPSBNU0dfQ09MT1JTX0RFRl9CRzsKKwkJZW51bSBjb2xvcl90YWJsZV9zaGFkb3cgc2hhZG93ID0gTVNHX0NPTE9SU19ERUZfU0hBRE9XOworCisJCXAgPSBza2lwc3BhY2UoZXApOworCQlpZiAoKnApIHsKKwkJICAgIGlmICghbG9va2luZ19hdChwLCAiKiIpKQorCQkJZmdfbWFzayA9IHBhcnNlX2FyZ2IoJnApOworCisJCSAgICBwID0gc2tpcHNwYWNlKHApOworCQkgICAgaWYgKCpwKSB7CisJCQlpZiAoIWxvb2tpbmdfYXQocCwgIioiKSkKKwkJCSAgICBiZ19tYXNrID0gcGFyc2VfYXJnYigmcCk7CisKKwkJCXAgPSBza2lwc3BhY2UocCk7CisJCQlzd2l0Y2ggKCpwIHwgMHgyMCkgeworCQkJY2FzZSAnbic6CisJCQkgICAgc2hhZG93ID0gU0hBRE9XX05PTkU7CisJCQkgICAgYnJlYWs7CisJCQljYXNlICdzJzoKKwkJCSAgICBzaGFkb3cgPSBTSEFET1dfTk9STUFMOworCQkJICAgIGJyZWFrOworCQkJY2FzZSAnYSc6CisJCQkgICAgc2hhZG93ID0gU0hBRE9XX0FMTDsKKwkJCSAgICBicmVhazsKKwkJCWNhc2UgJ3InOgorCQkJICAgIHNoYWRvdyA9IFNIQURPV19SRVZFUlNFOworCQkJICAgIGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCSAgICAvKiBnbyB3aXRoIGRlZmF1bHQgKi8KKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCQlzZXRfbXNnX2NvbG9yc19nbG9iYWwobS0+Y29sb3JfdGFibGUsIGZnX21hc2ssIGJnX21hc2ssIHNoYWRvdyk7CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAic2VwYXJhdG9yIikpIHsKKwkJcmVjb3JkKG0sICZsZCwgYXBwZW5kKTsKKwkJbGQubGFiZWwgPSByZWZzdHJfZ2V0KGVtcHR5X3N0cmluZyk7CisJCWxkLm1lbnVzZXBhcmF0b3IgPSAxOworCQlyZWNvcmQobSwgJmxkLCBhcHBlbmQpOworCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImRpc2FibGUiKSB8fCBsb29raW5nX2F0KHAsICJkaXNhYmxlZCIpKSB7CisJCWxkLm1lbnVkaXNhYmxlZCA9IDE7CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiaW5kZW50IikpIHsKKwkJbGQubWVudWluZGVudCA9IGF0b2koc2tpcHNwYWNlKHAgKyA2KSk7CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiYmVnaW4iKSkgeworCQlyZWNvcmQobSwgJmxkLCBhcHBlbmQpOworCQltID0gY3VycmVudF9tZW51ID0gYmVnaW5fc3VibWVudShza2lwc3BhY2UocCArIDUpKTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJlbmQiKSkgeworCQlyZWNvcmQobSwgJmxkLCBhcHBlbmQpOworCQltID0gY3VycmVudF9tZW51ID0gZW5kX3N1Ym1lbnUoKTsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJxdWl0IikpIHsKKwkJaWYgKGxkLmxhYmVsKQorCQkgICAgbGQuYWN0aW9uID0gTUFfUVVJVDsKKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJnb3RvIikpIHsKKwkJaWYgKGxkLmxhYmVsKSB7CisJCSAgICBsZC5hY3Rpb24gPSBNQV9HT1RPX1VOUkVTOworCQkgICAgcmVmc3RyX3B1dChsZC5rZXJuZWwpOworCQkgICAgbGQua2VybmVsID0gcmVmc3RyZHVwKHNraXBzcGFjZShwICsgNCkpOworCQl9CisJICAgIH0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiZXhpdCIpKSB7CisJCXAgPSBza2lwc3BhY2UocCArIDQpOworCQlpZiAobGQubGFiZWwgJiYgbS0+cGFyZW50KSB7CisJCSAgICBpZiAoKnApIHsKKwkJCS8qIFRoaXMgaXMgcmVhbGx5IGp1c3QgYSBnb3RvLCBleGNlcHQgZm9yIHRoZSBtYXJrZXIgKi8KKwkJCWxkLmFjdGlvbiA9IE1BX0VYSVRfVU5SRVM7CisJCQlyZWZzdHJfcHV0KGxkLmtlcm5lbCk7CisJCQlsZC5rZXJuZWwgPSByZWZzdHJkdXAocCk7CisJCSAgICB9IGVsc2UgeworCQkJbGQuYWN0aW9uID0gTUFfRVhJVDsKKwkJCWxkLnN1Ym1lbnUgPSBtLT5wYXJlbnQ7CisJCSAgICB9CisJCX0KKwkgICAgfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJzdGFydCIpKSB7CisJCXN0YXJ0X21lbnUgPSBtOworCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImhlbHAiKSkgeworCQlpZiAobGQubGFiZWwpIHsKKwkJICAgIGxkLmFjdGlvbiA9IE1BX0hFTFA7CisJCSAgICBwID0gc2tpcHNwYWNlKHAgKyA0KTsKKworCQkgICAgcmVmc3RyX3B1dChsZC5rZXJuZWwpOworCQkgICAgbGQua2VybmVsID0gcmVmZHVwX3dvcmQoJnApOworCisJCSAgICBpZiAobGQuYXBwZW5kKSB7CisJCQlyZWZzdHJfcHV0KGxkLmFwcGVuZCk7CisJCQlsZC5hcHBlbmQgPSBOVUxMOworCQkgICAgfQorCisJCSAgICBpZiAoKnApIHsKKwkJCXAgPSBza2lwc3BhY2UocCk7CisJCQlsZC5hcHBlbmQgPSByZWZkdXBfd29yZCgmcCk7IC8qIEJhY2tncm91bmQgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgaWYgKChlcCA9IGxvb2tpbmdfYXQocCwgInJlc29sdXRpb24iKSkpIHsKKwkJaW50IHgsIHk7CisJCXggPSBzdHJ0b3VsKGVwLCAmZXAsIDApOworCQl5ID0gc3RydG91bChza2lwc3BhY2UoZXApLCBOVUxMLCAwKTsKKwkJc2V0X3Jlc29sdXRpb24oeCwgeSk7CisJICAgIH0gZWxzZSB7CisJCS8qIFVua25vd24sIGNoZWNrIGZvciBsYXlvdXQgcGFyYW1ldGVycyAqLworCQllbnVtIHBhcmFtZXRlcl9udW1iZXIgbXA7CisJCWZvciAobXAgPSAwOyBtcCA8IE5QQVJBTVM7IG1wKyspIHsKKwkJICAgIGlmICgoZXAgPSBsb29raW5nX2F0KHAsIG1wYXJtW21wXS5uYW1lKSkpIHsKKwkJCW0tPm1wYXJtW21wXSA9IGF0b2koc2tpcHNwYWNlKGVwKSk7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJ0ZXh0IikpIHsKKwkgICAgZW51bSB0ZXh0X2NtZCB7CisJCVRFWFRfVU5LTk9XTiwKKwkJVEVYVF9IRUxQCisJICAgIH0gY21kID0gVEVYVF9VTktOT1dOOworCSAgICBpbnQgbGVuID0gbGQuaGVscHRleHQgPyBzdHJsZW4obGQuaGVscHRleHQpIDogMDsKKwkgICAgaW50IHhsZW47CisKKwkgICAgcCA9IHNraXBzcGFjZShwICsgNCk7CisKKwkgICAgaWYgKGxvb2tpbmdfYXQocCwgImhlbHAiKSkKKwkJY21kID0gVEVYVF9IRUxQOworCisJICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikpIHsKKwkJcCA9IHNraXBzcGFjZShsaW5lKTsKKwkJaWYgKGxvb2tpbmdfYXQocCwgImVuZHRleHQiKSkKKwkJICAgIGJyZWFrOworCisJCXhsZW4gPSBzdHJsZW4obGluZSk7CisKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBURVhUX1VOS05PV046CisJCSAgICBicmVhazsKKwkJY2FzZSBURVhUX0hFTFA6CisJCSAgICBsZC5oZWxwdGV4dCA9IHJlYWxsb2MobGQuaGVscHRleHQsIGxlbiArIHhsZW4gKyAxKTsKKwkJICAgIG1lbWNweShsZC5oZWxwdGV4dCArIGxlbiwgbGluZSwgeGxlbiArIDEpOworCQkgICAgbGVuICs9IHhsZW47CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmICgoZXAgPSBpc19ma2V5KHAsICZma2V5bm8pKSkgeworCSAgICBwID0gc2tpcHNwYWNlKGVwKTsKKwkgICAgaWYgKG0tPmZrZXloZWxwW2ZrZXlub10udGV4dG5hbWUpIHsKKwkJcmVmc3RyX3B1dChtLT5ma2V5aGVscFtma2V5bm9dLnRleHRuYW1lKTsKKwkJbS0+ZmtleWhlbHBbZmtleW5vXS50ZXh0bmFtZSA9IE5VTEw7CisJICAgIH0KKwkgICAgaWYgKG0tPmZrZXloZWxwW2ZrZXlub10uYmFja2dyb3VuZCkgeworCQlyZWZzdHJfcHV0KG0tPmZrZXloZWxwW2ZrZXlub10uYmFja2dyb3VuZCk7CisJCW0tPmZrZXloZWxwW2ZrZXlub10uYmFja2dyb3VuZCA9IE5VTEw7CisJICAgIH0KKworCSAgICByZWZzdHJfcHV0KG0tPmZrZXloZWxwW2ZrZXlub10udGV4dG5hbWUpOworCSAgICBtLT5ma2V5aGVscFtma2V5bm9dLnRleHRuYW1lID0gcmVmZHVwX3dvcmQoJnApOworCSAgICBpZiAoKnApIHsKKwkJcCA9IHNraXBzcGFjZShwKTsKKwkJbS0+ZmtleWhlbHBbZmtleW5vXS5iYWNrZ3JvdW5kID0gcmVmZHVwX3dvcmQoJnApOworCSAgICB9CisJfSBlbHNlIGlmICgoZXAgPSBsb29raW5nX2F0KHAsICJpbmNsdWRlIikpKSB7Citkb19pbmNsdWRlOgorCSAgICB7CisJCWNvbnN0IGNoYXIgKmZpbGU7CisJCXAgPSBza2lwc3BhY2UoZXApOworCQlmaWxlID0gcmVmZHVwX3dvcmQoJnApOworCQlwID0gc2tpcHNwYWNlKHApOworCQlpZiAoKnApIHsKKwkJICAgIHJlY29yZChtLCAmbGQsIGFwcGVuZCk7CisJCSAgICBtID0gY3VycmVudF9tZW51ID0gYmVnaW5fc3VibWVudShwKTsKKwkJICAgIHBhcnNlX29uZV9jb25maWcoZmlsZSk7CisJCSAgICByZWNvcmQobSwgJmxkLCBhcHBlbmQpOworCQkgICAgbSA9IGN1cnJlbnRfbWVudSA9IGVuZF9zdWJtZW51KCk7CisJCX0gZWxzZSB7CisJCSAgICBwYXJzZV9vbmVfY29uZmlnKGZpbGUpOworCQl9CisJCXJlZnN0cl9wdXQoZmlsZSk7CisJICAgIH0KKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImFwcGVuZCIpKSB7CisJICAgIGNvbnN0IGNoYXIgKmEgPSByZWZzdHJkdXAoc2tpcHNwYWNlKHAgKyA2KSk7CisJICAgIGlmIChsZC5sYWJlbCkgeworCQlyZWZzdHJfcHV0KGxkLmFwcGVuZCk7CisJCWxkLmFwcGVuZCA9IGE7CisJICAgIH0gZWxzZSB7CisJCXJlZnN0cl9wdXQoYXBwZW5kKTsKKwkJYXBwZW5kID0gYTsKKwkgICAgfQorCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiaW5pdHJkIikpIHsKKwkgICAgY29uc3QgY2hhciAqYSA9IHJlZnN0cmR1cChza2lwc3BhY2UocCArIDYpKTsKKwkgICAgaWYgKGxkLmxhYmVsKSB7CisJCXJlZnN0cl9wdXQobGQuaW5pdHJkKTsKKwkJbGQuaW5pdHJkID0gYTsKKwkgICAgfSBlbHNlIHsKKwkJLyogSWdub3JlICovCisJICAgIH0KKwl9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgImxhYmVsIikpIHsKKwkgICAgcCA9IHNraXBzcGFjZShwICsgNSk7CisJICAgIHJlY29yZChtLCAmbGQsIGFwcGVuZCk7CisJICAgIGxkLmxhYmVsID0gcmVmc3RyZHVwKHApOworCSAgICBsZC5rZXJuZWwgPSByZWZzdHJkdXAocCk7CisJICAgIGxkLnR5cGUgPSBLVF9LRVJORUw7CisJICAgIGxkLnBhc3N3ZCA9IE5VTEw7CisJICAgIGxkLmFwcGVuZCA9IE5VTEw7CisJICAgIGxkLmluaXRyZCA9IE5VTEw7CisJICAgIGxkLm1lbnVsYWJlbCA9IE5VTEw7CisJICAgIGxkLmhlbHB0ZXh0ID0gTlVMTDsKKwkgICAgbGQuaXBhcHBlbmQgPSBpcGFwcGVuZDsKKwkgICAgbGQubWVudWRlZmF1bHQgPSBsZC5tZW51aGlkZSA9IGxkLm1lbnVzZXBhcmF0b3IgPQorCQlsZC5tZW51ZGlzYWJsZWQgPSBsZC5tZW51aW5kZW50ID0gMDsKKwl9IGVsc2UgaWYgKChlcCA9IGlzX2tlcm5lbF90eXBlKHAsICZ0eXBlKSkpIHsKKwkgICAgaWYgKGxkLmxhYmVsKSB7CisJCXJlZnN0cl9wdXQobGQua2VybmVsKTsKKwkJbGQua2VybmVsID0gcmVmc3RyZHVwKHNraXBzcGFjZShlcCkpOworCQlsZC50eXBlID0gdHlwZTsKKwkgICAgfQorCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAidGltZW91dCIpKSB7CisJICAgIG0tPnRpbWVvdXQgPSAoYXRvaShza2lwc3BhY2UocCArIDcpKSAqIENMS19UQ0sgKyA5KSAvIDEwOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAidG90YWx0aW1lb3V0IikpIHsKKwkgICAgdG90YWx0aW1lb3V0ID0gKGF0b2xsKHNraXBzcGFjZShwICsgMTMpKSAqIENMS19UQ0sgKyA5KSAvIDEwOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAib250aW1lb3V0IikpIHsKKwkgICAgbS0+b250aW1lb3V0ID0gcmVmc3RyZHVwKHNraXBzcGFjZShwICsgOSkpOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiYWxsb3dvcHRpb25zIikpIHsKKwkgICAgbS0+YWxsb3dlZGl0ID0gISFhdG9pKHNraXBzcGFjZShwICsgMTIpKTsKKwl9IGVsc2UgaWYgKChlcCA9IGxvb2tpbmdfYXQocCwgImlwYXBwZW5kIikpIHx8CisJCSAgIChlcCA9IGxvb2tpbmdfYXQocCwgInN5c2FwcGVuZCIpKSkgeworCSAgICB1aW50MzJfdCBzID0gc3RydG91bChza2lwc3BhY2UoZXApLCBOVUxMLCAwKTsKKwkgICAgaWYgKGxkLmxhYmVsKQorCQlsZC5pcGFwcGVuZCA9IHM7CisJICAgIGVsc2UKKwkJaXBhcHBlbmQgPSBzOworCX0gZWxzZSBpZiAobG9va2luZ19hdChwLCAiZGVmYXVsdCIpKSB7CisJICAgIHJlZnN0cl9wdXQoZ2xvYmFsZGVmYXVsdCk7CisJICAgIGdsb2JhbGRlZmF1bHQgPSByZWZzdHJkdXAoc2tpcHNwYWNlKHAgKyA3KSk7CisJfSBlbHNlIGlmIChsb29raW5nX2F0KHAsICJ1aSIpKSB7CisJICAgIGhhc191aSA9IDE7CisJfQorICAgIH0KK30KKworc3RhdGljIGludCBwYXJzZV9vbmVfY29uZmlnKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIEZJTEUgKmY7CisKKyAgICBpZiAoIXN0cmNtcChmaWxlbmFtZSwgIn4iKSkKKwlmaWxlbmFtZSA9IHN5c2xpbnV4X2NvbmZpZ19maWxlKCk7CisKKyAgICBkcHJpbnRmKCJPcGVuaW5nIGNvbmZpZyBmaWxlOiAlcyAiLCBmaWxlbmFtZSk7CisKKyAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgZHByaW50ZigiJXNcbiIsIGYgPyAib2siIDogImZhaWxlZCIpOworICAgIAorICAgIGlmICghZikKKwlyZXR1cm4gLTE7CisKKyAgICBwYXJzZV9jb25maWdfZmlsZShmKTsKKyAgICBmY2xvc2UoZik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVzb2x2ZV9nb3Rvcyh2b2lkKQoreworICAgIHN0cnVjdCBtZW51X2VudHJ5ICptZTsKKyAgICBzdHJ1Y3QgbWVudSAqbTsKKworICAgIGZvciAobWUgPSBhbGxfZW50cmllczsgbWU7IG1lID0gbWUtPm5leHQpIHsKKwlpZiAobWUtPmFjdGlvbiA9PSBNQV9HT1RPX1VOUkVTIHx8IG1lLT5hY3Rpb24gPT0gTUFfRVhJVF9VTlJFUykgeworCSAgICBtID0gZmluZF9tZW51KG1lLT5jbWRsaW5lKTsKKwkgICAgcmVmc3RyX3B1dChtZS0+Y21kbGluZSk7CisJICAgIG1lLT5jbWRsaW5lID0gTlVMTDsKKwkgICAgaWYgKG0pIHsKKwkJbWUtPnN1Ym1lbnUgPSBtOworCQltZS0+YWN0aW9uLS07CS8qIERyb3AgdGhlIF9VTlJFUyAqLworCSAgICB9IGVsc2UgeworCQltZS0+YWN0aW9uID0gTUFfRElTQUJMRUQ7CisJICAgIH0KKwl9CisgICAgfQorfQorCit2b2lkIHBhcnNlX2NvbmZpZ3MoY2hhciAqKmFyZ3YpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgc3RydWN0IG1lbnUgKm07CisgICAgc3RydWN0IG1lbnVfZW50cnkgKm1lOworICAgIGludCBrOworCisgICAgZW1wdHlfc3RyaW5nID0gcmVmc3RyZHVwKCIiKTsKKworICAgIC8qIEluaXRpYWxpemUgZGVmYXVsdHMgZm9yIHRoZSByb290IGFuZCBoaWRkZW4gbWVudXMgKi8KKyAgICBoaWRlX21lbnUgPSBuZXdfbWVudShOVUxMLCBOVUxMLCByZWZzdHJkdXAoIi5oaWRkZW4iKSk7CisgICAgcm9vdF9tZW51ID0gbmV3X21lbnUoTlVMTCwgTlVMTCwgcmVmc3RyZHVwKCIudG9wIikpOworICAgIHN0YXJ0X21lbnUgPSByb290X21lbnU7CisKKyAgICAvKiBPdGhlciBpbml0aWFsaXphdGlvbiAqLworICAgIG1lbXNldCgmbGQsIDAsIHNpemVvZihzdHJ1Y3QgbGFiZWxkYXRhKSk7CisKKyAgICAvKiBBY3R1YWxseSBwcm9jZXNzIHRoZSBmaWxlcyAqLworICAgIGN1cnJlbnRfbWVudSA9IHJvb3RfbWVudTsKKyAgICBpZiAoISphcmd2KSB7CisJcGFyc2Vfb25lX2NvbmZpZygifiIpOworICAgIH0gZWxzZSB7CisJd2hpbGUgKChmaWxlbmFtZSA9ICphcmd2KyspKQorCSAgICBwYXJzZV9vbmVfY29uZmlnKGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICAvKiBPbiBmaW5hbCBFT0YgcHJvY2VzcyB0aGUgbGFzdCBsYWJlbCBzdGF0ZW1lbnQgKi8KKyAgICByZWNvcmQoY3VycmVudF9tZW51LCAmbGQsIGFwcGVuZCk7CisKKyAgICAvKiBDb21tb24gcG9zdHByb2Nlc3NpbmcgKi8KKyAgICByZXNvbHZlX2dvdG9zKCk7CisKKyAgICAvKiBIYW5kbGUgZ2xvYmFsIGRlZmF1bHQgKi8KKyAgICBpZiAoaGFzX3VpICYmIGdsb2JhbGRlZmF1bHQpIHsKKwltZSA9IGZpbmRfbGFiZWwoZ2xvYmFsZGVmYXVsdCk7CisJaWYgKG1lICYmIG1lLT5tZW51ICE9IGhpZGVfbWVudSkgeworCSAgICBtZS0+bWVudS0+ZGVmZW50cnkgPSBtZS0+ZW50cnk7CisJICAgIHN0YXJ0X21lbnUgPSBtZS0+bWVudTsKKwl9CisgICAgfQorCisgICAgLyogSWYgIm1lbnUgc2F2ZSIgaXMgYWN0aXZlLCBsZXQgdGhlIEFEViBvdmVycmlkZSB0aGUgZ2xvYmFsIGRlZmF1bHQgKi8KKyAgICBpZiAobWVudXNhdmUpIHsKKwlzaXplX3QgbGVuOworCWNvbnN0IGNoYXIgKmxibCA9IHN5c2xpbnV4X2dldGFkdihBRFZfTUVOVVNBVkUsICZsZW4pOworCWNoYXIgKmxzdHI7CisJaWYgKGxibCAmJiBsZW4pIHsKKwkgICAgbHN0ciA9IHJlZnN0cl9hbGxvYyhsZW4pOworCSAgICBtZW1jcHkobHN0ciwgbGJsLCBsZW4pOwkvKiByZWZzdHJfYWxsb2MoKSBhZGRzIHRoZSBmaW5hbCBudWxsICovCisJICAgIG1lID0gZmluZF9sYWJlbChsc3RyKTsKKwkgICAgaWYgKG1lICYmIG1lLT5tZW51ICE9IGhpZGVfbWVudSkgeworCQltZS0+bWVudS0+ZGVmZW50cnkgPSBtZS0+ZW50cnk7CisJCXN0YXJ0X21lbnUgPSBtZS0+bWVudTsKKwkgICAgfQorCSAgICByZWZzdHJfcHV0KGxzdHIpOworCX0KKyAgICB9CisKKyAgICAvKiBGaW5hbCBwZXItbWVudSBpbml0aWFsaXphdGlvbiwgd2l0aCBhbGwgbGFiZWxzIGtub3duICovCisgICAgZm9yIChtID0gbWVudV9saXN0OyBtOyBtID0gbS0+bmV4dCkgeworCW0tPmN1cmVudHJ5ID0gbS0+ZGVmZW50cnk7CS8qIEFsbCBtZW51cyBzdGFydCBhdCB0aGVpciBkZWZhdWx0cyAqLworCisJaWYgKG0tPm9udGltZW91dCkKKwkgICAgbS0+b250aW1lb3V0ID0gdW5sYWJlbChtLT5vbnRpbWVvdXQpOworCWlmIChtLT5vbmVycm9yKQorCSAgICBtLT5vbmVycm9yID0gdW5sYWJlbChtLT5vbmVycm9yKTsKKyAgICB9CisKKyAgICAvKiBGaW5hbCBnbG9iYWwgaW5pdGlhbGl6YXRpb24sIHdpdGggYWxsIGxhYmVscyBrbm93biAqLworICAgIGZvciAoayA9IDA7IGsgPCBLRVlfTUFYOyBrKyspIHsKKwlpZiAoaGlkZV9rZXlba10pCisJICAgIGhpZGVfa2V5W2tdID0gdW5sYWJlbChoaWRlX2tleVtrXSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvbWVudS9yZWZzdHIuYyBiL2NvbTMyL21lbnUvcmVmc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhYjFlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21lbnUvcmVmc3RyLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmVmc3RyLmMKKyAqCisgKiBTaW1wbGUgcmVmZXJlbmNlLWNvdW50ZWQgc3RyaW5ncworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInJlZnN0ci5oIgorCisvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSByZWZzdHJpbmcgb2YgbGVuIGJ5dGVzLCBwbHVzIGZpbmFsIG51bGwgKi8KKy8qIFRoZSBmaW5hbCBudWxsIGlzIGluc2VydGVkIGluIHRoZSBzdHJpbmc7IHRoZSByZXN0IGlzIHVuaW5pdGlhbGl6ZWQuICovCitjaGFyICpyZWZzdHJfYWxsb2Moc2l6ZV90IGxlbikKK3sKKyAgICBjaGFyICpyID0gbWFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpICsgbGVuICsgMSk7CisgICAgaWYgKCFyKQorCXJldHVybiBOVUxMOworICAgICoodW5zaWduZWQgaW50ICopciA9IDE7CisgICAgciArPSBzaXplb2YodW5zaWduZWQgaW50KTsKKyAgICByW2xlbl0gPSAnXDAnOworICAgIHJldHVybiByOworfQorCitjb25zdCBjaGFyICpyZWZzdHJuZHVwKGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKyAgICBjaGFyICpyOworCisgICAgaWYgKCFzdHIpCisJcmV0dXJuIE5VTEw7CisKKyAgICBsZW4gPSBzdHJubGVuKHN0ciwgbGVuKTsKKyAgICByID0gcmVmc3RyX2FsbG9jKGxlbik7CisgICAgaWYgKHIpCisJbWVtY3B5KHIsIHN0ciwgbGVuKTsKKyAgICByZXR1cm4gcjsKK30KKworY29uc3QgY2hhciAqcmVmc3RyZHVwKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjaGFyICpyOworICAgIHNpemVfdCBsZW47CisKKyAgICBpZiAoIXN0cikKKwlyZXR1cm4gTlVMTDsKKworICAgIGxlbiA9IHN0cmxlbihzdHIpOworICAgIHIgPSByZWZzdHJfYWxsb2MobGVuKTsKKyAgICBpZiAocikKKwltZW1jcHkociwgc3RyLCBsZW4pOworICAgIHJldHVybiByOworfQorCitpbnQgdnJzcHJpbnRmKGNvbnN0IGNoYXIgKipidWZwLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgICAgdmFfbGlzdCBhcDE7CisgICAgaW50IGxlbjsKKyAgICBjaGFyICpwOworCisgICAgdmFfY29weShhcDEsIGFwKTsKKyAgICBsZW4gPSB2c25wcmludGYoTlVMTCwgMCwgZm10LCBhcDEpOworICAgIHZhX2VuZChhcDEpOworCisgICAgKmJ1ZnAgPSBwID0gcmVmc3RyX2FsbG9jKGxlbik7CisgICAgaWYgKCFwKQorCXJldHVybiAtMTsKKworICAgIHJldHVybiB2c25wcmludGYocCwgbGVuICsgMSwgZm10LCBhcCk7Cit9CisKK2ludCByc3ByaW50Zihjb25zdCBjaGFyICoqYnVmcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgaW50IHJ2OworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBydiA9IHZyc3ByaW50ZihidWZwLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworCisgICAgcmV0dXJuIHJ2OworfQorCit2b2lkIHJlZnN0cl9wdXQoY29uc3QgY2hhciAqcikKK3sKKyAgICB1bnNpZ25lZCBpbnQgKnJlZjsKKworICAgIGlmIChyKSB7CisJcmVmID0gKHVuc2lnbmVkIGludCAqKXIgLSAxOworCisJaWYgKCEtLSpyZWYpCisJICAgIGZyZWUocmVmKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tZW51L3Zlc2FtZW51LmMgYi9jb20zMi9tZW51L3Zlc2FtZW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlMjliZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21lbnUvdmVzYW1lbnUuYwpAQCAtMCwwICsxLDUyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogdmVzYW1lbnUuYworICoKKyAqIFNpbXBsZSBtZW51IHN5c3RlbSB3aGljaCBkaXNwbGF5cyBhIGxpc3QgYW5kIGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QKKyAqIGEgY29tbWFuZCBsaW5lIGFuZC9vciBlZGl0IGl0LgorICoKKyAqIFZFU0EgZ3JhcGhpY3MgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvdmVzYWNvbi5oPgorCisjaW5jbHVkZSAibWVudS5oIgorCitpbnQgZHJhd19iYWNrZ3JvdW5kKGNvbnN0IGNoYXIgKndoYXQpCit7CisgICAgaWYgKCF3aGF0KQorCXJldHVybiB2ZXNhY29uX2RlZmF1bHRfYmFja2dyb3VuZCgpOworICAgIGVsc2UgaWYgKHdoYXRbMF0gPT0gJyMnKQorCXJldHVybiB2ZXNhY29uX3NldF9iYWNrZ3JvdW5kKHBhcnNlX2FyZ2IoKGNoYXIgKiopJndoYXQpKTsKKyAgICBlbHNlCisJcmV0dXJuIHZlc2Fjb25fbG9hZF9iYWNrZ3JvdW5kKHdoYXQpOworfQorCit2b2lkIHNldF9yZXNvbHV0aW9uKGludCB4LCBpbnQgeSkKK3sKKyAgICB2ZXNhY29uX3NldF9yZXNvbHV0aW9uKHgsIHkpOworfQorCit2b2lkIGxvY2FsX2N1cnNvcl9lbmFibGUoYm9vbCBlbmFibGVkKQoreworICAgIHZlc2Fjb25fY3Vyc29yX2VuYWJsZShlbmFibGVkKTsKK30KKwordm9pZCBzdGFydF9jb25zb2xlKHZvaWQpCit7CisgICAgb3BlbmNvbnNvbGUoJmRldl9yYXdjb25fciwgJmRldl92ZXNhc2VyaWFsX3cpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9NYWtlZmlsZSBiL2NvbTMyL21vZHVsZXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjYzYzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvTWFrZWZpbGUKQEAgLTAsMCArMSw1MiBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMjIENPTTMyIHN0YW5kYXJkIG1vZHVsZXMKKyMjCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvZWxmLm1rCisKK01PRFVMRVMJICA9IGNvbmZpZy5jMzIgZXRoZXJzZWwuYzMyIGRtaXRlc3QuYzMyIGNwdWlkdGVzdC5jMzIgXAorCSAgICBkaXNrLmMzMiBwY2l0ZXN0LmMzMiBlbGYuYzMyIGxpbnV4LmMzMiByZWJvb3QuYzMyIHBtbG9hZC5jMzIgXAorCSAgICBtZW1pbmZvLmMzMiBzZGkuYzMyIHNhbmJvb3QuYzMyIGlmY3B1NjQuYzMyIHZlc2FpbmZvLmMzMiBcCisJICAgIGtiZG1hcC5jMzIgY21kLmMzMiB2cGR0ZXN0LmMzMiBob3N0LmMzMiBscy5jMzIgZ3B4ZWNtZC5jMzIgXAorCSAgICBpZmNwdS5jMzIgY3B1aWQuYzMyIGNhdC5jMzIgcHdkLmMzMiBpZnBsb3AuYzMyIHp6anNvbi5jMzIgXAorCSAgICB3aGljaHN5cy5jMzIgcHJkaGNwLmMzMiBweGVjaG4uYzMyIGtvbnRyb25fd2R0LmMzMiBpZm1lbWRzay5jMzIgXAorCSAgICBoZXhkdW1wLmMzMiBwb3dlcm9mZi5jMzIgY3B0aW1lLmMzMiBkZWJ1Zy5jMzIKKworVEVTVEZJTEVTID0KKworYWxsOiAkKE1PRFVMRVMpICQoVEVTVEZJTEVTKQorCisuUFJFQ0lPVVM6ICUubworZG1pdGVzdC5vOiBkbWl0ZXN0LmMKKwkkKENDKSAkKENGTEFHUykgJChHUExJTkNMVURFKSAtYyAtbyAkQCAkPAorCitkbWl0ZXN0LmVsZiA6IGRtaV91dGlscy5vIGRtaXRlc3QubyAkKENfTElCUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICReCisKK3RpZHkgZGlzdDoKKwlybSAtZiAqLm8gKi5sbyAqLmEgKi5sc3QgKi5lbGYgLiouZCAqLnRtcAorCitjbGVhbjogdGlkeQorCXJtIC1mICoubG54CisKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICoubHNzICouYzMyICouY29tCisJcm0gLWYgKn4gXCMqCisKK2luc3RhbGw6CisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvY2F0LmMgYi9jb20zMi9tb2R1bGVzL2NhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNzY4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL2NhdC5jCkBAIC0wLDAgKzEsMzEgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBGSUxFICpmOworICAgIGludCBpOworICAgIGludCBsZW47CisgICAgY2hhciBidWZbNDA5Nl07CisKKyAgICBpZiAoYXJnYyA8IDIpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBmaWxlbmFtZS4uLlxuIiwgYXJndlswXSk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCWYgPSBmb3Blbihhcmd2W2ldLCAiciIpOworCWlmICghZikgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlczogZmlsZSBub3QgZm91bmRcbiIsIGFyZ3ZbMF0sIGFyZ3ZbaV0pOworCSAgICByZXR1cm4gMTsKKwl9CisKKwl3aGlsZSAoKGxlbiA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mIGJ1ZiwgZikpID4gMCkKKwkgICAgZndyaXRlKGJ1ZiwgMSwgbGVuLCBzdGRvdXQpOworCQorCWZjbG9zZShmKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvY21kLmMgYi9jb20zMi9tb2R1bGVzL2NtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzM2M3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL2NtZC5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IE1pY2hhZWwgQnJvd24gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjbWQuYworICoKKyAqIEV4ZWN1dGUgYXJiaXRyYXJ5IGNvbW1hbmRzCisgKi8KKworI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorCitpbnQgbWFpbih2b2lkKQoreworICAgIHN5c2xpbnV4X3J1bl9jb21tYW5kKGNvbTMyX2NtZGxpbmUoKSk7CisgICAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9jb25maWcuYyBiL2NvbTMyL21vZHVsZXMvY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjYjBhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvY29uZmlnLmMKQEAgLTAsMCArMSwzNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjb25maWcuYworICoKKyAqIExvYWRzIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZQorICoKKyAqIFVzYWdlOiBjb25maWcgZmlsZW5hbWUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgeworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGNvbmZpZyA8ZmlsZW5hbWU+IFs8ZGlyZWN0b3J5Pl1cbiIpOworCXJldHVybiAxOworICAgIH0KKworICAgIHN5c2xpbnV4X3J1bl9rZXJuZWxfaW1hZ2UoYXJndlsxXSwgYXJndlsyXSA/IGFyZ3ZbMl0gOiAiIiwKKwkJCSAgICAgIDAsIElNQUdFX1RZUEVfQ09ORklHKTsKKworICAgIGZwcmludGYoc3RkZXJyLCAiY29uZmlnOiAlczogZmFpbGVkIHRvIGxvYWQgKG1pc3NpbmcgZmlsZT8pXG4iLCBhcmd2WzFdKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvY3B0aW1lLmMgYi9jb20zMi9tb2R1bGVzL2NwdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWZmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL2NwdGltZS5jCkBAIC0wLDAgKzEsMjg0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMC0yMDExIEdlbmUgQ3VtbQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjcHRpbWUuYwlWZXJzaW9uIDEuNAorICoKKyAqIFRpbWVkIGNvcHk7IHJlYWQgZW50aXJlIGZpbGUgdGhlbiBvdXRwdXQgdG90YWwgdGltZSwgYnl0ZXMgdHJhbnNmZXJyZWQsCisgKiBhbmQgY29tcHV0ZSB0cmFuc2ZlciByYXRlLgorICoKKyAqIGNwdGltZSBbLXN8LWxdIFstdnwtcV0gWy1iIF9TSVpFX10gWy1uIF9MRU5fXSBfRklMRV8uLi4KKyAqCS1zCUNoYW5nZSB0byBzaW1wbGUgb3V0cHV0IG1vZGUgd2l0aG91dCBjb21wdXRpbmcgdHJhbnNmZXIgcmF0ZQorICoJLWwJQ2hhbmdlIHRvIGxvbmcgb3V0cHV0IG1vZGUgKHRvIGFsbG93IGZvciBvdmVycmlkaW5nIHByZXZpb3VzIC1zKQorICoJLXYJVmVyYm9zZSBvdXRwdXQKKyAqCS1xCVF1aWV0IG91dHB1dAorICoJLWIgX1NJWkVfCXVzZSBfU0laRV8gZm9yIHRyYW5zZmVyIHNpemUKKyAqCS1uIF9MRU5fCW1heGltdW0gbGVuZ3RoIHRvIGZldGNoCisgKglfRklMRV8uLi4JU3BhY2UgZGVsaW1pdGVkIGxpc3Qgb2YgZmlsZXMgdG8gZHVtcAorICogTm90ZTogVGhlIGxhc3QgaW5zdGFuY2Ugb2YgLXMgb3IgLWwgd2lucywgYWxvbmcgd2l0aCB0aGUgbGFzdCB1c2Ugb2YgLWIgYW5kIC1uIGFuZCB0aGUgd2lubmluZyBvcHRpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBvcGVyYXRpb25zCisgKgorICogSGlzb3J5OgorICogMS40CVVzZSBmcmVhZCgpIHJhdGhlciB0aGFuIHJlYWQoKTsgdXNlIENMS19UQ0sgd2hlbiBhdmFpbGFibGUuCisgKiAxLjMJQWRkZWQgLXYvLXE7IHJld29yayBzb21lIGFyZ3VtZW50IHByb2Nlc3NpbmcuCisgKiAxLjIJQWRkZWQgLW4KKyAqIDEuMQlBZGRlZCAtbCBhbmQgLWIgc3dpdGNoZXM7IG1vcmUgZmxleGlibGUgY29tbWFuZCBsaW5lIHByb2Nlc3NpbmcKKyAqIDEuMAlGaXJzdCByZWxlYXNlCisgKi8KKworLyoKKyAqIFRvRG9zOgorICogLSBSZWZpbmUgdGltaW5nIHRvIGJlIG1vcmUgcHJlY2lzZS4gIExvdyBwcmlvcml0eS4KKyAqIC0gQWRkIC1vIGZvciBvZmZzZXQuICBXaXNobGlzdC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8Y29uc29sZXMuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisKKyNpZmRlZiBfX0NPTTMyX18KKyMgIGRlZmluZSBCVUZTWl9ERUYJKHNpemVfdCkyMDQ4CisvKiBXaGF0J3Mgb3B0aW1hbD8gIFVuZGVyIDRrPworICoJbGF5b3V0LmluYzogeGZlcl9idWZfc2VnCWVxdSAxMDAwaAorICoJY29tMzIuaW5jOiBwdXNoIGR3b3JkICgxIDw8IDE2KQkJOyA2NEsgYm91bmNlIGJ1ZmZlcgorICovCisvKiB0eXBlZGVmIHNpemVfdCBvZmZfdCAqLworCisjICBkZWZpbmUgVFBTX1QJZmxvYXQKKyMgIGlmZGVmIENMS19UQ0sKK3N0YXRpYyBpbmxpbmUgVFBTX1QgZ2V0X3Rwcyh2b2lkKSB7CXJldHVybiBDTEtfVENLOwl9CisjICBlbHNlCitzdGF0aWMgaW5saW5lIFRQU19UIGdldF90cHModm9pZCkgewlyZXR1cm4gMTguMjsJfQorIyAgZW5kaWYKKworI2Vsc2UgLyogX19DT00zMl9fICovCisKKyMgIGRlZmluZSBCVUZTWl9ERUYJKHNpemVfdCkxNjM4NAorLyogTmVlZCB0byBjaGVjayB3aGF0IG1pZ2h0IGJlIGEgImJlc3QiIGJ1ZmZlci9mZXRjaCBibG9jayBzaXplIGhlcmUgKi8KKworIyAgZGVmaW5lIFRQU19UCWxvbmcKK3N0YXRpYyBpbmxpbmUgVFBTX1QgZ2V0X3Rwcyh2b2lkKSB7CXJldHVybiBzeXNjb25mKF9TQ19DTEtfVENLKTsJfQorCisjZW5kaWYgLyogX19DT00zMl9fICovCisKKyNpZm5kZWYgU1NJWkVfTUFYCisjICBkZWZpbmUgU1NJWkVfTUFYCVBUUkRJRkZfTUFYCisjZW5kaWYKKy8qIHR5cGVkZWYgcHRyZGlmZl90IHNzaXplX3Q7ICovCisjZGVmaW5lIEJVRlNaX01BWAkoc2l6ZV90KVNTSVpFX01BWAorLyogc3NpemVfdCBtYXggKi8KKyNkZWZpbmUgQlVGU1pfTUlOCShzaXplX3QpMQorCisKKy8qIFBsZWFzZSBub3RlOiBJIGRvbid0IGtub3cgdGhlIG9yaWdpbiBvZiB0aGVzZSB0d28gbWFjcm9zIG5vciB0aGVpciBsaWNlbnNlICovCisjZGVmaW5lIFRZUEVfU0lHTkVEKHQpICghICgodCkgMCA8ICh0KSAtMSkpCisjZGVmaW5lIFRZUEVfTUFYKHQpIFwKKyAgKCh0KSAoISBUWVBFX1NJR05FRCAodCkgXAorICAgICAgICA/ICh0KSAtMSBcCisJOiB+ICh+ICh0KSAwIDw8IChzaXplb2YgKHQpICogQ0hBUl9CSVQgLSAxKSkpKQorCisjaWZuZGVmIE9GRl9UX01BWAorIyAgZGVmaW5lIE9GRl9UX01BWAlUWVBFX01BWChvZmZfdCkKKyNlbmRpZgorLyogQ2FuJ3QgYmUgU0laRV9NQVggb3IgU1NJWkVfTUFYIGFzIFN5c2xpbnV4L0NPTTMyIGlzIHVuc2lnbmVkIHdoaWxlIExpbnV4IAorICogaXMgc2lnbmVkLgorICovCisKKyNkZWZpbmUgTEVOX01BWAkJT0ZGX1RfTUFYCisvKiBvZmZfdCBtYXggKi8KKyNkZWZpbmUgTEVOX01JTgkJKG9mZl90KTAKKwordm9pZCBwcmludF9jcF9yZXN1bHRfdGljayhzaXplX3QgYmNudCwgY2xvY2tfdCBldCwgVFBTX1QgdHBzLCBpbnQgb2ZmcykKK3sKKwlzaXplX3QgZHI7CisJLyogcHJldmVudCBkaXZpZGUgYnkgMCAqLworCWRyID0gbWF4KGJjbnQsIChiY250ICogdHBzKSkgLyBtYXgoKGNsb2NrX3QpMSwgKGV0ICsgb2ZmcykpOworCXByaW50ZigiICAlK2QgJXp1IEIvczsgJXp1IEtpQi9zOyAlenUgTWlCL3NcbiIsIG9mZnMsIGRyLCBkci8xMDI0LCBkci8xMDQ4NTc2KTsKK30JLyogdm9pZCBwcmludF9jcF9yZXN1bHRfdGljayhzaXplX3QgYmNudCwgY2xvY2tfdCBldCwgVFBTX1QgdHBzLCBpbnQgb2ZmcykgKi8KKwordm9pZCBwcmludF9jcF9yZXN1bHRfbG9uZyhjaGFyICpmbiwgc2l6ZV90IGJjbnQsIGNsb2NrX3QgYmMsIGNsb2NrX3QgZWMsIHNpemVfdCBidWZzeiwgY2hhciBkb192ZXJib3NlKQoreworCVRQU19UIHRwczsKKwlpZiAoZG9fdmVyYm9zZSA+IDIpCisJCXByaW50ZigiRW50ZXIgcHJpbnRfY3BfcmVzdWx0X2xvbmcoKVxuIik7CisJdHBzID0gZ2V0X3RwcygpOworCXByaW50ZigiICAlenUgQiBpbiAlZCB0aWNrcyBmcm9tICclcydcbiIsIGJjbnQsIChpbnQpKGVjIC0gYmMpLCBmbik7CisJcHJpbnRmKCIgIH4lZCB0aWNrcyBwZXIgc2Vjb25kOyAlenUgQiBibG9jay90cmFuc2ZlciBzaXplXG4iLCAoaW50KXRwcywgYnVmc3opOworCXByaW50X2NwX3Jlc3VsdF90aWNrKGJjbnQsIChlYyAtIGJjKSwgdHBzLCAwKTsKKwlwcmludF9jcF9yZXN1bHRfdGljayhiY250LCAoZWMgLSBiYyksIHRwcywgMSk7CisJcHJpbnRfY3BfcmVzdWx0X3RpY2soYmNudCwgKGVjIC0gYmMpLCB0cHMsIC0xKTsKK30JLyogdm9pZCBwcmludF9jcF9yZXN1bHRfbG9uZyhjaGFyICpmbiwgc2l6ZV90IGJjbnQsIGNsb2NrX3QgYmMsIGNsb2NrX3QgZWMsIHNpemVfdCBidWZzeikgKi8KKwordm9pZCBwcmludF9jcF9yZXN1bHRfc2ltcGxlKGNoYXIgKmZuLCBzaXplX3QgYmNudCwgY2xvY2tfdCBiYywgY2xvY2tfdCBlYywgc2l6ZV90IGJ1ZnN6LCBjaGFyIGRvX3ZlcmJvc2UpCit7CisJaWYgKGRvX3ZlcmJvc2UpIHt9CisJcHJpbnRmKCIgICV6dUIgICVkdCAlenV4ICclcydcbiIsIGJjbnQsIChpbnQpKGVjIC0gYmMpLCBidWZzeiwgZm4pOworfQkvKiB2b2lkIHByaW50X2NwX3Jlc3VsdF9zaW1wbGUoY2hhciAqZm4sIGludCBiY250LCBjbG9ja190IGJjLCBjbG9ja190IGVjLCBjaGFyIGRvX3ZlcmJvc2UpICovCisKK3NpemVfdCB0aW1lX2NvcHlfYnVmc3ooc2l6ZV90IGJ1ZnN6LCBzaXplX3QgYmNudCwgb2ZmX3QgbWF4bGVuKQoreworCXJldHVybiBtaW4oYnVmc3osIChtYXhsZW4gLSBiY250KSk7Cit9CS8qIHNpemVfdCB0aW1lX2NvcHlfYnVmc3ooc2l6ZV90IGJ1ZnN6LCBzaXplX3QgYmNudCwgb2ZmX3QgbWF4bGVuKSAqLworCitpbnQgdGltZV9jb3B5KGNoYXIgKmZuLCBjaGFyIGRvX3NpbXBsZSwgY2hhciBkb192ZXJib3NlLCBzaXplX3QgaWJ1ZnN6LCBvZmZfdCBtYXhsZW4pCit7CisvLyAJaW50IGZkOworCWludCBydiA9IDA7CisJaW50IGkgPSAwOworCUZJTEUgKmY7CisJc2l6ZV90IGJ1ZnN6LCBiY250ID0gMDsKKwlpbnQgbnVtcmQ7CisJc3RydWN0IHRtcyB0bTsKKwljbG9ja190IGJjLCBlYzsKKwljaGFyIGJ1ZltpYnVmc3ogKyAxXTsKKworCWJ1ZlswXSA9IDA7CisJaWYgKGRvX3ZlcmJvc2UpCisJCXByaW50ZigiVHJ5aW5nIGZpbGUgJyVzJ1xuIiwgZm4pOworCWVycm5vID0gMDsKKy8vIAlmZCA9IG9wZW4oZm4sIE9fUkRPTkxZKTsKKwlmID0gZm9wZW4oZm4sICJyIik7CisvLyAJaWYgKGZkID09IC0xKSB7CisJaWYgKCFmKSB7CisJCXN3aXRjaCAoZXJybm8pIHsKKwkJY2FzZSBFTk9FTlQgOgorCQkJcHJpbnRmKCJGaWxlICclcycgZG9lcyBub3QgZXhpc3RcbiIsIGZuKTsKKwkJCWJyZWFrOworCQljYXNlIEVCQURGOgorCQkJcHJpbnRmKCJGaWxlICclcyc6IEJhZCBGaWxlIERlc2NyaXB0b3JcbiIsIGZuKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXByaW50ZigiRXJyb3IgJyVkJyBvcGVuaW5nIGZpbGUgJyVzJ1xuIiwgZXJybm8sIGZuKTsKKwkJfQorCQlydiA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKGRvX3ZlcmJvc2UpCisJCQlwcmludGYoIkZpbGUgJyVzJyBvcGVuZWRcbiIsIGZuKTsKKwkJYnVmc3ogPSB0aW1lX2NvcHlfYnVmc3ooaWJ1ZnN6LCBiY250LCBtYXhsZW4pOworCQliYyA9IHRpbWVzKCZ0bSk7CisvLyAJCW51bXJkID0gcmVhZChmZCwgYnVmLCBidWZzeik7CisvLyAJCW51bXJkID0gZnJlYWQoYnVmLCBidWZzeiwgMSwgZik7CisJCW51bXJkID0gZnJlYWQoYnVmLCAxLCBidWZzeiwgZik7CisJCWkrKzsKKwkJaWYgKG51bXJkID4gMCkKKwkJCWJjbnQgPSBudW1yZDsKKwkJd2hpbGUgKChudW1yZCA+IDApICYmIChidWZzeiA+IDApKSB7CisJCQlidWZzeiA9IHRpbWVfY29weV9idWZzeihidWZzeiwgYmNudCwgbWF4bGVuKTsKKy8vIAkJCW51bXJkID0gcmVhZChmZCwgYnVmLCBidWZzeik7CisvLyAJCQludW1yZCA9IGZyZWFkKGJ1ZiwgYnVmc3osIDEsIGYpOworCQkJbnVtcmQgPSBmcmVhZChidWYsIDEsIGJ1ZnN6LCBmKTsKKwkJCWkrKzsKKwkJCWlmIChudW1yZCA+PSAwKQorLy8gCQkJCWJjbnQgPSBiY250ICsgbnVtcmQ7CisJCQkJYmNudCArPSBudW1yZDsKKwkJfQorCQllYyA9IHRpbWVzKCZ0bSk7CisvLyAJCWNsb3NlKGZkKTsKKwkJZmNsb3NlKGYpOworCQlpZiAoZG9fdmVyYm9zZSkKKwkJCXByaW50ZigiRmlsZSAnJXMnIGNsb3NlZFxuIiwgZm4pOworCQlpZiAobnVtcmQgPCAwKSB7CisJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQljYXNlIEVJTyA6CisJCQkJcHJpbnRmKCJJTyBFcnJvciBhdCAlenUgQiByZWFkaW5nIGZpbGUgJyVzJ1xuIiwgYmNudCwgZm4pOworCQkJCWJyZWFrOworCQkJY2FzZSBFSU5WQUwgOgorCQkJCXByaW50ZigiSW52YWxpZCBNb2RlIGF0ICV6dSBCIHJlYWRpbmcgZmlsZSAnJXMnXG4iLCBiY250LCBmbik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQlwcmludGYoIkVycm9yICclZCcgYXQgJXp1IEIgcmVhZGluZyBmaWxlICclcydcbiIsIGVycm5vLCBiY250LCBmbik7CisJCQl9CisJCQlydiA9IDI7CisJCX0KKwkJaWYgKGJjbnQgPiAwKSB7CisJCQlpZiAoYnVmc3ogPT0gMCkKKwkJCQlwcmludGYoIm1heGVkIG91dCBvbiBtYXhsblxuIik7CisJCQlpZiAoZG9fc2ltcGxlKQorCQkJCXByaW50X2NwX3Jlc3VsdF9zaW1wbGUoZm4sIGJjbnQsIGJjLCBlYywgaWJ1ZnN6LCBkb192ZXJib3NlKTsKKwkJCWVsc2UKKwkJCQlwcmludF9jcF9yZXN1bHRfbG9uZyhmbiwgYmNudCwgYmMsIGVjLCBpYnVmc3osIGRvX3ZlcmJvc2UpOworCQl9CisJCWlmIChkb192ZXJib3NlKQorCQkJcHJpbnRmKCIgIG51bXJkICVkIGJjbnQgJWQgYnVmc3ogJWQgaSAlZFxuIiwgbnVtcmQsIGJjbnQsIGJ1ZnN6LCBpKTsKKwl9CisJcmV0dXJuIHJ2OworfQkvKiBpbnQgdGltZV9jb3B5KGNoYXIgKmZuLCBjaGFyIGRvX3NpbXBsZSwgaW50IGJ1ZnN6LCBvZmZfdCBtYXhsZW4pICovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisJY2hhciBkb19zaW1wbGUgPSAwLCBkb19wYnVmID0gMCwgZG9fcGxlbiA9IDAsIGRvX3ZlcmJvc2UgPSAwOworCWNoYXIgKmFyZzsKKwlzaXplX3QgdGJ1ZnN6LCBidWZzeiA9IG1pbigoQlVGU1pfREVGKSwgKEJVRlNaX01BWCkpOworCW9mZl90IHRtYXhsZW4sIG1heGxlbiA9IExFTl9NQVg7CisJaW50IG51bWZsID0gMDsKKwljb25zb2xlX2Fuc2lfc3RkKCk7CisvLyAJb3BlbmNvbnNvbGUoJmRldl9zdGRjb25fciwgJmRldl9zdGRjb25fdyk7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoYXJndltpXVswXSA9PSAnLScpIHsKKwkJCWFyZyA9IGFyZ3ZbaV0gKyAxOworCQkJaWYgKHN0cmNtcChhcmcsICJiIikgPT0gMCkgeworCQkJCWkrKzsKKwkJCQlpZiAoaSA8IGFyZ2MpIHsKKwkJCQkJdGJ1ZnN6ID0gYXRvaShhcmd2W2ldKTsKKwkJCQkJaWYgKHRidWZzeiA+IDApCisJCQkJCQlidWZzeiA9IG1pbihtYXgoKEJVRlNaX01JTiksIHRidWZzeiksIChCVUZTWl9NQVgpKTsKKwkJCQkJZG9fcGJ1ZiA9IDE7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAibiIpID09IDApIHsKKwkJCQlpKys7CisJCQkJaWYgKGkgPCBhcmdjKSB7CisJCQkJCXRtYXhsZW4gPSBhdG9pKGFyZ3ZbaV0pOworCQkJCQlpZiAodG1heGxlbiA+IDApCisJCQkJCQltYXhsZW4gPSBtaW4obWF4KChMRU5fTUlOKSwgdG1heGxlbiksIChMRU5fTUFYKSk7CisJCQkJCWRvX3BsZW4gPSAxOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZywgInMiKSA9PSAwKQorCQkJCWRvX3NpbXBsZSA9IDE7CisJCQllbHNlIGlmIChzdHJjbXAoYXJnLCAibCIpID09IDApCisJCQkJZG9fc2ltcGxlID0gMDsKKwkJCWVsc2UgaWYgKHN0cmNtcChhcmcsICJ2IikgPT0gMCkKKwkJCQlkb192ZXJib3NlID0gMTsKKwkJCWVsc2UgaWYgKHN0cmNtcChhcmcsICJxIikgPT0gMCkKKwkJCQlkb192ZXJib3NlID0gMDsKKwkJfQorCX0KKwlpZiAoZG9fcGJ1ZiB8fCBkb192ZXJib3NlKQorCQlwcmludGYoIlVzaW5nIGJ1ZnN6ICV6dVxuIiwgYnVmc3opOworCWlmIChkb19wbGVuIHx8IGRvX3ZlcmJvc2UpCisJCXByaW50ZigiVXNpbmcgbWF4bGVuICV6dVxuIiwgbWF4bGVuKTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmIChhcmd2W2ldWzBdID09ICctJykgeworCQkJYXJnID0gYXJndltpXSArIDE7CisJCQlpZiAoKHN0cmNtcChhcmcsICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJuIikgPT0gMCkpCisJCQkJaSsrOyAJLyogU2tpcCBuZXh0IGFyZyAqLworCQkJZWxzZSBpZiAoISgoc3RyY21wKGFyZywgInMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInYiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInEiKSA9PSAwKSkpIHsKKwkJCQl0aW1lX2NvcHkoYXJndltpXSwgZG9fc2ltcGxlLCBkb192ZXJib3NlLCBidWZzeiwgbWF4bGVuKTsKKwkJCQludW1mbCsrOworCQkJfQorCQl9IGVsc2UgeworCQkJdGltZV9jb3B5KGFyZ3ZbaV0sIGRvX3NpbXBsZSwgZG9fdmVyYm9zZSwgYnVmc3osIG1heGxlbik7CisJCQludW1mbCsrOworCQl9CisJfQorCWlmIChudW1mbCA9PSAwKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBQbGVhc2Ugc3BlY2lmeSBhIGZpbGVcbiIsIGFyZ3ZbMF0pOworCXJldHVybiAwOworfQkvKiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9jcHVpZC5jIGIvY29tMzIvbW9kdWxlcy9jcHVpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDM4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL2NwdWlkLmMKQEAgLTAsMCArMSw1OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL2NwdS5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorCitzdGF0aWMgdm9pZCBkdW1wX3JlZyhjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCB2YWwpCit7CisgICAgaW50IGk7CisKKyAgICBwcmludGYoIiUtM3MgOiAlMTB1IDB4JTA4eCAiLCBuYW1lLCB2YWwsIHZhbCk7CisKKyAgICBmb3IgKGkgPSAzOyBpID49IDA7IGktLSkgeworCXVpbnQ4X3QgYyA9IHZhbCA+PiAoaSo4KTsKKwlwdXRjaGFyKChjID49ICcgJyAmJiBjIDw9ICd+JykgPyBjIDogJy4nKTsKKyAgICB9CisgICAgcHV0Y2hhcignXG4nKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICB1aW50MzJfdCBsZWFmLCBjb3VudGVyOworICAgIHVpbnQzMl90IGVheCwgZWJ4LCBlY3gsIGVkeDsKKworICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gNCkgeworCXByaW50ZigiVXNhZ2U6ICVzIGxlYWYgW2NvdW50ZXJdXG4iLCBhcmd2WzBdKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIGxlYWYgPSBzdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDApOworICAgIGNvdW50ZXIgPSAoYXJnYyA+IDIpID8gc3RydG91bChhcmd2WzJdLCBOVUxMLCAwKSA6IDA7CisKKyAgICBpZiAoIWNwdV9oYXNfZWZsYWcoRUZMQUdTX0lEKSkgeworCXByaW50ZigiVGhlIENQVUlEIGluc3RydWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCWV4aXQoMSk7CisgICAgfQorCisgICAgY3B1aWRfY291bnQobGVhZiwgY291bnRlciwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisKKyAgICBkdW1wX3JlZygiZWF4IiwgZWF4KTsKKyAgICBkdW1wX3JlZygiZWJ4IiwgZWJ4KTsKKyAgICBkdW1wX3JlZygiZWN4IiwgZWN4KTsKKyAgICBkdW1wX3JlZygiZWR4IiwgZWR4KTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9jcHVpZHRlc3QuYyBiL2NvbTMyL21vZHVsZXMvY3B1aWR0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwMjU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvY3B1aWR0ZXN0LmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA2IEVyd2FuIFZlbHUgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKgorICogY3B1aWR0ZXN0LmMKKyAqCisgKiBBIENQVUlEIGRlbW8gcHJvZ3JhbSB1c2luZyBsaWJjb20zMgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlICJjcHVpZC5oIgorCitjaGFyIGRpc3BsYXlfbGluZTsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBzX2NwdSBjcHU7CisKKyAgICBmb3IgKDs7KSB7CisJZGV0ZWN0X2NwdSgmY3B1KTsKKwlwcmludGYoIlZlbmRvciAgICAgID0gJXNcbiIsIGNwdS52ZW5kb3IpOworCXByaW50ZigiTW9kZWwgICAgICAgPSAlc1xuIiwgY3B1Lm1vZGVsKTsKKwlwcmludGYoIlZlbmRvciBJRCAgID0gJWRcbiIsIGNwdS52ZW5kb3JfaWQpOworCXByaW50ZigiRmFtaWx5ICAgICAgPSAlZFxuIiwgY3B1LmZhbWlseSk7CisJcHJpbnRmKCJNb2RlbCBJRCAgICA9ICVkXG4iLCBjcHUubW9kZWxfaWQpOworCXByaW50ZigiU3RlcHBpbmcgICAgPSAlZFxuIiwgY3B1LnN0ZXBwaW5nKTsKKwlwcmludGYoIkZsYWdzICAgICAgID0gIik7CisJaWYgKGNwdS5mbGFncy5mcHUpCisJICAgIHByaW50ZigiZnB1ICIpOworCWlmIChjcHUuZmxhZ3Mudm1lKQorCSAgICBwcmludGYoInZtZSAiKTsKKwlpZiAoY3B1LmZsYWdzLmRlKQorCSAgICBwcmludGYoImRlICIpOworCWlmIChjcHUuZmxhZ3MucHNlKQorCSAgICBwcmludGYoInBzZSAiKTsKKwlpZiAoY3B1LmZsYWdzLnRzYykKKwkgICAgcHJpbnRmKCJ0c2MgIik7CisJaWYgKGNwdS5mbGFncy5tc3IpCisJICAgIHByaW50ZigibXNyICIpOworCWlmIChjcHUuZmxhZ3MucGFlKQorCSAgICBwcmludGYoInBhZSAiKTsKKwlpZiAoY3B1LmZsYWdzLm1jZSkKKwkgICAgcHJpbnRmKCJtY2UgIik7CisJaWYgKGNwdS5mbGFncy5jeDgpCisJICAgIHByaW50ZigiY3g4ICIpOworCWlmIChjcHUuZmxhZ3MuYXBpYykKKwkgICAgcHJpbnRmKCJhcGljICIpOworCWlmIChjcHUuZmxhZ3Muc2VwKQorCSAgICBwcmludGYoInNlcCAiKTsKKwlpZiAoY3B1LmZsYWdzLm10cnIpCisJICAgIHByaW50ZigibXRyciAiKTsKKwlpZiAoY3B1LmZsYWdzLnBnZSkKKwkgICAgcHJpbnRmKCJwZ2UgIik7CisJaWYgKGNwdS5mbGFncy5tY2EpCisJICAgIHByaW50ZigibWNhICIpOworCWlmIChjcHUuZmxhZ3MuY21vdikKKwkgICAgcHJpbnRmKCJjbW92ICIpOworCWlmIChjcHUuZmxhZ3MucGF0KQorCSAgICBwcmludGYoInBhdCAiKTsKKwlpZiAoY3B1LmZsYWdzLnBzZV8zNikKKwkgICAgcHJpbnRmKCJwc2VfMzYgIik7CisJaWYgKGNwdS5mbGFncy5wc24pCisJICAgIHByaW50ZigicHNuICIpOworCWlmIChjcHUuZmxhZ3MuY2xmbHNoKQorCSAgICBwcmludGYoImNsZmxzaCAiKTsKKwlpZiAoY3B1LmZsYWdzLmR0cykKKwkgICAgcHJpbnRmKCJkdHMgIik7CisJaWYgKGNwdS5mbGFncy5hY3BpKQorCSAgICBwcmludGYoImFjcGkgIik7CisJaWYgKGNwdS5mbGFncy5tbXgpCisJICAgIHByaW50ZigibW14ICIpOworCWlmIChjcHUuZmxhZ3Muc3NlKQorCSAgICBwcmludGYoInNzZSAiKTsKKwlpZiAoY3B1LmZsYWdzLnNzZTIpCisJICAgIHByaW50Zigic3NlMiAiKTsKKwlpZiAoY3B1LmZsYWdzLnNzKQorCSAgICBwcmludGYoInNzICIpOworCWlmIChjcHUuZmxhZ3MuaHR0KQorCSAgICBwcmludGYoImh0ICIpOworCWlmIChjcHUuZmxhZ3MuYWNjKQorCSAgICBwcmludGYoImFjYyAiKTsKKwlpZiAoY3B1LmZsYWdzLnN5c2NhbGwpCisJICAgIHByaW50Zigic3lzY2FsbCAiKTsKKwlpZiAoY3B1LmZsYWdzLm1wKQorCSAgICBwcmludGYoIm1wICIpOworCWlmIChjcHUuZmxhZ3MubngpCisJICAgIHByaW50ZigibnggIik7CisJaWYgKGNwdS5mbGFncy5tbXhleHQpCisJICAgIHByaW50ZigibW14ZXh0ICIpOworCWlmIChjcHUuZmxhZ3MubG0pCisJICAgIHByaW50ZigibG0gIik7CisJaWYgKGNwdS5mbGFncy5ub3dleHQpCisJICAgIHByaW50ZigiM2Rub3dleHQgIik7CisJaWYgKGNwdS5mbGFncy5ub3cpCisJICAgIHByaW50ZigiM2Rub3chICIpOworCWlmIChjcHUuZmxhZ3Mudm14KQorCSAgICBwcmludGYoInZteCAiKTsKKwlpZiAoY3B1LmZsYWdzLnN2bSkKKwkgICAgcHJpbnRmKCJzdm0gIik7CisJcHJpbnRmKCJcbiIpOworCXByaW50ZigiU01QICAgICAgICAgPSAiKTsKKwlpZiAoY3B1LmZsYWdzLnNtcCkKKwkgICAgcHJpbnRmKCJ5ZXNcbiIpOworCWVsc2UKKwkgICAgcHJpbnRmKCJub1xuIik7CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL2RlYnVnLmMgYi9jb20zMi9tb2R1bGVzL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyNmViZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvZGVidWcuYwpAQCAtMCwwICsxLDU0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBNYXR0IEZsZW1pbmcKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L2RlYnVnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIGNoYXIgKnByb2duYW1lOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZXwtZF0gPGZ1bmMxPiBbPGZ1bmMyPiwgLi4uXVxuIiwgcHJvZ25hbWUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGJvb2wgZW5hYmxlOworICAgIGludCBpOworCisgICAgcHJvZ25hbWUgPSBhcmd2WzBdOworCisgICAgaWYgKGFyZ2MgPCAzKSB7CisJdXNhZ2UoKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCFzdHJuY21wKGFyZ3ZbMV0sICItZSIsIDIpKQorCWVuYWJsZSA9IHRydWU7CisgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndlsxXSwgIi1kIiwgMikpCisJZW5hYmxlID0gZmFsc2U7CisgICAgZWxzZSB7CisJdXNhZ2UoKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgeworCWNoYXIgKnN0ciA9IGFyZ3ZbaV07CisKKwlpZiAoc3lzbGludXhfZGVidWcoc3RyLCBlbmFibGUpIDwgMCkKKwkgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZGVidWcgc3ltYm9sIFwiJXNcIlxuIiwgc3RyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvZGlyLmMgYi9jb20zMi9tb2R1bGVzL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTk5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL2Rpci5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogRGlzcGxheSBkaXJlY3RvcnkgY29udGVudHMKKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z2V0a2V5Lmg+CisKK3N0YXRpYyBpbnQgcm93cywgY29sczsJCS8qIFNjcmVlbiBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgRElSX0NIVU5LCTEwMjQKKworc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfc3RyKGludCB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRFRfRklGTzoKKwlyZXR1cm4gIltmaWZdIjsKKyAgICBjYXNlIERUX0NIUjoKKwlyZXR1cm4gIltjaHJdIjsKKyAgICBjYXNlIERUX0RJUjoKKwlyZXR1cm4gIltkaXJdIjsKKyAgICBjYXNlIERUX0JMSzoKKwlyZXR1cm4gIltibGtdIjsKKyAgICBjYXNlIERUX1VOS05PV046CisgICAgY2FzZSBEVF9SRUc6CisJcmV0dXJuICIiOworICAgIGNhc2UgRFRfTE5LOgorCXJldHVybiAiW2xua10iOworICAgIGNhc2UgRFRfU09DSzoKKwlyZXR1cm4gIltzY2tdIjsKKyAgICBjYXNlIERUX1dIVDoKKwlyZXR1cm4gIlt3aHRdIjsKKyAgICBkZWZhdWx0OgorCXJldHVybiAiWz8/P10iOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZnJlZV9kaXJlbnRzKHN0cnVjdCBkaXJlbnQgKipkZXgsIHNpemVfdCBuX2RlKQoreworICAgIHNpemVfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5fZGU7IGkrKykKKwlmcmVlKGRleFtpXSk7CisKKyAgICBmcmVlKGRleCk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9kaXJlbnQoY29uc3Qgdm9pZCAqcF9kZTEsIGNvbnN0IHZvaWQgKnBfZGUyKQoreworICAgIGNvbnN0IHN0cnVjdCBkaXJlbnQgKmRlMSA9ICooY29uc3Qgc3RydWN0IGRpcmVudCAqKilwX2RlMTsKKyAgICBjb25zdCBzdHJ1Y3QgZGlyZW50ICpkZTIgPSAqKGNvbnN0IHN0cnVjdCBkaXJlbnQgKiopcF9kZTI7CisgICAgaW50IG5kaXIxLCBuZGlyMjsKKworICAgIG5kaXIxID0gZGUxLT5kX3R5cGUgIT0gRFRfRElSOworICAgIG5kaXIyID0gZGUyLT5kX3R5cGUgIT0gRFRfRElSOworCisgICAgaWYgKG5kaXIxICE9IG5kaXIyKQorCXJldHVybiBuZGlyMSAtIG5kaXIyOworCisgICAgcmV0dXJuIHN0cmNtcChkZTEtPmRfbmFtZSwgZGUyLT5kX25hbWUpOworfQorCitzdGF0aWMgaW50IGRpc3BsYXlfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKmRpcm5hbWUpCit7CisgICAgRElSICpkaXI7CisgICAgc3RydWN0IGRpcmVudCAqZGU7CisgICAgc3RydWN0IGRpcmVudCAqKmRleCA9IE5VTEw7CisgICAgc2l6ZV90IG5fZGV4ID0gMCwgbl9kZSA9IDA7CisgICAgc2l6ZV90IGksIGosIGs7CisgICAgc2l6ZV90IG5yb3dzLCBuY29scywgcGVycGFnZTsKKyAgICBzaXplX3QgZW5kcGFnZTsKKyAgICBpbnQgbWF4bGVuID0gMDsKKyAgICBpbnQgcG9zLCB0cG9zLCBjb2x3aWR0aDsKKworICAgIGRpciA9IG9wZW5kaXIoZGlybmFtZSk7CisgICAgaWYgKCFkaXIpIHsKKwlwcmludGYoIlVuYWJsZSB0byByZWFkIGRpcmVjdG9yeTogJXNcbiIsIGRpcm5hbWUpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJc3RydWN0IGRpcmVudCAqbmRlOworCisJaWYgKG5fZGUgPj0gbl9kZXgpIHsKKwkgICAgc3RydWN0IGRpcmVudCAqKm5kZXg7CisKKwkgICAgbmRleCA9IHJlYWxsb2MoZGV4LCAobl9kZXggKyBESVJfQ0hVTkspICogc2l6ZW9mICpkZXgpOworCSAgICBpZiAoIW5kZXgpCisJCWdvdG8gbm9tZW07CisKKwkgICAgZGV4ID0gbmRleDsKKwkgICAgbl9kZXggKz0gRElSX0NIVU5LOworCX0KKworCW5kZSA9IG1hbGxvYyhkZS0+ZF9yZWNsZW4pOworCWlmICghbmRlKQorCSAgICBnb3RvIG5vbWVtOworCisJbWVtY3B5KG5kZSwgZGUsIGRlLT5kX3JlY2xlbik7CisJZGV4W25fZGUrK10gPSBuZGU7CisKKwltYXhsZW4gPSBtYXgobWF4bGVuLCBkZS0+ZF9yZWNsZW4pOworICAgIH0KKworICAgIGNsb3NlZGlyKGRpcik7CisKKyAgICBxc29ydChkZXgsIG5fZGUsIHNpemVvZiAqZGV4LCBjb21wYXJlX2RpcmVudCk7CisKKyAgICBtYXhsZW4gLT0gb2Zmc2V0b2Yoc3RydWN0IGRpcmVudCwgZF9uYW1lKSArIDE7CisgICAgbmNvbHMgPSAoY29scyArIDIpLyhtYXhsZW4gKyA4KTsKKyAgICBuY29scyA9IG1pbihuY29scywgbl9kZSk7CisgICAgbmNvbHMgPSBtYXgobmNvbHMsIDFVKTsKKyAgICBjb2x3aWR0aCA9IChjb2xzICsgMikvbmNvbHM7CisgICAgcGVycGFnZSA9IG5jb2xzICogKHJvd3MgLSAxKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuX2RlOyBpICs9IHBlcnBhZ2UpIHsKKwkvKiBSb3dzIG9uIHRoaXMgcGFnZSAqLworCWVuZHBhZ2UgPSBtaW4oaStwZXJwYWdlLCBuX2RlKTsKKwlucm93cyA9ICgoZW5kcGFnZS1pKSArIG5jb2xzIC0gMSkvbmNvbHM7CisKKwlmb3IgKGogPSAwOyBqIDwgbnJvd3M7IGorKykgeworCSAgICBwb3MgPSB0cG9zID0gMDsKKwkgICAgZm9yIChrID0gaStqOyBrIDwgZW5kcGFnZTsgayArPSBucm93cykgeworCQlwb3MgKz0gcHJpbnRmKCIlKnMlLTVzICVzIiwKKwkJCSAgICAgICh0cG9zIC0gcG9zKSwgIiIsCisJCQkgICAgICB0eXBlX3N0cihkZXhba10tPmRfdHlwZSksCisJCQkgICAgICBkZXhba10tPmRfbmFtZSk7CisJCXRwb3MgKz0gY29sd2lkdGg7CisJICAgIH0KKwkgICAgcHJpbnRmKCJcbiIpOworCX0KKworCWlmIChlbmRwYWdlID49IG5fZGUpCisJICAgIGJyZWFrOworCisJZ2V0X2tleShzdGRpbiwgMCk7CisgICAgfQorCisgICAgZnJlZV9kaXJlbnRzKGRleCwgbl9kZSk7CisgICAgcmV0dXJuIDA7CisKK25vbWVtOgorICAgIGNsb3NlZGlyKGRpcik7CisgICAgcHJpbnRmKCJPdXQgb2YgbWVtb3J5IGVycm9yIVxuIik7CisgICAgZnJlZV9kaXJlbnRzKGRleCwgbl9kZSk7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBydjsKKworICAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZyb3dzLCAmY29scykpIHsKKwkvKiBVbmtub3duIHNjcmVlbiBzaXplPyAqLworCXJvd3MgPSAyNDsKKwljb2xzID0gODA7CisgICAgfQorCisgICAgaWYgKGFyZ2MgPCAyKQorCXJ2ID0gZGlzcGxheV9kaXJlY3RvcnkoIi4iKTsKKyAgICBlbHNlIGlmIChhcmdjID09IDIpCisJcnYgPSBkaXNwbGF5X2RpcmVjdG9yeShhcmd2WzFdKTsKKyAgICBlbHNlIHsKKwlwcmludGYoIlVzYWdlOiBkaXIgZGlyZWN0b3J5XG4iKTsKKwlydiA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIHJ2ID8gMSA6IDA7Cit9CisgIApkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9kaXNrLmMgYi9jb20zMi9tb2R1bGVzL2Rpc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDY4MzgxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9kaXNrLmMKQEAgLTAsMCArMSw2MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgUGllcnJlLUFsZXhhbmRyZSBNZXllciAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRpc2svZ2VvbS5oPgorI2luY2x1ZGUgPGRpc2svdXRpbC5oPgorI2luY2x1ZGUgPGRpc2svZXJybm9fZGlzay5oPgorI2luY2x1ZGUgPGRpc2svZXJyb3IuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3QgZHJpdmVpbmZvIGRyaXZlOworCXN0cnVjdCBkcml2ZWluZm8gKmQgPSAmZHJpdmU7CisKKwkodm9pZClhcmdjOworCSh2b2lkKWFyZ3Y7CisKKwlmb3IgKGludCBkaXNrID0gMHg4MDsgZGlzayA8IDB4ZmY7IGRpc2srKykgeworCQltZW1zZXQoZCwgMCwgc2l6ZW9mKHN0cnVjdCBkcml2ZWluZm8pKTsKKwkJZC0+ZGlzayA9IGRpc2s7CisJCWdldF9kcml2ZV9wYXJhbWV0ZXJzKGQpOworCisJCS8qIERvIG5vdCBwcmludCBvdXRwdXQgd2hlbiBkcml2ZSBkb2VzIG5vdCBleGlzdHMgKi8KKwkJaWYgKGVycm5vX2Rpc2sgPT0gLTEgfHwgIWQtPmNiaW9zKQorCQkJY29udGludWU7CisKKwkJaWYgKGVycm5vX2Rpc2spIHsKKwkJCWdldF9lcnJvcigicmVhZGluZyBkaXNrIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByaW50ZigiRElTSyAweCVYOlxuIiwgZC0+ZGlzayk7CisJCXByaW50ZigiICBDL0gvUzogJWQgaGVhZHMsICVkIGN5bGluZGVyc1xuIiwKKwkJCWQtPmxlZ2FjeV9tYXhfaGVhZCArIDEsIGQtPmxlZ2FjeV9tYXhfY3lsaW5kZXIgKyAxKTsKKwkJcHJpbnRmKCIgICAgICAgICAlZCBzZWN0b3JzL3RyYWNrLCAlZCBkcml2ZXNcbiIsCisJCQlkLT5sZWdhY3lfc2VjdG9yc19wZXJfdHJhY2ssIGQtPmxlZ2FjeV9tYXhfZHJpdmUpOworCQlwcmludGYoIiAgRUREOiAgIGViaW9zPSVkLCBFREQgdmVyc2lvbjogJVhcbiIsCisJCQlkLT5lYmlvcywgZC0+ZWRkX3ZlcnNpb24pOworCQlwcmludGYoIiAgICAgICAgICVkIGhlYWRzLCAlZCBjeWxpbmRlcnNcbiIsCisJCQkoaW50KSBkLT5lZGRfcGFyYW1zLmhlYWRzLCAoaW50KSBkLT5lZGRfcGFyYW1zLmN5bGluZGVycyk7CisJCXByaW50ZigiICAgICAgICAgJWQgc2VjdG9ycywgJWQgYnl0ZXMvc2VjdG9yLCAlZCBzZWN0b3JzL3RyYWNrXG4iLAorCQkJKGludCkgZC0+ZWRkX3BhcmFtcy5zZWN0b3JzLCAoaW50KSBkLT5lZGRfcGFyYW1zLmJ5dGVzX3Blcl9zZWN0b3IsCisJCQkoaW50KSBkLT5lZGRfcGFyYW1zLnNlY3RvcnNfcGVyX3RyYWNrKTsKKwkJcHJpbnRmKCIgICAgICAgICBIb3N0IGJ1czogJXMsIEludGVyZmFjZSB0eXBlOiAlc1xuXG4iLAorCQkJZC0+ZWRkX3BhcmFtcy5ob3N0X2J1c190eXBlLCBkLT5lZGRfcGFyYW1zLmludGVyZmFjZV90eXBlKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL2RtaV91dGlscy5jIGIvY29tMzIvbW9kdWxlcy9kbWlfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2NiMjY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9kbWlfdXRpbHMuYwpAQCAtMCwwICsxLDcxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNiBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAiZG1pL2RtaS5oIgorCit2b2lkIGRpc3BsYXlfYmlvc19jaGFyYWN0ZXJpc3RpY3Moc19kbWkgKiBkbWkpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEJJT1NfQ0hBUl9OQl9FTEVNRU5UUzsgaSsrKSB7CisJaWYgKCgoYm9vbCAqKSAoJmRtaS0+Ymlvcy5jaGFyYWN0ZXJpc3RpY3MpKVtpXSA9PSB0cnVlKSB7CisJICAgIG1vcmVwcmludGYoIlx0XHQlc1xuIiwgYmlvc19jaGFyYWNfc3RyaW5nc1tpXSk7CisJfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgQklPU19DSEFSX1gxX05CX0VMRU1FTlRTOyBpKyspIHsKKwlpZiAoKChib29sICopICgmZG1pLT5iaW9zLmNoYXJhY3RlcmlzdGljc194MSkpW2ldID09IHRydWUpIHsKKwkgICAgbW9yZXByaW50ZigiXHRcdCVzXG4iLCBiaW9zX2NoYXJhY194MV9zdHJpbmdzW2ldKTsKKwl9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEJJT1NfQ0hBUl9YMl9OQl9FTEVNRU5UUzsgaSsrKSB7CisJaWYgKCgoYm9vbCAqKSAoJmRtaS0+Ymlvcy5jaGFyYWN0ZXJpc3RpY3NfeDIpKVtpXSA9PSB0cnVlKSB7CisJICAgIG1vcmVwcmludGYoIlx0XHQlc1xuIiwgYmlvc19jaGFyYWNfeDJfc3RyaW5nc1tpXSk7CisJfQorICAgIH0KK30KKwordm9pZCBkaXNwbGF5X2Jhc2VfYm9hcmRfZmVhdHVyZXMoc19kbWkgKiBkbWkpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEJBU0VfQk9BUkRfTkJfRUxFTUVOVFM7IGkrKykgeworCWlmICgoKGJvb2wgKikgKCZkbWktPmJhc2VfYm9hcmQuZmVhdHVyZXMpKVtpXSA9PSB0cnVlKSB7CisJICAgIG1vcmVwcmludGYoIlx0XHQlc1xuIiwgYmFzZV9ib2FyZF9mZWF0dXJlc19zdHJpbmdzW2ldKTsKKwl9CisgICAgfQorfQorCit2b2lkIGRpc3BsYXlfcHJvY2Vzc29yX2ZsYWdzKHNfZG1pICogZG1pKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBQUk9DRVNTT1JfRkxBR1NfRUxFTUVOVFM7IGkrKykgeworCWlmICgoKGJvb2wgKikgKCZkbWktPnByb2Nlc3Nvci5jcHVfZmxhZ3MpKVtpXSA9PSB0cnVlKSB7CisJICAgIG1vcmVwcmludGYoIlx0XHQlc1xuIiwgY3B1X2ZsYWdzX3N0cmluZ3NbaV0pOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL2RtaXRlc3QuYyBiL2NvbTMyL21vZHVsZXMvZG1pdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTJlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL2RtaXRlc3QuYwpAQCAtMCwwICsxLDIyOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisgKiBkbWl0ZXN0LmMKKyAqCisgKiBETUkgZGVtbyBwcm9ncmFtIHVzaW5nIGxpYmNvbTMyCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgImRtaS9kbWkuaCIKKworY2hhciBkaXNwbGF5X2xpbmU7CisKK3ZvaWQgZGlzcGxheV9tZW1vcnkoc19kbWkgKiBkbWkpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGRtaS0+bWVtb3J5X2NvdW50OyBpKyspIHsKKwltb3JlcHJpbnRmKCJNZW1vcnkgQmFuayAlZFxuIiwgaSk7CisJbW9yZXByaW50ZigiXHRGb3JtIEZhY3RvciAgOiAlc1xuIiwgZG1pLT5tZW1vcnlbaV0uZm9ybV9mYWN0b3IpOworCW1vcmVwcmludGYoIlx0VHlwZSAgICAgICAgIDogJXNcbiIsIGRtaS0+bWVtb3J5W2ldLnR5cGUpOworCW1vcmVwcmludGYoIlx0VHlwZSBEZXRhaWwgIDogJXNcbiIsIGRtaS0+bWVtb3J5W2ldLnR5cGVfZGV0YWlsKTsKKwltb3JlcHJpbnRmKCJcdFNwZWVkICAgICAgICA6ICVzXG4iLCBkbWktPm1lbW9yeVtpXS5zcGVlZCk7CisJbW9yZXByaW50ZigiXHRTaXplICAgICAgICAgOiAlc1xuIiwgZG1pLT5tZW1vcnlbaV0uc2l6ZSk7CisJbW9yZXByaW50ZigiXHREZXZpY2UgU2V0ICAgOiAlc1xuIiwgZG1pLT5tZW1vcnlbaV0uZGV2aWNlX3NldCk7CisJbW9yZXByaW50ZigiXHREZXZpY2UgTG9jLiAgOiAlc1xuIiwgZG1pLT5tZW1vcnlbaV0uZGV2aWNlX2xvY2F0b3IpOworCW1vcmVwcmludGYoIlx0QmFuayBMb2NhdG9yIDogJXNcbiIsIGRtaS0+bWVtb3J5W2ldLmJhbmtfbG9jYXRvcik7CisJbW9yZXByaW50ZigiXHRUb3RhbCBXaWR0aCAgOiAlc1xuIiwgZG1pLT5tZW1vcnlbaV0udG90YWxfd2lkdGgpOworCW1vcmVwcmludGYoIlx0RGF0YSBXaWR0aCAgIDogJXNcbiIsIGRtaS0+bWVtb3J5W2ldLmRhdGFfd2lkdGgpOworCW1vcmVwcmludGYoIlx0RXJyb3IgICAgICAgIDogJXNcbiIsIGRtaS0+bWVtb3J5W2ldLmVycm9yKTsKKwltb3JlcHJpbnRmKCJcdFZlbmRvciAgICAgICA6ICVzXG4iLCBkbWktPm1lbW9yeVtpXS5tYW51ZmFjdHVyZXIpOworCW1vcmVwcmludGYoIlx0U2VyaWFsICAgICAgIDogJXNcbiIsIGRtaS0+bWVtb3J5W2ldLnNlcmlhbCk7CisJbW9yZXByaW50ZigiXHRBc3NldCBUYWcgICAgOiAlc1xuIiwgZG1pLT5tZW1vcnlbaV0uYXNzZXRfdGFnKTsKKwltb3JlcHJpbnRmKCJcdFBhcnQgTnVtYmVyICA6ICVzXG4iLCBkbWktPm1lbW9yeVtpXS5wYXJ0X251bWJlcik7CisgICAgfQorfQorCit2b2lkIGRpc3BsYXlfYmF0dGVyeShzX2RtaSAqIGRtaSkKK3sKKyAgICBtb3JlcHJpbnRmKCJCYXR0ZXJ5XG4iKTsKKyAgICBtb3JlcHJpbnRmKCJcdFZlbmRvciAgICAgICAgICAgICAgOiAlc1xuIiwgZG1pLT5iYXR0ZXJ5Lm1hbnVmYWN0dXJlcik7CisgICAgbW9yZXByaW50ZigiXHRNYW51ZmFjdHVyZSBEYXRlICAgIDogJXNcbiIsIGRtaS0+YmF0dGVyeS5tYW51ZmFjdHVyZV9kYXRlKTsKKyAgICBtb3JlcHJpbnRmKCJcdFNlcmlhbCAgICAgICAgICAgICAgOiAlc1xuIiwgZG1pLT5iYXR0ZXJ5LnNlcmlhbCk7CisgICAgbW9yZXByaW50ZigiXHROYW1lICAgICAgICAgICAgICAgIDogJXNcbiIsIGRtaS0+YmF0dGVyeS5uYW1lKTsKKyAgICBtb3JlcHJpbnRmKCJcdENoZW1pc3RyeSAgICAgICAgICAgOiAlc1xuIiwgZG1pLT5iYXR0ZXJ5LmNoZW1pc3RyeSk7CisgICAgbW9yZXByaW50ZigiXHREZXNpZ24gQ2FwYWNpdHkgICAgIDogJXNcbiIsIGRtaS0+YmF0dGVyeS5kZXNpZ25fY2FwYWNpdHkpOworICAgIG1vcmVwcmludGYoIlx0RGVzaWduIFZvbHRhZ2UgICAgICA6ICVzXG4iLCBkbWktPmJhdHRlcnkuZGVzaWduX3ZvbHRhZ2UpOworICAgIG1vcmVwcmludGYoIlx0U0JEUyAgICAgICAgICAgICAgICA6ICVzXG4iLCBkbWktPmJhdHRlcnkuc2Jkcyk7CisgICAgbW9yZXByaW50ZigiXHRTQkRTIE1hbnVmYWN0LiBEYXRlIDogJXNcbiIsCisJICAgICAgIGRtaS0+YmF0dGVyeS5zYmRzX21hbnVmYWN0dXJlX2RhdGUpOworICAgIG1vcmVwcmludGYoIlx0U0JEUyBDaGVtaXN0cnkgICAgICA6ICVzXG4iLCBkbWktPmJhdHRlcnkuc2Jkc19jaGVtaXN0cnkpOworICAgIG1vcmVwcmludGYoIlx0TWF4aW11bSBFcnJvciAgICAgICA6ICVzXG4iLCBkbWktPmJhdHRlcnkubWF4aW11bV9lcnJvcik7CisgICAgbW9yZXByaW50ZigiXHRPRU0gSW5mbyAgICAgICAgICAgIDogJXNcbiIsIGRtaS0+YmF0dGVyeS5vZW1faW5mbyk7Cit9CisKK3ZvaWQgZGlzcGxheV9iaW9zKHNfZG1pICogZG1pKQoreworICAgIG1vcmVwcmludGYoIkJJT1NcbiIpOworICAgIG1vcmVwcmludGYoIlx0VmVuZG9yOiAgICVzXG4iLCBkbWktPmJpb3MudmVuZG9yKTsKKyAgICBtb3JlcHJpbnRmKCJcdFZlcnNpb246ICAlc1xuIiwgZG1pLT5iaW9zLnZlcnNpb24pOworICAgIG1vcmVwcmludGYoIlx0UmVsZWFzZTogICVzXG4iLCBkbWktPmJpb3MucmVsZWFzZV9kYXRlKTsKKyAgICBtb3JlcHJpbnRmKCJcdEJpb3MgUmV2aXNpb24gICAgICVzXG4iLCBkbWktPmJpb3MuYmlvc19yZXZpc2lvbik7CisgICAgbW9yZXByaW50ZigiXHRGaXJtd2FyZSBSZXZpc2lvbiAlc1xuIiwgZG1pLT5iaW9zLmZpcm13YXJlX3JldmlzaW9uKTsKKyAgICBtb3JlcHJpbnRmKCJcdEFkZHJlc3M6ICAweCUwNFgwXG4iLCBkbWktPmJpb3MuYWRkcmVzcyk7CisgICAgbW9yZXByaW50ZigiXHRSdW50aW1lIGFkZHJlc3M6ICV1ICVzXG4iLCBkbWktPmJpb3MucnVudGltZV9zaXplLAorCSAgICAgICBkbWktPmJpb3MucnVudGltZV9zaXplX3VuaXQpOworICAgIG1vcmVwcmludGYoIlx0Um9tIHNpemU6ICV1ICVzXG4iLCBkbWktPmJpb3Mucm9tX3NpemUsCisJICAgICAgIGRtaS0+Ymlvcy5yb21fc2l6ZV91bml0KTsKKyAgICBkaXNwbGF5X2Jpb3NfY2hhcmFjdGVyaXN0aWNzKGRtaSk7Cit9CisKK3ZvaWQgZGlzcGxheV9zeXN0ZW0oc19kbWkgKiBkbWkpCit7CisgICAgbW9yZXByaW50ZigiXG5TeXN0ZW1cbiIpOworICAgIG1vcmVwcmludGYoIlx0TWFudWZhY3R1cmVyICVzXG4iLCBkbWktPnN5c3RlbS5tYW51ZmFjdHVyZXIpOworICAgIG1vcmVwcmludGYoIlx0UHJvZHVjdCBOYW1lICVzXG4iLCBkbWktPnN5c3RlbS5wcm9kdWN0X25hbWUpOworICAgIG1vcmVwcmludGYoIlx0VmVyc2lvbiAgICAgICVzXG4iLCBkbWktPnN5c3RlbS52ZXJzaW9uKTsKKyAgICBtb3JlcHJpbnRmKCJcdFNlcmlhbCAgICAgICAlc1xuIiwgZG1pLT5zeXN0ZW0uc2VyaWFsKTsKKyAgICBtb3JlcHJpbnRmKCJcdFVVSUQgICAgICAgICAlc1xuIiwgZG1pLT5zeXN0ZW0udXVpZCk7CisgICAgbW9yZXByaW50ZigiXHRXYWtldXAgVHlwZSAgJXNcbiIsIGRtaS0+c3lzdGVtLndha2V1cF90eXBlKTsKKyAgICBtb3JlcHJpbnRmKCJcdFNLVSBOdW1iZXIgICAlc1xuIiwgZG1pLT5zeXN0ZW0uc2t1X251bWJlcik7CisgICAgbW9yZXByaW50ZigiXHRGYW1pbHkgICAgICAgJXNcbiIsIGRtaS0+c3lzdGVtLmZhbWlseSk7Cit9CisKK3ZvaWQgZGlzcGxheV9iYXNlX2JvYXJkKHNfZG1pICogZG1pKQoreworICAgIG1vcmVwcmludGYoIkJhc2UgYm9hcmRcbiIpOworICAgIG1vcmVwcmludGYoIlx0TWFudWZhY3R1cmVyICVzXG4iLCBkbWktPmJhc2VfYm9hcmQubWFudWZhY3R1cmVyKTsKKyAgICBtb3JlcHJpbnRmKCJcdFByb2R1Y3QgTmFtZSAlc1xuIiwgZG1pLT5iYXNlX2JvYXJkLnByb2R1Y3RfbmFtZSk7CisgICAgbW9yZXByaW50ZigiXHRWZXJzaW9uICAgICAgJXNcbiIsIGRtaS0+YmFzZV9ib2FyZC52ZXJzaW9uKTsKKyAgICBtb3JlcHJpbnRmKCJcdFNlcmlhbCAgICAgICAlc1xuIiwgZG1pLT5iYXNlX2JvYXJkLnNlcmlhbCk7CisgICAgbW9yZXByaW50ZigiXHRBc3NldCBUYWcgICAgJXNcbiIsIGRtaS0+YmFzZV9ib2FyZC5hc3NldF90YWcpOworICAgIG1vcmVwcmludGYoIlx0TG9jYXRpb24gICAgICVzXG4iLCBkbWktPmJhc2VfYm9hcmQubG9jYXRpb24pOworICAgIG1vcmVwcmludGYoIlx0VHlwZSAgICAgICAgICVzXG4iLCBkbWktPmJhc2VfYm9hcmQudHlwZSk7CisgICAgZGlzcGxheV9iYXNlX2JvYXJkX2ZlYXR1cmVzKGRtaSk7Cit9CisKK3ZvaWQgZGlzcGxheV9jaGFzc2lzKHNfZG1pICogZG1pKQoreworICAgIG1vcmVwcmludGYoIlxuQ2hhc3Npc1xuIik7CisgICAgbW9yZXByaW50ZigiXHRNYW51ZmFjdHVyZXIgJXNcbiIsIGRtaS0+Y2hhc3Npcy5tYW51ZmFjdHVyZXIpOworICAgIG1vcmVwcmludGYoIlx0VHlwZQkgICAlc1xuIiwgZG1pLT5jaGFzc2lzLnR5cGUpOworICAgIG1vcmVwcmludGYoIlx0TG9jawkgICAlc1xuIiwgZG1pLT5jaGFzc2lzLmxvY2spOworICAgIG1vcmVwcmludGYoIlx0VmVyc2lvbiAgICAgICVzXG4iLCBkbWktPmNoYXNzaXMudmVyc2lvbik7CisgICAgbW9yZXByaW50ZigiXHRTZXJpYWwgICAgICAgJXNcbiIsIGRtaS0+Y2hhc3Npcy5zZXJpYWwpOworICAgIG1vcmVwcmludGYoIlx0QXNzZXQgVGFnICAgICVzXG4iLCBkbWktPmNoYXNzaXMuYXNzZXRfdGFnKTsKKyAgICBtb3JlcHJpbnRmKCJcdEJvb3QgdXAgc3RhdGUgJXNcbiIsIGRtaS0+Y2hhc3Npcy5ib290X3VwX3N0YXRlKTsKKyAgICBtb3JlcHJpbnRmKCJcdFBvd2VyIHN1cHBseSBzdGF0ZSAlc1xuIiwgZG1pLT5jaGFzc2lzLnBvd2VyX3N1cHBseV9zdGF0ZSk7CisgICAgbW9yZXByaW50ZigiXHRUaGVybWFsIHN0YXRlICVzXG4iLCBkbWktPmNoYXNzaXMudGhlcm1hbF9zdGF0ZSk7CisgICAgbW9yZXByaW50ZigiXHRTZWN1cml0eSBTdGF0dXMgICAgJXNcbiIsIGRtaS0+Y2hhc3Npcy5zZWN1cml0eV9zdGF0dXMpOworICAgIG1vcmVwcmludGYoIlx0T0VNIEluZm9ybWF0aW9uICAgICVzXG4iLCBkbWktPmNoYXNzaXMub2VtX2luZm9ybWF0aW9uKTsKKyAgICBtb3JlcHJpbnRmKCJcdEhlaWdodCAgICAgICAldVxuIiwgZG1pLT5jaGFzc2lzLmhlaWdodCk7CisgICAgbW9yZXByaW50ZigiXHROQiBQb3dlciBDb3JkcyAgICAgJXVcbiIsIGRtaS0+Y2hhc3Npcy5uYl9wb3dlcl9jb3Jkcyk7Cit9CisKK3ZvaWQgZGlzcGxheV9jcHUoc19kbWkgKiBkbWkpCit7CisgICAgbW9yZXByaW50ZigiXG5DUFVcbiIpOworICAgIG1vcmVwcmludGYoIlx0U29ja2V0IERlc2lnbmF0aW9uICVzXG4iLCBkbWktPnByb2Nlc3Nvci5zb2NrZXRfZGVzaWduYXRpb24pOworICAgIG1vcmVwcmludGYoIlx0VHlwZSAgICAgICAgICVzXG4iLCBkbWktPnByb2Nlc3Nvci50eXBlKTsKKyAgICBtb3JlcHJpbnRmKCJcdEZhbWlseSAgICAgICAlc1xuIiwgZG1pLT5wcm9jZXNzb3IuZmFtaWx5KTsKKyAgICBtb3JlcHJpbnRmKCJcdE1hbnVmYWN0dXJlciAlc1xuIiwgZG1pLT5wcm9jZXNzb3IubWFudWZhY3R1cmVyKTsKKyAgICBtb3JlcHJpbnRmKCJcdFZlcnNpb24gICAgICAlc1xuIiwgZG1pLT5wcm9jZXNzb3IudmVyc2lvbik7CisgICAgbW9yZXByaW50ZigiXHRFeHRlcm5hbCBDbG9jayAgICAldVxuIiwgZG1pLT5wcm9jZXNzb3IuZXh0ZXJuYWxfY2xvY2spOworICAgIG1vcmVwcmludGYoIlx0TWF4IFNwZWVkICAgICAgICAgJXVcbiIsIGRtaS0+cHJvY2Vzc29yLm1heF9zcGVlZCk7CisgICAgbW9yZXByaW50ZigiXHRDdXJyZW50IFNwZWVkICAgICAldVxuIiwgZG1pLT5wcm9jZXNzb3IuY3VycmVudF9zcGVlZCk7CisgICAgbW9yZXByaW50ZigiXHRDcHUgVHlwZSAgICAgJXVcbiIsIGRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS50eXBlKTsKKyAgICBtb3JlcHJpbnRmKCJcdENwdSBGYW1pbHkgICAldVxuIiwgZG1pLT5wcm9jZXNzb3Iuc2lnbmF0dXJlLmZhbWlseSk7CisgICAgbW9yZXByaW50ZigiXHRDcHUgTW9kZWwgICAgJXVcbiIsIGRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS5tb2RlbCk7CisgICAgbW9yZXByaW50ZigiXHRDcHUgU3RlcHBpbmcgJXVcbiIsIGRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS5zdGVwcGluZyk7CisgICAgbW9yZXByaW50ZigiXHRDcHUgTWlub3IgU3RlcHBpbmcgJXVcbiIsCisJICAgICAgIGRtaS0+cHJvY2Vzc29yLnNpZ25hdHVyZS5taW5vcl9zdGVwcGluZyk7CisgICAgbW9yZXByaW50ZigiXHRWb2x0YWdlICAgICAgJWQgbVZcbiIsIGRtaS0+cHJvY2Vzc29yLnZvbHRhZ2VfbXYpOworICAgIG1vcmVwcmludGYoIlx0U3RhdHVzICAgICAgICVzXG4iLCBkbWktPnByb2Nlc3Nvci5zdGF0dXMpOworICAgIG1vcmVwcmludGYoIlx0VXBncmFkZSAgICAgICVzXG4iLCBkbWktPnByb2Nlc3Nvci51cGdyYWRlKTsKKyAgICBtb3JlcHJpbnRmKCJcdENhY2hlIEwxIEhhbmRsZSAlc1xuIiwgZG1pLT5wcm9jZXNzb3IuY2FjaGUxKTsKKyAgICBtb3JlcHJpbnRmKCJcdENhY2hlIEwyIEhhbmRsZSAlc1xuIiwgZG1pLT5wcm9jZXNzb3IuY2FjaGUyKTsKKyAgICBtb3JlcHJpbnRmKCJcdENhY2hlIEwzIEhhbmRsZSAlc1xuIiwgZG1pLT5wcm9jZXNzb3IuY2FjaGUzKTsKKyAgICBtb3JlcHJpbnRmKCJcdFNlcmlhbCAgICAgICAlc1xuIiwgZG1pLT5wcm9jZXNzb3Iuc2VyaWFsKTsKKyAgICBtb3JlcHJpbnRmKCJcdFBhcnQgTnVtYmVyICAlc1xuIiwgZG1pLT5wcm9jZXNzb3IucGFydF9udW1iZXIpOworICAgIGlmIChkbWktPnByb2Nlc3Nvci5jb3JlX2NvdW50ICE9IDApCisgICAgICAgIG1vcmVwcmludGYoIlx0Q29yZXMgQ291bnQgICAlZFxuIiwgZG1pLT5wcm9jZXNzb3IuY29yZV9jb3VudCk7CisgICAgaWYgKGRtaS0+cHJvY2Vzc29yLmNvcmVfZW5hYmxlZCAhPSAwKQorICAgICAgICBtb3JlcHJpbnRmKCJcdENvcmVzIEVuYWJsZWQgJWRcbiIsIGRtaS0+cHJvY2Vzc29yLmNvcmVfZW5hYmxlZCk7CisgICAgaWYgKGRtaS0+cHJvY2Vzc29yLnRocmVhZF9jb3VudCAhPSAwKQorICAgICAgICBtb3JlcHJpbnRmKCJcdFRocmVhZHMgQ291bnQgJWRcbiIsIGRtaS0+cHJvY2Vzc29yLnRocmVhZF9jb3VudCk7CisgICAgbW9yZXByaW50ZigiXHRJRCAgICAgICAgICAgJXNcbiIsIGRtaS0+cHJvY2Vzc29yLmlkKTsKKyAgICBkaXNwbGF5X3Byb2Nlc3Nvcl9mbGFncyhkbWkpOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgIHNfZG1pIGRtaTsKKworICAgIGlmIChkbWlfaXRlcmF0ZSgmZG1pKSA9PSAtRU5PRE1JVEFCTEUpIHsKKwlwcmludGYoIk5vIERNSSBTdHJ1Y3R1cmUgZm91bmRcbiIpOworCXJldHVybiAtMTsKKyAgICB9IGVsc2UgeworCXByaW50ZigiRE1JICV1LiV1IHByZXNlbnQuXG4iLCBkbWkuZG1pdGFibGUubWFqb3JfdmVyc2lvbiwKKwkgICAgICAgZG1pLmRtaXRhYmxlLm1pbm9yX3ZlcnNpb24pOworCXByaW50ZigiJWQgc3RydWN0dXJlcyBvY2N1cHlpbmcgJWQgYnl0ZXMuXG4iLCBkbWkuZG1pdGFibGUubnVtLAorCSAgICAgICBkbWkuZG1pdGFibGUubGVuKTsKKwlwcmludGYoIkRNSSB0YWJsZSBhdCAweCUwOFguXG4iLCBkbWkuZG1pdGFibGUuYmFzZSk7CisgICAgfQorCisgICAgcGFyc2VfZG1pdGFibGUoJmRtaSk7CisKKyAgICBmb3IgKDs7KSB7CisJcHJpbnRmCisJICAgICgiQXZhaWxhYmxlIGNvbW1hbmRzIGFyZSBzeXN0ZW0sIGNoYXNzaXMsIGJhc2VfYm9hcmQsIGNwdSwgYmlvcywgbWVtb3J5LCBiYXR0ZXJ5LCBhbGwsIGV4aXRcbiIpOworCXByaW50ZigiZG1pOiAiKTsKKwlmZ2V0cyhidWZmZXIsIHNpemVvZiBidWZmZXIsIHN0ZGluKTsKKwlpZiAoIXN0cm5jbXAoYnVmZmVyLCAiZXhpdCIsIDQpKQorCSAgICBicmVhazsKKwlpZiAoIXN0cm5jbXAoYnVmZmVyLCAic3lzdGVtIiwgNikpCisJICAgIGRpc3BsYXlfc3lzdGVtKCZkbWkpOworCWlmICghc3RybmNtcChidWZmZXIsICJjaGFzc2lzIiwgNikpCisJICAgIGRpc3BsYXlfY2hhc3NpcygmZG1pKTsKKwlpZiAoIXN0cm5jbXAoYnVmZmVyLCAiYmFzZV9ib2FyZCIsIDEwKSkKKwkgICAgZGlzcGxheV9iYXNlX2JvYXJkKCZkbWkpOworCWlmICghc3RybmNtcChidWZmZXIsICJjcHUiLCAzKSkKKwkgICAgZGlzcGxheV9jcHUoJmRtaSk7CisJaWYgKCFzdHJuY21wKGJ1ZmZlciwgImJpb3MiLCA0KSkKKwkgICAgZGlzcGxheV9iaW9zKCZkbWkpOworCWlmICghc3RybmNtcChidWZmZXIsICJtZW1vcnkiLCA2KSkKKwkgICAgZGlzcGxheV9tZW1vcnkoJmRtaSk7CisJaWYgKCFzdHJuY21wKGJ1ZmZlciwgImJhdHRlcnkiLCA3KSkKKwkgICAgZGlzcGxheV9iYXR0ZXJ5KCZkbWkpOworCWlmICghc3RybmNtcChidWZmZXIsICJhbGwiLCAzKSkgeworCSAgICBkaXNwbGF5X2Jpb3MoJmRtaSk7CisJICAgIGRpc3BsYXlfc3lzdGVtKCZkbWkpOworCSAgICBkaXNwbGF5X2NoYXNzaXMoJmRtaSk7CisJICAgIGRpc3BsYXlfYmFzZV9ib2FyZCgmZG1pKTsKKwkgICAgZGlzcGxheV9jcHUoJmRtaSk7CisJICAgIGRpc3BsYXlfbWVtb3J5KCZkbWkpOworCSAgICBkaXNwbGF5X2JhdHRlcnkoJmRtaSk7CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9lbGYuYyBiL2NvbTMyL21vZHVsZXMvZWxmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0NmFmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvZWxmLmMKQEAgLTAsMCArMSwyNzkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBlbGYuYworICoKKyAqIE1vZHVsZSB0byBsb2FkIGEgcHJvdGVjdGVkLW1vZGUgRUxGIGtlcm5lbAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKworI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbW92ZWJpdHMuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9ib290cG0uaD4KKworLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIG11Y2ggbWVtb3J5IGZvciB0aGUgc3RhY2ssIHNpZ25hbCBmYWlsdXJlICovCisjZGVmaW5lIE1JTl9TVEFDSwk1MTIKKworc3RhdGljIGlubGluZSB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBmcHV0cyhtc2csIHN0ZGVycik7Cit9CisKK2ludCBib290X2VsZih2b2lkICpwdHIsIHNpemVfdCBsZW4sIGNoYXIgKiphcmd2KQoreworICAgIGNoYXIgKmNwdHIgPSBwdHI7CisgICAgRWxmMzJfRWhkciAqZWggPSBwdHI7CisgICAgRWxmMzJfUGhkciAqcGg7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICptbCA9IE5VTEw7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbW1hcCA9IE5VTEwsICphbWFwID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfcG1fcmVncyByZWdzOworICAgIGludCBhcmdjOworICAgIGFkZHJfdCBhcmdzaXplOworICAgIGNoYXIgKiphcmdwOworICAgIGFkZHJfdCBsc3RhcnQsIGxsZW47CisgICAgY2hhciAqc3RhY2tfZnJhbWUgPSBOVUxMOworICAgIGFkZHJfdCBzdGFja19mcmFtZV9zaXplOworICAgIGFkZHJfdCBzdGFja19wb2ludGVyOworICAgIHVpbnQzMl90ICpzcHA7CisgICAgY2hhciAqc2ZwOworICAgIGFkZHJfdCBzZmE7CisKKyAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZiByZWdzKTsKKworICAgIC8qCisgICAgICogTm90ZTogbW1hcCBpcyB0aGUgbWVtb3J5IG1hcCAoY29udGFpbmluZyBmcmVlIGFuZCB6ZXJvZWQgcmVnaW9ucykKKyAgICAgKiBuZWVkZWQgYnkgc3lzbGludXhfc2h1ZmZsZV9ib290X3BtKCk7IGFtYXAgaXMgYSBtYXAgd2hlcmUgd2Uga2VlcAorICAgICAqIHRyYWNrIG91cnNlbHZlcyB3aGljaCB0YXJnZXQgbWVtb3J5IHJhbmdlcyBoYXZlIGFscmVhZHkgYmVlbgorICAgICAqIGFsbG9jYXRlZC4KKyAgICAgKi8KKworICAgIGlmIChsZW4gPCBzaXplb2YoRWxmMzJfRWhkcikpCisJZ290byBiYWlsOworCisgICAgLyogTXVzdCBiZSBFTEYsIDMyLWJpdCwgbGl0dGxlZW5kaWFuLCB2ZXJzaW9uIDEgKi8KKyAgICBpZiAobWVtY21wKGVoLT5lX2lkZW50LCAiXHg3ZiIgIkVMRlwxXDFcMSIsIDYpKQorCWdvdG8gYmFpbDsKKworICAgIC8qIElzIHRoaXMgYSB3b3J0aHdoaWxlIHRlc3Q/ICBJbiBwYXJ0aWN1bGFyIHg4Ni02NCBub3JtYWxseQorICAgICAgIHdvdWxkIGltcGx5IEVMRjY0IHN1cHBvcnQsIHdoaWNoIHdlIGNvdWxkIGRvIGFzIGxvbmcgYXMKKyAgICAgICB0aGUgYWRkcmVzc2VzIGFyZSAzMi1iaXQgYWRkcmVzc2VzLCBhbmQgZW50cnkgaXMgMzIgYml0cy4KKyAgICAgICA2NC1iaXQgYWRkcmVzc2VzIHdvdWxkIHRha2UgYSBsb3QgbW9yZSB3b3JrLiAqLworICAgIGlmIChlaC0+ZV9tYWNoaW5lICE9IEVNXzM4NiAmJiBlaC0+ZV9tYWNoaW5lICE9IEVNXzQ4NiAmJgorCWVoLT5lX21hY2hpbmUgIT0gRU1fWDg2XzY0KQorCWdvdG8gYmFpbDsKKworICAgIGlmIChlaC0+ZV92ZXJzaW9uICE9IEVWX0NVUlJFTlQpCisJZ290byBiYWlsOworCisgICAgaWYgKGVoLT5lX2Voc2l6ZSA8IHNpemVvZihFbGYzMl9FaGRyKSB8fCBlaC0+ZV9laHNpemUgPj0gbGVuKQorCWdvdG8gYmFpbDsKKworICAgIGlmIChlaC0+ZV9waGVudHNpemUgPCBzaXplb2YoRWxmMzJfUGhkcikpCisJZ290byBiYWlsOworCisgICAgaWYgKCFlaC0+ZV9waG51bSkKKwlnb3RvIGJhaWw7CisKKyAgICBpZiAoZWgtPmVfcGhvZmYgKyBlaC0+ZV9waGVudHNpemUgKiBlaC0+ZV9waG51bSA+IGxlbikKKwlnb3RvIGJhaWw7CisKKyAgICBtbWFwID0gc3lzbGludXhfbWVtb3J5X21hcCgpOworICAgIGFtYXAgPSBzeXNsaW51eF9kdXBfbWVtbWFwKG1tYXApOworICAgIGlmICghbW1hcCB8fCAhYW1hcCkKKwlnb3RvIGJhaWw7CisKKyAgICBkcHJpbnRmKCJJbml0aWFsIG1lbW9yeSBtYXA6XG4iKTsKKyAgICBzeXNsaW51eF9kdW1wX21lbW1hcChtbWFwKTsKKworICAgIHBoID0gKEVsZjMyX1BoZHIgKikgKGNwdHIgKyBlaC0+ZV9waG9mZik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZWgtPmVfcGhudW07IGkrKykgeworCWlmIChwaC0+cF90eXBlID09IFBUX0xPQUQgfHwgcGgtPnBfdHlwZSA9PSBQVF9QSERSKSB7CisJICAgIC8qIFRoaXMgbG9hZHMgYXQgcF9wYWRkciwgd2hpY2ggaXMgYXJndWFibHkgdGhlIGNvcnJlY3Qgc2VtYW50aWNzLgorCSAgICAgICBUaGUgU3lzViBzcGVjIHNheXMgdGhhdCBTeXNWIGxvYWRzIGF0IHBfdmFkZHIgKGFuZCB0aHVzIExpbnV4IGRvZXMsCisJICAgICAgIHRvbyk7IHRoYXQgaXMsIGhvd2V2ZXIsIGEgbWFqb3IgYnJhaW5mdWNrYWdlIGluIHRoZSBzcGVjLiAqLworCSAgICBhZGRyX3QgYWRkciA9IHBoLT5wX3BhZGRyOworCSAgICBhZGRyX3QgbXNpemUgPSBwaC0+cF9tZW1zejsKKwkgICAgYWRkcl90IGRzaXplID0gbWluKG1zaXplLCBwaC0+cF9maWxlc3opOworCisJICAgIGRwcmludGYoIlNlZ21lbnQgYXQgMHglMDh4IGRhdGEgMHglMDh4IGxlbiAweCUwOHhcbiIsCisJCSAgICBhZGRyLCBkc2l6ZSwgbXNpemUpOworCisJICAgIGlmIChzeXNsaW51eF9tZW1tYXBfdHlwZShhbWFwLCBhZGRyLCBtc2l6ZSkgIT0gU01UX0ZSRUUpIHsKKwkJcHJpbnRmKCJNZW1vcnkgc2VnbWVudCBhdCAweCUwOHggKGxlbiAweCUwOHgpIGlzIHVuYXZhaWxhYmxlXG4iLAorCQkgICAgICAgYWRkciwgbXNpemUpOworCQlnb3RvIGJhaWw7CS8qIE1lbW9yeSByZWdpb24gdW5hdmFpbGFibGUgKi8KKwkgICAgfQorCisJICAgIC8qIE1hcmsgdGhpcyByZWdpb24gYXMgYWxsb2NhdGVkIGluIHRoZSBhdmFpbGFibGUgbWFwICovCisJICAgIGlmIChzeXNsaW51eF9hZGRfbWVtbWFwKCZhbWFwLCBhZGRyLCBkc2l6ZSwgU01UX0FMTE9DKSkKKwkJZ290byBiYWlsOworCisJICAgIGlmIChwaC0+cF9maWxlc3opIHsKKwkJLyogRGF0YSBwcmVzZW50IHJlZ2lvbi4gIENyZWF0ZSBhIG1vdmUgZW50cnkgZm9yIGl0LiAqLworCQlpZiAoc3lzbGludXhfYWRkX21vdmVsaXN0CisJCSAgICAoJm1sLCBhZGRyLCAoYWRkcl90KSBjcHRyICsgcGgtPnBfb2Zmc2V0LCBkc2l6ZSkpCisJCSAgICBnb3RvIGJhaWw7CisJICAgIH0KKwkgICAgaWYgKG1zaXplID4gZHNpemUpIHsKKwkJLyogWmVyby1maWxsZWQgcmVnaW9uLiAgTWFyayBhcyBhIHplcm8gcmVnaW9uIGluIHRoZSBtZW1vcnkgbWFwLiAqLworCQlpZiAoc3lzbGludXhfYWRkX21lbW1hcAorCQkgICAgKCZtbWFwLCBhZGRyICsgZHNpemUsIG1zaXplIC0gZHNpemUsIFNNVF9aRVJPKSkKKwkJICAgIGdvdG8gYmFpbDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIC8qIElnbm9yZSB0aGlzIHByb2dyYW0gaGVhZGVyICovCisJfQorCisJcGggPSAoRWxmMzJfUGhkciAqKSAoKGNoYXIgKilwaCArIGVoLT5lX3BoZW50c2l6ZSk7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRoZSBpbnZvY2F0aW9uIHJlY29yZCAoaW5pdGlhbCBzdGFjayBmcmFtZSkgKi8KKworICAgIGFyZ3NpemUgPSBhcmdjID0gMDsKKyAgICBmb3IgKGFyZ3AgPSBhcmd2OyAqYXJncDsgYXJncCsrKSB7CisJZHByaW50ZigiYXJndlslMmRdID0gXCIlc1wiXG4iLCBhcmdjLCAqYXJncCk7CisJYXJnYysrOworCWFyZ3NpemUgKz0gc3RybGVuKCphcmdwKSArIDE7CisgICAgfQorCisgICAgLyogV2UgbmVlZCB0aGUgYXJndW1lbnQgc3RyaW5ncywgYXJndW1lbnQgcG9pbnRlcnMsCisgICAgICAgYXJnYywgcGx1cyBmb3VyIHplcm8td29yZCB0ZXJtaW5hdG9ycy4gKi8KKyAgICBzdGFja19mcmFtZV9zaXplID0gYXJnc2l6ZSArIGFyZ2MgKiBzaXplb2YoY2hhciAqKSArIDUgKiBzaXplb2YobG9uZyk7CisgICAgc3RhY2tfZnJhbWVfc2l6ZSA9IChzdGFja19mcmFtZV9zaXplICsgMTUpICYgfjE1OworICAgIHN0YWNrX2ZyYW1lID0gY2FsbG9jKHN0YWNrX2ZyYW1lX3NpemUsIDEpOworICAgIGlmICghc3RhY2tfZnJhbWUpCisJZ290byBiYWlsOworCisgICAgZHByaW50ZigiUmlnaHQgYmVmb3JlIHN5c2xpbnV4X21lbW1hcF9sYXJnZXN0KCkuLi5cbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbWVtbWFwKGFtYXApOworCisgICAgaWYgKHN5c2xpbnV4X21lbW1hcF9sYXJnZXN0KGFtYXAsIFNNVF9GUkVFLCAmbHN0YXJ0LCAmbGxlbikpCisJZ290byBiYWlsOwkJLyogTk8gZnJlZSBtZW1vcnk/ISAqLworCisgICAgaWYgKGxsZW4gPCBzdGFja19mcmFtZV9zaXplICsgTUlOX1NUQUNLICsgMTYpCisJZ290byBiYWlsOwkJLyogSW5zdWZmaWNpZW50IG1lbW9yeSAgKi8KKworICAgIC8qIEluaXRpYWwgc3RhY2sgcG9pbnRlciBhZGRyZXNzICovCisgICAgc3RhY2tfcG9pbnRlciA9IChsc3RhcnQgKyBsbGVuIC0gc3RhY2tfZnJhbWVfc2l6ZSkgJiB+MTU7CisKKyAgICBkcHJpbnRmKCJTdGFjayBmcmFtZSBhdCAweCUwOHggbGVuIDB4JTA4eFxuIiwKKwkgICAgc3RhY2tfcG9pbnRlciwgc3RhY2tfZnJhbWVfc2l6ZSk7CisKKyAgICAvKiBDcmVhdGUgdGhlIHN0YWNrIGZyYW1lLiAgc2ZwIGlzIHRoZSBwb2ludGVyIGluIGN1cnJlbnQgbWVtb3J5IGZvcgorICAgICAgIHRoZSBuZXh0IGFyZ3VtZW50IHN0cmluZywgc2ZhIGlzIHRoZSBhZGRyZXNzIGluIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlLgorICAgICAgIHNwcCBpcyB0aGUgcG9pbnRlciBpbnRvIHRoZSBhcmd1bWVudCBhcnJheSBpbiBjdXJyZW50IG1lbW9yeS4gKi8KKyAgICBzcHAgPSAodWludDMyX3QgKikgc3RhY2tfZnJhbWU7CisgICAgc2ZwID0gc3RhY2tfZnJhbWUgKyBhcmdjICogc2l6ZW9mKGNoYXIgKikgKyA1ICogc2l6ZW9mKGxvbmcpOworICAgIHNmYSA9IHN0YWNrX3BvaW50ZXIgKyBhcmdjICogc2l6ZW9mKGNoYXIgKikgKyA1ICogc2l6ZW9mKGxvbmcpOworCisgICAgKnNwcCsrID0gYXJnYzsKKyAgICBmb3IgKGFyZ3AgPSBhcmd2OyAqYXJncDsgYXJncCsrKSB7CisJaW50IGJ5dGVzID0gc3RybGVuKCphcmdwKSArIDE7CS8qIEluY2x1ZGluZyBmaW5hbCBudWxsICovCisJKnNwcCsrID0gc2ZhOworCW1lbWNweShzZnAsICphcmdwLCBieXRlcyk7CisJc2ZwICs9IGJ5dGVzOworCXNmYSArPSBieXRlczsKKyAgICB9CisgICAgLyogWmVybyBmaWVsZHMgYXJlIGFyZWFkeSB0YWtlbiBjYXJlIG9mIGJ5IGNhbGxvYygpICovCisKKyAgICAvKiAuLi4gYW5kIHdlJ2xsIHdhbnQgdG8gbW92ZSBpdCBpbnRvIHRoZSByaWdodCBwbGFjZS4uLiAqLworI2lmIERFQlVHCisgICAgaWYgKHN5c2xpbnV4X21lbW1hcF90eXBlKGFtYXAsIHN0YWNrX3BvaW50ZXIsIHN0YWNrX2ZyYW1lX3NpemUpCisJIT0gU01UX0ZSRUUpIHsKKwlkcHJpbnRmKCJTdGFjayBmcmFtZSBhcmVhIG5vdCBmcmVlIChob3cgZGlkIHRoYXQgaGFwcGVuPykhXG4iKTsKKwlnb3RvIGJhaWw7CQkvKiBNZW1vcnkgcmVnaW9uIHVuYXZhaWxhYmxlICovCisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoc3lzbGludXhfYWRkX21lbW1hcCgmYW1hcCwgc3RhY2tfcG9pbnRlciwgc3RhY2tfZnJhbWVfc2l6ZSwgU01UX0FMTE9DKSkKKwlnb3RvIGJhaWw7CisKKyAgICBpZiAoc3lzbGludXhfYWRkX21vdmVsaXN0KCZtbCwgc3RhY2tfcG9pbnRlciwgKGFkZHJfdCkgc3RhY2tfZnJhbWUsCisJCQkgICAgICBzdGFja19mcmFtZV9zaXplKSkKKwlnb3RvIGJhaWw7CisKKyAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZiByZWdzKTsKKyAgICByZWdzLmVpcCA9IGVoLT5lX2VudHJ5OworICAgIHJlZ3MuZXNwID0gc3RhY2tfcG9pbnRlcjsKKworICAgIGRwcmludGYoIkZpbmFsIG1lbW9yeSBtYXA6XG4iKTsKKyAgICBzeXNsaW51eF9kdW1wX21lbW1hcChtbWFwKTsKKworICAgIGRwcmludGYoIkZpbmFsIGF2YWlsYWJsZSBtYXA6XG4iKTsKKyAgICBzeXNsaW51eF9kdW1wX21lbW1hcChhbWFwKTsKKworICAgIGRwcmludGYoIk1vdmVsaXN0OlxuIik7CisgICAgc3lzbGludXhfZHVtcF9tb3ZlbGlzdChtbCk7CisKKyAgICAvKiBUaGlzIHNob3VsZCBub3QgcmV0dXJuLi4uICovCisgICAgZnB1dHMoIkJvb3RpbmcuLi5cbiIsIHN0ZG91dCk7CisgICAgc3lzbGludXhfc2h1ZmZsZV9ib290X3BtKG1sLCBtbWFwLCAwLCAmcmVncyk7CisKK2JhaWw6CisgICAgaWYgKHN0YWNrX2ZyYW1lKQorCWZyZWUoc3RhY2tfZnJhbWUpOworICAgIHN5c2xpbnV4X2ZyZWVfbWVtbWFwKGFtYXApOworICAgIHN5c2xpbnV4X2ZyZWVfbWVtbWFwKG1tYXApOworICAgIHN5c2xpbnV4X2ZyZWVfbW92ZWxpc3QobWwpOworCisgICAgcmV0dXJuIC0xOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IGRhdGFfbGVuOworCisgICAgaWYgKGFyZ2MgPCAyKSB7CisJZXJyb3IoIlVzYWdlOiBlbGYuYzMyIGVsZl9maWxlIGFyZ3VtZW50cy4uLlxuIik7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKHpsb2FkZmlsZShhcmd2WzFdLCAmZGF0YSwgJmRhdGFfbGVuKSkgeworCWVycm9yKCJVbmFibGUgdG8gbG9hZCBmaWxlXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBib290X2VsZihkYXRhLCBkYXRhX2xlbiwgJmFyZ3ZbMV0pOworICAgIGVycm9yKCJJbnZhbGlkIEVMRiBmaWxlIG9yIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9ldGhlcnNlbC5jIGIvY29tMzIvbW9kdWxlcy9ldGhlcnNlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOWRlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL2V0aGVyc2VsLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA1LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGV0aGVyc2VsLmMKKyAqCisgKiBTZWFyY2ggZm9yIGFuIEV0aGVybmV0IGNhcmQgd2l0aCBhIGtub3duIFBDSSBzaWduYXR1cmUsIGFuZCBydW4KKyAqIHRoZSBjb3JyZXNwb25kaW5nIEV0aGVybmV0IG1vZHVsZS4KKyAqCisgKiBUbyB1c2UgdGhpcywgc2V0IHVwIGEgc3lzbGludXggY29uZmlnIGZpbGUgbGlrZSB0aGlzOgorICoKKyAqIFBST01QVCAwCisgKiBERUZBVUxUIGV0aGVyc2VsLmMzMgorICogIyBERVYgW0RJRCB4eHh4Onl5eXlbL21hc2tdXSBbUklEIHp6LXp6XSBbU0lEIHV1dXU6dnZ2dlsvbWFza11dIGNvbW1hbmRsaW5lCisgKiAjIC4uLgorICoKKyAqIERJRCA9IFBDSSBkZXZpY2UgSUQKKyAqIFJJRCA9IFJldmlzaW9uIElEIChyYW5nZSkKKyAqIFNJRCA9IFN1YnN5c3RlbSBJRAorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3lzL3BjaS5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKworI2RlZmluZSBNQVhfTElORSA1MTIKKworLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBhdCBhIGNlcnRhaW4ga2V5d29yZCAoY2FzZSBpbnNlbnNpdGl2ZSkgKi8KK3N0YXRpYyBpbnQgbG9va2luZ19hdChjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICprd2QpCit7CisgICAgY29uc3QgY2hhciAqcCA9IGxpbmU7CisgICAgY29uc3QgY2hhciAqcSA9IGt3ZDsKKworICAgIHdoaWxlICgqcCAmJiAqcSAmJiAoKCpwIF4gKnEpICYgfjB4MjApID09IDApIHsKKwlwKys7CisJcSsrOworICAgIH0KKworICAgIGlmICgqcSkKKwlyZXR1cm4gMDsJCS8qIERpZG4ndCBzZWUgdGhlIGtleXdvcmQgKi8KKworICAgIHJldHVybiAqcCA8PSAnICc7CQkvKiBNdXN0IGJlIEVPTCBvciB3aGl0ZXNwYWNlICovCit9CisKK3N0YXRpYyBjaGFyICpnZXRfZGlkKGNoYXIgKnAsIHVpbnQzMl90ICogaWRwdHIsIHVpbnQzMl90ICogbWFza3B0cikKK3sKKyAgICB1bnNpZ25lZCBsb25nIHZpZCwgZGlkLCBtMSwgbTI7CisKKyAgICAqaWRwdHIgPSAtMTsKKyAgICAqbWFza3B0ciA9IDB4ZmZmZmZmZmY7CisKKyAgICB2aWQgPSBzdHJ0b3VsKHAsICZwLCAxNik7CisgICAgaWYgKCpwICE9ICc6JykKKwlyZXR1cm4gcDsJCS8qIEJvZ3VzIElEICovCisgICAgZGlkID0gc3RydG91bChwICsgMSwgJnAsIDE2KTsKKworICAgICppZHB0ciA9IChkaWQgPDwgMTYpICsgdmlkOworCisgICAgaWYgKCpwID09ICcvJykgeworCW0xID0gc3RydG91bChwICsgMSwgJnAsIDE2KTsKKwlpZiAoKnAgIT0gJzonKSB7CisJICAgICptYXNrcHRyID0gKG0xIDw8IDE2KSB8IDB4ZmZmZjsKKwl9IGVsc2UgeworCSAgICBtMiA9IHN0cnRvdWwocCArIDEsICZwLCAxNik7CisJICAgICptYXNrcHRyID0gKG0xIDw8IDE2KSB8IG0yOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKmdldF9yaWRfcmFuZ2UoY2hhciAqcCwgdWludDhfdCAqIHJpZF9taW4sIHVpbnQ4X3QgKiByaWRfbWF4KQoreworICAgIHVuc2lnbmVkIGxvbmcgcjAsIHIxOworCisgICAgcCA9IHNraXBzcGFjZShwICsgMyk7CisKKyAgICByMCA9IHN0cnRvdWwocCwgJnAsIDE2KTsKKyAgICBpZiAoKnAgPT0gJy0nKSB7CisJcjEgPSBzdHJ0b3VsKHAgKyAxLCAmcCwgMTYpOworICAgIH0gZWxzZSB7CisJcjEgPSByMDsKKyAgICB9CisKKyAgICAqcmlkX21pbiA9IHIwOworICAgICpyaWRfbWF4ID0gcjE7CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIHN0cnVjdCBtYXRjaCAqcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGNoYXIgbGluZVtNQVhfTElORV0sICpwOworICAgIEZJTEUgKmY7CisgICAgc3RydWN0IG1hdGNoICpsaXN0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgbWF0Y2ggKiplcCA9ICZsaXN0OworICAgIHN0cnVjdCBtYXRjaCAqbTsKKworICAgIGlmICghZmlsZW5hbWUpCisJZmlsZW5hbWUgPSBzeXNsaW51eF9jb25maWdfZmlsZSgpOworCisgICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgIGlmICghZikKKwlyZXR1cm4gbGlzdDsKKworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikpIHsKKwlwID0gc2tpcHNwYWNlKGxpbmUpOworCisJaWYgKCFsb29raW5nX2F0KHAsICIjIikpCisJICAgIGNvbnRpbnVlOworCXAgPSBza2lwc3BhY2UocCArIDEpOworCisJaWYgKCFsb29raW5nX2F0KHAsICJkZXYiKSkKKwkgICAgY29udGludWU7CisJcCA9IHNraXBzcGFjZShwICsgMyk7CisKKwltID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWF0Y2gpKTsKKwlpZiAoIW0pCisJICAgIGNvbnRpbnVlOworCisJbWVtc2V0KG0sIDAsIHNpemVvZiAqbSk7CisJbS0+cmlkX21heCA9IDB4ZmY7CisKKwlmb3IgKDs7KSB7CisJICAgIHAgPSBza2lwc3BhY2UocCk7CisKKwkgICAgaWYgKGxvb2tpbmdfYXQocCwgImRpZCIpKSB7CisJCXAgPSBnZXRfZGlkKHAgKyAzLCAmbS0+ZGlkLCAmbS0+ZGlkX21hc2spOworCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInNpZCIpKSB7CisJCXAgPSBnZXRfZGlkKHAgKyAzLCAmbS0+c2lkLCAmbS0+c2lkX21hc2spOworCSAgICB9IGVsc2UgaWYgKGxvb2tpbmdfYXQocCwgInJpZCIpKSB7CisJCXAgPSBnZXRfcmlkX3JhbmdlKHAgKyAzLCAmbS0+cmlkX21pbiwgJm0tPnJpZF9tYXgpOworCSAgICB9IGVsc2UgeworCQljaGFyICplOworCisJCWUgPSBzdHJjaHIocCwgJ1xuJyk7CisJCWlmICgqZSkKKwkJICAgICplID0gJ1wwJzsKKwkJZSA9IHN0cmNocihwLCAnXHInKTsKKwkJaWYgKCplKQorCQkgICAgKmUgPSAnXDAnOworCisJCW0tPmZpbGVuYW1lID0gc3RyZHVwKHApOworCQlpZiAoIW0tPmZpbGVuYW1lKQorCQkgICAgbS0+ZGlkID0gLTE7CisJCWJyZWFrOwkJLyogRG9uZSB3aXRoIHRoaXMgbGluZSAqLworCSAgICB9CisJfQorCisJZHByaW50ZigiREVWIERJRCAlMDh4LyUwOHggU0lEICUwOHgvJTA4eCBSSUQgJTAyeC0lMDJ4IENNRCAlc1xuIiwKKwkJbS0+ZGlkLCBtLT5kaWRfbWFzaywgbS0+c2lkLCBtLT5zaWRfbWFzaywKKwkJbS0+cmlkX21pbiwgbS0+cmlkX21heCwgbS0+ZmlsZW5hbWUpOworCisJKmVwID0gbTsKKwllcCA9ICZtLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBsaXN0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHN0cnVjdCBtYXRjaCAqbGlzdCwgKm1hdGNoOworICAgIHN0cnVjdCBwY2lfZG9tYWluICpwY2lfZG9tYWluOworCisgICAgcGNpX2RvbWFpbiA9IHBjaV9zY2FuKCk7CisKKyAgICBpZiAocGNpX2RvbWFpbikgeworCWxpc3QgPSBwYXJzZV9jb25maWcoYXJnYyA8IDIgPyBOVUxMIDogYXJndlsxXSk7CisKKwltYXRjaCA9IGZpbmRfcGNpX2RldmljZShwY2lfZG9tYWluLCBsaXN0KTsKKworCWlmIChtYXRjaCkKKwkgICAgc3lzbGludXhfcnVuX2NvbW1hbmQobWF0Y2gtPmZpbGVuYW1lKTsKKyAgICB9CisKKyAgICAvKiBPbiBlcnJvciwgcmV0dXJuIHRvIHRoZSBjb21tYW5kIGxpbmUgKi8KKyAgICBmcHV0cygiRXJyb3I6IG5vIHJlY29nbml6ZWQgbmV0d29yayBjYXJkIGZvdW5kIVxuIiwgc3RkZXJyKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvZ3B4ZWNtZC5jIGIvY29tMzIvbW9kdWxlcy9ncHhlY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkOTBhMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvZ3B4ZWNtZC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZ3B4ZWNtZC5jCisgKgorICogSW52b2tlIGFuIGFyYml0cmFyeSBnUFhFIGNvbW1hbmQsIGlmIGF2YWlsYWJsZS4KKyAqLworCisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8c3lzL2dweGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9weGVfYXBpLmg+CisKK3N0cnVjdCBzZWdvZmYxNiB7CisgICAgdWludDE2X3Qgb2Zmcywgc2VnOworfTsKKworc3RydWN0IHNfUFhFTlZfRklMRV9FWEVDIHsKKyAgICB1aW50MTZfdCBTdGF0dXM7CisgICAgc3RydWN0IHNlZ29mZjE2IENvbW1hbmQ7Cit9OworCitzdGF0aWMgdm9pZCBncHhlY21kKGNvbnN0IGNoYXIgKiphcmdzKQoreworICAgIGNoYXIgKnE7CisgICAgc3RydWN0IHNfUFhFTlZfRklMRV9FWEVDICpmeDsKKworICAgIGZ4ID0gbG1hbGxvYyhzaXplb2YgKmZ4KTsKKyAgICBpZiAoIWZ4KQorCXJldHVybjsKKworICAgIHEgPSAoY2hhciAqKShmeCArIDEpOworCisgICAgZngtPlN0YXR1cyA9IDE7CisgICAgZngtPkNvbW1hbmQub2ZmcyA9IE9GRlMocSk7CisgICAgZngtPkNvbW1hbmQuc2VnID0gU0VHKHEpOworCisgICAgd2hpbGUgKCphcmdzKSB7CisJcSA9IHN0cGNweShxLCAqYXJncyk7CisJKnErKyA9ICcgJzsKKwlhcmdzKys7CisgICAgfQorICAgICotLXEgPSAnXDAnOworCisgICAgcHhlX2NhbGwoUFhFTlZfRklMRV9FWEVDLCBmeCk7CisKKyAgICAvKiBUaGlzIHNob3VsZCBub3QgcmV0dXJuLi4uICovCit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCit7CisgICAgaWYgKGFyZ2MgPCAyKSB7CisJcHJpbnRmKCJVc2FnZTogZ3B4ZWNtZCBjb21tYW5kLi4uXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIWlzX2dweGUoKSkgeworCXByaW50ZigiZ3B4ZWNtZDogZ1BYRSBBUEkgbm90IGRldGVjdGVkXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBncHhlY21kKGFyZ3YgKyAxKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9oZXhkdW1wLmMgYi9jb20zMi9tb2R1bGVzL2hleGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJjNzBkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9oZXhkdW1wLmMKQEAgLTAsMCArMSwyNDUgQEAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbG9hZGZpbGUuaD4KKworLyogTWFjcm9zICovCisjZGVmaW5lIFJPV1NfUEVSX1BBR0UgMjQKKyNkZWZpbmUgQ09MU19QRVJfUk9XIDE2CisjZGVmaW5lIEJZVEVTX1BFUl9QQUdFIChST1dTX1BFUl9QQUdFICogQ09MU19QRVJfUk9XKQorCisvKiBGdW5jdGlvbnMgZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IHVzYWdlKHZvaWQpOworc3RhdGljIHZvaWQgZWF0X3N0ZGluKHZvaWQpOworc3RhdGljIGludCBkb19wYWdlKHZvaWQpOworc3RhdGljIHZvaWQgaGV4ZHVtcChjb25zdCB2b2lkICptZW1vcnksIHNpemVfdCBieXRlcyk7CisKKy8qIE9iamVjdHMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwcm9nX25hbWU7CitzdGF0aWMgaW50IG9wdF9wYWdlOworc3RhdGljIGludCBvcHRfbm9fYnVmZmVyOworc3RhdGljIGludCBvcHRfZXh0ZW5kZWRfYXNjaWk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgcmM7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgaW50IGk7CisgICAgdm9pZCAqZmlsZV9kYXRhOworICAgIHNpemVfdCBmaWxlX3N6OworICAgIEZJTEUgKmY7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjb25zdCBjaGFyICpjdXJfcG9zOworCisgICAgLyogQXNzdW1lIGZhaWx1cmUgKi8KKyAgICByYyA9IEVYSVRfRkFJTFVSRTsKKworICAgIC8qIERldGVybWluZSB0aGUgcHJvZ3JhbSBuYW1lLCBhcyBpbnZva2VkICovCisgICAgaWYgKGFyZ2MgPCAxIHx8ICFhcmd2IHx8ICFhcmd2WzBdKSB7CisJZnByaW50ZihzdGRlcnIsICJhcmdjIG9yIGFyZ3YgZmFpbHVyZSFcbiIpOworCWdvdG8gZXJyX3Byb2dfbmFtZTsKKyAgICB9CisgICAgcHJvZ19uYW1lID0gYXJndlswXTsKKworICAgIC8qIFByb2Nlc3MgYXJndW1lbnRzICovCisgICAgZmlsZW5hbWUgPSBOVUxMOworICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKKwlpZiAoIWFyZ3ZbaV0pIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJhcmdjIGFuZCBhcmd2IG1pc21hdGNoIVxuIik7CisJICAgIGdvdG8gZXJyX2FyZ3Y7CisJfQorCisJaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItLXBhZ2UiLCBzaXplb2YgIi0tcGFnZSIpIHx8CisJICAgICFzdHJuY21wKGFyZ3ZbaV0sICItcCIsIHNpemVvZiAiLXAiKSkgeworCSAgICBvcHRfcGFnZSA9IDE7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICghc3RybmNtcChhcmd2W2ldLCAiLS1uby1idWZmZXIiLCBzaXplb2YgIi0tbm8tYnVmZmVyIikpIHsKKwkgICAgb3B0X25vX2J1ZmZlciA9IDE7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICghc3RybmNtcChhcmd2W2ldLCAiLS1leHRlbmRlZC1hc2NpaSIsIHNpemVvZiAiLS1leHRlbmRlZC1hc2NpaSIpKSB7CisJICAgIG9wdF9leHRlbmRlZF9hc2NpaSA9IDE7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICghc3RybmNtcChhcmd2W2ldLCAiLS1oZWxwIiwgc2l6ZW9mICItLWhlbHAiKSB8fAorCSAgICAhc3RybmNtcChhcmd2W2ldLCAiLWgiLCBzaXplb2YgIi1oIikgfHwKKwkgICAgIXN0cm5jbXAoYXJndltpXSwgIi0/Iiwgc2l6ZW9mICItPyIpKQorCSAgICByZXR1cm4gdXNhZ2UoKTsKKworCS8qIE90aGVyd2lzZSwgaW50ZXJwcmV0IGFzIGEgZmlsZW5hbWUsIGJ1dCBvbmx5IGFjY2VwdCBvbmUgKi8KKwlpZiAoZmlsZW5hbWUpCisJICAgIHJldHVybiB1c2FnZSgpOworCWZpbGVuYW1lID0gYXJndltpXTsKKyAgICB9CisgICAgaWYgKCFmaWxlbmFtZSkKKwlyZXR1cm4gdXNhZ2UoKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwgIkR1bXBpbmcgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKKworICAgIC8qIEVpdGhlciBmZXRjaCB0aGUgd2hvbGUgZmlsZSwgb3IganVzdCBhbGxvY2F0ZSBhIGJ1ZmZlciAqLworICAgIGYgPSBOVUxMOworICAgIGlmIChvcHRfbm9fYnVmZmVyKSB7CisJZXJybm8gPSAwOworCWlmIChsb2FkZmlsZShmaWxlbmFtZSwgJmZpbGVfZGF0YSwgJmZpbGVfc3opKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgbG9hZCBmaWxlLiAgRXJyb3I6ICVkXG4iLCBlcnJubyk7CisJICAgIGdvdG8gZXJyX2ZpbGVfZGF0YTsKKwl9CisgICAgfSBlbHNlIHsKKwlmaWxlX3N6ID0gQllURVNfUEVSX1BBR0U7CisJZmlsZV9kYXRhID0gbWFsbG9jKGZpbGVfc3opOworCWlmICghZmlsZV9kYXRhKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgYWxsb2NhdGUgZmlsZSBkYXRhIGJ1ZmZlclxuIik7CisJICAgIGdvdG8gZXJyX2ZpbGVfZGF0YTsKKwl9CisJZXJybm8gPSAwOworCWYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKwlpZiAoIWYpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBvcGVuIGZpbGUuICBFcnJvcjogJWRcbiIsIGVycm5vKTsKKwkgICAgZ290byBlcnJfZjsKKwl9CisgICAgfQorCisgICAgLyogRHVtcCB0aGUgZGF0YSAqLworICAgIGxlbiA9IEJZVEVTX1BFUl9QQUdFOworICAgIGN1cl9wb3MgPSBmaWxlX2RhdGE7CisgICAgZG8geworCWlmIChmKSB7CisJICAgIC8qIEJ1ZmZlcmVkICovCisJICAgIGxlbiA9IGZyZWFkKGZpbGVfZGF0YSwgMSwgZmlsZV9zeiwgZik7CisJICAgIGN1cl9wb3MgPSBmaWxlX2RhdGE7CisJfSBlbHNlIHsKKwkgICAgLyogTm9uLWJ1ZmZlcmVkICovCisJICAgIGlmIChmaWxlX3N6IDwgbGVuKQorCQlsZW4gPSBmaWxlX3N6OworCX0KKwlpZiAoIWxlbikKKwkgICAgYnJlYWs7CisKKwloZXhkdW1wKGN1cl9wb3MsIGxlbik7CisKKwkvKiBQYXVzZSwgaWYgcmVxdWVzdGVkICovCisJaWYgKG9wdF9wYWdlKSB7CisJICAgIC8qIFRoZSB1c2VyIG1pZ2h0IGNob29zZSB0byBxdWl0ICovCisJICAgIGlmIChkb19wYWdlKCkpCisJCWJyZWFrOworCX0KKworCS8qIFJlZHVjZSBmaWxlX3N6IGZvciBub24tYnVmZmVyZWQgbW9kZSAqLworCWlmICghZikKKwkgICAgZmlsZV9zeiAtPSBsZW47CisgICAgfSB3aGlsZSAoY3VyX3BvcyArPSBsZW4pOworCisgICAgcmMgPSBFWElUX1NVQ0NFU1M7CisKKyAgICBpZiAoZikKKwlmY2xvc2UoZik7CisgICAgZXJyX2Y6CisKKyAgICBmcmVlKGZpbGVfZGF0YSk7CisgICAgZXJyX2ZpbGVfZGF0YToKKworICAgIGVycl9hcmd2OgorCisgICAgZXJyX3Byb2dfbmFtZToKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCB1c2FnZSh2b2lkKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyIHVzYWdlW10gPQorCSJVc2FnZTogJXMgWzxvcHRpb24+IFsuLi5dXSA8ZmlsZW5hbWU+IFs8b3B0aW9uPiBbLi4uXV1cbiIKKwkiXG4iCisJIk9wdGlvbnM6IC1wXG4iCisJIiAgICAgICAgIC0tcGFnZSAuIC4gLiAuIC4gLiAuIFBhdXNlIG91dHB1dCBldmVyeSAyNCBsaW5lc1xuIgorCSIgICAgICAgICAtLW5vLWJ1ZmZlciAuIC4gLiAuICBMb2FkIHRoZSBlbnRpcmUgZmlsZSBiZWZvcmUgZHVtcGluZ1xuIgorCSIgICAgICAgICAtLWV4dGVuZGVkLWFzY2lpIC4gLiBVc2UgZXh0ZW5kZWQgQVNDSUkgY2hhcnMgaW4gZHVtcFxuIgorCSIgICAgICAgICAtP1xuIgorCSIgICAgICAgICAtaFxuIgorCSIgICAgICAgICAtLWhlbHAgIC4gLiAuIC4gLiAuICBEaXNwbGF5IHRoaXMgaGVscFxuIjsKKworICAgIGZwcmludGYoc3RkZXJyLCB1c2FnZSwgcHJvZ19uYW1lKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworfQorCitzdGF0aWMgdm9pZCBlYXRfc3RkaW4odm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIHdoaWxlICgxKSB7CisJaSA9IGZnZXRjKHN0ZGluKTsKKwlpZiAoaSA9PSBFT0YgfHwgaSA9PSAnXG4nKQorCSAgICByZXR1cm47CisgICAgfQorfQorc3RhdGljIGludCBkb19wYWdlKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICB3aGlsZSAoMSkgeworCWZwcmludGYoc3Rkb3V0LCAiQ29udGludWU/IFtZfG5dOiAiKTsKKwlpID0gZmdldGMoc3RkaW4pOworCXN3aXRjaCAoaSkgeworCSAgICBjYXNlICduJzoKKwkgICAgY2FzZSAnTic6CisJICAgIGVhdF9zdGRpbigpOworCSAgICByZXR1cm4gMTsKKworCSAgICBjYXNlIEVPRjoKKwkgICAgZnByaW50ZihzdGRlcnIsICJObyByZXNwb25zZS4gIENvbnRpbnVpbmcuLi5cbiIpOworCSAgICAvKiBGYWxsIHRocm91Z2ggdG8gInllcyIgKi8KKworCSAgICBjYXNlICd5JzoKKwkgICAgY2FzZSAnWSc6CisJICAgIGVhdF9zdGRpbigpOworCSAgICBjYXNlICdcbic6CisJICAgIHJldHVybiAwOworCisJICAgIGRlZmF1bHQ6CisJICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBjaG9pY2VcbiIpOworCSAgICBlYXRfc3RkaW4oKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoZXhkdW1wKGNvbnN0IHZvaWQgKm1lbW9yeSwgc2l6ZV90IGJ5dGVzKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsICpxOworICAgIGludCBpOworIAorICAgIHAgPSBtZW1vcnk7CisgICAgd2hpbGUgKGJ5dGVzKSB7CisgICAgICAgIHEgPSBwOworICAgICAgICBwcmludGYoIiVwOiAiLCAodm9pZCAqKSBwKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2ICYmIGJ5dGVzOyArK2kpIHsKKyAgICAgICAgICAgIHByaW50ZigiJTAyWCAiLCAqcCk7CisgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAtLWJ5dGVzOworICAgICAgICAgIH0KKyAgICAgICAgYnl0ZXMgKz0gaTsKKyAgICAgICAgd2hpbGUgKGkgPCAxNikgeworICAgICAgICAgICAgcHJpbnRmKCJYWCAiKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICB9CisgICAgICAgIHByaW50ZigifCAiKTsKKyAgICAgICAgcCA9IHE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNiAmJiBieXRlczsgKytpKSB7CisgICAgICAgICAgICBwcmludGYoIiVjIiwgaXNwcmludCgqcCkgJiYgIWlzc3BhY2UoKnApID8gKnAgOiAnICcpOworICAgICAgICAgICAgKytwOworICAgICAgICAgICAgLS1ieXRlczsKKyAgICAgICAgICB9CisgICAgICAgIHdoaWxlIChpIDwgMTYpIHsKKyAgICAgICAgICAgIHByaW50ZigiICIpOworICAgICAgICAgICAgKytpOworICAgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgfQorICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvaG9zdC5jIGIvY29tMzIvbW9kdWxlcy9ob3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwZWZmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvaG9zdC5jCkBAIC0wLDAgKzEsNDIgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9weGUuaD4KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBkbnNfcmVzb2x2ZShjb25zdCBjaGFyICpob3N0bmFtZSkKK3sKKyAgICByZXR1cm4gcHhlX2Rucyhob3N0bmFtZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2FnZShjb25zdCBjaGFyICpzKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGhvc3RuYW1lIFssIGhvc3RuYW1lXzEsIGhvc3RuYW1lXzIsIC4uLl1cbiIsIHMpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBpOworICAgIHVpbnQzMl90IGlwOworCisgICAgb3BlbmNvbnNvbGUoJmRldl9udWxsX3IsICZkZXZfc3RkY29uX3cpOworCisgICAgaWYgKGFyZ2MgPCAyKSB7CisgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGlwID0gZG5zX3Jlc29sdmUoYXJndltpXSk7CisgICAgICAgIGlmICghaXApIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgbm90IGZvdW5kLlxuIiwgYXJndltpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiUtMzlzICUwOFggJXUuJXUuJXUuJXVcbiIsIGFyZ3ZbaV0sIG50b2hsKGlwKSwgaXAgJiAweEZGLAorICAgICAgICAgICAgICAgICAgIChpcCA+PiA4KSAmIDB4RkYsIChpcCA+PiAxNikgJiAweEZGLCAoaXAgPj4gMjQpICYgMHhGRik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvaWZjcHUuYyBiL2NvbTMyL21vZHVsZXMvaWZjcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE2MzMyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9pZmNwdS5jCkBAIC0wLDAgKzEsMTc0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBFcndhbiBWZWx1IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogaWZjcHUuYworICoKKyAqLworCisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjcHVpZC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3QuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvbnNvbGVzLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlcnJvcihjb25zdCBjaGFyICptc2cpCit7CisgICAgZnB1dHMobXNnLCBzdGRlcnIpOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSAKK3sKKyBlcnJvcigiUnVuIG9uZSBjb21tYW5kIGlmIHN5c3RlbSBtYXRjaCBzb21lIENQVSBmZWF0dXJlcywgYW5vdGhlciBpZiBpdCBkb2Vzbid0LiBcbiIKKyAiVXNhZ2U6IFxuIgorICIgICBsYWJlbCBpZmNwdSBcbiIKKyAiICAgICAgIGNvbTMyIGlmY3B1LmMzMiBcbiIKKyAiICAgICAgIGFwcGVuZCA8b3B0aW9uPiA8Y3B1X2ZlYXR1cmVzPiAtLSBib290X2VudHJ5XzEgLS0gYm9vdF9lbnRyeV8yIFxuIgorICIgICBsYWJlbCBib290X2VudHJ5XzEgXG4iCisgIiAgIAkgIGtlcm5lbCB2bWxpbnV6X2VudHJ5MSBcbiIKKyAiCSAgYXBwZW5kIC4uLiBcbiIKKyAiICAgbGFiZWwgYm9vdF9lbnRyeV8yIFxuIgorICIgICAgICAga2VybmVsIHZtbGludXpfZW50cnkyIFxuIgorICIgICAgICAgYXBwZW5kIC4uLiBcbiIKKyAiXG4iCisgIm9wdGlvbnMgY291bGQgYmUgOlxuIgorICIgICBkZWJ1ZyAgICAgOiBkaXNwbGF5IHNvbWUgZGVidWdnaW5nIG1lc3NhZ2VzIFxuIgorICIgICBkcnktcnVuICAgOiBqdXN0IGRvIHRoZSBkZXRlY3Rpb24sIGRvbid0IGJvb3QgXG4iCisgIlxuIgorICJjcHVfZmVhdHVyZXMgY291bGQgYmU6XG4iCisgIiAgIDY0ICAgICAgICAgOiBQcm9jZXNzb3IgaXMgeDg2XzY0IGNvbXBhdGlibGUgKGxtIGNwdSBmbGFnKVxuIgorICIgICBodm0gICAgICAgIDogUHJvY2Vzc29yIGZlYXR1cmVzIGhhcmR3YXJlIHZpcnR1YWxpemF0aW9uIChodm0gb3Igc3ZtIGNwdSBmbGFnKVxuIgorICIgICBtdWx0aWNvcmUgIDogUHJvY2Vzc29yIG11c3QgYmUgbXVsdGktY29yZSBcbiIKKyAiICAgc21wICAgICAgICA6IFN5c3RlbSBtdXN0IGJlIG11bHRpLXByb2Nlc3NvciBcbiIKKyAiICAgcGFlICAgICAgICA6IFByb2Nlc3NvciBmZWF0dXJlcyBQaHlzaWNhbCBBZGRyZXNzIEV4dGVuc2lvbiAoUEFFKVxuIgorICIgICBoeXBlcnZpc29yIDogUHJvY2Vzc29yIGlzIHJ1bm5pbmcgdW5kZXIgYW4gaHlwZXJ2aXNvclxuIgorICJcbiIKKyAiaWYgeW91IHdhbnQgdG8gbWF0Y2ggbWFueSBjcHUgZmVhdHVyZXMsIGp1c3Qgc2VwYXJhdGUgdGhlbSB3aXRoIGEgc2luZ2xlIHNwYWNlLlxuIik7Cit9CisKKy8qIFhYWDogdGhpcyByZWFsbHkgc2hvdWxkIGJlIGxpYnJhcml6ZWQgKi8KK3N0YXRpYyB2b2lkIGJvb3RfYXJncyhjaGFyICoqYXJncykKK3sKKyAgICBpbnQgbGVuID0gMCwgYSA9IDA7CisgICAgY2hhciAqKnBwOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgY2hhciBjLCAqcSwgKnN0cjsKKworICAgIGZvciAocHAgPSBhcmdzOyAqcHA7IHBwKyspCisJbGVuICs9IHN0cmxlbigqcHApICsgMTsKKworICAgIHEgPSBzdHIgPSBhbGxvY2EobGVuKTsKKyAgICBmb3IgKHBwID0gYXJnczsgKnBwOyBwcCsrKSB7CisJcCA9ICpwcDsKKwl3aGlsZSAoKGMgPSAqcCsrKSkKKwkgICAgKnErKyA9IGM7CisJKnErKyA9ICcgJzsKKwlhID0gMTsKKyAgICB9CisgICAgcSAtPSBhOworICAgICpxID0gJ1wwJzsKKworICAgIGlmICghc3RyWzBdKQorCXN5c2xpbnV4X3J1bl9kZWZhdWx0KCk7CisgICAgZWxzZQorCXN5c2xpbnV4X3J1bl9jb21tYW5kKHN0cik7Cit9CisKKyNkZWZpbmUgc2hvd19ib29sKG15Ym9vbCkgbXlib29sID8gImZvdW5kIjoibm90IGZvdW5kIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGNoYXIgKiphcmdzWzNdOworICAgIGludCBpPTA7CisgICAgaW50IG49MDsKKyAgICBib29sIGhhcmR3YXJlX21hdGNoZXMgPSB0cnVlOworICAgIGJvb2wgbXVsdGljb3JlID0gZmFsc2U7CisgICAgYm9vbCBkcnlydW4gPSBmYWxzZTsKKyAgICBib29sIGRlYnVnID0gZmFsc2U7CisKKyAgICBzX2NwdSBjcHU7CisgICAgY29uc29sZV9hbnNpX3JhdygpOworICAgIGRldGVjdF9jcHUoJmNwdSk7CisKKyAgICAvKiBJZiBubyBhcmd1bWVudCBnb3QgcGFzc2VkLCBsZXQncyBzaG93IHRoZSB1c2FnZSAqLworICAgIGlmIChhcmdjID09IDEpIHsKKwkgICAgdXNhZ2UoKTsKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS0iKSkgeworCSAgICBhcmd2W2ldID0gTlVMTDsKKwkgICAgYXJnc1tuKytdID0gJmFyZ3ZbaSArIDFdOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiNjQiKSkgeworCSAgICBpZiAoZGVidWcpCisJCXByaW50ZigiIDY0Yml0ICAgICAgOiAlcyBvbiB0aGlzIHN5c3RlbVxuIiwKKwkJICAgICAgIHNob3dfYm9vbChjcHUuZmxhZ3MubG0pKTsKKwkgICAgaGFyZHdhcmVfbWF0Y2hlcyA9IGNwdS5mbGFncy5sbSAmJiBoYXJkd2FyZV9tYXRjaGVzOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAicGFlIikpIHsKKwkgICAgaWYgKGRlYnVnKQorCQlwcmludGYoIiBwYWUgICAgICAgIDogJXMgb24gdGhpcyBzeXN0ZW1cbiIsCisJCSAgICAgICBzaG93X2Jvb2woY3B1LmZsYWdzLnBhZSkpOworCSAgICBoYXJkd2FyZV9tYXRjaGVzID0gY3B1LmZsYWdzLnBhZSAmJiBoYXJkd2FyZV9tYXRjaGVzOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiaHZtIikpIHsKKwkgICAgaWYgKGRlYnVnKQorCQlwcmludGYoIiBodm0gICAgICAgIDogJXMgb24gdGhpcyBzeXN0ZW1cbiIsCisJCSAgICAgICBzaG93X2Jvb2woKGNwdS5mbGFncy52bXggfHwgY3B1LmZsYWdzLnN2bSkpKTsKKwkgICAgaGFyZHdhcmVfbWF0Y2hlcyA9IChjcHUuZmxhZ3Mudm14IHx8IGNwdS5mbGFncy5zdm0pCisJCSYmIGhhcmR3YXJlX21hdGNoZXM7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJtdWx0aWNvcmUiKSkgeworCSAgICBpZiAoZGVidWcpCisJCXByaW50ZigiIG11bHRpY29yZSAgOiAlZCBjb3JlcyBvbiB0aGlzIHN5c3RlbVxuIiwgY3B1Lm51bV9jb3Jlcyk7CisJICAgIGlmIChjcHUubnVtX2NvcmVzID4gMSkKKwkJbXVsdGljb3JlID0gdHJ1ZTsKKwkgICAgaGFyZHdhcmVfbWF0Y2hlcyA9IG11bHRpY29yZSAmJiBoYXJkd2FyZV9tYXRjaGVzOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAic21wIikpIHsKKwkgICAgaWYgKGRlYnVnKQorCQlwcmludGYoIiBzbXAgICAgICAgIDogJXMgb24gdGhpcyBzeXN0ZW1cbiIsIHNob3dfYm9vbChjcHUuZmxhZ3Muc21wKSk7CisJICAgIGhhcmR3YXJlX21hdGNoZXMgPSBjcHUuZmxhZ3Muc21wICYmIGhhcmR3YXJlX21hdGNoZXM7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJoeXBlcnZpc29yIikpIHsKKwkgICAgaWYgKGRlYnVnKQorCQlwcmludGYoIiBoeXBlcnZpc29yIDogJXMgb24gdGhpcyBzeXN0ZW1cbiIsIHNob3dfYm9vbChjcHUuZmxhZ3MuaHlwZXJ2aXNvcikpOworCSAgICBoYXJkd2FyZV9tYXRjaGVzID0gY3B1LmZsYWdzLmh5cGVydmlzb3IgJiYgaGFyZHdhcmVfbWF0Y2hlczsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgImRyeS1ydW4iKSkgeworCSAgICBkcnlydW4gPSB0cnVlOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiZGVidWciKSkgeworCSAgICBkZWJ1ZyA9IHRydWU7CisJfQorCWlmIChuID49IDIpCisJICAgIGJyZWFrOworICAgIH0KKyAgICB3aGlsZSAobiA8IDIpIHsKKwlhcmdzW25dID0gYXJnc1tuIC0gMV07CisJbisrOworICAgIH0KKyAgICBpZiAoZGVidWcpIHsKKwlwcmludGYoIlxuQm9vdGluZyBsYWJlbHMgYXJlIDogJyVzJyBvciAnJXMnXG4iLCAqYXJnc1swXSwgKmFyZ3NbMV0pOworCXByaW50ZigiSGFyZHdhcmUgcmVxdWlyZW1lbnRzJXNtYXRjaCB0aGlzIHN5c3RlbSwgbGV0J3MgYm9vdGluZyAnJXMnXG4iLAorCSAgICAgICBoYXJkd2FyZV9tYXRjaGVzID8gIiAiIDogIiBkb2Vzbid0ICIsCisJICAgICAgIGhhcmR3YXJlX21hdGNoZXMgPyAqYXJnc1swXSA6ICphcmdzWzFdKTsKKwlwcmludGYoIlNsZWVwaW5nIDVzZWMgYmVmb3JlIGJvb3RpbmdcbiIpOworCWlmICghZHJ5cnVuKQorCSAgICBzbGVlcCg1KTsKKyAgICB9CisKKyAgICBpZiAoIWRyeXJ1bikKKwlib290X2FyZ3MoaGFyZHdhcmVfbWF0Y2hlcyA/IGFyZ3NbMF0gOiBhcmdzWzFdKTsKKyAgICBlbHNlCisJcHJpbnRmKCJEcnktcnVuIG1vZGUsIGxldCdzIGV4aXRpbmdcbiIpOworCisgICAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9pZmNwdTY0LmMgYi9jb20zMi9tb2R1bGVzL2lmY3B1NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTIzOTIyCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9pZmNwdTY0LmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogaWZjcHU2NC5jCisgKgorICogUnVuIG9uZSBjb21tYW5kIGlmIHRoZSBDUFUgaGFzIDY0LWJpdCBzdXBwb3J0LCBhbmQgYW5vdGhlciBpZiBpdCBkb2Vzbid0LgorICogRXZlbnR1YWxseSB0aGlzIGFuZCBvdGhlciBmZWF0dXJlcyBzaG91bGQgZ2V0IGZvbGRlZCBpbnRvIHNvbWUga2luZAorICogb2Ygc2NyaXB0aW5nIGVuZ2luZS4KKyAqCisgKiBVc2FnZToKKyAqCisgKiAgICBsYWJlbCBib290X2tlcm5lbAorICogICAgICAgIGNvbTMyIGlmY3B1NjQuYzMyCisgKiAgICAgICAgYXBwZW5kIGJvb3Rfa2VybmVsXzY0IFstLSBib290X2tlcm5lbF8zMnBhZV0gLS0gYm9vdF9rZXJuZWxfMzIKKyAqICAgIGxhYmVsIGJvb3Rfa2VybmVsXzMyCisgKiAgICAgICAga2VybmVsIHZtbGludXpfMzIKKyAqICAgICAgICBhcHBlbmQgLi4uCisgKiAgICBsYWJlbCBib290X2tlcm5lbF82NAorICogICAgICAgIGtlcm5lbCB2bWxpbnV6XzY0CisgKiAgICAgICAgYXBwZW5kIC4uLgorICovCisKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjcHVpZC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3QuaD4KKworc3RhdGljIGJvb2wgX19jb25zdGZ1bmMgY3B1X2hhc19jcHVpZCh2b2lkKQoreworICAgIHJldHVybiBjcHVfaGFzX2VmbGFnKFg4Nl9FRkxBR1NfSUQpOworfQorCitzdGF0aWMgYm9vbCBfX2NvbnN0ZnVuYyBjcHVfaGFzX2xldmVsKHVpbnQzMl90IGxldmVsKQoreworICAgIHVpbnQzMl90IGdyb3VwOworICAgIHVpbnQzMl90IGxpbWl0OworCisgICAgaWYgKCFjcHVfaGFzX2NwdWlkKCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgZ3JvdXAgPSBsZXZlbCAmIDB4ZmZmZjAwMDA7CisgICAgbGltaXQgPSBjcHVpZF9lYXgoZ3JvdXApOworCisgICAgaWYgKChsaW1pdCAmIDB4ZmZmZjAwMDApICE9IGdyb3VwKQorCXJldHVybiBmYWxzZTsKKworICAgIGlmIChsZXZlbCA+IGxpbWl0KQorCXJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIG9ubHkgc3VwcG9ydHMgZmVhdHVyZSBncm91cHMgMCBhbmQgMSwgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIEludGVsIGFuZCBBTUQgRURYIGJpdCB2ZWN0b3JzLiAgV2UgY2FuIGFkZCBtb3JlIGxhdGVyIGlmIG5lZWQgYmUuICovCitzdGF0aWMgYm9vbCBfX2NvbnN0ZnVuYyBjcHVfaGFzX2ZlYXR1cmUoaW50IHgpCit7CisgICAgdWludDMyX3QgbGV2ZWwgPSAoKHggJiAxKSA8PCAzMSkgfCAxOworCisgICAgcmV0dXJuIGNwdV9oYXNfbGV2ZWwobGV2ZWwpICYmICgoY3B1aWRfZWR4KGxldmVsKSA+PiAoeCAmIDMxKSAmIDEpKTsKK30KKworLyogWFhYOiB0aGlzIHJlYWxseSBzaG91bGQgYmUgbGlicmFyaXplZCAqLworc3RhdGljIHZvaWQgYm9vdF9hcmdzKGNoYXIgKiphcmdzKQoreworICAgIGludCBsZW4gPSAwLCBhID0gMDsKKyAgICBjaGFyICoqcHA7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIGMsICpxLCAqc3RyOworCisgICAgZm9yIChwcCA9IGFyZ3M7ICpwcDsgcHArKykKKwlsZW4gKz0gc3RybGVuKCpwcCkgKyAxOworCisgICAgcSA9IHN0ciA9IGFsbG9jYShsZW4pOworICAgIGZvciAocHAgPSBhcmdzOyAqcHA7IHBwKyspIHsKKwlwID0gKnBwOworCXdoaWxlICgoYyA9ICpwKyspKQorCSAgICAqcSsrID0gYzsKKwkqcSsrID0gJyAnOworCWEgPSAxOworICAgIH0KKyAgICBxIC09IGE7CisgICAgKnEgPSAnXDAnOworCisgICAgaWYgKCFzdHJbMF0pCisJc3lzbGludXhfcnVuX2RlZmF1bHQoKTsKKyAgICBlbHNlCisJc3lzbGludXhfcnVuX2NvbW1hbmQoc3RyKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBjaGFyICoqYXJnc1szXTsKKyAgICBpbnQgaTsKKyAgICBpbnQgbjsKKworICAgIGFyZ3NbMF0gPSAmYXJndlsxXTsKKyAgICBuID0gMTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tIikpIHsKKwkgICAgYXJndltpXSA9IE5VTEw7CisJICAgIGFyZ3NbbisrXSA9ICZhcmd2W2kgKyAxXTsKKwl9CisJaWYgKG4gPj0gMykKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHdoaWxlIChuIDwgMykgeworCWFyZ3Nbbl0gPSBhcmdzW24gLSAxXTsKKwluKys7CisgICAgfQorCisgICAgYm9vdF9hcmdzKGNwdV9oYXNfZmVhdHVyZShYODZfRkVBVFVSRV9MTSkgPyBhcmdzWzBdIDoKKwkgICAgICBjcHVfaGFzX2ZlYXR1cmUoWDg2X0ZFQVRVUkVfUEFFKSA/IGFyZ3NbMV0gOiBhcmdzWzJdKTsKKyAgICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL2lmbWVtZHNrLmMgYi9jb20zMi9tb2R1bGVzL2lmbWVtZHNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlZDg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvaWZtZW1kc2suYwpAQCAtMCwwICsxLDM5MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTEgU2hhbyBNaWxsZXIgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqCisgKiBAZmlsZSBpZm1lbWRzay5jCisgKgorICogVGhpcyBDT00zMiBtb2R1bGUgZGV0ZWN0cyBpZiB0aGVyZSBhcmUgTUVNRElTS3MgZXN0YWJsaXNoZWQuCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfdGV4dFtdID0gIlwKK1VzYWdlOlxuXAorICBpZm1lbWRzay5jMzIgWzxvcHRpb24+IFsuLi5dXSAtLWluZm8gWzxvcHRpb24+IFsuLi5dXVxuXAorICBpZm1lbWRzay5jMzIgWzxvcHRpb24+IFsuLi5dXSBbPGRldGVjdGVkX2NtZD5dIC0tIFs8bm90X2RldGVjdGVkX2NtZD5dXG5cCitcblwKK09wdGlvbnM6XG5cCisgIC0taW5mbyAgLiAuIC4gLiAuIERpc3BsYXlzIGluZm8gYWJvdXQgTUVNRElTSyhzKVxuXAorICAtLXNhZmUtaG9va3MgLiAuICBXaWxsIHNjYW4gSU5UIDEzaCBcInNhZmUgaG9va1wiIGNoYWluXG5cCisgIC0tbWJmdHMgLiAuIC4gLiAuIFdpbGwgc2NhbiBtZW1vcnkgZm9yIE1FTURJU0sgbUJGVHNcblwKKyAgLS1uby1zZXF1ZW50aWFsICAgU3VwcHJlc3NlcyBwcm9iaW5nIGFsbCBkcml2ZSBudW1iZXJzXG5cCitcblwKK0lmIGEgTUVNRElTSyBpcyBmb3VuZCwgb3IgaWYgYSBwYXJ0aWN1bGFyIE1FTURJU0sgaXMgc291Z2h0IGJ5IHRoZSBvcHRpb25zXG5cCithbmQgaXMgZm91bmQsIHRoZW4gdGhlICdkZXRlY3RlZF9jbWQnIGFjdGlvbiB3aWxsIGJlIHRha2VuLCBlbHNlIHRoZVxuXAorJ25vdF9kZXRlY3RlZF9jbWQnIGFjdGlvbiB3aWxsIGJlIHRha2VuLlxuXAorXG4iOworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9ib290Lmg+CisKKy8qIFB1bGwgaW4gTUVNRElTSyBjb21tb24gc3RydWN0dXJlcyAqLworI2luY2x1ZGUgIi4uLy4uL21lbWRpc2svbXN0cnVjdHMuaCIKKworLyoqKiBNYWNyb3MgKi8KKyNkZWZpbmUgTV9HRVRfRFJJVkVfUEFSQU1TICgweDA4KQorI2RlZmluZSBNX1NFR09GRlRPUFRSKHNlZywgb2ZmKSAoKChzZWcpIDw8IDQpICsgKG9mZikpCisjZGVmaW5lIE1fSU5UMTNIIE1fU0VHT0ZGVE9QVFIoMHgwMDAwLCAweDAwMTMgKiA0KQorI2RlZmluZSBNX0ZSRUVCQVNFTUVNIE1fU0VHT0ZGVE9QVFIoMHgwMDQwLCAweDAwMTMpCisjZGVmaW5lIE1fVE9QIE1fU0VHT0ZGVE9QVFIoMHg5RkZGLCAweDAwMDApCisKKy8qKiogT2JqZWN0IHR5cGVzICovCit0eXBlZGVmIHN0cnVjdCBtZGkgc19tZGk7Cit0eXBlZGVmIHJlYWxfYWRkcl90IHVfc2Vnb2ZmOwordHlwZWRlZiBzdHJ1Y3Qgc2FmZV9ob29rIHNfc2FmZV9ob29rOwordHlwZWRlZiBzdHJ1Y3QgbUJGVCBzX21iZnQ7CisKKy8qKiogRnVuY3Rpb24gdHlwZXMgKi8KK3R5cGVkZWYgaW50IGZfZmluZCh2b2lkKTsKKworLyoqKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBzX21kaSAqIGluc3RhbGxhdGlvbl9jaGVjayhpbnQpOworc3RhdGljIGZfZmluZCBzY2FuX2RyaXZlczsKK3N0YXRpYyBmX2ZpbmQgd2Fsa19zYWZlX2hvb2tzOworc3RhdGljIGNvbnN0IHNfc2FmZV9ob29rICogaXNfc2FmZV9ob29rKGNvbnN0IHZvaWQgKik7CitzdGF0aWMgY29uc3Qgc19tZGkgKiBpc19tZW1kaXNrX2hvb2soY29uc3Qgc19zYWZlX2hvb2sgKik7CitzdGF0aWMgZl9maW5kIHNjYW5fbWJmdHM7CitzdGF0aWMgY29uc3Qgc19tYmZ0ICogaXNfbWJmdChjb25zdCB2b2lkICopOworc3RhdGljIGZfZmluZCBkb19ub3RoaW5nOworc3RhdGljIHZvaWQgbWVtZGlza19pbmZvKGNvbnN0IHNfbWRpICopOworc3RhdGljIHZvaWQgYm9vdF9hcmdzKGNoYXIgKiopOworc3RhdGljIGNvbnN0IGNoYXIgKiBib290bG9hZGVybmFtZSh1aW50OF90KTsKKworLyoqKiBTdHJ1Y3R1cmUvdW5pb24gZGVmaW5pdGlvbnMgKi8KKworLyoqKiBPYmplY3RzICovCitzdGF0aWMgaW50IHNob3dfaW5mbyA9IDA7CisKKy8qKiogRnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikgeworICAgIHN0YXRpYyBmX2ZpbmQgKiBkb19zY2FuX2RyaXZlcyA9IHNjYW5fZHJpdmVzOworICAgIHN0YXRpYyBmX2ZpbmQgKiBkb193YWxrX3NhZmVfaG9va3MgPSBkb19ub3RoaW5nOworICAgIHN0YXRpYyBmX2ZpbmQgKiBkb19zY2FuX21iZnRzID0gZG9fbm90aGluZzsKKyAgICBjaGFyICoqIGRldGVjdGVkX2NtZDsKKyAgICBjaGFyICoqIG5vdF9kZXRlY3RlZF9jbWQ7CisgICAgY2hhciAqKiBjbWQ7CisgICAgY2hhciAqKiBjdXJfYXJnOworICAgIGludCBzaG93X3VzYWdlOworICAgIGludCBmb3VuZDsKKworICAgICh2b2lkKSBhcmdjOworCisgICAgb3BlbmNvbnNvbGUoJmRldl9udWxsX3IsICZkZXZfc3RkY29uX3cpOworCisgICAgZGV0ZWN0ZWRfY21kID0gTlVMTDsKKyAgICBub3RfZGV0ZWN0ZWRfY21kID0gTlVMTDsKKyAgICBzaG93X3VzYWdlID0gMTsKKyAgICBmb3IgKGN1cl9hcmcgPSBhcmd2ICsgMTsgKmN1cl9hcmc7ICsrY3VyX2FyZykgeworICAgICAgICAvKiBDaGVjayBmb3IgY29tbWFuZCBkaXZpZGVyICovCisgICAgICAgIGlmICghc3RyY21wKCpjdXJfYXJnLCAiLS0iKSkgeworICAgICAgICAgICAgc2hvd191c2FnZSA9IDA7CisgICAgICAgICAgICAqY3VyX2FyZyA9IE5VTEw7CisgICAgICAgICAgICBub3RfZGV0ZWN0ZWRfY21kID0gY3VyX2FyZyArIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgZm9yICctLWluZm8nICovCisgICAgICAgIGlmICghc3RyY21wKCpjdXJfYXJnLCAiLS1pbmZvIikpIHsKKyAgICAgICAgICAgIHNob3dfdXNhZ2UgPSAwOworICAgICAgICAgICAgc2hvd19pbmZvID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAvKiBPdGhlciBvcHRpb25zICovCisgICAgICAgIGlmICghc3RyY21wKCpjdXJfYXJnLCAiLS1uby1zZXF1ZW50aWFsIikpIHsKKyAgICAgICAgICAgIGRvX3NjYW5fZHJpdmVzID0gZG9fbm90aGluZzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0cmNtcCgqY3VyX2FyZywgIi0tc2FmZS1ob29rcyIpKSB7CisgICAgICAgICAgICBkb193YWxrX3NhZmVfaG9va3MgPSB3YWxrX3NhZmVfaG9va3M7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAoKmN1cl9hcmcsICItLW1iZnRzIikpIHsKKyAgICAgICAgICAgIGRvX3NjYW5fbWJmdHMgPSBzY2FuX21iZnRzOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGZvciBpbnZhbGlkIG9wdGlvbiAqLworICAgICAgICBpZiAoIW1lbWNtcCgqY3VyX2FyZywgIi0tIiwgc2l6ZW9mICItLSIgLSAxKSkgeworICAgICAgICAgICAgcHV0cygiSW52YWxpZCBvcHRpb24hIik7CisgICAgICAgICAgICBzaG93X3VzYWdlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgJ2RldGVjdGVkX2NtZCcgaWYgaXQncyBudWxsICovCisgICAgICAgIGlmICghZGV0ZWN0ZWRfY21kKQorICAgICAgICAgIGRldGVjdGVkX2NtZCA9IGN1cl9hcmc7CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICBpZiAoc2hvd191c2FnZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgdXNhZ2VfdGV4dCk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgZm91bmQgPSAwOworICAgIGZvdW5kICs9IGRvX3dhbGtfc2FmZV9ob29rcygpOworICAgIGZvdW5kICs9IGRvX3NjYW5fbWJmdHMoKTsKKyAgICBmb3VuZCArPSBkb19zY2FuX2RyaXZlcygpOworCisgICAgY21kID0gZm91bmQgPyBkZXRlY3RlZF9jbWQgOiBub3RfZGV0ZWN0ZWRfY21kOworICAgIGlmIChjbWQgJiYgKmNtZCkKKyAgICAgIGJvb3RfYXJncyhjbWQpOworCisgICAgcmV0dXJuIDA7CisgIH0KKworc3RhdGljIGNvbnN0IHNfbWRpICogaW5zdGFsbGF0aW9uX2NoZWNrKGludCBkcml2ZSkgeworICAgIGNvbTMyc3lzX3QgcGFyYW1zLCByZXN1bHRzOworICAgIGludCBmb3VuZDsKKworICAgIC8qIFNldCBwYXJhbWV0ZXJzIGZvciBJTlQgMHgxMyBjYWxsICovCisgICAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZiBwYXJhbXMpOworICAgIHBhcmFtcy5lYXgud1swXSA9IE1fR0VUX0RSSVZFX1BBUkFNUyA8PCA4OworICAgIHBhcmFtcy5lZHgud1swXSA9IGRyaXZlOworICAgIC8qICdNRScgJ01EJyAnSVMnICdLPycgKi8KKyAgICBwYXJhbXMuZWF4LndbMV0gPSAweDQ1NEQ7CisgICAgcGFyYW1zLmVjeC53WzFdID0gMHg0NDREOworICAgIHBhcmFtcy5lZHgud1sxXSA9IDB4NTM0OTsKKyAgICBwYXJhbXMuZWJ4LndbMV0gPSAweDNGNEI7CisKKyAgICAvKiBQZXJmb3JtIHRoZSBjYWxsICovCisgICAgX19pbnRjYWxsKDB4MTMsICZwYXJhbXMsICZyZXN1bHRzKTsKKworICAgIC8qIENoZWNrIHJlc3VsdCAqLworICAgIGZvdW5kID0gKAorICAgICAgICAvKiAnIU0nICdFTScgJ0RJJyAnU0snICovCisgICAgICAgIHJlc3VsdHMuZWF4LndbMV0gPT0gMHg0RDIxICYmCisgICAgICAgIHJlc3VsdHMuZWN4LndbMV0gPT0gMHg0RDQ1ICYmCisgICAgICAgIHJlc3VsdHMuZWR4LndbMV0gPT0gMHg0OTQ0ICYmCisgICAgICAgIHJlc3VsdHMuZWJ4LndbMV0gPT0gMHg0QjUzCisgICAgICApOworCisgICAgaWYgKGZvdW5kKQorICAgICAgcmV0dXJuIE1LX1BUUihyZXN1bHRzLmVzLCByZXN1bHRzLmVkaS53WzBdKTsKKworICAgIHJldHVybiBOVUxMOworICB9CisKK3N0YXRpYyBpbnQgc2Nhbl9kcml2ZXModm9pZCkgeworICAgIGludCBmb3VuZCwgZHJpdmU7CisgICAgY29uc3Qgc19tZGkgKiBtZGk7CisKKyAgICBmb3IgKGZvdW5kID0gZHJpdmUgPSAwOyBkcml2ZSA8PSAweEZGOyArK2RyaXZlKSB7CisgICAgICAgIG1kaSA9IGluc3RhbGxhdGlvbl9jaGVjayhkcml2ZSk7CisgICAgICAgIGlmICghbWRpKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG1lbWRpc2tfaW5mbyhtZGkpOworICAgICAgICArK2ZvdW5kOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgIHJldHVybiBmb3VuZDsKKyAgfQorCitzdGF0aWMgaW50IHdhbGtfc2FmZV9ob29rcyh2b2lkKSB7CisgICAgc3RhdGljIGNvbnN0IHVfc2Vnb2ZmICogY29uc3QgaW50MTMgPSAodm9pZCAqKSBNX0lOVDEzSDsKKyAgICBjb25zdCB2b2lkICogYWRkcjsKKyAgICBpbnQgZm91bmQ7CisgICAgY29uc3Qgc19zYWZlX2hvb2sgKiBob29rOworICAgIGNvbnN0IHNfbWRpICogbWRpOworCisgICAgLyogSU5UIDB4MTMgdmVjdG9yICovCisgICAgYWRkciA9IE1LX1BUUihpbnQxMy0+c2VnX29mZi5zZWdtZW50LCBpbnQxMy0+c2VnX29mZi5vZmZzZXQpOworICAgIGZvdW5kID0gMDsKKyAgICB3aGlsZSAoYWRkcikgeworICAgICAgICBob29rID0gaXNfc2FmZV9ob29rKGFkZHIpOworICAgICAgICBpZiAoIWhvb2spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbWRpID0gaXNfbWVtZGlza19ob29rKGhvb2spOworICAgICAgICBpZiAobWRpKSB7CisgICAgICAgICAgICBtZW1kaXNrX2luZm8obWRpKTsKKyAgICAgICAgICAgICsrZm91bmQ7CisgICAgICAgICAgfQorCisgICAgICAgIGFkZHIgPSBNS19QVFIoCisgICAgICAgICAgICBob29rLT5vbGRfaG9vay5zZWdfb2ZmLnNlZ21lbnQsCisgICAgICAgICAgICBob29rLT5vbGRfaG9vay5zZWdfb2ZmLm9mZnNldAorICAgICAgICAgICk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIHJldHVybiBmb3VuZDsKKyAgfQorCitzdGF0aWMgY29uc3Qgc19zYWZlX2hvb2sgKiBpc19zYWZlX2hvb2soY29uc3Qgdm9pZCAqIGFkZHIpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtYWdpY1tdID0gIiRJTlQxM1NGIjsKKyAgICBjb25zdCBzX3NhZmVfaG9vayAqIGNvbnN0IHRlc3QgPSBhZGRyOworCisgICAgaWYgKG1lbWNtcCh0ZXN0LT5zaWduYXR1cmUsIG1hZ2ljLCBzaXplb2YgbWFnaWMgLSAxKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHRlc3Q7CisgIH0KKworc3RhdGljIGNvbnN0IHNfbWRpICogaXNfbWVtZGlza19ob29rKGNvbnN0IHNfc2FmZV9ob29rICogaG9vaykgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIG1hZ2ljW10gPSAiTUVNRElTSyI7CisgICAgY29uc3Qgc19tYmZ0ICogbWJmdDsKKworICAgIGlmIChtZW1jbXAoaG9vay0+dmVuZG9yLCBtYWdpYywgc2l6ZW9mIG1hZ2ljIC0gMSkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIEFuIG1CRlQgaXMgYWx3YXlzIGFsaWduZWQgKi8KKyAgICBtYmZ0ID0gTUtfUFRSKGhvb2stPm1iZnQgPj4gNCwgMCk7CisgICAgcmV0dXJuICZtYmZ0LT5tZGk7CisgIH0KKworc3RhdGljIGludCBzY2FuX21iZnRzKHZvaWQpIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgKiBjb25zdCBmcmVlX2Jhc2VfbWVtID0gKHZvaWQgKikgTV9GUkVFQkFTRU1FTTsKKyAgICBzdGF0aWMgY29uc3Qgdm9pZCAqIGNvbnN0IHRvcCA9ICh2b2lkICopIE1fVE9QOworICAgIGNvbnN0IHZvaWQgKiBhZGRyOworICAgIGNvbnN0IHNfbWJmdCAqIG1iZnQ7CisgICAgaW50IGZvdW5kOworCisgICAgZm91bmQgPSAwOworICAgIGZvciAoYWRkciA9IE1LX1BUUigqZnJlZV9iYXNlX21lbSA8PCA0LCAwKTsgYWRkciA8IHRvcDsgYWRkciArPSAxIDw8IDQpIHsKKyAgICAgICAgaWYgKCEobWJmdCA9IGlzX21iZnQoYWRkcikpKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG1lbWRpc2tfaW5mbygmbWJmdC0+bWRpKTsKKyAgICAgICAgKytmb3VuZDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICByZXR1cm4gZm91bmQ7CisgIH0KKworc3RhdGljIGNvbnN0IHNfbWJmdCAqIGlzX21iZnQoY29uc3Qgdm9pZCAqIGFkZHIpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtYWdpY1tdID0gIm1CRlQiOworICAgIGNvbnN0IHNfbWJmdCAqIGNvbnN0IHRlc3QgPSBhZGRyOworICAgIGNvbnN0IHVpbnQ4X3QgKiBwdHIsICogZW5kOworICAgIHVpbnQ4X3QgY2hrc3VtOworCisgICAgaWYgKG1lbWNtcCh0ZXN0LT5hY3BpLnNpZ25hdHVyZSwgbWFnaWMsIHNpemVvZiBtYWdpYyAtIDEpKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAodGVzdC0+YWNwaS5sZW5ndGggIT0gc2l6ZW9mICp0ZXN0KQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBlbmQgPSAodm9pZCAqKSAodGVzdCArIDEpOworICAgIGNoa3N1bSA9IDA7CisgICAgZm9yIChwdHIgPSBhZGRyOyBwdHIgPCBlbmQ7ICsrcHRyKQorICAgICAgY2hrc3VtICs9ICpwdHI7CisgICAgaWYgKGNoa3N1bSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogTG9va3MgbGlrZSBpdCdzIGFuIG1CRlQhICovCisgICAgcmV0dXJuIHRlc3Q7CisgIH0KKworc3RhdGljIGludCBkb19ub3RoaW5nKHZvaWQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCitzdGF0aWMgdm9pZCBtZW1kaXNrX2luZm8oY29uc3Qgc19tZGkgKiBtZGkpIHsKKyAgICBjb25zdCBjaGFyICogY21kbGluZTsKKworICAgIGlmICghc2hvd19pbmZvKQorICAgICAgcmV0dXJuOworCisgICAgY21kbGluZSA9IE1LX1BUUigKKyAgICAgICAgbWRpLT5jbWRsaW5lLnNlZ19vZmYuc2VnbWVudCwKKyAgICAgICAgbWRpLT5jbWRsaW5lLnNlZ19vZmYub2Zmc2V0CisgICAgICApOworICAgIHByaW50ZigKKyAgICAgICAgIkZvdW5kIE1FTURJU0sgdmVyc2lvbiAldS4lMDJ1OlxuIgorICAgICAgICAiICBkaXNrYnVmID09IDB4JTA4WCwgZGlza3NpemUgPT0gJXUgc2VjdG9yc1xuIgorICAgICAgICAiICBib290bG9hZGVyaWQgPT0gMHglMDJYICglcyksXG4iCisgICAgICAgICIgIGNtZGxpbmU6ICVzXG4iLAorICAgICAgICBtZGktPnZlcnNpb25fbWFqb3IsCisgICAgICAgIG1kaS0+dmVyc2lvbl9taW5vciwKKyAgICAgICAgbWRpLT5kaXNrYnVmLAorICAgICAgICBtZGktPmRpc2tzaXplLAorICAgICAgICBtZGktPmJvb3Rsb2FkZXJpZCwKKyAgICAgICAgYm9vdGxvYWRlcm5hbWUobWRpLT5ib290bG9hZGVyaWQpLAorICAgICAgICBjbWRsaW5lCisgICAgICApOworICAgIHJldHVybjsKKyAgfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNvcHlyaWdodCBILiBQZXRlciBBbnZpbiAqLworc3RhdGljIHZvaWQgYm9vdF9hcmdzKGNoYXIgKiphcmdzKQoreworICAgIGludCBsZW4gPSAwLCBhID0gMDsKKyAgICBjaGFyICoqcHA7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIGMsICpxLCAqc3RyOworCisgICAgZm9yIChwcCA9IGFyZ3M7ICpwcDsgcHArKykKKwlsZW4gKz0gc3RybGVuKCpwcCkgKyAxOworCisgICAgcSA9IHN0ciA9IGFsbG9jYShsZW4pOworICAgIGZvciAocHAgPSBhcmdzOyAqcHA7IHBwKyspIHsKKwlwID0gKnBwOworCXdoaWxlICgoYyA9ICpwKyspKQorCSAgICAqcSsrID0gYzsKKwkqcSsrID0gJyAnOworCWEgPSAxOworICAgIH0KKyAgICBxIC09IGE7CisgICAgKnEgPSAnXDAnOworCisgICAgaWYgKCFzdHJbMF0pCisJc3lzbGludXhfcnVuX2RlZmF1bHQoKTsKKyAgICBlbHNlCisJc3lzbGludXhfcnVuX2NvbW1hbmQoc3RyKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjb3B5cmlnaHQgSC4gUGV0ZXIgQW52aW4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpib290bG9hZGVybmFtZSh1aW50OF90IGlkKQoreworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXVpbnQ4X3QgaWQsIG1hc2s7CisJY29uc3QgY2hhciAqbmFtZTsKKyAgICB9ICpscCwgbGlzdFtdID0geworCXsweDAwLCAweGYwLCAiTElMTyJ9LCAKKwl7MHgxMCwgMHhmMCwgIkxPQURMSU4ifSwKKwl7MHgzMSwgMHhmZiwgIlNZU0xJTlVYIn0sCisJezB4MzIsIDB4ZmYsICJQWEVMSU5VWCJ9LAorCXsweDMzLCAweGZmLCAiSVNPTElOVVgifSwKKwl7MHgzNCwgMHhmZiwgIkVYVExJTlVYIn0sCisJezB4MzAsIDB4ZjAsICJTeXNsaW51eCBmYW1pbHkifSwKKwl7MHg0MCwgMHhmMCwgIkV0aGVyYm9vdCJ9LAorCXsweDUwLCAweGYwLCAiRUxJTE8ifSwKKwl7MHg3MCwgMHhmMCwgIkdyVUIifSwKKwl7MHg4MCwgMHhmMCwgIlUtQm9vdCJ9LAorCXsweEEwLCAweGYwLCAiR3VqaW4ifSwKKwl7MHhCMCwgMHhmMCwgIlFlbXUifSwKKwl7MHgwMCwgMHgwMCwgInVua25vd24ifQorICAgIH07CisKKyAgICBmb3IgKGxwID0gbGlzdDs7IGxwKyspIHsKKwlpZiAoKChpZCBeIGxwLT5pZCkgJiBscC0+bWFzaykgPT0gMCkKKwkgICAgcmV0dXJuIGxwLT5uYW1lOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9pZnBsb3AuYyBiL2NvbTMyL21vZHVsZXMvaWZwbG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwMmUyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvaWZwbG9wLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDEwIEdlcnQgSHVsc2VsbWFucyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGlmcGxvcC5jCisgKgorICogVGhpcyBDT00zMiBtb2R1bGUgZGV0ZWN0cyBpZiB0aGUgUExvUCBCb290IE1hbmFnZXIgd2FzIHVzZWQgdG8gYm9vdCBhIENEUk9NCisgKiBkcml2ZSBvciBVU0IgZHJpdmUsIGJ5IGNoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIFBMb1AgSU5UMTNoIGhvb2suCisgKgorICogVXNhZ2U6ICAgIGlmcGxvcC5jMzIgWzxwbG9wX2RldGVjdGVkPl0gLS0gWzxwbG9wX25vdF9kZXRlY3RlZD5dCisgKiBFeGFtcGxlczogaWZwbG9wLmMzMiBtZW51LmMzMiBhbm90aGVyLmNmZyAtLSBwbHBidCBoaWRkZW51c2IgdXNiMT0yCisgKiAgICAgICAgICAgICAgWW91IG5lZWQgdG8gcmVtb3ZlIHRoZSAiLmJpbiIgZXh0ZW5zaW9uIG9mIHRoZSBwbHBidC5iaW4gZmlsZQorICogICAgICAgICAgICAgIGlmIHlvdSB1c2UgaXQgdGhpcyB3YXkuCisgKiAgICAgICAgICAgaWZwbG9wLmMzMiBwbG9wX2RldGVjdGVkIC0tIHBsb3Bfbm90X2RldGVjdGVkCisgKgorICogQSBwb3NzaWJsZSBjb25maWcgZmlsZSBjb3VsZCBiZToKKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBERUZBVUxUIHBsb3BjaGVjaworICoKKyAqICAjIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgUExvUCAocnVuIGJ5IGRlZmF1bHQpCisgKiAgIyAgIFdoZW4gUExvUCBJTlQxM2ggaG9vayBpcyBmb3VuZCwgcnVuIHRoZSBmaXJzdCBjb21tYW5kIChwbG9wX2RldGVjdGVkKQorICogICMgICBXaGVuIFBMb1AgSU5UMTNoIGhvb2sgaXNuJ3QgZm91bmQsIHJ1biB0aGUgc2Vjb25kIGNvbW1hbmQgKHBsb3Bfbm90X2RldGVjdGVkKQorICogIExBQkVMIHBsb3BjaGVjaworICogICAgICBDT00zMiBpZnBsb3AuYzMyCisgKiAgICAgIEFQUEVORCBwbG9wX2RldGVjdGVkIC0tIHBsb3Bfbm90X2RldGVjdGVkCisgKgorICogICMgV2hlbiBQTG9QIElOVDEzaCBob29rIHdhcyBmb3VuZCwgYm9vdCB0aGUgbWVudSBzeXN0ZW0uCisgKiAgIyBQTG9QIGNhbiBoYXZlIGFkZGVkIFVTQiAyLjAgc3BlZWQsIHNvIHRoZSBlbnRyaWVzIHdlIHdhbnQgdG8gYm9vdAorICogICMgd2lsbCBiZSByZWFkIGZyb20gZGlzayBtdWNoIGZhc3RlciAoc3VwcG9zaW5nIHRoYXQgd2UgaGF2ZSBhIEJJT1MKKyAqICAjIHRoYXQgb25seSBzdXBwb3J0cyBVU0IgMS4xIHNwZWVkLCBidXQgYSBtb2JvIHdpdGggVVNCIDIuMCBjb250cm9sbGVycykuCisgKiAgTEFCRUwgcGxvcF9kZXRlY3RlZAorICogICAgICBDT00zMiBtZW51LmMzMgorICogICAgICBBUFBFTkQgYW5vdGhlci5jZmcKKyAqCisgKiAgIyBQTG9QIElOVDEzaCBob29rIHdhc24ndCBmb3VuZCwgc28gd2UgYm9vdCBQTG9QLCBzbyBpdCBjYW4gYWRkIFVTQiAyLjAgc3VwcG9ydAorICogICMgV2hlbiB1c2luZyAiTElOVVggcGxwYnQuYmluIiwgeW91IGRvbid0IG5lZWQgdG8gcmVtb3ZlIHRoZSAuYmluIGV4dGVuc2lvbi4KKyAqICBMQUJFTCBwbG9wX25vdF9kZXRlY3RlZAorICogICAgICBMSU5VWCBwbHBidC5iaW4KKyAqICAgICAgQVBQRU5EIGhpZGRlbnVzYiB1c2IxPTIKKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBXaHkgaXMvY2FuIHRoaXMgbW9kdWxlIGJlIHVzZWZ1bD8KKyAqCisgKiBZb3UgbWF5IHdhbnQgdG8gYm9vdCBQTG9QIGJ5IGRlZmF1bHQgZnJvbSBTeXNsaW51eCB3aGVuIHlvdSBib290IGZyb20geW91cgorICogVVNCIHN0aWNrL2RyaXZlOgorICogICAxLiBQTG9QIGNhbiB1cGdyYWRlIFVTQiAxLjEgc3BlZWQgb2ZmZXJlZCBieSB0aGUgQklPUyB0byBVU0IgMi4wIHNwZWVkCisgKiAgICAgIGlmIHlvdSBoYXZlIFVTQiAyLjAgY29udHJvbGxlcnMgb24geW91ciBtb2JvLgorICogICAyLiBTb21lIEJJT1NlcyBvbmx5IGNhbiBhY2Nlc3MgdGhlIGZpcnN0IDEyOEdpQiAoMTM3R0IpIG9uIFVTQiBkcml2ZXMsIHdoaWxlCisgKiAgICAgIGludGVybmFsIGhhcmQgZHJpdmVzIGRvbid0IG5lY2Vzc2FyaWx5IHN1ZmZlciBmcm9tIHRoaXMgMTI4R2lCIHByb2JsZW0uCisgKiAgICAgIFVzaW5nIFBMb1BzIFVTQiBjYXBhYmlsaXRpZXMsIHlvdSBjYW4gYWNjZXNzIHRoZSB3aG9sZSBkcml2ZS4KKyAqCisgKiBXaGVuIHlvdSBzZWxlY3QgdGhlICJVU0IiIGVudHJ5IGluIFBMb1AsIGl0IHdpbGwgYm9vdCB5b3VyIFVTQiBzdGljay9kcml2ZQorICogYWdhaW4gYW5kIGl0IHdpbGwgYm9vdCBQTG9QIGFnYWluIHdoZW4geW91IGhhdmUgc2V0IGJvb3RpbmcgUExvUCBhcyBERUZBVUxUCisgKiBib290IG9wdGlvbiBpbiB5b3VyIFN5c2xpbnV4IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqCisgKiBCeSB1c2luZyBpZnBsb3AuYzMyIHlvdSBjYW4gc3BlY2lmeSB3aGljaCBhY3Rpb24geW91IHdhbnQgdG8gZG8gdGhlIHNlY29uZAorICogdGltZSB5b3VyIFVTQiBzdGljay9kcml2ZSBpcyBib290ZWQuIFNvIHlvdSBjYW4gbG9hZCBhbm90aGVyIGNvbmZpZyBmaWxlIG9yCisgKiBib290IGEgbGFyZ2UgaGFyZCBkaXNrIGltYWdlIG9yIHdoYXRldmVyIHlvdSB3YW50LgorICoKKyAqIFBMb1AgQm9vdCBNYW5hZ2VyIHdlYnNpdGU6IGh0dHA6Ly93d3cucGxvcC5hdC9lbi9ib290bWFuYWdlci5odG1sCisgKi8KKworI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorCitzdGF0aWMgYm9vbCBwbG9wX0lOVDEzaF9jaGVjayh2b2lkKQoreworICAgIGNvbTMyc3lzX3QgaW5yZWdzLCBvdXRyZWdzOworCisgICAgLyogUHJlcGFyZSB0aGUgcmVnaXN0ZXIgc2V0ICovCisgICAgbWVtc2V0KCZpbnJlZ3MsIDAsIHNpemVvZiBpbnJlZ3MpOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBQTG9QIGFscmVhZHkgaGFzIGJvb3RlZCBhIENEUk9NIG9yIFVTQiBkcml2ZSBieSBjaGVja2luZworICAgICAqIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIFBMb1AgSU5UMTNoIGhvb2suCisgICAgICoKKyAgICAgKiBUaGUgZm9sbG93aW5nIGFzc2VtYmx5IGNvZGUgKE5BU00pIGNhbiBkZXRlY3QgdGhlIFBMb1AgSU5UMTNoIGhvb2s6CisgICAgICoKKyAgICAgKiAgIG1vdiBlYXgsJ1BvTFAnICA7IFJldmVyc2Ugb2YgJ1BMb1AnCisgICAgICogICBtb3YgZWJwLCdES0hDJyAgOyBSZXZlcnNlIG9mICdDSEtEJworICAgICAqICAgaW50IDEzaAorICAgICAqICAgY21wIGVheCwnIHNleScgIDsgUmV2ZXJzZSBvZiAneWVzICcKKyAgICAgKiAgIGp6IHBsb3BfSU5UMTNoX2FjdGl2ZQorICAgICAqLworCisgICAgaW5yZWdzLmVheC5sID0gMHg1MDRjNmY1MDsJLyogIlBMb1AiICovCisgICAgaW5yZWdzLmVicC5sID0gMHg0MzQ4NGI0NDsJLyogIkNIS0QiICovCisKKyAgICBfX2ludGNhbGwoMHgxMywgJmlucmVncywgJm91dHJlZ3MpOworCisgICAgLyogZWF4IHdpbGwgY29udGFpbiAieWVzICIgaWYgUExvUCBJTlQxM2ggaG9vayBpcyBhdmFpbGFibGUgKi8KKyAgICBpZiAob3V0cmVncy5lYXgubCA9PSAweDc5NjU3MzIwKQorCXJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiBYWFg6IHRoaXMgcmVhbGx5IHNob3VsZCBiZSBsaWJyYXJpemVkICovCitzdGF0aWMgdm9pZCBib290X2FyZ3MoY2hhciAqKmFyZ3MpCit7CisgICAgaW50IGxlbiA9IDAsIGEgPSAwOworICAgIGNoYXIgKipwcDsKKyAgICBjb25zdCBjaGFyICpwOworICAgIGNoYXIgYywgKnEsICpzdHI7CisKKyAgICBmb3IgKHBwID0gYXJnczsgKnBwOyBwcCsrKQorCWxlbiArPSBzdHJsZW4oKnBwKSArIDE7CisKKyAgICBxID0gc3RyID0gYWxsb2NhKGxlbik7CisgICAgZm9yIChwcCA9IGFyZ3M7ICpwcDsgcHArKykgeworCXAgPSAqcHA7CisJd2hpbGUgKChjID0gKnArKykpCisJICAgICpxKysgPSBjOworCSpxKysgPSAnICc7CisJYSA9IDE7CisgICAgfQorICAgIHEgLT0gYTsKKyAgICAqcSA9ICdcMCc7CisKKyAgICBpZiAoIXN0clswXSkKKwlzeXNsaW51eF9ydW5fZGVmYXVsdCgpOworICAgIGVsc2UKKwlzeXNsaW51eF9ydW5fY29tbWFuZChzdHIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGNoYXIgKiphcmdzWzJdOworICAgIGludCBhcmcgPSAwOworCisgICAgaWYgKGFyZ2MpCisJYXJnKys7CisgICAgYXJnc1swXSA9ICZhcmd2W2FyZ107CisgICAgYXJnc1sxXSA9IE5VTEw7CisgICAgd2hpbGUgKGFyZyA8IGFyZ2MpIHsKKwlpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLSIpKSB7CisJICAgIGFyZ3ZbYXJnXSA9IE5VTEw7CisJICAgIGFyZ3NbMV0gPSAmYXJndlthcmcgKyAxXTsKKwkgICAgYnJlYWs7CisJfQorCWFyZysrOworICAgIH0KKyAgICBpZiAoYXJnc1sxXSAhPSBOVUxMKSB7CisJYm9vdF9hcmdzKHBsb3BfSU5UMTNoX2NoZWNrKCk/IGFyZ3NbMF0gOiBhcmdzWzFdKTsKKyAgICB9IGVsc2UgeworCWZwcmludGYoc3RkZXJyLAorCQkiVXNhZ2U6ICAgaWZwbG9wLmMzMiBbPHBsb3BfZGV0ZWN0ZWQ+XSAtLSBbPHBsb3Bfbm90X2RldGVjdGVkPl1cbiIKKwkJIkV4YW1wbGU6IGlmcGxvcC5jMzIgbWVudS5jMzIgYW5vdGhlci5jZmcgLS0gcGxwYnQgaGlkZGVudXNiIHVzYjE9MlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL2tiZG1hcC5jIGIvY29tMzIvbW9kdWxlcy9rYmRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM0MDAxCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9rYmRtYXAuYwpAQCAtMCwwICsxLDUyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbG9hZGZpbGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9rZXlib2FyZC5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqbXNnKQoreworICAgIGZwdXRzKG1zZywgc3RkZXJyKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBjb25zdCBzdHJ1Y3Qgc3lzbGludXhfa2V5Ym9hcmRfbWFwICpjb25zdCBrbWFwID0gc3lzbGludXhfa2V5Ym9hcmRfbWFwKCk7CisgICAgc2l6ZV90IG1hcF9zaXplOworICAgIHZvaWQgKmtiZG1hcDsKKworICAgIGlmIChhcmdjICE9IDIpIHsKKwllcnJvcigiVXNhZ2U6IGtiZG1hcCBtYXBmaWxlXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoa21hcC0+dmVyc2lvbiAhPSAxKSB7CisJZXJyb3IoIlN5c2xpbnV4IGNvcmUgdmVyc2lvbiBtaXNtYXRjaFxuIik7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGxvYWRmaWxlKGFyZ3ZbMV0sICZrYmRtYXAsICZtYXBfc2l6ZSkpIHsKKwllcnJvcigiS2V5Ym9hcmQgbWFwIGZpbGUgbG9hZCBlcnJvclxuIik7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKG1hcF9zaXplICE9IGttYXAtPmxlbmd0aCkgeworCWVycm9yKCJLZXlib2FyZCBtYXAgZmlsZSBmb3JtYXQgZXJyb3JcbiIpOworCXJldHVybiAxOworICAgIH0KKworICAgIG1lbWNweShrbWFwLT5tYXAsIGtiZG1hcCwgbWFwX3NpemUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9rb250cm9uX3dkdC5jIGIvY29tMzIvbW9kdWxlcy9rb250cm9uX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMWQyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL2tvbnRyb25fd2R0LmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiAga2VtcGxkX3dkdC5jIC0gS29udHJvbiBQTEQgd2F0Y2hkb2cgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoYykgMjAxMCBLb250cm9uIEVtYmVkZGVkIE1vZHVsZXMgR21iSAorICogIEF1dGhvcjogTWljaGFlbCBCcnVubmVyIDxtaWNoYWVsLmJydW5uZXJAa29udHJvbi5jb20+CisgKiAgQXV0aG9yOiBFcndhbiBWZWx1IDxlcndhbi52ZWx1QHpvZGlhY2Flcm9zcGFjZS5jb20+CisgKgorICogIE5vdGU6IEZyb20gdGhlIFBMRCB3YXRjaGRvZyBwb2ludCBvZiB2aWV3IHRpbWVvdXQgYW5kIHByZXRpbWVvdXQgYXJlCisgKiAgICAgICAgZGVmaW5lZCBkaWZmZXJlbnRseSB0aGFuIGluIHRoZSBrZXJuZWwuCisgKiAgICAgICAgRmlyc3QgdGhlIHByZXRpbWVvdXQgc3RhZ2UgcnVucyBvdXQgYmVmb3JlIHRoZSB0aW1lb3V0IHN0YWdlIGdldHMKKyAqICAgICAgICBhY3RpdmUuIFRoaXMgaGFzIHRvIGJlIGtlcHQgaW4gbWluZC4KKyAqCisgKiAgS2VybmVsL0FQSTogICAgICAgICAgICAgICAgICAgICBQLS0tLS18IHByZXRpbWVvdXQKKyAqICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVQgdGltZW91dAorICogIFdhdGNoZG9nOiAgICAgfC0tLS0tLS0tLS0tLS0tLS0tUCAgICAgICBwcmV0aW1lb3V0X3N0YWdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS1UIHRpbWVvdXRfc3RhZ2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9pby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlICJrb250cm9uX3dkdC5oIgorCitzdHJ1Y3Qga2VtcGxkX2RldmljZV9kYXRhICBwbGQ7CitzdHJ1Y3Qga2VtcGxkX3dhdGNoZG9nX2RhdGEgd2R0OwordWludDhfdCBzdGF0dXM7CitjaGFyIGRlZmF1bHRfbGFiZWxbMjU1XTsKKworLyogRGVmYXVsdCBUaW1lb3V0IGlzIDYwc2VjICovCisjZGVmaW5lIFRJTUVPVVQgNjAKKyNkZWZpbmUgUFJFVElNRU9VVCAwCisKKyNkZWZpbmUgZG9fZGl2KG4sYmFzZSkgKHsgXAorCQlpbnQgX19yZXM7IFwKKwkJX19yZXMgPSAoKHVuc2lnbmVkIGxvbmcpIG4pICUgKHVuc2lnbmVkKSBiYXNlOyBcCisJCW4gPSAoKHVuc2lnbmVkIGxvbmcpIG4pIC8gKHVuc2lnbmVkKSBiYXNlOyBcCisJCV9fcmVzOyB9KQorCisKKy8qIEJhc2ljIFdyYXBwZXJzIHRvIGdldCBjb2RlIGFzIGxlc3MgY2hhbmdlZCBhcyBwb3NzaWJsZSAqLwordm9pZCBpb3dyaXRlOCh1aW50OF90IHZhbCwgdWludDE2X3QgYWRkcikgeyBvdXRiKHZhbCxhZGRyKTsgfQordm9pZCBpb3dyaXRlMTYodWludDE2X3QgdmFsLCB1aW50MTZfdCBhZGRyKSB7IG91dHcodmFsLGFkZHIpOyB9Cit2b2lkIGlvd3JpdGUzMih1aW50MzJfdCB2YWwsIHVpbnQxNl90IGFkZHIpIHsgb3V0bCh2YWwsYWRkcik7fQordWludDhfdCBpb3JlYWQ4KHVpbnQxNl90IGFkZHIpICAgeyByZXR1cm4gaW5iKGFkZHIpO30KK3VpbnQxNl90IGlvcmVhZDE2KHVpbnQxNl90IGFkZHIpIHsgcmV0dXJuIGludyhhZGRyKTt9Cit1aW50MzJfdCBpb3JlYWQzMih1aW50MzJfdCBhZGRyKSB7IHJldHVybiBpbmwoYWRkcik7fQorCisKKy8qKgorICoga2VtcGxkX3NldF9pbmRleCAtICBjaGFuZ2UgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgaW5kZXggb2YgdGhlIFBMRAorICogQHBsZDogICBrZW1wbGRfZGV2aWNlX2RhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIFBMRAorICogQGluZGV4OiByZWdpc3RlciBpbmRleCBvbiB0aGUgY2hpcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgcmVnaXN0ZXIgaW5kZXggb2YgdGhlIFBMRC4KKyAqLwordm9pZCBrZW1wbGRfc2V0X2luZGV4KHN0cnVjdCBrZW1wbGRfZGV2aWNlX2RhdGEgKnBsZCwgdWludDhfdCBpbmRleCkKK3sKKyAgICAgICAgaWYgKHBsZC0+bGFzdF9pbmRleCAhPSBpbmRleCkgeworICAgICAgICAgICAgICAgIGlvd3JpdGU4KGluZGV4LCBwbGQtPmlvX2luZGV4KTsKKyAgICAgICAgICAgICAgICBwbGQtPmxhc3RfaW5kZXggPSBpbmRleDsKKyAgICAgICAgfQorfQorCisKK3VpbnQ4X3Qga2VtcGxkX3JlYWQ4KHN0cnVjdCBrZW1wbGRfZGV2aWNlX2RhdGEgKnBsZCwgdWludDhfdCBpbmRleCkgeworICAgICAgICBrZW1wbGRfc2V0X2luZGV4KHBsZCwgaW5kZXgpOworICAgICAgICByZXR1cm4gaW9yZWFkOChwbGQtPmlvX2RhdGEpOworfQorCisKK3ZvaWQga2VtcGxkX3dyaXRlOChzdHJ1Y3Qga2VtcGxkX2RldmljZV9kYXRhICpwbGQsIHVpbnQ4X3QgaW5kZXgsIHVpbnQ4X3QgZGF0YSkgeworICAgICAgICBrZW1wbGRfc2V0X2luZGV4KHBsZCwgaW5kZXgpOworICAgICAgICBpb3dyaXRlOChkYXRhLCBwbGQtPmlvX2RhdGEpOworfQorCisKK3VpbnQxNl90IGtlbXBsZF9yZWFkMTYoc3RydWN0IGtlbXBsZF9kZXZpY2VfZGF0YSAqcGxkLCB1aW50OF90IGluZGV4KQoreworICAgICAgICByZXR1cm4ga2VtcGxkX3JlYWQ4KHBsZCwgaW5kZXgpIHwga2VtcGxkX3JlYWQ4KHBsZCwgaW5kZXgrMSkgPDwgODsKK30KKworCit2b2lkIGtlbXBsZF93cml0ZTE2KHN0cnVjdCBrZW1wbGRfZGV2aWNlX2RhdGEgKnBsZCwgdWludDhfdCBpbmRleCwgdWludDE2X3QgZGF0YSkKK3sKKyAgICAgICAga2VtcGxkX3dyaXRlOChwbGQsIGluZGV4LCAodWludDhfdClkYXRhKTsKKyAgICAgICAga2VtcGxkX3dyaXRlOChwbGQsIGluZGV4KzEsICh1aW50OF90KShkYXRhPj44KSk7Cit9CisKK3VpbnQzMl90IGtlbXBsZF9yZWFkMzIoc3RydWN0IGtlbXBsZF9kZXZpY2VfZGF0YSAqcGxkLCB1aW50OF90IGluZGV4KQoreworICAgICAgICByZXR1cm4ga2VtcGxkX3JlYWQxNihwbGQsIGluZGV4KSB8IGtlbXBsZF9yZWFkMTYocGxkLCBpbmRleCsyKSA8PCAxNjsKK30KKwordm9pZCBrZW1wbGRfd3JpdGUzMihzdHJ1Y3Qga2VtcGxkX2RldmljZV9kYXRhICpwbGQsIHVpbnQ4X3QgaW5kZXgsIHVpbnQzMl90IGRhdGEpCit7CisgICAgICAgIGtlbXBsZF93cml0ZTE2KHBsZCwgaW5kZXgsICh1aW50MTZfdClkYXRhKTsKKyAgICAgICAga2VtcGxkX3dyaXRlMTYocGxkLCBpbmRleCsyLCAodWludDE2X3QpKGRhdGE+PjE2KSk7Cit9CisKK3N0YXRpYyB2b2lkIGtlbXBsZF9yZWxlYXNlX211dGV4KHN0cnVjdCBrZW1wbGRfZGV2aWNlX2RhdGEgKnBsZCkKK3sKKyAgICAgICAgaW93cml0ZTgocGxkLT5sYXN0X2luZGV4IHwgS0VNUExEX01VVEVYX0tFWSwgcGxkLT5pb19pbmRleCk7Cit9CisKK3ZvaWQgaW5pdF9zdHJ1Y3R1cmUodm9pZCkgeworCS8qIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGNhc2Ugd2Ugc3RhcnQgdGhlIHdhdGNoZG9nIG9yIGNoYW5nZQorCSAqIHRoZSBjb25maWd1cmF0aW9uICovCisJbWVtc2V0KCZ3ZHQsMCxzaXplb2Yod2R0KSk7CisJbWVtc2V0KCZwbGQsMCxzaXplb2YocGxkKSk7CisJbWVtc2V0KCZkZWZhdWx0X2xhYmVsLDAsc2l6ZW9mKGRlZmF1bHRfbGFiZWwpKTsKKyAgICAgICAgd2R0LnRpbWVvdXQgPSBUSU1FT1VUOworICAgICAgICB3ZHQucHJldGltZW91dCA9IFBSRVRJTUVPVVQ7CisgICAgICAgIHdkdC5wbGQgPSAmcGxkOworCisJcGxkLmlvX2Jhc2U9S0VNUExEX0lPUE9SVDsKKwlwbGQuaW9faW5kZXg9S0VNUExEX0lPUE9SVDsKKwlwbGQuaW9fZGF0YT1LRU1QTERfSU9EQVRBOworCXBsZC5wbGRfY2xvY2s9MzMzMzMzMzM7Cit9CisKK3N0YXRpYyBpbnQga2VtcGxkX3Byb2JlKHZvaWQpIHsKKyAgIC8qIENoZWNrIGZvciBlbXB0eSBJTyBzcGFjZSAqLworCWludCByZXQ9MDsKKwl1aW50OF90ICBpbmRleF9yZWcgPSBpb3JlYWQ4KHBsZC5pb19pbmRleCk7CisgICAgICAgIGlmICgoaW5kZXhfcmVnID09IDB4ZmYpICYmIChpb3JlYWQ4KHBsZC5pb19kYXRhKSA9PSAweGZmKSkgeworICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgZ290byBlcnJfZW1wdHlfaW87CisgICAgICAgIH0KKwlwcmludGYoIktlbXBsZCBzdHJ1Y3R1cmUgZm91bmQgYXQgMHglWCAoZGF0YSBAIDB4JVgpXG4iLHBsZC5pb19iYXNlLHBsZC5pb19kYXRhKTsKKwlyZXR1cm4gMDsKKworZXJyX2VtcHR5X2lvOgorCXByaW50ZigiTm8gSU8gRm91bmQgIVxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBrZW1wbGRfd2R0X3Byb2JlX3N0YWdlcyhzdHJ1Y3Qga2VtcGxkX3dhdGNoZG9nX2RhdGEgKndkdCkKK3sKKyAgICAgICAgc3RydWN0IGtlbXBsZF9kZXZpY2VfZGF0YSAqcGxkID0gd2R0LT5wbGQ7CisgICAgICAgIGludCBpLCByZXQ7CisgICAgICAgIHVpbnQzMl90IHRpbWVvdXQ7CisgICAgICAgIHVpbnQzMl90IHRpbWVvdXRfbWFzazsKKyAgICAgICAgc3RydWN0IGtlbXBsZF93YXRjaGRvZ19zdGFnZSAqc3RhZ2U7CisKKyAgICAgICAgd2R0LT5zdGFnZXMgPSAwOworICAgICAgICB3ZHQtPnRpbWVvdXRfc3RhZ2UgPSBOVUxMOworICAgICAgICB3ZHQtPnByZXRpbWVvdXRfc3RhZ2UgPSBOVUxMOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBLRU1QTERfV0RUX01BWF9TVEFHRVM7IGkrKykgeworCisJCXRpbWVvdXQgPSBrZW1wbGRfcmVhZDMyKHBsZCwgS0VNUExEX1dEVF9TVEFHRV9USU1FT1VUKGkpKTsKKyAgICAgICAgICAgICAgICBrZW1wbGRfd3JpdGUzMihwbGQsIEtFTVBMRF9XRFRfU1RBR0VfVElNRU9VVChpKSwgMHgwMDAwMDAwMCk7CisgICAgICAgICAgICAgICAgdGltZW91dF9tYXNrID0ga2VtcGxkX3JlYWQzMihwbGQsIEtFTVBMRF9XRFRfU1RBR0VfVElNRU9VVChpKSk7CisgICAgICAgICAgICAgICAga2VtcGxkX3dyaXRlMzIocGxkLCBLRU1QTERfV0RUX1NUQUdFX1RJTUVPVVQoaSksIHRpbWVvdXQpOworCisgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXRfbWFzayAhPSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGtlbXBsZF93YXRjaGRvZ19zdGFnZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyX2FsbG9jX3N0YWdlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlLT5udW0gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2UtPnRpbWVvdXRfbWFzayA9IH50aW1lb3V0X21hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZHQtPnN0YWdlW2ldID0gc3RhZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZHQtPnN0YWdlcysrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3NpZ24gYXZhaWxhYmxlIHN0YWdlcyB0byB0aW1lb3V0IGFuZCBwcmV0aW1lb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2R0LT5zdGFnZXMgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2R0LT50aW1lb3V0X3N0YWdlID0gc3RhZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3ZHQtPnN0YWdlcyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkdC0+cHJldGltZW91dF9zdGFnZSA9IHdkdC0+dGltZW91dF9zdGFnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2R0LT50aW1lb3V0X3N0YWdlID0gc3RhZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkdC0+c3RhZ2VbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworZXJyX2FsbG9jX3N0YWdlczoKKwlrZW1wbGRfcmVsZWFzZV9tdXRleChwbGQpOworCXByaW50ZigiQ2Fubm90IGFsbG9jYXRlIHN0YWdlc1xuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBrZW1wbGRfd2R0X2tlZXBhbGl2ZShzdHJ1Y3Qga2VtcGxkX3dhdGNoZG9nX2RhdGEgKndkdCkKK3sKKyAgICAgICAgc3RydWN0IGtlbXBsZF9kZXZpY2VfZGF0YSAqcGxkID0gd2R0LT5wbGQ7CisKKwlrZW1wbGRfd3JpdGU4KHBsZCwgS0VNUExEX1dEVF9LSUNLLCAnSycpOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtlbXBsZF93ZHRfc2V0c3RhZ2VhY3Rpb24oc3RydWN0IGtlbXBsZF93YXRjaGRvZ19kYXRhICp3ZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga2VtcGxkX3dhdGNoZG9nX3N0YWdlICpzdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24pCit7CisgICAgICAgIHN0cnVjdCBrZW1wbGRfZGV2aWNlX2RhdGEgKnBsZCA9IHdkdC0+cGxkOworICAgICAgICB1aW50OF90IHN0YWdlX2NmZzsKKworICAgICAgICBpZiAoc3RhZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgc3RhZ2VfY2ZnID0ga2VtcGxkX3JlYWQ4KHBsZCwgS0VNUExEX1dEVF9TVEFHRV9DRkcoc3RhZ2UtPm51bSkpOworICAgICAgICBzdGFnZV9jZmcgJj0gfktFTVBMRF9XRFRfU1RBR0VfQ0ZHX0FDVElPTl9NQVNLOworICAgICAgICBzdGFnZV9jZmcgfD0gKGFjdGlvbiAmIEtFTVBMRF9XRFRfU1RBR0VfQ0ZHX0FDVElPTl9NQVNLKTsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBLRU1QTERfV0RUX0FDVElPTl9SRVNFVCkKKyAgICAgICAgICAgICAgICBzdGFnZV9jZmcgfD0gS0VNUExEX1dEVF9TVEFHRV9DRkdfQVNTRVJUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RhZ2VfY2ZnICY9IH5LRU1QTERfV0RUX1NUQUdFX0NGR19BU1NFUlQ7CisKKyAgICAgICAga2VtcGxkX3dyaXRlOChwbGQsIEtFTVBMRF9XRFRfU1RBR0VfQ0ZHKHN0YWdlLT5udW0pLCBzdGFnZV9jZmcpOworICAgICAgICBzdGFnZV9jZmcgPSBrZW1wbGRfcmVhZDgocGxkLCBLRU1QTERfV0RUX1NUQUdFX0NGRyhzdGFnZS0+bnVtKSk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga2VtcGxkX3dkdF9zZXRzdGFnZXRpbWVvdXQoc3RydWN0IGtlbXBsZF93YXRjaGRvZ19kYXRhICp3ZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga2VtcGxkX3dhdGNoZG9nX3N0YWdlICpzdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0KQoreworICAgICAgICBzdHJ1Y3Qga2VtcGxkX2RldmljZV9kYXRhICpwbGQgPSB3ZHQtPnBsZDsKKyAgICAgICAgdWludDhfdCBzdGFnZV9jZmc7CisgICAgICAgIHVpbnQ4X3QgcHJlc2NhbGVyOworICAgICAgICB1aW50NjRfdCBzdGFnZV90aW1lb3V0NjQ7CisgICAgICAgIHVpbnQzMl90IHN0YWdlX3RpbWVvdXQ7CisKKyAgICAgICAgaWYgKHN0YWdlID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHByZXNjYWxlciA9IEtFTVBMRF9XRFRfUFJFU0NBTEVSXzIxQklUOworCisgICAgICAgIHN0YWdlX3RpbWVvdXQ2NCA9ICgodWludDY0X3QpdGltZW91dCpwbGQtPnBsZF9jbG9jayk7CisgICAgICAgIGRvX2RpdihzdGFnZV90aW1lb3V0NjQsIEtFTVBMRF9QUkVTQ0FMRVIocHJlc2NhbGVyKSk7CisgICAgICAgIHN0YWdlX3RpbWVvdXQgPSBzdGFnZV90aW1lb3V0NjQgJiBzdGFnZS0+dGltZW91dF9tYXNrOworCisgICAgICAgIGlmIChzdGFnZV90aW1lb3V0NjQgIT0gKHVpbnQ2NF90KXN0YWdlX3RpbWVvdXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHN0YWdlX2NmZyA9IGtlbXBsZF9yZWFkOChwbGQsIEtFTVBMRF9XRFRfU1RBR0VfQ0ZHKHN0YWdlLT5udW0pKTsKKyAgICAgICAgc3RhZ2VfY2ZnICY9IH5LRU1QTERfV0RUX1NUQUdFX0NGR19QUkVTQ0FMRVJfTUFTSzsKKyAgICAgICAgc3RhZ2VfY2ZnIHw9IEtFTVBMRF9XRFRfU1RBR0VfQ0ZHX1NFVF9QUkVTQ0FMRVIocHJlc2NhbGVyKTsKKyAgICAgICAga2VtcGxkX3dyaXRlOChwbGQsIEtFTVBMRF9XRFRfU1RBR0VfQ0ZHKHN0YWdlLT5udW0pLCBzdGFnZV9jZmcpOworICAgICAgICBrZW1wbGRfd3JpdGUzMihwbGQsIEtFTVBMRF9XRFRfU1RBR0VfVElNRU9VVChzdGFnZS0+bnVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VfdGltZW91dCk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBrZW1wbGRfd2R0X3NldHRpbWVvdXQoc3RydWN0IGtlbXBsZF93YXRjaGRvZ19kYXRhICp3ZHQpCit7CisgICAgICAgIGludCBzdGFnZV90aW1lb3V0OworICAgICAgICBpbnQgc3RhZ2VfcHJldGltZW91dDsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgaWYgKCh3ZHQtPnRpbWVvdXQgPD0gMCkgfHwKKyAgICAgICAgICAgICh3ZHQtPnByZXRpbWVvdXQgPCAwKSB8fAorICAgICAgICAgICAgKHdkdC0+cHJldGltZW91dCA+IHdkdC0+dGltZW91dCkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycl9jaGVja192YWx1ZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHdkdC0+cHJldGltZW91dCA9PSAwKSB8fCAod2R0LT5wcmV0aW1lb3V0X3N0YWdlID09IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgaWYgKHdkdC0+cHJldGltZW91dCAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJObyBwcmV0aW1lb3V0IHN0YWdlIGF2YWlsYWJsZSwgb25seSBlbmFibGluZyByZXNldCFcbiIpOworICAgICAgICAgICAgICAgIHN0YWdlX3ByZXRpbWVvdXQgPSAwOworICAgICAgICAgICAgICAgIHN0YWdlX3RpbWVvdXQgPSAgd2R0LT50aW1lb3V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YWdlX3ByZXRpbWVvdXQgPSB3ZHQtPnRpbWVvdXQgLSB3ZHQtPnByZXRpbWVvdXQ7CisgICAgICAgICAgICAgICAgc3RhZ2VfdGltZW91dCA9ICB3ZHQtPnByZXRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhZ2VfcHJldGltZW91dCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0ga2VtcGxkX3dkdF9zZXRzdGFnZWFjdGlvbih3ZHQsIHdkdC0+cHJldGltZW91dF9zdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFTVBMRF9XRFRfQUNUSU9OX05NSSk7CisgICAgICAgIH0gZWxzZSBpZiAoKHN0YWdlX3ByZXRpbWVvdXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAmJiAod2R0LT5wcmV0aW1lb3V0X3N0YWdlICE9IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0ga2VtcGxkX3dkdF9zZXRzdGFnZWFjdGlvbih3ZHQsIHdkdC0+cHJldGltZW91dF9zdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFTVBMRF9XRFRfQUNUSU9OX05PTkUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSAwOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIGdvdG8gZXJyX3NldHN0YWdlOworCisgICAgICAgIGlmIChzdGFnZV9wcmV0aW1lb3V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBrZW1wbGRfd2R0X3NldHN0YWdldGltZW91dCh3ZHQsIHdkdC0+cHJldGltZW91dF9zdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZV9wcmV0aW1lb3V0KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJfc2V0c3RhZ2U7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBrZW1wbGRfd2R0X3NldHN0YWdlYWN0aW9uKHdkdCwgd2R0LT50aW1lb3V0X3N0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFTVBMRF9XRFRfQUNUSU9OX1JFU0VUKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycl9zZXRzdGFnZTsKKworICAgICAgICByZXQgPSBrZW1wbGRfd2R0X3NldHN0YWdldGltZW91dCh3ZHQsIHdkdC0+dGltZW91dF9zdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VfdGltZW91dCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgZ290byBlcnJfc2V0c3RhZ2U7CisKKyAgICAgICAgcmV0dXJuIDA7CitlcnJfc2V0c3RhZ2U6CitlcnJfY2hlY2tfdmFsdWVzOgorICAgICAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGtlbXBsZF93ZHRfc3RhcnQoc3RydWN0IGtlbXBsZF93YXRjaGRvZ19kYXRhICp3ZHQpCit7CisgICAgICAgIHN0cnVjdCBrZW1wbGRfZGV2aWNlX2RhdGEgKnBsZCA9IHdkdC0+cGxkOworICAgICAgICB1aW50OF90IHN0YXR1czsKKworICAgICAgICBzdGF0dXMgPSBrZW1wbGRfcmVhZDgocGxkLCBLRU1QTERfV0RUX0NGRyk7CisgICAgICAgIHN0YXR1cyB8PSBLRU1QTERfV0RUX0NGR19FTkFCTEU7CisgICAgICAgIGtlbXBsZF93cml0ZTgocGxkLCBLRU1QTERfV0RUX0NGRywgc3RhdHVzKTsKKyAgICAgICAgc3RhdHVzID0ga2VtcGxkX3JlYWQ4KHBsZCwgS0VNUExEX1dEVF9DRkcpOworCisgICAgICAgIC8qIGNoZWNrIGlmIHRoZSB3YXRjaGRvZyB3YXMgZW5hYmxlZCAqLworICAgICAgICBpZiAoIShzdGF0dXMgJiBLRU1QTERfV0RUX0NGR19FTkFCTEUpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworLyogQSByZWd1bGFyIGNvbmZpZ3VyYXRpb24gZmlsZSBsb29rcyBsaWtlCisKKyAgIExBQkVMIFdEVAorICAgICAgIENPTTMyIHdkdC5jMzIKKyAgICAgICBBUFBFTkQgdGltZW91dD0xMjAgZGVmYXVsdF9sYWJlbD1sb2NhbAorKi8KK3ZvaWQgZGV0ZWN0X3BhcmFtZXRlcnMoY29uc3QgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworCWZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCS8qIE92ZXJyaWRlIHRoZSB0aW1lb3V0IGlmIHNwZWNpZmllZCBvbiB0aGUgY21kbGluZSAqLworCQlpZiAoIXN0cm5jbXAoYXJndltpXSwgInRpbWVvdXQ9IiwgOCkpIHsKKwkJCXdkdC50aW1lb3V0PWF0b2koYXJndltpXSs4KTsKKwkJfSBlbHNlCisJCS8qIERlZmluZSB3aGljaCBib290IGVudHJ5IHNoYWxsIGJlIHVzZWQgKi8KKwkJaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICJkZWZhdWx0X2xhYmVsPSIsIDE0KSkgeworCQkJc3RybGNweShkZWZhdWx0X2xhYmVsLCBhcmd2W2ldICsgMTQsIHNpemVvZihkZWZhdWx0X2xhYmVsKSk7CisJCX0KKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKwlpbnQgcmV0PTA7CisJb3BlbmNvbnNvbGUoJmRldl9yYXdjb25fciwgJmRldl9zdGRjb25fdyk7CisJaW5pdF9zdHJ1Y3R1cmUoKTsKKwlkZXRlY3RfcGFyYW1ldGVycyhhcmdjLGFyZ3YpOworCWtlbXBsZF9wcm9iZSgpOworCisgICAgICAgIC8qIHByb2JlIGhvdyBtYW55IHVzYWJsZSBzdGFnZXMgd2UgaGF2ZSAqLworICAgICAgICBpZiAoa2VtcGxkX3dkdF9wcm9iZV9zdGFnZXMoJndkdCkpIHsKKwkJcHJpbnRmKCJDYW5ub3QgUHJvYmUgU3RhZ2VzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFVzZWxlc3MgYnV0IHdobyBrbm93cyAqLworCXdkdC5pZGVudC5maXJtd2FyZV92ZXJzaW9uID0gS0VNUExEX1dEVF9SRVZfR0VUKGtlbXBsZF9yZWFkOCgmcGxkLCBLRU1QTERfV0RUX1JFVikpOworCisgICAgICAgIHN0YXR1cyA9IGtlbXBsZF9yZWFkOCgmcGxkLCBLRU1QTERfV0RUX0NGRyk7CisJLyoga2ljayB0aGUgd2F0Y2hkb2cgaWYgaXQgaXMgYWxyZWFkeSBlbmFibGVkLCBvdGhlcndpc2Ugc3RhcnQgaXQgKi8KKyAgICAgICAgaWYgKHN0YXR1cyAmIEtFTVBMRF9XRFRfQ0ZHX0VOQUJMRSkgeworCQkvKiBNYXlieWUgdGhlIEJJT1MgZGlkIHNldHVwIGEgZmlyc3QgdGltZXIKKwkJICogaW4gdGhpcyBjYXNlLCBsZXQncyBlbmZvcmNlIHRoZSB0aW1lb3V0CisJCSAqIHRvIGJlIHN1cmUgd2UgZG8gaGF2ZSB0aGUgcHJvcGVyIHZhbHVlICovCisJCWtlbXBsZF93ZHRfc2V0dGltZW91dCgmd2R0KTsKKyAgICAgICAgICAgICAgICBrZW1wbGRfd2R0X2tlZXBhbGl2ZSgmd2R0KTsKKyAgICAgICAgfSBlbHNlIHsKKwkJcmV0ID0ga2VtcGxkX3dkdF9zZXR0aW1lb3V0KCZ3ZHQpOworICAgICAgICAgICAgICAgIGlmIChyZXQpIHsKKwkJCXByaW50ZigiVW5hYmxlIHRvIHNldHVwIHRpbWVvdXQgIVxuIik7CisJCQlnb3RvIGJvb3Rpbmc7CisJCX0KKworCQlyZXQgPSBrZW1wbGRfd2R0X3N0YXJ0KCZ3ZHQpOworICAgICAgICAgICAgICAgIGlmIChyZXQpIHsKKwkJCXByaW50ZigiVW5hYmxlIHRvIHN0YXJ0IHdhdGNoZG9nICFcbiIpOworCQkJZ290byBib290aW5nOworCQl9CisKKyAgICAgICAgfQorCisJcHJpbnRmKCJXYXRjaG9nIGFybWVkICEgUmVib290aW5nIGluICVkIHNlY29uZHMgaWYgbm8gZmVlZCBvY2N1cnMgIVxuIix3ZHQudGltZW91dCk7CisKK2Jvb3Rpbmc6CisJLyogUmVsZWFzZSBNdXRleCB0byBsZXQgTGludXgncyBEcml2ZXIgdGFraW5nIGNvbnRyb2wgKi8KKyAgICAgICAga2VtcGxkX3JlbGVhc2VfbXV0ZXgoJnBsZCk7CisKKwkvKiBMZXQncyBib290IHRoZSBkZWZhdWx0IGVudHJ5IGlmIHNwZWNpZmllZCAqLworCWlmIChzdHJsZW4oZGVmYXVsdF9sYWJlbCk+MCkgeworCQlwcmludGYoIkV4ZWN1dGluZyBkZWZhdWx0IGxhYmVsID0gJyVzJ1xuIixkZWZhdWx0X2xhYmVsKTsKKwkJc3lzbGludXhfcnVuX2NvbW1hbmQoZGVmYXVsdF9sYWJlbCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHJldDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL2tvbnRyb25fd2R0LmggYi9jb20zMi9tb2R1bGVzL2tvbnRyb25fd2R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxNmRlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMva29udHJvbl93ZHQuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqICBrZW1wbGRfd2R0LmggLSBLb250cm9uIFBMRCB3YXRjaGRvZyBkcml2ZXIgZGVmaW5pdGlvbnMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIEtvbnRyb24gRW1iZWRkZWQgTW9kdWxlcyBHbWJICisgKiAgQXV0aG9yOiBNaWNoYWVsIEJydW5uZXIgPG1pY2hhZWwuYnJ1bm5lckBrb250cm9uLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIDIgYXMgcHVibGlzaGVkCisgKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfS0VNUExEX1dEVF9IXworI2RlZmluZSBfS0VNUExEX1dEVF9IXworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEtFTVBMRF9JT1BPUlQgMHgwYTgwCisjZGVmaW5lIEtFTVBMRF9JT0RBVEEgKEtFTVBMRF9JT1BPUlQrMSkKKworI2RlZmluZSBLRU1QTERfTVVURVhfS0VZCTB4ODAKKworLyogd2F0Y2hkb2cgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgS0VNUExEX1dEVF9LSUNLICAgICAgICAgICAgICAgICAweDE2CisjZGVmaW5lIEtFTVBMRF9XRFRfUkVWICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSAgICAgICAgIEtFTVBMRF9XRFRfUkVWX0dFVCh4KSAgICAgICAgICAgICAgICAgICAoeCAmIDB4ZikKKyNkZWZpbmUgS0VNUExEX1dEVF9DRkcgICAgICAgICAgICAgICAgICAweDE3CisjZGVmaW5lICAgICAgICAgS0VNUExEX1dEVF9DRkdfU1RBR0VfVElNRU9VVF9PQ0NVUkVEKHgpICgxPDx4KQorI2RlZmluZSAgICAgICAgIEtFTVBMRF9XRFRfQ0ZHX0VOQUJMRV9MT0NLICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgICAgICAgICBLRU1QTERfV0RUX0NGR19FTkFCTEUgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSAgICAgICAgIEtFTVBMRF9XRFRfQ0ZHX0FVVE9fUkVMT0FEICAgICAgICAgICAgICAweDQwCisjZGVmaW5lICAgICAgICAgS0VNUExEX1dEVF9DRkdfR0xPQkFMX0xPQ0sgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgS0VNUExEX1dEVF9TVEFHRV9DRkcoeCkgICAgICAgICAoMHgxOCt4KQorI2RlZmluZSAgICAgICAgIEtFTVBMRF9XRFRfU1RBR0VfQ0ZHX0FDVElPTl9NQVNLICAgICAgICAweDcKKyNkZWZpbmUgICAgICAgICBLRU1QTERfV0RUX1NUQUdFX0NGR19HRVRfQUNUSU9OKHgpICAgICAgKHggJiAweDcpCisjZGVmaW5lICAgICAgICAgS0VNUExEX1dEVF9TVEFHRV9DRkdfQVNTRVJUICAgICAgICAgICAgIDB4OAorI2RlZmluZSAgICAgICAgIEtFTVBMRF9XRFRfU1RBR0VfQ0ZHX1BSRVNDQUxFUl9NQVNLICAgICAweDMwCisjZGVmaW5lICAgICAgICAgS0VNUExEX1dEVF9TVEFHRV9DRkdfR0VUX1BSRVNDQUxFUih4KSAgICgoeCAmIDB4MzApPj40KQorI2RlZmluZSAgICAgICAgIEtFTVBMRF9XRFRfU1RBR0VfQ0ZHX1NFVF9QUkVTQ0FMRVIoeCkgICAoKHggJiAweDMwKTw8NCkKKyNkZWZpbmUgS0VNUExEX1dEVF9TVEFHRV9USU1FT1VUKHgpICAgICAoMHgxYit4KjQpCisjZGVmaW5lIEtFTVBMRF9XRFRfTUFYX1NUQUdFUyAgICAgICAgICAgMworCisjZGVmaW5lIEtFTVBMRF9XRFRfQUNUSU9OX05PTkUgICAgICAgICAgMHgwCisjZGVmaW5lIEtFTVBMRF9XRFRfQUNUSU9OX1JFU0VUICAgICAgICAgMHgxCisjZGVmaW5lIEtFTVBMRF9XRFRfQUNUSU9OX05NSSAgICAgICAgICAgMHgyCisjZGVmaW5lIEtFTVBMRF9XRFRfQUNUSU9OX1NNSSAgICAgICAgICAgMHgzCisjZGVmaW5lIEtFTVBMRF9XRFRfQUNUSU9OX1NDSSAgICAgICAgICAgMHg0CisjZGVmaW5lIEtFTVBMRF9XRFRfQUNUSU9OX0RFTEFZICAgICAgICAgMHg1CisKKyNkZWZpbmUgS0VNUExEX1dEVF9QUkVTQ0FMRVJfMjFCSVQgICAgICAweDAKKyNkZWZpbmUgS0VNUExEX1dEVF9QUkVTQ0FMRVJfMTdCSVQgICAgICAweDEKKyNkZWZpbmUgS0VNUExEX1dEVF9QUkVTQ0FMRVJfMTJCSVQgICAgICAweDIKKworY29uc3QgaW50IGtlbXBsZF9wcmVzY2FsZXJfYml0c1tdID0geyAyMSwgMTcsIDEyIH07CisKK3N0cnVjdCBrZW1wbGRfd2F0Y2hkb2dfc3RhZ2UgeworICAgICAgICBpbnQgICAgIG51bTsKKyAgICAgICAgdWludDMyX3QgICAgIHRpbWVvdXRfbWFzazsKK307CisKKy8qKgorICogc3RydWN0IGtlbXBsZF9kZXZpY2VfZGF0YSAtIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBQTEQgZGV2aWNlCisgKiBAaW9fYmFzZTogICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBJTyBtZW1vcnkKKyAqIEBpb19pbmRleDogICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIElPIGluZGV4IHJlZ2lzdGVyCisgKiBAaW9fZGF0YTogICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBJTyBkYXRhIHJlZ2lzdGVyCisgKiBAcGxkX2Nsb2NrOiAgICAgICAgICBQTEQgY2xvY2sgZnJlcXVlbmN5CisgKiBAbG9jazogICAgICAgICAgICAgICBQTEQgc3Bpbi1sb2NrCisgKiBAbG9ja19mbGFnczogICAgICAgICBQTEQgc3Bpbi1sb2NrIGZsYWdzCisgKiBAaGF2ZV9tdXRleDogICAgICAgICBCb29sIHZhbHVlIHRoYXQgaW5kaWNhdGVzIGlmIG11dGV4IGlzIGFxdWlyZWQKKyAqIEBsYXN0X2luZGV4OiAgICAgICAgIExhc3Qgd3JpdHRlbiBpbmRleCB2YWx1ZQorICogQHJzY3I6ICAgICAgICAgICAgICAgS2VybmVsIHJlc291cmNlIHN0cnVjdHVyZQorICogQGRldjogICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXJuZWwgZGV2aWNlIHN0cnVjdHVyZQorICogQGluZm86ICAgICAgICAgICAgICAgS0VNUExEIGluZm8gc3RydWN0dXJlCisgKi8KK3N0cnVjdCBrZW1wbGRfZGV2aWNlX2RhdGEgeworICAgICAgICB1aW50MTZfdCAJICAgICAgICBpb19iYXNlOworICAgICAgICB1aW50MTZfdAkJaW9faW5kZXg7CisgICAgICAgIHVpbnQxNl90CQlpb19kYXRhOworICAgICAgICB1aW50MzJfdAkJIHBsZF9jbG9jazsKKy8qICAgICAgICBzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBsb2NrX2ZsYWdzOyAqLworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBoYXZlX211dGV4OworICAgICAgICB1aW50OF90CQkJbGFzdF9pbmRleDsKKy8qICAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgICAgICAgICByc2NyOworICAgICAgICBzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAqZGV2OworICAgICAgICBzdHJ1Y3Qga2VtcGxkX2luZm8gICAgICBpbmZvOyovCit9OworCitzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyB7CisJdWludDMyX3Qgb3B0aW9uczsgICAgICAgICAgLyogT3B0aW9ucyB0aGUgY2FyZC9kcml2ZXIgc3VwcG9ydHMgKi8KKwl1aW50MzJfdCBmaXJtd2FyZV92ZXJzaW9uOyAvKiBGaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBjYXJkICovCisJdWludDhfdCAgaWRlbnRpdHlbMzJdOyAgICAgLyogSWRlbnRpdHkgb2YgdGhlIGJvYXJkICovCit9OworCitzdHJ1Y3Qga2VtcGxkX3dhdGNoZG9nX2RhdGEgeworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldGltZW91dDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICBpc19vcGVuOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgIGV4cGVjdF9jbG9zZTsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZXM7CisgICAgICAgIHN0cnVjdCBrZW1wbGRfd2F0Y2hkb2dfc3RhZ2UgICAgKnRpbWVvdXRfc3RhZ2U7CisgICAgICAgIHN0cnVjdCBrZW1wbGRfd2F0Y2hkb2dfc3RhZ2UgICAgKnByZXRpbWVvdXRfc3RhZ2U7CisgICAgICAgIHN0cnVjdCBrZW1wbGRfZGV2aWNlX2RhdGEgICAgICAgKnBsZDsKKyAgICAgICAgc3RydWN0IGtlbXBsZF93YXRjaGRvZ19zdGFnZSAgICAqc3RhZ2VbS0VNUExEX1dEVF9NQVhfU1RBR0VTXTsKKwlzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbwkJaWRlbnQ7Cit9OworCisjZW5kaWYgLyogX0tFTVBMRF9XRFRfSF8gKi8KKyNkZWZpbmUgS0VNUExEX1BSRVNDQUxFUih4KSAgICAgKDB4ZmZmZmZmZmY+PigzMi1rZW1wbGRfcHJlc2NhbGVyX2JpdHNbeF0pKQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9saW51eC5jIGIvY29tMzIvbW9kdWxlcy9saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTdlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL2xpbnV4LmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTIgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGxpbnV4LmMKKyAqCisgKiBTYW1wbGUgbW9kdWxlIHRvIGxvYWQgTGludXgga2VybmVscy4gIFRoaXMgbW9kdWxlIGNhbiBhbHNvIGNyZWF0ZQorICogYSBmaWxlIG91dCBvZiB0aGUgREhDUCByZXR1cm4gZGF0YSBpZiBydW5uaW5nIHVuZGVyIFBYRUxJTlVYLgorICoKKyAqIElmIC1kaGNwaW5mbyBpcyBzcGVjaWZpZWQsIHRoZSBESENQIGluZm8gaXMgd3JpdHRlbiBpbnRvIHRoZSBmaWxlCisgKiAvZGhjcGluZm8uZGF0IGluIHRoZSBpbml0cmFtZnMuCisgKgorICogVXNhZ2U6IGxpbnV4LmMzMiBbLWRoY3BpbmZvXSBrZXJuZWwgYXJndW1lbnRzLi4uCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbGludXguaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9weGUuaD4KKworZW51bSBsZG1vZGUgeworICAgIGxkbW9kZV9yYXcsCisgICAgbGRtb2RlX2NwaW8sCisgICAgbGRtb2RlcworfTsKKwordHlwZWRlZiBpbnQgZl9sZGluaXRyYW1mcyhzdHJ1Y3QgaW5pdHJhbWZzICosIGNoYXIgKik7CisKK2NvbnN0IGNoYXIgKnByb2duYW1lID0gImxpbnV4LmMzMiI7CisKKy8qIEZpbmQgdGhlIGxhc3QgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgbGluZSBhcmd1bWVudAorICAgKHdoaWNoIHNob3VsZCBpbmNsdWRlIHRoZSBmaW5hbCA9OyBkbyBub3QgdXNlIGZvciBib29sZWFuIGFyZ3VtZW50cykgKi8KK3N0YXRpYyBjaGFyICpmaW5kX2FyZ3VtZW50KGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICphcmd1bWVudCkKK3sKKyAgICBpbnQgbGEgPSBzdHJsZW4oYXJndW1lbnQpOworICAgIGNoYXIgKiphcmc7CisgICAgY2hhciAqcHRyID0gTlVMTDsKKworICAgIGZvciAoYXJnID0gYXJndjsgKmFyZzsgYXJnKyspIHsKKwlpZiAoIXN0cm5jbXAoKmFyZywgYXJndW1lbnQsIGxhKSkKKwkgICAgcHRyID0gKmFyZyArIGxhOworICAgIH0KKworICAgIHJldHVybiBwdHI7Cit9CisKKy8qIEZpbmQgdGhlIG5leHQgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgbGluZSBhcmd1bWVudCAqLworc3RhdGljIGNoYXIgKipmaW5kX2FyZ3VtZW50cyhjaGFyICoqYXJndiwgY2hhciAqKnB0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYXJndW1lbnQpCit7CisgICAgaW50IGxhID0gc3RybGVuKGFyZ3VtZW50KTsKKyAgICBjaGFyICoqYXJnOworCisgICAgZm9yIChhcmcgPSBhcmd2OyAqYXJnOyBhcmcrKykgeworCWlmICghc3RybmNtcCgqYXJnLCBhcmd1bWVudCwgbGEpKSB7CisJICAgICpwdHIgPSAqYXJnICsgbGE7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICAvKiBFeGhhdXN0ZWQgYWxsIGFyZ3VtZW50cyAqLworICAgIGlmICghKmFyZykKKwlyZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBhcmc7Cit9CisKKy8qIFNlYXJjaCBmb3IgYSBib29sZWFuIGFyZ3VtZW50OyByZXR1cm4gaXRzIHBvc2l0aW9uLCBvciAwIGlmIG5vdCBwcmVzZW50ICovCitzdGF0aWMgaW50IGZpbmRfYm9vbGVhbihjaGFyICoqYXJndiwgY29uc3QgY2hhciAqYXJndW1lbnQpCit7CisgICAgY2hhciAqKmFyZzsKKworICAgIGZvciAoYXJnID0gYXJndjsgKmFyZzsgYXJnKyspIHsKKwlpZiAoIXN0cmNtcCgqYXJnLCBhcmd1bWVudCkpCisJICAgIHJldHVybiAoYXJnIC0gYXJndikgKyAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBTdGl0Y2ggdG9nZXRoZXIgdGhlIGNvbW1hbmQgbGluZSBmcm9tIGEgc2V0IG9mIGFyZ3YncyAqLworc3RhdGljIGNoYXIgKm1ha2VfY21kbGluZShjaGFyICoqYXJndikKK3sKKyAgICBjaGFyICoqYXJnOworICAgIHNpemVfdCBieXRlczsKKyAgICBjaGFyICpjbWRsaW5lLCAqcDsKKworICAgIGJ5dGVzID0gMTsJCQkvKiBKdXN0IGluIGNhc2Ugd2UgaGF2ZSBhIHplcm8tZW50cnkgY21kbGluZSAqLworICAgIGZvciAoYXJnID0gYXJndjsgKmFyZzsgYXJnKyspIHsKKwlieXRlcyArPSBzdHJsZW4oKmFyZykgKyAxOworICAgIH0KKworICAgIHAgPSBjbWRsaW5lID0gbWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAoIWNtZGxpbmUpCisJcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGFyZyA9IGFyZ3Y7ICphcmc7IGFyZysrKSB7CisJaW50IGxlbiA9IHN0cmxlbigqYXJnKTsKKwltZW1jcHkocCwgKmFyZywgbGVuKTsKKwlwW2xlbl0gPSAnICc7CisJcCArPSBsZW4gKyAxOworICAgIH0KKworICAgIGlmIChwID4gY21kbGluZSkKKwlwLS07CQkJLyogUmVtb3ZlIHRoZSBsYXN0IHNwYWNlICovCisgICAgKnAgPSAnXDAnOworCisgICAgcmV0dXJuIGNtZGxpbmU7Cit9CisKK3N0YXRpYyBmX2xkaW5pdHJhbWZzIGxkaW5pdHJhbWZzX3JhdzsKK3N0YXRpYyBpbnQgbGRpbml0cmFtZnNfcmF3KHN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mcywgY2hhciAqZm5hbWUpCit7CisgICAgcmV0dXJuIGluaXRyYW1mc19sb2FkX2FyY2hpdmUoaW5pdHJhbWZzLCBmbmFtZSk7Cit9CisKK3N0YXRpYyBmX2xkaW5pdHJhbWZzIGxkaW5pdHJhbWZzX2NwaW87CitzdGF0aWMgaW50IGxkaW5pdHJhbWZzX2NwaW8oc3RydWN0IGluaXRyYW1mcyAqaW5pdHJhbWZzLCBjaGFyICpmbmFtZSkKK3sKKyAgICBjaGFyICp0YXJnZXRfZm5hbWUsICpwOworICAgIGludCBkb19ta2RpciwgdW5tYW5nbGUsIHJjOworCisgICAgLyogQ2hvb3NlIHRhcmdldF9mbmFtZSBiYXNlZCBvbiBwcmVzZW5jZSBvZiAiQCIgc3ludGF4ICovCisgICAgdGFyZ2V0X2ZuYW1lID0gc3RyY2hyKGZuYW1lLCAnQCcpOworICAgIGlmICh0YXJnZXRfZm5hbWUpIHsKKwkvKiBUZW1wb3JhcmlseSBtYW5nbGUgKi8KKwl1bm1hbmdsZSA9IDE7CisJKnRhcmdldF9mbmFtZSsrID0gJ1wwJzsKKworCS8qIE1ha2UgcGFyZW50IGRpcmVjdG9yaWVzPyAqLworCWRvX21rZGlyID0gISFzdHJjaHIodGFyZ2V0X2ZuYW1lLCAnLycpOworICAgIH0gZWxzZSB7CisJdW5tYW5nbGUgPSAwOworCisJLyogRm9yZ2V0IHRoZSBzb3VyY2UgcGF0aCAqLworCXRhcmdldF9mbmFtZSA9IGZuYW1lOworCXdoaWxlICgocCA9IHN0cmNocih0YXJnZXRfZm5hbWUsICcvJykpKQorCSAgICB0YXJnZXRfZm5hbWUgPSBwICsgMTsKKworCS8qIFRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgZGVzaXJlZCBwYXRoICovCisJZG9fbWtkaXIgPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogTG9hZCB0aGUgZmlsZSwgZW5jYXBzdWxhdGUgaXQgd2l0aCB0aGUgZGVzaXJlZCBwYXRoLCBtYWtlIHRoZQorICAgICAqIHBhcmVudCBkaXJlY3RvcmllcyBpZiB0aGUgZGVzaXJlZCBwYXRoIGNvbnRhaW5zIHRoZW0sIGFkZCB0byBpbml0cmFtZnMKKyAgICAgKi8KKyAgICByYyA9IGluaXRyYW1mc19sb2FkX2ZpbGUoaW5pdHJhbWZzLCBmbmFtZSwgdGFyZ2V0X2ZuYW1lLCBkb19ta2RpciwgMDc1NSk7CisKKyAgICAvKiBVbm1hbmdsZSwgaWYgbmVlZGVkKi8KKyAgICBpZiAodW5tYW5nbGUpCisJKi0tdGFyZ2V0X2ZuYW1lID0gJ0AnOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIG1haW4gKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19pbml0cmFtZnNfYXJncyhjaGFyICphcmcsIHN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mcywKKwkJCQkgIGNvbnN0IGNoYXIgKmtlcm5lbF9uYW1lLCBlbnVtIGxkbW9kZSBtb2RlLAorCQkJCSAgYm9vbCBvcHRfcXVpZXQpCit7CisgICAgY29uc3QgY2hhciAqbW9kZV9tc2c7CisgICAgZl9sZGluaXRyYW1mcyAqbGRpbml0cmFtZnM7CisgICAgY2hhciAqcDsKKworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgbGRtb2RlX3JhdzoKKwltb2RlX21zZyA9ICJMb2FkaW5nIjsKKwlsZGluaXRyYW1mcyA9IGxkaW5pdHJhbWZzX3JhdzsKKwlicmVhazsKKyAgICBjYXNlIGxkbW9kZV9jcGlvOgorCW1vZGVfbXNnID0gIkVuY2Fwc3VsYXRpbmciOworCWxkaW5pdHJhbWZzID0gbGRpbml0cmFtZnNfY3BpbzsKKwlicmVhazsKKyAgICBjYXNlIGxkbW9kZXM6CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBkbyB7CisJcCA9IHN0cmNocihhcmcsICcsJyk7CisJaWYgKHApCisJICAgICpwID0gJ1wwJzsKKworCWlmICghb3B0X3F1aWV0KQorCSAgICBwcmludGYoIiVzICVzLi4uICIsIG1vZGVfbXNnLCBhcmcpOworCWVycm5vID0gMDsKKwlpZiAobGRpbml0cmFtZnMoaW5pdHJhbWZzLCBhcmcpKSB7CisJICAgIGlmIChvcHRfcXVpZXQpCisJCXByaW50ZigiTG9hZGluZyAlcyAiLCBrZXJuZWxfbmFtZSk7CisJICAgIHByaW50ZigiZmFpbGVkOiAiKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCWlmICghb3B0X3F1aWV0KQorCSAgICBwcmludGYoIm9rXG4iKTsKKworCWlmIChwKQorCSAgICAqcCsrID0gJywnOworICAgIH0gd2hpbGUgKChhcmcgPSBwKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXR1cF9kYXRhX2ZpbGUoc3RydWN0IHNldHVwX2RhdGEgKnNldHVwX2RhdGEsCisJCQkgICB1aW50MzJfdCB0eXBlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCSAgIGJvb2wgb3B0X3F1aWV0KQoreworICAgIGlmICghb3B0X3F1aWV0KQorCXByaW50ZigiTG9hZGluZyAlcy4uLiAiLCBmaWxlbmFtZSk7CisKKyAgICBpZiAoc2V0dXBfZGF0YV9sb2FkKHNldHVwX2RhdGEsIHR5cGUsIGZpbGVuYW1lKSkgeworCWlmIChvcHRfcXVpZXQpCisJICAgIHByaW50ZigiTG9hZGluZyAlcyAiLCBmaWxlbmFtZSk7CisJcHJpbnRmKCJmYWlsZWRcbiIpOworCXJldHVybiAtMTsKKyAgICB9CisJICAgIAorICAgIGlmICghb3B0X3F1aWV0KQorCXByaW50Zigib2tcbiIpOworICAgIAorICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9uYW1lOworICAgIHN0cnVjdCBpbml0cmFtZnMgKmluaXRyYW1mczsKKyAgICBzdHJ1Y3Qgc2V0dXBfZGF0YSAqc2V0dXBfZGF0YTsKKyAgICBjaGFyICpjbWRsaW5lOworICAgIGNoYXIgKmJvb3RfaW1hZ2U7CisgICAgdm9pZCAqa2VybmVsX2RhdGE7CisgICAgc2l6ZV90IGtlcm5lbF9sZW47CisgICAgYm9vbCBvcHRfZGhjcGluZm8gPSBmYWxzZTsKKyAgICBib29sIG9wdF9xdWlldCA9IGZhbHNlOworICAgIHZvaWQgKmRoY3BkYXRhOworICAgIHNpemVfdCBkaGNwbGVuOworICAgIGNoYXIgKiphcmdwLCAqKmFyZ2wsICphcmc7CisKKyAgICAodm9pZClhcmdjOworICAgIGFyZ3AgPSBhcmd2ICsgMTsKKworICAgIHdoaWxlICgoYXJnID0gKmFyZ3ApICYmIGFyZ1swXSA9PSAnLScpIHsKKwlpZiAoIXN0cmNtcCgiLWRoY3BpbmZvIiwgYXJnKSkgeworCSAgICBvcHRfZGhjcGluZm8gPSB0cnVlOworCX0gZWxzZSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHVua25vd24gb3B0aW9uOiAlc1xuIiwgcHJvZ25hbWUsIGFyZyk7CisJICAgIHJldHVybiAxOworCX0KKwlhcmdwKys7CisgICAgfQorCisgICAgaWYgKCFhcmcpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBtaXNzaW5nIGtlcm5lbCBuYW1lXG4iLCBwcm9nbmFtZSk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAga2VybmVsX25hbWUgPSBhcmc7CisKKyAgICBlcnJubyA9IDA7CisgICAgYm9vdF9pbWFnZSA9IG1hbGxvYyhzdHJsZW4oa2VybmVsX25hbWUpICsgMTIpOworICAgIGlmICghYm9vdF9pbWFnZSkgeworCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgYWxsb2NhdGluZyBCT09UX0lNQUdFIHN0cmluZzogIik7CisJZ290byBiYWlsOworICAgIH0KKyAgICBzdHJjcHkoYm9vdF9pbWFnZSwgIkJPT1RfSU1BR0U9Iik7CisgICAgc3RyY3B5KGJvb3RfaW1hZ2UgKyAxMSwga2VybmVsX25hbWUpOworICAgIC8qIGFyZ3Agbm93IHBvaW50cyB0byB0aGUga2VybmVsIG5hbWUsIGFuZCB0aGUgY29tbWFuZCBsaW5lIGZvbGxvd3MuCisgICAgICAgT3ZlcndyaXRlIHRoZSBrZXJuZWwgbmFtZSB3aXRoIHRoZSBCT09UX0lNQUdFPSBhcmd1bWVudCwgYW5kIHRodXMKKyAgICAgICB3ZSBoYXZlIHRoZSBmaW5hbCBhcmd1bWVudC4gKi8KKyAgICAqYXJncCA9IGJvb3RfaW1hZ2U7CisKKyAgICBpZiAoZmluZF9ib29sZWFuKGFyZ3AsICJxdWlldCIpKQorCW9wdF9xdWlldCA9IHRydWU7CisKKyAgICBpZiAoIW9wdF9xdWlldCkKKwlwcmludGYoIkxvYWRpbmcgJXMuLi4gIiwga2VybmVsX25hbWUpOworICAgIGVycm5vID0gMDsKKyAgICBpZiAobG9hZGZpbGUoa2VybmVsX25hbWUsICZrZXJuZWxfZGF0YSwgJmtlcm5lbF9sZW4pKSB7CisJaWYgKG9wdF9xdWlldCkKKwkgICAgcHJpbnRmKCJMb2FkaW5nICVzICIsIGtlcm5lbF9uYW1lKTsKKwlwcmludGYoImZhaWxlZDogIik7CisJZ290byBiYWlsOworICAgIH0KKyAgICBpZiAoIW9wdF9xdWlldCkKKwlwcmludGYoIm9rXG4iKTsKKworICAgIGVycm5vID0gMDsKKyAgICBjbWRsaW5lID0gbWFrZV9jbWRsaW5lKGFyZ3ApOworICAgIGlmICghY21kbGluZSkgeworCWZwcmludGYoc3RkZXJyLCAibWFrZV9jbWRsaW5lKCkgZmFpbGVkOiAiKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgaW5pdHJhbWZzIGNoYWluICovCisgICAgZXJybm8gPSAwOworICAgIGluaXRyYW1mcyA9IGluaXRyYW1mc19pbml0KCk7CisgICAgaWYgKCFpbml0cmFtZnMpIHsKKwlmcHJpbnRmKHN0ZGVyciwgImluaXRyYW1mc19pbml0KCkgZmFpbGVkOiAiKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBpbml0cmFtZnMgYXJndW1lbnRzICovCisgICAgaWYgKChhcmcgPSBmaW5kX2FyZ3VtZW50KGFyZ3AsICJpbml0cmQ9IikpKSB7CisJaWYgKHByb2Nlc3NfaW5pdHJhbWZzX2FyZ3MoYXJnLCBpbml0cmFtZnMsIGtlcm5lbF9uYW1lLCBsZG1vZGVfcmF3LAorCQkJCSAgIG9wdF9xdWlldCkpCisJICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBhcmdsID0gYXJndjsKKyAgICB3aGlsZSAoKGFyZ2wgPSBmaW5kX2FyZ3VtZW50cyhhcmdsLCAmYXJnLCAiaW5pdHJkKz0iKSkpIHsKKwlhcmdsKys7CisJaWYgKHByb2Nlc3NfaW5pdHJhbWZzX2FyZ3MoYXJnLCBpbml0cmFtZnMsIGtlcm5lbF9uYW1lLCBsZG1vZGVfcmF3LAorCQkJCSAgIG9wdF9xdWlldCkpCisJICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBhcmdsID0gYXJndjsKKyAgICB3aGlsZSAoKGFyZ2wgPSBmaW5kX2FyZ3VtZW50cyhhcmdsLCAmYXJnLCAiaW5pdHJkZmlsZT0iKSkpIHsKKwlhcmdsKys7CisJaWYgKHByb2Nlc3NfaW5pdHJhbWZzX2FyZ3MoYXJnLCBpbml0cmFtZnMsIGtlcm5lbF9uYW1lLCBsZG1vZGVfY3BpbywKKwkJCQkgICBvcHRfcXVpZXQpKQorCSAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogQXBwZW5kIHRoZSBESENQIGluZm8gKi8KKyAgICBpZiAob3B0X2RoY3BpbmZvICYmCisJIXB4ZV9nZXRfY2FjaGVkX2luZm8oUFhFTlZfUEFDS0VUX1RZUEVfREhDUF9BQ0ssICZkaGNwZGF0YSwgJmRoY3BsZW4pKSB7CisJZXJybm8gPSAwOworCWlmIChpbml0cmFtZnNfYWRkX2ZpbGUoaW5pdHJhbWZzLCBkaGNwZGF0YSwgZGhjcGxlbiwgZGhjcGxlbiwKKwkJCSAgICAgICAiL2RoY3BpbmZvLmRhdCIsIDAsIDA3NTUpKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFkZCBESENQIGluZm86ICIpOworCSAgICBnb3RvIGJhaWw7CisJfQorICAgIH0KKworICAgIC8qIEhhbmRsZSBkdGIgYW5kIGV2ZW50dWFsbHkgb3RoZXIgc2V0dXAgZGF0YSAqLworICAgIHNldHVwX2RhdGEgPSBzZXR1cF9kYXRhX2luaXQoKTsKKyAgICBpZiAoIXNldHVwX2RhdGEpCisJZ290byBiYWlsOworCisgICAgYXJnbCA9IGFyZ3Y7CisgICAgd2hpbGUgKChhcmdsID0gZmluZF9hcmd1bWVudHMoYXJnbCwgJmFyZywgImR0Yj0iKSkpIHsKKwlhcmdsKys7CisJaWYgKHNldHVwX2RhdGFfZmlsZShzZXR1cF9kYXRhLCBTRVRVUF9EVEIsIGFyZywgb3B0X3F1aWV0KSkKKwkgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGFyZ2wgPSBhcmd2OworICAgIHdoaWxlICgoYXJnbCA9IGZpbmRfYXJndW1lbnRzKGFyZ2wsICZhcmcsICJibG9iLiIpKSkgeworCXVpbnQzMl90IHR5cGU7CisJY2hhciAqZXA7CisKKwlhcmdsKys7CisJdHlwZSA9IHN0cnRvdWwoYXJnLCAmZXAsIDEwKTsKKwlpZiAoZXBbMF0gIT0gJz0nIHx8ICFlcFsxXSkKKwkgICAgY29udGludWU7CisKKwlpZiAoIXR5cGUpCisJICAgIGNvbnRpbnVlOworCisJaWYgKHNldHVwX2RhdGFfZmlsZShzZXR1cF9kYXRhLCB0eXBlLCBlcCsxLCBvcHRfcXVpZXQpKQorCSAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogVGhpcyBzaG91bGQgbm90IHJldHVybi4uLiAqLworICAgIGVycm5vID0gMDsKKyAgICBzeXNsaW51eF9ib290X2xpbnV4KGtlcm5lbF9kYXRhLCBrZXJuZWxfbGVuLCBpbml0cmFtZnMsCisJCQlzZXR1cF9kYXRhLCBjbWRsaW5lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInN5c2xpbnV4X2Jvb3RfbGludXgoKSBmYWlsZWQ6ICIpOworCitiYWlsOgorICAgIHN3aXRjaChlcnJubykgeworICAgIGNhc2UgRU5PRU5UOgorCWZwcmludGYoc3RkZXJyLCAiRmlsZSBub3QgZm91bmRcbiIpOworCWJyZWFrOworICAgIGNhc2UgRU5PTUVNOgorCWZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlmcHJpbnRmKHN0ZGVyciwgIkVycm9yICVkXG4iLCBlcnJubyk7CisJYnJlYWs7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IEJvb3QgYWJvcnRlZCFcbiIsIHByb2duYW1lKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvbHMuYyBiL2NvbTMyL21vZHVsZXMvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2VhY2RiCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9scy5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogRGlzcGxheSBkaXJlY3RvcnkgY29udGVudHMKKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z2V0a2V5Lmg+CisKK3N0YXRpYyBpbnQgcm93cywgY29sczsJCS8qIFNjcmVlbiBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgRElSX0NIVU5LCTEwMjQKKworc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfc3RyKGludCB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRFRfRklGTzoKKwlyZXR1cm4gIltmaWZdIjsKKyAgICBjYXNlIERUX0NIUjoKKwlyZXR1cm4gIltjaHJdIjsKKyAgICBjYXNlIERUX0RJUjoKKwlyZXR1cm4gIltkaXJdIjsKKyAgICBjYXNlIERUX0JMSzoKKwlyZXR1cm4gIltibGtdIjsKKyAgICBjYXNlIERUX1VOS05PV046CisgICAgY2FzZSBEVF9SRUc6CisJcmV0dXJuICIiOworICAgIGNhc2UgRFRfTE5LOgorCXJldHVybiAiW2xua10iOworICAgIGNhc2UgRFRfU09DSzoKKwlyZXR1cm4gIltzY2tdIjsKKyAgICBjYXNlIERUX1dIVDoKKwlyZXR1cm4gIlt3aHRdIjsKKyAgICBkZWZhdWx0OgorCXJldHVybiAiWz8/P10iOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZnJlZV9kaXJlbnRzKHN0cnVjdCBkaXJlbnQgKipkZXgsIHNpemVfdCBuX2RlKQoreworICAgIHNpemVfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5fZGU7IGkrKykKKwlmcmVlKGRleFtpXSk7CisKKyAgICBmcmVlKGRleCk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9kaXJlbnQoY29uc3Qgdm9pZCAqcF9kZTEsIGNvbnN0IHZvaWQgKnBfZGUyKQoreworICAgIGNvbnN0IHN0cnVjdCBkaXJlbnQgKmRlMSA9ICooY29uc3Qgc3RydWN0IGRpcmVudCAqKilwX2RlMTsKKyAgICBjb25zdCBzdHJ1Y3QgZGlyZW50ICpkZTIgPSAqKGNvbnN0IHN0cnVjdCBkaXJlbnQgKiopcF9kZTI7CisgICAgaW50IG5kaXIxLCBuZGlyMjsKKworICAgIG5kaXIxID0gZGUxLT5kX3R5cGUgIT0gRFRfRElSOworICAgIG5kaXIyID0gZGUyLT5kX3R5cGUgIT0gRFRfRElSOworCisgICAgaWYgKG5kaXIxICE9IG5kaXIyKQorCXJldHVybiBuZGlyMSAtIG5kaXIyOworCisgICAgcmV0dXJuIHN0cmNtcChkZTEtPmRfbmFtZSwgZGUyLT5kX25hbWUpOworfQorCitzdGF0aWMgaW50IGRpc3BsYXlfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKmRpcm5hbWUpCit7CisgICAgRElSICpkaXI7CisgICAgc3RydWN0IGRpcmVudCAqZGU7CisgICAgc3RydWN0IGRpcmVudCAqKmRleCA9IE5VTEw7CisgICAgc2l6ZV90IG5fZGV4ID0gMCwgbl9kZSA9IDA7CisgICAgc2l6ZV90IGksIGosIGs7CisgICAgc2l6ZV90IG5yb3dzLCBuY29scywgcGVycGFnZTsKKyAgICBzaXplX3QgZW5kcGFnZTsKKyAgICBpbnQgbWF4bGVuID0gMDsKKyAgICBpbnQgcG9zLCB0cG9zLCBjb2x3aWR0aDsKKworICAgIGRpciA9IG9wZW5kaXIoZGlybmFtZSk7CisgICAgaWYgKCFkaXIpIHsKKwlwcmludGYoIlVuYWJsZSB0byByZWFkIGRpcmVjdG9yeTogJXNcbiIsIGRpcm5hbWUpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJc3RydWN0IGRpcmVudCAqbmRlOworCisJaWYgKG5fZGUgPj0gbl9kZXgpIHsKKwkgICAgc3RydWN0IGRpcmVudCAqKm5kZXg7CisKKwkgICAgbmRleCA9IHJlYWxsb2MoZGV4LCAobl9kZXggKyBESVJfQ0hVTkspICogc2l6ZW9mICpkZXgpOworCSAgICBpZiAoIW5kZXgpCisJCWdvdG8gbm9tZW07CisKKwkgICAgZGV4ID0gbmRleDsKKwkgICAgbl9kZXggKz0gRElSX0NIVU5LOworCX0KKworCW5kZSA9IG1hbGxvYyhkZS0+ZF9yZWNsZW4pOworCWlmICghbmRlKQorCSAgICBnb3RvIG5vbWVtOworCisJbWVtY3B5KG5kZSwgZGUsIGRlLT5kX3JlY2xlbik7CisJZGV4W25fZGUrK10gPSBuZGU7CisKKwltYXhsZW4gPSBtYXgobWF4bGVuLCBkZS0+ZF9yZWNsZW4pOworICAgIH0KKworICAgIGNsb3NlZGlyKGRpcik7CisKKyAgICBxc29ydChkZXgsIG5fZGUsIHNpemVvZiAqZGV4LCBjb21wYXJlX2RpcmVudCk7CisKKyAgICBtYXhsZW4gLT0gb2Zmc2V0b2Yoc3RydWN0IGRpcmVudCwgZF9uYW1lKSArIDE7CisgICAgbmNvbHMgPSAoY29scyArIDIpLyhtYXhsZW4gKyA4KTsKKyAgICBuY29scyA9IG1pbihuY29scywgbl9kZSk7CisgICAgbmNvbHMgPSBtYXgobmNvbHMsIDFVKTsKKyAgICBjb2x3aWR0aCA9IChjb2xzICsgMikvbmNvbHM7CisgICAgcGVycGFnZSA9IG5jb2xzICogKHJvd3MgLSAxKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuX2RlOyBpICs9IHBlcnBhZ2UpIHsKKwkvKiBSb3dzIG9uIHRoaXMgcGFnZSAqLworCWVuZHBhZ2UgPSBtaW4oaStwZXJwYWdlLCBuX2RlKTsKKwlucm93cyA9ICgoZW5kcGFnZS1pKSArIG5jb2xzIC0gMSkvbmNvbHM7CisKKwlmb3IgKGogPSAwOyBqIDwgbnJvd3M7IGorKykgeworCSAgICBwb3MgPSB0cG9zID0gMDsKKwkgICAgZm9yIChrID0gaStqOyBrIDwgZW5kcGFnZTsgayArPSBucm93cykgeworCQlwb3MgKz0gcHJpbnRmKCIlKnMlLTVzICVzIiwKKwkJCSAgICAgICh0cG9zIC0gcG9zKSwgIiIsCisJCQkgICAgICB0eXBlX3N0cihkZXhba10tPmRfdHlwZSksCisJCQkgICAgICBkZXhba10tPmRfbmFtZSk7CisJCXRwb3MgKz0gY29sd2lkdGg7CisJICAgIH0KKwkgICAgcHJpbnRmKCJcbiIpOworCX0KKworCWlmIChlbmRwYWdlID49IG5fZGUpCisJICAgIGJyZWFrOworCisJZ2V0X2tleShzdGRpbiwgMCk7CisgICAgfQorCisgICAgZnJlZV9kaXJlbnRzKGRleCwgbl9kZSk7CisgICAgcmV0dXJuIDA7CisKK25vbWVtOgorICAgIGNsb3NlZGlyKGRpcik7CisgICAgcHJpbnRmKCJPdXQgb2YgbWVtb3J5IGVycm9yIVxuIik7CisgICAgZnJlZV9kaXJlbnRzKGRleCwgbl9kZSk7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBydjsKKworICAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZyb3dzLCAmY29scykpIHsKKwkvKiBVbmtub3duIHNjcmVlbiBzaXplPyAqLworCXJvd3MgPSAyNDsKKwljb2xzID0gODA7CisgICAgfQorCisgICAgaWYgKGFyZ2MgPCAyKQorCXJ2ID0gZGlzcGxheV9kaXJlY3RvcnkoIi4iKTsKKyAgICBlbHNlIGlmIChhcmdjID09IDIpCisJcnYgPSBkaXNwbGF5X2RpcmVjdG9yeShhcmd2WzFdKTsKKyAgICBlbHNlIHsKKwlwcmludGYoIlVzYWdlOiAlcyBkaXJlY3RvcnlcbiIsIGFyZ3ZbMF0pOworCXJ2ID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gcnYgPyAxIDogMDsKK30KKyAKZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvbWVtaW5mby5jIGIvY29tMzIvbW9kdWxlcy9tZW1pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwNDc5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvbWVtaW5mby5jCkBAIC0wLDAgKzEsMTMyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1lbWluZm8uYworICoKKyAqIER1bXAgdGhlIG1lbW9yeSBtYXAgb2YgdGhlIHN5c3RlbQorICovCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorCitzdHJ1Y3QgZTgyMF9kYXRhIHsKKyAgICB1aW50NjRfdCBiYXNlOworICAgIHVpbnQ2NF90IGxlbjsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIHVpbnQzMl90IGV4dGF0dHI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGU4MjBfdHlwZXNbXSA9IHsKKyAgICAidXNhYmxlIiwKKyAgICAicmVzZXJ2ZWQiLAorICAgICJBQ1BJIHJlY2xhaW0iLAorICAgICJBQ1BJIE5WUyIsCisgICAgInVudXNhYmxlIiwKK307CisKK3N0YXRpYyB2b2lkIGR1bXBfZTgyMCh2b2lkKQoreworICAgIGNvbTMyc3lzX3QgaXJlZywgb3JlZzsKKyAgICBzdHJ1Y3QgZTgyMF9kYXRhIGVkOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgdm9pZCAqbG93X2VkOworCisgICAgbG93X2VkID0gbG1hbGxvYyhzaXplb2YgZWQpOworICAgIGlmICghbG93X2VkKQorCXJldHVybjsKKworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworCisgICAgaXJlZy5lYXgud1swXSA9IDB4ZTgyMDsKKyAgICBpcmVnLmVkeC5sID0gMHg1MzRkNDE1MDsKKyAgICBpcmVnLmVjeC5sID0gc2l6ZW9mKHN0cnVjdCBlODIwX2RhdGEpOworICAgIGlyZWcuZWRpLndbMF0gPSBPRkZTKGxvd19lZCk7CisgICAgaXJlZy5lcyA9IFNFRyhsb3dfZWQpOworCisgICAgbWVtc2V0KCZlZCwgMCwgc2l6ZW9mIGVkKTsKKyAgICBlZC5leHRhdHRyID0gMTsKKworICAgIGRvIHsKKwltZW1jcHkobG93X2VkLCAmZWQsIHNpemVvZiBlZCk7CisKKwlfX2ludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKKwlpZiAob3JlZy5lZmxhZ3MubCAmIEVGTEFHU19DRiB8fAorCSAgICBvcmVnLmVheC5sICE9IDB4NTM0ZDQxNTAgfHwgb3JlZy5lY3gubCA8IDIwKQorCSAgICBicmVhazsKKworCW1lbWNweSgmZWQsIGxvd19lZCwgc2l6ZW9mIGVkKTsKKworCWlmIChvcmVnLmVjeC5sID49IDI0KSB7CisJICAgIC8qIGVieCBiYXNlIGxlbmd0aCBlbmQgdHlwZSAqLworCSAgICBwcmludGYoIiU4eCAlMDE2bGx4ICUwMTZsbHggJTAxNmxseCAlZCBbJXhdIiwKKwkJICAgaXJlZy5lYngubCwgZWQuYmFzZSwgZWQubGVuLCBlZC5iYXNlICsgZWQubGVuLCBlZC50eXBlLAorCQkgICBlZC5leHRhdHRyKTsKKwl9IGVsc2UgeworCSAgICAvKiBlYnggYmFzZSBsZW5ndGggZW5kICovCisJICAgIHByaW50ZigiJTh4ICUwMTZsbHggJTAxNmxseCAlMDE2bGx4ICVkIFstXSIsCisJCSAgIGlyZWcuZWJ4LmwsIGVkLmJhc2UsIGVkLmxlbiwgZWQuYmFzZSArIGVkLmxlbiwgZWQudHlwZSk7CisJICAgIGVkLmV4dGF0dHIgPSAxOworCX0KKworCXR5cGUgPSBlZC50eXBlIC0gMTsKKwlpZiAodHlwZSA8IHNpemVvZihlODIwX3R5cGVzKSAvIHNpemVvZihlODIwX3R5cGVzWzBdKSkKKwkgICAgcHJpbnRmKCIgJXMiLCBlODIwX3R5cGVzW3R5cGVdKTsKKworCXB1dGNoYXIoJ1xuJyk7CisKKwlpcmVnLmVieC5sID0gb3JlZy5lYngubDsKKyAgICB9IHdoaWxlIChpcmVnLmVieC5sKTsKKworICAgIGxmcmVlKGxvd19lZCk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfbGVnYWN5KHZvaWQpCit7CisgICAgY29tMzJzeXNfdCBpcmVnLCBvcmVnOworICAgIHVpbnQxNl90IGRvc3JhbSA9ICoodWludDE2X3QgKikgMHg0MTM7CisgICAgc3RydWN0IHsKKwl1aW50MTZfdCBvZmZzLCBzZWc7CisgICAgfSAqY29uc3QgaXZ0ID0gKHZvaWQgKikwOworCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisKKyAgICBfX2ludGNhbGwoMHgxMiwgJmlyZWcsICZvcmVnKTsKKworICAgIHByaW50ZgorCSgiSU5UIDE1aCA9ICUwNHg6JTA0eCAgRE9TIFJBTTogJWRLICgweCUwNXgpICBJTlQgMTJoOiAlZEsgKDB4JTA1eClcbiIsCisJIGl2dFsweDE1XS5zZWcsIGl2dFsweDE1XS5vZmZzLCBkb3NyYW0sIGRvc3JhbSA8PCAxMCwgb3JlZy5lYXgud1swXSwKKwkgb3JlZy5lYXgud1swXSA8PCAxMCk7CisKKyAgICBtZW1zZXQoJmlyZWcsIDAsIHNpemVvZiBpcmVnKTsKKyAgICBpcmVnLmVheC5iWzFdID0gMHg4ODsKKyAgICBfX2ludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKKworICAgIHByaW50ZigiSU5UIDE1IDg4OiAweCUwNHggKCV1SykgICIsIG9yZWcuZWF4LndbMF0sIG9yZWcuZWF4LndbMF0pOworCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisgICAgaXJlZy5lYXgud1swXSA9IDB4ZTgwMTsKKyAgICBfX2ludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKKworICAgIHByaW50ZigiSU5UIDE1IEU4MDE6IDB4JTA0eCAoJXVLKSAweCUwNHggKCV1SylcbiIsCisJICAgb3JlZy5lY3gud1swXSwgb3JlZy5lY3gud1swXSwgb3JlZy5lZHgud1swXSwgb3JlZy5lZHgud1swXSA8PCA2KTsKK30KKworaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2IF9fdW51c2VkKQoreworICAgIGR1bXBfbGVnYWN5KCk7CisgICAgZHVtcF9lODIwKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL3BjaXRlc3QuYyBiL2NvbTMyL21vZHVsZXMvcGNpdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNmJiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL3BjaXRlc3QuYwpAQCAtMCwwICsxLDE1MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDYgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisgKiBwY2l0ZXN0LmMKKyAqCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzeXMvcGNpLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKworY2hhciBkaXNwbGF5X2xpbmUgPSAwOworI2RlZmluZSBtb3JlcHJpbnRmKC4uLikJCQkJXAorICBkbyB7CQkJCQkJXAorICAgIGRpc3BsYXlfbGluZSsrOwkJCQlcCisgICAgaWYgKGRpc3BsYXlfbGluZSA9PSAyNCkgewkJCVwKKyAgICAgIGNoYXIgdGVtcGJ1ZlsxMF07CQkJCVwKKyAgICAgIGRpc3BsYXlfbGluZT0wOwkJCQlcCisgICAgICBwcmludGYoIlByZXNzIEVudGVyIHRvIGNvbnRpbnVlXG4iKTsJXAorICAgICAgZmdldHModGVtcGJ1Ziwgc2l6ZW9mIHRlbXBidWYsIHN0ZGluKTsJXAorICAgIH0JCQkJCQlcCisgICAgcHJpbnRmICggX19WQV9BUkdTX18pOwkJCVwKKyAgfSB3aGlsZSAoMCk7CisKK3ZvaWQgZGlzcGxheV9wY2lfZGV2aWNlcyhzdHJ1Y3QgcGNpX2RvbWFpbiAqcGNpX2RvbWFpbikKK3sKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpX2RldmljZTsKKyAgICBjaGFyIGtlcm5lbF9tb2R1bGVzW0xJTlVYX0tFUk5FTF9NT0RVTEVfU0laRSAqCisJCQlNQVhfS0VSTkVMX01PRFVMRVNfUEVSX1BDSV9ERVZJQ0VdOworCisgICAgZm9yX2VhY2hfcGNpX2Z1bmMocGNpX2RldmljZSwgcGNpX2RvbWFpbikgeworCisJbWVtc2V0KGtlcm5lbF9tb2R1bGVzLCAwLCBzaXplb2Yga2VybmVsX21vZHVsZXMpOworCisvKglwcmludGYoIlBDSTogZm91bmQgJWQga2VybmVsIG1vZHVsZXMgZm9yICAlMDR4OiUwNHhbJTA0eDolMDR4XVxuIiwKKwkJICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+bGludXhfa2VybmVsX21vZHVsZV9jb3VudCwKKwkJICBwY2lfZGV2aWNlLT52ZW5kb3IsIHBjaV9kZXZpY2UtPnByb2R1Y3QsCisJCSAgcGNpX2RldmljZS0+c3ViX3ZlbmRvciwgcGNpX2RldmljZS0+c3ViX3Byb2R1Y3QpOworKi8KKwlmb3IgKGludCBpID0gMDsgaSA8IHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlX2NvdW50OworCSAgICAgaSsrKSB7CisJICAgIGlmIChpID4gMCkgeworCQlzdHJuY2F0KGtlcm5lbF9tb2R1bGVzLCAiIHwgIiwgMyk7CisJICAgIH0KKwkgICAgc3RybmNhdChrZXJuZWxfbW9kdWxlcywKKwkJICAgIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5saW51eF9rZXJuZWxfbW9kdWxlW2ldLAorCQkgICAgTElOVVhfS0VSTkVMX01PRFVMRV9TSVpFIC0gMSk7CisJfQorCisJbW9yZXByaW50ZigiJTA0eDolMDR4WyUwNHg6JTA0eF06ICVzXG4iLAorCQkgICBwY2lfZGV2aWNlLT52ZW5kb3IsIHBjaV9kZXZpY2UtPnByb2R1Y3QsCisJCSAgIHBjaV9kZXZpY2UtPnN1Yl92ZW5kb3IsIHBjaV9kZXZpY2UtPnN1Yl9wcm9kdWN0LAorCQkgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+Y2xhc3NfbmFtZSk7CisKKwltb3JlcHJpbnRmKCIgVmVuZG9yIE5hbWUgICAgICA6ICVzXG4iLAorCQkgICBwY2lfZGV2aWNlLT5kZXZfaW5mby0+dmVuZG9yX25hbWUpOworCW1vcmVwcmludGYoIiBQcm9kdWN0IE5hbWUgICAgIDogJXNcbiIsCisJCSAgIHBjaV9kZXZpY2UtPmRldl9pbmZvLT5wcm9kdWN0X25hbWUpOworCW1vcmVwcmludGYoIiBQQ0kgYnVzIHBvc2l0aW9uIDogJTAyeDolMDJ4LiUwMXhcbiIsIF9fcGNpX2J1cywKKwkJICAgX19wY2lfc2xvdCwgX19wY2lfZnVuYyk7CisJbW9yZXByaW50ZigiIEtlcm5lbCBtb2R1bGVzICAgOiAlc1xuXG4iLCBrZXJuZWxfbW9kdWxlcyk7CisgICAgfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHN0cnVjdCBwY2lfZG9tYWluICpwY2lfZG9tYWluOworICAgIGludCByZXR1cm5fY29kZSA9IDA7CisgICAgaW50IG5iX3BjaV9kZXZpY2VzID0gMDsKKworICAgICh2b2lkKWFyZ2M7CisgICAgKHZvaWQpYXJndjsKKworICAgIC8qIFNjYW5uaW5nIHRvIGRldGVjdCBwY2kgYnVzZXMgYW5kIGRldmljZXMgKi8KKyAgICBwcmludGYoIlBDSTogU2Nhbm5pbmcgUENJIEJVU1xuIik7CisgICAgcGNpX2RvbWFpbiA9IHBjaV9zY2FuKCk7CisgICAgaWYgKCFwY2lfZG9tYWluKSB7CisJcHJpbnRmKCJQQ0k6IG5vIGRldmljZXMgZm91bmQhXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpX2RldmljZTsKKyAgICBmb3JfZWFjaF9wY2lfZnVuYyhwY2lfZGV2aWNlLCBwY2lfZG9tYWluKSB7CisJbmJfcGNpX2RldmljZXMrKzsKKyAgICB9CisKKyAgICBwcmludGYoIlBDSTogJWQgUENJIGRldmljZXMgZm91bmRcbiIsIG5iX3BjaV9kZXZpY2VzKTsKKworICAgIHByaW50ZigiUENJOiBMb29raW5nIGZvciBkZXZpY2UgbmFtZVxuIik7CisgICAgLyogQXNzaWduaW5nIHByb2R1Y3QgJiB2ZW5kb3IgbmFtZSBmb3IgZWFjaCBkZXZpY2UgKi8KKyAgICByZXR1cm5fY29kZSA9IGdldF9uYW1lX2Zyb21fcGNpX2lkcyhwY2lfZG9tYWluLCAicGNpLmlkcyIpOworICAgIGlmIChyZXR1cm5fY29kZSA9PSAtRU5PUENJSURTKSB7CisJcHJpbnRmKCJQQ0k6IEVSUk9SICFcbiIpOworCXByaW50ZigiUENJOiBVbmFibGUgdG8gb3BlbiBwY2kuaWRzIGZpbGUgaW4gY3VycmVudCBkaXJlY3RvcnkuXG4iKTsKKwlwcmludGYoIlBDSTogUENJIERldmljZSBuYW1lcyBjYW4ndCBiZSBjb21wdXRlZC5cbiIpOworICAgIH0KKworICAgIHByaW50ZigiUENJOiBSZXNvbHZpbmcgY2xhc3MgbmFtZXNcbiIpOworICAgIC8qIEFzc2lnbmluZyBjbGFzcyBuYW1lIGZvciBlYWNoIGRldmljZSAqLworICAgIHJldHVybl9jb2RlID0gZ2V0X2NsYXNzX25hbWVfZnJvbV9wY2lfaWRzKHBjaV9kb21haW4sICJwY2kuaWRzIik7CisgICAgaWYgKHJldHVybl9jb2RlID09IC1FTk9QQ0lJRFMpIHsKKwlwcmludGYoIlBDSTogRVJST1IgIVxuIik7CisJcHJpbnRmKCJQQ0k6IFVuYWJsZSB0byBvcGVuIHBjaS5pZHMgZmlsZSBpbiBjdXJyZW50IGRpcmVjdG9yeS5cbiIpOworCXByaW50ZigiUENJOiBQQ0kgY2xhc3MgbmFtZXMgY2FuJ3QgYmUgY29tcHV0ZWQuXG4iKTsKKyAgICB9CisKKyAgICBwcmludGYoIlBDSTogTG9va2luZyBmb3IgS2VybmVsIG1vZHVsZXNcbiIpOworICAgIC8qIERldGVjdGluZyB3aGljaCBrZXJuZWwgbW9kdWxlIHNob3VsZCBtYXRjaCBlYWNoIGRldmljZSAqLworICAgIHJldHVybl9jb2RlID0gZ2V0X21vZHVsZV9uYW1lX2Zyb21fcGNpbWFwKHBjaV9kb21haW4sICJtb2R1bGVzLnBjaW1hcCIpOworICAgIGlmIChyZXR1cm5fY29kZSA9PSAtRU5PTU9EVUxFU1BDSU1BUCkgeworCXByaW50ZigiUENJOiBFUlJPUiAhXG4iKTsKKwlwcmludGYoIlBDSTogVW5hYmxlIHRvIG9wZW4gbW9kdWxlcy5wY2ltYXAgZmlsZSBpbiBjdXJyZW50IGRpcmVjdG9yeS5cbiIpOworCXByaW50ZigiUENJOiBLZXJuZWwgTW9kdWxlIG5hbWVzIGNhbid0IGJlIGNvbXB1dGVkLlxuIik7CisgICAgfQorCisgICAgLyogZGlzcGxheSB0aGUgcGNpIGRldmljZXMgd2UgZm91bmQgKi8KKyAgICBkaXNwbGF5X3BjaV9kZXZpY2VzKHBjaV9kb21haW4pOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9wbWxvYWQuYyBiL2NvbTMyL21vZHVsZXMvcG1sb2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwOGQzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL21vZHVsZXMvcG1sb2FkLmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBwbWxvYWQuYworICoKKyAqIExvYWQgYSBiaW5hcnkgZmlsZSBhbmQgcnVuIGl0IGluIHByb3RlY3RlZCBtb2RlLiAgV2UgZ2l2ZSBpdAorICogYW4gRUxGLXN0eWxlIGludm9jYXRpb24gcmVjb3JkLCBiZWNhc2UsIHdoeSBub3Q/CisgKgorICogVXNhZ2U6IHBtbG9hZC5jMzIgZmlsZW5hbWUgYWRkcmVzcyBbYXJndW1lbnRzLi4uXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKworI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbW92ZWJpdHMuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9ib290cG0uaD4KKworLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIG11Y2ggbWVtb3J5IGZvciB0aGUgc3RhY2ssIHNpZ25hbCBmYWlsdXJlICovCisjZGVmaW5lIE1JTl9TVEFDSwk1MTIKKworc3RhdGljIGlubGluZSB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBmcHV0cyhtc2csIHN0ZGVycik7Cit9CisKK2ludCBib290X3Jhdyh2b2lkICpwdHIsIHNpemVfdCBsZW4sIGFkZHJfdCB3aGVyZSwgY2hhciAqKmFyZ3YpCit7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICptbCA9IE5VTEw7CisgICAgc3RydWN0IHN5c2xpbnV4X21lbW1hcCAqbW1hcCA9IE5VTEwsICphbWFwID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfcG1fcmVncyByZWdzOworICAgIGludCBhcmdjOworICAgIGFkZHJfdCBhcmdzaXplOworICAgIGNoYXIgKiphcmdwOworICAgIGFkZHJfdCBsc3RhcnQsIGxsZW47CisgICAgY2hhciAqc3RhY2tfZnJhbWUgPSBOVUxMOworICAgIGFkZHJfdCBzdGFja19mcmFtZV9zaXplOworICAgIGFkZHJfdCBzdGFja19wb2ludGVyOworICAgIHVpbnQzMl90ICpzcHA7CisgICAgY2hhciAqc2ZwOworICAgIGFkZHJfdCBzZmE7CisKKyAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZiByZWdzKTsKKworICAgIG1tYXAgPSBzeXNsaW51eF9tZW1vcnlfbWFwKCk7CisgICAgYW1hcCA9IHN5c2xpbnV4X2R1cF9tZW1tYXAobW1hcCk7CisgICAgaWYgKCFtbWFwIHx8ICFhbWFwKQorCWdvdG8gYmFpbDsKKworICAgIGRwcmludGYoIkluaXRpYWwgbWVtb3J5IG1hcDpcbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbWVtbWFwKG1tYXApOworCisgICAgZHByaW50ZigiU2VnbWVudCBhdCAweCUwOHggbGVuIDB4JTA4eFxuIiwgd2hlcmUsIGxlbik7CisKKyAgICBpZiAoc3lzbGludXhfbWVtbWFwX3R5cGUoYW1hcCwgd2hlcmUsIGxlbikgIT0gU01UX0ZSRUUpIHsKKwlwcmludGYoIk1lbW9yeSBzZWdtZW50IGF0IDB4JTA4eCAobGVuIDB4JTA4eCkgaXMgdW5hdmFpbGFibGVcbiIsCisJICAgICAgIHdoZXJlLCBsZW4pOworCWdvdG8gYmFpbDsJCS8qIE1lbW9yeSByZWdpb24gdW5hdmFpbGFibGUgKi8KKyAgICB9CisKKyAgICAvKiBNYXJrIHRoaXMgcmVnaW9uIGFzIGFsbG9jYXRlZCBpbiB0aGUgYXZhaWxhYmxlIG1hcCAqLworICAgIGlmIChzeXNsaW51eF9hZGRfbWVtbWFwKCZhbWFwLCB3aGVyZSwgbGVuLCBTTVRfQUxMT0MpKQorCWdvdG8gYmFpbDsKKworICAgIC8qIERhdGEgcHJlc2VudCByZWdpb24uICBDcmVhdGUgYSBtb3ZlIGVudHJ5IGZvciBpdC4gKi8KKyAgICBpZiAoc3lzbGludXhfYWRkX21vdmVsaXN0KCZtbCwgd2hlcmUsIChhZGRyX3QpIHB0ciwgbGVuKSkKKwlnb3RvIGJhaWw7CisKKyAgICAvKiBDcmVhdGUgdGhlIGludm9jYXRpb24gcmVjb3JkIChpbml0aWFsIHN0YWNrIGZyYW1lKSAqLworCisgICAgYXJnc2l6ZSA9IGFyZ2MgPSAwOworICAgIGZvciAoYXJncCA9IGFyZ3Y7ICphcmdwOyBhcmdwKyspIHsKKwlkcHJpbnRmKCJhcmd2WyUyZF0gPSBcIiVzXCJcbiIsIGFyZ2MsICphcmdwKTsKKwlhcmdjKys7CisJYXJnc2l6ZSArPSBzdHJsZW4oKmFyZ3ApICsgMTsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRoZSBhcmd1bWVudCBzdHJpbmdzLCBhcmd1bWVudCBwb2ludGVycywKKyAgICAgICBhcmdjLCBwbHVzIGZvdXIgemVyby13b3JkIHRlcm1pbmF0b3JzLiAqLworICAgIHN0YWNrX2ZyYW1lX3NpemUgPSBhcmdzaXplICsgYXJnYyAqIHNpemVvZihjaGFyICopICsgNSAqIHNpemVvZihsb25nKTsKKyAgICBzdGFja19mcmFtZV9zaXplID0gKHN0YWNrX2ZyYW1lX3NpemUgKyAxNSkgJiB+MTU7CisgICAgc3RhY2tfZnJhbWUgPSBjYWxsb2Moc3RhY2tfZnJhbWVfc2l6ZSwgMSk7CisgICAgaWYgKCFzdGFja19mcmFtZSkKKwlnb3RvIGJhaWw7CisKKyAgICBkcHJpbnRmKCJSaWdodCBiZWZvcmUgc3lzbGludXhfbWVtbWFwX2xhcmdlc3QoKS4uLlxuIik7CisgICAgc3lzbGludXhfZHVtcF9tZW1tYXAoYW1hcCk7CisKKyAgICBpZiAoc3lzbGludXhfbWVtbWFwX2xhcmdlc3QoYW1hcCwgU01UX0ZSRUUsICZsc3RhcnQsICZsbGVuKSkKKwlnb3RvIGJhaWw7CQkvKiBOTyBmcmVlIG1lbW9yeT8hICovCisKKyAgICBpZiAobGxlbiA8IHN0YWNrX2ZyYW1lX3NpemUgKyBNSU5fU1RBQ0sgKyAxNikKKwlnb3RvIGJhaWw7CQkvKiBJbnN1ZmZpY2llbnQgbWVtb3J5ICAqLworCisgICAgLyogSW5pdGlhbCBzdGFjayBwb2ludGVyIGFkZHJlc3MgKi8KKyAgICBzdGFja19wb2ludGVyID0gKGxzdGFydCArIGxsZW4gLSBzdGFja19mcmFtZV9zaXplKSAmIH4xNTsKKworICAgIGRwcmludGYoIlN0YWNrIGZyYW1lIGF0IDB4JTA4eCBsZW4gMHglMDh4XG4iLAorCSAgICBzdGFja19wb2ludGVyLCBzdGFja19mcmFtZV9zaXplKTsKKworICAgIC8qIENyZWF0ZSB0aGUgc3RhY2sgZnJhbWUuICBzZnAgaXMgdGhlIHBvaW50ZXIgaW4gY3VycmVudCBtZW1vcnkgZm9yCisgICAgICAgdGhlIG5leHQgYXJndW1lbnQgc3RyaW5nLCBzZmEgaXMgdGhlIGFkZHJlc3MgaW4gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UuCisgICAgICAgc3BwIGlzIHRoZSBwb2ludGVyIGludG8gdGhlIGFyZ3VtZW50IGFycmF5IGluIGN1cnJlbnQgbWVtb3J5LiAqLworICAgIHNwcCA9ICh1aW50MzJfdCAqKSBzdGFja19mcmFtZTsKKyAgICBzZnAgPSBzdGFja19mcmFtZSArIGFyZ2MgKiBzaXplb2YoY2hhciAqKSArIDUgKiBzaXplb2YobG9uZyk7CisgICAgc2ZhID0gc3RhY2tfcG9pbnRlciArIGFyZ2MgKiBzaXplb2YoY2hhciAqKSArIDUgKiBzaXplb2YobG9uZyk7CisKKyAgICAqc3BwKysgPSBhcmdjOworICAgIGZvciAoYXJncCA9IGFyZ3Y7ICphcmdwOyBhcmdwKyspIHsKKwlpbnQgYnl0ZXMgPSBzdHJsZW4oKmFyZ3ApICsgMTsJLyogSW5jbHVkaW5nIGZpbmFsIG51bGwgKi8KKwkqc3BwKysgPSBzZmE7CisJbWVtY3B5KHNmcCwgKmFyZ3AsIGJ5dGVzKTsKKwlzZnAgKz0gYnl0ZXM7CisJc2ZhICs9IGJ5dGVzOworICAgIH0KKyAgICAvKiBaZXJvIGZpZWxkcyBhcmUgYXJlYWR5IHRha2VuIGNhcmUgb2YgYnkgY2FsbG9jKCkgKi8KKworICAgIC8qIC4uLiBhbmQgd2UnbGwgd2FudCB0byBtb3ZlIGl0IGludG8gdGhlIHJpZ2h0IHBsYWNlLi4uICovCisjaWYgREVCVUcKKyAgICBpZiAoc3lzbGludXhfbWVtbWFwX3R5cGUoYW1hcCwgc3RhY2tfcG9pbnRlciwgc3RhY2tfZnJhbWVfc2l6ZSkKKwkhPSBTTVRfRlJFRSkgeworCWRwcmludGYoIlN0YWNrIGZyYW1lIGFyZWEgbm90IGZyZWUgKGhvdyBkaWQgdGhhdCBoYXBwZW4/KSFcbiIpOworCWdvdG8gYmFpbDsJCS8qIE1lbW9yeSByZWdpb24gdW5hdmFpbGFibGUgKi8KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChzeXNsaW51eF9hZGRfbWVtbWFwKCZhbWFwLCBzdGFja19wb2ludGVyLCBzdGFja19mcmFtZV9zaXplLCBTTVRfQUxMT0MpKQorCWdvdG8gYmFpbDsKKworICAgIGlmIChzeXNsaW51eF9hZGRfbW92ZWxpc3QoJm1sLCBzdGFja19wb2ludGVyLCAoYWRkcl90KSBzdGFja19mcmFtZSwKKwkJCSAgICAgIHN0YWNrX2ZyYW1lX3NpemUpKQorCWdvdG8gYmFpbDsKKworICAgIG1lbXNldCgmcmVncywgMCwgc2l6ZW9mIHJlZ3MpOworICAgIHJlZ3MuZWlwID0gd2hlcmU7CisgICAgcmVncy5lc3AgPSBzdGFja19wb2ludGVyOworCisgICAgZHByaW50ZigiRmluYWwgbWVtb3J5IG1hcDpcbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbWVtbWFwKG1tYXApOworCisgICAgZHByaW50ZigiRmluYWwgYXZhaWxhYmxlIG1hcDpcbiIpOworICAgIHN5c2xpbnV4X2R1bXBfbWVtbWFwKGFtYXApOworCisgICAgZHByaW50ZigiTW92ZWxpc3Q6XG4iKTsKKyAgICBzeXNsaW51eF9kdW1wX21vdmVsaXN0KG1sKTsKKworICAgIC8qIFRoaXMgc2hvdWxkIG5vdCByZXR1cm4uLi4gKi8KKyAgICBmcHV0cygiQm9vdGluZy4uLlxuIiwgc3Rkb3V0KTsKKyAgICBzeXNsaW51eF9zaHVmZmxlX2Jvb3RfcG0obWwsIG1tYXAsIDAsICZyZWdzKTsKKworYmFpbDoKKyAgICBpZiAoc3RhY2tfZnJhbWUpCisJZnJlZShzdGFja19mcmFtZSk7CisgICAgc3lzbGludXhfZnJlZV9tZW1tYXAoYW1hcCk7CisgICAgc3lzbGludXhfZnJlZV9tZW1tYXAobW1hcCk7CisgICAgc3lzbGludXhfZnJlZV9tb3ZlbGlzdChtbCk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgdm9pZCAqZGF0YTsKKyAgICBzaXplX3QgZGF0YV9sZW47CisgICAgYWRkcl90IHdoZXJlOworCisgICAgaWYgKGFyZ2MgPCAzKSB7CisJZXJyb3IoIlVzYWdlOiBwbWxvYWQuYzMyIGJpbl9maWxlIGFkZHJlc3MgYXJndW1lbnRzLi4uXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICB3aGVyZSA9IHN0cnRvdWwoYXJndlsyXSwgTlVMTCwgMCk7CisKKyAgICBpZiAobG9hZGZpbGUoYXJndlsxXSwgJmRhdGEsICZkYXRhX2xlbikpIHsKKwllcnJvcigiVW5hYmxlIHRvIGxvYWQgZmlsZVxuIik7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgYm9vdF9yYXcoZGF0YSwgZGF0YV9sZW4sIHdoZXJlLCAmYXJndlsxXSk7CisgICAgZXJyb3IoIkZhaWxlZCB0byBib290LCBwcm9iYWJseSBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvcG93ZXJvZmYuYyBiL2NvbTMyL21vZHVsZXMvcG93ZXJvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU1MDFlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9wb3dlcm9mZi5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDEzIFNlYmFzdGlhbiBIZXJic3p0IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcG93ZXJvZmYuYworICoKKyAqIEFQTSBwb3dlcm9mZiBtb2R1bGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorCitpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqYXJndltdIF9fdW51c2VkKQoreworCWNvbTMyc3lzX3QgaW5yZWdzLCBvdXRyZWdzOworCisJbWVtc2V0KCZpbnJlZ3MsIDAsIHNpemVvZiBpbnJlZ3MpOworCisJaW5yZWdzLmVheC5sID0gMHg1MzAwOyAvKiBBUE0gSW5zdGFsbGF0aW9uIENoZWNrICgwMGgpICovCisJaW5yZWdzLmVieC5sID0gMDsgLyogQVBNIEJJT1MgKDAwMDBoKSAqLworCV9faW50Y2FsbCgweDE1LCAmaW5yZWdzLCAmb3V0cmVncyk7CisKKwlpZiAob3V0cmVncy5lZmxhZ3MubCAmIEVGTEFHU19DRikgeworCQlwcmludGYoIkFQTSBub3QgcHJlc2VudC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKG91dHJlZ3MuZWJ4LmwgJiAweGZmZmYpICE9IDB4NTA0ZCkgeyAvKiBzaWduYXR1cmUgJ1BNJyAqLworCQlwcmludGYoIkFQTSBub3QgcHJlc2VudC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKG91dHJlZ3MuZWF4LmwgJiAweGZmZmYpIDwgMHgxMDEpIHsgLyogTmVlZCB2ZXJzaW9uIDEuMSsgKi8KKwkJcHJpbnRmKCJBUE0gMS4xKyBub3Qgc3VwcG9ydGVkLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmICgob3V0cmVncy5lY3gubCAmIDB4OCkgPT0gMHg4KSB7IC8qIGJpdCAzIEFQTSBCSU9TIFBvd2VyIE1hbmFnZW1lbnQgZGlzYWJsZWQgKi8KKwkJcHJpbnRmKCJQb3dlciBtYW5hZ2VtZW50IGRpc2FibGVkLlxuIik7CisJCXJldHVybiAxOworCX0KKworCW1lbXNldCgmaW5yZWdzLCAwLCBzaXplb2YgaW5yZWdzKTsKKwlpbnJlZ3MuZWF4LmwgPSAweDUzMDE7IC8qIEFQTSBSZWFsIE1vZGUgSW50ZXJmYWNlIENvbm5lY3QgKDAxaCkgKi8KKwlpbnJlZ3MuZWJ4LmwgPSAwOyAvKiBBUE0gQklPUyAoMDAwMGgpICovCisJX19pbnRjYWxsKDB4MTUsICZpbnJlZ3MsICZvdXRyZWdzKTsKKworCWlmIChvdXRyZWdzLmVmbGFncy5sICYgRUZMQUdTX0NGKSB7CisJCXByaW50ZigiQVBNIFJNIGludGVyZmFjZSBjb25uZWN0IGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwltZW1zZXQoJmlucmVncywgMCwgc2l6ZW9mIGlucmVncyk7CisJaW5yZWdzLmVheC5sID0gMHg1MzBlOyAvKiBBUE0gRHJpdmVyIFZlcnNpb24gKDBFaCkgKi8KKwlpbnJlZ3MuZWJ4LmwgPSAwOyAvKiBBUE0gQklPUyAoMDAwMGgpICovCisJaW5yZWdzLmVjeC5sID0gMHgxMDE7IC8qIEFQTSBEcml2ZXIgdmVyc2lvbiAxLjEgKi8KKwlfX2ludGNhbGwoMHgxNSwgJmlucmVncywgJm91dHJlZ3MpOworCisJaWYgKG91dHJlZ3MuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpIHsKKwkJcHJpbnRmKCJBUE0gMS4xKyBub3Qgc3VwcG9ydGVkLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmICgob3V0cmVncy5lY3gubCAmIDB4ZmZmZikgPCAweDEwMSkgeyAvKiBBUE0gQ29ubmVjdGlvbiB2ZXJzaW9uICovCisJCXByaW50ZigiQVBNIDEuMSsgbm90IHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwltZW1zZXQoJmlucmVncywgMCwgc2l6ZW9mIGlucmVncyk7CisJaW5yZWdzLmVheC5sID0gMHg1MzA3OyAvKiBTZXQgUG93ZXIgU3RhdGUgKDA3aCkgKi8KKwlpbnJlZ3MuZWJ4LmwgPSAxOyAvKiBBbGwgZGV2aWNlcyBwb3dlciBtYW5hZ2VkIGJ5IHRoZSBBUE0gQklPUyAqLworCWlucmVncy5lY3gubCA9IDM7IC8qIFBvd2VyIHN0YXRlIG9mZiAqLworCV9faW50Y2FsbCgweDE1LCAmaW5yZWdzLCAmb3V0cmVncyk7CisKKwlpZiAob3V0cmVncy5lZmxhZ3MubCAmIEVGTEFHU19DRikgeworCQlwcmludGYoIlBvd2VyIG9mZiBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL3ByZGhjcC5jIGIvY29tMzIvbW9kdWxlcy9wcmRoY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWUyOTVlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9wcmRoY3AuYwpAQCAtMCwwICsxLDE2NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTAtMjAxMSBHZW5lIEN1bW0gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQb3J0aW9ucyBmcm9tIGNoYWluLmM6CisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqICAgU2lnbmlmaWNhbnQgcG9ydGlvbnMgY29weXJpZ2h0IChDKSAyMDEwIFNoYW8gTWlsbGVyCisgKgkJCQkJW3BhcnRpdGlvbiBpdGVyYXRpb24sIEdQVCwgImZzIl0KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcHJkaGNwLmMKKyAqCisgKiBQcmludCB0aGUgY29udGVudHMgb2YgdGhlIDMgREhDUCBwYWNrZXRzCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y29uc29sZXMuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9sb2FkZmlsZS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Jvb3RybS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3ZpZGVvLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9weGUuaD4KKyNpbmNsdWRlIDxzeXMvZ3B4ZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdldGtleS5oPgorCisjZGVmaW5lIFBSREhDUF9ERUJVRyAwCisKKyNkZWZpbmUgZHByaW50ZjAoZiwgLi4uKQkJKCh2b2lkKTApCisKKyNpZmRlZiBQUkRIQ1BfREVCVUcKKyMgIGRlZmluZSBkcHJlc3NhbnlrZXkJCQlwcmVzc2FueWtleQorIyAgZGVmaW5lIGRwcmludGYJCQlwcmludGYKKyMgIGRlZmluZSBkcHJpbnRfcHhlX2Jvb3RwX3QJCXByaW50X3B4ZV9ib290cF90CisjICBkZWZpbmUgZHByaW50X3B4ZV92ZW5kb3JfYmxrCQlwcmludF9weGVfdmVuZG9yX2JsaworIyAgZGVmaW5lIGRwcmludF9weGVfdmVuZG9yX3JhdwkJcHJpbnRfcHhlX3ZlbmRvcl9yYXcKKyNlbHNlCisjICBkZWZpbmUgZHByZXNzYW55a2V5KHZvaWQpCQkoKHZvaWQpMCkKKyMgIGRlZmluZSBkcHJpbnRmKGYsIC4uLikJCSgodm9pZCkwKQorIyAgZGVmaW5lIGRwcmludF9weGVfYm9vdHBfdChwLCBsKQkoKHZvaWQpMCkKKyMgIGRlZmluZSBkcHJpbnRfcHhlX3ZlbmRvcl9ibGsocCwgbCkJKCh2b2lkKTApCisjICBkZWZpbmUgZHByaW50X3B4ZV92ZW5kb3JfcmF3KHAsIGwpCSgodm9pZCkwKQorI2VuZGlmCisKKyNkZWZpbmUgZHByaW50Zl9vcHRfY3AJZHByaW50ZjAKKyNkZWZpbmUgZHByaW50Zl9vcHRfaW5qCWRwcmludGYKKworCitjb25zdCBjaGFyIGFwcF9uYW1lX3N0cltdID0gInByZGhjcC5jMzIiOworCisKK2ludCBwcmVzc2FueWtleSh2b2lkKSB7CisgICAgaW50IGluYzsKKworICAgIHByaW50ZigiUHJlc3MgYW55IGtleSB0byBjb250aW51ZS4gIik7CisgICAgaW5jID0gS0VZX05PTkU7CisgICAgd2hpbGUgKGluYyA9PSBLRVlfTk9ORSkKKwlpbmMgPSBnZXRfa2V5KHN0ZGluLCA2MDAwKTsKKyAgICBwdXRzKCIiKTsKKyAgICByZXR1cm4gaW5jOworfQorCit2b2lkIHByaW50X3B4ZV92ZW5kb3JfYmxrKHB4ZV9ib290cF90ICpwLCBzaXplX3QgbGVuKQoreworICAgIGludCBpLCB2bGVuLCBvcGxlbiwgajsKKyAgICB1aW50OF90ICpkOworICAgIHVpbnQzMl90IG1hZ2ljOworICAgIGlmICghcCkgeworCXByaW50ZigiICBwYWNrZXQgcG9pbnRlciBpcyBudWxsXG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIHZsZW4gPSBsZW4gLSAoKHZvaWQgKikmKHAtPnZlbmRvcikgLSAodm9pZCAqKXApOworICAgIHByaW50ZigiICBWZW5kb3IgRGF0YTogICAgTGVuPSVkIiwgdmxlbik7CisgICAgZCA9IHAtPnZlbmRvci5kOworICAgIC8qIFByaW50IG9ubHkgMjU2IGNoYXJhY3RlcnMgb2YgdGhlIHZlbmRvci9vcHRpb24gZGF0YSAqLworICAgIC8qCisgICAgcHJpbnRfcHhlX3ZlbmRvcl9yYXcocCwgKGxlbiAtIHZsZW4pICsgMjU2KTsKKyAgICB2bGVuID0gMDsKKyAgICAqLworICAgIG1hZ2ljID0gbnRvaGwoKigodWludDMyX3QgKilkKSk7CisgICAgcHJpbnRmKCIgICAgTWFnaWM6ICUwOFgiLCBudG9obCgqKCh1aW50MzJfdCAqKWQpKSk7CisgICAgaWYgKG1hZ2ljICE9IFZNX1JGQzEwNDgpCS8qIEludmFsaWQgREhDUCBwYWNrZXQgKi8KKwl2bGVuID0gMDsKKyAgICBmb3IgKGkgPSA0OyBpIDwgdmxlbjsgaSsrKSB7CisJaWYgKGRbaV0pCS8qIFNraXAgdGhlIHBhZGRpbmcgKi8KKwkgICAgcHJpbnRmKCJcbiAgICBAJTAzWC0lM2QiLCBpLCBkW2ldKTsKKwlpZiAoZFtpXSA9PSAyNTUpCS8qIEVuZCBvZiBsaXN0ICovCisJICAgIGJyZWFrOworCWlmIChkW2ldKSB7CisJICAgIG9wbGVuID0gZFsrK2ldOworCSAgICBwcmludGYoIiBsPSUzZDoiLCBvcGxlbik7CisJICAgIGZvciAoaiA9ICgrK2kgKyBvcGxlbik7IGkgPCB2bGVuICYmIGkgPCBqOyBpKyspIHsKKwkJcHJpbnRmKCIgJTAyWCIsIGRbaV0pOworCSAgICB9CisJICAgIGktLTsKKwl9CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCBwcmludF9weGVfYm9vdHBfdChweGVfYm9vdHBfdCAqcCwgc2l6ZV90IGxlbikKK3sKKyAgICBpZiAoIXApIHsKKwlwcmludGYoIiAgcGFja2V0IHBvaW50ZXIgaXMgbnVsbFxuIik7CisJcmV0dXJuOworICAgIH0KKyAgICBwcmludGYoIiAgb3A6JTAyWCAgaHc6JTAyWCAgaGw6JTAyWCAgZ2g6JTAyWCAgaWQ6JTA4WCBzZTolMDRYIGY6JTA0WCIKKwkiICBjaXA6JTA4WFxuIiwgcC0+b3Bjb2RlLCBwLT5IYXJkd2FyZSwgcC0+SGFyZGxlbiwgcC0+R2F0ZWhvcHMsCisJbnRvaGwocC0+aWRlbnQpLCBudG9ocyhwLT5zZWNvbmRzKSwgbnRvaHMocC0+RmxhZ3MpLCBudG9obChwLT5jaXApKTsKKyAgICBwcmludGYoIiAgeWlwOiUwOFggIHNpcDolMDhYICBnaXA6JTA4WCIsCisJbnRvaGwocC0+eWlwKSwgbnRvaGwocC0+c2lwKSwgbnRvaGwocC0+Z2lwKSk7CisgICAgcHJpbnRmKCIgIGNhZGRyLSUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLCBwLT5DQWRkclswXSwKKwlwLT5DQWRkclsxXSwgcC0+Q0FkZHJbMl0sIHAtPkNBZGRyWzNdLCBwLT5DQWRkcls0XSwgcC0+Q0FkZHJbNV0pOworICAgIHByaW50ZigiICBzTmFtZTogJyVzJ1xuIiwgcC0+U25hbWUpOworICAgIHByaW50ZigiICBib290ZmlsZTogJyVzJ1xuIiwgcC0+Ym9vdGZpbGUpOworICAgIHByaW50X3B4ZV92ZW5kb3JfYmxrKHAsIGxlbik7Cit9CisKK3ZvaWQgcHJpbnRfZGhjcF9wa3RfYWxsKHZvaWQpCit7CisgICAgcHhlX2Jvb3RwX3QgKnA7CisgICAgc2l6ZV90IGxlbjsKKyAgICBpbnQgaTsKKyAgICBpbnQgcHR5cGVbM10gPSB7UFhFTlZfUEFDS0VUX1RZUEVfREhDUF9ESVNDT1ZFUiwgUFhFTlZfUEFDS0VUX1RZUEVfREhDUF9BQ0ssIFBYRU5WX1BBQ0tFVF9UWVBFX0NBQ0hFRF9SRVBMWX07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJaWYgKCFweGVfZ2V0X2NhY2hlZF9pbmZvKHB0eXBlW2ldLAorCQkodm9pZCAqKikmKHApLCAmKGxlbikpKSB7CisJICAgIGRwcmludGYoIkdvdCBwYWNrZXQgIyVkLyVkXG4iLCAoaSArIDEpLCBwdHlwZVtpXSk7CisJICAgIHByaW50X3B4ZV9ib290cF90KHAsIGxlbik7CisJICAgIHByZXNzYW55a2V5KCk7CisJfQorICAgIH0KK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgcnY9IC0xOworICAgIGNvbnN0IHN0cnVjdCBzeXNsaW51eF92ZXJzaW9uICpzdjsKKworICAgIGNvbnNvbGVfYW5zaV9yYXcoKTsKKyAgICBzdiA9IHN5c2xpbnV4X3ZlcnNpb24oKTsKKyAgICBpZiAoc3YtPmZpbGVzeXN0ZW0gIT0gU1lTTElOVVhfRlNfUFhFTElOVVgpIHsKKwlwcmludGYoIiVzOiBNYXkgb25seSBydW4gaW4gUFhFTElOVVhcbiIsIGFwcF9uYW1lX3N0cik7CisJcmV0dXJuIC0yOworICAgIH0KKyAgICBwcmludF9kaGNwX3BrdF9hbGwoKTsKKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL3B3ZC5jIGIvY29tMzIvbW9kdWxlcy9wd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk0ZTNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9wd2QuYwpAQCAtMCwwICsxLDUwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMCBHZW5lIEN1bW0gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIERpc3BsYXkgcHJlc2VudCAoY3VycmVudCkgd29ya2luZyBkaXJlY3RvcnkKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworLyogU2l6ZSBvZiBwYXRoIGJ1ZmZlciBzdHJpbmcgKi8KKyNpZm5kZWYgUEFUSF9NQVgKKyMgIGlmZGVmIE5BTUVfTUFYCisjICAgIGRlZmluZSBQQVRIX01BWCAgIE5BTUVfTUFYCisjICBlbGlmIEZJTEVOQU1FX01BWAorIyAgICBkZWZpbmUgUEFUSF9NQVggICBGSUxFTkFNRV9NQVgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFBBVEhfTUFYICAgMjU2CisjICBlbmRpZiAgICAgICAvKiBOQU1FX01BWCAqLworI2VuZGlmIC8qIFBBVEhfTUFYICovCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IHJ2ID0gMDsKKyAgICBjaGFyIHB3ZFtQQVRIX01BWF0sICpwd2RwdHI7CisKKyAgICBwd2RwdHIgPSBnZXRjd2QocHdkLCBQQVRIX01BWCk7CisgICAgaWYgKHB3ZHB0cikgeworICAgICAgIGlmIChwd2RbMF0gIT0gMCkKKyAgICAgICAgICAgcHV0cyhwd2QpOworICAgICAgIGVsc2UKKyAgICAgICAgICAgcHV0cygiLiIpOworICAgIH0gZWxzZSB7CisgICAgICAgcnYgPSBlcnJubzsKKyAgICAgICBwdXRzKCJFUlJPUjogZ2V0Y3dkKCkgcmV0dXJuZWQgTlVMTCIpOworICAgIH0KKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL3B4ZWNobi5jIGIvY29tMzIvbW9kdWxlcy9weGVjaG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGUyMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9weGVjaG4uYwpAQCAtMCwwICsxLDExNDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDEwLTIwMTIgR2VuZSBDdW1tIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUG9ydGlvbnMgZnJvbSBjaGFpbi5jOgorICogICBDb3B5cmlnaHQgMjAwMy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKiAgIFNpZ25pZmljYW50IHBvcnRpb25zIGNvcHlyaWdodCAoQykgMjAxMCBTaGFvIE1pbGxlcgorICoJCQkJCVtwYXJ0aXRpb24gaXRlcmF0aW9uLCBHUFQsICJmcyJdCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHB4ZWNobi5jCisgKgorICogUFhFIENoYWluIExvYWRlcjsgQ2hhaW4gbG9hZCB0byBhbm90aGVyIFBYRSBuZXR3b3JrIGJvb3QgcHJvZ3JhbQorICogdGhhdCBtYXkgYmUgb24gYW5vdGhlciBob3N0LgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGNvbnNvbGVzLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzbGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbG9hZGZpbGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9ib290cm0uaD4KKyNpbmNsdWRlIDxzeXNsaW51eC92aWRlby5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvcHhlLmg+CisjaW5jbHVkZSA8c3lzL2dweGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxnZXRrZXkuaD4KKyNpbmNsdWRlIDxkaGNwLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKworI2lmZGVmIERFQlVHCisjICBkZWZpbmUgUFhFQ0hOX0RFQlVHIDEKKyNlbHNlCisjICBkZWZpbmUgUFhFQ0hOX0RFQlVHIDAKKyNlbmRpZgorCit0eXBlZGVmIHVuaW9uIHsKKyAgICB1aW50NjRfdCBxOworICAgIHVpbnQzMl90IGxbMl07CisgICAgdWludDE2X3Qgd1s0XTsKKyAgICB1aW50OF90IGJbOF07Cit9IHJlZzY0X3Q7CisKKyNkZWZpbmUgZHByaW50ZjAoZiwgLi4uKQkJKCh2b2lkKTApCisKKyNpZm5kZWYgZHByaW50ZgorIyAgaWYgKFBYRUNITl9ERUJVRyA+IDApCisjICAgIGRlZmluZSBkcHJpbnRmCQkJcHJpbnRmCisjICBlbHNlCisjICAgIGRlZmluZSBkcHJpbnRmKGYsIC4uLikJCSgodm9pZCkwKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKFBYRUNITl9ERUJVRyA+IDApCisjICBkZWZpbmUgZHByZXNzYW55a2V5CQkJcHJlc3NhbnlrZXkKKyMgIGRlZmluZSBkcHJpbnRfcHhlX2Jvb3RwX3QJCXByaW50X3B4ZV9ib290cF90CisjICBkZWZpbmUgZHByaW50X3B4ZV92ZW5kb3JfYmxrCQlwcmludF9weGVfdmVuZG9yX2JsaworIyAgZGVmaW5lIGRwcmludF9weGVfdmVuZG9yX3JhdwkJcHJpbnRfcHhlX3ZlbmRvcl9yYXcKKyNlbHNlCisjICBkZWZpbmUgZHByZXNzYW55a2V5KHRtKQkJKCh2b2lkKTApCisjICBkZWZpbmUgZHByaW50X3B4ZV9ib290cF90KHAsIGwpCSgodm9pZCkwKQorIyAgZGVmaW5lIGRwcmludF9weGVfdmVuZG9yX2JsayhwLCBsKQkoKHZvaWQpMCkKKyMgIGRlZmluZSBkcHJpbnRfcHhlX3ZlbmRvcl9yYXcocCwgbCkJKCh2b2lkKTApCisjZW5kaWYKKworI2RlZmluZSBkcHJpbnRmX29wdF9jcAkJZHByaW50ZjAKKyNkZWZpbmUgZHByaW50Zl9vcHRfaW5qCQlkcHJpbnRmMAorI2RlZmluZSBkcHJpbnRmX3BjX3BhCQlkcHJpbnRmCisjZGVmaW5lIGRwcmludGZfcGNfc29fcwkJZHByaW50ZjAKKworI2RlZmluZSB0X1BYRU5WX1JFU1RBUlRfVEZUUAl0X1BYRU5WX1RGVFBfUkVBRF9GSUxFCisKKyNkZWZpbmUgU1RBQ0tfU1BMSVQJMTEKKworLyogc2FtZSBhcyBweGVsaW51eC5hc20gUkVCT09UX1RJTUUgKi8KKyNkZWZpbmUgUkVCT09UX1RJTUUJMzAwCisKKyNkZWZpbmUgTlVNX0RIQ1BfT1BUUwkJMjU2CisjZGVmaW5lIERIQ1BfT1BUX0xFTl9NQVgJMjU2CisjZGVmaW5lIFBYRV9WRU5ET1JfUkFXX1BSTl9NQVgJMHg3RgorI2RlZmluZSBQWEVDSE5fSE9TVF9MRU4JCTI1NgkvKiA2MyBieXRlcyBwZXIgbGFiZWw7IDI1NSBtYXggdG90YWwgKi8KKworI2RlZmluZSBQWEVDSE5fTlVNX1BLVF9UWVBFCTMKKyNkZWZpbmUgUFhFQ0hOX05VTV9QS1RfQVZBSUwJMipQWEVDSE5fTlVNX1BLVF9UWVBFCisjZGVmaW5lIFBYRUNITl9QS1RfVFlQRV9TVEFSVAlQWEVOVl9QQUNLRVRfVFlQRV9ESENQX0RJU0NPVkVSCisKKyNkZWZpbmUgUFhFQ0hOX0ZPUkNFX1BLVDEJMHg4MDAwMDAwMAorI2RlZmluZSBQWEVDSE5fRk9SQ0VfUEtUMgkweDQwMDAwMDAwCisjZGVmaW5lIFBYRUNITl9GT1JDRV9BTEwJKFBYRUNITl9GT1JDRV9QS1QxIHwgUFhFQ0hOX0ZPUkNFX1BLVDIpCisjZGVmaW5lIFBYRUNITl9GT1JDRV9BTExfMQkwCisjZGVmaW5lIFNUUkFTSU5UX3N0cgkJKCdzJyArICgoJ3QnICsgKCdyJyA8PCA4KSkgPDwgOCkpCisKKyNkZWZpbmUgbWluKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCitjb25zdCBjaGFyIGFwcF9uYW1lX3N0cltdID0gInB4ZWNobi5jMzIiOworCitzdHJ1Y3QgcHhlbGludXhfb3B0IHsKKyAgICBjaGFyICpmbjsJLyogRmlsZW5hbWUgYXMgcGFzc2VkIHRvIHVzICovCisgICAgaW5fYWRkcl90IGZpcDsJLyogZm4ncyBJUCBjb21wb25lbnQgKi8KKyAgICBjaGFyICpmcDsJLyogZm4ncyBwYXRoIGNvbXBvbmVudCAqLworICAgIGluX2FkZHJfdCBnaXA7CS8qIGdpYWRkcjsgR2F0ZXdheS9ESENQIHJlbGF5ICovCisgICAgdWludDMyX3QgZm9yY2U7CisgICAgdWludDMyX3Qgd2FpdDsJLyogQWRkaXRpb25hbCBkZWNpc2lvbiB0byB3YWl0IGJlZm9yZSBib290ICovCisgICAgaW50MzJfdCB3ZHM7CS8qIFdEUyBvcHRpb24vbGV2ZWwgKi8KKyAgICBpbl9hZGRyX3Qgc2lwOwkvKiBzaWFkZHI6IE5leHQgU2VydmVyIElQIEFkZHJlc3MgKi8KKyAgICBzdHJ1Y3QgZGhjcF9vcHRpb24gcFtQWEVDSE5fTlVNX1BLVF9BVkFJTF07CisJLyogb3JpZ2luYWwgX0RIQ1BfRElTQ09WRVIsIF9ESENQX0FDSywgX0NBQ0hFRF9SRVBMWSB0aGVuIG1vZGlmaWVkIHBhY2tldHMgKi8KKyAgICBjaGFyIGhvc3RbUFhFQ0hOX0hPU1RfTEVOXTsKKyAgICBzdHJ1Y3QgZGhjcF9vcHRpb24gb3B0c1tQWEVDSE5fTlVNX1BLVF9UWVBFXVtOVU1fREhDUF9PUFRTXTsKKyAgICBjaGFyIHBfdW5wYWNrZWRbUFhFQ0hOX05VTV9QS1RfVFlQRV07Cit9OworCisKKy8qIGZyb20gY2hhaW4uYyAqLworc3RydWN0IGRhdGFfYXJlYSB7CisgICAgdm9pZCAqZGF0YTsKKyAgICBhZGRyX3QgYmFzZTsKKyAgICBhZGRyX3Qgc2l6ZTsKK307CisKKy8qIEZyb20gY2hhaW4uYyAqLworc3RhdGljIGlubGluZSB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBmcHV0cyhtc2csIHN0ZGVycik7Cit9CisKKy8qIEZyb20gY2hhaW4uYyAqLworc3RhdGljIHZvaWQgZG9fYm9vdChzdHJ1Y3QgZGF0YV9hcmVhICpkYXRhLCBpbnQgbmRhdGEsCisJCSAgICBzdHJ1Y3Qgc3lzbGludXhfcm1fcmVncyAqcmVncykKK3sKKyAgICB1aW50MTZfdCAqY29uc3QgYmlvc19mYm0gPSAodWludDE2X3QgKikgMHg0MTM7CisgICAgYWRkcl90IGRvc21lbSA9ICpiaW9zX2ZibSA8PCAxMDsJLyogVGVjaG5pY2FsbHkgYSBsb3cgYm91bmQgKi8KKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptbWFwOworICAgIHN0cnVjdCBzeXNsaW51eF9tb3ZlbGlzdCAqbWxpc3QgPSBOVUxMOworICAgIGFkZHJfdCBlbmRpbWFnZTsKKyAgICBpbnQgaTsKKworICAgIG1tYXAgPSBzeXNsaW51eF9tZW1vcnlfbWFwKCk7CisKKyAgICBpZiAoIW1tYXApIHsKKwllcnJvcigiQ2Fubm90IHJlYWQgc3lzdGVtIG1lbW9yeSBtYXBcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBlbmRpbWFnZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG5kYXRhOyBpKyspIHsKKwlpZiAoZGF0YVtpXS5iYXNlICsgZGF0YVtpXS5zaXplID4gZW5kaW1hZ2UpCisJICAgIGVuZGltYWdlID0gZGF0YVtpXS5iYXNlICsgZGF0YVtpXS5zaXplOworICAgIH0KKyAgICBpZiAoZW5kaW1hZ2UgPiBkb3NtZW0pCisJZ290byB0b29fYmlnOworCisgICAgZm9yIChpID0gMDsgaSA8IG5kYXRhOyBpKyspIHsKKwlpZiAoc3lzbGludXhfYWRkX21vdmVsaXN0KCZtbGlzdCwgZGF0YVtpXS5iYXNlLAorCQkJCSAgKGFkZHJfdCkgZGF0YVtpXS5kYXRhLCBkYXRhW2ldLnNpemUpKQorCSAgICBnb3RvIGVub21lbTsKKyAgICB9CisKKworICAgIC8qIFRlbGwgdGhlIHNodWZmbGVyIG5vdCB0byBtdWNrIHdpdGggdGhpcyBhcmVhLi4uICovCisgICAgc3lzbGludXhfYWRkX21lbW1hcCgmbW1hcCwgZW5kaW1hZ2UsIDB4YTAwMDAgLSBlbmRpbWFnZSwgU01UX1JFU0VSVkVEKTsKKworICAgIC8qIEZvcmNlIHRleHQgbW9kZSAqLworICAgIHN5c2xpbnV4X2ZvcmNlX3RleHRfbW9kZSgpOworCisgICAgZnB1dHMoIkJvb3RpbmcuLi5cbiIsIHN0ZG91dCk7CisgICAgc3lzbGludXhfc2h1ZmZsZV9ib290X3JtKG1saXN0LCBtbWFwLCAzLCByZWdzKTsKKyAgICBlcnJvcigiQ2hhaW5ib290IGZhaWxlZCFcbiIpOworICAgIHJldHVybjsKKwordG9vX2JpZzoKKyAgICBlcnJvcigiTG9hZGVyIGZpbGUgdG9vIGxhcmdlXG4iKTsKKyAgICByZXR1cm47CisKK2Vub21lbToKKyAgICBlcnJvcigiT3V0IG9mIG1lbW9yeVxuIik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHVzYWdlKHZvaWQpCit7CisgICAgcHJpbnRmKCJVU0FHRTpcbiIKKyAgICAgICAgIiAgICAlcyBbT1BUSU9OU10uLi4gX25ldy1uYnBfXG4iCisJIiAgICAlcyAtciBfbmV3LW5icF8gICAgKGNhbGxzIFBYRSBzdGFjayBQWEVOVl9SRVNUQVJUX1RGVFApXG4iCisJIk9QVElPTlM6XG4iCisJIiAgICBbLWMgY29uZmlnXSBbLWcgZ2F0ZXdheV0gWy1wIHByZWZpeF0gWy10IHJlYm9vdF0gWy11XSBbLXddIFstV10iCisJIiBbLW8gb3B0LnR5PXZhbF1cblxuIiwKKwlhcHBfbmFtZV9zdHIsIGFwcF9uYW1lX3N0cik7Cit9CisKK3ZvaWQgcHhlX2Vycm9yKGludCBpZXJyLCBjb25zdCBjaGFyICpldnQsIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBpZiAobXNnKQorCXByaW50ZigiJXMiLCBtc2cpOworICAgIGVsc2UgaWYgKGV2dCkKKwlwcmludGYoIkVycm9yIHdoaWxlICVzOiAiLCBldnQpOworICAgIHByaW50ZigiJWQ6JXNcbiIsIGllcnIsIHN0cmVycm9yKGllcnIpKTsKK30KKworaW50IHByZXNzYW55a2V5KGNsb2NrX3QgdG0pIHsKKyAgICBpbnQgaW5jOworCisgICAgcHJpbnRmKCJQcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlLiAiKTsKKyAgICBpbmMgPSBnZXRfa2V5KHN0ZGluLCB0bSk7CisgICAgcHV0cygiIik7CisgICAgcmV0dXJuIGluYzsKK30KKworaW50IGRoY3BfZmluZF9vcHQocHhlX2Jvb3RwX3QgKnAsIHNpemVfdCBsZW4sIHVpbnQ4X3Qgb3B0KQoreworICAgIGludCBydiA9IC0xOworICAgIGludCBpLCB2bGVuLCBvcGxlbjsKKyAgICB1aW50OF90ICpkOworICAgIHVpbnQzMl90IG1hZ2ljOworCisgICAgaWYgKCFwKSB7CisJZHByaW50ZigiICBwYWNrZXQgcG9pbnRlciBpcyBudWxsXG4iKTsKKwlyZXR1cm4gcnY7CisgICAgfQorICAgIHZsZW4gPSBsZW4gLSAoKHZvaWQgKikmKHAtPnZlbmRvcikgLSAodm9pZCAqKXApOworICAgIGQgPSBwLT52ZW5kb3IuZDsKKyAgICBtYWdpYyA9IG50b2hsKCooKHVpbnQzMl90ICopZCkpOworICAgIGlmIChtYWdpYyAhPSBWTV9SRkMxMDQ4KQkvKiBJbnZhbGlkIERIQ1AgcGFja2V0ICovCisJdmxlbiA9IDA7CisgICAgZm9yIChpID0gNDsgaSA8IHZsZW47IGkrKykgeworCWlmIChkW2ldID09IG9wdCkgeworCSAgICBkcHJpbnRmKCJcbiAgICBAJTAzWC0lMmRcbiIsIGksIGRbaV0pOworCSAgICBydiA9IGk7CisJICAgIGJyZWFrOworCX0KKwlpZiAoZFtpXSA9PSAoKE5VTV9ESENQX09QVFMpIC0gMSkpCS8qIEVuZCBvZiBsaXN0ICovCisJICAgIGJyZWFrOworCWlmIChkW2ldKSB7CQkvKiBTa2lwIHBhZGRpbmcgKi8KKwkgICAgb3BsZW4gPSBkWysraV07CisJICAgIGkgKz0gb3BsZW47CisJfQorICAgIH0KKyAgICByZXR1cm4gcnY7Cit9CisKK3ZvaWQgcHJpbnRfcHhlX3ZlbmRvcl9yYXcocHhlX2Jvb3RwX3QgKnAsIHNpemVfdCBsZW4pCit7CisgICAgaW50IGksIHZsZW47CisKKyAgICBpZiAoIXApIHsKKwlwcmludGYoIiAgcGFja2V0IHBvaW50ZXIgaXMgbnVsbFxuIik7CisJcmV0dXJuOworICAgIH0KKyAgICB2bGVuID0gbGVuIC0gKCh2b2lkICopJihwLT52ZW5kb3IpIC0gKHZvaWQgKilwKTsKKyAgICBpZiAodmxlbiA+IFBYRV9WRU5ET1JfUkFXX1BSTl9NQVgpCisJdmxlbiA9IFBYRV9WRU5ET1JfUkFXX1BSTl9NQVg7CisgICAgZHByaW50ZigiICByYXdMZW4gPSAlZCIsIHZsZW4pOworICAgIGZvciAoaSA9IDA7IGkgPCB2bGVuOyBpKyspIHsKKwlpZiAoKGkgJiAweGYpID09IDApCisJICAgIHByaW50ZigiXG4gICUwNFg6IiwgaSk7CisJcHJpbnRmKCIgJTAyWCIsIHAtPnZlbmRvci5kW2ldKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHByaW50X3B4ZV92ZW5kb3JfYmxrKHB4ZV9ib290cF90ICpwLCBzaXplX3QgbGVuKQoreworICAgIGludCBpLCB2bGVuLCBvcGxlbiwgajsKKyAgICB1aW50OF90ICpkOworICAgIHVpbnQzMl90IG1hZ2ljOworICAgIGlmICghcCkgeworCXByaW50ZigiICBwYWNrZXQgcG9pbnRlciBpcyBudWxsXG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIHZsZW4gPSBsZW4gLSAoKHZvaWQgKikmKHAtPnZlbmRvcikgLSAodm9pZCAqKXApOworICAgIHByaW50ZigiICBWZW5kb3IgRGF0YTogICAgTGVuPSVkIiwgdmxlbik7CisgICAgZCA9IHAtPnZlbmRvci5kOworICAgIG1hZ2ljID0gbnRvaGwoKigodWludDMyX3QgKilkKSk7CisgICAgcHJpbnRmKCIgICAgTWFnaWM6ICUwOFgiLCBudG9obCgqKCh1aW50MzJfdCAqKWQpKSk7CisgICAgaWYgKG1hZ2ljICE9IFZNX1JGQzEwNDgpCS8qIEludmFsaWQgREhDUCBwYWNrZXQgKi8KKwl2bGVuID0gMDsKKyAgICBmb3IgKGkgPSA0OyBpIDwgdmxlbjsgaSsrKSB7CisJaWYgKGRbaV0pCS8qIFNraXAgdGhlIHBhZGRpbmcgKi8KKwkgICAgcHJpbnRmKCJcbiAgICBAJTAzWC0lM2QiLCBpLCBkW2ldKTsKKwlpZiAoZFtpXSA9PSAoKE5VTV9ESENQX09QVFMpIC0gMSkpCS8qIEVuZCBvZiBsaXN0ICovCisJICAgIGJyZWFrOworCWlmIChkW2ldKSB7CisJICAgIG9wbGVuID0gZFsrK2ldOworCSAgICBwcmludGYoIiBsPSUzZDoiLCBvcGxlbik7CisJICAgIGZvciAoaiA9ICgrK2kgKyBvcGxlbik7IGkgPCB2bGVuICYmIGkgPCBqOyBpKyspIHsKKwkJcHJpbnRmKCIgJTAyWCIsIGRbaV0pOworCSAgICB9CisJICAgIGktLTsKKwl9CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCBwcmludF9weGVfYm9vdHBfdChweGVfYm9vdHBfdCAqcCwgc2l6ZV90IGxlbikKK3sKKyAgICBpZiAoIXAgfHwgbGVuIDw9IDApIHsKKwlwcmludGYoIiAgcGFja2V0IHBvaW50ZXIgaXMgbnVsbFxuIik7CisJcmV0dXJuOworICAgIH0KKyAgICBwcmludGYoIiAgb3A6JTAyWCAgaHc6JTAyWCAgaGw6JTAyWCAgZ2g6JTAyWCAgaWQ6JTA4WCBzZTolMDRYIGY6JTA0WCIKKwkiICBjaXA6JTA4WFxuIiwgcC0+b3Bjb2RlLCBwLT5IYXJkd2FyZSwgcC0+SGFyZGxlbiwgcC0+R2F0ZWhvcHMsCisJbnRvaGwocC0+aWRlbnQpLCBudG9ocyhwLT5zZWNvbmRzKSwgbnRvaHMocC0+RmxhZ3MpLCBudG9obChwLT5jaXApKTsKKyAgICBwcmludGYoIiAgeWlwOiUwOFggIHNpcDolMDhYICBnaXA6JTA4WCIsCisJbnRvaGwocC0+eWlwKSwgbnRvaGwocC0+c2lwKSwgbnRvaGwocC0+Z2lwKSk7CisgICAgcHJpbnRmKCIgIGNhZGRyLSUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLCBwLT5DQWRkclswXSwKKwlwLT5DQWRkclsxXSwgcC0+Q0FkZHJbMl0sIHAtPkNBZGRyWzNdLCBwLT5DQWRkcls0XSwgcC0+Q0FkZHJbNV0pOworICAgIHByaW50ZigiICBzTmFtZTogJyVzJ1xuIiwgcC0+U25hbWUpOworICAgIHByaW50ZigiICBib290ZmlsZTogJyVzJ1xuIiwgcC0+Ym9vdGZpbGUpOworICAgIGRwcmludF9weGVfdmVuZG9yX2JsayhwLCBsZW4pOworfQorCit2b2lkIHB4ZV9zZXRfcmVncyhzdHJ1Y3Qgc3lzbGludXhfcm1fcmVncyAqcmVncykKK3sKKyAgICBjb25zdCB1bmlvbiBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8gKnNkaTsKKyAgICBjb25zdCBjb20zMnN5c190ICpweGVfcmVnczsKKworICAgIHNkaSA9IHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbygpOworICAgIHB4ZV9yZWdzID0gc2RpLT5weGUuc3RhY2s7CS8qIE9yaWdpbmFsIHJlZ2lzdGVyIHZhbHVlcyAqLworCisgICAgLyogSnVzdCB0byBiZSBzdXJlLi4uICovCisgICAgbWVtc2V0KHJlZ3MsIDAsIHNpemVvZiAqcmVncyk7CisKKyAgICByZWdzLT5pcCA9IDB4N0MwMDsKKworICAgIC8qIFBvaW50IHRvIHRoZSBvcmlnaW5hbCBzdGFjayAqLworICAgIHJlZ3MtPnNzICAgID0gc2RpLT5weGUuc3RhY2tfc2VnOworICAgIHJlZ3MtPmVzcC5sID0gc2RpLT5weGUuc3RhY2tfb2ZmcyArIHNpemVvZihjb20zMnN5c190KTsKKworICAgIC8qIFBvaW50IHRvIHRoZSBQWEVOVisgYWRkcmVzcyAqLworICAgIHJlZ3MtPmVzICAgID0gcHhlX3JlZ3MtPmVzOworICAgIHJlZ3MtPmVieC5sID0gcHhlX3JlZ3MtPmVieC5sOworCisgICAgZHByaW50ZigiXG5zcDolMDR4ICAgIHNzOiUwNHggICAgZXM6JTA0eCAgICBieDolMDR4XG4iLCByZWdzLT5lc3Aud1swXSwKKwlyZWdzLT5zcywgcmVncy0+ZXMsIHJlZ3MtPmVieC53WzBdKTsKK30KKworaW50IGhvc3RsZW5fbGltaXQoaW50IGxlbikKK3sKKyAgICByZXR1cm4gbWluKGxlbiwgKChQWEVDSE5fSE9TVF9MRU4pIC0gMSkpOworfQorCisvL0ZJWE1FOiBUbyBhIGxpYnJhcnkKKy8qIFBhcnNlIGEgZmlsZW5hbWUgaW50byBhbiBJUHY0IGFkZHJlc3MgYW5kIGZpbGVuYW1lIHBvaW50ZXIKKyAqCXJldHVybnMJQmFzZWQgb24gdGhlIGludGVycHJldGF0aW9uIG9mIGZuCisgKgkJMCByZWd1bGFyIGZpbGUgbmFtZQorICoJCTEgaW4gZm9ybWF0IElQOjpGTgorICoJCTIgVEZUUCBVUkwKKyAqCQkzIEhUVFAgVVJMCisgKgkJNCBGVFAgVVJMCisgKgkJMyArIDJeMzAgSFRUUFMgVVJMCisgKgkJLTEgaWYgZm4gaXMgYW5vdGhlciBVUkwgdHlwZQorICovCitpbnQgcHhlY2huX3BhcnNlX2ZuKGNoYXIgZm5bXSwgaW5fYWRkcl90ICpmaXAsIGNoYXIgKmhvc3QsIGNoYXIgKmZwW10pCit7CisgICAgaW5fYWRkcl90IHRpcCA9IDA7CisgICAgY2hhciAqY3NlcCwgKnNzZXAsICpoc2VwOwkvKiBDb2xvbiwgU2xhc2ggc2VwYXJhdG9yIHBvc2l0aW9ucyAqLworICAgIGludCBobGVuLCBwbGVuOwkvKiBIb3N0bmFtZSwgcHJvdG9jb2wgbGVuZ3RoICovCisgICAgaW50IHJ2ID0gMDsKKworICAgIGNzZXAgPSBzdHJjaHIoZm4sICc6Jyk7CisgICAgaWYgKGNzZXApIHsKKwlpZiAoY3NlcFsxXSA9PSAnOicpIHsJLyogYXNzdW1lIElQOjpGTiAqLworCSAgICAqZnAgPSAmY3NlcFsyXTsKKwkgICAgcnYgPSAxOworCSAgICBpZiAoZm5bMF0gIT0gJzonKSB7CisJCWhsZW4gPSBob3N0bGVuX2xpbWl0KGNzZXAgLSBmbik7CisJCW1lbWNweShob3N0LCBmbiwgaGxlbik7CisJCWhvc3RbaGxlbl0gPSAwOworCSAgICB9CisJfSBlbHNlIGlmICgoY3NlcFsxXSA9PSAnLycpICYmIChjc2VwWzJdID09ICcvJykpIHsKKwkJLyogVVJMOiBwcm90bzovL2hvc3Q6cG9ydC9wYXRoL2ZpbGUgKi8KKwkJLyogcHJvdG86Ly9bdXNlcls6cGFzc3dkXUBdaG9zdFs6cG9ydF0vcGF0aC9maWxlICovCisJICAgIHNzZXAgPSBzdHJjaHIoY3NlcCArIDMsICcvJyk7CisJICAgIGlmIChzc2VwKSB7CisJCWhsZW4gPSBob3N0bGVuX2xpbWl0KHNzZXAgLSAoY3NlcCArIDMpKTsKKwkJKmZwID0gc3NlcCArIDE7CisJICAgIH0gZWxzZSB7CisJCWhsZW4gPSBob3N0bGVuX2xpbWl0KHN0cmxlbihjc2VwICsgMykpOworCSAgICB9CisJICAgIG1lbWNweShob3N0LCAoY3NlcCArIDMpLCBobGVuKTsKKwkgICAgaG9zdFtobGVuXSA9IDA7CisJICAgIHBsZW4gPSBjc2VwIC0gZm47CisJICAgIGlmIChzdHJuY21wKGZuLCAidGZ0cCIsIHBsZW4pID09IDApCisJCXJ2ID0gMjsKKwkgICAgZWxzZSBpZiAoc3RybmNtcChmbiwgImh0dHAiLCBwbGVuKSA9PSAwKQorCQlydiA9IDM7CisJICAgIGVsc2UgaWYgKHN0cm5jbXAoZm4sICJmdHAiLCBwbGVuKSA9PSAwKQorCQlydiA9IDQ7CisJICAgIGVsc2UgaWYgKHN0cm5jbXAoZm4sICJodHRwcyIsIHBsZW4pID09IDApCisJCXJ2ID0gMyArICggMSA8PCAzMCApOworCSAgICBlbHNlCisJCXJ2ID0gLTE7CisJfSBlbHNlIHsKKwkgICAgY3NlcCA9IE5VTEw7CisJfQorICAgIH0KKyAgICBpZiAoIWNzZXApIHsKKwkqZnAgPSBmbjsKKyAgICB9CisgICAgaWYgKGhvc3RbMF0pIHsKKwloc2VwID0gc3RyY2hyKGhvc3QsICdAJyk7CisJaWYgKCFoc2VwKQorCSAgICBoc2VwID0gaG9zdDsKKwl0aXAgPSBweGVfZG5zKGhzZXApOworICAgIH0KKyAgICBpZiAodGlwICE9IDApCisJKmZpcCA9IHRpcDsKKyAgICBkcHJpbnRmMCgiICBob3N0ICclcydcbiAgZnAgICAnJXMnXG4gIGZpcCAgJTA4eFxuIiwgaG9zdCwgKmZwLCBudG9obCgqZmlwKSk7CisgICAgcmV0dXJuIHJ2OworfQorCit2b2lkIHB4ZWNobl9vcHRfZnJlZShzdHJ1Y3QgZGhjcF9vcHRpb24gKm9wdCkKK3sKKyAgICBmcmVlKG9wdC0+ZGF0YSk7CisgICAgb3B0LT5sZW4gPSAtMTsKK30KKwordm9pZCBweGVjaG5fZmlsbF9wa3Qoc3RydWN0IHB4ZWxpbnV4X29wdCAqcHhlLCBpbnQgcHR5cGUpCit7CisgICAgaW50IHJ2ID0gLTE7CisgICAgaW50IHAxLCBwMjsKKyAgICBpZiAoKHB0eXBlIDwgMCkgfHwgKHB0eXBlID4gUFhFQ0hOX05VTV9QS1RfVFlQRSkpCisJcnYgPSAtMjsKKyAgICBwMSA9IHB0eXBlIC0gUFhFQ0hOX1BLVF9UWVBFX1NUQVJUOworICAgIHAyID0gcDEgKyBQWEVDSE5fTlVNX1BLVF9UWVBFOworICAgIGlmICgocnYgPj0gLTEpICYmICghcHhlX2dldF9jYWNoZWRfaW5mbyhwdHlwZSwKKwkgICAgKHZvaWQgKiopJihweGUtPnBbcDFdLmRhdGEpLCAoc2l6ZV90ICopJihweGUtPnBbcDFdLmxlbikpKSkgeworCXB4ZS0+cFtwMl0uZGF0YSA9IG1hbGxvYygyMDQ4KTsKKwlpZiAocHhlLT5wW3AyXS5kYXRhKSB7CisJICAgIG1lbWNweShweGUtPnBbcDJdLmRhdGEsIHB4ZS0+cFtwMV0uZGF0YSwgcHhlLT5wW3AxXS5sZW4pOworCSAgICBweGUtPnBbcDJdLmxlbiA9IHB4ZS0+cFtwMV0ubGVuOworCSAgICBydiA9IDA7CisJICAgIGRwcmludF9weGVfYm9vdHBfdCgocHhlX2Jvb3RwX3QgKikocHhlLT5wW3AxXS5kYXRhKSwgcHhlLT5wW3AxXS5sZW4pOworCSAgICBkcHJlc3NhbnlrZXkoSU5UX01BWCk7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRmKCIlczogRVJST1I6IFVuYWJsZSB0byBtYWxsb2MoKSBmb3Igc2Vjb25kIHBhY2tldFxuIiwgYXBwX25hbWVfc3RyKTsKKwl9CisgICAgfSBlbHNlIHsKKwlwcmludGYoIiVzOiBFUlJPUjogVW5hYmxlIHRvIHJldHJpZXZlIGZpcnN0IHBhY2tldFxuIiwgYXBwX25hbWVfc3RyKTsKKyAgICB9CisgICAgaWYgKHJ2IDw9IC0xKSB7CisJcHhlY2huX29wdF9mcmVlKCZweGUtPnBbcDFdKTsKKyAgICB9Cit9CisKK3ZvaWQgcHhlY2huX2luaXQoc3RydWN0IHB4ZWxpbnV4X29wdCAqcHhlKQoreworICAgIC8qIEluaXQgZm9yIHBhcmFub2lhICovCisgICAgcHhlLT5mbiA9IE5VTEw7CisgICAgcHhlLT5mcCA9IE5VTEw7CisgICAgcHhlLT5mb3JjZSA9IDA7CisgICAgcHhlLT53YWl0ID0gMDsKKyAgICBweGUtPmdpcCA9IDA7CisgICAgcHhlLT53ZHMgPSAwOworICAgIHB4ZS0+c2lwID0gMDsKKyAgICBweGUtPmhvc3RbMF0gPSAwOworICAgIHB4ZS0+aG9zdFsoKE5VTV9ESENQX09QVFMpIC0gMSldID0gMDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IFBYRUNITl9OVU1fUEtUX1RZUEU7IGorKyl7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fREhDUF9PUFRTOyBpKyspIHsKKwkgICAgcHhlLT5vcHRzW2pdW2ldLmRhdGEgPSBOVUxMOworCSAgICBweGUtPm9wdHNbal1baV0ubGVuID0gLTE7CisJfQorCXB4ZS0+cF91bnBhY2tlZFtqXSA9IDA7CisJcHhlLT5wW2pdLmRhdGEgPSBOVUxMOworCXB4ZS0+cFtqK1BYRUNITl9OVU1fUEtUX1RZUEVdLmRhdGEgPSBOVUxMOworCXB4ZS0+cFtqXS5sZW4gPSAwOworCXB4ZS0+cFtqK1BYRUNITl9OVU1fUEtUX1RZUEVdLmxlbiA9IDA7CisgICAgfQorICAgIHB4ZWNobl9maWxsX3BrdChweGUsIFBYRU5WX1BBQ0tFVF9UWVBFX0NBQ0hFRF9SRVBMWSk7Cit9CisKK2ludCBweGVjaG5fdG9faGV4KGNoYXIgaSkKK3sKKyAgICBpZiAoaSA+PSAnMCcgJiYgaSA8PSAnOScpCisJcmV0dXJuIChpIC0gJzAnKTsKKyAgICBpZiAoaSA+PSAnQScgJiYgaSA8PSAnRicpCisJcmV0dXJuIChpIC0gJ0EnICsgMTApOworICAgIGlmIChpID49ICdhJyAmJiBpIDw9ICdmJykKKwlyZXR1cm4gKGkgLSAnYScgKyAxMCk7CisgICAgaWYgKGkgPT0gMCkKKwlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0yOworfQorCitpbnQgcHhlY2huX3BhcnNlXzJiaGV4KGNoYXIgaW5zW10pCit7CisgICAgaW50IHJldCA9IC0yOworICAgIGludCBuMCA9IC0zLCBuMSA9IC0zOworICAgIC8qIE5VTEwgcG9pbnRlciAqLworICAgIGlmICghaW5zKSB7CisJcmV0ID0gLTE7CisgICAgLyogcHhlY2huX3RvX2hleCBjYW4gaGFuZGxlIHRoZSBOVUxMIGNoYXJhY3RlciBieSByZXR1cm5pbmcgLTEgYW5kCisgICAgICAgYnJlYWtpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3RhdGVtZW50IGNoYWluICovCisgICAgfSBlbHNlIGlmICgoKG4wID0gcHhlY2huX3RvX2hleChpbnNbMF0pKSA+PSAwKQorCSAgICAmJiAoKG4xID0gcHhlY2huX3RvX2hleChpbnNbMV0pKSA+PSAwKSkgeworCXJldCA9IChuMCAqIDE2KSArIG4xOworICAgIH0gZWxzZSBpZiAobjAgPT0gLTEpIHsJLyogTGVhZGluZyBOVUxMIGNoYXIgKi8KKwlyZXQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHB4ZWNobl9vcHRudW1fb2soaW50IG9wdG51bSkKK3sKKyAgICBpZiAoKG9wdG51bSA+IDApICYmIChvcHRudW0gPCAoKE5VTV9ESENQX09QVFMpIC0gMSkpKQorCXJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitpbnQgcHhlY2huX29wdG51bV9va19ub3RyZXMoaW50IG9wdG51bSkKK3sKKyAgICBpZiAoKG9wdG51bSA8PSAwKSAmJiAob3B0bnVtID49ICgoTlVNX0RIQ1BfT1BUUykgLSAxKSkpCisJcmV0dXJuIDA7CisgICAgc3dpdGNoKG9wdG51bSl7CisgICAgY2FzZSA2NjogY2FzZSA2NzoKKwlyZXR1cm4gMDsKKwlicmVhazsKKyAgICBkZWZhdWx0OglyZXR1cm4gMTsKKyAgICB9Cit9CisKK2ludCBweGVjaG5fb3B0bGVuX29rKGludCBvcHRsZW4pCit7CisgICAgaWYgKChvcHRsZW4gPj0gMCkgJiYgKG9wdGxlbiA8ICgoREhDUF9PUFRfTEVOX01BWCkgLSAxKSkpCisJcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBweGVjaG5fc2V0b3B0KHN0cnVjdCBkaGNwX29wdGlvbiAqb3B0LCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworICAgIHZvaWQgKnA7CisgICAgaWYgKCFvcHQgfHwgIWRhdGEpCisJcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAwKSB7CisJcmV0dXJuIC0zOworICAgIH0KKyAgICBwID0gcmVhbGxvYyhvcHQtPmRhdGEsIGxlbik7CisgICAgaWYgKCFwICYmIGxlbikgewkvKiBBbGxvdyBmb3IgbGVuPTAgKi8KKwlweGVjaG5fb3B0X2ZyZWUob3B0KTsKKwlyZXR1cm4gLTI7CisgICAgfQorICAgIG9wdC0+ZGF0YSA9IHA7CisgICAgbWVtY3B5KG9wdC0+ZGF0YSwgZGF0YSwgbGVuKTsKKyAgICBvcHQtPmxlbiA9IGxlbjsKKyAgICByZXR1cm4gbGVuOworfQorCitpbnQgcHhlY2huX3NldG9wdF9zdHIoc3RydWN0IGRoY3Bfb3B0aW9uICpvcHQsIHZvaWQgKmRhdGEpCit7CisgICAgcmV0dXJuIHB4ZWNobl9zZXRvcHQob3B0LCBkYXRhLCBzdHJubGVuKGRhdGEsIERIQ1BfT1BUX0xFTl9NQVgpKTsKK30KKworaW50IHB4ZWNobl9wYXJzZV9pbnQoY2hhciAqZGF0YSwgY2hhciBpc3RyW10sIGludCB0bGVuKQoreworICAgIGludCB0ZXJyID0gZXJybm87CisKKyAgICBpZiAoKHRsZW4gPT0gMSkgfHwgKHRsZW4gPT0gMikgfHwgKHRsZW4gPT0gNCkpIHsKKwllcnJubyA9IDA7CisJdWludDMyX3Qgb3B0dmFsID0gc3RydG91bChpc3RyLCBOVUxMLCAwKTsKKwlpZiAoZXJybm8pCisJICAgIHJldHVybiAtMzsKKwllcnJubyA9IHRlcnI7CisJc3dpdGNoKHRsZW4peworCWNhc2UgIDE6CisJICAgIGlmIChvcHR2YWwgJiAweEZGRkZGRjAwKQorCQlyZXR1cm4gLTQ7CisJICAgIGJyZWFrOworCWNhc2UgIDI6CisJICAgIGlmIChvcHR2YWwgJiAweEZGRkYwMDAwKQorCQlyZXR1cm4gLTQ7CisJICAgIG9wdHZhbCA9IGh0b25zKG9wdHZhbCk7CisJICAgIGJyZWFrOworCWNhc2UgIDQ6CisJICAgIG9wdHZhbCA9IGh0b25sKG9wdHZhbCk7CisJICAgIGJyZWFrOworCX0KKwltZW1jcHkoZGF0YSwgJm9wdHZhbCwgdGxlbik7CisgICAgfSBlbHNlIGlmICh0bGVuID09IDgpIHsKKwllcnJubyA9IDA7CisJdWludDY0X3Qgb3B0dmFsID0gc3RydG91bGwoaXN0ciwgTlVMTCwgMCk7CisJaWYgKGVycm5vKQorCSAgICByZXR1cm4gLTM7CisJZXJybm8gPSB0ZXJyOworCW9wdHZhbCA9IGh0b25xKG9wdHZhbCk7CisJbWVtY3B5KGRhdGEsICZvcHR2YWwsIHRsZW4pOworICAgIH0gZWxzZSB7CisJcmV0dXJuIC0yOworICAgIH0KKyAgICByZXR1cm4gdGxlbjsKK30KKworaW50IHB4ZWNobl9wYXJzZV9oZXhfc2VwKGNoYXIgKmRhdGEsIGNoYXIgaXN0cltdLCBjaGFyIHNlcCkKK3sKKyAgICBpbnQgbGVuID0gMDsKKyAgICBpbnQgaXBvcyA9IDAsIGljaGFyOworICAgIAorICAgIGlmICghZGF0YSB8fCAhaXN0cikKKwlyZXR1cm4gLTE7CisgICAgd2hpbGUgKChpc3RyW2lwb3NdKSAmJiAobGVuIDwgREhDUF9PUFRfTEVOX01BWCkpIHsKKwlkcHJpbnRmKCIgJTAyWCUwMlgiLCAqKChpbnQgKikoaXN0ciArIGlwb3MpKSAmIDB4RkYsICooKGludCAqKShpc3RyICsgaXBvcyArMSkpICYgMHhGRik7CisJaWNoYXIgPSBweGVjaG5fcGFyc2VfMmJoZXgoaXN0ciArIGlwb3MpOworCWlmIChpY2hhciA+PTApIHsKKwkgICAgZGF0YVtsZW4rK10gPSBpY2hhcjsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFpc3RyW2lwb3MrMl0peworCSAgICBpcG9zICs9IDI7CisJfSBlbHNlIGlmIChpc3RyW2lwb3MrMl0gIT0gc2VwKSB7CisJICAgIHJldHVybiAtKEVJTlZBTCArIDEpOworCX0gZWxzZSB7CisJICAgIGlwb3MgKz0gMzsKKwl9CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKK2ludCBweGVjaG5fcGFyc2Vfb3B0dHlwZShjaGFyIGlzdHJbXSwgaW50IG9wdG51bSkKK3sKKyAgICBjaGFyICpwb3M7CisgICAgaW50IHRsZW4sIHR5cGUsIHRtYXNrOworCisgICAgaWYgKCFpc3RyKQorCXJldHVybiAtMTsKKyAgICBwb3MgPSBzdHJjaHIoaXN0ciwgJz0nKTsKKyAgICBpZiAoIXBvcykKKwlyZXR1cm4gLTI7CisgICAgaWYgKGlzdHJbMF0gIT0gJy4nKSB7CisJaWYgKCFweGVjaG5fb3B0bnVtX29rKG9wdG51bSkpCisJICAgIHJldHVybiAtMzsKKwlyZXR1cm4gLTM7CS8qIGRvIGxvb2t1cCBoZXJlICovCisgICAgfSBlbHNlIHsKKwl0bGVuID0gcG9zIC0gaXN0ciAtIDE7CisJaWYgKCh0bGVuIDwgMSkgfHwgKHRsZW4gPiA0KSkKKwkgICAgcmV0dXJuIC00OworCXRtYXNrID0gMHhGRkZGRkZGRiA+PiAoOCAqICg0IC0gdGxlbikpOworCXR5cGUgPSAoKihpbnQqKShpc3RyICsgMSkpICYgdG1hc2s7CisgICAgfQorICAgIHJldHVybiB0eXBlOworfQorCitpbnQgcHhlY2huX3BhcnNlX3NldG9wdChzdHJ1Y3QgZGhjcF9vcHRpb24gb3B0c1tdLCBzdHJ1Y3QgZGhjcF9vcHRpb24gKmlvcHQsCisJCQljaGFyIGlzdHJbXSkKK3sKKyAgICBpbnQgcnYgPSAwLCBvcHRudW0sIG9wdHR5cGU7CisgICAgY2hhciAqY3BvcyA9IE5VTEwsICpwb3M7CisKKyAgICBpZiAoIW9wdHMgfHwgIWlvcHQgfHwgIShpb3B0LT5kYXRhKSkKKwlyZXR1cm4gLTE7CisgICAgaWYgKCFpc3RyIHx8ICFpc3RyWzBdKQorCXJldHVybiAtMjsKKyAgICAvLyAtRUlOVkFMOworICAgIG9wdG51bSA9IHN0cnRvdWwoaXN0ciwgJmNwb3MsIDApOworICAgIGlmICghcHhlY2huX29wdG51bV9vayhvcHRudW0pKQorCXJldHVybiAtMzsKKyAgICBwb3MgPSBzdHJjaHIoY3BvcywgJz0nKTsKKyAgICBpZiAoIXBvcykKKwlyZXR1cm4gLTQ7CisgICAgb3B0dHlwZSA9IHB4ZWNobl9wYXJzZV9vcHR0eXBlKGNwb3MsIG9wdG51bSk7CisgICAgcG9zKys7CisgICAgc3dpdGNoKG9wdHR5cGUpIHsKKyAgICBjYXNlICdiJzoKKwlpb3B0LT5sZW4gPSBweGVjaG5fcGFyc2VfaW50KGlvcHQtPmRhdGEsIHBvcywgMSk7CisJYnJlYWs7CisgICAgY2FzZSAnbCc6CisJaW9wdC0+bGVuID0gcHhlY2huX3BhcnNlX2ludChpb3B0LT5kYXRhLCBwb3MsIDQpOworCWJyZWFrOworICAgIGNhc2UgJ3EnOgorCWlvcHQtPmxlbiA9IHB4ZWNobl9wYXJzZV9pbnQoaW9wdC0+ZGF0YSwgcG9zLCA4KTsKKwlicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlIFNUUkFTSU5UX3N0cjoKKwlpb3B0LT5sZW4gPSBzdHJsZW4ocG9zKTsKKwlpZiAoaW9wdC0+bGVuID4gREhDUF9PUFRfTEVOX01BWCkKKwkgICAgaW9wdC0+bGVuID0gREhDUF9PUFRfTEVOX01BWDsKKwltZW1jcHkoaW9wdC0+ZGF0YSwgcG9zLCBpb3B0LT5sZW4pOworCWRwcmludGZfcGNfc29fcygicy5sZW49JWRcdHJ2PSVkXG4iLCBpb3B0LT5sZW4sIHJ2KTsKKwlicmVhazsKKyAgICBjYXNlICd3JzoKKwlpb3B0LT5sZW4gPSBweGVjaG5fcGFyc2VfaW50KGlvcHQtPmRhdGEsIHBvcywgMik7CisJYnJlYWs7CisgICAgY2FzZSAneCc6CisJaW9wdC0+bGVuID0gcHhlY2huX3BhcnNlX2hleF9zZXAoaW9wdC0+ZGF0YSwgcG9zLCAnOicpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIC02OworCWJyZWFrOworICAgIH0KKyAgICBpZiAocHhlY2huX29wdGxlbl9vayhpb3B0LT5sZW4pKSB7CisJcnYgPSBweGVjaG5fc2V0b3B0KCYob3B0c1tvcHRudW1dKSwgKHZvaWQgKikoaW9wdC0+ZGF0YSksIGlvcHQtPmxlbik7CisgICAgfQorICAgIGlmKChvcHR0eXBlID09ICdzJykgfHwgKG9wdHR5cGUgPT0gU1RSQVNJTlRfc3RyKSkKKwlkcHJpbnRmX3BjX3NvX3MoInJ2PSVkXG4iLCBydik7CisgICAgcmV0dXJuIHJ2OworfQorCitpbnQgcHhlY2huX3BhcnNlX2ZvcmNlKGNvbnN0IGNoYXIgaXN0cltdKQoreworICAgIHVpbnQzMl90IHJ2ID0gMDsKKyAgICBjaGFyICpwb3M7CisgICAgaW50IHRlcnIgPSBlcnJubzsKKworICAgIGVycm5vID0gMDsKKyAgICBydiA9IHN0cnRvdWwoaXN0ciwgJnBvcywgMCk7CisgICAgaWYgKChpc3RyID09IHBvcyApIHx8ICgocnYgPT0gVUxPTkdfTUFYKSAmJiAoZXJybm8pKSkKKwlydiA9IDA7CisgICAgZXJybm8gPSB0ZXJyOworICAgIHJldHVybiBydjsKK30KKworaW50IHB4ZWNobl91dWlkX3NldChzdHJ1Y3QgcHhlbGludXhfb3B0ICpweGUpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIXB4ZS0+cF91bnBhY2tlZFswXSkKKwlyZXQgPSBkaGNwX3VucGFja19wYWNrZXQoKHB4ZV9ib290cF90ICopKHB4ZS0+cFswXS5kYXRhKSwKKwkJCQkgcHhlLT5wWzBdLmxlbiwgcHhlLT5vcHRzWzBdKTsKKyAgICBpZiAocmV0KSB7CisJZXJyb3IoIkNvdWxkIG5vdCB1bnBhY2sgcGFja2V0XG4iKTsKKwlyZXR1cm4gLXJldDsJLyogZGhjcF91bnBhY2tfcGFja2V0IGFsd2F5cyByZXR1cm5zIHBvc2l0aXZlIGVycm9ycyAqLworICAgIH0KKworICAgIGlmIChweGUtPm9wdHNbMF1bOTddLmxlbiA+PSAwICkKKwlweGVjaG5fc2V0b3B0KCYocHhlLT5vcHRzWzJdWzk3XSksIHB4ZS0+b3B0c1swXVs5N10uZGF0YSwgcHhlLT5vcHRzWzBdWzk3XS5sZW4pOworCXJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitpbnQgcHhlY2huX3BhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgc3RydWN0IHB4ZWxpbnV4X29wdCAqcHhlLAorCQkJIHN0cnVjdCBkaGNwX29wdGlvbiBvcHRzW10pCit7CisgICAgaW50IGFyZywgb3B0bnVtLCBydiA9IDA7CisgICAgY2hhciAqcCA9IE5VTEw7CisgICAgY29uc3QgY2hhciBvcHRzdHJbXSA9ICJjOmY6ZzpvOnA6U3Q6dXdXIjsKKyAgICBzdHJ1Y3QgZGhjcF9vcHRpb24gaW9wdDsKKworICAgIGlmIChweGUtPnBbNV0uZGF0YSkKKwlweGUtPmZpcCA9ICggKHB4ZV9ib290cF90ICopKHB4ZS0+cFs1XS5kYXRhKSApLT5zaXA7CisgICAgZWxzZQorCXB4ZS0+ZmlwID0gMDsKKyAgICAvKiBGaWxsICovCisgICAgcHhlLT5mbiA9IGFyZ3ZbMF07CisgICAgcHhlY2huX3BhcnNlX2ZuKHB4ZS0+Zm4sICYocHhlLT5maXApLCBweGUtPmhvc3QsICYocHhlLT5mcCkpOworICAgIHB4ZWNobl9zZXRvcHRfc3RyKCYob3B0c1s2N10pLCBweGUtPmZwKTsKKyAgICBweGVjaG5fc2V0b3B0X3N0cigmKG9wdHNbNjZdKSwgcHhlLT5ob3N0KTsKKyAgICBpb3B0LmRhdGEgPSBtYWxsb2MoREhDUF9PUFRfTEVOX01BWCk7CisgICAgaW9wdC5sZW4gPSAwOworICAgIHdoaWxlICgocnYgPj0gMCkgJiYgKGFyZyA9IGdldG9wdChhcmdjLCBhcmd2LCBvcHRzdHIpKSA+PSAwKSB7CisJZHByaW50Zl9wY19wYSgiICBHb3QgYXJnICclYycvJyVjJyBhZGRyICUwOFggdmFsICVzXG4iLCBhcmcgPT0gJz8nID8gb3B0b3B0IDogYXJnLCBhcmcsICh1bnNpZ25lZCBpbnQpb3B0YXJnLCBvcHRhcmcgPyBvcHRhcmcgOiAiIik7CisJc3dpdGNoKGFyZykgeworCWNhc2UgJ2MnOgkvKiBjb25maWcgKi8KKwkgICAgcHhlY2huX3NldG9wdF9zdHIoJihvcHRzWzIwOV0pLCBvcHRhcmcpOworCSAgICBicmVhazsKKwljYXNlICdmJzoJLyogZm9yY2UgKi8KKwkgICAgcHhlLT5mb3JjZSA9IHB4ZWNobl9wYXJzZV9mb3JjZShvcHRhcmcpOworCSAgICBicmVhazsKKwljYXNlICdnJzoJLyogZ2F0ZXdheS9ESENQIHJlbGF5ICovCisJICAgIHB4ZS0+Z2lwID0gcHhlX2RucyhvcHRhcmcpOworCSAgICBicmVhazsKKwljYXNlICduJzoJLyogbmF0aXZlICovCisJICAgIGJyZWFrOworCWNhc2UgJ28nOgkvKiBvcHRpb24gKi8KKwkgICAgcnYgPSBweGVjaG5fcGFyc2Vfc2V0b3B0KG9wdHMsICZpb3B0LCBvcHRhcmcpOworCSAgICBicmVhazsKKwljYXNlICdwJzoJLyogcHJlZml4ICovCisJICAgIHB4ZWNobl9zZXRvcHRfc3RyKCYob3B0c1syMTBdKSwgb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnUyc6CS8qIHNpcCBmcm9tIHNOYW1lICovCisJICAgIHB4ZS0+c2lwID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSAndCc6CS8qIHRpbWVvdXQgKi8KKwkgICAgb3B0bnVtID0gc3RydG91bChvcHRhcmcsICZwLCAwKTsKKwkgICAgaWYgKHAgIT0gb3B0YXJnKSB7CisJCW9wdG51bSA9IGh0b25sKG9wdG51bSk7CisJCXB4ZWNobl9zZXRvcHQoJihvcHRzWzIxMV0pLCAodm9pZCAqKSgmb3B0bnVtKSwgNCk7CisJICAgIH0gZWxzZSB7CisJCXJ2ID0gLTM7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSAndSc6CS8qIFVVSUQ6IGNvcHkgb3B0aW9uIDk3IGZyb20gcGFja2V0IDEgaWYgcHJlc2VudCAqLworCSAgICBweGVjaG5fdXVpZF9zZXQocHhlKTsKKwkgICAgYnJlYWs7CisJY2FzZSAndyc6CS8qIHdhaXQgKi8KKwkgICAgcHhlLT53YWl0ID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSAnVyc6CS8qIFdEUyAqLworCSAgICBweGUtPndkcyA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgJz8nOgorCSAgICBydiA9IC0nPyc7CisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJfQorCWlmIChydiA+PSAwKQkvKiBDbGVhciBpdCBzaW5jZSBnZXRvcHQoKSBkb2Vzbid0IGd1YXJlbnRlZSBpdCAqLworCSAgICBvcHRhcmcgPSBOVUxMOworICAgIH0KKyAgICBpZiAoaW9wdC5kYXRhKQorCXB4ZWNobl9vcHRfZnJlZSgmaW9wdCk7CisvKiBGSVhNRTogY29uc2lkZXIgcmVvcmRlcmluZyB0aGUgYXBwbGljYXRpb24gb2YgcGFyc2VkIGNvbW1hbmQgbGluZSBvcHRpb25zCisgICAgICAgc3VjaCB0aGF0IHRoZSBuZXcgbmJwIG1heSBiZSBhdCB0aGUgZW5kICovCisgICAgaWYgKHJ2ID49IDApIHsKKwlydiA9IDA7CisgICAgfSBlbHNlIGlmIChhcmcgIT0gJz8nKSB7CisJcHJpbnRmKCJJbnZhbGlkIGFyZ3VtZW50IGZvciAtJWM6ICVzXG4iLCBhcmcsIG9wdGFyZyk7CisgICAgfQorICAgIGRwcmludGYoInB4ZWNobl9wYXJzZV9hcmdzIHJ2PSVkXG4iLCBydik7CisgICAgcmV0dXJuIHJ2OworfQorCitpbnQgcHhlY2huX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgc3RydWN0IHB4ZWxpbnV4X29wdCAqcHhlKQoreworICAgIHB4ZV9ib290cF90ICpib290cDAsICpib290cDE7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RydWN0IGRoY3Bfb3B0aW9uICpvcHRzOworICAgIGNoYXIgKnN0cjsKKworICAgIG9wdHMgPSBweGUtPm9wdHNbMl07CisgICAgLyogU3RhcnQgZmlsbGluZyBwYWNrZXQgIzEgKi8KKyAgICBib290cDAgPSAocHhlX2Jvb3RwX3QgKikocHhlLT5wWzJdLmRhdGEpOworICAgIGJvb3RwMSA9IChweGVfYm9vdHBfdCAqKShweGUtPnBbNV0uZGF0YSk7CisKKyAgICByZXQgPSBkaGNwX3VucGFja19wYWNrZXQoYm9vdHAwLCBweGUtPnBbMl0ubGVuLCBvcHRzKTsKKyAgICBpZiAocmV0KSB7CisJZXJyb3IoIkNvdWxkIG5vdCB1bnBhY2sgcGFja2V0XG4iKTsKKwlyZXR1cm4gLXJldDsKKyAgICB9CisgICAgcHhlLT5wX3VucGFja2VkWzJdID0gMTsKKyAgICBweGUtPmdpcCA9IGJvb3RwMS0+Z2lwOworCisgICAgcmV0ID0gcHhlY2huX3BhcnNlX2FyZ3MoYXJnYywgYXJndiwgcHhlLCBvcHRzKTsKKyAgICBpZiAocmV0KQorCXJldHVybiByZXQ7CisgICAgaWYgKHB4ZS0+c2lwID4gMHhGRkZGRkYpIHsJLyogYSByZWFsIElQdjQgYWRkcmVzcyAqLworCWJvb3RwMS0+c2lwID0gcHhlLT5zaXA7CisgICAgfSBlbHNlIGlmICgocHhlLT5zaXAgPT0gMSkKKwkJJiYgKG9wdHNbNjZdLmxlbiA+IDApKXsKKwkvKiB1bnRlcm1pbmF0ZWQ/ICovCisJaWYgKHN0cm5sZW4ob3B0c1s2Nl0uZGF0YSwgb3B0c1s2Nl0ubGVuKSA9PSAoc2l6ZV90KW9wdHNbNjZdLmxlbikgeworCSAgICBzdHIgPSBtYWxsb2Mob3B0c1s2Nl0ubGVuICsgMSk7CisJICAgIGlmIChzdHIpIHsKKwkJbWVtY3B5KHN0ciwgb3B0c1s2Nl0uZGF0YSwgb3B0c1s2Nl0ubGVuKTsKKwkJc3RyW29wdHNbNjZdLmxlbl0gPSAwOworCSAgICB9CQorCX0gZWxzZSB7CisJICAgIHN0ciA9IG9wdHNbNjZdLmRhdGE7CisJfQorCWlmIChzdHIpIHsKKwkgICAgYm9vdHAxLT5zaXAgPSBweGVfZG5zKHN0cik7CisJICAgIGlmIChzdHIgIT0gb3B0c1s2Nl0uZGF0YSkKKwkJZnJlZShzdHIpOworCX0gZWxzZSB7CisJICAgIGJvb3RwMS0+c2lwID0gcHhlLT5maXA7CisJfQorICAgIH0gZWxzZSB7CisJYm9vdHAxLT5zaXAgPSBweGUtPmZpcDsKKyAgICB9CisgICAgYm9vdHAxLT5naXAgPSBweGUtPmdpcDsKKworICAgIHJldCA9IGRoY3BfcGFja19wYWNrZXQoYm9vdHAxLCAoc2l6ZV90ICopJihweGUtPnBbNV0ubGVuKSwgb3B0cyk7CisgICAgaWYgKHJldCkgeworCWVycm9yKCJDb3VsZCBub3QgcGFjayBwYWNrZXRcbiIpOworCXJldHVybiAtcmV0OwkvKiBkaGNwX3BhY2tfcGFja2V0IGFsd2F5cyByZXR1cm5zIHBvc2l0aXZlIGVycm9ycyAqLworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKiBkaGNwX3BrdDJweGU6IENvcHkgcGFja2V0IHRvIFBYRSdzIEJDIGRhdGEgZm9yIGEgcHR5cGUgcGFja2V0CisgKglJbnB1dDoKKyAqCXAJUGFja2V0IGRhdGEgdG8gY29weQorICoJbGVuCWxlbmd0aCBvZiBkYXRhIHRvIGNvcHkKKyAqCXB0eXBlCVBhY2tldCB0eXBlIHRvIG92ZXJ3cml0ZQorICovCitpbnQgZGhjcF9wa3QycHhlKHB4ZV9ib290cF90ICpwLCBzaXplX3QgbGVuLCBpbnQgcHR5cGUpCit7CisgICAgdF9QWEVOVl9HRVRfQ0FDSEVEX0lORk8gKmNpOworICAgIHZvaWQgKmNwOworICAgIGludCBydiA9IC0xOworCisgICAgaWYgKCEoY2kgPSBsemFsbG9jKHNpemVvZih0X1BYRU5WX0dFVF9DQUNIRURfSU5GTykpKSl7CisJZHByaW50ZigiVW5hYmxlIHRvIGx6YWxsb2MoKSBmb3IgUFhFIGNhbGwgc3RydWN0dXJlXG4iKTsKKwlydiA9IDE7CisJZ290byByZXQ7CisgICAgfQorICAgIGNpLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfRkFJTFVSRTsKKyAgICBjaS0+UGFja2V0VHlwZSA9IHB0eXBlOworICAgIHB4ZV9jYWxsKFBYRU5WX0dFVF9DQUNIRURfSU5GTywgY2kpOworCisgICAgaWYgKGNpLT5TdGF0dXMgIT0gUFhFTlZfU1RBVFVTX1NVQ0NFU1MpIHsKKwlkcHJpbnRmKCJQWEUgR2V0IENhY2hlZCBJbmZvIGZhaWxlZDogJWRcbiIsIGNpLT5TdGF0dXMpOworCXJ2ID0gMjsKKwlnb3RvIHJldDsKKyAgICB9CisKKyAgICBjcCA9IE1LX1BUUihjaS0+QnVmZmVyLnNlZywgY2ktPkJ1ZmZlci5vZmZzKTsKKyAgICBpZiAoIShtZW1jcHkoY3AsIHAsIGxlbikpKSB7CisJZHByaW50ZigiRmFpbGVkIHRvIGNvcHkgcGFja2V0XG4iKTsKKwlydiA9IDM7CisJZ290byByZXQ7CisgICAgfQorcmV0OgorICAgIGxmcmVlKGNpKTsKKyAgIHJldHVybiBydjsKK30KKworaW50IHB4ZWNobl9tZXJnZW9wdChzdHJ1Y3QgcHhlbGludXhfb3B0ICpweGUsIGludCBkLCBpbnQgcykKK3sKKyAgICBpbnQgcmV0ID0gMCwgaTsKKworICAgIGlmICgoZCA+PSBQWEVDSE5fTlVNX1BLVF9UWVBFKSB8fCAocyA+PSBQWEVDSE5fTlVNX1BLVF9UWVBFKSAKKwkgICAgfHwgKGQgPCAwKSB8fCAocyA8IDApKSB7CisJcmV0dXJuIC0yOworICAgIH0KKyAgICBpZiAoIXB4ZS0+cF91bnBhY2tlZFtzXSkKKwlyZXQgPSBkaGNwX3VucGFja19wYWNrZXQocHhlLT5wW3NdLmRhdGEsIHB4ZS0+cFtzXS5sZW4sIHB4ZS0+b3B0c1tzXSk7CisgICAgaWYgKHJldCkgeworCWVycm9yKCJDb3VsZCBub3QgdW5wYWNrIHBhY2tldCBmb3IgbWVyZ2VcbiIpOworCXByaW50ZigiRXJyb3IgJWQgKCVkKVxuIiwgcmV0LCBFSU5WQUwpOworCWlmIChyZXQgPT0gRUlOVkFMKSB7CisJICAgIGlmIChweGUtPnBbc10ubGVuIDwgMjQwKQorCQlwcmludGYoIlBhY2tldCAlZCBpcyB0b28gc2hvcnQ6ICVkICgyNDApXG4iLCBzLCBweGUtPnBbc10ubGVuKTsKKwkgICAgZWxzZSBpZiAoKChjb25zdCBzdHJ1Y3QgZGhjcF9wYWNrZXQgKikocHhlLT5wW3NdLmRhdGEpKS0+bWFnaWMgIT0gaHRvbmwoREhDUF9WRU5ET1JfTUFHSUMpKQorCQlwcmludGYoIlBhY2tldCAlZCBoYXMgbm8gbWFnaWNcbiIsIHMpOworCSAgICBlbHNlCisJCWVycm9yKCJVbmtub3duIEVJTlZBTCBlcnJvclxuIik7CisJfSBlbHNlIHsKKwkgICAgZXJyb3IoIlVua25vd24gZXJyb3JcbiIpOworCX0KKwlyZXR1cm4gLXJldDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9ESENQX09QVFM7IGkrKykgeworCWlmIChweGUtPm9wdHNbZF1baV0ubGVuIDw9IC0xKSB7CisJICAgIGlmIChweGUtPm9wdHNbc11baV0ubGVuID49IDApCisJCXB4ZWNobl9zZXRvcHQoJihweGUtPm9wdHNbZF1baV0pLCBweGUtPm9wdHNbc11baV0uZGF0YSwgcHhlLT5vcHRzW3NdW2ldLmxlbik7CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogcHhlY2huOiBDaGFpbmxvYWQgdG8gbmV3IFBYRSBmaWxlIG91cnNlbHZlcworICoJSW5wdXQ6CisgKglhcmdjCUNvdW50IG9mIGFyZ3VtZW50cyBwYXNzZWQKKyAqCWFyZ3YJVmFsdWVzIG9mIGFyZ3VtZW50cyBwYXNzZWQKKyAqCVJldHVybnMJMCBvbiBzdWNjZXNzICh3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuKQorICoJCTEgb24gbG9hZGZpbGUoKSBlcnJvcgorICoJCTIgaWYgREhDUCBPcHRpb24gNTIgKE9wdGlvbiBPdmVybG9hZCkgdXNlZCBmaWxlIGZpZWxkCisgKgkJLTEgb24gdXNhZ2UgZXJyb3IKKyAqLworaW50IHB4ZWNobihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHN0cnVjdCBweGVsaW51eF9vcHQgcHhlOworICAgIHB4ZV9ib290cF90KiBwWygyICogUFhFQ0hOX05VTV9QS1RfVFlQRSldOworICAgIGludCBydiA9IDA7CisgICAgaW50IGk7CisgICAgc3RydWN0IGRhdGFfYXJlYSBmaWxlOworICAgIHN0cnVjdCBzeXNsaW51eF9ybV9yZWdzIHJlZ3M7CisKKyAgICBweGVjaG5faW5pdCgmcHhlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKDIgKiBQWEVDSE5fTlVNX1BLVF9UWVBFKTsgaSsrKSB7CisJcFtpXSA9IChweGVfYm9vdHBfdCAqKShweGUucFtpXS5kYXRhKTsKKyAgICB9CisKKyAgICAvKiBQYXJzZSBhcmd1bWVudHMgYW5kIHBhdGNoIHBhY2tldCAxICovCisgICAgcnYgPSBweGVjaG5fYXJncyhhcmdjLCBhcmd2LCAmcHhlKTsKKyAgICBkcHJlc3NhbnlrZXkoSU5UX01BWCk7CisgICAgaWYgKHJ2KQorCWdvdG8gcmV0OworICAgIHB4ZV9zZXRfcmVncygmcmVncyk7CisgICAgLyogTG9hZCB0aGUgZmlsZSBsYXRlOyBpdCdzIHRoZSBtb3N0IHRpbWUtZXhwZW5zaXZlIG9wZXJhdGlvbiAqLworICAgIHByaW50ZigiJXM6IEF0dGVtcHRpbmcgdG8gbG9hZCAnJXMnOiAiLCBhcHBfbmFtZV9zdHIsIHB4ZS5mbik7CisgICAgaWYgKGxvYWRmaWxlKHB4ZS5mbiwgJmZpbGUuZGF0YSwgJmZpbGUuc2l6ZSkpIHsKKwlweGVfZXJyb3IoZXJybm8sIE5VTEwsIE5VTEwpOworCXJ2ID0gLTI7CisJZ290byByZXQ7CisgICAgfQorICAgIHB1dHMoImxvYWRlZC4iKTsKKyAgICAvKiB3ZSdsbCBiZSBzaHVmZmxpbmcgdG8gdGhlIHN0YW5kYXJkIGxvY2F0aW9uIG9mIDdDMDBoICovCisgICAgZmlsZS5iYXNlID0gMHg3QzAwOworICAgIGlmICgocHhlLndkcykgfHwgCisJICAgICgocHhlLmZvcmNlKSAmJiAoKHB4ZS5mb3JjZSAmICh+UFhFQ0hOX0ZPUkNFX0FMTCkpID09IDApKSkgeworCXByaW50ZigiRm9yY2luZyBiZWhhdmlvciAlMDhYXG4iLCBweGUuZm9yY2UpOworCS8vIFAyIGlzIHRoZSBzYW1lIGFzIFAzIGlmIG5vIFBYRSBzZXJ2ZXIgcHJlc2VudC4KKwlpZiAoKHB4ZS53ZHMpIHx8CisJCShweGUuZm9yY2UgJiBQWEVDSE5fRk9SQ0VfUEtUMikpIHsKKwkgICAgcHhlY2huX2ZpbGxfcGt0KCZweGUsIFBYRU5WX1BBQ0tFVF9UWVBFX0RIQ1BfQUNLKTsKKwkgICAgcnYgPSBweGVjaG5fbWVyZ2VvcHQoJnB4ZSwgMiwgMSk7CisJICAgIGlmIChydikgeworCQlkcHJpbnRmKCJNZXJnZSBPcHRpb24gcmV0dXJuZWQgJWRcbiIsIHJ2KTsKKwkgICAgfQorCSAgICBydiA9IGRoY3BfcGFja19wYWNrZXQocFs1XSwgKHNpemVfdCAqKSYocHhlLnBbNV0ubGVuKSwgcHhlLm9wdHNbMl0pOworCSAgICBydiA9IGRoY3BfcGt0MnB4ZShwWzVdLCBweGUucFs1XS5sZW4sIFBYRU5WX1BBQ0tFVF9UWVBFX0RIQ1BfQUNLKTsKKwl9CisJaWYgKHB4ZS5mb3JjZSAmIFBYRUNITl9GT1JDRV9QS1QxKSB7CisJICAgIHB1dHMoIlVuaW1wbGVtZW50ZWQgZm9yY2Ugb3B0aW9uIHV0aWxpemVkIik7CisJfQorICAgIH0KKyAgICBydiA9IGRoY3BfcGt0MnB4ZShwWzVdLCBweGUucFs1XS5sZW4sIFBYRU5WX1BBQ0tFVF9UWVBFX0NBQ0hFRF9SRVBMWSk7CisgICAgZHByaW50X3B4ZV9ib290cF90KHBbNV0sIHB4ZS5wWzVdLmxlbik7CisgICAgaWYgKChweGUud2RzKSB8fAorCSAgICAoKHB4ZS5mb3JjZSkgJiYgKChweGUuZm9yY2UgJiAoflBYRUNITl9GT1JDRV9BTEwpKSA9PSAwKSkpIHsKKwkvLyBwcmludGYoIkZvcmNpbmcgYmVoYXZpb3IgJTA4WFxuIiwgcHhlLmZvcmNlKTsKKwkvLyBQMiBpcyB0aGUgc2FtZSBhcyBQMyBpZiBubyBQWEUgc2VydmVyIHByZXNlbnQuCisJaWYgKChweGUud2RzKSB8fAorCQkocHhlLmZvcmNlICYgUFhFQ0hOX0ZPUkNFX1BLVDIpKSB7CisJICAgIHJ2ID0gZGhjcF9wa3QycHhlKHBbNV0sIHB4ZS5wWzVdLmxlbiwgUFhFTlZfUEFDS0VUX1RZUEVfREhDUF9BQ0spOworCX0KKyAgICB9IGVsc2UgaWYgKHB4ZS5mb3JjZSkgeworCXByaW50ZigiRk9SQ0U6IGJhZCBhcmd1bWVudCAlMDhYXG4iLCBweGUuZm9yY2UpOworICAgIH0KKyAgICBwcmludGYoIlxuLi4uUmVhZHkgdG8gYm9vdDpcbiIpOworICAgIGlmIChweGUud2FpdCkgeworCXByZXNzYW55a2V5KElOVF9NQVgpOworICAgIH0gZWxzZSB7CisJZHByZXNzYW55a2V5KElOVF9NQVgpOworICAgIH0KKyAgICBpZiAodHJ1ZSkgeworCXB1dHMoIiAgQXR0ZW1wdGluZyB0byBib290Li4uIik7CisJZG9fYm9vdCgmZmlsZSwgMSwgJnJlZ3MpOworICAgIH0KKyAgICAvKiBJZiBmYWlsZWQsIGNvcHkgYmFja3VwIGJhY2sgaW4gYW5kIGFib3J0ICovCisgICAgZGhjcF9wa3QycHhlKHBbMl0sIHB4ZS5wWzJdLmxlbiwgUFhFTlZfUEFDS0VUX1RZUEVfQ0FDSEVEX1JFUExZKTsKKyAgICBpZiAocHhlLmZvcmNlICYmICgocHhlLmZvcmNlICYgKH5QWEVDSE5fRk9SQ0VfQUxMKSkgPT0gMCkpIHsKKwlpZiAocHhlLmZvcmNlICYgUFhFQ0hOX0ZPUkNFX1BLVDIpIHsKKwkgICAgcnYgPSBkaGNwX3BrdDJweGUocFsxXSwgcHhlLnBbMV0ubGVuLCBQWEVOVl9QQUNLRVRfVFlQRV9ESENQX0FDSyk7CisJfQorICAgIH0KK3JldDoKKyAgICByZXR1cm4gcnY7Cit9CisKKy8qIHB4ZV9yZXN0YXJ0OiBSZXN0YXJ0IHRoZSBQWEUgZW52aXJvbm1lbnQgd2l0aCBhIG5ldyBQWEUgZmlsZQorICoJSW5wdXQ6CisgKglpZm4JTmFtZSBvZiBmaWxlIHRvIGNoYWlubG9hZCB0byBpbiBhIGZvcm1hdCBQWEVMSU5VWCB1bmRlcnN0YW5kcworICoJCVRoaXMgbXVzdCBzdHJpY3RseSBiZSBURlRQIG9yIHJlbGF0aXZlIGZpbGUKKyAqLworaW50IHB4ZV9yZXN0YXJ0KGNoYXIgKmlmbikKK3sKKyAgICBpbnQgcnYgPSAwOworICAgIHN0cnVjdCBweGVsaW51eF9vcHQgcHhlOworICAgIHRfUFhFTlZfUkVTVEFSVF9URlRQICpweGVwOwkvKiBQWEVOViBjYWxsYmFjayBQYXJhbWV0ZXIgKi8KKworICAgIHB4ZS5mbiA9IGlmbjsKKyAgICBweGVjaG5fZmlsbF9wa3QoJnB4ZSwgUFhFTlZfUEFDS0VUX1RZUEVfQ0FDSEVEX1JFUExZKTsKKyAgICBpZiAocHhlLnBbNV0uZGF0YSkKKwlweGUuZmlwID0gKCAocHhlX2Jvb3RwX3QgKikocHhlLnBbNV0uZGF0YSkgKS0+c2lwOworICAgIGVsc2UKKwlweGUuZmlwID0gMDsKKyAgICBydiA9IHB4ZWNobl9wYXJzZV9mbihweGUuZm4sICYocHhlLmZpcCksIHB4ZS5ob3N0LCAmKHB4ZS5mcCkpOworICAgIGlmICgocnYgPiAyKSB8fCAocnYgPCAwKSkgeworCXByaW50ZigiJXM6IEVSUk9SOiBVbnBhcnNhYmxlIGZpbGVuYW1lIGFyZ3VtZW50OiAnJXMnXG5cbiIsIGFwcF9uYW1lX3N0ciwgcHhlLmZuKTsKKwlnb3RvIHJldDsKKyAgICB9CisgICAgcHJpbnRmKCIgIEF0dGVtcHRpbmcgdG8gYm9vdCAnJXMnLi4uXG5cbiIsIHB4ZS5mbik7CisgICAgaWYgKCEocHhlcCA9IGx6YWxsb2Moc2l6ZW9mKHRfUFhFTlZfUkVTVEFSVF9URlRQKSkpKXsKKwlkcHJpbnRmKCJVbmFibGUgdG8gbHphbGxvYygpIGZvciBQWEUgY2FsbCBzdHJ1Y3R1cmVcbiIpOworCWdvdG8gcmV0OworICAgIH0KKyAgICBweGVwLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsJLyogUFhFTlZfU1RBVFVTX0ZBSUxVUkUgKi8KKyAgICBzdHJjcHkoKGNoYXIgKilweGVwLT5GaWxlTmFtZSwgaWZuKTsKKyAgICBweGVwLT5CdWZmZXJTaXplID0gMHg4MDAwOworICAgIHB4ZXAtPkJ1ZmZlciA9ICh2b2lkICopMHg3YzAwOworICAgIHB4ZXAtPlNlcnZlcklQQWRkcmVzcyA9IHB4ZS5maXA7CisgICAgZHByaW50ZigiRk49JyVzJyAgJTA4WCAlMDhYICUwOFggJTA4WFxuXG4iLCAoY2hhciAqKXB4ZXAtPkZpbGVOYW1lLAorCXB4ZXAtPlNlcnZlcklQQWRkcmVzcywgKHVuc2lnbmVkIGludClweGVwLAorCXB4ZXAtPkJ1ZmZlclNpemUsICh1bnNpZ25lZCBpbnQpcHhlcC0+QnVmZmVyKTsKKyAgICBkcHJpbnRmKCJQWEVOVl9SRVNUQVJUX1RGVFAgc3RhdHVzICVkXG4iLCBweGVwLT5TdGF0dXMpOworCisgICAgcHhlX2NhbGwoUFhFTlZfUkVTVEFSVF9URlRQLCBweGVwKTsKKworICAgIHByaW50ZigiUFhFTlZfUkVTVEFSVF9URlRQIHJldHVybmVkICVkXG4iLCBweGVwLT5TdGF0dXMpOworICAgIGxmcmVlKHB4ZXApOworCityZXQ6CisgICAgcmV0dXJuIHJ2OworfQorCisvKiBweGVjaG5fZ3B4ZTogVXNlIGdQWEUgdG8gY2hhaW5sb2FkIGEgbmV3IE5CUAorICoJSW5wdXQ6CisgKglhcmdjCUNvdW50IG9mIGFyZ3VtZW50cyBwYXNzZWQKKyAqCWFyZ3YJVmFsdWVzIG9mIGFyZ3VtZW50cyBwYXNzZWQKKyAqCVJldHVybnMJMCBvbiBzdWNjZXNzICh3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuKQorICoJCTEgb24gbG9hZGZpbGUoKSBlcnJvcgorICoJCS0xIG9uIHVzYWdlIGVycm9yCisgKi8KKy8vRklYTUU6SW1wbGVtZW50CitpbnQgcHhlY2huX2dweGUoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgcnYgPSAwOworICAgIHN0cnVjdCBweGVsaW51eF9vcHQgcHhlOworCisgICAgaWYgKGFyZ2MpIHsKKwlwcmludGYoIiVzXG4iLCBhcmd2WzBdKTsKKwlweGVjaG5fYXJncyhhcmdjLCBhcmd2LCAmcHhlKTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBydj0gLTE7CisgICAgaW50IGVycjsKKyAgICBjb25zdCBzdHJ1Y3Qgc3lzbGludXhfdmVyc2lvbiAqc3Y7CisKKyAgICAvKiBJbml0aWFsaXphdGlvbiAqLworICAgIGVyciA9IGVycm5vOworICAgIGNvbnNvbGVfYW5zaV9yYXcoKTsJLyogc2V0cyBlcnJubyA9IDkgKEVCQURGKSAqLworICAgIC8qIHByaW50ZigiJWQgJWRcbiIsIGVyciwgZXJybm8pOyAqLworICAgIGVycm5vID0gZXJyOworICAgIHN2ID0gc3lzbGludXhfdmVyc2lvbigpOworICAgIGlmIChzdi0+ZmlsZXN5c3RlbSAhPSBTWVNMSU5VWF9GU19QWEVMSU5VWCkgeworCXByaW50ZigiJXM6IE1heSBvbmx5IHJ1biBpbiBQWEVMSU5VWFxuIiwgYXBwX25hbWVfc3RyKTsKKwlhcmdjID0gMTsJLyogcHJldmVudHMgZnVydGhlciBwcm9jZXNzaW5nIHRvIGJvb3QgKi8KKyAgICB9CisgICAgaWYgKGFyZ2MgPT0gMikgeworCWlmICgoc3RyY2FzZWNtcChhcmd2WzFdLCAiLWgiKSA9PSAwKSB8fCAoKHN0cmNtcChhcmd2WzFdLCAiLT8iKSA9PSAwKSkKKwkJfHwgKHN0cmNhc2VjbXAoYXJndlsxXSwgIi0taGVscCIpID09IDApKSB7CisJICAgIGFyZ2MgPSAxOworCX0gZWxzZSB7CisJICAgIHJ2ID0gcHhlY2huKGFyZ2MgLSAxLCAmYXJndlsxXSk7CisJfQorICAgIH0gZWxzZSBpZiAoYXJnYyA+PSAzKSB7CisJaWYgKChzdHJjbXAoYXJndlsxXSwgIi1yIikgPT0gMCkpIHsKKwkgICAgaWYgKGFyZ2MgPT0gMykKKwkJcnYgPSBweGVfcmVzdGFydChhcmd2WzJdKTsKKwl9IGVsc2UgeworCSAgICBydiA9IHB4ZWNobihhcmdjIC0gMSwgJmFyZ3ZbMV0pOworCX0KKyAgICB9CisgICAgaWYgKHJ2IDw9IC0xICkgeworCXVzYWdlKCk7CisJcnYgPSAxOworICAgIH0KKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL3JlYm9vdC5jIGIvY29tMzIvbW9kdWxlcy9yZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQ1NjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9yZWJvb3QuYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8c3lzbGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgaW50IHdhcm0gPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCWlmICghc3RyY21wKGFyZ3ZbaV0sICItdyIpIHx8ICFzdHJjbXAoYXJndltpXSwgIi0td2FybSIpKQorCSAgICB3YXJtID0gMTsKKyAgICB9CisKKyAgICBzeXNsaW51eF9yZWJvb3Qod2FybSk7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL3NhbmJvb3QuYyBiL2NvbTMyL21vZHVsZXMvc2FuYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTVmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL3NhbmJvb3QuYwpAQCAtMCwwICsxLDgzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHNhbmJvb3QuYworICoKKyAqIEludm9rZSB0aGUgZ1BYRSAic2FuYm9vdCIgY29tbWFuZCwgaWYgYXZhaWxhYmxlLgorICovCisKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxzeXMvZ3B4ZS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZV9hcGkuaD4KKworc3RydWN0IHNlZ29mZjE2IHsKKyAgICB1aW50MTZfdCBvZmZzLCBzZWc7Cit9OworCitzdHJ1Y3Qgc19QWEVOVl9GSUxFX0VYRUMgeworICAgIHVpbnQxNl90IFN0YXR1czsKKyAgICBzdHJ1Y3Qgc2Vnb2ZmMTYgQ29tbWFuZDsKK307CisKK3N0YXRpYyB2b2lkIHNhbmJvb3QoY29uc3QgY2hhciAqKmFyZ3MpCit7CisgICAgY2hhciAqcTsKKyAgICBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0VYRUMgKmZ4OworCisgICAgZnggPSBsbWFsbG9jKHNpemVvZiAqZngpOworICAgIGlmICghZngpCisJcmV0dXJuOworCisgICAgcSA9IChjaGFyICopKGZ4ICsgMSk7CisKKyAgICBmeC0+U3RhdHVzID0gMTsKKyAgICBmeC0+Q29tbWFuZC5vZmZzID0gT0ZGUyhxKTsKKyAgICBmeC0+Q29tbWFuZC5zZWcgPSBTRUcocSk7CisKKyAgICBxID0gc3RwY3B5KHEsICJzYW5ib290Iik7CisKKyAgICB3aGlsZSAoKmFyZ3MpIHsKKwkqcSsrID0gJyAnOworCXEgPSBzdHBjcHkocSwgKmFyZ3MpOworCWFyZ3MrKzsKKyAgICB9CisKKyAgICBweGVfY2FsbChQWEVOVl9GSUxFX0VYRUMsIGZ4KTsKKworICAgIC8qIFRoaXMgc2hvdWxkIG5vdCByZXR1cm4uLi4gKi8KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpZiAoYXJnYyA8IDIpIHsKKwlwcmludGYoIlVzYWdlOiBzYW5ib290IHJvb3RwYXRoXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIWlzX2dweGUoKSkgeworCXByaW50Zigic2FuYm9vdDogZ1BYRSBBUEkgbm90IGRldGVjdGVkXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBzYW5ib290KGFyZ3YgKyAxKTsKKworICAgIC8qIHNhbmJvb3QoKSBzaG91bGQgbm90IHJldHVybi4uLiAqLworICAgIHByaW50ZigiU0FOIGJvb3QgZmFpbGVkLlxuIik7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL3NkaS5jIGIvY29tMzIvbW9kdWxlcy9zZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTdhZDRhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9zZGkuYwpAQCAtMCwwICsxLDE4NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzZGkuYworICoKKyAqIExvYWRlciBmb3IgdGhlIE1pY3Jvc29mdCBTeXN0ZW0gRGVwbG95bWVudCBJbWFnZSAoU0RJKSBmb3JtYXQuCisgKiBCYXNlZCBvbiBhIGhpc3RvcmljYWwgcGF0Y2ggYnkgUmVtaSBMZWZldnJlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKworI2luY2x1ZGUgPHN5c2xpbnV4L2xvYWRmaWxlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbW92ZWJpdHMuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9ib290cm0uaD4KKwordHlwZWRlZiB1aW50OF90IGd1aWRfdFsxNl07CisKK3N0cnVjdCBTRElIZWFkZXIgeworICAgIHVpbnQzMl90IFNpZ25hdHVyZTsKKyAgICBjaGFyIFZlcnNpb25bNF07CisgICAgdWludDY0X3QgTURCdHlwZTsKKyAgICB1aW50NjRfdCBCb290Q29kZU9mZnNldDsKKyAgICB1aW50NjRfdCBCb290Q29kZVNpemU7CisgICAgdWludDY0X3QgVmVuZG9ySUQ7CisgICAgdWludDY0X3QgRGV2aWNlSUQ7CisgICAgZ3VpZF90IERldmljZU1vZGVsOworICAgIHVpbnQ2NF90IERldmljZVJvbGU7CisgICAgdWludDY0X3QgUmVzZXJ2ZWQxOworICAgIGd1aWRfdCBSdW50aW1lR1VJRDsKKyAgICB1aW50NjRfdCBSdW50aW1lT0VNcmV2OworICAgIHVpbnQ2NF90IFJlc2VydmVkMjsKKyAgICB1aW50NjRfdCBQYWdlQWxpZ25tZW50OwkvKiBCTE9CIGFsaWdubWVudCB2YWx1ZSBpbiBwYWdlcyAqLworICAgIHVpbnQ2NF90IFJlc2VydmVkM1s0OF07CisgICAgdWludDY0X3QgQ2hlY2tzdW07Cit9OworCisjZGVmaW5lIFNESV9MT0FEX0FERFIJKDE2IDw8IDIwKQkvKiAxNiBNQiAqLworI2RlZmluZSBTRElfU0lHTkFUVVJFCSgnJCcgKyAoJ1MnIDw8IDgpICsgKCdEJyA8PCAxNikgKyAoJ0knIDw8IDI0KSkKKworc3RhdGljIGlubGluZSB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBmcHV0cyhtc2csIHN0ZGVycik7Cit9CisKK3N0YXRpYyBpbnQgYm9vdF9zZGkodm9pZCAqcHRyLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IHN0cnVjdCBTRElIZWFkZXIgKmhkciA9IHB0cjsKKyAgICBzdHJ1Y3Qgc3lzbGludXhfbWVtbWFwICptbWFwID0gTlVMTCwgKmFtYXAgPSBOVUxMOworICAgIHN0cnVjdCBzeXNsaW51eF9ybV9yZWdzIHJlZ3M7CisgICAgc3RydWN0IHN5c2xpbnV4X21vdmVsaXN0ICptbCA9IE5VTEw7CisKKyAgICAvKiAqKioqIEJhc2ljIHNhbml0eSBjaGVja2luZyAqKioqICovCisgICAgaWYgKGhkci0+U2lnbmF0dXJlICE9IFNESV9TSUdOQVRVUkUpIHsKKwlmcHV0cygiTm8gJFNESSBzaWduYXR1cmUgaW4gZmlsZVxuIiwgc3Rkb3V0KTsKKwlnb3RvIGJhaWw7CisgICAgfQorICAgIGlmIChtZW1jbXAoaGRyLT5WZXJzaW9uLCAiMDAwMSIsIDQpKSB7CisJaW50IGk7CisJZnB1dHMoIldhcm5pbmc6IHVua25vd24gU0RJIHZlcnNpb246ICIsIHN0ZG91dCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkgICAgcHV0Y2hhcihoZHItPlZlcnNpb25baV0pOworCXB1dGNoYXIoJ1xuJyk7CisJLyogVGhlbiB0cnkgYW55d2F5Li4uICovCisgICAgfQorCisgICAgLyogKioqKiBTZXR1cCAqKioqICovCisgICAgbW1hcCA9IHN5c2xpbnV4X21lbW9yeV9tYXAoKTsKKyAgICBhbWFwID0gc3lzbGludXhfZHVwX21lbW1hcChtbWFwKTsKKyAgICBpZiAoIW1tYXAgfHwgIWFtYXApCisJZ290byBiYWlsOworCisgICAgLyogKioqKiBNYXAgdGhlIEJPT1QgQkxPQiB0byAweDdjMDAgKioqKiAqLworICAgIGlmICghaGRyLT5Cb290Q29kZU9mZnNldCkgeworCWZwdXRzKCJObyBCT09UIEJMT0IgaW4gaW1hZ2VcbiIsIHN0ZG91dCk7CisJZ290byBiYWlsOworICAgIH0KKyAgICBpZiAoIWhkci0+Qm9vdENvZGVTaXplKSB7CisJZnB1dHMoIkJPT1QgQkxPQiBpcyBlbXB0eVxuIiwgc3Rkb3V0KTsKKwlnb3RvIGJhaWw7CisgICAgfQorICAgIGlmIChsZW4gPCBoZHItPkJvb3RDb2RlT2Zmc2V0ICsgaGRyLT5Cb290Q29kZVNpemUpIHsKKwlmcHV0cygiQk9PVCBCTE9CIGV4dGVuZHMgYmV5b25kIGZpbGVcbiIsIHN0ZG91dCk7CisJZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChzeXNsaW51eF9tZW1tYXBfdHlwZShhbWFwLCAweDdjMDAsIGhkci0+Qm9vdENvZGVTaXplKSAhPSBTTVRfRlJFRSkgeworCWZwdXRzKCJCT09UIEJMT0IgdG9vIGxhcmdlIGZvciBtZW1vcnlcbiIsIHN0ZG91dCk7CisJZ290byBiYWlsOworICAgIH0KKyAgICBpZiAoc3lzbGludXhfYWRkX21lbW1hcCgmYW1hcCwgMHg3YzAwLCBoZHItPkJvb3RDb2RlU2l6ZSwgU01UX0FMTE9DKSkKKwlnb3RvIGJhaWw7CisgICAgaWYgKHN5c2xpbnV4X2FkZF9tb3ZlbGlzdCgmbWwsIDB4N2MwMCwgKGFkZHJfdCkgcHRyICsgaGRyLT5Cb290Q29kZU9mZnNldCwKKwkJCSAgICAgIGhkci0+Qm9vdENvZGVTaXplKSkKKwlnb3RvIGJhaWw7CisKKyAgICAvKiAqKioqIE1hcCB0aGUgZW50aXJlIGltYWdlIHRvIFNESV9MT0FEX0FERFIgKioqKiAqLworICAgIGlmIChzeXNsaW51eF9tZW1tYXBfdHlwZShhbWFwLCBTRElfTE9BRF9BRERSLCBsZW4pICE9IFNNVF9GUkVFKSB7CisJZnB1dHMoIkltYWdlIHRvbyBsYXJnZSBmb3IgbWVtb3J5XG4iLCBzdGRvdXQpOworCWdvdG8gYmFpbDsKKyAgICB9CisgICAgaWYgKHN5c2xpbnV4X2FkZF9tZW1tYXAoJmFtYXAsIFNESV9MT0FEX0FERFIsIGxlbiwgU01UX0FMTE9DKSkKKwlnb3RvIGJhaWw7CisgICAgaWYgKHN5c2xpbnV4X2FkZF9tb3ZlbGlzdCgmbWwsIFNESV9MT0FEX0FERFIsIChhZGRyX3QpIHB0ciwgbGVuKSkKKwlnb3RvIGJhaWw7CisKKyAgICAvKiAqKioqIFNldCB1cCByZWdpc3RlcnMgKioqKiAqLworICAgIG1lbXNldCgmcmVncywgMCwgc2l6ZW9mIHJlZ3MpOworICAgIHJlZ3MuaXAgPSAweDdjMDA7CisgICAgcmVncy5lc3AubCA9IDB4N2MwMDsKKyAgICByZWdzLmVkeC5sID0gU0RJX0xPQURfQUREUiB8IDB4NDE7CisKKyAgICBmcHV0cygiQm9vdGluZy4uLlxuIiwgc3Rkb3V0KTsKKyAgICBzeXNsaW51eF9zaHVmZmxlX2Jvb3Rfcm0obWwsIG1tYXAsIDAsICZyZWdzKTsKKworYmFpbDoKKyAgICBzeXNsaW51eF9mcmVlX21lbW1hcChhbWFwKTsKKyAgICBzeXNsaW51eF9mcmVlX21lbW1hcChtbWFwKTsKKyAgICBzeXNsaW51eF9mcmVlX21vdmVsaXN0KG1sKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBzdW0gb2YgYWxsIGJ5dGVzIGZyb20gZmlyc3QgNTEyIGJ5dGVzIChTREkgaGVhZGVyKQorICogaXMgMCBtb2R1bG8gMjU2LgorICovCitpbnQgaGFzX3ZhbGlkX2hlYWRlcih1bnNpZ25lZCBjaGFyICpoZWFkZXIpCit7CisgICAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGNoZWNrc3VtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBTRElIZWFkZXIpOyBpKyspCisJY2hlY2tzdW0gKz0gaGVhZGVyW2ldOworICAgIHJldHVybiAoIWNoZWNrc3VtKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICB2b2lkICpkYXRhOworICAgIHNpemVfdCBkYXRhX2xlbjsKKworICAgIGlmIChhcmdjICE9IDIpIHsKKwllcnJvcigiVXNhZ2U6IHNkaS5jMzIgc2RpX2ZpbGVcbiIpOworCXJldHVybiAxOworICAgIH0KKworICAgIGZwdXRzKCJMb2FkaW5nICIsIHN0ZG91dCk7CisgICAgZnB1dHMoYXJndlsxXSwgc3Rkb3V0KTsKKyAgICBmcHV0cygiLi4uICIsIHN0ZG91dCk7CisgICAgaWYgKHpsb2FkZmlsZShhcmd2WzFdLCAmZGF0YSwgJmRhdGFfbGVuKSkgeworCWVycm9yKCJmYWlsZWQhXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZnB1dHMoIm9rXG4iLCBzdGRvdXQpOworCisgICAgaWYgKCFoYXNfdmFsaWRfaGVhZGVyKGRhdGEpKSB7CisJZXJyb3IoIlNESSBoZWFkZXIgaXMgY29ycnVwdGVkXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBib290X3NkaShkYXRhLCBkYXRhX2xlbik7CisgICAgZXJyb3IoIkludmFsaWQgU0RJIGZpbGUgb3IgaW5zdWZmaWNpZW50IG1lbW9yeVxuIik7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL3N0dWJzL2NvcHlkb3duLmFzbSBiL2NvbTMyL21vZHVsZXMvc3R1YnMvY29weWRvd24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODEzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL3N0dWJzL2NvcHlkb3duLmFzbQpAQCAtMCwwICsxLDExIEBACisJCWJpdHMgMTYKKwkJcmVwIG1vdnNkCisJCW1vdiBzaSwwCisJCW1vdiBkaSwwCisJCW1vdiBkcyxzaQorCQltb3YgZXMsZGkKKwkJbW92IGVjeCwwCisJCW1vdiBlc2ksMAorCQltb3YgZWRpLDAKKwkJam1wIDA6MAorCQlhbGlnbiAxNgpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy9zdHVicy9zd2Fwc3R1Yi5hc20gYi9jb20zMi9tb2R1bGVzL3N0dWJzL3N3YXBzdHViLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjcwY2U0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy9zdHVicy9zd2Fwc3R1Yi5hc20KQEAgLTAsMCArMSwzMyBAQAorCWJpdHMgMTYKK3N3YXA6CisJcHVzaCBieAorCW1vdnp4IGJ4LGRsCisJbW92IGRsLFtjczpieCsodGFibGUtJCQpXQorCXBvcCBieAorLmptcDoJam1wIDA6MAorCW5vcAorCW5vcAoraW5zdGFsbDoKKwk7OyBEUyA9IENTLCBFUyA9IDAKKwltb3YgZWRpLFtlczpzaSs0KjB4MTNdCisJbW92IFtzd2FwLmptcCsxXSxlZGkKKwltb3YgZGksW2VzOjB4NDEzXQorCWRlYyBkaQorCW1vdiBbZXM6MHg0MTNdLGRpCisJc2hsIGVkaSwxNis2CisJbW92IFtlczpzaSs0KjB4MTNdLGVkaQorCXNociBlZGksMTYKKwltb3YgZXMsZGkKKwl4b3IgZGksZGkKKwlyZXAgbW92c2QKKwltb3Ygc2ksMAorCW1vdiBkaSwwCisJbW92IGRzLHNpCisJbW92IGVzLGRpCisJbW92IGVjeCwwCisJbW92IGVzaSwwCisJbW92IGVkaSwwCisJam1wIDA6MAorCisJYWxpZ24gMTYKK3RhYmxlOgpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy92ZXNhaW5mby5jIGIvY29tMzIvbW9kdWxlcy92ZXNhaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NWQwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9tb2R1bGVzL3Zlc2FpbmZvLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIHZlc2FpbmZvLmMKKyAqCisgKiBEdW1wIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgVkVTQSBncmFwaGljcyBtb2RlcyBhcmUgc3VwcG9ydGVkLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiLi4vbGliL3N5cy92ZXNhL3Zlc2EuaCIKKworLyogV2FpdCBmb3IgYSBrZXlwcmVzcyAqLworc3RhdGljIHZvaWQgd2FpdF9rZXkodm9pZCkKK3sKKyAgICBjaGFyIGNoOworICAgIHdoaWxlIChmcmVhZCgmY2gsIDEsIDEsIHN0ZGluKSA9PSAwKSA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21vZGVzKHZvaWQpCit7CisJc3RhdGljIGNvbTMyc3lzX3Qgcm07CisJc3RydWN0IHZlc2FfZ2VuZXJhbF9pbmZvICpnaTsKKwlzdHJ1Y3QgdmVzYV9tb2RlX2luZm8gKm1pOworCXVpbnQxNl90IG1vZGUsICptb2RlX3B0cjsKKwlpbnQgbGluZXM7CisKKwlzdHJ1Y3QgdmVzYV9pbmZvICp2ZXNhOworCisJdmVzYSA9IGxtYWxsb2Moc2l6ZW9mKCp2ZXNhKSk7CisJaWYgKCF2ZXNhKSB7CisJCXByaW50ZigidmVzYWluZm8uYzMyOiBmYWlsIGluIGxtYWxsb2NcbiIpOworCQlyZXR1cm47CisJfQorCWdpID0gJnZlc2EtPmdpOworCW1pID0gJnZlc2EtPm1pOworCisgICAgICAgIG1lbXNldCgmcm0sIDAsIHNpemVvZiBybSk7CisJZ2ktPnNpZ25hdHVyZSA9IFZCRTJfTUFHSUM7CS8qIEdldCBWQkUyIGV4dGVuZGVkIGRhdGEgKi8KKwlybS5lYXgud1swXSA9IDB4NEYwMDsJLyogR2V0IFNWR0EgZ2VuZXJhbCBpbmZvcm1hdGlvbiAqLworCXJtLmVkaS53WzBdID0gT0ZGUyhnaSk7CisJcm0uZXMgPSBTRUcoZ2kpOworCV9faW50Y2FsbCgweDEwLCAmcm0sICZybSk7CisKKyAgICBpZiAocm0uZWF4LndbMF0gIT0gMHgwMDRGKSB7CisJcHJpbnRmKCJObyBWRVNBIEJJT1MgZGV0ZWN0ZWRcbiIpOworCWdvdG8gZXhpdDsKKyAgICB9IGVsc2UgaWYgKGdpLT5zaWduYXR1cmUgIT0gVkVTQV9NQUdJQykgeworCXByaW50ZigiVkVTQSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgaGFzIGJhZCBtYWdpYywgdHJ5aW5nIGFueXdheS4uLlxuIik7CisgICAgfQorCisgICAgcHJpbnRmKCJWQkUgdmVyc2lvbiAlZC4lZFxuIgorCSAgICJNb2RlICAgYXR0cmliIGhfcmVzIHZfcmVzIGJwcCBsYXlvdXQgcnBvcyBncG9zIGJwb3NcbiIsCisJICAgKGdpLT52ZXJzaW9uID4+IDgpICYgMHhmZiwgZ2ktPnZlcnNpb24gJiAweGZmKTsKKworICAgIGxpbmVzID0gMTsKKworICAgIG1vZGVfcHRyID0gR0VUX1BUUihnaS0+dmlkZW9fbW9kZV9wdHIpOworCisgICAgd2hpbGUgKChtb2RlID0gKm1vZGVfcHRyKyspICE9IDB4RkZGRikgeworCWlmICgrK2xpbmVzID49IDIzKSB7CisJICAgIHdhaXRfa2V5KCk7CisJICAgIGxpbmVzID0gMDsKKwl9CisKKyAgICAgICAgbWVtc2V0KCZybSwgMCwgc2l6ZW9mIHJtKTsKKwlybS5lYXgud1swXSA9IDB4NEYwMTsJLyogR2V0IFNWR0EgbW9kZSBpbmZvcm1hdGlvbiAqLworCXJtLmVjeC53WzBdID0gbW9kZTsKKwlybS5lZGkud1swXSA9IE9GRlMobWkpOworCXJtLmVzID0gU0VHKG1pKTsKKwlfX2ludGNhbGwoMHgxMCwgJnJtLCAmcm0pOworCisJLyogTXVzdCBiZSBhIHN1cHBvcnRlZCBtb2RlICovCisJaWYgKHJtLmVheC53WzBdICE9IDB4MDA0ZikKKwkgICAgY29udGludWU7CisKKwlwcmludGYoIjB4JTA0eCAweCUwNHggJTV1ICU1dSAlM3UgJTZ1ICU0dSAlNHUgJTR1XG4iLAorCSAgICAgICBtb2RlLCBtaS0+bW9kZV9hdHRyLCBtaS0+aF9yZXMsIG1pLT52X3JlcywgbWktPmJwcCwKKwkgICAgICAgbWktPm1lbW9yeV9sYXlvdXQsIG1pLT5ycG9zLCBtaS0+Z3BvcywgbWktPmJwb3MpOworICAgIH0KKworZXhpdDoKKwlsZnJlZSh2ZXNhKTsKKwlyZXR1cm47Cit9CisKK2ludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCkKK3sKKyAgICBwcmludF9tb2RlcygpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvbW9kdWxlcy92cGR0ZXN0LmMgYi9jb20zMi9tb2R1bGVzL3ZwZHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGYzMmJhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy92cGR0ZXN0LmMKQEAgLTAsMCArMSw2OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgRXJ3YW4gVmVsdSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisgKiB2cGR0ZXN0LmMKKyAqCisgKiBWUEQgZGVtbyBwcm9ncmFtIHVzaW5nIGxpYmNvbTMyCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgInZwZC92cGQuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBzX3ZwZCB2cGQ7CisKKyAgICBpZiAodnBkX2RlY29kZSgmdnBkKSA9PSAtRU5PVlBEVEFCTEUpIHsKKwlwcmludGYoIk5vIFZQRCBTdHJ1Y3R1cmUgZm91bmRcbiIpOworCXJldHVybiAtMTsKKyAgICB9IGVsc2UgeworCXByaW50ZigiVlBEIHByZXNlbnQgYXQgYWRkcmVzcyA6IDB4JXNcbiIsIHZwZC5iYXNlX2FkZHJlc3MpOworICAgIH0KKyAgICBpZiAoc3RybGVuKHZwZC5iaW9zX2J1aWxkX2lkKSA+IDApCisJcHJpbnRmKCJCaW9zIEJ1aWxkIElEICAgICAgICAgICAgICAgICA6ICVzXG4iLCB2cGQuYmlvc19idWlsZF9pZCk7CisgICAgaWYgKHN0cmxlbih2cGQuYmlvc19yZWxlYXNlX2RhdGUpID4gMCkKKwlwcmludGYoIkJpb3MgUmVsZWFzZSBEYXRlICAgICAgICAgICAgIDogJXNcbiIsIHZwZC5iaW9zX3JlbGVhc2VfZGF0ZSk7CisgICAgaWYgKHN0cmxlbih2cGQuYmlvc192ZXJzaW9uKSA+IDApCisJcHJpbnRmKCJCaW9zIFZlcnNpb24gICAgICAgICAgICAgICAgICA6ICVzXG4iLCB2cGQuYmlvc192ZXJzaW9uKTsKKyAgICBpZiAoc3RybGVuKHZwZC5kZWZhdWx0X2ZsYXNoX2ZpbGVuYW1lKSA+IDApCisJcHJpbnRmKCJEZWZhdWx0IEZsYXNoIEZpbGVuYW1lICAgICAgICA6ICVzXG4iLAorCSAgICAgICB2cGQuZGVmYXVsdF9mbGFzaF9maWxlbmFtZSk7CisgICAgaWYgKHN0cmxlbih2cGQuYm94X3NlcmlhbF9udW1iZXIpID4gMCkKKwlwcmludGYoIkJveCBTZXJpYWwgTnVtYmVyICAgICAgICAgICAgIDogJXNcbiIsIHZwZC5ib3hfc2VyaWFsX251bWJlcik7CisgICAgaWYgKHN0cmxlbih2cGQubW90aGVyYm9hcmRfc2VyaWFsX251bWJlcikgPiAwKQorCXByaW50ZigiTW90aGVyYm9hcmQgU2VyaWFsIE51bWJlciAgICAgOiAlc1xuIiwKKwkgICAgICAgdnBkLm1vdGhlcmJvYXJkX3NlcmlhbF9udW1iZXIpOworICAgIGlmIChzdHJsZW4odnBkLm1hY2hpbmVfdHlwZV9tb2RlbCkgPiAwKQorCXByaW50ZigiTWFjaGluZSBUeXBlL01vZGVsICAgICAgICAgICAgOiAlc1xuIiwgdnBkLm1hY2hpbmVfdHlwZV9tb2RlbCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL21vZHVsZXMvd2hpY2hzeXMuYyBiL2NvbTMyL21vZHVsZXMvd2hpY2hzeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdjYjllCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy93aGljaHN5cy5jCkBAIC0wLDAgKzEsMTI2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMCBHZXJ0IEh1bHNlbG1hbnMgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiB3aGljaHN5cy5jCisgKgorICogRGV0ZW1pbmUgd2hpY2ggY29tbWFuZCB0byBleGVjdXRlLCBiYXNlZCBvbiB0aGUgU3lzbGludXggYm9vdGxvYWRlciB2YXJpYW50CisgKiBmcm9tIHdoaWNoIHlvdSBydW4gaXQuCisgKgorICogVXNhZ2U6ICAgIHdoaWNoc3lzLmMzMiBbLWlzby0gY29tbWFuZF0gWy1weGUtIGNvbW1hbmRdIFstc3lzLSBjb21tYW5kXQorICogRXhhbXBsZXM6IHdoaWNoc3lzLmMzMiAtaXNvLSBjaGFpbi5jMzIgaGQwIC1zeXMtIGNoYWluLmMzMiBoZDEgc3dhcAorICogICAgICAgICAgIHdoaWNoc3lzLmMzMiAtaXNvLSBjb25maWcgaXNvLmNmZyAtcHhlLSBjb25maWcgcHhlLmNmZworICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgorI2luY2x1ZGUgInN5c2xpbnV4L2NvbmZpZy5oIgorCisKK3N0YXRpYyBzdHJ1Y3Qgc3lzbGludXhfcGFyYW1ldGVyIHsKKyAgICBjaGFyICoqYXJnWzFdOworICAgIGJvb2wgb3B0aW9uOworfSBpc29saW51eCwgcHhlbGludXgsIHN5c2xpbnV4OworCisvKiBYWFg6IHRoaXMgcmVhbGx5IHNob3VsZCBiZSBsaWJyYXJpemVkICovCitzdGF0aWMgdm9pZCBib290X2FyZ3MoY2hhciAqKmFyZ3MpCit7CisgICAgaW50IGxlbiA9IDAsIGEgPSAwOworICAgIGNoYXIgKipwcDsKKyAgICBjb25zdCBjaGFyICpwOworICAgIGNoYXIgYywgKnEsICpzdHI7CisKKyAgICBmb3IgKHBwID0gYXJnczsgKnBwOyBwcCsrKQorCWxlbiArPSBzdHJsZW4oKnBwKSArIDE7CisKKyAgICBxID0gc3RyID0gYWxsb2NhKGxlbik7CisgICAgZm9yIChwcCA9IGFyZ3M7ICpwcDsgcHArKykgeworCXAgPSAqcHA7CisJd2hpbGUgKChjID0gKnArKykpCisJICAgICpxKysgPSBjOworCSpxKysgPSAnICc7CisJYSA9IDE7CisgICAgfQorICAgIHEgLT0gYTsKKyAgICAqcSA9ICdcMCc7CisKKyAgICBpZiAoIXN0clswXSkKKwlzeXNsaW51eF9ydW5fZGVmYXVsdCgpOworICAgIGVsc2UKKwlzeXNsaW51eF9ydW5fY29tbWFuZChzdHIpOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyIHVzYWdlW10gPSAiXAorVXNhZ2U6ICAgIHdoaWNoc3lzLmMzMiBbLWlzby0gY29tbWFuZF0gWy1weGUtIGNvbW1hbmRdIFstc3lzLSBjb21tYW5kXVxuXAorRXhhbXBsZXM6IHdoaWNoc3lzLmMzMiAtaXNvLSBjaGFpbi5jMzIgaGQwIC1zeXMtIGNoYWluLmMzMiBoZDEgc3dhcFxuXAorICAgICAgICAgIHdoaWNoc3lzLmMzMiAtaXNvLSBjb25maWcgaXNvLmNmZyAtcHhlLSBjb25maWcgcHhlLmNmZ1xuIjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgdXNhZ2UpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGNvbnN0IHVuaW9uIHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbyAqc2RpOworCisgICAgaW50IGFyZyA9IDA7CisKKyAgICAvKiBJZiBubyBhcmd1bWVudCBnb3QgcGFzc2VkLCBsZXQncyBzaG93IHRoZSB1c2FnZSAqLworICAgIGlmIChhcmdjID09IDEpIHsKKwkgICAgdXNhZ2UoKTsKKwkgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXJnKys7CisKKyAgICB3aGlsZSAoYXJnIDwgYXJnYykgeworCWlmICghc3RyY21wKGFyZ3ZbYXJnXSwgIi1pc28tIikpIHsKKwkgICAgYXJndlthcmddID0gTlVMTDsKKwkgICAgaXNvbGludXguYXJnWzBdID0gJmFyZ3ZbYXJnICsgMV07CisJICAgIGlzb2xpbnV4Lm9wdGlvbiA9IHRydWU7CisJfQorCWlmICghc3RyY21wKGFyZ3ZbYXJnXSwgIi1weGUtIikpIHsKKwkgICAgYXJndlthcmddID0gTlVMTDsKKwkgICAgcHhlbGludXguYXJnWzBdID0gJmFyZ3ZbYXJnICsgMV07CisJICAgIHB4ZWxpbnV4Lm9wdGlvbiA9IHRydWU7CisJfQorCWlmICghc3RyY21wKGFyZ3ZbYXJnXSwgIi1zeXMtIikpIHsKKwkgICAgYXJndlthcmddID0gTlVMTDsKKwkgICAgc3lzbGludXguYXJnWzBdID0gJmFyZ3ZbYXJnICsgMV07CisJICAgIHN5c2xpbnV4Lm9wdGlvbiA9IHRydWU7CisJfQorCWFyZysrOworICAgIH0KKworICAgIHNkaSA9IHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbygpOworCisgICAgc3dpdGNoIChzZGktPmMuZmlsZXN5c3RlbSkgeworCWNhc2UgU1lTTElOVVhfRlNfSVNPTElOVVg6CisJICAgIGlzb2xpbnV4Lm9wdGlvbiA/IGJvb3RfYXJncyhpc29saW51eC5hcmdbMF0pIDogZnByaW50ZihzdGRlcnIsICJObyBjb21tYW5kIHNwZWNpZmllZCBmb3IgSVNPTElOVVguXG5cbiIpOyB1c2FnZSgpOworCSAgICBicmVhazsKKwljYXNlIFNZU0xJTlVYX0ZTX1BYRUxJTlVYOgorCSAgICBweGVsaW51eC5vcHRpb24gPyBib290X2FyZ3MocHhlbGludXguYXJnWzBdKSA6IGZwcmludGYoc3RkZXJyLCAiTm8gY29tbWFuZCBzcGVjaWZpZWQgZm9yIFBYRUxJTlVYLlxuXG4iKTsgdXNhZ2UoKTsKKwkgICAgYnJlYWs7CisJY2FzZSBTWVNMSU5VWF9GU19TWVNMSU5VWDoKKwkgICAgc3lzbGludXgub3B0aW9uID8gYm9vdF9hcmdzKHN5c2xpbnV4LmFyZ1swXSkgOiBmcHJpbnRmKHN0ZGVyciwgIk5vIGNvbW1hbmQgc3BlY2lmaWVkIGZvciBTWVNMSU5VWC5cblxuIik7IHVzYWdlKCk7CisJICAgIGJyZWFrOworCWNhc2UgU1lTTElOVVhfRlNfVU5LTk9XTjoKKwlkZWZhdWx0OgorCSAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gU3lzbGludXggZmlsZXN5c3RlbVxuXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9tb2R1bGVzL3p6anNvbi5jIGIvY29tMzIvbW9kdWxlcy96empzb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTI2YjhmCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvbW9kdWxlcy96empzb24uYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIERpc3BsYXkgZGlyZWN0b3J5IGNvbnRlbnRzCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHp6anNvbi96empzb24uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworc3RhdGljIHZvaWQgbXllcnJvcih2b2lkICplaGFuZGxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICAgIHZhX2xpc3QgYXA7CisgICAgZnByaW50ZihlaGFuZGxlLCAiZXJyb3I6ICIpOworICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICAgIHZmcHJpbnRmKGVoYW5kbGUsIGZvcm1hdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgZnB1dGMoJ1xuJywgZWhhbmRsZSk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyNpZiAwCisJLyogdGhpcyBoYW5ncyEgKi8KKyAgICBvcGVuY29uc29sZSgmZGV2X3Jhd2Nvbl9yLCAmZGV2X3N0ZGNvbl93KTsKKyNlbHNlCisJLyogdGhpcyB3b3JrcyAqLworICAgIG9wZW5jb25zb2xlKCZkZXZfcmF3Y29uX3IsICZkZXZfYW5zaXNlcmlhbF93KTsKKyNlbmRpZgorICAgICh2b2lkKSBhcmdjOworICAgICh2b2lkKSBhcmd2OworICAgIFpaSlNPTiAgKnRtcDsKKyAgICBaWkpTT05fQ09ORklHIGNvbmZpZyA9IHsgWlpKU09OX1ZFUllfU1RSSUNULCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KCopKHZvaWQqKSkgZmdldGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvYywgY2FsbG9jLCBmcmVlLCByZWFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnIsIG15ZXJyb3IsIHN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCgqKSh2b2lkKixjb25zdCBjaGFyKiwuLi4pKSBmcHJpbnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KCopKGludCx2b2lkKikpIGZwdXRjIH07CisgICAgCisgICAgZG8geworICAgICAgICBaWkpTT04gKnRtcDI7CisKKyAgICAgICAgdG1wID0genpqc29uX2NyZWF0ZV9hcnJheSgmY29uZmlnLAorICAgICAgICAgICAgICAgIHp6anNvbl9jcmVhdGVfbnVtYmVyX2QoJmNvbmZpZywgMy4xNCksCisgICAgICAgICAgICAgICAgenpqc29uX2NyZWF0ZV9udW1iZXJfaSgmY29uZmlnLCAxMjM0TEwpLAorICAgICAgICAgICAgICAgIHp6anNvbl9jcmVhdGVfbnVtYmVyX2koJmNvbmZpZywgLTQzMjFMTCksCisgICAgICAgICAgICAgICAgenpqc29uX2NyZWF0ZV90cnVlKCZjb25maWcpLAorICAgICAgICAgICAgICAgIHp6anNvbl9jcmVhdGVfZmFsc2UoJmNvbmZpZyksCisgICAgICAgICAgICAgICAgenpqc29uX2NyZWF0ZV9udWxsKCZjb25maWcpLAorICAgICAgICAgICAgICAgIHp6anNvbl9jcmVhdGVfc3RyaW5nKCZjb25maWcsICJoZWxsbywgd29ybGQiKSwKKyAgICAgICAgICAgICAgICB6empzb25fY3JlYXRlX29iamVjdCgmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAicGljYXJkIiwgenpqc29uX2NyZWF0ZV9zdHJpbmcoJmNvbmZpZywgImplYW4tbHVjIiksCisgICAgICAgICAgICAgICAgICAgICJyaWtlciIsICB6empzb25fY3JlYXRlX3N0cmluZygmY29uZmlnLCAid2lsbGlhbSB0LiIpLAorICAgICAgICAgICAgICAgICAgICBOVUxMKSwKKyAgICAgICAgICAgICAgICB6empzb25fY3JlYXRlX29iamVjdCgmY29uZmlnLCBOVUxMKSwKKyAgICAgICAgICAgICAgICB6empzb25fY3JlYXRlX2FycmF5KCZjb25maWcsIE5VTEwpLAorICAgICAgICAgICAgICAgIE5VTEwgKTsKKworICAgICAgICBpZiAoIXRtcCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBkdXJpbmcgY3JlYXRpb24gb2YganNvbiB0cmVlXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdG1wMiA9IHp6anNvbl9hcnJheV9wcmVwZW5kKCZjb25maWcsIHRtcCwKKyAgICAgICAgICAgICAgICAgICAgenpqc29uX2NyZWF0ZV9zdHJpbmcoJmNvbmZpZywgInByZXBlbmRlZCBzdHJpbmciKSk7CisKKyAgICAgICAgaWYgKCF0bXAyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIGR1cmluZyBwcmVwZW5kXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRtcCA9IHRtcDI7CisKKyAgICAgICAgdG1wMiA9IHp6anNvbl9hcnJheV9hcHBlbmQoJmNvbmZpZywgdG1wLAorICAgICAgICAgICAgICAgICAgICB6empzb25fY3JlYXRlX3N0cmluZygmY29uZmlnLCAiYXBwZW5kZWQgc3RyaW5nIChzbG93KSIpKTsKKworICAgICAgICBpZiAoIXRtcDIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgZHVyaW5nIGFwcGVuZFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0bXAgPSB0bXAyOworCisgICAgICAgIHp6anNvbl9wcmludCgmY29uZmlnLCB0bXApOworICAgIH0gd2hpbGUoMCk7CisgICAgaWYgKHRtcCkgenpqc29uX2ZyZWUoJmNvbmZpZywgdG1wKTsKKworICAgIHsKKyAgICAgICAgdG1wID0genpqc29uX2NyZWF0ZV9hcnJheSgmY29uZmlnLCBOVUxMKTsgLyogZW1wdHkgYXJyYXkgKi8KKyAgICAgICAgdG1wID0genpqc29uX2FycmF5X3ByZXBlbmQoJmNvbmZpZywgdG1wLCB6empzb25fY3JlYXRlX3RydWUoJmNvbmZpZykpOworICAgICAgICB6empzb25fcHJpbnQoJmNvbmZpZywgdG1wKTsKKyAgICAgICAgenpqc29uX2ZyZWUoJmNvbmZpZywgdG1wKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHRtcCA9IHp6anNvbl9jcmVhdGVfb2JqZWN0KCZjb25maWcsIE5VTEwpOyAvKiBlbXB0eSBvYmplY3QgKi8KKyAgICAgICAgdG1wID0genpqc29uX29iamVjdF9wcmVwZW5kKCZjb25maWcsIHRtcCwgImhlbGxvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpqc29uX2NyZWF0ZV9zdHJpbmcoJmNvbmZpZywgIndvcmxkIikpOworICAgICAgICB0bXAgPSB6empzb25fb2JqZWN0X2FwcGVuZCgmY29uZmlnLCB0bXAsICJnb29kYnllIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpqc29uX2NyZWF0ZV9zdHJpbmcoJmNvbmZpZywgImNydWVsIHdvcmxkIikpOworICAgICAgICB6empzb25fcHJpbnQoJmNvbmZpZywgdG1wKTsKKyAgICAgICAgenpqc29uX2ZyZWUoJmNvbmZpZywgdG1wKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyAgCmRpZmYgLS1naXQgYS9jb20zMi9yb3NoL01ha2VmaWxlIGIvY29tMzIvcm9zaC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDkwMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvcm9zaC9NYWtlZmlsZQpAQCAtMCwwICsxLDU5IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjICAgQ29weXJpZ2h0IDIwMDgtMjAxMCBHZW5lIEN1bW0gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMjIFJPU0ggUmVhZCBPbmx5IFNoZWxsCisjIworCitMSUJTID0gJChvYmpkaXIpL2NvbTMyL2xpYnV0aWwvbGlidXRpbC5jMzIgXAorCSQob2JqZGlyKS9jb20zMi9saWIvbGliY29tMzIuYzMyCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvcm9zaC5taworCisjIGZyb20gY29tMzIvc3lzZHVtcC9NYWtlZmlsZQorIyBUaGUgREFURSBpcyBzZXQgb24gdGhlIG1ha2UgY29tbWFuZCBsaW5lIHdoZW4gYnVpbGRpbmcgYmluYXJpZXMgZm9yCisjIG9mZmljaWFsIHJlbGVhc2UuICBPdGhlcndpc2UsIHN1YnN0aXR1dGUgYSBoZXggc3RyaW5nIHRoYXQgaXMgcHJldHR5IG11Y2gKKyMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgdG8gYmUgdW5pcXVlIGZyb20gYnVpbGQgdG8gYnVpbGQuCitpZm5kZWYgSEVYREFURQorSEVYREFURSA6PSAkKHNoZWxsICQoUEVSTCkgJCh0b3BkaXIpL25vdy5wbCAkKFNSQ1MpICQod2lsZGNhcmQgKi5oKSkKK2VuZGlmCitpZm5kZWYgREFURQorREFURSAgICA6PSAkKHNoZWxsIHNoICQodG9wZGlyKS9nZW4taWQuc2ggJChWRVJTSU9OKSAkKEhFWERBVEUpKQorZW5kaWYKKworQ0ZMQUdTCQkrPSAtRERBVEU9JyIkKERBVEUpIicKK0xOWENGTEFHUwkrPSAtRERBVEU9JyIkKERBVEUpIicKKworYWxsOglyb3NoLmMzMgorCityb3NoLm86CXJvc2guaAorCityb3NoLmxvOglyb3NoLmgKKworYWxsZ3JjOglyb3NoLmMzMiByb3NoLmxueAorCit0aWR5IGRpc3Q6CisJcm0gLWYgKi5vICoubG8gKi5hICoubHN0ICouZWxmIC4qLmQgKi50bXAKKworY2xlYW46IHRpZHkKKwlybSAtZiAqLmxueAorCitzcG90bGVzczogY2xlYW4KKwlybSAtZiAqLmxzcyAqLmMzMiAqLmNvbQorCXJtIC1mICp+IFwjKgorCitpbnN0YWxsOgorCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS9jb20zMi9yb3NoL3Jvc2guYyBiL2NvbTMyL3Jvc2gvcm9zaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOThhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9yb3NoL3Jvc2guYwpAQCAtMCwwICsxLDEzNjMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4LTIwMTEgR2VuZSBDdW1tIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiByb3NoLmMKKyAqCisgKiBSZWFkLU9ubHkgc2hlbGw7IFNpbXBsZSBzaGVsbCBzeXN0ZW0gZGVzaWduZWQgZm9yIFNZU0xJTlVYLWRlcml2aXRpdmVzLgorICogUHJvdmlkZXMgbWluaW1hbCBjb21tYW5kcyB1dGlsaXppbmcgdGhlIGNvbnNvbGUgdmlhIHN0ZG91dC9zdGRlcnIgYXMgdGhlCisgKiBzb2xlIG91dHB1dCBkZXZpY2VzLiAgRGVzaWduZWQgdG8gY29tcGlsZSBmb3IgTGludXggZm9yIHRlc3RpbmcvZGVidWdnaW5nLgorICovCisKKy8qCisgKiBUb0RvczoKKyAqIHByb21wdDoJQWxsb3cgbGVmdC9yaWdodCBhcnJvdywgaG9tZS9lbmQgYW5kIG1vcmU/CisgKiBjb21tYW5kcwlCcmVhayBpbnRvIGFyZ3YvYXJnYy1saWtlIGFycmF5CisgKiByb3NoX2NmZzoJYWxsb3cgLXMgPGZpbGU+IHRvIGNoYW5nZSBjb25maWcKKyAqIHJvc2hfbHMoKToJc29ydGVkOyB0aGVuIG11bHRpcGxlIGNvbHVtbnMKKyAqIHByb21wdDoJUG9zc2libHkgaG9ub3IgdGltZW91dCBvbiBpbml0aWFsIGVudHJ5IGZvciB1c2FnZSBhcyBVSQorICoJCUFsc28gcG9zc2libHkgaG9ub3IgdG90YWx0aW1lb3V0CisgKi8KKworLyojZGVmaW5lIERPX0RFQlVHIDEKKy8vKi8KKy8qIFVuY29tbWVudCB0aGUgYWJvdmUgbGluZSBmb3IgZGVidWdnaW5nIG91dHB1dDsgQ29tbWVudCB0byByZW1vdmUgKi8KKy8qI2RlZmluZSBET19ERUJVRzIgMQorLy8qLworLyogVW5jb21tZW50IHRoZSBhYm92ZSBsaW5lIGZvciBzdXBlci1kZWJ1Z2dpbmcgb3V0cHV0OyBNdXN0IGhhdmUgcmVndWxhcgorICogZGVidWdnaW5nIGVuYWJsZWQ7IENvbW1lbnQgdG8gcmVtb3ZlLgorICovCisjaW5jbHVkZSAicm9zaC5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2RlZmluZSBBUFBfTE9OR05BTUUJIlJlYWQtT25seSBTaGVsbCIKKyNkZWZpbmUgQVBQX05BTUUJInJvc2giCisjZGVmaW5lIEFQUF9BVVRIT1IJIkdlbmUgQ3VtbSIKKyNkZWZpbmUgQVBQX1lFQVIJIjIwMTAiCisjZGVmaW5lIEFQUF9WRVIJCSJiZXRhLWIwOTAiCisKKy8qIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gdG8gc3Rkb3V0CisgKi8KK3ZvaWQgcm9zaF92ZXJzaW9uKGludCB2dHlwZSkKK3sKKyAgICBjaGFyIGVudlsyNTZdOworICAgIGVudlswXSA9IDA7CisgICAgcHJpbnRmKCIlcyB2ICVzOyAoYykgJXMgJXMuXG5cdEZyb20gU3lzbGludXggJXMsICVzXG4iLCBBUFBfTE9OR05BTUUsIEFQUF9WRVIsIEFQUF9ZRUFSLCBBUFBfQVVUSE9SLCBWRVJTSU9OX1NUUiwgREFURSk7CisgICAgc3dpdGNoICh2dHlwZSkgeworICAgIGNhc2UgMToKKwlyb3NoX2dldF9lbnZfdmVyKGVudiwgMjU2KTsKKwlwcmludGYoIlx0UnVubmluZyBvbiAlc1xuIiwgZW52KTsKKyAgICB9Cit9CisKKy8qIFByaW50IGJldGEgbWVzc2FnZSBhbmQgaWYgRE9fREVCVUcvRE9fREVCVUcyIGFyZSBhY3RpdmUKKyAqLwordm9pZCBwcmludF9iZXRhKHZvaWQpCit7CisgICAgcHV0cyhyb3NoX2JldGFfc3RyKTsKKyAgICBST1NIX0RFQlVHKCJET19ERUJVRyBhY3RpdmVcbiIpOworICAgIFJPU0hfREVCVUcyKCJET19ERUJVRzIgYWN0aXZlXG4iKTsKK30KKworLyogU2VhcmNoIGEgc3RyaW5nIGZvciBmaXJzdCBub24tc3BhY2UgKCcgJykgY2hhcmFjdGVyLCBzdGFydGluZyBhdCBpcG9zCisgKglpc3RyCWlucHV0IHN0cmluZyB0byBwYXJzZQorICoJaXBvcwlpbnB1dCBwb3NpdGlvbiB0byBzdGFydCBhdAorICovCitpbnQgcm9zaF9zZWFyY2hfbm9uc3AoY29uc3QgY2hhciAqaXN0ciwgY29uc3QgaW50IGlwb3MpCit7CisgICAgaW50IGN1cnBvczsKKyAgICBjaGFyIGM7CisKKyAgICBjdXJwb3MgPSBpcG9zOworICAgIGMgPSBpc3RyW2N1cnBvc107CisgICAgd2hpbGUgKGMgJiYgaXNzcGFjZShjKSkKKwljID0gaXN0clsrK2N1cnBvc107CisgICAgcmV0dXJuIGN1cnBvczsKK30KKworLyogU2VhcmNoIGEgc3RyaW5nIGZvciBzcGFjZSAoJyAnKSwgcmV0dXJuaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBzcGFjZQorICogb3IgdGhlICdcMCcgYXQgZW5kIG9mIHN0cmluZworICoJaXN0cglpbnB1dCBzdHJpbmcgdG8gcGFyc2UKKyAqCWlwb3MJaW5wdXQgcG9zaXRpb24gdG8gc3RhcnQgYXQKKyAqLworaW50IHJvc2hfc2VhcmNoX3NwKGNvbnN0IGNoYXIgKmlzdHIsIGNvbnN0IGludCBpcG9zKQoreworICAgIGludCBjdXJwb3M7CisgICAgY2hhciBjOworCisgICAgY3VycG9zID0gaXBvczsKKyAgICBjID0gaXN0cltjdXJwb3NdOworICAgIHdoaWxlIChjICYmICEoaXNzcGFjZShjKSkpCisJYyA9IGlzdHJbKytjdXJwb3NdOworICAgIHJldHVybiBjdXJwb3M7Cit9CisKKy8qIFBhcnNlIGEgc3RyaW5nIGZvciB0aGUgZmlyc3Qgbm9uLXNwYWNlIHN0cmluZywgcmV0dXJuaW5nIHRoZSBlbmQgcG9zaXRpb24KKyAqIGZyb20gc3JjCisgKglkZXN0CXN0cmluZyB0byBjb250YWluIHRoZSBmaXJzdCBub24tc3BhY2Ugc3RyaW5nCisgKglzcmMJc3RyaW5nIHRvIHBhcnNlCisgKglpcG9zCVBvc2l0aW9uIHRvIHN0YXJ0IGluIHNyYworICovCitpbnQgcm9zaF9wYXJzZV9zcF8xKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgaW50IGlwb3MpCit7CisgICAgaW50IGJwb3MsIGVwb3M7CQkvKiBiZWdpbm5pbmcgYW5kIGVuZGluZyBwb3NpdGlvbiBvZiBzb3VyY2Ugc3RyaW5nCisJCQkJICAgdG8gY29weSB0byBkZXN0aW5hdGlvbiBzdHJpbmcgKi8KKworICAgIGJwb3MgPSAwOworICAgIGVwb3MgPSAwOworLyogLy9IRVJFLWVycm9yIGNvbmRpdGlvbiBjaGVja2luZyAqLworICAgIGJwb3MgPSByb3NoX3NlYXJjaF9ub25zcChzcmMsIGlwb3MpOworICAgIGVwb3MgPSByb3NoX3NlYXJjaF9zcChzcmMsIGJwb3MpOworICAgIGlmIChlcG9zID4gYnBvcykgeworCW1lbWNweShkZXN0LCBzcmMgKyBicG9zLCBlcG9zIC0gYnBvcyk7CisJaWYgKGRlc3RbZXBvcyAtIGJwb3NdICE9IDApCisJICAgIGRlc3RbZXBvcyAtIGJwb3NdID0gMDsKKyAgICB9IGVsc2UgeworCWVwb3MgPSBzdHJsZW4oc3JjKTsKKwlkZXN0WzBdID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGVwb3M7Cit9CisKKy8qCisgKiBwYXJzZV9hcmdzMTogVHJ5IDEgYXQgcGFyc2luZyBhIHN0cmluZyB0byBhbiBhcmdjL2FyZ3YgcGFpci4gIHVzZSBmcmVlX2FyZ3MxIHRvIGZyZWUgbWVtb3J5IG1hbGxvYydkCisgKgorICogRGVyaXZlZCBmcm9tIGNvbTMyL2xpYi9zeXMvYXJndi5jOl9fcGFyc2VfYXJndigpCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKi8KK2ludCBwYXJzZV9hcmdzMShjaGFyICoqKmlhcmd2LCBjb25zdCBjaGFyICppc3RyKQoreworICAgIGludCBhcmdjICA9IDA7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyICpxLCAqciwgKmFyZ3MsICoqYXJnOworICAgIGludCBzcCA9IDE7CS8vLCBxdCA9IDA7CQkvKiBXYXMgYSBzcGFjZTsgaW5zaWRlIGEgcXVvdGUgKi8KKworICAgIC8qIFNjYW4gMTogTGVuZ3RoICovCisgICAgLyogSSBjb3VsZCBlbGltaW5hdGUgdGhpcyBpZiBJIGtuZXcgYSBtYXggbGVuZ3RoLCBsaWtlIHN0cm5jcHkoKSAqLworICAgIGludCBsZW4gPSBzdHJsZW4oaXN0cik7CisKKyAgICAvKiBTY2FuIDI6IENvcHksIG51bGxpZnkgYW5kIG1ha2UgYXJnYyAqLworICAgIGlmICghKGFyZ3MgPSBtYWxsb2MobGVuICsgMSkpKQorCWdvdG8gZmFpbF9hcmdzOworICAgIHEgPSBhcmdzOworICAgIGZvciAocCA9IGlzdHI7OyBwKyspIHsKKwlpZiAoKnAgPD0gJyAnKSB7CisJICAgIGlmICghc3ApIHsKKwkJc3AgPSAxOworCQkqcSsrID0gJ1wwJzsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmIChzcCkgeworCQlhcmdjKys7CisJCXNwID0gMDsKKwkgICAgfQorCSAgICAqcSsrID0gKnA7CisJfQorCWlmICghKnApCisJICAgIGJyZWFrOworICAgIH0KKworICAgIHEtLTsJCQkvKiBQb2ludCBxIHRvIGZpbmFsIG51bGwgKi8KKyAgICAvKiBTY2FuIDM6IEJ1aWxkIGFycmF5IG9mIHBvaW50ZXJzICovCisgICAgaWYgKCEoKmlhcmd2ID0gbWFsbG9jKChhcmdjICsgMSkgKiBzaXplb2YoY2hhciAqKSkpKQorCWdvdG8gZmFpbF9hcmdzX3B0cjsKKyAgICBhcmcgPSAqaWFyZ3Y7CisgICAgYXJnW2FyZ2NdID0gTlVMTDsJCS8qIE51bGxpZnkgdGhlIGxhc3QgcG9pbnRlciAqLworICAgIGlmICgqYXJncyAhPSAnXDAnKQorCSAgICAqYXJnKysgPSBhcmdzOworICAgIGZvciAociA9IGFyZ3M7IHIgPCBxIDsgcisrKSB7CisJaWYgKCpyID09ICdcMCcpIHsKKwkgICAgKmFyZysrID0gciArIDE7CisJfQorICAgIH0KKworZmFpbF9hcmdzOgorICAgIHJldHVybiBhcmdjOworZmFpbF9hcmdzX3B0cjoKKyAgICBmcmVlKGFyZ3MpOworICAgIHJldHVybiAwOworfQorCisvKiBGcmVlIGFyZ3YgY3JlYXRlZCBieSBwYXJzZV9hcmdzMSgpCisgKglhcmd2CUFyZ3VtZW50IFZhbHVlcworICovCit2b2lkIGZyZWVfYXJnczEoY2hhciAqKiphcmd2KQoreworICAgIGNoYXIgKnM7CisgICAgcyA9ICoqYXJndjsKKyAgICBmcmVlKCphcmd2KTsKKyAgICBmcmVlKHMpOworfQorCisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIGFyZ2MvYXJndiBwYWlyCisgKglzdHIJU3RyaW5nIHRvIHBhcnNlCisgKglhcmd2CUFyZ3VtZW50IFZhbHVlcworICoJcmV0dXJucwlBcmd1bWVudCBDb3VudAorICovCitpbnQgcm9zaF9zdHIyYXJndihjaGFyICoqKmFyZ3YsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICByZXR1cm4gcGFyc2VfYXJnczEoYXJndiwgc3RyKTsKK30KKworLyogRnJlZSBhbiBhcmd2IGNyZWF0ZWQgYnkgcm9zaF9zdHIyYXJndigpCisgKglhcmd2CUFyZ3VtZW50IFZhbHVlcyB0byBmcmVlCisgKi8KK3ZvaWQgcm9zaF9mcmVlX2FyZ3YoY2hhciAqKiphcmd2KQoreworICAgICBmcmVlX2FyZ3MxKGFyZ3YpOworfQorCisvKiBQcmludCB0aGUgY29udGVudHMgb2YgYW4gYXJnYy9hcmd2IHBhaXIKKyAqCWFyZ2MJQXJndW1lbnQgQ291bnQKKyAqCWFyZ3YJQXJndW1lbnQgVmFsdWVzCisgKi8KK3ZvaWQgcm9zaF9wcl9hcmd2KGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCXByaW50ZigiJXMlcyIsIGFyZ3ZbaV0sIChpIDwgYXJnYyk/ICIgIiA6ICIiKTsKKyAgICB9CisgICAgcHV0cygiIik7Cit9CisKKy8qIFByaW50IHRoZSBjb250ZW50cyBvZiBhbiBhcmdjL2FyZ3YgcGFpciB2ZXJib3NlbHkKKyAqCWFyZ2MJQXJndW1lbnQgQ291bnQKKyAqCWFyZ3YJQXJndW1lbnQgVmFsdWVzCisgKi8KK3ZvaWQgcm9zaF9wcl9hcmd2X3YoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJcHJpbnRmKCIlNGQgJyVzJ1xuIiwgaSwgYXJndltpXSk7CisgICAgfQorfQorCisvKiBSZXNldCB0aGUgZ2V0b3B0KCkgZW52aXJvbm1lbnQKKyAqLwordm9pZCByb3NoX2dldG9wdF9yZXNldCh2b2lkKQoreworICAgIG9wdGluZCA9IDA7CisgICAgb3B0b3B0ID0gMDsKK30KKworLyogRGlzcGxheSBoZWxwCisgKgl0eXBlCUhlbHAgdHlwZQorICoJY21kc3RyCUNvbW1hbmQgZm9yIHdoaWNoIGhlbHAgaXMgcmVxdWVzdGVkCisgKi8KK3ZvaWQgcm9zaF9oZWxwKGludCB0eXBlLCBjb25zdCBjaGFyICpjbWRzdHIpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAyOgorCWlmICgoY21kc3RyID09IE5VTEwpIHx8IChzdHJjbXAoY21kc3RyLCAiIikgPT0gMCkpIHsKKwkgICAgcm9zaF92ZXJzaW9uKDApOworCSAgICBwdXRzKHJvc2hfaGVscF9zdHIyKTsKKwl9IGVsc2UgeworCSAgICBzd2l0Y2ggKGNtZHN0clswXSkgeworCSAgICBjYXNlICdjJzoKKwkJcHV0cyhyb3NoX2hlbHBfY2Rfc3RyKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ2wnOgorCQlwdXRzKHJvc2hfaGVscF9sc19zdHIpOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcHJpbnRmKHJvc2hfaGVscF9zdHJfYWR2LCBjbWRzdHIpOworCSAgICB9CisJfQorCWJyZWFrOworICAgIGNhc2UgMToKKyAgICBkZWZhdWx0OgorCWlmIChjbWRzdHIpCisJICAgIHByaW50ZigiJXM6ICVzOiB1bmtub3duIGNvbW1hbmRcbiIsIEFQUF9OQU1FLCBjbWRzdHIpOworCXJvc2hfdmVyc2lvbigwKTsKKwlwdXRzKHJvc2hfaGVscF9zdHIxKTsKKyAgICB9Cit9CisKKy8qIEhhbmRsZSBtb3N0L2FsbCBlcnJvcnMKKyAqCWllcnJubwlJbnB1dCBFcnJvciBudW1iZXIKKyAqCWNtZHN0cglDb21tYW5kIGJlaW5nIGV4ZWN1dGVkIHRvIGNhdXNlIGVycm9yCisgKglmaWxlc3RyCUZpbGUvcGFyYW1ldGVyIGNhdXNpbmcgZXJyb3IKKyAqLwordm9pZCByb3NoX2Vycm9yKGNvbnN0IGludCBpZXJybm8sIGNvbnN0IGNoYXIgKmNtZHN0ciwgY29uc3QgY2hhciAqZmlsZXN0cikKK3sKKyAgICBwcmludGYoIi0tRVJST1I6ICVzICclcyc6ICIsIGNtZHN0ciwgZmlsZXN0cik7CisgICAgc3dpdGNoIChpZXJybm8pIHsKKyAgICBjYXNlIDA6CisJcHV0cygiTk8gRVJST1IiKTsKKwlicmVhazsKKyAgICBjYXNlIEVOT0VOVDoKKwlwdXRzKCJub3QgZm91bmQiKTsKKwkvKiBTWVNMaW51eC0zLjcyIENPTTMyIEFQSSByZXR1cm5zIHRoaXMgZm9yIGEKKwkgICBkaXJlY3Rvcnkgb3IgZW1wdHkgZmlsZSAqLworCVJPU0hfQ09NMzIoIiAgKENPTTMyKSBjb3VsZCBiZSBhIGRpcmVjdG9yeSBvciBlbXB0eSBmaWxlXG4iKTsKKwlicmVhazsKKyAgICBjYXNlIEVJTzoKKwlwdXRzKCJJL08gRXJyb3IiKTsKKwlicmVhazsKKyAgICBjYXNlIEVCQURGOgorCXB1dHMoIkJhZCBGaWxlIERlc2NyaXB0b3IiKTsKKwlicmVhazsKKyAgICBjYXNlIEVBQ0NFUzoKKwlwdXRzKCJBY2Nlc3MgREVOSUVEIik7CisJYnJlYWs7CisgICAgY2FzZSBFTk9URElSOgorCXB1dHMoIm5vdCBhIGRpcmVjdG9yeSIpOworCVJPU0hfQ09NMzIoIiAgKENPTTMyKSBjb3VsZCBiZSBkaXJlY3RvcnlcbiIpOworCWJyZWFrOworICAgIGNhc2UgRUlTRElSOgorCXB1dHMoIklTIGEgZGlyZWN0b3J5Iik7CisJYnJlYWs7CisgICAgY2FzZSBFTk9TWVM6CisJcHV0cygibm90IGltcGxlbWVudGVkIik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlwcmludGYoInJldHVybnMgZXJyb3I7IGVycm5vPSVkXG4iLCBpZXJybm8pOworICAgIH0KK30JCQkJLyogcm9zaF9lcnJvciAqLworCisvKiBDb25jYXRlbmF0ZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGludG8gb25lIHN0cmluZworICoJY21kc3RyCU91dHB1dCBjb21tYW5kIHN0cmluZworICoJY21kbGVuCUxlbmd0aCBvZiBjbWRzdHIKKyAqCWFyZ2MJQXJndW1lbnQgQ291bnQKKyAqCWFyZ3YJQXJndW1lbnQgVmFsdWVzCisgKgliYXJnCUJlZ2lubmluZyBBcmd1bWVudAorICovCitpbnQgcm9zaF9hcmdjYXQoY2hhciAqY21kc3RyLCBjb25zdCBpbnQgY21kbGVuLCBjb25zdCBpbnQgYXJnYywgY2hhciAqYXJndltdLAorCQljb25zdCBpbnQgYmFyZykKK3sKKyAgICBpbnQgaSwgYXJnbGVuLCBjdXJwb3M7CS8qIGluZGV4LCBhcmd1bWVudCBsZW5ndGgsIGN1cnJlbnQgcG9zaXRpb24KKwkJCQkgICBpbiBjbWRzdHIgKi8KKyAgICBjdXJwb3MgPSAwOworICAgIGNtZHN0clswXSA9ICdcMCc7CQkvKiBOdWxsaWZ5IHN0cmluZyBqdXN0IHRvIGJlIHN1cmUgKi8KKyAgICBmb3IgKGkgPSBiYXJnOyBpIDwgYXJnYzsgaSsrKSB7CisJYXJnbGVuID0gc3RybGVuKGFyZ3ZbaV0pOworCS8qIFRoZW9yZXRpY2FsbHksIHRoaXMgc2hvdWxkIG5ldmVyIGJlIG1ldCBpbiBTWVNMSU5VWCAqLworCWlmICgoY3VycG9zICsgYXJnbGVuKSA+IChjbWRsZW4gLSAxKSkKKwkgICAgYXJnbGVuID0gKGNtZGxlbiAtIDEpIC0gY3VycG9zOworCW1lbWNweShjbWRzdHIgKyBjdXJwb3MsIGFyZ3ZbaV0sIGFyZ2xlbik7CisJY3VycG9zICs9IGFyZ2xlbjsKKwlpZiAoY3VycG9zID49IChjbWRsZW4gLSAxKSkgeworCSAgICAvKiBIb3BlZnVsbHksIGN1cnBvcyBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbgorCSAgICAgICAoY21kbGVuIC0gMSkgKi8KKwkgICAgLyogU3RpbGwgbmVlZCBhICdcMCcgYXQgdGhlIGxhc3QgY2hhcmFjdGVyICovCisJICAgIGNtZHN0clsoY21kbGVuIC0gMSldID0gMDsKKwkgICAgYnJlYWs7CQkvKiBFc2NhcGUgb3V0IG9mIHRoZSBmb3IoKSBsb29wOworCQkJCSAgIFdlIGNhbiBubyBsb25nZXIgcHJvY2VzcyBhbnl0aGluZyBtb3JlICovCisJfSBlbHNlIHsKKwkgICAgY21kc3RyW2N1cnBvc10gPSAnICc7CisJICAgIGN1cnBvcyArPSAxOworCSAgICBjbWRzdHJbY3VycG9zXSA9IDA7CisJfQorICAgIH0KKyAgICAvKiBJZiB0aGVyZSdzIGEgJyAnIGF0IHRoZSBlbmQsIHJlbW92ZSBpdC4gIFRoaXMgaXMgbm9ybWFsIHVubGVzcworICAgICAgIHRoZSBtYXhpbXVtIGxlbmd0aCBpcyBtZXQvZXhjZWVkZWQuICovCisgICAgaWYgKGNtZHN0cltjdXJwb3MgLSAxXSA9PSAnICcpCisJY21kc3RyWy0tY3VycG9zXSA9IDA7CisgICAgcmV0dXJuIGN1cnBvczsKK30JCQkJLyogcm9zaF9hcmdjYXQgKi8KKworLyoKKyAqIFByaW50cyBhIGxvdCBvZiB0aGUgZGF0YSBpbiBhIHN0cnVjdCB0ZXJtaW9zCisgKi8KKy8qCit2b2lkIHJvc2hfcHJpbnRfdGMoc3RydWN0IHRlcm1pb3MgKnRpbykKK3sKKwlwcmludGYoIiAgLS0gdGVybWlvczogIik7CisJcHJpbnRmKCIuY19pZmxhZz0lMDRYICIsIHRpby0+Y19pZmxhZyk7CisJcHJpbnRmKCIuY19vZmxhZz0lMDRYICIsIHRpby0+Y19vZmxhZyk7CisJcHJpbnRmKCIuY19jZmxhZz0lMDRYICIsIHRpby0+Y19jZmxhZyk7CisJcHJpbnRmKCIuY19sZmxhZz0lMDRYICIsIHRpby0+Y19sZmxhZyk7CisJcHJpbnRmKCIuY19jY1tWVElNRV09JyVkJyAiLCB0aW8tPmNfY2NbVlRJTUVdKTsKKwlwcmludGYoIi5jX2NjW1ZNSU5dPSclZCciLCB0aW8tPmNfY2NbVk1JTl0pOworCXByaW50ZigiXG4iKTsKK30KKyovCisKKy8qCisgKiBBdHRlbXB0cyB0byBnZXQgYSBzaW5nbGUga2V5IGZyb20gdGhlIGNvbnNvbGUKKyAqCXJldHVybnMJa2V5IHByZXNzZWQKKyAqLworaW50IHJvc2hfZ2V0a2V5KHZvaWQpCit7CisgICAgaW50IGluYzsKKworICAgIGluYyA9IEtFWV9OT05FOworICAgIHdoaWxlIChpbmMgPT0gS0VZX05PTkUpCisJaW5jID0gZ2V0X2tleShzdGRpbiwgNjAwMCk7CisgICAgcmV0dXJuIGluYzsKK30JCQkJLyogcm9zaF9nZXRrZXkgKi8KKworLyoKKyAqIFF1YWxpZmllcyBhIGZpbGVuYW1lIHJlbGF0aXZlIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorICoJZmlsZXN0cglGaWxlbmFtZSB0byBxdWFsaWZ5CisgKglwd2RzdHIJd29ya2luZyBkaXJlY3RvcnkKKyAqCXJldHVybnMJcXVhbGlmaWVkIGZpbGUgbmFtZSBzdHJpbmcKKyAqLwordm9pZCByb3NoX3F1YWxpZnlfZmlsZXN0cihjaGFyICpmaWxlc3RyLCBjb25zdCBjaGFyICppZmlsc3RyLAorCQkJICBjb25zdCBjaGFyICpwd2RzdHIpCit7CisgICAgaW50IGZpbGVwb3MgPSAwOworICAgIGlmICgoZmlsZXN0cikgJiYgKHB3ZHN0cikgJiYgKGlmaWxzdHIpKSB7CisJaWYgKGlmaWxzdHJbMF0gIT0gU0VQKSB7CisJICAgIHN0cmNweShmaWxlc3RyLCBwd2RzdHIpOworCSAgICBmaWxlcG9zID0gc3RybGVuKHB3ZHN0cik7CisJICAgIGlmIChmaWxlc3RyW2ZpbGVwb3MgLSAxXSAhPSBTRVApCisJCWZpbGVzdHJbZmlsZXBvcysrXSA9IFNFUDsKKwl9CisJc3RyY3B5KGZpbGVzdHIgKyBmaWxlcG9zLCBpZmlsc3RyKTsKKwlST1NIX0RFQlVHKCItLSclcydcbiIsIGZpbGVzdHIpOworICAgIH0KK30KKworLyogQ29uY2F0ZW5hdGUgbXVsdGlwbGUgZmlsZXMgdG8gc3Rkb3V0CisgKglhcmdjCUFyZ3VtZW50IENvdW50CisgKglhcmd2CUFyZ3VtZW50IFZhbHVlcworICovCit2b2lkIHJvc2hfY2F0KGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgRklMRSAqZjsKKyAgICBjaGFyIGJ1ZltST1NIX0JVRl9TWl07CisgICAgaW50IGksIG51bXJkOworCisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCXByaW50ZigiLS1GaWxlID0gJyVzJ1xuIiwgYXJndltpXSk7CisJZXJybm8gPSAwOworCWYgPSBmb3Blbihhcmd2W2ldLCAiciIpOworCWlmIChmICE9IE5VTEwpIHsKKwkgICAgbnVtcmQgPSBmcmVhZChidWYsIDEsIFJPU0hfQlVGX1NaLCBmKTsKKwkgICAgd2hpbGUgKG51bXJkID4gMCkgeworCQlmd3JpdGUoYnVmLCAxLCBudW1yZCwgc3Rkb3V0KTsKKwkJbnVtcmQgPSBmcmVhZChidWYsIDEsIFJPU0hfQlVGX1NaLCBmKTsKKwkgICAgfQorCSAgICBmY2xvc2UoZik7CisJfSBlbHNlIHsKKwkgICAgcm9zaF9lcnJvcihlcnJubywgImNhdCIsIGFyZ3ZbaV0pOworCSAgICBlcnJubyA9IDA7CisJfQorICAgIH0KK30JCQkJLyogcm9zaF9jYXQgKi8KKworLyogQ2hhbmdlIFBXRCAoUHJlc2VudCBXb3JraW5nIERpcmVjdG9yeSkKKyAqCWFyZ2MJQXJndW1lbnQgY291bnQKKyAqCWFyZ3YJQXJndW1lbnQgdmFsdWVzCisgKglpcHdkc3RyCUluaXRpYWwgUFdECisgKi8KK3ZvaWQgcm9zaF9jZChpbnQgYXJnYywgY2hhciAqYXJndltdLCBjb25zdCBjaGFyICppcHdkc3RyKQoreworICAgIGludCBydiA9IDA7CisjaWZkZWYgRE9fREVCVUcKKyAgICBjaGFyIGZpbGVzdHJbUk9TSF9QQVRIX1NaXTsKKyNlbmRpZiAvKiBET19ERUJVRyAqLworICAgIFJPU0hfREVCVUcoIkNNRDogXG4iKTsKKyAgICBST1NIX0RFQlVHX0FSR1ZfVihhcmdjLCBhcmd2KTsKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKGFyZ2MgPT0gMikKKwlydiA9IGNoZGlyKGFyZ3ZbMV0pOworICAgIGVsc2UgaWYgKGFyZ2MgPT0gMSkKKwlydiA9IGNoZGlyKGlwd2RzdHIpOworICAgIGVsc2UKKwlyb3NoX2hlbHAoMiwgYXJndlswXSk7CisgICAgaWYgKHJ2ICE9IDApIHsKKwlpZiAoYXJnYyA9PSAyKQorCSAgICByb3NoX2Vycm9yKGVycm5vLCAiY2QiLCBhcmd2WzFdKTsKKwllbHNlCisJICAgIHJvc2hfZXJyb3IoZXJybm8sICJjZCIsIGlwd2RzdHIpOworCWVycm5vID0gMDsKKyAgICB9IGVsc2UgeworI2lmZGVmIERPX0RFQlVHCisJaWYgKGdldGN3ZChmaWxlc3RyLCBST1NIX1BBVEhfU1opKQorCSAgICBST1NIX0RFQlVHKCIgICVzXG4iLCBmaWxlc3RyKTsKKyNlbmRpZiAvKiBET19ERUJVRyAqLworICAgIH0KK30JCQkJLyogcm9zaF9jZCAqLworCisvKiBQcmludCB0aGUgc3lzbGludXggY29uZmlnIGZpbGUgbmFtZQorICovCit2b2lkIHJvc2hfY2ZnKHZvaWQpCit7CisgICAgcHJpbnRmKCJDRkc6ICAgICAnJXMnXG4iLCBzeXNsaW51eF9jb25maWdfZmlsZSgpKTsKK30JCQkJLyogcm9zaF9jZmcgKi8KKworLyogRWNobyBhIHN0cmluZyBiYWNrIHRvIHRoZSBzY3JlZW4KKyAqCWNtZHN0cgljb21tYW5kIHN0cmluZyB0byBwcm9jZXNzCisgKi8KK3ZvaWQgcm9zaF9lY2hvKGNvbnN0IGNoYXIgKmNtZHN0cikKK3sKKyAgICBpbnQgYnBvcyA9IDA7CisgICAgUk9TSF9ERUJVRygiQ01EOiAnJXMnXG4iLCBjbWRzdHIpOworICAgIGJwb3MgPSByb3NoX3NlYXJjaF9ub25zcChjbWRzdHIsIHJvc2hfc2VhcmNoX3NwKGNtZHN0ciwgMCkpOworICAgIGlmIChicG9zID4gMSkgeworCVJPU0hfREVCVUcoIiAgYnBvcz0lZFxuIiwgYnBvcyk7CisJcHJpbnRmKCInJXMnXG4iLCBjbWRzdHIgKyBicG9zKTsKKyAgICB9IGVsc2UgeworCXB1dHMoIiIpOworICAgIH0KK30JCQkJLyogcm9zaF9lY2hvICovCisKKy8qIFByb2Nlc3MgYXJnYy9hcmd2IHRvIG9wdGFycgorICoJYXJnYwlBcmd1bWVudCBjb3VudAorICoJYXJndglBcmd1bWVudCB2YWx1ZXMKKyAqCW9wdGFycglvcHRpb24gYXJyYXkgdG8gcG9wdWxhdGUKKyAqLwordm9pZCByb3NoX2xzX2FyZ19vcHQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgaW50IG9wdGFycltdKQoreworICAgIGludCBydiA9IDA7CisKKyAgICBvcHRhcnJbMF0gPSAtMTsKKyAgICBvcHRhcnJbMV0gPSAtMTsKKyAgICBvcHRhcnJbMl0gPSAtMTsKKyAgICByb3NoX2dldG9wdF9yZXNldCgpOworICAgIHdoaWxlIChydiAhPSAtMSkgeworCVJPU0hfREVCVUcyKCJnZXRvcHQgb3B0aW5kPSVkIHJ2PSVkXG4iLCBvcHRpbmQsIHJ2KTsKKwlydiA9IGdldG9wdChhcmdjLCBhcmd2LCByb3NoX2xzX29wdF9zdHIpOworCXN3aXRjaCAocnYpIHsKKwljYXNlICdsJzoKKwljYXNlIDA6CisJICAgIG9wdGFyclswXSA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgJ0YnOgorCWNhc2UgMToKKwkgICAgb3B0YXJyWzFdID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSAnaSc6CisJY2FzZSAyOgorCSAgICBvcHRhcnJbMl0gPSAxOworCSAgICBicmVhazsKKwljYXNlICc/JzoKKwljYXNlIC0xOgorCWRlZmF1bHQ6CisJICAgIFJPU0hfREVCVUcyKCJnZXRvcHQgb3B0aW5kPSVkIHJ2PSVkXG4iLCBvcHRpbmQsIHJ2KTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBST1NIX0RFQlVHMigiIGVuZCBnZXRvcHQgb3B0aW5kPSVkIHJ2PSVkXG4iLCBvcHRpbmQsIHJ2KTsKKyAgICBST1NIX0RFQlVHMigiXHRJbiByb3NoX2xzX2FyZ19vcHQoKSBvcHRbMF09JWRcdG9wdFsxXT0lZFx0b3B0WzJdPSVkXG4iLCBvcHRhcnJbMF0sIG9wdGFyclsxXSwKKwkgICAgICAgb3B0YXJyWzJdKTsKK30JCQkJLyogcm9zaF9sc19hcmdfb3B0ICovCisKKy8qIFJldHJpZXZlIHRoZSBzaXplIG9mIGEgZmlsZSBhcmd1bWVudAorICoJZmlsZXN0cglkaXJlY3RvcnkgbmFtZSBvZiBkaXJlY3RvcnkgZW50cnkKKyAqCWRlCWRpcmVjdG9yeSBlbnRyeQorICovCitpbnQgcm9zaF9sc19kZV9zaXplKGNvbnN0IGNoYXIgKmZpbGVzdHIsIHN0cnVjdCBkaXJlbnQgKmRlKQoreworICAgIGludCBkZV9zaXplOworICAgIGNoYXIgZmlsZXN0cjJbUk9TSF9QQVRIX1NaXTsKKyAgICBpbnQgZmQyLCBmaWxlMnBvczsKKyAgICBzdHJ1Y3Qgc3RhdCBmZHN0YXQ7CisKKyAgICBmaWxlc3RyMlswXSA9IDA7CisgICAgZmlsZTJwb3MgPSAtMTsKKyAgICBpZiAoZmlsZXN0cikgeworCWZpbGUycG9zID0gc3RybGVuKGZpbGVzdHIpOworCW1lbWNweShmaWxlc3RyMiwgZmlsZXN0ciwgZmlsZTJwb3MpOworCWZpbGVzdHIyW2ZpbGUycG9zXSA9ICcvJzsKKyAgICB9CisgICAgc3RyY3B5KGZpbGVzdHIyICsgZmlsZTJwb3MgKyAxLCBkZS0+ZF9uYW1lKTsKKyAgICBmZDIgPSBvcGVuKGZpbGVzdHIyLCBPX1JET05MWSk7CisgICAgZnN0YXQoZmQyLCAmZmRzdGF0KTsKKyAgICBmZDIgPSBjbG9zZShmZDIpOworICAgIGRlX3NpemUgPSAoaW50KWZkc3RhdC5zdF9zaXplOworICAgIHJldHVybiBkZV9zaXplOworfQkJCQkvKiByb3NoX2xzX2RlX3NpemUgKi8KKworLyogUmV0cmlldmUgdGhlIHNpemUgYW5kIG1vZGUgb2YgYSBmaWxlCisgKglmaWxlc3RyCWRpcmVjdG9yeSBuYW1lIG9mIGRpcmVjdG9yeSBlbnRyeQorICoJZGUJZGlyZWN0b3J5IGVudHJ5CisgKi8KK2ludCByb3NoX2xzX2RlX3NpemVfbW9kZShjb25zdCBjaGFyICpmaWxlc3RyLCBzdHJ1Y3QgZGlyZW50ICpkZSwgbW9kZV90ICogc3RfbW9kZSkKK3sKKyAgICBpbnQgZGVfc2l6ZTsKKyAgICBjaGFyIGZpbGVzdHIyW1JPU0hfUEFUSF9TWl07CisgICAgaW50IGZpbGUycG9zOworICAgIHN0cnVjdCBzdGF0IGZkc3RhdDsKKyAgICBpbnQgc3RhdHVzOworCisgICAgZmlsZXN0cjJbMF0gPSAwOworICAgIGZpbGUycG9zID0gLTE7CisgICAgbWVtc2V0KCZmZHN0YXQsIDAsIHNpemVvZiBmZHN0YXQpOworICAgIFJPU0hfREVCVUcyKCJsczpkc20oJXMsICVzKSAiLCBmaWxlc3RyLCBkZS0+ZF9uYW1lKTsKKyAgICBpZiAoZmlsZXN0cikgeworCS8qIEZJWE1FOiBwcmV2ZW50IHN0cmluZyBvdmVyZmxvdyAqLworCWZpbGUycG9zID0gc3RybGVuKGZpbGVzdHIpOworCW1lbWNweShmaWxlc3RyMiwgZmlsZXN0ciwgZmlsZTJwb3MpOworCWlmICgoIGZpbGVzdHIyW2ZpbGUycG9zIC0gMV0gPT0gU0VQICkpIHsKKwkgICAgZmlsZTJwb3MtLTsKKwl9IGVsc2UgeworCSAgICBmaWxlc3RyMltmaWxlMnBvc10gPSBTRVA7CisJfQorICAgIH0KKyAgICBzdHJjcHkoZmlsZXN0cjIgKyBmaWxlMnBvcyArIDEsIGRlLT5kX25hbWUpOworICAgIGVycm5vID0gMDsKKyAgICBST1NIX0RFQlVHMigic3RhdCglcykgIiwgZmlsZXN0cjIpOworICAgIHN0YXR1cyA9IHN0YXQoZmlsZXN0cjIsICZmZHN0YXQpOworICAgICh2b2lkKXN0YXR1czsKKyAgICBST1NIX0RFQlVHMigiXHQtLXN0YXQoKT0lZFx0ZXJyPSVkXG4iLCBzdGF0dXMsIGVycm5vKTsKKyAgICBpZiAoZXJybm8pIHsKKwlyb3NoX2Vycm9yKGVycm5vLCAibHM6c3ptZC5zdGF0IiwgZGUtPmRfbmFtZSk7CisJZXJybm8gPSAwOworICAgIH0KKyAgICBkZV9zaXplID0gKGludClmZHN0YXQuc3Rfc2l6ZTsKKyAgICAqc3RfbW9kZSA9IGZkc3RhdC5zdF9tb2RlOworICAgIHJldHVybiBkZV9zaXplOworfQkJCQkvKiByb3NoX2xzX2RlX3NpemVfbW9kZSAqLworCisvKiBSZXR1cm5zIHRoZSBJbm9kZSBudW1iZXIgaWYgZmRzdGF0IGNvbnRhaW5zIGl0CisgKglmZHN0YXQJc3RydWN0IHRvIGV4dHJhY3QgaW5vZGUgZnJvbSBpZiBub3QgQ09NMzIsIGZvciBub3cKKyAqLworbG9uZyByb3NoX2xzX2RfaW5vKHN0cnVjdCBzdGF0ICpmZHN0YXQpCit7CisgICAgbG9uZyBkZV9pbm87CisjaWZkZWYgX19DT00zMl9fCisgICAgaWYgKGZkc3RhdCkKKwlkZV9pbm8gPSAtMTsKKyAgICBlbHNlCisJZGVfaW5vID0gMDsKKyNlbHNlIC8qIF9fQ09NMzJfXyAqLworICAgIGRlX2lubyA9IGZkc3RhdC0+c3RfaW5vOworI2VuZGlmIC8qIF9fQ09NMzJfXyAqLworICAgIHJldHVybiBkZV9pbm87Cit9CisKKy8qIENvbnZlcnQgYSBkX3R5cGUgdG8gYSBzaW5nbGUgY2hhciBpbiBodW1hbiByZWFkYWJsZSBmb3JtYXQKKyAqCWRfdHlwZQlkX3R5cGUgdG8gY29udmVydAorICoJcmV0dXJucyBodW1hbiByZWFkYWJsZSBzaW5nbGUgY2hhcmFjdGVyOyBhIHNwYWNlIGlmIG90aGVyCisgKi8KK2NoYXIgcm9zaF9kX3R5cGUyY2hhcl9odW1hbih1bnNpZ25lZCBjaGFyIGRfdHlwZSkKK3sKKyAgICBjaGFyIHJldDsKKyAgICBzd2l0Y2ggKGRfdHlwZSkgeworICAgIGNhc2UgRFRfVU5LTk9XTjoKKwlyZXQgPSAnVSc7CisJYnJlYWs7CQkJLyogVW5rbm93biAqLworICAgIGNhc2UgRFRfRklGTzoKKwlyZXQgPSAnRic7CisJYnJlYWs7CQkJLyogRklGTyAqLworICAgIGNhc2UgRFRfQ0hSOgorCXJldCA9ICdDJzsKKwlicmVhazsJCQkvKiBDaGFyIERldiAqLworICAgIGNhc2UgRFRfRElSOgorCXJldCA9ICdEJzsKKwlicmVhazsJCQkvKiBEaXJlY3RvcnkgKi8KKyAgICBjYXNlIERUX0JMSzoKKwlyZXQgPSAnQic7CisJYnJlYWs7CQkJLyogQmxvY2sgRGV2ICovCisgICAgY2FzZSBEVF9SRUc6CisJcmV0ID0gJ1InOworCWJyZWFrOwkJCS8qIFJlZ3VsYXIgRmlsZSAqLworICAgIGNhc2UgRFRfTE5LOgorCXJldCA9ICdMJzsKKwlicmVhazsJCQkvKiBMaW5rLCBTeW1ib2xpYyAqLworICAgIGNhc2UgRFRfU09DSzoKKwlyZXQgPSAnUyc7CisJYnJlYWs7CQkJLyogU29ja2V0ICovCisgICAgY2FzZSBEVF9XSFQ6CisJcmV0ID0gJ1cnOworCWJyZWFrOwkJCS8qIFVuaW9uRlMgV2hpdGVvdXQgKi8KKyAgICBkZWZhdWx0OgorCXJldCA9ICcgJzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30JCQkJLyogcm9zaF9kX3R5cGUyY2hhcl9odW1hbiAqLworCisvKiBDb252ZXJ0IGEgZF90eXBlIHRvIGEgc2luZ2xlIGNoYXIgYnkgbHMncyBwcmVmaXggc3RhbmRhcmRzIGZvciAtbAorICoJZF90eXBlCWRfdHlwZSB0byBjb252ZXJ0CisgKglyZXR1cm5zIGxzIHN0eWxlIHNpbmdsZSBjaGFyYWN0ZXI7IGEgc3BhY2UgaWYgb3RoZXIKKyAqLworY2hhciByb3NoX2RfdHlwZTJjaGFyX2xzcHJlKHVuc2lnbmVkIGNoYXIgZF90eXBlKQoreworICAgIGNoYXIgcmV0OworICAgIHN3aXRjaCAoZF90eXBlKSB7CisgICAgY2FzZSBEVF9GSUZPOgorCXJldCA9ICdwJzsKKwlicmVhazsKKyAgICBjYXNlIERUX0NIUjoKKwlyZXQgPSAnYyc7CisJYnJlYWs7CisgICAgY2FzZSBEVF9ESVI6CisJcmV0ID0gJ2QnOworCWJyZWFrOworICAgIGNhc2UgRFRfQkxLOgorCXJldCA9ICdiJzsKKwlicmVhazsKKyAgICBjYXNlIERUX1JFRzoKKwlyZXQgPSAnLSc7CisJYnJlYWs7CisgICAgY2FzZSBEVF9MTks6CisJcmV0ID0gJ2wnOworCWJyZWFrOworICAgIGNhc2UgRFRfU09DSzoKKwlyZXQgPSAncyc7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlyZXQgPSAnPyc7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CQkJCS8qIHJvc2hfZF90eXBlMmNoYXJfbHNwcmUgKi8KKworLyogQ29udmVydCBhIGRfdHlwZSB0byBhIHNpbmdsZSBjaGFyIGJ5IGxzJ3MgY2xhc3NpZnkgKC1GKSBzdWZmaXggc3RhbmRhcmRzCisgKglkX3R5cGUJZF90eXBlIHRvIGNvbnZlcnQKKyAqCXJldHVybnMgbHMgc3R5bGUgc2luZ2xlIGNoYXJhY3RlcjsgYSBzcGFjZSBpZiBvdGhlcgorICovCitjaGFyIHJvc2hfZF90eXBlMmNoYXJfbHNzdWYodW5zaWduZWQgY2hhciBkX3R5cGUpCit7CisgICAgY2hhciByZXQ7CisgICAgc3dpdGNoIChkX3R5cGUpIHsKKyAgICBjYXNlIERUX0ZJRk86CisJcmV0ID0gJ3wnOworCWJyZWFrOworICAgIGNhc2UgRFRfRElSOgorCXJldCA9ICcvJzsKKwlicmVhazsKKyAgICBjYXNlIERUX0xOSzoKKwlyZXQgPSAnQCc7CisJYnJlYWs7CisgICAgY2FzZSBEVF9TT0NLOgorCXJldCA9ICc9JzsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXJldCA9ICcgJzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30JCQkJLyogcm9zaF9kX3R5cGUyY2hhcl9sc3N1ZiAqLworCisvKiBDb252ZXJ0cyBkYXRhIGluIHRoZSAib3RoZXIiIHBsYWNlIG9mIHN0X21vZGUgdG8gYSBscy1zdHlsZSBzdHJpbmcKKyAqCXN0X21vZGUJTW9kZSBpbiBvdGhlciB0byBhbmFseXplCisgKglzdF9tb2RlX3N0cglzdHJpbmcgdG8gaG9sZCBjb252ZXJ0ZWQgc3RyaW5nCisgKi8KK3ZvaWQgcm9zaF9zdF9tb2RlX2FtMnN0cihtb2RlX3Qgc3RfbW9kZSwgY2hhciAqc3RfbW9kZV9zdHIpCit7CisgICAgc3RfbW9kZV9zdHJbMF0gPSAoKHN0X21vZGUgJiBTX0lST1RIKSA/ICdyJyA6ICctJyk7CisgICAgc3RfbW9kZV9zdHJbMV0gPSAoKHN0X21vZGUgJiBTX0lXT1RIKSA/ICd3JyA6ICctJyk7CisgICAgc3RfbW9kZV9zdHJbMl0gPSAoKHN0X21vZGUgJiBTX0lYT1RIKSA/ICd4JyA6ICctJyk7Cit9CisKKy8qIENvbnZlcnRzIHN0X21vZGUgdG8gYW4gbHMtc3R5bGUgc3RyaW5nCisgKglzdF9tb2RlCW1vZGUgdG8gY29udmVydAorICoJc3RfbW9kZV9zdHIJc3RyaW5nIHRvIGhvbGQgY29udmVydGVkIHN0cmluZworICovCit2b2lkIHJvc2hfc3RfbW9kZTJzdHIobW9kZV90IHN0X21vZGUsIGNoYXIgKnN0X21vZGVfc3RyKQoreworICAgIHN0X21vZGVfc3RyWzBdID0gcm9zaF9kX3R5cGUyY2hhcl9sc3ByZShJRlRPRFQoc3RfbW9kZSkpOworICAgIHJvc2hfc3RfbW9kZV9hbTJzdHIoKHN0X21vZGUgJiBTX0lSV1hVKSA+PiA2LCBzdF9tb2RlX3N0ciArIDEpOworICAgIHJvc2hfc3RfbW9kZV9hbTJzdHIoKHN0X21vZGUgJiBTX0lSV1hHKSA+PiAzLCBzdF9tb2RlX3N0ciArIDQpOworICAgIHJvc2hfc3RfbW9kZV9hbTJzdHIoc3RfbW9kZSAmIFNfSVJXWE8sIHN0X21vZGVfc3RyICsgNyk7CisgICAgc3RfbW9kZV9zdHJbMTBdID0gMDsKK30JCQkJLyogcm9zaF9zdF9tb2RlMnN0ciAqLworCisvKiBPdXRwdXQgYSBzaW5nbGUgZW50cnkKKyAqCWZpbGVzdHIJZGlyZWN0b3J5IG5hbWUgdG8gbGlzdAorICoJZGUJZGlyZWN0b3J5IGVudHJ5CisgKglvcHRhcnIJQXJyYXkgb2Ygb3B0aW9ucworICovCit2b2lkIHJvc2hfbHNfYXJnX2Rpcl9kZShjb25zdCBjaGFyICpmaWxlc3RyLCBzdHJ1Y3QgZGlyZW50ICpkZSwgY29uc3QgaW50ICpvcHRhcnIpCit7CisgICAgaW50IGRlX3NpemU7CisgICAgbW9kZV90IHN0X21vZGU7CisgICAgY2hhciBzdF9tb2RlX3N0clsxMV07CisgICAgc3RfbW9kZSA9IDA7CisgICAgUk9TSF9ERUJVRzIoIisiKTsKKyAgICBpZiAob3B0YXJyWzJdID4gLTEpCisJcHJpbnRmKCIlMTBkICIsIChpbnQpKGRlLT5kX2lubykpOworICAgIGlmIChvcHRhcnJbMF0gPiAtMSkgeworCWRlX3NpemUgPSByb3NoX2xzX2RlX3NpemVfbW9kZShmaWxlc3RyLCBkZSwgJnN0X21vZGUpOworCXJvc2hfc3RfbW9kZTJzdHIoc3RfbW9kZSwgc3RfbW9kZV9zdHIpOworCVJPU0hfREVCVUcyKCIlMDRYICIsIHN0X21vZGUpOworCXByaW50ZigiJXMgJTEwZCAiLCBzdF9tb2RlX3N0ciwgZGVfc2l6ZSk7CisgICAgfQorICAgIFJPU0hfREVCVUcoIiciKTsKKyAgICBwcmludGYoIiVzIiwgZGUtPmRfbmFtZSk7CisgICAgUk9TSF9ERUJVRygiJyIpOworICAgIGlmIChvcHRhcnJbMV0gPiAtMSkKKwlwcmludGYoIiVjIiwgcm9zaF9kX3R5cGUyY2hhcl9sc3N1ZihkZS0+ZF90eXBlKSk7CisgICAgcHJpbnRmKCJcbiIpOworfQkJCQkvKiByb3NoX2xzX2FyZ19kaXJfZGUgKi8KKworLyogT3V0cHV0IGxpc3Rpbmcgb2YgYSByZWd1bGFyIGRpcmVjdG9yeQorICoJZmlsZXN0cglkaXJlY3RvcnkgbmFtZSB0byBsaXN0CisgKglkCXRoZSBvcGVuIERJUgorICoJb3B0YXJyCUFycmF5IG9mIG9wdGlvbnMKKwlOT1RFOlRoaXMgaXMgd2hlcmUgSSBjb3VsZCB1c2UgcXNvcnQKKyAqLwordm9pZCByb3NoX2xzX2FyZ19kaXIoY29uc3QgY2hhciAqZmlsZXN0ciwgRElSICogZCwgY29uc3QgaW50ICpvcHRhcnIpCit7CisgICAgc3RydWN0IGRpcmVudCAqZGU7CisgICAgaW50IGZpbGVwb3M7CisKKyAgICBmaWxlcG9zID0gMDsKKyAgICBlcnJubyA9IDA7CisgICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKSB7CisJZmlsZXBvcysrOworCXJvc2hfbHNfYXJnX2Rpcl9kZShmaWxlc3RyLCBkZSwgb3B0YXJyKTsKKyAgICB9CisgICAgaWYgKGVycm5vKSB7CisJcm9zaF9lcnJvcihlcnJubywgImxzOmFyZ19kaXIiLCBmaWxlc3RyKTsKKwllcnJubyA9IDA7CisgICAgfSBlbHNlIHsgaWYgKGZpbGVwb3MgPT0gMCkKKwlST1NIX0RFQlVHKCIwIGZpbGVzIGZvdW5kIik7CisgICAgfQorfQkJCQkvKiByb3NoX2xzX2FyZ19kaXIgKi8KKworLyogU2ltcGxlIGRpcmVjdG9yeSBsaXN0aW5nIGZvciBvbmUgYXJndW1lbnQgKGZpbGUvZGlyZWN0b3J5KSBiYXNlZCBvbgorICogZmlsZXN0ciBhbmQgcHdkc3RyCisgKglpZmlsc3RyCWlucHV0IGZpbGVuYW1lL2RpcmVjdG9yeSBuYW1lIHRvIGxpc3QKKyAqCXB3ZHN0cglQcmVzZW50IFdvcmtpbmcgRGlyZWN0b3J5IHN0cmluZworICoJb3B0YXJyCU9wdGlvbiBBcnJheQorICovCit2b2lkIHJvc2hfbHNfYXJnKGNvbnN0IGNoYXIgKmZpbGVzdHIsIGNvbnN0IGludCAqb3B0YXJyKQoreworICAgIHN0cnVjdCBzdGF0IGZkc3RhdDsKKyAgICBpbnQgc3RhdHVzOworLy8gICAgIGNoYXIgZmlsZXN0cltST1NIX1BBVEhfU1pdOworLy8gICAgIGludCBmaWxlcG9zOworICAgIERJUiAqZDsKKyAgICBzdHJ1Y3QgZGlyZW50IGRlOworCisgICAgLyogSW5pdGlhbGl6YXRpb247IG1ha2UgZmlsZXN0ciBiYXNlZCBvbiBsZWFkaW5nIGNoYXJhY3RlciBvZiBpZmlsc3RyCisgICAgICAgYW5kIHB3ZHN0ciAqLworLy8gICAgIHJvc2hfcXVhbGlmeV9maWxlc3RyKGZpbGVzdHIsIGlmaWxzdHIsIHB3ZHN0cik7CisgICAgZmRzdGF0LnN0X21vZGUgPSAwOworICAgIGZkc3RhdC5zdF9zaXplID0gMDsKKyAgICBST1NIX0RFQlVHKCJcdG9wdFswXT0lZFx0b3B0WzFdPSVkXHRvcHRbMl09JWRcbiIsIG9wdGFyclswXSwgb3B0YXJyWzFdLAorCSAgICAgICBvcHRhcnJbMl0pOworCisgICAgLyogTm93LCB0aGUgcmVhbCB3b3JrICovCisgICAgZXJybm8gPSAwOworICAgIHN0YXR1cyA9IHN0YXQoZmlsZXN0ciwgJmZkc3RhdCk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisJaWYgKFNfSVNESVIoZmRzdGF0LnN0X21vZGUpKSB7CisJICAgIFJPU0hfREVCVUcoIlBBVEggJyVzJyBpcyBhIGRpcmVjdG9yeVxuIiwgZmlsZXN0cik7CisJICAgIGlmICgoZCA9IG9wZW5kaXIoZmlsZXN0cikpKSB7CisJCXJvc2hfbHNfYXJnX2RpcihmaWxlc3RyLCBkLCBvcHRhcnIpOworCQljbG9zZWRpcihkKTsKKwkgICAgfSBlbHNlIHsKKwkJcm9zaF9lcnJvcihlcnJubywgImxzIiwgZmlsZXN0cik7CisJCWVycm5vID0gMDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGRlLmRfaW5vID0gcm9zaF9sc19kX2lubygmZmRzdGF0KTsKKwkgICAgZGUuZF90eXBlID0gKElGVE9EVChmZHN0YXQuc3RfbW9kZSkpOworCSAgICBzdHJjcHkoZGUuZF9uYW1lLCBmaWxlc3RyKTsKKwkgICAgaWYgKFNfSVNSRUcoZmRzdGF0LnN0X21vZGUpKSB7CisJCVJPU0hfREVCVUcoIlBBVEggJyVzJyBpcyBhIHJlZ3VsYXIgZmlsZVxuIiwgZmlsZXN0cik7CisJICAgIH0gZWxzZSB7CisJCVJPU0hfREVCVUcoIlBBVEggJyVzJyBpcyBzb21lIG90aGVyIGZpbGVcbiIsIGZpbGVzdHIpOworCSAgICB9CisJICAgIHJvc2hfbHNfYXJnX2Rpcl9kZShOVUxMLCAmZGUsIG9wdGFycik7CisvKgkgICAgaWYgKGlmaWxzdHJbMF0gPT0gU0VQKQorCQlyb3NoX2xzX2FyZ19kaXJfZGUoTlVMTCwgJmRlLCBvcHRhcnIpOworCSAgICBlbHNlCisJCXJvc2hfbHNfYXJnX2Rpcl9kZShwd2RzdHIsICZkZSwgb3B0YXJyKTsqLworCX0KKyAgICB9IGVsc2UgeworCXJvc2hfZXJyb3IoZXJybm8sICJscyIsIGZpbGVzdHIpOworCWVycm5vID0gMDsKKyAgICB9CisgICAgcmV0dXJuOworfQkJCQkvKiByb3NoX2xzX2FyZyAqLworCisvKiBQYXJzZSBvcHRpb25zIHRoYXQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGNtZHN0cgorICoJZmlsZXN0cglQb3NzaWJsZSBvcHRpb24gc3RyaW5nIHRvIHBhcnNlCisgKglvcHRzdHIJQ3VycmVudCBvcHRpb25zCisgKglyZXR1cm5zIDEgaWYgZmlsZXN0ciBkb2VzIG5vdCBiZWdpbiB3aXRoICctJyBlbHNlIDAKKyAqLworaW50IHJvc2hfbHNfcGFyc2Vfb3B0KGNvbnN0IGNoYXIgKmZpbGVzdHIsIGNoYXIgKm9wdHN0cikKK3sKKyAgICBpbnQgcmV0OworICAgIGlmIChmaWxlc3RyWzBdID09ICctJykgeworCXJldCA9IDA7CisJaWYgKG9wdHN0cikKKwkgICAgc3RyY2F0KG9wdHN0ciwgZmlsZXN0ciArIDEpOworICAgIH0gZWxzZSB7CisJcmV0ID0gMTsKKyAgICB9CisgICAgUk9TSF9ERUJVRygiUGFyc2VPcHQ6ICclcydcblx0b3B0OiAnJXMnXG5cdHJldDogJWRcbiIsIGZpbGVzdHIsIG9wdHN0ciwKKwkgICAgICAgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQkJCQkvKiByb3NoX2xzX3BhcnNlX29wdCAqLworCisvKiBMaXN0IERpcmVjdG9yeQorICoJYXJnYwlBcmd1bWVudCBjb3VudAorICoJYXJndglBcmd1bWVudCB2YWx1ZXMKKyAqLwordm9pZCByb3NoX2xzKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgaW50IG9wdGFyclszXTsKKyAgICBpbnQgaTsKKworICAgIHJvc2hfbHNfYXJnX29wdChhcmdjLCBhcmd2LCBvcHRhcnIpOworICAgIFJPU0hfREVCVUcyKCJJbiBscygpXG4iKTsKKyAgICBST1NIX0RFQlVHMl9BUkdWX1YoYXJnYywgYXJndik7CisjaWZkZWYgRE9fREVCVUcKKyAgICBvcHRhcnJbMF0gPSAyOworI2VuZGlmIC8qIERPX0RFQlVHICovCisgICAgUk9TSF9ERUJVRzIoIiAgYXJnYz0lZDsgb3B0aW5kPSVkXG4iLCBhcmdjLCBvcHRpbmQpOworICAgIGlmIChvcHRpbmQgPj0gYXJnYykKKwlyb3NoX2xzX2FyZygiLiIsIG9wdGFycik7CisgICAgZm9yIChpID0gb3B0aW5kOyBpIDwgYXJnYzsgaSsrKSB7CisJcm9zaF9sc19hcmcoYXJndltpXSwgb3B0YXJyKTsKKyAgICB9Cit9CQkJCS8qIHJvc2hfbHMgKi8KKworLyogU2ltcGxlIGRpcmVjdG9yeSBsaXN0aW5nOyBjYWxscyByb3NoX2xzKCkKKyAqCWFyZ2MJQXJndW1lbnQgY291bnQKKyAqCWFyZ3YJQXJndW1lbnQgdmFsdWVzCisgKi8KK3ZvaWQgcm9zaF9kaXIoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBST1NIX0RFQlVHKCIgIGRpciBpbXBsZW1lbnRlZCBhcyBsc1xuIik7CisgICAgcm9zaF9scyhhcmdjLCBhcmd2KTsKK30JCQkJLyogcm9zaF9kaXIgKi8KKworLyogUGFnZSB0aHJvdWdoIGEgYnVmZmVyIHN0cmluZworICoJYnVmCUJ1ZmZlciB0byBwYWdlIHRocm91Z2gKKyAqLwordm9pZCByb3NoX21vcmVfYnVmKGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHJvd3MsIGludCBjb2xzLCBjaGFyICpzY3JidWYpCit7CisgICAgY2hhciAqYnVmcCwgKmJ1ZmVvbCwgKmJ1ZmVvbDI7CS8qIFBvaW50ZXIgdG8gY3VycmVudCBhbmQgbmV4dAorCQkJCQkgICBlbmQtb2YtbGluZSBwb3NpdGlvbiBpbiBidWZmZXIgKi8KKyAgICBpbnQgYnVmcG9zLCBidWZjbnQ7CQkvKiBjdXJyZW50IHBvc2l0aW9uLCBjb3VudCBjaGFyYWN0ZXJzICovCisgICAgaW50IGluYzsKKyAgICBpbnQgaSwgbnVtbG47CQkvKiBJbmRleCwgTnVtYmVyIG9mIGxpbmVzICovCisgICAgaW50IGVscGw7CQkvKiBFeHRyYSBsaW5lcyBwZXIgbGluZSByZWFkICovCisKKyAgICAodm9pZCljb2xzOworCisgICAgYnVmcG9zID0gMDsKKyAgICBidWZwID0gYnVmICsgYnVmcG9zOworICAgIGJ1ZmVvbCA9IGJ1ZnA7CisgICAgbnVtbG4gPSByb3dzIC0gMTsKKyAgICBST1NIX0RFQlVHKCItLSglZClcbiIsIGJ1Zmxlbik7CisgICAgd2hpbGUgKGJ1ZnBvcyA8IGJ1ZmxlbikgeworCWZvciAoaSA9IDA7IGkgPCBudW1sbjsgaSsrKSB7CisJICAgIGJ1ZmVvbDIgPSBzdHJjaHIoYnVmZW9sLCAnXG4nKTsKKwkgICAgaWYgKGJ1ZmVvbDIgPT0gTlVMTCkgeworCQlidWZlb2wgPSBidWYgKyBidWZsZW47CisJCWkgPSBudW1sbjsKKwkgICAgfSBlbHNlIHsKKwkJZWxwbCA9ICgoYnVmZW9sMiAtIGJ1ZmVvbCAtIDEpIC8gY29scyk7CisJCWlmIChlbHBsIDwgMCkKKwkJICAgIGVscGwgPSAwOworCQlpICs9IGVscGw7CisJCVJPU0hfREVCVUcyKCIgICVkLyVkICAiLCBlbHBsLCBpKzEpOworCQkvKiBJZiB0aGlzIHdpbGwgbm90IHB1c2ggdG9vIG11Y2gsIHVzZSBpdCAqLworCQkvKiBidXQgaWYgaXQncyB0aGUgZmlyc3QgbGluZSwgdXNlIGl0ICovCisJCS8qIC8vSEVSRTogV2Ugc2hvdWxkIHByb2JhYmx5IHNuaXAgdGhlIGxpbmUgb2ZmICovCisJCWlmICgoaSA8IG51bWxuKSB8fCAoaSA9PSBlbHBsKSkKKwkJICAgIGJ1ZmVvbCA9IGJ1ZmVvbDIgKyAxOworCSAgICB9CisJfQorCVJPU0hfREVCVUcyKCJcbiIpOworCWJ1ZmNudCA9IGJ1ZmVvbCAtIGJ1ZnA7CisJcHJpbnRmKCItLSglZC8lZCBAJWQpXG4iLCBidWZjbnQsIGJ1ZmxlbiwgYnVmcG9zKTsKKwltZW1jcHkoc2NyYnVmLCBidWZwLCBidWZjbnQpOworCXNjcmJ1ZltidWZjbnRdID0gMDsKKwlwcmludGYoIiVzIiwgc2NyYnVmKTsKKwlidWZwID0gYnVmZW9sOworCWJ1ZnBvcyArPSBidWZjbnQ7CisJaWYgKGJ1ZnBvcyA9PSBidWZsZW4pCisJICAgIGJyZWFrOworCWluYyA9IHJvc2hfZ2V0a2V5KCk7CisJbnVtbG4gPSAxOworCXN3aXRjaCAoaW5jKSB7CisJY2FzZSBLRVlfQ1RSTCgnYycpOgorCWNhc2UgJ3EnOgorCWNhc2UgJ1EnOgorCSAgICBidWZwb3MgPSBidWZsZW47CisJICAgIGJyZWFrOworCWNhc2UgJyAnOgorCSAgICBudW1sbiA9IHJvd3MgLSAxOworCX0KKyAgICB9Cit9CQkJCS8qIHJvc2hfbW9yZV9idWYgKi8KKworLyogUGFnZSB0aHJvdWdoIGEgc2luZ2xlIGZpbGUgdXNpbmcgdGhlIG9wZW4gZmlsZSBzdHJlYW0KKyAqCWZkCUZpbGUgRGVzY3JpcHRvcgorICovCit2b2lkIHJvc2hfbW9yZV9mZChpbnQgZmQsIGludCByb3dzLCBpbnQgY29scywgY2hhciAqc2NyYnVmKQoreworICAgIHN0cnVjdCBzdGF0IGZkc3RhdDsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGJ1ZnBvczsKKyAgICBpbnQgbnVtcmQ7CisgICAgRklMRSAqZjsKKworICAgIGZzdGF0KGZkLCAmZmRzdGF0KTsKKyAgICBpZiAoU19JU1JFRyhmZHN0YXQuc3RfbW9kZSkpIHsKKwlidWYgPSBtYWxsb2MoKGludClmZHN0YXQuc3Rfc2l6ZSk7CisJaWYgKGJ1ZiAhPSBOVUxMKSB7CisJICAgIGYgPSBmZG9wZW4oZmQsICJyIik7CisJICAgIGJ1ZnBvcyA9IDA7CisJICAgIG51bXJkID0gZnJlYWQoYnVmLCAxLCAoaW50KWZkc3RhdC5zdF9zaXplLCBmKTsKKwkgICAgd2hpbGUgKG51bXJkID4gMCkgeworCQlidWZwb3MgKz0gbnVtcmQ7CisJCW51bXJkID0gZnJlYWQoYnVmICsgYnVmcG9zLCAxLAorCQkJICAgICAgKChpbnQpZmRzdGF0LnN0X3NpemUgLSBidWZwb3MpLCBmKTsKKwkgICAgfQorCSAgICBmY2xvc2UoZik7CisJICAgIHJvc2hfbW9yZV9idWYoYnVmLCBidWZwb3MsIHJvd3MsIGNvbHMsIHNjcmJ1Zik7CisJfQorICAgIH0gZWxzZSB7CisgICAgfQorCit9CQkJCS8qIHJvc2hfbW9yZV9mZCAqLworCisvKiBQYWdlIHRocm91Z2ggYSBmaWxlIGxpa2UgdGhlIG1vcmUgY29tbWFuZAorICoJYXJnYwlBcmd1bWVudCBDb3VudAorICoJYXJndglBcmd1bWVudCBWYWx1ZXMKKyAqLwordm9pZCByb3NoX21vcmUoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgZmQsIGk7CisvKiAgICBjaGFyIGZpbGVzdHJbUk9TSF9QQVRIX1NaXTsKKyAgICBpbnQgY21kcG9zOyovCisgICAgaW50IHJvd3MsIGNvbHM7CisgICAgY2hhciAqc2NyYnVmOworICAgIGludCByZXQ7CisKKyAgICBST1NIX0RFQlVHX0FSR1ZfVihhcmdjLCBhcmd2KTsKKyAgICByZXQgPSBnZXRzY3JlZW5zaXplKDEsICZyb3dzLCAmY29scyk7CisgICAgaWYgKHJldCkgeworCVJPU0hfREVCVUcoImdldHNjcmVlbnNpemUoKSBmYWlsKCVkKTsgZmFsbCBiYWNrXG4iLCByZXQpOworCVJPU0hfREVCVUcoIlx0Uk9XUz0nJWQnXHRDT0xTPSclZCdcbiIsIHJvd3MsIGNvbHMpOworCS8qIElmIGVpdGhlciBmYWlsLCBnbyB1bmRlciBub3JtYWwgc2l6ZSwganVzdCBpbiBjYXNlICovCisJaWYgKCFyb3dzKQorCSAgICByb3dzID0gMjA7CisJaWYgKCFjb2xzKQorCSAgICBjb2xzID0gNzU7CisgICAgfQorICAgIFJPU0hfREVCVUcoIlx0VVNFIFJPV1M9JyVkJ1x0Q09MUz0nJWQnXG4iLCByb3dzLCBjb2xzKTsKKyAgICAvKiAzMiBiaXQgYWxpZ24gYmVnaW5uaW5nIG9mIHJvdyBhbmQgb3ZlciBhbGxvY2F0ZSAqLworICAgIHNjcmJ1ZiA9IG1hbGxvYyhyb3dzICogKChjb2xzKzMpJihJTlRfTUFYIC0gMykpKTsKKyAgICBpZiAoIXNjcmJ1ZikKKwlyZXR1cm47CisKKyAgICBpZiAoYXJnYykgeworCS8qIFRoZXJlIGlzIG5vIG5lZWQgdG8gbWVzcyB1cCB0aGUgY29uc29sZSBpZiB3ZSBkb24ndCBoYXZlIGEKKwkgICBmaWxlICovCisJcm9zaF9jb25zb2xlX3JhdygpOworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwkgICAgcHJpbnRmKCItLUZpbGUgPSAnJXMnXG4iLCBhcmd2W2ldKTsKKwkgICAgZXJybm8gPSAwOworCSAgICBmZCA9IG9wZW4oYXJndltpXSwgT19SRE9OTFkpOworCSAgICBpZiAoZmQgIT0gLTEpIHsKKwkJcm9zaF9tb3JlX2ZkKGZkLCByb3dzLCBjb2xzLCBzY3JidWYpOworCQljbG9zZShmZCk7CisJICAgIH0gZWxzZSB7CisJCXJvc2hfZXJyb3IoZXJybm8sICJtb3JlIiwgYXJndltpXSk7CisJCWVycm5vID0gMDsKKwkgICAgfQorCX0KKwlyb3NoX2NvbnNvbGVfc3RkKCk7CisgICAgfQorICAgIGZyZWUoc2NyYnVmKTsKK30JCQkJLyogcm9zaF9tb3JlICovCisKKy8qIFBhZ2UgYSBmaWxlIHdpdGggcmV3aW5kCisgKglhcmdjCUFyZ3VtZW50IENvdW50CisgKglhcmd2CUFyZ3VtZW50IFZhbHVlcworICovCit2b2lkIHJvc2hfbGVzcyhpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHByaW50ZigiICBsZXNzIGltcGxlbWVudGVkIGFzIG1vcmUgKGZvciBub3cpXG4iKTsKKyAgICByb3NoX21vcmUoYXJnYywgYXJndik7Cit9CQkJCS8qIHJvc2hfbGVzcyAqLworCisvKiBTaG93IFBXRAorICovCit2b2lkIHJvc2hfcHdkKHZvaWQpCit7CisgICAgY2hhciBwd2RzdHJbUk9TSF9QQVRIX1NaXTsKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKGdldGN3ZChwd2RzdHIsIFJPU0hfUEFUSF9TWikpIHsKKwlwcmludGYoIiVzXG4iLCBwd2RzdHIpOworICAgIH0gZWxzZSB7CisJcm9zaF9lcnJvcihlcnJubywgInB3ZCIsICIiKTsKKwllcnJubyA9IDA7CisgICAgfQorfQkJCQkvKiByb3NoX3B3ZCAqLworCisvKiBSZWJvb3Q7IHVzZSB3YXJtIHJlYm9vdCBpZiBvbmUgb2YgY2VydGFpbiBvcHRpb25zIHNldAorICoJYXJnYwlBcmd1bWVudCBjb3VudAorICoJYXJndglBcmd1bWVudCB2YWx1ZXMKKyAqLwordm9pZCByb3NoX3JlYm9vdChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBydHlwZSA9IDA7CisgICAgaWYgKGFyZ2MpIHsKKwkvKiBGb3Igbm93LCBqdXN0IHVzZSB0aGUgZmlyc3QgKi8KKwlzd2l0Y2ggKGFyZ3ZbMF1bMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICdzJzoKKwljYXNlICd3JzoKKwkgICAgcnR5cGUgPSAxOworCSAgICBicmVhazsKKwljYXNlICctJzoKKwkgICAgc3dpdGNoIChhcmd2WzBdWzFdKSB7CisJICAgIGNhc2UgJzEnOgorCSAgICBjYXNlICdzJzoKKwkgICAgY2FzZSAndyc6CisJCXJ0eXBlID0gMTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBzeXNsaW51eF9yZWJvb3QocnR5cGUpOworfQkJCQkvKiByb3NoX3JlYm9vdCAqLworCisvKiBSdW4gYSBib290IHN0cmluZywgY2FsbGluZyBzeXNsaW51eF9ydW5fY29tbWFuZAorICoJYXJnYwlBcmd1bWVudCBjb3VudAorICoJYXJndglBcmd1bWVudCB2YWx1ZXMKKyAqLwordm9pZCByb3NoX3J1bihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGNoYXIgY21kc3RyW1JPU0hfQ01EX1NaXTsKKyAgICBpbnQgbGVuOworCisgICAgbGVuID0gcm9zaF9hcmdjYXQoY21kc3RyLCBST1NIX0NNRF9TWiwgYXJnYywgYXJndiwgMCk7CisgICAgaWYgKGxlbikgeworCXByaW50ZigiLS1ydW46ICclcydcbiIsIGNtZHN0cik7CisJc3lzbGludXhfcnVuX2NvbW1hbmQoY21kc3RyKTsKKyAgICB9IGVsc2UgeworCXByaW50ZihBUFBfTkFNRSAiOnJ1bjogTm8gYXJndW1lbnRzXG4iKTsKKyAgICB9Cit9CQkJCS8qIHJvc2hfcnVuICovCisKKy8qIFByb2Nlc3MgYW4gYXJnYy9hcmd2IHBhaXIgYW5kIGNhbGwgaGFuZGxpbmcgZnVuY3Rpb24KKyAqCWFyZ2MJQXJndW1lbnQgY291bnQKKyAqCWFyZ3YJQXJndW1lbnQgdmFsdWVzCisgKglpcHdkc3RyCUluaXRpYWwgUHJlc2VudCBXb3JraW5nIERpcmVjdG9yeSBzdHJpbmcKKyAqCXJldHVybnMJV2hldGhlciB0byBleGl0IHByb21wdAorICovCitjaGFyIHJvc2hfY29tbWFuZChpbnQgYXJnYywgY2hhciAqYXJndltdLCBjb25zdCBjaGFyICppcHdkc3RyKQoreworICAgIGNoYXIgZG9fZXhpdCA9IGZhbHNlOworICAgIGludCB0bGVuOworICAgIHRsZW4gPSBzdHJsZW4oYXJndlswXSk7CisgICAgUk9TSF9ERUJVR19BUkdWX1YoYXJnYywgYXJndik7CisgICAgc3dpdGNoIChhcmd2WzBdWzBdKSB7CisgICAgY2FzZSAnZSc6CisgICAgY2FzZSAnRSc6CisgICAgY2FzZSAncSc6CisgICAgY2FzZSAnUSc6CisJc3dpdGNoIChhcmd2WzBdWzFdKSB7CisJY2FzZSAwOgorCWNhc2UgJ3gnOgorCWNhc2UgJ1gnOgorCWNhc2UgJ3UnOgorCWNhc2UgJ1UnOgorCSAgICBpZiAoKHN0cm5jYXNlY21wKCJleGl0IiwgYXJndlswXSwgdGxlbikgPT0gMCkgfHwKKwkJKHN0cm5jYXNlY21wKCJxdWl0IiwgYXJndlswXSwgdGxlbikgPT0gMCkpCisJCWRvX2V4aXQgPSB0cnVlOworCSAgICBlbHNlCisJCXJvc2hfaGVscCgxLCBhcmd2WzBdKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnYyc6CisJY2FzZSAnQyc6CisJICAgIGlmIChzdHJuY2FzZWNtcCgiZWNobyIsIGFyZ3ZbMF0sIHRsZW4pID09IDApCisJCXJvc2hfcHJfYXJndihhcmdjIC0gMSwgJmFyZ3ZbMV0pOworCSAgICBlbHNlCisJCXJvc2hfaGVscCgxLCBhcmd2WzBdKTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgcm9zaF9oZWxwKDEsIGFyZ3ZbMF0pOworCX0KKwlicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICBjYXNlICdDJzoJCQkvKiBydW4gJ2NkJyAnY2F0JyAnY2ZnJyAqLworCXN3aXRjaCAoYXJndlswXVsxXSkgeworCWNhc2UgJ2EnOgorCWNhc2UgJ0EnOgorCSAgICBpZiAoc3RybmNhc2VjbXAoImNhdCIsIGFyZ3ZbMF0sIHRsZW4pID09IDApCisJCXJvc2hfY2F0KGFyZ2MgLSAxLCAmYXJndlsxXSk7CisJICAgIGVsc2UKKwkJcm9zaF9oZWxwKDEsIGFyZ3ZbMF0pOworCSAgICBicmVhazsKKwljYXNlICdkJzoKKwljYXNlICdEJzoKKwkgICAgaWYgKHN0cm5jYXNlY21wKCJjZCIsIGFyZ3ZbMF0sIHRsZW4pID09IDApCisJCXJvc2hfY2QoYXJnYywgYXJndiwgaXB3ZHN0cik7CisJICAgIGVsc2UKKwkJcm9zaF9oZWxwKDEsIGFyZ3ZbMF0pOworCSAgICBicmVhazsKKwljYXNlICdmJzoKKwljYXNlICdGJzoKKwkgICAgaWYgKHN0cm5jYXNlY21wKCJjZmciLCBhcmd2WzBdLCB0bGVuKSA9PSAwKQorCQlyb3NoX2NmZygpOworCSAgICBlbHNlCisJCXJvc2hfaGVscCgxLCBhcmd2WzBdKTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgcm9zaF9oZWxwKDEsIGFyZ3ZbMF0pOworCX0KKwlicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoJCQkvKiBydW4gJ2RpcicgKi8KKwlpZiAoc3RybmNhc2VjbXAoImRpciIsIGFyZ3ZbMF0sIHRsZW4pID09IDApCisJICAgIHJvc2hfZGlyKGFyZ2MgLSAxLCAmYXJndlsxXSk7CisJZWxzZQorCSAgICByb3NoX2hlbHAoMSwgYXJndlswXSk7CisJYnJlYWs7CisgICAgY2FzZSAnaCc6CisgICAgY2FzZSAnSCc6CisgICAgY2FzZSAnPyc6CisJaWYgKChzdHJuY2FzZWNtcCgiaGVscCIsIGFyZ3ZbMF0sIHRsZW4pID09IDApIHx8ICh0bGVuID09IDEpKQorCSAgICByb3NoX2hlbHAoMiwgYXJndlsxXSk7CisJZWxzZQorCSAgICByb3NoX2hlbHAoMSwgTlVMTCk7CisJYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgY2FzZSAnTCc6CQkJLyogcnVuICdscycgJ2xlc3MnICovCisJc3dpdGNoIChhcmd2WzBdWzFdKSB7CisJY2FzZSAwOgorCWNhc2UgJ3MnOgorCWNhc2UgJ1MnOgorCSAgICBpZiAoc3RybmNhc2VjbXAoImxzIiwgYXJndlswXSwgdGxlbikgPT0gMCkKKwkJcm9zaF9scyhhcmdjLCBhcmd2KTsKKwkgICAgZWxzZQorCQlyb3NoX2hlbHAoMSwgYXJndlswXSk7CisJICAgIGJyZWFrOworCWNhc2UgJ2UnOgorCWNhc2UgJ0UnOgorCSAgICBpZiAoc3RybmNhc2VjbXAoImxlc3MiLCBhcmd2WzBdLCB0bGVuKSA9PSAwKQorCQlyb3NoX2xlc3MoYXJnYyAtIDEsICZhcmd2WzFdKTsKKwkgICAgZWxzZQorCQlyb3NoX2hlbHAoMSwgYXJndlswXSk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHJvc2hfaGVscCgxLCBhcmd2WzBdKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgY2FzZSAnTSc6CisJc3dpdGNoIChhcmd2WzBdWzFdKSB7CisJY2FzZSAnYSc6CisJY2FzZSAnQSc6CisJICAgIGlmIChzdHJuY2FzZWNtcCgibWFuIiwgYXJndlswXSwgdGxlbikgPT0gMCkKKwkJcm9zaF9oZWxwKDIsIGFyZ3ZbMV0pOworCSAgICBlbHNlCisJCXJvc2hfaGVscCgxLCBhcmd2WzBdKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnbyc6CisJY2FzZSAnTyc6CisJICAgIGlmIChzdHJuY2FzZWNtcCgibW9yZSIsIGFyZ3ZbMF0sIHRsZW4pID09IDApCisJCXJvc2hfbW9yZShhcmdjIC0gMSwgJmFyZ3ZbMV0pOworCSAgICBlbHNlCisJCXJvc2hfaGVscCgxLCBhcmd2WzBdKTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgcm9zaF9oZWxwKDEsIGFyZ3ZbMF0pOworCX0KKwlicmVhazsKKyAgICBjYXNlICdwJzoKKyAgICBjYXNlICdQJzoJCQkvKiBydW4gJ3B3ZCcgKi8KKwlpZiAoc3RybmNhc2VjbXAoInB3ZCIsIGFyZ3ZbMF0sIHRsZW4pID09IDApCisJICAgIHJvc2hfcHdkKCk7CisJZWxzZQorCSAgICByb3NoX2hlbHAoMSwgYXJndlswXSk7CisJYnJlYWs7CisgICAgY2FzZSAncic6CisgICAgY2FzZSAnUic6CQkJLyogcnVuICdydW4nICovCisJc3dpdGNoIChhcmd2WzBdWzFdKSB7CisJY2FzZSAwOgorCWNhc2UgJ2UnOgorCWNhc2UgJ0UnOgorCSAgICBpZiAoc3RybmNhc2VjbXAoInJlYm9vdCIsIGFyZ3ZbMF0sIHRsZW4pID09IDApCisJCXJvc2hfcmVib290KGFyZ2MgLSAxLCAmYXJndlsxXSk7CisJICAgIGVsc2UKKwkJcm9zaF9oZWxwKDEsIGFyZ3ZbMF0pOworCSAgICBicmVhazsKKwljYXNlICd1JzoKKwljYXNlICdVJzoKKwkgICAgaWYgKHN0cm5jYXNlY21wKCJydW4iLCBhcmd2WzBdLCB0bGVuKSA9PSAwKQorCQlyb3NoX3J1bihhcmdjIC0gMSwgJmFyZ3ZbMV0pOworCSAgICBlbHNlCisJCXJvc2hfaGVscCgxLCBhcmd2WzBdKTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgcm9zaF9oZWxwKDEsIGFyZ3ZbMF0pOworCX0KKwlicmVhazsKKyAgICBjYXNlICd2JzoKKyAgICBjYXNlICdWJzoKKwlpZiAoc3RybmNhc2VjbXAoInZlcnNpb24iLCBhcmd2WzBdLCB0bGVuKSA9PSAwKQorCSAgICByb3NoX3ZlcnNpb24oMSk7CisJZWxzZQorCSAgICByb3NoX2hlbHAoMSwgYXJndlswXSk7CisJYnJlYWs7CisgICAgY2FzZSAwOgorICAgIGNhc2UgJ1xuJzoKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXJvc2hfaGVscCgxLCBhcmd2WzBdKTsKKyAgICB9CQkJCS8qIHN3aXRjaChhcmd2WzBdWzBdKSAqLworICAgIHJldHVybiBkb19leGl0OworfQkJCQkvKiByb3NoX2NvbW1hbmQgKi8KKworLyogUHJvY2VzcyB0aGUgcHJvbXB0IGZvciBjb21tYW5kcyBhcyByZWFkIGZyb20gc3RkaW4gYW5kIGNhbGwgcm9zaF9jb21tYW5kCisgKiB0byBwcm9jZXNzIGNvbW1hbmQgbGluZSBzdHJpbmcKKyAqCWljbWRzdHIJSW5pdGlhbCBjb21tYW5kIGxpbmUgc3RyaW5nCisgKglyZXR1cm5zCUV4aXQgc3RhdHVzCisgKi8KK2ludCByb3NoX3Byb21wdChpbnQgaWFyZ2MsIGNoYXIgKmlhcmd2W10pCit7CisgICAgaW50IHJ2OworICAgIGNoYXIgY21kc3RyW1JPU0hfQ01EX1NaXTsKKyAgICBjaGFyIGlwd2RzdHJbUk9TSF9QQVRIX1NaXTsKKyAgICBjaGFyIGRvX2V4aXQ7CisgICAgY2hhciAqKmFyZ3Y7CisgICAgaW50IGFyZ2M7CisKKyAgICBydiA9IDA7CisgICAgZG9fZXhpdCA9IGZhbHNlOworICAgIGlmICghZ2V0Y3dkKGlwd2RzdHIsIFJPU0hfUEFUSF9TWikpCisJc3RyY3B5KGlwd2RzdHIsICIuLyIpOworICAgIGlmIChpYXJnYyA+IDEpCisJZG9fZXhpdCA9IHJvc2hfY29tbWFuZChpYXJnYyAtIDEsICZpYXJndlsxXSwgaXB3ZHN0cik7CisgICAgd2hpbGUgKCEoZG9fZXhpdCkpIHsKKwkvKiBFeHRyYSBwcmVjZWVkaW5nIG5ld2xpbmUgKi8KKwlwcmludGYoIlxucm9zaDogIik7CisJLyogUmVhZCBhIGxpbmUgZnJvbSBjb25zb2xlICovCisJaWYgKGZnZXRzKGNtZHN0ciwgUk9TSF9DTURfU1osIHN0ZGluKSkgeworCSAgICBhcmdjID0gcm9zaF9zdHIyYXJndigmYXJndiwgY21kc3RyKTsKKwkgICAgZG9fZXhpdCA9IHJvc2hfY29tbWFuZChhcmdjLCBhcmd2LCBpcHdkc3RyKTsKKwkgICAgcm9zaF9mcmVlX2FyZ3YoJmFyZ3YpOworCX0gZWxzZSB7CisJICAgIGRvX2V4aXQgPSBmYWxzZTsKKwl9CisgICAgfQorICAgIHJldHVybiBydjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgcnY7CisKKyAgICAvKiBJbml0aWFsaXphdGlvbiAqLworICAgIHJ2ID0gMDsKKyAgICByb3NoX2NvbnNvbGVfc3RkKCk7CisgICAgaWYgKGFyZ2MgPT0gMSkgeworCXJvc2hfdmVyc2lvbigwKTsKKwlwcmludF9iZXRhKCk7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBET19ERUJVRworCWNoYXIgY21kc3RyW1JPU0hfQ01EX1NaXTsKKwlyb3NoX2FyZ2NhdChjbWRzdHIsIFJPU0hfQ01EX1NaLCBhcmdjLCBhcmd2LCAxKTsKKwlST1NIX0RFQlVHKCJhcmc9JyVzJ1xuIiwgY21kc3RyKTsKKyNlbmRpZgorICAgIH0KKyAgICBydiA9IHJvc2hfcHJvbXB0KGFyZ2MsIGFyZ3YpOworICAgIHByaW50ZigiLS1FeGl0aW5nICciIEFQUF9OQU1FICInXG4iKTsKKyAgICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9yb3NoL3Jvc2guaCBiL2NvbTMyL3Jvc2gvcm9zaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWE5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9yb3NoL3Jvc2guaApAQCAtMCwwICsxLDI4MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDgtMjAwOSBHZW5lIEN1bW0gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHJvc2guaAorICoKKyAqIFJlYWQtT25seSBzaGVsbDsgSGVhZGVyCisgKi8KKworLyoKKyAqIEhpc3RvcnkKKyAqIGIwMzQJSW1wcm92ZSBkZWJ1ZyBmdW5jdGlvbnMgdG8gc2ltcGxlciBjb2RlCisgKiBiMDIxCU1vdmUgbXVjaCBQcmVQcm9jZXNzaW5nIHN0dWZmIHRvIHJvc2guaAorICogYjAxOAlDcmVhdGUgcm9zaF9kZWJ1ZygpIG1hY3JvCisgKiBiMDEyCVZlcnNpb24gb2Ygcm9zaC5jIGF0IHRpbWUgb2YgY3JlYXRpbmcgdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgUk9TSF9ICisjZGVmaW5lIFJPU0hfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CQkvKiBtYWNybzogdHJ1ZSBmYWxzZSAqLworI2luY2x1ZGUgPHN0cmluZy5oPgkJLyogc3RyY3B5KCkgc3RybGVuKCkgbWVtY3B5KCkgc3RyY2hyKCkgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgkJLyogZnN0YXQoKSAqLworI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBvcGVuKCk7IG9wZW4gbW9kZSBtYWNyb3MgKi8KKyNpbmNsdWRlIDxkaXJlbnQuaD4JCS8qIGZkb3BlbmRpcigpIG9wZW5kaXIoKSByZWFkZGlyKCkgY2xvc2VkaXIoKSBESVIgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4JCS8qIGdldGN3ZCgpIGdldG9wdCgpICovCisjaW5jbHVkZSA8ZXJybm8uaD4JCS8qIGVycm5vOyBlcnJvciBtYWNyb3MgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CQkvKiBGb3IgaHRvbmwvbnRvaGwvaHRvbnMvbnRvaHMgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgkJLyogaXNzcGFjZSgpICovCisKKyNpbmNsdWRlIDxnZXRrZXkuaD4KKyNpbmNsdWRlIDxjb25zb2xlcy5oPgkJLyogY29uc29sZV9hbnNpX3JhdygpIGNvbnNvbGVfYW5zaV9zdGQoKSAqLworLy8gI2luY2x1ZGUgPGdldG9wdC5oPgkJLyogZ2V0b3B0X2xvbmcoKSAqLworCisjaWZkZWYgRE9fREVCVUcKKyMgZGVmaW5lIFJPU0hfREVCVUcJcHJpbnRmCisjIGRlZmluZSBST1NIX0RFQlVHX0FSR1ZfVglyb3NoX3ByX2FyZ3ZfdgorLyogZGVmaW5lIFJPU0hfREVCVUcoZiwgLi4uKQlwcmludGYgKGYsICMjIF9fVkFfQVJHU19fKSAqLworIyBpZmRlZiBET19ERUJVRzIKKyMgIGRlZmluZSBST1NIX0RFQlVHMglwcmludGYKKyMgIGRlZmluZSBST1NIX0RFQlVHMl9BUkdWX1YJcm9zaF9wcl9hcmd2X3YKKyMgZWxzZSAvKiBET19ERUJVRzIgKi8KKwkvKiBUaGlzIGZvcmNlcyBhIGZvcm1hdCBhcmd1bWVudCBpbnRvIHRoZSBmdW5jdGlvbiBjYWxsICovCisjICBkZWZpbmUgUk9TSF9ERUJVRzIoZiwgLi4uKQkoKHZvaWQpMCkKKyMgIGRlZmluZSBST1NIX0RFQlVHMl9BUkdWX1YoYXJnYywgYXJndikJKCh2b2lkKTApCisjIGVuZGlmCS8qIERPX0RFQlVHMiAqLworI2Vsc2UgLyogRE9fREVCVUcgKi8KKyMgZGVmaW5lIFJPU0hfREVCVUcoZiwgLi4uKQkoKHZvaWQpMCkKKyMgZGVmaW5lIFJPU0hfREVCVUdfQVJHVl9WKGFyZ2MsIGFyZ3YpCSgodm9pZCkwKQorIyBkZWZpbmUgUk9TSF9ERUJVRzIoZiwgLi4uKQkoKHZvaWQpMCkKKyMgZGVmaW5lIFJPU0hfREVCVUcyX0FSR1ZfVihhcmdjLCBhcmd2KQkoKHZvaWQpMCkKKyNlbmRpZiAvKiBET19ERUJVRyAqLworI2RlZmluZSBST1NIX0RFQlVHMl9TVEFUKGYsIC4uLikJKCh2b2lkKTApCisvLyAjZGVmaW5lIFJPU0hfREVCVUcyX1NUQVQJUk9TSF9ERUJVRzIKKworI2lmZGVmIF9fQ09NMzJfXworI2RlZmluZSBST1NIX0lTX0NPTTMyCTEKKyNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiBvcGVuY29uc29sZSgpICovCisjaW5jbHVkZSA8c3lzbGludXgvY29uZmlnLmg+CS8qIEhhcyBpbmZvIG9uIHRoZSBTWVNMSU5VWCB2YXJpYW50ICovCisjaW5jbHVkZSA8c3lzbGludXgvYm9vdC5oPgkvKiBzeXNsaW51eF9ydW5fY29tbWFuZCgpICovCisjaW5jbHVkZSA8c3lzbGludXgvcmVib290Lmg+CisjZGVmaW5lIFJPU0hfQ09NMzIoZiwgLi4uKQlwcmludGYgKGYsICMjIF9fVkFfQVJHU19fKQorI2RlZmluZSByb3NoX2NvbnNvbGVfc3RkKCkJCWNvbnNvbGVfYW5zaV9zdGQoKQorI2RlZmluZSByb3NoX2NvbnNvbGVfcmF3KCkJCWNvbnNvbGVfYW5zaV9yYXcoKQorCitpbnQgc3RhdChjb25zdCBjaGFyICpwYXRobmFtZSwgc3RydWN0IHN0YXQgKmJ1ZikKK3sKKyAgICBpbnQgZmQsIHN0YXR1cywgcmV0ID0gLTE7CisgICAgRElSICpkOworCisgICAgUk9TSF9ERUJVRzJfU1RBVCgic3RhdDpvcGVuZGlyKCVzKSAiLCBwYXRobmFtZSk7CisgICAgZCA9IG9wZW5kaXIocGF0aG5hbWUpOworICAgIGlmIChkICE9IE5VTEwpIHsKKwlST1NIX0RFQlVHMl9TVEFUKCJzdGF0OmNsb3NlZGlyKCkgIik7CisJY2xvc2VkaXIoZCk7CisJcmV0ID0gMDsKKwlidWYtPnN0X21vZGUgPSBTX0lGRElSIHwgMDU1NTsKKwlidWYtPnN0X3NpemUgPSAwOworICAgIH0gZWxzZSBpZiAoKGVycm5vID09IDApIHx8IChlcnJubyA9PSBFTk9FTlQpIHx8IChlcnJubyA9PSBFTk9URElSKSkgeworCVJPU0hfREVCVUcyX1NUQVQoIiglZClzdGF0Om9wZW4oKSAiLCBlcnJubyk7CisJZmQgPSBvcGVuKHBhdGhuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkICE9IC0xKSB7CisJICAgIFJPU0hfREVCVUcyX1NUQVQoIiglZClzdGF0OmZzdGF0KCkgIiwgZmQpOworCSAgICBzdGF0dXMgPSBmc3RhdChmZCwgYnVmKTsKKwkgICAgKHZvaWQpc3RhdHVzOworCSAgICBST1NIX0RFQlVHMl9TVEFUKCJzdGF0OmNsb3NlKCkgIik7CisJICAgIGNsb3NlKGZkKTsKKwkgICAgcmV0ID0gMDsKKwl9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCByb3NoX2dldF9lbnZfdmVyKGNoYXIgKmRlc3QsIHNpemVfdCBuKQoreworICAgIGNvbnN0IHN0cnVjdCBzeXNsaW51eF92ZXJzaW9uICpzbHYgPSBzeXNsaW51eF92ZXJzaW9uKCk7CisgICAgc3RybmNweShkZXN0LCBzbHYtPnZlcnNpb25fc3RyaW5nLCBuKTsKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UKKyMgIGluY2x1ZGUgPHRlcm1pb3MuaD4KKyMgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyAgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyMgIGRlZmluZSBST1NIX0lTX0NPTTMyCTAKKworc3RhdGljIGlubGluZSBjaGFyICpzeXNsaW51eF9jb25maWdfZmlsZSh2b2lkKQoreworICAgIHJldHVybiAiIjsKK30KKworaW50IHJvc2hfZ2V0X2Vudl92ZXIoY2hhciAqZGVzdCwgc2l6ZV90IG4pCit7CisgICAgaW50IHJldCwgbGVuOworICAgIHN0cnVjdCB1dHNuYW1lIGVudjsKKyAgICByZXQ9IHVuYW1lKCZlbnYpOworICAgIGlmIChyZXQgPj0gMCkgeworCXN0cm5jcHkoZGVzdCwgZW52LnN5c25hbWUsIG4pOworCWxlbiA9IHN0cmxlbihkZXN0KTsKKwlzdHJuY3B5KGRlc3QgKyBsZW4sICIgIiwgKG4gLSBsZW4pKTsKKwlsZW4gPSBzdHJsZW4oZGVzdCk7CisJc3RybmNweShkZXN0ICsgbGVuLCBlbnYucmVsZWFzZSwgKG4gLSBsZW4pKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0c2NyZWVuc2l6ZShpbnQgZmQsIGludCAqcm93cywgaW50ICpjb2xzKQoreworICAgIGNoYXIgKnN0cjsKKyAgICBpbnQgcnY7CisgICAgc3RydWN0IHdpbnNpemUgd3M7CisgICAgaWYgKHJvd3MpCisJKnJvd3MgPSAwOworICAgIGlmIChjb2xzKQorCSpjb2xzID0gMDsKKyAgICBzdHIgPSBOVUxMOworICAgIGlmIChmZCA9PSAxKSB7CisJaW9jdGwoMCwgVElPQ0dXSU5TWiwgJndzKTsKKwlpZiAocm93cykKKwkgICAgKnJvd3MgPSB3cy53c19yb3c7CisJaWYgKGNvbHMpCisJICAgICpjb2xzID0gd3Mud3NfY29sOworCWlmIChyb3dzICYmICEqcm93cykgeworCSAgICBzdHIgPSBnZXRlbnYoIkxJTkVTIik7CisJICAgIGlmIChzdHIpCisJCSpyb3dzID0gYXRvaShzdHIpOworCX0KKwlpZiAoY29scyAmJiAhKmNvbHMpIHsKKwkgICAgc3RyID0gZ2V0ZW52KCJDT0xVTU5TIik7CisJICAgIGlmIChzdHIpCisJCSpjb2xzID0gYXRvaShzdHIpOworCX0KKyAgICB9CisgICAgaWYgKCFyb3dzIHx8ICFjb2xzKQorCXJ2ID0gLTE7CisgICAgZWxzZSBpZiAoISpyb3dzIHx8ICEqY29scykKKwlydiA9IC0yOworICAgIGVsc2UKKwlydiA9IDA7CisgICAgcmV0dXJuIHJ2OworfQorCisvKgorICogU3dpdGNoZXMgY29uc29sZSBvdmVyIHRvIHJhdyBpbnB1dCBtb2RlLiAgQWxsb3dzIGdldF9rZXkgdG8gZ2V0IGp1c3QKKyAqIDEga2V5IHNlcXVlbmNlICh3aXRob3V0IGRlbGF5IG9yIGRpc3BsYXkpCisgKi8KK3ZvaWQgcm9zaF9jb25zb2xlX3Jhdyh2b2lkKQoreworICAgIHN0cnVjdCB0ZXJtaW9zIHRpbzsKKworICAgIGNvbnNvbGVfYW5zaV9yYXcoKTsJCS8qIEFsbG93cyBnZXRfa2V5IHRvIGdldCBqdXN0IDEga2V5IHNlcXVlbmNlCisJCQkJICAgKHcvbyBkZWxheSBvciBkaXNwbGF5ICovCisgICAgLyogRGVhbCB3aXRoIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZW4ndCBiZWVuIHJlcGxpY2F0ZWQgdG8gYW5zaXJhdy5jICovCisgICAgdGNnZXRhdHRyKDAsICZ0aW8pOworICAgIHRpby5jX2lmbGFnICY9IH5JR05DUjsKKyAgICB0Y3NldGF0dHIoMCwgVENTQUZMVVNILCAmdGlvKTsKK30KKworLyoKKyAqIFN3aXRjaGVzIGJhY2sgdG8gc3RhbmRhcmQgZ2V0bGluZSBtb2RlLgorICovCit2b2lkIHJvc2hfY29uc29sZV9zdGQodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGVybWlvcyB0aW87CisKKyAgICBjb25zb2xlX2Fuc2lfc3RkKCk7CisgICAgdGNnZXRhdHRyKDAsICZ0aW8pOworICAgIHRpby5jX2lmbGFnIHw9IElDUk5MOworICAgIHRpby5jX2lmbGFnICY9IH5JR05DUjsKKyAgICB0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRpbyk7Cit9CisKK3ZvaWQgc3lzbGludXhfcmVib290KGludCB3YXJtKQoreworICAgIHByaW50ZigiVGVzdCBSZWJvb3QoJWQpXG4iLCB3YXJtKTsKK30KKworI2RlZmluZSBST1NIX0NPTTMyKGYsIC4uLikJKCh2b2lkKTApCisjZGVmaW5lIHN5c2xpbnV4X3J1bl9jb21tYW5kKGYpCSgodm9pZCkwKQorI2VuZGlmIC8qIF9fQ09NMzJfXyAqLworCisjZGVmaW5lIFNFUAknLycKKworLyogU2l6ZSBvZiBidWZmZXIgc3RyaW5nICovCisjZGVmaW5lIFJPU0hfQlVGX1NaCTE2Mzg0CisvKiBTaXplIG9mIHNjcmVlbiBvdXRwdXQgYnVmZmVyICg4MCo0MCkgLy9IRVJFICovCisjZGVmaW5lIFJPU0hfU0JVRl9TWgkoKDgwICsgMikgKiA0MCkKKworLyogU2l6ZSBvZiBjb21tYW5kIGJ1ZmZlciBzdHJpbmcgKi8KKyNpZmRlZiBNQVhfQ01ETElORV9MRU4KKyMgIGRlZmluZSBST1NIX0NNRF9TWgkJTUFYX0NNRExJTkVfTEVOCisjZWxpZiBDT01NQU5EX0xJTkVfU0laRQorIyAgZGVmaW5lIFJPU0hfQ01EX1NaCQlDT01NQU5EX0xJTkVfU0laRQorI2Vsc2UKKyMgIGRlZmluZSBST1NIX0NNRF9TWl9MRzIJMTIKKyMgIGRlZmluZSBST1NIX0NNRF9TWgkJKDEgPDwgUk9TSF9DTURfU1pfTEcyKQorI2VuZGlmIC8qIE1BWF9DTURMSU5FX0xFTiAqLworCisvKiBTaXplIG9mIHBhdGggYnVmZmVyIHN0cmluZyAqLworI2lmZGVmIFBBVEhfTUFYCisjICBkZWZpbmUgUk9TSF9QQVRIX1NaCQlQQVRIX01BWAorI2VsaWYgTkFNRV9NQVgKKyMgIGRlZmluZSBST1NIX1BBVEhfU1oJCU5BTUVfTUFYCisjZWxpZiBGSUxFTkFNRV9NQVgKKyMgIGRlZmluZSBST1NIX1BBVEhfU1oJCUZJTEVOQU1FX01BWAorI2Vsc2UKKyMgIGRlZmluZSBST1NIX1BBVEhfU1pfTEcyCTgKKyMgIGRlZmluZSBST1NIX1BBVEhfU1oJCSgxIDw8IFJPU0hfUEFUSF9TWl9MRzIpCisjZW5kaWYgLyogUEFUSF9NQVggKi8KKworI2RlZmluZSBST1NIX09QVF9TWgk4CisKK2NvbnN0IGNoYXIgcm9zaF9iZXRhX3N0cltdID0KKyAgICAiICBST1NIIGlzIGN1cnJlbnRseSBiZXRhLiAgQ29uc3RydWN0aXZlIGZlZWRiYWNrIGlzIGFwcHJlY2lhdGVkIjsKKworY29uc3QgY2hhciByb3NoX2NkX25vcnVuX3N0cltdID0KKyAgICAiIC0tIGNkIChDaGFuZ2UgRGlyZWN0b3J5KSBub3QgaW1wbGVtZW50ZWQgZm9yIHVzZSB3aXRoIHJ1biBhbmQgZXhpdC5cbiI7CisKK2NvbnN0IGNoYXIgcm9zaF9oZWxwX2NkX3N0cltdID0gImNkICAgIENoYW5nZSBkaXJlY3RvcnlcblwKKyAgIHdpdGggbm8gYXJndW1lbnQsIHJldHVybiB0byBvcmlnaW5hbCBkaXJlY3RvcnkgZnJvbSBlbnRyeSB0byByb3NoXG5cCisgICB3aXRoIG9uZSBhcmd1bWVudCwgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IjsKKworY29uc3QgY2hhciByb3NoX2hlbHBfbHNfc3RyW10gPSAibHMgICAgTGlzdCBjb250ZW50cyBvZiBjdXJyZW50IGRpcmVjdG9yeVxuXAorICAtbCAgTG9uZyBmb3JtYXRcblwKKyAgLWkgIElub2RlOyBwcmludCBJbm9kZSBvZiBmaWxlXG5cCisgIC1GICBDbGFzc2lmeTsgQWRkIGEgMS1jaGFyYWN0ZXIgc3VmZml4IHRvIGNsYXNzaWZ5IGZpbGVzIjsKKworY29uc3QgY2hhciByb3NoX2hlbHBfc3RyMVtdID0KKyAgICAiQ29tbWFuZHM6ID8gY2F0IGNkIGNmZyBkaXIgZXhpdCBoZWxwIGxlc3MgbHMgbWFuIG1vcmUgcHdkIHJ1biBxdWl0IHZlciI7CisKK2NvbnN0IGNoYXIgcm9zaF9oZWxwX3N0cjJbXSA9CisgICAgIkNvbW1hbmRzOiAoc2hvcnQgZ2VuZXJhbGx5IG5vbi1hbWJpZ3VvdXMgYWJyZXZpYXRpb25zIGFyZSBhbHNvIGFsbG93ZWQpXG5cCisgIGggICAgIEhFTFBcbiAgICAgQUxTTyA/IGhlbHAgbWFuXG4gICAgIEFMU08gaGVscCA8Y29tbWFuZD5cblwKKyAgY2F0ICAgQ29uY2F0ZW5hdGUgZmlsZSB0byBjb25zb2xlXG4gICAgY2F0IDxmaWxlPlxuXAorICBjZCAgICBDaGFuZ2UgdG8gZGlyZWN0b3J5IDxkaXI+XG4gICAgY2QgPGRpcj5cblwKKyAgbGVzcyAgUGFnZSBhIGZpbGUgd2l0aCByZXdpbmRcblwKKyAgbHMgICAgTGlzdCBjb250ZW50cyBvZiBjdXJyZW50IGRpcmVjdG9yeVxuICAgIGxzIDxkaXI+XG5cCisgICAgQUxTTyBsIGRpclxuXAorICBtb3JlICBQYWdlIGEgZmlsZVxuXAorICBwd2QgICBkaXNwbGF5IFByZXNlbnQgV29ya2luZyBEaXJlY3RvcnlcblwKKyAgcnVuICAgUnVuIGEgcHJvZ3JhbS9rZXJuZWwgd2l0aCBvcHRpb25zXG5cCisgIHIgICAgIFJlYm9vdCAoaWYgQ09NMzIpXG4gICAgICAgIEFsc28gcmVib290XG5cCisgIGV4aXQgIEV4aXQgdG8gcHJldmlvdXMgZW52aXJvbm1lbnRcbiAgICBBTFNPIHF1aXQiOworCitjb25zdCBjaGFyIHJvc2hfaGVscF9zdHJfYWR2W10gPSAiTm8gYWRkaXRpb25hbCBoZWxwIGF2YWlsYWJsZSBmb3IgJyVzJyI7CisKK2NvbnN0IGNoYXIgcm9zaF9sc19vcHRfc3RyW10gPSAibEZpIjsKKworI2VuZGlmIC8qIE5vdCBST1NIX0ggKi8KZGlmZiAtLWdpdCBhL2NvbTMyL3NhbXBsZXMvTWFrZWZpbGUgYi9jb20zMi9zYW1wbGVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTk2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9zYW1wbGVzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDAgQEAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMjAwMS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIyBzYW1wbGVzIGZvciBzeXNsaW51eCB1c2VycworIyMKKworTElCUyA9ICQob2JqZGlyKS9jb20zMi9saWJ1dGlsL2xpYnV0aWwuYzMyCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvZWxmLm1rCisKK2FsbDoJaGVsbG8uYzMyIHJlc29sdi5jMzIgc2VyaWFsaW5mby5jMzIgXAorCQlsb2NhbGJvb3QuYzMyIFwKKwkJZmFuY3loZWxsby5jMzIgZmFuY3loZWxsby5sbnggXAorCQlrZXl0ZXN0LmMzMiBrZXl0ZXN0LmxueCBcCisJCWFkdmR1bXAuYzMyIGVudHJ5ZHVtcC5jMzIKKwordGlkeSBkaXN0OgorCXJtIC1mICoubyAqLmxvICouYSAqLmxzdCAqLmVsZiAuKi5kICoudG1wCisKK2NsZWFuOiB0aWR5CisJcm0gLWYgKi5sbngKKworc3BvdGxlc3M6IGNsZWFuCisJcm0gLWYgKi5sc3MgKi5jMzIgKi5jb20KKwlybSAtZiAqfiBcIyoKKworaW5zdGFsbDoJIyBEb24ndCBpbnN0YWxsIHNhbXBsZXMKKworLWluY2x1ZGUgLiouZApkaWZmIC0tZ2l0IGEvY29tMzIvc2FtcGxlcy9hZHZkdW1wLmMgYi9jb20zMi9zYW1wbGVzL2FkdmR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2ZlODM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvc2FtcGxlcy9hZHZkdW1wLmMKQEAgLTAsMCArMSw1OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYWR2ZHVtcC5jCisgKgorICogRHVtcCB0aGUgY29udGVudHMgb2YgdGhlIHN5c2xpbnV4IEFEVgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9hZHYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IG1haW4odm9pZCkKK3sKKyAgICB1aW50OF90ICpwLCAqZXA7CisgICAgc2l6ZV90IHMgPSBzeXNsaW51eF9hZHZfc2l6ZSgpOworICAgIGNoYXIgYnVmWzI1Nl07CisKKyNpZiAwCisJLyogdGhpcyBoYW5ncyEgKi8KKyAgICBvcGVuY29uc29sZSgmZGV2X3N0ZGNvbl9yLCAmZGV2X3N0ZGNvbl93KTsKKyNlbHNlCisJLyogdGhpcyB3b3JrcyAqLworICAgIG9wZW5jb25zb2xlKCZkZXZfcmF3Y29uX3IsICZkZXZfYW5zaXNlcmlhbF93KTsKKyNlbmRpZgorCisgICAgcCA9IHN5c2xpbnV4X2Fkdl9wdHIoKTsKKworICAgIHByaW50ZigiQURWIHNpemU6ICV6ZCBieXRlcyBhdCAlcFxuIiwgcywgcCk7CisKKyAgICBlcCA9IHAgKyBzOwkJCS8qIE5lZWQgYXQgbGVhc3Qgb3Bjb2RlK2xlbiAqLworICAgIHdoaWxlIChwIDwgZXAgLSAxICYmICpwKSB7CisJaW50IHQgPSAqcCsrOworCWludCBsID0gKnArKzsKKworCWlmIChwICsgbCA+IGVwKQorCSAgICBicmVhazsKKworCW1lbWNweShidWYsIHAsIGwpOworCWJ1ZltsXSA9ICdcMCc7CisKKwlwcmludGYoIkFEViAlM2Q6IFwiJXNcIlxuIiwgdCwgYnVmKTsKKworCXAgKz0gbDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL3NhbXBsZXMvZW50cnlkdW1wLmMgYi9jb20zMi9zYW1wbGVzL2VudHJ5ZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTY4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9zYW1wbGVzL2VudHJ5ZHVtcC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGVudHJ5LmMKKyAqCisgKiBEdW1wIHRoZSBlbnRyeSBwb2ludCByZWdpc3RlcnMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKworc3RydWN0IHN0YWNrX2ZyYW1lIHsKKyAgICB1aW50MTZfdCBncywgZnMsIGVzLCBkczsKKyAgICB1aW50MzJfdCBlZGksIGVzaSwgZWJwLCBlc3A7CisgICAgdWludDMyX3QgZWJ4LCBlZHgsIGVjeCwgZWF4OworICAgIHVpbnQzMl90IGVmbGFnczsKKyAgICB1aW50MTZfdCByZXRfaXAsIHJldF9jczsKKyAgICB1aW50MTZfdCBweGVfaXAsIHB4ZV9jczsKK307CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgY29uc3QgdW5pb24gc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvICpkaTsKKyAgICBjb25zdCBzdHJ1Y3Qgc3RhY2tfZnJhbWUgKnNmOworCisjaWYgMAorCS8qIHRoaXMgaGFuZ3MhICovCisgICAgb3BlbmNvbnNvbGUoJmRldl9udWxsX3IsICZkZXZfc3RkY29uX3cpOworI2Vsc2UKKwkvKiB0aGlzIHdvcmtzICovCisgICAgb3BlbmNvbnNvbGUoJmRldl9yYXdjb25fciwgJmRldl9hbnNpc2VyaWFsX3cpOworI2VuZGlmCisKKyAgICBkaSA9IHN5c2xpbnV4X2Rlcml2YXRpdmVfaW5mbygpOworCisgICAgaWYgKGRpLT5jLmZpbGVzeXN0ZW0gIT0gU1lTTElOVVhfRlNfUFhFTElOVVgpIHsKKwlwcmludGYoIk5vdCBydW5uaW5nIHVuZGVyIFBYRUxJTlVYIChmcyA9ICUwMngpXG4iLCBkaS0+Yy5maWxlc3lzdGVtKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBzZiA9IChjb25zdCBzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilkaS0+cHhlLnN0YWNrOworCisgICAgcHJpbnRmKCJFQVg6ICUwOHggIEVCWDogJTA4eCAgRUNYOiAlMDh4ICBFRFg6ICUwOHhcbiIKKwkgICAiRVNQOiAlMDh4ICBFQlA6ICUwOHggIEVTSTogJTA4eCAgRURJOiAlMDh4XG4iCisJICAgIlNTOiAlMDR4ICAgRFM6ICUwNHggICBFUzogJTA0eCAgIEZTOiAlMDR4ICAgR1M6ICAlMDR4XG4iCisJICAgIkVGTEFHUzogJTA4eCAgIFJFVDogJTA0eDolMDR4ICAgUFhFOiAlMDR4OiUwNHhcbiIsCisJICAgc2YtPmVheCwgc2YtPmVieCwgc2YtPmVjeCwgc2YtPmVkeCwKKwkgICBzZi0+ZXNwICsgNCwgc2YtPmVicCwgc2YtPmVzaSwgc2YtPmVkaSwKKwkgICBkaS0+cnIuci5mcywgc2YtPmRzLCBzZi0+ZXMsIHNmLT5mcywgc2YtPmdzLAorCSAgIHNmLT5lZmxhZ3MsIHNmLT5yZXRfY3MsIHNmLT5yZXRfaXAsIHNmLT5weGVfY3MsIHNmLT5weGVfaXApOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9zYW1wbGVzL2ZhbmN5aGVsbG8uYyBiL2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MGJmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9zYW1wbGVzL2ZhbmN5aGVsbG8uYwpAQCAtMCwwICsxLDQyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGZhbmN5aGVsbG8uYworICoKKyAqIEhlbGxvLCBXb3JsZCEgdXNpbmcgbGliY29tMzIgYW5kIEFOU0kgY29uc29sZTsgYWxzbyBwb3NzaWJsZSB0byBjb21waWxlCisgKiBhcyBhIExpbnV4IGFwcGxpY2F0aW9uIGZvciB0ZXN0aW5nLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Y29uc29sZXMuaD4JCS8qIFByb3ZpZGVkIGJ5IGxpYnV0aWwgKi8KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKworICAgIGNvbnNvbGVfYW5zaV9zdGQoKTsKKworICAgIHByaW50ZigiXDAzM1sxOzMzOzQ0bSAqKiogXDAzM1szN21IZWxsbywgV29ybGQhXDAzM1szM20gKioqIFwwMzNbMG1cbiIpOworCisgICAgZm9yICg7OykgeworCXByaW50ZigiXDAzM1sxOzM2bT5cMDMzWzBtICIpOworCWZnZXRzKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgc3RkaW4pOworCWlmICghc3RybmNtcChidWZmZXIsICJleGl0IiwgNCkpCisJICAgIGJyZWFrOworCXByaW50ZigiXDAzM1sxbTpcMDMzWzBtICVzIiwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb20zMi9zYW1wbGVzL2hlbGxvLmMgYi9jb20zMi9zYW1wbGVzL2hlbGxvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkNGQyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3NhbXBsZXMvaGVsbG8uYwpAQCAtMCwwICsxLDI2IEBACisvKgorICogaGVsbG8uYyAtIEEgc2ltcGxlIEVMRiBtb2R1bGUgdGhhdCBzb3J0cyBhIGNvdXBsZSBvZiBudW1iZXJzCisgKgorICogIENyZWF0ZWQgb246IEF1ZyAxMSwgMjAwOAorICogICAgICBBdXRob3I6IFN0ZWZhbiBCdWN1ciA8c3RlZmFuYkB6eXRvci5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzb3J0LmgiCisKKyNkZWZpbmUgTlVNX0NPVU5UCQkxMAorI2RlZmluZSBNQVhfTlVNCQkJMTAwCisKK2ludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCkKK3sKKyAgICBpbnQgKm51bXMgPSBOVUxMOworCisgICAgbnVtcyA9IG1hbGxvYyhOVU1fQ09VTlQgKiBzaXplb2YoaW50KSk7CisgICAgcHJpbnRmKCJIZWxsbywgd29ybGQsIGZyb20gMHglMDhYISBtYWxsb2MgcmV0dXJuICVwXG4iLCAodW5zaWduZWQgaW50KSZtYWluLCBudW1zKTsKKworICAgIGZyZWUobnVtcyk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5jIGIvY29tMzIvc2FtcGxlcy9rZXl0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljMDQxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGtleXRlc3QuYworICoKKyAqIFRlc3QgdGhlIGtleSBwYXJzaW5nIGxpYnJhcnkKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisKKyNpbmNsdWRlIDxjb25zb2xlcy5oPgkJLyogUHJvdmlkZWQgYnkgbGlidXRpbCAqLworI2luY2x1ZGUgPGdldGtleS5oPgorCitzdGF0aWMgdm9pZCBjb29rZWRfa2V5cyh2b2lkKQoreworICAgIGludCBrZXk7CisKKyAgICBwcmludGYoIltjb29rZWRdIik7CisKKyAgICBmb3IgKDs7KSB7CisJa2V5ID0gZ2V0X2tleShzdGRpbiwgMCk7CisKKwlpZiAoa2V5ID09IDB4MDMpIHsKKwkgICAgcHJpbnRmKCJbZG9uZV1cbiIpOworCSAgICBleGl0KDApOworCX0gZWxzZSBpZiAoa2V5ID09ICchJykKKwkgICAgcmV0dXJuOworCisJaWYgKGtleSA+PSAweDIwICYmIGtleSA8IDB4MTAwKSB7CisJICAgIHB1dGNoYXIoa2V5KTsKKwl9IGVsc2UgeworCSAgICBwcmludGYoIlslcywlMDR4XSIsIGtleV9jb2RlX3RvX25hbWUoa2V5KSwga2V5KTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByYXdfa2V5cyh2b2lkKQoreworICAgIGludCBrZXk7CisKKyAgICBwcmludGYoIltyYXddIik7CisKKyAgICBmb3IgKDs7KSB7CisJa2V5ID0gZ2V0YyhzdGRpbik7CisKKwlpZiAoa2V5ID09IDB4MDMpIHsKKwkgICAgcHJpbnRmKCJbZG9uZV1cbiIpOworCSAgICBleGl0KDApOworCX0gZWxzZSBpZiAoa2V5ID09ICchJykKKwkgICAgcmV0dXJuOworCisJaWYgKGtleSAhPSBFT0YpCisJICAgIHByaW50ZigiPCUwMng+Iiwga2V5KTsKKyAgICB9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgY29uc29sZV9hbnNpX3JhdygpOworCisgICAgcHJpbnRmKCJDTEtfVENLID0gJWRcbiIsIChpbnQpQ0xLX1RDSyk7CisgICAgcHJpbnRmKCJQcmVzcyBrZXlzLCBlbmQgd2l0aCBDdHJsLUMsICEgY2hhbmdlcyBmcm9tIGNvb2tlZCB0byByYXdcbiIpOworCisgICAgZm9yICg7OykgeworCWNvb2tlZF9rZXlzKCk7CisJcmF3X2tleXMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb20zMi9zYW1wbGVzL2xvY2FsYm9vdC5jIGIvY29tMzIvc2FtcGxlcy9sb2NhbGJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY5OTJkCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvc2FtcGxlcy9sb2NhbGJvb3QuYwpAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlIDxzeXNsaW51eC9ib290Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgc3lzbGludXhfbG9jYWxfYm9vdChhcmdjID4gMSA/IGF0b2koYXJndlsxXSkgOiAwKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvc2FtcGxlcy9yZXNvbHYuYyBiL2NvbTMyL3NhbXBsZXMvcmVzb2x2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwNjJkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3NhbXBsZXMvcmVzb2x2LmMKQEAgLTAsMCArMSw1OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmVzb2x2LmMKKyAqCisgKiBSZXNvbHZlIGFuIElQIGFkZHJlc3MKKyAqLworCisjaW5jbHVkZSA8c3lzbGludXgvcHhlX2FwaS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisKK3VpbnQzMl90IHJlc29sdihjb25zdCBjaGFyICpuYW1lKQoreworICAgIHJldHVybiBkbnNfcmVzb2x2KG5hbWUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHVpbnQzMl90IGlwOworCisjaWYgMAorCS8qIHRoaXMgaGFuZ3MhICovCisgICAgb3BlbmNvbnNvbGUoJmRldl9udWxsX3IsICZkZXZfc3RkY29uX3cpOworI2Vsc2UKKwkvKiB0aGlzIHdvcmtzICovCisgICAgb3BlbmNvbnNvbGUoJmRldl9yYXdjb25fciwgJmRldl9hbnNpc2VyaWFsX3cpOworI2VuZGlmCisKKyAgICBpZiAoYXJnYyA8IDIpIHsKKwlmcHV0cygiVXNhZ2U6IHJlc29sdiBob3N0bmFtZVxuIiwgc3RkZXJyKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIGlwID0gcmVzb2x2KGFyZ3ZbMV0pOworCisgICAgaWYgKGlwKSB7CisJcHJpbnRmKCIlcyA9ICV1LiV1LiV1LiV1XG4iLCBhcmd2WzFdLAorCSAgICAgICAoaXAgJiAweGZmKSwgKGlwID4+IDgpICYgMHhmZiwKKwkgICAgICAgKGlwID4+IDE2KSAmIDB4ZmYsIChpcCA+PiAyNCkgJiAweGZmKTsKKyAgICB9IGVsc2UgeworCXByaW50ZigiJXMgbm90IGZvdW5kXG4iLCBhcmd2WzFdKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL3NhbXBsZXMvc2VyaWFsaW5mby5jIGIvY29tMzIvc2FtcGxlcy9zZXJpYWxpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzNmI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3NhbXBsZXMvc2VyaWFsaW5mby5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHNlcmlhbGluZm8uYworICoKKyAqIFByaW50IHNlcmlhbCBwb3J0IGluZm8KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvY29uZmlnLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgY29uc3Qgc3RydWN0IHN5c2xpbnV4X3NlcmlhbF9jb25zb2xlX2luZm8gKnNpOworCisjaWYgMAorCS8qIHRoaXMgaGFuZ3MhICovCisgICAgb3BlbmNvbnNvbGUoJmRldl9udWxsX3IsICZkZXZfc3RkY29uX3cpOworI2Vsc2UKKwkvKiB0aGlzIHdvcmtzICovCisgICAgb3BlbmNvbnNvbGUoJmRldl9yYXdjb25fciwgJmRldl9hbnNpc2VyaWFsX3cpOworI2VuZGlmCisKKyAgICBzaSA9IHN5c2xpbnV4X3NlcmlhbF9jb25zb2xlX2luZm8oKTsKKworICAgIHByaW50ZigiU2VyaWFsIHBvcnQgYmFzZTogICAgJSMwNnhcbiIsIHNpLT5pb2Jhc2UpOworICAgIHByaW50ZigiU2VyaWFsIHBvcnQgZGl2aXNvcjogICU1ZCIsIHNpLT5kaXZpc29yKTsKKyAgICBpZiAoc2ktPmRpdmlzb3IpCisJcHJpbnRmKCIgKCVkIGJhdWQpIiwgMTE1MjAwIC8gc2ktPmRpdmlzb3IpOworICAgIHByaW50ZigiXG4iICJGbG93IGNvbnRyb2wgYml0czogICAgJSMwNXhcbiIsIHNpLT5mbG93Y3RsKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvc3lzZHVtcC9NYWtlZmlsZSBiL2NvbTMyL3N5c2R1bXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwZWRhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3N5c2R1bXAvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisjIyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIyBTaW1wbGUgbWVudSBzeXN0ZW0KKyMjCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvZWxmLm1rCistaW5jbHVkZSAkKHRvcGRpcikvdmVyc2lvbi5taworCitMSUJTCSAgID0gJChvYmpkaXIpL2NvbTMyL2xpYnVwbG9hZC9saWJjb20zMnVwbG9hZC5hCitMTlhMSUJTCSAgID0gJChvYmpkaXIpL2NvbTMyL2xpYnV0aWwvbGlidXRpbF9sbnguYQorCitDRkxBR1MgKz0gLUkkKGNvbTMyKSAtSSQodG9wZGlyKQorCitNT0RVTEVTCSAgPSBzeXNkdW1wLmMzMgorVEVTVEZJTEVTID0KKworU1JDUyA9ICQod2lsZGNhcmQgJChTUkMpLyouYykKK09CSlMgPSAkKHN1YnN0ICQoU1JDKS8sLCQocGF0c3Vic3QgJS5jLCUubywkKFNSQ1MpKSkKKworIyBUaGUgREFURSBpcyBzZXQgb24gdGhlIG1ha2UgY29tbWFuZCBsaW5lIHdoZW4gYnVpbGRpbmcgYmluYXJpZXMgZm9yCisjIG9mZmljaWFsIHJlbGVhc2UuICBPdGhlcndpc2UsIHN1YnN0aXR1dGUgYSBoZXggc3RyaW5nIHRoYXQgaXMgcHJldHR5IG11Y2gKKyMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgdG8gYmUgdW5pcXVlIGZyb20gYnVpbGQgdG8gYnVpbGQuCitpZm5kZWYgSEVYREFURQorSEVYREFURSA6PSAkKHNoZWxsICQoUEVSTCkgJCh0b3BkaXIpL25vdy5wbCAkKFNSQ1MpICQod2lsZGNhcmQgKi5oKSkKK2VuZGlmCitpZm5kZWYgREFURQorREFURSAgICA6PSAkKHNoZWxsIHNoICQodG9wZGlyKS9nZW4taWQuc2ggJChWRVJTSU9OKSAkKEhFWERBVEUpKQorZW5kaWYKKworQ0ZMQUdTICAgICs9IC1EREFURT0nIiQoREFURSkiJworCithbGw6ICQoTU9EVUxFUykgJChURVNURklMRVMpCisKK3N5c2R1bXAuZWxmIDogJChPQkpTKSAkKExJQlMpICQoQ19MSUJTKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJF4KKwordGlkeSBkaXN0OgorCXJtIC1mICoubyAqLmxvICouYSAqLmxzdCAuKi5kICoudG1wCisKK2NsZWFuOiB0aWR5CisJcm0gLWYgKi5sbngKKworc3BvdGxlc3M6IGNsZWFuCisJcm0gLWYgKi5sc3MgKi5jMzIgKi5jb20KKwlybSAtZiAqfiBcIyoKKworaW5zdGFsbDoKKworLWluY2x1ZGUgLiouZApkaWZmIC0tZ2l0IGEvY29tMzIvc3lzZHVtcC9hY3BpLmMgYi9jb20zMi9zeXNkdW1wL2FjcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDIyMjMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvc3lzZHVtcC9hY3BpLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBEdW1wIEFDUEkgaW5mb3JtYXRpb24KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJzeXNkdW1wLmgiCisjaW5jbHVkZSAicmJ0cmVlLmgiCisKK3N0cnVjdCBhY3BpX3JzZHAgeworICAgIHVpbnQ4X3QgIG1hZ2ljWzhdOwkJLyogIlJTRCBQVFIgIiAqLworICAgIHVpbnQ4X3QgIGNzdW07CisgICAgY2hhciAgICAgb2VtaWRbNl07CisgICAgdWludDhfdCAgcmV2OworICAgIHVpbnQzMl90IHJzZHRfYWRkcjsKKyAgICB1aW50MzJfdCBsZW47CisgICAgdWludDY0X3QgeHNkdF9hZGRyOworICAgIHVpbnQ4X3QgIHhjc3VtOworICAgIHVpbnQ4X3QgIHJzdmRbM107Cit9OworCitzdHJ1Y3QgYWNwaV9oZHIgeworICAgIGNoYXIgICAgIHNpZ1s0XTsJCS8qIFNpZ25hdHVyZSAqLworICAgIHVpbnQzMl90IGxlbjsKKyAgICB1aW50OF90ICByZXY7CisgICAgdWludDhfdCAgY3N1bTsKKyAgICBjaGFyICAgICBvZW1pZFs2XTsKKyAgICBjaGFyICAgICBvZW10YmxpZFsxNl07CisgICAgdWludDMyX3Qgb2VtcmV2OworICAgIHVpbnQzMl90IGNyZWF0b3JpZDsKKyAgICB1aW50MzJfdCBjcmVhdG9ycmV2OworfTsKKworc3RydWN0IGFjcGlfcnNkdCB7CisgICAgc3RydWN0IGFjcGlfaGRyIGhkcjsKKyAgICB1aW50MzJfdCBlbnRyeVswXTsKK307CisKK3N0cnVjdCBhY3BpX3hzZHQgeworICAgIHN0cnVjdCBhY3BpX2hkciBoZHI7CisgICAgdWludDY0X3QgZW50cnlbMF07Cit9OworCitzdGF0aWMgc3RydWN0IHJidHJlZSAqcmJfdHlwZXMsICpyYl9hZGRyczsKKworc3RhdGljIGJvb2wgcmJfaGFzKHN0cnVjdCByYnRyZWUgKip0cmVlLCB1aW50NjRfdCBrZXkpCit7CisgICAgc3RydWN0IHJidHJlZSAqbm9kZTsKKworICAgIG5vZGUgPSByYl9zZWFyY2goKnRyZWUsIGtleSk7CisgICAgaWYgKG5vZGUgJiYgbm9kZS0+a2V5ID09IGtleSkKKwlyZXR1cm4gdHJ1ZTsKKworICAgIG5vZGUgPSBtYWxsb2Moc2l6ZW9mICpub2RlKTsKKyAgICBpZiAobm9kZSkgeworCW5vZGUtPmtleSA9IGtleTsKKwkqdHJlZSA9IHJiX2luc2VydCgqdHJlZSwgbm9kZSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGFkZHJfb2sodWludDY0X3QgYWRkcikKK3sKKyAgICAvKiBXZSBjYW4gb25seSBoYW5kbGUgMzItYml0IGFkZHJlc3NlcyBmb3Igbm93Li4uICovCisgICAgcmV0dXJuIGFkZHIgPD0gMHhmZmZmZmZmZjsKK30KKworZW51bSB0YmxfZXJycyB7CisgICAgRVJSX05PTkUsCQkJLyogTm8gZXJyb3JzICovCisgICAgRVJSX0NTVU0sCQkJLyogSW52YWxpZCBjaGVja3N1bSAqLworICAgIEVSUl9TSVpFLAkJCS8qIEltcG9zc2libHkgbGFyZ2UgdGFibGUgKi8KKyAgICBFUlJfTk9TSUcJCQkvKiBObyBzaWduYXR1cmUgKi8KK307CisKK3N0YXRpYyB1aW50OF90IGNoZWNrc3VtX3JhbmdlKGNvbnN0IHZvaWQgKnN0YXJ0LCB1aW50MzJfdCBzaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGFydDsKKyAgICB1aW50OF90IGNzdW0gPSAwOworCisgICAgd2hpbGUgKHNpemUtLSkKKwljc3VtICs9ICpwKys7CisKKyAgICByZXR1cm4gY3N1bTsKK30KKworc3RhdGljIGVudW0gdGJsX2VycnMgaXNfdmFsaWRfdGFibGUoY29uc3Qgdm9pZCAqcHRyKQoreworICAgIGNvbnN0IHN0cnVjdCBhY3BpX2hkciAqaGRyID0gcHRyOworCisgICAgaWYgKGhkci0+c2lnWzBdID09IDApCisJcmV0dXJuIEVSUl9OT1NJRzsKKworICAgIGlmIChoZHItPmxlbiA8IDEwIHx8IGhkci0+bGVuID4gKDEgPDwgMjApKSB7CisJLyogRWl0aGVyIGluc2FuZSBvciB0b28gbGFyZ2UgdG8gZHVtcCAqLworCXJldHVybiBFUlJfU0laRTsKKyAgICB9CisKKyAgICByZXR1cm4gY2hlY2tzdW1fcmFuZ2UoaGRyLCBoZHItPmxlbikgPT0gMCA/IEVSUl9OT05FIDogRVJSX0NTVU07Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9yc2RwICpzY2FuX2Zvcl9yc2RwKHVpbnQzMl90IGJhc2UsIHVpbnQzMl90IGVuZCkKK3sKKyAgICBmb3IgKGJhc2UgJj0gfjE1OyBiYXNlIDwgZW5kLTIwOyBiYXNlICs9IDE2KSB7CisJY29uc3Qgc3RydWN0IGFjcGlfcnNkcCAqcnNkcCA9IChjb25zdCBzdHJ1Y3QgYWNwaV9yc2RwICopYmFzZTsKKworCWlmIChtZW1jbXAocnNkcC0+bWFnaWMsICJSU0QgUFRSICIsIDgpKQorCSAgICBjb250aW51ZTsKKworCWlmIChjaGVja3N1bV9yYW5nZShyc2RwLCAyMCkpCisJICAgIGNvbnRpbnVlOworCisJaWYgKHJzZHAtPnJldiA+IDApIHsKKwkgICAgaWYgKGJhc2UgKyByc2RwLT5sZW4gPj0gZW5kIHx8CisJCWNoZWNrc3VtX3JhbmdlKHJzZHAsIHJzZHAtPmxlbikpCisJCWNvbnRpbnVlOworCX0KKworCXJldHVybiByc2RwOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfcnNkcCAqZmluZF9yc2RwKHZvaWQpCit7CisgICAgdWludDMyX3QgZWJkYTsKKyAgICBjb25zdCBzdHJ1Y3QgYWNwaV9yc2RwICpyc2RwOworCisgICAgZWJkYSA9ICgqKHVpbnQxNl90ICopMHg0MGUpIDw8IDQ7CisgICAgaWYgKGViZGEgPj0gMHg3MDAwMCAmJiBlYmRhIDwgMHhhMDAwMCkgeworCXJzZHAgPSBzY2FuX2Zvcl9yc2RwKGViZGEsIGViZGErMTAyNCk7CisKKwlpZiAocnNkcCkKKwkgICAgcmV0dXJuIHJzZHA7CisgICAgfQorCisgICAgcmV0dXJuIHNjYW5fZm9yX3JzZHAoMHhlMDAwMCwgMHgxMDAwMDApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3RhYmxlKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUsCisJCSAgICAgICBjb25zdCBjaGFyIG5hbWVbXSwgY29uc3Qgdm9pZCAqcHRyLCB1aW50MzJfdCBsZW4pCit7CisgICAgY2hhciBuYW1lYnVmWzY0XTsKKyAgICB1aW50MzJfdCBuYW1lX2tleSA9ICoodWludDMyX3QgKiluYW1lOworCisgICAgaWYgKHJiX2hhcygmcmJfYWRkcnMsIChzaXplX3QpcHRyKSkKKwlyZXR1cm47CQkJLyogQWxyZWFkeSBkdW1wZWQgdGhpcyB0YWJsZSAqLworCisgICAgaWYgKCFyYl9oYXMoJnJiX3R5cGVzLCBuYW1lX2tleSkpIHsKKwlzbnByaW50ZihuYW1lYnVmLCBzaXplb2YgbmFtZWJ1ZiwgImFjcGkvJTQuNHMiLCBuYW1lKTsKKwljcGlvX21rZGlyKGJlLCBuYW1lYnVmKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihuYW1lYnVmLCBzaXplb2YgbmFtZWJ1ZiwgImFjcGkvJTQuNHMvJTA4eCIsIG5hbWUsICh1aW50MzJfdClwdHIpOworICAgIGNwaW9faGRyKGJlLCBNT0RFX0ZJTEUsIGxlbiwgbmFtZWJ1Zik7CisKKyAgICB3cml0ZV9kYXRhKGJlLCBwdHIsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcnNkdChzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlLCBjb25zdCBzdHJ1Y3QgYWNwaV9yc2RwICpyc2RwKQoreworICAgIGNvbnN0IHN0cnVjdCBhY3BpX3JzZHQgKnJzZHQ7CisgICAgdWludDMyX3QgaSwgbjsKKworICAgIHJzZHQgPSAoY29uc3Qgc3RydWN0IGFjcGlfcnNkdCAqKXJzZHAtPnJzZHRfYWRkcjsKKworICAgIGlmIChtZW1jbXAocnNkdC0+aGRyLnNpZywgIlJTRFQiLCA0KSB8fCBpc192YWxpZF90YWJsZShyc2R0KSA+IEVSUl9DU1VNKQorCXJldHVybjsKKworICAgIGR1bXBfdGFibGUoYmUsIHJzZHQtPmhkci5zaWcsIHJzZHQsIHJzZHQtPmhkci5sZW4pOworCisgICAgaWYgKHJzZHQtPmhkci5sZW4gPCAzNikKKwlyZXR1cm47CisKKyAgICBuID0gKHJzZHQtPmhkci5sZW4gLSAzNikgPj4gMjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwljb25zdCBzdHJ1Y3QgYWNwaV9oZHIgKmhkciA9IChjb25zdCBzdHJ1Y3QgYWNwaV9oZHIgKikocnNkdC0+ZW50cnlbaV0pOworCisJaWYgKGlzX3ZhbGlkX3RhYmxlKGhkcikgPD0gRVJSX0NTVU0pCisJICAgIGR1bXBfdGFibGUoYmUsIGhkci0+c2lnLCBoZHIsIGhkci0+bGVuKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfeHNkdChzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlLCBjb25zdCBzdHJ1Y3QgYWNwaV9yc2RwICpyc2RwKQoreworICAgIGNvbnN0IHN0cnVjdCBhY3BpX3hzZHQgKnhzZHQ7CisgICAgdWludDMyX3QgcnNkcF9sZW4gPSByc2RwLT5yZXYgPiAwID8gcnNkcC0+bGVuIDogMjA7CisgICAgdWludDMyX3QgaSwgbjsKKworICAgIGlmIChyc2RwX2xlbiA8IDM0KQorCXJldHVybjsKKworICAgIGlmICghYWRkcl9vayhyc2RwLT54c2R0X2FkZHIpKQorCXJldHVybjsKKworICAgIHhzZHQgPSAoY29uc3Qgc3RydWN0IGFjcGlfeHNkdCAqKShzaXplX3QpcnNkcC0+eHNkdF9hZGRyOworCisgICAgaWYgKG1lbWNtcCh4c2R0LT5oZHIuc2lnLCAiWFNEVCIsIDQpIHx8IGlzX3ZhbGlkX3RhYmxlKHhzZHQpID4gRVJSX0NTVU0pCisJcmV0dXJuOworCisgICAgZHVtcF90YWJsZShiZSwgeHNkdC0+aGRyLnNpZywgeHNkdCwgeHNkdC0+aGRyLmxlbik7CisKKyAgICBpZiAoeHNkdC0+aGRyLmxlbiA8IDM2KQorCXJldHVybjsKKworICAgIG4gPSAoeHNkdC0+aGRyLmxlbiAtIDM2KSA+PiAzOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCWNvbnN0IHN0cnVjdCBhY3BpX2hkciAqaGRyOworCWlmIChhZGRyX29rKHhzZHQtPmVudHJ5W2ldKSkgeworCSAgICBoZHIgPSAoY29uc3Qgc3RydWN0IGFjcGlfaGRyICopKHNpemVfdCkoeHNkdC0+ZW50cnlbaV0pOworCisJICAgIGlmIChpc192YWxpZF90YWJsZShoZHIpIDw9IEVSUl9DU1VNKQorCQlkdW1wX3RhYmxlKGJlLCBoZHItPnNpZywgaGRyLCBoZHItPmxlbik7CisJfQorICAgIH0KK30KKwordm9pZCBkdW1wX2FjcGkoc3RydWN0IHVwbG9hZF9iYWNrZW5kICpiZSkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYWNwaV9yc2RwICpyc2RwOworICAgIHVpbnQzMl90IHJzZHBfbGVuOworCisgICAgcnNkcCA9IGZpbmRfcnNkcCgpOworCisgICAgcHJpbnRmKCJEdW1waW5nIEFDUEkuLi4gIik7CisKKyAgICBpZiAoIXJzZHApCisJcmV0dXJuOwkJCS8qIE5vIEFDUEkgaW5mb3JtYXRpb24gZm91bmQgKi8KKworICAgIGNwaW9fbWtkaXIoYmUsICJhY3BpIik7CisKKyAgICByc2RwX2xlbiA9IHJzZHAtPnJldiA+IDAgPyByc2RwLT5sZW4gOiAyMDsKKworICAgIGR1bXBfdGFibGUoYmUsICJSU0RQIiwgcnNkcCwgcnNkcF9sZW4pOworCisgICAgZHVtcF9yc2R0KGJlLCByc2RwKTsKKyAgICBkdW1wX3hzZHQoYmUsIHJzZHApOworCisgICAgcmJfZGVzdHJveShyYl90eXBlcyk7CisgICAgcmJfZGVzdHJveShyYl9hZGRycyk7CisKKyAgICBwcmludGYoImRvbmUuXG4iKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL3N5c2R1bXAvY3B1aWQuYyBiL2NvbTMyL3N5c2R1bXAvY3B1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDZiNTQwCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvc3lzZHVtcC9jcHVpZC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogRHVtcCBDUFVJRCBpbmZvcm1hdGlvbgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3lzL2NwdS5oPgorI2luY2x1ZGUgInN5c2R1bXAuaCIKKworc3RydWN0IGNwdWlkX2RhdGEgeworICAgIHVpbnQzMl90IGVheCwgZWJ4LCBlY3gsIGVkeDsKK307CisKK3N0cnVjdCBjcHVpZF9pbmZvIHsKKyAgICB1aW50MzJfdCBlYXgsIGVjeDsKKyAgICBzdHJ1Y3QgY3B1aWRfZGF0YSBkYXRhOworfTsKKworc3RhdGljIHZvaWQgZ2V0X2NwdWlkKHVpbnQzMl90IGVheCwgdWludDMyX3QgZWN4LCBzdHJ1Y3QgY3B1aWRfZGF0YSAqZGF0YSkKK3sKKyNpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gNAorICAgIGFzbSgicHVzaGwgJSVlYnggOyBjcHVpZCA7IG1vdmwgJSVlYngsJTEgOyBwb3BsICUlZWJ4IgorCTogIj1hIiAoZGF0YS0+ZWF4KSwgIj1yIiAoZGF0YS0+ZWJ4KSwKKwkgICI9YyIgKGRhdGEtPmVjeCksICI9ZCIgKGRhdGEtPmVkeCkKKwk6ICJhIiAoZWF4KSwgImMiIChlY3gpKTsKKyNlbGlmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA4CisgICAgICAgIGFzbSB2b2xhdGlsZSgicHVzaCAlJXJieDsgY3B1aWQ7IG1vdmwgJSVlYngsICUxOyBwb3AgJSVyYngiCisgICAgICAgICAgICA6ICI9YSIgKGRhdGEtPmVheCksCisgICAgICAgICAgICAgICI9YiIgKGRhdGEtPmVieCksCisgICAgICAgICAgICAgICI9YyIgKGRhdGEtPmVjeCksCisgICAgICAgICAgICAgICI9ZCIgKGRhdGEtPmVkeCkKKyAgICAgICAgICAgIDogImEiIChlYXgpLCAiYyIgKGVjeCkpOworI2Vsc2UKKyNlcnJvciAidW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIgorI2VuZGlmCit9CisKKyNkZWZpbmUgQ1BVSURfQ0hVTksgMTI4CisKK3ZvaWQgZHVtcF9jcHVpZChzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKQoreworICAgIHN0cnVjdCBjcHVpZF9pbmZvICpidWYgPSBOVUxMOworICAgIGludCBuZW50cnksIG5hbGxvYzsKKyAgICB1aW50MzJfdCByZWdpb247CisgICAgc3RydWN0IGNwdWlkX2RhdGEgYmFzZV9sZWFmOworICAgIHVpbnQzMl90IGJhc2UsIGxlYWYsIGNvdW50OworICAgIHN0cnVjdCBjcHVpZF9kYXRhIGludmFsaWRfbGVhZjsKKyAgICBzdHJ1Y3QgY3B1aWRfZGF0YSBkYXRhOworCisgICAgaWYgKCFjcHVfaGFzX2VmbGFnKEVGTEFHU19JRCkpCisJcmV0dXJuOworCisgICAgcHJpbnRmKCJEdW1waW5nIENQVUlELi4uICIpOworCisgICAgbmVudHJ5ID0gbmFsbG9jID0gMDsKKworICAgIC8qIEZpbmQgb3V0IHdoYXQgdGhlIENQVSByZXR1cm5zIGZvciBpbnZhbGlkIGxlYXZlcyAqLworICAgIGdldF9jcHVpZCgwLCAwLCAmYmFzZV9sZWFmKTsKKyAgICBnZXRfY3B1aWQoYmFzZV9sZWFmLmVheCsxLCAwLCAmaW52YWxpZF9sZWFmKTsKKworICAgIGZvciAocmVnaW9uID0gMCA7IHJlZ2lvbiA8PSAweGZmZmYgOyByZWdpb24rKykgeworCWJhc2UgPSByZWdpb24gPDwgMTY7CisKKwlnZXRfY3B1aWQoYmFzZSwgMCwgJmJhc2VfbGVhZik7CisJaWYgKHJlZ2lvbiAmJiAhbWVtY21wKCZiYXNlX2xlYWYsICZpbnZhbGlkX2xlYWYsIHNpemVvZiBiYXNlX2xlYWYpKQorCSAgICBjb250aW51ZTsKKworCWlmICgoYmFzZV9sZWFmLmVheCBeIGJhc2UpICYgMHhmZmZmMDAwMCkKKwkgICAgY29udGludWU7CisKKwlmb3IgKGxlYWYgPSBiYXNlIDsgbGVhZiA8PSBiYXNlX2xlYWYuZWF4IDsgbGVhZisrKSB7CisJICAgIGdldF9jcHVpZChsZWFmLCAwLCAmZGF0YSk7CisJICAgIGNvdW50ID0gMDsKKworCSAgICBkbyB7CisJCWlmIChuZW50cnkgPj0gbmFsbG9jKSB7CisJCSAgICBuYWxsb2MgKz0gQ1BVSURfQ0hVTks7CisJCSAgICBidWYgPSByZWFsbG9jKGJ1ZiwgbmFsbG9jKnNpemVvZiAqYnVmKTsKKwkJICAgIGlmICghYnVmKQorCQkJcmV0dXJuOwkJLyogRkFJTEVEICovCisJCX0KKwkJYnVmW25lbnRyeV0uZWF4ID0gbGVhZjsKKwkJYnVmW25lbnRyeV0uZWN4ID0gY291bnQ7CisJCWJ1ZltuZW50cnldLmRhdGEgPSBkYXRhOworCQluZW50cnkrKzsKKwkJY291bnQrKzsKKworCQlnZXRfY3B1aWQobGVhZiwgY291bnQsICZkYXRhKTsKKwkgICAgfSB3aGlsZSAobWVtY21wKCZkYXRhLCAmYnVmW25lbnRyeS0xXS5kYXRhLCBzaXplb2YgZGF0YSkgJiYKKwkJICAgICAoZGF0YS5lYXggfCBkYXRhLmVieCB8IGRhdGEuZWN4IHwgZGF0YS5lZHgpKTsKKwl9CisgICAgfQorCisgICAgaWYgKG5lbnRyeSkKKwljcGlvX3dyaXRlZmlsZShiZSwgImNwdWlkIiwgYnVmLCBuZW50cnkqc2l6ZW9mICpidWYpOworICAgIGZyZWUoYnVmKTsKKworICAgIHByaW50ZigiZG9uZS5cbiIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvc3lzZHVtcC9kbWkuYyBiL2NvbTMyL3N5c2R1bXAvZG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNWVmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3N5c2R1bXAvZG1pLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBEdW1wIERNSSBpbmZvcm1hdGlvbiBpbiBhIHdheSBob3BlZnVsbHkgY29tcGF0aWJsZSB3aXRoIGRtaWRlY29kZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInN5c2R1bXAuaCIKKworc3RydWN0IGRtaV9oZWFkZXIgeworICAgIGNoYXIgc2lnbmF0dXJlWzVdOworICAgIHVpbnQ4X3QgY3N1bTsKKyAgICB1aW50MTZfdCB0YmxsZW47CisgICAgdWludDMyX3QgdGJsYWRkcjsKKyAgICB1aW50MTZfdCBuc3RydWM7CisgICAgdWludDhfdCByZXZpc2lvbjsKKyAgICB1aW50OF90IHJlc2VydmVkOworfTsKKworc3RydWN0IHNtYmlvc19oZWFkZXIgeworICAgIGNoYXIgc2lnbmF0dXJlWzRdOworICAgIHVpbnQ4X3QgY3N1bTsKKyAgICB1aW50OF90IGxlbjsKKyAgICB1aW50OF90IG1ham9yOworICAgIHVpbnQ4X3QgbWlub3I7CisgICAgdWludDE2X3QgbWF4c2l6ZTsKKyAgICB1aW50OF90IHJldmlzaW9uOworICAgIHVpbnQ4X3QgZm10WzVdOworCisgICAgc3RydWN0IGRtaV9oZWFkZXIgZG1pOworfTsKKworc3RhdGljIHVpbnQ4X3QgY2hlY2tzdW0oY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBidWY7CisgICAgdWludDhfdCBjc3VtID0gMDsKKworICAgIHdoaWxlIChsZW4tLSkKKwljc3VtICs9ICpwKys7CisKKyAgICByZXR1cm4gY3N1bTsKK30KKworc3RhdGljIGJvb2wgaXNfb2xkX2RtaShzaXplX3QgZHB0cikKK3sKKyAgICBjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqZG1pID0gKHZvaWQgKilkcHRyOworCisgICAgcmV0dXJuICFtZW1jbXAoZG1pLT5zaWduYXR1cmUsICJfRE1JXyIsIDUpICYmCisJIWNoZWNrc3VtKGRtaSwgMHgwZik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc19zbWJpb3Moc2l6ZV90IGRwdHIpCit7CisgICAgY29uc3Qgc3RydWN0IHNtYmlvc19oZWFkZXIgKnNtYiA9ICh2b2lkICopZHB0cjsKKworICAgIHJldHVybiAhbWVtY21wKHNtYi0+c2lnbmF0dXJlLCAiX1NNXyIsIDQpICYmCisJIWNoZWNrc3VtKHNtYiwgc21iLT5sZW4pICYmCisJaXNfb2xkX2RtaShkcHRyKzE2KTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9zbWJpb3Moc3RydWN0IHVwbG9hZF9iYWNrZW5kICpiZSwgc2l6ZV90IGRwdHIpCit7CisgICAgY29uc3Qgc3RydWN0IHNtYmlvc19oZWFkZXIgKnNtYiA9ICh2b2lkICopZHB0cjsKKyAgICBzdHJ1Y3Qgc21iaW9zX2hlYWRlciBzbXggPSAqc21iOworICAgIGNoYXIgZmlsZW5hbWVbMzJdOworCisgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZiBmaWxlbmFtZSwgImRtaS8lMDV4LiUwOHgiLAorCSAgICAgZHB0ciwgc21iLT5kbWkudGJsYWRkcik7CisgICAgY3Bpb19oZHIoYmUsIE1PREVfRklMRSwgc21iLT5kbWkudGJsbGVuICsgMzIsIGZpbGVuYW1lKTsKKworICAgIC8qCisgICAgICogQWRqdXN0IHRoZSBhZGRyZXNzIG9mIHRoZSBzbWJpb3MgdGFibGUgdG8gYmUgMzIsIHRvCisgICAgICogbWFrZSBkbWlkZWNvZGUgaGFwcHkuICBUaGUgY2hlY2tzdW0gb24gdGhlIHNtYmlvcyB0YWJsZSBpcyB1bmNoYW5nZWQsCisgICAgICogc2luY2UgaXQgaW5jbHVkZXMgdGhlIGNoZWNrc3VtIG9uIHRoZSBkbWkgdGFibGUuCisgICAgICovCisgICAgc214LmRtaS50YmxhZGRyID0gc2l6ZW9mIHNteDsKKyAgICBzbXguZG1pLmNzdW0gLT0gY2hlY2tzdW0oJnNteC5kbWksIDB4MGYpOworCisgICAgd3JpdGVfZGF0YShiZSwgJnNteCwgc2l6ZW9mIHNteCk7CisgICAgd3JpdGVfZGF0YShiZSwgKGNvbnN0IHZvaWQgKilzbWItPmRtaS50YmxhZGRyLCBzbWItPmRtaS50YmxsZW4pOworfQorCitzdGF0aWMgdm9pZCBkdW1wX29sZF9kbWkoc3RydWN0IHVwbG9hZF9iYWNrZW5kICpiZSwgc2l6ZV90IGRwdHIpCit7CisgICAgY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmRtaSA9ICh2b2lkICopZHB0cjsKKyAgICBzdHJ1Y3QgZmFrZSB7CisJc3RydWN0IGRtaV9oZWFkZXIgZG1pOworCWNoYXIgcGFkWzE2XTsKKyAgICB9IGZha2U7CisgICAgY2hhciBmaWxlbmFtZVszMl07CisKKyAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mIGZpbGVuYW1lLCAiZG1pLyUwNXguJTA4eCIsCisJICAgICBkcHRyLCBkbWktPnRibGFkZHIpOworICAgIGNwaW9faGRyKGJlLCBNT0RFX0ZJTEUsIGRtaS0+dGJsbGVuICsgMzIsIGZpbGVuYW1lKTsKKworICAgIC8qCisgICAgICogQWRqdXN0IHRoZSBhZGRyZXNzIG9mIHRoZSBzbWJpb3MgdGFibGUgdG8gYmUgMzIsIHRvCisgICAgICogbWFrZSBkbWlkZWNvZGUgaGFwcHkuCisgICAgICovCisgICAgZmFrZS5kbWkgPSAqZG1pOworICAgIG1lbXNldCgmZmFrZS5wYWQsIDAsIHNpemVvZiBmYWtlLnBhZCk7CisgICAgZmFrZS5kbWkudGJsYWRkciA9IHNpemVvZiBmYWtlOworICAgIGZha2UuZG1pLmNzdW0gLT0gY2hlY2tzdW0oJmZha2UuZG1pLCAweDBmKTsKKworICAgIHdyaXRlX2RhdGEoYmUsICZmYWtlLCBzaXplb2YgZmFrZSk7CisgICAgd3JpdGVfZGF0YShiZSwgKGNvbnN0IHZvaWQgKilkbWktPnRibGFkZHIsIGRtaS0+dGJsbGVuKTsKK30KKwordm9pZCBkdW1wX2RtaShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKQoreworICAgIHNpemVfdCBkcHRyOworCisgICAgY3Bpb19ta2RpcihiZSwgImRtaSIpOworCisgICAgLyogU2VhcmNoIGZvciBfU01fIG9yIF9ETUlfIHN0cnVjdHVyZSAqLworICAgIGZvciAoZHB0ciA9IDB4ZjAwMDAgOyBkcHRyIDwgMHgxMDAwMDAgOyBkcHRyICs9IDE2KSB7CisJaWYgKGlzX3NtYmlvcyhkcHRyKSkgeworCSAgICBkdW1wX3NtYmlvcyhiZSwgZHB0cik7CisJICAgIGRwdHIgKz0gMTY7CQkvKiBTa2lwIHRoZSBzdWJzZXF1ZW50IERNSSBoZWFkZXIgKi8KKwl9IGVsc2UgaWYgKGlzX29sZF9kbWkoZHB0cikpIHsKKwkgICAgZHVtcF9vbGRfZG1pKGJlLCBkcHRyKTsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tMzIvc3lzZHVtcC9tYWluLmMgYi9jb20zMi9zeXNkdW1wL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWM5MzFlCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvc3lzZHVtcC9tYWluLmMKQEAgLTAsMCArMSw5NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPHN5cy9jcHUuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSAic3lzZHVtcC5oIgorCitjb25zdCBjaGFyIHByb2dyYW1bXSA9ICJzeXNkdW1wIjsKK2NvbnN0IGNoYXIgdmVyc2lvbltdID0gIlNZU0RVTVAgIiBWRVJTSU9OX1NUUiAiICIgREFURSAiXG4iOworCitfX25vcmV0dXJuIGRpZShjb25zdCBjaGFyICptc2cpCit7CisgICAgcHJpbnRmKCIlczogJXNcbiIsIHByb2dyYW0sIG1zZyk7CisgICAgZXhpdCgxKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9hbGwoc3RydWN0IHVwbG9hZF9iYWNrZW5kICpiZSwgY29uc3QgY2hhciAqYXJndltdKQoreworICAgIGNwaW9faW5pdChiZSwgYXJndik7CisKKyAgICBjcGlvX3dyaXRlZmlsZShiZSwgInN5c2R1bXAiLCB2ZXJzaW9uLCBzaXplb2YgdmVyc2lvbi0xKTsKKworICAgIGR1bXBfbWVtb3J5X21hcChiZSk7CisgICAgZHVtcF9tZW1vcnkoYmUpOworICAgIGR1bXBfZG1pKGJlKTsKKyAgICBkdW1wX2FjcGkoYmUpOworICAgIGR1bXBfY3B1aWQoYmUpOworICAgIGR1bXBfcGNpKGJlKTsKKyAgICBkdW1wX3Zlc2FfdGFibGVzKGJlKTsKKworICAgIGNwaW9fY2xvc2UoYmUpOworICAgIGZsdXNoX2RhdGEoYmUpOworfQorCitzdGF0aWMgc3RydWN0IHVwbG9hZF9iYWNrZW5kICp1cGxvYWRfYmFja2VuZHNbXSA9Cit7CisgICAgJnVwbG9hZF90ZnRwLAorICAgICZ1cGxvYWRfeW1vZGVtLAorICAgICZ1cGxvYWRfc3JlYywKKyAgICBOVUxMCit9OworCitfX25vcmV0dXJuIHVzYWdlKHZvaWQpCit7CisgICAgc3RydWN0IHVwbG9hZF9iYWNrZW5kICoqYmVwLCAqYmU7CisKKyAgICBwcmludGYoIlVzYWdlOlxuIik7CisgICAgZm9yIChiZXAgPSB1cGxvYWRfYmFja2VuZHMgOyAoYmUgPSAqYmVwKSA7IGJlcCsrKQorCXByaW50ZigiICAgICVzICVzICVzXG4iLCBwcm9ncmFtLCBiZS0+bmFtZSwgYmUtPmhlbHBtc2cpOworCisgICAgZXhpdCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKipiZXAsICpiZTsKKworICAgIGZwdXRzKHZlcnNpb24sIHN0ZG91dCk7CisKKyAgICBpZiAoYXJnYyA8IDIpCisJdXNhZ2UoKTsKKworICAgIGZvciAoYmVwID0gdXBsb2FkX2JhY2tlbmRzIDsgKGJlID0gKmJlcCkgOyBiZXArKykgeworCWlmICghc3RyY21wKGJlLT5uYW1lLCBhcmd2WzFdKSkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiZSB8fCBhcmdjIDwgYmUtPm1pbmFyZ3MgKyAyKQorCXVzYWdlKCk7CisKKyAgICAvKiBEbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlICovCisgICAgc25hcHNob3RfbG93bWVtKCk7CisKKyAgICBwcmludGYoIkJhY2tlbmQ6ICVzXG4iLCBiZS0+bmFtZSk7CisKKyAgICAvKiBEbyB0aGUgYWN0dWFsIGRhdGEgZHVtcCAqLworICAgIGR1bXBfYWxsKGJlLCAoY29uc3QgY2hhciAqKilhcmd2ICsgMik7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL3N5c2R1bXAvbWVtbWFwLmMgYi9jb20zMi9zeXNkdW1wL21lbW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjQxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9zeXNkdW1wL21lbW1hcC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBEdW1wIG1lbW9yeSBtYXAgaW5mb3JtYXRpb24KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgInN5c2R1bXAuaCIKKworI2RlZmluZSBFODIwX0NIVU5LIDEyOAorc3RydWN0IGU4MjBfaW5mbyB7CisgICAgdWludDMyX3QgZWJ4OworICAgIHVpbnQzMl90IGxlbjsKKyAgICB1aW50OF90ICBkYXRhWzI0XTsKK307CisKK3N0YXRpYyB2b2lkIGR1bXBfZTgyMChzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKQoreworICAgIGNvbTMyc3lzX3QgaXJlZywgb3JlZzsKKyAgICBzdHJ1Y3QgZTgyMF9pbmZvICpjdXJyOworICAgIHN0cnVjdCBlODIwX2luZm8gKmJ1ZiwgKnA7CisgICAgaW50IG5lbnRyeSwgbmFsbG9jOworCisgICAgY3VyciA9IGxtYWxsb2Moc2l6ZW9mICpjdXJyKTsKKworICAgIGJ1ZiA9IHAgPSBOVUxMOworICAgIG5lbnRyeSA9IG5hbGxvYyA9IDA7CisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisgICAgbWVtc2V0KCZjdXJyLCAwLCBzaXplb2YgY3Vycik7CisKKyAgICBpcmVnLmVheC5sID0gMHhlODIwOworICAgIGlyZWcuZWR4LmwgPSAweDUzNGQ0MTUwOworICAgIGlyZWcuZWN4LmwgPSBzaXplb2YgY3Vyci0+ZGF0YTsKKyAgICBpcmVnLmVzID0gU0VHKGN1cnItPmRhdGEpOworICAgIGlyZWcuZWRpLndbMF0gPSBPRkZTKGN1cnItPmRhdGEpOworCisgICAgZG8geworCV9faW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworCWlmICgob3JlZy5lZmxhZ3MubCAmIEVGTEFHU19DRikgfHwKKwkgICAgb3JlZy5lYXgubCAhPSAweDUzNGQ0MTUwKQorCSAgICBicmVhazsKKworCWlmIChuZW50cnkgPj0gbmFsbG9jKSB7CisJICAgIG5hbGxvYyArPSBFODIwX0NIVU5LOworCSAgICBidWYgPSByZWFsbG9jKGJ1ZiwgbmFsbG9jKnNpemVvZiAqYnVmKTsKKwkgICAgaWYgKCFidWYpCisJCXJldHVybjsJCS8qIEZBSUxFRCAqLworCX0KKwltZW1jcHkoYnVmW25lbnRyeV0uZGF0YSwgY3Vyci0+ZGF0YSwgc2l6ZW9mIGN1cnItPmRhdGEpOworCWJ1ZltuZW50cnldLmVieCA9IGlyZWcuZWJ4Lmw7CisJYnVmW25lbnRyeV0ubGVuID0gb3JlZy5lY3gubDsKKwluZW50cnkrKzsKKworCWlyZWcuZWJ4LmwgPSBvcmVnLmVieC5sOworICAgIH0gd2hpbGUgKGlyZWcuZWJ4LmwpOworCisgICAgaWYgKG5lbnRyeSkKKwljcGlvX3dyaXRlZmlsZShiZSwgIm1lbW1hcC8xNWU4MjAiLCBidWYsIG5lbnRyeSpzaXplb2YgKmJ1Zik7CisKKyAgICBmcmVlKGJ1Zik7CisgICAgbGZyZWUoY3Vycik7Cit9CisKK3ZvaWQgZHVtcF9tZW1vcnlfbWFwKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUpCit7CisgICAgY29tMzJzeXNfdCBpcmVnLCBvcmVnOworCisgICAgY3Bpb19ta2RpcihiZSwgIm1lbW1hcCIpOworCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisgICAgX19pbnRjYWxsKDB4MTIsICZpcmVnLCAmb3JlZyk7CisgICAgY3Bpb193cml0ZWZpbGUoYmUsICJtZW1tYXAvMTIiLCAmb3JlZywgc2l6ZW9mIG9yZWcpOworCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisgICAgaXJlZy5lYXguYlsxXSA9IDB4ODg7CisgICAgX19pbnRjYWxsKDB4MTUsICZpcmVnLCAmb3JlZyk7CisgICAgY3Bpb193cml0ZWZpbGUoYmUsICJtZW1tYXAvMTU4OCIsICZvcmVnLCBzaXplb2Ygb3JlZyk7CisKKyAgICBtZW1zZXQoJmlyZWcsIDAsIHNpemVvZiBpcmVnKTsKKyAgICBpcmVnLmVheC53WzBdID0gMHhlODAxOworICAgIF9faW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworICAgIGNwaW9fd3JpdGVmaWxlKGJlLCAibWVtbWFwLzE1ZTgwMSIsICZvcmVnLCBzaXplb2Ygb3JlZyk7CisKKyAgICBkdW1wX2U4MjAoYmUpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvc3lzZHVtcC9tZW1vcnkuYyBiL2NvbTMyL3N5c2R1bXAvbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3ZjlhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3N5c2R1bXAvbWVtb3J5LmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIER1bXAgbWVtb3J5CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL2NwdS5oPgorI2luY2x1ZGUgInN5c2R1bXAuaCIKKworc3RhdGljIGNoYXIgKmxvd21lbTsKK3N0YXRpYyBzaXplX3QgbG93bWVtX2xlbjsKKwordm9pZCAqemVyb19hZGRyOwkJLyogSGFjayB0byBrZWVwIGdjYyBmcm9tIGNvbXBsYWluaW5nICovCisKK3ZvaWQgc25hcHNob3RfbG93bWVtKHZvaWQpCit7CisgICAgZXh0ZXJuIHZvaWQgX3N0YXJ0KHZvaWQpOworCisgICAgbG93bWVtX2xlbiA9IChzaXplX3QpX3N0YXJ0OworICAgIGxvd21lbSA9IG1hbGxvYyhsb3dtZW1fbGVuKTsKKyAgICBpZiAobG93bWVtKSB7CisJcHJpbnRmKCJTbmFwc2hvdHRpbmcgbG93bWVtLi4uICIpOworCWNsaSgpOworCW1lbWNweShsb3dtZW0sIHplcm9fYWRkciwgbG93bWVtX2xlbik7CisJc3RpKCk7CisJcHJpbnRmKCJva1xuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX21lbW9yeV9yYW5nZShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlLCBjb25zdCB2b2lkICp3aGVyZSwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pCit7CisgICAgY2hhciBmaWxlbmFtZVszMl07CisKKyAgICBzcHJpbnRmKGZpbGVuYW1lLCAibWVtb3J5LyUwOHp4IiwgKHNpemVfdClhZGRyKTsKKyAgICBjcGlvX3dyaXRlZmlsZShiZSwgZmlsZW5hbWUsIHdoZXJlLCBsZW4pOworfQorCit2b2lkIGR1bXBfbWVtb3J5KHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUpCit7CisgICAgcHJpbnRmKCJEdW1waW5nIG1lbW9yeS4uLiAiKTsKKworICAgIGNwaW9fbWtkaXIoYmUsICJtZW1vcnkiKTsKKworICAgIGlmIChsb3dtZW0pCisJZHVtcF9tZW1vcnlfcmFuZ2UoYmUsIGxvd21lbSwgemVyb19hZGRyLCBsb3dtZW1fbGVuKTsKKworICAgIHByaW50ZigiZG9uZS5cbiIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvc3lzZHVtcC9wY2kuYyBiL2NvbTMyL3N5c2R1bXAvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyM2E4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3N5c2R1bXAvcGNpLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIER1bXAgUENJIGRldmljZSBoZWFkZXJzCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3BjaS5oPgorI2luY2x1ZGUgInN5c2R1bXAuaCIKKworc3RhdGljIHZvaWQgZHVtcF9wY2lfZGV2aWNlKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqYmUsIHBjaWFkZHJfdCBhLCB1aW50OF90IGhkcnR5cGUpCit7CisgICAgdW5zaWduZWQgaW50IGJ1cyAgPSBwY2lfYnVzKGEpOworICAgIHVuc2lnbmVkIGludCBkZXYgID0gcGNpX2RldihhKTsKKyAgICB1bnNpZ25lZCBpbnQgZnVuYyA9IHBjaV9mdW5jKGEpOworICAgIHVpbnQ4X3QgZGF0YVsyNTZdOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGNoYXIgZmlsZW5hbWVbMzJdOworCisgICAgaGRydHlwZSAmPSAweDdmOworCisgICAgcHJpbnRmKCJTY2FubmluZyBQQ0kgYnVzLi4uICUwMng6JTAyeC4leFxyIiwgYnVzLCBkZXYsIGZ1bmMpOworCisgICAgLyogQXNzdW1lIGRvaW5nIGEgZnVsbCBkZXZpY2UgZHVtcCBpcyBhY3R1YWxseSBzYWZlLi4uICovCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBkYXRhOyBpICs9IDQpCisJKih1aW50MzJfdCAqKShkYXRhK2kpID0gcGNpX3JlYWRsKGEgKyBpKTsKKworICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YgZmlsZW5hbWUsICJwY2kvJTAyeDolMDJ4LiV4IiwKKwkgICAgIGJ1cywgZGV2LCBmdW5jKTsKKyAgICBjcGlvX3dyaXRlZmlsZShiZSwgZmlsZW5hbWUsIGRhdGEsIHNpemVvZiBkYXRhKTsKK30KKwordm9pZCBkdW1wX3BjaShzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKQoreworICAgIGludCBjZmd0eXBlOworICAgIHVuc2lnbmVkIGludCBuYnVzLCBuZGV2LCBuZnVuYywgbWF4ZnVuYzsKKyAgICBwY2lhZGRyX3QgYTsKKyAgICB1aW50MzJfdCBkaWQ7CisgICAgdWludDhfdCBoZHJ0eXBlOworCisgICAgY2ZndHlwZSA9IHBjaV9zZXRfY29uZmlnX3R5cGUoUENJX0NGR19BVVRPKTsKKyAgICBpZiAoY2ZndHlwZSA9PSBQQ0lfQ0ZHX05PTkUpCisJcmV0dXJuOworCisgICAgY3Bpb19ta2RpcihiZSwgInBjaSIpOworCisgICAgZm9yIChuYnVzID0gMDsgbmJ1cyA8IE1BWF9QQ0lfQlVTRVM7IG5idXMrKykgeworCWZvciAobmRldiA9IDA7IG5kZXYgPCBNQVhfUENJX0RFVklDRVM7IG5kZXYrKykgeworCSAgICBtYXhmdW5jID0gMTsJLyogQXNzdW1lIGEgc2luZ2xlLWZ1bmN0aW9uIGRldmljZSAqLworCisJICAgIGZvciAobmZ1bmMgPSAwOyBuZnVuYyA8IG1heGZ1bmM7IG5mdW5jKyspIHsKKwkJYSA9IHBjaV9ta2FkZHIobmJ1cywgbmRldiwgbmZ1bmMsIDApOworCQlkaWQgPSBwY2lfcmVhZGwoYSk7CisKKwkJaWYgKGRpZCA9PSAweGZmZmZmZmZmIHx8IGRpZCA9PSAweGZmZmYwMDAwIHx8CisJCSAgICBkaWQgPT0gMHgwMDAwZmZmZiB8fCBkaWQgPT0gMHgwMDAwMDAwMCkKKwkJICAgIGNvbnRpbnVlOworCisJCWhkcnR5cGUgPSBwY2lfcmVhZGIoYSArIDB4MGUpOworCQlpZiAoaGRydHlwZSAmIDB4ODApCisJCSAgICBtYXhmdW5jID0gTUFYX1BDSV9GVU5DOwkvKiBNdWx0aWZ1bmN0aW9uIGRldmljZSAqLworCisJCWR1bXBfcGNpX2RldmljZShiZSwgYSwgaGRydHlwZSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHJpbnRmKCJTY2FubmluZyBQQ0kgYnVzLi4uIGRvbmUuICBcbiIpOworfQpkaWZmIC0tZ2l0IGEvY29tMzIvc3lzZHVtcC9yYnRyZWUuYyBiL2NvbTMyL3N5c2R1bXAvcmJ0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxMGUwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3N5c2R1bXAvcmJ0cmVlLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAxOTk2LTIwMDkgVGhlIE5BU00gQXV0aG9ycyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgU2VlIHRoZSBmaWxlIEFVVEhPUlMgaW5jbHVkZWQgd2l0aCB0aGUgTkFTTSBkaXN0cmlidXRpb24gZm9yCisgKiAgIHRoZSBzcGVjaWZpYyBjb3B5cmlnaHQgaG9sZGVycy4KKyAqCisgKiAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgIAorICogICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICogICAgIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiAgICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogICAgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqICAgICBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICAgICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICAgICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqICAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogICAgIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiAgICAgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmJ0cmVlLmMKKyAqCisgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSBsZWZ0LWxlYW5pbmcgcmVkLWJsYWNrIHRyZWUgd2l0aCA2NC1iaXQKKyAqIGludGVnZXIga2V5cy4gIFRoZSBzZWFyY2ggb3BlcmF0aW9uIHdpbGwgcmV0dXJuIHRoZSBoaWdoZXN0IG5vZGUgPD0KKyAqIHRoZSBrZXk7IG9ubHkgc2VhcmNoIGFuZCBpbnNlcnQgYXJlIHN1cHBvcnRlZCwgYnV0IGFkZGl0aW9uYWwKKyAqIHN0YW5kYXJkIGxscmJ0cmVlIG9wZXJhdGlvbnMgY2FuIGJlIGNvZGVkIHVwIGF0IHdpbGwuCisgKgorICogU2VlIGh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+cnMvdGFsa3MvTExSQi9SZWRCbGFjay5wZGYgZm9yCisgKiBpbmZvcm1hdGlvbiBhYm91dCBsZWZ0LWxlYW5pbmcgcmVkLWJsYWNrIHRyZWVzLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJyYnRyZWUuaCIKKworc3RydWN0IHJidHJlZSAqcmJfc2VhcmNoKHN0cnVjdCByYnRyZWUgKnRyZWUsIHVpbnQ2NF90IGtleSkKK3sKKyAgICBzdHJ1Y3QgcmJ0cmVlICpiZXN0ID0gTlVMTDsKKworICAgIHdoaWxlICh0cmVlKSB7CisJaWYgKHRyZWUtPmtleSA9PSBrZXkpCisJICAgIHJldHVybiB0cmVlOworCWVsc2UgaWYgKHRyZWUtPmtleSA+IGtleSkKKwkgICAgdHJlZSA9IHRyZWUtPmxlZnQ7CisJZWxzZSB7CisJICAgIGJlc3QgPSB0cmVlOworCSAgICB0cmVlID0gdHJlZS0+cmlnaHQ7CisJfQorICAgIH0KKyAgICByZXR1cm4gYmVzdDsKK30KKworc3RhdGljIGJvb2wgaXNfcmVkKHN0cnVjdCByYnRyZWUgKmgpCit7CisgICAgcmV0dXJuIGggJiYgaC0+cmVkOworfQorCitzdGF0aWMgc3RydWN0IHJidHJlZSAqcm90YXRlX2xlZnQoc3RydWN0IHJidHJlZSAqaCkKK3sKKyAgICBzdHJ1Y3QgcmJ0cmVlICp4ID0gaC0+cmlnaHQ7CisgICAgaC0+cmlnaHQgPSB4LT5sZWZ0OworICAgIHgtPmxlZnQgPSBoOworICAgIHgtPnJlZCA9IHgtPmxlZnQtPnJlZDsKKyAgICB4LT5sZWZ0LT5yZWQgPSB0cnVlOworICAgIHJldHVybiB4OworfQorCitzdGF0aWMgc3RydWN0IHJidHJlZSAqcm90YXRlX3JpZ2h0KHN0cnVjdCByYnRyZWUgKmgpCit7CisgICAgc3RydWN0IHJidHJlZSAqeCA9IGgtPmxlZnQ7CisgICAgaC0+bGVmdCA9IHgtPnJpZ2h0OworICAgIHgtPnJpZ2h0ID0gaDsKKyAgICB4LT5yZWQgPSB4LT5yaWdodC0+cmVkOworICAgIHgtPnJpZ2h0LT5yZWQgPSB0cnVlOworICAgIHJldHVybiB4OworfQorCitzdGF0aWMgdm9pZCBjb2xvcl9mbGlwKHN0cnVjdCByYnRyZWUgKmgpCit7CisgICAgaC0+cmVkID0gIWgtPnJlZDsKKyAgICBoLT5sZWZ0LT5yZWQgPSAhaC0+bGVmdC0+cmVkOworICAgIGgtPnJpZ2h0LT5yZWQgPSAhaC0+cmlnaHQtPnJlZDsKK30KKworc3RydWN0IHJidHJlZSAqcmJfaW5zZXJ0KHN0cnVjdCByYnRyZWUgKnRyZWUsIHN0cnVjdCByYnRyZWUgKm5vZGUpCit7CisgICAgbm9kZS0+bGVmdCA9IG5vZGUtPnJpZ2h0ID0gTlVMTDsKKyAgICBub2RlLT5yZWQgPSBmYWxzZTsKKworICAgIGlmICghdHJlZSkgeworCW5vZGUtPnJlZCA9IHRydWU7CisJcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgaWYgKGlzX3JlZCh0cmVlLT5sZWZ0KSAmJiBpc19yZWQodHJlZS0+cmlnaHQpKQorCWNvbG9yX2ZsaXAodHJlZSk7CisKKyAgICBpZiAobm9kZS0+a2V5IDwgdHJlZS0+a2V5KQorCXRyZWUtPmxlZnQgPSByYl9pbnNlcnQodHJlZS0+bGVmdCwgbm9kZSk7CisgICAgZWxzZQorCXRyZWUtPnJpZ2h0ID0gcmJfaW5zZXJ0KHRyZWUtPnJpZ2h0LCBub2RlKTsKKworICAgIGlmIChpc19yZWQodHJlZS0+cmlnaHQpKQorCXRyZWUgPSByb3RhdGVfbGVmdCh0cmVlKTsKKworICAgIGlmIChpc19yZWQodHJlZS0+bGVmdCkgJiYgaXNfcmVkKHRyZWUtPmxlZnQtPmxlZnQpKQorCXRyZWUgPSByb3RhdGVfcmlnaHQodHJlZSk7CisKKyAgICByZXR1cm4gdHJlZTsKK30KKwordm9pZCByYl9kZXN0cm95KHN0cnVjdCByYnRyZWUgKnRyZWUpCit7CisgICAgaWYgKHRyZWUtPmxlZnQpCisJcmJfZGVzdHJveSh0cmVlLT5sZWZ0KTsKKyAgICBpZiAodHJlZS0+cmlnaHQpCisJcmJfZGVzdHJveSh0cmVlLT5yaWdodCk7CisgICAgZnJlZSh0cmVlKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL3N5c2R1bXAvcmJ0cmVlLmggYi9jb20zMi9zeXNkdW1wL3JidHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGNkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb20zMi9zeXNkdW1wL3JidHJlZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAxOTk2LTIwMDkgVGhlIE5BU00gQXV0aG9ycyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgU2VlIHRoZSBmaWxlIEFVVEhPUlMgaW5jbHVkZWQgd2l0aCB0aGUgTkFTTSBkaXN0cmlidXRpb24gZm9yCisgKiAgIHRoZSBzcGVjaWZpYyBjb3B5cmlnaHQgaG9sZGVycy4KKyAqCisgKiAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgIAorICogICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICogICAgIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiAgICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogICAgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqICAgICBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICAgICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICAgICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqICAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogICAgIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiAgICAgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE5BU01fUkJUUkVFX0gKKyNkZWZpbmUgTkFTTV9SQlRSRUVfSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKy8qIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBlbWJlZGRlZCBpbiBhIGxhcmdlciBkYXRhIHN0cnVjdHVyZTsKKyAgIHRoZSBmaW5hbCBvdXRwdXQgZnJvbSByYl9zZWFyY2goKSBjYW4gdGhlbiBiZSBjb252ZXJ0ZWQgYmFjaworICAgdG8gdGhlIGxhcmdlciBkYXRhIHN0cnVjdHVyZSB2aWEgY29udGFpbmVyX29mKCkuICovCitzdHJ1Y3QgcmJ0cmVlIHsKKyAgICB1aW50NjRfdCBrZXk7CisgICAgc3RydWN0IHJidHJlZSAqbGVmdCwgKnJpZ2h0OworICAgIGJvb2wgcmVkOworfTsKKworc3RydWN0IHJidHJlZSAqcmJfaW5zZXJ0KHN0cnVjdCByYnRyZWUgKiwgc3RydWN0IHJidHJlZSAqKTsKK3N0cnVjdCByYnRyZWUgKnJiX3NlYXJjaChzdHJ1Y3QgcmJ0cmVlICosIHVpbnQ2NF90KTsKK3ZvaWQgcmJfZGVzdHJveShzdHJ1Y3QgcmJ0cmVlICopOworCisjZW5kaWYgLyogTkFTTV9SQlRSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvc3lzZHVtcC9zeXNkdW1wLmggYi9jb20zMi9zeXNkdW1wL3N5c2R1bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmU0ODc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvc3lzZHVtcC9zeXNkdW1wLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBTWVNEVU1QX0gKKyNkZWZpbmUgU1lTRFVNUF9ICisKKyNpbmNsdWRlIDxsaWJ1cGxvYWQvdXBsb2FkX2JhY2tlbmQuaD4KKwordm9pZCBkdW1wX21lbW9yeV9tYXAoc3RydWN0IHVwbG9hZF9iYWNrZW5kICopOwordm9pZCBzbmFwc2hvdF9sb3dtZW0odm9pZCk7Cit2b2lkIGR1bXBfbWVtb3J5KHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqKTsKK3ZvaWQgZHVtcF9kbWkoc3RydWN0IHVwbG9hZF9iYWNrZW5kICopOwordm9pZCBkdW1wX2FjcGkoc3RydWN0IHVwbG9hZF9iYWNrZW5kICopOwordm9pZCBkdW1wX2NwdWlkKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqKTsKK3ZvaWQgZHVtcF9wY2koc3RydWN0IHVwbG9hZF9iYWNrZW5kICopOwordm9pZCBkdW1wX3Zlc2FfdGFibGVzKHN0cnVjdCB1cGxvYWRfYmFja2VuZCAqKTsKKworI2VuZGlmIC8qIFNZU0RVTVBfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvc3lzZHVtcC92ZXNhLmMgYi9jb20zMi9zeXNkdW1wL3Zlc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQwZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvc3lzZHVtcC92ZXNhLmMKQEAgLTAsMCArMSw2MyBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGliL3N5cy92ZXNhL3Zlc2EuaD4KKyNpbmNsdWRlICJzeXNkdW1wLmgiCisKK3ZvaWQgZHVtcF92ZXNhX3RhYmxlcyhzdHJ1Y3QgdXBsb2FkX2JhY2tlbmQgKmJlKQoreworICAgIGNvbTMyc3lzX3Qgcm07CisgICAgc3RydWN0IHZlc2FfaW5mbyAqdmlwOworICAgIHN0cnVjdCB2ZXNhX2dlbmVyYWxfaW5mbyAqZ2lwLCBnaTsKKyAgICBzdHJ1Y3QgdmVzYV9tb2RlX2luZm8gKm1pcCwgbWk7CisgICAgdWludDE2X3QgbW9kZSwgKm1vZGVfcHRyOworICAgIGNoYXIgbW9kZWZpbGVbNjRdOworCisgICAgcHJpbnRmKCJTY2FubmluZyBWRVNBIEJJT1MuLi4gIik7CisKKyAgICAvKiBBbGxvY2F0ZSBzcGFjZSBpbiB0aGUgYm91bmNlIGJ1ZmZlciBmb3IgdGhlc2Ugc3RydWN0dXJlcyAqLworICAgIHZpcCA9IGxtYWxsb2Moc2l6ZW9mICp2aXApOworICAgIGdpcCA9ICZ2aXAtPmdpOworICAgIG1pcCA9ICZ2aXAtPm1pOworCisgICAgbWVtc2V0KCZybSwgMCwgc2l6ZW9mIHJtKTsKKyAgICBtZW1zZXQoZ2lwLCAwLCBzaXplb2YgKmdpcCk7CisKKyAgICBnaXAtPnNpZ25hdHVyZSA9IFZCRTJfTUFHSUM7CS8qIEdldCBWQkUyIGV4dGVuZGVkIGRhdGEgKi8KKyAgICBybS5lYXgud1swXSA9IDB4NEYwMDsJCS8qIEdldCBTVkdBIGdlbmVyYWwgaW5mb3JtYXRpb24gKi8KKyAgICBybS5lZGkud1swXSA9IE9GRlMoZ2lwKTsKKyAgICBybS5lcyA9IFNFRyhnaXApOworICAgIF9faW50Y2FsbCgweDEwLCAmcm0sICZybSk7CisgICAgbWVtY3B5KCZnaSwgZ2lwLCBzaXplb2YgZ2kpOworCisgICAgaWYgKHJtLmVheC53WzBdICE9IDB4MDA0RikKKwlyZXR1cm47CQkvKiBGdW5jdGlvbiBjYWxsIGZhaWxlZCAqLworICAgIGlmIChnaS5zaWduYXR1cmUgIT0gVkVTQV9NQUdJQykKKwlyZXR1cm47CQkvKiBObyBtYWdpYyAqLworCisgICAgY3Bpb19ta2RpcihiZSwgInZlc2EiKTsKKworICAgIGNwaW9fd3JpdGVmaWxlKGJlLCAidmVzYS9nbG9iYWwuYmluIiwgJmdpLCBzaXplb2YgZ2kpOworCisgICAgbW9kZV9wdHIgPSBHRVRfUFRSKGdpLnZpZGVvX21vZGVfcHRyKTsKKyAgICB3aGlsZSAoKG1vZGUgPSAqbW9kZV9wdHIrKykgIT0gMHhGRkZGKSB7CisJbWVtc2V0KG1pcCwgMCwgc2l6ZW9mICptaXApOworICAgICAgICBtZW1zZXQoJnJtLCAwLCBzaXplb2Ygcm0pOworCXJtLmVheC53WzBdID0gMHg0RjAxOwkvKiBHZXQgU1ZHQSBtb2RlIGluZm9ybWF0aW9uICovCisJcm0uZWN4LndbMF0gPSBtb2RlOworCXJtLmVkaS53WzBdID0gT0ZGUyhtaXApOworCXJtLmVzID0gU0VHKG1pcCk7CisJX19pbnRjYWxsKDB4MTAsICZybSwgJnJtKTsKKworCS8qIE11c3QgYmUgYSBzdXBwb3J0ZWQgbW9kZSAqLworCWlmIChybS5lYXgud1swXSAhPSAweDAwNGYpCisJICAgIGNvbnRpbnVlOworCisJbWVtY3B5KCZtaSwgbWlwLCBzaXplb2YgbWkpOworCisJc3ByaW50Zihtb2RlZmlsZSwgInZlc2EvbW9kZSUwNHguYmluIiwgbW9kZSk7CisJY3Bpb193cml0ZWZpbGUoYmUsIG1vZGVmaWxlLCAmbWksIHNpemVvZiBtaSk7CisgICAgfQorCisgICAgbGZyZWUodmlwKTsKKyAgICBwcmludGYoImRvbmUuXG4iKTsKK30KZGlmZiAtLWdpdCBhL2NvbTMyL3Rvb2xzL01ha2VmaWxlIGIvY29tMzIvdG9vbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwZWE3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbTMyL3Rvb2xzL01ha2VmaWxlCkBAIC0wLDAgKzEsMzIgQEAKKyMjIC0qLSBtYWtlZmlsZSAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMjAwMS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvYnVpbGQubWsKKworQklOUyAgICA9IHJlbG9jcworCitJTkNMVURFUyArPSAtSSQoU1JDKS9pbmNsdWRlCisKK2FsbCA6ICQoQklOUykKKworcmVsb2NzIDogcmVsb2NzLm8KKwkkKENDKSAkKExERkxBR1MpIC1vICRAICReICQoTElCUykKKwordGlkeSBkaXN0IGNsZWFuIHNwb3RsZXNzOgorCXJtIC1mICQoQklOUykKKwlybSAtZiAqLm8gKi5hIC4qLmQKKwlybSAtZiAqLyoubyAqLyouYSAqLy4qLmQKKworaW5zdGFsbCBpbnN0YWxsZXI6CisKKy1pbmNsdWRlIC4qLmQgKi8uKi5kCmRpZmYgLS1naXQgYS9jb20zMi90b29scy9pbmNsdWRlL3Rvb2xzL2xlX2J5dGVzaGlmdC5oIGIvY29tMzIvdG9vbHMvaW5jbHVkZS90b29scy9sZV9ieXRlc2hpZnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTlkNDVhCi0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvdG9vbHMvaW5jbHVkZS90b29scy9sZV9ieXRlc2hpZnQuaApAQCAtMCwwICsxLDcwIEBACisjaWZuZGVmIF9UT09MU19MRV9CWVRFU0hJRlRfSAorI2RlZmluZSBfVE9PTFNfTEVfQllURVNISUZUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0YXRpYyBpbmxpbmUgX191MTYgX19nZXRfdW5hbGlnbmVkX2xlMTYoY29uc3QgX191OCAqcCkKK3sKKwlyZXR1cm4gcFswXSB8IHBbMV0gPDwgODsKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBfX2dldF91bmFsaWduZWRfbGUzMihjb25zdCBfX3U4ICpwKQoreworCXJldHVybiBwWzBdIHwgcFsxXSA8PCA4IHwgcFsyXSA8PCAxNiB8IHBbM10gPDwgMjQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgX19nZXRfdW5hbGlnbmVkX2xlNjQoY29uc3QgX191OCAqcCkKK3sKKwlyZXR1cm4gKF9fdTY0KV9fZ2V0X3VuYWxpZ25lZF9sZTMyKHAgKyA0KSA8PCAzMiB8CisJICAgICAgIF9fZ2V0X3VuYWxpZ25lZF9sZTMyKHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19wdXRfdW5hbGlnbmVkX2xlMTYoX191MTYgdmFsLCBfX3U4ICpwKQoreworCSpwKysgPSB2YWw7CisJKnArKyA9IHZhbCA+PiA4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19wdXRfdW5hbGlnbmVkX2xlMzIoX191MzIgdmFsLCBfX3U4ICpwKQoreworCV9fcHV0X3VuYWxpZ25lZF9sZTE2KHZhbCA+PiAxNiwgcCArIDIpOworCV9fcHV0X3VuYWxpZ25lZF9sZTE2KHZhbCwgcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B1dF91bmFsaWduZWRfbGU2NChfX3U2NCB2YWwsIF9fdTggKnApCit7CisJX19wdXRfdW5hbGlnbmVkX2xlMzIodmFsID4+IDMyLCBwICsgNCk7CisJX19wdXRfdW5hbGlnbmVkX2xlMzIodmFsLCBwKTsKK30KKworc3RhdGljIGlubGluZSBfX3UxNiBnZXRfdW5hbGlnbmVkX2xlMTYoY29uc3Qgdm9pZCAqcCkKK3sKKwlyZXR1cm4gX19nZXRfdW5hbGlnbmVkX2xlMTYoKGNvbnN0IF9fdTggKilwKTsKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBnZXRfdW5hbGlnbmVkX2xlMzIoY29uc3Qgdm9pZCAqcCkKK3sKKwlyZXR1cm4gX19nZXRfdW5hbGlnbmVkX2xlMzIoKGNvbnN0IF9fdTggKilwKTsKK30KKworc3RhdGljIGlubGluZSBfX3U2NCBnZXRfdW5hbGlnbmVkX2xlNjQoY29uc3Qgdm9pZCAqcCkKK3sKKwlyZXR1cm4gX19nZXRfdW5hbGlnbmVkX2xlNjQoKGNvbnN0IF9fdTggKilwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF91bmFsaWduZWRfbGUxNihfX3UxNiB2YWwsIHZvaWQgKnApCit7CisJX19wdXRfdW5hbGlnbmVkX2xlMTYodmFsLCBwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF91bmFsaWduZWRfbGUzMihfX3UzMiB2YWwsIHZvaWQgKnApCit7CisJX19wdXRfdW5hbGlnbmVkX2xlMzIodmFsLCBwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF91bmFsaWduZWRfbGU2NChfX3U2NCB2YWwsIHZvaWQgKnApCit7CisJX19wdXRfdW5hbGlnbmVkX2xlNjQodmFsLCBwKTsKK30KKworI2VuZGlmIC8qIF9UT09MU19MRV9CWVRFU0hJRlRfSCAqLwpkaWZmIC0tZ2l0IGEvY29tMzIvdG9vbHMvcmVsb2NzLmMgYi9jb20zMi90b29scy9yZWxvY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmZjN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tMzIvdG9vbHMvcmVsb2NzLmMKQEAgLTAsMCArMSw4MDggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgdGFrZW4gZnJvbSB0aGUgTGludXgga2VybmVsIGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciBHUEwgdjIuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNkZWZpbmUgVVNFX0JTRAorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8dG9vbHMvbGVfYnl0ZXNoaWZ0Lmg+CisKK3N0YXRpYyB2b2lkIGRpZShjaGFyICpmbXQsIC4uLik7CisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCitzdGF0aWMgRWxmMzJfRWhkciBlaGRyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVsb2NfY291bnQsIHJlbG9jX2lkeDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nICpyZWxvY3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWxvYzE2X2NvdW50LCByZWxvYzE2X2lkeDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nICpyZWxvY3MxNjsKKworc3RydWN0IHNlY3Rpb24geworCUVsZjMyX1NoZHIgICAgIHNoZHI7CisJc3RydWN0IHNlY3Rpb24gKmxpbms7CisJRWxmMzJfU3ltICAgICAgKnN5bXRhYjsKKwlFbGYzMl9SZWwgICAgICAqcmVsdGFiOworCWNoYXIgICAgICAgICAgICpzdHJ0YWI7Cit9Oworc3RhdGljIHN0cnVjdCBzZWN0aW9uICpzZWNzOworCitlbnVtIHN5bXR5cGUgeworCVNfQUJTLAorCVNfUkVMLAorCVNfU0VHLAorCVNfTElOLAorCVNfTlNZTVRZUEVTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN5bV9yZWdleF9rZXJuZWxbU19OU1lNVFlQRVNdID0geworLyoKKyAqIEZvbGxvd2luZyBzeW1ib2xzIGhhdmUgYmVlbiBhdWRpdGVkLiAgRG9uJ3Qgd2FybiB1c2VyIGFib3V0CisgKiBhYnNvbHV0ZSByZWxvY2F0aW9ucyBwcmVzZW50IHcuci50IHRoZXNlIHN5bWJvbHMuCisgKi8KKwlbU19BQlNdID0KKwkiXihfXy4qX2xlbnxfXy4qX2R3b3JkcykkIiwKKworLyoKKyAqIFRoZXNlIHN5bWJvbHMgYXJlIGtub3duIHRvIGJlIHJlbGF0aXZlLCBldmVuIGlmIHRoZSBsaW5rZXIgbWFya3MgdGhlbQorICogYXMgYWJzb2x1dGUgKHR5cGljYWxseSBkZWZpbmVkIG91dHNpZGUgYW55IHNlY3Rpb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuKQorICovCisJW1NfUkVMXSA9CisJIl4oX18uKl9zdGFydHxfXy4qX2VuZHxfZW5kfF9bc2VdKHRleHR8ZGF0YSkpJCIsCit9OworCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3ltX3JlZ2V4X3JlYWxtb2RlW1NfTlNZTVRZUEVTXSA9IHsKKy8qCisgKiBUaGVzZSBhcmUgMTYtYml0IHNlZ21lbnQgc3ltYm9scyB3aGVuIGNvbXBpbGluZyAxNi1iaXQgY29kZS4KKyAqLworCVtTX1NFR10gPQorCSJecmVhbF9tb2RlX3NlZyQiLAorCisvKgorICogVGhlc2UgYXJlIG9mZnNldHMgYmVsb25naW5nIHRvIHNlZ21lbnRzLCBhcyBvcHBvc2VkIHRvIGxpbmVhciBhZGRyZXNzZXMsCisgKiB3aGVuIGNvbXBpbGluZyAxNi1iaXQgY29kZS4KKyAqLworCVtTX0xJTl0gPQorCSJecGFfIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgKnN5bV9yZWdleDsKKworc3RhdGljIHJlZ2V4X3Qgc3ltX3JlZ2V4X2NbU19OU1lNVFlQRVNdOworc3RhdGljIGludCBpc19yZWxvYyhlbnVtIHN5bXR5cGUgdHlwZSwgY29uc3QgY2hhciAqc3ltX25hbWUpCit7CisJcmV0dXJuIHN5bV9yZWdleFt0eXBlXSAmJgorCQkhcmVnZXhlYygmc3ltX3JlZ2V4X2NbdHlwZV0sIHN5bV9uYW1lLCAwLCBOVUxMLCAwKTsKK30KKworc3RhdGljIHZvaWQgcmVnZXhfaW5pdChpbnQgdXNlX3JlYWxfbW9kZSkKK3sKKyAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgaW50IGVycjsKKwlpbnQgaTsKKworCWlmICh1c2VfcmVhbF9tb2RlKQorCQlzeW1fcmVnZXggPSBzeW1fcmVnZXhfcmVhbG1vZGU7CisJZWxzZQorCQlzeW1fcmVnZXggPSBzeW1fcmVnZXhfa2VybmVsOworCisJZm9yIChpID0gMDsgaSA8IFNfTlNZTVRZUEVTOyBpKyspIHsKKwkJaWYgKCFzeW1fcmVnZXhbaV0pCisJCQljb250aW51ZTsKKworCQllcnIgPSByZWdjb21wKCZzeW1fcmVnZXhfY1tpXSwgc3ltX3JlZ2V4W2ldLAorCQkJICAgICAgUkVHX0VYVEVOREVEfFJFR19OT1NVQik7CisKKwkJaWYgKGVycikgeworCQkJcmVnZXJyb3IoZXJyLCAmc3ltX3JlZ2V4X2NbaV0sIGVycmJ1Ziwgc2l6ZW9mIGVycmJ1Zik7CisJCQlkaWUoIiVzIiwgZXJyYnVmKTsKKwkJfQorICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRpZShjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlleGl0KDEpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3ltX3R5cGUodW5zaWduZWQgdHlwZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lW10gPSB7CisjZGVmaW5lIFNZTV9UWVBFKFgpIFtYXSA9ICNYCisJCVNZTV9UWVBFKFNUVF9OT1RZUEUpLAorCQlTWU1fVFlQRShTVFRfT0JKRUNUKSwKKwkJU1lNX1RZUEUoU1RUX0ZVTkMpLAorCQlTWU1fVFlQRShTVFRfU0VDVElPTiksCisJCVNZTV9UWVBFKFNUVF9GSUxFKSwKKwkJU1lNX1RZUEUoU1RUX0NPTU1PTiksCisJCVNZTV9UWVBFKFNUVF9UTFMpLAorI3VuZGVmIFNZTV9UWVBFCisJfTsKKwljb25zdCBjaGFyICpuYW1lID0gInVua25vd24gc3ltIHR5cGUgbmFtZSI7CisJaWYgKHR5cGUgPCBBUlJBWV9TSVpFKHR5cGVfbmFtZSkpIHsKKwkJbmFtZSA9IHR5cGVfbmFtZVt0eXBlXTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzeW1fYmluZCh1bnNpZ25lZCBiaW5kKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpiaW5kX25hbWVbXSA9IHsKKyNkZWZpbmUgU1lNX0JJTkQoWCkgW1hdID0gI1gKKwkJU1lNX0JJTkQoU1RCX0xPQ0FMKSwKKwkJU1lNX0JJTkQoU1RCX0dMT0JBTCksCisJCVNZTV9CSU5EKFNUQl9XRUFLKSwKKyN1bmRlZiBTWU1fQklORAorCX07CisJY29uc3QgY2hhciAqbmFtZSA9ICJ1bmtub3duIHN5bSBiaW5kIG5hbWUiOworCWlmIChiaW5kIDwgQVJSQVlfU0laRShiaW5kX25hbWUpKSB7CisJCW5hbWUgPSBiaW5kX25hbWVbYmluZF07CisJfQorCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3ltX3Zpc2liaWxpdHkodW5zaWduZWQgdmlzaWJpbGl0eSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqdmlzaWJpbGl0eV9uYW1lW10gPSB7CisjZGVmaW5lIFNZTV9WSVNJQklMSVRZKFgpIFtYXSA9ICNYCisJCVNZTV9WSVNJQklMSVRZKFNUVl9ERUZBVUxUKSwKKwkJU1lNX1ZJU0lCSUxJVFkoU1RWX0lOVEVSTkFMKSwKKwkJU1lNX1ZJU0lCSUxJVFkoU1RWX0hJRERFTiksCisJCVNZTV9WSVNJQklMSVRZKFNUVl9QUk9URUNURUQpLAorI3VuZGVmIFNZTV9WSVNJQklMSVRZCisJfTsKKwljb25zdCBjaGFyICpuYW1lID0gInVua25vd24gc3ltIHZpc2liaWxpdHkgbmFtZSI7CisJaWYgKHZpc2liaWxpdHkgPCBBUlJBWV9TSVpFKHZpc2liaWxpdHlfbmFtZSkpIHsKKwkJbmFtZSA9IHZpc2liaWxpdHlfbmFtZVt2aXNpYmlsaXR5XTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpyZWxfdHlwZSh1bnNpZ25lZCB0eXBlKQoreworCXN0YXRpYyBjb25zdCBjaGFyICp0eXBlX25hbWVbXSA9IHsKKyNkZWZpbmUgUkVMX1RZUEUoWCkgW1hdID0gI1gKKwkJUkVMX1RZUEUoUl8zODZfTk9ORSksCisJCVJFTF9UWVBFKFJfMzg2XzMyKSwKKwkJUkVMX1RZUEUoUl8zODZfUEMzMiksCisJCVJFTF9UWVBFKFJfMzg2X0dPVDMyKSwKKwkJUkVMX1RZUEUoUl8zODZfUExUMzIpLAorCQlSRUxfVFlQRShSXzM4Nl9DT1BZKSwKKwkJUkVMX1RZUEUoUl8zODZfR0xPQl9EQVQpLAorCQlSRUxfVFlQRShSXzM4Nl9KTVBfU0xPVCksCisJCVJFTF9UWVBFKFJfMzg2X1JFTEFUSVZFKSwKKwkJUkVMX1RZUEUoUl8zODZfR09UT0ZGKSwKKwkJUkVMX1RZUEUoUl8zODZfR09UUEMpLAorCQlSRUxfVFlQRShSXzM4Nl84KSwKKwkJUkVMX1RZUEUoUl8zODZfUEM4KSwKKwkJUkVMX1RZUEUoUl8zODZfMTYpLAorCQlSRUxfVFlQRShSXzM4Nl9QQzE2KSwKKyN1bmRlZiBSRUxfVFlQRQorCX07CisJY29uc3QgY2hhciAqbmFtZSA9ICJ1bmtub3duIHR5cGUgcmVsIHR5cGUgbmFtZSI7CisJaWYgKHR5cGUgPCBBUlJBWV9TSVpFKHR5cGVfbmFtZSkgJiYgdHlwZV9uYW1lW3R5cGVdKSB7CisJCW5hbWUgPSB0eXBlX25hbWVbdHlwZV07CisJfQorCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2VjX25hbWUodW5zaWduZWQgc2huZHgpCit7CisJY29uc3QgY2hhciAqc2VjX3N0cnRhYjsKKwljb25zdCBjaGFyICpuYW1lOworCXNlY19zdHJ0YWIgPSBzZWNzW2VoZHIuZV9zaHN0cm5keF0uc3RydGFiOworCW5hbWUgPSAiPG5vbmFtZT4iOworCWlmIChzaG5keCA8IGVoZHIuZV9zaG51bSkgeworCQluYW1lID0gc2VjX3N0cnRhYiArIHNlY3Nbc2huZHhdLnNoZHIuc2hfbmFtZTsKKwl9CisJZWxzZSBpZiAoc2huZHggPT0gU0hOX0FCUykgeworCQluYW1lID0gIkFCU09MVVRFIjsKKwl9CisJZWxzZSBpZiAoc2huZHggPT0gU0hOX0NPTU1PTikgeworCQluYW1lID0gIkNPTU1PTiI7CisJfQorCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3ltX25hbWUoY29uc3QgY2hhciAqc3ltX3N0cnRhYiwgRWxmMzJfU3ltICpzeW0pCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwluYW1lID0gIjxub25hbWU+IjsKKwlpZiAoc3ltLT5zdF9uYW1lKSB7CisJCW5hbWUgPSBzeW1fc3RydGFiICsgc3ltLT5zdF9uYW1lOworCX0KKwllbHNlIHsKKwkJbmFtZSA9IHNlY19uYW1lKHN5bS0+c3Rfc2huZHgpOworCX0KKwlyZXR1cm4gbmFtZTsKK30KKworCisKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgbGUxNl90b19jcHUodmFsKSAodmFsKQorI2RlZmluZSBsZTMyX3RvX2NwdSh2YWwpICh2YWwpCisjZW5kaWYKKyNpZiBCWVRFX09SREVSID09IEJJR19FTkRJQU4KKyNkZWZpbmUgbGUxNl90b19jcHUodmFsKSBic3dhcF8xNih2YWwpCisjZGVmaW5lIGxlMzJfdG9fY3B1KHZhbCkgYnN3YXBfMzIodmFsKQorI2VuZGlmCisKK3N0YXRpYyB1aW50MTZfdCBlbGYxNl90b19jcHUodWludDE2X3QgdmFsKQoreworCXJldHVybiBsZTE2X3RvX2NwdSh2YWwpOworfQorCitzdGF0aWMgdWludDMyX3QgZWxmMzJfdG9fY3B1KHVpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUodmFsKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9laGRyKEZJTEUgKmZwKQoreworCWlmIChmcmVhZCgmZWhkciwgc2l6ZW9mKGVoZHIpLCAxLCBmcCkgIT0gMSkgeworCQlkaWUoIkNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJaWYgKG1lbWNtcChlaGRyLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgIT0gMCkgeworCQlkaWUoIk5vIEVMRiBtYWdpY1xuIik7CisJfQorCWlmIChlaGRyLmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTMzIpIHsKKwkJZGllKCJOb3QgYSAzMiBiaXQgZXhlY3V0YWJsZVxuIik7CisJfQorCWlmIChlaGRyLmVfaWRlbnRbRUlfREFUQV0gIT0gRUxGREFUQTJMU0IpIHsKKwkJZGllKCJOb3QgYSBMU0IgRUxGIGV4ZWN1dGFibGVcbiIpOworCX0KKwlpZiAoZWhkci5lX2lkZW50W0VJX1ZFUlNJT05dICE9IEVWX0NVUlJFTlQpIHsKKwkJZGllKCJVbmtub3duIEVMRiB2ZXJzaW9uXG4iKTsKKwl9CisJLyogQ29udmVydCB0aGUgZmllbGRzIHRvIG5hdGl2ZSBlbmRpYW4gKi8KKwllaGRyLmVfdHlwZSAgICAgID0gZWxmMTZfdG9fY3B1KGVoZHIuZV90eXBlKTsKKwllaGRyLmVfbWFjaGluZSAgID0gZWxmMTZfdG9fY3B1KGVoZHIuZV9tYWNoaW5lKTsKKwllaGRyLmVfdmVyc2lvbiAgID0gZWxmMzJfdG9fY3B1KGVoZHIuZV92ZXJzaW9uKTsKKwllaGRyLmVfZW50cnkgICAgID0gZWxmMzJfdG9fY3B1KGVoZHIuZV9lbnRyeSk7CisJZWhkci5lX3Bob2ZmICAgICA9IGVsZjMyX3RvX2NwdShlaGRyLmVfcGhvZmYpOworCWVoZHIuZV9zaG9mZiAgICAgPSBlbGYzMl90b19jcHUoZWhkci5lX3Nob2ZmKTsKKwllaGRyLmVfZmxhZ3MgICAgID0gZWxmMzJfdG9fY3B1KGVoZHIuZV9mbGFncyk7CisJZWhkci5lX2Voc2l6ZSAgICA9IGVsZjE2X3RvX2NwdShlaGRyLmVfZWhzaXplKTsKKwllaGRyLmVfcGhlbnRzaXplID0gZWxmMTZfdG9fY3B1KGVoZHIuZV9waGVudHNpemUpOworCWVoZHIuZV9waG51bSAgICAgPSBlbGYxNl90b19jcHUoZWhkci5lX3BobnVtKTsKKwllaGRyLmVfc2hlbnRzaXplID0gZWxmMTZfdG9fY3B1KGVoZHIuZV9zaGVudHNpemUpOworCWVoZHIuZV9zaG51bSAgICAgPSBlbGYxNl90b19jcHUoZWhkci5lX3NobnVtKTsKKwllaGRyLmVfc2hzdHJuZHggID0gZWxmMTZfdG9fY3B1KGVoZHIuZV9zaHN0cm5keCk7CisKKwlpZiAoKGVoZHIuZV90eXBlICE9IEVUX0VYRUMpICYmIChlaGRyLmVfdHlwZSAhPSBFVF9EWU4pKSB7CisJCWRpZSgiVW5zdXBwb3J0ZWQgRUxGIGhlYWRlciB0eXBlXG4iKTsKKwl9CisJaWYgKGVoZHIuZV9tYWNoaW5lICE9IEVNXzM4NikgeworCQlkaWUoIk5vdCBmb3IgeDg2XG4iKTsKKwl9CisJaWYgKGVoZHIuZV92ZXJzaW9uICE9IEVWX0NVUlJFTlQpIHsKKwkJZGllKCJVbmtub3duIEVMRiB2ZXJzaW9uXG4iKTsKKwl9CisJaWYgKGVoZHIuZV9laHNpemUgIT0gc2l6ZW9mKEVsZjMyX0VoZHIpKSB7CisJCWRpZSgiQmFkIEVsZiBoZWFkZXIgc2l6ZVxuIik7CisJfQorCWlmIChlaGRyLmVfcGhlbnRzaXplICE9IHNpemVvZihFbGYzMl9QaGRyKSkgeworCQlkaWUoIkJhZCBwcm9ncmFtIGhlYWRlciBlbnRyeVxuIik7CisJfQorCWlmIChlaGRyLmVfc2hlbnRzaXplICE9IHNpemVvZihFbGYzMl9TaGRyKSkgeworCQlkaWUoIkJhZCBzZWN0aW9uIGhlYWRlciBlbnRyeVxuIik7CisJfQorCWlmIChlaGRyLmVfc2hzdHJuZHggPj0gZWhkci5lX3NobnVtKSB7CisJCWRpZSgiU3RyaW5nIHRhYmxlIGluZGV4IG91dCBvZiBib3VuZHNcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVhZF9zaGRycyhGSUxFICpmcCkKK3sKKwlpbnQgaTsKKwlFbGYzMl9TaGRyIHNoZHI7CisKKwlzZWNzID0gY2FsbG9jKGVoZHIuZV9zaG51bSwgc2l6ZW9mKHN0cnVjdCBzZWN0aW9uKSk7CisJaWYgKCFzZWNzKSB7CisJCWRpZSgiVW5hYmxlIHRvIGFsbG9jYXRlICVkIHNlY3Rpb24gaGVhZGVyc1xuIiwKKwkJICAgIGVoZHIuZV9zaG51bSk7CisJfQorCWlmIChmc2VlayhmcCwgZWhkci5lX3Nob2ZmLCBTRUVLX1NFVCkgPCAwKSB7CisJCWRpZSgiU2VlayB0byAlZCBmYWlsZWQ6ICVzXG4iLAorCQkJZWhkci5lX3Nob2ZmLCBzdHJlcnJvcihlcnJubykpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZWhkci5lX3NobnVtOyBpKyspIHsKKwkJc3RydWN0IHNlY3Rpb24gKnNlYyA9ICZzZWNzW2ldOworCQlpZiAoZnJlYWQoJnNoZHIsIHNpemVvZiBzaGRyLCAxLCBmcCkgIT0gMSkKKwkJCWRpZSgiQ2Fubm90IHJlYWQgRUxGIHNlY3Rpb24gaGVhZGVycyAlZC8lZDogJXNcbiIsCisJCQkgICAgaSwgZWhkci5lX3NobnVtLCBzdHJlcnJvcihlcnJubykpOworCQlzZWMtPnNoZHIuc2hfbmFtZSAgICAgID0gZWxmMzJfdG9fY3B1KHNoZHIuc2hfbmFtZSk7CisJCXNlYy0+c2hkci5zaF90eXBlICAgICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF90eXBlKTsKKwkJc2VjLT5zaGRyLnNoX2ZsYWdzICAgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX2ZsYWdzKTsKKwkJc2VjLT5zaGRyLnNoX2FkZHIgICAgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX2FkZHIpOworCQlzZWMtPnNoZHIuc2hfb2Zmc2V0ICAgID0gZWxmMzJfdG9fY3B1KHNoZHIuc2hfb2Zmc2V0KTsKKwkJc2VjLT5zaGRyLnNoX3NpemUgICAgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX3NpemUpOworCQlzZWMtPnNoZHIuc2hfbGluayAgICAgID0gZWxmMzJfdG9fY3B1KHNoZHIuc2hfbGluayk7CisJCXNlYy0+c2hkci5zaF9pbmZvICAgICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF9pbmZvKTsKKwkJc2VjLT5zaGRyLnNoX2FkZHJhbGlnbiA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX2FkZHJhbGlnbik7CisJCXNlYy0+c2hkci5zaF9lbnRzaXplICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF9lbnRzaXplKTsKKwkJaWYgKHNlYy0+c2hkci5zaF9saW5rIDwgZWhkci5lX3NobnVtKQorCQkJc2VjLT5saW5rID0gJnNlY3Nbc2VjLT5zaGRyLnNoX2xpbmtdOworCX0KKworfQorCitzdGF0aWMgdm9pZCByZWFkX3N0cnRhYnMoRklMRSAqZnApCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsrKSB7CisJCXN0cnVjdCBzZWN0aW9uICpzZWMgPSAmc2Vjc1tpXTsKKwkJaWYgKHNlYy0+c2hkci5zaF90eXBlICE9IFNIVF9TVFJUQUIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNlYy0+c3RydGFiID0gbWFsbG9jKHNlYy0+c2hkci5zaF9zaXplKTsKKwkJaWYgKCFzZWMtPnN0cnRhYikgeworCQkJZGllKCJtYWxsb2Mgb2YgJWQgYnl0ZXMgZm9yIHN0cnRhYiBmYWlsZWRcbiIsCisJCQkJc2VjLT5zaGRyLnNoX3NpemUpOworCQl9CisJCWlmIChmc2VlayhmcCwgc2VjLT5zaGRyLnNoX29mZnNldCwgU0VFS19TRVQpIDwgMCkgeworCQkJZGllKCJTZWVrIHRvICVkIGZhaWxlZDogJXNcbiIsCisJCQkJc2VjLT5zaGRyLnNoX29mZnNldCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlpZiAoZnJlYWQoc2VjLT5zdHJ0YWIsIDEsIHNlYy0+c2hkci5zaF9zaXplLCBmcCkKKwkJICAgICE9IHNlYy0+c2hkci5zaF9zaXplKSB7CisJCQlkaWUoIkNhbm5vdCByZWFkIHN5bWJvbCB0YWJsZTogJXNcbiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmVhZF9zeW10YWJzKEZJTEUgKmZwKQoreworCWludCBpLGo7CisJZm9yIChpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsrKSB7CisJCXN0cnVjdCBzZWN0aW9uICpzZWMgPSAmc2Vjc1tpXTsKKwkJaWYgKHNlYy0+c2hkci5zaF90eXBlICE9IFNIVF9TWU1UQUIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNlYy0+c3ltdGFiID0gbWFsbG9jKHNlYy0+c2hkci5zaF9zaXplKTsKKwkJaWYgKCFzZWMtPnN5bXRhYikgeworCQkJZGllKCJtYWxsb2Mgb2YgJWQgYnl0ZXMgZm9yIHN5bXRhYiBmYWlsZWRcbiIsCisJCQkJc2VjLT5zaGRyLnNoX3NpemUpOworCQl9CisJCWlmIChmc2VlayhmcCwgc2VjLT5zaGRyLnNoX29mZnNldCwgU0VFS19TRVQpIDwgMCkgeworCQkJZGllKCJTZWVrIHRvICVkIGZhaWxlZDogJXNcbiIsCisJCQkJc2VjLT5zaGRyLnNoX29mZnNldCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlpZiAoZnJlYWQoc2VjLT5zeW10YWIsIDEsIHNlYy0+c2hkci5zaF9zaXplLCBmcCkKKwkJICAgICE9IHNlYy0+c2hkci5zaF9zaXplKSB7CisJCQlkaWUoIkNhbm5vdCByZWFkIHN5bWJvbCB0YWJsZTogJXNcbiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgc2VjLT5zaGRyLnNoX3NpemUvc2l6ZW9mKEVsZjMyX1N5bSk7IGorKykgeworCQkJRWxmMzJfU3ltICpzeW0gPSAmc2VjLT5zeW10YWJbal07CisJCQlzeW0tPnN0X25hbWUgID0gZWxmMzJfdG9fY3B1KHN5bS0+c3RfbmFtZSk7CisJCQlzeW0tPnN0X3ZhbHVlID0gZWxmMzJfdG9fY3B1KHN5bS0+c3RfdmFsdWUpOworCQkJc3ltLT5zdF9zaXplICA9IGVsZjMyX3RvX2NwdShzeW0tPnN0X3NpemUpOworCQkJc3ltLT5zdF9zaG5keCA9IGVsZjE2X3RvX2NwdShzeW0tPnN0X3NobmR4KTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCByZWFkX3JlbG9jcyhGSUxFICpmcCkKK3sKKwlpbnQgaSxqOworCWZvciAoaSA9IDA7IGkgPCBlaGRyLmVfc2hudW07IGkrKykgeworCQlzdHJ1Y3Qgc2VjdGlvbiAqc2VjID0gJnNlY3NbaV07CisJCWlmIChzZWMtPnNoZHIuc2hfdHlwZSAhPSBTSFRfUkVMKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlzZWMtPnJlbHRhYiA9IG1hbGxvYyhzZWMtPnNoZHIuc2hfc2l6ZSk7CisJCWlmICghc2VjLT5yZWx0YWIpIHsKKwkJCWRpZSgibWFsbG9jIG9mICVkIGJ5dGVzIGZvciByZWxvY3MgZmFpbGVkXG4iLAorCQkJCXNlYy0+c2hkci5zaF9zaXplKTsKKwkJfQorCQlpZiAoZnNlZWsoZnAsIHNlYy0+c2hkci5zaF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApIHsKKwkJCWRpZSgiU2VlayB0byAlZCBmYWlsZWQ6ICVzXG4iLAorCQkJCXNlYy0+c2hkci5zaF9vZmZzZXQsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJaWYgKGZyZWFkKHNlYy0+cmVsdGFiLCAxLCBzZWMtPnNoZHIuc2hfc2l6ZSwgZnApCisJCSAgICAhPSBzZWMtPnNoZHIuc2hfc2l6ZSkgeworCQkJZGllKCJDYW5ub3QgcmVhZCBzeW1ib2wgdGFibGU6ICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IHNlYy0+c2hkci5zaF9zaXplL3NpemVvZihFbGYzMl9SZWwpOyBqKyspIHsKKwkJCUVsZjMyX1JlbCAqcmVsID0gJnNlYy0+cmVsdGFiW2pdOworCQkJcmVsLT5yX29mZnNldCA9IGVsZjMyX3RvX2NwdShyZWwtPnJfb2Zmc2V0KTsKKwkJCXJlbC0+cl9pbmZvICAgPSBlbGYzMl90b19jcHUocmVsLT5yX2luZm8pOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHByaW50X2Fic29sdXRlX3N5bWJvbHModm9pZCkKK3sKKwlpbnQgaTsKKwlwcmludGYoIkFic29sdXRlIHN5bWJvbHNcbiIpOworCXByaW50ZigiIE51bTogICAgVmFsdWUgU2l6ZSAgVHlwZSAgICAgICBCaW5kICAgICAgICBWaXNpYmlsaXR5ICBOYW1lXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWhkci5lX3NobnVtOyBpKyspIHsKKwkJc3RydWN0IHNlY3Rpb24gKnNlYyA9ICZzZWNzW2ldOworCQljaGFyICpzeW1fc3RydGFiOworCQlpbnQgajsKKworCQlpZiAoc2VjLT5zaGRyLnNoX3R5cGUgIT0gU0hUX1NZTVRBQikgeworCQkJY29udGludWU7CisJCX0KKwkJc3ltX3N0cnRhYiA9IHNlYy0+bGluay0+c3RydGFiOworCQlmb3IgKGogPSAwOyBqIDwgc2VjLT5zaGRyLnNoX3NpemUvc2l6ZW9mKEVsZjMyX1N5bSk7IGorKykgeworCQkJRWxmMzJfU3ltICpzeW07CisJCQljb25zdCBjaGFyICpuYW1lOworCQkJc3ltID0gJnNlYy0+c3ltdGFiW2pdOworCQkJbmFtZSA9IHN5bV9uYW1lKHN5bV9zdHJ0YWIsIHN5bSk7CisJCQlpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fQUJTKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwcmludGYoIiU1ZCAlMDh4ICU1ZCAlMTBzICUxMHMgJTEycyAlc1xuIiwKKwkJCQlqLCBzeW0tPnN0X3ZhbHVlLCBzeW0tPnN0X3NpemUsCisJCQkJc3ltX3R5cGUoRUxGMzJfU1RfVFlQRShzeW0tPnN0X2luZm8pKSwKKwkJCQlzeW1fYmluZChFTEYzMl9TVF9CSU5EKHN5bS0+c3RfaW5mbykpLAorCQkJCXN5bV92aXNpYmlsaXR5KEVMRjMyX1NUX1ZJU0lCSUxJVFkoc3ltLT5zdF9vdGhlcikpLAorCQkJCW5hbWUpOworCQl9CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfYWJzb2x1dGVfcmVsb2NzKHZvaWQpCit7CisJaW50IGksIHByaW50ZWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsrKSB7CisJCXN0cnVjdCBzZWN0aW9uICpzZWMgPSAmc2Vjc1tpXTsKKwkJc3RydWN0IHNlY3Rpb24gKnNlY19hcHBsaWVzLCAqc2VjX3N5bXRhYjsKKwkJY2hhciAqc3ltX3N0cnRhYjsKKwkJRWxmMzJfU3ltICpzaF9zeW10YWI7CisJCWludCBqOworCQlpZiAoc2VjLT5zaGRyLnNoX3R5cGUgIT0gU0hUX1JFTCkgeworCQkJY29udGludWU7CisJCX0KKwkJc2VjX3N5bXRhYiAgPSBzZWMtPmxpbms7CisJCXNlY19hcHBsaWVzID0gJnNlY3Nbc2VjLT5zaGRyLnNoX2luZm9dOworCQlpZiAoIShzZWNfYXBwbGllcy0+c2hkci5zaF9mbGFncyAmIFNIRl9BTExPQykpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNoX3N5bXRhYiAgPSBzZWNfc3ltdGFiLT5zeW10YWI7CisJCXN5bV9zdHJ0YWIgPSBzZWNfc3ltdGFiLT5saW5rLT5zdHJ0YWI7CisJCWZvciAoaiA9IDA7IGogPCBzZWMtPnNoZHIuc2hfc2l6ZS9zaXplb2YoRWxmMzJfUmVsKTsgaisrKSB7CisJCQlFbGYzMl9SZWwgKnJlbDsKKwkJCUVsZjMyX1N5bSAqc3ltOworCQkJY29uc3QgY2hhciAqbmFtZTsKKwkJCXJlbCA9ICZzZWMtPnJlbHRhYltqXTsKKwkJCXN5bSA9ICZzaF9zeW10YWJbRUxGMzJfUl9TWU0ocmVsLT5yX2luZm8pXTsKKwkJCW5hbWUgPSBzeW1fbmFtZShzeW1fc3RydGFiLCBzeW0pOworCQkJaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX0FCUykgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBBYnNvbHV0ZSBzeW1ib2xzIGFyZSBub3QgcmVsb2NhdGVkIGlmIGJ6SW1hZ2UgaXMKKwkJCSAqIGxvYWRlZCBhdCBhIG5vbi1jb21waWxlZCBhZGRyZXNzLiBEaXNwbGF5IGEgd2FybmluZworCQkJICogdG8gdXNlciBhdCBjb21waWxlIHRpbWUgYWJvdXQgdGhlIGFic29sdXRlCisJCQkgKiByZWxvY2F0aW9ucyBwcmVzZW50LgorCQkJICoKKwkJCSAqIFVzZXIgbmVlZCB0byBhdWRpdCB0aGUgY29kZSB0byBtYWtlIHN1cmUKKwkJCSAqIHNvbWUgc3ltYm9scyB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHNlY3Rpb24KKwkJCSAqIHJlbGF0aXZlIGhhdmUgbm90IGJlY29tZSBhYnNvbHV0ZSBiZWNhdXNlIG9mIHNvbWUKKwkJCSAqIGxpbmtlciBvcHRpbWl6YXRpb24gb3Igd3JvbmcgcHJvZ3JhbW1pbmcgdXNhZ2UuCisJCQkgKgorCQkJICogQmVmb3JlIHdhcm5pbmcgY2hlY2sgaWYgdGhpcyBhYnNvbHV0ZSBzeW1ib2wKKwkJCSAqIHJlbG9jYXRpb24gaXMgaGFybWxlc3MuCisJCQkgKi8KKwkJCWlmIChpc19yZWxvYyhTX0FCUywgbmFtZSkgfHwgaXNfcmVsb2MoU19SRUwsIG5hbWUpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIXByaW50ZWQpIHsKKwkJCQlwcmludGYoIldBUk5JTkc6IEFic29sdXRlIHJlbG9jYXRpb25zIgorCQkJCQkiIHByZXNlbnRcbiIpOworCQkJCXByaW50ZigiT2Zmc2V0ICAgICBJbmZvICAgICBUeXBlICAgICBTeW0uVmFsdWUgIgorCQkJCQkiU3ltLk5hbWVcbiIpOworCQkJCXByaW50ZWQgPSAxOworCQkJfQorCisJCQlwcmludGYoIiUwOHggJTA4eCAlMTBzICUwOHggICVzXG4iLAorCQkJCXJlbC0+cl9vZmZzZXQsCisJCQkJcmVsLT5yX2luZm8sCisJCQkJcmVsX3R5cGUoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSksCisJCQkJc3ltLT5zdF92YWx1ZSwKKwkJCQluYW1lKTsKKwkJfQorCX0KKworCWlmIChwcmludGVkKQorCQlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHdhbGtfcmVsb2NzKHZvaWQgKCp2aXNpdCkoRWxmMzJfUmVsICpyZWwsIEVsZjMyX1N5bSAqc3ltKSwKKwkJCWludCB1c2VfcmVhbF9tb2RlKQoreworCWludCBpOworCS8qIFdhbGsgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZWhkci5lX3NobnVtOyBpKyspIHsKKwkJY2hhciAqc3ltX3N0cnRhYjsKKwkJRWxmMzJfU3ltICpzaF9zeW10YWI7CisJCXN0cnVjdCBzZWN0aW9uICpzZWNfYXBwbGllcywgKnNlY19zeW10YWI7CisJCWludCBqOworCQlzdHJ1Y3Qgc2VjdGlvbiAqc2VjID0gJnNlY3NbaV07CisKKwkJaWYgKHNlYy0+c2hkci5zaF90eXBlICE9IFNIVF9SRUwpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNlY19zeW10YWIgID0gc2VjLT5saW5rOworCQlzZWNfYXBwbGllcyA9ICZzZWNzW3NlYy0+c2hkci5zaF9pbmZvXTsKKwkJaWYgKCEoc2VjX2FwcGxpZXMtPnNoZHIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlzaF9zeW10YWIgPSBzZWNfc3ltdGFiLT5zeW10YWI7CisJCXN5bV9zdHJ0YWIgPSBzZWNfc3ltdGFiLT5saW5rLT5zdHJ0YWI7CisJCWZvciAoaiA9IDA7IGogPCBzZWMtPnNoZHIuc2hfc2l6ZS9zaXplb2YoRWxmMzJfUmVsKTsgaisrKSB7CisJCQlFbGYzMl9SZWwgKnJlbDsKKwkJCUVsZjMyX1N5bSAqc3ltOworCQkJdW5zaWduZWQgcl90eXBlOworCQkJY29uc3QgY2hhciAqc3ltbmFtZTsKKwkJCWludCBzaG5fYWJzOworCisJCQlyZWwgPSAmc2VjLT5yZWx0YWJbal07CisJCQlzeW0gPSAmc2hfc3ltdGFiW0VMRjMyX1JfU1lNKHJlbC0+cl9pbmZvKV07CisJCQlyX3R5cGUgPSBFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pOworCisJCQlzaG5fYWJzID0gc3ltLT5zdF9zaG5keCA9PSBTSE5fQUJTOworCisJCQlzd2l0Y2ggKHJfdHlwZSkgeworCQkJY2FzZSBSXzM4Nl9OT05FOgorCQkJY2FzZSBSXzM4Nl9QQzMyOgorCQkJY2FzZSBSXzM4Nl9QQzE2OgorCQkJY2FzZSBSXzM4Nl9QQzg6CisJCQljYXNlIFJfMzg2X0dPVFBDOgorCQkJY2FzZSBSXzM4Nl9HT1RPRkY6CisJCQljYXNlIFJfMzg2X0dPVDMyOgorCQkJY2FzZSBSXzM4Nl9QTFQzMjoKKwkJCQkvKgorCQkJCSAqIE5PTkUgY2FuIGJlIGlnbm9yZWQgYW5kIGFuZCBQQyByZWxhdGl2ZQorCQkJCSAqIHJlbG9jYXRpb25zIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuCisJCQkJICovCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUl8zODZfMTY6CisJCQkJc3ltbmFtZSA9IHN5bV9uYW1lKHN5bV9zdHJ0YWIsIHN5bSk7CisJCQkJaWYgKCF1c2VfcmVhbF9tb2RlKQorCQkJCQlnb3RvIGJhZDsKKwkJCQlpZiAoc2huX2FicykgeworCQkJCQlpZiAoaXNfcmVsb2MoU19BQlMsIHN5bW5hbWUpKQorCQkJCQkJYnJlYWs7CisJCQkJCWVsc2UgaWYgKCFpc19yZWxvYyhTX1NFRywgc3ltbmFtZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoaXNfcmVsb2MoU19MSU4sIHN5bW5hbWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWVsc2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl2aXNpdChyZWwsIHN5bSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUl8zODZfMzI6CisJCQkJc3ltbmFtZSA9IHN5bV9uYW1lKHN5bV9zdHJ0YWIsIHN5bSk7CisJCQkJaWYgKHNobl9hYnMpIHsKKwkJCQkJaWYgKGlzX3JlbG9jKFNfQUJTLCBzeW1uYW1lKSkKKwkJCQkJCWJyZWFrOworCQkJCQllbHNlIGlmICghaXNfcmVsb2MoU19SRUwsIHN5bW5hbWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHVzZV9yZWFsX21vZGUgJiYKKwkJCQkJICAgICFpc19yZWxvYyhTX0xJTiwgc3ltbmFtZSkpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdmlzaXQocmVsLCBzeW0pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkaWUoIlVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZTogJXMgKCVkKVxuIiwKKwkJCQkgICAgcmVsX3R5cGUocl90eXBlKSwgcl90eXBlKTsKKwkJCQlicmVhazsKKwkJCWJhZDoKKwkJCQlzeW1uYW1lID0gc3ltX25hbWUoc3ltX3N0cnRhYiwgc3ltKTsKKwkJCQlkaWUoIkludmFsaWQgJXMgJXMgcmVsb2NhdGlvbjogJXNcbiIsCisJCQkJICAgIHNobl9hYnMgPyAiYWJzb2x1dGUiIDogInJlbGF0aXZlIiwKKwkJCQkgICAgcmVsX3R5cGUocl90eXBlKSwgc3ltbmFtZSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvdW50X3JlbG9jKEVsZjMyX1JlbCAqcmVsLCBFbGYzMl9TeW0gKnN5bSkKK3sKKwkodm9pZClzeW07CisKKwlpZiAoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM4Nl8xNikKKwkJcmVsb2MxNl9jb3VudCsrOworCWVsc2UKKwkJcmVsb2NfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQgY29sbGVjdF9yZWxvYyhFbGYzMl9SZWwgKnJlbCwgRWxmMzJfU3ltICpzeW0pCit7CisJKHZvaWQpc3ltOworCisJLyogUmVtZW1iZXIgdGhlIGFkZHJlc3MgdGhhdCBuZWVkcyB0byBiZSBhZGp1c3RlZC4gKi8KKwlpZiAoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM4Nl8xNikKKwkJcmVsb2NzMTZbcmVsb2MxNl9pZHgrK10gPSByZWwtPnJfb2Zmc2V0OworCWVsc2UKKwkJcmVsb2NzW3JlbG9jX2lkeCsrXSA9IHJlbC0+cl9vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgY21wX3JlbG9jcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqYSwgKmI7CisJYSA9IHZhOyBiID0gdmI7CisJcmV0dXJuICgqYSA9PSAqYik/IDAgOiAoKmEgPiAqYik/IDEgOiAtMTsKK30KKworc3RhdGljIGludCB3cml0ZTMyKHVuc2lnbmVkIGludCB2LCBGSUxFICpmKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzRdOworCisJcHV0X3VuYWxpZ25lZF9sZTMyKHYsIGJ1Zik7CisJcmV0dXJuIGZ3cml0ZShidWYsIDEsIDQsIGYpID09IDQgPyAwIDogLTE7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfcmVsb2NzKGludCBhc190ZXh0LCBpbnQgdXNlX3JlYWxfbW9kZSkKK3sKKwlpbnQgaTsKKwkvKiBDb3VudCBob3cgbWFueSByZWxvY2F0aW9ucyBJIGhhdmUgYW5kIGFsbG9jYXRlIHNwYWNlIGZvciB0aGVtLiAqLworCXJlbG9jX2NvdW50ID0gMDsKKwl3YWxrX3JlbG9jcyhjb3VudF9yZWxvYywgdXNlX3JlYWxfbW9kZSk7CisJcmVsb2NzID0gbWFsbG9jKHJlbG9jX2NvdW50ICogc2l6ZW9mKHJlbG9jc1swXSkpOworCWlmICghcmVsb2NzKSB7CisJCWRpZSgibWFsbG9jIG9mICVkIGVudHJpZXMgZm9yIHJlbG9jcyBmYWlsZWRcbiIsCisJCQlyZWxvY19jb3VudCk7CisJfQorCisJcmVsb2NzMTYgPSBtYWxsb2MocmVsb2MxNl9jb3VudCAqIHNpemVvZihyZWxvY3NbMF0pKTsKKwlpZiAoIXJlbG9jczE2KSB7CisJCWRpZSgibWFsbG9jIG9mICVkIGVudHJpZXMgZm9yIHJlbG9jczE2IGZhaWxlZFxuIiwKKwkJCXJlbG9jMTZfY291bnQpOworCX0KKwkvKiBDb2xsZWN0IHVwIHRoZSByZWxvY2F0aW9ucyAqLworCXJlbG9jX2lkeCA9IDA7CisJd2Fsa19yZWxvY3MoY29sbGVjdF9yZWxvYywgdXNlX3JlYWxfbW9kZSk7CisKKwlpZiAocmVsb2MxNl9jb3VudCAmJiAhdXNlX3JlYWxfbW9kZSkKKwkJZGllKCJTZWdtZW50IHJlbG9jYXRpb25zIGZvdW5kIGJ1dCAtLXJlYWxtb2RlIG5vdCBzcGVjaWZpZWRcbiIpOworCisJLyogT3JkZXIgdGhlIHJlbG9jYXRpb25zIGZvciBtb3JlIGVmZmljaWVudCBwcm9jZXNzaW5nICovCisJcXNvcnQocmVsb2NzLCByZWxvY19jb3VudCwgc2l6ZW9mKHJlbG9jc1swXSksIGNtcF9yZWxvY3MpOworCXFzb3J0KHJlbG9jczE2LCByZWxvYzE2X2NvdW50LCBzaXplb2YocmVsb2NzMTZbMF0pLCBjbXBfcmVsb2NzKTsKKworCS8qIFByaW50IHRoZSByZWxvY2F0aW9ucyAqLworCWlmIChhc190ZXh0KSB7CisJCS8qIFByaW50IHRoZSByZWxvY2F0aW9ucyBpbiBhIGZvcm0gc3VpdGFibGUgdGhhdAorCQkgKiBnYXMgd2lsbCBsaWtlLgorCQkgKi8KKwkJcHJpbnRmKCIuc2VjdGlvbiBcIi5kYXRhLnJlbG9jXCIsXCJhXCJcbiIpOworCQlwcmludGYoIi5iYWxpZ24gNFxuIik7CisJCWlmICh1c2VfcmVhbF9tb2RlKSB7CisJCQlwcmludGYoIlx0LmxvbmcgJWx1XG4iLCByZWxvYzE2X2NvdW50KTsKKwkJCWZvciAoaSA9IDA7IGkgPCByZWxvYzE2X2NvdW50OyBpKyspCisJCQkJcHJpbnRmKCJcdC5sb25nIDB4JTA4bHhcbiIsIHJlbG9jczE2W2ldKTsKKwkJCXByaW50ZigiXHQubG9uZyAlbHVcbiIsIHJlbG9jX2NvdW50KTsKKwkJCWZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKSB7CisJCQkJcHJpbnRmKCJcdC5sb25nIDB4JTA4bHhcbiIsIHJlbG9jc1tpXSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykgeworCQkJCXByaW50ZigiXHQubG9uZyAweCUwOGx4XG4iLCByZWxvY3NbaV0pOworCQkJfQorCQkJLyogUHJpbnQgYSBzdG9wICovCisJCQlwcmludGYoIlx0LmxvbmcgMHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpMCk7CisJCX0KKworCQlwcmludGYoIlxuIik7CisJfQorCWVsc2UgeworCQlpZiAodXNlX3JlYWxfbW9kZSkgeworCQkJd3JpdGUzMihyZWxvYzE2X2NvdW50LCBzdGRvdXQpOworCQkJZm9yIChpID0gMDsgaSA8IHJlbG9jMTZfY291bnQ7IGkrKykKKwkJCQl3cml0ZTMyKHJlbG9jczE2W2ldLCBzdGRvdXQpOworCQkJd3JpdGUzMihyZWxvY19jb3VudCwgc3Rkb3V0KTsKKworCQkJLyogTm93IHByaW50IGVhY2ggcmVsb2NhdGlvbiAqLworCQkJZm9yIChpID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyspCisJCQkJd3JpdGUzMihyZWxvY3NbaV0sIHN0ZG91dCk7CisJCX0gZWxzZSB7CisJCQkvKiBOb3cgcHJpbnQgZWFjaCByZWxvY2F0aW9uICovCisJCQlmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykgeworCQkJCXdyaXRlMzIocmVsb2NzW2ldLCBzdGRvdXQpOworCQkJfQorCisJCQkvKiBQcmludCBhIHN0b3AgKi8KKwkJCXdyaXRlMzIoMCwgc3Rkb3V0KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlkaWUoInJlbG9jcyBbLS1hYnMtc3ltc3wtLWFicy1yZWxvY3N8LS10ZXh0fC0tcmVhbG1vZGVdIHZtbGludXhcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHNob3dfYWJzb2x1dGVfc3ltcywgc2hvd19hYnNvbHV0ZV9yZWxvY3M7CisJaW50IGFzX3RleHQsIHVzZV9yZWFsX21vZGU7CisJY29uc3QgY2hhciAqZm5hbWU7CisJRklMRSAqZnA7CisJaW50IGk7CisKKwlzaG93X2Fic29sdXRlX3N5bXMgPSAwOworCXNob3dfYWJzb2x1dGVfcmVsb2NzID0gMDsKKwlhc190ZXh0ID0gMDsKKwl1c2VfcmVhbF9tb2RlID0gMDsKKwlmbmFtZSA9IE5VTEw7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmIChzdHJjbXAoYXJnLCAiLS1hYnMtc3ltcyIpID09IDApIHsKKwkJCQlzaG93X2Fic29sdXRlX3N5bXMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHN0cmNtcChhcmcsICItLWFicy1yZWxvY3MiKSA9PSAwKSB7CisJCQkJc2hvd19hYnNvbHV0ZV9yZWxvY3MgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHN0cmNtcChhcmcsICItLXRleHQiKSA9PSAwKSB7CisJCQkJYXNfdGV4dCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoc3RyY21wKGFyZywgIi0tcmVhbG1vZGUiKSA9PSAwKSB7CisJCQkJdXNlX3JlYWxfbW9kZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIWZuYW1lKSB7CisJCQlmbmFtZSA9IGFyZzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKCk7CisJfQorCWlmICghZm5hbWUpIHsKKwkJdXNhZ2UoKTsKKwl9CisJcmVnZXhfaW5pdCh1c2VfcmVhbF9tb2RlKTsKKwlmcCA9IGZvcGVuKGZuYW1lLCAiciIpOworCWlmICghZnApIHsKKwkJZGllKCJDYW5ub3Qgb3BlbiAlczogJXNcbiIsCisJCQlmbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJcmVhZF9laGRyKGZwKTsKKwlyZWFkX3NoZHJzKGZwKTsKKwlyZWFkX3N0cnRhYnMoZnApOworCXJlYWRfc3ltdGFicyhmcCk7CisJcmVhZF9yZWxvY3MoZnApOworCWlmIChzaG93X2Fic29sdXRlX3N5bXMpIHsKKwkJcHJpbnRfYWJzb2x1dGVfc3ltYm9scygpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNob3dfYWJzb2x1dGVfcmVsb2NzKSB7CisJCXByaW50X2Fic29sdXRlX3JlbG9jcygpOworCQlyZXR1cm4gMDsKKwl9CisJZW1pdF9yZWxvY3MoYXNfdGV4dCwgdXNlX3JlYWxfbW9kZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb3JlL01ha2VmaWxlIGIvY29yZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDBhY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9NYWtlZmlsZQpAQCAtMCwwICsxLDI1OCBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAxOTk4LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5LTIwMTQgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjCisjIE1ha2VmaWxlIGZvciB0aGUgU1lTTElOVVggY29yZQorIworCitWUEFUSCA9ICQoU1JDKQorCisjIE5vIGJ1aWx0aW4gcnVsZXMKK01BS0VGTEFHUyArPSAtcgorTUFLRSAgICAgICs9IC1yCisKK2luY2x1ZGUgJChNQUtFRElSKS9lbWJlZGRlZC5taworLWluY2x1ZGUgJChvYmpkaXIpL3ZlcnNpb24ubWsKKworT1BURkxBR1MgPQorSU5DTFVERVMgPSAtSSQoU1JDKS9pbmNsdWRlIC1JJChjb20zMikvaW5jbHVkZSAtSSQoY29tMzIpL2luY2x1ZGUvc3lzIC1JJChjb20zMikvbGliIFwKKwktSSQoU1JDKS9sd2lwL3NyYy9pbmNsdWRlIC1JJChTUkMpL2x3aXAvc3JjL2luY2x1ZGUvaXB2NCAtSSQoU1JDKS9mcy9weGUKKworIyBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byBjcDQzNzsgdGVjaG5pY2FsbHkgaXQncyBmb3IgTm9yd2F5IGFuZCBEZW5tYXJrLAorIyBidXQgaXQncyB1bmxpa2VseSB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgd2lsbCBiZSB1c2VkIGluCisjIGZpbGVuYW1lcyBieSBvdGhlciB1c2Vycy4KK0NPREVQQUdFID0gY3A4NjUKKworIyBUaGUgdGFyZ2V0cyB0byBidWlsZCBpbiB0aGlzIGRpcmVjdG9yeS4uLgorQlRBUkdFVCAgPSBrd2RoYXNoLmdlbiBcCisJICAgbGRsaW51eC5ic3MgbGRsaW51eC5zeXMgbGRsaW51eC5iaW4gXAorCSAgIGlzb2xpbnV4LmJpbiBpc29saW51eC1kZWJ1Zy5iaW4gcHhlbGludXguMCBscHhlbGludXguMAorCisjIEFsbCBwcmltYXJ5IHNvdXJjZSBmaWxlcyBmb3IgdGhlIG1haW4gc3lzbGludXggZmlsZXMKK05BU01TUkMJIDo9ICQod2lsZGNhcmQgJChTUkMpLyouYXNtKQorTkFTTUhEUiAgOj0gJCh3aWxkY2FyZCAkKFNSQykvKi5pbmMpCitDU1JDCSA6PSAkKHNoZWxsIGZpbmQgJChTUkMpIC1uYW1lICcqLmMnIC1wcmludCkKK1NTUkMJIDo9ICQoc2hlbGwgZmluZCAkKFNSQykgLW5hbWUgJyouUycgLXByaW50KQorQ0hEUgkgOj0gJChzaGVsbCBmaW5kICQoU1JDKSAtbmFtZSAnKi5oJyAtcHJpbnQpCitPVEhFUlNSQyA6PSBrZXl3b3JkcworQUxMU1JDICAgID0gJChOQVNNU1JDKSAkKE5BU01IRFIpICQoQ1NSQykgJChTU1JDKSAkKENIRFIpICQoT1RIRVJTUkMpCisKK0NPQkoJIDo9ICQoc3Vic3QgJChTUkMpLywsJChwYXRzdWJzdCAlLmMsJS5vLCQoQ1NSQykpKQorU09CSgkgOj0gJChzdWJzdCAkKFNSQykvLCwkKHBhdHN1YnN0ICUuUywlLm8sJChTU1JDKSkpCisKKyMgVG8gbWFrZSB0aGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZm9sbG93aW5nICQoZmlsdGVyLW91dCksIG1ha2Ugc3VyZQorIyB3ZSBwcmVmaXggZXZlcnl0aGluZyB3aXRoICQoU1JDKQorQ09SRV9QWEVfQ1NSQyA9IFwKKwkkKGFkZHByZWZpeCAkKFNSQykvZnMvcHhlLywgZGhjcF9vcHRpb24uYyBweGUuYyB0ZnRwLmMgdXJscGFyc2UuYyBiaW9zLmMpCisKK0xQWEVMSU5VWF9DU1JDID0gJChDT1JFX1BYRV9DU1JDKSBcCisJJChzaGVsbCBmaW5kICQoU1JDKS9sd2lwIC1uYW1lICcqLmMnIC1wcmludCkgXAorCSQoYWRkcHJlZml4ICQoU1JDKS9mcy9weGUvLCBcCisJCWNvcmUuYyBkbnNyZXNvbHYuYyBmdHAuYyBmdHBfcmVhZGRpci5jIGdweGV1cmwuYyBodHRwLmMgXAorCQlodHRwX3JlYWRkaXIuYyBpZGxlLmMgaXNyLmMgdGNwLmMpCisKK1BYRUxJTlVYX0NTUkMgPSAkKENPUkVfUFhFX0NTUkMpIFwKKwkkKHNoZWxsIGZpbmQgJChTUkMpL2xlZ2FjeW5ldCAtbmFtZSAnKi5jJyAtcHJpbnQpCisKK0xQWEVMSU5VWF9PQkpTID0gJChzdWJzdCAkKFNSQykvLCwkKExQWEVMSU5VWF9DU1JDOiUuYz0lLm8pKQorUFhFTElOVVhfT0JKUyAgPSAkKHN1YnN0ICQoU1JDKS8sLCQoUFhFTElOVVhfQ1NSQzolLmM9JS5vKSkKKworVU5JVFRFU1RfQ1NSQyA9ICQoc2hlbGwgZmluZCAkKFNSQykgLXBhdGggJyovdGVzdHMvKi5jJyAtcHJpbnQpCitVTklUVEVTVF9PQkpTID0gJChzdWJzdCAkKFNSQykvLCwkKFVOSVRURVNUX0NTUkM6JS5jPSUubykpCisKKyMgRG9uJ3QgaW5jbHVkZSBjb25zb2xlIGFuZCBuZXR3b3JrIHN0YWNrIHNwZWNpZmljIG9iamVjdHMgb3IgdW5pdCB0ZXN0cworRklMVEVSX09CSlMgPSAlcmF3Y29uLm8gJXBsYWluY29uLm8gJXB4ZWxpbnV4LWMubyAlbGRsaW51eC1jLm8gXAorCSVpc29saW51eC1jLm8gJWxvY2FsYm9vdC5vICVweGVib290Lm8gXAorCSQoc3Vic3QgJChPQkopLywsJChVTklUVEVTVF9PQkpTKSkgXAorCSQoc3Vic3QgJChPQkopLywsJChMUFhFTElOVVhfT0JKUykpIFwKKwkkKHN1YnN0ICQoT0JKKS8sLCQoUFhFTElOVVhfT0JKUykpCisKK2lmZGVmIEVGSV9CVUlMRAorIyBFRkkgaXMgc2luZ2xlLXRocmVhZGVkLCBhbmQgZG9lc24ndCB1c2UgdGhlIExaTyBhc3NlbWJseSBkZWNvZGVyCitGSUxURVJfT0JKUyArPSAkKHN1YnN0ICQoU1JDKS8sLCBcCisJJChwYXRzdWJzdCAlLlMsJS5vLCAkKHdpbGRjYXJkICQoU1JDKS9sem8vKi5TKSkgXAorCSQocGF0c3Vic3QgJS5jLCUubywgJCh3aWxkY2FyZCAkKFNSQykvdGhyZWFkLyouYykpIFwKKwkkKHBhdHN1YnN0ICUuUywlLm8sICQod2lsZGNhcmQgJChTUkMpL3RocmVhZC8qLlMpKSkKK2VuZGlmCisKK0NPQkpTCSA9ICQoZmlsdGVyLW91dCAkKEZJTFRFUl9PQkpTKSwkKENPQkopKQorU09CSlMJID0gJChmaWx0ZXItb3V0ICQoRklMVEVSX09CSlMpLCQoU09CSikpCisKK2lmZGVmIEVGSV9CVUlMRAorQ09CSlMgKz0gJChzdWJzdCAkKFNSQykvLCwkKENPUkVfUFhFX0NTUkM6JS5jPSUubykgZnMvcHhlL2Z0cC5vIGZzL3B4ZS9mdHBfcmVhZGRpci5vIFwKKwlmcy9weGUvaHR0cC5vIGZzL3B4ZS9odHRwX3JlYWRkaXIubykKK2VuZGlmCisKK0xJQgkgPSBsaWJjb20zMi5hCitMSUJTCSA9ICQoTElCKSAtLXdob2xlLWFyY2hpdmUgJChvYmpkaXIpL2NvbTMyL2xpYi9saWJjb20zMmNvcmUuYQorTElCREVQICAgPSAkKGZpbHRlci1vdXQgLSUgJXN0YXJ0JSwkKExJQlMpKQorTElCT0JKUwkgPSAkKENPQkpTKSAkKFNPQkpTKQorCitOQVNNREVCVUcgPSAtZyAtRiBkd2FyZgorTkFTTU9QVCAgKz0gJChOQVNNREVCVUcpCisKK1BSRVBDT1JFID0gJChPQkopLy4uL2x6by9wcmVwY29yZQorCitDRkxBR1MgKz0gLURfX1NZU0xJTlVYX0NPUkVfXyAtRF9fRklSTVdBUkVfJChGSVJNV0FSRSlfXyBcCisJICAtSSQob2JqZGlyKSAtRExETElOVVg9XCIkKExETElOVVgpXCIKKworIyBUaGUgREFURSBpcyBzZXQgb24gdGhlIG1ha2UgY29tbWFuZCBsaW5lIHdoZW4gYnVpbGRpbmcgYmluYXJpZXMgZm9yCisjIG9mZmljaWFsIHJlbGVhc2UuICBPdGhlcndpc2UsIHN1YnN0aXR1dGUgYSBoZXggc3RyaW5nIHRoYXQgaXMgcHJldHR5IG11Y2gKKyMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgdG8gYmUgdW5pcXVlIGZyb20gYnVpbGQgdG8gYnVpbGQuCitpZm5kZWYgSEVYREFURQorSEVYREFURSA6PSAkKHNoZWxsICQoUEVSTCkgJChTUkMpLy4uL25vdy5wbCAkKFNSQ1MpKQorZW5kaWYKK2lmbmRlZiBEQVRFCitEQVRFICAgIDo9ICQoc2hlbGwgc2ggJChTUkMpLy4uL2dlbi1pZC5zaCAkKFZFUlNJT04pICQoSEVYREFURSkpCitlbmRpZgorCisjIFNldCB1cCB0aGUgTkFTTSBhbmQgTEQgb3B0aW9ucyBmb3IgdGhlIGFyY2hpdGVjdHVyZQorTkFTTV9FTEYgPSAidW5rbm93biIKK0xEX1BJRSA9ICJ1bmtub3duIgoraWZlcSAoJChBUkNIKSxpMzg2KQorCU5BU01fRUxGID0gZWxmCisJTERfUElFID0gLXBpZQorZW5kaWYKK2lmZXEgKCQoQVJDSCkseDg2XzY0KQorCU5BU01fRUxGID0gZWxmNjQKKwkjTERfUElFID0gLS1waWMtZXhlY3V0YWJsZQorCUxEX1BJRSA9IAorZW5kaWYKKworaWZkZWYgRUZJX0JVSUxECithbGw6IG1ha2VvdXRwdXRkaXJzICQoZmlsdGVyLW91dCAlYmlvcy5vLCQoQ09CSlMpICQoU09CSlMpKSBjb2RlcGFnZS5vCitlbHNlCithbGw6IG1ha2VvdXRwdXRkaXJzICQoQlRBUkdFVCkKK2VuZGlmCisKK21ha2VvdXRwdXRkaXJzOgorCUBta2RpciAtcCAkKHNvcnQgJChkaXIgJChDT0JKKSAkKFNPQkopKSkKKwora3dkaGFzaC5nZW46IGtleXdvcmRzIGdlbmhhc2gucGwKKwkkKFBFUkwpICQoU1JDKS9nZW5oYXNoLnBsIDwgJChTUkMpL2tleXdvcmRzID4gJChPQkopL2t3ZGhhc2guZ2VuCisKKy5QUkVDSU9VUzogJS5lbGYKKworJS5yYXc6ICUuZWxmCisJJChPQkpDT1BZKSAtTyBiaW5hcnkgLVMgJDwgJChAOi5iaW49LnJhdykKKworIyBHTlUgbWFrZSAzLjgyIGdldHMgY29uZnVzZWQgYnkgdGhlIGZpcnN0IGZvcm0KKy5QUkVDSU9VUzogJChPQkopLyUucmF3CisKKyUuYmluOiAlLnJhdyAkKFBSRVBDT1JFKQorCSQoUFJFUENPUkUpICQ8ICRACisKKyUubzogJS5hc20ga3dkaGFzaC5nZW4gJChPQkopLy4uL3ZlcnNpb24uZ2VuCisJJChOQVNNKSAtZiAkKE5BU01fRUxGKSAkKE5BU01PUFQpIC1EREFURV9TVFI9IickKERBVEUpJyIgXAorCQktREhFWERBVEU9IiQoSEVYREFURSkiIFwKKwkJLUQkKEFSQ0gpIFwKKwkJLUkkKFNSQykvIFwKKwkJLWwgJChAOi5vPS5sc3IpIC1vICRAIC1NUCAtTUQgJChkaXIgJEApLiQobm90ZGlyICRAKS5kICQ8CisKK0FVWExJQlMgPSBsaWJpc29saW51eC5hIGxpYmlzb2xpbnV4LWRlYnVnLmEgbGlibGRsaW51eC5hIFwKKwlsaWJweGVsaW51eC5hIGxpYmxweGVsaW51eC5hCitMRFNDUklQVCA9ICQoU1JDKS8kKEFSQ0gpL3N5c2xpbnV4LmxkCisKKyUuZWxmOiAlLm8gJChMSUJERVApICQoTERTQ1JJUFQpICQoQVVYTElCUykKKwkkKExEKSAkKExERkxBR1MpIC1Cc3ltYm9saWMgJChMRF9QSUUpIC1FIC0taGFzaC1zdHlsZT1nbnUgLVQgJChMRFNDUklQVCkgLU0gLW8gJEAgJDwgXAorCQktLXN0YXJ0LWdyb3VwICQoTElCUykgJChzdWJzdCAkKCpGKS5lbGYsbGliJCgqRikuYSwkQCkgLS1lbmQtZ3JvdXAgXAorCQk+ICQoQDouZWxmPS5tYXApCisJJChPQkpEVU1QKSAtaCAkQCA+ICQoQDouZWxmPS5zZWMpCisJJChQRVJMKSAkKFNSQykvbHN0YWRqdXN0LnBsICQoQDouZWxmPS5sc3IpICQoQDouZWxmPS5zZWMpICQoQDouZWxmPS5sc3QpCisKK2xpYmlzb2xpbnV4LmE6IHJhd2Nvbi5vIGxvY2FsYm9vdC5vIGlzb2xpbnV4LWMubworCXJtIC1mICRACisJJChBUikgY3EgJEAgJF4KKwkkKFJBTkxJQikgJEAKKworbGliaXNvbGludXgtZGVidWcuYTogbGliaXNvbGludXguYQorCWNwICReICRACisKKyMgTGVnYWN5IG5ldHdvcmsgc3RhY2sKK2xpYnB4ZWxpbnV4LmE6IHJhd2Nvbi5vIHB4ZWJvb3QubyBweGVsaW51eC1jLm8gJChQWEVMSU5VWF9PQkpTKQorCXJtIC1mICRACisJJChBUikgY3EgJEAgJF4KKwkkKFJBTkxJQikgJEAKKworIyBMd0lQIG5ldHdvcmsgc3RhY2sKK2xpYmxweGVsaW51eC5hOiByYXdjb24ubyBweGVib290Lm8gcHhlbGludXgtYy5vICQoTFBYRUxJTlVYX09CSlMpCisJcm0gLWYgJEAKKwkkKEFSKSBjcSAkQCAkXgorCSQoUkFOTElCKSAkQAorCitsaWJsZGxpbnV4LmE6IHBsYWluY29uLm8gbG9jYWxib290Lm8gbGRsaW51eC1jLm8KKwlybSAtZiAkQAorCSQoQVIpIGNxICRAICReCisJJChSQU5MSUIpICRACisKKyQoTElCKTogJChMSUJPQkpTKQorCXJtIC1mICRACisJJChBUikgY3EgJEAgJF4KKwkkKFJBTkxJQikgJEAKKworcHhlbGludXgubzogcHhlbGludXguYXNtIGt3ZGhhc2guZ2VuIC4uL3ZlcnNpb24uZ2VuCisJJChOQVNNKSAtZiAkKE5BU01fRUxGKSAkKE5BU01PUFQpIC1EREFURV9TVFI9IickKERBVEUpJyIgXAorCQktREhFWERBVEU9IiQoSEVYREFURSkiIFwKKwkJLUQkKEFSQ0gpIFwKKwkJLUkkKFNSQykvIFwKKwkJLURJU19MUFhFTElOVVg9MCBcCisJCS1sICQoQDoubz0ubHNyKSAtbyAkQCAtTVAgLU1EICQoZGlyICRAKS4kKG5vdGRpciAkQCkuZCAkPAorCitweGVsaW51eC4wOiBweGVsaW51eC5iaW4KKwljcCAtZiAkPCAkQAorCitscHhlbGludXgubzogcHhlbGludXguYXNtIGt3ZGhhc2guZ2VuIC4uL3ZlcnNpb24uZ2VuCisJJChOQVNNKSAtZiAkKE5BU01fRUxGKSAkKE5BU01PUFQpIC1EREFURV9TVFI9IickKERBVEUpJyIgXAorCQktREhFWERBVEU9IiQoSEVYREFURSkiIFwKKwkJLUQkKEFSQ0gpIFwKKwkJLUkkKFNSQykvIFwKKwkJLURJU19MUFhFTElOVVg9MSBcCisJCS1sICQoQDoubz0ubHNyKSAtbyAkQCAtTVAgLU1EICQoZGlyICRAKS4kKG5vdGRpciAkQCkuZCAkPAorCitscHhlbGludXguMDogbHB4ZWxpbnV4LmJpbgorCWNwIC1mICQ8ICRACisKK2xkbGludXguYnNzOiBsZGxpbnV4LmJpbgorCWRkIGlmPSQ8IG9mPSRAIGJzPTUxMiBjb3VudD0xCisKK2xkbGludXguc3lzOiBsZGxpbnV4LmJpbgorCWRkIGlmPSQ8IG9mPSRAIGJzPTUxMiBza2lwPTIKKworY29kZXBhZ2UuY3A6ICQoT0JKKS8uLi9jb2RlcGFnZS8kKENPREVQQUdFKS5jcAorCWNwIC1mICQ8ICRACisKK2NvZGVwYWdlLm86IGNvZGVwYWdlLlMgY29kZXBhZ2UuY3AKKworaW5zdGFsbDogaW5zdGFsbGVyCisKK2luc3RhbGwtbGliOiBpbnN0YWxsZXIKKworaW5zdGFsbC1hbGw6IGluc3RhbGwgaW5zdGFsbC1saWIKKworbmV0aW5zdGFsbDogaW5zdGFsbGVyCisKK3RpZHkgZGlzdDoKKwlmaW5kIC4gLXR5cGUgZiBcKCAtbmFtZSAnKi5vJyAtbyAtbmFtZSAnKi5hJyAtbyAtbmFtZSAnLiouZCcgXAorCQktbyAtbmFtZSAnKi5sc3QnIFwpIC1wcmludCB8IHhhcmdzIC1ydCBybSAtZgorCXJtIC1mIGNvZGVwYWdlLmNwICouZWxmIHN0dXBpZC4qIHBhdGNoLm9mZnNldCAuZGVwZW5kCisJcm0gLWYgKi5lbGYudG1wICouc3ltCisJcm0gLWYgKi5sc3IgKi5tYXAgKi5zZWMgKi5yYXcKKwlybSAtZiAkKE9CU09MRVRFKSAkKExJQikKKworY2xlYW46IHRpZHkKKworc3BvdGxlc3M6IGNsZWFuCisJcm0gLWYgJChCVEFSR0VUKSAqLmJpbiAqX2Jpbi5jCisKKyMgSW5jbHVkZSBkZXBlbmRlbmNpZXMgZmlsZQorLWluY2x1ZGUgJChzaGVsbCBmaW5kIC4gLW5hbWUgJy4qLmQnIC1wcmludCkKZGlmZiAtLWdpdCBhL2NvcmUvYWR2LmluYyBiL2NvcmUvYWR2LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODhiZjAzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9hZHYuaW5jCkBAIC0wLDAgKzEsNTE4IEBACis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsKKzs7ICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzs7Cis7OyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7OyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7OyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKzs7ICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IGFkdi5pbmMKKzs7Cis7OyBUaGUgYXV4aWxsYXJ5IGRhdGEgdmVjdG9yIGFuZCBpdHMgcm91dGluZXMKKzs7Cis7OyBUaGUgYXV4aWxsYXJ5IGRhdGEgdmVjdG9yIGlzIGEgNTEyLWJ5dGUgYWxpZ25lZCBibG9jayB0aGF0IG9uIHRoZQorOzsgZGlzay1iYXNlZCBkZXJpdmF0aXZlcyBjYW4gYmUgcGFydCBvZiB0aGUgc3lzbGludXggZmlsZSBpdHNlbGYuICBJdAorOzsgZXhpc3RzIGluIHR3byBjb3BpZXM7IHdoZW4gd3JpdHRlbiwgYm90aCBjb3BpZXMgYXJlIHdyaXR0ZW4gKHdpdGggYQorOzsgc3luYyBpbiBiZXR3ZWVuLCBpZiBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLikgIFRoZSBmaXJzdCB0d28KKzs7IGR3b3JkcyBhcmUgbWFnaWMgbnVtYmVyIGFuZCBpbnZlcnNlIGNoZWNrc3VtLCB0aGVuIGZvbGxvd3MgdGhlIGRhdGEKKzs7IGFyZWEgYXMgYSB0YWdnZWQgYXJyYXkgc2ltaWxhciB0byBCT09UUC9ESENQLCBmaW5hbGx5IGEgdGFpbAorOzsgc2lnbmF0dXJlLgorOzsKKzs7IE5vdGUgdGhhdCB1bmxpa2UgQk9PVFAvREhDUCwgemVybyB0ZXJtaW5hdGVzIHRoZSBjaGFpbiwgYW5kIEZGCis7OyBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLgorOzsKKworOzsKKzs7IExpc3Qgb2YgQURWIHRhZ3MuLi4KKzs7CitBRFZfQk9PVE9OQ0UJZXF1IDEKKworOzsKKzs7IE90aGVyIEFEViBkYXRhLi4uCis7OworQURWX01BR0lDMQllcXUgMHg1YTJkMmZhNQkJCTsgSGVhZCBzaWduYXR1cmUKK0FEVl9NQUdJQzIJZXF1IDB4YTMwNDE3NjcJCQk7IFRvdGFsIGNoZWNrc3VtCitBRFZfTUFHSUMzCWVxdSAweGRkMjhiZjY0CQkJOyBUYWlsIHNpZ25hdHVyZQorCitBRFZfTEVOCQllcXUgNTAwCQkJCTsgRGF0YSBieXRlcworCithZHZfcmV0cmllcwllcXUgNgkJCQk7IERpc2sgcmV0cmllcworCisJCXNlY3Rpb24gLmRhdGEKKwkJZ2xvYmFsIF9fc3lzbGludXhfYWR2X3B0ciwgX19zeXNsaW51eF9hZHZfc2l6ZQorX19zeXNsaW51eF9hZHZfcHRyOgorCQlkZCBhZHYwLmRhdGEKK19fc3lzbGludXhfYWR2X3NpemU6CisJCWRkIEFEVl9MRU4KKworCQlzZWN0aW9uIC5hZHYKKwkJOyBJbnRyb2R1Y2UgdGhlIEFEVnMgdG8gdmFsaWQgYnV0IGJsYW5rCithZHYwOgorLmhlYWQJCXJlc2QgMQorLmNzdW0JCXJlc2QgMQorLmRhdGEJCXJlc2IgQURWX0xFTgorLnRhaWwJCXJlc2QgMQorLmVuZAkJZXF1ICQKK2FkdjE6CisuaGVhZAkJcmVzZCAxCisuY3N1bQkJcmVzZCAxCisuZGF0YQkJcmVzYiBBRFZfTEVOCisudGFpbAkJcmVzZCAxCisuZW5kCQllcXUgJAorCQlzZWN0aW9uIC50ZXh0MTYKKworCQk7CisJCTsgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgY29uZmlnIGZpbGUgcGFyc2luZywgc28gd2Uga25vdworCQk7IHRoZSBpbnRlbmRlZCBsb2NhdGlvbiBvZiB0aGUgQURWCisJCTsKKwkJZ2xvYmFsIGFkdl9pbml0CithZHZfaW5pdDoKKwkJY21wIGJ5dGUgW0FEVkRyaXZlXSwtMQorCQlqbmUgYWR2X3JlYWQKKworJWlmIElTX1NZU0xJTlVYIHx8IElTX0VYVExJTlVYCisJCWNtcCB3b3JkIFtBRFZTZWN0b3JzXSwyCQk7IE5vdCBwcmVzZW50PworCQlqYiBhZHZfdmVyaWZ5CisKKwkJbW92IGVheCxbSGlkZGVuXQorCQltb3YgZWR4LFtIaWRkZW4rNF0KKwkJYWRkIFtBRFZTZWMwXSxlYXgKKwkJYWRjIFtBRFZTZWMwKzRdLGVkeAorCQlhZGQgW0FEVlNlYzFdLGVheAorCQlhZGMgW0FEVlNlYzErNF0sZWR4CisJCW1vdiBhbCxbRHJpdmVOdW1iZXJdCisJCW1vdiBbQURWRHJpdmVdLGFsCisJCWptcCBhZHZfcmVhZAorJWVuZGlmCisKKwkJOworCQk7IEluaXRpYWxpemUgdGhlIEFEViBkYXRhIHN0cnVjdHVyZSBpbiBtZW1vcnkKKwkJOworYWR2X3ZlcmlmeToKKwkJY21wIGJ5dGUgW0FEVkRyaXZlXSwtMQkJOyBObyBBRFYgY29uZmlndXJlZCwgc3RpbGw/CisJCWplIC5yZXNldAkJCTsgVGhlbiB1bmNvbmRpdGlvbmFsbHkgcmVzZXQKKworCQltb3Ygc2ksYWR2MAorCQljYWxsIC5jaGVja19hZHYKKwkJanogLm9rCQkJCTsgUHJpbWFyeSBBRFYgb2theQorCQltb3Ygc2ksYWR2MQorCQljYWxsIC5jaGVja19hZHYKKwkJanogLmFkdjFvaworCisJCTsgTmVpdGhlciBBRFYgaXMgdXNhYmxlOyBpbml0aWFsaXplIHRvIGJsYW5rCisucmVzZXQ6CisJCW1vdiBkaSxhZHYwCisJCW1vdiBlYXgsQURWX01BR0lDMQorCQlzdG9zZAorCQltb3YgZWF4LEFEVl9NQUdJQzIKKwkJc3Rvc2QKKwkJeG9yIGVheCxlYXgKKwkJbW92IGN4LEFEVl9MRU4vNAorCQlyZXAgc3Rvc2QKKwkJbW92IGVheCxBRFZfTUFHSUMzCisJCXN0b3NkCisKKy5vazoKKwkJcmV0CisKKwkJOyBUaGUgcHJpbWFyeSBBRFYgaXMgYmFkLCBidXQgdGhlIGJhY2t1cCBpcyBPSworLmFkdjFvazoKKwkJbW92IGRpLGFkdjAKKwkJbW92IGN4LDUxMi80CisJCXJlcCBtb3ZzZAorCQlyZXQKKworCisJCTsgU0kgcG9pbnRzIHRvIHRoZSBwdXRhdGl2ZSBBRFY7IHVuY2hhbmdlZCBieSByb3V0aW5lCisJCTsgWkY9MSBvbiByZXR1cm4gaWYgZ29vZAorLmNoZWNrX2FkdjoKKwkJcHVzaCBzaQorCQlsb2RzZAorCQljbXAgZWF4LEFEVl9NQUdJQzEKKwkJam5lIC5kb25lCQkJOyBaRj0wLCBpLmUuIGJhZAorCQl4b3IgZWR4LGVkeAorCQltb3YgY3gsQURWX0xFTi80KzEJCTsgUmVtYWluaW5nIGR3b3JkcworLmNzdW06CisJCWxvZHNkCisJCWFkZCBlZHgsZWF4CisJCWxvb3AgLmNzdW0KKwkJY21wIGVkeCxBRFZfTUFHSUMyCisJCWpuZSAuZG9uZQorCQlsb2RzZAorCQljbXAgZWF4LEFEVl9NQUdJQzMKKy5kb25lOgorCQlwb3Agc2kKKwkJcmV0CisKKzsKKzsgYWR2X2dldDogZmluZCBhbiBBRFYgc3RyaW5nIGlmIHByZXNlbnQKKzsKKzsgSW5wdXQ6CURMCT0gQURWIElECis7IE91dHB1dDoJQ1gJPSBieXRlIGNvdW50ICh6ZXJvIG9uIG5vdCBmb3VuZCkKKzsJCVNJCT0gcG9pbnRlciB0byBkYXRhCis7CQlETAk9IHVuY2hhbmdlZAorOworOyBBc3N1bWVzIENTID09IERTLgorOworCithZHZfZ2V0OgorCQlwdXNoIGF4CisJCW1vdiBzaSxhZHYwLmRhdGEKKwkJeG9yIGF4LGF4CQkJOyBLZWVwIEFIPTAgYXQgYWxsIHRpbWVzCisubG9vcDoKKwkJbG9kc2IJCQkJOyBSZWFkIElECisJCWNtcCBhbCxkbAorCQlqZSAuZm91bmQKKwkJYW5kIGFsLGFsCisJCWp6IC5lbmQKKwkJbG9kc2IJCQkJOyBSZWFkIGxlbmd0aAorCQlhZGQgc2ksYXgKKwkJY21wIHNpLGFkdjAudGFpbAorCQlqYiAubG9vcAorCQlqbXAgLmVuZAorCisuZm91bmQ6CisJCWxvZHNiCisJCW1vdiBjeCxheAorCQlhZGQgYXgsc2kJCQk7IE1ha2Ugc3VyZSBpdCBmaXRzCisJCWNtcCBheCxhZHYwLnRhaWwKKwkJamJlIC5vaworLmVuZDoKKwkJeG9yIGN4LGN4Cisub2s6CisJCXBvcCBheAorCQlyZXQKKworOworOyBhZHZfc2V0OiBpbnNlcnQgYSBzdHJpbmcgaW50byB0aGUgQURWIGluIG1lbW9yeQorOworOyBJbnB1dDoJREwJPSBBRFYgSUQKKzsJCUZTOkJYCT0gaW5wdXQgYnVmZmVyCis7CQlDWAk9IGJ5dGUgY291bnQgKG1heCA9IDI1NSEpCis7IE91dHB1dDoJQ0Y9MSBvbiBlcnJvcgorOwkJQ1gJY2xvYmJlcmVkCis7Cis7IEFzc3VtZXMgQ1MgPT0gRFMgPT0gRVMuCis7CithZHZfc2V0OgorCQlwdXNoIGF4CisJCXB1c2ggc2kKKwkJcHVzaCBkaQorCQlhbmQgY2gsY2gKKwkJam56IC5vdmVyZmxvdworCisJCXB1c2ggY3gKKwkJbW92IHNpLGFkdjAuZGF0YQorCQl4b3IgYXgsYXgKKy5sb29wOgorCQlsb2RzYgorCQljbXAgYWwsZGwKKwkJamUgLmZvdW5kCisJCWFuZCBhbCxhbAorCQlqeiAuZW5kegorCQlsb2RzYgorCQlhZGQgc2ksYXgKKwkJY21wIHNpLGFkdjAudGFpbAorCQlqYiAubG9vcAorCQlqbXAgLmVuZAorCisuZm91bmQ6CQk7IEZvdW5kLCBuZWVkIHRvIGRlbGV0ZSBvbGQgY29weQorCQlsb2RzYgorCQlsZWEgZGksW3NpLTJdCisJCXB1c2ggZGkKKwkJYWRkIHNpLGF4CisJCW1vdiBjeCxhZHYwLnRhaWwKKwkJc3ViIGN4LHNpCisJCWpiIC5udWtlaXQKKwkJcmVwIG1vdnNiCQkJOyBSZW1vdmUgdGhlIG9sZCBvbmUKKwkJbW92IFtkaV0sYWgJCQk7IFRlcm1pbmF0aW9uIHplcm8KKwkJcG9wIHNpCisJCWptcCAubG9vcAorLm51a2VpdDoKKwkJcG9wIHNpCisJCWptcCAuZW5kCisuZW5kejoKKwkJZGVjIHNpCisuZW5kOgorCQk7IE5vdyBTSSBwb2ludHMgdG8gd2hlcmUgd2Ugd2FudCB0byBwdXQgb3VyIGRhdGEKKwkJcG9wIGN4CisJCW1vdiBkaSxzaQorCQlqY3h6IC5lbXB0eQorCQlhZGQgc2ksY3gKKwkJY21wIHNpLGFkdjAudGFpbC0yCisJCWphZSAub3ZlcmZsb3cJCQk7IENGPTAKKworCQltb3Ygc2ksYngKKwkJbW92IGFsLGRsCisJCXN0b3NiCisJCW1vdiBhbCxjbAorCQlzdG9zYgorCQlmcyByZXAgbW92c2IKKworLmVtcHR5OgorCQltb3YgY3gsYWR2MC50YWlsCisJCXN1YiBjeCxkaQorCQl4b3IgYXgsYXgKKwkJcmVwIHN0b3NiCQkJOyBaZXJvLWZpbGwgcmVtYWluZGVyCisKKwkJY2xjCisuZG9uZToKKwkJcG9wIGRpCisJCXBvcCBzaQorCQlwb3AgYXgKKwkJcmV0Cisub3ZlcmZsb3c6CisJCXN0YworCQlqbXAgLmRvbmUKKworOworOyBhZHZfY2xlYW51cDoJY2hlY2tzdW0gYWR2MCBhbmQgY29weSB0byBhZHYxCis7CQlBc3N1bWVzIENTID09IERTID09IEVTLgorOworYWR2X2NsZWFudXA6CisJCXB1c2hhZAorCQltb3Ygc2ksYWR2MC5kYXRhCisJCW1vdiBjeCxBRFZfTEVOLzQKKwkJeG9yIGVkeCxlZHgKKy5sb29wOgorCQlsb2RzZAorCQlhZGQgZWR4LGVheAorCQlsb29wIC5sb29wCisJCW1vdiBlYXgsQURWX01BR0lDMgorCQlzdWIgZWF4LGVkeAorCQlsZWEgZGksW3NpKzRdCQkJOyBhZHYxCisJCW1vdiBzaSxhZHYwCisJCW1vdiBbc2krNF0sZWF4CQkJOyBTdG9yZSBjaGVja3N1bQorCQltb3YgY3gsKEFEVl9MRU4rMTIpLzQKKwkJcmVwIG1vdnNkCisJCXBvcGFkCisJCXJldAorCis7Cis7IGFkdl93cml0ZToJd3JpdGUgdGhlIEFEViB0byBkaXNrLgorOworOwkJTG9jYXRpb24gaXMgaW4gbWVtb3J5IHZhcmlhYmxlcy4KKzsJCUFzc3VtZXMgQ1MgPT0gRFMgPT0gRVMuCis7Cis7CQlSZXR1cm5zIENGPTEgaWYgdGhlIEFEViBjYW5ub3QgYmUgd3JpdHRlbi4KKzsKKwkJZ2xvYmFsIGFkdl93cml0ZQorYWR2X3dyaXRlOgorCQlwdXNoIGVheAorCQltb3YgZWF4LFtBRFZTZWMwXQorCQlvciBlYXgsW0FEVlNlYzArNF0KKwkJamUgLmJhZAorCQltb3YgZWF4LFtBRFZTZWMxXQorCQlvciBlYXgsW0FEVlNlYzErNF0KKwkJamUgLmJhZAorCQljbXAgYnl0ZSBbQURWRHJpdmVdLC0xCisJCWplIC5iYWQKKworCQljYWxsIGFkdl9jbGVhbnVwCisJCW1vdiBhaCwzCQkJOyBXcml0ZQorCQljYWxsIGFkdl9yZWFkX3dyaXRlCisKKwkJY2xjCisJCXBvcCBlYXgKKwkJcmV0CisuYmFkOgkJCQkJCTsgTm8gbG9jYXRpb24gZm9yIEFEViBzZXQKKwkJc3RjCisJCXBvcCBlYXgKKwkJcmV0CisKKzsKKzsgYWR2X3JlYWQ6CXJlYWQgdGhlIEFEViBmcm9tIGRpc2sKKzsKKzsJCUxvY2F0aW9uIGlzIGluIG1lbW9yeSB2YXJpYWJsZXMuCis7CQlBc3N1bWVzIENTID09IERTID09IEVTLgorOworYWR2X3JlYWQ6CisJCXB1c2ggYXgKKwkJbW92IGFoLDIJCQk7IFJlYWQKKwkJY2FsbCBhZHZfcmVhZF93cml0ZQorCQljYWxsIGFkdl92ZXJpZnkKKwkJcG9wIGF4CisJCXJldAorCis7Cis7IGFkdl9yZWFkX3dyaXRlOiBkaXNrIEkvTyBmb3IgdGhlIEFEVgorOworOwkJT24gaW5wdXQsIEFIPTIgZm9yIHJlYWQsIEFIPTMgZm9yIHdyaXRlLgorOwkJQXNzdW1lcyBDUyA9PSBEUyA9PSBFUy4KKzsKK2Fkdl9yZWFkX3dyaXRlOgorCQltb3YgW0FEVk9wXSxhaAorCQlwdXNoYWQKKworCQk7IENoZWNrIGZvciBFREQKKwkJbW92IGJ4LDU1QUFoCisJCW1vdiBhaCw0MWgJCQk7IEVERCBleGlzdGVuY2UgcXVlcnkKKwkJbW92IGRsLFtBRFZEcml2ZV0KKwkJaW50IDEzaAorCQltb3Ygc2ksLmNiaW9zCisJCWpjIC5ub2VkZAorCQljbXAgYngsMEFBNTVoCisJCWpuZSAubm9lZGQKKwkJdGVzdCBjbCwxCisJCWp6IC5ub2VkZAorCQltb3Ygc2ksLmViaW9zCisubm9lZGQ6CisKKwkJbW92IGVheCxbQURWU2VjMF0KKwkJbW92IGVkeCxbQURWU2VjMCs0XQorCQltb3YgYngsYWR2MAorCQljYWxsIC5kb29uZQorCisJCW1vdiBlYXgsW0FEVlNlYzFdCisJCW1vdiBlZHgsW0FEVlNlYzErNF0KKwkJbW92IGJ4LGFkdjEKKwkJY2FsbCAuZG9vbmUKKworCQlwb3BhZAorCQlyZXQKKworLmRvb25lOgorCQlwdXNoIHNpCisJCWptcCBzaQorCisuZWJpb3M6CisJCW1vdiBjeCxhZHZfcmV0cmllcworLmViX3JldHJ5OgorCQk7IEZvcm0gREFQQSBvbiBzdGFjaworCQlwdXNoIGVkeAorCQlwdXNoIGVheAorCQlwdXNoIGVzCisJCXB1c2ggYngKKwkJcHVzaCB3b3JkIDEJCQk7IFNlY3RvciBjb3VudAorCQlwdXNoIHdvcmQgMTYJCQk7IERBUEEgc2l6ZQorCQltb3Ygc2ksc3AKKwkJcHVzaGFkCisJCW1vdiBkbCxbQURWRHJpdmVdCisJCW1vdiBheCw0MDAwaAorCQlvciBhaCxbQURWT3BdCisJCXB1c2ggZHMKKwkJcHVzaCBzcworCQlwb3AgZHMKKwkJaW50IDEzaAorCQlwb3AgZHMKKwkJcG9wYWQKKwkJbGVhIHNwLFtzaSsxNl0JCQk7IFJlbW92ZSBEQVBBCisJCWpjIC5lYl9lcnJvcgorCQlwb3Agc2kKKwkJcmV0CisuZWJfZXJyb3I6CisJCWxvb3AgLmViX3JldHJ5CisJCXN0YworCQlwb3Agc2kKKwkJcmV0CisKKy5jYmlvczoKKwkJcHVzaCBlZHgKKwkJcHVzaCBlYXgKKwkJcHVzaCBicAorCisJCWFuZCBlZHgsZWR4CQkJOyA+IDIgVGlCIG5vdCBwb3NzaWJsZQorCQlqbnogLmNiX292ZXJmbG93CisKKwkJbW92IGRsLFtBRFZEcml2ZV0KKwkJYW5kIGRsLGRsCisJCTsgRmxvcHBpZXM6IGNhbid0IHRydXN0IElOVCAxM2ggMDhoLCB3ZSBiZXR0ZXIga25vdworCQk7IHRoZSBnZW9tZXRyeSBhIHByaW9yaSwgd2hpY2ggbWVhbnMgaXQgYmV0dGVyIGJlIG91cgorCQk7IGJvb3QgZGV2aWNlLi4uCisJCWpucyAubm9wYXJtCQkJOyBGbG9wcHkgZHJpdmUuLi4gdXJrCisKKwkJbW92IGFoLDA4aAkJCTsgR2V0IGRpc2sgcGFyYW1ldGVycworCQlpbnQgMTNoCisJCWpjIC5ub3Bhcm0KKwkJYW5kIGFoLGFoCisJCWpueiAubm9wYXJtCisJCXNociBkeCw4CisJCWluYyBkeAorCQltb3Z6eCBlZGksZHgJCQk7IEVESSA9IGhlYWRzCisJCWFuZCBjeCwzZmgKKwkJbW92enggZXNpLGN4CQkJOyBFU0kgPSBzZWN0b3JzL3RyYWNrCisJCWptcCAucGFybW9rCisKKy5ub3Bhcm06CisJCTsgTm8gQ0hTIGluZm8uLi4gdGhpcyBiZXR0ZXIgYmUgb3VyIGJvb3QgZHJpdmUsIHRoZW4KKyVpZiBJU19TWVNMSU5VWCB8fCBJU19FWFRMSU5VWAorCQljbXAgZGwsW0RyaXZlTnVtYmVyXQorCQlqbmUgLmNiX292ZXJmbG93CQk7IEZhdGFsIGVycm9yIQorCQltb3Z6eCBlc2ksd29yZCBbYnNTZWNQZXJUcmFja10KKwkJbW92enggZWRpLHdvcmQgW2JzSGVhZHNdCislZWxzZQorCQk7IE5vdCBhIGRpc2stYmFzZWQgZGVyaXZhdGl2ZS4uLiB0aGVyZSBpcyBubyBob3BlCisJCWptcCAuY2Jfb3ZlcmZsb3cKKyVlbmRpZgorCisucGFybW9rOgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICA7IERpdmlkaW5nIGJ5IHNlY3RvcnMgdG8gZ2V0ICh0cmFjayxzZWN0b3IpOiB3ZSBtYXkgaGF2ZQorICAgICAgICAgICAgICAgIDsgdXAgdG8gMl4xOCB0cmFja3MsIHNvIHdlIG5lZWQgdG8gdXNlIDMyLWJpdCBhcml0aG1ldHJpYy4KKyAgICAgICAgICAgICAgICA7CisJCXhvciBlZHgsZWR4CisgICAgICAgICAgICAgICAgZGl2IGVzaQorICAgICAgICAgICAgICAgIHhvciBjeCxjeAorICAgICAgICAgICAgICAgIHhjaGcgY3gsZHggICAgICAgICAgICAgIDsgQ1ggPC0gc2VjdG9yIGluZGV4ICgwLWJhc2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgRURYIDwtIDAKKyAgICAgICAgICAgICAgICA7IGVheCA9IHRyYWNrICMKKyAgICAgICAgICAgICAgICBkaXYgZWRpICAgICAgICAgICAgICAgICA7IENvbnZlcnQgdHJhY2sgdG8gaGVhZC9jeWwKKworCQk7IFdhdGNoIG91dCBmb3Igb3ZlcmZsb3csIHdlIG1pZ2h0IGJlIHdyaXRpbmchCisJCWNtcCBlYXgsMTAyMworICAgICAgICAgICAgICAgIGphIC5jYl9vdmVyZmxvdworCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIDsgTm93IHdlIGhhdmUgQVggPSBjeWwsIERYID0gaGVhZCwgQ1ggPSBzZWN0b3IgKDAtYmFzZWQpLAorICAgICAgICAgICAgICAgIDsgQlAgPSBzZWN0b3JzIHRvIHRyYW5zZmVyLCBTSSA9IGJzU2VjUGVyVHJhY2ssCisgICAgICAgICAgICAgICAgOyBFUzpCWCA9IGRhdGEgdGFyZ2V0CisgICAgICAgICAgICAgICAgOworCisgICAgICAgICAgICAgICAgc2hsIGFoLDYgICAgICAgICAgICAgICAgOyBCZWNhdXNlIElCTSB3YXMgU1RPT1BJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYW5kIHRob3VnaHQgOCBiaXRzIHdlcmUgZW5vdWdoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyB0aGVuIHRob3VnaHQgMTAgYml0cyB3ZXJlIGVub3VnaC4uLgorICAgICAgICAgICAgICAgIGluYyBjeCAgICAgICAgICAgICAgICAgIDsgU2VjdG9yIG51bWJlcnMgYXJlIDEtYmFzZWQsIHNpZ2gKKyAgICAgICAgICAgICAgICBvciBjbCxhaAorICAgICAgICAgICAgICAgIG1vdiBjaCxhbAorICAgICAgICAgICAgICAgIG1vdiBkaCxkbAorICAgICAgICAgICAgICAgIG1vdiBkbCxbQURWRHJpdmVdCisJCW1vdiBhbCwwMWgJCTsgVHJhbnNmZXIgb25lIHNlY3RvcgorICAgICAgICAgICAgICAgIG1vdiBhaCxbQURWT3BdCQk7IE9wZXJhdGlvbgorCisJCW1vdiBicCxhZHZfcmV0cmllcworLmNiX3JldHJ5OgorICAgICAgICAgICAgICAgIHB1c2hhZAorICAgICAgICAgICAgICAgIGludCAxM2gKKyAgICAgICAgICAgICAgICBwb3BhZAorICAgICAgICAgICAgICAgIGpjIC5jYl9lcnJvcgorCisuY2JfZG9uZToKKyAgICAgICAgICAgICAgICBwb3AgYnAKKyAgICAgICAgICAgICAgICBwb3AgZWF4CisgICAgICAgICAgICAgICAgcG9wIGVkeAorCQlwb3Agc2kKKyAgICAgICAgICAgICAgICByZXQKKworLmNiX2Vycm9yOgorICAgICAgICAgICAgICAgIGRlYyBicAorICAgICAgICAgICAgICAgIGpueiAuY2JfcmV0cnkKKy5jYl9vdmVyZmxvdzoKKwkJc3RjCisJCWptcCAuY2JfZG9uZQorCisJCXNlY3Rpb24gLmRhdGExNgorCQlhbGlnbnogOAorQURWU2VjMAkJZHEgMAkJCTsgTm90IHNwZWNpZmllZAorQURWU2VjMQkJZHEgMAkJCTsgTm90IHNwZWNpZmllZAorQURWRHJpdmUJZGIgLTEJCQk7IE5vIEFEViBkZWZpbmVkCitBRFZDSFNJbmZvCWRiIC0xCQkJOyBXZSBoYXZlIENIUyBpbmZvIGZvciB0aGlzIGRyaXZlCisKKwkJc2VjdGlvbiAuYnNzMTYKK0FEVk9wCQlyZXNiIDEKKworCQlzZWN0aW9uIC50ZXh0MTYKZGlmZiAtLWdpdCBhL2NvcmUvYmNvcHkzMi5pbmMgYi9jb3JlL2Jjb3B5MzIuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjAxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Jjb3B5MzIuaW5jCkBAIC0wLDAgKzEsNzcgQEAKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OworOzsgICBDb3B5cmlnaHQgMTk5NC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOzsgICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7ICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCis7OyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOzsKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzs7Cis7OyBiY29weTMyLmluYworOzsKKzs7IDMyLWJpdCBiY29weSByb3V0aW5lIGZvciByZWFsIG1vZGUKKzs7CisKKzsKKzsgMzItYml0IGJjb3B5IHJvdXRpbmUgZm9yIHJlYWwgbW9kZQorOworOyBXZSBlbnRlciBwcm90ZWN0ZWQgbW9kZSwgc2V0IHVwIGEgZmxhdCAzMi1iaXQgZW52aXJvbm1lbnQsIHJ1biByZXAgbW92c2QKKzsgYW5kIHRoZW4gZXhpdC4gIElNUE9SVEFOVDogVGhpcyBjb2RlIGFzc3VtZXMgY3MgPT0gMC4KKzsKKzsgVGhpcyBjb2RlIGlzIHByb2JhYmx5IGV4Y2Vzc2l2ZWx5IGFuYWwtcmV0ZW50aXZlIGluIGl0cyBoYW5kbGluZyBvZgorOyBzZWdtZW50cywgYnV0IHRoaXMgc3R1ZmYgaXMgcGFpbmZ1bCBlbm91Z2ggYXMgaXQgaXMgd2l0aG91dCBoYXZpbmcgdG8gcmVseQorOyBvbiBldmVyeXRoaW5nIGhhcHBlbmluZyAiYXMgaXQgb3VnaHQgdG8uIgorOworCisJCWJpdHMgMTYKKwkJc2VjdGlvbiAudGV4dDE2CisKKzsKKzsgYmNvcHk6Cis7CTMyLWJpdCBjb3B5LCBvdmVybGFwIHNhZmUKKzsKKzsgSW5wdXRzOgorOwlFU0kJLSBzb3VyY2UgcG9pbnRlciAoLTEgbWVhbnMgZG8gYnplcm8gcmF0aGVyIHRoYW4gYmNvcHkpCis7CUVESQktIHRhcmdldCBwb2ludGVyCis7CUVDWAktIGJ5dGUgY291bnQKKzsKKzsgT3V0cHV0czoKKzsJRVNJCS0gZmlyc3QgYnl0ZSBhZnRlciBzb3VyY2UgKGdhcmJhZ2UgaWYgRVNJID09IC0xIG9uIGVudHJ5KQorOwlFREkJLSBmaXJzdCBieXRlIGFmdGVyIHRhcmdldAorOworYmNvcHk6CQlqZWN4eiAucmV0CisJCXBtX2NhbGwgcG1fYmNvcHkKKwkJYWRkIGVkaSxlY3gKKwkJYWRkIGVzaSxlY3gKKy5yZXQ6CQlyZXQKKworOworOyBzaHVmZmxlX2FuZF9ib290X3JhdzoKKzsJVGhlIG5ldyB2ZXJzaW9uIG9mIHNodWZmbGUgYW5kIGJvb3QuCis7IElucHV0czoKKzsJRVNJCQktPiBQb2ludGVyIHRvIGxpc3Qgb2YgKGRzdCwgc3JjLCBsZW4pIHBhaXJzKCopCis7CUVESQkJLT4gUG9pbnRlciB0byBzYWZlIGFyZWEgZm9yIGxpc3QgKyBzaHVmZmxlcgorOwkJCSAgIChtdXN0IG5vdCBvdmVybGFwIHRoaXMgY29kZSBub3IgdGhlIFJNIHN0YWNrKQorOwlFQ1gJCS0+IEJ5dGUgY291bnQgb2YgbGlzdCBhcmVhIChmb3IgaW5pdGlhbCBjb3B5KQorOworOyAgICAgSWYgc3JjID09IC0xOiB0aGVuIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSAoZHN0LCBsZW4pIGlzIGJ6ZXJvZWQ7Cis7CQkgICAgdGhpcyBpcyBoYW5kbGVkIGluc2lkZSB0aGUgYmNvcHkgcm91dGluZS4KKzsKKzsgICAgIElmIGxlbiA9PSAwOiAgdGhpcyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBsaXN0OyBkc3QgaW5kaWNhdGVzCis7CQkgICAgdGhlIGVudHJ5IHBvaW50IGFuZCBzcmMgdGhlIG1vZGUgKDAgPSBwbSwgMSA9IHJtKQorOworOyAgICAgKCopIGRzdCwgc3JjLCBhbmQgbGVuIGFyZSBmb3VyIGJ5dGVzIGVhY2gKKzsKK3NodWZmbGVfYW5kX2Jvb3RfcmF3OgorCQltb3YgYngscG1fc2h1ZmZsZQorCQlqbXAgZW50ZXJfcG0KKworOworOyBUaGUgMzItYml0IGNvcHkgYW5kIHNodWZmbGUgY29kZSBpcyAic3BlY2lhbCIsIHNvIGl0IGlzIGluIGl0cyBvd24gZmlsZQorOworJWluY2x1ZGUgImJjb3B5eHguaW5jIgpkaWZmIC0tZ2l0IGEvY29yZS9iY29weXh4LmluYyBiL2NvcmUvYmNvcHl4eC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1OGYwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvYmNvcHl4eC5pbmMKQEAgLTAsMCArMSwzMzUgQEAKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OworOzsgICBDb3B5cmlnaHQgMTk5NC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOzsgICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKzs7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IGJjb3B5MzJ4eC5pbmMKKzs7CisKKworOworOyAzMi1iaXQgYmNvcHkgcm91dGluZQorOworOyBUaGlzIGlzIHRoZSBhY3R1YWwgMzItYml0IHBvcnRpb24gb2YgdGhlIGJjb3B5IGFuZCBzaHVmZmxlIGFuZCBib290Cis7IHJvdXRpbmVzLiAgQUxMIFRISVMgQ09ERSBORUVEUyBUTyBCRSBQT1NJVElPTi1JTkRFUEVOREVOVCwgd2l0aCB0aGUKKzsgc29sZSBleGNlcHRpb24gYmVpbmcgdGhlIGFjdHVhbCByZWxvY2F0aW9uIGNvZGUgYXQgdGhlIGJlZ2lubmluZyBvZgorOyBwbV9zaHVmZmxlX2Jvb3QuCis7Cis7IEl0IGFsc28gcmVhbGx5IG5lZWRzIHRvIGxpdmUgYWxsIGluIGEgc2luZ2xlIHNlZ21lbnQsIGZvciB0aGUKKzsgYWRkcmVzcyBjYWxjdWxjYXRpb25zIHRvIGFjdHVhbGx5IHdvcmsuCis7CisKKwkJYml0cyAzMgorCQlzZWN0aW9uIC5iY29weXh4LnRleHQKKwkJYWxpZ24gMTYKKzsKKzsgcG1fYmNvcHk6Cis7Cis7CVRoaXMgaXMgdGhlIHByb3RlY3RlZC1tb2RlIGNvcmUgb2YgdGhlICJiY29weSIgcm91dGluZS4KKzsJVHJ5IHRvIGRvIGFsaWduZWQgdHJhbnNmZXJzOyBpZiB0aGUgc3JjIGFuZCBkc3QgYXJlIHJlbGF0aXZlbHkKKzsJbWlzYWxpZ25lZCwgYWxpZ24gdGhlIGRzdC4KKzsKKzsJRUNYIGlzIGd1YXJhbnRlZWQgdG8gbm90IGJlIHplcm8gb24gZW50cnkuCis7Cis7CUNsb2JiZXJzIEVTSSwgRURJLCBFQ1guCis7CisKK3BtX2Jjb3B5OgorCQlwdXNoIGVieAorCQlwdXNoIGVkeAorCQlwdXNoIGVheAorCisJCWNtcCBlc2ksLTEKKwkJamUgLmJ6ZXJvCisKKwkJY21wIGVzaSxlZGkJCTsgSWYgc291cmNlIDwgZGVzdGluYXRpb24sIHdlIG1pZ2h0CisJCWpiIC5yZXZlcnNlCQk7IGhhdmUgdG8gY29weSBiYWNrd2FyZHMKKworLmZvcndhcmQ6CisJCTsgSW5pdGlhbCBhbGlnbm1lbnQKKwkJbW92IGVkeCxlZGkKKwkJc2hyIGVkeCwxCisJCWpuYyAuZmFhMQorCQltb3ZzYgorCQlkZWMgZWN4CisuZmFhMToKKwkJbW92IGFsLGNsCisJCWNtcCBlY3gsMgorCQlqYiAuZl90aW55CisKKwkJc2hyIGVkeCwxCisJCWpuYyAuZmFhMgorCQltb3ZzdworCQlzdWIgZWN4LDIKKy5mYWEyOgorCisJCTsgQnVsayB0cmFuc2ZlcgorCQltb3YgYWwsY2wJCTsgU2F2ZSBsb3cgYml0cworCQlzaHIgZWN4LDIJCTsgQ29udmVydCB0byBkd29yZHMKKwkJcmVwIG1vdnNkCQk7IERvIG91ciBidXNpbmVzcworCQk7IEF0IHRoaXMgcG9pbnQgZWN4ID09IDAKKworCQl0ZXN0IGFsLDIKKwkJanogLmZhYjIKKwkJbW92c3cKKy5mYWIyOgorLmZfdGlueToKKwkJdGVzdCBhbCwxCisJCWp6IC5mYWIxCisJCW1vdnNiCisuZmFiMToKKy5kb25lOgorCQlwb3AgZWF4CisJCXBvcCBlZHgKKwkJcG9wIGVieAorCQlyZXQKKworLnJldmVyc2U6CisJCWxlYSBlYXgsW2VzaStlY3gtMV0JOyBQb2ludCB0byBmaW5hbCBieXRlCisJCWNtcCBlZGksZWF4CisJCWphIC5mb3J3YXJkCQk7IE5vIG92ZXJsYXAsIGRvIGZvcndhcmQgY29weQorCisJCXN0ZAkJCTsgUmV2ZXJzZSBjb3B5CisJCWxlYSBlZGksW2VkaStlY3gtMV0KKwkJbW92IGVzaSxlYXgKKworCQk7IEluaXRpYWwgYWxpZ25tZW50CisJCW1vdiBlZHgsZWRpCisJCXNociBlZHgsMQorCQlqYyAucmFhMQorCQltb3ZzYgorCQlkZWMgZWN4CisucmFhMToKKworCQlkZWMgZXNpCisJCWRlYyBlZGkKKwkJbW92IGFsLGNsCisJCWNtcCBlY3gsMgorCQlqYiAucl90aW55CisJCXNociBlZHgsMQorCQlqYyAucmFhMgorCQltb3ZzdworCQlzdWIgZWN4LDIKKy5yYWEyOgorCisJCTsgQnVsayBjb3B5CisJCXN1YiBlc2ksMgorCQlzdWIgZWRpLDIKKwkJbW92IGFsLGNsCQk7IFNhdmUgbG93IGJpdHMKKwkJc2hyIGVjeCwyCisJCXJlcCBtb3ZzZAorCisJCTsgRmluYWwgYWxpZ25tZW50Cisucl9maW5hbDoKKwkJYWRkIGVzaSwyCisJCWFkZCBlZGksMgorCQl0ZXN0IGFsLDIKKwkJanogLnJhYjIKKwkJbW92c3cKKy5yYWIyOgorLnJfdGlueToKKwkJaW5jIGVzaQorCQlpbmMgZWRpCisJCXRlc3QgYWwsMQorCQlqeiAucmFiMQorCQltb3ZzYgorLnJhYjE6CisJCWNsZAorCQlqbXAgc2hvcnQgLmRvbmUKKworLmJ6ZXJvOgorCQl4b3IgZWF4LGVheAorCisJCTsgSW5pdGlhbCBhbGlnbm1lbnQKKwkJbW92IGVkeCxlZGkKKwkJc2hyIGVkeCwxCisJCWpuYyAuemFhMQorCQlzdG9zYgorCQlkZWMgZWN4CisuemFhMToKKworCQltb3YgYmwsY2wKKwkJY21wIGVjeCwyCisJCWpiIC56X3RpbnkKKwkJc2hyIGVkeCwxCisJCWpuYyAuemFhMgorCQlzdG9zdworCQlzdWIgZWN4LDIKKy56YWEyOgorCisJCTsgQnVsaworCQltb3YgYmwsY2wJCTsgU2F2ZSBsb3cgYml0cworCQlzaHIgZWN4LDIKKwkJcmVwIHN0b3NkCisKKwkJdGVzdCBibCwyCisJCWp6IC56YWIyCisJCXN0b3N3CisuemFiMjoKKy56X3Rpbnk6CisJCXRlc3QgYmwsMQorCQlqeiAuemFiMQorCQlzdG9zYgorLnphYjE6CisJCWptcCBzaG9ydCAuZG9uZQorCis7Cis7IHNodWZmbGVfYW5kX2Jvb3Q6Cis7Cis7IFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHNodWZmbGUgbWVtb3J5IGFyb3VuZCwgZm9sbG93ZWQgYnkKKzsgaW52b2tpbmcgYW4gZW50cnkgcG9pbnQgc29tZXdoZXJlIGluIGxvdyBtZW1vcnkuICBUaGlzIHJvdXRpbmUKKzsgY2FuIGNsb2JiZXIgYW55IG1lbW9yeSBvdXRzaWRlIHRoZSBiY29weSBzcGVjaWFsIGFyZWEuCis7Cis7IElNUE9SVEFOVDogVGhpcyByb3V0aW5lIGRvZXMgbm90IHNldCB1cCBhbnkgcmVnaXN0ZXJzLgorOyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBnZW5lcmF0ZSBhbiBhcHByb3ByaWF0ZSBlbnRyeQorOyBzdHViOyAqZXNwZWNpYWxseSogd2hlbiBnb2luZyB0byByZWFsIG1vZGUuCis7Cis7IElucHV0czoKKzsJRVNJCQktPiBQb2ludGVyIHRvIGxpc3Qgb2YgKGRzdCwgc3JjLCBsZW4pIHBhaXJzKCopCis7CUVESQkJLT4gUG9pbnRlciB0byBzYWZlIGFyZWEgZm9yIGxpc3QgKyBzaHVmZmxlcgorOwkJCSAgIChtdXN0IG5vdCBvdmVybGFwIHRoaXMgY29kZSBub3IgdGhlIFJNIHN0YWNrKQorOwlFQ1gJCS0+IEJ5dGUgY291bnQgb2YgbGlzdCBhcmVhIChmb3IgaW5pdGlhbCBjb3B5KQorOworOyAgICAgSWYgc3JjID09IC0xOiB0aGVuIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSAoZHN0LCBsZW4pIGlzIGJ6ZXJvZWQ7Cis7CQkgICAgdGhpcyBpcyBoYW5kbGVkIGluc2lkZSB0aGUgYmNvcHkgcm91dGluZS4KKzsKKzsgICAgIElmIGxlbiA9PSAwOiAgdGhpcyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBsaXN0OyBkc3QgaW5kaWNhdGVzCis7CQkgICAgdGhlIGVudHJ5IHBvaW50IGFuZCBzcmMgdGhlIG1vZGUgKDAgPSBwbSwgMSA9IHJtKQorOworOyAgICAgKCopIGRzdCwgc3JjLCBhbmQgbGVuIGFyZSBmb3VyIGJ5dGVzIGVhY2gKKzsKKzsgZG9fcmF3X3NodWZmbGVfYW5kX2Jvb3QgaXMgdGhlIHNhbWUgZW50cnkgcG9pbnQsIGJ1dCB3aXRoIGEgQyBBQkk6Cis7IGRvX3Jhd19zaHVmZmxlX2FuZF9ib290KHNhZmVhcmVhLCBkZXNjcmlwdG9ycywgYnl0ZWNvdW50KQorOworCQlnbG9iYWwgZG9fcmF3X3NodWZmbGVfYW5kX2Jvb3QKK2RvX3Jhd19zaHVmZmxlX2FuZF9ib290OgorCQltb3YgZWRpLGVheAorCQltb3YgZXNpLGVkeAorCitwbV9zaHVmZmxlOgorCQljbGkJCQk7IEVuZCBpbnRlcnJ1cHQgc2VydmljZSAoZm9yIGdvb2QpCisJCW1vdiBlYngsZWRpCQk7IEVCWCA8LSBkZXNjcmlwdG9yIGxpc3QKKwkJbGVhIGVkeCxbZWRpK2VjeCsxNV0JOyBFRFggPC0gd2hlcmUgdG8gcmVsb2NhdGUgb3VyIGNvZGUgdG8KKwkJYW5kIGVkeCx+MTUJCTsgQWxpZ24gMTYgdG8gYmVuZWZpdCB0aGUgR0RUCisJCWNhbGwgcG1fYmNvcHkKKwkJbW92IGVzaSxfX2Jjb3B5eHhfc3RhcnQJOyBBYnNvbHV0ZSBzb3VyY2UgYWRkcmVzcworCQltb3YgZWRpLGVkeAkJOyBBYnNvbHV0ZSB0YXJnZXQgYWRkcmVzcworCQlzdWIgZWR4LGVzaQkJOyBFRFggPC0gYWRkcmVzcyBkZWx0YQorCQltb3YgZWN4LF9fYmNvcHl4eF9kd29yZHMKKwkJbGVhIGVheCxbZWR4Ky5zYWZlXQk7IFJlc3VtZSBwb2ludAorCQk7IFJlbG9jYXRlIHRoaXMgY29kZQorCQlyZXAgbW92c2QKKwkJam1wIGVheAkJCTsgSnVtcCB0byBzYWZlIGxvY2F0aW9uCisuc2FmZToKKwkJOyBHaXZlIG91cnNlbHZlcyBhIHNhZmUgc3RhY2sKKwkJbGVhIGVzcCxbZWR4K2Jjb3B5eHhfc3RhY2srX19iY29weXh4X2VuZF0KKwkJYWRkIGVkeCxiY29weV9nZHQJOyBFRFggPC0gbmV3IEdEVAorCQltb3YgW2VkeCsyXSxlZHgJCTsgR0RUIHNlbGYtcG9pbnRlcgorCQlsZ2R0IFtlZHhdCQk7IFN3aXRjaCB0byBsb2NhbCBHRFQKKworCQk7IE5vdyBmb3IgdGhlIGFjdHVhbCBzaHVmZmxpbmcuLi4KKy5sb29wOgorCQltb3YgZWRpLFtlYnhdCisJCW1vdiBlc2ksW2VieCs0XQorCQltb3YgZWN4LFtlYngrOF0KKwkJYWRkIGVieCwxMgorCQlqZWN4eiAuZG9uZQorCQljYWxsIHBtX2Jjb3B5CisJCWptcCAubG9vcAorLmRvbmU6CisJCWxpZHQgW2VkeCtSTV9JRFRfcHRyLWJjb3B5X2dkdF0JOyBSTS1saWtlIElEVAorCQlwdXNoIGVjeAkJOyA9PSAwLCBmb3IgY2xlYW5pbmcgdGhlIGZsYWdzIHJlZ2lzdGVyCisJCWFuZCBlc2ksZXNpCisJCWp6IHBtX3NodWZmbGVfMTYKKwkJcG9wZmQJCQk7IENsZWFuIHRoZSBmbGFncworCQlqbXAgZWRpCQkJOyBQcm90ZWN0ZWQgbW9kZSBlbnRyeQorCisJCTsgV2UgaGF2ZSBhIDE2LWJpdCBlbnRyeSBwb2ludCwgc28gd2UgbmVlZCB0byByZXR1cm4KKwkJOyB0byAxNi1iaXQgbW9kZS4gIE5vdGU6IEVEWCBhbHJlYWR5IHBvaW50cyB0byB0aGUgR0RULgorcG1fc2h1ZmZsZV8xNjoKKwkJbW92IGVheCxlZGkKKwkJbW92IFtlZHgrUE1fQ1MxNisyXSxheAorCQltb3YgW2VkeCtQTV9EUzE2KzJdLGF4CisJCXNociBlYXgsMTYKKwkJbW92IFtlZHgrUE1fQ1MxNis0XSxhbAorCQltb3YgW2VkeCtQTV9DUzE2KzddLGFoCisJCW1vdiBbZWR4K1BNX0RTMTYrNF0sYWwKKwkJbW92IFtlZHgrUE1fRFMxNis3XSxhaAorCQltb3YgZWF4LGNyMAorCQlhbmQgYWwsfjEKKwkJcG9wZmQJCQk7IENsZWFuIHRoZSBmbGFncworCQk7IE5vIGZsYWctY2hhbmdpbmcgaW5zdHJ1Y3Rpb25zIGJlbG93Li4uCisJCW1vdiBkeCxQTV9EUzE2CisJCW1vdiBkcyxlZHgKKwkJbW92IGVzLGVkeAorCQltb3YgZnMsZWR4CisJCW1vdiBncyxlZHgKKwkJbW92IHNzLGVkeAorCQlqbXAgUE1fQ1MxNjowCisKKwkJc2VjdGlvbgkuYmNvcHl4eC5kYXRhCisKKwkJYWxpZ256IDE2Cis7IEdEVCBkZXNjcmlwdG9yIGVudHJ5CislbWFjcm8gZGVzYyAxCitiY29weV9nZHQuJTE6CitQTV8lMQkJZXF1IGJjb3B5X2dkdC4lMS1iY29weV9nZHQKKyVlbmRtYWNybworCitiY29weV9nZHQ6CisJCWR3IGJjb3B5X2dkdF9zaXplLTEJOyBOdWxsIGRlc2NyaXB0b3IgLSBjb250YWlucyBHRFQKKwkJZGQgYmNvcHlfZ2R0CQk7IHBvaW50ZXIgZm9yIExHRFQgaW5zdHJ1Y3Rpb24KKwkJZHcgMAorCisJCTsgVFNTIHNlZ21lbnQgdG8ga2VlcCBJbnRlbCBWVCBoYXBweS4gIEludGVsIFZUIGlzCisJCTsgdW5oYXBweSBhYm91dCBhbnl0aGluZyB0aGF0IGRvZXNuJ3Qgc21lbGwgbGlrZSBhCisJCTsgZnVsbC1ibG93biAzMi1iaXQgT1MuCisJZGVzYyBUU1MKKwkJZHcgMTA0LTEsIER1bW15VFNTCTsgMDhoIDMyLWJpdCB0YXNrIHN0YXRlIHNlZ21lbnQKKwkJZGQgMDAwMDg5MDBoCQk7IHByZXNlbnQsIGRwbCAwLCAxMDQgYnl0ZXMgQER1bW15VFNTCisKKwlkZXNjIENTMTYKKwkJZGQgMDAwMGZmZmZoCQk7IDEwaCBDb2RlIHNlZ21lbnQsIHVzZTE2LCByZWFkYWJsZSwKKwkJZGQgMDAwMDliMDBoCQk7IHByZXNlbnQsIGRwbCAwLCBjb3ZlciA2NEsKKwlkZXNjIERTMTYKKwkJZGQgMDAwMGZmZmZoCQk7IDE4aCBEYXRhIHNlZ21lbnQsIHVzZTE2LCByZWFkL3dyaXRlLAorCQlkZCAwMDAwOTMwMGgJCTsgcHJlc2VudCwgZHBsIDAsIGNvdmVyIDY0SworCWRlc2MgQ1MzMgorCQlkZCAwMDAwZmZmZmgJCTsgMjBoIENvZGUgc2VnbWVudCwgdXNlMzIsIHJlYWRhYmxlLAorCQlkZCAwMGNmOWIwMGgJCTsgcHJlc2VudCwgZHBsIDAsIGNvdmVyIGFsbCA0RworCWRlc2MgRFMzMgorCQlkZCAwMDAwZmZmZmgJCTsgMjhoIERhdGEgc2VnbWVudCwgdXNlMzIsIHJlYWQvd3JpdGUsCisJCWRkIDAwY2Y5MzAwaAkJOyBwcmVzZW50LCBkcGwgMCwgY292ZXIgYWxsIDRHCisKK2Jjb3B5X2dkdF9zaXplOgllcXUgJC1iY29weV9nZHQKKzsKKzsgU3BhY2UgZm9yIGEgZHVtbXkgdGFzayBzdGF0ZSBzZWdtZW50LiAgSXQgc2hvdWxkIG5ldmVyIGJlIGFjdHVhbGx5Cis7IGFjY2Vzc2VkLCBidXQganVzdCBpbiBjYXNlIGl0IGlzLCBwb2ludCB0byBhIGNodW5rIG9mIG1lbW9yeSB0aGF0Cis7IGhhcyBhIGNoYW5jZSB0byBub3QgYmUgdXNlZCBmb3IgYW55dGhpbmcgcmVhbC4uLgorOworRHVtbXlUU1MJZXF1IDB4NTgwCisKKwkJYWxpZ24gNAorUk1fSURUX3B0cjoJZHcgMEZGRkZoCQk7IExlbmd0aCAobm9uc2Vuc2UsIGJ1dCBtYXRjaGVzIENQVSkKKwkJZGQgMAkJCTsgT2Zmc2V0CisKK2Jjb3B5eHhfc3RhY2sJZXF1IDEyOAkJCTsgV2Ugd2FudCB0aGlzIG11Y2ggc3RhY2sKKworCQlzZWN0aW9uIC5yb2RhdGEKKwkJZ2xvYmFsIF9fc3lzbGludXhfc2h1ZmZsZXJfc2l6ZQorCQlleHRlcm4gX19iY29weXh4X2xlbgorCQlhbGlnbiA0CitfX3N5c2xpbnV4X3NodWZmbGVyX3NpemU6CisJCWRkIF9fYmNvcHl4eF9sZW4KKworCQliaXRzIDE2CisJCXNlY3Rpb24gLnRleHQxNgpkaWZmIC0tZ2l0IGEvY29yZS9iaW9zLmMgYi9jb3JlL2Jpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmIzN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9iaW9zLmMKQEAgLTAsMCArMSw3MTkgQEAKKyNpbmNsdWRlIDxzeXMvYW5zaS5oPgorI2luY2x1ZGUgPHN5cy9pby5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8Ymlvcy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8Z3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tZW1zY2FuLmg+CisjaW5jbHVkZSA8c3lzbGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC92aWRlby5oPgorCisjaW5jbHVkZSA8c3lzL3Zlc2EvdmVzYS5oPgorI2luY2x1ZGUgPHN5cy92ZXNhL3ZpZGVvLmg+CisjaW5jbHVkZSA8c3lzL3Zlc2EvZGVidWcuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlICJjb3JlLmgiCisKK19fZXhwb3J0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmUgPSBOVUxMOworCitleHRlcm4gc3RydWN0IGFuc2lfb3BzIGJpb3NfYW5zaV9vcHM7CisKKyNkZWZpbmUgQklPU19DVVJYWSAoKHN0cnVjdCBjdXJ4eSAqKTB4NDUwKQkvKiBBcnJheSBmb3IgZWFjaCBwYWdlICovCisjZGVmaW5lIEJJT1NfUk9XUyAoKih1aW50OF90ICopMHg0ODQpCS8qIE1pbnVzIG9uZTsgaWYgemVybyB1c2UgMjQgKD0gMjUgbGluZXMpICovCisjZGVmaW5lIEJJT1NfQ09MUyAoKih1aW50MTZfdCAqKTB4NDRBKQorI2RlZmluZSBCSU9TX1BBR0UgKCoodWludDhfdCAqKTB4NDYyKQorCitzdGF0aWMgdm9pZCBiaW9zX3RleHRfbW9kZSh2b2lkKQoreworICAgIHN5c2xpbnV4X2ZvcmNlX3RleHRfbW9kZSgpOworfQorCitzdGF0aWMgdm9pZCBiaW9zX2dldF9tb2RlKGludCAqY29scywgaW50ICpyb3dzKQoreworICAgICpyb3dzID0gQklPU19ST1dTID8gQklPU19ST1dTICsgMSA6IDI1OworICAgICpjb2xzID0gQklPU19DT0xTOworfQorCitzdGF0aWMgdWludDE2X3QgY3Vyc29yX3R5cGU7CS8qIFNhdmVkIGN1cnNvciBwYXR0ZXJuICovCisKK3N0YXRpYyB2b2lkIGJpb3NfZ2V0X2N1cnNvcih1aW50OF90ICp4LCB1aW50OF90ICp5KQoreworICAgIGNvbTMyc3lzX3QgaXJlZywgb3JlZzsKKworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mKGlyZWcpKTsKKworICAgIGlyZWcuZWF4LmJbMV0gPSAweDAzOworICAgIGlyZWcuZWJ4LmJbMV0gPSBCSU9TX1BBR0U7CisgICAgX19pbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CisgICAgY3Vyc29yX3R5cGUgPSBvcmVnLmVjeC53WzBdOworICAgICp4ID0gb3JlZy5lZHguYlswXTsKKyAgICAqeSA9IG9yZWcuZWR4LmJbMV07Cit9CisKK3N0YXRpYyB2b2lkIGJpb3NfZXJhc2UoaW50IHgwLCBpbnQgeTAsIGludCB4MSwgaW50IHkxLCB1aW50OF90IGF0dHJpYnV0ZSkKK3sKKyAgICBzdGF0aWMgY29tMzJzeXNfdCBpcmVnOworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mKGlyZWcpKTsKKworICAgIGlyZWcuZWF4LndbMF0gPSAweDA2MDA7CS8qIENsZWFyIHdpbmRvdyAqLworICAgIGlyZWcuZWJ4LmJbMV0gPSBhdHRyaWJ1dGU7CisgICAgaXJlZy5lY3guYlswXSA9IHgwOworICAgIGlyZWcuZWN4LmJbMV0gPSB5MDsKKyAgICBpcmVnLmVkeC5iWzBdID0geDE7CisgICAgaXJlZy5lZHguYlsxXSA9IHkxOworICAgIF9faW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGJpb3Nfc2hvd2N1cnNvcihjb25zdCBzdHJ1Y3QgdGVybV9zdGF0ZSAqc3QpCit7CisgICAgc3RhdGljIGNvbTMyc3lzX3QgaXJlZzsKKyAgICB1aW50MTZfdCBjdXJzb3IgPSBzdC0+Y3Vyc29yID8gY3Vyc29yX3R5cGUgOiAweDIwMjA7CisKKyAgICBtZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisKKyAgICBpcmVnLmVheC5iWzFdID0gMHgwMTsKKyAgICBpcmVnLmVjeC53WzBdID0gY3Vyc29yOworICAgIF9faW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGJpb3Nfc2V0X2N1cnNvcihpbnQgeCwgaW50IHksIGJvb2wgdmlzaWJsZSkKK3sKKyAgICBjb25zdCBpbnQgcGFnZSA9IEJJT1NfUEFHRTsKKyAgICBzdHJ1Y3QgY3VyeHkgeHkgPSBCSU9TX0NVUlhZW3BhZ2VdOworICAgIHN0YXRpYyBjb20zMnN5c190IGlyZWc7CisKKyAgICBtZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisKKyAgICAodm9pZCl2aXNpYmxlOworCisgICAgaWYgKHh5LnggIT0geCB8fCB4eS55ICE9IHkpIHsKKwlpcmVnLmVheC5iWzFdID0gMHgwMjsKKwlpcmVnLmVieC5iWzFdID0gcGFnZTsKKwlpcmVnLmVkeC5iWzFdID0geTsKKwlpcmVnLmVkeC5iWzBdID0geDsKKwlfX2ludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYmlvc193cml0ZV9jaGFyKHVpbnQ4X3QgY2gsIHVpbnQ4X3QgYXR0cmlidXRlKQoreworICAgIHN0YXRpYyBjb20zMnN5c190IGlyZWc7CisKKyAgICBtZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisKKyAgICBpcmVnLmVheC5iWzFdID0gMHgwOTsKKyAgICBpcmVnLmVheC5iWzBdID0gY2g7CisgICAgaXJlZy5lYnguYlsxXSA9IEJJT1NfUEFHRTsKKyAgICBpcmVnLmVieC5iWzBdID0gYXR0cmlidXRlOworICAgIGlyZWcuZWN4LndbMF0gPSAxOworICAgIF9faW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGJpb3Nfc2Nyb2xsX3VwKHVpbnQ4X3QgY29scywgdWludDhfdCByb3dzLCB1aW50OF90IGF0dHJpYnV0ZSkKK3sKKyAgICBzdGF0aWMgY29tMzJzeXNfdCBpcmVnOworCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YoaXJlZykpOworCisgICAgaXJlZy5lYXgud1swXSA9IDB4MDYwMTsKKyAgICBpcmVnLmVieC5iWzFdID0gYXR0cmlidXRlOworICAgIGlyZWcuZWN4LndbMF0gPSAwOworICAgIGlyZWcuZWR4LmJbMV0gPSByb3dzOworICAgIGlyZWcuZWR4LmJbMF0gPSBjb2xzOworICAgIF9faW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CS8qIFNjcm9sbCAqLworfQorCitzdGF0aWMgdm9pZCBiaW9zX2JlZXAodm9pZCkKK3sKKyAgICBzdGF0aWMgY29tMzJzeXNfdCBpcmVnOworCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YoaXJlZykpOworCisgICAgaXJlZy5lYXgud1swXSA9IDB4MGUwNzsKKyAgICBpcmVnLmVieC5iWzFdID0gQklPU19QQUdFOworICAgIF9faW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7Cit9CisKK3N0cnVjdCBvdXRwdXRfb3BzIGJpb3Nfb3V0cHV0X29wcyA9IHsKKwkuZXJhc2UgPSBiaW9zX2VyYXNlLAorCS53cml0ZV9jaGFyID0gYmlvc193cml0ZV9jaGFyLAorCS5zaG93Y3Vyc29yID0gYmlvc19zaG93Y3Vyc29yLAorCS5zZXRfY3Vyc29yID0gYmlvc19zZXRfY3Vyc29yLAorCS5zY3JvbGxfdXAgPSBiaW9zX3Njcm9sbF91cCwKKwkuYmVlcCA9IGJpb3NfYmVlcCwKKwkuZ2V0X21vZGUgPSBiaW9zX2dldF9tb2RlLAorCS50ZXh0X21vZGUgPSBiaW9zX3RleHRfbW9kZSwKKwkuZ2V0X2N1cnNvciA9IGJpb3NfZ2V0X2N1cnNvciwKK307CisKK2V4dGVybiBjaGFyIGJpb3NfZ2V0Y2hhcihjaGFyICopOworZXh0ZXJuIGludCBiaW9zX3BvbGxjaGFyKHZvaWQpOworZXh0ZXJuIHVpbnQ4X3QgYmlvc19zaGlmdGZsYWdzKHZvaWQpOworCitzdHJ1Y3QgaW5wdXRfb3BzIGJpb3NfaW5wdXRfb3BzID0geworCS5nZXRjaGFyID0gYmlvc19nZXRjaGFyLAorCS5wb2xsY2hhciA9IGJpb3NfcG9sbGNoYXIsCisJLnNoaWZ0ZmxhZ3MgPSBiaW9zX3NoaWZ0ZmxhZ3MsCit9OworCitzdGF0aWMgdm9pZCBiaW9zX2dldF9zZXJpYWxfY29uc29sZV9pbmZvKHVpbnQxNl90ICppb2Jhc2UsIHVpbnQxNl90ICpkaXZpc29yLAorCQkJCQkgdWludDE2X3QgKmZsb3djdGwpCit7CisgICAgKmlvYmFzZSA9IFNlcmlhbFBvcnQ7CisgICAgKmRpdmlzb3IgPSBCYXVkRGl2aXNvcjsKKworICAgICpmbG93Y3RsID0gRmxvd091dHB1dCB8IEZsb3dJbnB1dCB8IChGbG93SWdub3JlIDw8IDQpOworCisgICAgaWYgKCFEaXNwbGF5Q29uKQorCSpmbG93Y3RsIHw9ICgweDgwIDw8IDgpOworfQorCit2b2lkIGJpb3NfYWR2X2luaXQodm9pZCkKK3sKKyAgICBzdGF0aWMgY29tMzJzeXNfdCByZWc7CisKKyAgICBtZW1zZXQoJnJlZywgMCwgc2l6ZW9mKHJlZykpOworICAgIGNhbGwxNihhZHZfaW5pdCwgJnJlZywgTlVMTCk7Cit9CisKK2ludCBiaW9zX2Fkdl93cml0ZSh2b2lkKQoreworICAgIHN0YXRpYyBjb20zMnN5c190IHJlZzsKKworICAgIG1lbXNldCgmcmVnLCAwLCBzaXplb2YocmVnKSk7CisgICAgY2FsbDE2KGFkdl93cml0ZSwgJnJlZywgJnJlZyk7CisgICAgcmV0dXJuIChyZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpID8gLTEgOiAwOworfQorCitzdHJ1Y3QgYWR2X29wcyBiaW9zX2Fkdl9vcHMgPSB7CisJLmluaXQgPSBiaW9zX2Fkdl9pbml0LAorCS53cml0ZSA9IGJpb3NfYWR2X3dyaXRlLAorfTsKKworCitzdGF0aWMgaW50IF9fY29uc3RmdW5jIGlzX3Bvd2VyX29mXzIodW5zaWduZWQgaW50IHgpCit7CisgICAgcmV0dXJuIHggJiYgISh4ICYgKHggLSAxKSk7Cit9CisKK3N0YXRpYyBpbnQgdmVzYWNvbl9wYWdlZF9tb2RlX29rKGNvbnN0IHN0cnVjdCB2ZXNhX21vZGVfaW5mbyAqbWkpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoIWlzX3Bvd2VyX29mXzIobWktPndpbl9zaXplKSB8fAorCSFpc19wb3dlcl9vZl8yKG1pLT53aW5fZ3JhaW4pIHx8IG1pLT53aW5fZ3JhaW4gPiBtaS0+d2luX3NpemUpCisJcmV0dXJuIDA7CQkvKiBJbXBvc3NpYmxlLi4uICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJaWYgKChtaS0+d2luX2F0dHJbaV0gJiAweDA1KSA9PSAweDA1ICYmIG1pLT53aW5fc2VnW2ldKQorCSAgICByZXR1cm4gMTsJCS8qIFVzYWJsZSB3aW5kb3cgKi8KKyAgICB9CisKKyAgICByZXR1cm4gMDsJCQkvKiBOb3BlLi4uICovCit9CisKK3N0YXRpYyBpbnQgYmlvc192ZXNhY29uX3NldF9tb2RlKHN0cnVjdCB2ZXNhX2luZm8gKnZlc2FfaW5mbywgaW50ICpweCwgaW50ICpweSwKKwkJCQkgZW51bSB2ZXNhX3BpeGVsX2Zvcm1hdCAqYmVzdHB4ZikKK3sKKyAgICBjb20zMnN5c190IHJtOworICAgIHVpbnQxNl90IG1vZGUsIGJlc3Rtb2RlLCAqbW9kZV9wdHI7CisgICAgc3RydWN0IHZlc2FfaW5mbyAqdmk7CisgICAgc3RydWN0IHZlc2FfZ2VuZXJhbF9pbmZvICpnaTsKKyAgICBzdHJ1Y3QgdmVzYV9tb2RlX2luZm8gKm1pOworICAgIGVudW0gdmVzYV9waXhlbF9mb3JtYXQgcHhmOworICAgIGludCB4ID0gKnB4LCB5ID0gKnB5OworICAgIGludCBlcnIgPSAwOworCisgICAgLyogQWxsb2NhdGUgc3BhY2UgaW4gdGhlIGJvdW5jZSBidWZmZXIgZm9yIHRoZXNlIHN0cnVjdHVyZXMgKi8KKyAgICB2aSA9IGx6YWxsb2Moc2l6ZW9mICp2aSk7CisgICAgaWYgKCF2aSkgeworCWVyciA9IDEwOwkJLyogT3V0IG9mIG1lbW9yeSAqLworCWdvdG8gZXhpdDsKKyAgICB9CisgICAgZ2kgPSAmdmktPmdpOworICAgIG1pID0gJnZpLT5taTsKKworICAgIG1lbXNldCgmcm0sIDAsIHNpemVvZiBybSk7CisKKyAgICBnaS0+c2lnbmF0dXJlID0gVkJFMl9NQUdJQzsJLyogR2V0IFZCRTIgZXh0ZW5kZWQgZGF0YSAqLworICAgIHJtLmVheC53WzBdID0gMHg0RjAwOwkvKiBHZXQgU1ZHQSBnZW5lcmFsIGluZm9ybWF0aW9uICovCisgICAgcm0uZWRpLndbMF0gPSBPRkZTKGdpKTsKKyAgICBybS5lcyA9IFNFRyhnaSk7CisgICAgX19pbnRjYWxsKDB4MTAsICZybSwgJnJtKTsKKworICAgIGlmIChybS5lYXgud1swXSAhPSAweDAwNEYpIHsKKwllcnIgPSAxOwkJLyogRnVuY3Rpb24gY2FsbCBmYWlsZWQgKi8KKwlnb3RvIGV4aXQ7CisgICAgfQorICAgIGlmIChnaS0+c2lnbmF0dXJlICE9IFZFU0FfTUFHSUMpIHsKKwllcnIgPSAyOwkJLyogTm8gbWFnaWMgKi8KKwlnb3RvIGV4aXQ7CisgICAgfQorICAgIGlmIChnaS0+dmVyc2lvbiA8IDB4MDEwMikgeworCWVyciA9IDM7CQkvKiBWRVNBIDEuMisgcmVxdWlyZWQgKi8KKwlnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyogQ29weSBnZW5lcmFsIGluZm8gKi8KKyAgICBtZW1jcHkoJnZlc2FfaW5mby0+Z2ksIGdpLCBzaXplb2YgKmdpKTsKKworICAgIC8qIFNlYXJjaCBmb3IgdGhlIHByb3BlciBtb2RlIHdpdGggYSBzdWl0YWJsZSBjb2xvciBhbmQgbWVtb3J5IG1vZGVsLi4uICovCisKKyAgICBtb2RlX3B0ciA9IEdFVF9QVFIoZ2ktPnZpZGVvX21vZGVfcHRyKTsKKyAgICBiZXN0bW9kZSA9IDA7CisgICAgKmJlc3RweGYgPSBQWEZfTk9ORTsKKworICAgIHdoaWxlICgobW9kZSA9ICptb2RlX3B0cisrKSAhPSAweEZGRkYpIHsKKwltb2RlICY9IDB4MUZGOwkJLyogVGhlIHJlc3QgYXJlIGF0dHJpYnV0ZXMgb2Ygc29ydHMgKi8KKworCWRlYnVnKCJGb3VuZCBtb2RlOiAweCUwNHhcclxuIiwgbW9kZSk7CisKKyAgICAgICAgbWVtc2V0KCZybSwgMCwgc2l6ZW9mIHJtKTsKKwltZW1zZXQobWksIDAsIHNpemVvZiAqbWkpOworCXJtLmVheC53WzBdID0gMHg0RjAxOwkvKiBHZXQgU1ZHQSBtb2RlIGluZm9ybWF0aW9uICovCisJcm0uZWN4LndbMF0gPSBtb2RlOworCXJtLmVkaS53WzBdID0gT0ZGUyhtaSk7CisJcm0uZXMgPSBTRUcobWkpOworCV9faW50Y2FsbCgweDEwLCAmcm0sICZybSk7CisKKwkvKiBNdXN0IGJlIGEgc3VwcG9ydGVkIG1vZGUgKi8KKwlpZiAocm0uZWF4LndbMF0gIT0gMHgwMDRmKQorCSAgICBjb250aW51ZTsKKworCWRlYnVnCisJICAgICgibW9kZV9hdHRyIDB4JTA0eCwgaF9yZXMgPSAlNGQsIHZfcmVzID0gJTRkLCBicHAgPSAlMmQsIGxheW91dCA9ICVkICglZCwlZCwlZClcclxuIiwKKwkgICAgIG1pLT5tb2RlX2F0dHIsIG1pLT5oX3JlcywgbWktPnZfcmVzLCBtaS0+YnBwLCBtaS0+bWVtb3J5X2xheW91dCwKKwkgICAgIG1pLT5ycG9zLCBtaS0+Z3BvcywgbWktPmJwb3MpOworCisJLyogTXVzdCBiZSBhbiBMRkIgY29sb3IgZ3JhcGhpY3MgbW9kZSBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLgorCisJICAgVGhlIGJpdHMgdGVzdGVkIGFyZToKKwkgICA0IC0gZ3JhcGhpY3MgbW9kZQorCSAgIDMgLSBjb2xvciBtb2RlCisJICAgMSAtIG1vZGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIChtYW5kYXRvcnkgaW4gVkJFIDEuMispCisJICAgMCAtIG1vZGUgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlCisJICovCisJaWYgKChtaS0+bW9kZV9hdHRyICYgMHgwMDFiKSAhPSAweDAwMWIpCisJICAgIGNvbnRpbnVlOworCisJLyogTXVzdCBiZSB0aGUgY2hvc2VuIHNpemUgKi8KKwlpZiAobWktPmhfcmVzICE9IHggfHwgbWktPnZfcmVzICE9IHkpCisJICAgIGNvbnRpbnVlOworCisJLyogV2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aWJhbmsgKGludGVybGFjZWQgbWVtb3J5KSBtb2RlcyAqLworCS8qCisJICogIE5vdGU6IFRoZSBCb2NocyBWRVNBIEJJT1MgKHZiZS5jIDEuNTggMjAwNi8wOC8xOSkgdmlvbGF0ZXMgdGhlCisJICogc3BlY2lmaWNhdGlvbiB3aGljaCBzdGF0ZXMgdGhhdCBiYW5rcyA9PSAxIGZvciB1bmJhbmtlZCBtb2RlczsKKwkgKiBmb3J0dW5hdGVseSBpdCBkb2VzIHJlcG9ydCBiYW5rX3NpemUgPT0gMCBmb3IgdGhvc2UuCisJICovCisJaWYgKG1pLT5iYW5rcyA+IDEgJiYgbWktPmJhbmtfc2l6ZSkgeworCSAgICBkZWJ1ZygiYmFkOiBiYW5rcyA9ICVkLCBiYW5rc2l6ZSA9ICVkLCBwYWdlcyA9ICVkXHJcbiIsCisJCSAgbWktPmJhbmtzLCBtaS0+YmFua19zaXplLCBtaS0+aW1hZ2VfcGFnZXMpOworCSAgICBjb250aW51ZTsKKwl9CisKKwkvKiBNdXN0IGJlIGVpdGhlciBhIGZsYXQtZnJhbWVidWZmZXIgbW9kZSwgb3IgYmUgYW4gYWNjZXB0YWJsZQorCSAgIHBhZ2VkIG1vZGUgKi8KKwlpZiAoIShtaS0+bW9kZV9hdHRyICYgMHgwMDgwKSAmJiAhdmVzYWNvbl9wYWdlZF9tb2RlX29rKG1pKSkgeworCSAgICBkZWJ1ZygiYmFkOiBpbnZhbGlkIHBhZ2VkIG1vZGVcclxuIik7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qIE11c3QgZWl0aGVyIGJlIGEgcGFja2VkLXBpeGVsIG1vZGUgb3IgYSBkaXJlY3QgY29sb3IgbW9kZQorCSAgIChkZXBlbmRpbmcgb24gVkVTQSB2ZXJzaW9uICk7IG11c3QgYmUgYSBzdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0ICovCisJcHhmID0gUFhGX05PTkU7CQkvKiBOb3QgdXNhYmxlICovCisKKwlpZiAobWktPmJwcCA9PSAzMiAmJgorCSAgICAobWktPm1lbW9yeV9sYXlvdXQgPT0gNCB8fAorCSAgICAgKG1pLT5tZW1vcnlfbGF5b3V0ID09IDYgJiYgbWktPnJwb3MgPT0gMTYgJiYgbWktPmdwb3MgPT0gOCAmJgorCSAgICAgIG1pLT5icG9zID09IDApKSkKKwkgICAgcHhmID0gUFhGX0JHUkEzMjsKKwllbHNlIGlmIChtaS0+YnBwID09IDI0ICYmCisJCSAobWktPm1lbW9yeV9sYXlvdXQgPT0gNCB8fAorCQkgIChtaS0+bWVtb3J5X2xheW91dCA9PSA2ICYmIG1pLT5ycG9zID09IDE2ICYmIG1pLT5ncG9zID09IDggJiYKKwkJICAgbWktPmJwb3MgPT0gMCkpKQorCSAgICBweGYgPSBQWEZfQkdSMjQ7CisJZWxzZSBpZiAobWktPmJwcCA9PSAxNiAmJgorCQkgKG1pLT5tZW1vcnlfbGF5b3V0ID09IDQgfHwKKwkJICAobWktPm1lbW9yeV9sYXlvdXQgPT0gNiAmJiBtaS0+cnBvcyA9PSAxMSAmJiBtaS0+Z3BvcyA9PSA1ICYmCisJCSAgIG1pLT5icG9zID09IDApKSkKKwkgICAgcHhmID0gUFhGX0xFX1JHQjE2XzU2NTsKKwllbHNlIGlmIChtaS0+YnBwID09IDE1ICYmCisJCSAobWktPm1lbW9yeV9sYXlvdXQgPT0gNCB8fAorCQkgIChtaS0+bWVtb3J5X2xheW91dCA9PSA2ICYmIG1pLT5ycG9zID09IDEwICYmIG1pLT5ncG9zID09IDUgJiYKKwkJICAgbWktPmJwb3MgPT0gMCkpKQorCSAgICBweGYgPSBQWEZfTEVfUkdCMTVfNTU1OworCisJaWYgKHB4ZiA8ICpiZXN0cHhmKSB7CisJICAgIGRlYnVnKCJCZXN0IG1vZGUgc28gZmFyLCBweGYgPSAlZFxyXG4iLCBweGYpOworCisJICAgIC8qIEJlc3QgbW9kZSBzbyBmYXIuLi4gKi8KKwkgICAgYmVzdG1vZGUgPSBtb2RlOworCSAgICAqYmVzdHB4ZiA9IHB4ZjsKKworCSAgICAvKiBDb3B5IG1vZGUgaW5mbyAqLworCSAgICBtZW1jcHkoJnZlc2FfaW5mby0+bWksIG1pLCBzaXplb2YgKm1pKTsKKwl9CisgICAgfQorCisgICAgaWYgKCpiZXN0cHhmID09IFBYRl9OT05FKSB7CisJZXJyID0gNDsJCS8qIE5vIG1vZGUgZm91bmQgKi8KKwlnb3RvIGV4aXQ7CisgICAgfQorCisgICAgbWkgPSAmdmVzYV9pbmZvLT5taTsKKyAgICBtb2RlID0gYmVzdG1vZGU7CisKKyAgICBtZW1zZXQoJnJtLCAwLCBzaXplb2Ygcm0pOworICAgIC8qIE5vdyBzZXQgdmlkZW8gbW9kZSAqLworICAgIHJtLmVheC53WzBdID0gMHg0RjAyOwkvKiBTZXQgU1ZHQSB2aWRlbyBtb2RlICovCisgICAgaWYgKG1pLT5tb2RlX2F0dHIgJiAweDAwODApCisJbW9kZSB8PSAweDQwMDA7CQkvKiBSZXF1ZXN0IGxpbmVhciBmcmFtZWJ1ZmZlciBpZiBzdXBwb3J0ZWQgKi8KKyAgICBybS5lYngud1swXSA9IG1vZGU7CisgICAgX19pbnRjYWxsKDB4MTAsICZybSwgJnJtKTsKKyAgICBpZiAocm0uZWF4LndbMF0gIT0gMHgwMDRGKSB7CisJZXJyID0gOTsJCS8qIEZhaWxlZCB0byBzZXQgbW9kZSAqLworCWdvdG8gZXhpdDsKKyAgICB9CisKK2V4aXQ6CisgICAgaWYgKHZpKQorCWxmcmVlKHZpKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHNldF93aW5kb3dfcG9zKHN0cnVjdCB3aW5faW5mbyAqd2ksIHNpemVfdCB3aW5fcG9zKQoreworICAgIHN0YXRpYyBjb20zMnN5c190IGlyZWc7CisKKyAgICB3aS0+d2luX3BvcyA9IHdpbl9wb3M7CisKKyAgICBpZiAod2ktPndpbl9udW0gPCAwKQorCXJldHVybjsJCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gKi8KKworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworICAgIGlyZWcuZWF4LndbMF0gPSAweDRGMDU7CisgICAgaXJlZy5lYnguYlswXSA9IHdpLT53aW5fbnVtOworICAgIGlyZWcuZWR4LndbMF0gPSB3aW5fcG9zID4+IHdpLT53aW5fZ3NoaWZ0OworCisgICAgX19pbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgYmlvc192ZXNhY29uX3NjcmVlbmNweShzaXplX3QgZHN0LCBjb25zdCB1aW50MzJfdCAqIHNyYywKKwkJCQkgICBzaXplX3QgYnl0ZXMsIHN0cnVjdCB3aW5faW5mbyAqd2kpCit7CisgICAgc2l6ZV90IHdpbl9wb3MsIHdpbl9vZmY7CisgICAgc2l6ZV90IHdpbl9zaXplID0gd2ktPndpbl9zaXplOworICAgIHNpemVfdCBvbWFzayA9IHdpbl9zaXplIC0gMTsKKyAgICBjaGFyICp3aW5fYmFzZSA9IHdpLT53aW5fYmFzZTsKKyAgICBjb25zdCBjaGFyICpzID0gKGNvbnN0IGNoYXIgKilzcmM7CisgICAgc2l6ZV90IGw7CisKKyAgICB3aGlsZSAoYnl0ZXMpIHsKKwl3aW5fb2ZmID0gZHN0ICYgb21hc2s7CisJd2luX3BvcyA9IGRzdCAmIH5vbWFzazsKKworCWlmIChfX3VubGlrZWx5KHdpbl9wb3MgIT0gd2ktPndpbl9wb3MpKQorCSAgICBzZXRfd2luZG93X3Bvcyh3aSwgd2luX3Bvcyk7CisKKwlsID0gbWluKGJ5dGVzLCB3aW5fc2l6ZSAtIHdpbl9vZmYpOworCW1lbWNweSh3aW5fYmFzZSArIHdpbl9vZmYsIHMsIGwpOworCisJYnl0ZXMgLT0gbDsKKwlzICs9IGw7CisJZHN0ICs9IGw7CisgICAgfQorfQorCitzdGF0aWMgaW50IGJpb3NfZm9udF9xdWVyeSh1aW50OF90ICoqZm9udCkKK3sKKyAgICBjb20zMnN5c190IHJtOworCisgICAgLyogR2V0IEJJT1MgOHgxNiBmb250ICovCisKKyAgICBtZW1zZXQoJnJtLCAwLCBzaXplb2Ygcm0pOworCisgICAgcm0uZWF4LndbMF0gPSAweDExMzA7CS8qIEdldCBGb250IEluZm9ybWF0aW9uICovCisgICAgcm0uZWJ4LndbMF0gPSAweDA2MDA7CS8qIEdldCA4eDE2IFJPTSBmb250ICovCisgICAgX19pbnRjYWxsKDB4MTAsICZybSwgJnJtKTsKKyAgICAqZm9udCA9IE1LX1BUUihybS5lcywgcm0uZWJwLndbMF0pOworCisgICAgcmV0dXJuIDE2OworCit9CitzdHJ1Y3QgdmVzYV9vcHMgYmlvc192ZXNhX29wcyA9IHsKKwkuc2V0X21vZGUgID0gYmlvc192ZXNhY29uX3NldF9tb2RlLAorCS5zY3JlZW5jcHkgPSBiaW9zX3Zlc2Fjb25fc2NyZWVuY3B5LAorCS5mb250X3F1ZXJ5ID0gYmlvc19mb250X3F1ZXJ5LAorfTsKKworc3RhdGljIHVpbnQzMl90IG1pbl9sb3dtZW1faGVhcCA9IDY1NTM2OworZXh0ZXJuIGNoYXIgX19sb3dtZW1faGVhcFtdOwordWludDhfdCBLYmRGbGFnczsJCS8qIENoZWNrIGZvciBrZXlib2FyZCBlc2NhcGVzICovCitfX2V4cG9ydCB1aW50OF90IEtiZE1hcFsyNTZdOwkvKiBLZXlib2FyZCBtYXAgKi8KKworX19leHBvcnQgdWludDE2X3QgUFhFUmV0cnk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19lc2NhcGVzKHZvaWQpCit7CisJY29tMzJzeXNfdCBpcmVnLCBvcmVnOworCisgICAgICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworCWlyZWcuZWF4LmJbMV0gPSAweDAyOwkvKiBDaGVjayBrZXlib2FyZCBmbGFncyAqLworCV9faW50Y2FsbCgweDE2LCAmaXJlZywgJm9yZWcpOworCisJS2JkRmxhZ3MgPSBvcmVnLmVheC5iWzBdOworCisJLyogQ3RybC0+c2tpcCAzODYgY2hlY2sgKi8KKwlpZiAoIShvcmVnLmVheC5iWzBdICYgMHgwNCkpIHsKKwkJLyoKKwkJICogTm93IGNoZWNrIHRoYXQgdGhlcmUgaXMgc3VmZmljaWVudCBsb3cgKERPUykgbWVtb3J5CisJCSAqCisJCSAqIE5PVEU6IExpbnV4IGRvZXNuJ3QgdXNlIGFsbCBvZiByZWFsX21vZGVfc2VnLCBidXQgd2UgdXNlCisJCSAqIHRoZSBzYW1lIHNlZ21lbnQgZm9yIENPTUJPT1QgaW1hZ2VzLCB3aGljaCBjYW4gdXNlIGFsbCA2NEsuCisJCSAqLworCQl1aW50MzJfdCBtZW07CisKKwkJX19pbnRjYWxsKDB4MTIsICZpcmVnLCAmb3JlZyk7CisKKwkJbWVtID0gKCh1aW50MzJfdClfX2xvd21lbV9oZWFwKSArIG1pbl9sb3dtZW1faGVhcCArIDEwMjM7CisJCW1lbSA9IG1lbSA+PiAxMDsKKworCQlpZiAob3JlZy5lYXgud1swXSA8IG1lbSkgeworCQkJY2hhciBidWZbMjU2XTsKKworCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJCQkgIkl0IGFwcGVhcnMgeW91ciBjb21wdXRlciBoYXMgb25seSAiCisJCQkJICIlZEsgb2YgbG93IChcIkRPU1wiKSBSQU0uXG4iCisJCQkJICJUaGlzIHZlcnNpb24gb2YgU3lzbGludXggbmVlZHMgIgorCQkJCSAiJWRLIHRvIGJvb3QuICAiCisJCQkJICJJZiB5b3UgZ2V0IHRoaXNcbm1lc3NhZ2UgaW4gZXJyb3IsICIKKwkJCQkgImhvbGQgZG93biB0aGUgQ3RybCBrZXkgd2hpbGUgYm9vdGluZywgIgorCQkJCSAiYW5kIElcbndpbGwgdGFrZSB5b3VyIHdvcmQgZm9yIGl0LlxuIiwKKwkJCQkgb3JlZy5lYXgud1swXSwgbWVtKTsKKwkJCXdyaXRlc3RyKGJ1Zik7CisJCQlrYWJvb20oKTsKKwkJfQorCX0KK30KKworZXh0ZXJuIHVpbnQzMl90IEJJT1NfdGltZXJfbmV4dDsKK2V4dGVybiB1aW50MzJfdCB0aW1lcl9pcnE7CitzdGF0aWMgaW5saW5lIHZvaWQgYmlvc190aW1lcl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBuZXh0OworCXVpbnQzMl90ICpob29rID0gKHVpbnQzMl90ICopQklPU190aW1lcl9ob29rOworCisJbmV4dCA9ICpob29rOworCUJJT1NfdGltZXJfbmV4dCA9IG5leHQ7CisJKmhvb2sgPSAodWludDMyX3QpJnRpbWVyX2lycTsKK30KKworZXh0ZXJuIHVpbnQxNl90ICpiaW9zX2ZyZWVfbWVtOworCitzdHJ1Y3QgZTgyMF9lbnRyeSB7CisgICAgdWludDY0X3Qgc3RhcnQ7CisgICAgdWludDY0X3QgbGVuOworICAgIHVpbnQzMl90IHR5cGU7Cit9OworCitzdGF0aWMgaW50IGJpb3Nfc2Nhbl9tZW1vcnkoc2Nhbl9tZW1vcnlfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCAqZGF0YSkKK3sKKyAgICBzdGF0aWMgY29tMzJzeXNfdCBpcmVnOworICAgIGNvbTMyc3lzX3Qgb3JlZzsKKyAgICBzdHJ1Y3QgZTgyMF9lbnRyeSAqZTgyMGJ1ZjsKKyAgICB1aW50NjRfdCBzdGFydCwgbGVuLCBtYXhsZW47CisgICAgaW50IG1lbWZvdW5kID0gMDsKKyAgICBpbnQgcnY7CisgICAgYWRkcl90IGRvc21lbTsKKyAgICBjb25zdCBhZGRyX3QgYmlvc19kYXRhID0gMHg1MTA7CS8qIEFtb3VudCB0byByZXNlcnZlIGZvciBCSU9TIGRhdGEgKi8KKworICAgIC8qIFVzZSBJTlQgMTJoIHRvIGdldCBET1MgbWVtb3J5ICovCisgICAgX19pbnRjYWxsKDB4MTIsICZfX2NvbTMyX3plcm9fcmVncywgJm9yZWcpOworICAgIGRvc21lbSA9IG9yZWcuZWF4LndbMF0gPDwgMTA7CisgICAgaWYgKGRvc21lbSA8IDMyICogMTAyNCB8fCBkb3NtZW0gPiA2NDAgKiAxMDI0KSB7CisJLyogSU5UIDEyaCByZXBvcnRzIG5vbnNlbnNlLi4uIG5vdyB3aGF0PyAqLworCXVpbnQxNl90IGViZGFfc2VnID0gKih1aW50MTZfdCAqKSAweDQwZTsKKwlpZiAoZWJkYV9zZWcgPj0gMHg4MDAwICYmIGViZGFfc2VnIDwgMHhhMDAwKQorCSAgICBkb3NtZW0gPSBlYmRhX3NlZyA8PCA0OworCWVsc2UKKwkgICAgZG9zbWVtID0gNjQwICogMTAyNDsJLyogSG9wZSBmb3IgdGhlIGJlc3QuLi4gKi8KKyAgICB9CisgICAgcnYgPSBjYWxsYmFjayhkYXRhLCBiaW9zX2RhdGEsIGRvc21lbSAtIGJpb3NfZGF0YSwgU01UX0ZSRUUpOworICAgIGlmIChydikKKwlyZXR1cm4gcnY7CisKKyAgICAvKiBGaXJzdCB0cnkgSU5UIDE1aCBBWD1FODIwaCAqLworICAgIGU4MjBidWYgPSBsemFsbG9jKHNpemVvZiAqZTgyMGJ1Zik7CisgICAgaWYgKCFlODIwYnVmKQorCXJldHVybiAtMTsKKworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworICAgIGlyZWcuZWF4LmwgPSAweGU4MjA7CisgICAgaXJlZy5lZHgubCA9IDB4NTM0ZDQxNTA7CisgICAgaXJlZy5lYngubCA9IDA7CisgICAgaXJlZy5lY3gubCA9IHNpemVvZigqZTgyMGJ1Zik7CisgICAgaXJlZy5lcyA9IFNFRyhlODIwYnVmKTsKKyAgICBpcmVnLmVkaS53WzBdID0gT0ZGUyhlODIwYnVmKTsKKworICAgIGRvIHsKKwlfX2ludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKKworCWlmICgob3JlZy5lZmxhZ3MubCAmIEVGTEFHU19DRikgfHwKKwkgICAgKG9yZWcuZWF4LmwgIT0gMHg1MzRkNDE1MCkgfHwgKG9yZWcuZWN4LmwgPCAyMCkpCisJICAgIGJyZWFrOworCisJc3RhcnQgPSBlODIwYnVmLT5zdGFydDsKKwlsZW4gPSBlODIwYnVmLT5sZW47CisKKwlpZiAoc3RhcnQgPCAweDEwMDAwMDAwMFVMTCkgeworCSAgICAvKiBEb24ndCByZWx5IG9uIEU4MjAgYmVpbmcgdmFsaWQgZm9yIGxvdyBtZW1vcnkuICBEb2luZyBzbworCSAgICAgICBjb3VsZCBtZWFuIHN0dWZmIGxpa2Ugb3ZlcndyaXRpbmcgdGhlIFBYRSBzdGFjayBldmVuIHdoZW4KKwkgICAgICAgdXNpbmcgImtlZXBweGUiLCBldGMuICovCisJICAgIGlmIChzdGFydCA8IDB4MTAwMDAwVUxMKSB7CisJCWlmIChsZW4gPiAweDEwMDAwMFVMTCAtIHN0YXJ0KQorCQkgICAgbGVuIC09IDB4MTAwMDAwVUxMIC0gc3RhcnQ7CisJCWVsc2UKKwkJICAgIGxlbiA9IDA7CisJCXN0YXJ0ID0gMHgxMDAwMDBVTEw7CisJICAgIH0KKworCSAgICBtYXhsZW4gPSAweDEwMDAwMDAwMFVMTCAtIHN0YXJ0OworCSAgICBpZiAobGVuID4gbWF4bGVuKQorCQlsZW4gPSBtYXhsZW47CisKKwkgICAgaWYgKGxlbikgeworCQllbnVtIHN5c2xpbnV4X21lbW1hcF90eXBlcyB0eXBlOworCisJCXR5cGUgPSBlODIwYnVmLT50eXBlID09IDEgPyBTTVRfRlJFRSA6IFNNVF9SRVNFUlZFRDsKKwkJcnYgPSBjYWxsYmFjayhkYXRhLCAoYWRkcl90KSBzdGFydCwgKGFkZHJfdCkgbGVuLCB0eXBlKTsKKwkJaWYgKHJ2KQorCQkgICAgcmV0dXJuIHJ2OworCQltZW1mb3VuZCA9IDE7CisJICAgIH0KKwl9CisKKwlpcmVnLmVieC5sID0gb3JlZy5lYngubDsKKyAgICB9IHdoaWxlIChvcmVnLmVieC5sKTsKKworICAgIGxmcmVlKGU4MjBidWYpOworCisgICAgaWYgKG1lbWZvdW5kKQorCXJldHVybiAwOworCisgICAgLyogTmV4dCB0cnkgSU5UIDE1aCBBWD1FODAxaCAqLworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworICAgIGlyZWcuZWF4LndbMF0gPSAweGU4MDE7CisgICAgX19pbnRjYWxsKDB4MTUsICZpcmVnLCAmb3JlZyk7CisKKyAgICBpZiAoIShvcmVnLmVmbGFncy5sICYgRUZMQUdTX0NGKSAmJiBvcmVnLmVjeC53WzBdKSB7CisJcnYgPSBjYWxsYmFjayhkYXRhLCAoYWRkcl90KSAxIDw8IDIwLCBvcmVnLmVjeC53WzBdIDw8IDEwLCBTTVRfRlJFRSk7CisJaWYgKHJ2KQorCSAgICByZXR1cm4gcnY7CisKKwlpZiAob3JlZy5lZHgud1swXSkgeworCSAgICBydiA9IGNhbGxiYWNrKGRhdGEsIChhZGRyX3QpIDE2IDw8IDIwLAorCQkJICBvcmVnLmVkeC53WzBdIDw8IDE2LCBTTVRfRlJFRSk7CisJICAgIGlmIChydikKKwkJcmV0dXJuIHJ2OworCX0KKworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIEZpbmFsbHkgdHJ5IElOVCAxNWggQUg9ODhoICovCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisgICAgaXJlZy5lYXgud1swXSA9IDB4ODgwMDsKKyAgICBfX2ludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKKyAgICBpZiAoIShvcmVnLmVmbGFncy5sICYgRUZMQUdTX0NGKSAmJiBvcmVnLmVheC53WzBdKSB7CisJcnYgPSBjYWxsYmFjayhkYXRhLCAoYWRkcl90KSAxIDw8IDIwLCBvcmVnLmVjeC53WzBdIDw8IDEwLCBTTVRfRlJFRSk7CisJaWYgKHJ2KQorCSAgICByZXR1cm4gcnY7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzbGludXhfbWVtc2NhbiBiaW9zX21lbXNjYW4gPSB7CisgICAgLmZ1bmMgPSBiaW9zX3NjYW5fbWVtb3J5LAorfTsKKwordm9pZCBiaW9zX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgdGltZXIgKi8KKwliaW9zX3RpbWVyX2luaXQoKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJS2JkTWFwW2ldID0gaTsKKworCWJpb3NfYWRqdXN0X3NjcmVlbigpOworCisJLyogSW5pdCB0aGUgbWVtb3J5IHN1YnN5c3RlbSAqLworCWJpb3NfZnJlZV9tZW0gPSAodWludDE2X3QgKikweDQxMzsKKwlzeXNsaW51eF9tZW1zY2FuX2FkZCgmYmlvc19tZW1zY2FuKTsKKwltZW1faW5pdCgpOworCisJZHByaW50ZigiJXMlcyIsIHN5c2xpbnV4X2Jhbm5lciwgY29weXJpZ2h0X3N0cik7CisKKwkvKiBDUFUtZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZCByZWxhdGVkIGNoZWNrcy4gKi8KKwljaGVja19lc2NhcGVzKCk7CisKKwkvKgorCSAqIFNjYW4gdGhlIERNSSB0YWJsZXMgZm9yIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLgorCSAqLworCWRtaV9pbml0KCk7Cit9CisKK2V4dGVybiB2b2lkIGJpb3NfdGltZXJfY2xlYW51cCh2b2lkKTsKKworZXh0ZXJuIHVpbnQzMl90IE9yaWdGRENUYWJQdHI7CisKK3N0YXRpYyB2b2lkIGJpb3NfY2xlYW51cF9oYXJkd2FyZSh2b2lkKQoreworCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBvaW50ZXIgdG8gdGhlIGZsb3BweSBkZXNjcmlwdG9yIHRhYmxlICovCisJaWYgKE9yaWdGRENUYWJQdHIpCisJCSooKHVpbnQzMl90ICopKDQgKiAweDFlKSkgPSBPcmlnRkRDVGFiUHRyOworCisJLyoKKwkgKiBMaW51eCB3YW50cyB0aGUgZmxvcHB5IG1vdG9yIHNodXQgb2ZmIGJlZm9yZSBzdGFydGluZyB0aGUKKwkgKiBrZXJuZWwsIGF0IGxlYXN0IGJvb3RzZWN0LlMgc2VlbXMgdG8gaW1wbHkgc28uICBJZiB3ZSBkb24ndAorCSAqIGxvYWQgdGhlIGZsb3BweSBkcml2ZXIsIHRoaXMgaXMgKmRlZmluaXRlbHkqIHNvIQorCSAqLworCV9faW50Y2FsbCgweDEzLCAmemVyb19yZWdzLCBOVUxMKTsKKworCWNhbGwxNihiaW9zX3RpbWVyX2NsZWFudXAsICZ6ZXJvX3JlZ3MsIE5VTEwpOworCisJLyogSWYgd2UgZW5hYmxlZCBzZXJpYWwgcG9ydCBpbnRlcnJ1cHRzLCBjbGVhbiB0aGVtIHVwIG5vdyAqLworCXNpcnFfY2xlYW51cCgpOworfQorCitleHRlcm4gdm9pZCAqYmlvc19tYWxsb2Moc2l6ZV90LCBlbnVtIGhlYXAsIHNpemVfdCk7CitleHRlcm4gdm9pZCAqYmlvc19yZWFsbG9jKHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiB2b2lkIGJpb3NfZnJlZSh2b2lkICopOworCitzdHJ1Y3QgbWVtX29wcyBiaW9zX21lbV9vcHMgPSB7CisJLm1hbGxvYyA9IGJpb3NfbWFsbG9jLAorCS5yZWFsbG9jID0gYmlvc19yZWFsbG9jLAorCS5mcmVlID0gYmlvc19mcmVlLAorfTsKKworc3RydWN0IGZpcm13YXJlIGJpb3NfZncgPSB7CisJLmluaXQgPSBiaW9zX2luaXQsCisJLmFkanVzdF9zY3JlZW4gPSBiaW9zX2FkanVzdF9zY3JlZW4sCisJLmNsZWFudXAgPSBiaW9zX2NsZWFudXBfaGFyZHdhcmUsCisJLmRpc2tfaW5pdCA9IGJpb3NfZGlza19pbml0LAorCS5vX29wcyA9ICZiaW9zX291dHB1dF9vcHMsCisJLmlfb3BzID0gJmJpb3NfaW5wdXRfb3BzLAorCS5nZXRfc2VyaWFsX2NvbnNvbGVfaW5mbyA9IGJpb3NfZ2V0X3NlcmlhbF9jb25zb2xlX2luZm8sCisJLmFkdl9vcHMgPSAmYmlvc19hZHZfb3BzLAorCS52ZXNhID0gJmJpb3NfdmVzYV9vcHMsCisJLm1lbSA9ICZiaW9zX21lbV9vcHMsCit9OworCit2b2lkIHN5c2xpbnV4X3JlZ2lzdGVyX2Jpb3Modm9pZCkKK3sKKwlmaXJtd2FyZSA9ICZiaW9zX2Z3OworfQpkaWZmIC0tZ2l0IGEvY29yZS9iaW9zLmluYyBiL2NvcmUvYmlvcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxNTA1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvYmlvcy5pbmMKQEAgLTAsMCArMSw0NCBAQAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKzs7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IGJpb3MuaW5jCis7OworOzsgSGVhZGVyIGZpbGUgZm9yIHRoZSBCSU9TIGRhdGEgc3RydWN0dXJlcyBldGMuCis7OworCislaWZuZGVmIF9CSU9TX0lOQworJWRlZmluZSBfQklPU19JTkMKKworCQk7IEludGVycnVwdCB2ZWN0b3JzCisJCWFic29sdXRlIDQqMUNoCitCSU9TX3RpbWVyX2hvb2sJcmVzZCAxCisKKwkJYWJzb2x1dGUgNCoxRWgKK2ZkY3RhYgkJZXF1ICQKK2ZkY3RhYjEJCXJlc3cgMQorZmRjdGFiMgkJcmVzdyAxCisKKwkJYWJzb2x1dGUgMDQwMGgKK3NlcmlhbF9iYXNlCXJlc3cgNAkJCTsgQmFzZSBhZGRyZXNzZXMgZm9yIDQgc2VyaWFsIHBvcnRzCisJCWFic29sdXRlIDA0MTNoCitCSU9TX2ZibQlyZXN3IDEJCQk7IEZyZWUgQmFzZSBNZW1vcnkgKGtpbG9ieXRlcykKKwkJYWJzb2x1dGUgMDQ2MmgKK0JJT1NfcGFnZQlyZXNiIDEJCQk7IEN1cnJlbnQgdmlkZW8gcGFnZQorCQlhYnNvbHV0ZSAwNDZDaAorQklPU190aW1lcglyZXN3IDEJCQk7IFRpbWVyIHRpY2tzCisJCWFic29sdXRlIDA0NzJoCitCSU9TX21hZ2ljCXJlc3cgMQkJCTsgQklPUyByZXNldCBtYWdpYworICAgICAgICAgICAgICAgIGFic29sdXRlIDA0ODRoCitCSU9TX3ZpZHJvd3MgICAgcmVzYiAxCQkJOyBOdW1iZXIgb2Ygc2NyZWVuIHJvd3MKKworJWVuZGlmIDsgX0JJT1NfSU5DCmRpZmYgLS1naXQgYS9jb3JlL2NhbGwxNi5jIGIvY29yZS9jYWxsMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzFhZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jYWxsMTYuYwpAQCAtMCwwICsxLDUwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjYWxsMTYuYworICoKKyAqIFNpbXBsZSB3cmFwcGVyIHRvIGNhbGwgMTYtYml0IGNvcmUgZnVuY3Rpb25zIGZyb20gMzItYml0IGNvZGUKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjb3JlLmgiCisKK19fZXhwb3J0IGNvbnN0IGNvbTMyc3lzX3QgemVyb19yZWdzOwkvKiBDb21tb24gYWxsLXplcm8gcmVnaXN0ZXIgc2V0ICovCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZWZsYWdzKHZvaWQpCit7CisgICAgLy91aW50MzJfdCB2OworCisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKyAgICB1aW50MzJfdCB2OworICAgIGFzbSB2b2xhdGlsZSgicHVzaGZsIDsgcG9wbCAlMCIgOiAiPXJtIiAodikpOworI2VsaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDgKKyAgICB1aW50NjRfdCB2OworICAgIGFzbSB2b2xhdGlsZSgicHVzaGZxIDsgcG9wICUwIiA6ICI9cm0iICh2KSk7CisjZWxzZQorI2Vycm9yICJVbmFibGUgdG8gYnVpbGQgZm9yIHRvLWJlLWRlZmluZWQgYXJjaGl0ZWN0dXJlIHR5cGUiCisjZW5kaWYKKyAgICByZXR1cm4gdjsKK30KKworX19leHBvcnQgdm9pZCBjYWxsMTYodm9pZCAoKmZ1bmMpKHZvaWQpLCBjb25zdCBjb20zMnN5c190ICppcmVnLAorCQkgICAgIGNvbTMyc3lzX3QgKm9yZWcpCit7CisgICAgY29tMzJzeXNfdCB4cmVnID0gKmlyZWc7CisKKyAgICAvKiBFbmFibGUgaW50ZXJydXB0cyBpZiBhbmQgb25seSBpZiB0aGV5IGFyZSBlbmFibGVkIGluIHRoZSBjYWxsZXIgKi8KKyAgICB4cmVnLmVmbGFncy5sID0gKHhyZWcuZWZsYWdzLmwgJiB+RUZMQUdTX0lGKSB8IChlZmxhZ3MoKSAmIEVGTEFHU19JRik7CisKKyAgICBjb3JlX2ZhcmNhbGwoKHNpemVfdClmdW5jLCAmeHJlZywgb3JlZyk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2NhbGxiYWNrLmluYyBiL2NvcmUvY2FsbGJhY2suaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzMyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NhbGxiYWNrLmluYwpAQCAtMCwwICsxLDIyNiBAQAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyAgIENvcHlyaWdodCAxOTk0LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7OyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKzs7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IGNhbGxiYWNrLmluYworOzsKKzs7IENhbGxiYWNrcyBmcm9tIDMyLWJpdCBtb2RlIHRvIDE2LWJpdCBtb2RlCis7OworCis7Cis7IDE2LWJpdCBpbnRjYWxsL2ZhcmNhbGwgaGFuZGxpbmcgY29kZQorOworCis7Cis7IDMyLWJpdCBzdXBwb3J0IGNvZGUKKzsKKwkJYml0cyAzMgorCQlzZWN0aW9uIC50ZXh0CisKKzsKKzsgSW50Y2FsbC9mYXJjYWxsIGludm9jYXRpb24uICBXZSBtYW5pZmVzdCBhIHN0cnVjdHVyZSBvbiB0aGUgcmVhbC1tb2RlIHN0YWNrLAorOyBjb250YWluaW5nIHRoZSBjb20zMnN5c190IHN0cnVjdHVyZSBmcm9tIDxjb20zMi5oPiBhcyB3ZWxsIGFzCis7IHRoZSBmb2xsb3dpbmcgZW50cmllcyAoZnJvbSBsb3cgdG8gaGlnaCBhZGRyZXNzKToKKzsgLSBUYXJnZXQgb2Zmc2V0Cis7IC0gVGFyZ2V0IHNlZ21lbnQKKzsgLSBSZXR1cm4gb2Zmc2V0Cis7IC0gUmV0dXJuIHNlZ21lbnQgKD09IHJlYWwgbW9kZSBjcyA9PSAwKQorOyAtIFJldHVybiBmbGFncworOworCQlnbG9iYWwgY29yZV9mYXJjYWxsOmZ1bmN0aW9uIGhpZGRlbgorY29yZV9mYXJjYWxsOgorCQltb3YgZWF4LFtlc3ArMSo0XQkJOyBDUzpJUAorCQlqbXAgY29yZV9zeXNjYWxsCisKKwkJZ2xvYmFsIGNvcmVfaW50Y2FsbDpmdW5jdGlvbiBoaWRkZW4KK2NvcmVfaW50Y2FsbDoKKwkJbW92enggZWF4LGJ5dGUgW2VzcCsxKjRdCTsgSU5UIG51bWJlcgorCQltb3YgZWF4LFtlYXgqNF0JCQk7IEdldCBDUzpJUCBmcm9tIGxvdyBtZW1vcnkKKworY29yZV9zeXNjYWxsOgorCQlwdXNoZmQJCQkJOyBTYXZlIElGIGFtb25nIG90aGVyIHRoaW5ncy4uLgorCQlpbmMgZHdvcmQgW0NhbGxiYWNrQ3RyXQorCQlwdXNoIGVieAorCQlwdXNoIGVicAorCQlwdXNoIGVzaQorCQlwdXNoIGVkaQorCQlwdXNoIGR3b3JkIFtDYWxsYmFja1NQXQorCisJCWNsZAorCisJCW1vdnp4IGVkaSx3b3JkIFt3b3JkIFJlYWxNb2RlU1NTUF0KKwkJbW92enggZWJ4LHdvcmQgW3dvcmQgUmVhbE1vZGVTU1NQKzJdCisJCXN1YiBlZGksNTQJCTsgQWxsb2NhdGUgNTQgYnl0ZXMKKwkJbW92IFt3b3JkIFJlYWxNb2RlU1NTUF0sZGkKKwkJc2hsIGVieCw0CisJCWFkZCBlZGksZWJ4CQk7IENyZWF0ZSBsaW5lYXIgYWRkcmVzcworCisJCW1vdiBlc2ksW2VzcCs4KjRdCTsgU291cmNlIHJlZ3MKKwkJeG9yIGVjeCxlY3gKKwkJbW92IGNsLDExCQk7IDQ0IGJ5dGVzIHRvIGNvcHkKKwkJcmVwIG1vdnNkCisKKwkJOyBFQVggaXMgYWxyZWFkeSBzZXQgdXAgdG8gYmUgQ1M6SVAKKwkJc3Rvc2QJCQk7IFNhdmUgaW4gc3RhY2sgZnJhbWUKKwkJbW92IGVheCwucm1fcmV0dXJuCTsgUmV0dXJuIHNlZzpvZmZzCisJCXN0b3NkCQkJOyBTYXZlIGluIHN0YWNrIGZyYW1lCisJCW1vdiBlYXgsW2VkaS0xMl0JOyBSZXR1cm4gZmxhZ3MKKwkJYW5kIGVheCwweDIwMGVkNwk7IE1hc2sgKHBvdGVudGlhbGx5KSB1bnNhZmUgZmxhZ3MKKwkJbW92IFtlZGktMTJdLGVheAk7IFByaW1hcnkgZmxhZ3MgZW50cnkKKwkJc3Rvc3cJCQk7IFJldHVybiBmbGFncworCisJCW1vdiBieCwucm0KKwkJam1wIGVudGVyX3JtCTsgR28gdG8gcmVhbCBtb2RlCisKKwkJYml0cyAxNgorCQlzZWN0aW9uIC50ZXh0MTYKKy5ybToKKwkJbW92IGF4LHNwCisJCWFkZCBheCw5KjQrNCoyCisJCW1vdiBbQ2FsbGJhY2tTUF0sYXgKKwkJcG9wIGdzCisJCXBvcCBmcworCQlwb3AgZXMKKwkJcG9wIGRzCisJCXBvcGFkCisJCXBvcGZkCisJCXJldGYJCQkJOyBJbnZva2Ugcm91dGluZQorCisucm1fcmV0dXJuOgorCQk7IFdlIGNsZWFuIHVwIFNQIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZQorCQk7IHJvdXRpbmUgcmV0dXJuZWQgd2l0aCBSRVQsIFJFVEYgb3IgSVJFVAorCQltb3Ygc3AsW2NzOkNhbGxiYWNrU1BdCisJCXB1c2hmZAorCQlwdXNoYWQKKwkJcHVzaCBkcworCQlwdXNoIGVzCisJCXB1c2ggZnMKKwkJcHVzaCBncworCQltb3YgZWJ4LC5wbV9yZXR1cm4KKwkJam1wIGVudGVyX3BtCisKKwkJOyBPbiByZXR1cm4sIHRoZSA0NC1ieXRlIHJldHVybiBzdHJ1Y3R1cmUgaXMgb24gdGhlCisJCTsgcmVhbC1tb2RlIHN0YWNrLCBwbHVzIHRoZSAxMCBhZGRpdGlvbmFsIGJ5dGVzIHVzZWQKKwkJOyBieSB0aGUgdGFyZ2V0IGFkZHJlc3MgKHNlZSBhYm92ZS4pCisJCWJpdHMgMzIKKwkJc2VjdGlvbiAudGV4dAorLnBtX3JldHVybjoKKwkJbW92enggZXNpLHdvcmQgW3dvcmQgUmVhbE1vZGVTU1NQXQorCQltb3Z6eCBlYXgsd29yZCBbd29yZCBSZWFsTW9kZVNTU1ArMl0KKwkJbW92IGVkaSxbZXNwKzkqNF0JOyBEZXN0IHJlZ3MKKwkJc2hsIGVheCw0CisJCWFkZCBlc2ksZWF4CQk7IENyZWF0ZSBsaW5lYXIgYWRkcmVzcworCQlhbmQgZWRpLGVkaQkJOyBOVUxMIHBvaW50ZXI/CisJCWpueiAuZG9fY29weQorLm5vX2NvcHk6CW1vdiBlZGksZXNpCQk7IERvIGEgZHVtbXkgY29weS10by1zZWxmCisuZG9fY29weToJeG9yIGVjeCxlY3gKKwkJbW92IGNsLDExCQk7IDQ0IGJ5dGVzCisJCXJlcCBtb3ZzZAkJOyBDb3B5IHJlZ2lzdGVyIGJsb2NrCisKKwkJYWRkIGR3b3JkIFt3b3JkIFJlYWxNb2RlU1NTUF0sNTQKKwkJCQkJOyBSZW1vdmUgZnJvbSBzdGFjaworCisJCXBvcCBkd29yZCBbQ2FsbGJhY2tTUF0KKwkJZGVjIGR3b3JkIFtDYWxsYmFja0N0cl0KKwkJam56IC5za2lwCisJCWNhbGwgW2NvcmVfcG1faG9va10KKy5za2lwOgorCQlwb3AgZWRpCisJCXBvcCBlc2kKKwkJcG9wIGVicAorCQlwb3AgZWJ4CisJCXBvcGZkCisJCXJldAkJCTsgUmV0dXJuIHRvIDMyLWJpdCBwcm9ncmFtCisKKzsKKzsgQ2ZhcmNhbGwgaW52b2NhdGlvbi4gIFdlIGNvcHkgdGhlIHN0YWNrIGZyYW1lIHRvIHRoZSByZWFsLW1vZGUgc3RhY2ssCis7IGZvbGxvd2VkIGJ5IHRoZSByZXR1cm4gQ1M6SVAgYW5kIHRoZSBDUzpJUCBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uLgorOyBUaGUgdmFsdWUgb2YgSUYgaXMgY29waWVkIGZyb20gdGhlIGNhbGxpbmcgcm91dGluZS4KKzsKKwkJZ2xvYmFsIGNvcmVfY2ZhcmNhbGw6ZnVuY3Rpb24gaGlkZGVuCitjb3JlX2NmYXJjYWxsOgorCQlwdXNoZmQJCQkJOyBTYXZlIElGIGFtb25nIG90aGVyIHRoaW5ncy4uLgorCQlpbmMgZHdvcmQgW0NhbGxiYWNrQ3RyXQorCQlwdXNoIGVieAorCQlwdXNoIGVicAorCQlwdXNoIGVzaQorCQlwdXNoIGVkaQorCQlwdXNoIGR3b3JkIFtDYWxsYmFja1NQXQorCisJCWNsZAorCQltb3YgZWN4LFtlc3ArOSo0XQkJOyBTaXplIG9mIHN0YWNrIGZyYW1lCisKKwkJbW92enggZWRpLHdvcmQgW3dvcmQgUmVhbE1vZGVTU1NQXQorCQltb3Z6eCBlYngsd29yZCBbd29yZCBSZWFsTW9kZVNTU1ArMl0KKwkJbW92IFt3b3JkIENhbGxiYWNrU1BdLGRpCisJCXN1YiBlZGksZWN4CQk7IEFsbG9jYXRlIHNwYWNlIGZvciBzdGFjayBmcmFtZQorCQlhbmQgZWRpLH4zCQk7IFJvdW5kCisJCXN1YiBlZGksNCozCQk7IFJldHVybiBwb2ludGVyLCByZXR1cm4gdmFsdWUsIEVGTEFHUworCQltb3YgW3dvcmQgUmVhbE1vZGVTU1NQXSxkaQorCQlzaGwgZWJ4LDQKKwkJYWRkIGVkaSxlYngJCTsgQ3JlYXRlIGxpbmVhciBhZGRyZXNzCisKKwkJbW92IGVheCxbZXNwKzUqNF0JOyBFRkxBR1MgZnJvbSBlbnRyeQorCQlhbmQgZWF4LDB4MjAyCQk7IElGIG9ubHkKKwkJc3Rvc2QKKwkJbW92IGVheCxbZXNwKzcqNF0JOyBDUzpJUAorCQlzdG9zZAkJCTsgU2F2ZSB0byBzdGFjayBmcmFtZQorCQltb3YgZWF4LC5ybV9yZXR1cm4JOyBSZXR1cm4gc2VnOm9mZgorCQlzdG9zZAorCQltb3YgZXNpLFtlc3ArOCo0XQk7IFN0YWNrIGZyYW1lCisJCW1vdiBlYXgsZWN4CQk7IENvcHkgdGhlIHN0YWNrIGZyYW1lCisJCXNociBlY3gsMgorCQlyZXAgbW92c2QKKwkJbW92IGVjeCxlYXgKKwkJYW5kIGVjeCwzCisJCXJlcCBtb3ZzYgorCisJCW1vdiBieCwucm0KKwkJam1wIGVudGVyX3JtCisKKwkJYml0cyAxNgorCQlzZWN0aW9uIC50ZXh0MTYKKy5ybToKKwkJcG9wZmQKKwkJcmV0ZgorLnJtX3JldHVybjoKKwkJbW92IHNwLFtjczpDYWxsYmFja1NQXQorCQltb3YgZXNpLGVheAorCQltb3YgZWJ4LC5wbV9yZXR1cm4KKwkJam1wIGVudGVyX3BtCisKKwkJYml0cyAzMgorCQlzZWN0aW9uIC50ZXh0CisucG1fcmV0dXJuOgorCQltb3YgZWF4LGVzaQorCQk7IEVEWCBhbHJlYWR5IHNldCB1cCB0byBiZSB0aGUgUk0gcmV0dXJuIHZhbHVlCisJCXBvcCBkd29yZCBbQ2FsbGJhY2tTUF0KKwkJZGVjIGR3b3JkIFtDYWxsYmFja0N0cl0KKwkJam56IC5za2lwCisJCWNhbGwgW2NvcmVfcG1faG9va10KKy5za2lwOgorCQlwb3AgZWJ4CisJCXBvcCBlYnAKKwkJcG9wIGVzaQorCQlwb3AgZWRpCisJCXBvcGZkCisJCXJldAorCisJCXNlY3Rpb24gLmJzczE2CisJCWFsaWduYiA0CisJCWdsb2JhbCBjb3JlX3BtX2hvb2sKK0NhbGxiYWNrU1AJcmVzZCAxCQkJOyBTUCBzYXZlZCBkdXJpbmcgY2FsbGJhY2sKK0NhbGxiYWNrQ3RyCXJlc2QgMQorCisJCWJpdHMgMTYKKwkJc2VjdGlvbiAudGV4dDE2CmRpZmYgLS1naXQgYS9jb3JlL2NsZWFudXAuYyBiL2NvcmUvY2xlYW51cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWI4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NsZWFudXAuYwpAQCAtMCwwICsxLDMzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgQ29weXJpZ2h0IDIwMDctMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbWVtc2Nhbi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Zpcm13YXJlLmg+CisKKy8qCisgKiBjbGVhbnVwLmMKKyAqCisgKiBTb21lIGZpbmFsIHRpZHlpbmcgYmVmb3JlIGp1bXBpbmcgdG8gYSBrZXJuZWwgb3IgYm9vdHNlY3RvcgorICovCisKKy8qCisgKiBjbGVhbnVwX2hhcmR3YXJlOgorICoKKyAqCVNodXQgZG93biBhbnl0aGluZyB0cmFuc2llbnQuCisgKi8KKworX19leHBvcnQgdm9pZCBjbGVhbnVwX2hhcmR3YXJlKHZvaWQpCit7CisJZmlybXdhcmUtPmNsZWFudXAoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvY29kZXBhZ2UuUyBiL2NvcmUvY29kZXBhZ2UuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjFkNDgzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jb2RlcGFnZS5TCkBAIC0wLDAgKzEsNSBAQAorCS5zZWN0aW9uICIucm9kYXRhIiwiYSIKKwkuZ2xvYmwJY29kZXBhZ2UKK2NvZGVwYWdlOgorCS5pbmNiaW4gImNvZGVwYWdlLmNwIgorCS5zaXplCWNvZGVwYWdlLCAuLWNvZGVwYWdlCmRpZmYgLS1naXQgYS9jb3JlL2NvbTMyLmluYyBiL2NvcmUvY29tMzIuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjFjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NvbTMyLmluYwpAQCAtMCwwICsxLDY2IEBACis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsKKzs7ICAgQ29weXJpZ2h0IDE5OTQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzs7ICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7ICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCis7OyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOzsKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzs7Cis7OyBjb20zMi5pbmMKKzs7Cis7OyBDb21tb24gY29kZSBmb3IgcnVubmluZyBhIENPTTMyIGltYWdlCis7OworCisJCWV4dGVybiBwbV9hcGlfdmVjdG9yCisKKzsKKzsgTG9hZCBhIENPTTMyIGltYWdlLiAgQSBDT00zMiBpbWFnZSBpcyB0aGUgMzItYml0IGFuYWxvZ3VlIHRvIGEgRE9TCis7IC5jb20gZmlsZS4gIEEgQ09NMzIgaW1hZ2UgaXMgbG9hZGVkIGF0IGFkZHJlc3MgMHgxMDEwMDAsIHdpdGggJWVzcAorOyBzZXQgdG8gdGhlIGhpZ2ggZW5kIG9mIHVzYWJsZSBtZW1vcnkuCis7Cis7IEEgQ09NMzIgaW1hZ2Ugc2hvdWxkIGJlZ2luIHdpdGggdGhlIG1hZ2ljIGJ5dGVzOgorOyBCOCBGRiA0QyBDRCAyMSwgd2hpY2ggaXMgIm1vdiBlYXgsMHgyMWNkNGNmZiIgaW4gMzItYml0IG1vZGUgYW5kCis7ICJtb3YgYXgsMHg0Y2ZmOyBpbnQgMHgyMSIgaW4gMTYtYml0IG1vZGUuICBUaGlzIHdpbGwgYWJvcnQgdGhlCis7IHByb2dyYW0gd2l0aCBhbiBlcnJvciBpZiBydW4gaW4gMTYtYml0IG1vZGUuCis7CisJCWJpdHMgMTYKKwkJc2VjdGlvbiAuZGF0YTE2CisKKwkJOyBFcnNhdHogY29tMzIgaW52b2NhdGlvbiBzdHJ1Y3R1cmUsIHRvIG1ha2UgbGliY29tMzIKKwkJOyBjb2RlIHJ1biB0aGUgc2FtZSBpZiBsaW5rZWQgdG8gdGhlIGNvcmUuICBUaGlzIGlzIGluCisJCTsgdGhlIC5kYXRhMTYgc2VnbWVudCBzbyBIaWdoTWVtU2l6ZSBjYW4gbGl2ZSBoZXJlLgorCQk7CisJCTsgRGFuZ2VyLCBXaWxsIFJvYmluc29uOiBpdCdzIG5vdCBjbGVhciB0aGUgdXNlIG9mCisJCTsgY29yZV94ZmVyX2J1ZiBpcyBzYWZlIGhlcmUuCisJCWdsb2JhbCBfX2NvbTMyOmRhdGEgaGlkZGVuCisJCWFsaWdueiA0CitfX2VudHJ5X2VzcDoKKwkJZGQgMAkJCQk7IER1bW15IHRvIGF2b2lkIF9leGl0IGlzc3VlcworX19jb20zMjoKKwkJZGQgOQkJCQk7IEFyZ3VtZW50IGNvdW50CisJCWRkIDAJCQkJOyBObyBjb21tYW5kIGxpbmUKKwkJZGQgY29yZV9pbnRjYWxsCQkJOyBJbnRjYWxsIGVudHJ5IHBvaW50CisJCWRkIDAJCQkJOyBCb3VuY2UgYnVmZmVyIGFkZHJlc3MKKwkJZGQgMAkJCQk7IDY0SyBib3VuY2UgYnVmZmVyCisJCWRkIGNvcmVfZmFyY2FsbAkJCTsgRmFyY2FsbCBlbnRyeSBwb2ludAorCQlkZCBjb3JlX2NmYXJjYWxsCQk7IENmYXJjYWxsIGVudHJ5IHBvaW50CitIaWdoTWVtU2l6ZQlkZCAwCQkJCTsgRW5kIG9mIG1lbW9yeSBwb2ludGVyIChieXRlcykKKwkJZGQgMAkJCQk7IE5vIG1vZHVsZSBuYW1lCisJCWRkIHBtX2FwaV92ZWN0b3IJCTsgUHJvdGVjdGVkIG1vZGUgZnVuY3Rpb25zCisKKwkJc2VjdGlvbiAudWlic3MKK0NvbTMyTmFtZQlyZXNiIEZJTEVOQU1FX01BWAorCisJCXNlY3Rpb24gLmJzczE2CislaWZuZGVmIEhBVkVfQ1VSUkVOVERJUk5BTUUKKwkJZ2xvYmFsIEN1cnJlbnREaXJOYW1lOmRhdGEgaGlkZGVuCitDdXJyZW50RGlyTmFtZQlyZXNiIEZJTEVOQU1FX01BWAorJWVuZGlmCisKKwkJc2VjdGlvbiAudGV4dDE2CmRpZmYgLS1naXQgYS9jb3JlL2NvbW1vbi5pbmMgYi9jb3JlL2NvbW1vbi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3NWRmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY29tbW9uLmluYwpAQCAtMCwwICsxLDE1IEBACis7Cis7IE1vZHVsZXMgY29tbW9uIHRvIGFsbCBkZXJpdmF0aXZlcy4gIERvIG5vdCBpbmNsdWRlIG1vZHVsZXMgaW4gdGhpcyBsaXN0Cis7IHdoaWNoIGhhdmUgc3BlY2lhbCBzZWN0aW9uIHJlcXVpcmVtZW50cyAoaS5lLiBuZWVkIHRvIGJlIGluIC5pbml0IGZvcgorOyBzb21lIGRlcml2YXRpdmVzLikKKzsKKworJWluY2x1ZGUgInBtLmluYyIJCTsgUHJvdGVjdGVkIG1vZGUKKyVpbmNsdWRlICJiY29weTMyLmluYyIJCTsgMzItYml0IGJjb3B5CislaW5jbHVkZSAic3RyY3B5LmluYyIgICAgICAgICAgIDsgc3RyY3B5KCkKKyVpbmNsdWRlICJhZHYuaW5jIgkJOyBBdXhpbGxhcnkgRGF0YSBWZWN0b3IKKyVpbmNsdWRlICJ0aW1lci5pbmMiCQk7IFRpbWVyIGhhbmRsaW5nCisKKzsgTm90ZTogdGhlIHByZWZpeCBzZWN0aW9uIGlzIGluY2x1ZGVkIGxhdGUsIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggc29tZQorOyB2ZXJzaW9ucyBvZiBOQVNNIHRoYXQgaGFkIGlzc3VlcyB3aXRoIGZvcndhcmQgcmVmZXJlbmNlcyB0byBFUVUgc3ltYm9scy4KKyVpbmNsdWRlICJwcmVmaXguaW5jIgkJOyBQcmVmaXggc2VjdGlvbiBmb3IgcHJlcGNvcmUKZGlmZiAtLWdpdCBhL2NvcmUvY29uZmlnLmluYyBiL2NvcmUvY29uZmlnLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTlkM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jb25maWcuaW5jCkBAIC0wLDAgKzEsNDAgQEAKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OworOzsgICBDb3B5cmlnaHQgMjAwMi0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOzsgICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7ICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCis7OyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOzsKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzs7Cis7OyBjb25maWcuaW5jCis7OworOzsgQ29tbW9uIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gIFNvbWUgb2YgdGhlc2UgYXJlIGltcG9zZWQgYnkgdGhlIGtlcm5lbC4KKzs7CisKKyVpZm5kZWYgX0NPTkZJR19JTkMKKyVkZWZpbmUgX0NPTkZJR19JTkMKKworbWF4X2NtZF9sZW4JZXF1IDIwNDcJCTsgTXVzdCBiZSAmMzsgMjA0NyBpcyB0aGUga2VybmVsIGxpbWl0CitISUdITUVNX01BWAllcXUgMDM3RkZGRkZGaAkJOyBERUZBVUxUIGhpZ2hlc3QgYWRkcmVzcyBmb3IgYW4gaW5pdHJkCitERUZBVUxUX0JBVUQJZXF1IDk2MDAJCTsgRGVmYXVsdCBiYXVkIHJhdGUgZm9yIHNlcmlhbCBwb3J0CitCQVVEX0RJVklTT1IJZXF1IDExNTIwMAkJOyBTZXJpYWwgcG9ydCBwYXJhbWV0ZXIKK01BWF9GS0VZUwllcXUgMTIJCQk7IE51bWJlciBvZiBGLWtleSBoZWxwIGZpbGVzCisKKzsKKzsgbG9nMihNYXggZmlsZW5hbWUgc2l6ZSBJbmNsdWRpbmcgZmluYWwgbnVsbCkKKzsKK0ZJTEVOQU1FX01BWF9MRzIgZXF1IDgKK0ZJTEVOQU1FX01BWAkgZXF1ICgxIDw8IEZJTEVOQU1FX01BWF9MRzIpCTsgTWF4IG1hbmdsZWQgZmlsZW5hbWUgc2l6ZQorCis7Cis7IFZlcnNpb24gbnVtYmVyIGRlZmluaXRpbm9ucworOworJWluY2x1ZGUgIi4uL3ZlcnNpb24uZ2VuIgorCislZW5kaWYgOyBfQ09ORklHX0lOQwpkaWZmIC0tZ2l0IGEvY29yZS9jb25pby5jIGIvY29yZS9jb25pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNzIyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NvbmlvLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgQ29weXJpZ2h0IDE5OTQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoKKyAqIGNvbmlvLmMKKyAqCisgKiBDb25zb2xlIEkvTyBjb2RlLCBleGNlcHQ6CisgKiAgIHdyaXRlY2hyLCB3cml0ZXN0cl9lYXJseQktIG1vZHVsZS1kZXBlbmRlbnQKKyAqICAgd3JpdGVzdHIsIGNybGYJCS0gd3JpdGVzdHIuaW5jCisgKiAgIHdyaXRlaGV4KgkJCS0gd3JpdGVoZXguaW5jCisgKi8KKyNpbmNsdWRlIDxzeXMvaW8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImJpb3MuaCIKKyNpbmNsdWRlICJncmFwaGljcy5oIgorCit1bmlvbiBzY3JlZW4gX2N1cnNvcjsKK3VuaW9uIHNjcmVlbiBfc2NyZWVuc2l6ZTsKKworLyoKKyAqIFNlcmlhbCBjb25zb2xlIHN0dWZmLgorICovCitfX2V4cG9ydCB1aW50MTZfdCBTZXJpYWxQb3J0ID0gMDsgICAvKiBTZXJpYWwgcG9ydCBiYXNlIChvciAwIGZvciBubyBzZXJpYWwgcG9ydCkgKi8KK19fZXhwb3J0IHVpbnQ4X3QgRmxvd0lucHV0ID0gMDsJICAgIC8qIElucHV0IGJpdHMgZm9yIHNlcmlhbCBmbG93ICovCitfX2V4cG9ydCB1aW50MTZfdCBCYXVkRGl2aXNvciA9IDExNTIwMC85NjAwOyAvKiBCYXVkIHJhdGUgZGl2aXNvciAqLworX19leHBvcnQgdWludDhfdCBGbG93SWdub3JlID0gMDsgICAgLyogSWdub3JlIGlucHV0IHVubGVzcyB0aGVzZSBiaXRzIHNldCAqLworX19leHBvcnQgdWludDE2X3QgRGlzcGxheUNvbiA9IDB4MDE7CS8qIERpc3BsYXkgY29uc29sZSBlbmFibGVkICovCitfX2V4cG9ydCB1aW50OF90IEZsb3dPdXRwdXQgPSAwOwkvKiBPdXRwdXQgdG8gYXNzZXJ0IGZvciBzZXJpYWwgZmxvdyAqLworCitfX2V4cG9ydCB1aW50OF90IERpc3BsYXlNYXNrID0gMHgwNzsJLyogRGlzcGxheSBtb2RlcyBtYXNrICovCisKK3VpbnQ4X3QgU2Nyb2xsQXR0cmlidXRlID0gMHgwNzsgLyogR3JleSBvbiB3aGl0ZSAobm9ybWFsIHRleHQgY29sb3IpICovCisKKy8qCisgKiBsb2Fka2V5czoJTG9hZCBhIExJTE8tc3R5bGUga2V5bWFwCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGVycm9yLgorICovCitfX2V4cG9ydCBpbnQgbG9hZGtleXMoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqZjsKKworCWYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKwlpZiAoIWYpCisJCXJldHVybiAtMTsKKworCWZyZWFkKEtiZE1hcCwgMSwgc2l6ZW9mKEtiZE1hcCksIGYpOworCisJZmNsb3NlKGYpOworCXJldHVybiAwOworfQorCisvKgorICogd3JpdGVfc2VyaWFsOiBJZiBzZXJpYWwgb3V0cHV0IGlzIGVuYWJsZWQsIHdyaXRlIGNoYXJhY3RlciBvbgorICogc2VyaWFsIHBvcnQuCisgKi8KK19fZXhwb3J0IHZvaWQgd3JpdGVfc2VyaWFsKGNoYXIgZGF0YSkKK3sKKwlpZiAoIVNlcmlhbFBvcnQpCisJCXJldHVybjsKKworCWlmICghKERpc3BsYXlNYXNrICYgMHgwNCkpCisJCXJldHVybjsKKworCXdoaWxlICgxKSB7CisJCWNoYXIgY2g7CisKKwkJY2ggPSBpbmIoU2VyaWFsUG9ydCArIDUpOyAvKiBMU1IgKi8KKworCQkvKiBXYWl0IGZvciBzcGFjZSBpbiB0cmFuc21pdCByZWdpc3RlciAqLworCQlpZiAoIShjaCAmIDB4MjApKQorCQkJY29udGludWU7CisKKwkJLyogV2FpdCBmb3IgaW5wdXQgZmxvdyBjb250cm9sICovCisJCWNoID0gaW5iKFNlcmlhbFBvcnQgKyA2KTsKKwkJY2ggJj0gRmxvd0lucHV0OworCQlpZiAoY2ggIT0gRmxvd0lucHV0KQorCQkJY29udGludWU7CisKKwkJYnJlYWs7CisJfQorCisJb3V0YihkYXRhLCBTZXJpYWxQb3J0KTsJLyogU2VuZCBkYXRhICovCisJaW9fZGVsYXkoKTsKK30KKwordm9pZCBwbV93cml0ZV9zZXJpYWwoY29tMzJzeXNfdCAqcmVncykKK3sKKwl3cml0ZV9zZXJpYWwocmVncy0+ZWF4LmJbMF0pOworfQorCit2b2lkIHNlcmlhbGNmZyh1aW50MTZfdCAqaW9iYXNlLCB1aW50MTZfdCAqZGl2aXNvciwgdWludDE2X3QgKmZsb3djdGwpCit7CisJdWludDhfdCBhbCwgYWg7CisKKwkqaW9iYXNlID0gU2VyaWFsUG9ydDsKKwkqZGl2aXNvciA9IEJhdWREaXZpc29yOworCisJYWwgPSBGbG93T3V0cHV0OworCWFoID0gRmxvd0lucHV0OworCisJYWwgfD0gYWg7CisJYWggPSBGbG93SWdub3JlOworCWFoID4+PSA0OworCisJaWYgKCFEaXNwbGF5Q29uKQorCQlhaCB8PSAweDgwOworCisJKmZsb3djdGwgPSBhbCB8IChhaCA8PCA4KTsKK30KKwordm9pZCBwbV9zZXJpYWxjZmcoY29tMzJzeXNfdCAqcmVncykKK3sKKwlzZXJpYWxjZmcoJnJlZ3MtPmVheC53WzBdLCAmcmVncy0+ZWN4LndbMF0sICZyZWdzLT5lYngud1swXSk7Cit9CisKKy8qCisgKiB3cml0ZV9zZXJpYWxfc3RyOiB3cml0ZV9zZXJpYWwgZm9yIHN0cmluZ3MKKyAqLworX19leHBvcnQgdm9pZCB3cml0ZV9zZXJpYWxfc3RyKGNoYXIgKmRhdGEpCit7CisJY2hhciBjaDsKKworCXdoaWxlICgoY2ggPSAqZGF0YSsrKSkKKwkJd3JpdGVfc2VyaWFsKGNoKTsKK30KKworLyoKKyAqIHBvbGxjaGFyOiBjaGVjayBpZiB3ZSBoYXZlIGFuIGlucHV0IGNoYXJhY3RlciBwZW5kaW5nCisgKgorICogUmV0dXJucyAxIGlmIGNoYXJhY3RlciBwZW5kaW5nLgorICovCitpbnQgYmlvc19wb2xsY2hhcih2b2lkKQoreworCWNvbTMyc3lzX3QgaXJlZywgb3JlZzsKKwl1aW50OF90IGRhdGEgPSAwOworCisJbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YoaXJlZykpOworCisJaXJlZy5lYXguYlsxXSA9IDB4MTE7CS8qIFBvbGwga2V5Ym9hcmQgKi8KKwlfX2ludGNhbGwoMHgxNiwgJmlyZWcsICZvcmVnKTsKKworCWlmICghKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfWkYpKQorCQlyZXR1cm4gMTsKKworCWlmIChTZXJpYWxQb3J0KSB7CisJCWNsaSgpOworCisJCS8qIEFscmVhZHktcXVldWVkIGlucHV0PyAqLworCQlpZiAoU2VyaWFsVGFpbCA9PSBTZXJpYWxIZWFkKSB7CisJCQkvKiBMU1IgKi8KKwkJCWRhdGEgPSBpbmIoU2VyaWFsUG9ydCArIDUpICYgMTsKKwkJCWlmIChkYXRhKSB7CisJCQkJLyogTVNSICovCisJCQkJZGF0YSA9IGluYihTZXJpYWxQb3J0ICsgNik7CisKKwkJCQkvKiBSZXF1aXJlZCBzdGF0dXMgYml0cyAqLworCQkJCWRhdGEgJj0gRmxvd0lnbm9yZTsKKworCQkJCWlmIChkYXRhID09IEZsb3dJZ25vcmUpCisJCQkJCWRhdGEgPSAxOworCQkJCWVsc2UKKwkJCQkJZGF0YSA9IDA7CisJCQl9CisJCX0gZWxzZQorCQkJZGF0YSA9IDE7CisJCXN0aSgpOworCX0KKworCXJldHVybiBkYXRhOworfQorCitfX2V4cG9ydCBpbnQgcG9sbGNoYXIodm9pZCkKK3sKKwlyZXR1cm4gZmlybXdhcmUtPmlfb3BzLT5wb2xsY2hhcigpOworfQorCit2b2lkIHBtX3BvbGxjaGFyKGNvbTMyc3lzX3QgKnJlZ3MpCit7CisJaWYgKHBvbGxjaGFyKCkpCisJCXJlZ3MtPmVmbGFncy5sICY9IH5FRkxBR1NfWkY7CisJZWxzZQorCQlyZWdzLT5lZmxhZ3MubCB8PSBFRkxBR1NfWkY7Cit9CisKK2NoYXIgYmlvc19nZXRjaGFyKGNoYXIgKmhpKQoreworCWNvbTMyc3lzX3QgaXJlZywgb3JlZzsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisKKwltZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisJbWVtc2V0KCZvcmVnLCAwLCBzaXplb2Yob3JlZykpOworCXdoaWxlICgxKSB7CisJCV9faWRsZSgpOworCisJCWlyZWcuZWF4LmJbMV0gPSAweDExOwkvKiBQb2xsIGtleWJvYXJkICovCisJCV9faW50Y2FsbCgweDE2LCAmaXJlZywgJm9yZWcpOworCisJCWlmIChvcmVnLmVmbGFncy5sICYgRUZMQUdTX1pGKSB7CisJCQlpZiAoIVNlcmlhbFBvcnQpCisJCQkJY29udGludWU7CisKKwkJCWNsaSgpOworCQkJaWYgKFNlcmlhbFRhaWwgIT0gU2VyaWFsSGVhZCkgeworCQkJCS8qIHNlcmlhbCBxdWV1ZWQgKi8KKwkJCQlzdGkoKTsgLyogV2UgYWxyZWFkeSBrbm93IHdlJ2xsIGNvbnN1bWUgZGF0YSAqLworCQkJCWRhdGEgPSAqU2VyaWFsVGFpbCsrOworCisJCQkJaWYgKFNlcmlhbFRhaWwgPiBTZXJpYWxIZWFkICsgc2VyaWFsX2J1Zl9zaXplKQorCQkJCQlTZXJpYWxUYWlsID0gU2VyaWFsSGVhZDsKKwkJCX0gZWxzZSB7CisJCQkJLyogTFNSICovCisJCQkJZGF0YSA9IGluYihTZXJpYWxQb3J0ICsgNSkgJiAxOworCQkJCWlmICghZGF0YSkgeworCQkJCQlzdGkoKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWRhdGEgPSBpbmIoU2VyaWFsUG9ydCArIDYpOworCQkJCWRhdGEgJj0gRmxvd0lnbm9yZTsKKwkJCQlpZiAoZGF0YSAhPSBGbG93SWdub3JlKSB7CisJCQkJCXN0aSgpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlkYXRhID0gaW5iKFNlcmlhbFBvcnQpOworCQkJCXN0aSgpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogS2V5Ym9hcmQgaW5wdXQ/ICovCisJCQlpcmVnLmVheC5iWzFdID0gMHgxMDsgLyogR2V0IGtleWJvYXJkIGlucHV0ICovCisJCQlfX2ludGNhbGwoMHgxNiwgJmlyZWcsICZvcmVnKTsKKworCQkJZGF0YSA9IG9yZWcuZWF4LmJbMF07CisJCQkqaGkgPSBvcmVnLmVheC5iWzFdOworCisJCQlpZiAoZGF0YSA9PSAweEUwKQorCQkJCWRhdGEgPSAwOworCisJCQlpZiAoZGF0YSkgeworCQkJCS8qIENvbnZlcnQgY2hhcmFjdGVyIHNldHMgKi8KKwkJCQlkYXRhID0gS2JkTWFwW2RhdGFdOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisJfQorCisJcmVzZXRfaWRsZSgpOwkJLyogQ2hhcmFjdGVyIHJlY2VpdmVkICovCisJcmV0dXJuIGRhdGE7Cit9CisKK3VpbnQ4X3QgYmlvc19zaGlmdGZsYWdzKHZvaWQpCit7CisJY29tMzJzeXNfdCByZWc7CisJdWludDhfdCBhaCwgYWw7CisKKwltZW1zZXQoJnJlZywgMCwgc2l6ZW9mIHJlZyk7CisJcmVnLmVheC5iWzFdID0gMHgxMjsKKwlfX2ludGNhbGwoMHgxNiwgJnJlZywgJnJlZyk7CisJYWggPSByZWcuZWF4LmJbMV07CisJYWwgPSByZWcuZWF4LmJbMF07CisKKwkvKgorCSAqIEFjY29yZGluZyB0byB0aGUgSW50ZXJydXB0IExpc3QsICJtYW55IG1hY2hpbmVzIiBkb24ndCBjb3JyZWN0bHkKKwkgKiBmb2xkIHRoZSBBbHQgc3RhdGUsIHByZXN1bWFibHkgYmVjYXVzZSBpdCBtaWdodCBiZSBBbHRHci4KKwkgKiBFeHBsaWNpdGx5IGZvbGQgdGhlIEFsdCBhbmQgQ3RybCBzdGF0ZXM7IGl0IGZpdHMgb3VyIG5lZWRzCisJICogYmV0dGVyLgorCSAqLworCisJaWYgKGFoICYgMHgwYSkKKwkJYWwgfD0gMHgwODsKKwlpZiAoYWggJiAweDA1KQorCQlhbCB8PSAweDA0OworCisJcmV0dXJuIGFsOworfQorCitfX2V4cG9ydCB1aW50OF90IGtiZF9zaGlmdGZsYWdzKHZvaWQpCit7CisJaWYgKGZpcm13YXJlLT5pX29wcy0+c2hpZnRmbGFncykKKwkJcmV0dXJuIGZpcm13YXJlLT5pX29wcy0+c2hpZnRmbGFncygpOworCWVsc2UKKwkJcmV0dXJuIDA7CS8qIFVuYXZhaWxhYmxlIG9uIHRoaXMgZmlybXdhcmUgKi8KK30KKworLyoKKyAqIGdldGNoYXI6IFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBrZXlib2FyZCBvciBzZXJpYWwgcG9ydAorICovCitfX2V4cG9ydCBjaGFyIGdldGNoYXIoY2hhciAqaGkpCit7CisJcmV0dXJuIGZpcm13YXJlLT5pX29wcy0+Z2V0Y2hhcihoaSk7Cit9CisKK3ZvaWQgcG1fZ2V0Y2hhcihjb20zMnN5c190ICpyZWdzKQoreworCXJlZ3MtPmVheC5iWzBdID0gZ2V0Y2hhcigoY2hhciAqKSZyZWdzLT5lYXguYlsxXSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2NvbnNvbGUuYyBiL2NvcmUvY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNTQ1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NvbnNvbGUuYwpAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordm9pZCBteXB1dGNoYXIoaW50IGMpCit7CisgICAgaWYgKGMgPT0gJ1xuJykKKwlteXB1dGNoYXIoJ1xyJyk7CisKKyAgICB3cml0ZWNocihjKTsKK30KKwordm9pZCBteXB1dHMoY29uc3QgY2hhciAqc3RyKQoreworICAgIHdoaWxlICgqc3RyKQorCW15cHV0Y2hhcigqc3RyKyspOworfQpkaWZmIC0tZ2l0IGEvY29yZS9kZWJ1Zy5jIGIvY29yZS9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjhiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2RlYnVnLmMKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgPGRwcmludGYuaD4KKwordm9pZCBwbV9kZWJ1Z19tc2coY29tMzJzeXNfdCAqcmVncykKK3sKKyAgICAodm9pZClyZWdzOwkJCS8qIEZvciB0aGUgbm9uLURFQlVHIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIGRwcmludGYoIiVzXG4iLCBNS19QVFIoMCwgcmVncy0+ZWF4LndbMF0pKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZGlza2Jvb3QuaW5jIGIvY29yZS9kaXNrYm9vdC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlYTZmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZGlza2Jvb3QuaW5jCkBAIC0wLDAgKzEsNDQ0IEBACis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgQ29weXJpZ2h0IDE5OTQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzsgICBDb3B5cmlnaHQgMjAwOS0yMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7Cis7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKzsgICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Cis7IGRpc2tib290LmluYworOworOyBDb21tb24gYm9vdCBzZWN0b3IgY29kZSBmb3IgaGFyZGRpc2stYmFzZWQgU3lzbGludXggZGVyaXZhdGl2ZXMuCis7Cis7IFJlcXVpcmVzIG1hY3JvcyB6W2J3ZF0sIGxhYmVscyBsZGxpbnV4X2VudCwgbGRsaW51eF9tYWdpYywgbGRsaW51eF9zeXMKKzsgYW5kIGNvbnN0YW50cyBCU19NQUdJQ19WRVIsIExETElOVVhfTUFHSUMsIHJldHJ5X2NvdW50LCBTZWN0MVB0clswMV1fVkFMLAorOyBTVEFDS19UT1AKKzsKKworCQlzZWN0aW9uIC5pbml0Cis7Cis7IFNvbWUgb2YgdGhlIHRoaW5ncyB0aGF0IGhhdmUgdG8gYmUgc2F2ZWQgdmVyeSBlYXJseSBhcmUgc2F2ZWQKKzsgImNsb3NlIiB0byB0aGUgaW5pdGlhbCBzdGFjayBwb2ludGVyIG9mZnNldCwgaW4gb3JkZXIgdG8KKzsgcmVkdWNlIHRoZSBjb2RlIHNpemUuLi4KKzsKKworCQlnbG9iYWwgU3RhY2tCdWYsIFBhcnRJbmZvLCBIaWRkZW4sIE9yaWdFU0RJLCBEcml2ZU51bWJlcgorCQlnbG9iYWwgT3JpZ0ZEQ1RhYlB0cgorU3RhY2tCdWYJZXF1IFNUQUNLX1RPUC00NC05Mgk7IFN0YXJ0IHRoZSBzdGFjayBoZXJlIChncm93IGRvd24gLSA0SykKK1BhcnRJbmZvCWVxdSBTdGFja0J1ZgorLm1icgkJZXF1IFBhcnRJbmZvCisuZ3B0bGVuCQllcXUgUGFydEluZm8rMTYKKy5ncHQJCWVxdSBQYXJ0SW5mbysyMAorRmxvcHB5VGFibGUJZXF1IFBhcnRJbmZvKzc2Cis7IFRvdGFsIHNpemUgb2YgUGFydEluZm8gKyBGbG9wcHlUYWJsZSA9PSA3NisxNiA9IDkyIGJ5dGVzCitIaWRkZW4JCWVxdSBTdGFja0J1Zi0yNAkJOyBQYXJ0aXRpb24gb2Zmc2V0IChxd29yZCkKK09yaWdGRENUYWJQdHIJZXF1IFN0YWNrQnVmLTE2CQk7IE9yaWdpbmFsIEZEQyB0YWJsZQorT3JpZ0RTU0kJZXF1IFN0YWNrQnVmLTEyCQk7IERTOlNJIC0+IHBhcnRpbmZvCitPcmlnRVNESQllcXUgU3RhY2tCdWYtOAkJOyBFUzpESSAtPiAkUG5QIHN0cnVjdHVyZQorRHJpdmVOdW1iZXIJZXF1IFN0YWNrQnVmLTQJCTsgRHJpdmUgbnVtYmVyCitTdGFja0hvbWUJZXF1IEhpZGRlbgkJOyBUaGUgc3RhcnQgb2YgdGhlIGNhbm9uaWNhbCBzdGFjaworCis7Cis7IFByaW1hcnkgZW50cnkgcG9pbnQuICBUZW1wdGluZyBhcyB0aG91Z2ggaXQgbWF5IGJlLCB3ZSBjYW4ndCBwdXQgdGhlCis7IGluaXRpYWwgImNsaSIgaGVyZTsgdGhlIGptcCBvcGNvZGUgaW4gdGhlIGZpcnN0IGJ5dGUgaXMgcGFydCBvZiB0aGUKKzsgIm1hZ2ljIG51bWJlciIgKHVzaW5nIHRoZSB0ZXJtIHZlcnkgbG9vc2VseSkgZm9yIHRoZSBET1Mgc3VwZXJibG9jay4KKzsKK2Jvb3RzZWMJCWVxdSAkCitfc3RhcnQ6CQlqbXAgc2hvcnQgc3RhcnQJCTsgMiBieXRlcworCQlub3AJCQk7IDEgYnl0ZQorOworOyAiU3VwZXJibG9jayIgZm9sbG93cyAtLSBpdCdzIGluIHRoZSBib290IHNlY3Rvciwgc28gaXQncyBhbHJlYWR5Cis7IGxvYWRlZCBhbmQgcmVhZHkgZm9yIHVzCis7Citic09lbU5hbWUJZGIgTVlfTkFNRQkJOyBUaGUgU1lTIGNvbW1hbmQgc2V0cyB0aGlzLCBzby4uLgorCQl6YiA4LSgkLWJzT2VtTmFtZSkKKworOworOyBUaGVzZSBhcmUgdGhlIGZpZWxkcyB3ZSBhY3R1YWxseSBjYXJlIGFib3V0LiAgV2UgZW5kIHVwIGV4cGFuZGluZyB0aGVtCis7IGFsbCB0byBkd29yZCBzaXplIGVhcmx5IGluIHRoZSBjb2RlLCBzbyBnZW5lcmF0ZSBsYWJlbHMgZm9yIGJvdGgKKzsgdGhlIGV4cGFuZGVkIGFuZCB1bmV4cGFuZGVkIHZlcnNpb25zLgorOworJW1hY3JvCQlzdXBlcmIgMQorYnggJSsgJTEJZXF1IFN1cGVySW5mbysoJC1zdXBlcmJsb2NrKSo4KzQKK2JzICUrICUxCWVxdSAkCisJCXpiIDEKKyVlbmRtYWNybworJW1hY3JvCQlzdXBlcncgMQorYnggJSsgJTEJZXF1IFN1cGVySW5mbysoJC1zdXBlcmJsb2NrKSo4CiticyAlKyAlMQllcXUgJAorCQl6dyAxCislZW5kbWFjcm8KKyVtYWNybwkJc3VwZXJkIDEKK2J4ICUrICUxCWVxdSAkCQkJOyBubyBleHBhbnNpb24gZm9yIGR3b3JkcworYnMgJSsgJTEJZXF1ICQKKwkJemQgMQorJWVuZG1hY3JvCitzdXBlcmJsb2NrCWVxdSAkCisJCXN1cGVydyBCeXRlc1BlclNlYworCQlzdXBlcmIgU2VjUGVyQ2x1c3QKKwkJc3VwZXJ3IFJlc1NlY3RvcnMKKwkJc3VwZXJiIEZBVHMKKwkJc3VwZXJ3IFJvb3REaXJFbnRzCisJCXN1cGVydyBTZWN0b3JzCisJCXN1cGVyYiBNZWRpYQorCQlzdXBlcncgRkFUc2VjcworCQlzdXBlcncgU2VjUGVyVHJhY2sKKwkJc3VwZXJ3IEhlYWRzCitzdXBlcmluZm9fc2l6ZQllcXUgKCQtc3VwZXJibG9jayktMQk7IEhvdyBtdWNoIHRvIGV4cGFuZAorCQlzdXBlcmQgSGlkZGVuCisJCXN1cGVyZCBIdWdlU2VjdG9ycworCQk7CisJCTsgVGhpcyBpcyBhcyBmYXIgYXMgRkFUMTIvMTYgYW5kIEZBVDMyIGFyZSBjb25zaXN0ZW50CisJCTsKKwkJOyBGQVQxMi8xNiBuZWVkIDI2IG1vcmUgYnl0ZXMsCisJCTsgRkFUMzIgbmVlZCA1NCBtb3JlIGJ5dGVzCisJCTsKK3N1cGVyYmxvY2tfbGVuX2ZhdDE2CWVxdSAkLXN1cGVyYmxvY2srMjYKK3N1cGVyYmxvY2tfbGVuX2ZhdDMyCWVxdSAkLXN1cGVyYmxvY2srNTQKKwkJemIgNTQJCQk7IE1heGltdW0gbmVlZGVkIHNpemUKK3N1cGVyYmxvY2tfbWF4CWVxdSAkLXN1cGVyYmxvY2sKKworU2VjUGVyQ2x1c3QJZXF1IGJ4U2VjUGVyQ2x1c3QKKworOworOyBOb3RlIHdlIGRvbid0IGNoZWNrIHRoZSBjb25zdHJhaW50cyBhYm92ZSBub3c7IHdlIGRpZCB0aGF0IGF0IGluc3RhbGwKKzsgdGltZSAod2UgaG9wZSEpCis7CitzdGFydDoKKwkJY2xpCQkJOyBObyBpbnRlcnJ1cHRzIHlldCwgcGxlYXNlCisJCWNsZAkJCTsgQ29weSB1cHdhcmRzCis7Cis7IFNldCB1cCB0aGUgc3RhY2sKKzsKKwkJeG9yIGN4LGN4CisJCW1vdiBzcyxjeAorCQltb3Ygc3AsU3RhY2tCdWYtMgk7IEp1c3QgYmVsb3cgQlNTICgtMiBmb3IgYWxpZ25tZW50KQorCQlwdXNoIGR4CQkJOyBTYXZlIGRyaXZlIG51bWJlciAoaW4gREwpCisJCXB1c2ggZXMJCQk7IFNhdmUgaW5pdGlhbCBFUzpESSAtPiAkUG5QIHBvaW50ZXIKKwkJcHVzaCBkaQorCQlwdXNoIGRzCQkJOyBTYXZlIG9yaWdpbmFsIERTOlNJIC0+IHBhcnRpbmZvCisJCXB1c2ggc2kKKwkJbW92IGVzLGN4CisKKzsKKzsgRFM6U0kgbWF5IGNvbnRhaW4gYSBwYXJ0aXRpb24gdGFibGUgZW50cnkgYW5kIHBvc3NpYmx5IGEgR1BUIGVudHJ5LgorOyBQcmVzZXJ2ZSBpdCBmb3IgdXMuICBUaGlzIHNhdmVzIDU2IGJ5dGVzIG9mIHRoZSBHUFQgZW50cnksIHdoaWNoIGlzCis7IGN1cnJlbnRseSB0aGUgbWF4aW11bSB3ZSBjYXJlIGFib3V0LiAgVG90YWwgaXMgNzYgYnl0ZXMuCis7CisJCW1vdiBjbCwoMTYrNCs1NikvMgk7IFNhdmUgcGFydGl0aW9uIGluZm8KKwkJbW92IGRpLFBhcnRJbmZvCisJCXJlcCBtb3ZzdwkJOyBUaGlzIHB1dHMgQ1ggYmFjayB0byB6ZXJvCisKKwkJbW92IGRzLGN4CQk7IE5vdyB3ZSBjYW4gaW5pdGlhbGl6ZSBEUy4uLgorCis7Cis7IE5vdyBzYXV0ZWUgdGhlIEJJT1MgZmxvcHB5IGluZm8gYmxvY2sgdG8gdGhhdCBpdCB3aWxsIHN1cHBvcnQgZGVjZW50LQorOyBzaXplIHRyYW5zZmVyczsgdGhlIGZsb3BweSBibG9jayBpcyAxMSBieXRlcyBhbmQgaXMgc3RvcmVkIGluIHRoZQorOyBJTlQgMUVoIHZlY3RvciAoYnJpbGxpYW50IHdhc3RlIG9mIHJlc291cmNlcywgZWg/KQorOworOyBPZiBjb3Vyc2UsIGlmIEJJT1NlcyBoYWQgYmVlbiBwcm9wZXJseSBwcm9ncmFtbWVkLCB3ZSB3b3VsZG4ndCBoYXZlCis7IGhhZCB0byB3YXN0ZSBwcmVjaW91cyBzcGFjZSB3aXRoIHRoaXMgY29kZS4KKzsKKwkJbW92IGJ4LGZkY3RhYgorCQlsZnMgc2ksW2J4XQkJOyBGUzpTSSAtPiBvcmlnaW5hbCBmZGN0YWIKKwkJcHVzaCBmcwkJCTsgU2F2ZSBvbiBzdGFjayBpbiBjYXNlIHdlIG5lZWQgdG8gYmFpbAorCQlwdXNoIHNpCisKKwkJOyBTYXZlIHRoZSBvbGQgZmRjdGFiIGV2ZW4gaWYgaGFyZCBkaXNrIHNvIHRoZSBzdGFjayBsYXlvdXQKKwkJOyBpcyB0aGUgc2FtZS4gIFRoZSBpbnN0cnVjdGlvbnMgYWJvdmUgZG8gbm90IGNoYW5nZSB0aGUgZmxhZ3MKKwkJYW5kIGRsLGRsCQk7IElmIGZsb3BweSBkaXNrICgwMC03RiksIGFzc3VtZSBubworCQkJCQk7IHBhcnRpdGlvbiB0YWJsZQorCQlqcyBoYXJkZGlzaworCitmbG9wcHk6CisJCXhvciBheCxheAorCQltb3YgY2wsNgkJOyAxMiBieXRlcyAoQ1ggPT0gMCkKKwkJOyBlczpkaSAtPiBGbG9wcHlUYWJsZSBhbHJlYWR5CisJCTsgVGhpcyBzaG91bGQgYmUgc2FmZSB0byBkbyBub3csIGludGVycnVwdHMgYXJlIG9mZi4uLgorCQltb3YgW2J4XSxkaQkJOyBGbG9wcHlUYWJsZQorCQltb3YgW2J4KzJdLGF4CQk7IFNlZ21lbnQgMAorCQlmcyByZXAgbW92c3cJCTsgRmFzdGVyIHRvIG1vdmUgd29yZHMKKwkJbW92IGNsLFtic1NlY1BlclRyYWNrXSAgOyBQYXRjaCB0aGUgc2VjdG9yIGNvdW50CisJCW1vdiBbZGktMTIrNF0sY2wKKworCQlwdXNoIGF4CQkJOyBQYXJ0aXRpb24gb2Zmc2V0ID09IDAKKwkJcHVzaCBheAorCQlwdXNoIGF4CisJCXB1c2ggYXgKKworCQlpbnQgMTNoCQkJOyBTb21lIEJJT1NlcyBuZWVkIHRoaXMKKwkJCTsgVXNpbmcgeGludDEzIGNvc3RzICsxQgorCQlqbXAgc2hvcnQgbm90X2hhcmRkaXNrCis7Cis7IFRoZSBkcml2ZSBudW1iZXIgYW5kIHBvc3NpYmx5IHBhcnRpdGlvbiBpbmZvcm1hdGlvbiB3YXMgcGFzc2VkIHRvIHVzCis7IGJ5IHRoZSBCSU9TIG9yIHByZXZpb3VzIGJvb3QgbG9hZGVyIChNQlIpLiAgQ3VycmVudCAiYmVzdCBwcmFjdGljZSIgaXMgdG8KKzsgdHJ1c3QgdGhhdCByYXRoZXIgdGhhbiB3aGF0IHRoZSBzdXBlcmJsb2NrIGNvbnRhaW5zLgorOworOyBOb3RlOiBkaSBwb2ludHMgdG8gYmV5b25kIHRoZSBlbmQgb2YgUGFydEluZm8KKzsgTm90ZTogZmFsc2UgbmVnYXRpdmVzIG1pZ2h0IHNsaXAgdGhyb3VnaCB0aGUgaGFuZG92ZXIgYXJlYSdzIHNhbml0eSBjaGVja3MsCis7ICAgICAgIGlmIHRoZSByZWdpb24gaXMgdmVyeSBjbG9zZSAobGVzcyB0aGFuIGEgcGFyYWdyYXBoKSB0bworOyAgICAgICBQYXJ0SW5mbyA7IG5vIGZhbHNlIHBvc2l0aXZlcyBhcmUgcG9zc2libGUgdGhvdWdoCis7CitoYXJkZGlzazoKKwkJbW92IGR4LFtkaS03Ni0xMF0JOyBPcmlnaW5hbCBEUworCQltb3Ygc2ksW2RpLTc2LTEyXQk7IE9yaWdpbmFsIFNJCisJCXNociBzaSw0CisJCWFkZCBkeCxzaQorCQljbXAgZHgsNGZoCQk7IERTOlNJIDwgNTBoOjAgKEJEQSBvciBJVlQpID8KKwkJamJlIC5ub19wYXJ0aXRpb24KKwkJY21wIGR4LChQYXJ0SW5mby03NSk+PjQJOyBEUzpTSSBpbiBvdmVyd3JpdHRlbiBtZW1vcnk/CisJCWphZSAubm9fcGFydGl0aW9uCisJCXRlc3QgYnl0ZSBbZGktNzZdLDdGaAk7IFNhbml0eSBjaGVjazogImFjdGl2ZSBmbGFnIiBzaG91bGQKKwkJam56IC5ub19wYXJ0aXRpb24JOyBiZSAwMCBvciA4MAorCQljbXAgW2RpLTc2KzRdLGNsCTsgU2FuaXR5IGNoZWNrOiBwYXJ0aXRpb24gdHlwZSAhPSAwCisJCWplIC5ub19wYXJ0aXRpb24KKwkJY21wIGVheCwnIUdQVCcJCTsgIUdQVCBzaWduYXR1cmU/CisJCWpuZSAubWJyCisJCWNtcCBieXRlIFtkaS03Nis0XSwwRURoCTsgU3ludGhldGljIEdQVCBwYXJ0aXRpb24gZW50cnk/CisJCWpuZSAubWJyCisuZ3B0OgkJCQkJOyBHUFQtc3R5bGUgcGFydGl0aW9uIGluZm8KKwkJcHVzaCBkd29yZCBbZGktNzYrMjArMzZdCisJCXB1c2ggZHdvcmQgW2RpLTc2KzIwKzMyXQorCQlqbXAgLmdvdG9mZnMKKy5tYnI6CQkJCQk7IE1CUi1zdHlsZSBwYXJ0aXRpb24gaW5mbworCQlwdXNoIGN4CQkJOyBVcHBlciBoYWxmIHBhcnRpdGlvbiBvZmZzZXQgPT0gMAorCQlwdXNoIGN4CisJCXB1c2ggZHdvcmQgW2RpLTc2KzhdCTsgUGFydGl0aW9uIG9mZnNldCAoZHdvcmQpCisJCWptcCAuZ290b2ZmcworLm5vX3BhcnRpdGlvbjoKKzsKKzsgTm8gcGFydGl0aW9uIHRhYmxlIGdpdmVuLi4uIGFzc3VtZSB0aGF0IHRoZSBIaWRkZW4gZmllbGQgaW4gdGhlIGJvb3Qgc2VjdG9yCis7IHRlbGxzIHRoZSB0cnV0aCAoaW4gcGFydGljdWxhciwgaXMgemVybyBpZiB0aGlzIGlzIGFuIHVucGFydGl0aW9uZWQgZGlzay4pCis7CisJCXB1c2ggY3gKKwkJcHVzaCBjeAorCQlwdXNoIGR3b3JkIFtic0hpZGRlbl0KKy5nb3RvZmZzOgorOworOyBHZXQgZGlzayBkcml2ZSBwYXJhbWV0ZXJzIChkb24ndCB0cnVzdCB0aGUgc3VwZXJibG9jay4pICBEb24ndCBkbyB0aGlzIGZvcgorOyBmbG9wcHkgZHJpdmVzIC0tIElOVCAxMzowOCBvbiBmbG9wcHkgZHJpdmVzIHdpbGwgKG1heT8pIHJldHVybiBpbmZvIGFib3V0Cis7IHdoYXQgdGhlICpkcml2ZSogc3VwcG9ydHMsIG5vdCBhYm91dCB0aGUgKm1lZGlhKi4gIEZvcnR1bmF0ZWx5IGZsb3BweSBkaXNrcworOyB0ZW5kIHRvIGhhdmUgYSBmaXhlZCwgd2VsbC1kZWZpbmVkIGdlb21ldHJ5IHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgc3VwZXJibG9jay4KKzsKKwkJOyBETCA9PSBkcml2ZSAjIHN0aWxsCisJCW1vdiBhaCwwOGgKKwkJY2FsbCB4aW50MTMKKwkJamMgbm9fZHJpdmVwYXJtCisJCWFuZCBhaCxhaAorCQlqbnogbm9fZHJpdmVwYXJtCisJCXNociBkeCw4CisJCWluYyBkeAkJCTsgQ29udGFpbnMgIyBvZiBoZWFkcyAtIDEKKwkJbW92IFtic0hlYWRzXSxkeAorCQlhbmQgY3gsM2ZoCisJCW1vdiBbYnNTZWNQZXJUcmFja10sY3gKK25vX2RyaXZlcGFybToKK25vdF9oYXJkZGlzazoKKzsKKzsgUmVhZHkgdG8gZW5hYmxlIGludGVycnVwdHMsIGNhcHRhaW4KKzsKKwkJc3RpCisKKzsKKzsgRG8gd2UgaGF2ZSBFQklPUyAoRUREKT8KKzsKK2VkZGNoZWNrOgorCQltb3YgYngsNTVBQWgKKwkJbW92IGFoLDQxaAkJOyBFREQgZXhpc3RlbmNlIHF1ZXJ5CisJCWNhbGwgeGludDEzCisJCWpjIC5ub2VkZAorCQljbXAgYngsMEFBNTVoCisJCWpuZSAubm9lZGQKKwkJdGVzdCBjbCwxCQk7IEV4dGVuZGVkIGRpc2sgYWNjZXNzIGZ1bmN0aW9uYWxpdHkgc2V0CisJCWp6IC5ub2VkZAorCQk7CisJCTsgV2UgaGF2ZSBFREQgc3VwcG9ydC4uLgorCQk7CisJCW1vdiBieXRlIFtnZXRvbmVzZWMuam1wKzFdLChnZXRvbmVzZWNfZWJpb3MtKGdldG9uZXNlYy5qbXArMikpCisubm9lZGQ6CisKKzsKKzsgTG9hZCB0aGUgZmlyc3Qgc2VjdG9yIG9mIExETElOVVguU1lTOyB0aGlzIHVzZWQgdG8gYmUgYWxsIHByb3BlcgorOyB3aXRoIHBhcnNpbmcgdGhlIHN1cGVyYmxvY2sgYW5kIHJvb3QgZGlyZWN0b3J5OyBpdCBkb2Vzbid0IGZpdAorOyB0b2dldGhlciB3aXRoIEVCSU9TIHN1cHBvcnQsIHVuZm9ydHVuYXRlbHkuCis7CitTZWN0MUxvYWQ6CisJCW1vdiBlYXgsc3RyaWN0IGR3b3JkIFNlY3QxUHRyMF9WQUwJOyAweGRlYWRiZWVmCitTZWN0MVB0cjAJZXF1ICQtNAorCQltb3YgZWR4LHN0cmljdCBkd29yZCBTZWN0MVB0cjFfVkFMCTsgMHhmZWVkZmFjZQorU2VjdDFQdHIxCWVxdSAkLTQKKwkJbW92IGJ4LGxkbGludXhfc3lzCTsgV2hlcmUgdG8gbG9hZCBpdAorCQljYWxsIGdldG9uZXNlYworCisJCTsgU29tZSBtb2RpY3VtIG9mIGludGVncml0eSBjaGVja2luZworCQljbXAgZHdvcmQgW2xkbGludXhfbWFnaWMrNF0sTERMSU5VWF9NQUdJQ15IRVhEQVRFCisJCWpuZSBrYWJvb20KKworCQk7IEdvIGZvciBpdCEKKwkJam1wIGxkbGludXhfZW50CisKKzsKKzsgZ2V0b25lc2VjOiBsb2FkIGEgc2luZ2xlIGRpc2sgbGluZWFyIHNlY3RvciBFRFg6RUFYIGludG8gdGhlIGJ1ZmZlcgorOwkgICAgIGF0IEVTOkJYLgorOworOyAgICAgICAgICAgIFRoaXMgcm91dGluZSBhc3N1bWVzIENTID09IERTID09IFNTLCBhbmQgdHJhc2hlcyBtb3N0IHJlZ2lzdGVycy4KKzsKKzsgU3R5bGlzdGljIG5vdGU6IHVzZSAieGNoZyIgaW5zdGVhZCBvZiAibW92IiB3aGVuIHRoZSBzb3VyY2UgaXMgYSByZWdpc3RlcgorOyB0aGF0IGlzIGRlYWQgZnJvbSB0aGF0IHBvaW50OyB0aGlzIHNhdmVzIHNwYWNlLiAgSG93ZXZlciwgcGxlYXNlIGtlZXAKKzsgdGhlIG9yZGVyIHRvIGRzdCxzcmMgdG8ga2VlcCB0aGluZ3Mgc2FuZS4KKzsKK2dldG9uZXNlYzoKKwkJYWRkIGVheCxbSGlkZGVuXQkJOyBBZGQgcGFydGl0aW9uIG9mZnNldAorCQlhZGMgZWR4LFtIaWRkZW4rNF0KKwkJbW92IGN4LHJldHJ5X2NvdW50Cisuam1wOgkJam1wIHN0cmljdCBzaG9ydCBnZXRvbmVzZWNfY2Jpb3MKKworOworOyBnZXRvbmVzZWNfZWJpb3M6Cis7Cis7IGdldG9uZXNlYyBpbXBsZW1lbnRhdGlvbiBmb3IgRUJJT1MgKEVERCkKKzsKK2dldG9uZXNlY19lYmlvczoKKy5yZXRyeToKKwkJOyBGb3JtIERBUEEgb24gc3RhY2sKKwkJcHVzaCBlZHgKKwkJcHVzaCBlYXgKKwkJcHVzaCBlcworCQlwdXNoIGJ4CisJCXB1c2ggd29yZCAxCisJCXB1c2ggd29yZCAxNgorCQltb3Ygc2ksc3AKKwkJcHVzaGFkCisgICAgICAgICAgICAgICAgbW92IGFoLDQyaCAgICAgICAgICAgICAgICAgICAgICA7IEV4dGVuZGVkIFJlYWQKKwkJY2FsbCB4aW50MTMKKwkJcG9wYWQKKwkJbGVhIHNwLFtzaSsxNl0JCQk7IFJlbW92ZSBEQVBBCisJCWpjIC5lcnJvcgorICAgICAgICAgICAgICAgIHJldAorCisuZXJyb3I6CisJCTsgU29tZSBzeXN0ZW1zIHNlZW0gdG8gZ2V0ICJzdHVjayIgaW4gYW4gZXJyb3Igc3RhdGUgd2hlbgorCQk7IHVzaW5nIEVCSU9TLiAgRG9lc24ndCBoYXBwZW4gd2hlbiB1c2luZyBDQklPUywgd2hpY2ggaXMKKwkJOyBnb29kLCBzaW5jZSBzb21lIG90aGVyIHN5c3RlbXMgZ2V0IHRpbWVvdXQgZmFpbHVyZXMKKwkJOyB3YWl0aW5nIGZvciB0aGUgZmxvcHB5IGRpc2sgdG8gc3BpbiB1cC4KKworCQlwdXNoYWQJCQkJOyBUcnkgcmVzZXR0aW5nIHRoZSBkZXZpY2UKKwkJeG9yIGF4LGF4CisJCWNhbGwgeGludDEzCisJCXBvcGFkCisJCWxvb3AgLnJldHJ5CQkJOyBDWC0tIGFuZCBqdW1wIGlmIG5vdCB6ZXJvCisKKwkJOyBUb3RhbCBmYWlsdXJlLiAgVHJ5IGZhbGxpbmcgYmFjayB0byBDQklPUy4KKwkJbW92IGJ5dGUgW2dldG9uZXNlYy5qbXArMV0sKGdldG9uZXNlY19jYmlvcy0oZ2V0b25lc2VjLmptcCsyKSkKKworOworOyBnZXRvbmVzZWNfY2Jpb3M6Cis7Cis7IGdldGxpbnNlYyBpbXBsZW1lbnRhdGlvbiBmb3IgbGVnYWN5IENCSU9TCis7CitnZXRvbmVzZWNfY2Jpb3M6CisucmV0cnk6CisJCXB1c2hhZAorCisJCW1vdnp4IGVzaSx3b3JkIFtic1NlY1BlclRyYWNrXQorCQltb3Z6eCBlZGksd29yZCBbYnNIZWFkc10KKwkJOworCQk7IERpdmlkaW5nIGJ5IHNlY3RvcnMgdG8gZ2V0ICh0cmFjayxzZWN0b3IpOiB3ZSBtYXkgaGF2ZQorCQk7IHVwIHRvIDJeMTggdHJhY2tzLCBzbyB3ZSBuZWVkIHRvIHVzZSAzMi1iaXQgYXJpdGhtZXRyaWMuCisJCTsKKwkJZGl2IGVzaQorCQl4b3IgY3gsY3gKKwkJeGNoZyBjeCxkeAkJOyBDWCA8LSBzZWN0b3IgaW5kZXggKDAtYmFzZWQpCisJCQkJCTsgRURYIDwtIDAKKwkJOyBlYXggPSB0cmFjayAjCisJCWRpdiBlZGkJCQk7IENvbnZlcnQgdHJhY2sgdG8gaGVhZC9jeWwKKworCQljbXAgZWF4LDEwMjMJCTsgT3V0c2lkZSB0aGUgQ0hTIHJhbmdlPworCQlqYSBrYWJvb20KKworCQk7CisJCTsgTm93IHdlIGhhdmUgQVggPSBjeWwsIERYID0gaGVhZCwgQ1ggPSBzZWN0b3IgKDAtYmFzZWQpLAorCQk7IFNJID0gYnNTZWNQZXJUcmFjaywgRVM6QlggPSBkYXRhIHRhcmdldAorCQk7CisJCXNobCBhaCw2CQk7IEJlY2F1c2UgSUJNIHdhcyBTVE9PUElECisJCQkJCTsgYW5kIHRob3VnaHQgOCBiaXRzIHdlcmUgZW5vdWdoCisJCQkJCTsgdGhlbiB0aG91Z2h0IDEwIGJpdHMgd2VyZSBlbm91Z2guLi4KKwkJaW5jIGN4CQkJOyBTZWN0b3IgbnVtYmVycyBhcmUgMS1iYXNlZCwgc2lnaAorCQlvciBjbCxhaAorCQltb3YgY2gsYWwKKwkJbW92IGRoLGRsCisJCW1vdiBheCwwMjAxaAkJOyBSZWFkIG9uZSBzZWN0b3IKKwkJY2FsbCB4aW50MTMKKwkJcG9wYWQKKwkJamMgLmVycm9yCisJCXJldAorCisuZXJyb3I6CisJCWxvb3AgLnJldHJ5CisJCTsgRmFsbCB0aHJvdWdoIHRvIGRpc2tfZXJyb3IKKworOworOyBrYWJvb206IHdyaXRlIGEgbWVzc2FnZSBhbmQgYmFpbCBvdXQuCis7CislaWZkZWYgQklORk1UCisJCWdsb2JhbCBrYWJvb20KKyVlbHNlCisJCWdsb2JhbCBrYWJvb206ZnVuY3Rpb24gaGlkZGVuCislZW5kaWYKK2Rpc2tfZXJyb3I6CitrYWJvb206CisJCXhvciBzaSxzaQorCQltb3Ygc3Msc2kKKwkJbW92IHNwLE9yaWdGRENUYWJQdHIJOyBSZXNldCBzdGFjaworCQltb3YgZHMsc2kJCTsgUmVzZXQgZGF0YSBzZWdtZW50CisJCXBvcCBkd29yZCBbZmRjdGFiXQk7IFJlc3RvcmUgRkRDIHRhYmxlCisucGF0Y2g6CQkJCQk7IFdoZW4gd2UgaGF2ZSBmdWxsIGNvZGUsIGludGVyY2VwdCBoZXJlCisJCW1vdiBzaSxiYWlsbXNnCisubG9vcDoJCWxvZHNiCisJCWFuZCBhbCxhbAorICAgICAgICAgICAgICAgIGp6IC5kb25lCisJCW1vdiBhaCwwRWgJCTsgV3JpdGUgdG8gc2NyZWVuIGFzIFRUWQorCQltb3YgYngsMDAwN2gJCTsgQXR0cmlidXRlCisJCWludCAxMGgKKwkJam1wIHNob3J0IC5sb29wCisKKy5kb25lOgorCQl4b3IgYXgsYXgKKy5hZ2FpbjoJCWludCAxNmgJCQk7IFdhaXQgZm9yIGtleXByZXNzCisJCQkJCTsgTkI6IHJlcGxhY2VkIGJ5IGludCAxOGggaWYKKwkJCQkJOyBjaG9zZW4gYXQgaW5zdGFsbCB0aW1lLi4KKwkJaW50IDE5aAkJCTsgQW5kIHRyeSBvbmNlIG1vcmUgdG8gYm9vdC4uLgorLm5vcmdlOgkJaGx0CQkJOyBJZiBpbnQgMTloIHJldHVybmVkOyB0aGlzIGlzIHRoZSBlbmQKKwkJam1wIHNob3J0IC5ub3JnZQorCis7Cis7IElOVCAxM2ggd3JhcHBlciBmdW5jdGlvbgorOworeGludDEzOgorCQltb3YgZGwsW0RyaXZlTnVtYmVyXQorCQlwdXNoIGVzCQk7IEVTIGRlc3Ryb3llZCBieSBJTlQgMTNoIEFIIDA4aAorCQlpbnQgMTNoCisJCXBvcCBlcworCQlyZXQKKworOworOyBFcnJvciBtZXNzYWdlIG9uIGZhaWx1cmUKKzsKK2JhaWxtc2c6CWRiICdCb290IGVycm9yJywgMERoLCAwQWgsIDAKKworCQk7IFRoaXMgZmFpbHMgaWYgdGhlIGJvb3Qgc2VjdG9yIG92ZXJmbG93c2cKKwkJemIgMUY4aC0oJC0kJCkKKworYnNfbWFnaWMJZGQgTERMSU5VWF9NQUdJQworYnNfbGluawkJZHcgKFNlY3QxTG9hZCAtIGJvb3RzZWMpIHwgQlNfTUFHSUNfVkVSCitib290c2lnbmF0dXJlCWR3IDB4QUE1NQorCis7Cis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyAgRW5kIG9mIGJvb3Qgc2VjdG9yCis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvY29yZS9kaXNrZnMuaW5jIGIvY29yZS9kaXNrZnMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDE2NjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Rpc2tmcy5pbmMKQEAgLTAsMCArMSwxMzYgQEAKKzsgLSotIGZ1bmRhbWVudGFsIC0qLSAoYXNtLW1vZGUgc3Vja3MpCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7ICAgCis7ICAgQ29weXJpZ2h0IDE5OTQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzsgICBDb3B5cmlnaHQgMjAwOS0yMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7Cis7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKzsgICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Cis7IGRpc2tmcy5pbmMKKzsKKzsgQ29tbW9uIGNvZGUgZm9yIGNvbnZlbnRpb25hbCBkaXNrLWJhc2VkIGZpbGVzeXN0ZW1zCis7CisKKzsKKzsgU29tZSBzZW1pLWNvbmZpZ3VyYWJsZSBjb25zdGFudHMuLi4gY2hhbmdlIG9uIHlvdXIgb3duIHJpc2suCis7CitOVUxMRklMRQllcXUgMAkJCTsgTnVsbCBjaGFyYWN0ZXIgPT0gZW1wdHkgZmlsZW5hbWUKK05VTExPRkZTRVQJZXF1IDAJCQk7IFBvc2l0aW9uIGluIHdoaWNoIHRvIGxvb2sKK3JldHJ5X2NvdW50CWVxdSAxNgkJCTsgSG93IHBhdGllbnQgYXJlIHdlIHdpdGggdGhlIGRpc2s/CislYXNzaWduIEhJR0hNRU1fU0xPUCAwCQkJOyBBdm9pZCB0aGlzIG11Y2ggbWVtb3J5IG5lYXIgdGhlIHRvcAorTERMSU5VWF9NQUdJQwllcXUgMHgzZWIyMDJmZQkJOyBBIHJhbmRvbSBudW1iZXIgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzIHdpdGgKKworOyBUaGlzIGluZGljYXRlcyB0aGUgZ2VuZXJhbCBmb3JtYXQgb2YgdGhlIGxhc3QgZmV3IGJ5dGVzIGluIHRoZSBib290IHNlY3RvcgorQlNfTUFHSUNfVkVSCWVxdSAweDFiIDw8IDkKKworTUlOX1NFQ1RPUl9TSElGVAllcXUgOQorTUlOX1NFQ1RPUl9TSVpFCQllcXUgKDEgPDwgTUlOX1NFQ1RPUl9TSElGVCkKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgICBCRUdJTiBDT0RFCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Cis7IE1lbW9yeSBiZWxvdyB0aGlzIHBvaW50IGlzIHJlc2VydmVkIGZvciB0aGUgQklPUyBhbmQgdGhlIE1CUgorOworCQlzZWN0aW9uIC5lYXJseWJzcworCQlnbG9iYWwgdHJhY2tidWY6ZGF0YSBoaWRkZW4KK3RyYWNrYnVmc2l6ZQllcXUgODE5MgordHJhY2tidWYJcmVzYiB0cmFja2J1ZnNpemUJOyBUcmFjayBidWZmZXIgZ29lcyBoZXJlCisJCTsgZW5kcyBhdCAyODAwaAorCis7Cis7IENvbW1vbiBib290c3RyYXAgY29kZSBmb3IgZGlzay1iYXNlZCBkZXJpdmF0aXZlcworOworJWluY2x1ZGUgImRpc2tzdGFydC5pbmMiCisKKzsKKzsgTm93LCBldmVyeXRoaW5nIGlzICJ1cCBhbmQgcnVubmluZyIuLi4gcGF0Y2gga2Fib29tIGZvciBtb3JlCis7IHZlcmJvc2l0eSBhbmQgdXNpbmcgdGhlIGZ1bGwgc2NyZWVuIHN5c3RlbQorOworCQk7IEU5ID0gSk1QIE5FQVIKKwkJbW92IGRpLGthYm9vbS5wYXRjaAorCQltb3YgYWwsMGU5aAorCQlzdG9zYgorCQltb3YgYXgsa2Fib29tMi0yCisJCXN1YiBheCxkaQorCQlzdG9zdworCis7Cis7IElmIHdlIGdldCB0byB0aGlzIHBvaW50IGxkbGludXguYzMyIGZhaWxlZCB0byBydW4uIFRoZXJlJ3Mgbm90aGluZworOyBsZWZ0IHRvIGRvIGJ1dCBpbmZvcm0gdGhhdCB1c2VyIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcuCis7CitlbnRlcl9jb21tYW5kOgorYXV0b19ib290OgorCQlqbXAga2Fib29tCisKKwkJc2VjdGlvbiAuYnNzMTYKKwkJYWxpZ25iIDQKK1RoaXNLYmRUbwlyZXNkIDEJCQk7IFRlbXBvcmFyeSBob2xkZXIgZm9yIEtiZFRpbWVvdXQKK1RoaXNUb3RhbFRvCXJlc2QgMQkJCTsgVGVtcG9yYXJ5IGhvbGRlciBmb3IgVG90YWxUaW1lb3V0CitLZXJuZWxFeHRQdHIJcmVzdyAxCQkJOyBEdXJpbmcgc2VhcmNoLCBmaW5hbCBudWxsIHBvaW50ZXIKK0Z1bmNGbGFnCXJlc2IgMQkJCTsgRXNjYXBlIHNlcXVlbmNlcyByZWNlaXZlZCBmcm9tIGtleWJvYXJkCitLZXJuZWxUeXBlCXJlc2IgMQkJCTsgS2VybmVsIHR5cGUsIGZyb20gdmtlcm5lbCwgaWYga25vd24KKwkJZ2xvYmFsIEtlcm5lbE5hbWUKK0tlcm5lbE5hbWUJcmVzYiBGSUxFTkFNRV9NQVgJOyBNYW5nbGVkIG5hbWUgZm9yIGtlcm5lbAorCisJCXNlY3Rpb24gLnRleHQxNgorOworOyBDT00zMiB2ZXN0aWdpYWwgZGF0YSBzdHJ1Y3R1cmUKKzsKKyVpbmNsdWRlICJjb20zMi5pbmMiCisKKzsKKzsgQ29tbW9uIGxvY2FsIGJvb3QgY29kZQorOworJWluY2x1ZGUgImxvY2FsYm9vdC5pbmMiCisKKzsKKzsga2Fib29tMjogb25jZSBldmVyeXRoaW5nIGlzIGxvYWRlZCwgcmVwbGFjZSB0aGUgcGFydCBvZiBrYWJvb20KKzsJICAgc3RhcnRpbmcgd2l0aCAia2Fib29tLnBhdGNoIiB3aXRoIHRoaXMgcGFydAorCitrYWJvb20yOgorCQltb3Ygc2ksZXJyX2Jvb3RmYWlsZWQKKwkJcG1fY2FsbCBwbV93cml0ZXN0cgorCQljbXAgYnl0ZSBba2Fib29tLmFnYWluKzFdLDE4aAk7IElOVCAxOGggdmVyc2lvbj8KKwkJamUgLmludDE4CisJCXBtX2NhbGwgcG1fZ2V0Y2hhcgorCQlwbV9jYWxsIHN5c2xpbnV4X2ZvcmNlX3RleHRfbW9kZQorCQlpbnQgMTloCQkJOyBBbmQgdHJ5IG9uY2UgbW9yZSB0byBib290Li4uCisubm9yZ2U6CQlqbXAgc2hvcnQgLm5vcmdlCTsgSWYgaW50IDE5aCByZXR1cm5lZDsgdGhpcyBpcyB0aGUgZW5kCisuaW50MTg6CisJCXBtX2NhbGwgc3lzbGludXhfZm9yY2VfdGV4dF9tb2RlCisJCWludCAxOGgKKy5ub3JlZzoJCWptcCBzaG9ydCAubm9yZWcJOyBOeW5vcnNrCisKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgIENvbW1vbiBtb2R1bGVzCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVpbmNsdWRlICJjb21tb24uaW5jIgkJOyBVbml2ZXJzYWwgbW9kdWxlcworCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7ICBCZWdpbiBkYXRhIHNlY3Rpb24KKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlzZWN0aW9uIC5kYXRhMTYKKwkJZ2xvYmFsIGNvcHlyaWdodF9zdHIKK2NvcHlyaWdodF9zdHIgICBkYiAnIENvcHlyaWdodCAoQykgMTk5NC0nCisJCWFzY2lpZGVjIFlFQVIKKwkJZGIgJyBILiBQZXRlciBBbnZpbiBldCBhbCcsIENSLCBMRiwgMAorZXJyX2Jvb3RmYWlsZWQJZGIgQ1IsIExGLCAnQm9vdCBmYWlsZWQ6IHBsZWFzZSBjaGFuZ2UgZGlza3MgYW5kIHByZXNzICcKKwkJZGIgJ2Ega2V5IHRvIGNvbnRpbnVlLicsIENSLCBMRiwgMAorCis7Cis7IE1pc2MgaW5pdGlhbGl6ZWQgKGRhdGEpIHZhcmlhYmxlcworOworJWlmZGVmIGRlYnVnCQkJCTsgVGhpcyBjb2RlIGZvciBkZWJ1Z2dpbmcgb25seQorZGVidWdfbWFnaWMJZHcgMEQwMERoCQk7IERlYnVnIGNvZGUgc2VudGluZWwKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9kaXNrc3RhcnQuaW5jIGIvY29yZS9kaXNrc3RhcnQuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWI0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Rpc2tzdGFydC5pbmMKQEAgLTAsMCArMSw1MjIgQEAKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgICBDb3B5cmlnaHQgMTk5NC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOyAgIENvcHlyaWdodCAyMDA5LTIwMTEgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKzsKKzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorOyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7Cis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsKKzsgZGlza3N0YXJ0LmluYworOworOyBDb21tb24gZWFybHktYm9vdHN0cmFwIGNvZGUgZm9yIGhhcmRkaXNrLWJhc2VkIFN5c2xpbnV4IGRlcml2YXRpdmVzLgorOworCitTZWN0MVB0cjBfVkFMCWVxdSAweGRlYWRiZWVmCitTZWN0MVB0cjFfVkFMCWVxdSAweGZlZWRmYWNlCisKKyVpbmNsdWRlICJkaXNrYm9vdC5pbmMiCisKKzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7ICBQYWRkaW5nIGFmdGVyIHRoZSAobWluaW11bSkgNTEyLWJ5dGUgYm9vdCBzZWN0b3Igc28gdGhhdCB0aGUgcmVzdCBvZgorOyAgdGhlIGZpbGUgaGFzIGFsaWduZWQgc2VjdG9ycywgZXZlbiBpZiB0aGV5IGFyZSBsYXJnZXIgdGhhbiA1MTIgYnl0ZXMuCis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCXNlY3Rpb24gLmluaXQKK2FsaWduX3BhZAl6YiA1MTIKKworOyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsgIFN0YXJ0IG9mIExETElOVVguU1lTCis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitMRExJTlVYX1NZUwllcXUgKCQtJCQpK1RFWFRfU1RBUlQKK2xkbGludXhfc3lzOgorCitlYXJseV9iYW5uZXIJZGIgQ1IsIExGLCBNWV9OQU1FLCAnICcsIFZFUlNJT05fU1RSLCAnICcsIDAKKwkJZGIgQ1IsIExGLCAxQWgJOyBFT0YgaWYgd2UgInR5cGUiIHRoaXMgaW4gRE9TCisKKwkJYWxpZ256IDgKK2xkbGludXhfbWFnaWMJZGQgTERMSU5VWF9NQUdJQworCQlkZCBMRExJTlVYX01BR0lDXkhFWERBVEUKKworOworOyBUaGlzIGFyZWEgaXMgcGF0Y2hlZCBieSB0aGUgaW5zdGFsbGVyLiAgSXQgaXMgZm91bmQgYnkgbG9va2luZyBmb3IKKzsgTERMSU5VWF9NQUdJQywgcGx1cyA4IGJ5dGVzLgorOworU1VCVk9MX01BWAllcXUgMjU2CitDVVJSRU5URElSX01BWAllcXUgRklMRU5BTUVfTUFYCisKK3BhdGNoX2FyZWE6CitEYXRhU2VjdG9ycwlkdyAwCQk7IE51bWJlciBvZiBzZWN0b3JzIChub3QgaW5jbHVkaW5nIGJvb3RzZWMpCitBRFZTZWN0b3JzCWR3IDAJCTsgQWRkaXRpb25hbCBzZWN0b3JzIGZvciBBRFZzCitMRExEd29yZHMJZGQgMAkJOyBUb3RhbCBkd29yZHMgc3RhcnRpbmcgYXQgbGRsaW51eF9zeXMsCitDaGVja1N1bQlkZCAwCQk7IENoZWNrc3VtIHN0YXJ0aW5nIGF0IGxkbGludXhfc3lzCisJCQkJOyB2YWx1ZSA9IExETElOVVhfTUFHSUMgLSBbc3VtIG9mIGR3b3Jkc10KK01heFRyYW5zZmVyCWR3IDEyNwkJOyBNYXggc2VjdG9ycyB0byB0cmFuc2ZlcgorRVBBUHRyCQlkdyBFUEEgLSBMRExJTlVYX1NZUwk7IFBvaW50ZXIgdG8gdGhlIGV4dGVuZGVkIHBhdGNoIGFyZWEKKworOworOyBFeHRlbmRlZCBwYXRjaCBhcmVhIC0tIHRoaXMgaXMgaW4gLmRhdGExNiBzbyBpdCBkb2Vzbid0IG9jY3VweSBzcGFjZSBpbgorOyB0aGUgZmlyc3Qgc2VjdG9yLiAgVXNlIHRoaXMgc3RydWN0dXJlIGZvciBhbnl0aGluZyB0aGF0IGlzbid0IHVzZWQgYnkKKzsgdGhlIGZpcnN0IHNlY3RvciBpdHNlbGYuCis7CisJCXNlY3Rpb24gLmRhdGExNgorCQlhbGlnbnogMgorRVBBOgorQURWU2VjUHRyCWR3IEFEVlNlYzAgLSBMRExJTlVYX1NZUworQ3VycmVudERpclB0cglkdyBDdXJyZW50RGlyTmFtZS1MRExJTlVYX1NZUwk7IEN1cnJlbnQgZGlyZWN0b3J5IG5hbWUgc3RyaW5nCitDdXJyZW50RGlyTGVuCWR3IENVUlJFTlRESVJfTUFYCitTdWJ2b2xQdHIJZHcgU3Vidm9sTmFtZS1MRExJTlVYX1NZUworU3Vidm9sTGVuCWR3IFNVQlZPTF9NQVgKK1NlY1B0ck9mZnNldAlkdyBTZWN0b3JQdHJzLUxETElOVVhfU1lTCitTZWNQdHJDbnQJZHcgKFNlY3RvclB0cnNFbmQgLSBTZWN0b3JQdHJzKS8xMAorCis7Cis7IEJvb3Qgc2VjdG9yIHBhdGNoIHBvaW50ZXJzCis7CitTZWN0MVB0cjBQdHIJZHcgU2VjdDFQdHIwIC0gYm9vdHNlYwkJOyBQb2ludGVycyB0byBTZWN0b3IgMSBsb2NhdGlvbgorU2VjdDFQdHIxUHRyCWR3IFNlY3QxUHRyMSAtIGJvb3RzZWMKK1JBSURQYXRjaFB0cglkdyBrYWJvb20uYWdhaW4gLSBib290c2VjCTsgUGF0Y2ggdG8gSU5UIDE4aCBpbiBSQUlEIG1vZGUKKworOworOyBQb2ludGVyIHRvIHRoZSBTeXNsaW51eCBiYW5uZXIKKzsKK0Jhbm5lclB0cglkdyBzeXNsaW51eF9iYW5uZXIgLSBMRExJTlVYX1NZUworCis7Cis7IEJhc2UgZGlyZWN0b3J5IG5hbWUgYW5kIHN1YnZvbHVtZSwgaWYgYXBwbGljYWJsZS4KKzsKKyVkZWZpbmUgSEFWRV9DVVJSRU5URElSTkFNRQorCQlnbG9iYWwgQ3VycmVudERpck5hbWU6ZGF0YSBoaWRkZW4sIFN1YnZvbE5hbWU6ZGF0YSBoaWRkZW4KK0N1cnJlbnREaXJOYW1lCXRpbWVzIENVUlJFTlRESVJfTUFYIGRiIDAKK1N1YnZvbE5hbWUJdGltZXMgU1VCVk9MX01BWCBkYiAwCisKKwkJc2VjdGlvbiAuaW5pdAorbGRsaW51eF9lbnQ6Cis7Cis7IE5vdGUgdGhhdCBzb21lIEJJT1NlcyBhcmUgYnVnZ3kgYW5kIHJ1biB0aGUgYm9vdCBzZWN0b3IgYXQgMDdDMDowMDAwCis7IGluc3RlYWQgb2YgMDAwMDo3QzAwIGFuZCB0aGUgbGlrZS4gIFdlIGRvbid0IHdhbnQgdG8gYWRkIGFueXRoaW5nCis7IG1vcmUgdG8gdGhlIGJvb3Qgc2VjdG9yLCBzbyBpdCBpcyB3cml0dGVuIHRvIG5vdCBhc3N1bWUgYSBmaXhlZAorOyB2YWx1ZSBpbiBDUywgYnV0IHdlIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHRoYXQgYW55bW9yZSBmcm9tIG5vdworOyBvbi4KKzsKKwkJam1wIDA6Lm5leHQJOyBOb3JtYWxpemUgQ1M6SVAKKy5uZXh0OgkJc3RpCQk7IEluIGNhc2Ugb2YgYnJva2VuIElOVCAxM2ggQklPU2VzCisKKzsKKzsgVGVsbCB0aGUgdXNlciB3ZSBnb3QgdGhpcyBmYXIKKzsKKwkJbW92IHNpLGVhcmx5X2Jhbm5lcgorCQljYWxsIHdyaXRlc3RyX2Vhcmx5CisKKzsKKzsgQ2hlY2tzdW0gZGF0YSB0aHVzIGZhcgorOworCQltb3Ygc2ksbGRsaW51eF9zeXMKKwkJbW92IGN4LFtic0J5dGVzUGVyU2VjXQorCQlzaHIgY3gsMgorCQltb3YgZWR4LC1MRExJTlVYX01BR0lDCisuY2hlY2tzdW06CisJCWxvZHNkCisJCWFkZCBlZHgsZWF4CisJCWxvb3AgLmNoZWNrc3VtCisJCW1vdiBbQ2hlY2tTdW1dLGVkeAkJOyBTYXZlIGludGVybWVkaWF0ZSByZXN1bHQKKwkJbW92enggZWJ4LHNpCQkJOyBTdGFydCBvZiB0aGUgbmV4dCBzZWN0b3IKKworOworOyBUZWxsIHRoZSB1c2VyIGlmIHdlJ3JlIHVzaW5nIEVCSU9TIG9yIENCSU9TCis7CitwcmludF9iaW9zOgorCQltb3Ygc2ksY2Jpb3NfbmFtZQorCQljbXAgYnl0ZSBbZ2V0b25lc2VjLmptcCsxXSwoZ2V0b25lc2VjX2ViaW9zLShnZXRvbmVzZWMuam1wKzIpKQorCQlqbmUgLmNiaW9zCisJCW1vdiBzaSxlYmlvc19uYW1lCisJCW1vdiBieXRlIFtnZXRsaW5zZWMuam1wKzFdLChnZXRsaW5zZWNfZWJpb3MtKGdldGxpbnNlYy5qbXArMikpCisuY2Jpb3M6CisJCW1vdiBbQklPU05hbWVdLHNpCisJCWNhbGwgd3JpdGVzdHJfZWFybHkKKworCQlzZWN0aW9uIC5lYXJseWJzcworCQlnbG9iYWwgQklPU05hbWUKKwkJYWxpZ25iIDIKKyVkZWZpbmUJSEFWRV9CSU9TTkFNRSAxCitCSU9TTmFtZQlyZXN3IDEKKworCQlzZWN0aW9uIC5pbml0Cis7Cis7IE5vdyB3ZSByZWFkIHRoZSByZXN0IG9mIExETElOVVguU1lTLgorOworbG9hZF9yZXN0OgorCQlwdXNoIGJ4CQkJCTsgTFNXIG9mIGxvYWQgYWRkcmVzcworCisJCWxlYSBlc2ksW1NlY3RvclB0cnNdCisJCW1vdiBjeCxbRGF0YVNlY3RvcnNdCisJCWRlYyBjeAkJCQk7IE1pbnVzIHRoaXMgc2VjdG9yCisKKy5nZXRfY2h1bms6CisJCWpjeHogLmRvbmUKKwkJbW92IGVheCxbc2ldCisJCW1vdiBlZHgsW3NpKzRdCisJCW1vdnp4IGVicCx3b3JkIFtzaSs4XQorCQlzdWIgY3gsYnAKKwkJcHVzaCBlYngKKwkJc2hyIGVieCw0CQkJOyBDb252ZXJ0IHRvIGEgc2VnbWVudAorCQltb3YgZXMsYngKKwkJeG9yIGJ4LGJ4CisJCWNhbGwgZ2V0bGluc2VjCisJCXBvcCBlYngKKwkJaW11bCBicCxbYnNCeXRlc1BlclNlY10JCTsgV2lsbCBiZSA8IDY0SworCQlhZGQgZWJ4LGVicAorCQlhZGQgc2ksMTAKKwkJam1wIC5nZXRfY2h1bmsKKworLmRvbmU6CisKKzsKKzsgQWxsIGxvYWRlZCB1cCwgdmVyaWZ5IHRoYXQgd2UgZ290IHdoYXQgd2UgbmVlZGVkLgorOyBOb3RlOiB0aGUgY2hlY2tzdW0gZmllbGQgaXMgZW1iZWRkZWQgaW4gdGhlIGNoZWNrc3VtIHJlZ2lvbiwgc28KKzsgYnkgdGhlIHRpbWUgd2UgZ2V0IHRvIHRoZSBlbmQgaXQgc2hvdWxkIGFsbCBjYW5jZWwgb3V0LgorOwordmVyaWZ5X2NoZWNrc3VtOgorCQlwb3Agc2kJCQkJOyBMU1cgb2YgbG9hZCBhZGRyZXNzCisJCW1vdnp4IGVheCx3b3JkIFtic0J5dGVzUGVyU2VjXQorCQlzaHIgYXgsMgorCQltb3YgZWN4LFtMRExEd29yZHNdCQk7IFRvdGFsIGR3b3JkcworCQlzdWIgZWN4LGVheAkJCTsgLi4uIG1pbnVzIG9uZSBzZWN0b3IKKwkJbW92IGVheCxbQ2hlY2tTdW1dCisuY2hlY2tzdW06CisJCWFkZCBlYXgsW3NpXQorCQlhZGQgc2ksNAorCQlqbnogLm5vd3JhcAorCQk7IEhhbmRsZSBzZWdtZW50IHdyYXAKKwkJbW92IGR4LGRzCisJCWFkZCBkeCwxMDAwaAorCQltb3YgZHMsZHgKKy5ub3dyYXA6CisJCWRlYyBlY3gKKwkJam56IC5jaGVja3N1bQorCisJCW1vdiBkcyxjeAorCisJCWFuZCBlYXgsZWF4CQkJOyBTaG91bGQgYmUgemVybworCQlqeiBhbGxfcmVhZAkJCTsgV2UncmUgY29vbCwgZ28gZm9yIGl0IQorCis7Cis7IFVoLW9oLCBzb21ldGhpbmcgd2VudCBiYWQuLi4KKzsKKwkJbW92IHNpLGNoZWNrc3VtZXJyX21zZworCQljYWxsIHdyaXRlc3RyX2Vhcmx5CisJCWptcCBrYWJvb20KKworOworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTdWJyb3V0aW5lcyB0aGF0IGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IHNlY3RvcgorOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworOworOyBnZXRsaW5zZWM6IGxvYWQgYSBzZXF1ZW5jZSBvZiBCUCBmbG9wcHkgc2VjdG9yIGdpdmVuIGJ5IHRoZSBsaW5lYXIgc2VjdG9yCis7CSAgICAgbnVtYmVyIGluIEVBWCBpbnRvIHRoZSBidWZmZXIgYXQgRVM6QlguICBXZSB0cnkgdG8gb3B0aW1pemUKKzsJICAgICBieSBsb2FkaW5nIHVwIHRvIGEgd2hvbGUgdHJhY2sgYXQgYSB0aW1lLCBidXQgdGhlIHVzZXIKKzsJICAgICBpcyByZXNwb25zaWJsZSBmb3Igbm90IGNyb3NzaW5nIGEgNjRLIGJvdW5kYXJ5LgorOwkgICAgIChZZXMsIEJQIGlzIHdlaXJkIGZvciBhIGNvdW50LCBidXQgaXQgd2FzIGF2YWlsYWJsZS4uLikKKzsKKzsJICAgICBPbiByZXR1cm4sIEJYIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBhZnRlciB0aGUgdHJhbnNmZXJyZWQKKzsJICAgICBibG9jay4KKzsKKzsgICAgICAgICAgICBUaGlzIHJvdXRpbmUgYXNzdW1lcyBDUyA9PSBEUy4KKzsKKwkJZ2xvYmFsIGdldGxpbnNlYzpmdW5jdGlvbiBoaWRkZW4KK2dldGxpbnNlYzoKKwkJcHVzaGFkCisJCWFkZCBlYXgsW0hpZGRlbl0JCTsgQWRkIHBhcnRpdGlvbiBvZmZzZXQKKwkJYWRjIGVkeCxbSGlkZGVuKzRdCisuam1wOgkJam1wIHN0cmljdCBzaG9ydCBnZXRsaW5zZWNfY2Jpb3MKKworOworOyBnZXRsaW5zZWNfZWJpb3M6Cis7Cis7IGdldGxpbnNlYyBpbXBsZW1lbnRhdGlvbiBmb3IgRUJJT1MgKEVERCkKKzsKK2dldGxpbnNlY19lYmlvczoKKy5sb29wOgorICAgICAgICAgICAgICAgIHB1c2ggYnAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTZWN0b3JzIGxlZnQKKy5yZXRyeTI6CisJCWNhbGwgbWF4dHJhbnMJCQk7IEVuZm9yY2UgbWF4aW11bSB0cmFuc2ZlciBzaXplCisJCW1vdnp4IGVkaSxicAkJCTsgU2VjdG9ycyB3ZSBhcmUgYWJvdXQgdG8gcmVhZAorCQltb3YgY3gscmV0cnlfY291bnQKKy5yZXRyeToKKworCQk7IEZvcm0gREFQQSBvbiBzdGFjaworCQlwdXNoIGVkeAorCQlwdXNoIGVheAorCQlwdXNoIGVzCisJCXB1c2ggYngKKwkJcHVzaCBkaQorCQlwdXNoIHdvcmQgMTYKKwkJbW92IHNpLHNwCisJCXB1c2hhZAorICAgICAgICAgICAgICAgIG1vdiBhaCw0MmggICAgICAgICAgICAgICAgICAgICAgOyBFeHRlbmRlZCBSZWFkCisJCXB1c2ggZHMKKwkJcHVzaCBzcworCQlwb3AgZHMKKwkJY2FsbCB4aW50MTMKKwkJcG9wIGRzCisJCXBvcGFkCisJCWxlYSBzcCxbc2krMTZdCQkJOyBSZW1vdmUgREFQQQorCQlqYyAuZXJyb3IKKwkJcG9wIGJwCisJCWFkZCBlYXgsZWRpCQkJOyBBZHZhbmNlIHNlY3RvciBwb2ludGVyCisJCWFkYyBlZHgsMAorCQlzdWIgYnAsZGkJCQk7IFNlY3RvcnMgbGVmdAorCQlpbXVsIGRpLFtic0J5dGVzUGVyU2VjXQorICAgICAgICAgICAgICAgIGFkZCBieCxkaQkJCTsgQWR2YW5jZSBidWZmZXIgcG9pbnRlcgorICAgICAgICAgICAgICAgIGFuZCBicCxicAorICAgICAgICAgICAgICAgIGpueiAubG9vcAorCisJCXBvcGFkCisgICAgICAgICAgICAgICAgcmV0CisKKy5lcnJvcjoKKwkJOyBTb21lIHN5c3RlbXMgc2VlbSB0byBnZXQgInN0dWNrIiBpbiBhbiBlcnJvciBzdGF0ZSB3aGVuCisJCTsgdXNpbmcgRUJJT1MuICBEb2Vzbid0IGhhcHBlbiB3aGVuIHVzaW5nIENCSU9TLCB3aGljaCBpcworCQk7IGdvb2QsIHNpbmNlIHNvbWUgb3RoZXIgc3lzdGVtcyBnZXQgdGltZW91dCBmYWlsdXJlcworCQk7IHdhaXRpbmcgZm9yIHRoZSBmbG9wcHkgZGlzayB0byBzcGluIHVwLgorCisJCXB1c2hhZAkJCQk7IFRyeSByZXNldHRpbmcgdGhlIGRldmljZQorCQl4b3IgYXgsYXgKKwkJY2FsbCB4aW50MTMKKwkJcG9wYWQKKwkJbG9vcCAucmV0cnkJCQk7IENYLS0gYW5kIGp1bXAgaWYgbm90IHplcm8KKworCQk7c2hyIHdvcmQgW01heFRyYW5zZmVyXSwxCTsgUmVkdWNlIHRoZSB0cmFuc2ZlciBzaXplCisJCTtqbnogLnJldHJ5MgorCisJCTsgVG90YWwgZmFpbHVyZS4gIFRyeSBmYWxsaW5nIGJhY2sgdG8gQ0JJT1MuCisJCW1vdiBieXRlIFtnZXRsaW5zZWMuam1wKzFdLChnZXRsaW5zZWNfY2Jpb3MtKGdldGxpbnNlYy5qbXArMikpCisJCTttb3YgYnl0ZSBbTWF4VHJhbnNmZXJdLDYzCTsgTWF4IHBvc3NpYmUgQ0JJT1MgdHJhbnNmZXIKKworCQlwb3AgYnAKKwkJOyAuLi4gZmFsbCB0aHJvdWdoIC4uLgorCis7Cis7IGdldGxpbnNlY19jYmlvczoKKzsKKzsgZ2V0bGluc2VjIGltcGxlbWVudGF0aW9uIGZvciBsZWdhY3kgQ0JJT1MKKzsKK2dldGxpbnNlY19jYmlvczoKKy5sb29wOgorCQlwdXNoIGVkeAorCQlwdXNoIGVheAorCQlwdXNoIGJwCisJCXB1c2ggYngKKworCQltb3Z6eCBlc2ksd29yZCBbYnNTZWNQZXJUcmFja10KKwkJbW92enggZWRpLHdvcmQgW2JzSGVhZHNdCisJCTsKKwkJOyBEaXZpZGluZyBieSBzZWN0b3JzIHRvIGdldCAodHJhY2ssc2VjdG9yKTogd2UgbWF5IGhhdmUKKwkJOyB1cCB0byAyXjE4IHRyYWNrcywgc28gd2UgbmVlZCB0byB1c2UgMzItYml0IGFyaXRobWV0cmljLgorCQk7CisJCWRpdiBlc2kKKwkJeG9yIGN4LGN4CisJCXhjaGcgY3gsZHgJCTsgQ1ggPC0gc2VjdG9yIGluZGV4ICgwLWJhc2VkKQorCQkJCQk7IEVEWCA8LSAwCisJCTsgZWF4ID0gdHJhY2sgIworCQlkaXYgZWRpCQkJOyBDb252ZXJ0IHRyYWNrIHRvIGhlYWQvY3lsCisKKwkJY21wIGVheCwxMDIzCQk7IE91dHNpZGUgdGhlIENIUyByYW5nZT8KKwkJamEga2Fib29tCisKKwkJOworCQk7IE5vdyB3ZSBoYXZlIEFYID0gY3lsLCBEWCA9IGhlYWQsIENYID0gc2VjdG9yICgwLWJhc2VkKSwKKwkJOyBCUCA9IHNlY3RvcnMgdG8gdHJhbnNmZXIsIFNJID0gYnNTZWNQZXJUcmFjaywKKwkJOyBFUzpCWCA9IGRhdGEgdGFyZ2V0CisJCTsKKworCQljYWxsIG1heHRyYW5zCQkJOyBFbmZvcmNlIG1heGltdW0gdHJhbnNmZXIgc2l6ZQorCisJCTsgTXVzdCBub3QgY3Jvc3MgdHJhY2sgYm91bmRhcmllcywgc28gQlAgPD0gU0ktQ1gKKwkJc3ViIHNpLGN4CisJCWNtcCBicCxzaQorCQlqbmEgLmJwX29rCisJCW1vdiBicCxzaQorLmJwX29rOgorCisJCXNobCBhaCw2CQk7IEJlY2F1c2UgSUJNIHdhcyBTVE9PUElECisJCQkJCTsgYW5kIHRob3VnaHQgOCBiaXRzIHdlcmUgZW5vdWdoCisJCQkJCTsgdGhlbiB0aG91Z2h0IDEwIGJpdHMgd2VyZSBlbm91Z2guLi4KKwkJaW5jIGN4CQkJOyBTZWN0b3IgbnVtYmVycyBhcmUgMS1iYXNlZCwgc2lnaAorCQlvciBjbCxhaAorCQltb3YgY2gsYWwKKwkJbW92IGRoLGRsCisJCXhjaGcgYXgsYnAJCTsgU2VjdG9yIHRvIHRyYW5zZmVyIGNvdW50CisJCW1vdiBhaCwwMmgJCTsgUmVhZCBzZWN0b3JzCisJCW1vdiBicCxyZXRyeV9jb3VudAorLnJldHJ5OgorCQlwdXNoYWQKKwkJY2FsbCB4aW50MTMKKwkJcG9wYWQKKwkJamMgLmVycm9yCisucmVzdW1lOgorCQltb3Z6eCBlY3gsYWwJCTsgRUNYIDwtIHNlY3RvcnMgdHJhbnNmZXJyZWQKKwkJaW11bCBheCxbYnNCeXRlc1BlclNlY10JOyBDb252ZXJ0IHNlY3RvcnMgaW4gQUwgdG8gYnl0ZXMgaW4gQVgKKwkJcG9wIGJ4CisJCWFkZCBieCxheAorCQlwb3AgYnAKKwkJcG9wIGVheAorCQlwb3AgZWR4CisJCWFkZCBlYXgsZWN4CisJCXN1YiBicCxjeAorCQlqbnogLmxvb3AKKwkJcG9wYWQKKwkJcmV0CisKKy5lcnJvcjoKKwkJZGVjIGJwCisJCWpueiAucmV0cnkKKworCQl4Y2hnIGF4LGJwCQk7IFNlY3RvcnMgdHJhbnNmZXJyZWQgPC0gMAorCQlzaHIgd29yZCBbTWF4VHJhbnNmZXJdLDEKKwkJam56IC5yZXN1bWUKKwkJam1wIGthYm9vbQorCittYXh0cmFuczoKKwkJY21wIGJwLFtNYXhUcmFuc2Zlcl0KKwkJam5hIC5vaworCQltb3YgYnAsW01heFRyYW5zZmVyXQorLm9rOgkJcmV0CisKKzsKKzsKKzsgd3JpdGVzdHJfZWFybHk6IHdyaXRlIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29uc29sZQorOwkgICAgVGhpcyBhc3N1bWVzIHdlJ3JlIG9uIHBhZ2UgMC4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBlYXJseQorOyAgICAgICAgICAgbWVzc2FnZXMsIHNvIGl0IHNob3VsZCBiZSBPSy4KKzsKK3dyaXRlc3RyX2Vhcmx5OgorCQlwdXNoYWQKKy5sb29wOgkJbG9kc2IKKwkJYW5kIGFsLGFsCisgICAgICAgICAgICAgICAganogLnJldHVybgorCQltb3YgYWgsMEVoCQk7IFdyaXRlIHRvIHNjcmVlbiBhcyBUVFkKKwkJbW92IGJ4LDAwMDdoCQk7IEF0dHJpYnV0ZQorCQlpbnQgMTBoCisJCWptcCBzaG9ydCAubG9vcAorLnJldHVybjoJcG9wYWQKKwkJcmV0CisKKzsKKzsgQ2hlY2tzdW0gZXJyb3IgbWVzc2FnZQorOworY2hlY2tzdW1lcnJfbXNnCWRiICcgTG9hZCBlcnJvciAtICcsIDAJOyBCb290IGZhaWxlZCBhcHBlbmRlZAorCis7Cis7IEJJT1MgdHlwZSBzdHJpbmcKKzsKK2NiaW9zX25hbWUJZGIgJ0NIUycsIDAJCQk7IENIUy9DQklPUworZWJpb3NfbmFtZQlkYiAnRUREJywgMAkJCTsgRUREL0VCSU9TCisKKzsKKzsgRGVidWcgcm91dGluZQorOworJWlmZGVmIGRlYnVnCitzYWZlZHVtcHJlZ3M6CisJCWNtcCB3b3JkIFtEZWJ1Z19NYWdpY10sMEQwMERoCisJCWpueiBuY19yZXR1cm4KKwkJam1wIGR1bXByZWdzCislZW5kaWYKKworcmxfY2hlY2twdAllcXUgJAkJCQk7IE11c3QgYmUgPD0gODAwMGgKKworcmxfY2hlY2twdF9vZmYJZXF1ICQtbGRsaW51eF9zeXMKKyVpZm5kZWYgREVQRU5ECisgJWlmIHJsX2NoZWNrcHRfb2ZmID4gNTEyLTEwCQkJOyBOZWVkIG1pbmltdW0gb25lIGV4dGVudAorICAlYXNzaWduIHJsX2NoZWNrcHRfb3ZlcmZsb3cgcmxfY2hlY2twdF9vZmYgLSAoNTEyLTEwKQorICAlZXJyb3IgU2VjdG9yIDEgb3ZlcmZsb3cgYnkgcmxfY2hlY2twdF9vdmVyZmxvdyBieXRlcworICVlbmRpZgorJWVuZGlmCisKKzsKKzsgRXh0ZW50IHBvaW50ZXJzLi4uIGVhY2ggZXh0ZW50IGNvbnRhaW5zIGFuIDgtYnl0ZSBMQkEgYW5kIGFuIDItYnl0ZQorOyBzZWN0b3IgY291bnQuICBJbiBtb3N0IGNhc2VzLCB3ZSB3aWxsIG9ubHkgZXZlciBuZWVkIGEgaGFuZGZ1bCBvZgorOyBleHRlbnRzLCBidXQgd2UgaGF2ZSB0byBhc3N1bWUgYSBtYXhpbWFsbHkgZnJhZ21lbnRlZCBzeXN0ZW0gd2hlcmUgZWFjaAorOyBleHRlbnQgY29udGFpbnMgb25seSBvbmUgc2VjdG9yLgorOworCQlhbGlnbnogMgorTWF4SW5pdERhdGFTaXplCWVxdSA5NiA8PCAxMAorTWF4TE1BCQllcXUgTERMSU5VWF9TWVMrTWF4SW5pdERhdGFTaXplCitTZWN0b3JQdHJzCXpiIDEwKihNYXhJbml0RGF0YVNpemUgPj4gTUlOX1NFQ1RPUl9TSElGVCkKK1NlY3RvclB0cnNFbmQJZXF1ICQKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7ICBFbmQgb2YgY29kZSBhbmQgZGF0YSB0aGF0IGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IHNlY3RvcgorOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJc2VjdGlvbiAudGV4dDE2CithbGxfcmVhZDoKKwkJOyBXZSBlbnRlciBoZXJlIHdpdGggRVMgc2NyYW1ibGVkLi4uCisJCXhvciBheCxheAorCQltb3YgZXMsYXgKKzsKKzsgTGV0IHRoZSB1c2VyIChhbmQgcHJvZ3JhbW1lciEpIGtub3cgd2UgZ290IHRoaXMgZmFyLiAgVGhpcyB1c2VkIHRvIGJlCis7IGluIFNlY3RvciAxLCBidXQgbWFrZXMgYSBsb3QgbW9yZSBzZW5zZSBoZXJlLgorOworCQltb3Ygc2ksbGF0ZV9iYW5uZXIKKwkJY2FsbCB3cml0ZXN0cl9lYXJseQorCisJCW1vdiBzaSxjb3B5cmlnaHRfc3RyCisJCWNhbGwgd3JpdGVzdHJfZWFybHkKKworCis7Cis7IEluc2FuZSBoYWNrIHRvIGV4cGFuZCB0aGUgRE9TIHN1cGVyYmxvY2sgdG8gZHdvcmRzCis7CitleHBhbmRfc3VwZXI6CisJCXhvciBlYXgsZWF4CisJCW1vdiBzaSxzdXBlcmJsb2NrCisJCW1vdiBkaSxTdXBlckluZm8KKwkJbW92IGN4LHN1cGVyaW5mb19zaXplCisubG9vcDoKKwkJbG9kc3cKKwkJZGVjIHNpCisJCXN0b3NkCQkJCTsgU3RvcmUgZXhwYW5kZWQgd29yZAorCQl4b3IgYWgsYWgKKwkJc3Rvc2QJCQkJOyBTdG9yZSBleHBhbmRlZCBieXRlCisJCWxvb3AgLmxvb3AKKworCis7Cis7IENvbW1vbiBpbml0aWFsaXphdGlvbiBjb2RlCis7CislaW5jbHVkZSAiaW5pdC5pbmMiCisJCQorCQlwdXNoYWQKKwkJbW92IGVheCxST09UX0ZTX09QUworCQltb3Z6eCBkeCxieXRlIFtEcml2ZU51bWJlcl0KKwkJOyBESCA9IDA6IHdlIGFyZSBib290IGZyb20gZGlzayBub3QgQ0RST00KKwkJbW92IGVjeCxbSGlkZGVuXQorCQltb3YgZWJ4LFtIaWRkZW4rNF0KKwkJbW92IHNpLFtic0hlYWRzXQorCQltb3YgZGksW2JzU2VjUGVyVHJhY2tdCisJCW1vdnp4IGVicCx3b3JkIFtNYXhUcmFuc2Zlcl0KKwkJcG1fY2FsbCBwbV9mc19pbml0CisJCXBtX2NhbGwgbG9hZF9lbnYzMgorCQlwb3BhZAorCisJCXNlY3Rpb24gLmJzczE2CitTdXBlckluZm8JcmVzcSAxNgkJCTsgVGhlIGZpcnN0IDE2IGJ5dGVzIGV4cGFuZGVkIDggdGltZXMKKworOworOyBCYW5uZXIgaW5mb3JtYXRpb24gbm90IG5lZWRlZCBpbiBzZWN0b3IgMQorOworCQlzZWN0aW9uIC5kYXRhMTYKKwkJZ2xvYmFsIHN5c2xpbnV4X2Jhbm5lcgorc3lzbGludXhfYmFubmVyCWRiIENSLCBMRiwgTVlfTkFNRSwgJyAnLCBWRVJTSU9OX1NUUgorbGF0ZV9iYW5uZXIJZGIgJyAnLCBEQVRFX1NUUiwgMAorCisJCXNlY3Rpb24gLnRleHQxNgpkaWZmIC0tZ2l0IGEvY29yZS9kbWkuYyBiL2NvcmUvZG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiZTI4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZG1pLmMKQEAgLTAsMCArMSwzODMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBTZWFyY2ggRE1JIGluZm9ybWF0aW9uIGZvciBzcGVjaWZpYyBkYXRhIG9yIHN0cmluZ3MKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvYml0b3BzLmg+CisjaW5jbHVkZSA8c3lzL2NwdS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3N5c2FwcGVuZC5oPgorI2luY2x1ZGUgImNvcmUuaCIKKworc3RydWN0IGRtaV90YWJsZSB7CisgICAgdWludDhfdCB0eXBlOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQxNl90IGhhbmRsZTsKK307CisKK3N0cnVjdCBkbWlfaGVhZGVyIHsKKyAgICBjaGFyIHNpZ25hdHVyZVs1XTsKKyAgICB1aW50OF90IGNzdW07CisgICAgdWludDE2X3QgdGJsbGVuOworICAgIHVpbnQzMl90IHRibGFkZHI7CisgICAgdWludDE2X3QgbnN0cnVjOworICAgIHVpbnQ4X3QgcmV2aXNpb247CisgICAgdWludDhfdCByZXNlcnZlZDsKK307CisKK3N0cnVjdCBzbWJpb3NfaGVhZGVyIHsKKyAgICBjaGFyIHNpZ25hdHVyZVs0XTsKKyAgICB1aW50OF90IGNzdW07CisgICAgdWludDhfdCBsZW47CisgICAgdWludDhfdCBtYWpvcjsKKyAgICB1aW50OF90IG1pbm9yOworICAgIHVpbnQxNl90IG1heHNpemU7CisgICAgdWludDhfdCByZXZpc2lvbjsKKyAgICB1aW50OF90IGZtdFs1XTsKKworICAgIHN0cnVjdCBkbWlfaGVhZGVyIGRtaTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqZG1pOworCitzdGF0aWMgdWludDhfdCBjaGVja3N1bShjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgdWludDhfdCAqcCA9IGJ1ZjsKKyAgICB1aW50OF90IGNzdW0gPSAwOworCisgICAgd2hpbGUgKGxlbi0tKQorCWNzdW0gKz0gKnArKzsKKworICAgIHJldHVybiBjc3VtOworfQorCitzdGF0aWMgYm9vbCBpc19vbGRfZG1pKHNpemVfdCBkcHRyKQoreworICAgIGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICpkbWkgPSAodm9pZCAqKWRwdHI7CisKKyAgICByZXR1cm4gIW1lbWNtcChkbWktPnNpZ25hdHVyZSwgIl9ETUlfIiwgNSkgJiYKKwkhY2hlY2tzdW0oZG1pLCAweDBmKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzX3NtYmlvcyhzaXplX3QgZHB0cikKK3sKKyAgICBjb25zdCBzdHJ1Y3Qgc21iaW9zX2hlYWRlciAqc21iID0gKHZvaWQgKilkcHRyOworCisgICAgcmV0dXJuICFtZW1jbXAoc21iLT5zaWduYXR1cmUsICJfU01fIiwgNCkgJiYKKwkhY2hlY2tzdW0oc21iLCBzbWItPmxlbikgJiYKKwlpc19vbGRfZG1pKGRwdHIrMTYpOworfQorCisvKgorICogRmluZCB0aGUgcm9vdCBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgZG1pX2ZpbmRfaGVhZGVyKHZvaWQpCit7CisgICAgc2l6ZV90IGRwdHI7CisKKyAgICAvKiBTZWFyY2ggZm9yIF9TTV8gb3IgX0RNSV8gc3RydWN0dXJlICovCisgICAgZm9yIChkcHRyID0gMHhmMDAwMCA7IGRwdHIgPCAweDEwMDAwMCA7IGRwdHIgKz0gMTYpIHsKKwlpZiAoaXNfc21iaW9zKGRwdHIpKSB7CisJICAgIGRtaSA9IChjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqKShkcHRyICsgMTYpOworCSAgICBicmVhazsKKwl9IGVsc2UgaWYgKGlzX29sZF9kbWkoZHB0cikpIHsKKwkgICAgZG1pID0gKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICopZHB0cjsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KK30KKworLyoKKyAqIFJldHVybiBhIHNwZWNpZmljIGRhdGEgZWxlbWVudCBpbiBhIHNwZWNpZmljIHRhYmxlLCBhbmQgdmVyaWZ5CisgKiB0aGF0IGl0IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSB0YWJsZS4KKyAqLworc3RhdGljIGNvbnN0IHZvaWQgKmRtaV9maW5kX2RhdGEodWludDhfdCB0eXBlLCB1aW50OF90IGJhc2UsIHVpbnQ4X3QgbGVuZ3RoKQoreworICAgIGNvbnN0IHN0cnVjdCBkbWlfdGFibGUgKnRhYmxlOworICAgIHNpemVfdCBvZmZzZXQsIGVuZDsKKyAgICB1bnNpZ25lZCBpbnQgdGJsY291bnQ7CisKKyAgICBpZiAoIWRtaSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChiYXNlIDwgMikKKwlyZXR1cm4gTlVMTDsKKworICAgIGVuZCA9IGJhc2UrbGVuZ3RoOworCisgICAgb2Zmc2V0ID0gMDsKKyAgICB0Ymxjb3VudCA9IGRtaS0+bnN0cnVjOworCisgICAgd2hpbGUgKG9mZnNldCs2IDw9IGRtaS0+dGJsbGVuICYmIHRibGNvdW50LS0pIHsKKwl0YWJsZSA9IChjb25zdCBzdHJ1Y3QgZG1pX3RhYmxlICopKGRtaS0+dGJsYWRkciArIG9mZnNldCk7CisKKwlpZiAodGFibGUtPnR5cGUgPT0gMTI3KQkvKiBFbmQgb2YgdGFibGUgKi8KKwkgICAgYnJlYWs7CisJCisJaWYgKHRhYmxlLT5sZW5ndGggPCBzaXplb2YgKnRhYmxlKQorCSAgICBicmVhazsJCS8qIEludmFsaWQgbGVuZ3RoICovCisKKwlvZmZzZXQgKz0gdGFibGUtPmxlbmd0aDsKKworCWlmICh0YWJsZS0+dHlwZSA9PSB0eXBlICYmIGVuZCA8PSB0YWJsZS0+bGVuZ3RoKQorCSAgICByZXR1cm4gKGNvbnN0IGNoYXIgKil0YWJsZSArIGJhc2U7CisKKwkvKiBTZWFyY2ggZm9yIGEgZG91YmxlIE5VTCB0ZXJtaW5hdGluZyB0aGUgc3RyaW5nIHRhYmxlICovCisJd2hpbGUgKG9mZnNldCsyIDw9IGRtaS0+dGJsbGVuICYmCisJICAgICAgICooY29uc3QgdWludDE2X3QgKikoZG1pLT50YmxhZGRyICsgb2Zmc2V0KSAhPSAwKQorCSAgICBvZmZzZXQrKzsKKworCW9mZnNldCArPSAyOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogUmV0dXJuIGEgc3BlY2lmaWMgc3RyaW5nIGluIGEgc3BlY2lmaWMgdGFibGUuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpkbWlfZmluZF9zdHJpbmcodWludDhfdCB0eXBlLCB1aW50OF90IGJhc2UpCit7CisgICAgY29uc3Qgc3RydWN0IGRtaV90YWJsZSAqdGFibGU7CisgICAgc2l6ZV90IG9mZnNldDsKKyAgICB1bnNpZ25lZCBpbnQgdGJsY291bnQ7CisKKyAgICBpZiAoIWRtaSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChiYXNlIDwgMikKKwlyZXR1cm4gTlVMTDsKKworICAgIG9mZnNldCA9IDA7CisgICAgdGJsY291bnQgPSBkbWktPm5zdHJ1YzsKKworICAgIHdoaWxlIChvZmZzZXQrNiA8PSBkbWktPnRibGxlbiAmJiB0Ymxjb3VudC0tKSB7CisJdGFibGUgPSAoY29uc3Qgc3RydWN0IGRtaV90YWJsZSAqKShkbWktPnRibGFkZHIgKyBvZmZzZXQpOworCisJaWYgKHRhYmxlLT50eXBlID09IDEyNykJLyogRW5kIG9mIHRhYmxlICovCisJICAgIGJyZWFrOworCQorCWlmICh0YWJsZS0+bGVuZ3RoIDwgc2l6ZW9mICp0YWJsZSkKKwkgICAgYnJlYWs7CQkvKiBJbnZhbGlkIGxlbmd0aCAqLworCisJb2Zmc2V0ICs9IHRhYmxlLT5sZW5ndGg7CisKKwlpZiAodGFibGUtPnR5cGUgPT0gdHlwZSAmJiBiYXNlIDwgdGFibGUtPmxlbmd0aCkgeworCSAgICB1aW50OF90IGluZGV4ID0gKChjb25zdCB1aW50OF90ICopdGFibGUpW2Jhc2VdOworCSAgICBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIgKil0YWJsZSArIHRhYmxlLT5sZW5ndGg7CisJICAgIGNvbnN0IGNoYXIgKnN0cjsKKwkgICAgY2hhciBjOworCisJICAgIGlmICghaW5kZXgpCisJCXJldHVybiBOVUxMOwkvKiBTdHJpbmcgbm90IHByZXNlbnQgKi8KKworCSAgICB3aGlsZSAoLS1pbmRleCkgeworCQlpZiAoISpwKQorCQkgICAgcmV0dXJuIE5VTEw7CisKKwkJZG8geworCQkgICAgaWYgKG9mZnNldCsrID49IGRtaS0+dGJsbGVuKQorCQkJcmV0dXJuIE5VTEw7CisJCSAgICBjID0gKnArKzsKKwkJfSB3aGlsZSAoYyk7CisJICAgIH0KKworCSAgICAvKiBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBudWxsLXRlcm1pbmF0ZWQgKi8KKwkgICAgc3RyID0gcDsKKwkgICAgZG8geworCQlpZiAob2Zmc2V0KysgPj0gZG1pLT50YmxsZW4pCisJCSAgICByZXR1cm4gTlVMTDsKKwkJYyA9ICpwKys7CisJICAgIH0gd2hpbGUgKGMpOworCSAgICByZXR1cm4gc3RyOworCX0KKworCS8qIFNlYXJjaCBmb3IgYSBkb3VibGUgTlVMIHRlcm1pbmF0aW5nIHRoZSBzdHJpbmcgdGFibGUgKi8KKwl3aGlsZSAob2Zmc2V0KzIgPD0gZG1pLT50YmxsZW4gJiYKKwkgICAgICAgKihjb25zdCB1aW50MTZfdCAqKShkbWktPnRibGFkZHIgKyBvZmZzZXQpICE9IDApCisJICAgIG9mZnNldCsrOworCisJb2Zmc2V0ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzeXNhcHBlbmRfZG1pX3N0cmluZ3MgeworICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKKyAgICBlbnVtIHN5c2xpbnV4X3N5c2FwcGVuZCBzYTsKKyAgICB1aW50OF90IGluZGV4OworICAgIHVpbnQ4X3Qgb2Zmc2V0OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNhcHBlbmRfZG1pX3N0cmluZ3MgZG1pX3N0cmluZ3NbXSA9IHsKKyAgICB7ICJTWVNWRU5ET1I9IiwgICBTWVNBUFBFTkRfU1lTVkVORE9SLCAgIDEsIDB4MDQgfSwKKyAgICB7ICJTWVNQUk9EVUNUPSIsICBTWVNBUFBFTkRfU1lTUFJPRFVDVCwgIDEsIDB4MDUgfSwKKyAgICB7ICJTWVNWRVJTSU9OPSIsICBTWVNBUFBFTkRfU1lTVkVSU0lPTiwgIDEsIDB4MDYgfSwKKyAgICB7ICJTWVNTRVJJQUw9IiwgICBTWVNBUFBFTkRfU1lTU0VSSUFMLCAgIDEsIDB4MDcgfSwKKyAgICB7ICJTWVNTS1U9IiwgICAgICBTWVNBUFBFTkRfU1lTU0tVLCAgICAgIDEsIDB4MTkgfSwKKyAgICB7ICJTWVNGQU1JTFk9IiwgICBTWVNBUFBFTkRfU1lTRkFNSUxZLCAgIDEsIDB4MWEgfSwKKyAgICB7ICJNQlZFTkRPUj0iLCAgICBTWVNBUFBFTkRfTUJWRU5ET1IsICAgIDIsIDB4MDQgfSwKKyAgICB7ICJNQlBST0RVQ1Q9IiwgICBTWVNBUFBFTkRfTUJQUk9EVUNULCAgIDIsIDB4MDUgfSwKKyAgICB7ICJNQlZFUlNJT049IiwgICBTWVNBUFBFTkRfTUJWRVJTSU9OLCAgIDIsIDB4MDYgfSwKKyAgICB7ICJNQlNFUklBTD0iLCAgICBTWVNBUFBFTkRfTUJTRVJJQUwsICAgIDIsIDB4MDcgfSwKKyAgICB7ICJNQkFTU0VUPSIsICAgICBTWVNBUFBFTkRfTUJBU1NFVCwgICAgIDIsIDB4MDggfSwKKyAgICB7ICJCSU9TVkVORE9SPSIsICBTWVNBUFBFTkRfQklPU1ZFTkRPUiwgIDAsIDB4MDQgfSwKKyAgICB7ICJCSU9TVkVSU0lPTj0iLCBTWVNBUFBFTkRfQklPU1ZFUlNJT04sIDAsIDB4MDUgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAgfQorfTsKKworLyoKKyAqIEluc3RhbGwgdGhlIHN0cmluZyBpbiB0aGUgc3RyaW5nIHRhYmxlLCBpZiBub25lbXB0eSwgYWZ0ZXIKKyAqIHJlbW92aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgKi8KK3N0YXRpYyBib29sIGlzX2N0bF9vcl93aGl0ZXNwYWNlKGNoYXIgYykKK3sKKyAgICByZXR1cm4gKGMgPD0gJyAnIHx8IGMgPT0gJ1x4N2YnKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRtaV9pbnN0YWxsX3N0cmluZyhjb25zdCBjaGFyICpwZngsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpwLCAqZXA7CisgICAgc2l6ZV90IHBmeGxlbjsKKyAgICBjaGFyICpuc3RyLCAqcTsKKworICAgIGlmICghc3RyKQorCXJldHVybiBOVUxMOworCisgICAgd2hpbGUgKCpzdHIgJiYgaXNfY3RsX29yX3doaXRlc3BhY2UoKnN0cikpCisJc3RyKys7CisKKyAgICBpZiAoISpzdHIpCisJcmV0dXJuIE5VTEw7CisKKyAgICBlcCA9IHAgPSBzdHI7CisgICAgd2hpbGUgKCpwKSB7CisJaWYgKCFpc19jdGxfb3Jfd2hpdGVzcGFjZSgqcCkpCisJICAgIGVwID0gcCsxOworCXArKzsKKyAgICB9CisKKyAgICBwZnhsZW4gPSBzdHJsZW4ocGZ4KTsKKyAgICBxID0gbnN0ciA9IG1hbGxvYyhwZnhsZW4gKyAoZXAtc3RyKSArIDEpOworICAgIGlmICghbnN0cikKKwlyZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkocSwgcGZ4LCBwZnhsZW4pOworICAgIHEgKz0gcGZ4bGVuOworICAgIG1lbWNweShxLCBzdHIsIGVwLXN0cik7CisgICAgcSArPSAoZXAtc3RyKTsKKyAgICAqcSA9ICdcMCc7CisKKyAgICByZXR1cm4gbnN0cjsKK30KKworc3RhdGljIHZvaWQgc3lzYXBwZW5kX3NldF9zeXNmZihjb25zdCB1aW50OF90ICp0eXBlKQoreworICAgIHN0YXRpYyBjaGFyIHN5c2ZmX3N0cltdID0gIlNZU0ZGPTAwMCI7CisKKyAgICBpZiAoIXR5cGUgfHwgISp0eXBlKQorCXJldHVybjsKKyAgICAKKyAgICBzcHJpbnRmKHN5c2ZmX3N0cis2LCAiJXUiLCAqdHlwZSAmIDB4N2YpOworICAgIHN5c2FwcGVuZF9zdHJpbmdzW1NZU0FQUEVORF9TWVNGRl0gPSBzeXNmZl9zdHI7Cit9CisKK3N0cnVjdCBjcHVmbGFnIHsKKyAgICB1aW50OF90IGJpdDsKKyAgICBjaGFyIGZsYWc7Cit9OworCitzdGF0aWMgdm9pZCBzeXNhcHBlbmRfc2V0X2NwdSh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIGNwdV9zdHJbNis2XSA9ICJDUFU9IjsKKyAgICBjaGFyICpwID0gY3B1X3N0ciArIDQ7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVmbGFnIGNwdWZsYWdzW10gPSB7CisJeyAwKjMyKyA2LCAnUCcgfSwgLyogUEFFICovCisJeyAxKjMyKyA1LCAnVicgfSwgLyogVk1YICovCisJeyAxKjMyKyA2LCAnVCcgfSwgLyogU01YIChUWFQpICovCisJeyAyKjMyKzIwLCAnWCcgfSwgLyogWEQvTlggKi8KKwl7IDIqMzIrMjksICdMJyB9LCAvKiBMb25nIG1vZGUgKHg4Ni02NCkgKi8KKwl7IDMqMzIrIDIsICdTJyB9LCAvKiBTVk0gKi8KKwl7IDAsIDAgfQorICAgIH07CisgICAgY29uc3Qgc3RydWN0IGNwdWZsYWcgKmNmOworCisgICAgLyogTm90IHRlY2huaWNhbGx5IGZyb20gRE1JLCBidXQgaXQgZml0IGhlcmUuLi4gKi8KKworICAgIGlmICghY3B1X2hhc19lZmxhZyhFRkxBR1NfSUQpKSB7CisJLyogTm8gQ1BVSUQgKi8KKwkqcCsrID0gY3B1X2hhc19lZmxhZyhFRkxBR1NfQUMpID8gJzQnIDogJzMnOworICAgIH0gZWxzZSB7CisJdWludDMyX3QgZmxhZ3NbNF0sIGVheCwgZWJ4LCBmYW1pbHk7CisJdWludDMyX3QgZXh0X2xldmVsOworCisJY3B1aWQoMSwgJmVheCwgJmVieCwgJmZsYWdzWzFdLCAmZmxhZ3NbMF0pOworCWZhbWlseSA9IChlYXggJiAweDBmZjAwZjAwKSA+PiA4OworCSpwKysgPSBmYW1pbHkgPj0gNiA/ICc2JyA6IGZhbWlseSArICcwJzsKKwkKKwlleHRfbGV2ZWwgPSBjcHVpZF9lYXgoMHg4MDAwMDAwMCk7CisJaWYgKGV4dF9sZXZlbCA+PSAweDgwMDAwMDAxICYmIGV4dF9sZXZlbCA8PSAweDgwMDBmZmZmKSB7CisJICAgIGNwdWlkKDB4ODAwMDAwMDEsICZlYXgsICZlYngsICZmbGFnc1szXSwgJmZsYWdzWzJdKTsKKwl9IGVsc2UgeworCSAgICBmbGFnc1syXSA9IGZsYWdzWzNdID0gMDsKKwl9CisKKwlmb3IgKGNmID0gY3B1ZmxhZ3M7IGNmLT5mbGFnOyBjZisrKSB7CisJICAgIGlmICh0ZXN0X2JpdChjZi0+Yml0LCBmbGFncykpCisJCSpwKysgPSBjZi0+ZmxhZzsKKwl9CisgICAgfQorCisgICAgKnAgPSAnXDAnOworCisgICAgc3lzYXBwZW5kX3N0cmluZ3NbU1lTQVBQRU5EX0NQVV0gPSBjcHVfc3RyOworfQorCit2b2lkIGRtaV9pbml0KHZvaWQpCit7CisgICAgY29uc3Qgc3RydWN0IHN5c2FwcGVuZF9kbWlfc3RyaW5ncyAqZHM7CisKKyAgICBzeXNhcHBlbmRfc2V0X2NwdSgpOworCisgICAgZG1pX2ZpbmRfaGVhZGVyKCk7CisgICAgaWYgKCFkbWkpCisJcmV0dXJuOworCisgICAgc3lzYXBwZW5kX3NldF91dWlkKGRtaV9maW5kX2RhdGEoMSwgMHgwOCwgMTYpKTsKKyAgICBzeXNhcHBlbmRfc2V0X3N5c2ZmKGRtaV9maW5kX2RhdGEoMywgMHgwNSwgMSkpOworCisgICAgZm9yIChkcyA9IGRtaV9zdHJpbmdzOyBkcy0+cHJlZml4OyBkcysrKSB7CisJaWYgKCFzeXNhcHBlbmRfc3RyaW5nc1tkcy0+c2FdKSB7CisJICAgIGNvbnN0IGNoYXIgKnN0ciA9IGRtaV9maW5kX3N0cmluZyhkcy0+aW5kZXgsIGRzLT5vZmZzZXQpOworCSAgICBzeXNhcHBlbmRfc3RyaW5nc1tkcy0+c2FdID0gZG1pX2luc3RhbGxfc3RyaW5nKGRzLT5wcmVmaXgsIHN0cik7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvZWxmbGluay9jb21tb24uaCBiL2NvcmUvZWxmbGluay9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjg4ZDFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9lbGZsaW5rL2NvbW1vbi5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBjb21tb24uaCAtIENvbW1vbiBpbnRlcm5hbCBvcGVyYXRpb25zIHBlcmZvcm1lZCBieSB0aGUgbW9kdWxlIHN1YnN5c3RlbQorICoKKyAqICBDcmVhdGVkIG9uOiBBdWcgMTEsIDIwMDgKKyAqICAgICAgQXV0aG9yOiBTdGVmYW4gQnVjdXIgPHN0ZWZhbmJAenl0b3IuY29tPgorICovCisKKyNpZm5kZWYgQ09NTU9OX0hfCisjZGVmaW5lIENPTU1PTl9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICJlbGZ1dGlscy5oIgorCisvLyBQZXJmb3JtcyBhbiBvcGVyYXRpb24gYW5kIGp1bXBzIHRvIGEgZ2l2ZW4gbGFiZWwgaWYgYW4gZXJyb3Igb2NjdXJzCisjZGVmaW5lIENIRUNLRUQocmVzLCBleHByLCBlcnJvcikJCVwKKwlkbyB7IAkJCQkJCQkJXAorCQkocmVzKSA9IChleHByKTsJCQkJCVwKKwkJaWYgKChyZXMpIDwgMCkJCQkJCVwKKwkJCWdvdG8gZXJyb3I7CQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBNSU4oeCx5KQkoKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkpCisjZGVmaW5lIE1BWCh4LHkpCSgoKHgpID4gKHkpKSA/ICh4KSA6ICh5KSkKKworLy8jZGVmaW5lIEVMRl9ERUJVRworCisjaWZkZWYgRUxGX0RFQlVHCisjZGVmaW5lIERCR19QUklOVChmbXQsIGFyZ3MuLi4pCWZwcmludGYoc3RkZXJyLCAiW0VMRl0gIiBmbXQsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIERCR19QUklOVChmbXQsIGFyZ3MuLi4pCS8vIEV4cGFuZCB0byBub3RoaW5nCisjZW5kaWYKKworLy8gVXNlci1zcGFjZSBkZWJ1Z2dpbmcgcm91dGluZXMKKyNpZmRlZiBFTEZfREVCVUcKK2V4dGVybiB2b2lkIHByaW50X2VsZl9laGRyKEVsZjMyX0VoZHIgKiBlaGRyKTsKK2V4dGVybiB2b2lkIHByaW50X2VsZl9zeW1ib2xzKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpOworI2VuZGlmIC8vRUxGX0RFQlVHCisKKy8qCisgKiBJbWFnZSBmaWxlcyBtYW5pcHVsYXRpb24gcm91dGluZXMKKyAqLworCitleHRlcm4gaW50IGltYWdlX2xvYWQoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CitleHRlcm4gaW50IGltYWdlX3VubG9hZChzdHJ1Y3QgZWxmX21vZHVsZSAqbW9kdWxlKTsKK2V4dGVybiBpbnQgaW1hZ2VfcmVhZCh2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwgc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CitleHRlcm4gaW50IGltYWdlX3NraXAoc2l6ZV90IHNpemUsIHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpOworZXh0ZXJuIGludCBpbWFnZV9zZWVrKEVsZjMyX09mZiBvZmZzZXQsIHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpOworCitleHRlcm4gc3RydWN0IG1vZHVsZV9kZXAgKm1vZHVsZV9kZXBfYWxsb2Moc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CisKK2V4dGVybiBpbnQgY2hlY2tfaGVhZGVyX2NvbW1vbihFbGYzMl9FaGRyICogZWxmX2hkcik7CisKK2V4dGVybiBpbnQgZW5mb3JjZV9kZXBlbmRlbmN5KHN0cnVjdCBlbGZfbW9kdWxlICpyZXEsIHN0cnVjdCBlbGZfbW9kdWxlICpkZXApOworZXh0ZXJuIGludCBjbGVhcl9kZXBlbmRlbmN5KHN0cnVjdCBlbGZfbW9kdWxlICpyZXEsIHN0cnVjdCBlbGZfbW9kdWxlICpkZXApOworCitleHRlcm4gaW50IGNoZWNrX3N5bWJvbHMoc3RydWN0IGVsZl9tb2R1bGUgKm1vZHVsZSk7CisKKyNlbmRpZiAvKiBDT01NT05fSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZWxmbGluay9lbGZ1dGlscy5oIGIvY29yZS9lbGZsaW5rL2VsZnV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4ZTcwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZWxmbGluay9lbGZ1dGlscy5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgRUxGX1VUSUxTX0hfCisjZGVmaW5lIEVMRl9VVElMU19IXworCisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qKgorICogZWxmX2dldF9oZWFkZXIgLSBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgRUxGIGhlYWRlciBzdHJ1Y3R1cmUuCisgKiBAZWxmX2ltYWdlOiBwb2ludGVyIHRvIHRoZSBFTEYgZmlsZSBpbWFnZSBpbiBtZW1vcnkKKyAqLworc3RhdGljIGlubGluZSBFbGYzMl9FaGRyICplbGZfZ2V0X2hlYWRlcih2b2lkICplbGZfaW1hZ2UpCit7CisgICAgcmV0dXJuIChFbGYzMl9FaGRyICopIGVsZl9pbWFnZTsKK30KKworLyoqCisgKiBlbGZfZ2V0X3BodCAtIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgUEhULgorICogQGVsZl9pbWFnZTogcG9pbnRlciB0byB0aGUgRUxGIGZpbGUgaW1hZ2UgaW4gbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgRWxmMzJfUGhkciAqZWxmX2dldF9waHQodm9pZCAqZWxmX2ltYWdlKQoreworICAgIEVsZjMyX0VoZHIgKmVsZl9oZHIgPSBlbGZfZ2V0X2hlYWRlcihlbGZfaW1hZ2UpOworCisgICAgcmV0dXJuIChFbGYzMl9QaGRyICopICgoRWxmMzJfT2ZmKSBlbGZfaGRyICsgZWxmX2hkci0+ZV9waG9mZik7Cit9CisKKy8vCisvKioKKyAqIGVsZl9nZXRfcGggLSBSZXR1cm5zIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIGluZGV4IGluIHRoZSBQVEgKKyAqIEBlbGZfaW1hZ2U6IHBvaW50ZXIgdG8gdGhlIEVMRiBmaWxlIGltYWdlIGluIG1lbW9yeQorICogQGluZGV4OiB0aGUgaW5kZXggb2YgdGhlIFBIVCBlbnRyeSB0byBsb29rIGZvcgorICovCitzdGF0aWMgaW5saW5lIEVsZjMyX1BoZHIgKmVsZl9nZXRfcGgodm9pZCAqZWxmX2ltYWdlLCBpbnQgaW5kZXgpCit7CisgICAgRWxmMzJfUGhkciAqZWxmX3BodCA9IGVsZl9nZXRfcGh0KGVsZl9pbWFnZSk7CisgICAgRWxmMzJfRWhkciAqZWxmX2hkciA9IGVsZl9nZXRfaGVhZGVyKGVsZl9pbWFnZSk7CisKKyAgICByZXR1cm4gKEVsZjMyX1BoZHIgKikgKChFbGYzMl9PZmYpIGVsZl9waHQgKyBpbmRleCAqIGVsZl9oZHItPmVfcGhlbnRzaXplKTsKK30KKworLyoqCisgKiBlbGZfaGFzaCAtIFJldHVybnMgdGhlIGluZGV4IGluIGEgU3lzViBoYXNoIHRhYmxlIGZvciB0aGUgc3ltYm9sIG5hbWUuCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBsb29rIGZvcgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBlbGZfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBlbGZfZ251X2hhc2ggLSBSZXR1cm5zIHRoZSBpbmRleCBpbiBhIEdOVSBoYXNoIHRhYmxlIGZvciB0aGUgc3ltYm9sIG5hbWUuCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBsb29rIGZvcgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBlbGZfZ251X2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSk7CisKKy8qKgorICogZWxmX21hbGxvYyAtIEFsbG9jYXRlcyBtZW1vcnkgdG8gYmUgdXNlZCBieSBFTEYgbW9kdWxlIGNvbnRlbnRzLgorICogQG1lbXB0cjogcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBibG9jay4KKyAqIEBhbGlnbm1lbnQ6IGFsaWdubWVudCBjb25zdHJhaW50cyBvZiB0aGUgYmxvY2sKKyAqIEBzaXplOiB0aGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgYmxvY2sKKyAqLworZXh0ZXJuIGludCBlbGZfbWFsbG9jKHZvaWQgKiptZW1wdHIsIHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBlbGZfZnJlZSAtIFJlbGVhc2VzIG1lbW9yeSBwcmV2aW91c2x5IGFsbG9jYXRlZCBieSBlbGZfbWFsbG9jLgorICogQG1lbXB0cjogdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBibG9jaworICovCitleHRlcm4gdm9pZCBlbGZfZnJlZSh2b2lkICptZW1wdHIpOworCisjZW5kaWYgLypFTEZfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZWxmbGluay9sb2FkX2VudjMyLmMgYi9jb3JlL2VsZmxpbmsvbG9hZF9lbnYzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MmNjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2VsZmxpbmsvbG9hZF9lbnYzMi5jCkBAIC0wLDAgKzEsMjUzIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3lzbGludXgvYWR2Lmg+CisjaW5jbHVkZSA8c3lzbGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8YWxsb2NhLmg+CisKKyNpbmNsdWRlIDxzeXMvZXhlYy5oPgorI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworZXh0ZXJuIGNoYXIgX19keW5zdHJfc3RhcnRbXTsKK2V4dGVybiBjaGFyIF9fZHluc3RyX2VuZFtdLCBfX2R5bnN5bV9lbmRbXTsKK2V4dGVybiBjaGFyIF9fZHluc3ltX3N0YXJ0W107CitleHRlcm4gY2hhciBfX2dvdF9zdGFydFtdOworZXh0ZXJuIEVsZl9EeW4gX19keW5hbWljX3N0YXJ0W107CitleHRlcm4gRWxmX1dvcmQgX19nbnVfaGFzaF9zdGFydFtdOworZXh0ZXJuIGNoYXIgX19tb2R1bGVfc3RhcnRbXTsKKworc3RydWN0IGVsZl9tb2R1bGUgY29yZV9tb2R1bGUgPSB7CisgICAgLm5hbWUJCT0gIihjb3JlKSIsCisgICAgLnNoYWxsb3cJCT0gdHJ1ZSwKKyAgICAucmVxdWlyZWQJCT0gTElTVF9IRUFEX0lOSVQoKGNvcmVfbW9kdWxlLnJlcXVpcmVkKSksCisgICAgLmRlcGVuZGFudHMJCT0gTElTVF9IRUFEX0lOSVQoKGNvcmVfbW9kdWxlLmRlcGVuZGFudHMpKSwKKyAgICAubGlzdAkJPSBMSVNUX0hFQURfSU5JVCgoY29yZV9tb2R1bGUubGlzdCkpLAorICAgIC5tb2R1bGVfYWRkcgk9ICh2b2lkICopMHgwLAorICAgIC5naGFzaF90YWJsZQk9IF9fZ251X2hhc2hfc3RhcnQsCisgICAgLnN0cl90YWJsZQkJPSBfX2R5bnN0cl9zdGFydCwKKyAgICAuc3ltX3RhYmxlCQk9IF9fZHluc3ltX3N0YXJ0LAorICAgIC5nb3QJCT0gX19nb3Rfc3RhcnQsCisgICAgLmR5bl90YWJsZQkJPSBfX2R5bmFtaWNfc3RhcnQsCisgICAgLnN5bWVudF9zaXplCT0gc2l6ZW9mKEVsZl9TeW0pLAorfTsKKworLyoKKyAqIEluaXRpYWxpemVzIHRoZSBtb2R1bGUgc3Vic3lzdGVtIGJ5IHRha2luZyB0aGUgY29yZSBtb2R1bGUKKyAqIChwcmVpbml0aWFsaXplZCBzaGFsbG93IG1vZHVsZSkgYW5kIHBsYWNpbmcgaXQgb24gdG9wIG9mIHRoZQorICogbW9kdWxlc19oZWFkX2xpc3QuCisgKi8KK3ZvaWQgaW5pdF9tb2R1bGVfc3Vic3lzdGVtKHN0cnVjdCBlbGZfbW9kdWxlICptb2R1bGUpCit7CisgICAgbGlzdF9hZGQoJm1vZHVsZS0+bGlzdCwgJm1vZHVsZXNfaGVhZCk7Cit9CisKK19fZXhwb3J0IGludCBzdGFydF9sZGxpbnV4KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcnY7CisKK2FnYWluOgorCXJ2ID0gc3Bhd25fbG9hZChMRExJTlVYLCBhcmdjLCBhcmd2KTsKKwlpZiAocnYgPT0gRUVYSVNUKSB7CisJCS8qCisJCSAqIElmIGEgQ09NMzIgbW9kdWxlIGNhbGxzIGV4ZWN1dGUoKSB3ZSBtYXkgbmVlZCB0bworCQkgKiB1bmxvYWQgYWxsIHRoZSBtb2R1bGVzIGxvYWRlZCBzaW5jZSBsZGxpbnV4LiosCisJCSAqIGFuZCByZXN0YXJ0IGluaXRpYWxpc2F0aW9uLiBUaGlzIGlzIGVzcGVjaWFsbHkKKwkJICogaW1wb3J0YW50IGZvciBjb25maWcgZmlsZXMuCisJCSAqCisJCSAqIEJ1dCBiZWZvcmUgd2UgZG8gdGhhdCwgdHJ5IG91ciBiZXN0IHRvIG1ha2Ugc3VyZQorCQkgKiB0aGF0IHNwYXduX2xvYWQoKSBpcyBnb25uYSBzdWNjZWVkLCBlLmcuIHRoYXQgd2UKKwkJICogY2FuIGZpbmQgTERMSU5VWCBpdCBpbiBQQVRILgorCQkgKi8KKwkJc3RydWN0IGVsZl9tb2R1bGUgKmxkbGludXg7CisJCUZJTEUgKmY7CisKKwkJZiA9IGZpbmRwYXRoKExETElOVVgpOworCQlpZiAoIWYpCisJCQlyZXR1cm4gRU5PRU5UOworCisJCWZjbG9zZShmKTsKKwkJbGRsaW51eCA9IHVubG9hZF9tb2R1bGVzX3NpbmNlKExETElOVVgpOworCisJCS8qCisJCSAqIEZpbmFsbHkgdW5sb2FkIExETElOVVguCisJCSAqCisJCSAqIFdlJ2xsIHJlbG9hZCBpdCB3aGVuIHdlIGp1bXAgdG8gJ2FnYWluJyB3aGljaCB3aWxsCisJCSAqIGNhdXNlIGFsbCB0aGUgaW5pdGlhbHNhdGlvbiBzdGVwcyB0byBiZSBleGVjdXRlZAorCQkgKiBhZ2Fpbi4KKwkJICovCisJCW1vZHVsZV91bmxvYWQobGRsaW51eCk7CisJCWdvdG8gYWdhaW47CisJfQorCisJcmV0dXJuIHJ2OworfQorCisvKiBub3RlIHRvIHNlbGY6IGRvIF8qTk9UKl8gdXNlIHN0YXRpYyBrZXkgd29yZCBvbiB0aGlzIGZ1bmN0aW9uICovCit2b2lkIGxvYWRfZW52MzIoY29tMzJzeXNfdCAqIHJlZ3MgX191bnVzZWQpCit7CisJc3RydWN0IGZpbGVfaW5mbyAqZnA7CisJaW50IGZkOworCWNoYXIgKmFyZ3ZbXSA9IHsgTERMSU5VWCwgTlVMTCB9OworCWNoYXIgcmVhbG5hbWVbRklMRU5BTUVfTUFYXTsKKwlzaXplX3Qgc2l6ZTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpzZWFyY2hfZGlyZWN0b3JpZXNbXSA9IHsKKwkJIi9ib290L2lzb2xpbnV4IiwKKwkJIi9pc29saW51eCIsCisJCSIvYm9vdC9zeXNsaW51eCIsCisJCSIvc3lzbGludXgiLAorCQkiLyIsCisJCU5VTEwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVuYW1lc1tdID0geworCQlMRExJTlVYLAorCQlOVUxMCisJfTsKKworCWRwcmludGYoIlN0YXJ0aW5nICVzIGVsZiBtb2R1bGUgc3Vic3lzdGVtLi4uXG4iLCBFTEZfTU9EX1NZUyk7CisKKwlpZiAoc3RybGVuKEN1cnJlbnREaXJOYW1lKSAmJiAhcGF0aF9hZGQoQ3VycmVudERpck5hbWUpKSB7CisJCXByaW50ZigiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBQQVRIXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2l6ZSA9IChzaXplX3QpX19keW5zdHJfZW5kIC0gKHNpemVfdClfX2R5bnN0cl9zdGFydDsKKwljb3JlX21vZHVsZS5zdHJ0YWJsZV9zaXplID0gc2l6ZTsKKwlzaXplID0gKHNpemVfdClfX2R5bnN5bV9lbmQgLSAoc2l6ZV90KV9fZHluc3ltX3N0YXJ0OworCWNvcmVfbW9kdWxlLnN5bXRhYmxlX3NpemUgPSBzaXplOworCWNvcmVfbW9kdWxlLmJhc2VfYWRkciA9IChFbGZfQWRkcilfX21vZHVsZV9zdGFydDsKKworCWluaXRfbW9kdWxlX3N1YnN5c3RlbSgmY29yZV9tb2R1bGUpOworCisJc3RhcnRfbGRsaW51eCgxLCBhcmd2KTsKKworCS8qCisJICogSWYgd2UgZmFpbGVkIHRvIGxvYWQgTERMSU5VWCBpdCBjb3VsZCBiZSBiZWNhdXNlIG91cgorCSAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXNuJ3QgdGhlIGluc3RhbGwgZGlyZWN0b3J5LiBUcnkKKwkgKiBhIGJpdCBoYXJkZXIgdG8gZmluZCBMRExJTlVYLiBJZiBzZWFyY2hfZGlycygpIHN1Y2NlZWRzCisJICogaW4gZmluZGluZyBMRExJTlVYIGl0IHdpbGwgc2V0IHRoZSBjd2QuCisJICovCisJZmQgPSBvcGVuZGV2KCZfX2ZpbGVfZGV2LCBOVUxMLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJZ290byBvdXQ7CisKKwlmcCA9ICZfX2ZpbGVfaW5mb1tmZF07CisKKwlpZiAoIXNlYXJjaF9kaXJzKCZmcC0+aS5mZCwgc2VhcmNoX2RpcmVjdG9yaWVzLCBmaWxlbmFtZXMsIHJlYWxuYW1lKSkgeworCQljaGFyIHBhdGhbRklMRU5BTUVfTUFYXTsKKworCQkvKgorCQkgKiBzZWFyY2hfZGlycygpIHNldHMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaWYKKwkJICogaXQgc3VjY2Vzc2Z1bGx5IG9wZW5zIHRoZSBmaWxlLiBBZGQgdGhlIGRpcmVjdG9yeQorCQkgKiBpbiB3aGljaCB3ZSBmb3VuZCBsZGxpbnV4LiogdG8gUEFUSC4KKwkJICovCisJCWlmICghY29yZV9nZXRjd2QocGF0aCwgc2l6ZW9mKHBhdGgpKSkKKwkJCWdvdG8gb3V0OworCisJCWlmICghcGF0aF9hZGQocGF0aCkpIHsKKwkJCXByaW50ZigiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBQQVRIXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3RhcnRfbGRsaW51eCgxLCBhcmd2KTsKKwl9CisKK291dDoKKwl3cml0ZXN0cigiXG5GYWlsZWQgdG8gbG9hZCAiKTsKKwl3cml0ZXN0cihMRExJTlVYKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9fY21kbGluZTsKK19fZXhwb3J0IGNvbnN0IGNoYXIgKmNvbTMyX2NtZGxpbmUodm9pZCkKK3sKKwlyZXR1cm4gX19jbWRsaW5lOworfQorCitfX2V4cG9ydCBpbnQgY3JlYXRlX2FyZ3NfYW5kX2xvYWQoY2hhciAqY21kbGluZSkKK3sKKwljaGFyICpwLCAqKmFyZ3Y7CisJaW50IGFyZ2M7CisJaW50IGk7CisKKwlpZiAoIWNtZGxpbmUpCisJCXJldHVybiAtMTsKKworCWZvciAoYXJnYyA9IDAsIHAgPSBjbWRsaW5lOyAqcDsgYXJnYysrKSB7CisJCS8qIEZpbmQgdGhlIGVuZCBvZiB0aGlzIGFyZyAqLworCQl3aGlsZSgqcCAmJiAhaXNzcGFjZSgqcCkpCisJCQlwKys7CisKKwkJLyoKKwkJICogTm93IHNraXAgYWxsIHdoaXRlc3BhY2UgYmV0d2VlbiBhcmd1bWVudHMuCisJCSAqLworCQl3aGlsZSAoKnAgJiYgaXNzcGFjZSgqcCkpCisJCQlwKys7CisJfQorCisJLyoKKwkgKiBHZW5lcmF0ZSBhIGNvcHkgb2YgYXJndiBvbiB0aGUgc3RhY2sgYXMgdGhpcyBpcworCSAqIHRyYWRpdGlvbmFsbHkgd2hlcmUgcHJvY2VzcyBhcmd1bWVudHMgZ28uCisJICoKKwkgKiBhcmd2WzBdIG11c3QgYmUgdGhlIGNvbW1hbmQgbmFtZS4gUmVtZW1iZXIgdG8gYWxsb2NhdGUKKwkgKiBzcGFjZSBmb3IgdGhlIHNlbnRpbmVsIE5VTEwuCisJICovCisJYXJndiA9IGFsbG9jYSgoYXJnYyArIDEpICogc2l6ZW9mKGNoYXIgKikpOworCisJZm9yIChpID0gMCwgcCA9IGNtZGxpbmU7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqc3RhcnQ7CisJCWludCBsZW4gPSAwOworCisJCXN0YXJ0ID0gcDsKKworCQkvKiBGaW5kIHRoZSBlbmQgb2YgdGhpcyBhcmcgKi8KKwkJd2hpbGUoKnAgJiYgIWlzc3BhY2UoKnApKSB7CisJCQlwKys7CisJCQlsZW4rKzsKKwkJfQorCisJCWFyZ3ZbaV0gPSBtYWxsb2MobGVuICsgMSk7CisJCXN0cm5jcHkoYXJndltpXSwgc3RhcnQsIGxlbik7CisJCWFyZ3ZbaV1bbGVuXSA9ICdcMCc7CisKKwkJLyoKKwkJICogTm93IHNraXAgYWxsIHdoaXRlc3BhY2UgYmV0d2VlbiBhcmd1bWVudHMuCisJCSAqLworCQl3aGlsZSAoKnAgJiYgaXNzcGFjZSgqcCkpCisJCQlwKys7CisKKwkJLyoKKwkJICogUG9pbnQgX19jbWRsaW5lIGF0ICJhcmd2WzFdIC4uLiBhcmd2W2FyZ2MtMV0iCisJCSAqLworCQlpZiAoaSA9PSAwKQorCQkJX19jbWRsaW5lID0gcDsKKwl9CisKKwkvKiBOVUwtdGVybWluYXRlICovCisJYXJndlthcmdjXSA9IE5VTEw7CisKKwlyZXR1cm4gc3Bhd25fbG9hZChhcmd2WzBdLCBhcmdjLCBhcmd2KTsKK30KKwordm9pZCBwbV9lbnYzMl9ydW4oY29tMzJzeXNfdCAqcmVncykKK3sKKwljaGFyICpjbWRsaW5lOworCisJY21kbGluZSA9IE1LX1BUUihyZWdzLT5lcywgcmVncy0+ZWJ4LndbMF0pOworCWlmIChjcmVhdGVfYXJnc19hbmRfbG9hZChjbWRsaW5lKSA8IDApCisJCXByaW50ZigiRmFpbGVkIHRvIHJ1biBjb20zMiBtb2R1bGVcbiIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9lcnJuby5jIGIvY29yZS9lcnJuby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZmQ5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Vycm5vLmMKQEAgLTAsMCArMSw0IEBACisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitfX2V4cG9ydCBpbnQgZXJybm87CmRpZmYgLS1naXQgYS9jb3JlL2V4dGVybi5pbmMgYi9jb3JlL2V4dGVybi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4ZWIwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZXh0ZXJuLmluYwpAQCAtMCwwICsxLDk3IEBACis7Cis7IGV4dGVybi5pbmMKKzsKKzsgUHJvdG90eXBlcyBmb3IgZXh0ZXJuYWwgZnVuY3Rpb25zCisKKyVpZm5kZWYgRVhURVJOX0lOQworJWRlZmluZSBFWFRFUk5fSU5DCisKKwk7IHJsbHBhY2suYworCWV4dGVybiBybGxwYWNrLCBybGx1bnBhY2sKKworCTsgaGVsbG8uYworCWV4dGVybiBoZWxsbworCisJO2Fib3J0LmMKKwlleHRlcm4gYWJvcnRfbG9hZF9uZXcKKworCTsgZWxmbGluay9sb2FkX2VudjMyLmMKKwlleHRlcm4gbG9hZF9lbnYzMiwgcG1fZW52MzJfcnVuCisKKwk7IG1lbXNjYW4uYworCWV4dGVybiBoaWdobWVtX2luaXQKKworCWV4dGVybiBsaW51eF9rZXJuZWwKKworCWV4dGVybiBtcDEsIG1wMiwgbXAzLCBtcDQsIG1wNQorCisJZXh0ZXJuIGhleGR1bXAsIG15ZHVtcAorCisJZXh0ZXJuIG1lbV9pbml0CisKKwk7IGZzLmMKKwlleHRlcm4gcG1fZnNfaW5pdCwgcG1fc2VhcmNoZGlyLCBnZXRmc3NlYywgZ2V0ZnNieXRlcworCWV4dGVybiBwbV9tYW5nbGVfbmFtZSwgcG1fbG9hZF9jb25maWcKKyAgICAgICAgZXh0ZXJuIHBtX29wZW5fZmlsZSwgcG1fY2xvc2VfZmlsZQorCWV4dGVybiBTZWN0b3JTaXplLCBTZWN0b3JTaGlmdAorCisJOyBjaGRpci5jCisJZXh0ZXJuIHBtX3JlYWxwYXRoCisKKyAgICAgICAgOyByZWFkZGlyLmMKKyAgICAgICAgZXh0ZXJuIG9wZW5kaXIsIHJlYWRkaXIsIGNsb3NlZGlyCisKKwk7IG5ld2NvbmZpZy5jCisJZXh0ZXJuIHBtX2lzX2NvbmZpZ19maWxlCisKKwk7IGlkbGUuYworCWV4dGVybiBfX2lkbGUKKworJWlmZGVmIERFQlVHCisJOyBkZWJ1Zy5jCisJZXh0ZXJuIHBtX2RlYnVnX21zZworCisgICVtYWNybyBkcHJpbnQgMSsKKwlwdXNoIGF4CisJY2FsbCAlJWZ3ZAorCWRiICUxCisJZGIgMAorJSVmd2Q6CXBvcCBheAorCXBtX2NhbGwgcG1fZGVidWdfbXNnCisJcG9wIGF4CisgICVlbmRtYWNybworJWVsc2UKKyAgJW1hY3JvIGRwcmludCAxKworICAlZW5kbWFjcm8KKyVlbmRpZgorCislaWYgSVNfUFhFTElOVVgKKwk7IHB4ZS5jCisJZXh0ZXJuIHVubG9hZF9weGUsIHJlc2V0X3B4ZSwgaHR0cF9iYWtlX2Nvb2tpZXMKKyVlbmRpZgorCisJOyBwbGFpbmNvbi5jCisJZXh0ZXJuIHBtX3dyaXRlY2hyCisKKwk7IGNsZWFudXAuYworCWV4dGVybiBjbGVhbnVwX2hhcmR3YXJlCisKKwk7IHdyaXRlc3RyLmMKKwlleHRlcm4gcG1fd3JpdGVzdHIsIGNybGYKKworCTsgd3JpdGVoZXguYworCWV4dGVybiBwbV93cml0ZWhleDIsIHBtX3dyaXRlaGV4NCwgcG1fd3JpdGVoZXg4CisKKwk7IGdyYXBoaWNzLmMKKwlleHRlcm4gc3lzbGludXhfZm9yY2VfdGV4dF9tb2RlLCB2Z2FzaG93Y3Vyc29yLCB2Z2FoaWRlY3Vyc29yLCBwbV91c2luZ192Z2EKKworCTsgY29uaW8uYworCWV4dGVybiBwbV9wb2xsY2hhciwgcG1fd3JpdGVfc2VyaWFsLCBwbV9zZXJpYWxjZmcKKworCTsgZm9udC5jCisJZXh0ZXJuIHBtX2dldGNoYXIsIHBtX2FkanVzdF9zY3JlZW4sIHBtX3VzZXJmb250CisKKwk7IGxvY2FsYm9vdC5jCisJZXh0ZXJuIHBtX2xvY2FsX2Jvb3QKKworJWVuZGlmIDsgRVhURVJOX0lOQwpkaWZmIC0tZ2l0IGEvY29yZS9mb250LmMgYi9jb3JlL2ZvbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhmNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mb250LmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCisgKiBmb250LmMKKyAqCisgKiBWR0EgZm9udCBoYW5kbGluZyBjb2RlCisgKgorICovCisKKyNpbmNsdWRlIDxzeXNsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3ZpZGVvLmg+CisjaW5jbHVkZSA8c3lzL2lvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmcy5oPgorCisjaW5jbHVkZSAiYmlvcy5oIgorI2luY2x1ZGUgImdyYXBoaWNzLmgiCisjaW5jbHVkZSAiY29yZS5oIgorCitfX2V4cG9ydCB1aW50OF90IFVzZXJGb250ID0gMDsJCS8qIFVzaW5nIGEgdXNlci1zcGVjaWZpZWQgZm9udCAqLworCitfX2V4cG9ydCBfX2xvd21lbSBjaGFyIGZvbnRidWZbODE5Ml07CisKK3VpbnQxNl90IEdYUGl4Q29scyA9IDE7CQkvKiBHcmFwaGljcyBtb2RlIHBpeGVsIGNvbHVtbnMgKi8KK3VpbnQxNl90IEdYUGl4Um93cyA9IDE7CQkvKiBHcmFwaGljcyBtb2RlIHBpeGVsIHJvd3MgKi8KKworLyoKKyAqIGxvYWRmb250OglMb2FkIGEgLnBzZiBmb250IGZpbGUgYW5kIGluc3RhbGwgaXQgb250byB0aGUgVkdBIGNvbnNvbGUKKyAqCQkoaWYgd2UncmUgbm90IG9uIGEgVkdBIHNjcmVlbiB0aGVuIGlnbm9yZS4pCisgKi8KK19fZXhwb3J0IHZvaWQgbG9hZGZvbnQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHBzZmhlYWRlciB7CisJCXVpbnQxNl90IG1hZ2ljOworCQl1aW50OF90IG1vZGU7CisJCXVpbnQ4X3QgaGVpZ2h0OworCX0gaGRyOworCUZJTEUgKmY7CisKKwlmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisJaWYgKCFmKQorCQlyZXR1cm47CisKKwkvKiBSZWFkIGhlYWRlciAqLworCWlmIChfZnJlYWQoJmhkciwgc2l6ZW9mIGhkciwgZikgIT0gc2l6ZW9mIGhkcikKKwkJZ290byBmYWlsOworCisJLyogTWFnaWMgbnVtYmVyICovCisJaWYgKGhkci5tYWdpYyAhPSAweDA0MzYpCisJCWdvdG8gZmFpbDsKKworCS8qIEZpbGUgbW9kZTogZm9udCBtb2RlcyAwLTUgc3VwcG9ydGVkICovCisJaWYgKGhkci5tb2RlID4gNSkKKwkJZ290byBmYWlsOworCisJLyogVkdBIG1pbmltdW0vbWF4aW11bSAqLworCWlmIChoZHIuaGVpZ2h0IDwgMiB8fCBoZHIuaGVpZ2h0ID4gMzIpCisJCWdvdG8gZmFpbDsKKworCS8qIExvYWQgdGhlIGFjdHVhbCBmb250IGludG8gdGhlIGZvbnQgYnVmZmVyLiAqLworCW1lbXNldChmb250YnVmLCAwLCAyNTYqMzIpOworCWlmIChfZnJlYWQoZm9udGJ1ZiwgMjU2Kmhkci5oZWlnaHQsIGYpICE9IDI1NipoZHIuaGVpZ2h0KQorCSAgICBnb3RvIGZhaWw7CisKKwkvKiBMb2FkZWQgT0sgKi8KKwlWR0FGb250U2l6ZSA9IGhkci5oZWlnaHQ7CisJVXNlckZvbnQgPSAxOwkJLyogU2V0IGZvbnQgZmxhZyAqLworCXVzZV9mb250KCk7CisKK2ZhaWw6CisJZmNsb3NlKGYpOworfQorCisvKgorICogdXNlX2ZvbnQ6CisgKglUaGlzIHJvdXRpbmUgYWN0aXZhdGVzIHdoYXRldmVyIGZvbnQgaGFwcGVucyB0byBiZSBpbiB0aGUKKyAqCXZnYWZvbnRidWYsIGFuZCB1cGRhdGVzIHRoZSBiaW9zX2FkanVzdF9zY3JlZW4gZGF0YS4KKyAqICAgICAgTXVzdCBiZSBjYWxsZWQgd2l0aCBDUyA9IERTCisgKi8KK3ZvaWQgdXNlX2ZvbnQodm9pZCkKK3sKKwljb20zMnN5c190IGlyZWcsIG9yZWc7CisJdWludDhfdCBieXRlcyA9IFZHQUZvbnRTaXplOworCisJLyogTm9uc3RhbmRhcmQgbW9kZT8gKi8KKwlpZiAoVXNpbmdWR0EgJiB+MHgzKQorCQlzeXNsaW51eF9mb3JjZV90ZXh0X21vZGUoKTsKKworCW1lbXNldCgmaXJlZywgMCwgc2l6ZW9mKGlyZWcpKTsKKworCWlyZWcuZXMgPSBTRUcoZm9udGJ1Zik7CisJaXJlZy5lYnAud1swXSA9IE9GRlMoZm9udGJ1Zik7IC8qIEVTOkJQIC0+IGZvbnQgKi8KKworCS8qIEFyZSB3ZSB1c2luZyBhIHVzZXItc3BlY2lmaWVkIGZvbnQ/ICovCisJaWYgKFVzZXJGb250ICYgMHgxKSB7CisJCS8qIEFyZSB3ZSBpbiBncmFwaGljcyBtb2RlPyAqLworCQlpZiAoVXNpbmdWR0EgJiAweDEpIHsKKwkJCXVpbnQ4X3Qgcm93czsKKworCQkJcm93cyA9IEdYUGl4Um93cyAvIGJ5dGVzOworCQkJVmlkUm93cyA9IHJvd3MgLSAxOworCisJCQkvKiBTZXQgdXNlciBjaGFyYWN0ZXIgdGFibGUgKi8KKwkJCWlyZWcuZWF4LndbMF0gPSAweDExMjE7CisJCQlpcmVnLmVieC5iWzBdID0gMDsKKwkJCWlyZWcuZWN4LmJbMF0gPSBieXRlczsgLyogYnl0ZXMvY2hhcmFjdGVyICovCisJCQlpcmVnLmVkeC5iWzBdID0gcm93czsKKworCQkJX19pbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CisKKwkJCS8qIDggcGl4ZWxzL2NoYXJhY3RlciAqLworCQkJVmlkQ29scyA9ICgoR1hQaXhDb2xzID4+IDMpIC0gMSk7CisKKwkJCS8qIE5vIG5lZWQgdG8gY2FsbCBiaW9zX2FkanVzdF9zY3JlZW4gKi8KKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlyZWcuZWF4LndbMF0gPSAweDExMTA7CS8qIExvYWQgaW50byBWR0EgUkFNICovCisJCQlpcmVnLmVieC5iWzBdID0gMDsKKwkJCWlyZWcuZWJ4LmJbMV0gPSBieXRlczsgLyogYnl0ZXMvY2hhcmFjdGVyICovCisJCQlpcmVnLmVjeC53WzBdID0gMjU2OworCQkJaXJlZy5lZHgud1swXSA9IDA7CisKKwkJCV9faW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisJCQlpcmVnLmVieC5iWzBdID0gMDsKKwkJCWlyZWcuZWF4LndbMF0gPSAweDExMDM7IC8qIFNlbGVjdCBwYWdlIDAgKi8KKwkJCV9faW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CisJCX0KKworCX0KKworCWJpb3NfYWRqdXN0X3NjcmVlbigpOworfQorCisvKgorICogYmlvc19hZGp1c3Rfc2NyZWVuOiBTZXQgdGhlIGludGVybmFsIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNjcmVlbiBzaXplLgorICoJCVRoaXMgaXMgYSBzdWJyb3V0aW5lIGluIGNhc2Ugd2UncmUgbG9hZGluZyBhIGN1c3RvbSBmb250LgorICovCit2b2lkIGJpb3NfYWRqdXN0X3NjcmVlbih2b2lkKQoreworCWNvbTMyc3lzX3QgaXJlZywgb3JlZzsKKwl2b2xhdGlsZSB1aW50OF90ICp2aWRyb3dzID0gKHZvbGF0aWxlIHVpbnQ4X3QgKilCSU9TX3ZpZHJvd3M7CisJdWludDhfdCByb3dzLCBjb2xzOworCisJbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YoaXJlZykpOworCisJcm93cyA9ICp2aWRyb3dzOworCWlmICghcm93cykgeworCQkvKgorCQkgKiBObyB2aWRyb3dzIGluIEJJT1MsIGFzc3VtZSAyNS4KKwkJICogKFJlbWVtYmVyOiB2aWRyb3dzID09IHJvd3MtMSkKKwkJICovCisJCXJvd3MgPSAyNDsKKwl9CisKKwlWaWRSb3dzID0gcm93czsKKworCWlyZWcuZWF4LmJbMV0gPSAweDBmOwkvKiBSZWFkIHZpZGVvIHN0YXRlICovCisJX19pbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CisJY29scyA9IG9yZWcuZWF4LmJbMV07CisKKwlWaWRDb2xzID0gLS1jb2xzOwkvKiBTdG9yZSBjb3VudC0xIChzYW1lIGFzIHJvd3MpICovCit9CisKK3ZvaWQgYWRqdXN0X3NjcmVlbih2b2lkKQoreworCWlmIChmaXJtd2FyZS0+YWRqdXN0X3NjcmVlbikKKwkJZmlybXdhcmUtPmFkanVzdF9zY3JlZW4oKTsKK30KKwordm9pZCBwbV9hZGp1c3Rfc2NyZWVuKGNvbTMyc3lzX3QgKnJlZ3MgX191bnVzZWQpCit7CisJYWRqdXN0X3NjcmVlbigpOworfQorCit2b2lkIHBtX3VzZXJmb250KGNvbTMyc3lzX3QgKnJlZ3MpCit7CisJcmVncy0+ZXMgPSBTRUcoZm9udGJ1Zik7CisJcmVncy0+ZWJ4LndbMF0gPSBPRkZTKGZvbnRidWYpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9idHJmcy9idHJmcy5jIGIvY29yZS9mcy9idHJmcy9idHJmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTExMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL2J0cmZzL2J0cmZzLmMKQEAgLTAsMCArMSw2OTQgQEAKKy8qCisgKiBidHJmcy5jIC0tIHJlYWRvbmx5IGJ0cmZzIHN1cHBvcnQgZm9yIHN5c2xpbnV4CisgKiBTb21lIGRhdGEgc3RydWN0dXJlcyBhcmUgZGVyaXZhdGVkIGZyb20gYnRyZnMtdG9vbHMtMC4xOSBjdHJlZS5oCisgKiBDb3B5cmlnaHQgMjAwOS0yMDE0IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3JzOiBBbGVrIER1LCBILiBQZXRlciBBbnZpbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjYWNoZS5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxkaXNrLmg+CisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlICJidHJmcy5oIgorCit1bmlvbiB0cmVlX2J1ZiB7CisJc3RydWN0IGJ0cmZzX2hlYWRlciBoZWFkZXI7CisJc3RydWN0IGJ0cmZzX25vZGUgbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfbGVhZiBsZWFmOworfTsKKworLyogZmlsZXN5c3RlbSBpbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBidHJmc19pbmZvIHsKKwl1NjQgZnNfdHJlZTsKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgc2I7CisJc3RydWN0IGJ0cmZzX2NodW5rX21hcCBjaHVua19tYXA7CisJdW5pb24gdHJlZV9idWYgKnRyZWVfYnVmOworfTsKKworLyogY29tcGFyZSBmdW5jdGlvbiB1c2VkIGZvciBiaW5fc2VhcmNoICovCit0eXBlZGVmIGludCAoKmNtcF9mdW5jKShjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyKTsKKworLyogc2ltcGxlIGJ1dCB1c2VmdWwgYmluIHNlYXJjaCwgdXNlZCBmb3IgY2h1bmsgc2VhcmNoIGFuZCBidHJlZSBzZWFyY2ggKi8KK3N0YXRpYyBpbnQgYmluX3NlYXJjaCh2b2lkICpwdHIsIGludCBpdGVtX3NpemUsIHZvaWQgKmNtcF9pdGVtLCBjbXBfZnVuYyBmdW5jLAorCQkgICAgICBpbnQgbWluLCBpbnQgbWF4LCBpbnQgKnNsb3QpCit7CisJaW50IGxvdyA9IG1pbjsKKwlpbnQgaGlnaCA9IG1heDsKKwlpbnQgbWlkOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdm9pZCAqaXRlbTsKKworCXdoaWxlIChsb3cgPCBoaWdoKSB7CisJCW1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CisJCW9mZnNldCA9IG1pZCAqIGl0ZW1fc2l6ZTsKKworCQlpdGVtID0gcHRyICsgb2Zmc2V0OworCQlyZXQgPSBmdW5jKGl0ZW0sIGNtcF9pdGVtKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCWxvdyA9IG1pZCArIDE7CisJCWVsc2UgaWYgKHJldCA+IDApCisJCQloaWdoID0gbWlkOworCQllbHNlIHsKKwkJCSpzbG90ID0gbWlkOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJKnNsb3QgPSBsb3c7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfY29tcF9jaHVua19tYXAoc3RydWN0IGJ0cmZzX2NodW5rX21hcF9pdGVtICptMSwKKwkJCQlzdHJ1Y3QgYnRyZnNfY2h1bmtfbWFwX2l0ZW0gKm0yKQoreworCWlmIChtMS0+bG9naWNhbCA+IG0yLT5sb2dpY2FsKQorCQlyZXR1cm4gMTsKKwlpZiAobTEtPmxvZ2ljYWwgPCBtMi0+bG9naWNhbCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKiBpbnNlcnQgYSBuZXcgY2h1bmsgbWFwcGluZyBpdGVtICovCitzdGF0aWMgdm9pZCBpbnNlcnRfbWFwKHN0cnVjdCBmc19pbmZvICpmcywgc3RydWN0IGJ0cmZzX2NodW5rX21hcF9pdGVtICppdGVtKQoreworCXN0cnVjdCBidHJmc19pbmZvICogY29uc3QgYmZzID0gZnMtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX2NodW5rX21hcCAqY2h1bmtfbWFwID0gJmJmcy0+Y2h1bmtfbWFwOworCWludCByZXQ7CisJaW50IHNsb3Q7CisJaW50IGk7CisKKwlpZiAoY2h1bmtfbWFwLT5tYXAgPT0gTlVMTCkgeyAvKiBmaXJzdCBpdGVtICovCisJCWNodW5rX21hcC0+bWFwX2xlbmd0aCA9IEJUUkZTX01BWF9DSFVOS19FTlRSSUVTOworCQljaHVua19tYXAtPm1hcCA9IG1hbGxvYyhjaHVua19tYXAtPm1hcF9sZW5ndGgKKwkJCQkJKiBzaXplb2YoY2h1bmtfbWFwLT5tYXBbMF0pKTsKKwkJY2h1bmtfbWFwLT5tYXBbMF0gPSAqaXRlbTsKKwkJY2h1bmtfbWFwLT5jdXJfbGVuZ3RoID0gMTsKKwkJcmV0dXJuOworCX0KKwlyZXQgPSBiaW5fc2VhcmNoKGNodW5rX21hcC0+bWFwLCBzaXplb2YoKml0ZW0pLCBpdGVtLAorCQkJKGNtcF9mdW5jKWJ0cmZzX2NvbXBfY2h1bmtfbWFwLCAwLAorCQkJY2h1bmtfbWFwLT5jdXJfbGVuZ3RoLCAmc2xvdCk7CisJaWYgKHJldCA9PSAwKS8qIGFscmVhZHkgaW4gbWFwICovCisJCXJldHVybjsKKwlpZiAoY2h1bmtfbWFwLT5jdXJfbGVuZ3RoID09IEJUUkZTX01BWF9DSFVOS19FTlRSSUVTKSB7CisJCS8qIHNob3VsZCBiZSBpbXBvc3NpYmxlICovCisJCXByaW50ZigidG9vIG1hbnkgY2h1bmsgaXRlbXNcbiIpOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IGNodW5rX21hcC0+Y3VyX2xlbmd0aDsgaSA+IHNsb3Q7IGktLSkKKwkJY2h1bmtfbWFwLT5tYXBbaV0gPSBjaHVua19tYXAtPm1hcFtpLTFdOworCWNodW5rX21hcC0+bWFwW3Nsb3RdID0gKml0ZW07CisJY2h1bmtfbWFwLT5jdXJfbGVuZ3RoKys7Cit9CisKKy8qCisgKiBmcm9tIHN5c19jaHVua19hcnJheSBvciBjaHVua190cmVlLCB3ZSBjYW4gY29udmVydCBhIGxvZ2ljYWwgYWRkcmVzcyB0bworICogYSBwaHlzaWNhbCBhZGRyZXNzIHdlIGNhbiBub3Qgc3VwcG9ydCBtdWx0aSBkZXZpY2UgY2FzZSB5ZXQKKyAqLworc3RhdGljIHU2NCBsb2dpY2FsX3BoeXNpY2FsKHN0cnVjdCBmc19pbmZvICpmcywgdTY0IGxvZ2ljYWwpCit7CisJc3RydWN0IGJ0cmZzX2luZm8gKiBjb25zdCBiZnMgPSBmcy0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfY2h1bmtfbWFwICpjaHVua19tYXAgPSAmYmZzLT5jaHVua19tYXA7CisJc3RydWN0IGJ0cmZzX2NodW5rX21hcF9pdGVtIGl0ZW07CisJaW50IHNsb3QsIHJldDsKKworCWl0ZW0ubG9naWNhbCA9IGxvZ2ljYWw7CisJcmV0ID0gYmluX3NlYXJjaChjaHVua19tYXAtPm1hcCwgc2l6ZW9mKGNodW5rX21hcC0+bWFwWzBdKSwgJml0ZW0sCisJCQkoY21wX2Z1bmMpYnRyZnNfY29tcF9jaHVua19tYXAsIDAsCisJCQljaHVua19tYXAtPmN1cl9sZW5ndGgsICZzbG90KTsKKwlpZiAocmV0ID09IDApCisJCXNsb3QrKzsKKwllbHNlIGlmIChzbG90ID09IDApCisJCXJldHVybiAtMTsKKwlpZiAobG9naWNhbCA+PQorCQljaHVua19tYXAtPm1hcFtzbG90LTFdLmxvZ2ljYWwgKyBjaHVua19tYXAtPm1hcFtzbG90LTFdLmxlbmd0aCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBjaHVua19tYXAtPm1hcFtzbG90LTFdLnBoeXNpY2FsICsgbG9naWNhbCAtCisJCQljaHVua19tYXAtPm1hcFtzbG90LTFdLmxvZ2ljYWw7Cit9CisKKy8qIGJ0cmZzIGhhcyBzZXZlcmFsIHN1cGVyIGJsb2NrIG1pcnJvcnMsIG5lZWQgdG8gY2FsY3VsYXRlIHRoZWlyIGxvY2F0aW9uICovCitzdGF0aWMgaW5saW5lIHU2NCBidHJmc19zYl9vZmZzZXQoaW50IG1pcnJvcikKK3sKKwl1NjQgc3RhcnQgPSAxNiAqIDEwMjQ7CisJaWYgKG1pcnJvcikKKwkJcmV0dXJuIHN0YXJ0IDw8IChCVFJGU19TVVBFUl9NSVJST1JfU0hJRlQgKiBtaXJyb3IpOworCXJldHVybiBCVFJGU19TVVBFUl9JTkZPX09GRlNFVDsKK30KKworLyogZmluZCB0aGUgbW9zdCByZWNlbnQgc3VwZXIgYmxvY2sgKi8KK3N0YXRpYyB2b2lkIGJ0cmZzX3JlYWRfc3VwZXJfYmxvY2soc3RydWN0IGZzX2luZm8gKmZzKQoreworCWludCBpOworCWludCByZXQ7CisJdTggZnNpZFtCVFJGU19GU0lEX1NJWkVdOworCXU2NCBvZmZzZXQ7CisJdTY0IHRyYW5zaWQgPSAwOworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayBidWY7CisJc3RydWN0IGJ0cmZzX2luZm8gKiBjb25zdCBiZnMgPSBmcy0+ZnNfaW5mbzsKKworCWJmcy0+c2IudG90YWxfYnl0ZXMgPSB+MDsgLyogVW5rbm93biBhcyBvZiB5ZXQgKi8KKworCS8qIGZpbmQgbW9zdCByZWNlbnQgc3VwZXIgYmxvY2sgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQlRSRlNfU1VQRVJfTUlSUk9SX01BWDsgaSsrKSB7CisJCW9mZnNldCA9IGJ0cmZzX3NiX29mZnNldChpKTsKKwkJaWYgKG9mZnNldCA+PSBiZnMtPnNiLnRvdGFsX2J5dGVzKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gY2FjaGVfcmVhZChmcywgKGNoYXIgKikmYnVmLCBvZmZzZXQsIHNpemVvZihidWYpKTsKKwkJaWYgKHJldCA8IHNpemVvZihidWYpKQorCQkJYnJlYWs7CisKKwkJaWYgKGJ1Zi5ieXRlbnIgIT0gb2Zmc2V0IHx8CisJCSAgICBzdHJuY21wKChjaGFyICopKCZidWYubWFnaWMpLCBCVFJGU19NQUdJQywKKwkJCSAgICBzaXplb2YoYnVmLm1hZ2ljKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoaSA9PSAwKQorCQkJbWVtY3B5KGZzaWQsIGJ1Zi5mc2lkLCBzaXplb2YoZnNpZCkpOworCQllbHNlIGlmIChtZW1jbXAoZnNpZCwgYnVmLmZzaWQsIHNpemVvZihmc2lkKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoYnVmLmdlbmVyYXRpb24gPiB0cmFuc2lkKSB7CisJCQltZW1jcHkoJmJmcy0+c2IsICZidWYsIHNpemVvZihiZnMtPnNiKSk7CisJCQl0cmFuc2lkID0gYnVmLmdlbmVyYXRpb247CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBidHJmc19jaHVua19pdGVtX3NpemUoaW50IG51bV9zdHJpcGVzKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IGJ0cmZzX2NodW5rKSArCisJCXNpemVvZihzdHJ1Y3QgYnRyZnNfc3RyaXBlKSAqIChudW1fc3RyaXBlcyAtIDEpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9wYXRoKHN0cnVjdCBidHJmc19wYXRoICpwYXRoKQoreworCW1lbXNldChwYXRoLCAwLCBzaXplb2YoKnBhdGgpKTsKK30KKworc3RhdGljIGludCBidHJmc19jb21wX2tleXMoY29uc3Qgc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICprMSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBidHJmc19kaXNrX2tleSAqazIpCit7CisJaWYgKGsxLT5vYmplY3RpZCA+IGsyLT5vYmplY3RpZCkKKwkJcmV0dXJuIDE7CisJaWYgKGsxLT5vYmplY3RpZCA8IGsyLT5vYmplY3RpZCkKKwkJcmV0dXJuIC0xOworCWlmIChrMS0+dHlwZSA+IGsyLT50eXBlKQorCQlyZXR1cm4gMTsKKwlpZiAoazEtPnR5cGUgPCBrMi0+dHlwZSkKKwkJcmV0dXJuIC0xOworCWlmIChrMS0+b2Zmc2V0ID4gazItPm9mZnNldCkKKwkJcmV0dXJuIDE7CisJaWYgKGsxLT5vZmZzZXQgPCBrMi0+b2Zmc2V0KQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qIGNvbXBhcmUga2V5cyBidXQgaWdub3JlIG9mZnNldCwgaXMgdXNlZnVsIHRvIGVudW1lcmF0ZSBhbGwgc2FtZSBraW5kIGtleXMgKi8KK3N0YXRpYyBpbnQgYnRyZnNfY29tcF9rZXlzX3R5cGUoY29uc3Qgc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICprMSwKKwkJCQljb25zdCBzdHJ1Y3QgYnRyZnNfZGlza19rZXkgKmsyKQoreworCWlmIChrMS0+b2JqZWN0aWQgPiBrMi0+b2JqZWN0aWQpCisJCXJldHVybiAxOworCWlmIChrMS0+b2JqZWN0aWQgPCBrMi0+b2JqZWN0aWQpCisJCXJldHVybiAtMTsKKwlpZiAoazEtPnR5cGUgPiBrMi0+dHlwZSkKKwkJcmV0dXJuIDE7CisJaWYgKGsxLT50eXBlIDwgazItPnR5cGUpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworLyogc2VhY2ggdHJlZSBkaXJlY3RseSBvbiBkaXNrIC4uLiAqLworc3RhdGljIGludCBzZWFyY2hfdHJlZShzdHJ1Y3QgZnNfaW5mbyAqZnMsIHU2NCBsb2Zmc2V0LAorCQkgICAgICAgc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICprZXksIHN0cnVjdCBidHJmc19wYXRoICpwYXRoKQoreworCXN0cnVjdCBidHJmc19pbmZvICogY29uc3QgYmZzID0gZnMtPmZzX2luZm87CisJdW5pb24gdHJlZV9idWYgKnRyZWVfYnVmID0gYmZzLT50cmVlX2J1ZjsKKwlpbnQgc2xvdCwgcmV0OworCXU2NCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBsb2dpY2FsX3BoeXNpY2FsKGZzLCBsb2Zmc2V0KTsKKwljYWNoZV9yZWFkKGZzLCAmdHJlZV9idWYtPmhlYWRlciwgb2Zmc2V0LCBzaXplb2YodHJlZV9idWYtPmhlYWRlcikpOworCWlmICh0cmVlX2J1Zi0+aGVhZGVyLmxldmVsKSB7CisJCS8qIGlubmVyIG5vZGUgKi8KKwkJY2FjaGVfcmVhZChmcywgKGNoYXIgKikmdHJlZV9idWYtPm5vZGUucHRyc1swXSwKKwkJCSAgIG9mZnNldCArIHNpemVvZiB0cmVlX2J1Zi0+aGVhZGVyLAorCQkJICAgYmZzLT5zYi5ub2Rlc2l6ZSAtIHNpemVvZiB0cmVlX2J1Zi0+aGVhZGVyKTsKKwkJcGF0aC0+aXRlbXNuclt0cmVlX2J1Zi0+aGVhZGVyLmxldmVsXSA9IHRyZWVfYnVmLT5oZWFkZXIubnJpdGVtczsKKwkJcGF0aC0+b2Zmc2V0c1t0cmVlX2J1Zi0+aGVhZGVyLmxldmVsXSA9IGxvZmZzZXQ7CisJCXJldCA9IGJpbl9zZWFyY2goJnRyZWVfYnVmLT5ub2RlLnB0cnNbMF0sCisJCQkJIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5X3B0ciksCisJCQkJIGtleSwgKGNtcF9mdW5jKWJ0cmZzX2NvbXBfa2V5cywKKwkJCQkgcGF0aC0+c2xvdHNbdHJlZV9idWYtPmhlYWRlci5sZXZlbF0sCisJCQkJIHRyZWVfYnVmLT5oZWFkZXIubnJpdGVtcywgJnNsb3QpOworCQlpZiAocmV0ICYmIHNsb3QgPiBwYXRoLT5zbG90c1t0cmVlX2J1Zi0+aGVhZGVyLmxldmVsXSkKKwkJCXNsb3QtLTsKKwkJcGF0aC0+c2xvdHNbdHJlZV9idWYtPmhlYWRlci5sZXZlbF0gPSBzbG90OworCQlyZXQgPSBzZWFyY2hfdHJlZShmcywgdHJlZV9idWYtPm5vZGUucHRyc1tzbG90XS5ibG9ja3B0ciwKKwkJCQkgIGtleSwgcGF0aCk7CisJfSBlbHNlIHsKKwkJLyogbGVhZiBub2RlICovCisJCWNhY2hlX3JlYWQoZnMsIChjaGFyICopJnRyZWVfYnVmLT5sZWFmLml0ZW1zWzBdLAorCQkJICAgb2Zmc2V0ICsgc2l6ZW9mIHRyZWVfYnVmLT5oZWFkZXIsCisJCQkgICBiZnMtPnNiLmxlYWZzaXplIC0gc2l6ZW9mIHRyZWVfYnVmLT5oZWFkZXIpOworCQlwYXRoLT5pdGVtc25yW3RyZWVfYnVmLT5oZWFkZXIubGV2ZWxdID0gdHJlZV9idWYtPmhlYWRlci5ucml0ZW1zOworCQlwYXRoLT5vZmZzZXRzW3RyZWVfYnVmLT5oZWFkZXIubGV2ZWxdID0gbG9mZnNldDsKKwkJcmV0ID0gYmluX3NlYXJjaCgmdHJlZV9idWYtPmxlYWYuaXRlbXNbMF0sCisJCQkJIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSksCisJCQkJIGtleSwgKGNtcF9mdW5jKWJ0cmZzX2NvbXBfa2V5cywKKwkJCQkgcGF0aC0+c2xvdHNbMF0sCisJCQkJIHRyZWVfYnVmLT5oZWFkZXIubnJpdGVtcywgJnNsb3QpOworCQlpZiAocmV0ICYmIHNsb3QgPiBwYXRoLT5zbG90c1t0cmVlX2J1Zi0+aGVhZGVyLmxldmVsXSkKKwkJCXNsb3QtLTsKKwkJcGF0aC0+c2xvdHNbdHJlZV9idWYtPmhlYWRlci5sZXZlbF0gPSBzbG90OworCQlwYXRoLT5pdGVtID0gdHJlZV9idWYtPmxlYWYuaXRlbXNbc2xvdF07CisJCWNhY2hlX3JlYWQoZnMsIChjaGFyICopJnBhdGgtPmRhdGEsCisJCQkgICBvZmZzZXQgKyBzaXplb2YgdHJlZV9idWYtPmhlYWRlciArCisJCQkgICB0cmVlX2J1Zi0+bGVhZi5pdGVtc1tzbG90XS5vZmZzZXQsCisJCQkgICB0cmVlX2J1Zi0+bGVhZi5pdGVtc1tzbG90XS5zaXplKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogcmV0dXJuIDAgaWYgbGVhZiBmb3VuZCAqLworc3RhdGljIGludCBuZXh0X2xlYWYoc3RydWN0IGZzX2luZm8gKmZzLCBzdHJ1Y3QgYnRyZnNfZGlza19rZXkgKmtleSwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpCit7CisJaW50IHNsb3Q7CisJaW50IGxldmVsID0gMTsKKworCXdoaWxlIChsZXZlbCA8IEJUUkZTX01BWF9MRVZFTCkgeworCQlpZiAoIXBhdGgtPml0ZW1zbnJbbGV2ZWxdKSAvKiBubyBtb3JlIG5vZGVzICovCisJCQlyZXR1cm4gMTsKKwkJc2xvdCA9IHBhdGgtPnNsb3RzW2xldmVsXSArIDE7CisJCWlmIChzbG90ID49IHBhdGgtPml0ZW1zbnJbbGV2ZWxdKSB7CisJCQlsZXZlbCsrOworCQkJY29udGludWU7OworCQl9CisJCXBhdGgtPnNsb3RzW2xldmVsXSA9IHNsb3Q7CisJCXBhdGgtPnNsb3RzW2xldmVsLTFdID0gMDsgLyogcmVzZXQgbG93IGxldmVsIHNsb3RzIGluZm8gKi8KKwkJc2VhcmNoX3RyZWUoZnMsIHBhdGgtPm9mZnNldHNbbGV2ZWxdLCBrZXksIHBhdGgpOworCQlicmVhazsKKwl9CisJaWYgKGxldmVsID09IEJUUkZTX01BWF9MRVZFTCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiAwIGlmIHNsb3QgZm91bmQgKi8KK3N0YXRpYyBpbnQgbmV4dF9zbG90KHN0cnVjdCBmc19pbmZvICpmcywgc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICprZXksCisJCSAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpCit7CisJaW50IHNsb3Q7CisKKwlpZiAoIXBhdGgtPml0ZW1zbnJbMF0pCisJCXJldHVybiAxOworCXNsb3QgPSBwYXRoLT5zbG90c1swXSArIDE7CisJaWYgKHNsb3QgPj0gcGF0aC0+aXRlbXNuclswXSkKKwkJcmV0dXJuIDE7CisJcGF0aC0+c2xvdHNbMF0gPSBzbG90OworCXNlYXJjaF90cmVlKGZzLCBwYXRoLT5vZmZzZXRzWzBdLCBrZXksIHBhdGgpOworCXJldHVybiAwOworfQorCisvKgorICogcmVhZCBjaHVua19hcnJheSBpbiBzdXBlciBibG9jaworICovCitzdGF0aWMgdm9pZCBidHJmc19yZWFkX3N5c19jaHVua19hcnJheShzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisJc3RydWN0IGJ0cmZzX2luZm8gKiBjb25zdCBiZnMgPSBmcy0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfY2h1bmtfbWFwX2l0ZW0gaXRlbTsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgKmtleTsKKwlzdHJ1Y3QgYnRyZnNfY2h1bmsgKmNodW5rOworCWludCBjdXI7CisKKwkvKiByZWFkIGNodW5rIGFycmF5IGluIHN1cGVyYmxvY2sgKi8KKwljdXIgPSAwOworCXdoaWxlIChjdXIgPCBiZnMtPnNiLnN5c19jaHVua19hcnJheV9zaXplKSB7CisJCWtleSA9IChzdHJ1Y3QgYnRyZnNfZGlza19rZXkgKikoYmZzLT5zYi5zeXNfY2h1bmtfYXJyYXkgKyBjdXIpOworCQljdXIgKz0gc2l6ZW9mKCprZXkpOworCQljaHVuayA9IChzdHJ1Y3QgYnRyZnNfY2h1bmsgKikoYmZzLT5zYi5zeXNfY2h1bmtfYXJyYXkgKyBjdXIpOworCQljdXIgKz0gYnRyZnNfY2h1bmtfaXRlbV9zaXplKGNodW5rLT5udW1fc3RyaXBlcyk7CisJCS8qIGluc2VydCB0byBtYXBwaW5nIHRhYmxlLCBpZ25vcmUgbXVsdGkgc3RyaXBlcyAqLworCQlpdGVtLmxvZ2ljYWwgPSBrZXktPm9mZnNldDsKKwkJaXRlbS5sZW5ndGggPSBjaHVuay0+bGVuZ3RoOworCQlpdGVtLmRldmlkID0gY2h1bmstPnN0cmlwZS5kZXZpZDsKKwkJaXRlbS5waHlzaWNhbCA9IGNodW5rLT5zdHJpcGUub2Zmc2V0Oy8qaWdub3JlIG90aGVyIHN0cmlwZXMgKi8KKwkJaW5zZXJ0X21hcChmcywgJml0ZW0pOworCX0KK30KKworLyogcmVhZCBjaHVuayBpdGVtcyBmcm9tIGNodW5rX3RyZWUgYW5kIGluc2VydCB0aGVtIHRvIGNodW5rIG1hcCAqLworc3RhdGljIHZvaWQgYnRyZnNfcmVhZF9jaHVua190cmVlKHN0cnVjdCBmc19pbmZvICpmcykKK3sKKwlzdHJ1Y3QgYnRyZnNfaW5mbyAqIGNvbnN0IGJmcyA9IGZzLT5mc19pbmZvOworCXN0cnVjdCBidHJmc19kaXNrX2tleSBzZWFyY2hfa2V5OworCXN0cnVjdCBidHJmc19jaHVuayAqY2h1bms7CisJc3RydWN0IGJ0cmZzX2NodW5rX21hcF9pdGVtIGl0ZW07CisJc3RydWN0IGJ0cmZzX3BhdGggcGF0aDsKKworCWlmICghKGJmcy0+c2IuZmxhZ3MgJiBCVFJGU19TVVBFUl9GTEFHX01FVEFEVU1QKSkgeworCQlpZiAoYmZzLT5zYi5udW1fZGV2aWNlcyA+IDEpCisJCQlwcmludGYoIndhcm5pbmc6IG9ubHkgc3VwcG9ydCBzaW5nbGUgZGV2aWNlIGJ0cmZzXG4iKTsKKwkJLyogcmVhZCBjaHVuayBmcm9tIGNodW5rX3RyZWUgKi8KKwkJc2VhcmNoX2tleS5vYmplY3RpZCA9IEJUUkZTX0ZJUlNUX0NIVU5LX1RSRUVfT0JKRUNUSUQ7CisJCXNlYXJjaF9rZXkudHlwZSA9IEJUUkZTX0NIVU5LX0lURU1fS0VZOworCQlzZWFyY2hfa2V5Lm9mZnNldCA9IDA7CisJCWNsZWFyX3BhdGgoJnBhdGgpOworCQlzZWFyY2hfdHJlZShmcywgYmZzLT5zYi5jaHVua19yb290LCAmc2VhcmNoX2tleSwgJnBhdGgpOworCQlkbyB7CisJCQlkbyB7CisJCQkJaWYgKGJ0cmZzX2NvbXBfa2V5c190eXBlKCZzZWFyY2hfa2V5LAorCQkJCQkJCSZwYXRoLml0ZW0ua2V5KSkKKwkJCQkJYnJlYWs7CisJCQkJY2h1bmsgPSAoc3RydWN0IGJ0cmZzX2NodW5rICopKHBhdGguZGF0YSk7CisJCQkJLyogaW5zZXJ0IHRvIG1hcHBpbmcgdGFibGUsIGlnbm9yZSBzdHJpcGVzICovCisJCQkJaXRlbS5sb2dpY2FsID0gcGF0aC5pdGVtLmtleS5vZmZzZXQ7CisJCQkJaXRlbS5sZW5ndGggPSBjaHVuay0+bGVuZ3RoOworCQkJCWl0ZW0uZGV2aWQgPSBjaHVuay0+c3RyaXBlLmRldmlkOworCQkJCWl0ZW0ucGh5c2ljYWwgPSBjaHVuay0+c3RyaXBlLm9mZnNldDsKKwkJCQlpbnNlcnRfbWFwKGZzLCAmaXRlbSk7CisJCQl9IHdoaWxlICghbmV4dF9zbG90KGZzLCAmc2VhcmNoX2tleSwgJnBhdGgpKTsKKwkJCWlmIChidHJmc19jb21wX2tleXNfdHlwZSgmc2VhcmNoX2tleSwgJnBhdGguaXRlbS5rZXkpKQorCQkJCWJyZWFrOworCQl9IHdoaWxlICghbmV4dF9sZWFmKGZzLCAmc2VhcmNoX2tleSwgJnBhdGgpKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGJ0cmZzX25hbWVfaGFzaChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCXJldHVybiBidHJmc19jcmMzMmMoKHUzMil+MSwgbmFtZSwgbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqYnRyZnNfaWdldF9ieV9pbnIoc3RydWN0IGZzX2luZm8gKmZzLCB1NjQgaW5yKQoreworCXN0cnVjdCBidHJmc19pbmZvICogY29uc3QgYmZzID0gZnMtPmZzX2luZm87CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSBpbm9kZV9pdGVtOworCXN0cnVjdCBidHJmc19kaXNrX2tleSBzZWFyY2hfa2V5OworCXN0cnVjdCBidHJmc19wYXRoIHBhdGg7CisJaW50IHJldDsKKworCS8qIEZJWE1FOiBzb21lIEJUUkZTIGlub2RlIG1lbWJlciBhcmUgdTY0LCB3aGlsZSBvdXIgbG9naWNhbCBpbm9kZQorICAgICAgICAgICBpcyB1MzIsIHdlIG1heSBuZWVkIGNoYW5nZSB0aGVtIHRvIHU2NCBsYXRlciAqLworCXNlYXJjaF9rZXkub2JqZWN0aWQgPSBpbnI7CisJc2VhcmNoX2tleS50eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CisJc2VhcmNoX2tleS5vZmZzZXQgPSAwOworCWNsZWFyX3BhdGgoJnBhdGgpOworCXJldCA9IHNlYXJjaF90cmVlKGZzLCBiZnMtPmZzX3RyZWUsICZzZWFyY2hfa2V5LCAmcGF0aCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIE5VTEw7CisJaW5vZGVfaXRlbSA9ICooc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKilwYXRoLmRhdGE7CisJaWYgKCEoaW5vZGUgPSBhbGxvY19pbm9kZShmcywgaW5yLCBzaXplb2Yoc3RydWN0IGJ0cmZzX3B2dF9pbm9kZSkpKSkKKwkJcmV0dXJuIE5VTEw7CisJaW5vZGUtPmlubyA9IGlucjsKKwlpbm9kZS0+c2l6ZSA9IGlub2RlX2l0ZW0uc2l6ZTsKKwlpbm9kZS0+bW9kZSA9IElGVE9EVChpbm9kZV9pdGVtLm1vZGUpOworCisJaWYgKGlub2RlLT5tb2RlID09IERUX1JFRyB8fCBpbm9kZS0+bW9kZSA9PSBEVF9MTkspIHsKKwkJc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gZXh0ZW50X2l0ZW07CisJCXU2NCBvZmZzZXQ7CisKKwkJLyogZ2V0IGZpbGVfZXh0ZW50X2l0ZW0gKi8KKwkJc2VhcmNoX2tleS50eXBlID0gQlRSRlNfRVhURU5UX0RBVEFfS0VZOworCQlzZWFyY2hfa2V5Lm9mZnNldCA9IDA7CisJCWNsZWFyX3BhdGgoJnBhdGgpOworCQlyZXQgPSBzZWFyY2hfdHJlZShmcywgYmZzLT5mc190cmVlLCAmc2VhcmNoX2tleSwgJnBhdGgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIE5VTEw7IC8qIGltcG9zc2libGUgKi8KKwkJZXh0ZW50X2l0ZW0gPSAqKHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICopcGF0aC5kYXRhOworCQlpZiAoZXh0ZW50X2l0ZW0udHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpLyogaW5saW5lIGZpbGUgKi8KKwkJCW9mZnNldCA9IHBhdGgub2Zmc2V0c1swXSArIHNpemVvZihzdHJ1Y3QgYnRyZnNfaGVhZGVyKQorCQkJCSsgcGF0aC5pdGVtLm9mZnNldAorCQkJCSsgb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sIGRpc2tfYnl0ZW5yKTsKKwkJZWxzZQorCQkJb2Zmc2V0ID0gZXh0ZW50X2l0ZW0uZGlza19ieXRlbnI7CisJCVBWVChpbm9kZSktPm9mZnNldCA9IG9mZnNldDsKKwl9CisJcmV0dXJuIGlub2RlOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpidHJmc19pZ2V0X3Jvb3Qoc3RydWN0IGZzX2luZm8gKmZzKQoreworCS8qIEJUUkZTX0ZJUlNUX0NIVU5LX1RSRUVfT0JKRUNUSUQoMjU2KSBhY3R1YWxseSBpcyBmaXJzdCBPQkpFQ1RJRCBmb3IgRlNfVFJFRSAqLworCXJldHVybiBidHJmc19pZ2V0X2J5X2lucihmcywgQlRSRlNfRklSU1RfQ0hVTktfVFJFRV9PQkpFQ1RJRCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJ0cmZzX2lnZXQoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGlub2RlICpwYXJlbnQpCit7CisJc3RydWN0IGZzX2luZm8gKiBjb25zdCBmcyA9IHBhcmVudC0+ZnM7CisJc3RydWN0IGJ0cmZzX2luZm8gKiBjb25zdCBiZnMgPSBmcy0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgc2VhcmNoX2tleTsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCBwYXRoOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSBkaXJfaXRlbTsKKwlpbnQgcmV0OworCisJc2VhcmNoX2tleS5vYmplY3RpZCA9IHBhcmVudC0+aW5vOworCXNlYXJjaF9rZXkudHlwZSA9IEJUUkZTX0RJUl9JVEVNX0tFWTsKKwlzZWFyY2hfa2V5Lm9mZnNldCA9IGJ0cmZzX25hbWVfaGFzaChuYW1lLCBzdHJsZW4obmFtZSkpOworCWNsZWFyX3BhdGgoJnBhdGgpOworCXJldCA9IHNlYXJjaF90cmVlKGZzLCBiZnMtPmZzX3RyZWUsICZzZWFyY2hfa2V5LCAmcGF0aCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIE5VTEw7CisJZGlyX2l0ZW0gPSAqKHN0cnVjdCBidHJmc19kaXJfaXRlbSAqKXBhdGguZGF0YTsKKworCXJldHVybiBidHJmc19pZ2V0X2J5X2lucihmcywgZGlyX2l0ZW0ubG9jYXRpb24ub2JqZWN0aWQpOworfQorCitzdGF0aWMgaW50IGJ0cmZzX3JlYWRsaW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZikKK3sKKwljYWNoZV9yZWFkKGlub2RlLT5mcywgYnVmLAorCQkgICBsb2dpY2FsX3BoeXNpY2FsKGlub2RlLT5mcywgUFZUKGlub2RlKS0+b2Zmc2V0KSwKKwkJICAgaW5vZGUtPnNpemUpOworCWJ1Zltpbm9kZS0+c2l6ZV0gPSAnXDAnOworCXJldHVybiBpbm9kZS0+c2l6ZTsKK30KKworc3RhdGljIGludCBidHJmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyZW50ICpkaXJlbnQpCit7CisJc3RydWN0IGZzX2luZm8gKiBjb25zdCBmcyA9IGZpbGUtPmZzOworCXN0cnVjdCBidHJmc19pbmZvICogY29uc3QgYmZzID0gZnMtPmZzX2luZm87CisJc3RydWN0IGlub2RlICogY29uc3QgaW5vZGUgPSBmaWxlLT5pbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgc2VhcmNoX2tleTsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCBwYXRoOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGlyX2l0ZW07CisJaW50IHJldDsKKworCS8qCisJICogd2UgdXNlIGZpbGUtPm9mZnNldCB0byBzdG9yZSBsYXN0IHNlYXJjaCBrZXkub2Zmc2V0LCB3aWxsIHdpbGwgc2VhcmNoCisJICoga2V5IHRoYXQgbG93ZXIgdGhhdCBvZmZzZXQsIDAgbWVhbnMgZmlyc3Qgc2VhcmNoIGFuZCB3ZSB3aWxsIHNlYXJjaAorICAgICAgICAgKiAtMVVMLCB3aGljaCBpcyB0aGUgYmlnZ2VzdCBwb3NzaWJsZSBrZXkKKyAgICAgICAgICovCisJc2VhcmNoX2tleS5vYmplY3RpZCA9IGlub2RlLT5pbm87CisJc2VhcmNoX2tleS50eXBlID0gQlRSRlNfRElSX0lURU1fS0VZOworCXNlYXJjaF9rZXkub2Zmc2V0ID0gZmlsZS0+b2Zmc2V0IC0gMTsKKwljbGVhcl9wYXRoKCZwYXRoKTsKKwlyZXQgPSBzZWFyY2hfdHJlZShmcywgYmZzLT5mc190cmVlLCAmc2VhcmNoX2tleSwgJnBhdGgpOworCisJaWYgKHJldCkgeworCQlpZiAoYnRyZnNfY29tcF9rZXlzX3R5cGUoJnNlYXJjaF9rZXksICZwYXRoLml0ZW0ua2V5KSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlkaXJfaXRlbSA9IChzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKilwYXRoLmRhdGE7CisJZmlsZS0+b2Zmc2V0ID0gcGF0aC5pdGVtLmtleS5vZmZzZXQ7CisJZGlyZW50LT5kX2lubyA9IGRpcl9pdGVtLT5sb2NhdGlvbi5vYmplY3RpZDsKKwlkaXJlbnQtPmRfb2ZmID0gZmlsZS0+b2Zmc2V0OworCWRpcmVudC0+ZF9yZWNsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgZGlyZW50LCBkX25hbWUpCisJCSsgZGlyX2l0ZW0tPm5hbWVfbGVuICsgMTsKKwlkaXJlbnQtPmRfdHlwZSA9IElGVE9EVChkaXJfaXRlbS0+dHlwZSk7CisJbWVtY3B5KGRpcmVudC0+ZF9uYW1lLCBkaXJfaXRlbSArIDEsIGRpcl9pdGVtLT5uYW1lX2xlbik7CisJZGlyZW50LT5kX25hbWVbZGlyX2l0ZW0tPm5hbWVfbGVuXSA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHJmc19uZXh0X2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1aW50MzJfdCBsc3RhcnQpCit7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IHNlYXJjaF9rZXk7CisJc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gZXh0ZW50X2l0ZW07CisJc3RydWN0IGJ0cmZzX3BhdGggcGF0aDsKKwlpbnQgcmV0OworCXU2NCBvZmZzZXQ7CisJc3RydWN0IGZzX2luZm8gKiBjb25zdCBmcyA9IGlub2RlLT5mczsKKwlzdHJ1Y3QgYnRyZnNfaW5mbyAqIGNvbnN0IGJmcyA9IGZzLT5mc19pbmZvOworCXUzMiBzZWNfc2hpZnQgPSBTRUNUT1JfU0hJRlQoZnMpOworCXUzMiBzZWNfc2l6ZSA9IFNFQ1RPUl9TSVpFKGZzKTsKKworCXNlYXJjaF9rZXkub2JqZWN0aWQgPSBpbm9kZS0+aW5vOworCXNlYXJjaF9rZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWTsKKwlzZWFyY2hfa2V5Lm9mZnNldCA9IGxzdGFydCA8PCBzZWNfc2hpZnQ7CisJY2xlYXJfcGF0aCgmcGF0aCk7CisJcmV0ID0gc2VhcmNoX3RyZWUoZnMsIGJmcy0+ZnNfdHJlZSwgJnNlYXJjaF9rZXksICZwYXRoKTsKKwlpZiAocmV0KSB7IC8qIGltcG9zc2libGUgKi8KKwkJcHJpbnRmKCJidHJmczogc2VhcmNoIGV4dGVudCBkYXRhIGVycm9yIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJZXh0ZW50X2l0ZW0gPSAqKHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICopcGF0aC5kYXRhOworCisJaWYgKGV4dGVudF9pdGVtLmVuY3J5cHRpb24pIHsKKwkgICAgcHJpbnRmKCJidHJmczogZm91bmQgZW5jcnlwdGVkIGRhdGEsIGNhbm5vdCBjb250aW51ZSFcbiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWlmIChleHRlbnRfaXRlbS5jb21wcmVzc2lvbikgeworCSAgICBwcmludGYoImJ0cmZzOiBmb3VuZCBjb21wcmVzc2VkIGRhdGEsIGNhbm5vdCBjb250aW51ZSFcbiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCisJaWYgKGV4dGVudF9pdGVtLnR5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7LyogaW5saW5lIGZpbGUgKi8KKwkJLyogd2UgZmFrZSBhIGV4dGVudCBoZXJlLCBhbmQgUFZUIG9mIGlub2RlIHdpbGwgdGVsbCB1cyAqLworCQlvZmZzZXQgPSBwYXRoLm9mZnNldHNbMF0gKyBzaXplb2Yoc3RydWN0IGJ0cmZzX2hlYWRlcikKKwkJCSsgcGF0aC5pdGVtLm9mZnNldAorCQkJKyBvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSwgZGlza19ieXRlbnIpOworCQlpbm9kZS0+bmV4dF9leHRlbnQubGVuID0KKwkJCShpbm9kZS0+c2l6ZSArIHNlY19zaXplIC0xKSA+PiBzZWNfc2hpZnQ7CisJfSBlbHNlIHsKKwkJb2Zmc2V0ID0gZXh0ZW50X2l0ZW0uZGlza19ieXRlbnIgKyBleHRlbnRfaXRlbS5vZmZzZXQ7CisJCWlub2RlLT5uZXh0X2V4dGVudC5sZW4gPQorCQkJKGV4dGVudF9pdGVtLm51bV9ieXRlcyArIHNlY19zaXplIC0gMSkgPj4gc2VjX3NoaWZ0OworCX0KKwlpbm9kZS0+bmV4dF9leHRlbnQucHN0YXJ0ID0gbG9naWNhbF9waHlzaWNhbChmcywgb2Zmc2V0KSA+PiBzZWNfc2hpZnQ7CisJUFZUKGlub2RlKS0+b2Zmc2V0ID0gb2Zmc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgYnRyZnNfZ2V0ZnNzZWMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwgaW50IHNlY3RvcnMsCisJCQkJCWJvb2wgKmhhdmVfbW9yZSkKK3sKKwl1MzIgcmV0OworCXN0cnVjdCBmc19pbmZvICpmcyA9IGZpbGUtPmZzOworCXUzMiBvZmYgPSBQVlQoZmlsZS0+aW5vZGUpLT5vZmZzZXQgJSBTRUNUT1JfU0laRShmcyk7CisJYm9vbCBoYW5kbGVfaW5saW5lID0gZmFsc2U7CisKKwlpZiAob2ZmICYmICFmaWxlLT5vZmZzZXQpIHsvKiBpbmxpbmUgZmlsZSBmaXJzdCByZWFkIHBhdGNoICovCisJCWZpbGUtPmlub2RlLT5zaXplICs9IG9mZjsKKwkJaGFuZGxlX2lubGluZSA9IHRydWU7CisJfQorCXJldCA9IGdlbmVyaWNfZ2V0ZnNzZWMoZmlsZSwgYnVmLCBzZWN0b3JzLCBoYXZlX21vcmUpOworCWlmICghcmV0KQorCQlyZXR1cm4gcmV0OworCW9mZiA9IFBWVChmaWxlLT5pbm9kZSktPm9mZnNldCAlIFNFQ1RPUl9TSVpFKGZzKTsKKwlpZiAoaGFuZGxlX2lubGluZSkgey8qIGlubGluZSBmaWxlIHBhdGNoICovCisJCXJldCAtPSBvZmY7CisJCW1lbWNweShidWYsIGJ1ZiArIG9mZiwgcmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYnRyZnNfZ2V0X2ZzX3RyZWUoc3RydWN0IGZzX2luZm8gKmZzKQoreworCXN0cnVjdCBidHJmc19pbmZvICogY29uc3QgYmZzID0gZnMtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IHNlYXJjaF9rZXk7CisJc3RydWN0IGJ0cmZzX3BhdGggcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICp0cmVlOworCWJvb2wgc3Vidm9sX29rID0gZmFsc2U7CisKKwkvKiBjaGVjayBpZiBzdWJ2b2wgaXMgZmlsbGVkIGJ5IGluc3RhbGxlciAqLworCWlmICgqU3Vidm9sTmFtZSkgeworCQlzZWFyY2hfa2V5Lm9iamVjdGlkID0gQlRSRlNfRlNfVFJFRV9PQkpFQ1RJRDsKKwkJc2VhcmNoX2tleS50eXBlID0gQlRSRlNfUk9PVF9SRUZfS0VZOworCQlzZWFyY2hfa2V5Lm9mZnNldCA9IDA7CisJCWNsZWFyX3BhdGgoJnBhdGgpOworCQlpZiAoc2VhcmNoX3RyZWUoZnMsIGJmcy0+c2Iucm9vdCwgJnNlYXJjaF9rZXksICZwYXRoKSkKKwkJCW5leHRfc2xvdChmcywgJnNlYXJjaF9rZXksICZwYXRoKTsKKwkJZG8geworCQkJZG8geworCQkJCXN0cnVjdCBidHJmc19yb290X3JlZiAqcmVmOworCQkJCWludCBwYXRobGVuOworCisJCQkJaWYgKGJ0cmZzX2NvbXBfa2V5c190eXBlKCZzZWFyY2hfa2V5LAorCQkJCQkJCSZwYXRoLml0ZW0ua2V5KSkKKwkJCQkJYnJlYWs7CisJCQkJcmVmID0gKHN0cnVjdCBidHJmc19yb290X3JlZiAqKXBhdGguZGF0YTsKKwkJCQlwYXRobGVuID0gcGF0aC5pdGVtLnNpemUgLSBzaXplb2Yoc3RydWN0IGJ0cmZzX3Jvb3RfcmVmKTsKKworCQkJCWlmICghc3RybmNtcCgoY2hhciopKHJlZiArIDEpLCBTdWJ2b2xOYW1lLCBwYXRobGVuKSkgeworCQkJCQlzdWJ2b2xfb2sgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IHdoaWxlICghbmV4dF9zbG90KGZzLCAmc2VhcmNoX2tleSwgJnBhdGgpKTsKKwkJCWlmIChzdWJ2b2xfb2spCisJCQkJYnJlYWs7CisJCQlpZiAoYnRyZnNfY29tcF9rZXlzX3R5cGUoJnNlYXJjaF9rZXksICZwYXRoLml0ZW0ua2V5KSkKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoIW5leHRfbGVhZihmcywgJnNlYXJjaF9rZXksICZwYXRoKSk7CisJCWlmICghc3Vidm9sX29rKSAvKiBzaG91bGQgYmUgaW1wb3NzaWJsZSAqLworCQkJcHJpbnRmKCJubyBzdWJ2b2wgZm91bmQhXG4iKTsKKwl9CisJLyogZmluZCBmc190cmVlIGZyb20gdHJlZV9yb290ICovCisJaWYgKHN1YnZvbF9vaykKKwkJc2VhcmNoX2tleS5vYmplY3RpZCA9IHBhdGguaXRlbS5rZXkub2Zmc2V0OworCWVsc2UgLyogImRlZmF1bHQiIHZvbHVtZSAqLworCQlzZWFyY2hfa2V5Lm9iamVjdGlkID0gQlRSRlNfRlNfVFJFRV9PQkpFQ1RJRDsKKwlzZWFyY2hfa2V5LnR5cGUgPSBCVFJGU19ST09UX0lURU1fS0VZOworCXNlYXJjaF9rZXkub2Zmc2V0ID0gLTE7CisJY2xlYXJfcGF0aCgmcGF0aCk7CisJc2VhcmNoX3RyZWUoZnMsIGJmcy0+c2Iucm9vdCwgJnNlYXJjaF9rZXksICZwYXRoKTsKKwl0cmVlID0gKHN0cnVjdCBidHJmc19yb290X2l0ZW0gKilwYXRoLmRhdGE7CisJYmZzLT5mc190cmVlID0gdHJlZS0+Ynl0ZW5yOworfQorCisvKiBpbml0LiB0aGUgZnMgbWV0YSBkYXRhLCByZXR1cm4gdGhlIGJsb2NrIHNpemUgc2hpZnQgYml0cy4gKi8KK3N0YXRpYyBpbnQgYnRyZnNfZnNfaW5pdChzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisJc3RydWN0IGRpc2sgKmRpc2sgPSBmcy0+ZnNfZGV2LT5kaXNrOworCXN0cnVjdCBidHJmc19pbmZvICpiZnM7CisKKwlidHJmc19pbml0X2NyYzMyYygpOworICAgIAorCWJmcyA9IHphbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX2luZm8pKTsKKwlpZiAoIWJmcykKKwkJcmV0dXJuIC0xOworCisJZnMtPmZzX2luZm8gPSBiZnM7CisKKwlmcy0+c2VjdG9yX3NoaWZ0ID0gZGlzay0+c2VjdG9yX3NoaWZ0OworCWZzLT5zZWN0b3Jfc2l6ZSAgPSAxIDw8IGZzLT5zZWN0b3Jfc2hpZnQ7CisJZnMtPmJsb2NrX3NoaWZ0ICA9IEJUUkZTX0JMT0NLX1NISUZUOworCWZzLT5ibG9ja19zaXplICAgPSAxIDw8IGZzLT5ibG9ja19zaGlmdDsKKworCS8qIEluaXRpYWxpemUgdGhlIGJsb2NrIGNhY2hlICovCisJY2FjaGVfaW5pdChmcy0+ZnNfZGV2LCBmcy0+YmxvY2tfc2hpZnQpOworCisJYnRyZnNfcmVhZF9zdXBlcl9ibG9jayhmcyk7CisJaWYgKGJmcy0+c2IubWFnaWMgIT0gQlRSRlNfTUFHSUNfTikKKwkJcmV0dXJuIC0xOworCWJmcy0+dHJlZV9idWYgPSBtYWxsb2MobWF4KGJmcy0+c2Iubm9kZXNpemUsIGJmcy0+c2IubGVhZnNpemUpKTsKKwlpZiAoIWJmcy0+dHJlZV9idWYpCisJCXJldHVybiAtMTsKKwlidHJmc19yZWFkX3N5c19jaHVua19hcnJheShmcyk7CisJYnRyZnNfcmVhZF9jaHVua190cmVlKGZzKTsKKwlidHJmc19nZXRfZnNfdHJlZShmcyk7CisKKwlyZXR1cm4gZnMtPmJsb2NrX3NoaWZ0OworfQorCitjb25zdCBzdHJ1Y3QgZnNfb3BzIGJ0cmZzX2ZzX29wcyA9IHsKKyAgICAuZnNfbmFtZSAgICAgICA9ICJidHJmcyIsCisgICAgLmZzX2ZsYWdzICAgICAgPSAwLAorICAgIC5mc19pbml0ICAgICAgID0gYnRyZnNfZnNfaW5pdCwKKyAgICAuaWdldF9yb290ICAgICA9IGJ0cmZzX2lnZXRfcm9vdCwKKyAgICAuaWdldCAgICAgICAgICA9IGJ0cmZzX2lnZXQsCisgICAgLnJlYWRsaW5rICAgICAgPSBidHJmc19yZWFkbGluaywKKyAgICAuZ2V0ZnNzZWMgICAgICA9IGJ0cmZzX2dldGZzc2VjLAorICAgIC5jbG9zZV9maWxlICAgID0gZ2VuZXJpY19jbG9zZV9maWxlLAorICAgIC5tYW5nbGVfbmFtZSAgID0gZ2VuZXJpY19tYW5nbGVfbmFtZSwKKyAgICAubmV4dF9leHRlbnQgICA9IGJ0cmZzX25leHRfZXh0ZW50LAorICAgIC5yZWFkZGlyICAgICAgID0gYnRyZnNfcmVhZGRpciwKKyAgICAuY2hkaXJfc3RhcnQgICA9IGdlbmVyaWNfY2hkaXJfc3RhcnQsCisgICAgLm9wZW5fY29uZmlnICAgPSBnZW5lcmljX29wZW5fY29uZmlnLAorICAgIC5mc191dWlkICAgICAgID0gTlVMTCwKK307CmRpZmYgLS1naXQgYS9jb3JlL2ZzL2J0cmZzL2J0cmZzLmggYi9jb3JlL2ZzL2J0cmZzL2J0cmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2OGU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvYnRyZnMvYnRyZnMuaApAQCAtMCwwICsxLDI5NSBAQAorI2lmbmRlZiBfQlRSRlNfSF8KKyNkZWZpbmUgX0JUUkZTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx6Y29uZi5oPgorCit0eXBlZGVmIHVpbnQ4X3QgdTg7Cit0eXBlZGVmIHVpbnQxNl90IHUxNjsKK3R5cGVkZWYgdWludDMyX3QgdTMyOwordHlwZWRlZiB1aW50NjRfdCB1NjQ7CisvKiB0eXBlIHRoYXQgc3RvcmUgb24gZGlzaywgYnV0IGl0IGlzIHNhbWUgYXMgY3B1IHR5cGUgZm9yIGkzODYgYXJjaCAqLwordHlwZWRlZiB1MTYgX19sZTE2OwordHlwZWRlZiB1MzIgX19sZTMyOwordHlwZWRlZiB1NjQgX19sZTY0OworCisjaW5jbHVkZSAiY3JjMzJjLmgiCisjZGVmaW5lIGJ0cmZzX2NyYzMyYyBjcmMzMmNfbGUKKworI2RlZmluZSBCVFJGU19TVVBFUl9JTkZPX09GRlNFVCAoNjQgKiAxMDI0KQorI2RlZmluZSBCVFJGU19TVVBFUl9JTkZPX1NJWkUgNDA5NgorI2RlZmluZSBCVFJGU19NQVhfTEVBRl9TSVpFIDQwOTYKKyNkZWZpbmUgQlRSRlNfQkxPQ0tfU0hJRlQgMTIKKyNkZWZpbmUgQlRSRlNfQkxPQ0tfU0laRSAgKDEgPDwgQlRSRlNfQkxPQ0tfU0hJRlQpCisKKyNkZWZpbmUgQlRSRlNfU1VQRVJfTUlSUk9SX01BWCAgIDMKKyNkZWZpbmUgQlRSRlNfU1VQRVJfTUlSUk9SX1NISUZUIDEyCisjZGVmaW5lIEJUUkZTX0NTVU1fU0laRSAzMgorI2RlZmluZSBCVFJGU19GU0lEX1NJWkUgMTYKKyNkZWZpbmUgQlRSRlNfTEFCRUxfU0laRSAyNTYKKyNkZWZpbmUgQlRSRlNfU1lTVEVNX0NIVU5LX0FSUkFZX1NJWkUgMjA0OAorI2RlZmluZSBCVFJGU19VVUlEX1NJWkUgMTYKKworI2RlZmluZSBCVFJGU19NQUdJQyAiX0JIUmZTX00iCisjZGVmaW5lIEJUUkZTX01BR0lDX0wgOAorI2RlZmluZSBCVFJGU19NQUdJQ19OIDB4NGQ1ZjUzNjY1MjQ4NDI1ZgorCisjZGVmaW5lIEJUUkZTX1NVUEVSX0ZMQUdfTUVUQURVTVAJKDFVTEwgPDwgMzMpCisKKyNkZWZpbmUgQlRSRlNfREVWX0lURU1fS0VZCTIxNgorI2RlZmluZSBCVFJGU19DSFVOS19JVEVNX0tFWQkyMjgKKyNkZWZpbmUgQlRSRlNfUk9PVF9SRUZfS0VZCTE1NgorI2RlZmluZSBCVFJGU19ST09UX0lURU1fS0VZCTEzMgorI2RlZmluZSBCVFJGU19FWFRFTlRfREFUQV9LRVkJMTA4CisjZGVmaW5lIEJUUkZTX0RJUl9JVEVNX0tFWQk4NAorI2RlZmluZSBCVFJGU19JTk9ERV9JVEVNX0tFWQkxCisKKyNkZWZpbmUgQlRSRlNfRVhURU5UX1RSRUVfT0JKRUNUSUQgMlVMTAorI2RlZmluZSBCVFJGU19GU19UUkVFX09CSkVDVElEIDVVTEwKKworI2RlZmluZSBCVFJGU19GSVJTVF9DSFVOS19UUkVFX09CSkVDVElEIDI1NlVMTAorCisjZGVmaW5lIEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSAwCisjZGVmaW5lIEJUUkZTX0ZJTEVfRVhURU5UX1JFRyAxCisjZGVmaW5lIEJUUkZTX0ZJTEVfRVhURU5UX1BSRUFMTE9DIDIKKworI2RlZmluZSBCVFJGU19NQVhfTEVWRUwgOAorI2RlZmluZSBCVFJGU19NQVhfQ0hVTktfRU5UUklFUyAyNTYKKworI2RlZmluZSBCVFJGU19GVF9SRUdfRklMRQkxCisjZGVmaW5lIEJUUkZTX0ZUX0RJUgkJMgorI2RlZmluZSBCVFJGU19GVF9TWU1MSU5LCTcKKworI2RlZmluZSBST09UX0RJUl9XT1JEIDB4MDAyZgorCitzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0geworCV9fbGU2NCBkZXZpZDsKKwlfX2xlNjQgdG90YWxfYnl0ZXM7CisJX19sZTY0IGJ5dGVzX3VzZWQ7CisJX19sZTMyIGlvX2FsaWduOworCV9fbGUzMiBpb193aWR0aDsKKwlfX2xlMzIgc2VjdG9yX3NpemU7CisJX19sZTY0IHR5cGU7CisJX19sZTY0IGdlbmVyYXRpb247CisJX19sZTY0IHN0YXJ0X29mZnNldDsKKwlfX2xlMzIgZGV2X2dyb3VwOworCXU4IHNlZWtfc3BlZWQ7CisJdTggYmFuZHdpZHRoOworCXU4IHV1aWRbQlRSRlNfVVVJRF9TSVpFXTsKKwl1OCBmc2lkW0JUUkZTX1VVSURfU0laRV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19zdXBlcl9ibG9jayB7CisJdTggY3N1bVtCVFJGU19DU1VNX1NJWkVdOworCS8qIHRoZSBmaXJzdCAzIGZpZWxkcyBtdXN0IG1hdGNoIHN0cnVjdCBidHJmc19oZWFkZXIgKi8KKwl1OCBmc2lkW0JUUkZTX0ZTSURfU0laRV07ICAgIC8qIEZTIHNwZWNpZmljIHV1aWQgKi8KKwlfX2xlNjQgYnl0ZW5yOyAvKiB0aGlzIGJsb2NrIG51bWJlciAqLworCV9fbGU2NCBmbGFnczsKKworCS8qIGFsbG93ZWQgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIGJ0cmZzX2hlYWRlciBmcm9tIGhlcmUgb3duIGRvd24gKi8KKwlfX2xlNjQgbWFnaWM7CisJX19sZTY0IGdlbmVyYXRpb247CisJX19sZTY0IHJvb3Q7CisJX19sZTY0IGNodW5rX3Jvb3Q7CisJX19sZTY0IGxvZ19yb290OworCisJLyogdGhpcyB3aWxsIGhlbHAgZmluZCB0aGUgbmV3IHN1cGVyIGJhc2VkIG9uIHRoZSBsb2cgcm9vdCAqLworCV9fbGU2NCBsb2dfcm9vdF90cmFuc2lkOworCV9fbGU2NCB0b3RhbF9ieXRlczsKKwlfX2xlNjQgYnl0ZXNfdXNlZDsKKwlfX2xlNjQgcm9vdF9kaXJfb2JqZWN0aWQ7CisJX19sZTY0IG51bV9kZXZpY2VzOworCV9fbGUzMiBzZWN0b3JzaXplOworCV9fbGUzMiBub2Rlc2l6ZTsKKwlfX2xlMzIgbGVhZnNpemU7CisJX19sZTMyIHN0cmlwZXNpemU7CisJX19sZTMyIHN5c19jaHVua19hcnJheV9zaXplOworCV9fbGU2NCBjaHVua19yb290X2dlbmVyYXRpb247CisJX19sZTY0IGNvbXBhdF9mbGFnczsKKwlfX2xlNjQgY29tcGF0X3JvX2ZsYWdzOworCV9fbGU2NCBpbmNvbXBhdF9mbGFnczsKKwlfX2xlMTYgY3N1bV90eXBlOworCXU4IHJvb3RfbGV2ZWw7CisJdTggY2h1bmtfcm9vdF9sZXZlbDsKKwl1OCBsb2dfcm9vdF9sZXZlbDsKKwlzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0gZGV2X2l0ZW07CisKKwljaGFyIGxhYmVsW0JUUkZTX0xBQkVMX1NJWkVdOworCisJLyogZnV0dXJlIGV4cGFuc2lvbiAqLworCV9fbGU2NCByZXNlcnZlZFszMl07CisJdTggc3lzX2NodW5rX2FycmF5W0JUUkZTX1NZU1RFTV9DSFVOS19BUlJBWV9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IHsKKwlfX2xlNjQgb2JqZWN0aWQ7CisJdTggdHlwZTsKKwlfX2xlNjQgb2Zmc2V0OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgYnRyZnNfc3RyaXBlIHsKKwlfX2xlNjQgZGV2aWQ7CisJX19sZTY0IG9mZnNldDsKKwl1OCBkZXZfdXVpZFtCVFJGU19VVUlEX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgYnRyZnNfY2h1bmsgeworCV9fbGU2NCBsZW5ndGg7CisJX19sZTY0IG93bmVyOworCV9fbGU2NCBzdHJpcGVfbGVuOworCV9fbGU2NCB0eXBlOworCV9fbGUzMiBpb19hbGlnbjsKKwlfX2xlMzIgaW9fd2lkdGg7CisJX19sZTMyIHNlY3Rvcl9zaXplOworCV9fbGUxNiBudW1fc3RyaXBlczsKKwlfX2xlMTYgc3ViX3N0cmlwZXM7CisJc3RydWN0IGJ0cmZzX3N0cmlwZSBzdHJpcGU7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19oZWFkZXIgeworCS8qIHRoZXNlIGZpcnN0IGZvdXIgbXVzdCBtYXRjaCB0aGUgc3VwZXIgYmxvY2sgKi8KKwl1OCBjc3VtW0JUUkZTX0NTVU1fU0laRV07CisJdTggZnNpZFtCVFJGU19GU0lEX1NJWkVdOyAvKiBGUyBzcGVjaWZpYyB1dWlkICovCisJX19sZTY0IGJ5dGVucjsgLyogd2hpY2ggYmxvY2sgdGhpcyBub2RlIGlzIHN1cHBvc2VkIHRvIGxpdmUgaW4gKi8KKwlfX2xlNjQgZmxhZ3M7CisKKwkvKiBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBzdXBlciBmcm9tIGhlcmUgb24gZG93biAqLworCXU4IGNodW5rX3RyZWVfdXVpZFtCVFJGU19VVUlEX1NJWkVdOworCV9fbGU2NCBnZW5lcmF0aW9uOworCV9fbGU2NCBvd25lcjsKKwlfX2xlMzIgbnJpdGVtczsKKwl1OCBsZXZlbDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX2l0ZW0geworCXN0cnVjdCBidHJmc19kaXNrX2tleSBrZXk7CisJX19sZTMyIG9mZnNldDsKKwlfX2xlMzIgc2l6ZTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX2xlYWYgeworCXN0cnVjdCBidHJmc19oZWFkZXIgaGVhZGVyOworCXN0cnVjdCBidHJmc19pdGVtIGl0ZW1zW107Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19rZXlfcHRyIHsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkga2V5OworCV9fbGU2NCBibG9ja3B0cjsKKwlfX2xlNjQgZ2VuZXJhdGlvbjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX25vZGUgeworCXN0cnVjdCBidHJmc19oZWFkZXIgaGVhZGVyOworCXN0cnVjdCBidHJmc19rZXlfcHRyIHB0cnNbXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworLyogcmVtZW1iZXIgaG93IHdlIGdldCB0byBhIG5vZGUvbGVhZiAqLworc3RydWN0IGJ0cmZzX3BhdGggeworCXU2NCBvZmZzZXRzW0JUUkZTX01BWF9MRVZFTF07CisJaW50IGl0ZW1zbnJbQlRSRlNfTUFYX0xFVkVMXTsKKwlpbnQgc2xvdHNbQlRSRlNfTUFYX0xFVkVMXTsKKwkvKiByZW1lbWJlciBsYXN0IHNsb3QncyBpdGVtIGFuZCBkYXRhICovCisJc3RydWN0IGJ0cmZzX2l0ZW0gaXRlbTsKKwl1OCBkYXRhW0JUUkZTX01BWF9MRUFGX1NJWkVdOworfTsKKworLyogc3RvcmUgbG9naWNhbCBvZmZzZXQgdG8gcGh5c2ljYWwgb2Zmc2V0IG1hcHBpbmcgKi8KK3N0cnVjdCBidHJmc19jaHVua19tYXBfaXRlbSB7CisJdTY0IGxvZ2ljYWw7CisJdTY0IGxlbmd0aDsKKwl1NjQgZGV2aWQ7CisJdTY0IHBoeXNpY2FsOworfTsKKworc3RydWN0IGJ0cmZzX2NodW5rX21hcCB7CisJc3RydWN0IGJ0cmZzX2NodW5rX21hcF9pdGVtICptYXA7CisJdTMyIG1hcF9sZW5ndGg7CisJdTMyIGN1cl9sZW5ndGg7Cit9OworCitzdHJ1Y3QgYnRyZnNfdGltZXNwZWMgeworCV9fbGU2NCBzZWM7CisJX19sZTMyIG5zZWM7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19pbm9kZV9pdGVtIHsKKwkvKiBuZnMgc3R5bGUgZ2VuZXJhdGlvbiBudW1iZXIgKi8KKwlfX2xlNjQgZ2VuZXJhdGlvbjsKKwkvKiB0cmFuc2lkIHRoYXQgbGFzdCB0b3VjaGVkIHRoaXMgaW5vZGUgKi8KKwlfX2xlNjQgdHJhbnNpZDsKKwlfX2xlNjQgc2l6ZTsKKwlfX2xlNjQgbmJ5dGVzOworCV9fbGU2NCBibG9ja19ncm91cDsKKwlfX2xlMzIgbmxpbms7CisJX19sZTMyIHVpZDsKKwlfX2xlMzIgZ2lkOworCV9fbGUzMiBtb2RlOworCV9fbGU2NCByZGV2OworCV9fbGU2NCBmbGFnczsKKworCS8qIG1vZGlmaWNhdGlvbiBzZXF1ZW5jZSBudW1iZXIgZm9yIE5GUyAqLworCV9fbGU2NCBzZXF1ZW5jZTsKKworCS8qCisJICogYSBsaXR0bGUgZnV0dXJlIGV4cGFuc2lvbiwgZm9yIG1vcmUgdGhhbiB0aGlzIHdlIGNhbgorCSAqIGp1c3QgZ3JvdyB0aGUgaW5vZGUgaXRlbSBhbmQgdmVyc2lvbiBpdAorCSAqLworCV9fbGU2NCByZXNlcnZlZFs0XTsKKwlzdHJ1Y3QgYnRyZnNfdGltZXNwZWMgYXRpbWU7CisJc3RydWN0IGJ0cmZzX3RpbWVzcGVjIGN0aW1lOworCXN0cnVjdCBidHJmc190aW1lc3BlYyBtdGltZTsKKwlzdHJ1Y3QgYnRyZnNfdGltZXNwZWMgb3RpbWU7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19yb290X2l0ZW0geworCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtIGlub2RlOworCV9fbGU2NCBnZW5lcmF0aW9uOworCV9fbGU2NCByb290X2RpcmlkOworCV9fbGU2NCBieXRlbnI7CisJX19sZTY0IGJ5dGVfbGltaXQ7CisJX19sZTY0IGJ5dGVzX3VzZWQ7CisJX19sZTY0IGxhc3Rfc25hcHNob3Q7CisJX19sZTY0IGZsYWdzOworCV9fbGUzMiByZWZzOworCXN0cnVjdCBidHJmc19kaXNrX2tleSBkcm9wX3Byb2dyZXNzOworCXU4IGRyb3BfbGV2ZWw7CisJdTggbGV2ZWw7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19kaXJfaXRlbSB7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGxvY2F0aW9uOworCV9fbGU2NCB0cmFuc2lkOworCV9fbGUxNiBkYXRhX2xlbjsKKwlfX2xlMTYgbmFtZV9sZW47CisJdTggdHlwZTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0geworCV9fbGU2NCBnZW5lcmF0aW9uOworCV9fbGU2NCByYW1fYnl0ZXM7CisJdTggY29tcHJlc3Npb247CisJdTggZW5jcnlwdGlvbjsKKwlfX2xlMTYgb3RoZXJfZW5jb2Rpbmc7IC8qIHNwYXJlIGZvciBsYXRlciB1c2UgKi8KKwl1OCB0eXBlOworCV9fbGU2NCBkaXNrX2J5dGVucjsKKwlfX2xlNjQgZGlza19udW1fYnl0ZXM7CisJX19sZTY0IG9mZnNldDsKKwlfX2xlNjQgbnVtX2J5dGVzOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgYnRyZnNfcm9vdF9yZWYgeworCV9fbGU2NCBkaXJpZDsKKwlfX2xlNjQgc2VxdWVuY2U7CisJX19sZTE2IG5hbWVfbGVuOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKgorICogYnRyZnMgcHJpdmF0ZSBpbm9kZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgYnRyZnNfcHZ0X2lub2RlIHsKKyAgICB1aW50NjRfdCBvZmZzZXQ7Cit9OworCisjZGVmaW5lIFBWVChpKSAoKHN0cnVjdCBidHJmc19wdnRfaW5vZGUgKikoKGkpLT5wdnQpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZnMvYnRyZnMvY3JjMzJjLmggYi9jb3JlL2ZzL2J0cmZzL2NyYzMyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzE3MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL2J0cmZzL2NyYzMyYy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3BpZWQgZnJvbSBMaW51eCBrZXJuZWwgY3J5cHRvL2NyYzMyYy5jCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQ2lzY28gU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA4IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisvKgorICogVGhpcyBpcyB0aGUgQ1JDLTMyQyB0YWJsZQorICogR2VuZXJhdGVkIHdpdGg6CisgKiB3aWR0aCA9IDMyIGJpdHMKKyAqIHBvbHkgPSAweDFFREM2RjQxCisgKiByZWZsZWN0IGlucHV0IGJ5dGVzID0gdHJ1ZQorICogcmVmbGVjdCBvdXRwdXQgYnl0ZXMgPSB0cnVlCisgKi8KKworc3RhdGljIHUzMiBjcmMzMmNfdGFibGVbMjU2XTsKKworLyoKKyAqIFN0ZXBzIHRocm91Z2ggYnVmZmVyIG9uZSBieXRlIGF0IGF0IHRpbWUsIGNhbGN1bGF0ZXMgcmVmbGVjdGVkCisgKiBjcmMgdXNpbmcgdGFibGUuCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgY3JjMzJjX2xlKHUzMiBjcmMsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisJd2hpbGUgKGxlbmd0aC0tKQorCQljcmMgPSBjcmMzMmNfdGFibGVbKHU4KShjcmMgXiAqZGF0YSsrKV0gXiAoY3JjID4+IDgpOworCisJcmV0dXJuIGNyYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX2luaXRfY3JjMzJjKHZvaWQpCit7CisJaW50IGksIGo7CisJdTMyIHY7CisJY29uc3QgdTMyIHBvbHkgPSAweDgyRjYzQjc4OyAvKiBCaXQtcmVmbGVjdGVkIENSQzMyQyBwb2x5bm9taWFsICovCisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJdiA9IGk7CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCXYgPSAodiA+PiAxKSBeICgodiAmIDEpID8gcG9seSA6IDApOworCQl9CisJCWNyYzMyY190YWJsZVtpXSA9IHY7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9jYWNoZS5jIGIvY29yZS9mcy9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTc1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL2NhY2hlLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBjb3JlL2NhY2hlLmM6IEEgc2ltcGxlIExSVS1iYXNlZCBjYWNoZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBjYWNoZSBkYXRhIHN0cnVjdHJlcy4gdGhlIF9ibG9ja19zaXplX3NoaWZ0XyBzcGVjaWZ5CisgKiB0aGUgYmxvY2sgc2l6ZSwgd2hpY2ggaXMgNTEyIGJ5dGUgZm9yIEZBVCBmcyBvZiB0aGUgY3VycmVudCAKKyAqIGltcGxlbWVudGF0aW9uIHNpbmNlIHRoZSBibG9jayhjbHVzdGVyKSBzaXplIGluIEZBVCBpcyBhIGJpdCBiaWcuCisgKi8KK3ZvaWQgY2FjaGVfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBibG9ja19zaXplX3NoaWZ0KQoreworICAgIHN0cnVjdCBjYWNoZSAqcHJldiwgKmN1cjsKKyAgICBjaGFyICpkYXRhID0gZGV2LT5jYWNoZV9kYXRhOworICAgIHN0cnVjdCBjYWNoZSAqaGVhZCwgKmNhY2hlOworICAgIGludCBpOworCisgICAgZGV2LT5jYWNoZV9ibG9ja19zaXplID0gMSA8PCBibG9ja19zaXplX3NoaWZ0OworCisgICAgaWYgKGRldi0+Y2FjaGVfc2l6ZSA8IGRldi0+Y2FjaGVfYmxvY2tfc2l6ZSArIDIqc2l6ZW9mKHN0cnVjdCBjYWNoZSkpIHsKKwlkZXYtPmNhY2hlX2hlYWQgPSBOVUxMOworCXJldHVybjsJCQkvKiBDYWNoZSB1bnVzYWJseSBzbWFsbCAqLworICAgIH0KKworICAgIC8qIFdlIG5lZWQgb25lIHN0cnVjdCBjYWNoZSBmb3IgdGhlIGhlYWRub2RlIHBsdXMgb25lIGZvciBlYWNoIGJsb2NrICovCisgICAgZGV2LT5jYWNoZV9lbnRyaWVzID0KKwkoZGV2LT5jYWNoZV9zaXplIC0gc2l6ZW9mKHN0cnVjdCBjYWNoZSkpLworCShkZXYtPmNhY2hlX2Jsb2NrX3NpemUgKyBzaXplb2Yoc3RydWN0IGNhY2hlKSk7CisKKyAgICBkZXYtPmNhY2hlX2hlYWQgPSBoZWFkID0gKHN0cnVjdCBjYWNoZSAqKQorCShkYXRhICsgKGRldi0+Y2FjaGVfZW50cmllcyA8PCBibG9ja19zaXplX3NoaWZ0KSk7CisgICAgY2FjaGUgPSBoZWFkICsgMTsJCS8qIEZpcnN0IGNhY2hlIGRlc2NyaXB0b3IgKi8KKworICAgIGhlYWQtPnByZXYgID0gJmNhY2hlW2Rldi0+Y2FjaGVfZW50cmllcy0xXTsKKyAgICBoZWFkLT5wcmV2LT5uZXh0ID0gaGVhZDsKKyAgICBoZWFkLT5ibG9jayA9IC0xOworICAgIGhlYWQtPmRhdGEgID0gTlVMTDsKKworICAgIHByZXYgPSBoZWFkOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBkZXYtPmNhY2hlX2VudHJpZXM7IGkrKykgeworICAgICAgICBjdXIgPSAmY2FjaGVbaV07CisgICAgICAgIGN1ci0+ZGF0YSAgPSBkYXRhOworICAgICAgICBjdXItPmJsb2NrID0gLTE7CisgICAgICAgIGN1ci0+cHJldiAgPSBwcmV2OworICAgICAgICBwcmV2LT5uZXh0ID0gY3VyOworICAgICAgICBkYXRhICs9IGRldi0+Y2FjaGVfYmxvY2tfc2l6ZTsKKyAgICAgICAgcHJldiA9IGN1cisrOworICAgIH0KKworICAgIGRldi0+Y2FjaGVfaW5pdCA9IDE7IC8qIFNldCBjYWNoZSBhcyBpbml0aWFsaXplZCAqLworfQorCisvKgorICogTG9jayBhIGJsb2NrIHBlcm1hbmVudGx5IGluIHRoZSBjYWNoZSBieSByZW1vdmluZyBpdAorICogZnJvbSB0aGUgTFJVIGNoYWluLgorICovCit2b2lkIGNhY2hlX2xvY2tfYmxvY2soc3RydWN0IGNhY2hlICpjcykKK3sKKyAgICBjcy0+cHJldi0+bmV4dCA9IGNzLT5uZXh0OworICAgIGNzLT5uZXh0LT5wcmV2ID0gY3MtPnByZXY7CisKKyAgICBjcy0+bmV4dCA9IGNzLT5wcmV2ID0gTlVMTDsKK30KKworLyoKKyAqIENoZWNrIGZvciBhIHBhcnRpY3VsYXIgQkxPQ0sgaW4gdGhlIGJsb2NrIGNhY2hlLCAKKyAqIGFuZCBpZiBpdCBpcyBhbHJlYWR5IHRoZXJlLCBqdXN0IGRvIG5vdGhpbmcgYW5kIHJldHVybjsKKyAqIG90aGVyd2lzZSBwaWNrIGEgdmljdGltIGJsb2NrIGFuZCB1cGRhdGUgdGhlIExSVSBsaW5rLgorICovCitzdHJ1Y3QgY2FjaGUgKl9nZXRfY2FjaGVfYmxvY2soc3RydWN0IGRldmljZSAqZGV2LCBibG9ja190IGJsb2NrKQoreworICAgIHN0cnVjdCBjYWNoZSAqaGVhZCA9IGRldi0+Y2FjaGVfaGVhZDsKKyAgICBzdHJ1Y3QgY2FjaGUgKmNzOworICAgIGludCBpOworCisgICAgY3MgPSBkZXYtPmNhY2hlX2hlYWQgKyAxOworCisgICAgZm9yIChpID0gMDsgaSA8IGRldi0+Y2FjaGVfZW50cmllczsgaSsrKSB7CisJaWYgKGNzLT5ibG9jayA9PSBibG9jaykKKwkgICAgZ290byBmb3VuZDsKKwljcysrOworICAgIH0KKyAgICAKKyAgICAvKiBOb3QgZm91bmQsIHBpY2sgYSB2aWN0aW0gKi8KKyAgICBjcyA9IGhlYWQtPm5leHQ7CisKK2ZvdW5kOgorICAgIC8qIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgTFJVIGNoYWluLCB1bmxlc3MgdGhlIGJsb2NrIGlzIGFscmVhZHkgbG9ja2VkICovCisgICAgaWYgKGNzLT5uZXh0KSB7CisJY3MtPnByZXYtPm5leHQgPSBjcy0+bmV4dDsKKwljcy0+bmV4dC0+cHJldiA9IGNzLT5wcmV2OworCQorCWNzLT5wcmV2ID0gaGVhZC0+cHJldjsKKwloZWFkLT5wcmV2LT5uZXh0ID0gY3M7CisJY3MtPm5leHQgPSBoZWFkOworCWhlYWQtPnByZXYgPSBjczsKKyAgICB9CisKKyAgICByZXR1cm4gY3M7Cit9ICAgIAorCisvKgorICogQ2hlY2sgZm9yIGEgcGFydGljdWxhciBCTE9DSyBpbiB0aGUgYmxvY2sgY2FjaGUsIAorICogYW5kIGlmIGl0IGlzIGFscmVhZHkgdGhlcmUsIGp1c3QgZG8gbm90aGluZyBhbmQgcmV0dXJuOworICogb3RoZXJ3aXNlIGxvYWQgaXQgZnJvbSBkaXNrIGFuZCB1cGRhdGUgdGhlIExSVSBsaW5rLgorICogUmV0dXJuIHRoZSBkYXRhIHBvaW50ZXIuCisgKi8KK2NvbnN0IHZvaWQgKmdldF9jYWNoZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJsb2NrX3QgYmxvY2spCit7CisgICAgc3RydWN0IGNhY2hlICpjczsKKworICAgIGNzID0gX2dldF9jYWNoZV9ibG9jayhkZXYsIGJsb2NrKTsKKyAgICBpZiAoY3MtPmJsb2NrICE9IGJsb2NrKSB7CisJY3MtPmJsb2NrID0gYmxvY2s7CisgICAgICAgIGdldG9uZWJsayhkZXYtPmRpc2ssIGNzLT5kYXRhLCBibG9jaywgZGV2LT5jYWNoZV9ibG9ja19zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gY3MtPmRhdGE7Cit9CisKKy8qCisgKiBSZWFkIGRhdGEgZnJvbSB0aGUgY2FjaGUgYXQgYW4gYXJiaXRyYXJ5IGJ5dGUgb2Zmc2V0IGFuZCBsZW5ndGguCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZmlsZXN5c3RlbXMgd2hvc2UgbWV0YWRhdGEgaXMgbm90IG5lY2Vzc2FyaWx5CisgKiBhbGlnbmVkIHdpdGggdGhlaXIgYmxvY2tzLgorICoKKyAqIFRoaXMgaXMgc3RpbGwgcmVhZGluZyBsaW5lYXJseSBvbiB0aGUgZGlzay4KKyAqLworc2l6ZV90IGNhY2hlX3JlYWQoc3RydWN0IGZzX2luZm8gKmZzLCB2b2lkICpidWYsIHVpbnQ2NF90IG9mZnNldCwgc2l6ZV90IGNvdW50KQoreworICAgIGNvbnN0IGNoYXIgKmNkOworICAgIGNoYXIgKnAgPSBidWY7CisgICAgc2l6ZV90IG9mZiwgY250LCB0b3RhbDsKKyAgICBibG9ja190IGJsb2NrOworCisgICAgdG90YWwgPSBjb3VudDsKKyAgICB3aGlsZSAoY291bnQpIHsKKwlibG9jayA9IG9mZnNldCA+PiBmcy0+YmxvY2tfc2hpZnQ7CisJb2ZmID0gb2Zmc2V0ICYgKGZzLT5ibG9ja19zaXplIC0gMSk7CisJY2QgPSBnZXRfY2FjaGUoZnMtPmZzX2RldiwgYmxvY2spOworCWlmICghY2QpCisJICAgIGJyZWFrOworCWNudCA9IGZzLT5ibG9ja19zaXplIC0gb2ZmOworCWlmIChjbnQgPiBjb3VudCkKKwkgICAgY250ID0gY291bnQ7CisJbWVtY3B5KHAsIGNkICsgb2ZmLCBjbnQpOworCWNvdW50IC09IGNudDsKKwlwICs9IGNudDsKKwlvZmZzZXQgKz0gY250OworICAgIH0KKyAgICByZXR1cm4gdG90YWwgLSBjb3VudDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMvY2hkaXIuYyBiL2NvcmUvZnMvY2hkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzZlYTExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9jaGRpci5jCkBAIC0wLDAgKzEsMTMyIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisvKgorICogQ29udmVydCBhIHJlbGF0aXZlIHBhdGhuYW1lIHRvIGFuIGFic29sdXRlIHBhdGhuYW1lCisgKiBJbiB0aGUgZnV0dXJlIHRoaXMgbWlnaHQgYWxzbyByZXNvbHZlIHN5bWxpbmtzLi4uCisgKi8KK3ZvaWQgcG1fcmVhbHBhdGgoY29tMzJzeXNfdCAqcmVncykKK3sKKyAgICBjb25zdCBjaGFyICpzcmMgPSBNS19QVFIocmVncy0+ZHMsIHJlZ3MtPmVzaS53WzBdKTsKKyAgICBjaGFyICAgICAgICpkc3QgPSBNS19QVFIocmVncy0+ZXMsIHJlZ3MtPmVkaS53WzBdKTsKKworICAgIHJlYWxwYXRoKGRzdCwgc3JjLCBGSUxFTkFNRV9NQVgpOworfQorCitzdGF0aWMgc2l6ZV90IGNvcHlfc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGl4LCBzaXplX3QgYnVmc2l6ZSwgY29uc3QgY2hhciAqc3JjKQoreworICAgIGNoYXIgYzsKKworICAgIHdoaWxlICgoYyA9ICpzcmMrKykpIHsKKwlpZiAoaXgrMSA8IGJ1ZnNpemUpCisJICAgIGJ1ZltpeF0gPSBjOworCWl4Kys7CisgICAgfQorCisgICAgaWYgKGl4IDwgYnVmc2l6ZSkKKwlidWZbaXhdID0gJ1wwJzsKKworICAgIHJldHVybiBpeDsKK30KKworc3RhdGljIHNpemVfdCBnZW5lcmljX2lub2RlX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqZHN0LCBzaXplX3QgYnVmc2l6ZSkKK3sKKyAgICBzaXplX3QgcyA9IDA7CisKKyAgICBkcHJpbnRmKCJpbm9kZSAlcCBuYW1lICVzXG4iLCBpbm9kZSwgaW5vZGUtPm5hbWUpOworCisgICAgaWYgKGlub2RlLT5wYXJlbnQpIHsKKwlpZiAoIWlub2RlLT5uYW1lKQkvKiBPbmx5IHRoZSByb290IHNob3VsZCBoYXZlIG5vIG5hbWUgKi8KKwkgICAgcmV0dXJuIC0xOworCisJcyA9IGdlbmVyaWNfaW5vZGVfdG9fcGF0aChpbm9kZS0+cGFyZW50LCBkc3QsIGJ1ZnNpemUpOworCWlmIChzID09IChzaXplX3QpLTEpCisJICAgIHJldHVybiBzOwkJLyogRXJyb3IhICovCisKKwlzID0gY29weV9zdHJpbmcoZHN0LCBzLCBidWZzaXplLCAiLyIpOworCXMgPSBjb3B5X3N0cmluZyhkc3QsIHMsIGJ1ZnNpemUsIGlub2RlLT5uYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gczsKK30KKworX19leHBvcnQgc2l6ZV90IHJlYWxwYXRoKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgYnVmc2l6ZSkKK3sKKyAgICBpbnQgcnY7CisgICAgc3RydWN0IGZpbGUgKmZpbGU7CisgICAgc2l6ZV90IHM7CisKKyAgICBkcHJpbnRmKCJyZWFscGF0aDogaW5wdXQ6ICVzXG4iLCBzcmMpOworCisgICAgaWYgKHRoaXNfZnMtPmZzX29wcy0+cmVhbHBhdGgpIHsKKwlzID0gdGhpc19mcy0+ZnNfb3BzLT5yZWFscGF0aCh0aGlzX2ZzLCBkc3QsIHNyYywgYnVmc2l6ZSk7CisgICAgfSBlbHNlIHsKKwlydiA9IHNlYXJjaGRpcihzcmMsIE9fUkRPTkxZKTsKKwlpZiAocnYgPCAwKSB7CisJICAgIGRwcmludGYoInJlYWxwYXRoOiBzZWFyY2hwYXRoIGZhaWx1cmVcbiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCisJZmlsZSA9IGhhbmRsZV90b19maWxlKHJ2KTsKKwlzID0gZ2VuZXJpY19pbm9kZV90b19wYXRoKGZpbGUtPmlub2RlLCBkc3QsIGJ1ZnNpemUpOworCWlmIChzID09IDApCisJICAgIHMgPSBjb3B5X3N0cmluZyhkc3QsIDAsIGJ1ZnNpemUsICIvIik7CisKKwlfY2xvc2VfZmlsZShmaWxlKTsKKyAgICB9CisKKyAgICBkcHJpbnRmKCJyZWFscGF0aDogb3V0cHV0OiAlc1xuIiwgZHN0KTsKKyAgICByZXR1cm4gczsKK30KKworX19leHBvcnQgaW50IGNoZGlyKGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICBpbnQgcnY7CisgICAgc3RydWN0IGZpbGUgKmZpbGU7CisgICAgY2hhciBjd2RfYnVmW0NVUlJFTlRESVJfTUFYXTsKKyAgICBzaXplX3QgczsKKworICAgIGRwcmludGYoImNoZGlyOiBmcm9tICVzIChpbm9kZSAlcCkgYWRkICVzXG4iLAorCSAgICB0aGlzX2ZzLT5jd2RfbmFtZSwgdGhpc19mcy0+Y3dkLCBzcmMpOworCisgICAgaWYgKHRoaXNfZnMtPmZzX29wcy0+Y2hkaXIpCisJcmV0dXJuIHRoaXNfZnMtPmZzX29wcy0+Y2hkaXIodGhpc19mcywgc3JjKTsKKworICAgIC8qIE90aGVyd2lzZSBpdCBpcyBhICJjb252ZW50aW9uYWwgZmlsZXN5c3RlbSIgKi8KKyAgICBydiA9IHNlYXJjaGRpcihzcmMsIE9fUkRPTkxZfE9fRElSRUNUT1JZKTsKKyAgICBpZiAocnYgPCAwKQorCXJldHVybiBydjsKKworICAgIGZpbGUgPSBoYW5kbGVfdG9fZmlsZShydik7CisgICAgaWYgKGZpbGUtPmlub2RlLT5tb2RlICE9IERUX0RJUikgeworCV9jbG9zZV9maWxlKGZpbGUpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdXRfaW5vZGUodGhpc19mcy0+Y3dkKTsKKyAgICB0aGlzX2ZzLT5jd2QgPSBnZXRfaW5vZGUoZmlsZS0+aW5vZGUpOworICAgIF9jbG9zZV9maWxlKGZpbGUpOworCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAqLworICAgIHMgPSBnZW5lcmljX2lub2RlX3RvX3BhdGgodGhpc19mcy0+Y3dkLCBjd2RfYnVmLCBDVVJSRU5URElSX01BWC0xKTsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgY3dkX25hbWUgZW5kcyBpbiBhIHNsYXNoLCBpdCdzIHN1cHBvc2VkIHRvIGJlIGEgcHJlZml4ICovCisgICAgaWYgKHMgPCAxIHx8IGN3ZF9idWZbcy0xXSAhPSAnLycpCisJY3dkX2J1ZltzKytdID0gJy8nOworCisgICAgaWYgKHMgPj0gQ1VSUkVOVERJUl9NQVgpCisJcyA9IENVUlJFTlRESVJfTUFYIC0gMTsKKworICAgIGN3ZF9idWZbcysrXSA9ICdcMCc7CisgICAgbWVtY3B5KHRoaXNfZnMtPmN3ZF9uYW1lLCBjd2RfYnVmLCBzKTsKKworICAgIGRwcmludGYoImNoZGlyOiBmaW5hbCAlcyAoaW5vZGUgJXApXG4iLAorCSAgICB0aGlzX2ZzLT5jd2RfbmFtZSwgdGhpc19mcy0+Y3dkKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9kaXNraW8uYyBiL2NvcmUvZnMvZGlza2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhNGMxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvZGlza2lvLmMKQEAgLTAsMCArMSwzNCBAQAorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgPGRpc2suaD4KKyNpbmNsdWRlIDxpbG9nMi5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorCisjaW5jbHVkZSA8c3lzbGludXgvZmlybXdhcmUuaD4KKwordm9pZCBnZXRvbmVibGsoc3RydWN0IGRpc2sgKmRpc2ssIGNoYXIgKmJ1ZiwgYmxvY2tfdCBibG9jaywgaW50IGJsb2NrX3NpemUpCit7CisgICAgaW50IHNlY19wZXJfYmxvY2sgPSBibG9ja19zaXplIC8gZGlzay0+c2VjdG9yX3NpemU7CisKKyAgICBkaXNrLT5yZHdyX3NlY3RvcnMoZGlzaywgYnVmLCBibG9jayAqIHNlY19wZXJfYmxvY2ssIHNlY19wZXJfYmxvY2ssIDApOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGRldmljZSAqIGRldmljZV9pbml0KHZvaWQgKmFyZ3MpCit7CisgICAgc3RhdGljIHN0cnVjdCBkZXZpY2UgZGV2OworCisgICAgZGV2LmRpc2sgPSBmaXJtd2FyZS0+ZGlza19pbml0KGFyZ3MpOworICAgIGRldi5jYWNoZV9zaXplID0gMTI4KjEwMjQ7CisgICAgZGV2LmNhY2hlX2RhdGEgPSBtYWxsb2MoZGV2LmNhY2hlX3NpemUpOworICAgIGRldi5jYWNoZV9pbml0ID0gMDsgLyogRXhwbGljaXRseSBzZXQgY2FjaGUgYXMgdW5pbml0aWFsaXplZCAqLworCisgICAgcmV0dXJuICZkZXY7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL2Rpc2tpb19iaW9zLmMgYi9jb3JlL2ZzL2Rpc2tpb19iaW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlYjdmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvZGlza2lvX2Jpb3MuYwpAQCAtMCwwICsxLDQwMyBAQAorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8aWxvZzIuaD4KKworI2RlZmluZSBSRVRSWV9DT1VOVCA2CisKK3N0YXRpYyBpbmxpbmUgc2VjdG9yX3QgY2hzX21heChjb25zdCBzdHJ1Y3QgZGlzayAqZGlzaykKK3sKKyAgICByZXR1cm4gKHNlY3Rvcl90KWRpc2stPnNlY3BlcmN5bCA8PCAxMDsKK30KKworc3RydWN0IGVkZF9yZHdyX3BhY2tldCB7CisgICAgdWludDE2X3Qgc2l6ZTsKKyAgICB1aW50MTZfdCBibG9ja3M7CisgICAgZmFyX3B0cl90IGJ1ZjsKKyAgICB1aW50NjRfdCBsYmE7Cit9OworCitzdHJ1Y3QgZWRkX2Rpc2tfcGFyYW1zIHsKKyAgICB1aW50MTZfdCAgbGVuOworICAgIHVpbnQxNl90ICBmbGFnczsKKyAgICB1aW50MzJfdCAgcGh5c19jOworICAgIHVpbnQzMl90ICBwaHlzX2g7CisgICAgdWludDMyX3QgIHBoeXNfczsKKyAgICB1aW50NjRfdCAgc2VjdG9yczsKKyAgICB1aW50MTZfdCAgc2VjdG9yX3NpemU7CisgICAgZmFyX3B0cl90IGRwdGU7CisgICAgdWludDE2X3QgIGRldnBhdGhfa2V5OworICAgIHVpbnQ4X3QgICBkZXZwYXRoX2xlbjsKKyAgICB1aW50OF90ICAgX3BhZDFbM107CisgICAgY2hhciAgICAgIGJ1c190eXBlWzRdOworICAgIGNoYXIgICAgICBpZl90eXBlWzhdOworICAgIHVpbnQ4X3QgICBpZl9wYXRoWzhdOworICAgIHVpbnQ4X3QgICBkZXZfcGF0aFsxNl07CisgICAgdWludDhfdCAgIF9wYWQyOworICAgIHVpbnQ4X3QgICBkZXZwYXRoX2NzdW07CS8qIERlcGVuZHMgb24gZGV2cGF0aF9sZW4hICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfcG93ZXJfb2ZfMih1aW50MzJfdCB4KQoreworICAgIHJldHVybiAhKHggJiAoeC0xKSk7Cit9CisKK3N0YXRpYyBpbnQgY2hzX3Jkd3Jfc2VjdG9ycyhzdHJ1Y3QgZGlzayAqZGlzaywgdm9pZCAqYnVmLAorCQkJICAgIHNlY3Rvcl90IGxiYSwgc2l6ZV90IGNvdW50LCBib29sIGlzX3dyaXRlKQoreworICAgIGNoYXIgKnB0ciA9IGJ1ZjsKKyAgICBjaGFyICp0cHRyOworICAgIHNpemVfdCBjaHVuaywgZnJlZXNlZzsKKyAgICBpbnQgc2VjdG9yX3NoaWZ0ID0gZGlzay0+c2VjdG9yX3NoaWZ0OworICAgIHVpbnQzMl90IHhsYmEgPSBsYmEgKyBkaXNrLT5wYXJ0X3N0YXJ0OyAvKiBUcnVuY2F0ZWQgTEJBIChDSFMgaXMgPDwgMiBUQikgKi8KKyAgICB1aW50MzJfdCB0OworICAgIHVpbnQzMl90IGMsIGgsIHM7CisgICAgY29tMzJzeXNfdCBpcmVnLCBvcmVnOworICAgIHNpemVfdCBkb25lID0gMDsKKyAgICBzaXplX3QgYnl0ZXM7CisgICAgaW50IHJldHJ5OworICAgIHVpbnQzMl90IG1heHRyYW5zZmVyID0gZGlzay0+bWF4dHJhbnNmZXI7CisKKyAgICBpZiAobGJhICsgZGlzay0+cGFydF9zdGFydCA+PSBjaHNfbWF4KGRpc2spKQorCXJldHVybiAwOwkJLyogSW1wb3NzaWJsZSBDSFMgcmVxdWVzdCAqLworCisgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisKKyAgICBpcmVnLmVheC5iWzFdID0gMHgwMiArIGlzX3dyaXRlOworICAgIGlyZWcuZWR4LmJbMF0gPSBkaXNrLT5kaXNrX251bWJlcjsKKworICAgIHdoaWxlIChjb3VudCkgeworCWNodW5rID0gY291bnQ7CisJaWYgKGNodW5rID4gbWF4dHJhbnNmZXIpCisJICAgIGNodW5rID0gbWF4dHJhbnNmZXI7CisKKwlmcmVlc2VnID0gKDB4MTAwMDAgLSAoKHNpemVfdClwdHIgJiAweGZmZmYpKSA+PiBzZWN0b3Jfc2hpZnQ7CisKKwlpZiAoKHNpemVfdClidWYgPD0gMHhmMDAwMCAmJiBmcmVlc2VnKSB7CisJICAgIC8qIENhbiBkbyBhIGRpcmVjdCBsb2FkICovCisJICAgIHRwdHIgPSBwdHI7CisJfSBlbHNlIHsKKwkgICAgLyogRWl0aGVyIGFjY2Vzc2luZyBoaWdoIG1lbW9yeSBvciB3ZSdyZSBjcm9zc2luZyBhIDY0SyBsaW5lICovCisJICAgIHRwdHIgPSBjb3JlX3hmZXJfYnVmOworCSAgICBmcmVlc2VnID0gKDB4MTAwMDAgLSAoKHNpemVfdCl0cHRyICYgMHhmZmZmKSkgPj4gc2VjdG9yX3NoaWZ0OworCX0KKwlpZiAoY2h1bmsgPiBmcmVlc2VnKQorCSAgICBjaHVuayA9IGZyZWVzZWc7CisKKwlzID0geGxiYSAlIGRpc2stPnM7CisJdCA9IHhsYmEgLyBkaXNrLT5zOworCWggPSB0ICUgZGlzay0+aDsKKwljID0gdCAvIGRpc2stPmg7CisKKwlpZiAoY2h1bmsgPiAoZGlzay0+cyAtIHMpKQorCSAgICBjaHVuayA9IGRpc2stPnMgLSBzOworCisJYnl0ZXMgPSBjaHVuayA8PCBzZWN0b3Jfc2hpZnQ7CisKKwlpZiAodHB0ciAhPSBwdHIgJiYgaXNfd3JpdGUpCisJICAgIG1lbWNweSh0cHRyLCBwdHIsIGJ5dGVzKTsKKworCWlyZWcuZWF4LmJbMF0gPSBjaHVuazsKKwlpcmVnLmVjeC5iWzFdID0gYzsKKwlpcmVnLmVjeC5iWzBdID0gKChjICYgMHgzMDApID4+IDIpIHwgKHMrMSk7CisJaXJlZy5lZHguYlsxXSA9IGg7CisJaXJlZy5lYngud1swXSA9IE9GRlModHB0cik7CisJaXJlZy5lcyAgICAgICA9IFNFRyh0cHRyKTsKKworCXJldHJ5ID0gUkVUUllfQ09VTlQ7CisKKyAgICAgICAgZm9yICg7OykgeworCSAgICBpZiAoYyA8IDEwMjQpIHsKKwkJZHByaW50ZigiQ0hTWyUwMnhdOiAldSBAICVsbHUgKCV1LyV1LyV1KSAlMDR4OiUwNHggJXMgJXBcbiIsCisJCQlpcmVnLmVkeC5iWzBdLCBjaHVuaywgeGxiYSwgYywgaCwgcysxLAorCQkJaXJlZy5lcywgaXJlZy5lYngud1swXSwKKwkJCShpcmVnLmVheC5iWzFdICYgMSkgPyAiPC0iIDogIi0+IiwKKwkJCXB0cik7CisKKwkJX19pbnRjYWxsKDB4MTMsICZpcmVnLCAmb3JlZyk7CisJCWlmICghKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpKQorCQkgICAgYnJlYWs7CisKKwkJZHByaW50ZigiQ0hTOiBlcnJvciBBWCA9ICUwNHhcbiIsIG9yZWcuZWF4LndbMF0pOworCisJCWlmIChyZXRyeS0tKQorCQkgICAgY29udGludWU7CisKKwkJLyoKKwkJICogRm9yIGFueSBzdGFydGluZyB2YWx1ZSwgdGhpcyB3aWxsIGFsd2F5cyBlbmQgd2l0aAorCQkgKiAuLi4sIDEsIDAKKwkJICovCisJCWNodW5rID4+PSAxOworCQlpZiAoY2h1bmspIHsKKwkJICAgIG1heHRyYW5zZmVyID0gY2h1bms7CisJCSAgICByZXRyeSA9IFJFVFJZX0NPVU5UOworCQkgICAgaXJlZy5lYXguYlswXSA9IGNodW5rOworCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorCisJICAgIHByaW50ZigiQ0hTOiBFcnJvciAlMDR4ICVzIHNlY3RvciAlbGx1ICgldS8ldS8ldSlcbiIsCisJCSAgIG9yZWcuZWF4LndbMF0sCisJCSAgIGlzX3dyaXRlID8gIndyaXRpbmciIDogInJlYWRpbmciLAorCQkgICBsYmEsIGMsIGgsIHMrMSk7CisJICAgIHJldHVybiBkb25lOwkvKiBGYWlsdXJlICovCisJfQorCisJYnl0ZXMgPSBjaHVuayA8PCBzZWN0b3Jfc2hpZnQ7CisKKwlpZiAodHB0ciAhPSBwdHIgJiYgIWlzX3dyaXRlKQorCSAgICBtZW1jcHkocHRyLCB0cHRyLCBieXRlcyk7CisKKwkvKiBJZiB3ZSBkcm9wcGVkIG1heHRyYW5zZmVyLCBpdCBldmVudHVhbGx5IHdvcmtlZCwgc28gcmVtZW1iZXIgaXQgKi8KKwlkaXNrLT5tYXh0cmFuc2ZlciA9IG1heHRyYW5zZmVyOworCisJcHRyICAgKz0gYnl0ZXM7CisJeGxiYSAgKz0gY2h1bms7CisJY291bnQgLT0gY2h1bms7CisJZG9uZSAgKz0gY2h1bms7CisgICAgfQorCisgICAgcmV0dXJuIGRvbmU7Cit9CisKK3N0YXRpYyBpbnQgZWRkX3Jkd3Jfc2VjdG9ycyhzdHJ1Y3QgZGlzayAqZGlzaywgdm9pZCAqYnVmLAorCQkJICAgIHNlY3Rvcl90IGxiYSwgc2l6ZV90IGNvdW50LCBib29sIGlzX3dyaXRlKQoreworICAgIHN0YXRpYyBfX2xvd21lbSBzdHJ1Y3QgZWRkX3Jkd3JfcGFja2V0IHBrdDsKKyAgICBjaGFyICpwdHIgPSBidWY7CisgICAgY2hhciAqdHB0cjsKKyAgICBzaXplX3QgY2h1bmssIGZyZWVzZWc7CisgICAgaW50IHNlY3Rvcl9zaGlmdCA9IGRpc2stPnNlY3Rvcl9zaGlmdDsKKyAgICBjb20zMnN5c190IGlyZWcsIG9yZWcsIHJlc2V0OworICAgIHNpemVfdCBkb25lID0gMDsKKyAgICBzaXplX3QgYnl0ZXM7CisgICAgaW50IHJldHJ5OworICAgIHVpbnQzMl90IG1heHRyYW5zZmVyID0gZGlzay0+bWF4dHJhbnNmZXI7CisKKyAgICBtZW1zZXQoJmlyZWcsIDAsIHNpemVvZiBpcmVnKTsKKworICAgIGlyZWcuZWF4LmJbMV0gPSAweDQyICsgaXNfd3JpdGU7CisgICAgaXJlZy5lZHguYlswXSA9IGRpc2stPmRpc2tfbnVtYmVyOworICAgIGlyZWcuZHMgICAgICAgPSBTRUcoJnBrdCk7CisgICAgaXJlZy5lc2kud1swXSA9IE9GRlMoJnBrdCk7CisKKyAgICBtZW1zZXQoJnJlc2V0LCAwLCBzaXplb2YgcmVzZXQpOworCisgICAgbGJhICs9IGRpc2stPnBhcnRfc3RhcnQ7CisgICAgd2hpbGUgKGNvdW50KSB7CisJY2h1bmsgPSBjb3VudDsKKwlpZiAoY2h1bmsgPiBtYXh0cmFuc2ZlcikKKwkgICAgY2h1bmsgPSBtYXh0cmFuc2ZlcjsKKworCWZyZWVzZWcgPSAoMHgxMDAwMCAtICgoc2l6ZV90KXB0ciAmIDB4ZmZmZikpID4+IHNlY3Rvcl9zaGlmdDsKKworCWlmICgoc2l6ZV90KXB0ciA8PSAweGYwMDAwICYmIGZyZWVzZWcpIHsKKwkgICAgLyogQ2FuIGRvIGEgZGlyZWN0IGxvYWQgKi8KKwkgICAgdHB0ciA9IHB0cjsKKwl9IGVsc2UgeworCSAgICAvKiBFaXRoZXIgYWNjZXNzaW5nIGhpZ2ggbWVtb3J5IG9yIHdlJ3JlIGNyb3NzaW5nIGEgNjRLIGxpbmUgKi8KKwkgICAgdHB0ciA9IGNvcmVfeGZlcl9idWY7CisJICAgIGZyZWVzZWcgPSAoMHgxMDAwMCAtICgoc2l6ZV90KXRwdHIgJiAweGZmZmYpKSA+PiBzZWN0b3Jfc2hpZnQ7CisJfQorCWlmIChjaHVuayA+IGZyZWVzZWcpCisJICAgIGNodW5rID0gZnJlZXNlZzsKKworCWJ5dGVzID0gY2h1bmsgPDwgc2VjdG9yX3NoaWZ0OworCisJaWYgKHRwdHIgIT0gcHRyICYmIGlzX3dyaXRlKQorCSAgICBtZW1jcHkodHB0ciwgcHRyLCBieXRlcyk7CisKKwlyZXRyeSA9IFJFVFJZX0NPVU5UOworCisJZm9yICg7OykgeworCSAgICBwa3Quc2l6ZSAgID0gc2l6ZW9mIHBrdDsKKwkgICAgcGt0LmJsb2NrcyA9IGNodW5rOworCSAgICBwa3QuYnVmICAgID0gRkFSX1BUUih0cHRyKTsKKwkgICAgcGt0LmxiYSAgICA9IGxiYTsKKworCSAgICBkcHJpbnRmKCJFRERbJTAyeF06ICV1IEAgJWxsdSAlMDR4OiUwNHggJXMgJXBcbiIsCisJCSAgICBpcmVnLmVkeC5iWzBdLCBwa3QuYmxvY2tzLCBwa3QubGJhLAorCQkgICAgcGt0LmJ1Zi5zZWcsIHBrdC5idWYub2ZmcywKKwkJICAgIChpcmVnLmVheC5iWzFdICYgMSkgPyAiPC0iIDogIi0+IiwKKwkJICAgIHB0cik7CisKKwkgICAgX19pbnRjYWxsKDB4MTMsICZpcmVnLCAmb3JlZyk7CisJICAgIGlmICghKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpKQorCQlicmVhazsKKworCSAgICBkcHJpbnRmKCJFREQ6IGVycm9yIEFYID0gJTA0eFxuIiwgb3JlZy5lYXgud1swXSk7CisKKwkgICAgaWYgKHJldHJ5LS0pCisJCWNvbnRpbnVlOworCisJICAgIC8qCisJICAgICAqIFNvbWUgc3lzdGVtcyBzZWVtIHRvIGdldCAic3R1Y2siIGluIGFuIGVycm9yIHN0YXRlIHdoZW4KKwkgICAgICogdXNpbmcgRUJJT1MuICBEb2Vzbid0IGhhcHBlbiB3aGVuIHVzaW5nIENCSU9TLCB3aGljaCBpcworCSAgICAgKiBnb29kLCBzaW5jZSBzb21lIG90aGVyIHN5c3RlbXMgZ2V0IHRpbWVvdXQgZmFpbHVyZXMKKwkgICAgICogd2FpdGluZyBmb3IgdGhlIGZsb3BweSBkaXNrIHRvIHNwaW4gdXAuCisJICAgICAqLworCSAgICBfX2ludGNhbGwoMHgxMywgJnJlc2V0LCBOVUxMKTsKKworCSAgICAvKiBGb3IgYW55IHN0YXJ0aW5nIHZhbHVlLCB0aGlzIHdpbGwgYWx3YXlzIGVuZCB3aXRoIC4uLiwgMSwgMCAqLworCSAgICBjaHVuayA+Pj0gMTsKKwkgICAgaWYgKGNodW5rKSB7CisJCW1heHRyYW5zZmVyID0gY2h1bms7CisJCXJldHJ5ID0gUkVUUllfQ09VTlQ7CisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogVG90YWwgZmFpbHVyZS4gIFRoZXJlIGFyZSBzeXN0ZW1zIHdoaWNoIGlkZW50aWZ5IGFzCisJICAgICAqIEVERC1jYXBhYmxlIGJ1dCBhcmVuJ3Q7IHRoZSBrbm93biBzdWNoIHN5c3RlbXMgcmV0dXJuCisJICAgICAqIGVycm9yIGNvZGUgQUg9MSAoaW52YWxpZCBmdW5jdGlvbiksIGJ1dCBsZXQncyBub3QKKwkgICAgICogYXNzdW1lIHRoYXQgZm9yIG5vdy4KKwkgICAgICoKKwkgICAgICogVHJ5IHRvIGZhbGwgYmFjayB0byBDSFMuICBJZiB0aGUgTEJBIGlzIGFic3VyZCwgdGhlCisJICAgICAqIGNoc19tYXgoKSB0ZXN0IGluIGNoc19yZHdyX3NlY3RvcnMoKSB3aWxsIGNhdGNoIGl0LgorCSAgICAgKi8KKwkgICAgZG9uZSA9IGNoc19yZHdyX3NlY3RvcnMoZGlzaywgYnVmLCBsYmEgLSBkaXNrLT5wYXJ0X3N0YXJ0LAorCQkJCSAgICBjb3VudCwgaXNfd3JpdGUpOworCSAgICBpZiAoZG9uZSA9PSAoY291bnQgPDwgc2VjdG9yX3NoaWZ0KSkgeworCQkvKiBTdWNjZXNzZnVsLCBhc3N1bWUgdGhpcyBpcyBhIENIUyBkaXNrICovCisJCWRpc2stPnJkd3Jfc2VjdG9ycyA9IGNoc19yZHdyX3NlY3RvcnM7CisJCXJldHVybiBkb25lOworCSAgICB9CisJICAgIHByaW50ZigiRUREOiBFcnJvciAlMDR4ICVzIHNlY3RvciAlbGx1XG4iLAorCQkgICBvcmVnLmVheC53WzBdLAorCQkgICBpc193cml0ZSA/ICJ3cml0aW5nIiA6ICJyZWFkaW5nIiwKKwkJICAgbGJhKTsKKwkgICAgcmV0dXJuIGRvbmU7CS8qIEZhaWx1cmUgKi8KKwl9CisKKwlieXRlcyA9IGNodW5rIDw8IHNlY3Rvcl9zaGlmdDsKKworCWlmICh0cHRyICE9IHB0ciAmJiAhaXNfd3JpdGUpCisJICAgIG1lbWNweShwdHIsIHRwdHIsIGJ5dGVzKTsKKworCS8qIElmIHdlIGRyb3BwZWQgbWF4dHJhbnNmZXIsIGl0IGV2ZW50dWFsbHkgd29ya2VkLCBzbyByZW1lbWJlciBpdCAqLworCWRpc2stPm1heHRyYW5zZmVyID0gbWF4dHJhbnNmZXI7CisKKwlwdHIgICArPSBieXRlczsKKwlsYmEgICArPSBjaHVuazsKKwljb3VudCAtPSBjaHVuazsKKwlkb25lICArPSBjaHVuazsKKyAgICB9CisgICAgcmV0dXJuIGRvbmU7Cit9CisKK3N0cnVjdCBkaXNrICpiaW9zX2Rpc2tfaW5pdCh2b2lkICpwcml2YXRlKQoreworICAgIHN0YXRpYyBzdHJ1Y3QgZGlzayBkaXNrOworICAgIHN0cnVjdCBiaW9zX2Rpc2tfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgYmlvc19kaXNrX3ByaXZhdGUgKilwcml2YXRlOworICAgIGNvbTMyc3lzX3QgKnJlZ3MgPSBwcml2LT5yZWdzOworICAgIHN0YXRpYyBfX2xvd21lbSBzdHJ1Y3QgZWRkX2Rpc2tfcGFyYW1zIGVkZF9wYXJhbXM7CisgICAgY29tMzJzeXNfdCBpcmVnLCBvcmVnOworICAgIHVpbnQ4X3QgZGV2bm8gPSByZWdzLT5lZHguYlswXTsKKyAgICBib29sIGNkcm9tID0gcmVncy0+ZWR4LmJbMV07CisgICAgc2VjdG9yX3QgcGFydF9zdGFydCA9IHJlZ3MtPmVjeC5sIHwgKChzZWN0b3JfdClyZWdzLT5lYngubCA8PCAzMik7CisgICAgdWludDE2X3QgYnNIZWFkcyA9IHJlZ3MtPmVzaS53WzBdOworICAgIHVpbnQxNl90IGJzU2VjUGVyVHJhY2sgPSByZWdzLT5lZGkud1swXTsKKyAgICB1aW50MzJfdCBNYXhUcmFuc2ZlciA9IHJlZ3MtPmVicC5sOworICAgIGJvb2wgZWJpb3M7CisgICAgaW50IHNlY3Rvcl9zaXplOworICAgIHVuc2lnbmVkIGludCBoYXJkX21heF90cmFuc2ZlcjsKKworICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworICAgIGlyZWcuZWR4LmJbMF0gPSBkZXZubzsKKworICAgIGlmIChjZHJvbSkgeworCS8qCisJICogVGhlIHF1ZXJ5IGZ1bmN0aW9ucyBkb24ndCB3b3JrIHJpZ2h0IG9uIHNvbWUgQ0QtUk9NIHN0YWNrcy4KKwkgKiBLbm93biBhZmZlY3RlZCBzeXN0ZW1zOiBUaGlua1BhZCBUMjIsIFQyMy4KKwkgKi8KKwlzZWN0b3Jfc2l6ZSA9IDIwNDg7CisJZWJpb3MgPSB0cnVlOworCWhhcmRfbWF4X3RyYW5zZmVyID0gMzI7CisgICAgfSBlbHNlIHsKKwlzZWN0b3Jfc2l6ZSA9IDUxMjsKKwllYmlvcyA9IGZhbHNlOworCWhhcmRfbWF4X3RyYW5zZmVyID0gNjM7CisKKwkvKiBDQklPUyBwYXJhbWV0ZXJzICovCisJZGlzay5oID0gYnNIZWFkczsKKwlkaXNrLnMgPSBic1NlY1BlclRyYWNrOworCisJaWYgKChpbnQ4X3QpZGV2bm8gPCAwKSB7CisJICAgIC8qIEdldCBoYXJkIGRpc2sgZ2VvbWV0cnkgZnJvbSBCSU9TICovCisJICAgIAorCSAgICBpcmVnLmVheC5iWzFdID0gMHgwODsKKwkgICAgX19pbnRjYWxsKDB4MTMsICZpcmVnLCAmb3JlZyk7CisJICAgIAorCSAgICBpZiAoIShvcmVnLmVmbGFncy5sICYgRUZMQUdTX0NGKSkgeworCQlkaXNrLmggPSBvcmVnLmVkeC5iWzFdICsgMTsKKwkJZGlzay5zID0gb3JlZy5lY3guYlswXSAmIDYzOworCSAgICB9CisJfQorCisgICAgICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworCS8qIEdldCBFQklPUyBzdXBwb3J0ICovCisJaXJlZy5lYXguYlsxXSA9IDB4NDE7CisJaXJlZy5lYngud1swXSA9IDB4NTVhYTsKKwlpcmVnLmVkeC5iWzBdID0gZGV2bm87CisJaXJlZy5lZmxhZ3MuYlswXSA9IDB4MzsJLyogQ0Ygc2V0ICovCisKKwlfX2ludGNhbGwoMHgxMywgJmlyZWcsICZvcmVnKTsKKwkKKwlpZiAoIShvcmVnLmVmbGFncy5sICYgRUZMQUdTX0NGKSAmJgorCSAgICBvcmVnLmVieC53WzBdID09IDB4YWE1NSAmJiAob3JlZy5lY3guYlswXSAmIDEpKSB7CisJICAgIGViaW9zID0gdHJ1ZTsKKwkgICAgaGFyZF9tYXhfdHJhbnNmZXIgPSAxMjc7CisKKwkgICAgLyogUXVlcnkgRUJJT1MgcGFyYW1ldGVycyAqLworCSAgICAvKiBUaGUgbWVtc2V0KCkgaXMgbmVlZGVkIG9uY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkCisJICAgICAgIG1vcmUgdGhhbiBvbmNlICovCisJICAgIC8qIG1lbXNldCgmZWRkX3BhcmFtcywgMCwgc2l6ZW9mIGVkZF9wYXJhbXMpOyAgKi8KKwkgICAgZWRkX3BhcmFtcy5sZW4gPSBzaXplb2YgZWRkX3BhcmFtczsKKworICAgICAgICAgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisJICAgIGlyZWcuZWF4LmJbMV0gPSAweDQ4OworCSAgICBpcmVnLmVkeC5iWzBdID0gZGV2bm87CisJICAgIGlyZWcuZHMgPSBTRUcoJmVkZF9wYXJhbXMpOworCSAgICBpcmVnLmVzaS53WzBdID0gT0ZGUygmZWRkX3BhcmFtcyk7CisJICAgIF9faW50Y2FsbCgweDEzLCAmaXJlZywgJm9yZWcpOworCisJICAgIGlmICghKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpICYmIG9yZWcuZWF4LmJbMV0gPT0gMCkgeworCQlpZiAoZWRkX3BhcmFtcy5sZW4gPCBzaXplb2YgZWRkX3BhcmFtcykKKwkJICAgIG1lbXNldCgoY2hhciAqKSZlZGRfcGFyYW1zICsgZWRkX3BhcmFtcy5sZW4sIDAsCisJCQkgICBzaXplb2YgZWRkX3BhcmFtcyAtIGVkZF9wYXJhbXMubGVuKTsKKworCQlpZiAoZWRkX3BhcmFtcy5zZWN0b3Jfc2l6ZSA+PSA1MTIgJiYKKwkJICAgIGlzX3Bvd2VyX29mXzIoZWRkX3BhcmFtcy5zZWN0b3Jfc2l6ZSkpCisJCSAgICBzZWN0b3Jfc2l6ZSA9IGVkZF9wYXJhbXMuc2VjdG9yX3NpemU7CisJICAgIH0KKwl9CisKKyAgICB9CisKKyAgICBkaXNrLmRpc2tfbnVtYmVyICAgPSBkZXZubzsKKyAgICBkaXNrLnNlY3Rvcl9zaXplICAgPSBzZWN0b3Jfc2l6ZTsKKyAgICBkaXNrLnNlY3Rvcl9zaGlmdCAgPSBpbG9nMihzZWN0b3Jfc2l6ZSk7CisgICAgZGlzay5wYXJ0X3N0YXJ0ICAgID0gcGFydF9zdGFydDsKKyAgICBkaXNrLnNlY3BlcmN5bCAgICAgPSBkaXNrLmggKiBkaXNrLnM7CisgICAgZGlzay5yZHdyX3NlY3RvcnMgID0gZWJpb3MgPyBlZGRfcmR3cl9zZWN0b3JzIDogY2hzX3Jkd3Jfc2VjdG9yczsKKworICAgIGlmICghTWF4VHJhbnNmZXIgfHwgTWF4VHJhbnNmZXIgPiBoYXJkX21heF90cmFuc2ZlcikKKwlNYXhUcmFuc2ZlciA9IGhhcmRfbWF4X3RyYW5zZmVyOworCisgICAgZGlzay5tYXh0cmFuc2ZlciAgID0gTWF4VHJhbnNmZXI7CisKKyAgICBkcHJpbnRmKCJkaXNrICUwMnggY2Ryb20gJWQgdHlwZSAlZCBzZWN0b3IgJXUvJXUgb2Zmc2V0ICVsbHUgbGltaXQgJXVcbiIsCisJICAgIGRldm5vLCBjZHJvbSwgZWJpb3MsIHNlY3Rvcl9zaXplLCBkaXNrLnNlY3Rvcl9zaGlmdCwKKwkgICAgcGFydF9zdGFydCwgZGlzay5tYXh0cmFuc2Zlcik7CisKKyAgICBkaXNrLnByaXZhdGUgPSBwcml2YXRlOworICAgIHJldHVybiAmZGlzazsKK30KKwordm9pZCBwbV9mc19pbml0KGNvbTMyc3lzX3QgKnJlZ3MpCit7CisJc3RhdGljIHN0cnVjdCBiaW9zX2Rpc2tfcHJpdmF0ZSBwcml2OworCisJcHJpdi5yZWdzID0gcmVnczsKKwlmc19pbml0KChjb25zdCBzdHJ1Y3QgZnNfb3BzICoqKXJlZ3MtPmVheC5sLCAodm9pZCAqKSZwcml2KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMvZXh0Mi9ibWFwLmMgYi9jb3JlL2ZzL2V4dDIvYm1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmJmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL2V4dDIvYm1hcC5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogVGhlIGxvZ2ljYWwgYmxvY2sgLT4gcGh5c2ljYWwgYmxvY2sgcm91dGluZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTGl1IEFsZWF4YW5kZXIgLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBmaWxlCisgKiBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxkaXNrLmg+CisjaW5jbHVkZSA8Y2FjaGUuaD4KKyNpbmNsdWRlICJleHQyX2ZzLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICoKK2V4dDRfZmluZF9sZWFmKHN0cnVjdCBmc19pbmZvICpmcywgY29uc3Qgc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWgsCisJICAgICAgIGJsb2NrX3QgYmxvY2spCit7CisgICAgc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaW5kZXg7CisgICAgYmxvY2tfdCBibGs7CisgICAgaW50IGk7CisKKyAgICB3aGlsZSAoMSkgeworCWlmIChlaC0+ZWhfbWFnaWMgIT0gRVhUNF9FWFRfTUFHSUMpCisJICAgIHJldHVybiBOVUxMOworCWlmIChlaC0+ZWhfZGVwdGggPT0gMCkKKwkgICAgcmV0dXJuIGVoOworCisJaW5kZXggPSBFWFQ0X0ZJUlNUX0lOREVYKGVoKTsKKwlmb3IgKGkgPSAwOyBpIDwgKGludCllaC0+ZWhfZW50cmllczsgaSsrKSB7CisJICAgIGlmIChibG9jayA8IGluZGV4W2ldLmVpX2Jsb2NrKQorCQlicmVhazsKKwl9CisJaWYgKC0taSA8IDApCisJICAgIHJldHVybiBOVUxMOworCisJYmxrID0gaW5kZXhbaV0uZWlfbGVhZl9oaTsKKwlibGsgPSAoYmxrIDw8IDMyKSArIGluZGV4W2ldLmVpX2xlYWZfbG87CisJZWggPSBnZXRfY2FjaGUoZnMtPmZzX2RldiwgYmxrKTsKKyAgICB9Cit9CisKKy8qIGhhbmRsZSB0aGUgZXh0NCBleHRlbnRzIHRvIGdldCB0aGUgcGhzaWNhbCBibG9jayBudW1iZXIgKi8KKy8qIFhYWDogc3RpbGwgbmVlZCB0byBoYW5kbGUgc3BhcnNlIGZpbGVzIHdpdGggZXh0ZW50cyAqLworc3RhdGljIGJsb2NrX3QKK2JtYXBfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVpbnQzMl90IGJsb2NrLCBzaXplX3QgKm5ibG9ja3MpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gaW5vZGUtPmZzOworICAgIGNvbnN0IHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmxlYWY7CisgICAgY29uc3Qgc3RydWN0IGV4dDRfZXh0ZW50ICpleHQ7CisgICAgaW50IGk7CisgICAgYmxvY2tfdCBzdGFydDsKKworICAgIGxlYWYgPSBleHQ0X2ZpbmRfbGVhZihmcywgJlBWVChpbm9kZSktPmlfZXh0ZW50X2hkciwgYmxvY2spOworICAgIGlmICghbGVhZikgeworCXByaW50ZigiRVJST1IsIGV4dGVudCBsZWFmIG5vdCBmb3VuZFxuIik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgZXh0ID0gRVhUNF9GSVJTVF9FWFRFTlQobGVhZik7CisgICAgZm9yIChpID0gMDsgaSA8IGxlYWYtPmVoX2VudHJpZXM7IGkrKykgeworCWlmIChibG9jayA8IGV4dFtpXS5lZV9ibG9jaykKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgtLWkgPCAwKSB7CisJcHJpbnRmKCJFUlJPUiwgbm90IGZpbmQgdGhlIHJpZ2h0IGJsb2NrXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBnb3QgaXQgKi8KKyAgICBibG9jayAtPSBleHRbaV0uZWVfYmxvY2s7CisgICAgaWYgKGJsb2NrID49IGV4dFtpXS5lZV9sZW4pCisJcmV0dXJuIDA7CisgICAgc3RhcnQgPSAoKGJsb2NrX3QpZXh0W2ldLmVlX3N0YXJ0X2hpIDw8IDMyKSArIGV4dFtpXS5lZV9zdGFydF9sbzsKKworICAgIGlmIChuYmxvY2tzKQorCSpuYmxvY2tzID0gZXh0W2ldLmVlX2xlbiAtIGJsb2NrOworCisgICAgcmV0dXJuIHN0YXJ0ICsgYmxvY2s7Cit9CisKKy8qCisgKiBTY2FuIGZvcndhcmQgaW4gYSByYW5nZSBvZiBibG9ja3MgdG8gc2VlIGlmIHRoZXkgYXJlIGNvbnRpZ3VvdXMsCisgKiB0aGVuIHJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZS4KKyAqLworc3RhdGljIHVpbnQzMl90CitzY2FuX3NldF9uYmxvY2tzKGNvbnN0IHVpbnQzMl90ICptYXAsIHVuc2lnbmVkIGludCBjb3VudCwgc2l6ZV90ICpuYmxvY2tzKQoreworICAgIHVpbnQzMl90IGJsayA9ICptYXA7CisKKyAgICBpZiAobmJsb2NrcykgeworCXVpbnQzMl90IHNraXAgPSBibGsgPyAxIDogMDsKKwl1aW50MzJfdCBuZXh0ID0gYmxrICsgc2tpcDsKKwlzaXplX3QgICBjbnQgPSAxOworCisJd2hpbGUgKC0tY291bnQpIHsKKwkgICAgbWFwKys7CisJICAgIGlmICgqbWFwID09IG5leHQpIHsKKwkJY250Kys7CisJCW5leHQgKz0gc2tpcDsKKwkgICAgfSBlbHNlIHsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKwkqbmJsb2NrcyA9IGNudDsKKyAgICB9CisKKyAgICByZXR1cm4gYmxrOworfQorCisvKgorICogVGhlIGFjdHVhbCBpbmRpcmVjdCBibG9jayBtYXAgaGFuZGxpbmcgLSB0aGUgYmxvY2sgcGFzc2VkIGluIHNob3VsZAorICogYmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFydGljdWxhciBibG9jayBoaWVyYXJjaHkuCisgKi8KK3N0YXRpYyBibG9ja190CitibWFwX2luZGlyZWN0KHN0cnVjdCBmc19pbmZvICpmcywgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGJsb2NrLAorCSAgICAgIGludCBsZXZlbHMsIHNpemVfdCAqbmJsb2NrcykKK3sKKyAgICBpbnQgYWRkcl9zaGlmdCA9IEJMT0NLX1NISUZUKGZzKSAtIDI7CisgICAgdWludDMyX3QgYWRkcl9jb3VudCA9IDEgPDwgYWRkcl9zaGlmdDsKKyAgICBjb25zdCB1aW50MzJfdCAqYmxrID0gTlVMTDsKKyAgICB1aW50MzJfdCBpbmRleCA9IDA7CisKKyAgICB3aGlsZSAobGV2ZWxzLS0pIHsKKwlpZiAoIXN0YXJ0KSB7CisJICAgIGlmIChuYmxvY2tzKQorCQkqbmJsb2NrcyA9IGFkZHJfY291bnQgPDwgKGxldmVscyAqIGFkZHJfc2hpZnQpOworCSAgICByZXR1cm4gMDsKKwl9CisJYmxrID0gZ2V0X2NhY2hlKGZzLT5mc19kZXYsIHN0YXJ0KTsKKwlpbmRleCA9IChibG9jayA+PiAobGV2ZWxzICogYWRkcl9zaGlmdCkpICYgKGFkZHJfY291bnQgLSAxKTsKKwlzdGFydCA9IGJsa1tpbmRleF07CisgICAgfQorCisgICAgcmV0dXJuIHNjYW5fc2V0X25ibG9ja3MoYmxrICsgaW5kZXgsIGFkZHJfY291bnQgLSBpbmRleCwgbmJsb2Nrcyk7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlIHRyYWRpdGlvbmFsIGJsb2NrIG1hcCwgbGlrZSBpbmRpcmVjdCwgZG91YmxlIGluZGlyZWN0CisgKiBhbmQgdHJpcGxlIGluZGlyZWN0CisgKi8KK3N0YXRpYyBibG9ja190CitibWFwX3RyYWRpdGlvbmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJsb2NrX3QgYmxvY2ssIHNpemVfdCAqbmJsb2NrcykKK3sKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBpbm9kZS0+ZnM7CisgICAgY29uc3QgdWludDMyX3QgYWRkcl9wZXJfYmxvY2sgPSBCTE9DS19TSVpFKGZzKSA+PiAyOworICAgIGNvbnN0IGludCBzaGZ0X3Blcl9ibG9jayAgICAgID0gQkxPQ0tfU0hJRlQoZnMpIC0gMjsKKyAgICBjb25zdCB1aW50MzJfdCBkaXJlY3RfYmxvY2tzICAgPSBFWFQyX05ESVJfQkxPQ0tTOworICAgIGNvbnN0IHVpbnQzMl90IGluZGlyZWN0X2Jsb2NrcyA9IGFkZHJfcGVyX2Jsb2NrOworICAgIGNvbnN0IHVpbnQzMl90IGRvdWJsZV9ibG9ja3MgICA9IGFkZHJfcGVyX2Jsb2NrIDw8IHNoZnRfcGVyX2Jsb2NrOworICAgIGNvbnN0IHVpbnQzMl90IHRyaXBsZV9ibG9ja3MgICA9IGRvdWJsZV9ibG9ja3MgIDw8IHNoZnRfcGVyX2Jsb2NrOworCisgICAgLyogZGlyZWN0IGJsb2NrcyAqLworICAgIGlmIChibG9jayA8IGRpcmVjdF9ibG9ja3MpCisJcmV0dXJuIHNjYW5fc2V0X25ibG9ja3MoJlBWVChpbm9kZSktPmlfYmxvY2tbYmxvY2tdLAorCQkJCWRpcmVjdF9ibG9ja3MgLSBibG9jaywgbmJsb2Nrcyk7CisKKyAgICAvKiBpbmRpcmVjdCBibG9ja3MgKi8KKyAgICBibG9jayAtPSBkaXJlY3RfYmxvY2tzOworICAgIGlmIChibG9jayA8IGluZGlyZWN0X2Jsb2NrcykKKwlyZXR1cm4gYm1hcF9pbmRpcmVjdChmcywgUFZUKGlub2RlKS0+aV9ibG9ja1tFWFQyX0lORF9CTE9DS10sCisJCQkgICAgIGJsb2NrLCAxLCBuYmxvY2tzKTsKKworICAgIC8qIGRvdWJsZSBpbmRpcmVjdCBibG9ja3MgKi8KKyAgICBibG9jayAtPSBpbmRpcmVjdF9ibG9ja3M7CisgICAgaWYgKGJsb2NrIDwgZG91YmxlX2Jsb2NrcykKKwlyZXR1cm4gYm1hcF9pbmRpcmVjdChmcywgUFZUKGlub2RlKS0+aV9ibG9ja1tFWFQyX0RJTkRfQkxPQ0tdLAorCQkJICAgICBibG9jaywgMiwgbmJsb2Nrcyk7CisKKyAgICAvKiB0cmlwbGUgaW5kaXJlY3QgYmxvY2sgKi8KKyAgICBibG9jayAtPSBkb3VibGVfYmxvY2tzOworICAgIGlmIChibG9jayA8IHRyaXBsZV9ibG9ja3MpCisJcmV0dXJuIGJtYXBfaW5kaXJlY3QoZnMsIFBWVChpbm9kZSktPmlfYmxvY2tbRVhUMl9USU5EX0JMT0NLXSwKKwkJCSAgICAgYmxvY2ssIDMsIG5ibG9ja3MpOworCisgICAgLyogVGhpcyBjYW4ndCBoYXBwZW4uLi4gKi8KKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIE1hcCB0aGUgbG9naWNhbCBibG9jayB0byBwaHlzaWMgYmxvY2sgd2hlcmUgdGhlIGZpbGUgZGF0YSBzdG9yZXMuCisgKiBJbiBFWFQ0LCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gaGFuZGxlIHRoZSBtYXAgcHJvY2VzcywgZXh0ZW50cyBhbmQgaW5kaXJlY3QuCisgKiBFWFQ0IHVzZXMgYSBpbm9kZSBmbGFnIHRvIG1hcmsgZXh0ZW50IGZpbGUgYW5kIGluZGlyZWN0IGJsb2NrIGZpbGUuCisgKgorICogQGZzOiAgICAgIHRoZSBmc19pbmZvIHN0cnVjdHVyZS4KKyAqIEBpbm9kZTogICB0aGUgaW5vZGUgc3RydWN0dXJlLgorICogQGJsb2NrOiAgIHRoZSBsb2dpY2FsIGJsb2NrIHRvIGJlIG1hcHBlZC4KKyAqIEBuYmxvY2tzOiBvcHRpb25hbCBwb2ludGVyIHRvIG51bWJlciBvZiBjb250aWd1b3VzIGJsb2NrcyAobG93IGVzdGltYXRlKQorICogQHJldHJ1bjogIHRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIuCisgKgorICovCitibG9ja190IGV4dDJfYm1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBibG9ja190IGJsb2NrLCBzaXplX3QgKm5ibG9ja3MpCit7CisgICAgYmxvY2tfdCByZXQ7CisKKyAgICBpZiAoaW5vZGUtPmZsYWdzICYgRVhUNF9FWFRFTlRTX0ZMQUcpCisJcmV0ID0gYm1hcF9leHRlbnQoaW5vZGUsIGJsb2NrLCBuYmxvY2tzKTsKKyAgICBlbHNlCisJcmV0ID0gYm1hcF90cmFkaXRpb25hbChpbm9kZSwgYmxvY2ssIG5ibG9ja3MpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKgorICogTmV4dCBleHRlbnQgZm9yIGdldGZzc2VjCisgKi8KK2ludCBleHQyX25leHRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVpbnQzMl90IGxzdGFydCkKK3sKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBpbm9kZS0+ZnM7CisgICAgaW50IGJsa3Rvc2VjID0gIEJMT0NLX1NISUZUKGZzKSAtIFNFQ1RPUl9TSElGVChmcyk7CisgICAgaW50IGJsa21hc2sgPSAoMSA8PCBibGt0b3NlYykgLSAxOworICAgIGJsb2NrX3QgYmxvY2s7CisgICAgc2l6ZV90IG5ibG9ja3MgPSAwOworCisgICAgYmxvY2sgPSBleHQyX2JtYXAoaW5vZGUsIGxzdGFydCA+PiBibGt0b3NlYywgJm5ibG9ja3MpOworCisgICAgaWYgKCFibG9jaykKKwlpbm9kZS0+bmV4dF9leHRlbnQucHN0YXJ0ID0gRVhURU5UX1pFUk87CisgICAgZWxzZQorCWlub2RlLT5uZXh0X2V4dGVudC5wc3RhcnQgPQorCSAgICAoKHNlY3Rvcl90KWJsb2NrIDw8IGJsa3Rvc2VjKSB8IChsc3RhcnQgJiBibGttYXNrKTsKKworICAgIGlub2RlLT5uZXh0X2V4dGVudC5sZW4gPSAobmJsb2NrcyA8PCBibGt0b3NlYykgLSAobHN0YXJ0ICYgYmxrbWFzayk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL2V4dDIvZXh0Mi5jIGIvY29yZS9mcy9leHQyL2V4dDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJkMWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9leHQyL2V4dDIuYwpAQCAtMCwwICsxLDM3OCBAQAorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9kaXJlbnQuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkaXNrLmgiCisjaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisKKy8qCisgKiBDb252ZXJ0IGFuIGV4dDIgZmlsZSB0eXBlIHRvIHRoZSBnbG9iYWwgdmFsdWVzCisgKi8KK3N0YXRpYyBlbnVtIGRpcmVudF90eXBlIGV4dDJfY3Z0X3R5cGUodW5zaWduZWQgaW50IGRfZmlsZV90eXBlKQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIGRpcmVudF90eXBlIGlub2RlX3R5cGVbXSA9IHsKKwlEVF9VTktOT1dOLCBEVF9SRUcsIERUX0RJUiwgRFRfQ0hSLAorCURUX0JMSywgRFRfRklGTywgRFRfU09DSywgRFRfTE5LLAorICAgIH07CisKKyAgICBpZiAoZF9maWxlX3R5cGUgPiBzaXplb2YgaW5vZGVfdHlwZSAvIHNpemVvZiAqaW5vZGVfdHlwZSkKKwlyZXR1cm4gRFRfVU5LTk9XTjsKKyAgICBlbHNlCisJcmV0dXJuIGlub2RlX3R5cGVbZF9maWxlX3R5cGVdOworfQorCisvKgorICogZ2V0IHRoZSBncm91cCdzIGRlc2NyaXB0b3Igb2YgZ3JvdXBfbnVtCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICoKK2V4dDJfZ2V0X2dyb3VwX2Rlc2Moc3RydWN0IGZzX2luZm8gKmZzLCB1aW50MzJfdCBncm91cF9udW0pCit7CisgICAgc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihmcyk7CisgICAgdWludDMyX3QgZGVzY19ibG9jaywgZGVzY19pbmRleDsKKyAgICBjb25zdCBzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpkZXNjX2RhdGFfYmxvY2s7CisKKyAgICBpZiAoZ3JvdXBfbnVtID49IHNiaS0+c19ncm91cHNfY291bnQpIHsKKwlwcmludGYgKCJleHQyX2dldF9ncm91cF9kZXNjIgorCQkiYmxvY2tfZ3JvdXAgPj0gZ3JvdXBzX2NvdW50IC0gIgorCQkiYmxvY2tfZ3JvdXAgPSAlZCwgZ3JvdXBzX2NvdW50ID0gJWQiLAorCQlncm91cF9udW0sIHNiaS0+c19ncm91cHNfY291bnQpOworCisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZGVzY19ibG9jayA9IGdyb3VwX251bSAvIHNiaS0+c19kZXNjX3Blcl9ibG9jazsKKyAgICBkZXNjX2luZGV4ID0gZ3JvdXBfbnVtICUgc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrOworCisgICAgZGVzY19ibG9jayArPSBzYmktPnNfZmlyc3RfZGF0YV9ibG9jayArIDE7CisKKyAgICBkZXNjX2RhdGFfYmxvY2sgPSBnZXRfY2FjaGUoZnMtPmZzX2RldiwgZGVzY19ibG9jayk7CisgICAgcmV0dXJuICZkZXNjX2RhdGFfYmxvY2tbZGVzY19pbmRleF07Cit9CisKKy8qCisgKiBVbmxpa2Ugc3RybmNtcCwgZXh0Ml9tYXRjaF9lbnRyeSByZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBleHQyX21hdGNoX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKiBkZSkKK3sKKyAgICBpZiAoIWRlLT5kX2lub2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGxlbiAhPSBkZS0+ZF9uYW1lX2xlbikKKwlyZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICFtZW1jbXAobmFtZSwgZGUtPmRfbmFtZSwgbGVuKTsKK30KKworCisvKgorICogcCBpcyBhdCBsZWFzdCA2IGJ5dGVzIGJlZm9yZSB0aGUgZW5kIG9mIHBhZ2UKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmV4dDJfbmV4dF9lbnRyeShzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKnApCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikoKGNoYXIqKXAgKyBwLT5kX3JlY19sZW4pOworfQorCisvKgorICogTWFwIGEgbG9naWNhbCBzZWN0b3IgYW5kIGxvYWQgaXQgaW50byB0aGUgY2FjaGUKKyAqLworc3RhdGljIGNvbnN0IHZvaWQgKgorZXh0Ml9nZXRfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgYmxvY2tfdCBsYmxvY2spCit7CisgICAgYmxvY2tfdCBwYmxvY2sgPSBleHQyX2JtYXAoaW5vZGUsIGxibG9jaywgTlVMTCk7CisgICAgcmV0dXJuIGdldF9jYWNoZShpbm9kZS0+ZnMtPmZzX2RldiwgcGJsb2NrKTsKK30KKworLyoKKyAqIGZpbmQgYSBkaXIgZW50cnksIHJldHVybiBpdCBpZiBmb3VuZCwgb3IgcmV0dXJuIE5VTEwuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKgorZXh0Ml9maW5kX2VudHJ5KHN0cnVjdCBmc19pbmZvICpmcywgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqZG5hbWUpCit7CisgICAgYmxvY2tfdCBpbmRleCA9IDA7CisgICAgdWludDMyX3QgaSA9IDAsIG9mZnNldCwgbWF4b2Zmc2V0OworICAgIGNvbnN0IHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGU7CisgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICBzaXplX3QgZG5hbWVfbGVuID0gc3RybGVuKGRuYW1lKTsKKworICAgIHdoaWxlIChpIDwgaW5vZGUtPnNpemUpIHsKKwlkYXRhID0gZXh0Ml9nZXRfY2FjaGUoaW5vZGUsIGluZGV4KyspOworCW9mZnNldCA9IDA7CisJbWF4b2Zmc2V0ID0gIG1pbihCTE9DS19TSVpFKGZzKSwgaS1pbm9kZS0+c2l6ZSk7CisKKwkvKiBUaGUgc21hbGxlc3QgcG9zc2libGUgc2l6ZSBpcyA5IGJ5dGVzICovCisJd2hpbGUgKG9mZnNldCA8IG1heG9mZnNldC04KSB7CisJICAgIGRlID0gKGNvbnN0IHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKShkYXRhICsgb2Zmc2V0KTsKKwkgICAgaWYgKGRlLT5kX3JlY19sZW4gPiBtYXhvZmZzZXQgLSBvZmZzZXQpCisJCWJyZWFrOworCisJICAgIGlmIChleHQyX21hdGNoX2VudHJ5KGRuYW1lLCBkbmFtZV9sZW4sIGRlKSkKKwkJcmV0dXJuIGRlOworCisJICAgIG9mZnNldCArPSBkZS0+ZF9yZWNfbGVuOworCX0KKwlpICs9IEJMT0NLX1NJWkUoZnMpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV4dDJfaW5vZGUgKgorZXh0Ml9nZXRfaW5vZGUoc3RydWN0IGZzX2luZm8gKmZzLCBpbnQgaW5yKQoreworICAgIGNvbnN0IHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmRlc2M7CisgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICB1aW50MzJfdCBpbm9kZV9ncm91cCwgaW5vZGVfb2Zmc2V0OworICAgIHVpbnQzMl90IGJsb2NrX251bSwgYmxvY2tfb2ZmOworCisgICAgaW5yLS07CisgICAgaW5vZGVfZ3JvdXAgID0gaW5yIC8gRVhUMl9JTk9ERVNfUEVSX0dST1VQKGZzKTsKKyAgICBpbm9kZV9vZmZzZXQgPSBpbnIgJSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMpOworICAgIGRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjKGZzLCBpbm9kZV9ncm91cCk7CisgICAgaWYgKCFkZXNjKQorCXJldHVybiBOVUxMOworCisgICAgYmxvY2tfbnVtID0gZGVzYy0+YmdfaW5vZGVfdGFibGUgKworCWlub2RlX29mZnNldCAvIEVYVDJfSU5PREVTX1BFUl9CTE9DSyhmcyk7CisgICAgYmxvY2tfb2ZmID0gaW5vZGVfb2Zmc2V0ICUgRVhUMl9JTk9ERVNfUEVSX0JMT0NLKGZzKTsKKworICAgIGRhdGEgPSBnZXRfY2FjaGUoZnMtPmZzX2RldiwgYmxvY2tfbnVtKTsKKworICAgIHJldHVybiAoY29uc3Qgc3RydWN0IGV4dDJfaW5vZGUgKikKKwkoZGF0YSArIGJsb2NrX29mZiAqIEVYVDJfU0IoZnMpLT5zX2lub2RlX3NpemUpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHN0cnVjdCBleHQyX2lub2RlICplX2lub2RlKQoreworICAgIGlub2RlLT5tb2RlICAgID0gSUZUT0RUKGVfaW5vZGUtPmlfbW9kZSk7CisgICAgaW5vZGUtPnNpemUgICAgPSBlX2lub2RlLT5pX3NpemU7CisgICAgaW5vZGUtPmF0aW1lICAgPSBlX2lub2RlLT5pX2F0aW1lOworICAgIGlub2RlLT5jdGltZSAgID0gZV9pbm9kZS0+aV9jdGltZTsKKyAgICBpbm9kZS0+bXRpbWUgICA9IGVfaW5vZGUtPmlfbXRpbWU7CisgICAgaW5vZGUtPmR0aW1lICAgPSBlX2lub2RlLT5pX2R0aW1lOworICAgIGlub2RlLT5ibG9ja3MgID0gZV9pbm9kZS0+aV9ibG9ja3M7CisgICAgaW5vZGUtPmZsYWdzICAgPSBlX2lub2RlLT5pX2ZsYWdzOworICAgIGlub2RlLT5maWxlX2FjbCA9IGVfaW5vZGUtPmlfZmlsZV9hY2w7CisgICAgbWVtY3B5KFBWVChpbm9kZSktPmlfYmxvY2ssIGVfaW5vZGUtPmlfYmxvY2ssIHNpemVvZiBQVlQoaW5vZGUpLT5pX2Jsb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0Ml9pZ2V0X2J5X2lucihzdHJ1Y3QgZnNfaW5mbyAqZnMsIHVpbnQzMl90IGlucikKK3sKKyAgICBjb25zdCBzdHJ1Y3QgZXh0Ml9pbm9kZSAqZV9pbm9kZTsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisgICAgZV9pbm9kZSA9IGV4dDJfZ2V0X2lub2RlKGZzLCBpbnIpOworICAgIGlmICghZV9pbm9kZSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmICghKGlub2RlID0gYWxsb2NfaW5vZGUoZnMsIGluciwgc2l6ZW9mKHN0cnVjdCBleHQyX3B2dF9pbm9kZSkpKSkKKwlyZXR1cm4gTlVMTDsKKyAgICBmaWxsX2lub2RlKGlub2RlLCBlX2lub2RlKTsKKworICAgIHJldHVybiBpbm9kZTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0Ml9pZ2V0X3Jvb3Qoc3RydWN0IGZzX2luZm8gKmZzKQoreworICAgIHJldHVybiBleHQyX2lnZXRfYnlfaW5yKGZzLCBFWFQyX1JPT1RfSU5PKTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0Ml9pZ2V0KGNvbnN0IGNoYXIgKmRuYW1lLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRlOworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IHBhcmVudC0+ZnM7CisKKyAgICBkZSA9IGV4dDJfZmluZF9lbnRyeShmcywgcGFyZW50LCBkbmFtZSk7CisgICAgaWYgKCFkZSkKKwlyZXR1cm4gTlVMTDsKKyAgICAKKyAgICByZXR1cm4gZXh0Ml9pZ2V0X2J5X2lucihmcywgZGUtPmRfaW5vZGUpOworfQorCisvKgorICogUmVhZCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIGFuIGlub2RlIGludG8gYSBtZW1vcnkgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgY2FjaGVfZ2V0X2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqYnVmLCBzaXplX3QgYnl0ZXMpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gaW5vZGUtPmZzOworICAgIHNpemVfdCBibG9ja19zaXplID0gQkxPQ0tfU0laRShmcyk7CisgICAgdWludDMyX3QgaW5kZXggPSAwOwkJLyogTG9naWNhbCBibG9jayBudW1iZXIgKi8KKyAgICBzaXplX3QgY2h1bms7CisgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICBjaGFyICpwID0gYnVmOworCisgICAgaWYgKGlub2RlLT5zaXplID4gYnl0ZXMpCisJYnl0ZXMgPSBpbm9kZS0+c2l6ZTsKKworICAgIHdoaWxlIChieXRlcykgeworCWNodW5rID0gbWluKGJ5dGVzLCBibG9ja19zaXplKTsKKwlkYXRhID0gZXh0Ml9nZXRfY2FjaGUoaW5vZGUsIGluZGV4KyspOworCW1lbWNweShwLCBkYXRhLCBjaHVuayk7CisKKwlieXRlcyAtPSBjaHVuazsKKwlwICs9IGNodW5rOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCQorc3RhdGljIGludCBleHQyX3JlYWRsaW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZikKK3sKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBpbm9kZS0+ZnM7CisgICAgaW50IHNlY19wZXJfYmxvY2sgPSAxIDw8IChmcy0+YmxvY2tfc2hpZnQgLSBmcy0+c2VjdG9yX3NoaWZ0KTsKKyAgICBib29sIGZhc3Rfc3ltbGluazsKKworICAgIGlmIChpbm9kZS0+c2l6ZSA+IEJMT0NLX1NJWkUoZnMpKQorCXJldHVybiAtMTsJCS8qIEVycm9yISAqLworCisgICAgZmFzdF9zeW1saW5rID0gKGlub2RlLT5maWxlX2FjbCA/IHNlY19wZXJfYmxvY2sgOiAwKSA9PSBpbm9kZS0+YmxvY2tzOworICAgIGlmIChmYXN0X3N5bWxpbmspCisJbWVtY3B5KGJ1ZiwgUFZUKGlub2RlKS0+aV9ibG9jaywgaW5vZGUtPnNpemUpOworICAgIGVsc2UKKwljYWNoZV9nZXRfZmlsZShpbm9kZSwgYnVmLCBpbm9kZS0+c2l6ZSk7CisKKyAgICByZXR1cm4gaW5vZGUtPnNpemU7Cit9CisKKy8qCisgKiBSZWFkIG9uZSBkaXJlY3RvcnkgZW50cnkgYXQgYSB0aW1lCisgKi8KK3N0YXRpYyBpbnQgZXh0Ml9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyZW50ICpkaXJlbnQpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gZmlsZS0+ZnM7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmlub2RlOworICAgIGNvbnN0IHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGU7CisgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICBibG9ja190IGluZGV4ID0gZmlsZS0+b2Zmc2V0ID4+IGZzLT5ibG9ja19zaGlmdDsKKworICAgIGlmIChmaWxlLT5vZmZzZXQgPj0gaW5vZGUtPnNpemUpCisJcmV0dXJuIC0xOwkJLyogRW5kIG9mIGZpbGUgKi8KKworICAgIGRhdGEgPSBleHQyX2dldF9jYWNoZShpbm9kZSwgaW5kZXgpOworICAgIGRlID0gKGNvbnN0IHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKQorCShkYXRhICsgKGZpbGUtPm9mZnNldCAmIChCTE9DS19TSVpFKGZzKSAtIDEpKSk7CisKKyAgICBkaXJlbnQtPmRfaW5vID0gZGUtPmRfaW5vZGU7CisgICAgZGlyZW50LT5kX29mZiA9IGZpbGUtPm9mZnNldDsKKyAgICBkaXJlbnQtPmRfcmVjbGVuID0gb2Zmc2V0b2Yoc3RydWN0IGRpcmVudCwgZF9uYW1lKSArIGRlLT5kX25hbWVfbGVuICsgMTsKKyAgICBkaXJlbnQtPmRfdHlwZSA9IGV4dDJfY3Z0X3R5cGUoZGUtPmRfZmlsZV90eXBlKTsKKyAgICBtZW1jcHkoZGlyZW50LT5kX25hbWUsIGRlLT5kX25hbWUsIGRlLT5kX25hbWVfbGVuKTsKKyAgICBkaXJlbnQtPmRfbmFtZVtkZS0+ZF9uYW1lX2xlbl0gPSAnXDAnOworCisgICAgZmlsZS0+b2Zmc2V0ICs9IGRlLT5kX3JlY19sZW47ICAvKiBVcGRhdGUgZm9yIG5leHQgcmVhZGluZyAqLworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpbml0LiB0aGUgZnMgbWV0YSBkYXRhLCByZXR1cm4gdGhlIGJsb2NrIHNpemUgYml0cy4KKyAqLworc3RhdGljIGludCBleHQyX2ZzX2luaXQoc3RydWN0IGZzX2luZm8gKmZzKQoreworICAgIHN0cnVjdCBkaXNrICpkaXNrID0gZnMtPmZzX2Rldi0+ZGlzazsKKyAgICBzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmk7CisgICAgc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgc2I7CisgICAgc3RydWN0IGNhY2hlICpjczsKKworICAgIC8qIHJlYWQgdGhlIHN1cGVyIGJsb2NrICovCisgICAgZGlzay0+cmR3cl9zZWN0b3JzKGRpc2ssICZzYiwgMiwgMiwgMCk7CisKKyAgICAvKiBjaGVjayBpZiBpdCBpcyBleHQyLCBzaW5jZSB3ZSBhbHNvIHN1cHBvcnQgYnRyZnMgbm93ICovCisgICAgaWYgKHNiLnNfbWFnaWMgIT0gRVhUMl9TVVBFUl9NQUdJQykKKwlyZXR1cm4gLTE7CisKKyAgICBzYmkgPSBtYWxsb2Moc2l6ZW9mKCpzYmkpKTsKKyAgICBpZiAoIXNiaSkgeworCW1hbGxvY19lcnJvcigiZXh0Ml9zYl9pbmZvIHN0cnVjdHVyZSIpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgZnMtPmZzX2luZm8gPSBzYmk7CisKKyAgICBpZiAoc2Iuc19tYWdpYyAhPSBFWFQyX1NVUEVSX01BR0lDKSB7CisJcHJpbnRmKCJleHQyIG1vdW50IGVycm9yOiBpdCdzIG5vdCBhIEVYVDIvMy80IGZpbGUgc3lzdGVtIVxuIik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgZnMtPnNlY3Rvcl9zaGlmdCA9IGRpc2stPnNlY3Rvcl9zaGlmdDsKKyAgICBmcy0+YmxvY2tfc2hpZnQgID0gc2Iuc19sb2dfYmxvY2tfc2l6ZSArIDEwOworICAgIGZzLT5zZWN0b3Jfc2l6ZSAgPSAxIDw8IGZzLT5zZWN0b3Jfc2hpZnQ7CisgICAgZnMtPmJsb2NrX3NpemUgICA9IDEgPDwgZnMtPmJsb2NrX3NoaWZ0OworCisgICAgc2JpLT5zX2lub2Rlc19wZXJfZ3JvdXAgPSBzYi5zX2lub2Rlc19wZXJfZ3JvdXA7CisgICAgc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPSBzYi5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisgICAgc2JpLT5zX2lub2Rlc19wZXJfYmxvY2sgPSBCTE9DS19TSVpFKGZzKSAvIHNiLnNfaW5vZGVfc2l6ZTsKKyAgICBpZiAoc2Iuc19kZXNjX3NpemUgPCBzaXplb2Yoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYykpCisJc2Iuc19kZXNjX3NpemUgPSBzaXplb2Yoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyk7CisgICAgc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrICAgPSBCTE9DS19TSVpFKGZzKSAvIHNiLnNfZGVzY19zaXplOworICAgIHNiaS0+c19ncm91cHNfY291bnQgICAgID0gKHNiLnNfYmxvY2tzX2NvdW50IC0gc2Iuc19maXJzdF9kYXRhX2Jsb2NrCisJCQkgICAgICAgKyBFWFQyX0JMT0NLU19QRVJfR1JPVVAoZnMpIC0gMSkKKwkgICAgICAgICAgICAgICAgICAgICAgLyBFWFQyX0JMT0NLU19QRVJfR1JPVVAoZnMpOworICAgIHNiaS0+c19maXJzdF9kYXRhX2Jsb2NrID0gc2Iuc19maXJzdF9kYXRhX2Jsb2NrOworICAgIHNiaS0+c19pbm9kZV9zaXplID0gc2Iuc19pbm9kZV9zaXplOworCisgICAgLyogVm9sdW1lIFVVSUQgKi8KKyAgICBtZW1jcHkoc2JpLT5zX3V1aWQsIHNiLnNfdXVpZCwgc2l6ZW9mKHNiaS0+c191dWlkKSk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBjYWNoZSwgYW5kIGZvcmNlIGJsb2NrIHplcm8gdG8gYWxsIHplcm8gKi8KKyAgICBjYWNoZV9pbml0KGZzLT5mc19kZXYsIGZzLT5ibG9ja19zaGlmdCk7CisgICAgY3MgPSBfZ2V0X2NhY2hlX2Jsb2NrKGZzLT5mc19kZXYsIDApOworICAgIG1lbXNldChjcy0+ZGF0YSwgMCwgZnMtPmJsb2NrX3NpemUpOworICAgIGNhY2hlX2xvY2tfYmxvY2soY3MpOworCisgICAgcmV0dXJuIGZzLT5ibG9ja19zaGlmdDsKK30KKworI2RlZmluZSBFWFQyX1VVSURfTEVOICg0ICsgNCArIDEgKyA0ICsgMSArIDQgKyAxICsgNCArIDEgKyA0ICsgNCArIDQgKyAxKQorc3RhdGljIGNoYXIgKmV4dDJfZnNfdXVpZChzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgY2hhciAqdXVpZCA9IE5VTEw7CisKKyAgICB1dWlkID0gbWFsbG9jKEVYVDJfVVVJRF9MRU4pOworICAgIGlmICghdXVpZCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChzbnByaW50Zih1dWlkLCBFWFQyX1VVSURfTEVOLAorICAgICAgICAgICAgICAgICAgIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFswXSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFsxXSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFsyXSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFszXSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFs0XSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFs1XSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFs2XSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFs3XSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFs4XSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFs5XSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFsxMF0sCisJICAgICAgICAgIEVYVDJfU0IoZnMpLT5zX3V1aWRbMTFdLAorCSAgICAgICAgICBFWFQyX1NCKGZzKS0+c191dWlkWzEyXSwKKwkgICAgICAgICAgRVhUMl9TQihmcyktPnNfdXVpZFsxM10sCisJICAgICAgICAgIEVYVDJfU0IoZnMpLT5zX3V1aWRbMTRdLAorCSAgICAgICAgICBFWFQyX1NCKGZzKS0+c191dWlkWzE1XQorCSAgICAgICAgICApIDwgMCkgeworCWZyZWUodXVpZCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHV1aWQ7Cit9CisKK2NvbnN0IHN0cnVjdCBmc19vcHMgZXh0Ml9mc19vcHMgPSB7CisgICAgLmZzX25hbWUgICAgICAgPSAiZXh0MiIsCisgICAgLmZzX2ZsYWdzICAgICAgPSBGU19USElTSU5EIHwgRlNfVVNFTUVNLAorICAgIC5mc19pbml0ICAgICAgID0gZXh0Ml9mc19pbml0LAorICAgIC5zZWFyY2hkaXIgICAgID0gTlVMTCwKKyAgICAuZ2V0ZnNzZWMgICAgICA9IGdlbmVyaWNfZ2V0ZnNzZWMsCisgICAgLmNsb3NlX2ZpbGUgICAgPSBnZW5lcmljX2Nsb3NlX2ZpbGUsCisgICAgLm1hbmdsZV9uYW1lICAgPSBnZW5lcmljX21hbmdsZV9uYW1lLAorICAgIC5jaGRpcl9zdGFydCAgID0gZ2VuZXJpY19jaGRpcl9zdGFydCwKKyAgICAub3Blbl9jb25maWcgICA9IGdlbmVyaWNfb3Blbl9jb25maWcsCisgICAgLmlnZXRfcm9vdCAgICAgPSBleHQyX2lnZXRfcm9vdCwKKyAgICAuaWdldCAgICAgICAgICA9IGV4dDJfaWdldCwKKyAgICAucmVhZGxpbmsgICAgICA9IGV4dDJfcmVhZGxpbmssCisgICAgLnJlYWRkaXIgICAgICAgPSBleHQyX3JlYWRkaXIsCisgICAgLm5leHRfZXh0ZW50ICAgPSBleHQyX25leHRfZXh0ZW50LAorICAgIC5mc191dWlkICAgICAgID0gZXh0Ml9mc191dWlkLAorfTsKZGlmZiAtLWdpdCBhL2NvcmUvZnMvZXh0Mi9leHQyX2ZzLmggYi9jb3JlL2ZzL2V4dDIvZXh0Ml9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwM2E5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL2V4dDIvZXh0Ml9mcy5oCkBAIC0wLDAgKzEsMzExIEBACisjaWZuZGVmIF9fRVhUMl9GU19ICisjZGVmaW5lIF9fRVhUMl9GU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZQlFWFQyX1NVUEVSX01BR0lDCTB4RUY1MworCisjZGVmaW5lIEVYVDJfR09PRF9PTERfUkVWICAgICAgIDAgICAgICAgLy8gVGhlIGdvb2Qgb2xkIChvcmlnaW5hbCkgZm9ybWF0CisjZGVmaW5lIEVYVDJfRFlOQU1JQ19SRVYgICAgICAgIDEgICAgICAgLy8gVjIgZm9ybWF0IHcvIGR5bmFtaWMgaW5vZGUgc2l6ZXMKKyNkZWZpbmUgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIDEyOAorCisvLyBTcGVjaWFsIGlub2RlIG51bWJlcnMKKyNkZWZpbmUJRVhUMl9CQURfSU5PCQkgMQkvLyBCYWQgYmxvY2tzIGlub2RlCisjZGVmaW5lIEVYVDJfUk9PVF9JTk8JCSAyCS8vIFJvb3QgaW5vZGUKKyNkZWZpbmUgRVhUMl9CT09UX0xPQURFUl9JTk8JIDUJLy8gQm9vdCBsb2FkZXIgaW5vZGUKKyNkZWZpbmUgRVhUMl9VTkRFTF9ESVJfSU5PCSA2CS8vIFVuZGVsZXRlIGRpcmVjdG9yeSBpbm9kZQorI2RlZmluZSBFWFQzX1JFU0laRV9JTk8JCSA3CS8vIFJlc2VydmVkIGdyb3VwIGRlc2NyaXB0b3JzIGlub2RlCisjZGVmaW5lIEVYVDNfSk9VUk5BTF9JTk8JIDgJLy8gSm91cm5hbCBpbm9kZQorCisvLyBXZSdyZSByZWFkb25seSwgc28gd2Ugb25seSBjYXJlIGFib3V0IGluY29tcGF0IGZlYXR1cmVzLgorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfQ09NUFJFU1NJT04JMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRQkJMHgwMDAyCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSCQkweDAwMDQKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWCTB4MDAwOAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRwkJMHgwMDEwCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9BTlkJCTB4ZmZmZmZmZmYKKworI2RlZmluZSBFWFQyX05ESVJfQkxPQ0tTCTEyCisjZGVmaW5lCUVYVDJfSU5EX0JMT0NLCQlFWFQyX05ESVJfQkxPQ0tTCisjZGVmaW5lIEVYVDJfRElORF9CTE9DSwkJKEVYVDJfSU5EX0JMT0NLKzEpCisjZGVmaW5lCUVYVDJfVElORF9CTE9DSwkJKEVYVDJfRElORF9CTE9DSysxKQorI2RlZmluZQlFWFQyX05fQkxPQ0tTCQkoRVhUMl9USU5EX0JMT0NLKzEpCisKKworLyogZm9yIEVYVDQgZXh0ZW50ICovCisjZGVmaW5lIEVYVDRfRVhUX01BR0lDICAgICAweGYzMGEKKyNkZWZpbmUgRVhUNF9FWFRFTlRTX0ZMQUcgIDB4MDAwODAwMDAKKworLyoKKyAqIEZpbGUgdHlwZXMgYW5kIGZpbGUgbW9kZXMKKyAqLworI2RlZmluZSBTX0lGRElSCQkwMDQwMDAwCSAgICAgICAgLy8gRGlyZWN0b3J5CisjZGVmaW5lIFNfSUZDSFIJCTAwMjAwMDAJICAgICAgICAvLyBDaGFyYWN0ZXIgZGV2aWNlCisjZGVmaW5lIFNfSUZCTEsJCTAwNjAwMDAJCS8vIEJsb2NrIGRldmljZQorI2RlZmluZSBTX0lGUkVHCQkwMTAwMDAwCSAgICAgICAgLy8gUmVndWxhciBmaWxlCisjZGVmaW5lIFNfSUZJRk8JCTAwMTAwMDAJICAgICAgICAvLyBGSUZPCisjZGVmaW5lIFNfSUZMTksJCTAxMjAwMDAJCS8vIFN5bWJvbGljIGxpbmsKKyNkZWZpbmUgU19JRlNPQ0sJMDE0MDAwMAkJLy8gU29ja2V0CisKKyNkZWZpbmUgU19JRlNISUZUCTEyCisKKyNkZWZpbmUgVF9JRkRJUgkJKFNfSUZESVIgPj4gU19JRlNISUZUKQorI2RlZmluZSBUX0lGQ0hSCQkoU19JRkNIUiA+PiBTX0lGU0hJRlQpCisjZGVmaW5lIFRfSUZCTEsJCShTX0lGQkxLID4+IFNfSUZTSElGVCkKKyNkZWZpbmUgVF9JRlJFRwkJKFNfSUZSRUcgPj4gU19JRlNISUZUKQorI2RlZmluZSBUX0lGSUZPCQkoU19JRklGTyA+PiBTX0lGU0hJRlQpCisjZGVmaW5lIFRfSUZMTksJCShTX0lGTE5LID4+IFNfSUZTSElGVCkKKyNkZWZpbmUgVF9JRlNPQ0sJKFNfSUZTT0NLID4+IFNfSUZTSElGVCkKKworCisjZGVmaW5lIGV4dDJfZ3JvdXBfZGVzY19sZzJzaXplIDUKKworCisKKy8qCisgKiBzdXBlciBibG9jayBzdHJ1Y3R1cmU6CisgKiBpbmNsdWRlL2xpbnV4L2V4dDJfZnMuaAorICovCitzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayB7CisgICAgdWludDMyX3Qgc19pbm9kZXNfY291bnQ7CSAgICAgICAgLyogSW5vZGVzIGNvdW50ICovCisgICAgdWludDMyX3Qgc19ibG9ja3NfY291bnQ7CSAgICAgICAgLyogQmxvY2tzIGNvdW50ICovCisgICAgdWludDMyX3Qgc19yX2Jsb2Nrc19jb3VudDsJICAgICAgICAvKiBSZXNlcnZlZCBibG9ja3MgY291bnQgKi8KKyAgICB1aW50MzJfdCBzX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworICAgIHVpbnQzMl90IHNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisgICAgdWludDMyX3Qgc19maXJzdF9kYXRhX2Jsb2NrOwkvKiBGaXJzdCBEYXRhIEJsb2NrICovCisgICAgdWludDMyX3Qgc19sb2dfYmxvY2tfc2l6ZTsJICAgICAgICAvKiBCbG9jayBzaXplICovCisgICAgdWludDMyX3Qgc19sb2dfZnJhZ19zaXplOwkgICAgICAgIC8qIEZyYWdtZW50IHNpemUgKi8KKyAgICB1aW50MzJfdCBzX2Jsb2Nrc19wZXJfZ3JvdXA7CS8qICMgQmxvY2tzIHBlciBncm91cCAqLworICAgIHVpbnQzMl90IHNfZnJhZ3NfcGVyX2dyb3VwOwkgICAgICAgIC8qICMgRnJhZ21lbnRzIHBlciBncm91cCAqLworICAgIHVpbnQzMl90IHNfaW5vZGVzX3Blcl9ncm91cDsJLyogIyBJbm9kZXMgcGVyIGdyb3VwICovCisgICAgdWludDMyX3Qgc19tdGltZTsJCSAgICAgICAgLyogTW91bnQgdGltZSAqLworICAgIHVpbnQzMl90IHNfd3RpbWU7CQkgICAgICAgIC8qIFdyaXRlIHRpbWUgKi8KKyAgICB1aW50MTZfdCBzX21udF9jb3VudDsJCS8qIE1vdW50IGNvdW50ICovCisgICAgaW50MTZfdCAgc19tYXhfbW50X2NvdW50OwkgICAgICAgIC8qIE1heGltYWwgbW91bnQgY291bnQgKi8KKyAgICB1aW50MTZfdCBzX21hZ2ljOwkJICAgICAgICAvKiBNYWdpYyBzaWduYXR1cmUgKi8KKyAgICB1aW50MTZfdCBzX3N0YXRlOwkJICAgICAgICAvKiBGaWxlIHN5c3RlbSBzdGF0ZSAqLworICAgIHVpbnQxNl90IHNfZXJyb3JzOwkJICAgICAgICAvKiBCZWhhdmlvdXIgd2hlbiBkZXRlY3RpbmcgZXJyb3JzICovCisgICAgdWludDE2X3Qgc19taW5vcl9yZXZfbGV2ZWw7CisgICAgdWludDMyX3Qgc19sYXN0Y2hlY2s7CQkvKiB0aW1lIG9mIGxhc3QgY2hlY2sgKi8KKyAgICB1aW50MzJfdCBzX2NoZWNraW50ZXJ2YWw7CSAgICAgICAgLyogbWF4LiB0aW1lIGJldHdlZW4gY2hlY2tzICovCisgICAgdWludDMyX3Qgc19jcmVhdG9yX29zOwkJLyogT1MgKi8KKyAgICB1aW50MzJfdCBzX3Jldl9sZXZlbDsJCS8qIFJldmlzaW9uIGxldmVsICovCisgICAgdWludDE2X3Qgc19kZWZfcmVzdWlkOwkJLyogRGVmYXVsdCB1aWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworICAgIHVpbnQxNl90IHNfZGVmX3Jlc2dpZDsJCS8qIERlZmF1bHQgZ2lkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKworICAgIHVpbnQzMl90IHNfZmlyc3RfaW5vOwkJLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlICovCisgICAgdWludDE2X3Qgc19pbm9kZV9zaXplOwkJLyogc2l6ZSBvZiBpbm9kZSBzdHJ1Y3R1cmUgKi8KKyAgICB1aW50MTZfdCBzX2Jsb2NrX2dyb3VwX25yOwkgICAgICAgIC8qIGJsb2NrIGdyb3VwICMgb2YgdGhpcyBzdXBlcmJsb2NrICovCisgICAgdWludDMyX3Qgc19mZWF0dXJlX2NvbXBhdDsJICAgICAgICAvKiBjb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisgICAgdWludDMyX3Qgc19mZWF0dXJlX2luY29tcGF0OwkvKiBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKyAgICB1aW50MzJfdCBzX2ZlYXR1cmVfcm9fY29tcGF0OwkvKiByZWFkb25seS1jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisgICAgdWludDhfdCAgc191dWlkWzE2XTsJCS8qIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lICovCisgICAgY2hhciAgc192b2x1bWVfbmFtZVsxNl07CSAgICAgICAgLyogdm9sdW1lIG5hbWUgKi8KKyAgICBjaGFyICBzX2xhc3RfbW91bnRlZFs2NF07CSAgICAgICAgLyogZGlyZWN0b3J5IHdoZXJlIGxhc3QgbW91bnRlZCAqLworICAgIHVpbnQzMl90IHNfYWxnb3JpdGhtX3VzYWdlX2JpdG1hcDsgIC8qIEZvciBjb21wcmVzc2lvbiAqLworICAgIHVpbnQ4X3QgIHNfcHJlYWxsb2NfYmxvY2tzOwkgICAgICAgIC8qIE5yIG9mIGJsb2NrcyB0byB0cnkgdG8gcHJlYWxsb2NhdGUqLworICAgIHVpbnQ4X3QgIHNfcHJlYWxsb2NfZGlyX2Jsb2NrczsKKyAgICB1aW50MTZfdCBzX3Jlc2VydmVkX2dkdF9ibG9ja3M7CS8qIFBlciBncm91cCBkZXNjIGZvciBvbmxpbmUgZ3Jvd3RoICovCisgICAgLyoKKyAgICAgKiBKb3VybmFsaW5nIHN1cHBvcnQgdmFsaWQgaWYgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCBzZXQuCisgICAgICovCisgICAgdWludDhfdCAgc19qb3VybmFsX3V1aWRbMTZdOwkvKiB1dWlkIG9mIGpvdXJuYWwgc3VwZXJibG9jayAqLworICAgIHVpbnQzMl90IHNfam91cm5hbF9pbnVtOwkvKiBpbm9kZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisgICAgdWludDMyX3Qgc19qb3VybmFsX2RldjsJCS8qIGRldmljZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisgICAgdWludDMyX3Qgc19sYXN0X29ycGhhbjsJCS8qIHN0YXJ0IG9mIGxpc3Qgb2YgaW5vZGVzIHRvIGRlbGV0ZSAqLworICAgIHVpbnQzMl90IHNfaGFzaF9zZWVkWzRdOwkvKiBIVFJFRSBoYXNoIHNlZWQgKi8KKyAgICB1aW50OF90ICBzX2RlZl9oYXNoX3ZlcnNpb247CS8qIERlZmF1bHQgaGFzaCB2ZXJzaW9uIHRvIHVzZSAqLworICAgIHVpbnQ4X3QgIHNfcmVzZXJ2ZWRfY2hhcl9wYWQ7CisgICAgdWludDE2X3Qgc19kZXNjX3NpemU7CQkvKiBzaXplIG9mIGdyb3VwIGRlc2NyaXB0b3IgKi8KKyAgICB1aW50MzJfdCBzX2RlZmF1bHRfbW91bnRfb3B0czsKKyAgICB1aW50MzJfdCBzX2ZpcnN0X21ldGFfYmc7CS8qIEZpcnN0IG1ldGFibG9jayBibG9jayBncm91cCAqLworICAgIHVpbnQzMl90IHNfbWtmc190aW1lOwkJLyogV2hlbiB0aGUgZmlsZXN5c3RlbSB3YXMgY3JlYXRlZCAqLworICAgIHVpbnQzMl90IHNfam5sX2Jsb2Nrc1sxN107CS8qIEJhY2t1cCBvZiB0aGUgam91cm5hbCBpbm9kZSAqLworICAgIC8qIDY0Yml0IHN1cHBvcnQgdmFsaWQgaWYgRVhUNF9GRUFUVVJFX0NPTVBBVF82NEJJVCAqLworICAgIHVpbnQzMl90IHNfYmxvY2tzX2NvdW50X2hpOwkvKiBCbG9ja3MgY291bnQgKi8KKyAgICB1aW50MzJfdCBzX3JfYmxvY2tzX2NvdW50X2hpOwkvKiBSZXNlcnZlZCBibG9ja3MgY291bnQgKi8KKyAgICB1aW50MzJfdCBzX2ZyZWVfYmxvY2tzX2NvdW50X2hpOy8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisgICAgdWludDE2X3Qgc19taW5fZXh0cmFfaXNpemU7CS8qIEFsbCBpbm9kZXMgaGF2ZSBhdCBsZWFzdCAjIGJ5dGVzICovCisgICAgdWludDE2X3Qgc193YW50X2V4dHJhX2lzaXplOwkvKiBOZXcgaW5vZGVzIHNob3VsZCByZXNlcnZlICMgYnl0ZXMgKi8KKyAgICB1aW50MzJfdCBzX2ZsYWdzOwkJLyogTWlzY2VsbGFuZW91cyBmbGFncyAqLworICAgIHVpbnQxNl90IHNfcmFpZF9zdHJpZGU7CQkvKiBSQUlEIHN0cmlkZSAqLworICAgIHVpbnQxNl90IHNfbW1wX2ludGVydmFsOyAgICAgICAgLyogIyBzZWNvbmRzIHRvIHdhaXQgaW4gTU1QIGNoZWNraW5nICovCisgICAgdWludDY0X3Qgc19tbXBfYmxvY2s7ICAgICAgICAgICAvKiBCbG9jayBmb3IgbXVsdGktbW91bnQgcHJvdGVjdGlvbiAqLworICAgIHVpbnQzMl90IHNfcmFpZF9zdHJpcGVfd2lkdGg7ICAgLyogYmxvY2tzIG9uIGFsbCBkYXRhIGRpc2tzIChOKnN0cmlkZSkqLworICAgIHVpbnQ4X3QgIHNfbG9nX2dyb3Vwc19wZXJfZmxleDsgLyogRkxFWF9CRyBncm91cCBzaXplICovCisgICAgdWludDhfdCAgc19yZXNlcnZlZF9jaGFyX3BhZDI7CisgICAgdWludDE2X3Qgc19yZXNlcnZlZF9wYWQ7CisgICAgdWludDMyX3Qgc19yZXNlcnZlZFsxNjJdOyAgICAgICAgLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNpZm5kZWYgREVQRU5ECisjaWYgZXh0Ml9zdXBlcl9ibG9ja19zaXplICE9IDEwMjQKKyNlcnJvciBleHQyX3N1cGVyX2Jsb2NrIGRlZmluaXRpb24gYm9ndXMKKyNlbmRpZgorI2VuZGlmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogIGV4dDIgZ3JvdXAgZGVzYyBzdHJ1Y3R1cmU6CisgKi8KK3N0cnVjdCBleHQyX2dyb3VwX2Rlc2MgeworICAgIHVpbnQzMl90IGJnX2Jsb2NrX2JpdG1hcDsJLyogQmxvY2tzIGJpdG1hcCBibG9jayAqLworICAgIHVpbnQzMl90IGJnX2lub2RlX2JpdG1hcDsJLyogSW5vZGVzIGJpdG1hcCBibG9jayAqLworICAgIHVpbnQzMl90IGJnX2lub2RlX3RhYmxlOwkvKiBJbm9kZXMgdGFibGUgYmxvY2sgKi8KKyAgICB1aW50MTZfdCBiZ19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKyAgICB1aW50MTZfdCBiZ19mcmVlX2lub2Rlc19jb3VudDsJLyogRnJlZSBpbm9kZXMgY291bnQgKi8KKyAgICB1aW50MTZfdCBiZ191c2VkX2RpcnNfY291bnQ7CS8qIERpcmVjdG9yaWVzIGNvdW50ICovCisgICAgdWludDE2X3QgYmdfcGFkOworICAgIHVpbnQzMl90IGJnX3Jlc2VydmVkWzNdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNpZm5kZWYgREVQRU5ECisjaWYgZXh0Ml9ncm91cF9kZXNjX3NpemUgIT0gMzIKKyNlcnJvciBleHQyX2dyb3VwX2Rlc2MgZGVmaW5pdGlvbiBib2d1cworI2VuZGlmCisjZW5kaWYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqIGV4dDIgaW5vZGUgc3RydWN0dXJlOgorICovCitzdHJ1Y3QgZXh0Ml9pbm9kZSB7CisgICAgdWludDE2X3QgaV9tb2RlOwkJLyogRmlsZSBtb2RlICovCisgICAgdWludDE2X3QgaV91aWQ7CQkvKiBPd25lciBVaWQgKi8KKyAgICB1aW50MzJfdCBpX3NpemU7CQkvKiA0OiBTaXplIGluIGJ5dGVzICovCisgICAgdWludDMyX3QgaV9hdGltZTsJCS8qIEFjY2VzcyB0aW1lICovCisgICAgdWludDMyX3QgaV9jdGltZTsJCS8qIDEyOiBDcmVhdGlvbiB0aW1lICovCisgICAgdWludDMyX3QgaV9tdGltZTsJCS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisgICAgdWludDMyX3QgaV9kdGltZTsJCS8qIDIwOiBEZWxldGlvbiBUaW1lICovCisgICAgdWludDE2X3QgaV9naWQ7CQkvKiBHcm91cCBJZCAqLworICAgIHVpbnQxNl90IGlfbGlua3NfY291bnQ7CS8qIDI0OiBMaW5rcyBjb3VudCAqLworICAgIHVpbnQzMl90IGlfYmxvY2tzOwkJLyogQmxvY2tzIGNvdW50ICovCisgICAgdWludDMyX3QgaV9mbGFnczsJCS8qIDMyOiBGaWxlIGZsYWdzICovCisgICAgdWludDMyX3QgbF9pX3Jlc2VydmVkMTsKKyAgICB1aW50MzJfdCBpX2Jsb2NrW0VYVDJfTl9CTE9DS1NdOwkvKiA0MDogUG9pbnRlcnMgdG8gYmxvY2tzICovCisgICAgdWludDMyX3QgaV92ZXJzaW9uOwkJLyogRmlsZSB2ZXJzaW9uIChmb3IgTkZTKSAqLworICAgIHVpbnQzMl90IGlfZmlsZV9hY2w7CS8qIEZpbGUgQUNMICovCisgICAgdWludDMyX3QgaV9kaXJfYWNsOwkJLyogRGlyZWN0b3J5IEFDTCAqLworICAgIHVpbnQzMl90IGlfZmFkZHI7CQkvKiBGcmFnbWVudCBhZGRyZXNzICovCisgICAgdWludDhfdCAgbF9pX2ZyYWc7CSAgICAgICAgLyogRnJhZ21lbnQgbnVtYmVyICovCisgICAgdWludDhfdCAgbF9pX2ZzaXplOwkgICAgICAgIC8qIEZyYWdtZW50IHNpemUgKi8KKyAgICB1aW50MTZfdCBpX3BhZDE7CisgICAgdWludDMyX3QgbF9pX3Jlc2VydmVkMlsyXTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjaWZuZGVmIERFUEVORAorI2lmIGV4dDJfaW5vZGVfc2l6ZSAhPSAxMjgKKyNlcnJvciBleHQyX2lub2RlIGRlZmluaXRpb24gYm9ndXMKKyNlbmRpZgorI2VuZGlmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgRVhUMl9OQU1FX0xFTiAyNTUKK3N0cnVjdCBleHQyX2Rpcl9lbnRyeSB7CisgICAgdW5zaWduZWQgaW50CWRfaW5vZGU7CQkvKiBJbm9kZSBudW1iZXIgKi8KKyAgICB1bnNpZ25lZCBzaG9ydAlkX3JlY19sZW47CQkvKiBEaXJlY3RvcnkgZW50cnkgbGVuZ3RoICovCisgICAgdW5zaWduZWQgY2hhcglkX25hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKyAgICB1bnNpZ25lZCBjaGFyCWRfZmlsZV90eXBlOworICAgIGNoYXIJZF9uYW1lW0VYVDJfTkFNRV9MRU5dOwkgICAgICAgIC8qIEZpbGUgbmFtZSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgRVhUMl9ESVJfUEFECSA0CisjZGVmaW5lIEVYVDJfRElSX1JPVU5ECShFWFQyX0RJUl9QQUQgLSAxKQorI2RlZmluZSBFWFQyX0RJUl9SRUNfTEVOKG5hbWVfbGVuKQkoKChuYW1lX2xlbikgKyA4ICsgRVhUMl9ESVJfUk9VTkQpICYgXAorCQkJCQkgfkVYVDJfRElSX1JPVU5EKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKworCisKKy8qCisgKiBUaGlzIGlzIHRoZSBleHRlbnQgb24tZGlzayBzdHJ1Y3R1cmUuCisgKiBJdCdzIHVzZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZS4KKyAqLworc3RydWN0IGV4dDRfZXh0ZW50IHsKKyAgICB1aW50MzJfdCBlZV9ibG9jazsJICAgICAgICAvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi8KKyAgICB1aW50MTZfdCBlZV9sZW47CSAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBjb3ZlcmVkIGJ5IGV4dGVudCAqLworICAgIHVpbnQxNl90IGVlX3N0YXJ0X2hpOwkvKiBoaWdoIDE2IGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi8KKyAgICB1aW50MzJfdCBlZV9zdGFydF9sbzsJLyogbG93IDMyIGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi8KK307CisKKy8qCisgKiBUaGlzIGlzIGluZGV4IG9uLWRpc2sgc3RydWN0dXJlLgorICogSXQncyB1c2VkIGF0IGFsbCB0aGUgbGV2ZWxzIGV4Y2VwdCB0aGUgYm90dG9tLgorICovCitzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4IHsKKyAgICB1aW50MzJfdCBlaV9ibG9jazsJICAgICAgICAvKiBpbmRleCBjb3ZlcnMgbG9naWNhbCBibG9ja3MgZnJvbSAnYmxvY2snICovCisgICAgdWludDMyX3QgZWlfbGVhZl9sbzsJLyogcG9pbnRlciB0byB0aGUgcGh5c2ljYWwgYmxvY2sgb2YgdGhlIG5leHQgKgorCQkJCSAqIGxldmVsLiBsZWFmIG9yIG5leHQgaW5kZXggY291bGQgYmUgdGhlcmUgKi8KKyAgICB1aW50MTZfdCBlaV9sZWFmX2hpOwkvKiBoaWdoIDE2IGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi8KKyAgICB1aW50MTZfdCBlaV91bnVzZWQ7Cit9OworCisvKgorICogRWFjaCBibG9jayAobGVhdmVzIGFuZCBpbmRleGVzKSwgZXZlbiBpbm9kZS1zdG9yZWQgaGFzIGhlYWRlci4KKyAqLworc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciB7CisgICAgdWludDE2X3QgZWhfbWFnaWM7CSAgICAgICAgLyogcHJvYmFibHkgd2lsbCBzdXBwb3J0IGRpZmZlcmVudCBmb3JtYXRzICovCisgICAgdWludDE2X3QgZWhfZW50cmllczsJLyogbnVtYmVyIG9mIHZhbGlkIGVudHJpZXMgKi8KKyAgICB1aW50MTZfdCBlaF9tYXg7CSAgICAgICAgLyogY2FwYWNpdHkgb2Ygc3RvcmUgaW4gZW50cmllcyAqLworICAgIHVpbnQxNl90IGVoX2RlcHRoOwkgICAgICAgIC8qIGhhcyB0cmVlIHJlYWwgdW5kZXJseWluZyBibG9ja3M/ICovCisgICAgdWludDMyX3QgZWhfZ2VuZXJhdGlvbjsJLyogZ2VuZXJhdGlvbiBvZiB0aGUgdHJlZSAqLworfTsKKworCisKKyNkZWZpbmUgRVhUNF9GSVJTVF9FWFRFTlQoaGVhZGVyKSAoIChzdHJ1Y3QgZXh0NF9leHRlbnQgKikoaGVhZGVyICsgMSkgKQorI2RlZmluZSBFWFQ0X0ZJUlNUX0lOREVYKGhlYWRlcikgICggKHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKikgKGhlYWRlciArIDEpICkKKworCisvKgorICogVGhlIGV4dDIgc3VwZXIgYmxvY2sgaW5mb3JtYXRpb24gaW4gbWVtb3J5CisgKi8KK3N0cnVjdCBleHQyX3NiX2luZm8geworICAgIHVpbnQzMl90IHNfaW5vZGVzX3Blcl9ibG9jazsvKiBOdW1iZXIgb2YgaW5vZGVzIHBlciBibG9jayAqLworICAgIHVpbnQzMl90IHNfaW5vZGVzX3Blcl9ncm91cDsvKiBOdW1iZXIgb2YgaW5vZGVzIGluIGEgZ3JvdXAgKi8KKyAgICB1aW50MzJfdCBzX2Jsb2Nrc19wZXJfZ3JvdXA7LyogTnVtYmVyIG9mIGJsb2NrcyBpbiBhIGdyb3VwICovCisgICAgdWludDMyX3Qgc19kZXNjX3Blcl9ibG9jazsgIC8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9ycyBwZXIgYmxvY2sgKi8KKyAgICB1aW50MzJfdCBzX2dyb3Vwc19jb3VudDsgICAgLyogTnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgZnMgKi8KKyAgICB1aW50MzJfdCBzX2ZpcnN0X2RhdGFfYmxvY2s7CS8qIEZpcnN0IERhdGEgQmxvY2sgKi8KKyAgICBpbnQgICAgICBzX2lub2RlX3NpemU7CisgICAgdWludDhfdCAgc191dWlkWzE2XTsJLyogMTI4LWJpdCB1dWlkIGZvciB2b2x1bWUgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4dDJfc2JfaW5mbyAqRVhUMl9TQihzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgcmV0dXJuIGZzLT5mc19pbmZvOworfQorCisjZGVmaW5lIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChmcykgICAgICAoRVhUMl9TQihmcyktPnNfYmxvY2tzX3Blcl9ncm91cCkKKyNkZWZpbmUgRVhUMl9JTk9ERVNfUEVSX0dST1VQKGZzKSAgICAgIChFWFQyX1NCKGZzKS0+c19pbm9kZXNfcGVyX2dyb3VwKQorI2RlZmluZSBFWFQyX0lOT0RFU19QRVJfQkxPQ0soZnMpICAgICAgKEVYVDJfU0IoZnMpLT5zX2lub2Rlc19wZXJfYmxvY2spCisjZGVmaW5lIEVYVDJfREVTQ19QRVJfQkxPQ0soZnMpICAgICAgICAoRVhUMl9TQihmcyktPnNfZGVzY19wZXJfYmxvY2spCisKKy8qCisgKiBleHQyIHByaXZhdGUgaW5vZGUgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IGV4dDJfcHZ0X2lub2RlIHsKKyAgICB1bmlvbiB7CisJdWludDMyX3QgaV9ibG9ja1tFWFQyX05fQkxPQ0tTXTsKKwlzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyIGlfZXh0ZW50X2hkcjsKKyAgICB9OworfTsKKworI2RlZmluZSBQVlQoaSkgKChzdHJ1Y3QgZXh0Ml9wdnRfaW5vZGUgKikoKGkpLT5wdnQpKQorCisvKgorICogZnVuY3Rpb25zCisgKi8KK2Jsb2NrX3QgZXh0Ml9ibWFwKHN0cnVjdCBpbm9kZSAqLCBibG9ja190LCBzaXplX3QgKik7CitpbnQgZXh0Ml9uZXh0X2V4dGVudChzdHJ1Y3QgaW5vZGUgKiwgdWludDMyX3QpOworCisjZW5kaWYgLyogZXh0Ml9mcy5oICovCmRpZmYgLS1naXQgYS9jb3JlL2ZzL2ZhdC9mYXQuYyBiL2NvcmUvZnMvZmF0L2ZhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MTg1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL2ZhdC9mYXQuYwpAQCAtMCwwICsxLDg2MCBAQAorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2RpcmVudC5oPgorI2luY2x1ZGUgPGNhY2hlLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGRpc2suaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgPGlsb2cyLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlICJjb2RlcGFnZS5oIgorI2luY2x1ZGUgImZhdF9mcy5oIgorCitzdGF0aWMgc3RydWN0IGlub2RlICogbmV3X2ZhdF9pbm9kZShzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGFsbG9jX2lub2RlKGZzLCAwLCBzaXplb2Yoc3RydWN0IGZhdF9wdnRfaW5vZGUpKTsKKyAgICBpZiAoIWlub2RlKQorCW1hbGxvY19lcnJvcigiaW5vZGUgc3RydWN0dXJlIik7CisKKyAgICByZXR1cm4gaW5vZGU7Cit9CisKKy8qCisgKiBDaGVjayBmb3IgYSBwYXJ0aWN1bGFyIHNlY3RvciBpbiB0aGUgRkFUIGNhY2hlCisgKi8KK3N0YXRpYyBjb25zdCB2b2lkICpnZXRfZmF0X3NlY3RvcihzdHJ1Y3QgZnNfaW5mbyAqZnMsIHNlY3Rvcl90IHNlY3RvcikKK3sKKyAgICByZXR1cm4gZ2V0X2NhY2hlKGZzLT5mc19kZXYsIEZBVF9TQihmcyktPmZhdCArIHNlY3Rvcik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnZXRfbmV4dF9jbHVzdGVyKHN0cnVjdCBmc19pbmZvICpmcywgdWludDMyX3QgY2x1c3RfbnVtKQoreworICAgIHVpbnQzMl90IG5leHRfY2x1c3RlciA9IDA7CisgICAgc2VjdG9yX3QgZmF0X3NlY3RvcjsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3Qgc2VjdG9yX21hc2sgPSBTRUNUT1JfU0laRShmcykgLSAxOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisKKyAgICBzd2l0Y2goRkFUX1NCKGZzKS0+ZmF0X3R5cGUpIHsKKyAgICBjYXNlIEZBVDEyOgorCW9mZnNldCA9IGNsdXN0X251bSArIChjbHVzdF9udW0gPj4gMSk7CisJZmF0X3NlY3RvciA9IG9mZnNldCA+PiBTRUNUT1JfU0hJRlQoZnMpOworCW9mZnNldCAmPSBzZWN0b3JfbWFzazsKKwlkYXRhID0gZ2V0X2ZhdF9zZWN0b3IoZnMsIGZhdF9zZWN0b3IpOworCWlmIChvZmZzZXQgPT0gc2VjdG9yX21hc2spIHsKKwkgICAgLyoKKwkgICAgICogd2UgZ290IHRoZSBlbmQgb2YgdGhlIG9uZSBmYXQgc2VjdG9yLAorCSAgICAgKiBidXQgd2UgaGF2ZSBqdXN0IG9uZSBieXRlIGFuZCB3ZSBuZWVkIHR3bywKKwkgICAgICogc28gc3RvcmUgdGhlIGxvdyBwYXJ0LCB0aGVuIHJlYWQgdGhlIG5leHQgZmF0CisJICAgICAqIHNlY3RvciwgcmVhZCB0aGUgaGlnaCBwYXJ0LCB0aGVuIGNvbWJpbmUgaXQuCisJICAgICAqLworCSAgICBuZXh0X2NsdXN0ZXIgPSBkYXRhW29mZnNldF07CisJICAgIGRhdGEgPSBnZXRfZmF0X3NlY3RvcihmcywgZmF0X3NlY3RvciArIDEpOworCSAgICBuZXh0X2NsdXN0ZXIgKz0gZGF0YVswXSA8PCA4OworCX0gZWxzZSB7CisJICAgIG5leHRfY2x1c3RlciA9ICooY29uc3QgdWludDE2X3QgKikoZGF0YSArIG9mZnNldCk7CisJfQorCisJaWYgKGNsdXN0X251bSAmIDB4MDAwMSkKKwkgICAgbmV4dF9jbHVzdGVyID4+PSA0OyAgICAgICAgIC8qIGNsdXN0ZXIgbnVtYmVyIGlzIE9ERCAqLworCWVsc2UKKwkgICAgbmV4dF9jbHVzdGVyICY9IDB4MGZmZjsgICAgIC8qIGNsdXN0ZXIgbnVtYmVyIGlzIEVWRU4gKi8KKwlicmVhazsKKworICAgIGNhc2UgRkFUMTY6CisJb2Zmc2V0ID0gY2x1c3RfbnVtIDw8IDE7CisJZmF0X3NlY3RvciA9IG9mZnNldCA+PiBTRUNUT1JfU0hJRlQoZnMpOworCW9mZnNldCAmPSBzZWN0b3JfbWFzazsKKwlkYXRhID0gZ2V0X2ZhdF9zZWN0b3IoZnMsIGZhdF9zZWN0b3IpOworCW5leHRfY2x1c3RlciA9ICooY29uc3QgdWludDE2X3QgKikoZGF0YSArIG9mZnNldCk7CisJYnJlYWs7CisKKyAgICBjYXNlIEZBVDMyOgorCW9mZnNldCA9IGNsdXN0X251bSA8PCAyOworCWZhdF9zZWN0b3IgPSBvZmZzZXQgPj4gU0VDVE9SX1NISUZUKGZzKTsKKwlvZmZzZXQgJj0gc2VjdG9yX21hc2s7CisJZGF0YSA9IGdldF9mYXRfc2VjdG9yKGZzLCBmYXRfc2VjdG9yKTsKKwluZXh0X2NsdXN0ZXIgPSAqKGNvbnN0IHVpbnQzMl90ICopKGRhdGEgKyBvZmZzZXQpOworCW5leHRfY2x1c3RlciAmPSAweDBmZmZmZmZmOworCWJyZWFrOworICAgIH0KKworICAgIHJldHVybiBuZXh0X2NsdXN0ZXI7Cit9CisKK3N0YXRpYyBpbnQgZmF0X25leHRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVpbnQzMl90IGxzdGFydCkKK3sKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBpbm9kZS0+ZnM7CisgICAgc3RydWN0IGZhdF9zYl9pbmZvICpzYmkgPSBGQVRfU0IoZnMpOworICAgIHVpbnQzMl90IG1jbHVzdGVyID0gbHN0YXJ0ID4+IHNiaS0+Y2x1c3Rfc2hpZnQ7CisgICAgdWludDMyX3QgbGNsdXN0ZXI7CisgICAgdWludDMyX3QgcGNsdXN0ZXI7CisgICAgdWludDMyX3QgdGNsdXN0ZXI7CisgICAgdWludDMyX3QgeGNsdXN0ZXI7CisgICAgY29uc3QgdWludDMyX3QgY2x1c3Rlcl9ieXRlcyA9IFVJTlQzMl9DKDEpIDw8IHNiaS0+Y2x1c3RfYnl0ZV9zaGlmdDsKKyAgICBjb25zdCB1aW50MzJfdCBjbHVzdGVyX3NlY3MgID0gVUlOVDMyX0MoMSkgPDwgc2JpLT5jbHVzdF9zaGlmdDsKKyAgICBzZWN0b3JfdCBkYXRhX2FyZWEgPSBzYmktPmRhdGE7CisKKyAgICB0Y2x1c3RlciA9IChpbm9kZS0+c2l6ZSArIGNsdXN0ZXJfYnl0ZXMgLSAxKSA+PiBzYmktPmNsdXN0X2J5dGVfc2hpZnQ7CisgICAgaWYgKG1jbHVzdGVyID49IHRjbHVzdGVyKQorCWdvdG8gZXJyOwkJLyogUmVxdWVzdGVkIGNsdXN0ZXIgYmV5b25kIGVuZCBvZiBmaWxlICovCisKKyAgICBsY2x1c3RlciA9IFBWVChpbm9kZSktPm9mZnNldCA+PiBzYmktPmNsdXN0X3NoaWZ0OworICAgIHBjbHVzdGVyID0gKChQVlQoaW5vZGUpLT5oZXJlIC0gZGF0YV9hcmVhKSA+PiBzYmktPmNsdXN0X3NoaWZ0KSArIDI7CisKKyAgICBpZiAobGNsdXN0ZXIgPiBtY2x1c3RlciB8fCBQVlQoaW5vZGUpLT5oZXJlIDwgZGF0YV9hcmVhKSB7CisJbGNsdXN0ZXIgPSAwOworCXBjbHVzdGVyID0gUFZUKGlub2RlKS0+c3RhcnRfY2x1c3RlcjsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisJaWYgKHBjbHVzdGVyLTIgPj0gc2JpLT5jbHVzdGVycykgeworCSAgICBpbm9kZS0+c2l6ZSA9IGxjbHVzdGVyIDw8IHNiaS0+Y2x1c3Rfc2hpZnQ7CisJICAgIGdvdG8gZXJyOworCX0KKworCWlmIChsY2x1c3RlciA+PSBtY2x1c3RlcikKKwkgICAgYnJlYWs7CisKKwlsY2x1c3RlcisrOworCXBjbHVzdGVyID0gZ2V0X25leHRfY2x1c3RlcihmcywgcGNsdXN0ZXIpOworICAgIH0KKworICAgIGlub2RlLT5uZXh0X2V4dGVudC5wc3RhcnQgPQorCSgoc2VjdG9yX3QpKHBjbHVzdGVyLTIpIDw8IHNiaS0+Y2x1c3Rfc2hpZnQpICsgZGF0YV9hcmVhOworICAgIGlub2RlLT5uZXh0X2V4dGVudC5sZW4gPSBjbHVzdGVyX3NlY3M7CisgICAgeGNsdXN0ZXIgPSAwOwkJLyogTm9uc2Vuc2UgKi8KKworICAgIHdoaWxlICgrK2xjbHVzdGVyIDwgdGNsdXN0ZXIpIHsKKwl4Y2x1c3RlciA9IGdldF9uZXh0X2NsdXN0ZXIoZnMsIHBjbHVzdGVyKTsKKwlpZiAoeGNsdXN0ZXIgIT0gKytwY2x1c3RlcikKKwkgICAgYnJlYWs7CQkvKiBOb3QgY29udGlndW91cyAqLworCWlub2RlLT5uZXh0X2V4dGVudC5sZW4gKz0gY2x1c3Rlcl9zZWNzOworICAgIH0KKworICAgIC8qIE5vdGU6IC0+aGVyZSBpcyBib2d1cyBpZiAtPm9mZnNldCA+PSBFT0YsIGJ1dCB0aGF0J3Mgb2theSAqLworICAgIFBWVChpbm9kZSktPm9mZnNldCA9IGxjbHVzdGVyIDw8IHNiaS0+Y2x1c3Rfc2hpZnQ7CisgICAgUFZUKGlub2RlKS0+aGVyZSAgID0gKCh4Y2x1c3Rlci0yKSA8PCBzYmktPmNsdXN0X3NoaWZ0KSArIGRhdGFfYXJlYTsKKworICAgIHJldHVybiAwOworCitlcnI6CisgICAgZHByaW50ZigiZmF0X25leHRfZXh0ZW50OiByZXR1cm4gZXJyb3JcbiIpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHNlY3Rvcl90IGdldF9uZXh0X3NlY3RvcihzdHJ1Y3QgZnNfaW5mbyogZnMsIHVpbnQzMl90IHNlY3RvcikKK3sKKyAgICBzdHJ1Y3QgZmF0X3NiX2luZm8gKnNiaSA9IEZBVF9TQihmcyk7CisgICAgc2VjdG9yX3QgZGF0YV9hcmVhID0gc2JpLT5kYXRhOworICAgIHNlY3Rvcl90IGRhdGFfc2VjdG9yOworICAgIHVpbnQzMl90IGNsdXN0ZXI7CisgICAgaW50IGNsdXN0X3NoaWZ0ID0gc2JpLT5jbHVzdF9zaGlmdDsKKworICAgIGlmIChzZWN0b3IgPCBkYXRhX2FyZWEpIHsKKwkvKiBSb290IGRpcmVjdG9yeSBzZWN0b3IuLi4gKi8KKwlzZWN0b3IrKzsKKwlpZiAoc2VjdG9yID49IGRhdGFfYXJlYSkKKwkgICAgc2VjdG9yID0gMDsgLyogUmFuIG91dCBvZiByb290IGRpcmVjdG9yeSwgcmV0dXJuIEVPRiAqLworCXJldHVybiBzZWN0b3I7CisgICAgfQorCisgICAgZGF0YV9zZWN0b3IgPSBzZWN0b3IgLSBkYXRhX2FyZWE7CisgICAgaWYgKChkYXRhX3NlY3RvciArIDEpICYgc2JpLT5jbHVzdF9tYXNrKSAgLyogU3RpbGwgaW4gdGhlIHNhbWUgY2x1c3RlciAqLworCXJldHVybiBzZWN0b3IgKyAxOwkJICAgICAgLyogTmV4dCBzZWN0b3IgaW5zaWRlIGNsdXN0ZXIgKi8KKworICAgIC8qIGdldCBhIG5ldyBjbHVzdGVyICovCisgICAgY2x1c3RlciA9IGRhdGFfc2VjdG9yID4+IGNsdXN0X3NoaWZ0OworICAgIGNsdXN0ZXIgPSBnZXRfbmV4dF9jbHVzdGVyKGZzLCBjbHVzdGVyICsgMikgLSAyOworCisgICAgaWYgKGNsdXN0ZXIgPj0gc2JpLT5jbHVzdGVycykKKwlyZXR1cm4gMDsKKworICAgIC8qIHJldHVybiB0aGUgc3RhcnQgb2YgdGhlIG5ldyBjbHVzdGVyICovCisgICAgc2VjdG9yID0gKGNsdXN0ZXIgPDwgY2x1c3Rfc2hpZnQpICsgZGF0YV9hcmVhOworICAgIHJldHVybiBzZWN0b3I7Cit9CisKKy8qCisgKiBUaGUgRkFUIGlzIGEgc2luZ2xlLWxpbmtlZCBsaXN0LiAgV2UgcmVtZW1iZXIgdGhlIGxhc3QgcGxhY2Ugd2UKKyAqIHdlcmUsIHNvIGZvciBhIGZvcndhcmQgc2VlayB3ZSBjYW4gbW92ZSBmb3J3YXJkIGZyb20gdGhlcmUsIGJ1dAorICogZm9yIGEgcmV2ZXJzZSBzZWVrIHdlIGhhdmUgdG8gc3RhcnQgb3Zlci4uLgorICovCitzdGF0aWMgc2VjdG9yX3QgZ2V0X3RoZV9yaWdodF9zZWN0b3Ioc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmlub2RlOworICAgIHVpbnQzMl90IHNlY3Rvcl9wb3MgID0gZmlsZS0+b2Zmc2V0ID4+IFNFQ1RPUl9TSElGVChmaWxlLT5mcyk7CisgICAgdWludDMyX3Qgd2hlcmU7CisgICAgc2VjdG9yX3Qgc2VjdG9yOworCisgICAgaWYgKHNlY3Rvcl9wb3MgPCBQVlQoaW5vZGUpLT5vZmZzZXQpIHsKKwkvKiBSZXZlcnNlIHNlZWsgKi8KKwl3aGVyZSA9IDA7CisJc2VjdG9yID0gUFZUKGlub2RlKS0+c3RhcnQ7CisgICAgfSBlbHNlIHsKKwl3aGVyZSA9IFBWVChpbm9kZSktPm9mZnNldDsKKwlzZWN0b3IgPSBQVlQoaW5vZGUpLT5oZXJlOworICAgIH0KKworICAgIHdoaWxlICh3aGVyZSA8IHNlY3Rvcl9wb3MpIHsKKwlzZWN0b3IgPSBnZXRfbmV4dF9zZWN0b3IoZmlsZS0+ZnMsIHNlY3Rvcik7CisJd2hlcmUrKzsKKyAgICB9CisKKyAgICBQVlQoaW5vZGUpLT5vZmZzZXQgPSBzZWN0b3JfcG9zOworICAgIFBWVChpbm9kZSktPmhlcmUgICA9IHNlY3RvcjsKKworICAgIHJldHVybiBzZWN0b3I7Cit9CisKKy8qCisgKiBHZXQgdGhlIG5leHQgc2VjdG9yIGluIHNlcXVlbmNlCisgKi8KK3N0YXRpYyBzZWN0b3JfdCBuZXh0X3NlY3RvcihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+aW5vZGU7CisgICAgc2VjdG9yX3Qgc2VjdG9yID0gZ2V0X25leHRfc2VjdG9yKGZpbGUtPmZzLCBQVlQoaW5vZGUpLT5oZXJlKTsKKyAgICBQVlQoaW5vZGUpLT5vZmZzZXQrKzsKKyAgICBQVlQoaW5vZGUpLT5oZXJlID0gc2VjdG9yOworCisgICAgcmV0dXJuIHNlY3RvcjsKK30KKworLyoqCisgKiBtYW5nbGVfbmFtZToKKyAqCisgKiBNYW5nbGUgYSBmaWxlbmFtZSBwb2ludGVkIHRvIGJ5IHNyYyBpbnRvIGEgYnVmZmVyIHBvaW50ZWQKKyAqIHRvIGJ5IGRzdDsgZW5kcyBvbiBlbmNvdW50ZXJpbmcgYW55IHdoaXRlc3BhY2UuCisgKiBkc3QgaXMgcHJlc2VydmVkLgorICoKKyAqIFRoaXMgdmVyaWZpZXMgdGhhdCBhIGZpbGVuYW1lIGlzIDwgRklMRU5BTUVfTUFYIGNoYXJhY3RlcnMsCisgKiBkb2Vzbid0IGNvbnRhaW4gd2hpdGVzcGFjZSwgemVyby1wYWRzIHRoZSBvdXRwdXQgYnVmZmVyLAorICogYW5kIHJlbW92ZXMgcmVkdW5kYW50IHNsYXNoZXMuCisgKgorICogVW5saWtlIHRoZSBnZW5lcmljIHZlcnNpb24sIHRoaXMgYWxzbyBjb252ZXJ0cyBiYWNrc2xhc2hlcyB0bworICogZm9yd2FyZCBzbGFzaGVzLgorICoKKyAqLworc3RhdGljIHZvaWQgdmZhdF9tYW5nbGVfbmFtZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICBjaGFyICpwID0gZHN0OworICAgIGludCBpID0gRklMRU5BTUVfTUFYLTE7CisgICAgY2hhciBjOworCisgICAgd2hpbGUgKG5vdF93aGl0ZXNwYWNlKGMgPSAqc3JjKSkgeworCWlmIChjID09ICdcXCcpCisJICAgIGMgPSAnLyc7CisKKyAgICAgICAgaWYgKGMgPT0gJy8nKSB7CisgICAgICAgICAgICBpZiAoc3JjWzFdID09ICcvJyB8fCBzcmNbMV0gPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpLS07CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZHN0ID09IHApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGRzdFstMV0gIT0gJy8nKQorICAgICAgICAgICAgYnJlYWs7CisJaWYgKChkc3RbLTFdID09ICcvJykgJiYgKChkc3QgLSAxKSA9PSBwKSkKKwkgICAgYnJlYWs7CisKKyAgICAgICAgZHN0LS07CisgICAgICAgIGkrKzsKKyAgICB9CisKKyAgICBpKys7CisgICAgZm9yICg7IGkgPiAwOyBpIC0tKQorICAgICAgICAqZHN0KysgPSAnXDAnOworfQorCisvKgorICogTWFuZ2xlIGEgbm9ybWFsIHN0eWxlIHN0cmluZyB0byBET1Mgc3R5bGUgc3RyaW5nLgorICovCitzdGF0aWMgdm9pZCBtYW5nbGVfZG9zX25hbWUoY2hhciAqbWFuZ2xlX2J1ZiwgY29uc3QgY2hhciAqc3JjKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgYzsKKworICAgIGlmIChzcmNbMF0gPT0gJy4nICYmICghc3JjWzFdIHx8IChzcmNbMV0gPT0gJy4nICYmICFzcmNbMl0pKSkgeworCS8qIC4gYW5kIC4uIG1hbmdsZSB0byB0aGVpciByZXNwZWN0aXZlIHplcm8tcGFkZGVkIHZlcnNpb24gKi8KKwlpID0gc3RwY3B5KG1hbmdsZV9idWYsIHNyYykgLSBtYW5nbGVfYnVmOworICAgIH0gZWxzZSB7CisJaSA9IDA7CisJd2hpbGUgKGkgPCAxMSkgeworCSAgICBjID0gKnNyYysrOworCSAgICAKKwlpZiAoKGMgPD0gJyAnKSB8fCAoYyA9PSAnLycpKQorCSAgICBicmVhazsKKwkKKwlpZiAoYyA9PSAnLicpIHsKKwkgICAgd2hpbGUgKGkgPCA4KQorCQltYW5nbGVfYnVmW2krK10gPSAnICc7CisJICAgIGkgPSA4OworCSAgICBjb250aW51ZTsKKwl9CisJCisJYyA9IGNvZGVwYWdlLnVwcGVyW2NdOworCWlmIChpID09IDAgJiYgYyA9PSAweGU1KQorCSAgICBjID0gMHgwNTsJCS8qIFNwZWNpYWwgaGFjayBmb3IgdGhlIGZpcnN0IGJ5dGUgb25seSEgKi8KKwkKKwltYW5nbGVfYnVmW2krK10gPSBjOworCX0KKyAgICB9CisKKyAgICB3aGlsZSAoaSA8IDExKQorCW1hbmdsZV9idWZbaSsrXSA9ICcgJzsKKworICAgIG1hbmdsZV9idWZbaV0gPSAnXDAnOworfQorCisvKgorICogTWF0Y2ggYSBzdHJpbmcgbmFtZSBhZ2FpbnN0IGEgbG9uZ25hbWUuICAibGVuIiBpcyB0aGUgbnVtYmVyIG9mCisgKiBjb2RlcG9pbnRzIGluIHRoZSBpbnB1dDsgaW5jbHVkaW5nIHBhZGRpbmcuCisgKgorICogUmV0dXJucyB0cnVlIG9uIG1hdGNoLgorICovCitzdGF0aWMgYm9vbCB2ZmF0X21hdGNoX2xvbmduYW1lKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgdWludDE2X3QgKm1hdGNoLAorCQkJCWludCBsZW4pCit7CisgICAgdW5zaWduZWQgY2hhciBjID0gLTE7CS8qIE5vbnplcm86IHdlIGhhdmUgbm90IHlldCBzZWVuIE5VTCAqLworICAgIHVpbnQxNl90IGNwOworCisgICAgZHByaW50ZigiTWF0Y2hpbmc6ICVzIGxlbiAlZFxuIiwgc3RyLCBsZW4pOworCisgICAgd2hpbGUgKGxlbikgeworCWNwID0gKm1hdGNoKys7CisJbGVuLS07CisJaWYgKCFjcCkKKwkgICAgYnJlYWs7CisJYyA9ICpzdHIrKzsKKwlpZiAoY3AgIT0gY29kZXBhZ2UudW5pWzBdW2NdICYmIGNwICE9IGNvZGVwYWdlLnVuaVsxXVtjXSkKKwkgICAgcmV0dXJuIGZhbHNlOwkvKiBBbHNvIGhhbmRsZXMgYyA9PSAnXDAnICovCisgICAgfQorCisgICAgLyogVGhpcyBzaG91bGQgaGF2ZSBiZWVuIHRoZSBlbmQgb2YgdGhlIG1hdGNoaW5nIHN0cmluZyAqLworICAgIGlmICgqc3RyKQorCXJldHVybiBmYWxzZTsKKworICAgIC8qIEFueSBwYWRkaW5nIGVudHJpZXMgbXVzdCBiZSBGRkZGICovCisgICAgd2hpbGUgKGxlbi0tKQorCWlmICgqbWF0Y2grKyAhPSAweGZmZmYpCisJICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogQ29udmVydCBhbiBVVEYtMTYgbG9uZ25hbWUgdG8gdGhlIHN5c3RlbSBjb2RlcGFnZTsgcmV0dXJuCisgKiB0aGUgbGVuZ3RoIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCB2ZmF0X2N2dF9sb25nbmFtZShjaGFyICplbnRyeV9uYW1lLCBjb25zdCB1aW50MTZfdCAqbG9uZ19uYW1lKQoreworICAgIHN0cnVjdCB1bmljYWNoZSB7CisJdWludDE2X3QgdXRmMTY7CisJdWludDhfdCBjcDsKKyAgICB9OworICAgIHN0YXRpYyBzdHJ1Y3QgdW5pY2FjaGUgdW5pY2FjaGVbMjU2XTsKKyAgICBzdHJ1Y3QgdW5pY2FjaGUgKnVjOworICAgIHVpbnQxNl90IGNwOworICAgIHVuc2lnbmVkIGludCBjOworICAgIGNoYXIgKnAgPSBlbnRyeV9uYW1lOworCisgICAgZG8geworCWNwID0gKmxvbmdfbmFtZSsrOworCXVjID0gJnVuaWNhY2hlW2NwICUgMjU2XTsKKworCWlmIChfX2xpa2VseSh1Yy0+dXRmMTYgPT0gY3ApKSB7CisJICAgICpwKysgPSB1Yy0+Y3A7CisJfSBlbHNlIHsKKwkgICAgZm9yIChjID0gMDsgYyA8IDUxMjsgYysrKSB7CisJCS8qIFRoaXMgaXMgYSBiaXQgaGFja3kuLi4gKi8KKwkJaWYgKGNvZGVwYWdlLnVuaVswXVtjXSA9PSBjcCkgeworCQkgICAgdWMtPnV0ZjE2ID0gY3A7CisJCSAgICAqcCsrID0gdWMtPmNwID0gKHVpbnQ4X3QpYzsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gLTE7CQkvKiBJbXBvc3NpYmxlIGNoYXJhY3RlciAqLworCWZvdW5kOgorCSAgICA7CisJfQorICAgIH0gd2hpbGUgKGNwKTsKKworICAgIHJldHVybiAocC1lbnRyeV9uYW1lKS0xOworfQorCitzdGF0aWMgdm9pZCBjb3B5X2xvbmdfY2h1bmsodWludDE2X3QgKmJ1ZiwgY29uc3Qgc3RydWN0IGZhdF9kaXJfZW50cnkgKmRlKQoreworICAgIGNvbnN0IHN0cnVjdCBmYXRfbG9uZ19uYW1lX2VudHJ5ICpsZSA9CisJKGNvbnN0IHN0cnVjdCBmYXRfbG9uZ19uYW1lX2VudHJ5ICopZGU7CisKKyAgICBtZW1jcHkoYnVmLCAgICAgIGxlLT5uYW1lMSwgNSAqIDIpOworICAgIG1lbWNweShidWYgKyA1LCAgbGUtPm5hbWUyLCA2ICogMik7CisgICAgbWVtY3B5KGJ1ZiArIDExLCBsZS0+bmFtZTMsIDIgKiAyKTsKK30KKworc3RhdGljIHVpbnQ4X3QgZ2V0X2NoZWNrc3VtKGNvbnN0IGNoYXIgKmRpcl9uYW1lKQoreworICAgIGludCAgaTsKKyAgICB1aW50OF90IHN1bSA9IDA7CisKKyAgICBmb3IgKGkgPSAxMTsgaTsgaS0tKQorCXN1bSA9ICgoc3VtICYgMSkgPDwgNykgKyAoc3VtID4+IDEpICsgKHVpbnQ4X3QpKmRpcl9uYW1lKys7CisgICAgcmV0dXJuIHN1bTsKK30KKworCisvKiBjb21wdXRlIHRoZSBmaXJzdCBzZWN0b3IgbnVtYmVyIG9mIG9uZSBkaXIgd2hlcmUgdGhlIGRhdGEgc3RvcmVzICovCitzdGF0aWMgaW5saW5lIHNlY3Rvcl90IGZpcnN0X3NlY3RvcihzdHJ1Y3QgZnNfaW5mbyAqZnMsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBmYXRfZGlyX2VudHJ5ICpkaXIpCit7CisgICAgY29uc3Qgc3RydWN0IGZhdF9zYl9pbmZvICpzYmkgPSBGQVRfU0IoZnMpOworICAgIHNlY3Rvcl90IGZpcnN0X2NsdXN0OworICAgIHNlY3Rvcl90IHNlY3RvcjsKKworICAgIGZpcnN0X2NsdXN0ID0gKGRpci0+Zmlyc3RfY2x1c3Rlcl9oaWdoIDw8IDE2KSArIGRpci0+Zmlyc3RfY2x1c3Rlcl9sb3c7CisgICAgaWYgKGZpcnN0X2NsdXN0ID09IDApCisJc2VjdG9yID0gc2JpLT5yb290OwkvKiBmaXJzdF9jbHVzdCA9PSAwIG1lYW5zIHJvb3QgZGlyZWN0b3J5ICovCisgICAgZWxzZQorCXNlY3RvciA9ICgoZmlyc3RfY2x1c3QgLSAyKSA8PCBzYmktPmNsdXN0X3NoaWZ0KSArIHNiaS0+ZGF0YTsKKworICAgIHJldHVybiBzZWN0b3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgZW51bSBkaXJlbnRfdHlwZSBnZXRfaW5vZGVfbW9kZSh1aW50OF90IGF0dHIpCit7CisgICAgcmV0dXJuIChhdHRyICYgRkFUX0FUVFJfRElSRUNUT1JZKSA/IERUX0RJUiA6IERUX1JFRzsKK30KKworCitzdGF0aWMgc3RydWN0IGlub2RlICp2ZmF0X2ZpbmRfZW50cnkoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IGRpci0+ZnM7CisgICAgc3RydWN0IGlub2RlICppbm9kZTsKKyAgICBjb25zdCBzdHJ1Y3QgZmF0X2Rpcl9lbnRyeSAqZGU7CisgICAgc3RydWN0IGZhdF9sb25nX25hbWVfZW50cnkgKmxvbmdfZGU7CisKKyAgICBjaGFyIG1hbmdsZWRfbmFtZVsxMl07CisgICAgdWludDE2X3QgbG9uZ19uYW1lWzI2MF07CS8qID09IDIwKjEzICovCisgICAgaW50IGxvbmdfbGVuOworCisgICAgc2VjdG9yX3QgZGlyX3NlY3RvciA9IFBWVChkaXIpLT5zdGFydDsKKyAgICB1aW50OF90IHZmYXRfaW5pdCwgdmZhdF9uZXh0LCB2ZmF0X2NzdW0gPSAwOworICAgIHVpbnQ4X3QgaWQ7CisgICAgaW50IHNsb3RzOworICAgIGludCBlbnRyaWVzOworICAgIGludCBjaGVja3N1bTsKKyAgICBpbnQgbG9uZ19tYXRjaCA9IDA7CisKKyAgICBzbG90cyA9IChzdHJsZW4oZG5hbWUpICsgMTIpIC8gMTM7CisgICAgaWYgKHNsb3RzID4gMjApCisJcmV0dXJuIE5VTEw7CQkvKiBOYW1lIHRvbyBsb25nICovCisKKyAgICBzbG90cyB8PSAweDQwOworICAgIHZmYXRfaW5pdCA9IHZmYXRfbmV4dCA9IHNsb3RzOworICAgIGxvbmdfbGVuID0gc2xvdHMqMTM7CisKKyAgICAvKiBQcm9kdWNlIHRoZSBzaG9ydG5hbWUgdmVyc2lvbiwgaW4gY2FzZSB3ZSBuZWVkIGl0LiAqLworICAgIG1hbmdsZV9kb3NfbmFtZShtYW5nbGVkX25hbWUsIGRuYW1lKTsKKworICAgIHdoaWxlIChkaXJfc2VjdG9yKSB7CisJZGUgPSBnZXRfY2FjaGUoZnMtPmZzX2RldiwgZGlyX3NlY3Rvcik7CisJZW50cmllcyA9IDEgPDwgKGZzLT5zZWN0b3Jfc2hpZnQgLSA1KTsKKworCXdoaWxlIChlbnRyaWVzLS0pIHsKKwkgICAgaWYgKGRlLT5uYW1lWzBdID09IDApCisJCXJldHVybiBOVUxMOworCisJICAgIGlmIChkZS0+YXR0ciA9PSAweDBmKSB7CisJCS8qCisJCSAqIEl0J3MgYSBsb25nIG5hbWUgZW50cnkuCisJCSAqLworCQlsb25nX2RlID0gKHN0cnVjdCBmYXRfbG9uZ19uYW1lX2VudHJ5ICopZGU7CisJCWlkID0gbG9uZ19kZS0+aWQ7CisJCWlmIChpZCAhPSB2ZmF0X25leHQpCisJCSAgICBnb3RvIG5vdF9tYXRjaDsKKworCQlpZiAoaWQgJiAweDQwKSB7CisJCSAgICAvKiBnZXQgdGhlIGluaXRpYWwgY2hlY2tzdW0gdmFsdWUgKi8KKwkJICAgIHZmYXRfY3N1bSA9IGxvbmdfZGUtPmNoZWNrc3VtOworCQkgICAgaWQgJj0gMHgzZjsKKwkJICAgIGxvbmdfbGVuID0gaWQgKiAxMzsKKworCQkgICAgLyogWkVSTyB0aGUgbG9uZ19uYW1lIGJ1ZmZlciAqLworCQkgICAgbWVtc2V0KGxvbmdfbmFtZSwgMCwgc2l6ZW9mIGxvbmdfbmFtZSk7CisJCX0gZWxzZSB7CisJCSAgICBpZiAobG9uZ19kZS0+Y2hlY2tzdW0gIT0gdmZhdF9jc3VtKQorCQkJZ290byBub3RfbWF0Y2g7CisJCX0KKworCQl2ZmF0X25leHQgPSAtLWlkOworCisJCS8qIGdvdCB0aGUgbG9uZyBlbnRyeSBuYW1lICovCisJCWNvcHlfbG9uZ19jaHVuayhsb25nX25hbWUgKyBpZCoxMywgZGUpOworCisJCS8qCisJCSAqIElmIHdlIGdvdCB0aGUgbGFzdCBlbnRyeSwgY2hlY2sgaXQuCisJCSAqIE9yLCBnbyBvbiB3aXRoIHRoZSBuZXh0IGVudHJ5LgorCQkgKi8KKwkJaWYgKGlkID09IDApIHsKKwkJICAgIGlmICghdmZhdF9tYXRjaF9sb25nbmFtZShkbmFtZSwgbG9uZ19uYW1lLCBsb25nX2xlbikpCisJCQlnb3RvIG5vdF9tYXRjaDsKKwkJICAgIGxvbmdfbWF0Y2ggPSAxOworCQl9CisJCWRlKys7CisJCWNvbnRpbnVlOyAgICAgLyogVHJ5IHRoZSBuZXh0IGVudHJ5ICovCisJICAgIH0gZWxzZSB7CisJCS8qCisJCSAqIEl0J3MgYSBzaG9ydCBlbnRyeQorCQkgKi8KKwkJaWYgKGRlLT5hdHRyICYgMHgwOCkgLyogaWdub3JlIHZvbHVtZSBsYWJlbHMgKi8KKwkJICAgIGdvdG8gbm90X21hdGNoOworCisJCWlmIChsb25nX21hdGNoKSB7CisJCSAgICAvKgorCQkgICAgICogV2UgYWxyZWFkeSBoYXZlIGEgVkZBVCBsb25nIG5hbWUgbWF0Y2guIEhvd2V2ZXIsIHRoZQorCQkgICAgICogbWF0Y2ggaXMgb25seSB2YWxpZCBpZiB0aGUgY2hlY2tzdW0gbWF0Y2hlcy4KKwkJICAgICAqLworCQkgICAgY2hlY2tzdW0gPSBnZXRfY2hlY2tzdW0oZGUtPm5hbWUpOworCQkgICAgaWYgKGNoZWNrc3VtID09IHZmYXRfY3N1bSkKKwkJCWdvdG8gZm91bmQ7ICAvKiBHb3QgaXQgKi8KKwkJfSBlbHNlIHsKKwkJICAgIGlmICghbWVtY21wKG1hbmdsZWRfbmFtZSwgZGUtPm5hbWUsIDExKSkKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwkgICAgfQorCisJbm90X21hdGNoOgorCSAgICB2ZmF0X25leHQgPSB2ZmF0X2luaXQ7CisJICAgIGxvbmdfbWF0Y2ggPSAwOworCisJICAgIGRlKys7CisJfQorCisJLyogVHJ5IHdpdGggdGhlIG5leHQgc2VjdG9yICovCisJZGlyX3NlY3RvciA9IGdldF9uZXh0X3NlY3RvcihmcywgZGlyX3NlY3Rvcik7CisgICAgfQorICAgIHJldHVybiBOVUxMOwkJLyogTm90aGluZyBmb3VuZC4uLiAqLworCitmb3VuZDoKKyAgICBpbm9kZSA9IG5ld19mYXRfaW5vZGUoZnMpOworICAgIGlub2RlLT5zaXplID0gZGUtPmZpbGVfc2l6ZTsKKyAgICBQVlQoaW5vZGUpLT5zdGFydF9jbHVzdGVyID0gCisJKGRlLT5maXJzdF9jbHVzdGVyX2hpZ2ggPDwgMTYpICsgZGUtPmZpcnN0X2NsdXN0ZXJfbG93OworICAgIGlmIChQVlQoaW5vZGUpLT5zdGFydF9jbHVzdGVyID09IDApIHsKKwkvKiBSb290IGRpcmVjdG9yeSAqLworCWludCByb290X3NpemUgPSBGQVRfU0IoZnMpLT5yb290X3NpemU7CisKKwlQVlQoaW5vZGUpLT5zdGFydF9jbHVzdGVyID0gRkFUX1NCKGZzKS0+cm9vdF9jbHVzdGVyOworCWlub2RlLT5zaXplID0gcm9vdF9zaXplID8gcm9vdF9zaXplIDw8IGZzLT5zZWN0b3Jfc2hpZnQgOiB+MDsKKwlQVlQoaW5vZGUpLT5zdGFydCA9IFBWVChpbm9kZSktPmhlcmUgPSBGQVRfU0IoZnMpLT5yb290OworICAgIH0gZWxzZSB7CisJUFZUKGlub2RlKS0+c3RhcnQgPSBQVlQoaW5vZGUpLT5oZXJlID0gZmlyc3Rfc2VjdG9yKGZzLCBkZSk7CisgICAgfQorICAgIGlub2RlLT5tb2RlID0gZ2V0X2lub2RlX21vZGUoZGUtPmF0dHIpOworCisgICAgcmV0dXJuIGlub2RlOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICp2ZmF0X2lnZXRfcm9vdChzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19mYXRfaW5vZGUoZnMpOworICAgIGludCByb290X3NpemUgPSBGQVRfU0IoZnMpLT5yb290X3NpemU7CisKKyAgICAvKgorICAgICAqIEZvciBGQVQzMiwgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgcm9vdCBkaXJlY3Rvcnkgc2l6ZSBpcyB0bworICAgICAqIGZvbGxvdyB0aGUgZW50aXJlIEZBVCBjaGFpbiB0byB0aGUgZW5kLi4uIHdoaWNoIHNlZW1zIHBvaW50bGVzcy4KKyAgICAgKi8KKyAgICBQVlQoaW5vZGUpLT5zdGFydF9jbHVzdGVyID0gRkFUX1NCKGZzKS0+cm9vdF9jbHVzdGVyOworICAgIGlub2RlLT5zaXplID0gcm9vdF9zaXplID8gcm9vdF9zaXplIDw8IGZzLT5zZWN0b3Jfc2hpZnQgOiB+MDsKKyAgICBQVlQoaW5vZGUpLT5zdGFydCA9IFBWVChpbm9kZSktPmhlcmUgPSBGQVRfU0IoZnMpLT5yb290OworICAgIGlub2RlLT5tb2RlID0gRFRfRElSOworCisgICAgcmV0dXJuIGlub2RlOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICp2ZmF0X2lnZXQoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQoreworICAgIHJldHVybiB2ZmF0X2ZpbmRfZW50cnkoZG5hbWUsIHBhcmVudCk7Cit9CisKK3N0YXRpYyBpbnQgdmZhdF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyZW50ICpkaXJlbnQpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gZmlsZS0+ZnM7CisgICAgY29uc3Qgc3RydWN0IGZhdF9kaXJfZW50cnkgKmRlOworICAgIGNvbnN0IGNoYXIgKmRhdGE7CisgICAgY29uc3Qgc3RydWN0IGZhdF9sb25nX25hbWVfZW50cnkgKmxvbmdfZGU7CisKKyAgICBzZWN0b3JfdCBzZWN0b3IgPSBnZXRfdGhlX3JpZ2h0X3NlY3RvcihmaWxlKTsKKworICAgIHVpbnQxNl90IGxvbmdfbmFtZVsyNjFdOwkvKiA9PSAyMCoxMyArIDEgKHRvIGd1YXJhbnRlZSBudWxsKSAqLworICAgIGNoYXIgZmlsZW5hbWVbMjYxXTsKKyAgICBpbnQgbmFtZV9sZW4gPSAwOworCisgICAgdWludDhfdCB2ZmF0X25leHQsIHZmYXRfY3N1bTsKKyAgICB1aW50OF90IGlkOworICAgIGludCBlbnRyaWVzX2xlZnQ7CisgICAgYm9vbCBsb25nX2VudHJ5ID0gZmFsc2U7CisgICAgaW50IHNlY19vZmYgPSBmaWxlLT5vZmZzZXQgJiAoKDEgPDwgZnMtPnNlY3Rvcl9zaGlmdCkgLSAxKTsKKworICAgIGRhdGEgPSBnZXRfY2FjaGUoZnMtPmZzX2Rldiwgc2VjdG9yKTsKKyAgICBkZSA9IChjb25zdCBzdHJ1Y3QgZmF0X2Rpcl9lbnRyeSAqKShkYXRhICsgc2VjX29mZik7CisgICAgZW50cmllc19sZWZ0ID0gKCgxIDw8IGZzLT5zZWN0b3Jfc2hpZnQpIC0gc2VjX29mZikgPj4gNTsKKworICAgIHZmYXRfbmV4dCA9IHZmYXRfY3N1bSA9IDB4ZmY7CisKKyAgICB3aGlsZSAoMSkgeworCXdoaWxlIChlbnRyaWVzX2xlZnQtLSkgeworCSAgICBpZiAoZGUtPm5hbWVbMF0gPT0gMCkKKwkJcmV0dXJuIC0xOwkvKiBFbmQgb2YgZGlyZWN0b3J5ICovCisJICAgIGlmICgodWludDhfdClkZS0+bmFtZVswXSA9PSAweGU1KQorCQlnb3RvIGludmFsaWQ7CisKKwkgICAgaWYgKGRlLT5hdHRyID09IDB4MGYpIHsKKwkJLyoKKwkJICogSXQncyBhIGxvbmcgbmFtZSBlbnRyeS4KKwkJICovCisJCWxvbmdfZGUgPSAoc3RydWN0IGZhdF9sb25nX25hbWVfZW50cnkgKilkZTsKKwkJaWQgPSBsb25nX2RlLT5pZDsKKworCQlpZiAoaWQgJiAweDQwKSB7CisJCSAgICAvKiBpbml0IHZmYXRfY3N1bSAqLworCQkgICAgdmZhdF9jc3VtID0gbG9uZ19kZS0+Y2hlY2tzdW07CisJCSAgICBpZCAmPSAweDNmOworCQkgICAgaWYgKGlkID49IDIwKQorCQkJZ290byBpbnZhbGlkOyAvKiBUb28gbG9uZyEgKi8KKworCQkgICAgLyogWkVSTyB0aGUgbG9uZ19uYW1lIGJ1ZmZlciAqLworCQkgICAgbWVtc2V0KGxvbmdfbmFtZSwgMCwgc2l6ZW9mIGxvbmdfbmFtZSk7CisJCX0gZWxzZSB7CisJCSAgICBpZiAobG9uZ19kZS0+Y2hlY2tzdW0gIT0gdmZhdF9jc3VtIHx8IGlkICE9IHZmYXRfbmV4dCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJfQorCisJCXZmYXRfbmV4dCA9IC0taWQ7CisKKwkJLyogZ290IHRoZSBsb25nIGVudHJ5IG5hbWUgKi8KKwkJY29weV9sb25nX2NodW5rKGxvbmdfbmFtZSArIGlkKjEzLCBkZSk7CisKKwkJaWYgKGlkID09IDApIHsKKwkJICAgIG5hbWVfbGVuID0gdmZhdF9jdnRfbG9uZ25hbWUoZmlsZW5hbWUsIGxvbmdfbmFtZSk7CisJCSAgICBpZiAobmFtZV9sZW4gPiAwICYmIG5hbWVfbGVuIDwgc2l6ZW9mKGRpcmVudC0+ZF9uYW1lKSkKKwkJCWxvbmdfZW50cnkgPSB0cnVlOworCQl9CisKKwkJZ290byBuZXh0OworCSAgICB9IGVsc2UgeworCQkvKgorCQkgKiBJdCdzIGEgc2hvcnQgZW50cnkKKwkJICovCisJCWlmIChkZS0+YXR0ciAmIDB4MDgpIC8qIGlnbm9yZSB2b2x1bWUgbGFiZWxzICovCisJCSAgICBnb3RvIGludmFsaWQ7CisKKwkJaWYgKGxvbmdfZW50cnkgJiYgZ2V0X2NoZWNrc3VtKGRlLT5uYW1lKSA9PSB2ZmF0X2NzdW0pIHsKKwkJICAgLyogR290IGEgbG9uZyBlbnRyeSAqLworCQl9IGVsc2UgeworCQkgICAgLyogVXNlIHRoZSBzaG9ydG5hbWUgKi8KKwkJICAgIGludCBpOworCQkgICAgdWludDhfdCBjOworCQkgICAgY2hhciAqcCA9IGZpbGVuYW1lOworCisJCSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQljID0gZGUtPm5hbWVbaV07CisJCQlpZiAoYyA9PSAnICcpCisJCQkgICAgYnJlYWs7CisJCQlpZiAoZGUtPmxjYXNlICYgTENBU0VfQkFTRSkKKwkJCSAgICBjID0gY29kZXBhZ2UubG93ZXJbY107CisJCQkqcCsrID0gYzsKKwkJICAgIH0KKwkJICAgIGlmIChkZS0+bmFtZVs4XSAhPSAnICcpIHsKKwkJCSpwKysgPSAnLic7CisJCQlmb3IgKGkgPSA4OyBpIDwgMTE7IGkrKykgeworCQkJICAgIGMgPSBkZS0+bmFtZVtpXTsKKwkJCSAgICBpZiAoYyA9PSAnICcpCisJCQkJYnJlYWs7CisJCQkgICAgaWYgKGRlLT5sY2FzZSAmIExDQVNFX0VYVCkKKwkJCQljID0gY29kZXBhZ2UubG93ZXJbY107CisJCQkgICAgKnArKyA9IGM7CisJCQl9CisJCSAgICB9CisJCSAgICAqcCA9ICdcMCc7CisJCSAgICBuYW1lX2xlbiA9IHAgLSBmaWxlbmFtZTsKKwkJfQorCQlnb3RvIGdvdDsJLyogR290IHNvbWV0aGluZyBvbmUgd2F5IG9yIHRoZSBvdGhlciAqLworCSAgICB9CisKKwlpbnZhbGlkOgorCSAgICBsb25nX2VudHJ5ID0gZmFsc2U7CisJbmV4dDoKKwkgICAgZGUrKzsKKwkgICAgZmlsZS0+b2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZmF0X2Rpcl9lbnRyeSk7CisJfQorCisJLyogVHJ5IHdpdGggdGhlIG5leHQgc2VjdG9yICovCisJc2VjdG9yID0gbmV4dF9zZWN0b3IoZmlsZSk7CisJaWYgKCFzZWN0b3IpCisJICAgIHJldHVybiAtMTsKKwlkZSA9IGdldF9jYWNoZShmcy0+ZnNfZGV2LCBzZWN0b3IpOworCWVudHJpZXNfbGVmdCA9IDEgPDwgKGZzLT5zZWN0b3Jfc2hpZnQgLSA1KTsKKyAgICB9CisKK2dvdDoKKyAgICBuYW1lX2xlbisrOwkJCS8qIEluY2x1ZGUgZmluYWwgbnVsbCAqLworICAgIGRpcmVudC0+ZF9pbm8gPSBkZS0+Zmlyc3RfY2x1c3Rlcl9sb3cgfCAoZGUtPmZpcnN0X2NsdXN0ZXJfaGlnaCA8PCAxNik7CisgICAgZGlyZW50LT5kX29mZiA9IGZpbGUtPm9mZnNldDsKKyAgICBkaXJlbnQtPmRfcmVjbGVuID0gb2Zmc2V0b2Yoc3RydWN0IGRpcmVudCwgZF9uYW1lKSArIG5hbWVfbGVuOworICAgIGRpcmVudC0+ZF90eXBlID0gZ2V0X2lub2RlX21vZGUoZGUtPmF0dHIpOworICAgIG1lbWNweShkaXJlbnQtPmRfbmFtZSwgZmlsZW5hbWUsIG5hbWVfbGVuKTsKKworICAgIGZpbGUtPm9mZnNldCArPSBzaXplb2YoKmRlKTsgIC8qIFVwZGF0ZSBmb3IgbmV4dCByZWFkaW5nICovCisKKyAgICByZXR1cm4gMDsKK30KKworLyogaW5pdC4gdGhlIGZzIG1ldGEgZGF0YSwgcmV0dXJuIHRoZSBibG9jayBzaXplIGluIGJpdHMgKi8KK3N0YXRpYyBpbnQgdmZhdF9mc19pbml0KHN0cnVjdCBmc19pbmZvICpmcykKK3sKKyAgICBzdHJ1Y3QgZmF0X2JwYiBmYXQ7CisgICAgc3RydWN0IGZhdF9zYl9pbmZvICpzYmk7CisgICAgc3RydWN0IGRpc2sgKmRpc2sgPSBmcy0+ZnNfZGV2LT5kaXNrOworICAgIGludCBzZWN0b3JzX3Blcl9mYXQ7CisgICAgdWludDMyX3QgY2x1c3RlcnM7CisgICAgc2VjdG9yX3QgdG90YWxfc2VjdG9yczsKKworICAgIGZzLT5zZWN0b3Jfc2hpZnQgPSBmcy0+YmxvY2tfc2hpZnQgPSBkaXNrLT5zZWN0b3Jfc2hpZnQ7CisgICAgZnMtPnNlY3Rvcl9zaXplICA9IDEgPDwgZnMtPnNlY3Rvcl9zaGlmdDsKKyAgICBmcy0+YmxvY2tfc2l6ZSAgID0gMSA8PCBmcy0+YmxvY2tfc2hpZnQ7CisKKyAgICBkaXNrLT5yZHdyX3NlY3RvcnMoZGlzaywgJmZhdCwgMCwgMSwgMCk7CisKKyAgICAvKiBYWFg6IEZpbmQgYmV0dGVyIHNhbml0eSBjaGVja3MuLi4gKi8KKyAgICBpZiAoIWZhdC5ieFJlc1NlY3RvcnMgfHwgIWZhdC5ieEZBVHMpCisJcmV0dXJuIC0xOworICAgIHNiaSA9IG1hbGxvYyhzaXplb2YoKnNiaSkpOworICAgIGlmICghc2JpKQorCW1hbGxvY19lcnJvcigiZmF0X3NiX2luZm8gc3RydWN0dXJlIik7CisgICAgZnMtPmZzX2luZm8gPSBzYmk7CisKKyAgICBzZWN0b3JzX3Blcl9mYXQgPSBmYXQuYnhGQVRzZWNzID8gOiBmYXQuZmF0MzIuYnhGQVRzZWNzXzMyOworICAgIHRvdGFsX3NlY3RvcnMgICA9IGZhdC5ieFNlY3RvcnMgPyA6IGZhdC5ic0h1Z2VTZWN0b3JzOworCisgICAgc2JpLT5mYXQgICAgICAgPSBmYXQuYnhSZXNTZWN0b3JzOworICAgIHNiaS0+cm9vdCAgICAgID0gc2JpLT5mYXQgKyBzZWN0b3JzX3Blcl9mYXQgKiBmYXQuYnhGQVRzOworICAgIHNiaS0+cm9vdF9zaXplID0gcm9vdF9kaXJfc2l6ZShmcywgJmZhdCk7CisgICAgc2JpLT5kYXRhICAgICAgPSBzYmktPnJvb3QgKyBzYmktPnJvb3Rfc2l6ZTsKKworICAgIHNiaS0+Y2x1c3Rfc2hpZnQgICAgICA9IGlsb2cyKGZhdC5ieFNlY1BlckNsdXN0KTsKKyAgICBzYmktPmNsdXN0X2J5dGVfc2hpZnQgPSBzYmktPmNsdXN0X3NoaWZ0ICsgZnMtPnNlY3Rvcl9zaGlmdDsKKyAgICBzYmktPmNsdXN0X21hc2sgICAgICAgPSBmYXQuYnhTZWNQZXJDbHVzdCAtIDE7CisgICAgc2JpLT5jbHVzdF9zaXplICAgICAgID0gZmF0LmJ4U2VjUGVyQ2x1c3QgPDwgZnMtPnNlY3Rvcl9zaGlmdDsKKworICAgIGNsdXN0ZXJzID0gKHRvdGFsX3NlY3RvcnMgLSBzYmktPmRhdGEpID4+IHNiaS0+Y2x1c3Rfc2hpZnQ7CisgICAgaWYgKGNsdXN0ZXJzIDw9IDB4ZmY0KSB7CisJc2JpLT5mYXRfdHlwZSA9IEZBVDEyOworICAgIH0gZWxzZSBpZiAoY2x1c3RlcnMgPD0gMHhmZmY0KSB7CisJc2JpLT5mYXRfdHlwZSA9IEZBVDE2OworICAgIH0gZWxzZSB7CisJc2JpLT5mYXRfdHlwZSA9IEZBVDMyOworCisJaWYgKGNsdXN0ZXJzID4gMHgwZmZmZmZmNCkKKwkgICAgY2x1c3RlcnMgPSAweDBmZmZmZmY0OyAvKiBNYXhpbXVtIHBvc3NpYmxlICovCisKKwlpZiAoZmF0LmZhdDMyLmV4dGVuZGVkX2ZsYWdzICYgMHg4MCkgeworCSAgICAvKiBOb24tbWlycm9yZWQgRkFUcywgd2UgbmVlZCB0byByZWFkIHRoZSBhY3RpdmUgb25lICovCisJICAgIHNiaS0+ZmF0ICs9IChmYXQuZmF0MzIuZXh0ZW5kZWRfZmxhZ3MgJiAweDBmKSAqIHNlY3RvcnNfcGVyX2ZhdDsKKwl9CisKKwkvKiBGQVQzMjogcm9vdCBkaXJlY3RvcnkgaXMgYSBjbHVzdGVyIGNoYWluICovCisJc2JpLT5yb290ID0gc2JpLT5kYXRhCisJICAgICsgKChmYXQuZmF0MzIucm9vdF9jbHVzdGVyLTIpIDw8IHNiaS0+Y2x1c3Rfc2hpZnQpOworICAgIH0KKyAgICBzYmktPmNsdXN0ZXJzID0gY2x1c3RlcnM7CisKKyAgICAvKiBmcyBVVUlEIC0gc2VyaWFsIG51bWJlciAqLworICAgIGlmIChGQVQzMiA9PSBzYmktPmZhdF90eXBlKQorCXNiaS0+dXVpZCA9IGZhdC5mYXQzMi5udW1fc2VyaWFsOworICAgIGVsc2UKKwlzYmktPnV1aWQgPSBmYXQuZmF0MTJfMTYubnVtX3NlcmlhbDsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGNhY2hlICovCisgICAgY2FjaGVfaW5pdChmcy0+ZnNfZGV2LCBmcy0+YmxvY2tfc2hpZnQpOworCisgICAgcmV0dXJuIGZzLT5ibG9ja19zaGlmdDsKK30KKworc3RhdGljIGludCB2ZmF0X2NvcHlfc3VwZXJibG9jayh2b2lkICpidWYpCit7CisJc3RydWN0IGZhdF9icGIgZmF0OworCXN0cnVjdCBkaXNrICpkaXNrOworCXNpemVfdCBzYl9vZmY7CisJdm9pZCAqZHN0OworCWludCBzYl9sZW47CisKKwlkaXNrID0gdGhpc19mcy0+ZnNfZGV2LT5kaXNrOworCWRpc2stPnJkd3Jfc2VjdG9ycyhkaXNrLCAmZmF0LCAwLCAxLCAwKTsKKworCS8qIFhYWDogRmluZCBiZXR0ZXIgc2FuaXR5IGNoZWNrcy4uLiAqLworCWlmICghZmF0LmJ4UmVzU2VjdG9ycyB8fCAhZmF0LmJ4RkFUcykKKwkJcmV0dXJuIC0xOworCisJc2Jfb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IGZhdF9icGIsIHNlY3Rvcl9zaXplKTsKKwlzYl9sZW4gPSBvZmZzZXRvZihzdHJ1Y3QgZmF0X2JwYiwgZmF0MTJfMTYpIC0gc2Jfb2ZmIFwKKwkJKyBzaXplb2YoZmF0LmZhdDEyXzE2KTsKKworCS8qCisJICogT25seSBjb3B5IGZpZWxkcyBvZiB0aGUgc3VwZXJibG9jayB3ZSBhY3R1YWxseSBjYXJlIGFib3V0LgorCSAqLworCWRzdCA9IGJ1ZiArIHNiX29mZjsKKwltZW1jcHkoZHN0LCAodm9pZCAqKSZmYXQgKyBzYl9vZmYsIHNiX2xlbik7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBGQVRfVVVJRF9MRU4gKDQgKyAxICsgNCArIDEpCitzdGF0aWMgY2hhciAqdmZhdF9mc191dWlkKHN0cnVjdCBmc19pbmZvICpmcykKK3sKKyAgICBjaGFyICp1dWlkID0gTlVMTDsKKyAgICBjaGFyICpwdHI7CisKKyAgICB1dWlkID0gbWFsbG9jKEZBVF9VVUlEX0xFTik7CisgICAgaWYgKCF1dWlkKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKHNucHJpbnRmKHV1aWQsIEZBVF9VVUlEX0xFTiwgIiUwNHgtJTA0eCIsCisJICAgICAgICAgICh1aW50MTZfdCkoRkFUX1NCKGZzKS0+dXVpZCA+PiAxNiksCisJICAgICAgICAgICh1aW50MTZfdClGQVRfU0IoZnMpLT51dWlkKSA8IDApIHsKKwlmcmVlKHV1aWQpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAocHRyID0gdXVpZDsgcHRyICYmICpwdHI7IHB0cisrKQorCSpwdHIgPSB0b3VwcGVyKCpwdHIpOworCisgICAgcmV0dXJuIHV1aWQ7Cit9CisKK2NvbnN0IHN0cnVjdCBmc19vcHMgdmZhdF9mc19vcHMgPSB7CisgICAgLmZzX25hbWUgICAgICAgPSAidmZhdCIsCisgICAgLmZzX2ZsYWdzICAgICAgPSBGU19VU0VNRU0gfCBGU19USElTSU5ELAorICAgIC5mc19pbml0ICAgICAgID0gdmZhdF9mc19pbml0LAorICAgIC5zZWFyY2hkaXIgICAgID0gTlVMTCwKKyAgICAuZ2V0ZnNzZWMgICAgICA9IGdlbmVyaWNfZ2V0ZnNzZWMsCisgICAgLmNsb3NlX2ZpbGUgICAgPSBnZW5lcmljX2Nsb3NlX2ZpbGUsCisgICAgLm1hbmdsZV9uYW1lICAgPSB2ZmF0X21hbmdsZV9uYW1lLAorICAgIC5jaGRpcl9zdGFydCAgID0gZ2VuZXJpY19jaGRpcl9zdGFydCwKKyAgICAub3Blbl9jb25maWcgICA9IGdlbmVyaWNfb3Blbl9jb25maWcsCisgICAgLnJlYWRkaXIgICAgICAgPSB2ZmF0X3JlYWRkaXIsCisgICAgLmlnZXRfcm9vdCAgICAgPSB2ZmF0X2lnZXRfcm9vdCwKKyAgICAuaWdldCAgICAgICAgICA9IHZmYXRfaWdldCwKKyAgICAubmV4dF9leHRlbnQgICA9IGZhdF9uZXh0X2V4dGVudCwKKyAgICAuY29weV9zdXBlciAgICA9IHZmYXRfY29weV9zdXBlcmJsb2NrLAorICAgIC5mc191dWlkICAgICAgID0gdmZhdF9mc191dWlkLAorfTsKZGlmZiAtLWdpdCBhL2NvcmUvZnMvZmF0L2ZhdF9mcy5oIGIvY29yZS9mcy9mYXQvZmF0X2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyNmQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvZmF0L2ZhdF9mcy5oCkBAIC0wLDAgKzEsMTYwIEBACisjaWZuZGVmIEZBVF9GU19ICisjZGVmaW5lIEZBVF9GU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBGQVRfRElSX0VOVFJZX1NJWkUgMzIKKyNkZWZpbmUgRElSRU5UX1NISUZUIDUKKworI2RlZmluZSBGQVRfQVRUUl9SRUFEX09OTFkgMHgwMQorI2RlZmluZSBGQVRfQVRUUl9ISURERU4JICAgMHgwMgorI2RlZmluZSBGQVRfQVRUUl9TWVNURU0JICAgMHgwNAorI2RlZmluZSBGQVRfQVRUUl9WT0xVTUVfSUQgMHgwOAorI2RlZmluZSBGQVRfQVRUUl9ESVJFQ1RPUlkgMHgxMAorI2RlZmluZSBGQVRfQVRUUl9BUkNISVZFICAgMHgyMAorCisjZGVmaW5lIEZBVF9NQVhGSUxFCSAgIDI1NgorCisjZGVmaW5lIEZBVF9BVFRSX0xPTkdfTkFNRSAoRkFUX0FUVFJfUkVBRF9PTkxZICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZBVF9BVFRSX0hJRERFTiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRkFUX0FUVFJfU1lTVEVNICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGQVRfQVRUUl9WT0xVTUVfSUQpCisKKyNkZWZpbmUgRkFUX0FUVFJfVkFMSUQJICAgKEZBVF9BVFRSX1JFQURfT05MWSAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGQVRfQVRUUl9ISURERU4gICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZBVF9BVFRSX1NZU1RFTSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRkFUX0FUVFJfRElSRUNUT1JZICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGQVRfQVRUUl9BUkNISVZFKQorCitlbnVtIGZhdF90eXBleyBGQVQxMiwgRkFUMTYsIEZBVDMyIH07CisKKy8qCisgKiBUaGUgZmF0IGZpbGUgc3lzdGVtIHN0cnVjdHVyZXMgCisgKi8KKworc3RydWN0IGZhdF9icGIgeworICAgICAgICB1aW50OF90ICBqbXBfYm9vdFszXTsKKyAgICAgICAgdWludDhfdCAgb2VtX25hbWVbOF07CisgICAgICAgIHVpbnQxNl90IHNlY3Rvcl9zaXplOworICAgICAgICB1aW50OF90ICBieFNlY1BlckNsdXN0OworICAgICAgICB1aW50MTZfdCBieFJlc1NlY3RvcnM7CisgICAgICAgIHVpbnQ4X3QgIGJ4RkFUczsKKyAgICAgICAgdWludDE2X3QgYnhSb290RGlyRW50czsKKyAgICAgICAgdWludDE2X3QgYnhTZWN0b3JzOworICAgICAgICB1aW50OF90ICBtZWRpYTsKKyAgICAgICAgdWludDE2X3QgYnhGQVRzZWNzOworICAgICAgICB1aW50MTZfdCBzZWN0b3JzX3Blcl90cmFjazsKKyAgICAgICAgdWludDE2X3QgbnVtX2hlYWRzOworICAgICAgICB1aW50MzJfdCBudW1faGlkZGVuX3NlY3RvcnM7CisgICAgICAgIHVpbnQzMl90IGJzSHVnZVNlY3RvcnM7CisgICAgICAgCisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgbnVtX3BoX2RyaXZlOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgcmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICBib290X3NpZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9zZXJpYWw7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICBsYWJlbFsxMV07CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICBmc3R5cGVbOF07CisgICAgICAgICAgICAgICAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZmF0MTJfMTY7CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnhGQVRzZWNzXzMyOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXh0ZW5kZWRfZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmc192ZXJzaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgcm9vdF9jbHVzdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZnNfaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJhY2t1cF9ib290X3NlY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgIHJlc2VydmVkWzEyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgIG51bV9waF9kcml2ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgIHJlc2VydmVkMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgIGJvb3Rfc2lnOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX3NlcmlhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgIGxhYmVsWzExXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgIGZzdHlwZVs4XTsKKyAgICAgICAgICAgICAgICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBmYXQzMjsKKworICAgICAgICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworICAgICAgICB1aW50OF90IHBhZFs0MjJdOyAgLyogcGFkZGluZyB0byA1MTIgQnl0ZXMgKG9uZSBzZWN0b3IpICovCisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICogVGhlIGZhdCBmaWxlIHN5c3RlbSBpbmZvIGluIG1lbW9yeSAKKyAqLworc3RydWN0IGZhdF9zYl9pbmZvIHsKKwlzZWN0b3JfdCBmYXQ7ICAgICAgICAgICAgIC8qIFRoZSBGQVQgcmVnaW9uICovCisJc2VjdG9yX3Qgcm9vdDsgICAgICAgICAgICAvKiBUaGUgcm9vdCBkaXIgcmVnaW9uICovCisJc2VjdG9yX3QgZGF0YTsgICAgICAgICAgICAvKiBUaGUgZGF0YSByZWdpb24gKi8KKworCXVpbnQzMl90IGNsdXN0ZXJzOwkgIC8qIFRvdGFsIG51bWJlciBvZiBjbHVzdGVycyAqLworCXVpbnQzMl90IHJvb3RfY2x1c3RlcjsJICAvKiBDbHVzdGVyIG51bWJlciBmb3IgKEZBVDMyKSByb290IGRpciAqLworCWludCAgICAgIHJvb3Rfc2l6ZTsgICAgICAgLyogVGhlIHJvb3QgZGlyIHNpemUgaW4gc2VjdG9ycyAqLworCQorCWludCAgICAgIGNsdXN0X3NoaWZ0OyAgICAgIC8qIGJhc2VkIG9uIHNlY3RvcnMgKi8KKwlpbnQgICAgICBjbHVzdF9ieXRlX3NoaWZ0OyAvKiBiYXNlZCBvbiBieXRlcyAgICovCisJaW50ICAgICAgY2x1c3RfbWFzazsJICAgLyogc2VjdG9ycyBwZXIgY2x1c3RlciBtYXNrICovCisJaW50ICAgICAgY2x1c3Rfc2l6ZTsKKworCWludCAgICAgIGZhdF90eXBlOworCisJdWludDMyX3QgdXVpZDsgICAgICAgICAgICAgLyogZnMgVVVJRCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBmYXRfZGlyX2VudHJ5IHsKKyAgICAgICAgY2hhciAgICAgbmFtZVsxMV07CisgICAgICAgIHVpbnQ4X3QgIGF0dHI7CisgICAgICAgIHVpbnQ4X3QgIGxjYXNlOworICAgICAgICB1aW50OF90ICBjX3RpbWVfdGVudGg7CisgICAgICAgIHVpbnQxNl90IGNfdGltZTsKKyAgICAgICAgdWludDE2X3QgY19kYXRlOworICAgICAgICB1aW50MTZfdCBhX2RhdGU7CisgICAgICAgIHVpbnQxNl90IGZpcnN0X2NsdXN0ZXJfaGlnaDsKKyAgICAgICAgdWludDE2X3Qgd190aW1lOworICAgICAgICB1aW50MTZfdCB3X2RhdGU7CisgICAgICAgIHVpbnQxNl90IGZpcnN0X2NsdXN0ZXJfbG93OworICAgICAgICB1aW50MzJfdCBmaWxlX3NpemU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBMQ0FTRV9CQVNFIDggICAgICAgLyogYmFzZW5hbWUgaXMgbG93ZXIgY2FzZSAqLworI2RlZmluZSBMQ0FTRV9FWFQgIDE2ICAgICAgLyogZXh0ZW5zaW9uIGlzIGxvd2VyIGNhc2UgKi8KKworc3RydWN0IGZhdF9sb25nX25hbWVfZW50cnkgeworICAgICAgICB1aW50OF90ICBpZDsKKyAgICAgICAgdWludDE2X3QgbmFtZTFbNV07CisgICAgICAgIHVpbnQ4X3QgIGF0dHI7CisgICAgICAgIHVpbnQ4X3QgIHJlc2VydmVkOworICAgICAgICB1aW50OF90ICBjaGVja3N1bTsKKyAgICAgICAgdWludDE2X3QgbmFtZTJbNl07CisgICAgICAgIHVpbnQxNl90IGZpcnN0X2NsdXN0ZXI7CisgICAgICAgIHVpbnQxNl90IG5hbWUzWzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZhdF9zYl9pbmZvICpGQVRfU0Ioc3RydWN0IGZzX2luZm8gKmZzKQoreworICAgICAgICByZXR1cm4gZnMtPmZzX2luZm87Cit9CisKKy8qIAorICogQ291bnQgdGhlIHJvb3QgZGlyIHNpemUgaW4gc2VjdG9ycworICovCitzdGF0aWMgaW5saW5lIGludCByb290X2Rpcl9zaXplKHN0cnVjdCBmc19pbmZvICpmcywgc3RydWN0IGZhdF9icGIgKmZhdCkKK3sKKyAgICByZXR1cm4gKGZhdC0+YnhSb290RGlyRW50cyArIFNFQ1RPUl9TSVpFKGZzKS8zMiAtIDEpCisJPj4gKFNFQ1RPUl9TSElGVChmcykgLSA1KTsKK30KKworLyoKKyAqIEZBVCBwcml2YXRlIGlub2RlIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBmYXRfcHZ0X2lub2RlIHsKKyAgICB1aW50MzJfdCBzdGFydF9jbHVzdGVyOwkvKiBTdGFydGluZyBjbHVzdGVyIGFkZHJlc3MgKi8KKyAgICBzZWN0b3JfdCBzdGFydDsJCS8qIFN0YXJ0aW5nIHNlY3RvciAqLworICAgIHNlY3Rvcl90IG9mZnNldDsJCS8qIEN1cnJlbnQgc2VjdG9yIG9mZnNldCAqLworICAgIHNlY3Rvcl90IGhlcmU7CQkvKiBTZWN0b3IgY29ycmVzcG9uZGluZyB0byBvZmZzZXQgKi8KK307CisKKyNkZWZpbmUgUFZUKGkpICgoc3RydWN0IGZhdF9wdnRfaW5vZGUgKikoKGkpLT5wdnQpKQorCisjZW5kaWYgLyogZmF0X2ZzLmggKi8KZGlmZiAtLWdpdCBhL2NvcmUvZnMvZnMuYyBiL2NvcmUvZnMvZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODQ2Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9mcy5jCkBAIC0wLDAgKzEsNDU2IEBACisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9zeXNhcHBlbmQuaD4KKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisvKiBUaGUgY3VycmVudGx5IG1vdW50ZWQgZmlsZXN5c3RlbSAqLworX19leHBvcnQgc3RydWN0IGZzX2luZm8gKnRoaXNfZnMgPSBOVUxMOwkJLyogUm9vdCBmaWxlc3lzdGVtICovCisKKy8qIEFjdHVhbCBmaWxlIHN0cnVjdHVyZXMgKHdlIGRvbid0IGhhdmUgbWFsbG9jIHlldC4uLikgKi8KK19fZXhwb3J0IHN0cnVjdCBmaWxlIGZpbGVzW01BWF9PUEVOXTsKKworLyogU3ltbGluayBoYXJkIGxpbWl0cyAqLworI2RlZmluZSBNQVhfU1lNTElOS19DTlQJMjAKKyNkZWZpbmUgTUFYX1NZTUxJTktfQlVGIDQwOTYKKworLyoKKyAqIEdldCBhIG5ldyBpbm9kZSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGlub2RlICphbGxvY19pbm9kZShzdHJ1Y3QgZnNfaW5mbyAqZnMsIHVpbnQzMl90IGlubywgc2l6ZV90IGRhdGEpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IHphbGxvYyhzaXplb2Yoc3RydWN0IGlub2RlKSArIGRhdGEpOworICAgIGlmIChpbm9kZSkgeworCWlub2RlLT5mcyA9IGZzOworCWlub2RlLT5pbm8gPSBpbm87CisJaW5vZGUtPnJlZmNudCA9IDE7CisgICAgfQorICAgIHJldHVybiBpbm9kZTsKK30KKworLyoKKyAqIEZyZWUgYSByZWZjb3VudGVkIGlub2RlCisgKi8KK3ZvaWQgcHV0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgd2hpbGUgKGlub2RlKSB7CisJc3RydWN0IGlub2RlICpkZWFkID0gaW5vZGU7CisJaW50IHJlZmNudCA9IC0tKGRlYWQtPnJlZmNudCk7CisJZHByaW50ZigicHV0X2lub2RlICVwIG5hbWUgJXMgcmVmY250ICV1XG4iLCBkZWFkLCBkZWFkLT5uYW1lLCByZWZjbnQpOworCWlmIChyZWZjbnQpCisJICAgIGJyZWFrOwkJLyogV2Ugc3RpbGwgaGF2ZSByZWZlcmVuY2VzICovCisJaW5vZGUgPSBkZWFkLT5wYXJlbnQ7CisJaWYgKGRlYWQtPm5hbWUpCisJICAgIGZyZWUoKGNoYXIgKilkZWFkLT5uYW1lKTsKKwlmcmVlKGRlYWQpOworICAgIH0KK30KKworLyoKKyAqIEdldCBhbiBlbXB0eSBmaWxlIHN0cnVjdHVyZQorICovCitzdGF0aWMgc3RydWN0IGZpbGUgKmFsbG9jX2ZpbGUodm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZpbGVzOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9PUEVOOyBpKyspIHsKKwlpZiAoIWZpbGUtPmZzKQorCSAgICByZXR1cm4gZmlsZTsKKwlmaWxlKys7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBDbG9zZSBhbmQgZnJlZSBhIGZpbGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgbWVtc2V0KGZpbGUsIDAsIHNpemVvZiAqZmlsZSk7Cit9CisKK19fZXhwb3J0IHZvaWQgX2Nsb3NlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgaWYgKGZpbGUtPmZzKQorCWZpbGUtPmZzLT5mc19vcHMtPmNsb3NlX2ZpbGUoZmlsZSk7CisgICAgZnJlZV9maWxlKGZpbGUpOworfQorCisvKgorICogRmluZCBhbmQgb3BlbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisgKi8KK19fZXhwb3J0IGludCBvcGVuX2NvbmZpZyh2b2lkKQoreworICAgIGludCBmZCwgaGFuZGxlOworICAgIHN0cnVjdCBmaWxlX2luZm8gKmZwOworCisgICAgZmQgPSBvcGVuZGV2KCZfX2ZpbGVfZGV2LCBOVUxMLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkKKwlyZXR1cm4gLTE7CisKKyAgICBmcCA9ICZfX2ZpbGVfaW5mb1tmZF07CisKKyAgICBoYW5kbGUgPSB0aGlzX2ZzLT5mc19vcHMtPm9wZW5fY29uZmlnKCZmcC0+aS5mZCk7CisgICAgaWYgKGhhbmRsZSA8IDApIHsKKwljbG9zZShmZCk7CisJZXJybm8gPSBFTk9FTlQ7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGZwLT5pLm9mZnNldCA9IDA7CisgICAgZnAtPmkubmJ5dGVzID0gMDsKKworICAgIHJldHVybiBmZDsKK30KKworX19leHBvcnQgdm9pZCBtYW5nbGVfbmFtZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICB0aGlzX2ZzLT5mc19vcHMtPm1hbmdsZV9uYW1lKGRzdCwgc3JjKTsKK30KKworc2l6ZV90IHBtYXBpX3JlYWRfZmlsZSh1aW50MTZfdCAqaGFuZGxlLCB2b2lkICpidWYsIHNpemVfdCBzZWN0b3JzKQoreworICAgIGJvb2wgaGF2ZV9tb3JlOworICAgIHNpemVfdCBieXRlc19yZWFkOworICAgIHN0cnVjdCBmaWxlICpmaWxlOworCisgICAgZmlsZSA9IGhhbmRsZV90b19maWxlKCpoYW5kbGUpOworICAgIGJ5dGVzX3JlYWQgPSBmaWxlLT5mcy0+ZnNfb3BzLT5nZXRmc3NlYyhmaWxlLCBidWYsIHNlY3RvcnMsICZoYXZlX21vcmUpOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSByZWFjaCBFT0YsIHRoZSBmaWxlc3lzdGVtIGRyaXZlciB3aWxsIGhhdmUgYWxyZWFkeSBjbG9zZWQKKyAgICAgKiB0aGUgdW5kZXJseWluZyBmaWxlLi4uIHRoaXMgcmVhbGx5IHNob3VsZCBiZSBjbGVhbmVyLgorICAgICAqLworICAgIGlmICghaGF2ZV9tb3JlKSB7CisJX2Nsb3NlX2ZpbGUoZmlsZSk7CisJKmhhbmRsZSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK2ludCBzZWFyY2hkaXIoY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQoreworICAgIHN0YXRpYyBjaGFyIHJvb3RfbmFtZVtdID0gIi8iOworICAgIHN0cnVjdCBmaWxlICpmaWxlOworICAgIGNoYXIgKnBhdGgsICppbm9kZV9uYW1lLCAqbmV4dF9pbm9kZV9uYW1lOworICAgIHN0cnVjdCBpbm9kZSAqdG1wLCAqaW5vZGUgPSBOVUxMOworICAgIGludCBzeW1saW5rX2NvdW50ID0gTUFYX1NZTUxJTktfQ05UOworCisgICAgZHByaW50Zigic2VhcmNoZGlyOiAlcyAgcm9vdDogJXAgIGN3ZDogJXBcbiIsCisJICAgIG5hbWUsIHRoaXNfZnMtPnJvb3QsIHRoaXNfZnMtPmN3ZCk7CisKKyAgICBpZiAoIShmaWxlID0gYWxsb2NfZmlsZSgpKSkKKwlnb3RvIGVycl9ub19jbG9zZTsKKyAgICBmaWxlLT5mcyA9IHRoaXNfZnM7CisKKyAgICAvKiBpZiB3ZSBoYXZlIC0+c2VhcmNoZGlyIG1ldGhvZCwgY2FsbCBpdCAqLworICAgIGlmIChmaWxlLT5mcy0+ZnNfb3BzLT5zZWFyY2hkaXIpIHsKKwlmaWxlLT5mcy0+ZnNfb3BzLT5zZWFyY2hkaXIobmFtZSwgZmxhZ3MsIGZpbGUpOworCisJaWYgKGZpbGUtPmlub2RlKQorCSAgICByZXR1cm4gZmlsZV90b19oYW5kbGUoZmlsZSk7CisJZWxzZQorCSAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICAvKiBlbHNlLCB0cnkgdGhlIGdlbmVyaWMtcGF0aC1sb29rdXAgbWV0aG9kICovCisKKyAgICAvKiBDb3B5IHRoZSBwYXRoICovCisgICAgcGF0aCA9IHN0cmR1cChuYW1lKTsKKyAgICBpZiAoIXBhdGgpIHsKKwlkcHJpbnRmKCJzZWFyY2hkaXI6IENvdWxkbid0IGNvcHkgcGF0aFxuIik7CisJZ290byBlcnJfcGF0aDsKKyAgICB9CisKKyAgICAvKiBXb3JrIHdpdGggdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBieSBkZWZhdWx0ICovCisgICAgaW5vZGUgPSBnZXRfaW5vZGUodGhpc19mcy0+Y3dkKTsKKyAgICBpZiAoIWlub2RlKSB7CisJZHByaW50Zigic2VhcmNoZGlyOiBDb3VsZG4ndCB1c2UgY3VycmVudCBkaXJlY3RvcnlcbiIpOworCWdvdG8gZXJyX2N1cmRpcjsKKyAgICB9CisKKyAgICBmb3IgKGlub2RlX25hbWUgPSBwYXRoOyBpbm9kZV9uYW1lOyBpbm9kZV9uYW1lID0gbmV4dF9pbm9kZV9uYW1lKSB7CisJLyogUm9vdCBkaXJlY3Rvcnk/ICovCisJaWYgKGlub2RlX25hbWVbMF0gPT0gJy8nKSB7CisJICAgIG5leHRfaW5vZGVfbmFtZSA9IGlub2RlX25hbWUgKyAxOworCSAgICBpbm9kZV9uYW1lID0gcm9vdF9uYW1lOworCX0gZWxzZSB7CisJICAgIC8qIEZpbmQgdGhlIG5leHQgaW5vZGUgbmFtZSAqLworCSAgICBuZXh0X2lub2RlX25hbWUgPSBzdHJjaHIoaW5vZGVfbmFtZSArIDEsICcvJyk7CisJICAgIGlmIChuZXh0X2lub2RlX25hbWUpIHsKKwkJLyogVGVybWluYXRlIHRoZSBjdXJyZW50IGlub2RlIG5hbWUgYW5kIHBvaW50IHRvIG5leHQgKi8KKwkJKm5leHRfaW5vZGVfbmFtZSsrID0gJ1wwJzsKKwkgICAgfQorCX0KKwlpZiAobmV4dF9pbm9kZV9uYW1lKSB7CisJICAgIC8qIEFkdmFuY2UgYmV5b25kIHJlZHVuZGFudCBzbGFzaGVzICovCisJICAgIHdoaWxlICgqbmV4dF9pbm9kZV9uYW1lID09ICcvJykKKwkJbmV4dF9pbm9kZV9uYW1lKys7CisKKwkgICAgLyogQ2hlY2sgaWYgd2UncmUgYXQgdGhlIGVuZCAqLworCSAgICBpZiAoKm5leHRfaW5vZGVfbmFtZSA9PSAnXDAnKQorCQluZXh0X2lub2RlX25hbWUgPSBOVUxMOworCX0KKwlkcHJpbnRmKCJzZWFyY2hkaXI6IGlub2RlX25hbWU6ICVzXG4iLCBpbm9kZV9uYW1lKTsKKwlpZiAobmV4dF9pbm9kZV9uYW1lKQorCSAgICBkcHJpbnRmKCJzZWFyY2hkaXI6IFJlbWFpbmluZzogJXNcbiIsIG5leHRfaW5vZGVfbmFtZSk7CisKKwkvKiBSb290IGRpcmVjdG9yeT8gKi8KKwlpZiAoaW5vZGVfbmFtZVswXSA9PSAnLycpIHsKKwkgICAgLyogUmVsZWFzZSBhbnkgY2hhaW4gdGhhdCdzIGFscmVhZHkgYmVlbiBlc3RhYmxpc2hlZCAqLworCSAgICBwdXRfaW5vZGUoaW5vZGUpOworCSAgICBpbm9kZSA9IGdldF9pbm9kZSh0aGlzX2ZzLT5yb290KTsKKwkgICAgY29udGludWU7CisJfQorCisJLyogQ3VycmVudCBkaXJlY3Rvcnk/ICovCisJaWYgKCFzdHJuY21wKGlub2RlX25hbWUsICIuIiwgc2l6ZW9mICIuIikpCisJICAgIGNvbnRpbnVlOworCisJLyogUGFyZW50IGRpcmVjdG9yeT8gKi8KKwlpZiAoIXN0cm5jbXAoaW5vZGVfbmFtZSwgIi4uIiwgc2l6ZW9mICIuLiIpKSB7CisJICAgIC8qIElmIHRoZXJlIGlzIG5vIHBhcmVudCwganVzdCBpZ25vcmUgaXQgKi8KKwkgICAgaWYgKCFpbm9kZS0+cGFyZW50KQorCQljb250aW51ZTsKKworCSAgICAvKiBBZGQgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBzbyB3ZSBjYW4gcmVsZWFzZSB0aGUgY2hpbGQgKi8KKwkgICAgdG1wID0gZ2V0X2lub2RlKGlub2RlLT5wYXJlbnQpOworCisJICAgIC8qIFJlbGVhc2luZyB0aGUgY2hpbGQgd2lsbCBkcm9wIHRoZSBwYXJlbnQgYmFjayBkb3duIHRvIDEgKi8KKwkgICAgcHV0X2lub2RlKGlub2RlKTsKKworCSAgICBpbm9kZSA9IHRtcDsKKwkgICAgY29udGludWU7CisJfQorCisJLyogQW55dGhpbmcgZWxzZSAqLworCXRtcCA9IGlub2RlOworCWlub2RlID0gdGhpc19mcy0+ZnNfb3BzLT5pZ2V0KGlub2RlX25hbWUsIGlub2RlKTsKKwlpZiAoIWlub2RlKSB7CisJICAgIC8qIEZhaWx1cmUuICBSZWxlYXNlIHRoZSBjaGFpbiAqLworCSAgICBwdXRfaW5vZGUodG1wKTsKKwkgICAgYnJlYWs7CisJfQorCisJLyogU2FuaXR5LWNoZWNrICovCisJaWYgKGlub2RlLT5wYXJlbnQgJiYgaW5vZGUtPnBhcmVudCAhPSB0bXApIHsKKwkgICAgZHByaW50Zigic2VhcmNoZGlyOiBpZ2V0IHJldHVybmVkIGEgZGlmZmVyZW50IHBhcmVudFxuIik7CisJICAgIHB1dF9pbm9kZShpbm9kZSk7CisJICAgIGlub2RlID0gTlVMTDsKKwkgICAgcHV0X2lub2RlKHRtcCk7CisJICAgIGJyZWFrOworCX0KKwlpbm9kZS0+cGFyZW50ID0gdG1wOworCWlub2RlLT5uYW1lID0gc3RyZHVwKGlub2RlX25hbWUpOworCWRwcmludGYoInNlYXJjaGRpcjogcGF0aCBjb21wb25lbnQ6ICVzXG4iLCBpbm9kZS0+bmFtZSk7CisKKwkvKiBTeW1saW5rIGhhbmRsaW5nICovCisJaWYgKGlub2RlLT5tb2RlID09IERUX0xOSykgeworCSAgICBjaGFyICpuZXdfcGF0aDsKKwkgICAgaW50IG5ld19sZW4sIGNvcGllZDsKKworCSAgICAvKiB0YXJnZXQgcGF0aCArIE5VTCAqLworCSAgICBuZXdfbGVuID0gaW5vZGUtPnNpemUgKyAxOworCisJICAgIGlmIChuZXh0X2lub2RlX25hbWUpIHsKKwkJLyogdGFyZ2V0IHBhdGggKyBzbGFzaCArIHJlbWFpbmluZyArIE5VTCAqLworCQluZXdfbGVuICs9IHN0cmxlbihuZXh0X2lub2RlX25hbWUpICsgMTsKKwkgICAgfQorCisJICAgIGlmICghdGhpc19mcy0+ZnNfb3BzLT5yZWFkbGluayB8fAorCQkvKiBsaW1pdCBjaGVja3MgKi8KKwkJLS1zeW1saW5rX2NvdW50ID09IDAgfHwKKwkJbmV3X2xlbiA+IE1BWF9TWU1MSU5LX0JVRikKKwkJZ290byBlcnJfbmV3X2xlbjsKKworCSAgICBuZXdfcGF0aCA9IG1hbGxvYyhuZXdfbGVuKTsKKwkgICAgaWYgKCFuZXdfcGF0aCkKKwkJZ290byBlcnJfbmV3X3BhdGg7CisKKwkgICAgY29waWVkID0gdGhpc19mcy0+ZnNfb3BzLT5yZWFkbGluayhpbm9kZSwgbmV3X3BhdGgpOworCSAgICBpZiAoY29waWVkIDw9IDApCisJCWdvdG8gZXJyX2NvcGllZDsKKwkgICAgbmV3X3BhdGhbY29waWVkXSA9ICdcMCc7CisJICAgIGRwcmludGYoInNlYXJjaGRpcjogU3ltbGluazogJXNcbiIsIG5ld19wYXRoKTsKKworCSAgICBpZiAobmV4dF9pbm9kZV9uYW1lKSB7CisJCW5ld19wYXRoW2NvcGllZF0gPSAnLyc7CisJCXN0cmNweShuZXdfcGF0aCArIGNvcGllZCArIDEsIG5leHRfaW5vZGVfbmFtZSk7CisJCWRwcmludGYoInNlYXJjaGRpcjogTmV3IHBhdGg6ICVzXG4iLCBuZXdfcGF0aCk7CisJICAgIH0KKworCSAgICBmcmVlKHBhdGgpOworCSAgICBwYXRoID0gbmV4dF9pbm9kZV9uYW1lID0gbmV3X3BhdGg7CisKKyAgICAgICAgICAgIC8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IHNvIHdlIGNhbiByZWxlYXNlIHRoZSBjaGlsZCAqLworICAgICAgICAgICAgdG1wID0gZ2V0X2lub2RlKGlub2RlLT5wYXJlbnQpOworCisgICAgICAgICAgICAvKiBSZWxlYXNpbmcgdGhlIGNoaWxkIHdpbGwgZHJvcCB0aGUgcGFyZW50IGJhY2sgZG93biB0byAxICovCisgICAgICAgICAgICBwdXRfaW5vZGUoaW5vZGUpOworCisgICAgICAgICAgICBpbm9kZSA9IHRtcDsKKwkgICAgY29udGludWU7CitlcnJfY29waWVkOgorCSAgICBmcmVlKG5ld19wYXRoKTsKK2Vycl9uZXdfcGF0aDoKK2Vycl9uZXdfbGVuOgorCSAgICBwdXRfaW5vZGUoaW5vZGUpOworCSAgICBpbm9kZSA9IE5VTEw7CisJICAgIGJyZWFrOworCX0KKworCS8qIElmIHRoZXJlJ3MgbW9yZSB0byBwcm9jZXNzLCB0aGlzIHNob3VsZCBiZSBhIGRpcmVjdG9yeSAqLworCWlmIChuZXh0X2lub2RlX25hbWUgJiYgaW5vZGUtPm1vZGUgIT0gRFRfRElSKSB7CisJICAgIGRwcmludGYoInNlYXJjaGRpcjogRXhwZWN0ZWQgYSBkaXJlY3RvcnlcbiIpOworCSAgICBwdXRfaW5vZGUoaW5vZGUpOworCSAgICBpbm9kZSA9IE5VTEw7CisJICAgIGJyZWFrOworCX0KKyAgICB9CitlcnJfY3VyZGlyOgorICAgIGZyZWUocGF0aCk7CitlcnJfcGF0aDoKKyAgICBpZiAoIWlub2RlKSB7CisJZHByaW50Zigic2VhcmNoZGlyOiBOb3QgZm91bmRcbiIpOworCWdvdG8gZXJyOworICAgIH0KKworICAgIGZpbGUtPmlub2RlICA9IGlub2RlOworICAgIGZpbGUtPm9mZnNldCA9IDA7CisKKyAgICByZXR1cm4gZmlsZV90b19oYW5kbGUoZmlsZSk7CisKK2VycjoKKyAgICBkcHJpbnRmKCJzZXJhY2hkaXI6IGVycm9yIHNlcmFjaGluZyBmaWxlICVzXG4iLCBuYW1lKTsKKyAgICBfY2xvc2VfZmlsZShmaWxlKTsKK2Vycl9ub19jbG9zZToKKyAgICByZXR1cm4gLTE7Cit9CisKK19fZXhwb3J0IGludCBvcGVuX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBzdHJ1Y3QgY29tMzJfZmlsZWRhdGEgKmZpbGVkYXRhKQoreworICAgIGludCBydjsKKyAgICBzdHJ1Y3QgZmlsZSAqZmlsZTsKKyAgICBjaGFyIG1hbmdsZWRfbmFtZVtGSUxFTkFNRV9NQVhdOworCisgICAgZHByaW50Zigib3Blbl9maWxlICVzXG4iLCBuYW1lKTsKKworICAgIG1hbmdsZV9uYW1lKG1hbmdsZWRfbmFtZSwgbmFtZSk7CisgICAgcnYgPSBzZWFyY2hkaXIobWFuZ2xlZF9uYW1lLCBmbGFncyk7CisKKyAgICBpZiAocnYgPCAwKQorCXJldHVybiBydjsKKworICAgIGZpbGUgPSBoYW5kbGVfdG9fZmlsZShydik7CisKKyAgICBpZiAoZmlsZS0+aW5vZGUtPm1vZGUgIT0gRFRfUkVHKSB7CisJX2Nsb3NlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGZpbGVkYXRhLT5zaXplCT0gZmlsZS0+aW5vZGUtPnNpemU7CisgICAgZmlsZWRhdGEtPmJsb2NrbGcyCT0gU0VDVE9SX1NISUZUKGZpbGUtPmZzKTsKKyAgICBmaWxlZGF0YS0+aGFuZGxlCT0gcnY7CisKKyAgICByZXR1cm4gcnY7Cit9CisKK19fZXhwb3J0IHZvaWQgY2xvc2VfZmlsZSh1aW50MTZfdCBoYW5kbGUpCit7CisgICAgc3RydWN0IGZpbGUgKmZpbGU7CisKKyAgICBpZiAoaGFuZGxlKSB7CisJZmlsZSA9IGhhbmRsZV90b19maWxlKGhhbmRsZSk7CisJX2Nsb3NlX2ZpbGUoZmlsZSk7CisgICAgfQorfQorCitfX2V4cG9ydCBjaGFyICpmc191dWlkKHZvaWQpCit7CisgICAgaWYgKCF0aGlzX2ZzIHx8ICF0aGlzX2ZzLT5mc19vcHMgfHwgIXRoaXNfZnMtPmZzX29wcy0+ZnNfdXVpZCkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdGhpc19mcy0+ZnNfb3BzLT5mc191dWlkKHRoaXNfZnMpOworfQorCisvKgorICogaXQgd2lsbCBkbzoKKyAqICAgIGluaXRpYWxpemUgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9uOworICogICAgc2V0IHVwIHRoZSB2ZnMgZnMgc3RydWN0dXJlOworICogICAgaW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZTsKKyAqICAgIGludm9rZSB0aGUgZnMtc3BlY2lmaWMgaW5pdCBmdW5jdGlvbjsKKyAqICAgIGluaXRpYWxpemUgdGhlIGNhY2hlIGlmIHdlIG5lZWQgb25lOworICogICAgZmluYWxseSwgZ2V0IHRoZSBjdXJyZW50IGlub2RlIGZvciByZWxhdGl2ZSBwYXRoIGxvb2tpbmcuCisgKgorICogb3BzIGlzIGEgcHRyIGxpc3QgZm9yIHNldmVyYWwgZnNfb3BzCisgKi8KK19fYnNzMTYgdWludDE2X3QgU2VjdG9yU2l6ZSwgU2VjdG9yU2hpZnQ7CisKK3ZvaWQgZnNfaW5pdChjb25zdCBzdHJ1Y3QgZnNfb3BzICoqb3BzLCB2b2lkICpwcml2KQoreworICAgIHN0YXRpYyBzdHJ1Y3QgZnNfaW5mbyBmczsJLyogVGhlIGFjdHVhbCBmaWxlc3lzdGVtIGJ1ZmZlciAqLworICAgIGludCBibGtfc2hpZnQgPSAtMTsKKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOVUxMOworCisgICAgLyogRGVmYXVsdCBuYW1lIGZvciB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KKyAgICBmcy5jd2RfbmFtZVswXSA9ICcvJzsKKworICAgIHdoaWxlICgoYmxrX3NoaWZ0IDwgMCkgJiYgKm9wcykgeworCS8qIHNldCB1cCB0aGUgZnMgc3R1Y3R1cmUgKi8KKwlmcy5mc19vcHMgPSAqb3BzOworCisJLyoKKwkgKiBUaGlzIGJvbGRseSBhc3N1bWVzIHRoYXQgd2UgZG9uJ3QgbWl4IEZTX05PREVWIGZpbGVzeXN0ZW1zCisJICogd2l0aCBGU19ERVYgZmlsZXN5c3RlbXMuLi4KKwkgKi8KKwlpZiAoZnMuZnNfb3BzLT5mc19mbGFncyAmIEZTX05PREVWKSB7CisJICAgIGZzLmZzX2RldiA9IE5VTEw7CisJfSBlbHNlIHsKKwkgICAgaWYgKCFkZXYpCisJCWRldiA9IGRldmljZV9pbml0KHByaXYpOworCSAgICBmcy5mc19kZXYgPSBkZXY7CisJfQorCS8qIGludm9rZSB0aGUgZnMtc3BlY2lmaWMgaW5pdCBjb2RlICovCisJYmxrX3NoaWZ0ID0gZnMuZnNfb3BzLT5mc19pbml0KCZmcyk7CisJb3BzKys7CisgICAgfQorICAgIGlmIChibGtfc2hpZnQgPCAwKSB7CisJcHJpbnRmKCJObyB2YWxpZCBmaWxlIHN5c3RlbSBmb3VuZCFcbiIpOworCXdoaWxlICgxKQorCQk7CisgICAgfQorICAgIHRoaXNfZnMgPSAmZnM7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBjYWNoZSBvbmx5IGlmIGl0IHdhc24ndCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgICogYnkgdGhlIGZzIGRyaXZlciAqLworICAgIGlmIChmcy5mc19kZXYgJiYgZnMuZnNfZGV2LT5jYWNoZV9kYXRhICYmICFmcy5mc19kZXYtPmNhY2hlX2luaXQpCisgICAgICAgIGNhY2hlX2luaXQoZnMuZnNfZGV2LCBibGtfc2hpZnQpOworCisgICAgLyogc3RhcnQgb3V0IGluIHRoZSByb290IGRpcmVjdG9yeSAqLworICAgIGlmIChmcy5mc19vcHMtPmlnZXRfcm9vdCkgeworCWZzLnJvb3QgPSBmcy5mc19vcHMtPmlnZXRfcm9vdCgmZnMpOworCWZzLmN3ZCA9IGdldF9pbm9kZShmcy5yb290KTsKKwlkcHJpbnRmKCJpbml0OiByb290IGlub2RlICVwLCBjd2QgaW5vZGUgJXBcbiIsIGZzLnJvb3QsIGZzLmN3ZCk7CisgICAgfQorCisgICAgaWYgKGZzLmZzX29wcy0+Y2hkaXJfc3RhcnQpIHsKKwkgICAgaWYgKGZzLmZzX29wcy0+Y2hkaXJfc3RhcnQoKSA8IDApCisJCSAgICBwcmludGYoIkZhaWxlZCB0byBjaGRpciB0byBzdGFydCBkaXJlY3RvcnlcbiIpOworICAgIH0KKworICAgIFNlY3RvclNoaWZ0ID0gZnMuc2VjdG9yX3NoaWZ0OworICAgIFNlY3RvclNpemUgID0gZnMuc2VjdG9yX3NpemU7CisKKyAgICAvKiBBZGQgRlNVVUlEPS4uLiBzdHJpbmcgdG8gY21kbGluZSAqLworICAgIHN5c2FwcGVuZF9zZXRfZnNfdXVpZCgpOworCit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL2dldGN3ZC5jIGIvY29yZS9mcy9nZXRjd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGI5MzE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9nZXRjd2QuYwpAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZnMuaCIKKworX19leHBvcnQgY2hhciAqY29yZV9nZXRjd2QoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBjaGFyICpyZXQgPSBOVUxMOworCisgICAgaWYoKGJ1ZiAhPSBOVUxMKSAmJiAoc3RybGVuKHRoaXNfZnMtPmN3ZF9uYW1lKSA8IHNpemUpKSB7CisgICAgICAgIHN0cmNweShidWYsIHRoaXNfZnMtPmN3ZF9uYW1lKTsKKyAgICAgICAgcmV0ID0gYnVmOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9nZXRmc3NlYy5jIGIvY29yZS9mcy9nZXRmc3NlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTliNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL2dldGZzc2VjLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBnZXRmc3NlYy5jCisgKgorICogR2VuZXJpYyBnZXRmc3NlYyBpbXBsZW1lbnRhdGlvbiBmb3IgZGlzay1iYXNlZCBmaWxlc3lzdGVtcywgd2hpY2gKKyAqIHN1cHBvcnQgdGhlIG5leHRfZXh0ZW50KCkgbWV0aG9kLgorICoKKyAqIFRoZSBleHBlY3RlZCBzZW1hbnRpY3Mgb2YgbmV4dF9leHRlbnQgYXJlIGFzIGZvbGxvd3M6CisgKgorICogVGhlIHNlY29uZCBhcmd1bWVudCB3aWxsIGNvbnRhaW4gdGhlIGluaXRpYWwgc2VjdG9yIG51bWJlciB0byBiZQorICogbWFwcGVkLiAgVGhlIHJvdXRpbmUgaXMgZXhwZWN0ZWQgdG8gcG9wdWxhdGUKKyAqIGlub2RlLT5uZXh0X2V4dGVudC5wc3RhcnQgYW5kIGlub2RlLT5uZXh0X2V4dGVudC5sZW4gKHRoZSBjYWxsZXIKKyAqIHdpbGwgc3RvcmUgdGhlIGluaXRpYWwgc2VjdG9yIG51bWJlciBpbnRvIGlub2RlLT5uZXh0X2V4dGVudC5sc3RhcnQKKyAqIG9uIHJldHVybi4pCisgKgorICogSWYgaW5vZGUtPm5leHRfZXh0ZW50LmxlbiAhPSAwIG9uIGVudHJ5IHRoZW4gdGhlIHJvdXRpbmUgaXMgYWxsb3dlZAorICogdG8gYXNzdW1lIGlub2RlLT5uZXh0X2V4dGVudCBjb250YWlucyB2YWxpZCBkYXRhIGZyb20gdGhlIHByZXZpb3VzCisgKiB1c2FnZSwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIG9wdGltaXphdGlvbiBwdXJwb3Nlcy4KKyAqCisgKiBJZiB0aGUgZmlsZXN5c3RlbSBjYW4gbWFwIHRoZSBlbnRpcmUgZmlsZSBhcyBhIHNpbmdsZSBleHRlbnQKKyAqIChlLmcuIGlzbzk2NjApLCB0aGVuIHRoZSBmaWxlc3lzdGVtIGNhbiBzaW1wbHkgaW5zZXJ0IHRoZSBleHRlbnQKKyAqIGluZm9ybWF0aW9uIGludG8gaW5vZGUtPm5leHRfZXh0ZW50IGF0IHNlYXJjaGRpci9pZ2V0IHRpbWUsIGFuZCBsZWF2ZQorICogbmV4dF9leHRlbnQoKSBhcyBOVUxMLgorICoKKyAqIE5vdGU6IHRoZSBmaWxlc3lzdGVtIGRyaXZlciBpcyBub3QgcmVxdWlyZWQgdG8gZG8gZXh0ZW50IGNvYWxlc2NpbmcsCisgKiBpZiB0aGF0IGlzIGRpZmZpY3VsdCB0byBkbzsgdGhpcyByb3V0aW5lIHdpbGwgcGVyZm9ybSBleHRlbnQgbG9va2FoZWFkCisgKiBhbmQgY29hbGVzY2luZy4KKyAqLworCisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgImZzLmgiCisKK3N0YXRpYyBpbmxpbmUgc2VjdG9yX3QgbmV4dF9wc2VjdG9yKHNlY3Rvcl90IHBzZWN0b3IsIHVpbnQzMl90IHNraXApCit7CisgICAgaWYgKEVYVEVOVF9TUEVDSUFMKHBzZWN0b3IpKQorCXJldHVybiBwc2VjdG9yOworICAgIGVsc2UKKwlyZXR1cm4gcHNlY3RvciArIHNraXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2VjdG9yX3QgbmV4dF9wc3RhcnQoY29uc3Qgc3RydWN0IGV4dGVudCAqZSkKK3sKKyAgICByZXR1cm4gbmV4dF9wc2VjdG9yKGUtPnBzdGFydCwgZS0+bGVuKTsKK30KKworCitzdGF0aWMgdm9pZCBnZXRfbmV4dF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICAvKiBUaGUgbG9naWNhbCBzdGFydCBhZGRyZXNzIHRoYXQgd2UgY2FyZSBhYm91dC4uLiAqLworICAgIHVpbnQzMl90IGxzdGFydCA9IGlub2RlLT50aGlzX2V4dGVudC5sc3RhcnQgKyBpbm9kZS0+dGhpc19leHRlbnQubGVuOworCisgICAgaWYgKGlub2RlLT5mcy0+ZnNfb3BzLT5uZXh0X2V4dGVudChpbm9kZSwgbHN0YXJ0KSkKKwlpbm9kZS0+bmV4dF9leHRlbnQubGVuID0gMDsgLyogRVJST1IgKi8KKyAgICBpbm9kZS0+bmV4dF9leHRlbnQubHN0YXJ0ID0gbHN0YXJ0OworCisgICAgZHByaW50ZigiRXh0ZW50OiBpbm9kZSAlcCBAICV1IHN0YXJ0ICVsbHUgbGVuICV1XG4iLAorCSAgICBpbm9kZSwgaW5vZGUtPm5leHRfZXh0ZW50LmxzdGFydCwKKwkgICAgaW5vZGUtPm5leHRfZXh0ZW50LnBzdGFydCwgaW5vZGUtPm5leHRfZXh0ZW50Lmxlbik7Cit9CisKK3VpbnQzMl90IGdlbmVyaWNfZ2V0ZnNzZWMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwKKwkJCSAgaW50IHNlY3RvcnMsIGJvb2wgKmhhdmVfbW9yZSkKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+aW5vZGU7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gZmlsZS0+ZnM7CisgICAgc3RydWN0IGRpc2sgKmRpc2sgPSBmcy0+ZnNfZGV2LT5kaXNrOworICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSAwOworICAgIHVpbnQzMl90IGJ5dGVzX2xlZnQgPSBpbm9kZS0+c2l6ZSAtIGZpbGUtPm9mZnNldDsKKyAgICB1aW50MzJfdCBzZWN0b3JzX2xlZnQgPQorCShieXRlc19sZWZ0ICsgU0VDVE9SX1NJWkUoZnMpIC0gMSkgPj4gU0VDVE9SX1NISUZUKGZzKTsKKyAgICB1aW50MzJfdCBsc2VjdG9yOworCisgICAgaWYgKHNlY3RvcnMgPiBzZWN0b3JzX2xlZnQpCisJc2VjdG9ycyA9IHNlY3RvcnNfbGVmdDsKKworICAgIGlmICghc2VjdG9ycykKKwlyZXR1cm4gMDsKKworICAgIGxzZWN0b3IgPSBmaWxlLT5vZmZzZXQgPj4gU0VDVE9SX1NISUZUKGZzKTsKKyAgICBkcHJpbnRmKCJPZmZzZXQ6ICV1ICBsc2VjdG9yOiAldVxuIiwgZmlsZS0+b2Zmc2V0LCBsc2VjdG9yKTsKKworICAgIGlmIChsc2VjdG9yIDwgaW5vZGUtPnRoaXNfZXh0ZW50LmxzdGFydCB8fAorCWxzZWN0b3IgPj0gaW5vZGUtPnRoaXNfZXh0ZW50LmxzdGFydCArIGlub2RlLT50aGlzX2V4dGVudC5sZW4pIHsKKwkvKiBpbm9kZS0+dGhpc19leHRlbnQgdW51c2FibGUsIG1heWJlIG5leHRfZXh0ZW50IGlzLi4uICovCisJaW5vZGUtPnRoaXNfZXh0ZW50ID0gaW5vZGUtPm5leHRfZXh0ZW50OworICAgIH0KKworICAgIGlmIChsc2VjdG9yIDwgaW5vZGUtPnRoaXNfZXh0ZW50LmxzdGFydCB8fAorCWxzZWN0b3IgPj0gaW5vZGUtPnRoaXNfZXh0ZW50LmxzdGFydCArIGlub2RlLT50aGlzX2V4dGVudC5sZW4pIHsKKwkvKiBTdGlsbCBub3RoaW5nIHVzZWZ1bC4uLiAqLworCWlub2RlLT50aGlzX2V4dGVudC5sc3RhcnQgPSBsc2VjdG9yOworCWlub2RlLT50aGlzX2V4dGVudC5sZW4gPSAwOworICAgIH0gZWxzZSB7CisJLyogV2UgaGF2ZSBzb21lIHVzYWJsZSBpbmZvcm1hdGlvbiAqLworCXVpbnQzMl90IGRlbHRhID0gbHNlY3RvciAtIGlub2RlLT50aGlzX2V4dGVudC5sc3RhcnQ7CisJaW5vZGUtPnRoaXNfZXh0ZW50LmxzdGFydCA9IGxzZWN0b3I7CisJaW5vZGUtPnRoaXNfZXh0ZW50LmxlbiAtPSBkZWx0YTsKKwlpbm9kZS0+dGhpc19leHRlbnQucHN0YXJ0CisJICAgID0gbmV4dF9wc2VjdG9yKGlub2RlLT50aGlzX2V4dGVudC5wc3RhcnQsIGRlbHRhKTsKKyAgICB9CisKKyAgICBkcHJpbnRmKCJ0aGlzX2V4dGVudDogbHN0YXJ0ICV1IHBzdGFydCAlbGx1IGxlbiAldVxuIiwKKwkgICAgaW5vZGUtPnRoaXNfZXh0ZW50LmxzdGFydCwKKwkgICAgaW5vZGUtPnRoaXNfZXh0ZW50LnBzdGFydCwKKwkgICAgaW5vZGUtPnRoaXNfZXh0ZW50Lmxlbik7CisKKyAgICB3aGlsZSAoc2VjdG9ycykgeworCXVpbnQzMl90IGNodW5rOworCXNpemVfdCBsZW47CisKKwl3aGlsZSAoc2VjdG9ycyA+IGlub2RlLT50aGlzX2V4dGVudC5sZW4pIHsKKwkgICAgaWYgKCFpbm9kZS0+bmV4dF9leHRlbnQubGVuIHx8CisJCWlub2RlLT5uZXh0X2V4dGVudC5sc3RhcnQgIT0KKwkJaW5vZGUtPnRoaXNfZXh0ZW50LmxzdGFydCArIGlub2RlLT50aGlzX2V4dGVudC5sZW4pCisJCWdldF9uZXh0X2V4dGVudChpbm9kZSk7CisKKwkgICAgaWYgKCFpbm9kZS0+dGhpc19leHRlbnQubGVuKSB7CisJCS8qIERvZXNuJ3QgbWF0dGVyIGlmIGl0J3MgY29udGlndW91cy4uLiAqLworCQlpbm9kZS0+dGhpc19leHRlbnQgPSBpbm9kZS0+bmV4dF9leHRlbnQ7CisJCWlmICghaW5vZGUtPm5leHRfZXh0ZW50LmxlbikgeworCQkgICAgc2VjdG9ycyA9IDA7IC8qIEZhaWxlZCB0byBnZXQgYW55dGhpbmcuLi4gd2UncmUgZGVhZCAqLworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfSBlbHNlIGlmIChpbm9kZS0+bmV4dF9leHRlbnQubGVuICYmCisJCWlub2RlLT5uZXh0X2V4dGVudC5wc3RhcnQgPT0gbmV4dF9wc3RhcnQoJmlub2RlLT50aGlzX2V4dGVudCkpIHsKKwkJLyogQ29hbGVzY2UgZXh0ZW50cyBhbmQgbG9vcCAqLworCQlpbm9kZS0+dGhpc19leHRlbnQubGVuICs9IGlub2RlLT5uZXh0X2V4dGVudC5sZW47CisJICAgIH0gZWxzZSB7CisJCS8qIERpc2NvbnRpZ3VvdXMgZXh0ZW50cyAqLworCQlicmVhazsKKwkgICAgfQorCX0KKworCWRwcmludGYoInRoaXNfZXh0ZW50OiBsc3RhcnQgJXUgcHN0YXJ0ICVsbHUgbGVuICV1XG4iLAorCQlpbm9kZS0+dGhpc19leHRlbnQubHN0YXJ0LAorCQlpbm9kZS0+dGhpc19leHRlbnQucHN0YXJ0LAorCQlpbm9kZS0+dGhpc19leHRlbnQubGVuKTsKKworCWNodW5rID0gbWluKHNlY3RvcnMsIGlub2RlLT50aGlzX2V4dGVudC5sZW4pOworCWxlbiA9IGNodW5rIDw8IFNFQ1RPUl9TSElGVChmcyk7CisKKwlkcHJpbnRmKCIgICBJL086IGlub2RlICVwIEAgJXUgc3RhcnQgJWxsdSBsZW4gJXVcbiIsCisJCWlub2RlLCBpbm9kZS0+dGhpc19leHRlbnQubHN0YXJ0LAorCQlpbm9kZS0+dGhpc19leHRlbnQucHN0YXJ0LCBjaHVuayk7CisKKwlpZiAoaW5vZGUtPnRoaXNfZXh0ZW50LnBzdGFydCA9PSBFWFRFTlRfWkVSTykgeworCSAgICBtZW1zZXQoYnVmLCAwLCBsZW4pOworCX0gZWxzZSB7CisJICAgIGRpc2stPnJkd3Jfc2VjdG9ycyhkaXNrLCBidWYsIGlub2RlLT50aGlzX2V4dGVudC5wc3RhcnQsIGNodW5rLCAwKTsKKwkgICAgaW5vZGUtPnRoaXNfZXh0ZW50LnBzdGFydCArPSBjaHVuazsKKwl9CisKKwlidWYgKz0gbGVuOworCXNlY3RvcnMgLT0gY2h1bms7CisJYnl0ZXNfcmVhZCArPSBsZW47CisJaW5vZGUtPnRoaXNfZXh0ZW50LmxzdGFydCArPSBjaHVuazsKKwlpbm9kZS0+dGhpc19leHRlbnQubGVuIC09IGNodW5rOworICAgIH0KKworICAgIGJ5dGVzX3JlYWQgPSBtaW4oYnl0ZXNfcmVhZCwgYnl0ZXNfbGVmdCk7CisgICAgZmlsZS0+b2Zmc2V0ICs9IGJ5dGVzX3JlYWQ7CisKKyAgICBpZiAoaGF2ZV9tb3JlKQorCSpoYXZlX21vcmUgPSBieXRlc19yZWFkIDwgYnl0ZXNfbGVmdDsKKworICAgIHJldHVybiBieXRlc19yZWFkOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9pc285NjYwL2lzbzk2NjAuYyBiL2NvcmUvZnMvaXNvOTY2MC9pc285NjYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjOWU0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvaXNvOTY2MC9pc285NjYwLmMKQEAgLTAsMCArMSwzMzYgQEAKKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvZGlyZW50Lmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGNhY2hlLmg+CisjaW5jbHVkZSA8ZGlzay5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiaXNvOTY2MF9mcy5oIgorI2luY2x1ZGUgInN1c3BfcnIuaCIKKworLyogQ29udmVydCB0byBsb3dlciBjYXNlIHN0cmluZyAqLworc3RhdGljIGlubGluZSBjaGFyIGlzb190b2xvd2VyKGNoYXIgYykKK3sKKyAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpCisJYyArPSAweDIwOworCisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKm5ld19pc29faW5vZGUoc3RydWN0IGZzX2luZm8gKmZzKQoreworICAgIHJldHVybiBhbGxvY19pbm9kZShmcywgMCwgc2l6ZW9mKHN0cnVjdCBpc285NjYwX3B2dF9pbm9kZSkpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpc29fc2JfaW5mbyAqSVNPX1NCKHN0cnVjdCBmc19pbmZvICpmcykKK3sKKyAgICByZXR1cm4gZnMtPmZzX2luZm87Cit9CisKK3N0YXRpYyBzaXplX3QgaXNvX2NvbnZlcnRfbmFtZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgaW50IGxlbikKK3sKKyAgICBjaGFyICpwID0gZHN0OworICAgIGNoYXIgYzsKKyAgICAKKyAgICBpZiAobGVuID09IDEpIHsKKwlzd2l0Y2ggKCpzcmMpIHsKKwljYXNlIDE6CisJICAgICpwKysgPSAnLic7CisJICAgIC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgMDoKKwkgICAgKnArKyA9ICcuJzsKKwkgICAgZ290byBkb25lOworCWRlZmF1bHQ6CisJICAgIC8qIG5vdGhpbmcgc3BlY2lhbCAqLworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgd2hpbGUgKGxlbi0tICYmIChjID0gKnNyYysrKSkgeworCWlmIChjID09ICc7JykJLyogUmVtb3ZlIGFueSBmaWxlbmFtZSB2ZXJzaW9uIHN1ZmZpeCAqLworCSAgICBicmVhazsKKwkqcCsrID0gaXNvX3RvbG93ZXIoYyk7CisgICAgfQorICAgIAorICAgIC8qIFRoZW4gcmVtb3ZlIGFueSB0ZXJtaW5hbCBkb3RzICovCisgICAgd2hpbGUgKHAgPiBkc3QrMSAmJiBwWy0xXSA9PSAnLicpCisJcC0tOworCitkb25lOgorICAgICpwID0gJ1wwJzsKKyAgICByZXR1cm4gcCAtIGRzdDsKK30KKworLyogCisgKiBVbmxpa2Ugc3RyY21wLCBpdCBkb2VzIHJldHVybiAxIG9uIG1hdGNoLCBvciByZXV0cm4gMCBpZiBub3QgbWF0Y2guCisgKi8KK3N0YXRpYyBib29sIGlzb19jb21wYXJlX25hbWUoY29uc3QgY2hhciAqZGVfbmFtZSwgc2l6ZV90IGxlbiwKKwkJCSAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworICAgIGNoYXIgaXNvX2ZpbGVfbmFtZVsyNTZdOworICAgIGNoYXIgKnAgPSBpc29fZmlsZV9uYW1lOworICAgIGNoYXIgYzEsIGMyOworICAgIGludCBpOworICAgIAorICAgIGkgPSBpc29fY29udmVydF9uYW1lKGlzb19maWxlX25hbWUsIGRlX25hbWUsIGxlbik7CisgICAgKHZvaWQpaTsKKyAgICBkcHJpbnRmKCJDb21wYXJlOiBcIiVzXCIgdG8gXCIlc1wiIChsZW4gJXp1KVxuIiwKKwkgICAgZmlsZV9uYW1lLCBpc29fZmlsZV9uYW1lLCBpKTsKKworICAgIGRvIHsKKwljMSA9ICpwKys7CisJYzIgPSBpc29fdG9sb3dlcigqZmlsZV9uYW1lKyspOworCisJLyogY29tcGFyZSBlcXVhbCBleGNlcHQgZm9yIGNhc2U/ICovCisJaWYgKGMxICE9IGMyKQorCSAgICByZXR1cm4gZmFsc2U7CisgICAgfSB3aGlsZSAoYzEpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBGaW5kIGEgZW50cnkgaW4gdGhlIHNwZWNpZmllZCBkaXIgd2l0aCBuYW1lIF9kbmFtZV8uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvX2Rpcl9lbnRyeSAqCitpc29fZmluZF9lbnRyeShjb25zdCBjaGFyICpkbmFtZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBpbm9kZS0+ZnM7CisgICAgYmxvY2tfdCBkaXJfYmxvY2sgPSBQVlQoaW5vZGUpLT5sYmE7CisgICAgaW50IGkgPSAwLCBvZmZzZXQgPSAwOworICAgIGNvbnN0IGNoYXIgKmRlX25hbWU7CisgICAgaW50IGRlX25hbWVfbGVuLCBkZV9sZW4sIHJyX25hbWVfbGVuLCByZXQ7CisgICAgY29uc3Qgc3RydWN0IGlzb19kaXJfZW50cnkgKmRlOworICAgIGNvbnN0IGNoYXIgKmRhdGEgPSBOVUxMOworICAgIGNoYXIgKnJyX25hbWUgPSBOVUxMOworCisgICAgZHByaW50ZigiaXNvX2ZpbmRfZW50cnk6IFwiJXNcIlxuIiwgZG5hbWUpOworICAgIAorICAgIHdoaWxlICgxKSB7CisJaWYgKCFkYXRhKSB7CisJICAgIGRwcmludGYoIkdldHRpbmcgYmxvY2sgJWQgZnJvbSBibG9jayAlbGx1XG4iLCBpLCBkaXJfYmxvY2spOworCSAgICBpZiAoKytpID4gaW5vZGUtPmJsb2NrcykKKwkJcmV0dXJuIE5VTEw7CS8qIEVuZCBvZiBkaXJlY3RvcnkgKi8KKwkgICAgZGF0YSA9IGdldF9jYWNoZShmcy0+ZnNfZGV2LCBkaXJfYmxvY2srKyk7CisJICAgIG9mZnNldCA9IDA7CisJfQorCisJZGUgPSAoY29uc3Qgc3RydWN0IGlzb19kaXJfZW50cnkgKikoZGF0YSArIG9mZnNldCk7CisJZGVfbGVuID0gZGUtPmxlbmd0aDsKKwlvZmZzZXQgKz0gZGVfbGVuOworCQorCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZnVsbCBkaXJlY3RvcnkgZW50cnkgKi8KKwlpZiAoZGVfbGVuIDwgMzMgfHwgb2Zmc2V0ID4gQkxPQ0tfU0laRShmcykpIHsKKwkgICAgLyoKKwkgICAgICogWmVybyA9IGVuZCBvZiBzZWN0b3IsIG9yIGNvcnJ1cHQgZGlyZWN0b3J5IGVudHJ5CisJICAgICAqCisJICAgICAqIEVDTUEtMTE5OjE5ODcgNi44LjEuMTogIkVhY2ggRGlyZWN0b3J5IFJlY29yZCBzaGFsbCBlbmQKKwkgICAgICogaW4gdGhlIExvZ2ljYWwgU2VjdG9yIGluIHdoaWNoIGl0IGJlZ2lucy4KKwkgICAgICovCisJICAgIGRhdGEgPSBOVUxMOworCSAgICBjb250aW51ZTsKKwl9CisJCisJLyogVHJ5IHRvIGdldCBSb2NrIFJpZGdlIG5hbWUgKi8KKwlyZXQgPSBzdXNwX3JyX2dldF9ubShmcywgKGNoYXIgKikgZGUsICZycl9uYW1lLCAmcnJfbmFtZV9sZW4pOworCWlmIChyZXQgPiAwKSB7CisJICAgIGlmIChzdHJjbXAocnJfbmFtZSwgZG5hbWUpID09IDApIHsKKwkJZHByaW50ZigiRm91bmQgKGJ5IFJSIG5hbWUpLlxuIik7CisJCWZyZWUocnJfbmFtZSk7CisJCXJldHVybiBkZTsKKwkgICAgfQorCSAgICBmcmVlKHJyX25hbWUpOworCSAgICBycl9uYW1lID0gTlVMTDsKKwkgICAgY29udGludWU7IC8qIFJvY2sgUmlkZ2Ugd2FzIHZhbGlkIGFuZCBkaWQgbm90IG1hdGNoICovCisJfQorCisJLyogRmFsbCBiYWNrIHRvIElTTyBuYW1lICovCisJZGVfbmFtZV9sZW4gPSBkZS0+bmFtZV9sZW47CisJZGVfbmFtZSA9IGRlLT5uYW1lOworCWlmIChpc29fY29tcGFyZV9uYW1lKGRlX25hbWUsIGRlX25hbWVfbGVuLCBkbmFtZSkpIHsKKwkgICAgZHByaW50ZigiRm91bmQgKGJ5IElTTyBuYW1lKS5cbiIpOworCSAgICByZXR1cm4gZGU7CisJfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSBlbnVtIGRpcmVudF90eXBlIGdldF9pbm9kZV9tb2RlKHVpbnQ4X3QgZmxhZ3MpCit7CisgICAgcmV0dXJuIChmbGFncyAmIDB4MDIpID8gRFRfRElSIDogRFRfUkVHOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICppc29fZ2V0X2lub2RlKHN0cnVjdCBmc19pbmZvICpmcywKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaXNvX2Rpcl9lbnRyeSAqZGUpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pc29faW5vZGUoZnMpOworICAgIGludCBibGt0b3NlYyA9IEJMT0NLX1NISUZUKGZzKSAtIFNFQ1RPUl9TSElGVChmcyk7CisKKyAgICBpZiAoIWlub2RlKQorCXJldHVybiBOVUxMOworCisgICAgZHByaW50ZigiR2V0dGluZyBpbm9kZSBmb3I6ICUuKnNcbiIsIGRlLT5uYW1lX2xlbiwgZGUtPm5hbWUpOworCisgICAgaW5vZGUtPm1vZGUgICA9IGdldF9pbm9kZV9tb2RlKGRlLT5mbGFncyk7CisgICAgaW5vZGUtPnNpemUgICA9IGRlLT5zaXplX2xlOworICAgIFBWVChpbm9kZSktPmxiYSA9IGRlLT5leHRlbnRfbGU7CisgICAgaW5vZGUtPmJsb2NrcyA9IChpbm9kZS0+c2l6ZSArIEJMT0NLX1NJWkUoZnMpIC0gMSkgPj4gQkxPQ0tfU0hJRlQoZnMpOworCisgICAgLyogV2UgaGF2ZSBhIHNpbmdsZSBleHRlbnQgZm9yIGFsbCBkYXRhICovCisgICAgaW5vZGUtPm5leHRfZXh0ZW50LnBzdGFydCA9IChzZWN0b3JfdClkZS0+ZXh0ZW50X2xlIDw8IGJsa3Rvc2VjOworICAgIGlub2RlLT5uZXh0X2V4dGVudC5sZW4gICAgPSAoc2VjdG9yX3QpaW5vZGUtPmJsb2NrcyA8PCBibGt0b3NlYzsKKworICAgIHJldHVybiBpbm9kZTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqaXNvX2lnZXRfcm9vdChzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgY29uc3Qgc3RydWN0IGlzb19kaXJfZW50cnkgKnJvb3QgPSAmSVNPX1NCKGZzKS0+cm9vdDsKKworICAgIHJldHVybiBpc29fZ2V0X2lub2RlKGZzLCByb290KTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqaXNvX2lnZXQoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQoreworICAgIGNvbnN0IHN0cnVjdCBpc29fZGlyX2VudHJ5ICpkZTsKKyAgICAKKyAgICBkcHJpbnRmKCJpc29faWdldCAlcCAlc1xuIiwgcGFyZW50LCBkbmFtZSk7CisKKyAgICBkZSA9IGlzb19maW5kX2VudHJ5KGRuYW1lLCBwYXJlbnQpOworICAgIGlmICghZGUpCisJcmV0dXJuIE5VTEw7CisgICAgCisgICAgcmV0dXJuIGlzb19nZXRfaW5vZGUocGFyZW50LT5mcywgZGUpOworfQorCitzdGF0aWMgaW50IGlzb19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyZW50ICpkaXJlbnQpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gZmlsZS0+ZnM7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmlub2RlOworICAgIGNvbnN0IHN0cnVjdCBpc29fZGlyX2VudHJ5ICpkZTsKKyAgICBjb25zdCBjaGFyICpkYXRhID0gTlVMTDsKKyAgICBjaGFyICpycl9uYW1lID0gTlVMTDsKKyAgICBpbnQgbmFtZV9sZW4sIHJldDsKKyAgICAKKyAgICB3aGlsZSAoMSkgeworCXNpemVfdCBvZmZzZXQgPSBmaWxlLT5vZmZzZXQgJiAoQkxPQ0tfU0laRShmcykgLSAxKTsKKworCWlmICghZGF0YSkgeworCSAgICB1aW50MzJfdCBpID0gZmlsZS0+b2Zmc2V0ID4+IEJMT0NLX1NISUZUKGZzKTsKKwkgICAgaWYgKGkgPj0gaW5vZGUtPmJsb2NrcykKKwkJcmV0dXJuIC0xOworCSAgICBkYXRhID0gZ2V0X2NhY2hlKGZzLT5mc19kZXYsIFBWVChpbm9kZSktPmxiYSArIGkpOworCX0KKwlkZSA9IChjb25zdCBzdHJ1Y3QgaXNvX2Rpcl9lbnRyeSAqKShkYXRhICsgb2Zmc2V0KTsKKwkKKwlpZiAoZGUtPmxlbmd0aCA8IDMzIHx8IG9mZnNldCArIGRlLT5sZW5ndGggPiBCTE9DS19TSVpFKGZzKSkgeworCSAgICBmaWxlLT5vZmZzZXQgPSAoZmlsZS0+b2Zmc2V0ICsgQkxPQ0tfU0laRShmcykpCisJCSYgfihCTE9DS19TSVpFKGZzKSAtIDEpOyAvKiBTdGFydCBvZiB0aGUgbmV4dCBibG9jayAqLworCSAgICBkYXRhID0gTlVMTDsKKwkgICAgY29udGludWU7CisJfQorCWJyZWFrOworICAgIH0KKyAgICAKKyAgICBkaXJlbnQtPmRfaW5vID0gMDsgICAgICAgICAgIC8qIElub2RlIG51bWJlciBpcyBpbnZhbGlkIHRvIElTTyBmcyAqLworICAgIGRpcmVudC0+ZF9vZmYgPSBmaWxlLT5vZmZzZXQ7CisgICAgZGlyZW50LT5kX3R5cGUgPSBnZXRfaW5vZGVfbW9kZShkZS0+ZmxhZ3MpOworCisgICAgLyogVHJ5IHRvIGdldCBSb2NrIFJpZGdlIG5hbWUgKi8KKyAgICByZXQgPSBzdXNwX3JyX2dldF9ubShmcywgKGNoYXIgKikgZGUsICZycl9uYW1lLCAmbmFtZV9sZW4pOworICAgIGlmIChyZXQgPiAwKSB7CisJbWVtY3B5KGRpcmVudC0+ZF9uYW1lLCBycl9uYW1lLCBuYW1lX2xlbiArIDEpOworCWZyZWUocnJfbmFtZSk7CisJcnJfbmFtZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKwluYW1lX2xlbiA9IGlzb19jb252ZXJ0X25hbWUoZGlyZW50LT5kX25hbWUsIGRlLT5uYW1lLCBkZS0+bmFtZV9sZW4pOworICAgIH0KKworICAgIGRpcmVudC0+ZF9yZWNsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgZGlyZW50LCBkX25hbWUpICsgMSArIG5hbWVfbGVuOworCisgICAgZmlsZS0+b2Zmc2V0ICs9IGRlLT5sZW5ndGg7ICAvKiBVcGRhdGUgZm9yIG5leHQgcmVhZGluZyAqLworICAgIAorICAgIHJldHVybiAwOworfQorCisvKiBMb2FkIHRoZSBjb25maWcgZmlsZSwgcmV0dXJuIDEgaWYgZmFpbGVkLCBvciAwICovCitzdGF0aWMgaW50IGlzb19vcGVuX2NvbmZpZyhzdHJ1Y3QgY29tMzJfZmlsZWRhdGEgKmZpbGVkYXRhKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzZWFyY2hfZGlyZWN0b3JpZXNbXSA9IHsKKwkiL2Jvb3QvaXNvbGludXgiLCAKKwkiL2lzb2xpbnV4IiwKKwkiL2Jvb3Qvc3lzbGludXgiLCAKKwkiL3N5c2xpbnV4IiwgCisJIi8iLAorCU5VTEwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICpmaWxlbmFtZXNbXSA9IHsKKwkiaXNvbGludXguY2ZnIiwKKwkic3lzbGludXguY2ZnIiwKKwlOVUxMCisgICAgfTsKKworICAgIHJldHVybiBzZWFyY2hfZGlycyhmaWxlZGF0YSwgc2VhcmNoX2RpcmVjdG9yaWVzLCBmaWxlbmFtZXMsIENvbmZpZ05hbWUpOworfQorCitzdGF0aWMgaW50IGlzb19mc19pbml0KHN0cnVjdCBmc19pbmZvICpmcykKK3sKKyAgICBzdHJ1Y3QgaXNvX3NiX2luZm8gKnNiaTsKKyAgICBjaGFyIHB2ZFsyMDQ4XTsJCS8qIFByaW1hcnkgVm9sdW1lIERlc2NyaXB0b3IgKi8KKyAgICB1aW50MzJfdCBwdmRfbGJhOworICAgIHN0cnVjdCBkaXNrICpkaXNrID0gZnMtPmZzX2Rldi0+ZGlzazsKKyAgICBpbnQgYmxrdG9zZWM7CisKKyAgICBzYmkgPSBtYWxsb2Moc2l6ZW9mKCpzYmkpKTsKKyAgICBpZiAoIXNiaSkgeworCW1hbGxvY19lcnJvcigiaXNvX3NiX2luZm8gc3RydWN0dXJlIik7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGZzLT5mc19pbmZvID0gc2JpOworCisgICAgLyogCisgICAgICogWFhYOiBoYW5kbGluZyBpc285NjYwIGluIGh5YnJpZCBtb2RlIG9uIHRvcCBvZiBhIDRLLWxvZ2ljYWwgZGlzaworICAgICAqIHdpbGwgcmVhbGx5LCByZWFsbHkgaHVydC4uLgorICAgICAqLworICAgIGZzLT5zZWN0b3Jfc2hpZnQgPSBmcy0+ZnNfZGV2LT5kaXNrLT5zZWN0b3Jfc2hpZnQ7CisgICAgZnMtPmJsb2NrX3NoaWZ0ICA9IDExOwkvKiBBIENELVJPTSBibG9jayBpcyBhbHdheXMgMksgKi8KKyAgICBmcy0+c2VjdG9yX3NpemUgID0gMSA8PCBmcy0+c2VjdG9yX3NoaWZ0OworICAgIGZzLT5ibG9ja19zaXplICAgPSAxIDw8IGZzLT5ibG9ja19zaGlmdDsKKyAgICBibGt0b3NlYyA9IGZzLT5ibG9ja19zaGlmdCAtIGZzLT5zZWN0b3Jfc2hpZnQ7CisKKyAgICBwdmRfbGJhID0gaXNvX2Jvb3RfaW5mby5wdmQ7CisgICAgaWYgKCFwdmRfbGJhKQorCXB2ZF9sYmEgPSAxNjsJCS8qIERlZmF1bHQgaWYgbm90IG90aGVyd2lzZSBkZWZpbmVkICovCisKKyAgICBkaXNrLT5yZHdyX3NlY3RvcnMoZGlzaywgcHZkLCAoc2VjdG9yX3QpcHZkX2xiYSA8PCBibGt0b3NlYywKKwkJICAgICAgIDEgPDwgYmxrdG9zZWMsIGZhbHNlKTsKKyAgICBtZW1jcHkoJnNiaS0+cm9vdCwgcHZkICsgUk9PVF9ESVJfT0ZGU0VULCBzaXplb2Yoc2JpLT5yb290KSk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBjYWNoZSAqLworICAgIGNhY2hlX2luaXQoZnMtPmZzX2RldiwgZnMtPmJsb2NrX3NoaWZ0KTsKKworICAgIC8qIENoZWNrIGZvciBTUCBhbmQgRVIgaW4gdGhlIGZpcnN0IGRpcmVjdG9yeSByZWNvcmQgb2YgdGhlIHJvb3QgZGlyZWN0b3J5LgorICAgICAgIFNldCBzYmktPnN1c3Bfc2tpcCBhbmQgZW5hYmxlIHNiaS0+ZG9fcnIgYXMgYXBwcm9wcmlhdGUuCisgICAgKi8KKyAgICBzdXNwX3JyX2NoZWNrX3NpZ25hdHVyZXMoZnMsIDEpOworCisgICAgcmV0dXJuIGZzLT5ibG9ja19zaGlmdDsKK30KKworCitjb25zdCBzdHJ1Y3QgZnNfb3BzIGlzb19mc19vcHMgPSB7CisgICAgLmZzX25hbWUgICAgICAgPSAiaXNvIiwKKyAgICAuZnNfZmxhZ3MgICAgICA9IEZTX1VTRU1FTSB8IEZTX1RISVNJTkQsCisgICAgLmZzX2luaXQgICAgICAgPSBpc29fZnNfaW5pdCwKKyAgICAuc2VhcmNoZGlyICAgICA9IE5VTEwsIAorICAgIC5nZXRmc3NlYyAgICAgID0gZ2VuZXJpY19nZXRmc3NlYywKKyAgICAuY2xvc2VfZmlsZSAgICA9IGdlbmVyaWNfY2xvc2VfZmlsZSwKKyAgICAubWFuZ2xlX25hbWUgICA9IGdlbmVyaWNfbWFuZ2xlX25hbWUsCisgICAgLm9wZW5fY29uZmlnICAgPSBpc29fb3Blbl9jb25maWcsCisgICAgLmlnZXRfcm9vdCAgICAgPSBpc29faWdldF9yb290LAorICAgIC5pZ2V0ICAgICAgICAgID0gaXNvX2lnZXQsCisgICAgLnJlYWRkaXIgICAgICAgPSBpc29fcmVhZGRpciwKKyAgICAubmV4dF9leHRlbnQgICA9IG5vX25leHRfZXh0ZW50LAorICAgIC5mc191dWlkICAgICAgID0gTlVMTCwKK307CmRpZmYgLS1naXQgYS9jb3JlL2ZzL2lzbzk2NjAvaXNvOTY2MF9mcy5oIGIvY29yZS9mcy9pc285NjYwL2lzbzk2NjBfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI2NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9pc285NjYwL2lzbzk2NjBfZnMuaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIElTTzk2NjBfRlNfSAorI2RlZmluZSBJU085NjYwX0ZTX0gKKworI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIEJvb3QgaW5mbyB0YWJsZSAqLworc3RydWN0IGlzb19ib290X2luZm8geworICAgIHVpbnQzMl90IHB2ZDsJCS8qIExCQSBvZiBwcmltYXJ5IHZvbHVtZSBkZXNjcmlwdG9yICovCisgICAgdWludDMyX3QgZmlsZTsJCS8qIExCQSBvZiBib290IGZpbGUgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7CQkvKiBMZW5ndGggb2YgYm9vdCBmaWxlICovCisgICAgdWludDMyX3QgY3N1bTsJCS8qIENoZWNrc3VtIG9mIGJvb3QgZmlsZSAqLworICAgIHVpbnQzMl90IHJlc2VydmVkWzEwXTsJLyogQ3VycmVudGx5IHVudXNlZCAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBpc29fYm9vdF9pbmZvIGlzb19ib290X2luZm87IC8qIEluIGlzb2xpbnV4LmFzbSAqLworCisvKiBUaGUgcm9vdCBkaXIgZW50cnkgb2Zmc2V0IGluIHRoZSBwcmltYXJ5IHZvbHVtZSBkZXNjcmlwdG9yICovCisjZGVmaW5lIFJPT1RfRElSX09GRlNFVCAgIDE1NgorCitzdHJ1Y3QgaXNvX2Rpcl9lbnRyeSB7CisgICAgdWludDhfdCBsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwICovCisgICAgdWludDhfdCBleHRfYXR0cl9sZW5ndGg7ICAgICAgICAgICAgICAgIC8qIDAxICovICAgIAorICAgIHVpbnQzMl90IGV4dGVudF9sZTsJCQkgICAgLyogMDIgKi8KKyAgICB1aW50MzJfdCBleHRlbnRfYmU7CQkJICAgIC8qIDA2ICovCisgICAgdWludDMyX3Qgc2l6ZV9sZTsJCQkgICAgLyogMGEgKi8gIAorICAgIHVpbnQzMl90IHNpemVfYmU7CQkJICAgIC8qIDBlICovCisgICAgdWludDhfdCBkYXRlWzddOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEyICovCisgICAgdWludDhfdCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE5ICovCisgICAgdWludDhfdCBmaWxlX3VuaXRfc2l6ZTsgICAgICAgICAgICAgICAgIC8qIDFhICovCisgICAgdWludDhfdCBpbnRlcmxlYXZlOyAgICAgICAgICAgICAgICAgICAgIC8qIDFiICovCisgICAgdWludDE2X3Qgdm9sdW1lX3NlcXVlbmNlX251bWJlcl9sZTsJICAgIC8qIDFjICovCisgICAgdWludDE2X3Qgdm9sdW1lX3NlcXVlbmNlX251bWJlcl9iZTsJICAgIC8qIDFlICovCisgICAgdWludDhfdCBuYW1lX2xlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwICovCisgICAgY2hhciAgICBuYW1lWzBdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaXNvX3NiX2luZm8geworICAgIHN0cnVjdCBpc29fZGlyX2VudHJ5IHJvb3Q7CisKKyAgICBpbnQgZG9fcnI7ICAgICAgIC8qIDEgLCAyID0gdHJ5IHRvIHByb2Nlc3MgUm9jayBSaWRnZSBpbmZvICwgMCA9IGRvIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDIgaW5kaWNhdGVzIHRoYXQgdGhlIGlkIG9mIFJSSVAgMS4xMiB3YXMgZm91bmQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBzdXNwX3NraXA7ICAgLyogU2tpcCBsZW5ndGggZnJvbSBTVVNQIGVudHJ5IFNQICovCit9OworCisvKgorICogaXNvOTY2MCBwcml2YXRlIGlub2RlIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBpc285NjYwX3B2dF9pbm9kZSB7CisgICAgdWludDMyX3QgbGJhOwkJLyogU3RhcnRpbmcgTEJBIG9mIGZpbGUgZGF0YSBhcmVhKi8KK307CisKKyNkZWZpbmUgUFZUKGkpICgoc3RydWN0IGlzbzk2NjBfcHZ0X2lub2RlICopKChpKS0+cHZ0KSkKKworI2VuZGlmIC8qIGlzbzk2NjBfZnMuaCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9mcy9pc285NjYwL3N1c3BfcnIuYyBiL2NvcmUvZnMvaXNvOTY2MC9zdXNwX3JyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlYWU5NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvaXNvOTY2MC9zdXNwX3JyLmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qIFJlYWRlciBmb3IgU1VTUCBhbmQgUm9jayBSaWRnZSBpbmZvcm1hdGlvbi4KKworICAgQ29weXJpZ2h0IChjKSAyMDEzIFRob21hcyBTY2htaXR0IDxzY2RiYWNrdXBAZ214Lm5ldD4KKyAgIFByb3ZpZGVkIHVuZGVyIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvciBsYXRlci4KKworICAgQmFzZWQgb246CisgICBTVVNQIDEuMTIgKGVudHJpZXMgQ0UgLCBQRCAsIFNQICwgU1QgLCBFUiAsIEVTKQorICAgICBmdHA6Ly9mdHAueW1pLmNvbS9wdWIvcm9ja3JpZGdlL3N1c3AxMTIucHMKKyAgIFJSSVAgMS4xMiAoZW50cmllcyBQWCAsIFBOICwgU0wgLCBOTSAsIENMICwgUEwgLCBSRSAsIFRGICwgU0YpCisgICAgIGZ0cDovL2Z0cC55bWkuY29tL3B1Yi9yb2NrcmlkZ2UvcnJpcDExMi5wcworICAgRUNNQS0xMTkgYWthIElTTyA5NjYwCisgICAgIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTExOS5wZGYKKworICAgU2hvcnRjb21taW5ncyAvIEZ1dHVyZSBpbXByb3ZlbWVudHM6CisgICAoWFhYKTogQXZvaWQgbWVtY3B5KCkgd2l0aCBDb250aW51YXRpb24gQXJlYXMgd2ljaCBzcGFuIG92ZXIgbW9yZSB0aGFuIG9uZQorCSAgYmxvY2sgPyAoV2lsbCB0aGVuIG5lZWQgbWVtY3B5KCkgd2l0aCBlbnRyaWVzIHdoaWNoIGFyZSBoaXQgYnkgYQorCSAgYmxvY2sgYm91bmRhcnkuKSAoUXVlc3Rpb25hYmxlIHdoZXRoZXIgdGhlIGVmZm9ydCBpcyB3b3J0aCBpdC4pCisgICAoWFhYKTogVGFrZSBpbnRvIHJlc3BlY3QgRVMgZW50cmllcyA/IChIYXJkbHkgYW55Ym9keSBkb2VzIHRoaXMuKQorCisqLworCisjaWZuZGVmIElzb2xpbnV4X3JvY2tyaWRnZV9pbl9saWJpc29mUworCisvKiBNaW5kbGVzc2x5IGNvcGllZCBmcm9tIGNvcmUvZnMvaXNvOTY2MC9pc285NjYwLmMgKi8KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvZGlyZW50Lmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGNhY2hlLmg+CisjaW5jbHVkZSA8ZGlzay5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlICJpc285NjYwX2ZzLmgiCisKKyNlbHNlIC8qICEgSXNvbGludXhfcm9ja3JpZGdlX2luX2xpYmlzb2ZTICovCisKKy8qID09PT09PSBUZXN0IG1vY2stdXAgb2YgZGVmaW5pdGlvbnMgd2hpY2ggc2hvdWxkIGNvbWUgZnJvbSBzeXNsaW51eCA9PT09PT0gKi8KKworLyogV2l0aCBkZWZpbmVkIElzb2xpbnV4X3JvY2tyaWRnZV9pbl9saWJpc29mUyB0aGlzIHNvdXJjZSBmaWxlIGNhbiBiZSBpbmNsdWRlZAorICAgaW50byBsaWJpc29mcy9mc19pbWFnZS5jIGFuZCB0aGUgb3V0Y29tZSBvZiBpdHMgcHVibGljIGZ1bmN0aW9ucyBjYW4gYmUKKyAgIGNvbXBhcmVkIHdpdGggdGhlIHBlcmNlcHRpb24gb2YgbGliaXNvZnMgd2hlbiBsb2FkaW5nIGFuIElTTyBpbWFnZS4KKworICAgVGVzdCByZXN1bHRzIGxvb2sgb2sgd2l0aCA1MCBJU08gaW1hZ2VzIHdoZW4gcmVhZCBieSB4b3JyaXNvIHVuZGVybmVhdGgKKyAgIHZhbGdyaW5kLgorKi8KKwordHlwZWRlZiB1aW50MzJfdCBibG9ja190OworCisjZGVmaW5lIGRwcmludGYgcHJpbnRmCisKK3N0cnVjdCBkZXZpY2UgeworICAgIElzb0RhdGFTb3VyY2UgKnNyYzsKK307CisKKworc3RydWN0IHN1c3BfcnJfZGlyX3JlY193cmFwIHsKKyAgICBjaGFyIGRhdGFbMjU2XTsKK307CisKK3N0cnVjdCBpc29fc2JfaW5mbyB7CisgICAgc3RydWN0IHN1c3BfcnJfZGlyX3JlY193cmFwIHJvb3Q7CisKKyAgICBpbnQgZG9fcnI7ICAgICAgIC8qIDEgPSB0cnkgdG8gcHJvY2VzcyBSb2NrIFJpZGdlIGluZm8gLCAwID0gZG8gbm90ICovCisgICAgaW50IHN1c3Bfc2tpcDsgICAvKiBTa2lwIGxlbmd0aCBmcm9tIFNVU1AgZW5udHJ5IFNQICovCit9OworCitzdHJ1Y3QgZnNfaW5mbyB7CisgICAgc3RydWN0IGRldmljZSAqZnNfZGV2OworICAgIHN0cnVjdCBpc29fc2JfaW5mbyAqZnNfaW5mbzsKK307CisKKyNkZWZpbmUgZ2V0X2NhY2hlIGR1bW15X2dldF9jYWNoZQorCitzdGF0aWMgY2hhciAqZHVtbXlfZ2V0X2NhY2hlKHN0cnVjdCBkZXZpY2UgKmZzX2RldiwgYmxvY2tfdCBsYmEpCit7CisgICAgc3RhdGljIHVpbnQ4X3QgYnVmWzIwNDhdOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmc19kZXYtPnNyYy0+cmVhZF9ibG9jayhmc19kZXYtPnNyYywgbGJhLCBidWYpOworICAgIGlmIChyZXQgPCAwKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiAoY2hhciAqKSBidWY7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PSBFbmQgb2YgdGVzdCBtb2NrLXVwID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2VuZGlmIC8qICEgSXNvbGludXhfcm9ja3JpZGdlX2Zvcl9yZWFMICovCisKKworc3RhdGljIGludCBzdXNwX3JyX2lzX291dF9vZl9tZW0odm9pZCAqcHQpCit7CisgICAgaWYgKHB0ICE9IE5VTEwpCisJcmV0dXJuIDA7CisgICAgZHByaW50Zigic3VzcF9yci5jOiBPdXQgb2YgbWVtb3J5ICFcbiIpOworCisgICAgLyogWFhYIDogU2hvdWxkIG9uZSBhYm9ydCBvbiBnbG9iYWwgbGV2ZWwgPyAqLworCisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHVpbnQzMl90IHN1c3BfcnJfcmVhZF9sc2IzMihjb25zdCB2b2lkICpidWYpCit7CisgICAgcmV0dXJuIGdldF9sZTMyKGJ1Zik7Cit9CisKKworLyogU3RhdGUgb2YgaXRlcmF0aW9uIG92ZXIgU1VTUCBlbnRyaWVzLgorCisgICBUaGlzIHdvdWxkIGJlIHF1aXRlIHRyaXZpYWwgaWYgdGhlcmUgd2FzIG5vdCB0aGUgcG9zc2liaWxpdHkgb2YgQ29udGludWF0aW9uCisgICBBcmVhcyBhbm5vdW5jZWQgYnkgdGhlIENFIGVudHJ5LiBJbiBnZW5lcmFsIHRoZXkgYXJlIHF1aXRlIHJhcmUsIGJlY2F1c2UKKyAgIG9mdGVuIGFsbCBSb2NrIFJpZGdlIGVudHJpZXMgZml0IGludG8gdGhlIElTTyA5NjYwIGRpcmVjdG9yeSByZWNvcmQuCisgICBTbyBpdCBzZWVtcyB1bndpc2UgdG8gaW52ZXN0IG11Y2ggY29tcGxleGl0eSBpbnRvIG9wdGltaXphdGlvbiBvZgorICAgQ29udGludWF0aW9uIEFyZWFzLgorICAgKEkgZm91bmQgMzUgQ0UgaW4gYSBiYWNrdXAgb2YgbWluZSB3aGljaCBjb250YWlucyA2MzAwMCBmaWxlcywgMiBDRSBpbgorICAgIGEgRGViaWFuIG5ldGluc3QgSVNPLCAyIENFIGluIGEgRmVkb3JhIGxpdmUgQ0QuKQorKi8KK3N0cnVjdCBzdXNwX3JyX2l0ZXIgeworICAgIHN0cnVjdCBmc19pbmZvICpmczsgICAvKiBGcm9tIHdoZXJlIHRvIHJlYWQgQ29udGludWF0aW9uIEFyZWEgZGF0YSAqLworICAgIGNoYXIgICAgKmRpcl9yZWM7ICAgICAvKiBJU08gOTY2MCBkaXJlY3RvcnkgcmVjb3JkICovCisgICAgaW50ICAgICBpbl9jZTsgICAgICAgIC8qIDA9IHN0aWxsIHJlYWRpbmcgZGlyX3JlYywgMT0gcmVhZGluZyBjZV9kYXRhICovCisgICAgY2hhciAgICAqY2VfZGF0YTsgICAgIC8qIExvYWRlZCBDb250aW51YXRpb24gQXJlYSBkYXRhICovCisgICAgaW50ICAgICBjZV9hbGxvY2F0ZWQ7IC8qIDA9IGRvIG5vdCBmcmVlIGNlX2RhdGEsIDE9IGRvIGZyZWUgKi8KKyAgICBzaXplX3QgIHJlYWRfcG9zOyAgICAgLyogQ3VycmVudCByZWFkIG9mZnNldCBpbiBkaXJfcmVjIG9yIGNlX2RhdGEgKi8KKyAgICBzaXplX3QgIHJlYWRfZW5kOyAgICAgLyogQ3VycmVudCBmaXJzdCBpbnZhbGlkIHJlYWRfcG9zICovCisKKyAgICBibG9ja190IG5leHRfbGJhOyAgICAgLyogQmxvY2sgbnVtYmVyIG9mIHN0YXJ0IG9mIG5leHQgQ29udGludWF0aW9uIEFyZWEgKi8KKyAgICBzaXplX3QgIG5leHRfb2Zmc2V0OyAgLyogQnl0ZSBvZmZzZXQgd2l0aGluIHRoZSBuZXh0X2xiYSBibG9jayAqLworICAgIHNpemVfdCAgbmV4dF9sZW5ndGg7ICAvKiBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gbmV4dCBDb250LiBBcmVhICovCit9OworCisKK3N0YXRpYyBpbnQgc3VzcF9ycl9pdGVyX25ldyhzdHJ1Y3Qgc3VzcF9ycl9pdGVyICoqaXRlciwKKwkJCSAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMsIGNoYXIgKmRpcl9yZWMpCit7CisgICAgc3RydWN0IGlzb19zYl9pbmZvICpzYmkgPSBmcy0+ZnNfaW5mbzsKKyAgICBzdHJ1Y3Qgc3VzcF9ycl9pdGVyICpvOworICAgIHVpbnQ4X3QgbGVuX2ZpOworICAgIGludCByZWFkX3BvcywgcmVhZF9lbmQ7CisKKyAgICBsZW5fZmkgPSAoKHVpbnQ4X3QgKikgZGlyX3JlYylbMzJdOworICAgIHJlYWRfcG9zID0gMzMgKyBsZW5fZmkgKyAhKGxlbl9maSAlIDIpICsgc2JpLT5zdXNwX3NraXA7CisgICAgcmVhZF9lbmQgPSAoKHVpbnQ4X3QgKikgZGlyX3JlYylbMF07CisgICAgaWYgKHJlYWRfcG9zICsgNCA+IHJlYWRfZW5kKQorCXJldHVybiAwOyAvKiBOb3QgZW5vdWdoIFN5c3RlbSBVc2UgZGF0YSBwcmVzZW50IGZvciBTVVNQICovCisgICAgaWYgKGRpcl9yZWNbcmVhZF9wb3MgKyAzXSAhPSAxKQorCXJldHVybiAwOyAvKiBOb3QgU1VTUCB2ZXJzaW9uIDEgKi8KKworICAgIG89ICppdGVyPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdXNwX3JyX2l0ZXIpKTsKKyAgICBpZiAoc3VzcF9ycl9pc19vdXRfb2ZfbWVtKG8pKQorCXJldHVybiAtMTsKKyAgICBvLT5mcyA9IGZzOworICAgIG8tPmRpcl9yZWM9IGRpcl9yZWM7CisgICAgby0+aW5fY2U9IDA7CisgICAgby0+cmVhZF9wb3MgPSByZWFkX3BvczsKKyAgICBvLT5yZWFkX2VuZCA9IHJlYWRfZW5kOworICAgIG8tPm5leHRfbGJhID0gMDsKKyAgICBvLT5uZXh0X29mZnNldCA9IG8tPm5leHRfbGVuZ3RoID0gMDsKKyAgICBvLT5jZV9kYXRhID0gTlVMTDsKKyAgICBvLT5jZV9hbGxvY2F0ZWQgPSAwOworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgc3VzcF9ycl9pdGVyX2Rlc3Ryb3koc3RydWN0IHN1c3BfcnJfaXRlciAqKml0ZXIpCit7CisgICAgc3RydWN0IHN1c3BfcnJfaXRlciAqbzsKKworICAgIG8gPSAqaXRlcjsKKyAgICBpZiAobyA9PSBOVUxMKQorCXJldHVybiAwOworICAgIGlmIChvLT5jZV9kYXRhICE9IE5VTEwgJiYgby0+Y2VfYWxsb2NhdGVkKQorCWZyZWUoby0+Y2VfZGF0YSk7CisgICAgZnJlZShvKTsKKyAgICAqaXRlciA9IE5VTEw7CisgICAgcmV0dXJuIDE7Cit9CisKKworLyogU3dpdGNoIHRvIG5leHQgQ29udGludWF0aW9uIEFyZWEuCisqLworc3RhdGljIGludCBzdXNwX3JyX3N3aXRjaF90b19jYShzdHJ1Y3Qgc3VzcF9ycl9pdGVyICppdGVyKQoreworICAgIGJsb2NrX3QgbnVtX2Jsb2NrcywgaTsKKyAgICBjb25zdCBjaGFyICpkYXRhID0gTlVMTDsKKworICAgIG51bV9ibG9ja3MgPSAoaXRlci0+bmV4dF9vZmZzZXQgKyBpdGVyLT5uZXh0X2xlbmd0aCArIDIwNDcpIC8gMjA0ODsKKworICAgIGlmIChpdGVyLT5jZV9kYXRhICE9IE5VTEwgJiYgaXRlci0+Y2VfYWxsb2NhdGVkKQorCWZyZWUoaXRlci0+Y2VfZGF0YSk7CisgICAgaXRlci0+Y2VfZGF0YSA9IE5VTEw7CisgICAgaXRlci0+Y2VfYWxsb2NhdGVkID0gMDsKKyAgICBpZiAobnVtX2Jsb2NrcyA+IDEpIHsKKwkvKiBUaGUgYmxvY2tzIGFyZSBleHBlY3RlZCBjb250aWd1b3VzbHkuIE5lZWQgdG8gY29uc29saWRhdGUgdGhlbS4gKi8KKwlpZiAobnVtX2Jsb2NrcyA+IDUwKSB7CisJICAgIGRwcmludGYoInN1c3BfcnIuYzogTW9yZSB0aGFuIDEwMCBLQiBjbGFpbWVkIGJ5IGEgQ0UgZW50cnkuXG4iKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwlpdGVyLT5jZV9kYXRhID0gbWFsbG9jKG51bV9ibG9ja3MgKiAyMDQ4KTsKKwlpZiAoc3VzcF9ycl9pc19vdXRfb2ZfbWVtKGl0ZXItPmNlX2RhdGEpKQorCSAgICByZXR1cm4gLTE7CisJaXRlci0+Y2VfYWxsb2NhdGVkID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CisJICAgIGRhdGEgPSBnZXRfY2FjaGUoaXRlci0+ZnMtPmZzX2RldiwgaXRlci0+bmV4dF9sYmEgKyBpKTsKKwkgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworCQlkcHJpbnRmKCJzdXNwX3JyLmM6IEZhaWx1cmUgdG8gcmVhZCBibG9jayAlbHVcbiIsCisJCQkodW5zaWduZWQgbG9uZykgaXRlci0+bmV4dF9sYmEgKyBpKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgIG1lbWNweShpdGVyLT5jZV9kYXRhICsgaSAqIDIwNDgsIGRhdGEsIDIwNDgpOworCX0KKyAgICB9IGVsc2UgeworCS8qIEF2b2lkaW5nIG1hbGxvYygpIGFuZCBtZW1jcHkoKSBpbiB0aGUgc2luZ2xlIGJsb2NrIGNhc2UgKi8KKwlkYXRhID0gZ2V0X2NhY2hlKGl0ZXItPmZzLT5mc19kZXYsIGl0ZXItPm5leHRfbGJhKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJICAgIGRwcmludGYoInN1c3BfcnIuYzogRmFpbHVyZSB0byByZWFkIGJsb2NrICVsdVxuIiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBpdGVyLT5uZXh0X2xiYSk7CisJICAgIHJldHVybiAtMTsKKwl9CisJaXRlci0+Y2VfZGF0YSA9IChjaGFyICopIGRhdGE7CisgICAgfQorCisgICAgaXRlci0+aW5fY2UgPSAxOworICAgIGl0ZXItPnJlYWRfcG9zID0gaXRlci0+bmV4dF9vZmZzZXQ7CisgICAgaXRlci0+cmVhZF9lbmQgPSBpdGVyLT5uZXh0X29mZnNldCArIGl0ZXItPm5leHRfbGVuZ3RoOworICAgIGl0ZXItPm5leHRfbGJhID0gMDsKKyAgICBpdGVyLT5uZXh0X29mZnNldCA9IGl0ZXItPm5leHRfbGVuZ3RoID0gMDsKKyAgICByZXR1cm4gMTsKK30KKworCisvKiBPYnRhaW4gdGhlIG5leHQgU1VTUCBlbnRyeS4KKyovCitzdGF0aWMgaW50IHN1c3BfcnJfaXRlcmF0ZShzdHJ1Y3Qgc3VzcF9ycl9pdGVyICppdGVyLCBjaGFyICoqcG9zX3B0KQoreworICAgIGNoYXIgKmVudHJpZXM7CisgICAgdWludDhfdCBzdXNwX2xlbiwgKnVfZW50cnk7CisgICAgaW50IHJldDsKKworICAgIGlmIChpdGVyLT5pbl9jZSkgeworCWVudHJpZXMgPSBpdGVyLT5jZV9kYXRhICsgaXRlci0+cmVhZF9wb3M7CisgICAgfSBlbHNlIHsKKwllbnRyaWVzID0gaXRlci0+ZGlyX3JlYyArIGl0ZXItPnJlYWRfcG9zOworICAgIH0KKyAgICBpZiAoaXRlci0+cmVhZF9wb3MgKyA0IDw9IGl0ZXItPnJlYWRfZW5kKQorCWlmIChlbnRyaWVzWzNdICE9IDEpIHsKKwkgICAgLyogTm90IFNVU1AgdmVyc2lvbiAxICovCisJICAgIGRwcmludGYoInN1c3BfcnIuYzogQ2hhaW4gb2YgU1VTUCBlbnRyaWVzIGJyb2tlblxuIik7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgaWYgKGl0ZXItPnJlYWRfcG9zICsgNCA+IGl0ZXItPnJlYWRfZW5kIHx8CisJKGVudHJpZXNbMF0gPT0gJ1MnICYmIGVudHJpZXNbMV0gPT0gJ1QnKSkgeworCS8qIFRoaXMgcGFydCBvZiB0aGUgU1UgYXJlYSBpcyBkb25lICovCisJaWYgKGl0ZXItPm5leHRfbGVuZ3RoID09IDApIHsKKwkgICAgLyogTm8gZnVydGhlciBDRSBlbnRyeSB3YXMgZW5jb3VudGVyZWQuIEl0ZXJhdGlvbiBlbmRzIG5vdy4gKi8KKwkgICAgcmV0dXJuIDA7CisJfQorCXJldCA9IHN1c3BfcnJfc3dpdGNoX3RvX2NhKGl0ZXIpOworCWlmIChyZXQgPD0gMCkKKwkgICAgcmV0dXJuIHJldDsKKwllbnRyaWVzID0gaXRlci0+Y2VfZGF0YSArIGl0ZXItPnJlYWRfcG9zOworICAgIH0KKworICAgIGlmIChlbnRyaWVzWzBdID09ICdDJyAmJiBlbnRyaWVzWzFdID09ICdFJykgeworCWlmIChpdGVyLT5uZXh0X2xlbmd0aCA+IDApIHsKKwkgICAgZHByaW50Zigic3VzcF9yci5jOiBTdXJwbHVzIENFIGVudHJ5IGRldGVjdGVkXG4iKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwkvKiBSZWdpc3RlciBhZGRyZXNzIGRhdGEgb2YgbmV4dCBDb250aW51YXRpb24gQXJlYSAqLworCXVfZW50cnkgPSAodWludDhfdCAqKSBlbnRyaWVzOworCWl0ZXItPm5leHRfbGJhID0gc3VzcF9ycl9yZWFkX2xzYjMyKHVfZW50cnkgKyA0KTsKKwlpdGVyLT5uZXh0X29mZnNldCA9IHN1c3BfcnJfcmVhZF9sc2IzMih1X2VudHJ5ICsgMTIpOworCWl0ZXItPm5leHRfbGVuZ3RoID0gc3VzcF9ycl9yZWFkX2xzYjMyKHVfZW50cnkgKyAyMCk7CisgICAgfQorCisgICAgKnBvc19wdCA9IGVudHJpZXM7CisgICAgc3VzcF9sZW4gPSAoKHVpbnQ4X3QgKikgZW50cmllcylbMl07CisgICAgaXRlci0+cmVhZF9wb3MgKz0gc3VzcF9sZW47CisgICAgcmV0dXJuIDE7Cit9CisKKworLyogQ2hlY2sgZm9yIFNQIGVudHJ5IGF0IHBvc2l0aW9uIHRyeV9za2lwIGluIHRoZSBTeXN0ZW0gVXNlIGFyZWEuCisqLworc3RhdGljIGludCBzdXNwX3JyX2NoZWNrX3NwKHN0cnVjdCBmc19pbmZvICpmcywgY2hhciAqZGlyX3JlYywgaW50IHRyeV9za2lwKQoreworICAgIHN0cnVjdCBpc29fc2JfaW5mbyAqc2JpID0gZnMtPmZzX2luZm87CisgICAgaW50IHJlYWRfcG9zLCByZWFkX2VuZCwgbGVuX2ZpOworICAgIHVpbnQ4X3QgKnN1YTsKKworICAgIGxlbl9maSA9ICgodWludDhfdCAqKSBkaXJfcmVjKVszMl07CisgICAgcmVhZF9wb3MgPSAzMyArIGxlbl9maSArICEobGVuX2ZpICUgMikgKyB0cnlfc2tpcDsKKyAgICByZWFkX2VuZCA9ICgodWludDhfdCAqKSBkaXJfcmVjKVswXTsKKyAgICBpZiAocmVhZF9lbmQgLSByZWFkX3BvcyA8IDcpCisJcmV0dXJuIDA7CisgICAgc3VhID0gKHVpbnQ4X3QgKikgKGRpcl9yZWMgKyByZWFkX3Bvcyk7CisgICAgaWYgKHN1YVswXSAhPSAnUycgfHwgc3VhWzFdICE9ICdQJyB8fCBzdWFbMl0gIT0gNyB8fCBzdWFbM10gIT0gMSB8fAorCXN1YVs0XSAhPSAweGJlIHx8IHN1YVs1XSAhPSAweGVmKQorCXJldHVybiAwOworICAgIGRwcmludGYoInN1c3BfcnIuYzogU1VTUCBzaWduYXR1cmUgZGV0ZWN0ZWRcbiIpOworICAgIHNiaS0+c3VzcF9za2lwID0gKCh1aW50OF90ICopIGRpcl9yZWMpWzZdOworICAgIGlmIChzYmktPnN1c3Bfc2tpcCA+IDAgJiYgc2JpLT5zdXNwX3NraXAgIT0gdHJ5X3NraXApCisJZHByaW50Zigic3VzcF9yci5jOiBVbnVzdWFsOiBOb24temVybyBza2lwIGxlbmd0aCBpbiBTUCBlbnRyeVxuIik7CisgICAgcmV0dXJuIDE7Cit9CisKKworLyogUHVibGljIGZ1bmN0aW9uLiBTZWUgc3VzcF9yci5oCisKKyAgIFJvY2sgUmlkZ2Ugc3BlY2lmaWMga25vd2xlZGdlIGFib3V0IE5NIGFuZCBTTCBoYXMgYmVlbiBpbnRlZ3JhdGVkIGhlcmUsCisgICBiZWNhdXNlIHRoaXMgc2F2ZXMgb25lIG1hbGxvYyBhbmQgbWVtY3B5IGZvciB0aGUgZmlsZSBuYW1lLgorKi8KK2ludCBzdXNwX3JyX2dldF9lbnRyaWVzKHN0cnVjdCBmc19pbmZvICpmcywgY2hhciAqZGlyX3JlYywgY2hhciAqc2lnLAorCQkJY2hhciAqKmRhdGEsIGludCAqbGVuX2RhdGEsIGludCBmbGFnKQoreworICAgIGludCBjb3VudCA9IDAsIHJldCA9IDAsIGhlYWRfc2tpcCA9IDQsIG5tc3BfZmxhZ3MgPSAtMSwgaXNfZG9uZSA9IDA7CisgICAgY2hhciAqcG9zX3B0LCAqbmV3X2RhdGE7CisgICAgdWludDhfdCBwYXlfbGVuOworICAgIHN0cnVjdCBzdXNwX3JyX2l0ZXIgKml0ZXIgPSBOVUxMOworICAgIHN0cnVjdCBpc29fc2JfaW5mbyAqc2JpID0gZnMtPmZzX2luZm87CisKKyAgICAqZGF0YSA9IE5VTEw7CisgICAgKmxlbl9kYXRhID0gMDsKKworICAgIGlmICghc2JpLT5kb19ycikKKwlyZXR1cm4gMDsgLyogUm9jayBSaWRnZSBpcyBub3QgZW5hYmxlZCAqLworCisgICAgaWYgKGZsYWcgJiAxKQorCWhlYWRfc2tpcCA9IDU7CisKKyAgICByZXQgPSBzdXNwX3JyX2l0ZXJfbmV3KCZpdGVyLCBmcywgZGlyX3JlYyk7CisgICAgaWYgKHJldCA8PSAwKQorCWdvdG8gZXg7CisgICAgd2hpbGUgKCFpc19kb25lKSB7CisJcmV0ID0gc3VzcF9ycl9pdGVyYXRlKGl0ZXIsICZwb3NfcHQpOworCWlmIChyZXQgPCAwKQorCSAgICBnb3RvIGV4OworCWlmIChyZXQgPT0gMCkKKwkgICAgYnJlYWs7IC8qIEVuZCBTVVNQIGl0ZXJhdGlvbiAqLworCWlmIChzaWdbMF0gIT0gcG9zX3B0WzBdIHx8IHNpZ1sxXSAhPSBwb3NfcHRbMV0pCisJICAgIGNvbnRpbnVlOyAvKiBOZXh0IFNVU1AgaXRlcmF0aW9uICovCisKKwlwYXlfbGVuID0gKCh1aW50OF90ICopIHBvc19wdClbMl07CisJaWYgKHBheV9sZW4gPCBoZWFkX3NraXApIHsKKwkgICAgZHByaW50Zigic3VzcF9yci5jOiBTaG9ydCBOTSBlbnRyeSBlbmNvdW50ZXJlZC5cbiIpOworCSAgICByZXQgPSAtMTsKKwkgICAgZ290byBleDsKKwl9CisJcGF5X2xlbiAtPSBoZWFkX3NraXA7CisJaWYgKChmbGFnICYgMSkpIHsKKwkgICAgaWYgKG5tc3BfZmxhZ3MgPCAwKQorCQlubXNwX2ZsYWdzID0gKCh1aW50OF90ICopIHBvc19wdClbNF07CisJICAgIGlmICghKHBvc19wdFs0XSAmIDEpKSAvKiBObyBDT05USU5VRSBiaXQgKi8KKwkJaXNfZG9uZSA9IDE7IC8qIFRoaXMgaXMgdGhlIGxhc3QgaXRlcmF0aW9uIGN5Y2xlICovCisJfQorCWNvdW50ICs9IHBheV9sZW47CisJaWYgKGNvdW50ID4gMTAyNDAwKSB7CisJICAgIGRwcmludGYoInN1c3BfcnIuYzogTW9yZSB0aGFuIDEwMCBLQiBpbiAnJWMlYycgZW50cmllcy5cbiIsCisJCSAgICBzaWdbMF0sIHNpZ1sxXSk7CisJICAgIHJldCA9IC0xOworCSAgICBnb3RvIGV4OworCX0KKwluZXdfZGF0YSA9IG1hbGxvYyhjb3VudCArIDEpOworCWlmIChzdXNwX3JyX2lzX291dF9vZl9tZW0obmV3X2RhdGEpKSB7CisJICAgIHJldCA9IC0xOworCSAgICBnb3RvIGV4OworCX0KKwlpZiAoKmRhdGEgIT0gTlVMTCkgeworCSAgICAvKiBUaGlzIGNhc2Ugc2hvdWxkIGJlIHJhcmUuIEFuIGV4dHJhIGl0ZXJhdGlvbiBwYXNzIHRvIHByZWRpY3QKKwkgICAgICAgdGhlIG5lZWRlZCBkYXRhIHNpemUgd291bGQgaGFyZGx5IHBheSBvZmYuCisJICAgICovCisJICAgIG1lbWNweShuZXdfZGF0YSwgKmRhdGEsICpsZW5fZGF0YSk7CisJICAgIGZyZWUoKmRhdGEpOworCX0KKwluZXdfZGF0YVtjb3VudF0gPSAwOworCSpkYXRhID0gbmV3X2RhdGE7CisJbWVtY3B5KCpkYXRhICsgKmxlbl9kYXRhLCBwb3NfcHQgKyBoZWFkX3NraXAsIHBheV9sZW4pOworCSpsZW5fZGF0YSArPSBwYXlfbGVuOworICAgIH0KKyAgICBpZiAoKmRhdGEgPT0gTlVMTCkgeworCXJldCA9IDA7CisgICAgfSBlbHNlIGlmIChmbGFnICYgMSkgeworCXJldCA9IDB4MTAwIHwgbm1zcF9mbGFnczsKKyAgICB9IGVsc2UgeworCXJldCA9IDE7CisgICAgfQorZXg6OworICAgIHN1c3BfcnJfaXRlcl9kZXN0cm95KCZpdGVyKTsKKyAgICBpZiAocmV0IDw9IDAgJiYgKmRhdGEgIT0gTlVMTCkgeworCWZyZWUoKmRhdGEpOworCSpkYXRhID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKiBQdWJsaWMgZnVuY3Rpb24uIFNlZSBzdXNwX3JyLmgKKyovCitpbnQgc3VzcF9ycl9nZXRfbm0oc3RydWN0IGZzX2luZm8gKmZzLCBjaGFyICpkaXJfcmVjLAorCQkgICBjaGFyICoqbmFtZSwgaW50ICpsZW5fbmFtZSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gc3VzcF9ycl9nZXRfZW50cmllcyhmcywgZGlyX3JlYywgIk5NIiwgbmFtZSwgbGVuX25hbWUsIDEpOworICAgIGlmIChyZXQgPD0gMCkKKwlyZXR1cm4gcmV0OworCisgICAgLyogSW50ZXJwcmV0IGZsYWdzICovCisgICAgaWYgKHJldCAmIDB4NikgeworCWlmICgqbmFtZSAhPSBOVUxMKQorCSAgICBmcmVlKCpuYW1lKTsKKwkqbGVuX25hbWUgPSAwOworCSpuYW1lID0gc3RyZHVwKHJldCAmIDB4MiA/ICIuIiA6ICIuLiIpOworCWlmIChzdXNwX3JyX2lzX291dF9vZl9tZW0oKm5hbWUpKSB7CisJICAgIHJldHVybiAtMTsKKwl9CisJKmxlbl9uYW1lID0gc3RybGVuKCpuYW1lKTsKKyAgICB9CisgICAgaWYgKCpsZW5fbmFtZSA+PSAyNTYpIHsKKwlkcHJpbnRmKCJzdXNwX3JyLmM6IFJvY2sgUmlkZ2UgbmFtZSBsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycy5cbiIpOworCWZyZWUoKm5hbWUpOworCSpuYW1lID0gTlVMTDsKKwkqbGVuX25hbWUgPSAwOworCXJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKworLyogUHVibGljIGZ1bmN0aW9uLiBTZWUgc3VzcF9yci5oCisqLworaW50IHN1c3BfcnJfY2hlY2tfc2lnbmF0dXJlcyhzdHJ1Y3QgZnNfaW5mbyAqZnMsIGludCBmbGFnKQoreworICAgIHN0cnVjdCBpc29fc2JfaW5mbyAqc2JpID0gZnMtPmZzX2luZm87CisgICAgY2hhciAqZGlyX3JlYzsKKyAgICBjaGFyICpkYXRhID0gTlVMTDsKKyAgICB1aW50OF90ICp1X2RhdGE7CisgICAgYmxvY2tfdCBsYmE7CisgICAgaW50IGxlbl9kYXRhLCBpLCBsZW5fZXIgPSAwLCBsZW5faWQsIHJldDsKKyAgICBpbnQgcnJpcF8xMTIgPSAwOworCisgICAgc2JpLT5kb19yciA9IDE7ICAgICAgLyogcHJvdmlzb3J5IGZvciB0aGUgdGltZSBvZiBleGFtaW5hdGlvbiAqLworICAgIHNiaS0+c3VzcF9za2lwID0gMDsKKworI2lmbmRlZiBJc29saW51eF9yb2NrcmlkZ2VfaW5fbGliaXNvZlMKKy8qIChUaGVyZSBpcyBhIG5hbWUgY29sbGlzaW9uIHdpdGggbGliaXNvZnMgQkxPQ0tfU0laRS4gT24gdGhlIG90aGVyIGhhbmQsCisgICAgbGliaXNvZnMgaGFzIGhhcmRjb2RlZCBibG9ja3NpemUgMjA0OC4pICovCisKKyAgICAvKiBGb3Igbm93IHRoaXMgd29ya3Mgb25seSB3aXRoIDIgS0IgYmxvY2tzICovCisgICAgaWYgKEJMT0NLX1NJWkUoZnMpICE9IDIwNDgpIHsKKwlkcHJpbnRmKCJzdXNwX3JyLmM6IEJsb2NrIHNpemUgaXMgbm90IDIwNDguIFJvY2sgUmlkZ2UgZGlzYWJsZWQuXG4iKTsKKwlnb3RvIG5vX3N1c3A7CisgICAgfQorCisjZW5kaWYgLyogSXNvbGludXhfcm9ja3JpZGdlX2luX2xpYmlzb2ZTICovCisKKyAgICAvKiBPYnRhaW4gZmlyc3QgZGlyX3JlYyBvZiByb290IGRpcmVjdG9yeSAqLworICAgIGxiYSA9IHN1c3BfcnJfcmVhZF9sc2IzMigoKHVpbnQ4X3QgKikgJihzYmktPnJvb3QpKSArIDIpOworICAgIGRpcl9yZWMgPSAoY2hhciAqKSBnZXRfY2FjaGUoZnMtPmZzX2RldiwgbGJhKTsKKyAgICBpZiAoZGlyX3JlYyA9PSBOVUxMKQorCWdvdG8gbm9fc3VzcDsKKworICAgIC8qIEZpcnN0IFN5c3RlbSBVc2UgZW50cnkgbXVzdCBiZSBTUCAqLworICAgIHJldCA9IHN1c3BfcnJfY2hlY2tfc3AoZnMsIGRpcl9yZWMsIDApOworICAgIGlmIChyZXQgPT0gMCkgeworCS8qIFNVU1AgMS4xMiBwcmVzY3JpYmVzIHRoYXQgb24gQ0QtUk9NIFhBIGRpc2NzIHRoZSBTUCBlbnRyeSBpcyBhdAorCSAgIG9mZnNldCAxNCBvZiB0aGUgU3lzdGVtIFVzZSBhcmVhLgorCSAgIEhvdyB0byBkZXRlY3QgYSBDRC1ST00gWEEgZGlzYyBoZXJlID8KKwkgICAobGliaXNvZnMgaWdub3JlcyB0aGlzIHByZXNjcmlwdGlvbiBhbmQgbGl2ZXMgd2VsbCB3aXRoIHRoYXQuCisJICAgIC91c3Ivc3JjL2xpbnV4L2ZzL2lzb2ZzLyBtYWtlcyBhIGJsaW5kIHRyeSB3aXRoIDE0LikKKwkqLworCXJldCA9IHN1c3BfcnJfY2hlY2tfc3AoZnMsIGRpcl9yZWMsIDE0KTsKKyAgICB9CisgICAgaWYgKHJldCA8PSAwKQorCWdvdG8gbm9fc3VzcDsKKworICAgIGlmICghKGZsYWcgJiAxKSkgeworCXJldCA9IDE7CisJZ290byBleDsKKyAgICB9CisKKyAgICAvKiBMb29rIGZvciBFUiBlbnRyaWVzICovCisgICAgcmV0ID0gc3VzcF9ycl9nZXRfZW50cmllcyhmcywgZGlyX3JlYywgIkVSIiwgJmRhdGEsICZsZW5fZGF0YSwgMCk7CisgICAgaWYgKHJldCA8PSAwIHx8IGxlbl9kYXRhIDwgOCkKKwlnb3RvIG5vX3JyOworICAgIHVfZGF0YSA9ICh1aW50OF90ICopIGRhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbl9kYXRhOyBpICs9IGxlbl9lcikgeworCWxlbl9pZCA9IHVfZGF0YVswXTsKKwlsZW5fZXIgPSA0ICsgbGVuX2lkICsgdV9kYXRhWzFdICsgdV9kYXRhWzJdOworCWlmIChpICsgbGVuX2VyID4gbGVuX2RhdGEpIHsKKwkgICAgZHByaW50Zigic3VzcF9yci5jOiBFcnJvciB3aXRoIGZpZWxkIGxlbmd0aHMgaW4gRVIgZW50cnlcbiIpOworCSAgICBnb3RvIG5vX3JyOworCX0KKwlpZiAobGVuX2lkID09IDEwICYmIHN0cm5jbXAoZGF0YSArIDQsICJSUklQXzE5OTFBIiwgbGVuX2lkKSA9PSAwKSB7CisJICAgIGRwcmludGYoInN1c3BfcnIuYzogU2lnbmF0dXJlIG9mIFJvY2sgUmlkZ2UgMS4xMCBkZXRlY3RlZFxuIik7CisJICAgIGJyZWFrOworCX0gZWxzZSBpZiAoKGxlbl9pZCA9PSAxMCAmJgorCQkgICBzdHJuY21wKGRhdGEgKyA0LCAiSUVFRV9QMTI4MiIsIGxlbl9pZCkgPT0gMCkgfHwKKwkJICAobGVuX2lkID09IDkgJiYKKwkJICAgc3RybmNtcChkYXRhICsgNCwgIklFRUVfMTI4MiIsIGxlbl9pZCkgPT0gMCkpIHsKKwkgICAgZHByaW50Zigic3VzcF9yci5jOiBTaWduYXR1cmUgb2YgUm9jayBSaWRnZSAxLjEyIGRldGVjdGVkXG4iKTsKKwkgICAgcnJpcF8xMTIgPSAxOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGlmIChpID49IGxlbl9kYXRhKQorCWdvdG8gbm9fcnI7CisKKyAgICBzYmktPmRvX3JyID0gMSArIHJyaXBfMTEyOworICAgIHJldCA9IDIgKyBycmlwXzExMjsKKyAgICBnb3RvIGV4OworCitub19zdXNwOjsKKyAgICBkcHJpbnRmKCJzdXNwX3JyLmM6IE5vIFNVU1Agc2lnbmF0dXJlIGRldGVjdGVkXG4iKTsKKyAgICByZXQgPSAwOworICAgIGdvdG8gZXg7CisKK25vX3JyOjsKKyAgICBkcHJpbnRmKCJzdXNwX3JyLmM6IE5vIFJvY2sgUmlkZ2Ugc2lnbmF0dXJlIGRldGVjdGVkXG4iKTsKKyAgICByZXQgPSAwOworCitleDo7CisgICAgaWYgKHJldCA8PSAwKQorCXNiaS0+ZG9fcnIgPSAwOworICAgIGlmIChkYXRhICE9IE5VTEwpCisJZnJlZShkYXRhKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9pc285NjYwL3N1c3BfcnIuaCBiL2NvcmUvZnMvaXNvOTY2MC9zdXNwX3JyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3MzJkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvaXNvOTY2MC9zdXNwX3JyLmgKQEAgLTAsMCArMSw4NCBAQAorI2lmbmRlZiBJU085NjYwX1NVU1BfSAorI2RlZmluZSBJU085NjYwX1NVU1BfSCAxCisKKy8qIFB1YmxpYyBmdW5jdGlvbnMgb2Ygc3VzcF9yci5jLCBhIHJlYWRlciBmb3IgU1VTUCBhbmQgUm9jayBSaWRnZSBpbmZvcm1hdGlvbi4KKyovCisKKy8qICBJbnNwZWN0IHRoZSBJU08gOTY2MCBmaWxlc3lzdGVtIHdoZXRoZXIgaXQgYmVhcnMgdGhlIHNpZ25hdHVyZXMgb2YKKyAgICBTVVNQIGFuZCBSb2NrIFJpZGdlLgorICAgIFNldCB0aGUgcGFyYW1ldGVycyBmcy0+ZnNfaW5mby0+ZG9fcnIgYW5kIGZzLT5mc19pbmZvLT5zdXNwX3NraXAuCisgICAgVG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQgb2YgaXNvX2ZzX2luaXQoKS4KKworICAgIFNVU1AgZGVtYW5kcyBhbiBTUCBlbnRyeSBhcyBmaXJzdCBlbnRyeSBpbiB0aGUgU3lzdGVtIFVzZSBhcmVhIG9mCisgICAgdGhlIGZpcnN0IGRpcmVjdG9yeSByZWNvcmQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LgorICAgIFJvY2sgUmlkZ2UgcHJlc2NyaWJlcyBhdCB0aGUgc2FtZSBkaXJlY3RvcnkgcmVjb3JkIGFuIEVSIGVudHJ5IHdpdGgKKyAgICBpZCBmaWVsZCBjb250ZW50ICJSUklQXzE5OTFBIiwgb3IgIklFRUVfUDEyODIiLCBvciAiSUVFRV8xMjgyIi4KKworICAgIEBwYXJhbSBmcyAgICAgICBUaGUgZmlsZXN5c3RlbSB0byBpbnNwZWN0CisgICAgQHBhcmFtIGZsYWcgICAgIEJpdGZpZWxkIGZvciBjb250cm9sIHB1cnBvc2VzOgorICAgICAgICAgICAgICAgICAgICBiaXQwPSBEZW1hbmQgYSBSb2NrIFJpZGdlIEVSIGVudHJ5CisgICAgQHJldHVybiAgICAgICAgIDAgTm8gdmFsaWQgU1VTUCBzaWduYXR1cmUgZm91bmQuCisgICAgICAgICAgICAgICAgICAgIDEgWWVzLCBzaWduYXR1cmUgb2YgU1VTUCBmb3VuZC4gTm8gRVIgd2FzIGRlbWFuZGVkLgorICAgICAgICAgICAgICAgICAgICAyIEVSIG9mIFJSSVAgMS4xMCBmb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgMyBFUiBvZiBSUklQIDEuMTIgZm91bmQuCisqLworaW50IHN1c3BfcnJfY2hlY2tfc2lnbmF0dXJlcyhzdHJ1Y3QgZnNfaW5mbyAqZnMsIGludCBmbGFnKTsKKworCisvKiAgT2J0YWluIHRoZSBwYXlsb2FkIGJ5dGVzIG9mIGFsbCBTVVNQIGVudHJpZXMgd2l0aCB0aGUgZ2l2ZW4gc2lnbmF0dXJlLgorCisgICAgQHBhcmFtIGZzICAgICAgIFRoZSBmaWxlc3lzdGVtIGZyb20gd2hpY2ggdG8gcmVhZCBDRSBibG9ja3MuCisgICAgICAgICAgICAgICAgICAgIGZzLT5mc19pbmZvLT5kb19yciBtdXN0IGJlIG5vbi16ZXJvIG9yIGVsc2UgdGhpcyBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICB3aWxsIGFsd2F5cyByZXR1cm4gMCAoaS5lLiBubyBwYXlsb2FkIGZvdW5kKS4KKyAgICBAcGFyYW0gZGlyX3JlYyAgTWVtb3J5IGNvbnRhaW5pbmcgdGhlIHdob2xlIElTTyA5NjYwIGRpcmVjdG9yeSByZWNvcmQuCisgICAgQHBhcmFtIHNpZyAgICAgIFR3byBjaGFyYWN0ZXJzIG9mIFNVU1Agc2lnbmF0dXJlLiBFLmcuICJOTSIsICJFUiIsIC4uLgorICAgIEBwYXJhbSBkYXRhICAgICBSZXR1cm5zIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCB0aGUgcGF5bG9hZC4KKyAgICAgICAgICAgICAgICAgICAgQSB0cmFpbGluZyAwLWJ5dGUgaXMgYWRkZWQgZm9yIGNvbnZlbmllbmNlIHdpdGggc3RyaW5ncy4KKyAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSBpcyByZXR1cm5lZCAhPSBOVUxMLCB0aGVuIGl0IGhhcyB0byBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBieSBmcmVlKCkgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorICAgIEBwYXJhbSBsZW5fZGF0YSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gKmRhdGEuCisgICAgICAgICAgICAgICAgICAgIE5vdCBpbmNsdWRlZCBpbiB0aGlzIGNvdW50IGlzIHRoZSBjb252ZW5pZW5jZSAwLWJ5dGUuCisgICAgQHBhcmFtIGZsYWcgICAgIEJpdGZpZWxkIGZvciBjb250cm9sIHB1cnBvc2VzOgorICAgICAgICAgICAgICAgICAgICBiaXQwPSBOTS9TTCBtb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwIDUgaGVhZGVyIGJ5dGVzIHJhdGhlciB0aGFuIDQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBhZnRlciBmaXJzdCBtYXRjaGluZyBlbnRyeSB3aXRob3V0IENPTlRJTlVFIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuIDB4MTAwIHwgYnl0ZVs0XSAoRkxBR1MpIG9mIGZpcnN0IGVudHJ5LgorICAgIEByZXR1cm4gICAgICAgICA+MCBTdWNjZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSBhbmQgKmxlbl9kYXRhIGFyZSB2YWxpZC4KKyAgICAgICAgICAgICAgICAgICAgICAgT25seSBpbiB0aGlzIGNhc2UsICpkYXRhIGlzIHJldHVybmVkICE9IE5VTEwuCisgICAgICAgICAgICAgICAgICAgIDAgIERlc2lyZWQgc2lnbmF0dXJlIG5vdCBmb3VuZC4KKyAgICAgICAgICAgICAgICAgICAtMSAgRXJyb3IuCisgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBJU08gOTY2MCBvciBTVVNQIGRhdGEgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIGltYWdlLgorKi8KK2ludCBzdXNwX3JyX2dldF9lbnRyaWVzKHN0cnVjdCBmc19pbmZvICpmcywgY2hhciAqZGlyX3JlYywgY2hhciAqc2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmRhdGEsIGludCAqbGVuX2RhdGEsIGludCBmbGFnKTsKKworCisvKiAgT2J0YWluIHRoZSBSb2NrIFJpZGdlIG5hbWUgb2YgYSBkaXJlY3RvcnkgcmVjb3JkLgorICAgIElmIHRoZSBmb3VuZCBjb250ZW50IG9mIE5NIGVudHJpZXMgaXMgbG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMsCisgICAgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybiBpdCwgYnV0IHJhdGhlciBpbmRpY2F0ZSBhbiBlcnJvci4KKworICAgIEBwYXJhbSBmcyAgICAgICBUaGUgZmlsZXN5c3RlbSBmcm9tIHdoaWNoIHRvIHJlYWQgQ0UgYmxvY2tzLgorICAgICAgICAgICAgICAgICAgICBmcy0+ZnNfaW5mby0+ZG9fcnIgbXVzdCBiZSBub24temVybyBvciBlbHNlIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgd2lsbCBhbHdheXMgcmV0dXJuIDAgKGkuZS4gbm8gUm9jayBSaWRnZSBuYW1lIGZvdW5kKS4KKyAgICBAcGFyYW0gZGlyX3JlYyAgTWVtb3J5IGNvbnRhaW5pbmcgdGhlIHdob2xlIElTTyA5NjYwIGRpcmVjdG9yeSByZWNvcmQuCisgICAgQHBhcmFtIG5hbWUgICAgIFJldHVybnMgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIHRoZSBuYW1lIGFuZCBhIHRyYWlsaW5nCisgICAgICAgICAgICAgICAgICAgIDAtYnl0ZS4gbmFtZSBtaWdodCBjb250YWluIGFueSBieXRlIHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgICAgSWYgbmFtZSBpcyByZXR1cm5lZCAhPSBOVUxMLCB0aGVuIGl0IGhhcyB0byBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBieSBmcmVlKCkgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorICAgIEBwYXJhbSBsZW5fbmFtZSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gKm5hbWUuCisgICAgICAgICAgICAgICAgICAgIE5vdCBpbmNsdWRlZCBpbiB0aGlzIGNvdW50IGlzIHRoZSAwLWJ5dGUgYWZ0ZXIgdGhlIG5hbWUuCisgICAgQHJldHVybiAgICAgICAgID4wIFN1Y2Nlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICpuYW1lIGFuZCAqbGVuX25hbWUgYXJlIHZhbGlkLgorICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGluIHRoaXMgY2FzZSwgKmRhdGEgaXMgcmV0dXJuZWQgIT0gTlVMTC4KKyAgICAgICAgICAgICAgICAgICAgMCAgTm8gTk0gZW50cnkgZm91bmQuIE5vIFJvY2sgUmlkZ2UgbmFtZSBkZWZpbmVkLgorICAgICAgICAgICAgICAgICAgIC0xICBFcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIElTTyA5NjYwIG9yIFNVU1AgZGF0YSBpbgorICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW1hZ2UuCisqLworaW50IHN1c3BfcnJfZ2V0X25tKHN0cnVjdCBmc19pbmZvICpmcywgY2hhciAqZGlyX3JlYywKKyAgICAgICAgICAgICAgICAgICBjaGFyICoqbmFtZSwgaW50ICpsZW5fbmFtZSk7CisKKworI2VuZGlmIC8qICEgSVNPOTY2MF9TVVNQX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvZnMvbGliL2NoZGlyLmMgYi9jb3JlL2ZzL2xpYi9jaGRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNTI4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL2xpYi9jaGRpci5jCkBAIC0wLDAgKzEsNyBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKworaW50IGdlbmVyaWNfY2hkaXJfc3RhcnQodm9pZCkKK3sKKwlyZXR1cm4gY2hkaXIoQ3VycmVudERpck5hbWUpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9saWIvY2xvc2UuYyBiL2NvcmUvZnMvbGliL2Nsb3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5NTk4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvbGliL2Nsb3NlLmMKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSAiZnMuaCIKKwordm9pZCBnZW5lcmljX2Nsb3NlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgaWYgKGZpbGUtPmlub2RlKSB7CisJZmlsZS0+b2Zmc2V0ID0gMDsKKwlwdXRfaW5vZGUoZmlsZS0+aW5vZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMvbGliL2xvYWRjb25maWcuYyBiL2NvcmUvZnMvbGliL2xvYWRjb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWU2ZjNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9saWIvbG9hZGNvbmZpZy5jCkBAIC0wLDAgKzEsMzQgQEAKKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSA8ZnMuaD4KKworLyoKKyAqIFN0YW5kYXJkIHZlcnNpb24gb2YgbG9hZF9jb25maWcgZm9yIGV4dGxpbnV4L3N5c2xpbnV4IGZpbGVzeXN0ZW1zLgorICoKKyAqIFRoaXMgc2VhcmNoZXMgZm9yIGV4dGxpbnV4LmNvbmYgYW5kIHN5c2xpbnV4LmNmZyBpbiB0aGUgaW5zdGFsbAorICogZGlyZWN0b3J5LCBmb2xsb3dlZCBieSBhIHNldCBvZiBmYWxsYmFjayBkaXJlY3Rvcmllcy4gIElmIGZvdW5kLAorICogc2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIG1hdGNoLgorICovCitpbnQgZ2VuZXJpY19vcGVuX2NvbmZpZyhzdHJ1Y3QgY29tMzJfZmlsZWRhdGEgKmZpbGVkYXRhKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzZWFyY2hfZGlyZWN0b3JpZXNbXSA9IHsKKwlOVUxMLAkJCS8qIEN1cnJlbnREaXJOYW1lICovCisJIi9ib290L3N5c2xpbnV4IiwKKwkiL3N5c2xpbnV4IiwKKwkiLyIsCisJTlVMTAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVuYW1lc1tdID0geworCSJleHRsaW51eC5jb25mIiwKKwkic3lzbGludXguY2ZnIiwKKwlOVUxMCisgICAgfTsKKworICAgIHNlYXJjaF9kaXJlY3Rvcmllc1swXSA9IEN1cnJlbnREaXJOYW1lOworCisgICAgZHByaW50ZigiQ3VycmVudERpck5hbWU6IFwiJXNcIlxuIiwgQ3VycmVudERpck5hbWUpOworCisgICAgcmV0dXJuIHNlYXJjaF9kaXJzKGZpbGVkYXRhLCBzZWFyY2hfZGlyZWN0b3JpZXMsIGZpbGVuYW1lcywgQ29uZmlnTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL2xpYi9tYW5nbGUuYyBiL2NvcmUvZnMvbGliL21hbmdsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjA3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL2xpYi9tYW5nbGUuYwpAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqIG1hbmdsZV9uYW1lOgorICoKKyAqIE1hbmdsZSBhIGZpbGVuYW1lIHBvaW50ZWQgdG8gYnkgc3JjIGludG8gYSBidWZmZXIgcG9pbnRlZAorICogdG8gYnkgZHN0OyBlbmRzIG9uIGVuY291bnRlcmluZyBhbnkgd2hpdGVzcGFjZS4KKyAqIGRzdCBpcyBwcmVzZXJ2ZWQuCisgKgorICogVGhpcyB2ZXJpZmllcyB0aGF0IGEgZmlsZW5hbWUgaXMgPCBGSUxFTkFNRV9NQVggY2hhcmFjdGVycywKKyAqIGRvZXNuJ3QgY29udGFpbiB3aGl0ZXNwYWNlLCB6ZXJvLXBhZHMgdGhlIG91dHB1dCBidWZmZXIsCisgKiBhbmQgcmVtb3ZlcyByZWR1bmRhbnQgc2xhc2hlcy4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImZzLmgiCisKK3ZvaWQgZ2VuZXJpY19tYW5nbGVfbmFtZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICBjaGFyICpwID0gZHN0OworICAgIGludCBpID0gRklMRU5BTUVfTUFYLTE7CisKKyAgICB3aGlsZSAobm90X3doaXRlc3BhY2UoKnNyYykpIHsKKyAgICAgICAgaWYgKCpzcmMgPT0gJy8nKSB7CisgICAgICAgICAgICBpZiAoc3JjWzFdID09ICcvJykgeworICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpLS07CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZHN0ID09IHApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGRzdFstMV0gIT0gJy8nKQorICAgICAgICAgICAgYnJlYWs7CisJaWYgKChkc3RbLTFdID09ICcvJykgJiYgKChkc3QgLSAxKSA9PSBwKSkKKwkgICAgYnJlYWs7CisKKyAgICAgICAgZHN0LS07CisgICAgICAgIGkrKzsKKyAgICB9CisKKyAgICBpKys7CisgICAgZm9yICg7IGkgPiAwOyBpIC0tKQorICAgICAgICAqZHN0KysgPSAnXDAnOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9saWIvc2VhcmNoY29uZmlnLmMgYi9jb3JlL2ZzL2xpYi9zZWFyY2hjb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFkYWJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9saWIvc2VhcmNoY29uZmlnLmMKQEAgLTAsMCArMSw0MiBAQAorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGZzLmg+CisKK19fZXhwb3J0IGNoYXIgQ29uZmlnTmFtZVtGSUxFTkFNRV9NQVhdOworX19leHBvcnQgY2hhciBjb25maWdfY3dkW0ZJTEVOQU1FX01BWF07CisKKy8qCisgKiBUaGlzIHNlYXJjaGVzIGZvciBhIHNwZWNpZmllZCBzZXQgb2YgZmlsZW5hbWVzIGluIGEgc3BlY2lmaWVkIHNldAorICogb2YgZGlyZWN0b3JpZXMuICBJZiBmb3VuZCwgc2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvCisgKiBtYXRjaC4KKyAqLworaW50IHNlYXJjaF9kaXJzKHN0cnVjdCBjb20zMl9maWxlZGF0YSAqZmlsZWRhdGEsCisJCWNvbnN0IGNoYXIgKnNlYXJjaF9kaXJlY3Rvcmllc1tdLAorCQljb25zdCBjaGFyICpmaWxlbmFtZXNbXSwKKwkJY2hhciAqcmVhbG5hbWUpCit7CisgICAgY2hhciBuYW1lYnVmW0ZJTEVOQU1FX01BWF07CisgICAgY29uc3QgY2hhciAqc2QsICoqc2RwOworICAgIGNvbnN0IGNoYXIgKnNmLCAqKnNmcDsKKworICAgIGZvciAoc2RwID0gc2VhcmNoX2RpcmVjdG9yaWVzOyAoc2QgPSAqc2RwKTsgc2RwKyspIHsKKwlmb3IgKHNmcCA9IGZpbGVuYW1lczsgKHNmID0gKnNmcCk7IHNmcCsrKSB7CisJICAgIHNucHJpbnRmKG5hbWVidWYsIHNpemVvZiBuYW1lYnVmLAorCQkgICAgICIlcyVzJXMiLAorCQkgICAgIHNkLCAoKnNkICYmIHNkW3N0cmxlbihzZCktMV0gPT0gJy8nKSA/ICIiIDogIi8iLAorCQkgICAgIHNmKTsKKwkgICAgaWYgKHJlYWxwYXRoKHJlYWxuYW1lLCBuYW1lYnVmLCBGSUxFTkFNRV9NQVgpID09IChzaXplX3QpLTEpCisJCWNvbnRpbnVlOworCSAgICBkcHJpbnRmKCJDb25maWcgc2VhcmNoOiAlc1xuIiwgcmVhbG5hbWUpOworCSAgICBpZiAob3Blbl9maWxlKHJlYWxuYW1lLCBPX1JET05MWSwgZmlsZWRhdGEpID49IDApIHsKKwkJY2hkaXIoc2QpOworCQlyZXR1cm4gMDsJLyogR290IGl0ICovCisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9ub25leHRleHRlbnQuYyBiL2NvcmUvZnMvbm9uZXh0ZXh0ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxY2UyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvbm9uZXh0ZXh0ZW50LmMKQEAgLTAsMCArMSwxMyBAQAorI2luY2x1ZGUgImZzLmgiCisKKy8qCisgKiBVc2UgdGhpcyByb3V0aW5lIGZvciB0aGUgbmV4dF9leHRlbnQoKSBwb2ludGVyIHdoZW4gd2UgbmV2ZXIgc2hvdWxkCisgKiBiZSBjYWxsaW5nIG5leHRfZXh0ZW50KCksIGUuZy4gaXNvOTY2MC4KKyAqLworaW50IG5vX25leHRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVpbnQzMl90IGxzdGFydCkKK3sKKyAgICAodm9pZClpbm9kZTsKKyAgICAodm9pZClsc3RhcnQ7CisKKyAgICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL250ZnMvbnRmcy5jIGIvY29yZS9mcy9udGZzL250ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzBhMDljCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9udGZzL250ZnMuYwpAQCAtMCwwICsxLDEzNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBQYXVsbyBBbGNhbnRhcmEgPHBjYWNqckBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKy8qIE5vdGU6IE5vIHN1cHBvcnQgZm9yIGNvbXByZXNzZWQgZmlsZXMgKi8KKworI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9kaXJlbnQuaD4KKyNpbmNsdWRlIDxjYWNoZS5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxkaXNrLmg+CisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxpbG9nMi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImNvZGVwYWdlLmgiCisjaW5jbHVkZSAibnRmcy5oIgorI2luY2x1ZGUgInJ1bmxpc3QuaCIKKworc3RhdGljIHN0cnVjdCBudGZzX3JlYWRkaXJfc3RhdGUgKnJlYWRkaXJfc3RhdGU7CisKKy8qKiogRnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgZl9tZnRfcmVjb3JkX2xvb2t1cCBudGZzX21mdF9yZWNvcmRfbG9va3VwXzNfMDsKK3N0YXRpYyBmX21mdF9yZWNvcmRfbG9va3VwIG50ZnNfbWZ0X3JlY29yZF9sb29rdXBfM18xOworc3RhdGljIGlubGluZSBlbnVtIGRpcmVudF90eXBlIGdldF9pbm9kZV9tb2RlKHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKm1yZWMpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgbnRmc19hdHRyX3JlY29yZCAqIG50ZnNfYXR0cl9sb29rdXAoc3RydWN0IGZzX2luZm8gKmZzLCB1aW50MzJfdCB0eXBlLCBzdHJ1Y3QgbnRmc19tZnRfcmVjb3JkICoqbW1yZWMsIHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKm1yZWMpOworc3RhdGljIGlubGluZSB1aW50OF90ICptYXBwaW5nX2NodW5rX2luaXQoc3RydWN0IG50ZnNfYXR0cl9yZWNvcmQgKmF0dHIsc3RydWN0IG1hcHBpbmdfY2h1bmsgKmNodW5rLHVpbnQzMl90ICpvZmZzZXQpOworc3RhdGljIGludCBwYXJzZV9kYXRhX3J1bihjb25zdCB2b2lkICpzdHJlYW0sIHVpbnQzMl90ICpvZmZzZXQsIHVpbnQ4X3QgKmF0dHJfbGVuLCBzdHJ1Y3QgbWFwcGluZ19jaHVuayAqY2h1bmspOworCisvKioqIEZ1bmN0aW9uIGRlZmluaXRpb25zICovCisKKy8qIENoZWNrIGlmIHRoZXJlIGFyZSBzcGVjaWZpYyB6ZXJvIGZpZWxkcyBpbiBhbiBOVEZTIGJvb3Qgc2VjdG9yICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX2NoZWNrX3plcm9fZmllbGRzKGNvbnN0IHN0cnVjdCBudGZzX2JwYiAqc2IpCit7CisgICAgcmV0dXJuICFzYi0+cmVzX3NlY3RvcnMgJiYgKCFzYi0+emVyb18wWzBdICYmICFzYi0+emVyb18wWzFdICYmCisgICAgICAgICAgICAhc2ItPnplcm9fMFsyXSkgJiYgIXNiLT56ZXJvXzEgJiYgIXNiLT56ZXJvXzIgJiYKKyAgICAgICAgICAgICFzYi0+emVyb18zOworfQorCitzdGF0aWMgaW5saW5lIGludCBudGZzX2NoZWNrX3NiX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgbnRmc19icGIgKnNiKQoreworICAgIHJldHVybiBudGZzX2NoZWNrX3plcm9fZmllbGRzKHNiKSAmJgorICAgICAgICAgICAgKCFtZW1jbXAoc2ItPm9lbV9uYW1lLCAiTlRGUyAgICAiLCA4KSB8fAorICAgICAgICAgICAgICFtZW1jbXAoc2ItPm9lbV9uYW1lLCAiTVNXSU40LjAiLCA4KSB8fAorICAgICAgICAgICAgICFtZW1jbXAoc2ItPm9lbV9uYW1lLCAiTVNXSU40LjEiLCA4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICpuZXdfbnRmc19pbm9kZShzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZTsKKworICAgIGlub2RlID0gYWxsb2NfaW5vZGUoZnMsIDAsIHNpemVvZihzdHJ1Y3QgbnRmc19pbm9kZSkpOworICAgIGlmICghaW5vZGUpCisgICAgICAgIG1hbGxvY19lcnJvcigiaW5vZGUgc3RydWN0dXJlIik7CisKKyAgICByZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIG50ZnNfZml4dXBzX3dyaXRlYmFjayhzdHJ1Y3QgZnNfaW5mbyAqZnMsIHN0cnVjdCBudGZzX3JlY29yZCAqbnJlYykKK3sKKyAgICB1aW50MTZfdCAqdXNhOworICAgIHVpbnQxNl90IHVzYV9ubzsKKyAgICB1aW50MTZfdCB1c2FfY291bnQ7CisgICAgdWludDE2X3QgKmJsazsKKworICAgIGRwcmludGYoImluICVzKClcbiIsIF9fZnVuY19fKTsKKworICAgIGlmIChucmVjLT5tYWdpYyAhPSBOVEZTX01BR0lDX0ZJTEUgJiYgbnJlYy0+bWFnaWMgIT0gTlRGU19NQUdJQ19JTkRYKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBnZXQgdGhlIFVwZGF0ZSBTZXF1ZW5jZSBBcnJheSBvZmZzZXQgKi8KKyAgICB1c2EgPSAodWludDE2X3QgKikoKHVpbnQ4X3QgKilucmVjICsgbnJlYy0+dXNhX29mcyk7CisgICAgLyogZ2V0IHRoZSBVcGRhdGUgU2VxdWVuY2UgQXJyYXkgTnVtYmVyIGFuZCBza2lwIGl0ICovCisgICAgdXNhX25vID0gKnVzYSsrOworICAgIC8qIGdldCB0aGUgVXBkYXRlIFNlcXVlbmUgQXJyYXkgY291bnQgKi8KKyAgICB1c2FfY291bnQgPSBucmVjLT51c2FfY291bnQgLSAxOyAgICAvKiBleGNsdWRlIHRoZSBVU0EgbnVtYmVyICovCisgICAgLyogbWFrZSBpdCB0byBwb2ludCB0byB0aGUgbGFzdCB0d28gYnl0ZXMgb2YgdGhlIFJFQ09SRCdzIGZpcnN0IHNlY3RvciAqLworICAgIGJsayA9ICh1aW50MTZfdCAqKSgodWludDhfdCAqKW5yZWMgKyBTRUNUT1JfU0laRShmcykgLSAyKTsKKworICAgIHdoaWxlICh1c2FfY291bnQtLSkgeworICAgICAgICBpZiAoKmJsayAhPSB1c2Ffbm8pCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAqYmxrID0gKnVzYSsrOworICAgICAgICBibGsgPSAodWludDE2X3QgKikoKHVpbnQ4X3QgKilibGsgKyBTRUNUT1JfU0laRShmcykpOworICAgIH0KK30KKworLyogcmVhZCBjb250ZW50IGZyb20gY2FjaGUgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkKHN0cnVjdCBmc19pbmZvICpmcywgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCB1aW50NjRfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfdCAqYmxrLCB1aW50NjRfdCAqYmxrX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKmJsa19uZXh0X29mZnNldCwgdWludDY0X3QgKmxjbikKK3sKKyAgICB1aW50OF90ICpkYXRhOworICAgIHVpbnQ2NF90IG9mZnNldCA9ICpibGtfb2Zmc2V0OworICAgIGNvbnN0IHVpbnQzMl90IGNsdXN0X2J5dGVfc2hpZnQgPSBOVEZTX1NCKGZzKS0+Y2x1c3RfYnl0ZV9zaGlmdDsKKyAgICBjb25zdCB1aW50NjRfdCBibGtfc2l6ZSA9IFVJTlQ2NF9DKDEpIDw8IEJMT0NLX1NISUZUKGZzKTsKKyAgICB1aW50NjRfdCBieXRlczsKKyAgICB1aW50NjRfdCBsYnl0ZXM7CisgICAgdWludDY0X3QgbG9mZnNldDsKKyAgICB1aW50NjRfdCBrOworCisgICAgZHByaW50ZigiaW4gJXMoKVxuIiwgX19mdW5jX18pOworCisgICAgaWYgKGNvdW50ID4gbGVuKQorICAgICAgICBnb3RvIG91dDsKKworICAgIGRhdGEgPSAodWludDhfdCAqKWdldF9jYWNoZShmcy0+ZnNfZGV2LCAqYmxrKTsKKyAgICBpZiAoIWRhdGEpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgaWYgKCFvZmZzZXQpCisgICAgICAgIG9mZnNldCA9ICgqbGNuIDw8IGNsdXN0X2J5dGVfc2hpZnQpICUgYmxrX3NpemU7CisKKyAgICBkcHJpbnRmKCJMQ046ICAgICAgICAgICAgMHglWFxuIiwgKmxjbik7CisgICAgZHByaW50Zigib2Zmc2V0OiAgICAgICAgIDB4JVhcbiIsIG9mZnNldCk7CisKKyAgICBieXRlcyA9IGNvdW50OyAgICAgICAgICAgICAgLyogYnl0ZXMgdG8gY29weSAqLworICAgIGxieXRlcyA9IGJsa19zaXplIC0gb2Zmc2V0OyAvKiBieXRlcyBsZWZ0IHRvIGNvcHkgKi8KKyAgICBpZiAobGJ5dGVzID49IGJ5dGVzKSB7CisgICAgICAgIC8qIHNvIHRoZXJlJ3Mgcm9vbSBlbm91Z2gsIHRoZW4gY29weSB0aGUgd2hvbGUgY29udGVudCAqLworICAgICAgICBtZW1jcHkoYnVmLCBkYXRhICsgb2Zmc2V0LCBieXRlcyk7CisgICAgICAgIGxvZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG9mZnNldCArPSBjb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKCJieXRlczogICAgICAgICAgICAgJXVcbiIsIGJ5dGVzKTsKKyAgICAgICAgZHByaW50ZigiYnl0ZXMgbGVmdDogICAgICAgICV1XG4iLCBsYnl0ZXMpOworICAgICAgICAvKiBvdGhlcndpc2UsIGxldCdzIGNvcHkgaXQgcGFydGlhbGx5Li4uICovCisgICAgICAgIGsgPSAwOworICAgICAgICB3aGlsZSAoYnl0ZXMpIHsKKyAgICAgICAgICAgIG1lbWNweShidWYgKyBrLCBkYXRhICsgb2Zmc2V0LCBsYnl0ZXMpOworICAgICAgICAgICAgYnl0ZXMgLT0gbGJ5dGVzOworICAgICAgICAgICAgbG9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgIG9mZnNldCArPSBsYnl0ZXM7CisgICAgICAgICAgICBrICs9IGxieXRlczsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gYmxrX3NpemUpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGVuIGZldGNoIGEgbmV3IEZTIGJsb2NrICovCisgICAgICAgICAgICAgICAgZGF0YSA9ICh1aW50OF90ICopZ2V0X2NhY2hlKGZzLT5mc19kZXYsICsrKmJsayk7CisgICAgICAgICAgICAgICAgaWYgKCFkYXRhKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICAgICAgIGxieXRlcyA9IGJ5dGVzOworICAgICAgICAgICAgICAgIGxvZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsb2Zmc2V0ID49IGJsa19zaXplKQorICAgICAgICBsb2Zmc2V0ID0gMDsgICAgLyogaXQgbXVzdCBiZSBhbGlnbmVkIG9uIGEgYmxvY2sgYm91bmRhcnkgKi8KKworICAgICpibGtfb2Zmc2V0ID0gbG9mZnNldDsKKworICAgIGlmIChibGtfbmV4dF9vZmZzZXQpCisgICAgICAgICpibGtfbmV4dF9vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAqbGNuICs9IGJsa19zaXplIC8gY291bnQ7ICAgLyogdXBkYXRlIExDTiAqLworCisgICAgcmV0dXJuIDA7CisKK291dDoKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIEFuZHlBbGV4OiByZWFkIGFuZCB2YWxpZGF0ZSBzaW5nbGUgTUZUIHJlY29yZC4gS2VlcCBpbiBtaW5kIHRoYXQgTUZUIGl0c2VsZiBjYW4gYmUgZnJhZ21lbnRlZCAqLworc3RhdGljIHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKm50ZnNfbWZ0X3JlY29yZF9sb29rdXBfYW55KHN0cnVjdCBmc19pbmZvICpmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGUsIGJsb2NrX3QgKm91dF9ibGssIGJvb2wgaXNfdjMxKQoreworICAgIGNvbnN0IHVpbnQ2NF90IG1mdF9yZWNvcmRfc2l6ZSA9IE5URlNfU0IoZnMpLT5tZnRfcmVjb3JkX3NpemU7CisgICAgdWludDhfdCAqYnVmID0gTlVMTDsKKyAgICBjb25zdCB1aW50MzJfdCBtZnRfcmVjb3JkX3NoaWZ0ID0gaWxvZzIobWZ0X3JlY29yZF9zaXplKTsKKyAgICBjb25zdCB1aW50MzJfdCBjbHVzdF9ieXRlX3NoaWZ0ID0gTlRGU19TQihmcyktPmNsdXN0X2J5dGVfc2hpZnQ7CisgICAgdWludDY0X3QgbmV4dF9vZmZzZXQgPSAwOworICAgIHVpbnQ2NF90IGxjbiA9IDA7CisgICAgYmxvY2tfdCBibGsgPSAwOworICAgIHVpbnQ2NF90IG9mZnNldCA9IDA7CisKKyAgICBzdHJ1Y3QgbnRmc19tZnRfcmVjb3JkICptcmVjID0gTlVMTCwgKmxtcmVjID0gTlVMTDsKKyAgICB1aW50NjRfdCBzdGFydF9ibGsgPSAwOworICAgIHN0cnVjdCBudGZzX2F0dHJfcmVjb3JkICphdHRyID0gTlVMTDsKKyAgICB1aW50OF90ICpzdHJlYW0gPSBOVUxMOworICAgIHVpbnQzMl90IGF0dHJfb2Zmc2V0ID0gMDsKKyAgICB1aW50OF90ICphdHRyX2xlbiA9IE5VTEw7CisgICAgc3RydWN0IG1hcHBpbmdfY2h1bmsgY2h1bms7CisKKyAgICBpbnQgZXJyID0gMDsKKworICAgIC8qIGRldGVybWluZSBNRlQgcmVjb3JkJ3MgTENOICovCisgICAgdWludDY0X3QgdmNuID0gKGZpbGUgPDwgbWZ0X3JlY29yZF9zaGlmdCA+PiBjbHVzdF9ieXRlX3NoaWZ0KTsKKyAgICBkcHJpbnRmKCJpbiAlcyglcylcbiIsIF9fZnVuY19fLChpc192MzE/InYzLjEiOiJ2My4wIikpOworICAgIGlmICgwPT12Y24pIHsKKyAgICAgIGxjbiA9IE5URlNfU0IoZnMpLT5tZnRfbGNuOworICAgIH0gZWxzZSBkbyB7CisgICAgICBkcHJpbnRmKCIlczogbG9va2luZyBmb3IgVkNOICV1IGZvciBNRlQgcmVjb3JkICV1XG4iLCBfX2Z1bmNfXywodW5zaWduZWQpdmNuLCh1bnNpZ25lZClmaWxlKTsKKyAgICAgIG1yZWMgPSBOVEZTX1NCKGZzKS0+bWZ0X3JlY29yZF9sb29rdXAoZnMsIDAsICZzdGFydF9ibGspOworICAgICAgaWYgKCFtcmVjKSB7ZHByaW50ZigiJXM6IHJlYWQgTUZUKDApIGZhaWxlZFxuIiwgX19mdW5jX18pOyBicmVhazt9CisgICAgICBsbXJlYyA9IG1yZWM7CisgICAgICBpZiAoZ2V0X2lub2RlX21vZGUobXJlYykgIT0gRFRfUkVHKSB7ZHByaW50ZigiJXM6ICRNRlQgaXMgbm90IGEgZmlsZVxuIiwgX19mdW5jX18pOyBicmVhazt9CisgICAgICBhdHRyID0gbnRmc19hdHRyX2xvb2t1cChmcywgTlRGU19BVF9EQVRBLCAmbXJlYywgbG1yZWMpOworICAgICAgaWYgKCFhdHRyKSB7ZHByaW50ZigiJXM6ICRNRlQgaGF2ZSBubyBkYXRhIGF0dHJcbiIsIF9fZnVuY19fKTsgYnJlYWs7fQorICAgICAgaWYgKCFhdHRyLT5ub25fcmVzaWRlbnQpIHtkcHJpbnRmKCIlczogJE1GVCBkYXRhIGF0dHIgaXMgcmVzaWRlbnRcbiIsIF9fZnVuY19fKTsgYnJlYWs7fQorICAgICAgYXR0cl9sZW4gPSAodWludDhfdCAqKWF0dHIgKyBhdHRyLT5sZW47CisgICAgICBzdHJlYW0gPSBtYXBwaW5nX2NodW5rX2luaXQoYXR0ciwgJmNodW5rLCAmYXR0cl9vZmZzZXQpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgZXJyID0gcGFyc2VfZGF0YV9ydW4oc3RyZWFtLCAmYXR0cl9vZmZzZXQsIGF0dHJfbGVuLCAmY2h1bmspOworICAgICAgICBpZiAoZXJyKSB7ZHByaW50ZigiJXM6ICRNRlQgZGF0YSBydW4gcGFyc2UgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIF9fZnVuY19fLGVycik7IGJyZWFrO30KKyAgICAgICAgaWYgKGNodW5rLmZsYWdzICYgTUFQX1VOQUxMT0NBVEVEKSBjb250aW51ZTsKKyAgICAgICAgaWYgKGNodW5rLmZsYWdzICYgTUFQX0VORCkgYnJlYWs7CisgICAgICAgIGlmIChjaHVuay5mbGFncyAmIE1BUF9BTExPQ0FURUQpIHsKKyAgICAgICAgICBkcHJpbnRmKCIlczogQ2h1bms6IFZDTj0ldSwgTENOPSV1LCBsZW49JXVcbiIsIF9fZnVuY19fLCh1bnNpZ25lZCljaHVuay52Y24sKHVuc2lnbmVkKWNodW5rLmxjbiwodW5zaWduZWQpY2h1bmsubGVuKTsKKyAgICAgICAgICBpZiAoKHZjbj49Y2h1bmsudmNuKSYmKHZjbjxjaHVuay52Y24rY2h1bmsubGVuKSkgeworICAgICAgICAgICAgbGNuPXZjbi1jaHVuay52Y24rY2h1bmsubGNuOworICAgICAgICAgICAgZHByaW50ZigiJXM6IFZDTiAldSBmb3IgTUZUIHJlY29yZCAldSBtYXBzIHRvIGxjbiAldVxuIiwgX19mdW5jX18sKHVuc2lnbmVkKXZjbiwodW5zaWduZWQpZmlsZSwodW5zaWduZWQpbGNuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjaHVuay52Y24gKz0gY2h1bmsubGVuOworICAgICAgICB9CisgICAgICB9CisgICAgfSB3aGlsZShmYWxzZSk7CisgICAgaWYgKG1yZWMhPU5VTEwpIGZyZWUobXJlYyk7CisgICAgbXJlYyA9IE5VTEw7CisgICAgaWYgKDA9PWxjbikgeworICAgICAgZHByaW50ZigiJXM6IHVuYWJsZSB0byBtYXAgVkNOICV1IGZvciBNRlQgcmVjb3JkICV1XG4iLCBfX2Z1bmNfXywodW5zaWduZWQpdmNuLCh1bnNpZ25lZClmaWxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGRldGVybWluZSBNRlQgcmVjb3JkJ3MgYmxvY2sgbnVtYmVyICovCisgICAgYmxrID0gKGxjbiA8PCBjbHVzdF9ieXRlX3NoaWZ0ID4+IEJMT0NLX1NISUZUKGZzKSk7CisgICAgb2Zmc2V0ID0gKGZpbGUgPDwgbWZ0X3JlY29yZF9zaGlmdCkgJSBCTE9DS19TSVpFKGZzKTsKKworICAgIC8qIEFsbG9jYXRlIGJ1ZmZlciAqLworICAgIGJ1ZiA9ICh1aW50OF90ICopbWFsbG9jKG1mdF9yZWNvcmRfc2l6ZSk7CisgICAgaWYgKCFidWYpIHttYWxsb2NfZXJyb3IoInVpbnQ4X3QgKiIpO3JldHVybiAwO30KKworICAgIC8qIFJlYWQgYmxvY2sgKi8KKyAgICBlcnIgPSBudGZzX3JlYWQoZnMsIGJ1ZiwgbWZ0X3JlY29yZF9zaXplLCBtZnRfcmVjb3JkX3NpemUsICZibGssCisgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsICZuZXh0X29mZnNldCwgJmxjbik7CisgICAgaWYgKGVycikgeworICAgICAgZHByaW50ZigiJXM6IGVycm9yIHJlYWQgYmxvY2sgJXUgZnJvbSBjYWNoZVxuIiwgX19mdW5jX18sIGJsayk7CisgICAgICBwcmludGYoIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBjYWNoZS5cbiIpOworICAgICAgZnJlZShidWYpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBmaXh1cHMgYW5kIG1ha2Ugc3RydWN0dXJlIHBvaW50ZXIgKi8KKyAgICBudGZzX2ZpeHVwc193cml0ZWJhY2soZnMsIChzdHJ1Y3QgbnRmc19yZWNvcmQgKilidWYpOworICAgIG1yZWMgPSAoc3RydWN0IG50ZnNfbWZ0X3JlY29yZCAqKWJ1ZjsKKworICAgIC8qIGNoZWNrIGlmIGl0IGhhcyBhIHZhbGlkIG1hZ2ljIG51bWJlciBhbmQgcmVjb3JkIG51bWJlciAqLworICAgIGlmIChtcmVjLT5tYWdpYyAhPSBOVEZTX01BR0lDX0ZJTEUpIG1yZWMgPSBOVUxMOworICAgIGlmIChtcmVjICYmIGlzX3YzMSkgaWYgKG1yZWMtPm1mdF9yZWNvcmRfbm8gIT0gZmlsZSkgbXJlYyA9IE5VTEw7CisgICAgaWYgKG1yZWMhPU5VTEwpIHsKKyAgICAgIGlmIChvdXRfYmxrKSB7CisgICAgICAgICpvdXRfYmxrID0gKGZpbGUgPDwgbWZ0X3JlY29yZF9zaGlmdCA+PiBCTE9DS19TSElGVChmcykpOyAgIC8qIHVwZGF0ZSByZWNvcmQgc3RhcnRpbmcgYmxvY2sgKi8KKyAgICAgIH0KKyAgICAgIHJldHVybiBtcmVjOyAgICAgICAgICAvKiBmb3VuZCBNRlQgcmVjb3JkICovCisgICAgfQorCisgICAgLyogSW52YWxpZCByZWNvcmQgKi8KKyAgICBkcHJpbnRmKCIlczogTUZUIHJlY29yZCAldSBpcyBpbnZhbGlkXG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkKWZpbGUpOworICAgIGZyZWUoYnVmKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKm50ZnNfbWZ0X3JlY29yZF9sb29rdXBfM18wKHN0cnVjdCBmc19pbmZvICpmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGUsIGJsb2NrX3QgKmJsaykKK3sKKyAgICByZXR1cm4gbnRmc19tZnRfcmVjb3JkX2xvb2t1cF9hbnkoZnMsZmlsZSxibGssZmFsc2UpOworfQorCitzdGF0aWMgc3RydWN0IG50ZnNfbWZ0X3JlY29yZCAqbnRmc19tZnRfcmVjb3JkX2xvb2t1cF8zXzEoc3RydWN0IGZzX2luZm8gKmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlsZSwgYmxvY2tfdCAqYmxrKQoreworICAgIHJldHVybiBudGZzX21mdF9yZWNvcmRfbG9va3VwX2FueShmcyxmaWxlLGJsayx0cnVlKTsKK30KKworc3RhdGljIGJvb2wgbnRmc19maWxlbmFtZV9jbXAoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBudGZzX2lkeF9lbnRyeSAqaWUpCit7CisgICAgY29uc3QgdWludDE2X3QgKmVudHJ5X2ZuOworICAgIHVpbnQ4X3QgZW50cnlfZm5fbGVuOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBkcHJpbnRmKCJpbiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBlbnRyeV9mbiA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZTsKKyAgICBlbnRyeV9mbl9sZW4gPSBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuOworCisgICAgaWYgKHN0cmxlbihkbmFtZSkgIT0gZW50cnlfZm5fbGVuKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvKiBEbyBjYXNlLXNlbnNpdGl2ZSBjb21wYXJlcyBmb3IgUG9zaXggZmlsZSBuYW1lcyAqLworICAgIGlmIChpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfdHlwZSA9PSBGSUxFX05BTUVfUE9TSVgpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVudHJ5X2ZuX2xlbjsgaSsrKQorICAgICAgICAgICAgaWYgKGVudHJ5X2ZuW2ldICE9IGRuYW1lW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW50cnlfZm5fbGVuOyBpKyspCisgICAgICAgICAgICBpZiAodG9sb3dlcihlbnRyeV9mbltpXSkgIT0gdG9sb3dlcihkbmFtZVtpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1hcHBpbmdfY2h1bmtfaW5pdChzdHJ1Y3QgbnRmc19hdHRyX3JlY29yZCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWFwcGluZ19jaHVuayAqY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm9mZnNldCkKK3sKKyAgICBtZW1zZXQoY2h1bmssIDAsIHNpemVvZiAqY2h1bmspOworICAgICpvZmZzZXQgPSAwVTsKKworICAgIHJldHVybiAodWludDhfdCAqKWF0dHIgKyBhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldDsKK30KKworLyogUGFyc2UgZGF0YSBydW5zLgorICoKKyAqIHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBwYXJzZV9kYXRhX3J1bihjb25zdCB2b2lkICpzdHJlYW0sIHVpbnQzMl90ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYXR0cl9sZW4sIHN0cnVjdCBtYXBwaW5nX2NodW5rICpjaHVuaykKK3sKKyAgICB1aW50OF90ICpidWY7ICAgLyogUG9pbnRlciB0byB0aGUgemVyby10ZXJtaW5hdGVkIGJ5dGUgc3RyZWFtICovCisgICAgdWludDhfdCBjb3VudDsgIC8qIFRoZSBjb3VudCBieXRlICovCisgICAgdWludDhfdCB2LCBsOyAgIC8qIHYgaXMgdGhlIG51bWJlciBvZiBjaGFuZ2VkIGxvdy1vcmRlciBWQ04gYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAqIGwgaXMgdGhlIG51bWJlciBvZiBjaGFuZ2VkIGxvdy1vcmRlciBMQ04gYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgdWludDhfdCAqYnl0ZTsKKyAgICBjb25zdCBpbnQgYnl0ZV9zaGlmdCA9IDg7CisgICAgaW50IG1hc2s7CisgICAgaW50NjRfdCByZXM7CisKKyAgICAodm9pZClhdHRyX2xlbjsKKworICAgIGRwcmludGYoImluICVzKClcbiIsIF9fZnVuY19fKTsKKworICAgIGNodW5rLT5mbGFncyAmPSB+TUFQX01BU0s7CisKKyAgICBidWYgPSAodWludDhfdCAqKXN0cmVhbSArICpvZmZzZXQ7CisgICAgaWYgKGJ1ZiA+IGF0dHJfbGVuIHx8ICEqYnVmKSB7CisgICAgICAgIGNodW5rLT5mbGFncyB8PSBNQVBfRU5EOyAgICAvKiB3ZSdyZSBkb25lICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghKm9mZnNldCkKKyAgICAgICAgY2h1bmstPmZsYWdzIHw9IE1BUF9TVEFSVDsgIC8qIGluaXRpYWwgY2h1bmsgKi8KKworICAgIGNvdW50ID0gKmJ1ZjsKKyAgICB2ID0gY291bnQgJiAweDBGOworICAgIGwgPSBjb3VudCA+PiA0OworCisgICAgaWYgKHYgPiA4IHx8IGwgPiA4KSAvKiBtb3JlIHRoYW4gOCBieXRlcyA/ICovCisgICAgICAgIGdvdG8gb3V0OworCisgICAgYnl0ZSA9ICh1aW50OF90ICopYnVmICsgdjsKKyAgICBjb3VudCA9IHY7CisKKyAgICByZXMgPSAwTEw7CisgICAgd2hpbGUgKGNvdW50LS0pCisJcmVzID0gKHJlcyA8PCBieXRlX3NoaWZ0KSB8ICpieXRlLS07CisKKyAgICBjaHVuay0+bGVuID0gcmVzOyAgIC8qIGdldCBsZW5ndGggZGF0YSAqLworCisgICAgYnl0ZSA9ICh1aW50OF90ICopYnVmICsgdiArIGw7CisgICAgY291bnQgPSBsOworCisgICAgbWFzayA9IDB4RkZGRkZGRkY7CisgICAgcmVzID0gMExMOworICAgIGlmICgqYnl0ZSAmIDB4ODApCisgICAgICAgIHJlcyB8PSAoaW50NjRfdCltYXNrOyAgIC8qIHNpZ24tZXh0ZW5kIGl0ICovCisKKyAgICB3aGlsZSAoY291bnQtLSkKKyAgICAgICAgcmVzID0gKHJlcyA8PCBieXRlX3NoaWZ0KSB8ICpieXRlLS07CisKKyAgICBjaHVuay0+bGNuICs9IHJlczsKKyAgICAvKiBhcmUgVkNOUyBmcm9tIGN1cl92Y24gdG8gbmV4dF92Y24gLSAxIHVuYWxsb2NhdGVkID8gKi8KKyAgICBpZiAoIWNodW5rLT5sY24pCisgICAgICAgIGNodW5rLT5mbGFncyB8PSBNQVBfVU5BTExPQ0FURUQ7CisgICAgZWxzZQorICAgICAgICBjaHVuay0+ZmxhZ3MgfD0gTUFQX0FMTE9DQVRFRDsKKworICAgICpvZmZzZXQgKz0gdiArIGwgKyAxOworCisgICAgcmV0dXJuIDA7CisKK291dDoKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnRmc19tZnRfcmVjb3JkICoKK250ZnNfYXR0cl9saXN0X2xvb2t1cChzdHJ1Y3QgZnNfaW5mbyAqZnMsIHN0cnVjdCBudGZzX2F0dHJfcmVjb3JkICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKm1yZWMpCit7CisgICAgdWludDhfdCAqYXR0cl9sZW47CisgICAgc3RydWN0IG1hcHBpbmdfY2h1bmsgY2h1bms7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHVpbnQ4X3QgKnN0cmVhbTsKKyAgICBpbnQgZXJyOworICAgIGNvbnN0IHVpbnQ2NF90IGJsa19zaXplID0gVUlOVDY0X0MoMSkgPDwgQkxPQ0tfU0hJRlQoZnMpOworICAgIHVpbnQ4X3QgYnVmW2Jsa19zaXplXTsKKyAgICB1aW50NjRfdCBibGtfb2Zmc2V0OworICAgIGludDY0X3QgdmNuOworICAgIGludDY0X3QgbGNuOworICAgIGludDY0X3QgbGFzdF9sY247CisgICAgYmxvY2tfdCBibGs7CisgICAgc3RydWN0IG50ZnNfYXR0cl9saXN0X2VudHJ5ICphdHRyX2VudHJ5OworICAgIHVpbnQzMl90IGxlbiA9IDA7CisgICAgc3RydWN0IG50ZnNfbWZ0X3JlY29yZCAqcmV0dmFsOworICAgIHVpbnQ2NF90IHN0YXJ0X2JsayA9IDA7CisKKyAgICBkcHJpbnRmKCJpbiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBpZiAoYXR0ci0+bm9uX3Jlc2lkZW50KQorICAgICAgICBnb3RvIGhhbmRsZV9ub25fcmVzaWRlbnRfYXR0cjsKKworICAgIGF0dHJfZW50cnkgPSAoc3RydWN0IG50ZnNfYXR0cl9saXN0X2VudHJ5ICopCisgICAgICAgICgodWludDhfdCAqKWF0dHIgKyBhdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCk7CisgICAgbGVuID0gYXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW47CisgICAgZm9yICg7ICh1aW50OF90ICopYXR0cl9lbnRyeSA8ICh1aW50OF90ICopYXR0ciArIGxlbjsKKyAgICAgICAgIGF0dHJfZW50cnkgPSAoc3RydWN0IG50ZnNfYXR0cl9saXN0X2VudHJ5ICopKCh1aW50OF90ICopYXR0cl9lbnRyeSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX2VudHJ5LT5sZW5ndGgpKSB7CisgICAgICAgIGRwcmludGYoIjwkQVRUUklCVVRFX0xJU1Q+IEF0dHJpYnV0ZSB0eXBlOiAweCVYXG4iLAorICAgICAgICAgICAgICAgIGF0dHJfZW50cnktPnR5cGUpOworICAgICAgICBpZiAoYXR0cl9lbnRyeS0+dHlwZSA9PSB0eXBlKQorICAgICAgICAgICAgZ290byBmb3VuZDsgLyogV2UgZ290IHRoZSBhdHRyaWJ1dGUhIDotKSAqLworICAgIH0KKworICAgIHByaW50ZigiTm8gYXR0cmlidXRlIGZvdW5kLlxuIik7CisgICAgZ290byBvdXQ7CisKK2hhbmRsZV9ub25fcmVzaWRlbnRfYXR0cjoKKyAgICBhdHRyX2xlbiA9ICh1aW50OF90ICopYXR0ciArIGF0dHItPmxlbjsKKyAgICBzdHJlYW0gPSBtYXBwaW5nX2NodW5rX2luaXQoYXR0ciwgJmNodW5rLCAmb2Zmc2V0KTsKKyAgICBkbyB7CisgICAgICAgIGVyciA9IHBhcnNlX2RhdGFfcnVuKHN0cmVhbSwgJm9mZnNldCwgYXR0cl9sZW4sICZjaHVuayk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIHByaW50ZigicGFyc2VfZGF0YV9ydW4oKVxuIik7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaHVuay5mbGFncyAmIE1BUF9VTkFMTE9DQVRFRCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoY2h1bmsuZmxhZ3MgJiBNQVBfRU5EKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjaHVuay5mbGFncyAmIE1BUF9BTExPQ0FURUQpIHsKKyAgICAgICAgICAgIHZjbiA9IDA7CisgICAgICAgICAgICBsY24gPSBjaHVuay5sY247CisgICAgICAgICAgICB3aGlsZSAodmNuIDwgY2h1bmsubGVuKSB7CisgICAgICAgICAgICAgICAgYmxrID0gKGxjbiArIHZjbikgPDwgTlRGU19TQihmcyktPmNsdXN0X2J5dGVfc2hpZnQgPj4KKyAgICAgICAgICAgICAgICAgICAgQkxPQ0tfU0hJRlQoZnMpOworICAgICAgICAgICAgICAgIGJsa19vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIGxhc3RfbGNuID0gbGNuOworICAgICAgICAgICAgICAgIGxjbiArPSB2Y247CisgICAgICAgICAgICAgICAgZXJyID0gbnRmc19yZWFkKGZzLCBidWYsIGJsa19zaXplLCBibGtfc2l6ZSwgJmJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsa19vZmZzZXQsIE5VTEwsICh1aW50NjRfdCAqKSZsY24pOworICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciB3aGlsZSByZWFkaW5nIGZyb20gY2FjaGUuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXR0cl9lbnRyeSA9IChzdHJ1Y3QgbnRmc19hdHRyX2xpc3RfZW50cnkgKikmYnVmOworICAgICAgICAgICAgICAgIGxlbiA9IGF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICBmb3IgKDsgKHVpbnQ4X3QgKilhdHRyX2VudHJ5IDwgKHVpbnQ4X3QgKikmYnVmWzBdICsgbGVuOworICAgICAgICAgICAgICAgICAgICAgYXR0cl9lbnRyeSA9IChzdHJ1Y3QgbnRmc19hdHRyX2xpc3RfZW50cnkgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QgKilhdHRyX2VudHJ5ICsgYXR0cl9lbnRyeS0+bGVuZ3RoKSkgeworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKCI8JEFUVFJJQlVURV9MSVNUPiBBdHRyaWJ1dGUgdHlwZTogMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX2VudHJ5LT50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJfZW50cnktPnR5cGUgPT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmQ7IC8qIFdlIGdvdCB0aGUgYXR0cmlidXRlISA6LSkgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsY24gPSBsYXN0X2xjbjsgLyogcmVzdG9yZSBvcmlnaW5hbCBMQ04gKi8KKyAgICAgICAgICAgICAgICAvKiBnbyB0byB0aGUgbmV4dCBWQ04gKi8KKyAgICAgICAgICAgICAgICB2Y24gKz0gKGJsa19zaXplIC8gKDEgPDwgTlRGU19TQihmcyktPmNsdXN0X2J5dGVfc2hpZnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCEoY2h1bmsuZmxhZ3MgJiBNQVBfRU5EKSk7CisKKyAgICBwcmludGYoIk5vIGF0dHJpYnV0ZSBmb3VuZC5cbiIpOworCitvdXQ6CisgICAgcmV0dXJuIE5VTEw7CisKK2ZvdW5kOgorICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB0aGUgYXR0cmlidXRlIHdlIHdlcmUgbG9va2luZyBmb3IuIE5vdyB3ZQorICAgICAqIHdpbGwgbG9vayBmb3IgdGhlIE1GVCByZWNvcmQgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhpcworICAgICAqIGF0dHJpYnV0ZS4KKyAgICAgKi8KKworICAgIC8qIENoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgdHlwZSB3ZSdyZSBsb29raW5nIGZvciBpcyBpbiB0aGUgc2FtZQorICAgICAqIE1GVCByZWNvcmQuIElmIHNvLCB3ZSBkbyBub3QgbmVlZCB0byBsb29rIGl0IHVwIGFnYWluIC0gcmV0dXJuIGl0LgorICAgICAqLworICAgIGlmIChtcmVjLT5tZnRfcmVjb3JkX25vID09IGF0dHJfZW50cnktPm1mdF9yZWYpCisgICAgICAgIHJldHVybiBtcmVjOworCisgICAgcmV0dmFsID0gTlRGU19TQihmcyktPm1mdF9yZWNvcmRfbG9va3VwKGZzLCBhdHRyX2VudHJ5LT5tZnRfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRfYmxrKTsKKyAgICBpZiAoIXJldHZhbCkgeworICAgICAgICBwcmludGYoIk5vIE1GVCByZWNvcmQgZm91bmQhXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogcmV0dXJuIHRoZSBmb3VuZCBNRlQgcmVjb3JkICovCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBudGZzX2F0dHJfcmVjb3JkICoKK19fbnRmc19hdHRyX2xvb2t1cChzdHJ1Y3QgZnNfaW5mbyAqZnMsIHVpbnQzMl90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IG50ZnNfbWZ0X3JlY29yZCAqKm1yZWMpCit7CisgICAgc3RydWN0IG50ZnNfbWZ0X3JlY29yZCAqX21yZWMgPSAqbXJlYzsKKyAgICBzdHJ1Y3QgbnRmc19hdHRyX3JlY29yZCAqYXR0cjsKKyAgICBzdHJ1Y3QgbnRmc19hdHRyX3JlY29yZCAqYXR0cl9saXN0X2F0dHI7CisKKyAgICBkcHJpbnRmKCJpbiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBpZiAoIV9tcmVjIHx8IHR5cGUgPT0gTlRGU19BVF9FTkQpCisgICAgICAgIGdvdG8gb3V0OworCithZ2FpbjoKKyAgICBhdHRyX2xpc3RfYXR0ciA9IE5VTEw7CisKKyAgICBhdHRyID0gKHN0cnVjdCBudGZzX2F0dHJfcmVjb3JkICopKCh1aW50OF90ICopX21yZWMgKyBfbXJlYy0+YXR0cnNfb2Zmc2V0KTsKKyAgICAvKiB3YWxrIHRocm91Z2ggdGhlIGZpbGUgYXR0cmlidXRlIHJlY29yZHMgKi8KKyAgICBmb3IgKDs7IGF0dHIgPSAoc3RydWN0IG50ZnNfYXR0cl9yZWNvcmQgKikoKHVpbnQ4X3QgKilhdHRyICsgYXR0ci0+bGVuKSkgeworICAgICAgICBpZiAoYXR0ci0+dHlwZSA9PSBOVEZTX0FUX0VORCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChhdHRyLT50eXBlID09IE5URlNfQVRfQVRUUl9MSVNUKSB7CisgICAgICAgICAgICBkcHJpbnRmKCJNRlQgcmVjb3JkICMlbHUgaGFzIGFuICRBVFRSSUJVVEVfTElTVCBhdHRyaWJ1dGUuXG4iLAorICAgICAgICAgICAgICAgICAgICBfbXJlYy0+bWZ0X3JlY29yZF9ubyk7CisgICAgICAgICAgICBhdHRyX2xpc3RfYXR0ciA9IGF0dHI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdHRyLT50eXBlID09IHR5cGUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgcmVjb3JkIGhhcyBhbiAkQVRUUklCVVRFX0xJU1QgYXR0cmlidXRlIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIGl0LCB0aGVuIHdlIG5lZWQgdG8gbG9vayBmb3IgdGhlIHdhbnRlZCBhdHRyaWJ1dGUgaW4KKyAgICAgKiBpdCBhcyB3ZWxsLgorICAgICAqLworICAgIGlmIChhdHRyLT50eXBlID09IE5URlNfQVRfRU5EICYmIGF0dHJfbGlzdF9hdHRyKSB7CisgICAgICAgIHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKnJldHZhbDsKKworICAgICAgICByZXR2YWwgPSBudGZzX2F0dHJfbGlzdF9sb29rdXAoZnMsIGF0dHJfbGlzdF9hdHRyLCB0eXBlLCBfbXJlYyk7CisgICAgICAgIGlmICghcmV0dmFsKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgX21yZWMgPSByZXR2YWw7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgfSBlbHNlIGlmIChhdHRyLT50eXBlID09IE5URlNfQVRfRU5EICYmICFhdHRyX2xpc3RfYXR0cikgeworICAgICAgICBhdHRyID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYXR0cjsKKworb3V0OgorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBudGZzX2F0dHJfcmVjb3JkICoKK250ZnNfYXR0cl9sb29rdXAoc3RydWN0IGZzX2luZm8gKmZzLCB1aW50MzJfdCB0eXBlLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnRmc19tZnRfcmVjb3JkICoqbW1yZWMsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKm1yZWMpCit7CisgICAgc3RydWN0IG50ZnNfbWZ0X3JlY29yZCAqX21yZWMgPSBtcmVjOworICAgIHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKm90aGVyID0gKm1tcmVjOworICAgIHN0cnVjdCBudGZzX2F0dHJfcmVjb3JkICpyZXR2YWwgPSBOVUxMOworCisgICAgaWYgKG1yZWMgPT0gb3RoZXIpCisgICAgICAgIHJldHVybiBfX250ZnNfYXR0cl9sb29rdXAoZnMsIHR5cGUsICZvdGhlcik7CisKKyAgICByZXR2YWwgPSBfX250ZnNfYXR0cl9sb29rdXAoZnMsIHR5cGUsICZfbXJlYyk7CisgICAgaWYgKCFyZXR2YWwpIHsKKyAgICAgICAgX21yZWMgPSBvdGhlcjsKKyAgICAgICAgcmV0dmFsID0gX19udGZzX2F0dHJfbG9va3VwKGZzLCB0eXBlLCAmb3RoZXIpOworICAgICAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgICAgIG90aGVyID0gX21yZWM7CisgICAgfSBlbHNlIGlmIChyZXR2YWwgJiYgKF9tcmVjICE9IG1yZWMpKSB7CisgICAgICAgIG90aGVyID0gX21yZWM7CisgICAgfQorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlubGluZSBlbnVtIGRpcmVudF90eXBlIGdldF9pbm9kZV9tb2RlKHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKm1yZWMpCit7CisgICAgcmV0dXJuIG1yZWMtPmZsYWdzICYgTUZUX1JFQ09SRF9JU19ESVJFQ1RPUlkgPyBEVF9ESVIgOiBEVF9SRUc7Cit9CisKK3N0YXRpYyBpbnQgaW5kZXhfaW5vZGVfc2V0dXAoc3RydWN0IGZzX2luZm8gKmZzLCB1bnNpZ25lZCBsb25nIG1mdF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworICAgIHVpbnQ2NF90IHN0YXJ0X2JsayA9IDA7CisgICAgc3RydWN0IG50ZnNfbWZ0X3JlY29yZCAqbXJlYywgKmxtcmVjOworICAgIHN0cnVjdCBudGZzX2F0dHJfcmVjb3JkICphdHRyOworICAgIGVudW0gZGlyZW50X3R5cGUgZF90eXBlOworICAgIHVpbnQ4X3QgKmF0dHJfbGVuOworICAgIHN0cnVjdCBtYXBwaW5nX2NodW5rIGNodW5rOworICAgIGludCBlcnI7CisgICAgdWludDhfdCAqc3RyZWFtOworICAgIHVpbnQzMl90IG9mZnNldDsKKworICAgIGRwcmludGYoImluICVzKClcbiIsIF9fZnVuY19fKTsKKworICAgIG1yZWMgPSBOVEZTX1NCKGZzKS0+bWZ0X3JlY29yZF9sb29rdXAoZnMsIG1mdF9ubywgJnN0YXJ0X2Jsayk7CisgICAgaWYgKCFtcmVjKSB7CisgICAgICAgIHByaW50ZigiTm8gTUZUIHJlY29yZCBmb3VuZC5cbiIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBsbXJlYyA9IG1yZWM7CisKKyAgICBOVEZTX1BWVChpbm9kZSktPm1mdF9ubyA9IG1mdF9ubzsKKyAgICBOVEZTX1BWVChpbm9kZSktPnNlcV9ubyA9IG1yZWMtPnNlcV9ubzsKKworICAgIE5URlNfUFZUKGlub2RlKS0+c3RhcnRfY2x1c3RlciA9IHN0YXJ0X2JsayA+PiBOVEZTX1NCKGZzKS0+Y2x1c3Rfc2hpZnQ7CisgICAgTlRGU19QVlQoaW5vZGUpLT5oZXJlID0gc3RhcnRfYmxrOworCisgICAgZF90eXBlID0gZ2V0X2lub2RlX21vZGUobXJlYyk7CisgICAgaWYgKGRfdHlwZSA9PSBEVF9ESVIpIHsgICAgLyogZGlyZWN0b3J5IHN0dWZmICovCisgICAgICAgIGRwcmludGYoIkdvdCBhIGRpcmVjdG9yeS5cbiIpOworICAgICAgICBhdHRyID0gbnRmc19hdHRyX2xvb2t1cChmcywgTlRGU19BVF9JTkRFWF9ST09ULCAmbXJlYywgbG1yZWMpOworICAgICAgICBpZiAoIWF0dHIpIHsKKyAgICAgICAgICAgIHByaW50ZigiTm8gYXR0cmlidXRlIGZvdW5kLlxuIik7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIGlmIHdlIGhhdmUgYSBwcmV2aW91cyBhbGxvY2F0ZWQgc3RhdGUgc3RydWN0dXJlICovCisgICAgICAgIGlmIChyZWFkZGlyX3N0YXRlKSB7CisgICAgICAgICAgICBmcmVlKHJlYWRkaXJfc3RhdGUpOworICAgICAgICAgICAgcmVhZGRpcl9zdGF0ZSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKiBhbGxvY2F0ZSBvdXIgc3RhdGUgc3RydWN0dXJlICovCisgICAgICAgIHJlYWRkaXJfc3RhdGUgPSBtYWxsb2Moc2l6ZW9mICpyZWFkZGlyX3N0YXRlKTsKKyAgICAgICAgaWYgKCFyZWFkZGlyX3N0YXRlKQorICAgICAgICAgICAgbWFsbG9jX2Vycm9yKCJudGZzX3JlYWRkaXJfc3RhdGUgc3RydWN0dXJlIik7CisKKyAgICAgICAgcmVhZGRpcl9zdGF0ZS0+bWZ0X25vID0gbWZ0X25vOworICAgICAgICAvKiBvYnZpb3VzbHksIHRoZSBudGZzX3JlYWRkaXIoKSBjYWxsZXIgd2lsbCBzdGFydCBmcm9tIElOREVYIHJvb3QgKi8KKyAgICAgICAgcmVhZGRpcl9zdGF0ZS0+aW5faWR4X3Jvb3QgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoZF90eXBlID09IERUX1JFRykgeyAgICAgICAgLyogZmlsZSBzdHVmZiAqLworICAgICAgICBkcHJpbnRmKCJHb3QgYSBmaWxlLlxuIik7CisgICAgICAgIGF0dHIgPSBudGZzX2F0dHJfbG9va3VwKGZzLCBOVEZTX0FUX0RBVEEsICZtcmVjLCBsbXJlYyk7CisgICAgICAgIGlmICghYXR0cikgeworICAgICAgICAgICAgcHJpbnRmKCJObyBhdHRyaWJ1dGUgZm91bmQuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgTlRGU19QVlQoaW5vZGUpLT5ub25fcmVzaWRlbnQgPSBhdHRyLT5ub25fcmVzaWRlbnQ7CisgICAgICAgIE5URlNfUFZUKGlub2RlKS0+dHlwZSA9IGF0dHItPnR5cGU7CisKKyAgICAgICAgaWYgKCFhdHRyLT5ub25fcmVzaWRlbnQpIHsKKyAgICAgICAgICAgIE5URlNfUFZUKGlub2RlKS0+ZGF0YS5yZXNpZGVudC5vZmZzZXQgPQorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKHVpbnQ4X3QgKilhdHRyICsgYXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpOworICAgICAgICAgICAgaW5vZGUtPnNpemUgPSBhdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF0dHJfbGVuID0gKHVpbnQ4X3QgKilhdHRyICsgYXR0ci0+bGVuOworCisgICAgICAgICAgICBzdHJlYW0gPSBtYXBwaW5nX2NodW5rX2luaXQoYXR0ciwgJmNodW5rLCAmb2Zmc2V0KTsKKyAgICAgICAgICAgIE5URlNfUFZUKGlub2RlKS0+ZGF0YS5ub25fcmVzaWRlbnQucmxpc3QgPSBOVUxMOworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlX2RhdGFfcnVuKHN0cmVhbSwgJm9mZnNldCwgYXR0cl9sZW4sICZjaHVuayk7CisgICAgICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoInBhcnNlX2RhdGFfcnVuKClcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmsuZmxhZ3MgJiBNQVBfVU5BTExPQ0FURUQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChjaHVuay5mbGFncyAmIE1BUF9FTkQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChjaHVuay5mbGFncyAmICBNQVBfQUxMT0NBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGFwcGVuZCBuZXcgcnVuIHRvIHRoZSBydW5saXN0ICovCisgICAgICAgICAgICAgICAgICAgIHJ1bmxpc3RfYXBwZW5kKCZOVEZTX1BWVChpbm9kZSktPmRhdGEubm9uX3Jlc2lkZW50LnJsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBydW5saXN0X2VsZW1lbnQgKikmY2h1bmspOworICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgZm9yIG5leHQgVkNOICovCisgICAgICAgICAgICAgICAgICAgIGNodW5rLnZjbiArPSBjaHVuay5sZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocnVubGlzdF9pc19lbXB0eShOVEZTX1BWVChpbm9kZSktPmRhdGEubm9uX3Jlc2lkZW50LnJsaXN0KSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiTm8gbWFwcGluZyBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlub2RlLT5zaXplID0gYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlub2RlLT5tb2RlID0gZF90eXBlOworCisgICAgZnJlZShtcmVjKTsKKworICAgIHJldHVybiAwOworCitvdXQ6CisgICAgZnJlZShtcmVjKTsKKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqbnRmc19pbmRleF9sb29rdXAoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IGRpci0+ZnM7CisgICAgc3RydWN0IG50ZnNfbWZ0X3JlY29yZCAqbXJlYywgKmxtcmVjOworICAgIGJsb2NrX3QgYmxrOworICAgIHVpbnQ2NF90IGJsa19vZmZzZXQ7CisgICAgc3RydWN0IG50ZnNfYXR0cl9yZWNvcmQgKmF0dHI7CisgICAgc3RydWN0IG50ZnNfaWR4X3Jvb3QgKmlyOworICAgIHN0cnVjdCBudGZzX2lkeF9lbnRyeSAqaWU7CisgICAgY29uc3QgdWludDY0X3QgYmxrX3NpemUgPSBVSU5UNjRfQygxKSA8PCBCTE9DS19TSElGVChmcyk7CisgICAgdWludDhfdCBidWZbYmxrX3NpemVdOworICAgIHN0cnVjdCBudGZzX2lkeF9hbGxvY2F0aW9uICppYmxrOworICAgIGludCBlcnI7CisgICAgdWludDhfdCAqc3RyZWFtOworICAgIHVpbnQ4X3QgKmF0dHJfbGVuOworICAgIHN0cnVjdCBtYXBwaW5nX2NodW5rIGNodW5rOworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICBpbnQ2NF90IHZjbjsKKyAgICBpbnQ2NF90IGxjbjsKKyAgICBpbnQ2NF90IGxhc3RfbGNuOworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKyAgICBkcHJpbnRmKCJpbiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBtcmVjID0gTlRGU19TQihmcyktPm1mdF9yZWNvcmRfbG9va3VwKGZzLCBOVEZTX1BWVChkaXIpLT5tZnRfbm8sIE5VTEwpOworICAgIGlmICghbXJlYykgeworICAgICAgICBwcmludGYoIk5vIE1GVCByZWNvcmQgZm91bmQuXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgbG1yZWMgPSBtcmVjOworICAgIGF0dHIgPSBudGZzX2F0dHJfbG9va3VwKGZzLCBOVEZTX0FUX0lOREVYX1JPT1QsICZtcmVjLCBsbXJlYyk7CisgICAgaWYgKCFhdHRyKSB7CisgICAgICAgIHByaW50ZigiTm8gYXR0cmlidXRlIGZvdW5kLlxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlyID0gKHN0cnVjdCBudGZzX2lkeF9yb290ICopKCh1aW50OF90ICopYXR0ciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpOworICAgIGllID0gKHN0cnVjdCBudGZzX2lkeF9lbnRyeSAqKSgodWludDhfdCAqKSZpci0+aW5kZXggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpci0+aW5kZXguZW50cmllc19vZmZzZXQpOworICAgIGZvciAoOzsgaWUgPSAoc3RydWN0IG50ZnNfaWR4X2VudHJ5ICopKCh1aW50OF90ICopaWUgKyBpZS0+bGVuKSkgeworICAgICAgICAvKiBib3VuZHMgY2hlY2tzICovCisgICAgICAgIGlmICgodWludDhfdCAqKWllIDwgKHVpbnQ4X3QgKiltcmVjIHx8CisgICAgICAgICAgICAodWludDhfdCAqKWllICsgc2l6ZW9mKHN0cnVjdCBudGZzX2lkeF9lbnRyeV9oZWFkZXIpID4KKyAgICAgICAgICAgICh1aW50OF90ICopJmlyLT5pbmRleCArIGlyLT5pbmRleC5pbmRleF9sZW4gfHwKKyAgICAgICAgICAgICh1aW50OF90ICopaWUgKyBpZS0+bGVuID4KKyAgICAgICAgICAgICh1aW50OF90ICopJmlyLT5pbmRleCArIGlyLT5pbmRleC5pbmRleF9sZW4pCisgICAgICAgICAgICBnb3RvIGluZGV4X2VycjsKKworICAgICAgICAvKiBsYXN0IGVudHJ5IGNhbm5vdCBjb250YWluIGEga2V5LiBpdCBjYW4gaG93ZXZlciBjb250YWluCisgICAgICAgICAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrIHRyZWUgc28gd2UganVzdCBicmVhayBvdXQKKyAgICAgICAgICovCisgICAgICAgIGlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAobnRmc19maWxlbmFtZV9jbXAoZG5hbWUsIGllKSkKKyAgICAgICAgICAgIGdvdG8gZm91bmQ7CisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUgKi8KKyAgICBpZiAoIShpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9OT0RFKSkgeworICAgICAgICBwcmludGYoIk5vIGNoaWxkIG5vZGUsIGFib3J0aW5nLi4uXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogdGhlbiBkZXNjZW5kIGludG8gY2hpbGQgbm9kZSAqLworCisgICAgYXR0ciA9IG50ZnNfYXR0cl9sb29rdXAoZnMsIE5URlNfQVRfSU5ERVhfQUxMT0NBVElPTiwgJm1yZWMsIGxtcmVjKTsKKyAgICBpZiAoIWF0dHIpIHsKKyAgICAgICAgcHJpbnRmKCJObyBhdHRyaWJ1dGUgZm91bmQuXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKCFhdHRyLT5ub25fcmVzaWRlbnQpIHsKKyAgICAgICAgcHJpbnRmKCJXVEYgPyEgJElOREVYX0FMTE9DQVRJT04gaXNuJ3QgcmVhbGx5IHJlc2lkZW50LlxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGF0dHJfbGVuID0gKHVpbnQ4X3QgKilhdHRyICsgYXR0ci0+bGVuOworICAgIHN0cmVhbSA9IG1hcHBpbmdfY2h1bmtfaW5pdChhdHRyLCAmY2h1bmssICZvZmZzZXQpOworICAgIGRvIHsKKyAgICAgICAgZXJyID0gcGFyc2VfZGF0YV9ydW4oc3RyZWFtLCAmb2Zmc2V0LCBhdHRyX2xlbiwgJmNodW5rKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChjaHVuay5mbGFncyAmIE1BUF9VTkFMTE9DQVRFRCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChjaHVuay5mbGFncyAmIE1BUF9BTExPQ0FURUQpIHsKKyAgICAgICAgICAgIGRwcmludGYoIiVkIGNsdXN0ZXIocykgc3RhcnRpbmcgYXQgMHglMDhsbFhcbiIsIGNodW5rLmxlbiwKKyAgICAgICAgICAgICAgICAgICAgY2h1bmsubGNuKTsKKworICAgICAgICAgICAgdmNuID0gMDsKKyAgICAgICAgICAgIGxjbiA9IGNodW5rLmxjbjsKKyAgICAgICAgICAgIHdoaWxlICh2Y24gPCBjaHVuay5sZW4pIHsKKyAgICAgICAgICAgICAgICBibGsgPSAobGNuICsgdmNuKSA8PCBOVEZTX1NCKGZzKS0+Y2x1c3Rfc2hpZnQgPDwKKyAgICAgICAgICAgICAgICAgICAgU0VDVE9SX1NISUZUKGZzKSA+PiBCTE9DS19TSElGVChmcyk7CisKKyAgICAgICAgICAgICAgICBibGtfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBsYXN0X2xjbiA9IGxjbjsKKyAgICAgICAgICAgICAgICBsY24gKz0gdmNuOworICAgICAgICAgICAgICAgIGVyciA9IG50ZnNfcmVhZChmcywgJmJ1ZiwgYmxrX3NpemUsIGJsa19zaXplLCAmYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxrX29mZnNldCwgTlVMTCwgKHVpbnQ2NF90ICopJmxjbik7CisgICAgICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBjYWNoZS5cbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBudGZzX2ZpeHVwc193cml0ZWJhY2soZnMsIChzdHJ1Y3QgbnRmc19yZWNvcmQgKikmYnVmKTsKKworICAgICAgICAgICAgICAgIGlibGsgPSAoc3RydWN0IG50ZnNfaWR4X2FsbG9jYXRpb24gKikmYnVmOworICAgICAgICAgICAgICAgIGlmIChpYmxrLT5tYWdpYyAhPSBOVEZTX01BR0lDX0lORFgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJOb3QgYSB2YWxpZCBJTkRYIHJlY29yZC5cbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZSA9IChzdHJ1Y3QgbnRmc19pZHhfZW50cnkgKikoKHVpbnQ4X3QgKikmaWJsay0+aW5kZXggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYmxrLT5pbmRleC5lbnRyaWVzX29mZnNldCk7CisgICAgICAgICAgICAgICAgZm9yICg7OyBpZSA9IChzdHJ1Y3QgbnRmc19pZHhfZW50cnkgKikoKHVpbnQ4X3QgKilpZSArCisgICAgICAgICAgICAgICAgICAgICAgICBpZS0+bGVuKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBib3VuZHMgY2hlY2tzICovCisgICAgICAgICAgICAgICAgICAgIGlmICgodWludDhfdCAqKWllIDwgKHVpbnQ4X3QgKilpYmxrIHx8ICh1aW50OF90ICopaWUgKworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBudGZzX2lkeF9lbnRyeV9oZWFkZXIpID4KKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopJmlibGstPmluZGV4ICsgaWJsay0+aW5kZXguaW5kZXhfbGVuIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWllICsgaWUtPmxlbiA+CisgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKSZpYmxrLT5pbmRleCArIGlibGstPmluZGV4LmluZGV4X2xlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaW5kZXhfZXJyOworCisgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBrZXkgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGlmIChudGZzX2ZpbGVuYW1lX2NtcChkbmFtZSwgaWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsY24gPSBsYXN0X2xjbjsgLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgTENOICovCisgICAgICAgICAgICAgICAgLyogZ28gdG8gdGhlIG5leHQgVkNOICovCisgICAgICAgICAgICAgICAgdmNuICs9IChibGtfc2l6ZSAvICgxIDw8IE5URlNfU0IoZnMpLT5jbHVzdF9ieXRlX3NoaWZ0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlICghKGNodW5rLmZsYWdzICYgTUFQX0VORCkpOworCitub3RfZm91bmQ6CisgICAgZHByaW50ZigiSW5kZXggbm90IGZvdW5kXG4iKTsKKworb3V0OgorICAgIGZyZWUobXJlYyk7CisKKyAgICByZXR1cm4gTlVMTDsKKworZm91bmQ6CisgICAgZHByaW50ZigiSW5kZXggZm91bmRcbiIpOworICAgIGlub2RlID0gbmV3X250ZnNfaW5vZGUoZnMpOworICAgIGVyciA9IGluZGV4X2lub2RlX3NldHVwKGZzLCBpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlLCBpbm9kZSk7CisgICAgaWYgKGVycikgeworICAgICAgICBwcmludGYoIkVycm9yIGluIGluZGV4X2lub2RlX3NldHVwKClcbiIpOworICAgICAgICBmcmVlKGlub2RlKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZnJlZShtcmVjKTsKKworICAgIHJldHVybiBpbm9kZTsKKworaW5kZXhfZXJyOgorICAgIHByaW50ZigiQ29ycnVwdCBpbmRleC4gQWJvcnRpbmcgbG9va3VwLi4uXG4iKTsKKyAgICBnb3RvIG91dDsKK30KKworLyogQ29udmVydCBhbiBVVEYtMTZMRSBMRk4gdG8gT0VNIExGTiAqLworc3RhdGljIHVpbnQ4X3QgbnRmc19jdnRfZmlsZW5hbWUoY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBudGZzX2lkeF9lbnRyeSAqaWUpCit7CisgICAgY29uc3QgdWludDE2X3QgKmVudHJ5X2ZuOworICAgIHVpbnQ4X3QgZW50cnlfZm5fbGVuOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBlbnRyeV9mbiA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZTsKKyAgICBlbnRyeV9mbl9sZW4gPSBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuOworCisgICAgZm9yIChpID0gMDsgaSA8IGVudHJ5X2ZuX2xlbjsgaSsrKQorICAgICAgICBmaWxlbmFtZVtpXSA9IChjaGFyKWVudHJ5X2ZuW2ldOworCisgICAgZmlsZW5hbWVbaV0gPSAnXDAnOworCisgICAgcmV0dXJuIGVudHJ5X2ZuX2xlbjsKK30KKworc3RhdGljIGludCBudGZzX25leHRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVpbnQzMl90IGxzdGFydCkKK3sKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBpbm9kZS0+ZnM7CisgICAgc3RydWN0IG50ZnNfc2JfaW5mbyAqc2JpID0gTlRGU19TQihmcyk7CisgICAgc2VjdG9yX3QgcHN0YXJ0ID0gMDsKKyAgICBzdHJ1Y3QgcnVubGlzdCAqcmxpc3Q7CisgICAgc3RydWN0IHJ1bmxpc3QgKnJldDsKKyAgICBjb25zdCB1aW50MzJfdCBzZWNfc2l6ZSA9IFNFQ1RPUl9TSVpFKGZzKTsKKyAgICBjb25zdCB1aW50MzJfdCBzZWNfc2hpZnQgPSBTRUNUT1JfU0hJRlQoZnMpOworCisgICAgZHByaW50ZigiaW4gJXMoKVxuIiwgX19mdW5jX18pOworCisgICAgaWYgKCFOVEZTX1BWVChpbm9kZSktPm5vbl9yZXNpZGVudCkgeworICAgICAgICBwc3RhcnQgPSAoc2JpLT5tZnRfYmxrICsgTlRGU19QVlQoaW5vZGUpLT5oZXJlKSA8PCBCTE9DS19TSElGVChmcykgPj4KKyAgICAgICAgICAgICAgICBzZWNfc2hpZnQ7CisgICAgICAgIGlub2RlLT5uZXh0X2V4dGVudC5sZW4gPSAoaW5vZGUtPnNpemUgKyBzZWNfc2l6ZSAtIDEpID4+IHNlY19zaGlmdDsKKyAgICB9IGVsc2UgeworICAgICAgICBybGlzdCA9IE5URlNfUFZUKGlub2RlKS0+ZGF0YS5ub25fcmVzaWRlbnQucmxpc3Q7CisKKyAgICAgICAgaWYgKCFsc3RhcnQgfHwgbHN0YXJ0ID49IE5URlNfUFZUKGlub2RlKS0+aGVyZSkgeworICAgICAgICAgICAgaWYgKHJ1bmxpc3RfaXNfZW1wdHkocmxpc3QpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OyAgIC8qIG5vdGhpbmcgdG8gZG8gOy0pICovCisKKyAgICAgICAgICAgIHJldCA9IHJ1bmxpc3RfcmVtb3ZlKCZybGlzdCk7CisKKyAgICAgICAgICAgIE5URlNfUFZUKGlub2RlKS0+aGVyZSA9CisgICAgICAgICAgICAgICAgKChyZXQtPnJ1bi5sZW4gPDwgc2JpLT5jbHVzdF9ieXRlX3NoaWZ0KSA+PiBzZWNfc2hpZnQpOworCisgICAgICAgICAgICBwc3RhcnQgPSByZXQtPnJ1bi5sY24gPDwgc2JpLT5jbHVzdF9zaGlmdDsKKyAgICAgICAgICAgIGlub2RlLT5uZXh0X2V4dGVudC5sZW4gPQorICAgICAgICAgICAgICAgICgocmV0LT5ydW4ubGVuIDw8IHNiaS0+Y2x1c3RfYnl0ZV9zaGlmdCkgKyBzZWNfc2l6ZSAtIDEpID4+CisgICAgICAgICAgICAgICAgc2VjX3NoaWZ0OworCisgICAgICAgICAgICBOVEZTX1BWVChpbm9kZSktPmRhdGEubm9uX3Jlc2lkZW50LnJsaXN0ID0gcmxpc3Q7CisKKyAgICAgICAgICAgIGZyZWUocmV0KTsKKyAgICAgICAgICAgIHJldCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbm9kZS0+bmV4dF9leHRlbnQucHN0YXJ0ID0gcHN0YXJ0OworCisgICAgcmV0dXJuIDA7CisKK291dDoKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBudGZzX2dldGZzc2VjKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIGludCBzZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpoYXZlX21vcmUpCit7CisgICAgdWludDhfdCBub25fcmVzaWRlbnQ7CisgICAgdWludDMyX3QgcmV0OworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IGZpbGUtPmZzOworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5pbm9kZTsKKyAgICBzdHJ1Y3QgbnRmc19tZnRfcmVjb3JkICptcmVjLCAqbG1yZWM7CisgICAgc3RydWN0IG50ZnNfYXR0cl9yZWNvcmQgKmF0dHI7CisgICAgY2hhciAqcDsKKworICAgIGRwcmludGYoImluICVzKClcbiIsIF9fZnVuY19fKTsKKworICAgIG5vbl9yZXNpZGVudCA9IE5URlNfUFZUKGlub2RlKS0+bm9uX3Jlc2lkZW50OworCisgICAgcmV0ID0gZ2VuZXJpY19nZXRmc3NlYyhmaWxlLCBidWYsIHNlY3RvcnMsIGhhdmVfbW9yZSk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIW5vbl9yZXNpZGVudCkgeworICAgICAgICBtcmVjID0gTlRGU19TQihmcyktPm1mdF9yZWNvcmRfbG9va3VwKGZzLCBOVEZTX1BWVChpbm9kZSktPm1mdF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgaWYgKCFtcmVjKSB7CisgICAgICAgICAgICBwcmludGYoIk5vIE1GVCByZWNvcmQgZm91bmQuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgbG1yZWMgPSBtcmVjOworICAgICAgICBhdHRyID0gbnRmc19hdHRyX2xvb2t1cChmcywgTlRGU19BVF9EQVRBLCAmbXJlYywgbG1yZWMpOworICAgICAgICBpZiAoIWF0dHIpIHsKKyAgICAgICAgICAgIHByaW50ZigiTm8gYXR0cmlidXRlIGZvdW5kLlxuIik7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSAoY2hhciAqKSgodWludDhfdCAqKWF0dHIgKyBhdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCk7CisKKyAgICAgICAgLyogcCBub3cgcG9pbnRzIHRvIHRoZSBkYXRhIG9mZnNldCwgc28gbGV0J3MgY29weSBpdCBpbnRvIGJ1ZiAqLworICAgICAgICBtZW1jcHkoYnVmLCBwLCBpbm9kZS0+c2l6ZSk7CisKKyAgICAgICAgcmV0ID0gaW5vZGUtPnNpemU7CisKKyAgICAgICAgZnJlZShtcmVjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworCitvdXQ6CisgICAgZnJlZShtcmVjKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZmlsZW5hbWVfcHJpbnRhYmxlKGNvbnN0IGNoYXIgKnMpCit7CisgICAgcmV0dXJuIHMgJiYgKCpzICE9ICcuJyAmJiAqcyAhPSAnJCcpOworfQorCitzdGF0aWMgaW50IG50ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcmVudCAqZGlyZW50KQoreworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IGZpbGUtPmZzOworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5pbm9kZTsKKyAgICBzdHJ1Y3QgbnRmc19tZnRfcmVjb3JkICptcmVjLCAqbG1yZWM7CisgICAgYmxvY2tfdCBibGs7CisgICAgdWludDY0X3QgYmxrX29mZnNldDsKKyAgICBjb25zdCB1aW50NjRfdCBibGtfc2l6ZSA9IFVJTlQ2NF9DKDEpIDw8IEJMT0NLX1NISUZUKGZzKTsKKyAgICBzdHJ1Y3QgbnRmc19hdHRyX3JlY29yZCAqYXR0cjsKKyAgICBzdHJ1Y3QgbnRmc19pZHhfcm9vdCAqaXI7CisgICAgdWludDMyX3QgY291bnQ7CisgICAgaW50IGxlbjsKKyAgICBzdHJ1Y3QgbnRmc19pZHhfZW50cnkgKmllID0gTlVMTDsKKyAgICB1aW50OF90IGJ1ZltCTE9DS19TSVpFKGZzKV07CisgICAgc3RydWN0IG50ZnNfaWR4X2FsbG9jYXRpb24gKmlibGs7CisgICAgaW50IGVycjsKKyAgICB1aW50OF90ICpzdHJlYW07CisgICAgdWludDhfdCAqYXR0cl9sZW47CisgICAgc3RydWN0IG1hcHBpbmdfY2h1bmsgY2h1bms7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIGludDY0X3QgdmNuOworICAgIGludDY0X3QgbGNuOworICAgIGNoYXIgZmlsZW5hbWVbTlRGU19NQVhfRklMRV9OQU1FX0xFTiArIDFdOworCisgICAgZHByaW50ZigiaW4gJXMoKVxuIiwgX19mdW5jX18pOworCisgICAgbXJlYyA9IE5URlNfU0IoZnMpLT5tZnRfcmVjb3JkX2xvb2t1cChmcywgTlRGU19QVlQoaW5vZGUpLT5tZnRfbm8sIE5VTEwpOworICAgIGlmICghbXJlYykgeworICAgICAgICBwcmludGYoIk5vIE1GVCByZWNvcmQgZm91bmQuXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgbG1yZWMgPSBtcmVjOworICAgIGF0dHIgPSBudGZzX2F0dHJfbG9va3VwKGZzLCBOVEZTX0FUX0lOREVYX1JPT1QsICZtcmVjLCBsbXJlYyk7CisgICAgaWYgKCFhdHRyKSB7CisgICAgICAgIHByaW50ZigiTm8gYXR0cmlidXRlIGZvdW5kLlxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlyID0gKHN0cnVjdCBudGZzX2lkeF9yb290ICopKCh1aW50OF90ICopYXR0ciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpOworCisgICAgaWYgKCFmaWxlLT5vZmZzZXQgJiYgcmVhZGRpcl9zdGF0ZS0+aW5faWR4X3Jvb3QpCisgICAgICAgIGZpbGUtPm9mZnNldCA9IGlyLT5pbmRleC5lbnRyaWVzX29mZnNldDsKKworaWR4X3Jvb3RfbmV4dF9lbnRyeToKKyAgICBpZiAocmVhZGRpcl9zdGF0ZS0+aW5faWR4X3Jvb3QpIHsKKyAgICAgICAgaWUgPSAoc3RydWN0IG50ZnNfaWR4X2VudHJ5ICopKCh1aW50OF90ICopJmlyLT5pbmRleCArIGZpbGUtPm9mZnNldCk7CisgICAgICAgIGlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpIHsKKyAgICAgICAgICAgIGZpbGUtPm9mZnNldCA9IDA7CisgICAgICAgICAgICByZWFkZGlyX3N0YXRlLT5pbl9pZHhfcm9vdCA9IGZhbHNlOworICAgICAgICAgICAgcmVhZGRpcl9zdGF0ZS0+aWR4X2Jsa3NfY291bnQgPSAxOworICAgICAgICAgICAgcmVhZGRpcl9zdGF0ZS0+ZW50cmllc19jb3VudCA9IDA7CisgICAgICAgICAgICByZWFkZGlyX3N0YXRlLT5sYXN0X3ZjbiA9IDA7CisgICAgICAgICAgICBnb3RvIGRlc2NlbmRfaW50b19jaGlsZF9ub2RlOworICAgICAgICB9CisKKyAgICAgICAgZmlsZS0+b2Zmc2V0ICs9IGllLT5sZW47CisgICAgICAgIGxlbiA9IG50ZnNfY3Z0X2ZpbGVuYW1lKGZpbGVuYW1lLCBpZSk7CisgICAgICAgIGlmICghaXNfZmlsZW5hbWVfcHJpbnRhYmxlKGZpbGVuYW1lKSkKKyAgICAgICAgICAgIGdvdG8gaWR4X3Jvb3RfbmV4dF9lbnRyeTsKKworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCitkZXNjZW5kX2ludG9fY2hpbGRfbm9kZToKKyAgICBpZiAoIShpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9OT0RFKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICBhdHRyID0gbnRmc19hdHRyX2xvb2t1cChmcywgTlRGU19BVF9JTkRFWF9BTExPQ0FUSU9OLCAmbXJlYywgbG1yZWMpOworICAgIGlmICghYXR0cikKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICBpZiAoIWF0dHItPm5vbl9yZXNpZGVudCkgeworICAgICAgICBwcmludGYoIldURiA/ISAkSU5ERVhfQUxMT0NBVElPTiBpc24ndCByZWFsbHkgcmVzaWRlbnQuXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgYXR0cl9sZW4gPSAodWludDhfdCAqKWF0dHIgKyBhdHRyLT5sZW47CisKK25leHRfcnVuOgorICAgIHN0cmVhbSA9IG1hcHBpbmdfY2h1bmtfaW5pdChhdHRyLCAmY2h1bmssICZvZmZzZXQpOworICAgIGNvdW50ID0gcmVhZGRpcl9zdGF0ZS0+aWR4X2Jsa3NfY291bnQ7CisgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgZXJyID0gcGFyc2VfZGF0YV9ydW4oc3RyZWFtLCAmb2Zmc2V0LCBhdHRyX2xlbiwgJmNodW5rKTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgcHJpbnRmKCJFcnJvciB3aGlsZSBwYXJzaW5nIGRhdGEgcnVucy5cbiIpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2h1bmsuZmxhZ3MgJiBNQVBfVU5BTExPQ0FURUQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGNodW5rLmZsYWdzICYgTUFQX0VORCkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChjaHVuay5mbGFncyAmIE1BUF9VTkFMTE9DQVRFRCkgeworICAgICAgIHJlYWRkaXJfc3RhdGUtPmlkeF9ibGtzX2NvdW50Kys7CisgICAgICAgZ290byBuZXh0X3J1bjsKKyAgICB9CisKK25leHRfdmNuOgorICAgIHZjbiA9IHJlYWRkaXJfc3RhdGUtPmxhc3RfdmNuOworICAgIGlmICh2Y24gPj0gY2h1bmsubGVuKSB7CisgICAgICAgIHJlYWRkaXJfc3RhdGUtPmxhc3RfdmNuID0gMDsKKyAgICAgICAgcmVhZGRpcl9zdGF0ZS0+aWR4X2Jsa3NfY291bnQrKzsKKyAgICAgICAgZ290byBuZXh0X3J1bjsKKyAgICB9CisKKyAgICBsY24gPSBjaHVuay5sY247CisgICAgYmxrID0gKGxjbiArIHZjbikgPDwgTlRGU19TQihmcyktPmNsdXN0X3NoaWZ0IDw8IFNFQ1RPUl9TSElGVChmcykgPj4KKyAgICAgICAgICAgIEJMT0NLX1NISUZUKGZzKTsKKworICAgIGJsa19vZmZzZXQgPSAwOworICAgIGVyciA9IG50ZnNfcmVhZChmcywgJmJ1ZiwgYmxrX3NpemUsIGJsa19zaXplLCAmYmxrLCAmYmxrX29mZnNldCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90ICopJmxjbik7CisgICAgaWYgKGVycikgeworICAgICAgICBwcmludGYoIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBjYWNoZS5cbiIpOworICAgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICB9CisKKyAgICBudGZzX2ZpeHVwc193cml0ZWJhY2soZnMsIChzdHJ1Y3QgbnRmc19yZWNvcmQgKikmYnVmKTsKKworICAgIGlibGsgPSAoc3RydWN0IG50ZnNfaWR4X2FsbG9jYXRpb24gKikmYnVmOworICAgIGlmIChpYmxrLT5tYWdpYyAhPSBOVEZTX01BR0lDX0lORFgpIHsKKyAgICAgICAgcHJpbnRmKCJOb3QgYSB2YWxpZCBJTkRYIHJlY29yZC5cbiIpOworICAgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICB9CisKK2lkeF9ibG9ja19uZXh0X2VudHJ5OgorICAgIGllID0gKHN0cnVjdCBudGZzX2lkeF9lbnRyeSAqKSgodWludDhfdCAqKSZpYmxrLT5pbmRleCArCisgICAgICAgICAgICAgICAgICAgICAgICBpYmxrLT5pbmRleC5lbnRyaWVzX29mZnNldCk7CisgICAgY291bnQgPSByZWFkZGlyX3N0YXRlLT5lbnRyaWVzX2NvdW50OworICAgIGZvciAoIDsgY291bnQtLTsgaWUgPSAoc3RydWN0IG50ZnNfaWR4X2VudHJ5ICopKCh1aW50OF90ICopaWUgKyBpZS0+bGVuKSkgeworICAgICAgICAvKiBib3VuZHMgY2hlY2tzICovCisgICAgICAgIGlmICgodWludDhfdCAqKWllIDwgKHVpbnQ4X3QgKilpYmxrIHx8ICh1aW50OF90ICopaWUgKworICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBudGZzX2lkeF9lbnRyeV9oZWFkZXIpID4KKyAgICAgICAgICAgICh1aW50OF90ICopJmlibGstPmluZGV4ICsgaWJsay0+aW5kZXguaW5kZXhfbGVuIHx8CisgICAgICAgICAgICAodWludDhfdCAqKWllICsgaWUtPmxlbiA+CisgICAgICAgICAgICAodWludDhfdCAqKSZpYmxrLT5pbmRleCArIGlibGstPmluZGV4LmluZGV4X2xlbikKKyAgICAgICAgICAgIGdvdG8gaW5kZXhfZXJyOworCisgICAgICAgIC8qIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBrZXkgKi8KKyAgICAgICAgaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkgeworICAgICAgICAgICAgLyogZ28gdG8gdGhlIG5leHQgVkNOICovCisgICAgICAgICAgICByZWFkZGlyX3N0YXRlLT5sYXN0X3ZjbiArPSAoYmxrX3NpemUgLyAoMSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVEZTX1NCKGZzKS0+Y2x1c3RfYnl0ZV9zaGlmdCkpOworICAgICAgICAgICAgcmVhZGRpcl9zdGF0ZS0+ZW50cmllc19jb3VudCA9IDA7CisgICAgICAgICAgICBnb3RvIG5leHRfdmNuOworICAgICAgICB9CisgICAgfQorCisgICAgcmVhZGRpcl9zdGF0ZS0+ZW50cmllc19jb3VudCsrOworCisgICAgLyogTmVlZCB0byBjaGVjayBpZiB0aGlzIGVudHJ5IGhhcyBJTkRFWF9FTlRSWV9FTkQgZmxhZyBzZXQuIElmCisgICAgICogc28sIHRoZW4gaXQgd29uJ3QgY29udGFpbiBhIGluZGV4ZWRfZmlsZSBmaWxlLCBzbyBjb250aW51ZSB0aGUKKyAgICAgKiBsb29rdXAgb24gdGhlIG5leHQgVkNOL0xDTiAoaWYgYW55KS4KKyAgICAgKi8KKyAgICBpZiAoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfRU5EKQorICAgICAgICBnb3RvIG5leHRfdmNuOworCisgICAgbGVuID0gbnRmc19jdnRfZmlsZW5hbWUoZmlsZW5hbWUsIGllKTsKKyAgICBpZiAoIWlzX2ZpbGVuYW1lX3ByaW50YWJsZShmaWxlbmFtZSkpCisgICAgICAgIGdvdG8gaWR4X2Jsb2NrX25leHRfZW50cnk7CisKKyAgICBnb3RvIGRvbmU7CisKK291dDoKKyAgICByZWFkZGlyX3N0YXRlLT5pbl9pZHhfcm9vdCA9IHRydWU7CisKKyAgICBmcmVlKG1yZWMpOworCisgICAgcmV0dXJuIC0xOworCitkb25lOgorICAgIGRpcmVudC0+ZF9pbm8gPSBpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlOworICAgIGRpcmVudC0+ZF9vZmYgPSBmaWxlLT5vZmZzZXQ7CisgICAgZGlyZW50LT5kX3JlY2xlbiA9IG9mZnNldG9mKHN0cnVjdCBkaXJlbnQsIGRfbmFtZSkgKyBsZW4gKyAxOworCisgICAgZnJlZShtcmVjKTsKKworICAgIG1yZWMgPSBOVEZTX1NCKGZzKS0+bWZ0X3JlY29yZF9sb29rdXAoZnMsIGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUsIE5VTEwpOworICAgIGlmICghbXJlYykgeworICAgICAgICBwcmludGYoIk5vIE1GVCByZWNvcmQgZm91bmQuXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZGlyZW50LT5kX3R5cGUgPSBnZXRfaW5vZGVfbW9kZShtcmVjKTsKKyAgICBtZW1jcHkoZGlyZW50LT5kX25hbWUsIGZpbGVuYW1lLCBsZW4gKyAxKTsKKworICAgIGZyZWUobXJlYyk7CisKKyAgICByZXR1cm4gMDsKKworbm90X2ZvdW5kOgorICAgIHByaW50ZigiSW5kZXggbm90IGZvdW5kXG4iKTsKKyAgICBnb3RvIG91dDsKKworaW5kZXhfZXJyOgorICAgIHByaW50ZigiQ29ycnVwdCBpbmRleC4gQWJvcnRpbmcgbG9va3VwLi4uXG4iKTsKKyAgICBnb3RvIG91dDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKm50ZnNfaWdldChjb25zdCBjaGFyICpkbmFtZSwgc3RydWN0IGlub2RlICpwYXJlbnQpCit7CisgICAgcmV0dXJuIG50ZnNfaW5kZXhfbG9va3VwKGRuYW1lLCBwYXJlbnQpOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpudGZzX2lnZXRfcm9vdChzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgdWludDY0X3Qgc3RhcnRfYmxrOworICAgIHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKm1yZWMsICpsbXJlYzsKKyAgICBzdHJ1Y3QgbnRmc19hdHRyX3JlY29yZCAqYXR0cjsKKyAgICBzdHJ1Y3QgbnRmc192b2xfaW5mbyAqdm9sX2luZm87CisgICAgc3RydWN0IGlub2RlICppbm9kZTsKKyAgICBpbnQgZXJyOworCisgICAgZHByaW50ZigiaW4gJXMoKVxuIiwgX19mdW5jX18pOworCisgICAgLyogRmV0Y2ggdGhlICRWb2x1bWUgTUZUIHJlY29yZCAqLworICAgIHN0YXJ0X2JsayA9IDA7CisgICAgbXJlYyA9IE5URlNfU0IoZnMpLT5tZnRfcmVjb3JkX2xvb2t1cChmcywgRklMRV9Wb2x1bWUsICZzdGFydF9ibGspOworICAgIGlmICghbXJlYykgeworICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBmZXRjaCAkVm9sdW1lIE1GVCByZWNvcmQhXG4iKTsKKyAgICAgICAgZ290byBlcnJfbXJlYzsKKyAgICB9CisKKyAgICBsbXJlYyA9IG1yZWM7CisKKyAgICAvKiBGZXRjaCB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGF0dHJpYnV0ZSAqLworICAgIGF0dHIgPSBudGZzX2F0dHJfbG9va3VwKGZzLCBOVEZTX0FUX1ZPTF9JTkZPLCAmbXJlYywgbG1yZWMpOworICAgIGlmICghYXR0cikgeworICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBmaW5kIHZvbHVtZSBpbmZvIGF0dHJpYnV0ZSFcbiIpOworICAgICAgICBnb3RvIGVycl9hdHRyOworICAgIH0KKworICAgIC8qIE5vdGUgTlRGUyB2ZXJzaW9uIGFuZCBjaG9vc2UgdmVyc2lvbi1kZXBlbmRlbnQgZnVuY3Rpb25zICovCisgICAgdm9sX2luZm8gPSAodm9pZCAqKSgoY2hhciAqKWF0dHIgKyBhdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCk7CisgICAgTlRGU19TQihmcyktPm1ham9yX3ZlciA9IHZvbF9pbmZvLT5tYWpvcl92ZXI7CisgICAgTlRGU19TQihmcyktPm1pbm9yX3ZlciA9IHZvbF9pbmZvLT5taW5vcl92ZXI7CisgICAgaWYgKHZvbF9pbmZvLT5tYWpvcl92ZXIgPT0gMyAmJiB2b2xfaW5mby0+bWlub3JfdmVyID09IDApCisgICAgICAgIE5URlNfU0IoZnMpLT5tZnRfcmVjb3JkX2xvb2t1cCA9IG50ZnNfbWZ0X3JlY29yZF9sb29rdXBfM18wOworICAgIGVsc2UgaWYgKHZvbF9pbmZvLT5tYWpvcl92ZXIgPT0gMyAmJiB2b2xfaW5mby0+bWlub3JfdmVyID09IDEgJiYKKyAgICAgICAgICAgIG1yZWMtPm1mdF9yZWNvcmRfbm8gPT0gRklMRV9Wb2x1bWUpCisgICAgICAgIE5URlNfU0IoZnMpLT5tZnRfcmVjb3JkX2xvb2t1cCA9IG50ZnNfbWZ0X3JlY29yZF9sb29rdXBfM18xOworCisgICAgLyogRnJlZSBNRlQgcmVjb3JkICovCisgICAgZnJlZShtcmVjKTsKKyAgICBtcmVjID0gTlVMTDsKKworICAgIGlub2RlID0gbmV3X250ZnNfaW5vZGUoZnMpOworICAgIGlub2RlLT5mcyA9IGZzOworCisgICAgZXJyID0gaW5kZXhfaW5vZGVfc2V0dXAoZnMsIEZJTEVfcm9vdCwgaW5vZGUpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZXJyX3NldHVwOworCisgICAgTlRGU19QVlQoaW5vZGUpLT5zdGFydCA9IE5URlNfUFZUKGlub2RlKS0+aGVyZTsKKworICAgIHJldHVybiBpbm9kZTsKKworZXJyX3NldHVwOgorCisgICAgZnJlZShpbm9kZSk7CitlcnJfYXR0cjoKKworICAgIGZyZWUobXJlYyk7CitlcnJfbXJlYzoKKworICAgIHJldHVybiBOVUxMOworfQorCisvKiBJbml0aWFsaXplIHRoZSBmaWxlc3lzdGVtIG1ldGFkYXRhIGFuZCByZXR1cm4gYmxrIHNpemUgaW4gYml0cyAqLworc3RhdGljIGludCBudGZzX2ZzX2luaXQoc3RydWN0IGZzX2luZm8gKmZzKQoreworICAgIGludCByZWFkX2NvdW50OworICAgIHN0cnVjdCBudGZzX2JwYiBudGZzOworICAgIHN0cnVjdCBudGZzX3NiX2luZm8gKnNiaTsKKyAgICBzdHJ1Y3QgZGlzayAqZGlzayA9IGZzLT5mc19kZXYtPmRpc2s7CisgICAgdWludDhfdCBtZnRfcmVjb3JkX3NoaWZ0OworCisgICAgZHByaW50ZigiaW4gJXMoKVxuIiwgX19mdW5jX18pOworCisgICAgcmVhZF9jb3VudCA9IGRpc2stPnJkd3Jfc2VjdG9ycyhkaXNrLCAmbnRmcywgMCwgMSwgMCk7CisgICAgaWYgKCFyZWFkX2NvdW50KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIW50ZnNfY2hlY2tfc2JfZmllbGRzKCZudGZzKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgU0VDVE9SX1NISUZUKGZzKSA9IGRpc2stPnNlY3Rvcl9zaGlmdDsKKworICAgIC8qIE5vdGU6IG50ZnMuY2x1c3RfcGVyX21mdF9yZWNvcmQgY2FuIGJlIGEgbmVnYXRpdmUgbnVtYmVyLgorICAgICAqIElmIG5lZ2F0aXZlLCBpdCByZXByZXNlbnRzIGEgc2hpZnQgY291bnQsIGVsc2UgaXQgcmVwcmVzZW50cworICAgICAqIGEgbXVsdGlwbGllciBmb3IgdGhlIGNsdXN0ZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBtZnRfcmVjb3JkX3NoaWZ0ID0gbnRmcy5jbHVzdF9wZXJfbWZ0X3JlY29yZCA8IDAgPworICAgICAgICAgICAgICAgICAgICAtbnRmcy5jbHVzdF9wZXJfbWZ0X3JlY29yZCA6CisgICAgICAgICAgICAgICAgICAgIGlsb2cyKG50ZnMuc2VjX3Blcl9jbHVzdCkgKyBTRUNUT1JfU0hJRlQoZnMpICsKKyAgICAgICAgICAgICAgICAgICAgaWxvZzIobnRmcy5jbHVzdF9wZXJfbWZ0X3JlY29yZCk7CisKKyAgICBTRUNUT1JfU0laRShmcykgPSAxIDw8IFNFQ1RPUl9TSElGVChmcyk7CisKKyAgICBzYmkgPSBtYWxsb2Moc2l6ZW9mICpzYmkpOworICAgIGlmICghc2JpKQorICAgICAgICBtYWxsb2NfZXJyb3IoIm50ZnNfc2JfaW5mbyBzdHJ1Y3R1cmUiKTsKKworICAgIGZzLT5mc19pbmZvID0gc2JpOworCisgICAgc2JpLT5jbHVzdF9zaGlmdCAgICAgICAgICAgID0gaWxvZzIobnRmcy5zZWNfcGVyX2NsdXN0KTsKKyAgICBzYmktPmNsdXN0X2J5dGVfc2hpZnQgICAgICAgPSBzYmktPmNsdXN0X3NoaWZ0ICsgU0VDVE9SX1NISUZUKGZzKTsKKyAgICBzYmktPmNsdXN0X21hc2sgICAgICAgICAgICAgPSBudGZzLnNlY19wZXJfY2x1c3QgLSAxOworICAgIHNiaS0+Y2x1c3Rfc2l6ZSAgICAgICAgICAgICA9IG50ZnMuc2VjX3Blcl9jbHVzdCA8PCBTRUNUT1JfU0hJRlQoZnMpOworICAgIHNiaS0+bWZ0X3JlY29yZF9zaXplICAgICAgICA9IDEgPDwgbWZ0X3JlY29yZF9zaGlmdDsKKyAgICBzYmktPmNsdXN0X3Blcl9pZHhfcmVjb3JkICAgPSBudGZzLmNsdXN0X3Blcl9pZHhfcmVjb3JkOworCisgICAgQkxPQ0tfU0hJRlQoZnMpID0gaWxvZzIobnRmcy5jbHVzdF9wZXJfaWR4X3JlY29yZCkgKyBzYmktPmNsdXN0X2J5dGVfc2hpZnQ7CisgICAgQkxPQ0tfU0laRShmcykgPSAxIDw8IEJMT0NLX1NISUZUKGZzKTsKKworICAgIHNiaS0+bWZ0X2xjbiA9IG50ZnMubWZ0X2xjbHVzdDsKKyAgICBzYmktPm1mdF9ibGsgPSBudGZzLm1mdF9sY2x1c3QgPDwgc2JpLT5jbHVzdF9zaGlmdCA8PCBTRUNUT1JfU0hJRlQoZnMpID4+CisgICAgICAgICAgICAgICAgQkxPQ0tfU0hJRlQoZnMpOworICAgIC8qIDE2IE1GVCBlbnRyaWVzIHJlc2VydmVkIGZvciBtZXRhZGF0YSBmaWxlcyAoYXBwcm94aW1hdGVseSAxNiBLaUIpICovCisgICAgc2JpLT5tZnRfc2l6ZSA9IG1mdF9yZWNvcmRfc2hpZnQgPDwgc2JpLT5jbHVzdF9zaGlmdCA8PCA0OworCisgICAgc2JpLT5jbHVzdGVycyA9IG50ZnMudG90YWxfc2VjdG9ycyA8PCBTRUNUT1JfU0hJRlQoZnMpID4+IHNiaS0+Y2x1c3Rfc2hpZnQ7CisgICAgaWYgKHNiaS0+Y2x1c3RlcnMgPiAweEZGRkZGRkZGRkZGNFVMTCkKKyAgICAgICAgc2JpLT5jbHVzdGVycyA9IDB4RkZGRkZGRkZGRkY0VUxMOworCisgICAgLyoKKyAgICAgKiBBc3N1bWUgTlRGUyB2ZXJzaW9uIDMuMCB0byBiZWdpbiB3aXRoLiBJZiB3ZSBmaW5kIHRoYXQgdGhlCisgICAgICogdm9sdW1lIGlzIGEgZGlmZmVyZW50IHZlcnNpb24gbGF0ZXIgb24sIHdlIHdpbGwgYWRqdXN0IGF0CisgICAgICogdGhhdCB0aW1lLgorICAgICAqLworICAgIHNiaS0+bWFqb3JfdmVyID0gMzsKKyAgICBzYmktPm1pbm9yX3ZlciA9IDA7CisgICAgc2JpLT5tZnRfcmVjb3JkX2xvb2t1cCA9IG50ZnNfbWZ0X3JlY29yZF9sb29rdXBfM18wOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgY2FjaGUgKi8KKyAgICBjYWNoZV9pbml0KGZzLT5mc19kZXYsIEJMT0NLX1NISUZUKGZzKSk7CisKKyAgICByZXR1cm4gQkxPQ0tfU0hJRlQoZnMpOworfQorCitjb25zdCBzdHJ1Y3QgZnNfb3BzIG50ZnNfZnNfb3BzID0geworICAgIC5mc19uYW1lICAgICAgICA9ICJudGZzIiwKKyAgICAuZnNfZmxhZ3MgICAgICAgPSBGU19VU0VNRU0gfCBGU19USElTSU5ELAorICAgIC5mc19pbml0ICAgICAgICA9IG50ZnNfZnNfaW5pdCwKKyAgICAuc2VhcmNoZGlyICAgICAgPSBOVUxMLAorICAgIC5nZXRmc3NlYyAgICAgICA9IG50ZnNfZ2V0ZnNzZWMsCisgICAgLmNsb3NlX2ZpbGUgICAgID0gZ2VuZXJpY19jbG9zZV9maWxlLAorICAgIC5tYW5nbGVfbmFtZSAgICA9IGdlbmVyaWNfbWFuZ2xlX25hbWUsCisgICAgLm9wZW5fY29uZmlnICAgID0gZ2VuZXJpY19vcGVuX2NvbmZpZywKKyAgICAucmVhZGRpciAgICAgICAgPSBudGZzX3JlYWRkaXIsCisgICAgLmlnZXRfcm9vdCAgICAgID0gbnRmc19pZ2V0X3Jvb3QsCisgICAgLmlnZXQgICAgICAgICAgID0gbnRmc19pZ2V0LAorICAgIC5uZXh0X2V4dGVudCAgICA9IG50ZnNfbmV4dF9leHRlbnQsCisgICAgLmZzX3V1aWQgICAgICAgID0gTlVMTCwKK307CmRpZmYgLS1naXQgYS9jb3JlL2ZzL250ZnMvbnRmcy5oIGIvY29yZS9mcy9udGZzL250ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFhNzhkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9udGZzL250ZnMuaApAQCAtMCwwICsxLDQ4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFBhdWxvIEFsY2FudGFyYSA8cGNhY2pyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKi8KKworI2luY2x1ZGUgInJ1bmxpc3QuaCIKKworI2lmbmRlZiBfTlRGU19IXworI2RlZmluZSBfTlRGU19IXworCitzdHJ1Y3QgbnRmc19icGIgeworICAgIHVpbnQ4X3Qgam1wX2Jvb3RbM107CisgICAgY2hhciBvZW1fbmFtZVs4XTsKKyAgICB1aW50MTZfdCBzZWN0b3Jfc2l6ZTsKKyAgICB1aW50OF90IHNlY19wZXJfY2x1c3Q7CisgICAgdWludDE2X3QgcmVzX3NlY3RvcnM7CisgICAgdWludDhfdCB6ZXJvXzBbM107CisgICAgdWludDE2X3QgemVyb18xOworICAgIHVpbnQ4X3QgbWVkaWE7CisgICAgdWludDE2X3QgemVyb18yOworICAgIHVpbnQxNl90IHVudXNlZF8wOworICAgIHVpbnQxNl90IHVudXNlZF8xOworICAgIHVpbnQzMl90IHVudXNlZF8yOworICAgIHVpbnQzMl90IHplcm9fMzsKKyAgICB1aW50MzJfdCB1bnVzZWRfMzsKKyAgICB1aW50NjRfdCB0b3RhbF9zZWN0b3JzOworICAgIHVpbnQ2NF90IG1mdF9sY2x1c3Q7CisgICAgdWludDY0X3QgbWZ0X21pcnJfbGNsdXN0OworICAgIGludDhfdCBjbHVzdF9wZXJfbWZ0X3JlY29yZDsKKyAgICB1aW50OF90IHVudXNlZF80WzNdOworICAgIHVpbnQ4X3QgY2x1c3RfcGVyX2lkeF9yZWNvcmQ7CisgICAgdWludDhfdCB1bnVzZWRfNVszXTsKKyAgICB1aW50NjRfdCB2b2xfc2VyaWFsOworICAgIHVpbnQzMl90IHVudXNlZF82OworCisgICAgdWludDhfdCBwYWRbNDI4XTsgICAgICAgLyogcGFkZGluZyB0byBhIHNlY3RvciBib3VuZGFyeSAoNTEyIGJ5dGVzKSAqLworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKy8qIEZ1bmN0aW9uIHR5cGUgZm9yIGFuIE5URlMtdmVyc2lvbi1kZXBlbmRlbnQgTUZUIHJlY29yZCBsb29rdXAgKi8KK3N0cnVjdCBudGZzX21mdF9yZWNvcmQ7Cit0eXBlZGVmIHN0cnVjdCBudGZzX21mdF9yZWNvcmQgKmZfbWZ0X3JlY29yZF9sb29rdXAoc3RydWN0IGZzX2luZm8gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgYmxvY2tfdCAqKTsKKworc3RydWN0IG50ZnNfc2JfaW5mbyB7CisgICAgYmxvY2tfdCBtZnRfYmxrOyAgICAgICAgICAgICAgICAvKiBUaGUgZmlyc3QgTUZUIHJlY29yZCBibG9jayAqLworICAgIHVpbnQ2NF90IG1mdF9sY247ICAgICAgICAgICAgICAgLyogTENOIG9mIHRoZSBmaXJzdCBNRlQgcmVjb3JkICovCisgICAgdW5zaWduZWQgbWZ0X3NpemU7ICAgICAgICAgICAgICAvKiBUaGUgTUZUIHNpemUgaW4gc2VjdG9ycyAqLworICAgIHVpbnQ2NF90IG1mdF9yZWNvcmRfc2l6ZTsgICAgICAgLyogTUZUIHJlY29yZCBzaXplIGluIGJ5dGVzICovCisKKyAgICB1aW50OF90IGNsdXN0X3Blcl9pZHhfcmVjb3JkOyAgIC8qIENsdXN0ZXJzIHBlciBJbmRleCBSZWNvcmQgKi8KKworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjbHVzdGVyczsgICAgLyogVG90YWwgbnVtYmVyIG9mIGNsdXN0ZXJzICovCisKKyAgICB1bnNpZ25lZCBjbHVzdF9zaGlmdDsgICAgICAgICAgIC8qIEJhc2VkIG9uIHNlY3RvcnMgKi8KKyAgICB1bnNpZ25lZCBjbHVzdF9ieXRlX3NoaWZ0OyAgICAgIC8qIEJhc2VkIG9uIGJ5dGVzICovCisgICAgdW5zaWduZWQgY2x1c3RfbWFzazsKKyAgICB1bnNpZ25lZCBjbHVzdF9zaXplOworCisgICAgdWludDhfdCBtYWpvcl92ZXI7ICAgICAgICAgICAgICAvKiBNYWpvciB2ZXJzaW9uIGZyb20gJFZvbHVtZSAqLworICAgIHVpbnQ4X3QgbWlub3JfdmVyOyAgICAgICAgICAgICAgLyogTWlub3IgdmVyc2lvbiBmcm9tICRWb2x1bWUgKi8KKworICAgIC8qIE5URlMtdmVyc2lvbi1kZXBlbmRlbnQgTUZUIHJlY29yZCBsb29rdXAgZnVuY3Rpb24gdG8gdXNlICovCisgICAgZl9tZnRfcmVjb3JkX2xvb2t1cCAqbWZ0X3JlY29yZF9sb29rdXA7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyogVGhlIE5URlMgaW4tbWVtb3J5IGlub2RlIHN0cnVjdHVyZSAqLworc3RydWN0IG50ZnNfaW5vZGUgeworICAgIGludDY0X3QgaW5pdGlhbGl6ZWRfc2l6ZTsKKyAgICBpbnQ2NF90IGFsbG9jYXRlZF9zaXplOworICAgIHVuc2lnbmVkIGxvbmcgbWZ0X25vOyAgICAgICAvKiBOdW1iZXIgb2YgdGhlIG1mdCByZWNvcmQgLyBpbm9kZSAqLworICAgIHVpbnQxNl90IHNlcV9ubzsgICAgICAgICAgICAvKiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG1mdCByZWNvcmQgKi8KKyAgICB1aW50MzJfdCB0eXBlOyAgICAgICAgICAgICAgLyogQXR0cmlidXRlIHR5cGUgb2YgdGhpcyBpbm9kZSAqLworICAgIHVpbnQ4X3Qgbm9uX3Jlc2lkZW50OworICAgIHVuaW9uIHsgICAgICAgICAgICAgICAgIC8qIE5vbi1yZXNpZGVudCAkREFUQSBhdHRyaWJ1dGUgKi8KKyAgICAgICAgc3RydWN0IHsgICAgICAgICAgICAvKiBVc2VkIG9ubHkgaWYgbm9uX3Jlc2lkZW50IGZsYWdzIGlzbid0IHNldCAqLworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0OyAgICAvKiBEYXRhIG9mZnNldCAqLworICAgICAgICB9IHJlc2lkZW50OworICAgICAgICBzdHJ1Y3QgeyAgICAgICAgICAgIC8qIFVzZWQgb25seSBpZiBub25fcmVzaWRlbnQgaXMgc2V0ICovCisgICAgICAgICAgICBzdHJ1Y3QgcnVubGlzdCAqcmxpc3Q7CisgICAgICAgIH0gbm9uX3Jlc2lkZW50OworICAgIH0gZGF0YTsKKyAgICB1aW50MzJfdCBzdGFydF9jbHVzdGVyOyAvKiBTdGFydGluZyBjbHVzdGVyIGFkZHJlc3MgKi8KKyAgICBzZWN0b3JfdCBzdGFydDsgICAgICAgICAvKiBTdGFydGluZyBzZWN0b3IgKi8KKyAgICBzZWN0b3JfdCBvZmZzZXQ7ICAgICAgICAvKiBDdXJyZW50IHNlY3RvciBvZmZzZXQgKi8KKyAgICBzZWN0b3JfdCBoZXJlOyAgICAgICAgICAvKiBTZWN0b3IgY29ycmVzcG9uZGluZyB0byBvZmZzZXQgKi8KK307CisKKy8qIFRoaXMgaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBhIHN0YXRlIGZvciBudGZzX3JlYWRkaXIoKSBjYWxsZXJzLgorICogQXMgTlRGUyBzdG9yZXMgZGlyZWN0b3J5IGVudHJpZXMgaW4gYSBjb21wbGV4IHdheSwgdGhpcyBpcyBzdHJ1Y3R1cmUKKyAqIGVuZHMgdXAgc2F2aW5nIGEgc3RhdGUgcmVxdWlyZWQgdG8gZmluZCBvdXQgd2hlcmUgd2UgbXVzdCBzdGFydCBmcm9tCisgKiBmb3IgdGhlIG5leHQgbnRmc19yZWFkZGlyKCkgY2FsbC4KKyAqLworc3RydWN0IG50ZnNfcmVhZGRpcl9zdGF0ZSB7CisgICAgdW5zaWduZWQgbG9uZyBtZnRfbm87ICAgICAgIC8qIE1GVCByZWNvcmQgbnVtYmVyICovCisgICAgYm9vbCBpbl9pZHhfcm9vdDsgICAgICAgICAgIC8qIEl0J3MgdHJ1ZSBpZiB3ZSdyZSBzdGlsbCBpbiB0aGUgSU5ERVggcm9vdCAqLworICAgIHVpbnQzMl90IGlkeF9ibGtzX2NvdW50OyAgICAvKiBOdW1iZXIgb2YgcmVhZCBJTkRYIGJsb2NrcyAqLworICAgIHVpbnQzMl90IGVudHJpZXNfY291bnQ7ICAgICAvKiBOdW1iZXIgb2YgcmVhZCBJTkRFWCBlbnRyaWVzICovCisgICAgaW50NjRfdCBsYXN0X3ZjbjsgICAgICAgICAgIC8qIExhc3QgVkNOIG9mIHRoZSBJTkRYIGJsb2NrICovCit9OworCitlbnVtIHsKKyAgICBNQVBfVU5TUEVDLAorICAgIE1BUF9TVEFSVCAgICAgICAgICAgPSAxIDw8IDAsCisgICAgTUFQX0VORCAgICAgICAgICAgICA9IDEgPDwgMSwKKyAgICBNQVBfQUxMT0NBVEVEICAgICAgID0gMSA8PCAyLAorICAgIE1BUF9VTkFMTE9DQVRFRCAgICAgPSAxIDw8IDMsCisgICAgTUFQX01BU0sgICAgICAgICAgICA9IDB4MDAwMDAwMEYsCit9OworCitzdHJ1Y3QgbWFwcGluZ19jaHVuayB7CisgICAgdWludDY0X3QgdmNuOworICAgIGludDY0X3QgbGNuOworICAgIHVpbnQ2NF90IGxlbjsKKyAgICB1aW50MzJfdCBmbGFnczsKK307CisKKy8qIFN5c3RlbSBkZWZpbmVkIGF0dHJpYnV0ZXMgKDMyLWJpdCkKKyAqIEVhY2ggYXR0cmlidXRlIHR5cGUgaGFzIGEgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgbmFtZSAoaW4gVW5pY29kZSkKKyAqLworZW51bSB7CisgICAgTlRGU19BVF9VTlVTRUQgICAgICAgICAgICAgICAgICAgICAgPSAweDAwLAorICAgIE5URlNfQVRfU1RBTkRBUkRfSU5GT1JNQVRJT04gICAgICAgID0gMHgxMCwKKyAgICBOVEZTX0FUX0FUVFJfTElTVCAgICAgICAgICAgICAgICAgICA9IDB4MjAsCisgICAgTlRGU19BVF9GSUxFTkFNRSAgICAgICAgICAgICAgICAgICAgPSAweDMwLAorICAgIE5URlNfQVRfT0JKX0lEICAgICAgICAgICAgICAgICAgICAgID0gMHg0MCwKKyAgICBOVEZTX0FUX1NFQ1VSSVRZX0RFU0NQICAgICAgICAgICAgICA9IDB4NTAsCisgICAgTlRGU19BVF9WT0xfTkFNRSAgICAgICAgICAgICAgICAgICAgPSAweDYwLAorICAgIE5URlNfQVRfVk9MX0lORk8gICAgICAgICAgICAgICAgICAgID0gMHg3MCwKKyAgICBOVEZTX0FUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAsCisgICAgTlRGU19BVF9JTkRFWF9ST09UICAgICAgICAgICAgICAgICAgPSAweDkwLAorICAgIE5URlNfQVRfSU5ERVhfQUxMT0NBVElPTiAgICAgICAgICAgID0gMHhBMCwKKyAgICBOVEZTX0FUX0JJVE1BUCAgICAgICAgICAgICAgICAgICAgICA9IDB4QjAsCisgICAgTlRGU19BVF9SRVBBUlNFX1BPSU5UICAgICAgICAgICAgICAgPSAweEMwLAorICAgIE5URlNfQVRfRUFfSU5GTyAgICAgICAgICAgICAgICAgICAgID0gMHhEMCwKKyAgICBOVEZTX0FUX0VBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4RTAsCisgICAgTlRGU19BVF9QUk9QRVJUWV9TRVQgICAgICAgICAgICAgICAgPSAweEYwLAorICAgIE5URlNfQVRfTE9HR0VEX1VUSUxfU1RSRUFNICAgICAgICAgID0gMHgxMDAsCisgICAgTlRGU19BVF9GSVJTVF9VU0VSX0RFRklORURfQVRUUiAgICAgPSAweDEwMDAsCisgICAgTlRGU19BVF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweEZGRkZGRkZGLAorfTsKKworLyogTlRGUyBGaWxlIFBlcm1pc3Npb25zIChhbHNvIGNhbGxlZCBhdHRyaWJ1dGVzIGluIERPUyB0ZXJtaW5vbG9neSkgKi8KK2VudW0geworICAgIE5URlNfRklMRV9BVFRSX1JFQURPTkxZICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICAgIE5URlNfRklMRV9BVFRSX0hJRERFTiAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICAgIE5URlNfRklMRV9BVFRSX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICAgIE5URlNfRklMRV9BVFRSX0RJUkVDVE9SWSAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDEwLAorICAgIE5URlNfRklMRV9BVFRSX0FSQ0hJVkUgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDIwLAorICAgIE5URlNfRklMRV9BVFRSX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDQwLAorICAgIE5URlNfRklMRV9BVFRSX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDgwLAorICAgIE5URlNfRklMRV9BVFRSX1RFTVBPUkFSWSAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwLAorICAgIE5URlNfRklMRV9BVFRSX1NQQVJTRV9GSUxFICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMjAwLAorICAgIE5URlNfRklMRV9BVFRSX1JFUEFSU0VfUE9JTlQgICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwLAorICAgIE5URlNfRklMRV9BVFRSX0NPTVBSRVNTRUQgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwODAwLAorICAgIE5URlNfRklMRV9BVFRSX09GRkxJTkUgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAxMDAwLAorICAgIE5URlNfRklMRV9BVFRSX05PVF9DT05URU5UX0lOREVYRUQgICAgICAgICAgPSAweDAwMDAyMDAwLAorICAgIE5URlNfRklMRV9BVFRSX0VOQ1JZUFRFRCAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA0MDAwLAorICAgIE5URlNfRklMRV9BVFRSX1ZBTElEX0ZMQUdTICAgICAgICAgICAgICAgICAgPSAweDAwMDA3RkI3LAorICAgIE5URlNfRklMRV9BVFRSX1ZBTElEX1NFVF9GTEFHUyAgICAgICAgICAgICAgPSAweDAwMDAzMUE3LAorICAgIE5URlNfRklMRV9BVFRSX0RVUF9GSUxFX05BTUVfSU5ERVhfUFJFU0VOVCAgPSAweDEwMDAwMDAwLAorICAgIE5URlNfRklMRV9BVFRSX0RVUF9WSUVXX0lOREVYX1BSRVNFTlQgICAgICAgPSAweDIwMDAwMDAwLAorfTsKKworLyoKKyAqIE1hZ2ljIGlkZW50aWZpZXJzIHByZXNlbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbGwgbnRmcyByZWNvcmQgY29udGFpbmluZworICogcmVjb3JkcyAobGlrZSBtZnQgcmVjb3JkcyBmb3IgZXhhbXBsZSkuCisgKi8KK2VudW0geworICAgIC8qIEZvdW5kIGluICRNRlQvJERBVEEgKi8KKyAgICBOVEZTX01BR0lDX0ZJTEUgICAgID0gMHg0NTRDNDk0NiwgICAvKiBNRlQgZW50cnkgKi8KKyAgICBOVEZTX01BR0lDX0lORFggICAgID0gMHg1ODQ0NEU0OSwgICAvKiBJbmRleCBidWZmZXIgKi8KKyAgICBOVEZTX01BR0lDX0hPTEUgICAgID0gMHg0NTRDNEY0OCwKKworICAgIC8qIEZvdW5kIGluICRMb2dGaWxlLyREQVRBICovCisgICAgTlRGU19NQUdJQ19SU1RSICAgICA9IDB4NTI1NDUzNTIsCisgICAgTlRGU19NQUdJQ19SQ1JEICAgICA9IDB4NDQ1MjQzNTIsCisgICAgLyogRm91bmQgaW4gJExvZ0ZpbGUvJERBVEEgKE1heSBiZSBmb3VuZCBpbiAkTUZULyREQVRBLCBhbHNvID8pICovCisgICAgTlRGU19NQUdJQ19DSEtEU0sgICA9IDB4NDQ0QjQ4NDMsCisgICAgLyogRm91bmQgaW4gYWxsIG50ZnMgcmVjb3JkIGNvbnRhaW5pbmcgcmVjb3Jkcy4gKi8KKyAgICBOVEZTX01BR0lDX0JBQUQgICAgID0gMHg0NDQxNDE0MiwKKyAgICBOVEZTX01BR0lDX0VNUFRZICAgID0gMHhGRkZGRkZGRiwgICAvKiBSZWNvcmQgaXMgZW1wdHkgKi8KK307CisKK3N0cnVjdCBudGZzX3JlY29yZCB7CisgICAgdWludDMyX3QgbWFnaWM7CisgICAgdWludDE2X3QgdXNhX29mczsKKyAgICB1aW50MTZfdCB1c2FfY291bnQ7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSBOVEZTX1JFQ09SRDsKKworLyogVGhlICRNRlQgbWV0YWRhdGEgZmlsZSB0eXBlcyAqLworZW51bSBudGZzX3N5c3RlbV9maWxlIHsKKyAgICBGSUxFX01GVCAgICAgICAgICAgID0gMCwKKyAgICBGSUxFX01GVE1pcnIgICAgICAgID0gMSwKKyAgICBGSUxFX0xvZ0ZpbGUgICAgICAgID0gMiwKKyAgICBGSUxFX1ZvbHVtZSAgICAgICAgID0gMywKKyAgICBGSUxFX0F0dHJEZWYgICAgICAgID0gNCwKKyAgICBGSUxFX3Jvb3QgICAgICAgICAgID0gNSwKKyAgICBGSUxFX0JpdG1hcCAgICAgICAgID0gNiwKKyAgICBGSUxFX0Jvb3QgICAgICAgICAgID0gNywKKyAgICBGSUxFX0JhZENsdXMgICAgICAgID0gOCwKKyAgICBGSUxFX1NlY3VyZSAgICAgICAgID0gOSwKKyAgICBGSUxFX1VwQ2FzZSAgICAgICAgID0gMTAsCisgICAgRklMRV9FeHRlbmQgICAgICAgICA9IDExLAorICAgIEZJTEVfcmVzZXJ2ZWQxMiAgICAgPSAxMiwKKyAgICBGSUxFX3Jlc2VydmVkMTMgICAgID0gMTMsCisgICAgRklMRV9yZXNlcnZlZDE0ICAgICA9IDE0LAorICAgIEZJTEVfcmVzZXJ2ZWQxNSAgICAgPSAxNSwKKyAgICBGSUxFX3Jlc2VydmVkMTYgICAgID0gMTYsCit9OworCitlbnVtIHsKKyAgICBNRlRfUkVDT1JEX0lOX1VTRSAgICAgICA9IDB4MDAwMSwKKyAgICBNRlRfUkVDT1JEX0lTX0RJUkVDVE9SWSA9IDB4MDAwMiwKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgbnRmc19tZnRfcmVjb3JkIHsKKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB1aW50MTZfdCB1c2Ffb2ZzOworICAgIHVpbnQxNl90IHVzYV9jb3VudDsKKyAgICB1aW50NjRfdCBsc247CisgICAgdWludDE2X3Qgc2VxX25vOworICAgIHVpbnQxNl90IGxpbmtfY291bnQ7CisgICAgdWludDE2X3QgYXR0cnNfb2Zmc2V0OworICAgIHVpbnQxNl90IGZsYWdzOyAgICAgLyogTUZUIHJlY29yZCBmbGFncyAqLworICAgIHVpbnQzMl90IGJ5dGVzX2luX3VzZTsKKyAgICB1aW50MzJfdCBieXRlc19hbGxvY2F0ZWQ7CisgICAgdWludDY0X3QgYmFzZV9tZnRfcmVjb3JkOworICAgIHVpbnQxNl90IG5leHRfYXR0cl9pbnN0YW5jZTsKKyAgICB1aW50MTZfdCByZXNlcnZlZDsKKyAgICB1aW50MzJfdCBtZnRfcmVjb3JkX25vOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7ICAgLyogNDggYnl0ZXMgKi8KKworLyogVGhpcyBpcyB0aGUgdmVyc2lvbiB3aXRob3V0IHRoZSBOVEZTIDMuMSsgc3BlY2lmaWMgZmllbGRzICovCitzdHJ1Y3QgbnRmc19tZnRfcmVjb3JkX29sZCB7CisgICAgdWludDMyX3QgbWFnaWM7CisgICAgdWludDE2X3QgdXNhX29mczsKKyAgICB1aW50MTZfdCB1c2FfY291bnQ7CisgICAgdWludDY0X3QgbHNuOworICAgIHVpbnQxNl90IHNlcV9ubzsKKyAgICB1aW50MTZfdCBsaW5rX2NvdW50OworICAgIHVpbnQxNl90IGF0dHJzX29mZnNldDsKKyAgICB1aW50MTZfdCBmbGFnczsgICAgIC8qIE1GVCByZWNvcmQgZmxhZ3MgKi8KKyAgICB1aW50MzJfdCBieXRlc19pbl91c2U7CisgICAgdWludDMyX3QgYnl0ZXNfYWxsb2NhdGVkOworICAgIHVpbnQ2NF90IGJhc2VfbWZ0X3JlY29yZDsKKyAgICB1aW50MTZfdCBuZXh0X2F0dHJfaW5zdGFuY2U7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsgICAvKiA0MiBieXRlcyAqLworCitlbnVtIHsKKyAgICBBVFRSX0RFRl9JTkRFWEFCTEUgICAgICAgICAgPSAweDAyLAorICAgIEFUVFJfREVGX01VTFRJUExFICAgICAgICAgICA9IDB4MDQsCisgICAgQVRUUl9ERUZfTk9UX1pFUk8gICAgICAgICAgID0gMHgwOCwKKyAgICBBVFRSX0RFRl9JTkRFWEVEX1VOSVFVRSAgICAgPSAweDEwLAorICAgIEFUVFJfREVGX05BTUVEX1VOSVFVRSAgICAgICA9IDB4MjAsCisgICAgQVRUUl9ERUZfUkVTSURFTlQgICAgICAgICAgID0gMHg0MCwKKyAgICBBVFRSX0RFRl9BTFdBWVNfTE9HICAgICAgICAgPSAweDgwLAorfTsKKworc3RydWN0IG50ZnNfYXR0cl9yZWNvcmQgeworICAgIHVpbnQzMl90IHR5cGU7ICAgICAgLyogQXR0ci4gdHlwZSBjb2RlICovCisgICAgdWludDMyX3QgbGVuOworICAgIHVpbnQ4X3Qgbm9uX3Jlc2lkZW50OworICAgIHVpbnQ4X3QgbmFtZV9sZW47CisgICAgdWludDE2X3QgbmFtZV9vZmZzZXQ7CisgICAgdWludDE2X3QgZmxhZ3M7ICAgICAvKiBBdHRyLiBmbGFncyAqLworICAgIHVpbnQxNl90IGluc3RhbmNlOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsgICAgLyogUmVzaWRlbnQgYXR0cmlidXRlICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9sZW47CisgICAgICAgICAgICB1aW50MTZfdCB2YWx1ZV9vZmZzZXQ7CisgICAgICAgICAgICB1aW50OF90IGZsYWdzOyAgLyogRmxhZ3Mgb2YgcmVzaWRlbnQgYXR0cmlidXRlcyAqLworICAgICAgICAgICAgaW50OF90IHJlc2VydmVkOworICAgICAgICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSByZXNpZGVudDsKKyAgICAgICAgc3RydWN0IHsgICAgLyogTm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGxvd2VzdF92Y247CisgICAgICAgICAgICB1aW50NjRfdCBoaWdoZXN0X3ZjbjsKKyAgICAgICAgICAgIHVpbnQxNl90IG1hcHBpbmdfcGFpcnNfb2Zmc2V0OworICAgICAgICAgICAgdWludDhfdCBjb21wcmVzc2lvbl91bml0OworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFs1XTsKKyAgICAgICAgICAgIGludDY0X3QgYWxsb2NhdGVkX3NpemU7CisgICAgICAgICAgICBpbnQ2NF90IGRhdGFfc2l6ZTsgLyogQnl0ZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTm90ZTogaXQgY2FuIGJlIGxhcmdlciB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWxsb2NhdGVkX3NpemUgaWYgYXR0cmlidXRlIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY29tcHJlc3NlZCBvciBzcGFyc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQ2NF90IGluaXRpYWxpemVkX3NpemU7CisgICAgICAgICAgICBpbnQ2NF90IGNvbXByZXNzZWRfc2l6ZTsKKyAgICAgICAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgbm9uX3Jlc2lkZW50OworICAgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIGRhdGE7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyogQXR0cmlidXRlOiBBdHRyaWJ1dGUgTGlzdCAoMHgyMCkKKyAqIE5vdGU6IGl0IGNhbiBiZSBlaXRoZXIgcmVzaWRlbnQgb3Igbm9uLXJlc2lkZW50CisgKi8KK3N0cnVjdCBudGZzX2F0dHJfbGlzdF9lbnRyeSB7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgdWludDhfdCBuYW1lX2xlbmd0aDsKKyAgICB1aW50OF90IG5hbWVfb2Zmc2V0OworICAgIHVpbnQ2NF90IGxvd2VzdF92Y247CisgICAgdWludDY0X3QgbWZ0X3JlZjsKKyAgICB1aW50MTZfdCBpbnN0YW5jZTsKKyAgICB1aW50MTZfdCBuYW1lWzBdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgTlRGU19NQVhfRklMRV9OQU1FX0xFTiAyNTUKKworLyogUG9zc2libGUgbmFtZXNwYWNlcyBmb3IgZmlsZW5hbWVzIGluIG50ZnMgKDgtYml0KSAqLworZW51bSB7CisgICAgRklMRV9OQU1FX1BPU0lYICAgICAgICAgICAgID0gMHgwMCwKKyAgICBGSUxFX05BTUVfV0lOMzIgICAgICAgICAgICAgPSAweDAxLAorICAgIEZJTEVfTkFNRV9ET1MgICAgICAgICAgICAgICA9IDB4MDIsCisgICAgRklMRV9OQU1FX1dJTjMyX0FORF9ET1MgICAgID0gMHgwMywKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBBdHRyaWJ1dGU6IEZpbGVuYW1lICgweDMwKQorICogTm90ZTogYWx3YXlzIHJlc2lkZW50CisgKi8KK3N0cnVjdCBudGZzX2ZpbGVuYW1lX2F0dHIgeworICAgIHVpbnQ2NF90IHBhcmVudF9kaXJlY3Rvcnk7CisgICAgaW50NjRfdCBjdGltZTsKKyAgICBpbnQ2NF90IGF0aW1lOworICAgIGludDY0X3QgbXRpbWU7CisgICAgaW50NjRfdCBydGltZTsKKyAgICB1aW50NjRfdCBhbGxvY2F0ZWRfc2l6ZTsKKyAgICB1aW50NjRfdCBkYXRhX3NpemU7CisgICAgdWludDMyX3QgZmlsZV9hdHRyczsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MTZfdCBwYWNrZWRfZWFfc2l6ZTsKKyAgICAgICAgICAgIHVpbnQxNl90IHJlc2VydmVkOyAgICAgIC8qIHJlc2VydmVkIGZvciBhbGlnbm1lbnQgKi8KKyAgICAgICAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgZWE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBhcnNlX3BvaW50X3RhZzsKKyAgICAgICAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgcnA7CisgICAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgdHlwZTsKKyAgICB1aW50OF90IGZpbGVfbmFtZV9sZW47CisgICAgdWludDhfdCBmaWxlX25hbWVfdHlwZTsKKyAgICB1aW50MTZfdCBmaWxlX25hbWVbMF07ICAgICAgICAgIC8qIEZpbGUgbmFtZSBpbiBVbmljb2RlICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyogQXR0cmlidXRlOiBWb2x1bWUgTmFtZSAoMHg2MCkKKyAqIE5vdGU6IGFsd2F5cyByZXNpZGVudAorICogTm90ZTogUHJlc2VudCBvbmx5IGluIEZJTEVfdm9sdW1lCisgKi8KK3N0cnVjdCBudGZzX3ZvbF9uYW1lIHsKKyAgICB1aW50MTZfdCBuYW1lWzBdOyAgICAgICAvKiBUaGUgbmFtZSBvZiB0aGUgdm9sdW1lIGluIFVuaWNvZGUgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBBdHRyaWJ1dGU6IFZvbHVtZSBJbmZvcm1hdGlvbiAoMHg3MCkKKyAqIE5vdGU6IGFsd2F5cyByZXNpZGVudAorICogTm90ZTogcHJlc2VudCBvbmx5IGluIEZJTEVfVm9sdW1lCisgKi8KK3N0cnVjdCBudGZzX3ZvbF9pbmZvIHsKKyAgICB1aW50NjRfdCByZXNlcnZlZDsKKyAgICB1aW50OF90IG1ham9yX3ZlcjsKKyAgICB1aW50OF90IG1pbm9yX3ZlcjsKKyAgICB1aW50MTZfdCBmbGFnczsgICAgIC8qIFZvbHVtZSBmbGFncyAqLworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKy8qIEF0dHJpYnV0ZTogRGF0YSBhdHRyaWJ1dGUgKDB4ODApCisgKiBOb3RlOiBjYW4gYmUgZWl0aGVyIHJlc2lkZW50IG9yIG5vbi1yZXNpZGVudAorICovCitzdHJ1Y3QgbnRmc19kYXRhX2F0dHIgeworICAgIHVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBJbmRleCBoZWFkZXIgZmxhZ3MgKDgtYml0KSAqLworZW51bSB7CisgICAgU01BTExfSU5ERVggPSAwLAorICAgIExBUkdFX0lOREVYID0gMSwKKyAgICBMRUFGX05PREUgICA9IDAsCisgICAgSU5ERVhfTk9ERSAgPSAxLAorICAgIE5PREVfTUFTSyAgID0gMSwKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBIZWFkZXIgZm9yIHRoZSBpbmRleGVzLCBkZXNjcmliaW5nIHRoZSBJTkRFWF9FTlRSWSByZWNvcmRzLCB3aGljaAorICogZm9sbG93IHRoZSBzdHJ1Y3QgbnRmc19pZHhfaGVhZGVyLgorICovCitzdHJ1Y3QgbnRmc19pZHhfaGVhZGVyIHsKKyAgICB1aW50MzJfdCBlbnRyaWVzX29mZnNldDsKKyAgICB1aW50MzJfdCBpbmRleF9sZW47CisgICAgdWludDMyX3QgYWxsb2NhdGVkX3NpemU7CisgICAgdWludDhfdCBmbGFnczsgICAgICAgICAgICAgIC8qIEluZGV4IGhlYWRlciBmbGFncyAqLworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbM107ICAgICAgICAvKiBBbGlnbiB0byA4LWJ5dGUgYm91bmRhcnkgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBBdHRyaWJ1dGU6IEluZGV4IFJvb3QgKDB4OTApCisgKiBOb3RlOiBhbHdheXMgcmVzaWRlbnQKKyAqLworc3RydWN0IG50ZnNfaWR4X3Jvb3QgeworICAgIHVpbnQzMl90IHR5cGU7ICAvKiBJdCBpcyAkRklMRV9OQU1FIGZvciBkaXJlY3RvcmllcywgemVybyBmb3IgdmlldyBpbmRleGVzLgorICAgICAgICAgICAgICAgICAgICAgKiBObyBvdGhlciB2YWx1ZXMgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgdWludDMyX3QgY29sbGF0aW9uX3J1bGU7CisgICAgdWludDMyX3QgaW5kZXhfYmxvY2tfc2l6ZTsKKyAgICB1aW50OF90IGNsdXN0X3Blcl9pbmRleF9ibG9jazsKKyAgICB1aW50OF90IHJlc2VydmVkWzNdOworICAgIHN0cnVjdCBudGZzX2lkeF9oZWFkZXIgaW5kZXg7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyogQXR0cmlidXRlOiBJbmRleCBhbGxvY2F0aW9uICgweEEwKQorICogTm90ZTogYWx3YXlzIG5vbi1yZXNpZGVudCwgb2YgY291cnNlISA6LSkKKyAqLworc3RydWN0IG50ZnNfaWR4X2FsbG9jYXRpb24geworICAgIHVpbnQzMl90IG1hZ2ljOworICAgIHVpbnQxNl90IHVzYV9vZnM7ICAgICAgICAgICAvKiBVcGRhdGUgU2VxdWVuY2UgQXJyYXkgb2Zmc2V0cyAqLworICAgIHVpbnQxNl90IHVzYV9jb3VudDsgICAgICAgICAvKiBVcGRhdGUgU2VxdWVuY2UgQXJyYXkgbnVtYmVyIGluIGJ5dGVzICovCisgICAgaW50NjRfdCBsc247CisgICAgaW50NjRfdCBpbmRleF9ibG9ja192Y247ICAgIC8qIFZpcnR1YWwgY2x1c3RlciBudW1iZXIgb2YgdGhlIGluZGV4IGJsb2NrICovCisgICAgc3RydWN0IG50ZnNfaWR4X2hlYWRlciBpbmRleDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCitlbnVtIHsKKyAgICBJTkRFWF9FTlRSWV9OT0RFICAgICAgICAgICAgPSAxLAorICAgIElOREVYX0VOVFJZX0VORCAgICAgICAgICAgICA9IDIsCisgICAgLyogZm9yY2UgZW51bSBiaXQgd2lkdGggdG8gMTYtYml0ICovCisgICAgSU5ERVhfRU5UUllfU1BBQ0VfRklMVEVSICAgID0gMHhGRkZGLAorfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBudGZzX2lkeF9lbnRyeV9oZWFkZXIgeworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsgLyogT25seSB2YWxpZCB3aGVuIElOREVYX0VOVFJZX0VORCBpcyBub3Qgc2V0ICovCisgICAgICAgICAgICB1aW50NjRfdCBpbmRleGVkX2ZpbGU7CisgICAgICAgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIGRpcjsKKyAgICAgICAgc3RydWN0IHsgLyogVXNlZCBmb3Igdmlld3MvaW5kZXhlcyB0byBmaW5kIHRoZSBlbnRyeSdzIGRhdGEgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfb2Zmc2V0OworICAgICAgICAgICAgdWludDE2X3QgZGF0YV9sZW47CisgICAgICAgICAgICB1aW50MzJfdCByZXNlcnZlZFY7CisgICAgICAgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHZpOworICAgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIGRhdGE7CisgICAgdWludDE2X3QgbGVuOworICAgIHVpbnQxNl90IGtleV9sZW47CisgICAgdWludDE2X3QgZmxhZ3M7ICAgICAvKiBJbmRleCBlbnRyeSBmbGFncyAqLworICAgIHVpbnQxNl90IHJlc2VydmVkOyAgLyogQWxpZ24gdG8gOC1ieXRlIGJvdW5kYXJ5ICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworc3RydWN0IG50ZnNfaWR4X2VudHJ5IHsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7IC8qIE9ubHkgdmFsaWQgd2hlbiBJTkRFWF9FTlRSWV9FTkQgaXMgbm90IHNldCAqLworICAgICAgICAgICAgdWludDY0X3QgaW5kZXhlZF9maWxlOworICAgICAgICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSBkaXI7CisgICAgICAgIHN0cnVjdCB7IC8qIFVzZWQgZm9yIHZpZXdzL2luZGV4ZXMgdG8gZmluZCB0aGUgZW50cnkncyBkYXRhICovCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX29mZnNldDsKKyAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfbGVuOworICAgICAgICAgICAgdWludDMyX3QgcmVzZXJ2ZWRWOworICAgICAgICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB2aTsKKyAgICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSBkYXRhOworICAgIHVpbnQxNl90IGxlbjsKKyAgICB1aW50MTZfdCBrZXlfbGVuOworICAgIHVpbnQxNl90IGZsYWdzOyAgICAgLyogSW5kZXggZW50cnkgZmxhZ3MgKi8KKyAgICB1aW50MTZfdCByZXNlcnZlZDsgIC8qIEFsaWduIHRvIDgtYnl0ZSBib3VuZGFyeSAqLworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IG50ZnNfZmlsZW5hbWVfYXR0ciBmaWxlX25hbWU7CisgICAgICAgIC8vU0lJX0lOREVYX0tFWSBzaWk7CisgICAgICAgIC8vU0RIX0lOREVYX0tFWSBzZGg7CisgICAgICAgIC8vR1VJRCBvYmplY3RfaWQ7CisgICAgICAgIC8vUkVQQVJTRV9JTkRFWF9LRVkgcmVwYXJzZTsKKyAgICAgICAgLy9TSUQgc2lkOworICAgICAgICB1aW50MzJfdCBvd25lcl9pZDsKKyAgICB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSBrZXk7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbnRmc19zYl9pbmZvICpOVEZTX1NCKHN0cnVjdCBmc19pbmZvICpmcykKK3sKKyAgICByZXR1cm4gZnMtPmZzX2luZm87Cit9CisKKyNkZWZpbmUgTlRGU19QVlQoaSkgKChzdHJ1Y3QgbnRmc19pbm9kZSAqKSgoaSktPnB2dCkpCisKKyNlbmRpZiAvKiBfTlRGU19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9mcy9udGZzL3J1bmxpc3QuaCBiL2NvcmUvZnMvbnRmcy9ydW5saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzODY5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvbnRmcy9ydW5saXN0LmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBQYXVsbyBBbGNhbnRhcmEgPHBjYWNqckBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKyNpZm5kZWYgX1JVTkxJU1RfSF8KKyNkZWZpbmUgX1JVTkxJU1RfSF8KKworc3RydWN0IHJ1bmxpc3RfZWxlbWVudCB7CisgICAgdWludDY0X3QgdmNuOworICAgIGludDY0X3QgbGNuOworICAgIHVpbnQ2NF90IGxlbjsKK307CisKK3N0cnVjdCBydW5saXN0IHsKKyAgICBzdHJ1Y3QgcnVubGlzdF9lbGVtZW50IHJ1bjsKKyAgICBzdHJ1Y3QgcnVubGlzdCAqbmV4dDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnVubGlzdCAqdGFpbDsKKworc3RhdGljIGlubGluZSBib29sIHJ1bmxpc3RfaXNfZW1wdHkoc3RydWN0IHJ1bmxpc3QgKnJsaXN0KQoreworICAgIHJldHVybiAhcmxpc3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJ1bmxpc3QgKnJ1bmxpc3RfYWxsb2Modm9pZCkKK3sKKyAgICBzdHJ1Y3QgcnVubGlzdCAqcmxpc3Q7CisKKyAgICBybGlzdCA9IG1hbGxvYyhzaXplb2YgKnJsaXN0KTsKKyAgICBpZiAoIXJsaXN0KQorICAgICAgICBtYWxsb2NfZXJyb3IoInJ1bmxpc3Qgc3RydWN0dXJlIik7CisKKyAgICBybGlzdC0+bmV4dCA9IE5VTEw7CisKKyAgICByZXR1cm4gcmxpc3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydW5saXN0X2FwcGVuZChzdHJ1Y3QgcnVubGlzdCAqKnJsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcnVubGlzdF9lbGVtZW50ICplbGVtKQoreworICAgIHN0cnVjdCBydW5saXN0ICpuID0gcnVubGlzdF9hbGxvYygpOworCisgICAgbi0+cnVuID0gKmVsZW07CisKKyAgICBpZiAocnVubGlzdF9pc19lbXB0eSgqcmxpc3QpKSB7CisgICAgICAgICpybGlzdCA9IG47CisgICAgICAgIHRhaWwgPSBuOworICAgIH0gZWxzZSB7CisgICAgICAgIHRhaWwtPm5leHQgPSBuOworICAgICAgICB0YWlsID0gbjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJ1bmxpc3QgKnJ1bmxpc3RfcmVtb3ZlKHN0cnVjdCBydW5saXN0ICoqcmxpc3QpCit7CisgICAgc3RydWN0IHJ1bmxpc3QgKnJldDsKKworICAgIGlmIChydW5saXN0X2lzX2VtcHR5KCpybGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0ID0gKnJsaXN0OworICAgICpybGlzdCA9IHJldC0+bmV4dDsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBfUlVOTElTVF9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9mcy9weGUvYmlvcy5jIGIvY29yZS9mcy9weGUvYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjM3NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3B4ZS9iaW9zLmMKQEAgLTAsMCArMSw0NjAgQEAKKyNpbmNsdWRlIDxzeXNsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L21lbXNjYW4uaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSAicHhlLmgiCisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSA8Ymlvcy5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKworc3RhdGljIHVpbnQxNl90IHJlYWxfYmFzZV9tZW07CSAgIC8qIEFtb3VudCBvZiBET1MgbWVtb3J5IGFmdGVyIGZyZWVpbmcgKi8KKworc3RhdGljIGJvb2wgaGFzX2dweGU7CitzdGF0aWMgdWludDMyX3QgZ3B4ZV9mdW5jczsKKworZmFyX3B0cl90IFN0cnVjUHRyOworCisvKgorICogVmFsaWRpdHkgY2hlY2sgb24gcG9zc2libGUgIVBYRSBzdHJ1Y3R1cmUgaW4gYnVmCisgKiByZXR1cm4gMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXNfcHhlKGNvbnN0IHZvaWQgKmJ1ZikKK3sKKyAgICBjb25zdCBzdHJ1Y3QgcHhlX3QgKnB4ZSA9IGJ1ZjsKKyAgICBjb25zdCB1aW50OF90ICpwID0gYnVmOworICAgIGludCBpID0gcHhlLT5zdHJ1Y3RsZW5ndGg7CisgICAgdWludDhfdCBzdW0gPSAwOworCisgICAgaWYgKGkgPCBzaXplb2Yoc3RydWN0IHB4ZV90KSB8fAorCW1lbWNtcChweGUtPnNpZ25hdHVyZSwgIiFQWEUiLCA0KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3aGlsZSAoaS0tKQorICAgICAgICBzdW0gKz0gKnArKzsKKworICAgIHJldHVybiBzdW0gPT0gMDsKK30KKworLyoKKyAqIEp1c3QgbGlrZSBpc19weGUsIGl0IGNoZWNrcyBQWEVOVisgc3RydWN0dXJlCisgKgorICovCitzdGF0aWMgaW50IGlzX3B4ZW52KGNvbnN0IHZvaWQgKmJ1ZikKK3sKKyAgICBjb25zdCBzdHJ1Y3QgcHhlbnZfdCAqcHhlbnYgPSBidWY7CisgICAgY29uc3QgdWludDhfdCAqcCA9IGJ1ZjsKKyAgICBpbnQgaSA9IHB4ZW52LT5sZW5ndGg7CisgICAgdWludDhfdCBzdW0gPSAwOworCisgICAgLyogVGhlIHB4ZXB0ciBmaWVsZCBpc24ndCBwcmVzZW50IGluIG9sZCB2ZXJzaW9ucyAqLworICAgIGlmIChpIDwgb2Zmc2V0b2Yoc3RydWN0IHB4ZW52X3QsIHB4ZXB0cikgfHwKKwltZW1jbXAocHhlbnYtPnNpZ25hdHVyZSwgIlBYRU5WKyIsIDYpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHdoaWxlIChpLS0pCisgICAgICAgIHN1bSArPSAqcCsrOworCisgICAgcmV0dXJuIHN1bSA9PSAwOworfQorCisvKgorICogbWVtb3J5X3NjYW5fZm9yX3B4ZV9zdHJ1Y3Q6CisgKiBtZW1vcnlfc2Nhbl9mb3JfcHhlbnZfc3RydWN0OgorICoKKyAqCUlmIG5vbmUgb2YgdGhlIHN0YW5kYXJkIG1ldGhvZHMgZmluZCB0aGUgIVBYRS9QWEVOVisgc3RydWN0dXJlLAorICoJbG9vayBmb3IgaXQgYnkgc2Nhbm5pbmcgbWVtb3J5LgorICoKKyAqCXJldHVybiB0aGUgY29ycmVzcG9uZGluZyBweGUgc3RydWN0dXJlIGlmIGZvdW5kLCBvciBOVUxMOworICovCitzdGF0aWMgY29uc3Qgdm9pZCAqbWVtb3J5X3NjYW4odWludHB0cl90IHN0YXJ0LCBpbnQgKCpmdW5jKShjb25zdCB2b2lkICopKQoreworICAgIGNvbnN0IGNoYXIgKnB0cjsKKworICAgIC8qIFNjYW4gZWFjaCAxNiBieXRlcyBvZiBjb252ZW50aW9uYWwgbWVtb3J5IGJlZm9yZSB0aGUgVkdBIHJlZ2lvbiAqLworICAgIGZvciAocHRyID0gKGNvbnN0IGNoYXIgKilzdGFydDsgcHRyIDwgKGNvbnN0IGNoYXIgKikweEEwMDAwOyBwdHIgKz0gMTYpIHsKKyAgICAgICAgaWYgKGZ1bmMocHRyKSkKKyAgICAgICAgICAgIHJldHVybiBwdHI7CQkvKiBmb3VuZCBpdCEgKi8KKwlwdHIgKz0gMTY7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHB4ZV90ICptZW1vcnlfc2Nhbl9mb3JfcHhlX3N0cnVjdCh2b2lkKQoreworICAgIHVpbnQxNl90IHN0YXJ0ID0gYmlvc19mYm0oKTsgLyogU3RhcnRpbmcgc2VnbWVudCAqLworCisgICAgcmV0dXJuIG1lbW9yeV9zY2FuKHN0YXJ0IDw8IDEwLCBpc19weGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHB4ZW52X3QgKm1lbW9yeV9zY2FuX2Zvcl9weGVudl9zdHJ1Y3Qodm9pZCkKK3sKKyAgICByZXR1cm4gbWVtb3J5X3NjYW4oMHgxMDAwMCwgaXNfcHhlbnYpOworfQorCitzdGF0aWMgaW50IHB4ZWxpbnV4X3NjYW5fbWVtb3J5KHNjYW5fbWVtb3J5X2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCit7CisgICAgYWRkcl90IHN0YXJ0LCBzaXplOworICAgIGludCBydiA9IDA7CisKKyAgICBpZiAoS2VlcFBYRSkKKwlyZXR1cm4gMDsKKworICAgIC8qCisgICAgICogSWYgd2UgYXJlIHBsYW5uaW5nIG9uIGNhbGxpbmcgdW5sb2FkX3B4ZSgpIGFuZCB1bm1hcHBpbmcgdGhlIFBYRQorICAgICAqIHJlZ2lvbiBiZWZvcmUgd2UgdHJhbnNmZXIgY29udHJvbCBhd2F5IGZyb20gUFhFTElOVVggd2UgY2FuIG1hcmsKKyAgICAgKiB0aGF0IHJlZ2lvbiBhcyBTTVRfVEVSTUlOQUwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVnaW9uIHdpbGwKKyAgICAgKiBiZWNvbWUgZnJlZSBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCisgICAgICovCisgICAgc3RhcnQgPSBiaW9zX2ZibSgpIDw8IDEwOworICAgIHNpemUgPSAocmVhbF9iYXNlX21lbSAtIGJpb3NfZmJtKCkpIDw8IDEwOworICAgIGRwcmludGYoIk1hcmtpbmcgUFhFIHJlZ2lvbiAweCV4IC0gMHgleCBhcyBTTVRfVEVSTUlOQUxcbiIsCisJc3RhcnQsIHN0YXJ0ICsgc2l6ZSk7CisKKyAgICBjYWxsYmFjayhkYXRhLCBzdGFydCwgc2l6ZSwgU01UX1RFUk1JTkFMKTsKKyAgICByZXR1cm4gcnY7Cit9CisKKy8qCisgKiBGaW5kIHRoZSAhUFhFIHN0cnVjdHVyZTsgd2Ugc2VhcmNoIGZvciB0aGUgZm9sbG93aW5nLCBpbiBvcmRlcjoKKyAqCisgKiBhLiAhUFhFIHN0cnVjdHVyZSBhcyBTUzpbU1AgKyA0XQorICogYi4gUFhFTlYrIHN0cnVjdHVyZSBhdCBbRVM6QlhdCisgKiBjLiBJTlQgMUFoIEFYPTB4NTY1MCAtPiBQWEVOVisKKyAqIGQuIFNlYXJjaCBtZW1vcnkgZm9yICFQWEUKKyAqIGUuIFNlYXJjaCBtZW1vcnkgZm9yIFBYRU5WKworICoKKyAqIElmIHdlIGZpbmQgYSBQWEVOVisgc3RydWN0dXJlLCB3ZSB0cnkgdG8gZmluZCBhICFQWEUgc3RydWN0dXJlIGZyb20KKyAqIGlmIGlmIHRoZSBBUEkgdmVyc2lvbiBpcyAyLjEgb3IgbGF0ZXIKKyAqCisgKi8KK2ludCBweGVfaW5pdChib29sIHF1aWV0KQoreworICAgIGV4dGVybiB2b2lkIHB4ZV9pbnQxYSh2b2lkKTsKKyAgICBjaGFyIHBsYW4gPSAnQSc7CisgICAgdWludDE2X3Qgc2VnLCBvZmY7CisgICAgdWludDE2X3QgY29kZV9zZWcsIGNvZGVfbGVuOworICAgIHVpbnQxNl90IGRhdGFfc2VnLCBkYXRhX2xlbjsKKyAgICBjb25zdCBjaGFyICpiYXNlID0gR0VUX1BUUihJbml0U3RhY2spOworICAgIGNvbTMyc3lzX3QgcmVnczsKKyAgICBjb25zdCBjaGFyICp0eXBlOworICAgIGNvbnN0IHN0cnVjdCBweGVudl90ICpweGVudjsKKyAgICBjb25zdCBzdHJ1Y3QgcHhlX3QgKnB4ZTsKKworICAgIC8qIEFzc3VtZSBBUEkgdmVyc2lvbiAyLjEgKi8KKyAgICBBUElWZXIgPSAweDIwMTsKKworICAgIC8qIFBsYW4gQTogIVBYRSBzdHJ1Y3R1cmUgYXMgU1M6W1NQICsgNF0gKi8KKyAgICBvZmYgPSAqKGNvbnN0IHVpbnQxNl90ICopKGJhc2UgKyA0OCk7CisgICAgc2VnID0gKihjb25zdCB1aW50MTZfdCAqKShiYXNlICsgNTApOworICAgIHB4ZSA9IE1LX1BUUihzZWcsIG9mZik7CisgICAgaWYgKGlzX3B4ZShweGUpKQorICAgICAgICBnb3RvIGhhdmVfcHhlOworCisgICAgLyogUGxhbiBCOiBQWEVOVisgc3RydWN0dXJlIGF0IFtFUzpCWF0gKi8KKyAgICBwbGFuKys7CisgICAgb2ZmID0gKihjb25zdCB1aW50MTZfdCAqKShiYXNlICsgMjQpOyAgLyogT3JpZ2luYWwgQlggKi8KKyAgICBzZWcgPSAqKGNvbnN0IHVpbnQxNl90ICopKGJhc2UgKyA0KTsgICAvKiBPcmlnaW5hbCBFUyAqLworICAgIHB4ZW52ID0gTUtfUFRSKHNlZywgb2ZmKTsKKyAgICBpZiAoaXNfcHhlbnYocHhlbnYpKQorICAgICAgICBnb3RvIGhhdmVfcHhlbnY7CisKKyAgICAvKiBQbGFuIEM6IFBYRU5WKyBzdHJ1Y3R1cmUgdmlhIElOVCAxQWggQVg9NTY1MGggICovCisgICAgcGxhbisrOworICAgIG1lbXNldCgmcmVncywgMCwgc2l6ZW9mIHJlZ3MpOworICAgIHJlZ3MuZWF4LndbMF0gPSAweDU2NTA7CisgICAgY2FsbDE2KHB4ZV9pbnQxYSwgJnJlZ3MsICZyZWdzKTsKKyAgICBpZiAoIShyZWdzLmVmbGFncy5sICYgRUZMQUdTX0NGKSAmJiAocmVncy5lYXgud1swXSA9PSAweDU2NGUpKSB7CisJb2ZmID0gcmVncy5lYngud1swXTsKKwlzZWcgPSByZWdzLmVzOworCXB4ZW52ID0gTUtfUFRSKHNlZywgb2ZmKTsKKyAgICAgICAgaWYgKGlzX3B4ZW52KHB4ZW52KSkKKyAgICAgICAgICAgIGdvdG8gaGF2ZV9weGVudjsKKyAgICB9CisKKyAgICAvKiBQbGFuIEQ6ICFQWEUgbWVtb3J5IHNjYW4gKi8KKyAgICBwbGFuKys7CisgICAgaWYgKChweGUgPSBtZW1vcnlfc2Nhbl9mb3JfcHhlX3N0cnVjdCgpKSkgeworCW9mZiA9IE9GRlMocHhlKTsKKwlzZWcgPSBTRUcocHhlKTsKKyAgICAgICAgZ290byBoYXZlX3B4ZTsKKyAgICB9CisKKyAgICAvKiBQbGFuIEU6IFBYRU5WKyBtZW1vcnkgc2NhbiAqLworICAgIHBsYW4rKzsKKyAgICBpZiAoKHB4ZW52ID0gbWVtb3J5X3NjYW5fZm9yX3B4ZW52X3N0cnVjdCgpKSkgeworCW9mZiA9IE9GRlMocHhlbnYpOworCXNlZyA9IFNFRyhweGVudik7CisgICAgICAgIGdvdG8gaGF2ZV9weGVudjsKKyAgICB9CisKKyAgICAvKiBGb3VuZCBub3RoaW5nIGF0IGFsbCAhISAqLworICAgIGlmICghcXVpZXQpCisJZGRwcmludGYoIk5vICFQWEUgb3IgUFhFTlYrIEFQSSBmb3VuZDsgd2UncmUgZGVhZC4uLlxuIik7CisgICAgcmV0dXJuIC0xOworCisgaGF2ZV9weGVudjoKKyAgICBBUElWZXIgPSBweGVudi0+dmVyc2lvbjsKKyAgICBpZiAoIXF1aWV0KQorCWRkcHJpbnRmKCJGb3VuZCBQWEVOVisgc3RydWN0dXJlXG5QWEUgQVBJIHZlcnNpb24gaXMgJTA0eFxuIiwgQVBJVmVyKTsKKworICAgIC8qIGlmIHRoZSBBUEkgdmVyc2lvbiBudW1iZXIgaXMgMHgwMjAxIG9yIGhpZ2hlciwgdXNlIHRoZSAhUFhFIHN0cnVjdHVyZSAqLworICAgIGlmIChBUElWZXIgPj0gMHgyMDEpIHsKKwlpZiAocHhlbnYtPmxlbmd0aCA+PSBzaXplb2Yoc3RydWN0IHB4ZW52X3QpKSB7CisJICAgIHB4ZSA9IEdFVF9QVFIocHhlbnYtPnB4ZXB0cik7CisJICAgIGlmIChpc19weGUocHhlKSkKKwkJZ290byBoYXZlX3B4ZTsKKwkgICAgLyoKKwkgICAgICogTm9wZSwgIVBYRSBzdHJ1Y3R1cmUgbWlzc2luZyBkZXNwaXRlIEFQSSAyLjErLCBvciBhdCBsZWFzdAorCSAgICAgKiB0aGUgcG9pbnRlciBpcyBtaXNzaW5nLiBEbyBhIGxhc3QtZGl0Y2ggYXR0ZW1wdCB0byBmaW5kIGl0CisJICAgICAqLworCSAgICBpZiAoKHB4ZSA9IG1lbW9yeV9zY2FuX2Zvcl9weGVfc3RydWN0KCkpKQorCQlnb3RvIGhhdmVfcHhlOworCX0KKwlBUElWZXIgPSAweDIwMDsJCS8qIFBYRU5WKyBvbmx5LCBhc3N1bWUgdmVyc2lvbiAyLjAwICovCisgICAgfQorCisgICAgLyogT3RoZXJ3aXNlLCBubyBkaWNlLCB1c2UgUFhFTlYrIHN0cnVjdHVyZSAqLworICAgIGRhdGFfbGVuID0gcHhlbnYtPnVuZGlkYXRhc2l6ZTsKKyAgICBkYXRhX3NlZyA9IHB4ZW52LT51bmRpZGF0YXNlZzsKKyAgICBjb2RlX2xlbiA9IHB4ZW52LT51bmRpY29kZXNpemU7CisgICAgY29kZV9zZWcgPSBweGVudi0+dW5kaWNvZGVzZWc7CisgICAgUFhFRW50cnkgPSBweGVudi0+cm1lbnRyeTsKKyAgICB0eXBlID0gIlBYRU5WKyI7CisKKyAgICBnb3RvIGhhdmVfZW50cnlwb2ludDsKKworIGhhdmVfcHhlOgorICAgIGRhdGFfbGVuID0gcHhlLT5zZWdbUFhFX1NlZ19VTkRJRGF0YV0uc2l6ZTsKKyAgICBkYXRhX3NlZyA9IHB4ZS0+c2VnW1BYRV9TZWdfVU5ESURhdGFdLnNlbDsKKyAgICBjb2RlX2xlbiA9IHB4ZS0+c2VnW1BYRV9TZWdfVU5ESUNvZGVdLnNpemU7CisgICAgY29kZV9zZWcgPSBweGUtPnNlZ1tQWEVfU2VnX1VORElDb2RlXS5zZWw7CisgICAgUFhFRW50cnkgPSBweGUtPmVudHJ5cG9pbnRzcDsKKyAgICB0eXBlID0gIiFQWEUiOworCisgaGF2ZV9lbnRyeXBvaW50OgorICAgIFN0cnVjUHRyLm9mZnMgPSBvZmY7CisgICAgU3RydWNQdHIuc2VnICA9IHNlZzsKKworICAgIGlmICghcXVpZXQpIHsKKwlkZHByaW50ZigiJXMgZW50cnkgcG9pbnQgZm91bmQgKHdlIGhvcGUpIGF0ICUwNFg6JTA0WCB2aWEgcGxhbiAlY1xuIiwKKwkgICAgICAgdHlwZSwgUFhFRW50cnkuc2VnLCBQWEVFbnRyeS5vZmZzLCBwbGFuKTsKKwlkZHByaW50ZigiVU5ESSBjb2RlIHNlZ21lbnQgYXQgJTA0WCBsZW4gJTA0WFxuIiwgY29kZV9zZWcsIGNvZGVfbGVuKTsKKwlkZHByaW50ZigiVU5ESSBkYXRhIHNlZ21lbnQgYXQgJTA0WCBsZW4gJTA0WFxuIiwgZGF0YV9zZWcsIGRhdGFfbGVuKTsKKyAgICB9CisKKyAgICBzeXNsaW51eF9tZW1zY2FuX25ldyhweGVsaW51eF9zY2FuX21lbW9yeSk7CisKKyAgICBjb2RlX3NlZyA9IGNvZGVfc2VnICsgKChjb2RlX2xlbiArIDE1KSA+PiA0KTsKKyAgICBkYXRhX3NlZyA9IGRhdGFfc2VnICsgKChkYXRhX2xlbiArIDE1KSA+PiA0KTsKKworICAgIHJlYWxfYmFzZV9tZW0gPSBtYXgoY29kZV9zZWcsIGRhdGFfc2VnKSA+PiA2OyAvKiBDb252ZXJ0IHRvIGtpbG9ieXRlcyAqLworCisgICAgcHJvYmVfdW5kaSgpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZWUgaWYgd2UgaGF2ZSBnUFhFCisgKi8KK3ZvaWQgZ3B4ZV9pbml0KHZvaWQpCit7CisgICAgaW50IGVycjsKKyAgICBzdGF0aWMgX19sb3dtZW0gc3RydWN0IHNfUFhFTlZfRklMRV9BUElfQ0hFQ0sgYXBpX2NoZWNrOworCisgICAgaWYgKEFQSVZlciA+PSAweDIwMSkgeworCWFwaV9jaGVjay5TaXplID0gc2l6ZW9mIGFwaV9jaGVjazsKKwlhcGlfY2hlY2suTWFnaWMgPSAweDkxZDQ0N2IyOworCWVyciA9IHB4ZV9jYWxsKFBYRU5WX0ZJTEVfQVBJX0NIRUNLLCAmYXBpX2NoZWNrKTsKKwlpZiAoIWVyciAmJiBhcGlfY2hlY2suTWFnaWMgPT0gMHhlOWMxN2IyMCkKKwkgICAgZ3B4ZV9mdW5jcyA9IGFwaV9jaGVjay5BUElNYXNrOworICAgIH0KKworICAgIC8qIE5lY2Vzc2FyeSBmdW5jdGlvbnMgZm9yIHVzIHRvIHVzZSB0aGUgZ1BYRSBmaWxlIEFQSSAqLworICAgIGhhc19ncHhlID0gKH5ncHhlX2Z1bmNzICYgMHg0YikgPT0gMDsKK30KKworCisvKioKKyAqIEdldCBhIERIQ1AgcGFja2V0IGZyb20gdGhlIFBYRSBzdGFjayBpbnRvIGEgbG93bWVtIGJ1ZmZlcgorICoKKyAqIEBwYXJhbTogIHR5cGUsICBwYWNrZXQgdHlwZQorICogQHJldHVybjogYnVmZmVyIHNpemUKKyAqCisgKi8KK3N0YXRpYyBpbnQgcHhlX2dldF9jYWNoZWRfaW5mbyhpbnQgdHlwZSwgdm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6KQoreworICAgIGludCBlcnI7CisgICAgc3RhdGljIF9fbG93bWVtIHN0cnVjdCBzX1BYRU5WX0dFVF9DQUNIRURfSU5GTyBnZXRfY2FjaGVkX2luZm87CisgICAgZGRwcmludGYoIiAlMDJ4IiwgdHlwZSk7CisKKyAgICBtZW1zZXQoJmdldF9jYWNoZWRfaW5mbywgMCwgc2l6ZW9mIGdldF9jYWNoZWRfaW5mbyk7CisgICAgZ2V0X2NhY2hlZF9pbmZvLlBhY2tldFR5cGUgID0gdHlwZTsKKyAgICBnZXRfY2FjaGVkX2luZm8uQnVmZmVyU2l6ZSAgPSBidWZzaXo7CisgICAgZ2V0X2NhY2hlZF9pbmZvLkJ1ZmZlciAgICAgID0gRkFSX1BUUihidWYpOworICAgIGVyciA9IHB4ZV9jYWxsKFBYRU5WX0dFVF9DQUNIRURfSU5GTywgJmdldF9jYWNoZWRfaW5mbyk7CisgICAgaWYgKGVycikgeworICAgICAgICBkZHByaW50ZigiUFhFIEFQSSBjYWxsIGZhaWxlZCwgZXJyb3IgICUwNHhcbiIsIGVycik7CisJa2Fib29tKCk7CisgICAgfQorCisgICAgcmV0dXJuIGdldF9jYWNoZWRfaW5mby5CdWZmZXJTaXplOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB1bmxvYWRzIHRoZSBQWEUgYW5kIFVOREkgc3RhY2tzIGFuZAorICogdW5jbGFpbXMgdGhlIG1lbW9yeS4KKyAqLworX19leHBvcnQgdm9pZCB1bmxvYWRfcHhlKHVpbnQxNl90IGZsYWdzKQoreworICAgIC8qIFBYRSB1bmxvYWQgc2VxdWVuY2VzICovCisgICAgLyoKKyAgICAgKiBpUFhFIGRvZXM6CisgICAgICogVU5ESV9TSFVURE9XTiwgVU5ESV9DTEVBTlVQLCBTVE9QX1VOREkKKyAgICAgKiBPbGRlciBTeXNsaW51eCBkaWQ6CisgICAgICogVURQX0NMT1NFLCBVTkRJX1NIVVRET1dOLCBVTkxPQURfU1RBQ0ssIFNUT1BfVU5ESS9VTkRJX0NMRUFOVVAKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBuZXdfYXBpX3VubG9hZFtdID0geworCVBYRU5WX1VORElfU0hVVERPV04sIFBYRU5WX1VOTE9BRF9TVEFDSywgUFhFTlZfU1RPUF9VTkRJLCAwCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBvbGRfYXBpX3VubG9hZFtdID0geworCVBYRU5WX1VORElfU0hVVERPV04sIFBYRU5WX1VOTE9BRF9TVEFDSywgUFhFTlZfVU5ESV9DTEVBTlVQLCAwCisgICAgfTsKKworICAgIHVuc2lnbmVkIGludCBhcGk7CisgICAgY29uc3QgdWludDhfdCAqYXBpX3B0cjsKKyAgICBpbnQgZXJyOworICAgIHNpemVfdCBpbnRfYWRkcjsKKyAgICBzdGF0aWMgX19sb3dtZW0gdW5pb24geworCXN0cnVjdCBzX1BYRU5WX1VORElfU0hVVERPV04gdW5kaV9zaHV0ZG93bjsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkxPQURfU1RBQ0sgdW5sb2FkX3N0YWNrOworCXN0cnVjdCBzX1BYRU5WX1NUT1BfVU5ESSBzdG9wX3VuZGk7CisJc3RydWN0IHNfUFhFTlZfVU5ESV9DTEVBTlVQIHVuZGlfY2xlYW51cDsKKwl1aW50MTZfdCBTdGF0dXM7CS8qIEFsbCBjYWxscyBoYXZlIHRoaXMgYXMgdGhlIGZpcnN0IG1lbWJlciAqLworICAgIH0gdW5sb2FkX2NhbGw7CisKKyAgICBkcHJpbnRmKCJDYWxsZWQgdW5sb2FkX3B4ZSgpLi4uXG4iKTsKKyAgICBkcHJpbnRmKCJGQk0gYmVmb3JlIHVubG9hZCA9ICVkXG4iLCBiaW9zX2ZibSgpKTsKKworICAgIGVyciA9IHJlc2V0X3B4ZSgpOworCisgICAgZHByaW50ZigiRkJNIGFmdGVyIHJlc2V0X3B4ZSA9ICVkLCBlcnIgPSAlZFxuIiwgYmlvc19mYm0oKSwgZXJyKTsKKworICAgIC8qIElmIHdlIHdhbnQgdG8ga2VlcCBQWEUgYXJvdW5kLCB3ZSBzdGlsbCBuZWVkIHRvIHJlc2V0IGl0ICovCisgICAgaWYgKGZsYWdzIHx8IGVycikKKwlyZXR1cm47CisKKyAgICBkcHJpbnRmKCJBUElWZXIgPSAlMDR4XG4iLCBBUElWZXIpOworCisgICAgYXBpX3B0ciA9IEFQSVZlciA+PSAweDAyMDAgPyBuZXdfYXBpX3VubG9hZCA6IG9sZF9hcGlfdW5sb2FkOworICAgIHdoaWxlKChhcGkgPSAqYXBpX3B0cisrKSkgeworCWRwcmludGYoIlBYRSBjYWxsICUwNHhcbiIsIGFwaSk7CisJbWVtc2V0KCZ1bmxvYWRfY2FsbCwgMCwgc2l6ZW9mIHVubG9hZF9jYWxsKTsKKwllcnIgPSBweGVfY2FsbChhcGksICZ1bmxvYWRfY2FsbCk7CisJaWYgKGVyciB8fCB1bmxvYWRfY2FsbC5TdGF0dXMgIT0gUFhFTlZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkgICAgZGRwcmludGYoIlBYRSB1bmxvYWQgQVBJIGNhbGwgJTA0eCBmYWlsZWQ6IDB4JXhcbiIsCisJCSAgIGFwaSwgdW5sb2FkX2NhbGwuU3RhdHVzKTsKKwkgICAgZ290byBjYW50X2ZyZWU7CisJfQorICAgIH0KKworICAgIGFwaSA9IDB4ZmYwMDsKKyAgICBpZiAocmVhbF9iYXNlX21lbSA8PSBiaW9zX2ZibSgpKSB7ICAvKiBTYW5pdHkgY2hlY2sgKi8KKwlkcHJpbnRmKCJGQk0gJWQgPCByZWFsX2Jhc2VfbWVtICVkXG4iLCBiaW9zX2ZibSgpLCByZWFsX2Jhc2VfbWVtKTsKKwlnb3RvIGNhbnRfZnJlZTsKKyAgICB9CisgICAgYXBpKys7CisKKyAgICAvKiBDaGVjayB0aGF0IFBYRSBhY3R1YWxseSB1bmhvb2tlZCB0aGUgSU5UIDB4MUEgY2hhaW4gKi8KKyAgICBpbnRfYWRkciA9IChzaXplX3QpR0VUX1BUUigqKGZhcl9wdHJfdCAqKSg0ICogMHgxYSkpOworICAgIGludF9hZGRyID4+PSAxMDsKKyAgICBpZiAoaW50X2FkZHIgPj0gcmVhbF9iYXNlX21lbSB8fCBpbnRfYWRkciA8IGJpb3NfZmJtKCkpIHsKKwlzZXRfYmlvc19mYm0ocmVhbF9iYXNlX21lbSk7CisJZHByaW50ZigiRkJNIGFmdGVyIHVubG9hZF9weGUgPSAlZFxuIiwgYmlvc19mYm0oKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGRwcmludGYoIkNhbid0IGZyZWUgRkJNLCByZWFsX2Jhc2VfbWVtID0gJWQsICIKKwkgICAgIkZCTSA9ICVkLCBJTlQgMUEgPSAlMDh4ICglZClcbiIsCisJICAgIHJlYWxfYmFzZV9tZW0sIGJpb3NfZmJtKCksCisJICAgICoodWludDMyX3QgKikoNCAqIDB4MWEpLCBpbnRfYWRkcik7CisKK2NhbnRfZnJlZToKKyAgICBkZHByaW50ZigiRmFpbGVkIHRvIGZyZWUgYmFzZSBtZW1vcnkgZXJyb3IgJTA0eC0lMDh4ICglZC8lZEspXG4iLAorCSAgIGFwaSwgKih1aW50MzJfdCAqKSg0ICogMHgxYSksIGJpb3NfZmJtKCksIHJlYWxfYmFzZV9tZW0pOworICAgIHJldHVybjsKK30KKworZXh0ZXJuIGNvbnN0IGNoYXIgYmRoY3BfZGF0YVtdLCBhZGhjcF9kYXRhW107CitleHRlcm4gY29uc3QgdWludDMyX3QgYmRoY3BfbGVuLCBhZGhjcF9sZW47CisKK3ZvaWQgbmV0X3BhcnNlX2RoY3Aodm9pZCkKK3sKKyAgICBpbnQgcGt0X2xlbjsKKyAgICBzdHJ1Y3QgYm9vdHBfdCAqYnA7CisgICAgY29uc3Qgc2l6ZV90IGRoY3BfbWF4X3BhY2tldCA9IDQwOTY7CisKKyAgICBicCA9IGxtYWxsb2MoZGhjcF9tYXhfcGFja2V0KTsKKyAgICBpZiAoIWJwKSB7CisJZGRwcmludGYoIk91dCBvZiBsb3cgbWVtb3J5XG4iKTsKKwlrYWJvb20oKTsKKyAgICB9CisKKyAgICAqTG9jYWxEb21haW4gPSAwOyAgIC8qIE5vIExvY2FsRG9tYWluIHJlY2VpdmVkICovCisKKyAgICAvKgorICAgICAqIFBhcnNlIGFueSAiYmVmb3JlIiBoYXJkY29kZWQgb3B0aW9ucworICAgICAqLworICAgIGRwcmludGYoIkRIQ1A6IGJkaGNwX2xlbiA9ICVkXG4iLCBiZGhjcF9sZW4pOworICAgIHBhcnNlX2RoY3Bfb3B0aW9ucyhiZGhjcF9kYXRhLCBiZGhjcF9sZW4sIDApOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIERIQ1AgY2xpZW50IGlkZW50aWZpZXJzIChxdWVyeSBpbmZvIDEpCisgICAgICovCisgICAgZGRwcmludGYoIkdldHRpbmcgY2FjaGVkIHBhY2tldCAiKTsKKyAgICBwa3RfbGVuID0gcHhlX2dldF9jYWNoZWRfaW5mbygxLCBicCwgZGhjcF9tYXhfcGFja2V0KTsKKyAgICBwYXJzZV9kaGNwKGJwLCBwa3RfbGVuKTsKKworICAgIC8qCisgICAgICogV2UgZG9uJ3QgdXNlIGZsYWdzIGZyb20gdGhlIHJlcXVlc3QgcGFja2V0LCBzbworICAgICAqIHRoaXMgaXMgYSBnb29kIHRpbWUgdG8gaW5pdGlhbGl6ZSBESENQTWFnaWMuLi4KKyAgICAgKiBJbml0aWFsaXplIGl0IHRvIDEgbWVhbmluZyB3ZSB3aWxsIGFjY2VwdCBvcHRpb25zIGZvdW5kOworICAgICAqIGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgUFhFTElOVVggYml0IDAgd2FzIHVzZWQgdG8gaW5kaWNhdGUKKyAgICAgKiB3ZSBoYXZlIGZvdW5kIG9wdGlvbiAyMDggd2l0aCB0aGUgYXBwcm9wcmlhdGUgbWFnaWMgbnVtYmVyOworICAgICAqIHdlIG5vIGxvbmdlciByZXF1aXJlIHRoYXQsIGJ1dCBNQVkgd2FudCB0byByZS1pbnRyb2R1Y2UKKyAgICAgKiBpdCBpbiB0aGUgZnV0dXJlIGZvciB2ZW5kb3IgZW5jYXBzdWxhdGVkIG9wdGlvbnMuCisgICAgICovCisgICAgKihjaGFyICopJkRIQ1BNYWdpYyA9IDE7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgQk9PVFAvREhDUCBwYWNrZXQgdGhhdCBicm91Z2h0IHVzIGZpbGUgKGFuZCBhbiBJUAorICAgICAqIGFkZHJlc3MpLiBUaGlzIGxpdmVzIGluIHRoZSBESENQQUNLIHBhY2tldCAocXVlcnkgaW5mbyAyKQorICAgICAqLworICAgIHBrdF9sZW4gPSBweGVfZ2V0X2NhY2hlZF9pbmZvKDIsIGJwLCBkaGNwX21heF9wYWNrZXQpOworICAgIHBhcnNlX2RoY3AoYnAsIHBrdF9sZW4pOworICAgIC8qCisgICAgICogU2F2ZSBhd2F5IE1BQyBhZGRyZXNzIChhc3N1bWUgdGhpcyBpcyBpbiBxdWVyeSBpbmZvIDIuIElmIHRoaXMKKyAgICAgKiB0dXJucyBvdXQgdG8gYmUgcHJvYmxlbWF0aWMgaXQgbWlnaHQgYmUgYmV0dGVyIGdldHRpbmcgaXQgZnJvbQorICAgICAqIHRoZSBxdWVyeSBpbmZvIDEgcGFja2V0CisgICAgICovCisgICAgTUFDX2xlbiA9IGJwLT5oYXJkbGVuID4gMTYgPyAwIDogYnAtPmhhcmRsZW47CisgICAgTUFDX3R5cGUgPSBicC0+aGFyZHdhcmU7CisgICAgbWVtY3B5KE1BQywgYnAtPm1hY2FkZHIsIE1BQ19sZW4pOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGJvb3QgZmlsZSBhbmQgb3RoZXIgaW5mby4gVGhpcyBsaXZlcyBpbiB0aGUgQ0FDSEVEX1JFUExZCisgICAgICogcGFja2V0IChxdWVyeSBpbmZvIDMpCisgICAgICovCisgICAgcGt0X2xlbiA9IHB4ZV9nZXRfY2FjaGVkX2luZm8oMywgYnAsIGRoY3BfbWF4X3BhY2tldCk7CisgICAgcGFyc2VfZGhjcChicCwgcGt0X2xlbik7CisgICAgZGRwcmludGYoIlxuIik7CisKKyAgICAvKgorICAgICAqIFBhcnNlIGFueSAiYWZ0ZXIiIGhhcmRjb2RlZCBvcHRpb25zCisgICAgICovCisgICAgZHByaW50ZigiREhDUDogYWRoY3BfbGVuID0gJWRcbiIsIGFkaGNwX2xlbik7CisgICAgcGFyc2VfZGhjcF9vcHRpb25zKGFkaGNwX2RhdGEsIGFkaGNwX2xlbiwgMCk7CisKKyAgICBsZnJlZShicCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL3B4ZS9jb3JlLmMgYi9jb3JlL2ZzL3B4ZS9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzYWM0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvcHhlL2NvcmUuYwpAQCAtMCwwICsxLDM0NCBAQAorI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZV9hcGkuaD4KKyNpbmNsdWRlIDxsd2lwL2FwaS5oPgorI2luY2x1ZGUgPGx3aXAvdGNwaXAuaD4KKyNpbmNsdWRlIDxsd2lwL2Rucy5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlICJweGUuaCIKKworI2luY2x1ZGUgPGRwcmludGYuaD4KKworY29uc3Qgc3RydWN0IHVybF9zY2hlbWUgdXJsX3NjaGVtZXNbXSA9IHsKKyAgICB7ICJ0ZnRwIiwgdGZ0cF9vcGVuLCAwIH0sCisgICAgeyAiaHR0cCIsIGh0dHBfb3BlbiwgT19ESVJFQ1RPUlkgfSwKKyAgICB7ICJmdHAiLCAgZnRwX29wZW4sICBPX0RJUkVDVE9SWSB9LAorICAgIHsgTlVMTCwgTlVMTCwgMCB9LAorfTsKKworLyoqCisgKiBPcGVuIGEgc29ja2V0CisgKgorICogQHBhcmFtOnNvY2tldCwgdGhlIHNvY2tldCB0byBvcGVuCisgKgorICogQG91dDogZXJyb3IgY29kZSwgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBjb3JlX3VkcF9vcGVuKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQpCit7CisgICAgc3RydWN0IG5ldF9wcml2YXRlX2x3aXAgKnByaXYgPSAmc29ja2V0LT5uZXQubHdpcDsKKyAgICBpbnQgZXJyOworCisgICAgcHJpdi0+Y29ubiA9IG5ldGNvbm5fbmV3KE5FVENPTk5fVURQKTsKKyAgICBpZiAoIXByaXYtPmNvbm4pCisJcmV0dXJuIC0xOworCisgICAgcHJpdi0+Y29ubi0+cmVjdl90aW1lb3V0ID0gMTU7IC8qIEEgMTUgbXMgcmVjdiB0aW1lb3V0Li4uICovCisgICAgZXJyID0gbmV0Y29ubl9iaW5kKHByaXYtPmNvbm4sIE5VTEwsIDApOworICAgIGlmIChlcnIpIHsKKwlkZHByaW50ZigibmV0Y29ubl9iaW5kIGVycm9yICVkXG4iLCBlcnIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDbG9zZSBhIHNvY2tldAorICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBzb2NrZXQgdG8gb3BlbgorICovCit2b2lkIGNvcmVfdWRwX2Nsb3NlKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQpCit7CisgICAgc3RydWN0IG5ldF9wcml2YXRlX2x3aXAgKnByaXYgPSAmc29ja2V0LT5uZXQubHdpcDsKKworICAgIGlmIChwcml2LT5jb25uKSB7CisJbmV0Y29ubl9kZWxldGUocHJpdi0+Y29ubik7CisJcHJpdi0+Y29ubiA9IE5VTEw7CisgICAgfQorfQorCisvKioKKyAqIEVzdGFibGlzaCBhIGNvbm5lY3Rpb24gb24gYW4gb3BlbiBzb2NrZXQKKyAqCisgKiBAcGFyYW06c29ja2V0LCB0aGUgb3BlbiBzb2NrZXQKKyAqIEBwYXJhbTppcCwgdGhlIGlwIGFkZHJlc3MKKyAqIEBwYXJhbTpwb3J0LCB0aGUgcG9ydCBudW1iZXIsIGhvc3QtYnl0ZSBvcmRlcgorICovCit2b2lkIGNvcmVfdWRwX2Nvbm5lY3Qoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgdWludDMyX3QgaXAsCisJCSAgICAgIHVpbnQxNl90IHBvcnQpCit7CisgICAgc3RydWN0IG5ldF9wcml2YXRlX2x3aXAgKnByaXYgPSAmc29ja2V0LT5uZXQubHdpcDsKKyAgICBzdHJ1Y3QgaXBfYWRkciBhZGRyOworCisgICAgZHByaW50ZigibmV0X2NvcmVfY29ubmVjdDogJTA4WCAlMDRYXG4iLCBudG9obChpcCksIHBvcnQpOworICAgIGFkZHIuYWRkciA9IGlwOworICAgIG5ldGNvbm5fY29ubmVjdChwcml2LT5jb25uLCAmYWRkciwgcG9ydCk7Cit9CisKKy8qKgorICogVGVhciBkb3duIGEgY29ubmVjdGlvbiBvbiBhbiBvcGVuIHNvY2tldAorICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBvcGVuIHNvY2tldAorICovCit2b2lkIGNvcmVfdWRwX2Rpc2Nvbm5lY3Qoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCkKK3sKKyAgICBzdHJ1Y3QgbmV0X3ByaXZhdGVfbHdpcCAqcHJpdiA9ICZzb2NrZXQtPm5ldC5sd2lwOworICAgIG5ldGNvbm5fZGlzY29ubmVjdChwcml2LT5jb25uKTsKK30KKworLyoqCisgKiBSZWFkIGRhdGEgZnJvbSB0aGUgbmV0d29yayBzdGFjaworICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBvcGVuIHNvY2tldAorICogQHBhcmFtOmJ1ZiwgbG9jYXRpb24gb2YgYnVmZmVyIHRvIHN0b3JlIGRhdGEKKyAqIEBwYXJhbTpidWZfbGVuLCBzaXplIG9mIGJ1ZmZlcgorCisgKiBAb3V0OiBzcmNfaXAsIGlwIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc291cmNlCisgKiBAb3V0OiBzcmNfcG9ydCwgcG9ydCBudW1iZXIgb2YgdGhlIGRhdGEgc291cmNlLCBob3N0LWJ5dGUgb3JkZXIKKyAqLworaW50IGNvcmVfdWRwX3JlY3Yoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgdm9pZCAqYnVmLCB1aW50MTZfdCAqYnVmX2xlbiwKKwkJICB1aW50MzJfdCAqc3JjX2lwLCB1aW50MTZfdCAqc3JjX3BvcnQpCit7CisgICAgc3RydWN0IG5ldF9wcml2YXRlX2x3aXAgKnByaXYgPSAmc29ja2V0LT5uZXQubHdpcDsKKyAgICBzdHJ1Y3QgbmV0YnVmICpuYnVmOworICAgIHUxNl90IG5idWZfbGVuOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBuZXRjb25uX3JlY3YocHJpdi0+Y29ubiwgJm5idWYpOworICAgIGlmIChlcnIpCisJcmV0dXJuIGVycjsKKworICAgIGlmICghbmJ1ZikKKwlyZXR1cm4gLTE7CisKKyAgICAqc3JjX2lwID0gbmV0YnVmX2Zyb21hZGRyKG5idWYpLT5hZGRyOworICAgICpzcmNfcG9ydCA9IG5ldGJ1Zl9mcm9tcG9ydChuYnVmKTsKKworICAgIG5ldGJ1Zl9maXJzdChuYnVmKTsJCS8qIFhYWCBuZWVkZWQ/ICovCisgICAgbmJ1Zl9sZW4gPSBuZXRidWZfbGVuKG5idWYpOworICAgIGlmIChuYnVmX2xlbiA8PSAqYnVmX2xlbikKKwluZXRidWZfY29weShuYnVmLCBidWYsIG5idWZfbGVuKTsKKyAgICBlbHNlCisJbmJ1Zl9sZW4gPSAwOyAvKiBpbXBvc3NpYmxlIG10dSA8IFBLVEJVRl9TSVpFICovCisgICAgbmV0YnVmX2RlbGV0ZShuYnVmKTsKKworICAgICpidWZfbGVuID0gbmJ1Zl9sZW47CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2VuZCBhIFVEUCBwYWNrZXQuCisgKgorICogQHBhcmFtOnNvY2tldCwgdGhlIG9wZW4gc29ja2V0CisgKiBAcGFyYW06ZGF0YSwgZGF0YSBidWZmZXIgdG8gc2VuZAorICogQHBhcmFtOmxlbiwgc2l6ZSBvZiBkYXRhIGJ1ZmVyCisgKi8KK3ZvaWQgY29yZV91ZHBfc2VuZChzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIHN0cnVjdCBuZXRjb25uICpjb25uID0gc29ja2V0LT5uZXQubHdpcC5jb25uOworICAgIHN0cnVjdCBuZXRidWYgKm5idWY7CisgICAgdm9pZCAqcGJ1ZjsKKyAgICBpbnQgZXJyOworCisgICAgbmJ1ZiA9IG5ldGJ1Zl9uZXcoKTsKKyAgICBpZiAoIW5idWYpIHsKKwlkZHByaW50ZigibmV0YnVmIGFsbG9jYXRpb24gZXJyb3JcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwYnVmID0gbmV0YnVmX2FsbG9jKG5idWYsIGxlbik7CisgICAgaWYgKCFwYnVmKSB7CisJZGRwcmludGYoInBidWYgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgbWVtY3B5KHBidWYsIGRhdGEsIGxlbik7CisKKyAgICBlcnIgPSBuZXRjb25uX3NlbmQoY29ubiwgbmJ1Zik7CisgICAgaWYgKGVycikgeworCWRkcHJpbnRmKCJuZXRjb25uX3NlbmQgZXJyb3IgJWRcbiIsIGVycik7CisJZ290byBvdXQ7CisgICAgfQorCitvdXQ6CisgICAgbmV0YnVmX2RlbGV0ZShuYnVmKTsKK30KKworIC8qKgorICogU2VuZCBhIFVEUCBwYWNrZXQgdG8gYSBkZXN0aW5hdGlvbgorICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBvcGVuIHNvY2tldAorICogQHBhcmFtOmRhdGEsIGRhdGEgYnVmZmVyIHRvIHNlbmQKKyAqIEBwYXJhbTpsZW4sIHNpemUgb2YgZGF0YSBidWZlcgorICogQHBhcmFtOmlwLCB0aGUgaXAgYWRkcmVzcworICogQHBhcmFtOnBvcnQsIHRoZSBwb3J0IG51bWJlciwgaG9zdC1ieXRlIG9yZGVyCisgKi8KK3ZvaWQgY29yZV91ZHBfc2VuZHRvKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgc2l6ZV90IGxlbiwgdWludDMyX3QgaXAsIHVpbnQxNl90IHBvcnQpCit7CisgICAgc3RydWN0IG5ldGNvbm4gKmNvbm4gPSBzb2NrZXQtPm5ldC5sd2lwLmNvbm47CisgICAgc3RydWN0IGlwX2FkZHIgYWRkcjsKKyAgICBzdHJ1Y3QgbmV0YnVmICpuYnVmOworICAgIHZvaWQgKnBidWY7CisgICAgaW50IGVycjsKKworICAgIG5idWYgPSBuZXRidWZfbmV3KCk7CisgICAgaWYgKCFuYnVmKSB7CisJZGRwcmludGYoIm5ldGJ1ZiBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcGJ1ZiA9IG5ldGJ1Zl9hbGxvYyhuYnVmLCBsZW4pOworICAgIGlmICghcGJ1ZikgeworCWRkcHJpbnRmKCJwYnVmIGFsbG9jYXRpb24gZXJyb3JcbiIpOworCWdvdG8gb3V0OworICAgIH0KKworICAgIG1lbWNweShwYnVmLCBkYXRhLCBsZW4pOworCisgICAgZHByaW50ZigiY29yZV91ZHBfc2VuZHRvOiAlMDhYICUwNFhcbiIsIG50b2hsKGlwKSwgcG9ydCk7CisgICAgYWRkci5hZGRyID0gaXA7CisKKyAgICBlcnIgPSBuZXRjb25uX3NlbmR0byhjb25uLCBuYnVmLCAmYWRkciwgcG9ydCk7CisgICAgaWYgKGVycikgeworCWRkcHJpbnRmKCJuZXRjb25uX3NlbmR0byBlcnJvciAlZFxuIiwgZXJyKTsKKwlnb3RvIG91dDsKKyAgICB9CisKK291dDoKKyAgICBuZXRidWZfZGVsZXRlKG5idWYpOworfQorCisvKioKKyAqIE5ldHdvcmsgc3RhY2stc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAqLwordm9pZCBuZXRfY29yZV9pbml0KHZvaWQpCit7CisgICAgaW50IGVycjsKKyAgICBpbnQgaTsKKworICAgIGh0dHBfYmFrZV9jb29raWVzKCk7CisKKyAgICAvKiBJbml0aWFsaXplIGx3aXAgKi8KKyAgICB0Y3BpcF9pbml0KE5VTEwsIE5VTEwpOworCisgICAgLyogU3RhcnQgdXAgdGhlIHVuZGkgZHJpdmVyIGZvciBsd2lwICovCisgICAgZXJyID0gdW5kaWlmX3N0YXJ0KElQSW5mby5teWlwLCBJUEluZm8ubmV0bWFzaywgSVBJbmZvLmdhdGV3YXkpOworICAgIGlmIChlcnIpIHsKKyAgICAgICBkZHByaW50ZigidW5kaWlmIGRyaXZlciBmYWlsZWQgdG8gc3RhcnQ6ICVkXG4iLCBlcnIpOworICAgICAgIGthYm9vbSgpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBETlNfTUFYX1NFUlZFUlM7IGkrKykgeworCS8qIFRyYW5zZmVyIHRoZSBETlMgaW5mb3JtYXRpb24gdG8gbHdpcCAqLworCWRuc19zZXRzZXJ2ZXIoaSwgKHN0cnVjdCBpcF9hZGRyICopJmRuc19zZXJ2ZXJbaV0pOworICAgIH0KK30KKwordm9pZCBwcm9iZV91bmRpKHZvaWQpCit7CisgICAgLyogUHJvYmUgVU5ESSBpbmZvcm1hdGlvbiAqLworICAgIHB4ZV9jYWxsKFBYRU5WX1VORElfR0VUX0lORk9STUFUSU9OLCAmcHhlX3VuZGlfaW5mbyk7CisgICAgcHhlX2NhbGwoUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GTywgICZweGVfdW5kaV9pZmFjZSk7CisKKyAgICBkZHByaW50ZigiVU5ESTogYmFzZWlvICUwNHggaW50ICVkIE1UVSAlZCB0eXBlICVkIFwiJXNcIiBmbGFncyAweCV4XG4iLAorCSAgIHB4ZV91bmRpX2luZm8uQmFzZUlvLCBweGVfdW5kaV9pbmZvLkludE51bWJlciwKKwkgICBweGVfdW5kaV9pbmZvLk1heFRyYW5Vbml0LCBweGVfdW5kaV9pbmZvLkh3VHlwZSwKKwkgICBweGVfdW5kaV9pZmFjZS5JZmFjZVR5cGUsIHB4ZV91bmRpX2lmYWNlLlNlcnZpY2VGbGFncyk7Cit9CisKK2ludCBjb3JlX3RjcF9vcGVuKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQpCit7CisgICAgc29ja2V0LT5uZXQubHdpcC5jb25uID0gbmV0Y29ubl9uZXcoTkVUQ09OTl9UQ1ApOworICAgIGlmICghc29ja2V0LT5uZXQubHdpcC5jb25uKQorCXJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQoraW50IGNvcmVfdGNwX2Nvbm5lY3Qoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgdWludDMyX3QgaXAsIHVpbnQxNl90IHBvcnQpCit7CisgICAgc3RydWN0IGlwX2FkZHIgYWRkcjsKKyAgICBlcnJfdCBlcnI7CisKKyAgICBhZGRyLmFkZHIgPSBpcDsKKyAgICBlcnIgPSBuZXRjb25uX2Nvbm5lY3Qoc29ja2V0LT5uZXQubHdpcC5jb25uLCAmYWRkciwgcG9ydCk7CisgICAgaWYgKGVycikgeworCXByaW50ZigibmV0Y29ubl9jb25uZWN0IGVycm9yICVkXG4iLCBlcnIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGNvcmVfdGNwX3dyaXRlKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sCisJCSAgIGJvb2wgY29weSkKK3sKKyAgICBlcnJfdCBlcnI7CisgICAgdThfdCBmbGFncyA9IGNvcHkgPyBORVRDT05OX0NPUFkgOiBORVRDT05OX05PQ09QWTsKKworICAgIGVyciA9IG5ldGNvbm5fd3JpdGUoc29ja2V0LT5uZXQubHdpcC5jb25uLCBkYXRhLCBsZW4sIGZsYWdzKTsKKyAgICBpZiAoZXJyKSB7CisJcHJpbnRmKCJuZXRjb25uX3dyaXRlIGZhaWxlZDogJWRcbiIsIGVycik7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGNvcmVfdGNwX2Nsb3NlX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0ID0gUFZUKGlub2RlKTsKKworICAgIGlmIChzb2NrZXQtPm5ldC5sd2lwLmNvbm4pIHsKKwluZXRjb25uX2RlbGV0ZShzb2NrZXQtPm5ldC5sd2lwLmNvbm4pOworCXNvY2tldC0+bmV0Lmx3aXAuY29ubiA9IE5VTEw7CisgICAgfQorICAgIGlmIChzb2NrZXQtPm5ldC5sd2lwLmJ1ZikgeworCW5ldGJ1Zl9kZWxldGUoc29ja2V0LT5uZXQubHdpcC5idWYpOworICAgICAgICBzb2NrZXQtPm5ldC5sd2lwLmJ1ZiA9IE5VTEw7CisgICAgfQorfQorCitib29sIGNvcmVfdGNwX2lzX2Nvbm5lY3RlZChzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0KQoreworICAgIGlmIChzb2NrZXQtPm5ldC5sd2lwLmNvbm4pCisJcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgY29yZV90Y3BfZmlsbF9idWZmZXIoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0ID0gUFZUKGlub2RlKTsKKyAgICB2b2lkICpkYXRhOworICAgIHUxNl90IGxlbjsKKyAgICBlcnJfdCBlcnI7CisKKyAgICAvKiBDbGVhbiB1cCBvciBhZHZhbmNlIGFuIGludXNlIG5ldGJ1ZiAqLworICAgIGlmIChzb2NrZXQtPm5ldC5sd2lwLmJ1ZikgeworCWlmIChuZXRidWZfbmV4dChzb2NrZXQtPm5ldC5sd2lwLmJ1ZikgPCAwKSB7CisJICAgIG5ldGJ1Zl9kZWxldGUoc29ja2V0LT5uZXQubHdpcC5idWYpOworCSAgICBzb2NrZXQtPm5ldC5sd2lwLmJ1ZiA9IE5VTEw7CisJfQorICAgIH0KKyAgICAvKiBJZiBuZWVkZWQgZ2V0IGEgbmV3IG5ldGJ1ZiAqLworICAgIGlmICghc29ja2V0LT5uZXQubHdpcC5idWYpIHsKKwllcnIgPSBuZXRjb25uX3JlY3Yoc29ja2V0LT5uZXQubHdpcC5jb25uLCAmKHNvY2tldC0+bmV0Lmx3aXAuYnVmKSk7CisJaWYgKCFzb2NrZXQtPm5ldC5sd2lwLmJ1ZiB8fCBlcnIpIHsKKwkgICAgc29ja2V0LT50ZnRwX2dvdGVvZiA9IDE7CisJICAgIGlmIChpbm9kZS0+c2l6ZSA9PSAtMSkKKwkJaW5vZGUtPnNpemUgPSBzb2NrZXQtPnRmdHBfZmlsZXBvczsKKwkgICAgc29ja2V0LT5vcHMtPmNsb3NlKGlub2RlKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisgICAgLyogUmVwb3J0IHRoZSBjdXJyZW50IGZyYWdtZW50IG9mIHRoZSBuZXRidWYgKi8KKyAgICBlcnIgPSBuZXRidWZfZGF0YShzb2NrZXQtPm5ldC5sd2lwLmJ1ZiwgJmRhdGEsICZsZW4pOworICAgIGlmIChlcnIpIHsKKwlwcmludGYoIm5ldGJ1Zl9kYXRhIGVycjogJWRcbiIsIGVycik7CisJa2Fib29tKCk7CisgICAgfQorICAgIHNvY2tldC0+dGZ0cF9kYXRhcHRyID0gZGF0YTsKKyAgICBzb2NrZXQtPnRmdHBfZmlsZXBvcyArPSBsZW47CisgICAgc29ja2V0LT50ZnRwX2J5dGVzbGVmdCA9IGxlbjsKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL3B4ZS9kaGNwX29wdGlvbi5jIGIvY29yZS9mcy9weGUvZGhjcF9vcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmRjYzcwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9weGUvZGhjcF9vcHRpb24uYwpAQCAtMCwwICsxLDI1MyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPHN5cy9jcHUuaD4KKyNpbmNsdWRlIDxsd2lwL29wdC5oPgkJLyogRE5TX01BWF9TRVJWRVJTICovCisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgInB4ZS5oIgorCitjaGFyIExvY2FsRG9tYWluWzI1Nl07CisKK2ludCBvdmVyX2xvYWQ7Cit1aW50OF90IHV1aWRfdHlwZTsKK3VpbnQ4X3QgdXVpZFsxNl07CisKK3N0YXRpYyB2b2lkIHN1Ym5ldF9tYXNrKGNvbnN0IHZvaWQgKmRhdGEsIGludCBvcHRfbGVuKQoreworICAgIGlmIChvcHRfbGVuICE9IDQpCisJcmV0dXJuOworICAgIElQSW5mby5uZXRtYXNrID0gKihjb25zdCB1aW50MzJfdCAqKWRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIHJvdXRlcihjb25zdCB2b2lkICpkYXRhLCBpbnQgb3B0X2xlbikKK3sKKyAgICBpZiAob3B0X2xlbiAhPSA0KQorCXJldHVybjsKKyAgICBJUEluZm8uZ2F0ZXdheSA9ICooY29uc3QgdWludDMyX3QgKilkYXRhOworfQorCitzdGF0aWMgdm9pZCBkbnNfc2VydmVycyhjb25zdCB2b2lkICpkYXRhLCBpbnQgb3B0X2xlbikKK3sKKyAgICBjb25zdCB1aW50MzJfdCAqZHAgPSBkYXRhOworICAgIGludCBudW0gPSAwOworCisgICAgd2hpbGUgKG51bSA8IEROU19NQVhfU0VSVkVSUykgeworCXVpbnQzMl90IGlwOworCisJaWYgKG9wdF9sZW4gPCA0KQorCSAgICBicmVhazsKKworCW9wdF9sZW4gLT0gNDsKKwlpcCA9ICpkcCsrOworCWlmIChpcF9vayhpcCkpCisJICAgIGRuc19zZXJ2ZXJbbnVtKytdID0gaXA7CisgICAgfQorICAgIHdoaWxlIChudW0gPCBETlNfTUFYX1NFUlZFUlMpCisJZG5zX3NlcnZlcltudW0rK10gPSAwOworfQorCitzdGF0aWMgdm9pZCBsb2NhbF9kb21haW4oY29uc3Qgdm9pZCAqZGF0YSwgaW50IG9wdF9sZW4pCit7CisgICAgbWVtY3B5KExvY2FsRG9tYWluLCBkYXRhLCBvcHRfbGVuKTsKKyAgICBMb2NhbERvbWFpbltvcHRfbGVuXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmRvcl9lbmNhcHMoY29uc3Qgdm9pZCAqZGF0YSwgaW50IG9wdF9sZW4pCit7CisgICAgLyogT25seSByZWNvZ25pemUgUFhFTElOVVggb3B0aW9ucyAqLworICAgIHBhcnNlX2RoY3Bfb3B0aW9ucyhkYXRhLCBvcHRfbGVuLCAyMDgpOworfQorCitzdGF0aWMgdm9pZCBvcHRpb25fb3ZlcmxvYWQoY29uc3Qgdm9pZCAqZGF0YSwgaW50IG9wdF9sZW4pCit7CisgICAgaWYgKG9wdF9sZW4gIT0gMSkKKwlyZXR1cm47CisgICAgb3Zlcl9sb2FkID0gKih1aW50OF90ICopZGF0YTsKK30KKworc3RhdGljIHZvaWQgc2VydmVyKGNvbnN0IHZvaWQgKmRhdGEsIGludCBvcHRfbGVuKQoreworICAgIHVpbnQzMl90IGlwOworCisgICAgaWYgKG9wdF9sZW4gIT0gNCkKKwlyZXR1cm47CisKKyAgICBpZiAoSVBJbmZvLnNlcnZlcmlwKQorICAgICAgICByZXR1cm47CisKKyAgICBpcCA9ICoodWludDMyX3QgKilkYXRhOworICAgIGlmIChpcF9vayhpcCkpCisgICAgICAgIElQSW5mby5zZXJ2ZXJpcCA9IGlwOworfQorCitzdGF0aWMgdm9pZCBjbGllbnRfaWRlbnRpZmllcihjb25zdCB2b2lkICpkYXRhLCBpbnQgb3B0X2xlbikKK3sKKyAgICBpZiAob3B0X2xlbiA+IE1BQ19NQVggfHwgb3B0X2xlbiA8IDIgfHwKKyAgICAgICAgTUFDX2xlbiAhPSAob3B0X2xlbiA+PiA4KSB8fAorICAgICAgICAqKHVpbnQ4X3QgKilkYXRhICE9IE1BQ190eXBlKQorICAgICAgICByZXR1cm47CisKKyAgICBvcHRfbGVuIC0tOworICAgIE1BQ19sZW4gPSBvcHRfbGVuICYgMHhmZjsKKyAgICBtZW1jcHkoTUFDLCBkYXRhKzEsIG9wdF9sZW4pOworICAgIE1BQ1tvcHRfbGVuXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RmaWxlX25hbWUoY29uc3Qgdm9pZCAqZGF0YSwgaW50IG9wdF9sZW4pCit7CisgICAgbWVtY3B5KGJvb3RfZmlsZSwgZGF0YSwgb3B0X2xlbik7CisgICAgYm9vdF9maWxlW29wdF9sZW5dID0gMDsKK30KKworc3RhdGljIHZvaWQgdXVpZF9jbGllbnRfaWRlbnRpZmllcihjb25zdCB2b2lkICpkYXRhLCBpbnQgb3B0X2xlbikKK3sKKyAgICBpbnQgdHlwZSA9ICooY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgaWYgKG9wdF9sZW4gIT0gMTcgfHwgdHlwZSAhPSAwIHx8IGhhdmVfdXVpZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaGF2ZV91dWlkID0gdHJ1ZTsKKyAgICB1dWlkX3R5cGUgPSB0eXBlOworICAgIG1lbWNweSh1dWlkLCBkYXRhKzEsIDE2KTsKK30KKworc3RhdGljIHZvaWQgcHhlbGludXhfY29uZmlnZmlsZShjb25zdCB2b2lkICpkYXRhLCBpbnQgb3B0X2xlbikKK3sKKyAgICBESENQTWFnaWMgfD0gMjsKKyAgICBtZW1jcHkoQ29uZmlnTmFtZSwgZGF0YSwgb3B0X2xlbik7CisgICAgQ29uZmlnTmFtZVtvcHRfbGVuXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHB4ZWxpbnV4X3BhdGhwcmVmaXgoY29uc3Qgdm9pZCAqZGF0YSwgaW50IG9wdF9sZW4pCit7CisgICAgREhDUE1hZ2ljIHw9IDQ7CisgICAgbWVtY3B5KHBhdGhfcHJlZml4LCBkYXRhLCBvcHRfbGVuKTsKKyAgICBwYXRoX3ByZWZpeFtvcHRfbGVuXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHB4ZWxpbnV4X3JlYm9vdHRpbWUoY29uc3Qgdm9pZCAqZGF0YSwgaW50IG9wdF9sZW4pCit7CisgICAgaWYgKG9wdF9sZW4gIT0gNCkKKyAgICAgICAgcmV0dXJuOworCisgICAgUmVib290VGltZSA9IG50b2hsKCooY29uc3QgdWludDMyX3QgKilkYXRhKTsKKyAgICBESENQTWFnaWMgfD0gODsgICAgIC8qIEdvdCByZWJvb3QgdGltZSAqLworfQorCisKK3N0cnVjdCBkaGNwX29wdGlvbnMgeworICAgIGludCBvcHRfbnVtOworICAgIHZvaWQgKCpmdW4pKGNvbnN0IHZvaWQgKiwgaW50KTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGhjcF9vcHRpb25zIGRoY3Bfb3B0c1tdID0geworICAgIHsxLCAgIHN1Ym5ldF9tYXNrfSwKKyAgICB7MywgICByb3V0ZXJ9LAorICAgIHs2LCAgIGRuc19zZXJ2ZXJzfSwKKyAgICB7MTUsICBsb2NhbF9kb21haW59LAorICAgIHs0MywgIHZlbmRvcl9lbmNhcHN9LAorICAgIHs1MiwgIG9wdGlvbl9vdmVybG9hZH0sCisgICAgezU0LCAgc2VydmVyfSwKKyAgICB7NjEsICBjbGllbnRfaWRlbnRpZmllcn0sCisgICAgezY3LCAgYm9vdGZpbGVfbmFtZX0sCisgICAgezk3LCAgdXVpZF9jbGllbnRfaWRlbnRpZmllcn0sCisgICAgezIwOSwgcHhlbGludXhfY29uZmlnZmlsZX0sCisgICAgezIxMCwgcHhlbGludXhfcGF0aHByZWZpeH0sCisgICAgezIxMSwgcHhlbGludXhfcmVib290dGltZX0KK307CisKKy8qCisgKiBQYXJzZSBhIHNlcXVlbmNlIG9mIERIQ1Agb3B0aW9ucywgcG9pbnRlZCB0byBieSBfb3B0aW9uXzsKKyAqIC0tIHNvbWUgREhDUCBzZXJ2ZXJzIGxlYXZlIG9wdGlvbiBmaWVsZHMgdW50ZXJtaW5hdGVkCisgKiBpbiB2aW9sYXRpb24gb2YgdGhlIHNwZWMuCisgKgorICogZmlsdGVyICBjb250YWlucyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgdGhlIG9wdGlvbiB0byByZWNvZ25pemUKKyAqIC0tIHRoaXMgaXMgdXNlZCB0byByZXN0cmljdCBwYXJzaW5nIHRvIFBYRUxJTlVYLXNwZWNpZmljIG9wdGlvbnMgb25seS4KKyAqLwordm9pZCBwYXJzZV9kaGNwX29wdGlvbnMoY29uc3Qgdm9pZCAqb3B0aW9uLCBpbnQgc2l6ZSwgdWludDhfdCBvcHRfZmlsdGVyKQoreworICAgIGludCBvcHRfbnVtOworICAgIGludCBvcHRfbGVuOworICAgIGNvbnN0IGludCBvcHRfZW50cmllcyA9IHNpemVvZihkaGNwX29wdHMpIC8gc2l6ZW9mKGRoY3Bfb3B0c1swXSk7CisgICAgaW50IGkgPSAwOworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBvcHRpb247CisgICAgY29uc3Qgc3RydWN0IGRoY3Bfb3B0aW9ucyAqb3B0OworCisgICAgLyogVGhlIG9ubHkgMS1ieXRlIG9wdGlvbnMgYXJlIDAwIGFuZCBGRiwgbmVpdGhlciBvZiB3aGljaCBtYXR0ZXIgKi8KKyAgICB3aGlsZSAoc2l6ZSA+PSAyKSB7CisgICAgICAgIG9wdF9udW0gPSAqcCsrOworCXNpemUtLTsKKworICAgICAgICBpZiAob3B0X251bSA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChvcHRfbnVtID09IDB4ZmYpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBBbnl0aGluZyBlbHNlIHdpbGwgaGF2ZSBhIGxlbmd0aCBmaWVsZCAqLworICAgICAgICBvcHRfbGVuID0gKnArKzsgLyogYyAgPC0gb3B0aW9uIGxlbmdodCAqLworICAgICAgICBzaXplIC09IG9wdF9sZW4gKyAxOworICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICBicmVhazsKKworCWRwcmludGYoIkRIQ1A6IG9wdGlvbiAlZCwgbGVuICVkXG4iLCBvcHRfbnVtLCBvcHRfbGVuKTsKKworCWlmIChvcHRfbnVtID49IG9wdF9maWx0ZXIpIHsKKwkgICAgb3B0ID0gZGhjcF9vcHRzOworCSAgICBmb3IgKGkgPSAwOyBpIDwgb3B0X2VudHJpZXM7IGkrKykgeworCQlpZiAob3B0X251bSA9PSBvcHQtPm9wdF9udW0pIHsKKwkJICAgIG9wdC0+ZnVuKHAsIG9wdF9sZW4pOworCQkgICAgYnJlYWs7CisJCX0KKwkJb3B0Kys7CisJICAgIH0KKwl9CisKKyAgICAgICAgLyogcGFyc2UgbmV4dCAqLworICAgICAgICBwICs9IG9wdF9sZW47CisgICAgfQorfQorCisvKgorICogcGFyc2VfZGhjcAorICoKKyAqIFBhcnNlIGEgREhDUCBwYWNrZXQuICBUaGlzIGluY2x1ZGVzIGRlYWxpbmcgd2l0aCAib3ZlcmxvYWRlZCIKKyAqIG9wdGlvbiBmaWVsZHMgKHNlZSBSRkMgMjEzMiwgc2VjdGlvbiA5LjMpCisgKgorICogVGhpcyBzaG91bGQgZmlsbCBpbiB0aGUgZm9sbG93aW5nIGdsb2JhbCB2YXJpYWJsZXMsIGlmIHRoZQorICogaW5mb3JtYXRpb24gaXMgcHJlc2VudDoKKyAqCisgKiBNeUlQCQktIGNsaWVudCBJUCBhZGRyZXNzCisgKiBzZXJ2ZXJfaXAJLSBib290IHNlcnZlciBJUCBhZGRyZXNzCisgKiBuZXRfbWFzawktIG5ldHdvcmsgbWFzaworICogZ2F0ZV93YXkJLSBkZWZhdWx0IGdhdGV3YXkgcm91dGVyIElQCisgKiBib290X2ZpbGUJLSBib290IGZpbGUgbmFtZQorICogRE5TU2VydmVycwktIEROUyBzZXJ2ZXIgSVBzCisgKiBMb2NhbERvbWFpbgktIExvY2FsIGRvbWFpbiBuYW1lCisgKiBNQUNfbGVuLCBNQUMJLSBDbGllbnQgaWRlbnRpZmllciwgaWYgTUFDX2xlbiA9PSAwCisgKgorICovCit2b2lkIHBhcnNlX2RoY3AoY29uc3Qgdm9pZCAqcGt0LCBzaXplX3QgcGt0X2xlbikKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYm9vdHBfdCAqZGhjcCA9IChjb25zdCBzdHJ1Y3QgYm9vdHBfdCAqKXBrdDsKKyAgICBpbnQgb3B0X2xlbjsKKworICAgIElQSW5mby5pcHZlciA9IDQ7CQkvKiBUaGlzIGlzIElQdjQgb25seSBmb3Igbm93Li4uICovCisKKyAgICBvdmVyX2xvYWQgPSAwOworICAgIGlmIChpcF9vayhkaGNwLT55aXApKQorICAgICAgICBJUEluZm8ubXlpcCA9IGRoY3AtPnlpcDsKKworICAgIGlmIChpcF9vayhkaGNwLT5zaXApKQorICAgICAgICBJUEluZm8uc2VydmVyaXAgPSBkaGNwLT5zaXA7CisKKyAgICBvcHRfbGVuID0gKGNoYXIgKilkaGNwICsgcGt0X2xlbiAtIChjaGFyICopJmRoY3AtPm9wdGlvbnM7CisgICAgaWYgKG9wdF9sZW4gJiYgKGRoY3AtPm9wdGlvbl9tYWdpYyA9PSBCT09UUF9PUFRJT05fTUFHSUMpKQorICAgICAgICBwYXJzZV9kaGNwX29wdGlvbnMoJmRoY3AtPm9wdGlvbnMsIG9wdF9sZW4sIDApOworCisgICAgaWYgKG92ZXJfbG9hZCAmIDEpCisgICAgICAgIHBhcnNlX2RoY3Bfb3B0aW9ucygmZGhjcC0+Ym9vdGZpbGUsIDEyOCwgMCk7CisgICAgZWxzZSBpZiAoZGhjcC0+Ym9vdGZpbGVbMF0pCisJc3RyY3B5KGJvb3RfZmlsZSwgZGhjcC0+Ym9vdGZpbGUpOworCisgICAgaWYgKG92ZXJfbG9hZCAmIDIpCisgICAgICAgIHBhcnNlX2RoY3Bfb3B0aW9ucyhkaGNwLT5zbmFtZSwgNjQsIDApOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9weGUvZG5zcmVzb2x2LmMgYi9jb3JlL2ZzL3B4ZS9kbnNyZXNvbHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI5ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9weGUvZG5zcmVzb2x2LmMKQEAgLTAsMCArMSwxMzQgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlICJweGUuaCIKKyNpbmNsdWRlICJsd2lwL2FwaS5oIgorI2luY2x1ZGUgImx3aXAvZG5zLmgiCisKKy8qIEROUyBDTEFTUyB2YWx1ZXMgd2UgY2FyZSBhYm91dCAqLworI2RlZmluZSBDTEFTU19JTgkxCisKKy8qIEROUyBUWVBFIHZhbHVlcyB3ZSBjYXJlIGFib3V0ICovCisjZGVmaW5lIFRZUEVfQQkJMQorI2RlZmluZSBUWVBFX0NOQU1FCTUKKworLyoKKyAqIFRoZSBETlMgaGVhZGVyIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZG5zaGRyIHsKKyAgICB1aW50MTZfdCBpZDsKKyAgICB1aW50MTZfdCBmbGFnczsKKyAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcXVlc3Rpb24gc2VjdGlvbiAqLworICAgIHVpbnQxNl90IHFkY291bnQ7CisgICAgLyogbnVtYmVyIG9mIHJlc291cmNlIHJlY29yZHMgaW4gdGhlIGFuc3dlciBzZWN0aW9uICovCisgICAgdWludDE2X3QgYW5jb3VudDsKKyAgICAvKiBudW1iZXIgb2YgbmFtZSBzZXJ2ZXIgcmVzb3VyY2UgcmVjb3JkcyBpbiB0aGUgYXV0aG9yaXR5IHJlY29yZHMgc2VjdGlvbiovCisgICAgdWludDE2X3QgbnNjb3VudDsKKyAgICAvKiBudW1iZXIgb2YgcmVzb3VyY2UgcmVjb3JkcyBpbiB0aGUgYWRkaXRpb25hbCByZWNvcmRzIHNlY3Rpb24gKi8KKyAgICB1aW50MTZfdCBhcmNvdW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBUaGUgRE5TIHF1ZXJ5IHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZG5zcXVlcnkgeworICAgIHVpbnQxNl90IHF0eXBlOworICAgIHVpbnQxNl90IHFjbGFzczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICogVGhlIEROUyBSZXNvdXJjZSByZWNvZGVzIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZG5zcnIgeworICAgIHVpbnQxNl90IHR5cGU7CisgICAgdWludDE2X3QgY2xhc3M7CisgICAgdWludDMyX3QgdHRsOworICAgIHVpbnQxNl90IHJkbGVuZ3RoOyAgIC8qIFRoZSBsZW5naHQgb2YgdGhpcyByciBkYXRhICovCisgICAgY2hhciAgICAgcmRhdGFbXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKK3VpbnQzMl90IGRuc19zZXJ2ZXJbRE5TX01BWF9TRVJWRVJTXSA9IHswLCB9OworCisvKgorICogcGFyc2UgdGhlIGlwX3N0ciBhbmQgcmV0dXJuIHRoZSBpcCBhZGRyZXNzIHdpdGggKnJlcy4KKyAqIHJldHVybiB0cnVlIGlmIHRoZSB3aG9sZSBzdHJpbmcgd2FzIGNvbnN1bWVkIGFuZCB0aGUgcmVzdWx0CisgKiB3YXMgdmFsaWQuCisgKgorICovCitzdGF0aWMgYm9vbCBwYXJzZV9kb3RxdWFkKGNvbnN0IGNoYXIgKmlwX3N0ciwgdWludDMyX3QgKnJlcykKK3sKKyAgICBjb25zdCBjaGFyICpwID0gaXBfc3RyOworICAgIHVpbnQ4X3QgcGFydCA9IDA7CisgICAgdWludDMyX3QgaXAgPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB3aGlsZSAoaXNfZGlnaXQoKnApKSB7CisgICAgICAgICAgICBwYXJ0ID0gcGFydCAqIDEwICsgKnAgLSAnMCc7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgIT0gMyAmJiAqcCAhPSAnLicpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaXAgPSAoaXAgPDwgOCkgfCBwYXJ0OworICAgICAgICBwYXJ0ID0gMDsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICBwLS07CisKKyAgICAqcmVzID0gaHRvbmwoaXApOworICAgIHJldHVybiAqcCA9PSAnXDAnOworfQorCisvKgorICogQWN0dWFsIHJlc29sdmVyIGZ1bmN0aW9uLgorICoKKyAqIFBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZCBpbiBfbmFtZV8gYW5kIHJldHVybnMgdGhlIGlwIGFkZHIgaW4KKyAqIF9pcF8gaWYgaXQgZXhpc3RzIGFuZCBjYW4gYmUgZm91bmQuICBJZiBfaXBfID0gMCBvbiBleGl0LCB0aGUKKyAqIGxvb2t1cCBmYWlsZWQuIF9uYW1lXyB3aWxsIGJlIHVwZGF0ZWQKKyAqLworX19leHBvcnQgdWludDMyX3QgZG5zX3Jlc29sdihjb25zdCBjaGFyICpuYW1lKQoreworICAgIGVycl90IGVycjsKKyAgICBzdHJ1Y3QgaXBfYWRkciBpcDsKKyAgICBjaGFyIGZ1bGxuYW1lWzUxMl07CisKKyAgICAvKgorICAgICAqIFJldHVybiBmYWlsdXJlIG9uIGFuIGVtcHR5IGlucHV0Li4uIHRoaXMgY2FuIGhhcHBlbiBkdXJpbmcKKyAgICAgKiBzb21lIHR5cGVzIG9mIFVSTCBwYXJzaW5nLCBhbmQgdGhpcyBpcyB0aGUgZWFzaWVzdCBwbGFjZSB0bworICAgICAqIGNoZWNrIGZvciBpdC4KKyAgICAgKi8KKyAgICBpZiAoIW5hbWUgfHwgISpuYW1lKQorCXJldHVybiAwOworCisgICAgLyogSWYgaXQgaXMgYSB2YWxpZCBkb3QgcXVhZCwganVzdCByZXR1cm4gdGhhdCB2YWx1ZSAqLworICAgIGlmIChwYXJzZV9kb3RxdWFkKG5hbWUsICZpcC5hZGRyKSkKKwlyZXR1cm4gaXAuYWRkcjsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB2YWxpZCBETlMgc2VydmVyICovCisgICAgaWYgKCFkbnNfZ2V0c2VydmVyKDApLmFkZHIpCisJcmV0dXJuIDA7CisKKyAgICAvKiBJcyBpdCBhIGxvY2FsICh1bnF1YWxpZmllZCkgZG9tYWluIG5hbWU/ICovCisgICAgaWYgKCFzdHJjaHIobmFtZSwgJy4nKSAmJiBMb2NhbERvbWFpblswXSkgeworCXNucHJpbnRmKGZ1bGxuYW1lLCBzaXplb2YgZnVsbG5hbWUsICIlcy4lcyIsIG5hbWUsIExvY2FsRG9tYWluKTsKKwluYW1lID0gZnVsbG5hbWU7CisgICAgfQorCisgICAgZXJyID0gbmV0Y29ubl9nZXRob3N0YnluYW1lKG5hbWUsICZpcCk7CisgICAgaWYgKGVycikKKwlyZXR1cm4gMDsKKworICAgIHJldHVybiBpcC5hZGRyOworfQorCisvKgorICogdGhlIG9uZSBzaG91bGQgYmUgY2FsbGVkIGZyb20gQVNNIGZpbGUKKyAqLwordm9pZCBwbV9weGVfZG5zX3Jlc29sdihjb20zMnN5c190ICpyZWdzKQoreworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBNS19QVFIocmVncy0+ZHMsIHJlZ3MtPmVzaS53WzBdKTsKKworICAgIHJlZ3MtPmVheC5sID0gZG5zX3Jlc29sdihuYW1lKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMvcHhlL2Z0cC5jIGIvY29yZS9mcy9weGUvZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyN2U0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvcHhlL2Z0cC5jCkBAIC0wLDAgKzEsMjczIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgIAorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBmdHAuYworICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisjaW5jbHVkZSA8c3lzL2NwdS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsd2lwL2FwaS5oPgorI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJmcy5oIgorI2luY2x1ZGUgInB4ZS5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInVybC5oIgorI2luY2x1ZGUgIm5ldC5oIgorCitzdGF0aWMgaW50IGZ0cF9jbWRfcmVzcG9uc2Uoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqY21kLAorCQkJICAgIGNvbnN0IGNoYXIgKmNtZF9hcmcsCisJCQkgICAgdWludDhfdCAqcGFzdl9kYXRhLCBpbnQgKnBuX3B0cikKK3sKKyAgICBzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0ID0gUFZUKGlub2RlKTsKKyAgICBpbnQgYzsKKyAgICBpbnQgcG9zLCBjb2RlOworICAgIGludCBwYiwgcG47CisgICAgYm9vbCBwczsKKyAgICBib29sIGZpcnN0X2xpbmUsIGRvbmU7CisgICAgY2hhciBjbWRfYnVmWzQwOTZdOworICAgIGludCBjbWRfbGVuOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgY2hhciAqcTsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKGNtZCkgeworCWNtZF9sZW4gPSBzdHJsY3B5KGNtZF9idWYsIGNtZCwgc2l6ZW9mIGNtZF9idWYpOworCWlmIChjbWRfbGVuID49IHNpemVvZiBjbWRfYnVmIC0gMykKKwkgICAgcmV0dXJuIC0xOworCXEgPSBjbWRfYnVmICsgY21kX2xlbjsKKworCWlmIChjbWRfYXJnKSB7CisJICAgIHAgPSBjbWRfYXJnOworCisJICAgICpxKysgPSAnICc7CisJICAgIGNtZF9sZW4rKzsKKwkgICAgd2hpbGUgKCpwKSB7CisJCWlmICgrK2NtZF9sZW4gPCBzaXplb2YgY21kX2J1ZikgKnErKyA9ICpwOworCQlpZiAoKnAgPT0gJ1xyJykKKwkJICAgIGlmICgrK2NtZF9sZW4gPCBzaXplb2YgY21kX2J1ZikgKnErKyA9ICdcMCc7CisJCXArKzsKKwkgICAgfQorCisJICAgIGlmIChjbWRfbGVuID49IHNpemVvZiBjbWRfYnVmIC0gMikKKwkJcmV0dXJuIC0xOworCX0KKworCSpxKysgPSAnXHInOworCSpxKysgPSAnXG4nOworCWNtZF9sZW4gKz0gMjsKKworCWVyciA9IGNvcmVfdGNwX3dyaXRlKHNvY2tldCwgY21kX2J1ZiwgY21kX2xlbiwgdHJ1ZSk7CisJaWYgKGVycikKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBvcyA9IGNvZGUgPSBwbiA9IHBiID0gMDsKKyAgICBwcyA9IGZhbHNlOworICAgIGZpcnN0X2xpbmUgPSB0cnVlOworICAgIGRvbmUgPSBmYWxzZTsKKworICAgIHdoaWxlICgoYyA9IHB4ZV9nZXRjKGlub2RlKSkgPj0gMCkgeworCWlmIChjID09ICdcbicpIHsKKwkgICAgaWYgKGRvbmUpIHsKKwkJaWYgKHBuKSB7CisJCSAgICBwbiArPSBwczsKKwkJICAgIGlmIChwbl9wdHIpCisJCQkqcG5fcHRyID0gcG47CisJCX0KKwkJcmV0dXJuIGNvZGU7CisJICAgIH0KKwkgICAgcG9zID0gY29kZSA9IDA7CisJICAgIGZpcnN0X2xpbmUgPSBmYWxzZTsKKwkgICAgY29udGludWU7CisJfQorCisJc3dpdGNoIChwb3MrKykgeworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCSAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzknKSB7CisJCWlmIChmaXJzdF9saW5lKQorCQkgICAgcmV0dXJuIC0xOworCQllbHNlCisJCSAgICBwb3MgPSA0OwkvKiBTa2lwIHRoaXMgbGluZSAqLworCSAgICB9IGVsc2UgeworCQljb2RlID0gKGNvZGUqMTApICsgKGMgLSAnMCcpOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAzOgorCSAgICBwbiA9IHBiID0gMDsKKwkgICAgcHMgPSBmYWxzZTsKKwkgICAgaWYgKGMgPT0gJyAnKQorCQlkb25lID0gdHJ1ZTsKKwkgICAgZWxzZSBpZiAoYyA9PSAnLScpCisJCWRvbmUgPSBmYWxzZTsKKwkgICAgZWxzZSBpZiAoZmlyc3RfbGluZSkKKwkJcmV0dXJuIC0xOworCSAgICBlbHNlCisJCWRvbmUgPSBmYWxzZTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBpZiAocGFzdl9kYXRhKSB7CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworCQkgICAgcGIgPSAocGIqMTApICsgKGMtJzAnKTsKKwkJICAgIGlmIChwbiA8IDYpCisJCQlwYXN2X2RhdGFbcG5dID0gcGI7CisJCSAgICBwcyA9IHRydWU7CisJCX0gZWxzZSBpZiAoYyA9PSAnLCcpIHsKKwkJICAgIHBuKys7CisJCSAgICBwYiA9IDA7CisJCSAgICBwcyA9IGZhbHNlOworCQl9IGVsc2UgaWYgKHBuKSB7CisJCSAgICBwbiArPSBwczsKKwkJICAgIGlmIChwbl9wdHIpCisJCQkqcG5fcHRyID0gcG47CisJCSAgICBwbiA9IHBiID0gMDsKKwkJICAgIHBzID0gZmFsc2U7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBmdHBfZnJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQgPSBQVlQoaW5vZGUpOworCisgICAgaWYgKHNvY2tldC0+Y3RsKSB7CisJY29yZV90Y3BfY2xvc2VfZmlsZShzb2NrZXQtPmN0bCk7CisJZnJlZV9zb2NrZXQoc29ja2V0LT5jdGwpOworCXNvY2tldC0+Y3RsID0gTlVMTDsKKyAgICB9CisgICAgY29yZV90Y3BfY2xvc2VfZmlsZShpbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0cF9jbG9zZV9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCAgPSBQVlQoaW5vZGUpOworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpjdGxzb2NrOworICAgIGludCByZXNwOworCisgICAgY3Rsc29jayA9IHNvY2tldC0+Y3RsID8gUFZUKHNvY2tldC0+Y3RsKSA6IE5VTEw7CisgICAgaWYgKGNvcmVfdGNwX2lzX2Nvbm5lY3RlZChjdGxzb2NrKSkgeworCXJlc3AgPSBmdHBfY21kX3Jlc3BvbnNlKHNvY2tldC0+Y3RsLCAiUVVJVCIsIE5VTEwsIE5VTEwsIE5VTEwpOworCXdoaWxlIChyZXNwID09IDIyNikgeworCSAgICByZXNwID0gZnRwX2NtZF9yZXNwb25zZShzb2NrZXQtPmN0bCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJfQorICAgIH0KKyAgICBmdHBfZnJlZShpbm9kZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHhlX2Nvbm5fb3BzIGZ0cF9jb25uX29wcyA9IHsKKyAgICAuZmlsbF9idWZmZXIJPSBjb3JlX3RjcF9maWxsX2J1ZmZlciwKKyAgICAuY2xvc2UJCT0gZnRwX2Nsb3NlX2ZpbGUsCisgICAgLnJlYWRkaXIJCT0gZnRwX3JlYWRkaXIsCit9OworCit2b2lkIGZ0cF9vcGVuKHN0cnVjdCB1cmxfaW5mbyAqdXJsLCBpbnQgZmxhZ3MsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJICAgICAgY29uc3QgY2hhciAqKnJlZGlyKQoreworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQgPSBQVlQoaW5vZGUpOworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpjdGxzb2NrOworICAgIHVpbnQ4X3QgcGFzdl9kYXRhWzZdOworICAgIGludCBwYXN2X2J5dGVzOworICAgIGludCByZXNwOworICAgIGVycl90IGVycjsKKworICAgICh2b2lkKXJlZGlyOwkJLyogRlRQIGRvZXMgbm90IHJlZGlyZWN0ICovCisKKyAgICBpbm9kZS0+c2l6ZSA9IDA7CisKKyAgICBpZiAoIXVybC0+cG9ydCkKKwl1cmwtPnBvcnQgPSAyMTsKKworICAgIHVybF91bmVzY2FwZSh1cmwtPnBhdGgsIDApOworCisgICAgc29ja2V0LT5vcHMgPSAmZnRwX2Nvbm5fb3BzOworCisgICAgLyogU2V0IHVwIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gKi8KKyAgICBzb2NrZXQtPmN0bCA9IGFsbG9jX2lub2RlKGlub2RlLT5mcywgMCwgc2l6ZW9mKHN0cnVjdCBweGVfcHZ0X2lub2RlKSk7CisgICAgaWYgKCFzb2NrZXQtPmN0bCkKKwlyZXR1cm47CisgICAgY3Rsc29jayA9IFBWVChzb2NrZXQtPmN0bCk7CisgICAgY3Rsc29jay0+b3BzID0gJnRjcF9jb25uX29wczsgLyogVGhlIGNvbnRyb2wgY29ubmVjdGlvbiBpcyBqdXN0IFRDUCAqLworICAgIGlmIChjb3JlX3RjcF9vcGVuKGN0bHNvY2spKQorCWdvdG8gZXJyX2ZyZWU7CisgICAgZXJyID0gY29yZV90Y3BfY29ubmVjdChjdGxzb2NrLCB1cmwtPmlwLCB1cmwtPnBvcnQpOworICAgIGlmIChlcnIpCisJZ290byBlcnJfZGVsZXRlOworCisgICAgZG8geworCXJlc3AgPSBmdHBfY21kX3Jlc3BvbnNlKHNvY2tldC0+Y3RsLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICB9IHdoaWxlIChyZXNwID09IDEyMCk7CisgICAgaWYgKHJlc3AgIT0gMjIwKQorCWdvdG8gZXJyX2Rpc2Nvbm5lY3Q7CisKKyAgICBpZiAoIXVybC0+dXNlcikKKwl1cmwtPnVzZXIgPSAiYW5vbnltb3VzIjsKKyAgICBpZiAoIXVybC0+cGFzc3dkKQorCXVybC0+cGFzc3dkID0gInN5c2xpbnV4QCI7CisKKyAgICByZXNwID0gZnRwX2NtZF9yZXNwb25zZShzb2NrZXQtPmN0bCwgIlVTRVIiLCB1cmwtPnVzZXIsIE5VTEwsIE5VTEwpOworICAgIGlmIChyZXNwICE9IDIwMiAmJiByZXNwICE9IDIzMCkgeworCWlmIChyZXNwICE9IDMzMSkKKwkgICAgZ290byBlcnJfZGlzY29ubmVjdDsKKworCXJlc3AgPSBmdHBfY21kX3Jlc3BvbnNlKHNvY2tldC0+Y3RsLCAiUEFTUyIsIHVybC0+cGFzc3dkLCBOVUxMLCBOVUxMKTsKKwlpZiAocmVzcCAhPSAyMzApCisJICAgIGdvdG8gZXJyX2Rpc2Nvbm5lY3Q7CisgICAgfQorCisgICAgaWYgKCEoZmxhZ3MgJiBPX0RJUkVDVE9SWSkpIHsKKwlyZXNwID0gZnRwX2NtZF9yZXNwb25zZShzb2NrZXQtPmN0bCwgIlRZUEUiLCAiSSIsIE5VTEwsIE5VTEwpOworCWlmIChyZXNwICE9IDIwMCkKKwkgICAgZ290byBlcnJfZGlzY29ubmVjdDsKKyAgICB9CisKKyAgICByZXNwID0gZnRwX2NtZF9yZXNwb25zZShzb2NrZXQtPmN0bCwgIlBBU1YiLCBOVUxMLCBwYXN2X2RhdGEsICZwYXN2X2J5dGVzKTsKKyAgICBpZiAocmVzcCAhPSAyMjcgfHwgcGFzdl9ieXRlcyAhPSA2KQorCWdvdG8gZXJyX2Rpc2Nvbm5lY3Q7CisKKyAgICBlcnIgPSBjb3JlX3RjcF9vcGVuKHNvY2tldCk7CisgICAgaWYgKGVycikKKwlnb3RvIGVycl9kaXNjb25uZWN0OworICAgIGVyciA9IGNvcmVfdGNwX2Nvbm5lY3Qoc29ja2V0LCAqKHVpbnQzMl90KikmcGFzdl9kYXRhWzBdLAorCQkJICAgbnRvaHMoKih1aW50MTZfdCAqKSZwYXN2X2RhdGFbNF0pKTsKKyAgICBpZiAoZXJyKQorCWdvdG8gZXJyX2Rpc2Nvbm5lY3Q7CisKKyAgICByZXNwID0gZnRwX2NtZF9yZXNwb25zZShzb2NrZXQtPmN0bCwKKwkJCSAgICAoZmxhZ3MgJiBPX0RJUkVDVE9SWSkgPyAiTElTVCIgOiAiUkVUUiIsCisJCQkgICAgdXJsLT5wYXRoLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmVzcCAhPSAxMjUgJiYgcmVzcCAhPSAxNTApCisJZ290byBlcnJfZGlzY29ubmVjdDsKKworICAgIGlub2RlLT5zaXplID0gLTE7CisgICAgcmV0dXJuOwkJCS8qIFN1Y2VzcyEgKi8KKworZXJyX2Rpc2Nvbm5lY3Q6CisgICAgY29yZV90Y3Bfd3JpdGUoY3Rsc29jaywgIlFVSVRcclxuIiwgNiwgZmFsc2UpOworICAgIGNvcmVfdGNwX2Nsb3NlX2ZpbGUoaW5vZGUpOworZXJyX2RlbGV0ZToKKyAgICBjb3JlX3RjcF9jbG9zZV9maWxlKHNvY2tldC0+Y3RsKTsKK2Vycl9mcmVlOgorICAgIGZyZWVfc29ja2V0KHNvY2tldC0+Y3RsKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMvcHhlL2Z0cF9yZWFkZGlyLmMgYi9jb3JlL2ZzL3B4ZS9mdHBfcmVhZGRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiODdmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3B4ZS9mdHBfcmVhZGRpci5jCkBAIC0wLDAgKzEsMTQxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZnRwX3JlYWRkaXIuYworICovCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlICJweGUuaCIKKworc3RhdGljIGludCBkaXJ0eXBlKGNoYXIgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlICdmJzoKKwlyZXR1cm4gRFRfRklGTzsKKyAgICBjYXNlICdjJzoKKwlyZXR1cm4gRFRfQ0hSOworICAgIGNhc2UgJ2QnOgorCXJldHVybiBEVF9ESVI7CisgICAgY2FzZSAnYic6CisJcmV0dXJuIERUX0JMSzsKKyAgICBjYXNlICctJzoKKyAgICBjYXNlICcwJyAuLi4gJzknOgkJLyogU29tZSBET1MgRlRQIHN0YWNrcyAqLworCXJldHVybiBEVF9SRUc7CisgICAgY2FzZSAnbCc6CisJcmV0dXJuIERUX0xOSzsKKyAgICBjYXNlICdzJzoKKwlyZXR1cm4gRFRfU09DSzsKKyAgICBkZWZhdWx0OgorCXJldHVybiBEVF9VTktOT1dOOworICAgIH0KK30KKworaW50IGZ0cF9yZWFkZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCkKK3sKKyAgICBjaGFyIGJ1ZnNbMl1bRklMRU5BTUVfTUFYICsgMV07CisgICAgaW50IG5idWYgPSAwOworICAgIGNoYXIgKmJ1ZiA9IGJ1ZnNbbmJ1Zl07CisgICAgY2hhciAqcCA9IGJ1ZjsKKyAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBjaGFyIHR5cGU7CisgICAgaW50IGM7CisgICAgaW50IGR0OworICAgIGJvb2wgd2FzX2NyID0gZmFsc2U7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgICBmb3IgKDs7KSB7CisJdHlwZSA9IDA7CisKKwlmb3IgKDs7KSB7CisJICAgIGMgPSBweGVfZ2V0Yyhpbm9kZSk7CisJICAgIGlmIChjID09IC0xKQorCQlyZXR1cm4gLTE7CS8qIE5vdGhpbmcgZWxzZSB0aGVyZSAqLworCisJICAgIGlmIChjID09ICdccicpIHsKKwkJd2FzX2NyID0gdHJ1ZTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKHdhc19jcikgeworCQlpZiAoYyA9PSAnXG4nKSB7CisJCSAgICBpZiAoIW5hbWUpIHsKKwkJCSpwID0gJ1wwJzsKKwkJCW5hbWUgPSBidWY7CisJCSAgICB9CisJCSAgICBicmVhazsJLyogRW5kIG9mIGxpbmUgKi8KKwkJfQorCQllbHNlIGlmIChjID09ICdcMCcpCisJCSAgICBjID0gJ1xyJzsKKwkgICAgfQorCSAgICB3YXNfY3IgPSBmYWxzZTsKKworCSAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKSB7CisJCWlmICghbmFtZSkgeworCQkgICAgKnAgPSAnXDAnOworCQkgICAgaWYgKGZpcnN0KSB7CisJCQlpZiAocCA9PSBidWYpIHsKKwkJCSAgICAvKiBOYW1lIHN0YXJ0ZWQgd2l0aCB3aGl0ZXNwYWNlIC0gc2tpcCBsaW5lICovCisJCQkgICAgbmFtZSA9IGJ1ZjsKKwkJCX0gZWxzZSBpZiAoKHAgPSBzdHJjaHIoYnVmLCAnOycpKSkgeworCQkJICAgIC8qIFZNUy9NdWx0aW5ldCBmb3JtYXQgKi8KKwkJCSAgICBpZiAocCA+IGJ1Zis0ICYmICFtZW1jbXAocC00LCAiLkRJUiIsIDQpKSB7CisJCQkJdHlwZSA9ICdkJzsKKwkJCQlwIC09IDQ7CisJCQkgICAgfSBlbHNlIHsKKwkJCQl0eXBlID0gJ2YnOworCQkJICAgIH0KKwkJCSAgICAqcCA9ICdcMCc7CisJCQkgICAgbmFtZSA9IGJ1ZjsKKwkJCX0gZWxzZSB7CisJCQkgICAgdHlwZSA9IGJ1ZlswXTsKKwkJCX0KKwkJCWZpcnN0ID0gZmFsc2U7CisJCSAgICB9IGVsc2UgeworCQkJLyogTm90IHRoZSBmaXJzdCB3b3JkICovCisJCQlpZiAoKHR5cGUgPj0gJzAnICYmIHR5cGUgPD0gJzknKSAmJgorCQkJICAgICFzdHJjbXAoYnVmLCAiPERJUj4iKSkgeworCQkJICAgIC8qIFNvbWUgRE9TIEZUUCBzZXJ2ZXJzICovCisJCQkgICAgdHlwZSA9ICdkJzsKKwkJCX0gZWxzZSBpZiAodHlwZSA9PSAnbCcgJiYgIXN0cmNtcChidWYsICItPiIpKSB7CisJCQkgICAgLyogVGhlIG5hbWUgd2FzIHRoZSBwcmV2aW91cyB3b3JkICovCisJCQkgICAgbmFtZSA9IGJ1ZnNbbmJ1ZiBeIDFdOworCQkJfQorCQkgICAgfQorCQkgICAgbmJ1ZiBePSAxOworCQkgICAgcCA9IGJ1ZiA9IGJ1ZnNbbmJ1Zl07CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaWYgKCFuYW1lICYmIHAgPCBidWYgKyBGSUxFTkFNRV9NQVgpCisJCSAgICAqcCsrID0gYzsKKwkgICAgfQorCX0KKworCWR0ID0gZGlydHlwZSh0eXBlKTsKKwlpZiAoZHQgIT0gRFRfVU5LTk9XTikgeworCSAgICBzaXplX3QgbGVuID0gc3RybGVuKG5hbWUpOworCisJICAgIGlmIChsZW4gPD0gTkFNRV9NQVgpIHsKKwkJZGlyZW50LT5kX3R5cGUgPSBkdDsKKwkJZGlyZW50LT5kX2lubyA9IDA7CS8qIE5vdCBhcHBsaWNhYmxlICovCisJCWRpcmVudC0+ZF9vZmYgPSAwOwkvKiBOb3QgYXBwbGljYWJsZSAqLworCQlkaXJlbnQtPmRfcmVjbGVuID0gb2Zmc2V0b2Yoc3RydWN0IGRpcmVudCwgZF9uYW1lKSArIGxlbisxOworCQltZW1jcHkoZGlyZW50LT5kX25hbWUsIG5hbWUsIGxlbisxKTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisKKwkvKiBPdGhlcndpc2UgdHJ5IHRoZSBuZXh0IGxpbmUuLi4gKi8KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL3B4ZS9ncHhldXJsLmMgYi9jb3JlL2ZzL3B4ZS9ncHhldXJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiYWUzYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvcHhlL2dweGV1cmwuYwpAQCAtMCwwICsxLDg4IEBACisjaW5jbHVkZSAicHhlLmgiCisjaWYgR1BYRQorCitzdGF0aWMgdm9pZCBncHhlX2Nsb3NlX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0ID0gUFZUKGlub2RlKTsKKyAgICBzdGF0aWMgX19sb3dtZW0gc3RydWN0IHNfUFhFTlZfRklMRV9DTE9TRSBmaWxlX2Nsb3NlOworCisgICAgZmlsZV9jbG9zZS5GaWxlSGFuZGxlID0gc29ja2V0LT50ZnRwX3JlbW90ZXBvcnQ7CisgICAgcHhlX2NhbGwoUFhFTlZfRklMRV9DTE9TRSwgJmZpbGVfY2xvc2UpOworfQorCisvKioKKyAqIEdldCBhIGZyZXNoIHBhY2tldCBmcm9tIGEgZ1BYRSBzb2NrZXQKKyAqIEBwYXJhbTogaW5vZGUgLT4gSW5vZGUgcG9pbnRlcgorICoKKyAqLworc3RhdGljIHZvaWQgZ3B4ZV9nZXRfcGFja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCA9IFBWVChpbm9kZSk7CisgICAgc3RhdGljIF9fbG93bWVtIHN0cnVjdCBzX1BYRU5WX0ZJTEVfUkVBRCBmaWxlX3JlYWQ7CisgICAgaW50IGVycjsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGZpbGVfcmVhZC5GaWxlSGFuZGxlICA9IHNvY2tldC0+dGZ0cF9yZW1vdGVwb3J0OworICAgICAgICBmaWxlX3JlYWQuQnVmZmVyICAgICAgPSBGQVJfUFRSKHBhY2tldF9idWYpOworICAgICAgICBmaWxlX3JlYWQuQnVmZmVyU2l6ZSAgPSBQS1RCVUZfU0laRTsKKyAgICAgICAgZXJyID0gcHhlX2NhbGwoUFhFTlZfRklMRV9SRUFELCAmZmlsZV9yZWFkKTsKKyAgICAgICAgaWYgKCFlcnIpICAvKiBzdWNjZXNzZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChmaWxlX3JlYWQuU3RhdHVzICE9IFBYRU5WX1NUQVRVU19URlRQX09QRU4pCisJICAgIGthYm9vbSgpOworICAgIH0KKworICAgIG1lbWNweShzb2NrZXQtPnRmdHBfcGt0YnVmLCBwYWNrZXRfYnVmLCBmaWxlX3JlYWQuQnVmZmVyU2l6ZSk7CisKKyAgICBzb2NrZXQtPnRmdHBfZGF0YXB0ciAgID0gc29ja2V0LT50ZnRwX3BrdGJ1ZjsKKyAgICBzb2NrZXQtPnRmdHBfYnl0ZXNsZWZ0ID0gZmlsZV9yZWFkLkJ1ZmZlclNpemU7CisgICAgc29ja2V0LT50ZnRwX2ZpbGVwb3MgICs9IGZpbGVfcmVhZC5CdWZmZXJTaXplOworCisgICAgaWYgKHNvY2tldC0+dGZ0cF9ieXRlc2xlZnQgPT0gMCkKKyAgICAgICAgaW5vZGUtPnNpemUgPSBzb2NrZXQtPnRmdHBfZmlsZXBvczsKKworICAgIC8qIGlmIHdlJ3JlIGRvbmUgaGVyZSwgY2xvc2UgdGhlIGZpbGUgKi8KKyAgICBpZiAoaW5vZGUtPnNpemUgPiBzb2NrZXQtPnRmdHBfZmlsZXBvcykKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogR290IEVPRiwgY2xvc2UgaXQgKi8KKyAgICBzb2NrZXQtPnRmdHBfZ290ZW9mID0gMTsKKyAgICBncHhlX2Nsb3NlX2ZpbGUoaW5vZGUpOworfQorCisvKioKKyAqIE9wZW4gYSB1cmwgdXNpbmcgZ3B4ZQorICoKKyAqIEBwYXJhbTppbm9kZSwgdGhlIGlub2RlIHRvIHN0b3JlIG91ciBzdGF0ZSBpbgorICogQHBhcmFtOnVybCwgdGhlIHVybCB3ZSB3YW50IHRvIG9wZW4KKyAqCisgKiBAb3V0OiBvcGVuX2ZpbGVfdCBzdHJ1Y3R1cmUsIHN0b3JlcyBpbiBmaWxlLT5vcGVuX2ZpbGUKKyAqIEBvdXQ6IHRoZSBsZW5naHQgb2YgdGhpcyBmaWxlLCBzdG9yZXMgaW4gZmlsZS0+ZmlsZV9sZW4KKyAqCisgKi8KK3ZvaWQgZ3B4ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnVybCkKK3sKKyAgICBzdGF0aWMgX19sb3dtZW0gc3RydWN0IHNfUFhFTlZfRklMRV9PUEVOIGZpbGVfb3BlbjsKKyAgICBzdGF0aWMgY2hhciBsb3d1cmxbMipGSUxFTkFNRV9NQVhdOworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQgPSBQVlQoaW5vZGUpOworICAgIGludCBlcnI7CisKKyAgICBzb2NrZXQtPnRmdHBfcGt0YnVmID0gbWFsbG9jKFBLVEJVRl9TSVpFKTsKKyAgICBpZiAoIXNvY2tldC0+dGZ0cF9wa3RidWYpCisJcmV0dXJuOworCisgICAgc25wcmludGYobG93dXJsLCBzaXplb2YgbG93dXJsLCAiJXMiLCB1cmwpOworICAgIGZpbGVfb3Blbi5TdGF0dXMgICAgICAgID0gUFhFTlZfU1RBVFVTX0JBRF9GVU5DOworICAgIGZpbGVfb3Blbi5GaWxlTmFtZSAgICAgID0gRkFSX1BUUihsb3d1cmwpOworICAgIGVyciA9IHB4ZV9jYWxsKFBYRU5WX0ZJTEVfT1BFTiwgJmZpbGVfb3Blbik7CisgICAgaWYgKGVycikKKwlyZXR1cm47IAorCisgICAgc29ja2V0LT5maWxsX2J1ZmZlciA9IGdweGVfZ2V0X3BhY2tldDsKKyAgICBzb2NrZXQtPmNsb3NlID0gZ3B4ZV9jbG9zZV9maWxlOworICAgIHNvY2tldC0+dGZ0cF9yZW1vdGVwb3J0ID0gZmlsZV9vcGVuLkZpbGVIYW5kbGU7CisgICAgaW5vZGUtPnNpemUgPSAtMTsgLyogVGhpcyBpcyBub3QgYW4gZXJyb3IgKi8KK30KKworI2VuZGlmIC8qIEdQWEUgKi8KZGlmZiAtLWdpdCBhL2NvcmUvZnMvcHhlL2h0dHAuYyBiL2NvcmUvZnMvcHhlL2h0dHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzY4YzEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9weGUvaHR0cC5jCkBAIC0wLDAgKzEsMzkyIEBACisjaW5jbHVkZSA8c3lzbGludXgvc3lzYXBwZW5kLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxsd2lwL2FwaS5oPgorI2luY2x1ZGUgInB4ZS5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJ1cmwuaCIKKyNpbmNsdWRlICJuZXQuaCIKKworI2RlZmluZSBIVFRQX1BPUlQJODAKKworc3RhdGljIGJvb2wgaXNfdHNwZWNpYWwoaW50IGNoKQoreworICAgIGJvb2wgdHNwZWNpYWwgPSBmYWxzZTsKKyAgICBzd2l0Y2goY2gpIHsKKyAgICBjYXNlICcoJzogIGNhc2UgJyknOiAgY2FzZSAnPCc6ICBjYXNlICc+JzogIGNhc2UgJ0AnOgorICAgIGNhc2UgJywnOiAgY2FzZSAnOyc6ICBjYXNlICc6JzogIGNhc2UgJ1xcJzogY2FzZSAnIic6CisgICAgY2FzZSAnLyc6ICBjYXNlICdbJzogIGNhc2UgJ10nOiAgY2FzZSAnPyc6ICBjYXNlICc9JzoKKyAgICBjYXNlICd7JzogIGNhc2UgJ30nOiAgY2FzZSAnICc6ICBjYXNlICdcdCc6CisJdHNwZWNpYWwgPSB0cnVlOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdHNwZWNpYWw7Cit9CisKK3N0YXRpYyBib29sIGlzX2N0bChpbnQgY2gpCit7CisgICAgcmV0dXJuIGNoIDwgMHgyMDsKK30KKworc3RhdGljIGJvb2wgaXNfdG9rZW4oaW50IGNoKQoreworICAgIC8qIENhbiBieSBhbnR5aW5nIGV4Y2VwdCBhIGN0bCBjaGFyYWN0ZXIgb3IgYSB0c3BlY2lhbCAqLworICAgIHJldHVybiAhaXNfY3RsKGNoKSAmJiAhaXNfdHNwZWNpYWwoY2gpOworfQorCitzdGF0aWMgYm9vbCBhcHBlbmRfY2goY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90ICpwb3MsIGludCBjaCkKK3sKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOworICAgIGlmICgoKnBvcyArIDEpID49IHNpemUpIHsKKwkqcG9zID0gMDsKKwlzdWNjZXNzID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKwlzdHJbKnBvc10gPSBjaDsKKwlzdHJbKnBvcyArIDFdID0gJ1wwJzsKKwkqcG9zICs9IDE7CisgICAgfQorICAgIHJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgc2l6ZV90IGNvb2tpZV9sZW4sIGhlYWRlcl9sZW47CitzdGF0aWMgY2hhciAqY29va2llX2J1ZiwgKmhlYWRlcl9idWY7CisKK19fZXhwb3J0IHVpbnQzMl90IFNlbmRDb29raWVzID0gLTFVTDsgLyogU2VuZCBhbGwgY29va2llcyAqLworCitzdGF0aWMgc2l6ZV90IGh0dHBfZG9fYmFrZV9jb29raWVzKGNoYXIgKnEpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgdWNoZXhjaGFyWzE2XSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKyAgICBpbnQgaTsKKyAgICBzaXplX3QgbiA9IDA7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIGM7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgdWludDMyX3QgbWFzayA9IFNlbmRDb29raWVzOworCisgICAgZm9yIChpID0gMDsgaSA8IFNZU0FQUEVORF9NQVg7IGkrKykgeworCWlmICgobWFzayAmIDEpICYmIChwID0gc3lzYXBwZW5kX3N0cmluZ3NbaV0pKSB7CisJICAgIGlmIChmaXJzdCkgeworCQlpZiAocSkgeworCQkgICAgc3RyY3B5KHEsICJDb29raWU6ICIpOworCQkgICAgcSArPSA4OworCQl9CisJCW4gKz0gODsKKwkJZmlyc3QgPSBmYWxzZTsKKwkgICAgfQorCSAgICBpZiAocSkgeworCQlzdHJjcHkocSwgIl9TeXNsaW51eF8iKTsKKwkJcSArPSAxMDsKKwkgICAgfQorCSAgICBuICs9IDEwOworCSAgICAvKiBDb3B5IHN0cmluZyB1cCB0byBhbmQgaW5jbHVkaW5nICc9JyAqLworCSAgICBkbyB7CisJCWMgPSAqcCsrOworCQlpZiAocSkKKwkJICAgICpxKysgPSBjOworCQluKys7CisJICAgIH0gd2hpbGUgKGMgIT0gJz0nKTsKKwkgICAgd2hpbGUgKChjID0gKnArKykpIHsKKwkJaWYgKGMgPT0gJyAnKSB7CisJCSAgICBpZiAocSkKKwkJCSpxKysgPSAnKyc7CisJCSAgICBuKys7CisJCX0gZWxzZSBpZiAoaXNfdG9rZW4oYykpIHsKKwkJICAgIGlmIChxKQorCQkJKnErKyA9IGM7CisJCSAgICBuKys7CisJCX0gZWxzZSB7CisJCSAgICBpZiAocSkgeworCQkJKnErKyA9ICclJzsKKwkJCSpxKysgPSB1Y2hleGNoYXJbYyA+PiA0XTsKKwkJCSpxKysgPSB1Y2hleGNoYXJbYyAmIDE1XTsKKwkJICAgIH0KKwkJICAgIG4gKz0gMzsKKwkJfQorCSAgICB9CisJICAgIGlmIChxKQorCQkqcSsrID0gJzsnOworCSAgICBuKys7CisJfQorCW1hc2sgPj49IDE7CisgICAgfQorICAgIGlmICghZmlyc3QpIHsKKwlpZiAocSkgeworCSAgICAqcSsrID0gJ1xyJzsKKwkgICAgKnErKyA9ICdcbic7CisJfQorCW4gKz0gMjsKKyAgICB9CisgICAgaWYgKHEpCisJKnEgPSAnXDAnOworICAgIAorICAgIHJldHVybiBuOworfQorCitfX2V4cG9ydCB2b2lkIGh0dHBfYmFrZV9jb29raWVzKHZvaWQpCit7CisgICAgaWYgKGNvb2tpZV9idWYpCisJZnJlZShjb29raWVfYnVmKTsKKworICAgIGNvb2tpZV9sZW4gPSBodHRwX2RvX2Jha2VfY29va2llcyhOVUxMKTsKKyAgICBjb29raWVfYnVmID0gbWFsbG9jKGNvb2tpZV9sZW4rMSk7CisgICAgaWYgKCFjb29raWVfYnVmKSB7CisJY29va2llX2xlbiA9IDA7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmIChoZWFkZXJfYnVmKQorCWZyZWUoaGVhZGVyX2J1Zik7CisKKyAgICBoZWFkZXJfbGVuID0gY29va2llX2xlbiArIDYqRklMRU5BTUVfTUFYICsgMjU2OworICAgIGhlYWRlcl9idWYgPSBtYWxsb2MoaGVhZGVyX2xlbik7CisgICAgaWYgKCFoZWFkZXJfYnVmKSB7CisJaGVhZGVyX2xlbiA9IDA7CisJcmV0dXJuOwkJCS8qIFVoLW9oLi4uICovCisgICAgfQorCisgICAgaHR0cF9kb19iYWtlX2Nvb2tpZXMoY29va2llX2J1Zik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHhlX2Nvbm5fb3BzIGh0dHBfY29ubl9vcHMgPSB7CisgICAgLmZpbGxfYnVmZmVyCT0gY29yZV90Y3BfZmlsbF9idWZmZXIsCisgICAgLmNsb3NlCQk9IGNvcmVfdGNwX2Nsb3NlX2ZpbGUsCisgICAgLnJlYWRkaXIJCT0gaHR0cF9yZWFkZGlyLAorfTsKKwordm9pZCBodHRwX29wZW4oc3RydWN0IHVybF9pbmZvICp1cmwsIGludCBmbGFncywgc3RydWN0IGlub2RlICppbm9kZSwKKwkgICAgICAgY29uc3QgY2hhciAqKnJlZGlyKQoreworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQgPSBQVlQoaW5vZGUpOworICAgIGludCBoZWFkZXJfYnl0ZXM7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKyAgICBjaGFyIGZpZWxkX25hbWVbMjBdOworICAgIGNoYXIgZmllbGRfdmFsdWVbMTAyNF07CisgICAgc2l6ZV90IGZpZWxkX25hbWVfbGVuLCBmaWVsZF92YWx1ZV9sZW47CisgICAgZW51bSBzdGF0ZSB7CisJc3RfaHR0cHZlciwKKwlzdF9zdGNvZGUsCisJc3Rfc2tpcGxpbmUsCisJc3RfZmllbGRmaXJzdCwKKwlzdF9maWVsZG5hbWUsCisJc3RfZmllbGR2YWx1ZSwKKwlzdF9za2lwX2ZpZWxkbmFtZSwKKwlzdF9za2lwX2ZpZWxkdmFsdWUsCisJc3RfZW9oLAorICAgIH0gc3RhdGU7CisgICAgc3RhdGljIGNoYXIgbG9jYXRpb25bRklMRU5BTUVfTUFYXTsKKyAgICB1aW50MzJfdCBjb250ZW50X2xlbmd0aDsgLyogc2FtZSBhcyBpbm9kZS0+c2l6ZSAqLworICAgIHNpemVfdCByZXNwb25zZV9zaXplOworICAgIGludCBzdGF0dXM7CisgICAgaW50IHBvczsKKyAgICBpbnQgZXJyOworCisgICAgKHZvaWQpZmxhZ3M7CisKKyAgICBpZiAoIWhlYWRlcl9idWYpCisJcmV0dXJuOwkJCS8qIGh0dHAgaXMgYnJva2VuLi4uICovCisKKyAgICAvKiBUaGlzIGlzIGEgc3RyYWlnaHRmb3J3YXJkIFRDUCBjb25uZWN0aW9uIGFmdGVyIGhlYWRlcnMgKi8KKyAgICBzb2NrZXQtPm9wcyA9ICZodHRwX2Nvbm5fb3BzOworCisgICAgLyogUmVzZXQgYWxsIG9mIHRoZSB2YXJpYWJsZXMgKi8KKyAgICBpbm9kZS0+c2l6ZSA9IGNvbnRlbnRfbGVuZ3RoID0gLTE7CisKKyAgICAvKiBTdGFydCB0aGUgaHR0cCBjb25uZWN0aW9uICovCisgICAgZXJyID0gY29yZV90Y3Bfb3Blbihzb2NrZXQpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghdXJsLT5wb3J0KQorCXVybC0+cG9ydCA9IEhUVFBfUE9SVDsKKworICAgIGVyciA9IGNvcmVfdGNwX2Nvbm5lY3Qoc29ja2V0LCB1cmwtPmlwLCB1cmwtPnBvcnQpOworICAgIGlmIChlcnIpCisJZ290byBmYWlsOworCisgICAgc3RyY3B5KGhlYWRlcl9idWYsICJHRVQgLyIpOworICAgIGhlYWRlcl9ieXRlcyA9IDU7CisgICAgaGVhZGVyX2J5dGVzICs9IHVybF9lc2NhcGVfdW5zYWZlKGhlYWRlcl9idWYrNSwgdXJsLT5wYXRoLAorCQkJCSAgICAgIGhlYWRlcl9sZW4gLSA1KTsKKyAgICBpZiAoaGVhZGVyX2J5dGVzID49IGhlYWRlcl9sZW4pCisJZ290byBmYWlsOwkJLyogQnVmZmVyIG92ZXJmbG93ICovCisgICAgaGVhZGVyX2J5dGVzICs9IHNucHJpbnRmKGhlYWRlcl9idWYgKyBoZWFkZXJfYnl0ZXMsCisJCQkgICAgIGhlYWRlcl9sZW4gLSBoZWFkZXJfYnl0ZXMsCisJCQkgICAgICIgSFRUUC8xLjBcclxuIgorCQkJICAgICAiSG9zdDogJXNcclxuIgorCQkJICAgICAiVXNlci1BZ2VudDogU3lzbGludXgvIiBWRVJTSU9OX1NUUiAiXHJcbiIKKwkJCSAgICAgIkNvbm5lY3Rpb246IGNsb3NlXHJcbiIKKwkJCSAgICAgIiVzIgorCQkJICAgICAiXHJcbiIsCisJCQkgICAgIHVybC0+aG9zdCwgY29va2llX2J1ZiA/IGNvb2tpZV9idWYgOiAiIik7CisgICAgaWYgKGhlYWRlcl9ieXRlcyA+PSBoZWFkZXJfbGVuKQorCWdvdG8gZmFpbDsJCS8qIEJ1ZmZlciBvdmVyZmxvdyAqLworCisgICAgZXJyID0gY29yZV90Y3Bfd3JpdGUoc29ja2V0LCBoZWFkZXJfYnVmLCBoZWFkZXJfYnl0ZXMsIGZhbHNlKTsKKyAgICBpZiAoZXJyKQorCWdvdG8gZmFpbDsKKworICAgIC8qIFBhcnNlIHRoZSBIVFRQIGhlYWRlciAqLworICAgIHN0YXRlID0gc3RfaHR0cHZlcjsKKyAgICBwb3MgPSAwOworICAgIHN0YXR1cyA9IDA7CisgICAgcmVzcG9uc2Vfc2l6ZSA9IDA7CisgICAgZmllbGRfdmFsdWVfbGVuID0gMDsKKyAgICBmaWVsZF9uYW1lX2xlbiA9IDA7CisKKyAgICB3aGlsZSAoc3RhdGUgIT0gc3RfZW9oKSB7CisJaW50IGNoID0gcHhlX2dldGMoaW5vZGUpOworCS8qIEVvZiBiZWZvcmUgSSBmaW5pc2ggcGFyaW5nIHRoZSBoZWFkZXIgKi8KKwlpZiAoY2ggPT0gLTEpCisJICAgIGdvdG8gZmFpbDsKKyNpZiAwCisgICAgICAgIHByaW50ZigiJWMiLCBjaCk7CisjZW5kaWYKKwlyZXNwb25zZV9zaXplKys7CisJaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1wwJykKKwkgICAgY29udGludWU7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2Ugc3RfaHR0cHZlcjoKKwkgICAgaWYgKGNoID09ICcgJykgeworCQlzdGF0ZSA9IHN0X3N0Y29kZTsKKwkJcG9zID0gMDsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2Ugc3Rfc3Rjb2RlOgorCSAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisJICAgICAgIGdvdG8gZmFpbDsKKwkgICAgc3RhdHVzID0gKHN0YXR1cyoxMCkgKyAoY2ggLSAnMCcpOworCSAgICBpZiAoKytwb3MgPT0gMykKKwkJc3RhdGUgPSBzdF9za2lwbGluZTsKKwkgICAgYnJlYWs7CisKKwljYXNlIHN0X3NraXBsaW5lOgorCSAgICBpZiAoY2ggPT0gJ1xuJykKKwkJc3RhdGUgPSBzdF9maWVsZGZpcnN0OworCSAgICBicmVhazsKKworCWNhc2Ugc3RfZmllbGRmaXJzdDoKKwkgICAgaWYgKGNoID09ICdcbicpCisJCXN0YXRlID0gc3RfZW9oOworCSAgICBlbHNlIGlmIChpc3NwYWNlKGNoKSkgeworCQkvKiBBIGNvbnRpbnVhdGlvbiBsaW5lICovCisJCXN0YXRlID0gc3RfZmllbGR2YWx1ZTsKKwkJZ290byBmaWVsZHZhbHVlOworCSAgICB9CisJICAgIGVsc2UgaWYgKGlzX3Rva2VuKGNoKSkgeworCQkvKiBQcm9jZXNzIHRoZSBwcmV2aW91cyBmaWVsZCBiZWZvcmUgc3RhcnRpbmcgb24gdGhlIG5leHQgb25lICovCisJCWlmIChzdHJjYXNlY21wKGZpZWxkX25hbWUsICJDb250ZW50LUxlbmd0aCIpID09IDApIHsKKwkJICAgIG5leHQgPSBmaWVsZF92YWx1ZTsKKwkJICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisJCSAgICB3aGlsZSAoaXNzcGFjZSgqbmV4dCkpCisJCQluZXh0Kys7CisJCSAgICBjb250ZW50X2xlbmd0aCA9IDA7CisJCSAgICBmb3IgKDsoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5Jyk7IG5leHQrKykgeworCQkJaWYgKChjb250ZW50X2xlbmd0aCAqIDEwKSA8IGNvbnRlbnRfbGVuZ3RoKQorCQkJICAgIGJyZWFrOworCQkJY29udGVudF9sZW5ndGggPSAoY29udGVudF9sZW5ndGggKiAxMCkgKyAoKm5leHQgLSAnMCcpOworCQkgICAgfQorCQkgICAgLyogSW4gdGhlIGNhc2Ugb2Ygb3ZlcmZsb3cgb3Igb3RoZXIgZXJyb3IgaWdub3JlCisJCSAgICAgKiBDb250ZW50LUxlbmd0aC4KKwkJICAgICAqLworCQkgICAgaWYgKCpuZXh0KQorCQkJY29udGVudF9sZW5ndGggPSAtMTsKKwkJfQorCQllbHNlIGlmIChzdHJjYXNlY21wKGZpZWxkX25hbWUsICJMb2NhdGlvbiIpID09IDApIHsKKwkJICAgIG5leHQgPSBmaWVsZF92YWx1ZTsKKwkJICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisJCSAgICB3aGlsZSAoaXNzcGFjZSgqbmV4dCkpCisJCQluZXh0Kys7CisJCSAgICBzdHJsY3B5KGxvY2F0aW9uLCBuZXh0LCBzaXplb2YgbG9jYXRpb24pOworCQl9CisJCS8qIFN0YXJ0IHRoZSBmaWVsZCBuYW1lIGFuZCBmaWVsZCB2YWx1ZSBhZnJlc3MgKi8KKwkJZmllbGRfbmFtZV9sZW4gPSAxOworCQlmaWVsZF9uYW1lWzBdID0gY2g7CisJCWZpZWxkX25hbWVbMV0gPSAnXDAnOworCQlmaWVsZF92YWx1ZV9sZW4gPSAwOworCQlmaWVsZF92YWx1ZVswXSA9ICdcMCc7CisJCXN0YXRlID0gc3RfZmllbGRuYW1lOworCSAgICB9CisJICAgIGVsc2UgLyogQm9ndXMgdHJ5IHRvIHJlY292ZXIgKi8KKwkJc3RhdGUgPSBzdF9za2lwbGluZTsKKwkgICAgYnJlYWs7CisKKwljYXNlIHN0X2ZpZWxkbmFtZToKKwkgICAgaWYgKGNoID09ICc6JyApIHsKKwkJc3RhdGUgPSBzdF9maWVsZHZhbHVlOworCSAgICB9CisJICAgIGVsc2UgaWYgKGlzX3Rva2VuKGNoKSkgeworCQlpZiAoIWFwcGVuZF9jaChmaWVsZF9uYW1lLCBzaXplb2YgZmllbGRfbmFtZSwgJmZpZWxkX25hbWVfbGVuLCBjaCkpCisJCSAgICBzdGF0ZSA9IHN0X3NraXBfZmllbGRuYW1lOworCSAgICB9CisJICAgIC8qIEJvZ3VzIGNhc2VzIHRyeSB0byByZWNvdmVyICovCisJICAgIGVsc2UgaWYgKGNoID09ICdcbicpCisJCXN0YXRlID0gc3RfZmllbGRmaXJzdDsKKwkgICAgZWxzZQorCQlzdGF0ZSA9IHN0X3NraXBsaW5lOworCSAgICBicmVhazsKKworCSBjYXNlIHN0X2ZpZWxkdmFsdWU6CisJICAgIGlmIChjaCA9PSAnXG4nKQorCQlzdGF0ZSA9IHN0X2ZpZWxkZmlyc3Q7CisJICAgIGVsc2UgeworCSAgICBmaWVsZHZhbHVlOgorCQlpZiAoIWFwcGVuZF9jaChmaWVsZF92YWx1ZSwgc2l6ZW9mIGZpZWxkX3ZhbHVlLCAmZmllbGRfdmFsdWVfbGVuLCBjaCkpCisJCSAgICBzdGF0ZSA9IHN0X3NraXBfZmllbGR2YWx1ZTsKKwkgICAgfQorCSAgICBicmVhazsKKworCS8qIEZvciB2YWxpZCBmaWVsZHMgd2hvc2UgbmFtZXMgYXJlIGxvbmdlciB0aGFuIEkgY2hvb3NlIHRvIHN1cHBvcnQuICovCisJY2FzZSBzdF9za2lwX2ZpZWxkbmFtZToKKwkgICAgaWYgKGNoID09ICc6JykKKwkJc3RhdGUgPSBzdF9za2lwX2ZpZWxkdmFsdWU7CisJICAgIGVsc2UgaWYgKGlzX3Rva2VuKGNoKSkKKwkJc3RhdGUgPSBzdF9za2lwX2ZpZWxkbmFtZTsKKwkgICAgLyogQm9ndXMgY2FzZXMgdHJ5IHRvIHJlY292ZXIgKi8KKwkgICAgZWxzZSBpZiAoY2ggPT0gJ1xuJykKKwkJc3RhdGUgPSBzdF9maWVsZGZpcnN0OworCSAgICBlbHNlCisJCXN0YXRlID0gc3Rfc2tpcGxpbmU7CisJICAgIGJyZWFrOworCisJLyogRm9yIHZhbGlkIGZpZWxkcyB3aG9zZSBib2RpZXMgYXJlIGxvbmdlciB0aGFuIEkgY2hvb3NlIHRvIHN1cHBvcnQuICovCisJY2FzZSBzdF9za2lwX2ZpZWxkdmFsdWU6CisJICAgIGlmIChjaCA9PSAnXG4nKQorCQlzdGF0ZSA9IHN0X2ZpZWxkZmlyc3Q7CisJICAgIGJyZWFrOworCisJY2FzZSBzdF9lb2g6CisJICAgYnJlYWs7IC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwl9CisgICAgfQorCisgICAgaWYgKHN0YXRlICE9IHN0X2VvaCkKKwlzdGF0dXMgPSAwOworCisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIDIwMDoKKwkvKgorCSAqIEFsbCBPSywgbmVlZCB0byBtYXJrIGhlYWRlciBkYXRhIGNvbnN1bWVkIGFuZCBzZXQgdXAgYSBmaWxlCisJICogc3RydWN0dXJlLi4uCisJICovCisJLyogVHJlYXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYnl0ZXMgYXMgZGF0YSAqLworCXNvY2tldC0+dGZ0cF9maWxlcG9zIC09IHJlc3BvbnNlX3NpemU7CisJYnJlYWs7CisgICAgY2FzZSAzMDE6CisgICAgY2FzZSAzMDI6CisgICAgY2FzZSAzMDM6CisgICAgY2FzZSAzMDc6CisJLyogQSByZWRpcmVjdCAqLworCWlmICghbG9jYXRpb25bMF0pCisJICAgIGdvdG8gZmFpbDsKKwkqcmVkaXIgPSBsb2NhdGlvbjsKKwlnb3RvIGZhaWw7CisgICAgZGVmYXVsdDoKKwlnb3RvIGZhaWw7CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKK2ZhaWw6CisgICAgaW5vZGUtPnNpemUgPSAwOworICAgIGNvcmVfdGNwX2Nsb3NlX2ZpbGUoaW5vZGUpOworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMvcHhlL2h0dHBfcmVhZGRpci5jIGIvY29yZS9mcy9weGUvaHR0cF9yZWFkZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlNDgwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvcHhlL2h0dHBfcmVhZGRpci5jCkBAIC0wLDAgKzEsNDcxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlICJweGUuaCIKKworZW51bSBodHRwX3JlYWRkaXJfc3RhdGUgeworICAgIHN0X3N0YXJ0LAkJCS8qICAwIEluaXRpYWwgc3RhdGUgKi8KKyAgICBzdF9vcGVuLAkJCS8qICAxICI8IiAqLworICAgIHN0X2EsCQkJLyogIDIgIjxhIiAqLworICAgIHN0X2F0dHJpYnV0ZSwJCS8qICAzICI8YSAiICovCisgICAgc3RfaCwJCQkvKiAgNCAiPGEgaCIgKi8KKyAgICBzdF9ociwJCQkvKiAgNSAqLworICAgIHN0X2hyZSwJCQkvKiAgNiAqLworICAgIHN0X2hyZWYsCQkJLyogIDcgKi8KKyAgICBzdF9ocmVmZXEsCQkJLyogIDggKi8KKyAgICBzdF9ocmVmcXUsCQkJLyogIDkgKi8KKyAgICBzdF9iYWR0YWcsCQkJLyogMTAgKi8KKyAgICBzdF9iYWR0YWdxdSwJCS8qIDExICovCisgICAgc3RfYmFkYXR0ciwJCQkvKiAxMiAqLworICAgIHN0X2JhZGF0dHJxdSwJCS8qIDEzICovCit9OworCitzdHJ1Y3QgbWFjaGluZSB7CisgICAgY2hhciB4Y2hhcjsKKyAgICB1aW50OF90IHN0X3hjaGFyOworICAgIHVpbnQ4X3Qgc3RfbGVmdDsJCS8qIDwgKi8KKyAgICB1aW50OF90IHN0X3JpZ2h0OwkJLyogPiAqLworICAgIHVpbnQ4X3Qgc3Rfc3BhY2U7CQkvKiB3aGl0ZSAqLworICAgIHVpbnQ4X3Qgc3Rfb3RoZXI7CQkvKiBhbnl0aGluZyBlbHNlICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1hY2hpbmUgc3RhdGVtYWNoaW5lW10gPSB7CisgICAgLyogeGNoYXIJc3RfeGNoYXIJc3RfbGVmdAkJc3RfcmlnaHQJc3Rfc3BhY2UJc3Rfb3RoZXIgKi8KKyAgICB7IDAsCTAsCQlzdF9vcGVuLAlzdF9zdGFydCwJc3Rfc3RhcnQsCXN0X3N0YXJ0IH0sCisgICAgeyAnYScsCXN0X2EsCQlzdF9iYWR0YWcsCXN0X3N0YXJ0LAlzdF9vcGVuLAlzdF9iYWR0YWcgfSwKKyAgICB7IDAsCTAsCQlzdF9vcGVuLAlzdF9vcGVuLAlzdF9hdHRyaWJ1dGUsCXN0X2JhZHRhZyB9LAorICAgIHsgJ2gnLAlzdF9oLAkJc3Rfb3BlbiwJc3Rfc3RhcnQsCXN0X2F0dHJpYnV0ZSwJc3RfYmFkYXR0ciB9LAorICAgIHsgJ3InLAlzdF9ociwJCXN0X29wZW4sCXN0X3N0YXJ0LAlzdF9hdHRyaWJ1dGUsCXN0X2JhZGF0dHIgfSwKKyAgICB7ICdlJywJc3RfaHJlLAkJc3Rfb3BlbiwJc3Rfc3RhcnQsCXN0X2F0dHJpYnV0ZSwJc3RfYmFkYXR0ciB9LAorICAgIHsgJ2YnLAlzdF9ocmVmLAlzdF9vcGVuLAlzdF9zdGFydCwJc3RfYXR0cmlidXRlLAlzdF9iYWRhdHRyIH0sCisgICAgeyAnPScsCXN0X2hyZWZlcSwJc3Rfb3BlbiwJc3Rfc3RhcnQsCXN0X2F0dHJpYnV0ZSwJc3RfYmFkYXR0ciB9LAorICAgIHsgJ1wiJywJc3RfaHJlZnF1LAlzdF9vcGVuLAlzdF9zdGFydCwJc3RfYXR0cmlidXRlLAlzdF9ocmVmZXEgfSwKKyAgICB7ICdcIicsCXN0X2F0dHJpYnV0ZSwJc3RfaHJlZnF1LAlzdF9ocmVmcXUsCXN0X2hyZWZxdSwJc3RfaHJlZnF1IH0sCisgICAgeyAnXCInLAlzdF9iYWR0YWdxdSwJc3Rfb3BlbiwJc3Rfc3RhcnQsCXN0X2JhZHRhZywJc3RfYmFkdGFnIH0sCisgICAgeyAnXCInLAlzdF9iYWR0YWcsCXN0X2JhZHRhZ3F1LAlzdF9iYWR0YWdxdSwJc3RfYmFkdGFncXUsCXN0X2JhZHRhZ3F1IH0sCisgICAgeyAnXCInLAlzdF9iYWRhdHRycXUsCXN0X29wZW4sCXN0X3N0YXJ0LAlzdF9hdHRyaWJ1dGUsCXN0X2JhZGF0dHIgfSwKKyAgICB7ICdcIicsCXN0X2F0dHJpYnV0ZSwJc3RfYmFkYXR0cnF1LAlzdF9iYWRhdHRycXUsCXN0X2JhZGF0dHJxdSwJc3RfYmFkYXR0cnF1IH0sCit9OworCitzdHJ1Y3QgaHRtbF9lbnRpdHkgeworICAgIHVpbnQxNl90IHVjczsKKyAgICBjb25zdCBjaGFyIGVudGl0eVs5XTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHRtbF9lbnRpdHkgZW50aXRpZXNbXSA9IHsKKyAgICB7ICAgMzQsICJxdW90IiB9LAorICAgIHsgICAzOCwgImFtcCIgfSwKKyAgICB7ICAgNjAsICJsdCIgfSwKKyAgICB7ICAgNjIsICJndCIgfSwKKyNpZmRlZiBIVFRQX0FMTF9FTlRJVElFUworICAgIHsgIDE2MCwgIm5ic3AiIH0sCisgICAgeyAgMTYxLCAiaWV4Y2wiIH0sCisgICAgeyAgMTYyLCAiY2VudCIgfSwKKyAgICB7ICAxNjMsICJwb3VuZCIgfSwKKyAgICB7ICAxNjQsICJjdXJyZW4iIH0sCisgICAgeyAgMTY1LCAieWVuIiB9LAorICAgIHsgIDE2NiwgImJydmJhciIgfSwKKyAgICB7ICAxNjcsICJzZWN0IiB9LAorICAgIHsgIDE2OCwgInVtbCIgfSwKKyAgICB7ICAxNjksICJjb3B5IiB9LAorICAgIHsgIDE3MCwgIm9yZGYiIH0sCisgICAgeyAgMTcxLCAibGFxdW8iIH0sCisgICAgeyAgMTcyLCAibm90IiB9LAorICAgIHsgIDE3MywgInNoeSIgfSwKKyAgICB7ICAxNzQsICJyZWciIH0sCisgICAgeyAgMTc1LCAibWFjciIgfSwKKyAgICB7ICAxNzYsICJkZWciIH0sCisgICAgeyAgMTc3LCAicGx1c21uIiB9LAorICAgIHsgIDE3OCwgInN1cDIiIH0sCisgICAgeyAgMTc5LCAic3VwMyIgfSwKKyAgICB7ICAxODAsICJhY3V0ZSIgfSwKKyAgICB7ICAxODEsICJtaWNybyIgfSwKKyAgICB7ICAxODIsICJwYXJhIiB9LAorICAgIHsgIDE4MywgIm1pZGRvdCIgfSwKKyAgICB7ICAxODQsICJjZWRpbCIgfSwKKyAgICB7ICAxODUsICJzdXAxIiB9LAorICAgIHsgIDE4NiwgIm9yZG0iIH0sCisgICAgeyAgMTg3LCAicmFxdW8iIH0sCisgICAgeyAgMTg4LCAiZnJhYzE0IiB9LAorICAgIHsgIDE4OSwgImZyYWMxMiIgfSwKKyAgICB7ICAxOTAsICJmcmFjMzQiIH0sCisgICAgeyAgMTkxLCAiaXF1ZXN0IiB9LAorICAgIHsgIDE5MiwgIkFncmF2ZSIgfSwKKyAgICB7ICAxOTMsICJBYWN1dGUiIH0sCisgICAgeyAgMTk0LCAiQWNpcmMiIH0sCisgICAgeyAgMTk1LCAiQXRpbGRlIiB9LAorICAgIHsgIDE5NiwgIkF1bWwiIH0sCisgICAgeyAgMTk3LCAiQXJpbmciIH0sCisgICAgeyAgMTk4LCAiQUVsaWciIH0sCisgICAgeyAgMTk5LCAiQ2NlZGlsIiB9LAorICAgIHsgIDIwMCwgIkVncmF2ZSIgfSwKKyAgICB7ICAyMDEsICJFYWN1dGUiIH0sCisgICAgeyAgMjAyLCAiRWNpcmMiIH0sCisgICAgeyAgMjAzLCAiRXVtbCIgfSwKKyAgICB7ICAyMDQsICJJZ3JhdmUiIH0sCisgICAgeyAgMjA1LCAiSWFjdXRlIiB9LAorICAgIHsgIDIwNiwgIkljaXJjIiB9LAorICAgIHsgIDIwNywgIkl1bWwiIH0sCisgICAgeyAgMjA4LCAiRVRIIiB9LAorICAgIHsgIDIwOSwgIk50aWxkZSIgfSwKKyAgICB7ICAyMTAsICJPZ3JhdmUiIH0sCisgICAgeyAgMjExLCAiT2FjdXRlIiB9LAorICAgIHsgIDIxMiwgIk9jaXJjIiB9LAorICAgIHsgIDIxMywgIk90aWxkZSIgfSwKKyAgICB7ICAyMTQsICJPdW1sIiB9LAorICAgIHsgIDIxNSwgInRpbWVzIiB9LAorICAgIHsgIDIxNiwgIk9zbGFzaCIgfSwKKyAgICB7ICAyMTcsICJVZ3JhdmUiIH0sCisgICAgeyAgMjE4LCAiVWFjdXRlIiB9LAorICAgIHsgIDIxOSwgIlVjaXJjIiB9LAorICAgIHsgIDIyMCwgIlV1bWwiIH0sCisgICAgeyAgMjIxLCAiWWFjdXRlIiB9LAorICAgIHsgIDIyMiwgIlRIT1JOIiB9LAorICAgIHsgIDIyMywgInN6bGlnIiB9LAorICAgIHsgIDIyNCwgImFncmF2ZSIgfSwKKyAgICB7ICAyMjUsICJhYWN1dGUiIH0sCisgICAgeyAgMjI2LCAiYWNpcmMiIH0sCisgICAgeyAgMjI3LCAiYXRpbGRlIiB9LAorICAgIHsgIDIyOCwgImF1bWwiIH0sCisgICAgeyAgMjI5LCAiYXJpbmciIH0sCisgICAgeyAgMjMwLCAiYWVsaWciIH0sCisgICAgeyAgMjMxLCAiY2NlZGlsIiB9LAorICAgIHsgIDIzMiwgImVncmF2ZSIgfSwKKyAgICB7ICAyMzMsICJlYWN1dGUiIH0sCisgICAgeyAgMjM0LCAiZWNpcmMiIH0sCisgICAgeyAgMjM1LCAiZXVtbCIgfSwKKyAgICB7ICAyMzYsICJpZ3JhdmUiIH0sCisgICAgeyAgMjM3LCAiaWFjdXRlIiB9LAorICAgIHsgIDIzOCwgImljaXJjIiB9LAorICAgIHsgIDIzOSwgIml1bWwiIH0sCisgICAgeyAgMjQwLCAiZXRoIiB9LAorICAgIHsgIDI0MSwgIm50aWxkZSIgfSwKKyAgICB7ICAyNDIsICJvZ3JhdmUiIH0sCisgICAgeyAgMjQzLCAib2FjdXRlIiB9LAorICAgIHsgIDI0NCwgIm9jaXJjIiB9LAorICAgIHsgIDI0NSwgIm90aWxkZSIgfSwKKyAgICB7ICAyNDYsICJvdW1sIiB9LAorICAgIHsgIDI0NywgImRpdmlkZSIgfSwKKyAgICB7ICAyNDgsICJvc2xhc2giIH0sCisgICAgeyAgMjQ5LCAidWdyYXZlIiB9LAorICAgIHsgIDI1MCwgInVhY3V0ZSIgfSwKKyAgICB7ICAyNTEsICJ1Y2lyYyIgfSwKKyAgICB7ICAyNTIsICJ1dW1sIiB9LAorICAgIHsgIDI1MywgInlhY3V0ZSIgfSwKKyAgICB7ICAyNTQsICJ0aG9ybiIgfSwKKyAgICB7ICAyNTUsICJ5dW1sIiB9LAorICAgIHsgIDMzOCwgIk9FbGlnIiB9LAorICAgIHsgIDMzOSwgIm9lbGlnIiB9LAorICAgIHsgIDM1MiwgIlNjYXJvbiIgfSwKKyAgICB7ICAzNTMsICJzY2Fyb24iIH0sCisgICAgeyAgMzc2LCAiWXVtbCIgfSwKKyAgICB7ICA0MDIsICJmbm9mIiB9LAorICAgIHsgIDcxMCwgImNpcmMiIH0sCisgICAgeyAgNzMyLCAidGlsZGUiIH0sCisgICAgeyAgOTEzLCAiQWxwaGEiIH0sCisgICAgeyAgOTE0LCAiQmV0YSIgfSwKKyAgICB7ICA5MTUsICJHYW1tYSIgfSwKKyAgICB7ICA5MTYsICJEZWx0YSIgfSwKKyAgICB7ICA5MTcsICJFcHNpbG9uIiB9LAorICAgIHsgIDkxOCwgIlpldGEiIH0sCisgICAgeyAgOTE5LCAiRXRhIiB9LAorICAgIHsgIDkyMCwgIlRoZXRhIiB9LAorICAgIHsgIDkyMSwgIklvdGEiIH0sCisgICAgeyAgOTIyLCAiS2FwcGEiIH0sCisgICAgeyAgOTIzLCAiTGFtYmRhIiB9LAorICAgIHsgIDkyNCwgIk11IiB9LAorICAgIHsgIDkyNSwgIk51IiB9LAorICAgIHsgIDkyNiwgIlhpIiB9LAorICAgIHsgIDkyNywgIk9taWNyb24iIH0sCisgICAgeyAgOTI4LCAiUGkiIH0sCisgICAgeyAgOTI5LCAiUmhvIiB9LAorICAgIHsgIDkzMSwgIlNpZ21hIiB9LAorICAgIHsgIDkzMiwgIlRhdSIgfSwKKyAgICB7ICA5MzMsICJVcHNpbG9uIiB9LAorICAgIHsgIDkzNCwgIlBoaSIgfSwKKyAgICB7ICA5MzUsICJDaGkiIH0sCisgICAgeyAgOTM2LCAiUHNpIiB9LAorICAgIHsgIDkzNywgIk9tZWdhIiB9LAorICAgIHsgIDk0NSwgImFscGhhIiB9LAorICAgIHsgIDk0NiwgImJldGEiIH0sCisgICAgeyAgOTQ3LCAiZ2FtbWEiIH0sCisgICAgeyAgOTQ4LCAiZGVsdGEiIH0sCisgICAgeyAgOTQ5LCAiZXBzaWxvbiIgfSwKKyAgICB7ICA5NTAsICJ6ZXRhIiB9LAorICAgIHsgIDk1MSwgImV0YSIgfSwKKyAgICB7ICA5NTIsICJ0aGV0YSIgfSwKKyAgICB7ICA5NTMsICJpb3RhIiB9LAorICAgIHsgIDk1NCwgImthcHBhIiB9LAorICAgIHsgIDk1NSwgImxhbWJkYSIgfSwKKyAgICB7ICA5NTYsICJtdSIgfSwKKyAgICB7ICA5NTcsICJudSIgfSwKKyAgICB7ICA5NTgsICJ4aSIgfSwKKyAgICB7ICA5NTksICJvbWljcm9uIiB9LAorICAgIHsgIDk2MCwgInBpIiB9LAorICAgIHsgIDk2MSwgInJobyIgfSwKKyAgICB7ICA5NjIsICJzaWdtYWYiIH0sCisgICAgeyAgOTYzLCAic2lnbWEiIH0sCisgICAgeyAgOTY0LCAidGF1IiB9LAorICAgIHsgIDk2NSwgInVwc2lsb24iIH0sCisgICAgeyAgOTY2LCAicGhpIiB9LAorICAgIHsgIDk2NywgImNoaSIgfSwKKyAgICB7ICA5NjgsICJwc2kiIH0sCisgICAgeyAgOTY5LCAib21lZ2EiIH0sCisgICAgeyAgOTc3LCAidGhldGFzeW0iIH0sCisgICAgeyAgOTc4LCAidXBzaWgiIH0sCisgICAgeyAgOTgyLCAicGl2IiB9LAorICAgIHsgODE5NCwgImVuc3AiIH0sCisgICAgeyA4MTk1LCAiZW1zcCIgfSwKKyAgICB7IDgyMDEsICJ0aGluc3AiIH0sCisgICAgeyA4MjA0LCAienduaiIgfSwKKyAgICB7IDgyMDUsICJ6d2oiIH0sCisgICAgeyA4MjA2LCAibHJtIiB9LAorICAgIHsgODIwNywgInJsbSIgfSwKKyAgICB7IDgyMTEsICJuZGFzaCIgfSwKKyAgICB7IDgyMTIsICJtZGFzaCIgfSwKKyAgICB7IDgyMTYsICJsc3F1byIgfSwKKyAgICB7IDgyMTcsICJyc3F1byIgfSwKKyAgICB7IDgyMTgsICJzYnF1byIgfSwKKyAgICB7IDgyMjAsICJsZHF1byIgfSwKKyAgICB7IDgyMjEsICJyZHF1byIgfSwKKyAgICB7IDgyMjIsICJiZHF1byIgfSwKKyAgICB7IDgyMjQsICJkYWdnZXIiIH0sCisgICAgeyA4MjI1LCAiRGFnZ2VyIiB9LAorICAgIHsgODIyNiwgImJ1bGwiIH0sCisgICAgeyA4MjMwLCAiaGVsbGlwIiB9LAorICAgIHsgODI0MCwgInBlcm1pbCIgfSwKKyAgICB7IDgyNDIsICJwcmltZSIgfSwKKyAgICB7IDgyNDMsICJQcmltZSIgfSwKKyAgICB7IDgyNDksICJsc2FxdW8iIH0sCisgICAgeyA4MjUwLCAicnNhcXVvIiB9LAorICAgIHsgODI1NCwgIm9saW5lIiB9LAorICAgIHsgODI2MCwgImZyYXNsIiB9LAorICAgIHsgODM2NCwgImV1cm8iIH0sCisgICAgeyA4NDY1LCAiaW1hZ2UiIH0sCisgICAgeyA4NDcyLCAid2VpZXJwIiB9LAorICAgIHsgODQ3NiwgInJlYWwiIH0sCisgICAgeyA4NDgyLCAidHJhZGUiIH0sCisgICAgeyA4NTAxLCAiYWxlZnN5bSIgfSwKKyAgICB7IDg1OTIsICJsYXJyIiB9LAorICAgIHsgODU5MywgInVhcnIiIH0sCisgICAgeyA4NTk0LCAicmFyciIgfSwKKyAgICB7IDg1OTUsICJkYXJyIiB9LAorICAgIHsgODU5NiwgImhhcnIiIH0sCisgICAgeyA4NjI5LCAiY3JhcnIiIH0sCisgICAgeyA4NjU2LCAibEFyciIgfSwKKyAgICB7IDg2NTcsICJ1QXJyIiB9LAorICAgIHsgODY1OCwgInJBcnIiIH0sCisgICAgeyA4NjU5LCAiZEFyciIgfSwKKyAgICB7IDg2NjAsICJoQXJyIiB9LAorICAgIHsgODcwNCwgImZvcmFsbCIgfSwKKyAgICB7IDg3MDYsICJwYXJ0IiB9LAorICAgIHsgODcwNywgImV4aXN0IiB9LAorICAgIHsgODcwOSwgImVtcHR5IiB9LAorICAgIHsgODcxMSwgIm5hYmxhIiB9LAorICAgIHsgODcxMiwgImlzaW4iIH0sCisgICAgeyA4NzEzLCAibm90aW4iIH0sCisgICAgeyA4NzE1LCAibmkiIH0sCisgICAgeyA4NzE5LCAicHJvZCIgfSwKKyAgICB7IDg3MjEsICJzdW0iIH0sCisgICAgeyA4NzIyLCAibWludXMiIH0sCisgICAgeyA4NzI3LCAibG93YXN0IiB9LAorICAgIHsgODczMCwgInJhZGljIiB9LAorICAgIHsgODczMywgInByb3AiIH0sCisgICAgeyA4NzM0LCAiaW5maW4iIH0sCisgICAgeyA4NzM2LCAiYW5nIiB9LAorICAgIHsgODc0MywgImFuZCIgfSwKKyAgICB7IDg3NDQsICJvciIgfSwKKyAgICB7IDg3NDUsICJjYXAiIH0sCisgICAgeyA4NzQ2LCAiY3VwIiB9LAorICAgIHsgODc0NywgImludCIgfSwKKyAgICB7IDg3NTYsICJ0aGVyZTQiIH0sCisgICAgeyA4NzY0LCAic2ltIiB9LAorICAgIHsgODc3MywgImNvbmciIH0sCisgICAgeyA4Nzc2LCAiYXN5bXAiIH0sCisgICAgeyA4ODAwLCAibmUiIH0sCisgICAgeyA4ODAxLCAiZXF1aXYiIH0sCisgICAgeyA4ODA0LCAibGUiIH0sCisgICAgeyA4ODA1LCAiZ2UiIH0sCisgICAgeyA4ODM0LCAic3ViIiB9LAorICAgIHsgODgzNSwgInN1cCIgfSwKKyAgICB7IDg4MzYsICJuc3ViIiB9LAorICAgIHsgODgzOCwgInN1YmUiIH0sCisgICAgeyA4ODM5LCAic3VwZSIgfSwKKyAgICB7IDg4NTMsICJvcGx1cyIgfSwKKyAgICB7IDg4NTUsICJvdGltZXMiIH0sCisgICAgeyA4ODY5LCAicGVycCIgfSwKKyAgICB7IDg5MDEsICJzZG90IiB9LAorICAgIHsgODk2OCwgImxjZWlsIiB9LAorICAgIHsgODk2OSwgInJjZWlsIiB9LAorICAgIHsgODk3MCwgImxmbG9vciIgfSwKKyAgICB7IDg5NzEsICJyZmxvb3IiIH0sCisgICAgeyA5MDAxLCAibGFuZyIgfSwKKyAgICB7IDkwMDIsICJyYW5nIiB9LAorICAgIHsgOTY3NCwgImxveiIgfSwKKyAgICB7IDk4MjQsICJzcGFkZXMiIH0sCisgICAgeyA5ODI3LCAiY2x1YnMiIH0sCisgICAgeyA5ODI5LCAiaGVhcnRzIiB9LAorICAgIHsgOTgzMCwgImRpYW1zIiB9LAorI2VuZGlmIC8qIEhUVFBfQUxMX0VOVElUSUVTICovCisgICAgeyAwLCAiIiB9Cit9OworCitzdHJ1Y3QgZW50aXR5X3N0YXRlIHsKKyAgICBjaGFyIGVudGl0eV9idWZbMTZdOworICAgIGNoYXIgKmVwOworfTsKKworc3RhdGljIGNoYXIgKmVtaXQoY2hhciAqcCwgaW50IGMsIHN0cnVjdCBlbnRpdHlfc3RhdGUgKnN0KQoreworICAgIGNvbnN0IHN0cnVjdCBodG1sX2VudGl0eSAqZW50OworICAgIHVuc2lnbmVkIGludCB1Y3M7CisKKyAgICBpZiAoIXN0LT5lcCkgeworCWlmIChjID09ICcmJykgeworCSAgICAvKiBFbnRpdHkgb3BlbiAqLworCSAgICBzdC0+ZXAgPSBzdC0+ZW50aXR5X2J1ZjsKKwl9IGVsc2UgeworCSAgICAqcCsrID0gYzsKKwl9CisgICAgfSBlbHNlIHsKKwlpZiAoYyA9PSAnOycpIHsKKwkgICAgc3QtPmVwID0gTlVMTDsKKwkgICAgKnAgPSAnXDAnOworCSAgICBpZiAoc3QtPmVudGl0eV9idWZbMF0gPT0gJyMnKSB7CisJCWlmICgoc3QtPmVudGl0eV9idWZbMV0gfCAweDIwKT09ICd4JykgeworCQkgICAgdWNzID0gc3RydG91bChzdC0+ZW50aXR5X2J1ZiArIDIsIE5VTEwsIDE2KTsKKwkJfSBlbHNlIHsKKwkJICAgIHVjcyA9IHN0cnRvdWwoc3QtPmVudGl0eV9idWYgKyAxLCBOVUxMLCAxMCk7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJZm9yIChlbnQgPSBlbnRpdGllczsgZW50LT51Y3M7IGVudCsrKSB7CisJCSAgICBpZiAoIXN0cmNtcChzdC0+ZW50aXR5X2J1ZiwgZW50LT5lbnRpdHkpKQorCQkJYnJlYWs7CisJCX0KKwkJdWNzID0gZW50LT51Y3M7CisJICAgIH0KKwkgICAgaWYgKHVjcyA8IDMyIHx8IHVjcyA+PSAweDEwZmZmZikKKwkJcmV0dXJuIHA7CS8qIEJvZ3VzICovCisJICAgIGlmICh1Y3MgPj0gMHgxMDAwMCkgeworCQkqcCsrID0gMHhmMCArICh1Y3MgPj4gMTgpOworCQkqcCsrID0gMHg4MCArICgodWNzID4+IDEyKSAmIDB4M2YpOworCQkqcCsrID0gMHg4MCArICgodWNzID4+IDYpICYgMHgzZik7CisJCSpwKysgPSAweDgwICsgKHVjcyAmIDB4M2YpOworCSAgICB9IGVsc2UgaWYgKHVjcyA+PSAweDgwMCkgeworCQkqcCsrID0gMHhlMCArICh1Y3MgPj4gMTIpOworCQkqcCsrID0gMHg4MCArICgodWNzID4+IDYpICYgMHgzZik7CisJCSpwKysgPSAweDgwICsgKHVjcyAmIDB4M2YpOworCSAgICB9IGVsc2UgaWYgKHVjcyA+PSAweDgwKSB7CisJCSpwKysgPSAweGMwICsgKHVjcyA+PiA2KTsKKwkJKnArKyA9IDB4ODAgKyAodWNzICYgMHgzZik7CisJICAgIH0gZWxzZSB7CisJCSpwKysgPSB1Y3M7CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0LT5lcCA8IHN0LT5lbnRpdHlfYnVmICsgc2l6ZW9mIHN0LT5lbnRpdHlfYnVmIC0gMSkgeworCSAgICAqc3QtPmVwKysgPSBjOworCX0KKyAgICB9CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpodHRwX2dldF9maWxlbmFtZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpidWYpCit7CisgICAgaW50IGMsIGxjOworICAgIGNoYXIgKnA7CisgICAgY29uc3Qgc3RydWN0IG1hY2hpbmUgKnNtOworICAgIHN0cnVjdCBlbnRpdHlfc3RhdGUgZXM7CisgICAgZW51bSBodHRwX3JlYWRkaXJfc3RhdGUgc3RhdGUgPSBzdF9zdGFydDsKKyAgICBlbnVtIGh0dHBfcmVhZGRpcl9zdGF0ZSBwc3RhdGUgPSBzdF9zdGFydDsKKworICAgIG1lbXNldCgmZXMsIDAsIHNpemVvZiBlcyk7CisKKyAgICBwID0gYnVmOworICAgIGZvciAoOzspIHsKKwljID0gcHhlX2dldGMoaW5vZGUpOworCWlmIChjID09IC0xKQorCSAgICByZXR1cm4gTlVMTDsKKworCWxjID0gdG9sb3dlcihjKTsKKworCXNtID0gJnN0YXRlbWFjaGluZVtzdGF0ZV07CisKKwlpZiAobGMgPT0gc20tPnhjaGFyKQorCSAgICBzdGF0ZSA9IHNtLT5zdF94Y2hhcjsKKwllbHNlIGlmIChjID09ICc8JykKKwkgICAgc3RhdGUgPSBzbS0+c3RfbGVmdDsKKwllbHNlIGlmIChjID09ICc+JykKKwkgICAgc3RhdGUgPSBzbS0+c3RfcmlnaHQ7CisJZWxzZSBpZiAoaXNzcGFjZShjKSkKKwkgICAgc3RhdGUgPSBzbS0+c3Rfc3BhY2U7CisJZWxzZQorCSAgICBzdGF0ZSA9IHNtLT5zdF9vdGhlcjsKKworCWlmIChzdGF0ZSA9PSBzdF9ocmVmZXEgfHwgc3RhdGUgPT0gc3RfaHJlZnF1KSB7CisJICAgIGlmIChzdGF0ZSAhPSBwc3RhdGUpCisJCXAgPSBidWY7CisJICAgIGVsc2UgaWYgKHAgPCBidWYgKyBGSUxFTkFNRV9NQVgpCisJCXAgPSBlbWl0KHAsIGMsICZlcyk7CisJICAgIHBzdGF0ZSA9IHN0YXRlOworCX0gZWxzZSB7CisJICAgIGlmIChwc3RhdGUgIT0gc3Rfc3RhcnQpCisJCXBzdGF0ZSA9IHN0X3N0YXJ0OworCSAgICBpZiAocCAhPSBidWYgJiYgc3RhdGUgPT0gc3Rfc3RhcnQpIHsKKwkJKnAgPSAnXDAnOworCQlyZXR1cm4gYnVmOworCSAgICB9CisJfQorICAgIH0KK30KKworaW50IGh0dHBfcmVhZGRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGlyZW50ICpkaXJlbnQpCit7CisgICAgY2hhciBidWZbRklMRU5BTUVfTUFYICsgNl07CisgICAgY29uc3QgY2hhciAqZm4sICpzcDsKKworICAgIGZvciAoOzspIHsKKwlmbiA9IGh0dHBfZ2V0X2ZpbGVuYW1lKGlub2RlLCBidWYpOworCisJaWYgKCFmbikKKwkgICAgcmV0dXJuIC0xOwkJLyogRW5kIG9mIGRpcmVjdG9yeSAqLworCisJLyogSWdub3JlIGVudHJpZXMgd2l0aCBodHRwIHNwZWNpYWwgY2hhcmFjdGVycyAqLworCWlmIChzdHJjaHIoZm4sICcjJykpCisJICAgIGNvbnRpbnVlOworCWlmIChzdHJjaHIoZm4sICc/JykpCisJICAgIGNvbnRpbnVlOworCisJLyogQSBzbGFzaCBpZiBwcmVzZW50IGhhcyB0byBiZSB0aGUgbGFzdCBjaGFyYWN0ZXIsIGFuZCBub3QgdGhlIGZpcnN0ICovCisJc3AgPSBzdHJjaHIoZm4sICcvJyk7CisJaWYgKHNwKSB7CisJICAgIGlmIChzcCA9PSBmbiB8fCBzcFsxXSkKKwkJY29udGludWU7CisJfSBlbHNlIHsKKwkgICAgc3AgPSBzdHJjaHIoZm4sICdcMCcpOworCX0KKworCWlmIChzcCA+IGZuICsgTkFNRV9NQVgpCisJICAgIGNvbnRpbnVlOworCisJZGlyZW50LT5kX2lubyA9IDA7CS8qIE5vdCBhcHBsaWNhYmxlICovCisJZGlyZW50LT5kX29mZiA9IDA7CS8qIE5vdCBhcHBsaWNhYmxlICovCisJZGlyZW50LT5kX3JlY2xlbiA9IG9mZnNldG9mKHN0cnVjdCBkaXJlbnQsIGRfbmFtZSkgKyAoc3AtZm4pICsgMTsKKwlkaXJlbnQtPmRfdHlwZSA9ICpzcCA9PSAnLycgPyBEVF9ESVIgOiBEVF9SRUc7CisJbWVtY3B5KGRpcmVudC0+ZF9uYW1lLCBmbiwgc3AtZm4pOworCWRpcmVudC0+ZF9uYW1lW3NwLWZuXSA9ICdcMCc7CisJcmV0dXJuIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9mcy9weGUvaWRsZS5jIGIvY29yZS9mcy9weGUvaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMWJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3B4ZS9pZGxlLmMKQEAgLTAsMCArMSwyOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogICAKKyAqICAgQ29weXJpZ2h0IDIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPHN5cy9jcHUuaD4KKyNpbmNsdWRlICJweGUuaCIKKwordm9pZCBweGVfaWRsZV9pbml0KHZvaWQpCit7Cit9CisKK3ZvaWQgcHhlX2lkbGVfY2xlYW51cCh2b2lkKQoreworICAgIGlkbGVfaG9va19mdW5jID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMvcHhlL2lzci5jIGIvY29yZS9mcy9weGUvaXNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMGNjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvcHhlL2lzci5jCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogY29yZS9mcy9weGUvaXNyLmMKKyAqCisgKiBTdHViIGludm9rZWQgb24gcmV0dXJuIGZyb20gcmVhbCBtb2RlIGluY2x1ZGluZyBmcm9tIGFuIGludGVycnVwdC4KKyAqIEludGVycnVwdHMgYXJlIGxvY2tlZCBvdXQgb24gZW50cnkuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJweGUuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisjaW5jbHVkZSA8c3lzL2lvLmg+CisKK2V4dGVybiB1aW50OF90IHB4ZV9pcnFfcGVuZGluZzsKK2V4dGVybiB2b2xhdGlsZSB1aW50OF90IHB4ZV9uZWVkX3BvbGw7CitzdGF0aWMgREVDTEFSRV9JTklUX1NFTUFQSE9SRShweGVfcmVjZWl2ZV90aHJlYWRfc2VtLCAwKTsKK3N0YXRpYyBERUNMQVJFX0lOSVRfU0VNQVBIT1JFKHB4ZV9wb2xsX3RocmVhZF9zZW0sIDApOworc3RhdGljIHN0cnVjdCB0aHJlYWQgKnB4ZV90aHJlYWQsICpwb2xsX3RocmVhZDsKKworI2lmbmRlZiBQWEVfUE9MTF9GT1JDRQorIyAgZGVmaW5lIFBYRV9QT0xMX0ZPUkNFIDAKKyNlbmRpZgorCisjaWZuZGVmIFBYRV9QT0xMX0JZX01PREVMCisjICBkZWZpbmUgUFhFX1BPTExfQllfTU9ERUwgMQorI2VuZGlmCisKKy8qCisgKiBOb3RlOiB0aGlzICptdXN0KiBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBib29sIGluc3RhbGxfaXJxX3ZlY3Rvcih1aW50OF90IGlycSwgdm9pZCAoKmlzcikodm9pZCksIGZhcl9wdHJfdCAqb2xkKQoreworICAgIGZhcl9wdHJfdCAqZW50cnk7CisgICAgdW5zaWduZWQgaW50IHZlYzsKKyAgICB1aW50OF90IG1hc2ssIG15bWFzazsKKyAgICB1aW50MzJfdCBub3c7CisgICAgYm9vbCBvazsKKworICAgIGlmIChpcnEgPCA4KQorCXZlYyA9IGlycSArIDB4MDg7CisgICAgZWxzZSBpZiAoaXJxIDwgMTYpCisJdmVjID0gKGlycSAtIDgpICsgMHg3MDsKKyAgICBlbHNlCisJcmV0dXJuIGZhbHNlOworCisgICAgY2xpKCk7CisKKyAgICBpZiAocHhlX25lZWRfcG9sbCkgeworCXN0aSgpOworCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBlbnRyeSA9IChmYXJfcHRyX3QgKikodmVjIDw8IDIpOworICAgICpvbGQgPSAqZW50cnk7CisgICAgZW50cnktPnB0ciA9ICh1aW50MzJfdClpc3I7CisKKyAgICAvKiBFbmFibGUgdGhpcyBpbnRlcnJ1cHQgYXQgdGhlIFBJQyBsZXZlbCwganVzdCBpbiBjYXNlLi4uICovCisgICAgbXltYXNrID0gfigxIDw8IChpcnEgJiA3KSk7CisgICAgaWYgKGlycSA+PSA4KSB7CisJbWFzayA9IGluYigweDIxKTsKKwltYXNrICY9IH4oMSA8PCAyKTsJLyogRW5hYmxlIGNhc2NhZGUgKi8KKwlvdXRiKG1hc2ssIDB4MjEpOworIAltYXNrID0gaW5iKDB4YTEpOworCW1hc2sgJj0gbXltYXNrOworCW91dGIobWFzaywgMHhhMSk7CisgICAgfSBlbHNlIHsKKyAJbWFzayA9IGluYigweDIxKTsKKwltYXNrICY9IG15bWFzazsKKwlvdXRiKG1hc2ssIDB4MjEpOworICAgIH0KKworICAgIHN0aSgpOworCisgICAgbm93ID0gamlmZmllcygpOworCisgICAgLyogU29tZSB0aW1lIHRvIHdhdGNoIGZvciBzdHVjayBpbnRlcnJ1cHRzICovCisgICAgd2hpbGUgKGppZmZpZXMoKSAtIG5vdyA8IDQgJiYgKG9rID0gIXB4ZV9uZWVkX3BvbGwpKQorCWhsdCgpOworCisgICAgaWYgKCFvaykKKwkqZW50cnkgPSAqb2xkOwkJLyogUmVzdG9yZSB0aGUgb2xkIHZlY3RvciAqLworCisgICAgZGRwcmludGYoIlVOREk6IElSUSAlZCgweCUwMngpOiAlMDR4OiUwNHggLT4gJTA0eDolMDR4XG4iLCBpcnEsIHZlYywKKwkgICBvbGQtPnNlZywgb2xkLT5vZmZzLCBlbnRyeS0+c2VnLCBlbnRyeS0+b2Zmcyk7CisKKyAgICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBib29sIHVuaW5zdGFsbF9pcnFfdmVjdG9yKHVpbnQ4X3QgaXJxLCB2b2lkICgqaXNyKSwgZmFyX3B0cl90ICpvbGQpCit7CisgICAgZmFyX3B0cl90ICplbnRyeTsKKyAgICB1bnNpZ25lZCBpbnQgdmVjOworICAgIGJvb2wgcnY7CisKKyAgICBpZiAoIWlycSkKKwlyZXR1cm4gdHJ1ZTsJCS8qIE5vdGhpbmcgdG8gdW5pbnN0YWxsICovCisKKyAgICBpZiAoaXJxIDwgOCkKKwl2ZWMgPSBpcnEgKyAweDA4OworICAgIGVsc2UgaWYgKGlycSA8IDE2KQorCXZlYyA9IChpcnEgLSA4KSArIDB4NzA7CisgICAgZWxzZQorCXJldHVybiBmYWxzZTsKKworICAgIGNsaSgpOworCisgICAgZW50cnkgPSAoZmFyX3B0cl90ICopKHZlYyA8PCAyKTsKKworICAgIGlmIChlbnRyeS0+cHRyICE9ICh1aW50MzJfdClpc3IpIHsKKwlydiA9IGZhbHNlOworICAgIH0gZWxzZSB7CisJKmVudHJ5ID0gKm9sZDsKKwlydiA9IHRydWU7CisgICAgfQorCisgICAgc3RpKCk7CisgICAgcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBweGVfcG9sbF93YWtldXBzKHZvaWQpCit7CisgICAgc3RhdGljIGppZmZpZXNfdCBsYXN0X2ppZmZpZXMgPSAwOworICAgIGppZmZpZXNfdCBub3cgPSBqaWZmaWVzKCk7CisKKyAgICBpZiAocHhlX25lZWRfcG9sbCA9PSAxKSB7CisJLyogSWYgd2UgbmVlZCBwb2xsaW5nIG5vdywgYWN0aXZhdGUgcG9sbGluZyAqLworCXB4ZV9uZWVkX3BvbGwgPSAzOworCXNlbV91cCgmcHhlX3BvbGxfdGhyZWFkX3NlbSk7CisgICAgfQorCisgICAgaWYgKG5vdyAhPSBsYXN0X2ppZmZpZXMpIHsKKwlsYXN0X2ppZmZpZXMgPSBub3c7CisJX190aHJlYWRfcHJvY2Vzc190aW1lb3V0cygpOworICAgIH0KKworICAgIGlmIChweGVfaXJxX3BlbmRpbmcpIHsKKwlweGVfaXJxX3BlbmRpbmcgPSAwOworCXNlbV91cCgmcHhlX3JlY2VpdmVfdGhyZWFkX3NlbSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBweGVfcHJvY2Vzc19pcnEodm9pZCkKK3sKKyAgICBzdGF0aWMgX19sb3dtZW0gdF9QWEVOVl9VTkRJX0lTUiBpc3I7CisKKyAgICB1aW50MTZfdCBmdW5jID0gUFhFTlZfVU5ESV9JU1JfSU5fUFJPQ0VTUzsgLyogRmlyc3QgdGltZSAqLworICAgIGJvb2wgZG9uZSA9IGZhbHNlOworCisgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgIG1lbXNldCgmaXNyLCAwLCBzaXplb2YgaXNyKTsKKyAgICAgICAgaXNyLkZ1bmNGbGFnID0gZnVuYzsKKyAgICAgICAgZnVuYyA9IFBYRU5WX1VORElfSVNSX0lOX0dFVF9ORVhUOyAvKiBOZXh0IHRpbWUgKi8KKworICAgICAgICBweGVfY2FsbChQWEVOVl9VTkRJX0lTUiwgJmlzcik7CisKKyAgICAgICAgc3dpdGNoIChpc3IuRnVuY0ZsYWcpIHsKKyAgICAgICAgY2FzZSBQWEVOVl9VTkRJX0lTUl9PVVRfRE9ORToKKwkgICAgZG9uZSA9IHRydWU7CisJICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUFhFTlZfVU5ESV9JU1JfT1VUX1RSQU5TTUlUOgorCSAgICAvKiBUcmFuc21pdCBjb21wbGV0ZSAtIG5vdGhpbmcgZm9yIHVzIHRvIGRvICovCisJICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUFhFTlZfVU5ESV9JU1JfT1VUX1JFQ0VJVkU6CisJICAgIHVuZGlpZl9pbnB1dCgmaXNyKTsKKwkgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQWEVOVl9VTkRJX0lTUl9PVVRfQlVTWToKKwkvKiBJU1IgYnVzeSwgdGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCSAgICBkb25lID0gdHJ1ZTsKKwkgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKwkvKiBJbnZhbGlkIHJldHVybiBjb2RlLCB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCisJICAgIGRvbmUgPSB0cnVlOworCSAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHhlX3JlY2VpdmVfdGhyZWFkKHZvaWQgKmR1bW15KQoreworICAgICh2b2lkKWR1bW15OworCisgICAgZm9yICg7OykgeworCXNlbV9kb3duKCZweGVfcmVjZWl2ZV90aHJlYWRfc2VtLCAwKTsKKwlweGVfcHJvY2Vzc19pcnEoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBib29sIHB4ZV9pc3JfcG9sbCh2b2lkKQoreworICAgIHN0YXRpYyBfX2xvd21lbSB0X1BYRU5WX1VORElfSVNSIGlzcjsKKworICAgIGlzci5GdW5jRmxhZyA9IFBYRU5WX1VORElfSVNSX0lOX1NUQVJUOworICAgIHB4ZV9jYWxsKFBYRU5WX1VORElfSVNSLCAmaXNyKTsKKworICAgIHJldHVybiBpc3IuRnVuY0ZsYWcgPT0gUFhFTlZfVU5ESV9JU1JfT1VUX09VUlM7Cit9CisKK3N0YXRpYyB2b2lkIHB4ZV9wb2xsX3RocmVhZCh2b2lkICpkdW1teSkKK3sKKyAgICAodm9pZClkdW1teTsKKworICAgIC8qIEJsb2NrIGluZGVmaW5pdGVseSB1bmxlc3MgYWN0aXZhdGVkICovCisgICAgc2VtX2Rvd24oJnB4ZV9wb2xsX3RocmVhZF9zZW0sIDApOworCisgICAgZm9yICg7OykgeworCWNsaSgpOworCWlmIChweGVfcmVjZWl2ZV90aHJlYWRfc2VtLmNvdW50IDwgMCAmJiBweGVfaXNyX3BvbGwoKSkKKwkgICAgc2VtX3VwKCZweGVfcmVjZWl2ZV90aHJlYWRfc2VtKTsKKwllbHNlCisJICAgIF9fc2NoZWR1bGUoKTsKKwlzdGkoKTsKKwljcHVfcmVsYXgoKTsKKyAgICB9Cit9CisKKy8qCisgKiBUaGlzIGRvZXMgcHJlcGFyYXRpb25zIGFuZCBlbmFibGVzIHRoZSBQWEUgdGhyZWFkCisgKi8KK3ZvaWQgcHhlX2luaXRfaXNyKHZvaWQpCit7CisgICAgc3RhcnRfaWRsZV90aHJlYWQoKTsKKyAgICBzY2hlZF9ob29rX2Z1bmMgPSBweGVfcG9sbF93YWtldXBzOworICAgIC8qCisgICAgICogUnVuIHRoZSBweGUgcmVjZWl2ZSB0aHJlYWQgYXQgZWxldmF0ZWQgcHJpb3JpdHksIHNpbmNlIHRoZSBVTkRJCisgICAgICogc3RhY2sgaXMgbGlrZWx5IHRvIGhhdmUgdmVyeSBsaW1pdGVkIG1lbW9yeSBhdmFpbGFibGU7IHRoZXJlZm9yZSB0bworICAgICAqIGF2b2lkIHBhY2tldCBsb3NzIHdlIG5lZWQgdG8gbW92ZSBpdCBpbnRvIG1lbW9yeSB0aGF0IHdlIG91cnNlbHZlcworICAgICAqIG1hbmFnZSwgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAgICAgKi8KKyAgICBjb3JlX3BtX2hvb2sgPSBfX3NjaGVkdWxlOworCisgICAgcHhlX3RocmVhZCA9IHN0YXJ0X3RocmVhZCgicHhlIHJlY2VpdmUiLCAxNjM4NCwgLTIwLAorCQkJICAgICAgcHhlX3JlY2VpdmVfdGhyZWFkLCBOVUxMKTsKK30KKworLyoKKyAqIEFjdHVhbGx5IHN0YXJ0IHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpbnNpZGUgdGhlIFVOREkgc3RhY2sKKyAqLwordm9pZCBweGVfc3RhcnRfaXNyKHZvaWQpCit7CisgICAgaW50IGlycSA9IHB4ZV91bmRpX2luZm8uSW50TnVtYmVyOworCisgICAgaWYgKGlycSA9PSAyKQorCWlycSA9IDk7CQkvKiBJUlEgMiBpcyByZWFsbHkgSVJRIDkgKi8KKyAgICBlbHNlIGlmIChpcnEgPiAxNSkKKwlpcnEgPSAwOwkJLyogSW52YWxpZCBJUlEgKi8KKworICAgIHB4ZV9pcnFfdmVjdG9yID0gaXJxOworCisgICAgaWYgKGlycSkgeworCWlmICghaW5zdGFsbF9pcnFfdmVjdG9yKGlycSwgcHhlX2lzciwgJnB4ZV9pcnFfY2hhaW4pKQorCSAgICBpcnEgPSAwOwkJLyogSW5zdGFsbCBmYWlsZWQgb3Igc3R1Y2sgaW50ZXJydXB0ICovCisgICAgfQorICAgIAorICAgIHBvbGxfdGhyZWFkID0gc3RhcnRfdGhyZWFkKCJweGUgcG9sbCIsIDQwOTYsIFBPTExfVEhSRUFEX1BSSU9SSVRZLAorCQkJICAgICAgIHB4ZV9wb2xsX3RocmVhZCwgTlVMTCk7CisKKyAgICBpZiAoIWlycSB8fAkhKHB4ZV91bmRpX2lmYWNlLlNlcnZpY2VGbGFncyAmIFBYRV9VTkRJX0lGQUNFX0ZMQUdfSVJRKSkgeworCWFzbSB2b2xhdGlsZSgib3JiICQxLCUwIiA6ICIrbSIgKHB4ZV9uZWVkX3BvbGwpKTsKKwlkcHJpbnRmKCJweGVfc3RhcnRfaXNyOiBmb3JjaW5nIHB4ZV9uZWVkX3BvbGxcbiIpOworICAgIH0gZWxzZSBpZiAoUFhFX1BPTExfQllfTU9ERUwpIHsKKwlkcHJpbnRmKCJweGVfc3RhcnRfaXNyOiB0cnlpbmcgcG9sbCBieSBtb2RlbFxuIik7CisJaW50IGh3YWQgPSAoKGludClNQUNbMF0gPDwgMTYpICsgKChpbnQpTUFDWzFdIDw8IDgpICsgTUFDWzJdOworCWRwcmludGYoInB4ZV9zdGFydF9pc3I6IGdvdCAlMDZ4ICUwNHhcbiIsIGh3YWQsIHB4ZV91bmRpX2lmYWNlLlNlcnZpY2VGbGFncyk7CisJaWYgKChod2FkID09IDB4MDAwMDIzYWUpICYmIChweGVfdW5kaV9pZmFjZS5TZXJ2aWNlRmxhZ3MgPT0gMHhkYzFiKSB8fAorCSAgICAoaHdhZCA9PSAweDAwNWMyNjBhKSAmJiAocHhlX3VuZGlfaWZhY2UuU2VydmljZUZsYWdzID09IDB4ZGMxYikgfHwKKwkgICAgKGh3YWQgPT0gMHgwMDE4MDM3MykgJiYgKHB4ZV91bmRpX2lmYWNlLlNlcnZpY2VGbGFncyA9PSAweGRjMWIpKSB7CisJCWFzbSB2b2xhdGlsZSgib3JiICQxLCUwIiA6ICIrbSIgKHB4ZV9uZWVkX3BvbGwpKTsKKwkJZHByaW50ZigicHhlX3N0YXJ0X2lzcjogZm9yY2luZyBweGVfbmVlZF9wb2xsIGJ5IG1vZGVsXG4iKTsKKwl9CisgICAgfQorfQorCitpbnQgcmVzZXRfcHhlKHZvaWQpCit7CisgICAgc3RhdGljIF9fbG93bWVtIHN0cnVjdCBzX1BYRU5WX1VORElfQ0xPU0UgdW5kaV9jbG9zZTsKKworICAgIHNjaGVkX2hvb2tfZnVuYyA9IE5VTEw7CisgICAgY29yZV9wbV9ob29rID0gY29yZV9wbV9udWxsX2hvb2s7CisgICAga2lsbF90aHJlYWQocHhlX3RocmVhZCk7CisKKyAgICBtZW1zZXQoJnVuZGlfY2xvc2UsIDAsIHNpemVvZih1bmRpX2Nsb3NlKSk7CisgICAgcHhlX2NhbGwoUFhFTlZfVU5ESV9DTE9TRSwgJnVuZGlfY2xvc2UpOworCisgICAgaWYgKHVuZGlfY2xvc2UuU3RhdHVzKQorCXByaW50ZigiUFhFTlZfVU5ESV9DTE9TRSBmYWlsZWQ6IDB4JXhcbiIsIHVuZGlfY2xvc2UuU3RhdHVzKTsKKworICAgIGlmIChweGVfaXJxX3ZlY3RvcikKKwl1bmluc3RhbGxfaXJxX3ZlY3RvcihweGVfaXJxX3ZlY3RvciwgcHhlX2lzciwgJnB4ZV9pcnFfY2hhaW4pOworICAgIGlmIChwb2xsX3RocmVhZCkKKwlraWxsX3RocmVhZChwb2xsX3RocmVhZCk7CisKKyAgICByZXR1cm4gdW5kaV9jbG9zZS5TdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL3B4ZS9weGUuYyBiL2NvcmUvZnMvcHhlL3B4ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmNkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3B4ZS9weGUuYwpAQCAtMCwwICsxLDY5OSBAQAorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2NwdS5oPgorI2luY2x1ZGUgInB4ZS5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInVybC5oIgorI2luY2x1ZGUgInRmdHAuaCIKKyNpbmNsdWRlIDxuZXQuaD4KKworX19sb3dtZW0gdF9QWEVOVl9VTkRJX0dFVF9JTkZPUk1BVElPTiBweGVfdW5kaV9pbmZvOworX19sb3dtZW0gdF9QWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPICBweGVfdW5kaV9pZmFjZTsKKwordWludDhfdCBNQUNbTUFDX01BWF07CQkgICAvKiBBY3R1YWwgTUFDIGFkZHJlc3MgKi8KK3VpbnQ4X3QgTUFDX2xlbjsgICAgICAgICAgICAgICAgICAgLyogTUFDIGFkZHJlc3MgbGVuICovCit1aW50OF90IE1BQ190eXBlOyAgICAgICAgICAgICAgICAgIC8qIE1BQyBhZGRyZXNzIHR5cGUgKi8KKworY2hhciBib290X2ZpbGVbMjU2XTsJCSAgIC8qIEZyb20gREhDUCAqLworY2hhciBwYXRoX3ByZWZpeFsyNTZdOwkJICAgLyogRnJvbSBESENQICovCisKK2Jvb2wgaGF2ZV91dWlkID0gZmFsc2U7CisKKy8qCisgKiBBbGxvY2F0ZSBhIGxvY2FsIFVEUCBwb3J0IHN0cnVjdHVyZSBhbmQgYXNzaWduIGl0IGEgbG9jYWwgcG9ydCBudW1iZXIuCisgKiBSZXR1cm4gdGhlIGlub2RlIHBvaW50ZXIgaWYgc3VjY2Vzcywgb3IgbnVsbCBpZiBmYWlsdXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFsbG9jYXRlX3NvY2tldChzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGFsbG9jX2lub2RlKGZzLCAwLCBzaXplb2Yoc3RydWN0IHB4ZV9wdnRfaW5vZGUpKTsKKworICAgIGlmICghaW5vZGUpIHsKKwltYWxsb2NfZXJyb3IoInNvY2tldCBzdHJ1Y3R1cmUiKTsKKyAgICB9IGVsc2UgeworCWlub2RlLT5tb2RlID0gRFRfUkVHOwkvKiBObyBvdGhlciB0eXBlcyByZWxldmFudCBmb3IgUFhFICovCisgICAgfQorCisgICAgcmV0dXJuIGlub2RlOworfQorCit2b2lkIGZyZWVfc29ja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCA9IFBWVChpbm9kZSk7CisKKyAgICBmcmVlKHNvY2tldC0+dGZ0cF9wa3RidWYpOwkvKiBJZiB3ZSBhbGxvY2F0ZWQgYSBidWZmZXIsIGZyZWUgaXQgbm93ICovCisgICAgZnJlZV9pbm9kZShpbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHB4ZV9jbG9zZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5pbm9kZTsKKyAgICBzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0ID0gUFZUKGlub2RlKTsKKworICAgIGlmICghaW5vZGUpCisJcmV0dXJuOworCisgICAgaWYgKCFzb2NrZXQtPnRmdHBfZ290ZW9mKSB7CisJc29ja2V0LT5vcHMtPmNsb3NlKGlub2RlKTsKKyAgICB9CisKKyAgICBmcmVlX3NvY2tldChpbm9kZSk7Cit9CisKKy8qCisgKiBUZXN0cyBhbiBJUCBhZGRyZXNzIGluIF9pcF8gZm9yIHZhbGlkaXR5OyByZXR1cm4gd2l0aCAwIGZvciBiYWQsIDEgZm9yIGdvb2QuCisgKiBXZSB1c2VkIHRvIHJlZnVzZSBjbGFzcyBFLCBidXQgY2xhc3MgRSBhZGRyZXNzZXMgYXJlIGxpa2VseSB0byBiZWNvbWUKKyAqIGFzc2lnbmFibGUgdW5pY2FzdCBhZGRyZXNzZXMgaW4gdGhlIG5lYXIgZnV0dXJlLgorICoKKyAqLworYm9vbCBpcF9vayh1aW50MzJfdCBpcCkKK3sKKyAgICB1aW50OF90IGlwX2hpID0gKHVpbnQ4X3QpaXA7IC8qIEZpcnN0IG9jdGV0IG9mIHRoZSBpcCBhZGRyZXNzICovCisKKyAgICBpZiAoaXAgPT0gMHhmZmZmZmZmZiB8fAkvKiBSZWZ1c2UgdGhlIGFsbC1vbmVzIGFkZHJlc3MgKi8KKwlpcF9oaSA9PSAwIHx8CQkvKiBSZWZ1c2UgbmV0d29yayB6ZXJvICovCisJaXBfaGkgPT0gMTI3IHx8CQkvKiBSZWZ1c2UgdGhlIGxvb3BiYWNrIG5ldHdvcmsgKi8KKwkoaXBfaGkgJiAyNDApID09IDIyNCkJLyogUmVmdXNlIGNsYXNzIEQgKi8KKwlyZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKgorICogVGFrZSBhbiBJUCBhZGRyZXNzIChpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpIGluIF9pcF8gYW5kCisgKiBvdXRwdXQgYSBkb3R0ZWQgcXVhZCBzdHJpbmcgdG8gX2RzdF8sIHJldHVybnMgdGhlIGxlbmd0aAorICogb2YgdGhlIGRvdHRlZCBxdWFkIGlwIHN0cmluZy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgZ2VuZG90cXVhZChjaGFyICpkc3QsIHVpbnQzMl90IGlwKQoreworICAgIHJldHVybiBzcHJpbnRmKGRzdCwgIiV1LiV1LiV1LiV1IiwKKwkJICAgKChjb25zdCB1aW50OF90ICopJmlwKVswXSwKKwkJICAgKChjb25zdCB1aW50OF90ICopJmlwKVsxXSwKKwkJICAgKChjb25zdCB1aW50OF90ICopJmlwKVsyXSwKKwkJICAgKChjb25zdCB1aW50OF90ICopJmlwKVszXSk7Cit9CisKKy8qCisgKiB0aGUgQVNNIHB4ZW52IGZ1bmN0aW9uIHdyYXBwZXIsIHJldHVybiAxIGlmIGVycm9yLCBvciAwCisgKgorICovCitfX2V4cG9ydCBpbnQgcHhlX2NhbGwoaW50IG9wY29kZSwgdm9pZCAqZGF0YSkKK3sKKyAgICBzdGF0aWMgREVDTEFSRV9JTklUX1NFTUFQSE9SRShweGVfc2VtLCAxKTsKKyAgICBleHRlcm4gdm9pZCBweGVudih2b2lkKTsKKyAgICBjb20zMnN5c190IHJlZ3M7CisKKyAgICBzZW1fZG93bigmcHhlX3NlbSwgMCk7CisKKyNpZiAwCisgICAgZHByaW50ZigicHhlX2NhbGwgb3AgJTA0eCBkYXRhICVwXG4iLCBvcGNvZGUsIGRhdGEpOworI2VuZGlmCisKKyAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZiByZWdzKTsKKyAgICByZWdzLmVieC53WzBdID0gb3Bjb2RlOworICAgIHJlZ3MuZXMgICAgICAgPSBTRUcoZGF0YSk7CisgICAgcmVncy5lZGkud1swXSA9IE9GRlMoZGF0YSk7CisgICAgY2FsbDE2KHB4ZW52LCAmcmVncywgJnJlZ3MpOworCisgICAgc2VtX3VwKCZweGVfc2VtKTsKKworICAgIHJldHVybiByZWdzLmVmbGFncy5sICYgRUZMQUdTX0NGOyAgLyogQ0YgU0VUIGlmIGZhaWwgKi8KK30KKworLyoKKyAqIG1hbmdsZSBhIGZpbGVuYW1lIHBvaW50ZWQgdG8gYnkgX3NyY18gaW50byBhIGJ1ZmZlciBwb2ludGVkCisgKiB0byBieSBfZHN0XzsgZW5kcyBvbiBlbmNvdW50ZXJpbmcgYW55IHdoaXRlc3BhY2UuCisgKgorICogVGhpcyBkZWxpYmVyYXRlbHkgZG9lcyBub3QgYXR0ZW1wdCB0byBkbyBhbnkgY29udmVyc2lvbiBvZgorICogcGF0aG5hbWUgc2VwYXJhdG9ycy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHB4ZV9tYW5nbGVfbmFtZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICBzaXplX3QgbGVuID0gRklMRU5BTUVfTUFYLTE7CisKKyAgICB3aGlsZSAobGVuLS0gJiYgbm90X3doaXRlc3BhY2UoKnNyYykpCisJKmRzdCsrID0gKnNyYysrOworCisgICAgKmRzdCA9ICdcMCc7Cit9CisKKy8qCisgKiBSZWFkIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgcHhlIGlub2RlLgorICogVmVyeSB1c2VmdWwgZm9yIHN0ZXBwaW5nIHRocm91Z2ggaHR0cCBzdHJlYW1zIGFuZAorICogcGFyc2luZyB0aGVpciBoZWFkZXJzLgorICovCitpbnQgcHhlX2dldGMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0ID0gUFZUKGlub2RlKTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5dGU7CisKKyAgICB3aGlsZSAoIXNvY2tldC0+dGZ0cF9ieXRlc2xlZnQpIHsKKwlpZiAoc29ja2V0LT50ZnRwX2dvdGVvZikKKwkgICAgcmV0dXJuIC0xOworCisJc29ja2V0LT5vcHMtPmZpbGxfYnVmZmVyKGlub2RlKTsKKyAgICB9CisKKyAgICBieXRlID0gKnNvY2tldC0+dGZ0cF9kYXRhcHRyOworICAgIHNvY2tldC0+dGZ0cF9ieXRlc2xlZnQgLT0gMTsKKyAgICBzb2NrZXQtPnRmdHBfZGF0YXB0ciArPSAxOworCisgICAgcmV0dXJuIGJ5dGU7Cit9CisKKy8qCisgKiBHZXQgYSBmcmVzaCBwYWNrZXQgaWYgdGhlIGJ1ZmZlciBpcyBkcmFpbmVkLCBhbmQgd2UgaGF2ZW4ndCBoaXQKKyAqIEVPRiB5ZXQuICBUaGUgYnVmZmVyIHNob3VsZCBiZSBmaWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZHJhaW5pbmchCisgKi8KK3N0YXRpYyB2b2lkIGZpbGxfYnVmZmVyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCA9IFBWVChpbm9kZSk7CisgICAgaWYgKHNvY2tldC0+dGZ0cF9ieXRlc2xlZnQgfHwgc29ja2V0LT50ZnRwX2dvdGVvZikKKyAgICAgICAgcmV0dXJuOworCisgICAgcmV0dXJuIHNvY2tldC0+b3BzLT5maWxsX2J1ZmZlcihpbm9kZSk7Cit9CisKKworLyoqCisgKiBnZXRmc3NlYzogR2V0IG11bHRpcGxlIGNsdXN0ZXJzIGZyb20gYSBmaWxlLCBnaXZlbiB0aGUgc3RhcnRpbmcgY2x1c3Rlci4KKyAqIEluIHRoaXMgY2FzZSwgZ2V0IG11bHRpcGxlIGJsb2NrcyBmcm9tIGEgc3BlY2lmaWMgVENQIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtOiBmcywgdGhlIGZzX2luZm8gc3RydWN0dXJlIGFkZHJlc3MsIGluIHB4ZSwgd2UgZG9uJ3QgdXNlIHRoaXMuCisgKiBAcGFyYW06IGJ1ZiwgYnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEKKyAqIEBwYXJhbTogb3BlbmZpbGUsIFRGVFAgc29ja2V0IHBvaW50ZXIKKyAqIEBwYXJhbTogYmxvY2tzLCA1MTItYnl0ZSBibG9jayBjb3VudDsgMEZGRkZoID0gdW50aWwgZW5kIG9mIGZpbGUKKyAqCisgKiBAcmV0dXJuOiB0aGUgYnl0ZXMgcmVhZAorICoKKyAqLworc3RhdGljIHVpbnQzMl90IHB4ZV9nZXRmc3NlYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorCQkJICAgICBpbnQgYmxvY2tzLCBib29sICpoYXZlX21vcmUpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmlub2RlOworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQgPSBQVlQoaW5vZGUpOworICAgIGludCBjb3VudCA9IGJsb2NrczsKKyAgICBpbnQgY2h1bms7CisgICAgaW50IGJ5dGVzX3JlYWQgPSAwOworCisgICAgY291bnQgPDw9IFRGVFBfQkxPQ0tTSVpFX0xHMjsKKyAgICB3aGlsZSAoY291bnQpIHsKKyAgICAgICAgZmlsbF9idWZmZXIoaW5vZGUpOyAvKiBJZiB3ZSBoYXZlIG5vICdmcmVzaCcgYnVmZmVyLCBnZXQgaXQgKi8KKyAgICAgICAgaWYgKCFzb2NrZXQtPnRmdHBfYnl0ZXNsZWZ0KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2h1bmsgPSBjb3VudDsKKyAgICAgICAgaWYgKGNodW5rID4gc29ja2V0LT50ZnRwX2J5dGVzbGVmdCkKKyAgICAgICAgICAgIGNodW5rID0gc29ja2V0LT50ZnRwX2J5dGVzbGVmdDsKKyAgICAgICAgc29ja2V0LT50ZnRwX2J5dGVzbGVmdCAtPSBjaHVuazsKKyAgICAgICAgbWVtY3B5KGJ1Ziwgc29ja2V0LT50ZnRwX2RhdGFwdHIsIGNodW5rKTsKKwlzb2NrZXQtPnRmdHBfZGF0YXB0ciArPSBjaHVuazsKKyAgICAgICAgYnVmICs9IGNodW5rOworICAgICAgICBieXRlc19yZWFkICs9IGNodW5rOworICAgICAgICBjb3VudCAtPSBjaHVuazsKKyAgICB9CisKKworICAgIGlmIChzb2NrZXQtPnRmdHBfYnl0ZXNsZWZ0IHx8IChzb2NrZXQtPnRmdHBfZmlsZXBvcyA8IGlub2RlLT5zaXplKSkgeworCWZpbGxfYnVmZmVyKGlub2RlKTsKKyAgICAgICAgKmhhdmVfbW9yZSA9IDE7CisgICAgfSBlbHNlIGlmIChzb2NrZXQtPnRmdHBfZ290ZW9mKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBzb2NrZXQgaXMgY2xvc2VkIGFuZCB0aGUgYnVmZmVyIGRyYWluZWQ7IHRoZSBjYWxsZXIgd2lsbAorCSAqIGNhbGwgY2xvc2VfZmlsZSBhbmQgdGhlcmVmb3JlIGZyZWUgdGhlIHNvY2tldC4KKyAgICAgICAgICovCisgICAgICAgICpoYXZlX21vcmUgPSAwOworICAgIH0KKworICAgIHJldHVybiBieXRlc19yZWFkOworfQorCisvKgorICogQXNzaWduIGFuIElQIGFkZHJlc3MgdG8gYSBVUkwKKyAqLworc3RhdGljIHZvaWQgdXJsX3NldF9pcChzdHJ1Y3QgdXJsX2luZm8gKnVybCkKK3sKKyAgICB1cmwtPmlwID0gMDsKKyAgICBpZiAodXJsLT5ob3N0KQorCXVybC0+aXAgPSBkbnNfcmVzb2x2KHVybC0+aG9zdCk7CisgICAgaWYgKCF1cmwtPmlwKQorCXVybC0+aXAgPSBJUEluZm8uc2VydmVyaXA7Cit9CisKKy8qKgorICogT3BlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24KKyAqCisgKiBAcGFyYW06ZmlsZW5hbWUsIHRoZSBmaWxlIHdlIHdhbm5hIG9wZW4KKyAqCisgKiBAb3V0OiBvcGVuX2ZpbGVfdCBzdHJ1Y3R1cmUsIHN0b3JlcyBpbiBmaWxlLT5vcGVuX2ZpbGUKKyAqIEBvdXQ6IHRoZSBsZW5naHQgb2YgdGhpcyBmaWxlLCBzdG9yZXMgaW4gZmlsZS0+ZmlsZV9sZW4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fcHhlX3NlYXJjaGRpcihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitleHRlcm4gdWludDE2X3QgUFhFUmV0cnk7CisKK3N0YXRpYyB2b2lkIHB4ZV9zZWFyY2hkaXIoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgaW50IGkgPSBQWEVSZXRyeTsKKworICAgIGRvIHsKKwlkcHJpbnRmKCJQWEU6IGZpbGUgPSAlcCwgcmV0cmllcyBsZWZ0ID0gJWQ6ICIsIGZpbGUsIGkpOworCV9fcHhlX3NlYXJjaGRpcihmaWxlbmFtZSwgZmxhZ3MsIGZpbGUpOworCWRwcmludGYoIiVzXG4iLCBmaWxlLT5pbm9kZSA/ICJvayIgOiAiZmFpbGVkIik7CisgICAgfSB3aGlsZSAoIWZpbGUtPmlub2RlICYmIGktLSk7Cit9CitzdGF0aWMgdm9pZCBfX3B4ZV9zZWFyY2hkaXIoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gZmlsZS0+ZnM7CisgICAgc3RydWN0IGlub2RlICppbm9kZTsKKyAgICBjaGFyIGZ1bGxwYXRoWzIqRklMRU5BTUVfTUFYXTsKKyNpZiBHUFhFCisgICAgY2hhciB1cmxzYXZlWzIqRklMRU5BTUVfTUFYXTsKKyNlbmRpZgorICAgIHN0cnVjdCB1cmxfaW5mbyB1cmw7CisgICAgY29uc3Qgc3RydWN0IHVybF9zY2hlbWUgKnVzID0gTlVMTDsKKyAgICBpbnQgcmVkaXJlY3RfY291bnQgPSAwOworICAgIGJvb2wgZm91bmRfc2NoZW1lID0gZmFsc2U7CisKKyAgICBpbm9kZSA9IGZpbGUtPmlub2RlID0gTlVMTDsKKworICAgIHdoaWxlIChmaWxlbmFtZSkgeworCWlmIChyZWRpcmVjdF9jb3VudCsrID4gNSkKKwkgICAgYnJlYWs7CisKKwlzdHJsY3B5KGZ1bGxwYXRoLCBmaWxlbmFtZSwgc2l6ZW9mIGZ1bGxwYXRoKTsKKyNpZiBHUFhFCisJc3RyY3B5KHVybHNhdmUsIGZ1bGxwYXRoKTsKKyNlbmRpZgorCXBhcnNlX3VybCgmdXJsLCBmdWxscGF0aCk7CisJaWYgKHVybC50eXBlID09IFVSTF9TVUZGSVgpIHsKKwkgICAgc25wcmludGYoZnVsbHBhdGgsIHNpemVvZiBmdWxscGF0aCwgIiVzJXMiLCBmcy0+Y3dkX25hbWUsIGZpbGVuYW1lKTsKKyNpZiBHUFhFCisJICAgIHN0cmNweSh1cmxzYXZlLCBmdWxscGF0aCk7CisjZW5kaWYKKwkgICAgcGFyc2VfdXJsKCZ1cmwsIGZ1bGxwYXRoKTsKKwl9CisKKwlpbm9kZSA9IGFsbG9jYXRlX3NvY2tldChmcyk7CisJaWYgKCFpbm9kZSkKKwkgICAgcmV0dXJuOwkJCS8qIEFsbG9jYXRpb24gZmFpbHVyZSAqLworCQorCXVybF9zZXRfaXAoJnVybCk7CisJCisJZmlsZW5hbWUgPSBOVUxMOworCWZvdW5kX3NjaGVtZSA9IGZhbHNlOworCWZvciAodXMgPSB1cmxfc2NoZW1lczsgdXMtPm5hbWU7IHVzKyspIHsKKwkgICAgaWYgKCFzdHJjbXAodXMtPm5hbWUsIHVybC5zY2hlbWUpKSB7CisJCWlmICgoZmxhZ3MgJiB+dXMtPm9rX2ZsYWdzICYgT0tfRkxBR1NfTUFTSykgPT0gMCkKKwkJICAgIHVzLT5vcGVuKCZ1cmwsIGZsYWdzLCBpbm9kZSwgJmZpbGVuYW1lKTsKKwkJZm91bmRfc2NoZW1lID0gdHJ1ZTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKwkvKiBmaWxlbmFtZSBoZXJlIGlzIHNldCBvbiBhIHJlZGlyZWN0ICovCisgICAgfQorCisgICAgaWYgKCFmb3VuZF9zY2hlbWUpIHsKKyNpZiBHUFhFCisJLyogTm8gVVJMIHNjaGVtZSBmb3VuZCwgaGFuZCBpdCB0byBHUFhFICovCisJZ3B4ZV9vcGVuKGlub2RlLCB1cmxzYXZlKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChpbm9kZS0+c2l6ZSkgeworCWZpbGUtPmlub2RlID0gaW5vZGU7CisJZmlsZS0+aW5vZGUtPm1vZGUgPSAoZmxhZ3MgJiBPX0RJUkVDVE9SWSkgPyBEVF9ESVIgOiBEVF9SRUc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJlZV9zb2NrZXQoaW5vZGUpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworCisvKgorICogU3RvcmUgc3RhbmRhcmQgZmlsZW5hbWUgcHJlZml4CisgKi8KK3N0YXRpYyB2b2lkIGdldF9wcmVmaXgodm9pZCkKK3sKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnA7CisgICAgY2hhciBjOworCisgICAgaWYgKCEoREhDUE1hZ2ljICYgMHgwNCkpIHsKKwkvKiBObyBwYXRoIHByZWZpeCBvcHRpb24sIGRlcml2ZSBmcm9tIGJvb3QgZmlsZSAqLworCisJc3RybGNweShwYXRoX3ByZWZpeCwgYm9vdF9maWxlLCBzaXplb2YgcGF0aF9wcmVmaXgpOworCWxlbiA9IHN0cmxlbihwYXRoX3ByZWZpeCk7CisJcCA9ICZwYXRoX3ByZWZpeFtsZW4gLSAxXTsKKwkKKwl3aGlsZSAobGVuLS0pIHsKKwkgICAgYyA9ICpwLS07CisJICAgIGMgfD0gMHgyMDsKKwkgICAgCisJICAgIGMgPSAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8CisJCShjID49ICdhJyAmJiBjIDw9ICd6JykgfHwKKwkJKGMgPT0gJy4nIHx8IGMgPT0gJy0nKTsKKwkgICAgaWYgKCFjKQorCQlicmVhazsKKwl9OworCQorCWlmIChsZW4gPCAwKQorCSAgICBwIC0tOworCQorCSoocCArIDIpID0gMDsgICAgICAgICAgICAgICAgLyogWmVyby10ZXJtaW5hdGUgYWZ0ZXIgZGVsaW1pdGVyICovCisgICAgfQorCisgICAgZGRwcmludGYoIlRGVFAgcHJlZml4OiAlc1xuIiwgcGF0aF9wcmVmaXgpOworCisgICAgaWYgKHVybF90eXBlKHBhdGhfcHJlZml4KSA9PSBVUkxfU1VGRklYKSB7CisJLyoKKwkgKiBDb25zdHJ1Y3QgYSA6Oi1zdHlsZSBURlRQIHBhdGguCisJICoKKwkgKiBXZSBtYXkgaGF2ZSBtb3ZlZCBvdXQgb2YgdGhlIHJvb3QgZGlyZWN0b3J5IGF0IHRoZSB0aW1lCisJICogdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkLCBidXQgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eQorCSAqIHdpdGggdmVyc2lvbnMgb2YgU3lzbGludXggPCA1LjAwLCBwYXRoX3ByZWZpeCBtdXN0IGJlCisJICogcmVsYXRpdmUgdG8gIjo6Ii4KKwkgKi8KKwlwID0gc3RyZHVwKHBhdGhfcHJlZml4KTsKKwlpZiAoIXApCisJICAgIHJldHVybjsKKworCXNucHJpbnRmKHBhdGhfcHJlZml4LCBzaXplb2YgcGF0aF9wcmVmaXgsICI6OiVzIiwgcCk7CisJZnJlZShwKTsKKyAgICB9CisKKyAgICBjaGRpcihwYXRoX3ByZWZpeCk7Cit9CisKKy8qCisgKiByZWFscGF0aCBmb3IgUFhFCisgKi8KK3N0YXRpYyBzaXplX3QgcHhlX3JlYWxwYXRoKHN0cnVjdCBmc19pbmZvICpmcywgY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsCisJCQkgICBzaXplX3QgYnVmc2l6ZSkKK3sKKyAgICByZXR1cm4gc25wcmludGYoZHN0LCBidWZzaXplLCAiJXMlcyIsCisJCSAgICB1cmxfdHlwZShzcmMpID09IFVSTF9TVUZGSVggPyBmcy0+Y3dkX25hbWUgOiAiIiwgc3JjKTsKK30KKworLyoKKyAqIGNoZGlyIGZvciBQWEUKKyAqLworc3RhdGljIGludCBweGVfY2hkaXIoc3RydWN0IGZzX2luZm8gKmZzLCBjb25zdCBjaGFyICpzcmMpCit7CisgICAgLyogVGhlIGN3ZCBmb3IgUFhFIGlzIGp1c3QgYSB0ZXh0IHByZWZpeCAqLworICAgIGVudW0gdXJsX3R5cGUgcGF0aF90eXBlID0gdXJsX3R5cGUoc3JjKTsKKworICAgIGlmIChwYXRoX3R5cGUgPT0gVVJMX1NVRkZJWCkKKwlzdHJsY2F0KGZzLT5jd2RfbmFtZSwgc3JjLCBzaXplb2YgZnMtPmN3ZF9uYW1lKTsKKyAgICBlbHNlCisJc3RybGNweShmcy0+Y3dkX25hbWUsIHNyYywgc2l6ZW9mIGZzLT5jd2RfbmFtZSk7CisgICAgcmV0dXJuIDA7CisKKyAgICBkcHJpbnRmKCJjd2QgPSBcIiVzXCJcbiIsIGZzLT5jd2RfbmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhlX2NoZGlyX3N0YXJ0KHZvaWQpCit7CisJZ2V0X3ByZWZpeCgpOworCXJldHVybiAwOworfQorCisvKiBMb2FkIHRoZSBjb25maWcgZmlsZSwgcmV0dXJuIC0xIGlmIGZhaWxlZCwgb3IgMCAqLworc3RhdGljIGludCBweGVfb3Blbl9jb25maWcoc3RydWN0IGNvbTMyX2ZpbGVkYXRhICpmaWxlZGF0YSkKK3sKKyAgICBjb25zdCBjaGFyICpjZmdwcmVmaXggPSAicHhlbGludXguY2ZnLyI7CisgICAgY29uc3QgY2hhciAqZGVmYXVsdF9zdHIgPSAiZGVmYXVsdCI7CisgICAgY2hhciAqY29uZmlnX2ZpbGU7CisgICAgY2hhciAqbGFzdDsKKyAgICBpbnQgdHJpZXMgPSA4OworCisgICAgY2hkaXIocGF0aF9wcmVmaXgpOworICAgIGlmIChESENQTWFnaWMgJiAweDAyKSB7CisgICAgICAgIC8qIFdlIGdvdCBhIERIQ1Agb3B0aW9uLCB0cnkgaXQgZmlyc3QgKi8KKwlpZiAob3Blbl9maWxlKENvbmZpZ05hbWUsIE9fUkRPTkxZLCBmaWxlZGF0YSkgPj0gMCkKKwkgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBIYXZlIHRvIGd1ZXNzIGNvbmZpZyBmaWxlIG5hbWUgLi4uCisgICAgICovCisgICAgY29uZmlnX2ZpbGUgPSBzdHBjcHkoQ29uZmlnTmFtZSwgY2ZncHJlZml4KTsKKworICAgIC8qIFRyeSBsb2FkaW5nIGJ5IFVVSUQgKi8KKyAgICBpZiAoc3lzYXBwZW5kX3N0cmluZ3NbU1lTQVBQRU5EX1NZU1VVSURdKSB7CisJc3RyY3B5KGNvbmZpZ19maWxlLCBzeXNhcHBlbmRfc3RyaW5nc1tTWVNBUFBFTkRfU1lTVVVJRF0rOCk7CisJaWYgKG9wZW5fZmlsZShDb25maWdOYW1lLCBPX1JET05MWSwgZmlsZWRhdGEpID49IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBUcnkgbG9hZGluZyBieSBNQUMgYWRkcmVzcyAqLworICAgIHN0cmNweShjb25maWdfZmlsZSwgc3lzYXBwZW5kX3N0cmluZ3NbU1lTQVBQRU5EX0JPT1RJRl0rNyk7CisgICAgaWYgKG9wZW5fZmlsZShDb25maWdOYW1lLCBPX1JET05MWSwgZmlsZWRhdGEpID49IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogTm9wZSwgdHJ5IGhleGFkZWNpbWFsIElQIHByZWZpeGVzLi4uICovCisgICAgc3ByaW50Zihjb25maWdfZmlsZSwgIiUwOFgiLCBudG9obChJUEluZm8ubXlpcCkpOworICAgIGxhc3QgPSAmY29uZmlnX2ZpbGVbOF07CisgICAgd2hpbGUgKHRyaWVzKSB7CisgICAgICAgICpsYXN0ID0gJ1wwJzsgICAgICAgIC8qIFplcm8tdGVybWluYXRlIHN0cmluZyAqLworCWlmIChvcGVuX2ZpbGUoQ29uZmlnTmFtZSwgT19SRE9OTFksIGZpbGVkYXRhKSA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGxhc3QtLTsgICAgICAgICAgIC8qIERyb3Agb25lIGNoYXJhY3RlciAqLworICAgICAgICB0cmllcy0tOworICAgIH07CisKKyAgICAvKiBGaW5hbCBhdHRlbXB0OiAiZGVmYXVsdCIgc3RyaW5nICovCisgICAgc3RyY3B5KGNvbmZpZ19maWxlLCBkZWZhdWx0X3N0cik7CisgICAgaWYgKG9wZW5fZmlsZShDb25maWdOYW1lLCBPX1JET05MWSwgZmlsZWRhdGEpID49IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgZGRwcmludGYoIiUtNjhzXG4iLCAiVW5hYmxlIHRvIGxvY2F0ZSBjb25maWd1cmF0aW9uIGZpbGUiKTsKKyAgICBrYWJvb20oKTsKK30KKworLyoKKyAqIEdlbmVyYXRlIHRoZSBib290aWYgc3RyaW5nLgorICovCitzdGF0aWMgdm9pZCBtYWtlX2Jvb3RpZl9zdHJpbmcodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBib290aWZfc3RyWzcrMyooTUFDX01BWCsxKV07CisgICAgY29uc3QgdWludDhfdCAqc3JjOworICAgIGNoYXIgKmRzdCA9IGJvb3RpZl9zdHI7CisgICAgaW50IGk7CisKKyAgICBkc3QgKz0gc3ByaW50Zihkc3QsICJCT09USUY9JTAyeCIsIE1BQ190eXBlKTsKKyAgICBzcmMgPSBNQUM7CisgICAgZm9yIChpID0gTUFDX2xlbjsgaTsgaS0tKQorCWRzdCArPSBzcHJpbnRmKGRzdCwgIi0lMDJ4IiwgKnNyYysrKTsKKworICAgIHN5c2FwcGVuZF9zdHJpbmdzW1NZU0FQUEVORF9CT09USUZdID0gYm9vdGlmX3N0cjsKK30KKworLyoKKyAqIEdlbmVyYXRlIGFuIGlwPTxjbGllbnQtaXA+Ojxib290LXNlcnZlci1pcD46PGd3LWlwPjo8bmV0bWFzaz4KKyAqIG9wdGlvbiBpbnRvIElQT3B0aW9uIGJhc2VkIG9uIERIQ1AgaW5mb3JtYXRpb24gaW4gSVBJbmZvLgorICoKKyAqLworc3RhdGljIHZvaWQgZ2VuaXBvcHQodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBpcF9vcHRpb25bMys0KjE2XTsKKyAgICBjb25zdCB1aW50MzJfdCAqdiA9ICZJUEluZm8ubXlpcDsKKyAgICBjaGFyICpwOworICAgIGludCBpOworCisgICAgcCA9IHN0cGNweShpcF9vcHRpb24sICJpcD0iKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwlwICs9IGdlbmRvdHF1YWQocCwgKnYrKyk7CisJKnArKyA9ICc6JzsKKyAgICB9CisgICAgKi0tcCA9ICdcMCc7CisKKyAgICBzeXNhcHBlbmRfc3RyaW5nc1tTWVNBUFBFTkRfSVBdID0gaXBfb3B0aW9uOworfQorCisKKy8qIEdlbmVyYXRlIGlwPSBvcHRpb24gYW5kIHByaW50IHRoZSBpcCBhZHJlc3MgKi8KK3N0YXRpYyB2b2lkIGlwX2luaXQodm9pZCkKK3sKKyAgICB1aW50MzJfdCBpcCA9IElQSW5mby5teWlwOworICAgIGNoYXIgZG90X3F1YWRfYnVmWzE2XTsKKworICAgIGdlbmlwb3B0KCk7CisgICAgZ2VuZG90cXVhZChkb3RfcXVhZF9idWYsIGlwKTsKKworICAgIGlwID0gbnRvaGwoaXApOworICAgIGRkcHJpbnRmKCJNeSBJUCBhZGRyZXNzIHNlZW1zIHRvIGJlICUwOFggJXNcbiIsIGlwLCBkb3RfcXVhZF9idWYpOworfQorCisvKgorICogTmV0d29yay1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICovCitzdGF0aWMgdm9pZCBuZXR3b3JrX2luaXQodm9pZCkKK3sKKyAgICBuZXRfcGFyc2VfZGhjcCgpOworCisgICAgbWFrZV9ib290aWZfc3RyaW5nKCk7CisgICAgLyogSWYgRE1JIGFuZCBESENQIGRpc2FncmVlLCB3aGljaCBvbmUgc2hvdWxkIHdlIHNldD8gKi8KKyAgICBpZiAoaGF2ZV91dWlkKQorCXN5c2FwcGVuZF9zZXRfdXVpZCh1dWlkKTsKKyAgICBpcF9pbml0KCk7CisKKyAgICAvKiBwcmludF9zeXNhcHBlbmQoKTsgKi8KKyAgICAvKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiB3ZSBnb3QgYW55IFBYRUxJTlVYLXNwZWNpZmljIERIQ1Agb3B0aW9uczsgaW4gcGFydGljdWxhciwKKyAgICAgKiBpZiB3ZSBkaWRuJ3QgZ2V0IHRoZSBtYWdpYyBlbmFibGUsIGRvIG5vdCByZWNvZ25pemUgYW55IG90aGVyIG9wdGlvbnMuCisgICAgICovCisgICAgaWYgKChESENQTWFnaWMgJiAxKSA9PSAwKQorICAgICAgICBESENQTWFnaWMgPSAwOworCisgICAgbmV0X2NvcmVfaW5pdCgpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBweGUgZnMKKyAqCisgKi8KK3N0YXRpYyBpbnQgcHhlX2ZzX2luaXQoc3RydWN0IGZzX2luZm8gKmZzKQoreworICAgICh2b2lkKWZzOyAgICAvKiBkcm9wIHRoZSBjb21waWxlIHdhcm5pbmcgbWVzc2FnZSAqLworCisgICAgLyogUHJlcGFyZSBmb3IgaGFuZGxpbmcgcHhlIGludGVycnVwdHMgKi8KKyAgICBweGVfaW5pdF9pc3IoKTsKKworICAgIC8qIFRoaXMgYmxvY2sgc2l6ZSBpcyBhY3R1YWxseSBhcmJpdHJhcnkuLi4gKi8KKyAgICBmcy0+c2VjdG9yX3NoaWZ0ID0gZnMtPmJsb2NrX3NoaWZ0ID0gVEZUUF9CTE9DS1NJWkVfTEcyOworICAgIGZzLT5zZWN0b3Jfc2l6ZSAgPSBmcy0+YmxvY2tfc2l6ZSAgPSAxIDw8IFRGVFBfQkxPQ0tTSVpFX0xHMjsKKworICAgIC8qIEZpbmQgdGhlIFBYRSBzdGFjayAqLworICAgIGlmIChweGVfaW5pdChmYWxzZSkpCisJa2Fib29tKCk7CisKKyAgICAvKiBTZWUgaWYgd2UgYWxzbyBoYXZlIGEgZ1BYRSBzdGFjayAqLworICAgIGdweGVfaW5pdCgpOworCisgICAgLyogTmV0d29yay1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworICAgIG5ldHdvcmtfaW5pdCgpOworCisgICAgLyogSW5pdGlhbGl6ZSBuZXR3b3JrLWNhcmQtc3BlY2lmaWMgaWRsZSBoYW5kbGluZyAqLworICAgIHB4ZV9pZGxlX2luaXQoKTsKKworICAgIC8qIE91ciBuYW1lIGZvciB0aGUgcm9vdCAqLworICAgIHN0cmNweShmcy0+Y3dkX25hbWUsICI6OiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb29rIHRvIHNlZSBpZiB3ZSBhcmUgb24gYW4gRUZJIENTTSBzeXN0ZW0uICBTb21lIEVGSQorICogQ1NNIHN5c3RlbXMgcHV0IHRoZSBCRVYgc3RhY2sgaW4gbG93IG1lbW9yeSwgd2hpY2ggbWVhbnMKKyAqIGEgcmV0dXJuIHRvIHRoZSBQWEUgc3RhY2sgd2lsbCBjcmFzaCB0aGUgc3lzdGVtLiAgSG93ZXZlciwKKyAqIElOVCAxOGggd29ya3MgcmVsaWFibHksIHNvIGluIHRoYXQgY2FzZSBoYWNrIHRoZSBzdGFjayBhbmQKKyAqIHBvaW50IHRoZSAicmV0dXJuIGFkZHJlc3MiIHRvIGFuIElOVCAxOGggaW5zdHJ1Y3Rpb24uCisgKgorICogSGFjayB0aGUgc3RhY2sgaW5zdGVhZCBvZiB0aGUgbXVjaCBzaW1wbGVyICJqdXN0IGludm9rZSBJTlQgMThoCisgKiBpZiB3ZSB3YW50IHRvIHJlc2V0Iiwgc28gdGhhdCBjaGFpbmxvYWRpbmcgb3RoZXIgTkJQcyB3aWxsIHdvcmsuCisgKgorICogVGhpcyBtYW5pcHVsYXRlcyB0aGUgcmVhbC1tb2RlIEluaXRTdGFjayBkaXJlY3RseS4gIEl0IHJlbGllcyBvbiB0aGlzCisgKiAqbm90KiBiZWluZyBhIGN1cnJlbnRseSBhY3RpdmUgc3RhY2ssIGkuZS4gdGhlIGZvcm1lcgorICogVVNFX1BYRV9QUk9WSURFRF9TVEFDSyBubyBsb25nZXIgd29ya3MuCisgKgorICogWFhYOiBEaXNhYmxlIHRoaXMgdW50aWwgd2UgY2FuIGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGRpc2NyaW1pbmF0ZQorICogYmV0d2VlbiBCSU9TZXMgdGhhdCBhcmUgYnJva2VuIG9uIEJFViByZXR1cm4gYW5kIEJJT1NlcyB3aGljaCBhcmUKKyAqIGJyb2tlbiBvbiBJTlQgMThoLiAgS2V5aW5nIG9uIHRoZSBFRkkgQ1NNIHR1cm5zIG91dCB0byBjYXVzZSBtb3JlCisgKiBwcm9ibGVtcyB0aGFuIGl0IHNvbHZlcy4KKyAqLworZXh0ZXJuIGZhcl9wdHJfdCBJbml0U3RhY2s7CisKK3N0cnVjdCBlZmlfc3RydWN0IHsKKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB1aW50OF90ICBjc3VtOworICAgIHVpbnQ4X3QgIGxlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZGVmaW5lIEVGSV9NQUdJQyAoKCckJyA8PCAyNCkrKCdFJyA8PCAxNikrKCdGJyA8PCA4KSsnSScpCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19lZmkoY29uc3Qgc3RydWN0IGVmaV9zdHJ1Y3QgKmVmaSkKK3sKKyAgICAvKgorICAgICAqIFdlIGRvbid0IHZlcmlmeSB0aGUgY2hlY2tzdW0sIGJlY2F1c2UgaXQgc2VlbXMgc29tZSBDU01zIGxlYXZlCisgICAgICogaXQgYXQgemVybywgc2lnaC4uLgorICAgICAqLworICAgIHJldHVybiAoZWZpLT5tYWdpYyA9PSBFRklfTUFHSUMpICYmIChlZmktPmxlbiA+PSA4Myk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBpbnN0YWxsX2ludDE4X2hhY2sodm9pZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBpbnQxOF9oYWNrW10gPQorICAgIHsKKwkweGNkLCAweDE4LAkJCS8qIGludCAkMHgxOCAqLworCTB4ZWEsIDB4ZjAsIDB4ZmYsIDB4MDAsIDB4ZjAsCS8qIGxqbXB3ICQweGYwMDAsJDB4ZmZmMCAqLworCTB4ZjQJCQkJLyogaGx0ICovCisgICAgfTsKKyAgICB1aW50MTZfdCAqcmV0Y29kZTsKKworICAgIHJldGNvZGUgPSBHRVRfUFRSKCooZmFyX3B0cl90ICopKChjaGFyICopR0VUX1BUUihJbml0U3RhY2spICsgNDQpKTsKKworICAgIC8qIERvbid0IGRvIHRoaXMgaWYgdGhlIHJldHVybiBhbHJlYWR5IHBvaW50cyB0byBpbnQgJDB4MTggKi8KKyAgICBpZiAoKnJldGNvZGUgIT0gMHgxOGNkKSB7CisJdWludDMyX3QgZWZpX3B0cjsKKwlib29sIGVmaSA9IGZhbHNlOworCisJZm9yIChlZmlfcHRyID0gMHhlMDAwMCA7IGVmaV9wdHIgPCAweDEwMDAwMCA7IGVmaV9wdHIgKz0gMTYpIHsKKwkgICAgaWYgKGlzX2VmaSgoY29uc3Qgc3RydWN0IGVmaV9zdHJ1Y3QgKillZmlfcHRyKSkgeworCQllZmkgPSB0cnVlOworCQlicmVhazsKKwkgICAgfQorCX0KKworCWlmIChlZmkpIHsKKwkgICAgdWludDhfdCAqc3JjID0gR0VUX1BUUihJbml0U3RhY2spOworCSAgICB1aW50OF90ICpkc3QgPSBzcmMgLSBzaXplb2YgaW50MThfaGFjazsKKworCSAgICBtZW1tb3ZlKGRzdCwgc3JjLCA1Mik7CisJICAgIG1lbWNweShkc3QrNTIsIGludDE4X2hhY2ssIHNpemVvZiBpbnQxOF9oYWNrKTsKKwkgICAgSW5pdFN0YWNrLm9mZnMgLT0gc2l6ZW9mIGludDE4X2hhY2s7CisKKwkgICAgLyogQ2xvYmJlciB0aGUgcmV0dXJuIGFkZHJlc3MgKi8KKwkgICAgKih1aW50MTZfdCAqKShkc3QrNDQpID0gT0ZGU19XUlQoZHN0KzUyLCBJbml0U3RhY2suc2VnKTsKKwkgICAgKih1aW50MTZfdCAqKShkc3QrNDYpID0gSW5pdFN0YWNrLnNlZzsKKwl9CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHhlX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCkKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+aW5vZGU7CisgICAgc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCA9IFBWVChpbm9kZSk7CisKKyAgICBpZiAoc29ja2V0LT5vcHMtPnJlYWRkaXIpCisJcmV0dXJuIHNvY2tldC0+b3BzLT5yZWFkZGlyKGlub2RlLCBkaXJlbnQpOworICAgIGVsc2UKKwlyZXR1cm4gLTE7CQkvKiBObyBzdWNoIG9wZXJhdGlvbiAqLworfQorCitjb25zdCBzdHJ1Y3QgZnNfb3BzIHB4ZV9mc19vcHMgPSB7CisgICAgLmZzX25hbWUgICAgICAgPSAicHhlIiwKKyAgICAuZnNfZmxhZ3MgICAgICA9IEZTX05PREVWLAorICAgIC5mc19pbml0ICAgICAgID0gcHhlX2ZzX2luaXQsCisgICAgLnNlYXJjaGRpciAgICAgPSBweGVfc2VhcmNoZGlyLAorICAgIC5jaGRpciAgICAgICAgID0gcHhlX2NoZGlyLAorICAgIC5yZWFscGF0aCAgICAgID0gcHhlX3JlYWxwYXRoLAorICAgIC5nZXRmc3NlYyAgICAgID0gcHhlX2dldGZzc2VjLAorICAgIC5jbG9zZV9maWxlICAgID0gcHhlX2Nsb3NlX2ZpbGUsCisgICAgLm1hbmdsZV9uYW1lICAgPSBweGVfbWFuZ2xlX25hbWUsCisgICAgLmNoZGlyX3N0YXJ0ICAgPSBweGVfY2hkaXJfc3RhcnQsCisgICAgLm9wZW5fY29uZmlnICAgPSBweGVfb3Blbl9jb25maWcsCisgICAgLnJlYWRkaXIJICAgPSBweGVfcmVhZGRpciwKKyAgICAuZnNfdXVpZCAgICAgICA9IE5VTEwsCit9OwpkaWZmIC0tZ2l0IGEvY29yZS9mcy9weGUvcHhlLmggYi9jb3JlL2ZzL3B4ZS9weGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTI1MmZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9weGUvcHhlLmgKQEAgLTAsMCArMSwyNjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBDb3B5cmlnaHQgMTk5OS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHB4ZS5oCisgKgorICogUFhFIG9wY29kZXMKKyAqCisgKi8KKyNpZm5kZWYgUFhFX0gKKyNkZWZpbmUgUFhFX0gKKworI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZV9hcGkuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgkJLyogRm9yIE9LX0ZMQUdTX01BU0sgKi8KKyNpbmNsdWRlICJmcy5oIgkJCS8qIE1vc3RseSBmb3IgRklMRU5BTUVfTUFYICovCisKKy8qCisgKiBTb21lIGJhc2ljIGRlZmluZXMuLi4KKyAqLworI2RlZmluZSBQS1RCVUZfU0laRSAgICAgMjA0OAkvKiBVc2VkIG1vc3RseSBieSB0aGUgZ1BYRSBiYWNrZW5kICovCisKKyNkZWZpbmUgaXNfZGlnaXQoYykgICAgICgoKGMpID49ICcwJykgJiYgKChjKSA8PSAnOScpKQorCisjZGVmaW5lIEJPT1RQX09QVElPTl9NQUdJQyAgaHRvbmwoMHg2MzgyNTM2MykKKyNkZWZpbmUgTUFDX01BWCAzMgorCisvKgorICogc3RydWN0dXJlcworICovCitzdHJ1Y3QgcHhlbnZfdCB7CisgICAgdWludDhfdCAgICBzaWduYXR1cmVbNl07CS8qIFBYRU5WKyAqLworICAgIHVpbnQxNl90ICAgdmVyc2lvbjsKKyAgICB1aW50OF90ICAgIGxlbmd0aDsKKyAgICB1aW50OF90ICAgIGNoZWNrc3VtOworICAgIHNlZ29mZjE2X3Qgcm1lbnRyeTsKKyAgICB1aW50MzJfdCAgIHBtb2Zmc2V0OworICAgIHVpbnQxNl90ICAgcG1zZWxlY3RvcjsKKyAgICB1aW50MTZfdCAgIHN0YWNrc2VnOworICAgIHVpbnQxNl90ICAgc3RhY2tzaXplOworICAgIHVpbnQxNl90ICAgYmNfY29kZXNlZzsKKyAgICB1aW50MTZfdCAgIGJjX2NvZGVzaXplOworICAgIHVpbnQxNl90ICAgYmNfZGF0YXNlZzsKKyAgICB1aW50MTZfdCAgIGJjX2RhdGFzaXplOworICAgIHVpbnQxNl90ICAgdW5kaWRhdGFzZWc7CisgICAgdWludDE2X3QgICB1bmRpZGF0YXNpemU7CisgICAgdWludDE2X3QgICB1bmRpY29kZXNlZzsKKyAgICB1aW50MTZfdCAgIHVuZGljb2Rlc2l6ZTsKKyAgICBzZWdvZmYxNl90IHB4ZXB0cjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBweGVfdCB7CisgICAgdWludDhfdCAgICBzaWduYXR1cmVbNF07CS8qICFQWEUgKi8KKyAgICB1aW50OF90ICAgIHN0cnVjdGxlbmd0aDsKKyAgICB1aW50OF90ICAgIHN0cnVjdGNrc3VtOworICAgIHVpbnQ4X3QgICAgc3RydWN0cmV2OworICAgIHVpbnQ4X3QgICAgX3BhZDE7CisgICAgc2Vnb2ZmMTZfdCB1bmRpcm9taWQ7CisgICAgc2Vnb2ZmMTZfdCBiYXNlcm9taWQ7CisgICAgc2Vnb2ZmMTZfdCBlbnRyeXBvaW50c3A7CisgICAgc2Vnb2ZmMTZfdCBlbnRyeXBvaW50ZXNwOworICAgIHNlZ29mZjE2X3Qgc3RhdHVzY2FsbG91dDsKKyAgICB1aW50OF90ICAgIF9wYWQyOworICAgIHVpbnQ4X3QgICAgc2VnZGVzY2NudDsKKyAgICB1aW50MTZfdCAgIGZpcnN0c2VsZWN0b3I7CisgICAgcHhlX3NlZ2Rlc2NfdCAgc2VnWzddOworfSBfX3BhY2tlZDsKKworZW51bSBweGVfc2VnbWVudHMgeworICAgIFBYRV9TZWdfU3RhY2sgICAgICAgICA9IDAsCisgICAgUFhFX1NlZ19VTkRJRGF0YSAgICAgID0gMSwKKyAgICBQWEVfU2VnX1VORElDb2RlICAgICAgPSAyLAorICAgIFBYRV9TZWdfVU5ESUNvZGVXcml0ZSA9IDMsCisgICAgUFhFX1NlZ19CQ19EYXRhICAgICAgID0gNCwKKyAgICBQWEVfU2VnX0JDX0NvZGUgICAgICAgPSA1LAorICAgIFBYRV9TZWdfQkNfQ29kZVdyaXRlICA9IDYKK307CisKK3N0cnVjdCBib290cF90IHsKKyAgICB1aW50OF90ICBvcGNvZGU7ICAgICAgICAvKiBCT09UUC9ESENQICJvcGNvZGUiICovCisgICAgdWludDhfdCAgaGFyZHdhcmU7ICAgICAgLyogQVJQIGhyZWFkd2FyZSB0eXBlICovCisgICAgdWludDhfdCAgaGFyZGxlbjsgICAgICAgLyogSGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KKyAgICB1aW50OF90ICBnYXRlaG9wczsgICAgICAvKiBVc2VkIGJ5IGZvcndhcmRlcnMgKi8KKyAgICB1aW50MzJfdCBpZGVudDsgICAgICAgICAvKiBUcmFuc2FjdGlvbiBJRCAqLworICAgIHVpbnQxNl90IHNlY29uZHM7ICAgICAgIC8qIFNlY29uZHMgZWxhcHNlZCAqLworICAgIHVpbnQxNl90IGZsYWdzOyAgICAgICAgIC8qIEJyb2FkY2FzdCBmbGFncyAqLworICAgIHVpbnQzMl90IGNpcDsgICAgICAgICAgIC8qIENpZW50IElQICovCisgICAgdWludDMyX3QgeWlwOyAgICAgICAgICAgLyogIllvdXIiIElQICovCisgICAgdWludDMyX3Qgc2lwOyAgICAgICAgICAgLyogTmV4dCBTZXJ2ZXIgSVAgKi8KKyAgICB1aW50MzJfdCBnaXA7ICAgICAgICAgICAvKiBSZWxheSBhZ2VudCBJUCAqLworICAgIHVpbnQ4X3QgIG1hY2FkZHJbMTZdOyAgIC8qIENsaWVudCBNQUMgYWRkcmVzcyAqLworICAgIHVpbnQ4X3QgIHNuYW1lWzY0XTsgICAgIC8qIFNlcnZlciBuYW1lIChvcHRpb25hbCkgKi8KKyAgICBjaGFyICAgICBib290ZmlsZVsxMjhdOyAvKiBCb290IGZpbGUgbmFtZSAqLworICAgIHVpbnQzMl90IG9wdGlvbl9tYWdpYzsgIC8qIFZlbmRvciBvcHRpb24gbWFnaWMgY29va2llICovCisgICAgdWludDhfdCAgb3B0aW9uc1sxMjYwXTsgLyogVmVuZG9yIG9wdGlvbnMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbmV0Y29ubjsKK3N0cnVjdCBuZXRidWY7CitzdHJ1Y3QgZWZpX2JpbmRpbmc7CisKKy8qCisgKiBPdXIgaW5vZGUgcHJpdmF0ZSBpbmZvcm1hdGlvbiAtLSB0aGlzIGluY2x1ZGVzIHRoZSBwYWNrZXQgYnVmZmVyIQorICovCitzdHJ1Y3QgcHhlX2Nvbm5fb3BzIHsKKyAgICB2b2lkICgqZmlsbF9idWZmZXIpKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworICAgIHZvaWQgKCpjbG9zZSkoc3RydWN0IGlub2RlICppbm9kZSk7CisgICAgaW50ICgqcmVhZGRpcikoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRpcmVudCAqZGlyZW50KTsKK307ICAgIAorCit1bmlvbiBuZXRfcHJpdmF0ZSB7CisgICAgc3RydWN0IG5ldF9wcml2YXRlX2x3aXAgeworCXN0cnVjdCBuZXRjb25uICpjb25uOyAgICAgIC8qIGx3aXAgbmV0d29yayBjb25uZWN0aW9uICovCisJc3RydWN0IG5ldGJ1ZiAqYnVmOwkgICAvKiBsd2lwIGNhY2hlZCBidWZmZXIgKi8KKyAgICB9IGx3aXA7CisgICAgc3RydWN0IG5ldF9wcml2YXRlX3RmdHAgeworCXVpbnQzMl90IHJlbW90ZWlwOyAgCSAgLyogUmVtb3RlIElQIGFkZHJlc3MgKDAgPSBkaXNjb25uZWN0ZWQpICovCisJdWludDE2X3QgbG9jYWxwb3J0OyAgIAkgIC8qIExvY2FsIHBvcnQgbnVtYmVyICAoMD1ub3QgaW4gdXNlKSAqLworICAgIH0gdGZ0cDsKKyAgICBzdHJ1Y3QgbmV0X3ByaXZhdGVfZWZpIHsKKwlzdHJ1Y3QgZWZpX2JpbmRpbmcgKmJpbmRpbmc7IC8qIEVGSSBiaW5kaW5nIGZvciBwcm90b2NvbCAqLworCXVpbnQxNl90IGxvY2FscG9ydDsgICAgICAgICAgLyogTG9jYWwgcG9ydCBudW1iZXIgKDA9bm90IGluIHVzZSkgKi8KKyAgICB9IGVmaTsKK307CisKK3N0cnVjdCBweGVfcHZ0X2lub2RlIHsKKyAgICB1bmlvbiBuZXRfcHJpdmF0ZSBuZXQ7CSAgLyogTmV0d29yayBzdGFjayBwcml2YXRlIGRhdGEgKi8KKyAgICB1aW50MTZfdCB0ZnRwX3JlbW90ZXBvcnQ7ICAgICAvKiBSZW1vdGUgcG9ydCBudW1iZXIgKi8KKyAgICB1aW50MzJfdCB0ZnRwX2ZpbGVwb3M7ICAgICAgICAvKiBieXRlcyBkb3dubG9hZGVkIChpbmNsdWRpbmcgYnVmZmVyKSAqLworICAgIHVpbnQzMl90IHRmdHBfYmxrc2l6ZTsgICAgICAgIC8qIEJsb2NrIHNpemUgZm9yIHRoaXMgY29ubmVjdGlvbigqKSAqLworICAgIHVpbnQxNl90IHRmdHBfYnl0ZXNsZWZ0OyAgICAgIC8qIFVuY2xhaW1lZCBkYXRhIGJ5dGVzICovCisgICAgdWludDE2X3QgdGZ0cF9sYXN0cGt0OyAgICAgICAgLyogU2VxdWVuY2UgbnVtYmVyIG9mIGxhc3QgcGFja2V0IChIQk8pICovCisgICAgY2hhciAgICAqdGZ0cF9kYXRhcHRyOyAgICAgICAgLyogUG9pbnRlciB0byBhdmFpbGFibGUgZGF0YSAqLworICAgIHVpbnQ4X3QgIHRmdHBfZ290ZW9mOyAgICAgICAgIC8qIDEgaWYgdGhlIEVPRiBwYWNrZXQgcmVjZWl2ZWQgKi8KKyAgICB1aW50OF90ICB0ZnRwX3VudXNlZFszXTsgICAgICAvKiBDdXJyZW50bHkgdW51c2VkICovCisgICAgY2hhciAgICAqdGZ0cF9wa3RidWY7ICAgICAgICAgLyogUGFja2V0IGJ1ZmZlciAqLworICAgIHN0cnVjdCBpbm9kZSAqY3RsOwkgICAgICAgICAgLyogQ29udHJvbCBjb25uZWN0aW9uIChmb3IgRlRQKSAqLworICAgIGNvbnN0IHN0cnVjdCBweGVfY29ubl9vcHMgKm9wczsKK307CisKKyNkZWZpbmUgUFZUKGkpICgoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKikoKGkpLT5wdnQpKQorCisvKgorICogVmFyaWFibGUgZXh0ZXJucworICovCitleHRlcm4gc3RydWN0IHN5c2xpbnV4X2lwaW5mbyBJUEluZm87CisKK2V4dGVybiB0X1BYRU5WX1VORElfR0VUX0lORk9STUFUSU9OIHB4ZV91bmRpX2luZm87CitleHRlcm4gdF9QWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPICBweGVfdW5kaV9pZmFjZTsKKworZXh0ZXJuIHVpbnQ4X3QgTUFDW107CitleHRlcm4gY2hhciBCT09USUZTdHJbXTsKK2V4dGVybiB1aW50OF90IE1BQ19sZW47CitleHRlcm4gdWludDhfdCBNQUNfdHlwZTsKKworZXh0ZXJuIHVpbnQ4X3QgIERIQ1BNYWdpYzsKK2V4dGVybiB1aW50MzJfdCBSZWJvb3RUaW1lOworCitleHRlcm4gY2hhciBib290X2ZpbGVbXTsKK2V4dGVybiBjaGFyIHBhdGhfcHJlZml4W107CitleHRlcm4gY2hhciBMb2NhbERvbWFpbltdOworCitleHRlcm4gdWludDMyX3QgZG5zX3NlcnZlcltdOworCitleHRlcm4gdWludDE2X3QgQVBJVmVyOworZXh0ZXJuIGZhcl9wdHJfdCBQWEVFbnRyeTsKK2V4dGVybiB1aW50OF90IEtlZXBQWEU7CisKK2V4dGVybiBmYXJfcHRyX3QgSW5pdFN0YWNrOworCitleHRlcm4gYm9vbCBoYXZlX3V1aWQ7CitleHRlcm4gdWludDhfdCB1dWlkX3R5cGU7CitleHRlcm4gdWludDhfdCB1dWlkW107CisKK3N0cnVjdCB1cmxfaW5mbzsKK3N0cnVjdCB1cmxfc2NoZW1lIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHZvaWQgKCpvcGVuKShzdHJ1Y3QgdXJsX2luZm8gKiwgaW50LCBzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqKik7CisgICAgaW50IG9rX2ZsYWdzOworfTsKKy8qIEZsYWdzIHdoaWNoIGNhbiBiZSBzcGVjaWZpZWQgaW4gdXJsX3NjaGVtZS5va19mbGFncyAqLworI2RlZmluZSBPS19GTEFHU19NQVNLCShPX0RJUkVDVE9SWXxPX1dST05MWSkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1cmxfc2NoZW1lIHVybF9zY2hlbWVzW107CisKKy8qCisgKiBDb21wdXRlIHRoZSBzdWl0YWJsZSBnYXRld2F5IGZvciBhIHNwZWNpZmljIHJvdXRlIC0tIHRvbyBtYW55CisgKiB2ZW5kb3IgUFhFIHN0YWNrcyBkb24ndCBkbyB0aGlzIGNvcnJlY3RseS4uLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdhdGV3YXkodWludDMyX3QgaXApCit7CisgICAgaWYgKChpcCBeIElQSW5mby5teWlwKSAmIElQSW5mby5uZXRtYXNrKQorCXJldHVybiBJUEluZm8uZ2F0ZXdheTsKKyAgICBlbHNlCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmdW5jdGlvbnMKKyAqLworCisvKiBweGVpc3IuaW5jICovCitleHRlcm4gdWludDhfdCBweGVfaXJxX3ZlY3RvcjsKK2V4dGVybiB2b2lkIHB4ZV9pc3Iodm9pZCk7CitleHRlcm4gZmFyX3B0cl90IHB4ZV9pcnFfY2hhaW47CitleHRlcm4gdm9pZCBweGVfcG9sbCh2b2lkKTsKKworLyogaXNyLmMgKi8KK3ZvaWQgcHhlX2luaXRfaXNyKHZvaWQpOwordm9pZCBweGVfc3RhcnRfaXNyKHZvaWQpOworaW50IHJlc2V0X3B4ZSh2b2lkKTsKKworLyogcHhlLmMgKi8KK3N0cnVjdCB1cmxfaW5mbzsKK2Jvb2wgaXBfb2sodWludDMyX3QpOworaW50IHB4ZV9nZXRjKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwordm9pZCBmcmVlX3NvY2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyogdW5kaWlmLmMgKi8KK2ludCB1bmRpaWZfc3RhcnQodWludDMyX3QgaXAsIHVpbnQzMl90IG5ldG1hc2ssIHVpbnQzMl90IGd3KTsKK3ZvaWQgdW5kaWlmX2lucHV0KHRfUFhFTlZfVU5ESV9JU1IgKmlzcik7CisKKy8qIGRoY3Bfb3B0aW9ucy5jICovCit2b2lkIHBhcnNlX2RoY3Bfb3B0aW9ucyhjb25zdCB2b2lkICosIGludCwgdWludDhfdCk7Cit2b2lkIHBhcnNlX2RoY3AoY29uc3Qgdm9pZCAqLCBzaXplX3QpOworCisvKiBpZGxlLmMgKi8KK3ZvaWQgcHhlX2lkbGVfaW5pdCh2b2lkKTsKK3ZvaWQgcHhlX2lkbGVfY2xlYW51cCh2b2lkKTsKKworLyogdGZ0cC5jICovCit2b2lkIHRmdHBfb3BlbihzdHJ1Y3QgdXJsX2luZm8gKnVybCwgaW50IGZsYWdzLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCSAgICAgICBjb25zdCBjaGFyICoqcmVkaXIpOworCisvKiBncHhldXJsLmMgKi8KK3ZvaWQgZ3B4ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnVybCk7CisjZGVmaW5lIEdQWEUgMAorCisvKiBodHRwLmMgKi8KK3ZvaWQgaHR0cF9vcGVuKHN0cnVjdCB1cmxfaW5mbyAqdXJsLCBpbnQgZmxhZ3MsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJICAgICAgIGNvbnN0IGNoYXIgKipyZWRpcik7CisKKy8qIGh0dHBfcmVhZGRpci5jICovCitpbnQgaHR0cF9yZWFkZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCk7CisKKy8qIGZ0cC5jICovCit2b2lkIGZ0cF9vcGVuKHN0cnVjdCB1cmxfaW5mbyAqdXJsLCBpbnQgZmxhZ3MsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJICAgICAgY29uc3QgY2hhciAqKnJlZGlyKTsKKworLyogZnRwX3JlYWRkaXIuYyAqLworaW50IGZ0cF9yZWFkZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCk7CisKKy8qIHRjcC5jICovCitjb25zdCBzdHJ1Y3QgcHhlX2Nvbm5fb3BzIHRjcF9jb25uX29wczsKKworZXh0ZXJuIHZvaWQgZ3B4ZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBweGVfaW5pdChib29sIHF1aWV0KTsKKworI2VuZGlmIC8qIHB4ZS5oICovCmRpZmYgLS1naXQgYS9jb3JlL2ZzL3B4ZS90Y3AuYyBiL2NvcmUvZnMvcHhlL3RjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjZlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3B4ZS90Y3AuYwpAQCAtMCwwICsxLDI1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogdGNwLmMKKyAqCisgKiBDb21tb24gb3BlcmF0aW9ucyBmb3IgVENQLWJhc2VkIG5ldHdvcmsgcHJvdG9jb2xzCisgKi8KKworI2luY2x1ZGUgInB4ZS5oIgorI2luY2x1ZGUgIm5ldC5oIgorCitjb25zdCBzdHJ1Y3QgcHhlX2Nvbm5fb3BzIHRjcF9jb25uX29wcyA9IHsKKyAgICAuZmlsbF9idWZmZXIJPSBjb3JlX3RjcF9maWxsX2J1ZmZlciwKKyAgICAuY2xvc2UJCT0gY29yZV90Y3BfY2xvc2VfZmlsZSwKK307CmRpZmYgLS1naXQgYS9jb3JlL2ZzL3B4ZS90ZnRwLmMgYi9jb3JlL2ZzL3B4ZS90ZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2ZGE2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvcHhlL3RmdHAuYwpAQCAtMCwwICsxLDQxNiBAQAorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgInB4ZS5oIgorI2luY2x1ZGUgInVybC5oIgorI2luY2x1ZGUgInRmdHAuaCIKKworY29uc3QgdWludDhfdCBUaW1lb3V0VGFibGVbXSA9IHsKKyAgICAyLCAyLCAzLCAzLCA0LCA1LCA2LCA3LCA5LCAxMCwgMTIsIDE1LCAxOCwgMjEsIDI2LCAzMSwgMzcsIDQ0LAorICAgIDUzLCA2NCwgNzcsIDkyLCAxMTAsIDEzMiwgMTU5LCAxOTEsIDIyOSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAwCit9Oworc3RydWN0IHRmdHBfcGFja2V0IHsKKyAgICB1aW50MTZfdCBvcGNvZGU7CisgICAgdWludDE2X3Qgc2VyaWFsOworICAgIGNoYXIgZGF0YVtdOworfTsKKworc3RhdGljIHZvaWQgdGZ0cF9lcnJvcihzdHJ1Y3QgaW5vZGUgKmZpbGUsIHVpbnQxNl90IGVycm51bSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmVycnN0cik7CisKK3N0YXRpYyB2b2lkIHRmdHBfY2xvc2VfZmlsZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQgPSBQVlQoaW5vZGUpOworICAgIGlmICghc29ja2V0LT50ZnRwX2dvdGVvZikgeworCXRmdHBfZXJyb3IoaW5vZGUsIDAsICJObyBlcnJvciwgZmlsZSBjbG9zZSIpOworICAgIH0KKyAgICBjb3JlX3VkcF9jbG9zZShzb2NrZXQpOworfQorCisvKioKKyAqIFNlbmQgYW4gRVJST1IgcGFja2V0LiAgVGhpcyBpcyB1c2VkIHRvIHRlcm1pbmF0ZSBhIGNvbm5lY3Rpb24uCisgKgorICogQGlub2RlOglJbm9kZSBzdHJ1Y3R1cmUKKyAqIEBlcnJudW06CUVycm9yIG51bWJlciAobmV0d29yayBieXRlIG9yZGVyKQorICogQGVycnN0cjoJRXJyb3Igc3RyaW5nIChpbmNsdWRlZCBpbiBwYWNrZXQpCisgKi8KK3N0YXRpYyB2b2lkIHRmdHBfZXJyb3Ioc3RydWN0IGlub2RlICppbm9kZSwgdWludDE2X3QgZXJybnVtLAorCQkgICAgICAgY29uc3QgY2hhciAqZXJyc3RyKQoreworICAgIHN0YXRpYyBzdHJ1Y3QgeworCXVpbnQxNl90IGVycl9vcDsKKwl1aW50MTZfdCBlcnJfbnVtOworCWNoYXIgZXJyX21zZ1s2NF07CisgICAgfSBfX3BhY2tlZCBlcnJfYnVmOworICAgIGludCBsZW4gPSBtaW4oc3RybGVuKGVycnN0ciksIHNpemVvZihlcnJfYnVmLmVycl9tc2cpLTEpOworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQgPSBQVlQoaW5vZGUpOworCisgICAgZXJyX2J1Zi5lcnJfb3AgID0gVEZUUF9FUlJPUjsKKyAgICBlcnJfYnVmLmVycl9udW0gPSBlcnJudW07CisgICAgbWVtY3B5KGVycl9idWYuZXJyX21zZywgZXJyc3RyLCBsZW4pOworICAgIGVycl9idWYuZXJyX21zZ1tsZW5dID0gJ1wwJzsKKworICAgIGNvcmVfdWRwX3NlbmQoc29ja2V0LCAmZXJyX2J1ZiwgNCArIGxlbiArIDEpOworfQorCisvKioKKyAqIFNlbmQgQUNLIHBhY2tldC4gVGhpcyBpcyBhIGNvbW1vbiBvcGVyYXRpb24gYW5kIHNvIGlzIHdvcnRoIGNhbm5pbmcuCisgKgorICogQHBhcmFtOiBpbm9kZSwgICBJbm9kZSBwb2ludGVyCisgKiBAcGFyYW06IGFja19udW0sIFBhY2tldCAjIHRvIGFjayAoaG9zdCBieXRlIG9yZGVyKQorICoKKyAqLworc3RhdGljIHZvaWQgYWNrX3BhY2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1aW50MTZfdCBhY2tfbnVtKQoreworICAgIHN0YXRpYyB1aW50MTZfdCBhY2tfcGFja2V0X2J1ZlsyXTsKKyAgICBzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0ID0gUFZUKGlub2RlKTsKKworICAgIC8qIFBhY2tldCBudW1iZXIgdG8gYWNrICovCisgICAgYWNrX3BhY2tldF9idWZbMF0gICAgID0gVEZUUF9BQ0s7CisgICAgYWNrX3BhY2tldF9idWZbMV0gICAgID0gaHRvbnMoYWNrX251bSk7CisKKyAgICBjb3JlX3VkcF9zZW5kKHNvY2tldCwgYWNrX3BhY2tldF9idWYsIDQpOworfQorCisvKgorICogR2V0IGEgZnJlc2ggcGFja2V0IGlmIHRoZSBidWZmZXIgaXMgZHJhaW5lZCwgYW5kIHdlIGhhdmVuJ3QgaGl0CisgKiBFT0YgeWV0LiAgVGhlIGJ1ZmZlciBzaG91bGQgYmUgZmlsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGRyYWluaW5nIQorICovCitzdGF0aWMgdm9pZCB0ZnRwX2dldF9wYWNrZXQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICB1aW50MTZfdCBsYXN0X3BrdDsKKyAgICBjb25zdCB1aW50OF90ICp0aW1lb3V0X3B0cjsKKyAgICB1aW50OF90IHRpbWVvdXQ7CisgICAgdWludDE2X3QgYnVmZmVyc2l6ZTsKKyAgICB1aW50MTZfdCBzZXJpYWw7CisgICAgamlmZmllc190IG9sZHRpbWU7CisgICAgc3RydWN0IHRmdHBfcGFja2V0ICpwa3QgPSBOVUxMOworICAgIHVpbnQxNl90IGJ1Zl9sZW47CisgICAgc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCA9IFBWVChpbm9kZSk7CisgICAgdWludDE2X3Qgc3JjX3BvcnQ7CisgICAgdWludDMyX3Qgc3JjX2lwOworICAgIGludCBlcnI7CisKKyAgICAvKgorICAgICAqIFN0YXJ0IGJ5IEFDS2luZyB0aGUgcHJldmlvdXMgcGFja2V0OyB0aGlzIHNob3VsZCBjYXVzZQorICAgICAqIHRoZSBuZXh0IHBhY2tldCB0byBiZSBzZW50LgorICAgICAqLworICAgIHRpbWVvdXRfcHRyID0gVGltZW91dFRhYmxlOworICAgIHRpbWVvdXQgPSAqdGltZW91dF9wdHIrKzsKKyAgICBvbGR0aW1lID0gamlmZmllcygpOworCisgYWNrX2FnYWluOgorICAgIGFja19wYWNrZXQoaW5vZGUsIHNvY2tldC0+dGZ0cF9sYXN0cGt0KTsKKworICAgIHdoaWxlICh0aW1lb3V0KSB7CisJYnVmX2xlbiA9IHNvY2tldC0+dGZ0cF9ibGtzaXplICsgNDsKKwllcnIgPSBjb3JlX3VkcF9yZWN2KHNvY2tldCwgc29ja2V0LT50ZnRwX3BrdGJ1ZiwgJmJ1Zl9sZW4sCisJCQkgICAgJnNyY19pcCwgJnNyY19wb3J0KTsKKwlpZiAoZXJyKSB7CisJICAgIGppZmZpZXNfdCBub3cgPSBqaWZmaWVzKCk7CisKKwkgICAgaWYgKG5vdy1vbGR0aW1lID49IHRpbWVvdXQpIHsKKwkJb2xkdGltZSA9IG5vdzsKKwkJdGltZW91dCA9ICp0aW1lb3V0X3B0cisrOworCQlpZiAoIXRpbWVvdXQpCisJCSAgICBicmVhazsKKwkJZ290byBhY2tfYWdhaW47CisJICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworCX0KKworCWlmIChidWZfbGVuIDwgNCkJLyogQmFkIHNpemUgZm9yIGEgREFUQSBwYWNrZXQgKi8KKwkgICAgY29udGludWU7CisKKyAgICAgICAgcGt0ID0gKHN0cnVjdCB0ZnRwX3BhY2tldCAqKShzb2NrZXQtPnRmdHBfcGt0YnVmKTsKKyAgICAgICAgaWYgKHBrdC0+b3Bjb2RlICE9IFRGVFBfREFUQSkgICAgLyogTm90IGEgZGF0YSBwYWNrZXQgKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIElmIGdvZXMgaGVyZSwgcmVjZXZpZSBPSywgYnJlYWsgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogdGltZSBydW5zIG91dCAqLworICAgIGlmICh0aW1lb3V0ID09IDApCisJa2Fib29tKCk7CisKKyAgICBsYXN0X3BrdCA9IHNvY2tldC0+dGZ0cF9sYXN0cGt0OworICAgIGxhc3RfcGt0Kys7CisgICAgc2VyaWFsID0gbnRvaHMocGt0LT5zZXJpYWwpOworICAgIGlmIChzZXJpYWwgIT0gbGFzdF9wa3QpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogV3JvbmcgcGFja2V0LCBBQ0sgdGhlIHBhY2tldCBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgKiBUaGlzIGlzIHByZXN1bWFibHkgYmVjYXVzZSB0aGUgQUNLIGdvdCBsb3N0LAorICAgICAgICAgKiBzbyB0aGUgc2VydmVyIGp1c3QgcmVzZW50IHRoZSBwcmV2aW91cyBwYWNrZXQuCisgICAgICAgICAqLworI2lmIDAKKwlwcmludGYoIldyb25nIHBhY2tldCwgd2FudGVkICUwNHgsIGdvdCAlMDR4XG4iLCBcCisgICAgICAgICAgICAgICBodG9ucyhsYXN0X3BrdCksIGh0b25zKCoodWludDE2X3QgKikoZGF0YSsyKSkpOworI2VuZGlmCisgICAgICAgIGdvdG8gYWNrX2FnYWluOworICAgIH0KKworICAgIC8qIEl0J3MgdGhlIHBhY2tldCB3ZSB3YW50LiAgV2UncmUgYWxzbyBFT0YgaWYgdGhlIHNpemUgPCBibG9ja3NpemUgKi8KKyAgICBzb2NrZXQtPnRmdHBfbGFzdHBrdCA9IGxhc3RfcGt0OyAgICAvKiBVcGRhdGUgbGFzdCBwYWNrZXQgbnVtYmVyICovCisgICAgYnVmZmVyc2l6ZSA9IGJ1Zl9sZW4gLSA0OwkJLyogU2tpcCBURlRQIGhlYWRlciAqLworICAgIHNvY2tldC0+dGZ0cF9kYXRhcHRyID0gc29ja2V0LT50ZnRwX3BrdGJ1ZiArIDQ7CisgICAgc29ja2V0LT50ZnRwX2ZpbGVwb3MgKz0gYnVmZmVyc2l6ZTsKKyAgICBzb2NrZXQtPnRmdHBfYnl0ZXNsZWZ0ID0gYnVmZmVyc2l6ZTsKKyAgICBpZiAoYnVmZmVyc2l6ZSA8IHNvY2tldC0+dGZ0cF9ibGtzaXplKSB7CisgICAgICAgIC8qIGl0J3MgdGhlIGxhc3QgYmxvY2ssIEFDSyBwYWNrZXQgaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgYWNrX3BhY2tldChpbm9kZSwgc2VyaWFsKTsKKworICAgICAgICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3ZSBhcmUgYXQgZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgaW5vZGUtPnNpemUgCQk9IHNvY2tldC0+dGZ0cF9maWxlcG9zOworICAgICAgICBzb2NrZXQtPnRmdHBfZ290ZW9mCT0gMTsKKyAgICAgICAgdGZ0cF9jbG9zZV9maWxlKGlub2RlKTsKKyAgICB9Cit9CisKK2NvbnN0IHN0cnVjdCBweGVfY29ubl9vcHMgdGZ0cF9jb25uX29wcyA9IHsKKyAgICAuZmlsbF9idWZmZXIJPSB0ZnRwX2dldF9wYWNrZXQsCisgICAgLmNsb3NlCQk9IHRmdHBfY2xvc2VfZmlsZSwKK307CisKKy8qKgorICogT3BlbiBhIFRGVFAgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyCisgKgorICogQHBhcmFtOmlub2RlLCB0aGUgaW5vZGUgdG8gc3RvcmUgb3VyIHN0YXRlIGluCisgKiBAcGFyYW06aXAsIHRoZSBpcCB0byBjb250YWN0IHRvIGdldCB0aGUgZmlsZQorICogQHBhcmFtOmZpbGVuYW1lLCB0aGUgZmlsZSB3ZSB3YW5uYSBvcGVuCisgKgorICogQG91dDogb3Blbl9maWxlX3Qgc3RydWN0dXJlLCBzdG9yZXMgaW4gZmlsZS0+b3Blbl9maWxlCisgKiBAb3V0OiB0aGUgbGVuZ2h0IG9mIHRoaXMgZmlsZSwgc3RvcmVzIGluIGZpbGUtPmZpbGVfbGVuCisgKgorICovCit2b2lkIHRmdHBfb3BlbihzdHJ1Y3QgdXJsX2luZm8gKnVybCwgaW50IGZsYWdzLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCSAgICAgICBjb25zdCBjaGFyICoqcmVkaXIpCit7CisgICAgc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCA9IFBWVChpbm9kZSk7CisgICAgY2hhciAqYnVmOworICAgIHVpbnQxNl90IGJ1Zl9sZW47CisgICAgY2hhciAqcDsKKyAgICBjaGFyICpvcHRpb25zOworICAgIGNoYXIgKmRhdGE7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgcnJxX3RhaWxbXSA9ICJvY3RldFwwIiJ0c2l6ZVwwIiIwXDAiImJsa3NpemVcMCIiMTQwOCI7CisgICAgY2hhciBycnFfcGFja2V0X2J1ZlsyKzIqRklMRU5BTUVfTUFYK3NpemVvZiBycnFfdGFpbF07CisgICAgY2hhciByZXBseV9wYWNrZXRfYnVmW1BLVEJVRl9TSVpFXTsKKyAgICBpbnQgZXJyOworICAgIGludCBidWZmZXJzaXplOworICAgIGludCBycnFfbGVuOworICAgIGNvbnN0IHVpbnQ4X3QgICp0aW1lb3V0X3B0cjsKKyAgICBqaWZmaWVzX3QgdGltZW91dDsKKyAgICBqaWZmaWVzX3Qgb2xkdGltZTsKKyAgICB1aW50MTZfdCBvcGNvZGU7CisgICAgdWludDE2X3QgYmxrX251bTsKKyAgICB1aW50NjRfdCBvcGRhdGE7CisgICAgdWludDE2X3Qgc3JjX3BvcnQ7CisgICAgdWludDMyX3Qgc3JjX2lwOworCisgICAgKHZvaWQpcmVkaXI7CQkvKiBURlRQIGRvZXMgbm90IHJlZGlyZWN0ICovCisgICAgKHZvaWQpZmxhZ3M7CisKKyAgICBpZiAodXJsLT50eXBlICE9IFVSTF9PTERfVEZUUCkgeworCS8qCisJICogVGhlIFRGVFAgVVJMIHNwZWNpZmljYXRpb24gYWxsb3dzIHRoZSBURlRQIHRvIGVuZCB3aXRoIGEKKwkgKiA7bW9kZT0gd2hpY2ggd2UganVzdCBpZ25vcmUuCisJICovCisJdXJsX3VuZXNjYXBlKHVybC0+cGF0aCwgJzsnKTsKKyAgICB9CisKKyAgICBpZiAoIXVybC0+cG9ydCkKKwl1cmwtPnBvcnQgPSBURlRQX1BPUlQ7CisKKyAgICBzb2NrZXQtPm9wcyA9ICZ0ZnRwX2Nvbm5fb3BzOworICAgIGlmIChjb3JlX3VkcF9vcGVuKHNvY2tldCkpCisJcmV0dXJuOworCisgICAgYnVmID0gcnJxX3BhY2tldF9idWY7CisgICAgKih1aW50MTZfdCAqKWJ1ZiA9IFRGVFBfUlJROyAgLyogVEZUUCBvcGNvZGUgKi8KKyAgICBidWYgKz0gMjsKKworICAgIGJ1ZiA9IHN0cGNweShidWYsIHVybC0+cGF0aCk7CisKKyAgICBidWYrKzsJCQkvKiBQb2ludCAqcGFzdCogdGhlIGZpbmFsIE5VTEwgKi8KKyAgICBtZW1jcHkoYnVmLCBycnFfdGFpbCwgc2l6ZW9mIHJycV90YWlsKTsKKyAgICBidWYgKz0gc2l6ZW9mIHJycV90YWlsOworCisgICAgcnJxX2xlbiA9IGJ1ZiAtIHJycV9wYWNrZXRfYnVmOworCisgICAgdGltZW91dF9wdHIgPSBUaW1lb3V0VGFibGU7ICAgLyogUmVzZXQgdGltZW91dCAqLworc2VuZHJlcToKKyAgICB0aW1lb3V0ID0gKnRpbWVvdXRfcHRyKys7CisgICAgaWYgKCF0aW1lb3V0KQorCXJldHVybjsJCQkvKiBObyBmaWxlIGF2YWlsYWJsZS4uLiAqLworICAgIG9sZHRpbWUgPSBqaWZmaWVzKCk7CisKKyAgICBjb3JlX3VkcF9zZW5kdG8oc29ja2V0LCBycnFfcGFja2V0X2J1ZiwgcnJxX2xlbiwgdXJsLT5pcCwgdXJsLT5wb3J0KTsKKworICAgIC8qIElmIHRoZSBXUklURSBjYWxsIGZhaWxzLCB3ZSBsZXQgdGhlIHRpbWVvdXQgdGFrZSBjYXJlIG9mIGl0Li4uICovCit3YWl0X3BrdDoKKyAgICBmb3IgKDs7KSB7CisJYnVmX2xlbiA9IHNpemVvZihyZXBseV9wYWNrZXRfYnVmKTsKKworCWVyciA9IGNvcmVfdWRwX3JlY3Yoc29ja2V0LCByZXBseV9wYWNrZXRfYnVmLCAmYnVmX2xlbiwKKwkJCSAgICAmc3JjX2lwLCAmc3JjX3BvcnQpOworCWlmIChlcnIpIHsKKwkgICAgamlmZmllc190IG5vdyA9IGppZmZpZXMoKTsKKwkgICAgaWYgKG5vdyAtIG9sZHRpbWUgPj0gdGltZW91dCkKKwkJIGdvdG8gc2VuZHJlcTsKKwl9IGVsc2UgeworCSAgICAvKiBNYWtlIHN1cmUgdGhlIHBhY2tldCBhY3R1YWxseSBjYW1lIGZyb20gdGhlIHNlcnZlciBhbmQKKwkgICAgICAgaXMgbG9uZyBlbm91Z2ggZm9yIGEgVEZUUCBvcGNvZGUgKi8KKwkgICAgZHByaW50ZigidGZ0cF9vcGVuOiBnb3QgcGFja2V0IGJ1Zmxlbj0lZFxuIiwgYnVmX2xlbik7CisJICAgIGlmICgoc3JjX2lwID09IHVybC0+aXApICYmIChidWZfbGVuID49IDIpKQorCQlicmVhazsKKwl9CisgICAgfQorCisgICAgY29yZV91ZHBfZGlzY29ubmVjdChzb2NrZXQpOworICAgIGNvcmVfdWRwX2Nvbm5lY3Qoc29ja2V0LCBzcmNfaXAsIHNyY19wb3J0KTsKKworICAgIC8qIGZpbGVzaXplIDwtIC0xID09IHVua25vd24gKi8KKyAgICBpbm9kZS0+c2l6ZSA9IC0xOworICAgIHNvY2tldC0+dGZ0cF9ibGtzaXplID0gVEZUUF9CTE9DS1NJWkU7CisgICAgYnVmZmVyc2l6ZSA9IGJ1Zl9sZW4gLSAyOwkgIC8qIGJ5dGVzIGFmdGVyIG9wY29kZSAqLworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIG9wY29kZSB0eXBlLCBhbmQgcGFyc2UgaXQKKyAgICAgKi8KKyAgICBvcGNvZGUgPSAqKHVpbnQxNl90ICopcmVwbHlfcGFja2V0X2J1ZjsKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2UgVEZUUF9FUlJPUjoKKyAgICAgICAgaW5vZGUtPnNpemUgPSAwOworCWdvdG8gZG9uZTsgICAgICAgIC8qIEVSUk9SIHJlcGx5OyBkb24ndCB0cnkgYWdhaW4gKi8KKworICAgIGNhc2UgVEZUUF9EQVRBOgorICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgb3B0aW9ucywgd2UnbGwgZ2V0IGEKKyAgICAgICAgICogREFUQSByZXBseSBpbnN0ZWFkIG9mIE9BQ0suIFN0YXNoIHRoZSBkYXRhIGluIHRoZSBmaWxlCisgICAgICAgICAqIGJ1ZmZlciBhbmQgZ28gd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIG9wdGlvbnMuLi4KKyAgICAgICAgICoKKyAgICAgICAgICogV2UgZ290IGEgREFUQSBwYWNrZXQsIG1lYW5pbmcgbm8gb3B0aW9ucyBhcmUKKyAgICAgICAgICogc3Vwb3J0ZWQuIFNhdmUgdGhlIGRhdGEgYXdheSBhbmQgY29uc2lkZXIgdGhlCisgICAgICAgICAqIGxlbmd0aCB1bmRlZmluZWQsICp1bmxlc3MqIHRoaXMgaXMgdGhlIG9ubHkKKyAgICAgICAgICogZGF0YSBwYWNrZXQuLi4KKyAgICAgICAgICovCisgICAgICAgIGJ1ZmZlcnNpemUgLT0gMjsKKyAgICAgICAgaWYgKGJ1ZmZlcnNpemUgPCAwKQorICAgICAgICAgICAgZ290byB3YWl0X3BrdDsKKyAgICAgICAgZGF0YSA9IHJlcGx5X3BhY2tldF9idWYgKyAyOworICAgICAgICBibGtfbnVtID0gbnRvaHMoKih1aW50MTZfdCAqKWRhdGEpOworICAgICAgICBkYXRhICs9IDI7CisgICAgICAgIGlmIChibGtfbnVtICE9IDEpCisgICAgICAgICAgICBnb3RvIHdhaXRfcGt0OworICAgICAgICBzb2NrZXQtPnRmdHBfbGFzdHBrdCA9IGJsa19udW07CisgICAgICAgIGlmIChidWZmZXJzaXplID4gVEZUUF9CTE9DS1NJWkUpCisgICAgICAgICAgICBnb3RvIGVycl9yZXBseTsJLyogQ29ycnVwdCAqLworCisJc29ja2V0LT50ZnRwX3BrdGJ1ZiA9IG1hbGxvYyhURlRQX0JMT0NLU0laRSArIDQpOworCWlmICghc29ja2V0LT50ZnRwX3BrdGJ1ZikKKwkgICAgZ290byBlcnJfcmVwbHk7CS8qIEludGVybmFsIGVycm9yICovCisKKyAgICAgICAgaWYgKGJ1ZmZlcnNpemUgPCBURlRQX0JMT0NLU0laRSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGZpbmFsIEVPRiBwYWNrZXQsIGFscmVhZHkuLi4KKyAgICAgICAgICAgICAqIFdlIGtub3cgdGhlIGZpbGVzaXplLCBidXQgd2UgYWxzbyB3YW50IHRvCisgICAgICAgICAgICAgKiBhY2sgdGhlIHBhY2tldCBhbmQgc2V0IHRoZSBFT0YgZmxhZy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW5vZGUtPnNpemUgPSBidWZmZXJzaXplOworICAgICAgICAgICAgc29ja2V0LT50ZnRwX2dvdGVvZiA9IDE7CisgICAgICAgICAgICBhY2tfcGFja2V0KGlub2RlLCBibGtfbnVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvY2tldC0+dGZ0cF9ieXRlc2xlZnQgPSBidWZmZXJzaXplOworICAgICAgICBzb2NrZXQtPnRmdHBfZGF0YXB0ciA9IHNvY2tldC0+dGZ0cF9wa3RidWY7CisgICAgICAgIG1lbWNweShzb2NrZXQtPnRmdHBfcGt0YnVmLCBkYXRhLCBidWZmZXJzaXplKTsKKwlnb3RvIGRvbmU7CisKKyAgICBjYXNlIFRGVFBfT0FDSzoKKyAgICAgICAgLyoKKyAgICAgICAgICogTm93IHdlIG5lZWQgdG8gcGFyc2UgdGhlIE9BQ0sgcGFja2V0IHRvIGdldCB0aGUgdHJhbnNmZXIKKyAgICAgICAgICogYW5kIHBhY2tldCBzaXplcy4KKyAgICAgICAgICovCisKKyAgICAgICAgb3B0aW9ucyA9IHJlcGx5X3BhY2tldF9idWYgKyAyOworCXAgPSBvcHRpb25zOworCisJd2hpbGUgKGJ1ZmZlcnNpemUpIHsKKwkgICAgY29uc3QgY2hhciAqb3B0ID0gcDsKKworCSAgICAvKgorCSAgICAgKiBJZiB3ZSBmaW5kIGFuIG9wdGlvbiB3aGljaCBzdGFydHMgd2l0aCBhIE5VTCBieXRlLAorCSAgICAgKiAoYSBudWxsIG9wdGlvbiksIHdlJ3JlIGVpdGhlciBzZWVpbmcgZ2FyYmFnZSB0aGF0IHNvbWUKKwkgICAgICogVEZUUCBzZXJ2ZXJzIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBwYWNrZXQsIG9yIHdlIGhhdmUKKwkgICAgICogbm8gY2x1ZSBob3cgdG8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCAod2hhdCBpcworCSAgICAgKiBhbiBvcHRpb24gbmFtZSBhbmQgd2hhdCBpcyBhIHZhbHVlPykgIEluIGVpdGhlciBjYXNlLAorCSAgICAgKiBkaXNjYXJkIHRoZSByZXN0LgorCSAgICAgKi8KKwkgICAgaWYgKCEqb3B0KQorCQlnb3RvIGRvbmU7CisKKyAgICAgICAgICAgIHdoaWxlIChidWZmZXJzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKCEqcCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CS8qIEZvdW5kIGEgZmluYWwgbnVsbCAqLworICAgICAgICAgICAgICAgICpwKysgfD0gMHgyMDsKKwkJYnVmZmVyc2l6ZS0tOworICAgICAgICAgICAgfQorCSAgICBpZiAoIWJ1ZmZlcnNpemUpCisJCWJyZWFrOwkJLyogVW50ZXJtaW5hdGVkIG9wdGlvbiAqLworCisJICAgIC8qIENvbnN1bWUgdGhlIHRlcm1pbmFsIG51bGwgKi8KKwkgICAgcCsrOworCSAgICBidWZmZXJzaXplLS07CisKKwkgICAgaWYgKCFidWZmZXJzaXplKQorCQlicmVhazsJCS8qIE5vIG9wdGlvbiBkYXRhICovCisKKwkgICAgb3BkYXRhID0gMDsKKworICAgICAgICAgICAgLyogZG8gY29udmVydCBhIG51bWJlci1zdHJpbmcgdG8gZGVjaW1hbCBudW1iZXIsIGp1c3QgbGlrZSBhdG9pICovCisgICAgICAgICAgICB3aGlsZSAoYnVmZmVyc2l6ZS0tKSB7CisJCXVpbnQ4X3QgZCA9ICpwKys7CisgICAgICAgICAgICAgICAgaWYgKGQgPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiBmb3VuZCBhIGZpbmFsIG51bGwgKi8KKwkJZCAtPSAnMCc7CisgICAgICAgICAgICAgICAgaWYgKGQgPiA5KQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycl9yZXBseTsgICAgIC8qIE5vdCBhIGRlY2ltYWwgZGlnaXQgKi8KKyAgICAgICAgICAgICAgICBvcGRhdGEgPSBvcGRhdGEqMTAgKyBkOworICAgICAgICAgICAgfQorCisJICAgIGlmICghc3RyY21wKG9wdCwgInRzaXplIikpCisJCWlub2RlLT5zaXplID0gb3BkYXRhOworCSAgICBlbHNlIGlmICghc3RyY21wKG9wdCwgImJsa3NpemUiKSkKKwkJc29ja2V0LT50ZnRwX2Jsa3NpemUgPSBvcGRhdGE7CisJICAgIGVsc2UKKwkJZ290byBlcnJfcmVwbHk7IC8qIE5vbi1uZWdvdGl0YXRlZCBvcHRpb24gcmV0dXJuZWQsCisJCQkJICAgbm8gaWRlYSB3aGF0IGl0IG1lYW5zIC4uLiovCisKKworCX0KKworCWlmIChzb2NrZXQtPnRmdHBfYmxrc2l6ZSA8IDY0IHx8IHNvY2tldC0+dGZ0cF9ibGtzaXplID4gUEtUQlVGX1NJWkUpCisJICAgIGdvdG8gZXJyX3JlcGx5OworCisJLyogUGFyc2luZyBzdWNjZXNzZnVsLCBhbGxvY2F0ZSBidWZmZXIgKi8KKwlzb2NrZXQtPnRmdHBfcGt0YnVmID0gbWFsbG9jKHNvY2tldC0+dGZ0cF9ibGtzaXplICsgNCk7CisJaWYgKCFzb2NrZXQtPnRmdHBfcGt0YnVmKQorCSAgICBnb3RvIGVycl9yZXBseTsKKwllbHNlCisJICAgIGdvdG8gZG9uZTsKKworICAgIGRlZmF1bHQ6CisJcHJpbnRmKCJURlRQIHVua25vd24gb3Bjb2RlICVkXG4iLCBudG9ocyhvcGNvZGUpKTsKKwlnb3RvIGVycl9yZXBseTsKKyAgICB9CisKK2Vycl9yZXBseToKKyAgICAvKiBCdWlsZCB0aGUgVEZUUCBlcnJvciBwYWNrZXQgKi8KKyAgICB0ZnRwX2Vycm9yKGlub2RlLCBURlRQX0VPUFRORUcsICJURlRQIHByb3RvY29sIGVycm9yIik7CisgICAgaW5vZGUtPnNpemUgPSAwOworCitkb25lOgorICAgIGlmICghaW5vZGUtPnNpemUpCisJY29yZV91ZHBfY2xvc2Uoc29ja2V0KTsKKworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMvcHhlL3RmdHAuaCBiL2NvcmUvZnMvcHhlL3RmdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRjMjIxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9weGUvdGZ0cC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBDb3B5cmlnaHQgMTk5OS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHRmdHAuaAorICovCisjaWZuZGVmIFBYRV9URlRQX0gKKyNkZWZpbmUgUFhFX1RGVFBfSAorCisvKgorICogVEZUUCBkZWZhdWx0IHBvcnQgbnVtYmVyCisgKi8KKyNkZWZpbmUgVEZUUF9QT1JUCSA2OQorCisvKgorICogVEZUUCBkZWZhdWx0IGJsb2NrIHNpemUKKyAqLworI2RlZmluZSBURlRQX0JMT0NLU0laRV9MRzIgOQorI2RlZmluZSBURlRQX0JMT0NLU0laRSAgKDEgPDwgVEZUUF9CTE9DS1NJWkVfTEcyKQorCisvKgorICogVEZUUCBvcGVyYXRpb24gY29kZXMKKyAqLworI2RlZmluZSBURlRQX1JSUQkgaHRvbnMoMSkJCS8vIFJlYWQgcmVzdAorI2RlZmluZSBURlRQX1dSUQkgaHRvbnMoMikJCS8vIFdyaXRlIHJlc3QKKyNkZWZpbmUgVEZUUF9EQVRBCSBodG9ucygzKQkJLy8gRGF0YSBwYWNrZXQKKyNkZWZpbmUgVEZUUF9BQ0sJIGh0b25zKDQpCQkvLyBBQ0sgcGFja2V0CisjZGVmaW5lIFRGVFBfRVJST1IJIGh0b25zKDUpCQkvLyBFUlJPUiBwYWNrZXQKKyNkZWZpbmUgVEZUUF9PQUNLCSBodG9ucyg2KQkJLy8gT0FDSyBwYWNrZXQKKworLyoKKyAqIFRGVFAgZXJyb3IgY29kZXMKKyAqLworI2RlZmluZSBURlRQX0VVTkRFRgkgaHRvbnMoMCkJCS8vIFVuc3BlY2lmaWVkIGVycm9yCisjZGVmaW5lIFRGVFBfRU5PVEZPVU5ECSBodG9ucygxKQkJLy8gRmlsZSBub3QgZm91bmQKKyNkZWZpbmUgVEZUUF9FQUNDRVNTCSBodG9ucygyKQkJLy8gQWNjZXNzIHZpb2xhdGlvbgorI2RlZmluZSBURlRQX0VOT1NQQUNFCSBodG9ucygzKQkJLy8gRGlzayBmdWxsCisjZGVmaW5lIFRGVFBfRUJBRE9QCSBodG9ucyg0KQkJLy8gSW52YWxpZCBURlRQIG9wZXJhdGlvbgorI2RlZmluZSBURlRQX0VCQURJRAkgaHRvbnMoNSkJCS8vIFVua25vd24gdHJhbnNmZXIKKyNkZWZpbmUgVEZUUF9FRVhJU1RTCSBodG9ucyg2KQkJLy8gRmlsZSBleGlzdHMKKyNkZWZpbmUgVEZUUF9FTk9VU0VSCSBodG9ucyg3KQkJLy8gTm8gc3VjaCB1c2VyCisjZGVmaW5lIFRGVFBfRU9QVE5FRwkgaHRvbnMoOCkJCS8vIE9wdGlvbiBuZWdvdGlhdGlvbiBmYWlsdXJlCisKKyNlbmRpZiAvKiBQWEVfVEZUUF9IICovCmRpZmYgLS1naXQgYS9jb3JlL2ZzL3B4ZS91cmwuaCBiL2NvcmUvZnMvcHhlL3VybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTg0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3B4ZS91cmwuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogdXJsLmgKKyAqLworCisjaWZuZGVmIENPUkVfUFhFX1VSTF9ICisjZGVmaW5lIENPUkVfUFhFX1VSTF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZW51bSB1cmxfdHlwZSB7CisgICAgVVJMX05PUk1BTCwJCQkvKiBJdCBpcyBhIGZ1bGwgVVJMICovCisgICAgVVJMX09MRF9URlRQLAkJLyogSXQncyBhIDo6LXN0eWxlIFRGVFAgcGF0aCAqLworICAgIFVSTF9TVUZGSVgJCQkvKiBQcmVwZW5kIHRoZSBwYXRobmFtZSBwcmVmaXggKi8KK307CisKK3N0cnVjdCB1cmxfaW5mbyB7CisgICAgY2hhciAqc2NoZW1lOworICAgIGNoYXIgKnVzZXI7CisgICAgY2hhciAqcGFzc3dkOworICAgIGNoYXIgKmhvc3Q7CisgICAgdWludDMyX3QgaXA7CQkvKiBQbGFjZWhvbGRlciBmaWVsZCBub3Qgc2V0IGJ5IHBhcnNlX3VybCgpICovCisgICAgdW5zaWduZWQgaW50IHBvcnQ7CisgICAgY2hhciAqcGF0aDsJCQkvKiBJbmNsdWRlcyBxdWVyeSAqLworICAgIGVudW0gdXJsX3R5cGUgdHlwZTsKK307CisKK2VudW0gdXJsX3R5cGUgdXJsX3R5cGUoY29uc3QgY2hhciAqdXJsKTsKK3ZvaWQgcGFyc2VfdXJsKHN0cnVjdCB1cmxfaW5mbyAqdWksIGNoYXIgKnVybCk7CitzaXplX3QgdXJsX2VzY2FwZV91bnNhZmUoY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICppbnB1dCwgc2l6ZV90IGJ1ZnNpemUpOworY2hhciAqdXJsX3VuZXNjYXBlKGNoYXIgKmJ1ZmZlciwgY2hhciB0ZXJtaW5hdG9yKTsKKworI2VuZGlmIC8qIENPUkVfUFhFX1VSTF9IICovCmRpZmYgLS1naXQgYS9jb3JlL2ZzL3B4ZS91cmxwYXJzZS5jIGIvY29yZS9mcy9weGUvdXJscGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjczZGRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy9weGUvdXJscGFyc2UuYwpAQCAtMCwwICsxLDIyMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogdXJscGFyc2UuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInVybC5oIgorCisvKgorICogUmV0dXJuIHRoZSB0eXBlIG9mIGEgVVJMIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBzdHJpbmcKKyAqLworZW51bSB1cmxfdHlwZSB1cmxfdHlwZShjb25zdCBjaGFyICp1cmwpCit7CisgICAgY29uc3QgY2hhciAqcTsKKworICAgIHEgPSBzdHJjaHIodXJsLCAnOicpOworICAgIGlmICghcSkKKwlyZXR1cm4gVVJMX1NVRkZJWDsKKworICAgIGlmIChxWzFdID09ICcvJyAmJiBxWzJdID09ICcvJykKKwlyZXR1cm4gVVJMX05PUk1BTDsKKworICAgIGlmIChxWzFdID09ICc6JykKKwlyZXR1cm4gVVJMX09MRF9URlRQOworCisgICAgcmV0dXJuIFVSTF9TVUZGSVg7Cit9CisKKy8qCisgKiBEZWNvbXBvc2UgYSBVUkwgaW50byBpdHMgY29tcG9uZW50cy4gIFRoaXMgaXMgZG9uZSBpbi1wbGFjZTsKKyAqIHRoaXMgcm91dGluZSBkb2VzIG5vdCBhbGxvY2F0ZSBhbnkgYWRkaXRpb25hbCBzdG9yYWdlLiAgRnJlZWluZyB0aGUKKyAqIG9yaWdpbmFsIGJ1ZmZlciBmcmVlcyBhbGwgc3RvcmFnZSB1c2VkLgorICovCit2b2lkIHBhcnNlX3VybChzdHJ1Y3QgdXJsX2luZm8gKnVpLCBjaGFyICp1cmwpCit7CisgICAgY2hhciAqcCA9IHVybDsKKyAgICBjaGFyICpxLCAqciwgKnM7CisgICAgaW50IGM7CisKKyAgICBtZW1zZXQodWksIDAsIHNpemVvZiAqdWkpOworCisgICAgcSA9IHN0cmNocihwLCAnOicpOworICAgIGlmIChxICYmIChxWzFdID09ICcvJyAmJiBxWzJdID09ICcvJykpIHsKKwl1aS0+dHlwZSA9IFVSTF9OT1JNQUw7CisJCisJdWktPnNjaGVtZSA9IHA7CisJKnEgPSAnXDAnOworCXAgPSBxKzM7CisJCisJcSA9IHN0cmNocihwLCAnLycpOworCWlmIChxKSB7CisJICAgICpxID0gJ1wwJzsKKwkgICAgdWktPnBhdGggPSBxKzE7CisJICAgIHEgPSBzdHJjaHIocSsxLCAnIycpOworCSAgICBpZiAocSkKKwkJKnEgPSAnXDAnOworCX0gZWxzZSB7CisJICAgIHVpLT5wYXRoID0gIiI7CisJfQorCQorCXIgPSBzdHJjaHIocCwgJ0AnKTsKKwlpZiAocikgeworCSAgICB1aS0+dXNlciA9IHA7CisJICAgICpyID0gJ1wwJzsKKwkgICAgcyA9IHN0cmNocihwLCAnOicpOworCSAgICBpZiAocykgeworCQkqcyA9ICdcMCc7CisJCXVpLT5wYXNzd2QgPSBzKzE7CisJICAgIH0KKwkgICAgcCA9IHIrMTsKKwl9CisJCisJdWktPmhvc3QgPSBwOworCXIgPSBzdHJjaHIocCwgJzonKTsKKwlpZiAocikgeworCSAgICAqcisrID0gJ1wwJzsKKwkgICAgdWktPnBvcnQgPSAwOworCSAgICB3aGlsZSAoKGMgPSAqcisrKSkgeworCQljIC09ICcwJzsKKwkJaWYgKGMgPiA5KQorCQkgICAgYnJlYWs7CisJCXVpLT5wb3J0ID0gdWktPnBvcnQgKiAxMCArIGM7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIGlmIChxICYmIHFbMV0gPT0gJzonKSB7CisJKnEgPSAnXDAnOworCXVpLT5zY2hlbWUgPSAidGZ0cCI7CisJdWktPmhvc3QgPSBwOworCXVpLT5wYXRoID0gcSsyOworCXVpLT50eXBlID0gVVJMX09MRF9URlRQOworICAgIH0gZWxzZSB7CisJdWktPnBhdGggPSBwOworCXVpLT50eXBlID0gVVJMX1NVRkZJWDsKKyAgICB9Cit9CisKKy8qCisgKiBFc2NhcGVzIHVuc2FmZSBjaGFyYWN0ZXJzIGluIGEgVVJMLgorICogVGhpcyBkb2VzICpub3QqIGVzY2FwZSB0aGluZ3MgbGlrZSBxdWVyeSBjaGFyYWN0ZXJzIQorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHRvdGFsIG91dHB1dC4KKyAqLworc2l6ZV90IHVybF9lc2NhcGVfdW5zYWZlKGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqaW5wdXQsIHNpemVfdCBidWZzaXplKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyIHVjaGV4Y2hhcltdID0gIjAxMjM0NTY3ODlBQkNERUYiOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGNoYXIgKnE7CisgICAgc2l6ZV90IG4gPSAwOworCisgICAgcSA9IG91dHB1dDsKKyAgICBmb3IgKHAgPSBpbnB1dDsgKGMgPSAqcCk7IHArKykgeworCWlmIChjIDw9ICcgJyB8fCBjID4gJ34nKSB7CisJICAgIGlmICgrK24gPCBidWZzaXplKSAqcSsrID0gJyUnOworCSAgICBpZiAoKytuIDwgYnVmc2l6ZSkgKnErKyA9IHVjaGV4Y2hhcltjID4+IDRdOworCSAgICBpZiAoKytuIDwgYnVmc2l6ZSkgKnErKyA9IHVjaGV4Y2hhcltjICYgMTVdOworCX0gZWxzZSB7CisJICAgIGlmICgrK24gPCBidWZzaXplKSAqcSsrID0gYzsKKwl9CisgICAgfQorCisgICAgKnEgPSAnXDAnOworICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW50IGhleGRpZ2l0KGNoYXIgYykKK3sKKyAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJcmV0dXJuIGMgLSAnMCc7CisgICAgYyB8PSAweDIwOworICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwlyZXR1cm4gYyAtICdhJyArIDEwOworICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqIFVuZXNjYXBlcyBhIGJ1ZmZlciwgb3B0aW9uYWxseSBlbmRpbmcgYXQgYW4gKnVuZXNjYXBlZCogdGVybWluYXRvcgorICogKGxpa2UgOyBmb3IgVEZUUCkuICBUaGUgdW5lc2NhcGluZyBpcyBkb25lIGluLXBsYWNlLgorICoKKyAqIElmIGEgdGVybWluYXRvciBpcyByZWFjaGVkLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAqIGFmdGVyIHRoZSB0ZXJtaW5hdG9yLgorICovCitjaGFyICp1cmxfdW5lc2NhcGUoY2hhciAqYnVmZmVyLCBjaGFyIHRlcm1pbmF0b3IpCit7CisgICAgY2hhciAqcCA9IGJ1ZmZlcjsKKyAgICBjaGFyICpxID0gYnVmZmVyOworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBpbnQgeCwgeTsKKworICAgIHdoaWxlICgoYyA9ICpwKSkgeworCWlmIChjID09IHRlcm1pbmF0b3IpIHsKKwkgICAgKnEgPSAnXDAnOworCSAgICByZXR1cm4gcDsKKwl9CisJcCsrOworCWlmIChjID09ICclJykgeworCSAgICB4ID0gaGV4ZGlnaXQocFswXSk7CisJICAgIGlmICh4ID49IDApIHsKKwkJeSA9IGhleGRpZ2l0KHBbMV0pOworCQlpZiAoeSA+PSAwKSB7CisJCSAgICAqcSsrID0gKHggPDwgNCkgKyB5OworCQkgICAgcCArPSAyOworCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorCX0KKwkqcSsrID0gYzsKKyAgICB9CisgICAgKnEgPSAnXDAnOworICAgIHJldHVybiBOVUxMOworfQorCisjaWZkZWYgVVJMX1RFU1QKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgdXJsX2luZm8gdXJsOworCisgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCXBhcnNlX3VybCgmdXJsLCBhcmd2W2ldKTsKKwlwcmludGYoInNjaGVtZTogICVzXG4iCisJICAgICAgICJ1c2VyOiAgICAlc1xuIgorCSAgICAgICAicGFzc3dkOiAgJXNcbiIKKwkgICAgICAgImhvc3Q6ICAgICVzXG4iCisJICAgICAgICJwb3J0OiAgICAlZFxuIgorCSAgICAgICAicGF0aDogICAgJXNcbiIKKwkgICAgICAgInR5cGU6ICAgICVkXG4iLAorCSAgICAgICB1cmwuc2NoZW1lLCB1cmwudXNlciwgdXJsLnBhc3N3ZCwgdXJsLmhvc3QsIHVybC5wb3J0LAorCSAgICAgICB1cmwucGF0aCwgdXJsLnR5cGUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZnMvcmVhZGRpci5jIGIvY29yZS9mcy9yZWFkZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2YTcwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMvcmVhZGRpci5jCkBAIC0wLDAgKzEsNTggQEAKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2RpcmVudC5oPgorI2luY2x1ZGUgImZzLmgiCisjaW5jbHVkZSAiY29yZS5oIgorCisvKiAKKyAqIE9wZW4gYSBkaXJlY3RvcnkKKyAqLworX19leHBvcnQgRElSICpvcGVuZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgaW50IHJ2OworICAgIHN0cnVjdCBmaWxlICpmaWxlOworCisgICAgcnYgPSBzZWFyY2hkaXIocGF0aCwgT19SRE9OTFl8T19ESVJFQ1RPUlkpOworICAgIGlmIChydiA8IDApCisJcmV0dXJuIE5VTEw7CisKKyAgICBmaWxlID0gaGFuZGxlX3RvX2ZpbGUocnYpOworCisgICAgaWYgKGZpbGUtPmlub2RlLT5tb2RlICE9IERUX0RJUikgeworCV9jbG9zZV9maWxlKGZpbGUpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoRElSICopZmlsZTsKK30KKworLyoKKyAqIFJlYWQgb25lIGRpcmVjdG9yeSBlbnRyeSBhdCBvbmUgdGltZS4gCisgKi8KK19fZXhwb3J0IHN0cnVjdCBkaXJlbnQgKnJlYWRkaXIoRElSICpkaXIpCit7CisgICAgc3RhdGljIHN0cnVjdCBkaXJlbnQgYnVmOworICAgIHN0cnVjdCBmaWxlICpkZF9kaXIgPSAoc3RydWN0IGZpbGUgKilkaXI7CisgICAgaW50IHJ2ID0gLTE7CisgICAgCisgICAgaWYgKGRkX2RpcikgeworICAgICAgICBpZiAoZGRfZGlyLT5mcy0+ZnNfb3BzLT5yZWFkZGlyKSB7CisJICAgIHJ2ID0gZGRfZGlyLT5mcy0+ZnNfb3BzLT5yZWFkZGlyKGRkX2RpciwgJmJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcnYgPCAwID8gTlVMTCA6ICZidWY7Cit9CisKKy8qCisgKiBDbG9zZSBhIGRpcmVjdG9yeQorICovCitfX2V4cG9ydCBpbnQgY2xvc2VkaXIoRElSICpkaXIpCit7CisgICAgc3RydWN0IGZpbGUgKmRkX2RpciA9IChzdHJ1Y3QgZmlsZSAqKWRpcjsKKyAgICBfY2xvc2VfZmlsZShkZF9kaXIpOworICAgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2NvcmUvZnMvdWZzL2JtYXAuYyBiL2NvcmUvZnMvdWZzL2JtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDg0OTBmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy91ZnMvYm1hcC5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJhcGhhZWwgUy4gQ2FydmFsaG8gPHJhcGhhZWwuc2NhcnZAZ21haWwuY29tPgorICoKKyAqIFBhcnRpYWxseSB0YWtlbiBmcm9tIGZzL2V4dDIvYm1hcC5jCisgKiBUaGlzIGZpbGUgd2FzIG1vZGlmaWVkIGFjY29yZGluZyBVRlMxLzIgbmVlZHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IExpdSBBbGVheGFuZGVyIC0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgZmlsZQorICogbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8ZGlzay5oPgorI2luY2x1ZGUgPGNhY2hlLmg+CisjaW5jbHVkZSAidWZzLmgiCisKKy8qCisgKiBDb3B5IGJsayBhZGRyZXNzIGludG8gYnVmZmVyLCB0aGlzIHdhcyBuZWVkZWQgc2luY2UgVUZTMS8yIGFkZHIgc2l6ZQorICogaW4gYmxrIG1hcHMgZGlmZmVycyBmcm9tIGVhY2ggb3RoZXIgKDMyLzY0IGJpdHMgcmVzcGVjdGl2ZWxseSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QKK2dldF9ibGthZGRyIChjb25zdCB1aW50OF90ICpibGssIHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCBzaGlmdCkKK3sKKyAgICB1aW50NjRfdCBhZGRyID0gMDsKKworICAgIG1lbWNweSgodWludDhfdCAqKSAmYWRkciwKKwkgICAodWludDhfdCAqKSBibGsgKyAoaW5kZXggPDwgc2hpZnQpLAorCSAgICAxIDw8IHNoaWZ0KTsKKworICAgIHJldHVybiBhZGRyOworfQorCisvKgorICogU2NhbiBmb3J3YXJkIGluIGEgcmFuZ2Ugb2YgYmxvY2tzIHRvIHNlZSBpZiB0aGV5IGFyZSBjb250aWd1b3VzLAorICogdGhlbiByZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUuCisgKi8KK3N0YXRpYyB1aW50NjRfdAorc2Nhbl9zZXRfbmJsb2Nrcyhjb25zdCB1aW50OF90ICptYXAsIHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCBhZGRyX3NoaWZ0LAorCQkgIHVuc2lnbmVkIGludCBjb3VudCwgc2l6ZV90ICpuYmxvY2tzKQoreworICAgIHVpbnQ2NF90IGFkZHI7CisgICAgdWludDY0X3QgYmxrID0gZ2V0X2Jsa2FkZHIobWFwLCBpbmRleCwgYWRkcl9zaGlmdCk7CisKKyAgICAvKgorICAgICAqIEJsb2NrIHNwYW5zIDggZnJhZ21lbnRzLCB0aGVuIGFkZHJlc3MgaXMgaW50ZXJsZWF2ZWQgYnkgOC4KKyAgICAgKiBUaGlzIGNvZGUgd29ya3MgZm9yIGVpdGhlciAzMi82NCBzaXplZCBhZGRyZXNzZXMuCisgICAgICovCisgICAgaWYgKG5ibG9ja3MpIHsKKwl1aW50MzJfdCBza2lwID0gYmxrID8gRlJBR01FTlRTX1BFUl9CTEsgOiAwOworCXVpbnQzMl90IG5leHQgPSBibGsgKyBza2lwOworCXNpemVfdCAgIGNudCA9IDE7CisKKwkvKiBHZXQgYWRkcmVzcyBvZiBzdGFydGluZyBibGsgcG9pbnRlciAqLworCW1hcCArPSAoaW5kZXggPDwgYWRkcl9zaGlmdCk7CisKKwl1ZnNfZGVidWcoIltzY2FuXSBzdGFydCBibGs6ICV1XG4iLCBibGspOworCXVmc19kZWJ1ZygiW3NjYW5dIGNvdW50IChuciBvZiBibGtzKTogJXVcbiIsIGNvdW50KTsKKwkvKiBHbyB1cCB0byB0aGUgZW5kIG9mIGJsayBtYXAgKi8KKwl3aGlsZSAoLS1jb3VudCkgeworCSAgICBtYXAgKz0gMSA8PCBhZGRyX3NoaWZ0OworCSAgICBhZGRyID0gZ2V0X2Jsa2FkZHIobWFwLCAwLCBhZGRyX3NoaWZ0KTsKKyNpZiAwCisJICAgIC8qIEV4dHJhIGRlYnVnZ2luZyBpbmZvIChUb28gbXVjaCBwcmludHMpICovCisJICAgIHVmc19kZWJ1ZygiW3NjYW5dIGFkZHI6ICV1IG5leHQ6ICV1XG4iLCBhZGRyLCBuZXh0KTsKKyNlbmRpZgorCSAgICBpZiAoYWRkciA9PSBuZXh0KSB7CisJCWNudCsrOworCQluZXh0ICs9IHNraXA7CisJICAgIH0gZWxzZSB7CisJCWJyZWFrOworCSAgICB9CisJfQorCSpuYmxvY2tzID0gY250OworCXVmc19kZWJ1ZygiW3NjYW5dIG5ibG9ja3M6ICV1XG4iLCBjbnQpOworCXVmc19kZWJ1ZygiW3NjYW5dIGVuZCBibGs6ICV1XG4iLCBuZXh0IC0gRlJBR01FTlRTX1BFUl9CTEspOworICAgIH0KKworICAgIHJldHVybiBibGs7Cit9CisKKy8qCisgKiBUaGUgYWN0dWFsIGluZGlyZWN0IGJsb2NrIG1hcCBoYW5kbGluZyAtIHRoZSBibG9jayBwYXNzZWQgaW4gc2hvdWxkCisgKiBiZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJ0aWN1bGFyIGJsb2NrIGhpZXJhcmNoeS4KKyAqCisgKiBAc2hmdF9wZXJfYmxrOiBzaGlmdCB0byBnZXQgbnIuIG9mIGFkZHJlc3NlcyBpbiBhIGJsb2NrLgorICogQG1hc2tfcGVyX2JsazogbWFzayB0byBsaW1pdCB0aGUgbWF4IG5yLiBvZiBhZGRyZXNzZXMgaW4gYSBibG9jay4KKyAqIEBhZGRyX2NvdW50OiAgIG5yLiBvZiBhZGRyZXNzZXMgaW4gYSBibG9jay4KKyAqLworc3RhdGljIHVpbnQ2NF90CitibWFwX2luZGlyZWN0KHN0cnVjdCBmc19pbmZvICpmcywgdWludDY0X3Qgc3RhcnQsIHVpbnQzMl90IGJsb2NrLAorCSAgICAgIGludCBsZXZlbHMsIHNpemVfdCAqbmJsb2NrcykKK3sKKyAgICB1aW50MzJfdCBzaGZ0X3Blcl9ibGsgPSBmcy0+YmxvY2tfc2hpZnQgLSBVRlNfU0IoZnMpLT5hZGRyX3NoaWZ0OworICAgIHVpbnQzMl90IGFkZHJfY291bnQgPSAoMSA8PCBzaGZ0X3Blcl9ibGspOworICAgIHVpbnQzMl90IG1hc2tfcGVyX2JsayA9IGFkZHJfY291bnQgLSAxOworICAgIGNvbnN0IHVpbnQ4X3QgKmJsayA9IE5VTEw7CisgICAgdWludDMyX3QgaW5kZXggPSAwOworCisgICAgd2hpbGUgKGxldmVscy0tKSB7CisJaWYgKCFzdGFydCkgeworCSAgICBpZiAobmJsb2NrcykKKwkJKm5ibG9ja3MgPSBhZGRyX2NvdW50IDw8IChsZXZlbHMgKiBzaGZ0X3Blcl9ibGspOworCSAgICByZXR1cm4gMDsKKwl9CisKKwlibGsgPSBnZXRfY2FjaGUoZnMtPmZzX2RldiwgZnJhZ190b19ibGsoZnMsIHN0YXJ0KSk7CisJaW5kZXggPSAoYmxvY2sgPj4gKGxldmVscyAqIHNoZnRfcGVyX2JsaykpICYgbWFza19wZXJfYmxrOworCXN0YXJ0ID0gZ2V0X2Jsa2FkZHIoYmxrLCBpbmRleCwgVUZTX1NCKGZzKS0+YWRkcl9zaGlmdCk7CisgICAgfQorCisgICAgcmV0dXJuIHNjYW5fc2V0X25ibG9ja3MoYmxrLCBpbmRleCwgVUZTX1NCKGZzKS0+YWRkcl9zaGlmdCwKKwkJCSAgICBhZGRyX2NvdW50IC0gaW5kZXgsIG5ibG9ja3MpOworfQorCisvKgorICogSGFuZGxlIHRoZSB0cmFkaXRpb25hbCBibG9jayBtYXAsIGxpa2UgaW5kaXJlY3QsIGRvdWJsZSBpbmRpcmVjdAorICogYW5kIHRyaXBsZSBpbmRpcmVjdAorICovCit1aW50NjRfdCB1ZnNfYm1hcCAoc3RydWN0IGlub2RlICppbm9kZSwgYmxvY2tfdCBibG9jaywgc2l6ZV90ICpuYmxvY2tzKQoreworICAgIHVpbnQzMl90IHNoZnRfcGVyX2JsaywgcHRyc19wZXJfYmxrOworICAgIHN0YXRpYyB1aW50MzJfdCBpbmRpcl9ibGtzLCBkb3VibGVfYmxrcywgdHJpcGxlX2Jsa3M7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gaW5vZGUtPmZzOworCisgICAgLyogSW5pdGlhbGl6ZSBzdGF0aWMgdmFsdWVzICovCisgICAgaWYgKCFpbmRpcl9ibGtzKSB7CisJc2hmdF9wZXJfYmxrID0gZnMtPmJsb2NrX3NoaWZ0IC0gVUZTX1NCKGZzKS0+YWRkcl9zaGlmdDsKKwlwdHJzX3Blcl9ibGsgPSBmcy0+YmxvY2tfc2l6ZSA+PiBVRlNfU0IoZnMpLT5hZGRyX3NoaWZ0OworCisJaW5kaXJfYmxrcyA9IHB0cnNfcGVyX2JsazsKKwlkb3VibGVfYmxrcyA9IHB0cnNfcGVyX2JsayA8PCBzaGZ0X3Blcl9ibGs7CisJdHJpcGxlX2Jsa3MgPSBkb3VibGVfYmxrcyA8PCBzaGZ0X3Blcl9ibGs7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBkaXJlY3QgYmxvY2tzCisgICAgICogKFVGUzJfQUREUl9TSElGVCkgaXMgYWxzbyB1c2VkIGZvciBVRlMxIGJlY2F1c2UgaXRzIGRpcmVjdCBwdHIgYXJyYXkKKyAgICAgKiB3YXMgZXh0ZW5kZWQgdG8gNjQgYml0cy4KKyAgICAgKi8KKyAgICBpZiAoYmxvY2sgPCBVRlNfRElSRUNUX0JMT0NLUykKKwlyZXR1cm4gc2Nhbl9zZXRfbmJsb2NrcygodWludDhfdCAqKSBQVlQoaW5vZGUpLT5kaXJlY3RfYmxrX3B0ciwKKwkJCQlibG9jaywgVUZTMl9BRERSX1NISUZULAorCQkJCVVGU19ESVJFQ1RfQkxPQ0tTIC0gYmxvY2ssIG5ibG9ja3MpOworCisgICAgLyogaW5kaXJlY3QgYmxvY2tzICovCisgICAgYmxvY2sgLT0gVUZTX0RJUkVDVF9CTE9DS1M7CisgICAgaWYgKGJsb2NrIDwgaW5kaXJfYmxrcykKKwlyZXR1cm4gYm1hcF9pbmRpcmVjdChmcywgUFZUKGlub2RlKS0+aW5kaXJlY3RfYmxrX3B0ciwKKwkJCSAgICAgYmxvY2ssIDEsIG5ibG9ja3MpOworCisgICAgLyogZG91YmxlIGluZGlyZWN0IGJsb2NrcyAqLworICAgIGJsb2NrIC09IGluZGlyX2Jsa3M7CisgICAgaWYgKGJsb2NrIDwgZG91YmxlX2Jsa3MpCisJcmV0dXJuIGJtYXBfaW5kaXJlY3QoZnMsIFBWVChpbm9kZSktPmRvdWJsZV9pbmRpcmVjdF9ibGtfcHRyLAorCQkJICAgICBibG9jaywgMiwgbmJsb2Nrcyk7CisKKyAgICAvKiB0cmlwbGUgaW5kaXJlY3QgYmxvY2tzICovCisgICAgYmxvY2sgLT0gZG91YmxlX2Jsa3M7CisgICAgaWYgKGJsb2NrIDwgdHJpcGxlX2Jsa3MpCisJcmV0dXJuIGJtYXBfaW5kaXJlY3QoZnMsIFBWVChpbm9kZSktPnRyaXBsZV9pbmRpcmVjdF9ibGtfcHRyLAorCQkJICAgICBibG9jaywgMywgbmJsb2Nrcyk7CisKKyAgICAvKiBUaGlzIGNhbid0IGhhcHBlbi4uLiAqLworICAgIHJldHVybiAwOworfQorCisvKgorICogTmV4dCBleHRlbnQgZm9yIGdldGZzc2VjCisgKiAiUmVtYWluaW5nIHNlY3RvcnMiIG1lYW5zIChsc3RhcnQgJiBibGttYXNrKS4KKyAqLworaW50IHVmc19uZXh0X2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1aW50MzJfdCBsc3RhcnQpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gaW5vZGUtPmZzOworICAgIGludCBibGt0b3NlYyA9ICBCTE9DS19TSElGVChmcykgLSBTRUNUT1JfU0hJRlQoZnMpOworICAgIGludCBmcmFnX3NoaWZ0ID0gQkxPQ0tfU0hJRlQoZnMpIC0gVUZTX1NCKGZzKS0+Y19ibGtfZnJhZ19zaGlmdDsKKyAgICBpbnQgYmxrbWFzayA9ICgxIDw8IGJsa3Rvc2VjKSAtIDE7CisgICAgYmxvY2tfdCBibG9jazsKKyAgICBzaXplX3QgbmJsb2NrcyA9IDA7CisKKyAgICB1ZnNfZGVidWcoInVmc19uZXh0X2V4dGVudDpcbiIpOworICAgIGJsb2NrID0gdWZzX2JtYXAoaW5vZGUsIGxzdGFydCA+PiBibGt0b3NlYywgJm5ibG9ja3MpOworICAgIHVmc19kZWJ1ZygiYmxrOiAldVxuIiwgYmxvY2spOworCisgICAgaWYgKCFibG9jaykgLy8gU3BhcnNlIGJsb2NrCisJaW5vZGUtPm5leHRfZXh0ZW50LnBzdGFydCA9IEVYVEVOVF9aRVJPOworICAgIGVsc2UKKwkvKgorCSAqIENvbnZlcnQgYmxrIGludG8gc2VjdCBhZGRyIGFuZCBhZGQgdGhlIHJlbWFpbmluZworCSAqIHNlY3RvcnMgaW50byBwc3RhcnQgKHNlY3RvciBzdGFydCBhZGRyZXNzKS4KKwkgKi8KKwlpbm9kZS0+bmV4dF9leHRlbnQucHN0YXJ0ID0KKwkgICAgKChzZWN0b3JfdCkgKGJsb2NrIDw8IChmcmFnX3NoaWZ0IC0gU0VDVE9SX1NISUZUKGZzKSkpKSB8CisJICAgIChsc3RhcnQgJiBibGttYXNrKTsKKworICAgIC8qCisgICAgICogU3VidHJhY3QgdGhlIHJlbWFpbmluZyBzZWN0b3JzIGZyb20gbGVuIHNpbmNlIHRoZXNlIHNlY3RvcnMKKyAgICAgKiB3ZXJlIGFkZGVkIHRvIHBzdGFydCAoc2VjdG9yIHN0YXJ0IGFkZHJlc3MpLgorICAgICAqLworICAgIGlub2RlLT5uZXh0X2V4dGVudC5sZW4gPSAobmJsb2NrcyA8PCBibGt0b3NlYykgLSAobHN0YXJ0ICYgYmxrbWFzayk7CisgICAgcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9mcy91ZnMvdWZzLmMgYi9jb3JlL2ZzL3Vmcy91ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VmMjhmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy91ZnMvdWZzLmMKQEAgLTAsMCArMSw0ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmFwaGFlbCBTLiBDYXJ2YWxobyA8cmFwaGFlbC5zY2FydkBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvZGlyZW50Lmg+CisjaW5jbHVkZSA8Y2FjaGUuaD4KKyNpbmNsdWRlIDxkaXNrLmg+CisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAidWZzLmgiCisKKy8qCisgKiBSZWFkIHRoZSBzdXBlciBibG9jayBhbmQgY2hlY2sgbWFnaWMgZmllbGRzIGJhc2VkIG9uCisgKiBwYXNzZWQgcGFyYW1hdGVycy4KKyAqLworc3RhdGljIGJvb2wKK2RvX2NoZWNrc2Ioc3RydWN0IHVmc19zdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBkaXNrICpkaXNrLAorCSAgICBjb25zdCB1aW50MzJfdCBzYmxvY2tfb2ZmLCBjb25zdCB1aW50MzJfdCB1ZnNfc21hZ2ljKQoreworICAgIHVpbnQzMl90IGxiYTsKKyAgICBzdGF0aWMgdWludDMyX3QgY291bnQ7CisKKyAgICAvKiBIb3cgbWFueSBzZWN0b3JzIGFyZSBuZWVkZWQgdG8gZmlsbCBzYiBzdHJ1Y3QgKi8KKyAgICBpZiAoIWNvdW50KQorCWNvdW50ID0gc2l6ZW9mICpzYiA+PiBkaXNrLT5zZWN0b3Jfc2hpZnQ7CisgICAgLyogR2V0IGxiYSBhZGRyZXNzIGJhc2VkIG9uIHNlY3RvciBzaXplIG9mIGRpc2sgKi8KKyAgICBsYmEgPSBzYmxvY2tfb2ZmID4+IChkaXNrLT5zZWN0b3Jfc2hpZnQpOworICAgIC8qIFJlYWQgc3VwZXIgYmxvY2sgKi8KKyAgICBkaXNrLT5yZHdyX3NlY3RvcnMoZGlzaywgc2IsIGxiYSwgY291bnQsIDApOworCisgICAgaWYgKHNiLT5tYWdpYyA9PSB1ZnNfc21hZ2ljKQorCXJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKgorICogR28gdGhyb3VnaCBhbGwgcG9zc2libGUgdWZzIHN1cGVyYmxvY2sgb2Zmc2V0cy4KKyAqIFRPRE86IEFkZCBVRlMgc3VwcG9ydCB0byByZW1vdmFibGUgbWVkaWEgKHNiIG9mZnNldDogMCkuCisgKi8KK3N0YXRpYyBpbnQKK3Vmc19jaGVja3NiKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGlzayAqZGlzaykKK3sKKyAgICAvKiBDaGVjayBmb3IgVUZTMSBzYiAqLworICAgIGlmIChkb19jaGVja3NiKHNiLCBkaXNrLCBVRlMxX1NCTE9DS19PRkZTRVQsIFVGUzFfU1VQRVJfTUFHSUMpKQorCXJldHVybiBVRlMxOworICAgIC8qIENoZWNrIGZvciBVRlMyIHNiICovCisgICAgaWYgKGRvX2NoZWNrc2Ioc2IsIGRpc2ssIFVGUzJfU0JMT0NLX09GRlNFVCwgVUZTMl9TVVBFUl9NQUdJQykpCisJcmV0dXJuIFVGUzI7CisgICAgLyogVUZTMiBtYXkgYWxzbyBleGlzdCBpbiAyNTZrLSwgYnV0IHRoaXMgaXNuJ3QgdGhlIGRlZmF1bHQgKi8KKyAgICBpZiAoZG9fY2hlY2tzYihzYiwgZGlzaywgVUZTMl9TQkxPQ0syX09GRlNFVCwgVUZTMl9TVVBFUl9NQUdJQykpCisJcmV0dXJuIFVGUzJfUElHR1k7CisKKyAgICByZXR1cm4gTk9ORTsKK30KKworLyoKKyAqIGxibG9jayBzdGFuZHMgZm9yIGxpbmVhciBibG9jayBhZGRyZXNzLAorICogd2hlcmVhcyBwYmxvY2sgaXMgdGhlIGFjdHVhbCBibGsgcHRyIHRvIGdldCBkYXRhIGZyb20uCisgKgorICogVUZTMS8yIHVzZSBmcmFnIGFkZHJzIHJhdGhlciB0aGFuIGJsayBvbmVzLCB0aGVuCisgKiB0aGUgb2Zmc2V0IGludG8gdGhlIGJsb2NrIG11c3QgYmUgY2FsY3VsYXRlZC4KKyAqLworc3RhdGljIGNvbnN0IHZvaWQgKgordWZzX2dldF9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBibG9ja190IGxibG9jaykKK3sKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IGlub2RlLT5mczsKKyAgICBzdHJ1Y3QgdWZzX3NiX2luZm8gKnNiID0gVUZTX1NCKGlub2RlLT5mcyk7CisgICAgdWludDY0X3QgZnJhZ19hZGRyLCBmcmFnX29mZnNldDsKKyAgICB1aW50MzJfdCBmcmFnX3NoaWZ0OworICAgIGJsb2NrX3QgcGJsb2NrOworCisgICAgZnJhZ19hZGRyID0gdWZzX2JtYXAoaW5vZGUsIGxibG9jaywgTlVMTCk7CisgICAgaWYgKCFmcmFnX2FkZHIpCisJcmV0dXJuIE5VTEw7CisKKyAgICBmcmFnX3NoaWZ0ID0gZnMtPmJsb2NrX3NoaWZ0IC0gc2ItPmNfYmxrX2ZyYWdfc2hpZnQ7CisgICAgLyogR2V0IGZyYWdtZW50IGJ5dGUgYWRkcmVzcyAqLworICAgIGZyYWdfb2Zmc2V0ID0gZnJhZ19hZGRyIDw8IGZyYWdfc2hpZnQ7CisgICAgLyogQ29udmVydCBmcmFnIGFkZHIgdG8gYmxrIGFkZHIgKi8KKyAgICBwYmxvY2sgPSBmcmFnX3RvX2JsayhmcywgZnJhZ19hZGRyKTsKKyAgICAvKiBSZWFkIHRoZSBibGsgKi8KKyAgICBkYXRhID0gZ2V0X2NhY2hlKGZzLT5mc19kZXYsIHBibG9jayk7CisKKyAgICAvKiBSZXR1cm4gb2Zmc2V0IGludG8gYmxvY2sgKi8KKyAgICByZXR1cm4gZGF0YSArIChmcmFnX29mZnNldCAmIChmcy0+YmxvY2tfc2l6ZSAtIDEpKTsKK30KKworLyoKKyAqIEJhc2VkIG9uIGZzL2V4dDIvZXh0Mi5jCisgKiBmaW5kIGEgZGlyIGVudHJ5LCByZXR1cm4gaXQgaWYgZm91bmQsIG9yIHJldHVybiBOVUxMLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHVmc19kaXJfZW50cnkgKgordWZzX2ZpbmRfZW50cnkoc3RydWN0IGZzX2luZm8gKmZzLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpkbmFtZSkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGlyOworICAgIGNvbnN0IGNoYXIgKmRhdGE7CisgICAgaW50MzJfdCBpLCBvZmZzZXQsIG1heG9mZnNldDsKKyAgICBibG9ja190IGluZGV4ID0gMDsKKworICAgIHVmc19kZWJ1ZygidWZzX2ZpbmRfZW50cnk6IGRuYW1lOiAlcyAiLCBkbmFtZSk7CisgICAgZm9yIChpID0gMDsgaSA8IGlub2RlLT5zaXplOyBpICs9IGZzLT5ibG9ja19zaXplKSB7CisJZGF0YSA9IHVmc19nZXRfY2FjaGUoaW5vZGUsIGluZGV4KyspOworCW9mZnNldCA9IDA7CisJbWF4b2Zmc2V0ID0gbWluKGlub2RlLT5zaXplLWksIGZzLT5ibG9ja19zaXplKTsKKworCS8qIFRoZSBzbWFsbGVzdCBwb3NzaWJsZSBzaXplIGlzIDkgYnl0ZXMgKi8KKwl3aGlsZSAob2Zmc2V0IDwgbWF4b2Zmc2V0LTgpIHsKKwkgICAgZGlyID0gKGNvbnN0IHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopKGRhdGEgKyBvZmZzZXQpOworCSAgICBpZiAoZGlyLT5kaXJfZW50cnlfbGVuID4gbWF4b2Zmc2V0IC0gb2Zmc2V0KQorCQlicmVhazsKKworCSAgICAvKgorCSAgICAgKiBOYW1lIGZpZWxkcyBhcmUgdmFyaWFibGUtbGVuZ3RoIGFuZCBudWxsIHRlcm1pbmF0ZWQsCisJICAgICAqIHRoZW4gaXQncyBwb3NzaWJsZSB0byB1c2Ugc3RyY21wIGRpcmVjdGx5LgorCSAgICAgKi8KKwkgICAgaWYgKGRpci0+aW5vZGVfdmFsdWUgJiYgIXN0cmNtcChkbmFtZSwgKGNvbnN0IGNoYXIgKilkaXItPm5hbWUpKSB7CisJCXVmc19kZWJ1ZygiKGZvdW5kKVxuIik7CisJCXJldHVybiBkaXI7CisJICAgIH0KKwkgICAgb2Zmc2V0ICs9IGRpci0+ZGlyX2VudHJ5X2xlbjsKKwl9CisgICAgfQorICAgIHVmc19kZWJ1ZygiKG5vdCBmb3VuZClcbiIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogR2V0IGVpdGhlciBVRlMxLzIgaW5vZGUgc3RydWN0dXJlcy4KKyAqLworc3RhdGljIGNvbnN0IHZvaWQgKgordWZzX2dldF9pbm9kZShzdHJ1Y3QgZnNfaW5mbyAqZnMsIGludCBpbnIpCit7CisgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICB1aW50MzJfdCBncm91cCwgaW5vZGVfb2Zmc2V0LCBpbm9kZV90YWJsZTsKKyAgICB1aW50MzJfdCBibG9ja19udW0sIGJsb2NrX29mZjsKKworICAgIC8qIEdldCBjeWxpbmRlciBncm91cCBuci4gKi8KKyAgICBncm91cCA9IGluciAvIFVGU19TQihmcyktPmlub2Rlc19wZXJfY2c7CisgICAgLyoKKyAgICAgKiBFbnN1cmluZyBncm91cCB3aWxsIG5vdCBleGNlZWQgdGhlIHJhbmdlIDA6Z3JvdXBzX2NvdW50LTEuCisgICAgICogQnkgdGhlIHdheSwgdGhpcyBzaG91bGQgKm5ldmVyKiBoYXBwZW4uCisgICAgICogVW5sZXNzIHRoZSAob24tZGlzaykgZnMgc3RydWN0dXJlIGlzIGNvcnJ1cHRlZCEKKyAgICAgKi8KKyAgICBpZiAoZ3JvdXAgPj0gVUZTX1NCKGZzKS0+Z3JvdXBzX2NvdW50KSB7CisJcHJpbnRmKCJ1ZnNfZ2V0X2lub2RlOiAiCisJCSJncm91cCglZCkgZXhjZWVkZWQgdGhlIGF2YWlsLiByYW5nZSAoMDolZClcbiIsCisJCWdyb3VwLCBVRlNfU0IoZnMpLT5ncm91cHNfY291bnQgLSAxKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBPZmZzZXQgaW50byBpbm9kZSB0YWJsZSBvZiB0aGUgY3lsaW5kZXIgZ3JvdXAgKi8KKyAgICBpbm9kZV9vZmZzZXQgPSBpbnIgJSBVRlNfU0IoZnMpLT5pbm9kZXNfcGVyX2NnOworICAgIC8qIEdldCBpbm9kZSB0YWJsZSBibGsgYWRkciByZXNwZWN0aXZlIHRvIGN5bGluZGVyIGdyb3VwICovCisgICAgaW5vZGVfdGFibGUgPSAoZ3JvdXAgKiBVRlNfU0IoZnMpLT5ibG9ja3NfcGVyX2NnKSArCisJVUZTX1NCKGZzKS0+b2ZmX2lub2RlX3RibDsKKyAgICAvKiBDYWxjdWxhdGluZyBzdGFnZ2VyaW5nIG9mZnNldCAoVUZTMSBvbmx5ISkgKi8KKyAgICBpZiAoVUZTX1NCKGZzKS0+ZnNfdHlwZSA9PSBVRlMxKQorCWlub2RlX3RhYmxlICs9IFVGU19TQihmcyktPnVmczEuZGVsdGFfdmFsdWUgKgorCSAgICAoZ3JvdXAgJiBVRlNfU0IoZnMpLT51ZnMxLmN5Y2xlX21hc2spOworCisgICAgLyogR2V0IGJsayBuciBhbmQgb2Zmc2V0IGludG8gdGhlIGJsayAqLworICAgIGJsb2NrX251bSA9IGlub2RlX3RhYmxlICsgaW5vZGVfb2Zmc2V0IC8gVUZTX1NCKGZzKS0+aW5vZGVzX3Blcl9ibG9jazsKKyAgICBibG9ja19vZmYgPSBpbm9kZV9vZmZzZXQgJSBVRlNfU0IoZnMpLT5pbm9kZXNfcGVyX2Jsb2NrOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBibGsgZnJvbSB0aGUgYmxrIGFkZHIgcHJldmlvdXNseSBjb21wdXRlZDsKKyAgICAgKiBDYWxjIHRoZSBpbm9kZSBzdHJ1Y3Qgb2Zmc2V0IGludG8gdGhlIHJlYWQgYmxvY2suCisgICAgICovCisgICAgZGF0YSA9IGdldF9jYWNoZShmcy0+ZnNfZGV2LCBibG9ja19udW0pOworICAgIHJldHVybiBkYXRhICsgYmxvY2tfb2ZmICogVUZTX1NCKGZzKS0+aW5vZGVfc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqCit1ZnMxX2lnZXRfYnlfaW5yKHN0cnVjdCBmc19pbmZvICpmcywgdWludDMyX3QgaW5yKQoreworICAgIGNvbnN0IHN0cnVjdCB1ZnMxX2lub2RlICp1ZnNfaW5vZGU7CisgICAgc3RydWN0IGlub2RlICppbm9kZTsKKyAgICB1aW50NjRfdCAqZGVzdDsKKyAgICB1aW50MzJfdCAqc291cmNlOworICAgIGludCBpOworCisgICAgdWZzX2lub2RlID0gKHN0cnVjdCB1ZnMxX2lub2RlICopIHVmc19nZXRfaW5vZGUoZnMsIGlucik7CisgICAgaWYgKCF1ZnNfaW5vZGUpCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIShpbm9kZSA9IGFsbG9jX2lub2RlKGZzLCBpbnIsIHNpemVvZihzdHJ1Y3QgdWZzX2lub2RlX3B2dCkpKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qIFVGUzEgZG9lc24ndCBzdXBwb3J0IG5laXRoZXIgY3JlYXRpb24gbm9yIGRlbGV0aW9uIHRpbWVzICovCisgICAgaW5vZGUtPnJlZmNudCAgPSB1ZnNfaW5vZGUtPmxpbmtfY291bnQ7CisgICAgaW5vZGUtPm1vZGUgICAgPSBJRlRPRFQodWZzX2lub2RlLT5maWxlX21vZGUpOworICAgIGlub2RlLT5zaXplICAgID0gdWZzX2lub2RlLT5zaXplOworICAgIGlub2RlLT5hdGltZSAgID0gdWZzX2lub2RlLT5hX3RpbWU7CisgICAgaW5vZGUtPm10aW1lICAgPSB1ZnNfaW5vZGUtPm1fdGltZTsKKyAgICBpbm9kZS0+YmxvY2tzICA9IHVmc19pbm9kZS0+YmxvY2tzX2hlbGQ7CisgICAgaW5vZGUtPmZsYWdzICAgPSB1ZnNfaW5vZGUtPmZsYWdzOworCisgICAgLyoKKyAgICAgKiBDb3B5IGFuZCBleHRlbmQgYmxrIHBvaW50ZXJzIHRvIDY0IGJpdHMsIHNvIGF2b2lkCisgICAgICogaGF2aW5nIHR3byBzdHJ1Y3R1cmVzIGZvciBpbm9kZSBwcml2YXRlLgorICAgICAqLworICAgIGRlc3QgPSAodWludDY0X3QgKikgaW5vZGUtPnB2dDsKKyAgICBzb3VyY2UgPSAodWludDMyX3QgKikgdWZzX2lub2RlLT5kaXJlY3RfYmxrX3B0cjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVUZTX05CTE9DS1M7IGkrKykKKwlkZXN0W2ldID0gKCh1aW50NjRfdCkgc291cmNlW2ldKSAmIDB4RkZGRkZGRkY7CisKKyAgICByZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgordWZzMl9pZ2V0X2J5X2lucihzdHJ1Y3QgZnNfaW5mbyAqZnMsIHVpbnQzMl90IGlucikKK3sKKyAgICBjb25zdCBzdHJ1Y3QgdWZzMl9pbm9kZSAqdWZzX2lub2RlOworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKyAgICB1ZnNfaW5vZGUgPSAoc3RydWN0IHVmczJfaW5vZGUgKikgdWZzX2dldF9pbm9kZShmcywgaW5yKTsKKyAgICBpZiAoIXVmc19pbm9kZSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmICghKGlub2RlID0gYWxsb2NfaW5vZGUoZnMsIGluciwgc2l6ZW9mKHN0cnVjdCB1ZnNfaW5vZGVfcHZ0KSkpKQorCXJldHVybiBOVUxMOworCisgICAgLyogVUZTMiBkb2Vzbid0IHN1cHBvcnQgZGVsZXRpb24gdGltZSAqLworICAgIGlub2RlLT5yZWZjbnQgID0gdWZzX2lub2RlLT5saW5rX2NvdW50OworICAgIGlub2RlLT5tb2RlICAgID0gSUZUT0RUKHVmc19pbm9kZS0+ZmlsZV9tb2RlKTsKKyAgICBpbm9kZS0+c2l6ZSAgICA9IHVmc19pbm9kZS0+c2l6ZTsKKyAgICBpbm9kZS0+YXRpbWUgICA9IHVmc19pbm9kZS0+YV90aW1lOworICAgIGlub2RlLT5jdGltZSAgID0gdWZzX2lub2RlLT5jcmVhdF90aW1lOworICAgIGlub2RlLT5tdGltZSAgID0gdWZzX2lub2RlLT5tX3RpbWU7CisgICAgaW5vZGUtPmJsb2NrcyAgPSB1ZnNfaW5vZGUtPmJ5dGVzX2hlbGQgPj4gZnMtPmJsb2NrX3NoaWZ0OworICAgIGlub2RlLT5mbGFncyAgID0gdWZzX2lub2RlLT5mbGFnczsKKyAgICBtZW1jcHkoaW5vZGUtPnB2dCwgdWZzX2lub2RlLT5kaXJlY3RfYmxrX3B0ciwKKwkgICBzaXplb2YodWludDY0X3QpICogVUZTX05CTE9DS1MpOworCisgICAgcmV0dXJuIGlub2RlOworfQorCisvKgorICogQm90aCB1ZnNfaWdldF9yb290IGFuZCB1ZnNfaWdldCBjYWxsYmFjayBiYXNlZCBvbiB1ZnMgdHlwZS4KKyAqLworc3RhdGljIHN0cnVjdCBpbm9kZSAqCit1ZnNfaWdldF9yb290KHN0cnVjdCBmc19pbmZvICpmcykKK3sKKyAgICByZXR1cm4gVUZTX1NCKGZzKS0+dWZzX2lnZXRfYnlfaW5yKGZzLCBVRlNfUk9PVF9JTk9ERSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgordWZzX2lnZXQoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQoreworICAgIGNvbnN0IHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkaXI7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gcGFyZW50LT5mczsKKworICAgIGRpciA9IHVmc19maW5kX2VudHJ5KGZzLCBwYXJlbnQsIGRuYW1lKTsKKyAgICBpZiAoIWRpcikKKwlyZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBVRlNfU0IoZnMpLT51ZnNfaWdldF9ieV9pbnIoZnMsIGRpci0+aW5vZGVfdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCB1ZnMxX3JlYWRfYmxrYWRkcnMoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqYnVmKQoreworICAgIHVpbnQzMl90IGRlc3RbVUZTX05CTE9DS1NdOworICAgIGNvbnN0IHVpbnQ2NF90ICpzb3VyY2UgPSAodWludDY0X3QgKikgKGlub2RlLT5wdnQpOworICAgIGludCBpOworCisgICAgLyogQ29udmVydCB1ZnNfaW5vZGVfcHZ0IHVpbnQ2NF90IGZpZWxkcyBpbnRvIHVpbnQzMl90CisgICAgICogVXBwZXItaGFsZiBwYXJ0IG9mIHVmczEgcHJpdmF0ZSBibGsgYWRkcnMgYXJlIGFsd2F5cyBzdXBwb3NlZCB0byBiZQorICAgICAqIHplcm8gKGl0J3MgcHJldmlvc3VseSBleHRlbmRlZCBieSB1cyksIHRodXMgZGF0YSBpc24ndCBiZWluZyBsb3N0LiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBVRlNfTkJMT0NLUzsgaSsrKSB7CisgICAgICAgIGlmICgoc291cmNlW2ldID4+IDMyKSAhPSAwKSB7CisgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCB3aWxsIG5vdCBwcmV2ZW50IGFueXRoaW5nCisgICAgICAgICAgICAgKiBmcm9tIHdvcmtpbmcuICovCisgICAgICAgICAgICB1ZnNfZGVidWcoInVmczE6IGlub2RlLT5wdnRbJWRdOiB3YXJuaW5nIVxuIiwgaSk7CisgICAgICAgIH0KKworICAgICAgICBkZXN0W2ldID0gKHVpbnQzMl90KShzb3VyY2VbaV0gJiAweEZGRkZGRkZGKTsKKyAgICB9CisgICAgbWVtY3B5KGJ1ZiwgKGNvbnN0IGNoYXIgKikgZGVzdCwgaW5vZGUtPnNpemUpOworfQorCitzdGF0aWMgdm9pZCB1ZnMyX3JlYWRfYmxrYWRkcnMoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqYnVmKQoreworICAgIG1lbWNweShidWYsIChjb25zdCBjaGFyICopIChpbm9kZS0+cHZ0KSwgaW5vZGUtPnNpemUpOworfQorCisvKgorICogVGFrZW4gZnJvbSBleHQyL2V4dDIuYy4KKyAqIFJlYWQgdGhlIGVudGlyZSBjb250ZW50cyBvZiBhbiBpbm9kZSBpbnRvIGEgbWVtb3J5IGJ1ZmZlcgorICovCitzdGF0aWMgaW50IGNhY2hlX2dldF9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ5dGVzKQoreworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IGlub2RlLT5mczsKKyAgICBzaXplX3QgYmxvY2tfc2l6ZSA9IEJMT0NLX1NJWkUoZnMpOworICAgIHVpbnQzMl90IGluZGV4ID0gMDsgICAgICAgICAvKiBMb2dpY2FsIGJsb2NrIG51bWJlciAqLworICAgIHNpemVfdCBjaHVuazsKKyAgICBjb25zdCBjaGFyICpkYXRhOworICAgIGNoYXIgKnAgPSBidWY7CisKKyAgICBpZiAoaW5vZGUtPnNpemUgPiBieXRlcykKKyAgICAgICAgYnl0ZXMgPSBpbm9kZS0+c2l6ZTsKKworICAgIHdoaWxlIChieXRlcykgeworICAgICAgICBjaHVuayA9IG1pbihieXRlcywgYmxvY2tfc2l6ZSk7CisgICAgICAgIGRhdGEgPSB1ZnNfZ2V0X2NhY2hlKGlub2RlLCBpbmRleCsrKTsKKyAgICAgICAgbWVtY3B5KHAsIGRhdGEsIGNodW5rKTsKKworICAgICAgICBieXRlcyAtPSBjaHVuazsKKyAgICAgICAgcCArPSBjaHVuazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZnNfcmVhZGxpbmsoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqYnVmKQoreworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IGlub2RlLT5mczsKKyAgICB1aW50MzJfdCBpX3N5bWxpbmtfbGltaXQ7CisKKyAgICBpZiAoaW5vZGUtPnNpemUgPiBCTE9DS19TSVpFKGZzKSkKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgLyogRXJyb3IhICovCisKKyAgICAvLyBUT0RPOiB1c2UgVUZTX1NCKGZzKS0+bWF4bGVuX2lzeW1saW5rIGluc3RlYWQuCisgICAgaV9zeW1saW5rX2xpbWl0ID0gKChVRlNfU0IoZnMpLT5mc190eXBlID09IFVGUzEpID8KKyAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSA6IHNpemVvZih1aW50NjRfdCkpICogVUZTX05CTE9DS1M7CisgICAgdWZzX2RlYnVnKCJVRlNfU0IoZnMpLT5tYXhsZW5faXN5bWxpbms9JWQiLCBVRlNfU0IoZnMpLT5tYXhsZW5faXN5bWxpbmspOworCisgICAgaWYgKGlub2RlLT5zaXplIDw9IGlfc3ltbGlua19saW1pdCkKKyAgICAgICAgVUZTX1NCKGZzKS0+dWZzX3JlYWRfYmxrYWRkcnMoaW5vZGUsIGJ1Zik7CisgICAgZWxzZQorICAgICAgICBjYWNoZV9nZXRfZmlsZShpbm9kZSwgYnVmLCBpbm9kZS0+c2l6ZSk7CisKKyAgICByZXR1cm4gaW5vZGUtPnNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgZW51bSBkaXJfdHlwZV9mbGFncyBnZXRfaW5vZGVfbW9kZSh1aW50OF90IHR5cGUpCit7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgY2FzZSBVRlNfRFRZUEVfRklGTzogcmV0dXJuIERUX0ZJRk87CisgICAgICAgIGNhc2UgVUZTX0RUWVBFX0NIQVJERVY6IHJldHVybiBEVF9DSFI7CisgICAgICAgIGNhc2UgVUZTX0RUWVBFX0RJUjogcmV0dXJuIERUX0RJUjsKKyAgICAgICAgY2FzZSBVRlNfRFRZUEVfQkxPQ0s6IHJldHVybiBEVF9CTEs7CisgICAgICAgIGNhc2UgVUZTX0RUWVBFX1JGSUxFOiByZXR1cm4gRFRfUkVHOworICAgICAgICBjYXNlIFVGU19EVFlQRV9TWU1MSU5LOiByZXR1cm4gRFRfTE5LOworICAgICAgICBjYXNlIFVGU19EVFlQRV9TT0NLRVQ6IHJldHVybiBEVF9TT0NLOworICAgICAgICBjYXNlIFVGU19EVFlQRV9XSElURU9VVDogcmV0dXJuIERUX1dIVDsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIERUX1VOS05PV047CisgICAgfQorfQorCisvKgorICogUmVhZCBvbmUgZGlyZWN0b3J5IGVudHJ5IGF0IGEgdGltZQorICovCitzdGF0aWMgaW50IHVmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyZW50ICpkaXJlbnQpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gZmlsZS0+ZnM7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmlub2RlOworICAgIGNvbnN0IHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkaXI7CisgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICBibG9ja190IGluZGV4ID0gZmlsZS0+b2Zmc2V0ID4+IGZzLT5ibG9ja19zaGlmdDsKKworICAgIGlmIChmaWxlLT5vZmZzZXQgPj0gaW5vZGUtPnNpemUpCisJcmV0dXJuIC0xOwkJLyogRW5kIG9mIGZpbGUgKi8KKworICAgIGRhdGEgPSB1ZnNfZ2V0X2NhY2hlKGlub2RlLCBpbmRleCk7CisgICAgZGlyID0gKGNvbnN0IHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopCisJKGRhdGEgKyAoZmlsZS0+b2Zmc2V0ICYgKEJMT0NLX1NJWkUoZnMpIC0gMSkpKTsKKworICAgIGRpcmVudC0+ZF9pbm8gPSBkaXItPmlub2RlX3ZhbHVlOworICAgIGRpcmVudC0+ZF9vZmYgPSBmaWxlLT5vZmZzZXQ7CisgICAgZGlyZW50LT5kX3JlY2xlbiA9IG9mZnNldG9mKHN0cnVjdCBkaXJlbnQsIGRfbmFtZSkgKyBkaXItPm5hbWVfbGVuZ3RoICsgMTsKKyAgICBkaXJlbnQtPmRfdHlwZSA9IGdldF9pbm9kZV9tb2RlKGRpci0+ZmlsZV90eXBlICYgMHgwRik7CisgICAgbWVtY3B5KGRpcmVudC0+ZF9uYW1lLCBkaXItPm5hbWUsIGRpci0+bmFtZV9sZW5ndGgpOworICAgIGRpcmVudC0+ZF9uYW1lW2Rpci0+bmFtZV9sZW5ndGhdID0gJ1wwJzsKKworICAgIGZpbGUtPm9mZnNldCArPSBkaXItPmRpcl9lbnRyeV9sZW47ICAvKiBVcGRhdGUgZm9yIG5leHQgcmVhZGluZyAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVmc19zYl9pbmZvICoKK3NldF91ZnNfaW5mbyhzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICpzYiwgaW50IHVmc190eXBlKQoreworICAgIHN0cnVjdCB1ZnNfc2JfaW5mbyAqc2JpOworCisgICAgc2JpID0gbWFsbG9jKHNpemVvZiAqc2JpKTsKKyAgICBpZiAoIXNiaSkKKwltYWxsb2NfZXJyb3IoInVmc19zYl9pbmZvIHN0cnVjdHVyZSIpOworCisgICAgLyogU2V0dGluZyB1cCBVRlMtZGVwZW5kZW50IGluZm8gKi8KKyAgICBpZiAodWZzX3R5cGUgPT0gVUZTMSkgeworCXNiaS0+aW5vZGVfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHVmczFfaW5vZGUpOworCXNiaS0+Z3JvdXBzX2NvdW50ID0gc2ItPnVmczEubnJfZnJhZ3MgLyBzYi0+ZnJhZ3NfcGVyX2NnOworCXNiaS0+dWZzMS5kZWx0YV92YWx1ZSA9IHNiLT51ZnMxLmRlbHRhX3ZhbHVlOworCXNiaS0+dWZzMS5jeWNsZV9tYXNrID0gc2ItPnVmczEuY3ljbGVfbWFzazsKKwlzYmktPnVmc19pZ2V0X2J5X2luciA9IHVmczFfaWdldF9ieV9pbnI7CisgICAgICAgIHNiaS0+dWZzX3JlYWRfYmxrYWRkcnMgPSB1ZnMxX3JlYWRfYmxrYWRkcnM7CisJc2JpLT5hZGRyX3NoaWZ0ID0gVUZTMV9BRERSX1NISUZUOworICAgIH0gZWxzZSB7IC8vIFVGUzIgb3IgVUZTMl9QSUdHWQorCXNiaS0+aW5vZGVfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHVmczJfaW5vZGUpOworCXNiaS0+Z3JvdXBzX2NvdW50ID0gc2ItPnVmczIubnJfZnJhZ3MgLyBzYi0+ZnJhZ3NfcGVyX2NnOworCXNiaS0+dWZzX2lnZXRfYnlfaW5yID0gdWZzMl9pZ2V0X2J5X2lucjsKKyAgICAgICAgc2JpLT51ZnNfcmVhZF9ibGthZGRycyA9IHVmczJfcmVhZF9ibGthZGRyczsKKwlzYmktPmFkZHJfc2hpZnQgPSBVRlMyX0FERFJfU0hJRlQ7CisgICAgfQorICAgIHNiaS0+aW5vZGVzX3Blcl9ibG9jayA9IHNiLT5ibG9ja19zaXplIC8gc2JpLT5pbm9kZV9zaXplOworICAgIHNiaS0+aW5vZGVzX3Blcl9jZyA9IHNiLT5pbm9kZXNfcGVyX2NnOworICAgIHNiaS0+YmxvY2tzX3Blcl9jZyA9IHNiLT5mcmFnc19wZXJfY2cgPj4gc2ItPmNfYmxrX2ZyYWdfc2hpZnQ7CisgICAgc2JpLT5vZmZfaW5vZGVfdGJsID0gc2ItPm9mZl9pbm9kZV90YmwgPj4gc2ItPmNfYmxrX2ZyYWdfc2hpZnQ7CisgICAgc2JpLT5jX2Jsa19mcmFnX3NoaWZ0ID0gc2ItPmNfYmxrX2ZyYWdfc2hpZnQ7CisgICAgc2JpLT5tYXhsZW5faXN5bWxpbmsgPSBzYi0+bWF4bGVuX2lzeW1saW5rOworICAgIHNiaS0+ZnNfdHlwZSA9IHVmc190eXBlOworCisgICAgcmV0dXJuIHNiaTsKK30KKworLyoKKyAqIEluaXQgdGhlIGZzIG1ldGFkYXRhIGFuZCByZXR1cm4gYmxvY2sgc2l6ZQorICovCitzdGF0aWMgaW50IHVmc19mc19pbml0KHN0cnVjdCBmc19pbmZvICpmcykKK3sKKyAgICBzdHJ1Y3QgZGlzayAqZGlzayA9IGZzLT5mc19kZXYtPmRpc2s7CisgICAgc3RydWN0IHVmc19zdXBlcl9ibG9jayBzYjsKKyAgICBzdHJ1Y3QgY2FjaGUgKmNzOworCisgICAgaW50IHVmc190eXBlID0gdWZzX2NoZWNrc2IoJnNiLCBkaXNrKTsKKyAgICBpZiAodWZzX3R5cGUgPT0gTk9ORSkKKwlyZXR1cm4gLTE7CisKKyAgICB1ZnNfZGVidWcoIiVzIFNCIEZPVU5EIVxuIiwgdWZzX3R5cGUgPT0gVUZTMSA/ICJVRlMxIiA6ICJVRlMyIik7CisgICAgdWZzX2RlYnVnKCJCbG9jayBzaXplOiAldVxuIiwgc2IuYmxvY2tfc2l6ZSk7CisKKyAgICBmcy0+ZnNfaW5mbyA9IChzdHJ1Y3QgdWZzX3NiX2luZm8gKikgc2V0X3Vmc19pbmZvKCZzYiwgdWZzX3R5cGUpOworICAgIGZzLT5zZWN0b3Jfc2hpZnQgPSBkaXNrLT5zZWN0b3Jfc2hpZnQ7CisgICAgZnMtPnNlY3Rvcl9zaXplICA9IGRpc2stPnNlY3Rvcl9zaXplOworICAgIGZzLT5ibG9ja19zaGlmdCAgPSBzYi5ibG9ja19zaGlmdDsKKyAgICBmcy0+YmxvY2tfc2l6ZSAgID0gc2IuYmxvY2tfc2l6ZTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGNhY2hlLCBhbmQgZm9yY2UgYSBjbGVhbiBvbiBibG9jayB6ZXJvICovCisgICAgY2FjaGVfaW5pdChmcy0+ZnNfZGV2LCBzYi5ibG9ja19zaGlmdCk7CisgICAgY3MgPSBfZ2V0X2NhY2hlX2Jsb2NrKGZzLT5mc19kZXYsIDApOworICAgIG1lbXNldChjcy0+ZGF0YSwgMCwgZnMtPmJsb2NrX3NpemUpOworICAgIGNhY2hlX2xvY2tfYmxvY2soY3MpOworCisgICAgLyogRm9yIGRlYnVnIHB1cnBvc2VzICovCisgICAgLy91ZnNfY2hlY2tpbmcoZnMpOworCisgICAgLy9yZXR1cm4gLTE7CisgICAgcmV0dXJuIGZzLT5ibG9ja19zaGlmdDsKK30KKworY29uc3Qgc3RydWN0IGZzX29wcyB1ZnNfZnNfb3BzID0geworICAgIC5mc19uYW1lICAgICAgICA9ICJ1ZnMiLAorICAgIC5mc19mbGFncyAgICAgICA9IEZTX1VTRU1FTSB8IEZTX1RISVNJTkQsCisgICAgLmZzX2luaXQgICAgICAgID0gdWZzX2ZzX2luaXQsCisgICAgLnNlYXJjaGRpciAgICAgID0gTlVMTCwKKyAgICAuZ2V0ZnNzZWMgICAgICAgPSBnZW5lcmljX2dldGZzc2VjLAorICAgIC5jbG9zZV9maWxlICAgICA9IGdlbmVyaWNfY2xvc2VfZmlsZSwKKyAgICAubWFuZ2xlX25hbWUgICAgPSBnZW5lcmljX21hbmdsZV9uYW1lLAorICAgIC5vcGVuX2NvbmZpZyAgICA9IGdlbmVyaWNfb3Blbl9jb25maWcsCisgICAgLnJlYWRsaW5rCSAgICA9IHVmc19yZWFkbGluaywKKyAgICAucmVhZGRpciAgICAgICAgPSB1ZnNfcmVhZGRpciwKKyAgICAuaWdldF9yb290ICAgICAgPSB1ZnNfaWdldF9yb290LAorICAgIC5pZ2V0ICAgICAgICAgICA9IHVmc19pZ2V0LAorICAgIC5uZXh0X2V4dGVudCAgICA9IHVmc19uZXh0X2V4dGVudCwKK307CmRpZmYgLS1naXQgYS9jb3JlL2ZzL3Vmcy91ZnMuaCBiL2NvcmUvZnMvdWZzL3Vmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTlmODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3Vmcy91ZnMuaApAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSYXBoYWVsIFMuIENhcnZhbGhvIDxyYXBoYWVsLnNjYXJ2QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKi8KKworI2lmbmRlZiBfVUZTX0hfCisjZGVmaW5lIF9VRlNfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBTZWN0b3IgYWRkcmVzc2VzICovCisjZGVmaW5lIFVGUzFfU0JMT0NLX09GRlNFVAk4MTkyCisjZGVmaW5lIFVGUzJfU0JMT0NLX09GRlNFVAk2NTUzNgorI2RlZmluZSBVRlMyX1NCTE9DSzJfT0ZGU0VUCTI2MjE0NAorCisjZGVmaW5lIFVGUzFfQUREUl9TSElGVCAyCisjZGVmaW5lIFVGUzJfQUREUl9TSElGVCAzCisKKy8qIFN1cGVyIG1hZ2ljIG51bWJlcnMgKi8KKyNkZWZpbmUgVUZTMV9TVVBFUl9NQUdJQwkoMHgwMTE5NTQpCisjZGVmaW5lIFVGUzJfU1VQRVJfTUFHSUMJKDB4MTk1NDAxMTkpCisKKyNkZWZpbmUgVUZTX1JPT1RfSU5PREUgMgorCisjZGVmaW5lIFVGU19ESVJFQ1RfQkxPQ0tTIDEyCisjZGVmaW5lIFVGU19JTkRJUkVDVF9CTE9DSyAxCisjZGVmaW5lIFVGU19ET1VCTEVfSU5ESVJFQ1RfQkxPQ0sgMQorI2RlZmluZSBVRlNfVFJJUExFX0lORElSRUNUX0JMT0NLIDEKKy8qIFRvdGFsIG51bWJlciBvZiBibG9jayBhZGRyIGhvbGQgYnkgaW5vZGVzICovCisjZGVmaW5lIFVGU19OQkxPQ0tTIDE1CisKKy8qIEJsb2NrcyBzcGFuIDggZnJhZ21lbnRzICovCisjZGVmaW5lIEZSQUdNRU5UU19QRVJfQkxLIDgKKworLyogVUZTIHR5cGVzICovCit0eXBlZGVmIGVudW0geworICAgIE5PTkUsCisgICAgVUZTMSwKKyAgICBVRlMyLAorICAgIFVGUzJfUElHR1ksCit9IHVmc190OworCisvKgorICogVUZTMS9VRlMyIFNVUEVSQkxPQ0sgc3RydWN0dXJlCisgKiBDRyBzdGFuZHMgZm9yIEN5bGluZGVyIEdyb3VwLgorICoKKyAqIFZhcmlhYmxlcyBwcmVwZW5kZWQgd2l0aCBvZmYgc3RvcmUgb2Zmc2V0cyByZWxhdGl2ZSB0bworICogYmFzZSBhZGRyZXNzIG9mIGEgQ3lsaW5kZXIgR3JvdXAgKENHKS4KKyAqLworc3RydWN0IHVmc19zdXBlcl9ibG9jayB7IC8vIHN1cHBvcnRpbmcgZWl0aGVyIHVmczEgb3IgdWZzMgorICAgIHVpbnQ4X3QgIHVudXNlZFs4XTsKKyAgICAvKiBPZmZzZXQgdmFsdWVzICovCisgICAgdWludDMyX3Qgb2ZmX2JhY2t1cF9zYjsgLy8gQmFja3VwIHN1cGVyIGJsb2NrCisgICAgdWludDMyX3Qgb2ZmX2dyb3VwX2Rlc2M7IC8vIEdyb3VwIERlc2NyaXB0b3IKKyAgICB1aW50MzJfdCBvZmZfaW5vZGVfdGJsOyAvLyBJbm9kZSB0YWJsZQorICAgIHVpbnQzMl90IG9mZl9kYXRhX2Jsb2NrOyAvLyBGaXJzdCBkYXRhIGJsb2NrCisgICAgdW5pb24geworCXN0cnVjdCB7ICAvKiBVc2VkIGZvciBVRlMxICovCisJICAgIHVpbnQzMl90IGRlbHRhX3ZhbHVlOyAvLyBGb3IgY2FsYyBzdGFnZ2VyaW5nIG9mZnNldAorCSAgICB1aW50MzJfdCBjeWNsZV9tYXNrOyAvLyBNYXNrIGZvciBzdGFnZ2VyaW5nIG9mZnNldAorCSAgICB1aW50MzJfdCBsYXN0X3dyaXR0ZW47IC8vIExhc3Qgd3JpdHRlbiB0aW1lCisJICAgIHVpbnQzMl90IG5yX2ZyYWdzOyAvLyBOdW1iZXIgb2YgZnJhZ3MgaW4gRlMKKwkgICAgdWludDMyX3Qgc3RvcmFibGVfZnJhZ3NfbnI7IC8vIE5yIG9mIGZyYWdzIHRoYXQgY2FuIHN0b3JlIGRhdGEKKwl9IHVmczE7CisJdWludDhfdCB1bnVzZWQxWzIwXTsKKyAgICB9OworICAgIHVpbnQzMl90IG5yX2N5bF9ncm91cHM7IC8vIE51bWJlciBvZiBjeWxpbmRlciBncm91cHMuCisgICAgdWludDMyX3QgYmxvY2tfc2l6ZTsgLy8gQmxvY2sgc2l6ZSBpbiBieXRlcy4KKyAgICB1aW50MzJfdCBmcmFnbWVudF9zaXplOyAvLyBGcmFnbWVudCBzaXplIGluIGJ5dGVzLgorICAgIHVpbnQ4X3QgIHVudXNlZDJbMTZdOworICAgIHVpbnQzMl90IGJsb2NrX2FkZHJfbWFzazsgLy8gdG8gY2FsY3VsYXRlIHRoZSBhZGRyZXNzCisgICAgdWludDMyX3QgZnJhZ19hZGRyX21hc2s7CisgICAgdWludDMyX3QgYmxvY2tfc2hpZnQ7IC8vIHRvIGNhbGN1bGF0ZSBieXRlIGFkZHJlc3MKKyAgICB1aW50MzJfdCBmcmFnX3NoaWZ0OworICAgIHVpbnQzMl90IG5yX2NvbnRpZ3VvdXNfYmxrOyAvLyBtYXggbnVtYmVyIG9mIGNvbnRpbnVvdXMgYmxrcyB0byBhbGxvYworICAgIHVpbnQzMl90IG5yX2Jsa3NfcGVyX2NnOyAvLyBtYXggbnVtYmVyIG9mIGJsa3MgcGVyIGN5bGluZGVyIGdyb3VwCisgICAgdWludDMyX3QgY19ibGtfZnJhZ19zaGlmdDsgLy8gQml0cyB0byBjb252ZXJ0IGJsayBhbmQgZnJhZyBhZGRyZXNzLgorICAgIHVpbnQzMl90IGNfZnJhZ19zZWN0X3NoaWZ0OyAvLyBCaXRzIHRvIGNvbnZlcnQgZnJhZyBhbmQgc2VjdCBhZGRyZXNzLgorICAgIHVpbnQzMl90IHN1cGVyYmxrX3NpemU7IC8vIFN1cGVyYmxvY2sgc2l6ZS4KKyAgICB1aW50OF90ICB1bnVzZWQzWzc2XTsKKyAgICB1aW50MzJfdCBpbm9kZXNfcGVyX2NnOyAvLyBJbm9kZXMgcGVyIGN5bGluZGVyIGdyb3VwCisgICAgdWludDMyX3QgZnJhZ3NfcGVyX2NnOyAvLyBGcmFnbWVudHMgcGVyIGN5bGluZGVyIGdyb3VwCisgICAgdW5pb24geworCXN0cnVjdCB7IC8qIFVzZWQgZm9yIFVGUzIgKi8KKwkgICAgdWludDhfdCAgdW51c2VkWzg4OF07CisJICAgIHVpbnQ2NF90IG5yX2ZyYWdzOyAvLyBOdW1iZXIgb2YgZnJhZ21lbnRzIGluIEZTCisJICAgIHVpbnQ4X3QgIHVudXNlZDFbMjMyXTsKKwl9IHVmczI7CisJdWludDhfdCB1bnVzZWQ0WzExMjhdOworICAgIH07CisgICAgdWludDMyX3QgbWF4bGVuX2lzeW1saW5rOyAvLyBNYXggbGVuZ3RoIG9mIGludGVybmFsIHN5bWxpbmsKKyAgICB1aW50MzJfdCBpbm9kZXNfZm9ybWF0OyAvLyBGb3JtYXQgb2YgaW5vZGVzCisgICAgdWludDhfdCAgdW51c2VkNVs0NF07CisgICAgdWludDMyX3QgbWFnaWM7IC8vIE1hZ2ljIHZhbHVlCisgICAgdWludDhfdCAgcGFkWzE2MF07IC8vIHBhZGRpbmcgdXAgdG8gc2VjdG9yICg1MTIgYnl0ZXMpIGJvdW5kYXJ5Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyoKKyAqIEluZm8gYWJvdXQgVUZTMS8yIHN1cGVyIGJsb2NrLgorICovCitzdHJ1Y3QgdWZzX3NiX2luZm8geworICAgIHVpbnQzMl90IGJsb2Nrc19wZXJfY2c7IC8vIEJsb2NrcyBwZXIgY3lsaW5kZXIgZ3JvdXAKKyAgICB1aW50MzJfdCBpbm9kZXNfcGVyX2NnOyAvLyBJbm9kZXMgcGVyIGN5bGluZGVyIGdyb3VwCisgICAgdWludDMyX3QgaW5vZGVfc2l6ZTsKKyAgICB1aW50MzJfdCBpbm9kZXNfcGVyX2Jsb2NrOyAvLyBJbm9kZXMgcGVyIGJsb2NrCisgICAgc3RydWN0IHsgLyogVUZTMSBvbmx5ISAqLworCS8qIFZhbHVlcyBmb3IgY2FsY3VsYXRpbmcgc3RhZ2dlcmluZyBvZmZzZXQgKi8KKwl1aW50MzJfdCBkZWx0YV92YWx1ZTsKKwl1aW50MzJfdCBjeWNsZV9tYXNrOworICAgIH0gdWZzMTsKKyAgICB1aW50MzJfdCBvZmZfaW5vZGVfdGJsOyAvLyBJbm9kZSB0YWJsZSBvZmZzZXQuCisgICAgdWludDMyX3QgZ3JvdXBzX2NvdW50OyAvLyBOdW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBmcworICAgIHVpbnQzMl90IGFkZHJfc2hpZnQ7IC8vIDIgXiBhZGRyX3NoaWZ0ID0gc2l6ZSBpbiBieXRlcyBvZiBkZWZhdWx0IGFkZHIuCisgICAgdWludDMyX3QgY19ibGtfZnJhZ19zaGlmdDsgLy8gQ29udmVydCBibGsvZnJhZyBhZGRyICh2aWNlLXZlcnNhKQorICAgIHVpbnQzMl90IG1heGxlbl9pc3ltbGluazsgLy8gTWF4IGxlbmd0aCBvZiBpbnRlcm5hbCBzeW1saW5rCisgICAgc3RydWN0IGlub2RlICooKnVmc19pZ2V0X2J5X2lucikoc3RydWN0IGZzX2luZm8gKiwgdWludDMyX3QpOworICAgIHZvaWQgKCp1ZnNfcmVhZF9ibGthZGRycykoc3RydWN0IGlub2RlICosIGNoYXIgKik7CisgICAgdWZzX3QgICAgZnNfdHlwZTsgLy8geyBVRlMxLCBVRlMyLCBVRlMyX1BJR0dZIH0KK307CisKKy8qCisgKiBHZXQgc3VwZXIgYmxvY2sgaW5mbyBzdHJ1Y3QKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgdWZzX3NiX2luZm8gKlVGU19TQihzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgcmV0dXJuIGZzLT5mc19pbmZvOworfQorCisvKgorICogQ29udmVydCBmcmFnIGFkZHIgdG8gYmxrIGFkZHIKKyAqLworc3RhdGljIGlubGluZSBibG9ja190IGZyYWdfdG9fYmxrKHN0cnVjdCBmc19pbmZvICpmcywgdWludDY0X3QgZnJhZykKK3sKKyAgICByZXR1cm4gZnJhZyA+PiBVRlNfU0IoZnMpLT5jX2Jsa19mcmFnX3NoaWZ0OworfQorCisvKgorICogVUZTMSBpbm9kZSBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCB1ZnMxX2lub2RlIHsKKyAgICB1aW50MTZfdCBmaWxlX21vZGU7CisgICAgdWludDE2X3QgbGlua19jb3VudDsKKyAgICB1aW50OF90ICB1bnVzZWRbNF07CisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBhX3RpbWU7IC8vIEFjY2VzcyB0aW1lCisgICAgdWludDMyX3QgYV90aW1lX25hbm9zZWM7CisgICAgdWludDMyX3QgbV90aW1lOyAvLyBNb2RpZmllZCB0aW1lCisgICAgdWludDMyX3QgbV90aW1lX25hbm9zZWM7CisgICAgdWludDMyX3QgY2hfdGltZTsgLy8gQ2hhbmdlIHRpbWUKKyAgICB1aW50MzJfdCBjaF90aW1lX25hbm9zZWM7CisgICAgdWludDMyX3QgZGlyZWN0X2Jsa19wdHJbMTJdOworICAgIHVpbnQzMl90IGluZGlyZWN0X2Jsa19wdHI7CisgICAgdWludDMyX3QgZG91YmxlX2luZGlyZWN0X2Jsa19wdHI7CisgICAgdWludDMyX3QgdHJpcGxlX2luZGlyZWN0X2Jsa19wdHI7CisgICAgdWludDMyX3QgZmxhZ3M7IC8vIFN0YXR1cyBmbGFncworICAgIHVpbnQzMl90IGJsb2Nrc19oZWxkOyAvLyBCbG9ja3MgaGVsZAorICAgIHVpbnQzMl90IGdlbmVyYXRpb25fbnJiOyAvLyAoTkZTKQorICAgIHVpbnQzMl90IHVzZWRfaWQ7CisgICAgdWludDMyX3QgZ3JvdXBfaWQ7CisgICAgdWludDhfdCAgdW51c2VkMVs4XTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKgorICogVUZTMiBpbm9kZSBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCB1ZnMyX2lub2RlIHsKKyAgICB1aW50MTZfdCBmaWxlX21vZGU7CisgICAgdWludDE2X3QgbGlua19jb3VudDsKKyAgICB1aW50MzJfdCB1c2VyX2lkOworICAgIHVpbnQzMl90IGdyb3VwX2lkOworICAgIHVpbnQzMl90IGlub2RlX2Jsb2Nrc2l6ZTsKKyAgICB1aW50NjRfdCBzaXplOworICAgIHVpbnQ2NF90IGJ5dGVzX2hlbGQ7CisgICAgdWludDY0X3QgYV90aW1lOyAvLyBBY2Nlc3MgdGltZQorICAgIHVpbnQ2NF90IG1fdGltZTsgLy8gTW9kaWZpZWQgdGltZQorICAgIHVpbnQ2NF90IGNoX3RpbWU7IC8vIENoYW5nZSB0aW1lCisgICAgdWludDY0X3QgY3JlYXRfdGltZTsgLy8gQ3JlYXRpb24gdGltZQorICAgIHVpbnQzMl90IGFfdGltZV9uYW5vc2VjOworICAgIHVpbnQzMl90IG1fdGltZV9uYW5vc2VjOworICAgIHVpbnQzMl90IGNoX3RpbWVfbmFub3NlYzsKKyAgICB1aW50MzJfdCBjcmVhdF90aW1lX25hbm9zZWM7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbl9ucmI7IC8vIChORlMpCisgICAgdWludDMyX3Qga2VybmVsX2ZsYWdzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHVpbnQzMl90IGV4dF9hdHRyX3NpemU7IC8vIEV4dGVuZGVkIGF0dHJpYiBzaXplLgorICAgIHVpbnQ2NF90IGV4dF9kaXJlY3RfYmxrX3B0cnNbMl07IC8vIEV4dC4gYXR0cmliIGJsayBwb2ludGVycy4KKyAgICB1aW50NjRfdCBkaXJlY3RfYmxrX3B0clsxMl07CisgICAgdWludDY0X3QgaW5kaXJlY3RfYmxrX3B0cjsKKyAgICB1aW50NjRfdCBkb3VibGVfaW5kaXJlY3RfYmxrX3B0cjsKKyAgICB1aW50NjRfdCB0cmlwbGVfaW5kaXJlY3RfYmxrX3B0cjsKKyAgICB1aW50OF90ICB1bnVzZWRbMjRdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgUFZUKHApICgoc3RydWN0IHVmc19pbm9kZV9wdnQgKikgcC0+cHZ0KQorCitzdHJ1Y3QgdWZzX2lub2RlX3B2dCB7CisgICAgdWludDY0X3QgZGlyZWN0X2Jsa19wdHJbMTJdOworICAgIHVpbnQ2NF90IGluZGlyZWN0X2Jsa19wdHI7CisgICAgdWludDY0X3QgZG91YmxlX2luZGlyZWN0X2Jsa19wdHI7CisgICAgdWludDY0X3QgdHJpcGxlX2luZGlyZWN0X2Jsa19wdHI7Cit9OworCitzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSB7CisgICAgdWludDMyX3QgaW5vZGVfdmFsdWU7CisgICAgdWludDE2X3QgZGlyX2VudHJ5X2xlbjsKKyAgICB1aW50OF90ICBmaWxlX3R5cGU7CisgICAgdWludDhfdCAgbmFtZV9sZW5ndGg7CisgICAgdWludDhfdCAgbmFtZVsxXTsgLy8gRGlyIG5hbWVzIGFyZSBudWxsIHRlcm1pbmF0ZWQhISEKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCitlbnVtIGlub2RlX3R5cGVfZmxhZ3MgeworICAgIFVGU19JTk9fRklGTwk9IDB4MTAwMCwKKyAgICBVRlNfSU5PX0NIQVJERVYJPSAweDIwMDAsCisgICAgVUZTX0lOT19ESVJFQ1RPUlkgCT0gMHg0MDAwLAorICAgIFVGU19JTk9fQkxPQ0tERVYJPSAweDYwMDAsCisgICAgVUZTX0lOT19SRklMRQk9IDB4ODAwMCwKKyAgICBVRlNfSU5PX1NZTUxJTksJPSAweEEwMDAsCisgICAgVUZTX0lOT19VTklYU09DS0VUIAk9IDB4QzAwMCwKK307CisKK2VudW0gZGlyX3R5cGVfZmxhZ3MgeworICAgIFVGU19EVFlQRV9VTktOT1dOCT0gMCwKKyAgICBVRlNfRFRZUEVfRklGTyAJPSAxLAorICAgIFVGU19EVFlQRV9DSEFSREVWCT0gMiwKKyAgICBVRlNfRFRZUEVfRElSIAk9IDQsCisgICAgVUZTX0RUWVBFX0JMT0NLCT0gNiwKKyAgICBVRlNfRFRZUEVfUkZJTEUJPSA4LAorICAgIFVGU19EVFlQRV9TWU1MSU5LIAk9IDEwLAorICAgIFVGU19EVFlQRV9TT0NLRVQJPSAxMiwKKyAgICBVRlNfRFRZUEVfV0hJVEVPVVQgCT0gMTQsCit9OworCisvKiBGdW5jdGlvbnMgZnJvbSBibWFwLmMgKi8KK2V4dGVybiB1aW50NjRfdCB1ZnNfYm1hcCAoc3RydWN0IGlub2RlICosIGJsb2NrX3QsIHNpemVfdCAqKTsKK2V4dGVybiBpbnQgdWZzX25leHRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqLCB1aW50MzJfdCk7CisKKyNkZWZpbmUgdWZzX2RlYnVnIGRwcmludGYKKy8vZXh0ZXJuIHZvaWQgdWZzX2NoZWNraW5nIChzdHJ1Y3QgZnNfaW5mbyAqKTsKKworI2VuZGlmIC8qIF9VRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZnMveGZzL21pc2MuaCBiL2NvcmUvZnMveGZzL21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjJmMWIzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy94ZnMvbWlzYy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bG8gQWxjYW50YXJhIDxwY2FjanJAenl0b3IuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgTUlTQ19IXworI2RlZmluZSBNSVNDX0hfCisKKy8qIFJldHVybiBhIDY0LWJpdCBsaXR0ZS1lbmRpYW4gdmFsdWUgZnJvbSBhIGdpdmVuIDY0LWJpdCBiaWctZW5kaWFuIG9uZSAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCBiZTY0X3RvX2NwdSh1aW50NjRfdCB2YWwpCit7CisgICAgcmV0dXJuICh1aW50NjRfdCkoKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpKTsKK30KKworLyogUmV0dXJuIGEgMzItYml0IGxpdHRlLWVuZGlhbiB2YWx1ZSBmcm9tIGEgZ2l2ZW4gMzItYml0IGJpZy1lbmRpYW4gb25lICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJlMzJfdG9fY3B1KHVpbnQzMl90IHZhbCkKK3sKKyAgICByZXR1cm4gKHVpbnQzMl90KSgoKCh1aW50MzJfdCl2YWwgJiAodWludDMyX3QpMHgwMDAwMDBmZlVMKSA8PCAyNCkgfAorCQkgICAgICAoKCh1aW50MzJfdCl2YWwgJiAodWludDMyX3QpMHgwMDAwZmYwMFVMKSA8PCAgOCkgfAorCQkgICAgICAoKCh1aW50MzJfdCl2YWwgJiAodWludDMyX3QpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfAorCQkgICAgICAoKCh1aW50MzJfdCl2YWwgJiAodWludDMyX3QpMHhmZjAwMDAwMFVMKSA+PiAyNCkpOworfQorCisvKiBSZXR1cm4gYSAxNi1iaXQgbGl0dGUtZW5kaWFuIHZhbHVlIGZyb20gYSBnaXZlbiAxNi1iaXQgYmlnLWVuZGlhbiBvbmUgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgYmUxNl90b19jcHUodWludDE2X3QgdmFsKQoreworICAgIHJldHVybiAodWludDE2X3QpKCgoKHVpbnQxNl90KXZhbCAmICh1aW50MTZfdCkweDAwZmZVKSA8PCA4KSB8CisJCSAgICAgICgoKHVpbnQxNl90KXZhbCAmICh1aW50MTZfdCkweGZmMDBVKSA+PiA4KSk7Cit9CisKKyNlbmRpZiAvKiBNSVNDX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2ZzL3hmcy94ZnMuYyBiL2NvcmUvZnMveGZzL3hmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmU5NTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3hmcy94ZnMuYwpAQCAtMCwwICsxLDQzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzIFBhdWxvIEFsY2FudGFyYSA8cGNhY2pyQHp5dG9yLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2RpcmVudC5oPgorI2luY2x1ZGUgPGNhY2hlLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGRpc2suaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgPGlsb2cyLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX3JlYWRkaXIuaCIKKworc3RhdGljIGlubGluZSBpbnQgeGZzX2ZtdF9sb2NhbF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQlzdHJ1Y3QgZGlyZW50ICpkaXJlbnQsCisJCQkJCXhmc19kaW5vZGVfdCAqY29yZSkKK3sKKyAgICByZXR1cm4geGZzX3JlYWRkaXJfZGlyMl9sb2NhbChmaWxlLCBkaXJlbnQsIGNvcmUpOworfQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfZm10X2V4dGVudHNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICBzdHJ1Y3QgZGlyZW50ICpkaXJlbnQsCisJCQkJCSAgeGZzX2Rpbm9kZV90ICpjb3JlKQoreworICAgIGlmIChiZTMyX3RvX2NwdShjb3JlLT5kaV9uZXh0ZW50cykgPD0gMSkgeworCS8qIFNpbmdsZS1ibG9jayBEaXJlY3RvcmllcyAqLworCXJldHVybiB4ZnNfcmVhZGRpcl9kaXIyX2Jsb2NrKGZpbGUsIGRpcmVudCwgY29yZSk7CisgICAgfSBlbHNlIGlmICh4ZnNfZGlyMl9pc2xlYWYoZmlsZS0+ZnMsIGNvcmUpKSB7CisJLyogTGVhZiBEaXJlY3RvcnkgKi8KKwlyZXR1cm4geGZzX3JlYWRkaXJfZGlyMl9sZWFmKGZpbGUsIGRpcmVudCwgY29yZSk7CisgICAgfSBlbHNlIHsKKwkvKiBOb2RlIERpcmVjdG9yeSAqLworCXJldHVybiB4ZnNfcmVhZGRpcl9kaXIyX25vZGUoZmlsZSwgZGlyZW50LCBjb3JlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgeGZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCkKK3sKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBmaWxlLT5mczsKKyAgICB4ZnNfZGlub2RlX3QgKmNvcmU7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmlub2RlOworCisgICAgeGZzX2RlYnVnKCJmaWxlICVwIGRpcmVudCAlcCIpOworCisgICAgY29yZSA9IHhmc19kaW5vZGVfZ2V0X2NvcmUoZnMsIGlub2RlLT5pbm8pOworICAgIGlmICghY29yZSkgeworCXhmc19lcnJvcigiRmFpbGVkIHRvIGdldCBkaW5vZGUgZnJvbSBkaXNrIChpbm8gJWxseCkiLCBpbm9kZS0+aW5vKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGNvcmUtPmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKKwlyZXR1cm4geGZzX2ZtdF9sb2NhbF9yZWFkZGlyKGZpbGUsIGRpcmVudCwgY29yZSk7CisgICAgZWxzZSBpZiAoY29yZS0+ZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpCisJcmV0dXJuIHhmc19mbXRfZXh0ZW50c19yZWFkZGlyKGZpbGUsIGRpcmVudCwgY29yZSk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCB4ZnNfZ2V0ZnNzZWMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwgaW50IHNlY3RvcnMsCisJCQkgICAgIGJvb2wgKmhhdmVfbW9yZSkKK3sKKyAgICByZXR1cm4gZ2VuZXJpY19nZXRmc3NlYyhmaWxlLCBidWYsIHNlY3RvcnMsIGhhdmVfbW9yZSk7Cit9CisKK3N0YXRpYyBpbnQgeGZzX25leHRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVpbnQzMl90IGxzdGFydCkKK3sKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBpbm9kZS0+ZnM7CisgICAgeGZzX2Rpbm9kZV90ICpjb3JlID0gTlVMTDsKKyAgICB4ZnNfYm1idF9pcmVjX3QgcmVjOworICAgIGJsb2NrX3QgYm5vOworICAgIHhmc19ibWRyX2Jsb2NrX3QgKnJibG9jazsKKyAgICBpbnQgZnNpemU7CisgICAgeGZzX2JtYnRfcHRyX3QgKnBwOworICAgIHhmc19idHJlZV9ibG9ja190ICpibGs7CisgICAgdWludDE2X3QgbmV4dGVudHM7CisgICAgYmxvY2tfdCBuZXh0Ym5vOworICAgIHVpbnQzMl90IGluZGV4OworCisgICAgKHZvaWQpbHN0YXJ0OworCisgICAgeGZzX2RlYnVnKCJpbm9kZSAlcCBsc3RhcnQgJWx1IiwgaW5vZGUsIGxzdGFydCk7CisKKyAgICBjb3JlID0geGZzX2Rpbm9kZV9nZXRfY29yZShmcywgaW5vZGUtPmlubyk7CisgICAgaWYgKCFjb3JlKSB7CisJeGZzX2Vycm9yKCJGYWlsZWQgdG8gZ2V0IGRpbm9kZSBmcm9tIGRpc2sgKGlubyAlbGx4KSIsIGlub2RlLT5pbm8pOworCWdvdG8gb3V0OworICAgIH0KKworICAgIC8qIFRoZSBkYXRhIGZvcmsgY29udGFpbnMgdGhlIGZpbGUncyBkYXRhIGV4dGVudHMgKi8KKyAgICBpZiAoWEZTX1BWVChpbm9kZSktPmlfY3VyX2V4dGVudCA9PSBiZTMyX3RvX2NwdShjb3JlLT5kaV9uZXh0ZW50cykpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgaWYgKGNvcmUtPmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKSB7CisJYm1idF9pcmVjX2dldCgmcmVjLCAoeGZzX2JtYnRfcmVjX3QgKikmY29yZS0+ZGlfbGl0ZXJhbF9hcmVhWzBdICsKKwkJCQkJCVhGU19QVlQoaW5vZGUpLT5pX2N1cl9leHRlbnQrKyk7CisKKwlibm8gPSBmc2Jsb2NrX3RvX2J5dGVzKGZzLCByZWMuYnJfc3RhcnRibG9jaykgPj4gQkxPQ0tfU0hJRlQoZnMpOworCisJWEZTX1BWVChpbm9kZSktPmlfb2Zmc2V0ID0gcmVjLmJyX3N0YXJ0b2ZmOworCisJaW5vZGUtPm5leHRfZXh0ZW50LnBzdGFydCA9IGJubyA8PCBCTE9DS19TSElGVChmcykgPj4gU0VDVE9SX1NISUZUKGZzKTsKKwlpbm9kZS0+bmV4dF9leHRlbnQubGVuID0gKChyZWMuYnJfYmxvY2tjb3VudCA8PCBCTE9DS19TSElGVChmcykpICsKKwkJCQkgIFNFQ1RPUl9TSVpFKGZzKSAtIDEpID4+IFNFQ1RPUl9TSElGVChmcyk7CisgICAgfSBlbHNlIGlmIChjb3JlLT5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpIHsKKyAgICAgICAgeGZzX2RlYnVnKCJYRlNfRElOT0RFX0ZNVF9CVFJFRSIpOworICAgICAgICBpbmRleCA9IFhGU19QVlQoaW5vZGUpLT5pX2N1cl9leHRlbnQrKzsKKyAgICAgICAgcmJsb2NrID0gKHhmc19ibWRyX2Jsb2NrX3QgKikmY29yZS0+ZGlfbGl0ZXJhbF9hcmVhWzBdOworICAgICAgICBmc2l6ZSA9IFhGU19ERk9SS19TSVpFKGNvcmUsIGZzLCBYRlNfREFUQV9GT1JLKTsKKyAgICAgICAgcHAgPSBYRlNfQk1EUl9QVFJfQUREUihyYmxvY2ssIDEsIHhmc19ibWRyX21heHJlY3MoZnNpemUsIDApKTsKKyAgICAgICAgYm5vID0gZnNibG9ja190b19ieXRlcyhmcywgYmU2NF90b19jcHUocHBbMF0pKSA+PiBCTE9DS19TSElGVChmcyk7CisKKyAgICAgICAgLyogRmluZCB0aGUgbGVhZiAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBibGsgPSAoeGZzX2J0cmVlX2Jsb2NrX3QgKilnZXRfY2FjaGUoZnMtPmZzX2RldiwgYm5vKTsKKyAgICAgICAgICAgIGlmIChiZTE2X3RvX2NwdShibGstPmJiX2xldmVsKSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBwcCA9IFhGU19CTUJUX1BUUl9BRERSKGZzLCBibGssIDEsCisgICAgICAgICAgICAgICAgICAgIHhmc19ibWRyX21heHJlY3MoWEZTX0lORk8oZnMpLT5ibG9ja3NpemUsIDApKTsKKyAgICAgICAgICAgIGJubyA9IGZzYmxvY2tfdG9fYnl0ZXMoZnMsIGJlNjRfdG9fY3B1KHBwWzBdKSkgPj4gQkxPQ0tfU0hJRlQoZnMpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgcmlnaHQgZXh0ZW50IGFtb25nIHRocmVhZGVkIGxlYXZlcyAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBuZXh0Ym5vID0gYmU2NF90b19jcHUoYmxrLT5iYl91LmwuYmJfcmlnaHRzaWIpOworICAgICAgICAgICAgbmV4dGVudHMgPSBiZTE2X3RvX2NwdShibGstPmJiX251bXJlY3MpOworICAgICAgICAgICAgaWYgKG5leHRlbnRzIC0gaW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgYm1idF9pcmVjX2dldCgmcmVjLCBYRlNfQk1EUl9SRUNfQUREUihibGssIGluZGV4ICsgMSkpOworCisgICAgICAgICAgICAgICAgYm5vID0gZnNibG9ja190b19ieXRlcyhmcywgcmVjLmJyX3N0YXJ0YmxvY2spCisJCQkJCQk+PiBCTE9DS19TSElGVChmcyk7CisKKyAgICAgICAgICAgICAgICBYRlNfUFZUKGlub2RlKS0+aV9vZmZzZXQgPSByZWMuYnJfc3RhcnRvZmY7CisKKyAgICAgICAgICAgICAgICBpbm9kZS0+bmV4dF9leHRlbnQucHN0YXJ0ID0gYm5vIDw8IEJMT0NLX1NISUZUKGZzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gU0VDVE9SX1NISUZUKGZzKTsKKyAgICAgICAgICAgICAgICBpbm9kZS0+bmV4dF9leHRlbnQubGVuID0gKChyZWMuYnJfYmxvY2tjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBCTE9DS19TSElGVChmcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU0VDVE9SX1NJWkUoZnMpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gU0VDVE9SX1NISUZUKGZzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5kZXggLT0gbmV4dGVudHM7CisgICAgICAgICAgICBibm8gPSBmc2Jsb2NrX3RvX2J5dGVzKGZzLCBuZXh0Ym5vKSA+PiBCTE9DS19TSElGVChmcyk7CisgICAgICAgICAgICBibGsgPSAoeGZzX2J0cmVlX2Jsb2NrX3QgKilnZXRfY2FjaGUoZnMtPmZzX2RldiwgYm5vKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworCitvdXQ6CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqeGZzX2ZtdF9sb2NhbF9maW5kX2VudHJ5KGNvbnN0IGNoYXIgKmRuYW1lLAorCQkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKnBhcmVudCwKKwkJCQkJCSAgICAgeGZzX2Rpbm9kZV90ICpjb3JlKQoreworICAgIHJldHVybiB4ZnNfZGlyMl9sb2NhbF9maW5kX2VudHJ5KGRuYW1lLCBwYXJlbnQsIGNvcmUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqeGZzX2ZtdF9leHRlbnRzX2ZpbmRfZW50cnkoY29uc3QgY2hhciAqZG5hbWUsCisJCQkJCQkgICAgICAgc3RydWN0IGlub2RlICpwYXJlbnQsCisJCQkJCQkgICAgICAgeGZzX2Rpbm9kZV90ICpjb3JlKQoreworICAgIGlmIChiZTMyX3RvX2NwdShjb3JlLT5kaV9uZXh0ZW50cykgPD0gMSkgeworCS8qIFNpbmdsZS1ibG9jayBEaXJlY3RvcmllcyAqLworCXJldHVybiB4ZnNfZGlyMl9ibG9ja19maW5kX2VudHJ5KGRuYW1lLCBwYXJlbnQsIGNvcmUpOworICAgIH0gZWxzZSBpZiAoeGZzX2RpcjJfaXNsZWFmKHBhcmVudC0+ZnMsIGNvcmUpKSB7CisJLyogTGVhZiBEaXJlY3RvcnkgKi8KKwlyZXR1cm4geGZzX2RpcjJfbGVhZl9maW5kX2VudHJ5KGRuYW1lLCBwYXJlbnQsIGNvcmUpOworICAgIH0gZWxzZSB7CisJLyogTm9kZSBEaXJlY3RvcnkgKi8KKwlyZXR1cm4geGZzX2RpcjJfbm9kZV9maW5kX2VudHJ5KGRuYW1lLCBwYXJlbnQsIGNvcmUpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKnhmc19mbXRfYnRyZWVfZmluZF9lbnRyeShjb25zdCBjaGFyICpkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhmc19kaW5vZGVfdCAqY29yZSkKK3sKKyAgICByZXR1cm4geGZzX2RpcjJfbm9kZV9maW5kX2VudHJ5KGRuYW1lLCBwYXJlbnQsIGNvcmUpOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICp4ZnNfaWdldChjb25zdCBjaGFyICpkbmFtZSwgc3RydWN0IGlub2RlICpwYXJlbnQpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gcGFyZW50LT5mczsKKyAgICB4ZnNfZGlub2RlX3QgKmNvcmUgPSBOVUxMOworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCisgICAgeGZzX2RlYnVnKCJkbmFtZSAlcyBwYXJlbnQgJXAgcGFyZW50IGlubyAlbHUiLCBkbmFtZSwgcGFyZW50LCBwYXJlbnQtPmlubyk7CisKKyAgICBjb3JlID0geGZzX2Rpbm9kZV9nZXRfY29yZShmcywgcGFyZW50LT5pbm8pOworICAgIGlmICghY29yZSkgeworICAgICAgICB4ZnNfZXJyb3IoIkZhaWxlZCB0byBnZXQgZGlub2RlIGZyb20gZGlzayAoaW5vIDB4JWxseCkiLCBwYXJlbnQtPmlubyk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChjb3JlLT5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwlpbm9kZSA9IHhmc19mbXRfbG9jYWxfZmluZF9lbnRyeShkbmFtZSwgcGFyZW50LCBjb3JlKTsKKyAgICB9IGVsc2UgaWYgKGNvcmUtPmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKSB7CisgICAgICAgIGlub2RlID0geGZzX2ZtdF9leHRlbnRzX2ZpbmRfZW50cnkoZG5hbWUsIHBhcmVudCwgY29yZSk7CisgICAgfSBlbHNlIGlmIChjb3JlLT5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpIHsKKyAgICAgICAgaW5vZGUgPSB4ZnNfZm10X2J0cmVlX2ZpbmRfZW50cnkoZG5hbWUsIHBhcmVudCwgY29yZSk7CisgICAgfQorCisgICAgaWYgKCFpbm9kZSkgeworCXhmc19kZWJ1ZygiRW50cnkgbm90IGZvdW5kISIpOworCWdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChpbm9kZS0+bW9kZSA9PSBEVF9SRUcpIHsKKwlYRlNfUFZUKGlub2RlKS0+aV9vZmZzZXQgPSAwOworCVhGU19QVlQoaW5vZGUpLT5pX2N1cl9leHRlbnQgPSAwOworICAgIH0gZWxzZSBpZiAoaW5vZGUtPm1vZGUgPT0gRFRfRElSKSB7CisJWEZTX1BWVChpbm9kZSktPmlfYnRyZWVfb2Zmc2V0ID0gMDsKKwlYRlNfUFZUKGlub2RlKS0+aV9sZWFmX2VudF9vZmZzZXQgPSAwOworICAgIH0KKworICAgIHJldHVybiBpbm9kZTsKKworb3V0OgorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHhmc19yZWFkbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpidWYpCit7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gaW5vZGUtPmZzOworICAgIHhmc19kaW5vZGVfdCAqY29yZTsKKyAgICBpbnQgcGF0aGxlbiA9IC0xOworICAgIHhmc19ibWJ0X2lyZWNfdCByZWM7CisgICAgYmxvY2tfdCBkYjsKKyAgICBjb25zdCBjaGFyICpkaXJfYnVmOworCisgICAgeGZzX2RlYnVnKCJpbm9kZSAlcCBidWYgJXAiLCBpbm9kZSwgYnVmKTsKKworICAgIGNvcmUgPSB4ZnNfZGlub2RlX2dldF9jb3JlKGZzLCBpbm9kZS0+aW5vKTsKKyAgICBpZiAoIWNvcmUpIHsKKwl4ZnNfZXJyb3IoIkZhaWxlZCB0byBnZXQgZGlub2RlIGZyb20gZGlzayAoaW5vIDB4JWxseCkiLCBpbm9kZS0+aW5vKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICBwYXRobGVuID0gYmU2NF90b19jcHUoY29yZS0+ZGlfc2l6ZSk7CisgICAgaWYgKCFwYXRobGVuKQorCWdvdG8gb3V0OworCisgICAgaWYgKHBhdGhsZW4gPCAwIHx8IHBhdGhsZW4gPiBNQVhQQVRITEVOKSB7CisJeGZzX2Vycm9yKCJpbm9kZSAoJWxsdSkgYmFkIHN5bWxpbmsgbGVuZ3RoICglZCkiLAorCQkgIGlub2RlLT5pbm8sIHBhdGhsZW4pOworCWdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChjb3JlLT5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwltZW1jcHkoYnVmLCAoY2hhciAqKSZjb3JlLT5kaV9saXRlcmFsX2FyZWFbMF0sIHBhdGhsZW4pOworICAgIH0gZWxzZSBpZiAoY29yZS0+ZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpIHsKKwlibWJ0X2lyZWNfZ2V0KCZyZWMsICh4ZnNfYm1idF9yZWNfdCAqKSZjb3JlLT5kaV9saXRlcmFsX2FyZWFbMF0pOworCWRiID0gZnNibG9ja190b19ieXRlcyhmcywgcmVjLmJyX3N0YXJ0YmxvY2spID4+IEJMT0NLX1NISUZUKGZzKTsKKwlkaXJfYnVmID0geGZzX2RpcjJfZGlyYmxrc19nZXRfY2FjaGVkKGZzLCBkYiwgcmVjLmJyX2Jsb2NrY291bnQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFN5c2xpbnV4IG9ubHkgc3VwcG9ydHMgZmlsZXN5c3RlbSBibG9jayBzaXplIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvCisJICogNCBLaUIuIFRodXMsIG9uZSBkaXJlY3RvcnkgYmxvY2sgaXMgZmFyIGVub3VnaCB0byBob2xkIHRoZSBtYXhpbXVtCisJICogc3ltYm9saWMgbGluayBmaWxlIGNvbnRlbnQsIHdoaWNoIGlzIG9ubHkgMTAyNCBieXRlcyBsb25nLgorICAgICAgICAgKi8KKwltZW1jcHkoYnVmLCBkaXJfYnVmLCBwYXRobGVuKTsKKyAgICB9CisKK291dDoKKyAgICByZXR1cm4gcGF0aGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqeGZzX2lnZXRfcm9vdChzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisgICAgeGZzX2Rpbm9kZV90ICpjb3JlID0gTlVMTDsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0geGZzX25ld19pbm9kZShmcyk7CisKKyAgICB4ZnNfZGVidWcoIkxvb2tpbmcgZm9yIHRoZSByb290IGlub2RlLi4uIik7CisKKyAgICBjb3JlID0geGZzX2Rpbm9kZV9nZXRfY29yZShmcywgWEZTX0lORk8oZnMpLT5yb290aW5vKTsKKyAgICBpZiAoIWNvcmUpIHsKKwl4ZnNfZXJyb3IoIklub2RlIGNvcmUncyBtYWdpYyBudW1iZXIgZG9lcyBub3QgbWF0Y2ghIik7CisJeGZzX2RlYnVnKCJtYWdpYyBudW1iZXIgMHglMDR4IiwgYmUxNl90b19jcHUoY29yZS0+ZGlfbWFnaWMpKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICBmaWxsX3hmc19pbm9kZV9wdnQoZnMsIGlub2RlLCBYRlNfSU5GTyhmcyktPnJvb3Rpbm8pOworCisgICAgeGZzX2RlYnVnKCJSb290IGlub2RlIGhhcyBiZWVuIGZvdW5kISIpOworCisgICAgaWYgKChiZTE2X3RvX2NwdShjb3JlLT5kaV9tb2RlKSAmIFNfSUZNVCkgIT0gU19JRkRJUikgeworCXhmc19lcnJvcigicm9vdCBpbm9kZSBpcyBub3QgYSBkaXJlY3RvcnkgPyEgTm8gbWFrZXMgc2Vuc2UuLi4iKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICBpbm9kZS0+aW5vCQkJPSBYRlNfSU5GTyhmcyktPnJvb3Rpbm87CisgICAgaW5vZGUtPm1vZGUgCQk9IERUX0RJUjsKKyAgICBpbm9kZS0+c2l6ZSAJCT0gYmU2NF90b19jcHUoY29yZS0+ZGlfc2l6ZSk7CisKKyAgICByZXR1cm4gaW5vZGU7CisKK291dDoKKyAgICBmcmVlKGlub2RlKTsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfcmVhZF9zdXBlcmJsb2NrKHN0cnVjdCBmc19pbmZvICpmcywgeGZzX3NiX3QgKnNiKQoreworICAgIHN0cnVjdCBkaXNrICpkaXNrID0gZnMtPmZzX2Rldi0+ZGlzazsKKworICAgIGlmICghZGlzay0+cmR3cl9zZWN0b3JzKGRpc2ssIHNiLCBYRlNfU0JfREFERFIsIDEsIGZhbHNlKSkKKwlyZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB4ZnNfZnNfaW5mbyAqeGZzX25ld19zYl9pbmZvKHhmc19zYl90ICpzYikKK3sKKyAgICBzdHJ1Y3QgeGZzX2ZzX2luZm8gKmluZm87CisKKyAgICBpbmZvID0gbWFsbG9jKHNpemVvZiAqaW5mbyk7CisgICAgaWYgKCFpbmZvKQorCW1hbGxvY19lcnJvcigieGZzX2ZzX2luZm8gc3RydWN0dXJlIik7CisKKyAgICBpbmZvLT5ibG9ja3NpemUJCT0gYmUzMl90b19jcHUoc2ItPnNiX2Jsb2Nrc2l6ZSk7CisgICAgaW5mby0+YmxvY2tfc2hpZnQJCT0gc2ItPnNiX2Jsb2NrbG9nOworICAgIGluZm8tPmRpcmJsa3NpemUJCT0gMSA8PCAoc2ItPnNiX2Jsb2NrbG9nICsgc2ItPnNiX2RpcmJsa2xvZyk7CisgICAgaW5mby0+ZGlyYmxrbG9nCQk9IHNiLT5zYl9kaXJibGtsb2c7CisgICAgaW5mby0+aW5vcGJfc2hpZnQgCQk9IHNiLT5zYl9pbm9wYmxvZzsKKyAgICBpbmZvLT5hZ2Jsa19zaGlmdCAJCT0gc2ItPnNiX2FnYmxrbG9nOworICAgIGluZm8tPnJvb3Rpbm8gCQk9IGJlNjRfdG9fY3B1KHNiLT5zYl9yb290aW5vKTsKKyAgICBpbmZvLT5hZ2Jsb2NrcyAJCT0gYmUzMl90b19jcHUoc2ItPnNiX2FnYmxvY2tzKTsKKyAgICBpbmZvLT5hZ2Jsb2Nrc19zaGlmdCAJPSBzYi0+c2JfYWdibGtsb2c7CisgICAgaW5mby0+YWdjb3VudCAJCT0gYmUzMl90b19jcHUoc2ItPnNiX2FnY291bnQpOworICAgIGluZm8tPmlub2Rlc2l6ZSAJCT0gYmUxNl90b19jcHUoc2ItPnNiX2lub2Rlc2l6ZSk7CisgICAgaW5mby0+aW5vZGVfc2hpZnQgCQk9IHNiLT5zYl9pbm9kZWxvZzsKKworICAgIHJldHVybiBpbmZvOworfQorCitzdGF0aWMgaW50IHhmc19mc19pbml0KHN0cnVjdCBmc19pbmZvICpmcykKK3sKKyAgICBzdHJ1Y3QgZGlzayAqZGlzayA9IGZzLT5mc19kZXYtPmRpc2s7CisgICAgeGZzX3NiX3Qgc2I7CisgICAgc3RydWN0IHhmc19mc19pbmZvICppbmZvOworCisgICAgeGZzX2RlYnVnKCJmcyAlcCIsIGZzKTsKKworICAgIFNFQ1RPUl9TSElGVChmcykgPSBkaXNrLT5zZWN0b3Jfc2hpZnQ7CisgICAgU0VDVE9SX1NJWkUoZnMpID0gMSA8PCBTRUNUT1JfU0hJRlQoZnMpOworCisgICAgaWYgKHhmc19yZWFkX3N1cGVyYmxvY2soZnMsICZzYikpIHsKKwl4ZnNfZXJyb3IoIlN1cGVyYmxvY2sgcmVhZCBmYWlsZWQiKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoIXhmc19pc192YWxpZF9tYWdpY251bSgmc2IpKSB7CisJeGZzX2Vycm9yKCJJbnZhbGlkIHN1cGVyYmxvY2siKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICB4ZnNfZGVidWcoIm1hZ2ljbnVtIDB4JWxYIiwgYmUzMl90b19jcHUoc2Iuc2JfbWFnaWNudW0pKTsKKworICAgIGluZm8gPSB4ZnNfbmV3X3NiX2luZm8oJnNiKTsKKyAgICBpZiAoIWluZm8pIHsKKwl4ZnNfZXJyb3IoIkZhaWxlZCB0byBmaWxsIGluIGZpbGVzeXN0ZW0tc3BlY2lmaWMgaW5mbyBzdHJ1Y3R1cmUiKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICBmcy0+ZnNfaW5mbyA9IGluZm87CisKKyAgICB4ZnNfZGVidWcoImJsb2NrX3NoaWZ0ICV1IGJsb2Nrc2l6ZSAweCVsWCAoJWx1KSIsIGluZm8tPmJsb2NrX3NoaWZ0LAorCSAgICAgIGluZm8tPmJsb2Nrc2l6ZSwgaW5mby0+YmxvY2tzaXplKTsKKworICAgIHhmc19kZWJ1Zygicm9vdGlubyAweCVsbFggKCVsbHUpIiwgaW5mby0+cm9vdGlubywgaW5mby0+cm9vdGlubyk7CisKKyAgICBCTE9DS19TSElGVChmcykgPSBpbmZvLT5ibG9ja19zaGlmdDsKKyAgICBCTE9DS19TSVpFKGZzKSA9IGluZm8tPmJsb2Nrc2l6ZTsKKworICAgIGNhY2hlX2luaXQoZnMtPmZzX2RldiwgQkxPQ0tfU0hJRlQoZnMpKTsKKworICAgIFhGU19JTkZPKGZzKS0+ZGlybGVhZmJsayA9IHhmc19kaXIyX2RiX3RvX2RhKGZzLCBYRlNfRElSMl9MRUFGX0ZJUlNUREIoZnMpKTsKKworICAgIHJldHVybiBCTE9DS19TSElGVChmcyk7CisKK291dDoKKyAgICByZXR1cm4gLTE7Cit9CisKK2NvbnN0IHN0cnVjdCBmc19vcHMgeGZzX2ZzX29wcyA9IHsKKyAgICAuZnNfbmFtZQkJPSAieGZzIiwKKyAgICAuZnNfZmxhZ3MJCT0gRlNfVVNFTUVNIHwgRlNfVEhJU0lORCwKKyAgICAuZnNfaW5pdAkJPSB4ZnNfZnNfaW5pdCwKKyAgICAuaWdldF9yb290CQk9IHhmc19pZ2V0X3Jvb3QsCisgICAgLnNlYXJjaGRpcgkJPSBOVUxMLAorICAgIC5nZXRmc3NlYwkJPSB4ZnNfZ2V0ZnNzZWMsCisgICAgLm9wZW5fY29uZmlnCT0gZ2VuZXJpY19vcGVuX2NvbmZpZywKKyAgICAuY2xvc2VfZmlsZSAgICAgICAgID0gZ2VuZXJpY19jbG9zZV9maWxlLAorICAgIC5tYW5nbGVfbmFtZQk9IGdlbmVyaWNfbWFuZ2xlX25hbWUsCisgICAgLnJlYWRkaXIJCT0geGZzX3JlYWRkaXIsCisgICAgLmlnZXQJCT0geGZzX2lnZXQsCisgICAgLm5leHRfZXh0ZW50CT0geGZzX25leHRfZXh0ZW50LAorICAgIC5yZWFkbGluawkJPSB4ZnNfcmVhZGxpbmssCisgICAgLmZzX3V1aWQgICAgICAgICAgICA9IE5VTEwsCit9OwpkaWZmIC0tZ2l0IGEvY29yZS9mcy94ZnMveGZzLmggYi9jb3JlL2ZzL3hmcy94ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDk1M2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy94ZnMveGZzLmgKQEAgLTAsMCArMSw3NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMyBQYXVsbyBBbGNhbnRhcmEgPHBjYWNqckB6eXRvci5jb20+CisgKgorICogU29tZSBwYXJ0cyBib3Jyb3dlZCBmcm9tIExpbnV4IGtlcm5lbCB0cmVlIChsaW51eC9mcy94ZnMpOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBYRlNfSF8KKyNkZWZpbmUgWEZTX0hfCisKKyNpbmNsdWRlIDxkaXNrLmg+CisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKworI2RlZmluZSB4ZnNfZXJyb3IoZm10LCBhcmdzLi4uKQkJCQkJCVwKKyAgICAoewkJCQkJCQkJCVwKKwlwcmludGYoIiVzOiV1OiB4ZnMgLSBbRVJST1JdICIgZm10ICJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgIyMgYXJncyk7IFwKKyAgICB9KQorCisjZGVmaW5lIHhmc19kZWJ1ZyhmbXQsIGFyZ3MuLi4pCQkJCQkJXAorICAgICh7CQkJCQkJCQkJXAorCWRwcmludGYoIiVzOiV1OiB4ZnMgLSBbREVCVUddICIgZm10ICJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywJXAorCQkjIyBhcmdzKTsJCQkJCQlcCisgICAgfSkKKworc3RydWN0IHhmc19mc19pbmZvOworCisjZGVmaW5lIFhGU19JTkZPKGZzKSAoKHN0cnVjdCB4ZnNfZnNfaW5mbyAqKSgoZnMpLT5mc19pbmZvKSkKKyNkZWZpbmUgWEZTX1BWVChpbm8pICgoc3RydWN0IHhmc19pbm9kZSAqKSgoaW5vKS0+cHZ0KSkKKworI2RlZmluZSBYRlNfSU5PX01BU0soaykgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKDFVTEwgPDwgKGspKSAtIDEpCisjZGVmaW5lIFhGU19JTk9fT0ZGU0VUX0JJVFMoZnMpCQkoZnMpLT5pbm9wYl9zaGlmdAorI2RlZmluZSBYRlNfSU5PX0FHSU5PX0JJVFMoZnMpIFwKKyAgICAoWEZTX0lORk8oKGZzKSktPmlub3BiX3NoaWZ0ICsgWEZTX0lORk8oKGZzKSktPmFnYmxrX3NoaWZ0KQorCisjZGVmaW5lIFhGU19JTk9fVE9fQUdJTk8oZnMsIGkpIFwKKyAgICAoKHhmc19hZ2lub190KShpKSAmIFhGU19JTk9fTUFTSyhYRlNfSU5PX0FHSU5PX0JJVFMoZnMpKSkKKworI2RlZmluZSBYRlNfSU5PX1RPX0FHTk8oZnMsIGlubykgXAorICAgICgoeGZzX2FnbnVtYmVyX3QpKChpbm8pID4+IChYRlNfSU5GTygoZnMpKS0+aW5vcGJfc2hpZnQgKyBcCisJCQkJWEZTX0lORk8oKGZzKSktPmFnYmxrX3NoaWZ0KSkpCisKKyNkZWZpbmUgWEZTX0lOT19UT19PRkZTRVQoZnMsIGkpIFwKKwkoKGludCkoaSkgJiBYRlNfSU5PX01BU0soWEZTX0lOT19PRkZTRVRfQklUUyhmcykpKQorCisjZGVmaW5lIFhGU19BR05PX1RPX0ZTQihmcywgYWdubykgXAorICAgICgoYmxvY2tfdCkoKGFnbm8pIDw8IFhGU19JTkZPKChmcykpLT5hZ2Jsb2Nrc19zaGlmdCkpCisKKyNkZWZpbmUgWEZTX0FHSV9PRkZTKGZzLCBtcCkgXAorICAgICgoeGZzX2FnaV90ICopKCh1aW50OF90ICopKG1wKSArIDIgKiBTRUNUT1JfU0laRSgoZnMpKSkpCisKKyNkZWZpbmUgWEZTX0dFVF9ESVJfSU5PNChkaSkgXAorICAgICgoKHVpbnQzMl90KShkaSkuaVswXSA8PCAyNCkgfCAoKGRpKS5pWzFdIDw8IDE2KSB8ICgoZGkpLmlbMl0gPDwgOCkgfCBcCisJCSgoZGkpLmlbM10pKQorCisjZGVmaW5lIFhGU19ESV9ISShkaSkgXAorICAgICgoKHVpbnQzMl90KShkaSkuaVsxXSA8PCAxNikgfCAoKGRpKS5pWzJdIDw8IDgpIHwgKChkaSkuaVszXSkpCisKKyNkZWZpbmUgWEZTX0RJX0xPKGRpKSBcCisgICAgKCgodWludDMyX3QpKGRpKS5pWzRdIDw8IDI0KSB8ICgoZGkpLmlbNV0gPDwgMTYpIHwgKChkaSkuaVs2XSA8PCA4KSB8IFwKKwkJKChkaSkuaVs3XSkpCisKKyNkZWZpbmUgWEZTX0dFVF9ESVJfSU5POChkaSkgXAorICAgICgoKHhmc19pbm9fdClYRlNfRElfTE8oZGkpICYgMHhmZmZmZmZmZlVMTCkgfCBcCisgICAgICgoeGZzX2lub190KVhGU19ESV9ISShkaSkgPDwgMzIpKQorCisjZGVmaW5lIFhGU19GU0JfVE9fQUdOTyhmcywgZnNibm8pIFwKKyAgICAoKHhmc19hZ251bWJlcl90KSgoZnNibm8pID4+IFhGU19JTkZPKChmcykpLT5hZ2Jsa19zaGlmdCkpCisjZGVmaW5lIFhGU19GU0JfVE9fQUdCTk8oZnMsIGZzYm5vKSBcCisgICAgKCh4ZnNfYWdibG9ja190KSgoZnNibm8pICYgKHVpbnQzMl90KSgoMVVMTCA8PCBcCisJCQkJCSAgIFhGU19JTkZPKChmcykpLT5hZ2Jsa19zaGlmdCkgLSAxKSkpCisKKyNkZWZpbmUgYWdibG9ja190b19ieXRlcyhmcywgeCkgXAorICAgICgodWludDY0X3QpKHgpIDw8IEJMT0NLX1NISUZUKChmcykpKQorI2RlZmluZSBhZ2lub190b19ieXRlcyhmcywgeCkgXAorICAgICgodWludDY0X3QpKHgpIDw8IFhGU19JTkZPKChmcykpLT5pbm9kZV9zaGlmdCkKKyNkZWZpbmUgYWdudW1iZXJfdG9fYnl0ZXMoZnMsIHgpIFwKKyAgICBhZ2Jsb2NrX3RvX2J5dGVzKGZzLCAodWludDY0X3QpKHgpICogWEZTX0lORk8oKGZzKSktPmFnYmxvY2tzKQorI2RlZmluZSBmc2Jsb2NrX3RvX2J5dGVzKGZzLHgpCQkJCVwKKyAgICAoYWdudW1iZXJfdG9fYnl0ZXMoZnMsIFhGU19GU0JfVE9fQUdOTyhmcywgKHgpKSkgKwlcCisgICAgIGFnYmxvY2tfdG9fYnl0ZXMoZnMsIFhGU19GU0JfVE9fQUdCTk8oZnMsICh4KSkpKQorI2RlZmluZSBpbm9fdG9fYnl0ZXMoZnMsIHgpCQkJICAgXAorICAgIChhZ251bWJlcl90b19ieXRlcyhmcywgWEZTX0lOT19UT19BR05PKGZzLCAoeCkpKSArCVwKKyAgICAgYWdpbm9fdG9fYnl0ZXMoZnMsIFhGU19JTk9fVE9fQUdJTk8oZnMsICh4KSkpKQorCisvKiBTdXBlcmJsb2NrJ3MgTEJBICovCisjZGVmaW5lIFhGU19TQl9EQUREUiAoKHhmc19kYWRkcl90KTApIC8qIGRhZGRyIGluIGZpbGVzeXN0ZW0vYWcgKi8KKworLyogTWFnaWMgbnVtYmVycyAqLworI2RlZmluZQlYRlNfQUdJX01BR0lDIAkJIlhBR0kiCisjZGVmaW5lIFhGU19JQlRfTUFHSUMgCQkiSUFCVCIKKyNkZWZpbmUgWEZTX0RJTk9ERV9NQUdJQwkiSU4iCisKKyNkZWZpbmUgWEZTX0RJUjJfQkxPQ0tfTUFHSUMgICAgMHg1ODQ0MzI0MlUgICAgICAvKiBYRDJCOiBzaW5nbGUgYmxvY2sgZGlycyAqLworI2RlZmluZSBYRlNfRElSMl9EQVRBX01BR0lDICAgICAweDU4NDQzMjQ0VSAgICAgIC8qIFhEMkQ6IG11bHRpYmxvY2sgZGlycyAqLworI2RlZmluZSBYRlNfRElSMl9GUkVFX01BR0lDICAgICAweDU4NDQzMjQ2VSAgICAgIC8qIFhEMkY6IGZyZWUgaW5kZXggYmxvY2tzICovCisKKyNkZWZpbmUgWEZTX0RJUjJfTlVMTF9EQVRBUFRSICAgKCh1aW50MzJfdCkwKQorCisvKiBGaWxlIHR5cGVzIGFuZCBtb2RlcyAqLworI2RlZmluZSBTX0lGTVQgIAkwMDE3MDAwMAorI2RlZmluZSBTX0lGU09DSyAJMDE0MDAwMAorI2RlZmluZSBTX0lGTE5LIAkwMTIwMDAwCisjZGVmaW5lIFNfSUZSRUcgIAkwMTAwMDAwCisjZGVmaW5lIFNfSUZCTEsgIAkwMDYwMDAwCisjZGVmaW5lIFNfSUZESVIgIAkwMDQwMDAwCisjZGVmaW5lIFNfSUZDSFIgIAkwMDIwMDAwCisjZGVmaW5lIFNfSUZJRk8gIAkwMDEwMDAwCisjZGVmaW5lIFNfSVNVSUQgIAkwMDA0MDAwCisjZGVmaW5lIFNfSVNHSUQgIAkwMDAyMDAwCisjZGVmaW5lIFNfSVNWVFggIAkwMDAxMDAwCisKKyNkZWZpbmUgTUFYUEFUSExFTiAxMDI0CisvKgorICogTk9URTogVGhlIGZpZWxkcyBpbiB0aGUgc3VwZXJibG9jayBhcmUgc3RvcmVkIGluIGJpZy1lbmRpYW4gZm9ybWF0IG9uIGRpc2suCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19zYiB7CisgICAgdWludDMyX3QJc2JfbWFnaWNudW07CS8qIG1hZ2ljIG51bWJlciA9PSBYRlNfU0JfTUFHSUMgKi8KKyAgICB1aW50MzJfdAlzYl9ibG9ja3NpemU7CS8qIGxvZ2ljYWwgYmxvY2sgc2l6ZSwgYnl0ZXMgKi8KKyAgICB4ZnNfZHJmc2Jub190CXNiX2RibG9ja3M7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyAqLworICAgIHhmc19kcmZzYm5vX3QJc2JfcmJsb2NrczsJLyogbnVtYmVyIG9mIHJlYWx0aW1lIGJsb2NrcyAqLworICAgIHhmc19kcnRibm9fdAlzYl9yZXh0ZW50czsJLyogbnVtYmVyIG9mIHJlYWx0aW1lIGV4dGVudHMgKi8KKyAgICB1dWlkX3QJCXNiX3V1aWQ7CS8qIGZpbGUgc3lzdGVtIHVuaXF1ZSBpZCAqLworICAgIHhmc19kZnNibm9fdAlzYl9sb2dzdGFydDsJLyogc3RhcnRpbmcgYmxvY2sgb2YgbG9nIGlmIGludGVybmFsICovCisgICAgeGZzX2lub190CXNiX3Jvb3Rpbm87CS8qIHJvb3QgaW5vZGUgbnVtYmVyICovCisgICAgeGZzX2lub190CXNiX3JibWlubzsJLyogYml0bWFwIGlub2RlIGZvciByZWFsdGltZSBleHRlbnRzICovCisgICAgeGZzX2lub190CXNiX3JzdW1pbm87CS8qIHN1bW1hcnkgaW5vZGUgZm9yIHJ0IGJpdG1hcCAqLworICAgIHhmc19hZ2Jsb2NrX3QJc2JfcmV4dHNpemU7CS8qIHJlYWx0aW1lIGV4dGVudCBzaXplLCBibG9ja3MgKi8KKyAgICB4ZnNfYWdibG9ja190CXNiX2FnYmxvY2tzOwkvKiBzaXplIG9mIGFuIGFsbG9jYXRpb24gZ3JvdXAgKi8KKyAgICB4ZnNfYWdudW1iZXJfdAlzYl9hZ2NvdW50OwkvKiBudW1iZXIgb2YgYWxsb2NhdGlvbiBncm91cHMgKi8KKyAgICB4ZnNfZXh0bGVuX3QJc2JfcmJtYmxvY2tzOwkvKiBudW1iZXIgb2YgcnQgYml0bWFwIGJsb2NrcyAqLworICAgIHhmc19leHRsZW5fdAlzYl9sb2dibG9ja3M7CS8qIG51bWJlciBvZiBsb2cgYmxvY2tzICovCisgICAgdWludDE2X3QJc2JfdmVyc2lvbm51bTsJLyogaGVhZGVyIHZlcnNpb24gPT0gWEZTX1NCX1ZFUlNJT04gKi8KKyAgICB1aW50MTZfdAlzYl9zZWN0c2l6ZTsJLyogdm9sdW1lIHNlY3RvciBzaXplLCBieXRlcyAqLworICAgIHVpbnQxNl90CXNiX2lub2Rlc2l6ZTsJLyogaW5vZGUgc2l6ZSwgYnl0ZXMgKi8KKyAgICB1aW50MTZfdAlzYl9pbm9wYmxvY2s7CS8qIGlub2RlcyBwZXIgYmxvY2sgKi8KKyAgICBjaGFyCXNiX2ZuYW1lWzEyXTsJLyogZmlsZSBzeXN0ZW0gbmFtZSAqLworICAgIHVpbnQ4X3QJc2JfYmxvY2tsb2c7CS8qIGxvZzIgb2Ygc2JfYmxvY2tzaXplICovCisgICAgdWludDhfdAlzYl9zZWN0bG9nOwkvKiBsb2cyIG9mIHNiX3NlY3RzaXplICovCisgICAgdWludDhfdAlzYl9pbm9kZWxvZzsJLyogbG9nMiBvZiBzYl9pbm9kZXNpemUgKi8KKyAgICB1aW50OF90CXNiX2lub3BibG9nOwkvKiBsb2cyIG9mIHNiX2lub3BibG9jayAqLworICAgIHVpbnQ4X3QJc2JfYWdibGtsb2c7CS8qIGxvZzIgb2Ygc2JfYWdibG9ja3MgKHJvdW5kZWQgdXApICovCisgICAgdWludDhfdAlzYl9yZXh0c2xvZzsJLyogbG9nMiBvZiBzYl9yZXh0ZW50cyAqLworICAgIHVpbnQ4X3QJc2JfaW5wcm9ncmVzczsJLyogbWtmcyBpcyBpbiBwcm9ncmVzcywgZG9uJ3QgbW91bnQgKi8KKyAgICB1aW50OF90CXNiX2ltYXhfcGN0OwkvKiBtYXggJSBvZiBmcyBmb3IgaW5vZGUgc3BhY2UgKi8KKwkJCQkJLyogc3RhdGlzdGljcyAqLworICAgIC8qCisgICAgICogVGhlc2UgZmllbGRzIG11c3QgcmVtYWluIGNvbnRpZ3VvdXMuICBJZiB5b3UgcmVhbGx5CisgICAgICogd2FudCB0byBjaGFuZ2UgdGhlaXIgbGF5b3V0LCBtYWtlIHN1cmUgeW91IGZpeCB0aGUKKyAgICAgKiBjb2RlIGluIHhmc190cmFuc19hcHBseV9zYl9kZWx0YXMoKS4KKyAgICAgKi8KKyAgICB1aW50NjRfdAlzYl9pY291bnQ7CS8qIGFsbG9jYXRlZCBpbm9kZXMgKi8KKyAgICB1aW50NjRfdAlzYl9pZnJlZTsJLyogZnJlZSBpbm9kZXMgKi8KKyAgICB1aW50NjRfdAlzYl9mZGJsb2NrczsJLyogZnJlZSBkYXRhIGJsb2NrcyAqLworICAgIHVpbnQ2NF90CXNiX2ZyZXh0ZW50czsJLyogZnJlZSByZWFsdGltZSBleHRlbnRzICovCisgICAgLyoKKyAgICAgKiBFbmQgY29udGlndW91cyBmaWVsZHMuCisgICAgICovCisgICAgeGZzX2lub190CXNiX3VxdW90aW5vOwkvKiB1c2VyIHF1b3RhIGlub2RlICovCisgICAgeGZzX2lub190CXNiX2dxdW90aW5vOwkvKiBncm91cCBxdW90YSBpbm9kZSAqLworICAgIHVpbnQxNl90CXNiX3FmbGFnczsJLyogcXVvdGEgZmxhZ3MgKi8KKyAgICB1aW50OF90CXNiX2ZsYWdzOwkvKiBtaXNjLiBmbGFncyAqLworICAgIHVpbnQ4X3QJc2Jfc2hhcmVkX3ZuOwkvKiBzaGFyZWQgdmVyc2lvbiBudW1iZXIgKi8KKyAgICB4ZnNfZXh0bGVuX3QJc2JfaW5vYWxpZ25tdDsJLyogaW5vZGUgY2h1bmsgYWxpZ25tZW50LCBmc2Jsb2NrcyAqLworICAgIHVpbnQzMl90CXNiX3VuaXQ7CS8qIHN0cmlwZSBvciByYWlkIHVuaXQgKi8KKyAgICB1aW50MzJfdAlzYl93aWR0aDsJLyogc3RyaXBlIG9yIHJhaWQgd2lkdGggKi8KKyAgICB1aW50OF90CXNiX2RpcmJsa2xvZzsJLyogbG9nMiBvZiBkaXIgYmxvY2sgc2l6ZSAoZnNicykgKi8KKyAgICB1aW50OF90CXNiX2xvZ3NlY3Rsb2c7CS8qIGxvZzIgb2YgdGhlIGxvZyBzZWN0b3Igc2l6ZSAqLworICAgIHVpbnQxNl90CXNiX2xvZ3NlY3RzaXplOwkvKiBzZWN0b3Igc2l6ZSBmb3IgdGhlIGxvZywgYnl0ZXMgKi8KKyAgICB1aW50MzJfdAlzYl9sb2dzdW5pdDsJLyogc3RyaXBlIHVuaXQgc2l6ZSBmb3IgdGhlIGxvZyAqLworICAgIHVpbnQzMl90CXNiX2ZlYXR1cmVzMjsJLyogYWRkaXRpb25hbCBmZWF0dXJlIGJpdHMgKi8KKworICAgIC8qCisgICAgICogYmFkIGZlYXR1cmVzMiBmaWVsZCBhcyBhIHJlc3VsdCBvZiBmYWlsaW5nIHRvIHBhZCB0aGUgc2IKKyAgICAgKiBzdHJ1Y3R1cmUgdG8gNjQgYml0cy4gU29tZSBtYWNoaW5lcyB3aWxsIGJlIHVzaW5nIHRoaXMgZmllbGQKKyAgICAgKiBmb3IgZmVhdHVyZXMyIGJpdHMuIEVhc2llc3QganVzdCB0byBtYXJrIGl0IGJhZCBhbmQgbm90IHVzZQorICAgICAqIGl0IGZvciBhbnl0aGluZyBlbHNlLgorICAgICAqLworICAgIHVpbnQzMl90CXNiX2JhZF9mZWF0dXJlczI7CisgICAgdWludDhfdAlwYWRbMzA0XTsgLyogbXVzdCBiZSBwYWRkZWQgdG8gYSBzZWN0b3IgYm91bmRhcnkgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHhmc19zYl90OworCisvKiBJbi1tZW1vcnkgc3RydWN0dXJlIHRoYXQgc3RvcmVzIGZpbGVzeXN0ZW0tc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgKiBUaGUgaW5mb3JtYXRpb24gc3RvcmVkIGlzIGJhc2ljYWxseSByZXRyaWV2ZWQgZnJvbSB0aGUgWEZTIHN1cGVyYmxvY2sKKyAqIHRvIGJlIHVzZWQgc3RhdGljYWxseSBhcm91bmQgdGhlIGRyaXZlci4KKyAqLworc3RydWN0IHhmc19mc19pbmZvIHsKKyAgICB1aW50MzJfdCAJCWJsb2Nrc2l6ZTsgLyogRmlsZXN5c3RlbSBibG9jayBzaXplICovCisgICAgdWludDhfdAkJYmxvY2tfc2hpZnQ7IC8qIEZpbGVzeXN0ZW0gYmxvY2sgc2l6ZSBpbiBiaXRzICovCisgICAgdWludDMyX3QJCWRpcmJsa3NpemU7CisgICAgdWludDhfdAkJZGlyYmxrbG9nOworICAgIHVpbnQ4X3QJCWlub3BiX3NoaWZ0OworICAgIHVpbnQ4X3QJCWFnYmxrX3NoaWZ0OworICAgIHVpbnQzMl90CQlkaXJsZWFmYmxrOworCisgICAgLyogQUcgbnVtYmVyIGJpdHMgKE1TQiBvZiB0aGUgaW5vZGUgbnVtYmVyKSAqLworICAgIHVpbnQ4X3QJCWFnX251bWJlcl9pbm9fc2hpZnQ7CisKKyAgICB4ZnNfaW5vX3QgCQlyb290aW5vOyAvKiBSb290IGlub2RlIG51bWJlciBmb3IgdGhlIGZpbGVzeXN0ZW0gKi8KKyAgICB4ZnNfYWdibG9ja190CWFnYmxvY2tzOyAvKiBTaXplIG9mIGVhY2ggQUcgaW4gYmxvY2tzICovCisgICAgdWludDhfdAkJYWdibG9ja3Nfc2hpZnQ7IC8qIGFnYmxvY2tzIGluIGJpdHMgKi8KKyAgICB4ZnNfYWdudW1iZXJfdAlhZ2NvdW50OyAvKiBOdW1iZXIgb2YgQUdzIGluIHRoZSBmaWxlc3l0ZW0gKi8KKyAgICB1aW50MTZfdAkJaW5vZGVzaXplOyAvKiBTaXplIG9mIHRoZSBpbm9kZSBpbiBieXRlcyAqLworICAgIHVpbnQ4X3QJCWlub2RlX3NoaWZ0OyAvKiBJbm9kZSBzaXplIGluIGJpdHMgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYWdpIHsKKwkvKgorCSAqIENvbW1vbiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciBpbmZvcm1hdGlvbgorCSAqLworICAgIHVpbnQzMl90CQlhZ2lfbWFnaWNudW07CS8qIG1hZ2ljIG51bWJlciA9PSBYRlNfQUdJX01BR0lDICovCisgICAgdWludDMyX3QJCWFnaV92ZXJzaW9ubnVtOwkvKiBoZWFkZXIgdmVyc2lvbiA9PSBYRlNfQUdJX1ZFUlNJT04gKi8KKyAgICB1aW50MzJfdAkJYWdpX3NlcW5vOwkvKiBzZXF1ZW5jZSAjIHN0YXJ0aW5nIGZyb20gMCAqLworICAgIHVpbnQzMl90CQlhZ2lfbGVuZ3RoOwkvKiBzaXplIGluIGJsb2NrcyBvZiBhLmcuICovCisgICAgLyoKKyAgICAgKiBJbm9kZSBpbmZvcm1hdGlvbgorICAgICAqIElub2RlcyBhcmUgbWFwcGVkIGJ5IGludGVycHJldGluZyB0aGUgaW5vZGUgbnVtYmVyLCBzbyBubworICAgICAqIG1hcHBpbmcgZGF0YSBpcyBuZWVkZWQgaGVyZS4KKyAgICAgKi8KKyAgICB1aW50MzJfdAkJYWdpX2NvdW50OwkvKiBjb3VudCBvZiBhbGxvY2F0ZWQgaW5vZGVzICovCisgICAgdWludDMyX3QJCWFnaV9yb290OwkvKiByb290IG9mIGlub2RlIGJ0cmVlICovCisgICAgdWludDMyX3QJCWFnaV9sZXZlbDsJLyogbGV2ZWxzIGluIGlub2RlIGJ0cmVlICovCisgICAgdWludDMyX3QJCWFnaV9mcmVlY291bnQ7CS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLworICAgIHVpbnQzMl90CQlhZ2lfbmV3aW5vOwkvKiBuZXcgaW5vZGUganVzdCBhbGxvY2F0ZWQgKi8KKyAgICB1aW50MzJfdAkJYWdpX2RpcmlubzsJLyogbGFzdCBkaXJlY3RvcnkgaW5vZGUgY2h1bmsgKi8KKyAgICAvKgorICAgICAqIEhhc2ggdGFibGUgb2YgaW5vZGVzIHdoaWNoIGhhdmUgYmVlbiB1bmxpbmtlZCBidXQgYXJlCisgICAgICogc3RpbGwgYmVpbmcgcmVmZXJlbmNlZC4KKyAgICAgKi8KKyAgICB1aW50MzJfdAkJYWdpX3VubGlua2VkW1hGU19BR0lfVU5MSU5LRURfQlVDS0VUU107Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfYWdpX3Q7CisKKy8qCisgKiBCbWFwIGJ0cmVlIHJlY29yZCBhbmQgZXh0ZW50IGRlc2NyaXB0b3IuCisgKiAgbDA6NjMgaXMgYW4gZXh0ZW50IGZsYWcgKHZhbHVlIDEgaW5kaWNhdGVzIG5vbi1ub3JtYWwpLgorICogIGwwOjktNjIgYXJlIHN0YXJ0b2ZmLgorICogIGwwOjAtOCBhbmQgbDE6MjEtNjMgYXJlIHN0YXJ0YmxvY2suCisgKiAgbDE6MC0yMCBhcmUgYmxvY2tjb3VudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtYnRfcmVjIHsKKyAgICB1aW50NjRfdCBsMDsKKyAgICB1aW50NjRfdCBsMTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHhmc19ibWJ0X3JlY190OworCit0eXBlZGVmIHhmc19ibWJ0X3JlY190IHhmc19ibWRyX3JlY190OworCisvKgorICogUG9zc2libGUgZXh0ZW50IHN0YXRlcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBYRlNfRVhUX05PUk0sCisgICAgWEZTX0VYVF9VTldSSVRURU4sCisgICAgWEZTX0VYVF9ETUFQSV9PRkZMSU5FLAorICAgIFhGU19FWFRfSU5WQUxJRCwKK30geGZzX2V4bnRzdF90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYm1idF9pcmVjCit7CisgICAgeGZzX2ZpbGVvZmZfdCBicl9zdGFydG9mZjsgICAgLyogc3RhcnRpbmcgZmlsZSBvZmZzZXQgKi8KKyAgICB4ZnNfZnNibG9ja190IGJyX3N0YXJ0YmxvY2s7ICAvKiBzdGFydGluZyBibG9jayBudW1iZXIgKi8KKyAgICB4ZnNfZmlsYmxrc190IGJyX2Jsb2NrY291bnQ7ICAvKiBudW1iZXIgb2YgYmxvY2tzICovCisgICAgeGZzX2V4bnRzdF90ICBicl9zdGF0ZTsgICAgICAgLyogZXh0ZW50IHN0YXRlICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfYm1idF9pcmVjX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibWJ0X2lyZWNfZ2V0KHhmc19ibWJ0X2lyZWNfdCAqZGVzdCwKKwkJCQkgY29uc3QgeGZzX2JtYnRfcmVjX3QgKnNyYykKK3sKKyAgICB1aW50NjRfdCBsMCwgbDE7CisKKyAgICBsMCA9IGJlNjRfdG9fY3B1KHNyYy0+bDApOworICAgIGwxID0gYmU2NF90b19jcHUoc3JjLT5sMSk7CisKKyAgICBkZXN0LT5icl9zdGFydG9mZiA9ICgoeGZzX2ZpbGVvZmZfdClsMCAmIDB4N2ZmZmZmZmZmZmZmZmUwMFVMTCkgPj4gOTsKKyAgICBkZXN0LT5icl9zdGFydGJsb2NrID0gKCgoeGZzX2ZzYmxvY2tfdClsMCAmIDB4MDAwMDAwMDAwMDAwMDFmZlVMTCkgPDwgNDMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeGZzX2ZzYmxvY2tfdClsMSkgPj4gMjEpOworICAgIGRlc3QtPmJyX2Jsb2NrY291bnQgPSAoeGZzX2ZpbGJsa3NfdCkobDEgJiAweDAwMDAwMDAwMDAxZmZmZmZVTEwpOworICAgIGRlc3QtPmJyX3N0YXRlID0gKGwwICYgMHg4MDAwMDAwMDAwMDAwMDAwVUxMKSA/CisJCQkJCVhGU19FWFRfVU5XUklUVEVOIDogWEZTX0VYVF9OT1JNOworfQorCit0eXBlZGVmIHN0cnVjdCB4ZnNfdGltZXN0YW1wIHsKKyAgICBpbnQzMl90IHRfc2VjOworICAgIGludDMyX3QgdF9uc2VjOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgeGZzX3RpbWVzdGFtcF90OworCisvKgorICogRm9yayBpZGVudGlmaWVycy4KKyAqLworI2RlZmluZSBYRlNfREFUQV9GT1JLIDAKKyNkZWZpbmUgeEZTX0FUVFJfRk9SSyAxCisKK3R5cGVkZWYgZW51bSB4ZnNfZGlub2RlX2ZtdCB7CisgICAgWEZTX0RJTk9ERV9GTVRfREVWLAorICAgIFhGU19ESU5PREVfRk1UX0xPQ0FMLAorICAgIFhGU19ESU5PREVfRk1UX0VYVEVOVFMsCisgICAgWEZTX0RJTk9ERV9GTVRfQlRSRUUsCisgICAgWEZTX0RJTk9ERV9GTVRfVVVJRCwKK30geGZzX2Rpbm9kZV9mbXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpbm9kZSB7CisgICAgdWludDE2X3QJCWRpX21hZ2ljOwkvKiBpbm9kZSBtYWdpYyAjID0gWEZTX0RJTk9ERV9NQUdJQyAqLworICAgIHVpbnQxNl90CQlkaV9tb2RlOwkvKiBtb2RlIGFuZCB0eXBlIG9mIGZpbGUgKi8KKyAgICB1aW50OF90CQlkaV92ZXJzaW9uOwkvKiBpbm9kZSB2ZXJzaW9uICovCisgICAgdWludDhfdAkJZGlfZm9ybWF0OwkvKiBmb3JtYXQgb2YgZGlfYyBkYXRhICovCisgICAgdWludDE2X3QJCWRpX29ubGluazsJLyogb2xkIG51bWJlciBvZiBsaW5rcyB0byBmaWxlICovCisgICAgdWludDMyX3QJCWRpX3VpZDsJCS8qIG93bmVyJ3MgdXNlciBpZCAqLworICAgIHVpbnQzMl90CQlkaV9naWQ7CQkvKiBvd25lcidzIGdyb3VwIGlkICovCisgICAgdWludDMyX3QJCWRpX25saW5rOwkvKiBudW1iZXIgb2YgbGlua3MgdG8gZmlsZSAqLworICAgIHVpbnQxNl90CQlkaV9wcm9qaWRfbG87CS8qIGxvd2VyIHBhcnQgb2Ygb3duZXIncyBwcm9qZWN0IGlkICovCisgICAgdWludDE2X3QJCWRpX3Byb2ppZF9oaTsJLyogaGlnaGVyIHBhcnQgb3duZXIncyBwcm9qZWN0IGlkICovCisgICAgdWludDhfdAkJZGlfcGFkWzZdOwkvKiB1bnVzZWQsIHplcm9lZCBzcGFjZSAqLworICAgIHVpbnQxNl90CQlkaV9mbHVzaGl0ZXI7CS8qIGluY3JlbWVudGVkIG9uIGZsdXNoICovCisgICAgeGZzX3RpbWVzdGFtcF90CWRpX2F0aW1lOwkvKiB0aW1lIGxhc3QgYWNjZXNzZWQgKi8KKyAgICB4ZnNfdGltZXN0YW1wX3QJZGlfbXRpbWU7CS8qIHRpbWUgbGFzdCBtb2RpZmllZCAqLworICAgIHhmc190aW1lc3RhbXBfdAlkaV9jdGltZTsJLyogdGltZSBjcmVhdGVkL2lub2RlIG1vZGlmaWVkICovCisgICAgdWludDY0X3QJCWRpX3NpemU7CS8qIG51bWJlciBvZiBieXRlcyBpbiBmaWxlICovCisgICAgdWludDY0X3QJCWRpX25ibG9ja3M7CS8qICMgb2YgZGlyZWN0ICYgYnRyZWUgYmxvY2tzIHVzZWQgKi8KKyAgICB1aW50MzJfdAkJZGlfZXh0c2l6ZTsJLyogYmFzaWMvbWluaW11bSBleHRlbnQgc2l6ZSBmb3IgZmlsZSAqLworICAgIHVpbnQzMl90CQlkaV9uZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gZGF0YSBmb3JrICovCisgICAgdWludDE2X3QJCWRpX2FuZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gYXR0cmlidXRlIGZvcmsqLworICAgIHVpbnQ4X3QJCWRpX2ZvcmtvZmY7CS8qIGF0dHIgZm9yayBvZmZzLCA8PDMgZm9yIDY0YiBhbGlnbiAqLworICAgIGludDhfdAkJZGlfYWZvcm1hdDsJLyogZm9ybWF0IG9mIGF0dHIgZm9yaydzIGRhdGEgKi8KKyAgICB1aW50MzJfdAkJZGlfZG1ldm1hc2s7CS8qIERNSUcgZXZlbnQgbWFzayAqLworICAgIHVpbnQxNl90CQlkaV9kbXN0YXRlOwkvKiBETUlHIHN0YXRlIGluZm8gKi8KKyAgICB1aW50MTZfdAkJZGlfZmxhZ3M7CS8qIHJhbmRvbSBmbGFncywgWEZTX0RJRkxBR18uLi4gKi8KKyAgICB1aW50MzJfdAkJZGlfZ2VuOwkJLyogZ2VuZXJhdGlvbiBudW1iZXIgKi8KKworICAgIC8qIGRpX25leHRfdW5saW5rZWQgaXMgdGhlIG9ubHkgbm9uLWNvcmUgZmllbGQgaW4gdGhlIG9sZCBkaW5vZGUgKi8KKyAgICB1aW50MzJfdAkJZGlfbmV4dF91bmxpbmtlZDsvKiBhZ2kgdW5saW5rZWQgbGlzdCBwdHIgKi8KKyAgICB1aW50OF90CQlkaV9saXRlcmFsX2FyZWFbMV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHhmc19kaW5vZGVfdDsKKworLyoKKyAqIElub2RlIHNpemUgZm9yIGdpdmVuIGZzLgorICovCisjZGVmaW5lIFhGU19MSVRJTk8oZnMpIFwKKyAgICAgICAgKChpbnQpKChYRlNfSU5GTyhmcyktPmlub2Rlc2l6ZSkgLSBzaXplb2Yoc3RydWN0IHhmc19kaW5vZGUpIC0gMSkpCisKKyNkZWZpbmUgWEZTX0JST09UX1NJWkVfQURKIFwKKyAgICAgICAgKFhGU19CVFJFRV9MQkxPQ0tfTEVOIC0gc2l6ZW9mKHhmc19ibWRyX2Jsb2NrX3QpKQorCisvKgorICogSW5vZGUgZGF0YSAmIGF0dHJpYnV0ZSBmb3JrIHNpemVzLCBwZXIgaW5vZGUuCisgKi8KKyNkZWZpbmUgWEZTX0RGT1JLX1EoZGlwKQkoKGRpcCktPmRpX2ZvcmtvZmYgIT0gMCkKKyNkZWZpbmUgWEZTX0RGT1JLX0JPRkYoZGlwKQkoKGludCkoKGRpcCktPmRpX2ZvcmtvZmYgPDwgMykpCisKKyNkZWZpbmUgWEZTX0RGT1JLX0RTSVpFKGRpcCwgZnMpIFwKKyAgICAgICAgKFhGU19ERk9SS19RKGRpcCkgPyBcCisgICAgICAgICAgICAgICAgWEZTX0RGT1JLX0JPRkYoZGlwKSA6IFwKKyAgICAgICAgICAgICAgICBYRlNfTElUSU5PKGZzKSkKKyNkZWZpbmUgWEZTX0RGT1JLX0FTSVpFKGRpcCwgZnMpIFwKKyAgICAgICAgKFhGU19ERk9SS19RKGRpcCkgPyBcCisgICAgICAgICAgICAgICAgWEZTX0xJVElOTyhmcykgLSBYRlNfREZPUktfQk9GRihkaXApIDogXAorICAgICAgICAgICAgICAgIDApCisjZGVmaW5lIFhGU19ERk9SS19TSVpFKGRpcCwgZnMsIHcpIFwKKyAgICAgICAgKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAorICAgICAgICAgICAgICAgIFhGU19ERk9SS19EU0laRShkaXAsIGZzKSA6IFwKKyAgICAgICAgICAgICAgICBYRlNfREZPUktfQVNJWkUoZGlwLCBmcykpCisKK3N0cnVjdCB4ZnNfaW5vZGUgeworICAgIHhmc19hZ2Jsb2NrX3QgCWlfYWdibG9jazsKKyAgICBibG9ja190CQlpX2lub19ibGs7CisgICAgdWludDY0X3QJCWlfYmxvY2tfb2Zmc2V0OworICAgIHVpbnQ2NF90CQlpX29mZnNldDsKKyAgICB1aW50MzJfdAkJaV9jdXJfZXh0ZW50OworICAgIHVpbnQzMl90CQlpX2J0cmVlX29mZnNldDsKKyAgICB1aW50MTZfdAkJaV9sZWFmX2VudF9vZmZzZXQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7IHVpbnQ4X3QgaVs4XTsgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgeGZzX2RpcjJfaW5vOF90OwordHlwZWRlZiBzdHJ1Y3QgeyB1aW50OF90IGlbNF07IH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHhmc19kaXIyX2lubzRfdDsKKwordHlwZWRlZiB1bmlvbiB7CisgICAgeGZzX2RpcjJfaW5vOF90IGk4OworICAgIHhmc19kaXIyX2lubzRfdCBpNDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHhmc19kaXIyX2lub3VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeyB1aW50OF90IGlbMl07IH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHhmc19kaXIyX3NmX29mZl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9zZl9oZHIgeworICAgIHVpbnQ4X3QJCWNvdW50OwkJLyogY291bnQgb2YgZW50cmllcyAqLworICAgIHVpbnQ4X3QgICAgICAgICAgIAlpOGNvdW50OyAgICAgICAgLyogY291bnQgb2YgOC1ieXRlIGlub2RlICNzICovCisgICAgeGZzX2RpcjJfaW5vdV90ICAgICBwYXJlbnQ7ICAgICAgICAgLyogcGFyZW50IGRpciBpbm9kZSBudW1iZXIgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHhmc19kaXIyX3NmX2hkcl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9zZl9lbnRyeSB7CisgICAgdWludDhfdCAgICAgICAgICAgICBuYW1lbGVuOyAgICAgICAgLyogYWN0dWFsIG5hbWUgbGVuZ3RoICovCisgICAgeGZzX2RpcjJfc2Zfb2ZmX3QgICBvZmZzZXQ7ICAgICAgICAgLyogc2F2ZWQgb2Zmc2V0ICovCisgICAgdWludDhfdCAgICAgICAgICAgICBuYW1lWzFdOyAgICAgICAgLyogbmFtZSwgdmFyaWFibGUgc2l6ZSAqLworICAgIHhmc19kaXIyX2lub3VfdAlpbnVtYmVyOwkvKiBpbm9kZSBudW1iZXIsIHZhci4gb2Zmc2V0ICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfZGlyMl9zZl9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9zZiB7CisgICAgeGZzX2RpcjJfc2ZfaGRyX3QgICAgICAgaGRyOyAgICAgICAgICAgIC8qIHNob3J0Zm9ybSBoZWFkZXIgKi8KKyAgICB4ZnNfZGlyMl9zZl9lbnRyeV90ICAgICBsaXN0WzFdOyAgICAgICAgLyogc2hvcnRmb3JtIGVudHJpZXMgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHhmc19kaXIyX3NmX3Q7CisKK3R5cGVkZWYgeGZzX2lub190CXhmc19pbnRpbm9fdDsKKworc3RhdGljIGlubGluZSB4ZnNfaW50aW5vX3QgeGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLAorCQkJCQkJICAgeGZzX2RpcjJfaW5vdV90ICpmcm9tKQoreworICAgIHJldHVybiAoKHNmcCktPmhkci5pOGNvdW50ID09IDAgPyBcCisJICAgICh4ZnNfaW50aW5vX3QpWEZTX0dFVF9ESVJfSU5PNCgoZnJvbSktPmk0KSA6IFwKKwkgICAgKHhmc19pbnRpbm9fdClYRlNfR0VUX0RJUl9JTk84KChmcm9tKS0+aTgpKTsKK30KKworLyoKKyAqIERJUjIgRGF0YSBibG9jayBzdHJ1Y3R1cmVzLgorICoKKyAqIEEgcHVyZSBkYXRhIGJsb2NrIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZyBkcmF3aW5nIG9uIGRpc2s6CisgKgorICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICB8IHhmc19kaXIyX2RhdGFfaGRyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCB4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgT1IgeGZzX2RpcjJfZGF0YV91bnVzZWRfdCB8CisgKiAgICB8IHhmc19kaXIyX2RhdGFfZW50cnlfdCBPUiB4ZnNfZGlyMl9kYXRhX3VudXNlZF90IHwKKyAqICAgIHwgeGZzX2RpcjJfZGF0YV9lbnRyeV90IE9SIHhmc19kaXIyX2RhdGFfdW51c2VkX3QgfAorICogICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgIHwgdW51c2VkIHNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogQXMgYWxsIHRoZSBlbnRyaWVzIGFyZSB2YXJpYWJsZSBzaXplIHN0cnVjdHVyZSB0aGUgYWNjZXNzb3JzIGJlbG93IHNob3VsZAorICogYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlbS4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byB0aGUgcHVyZSBkYXRhIGJsb2NrcyBmb3IgdGhlIGRhdGEgYW5kIG5vZGUgZm9ybWF0cy4KKyAqIG1vc3Qgc3RydWN0dXJlcyBhcmUgYWxzbyB1c2VkIGZvciB0aGUgY29tYmluZWQgZGF0YS9mcmVlc3BhY2UgImJsb2NrIgorICogZm9ybWF0IGJlbG93LgorICovCisjZGVmaW5lIFhGU19ESVIyX0RBVEFfQUxJR05fTE9HIDMKKyNkZWZpbmUgWEZTX0RJUjJfREFUQV9BTElHTiAgICAgKDEgPDwgWEZTX0RJUjJfREFUQV9BTElHTl9MT0cpCisjZGVmaW5lIFhGU19ESVIyX0RBVEFfRlJFRV9UQUcgIDB4ZmZmZgorI2RlZmluZSBYRlNfRElSMl9EQVRBX0ZEX0NPVU5UICAzCisKKy8qCisgKiBEaXJlY3RvcnkgYWRkcmVzcyBzcGFjZSBkaXZpZGVkIGludG8gc2VjdGlvbnMuCisgKiBzcGFjZXMgc2VwYXJhdGVkIGJ5IDMyR0IuCisgKi8KKyNkZWZpbmUgWEZTX0RJUjJfU1BBQ0VfU0laRQkoMVVMTCA8PCAoMzIgKyBYRlNfRElSMl9EQVRBX0FMSUdOX0xPRykpCisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2RhdGFfZnJlZSB7CisgICAgdWludDE2X3Qgb2Zmc2V0OworICAgIHVpbnQxNl90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHhmc19kaXIyX2RhdGFfZnJlZV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2hkciB7CisgICAgdWludDMyX3QgbWFnaWM7CisgICAgeGZzX2RpcjJfZGF0YV9mcmVlX3QgYmVzdGZyZWVbWEZTX0RJUjJfREFUQV9GRF9DT1VOVF07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfZGlyMl9kYXRhX2hkcl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2VudHJ5IHsKKyAgICB1aW50NjRfdCBpbnVtYmVyOyAvKiBpbm9kZSBudW1iZXIgKi8KKyAgICB1aW50OF90ICBuYW1lbGVuOyAvKiBuYW1lIGxlbmd0aCAqLworICAgIHVpbnQ4X3QgIG5hbWVbXTsgIC8qIG5hbWUgdHlwZXMsIG5vIG51bGwgKi8KKyAvKiB1aW50MTZfdCB0YWc7ICovICAvKiBzdGFydGluZyBvZmZzZXQgb2YgdXMgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIHhmc19kaXIyX2RhdGFfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfZGF0YV91bnVzZWQgeworICAgIHVpbnQxNl90IGZyZWV0YWc7IC8qIFhGU19ESVIyX0RBVEFfRlJFRV9UQUcgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7ICAvKiB0b3RhbCBmcmVlIGxlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlhYmxlIG9mZnNldCAqLworIC8qIHVpbnQxNl90IHRhZzsgKi8gIC8qIHN0YXJ0aW5nIG9mZnNldCBvZiB1cyAqLworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgeGZzX2RpcjJfZGF0YV91bnVzZWRfdDsKKworLyoqCisgKiByb2wzMiAtIHJvdGF0ZSBhIDMyLWJpdCB2YWx1ZSBsZWZ0CisgKiBAd29yZDogdmFsdWUgdG8gcm90YXRlCisgKiBAc2hpZnQ6IGJpdHMgdG8gcm9sbAorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHJvbDMyKHVpbnQzMl90IHdvcmQsIHNpZ25lZCBpbnQgc2hpZnQpCit7CisgICAgcmV0dXJuICh3b3JkIDw8IHNoaWZ0KSB8ICh3b3JkID4+ICgzMiAtIHNoaWZ0KSk7Cit9CisKKyNkZWZpbmUgcm91bmR1cCh4LCB5KSAoCQkJCQlcCit7CQkJCQkJCVwKKwljb25zdCB0eXBlb2YoeSkgX195ID0geTsJCQlcCisJKCgoeCkgKyAoX195IC0gMSkpIC8gX195KSAqIF9feTsJCVwKK30JCQkJCQkJXAorKQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyMl9kYXRhX2VudHNpemUoaW50IG4pCit7CisgICAgcmV0dXJuIChpbnQpcm91bmR1cChvZmZzZXRvZihzdHJ1Y3QgeGZzX2RpcjJfZGF0YV9lbnRyeSwgbmFtZVswXSkgKyBuICsgCisJCQkodW5zaWduZWQgaW50KXNpemVvZih1aW50MTZfdCksIFhGU19ESVIyX0RBVEFfQUxJR04pOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQxNl90ICoKK3hmc19kaXIyX2RhdGFfZW50cnlfdGFnX3Aoc3RydWN0IHhmc19kaXIyX2RhdGFfZW50cnkgKmRlcCkKK3sKKyAgICByZXR1cm4gKHVpbnQxNl90ICopKChjaGFyICopZGVwICsKKwkgICAgeGZzX2RpcjJfZGF0YV9lbnRzaXplKGRlcC0+bmFtZWxlbikgLSBzaXplb2YodWludDE2X3QpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCAqCit4ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcChzdHJ1Y3QgeGZzX2RpcjJfZGF0YV91bnVzZWQgKmR1cCkKK3sKKyAgICByZXR1cm4gKHVpbnQxNl90ICopKChjaGFyICopZHVwICsKKwkgICAgYmUxNl90b19jcHUoZHVwLT5sZW5ndGgpIC0gc2l6ZW9mKHVpbnQxNl90KSk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2Jsb2NrX3RhaWwgeworICAgIHVpbnQzMl90IAkJY291bnQ7CQkJLyogY291bnQgb2YgbGVhZiBlbnRyaWVzICovCisgICAgdWludDMyX3QgCQlzdGFsZTsJCQkvKiBjb3VudCBvZiBzdGFsZSBsZiBlbnRyaWVzICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfZGlyMl9ibG9ja190YWlsX3Q7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHhmc19kaXIyX2Jsb2NrX3RhaWwgKgoreGZzX2RpcjJfYmxvY2tfdGFpbF9wKHN0cnVjdCB4ZnNfZnNfaW5mbyAqZnNfaW5mbywgc3RydWN0IHhmc19kaXIyX2RhdGFfaGRyICpoZHIpCit7CisgICAgcmV0dXJuICgoc3RydWN0IHhmc19kaXIyX2Jsb2NrX3RhaWwgKikKKwkgICAgKChjaGFyICopaGRyICsgZnNfaW5mby0+ZGlyYmxrc2l6ZSkpIC0gMTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAoreGZzX2RpcjJfZGJfdG9fZGEoc3RydWN0IGZzX2luZm8gKmZzLCB1aW50MzJfdCBkYikKK3sKKyAgICByZXR1cm4gZGIgPDwgWEZTX0lORk8oZnMpLT5kaXJibGtsb2c7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdAoreGZzX2RpcjJfZGF0YXB0cl90b19ieXRlKHVpbnQzMl90IGRwKQoreworICAgIHJldHVybiAoaW50NjRfdClkcCA8PCBYRlNfRElSMl9EQVRBX0FMSUdOX0xPRzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAoreGZzX2RpcjJfYnl0ZV90b19kYihzdHJ1Y3QgZnNfaW5mbyAqZnMsIGludDY0X3QgYnkpCit7CisgICAgcmV0dXJuICh1aW50MzJfdCkKKwkgICAgKGJ5ID4+IChYRlNfSU5GTyhmcyktPmJsb2NrX3NoaWZ0ICsgWEZTX0lORk8oZnMpLT5kaXJibGtsb2cpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAoreGZzX2RpcjJfZGF0YXB0cl90b19kYihzdHJ1Y3QgZnNfaW5mbyAqZnMsIHVpbnQzMl90IGRwKQoreworICAgIHJldHVybiB4ZnNfZGlyMl9ieXRlX3RvX2RiKGZzLCB4ZnNfZGlyMl9kYXRhcHRyX3RvX2J5dGUoZHApKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK3hmc19kaXIyX2J5dGVfdG9fb2ZmKHN0cnVjdCBmc19pbmZvICpmcywgaW50NjRfdCBieSkKK3sKKyAgICByZXR1cm4gKHVuc2lnbmVkIGludCkoYnkgJgorICAgICAgICAoKCAxIDw8IChYRlNfSU5GTyhmcyktPmJsb2NrX3NoaWZ0ICsgWEZTX0lORk8oZnMpLT5kaXJibGtsb2cpKSAtIDEpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK3hmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKHN0cnVjdCBmc19pbmZvICpmcywgdWludDMyX3QgZHApCit7CisgICAgcmV0dXJuIHhmc19kaXIyX2J5dGVfdG9fb2ZmKGZzLCB4ZnNfZGlyMl9kYXRhcHRyX3RvX2J5dGUoZHApKTsKK30KKworI2RlZmluZSBYRlNfRElSMl9MRUFGX1NQQUNFCTEKKyNkZWZpbmUgWEZTX0RJUjJfTEVBRl9PRkZTRVQJKFhGU19ESVIyX0xFQUZfU1BBQ0UgKiBYRlNfRElSMl9TUEFDRV9TSVpFKQorI2RlZmluZSBYRlNfRElSMl9MRUFGX0ZJUlNUREIoZnMpCVwKKwl4ZnNfZGlyMl9ieXRlX3RvX2RiKGZzLCBYRlNfRElSMl9MRUFGX09GRlNFVCkKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX2Jsa2luZm8geworICAgIHVpbnQzMl90CQlmb3J3OworICAgIHVpbnQzMl90IAkJYmFjazsKKyAgICB1aW50MTZfdAkJbWFnaWM7CisgICAgdWludDE2X3QJIAlwYWQ7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfZGFfYmxraW5mb190OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9sZWFmX2hkciB7CisgICAgeGZzX2RhX2Jsa2luZm9fdAlpbmZvOworICAgIHVpbnQxNl90CQljb3VudDsKKyAgICB1aW50MTZfdAkJc3RhbGU7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfZGlyMl9sZWFmX2hkcl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5IHsKKyAgICB1aW50MzJfdAkJaGFzaHZhbDsJCS8qIGhhc2ggdmFsdWUgb2YgbmFtZSAqLworICAgIHVpbnQzMl90CQlhZGRyZXNzOwkJLyogYWRkcmVzcyBvZiBkYXRhIGVudHJ5ICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfZGlyMl9sZWFmX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2xlYWYgeworICAgIHhmc19kaXIyX2xlYWZfaGRyX3QgCWhkcjsJLyogbGVhZiBoZWFkZXIgKi8KKyAgICB4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJZW50c1tdOwkvKiBlbnRyaWVzICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfZGlyMl9sZWFmX3Q7CisKKyNkZWZpbmUgWEZTX0RBX05PREVfTUFHSUMJMHhmZWJlVQkvKiBtYWdpYyBudW1iZXI6IG5vbi1sZWFmIGJsb2NrcyAqLworI2RlZmluZSBYRlNfQVRUUl9MRUFGX01BR0lDCTB4ZmJlZVUJLyogbWFnaWMgbnVtYmVyOiBhdHRyaWJ1dGUgbGVhZiBibGtzICovCisjZGVmaW5lIFhGU19ESVIyX0xFQUYxX01BR0lDCTB4ZDJmMVUgLyogbWFnaWMgbnVtYmVyOiB2MiBkaXJsZiBzaW5nbGUgYmxrcyAqLworI2RlZmluZSBYRlNfRElSMl9MRUFGTl9NQUdJQwkweGQyZmZVCS8qIG1hZ2ljIG51bWJlcjogVjIgZGlybGYgbXVsdGkgYmxrcyAqLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGFfaW50bm9kZSB7CisgICAgc3RydWN0IHhmc19kYV9ub2RlX2hkciB7CS8qIGNvbnN0YW50LXN0cnVjdHVyZSBoZWFkZXIgYmxvY2sgKi8KKwl4ZnNfZGFfYmxraW5mb190IGluZm87CS8qIGJsb2NrIHR5cGUsIGxpbmtzLCBldGMuICovCisJdWludDE2X3QgY291bnQ7CQkvKiBjb3VudCBvZiBhY3RpdmUgZW50cmllcyAqLworCXVpbnQxNl90IGxldmVsOwkJLyogbGV2ZWwgYWJvdmUgbGVhdmVzIChsZWFmID09IDApICovCisgICAgfSBoZHI7CisgICAgc3RydWN0IHhmc19kYV9ub2RlX2VudHJ5IHsKKwl1aW50MzJfdCBoYXNodmFsOwkvKiBoYXNoIHZhbHVlIGZvciB0aGlzIGRlc2NlbmRhbnQgKi8KKwl1aW50MzJfdCBiZWZvcmU7CS8qIEJ0cmVlIGJsb2NrIGJlZm9yZSB0aGlzIGtleSAqLworICAgIH0gYnRyZWVbMV07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSB4ZnNfZGFfaW50bm9kZV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGFfbm9kZV9oZHIgeGZzX2RhX25vZGVfaGRyX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfZGFfbm9kZV9lbnRyeSB4ZnNfZGFfbm9kZV9lbnRyeV90OworCitzdGF0aWMgaW5saW5lIGJvb2wgeGZzX2lzX3ZhbGlkX21hZ2ljbnVtKGNvbnN0IHhmc19zYl90ICpzYikKK3sKKyAgICByZXR1cm4gc2ItPnNiX21hZ2ljbnVtID09ICoodWludDMyX3QgKilYRlNfU0JfTUFHSUM7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB4ZnNfaXNfdmFsaWRfYWdpKHhmc19hZ2lfdCAqYWdpKQoreworICAgIHJldHVybiBhZ2ktPmFnaV9tYWdpY251bSA9PSAqKHVpbnQzMl90ICopWEZTX0FHSV9NQUdJQzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKnhmc19uZXdfaW5vZGUoc3RydWN0IGZzX2luZm8gKmZzKQoreworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKyAgICBpbm9kZSA9IGFsbG9jX2lub2RlKGZzLCAwLCBzaXplb2Yoc3RydWN0IHhmc19pbm9kZSkpOworICAgIGlmICghaW5vZGUpCisJbWFsbG9jX2Vycm9yKCJ4ZnNfaW5vZGUgc3RydWN0dXJlIik7CisKKyAgICByZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX3hmc19pbm9kZV9wdnQoc3RydWN0IGZzX2luZm8gKmZzLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgIHhmc19pbm9fdCBpbm8pCit7CisgICAgWEZTX1BWVChpbm9kZSktPmlfYWdibG9jayA9CisJYWdudW1iZXJfdG9fYnl0ZXMoZnMsIFhGU19JTk9fVE9fQUdOTyhmcywgaW5vKSkgPj4gQkxPQ0tfU0hJRlQoZnMpOworICAgIFhGU19QVlQoaW5vZGUpLT5pX2lub19ibGsgPSBpbm9fdG9fYnl0ZXMoZnMsIGlubykgPj4gQkxPQ0tfU0hJRlQoZnMpOworICAgIFhGU19QVlQoaW5vZGUpLT5pX2Jsb2NrX29mZnNldCA9IFhGU19JTk9fVE9fT0ZGU0VUKFhGU19JTkZPKGZzKSwgaW5vKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGU19JTkZPKGZzKS0+aW5vZGVfc2hpZnQ7Cit9CisKKy8qCisgKiBHZW5lcmljIGJ0cmVlIGhlYWRlci4KKyAqCisgKiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIGFjdHVhbCBmb3JtYXQgdXNlZCBvbiBkaXNrIGZvciBzaG9ydCBhbmQgbG9uZworICogZm9ybWF0IGJ0cmVlcy4gVGhlIGZpcnN0IHRocmVlIGZpZWxkcyBhcmUgc2hhcmVkIGJ5IGJvdGggZm9ybWF0LCBidXQKKyAqIHRoZSBwb2ludGVycyBhcmUgZGlmZmVyZW50IGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoIGNhcmUuCisgKgorICogVG8gZ2V0IHRoZSBzaXplIG9mIHRoZSBhY3R1YWwgc2hvcnQgb3IgbG9uZyBmb3JtIGhlYWRlcnMgcGxlYXNlIHVzZQorICogdGhlIHNpemUgbWFjcm9zIGJlbG93cy4gTmV2ZXIgdXNlIHNpemVvZih4ZnNfYnRyZWVfYmxvY2spOworICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sgeworICAgIHVpbnQzMl90IGJiX21hZ2ljOwkJCS8qIG1hZ2ljIG51bWJlciBmb3IgYmxvY2sgdHlwZSAqLworICAgIHVpbnQxNl90IGJiX2xldmVsOwkJCS8qIDAgaXMgYSBsZWFmICovCisgICAgdWludDE2X3QgYmJfbnVtcmVjczsJCS8qIGN1cnJlbnQgIyBvZiBkYXRhIHJlY29yZHMgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MzJfdCBiYl9sZWZ0c2liOworICAgICAgICAgICAgdWludDMyX3QgYmJfcmlnaHRzaWI7CisgICAgICAgIH0gczsJCQkJLyogc2hvcnQgZm9ybSBwb2ludGVycyAqLworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDY0X3QgYmJfbGVmdHNpYjsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJiX3JpZ2h0c2liOworICAgICAgICB9IGw7CQkJCS8qIGxvbmcgZm9ybSBwb2ludGVycyAqLworICAgIH0gYmJfdTsJCQkJLyogcmVzdCAqLworfSB4ZnNfYnRyZWVfYmxvY2tfdDsKKworI2RlZmluZSBYRlNfQlRSRUVfU0JMT0NLX0xFTiAxNiAvKiBzaXplIG9mIGEgc2hvcnQgZm9ybSBibG9jayAqLworI2RlZmluZSBYRlNfQlRSRUVfTEJMT0NLX0xFTiAyNCAvKiBzaXplIG9mIGEgbG9uZyBmb3JtIGJsb2NrICovCisKKy8qCisgKiBCbWFwIHJvb3QgaGVhZGVyLCBvbi1kaXNrIGZvcm0gb25seS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtZHJfYmxvY2sgeworICAgIHVpbnQxNl90IGJiX2xldmVsOwkJLyogMCBpcyBhIGxlYWYgKi8KKyAgICB1aW50MTZfdCBiYl9udW1yZWNzOwkvKiBjdXJyZW50ICMgb2YgZGF0YSByZWNvcmRzICovCit9IHhmc19ibWRyX2Jsb2NrX3Q7CisKKy8qCisgKiBLZXkgc3RydWN0dXJlIGZvciBub24tbGVhZiBsZXZlbHMgb2YgdGhlIHRyZWUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19ibWJ0X2tleSB7CisgICAgdWludDY0X3QgYnJfc3RhcnRvZmY7CS8qIHN0YXJ0aW5nIGZpbGUgb2Zmc2V0ICovCit9IHhmc19ibWJ0X2tleV90LCB4ZnNfYm1kcl9rZXlfdDsKKworLyogYnRyZWUgcG9pbnRlciB0eXBlICovCit0eXBlZGVmIHVpbnQ2NF90IHhmc19ibWJ0X3B0cl90LCB4ZnNfYm1kcl9wdHJfdDsKKworLyoKKyAqIEJ0cmVlIGJsb2NrIGhlYWRlciBzaXplIGRlcGVuZHMgb24gYSBzdXBlcmJsb2NrIGZsYWcuCisgKgorICogKG5vdCBxdWl0ZSB5ZXQsIGJ1dCBzb29uKQorICovCisjZGVmaW5lIFhGU19CTUJUX0JMT0NLX0xFTihmcykgWEZTX0JUUkVFX0xCTE9DS19MRU4KKworI2RlZmluZSBYRlNfQk1CVF9SRUNfQUREUihmcywgYmxvY2ssIGluZGV4KSBcCisgICAgICAgICgoeGZzX2JtYnRfcmVjX3QgKikgXAorICAgICAgICAgICAgICAgICgoY2hhciAqKShibG9jaykgKyBcCisgICAgICAgICAgICAgICAgIFhGU19CTUJUX0JMT0NLX0xFTihmcykgKyBcCisgICAgICAgICAgICAgICAgICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2JtYnRfcmVjX3QpKSkKKworI2RlZmluZSBYRlNfQk1CVF9LRVlfQUREUihmcywgYmxvY2ssIGluZGV4KSBcCisgICAgICAgICgoeGZzX2JtYnRfa2V5X3QgKikgXAorICAgICAgICAgICAgICAgICgoY2hhciAqKShibG9jaykgKyBcCisgICAgICAgICAgICAgICAgIFhGU19CTUJUX0JMT0NLX0xFTihmcykgKyBcCisgICAgICAgICAgICAgICAgICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2JtYnRfa2V5X3QpKSkKKworI2RlZmluZSBYRlNfQk1CVF9QVFJfQUREUihmcywgYmxvY2ssIGluZGV4LCBtYXhyZWNzKSBcCisgICAgICAgICgoeGZzX2JtYnRfcHRyX3QgKikgXAorICAgICAgICAgICAgICAgICgoY2hhciAqKShibG9jaykgKyBcCisgICAgICAgICAgICAgICAgIFhGU19CTUJUX0JMT0NLX0xFTihmcykgKyBcCisgICAgICAgICAgICAgICAgIChtYXhyZWNzKSAqIHNpemVvZih4ZnNfYm1idF9rZXlfdCkgKyBcCisgICAgICAgICAgICAgICAgICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2JtYnRfcHRyX3QpKSkKKworI2RlZmluZSBYRlNfQk1EUl9SRUNfQUREUihibG9jaywgaW5kZXgpIFwKKyAgICAgICAgKCh4ZnNfYm1kcl9yZWNfdCAqKSBcCisgICAgICAgICAgICAgICAgKChjaGFyICopKGJsb2NrKSArIFwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB4ZnNfYm1kcl9ibG9jaykgKyBcCisgICAgICAgICAgICAgICAgICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2JtZHJfcmVjX3QpKSkKKworI2RlZmluZSBYRlNfQk1EUl9LRVlfQUREUihibG9jaywgaW5kZXgpIFwKKyAgICAgICAgKCh4ZnNfYm1kcl9rZXlfdCAqKSBcCisgICAgICAgICAgICAgICAgKChjaGFyICopKGJsb2NrKSArIFwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB4ZnNfYm1kcl9ibG9jaykgKyBcCisgICAgICAgICAgICAgICAgICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2JtZHJfa2V5X3QpKSkKKworI2RlZmluZSBYRlNfQk1EUl9QVFJfQUREUihibG9jaywgaW5kZXgsIG1heHJlY3MpIFwKKyAgICAgICAgKCh4ZnNfYm1kcl9wdHJfdCAqKSBcCisgICAgICAgICAgICAgICAgKChjaGFyICopKGJsb2NrKSArIFwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB4ZnNfYm1kcl9ibG9jaykgKyBcCisgICAgICAgICAgICAgICAgIChtYXhyZWNzKSAqIHNpemVvZih4ZnNfYm1kcl9rZXlfdCkgKyBcCisgICAgICAgICAgICAgICAgICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2JtZHJfcHRyX3QpKSkKKworLyoKKyAqIENhbGN1bGF0ZSBudW1iZXIgb2YgcmVjb3JkcyBpbiBhIGJtYXAgYnRyZWUgaW5vZGUgcm9vdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3hmc19ibWRyX21heHJlY3MoaW50IGJsb2NrbGVuLCBpbnQgbGVhZikKK3sKKyAgICBibG9ja2xlbiAtPSBzaXplb2YoeGZzX2JtZHJfYmxvY2tfdCk7CisKKyAgICBpZiAobGVhZikKKyAgICAgICAgcmV0dXJuIGJsb2NrbGVuIC8gc2l6ZW9mKHhmc19ibWRyX3JlY190KTsKKworICAgIHJldHVybiBibG9ja2xlbiAvIChzaXplb2YoeGZzX2JtZHJfa2V5X3QpICsgc2l6ZW9mKHhmc19ibWRyX3B0cl90KSk7Cit9CisKKyNlbmRpZiAvKiBYRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZnMveGZzL3hmc19hZy5oIGIvY29yZS9mcy94ZnMveGZzX2FnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5ODhiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMveGZzL3hmc19hZy5oCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogVGFrZW4gZnJvbSBMaW51eCBrZXJuZWwgdHJlZSAobGludXgvZnMveGZzKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bG8gQWxjYW50YXJhIDxwY2FjanJAenl0b3IuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgWEZTX0FHX0hfCisjZGVmaW5lCVhGU19BR19IXworCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisKKy8qCisgKiBBbGxvY2F0aW9uIGdyb3VwIGhlYWRlcgorICogVGhpcyBpcyBkaXZpZGVkIGludG8gdGhyZWUgc3RydWN0dXJlcywgcGxhY2VkIGluIHNlcXVlbnRpYWwgNTEyLWJ5dGUKKyAqIGJ1ZmZlcnMgYWZ0ZXIgYSBjb3B5IG9mIHRoZSBzdXBlcmJsb2NrIChhbHNvIGluIGEgNTEyLWJ5dGUgYnVmZmVyKS4KKyAqLworCit0eXBlZGVmIHVpbnQzMl90IHhmc19hZ2lub190OworCitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisjZGVmaW5lCVhGU19BR0ZfTUFHSUMJIlhBR0YiCisjZGVmaW5lCVhGU19BR0ZfVkVSU0lPTgkxCisjZGVmaW5lCVhGU19BR0lfVkVSU0lPTgkxCisKKyNkZWZpbmUJWEZTX0FHRl9HT09EX1ZFUlNJT04odikJKCh2KSA9PSBYRlNfQUdGX1ZFUlNJT04pCisjZGVmaW5lCVhGU19BR0lfR09PRF9WRVJTSU9OKHYpCSgodikgPT0gWEZTX0FHSV9WRVJTSU9OKQorCisvKgorICogQnRyZWUgbnVtYmVyIDAgaXMgYm5vLCAxIGlzIGNudC4gIFRoaXMgdmFsdWUgZ2l2ZXMgdGhlIHNpemUgb2YgdGhlCisgKiBhcnJheXMgYmVsb3cuCisgKi8KKyNkZWZpbmUJWEZTX0JUTlVNX0FHRgkoKGludClYRlNfQlROVU1fQ05UaSArIDEpCisKKy8qCisgKiBUaGUgc2Vjb25kIHdvcmQgb2YgYWdmX2xldmVscyBpbiB0aGUgZmlyc3QgYS5nLiBvdmVybGFwcyB0aGUgRUZTCisgKiBzdXBlcmJsb2NrJ3MgbWFnaWMgbnVtYmVyLiAgU2luY2UgdGhlIG1hZ2ljIG51bWJlcnMgdmFsaWQgZm9yIEVGUworICogYXJlID4gNjRrLCBvdXIgdmFsdWUgY2Fubm90IGJlIGNvbmZ1c2VkIGZvciBhbiBFRlMgc3VwZXJibG9jaydzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19hZ2YgeworCS8qCisJICogQ29tbW9uIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyIGluZm9ybWF0aW9uCisJICovCisJdWludDMyX3QJCWFnZl9tYWdpY251bTsJLyogbWFnaWMgbnVtYmVyID09IFhGU19BR0ZfTUFHSUMgKi8KKwl1aW50MzJfdAkJYWdmX3ZlcnNpb25udW07CS8qIGhlYWRlciB2ZXJzaW9uID09IFhGU19BR0ZfVkVSU0lPTiAqLworCXVpbnQzMl90CQlhZ2Zfc2Vxbm87CS8qIHNlcXVlbmNlICMgc3RhcnRpbmcgZnJvbSAwICovCisJdWludDMyX3QJCWFnZl9sZW5ndGg7CS8qIHNpemUgaW4gYmxvY2tzIG9mIGEuZy4gKi8KKwkvKgorCSAqIEZyZWVzcGFjZSBpbmZvcm1hdGlvbgorCSAqLworCXVpbnQzMl90CQlhZ2Zfcm9vdHNbWEZTX0JUTlVNX0FHRl07CS8qIHJvb3QgYmxvY2tzICovCisJdWludDMyX3QJCWFnZl9zcGFyZTA7CS8qIHNwYXJlIGZpZWxkICovCisJdWludDMyX3QJCWFnZl9sZXZlbHNbWEZTX0JUTlVNX0FHRl07CS8qIGJ0cmVlIGxldmVscyAqLworCXVpbnQzMl90CQlhZ2Zfc3BhcmUxOwkvKiBzcGFyZSBmaWVsZCAqLworCXVpbnQzMl90CQlhZ2ZfZmxmaXJzdDsJLyogZmlyc3QgZnJlZWxpc3QgYmxvY2sncyBpbmRleCAqLworCXVpbnQzMl90CQlhZ2ZfZmxsYXN0OwkvKiBsYXN0IGZyZWVsaXN0IGJsb2NrJ3MgaW5kZXggKi8KKwl1aW50MzJfdAkJYWdmX2ZsY291bnQ7CS8qIGNvdW50IG9mIGJsb2NrcyBpbiBmcmVlbGlzdCAqLworCXVpbnQzMl90CQlhZ2ZfZnJlZWJsa3M7CS8qIHRvdGFsIGZyZWUgYmxvY2tzICovCisJdWludDMyX3QJCWFnZl9sb25nZXN0OwkvKiBsb25nZXN0IGZyZWUgc3BhY2UgKi8KKwl1aW50MzJfdAkJYWdmX2J0cmVlYmxrczsJLyogIyBvZiBibG9ja3MgaGVsZCBpbiBBR0YgYnRyZWVzICovCit9IHhmc19hZ2ZfdDsKKworI2RlZmluZQlYRlNfQUdGX01BR0lDTlVNCTB4MDAwMDAwMDEKKyNkZWZpbmUJWEZTX0FHRl9WRVJTSU9OTlVNCTB4MDAwMDAwMDIKKyNkZWZpbmUJWEZTX0FHRl9TRVFOTwkJMHgwMDAwMDAwNAorI2RlZmluZQlYRlNfQUdGX0xFTkdUSAkJMHgwMDAwMDAwOAorI2RlZmluZQlYRlNfQUdGX1JPT1RTCQkweDAwMDAwMDEwCisjZGVmaW5lCVhGU19BR0ZfTEVWRUxTCQkweDAwMDAwMDIwCisjZGVmaW5lCVhGU19BR0ZfRkxGSVJTVAkJMHgwMDAwMDA0MAorI2RlZmluZQlYRlNfQUdGX0ZMTEFTVAkJMHgwMDAwMDA4MAorI2RlZmluZQlYRlNfQUdGX0ZMQ09VTlQJCTB4MDAwMDAxMDAKKyNkZWZpbmUJWEZTX0FHRl9GUkVFQkxLUwkweDAwMDAwMjAwCisjZGVmaW5lCVhGU19BR0ZfTE9OR0VTVAkJMHgwMDAwMDQwMAorI2RlZmluZQlYRlNfQUdGX0JUUkVFQkxLUwkweDAwMDAwODAwCisjZGVmaW5lCVhGU19BR0ZfTlVNX0JJVFMJMTIKKyNkZWZpbmUJWEZTX0FHRl9BTExfQklUUwkoKDEgPDwgWEZTX0FHRl9OVU1fQklUUykgLSAxKQorCisjZGVmaW5lIFhGU19BR0ZfRkxBR1MgXAorCXsgWEZTX0FHRl9NQUdJQ05VTSwJIk1BR0lDTlVNIiB9LCBcCisJeyBYRlNfQUdGX1ZFUlNJT05OVU0sCSJWRVJTSU9OTlVNIiB9LCBcCisJeyBYRlNfQUdGX1NFUU5PLAkiU0VRTk8iIH0sIFwKKwl7IFhGU19BR0ZfTEVOR1RILAkiTEVOR1RIIiB9LCBcCisJeyBYRlNfQUdGX1JPT1RTLAkiUk9PVFMiIH0sIFwKKwl7IFhGU19BR0ZfTEVWRUxTLAkiTEVWRUxTIiB9LCBcCisJeyBYRlNfQUdGX0ZMRklSU1QsCSJGTEZJUlNUIiB9LCBcCisJeyBYRlNfQUdGX0ZMTEFTVCwJIkZMTEFTVCIgfSwgXAorCXsgWEZTX0FHRl9GTENPVU5ULAkiRkxDT1VOVCIgfSwgXAorCXsgWEZTX0FHRl9GUkVFQkxLUywJIkZSRUVCTEtTIiB9LCBcCisJeyBYRlNfQUdGX0xPTkdFU1QsCSJMT05HRVNUIiB9LCBcCisJeyBYRlNfQUdGX0JUUkVFQkxLUywJIkJUUkVFQkxLUyIgfQorCisvKiBkaXNrIGJsb2NrICh4ZnNfZGFkZHJfdCkgaW4gdGhlIEFHICovCisjZGVmaW5lIFhGU19BR0ZfREFERFIobXApCSgoeGZzX2RhZGRyX3QpKDEgPDwgKG1wKS0+bV9zZWN0YmJfbG9nKSkKKyNkZWZpbmUJWEZTX0FHRl9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX0FHRl9EQUREUihtcCkpCisjZGVmaW5lCVhGU19CVUZfVE9fQUdGKGJwKQkoKHhmc19hZ2ZfdCAqKSgoYnApLT5iX2FkZHIpKQorCitleHRlcm4gaW50IHhmc19yZWFkX2FnZihzdHJ1Y3QgeGZzX21vdW50ICptcCwgc3RydWN0IHhmc190cmFucyAqdHAsCisJCQl4ZnNfYWdudW1iZXJfdCBhZ25vLCBpbnQgZmxhZ3MsIHN0cnVjdCB4ZnNfYnVmICoqYnBwKTsKKworLyoKKyAqIFNpemUgb2YgdGhlIHVubGlua2VkIGlub2RlIGhhc2ggdGFibGUgaW4gdGhlIGFnaS4KKyAqLworI2RlZmluZQlYRlNfQUdJX1VOTElOS0VEX0JVQ0tFVFMJNjQKKworI2RlZmluZQlYRlNfQUdJX01BR0lDTlVNCTB4MDAwMDAwMDEKKyNkZWZpbmUJWEZTX0FHSV9WRVJTSU9OTlVNCTB4MDAwMDAwMDIKKyNkZWZpbmUJWEZTX0FHSV9TRVFOTwkJMHgwMDAwMDAwNAorI2RlZmluZQlYRlNfQUdJX0xFTkdUSAkJMHgwMDAwMDAwOAorI2RlZmluZQlYRlNfQUdJX0NPVU5UCQkweDAwMDAwMDEwCisjZGVmaW5lCVhGU19BR0lfUk9PVAkJMHgwMDAwMDAyMAorI2RlZmluZQlYRlNfQUdJX0xFVkVMCQkweDAwMDAwMDQwCisjZGVmaW5lCVhGU19BR0lfRlJFRUNPVU5UCTB4MDAwMDAwODAKKyNkZWZpbmUJWEZTX0FHSV9ORVdJTk8JCTB4MDAwMDAxMDAKKyNkZWZpbmUJWEZTX0FHSV9ESVJJTk8JCTB4MDAwMDAyMDAKKyNkZWZpbmUJWEZTX0FHSV9VTkxJTktFRAkweDAwMDAwNDAwCisjZGVmaW5lCVhGU19BR0lfTlVNX0JJVFMJMTEKKyNkZWZpbmUJWEZTX0FHSV9BTExfQklUUwkoKDEgPDwgWEZTX0FHSV9OVU1fQklUUykgLSAxKQorCisvKiBkaXNrIGJsb2NrICh4ZnNfZGFkZHJfdCkgaW4gdGhlIEFHICovCisjZGVmaW5lIFhGU19BR0lfREFERFIobXApCSgoeGZzX2RhZGRyX3QpKDIgPDwgKG1wKS0+bV9zZWN0YmJfbG9nKSkKKyNkZWZpbmUJWEZTX0FHSV9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX0FHSV9EQUREUihtcCkpCisjZGVmaW5lCVhGU19CVUZfVE9fQUdJKGJwKQkoKHhmc19hZ2lfdCAqKSgoYnApLT5iX2FkZHIpKQorCitleHRlcm4gaW50IHhmc19yZWFkX2FnaShzdHJ1Y3QgeGZzX21vdW50ICptcCwgc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkJeGZzX2FnbnVtYmVyX3QgYWdubywgc3RydWN0IHhmc19idWYgKipicHApOworCisvKgorICogVGhlIHRoaXJkIGEuZy4gYmxvY2sgY29udGFpbnMgdGhlIGEuZy4gZnJlZWxpc3QsIGFuIGFycmF5CisgKiBvZiBibG9jayBwb2ludGVycyB0byBibG9ja3Mgb3duZWQgYnkgdGhlIGFsbG9jYXRpb24gYnRyZWUgY29kZS4KKyAqLworI2RlZmluZSBYRlNfQUdGTF9EQUREUihtcCkJKCh4ZnNfZGFkZHJfdCkoMyA8PCAobXApLT5tX3NlY3RiYl9sb2cpKQorI2RlZmluZQlYRlNfQUdGTF9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX0FHRkxfREFERFIobXApKQorI2RlZmluZSBYRlNfQUdGTF9TSVpFKG1wKQkoKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSAvIHNpemVvZih4ZnNfYWdibG9ja190KSkKKyNkZWZpbmUJWEZTX0JVRl9UT19BR0ZMKGJwKQkoKHhmc19hZ2ZsX3QgKikoKGJwKS0+Yl9hZGRyKSkKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FnZmwgeworCXVpbnQzMl90CQlhZ2ZsX2Jub1sxXTsJLyogYWN0dWFsbHkgWEZTX0FHRkxfU0laRShtcCkgKi8KK30geGZzX2FnZmxfdDsKKworLyoKKyAqIHRhZ3MgZm9yIGlub2RlIHJhZGl4IHRyZWUKKyAqLworI2RlZmluZSBYRlNfSUNJX05PX1RBRwkJKC0xKQkvKiBzcGVjaWFsIGZsYWcgZm9yIGFuIHVudGFnZ2VkIGxvb2t1cAorCQkJCQkgICBpbiB4ZnNfaW5vZGVfYWdfaXRlcmF0b3IgKi8KKyNkZWZpbmUgWEZTX0lDSV9SRUNMQUlNX1RBRwkwCS8qIGlub2RlIGlzIHRvIGJlIHJlY2xhaW1lZCAqLworCisjZGVmaW5lCVhGU19BR19NQVhMRVZFTFMobXApCQkoKG1wKS0+bV9hZ19tYXhsZXZlbHMpCisjZGVmaW5lCVhGU19NSU5fRlJFRUxJU1RfUkFXKGJsLGNsLG1wKQlcCisJKE1JTihibCArIDEsIFhGU19BR19NQVhMRVZFTFMobXApKSArIE1JTihjbCArIDEsIFhGU19BR19NQVhMRVZFTFMobXApKSkKKyNkZWZpbmUJWEZTX01JTl9GUkVFTElTVChhLG1wKQkJXAorCShYRlNfTUlOX0ZSRUVMSVNUX1JBVygJCVwKKwkJYmUzMl90b19jcHUoKGEpLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSksIFwKKwkJYmUzMl90b19jcHUoKGEpLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSksIG1wKSkKKyNkZWZpbmUJWEZTX01JTl9GUkVFTElTVF9QQUcocGFnLG1wKQlcCisJKFhGU19NSU5fRlJFRUxJU1RfUkFXKAkJXAorCQkodW5zaWduZWQgaW50KShwYWcpLT5wYWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0sIFwKKwkJKHVuc2lnbmVkIGludCkocGFnKS0+cGFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldLCBtcCkpCisKKy8qCisgKiBGb3IgY2hlY2tpbmcgZm9yIGJhZCByYW5nZXMgb2YgeGZzX2RhZGRyX3QncywgY292ZXJpbmcgbXVsdGlwbGUKKyAqIGFsbG9jYXRpb24gZ3JvdXBzIG9yIGEgc2luZ2xlIHhmc19kYWRkcl90IHRoYXQncyBhIHN1cGVyYmxvY2sgY29weS4KKyAqLworI2RlZmluZQlYRlNfQUdfQ0hFQ0tfREFERFIobXAsZCxsZW4pCVwKKwkoKGxlbikgPT0gMSA/IFwKKwkgICAgQVNTRVJUKChkKSA9PSBYRlNfU0JfREFERFIgfHwgXAorCQkgICB4ZnNfZGFkZHJfdG9fYWdibm8obXAsIGQpICE9IFhGU19TQl9EQUREUikgOiBcCisJICAgIEFTU0VSVCh4ZnNfZGFkZHJfdG9fYWdubyhtcCwgZCkgPT0gXAorCQkgICB4ZnNfZGFkZHJfdG9fYWdubyhtcCwgKGQpICsgKGxlbikgLSAxKSkpCisKKyNlbmRpZgkvKiBYRlNfQUdfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZnMveGZzL3hmc19kaW5vZGUuYyBiL2NvcmUvZnMveGZzL3hmc19kaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWJlNmUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy94ZnMveGZzX2Rpbm9kZS5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMyBQYXVsbyBBbGNhbnRhcmEgPHBjYWNqckB6eXRvci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGNhY2hlLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGZzLmg+CisKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisKK3hmc19kaW5vZGVfdCAqeGZzX2Rpbm9kZV9nZXRfY29yZShzdHJ1Y3QgZnNfaW5mbyAqZnMsIHhmc19pbm9fdCBpbm8pCit7CisgICAgYmxvY2tfdCBibGs7CisgICAgeGZzX2Rpbm9kZV90ICpjb3JlOworICAgIHVpbnQ2NF90IG9mZnNldDsKKworICAgIHhmc19kZWJ1ZygiZnMgJXAgaW5vICVsdSIsIGZzLCBpbm8pOworCisgICAgYmxrID0gaW5vX3RvX2J5dGVzKGZzLCBpbm8pID4+IEJMT0NLX1NISUZUKGZzKTsKKyAgICBvZmZzZXQgPSBYRlNfSU5PX1RPX09GRlNFVChYRlNfSU5GTyhmcyksIGlubykgPDwgWEZTX0lORk8oZnMpLT5pbm9kZV9zaGlmdDsKKyAgICBpZiAob2Zmc2V0ID4gQkxPQ0tfU0laRShmcykpIHsKKyAgICAgICAgeGZzX2Vycm9yKCJJbnZhbGlkIGlub2RlIG9mZnNldCBpbiBibG9jayEiKTsKKyAgICAgICAgeGZzX2RlYnVnKCJvZmZzZXQ6IDB4JWxseCIsIG9mZnNldCk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHhmc19kZWJ1ZygiYmxrICVsbHUgYmxvY2sgb2Zmc2V0IDB4JWxseCIsIGJsaywgYmxrIDw8IEJMT0NLX1NISUZUKGZzKSk7CisgICAgeGZzX2RlYnVnKCJpbm9kZSBvZmZzZXQgaW4gYmxvY2sgKGluIGJ5dGVzKSBpcyAweCVsbHgiLCBvZmZzZXQpOworCisgICAgY29yZSA9ICh4ZnNfZGlub2RlX3QgKikoKHVpbnQ4X3QgKilnZXRfY2FjaGUoZnMtPmZzX2RldiwgYmxrKSArIG9mZnNldCk7CisgICAgaWYgKGJlMTZfdG9fY3B1KGNvcmUtPmRpX21hZ2ljKSAhPQorCWJlMTZfdG9fY3B1KCoodWludDE2X3QgKilYRlNfRElOT0RFX01BR0lDKSkgeworCXhmc19lcnJvcigiSW5vZGUgY29yZSdzIG1hZ2ljIG51bWJlciBkb2VzIG5vdCBtYXRjaCEiKTsKKwl4ZnNfZGVidWcoIm1hZ2ljIG51bWJlciAweCUwNHgiLCAoYmUxNl90b19jcHUoY29yZS0+ZGlfbWFnaWMpKSk7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvcmU7CisKK291dDoKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMveGZzL3hmc19kaW5vZGUuaCBiL2NvcmUvZnMveGZzL3hmc19kaW5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGRlZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy94ZnMveGZzX2Rpbm9kZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bG8gQWxjYW50YXJhIDxwY2FjanJAenl0b3IuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgWEZTX0RJTk9ERV9IXworI2RlZmluZSBYRlNfRElOT0RFX0hfCisKK3hmc19kaW5vZGVfdCAqeGZzX2Rpbm9kZV9nZXRfY29yZShzdHJ1Y3QgZnNfaW5mbyAqZnMsIHhmc19pbm9fdCBpbm8pOworCisjZW5kaWYgLyogWEZTX0RJTk9ERV9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9mcy94ZnMveGZzX2RpcjIuYyBiL2NvcmUvZnMveGZzL3hmc19kaXIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzN2VmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMveGZzL3hmc19kaXIyLmMKQEAgLTAsMCArMSw3OTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMyBQYXVsbyBBbGNhbnRhcmEgPHBjYWNqckB6eXRvci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGNhY2hlLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGZzLmg+CisKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKworI2RlZmluZSBYRlNfRElSMl9ESVJCTEtTX0NBQ0hFX1NJWkUgMTI4CisKK3N0cnVjdCB4ZnNfZGlyMl9kaXJibGtzX2NhY2hlIHsKKyAgICBibG9ja190ICAgICAgICBkY19zdGFydGJsb2NrOworICAgIHhmc19maWxibGtzX3QgIGRjX2Jsa3Njb3VudDsKKyAgICB2b2lkICAgICAgICAgICpkY19hcmVhOworfTsKKworc3RhdGljIHN0cnVjdCB4ZnNfZGlyMl9kaXJibGtzX2NhY2hlIGRpcmJsa3NfY2FjaGVbWEZTX0RJUjJfRElSQkxLU19DQUNIRV9TSVpFXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICBkaXJibGtzX2NhY2hlZF9jb3VudCA9IDA7CisKK3VpbnQzMl90IHhmc19kaXIyX2RhX2hhc2huYW1lKGNvbnN0IHVpbnQ4X3QgKm5hbWUsIGludCBuYW1lbGVuKQoreworICAgIHVpbnQzMl90IGhhc2g7CisKKyAgICAvKgorICAgICAqIERvIGZvdXIgY2hhcmFjdGVycyBhdCBhIHRpbWUgYXMgbG9uZyBhcyB3ZSBjYW4uCisgICAgICovCisgICAgZm9yIChoYXNoID0gMDsgbmFtZWxlbiA+PSA0OyBuYW1lbGVuIC09NCwgbmFtZSArPSA0KQorICAgICAgICBoYXNoID0gKG5hbWVbMF0gPDwgMjEpIF4gKG5hbWVbMV0gPDwgMTQpIF4gKG5hbWVbMl0gPDwgNykgXgorICAgICAgICAgICAgICAgKG5hbWVbM10gPDwgMCkgXiByb2wzMihoYXNoLCA3ICogNCk7CisKKyAgICAvKgorICAgICAqIE5vdyBkbyB0aGUgcmVzdCBvZiB0aGUgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKG5hbWVsZW4pIHsKKyAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiAobmFtZVswXSA8PCAxNCkgXiAobmFtZVsxXSA8PCA3KSBeIChuYW1lWzJdIDw8IDApIF4KKyAgICAgICAgICAgICAgIHJvbDMyKGhhc2gsIDcgKiAzKTsKKyAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiAobmFtZVswXSA8PCA3KSBeIChuYW1lWzFdIDw8IDApIF4gcm9sMzIoaGFzaCwgNyAqIDIpOworICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIChuYW1lWzBdIDw8IDApIF4gcm9sMzIoaGFzaCwgNyAqIDEpOworICAgIGRlZmF1bHQ6IC8qIGNhc2UgMDogKi8KKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCAqZ2V0X2RpcmJsa3Moc3RydWN0IGZzX2luZm8gKmZzLCBibG9ja190IHN0YXJ0YmxvY2ssCisJCQkgeGZzX2ZpbGJsa3NfdCBjKQoreworICAgIGludCBjb3VudCA9IGMgPDwgWEZTX0lORk8oZnMpLT5kaXJibGtsb2c7CisgICAgdWludDhfdCAqcDsKKyAgICB1aW50OF90ICpidWY7CisgICAgb2ZmX3Qgb2Zmc2V0ID0gMDsKKworICAgIGJ1ZiA9IG1hbGxvYyhjICogWEZTX0lORk8oZnMpLT5kaXJibGtzaXplKTsKKyAgICBpZiAoIWJ1ZikKKyAgICAgICAgbWFsbG9jX2Vycm9yKCJidWZmZXIgbWVtb3J5Iik7CisKKyAgICBtZW1zZXQoYnVmLCAwLCBYRlNfSU5GTyhmcyktPmRpcmJsa3NpemUpOworCisgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgcCA9ICh1aW50OF90ICopZ2V0X2NhY2hlKGZzLT5mc19kZXYsIHN0YXJ0YmxvY2srKyk7CisgICAgICAgIG1lbWNweShidWYgKyBvZmZzZXQsIHAsICBCTE9DS19TSVpFKGZzKSk7CisgICAgICAgIG9mZnNldCArPSBCTE9DS19TSVpFKGZzKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmOworfQorCitjb25zdCB2b2lkICp4ZnNfZGlyMl9kaXJibGtzX2dldF9jYWNoZWQoc3RydWN0IGZzX2luZm8gKmZzLCBibG9ja190IHN0YXJ0YmxvY2ssCisJCQkJCXhmc19maWxibGtzX3QgYykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGk7CisgICAgdm9pZCAqYnVmOworCisgICAgeGZzX2RlYnVnKCJmcyAlcCBzdGFydGJsb2NrICVsbHUgKDB4JWxseCkgYmxrc2NvdW50ICVsdSIsIGZzLCBzdGFydGJsb2NrLAorCSAgICAgIHN0YXJ0YmxvY2ssIGMpOworCisgICAgaWYgKCFkaXJibGtzX2NhY2hlZF9jb3VudCkgeworCWJ1ZiA9IGdldF9kaXJibGtzKGZzLCBzdGFydGJsb2NrLCBjKTsKKworCWRpcmJsa3NfY2FjaGVbZGlyYmxrc19jYWNoZWRfY291bnRdLmRjX3N0YXJ0YmxvY2sgPSBzdGFydGJsb2NrOworCWRpcmJsa3NfY2FjaGVbZGlyYmxrc19jYWNoZWRfY291bnRdLmRjX2Jsa3Njb3VudCA9IGM7CisJZGlyYmxrc19jYWNoZVtkaXJibGtzX2NhY2hlZF9jb3VudF0uZGNfYXJlYSA9IGJ1ZjsKKworCXJldHVybiBkaXJibGtzX2NhY2hlW2RpcmJsa3NfY2FjaGVkX2NvdW50KytdLmRjX2FyZWE7CisgICAgfSBlbHNlIGlmIChkaXJibGtzX2NhY2hlZF9jb3VudCA9PSBYRlNfRElSMl9ESVJCTEtTX0NBQ0hFX1NJWkUpIHsKKwlmb3IgKGkgPSAwOyBpIDwgWEZTX0RJUjJfRElSQkxLU19DQUNIRV9TSVpFIC8gMjsgaSsrKSB7CisJICAgIHVuc2lnbmVkIGNoYXIgayA9IFhGU19ESVIyX0RJUkJMS1NfQ0FDSEVfU0laRSAtIChpICsgMSk7CisKKwkgICAgZnJlZShkaXJibGtzX2NhY2hlW2ldLmRjX2FyZWEpOworCSAgICBkaXJibGtzX2NhY2hlW2ldID0gZGlyYmxrc19jYWNoZVtrXTsKKwkgICAgbWVtc2V0KCZkaXJibGtzX2NhY2hlW2tdLCAwLCBzaXplb2YoZGlyYmxrc19jYWNoZVtrXSkpOworCX0KKworCWJ1ZiA9IGdldF9kaXJibGtzKGZzLCBzdGFydGJsb2NrLCBjKTsKKworCWRpcmJsa3NfY2FjaGVbWEZTX0RJUjJfRElSQkxLU19DQUNIRV9TSVpFIC8gMl0uZGNfc3RhcnRibG9jayA9CisJICAgIHN0YXJ0YmxvY2s7CisJZGlyYmxrc19jYWNoZVtYRlNfRElSMl9ESVJCTEtTX0NBQ0hFX1NJWkUgLyAyXS5kY19ibGtzY291bnQgPSBjOworCWRpcmJsa3NfY2FjaGVbWEZTX0RJUjJfRElSQkxLU19DQUNIRV9TSVpFIC8gMl0uZGNfYXJlYSA9IGJ1ZjsKKworCWRpcmJsa3NfY2FjaGVkX2NvdW50ID0gWEZTX0RJUjJfRElSQkxLU19DQUNIRV9TSVpFIC8gMjsKKworCXJldHVybiBkaXJibGtzX2NhY2hlW2RpcmJsa3NfY2FjaGVkX2NvdW50KytdLmRjX2FyZWE7CisgICAgfSBlbHNlIHsKKwlibG9ja190IGJsb2NrOworCXhmc19maWxibGtzX3QgY291bnQ7CisKKwlibG9jayA9IGRpcmJsa3NfY2FjaGVbZGlyYmxrc19jYWNoZWRfY291bnQgLSAxXS5kY19zdGFydGJsb2NrOworCWNvdW50ID0gZGlyYmxrc19jYWNoZVtkaXJibGtzX2NhY2hlZF9jb3VudCAtIDFdLmRjX2Jsa3Njb3VudDsKKworCWlmIChibG9jayA9PSBzdGFydGJsb2NrICYmIGNvdW50ID09IGMpIHsKKwkgICAgcmV0dXJuIGRpcmJsa3NfY2FjaGVbZGlyYmxrc19jYWNoZWRfY291bnQgLSAxXS5kY19hcmVhOworCX0gZWxzZSB7CisJICAgIGZvciAoaSA9IDA7IGkgPCBkaXJibGtzX2NhY2hlZF9jb3VudDsgaSsrKSB7CisJCWJsb2NrID0gZGlyYmxrc19jYWNoZVtpXS5kY19zdGFydGJsb2NrOworCQljb3VudCA9IGRpcmJsa3NfY2FjaGVbaV0uZGNfYmxrc2NvdW50OworCisJCWlmIChibG9jayA9PSBzdGFydGJsb2NrICYmIGNvdW50ID09IGMpCisJCSAgICByZXR1cm4gZGlyYmxrc19jYWNoZVtpXS5kY19hcmVhOworCSAgICB9CisKKwkgICAgYnVmID0gZ2V0X2RpcmJsa3MoZnMsIHN0YXJ0YmxvY2ssIGMpOworCisJICAgIGRpcmJsa3NfY2FjaGVbZGlyYmxrc19jYWNoZWRfY291bnRdLmRjX3N0YXJ0YmxvY2sgPSBzdGFydGJsb2NrOworCSAgICBkaXJibGtzX2NhY2hlW2RpcmJsa3NfY2FjaGVkX2NvdW50XS5kY19ibGtzY291bnQgPSBjOworCSAgICBkaXJibGtzX2NhY2hlW2RpcmJsa3NfY2FjaGVkX2NvdW50XS5kY19hcmVhID0gYnVmOworCisJICAgIHJldHVybiBkaXJibGtzX2NhY2hlW2RpcmJsa3NfY2FjaGVkX2NvdW50KytdLmRjX2FyZWE7CisJfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIHhmc19kaXIyX2RpcmJsa3NfZmx1c2hfY2FjaGUodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGlyYmxrc19jYWNoZWRfY291bnQ7IGkrKykgeworCWZyZWUoZGlyYmxrc19jYWNoZVtpXS5kY19hcmVhKTsKKwltZW1zZXQoJmRpcmJsa3NfY2FjaGVbaV0sIDAsIHNpemVvZihkaXJibGtzX2NhY2hlW2ldKSk7CisgICAgfQorCisgICAgZGlyYmxrc19jYWNoZWRfY291bnQgPSAwOworfQorCitzdHJ1Y3QgaW5vZGUgKnhmc19kaXIyX2xvY2FsX2ZpbmRfZW50cnkoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50LAorCQkJCQl4ZnNfZGlub2RlX3QgKmNvcmUpCit7CisgICAgeGZzX2RpcjJfc2ZfdCAqc2YgPSAoeGZzX2RpcjJfc2ZfdCAqKSZjb3JlLT5kaV9saXRlcmFsX2FyZWFbMF07CisgICAgeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZfZW50cnk7CisgICAgdWludDhfdCBjb3VudCA9IHNmLT5oZHIuaThjb3VudCA/IHNmLT5oZHIuaThjb3VudCA6IHNmLT5oZHIuY291bnQ7CisgICAgc3RydWN0IGZzX2luZm8gKmZzID0gcGFyZW50LT5mczsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlOworICAgIHhmc19pbnRpbm9fdCBpbm87CisgICAgeGZzX2Rpbm9kZV90ICpuY29yZSA9IE5VTEw7CisKKyAgICB4ZnNfZGVidWcoImRuYW1lICVzIHBhcmVudCAlcCBjb3JlICVwIiwgZG5hbWUsIHBhcmVudCwgY29yZSk7CisgICAgeGZzX2RlYnVnKCJjb3VudCAlaGh1IGk4Y291bnQgJWhodSIsIHNmLT5oZHIuY291bnQsIHNmLT5oZHIuaThjb3VudCk7CisKKyAgICBzZl9lbnRyeSA9ICh4ZnNfZGlyMl9zZl9lbnRyeV90ICopKCh1aW50OF90ICopJnNmLT5saXN0WzBdIC0KKwkJCQkgICAgICAgKCFzZi0+aGRyLmk4Y291bnQgPyA0IDogMCkpOworICAgIHdoaWxlIChjb3VudC0tKSB7CisJdWludDhfdCAqc3RhcnRfbmFtZSA9ICZzZl9lbnRyeS0+bmFtZVswXTsKKwl1aW50OF90ICplbmRfbmFtZSA9IHN0YXJ0X25hbWUgKyBzZl9lbnRyeS0+bmFtZWxlbjsKKworCWlmICgheGZzX2RpcjJfZW50cnlfbmFtZV9jbXAoc3RhcnRfbmFtZSwgZW5kX25hbWUsIGRuYW1lKSkgeworCSAgICB4ZnNfZGVidWcoIkZvdW5kIGVudHJ5ICVzIiwgZG5hbWUpOworCSAgICBnb3RvIGZvdW5kOworCX0KKworCXNmX2VudHJ5ID0gKHhmc19kaXIyX3NmX2VudHJ5X3QgKikoKHVpbnQ4X3QgKilzZl9lbnRyeSArCisJCQkJCSAgIG9mZnNldG9mKHN0cnVjdCB4ZnNfZGlyMl9zZl9lbnRyeSwKKwkJCQkJCSAgICBuYW1lWzBdKSArCisJCQkJCSAgIHNmX2VudHJ5LT5uYW1lbGVuICsKKwkJCQkJICAgKHNmLT5oZHIuaThjb3VudCA/IDggOiA0KSk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7CisKK2ZvdW5kOgorICAgIGlub2RlID0geGZzX25ld19pbm9kZShmcyk7CisKKyAgICBpbm8gPSB4ZnNfZGlyMl9zZl9nZXRfaW51bWJlcihzZiwgKHhmc19kaXIyX2lub3VfdCAqKSgKKwkJCQkgICAgICAodWludDhfdCAqKXNmX2VudHJ5ICsKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgeGZzX2RpcjJfc2ZfZW50cnksCisJCQkJCSAgICAgICBuYW1lWzBdKSArCisJCQkJICAgICAgc2ZfZW50cnktPm5hbWVsZW4pKTsKKworICAgIHhmc19kZWJ1ZygiZW50cnkgaW5vZGUncyBudW1iZXIgJWx1IiwgaW5vKTsKKworICAgIG5jb3JlID0geGZzX2Rpbm9kZV9nZXRfY29yZShmcywgaW5vKTsKKyAgICBpZiAoIW5jb3JlKSB7CisgICAgICAgIHhmc19lcnJvcigiRmFpbGVkIHRvIGdldCBkaW5vZGUhIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGZpbGxfeGZzX2lub2RlX3B2dChmcywgaW5vZGUsIGlubyk7CisKKyAgICBpbm9kZS0+aW5vCQkJPSBpbm87CisgICAgaW5vZGUtPnNpemUgCQk9IGJlNjRfdG9fY3B1KG5jb3JlLT5kaV9zaXplKTsKKworICAgIGlmICgoYmUxNl90b19jcHUobmNvcmUtPmRpX21vZGUpICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CisJaW5vZGUtPm1vZGUgPSBEVF9ESVI7CisJeGZzX2RlYnVnKCJGb3VuZCBhIGRpcmVjdG9yeSBpbm9kZSEiKTsKKyAgICB9IGVsc2UgaWYgKChiZTE2X3RvX2NwdShuY29yZS0+ZGlfbW9kZSkgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKKwlpbm9kZS0+bW9kZSA9IERUX1JFRzsKKwl4ZnNfZGVidWcoIkZvdW5kIGEgZmlsZSBpbm9kZSEiKTsKKwl4ZnNfZGVidWcoImlub2RlIHNpemUgJWxsdSIsIGlub2RlLT5zaXplKTsKKyAgICB9IGVsc2UgaWYgKChiZTE2X3RvX2NwdShuY29yZS0+ZGlfbW9kZSkgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKKwlpbm9kZS0+bW9kZSA9IERUX0xOSzsKKwl4ZnNfZGVidWcoIkZvdW5kIGEgc3ltYm9saWMgbGluayBpbm9kZSEiKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW5vZGU7CisKK291dDoKKyAgICBmcmVlKGlub2RlKTsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgaW5vZGUgKnhmc19kaXIyX2Jsb2NrX2ZpbmRfZW50cnkoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50LAorCQkJCQl4ZnNfZGlub2RlX3QgKmNvcmUpCit7CisgICAgeGZzX2JtYnRfaXJlY190IHI7CisgICAgYmxvY2tfdCBkaXJfYmxrOworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IHBhcmVudC0+ZnM7CisgICAgY29uc3QgdWludDhfdCAqZGlyYmxrX2J1ZjsKKyAgICB1aW50OF90ICpwLCAqZW5kcDsKKyAgICB4ZnNfZGlyMl9kYXRhX2hkcl90ICpoZHI7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisgICAgeGZzX2RpcjJfYmxvY2tfdGFpbF90ICpidHA7CisgICAgeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwOworICAgIHhmc19kaXIyX2RhdGFfZW50cnlfdCAqZGVwOworICAgIHhmc19pbnRpbm9fdCBpbm87CisgICAgeGZzX2Rpbm9kZV90ICpuY29yZTsKKworICAgIHhmc19kZWJ1ZygiZG5hbWUgJXMgcGFyZW50ICVwIGNvcmUgJXAiLCBkbmFtZSwgcGFyZW50LCBjb3JlKTsKKworICAgIGJtYnRfaXJlY19nZXQoJnIsICh4ZnNfYm1idF9yZWNfdCAqKSZjb3JlLT5kaV9saXRlcmFsX2FyZWFbMF0pOworICAgIGRpcl9ibGsgPSBmc2Jsb2NrX3RvX2J5dGVzKGZzLCByLmJyX3N0YXJ0YmxvY2spID4+IEJMT0NLX1NISUZUKGZzKTsKKworICAgIGRpcmJsa19idWYgPSB4ZnNfZGlyMl9kaXJibGtzX2dldF9jYWNoZWQoZnMsIGRpcl9ibGssIHIuYnJfYmxvY2tjb3VudCk7CisgICAgaGRyID0gKHhmc19kaXIyX2RhdGFfaGRyX3QgKilkaXJibGtfYnVmOworICAgIGlmIChiZTMyX3RvX2NwdShoZHItPm1hZ2ljKSAhPSBYRlNfRElSMl9CTE9DS19NQUdJQykgeworICAgICAgICB4ZnNfZXJyb3IoIkJsb2NrIGRpcmVjdG9yeSBoZWFkZXIncyBtYWdpYyBudW1iZXIgZG9lcyBub3QgbWF0Y2ghIik7CisgICAgICAgIHhmc19kZWJ1ZygiaGRyLT5tYWdpYzogMHglbHgiLCBiZTMyX3RvX2NwdShoZHItPm1hZ2ljKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHAgPSAodWludDhfdCAqKShoZHIgKyAxKTsKKworICAgIGJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChYRlNfSU5GTyhmcyksIGhkcik7CisgICAgZW5kcCA9ICh1aW50OF90ICopKCh4ZnNfZGlyMl9sZWFmX2VudHJ5X3QgKilidHAgLSBiZTMyX3RvX2NwdShidHAtPmNvdW50KSk7CisKKyAgICB3aGlsZSAocCA8IGVuZHApIHsKKyAgICAgICAgdWludDhfdCAqc3RhcnRfbmFtZTsKKyAgICAgICAgdWludDhfdCAqZW5kX25hbWU7CisKKyAgICAgICAgZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKilwOworICAgICAgICBpZiAoYmUxNl90b19jcHUoZHVwLT5mcmVldGFnKSA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7CisgICAgICAgICAgICBwICs9IGJlMTZfdG9fY3B1KGR1cC0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKXA7CisKKyAgICAgICAgc3RhcnRfbmFtZSA9ICZkZXAtPm5hbWVbMF07CisgICAgICAgIGVuZF9uYW1lID0gc3RhcnRfbmFtZSArIGRlcC0+bmFtZWxlbjsKKworCWlmICgheGZzX2RpcjJfZW50cnlfbmFtZV9jbXAoc3RhcnRfbmFtZSwgZW5kX25hbWUsIGRuYW1lKSkgeworCSAgICB4ZnNfZGVidWcoIkZvdW5kIGVudHJ5ICVzIiwgZG5hbWUpOworICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgfQorCisJcCArPSB4ZnNfZGlyMl9kYXRhX2VudHNpemUoZGVwLT5uYW1lbGVuKTsKKyAgICB9CisKK291dDoKKyAgICByZXR1cm4gTlVMTDsKKworZm91bmQ6CisgICAgaW5vZGUgPSB4ZnNfbmV3X2lub2RlKGZzKTsKKworICAgIGlubyA9IGJlNjRfdG9fY3B1KGRlcC0+aW51bWJlcik7CisKKyAgICB4ZnNfZGVidWcoImVudHJ5IGlub2RlJ3MgbnVtYmVyICVsdSIsIGlubyk7CisKKyAgICBuY29yZSA9IHhmc19kaW5vZGVfZ2V0X2NvcmUoZnMsIGlubyk7CisgICAgaWYgKCFuY29yZSkgeworICAgICAgICB4ZnNfZXJyb3IoIkZhaWxlZCB0byBnZXQgZGlub2RlISIpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBmaWxsX3hmc19pbm9kZV9wdnQoZnMsIGlub2RlLCBpbm8pOworCisgICAgaW5vZGUtPmlubyA9IGlubzsKKyAgICBYRlNfUFZUKGlub2RlKS0+aV9pbm9fYmxrID0gaW5vX3RvX2J5dGVzKGZzLCBpbm8pID4+IEJMT0NLX1NISUZUKGZzKTsKKyAgICBpbm9kZS0+c2l6ZSA9IGJlNjRfdG9fY3B1KG5jb3JlLT5kaV9zaXplKTsKKworICAgIGlmICgoYmUxNl90b19jcHUobmNvcmUtPmRpX21vZGUpICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CisgICAgICAgIGlub2RlLT5tb2RlID0gRFRfRElSOworICAgICAgICB4ZnNfZGVidWcoIkZvdW5kIGEgZGlyZWN0b3J5IGlub2RlISIpOworICAgIH0gZWxzZSBpZiAoKGJlMTZfdG9fY3B1KG5jb3JlLT5kaV9tb2RlKSAmIFNfSUZNVCkgPT0gU19JRlJFRykgeworICAgICAgICBpbm9kZS0+bW9kZSA9IERUX1JFRzsKKyAgICAgICAgeGZzX2RlYnVnKCJGb3VuZCBhIGZpbGUgaW5vZGUhIik7CisgICAgICAgIHhmc19kZWJ1ZygiaW5vZGUgc2l6ZSAlbGx1IiwgaW5vZGUtPnNpemUpOworICAgIH0gZWxzZSBpZiAoKGJlMTZfdG9fY3B1KG5jb3JlLT5kaV9tb2RlKSAmIFNfSUZNVCkgPT0gU19JRkxOSykgeworICAgICAgICBpbm9kZS0+bW9kZSA9IERUX0xOSzsKKyAgICAgICAgeGZzX2RlYnVnKCJGb3VuZCBhIHN5bWJvbGljIGxpbmsgaW5vZGUhIik7CisgICAgfQorCisgICAgeGZzX2RlYnVnKCJlbnRyeSBpbm9kZSdzIG51bWJlciAlbHUiLCBpbm8pOworCisgICAgcmV0dXJuIGlub2RlOworCitmYWlsZWQ6CisgICAgZnJlZShpbm9kZSk7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGlub2RlICp4ZnNfZGlyMl9sZWFmX2ZpbmRfZW50cnkoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50LAorCQkJCSAgICAgICB4ZnNfZGlub2RlX3QgKmNvcmUpCit7CisgICAgeGZzX2RpcjJfbGVhZl90ICpsZWFmOworICAgIHhmc19ibWJ0X2lyZWNfdCBpcmVjOworICAgIGJsb2NrX3QgbGVhZl9ibGssIGRpcl9ibGs7CisgICAgeGZzX2RpcjJfbGVhZl9lbnRyeV90ICpsZXA7CisgICAgaW50IGxvdzsKKyAgICBpbnQgaGlnaDsKKyAgICBpbnQgbWlkID0gMDsKKyAgICB1aW50MzJfdCBoYXNoID0gMDsKKyAgICB1aW50MzJfdCBoYXNod2FudDsKKyAgICB1aW50MzJfdCBuZXdkYiwgY3VyZGIgPSAtMTsKKyAgICB4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKmRlcDsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlwOworICAgIHhmc19kaXIyX2RhdGFfaGRyX3QgKmRhdGFfaGRyOworICAgIHVpbnQ4X3QgKnN0YXJ0X25hbWU7CisgICAgdWludDhfdCAqZW5kX25hbWU7CisgICAgeGZzX2ludGlub190IGlubzsKKyAgICB4ZnNfZGlub2RlX3QgKm5jb3JlOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisKKyAgICB4ZnNfZGVidWcoImRuYW1lICVzIHBhcmVudCAlcCBjb3JlICVwIiwgZG5hbWUsIHBhcmVudCwgY29yZSk7CisKKyAgICBibWJ0X2lyZWNfZ2V0KCZpcmVjLCAoKHhmc19ibWJ0X3JlY190ICopJmNvcmUtPmRpX2xpdGVyYWxfYXJlYVswXSkgKworCQkJCQliZTMyX3RvX2NwdShjb3JlLT5kaV9uZXh0ZW50cykgLSAxKTsKKyAgICBsZWFmX2JsayA9IGZzYmxvY2tfdG9fYnl0ZXMocGFyZW50LT5mcywgaXJlYy5icl9zdGFydGJsb2NrKSA+PgorCSAgICBCTE9DS19TSElGVChwYXJlbnQtPmZzKTsKKworICAgIGxlYWYgPSAoeGZzX2RpcjJfbGVhZl90ICopeGZzX2RpcjJfZGlyYmxrc19nZXRfY2FjaGVkKHBhcmVudC0+ZnMsIGxlYWZfYmxrLAorCQkJCQkJCSAgaXJlYy5icl9ibG9ja2NvdW50KTsKKyAgICBpZiAoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpICE9IFhGU19ESVIyX0xFQUYxX01BR0lDKSB7CisgICAgICAgIHhmc19lcnJvcigiU2luZ2xlIGxlYWYgYmxvY2sgaGVhZGVyJ3MgbWFnaWMgbnVtYmVyIGRvZXMgbm90IG1hdGNoISIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoIWxlYWYtPmhkci5jb3VudCkKKwlnb3RvIG91dDsKKworICAgIGhhc2h3YW50ID0geGZzX2RpcjJfZGFfaGFzaG5hbWUoKHVpbnQ4X3QgKilkbmFtZSwgc3RybGVuKGRuYW1lKSk7CisKKyAgICAvKiBCaW5hcnkgc2VhcmNoICovCisgICAgZm9yIChsZXAgPSBsZWFmLT5lbnRzLCBsb3cgPSAwLCBoaWdoID0gYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSAtIDE7CisJIGxvdyA8PSBoaWdoOyApIHsKKyAgICAgICAgbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7CisgICAgICAgIGlmICgoaGFzaCA9IGJlMzJfdG9fY3B1KGxlcFttaWRdLmhhc2h2YWwpKSA9PSBoYXNod2FudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoaGFzaCA8IGhhc2h3YW50KQorICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7CisgICAgfQorCisgICAgLyogSWYgaGFzaCBpcyBub3QgdGhlIG9uZSB3ZSB3YW50LCB0aGVuIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgY29udGFpbiB0aGUKKyAgICAgKiBlbnRyeSB3ZSdyZSBsb29raW5nIGZvciBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBkbyBhbnltb3JlLgorICAgICAqLworICAgIGlmIChoYXNoICE9IGhhc2h3YW50KQorCWdvdG8gb3V0OworCisgICAgd2hpbGUgKG1pZCA+IDAgJiYgYmUzMl90b19jcHUobGVwW21pZCAtIDFdLmhhc2h2YWwpID09IGhhc2h3YW50KQorCW1pZC0tOworCisgICAgZm9yIChsZXAgPSAmbGVhZi0+ZW50c1ttaWRdOworCSBtaWQgPCBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpICYmCisJIGJlMzJfdG9fY3B1KGxlcC0+aGFzaHZhbCkgPT0gaGFzaHdhbnQ7CisJIGxlcCsrLCBtaWQrKykgeworICAgICAgICAvKiBTa2lwIG92ZXIgc3RhbGUgbGVhZiBlbnRyaWVzLiAqLworICAgICAgICBpZiAoYmUzMl90b19jcHUobGVwLT5hZGRyZXNzKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBuZXdkYiA9IHhmc19kaXIyX2RhdGFwdHJfdG9fZGIocGFyZW50LT5mcywgYmUzMl90b19jcHUobGVwLT5hZGRyZXNzKSk7CisgICAgICAgIGlmIChuZXdkYiAhPSBjdXJkYikgeworICAgICAgICAgICAgYm1idF9pcmVjX2dldCgmaXJlYywKKwkJICAoKHhmc19ibWJ0X3JlY190ICopJmNvcmUtPmRpX2xpdGVyYWxfYXJlYVswXSkgKyBuZXdkYik7CisgICAgICAgICAgICBkaXJfYmxrID0gZnNibG9ja190b19ieXRlcyhwYXJlbnQtPmZzLCBpcmVjLmJyX3N0YXJ0YmxvY2spID4+CisKKwkJICAgICAgQkxPQ0tfU0hJRlQocGFyZW50LT5mcyk7CisgICAgICAgICAgICBidWYgPSB4ZnNfZGlyMl9kaXJibGtzX2dldF9jYWNoZWQocGFyZW50LT5mcywgZGlyX2JsaywgaXJlYy5icl9ibG9ja2NvdW50KTsKKyAgICAgICAgICAgIGRhdGFfaGRyID0gKHhmc19kaXIyX2RhdGFfaGRyX3QgKilidWY7CisgICAgICAgICAgICBpZiAoYmUzMl90b19jcHUoZGF0YV9oZHItPm1hZ2ljKSAhPSBYRlNfRElSMl9EQVRBX01BR0lDKSB7CisgICAgICAgICAgICAgICAgeGZzX2Vycm9yKCJMZWFmIGRpcmVjdG9yeSdzIGRhdGEgbWFnaWMgTm8uIGRvZXMgbm90IG1hdGNoISIpOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJkYiA9IG5ld2RiOworICAgICAgICB9CisKKyAgICAgICAgZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKSgoY2hhciAqKWJ1ZiArCisgICAgICAgICAgICAgICB4ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihwYXJlbnQtPmZzLCBiZTMyX3RvX2NwdShsZXAtPmFkZHJlc3MpKSk7CisKKyAgICAgICAgc3RhcnRfbmFtZSA9ICZkZXAtPm5hbWVbMF07CisgICAgICAgIGVuZF9uYW1lID0gc3RhcnRfbmFtZSArIGRlcC0+bmFtZWxlbjsKKworCWlmICgheGZzX2RpcjJfZW50cnlfbmFtZV9jbXAoc3RhcnRfbmFtZSwgZW5kX25hbWUsIGRuYW1lKSkgeworCSAgICB4ZnNfZGVidWcoIkZvdW5kIGVudHJ5ICVzIiwgZG5hbWUpOworICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgfQorICAgIH0KKworb3V0OgorICAgIHJldHVybiBOVUxMOworCitmb3VuZDoKKyAgICBpcCA9IHhmc19uZXdfaW5vZGUocGFyZW50LT5mcyk7CisKKyAgICBpbm8gPSBiZTY0X3RvX2NwdShkZXAtPmludW1iZXIpOworCisgICAgeGZzX2RlYnVnKCJlbnRyeSBpbm9kZSdzIG51bWJlciAlbHUiLCBpbm8pOworCisgICAgbmNvcmUgPSB4ZnNfZGlub2RlX2dldF9jb3JlKHBhcmVudC0+ZnMsIGlubyk7CisgICAgaWYgKCFuY29yZSkgeworICAgICAgICB4ZnNfZXJyb3IoIkZhaWxlZCB0byBnZXQgZGlub2RlISIpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBmaWxsX3hmc19pbm9kZV9wdnQocGFyZW50LT5mcywgaXAsIGlubyk7CisKKyAgICBpcC0+aW5vID0gaW5vOworICAgIFhGU19QVlQoaXApLT5pX2lub19ibGsgPSBpbm9fdG9fYnl0ZXMocGFyZW50LT5mcywgaW5vKSA+PgorCSAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NISUZUKHBhcmVudC0+ZnMpOworICAgIGlwLT5zaXplID0gYmU2NF90b19jcHUobmNvcmUtPmRpX3NpemUpOworCisgICAgaWYgKChiZTE2X3RvX2NwdShuY29yZS0+ZGlfbW9kZSkgJiBTX0lGTVQpID09IFNfSUZESVIpIHsKKyAgICAgICAgaXAtPm1vZGUgPSBEVF9ESVI7CisgICAgICAgIHhmc19kZWJ1ZygiRm91bmQgYSBkaXJlY3RvcnkgaW5vZGUhIik7CisgICAgfSBlbHNlIGlmICgoYmUxNl90b19jcHUobmNvcmUtPmRpX21vZGUpICYgU19JRk1UKSA9PSBTX0lGUkVHKSB7CisgICAgICAgIGlwLT5tb2RlID0gRFRfUkVHOworICAgICAgICB4ZnNfZGVidWcoIkZvdW5kIGEgZmlsZSBpbm9kZSEiKTsKKyAgICAgICAgeGZzX2RlYnVnKCJpbm9kZSBzaXplICVsbHUiLCBpcC0+c2l6ZSk7CisgICAgfSBlbHNlIGlmICgoYmUxNl90b19jcHUobmNvcmUtPmRpX21vZGUpICYgU19JRk1UKSA9PSBTX0lGTE5LKSB7CisgICAgICAgIGlwLT5tb2RlID0gRFRfTE5LOworICAgICAgICB4ZnNfZGVidWcoIkZvdW5kIGEgc3ltYm9saWMgbGluayBpbm9kZSEiKTsKKyAgICB9CisKKyAgICB4ZnNfZGVidWcoImVudHJ5IGlub2RlJ3MgbnVtYmVyICVsdSIsIGlubyk7CisKKyAgICByZXR1cm4gaXA7CisKK2ZhaWxlZDoKKyAgICBmcmVlKGlwKTsKKworICAgIHJldHVybiBpcDsKK30KKworc3RhdGljIHhmc19mc2Jsb2NrX3QKK3NlbGVjdF9jaGlsZCh4ZnNfZGZpbG9mZl90IG9mZiwKKyAgICAgICAgICAgICB4ZnNfYm1idF9rZXlfdCAqa3AsCisgICAgICAgICAgICAgeGZzX2JtYnRfcHRyX3QgKnBwLAorICAgICAgICAgICAgIGludCBucmVjcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBucmVjczsgaSsrKSB7CisgICAgICAgIGlmIChiZTY0X3RvX2NwdShrcFtpXS5icl9zdGFydG9mZikgPT0gb2ZmKQorICAgICAgICAgICAgcmV0dXJuIGJlNjRfdG9fY3B1KHBwW2ldKTsKKyAgICAgICAgaWYgKGJlNjRfdG9fY3B1KGtwW2ldLmJyX3N0YXJ0b2ZmKSA+IG9mZikgeworICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYmU2NF90b19jcHUocHBbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBiZTY0X3RvX2NwdShwcFtpLTFdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiZTY0X3RvX2NwdShwcFtucmVjcyAtIDFdKTsKK30KKworYmxvY2tfdCB4ZnNfZGlyMl9nZXRfcmlnaHRfYmxrKHN0cnVjdCBmc19pbmZvICpmcywgeGZzX2Rpbm9kZV90ICpjb3JlLAorCQkJICAgICAgIGJsb2NrX3QgZnNibGtubywgaW50ICplcnJvcikKK3sKKyAgICB1aW50MzJfdCBpZHg7CisgICAgeGZzX2JtYnRfaXJlY190IGlyZWM7CisgICAgYmxvY2tfdCBibm87CisgICAgYmxvY2tfdCBuZXh0Ym5vOworICAgIHhmc19ibWRyX2Jsb2NrX3QgKnJibG9jazsKKyAgICBpbnQgZnNpemU7CisgICAgaW50IG5leHRlbnRzOworICAgIHhmc19ibWJ0X3B0cl90ICpwcDsKKyAgICB4ZnNfYm1idF9rZXlfdCAqa3A7CisgICAgeGZzX2J0cmVlX2Jsb2NrX3QgKmJsazsKKyAgICB4ZnNfYm1idF9yZWNfdCAqeHA7CisKKyAgICAqZXJyb3IgPSAwOworICAgIGlmIChjb3JlLT5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykgeworICAgICAgICB4ZnNfZGVidWcoIlhGU19ESU5PREVfRk1UX0VYVEVOVFMiKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBiZTMyX3RvX2NwdShjb3JlLT5kaV9uZXh0ZW50cyk7IGlkeCsrKSB7CisgICAgICAgICAgICBibWJ0X2lyZWNfZ2V0KCZpcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKHhmc19ibWJ0X3JlY190ICopJmNvcmUtPmRpX2xpdGVyYWxfYXJlYVswXSkgKyBpZHgpOworICAgICAgICAgICAgaWYgKGZzYmxrbm8gPj0gaXJlYy5icl9zdGFydG9mZiAmJgorICAgICAgICAgICAgICAgIGZzYmxrbm8gPCBpcmVjLmJyX3N0YXJ0b2ZmICsgaXJlYy5icl9ibG9ja2NvdW50KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjb3JlLT5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpIHsKKyAgICAgICAgeGZzX2RlYnVnKCJYRlNfRElOT0RFX0ZNVF9CVFJFRSIpOworICAgICAgICBibm8gPSBOVUxMRlNCTE9DSzsKKyAgICAgICAgcmJsb2NrID0gKHhmc19ibWRyX2Jsb2NrX3QgKikmY29yZS0+ZGlfbGl0ZXJhbF9hcmVhWzBdOworICAgICAgICBmc2l6ZSA9IFhGU19ERk9SS19TSVpFKGNvcmUsIGZzLCBYRlNfREFUQV9GT1JLKTsKKyAgICAgICAgcHAgPSBYRlNfQk1EUl9QVFJfQUREUihyYmxvY2ssIDEsIHhmc19ibWRyX21heHJlY3MoZnNpemUsIDApKTsKKyAgICAgICAga3AgPSBYRlNfQk1EUl9LRVlfQUREUihyYmxvY2ssIDEpOworICAgICAgICBibm8gPSBmc2Jsb2NrX3RvX2J5dGVzKGZzLAorICAgICAgICAgICAgICAgICAgc2VsZWN0X2NoaWxkKGZzYmxrbm8sIGtwLCBwcCwKKyAgICAgICAgICAgICAgICAgICAgICBiZTE2X3RvX2NwdShyYmxvY2stPmJiX251bXJlY3MpKSkgPj4gQkxPQ0tfU0hJRlQoZnMpOworCisgICAgICAgIC8qIEZpbmQgdGhlIGxlYWYgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgYmxrID0gKHhmc19idHJlZV9ibG9ja190ICopZ2V0X2NhY2hlKGZzLT5mc19kZXYsIGJubyk7CisgICAgICAgICAgICBpZiAoYmUxNl90b19jcHUoYmxrLT5iYl9sZXZlbCkgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHBwID0gWEZTX0JNQlRfUFRSX0FERFIoZnMsIGJsaywgMSwKKyAgICAgICAgICAgICAgICAgICAgIHhmc19ibWRyX21heHJlY3MoWEZTX0lORk8oZnMpLT5ibG9ja3NpemUsIDApKTsKKyAgICAgICAgICAgIGtwID0gWEZTX0JNQlRfS0VZX0FERFIoZnMsIGJsaywgMSk7CisgICAgICAgICAgICBibm8gPSBmc2Jsb2NrX3RvX2J5dGVzKGZzLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdF9jaGlsZChmc2Jsa25vLCBrcCwgcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJlMTZfdG9fY3B1KGJsay0+YmJfbnVtcmVjcykpKSA+PiBCTE9DS19TSElGVChmcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSByZWNvcmRzIGFtb25nIGxlYXZlcyAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBuZXh0Ym5vID0gYmU2NF90b19jcHUoYmxrLT5iYl91LmwuYmJfcmlnaHRzaWIpOworICAgICAgICAgICAgbmV4dGVudHMgPSBiZTE2X3RvX2NwdShibGstPmJiX251bXJlY3MpOworICAgICAgICAgICAgeHAgPSAoeGZzX2JtYnRfcmVjX3QgKilYRlNfQk1CVF9SRUNfQUREUihmcywgYmxrLCAxKTsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbmV4dGVudHM7IGlkeCsrKSB7CisgICAgICAgICAgICAgICAgYm1idF9pcmVjX2dldCgmaXJlYywgeHAgKyBpZHgpOworICAgICAgICAgICAgICAgIGlmIChmc2Jsa25vID49IGlyZWMuYnJfc3RhcnRvZmYgJiYKKyAgICAgICAgICAgICAgICAgICAgZnNibGtubyA8IGlyZWMuYnJfc3RhcnRvZmYgKyBpcmVjLmJyX2Jsb2NrY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dGJubyA9IE5VTExGU0JMT0NLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV4dGJubyA9PSBOVUxMRlNCTE9DSykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJubyA9IGZzYmxvY2tfdG9fYnl0ZXMoZnMsIG5leHRibm8pID4+IEJMT0NLX1NISUZUKGZzKTsKKyAgICAgICAgICAgIGJsayA9ICh4ZnNfYnRyZWVfYmxvY2tfdCAqKWdldF9jYWNoZShmcy0+ZnNfZGV2LCBibm8pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZzYmxrbm8gPCBpcmVjLmJyX3N0YXJ0b2ZmIHx8CisgICAgICAgIGZzYmxrbm8gPj0gaXJlYy5icl9zdGFydG9mZiArIGlyZWMuYnJfYmxvY2tjb3VudCkKKyAgICAgICAgKmVycm9yID0gMTsKKworICAgIHJldHVybiBmc2Jsb2NrX3RvX2J5dGVzKGZzLAorICAgICAgICAgICAgICAgIGZzYmxrbm8gLSBpcmVjLmJyX3N0YXJ0b2ZmICsgaXJlYy5icl9zdGFydGJsb2NrKSA+PgorICAgICAgICAgICAgICAgIEJMT0NLX1NISUZUKGZzKTsKK30KKworc3RydWN0IGlub2RlICp4ZnNfZGlyMl9ub2RlX2ZpbmRfZW50cnkoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50LAorCQkJCSAgICAgICB4ZnNfZGlub2RlX3QgKmNvcmUpCit7CisgICAgYmxvY2tfdCBmc2Jsa25vOworICAgIHhmc19kYV9pbnRub2RlX3QgKm5vZGUgPSBOVUxMOworICAgIHVpbnQzMl90IGhhc2h3YW50OworICAgIHVpbnQzMl90IGhhc2ggPSAwOworICAgIHhmc19kYV9ub2RlX2VudHJ5X3QgKmJ0cmVlOworICAgIHVpbnQxNl90IG1heDsKKyAgICB1aW50MTZfdCBzcGFuOworICAgIHVpbnQxNl90IHByb2JlOworICAgIGludCBlcnJvcjsKKyAgICB4ZnNfZGlyMl9kYXRhX2hkcl90ICpkYXRhX2hkcjsKKyAgICB4ZnNfZGlyMl9sZWFmX3QgKmxlYWY7CisgICAgeGZzX2RpcjJfbGVhZl9lbnRyeV90ICpsZXA7CisgICAgeGZzX2RpcjJfZGF0YV9lbnRyeV90ICpkZXA7CisgICAgc3RydWN0IGlub2RlICppcDsKKyAgICB1aW50OF90ICpzdGFydF9uYW1lOworICAgIHVpbnQ4X3QgKmVuZF9uYW1lOworICAgIGludCBsb3c7CisgICAgaW50IGhpZ2g7CisgICAgaW50IG1pZCA9IDA7CisgICAgdWludDMyX3QgbmV3ZGIsIGN1cmRiID0gLTE7CisgICAgeGZzX2ludGlub190IGlubzsKKyAgICB4ZnNfZGlub2RlX3QgKm5jb3JlOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisKKyAgICB4ZnNfZGVidWcoImRuYW1lICVzIHBhcmVudCAlcCBjb3JlICVwIiwgZG5hbWUsIHBhcmVudCwgY29yZSk7CisKKyAgICBoYXNod2FudCA9IHhmc19kaXIyX2RhX2hhc2huYW1lKCh1aW50OF90ICopZG5hbWUsIHN0cmxlbihkbmFtZSkpOworCisgICAgZnNibGtubyA9IHhmc19kaXIyX2dldF9yaWdodF9ibGsocGFyZW50LT5mcywgY29yZSwKKyAgICAgICAgICAgICAgICAgIHhmc19kaXIyX2J5dGVfdG9fZGIocGFyZW50LT5mcywgWEZTX0RJUjJfTEVBRl9PRkZTRVQpLAorICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgeGZzX2Vycm9yKCJDYW5ub3QgZmluZCByaWdodCByZWMhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG5vZGUgPSAoeGZzX2RhX2ludG5vZGVfdCAqKXhmc19kaXIyX2RpcmJsa3NfZ2V0X2NhY2hlZChwYXJlbnQtPmZzLCBmc2Jsa25vLAorCQkJCQkJCSAgIDEpOworICAgIGlmIChiZTE2X3RvX2NwdShub2RlLT5oZHIuaW5mby5tYWdpYykgIT0gWEZTX0RBX05PREVfTUFHSUMpIHsKKyAgICAgICAgeGZzX2Vycm9yKCJOb2RlJ3MgbWFnaWMgbnVtYmVyIGRvZXMgbm90IG1hdGNoISIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGlmICghbm9kZS0+aGRyLmNvdW50KQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgLyogR2l2ZW4gYSBoYXNoIHRvIGxvb2t1cCwgeW91IHJlYWQgdGhlIG5vZGUncyBidHJlZSBhcnJheSBhbmQgZmlyc3QKKyAgICAgICAgICogImhhc2h2YWwiIGluIHRoZSBhcnJheSB0aGF0IGV4Y2VlZHMgdGhlIGdpdmVuIGhhc2ggYW5kIGl0IGNhbiB0aGVuCisgICAgICAgICAqIGJlIGZvdW5kIGluIHRoZSBibG9jayBwb2ludGVkIGJ5IHRoZSAiYmVmb3JlIiB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIG1heCA9IGJlMTZfdG9fY3B1KG5vZGUtPmhkci5jb3VudCk7CisKKyAgICAgICAgcHJvYmUgPSBzcGFuID0gbWF4LzI7CisgICAgICAgIGZvciAoYnRyZWUgPSAmbm9kZS0+YnRyZWVbcHJvYmVdOworICAgICAgICAgICAgIHNwYW4gPiA0OyBidHJlZSA9ICZub2RlLT5idHJlZVtwcm9iZV0pIHsKKyAgICAgICAgICAgIHNwYW4gLz0gMjsKKyAgICAgICAgICAgIGhhc2ggPSBiZTMyX3RvX2NwdShidHJlZS0+aGFzaHZhbCk7CisKKyAgICAgICAgICAgIGlmIChoYXNoIDwgaGFzaHdhbnQpCisgICAgICAgICAgICAgICAgcHJvYmUgKz0gc3BhbjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGhhc2ggPiBoYXNod2FudCkKKyAgICAgICAgICAgICAgICBwcm9iZSAtPSBzcGFuOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKChwcm9iZSA+IDApICYmIChiZTMyX3RvX2NwdShidHJlZS0+aGFzaHZhbCkgPj0gaGFzaHdhbnQpKSB7CisgICAgICAgICAgICBidHJlZS0tOworICAgICAgICAgICAgcHJvYmUtLTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgocHJvYmUgPCBtYXgpICYmIChiZTMyX3RvX2NwdShidHJlZS0+aGFzaHZhbCkgPCBoYXNod2FudCkpIHsKKyAgICAgICAgICAgIGJ0cmVlKys7CisgICAgICAgICAgICBwcm9iZSsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2JlID09IG1heCkKKyAgICAgICAgICAgIGZzYmxrbm8gPSBiZTMyX3RvX2NwdShub2RlLT5idHJlZVttYXgtMV0uYmVmb3JlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnNibGtubyA9IGJlMzJfdG9fY3B1KG5vZGUtPmJ0cmVlW3Byb2JlXS5iZWZvcmUpOworCisgICAgICAgIGZzYmxrbm8gPSB4ZnNfZGlyMl9nZXRfcmlnaHRfYmxrKHBhcmVudC0+ZnMsIGNvcmUsIGZzYmxrbm8sICZlcnJvcik7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgeGZzX2Vycm9yKCJDYW5ub3QgZmluZCByaWdodCByZWMhIik7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGUgPSAoeGZzX2RhX2ludG5vZGVfdCAqKXhmc19kaXIyX2RpcmJsa3NfZ2V0X2NhY2hlZChwYXJlbnQtPmZzLAorCQkJCQkJCSAgICAgICBmc2Jsa25vLCAxKTsKKyAgICB9IHdoaWxlKGJlMTZfdG9fY3B1KG5vZGUtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisKKyAgICBsZWFmID0gKHhmc19kaXIyX2xlYWZfdCopbm9kZTsKKyAgICBpZiAoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpICE9IFhGU19ESVIyX0xFQUZOX01BR0lDKSB7CisgICAgICAgIHhmc19lcnJvcigiTGVhZidzIG1hZ2ljIG51bWJlciBkb2VzIG5vdCBtYXRjaCEiKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKCFsZWFmLT5oZHIuY291bnQpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgZm9yIChsZXAgPSBsZWFmLT5lbnRzLCBsb3cgPSAwLCBoaWdoID0gYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSAtIDE7CisgICAgICAgICBsb3cgPD0gaGlnaDsgKSB7CisgICAgICAgIG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOworCisgICAgICAgIGlmICgoaGFzaCA9IGJlMzJfdG9fY3B1KGxlcFttaWRdLmhhc2h2YWwpKSA9PSBoYXNod2FudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoaGFzaCA8IGhhc2h3YW50KQorICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7CisgICAgfQorCisgICAgLyogSWYgaGFzaCBpcyBub3QgdGhlIG9uZSB3ZSB3YW50LCB0aGVuIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgY29udGFpbiB0aGUKKyAgICAgKiBlbnRyeSB3ZSdyZSBsb29raW5nIGZvciBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBkbyBhbnltb3JlLgorICAgICAqLworICAgIGlmIChoYXNoICE9IGhhc2h3YW50KQorICAgICAgICBnb3RvIG91dDsKKworICAgIHdoaWxlIChtaWQgPiAwICYmIGJlMzJfdG9fY3B1KGxlcFttaWQgLSAxXS5oYXNodmFsKSA9PSBoYXNod2FudCkKKyAgICAgICAgbWlkLS07CisKKyAgICBmb3IgKGxlcCA9ICZsZWFmLT5lbnRzW21pZF07CisgICAgICAgICBtaWQgPCBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpICYmCisgICAgICAgICBiZTMyX3RvX2NwdShsZXAtPmhhc2h2YWwpID09IGhhc2h3YW50OworICAgICAgICAgbGVwKyssIG1pZCsrKSB7CisgICAgICAgIC8qIFNraXAgb3ZlciBzdGFsZSBsZWFmIGVudHJpZXMuICovCisgICAgICAgIGlmIChiZTMyX3RvX2NwdShsZXAtPmFkZHJlc3MpID09IFhGU19ESVIyX05VTExfREFUQVBUUikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG5ld2RiID0geGZzX2RpcjJfZGF0YXB0cl90b19kYihwYXJlbnQtPmZzLCBiZTMyX3RvX2NwdShsZXAtPmFkZHJlc3MpKTsKKyAgICAgICAgaWYgKG5ld2RiICE9IGN1cmRiKSB7CisgICAgICAgICAgICBmc2Jsa25vID0geGZzX2RpcjJfZ2V0X3JpZ2h0X2JsayhwYXJlbnQtPmZzLCBjb3JlLCBuZXdkYiwgJmVycm9yKTsKKyAgICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgIHhmc19lcnJvcigiQ2Fubm90IGZpbmQgZGF0YSBibG9jayEiKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmID0geGZzX2RpcjJfZGlyYmxrc19nZXRfY2FjaGVkKHBhcmVudC0+ZnMsIGZzYmxrbm8sIDEpOworICAgICAgICAgICAgZGF0YV9oZHIgPSAoeGZzX2RpcjJfZGF0YV9oZHJfdCAqKWJ1ZjsKKyAgICAgICAgICAgIGlmIChiZTMyX3RvX2NwdShkYXRhX2hkci0+bWFnaWMpICE9IFhGU19ESVIyX0RBVEFfTUFHSUMpIHsKKyAgICAgICAgICAgICAgICB4ZnNfZXJyb3IoIkxlYWYgZGlyZWN0b3J5J3MgZGF0YSBtYWdpYyBOby4gZG9lcyBub3QgbWF0Y2ghIik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cmRiID0gbmV3ZGI7CisgICAgICAgIH0KKworICAgICAgICBkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopKChjaGFyICopYnVmICsKKyAgICAgICAgICAgICAgIHhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKHBhcmVudC0+ZnMsIGJlMzJfdG9fY3B1KGxlcC0+YWRkcmVzcykpKTsKKworICAgICAgICBzdGFydF9uYW1lID0gJmRlcC0+bmFtZVswXTsKKyAgICAgICAgZW5kX25hbWUgPSBzdGFydF9uYW1lICsgZGVwLT5uYW1lbGVuOworCisJaWYgKCF4ZnNfZGlyMl9lbnRyeV9uYW1lX2NtcChzdGFydF9uYW1lLCBlbmRfbmFtZSwgZG5hbWUpKSB7CisJICAgIHhmc19kZWJ1ZygiRm91bmQgZW50cnkgJXMiLCBkbmFtZSk7CisJICAgIGdvdG8gZm91bmQ7CisgICAgICAgIH0KKyAgICB9CisKK291dDoKKyAgICByZXR1cm4gTlVMTDsKKworZm91bmQ6CisgICAgaXAgPSB4ZnNfbmV3X2lub2RlKHBhcmVudC0+ZnMpOworICAgIGlubyA9IGJlNjRfdG9fY3B1KGRlcC0+aW51bWJlcik7CisgICAgbmNvcmUgPSB4ZnNfZGlub2RlX2dldF9jb3JlKHBhcmVudC0+ZnMsIGlubyk7CisgICAgaWYgKCFuY29yZSkgeworICAgICAgICB4ZnNfZXJyb3IoIkZhaWxlZCB0byBnZXQgZGlub2RlISIpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBmaWxsX3hmc19pbm9kZV9wdnQocGFyZW50LT5mcywgaXAsIGlubyk7CisgICAgaXAtPmlubyA9IGlubzsKKyAgICBYRlNfUFZUKGlwKS0+aV9pbm9fYmxrID0gaW5vX3RvX2J5dGVzKHBhcmVudC0+ZnMsIGlubykgPj4KKyAgICAgICAgQkxPQ0tfU0hJRlQocGFyZW50LT5mcyk7CisgICAgaXAtPnNpemUgPSBiZTY0X3RvX2NwdShuY29yZS0+ZGlfc2l6ZSk7CisKKyAgICBpZiAoKGJlMTZfdG9fY3B1KG5jb3JlLT5kaV9tb2RlKSAmIFNfSUZNVCkgPT0gU19JRkRJUikgeworICAgICAgICBpcC0+bW9kZSA9IERUX0RJUjsKKyAgICAgICAgeGZzX2RlYnVnKCJGb3VuZCBhIGRpcmVjdG9yeSBpbm9kZSEiKTsKKyAgICB9IGVsc2UgaWYgKChiZTE2X3RvX2NwdShuY29yZS0+ZGlfbW9kZSkgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKKyAgICAgICAgaXAtPm1vZGUgPSBEVF9SRUc7CisgICAgICAgIHhmc19kZWJ1ZygiRm91bmQgYSBmaWxlIGlub2RlISIpOworICAgICAgICB4ZnNfZGVidWcoImlub2RlIHNpemUgJWxsdSIsIGlwLT5zaXplKTsKKyAgICB9IGVsc2UgaWYgKChiZTE2X3RvX2NwdShuY29yZS0+ZGlfbW9kZSkgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKKyAgICAgICAgaXAtPm1vZGUgPSBEVF9MTks7CisgICAgICAgIHhmc19kZWJ1ZygiRm91bmQgYSBzeW1ib2xpYyBsaW5rIGlub2RlISIpOworICAgIH0KKworICAgIHhmc19kZWJ1ZygiZW50cnkgaW5vZGUncyBudW1iZXIgJWx1IiwgaW5vKTsKKworICAgIHJldHVybiBpcDsKKworZmFpbGVkOgorICAgIGZyZWUoaXApOworCisgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZzL3hmcy94ZnNfZGlyMi5oIGIvY29yZS9mcy94ZnMveGZzX2RpcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThjZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy94ZnMveGZzX2RpcjIuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWxvIEFsY2FudGFyYSA8cGNhY2pyQHp5dG9yLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFhGU19ESVIyX0hfCisjZGVmaW5lIFhGU19ESVIyX0hfCisKKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSA8ZnMuaD4KKworI2luY2x1ZGUgInhmcy5oIgorCitjb25zdCB2b2lkICp4ZnNfZGlyMl9kaXJibGtzX2dldF9jYWNoZWQoc3RydWN0IGZzX2luZm8gKmZzLCBibG9ja190IHN0YXJ0YmxvY2ssCisJCQkJCXhmc19maWxibGtzX3QgYyk7Cit2b2lkIHhmc19kaXIyX2RpcmJsa3NfZmx1c2hfY2FjaGUodm9pZCk7CisKK3VpbnQzMl90IHhmc19kaXIyX2RhX2hhc2huYW1lKGNvbnN0IHVpbnQ4X3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKworYmxvY2tfdCB4ZnNfZGlyMl9nZXRfcmlnaHRfYmxrKHN0cnVjdCBmc19pbmZvICpmcywgeGZzX2Rpbm9kZV90ICpjb3JlLAorCQkJICAgICAgIGJsb2NrX3QgZnNibGtubywgaW50ICplcnJvcik7CisKK3N0cnVjdCBpbm9kZSAqeGZzX2RpcjJfbG9jYWxfZmluZF9lbnRyeShjb25zdCBjaGFyICpkbmFtZSwgc3RydWN0IGlub2RlICpwYXJlbnQsCisJCQkJCXhmc19kaW5vZGVfdCAqY29yZSk7CitzdHJ1Y3QgaW5vZGUgKnhmc19kaXIyX2Jsb2NrX2ZpbmRfZW50cnkoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50LAorCQkJCQl4ZnNfZGlub2RlX3QgKmNvcmUpOworc3RydWN0IGlub2RlICp4ZnNfZGlyMl9sZWFmX2ZpbmRfZW50cnkoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50LAorCQkJCSAgICAgICB4ZnNfZGlub2RlX3QgKmNvcmUpOworc3RydWN0IGlub2RlICp4ZnNfZGlyMl9ub2RlX2ZpbmRfZW50cnkoY29uc3QgY2hhciAqZG5hbWUsIHN0cnVjdCBpbm9kZSAqcGFyZW50LAorCQkJCSAgICAgICB4ZnNfZGlub2RlX3QgKmNvcmUpOworCitzdGF0aWMgaW5saW5lIGJvb2wgeGZzX2RpcjJfaXNsZWFmKHN0cnVjdCBmc19pbmZvICpmcywgeGZzX2Rpbm9kZV90ICpkaXApCit7CisgICAgdWludDY0X3QgbGFzdCA9IDA7CisgICAgeGZzX2JtYnRfaXJlY190IGlyZWM7CisKKyAgICBibWJ0X2lyZWNfZ2V0KCZpcmVjLCAoKHhmc19ibWJ0X3JlY190ICopJmRpcC0+ZGlfbGl0ZXJhbF9hcmVhWzBdKSArCisJCSAgICAgICAgIGJlMzJfdG9fY3B1KGRpcC0+ZGlfbmV4dGVudHMpIC0gMSk7CisgICAgbGFzdCA9IGlyZWMuYnJfc3RhcnRvZmYgKyBpcmVjLmJyX2Jsb2NrY291bnQ7CisKKyAgICByZXR1cm4gKGxhc3QgPT0gWEZTX0lORk8oZnMpLT5kaXJsZWFmYmxrICsgKDEgPDwgWEZTX0lORk8oZnMpLT5kaXJibGtsb2cpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGZzX2RpcjJfZW50cnlfbmFtZV9jbXAodWludDhfdCAqc3RhcnQsIHVpbnQ4X3QgKmVuZCwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmICghbmFtZSB8fCAoc3RybGVuKG5hbWUpICE9IGVuZCAtIHN0YXJ0KSkKKwlyZXR1cm4gLTE7CisKKyAgICB3aGlsZSAoc3RhcnQgPCBlbmQpCisJaWYgKCpzdGFydCsrICE9ICpuYW1lKyspCisJICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogWEZTX0RJUjJfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZnMveGZzL3hmc19mcy5oIGIvY29yZS9mcy94ZnMveGZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3ODIwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnMveGZzL3hmc19mcy5oCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogVGFrZW4gZnJvbSBMaW51eCBrZXJuZWwgdHJlZSAobGludXgvZnMveGZzKQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NS0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWxvIEFsY2FudGFyYSA8cGNhY2pyQHp5dG9yLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFhGU19GU19IXworI2RlZmluZSBYRlNfRlNfSF8KKworLyoKKyAqIFNHSSdzIFhGUyBmaWxlc3lzdGVtJ3MgbWFqb3Igc3R1ZmYgKGNvbnN0YW50cywgc3RydWN0dXJlcykKKyAqLworCisvKgorICogRGlyZWN0IEkvTyBhdHRyaWJ1dGUgcmVjb3JkIHVzZWQgd2l0aCBYRlNfSU9DX0RJT0lORk8KKyAqIGRfbWluaW9zeiBpcyB0aGUgbWluIHhmZXIgc2l6ZSwgeGZlciBzaXplIG11bHRpcGxlIGFuZCBmaWxlIHNlZWsgb2Zmc2V0CisgKiBhbGlnbm1lbnQuCisgKi8KK3N0cnVjdCBkaW9hdHRyIHsKKwl1aW50MzJfdAkJZF9tZW07CQkvKiBkYXRhIGJ1ZmZlciBtZW1vcnkgYWxpZ25tZW50ICovCisJdWludDMyX3QJCWRfbWluaW9zejsJLyogbWluIHhmZXIgc2l6ZQkJKi8KKwl1aW50MzJfdAkJZF9tYXhpb3N6OwkvKiBtYXggeGZlciBzaXplCQkqLworfTsKKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgWEZTX0lPQ19GU0dFVFhBVFRSW0FdIGFuZCBYRlNfSU9DX0ZTU0VUWEFUVFIuCisgKi8KK3N0cnVjdCBmc3hhdHRyIHsKKwl1aW50MzJfdAkJZnN4X3hmbGFnczsJLyogeGZsYWdzIGZpZWxkIHZhbHVlIChnZXQvc2V0KSAqLworCXVpbnQzMl90CQlmc3hfZXh0c2l6ZTsJLyogZXh0c2l6ZSBmaWVsZCB2YWx1ZSAoZ2V0L3NldCkqLworCXVpbnQzMl90CQlmc3hfbmV4dGVudHM7CS8qIG5leHRlbnRzIGZpZWxkIHZhbHVlIChnZXQpCSovCisJdWludDMyX3QJCWZzeF9wcm9qaWQ7CS8qIHByb2plY3QgaWRlbnRpZmllciAoZ2V0L3NldCkgKi8KKwl1bnNpZ25lZCBjaGFyCWZzeF9wYWRbMTJdOworfTsKKworLyoKKyAqIEZsYWdzIGZvciB0aGUgYnNfeGZsYWdzL2ZzeF94ZmxhZ3MgZmllbGQKKyAqIFRoZXJlIHNob3VsZCBiZSBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGVzZSBmbGFncyBhbmQgdGhlCisgKiBYRlNfRElGTEFHX3MuCisgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX1JFQUxUSU1FCTB4MDAwMDAwMDEJLyogZGF0YSBpbiByZWFsdGltZSB2b2x1bWUgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX1BSRUFMTE9DCTB4MDAwMDAwMDIJLyogcHJlYWxsb2NhdGVkIGZpbGUgZXh0ZW50cyAqLworI2RlZmluZSBYRlNfWEZMQUdfSU1NVVRBQkxFCTB4MDAwMDAwMDgJLyogZmlsZSBjYW5ub3QgYmUgbW9kaWZpZWQgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0FQUEVORAkweDAwMDAwMDEwCS8qIGFsbCB3cml0ZXMgYXBwZW5kICovCisjZGVmaW5lIFhGU19YRkxBR19TWU5DCQkweDAwMDAwMDIwCS8qIGFsbCB3cml0ZXMgc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX05PQVRJTUUJMHgwMDAwMDA0MAkvKiBkbyBub3QgdXBkYXRlIGFjY2VzcyB0aW1lICovCisjZGVmaW5lIFhGU19YRkxBR19OT0RVTVAJMHgwMDAwMDA4MAkvKiBkbyBub3QgaW5jbHVkZSBpbiBiYWNrdXBzICovCisjZGVmaW5lIFhGU19YRkxBR19SVElOSEVSSVQJMHgwMDAwMDEwMAkvKiBjcmVhdGUgd2l0aCBydCBiaXQgc2V0ICovCisjZGVmaW5lIFhGU19YRkxBR19QUk9KSU5IRVJJVAkweDAwMDAwMjAwCS8qIGNyZWF0ZSB3aXRoIHBhcmVudHMgcHJvamlkICovCisjZGVmaW5lIFhGU19YRkxBR19OT1NZTUxJTktTCTB4MDAwMDA0MDAJLyogZGlzYWxsb3cgc3ltbGluayBjcmVhdGlvbiAqLworI2RlZmluZSBYRlNfWEZMQUdfRVhUU0laRQkweDAwMDAwODAwCS8qIGV4dGVudCBzaXplIGFsbG9jYXRvciBoaW50ICovCisjZGVmaW5lIFhGU19YRkxBR19FWFRTWklOSEVSSVQJMHgwMDAwMTAwMAkvKiBpbmhlcml0IGlub2RlIGV4dGVudCBzaXplICovCisjZGVmaW5lIFhGU19YRkxBR19OT0RFRlJBRwkweDAwMDAyMDAwICAJLyogZG8gbm90IGRlZnJhZ21lbnQgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0ZJTEVTVFJFQU0JMHgwMDAwNDAwMAkvKiB1c2UgZmlsZXN0cmVhbSBhbGxvY2F0b3IgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0hBU0FUVFIJMHg4MDAwMDAwMAkvKiBubyBESUZMQUcgZm9yIHRoaXMJKi8KKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgWEZTX0lPQ19HRVRCTUFQLgorICogT24gaW5wdXQsIGZpbGwgaW4gYm12X29mZnNldCBhbmQgYm12X2xlbmd0aCBvZiB0aGUgZmlyc3Qgc3RydWN0dXJlCisgKiB0byBpbmRpY2F0ZSB0aGUgYXJlYSBvZiBpbnRlcmVzdCBpbiB0aGUgZmlsZSwgYW5kIGJtdl9lbnRyaWVzIHdpdGgKKyAqIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgZ2l2ZW4gYmFjay4gIFRoZSBmaXJzdCBzdHJ1Y3R1cmUgaXMKKyAqIHVwZGF0ZWQgb24gcmV0dXJuIHRvIGdpdmUgdGhlIG9mZnNldCBhbmQgbGVuZ3RoIGZvciB0aGUgbmV4dCBjYWxsLgorICovCitzdHJ1Y3QgZ2V0Ym1hcCB7CisJaW50NjRfdAkJYm12X29mZnNldDsJLyogZmlsZSBvZmZzZXQgb2Ygc2VnbWVudCBpbiBibG9ja3MgKi8KKwlpbnQ2NF90CQlibXZfYmxvY2s7CS8qIHN0YXJ0aW5nIGJsb2NrICg2NC1iaXQgZGFkZHJfdCkgICovCisJaW50NjRfdAkJYm12X2xlbmd0aDsJLyogbGVuZ3RoIG9mIHNlZ21lbnQsIGJsb2NrcwkgICAgKi8KKwlpbnQzMl90CQlibXZfY291bnQ7CS8qICMgb2YgZW50cmllcyBpbiBhcnJheSBpbmNsLiAxc3QgICovCisJaW50MzJfdAkJYm12X2VudHJpZXM7CS8qICMgb2YgZW50cmllcyBmaWxsZWQgaW4gKG91dHB1dCkgICovCit9OworCisvKgorICoJU3RydWN0dXJlIGZvciBYRlNfSU9DX0dFVEJNQVBYLgkgRmllbGRzIGJtdl9vZmZzZXQgdGhyb3VnaCBibXZfZW50cmllcworICoJYXJlIHVzZWQgZXhhY3RseSBhcyBpbiB0aGUgZ2V0Ym1hcCBzdHJ1Y3R1cmUuICBUaGUgZ2V0Ym1hcHggc3RydWN0dXJlCisgKgloYXMgYWRkaXRpb25hbCBibXZfaWZsYWdzIGFuZCBibXZfb2ZsYWdzIGZpZWxkcy4gVGhlIGJtdl9pZmxhZ3MgZmllbGQKKyAqCWlzIG9ubHkgdXNlZCBmb3IgdGhlIGZpcnN0IHN0cnVjdHVyZS4gIEl0IGNvbnRhaW5zIGlucHV0IGZsYWdzCisgKglzcGVjaWZ5aW5nIFhGU19JT0NfR0VUQk1BUFggYWN0aW9ucy4gIFRoZSBibXZfb2ZsYWdzIGZpZWxkIGlzIGZpbGxlZAorICoJaW4gYnkgdGhlIFhGU19JT0NfR0VUQk1BUFggY29tbWFuZCBmb3IgZWFjaCByZXR1cm5lZCBzdHJ1Y3R1cmUgYWZ0ZXIKKyAqCXRoZSBmaXJzdC4KKyAqLworc3RydWN0IGdldGJtYXB4IHsKKwlpbnQ2NF90CQlibXZfb2Zmc2V0OwkvKiBmaWxlIG9mZnNldCBvZiBzZWdtZW50IGluIGJsb2NrcyAqLworCWludDY0X3QJCWJtdl9ibG9jazsJLyogc3RhcnRpbmcgYmxvY2sgKDY0LWJpdCBkYWRkcl90KSAgKi8KKwlpbnQ2NF90CQlibXZfbGVuZ3RoOwkvKiBsZW5ndGggb2Ygc2VnbWVudCwgYmxvY2tzCSAgICAqLworCWludDMyX3QJCWJtdl9jb3VudDsJLyogIyBvZiBlbnRyaWVzIGluIGFycmF5IGluY2wuIDFzdCAgKi8KKwlpbnQzMl90CQlibXZfZW50cmllczsJLyogIyBvZiBlbnRyaWVzIGZpbGxlZCBpbiAob3V0cHV0KS4gKi8KKwlpbnQzMl90CQlibXZfaWZsYWdzOwkvKiBpbnB1dCBmbGFncyAoMXN0IHN0cnVjdHVyZSkJICAgICovCisJaW50MzJfdAkJYm12X29mbGFnczsJLyogb3V0cHV0IGZsYWdzIChhZnRlciAxc3Qgc3RydWN0dXJlKSovCisJaW50MzJfdAkJYm12X3VudXNlZDE7CS8qIGZ1dHVyZSB1c2UJCQkgICAgKi8KKwlpbnQzMl90CQlibXZfdW51c2VkMjsJLyogZnV0dXJlIHVzZQkJCSAgICAqLworfTsKKworLyoJYm12X2lmbGFncyB2YWx1ZXMgLSBzZXQgYnkgWEZTX0lPQ19HRVRCTUFQWCBjYWxsZXIuCSovCisjZGVmaW5lIEJNVl9JRl9BVFRSRk9SSwkJMHgxCS8qIHJldHVybiBhdHRyIGZvcmsgcmF0aGVyIHRoYW4gZGF0YSAqLworI2RlZmluZSBCTVZfSUZfTk9fRE1BUElfUkVBRAkweDIJLyogRG8gbm90IGdlbmVyYXRlIERNQVBJIHJlYWQgZXZlbnQgICovCisjZGVmaW5lIEJNVl9JRl9QUkVBTExPQwkJMHg0CS8qIHJ0biBzdGF0dXMgQk1WX09GX1BSRUFMTE9DIGlmIHJlcSAqLworI2RlZmluZSBCTVZfSUZfREVMQUxMT0MJCTB4OAkvKiBydG4gc3RhdHVzIEJNVl9PRl9ERUxBTExPQyBpZiByZXEgKi8KKyNkZWZpbmUgQk1WX0lGX05PX0hPTEVTCQkweDEwCS8qIERvIG5vdCByZXR1cm4gaG9sZXMgKi8KKyNkZWZpbmUgQk1WX0lGX1ZBTElECVwKKwkoQk1WX0lGX0FUVFJGT1JLfEJNVl9JRl9OT19ETUFQSV9SRUFEfEJNVl9JRl9QUkVBTExPQ3wJXAorCSBCTVZfSUZfREVMQUxMT0N8Qk1WX0lGX05PX0hPTEVTKQorCisvKglibXZfb2ZsYWdzIHZhbHVlcyAtIHJldHVybmVkIGZvciBlYWNoIG5vbi1oZWFkZXIgc2VnbWVudCAqLworI2RlZmluZSBCTVZfT0ZfUFJFQUxMT0MJCTB4MQkvKiBzZWdtZW50ID0gdW53cml0dGVuIHByZS1hbGxvY2F0aW9uICovCisjZGVmaW5lIEJNVl9PRl9ERUxBTExPQwkJMHgyCS8qIHNlZ21lbnQgPSBkZWxheWVkIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgQk1WX09GX0xBU1QJCTB4NAkvKiBzZWdtZW50IGlzIHRoZSBsYXN0IGluIHRoZSBmaWxlICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIFhGU19JT0NfRlNTRVRETS4KKyAqIEZvciB1c2UgYnkgYmFja3VwIGFuZCByZXN0b3JlIHByb2dyYW1zIHRvIHNldCB0aGUgWEZTIG9uLWRpc2sgaW5vZGUKKyAqIGZpZWxkcyBkaV9kbWV2bWFzayBhbmQgZGlfZG1zdGF0ZS4gIFRoZXNlIG11c3QgYmUgc2V0IHRvIGV4YWN0bHkgYW5kCisgKiBvbmx5IHZhbHVlcyBwcmV2aW91c2x5IG9idGFpbmVkIHZpYSB4ZnNfYnVsa3N0YXQhICAoU3BlY2lmaWNhbGx5IHRoZQorICogeGZzX2JzdGF0X3QgZmllbGRzIGJzX2RtZXZtYXNrIGFuZCBic19kbXN0YXRlLikKKyAqLworc3RydWN0IGZzZG1pZGF0YSB7CisJdWludDMyX3QJCWZzZF9kbWV2bWFzazsJLyogY29ycmVzcG9uZHMgdG8gZGlfZG1ldm1hc2sgKi8KKwlfX3UxNgkJZnNkX3BhZGRpbmc7CisJX191MTYJCWZzZF9kbXN0YXRlOwkvKiBjb3JyZXNwb25kcyB0byBkaV9kbXN0YXRlICAqLworfTsKKworLyoKKyAqIEZpbGUgc2VnbWVudCBsb2NraW5nIHNldCBkYXRhIHR5cGUgZm9yIDY0IGJpdCBhY2Nlc3MuCisgKiBBbHNvIHVzZWQgZm9yIGFsbCB0aGUgUkVTVi9GUkVFIGludGVyZmFjZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mbG9jazY0IHsKKwlfX3MxNgkJbF90eXBlOworCV9fczE2CQlsX3doZW5jZTsKKwlpbnQ2NF90CQlsX3N0YXJ0OworCWludDY0X3QJCWxfbGVuOwkJLyogbGVuID09IDAgbWVhbnMgdW50aWwgZW5kIG9mIGZpbGUgKi8KKwlpbnQzMl90CQlsX3N5c2lkOworCXVpbnQzMl90CQlsX3BpZDsKKwlpbnQzMl90CQlsX3BhZFs0XTsJLyogcmVzZXJ2ZSBhcmVhCQkJICAgICovCit9IHhmc19mbG9jazY0X3Q7CisKKy8qCisgKiBPdXRwdXQgZm9yIFhGU19JT0NfRlNHRU9NRVRSWV9WMQorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9nZW9tX3YxIHsKKwl1aW50MzJfdAkJYmxvY2tzaXplOwkvKiBmaWxlc3lzdGVtIChkYXRhKSBibG9jayBzaXplICovCisJdWludDMyX3QJCXJ0ZXh0c2l6ZTsJLyogcmVhbHRpbWUgZXh0ZW50IHNpemUJCSovCisJdWludDMyX3QJCWFnYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiBhbiBBRwkJKi8KKwl1aW50MzJfdAkJYWdjb3VudDsJLyogbnVtYmVyIG9mIGFsbG9jYXRpb24gZ3JvdXBzCSovCisJdWludDMyX3QJCWxvZ2Jsb2NrczsJLyogZnNibG9ja3MgaW4gdGhlIGxvZwkJKi8KKwl1aW50MzJfdAkJc2VjdHNpemU7CS8qIChkYXRhKSBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwl1aW50MzJfdAkJaW5vZGVzaXplOwkvKiBpbm9kZSBzaXplIGluIGJ5dGVzCQkqLworCXVpbnQzMl90CQlpbWF4cGN0OwkvKiBtYXggYWxsb3dlZCBpbm9kZSBzcGFjZSglKQkqLworCXVpbnQ2NF90CQlkYXRhYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiBkYXRhIHN1YnZvbHVtZQkqLworCXVpbnQ2NF90CQlydGJsb2NrczsJLyogZnNibG9ja3MgaW4gcmVhbHRpbWUgc3Vidm9sCSovCisJdWludDY0X3QJCXJ0ZXh0ZW50czsJLyogcnQgZXh0ZW50cyBpbiByZWFsdGltZSBzdWJ2b2wqLworCXVpbnQ2NF90CQlsb2dzdGFydDsJLyogc3RhcnRpbmcgZnNibG9jayBvZiB0aGUgbG9nCSovCisJdW5zaWduZWQgY2hhcgl1dWlkWzE2XTsJLyogdW5pcXVlIGlkIG9mIHRoZSBmaWxlc3lzdGVtCSovCisJdWludDMyX3QJCXN1bml0OwkJLyogc3RyaXBlIHVuaXQsIGZzYmxvY2tzCSovCisJdWludDMyX3QJCXN3aWR0aDsJCS8qIHN0cmlwZSB3aWR0aCwgZnNibG9ja3MJKi8KKwlpbnQzMl90CQl2ZXJzaW9uOwkvKiBzdHJ1Y3R1cmUgdmVyc2lvbgkJKi8KKwl1aW50MzJfdAkJZmxhZ3M7CQkvKiBzdXBlcmJsb2NrIHZlcnNpb24gZmxhZ3MJKi8KKwl1aW50MzJfdAkJbG9nc2VjdHNpemU7CS8qIGxvZyBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwl1aW50MzJfdAkJcnRzZWN0c2l6ZTsJLyogcmVhbHRpbWUgc2VjdG9yIHNpemUsIGJ5dGVzCSovCisJdWludDMyX3QJCWRpcmJsb2Nrc2l6ZTsJLyogZGlyZWN0b3J5IGJsb2NrIHNpemUsIGJ5dGVzCSovCit9IHhmc19mc29wX2dlb21fdjFfdDsKKworLyoKKyAqIE91dHB1dCBmb3IgWEZTX0lPQ19GU0dFT01FVFJZCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2dlb20geworCXVpbnQzMl90CQlibG9ja3NpemU7CS8qIGZpbGVzeXN0ZW0gKGRhdGEpIGJsb2NrIHNpemUgKi8KKwl1aW50MzJfdAkJcnRleHRzaXplOwkvKiByZWFsdGltZSBleHRlbnQgc2l6ZQkJKi8KKwl1aW50MzJfdAkJYWdibG9ja3M7CS8qIGZzYmxvY2tzIGluIGFuIEFHCQkqLworCXVpbnQzMl90CQlhZ2NvdW50OwkvKiBudW1iZXIgb2YgYWxsb2NhdGlvbiBncm91cHMJKi8KKwl1aW50MzJfdAkJbG9nYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiB0aGUgbG9nCQkqLworCXVpbnQzMl90CQlzZWN0c2l6ZTsJLyogKGRhdGEpIHNlY3RvciBzaXplLCBieXRlcwkqLworCXVpbnQzMl90CQlpbm9kZXNpemU7CS8qIGlub2RlIHNpemUgaW4gYnl0ZXMJCSovCisJdWludDMyX3QJCWltYXhwY3Q7CS8qIG1heCBhbGxvd2VkIGlub2RlIHNwYWNlKCUpCSovCisJdWludDY0X3QJCWRhdGFibG9ja3M7CS8qIGZzYmxvY2tzIGluIGRhdGEgc3Vidm9sdW1lCSovCisJdWludDY0X3QJCXJ0YmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiByZWFsdGltZSBzdWJ2b2wJKi8KKwl1aW50NjRfdAkJcnRleHRlbnRzOwkvKiBydCBleHRlbnRzIGluIHJlYWx0aW1lIHN1YnZvbCovCisJdWludDY0X3QJCWxvZ3N0YXJ0OwkvKiBzdGFydGluZyBmc2Jsb2NrIG9mIHRoZSBsb2cJKi8KKwl1bnNpZ25lZCBjaGFyCXV1aWRbMTZdOwkvKiB1bmlxdWUgaWQgb2YgdGhlIGZpbGVzeXN0ZW0JKi8KKwl1aW50MzJfdAkJc3VuaXQ7CQkvKiBzdHJpcGUgdW5pdCwgZnNibG9ja3MJKi8KKwl1aW50MzJfdAkJc3dpZHRoOwkJLyogc3RyaXBlIHdpZHRoLCBmc2Jsb2NrcwkqLworCWludDMyX3QJCXZlcnNpb247CS8qIHN0cnVjdHVyZSB2ZXJzaW9uCQkqLworCXVpbnQzMl90CQlmbGFnczsJCS8qIHN1cGVyYmxvY2sgdmVyc2lvbiBmbGFncwkqLworCXVpbnQzMl90CQlsb2dzZWN0c2l6ZTsJLyogbG9nIHNlY3RvciBzaXplLCBieXRlcwkqLworCXVpbnQzMl90CQlydHNlY3RzaXplOwkvKiByZWFsdGltZSBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwl1aW50MzJfdAkJZGlyYmxvY2tzaXplOwkvKiBkaXJlY3RvcnkgYmxvY2sgc2l6ZSwgYnl0ZXMJKi8KKwl1aW50MzJfdAkJbG9nc3VuaXQ7CS8qIGxvZyBzdHJpcGUgdW5pdCwgYnl0ZXMgKi8KK30geGZzX2Zzb3BfZ2VvbV90OworCisvKiBPdXRwdXQgZm9yIFhGU19GU19DT1VOVFMgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2NvdW50cyB7CisJdWludDY0X3QJZnJlZWRhdGE7CS8qIGZyZWUgZGF0YSBzZWN0aW9uIGJsb2NrcyAqLworCXVpbnQ2NF90CWZyZWVydHg7CS8qIGZyZWUgcnQgZXh0ZW50cyAqLworCXVpbnQ2NF90CWZyZWVpbm87CS8qIGZyZWUgaW5vZGVzICovCisJdWludDY0X3QJYWxsb2Npbm87CS8qIHRvdGFsIGFsbG9jYXRlZCBpbm9kZXMgKi8KK30geGZzX2Zzb3BfY291bnRzX3Q7CisKKy8qIElucHV0L091dHB1dCBmb3IgWEZTX0dFVF9SRVNCTEtTIGFuZCBYRlNfU0VUX1JFU0JMS1MgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX3Jlc2Jsa3MgeworCXVpbnQ2NF90ICByZXNibGtzOworCXVpbnQ2NF90ICByZXNibGtzX2F2YWlsOworfSB4ZnNfZnNvcF9yZXNibGtzX3Q7CisKKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9WRVJTSU9OCTAKKworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0FUVFIJMHgwMDAxCS8qIGF0dHJpYnV0ZXMgaW4gdXNlCSovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfTkxJTksJMHgwMDAyCS8qIDMyLWJpdCBubGluayB2YWx1ZXMJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19RVU9UQQkweDAwMDQJLyogcXVvdGFzIGVuYWJsZWQJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19JQUxJR04JMHgwMDA4CS8qIGlub2RlIGFsaWdubWVudAkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0RBTElHTgkweDAwMTAJLyogbGFyZ2UgZGF0YSBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19TSEFSRUQJMHgwMDIwCS8qIHJlYWQtb25seSBzaGFyZWQJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19FWFRGTEcJMHgwMDQwCS8qIHNwZWNpYWwgZXh0ZW50IGZsYWcJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19ESVJWMgkweDAwODAJLyogZGlyZWN0b3J5IHZlcnNpb24gMgkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0xPR1YyCTB4MDEwMAkvKiBsb2cgZm9ybWF0IHZlcnNpb24gMgkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX1NFQ1RPUgkweDAyMDAJLyogc2VjdG9yIHNpemVzID4xQkIJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19BVFRSMgkweDA0MDAJLyogaW5saW5lIGF0dHJpYnV0ZXMgcmV3b3JrICovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfRElSVjJDSQkweDEwMDAJLyogQVNDSUkgb25seSBDSSBuYW1lcyAqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0xBWllTQgkweDQwMDAJLyogbGF6eSBzdXBlcmJsb2NrIGNvdW50ZXJzICovCisKKworLyoKKyAqIE1pbmltdW0gYW5kIG1heGltdW0gc2l6ZXMgbmVlZCBmb3IgZ3Jvd3RoIGNoZWNrcworICovCisjZGVmaW5lIFhGU19NSU5fQUdfQkxPQ0tTCTY0CisjZGVmaW5lIFhGU19NSU5fTE9HX0JMT0NLUwk1MTJVTEwKKyNkZWZpbmUgWEZTX01BWF9MT0dfQkxPQ0tTCSgxMDI0ICogMTAyNFVMTCkKKyNkZWZpbmUgWEZTX01JTl9MT0dfQllURVMJKDEwICogMTAyNCAqIDEwMjRVTEwpCisKKy8qIGtlZXAgdGhlIG1heGltdW0gc2l6ZSB1bmRlciAyXjMxIGJ5IGEgc21hbGwgYW1vdW50ICovCisjZGVmaW5lIFhGU19NQVhfTE9HX0JZVEVTIFwKKwkoKDIgKiAxMDI0ICogMTAyNCAqIDEwMjRVTEwpIC0gWEZTX01JTl9MT0dfQllURVMpCisKKy8qIFVzZWQgZm9yIHNhbml0eSBjaGVja3Mgb24gc3VwZXJibG9jayAqLworI2RlZmluZSBYRlNfTUFYX0RCTE9DS1MocykgKCh4ZnNfZHJmc2Jub190KShzKS0+c2JfYWdjb3VudCAqIChzKS0+c2JfYWdibG9ja3MpCisjZGVmaW5lIFhGU19NSU5fREJMT0NLUyhzKSAoKHhmc19kcmZzYm5vX3QpKChzKS0+c2JfYWdjb3VudCAtIDEpICoJXAorCQkJIChzKS0+c2JfYWdibG9ja3MgKyBYRlNfTUlOX0FHX0JMT0NLUykKKworLyoKKyAqIFN0cnVjdHVyZXMgZm9yIFhGU19JT0NfRlNHUk9XRlNEQVRBLCBYRlNfSU9DX0ZTR1JPV0ZTTE9HICYgWEZTX0lPQ19GU0dST1dGU1JUCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19ncm93ZnNfZGF0YSB7CisJdWludDY0X3QJCW5ld2Jsb2NrczsJLyogbmV3IGRhdGEgc3Vidm9sIHNpemUsIGZzYmxvY2tzICovCisJdWludDMyX3QJCWltYXhwY3Q7CS8qIG5ldyBpbm9kZSBzcGFjZSBwZXJjZW50YWdlIGxpbWl0ICovCit9IHhmc19ncm93ZnNfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZ3Jvd2ZzX2xvZyB7CisJdWludDMyX3QJCW5ld2Jsb2NrczsJLyogbmV3IGxvZyBzaXplLCBmc2Jsb2NrcyAqLworCXVpbnQzMl90CQlpc2ludDsJCS8qIDEgaWYgbmV3IGxvZyBpcyBpbnRlcm5hbCAqLworfSB4ZnNfZ3Jvd2ZzX2xvZ190OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZ3Jvd2ZzX3J0IHsKKwl1aW50NjRfdAkJbmV3YmxvY2tzOwkvKiBuZXcgcmVhbHRpbWUgc2l6ZSwgZnNibG9ja3MgKi8KKwl1aW50MzJfdAkJZXh0c2l6ZTsJLyogbmV3IHJlYWx0aW1lIGV4dGVudCBzaXplLCBmc2Jsb2NrcyAqLworfSB4ZnNfZ3Jvd2ZzX3J0X3Q7CisKKworLyoKKyAqIFN0cnVjdHVyZXMgcmV0dXJuZWQgZnJvbSBpb2N0bCBYRlNfSU9DX0ZTQlVMS1NUQVQgJiBYRlNfSU9DX0ZTQlVMS1NUQVRfU0lOR0xFCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19ic3RpbWUgeworCXRpbWVfdAkJdHZfc2VjOwkJLyogc2Vjb25kcwkJKi8KKwlpbnQzMl90CQl0dl9uc2VjOwkvKiBhbmQgbmFub3NlY29uZHMJKi8KK30geGZzX2JzdGltZV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnN0YXQgeworCXVpbnQ2NF90CQlic19pbm87CQkvKiBpbm9kZSBudW1iZXIJCQkqLworCV9fdTE2CQlic19tb2RlOwkvKiB0eXBlIGFuZCBtb2RlCQkqLworCV9fdTE2CQlic19ubGluazsJLyogbnVtYmVyIG9mIGxpbmtzCQkqLworCXVpbnQzMl90CQlic191aWQ7CQkvKiB1c2VyIGlkCQkJKi8KKwl1aW50MzJfdAkJYnNfZ2lkOwkJLyogZ3JvdXAgaWQJCQkqLworCXVpbnQzMl90CQlic19yZGV2OwkvKiBkZXZpY2UgdmFsdWUJCQkqLworCWludDMyX3QJCWJzX2Jsa3NpemU7CS8qIGJsb2NrIHNpemUJCQkqLworCWludDY0X3QJCWJzX3NpemU7CS8qIGZpbGUgc2l6ZQkJCSovCisJeGZzX2JzdGltZV90CWJzX2F0aW1lOwkvKiBhY2Nlc3MgdGltZQkJCSovCisJeGZzX2JzdGltZV90CWJzX210aW1lOwkvKiBtb2RpZnkgdGltZQkJCSovCisJeGZzX2JzdGltZV90CWJzX2N0aW1lOwkvKiBpbm9kZSBjaGFuZ2UgdGltZQkJKi8KKwlpbnQ2NF90CQlic19ibG9ja3M7CS8qIG51bWJlciBvZiBibG9ja3MJCSovCisJdWludDMyX3QJCWJzX3hmbGFnczsJLyogZXh0ZW5kZWQgZmxhZ3MJCSovCisJaW50MzJfdAkJYnNfZXh0c2l6ZTsJLyogZXh0ZW50IHNpemUJCQkqLworCWludDMyX3QJCWJzX2V4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzCQkqLworCXVpbnQzMl90CQlic19nZW47CQkvKiBnZW5lcmF0aW9uIGNvdW50CQkqLworCV9fdTE2CQlic19wcm9qaWRfbG87CS8qIGxvd2VyIHBhcnQgb2YgcHJvamVjdCBpZAkqLworI2RlZmluZQlic19wcm9qaWQJYnNfcHJvamlkX2xvCS8qIChwcmV2aW91c2x5IGp1c3QgYnNfcHJvamlkKQkqLworCV9fdTE2CQlic19mb3Jrb2ZmOwkvKiBpbm9kZSBmb3JrIG9mZnNldCBpbiBieXRlcwkqLworCV9fdTE2CQlic19wcm9qaWRfaGk7CS8qIGhpZ2hlciBwYXJ0IG9mIHByb2plY3QgaWQJKi8KKwl1bnNpZ25lZCBjaGFyCWJzX3BhZFsxMF07CS8qIHBhZCBzcGFjZSwgdW51c2VkCQkqLworCXVpbnQzMl90CQlic19kbWV2bWFzazsJLyogRE1JRyBldmVudCBtYXNrCQkqLworCV9fdTE2CQlic19kbXN0YXRlOwkvKiBETUlHIHN0YXRlIGluZm8JCSovCisJX191MTYJCWJzX2FleHRlbnRzOwkvKiBhdHRyaWJ1dGUgbnVtYmVyIG9mIGV4dGVudHMJKi8KK30geGZzX2JzdGF0X3Q7CisKKy8qCisgKiBUaGUgdXNlci1sZXZlbCBCdWxrU3RhdCBSZXF1ZXN0IGludGVyZmFjZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2J1bGtyZXEgeworCXVpbnQ2NF90CQlfX3VzZXIgKmxhc3RpcDsJLyogbGFzdCBpbm9kZSAjIHBvaW50ZXIJCSovCisJaW50MzJfdAkJaWNvdW50OwkJLyogY291bnQgb2YgZW50cmllcyBpbiBidWZmZXIJKi8KKwl2b2lkCQlfX3VzZXIgKnVidWZmZXI7LyogdXNlciBidWZmZXIgZm9yIGlub2RlIGRlc2MuCSovCisJaW50MzJfdAkJX191c2VyICpvY291bnQ7CS8qIG91dHB1dCBjb3VudCBwb2ludGVyCQkqLworfSB4ZnNfZnNvcF9idWxrcmVxX3Q7CisKKworLyoKKyAqIFN0cnVjdHVyZXMgcmV0dXJuZWQgZnJvbSB4ZnNfaW51bWJlcnMgcm91dGluZSAoWEZTX0lPQ19GU0lOVU1CRVJTKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2lub2dycCB7CisJdWludDY0X3QJCXhpX3N0YXJ0aW5vOwkvKiBzdGFydGluZyBpbm9kZSBudW1iZXIJKi8KKwlpbnQzMl90CQl4aV9hbGxvY2NvdW50OwkvKiAjIGJpdHMgc2V0IGluIGFsbG9jbWFzawkqLworCXVpbnQ2NF90CQl4aV9hbGxvY21hc2s7CS8qIG1hc2sgb2YgYWxsb2NhdGVkIGlub2RlcwkqLworfSB4ZnNfaW5vZ3JwX3Q7CisKKworLyoKKyAqIEVycm9yIGluamVjdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbiB7CisJaW50MzJfdAkJZmQ7CisJaW50MzJfdAkJZXJydGFnOworfSB4ZnNfZXJyb3JfaW5qZWN0aW9uX3Q7CisKKworLyoKKyAqIFRoZSB1c2VyLWxldmVsIEhhbmRsZSBSZXF1ZXN0IGludGVyZmFjZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSB7CisJdWludDMyX3QJCWZkOwkJLyogZmQgZm9yIEZEX1RPX0hBTkRMRQkJKi8KKwl2b2lkCQlfX3VzZXIgKnBhdGg7CS8qIHVzZXIgcGF0aG5hbWUJCSovCisJdWludDMyX3QJCW9mbGFnczsJCS8qIG9wZW4gZmxhZ3MJCQkqLworCXZvaWQJCV9fdXNlciAqaWhhbmRsZTsvKiB1c2VyIHN1cHBsaWVkIGhhbmRsZQkJKi8KKwl1aW50MzJfdAkJaWhhbmRsZW47CS8qIHVzZXIgc3VwcGxpZWQgbGVuZ3RoCQkqLworCXZvaWQJCV9fdXNlciAqb2hhbmRsZTsvKiB1c2VyIGJ1ZmZlciBmb3IgaGFuZGxlCSovCisJdWludDMyX3QJCV9fdXNlciAqb2hhbmRsZW47LyogdXNlciBidWZmZXIgbGVuZ3RoCQkqLworfSB4ZnNfZnNvcF9oYW5kbGVyZXFfdDsKKworLyoKKyAqIENvbXBvdW5kIHN0cnVjdHVyZXMgZm9yIHBhc3NpbmcgYXJncyB0aHJvdWdoIEhhbmRsZSBSZXF1ZXN0IGludGVyZmFjZXMKKyAqIHhmc19mc3NldGRtX2J5X2hhbmRsZSwgeGZzX2F0dHJsaXN0X2J5X2hhbmRsZSwgeGZzX2F0dHJtdWx0aV9ieV9oYW5kbGUKKyAqIC0gaW9jdGxzOiBYRlNfSU9DX0ZTU0VURE1fQllfSEFORExFLCBYRlNfSU9DX0FUVFJMSVNUX0JZX0hBTkRMRSwgYW5kCisgKgkgICAgIFhGU19JT0NfQVRUUk1VTFRJX0JZX0hBTkRMRQorICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX3NldGRtX2hhbmRsZXJlcSB7CisJc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcQlocmVxOwkvKiBoYW5kbGUgaW5mb3JtYXRpb24JKi8KKwlzdHJ1Y3QgZnNkbWlkYXRhCQlfX3VzZXIgKmRhdGE7CS8qIERNQVBJIGRhdGEJKi8KK30geGZzX2Zzb3Bfc2V0ZG1faGFuZGxlcmVxX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRybGlzdF9jdXJzb3IgeworCXVpbnQzMl90CQlvcGFxdWVbNF07Cit9IHhmc19hdHRybGlzdF9jdXJzb3JfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Zzb3BfYXR0cmxpc3RfaGFuZGxlcmVxIHsKKwlzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxCWhyZXE7IC8qIGhhbmRsZSBpbnRlcmZhY2Ugc3RydWN0dXJlICovCisJc3RydWN0IHhmc19hdHRybGlzdF9jdXJzb3IJcG9zOyAvKiBvcGFxdWUgY29va2llLCBsaXN0IG9mZnNldCAqLworCXVpbnQzMl90CQkJCWZsYWdzOwkvKiB3aGljaCBuYW1lc3BhY2UgdG8gdXNlICovCisJdWludDMyX3QJCQkJYnVmbGVuOwkvKiBsZW5ndGggb2YgYnVmZmVyIHN1cHBsaWVkICovCisJdm9pZAkJCQlfX3VzZXIgKmJ1ZmZlcjsJLyogcmV0dXJuZWQgbmFtZXMgKi8KK30geGZzX2Zzb3BfYXR0cmxpc3RfaGFuZGxlcmVxX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX211bHRpb3AgeworCXVpbnQzMl90CQlhbV9vcGNvZGU7CisjZGVmaW5lIEFUVFJfT1BfR0VUCTEJLyogcmV0dXJuIHRoZSBpbmRpY2F0ZWQgYXR0cidzIHZhbHVlICovCisjZGVmaW5lIEFUVFJfT1BfU0VUCTIJLyogc2V0L2NyZWF0ZSB0aGUgaW5kaWNhdGVkIGF0dHIvdmFsdWUgcGFpciAqLworI2RlZmluZSBBVFRSX09QX1JFTU9WRQkzCS8qIHJlbW92ZSB0aGUgaW5kaWNhdGVkIGF0dHIgKi8KKwlpbnQzMl90CQlhbV9lcnJvcjsKKwl2b2lkCQlfX3VzZXIgKmFtX2F0dHJuYW1lOworCXZvaWQJCV9fdXNlciAqYW1fYXR0cnZhbHVlOworCXVpbnQzMl90CQlhbV9sZW5ndGg7CisJdWludDMyX3QJCWFtX2ZsYWdzOworfSB4ZnNfYXR0cl9tdWx0aW9wX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXEgeworCXN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEJaHJlcTsgLyogaGFuZGxlIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KKwl1aW50MzJfdAkJCQlvcGNvdW50Oy8qIGNvdW50IG9mIGZvbGxvd2luZyBtdWx0aW9wICovCisJc3RydWN0IHhmc19hdHRyX211bHRpb3AJCV9fdXNlciAqb3BzOyAvKiBhdHRyX211bHRpIGRhdGEgKi8KK30geGZzX2Zzb3BfYXR0cm11bHRpX2hhbmRsZXJlcV90OworCisvKgorICogcGVyIG1hY2hpbmUgdW5pcXVlIGZpbGVzeXN0ZW0gaWRlbnRpZmllciB0eXBlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyB1aW50MzJfdCB2YWxbMl07IH0geGZzX2ZzaWRfdDsgLyogZmlsZSBzeXN0ZW0gaWQgdHlwZSAqLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZmlkIHsKKwlfX3UxNglmaWRfbGVuOwkJLyogbGVuZ3RoIG9mIHJlbWFpbmRlcgkqLworCV9fdTE2CWZpZF9wYWQ7CisJdWludDMyX3QJZmlkX2dlbjsJCS8qIGdlbmVyYXRpb24gbnVtYmVyCSovCisJdWludDY0X3QJZmlkX2lubzsJCS8qIDY0IGJpdHMgaW5vZGUgbnVtYmVyICovCit9IHhmc19maWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2hhbmRsZSB7CisJdW5pb24geworCQlpbnQ2NF90CSAgICBhbGlnbjsJLyogZm9yY2UgYWxpZ25tZW50IG9mIGhhX2ZpZAkgKi8KKwkJeGZzX2ZzaWRfdCAgX2hhX2ZzaWQ7CS8qIHVuaXF1ZSBmaWxlIHN5c3RlbSBpZGVudGlmaWVyICovCisJfSBoYV91OworCXhmc19maWRfdAloYV9maWQ7CQkvKiBmaWxlIHN5c3RlbSBzcGVjaWZpYyBmaWxlIElECSAqLworfSB4ZnNfaGFuZGxlX3Q7CisjZGVmaW5lIGhhX2ZzaWQgaGFfdS5faGFfZnNpZAorCisjZGVmaW5lIFhGU19IU0laRShoYW5kbGUpCSgoKGNoYXIgKikgJihoYW5kbGUpLmhhX2ZpZC5maWRfcGFkCSBcCisJCQkJIC0gKGNoYXIgKikgJihoYW5kbGUpKQkJCSAgXAorCQkJCSArIChoYW5kbGUpLmhhX2ZpZC5maWRfbGVuKQorCisvKgorICogRmxhZ3MgZm9yIGdvaW5nIGRvd24gb3BlcmF0aW9uCisgKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR09JTkdfRkxBR1NfREVGQVVMVAkJMHgwCS8qIGdvaW5nIGRvd24gKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR09JTkdfRkxBR1NfTE9HRkxVU0gJCTB4MQkvKiBmbHVzaCBsb2cgYnV0IG5vdCBkYXRhICovCisjZGVmaW5lIFhGU19GU09QX0dPSU5HX0ZMQUdTX05PTE9HRkxVU0gJCTB4MgkvKiBkb24ndCBmbHVzaCBsb2cgbm9yIGRhdGEgKi8KKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzIHRoYXQgYXJlIHVzZWQgYnkgTGludXggZmlsZXN5c3RlbXMKKyAqLworI2RlZmluZSBYRlNfSU9DX0dFVFhGTEFHUwlGU19JT0NfR0VURkxBR1MKKyNkZWZpbmUgWEZTX0lPQ19TRVRYRkxBR1MJRlNfSU9DX1NFVEZMQUdTCisjZGVmaW5lIFhGU19JT0NfR0VUVkVSU0lPTglGU19JT0NfR0VUVkVSU0lPTgorCisvKgorICogaW9jdGwgY29tbWFuZHMgdGhhdCByZXBsYWNlIElSSVggZmNudGwoKSdzCisgKiBGb3IgJ2RvY3VtZW50YXRpb24nIHB1cnBvc2VkIG1vcmUgdGhhbiBhbnl0aGluZyBlbHNlLAorICogdGhlICJjbWQgIyIgZmllbGQgcmVmbGVjdHMgdGhlIElSSVggZmNudGwgbnVtYmVyLgorICovCisjZGVmaW5lIFhGU19JT0NfQUxMT0NTUAkJX0lPVyAoJ1gnLCAxMCwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0ZSRUVTUAkJX0lPVyAoJ1gnLCAxMSwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0RJT0lORk8JCV9JT1IgKCdYJywgMzAsIHN0cnVjdCBkaW9hdHRyKQorI2RlZmluZSBYRlNfSU9DX0ZTR0VUWEFUVFIJX0lPUiAoJ1gnLCAzMSwgc3RydWN0IGZzeGF0dHIpCisjZGVmaW5lIFhGU19JT0NfRlNTRVRYQVRUUglfSU9XICgnWCcsIDMyLCBzdHJ1Y3QgZnN4YXR0cikKKyNkZWZpbmUgWEZTX0lPQ19BTExPQ1NQNjQJX0lPVyAoJ1gnLCAzNiwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0ZSRUVTUDY0CV9JT1cgKCdYJywgMzcsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19HRVRCTUFQCQlfSU9XUignWCcsIDM4LCBzdHJ1Y3QgZ2V0Ym1hcCkKKyNkZWZpbmUgWEZTX0lPQ19GU1NFVERNCQlfSU9XICgnWCcsIDM5LCBzdHJ1Y3QgZnNkbWlkYXRhKQorI2RlZmluZSBYRlNfSU9DX1JFU1ZTUAkJX0lPVyAoJ1gnLCA0MCwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX1VOUkVTVlNQCV9JT1cgKCdYJywgNDEsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19SRVNWU1A2NAlfSU9XICgnWCcsIDQyLCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfVU5SRVNWU1A2NAlfSU9XICgnWCcsIDQzLCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfR0VUQk1BUEEJX0lPV1IoJ1gnLCA0NCwgc3RydWN0IGdldGJtYXApCisjZGVmaW5lIFhGU19JT0NfRlNHRVRYQVRUUkEJX0lPUiAoJ1gnLCA0NSwgc3RydWN0IGZzeGF0dHIpCisvKglYRlNfSU9DX1NFVEJJT1NJWkUgLS0tLSBkZXByZWNhdGVkIDQ2CSAgICovCisvKglYRlNfSU9DX0dFVEJJT1NJWkUgLS0tLSBkZXByZWNhdGVkIDQ3CSAgICovCisjZGVmaW5lIFhGU19JT0NfR0VUQk1BUFgJX0lPV1IoJ1gnLCA1Niwgc3RydWN0IGdldGJtYXApCisjZGVmaW5lIFhGU19JT0NfWkVST19SQU5HRQlfSU9XICgnWCcsIDU3LCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcyB0aGF0IHJlcGxhY2UgSVJJWCBzeXNzZ2koKSdzCisgKi8KKyNkZWZpbmUgWEZTX0lPQ19GU0dFT01FVFJZX1YxCSAgICAgX0lPUiAoJ1gnLCAxMDAsIHN0cnVjdCB4ZnNfZnNvcF9nZW9tX3YxKQorI2RlZmluZSBYRlNfSU9DX0ZTQlVMS1NUQVQJICAgICBfSU9XUignWCcsIDEwMSwgc3RydWN0IHhmc19mc29wX2J1bGtyZXEpCisjZGVmaW5lIFhGU19JT0NfRlNCVUxLU1RBVF9TSU5HTEUgICAgX0lPV1IoJ1gnLCAxMDIsIHN0cnVjdCB4ZnNfZnNvcF9idWxrcmVxKQorI2RlZmluZSBYRlNfSU9DX0ZTSU5VTUJFUlMJICAgICBfSU9XUignWCcsIDEwMywgc3RydWN0IHhmc19mc29wX2J1bGtyZXEpCisjZGVmaW5lIFhGU19JT0NfUEFUSF9UT19GU0hBTkRMRSAgICAgX0lPV1IoJ1gnLCAxMDQsIHN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEpCisjZGVmaW5lIFhGU19JT0NfUEFUSF9UT19IQU5ETEUJICAgICBfSU9XUignWCcsIDEwNSwgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19GRF9UT19IQU5ETEUJICAgICBfSU9XUignWCcsIDEwNiwgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19PUEVOX0JZX0hBTkRMRQkgICAgIF9JT1dSKCdYJywgMTA3LCBzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX1JFQURMSU5LX0JZX0hBTkRMRSAgIF9JT1dSKCdYJywgMTA4LCBzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX1NXQVBFWFQJCSAgICAgX0lPV1IoJ1gnLCAxMDksIHN0cnVjdCB4ZnNfc3dhcGV4dCkKKyNkZWZpbmUgWEZTX0lPQ19GU0dST1dGU0RBVEEJICAgICBfSU9XICgnWCcsIDExMCwgc3RydWN0IHhmc19ncm93ZnNfZGF0YSkKKyNkZWZpbmUgWEZTX0lPQ19GU0dST1dGU0xPRwkgICAgIF9JT1cgKCdYJywgMTExLCBzdHJ1Y3QgeGZzX2dyb3dmc19sb2cpCisjZGVmaW5lIFhGU19JT0NfRlNHUk9XRlNSVAkgICAgIF9JT1cgKCdYJywgMTEyLCBzdHJ1Y3QgeGZzX2dyb3dmc19ydCkKKyNkZWZpbmUgWEZTX0lPQ19GU0NPVU5UUwkgICAgIF9JT1IgKCdYJywgMTEzLCBzdHJ1Y3QgeGZzX2Zzb3BfY291bnRzKQorI2RlZmluZSBYRlNfSU9DX1NFVF9SRVNCTEtTCSAgICAgX0lPV1IoJ1gnLCAxMTQsIHN0cnVjdCB4ZnNfZnNvcF9yZXNibGtzKQorI2RlZmluZSBYRlNfSU9DX0dFVF9SRVNCTEtTCSAgICAgX0lPUiAoJ1gnLCAxMTUsIHN0cnVjdCB4ZnNfZnNvcF9yZXNibGtzKQorI2RlZmluZSBYRlNfSU9DX0VSUk9SX0lOSkVDVElPTgkgICAgIF9JT1cgKCdYJywgMTE2LCBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbikKKyNkZWZpbmUgWEZTX0lPQ19FUlJPUl9DTEVBUkFMTAkgICAgIF9JT1cgKCdYJywgMTE3LCBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbikKKy8qCVhGU19JT0NfQVRUUkNUTF9CWV9IQU5ETEUgLS0gZGVwcmVjYXRlZCAxMTgJICovCisvKglYRlNfSU9DX0ZSRUVaRQkJICAtLSBGSUZSRUVaRSAgIDExOQkgKi8KKy8qCVhGU19JT0NfVEhBVwkJICAtLSBGSVRIQVcgICAgIDEyMAkgKi8KKyNkZWZpbmUgWEZTX0lPQ19GU1NFVERNX0JZX0hBTkRMRSAgICBfSU9XICgnWCcsIDEyMSwgc3RydWN0IHhmc19mc29wX3NldGRtX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19BVFRSTElTVF9CWV9IQU5ETEUgICBfSU9XICgnWCcsIDEyMiwgc3RydWN0IHhmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19BVFRSTVVMVElfQllfSEFORExFICBfSU9XICgnWCcsIDEyMywgc3RydWN0IHhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXEpCisjZGVmaW5lIFhGU19JT0NfRlNHRU9NRVRSWQkgICAgIF9JT1IgKCdYJywgMTI0LCBzdHJ1Y3QgeGZzX2Zzb3BfZ2VvbSkKKyNkZWZpbmUgWEZTX0lPQ19HT0lOR0RPV04JICAgICBfSU9SICgnWCcsIDEyNSwgX191aW50MzJfdCkKKy8qCVhGU19JT0NfR0VURlNVVUlEIC0tLS0tLS0tLS0gZGVwcmVjYXRlZCAxNDAJICovCisKKworI2lmbmRlZiBIQVZFX0JCTUFDUk9TCisvKgorICogQmxvY2sgSS9PIHBhcmFtZXRlcml6YXRpb24uCUEgYmFzaWMgYmxvY2sgKEJCKSBpcyB0aGUgbG93ZXN0IHNpemUgb2YKKyAqIGZpbGVzeXN0ZW0gYWxsb2NhdGlvbiwgYW5kIG11c3QgZXF1YWwgNTEyLiAgTGVuZ3RoIHVuaXRzIGdpdmVuIHRvIGJpbworICogcm91dGluZXMgYXJlIGluIEJCJ3MuCisgKi8KKyNkZWZpbmUgQkJTSElGVAkJOQorI2RlZmluZSBCQlNJWkUJCSgxPDxCQlNISUZUKQorI2RlZmluZSBCQk1BU0sJCShCQlNJWkUtMSkKKyNkZWZpbmUgQlRPQkIoYnl0ZXMpCSgoKHVpbnQ2NF90KShieXRlcykgKyBCQlNJWkUgLSAxKSA+PiBCQlNISUZUKQorI2RlZmluZSBCVE9CQlQoYnl0ZXMpCSgodWludDY0X3QpKGJ5dGVzKSA+PiBCQlNISUZUKQorI2RlZmluZSBCQlRPQihiYnMpCSgoYmJzKSA8PCBCQlNISUZUKQorI2VuZGlmCisKKyNlbmRpZgkvKiBYRlNfRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvZnMveGZzL3hmc19yZWFkZGlyLmMgYi9jb3JlL2ZzL3hmcy94ZnNfcmVhZGRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzhhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3hmcy94ZnNfcmVhZGRpci5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgUGF1bG8gQWxjYW50YXJhIDxwY2FjanJAenl0b3IuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxjYWNoZS5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxmcy5oPgorCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorCisjaW5jbHVkZSAieGZzX3JlYWRkaXIuaCIKKworc3RhdGljIGludCBmaWxsX2RpcmVudChzdHJ1Y3QgZnNfaW5mbyAqZnMsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCwKKwkJICAgICAgIHVpbnQzMl90IG9mZnNldCwgeGZzX2lub190IGlubywgY2hhciAqbmFtZSwKKwkJICAgICAgIHNpemVfdCBuYW1lbGVuKQoreworICAgIHhmc19kaW5vZGVfdCAqY29yZTsKKworICAgIHhmc19kZWJ1ZygiZnMgJXAsIGRpcmVudCAlcCBvZmZzZXQgJWx1IGlubyAlbGx1IG5hbWUgJXMgbmFtZWxlbiAlbGx1IiwgZnMsCisJICAgICAgZGlyZW50LCBvZmZzZXQsIGlubywgbmFtZSwgbmFtZWxlbik7CisKKyAgICBkaXJlbnQtPmRfaW5vID0gaW5vOworICAgIGRpcmVudC0+ZF9vZmYgPSBvZmZzZXQ7CisgICAgZGlyZW50LT5kX3JlY2xlbiA9IG9mZnNldG9mKHN0cnVjdCBkaXJlbnQsIGRfbmFtZSkgKyBuYW1lbGVuICsgMTsKKworICAgIGNvcmUgPSB4ZnNfZGlub2RlX2dldF9jb3JlKGZzLCBpbm8pOworICAgIGlmICghY29yZSkgeworICAgICAgICB4ZnNfZXJyb3IoIkZhaWxlZCB0byBnZXQgZGlub2RlIGZyb20gZGlzayAoaW5vIDB4JWxseCkiLCBpbm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGJlMTZfdG9fY3B1KGNvcmUtPmRpX21vZGUpICYgU19JRkRJUikKKwlkaXJlbnQtPmRfdHlwZSA9IERUX0RJUjsKKyAgICBlbHNlIGlmIChiZTE2X3RvX2NwdShjb3JlLT5kaV9tb2RlKSAmIFNfSUZSRUcpCisJZGlyZW50LT5kX3R5cGUgPSBEVF9SRUc7CisgICAgZWxzZSBpZiAoYmUxNl90b19jcHUoY29yZS0+ZGlfbW9kZSkgJiBTX0lGTE5LKQorICAgICAgICBkaXJlbnQtPmRfdHlwZSA9IERUX0xOSzsKKworICAgIG1lbWNweShkaXJlbnQtPmRfbmFtZSwgbmFtZSwgbmFtZWxlbik7CisgICAgZGlyZW50LT5kX25hbWVbbmFtZWxlbl0gPSAnXDAnOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB4ZnNfcmVhZGRpcl9kaXIyX2xvY2FsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyZW50ICpkaXJlbnQsCisJCQkgICB4ZnNfZGlub2RlX3QgKmNvcmUpCit7CisgICAgeGZzX2RpcjJfc2ZfdCAqc2YgPSAoeGZzX2RpcjJfc2ZfdCAqKSZjb3JlLT5kaV9saXRlcmFsX2FyZWFbMF07CisgICAgeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZfZW50cnk7CisgICAgdWludDhfdCBjb3VudCA9IHNmLT5oZHIuaThjb3VudCA/IHNmLT5oZHIuaThjb3VudCA6IHNmLT5oZHIuY291bnQ7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gZmlsZS0+b2Zmc2V0OworICAgIHVpbnQ4X3QgKnN0YXJ0X25hbWU7CisgICAgdWludDhfdCAqZW5kX25hbWU7CisgICAgeGZzX2lub190IGlubzsKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBmaWxlLT5mczsKKyAgICBpbnQgcmV0dmFsID0gMDsKKworICAgIHhmc19kZWJ1ZygiZmlsZSAlcCBkaXJlbnQgJXAgY29yZSAlcCIsIGZpbGUsIGRpcmVudCwgY29yZSk7CisgICAgeGZzX2RlYnVnKCJjb3VudCAlaGh1IGk4Y291bnQgJWhodSIsIHNmLT5oZHIuY291bnQsIHNmLT5oZHIuaThjb3VudCk7CisKKyAgICBpZiAoZmlsZS0+b2Zmc2V0ICsgMSA+IGNvdW50KQorCWdvdG8gb3V0OworCisgICAgZmlsZS0+b2Zmc2V0Kys7CisKKyAgICBzZl9lbnRyeSA9ICh4ZnNfZGlyMl9zZl9lbnRyeV90ICopKCh1aW50OF90ICopJnNmLT5saXN0WzBdIC0KKwkJCQkgICAgICAgKCFzZi0+aGRyLmk4Y291bnQgPyA0IDogMCkpOworCisgICAgaWYgKGZpbGUtPm9mZnNldCAtIDEpIHsKKwlvZmZzZXQgPSBmaWxlLT5vZmZzZXQ7CisJd2hpbGUgKC0tb2Zmc2V0KSB7CisJICAgIHNmX2VudHJ5ID0gKHhmc19kaXIyX3NmX2VudHJ5X3QgKikoCisJCQkJKHVpbnQ4X3QgKilzZl9lbnRyeSArCisJCQkJb2Zmc2V0b2Yoc3RydWN0IHhmc19kaXIyX3NmX2VudHJ5LAorCQkJCQkgbmFtZVswXSkgKworCQkJCXNmX2VudHJ5LT5uYW1lbGVuICsKKwkJCQkoc2YtPmhkci5pOGNvdW50ID8gOCA6IDQpKTsKKwl9CisgICAgfQorCisgICAgc3RhcnRfbmFtZSA9ICZzZl9lbnRyeS0+bmFtZVswXTsKKyAgICBlbmRfbmFtZSA9IHN0YXJ0X25hbWUgKyBzZl9lbnRyeS0+bmFtZWxlbjsKKworICAgIGlubyA9IHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHNmLCAoeGZzX2RpcjJfaW5vdV90ICopKAorCQkJCSAgICAgICh1aW50OF90ICopc2ZfZW50cnkgKworCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCB4ZnNfZGlyMl9zZl9lbnRyeSwKKwkJCQkJICAgICAgIG5hbWVbMF0pICsKKwkJCQkgICAgICBzZl9lbnRyeS0+bmFtZWxlbikpOworCisgICAgcmV0dmFsID0gZmlsbF9kaXJlbnQoZnMsIGRpcmVudCwgZmlsZS0+b2Zmc2V0LCBpbm8sIChjaGFyICopc3RhcnRfbmFtZSwKKwkJCSBlbmRfbmFtZSAtIHN0YXJ0X25hbWUpOworICAgIGlmIChyZXR2YWwpCisJeGZzX2Vycm9yKCJGYWlsZWQgdG8gZmlsbCBpbiBkaXJlbnQgc3RydWN0dXJlIik7CisKKyAgICByZXR1cm4gcmV0dmFsOworCitvdXQ6CisgICAgeGZzX2RpcjJfZGlyYmxrc19mbHVzaF9jYWNoZSgpOworCisgICAgcmV0dXJuIC0xOworfQorCitpbnQgeGZzX3JlYWRkaXJfZGlyMl9ibG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcmVudCAqZGlyZW50LAorCQkJICAgeGZzX2Rpbm9kZV90ICpjb3JlKQoreworICAgIHhmc19ibWJ0X2lyZWNfdCByOworICAgIGJsb2NrX3QgZGlyX2JsazsKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBmaWxlLT5mczsKKyAgICBjb25zdCB1aW50OF90ICpkaXJibGtfYnVmOworICAgIHVpbnQ4X3QgKnA7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHhmc19kaXIyX2RhdGFfaGRyX3QgKmhkcjsKKyAgICB4ZnNfZGlyMl9ibG9ja190YWlsX3QgKmJ0cDsKKyAgICB4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXA7CisgICAgeGZzX2RpcjJfZGF0YV9lbnRyeV90ICpkZXA7CisgICAgdWludDhfdCAqc3RhcnRfbmFtZTsKKyAgICB1aW50OF90ICplbmRfbmFtZTsKKyAgICB4ZnNfaW5vX3QgaW5vOworICAgIGludCByZXR2YWwgPSAwOworCisgICAgeGZzX2RlYnVnKCJmaWxlICVwIGRpcmVudCAlcCBjb3JlICVwIiwgZmlsZSwgZGlyZW50LCBjb3JlKTsKKworICAgIGJtYnRfaXJlY19nZXQoJnIsICh4ZnNfYm1idF9yZWNfdCAqKSZjb3JlLT5kaV9saXRlcmFsX2FyZWFbMF0pOworICAgIGRpcl9ibGsgPSBmc2Jsb2NrX3RvX2J5dGVzKGZzLCByLmJyX3N0YXJ0YmxvY2spID4+IEJMT0NLX1NISUZUKGZzKTsKKworICAgIGRpcmJsa19idWYgPSB4ZnNfZGlyMl9kaXJibGtzX2dldF9jYWNoZWQoZnMsIGRpcl9ibGssIHIuYnJfYmxvY2tjb3VudCk7CisgICAgaGRyID0gKHhmc19kaXIyX2RhdGFfaGRyX3QgKilkaXJibGtfYnVmOworICAgIGlmIChiZTMyX3RvX2NwdShoZHItPm1hZ2ljKSAhPSBYRlNfRElSMl9CTE9DS19NQUdJQykgeworICAgICAgICB4ZnNfZXJyb3IoIkJsb2NrIGRpcmVjdG9yeSBoZWFkZXIncyBtYWdpYyBudW1iZXIgZG9lcyBub3QgbWF0Y2ghIik7CisgICAgICAgIHhmc19kZWJ1ZygiaGRyLT5tYWdpYzogMHglbHgiLCBiZTMyX3RvX2NwdShoZHItPm1hZ2ljKSk7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgYnRwID0geGZzX2RpcjJfYmxvY2tfdGFpbF9wKFhGU19JTkZPKGZzKSwgaGRyKTsKKworICAgIGlmIChmaWxlLT5vZmZzZXQgKyAxID4gYmUzMl90b19jcHUoYnRwLT5jb3VudCkpCisJZ290byBvdXQ7CisKKyAgICBmaWxlLT5vZmZzZXQrKzsKKworICAgIHAgPSAodWludDhfdCAqKShoZHIgKyAxKTsKKworICAgIGlmIChmaWxlLT5vZmZzZXQgLSAxKSB7CisJb2Zmc2V0ID0gZmlsZS0+b2Zmc2V0OworCXdoaWxlICgtLW9mZnNldCkgeworCSAgICBkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopcDsKKworCSAgICBkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKXA7CisJICAgIGlmIChiZTE2X3RvX2NwdShkdXAtPmZyZWV0YWcpID09IFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpIHsKKwkJcCArPSBiZTE2X3RvX2NwdShkdXAtPmxlbmd0aCk7CisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgICAgcCArPSB4ZnNfZGlyMl9kYXRhX2VudHNpemUoZGVwLT5uYW1lbGVuKTsKKwl9CisgICAgfQorCisgICAgZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKXA7CisKKyAgICBzdGFydF9uYW1lID0gJmRlcC0+bmFtZVswXTsKKyAgICBlbmRfbmFtZSA9IHN0YXJ0X25hbWUgKyBkZXAtPm5hbWVsZW47CisKKyAgICBpbm8gPSBiZTY0X3RvX2NwdShkZXAtPmludW1iZXIpOworCisgICAgcmV0dmFsID0gZmlsbF9kaXJlbnQoZnMsIGRpcmVudCwgZmlsZS0+b2Zmc2V0LCBpbm8sIChjaGFyICopc3RhcnRfbmFtZSwKKwkJCSBlbmRfbmFtZSAtIHN0YXJ0X25hbWUpOworICAgIGlmIChyZXR2YWwpCisJeGZzX2Vycm9yKCJGYWlsZWQgdG8gZmlsbCBpbiBkaXJlbnQgc3RydWN0dXJlIik7CisKKyAgICByZXR1cm4gcmV0dmFsOworCitvdXQ6CisgICAgeGZzX2RpcjJfZGlyYmxrc19mbHVzaF9jYWNoZSgpOworCisgICAgcmV0dXJuIC0xOworfQorCitpbnQgeGZzX3JlYWRkaXJfZGlyMl9sZWFmKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyZW50ICpkaXJlbnQsCisJCQkgIHhmc19kaW5vZGVfdCAqY29yZSkKK3sKKyAgICB4ZnNfYm1idF9pcmVjX3QgaXJlYzsKKyAgICBzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBmaWxlLT5mczsKKyAgICB4ZnNfZGlyMl9sZWFmX3QgKmxlYWY7CisgICAgYmxvY2tfdCBsZWFmX2JsaywgZGlyX2JsazsKKyAgICB4ZnNfZGlyMl9sZWFmX2VudHJ5X3QgKmxlcDsKKyAgICB1aW50MzJfdCBkYjsKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICAgIHhmc19kaXIyX2RhdGFfZW50cnlfdCAqZGVwOworICAgIHhmc19kaXIyX2RhdGFfaGRyX3QgKmRhdGFfaGRyOworICAgIHVpbnQ4X3QgKnN0YXJ0X25hbWU7CisgICAgdWludDhfdCAqZW5kX25hbWU7CisgICAgeGZzX2ludGlub190IGlubzsKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBOVUxMOworICAgIGludCByZXR2YWwgPSAwOworCisgICAgeGZzX2RlYnVnKCJmaWxlICVwIGRpcmVudCAlcCBjb3JlICVwIiwgZmlsZSwgZGlyZW50LCBjb3JlKTsKKworICAgIGJtYnRfaXJlY19nZXQoJmlyZWMsICgoeGZzX2JtYnRfcmVjX3QgKikmY29yZS0+ZGlfbGl0ZXJhbF9hcmVhWzBdKSArCisJCQkJCWJlMzJfdG9fY3B1KGNvcmUtPmRpX25leHRlbnRzKSAtIDEpOworICAgIGxlYWZfYmxrID0gZnNibG9ja190b19ieXRlcyhmcywgaXJlYy5icl9zdGFydGJsb2NrKSA+PgorCQkJCQlCTE9DS19TSElGVChmaWxlLT5mcyk7CisKKyAgICBsZWFmID0gKHhmc19kaXIyX2xlYWZfdCAqKXhmc19kaXIyX2RpcmJsa3NfZ2V0X2NhY2hlZChmcywgbGVhZl9ibGssCisJCQkJCQkJICBpcmVjLmJyX2Jsb2NrY291bnQpOworICAgIGlmIChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgIT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMpIHsKKyAgICAgICAgeGZzX2Vycm9yKCJTaW5nbGUgbGVhZiBibG9jayBoZWFkZXIncyBtYWdpYyBudW1iZXIgZG9lcyBub3QgbWF0Y2ghIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmICghbGVhZi0+aGRyLmNvdW50KQorICAgICAgICBnb3RvIG91dDsKKworICAgIGlmIChmaWxlLT5vZmZzZXQgKyAxID4gYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSkKKwlnb3RvIG91dDsKKworICAgIGxlcCA9ICZsZWFmLT5lbnRzW2ZpbGUtPm9mZnNldCsrXTsKKworICAgIC8qIFNraXAgb3ZlciBzdGFsZSBsZWFmIGVudHJpZXMgKi8KKyAgICBmb3IgKCA7IGJlMzJfdG9fY3B1KGxlcC0+YWRkcmVzcykgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSOworCSAgbGVwKyssIGZpbGUtPm9mZnNldCsrKTsKKworICAgIGRiID0geGZzX2RpcjJfZGF0YXB0cl90b19kYihmcywgYmUzMl90b19jcHUobGVwLT5hZGRyZXNzKSk7CisKKyAgICBibWJ0X2lyZWNfZ2V0KCZpcmVjLCAoeGZzX2JtYnRfcmVjX3QgKikmY29yZS0+ZGlfbGl0ZXJhbF9hcmVhWzBdICsgZGIpOworCisgICAgZGlyX2JsayA9IGZzYmxvY2tfdG9fYnl0ZXMoZnMsIGlyZWMuYnJfc3RhcnRibG9jaykgPj4gQkxPQ0tfU0hJRlQoZnMpOworCisgICAgYnVmID0geGZzX2RpcjJfZGlyYmxrc19nZXRfY2FjaGVkKGZzLCBkaXJfYmxrLCBpcmVjLmJyX2Jsb2NrY291bnQpOworICAgIGRhdGFfaGRyID0gKHhmc19kaXIyX2RhdGFfaGRyX3QgKilidWY7CisgICAgaWYgKGJlMzJfdG9fY3B1KGRhdGFfaGRyLT5tYWdpYykgIT0gWEZTX0RJUjJfREFUQV9NQUdJQykgeworCXhmc19lcnJvcigiTGVhZiBkaXJlY3RvcnkncyBkYXRhIG1hZ2ljIG51bWJlciBkb2VzIG5vdCBtYXRjaCEiKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICBvZmZzZXQgPSB4ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihmcywgYmUzMl90b19jcHUobGVwLT5hZGRyZXNzKSk7CisKKyAgICBkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopKCh1aW50OF90ICopYnVmICsgb2Zmc2V0KTsKKworICAgIHN0YXJ0X25hbWUgPSAmZGVwLT5uYW1lWzBdOworICAgIGVuZF9uYW1lID0gc3RhcnRfbmFtZSArIGRlcC0+bmFtZWxlbjsKKworICAgIGlubyA9IGJlNjRfdG9fY3B1KGRlcC0+aW51bWJlcik7CisKKyAgICByZXR2YWwgPSBmaWxsX2RpcmVudChmcywgZGlyZW50LCBmaWxlLT5vZmZzZXQsIGlubywgKGNoYXIgKilzdGFydF9uYW1lLAorCQkJIGVuZF9uYW1lIC0gc3RhcnRfbmFtZSk7CisgICAgaWYgKHJldHZhbCkKKwl4ZnNfZXJyb3IoIkZhaWxlZCB0byBmaWxsIGluIGRpcmVudCBzdHJ1Y3R1cmUiKTsKKworICAgIHJldHVybiByZXR2YWw7CisKK291dDoKKyAgICB4ZnNfZGlyMl9kaXJibGtzX2ZsdXNoX2NhY2hlKCk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCB4ZnNfcmVhZGRpcl9kaXIyX25vZGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCwKKwkJCSAgeGZzX2Rpbm9kZV90ICpjb3JlKQoreworICAgIHN0cnVjdCBmc19pbmZvICpmcyA9IGZpbGUtPmZzOworICAgIHhmc19ibWJ0X2lyZWNfdCBpcmVjOworICAgIHVpbnQzMl90IG5vZGVfb2ZmID0gMDsKKyAgICBibG9ja190IGZzYmxrbm87CisgICAgeGZzX2RhX2ludG5vZGVfdCAqbm9kZSA9IE5VTEw7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmlub2RlOworICAgIGludCBlcnJvcjsKKyAgICB4ZnNfZGlyMl9kYXRhX2hkcl90ICpkYXRhX2hkcjsKKyAgICB4ZnNfZGlyMl9sZWFmX3QgKmxlYWY7CisgICAgeGZzX2RpcjJfbGVhZl9lbnRyeV90ICpsZXA7CisgICAgdW5zaWduZWQgaW50IG9mZnNldDsKKyAgICB4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKmRlcDsKKyAgICB1aW50OF90ICpzdGFydF9uYW1lOworICAgIHVpbnQ4X3QgKmVuZF9uYW1lOworICAgIHVpbnQzMl90IGRiOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisgICAgaW50IHJldHZhbCA9IDA7CisKKyAgICB4ZnNfZGVidWcoImZpbGUgJXAgZGlyZW50ICVwIGNvcmUgJXAiLCBmaWxlLCBkaXJlbnQsIGNvcmUpOworCisgICAgZG8geworICAgICAgICBibWJ0X2lyZWNfZ2V0KCZpcmVjLCAoeGZzX2JtYnRfcmVjX3QgKikmY29yZS0+ZGlfbGl0ZXJhbF9hcmVhWzBdICsKKwkJCQkJCQkJKytub2RlX29mZik7CisgICAgfSB3aGlsZSAoaXJlYy5icl9zdGFydG9mZiA8IHhmc19kaXIyX2J5dGVfdG9fZGIoZnMsIFhGU19ESVIyX0xFQUZfT0ZGU0VUKSk7CisKKyAgICBmc2Jsa25vID0gZnNibG9ja190b19ieXRlcyhmcywgaXJlYy5icl9zdGFydGJsb2NrKSA+PiBCTE9DS19TSElGVChmcyk7CisKKyAgICBub2RlID0gKHhmc19kYV9pbnRub2RlX3QgKil4ZnNfZGlyMl9kaXJibGtzX2dldF9jYWNoZWQoZnMsIGZzYmxrbm8sIDEpOworICAgIGlmIChiZTE2X3RvX2NwdShub2RlLT5oZHIuaW5mby5tYWdpYykgIT0gWEZTX0RBX05PREVfTUFHSUMpIHsKKyAgICAgICAgeGZzX2Vycm9yKCJOb2RlJ3MgbWFnaWMgbnVtYmVyIGRvZXMgbm90IG1hdGNoISIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKK3RyeV9uZXh0X2J0cmVlOgorICAgIGlmICghbm9kZS0+aGRyLmNvdW50IHx8CisJWEZTX1BWVChpbm9kZSktPmlfYnRyZWVfb2Zmc2V0ID49IGJlMTZfdG9fY3B1KG5vZGUtPmhkci5jb3VudCkpCisJZ290byBvdXQ7CisKKyAgICBmc2Jsa25vID0gYmUzMl90b19jcHUobm9kZS0+YnRyZWVbWEZTX1BWVChpbm9kZSktPmlfYnRyZWVfb2Zmc2V0XS5iZWZvcmUpOworICAgIGZzYmxrbm8gPSB4ZnNfZGlyMl9nZXRfcmlnaHRfYmxrKGZzLCBjb3JlLCBmc2Jsa25vLCAmZXJyb3IpOworICAgIGlmIChlcnJvcikgeworICAgICAgICB4ZnNfZXJyb3IoIkNhbm5vdCBmaW5kIGxlYWYgcmVjISIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBsZWFmID0gKHhmc19kaXIyX2xlYWZfdCopeGZzX2RpcjJfZGlyYmxrc19nZXRfY2FjaGVkKGZzLCBmc2Jsa25vLCAxKTsKKyAgICBpZiAoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpICE9IFhGU19ESVIyX0xFQUZOX01BR0lDKSB7CisgICAgICAgIHhmc19lcnJvcigiTGVhZidzIG1hZ2ljIG51bWJlciBkb2VzIG5vdCBtYXRjaCEiKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKCFsZWFmLT5oZHIuY291bnQgfHwKKwlYRlNfUFZUKGlub2RlKS0+aV9sZWFmX2VudF9vZmZzZXQgPj0gYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSkgeworCVhGU19QVlQoaW5vZGUpLT5pX2J0cmVlX29mZnNldCsrOworCVhGU19QVlQoaW5vZGUpLT5pX2xlYWZfZW50X29mZnNldCA9IDA7CisJZ290byB0cnlfbmV4dF9idHJlZTsKKyAgICB9CisKKyAgICBsZXAgPSAmbGVhZi0+ZW50c1tYRlNfUFZUKGlub2RlKS0+aV9sZWFmX2VudF9vZmZzZXRdOworCisgICAgLyogU2tpcCBvdmVyIHN0YWxlIGxlYWYgZW50cmllcyAqLworICAgIGZvciAoIDsgWEZTX1BWVChpbm9kZSktPmlfbGVhZl9lbnRfb2Zmc2V0IDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSAmJgorCQkJYmUzMl90b19jcHUobGVwLT5hZGRyZXNzKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFI7CisJICBsZXArKywgWEZTX1BWVChpbm9kZSktPmlfbGVhZl9lbnRfb2Zmc2V0KyspOworCisgICAgaWYgKFhGU19QVlQoaW5vZGUpLT5pX2xlYWZfZW50X29mZnNldCA9PSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpKSB7CisJWEZTX1BWVChpbm9kZSktPmlfYnRyZWVfb2Zmc2V0Kys7CisJWEZTX1BWVChpbm9kZSktPmlfbGVhZl9lbnRfb2Zmc2V0ID0gMDsKKwlnb3RvIHRyeV9uZXh0X2J0cmVlOworICAgIH0gZWxzZSB7CisJWEZTX1BWVChpbm9kZSktPmlfbGVhZl9lbnRfb2Zmc2V0Kys7CisgICAgfQorCisgICAgZGIgPSB4ZnNfZGlyMl9kYXRhcHRyX3RvX2RiKGZzLCBiZTMyX3RvX2NwdShsZXAtPmFkZHJlc3MpKTsKKworICAgIGZzYmxrbm8gPSB4ZnNfZGlyMl9nZXRfcmlnaHRfYmxrKGZzLCBjb3JlLCBkYiwgJmVycm9yKTsKKyAgICBpZiAoZXJyb3IpIHsKKwl4ZnNfZXJyb3IoIkNhbm5vdCBmaW5kIGRhdGEgYmxvY2shIik7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgYnVmID0geGZzX2RpcjJfZGlyYmxrc19nZXRfY2FjaGVkKGZzLCBmc2Jsa25vLCAxKTsKKyAgICBkYXRhX2hkciA9ICh4ZnNfZGlyMl9kYXRhX2hkcl90ICopYnVmOworICAgIGlmIChiZTMyX3RvX2NwdShkYXRhX2hkci0+bWFnaWMpICE9IFhGU19ESVIyX0RBVEFfTUFHSUMpIHsKKwl4ZnNfZXJyb3IoIkxlYWYgZGlyZWN0b3J5J3MgZGF0YSBtYWdpYyBOby4gZG9lcyBub3QgbWF0Y2ghIik7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgb2Zmc2V0ID0geGZzX2RpcjJfZGF0YXB0cl90b19vZmYoZnMsIGJlMzJfdG9fY3B1KGxlcC0+YWRkcmVzcykpOworCisgICAgZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKSgodWludDhfdCAqKWJ1ZiArIG9mZnNldCk7CisKKyAgICBzdGFydF9uYW1lID0gJmRlcC0+bmFtZVswXTsKKyAgICBlbmRfbmFtZSA9IHN0YXJ0X25hbWUgKyBkZXAtPm5hbWVsZW47CisKKyAgICByZXR2YWwgPSBmaWxsX2RpcmVudChmcywgZGlyZW50LCAwLCBiZTY0X3RvX2NwdShkZXAtPmludW1iZXIpLAorCQkJIChjaGFyICopc3RhcnRfbmFtZSwgZW5kX25hbWUgLSBzdGFydF9uYW1lKTsKKyAgICBpZiAocmV0dmFsKQorCXhmc19lcnJvcigiRmFpbGVkIHRvIGZpbGwgaW4gZGlyZW50IHN0cnVjdHVyZSIpOworCisgICAgcmV0dXJuIHJldHZhbDsKKworb3V0OgorICAgIHhmc19kaXIyX2RpcmJsa3NfZmx1c2hfY2FjaGUoKTsKKworICAgIFhGU19QVlQoaW5vZGUpLT5pX2J0cmVlX29mZnNldCA9IDA7CisgICAgWEZTX1BWVChpbm9kZSktPmlfbGVhZl9lbnRfb2Zmc2V0ID0gMDsKKworICAgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnMveGZzL3hmc19yZWFkZGlyLmggYi9jb3JlL2ZzL3hmcy94ZnNfcmVhZGRpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTY0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3hmcy94ZnNfcmVhZGRpci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bG8gQWxjYW50YXJhIDxwY2FjanJAenl0b3IuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgWEZTX1JFQURESVJfSF8KKyNkZWZpbmUgWEZTX1JFQURESVJfSF8KKworaW50IHhmc19yZWFkZGlyX2RpcjJfbG9jYWwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCwKKwkJCSAgIHhmc19kaW5vZGVfdCAqY29yZSk7CitpbnQgeGZzX3JlYWRkaXJfZGlyMl9ibG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcmVudCAqZGlyZW50LAorCQkJICAgeGZzX2Rpbm9kZV90ICpjb3JlKTsKK2ludCB4ZnNfcmVhZGRpcl9kaXIyX2xlYWYoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCwKKwkJCSAgeGZzX2Rpbm9kZV90ICpjb3JlKTsKK2ludCB4ZnNfcmVhZGRpcl9kaXIyX25vZGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJlbnQgKmRpcmVudCwKKwkJCSAgeGZzX2Rpbm9kZV90ICpjb3JlKTsKKworI2VuZGlmIC8qIFhGU19SRUFERElSX0hfICovCmRpZmYgLS1naXQgYS9jb3JlL2ZzL3hmcy94ZnNfc2IuaCBiL2NvcmUvZnMveGZzL3hmc19zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDI0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZzL3hmcy94ZnNfc2IuaApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIFRha2VuIGZyb20gTGludXgga2VybmVsIHRyZWUgKGxpbnV4L2ZzL3hmcykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsbyBBbGNhbnRhcmEgPHBjYWNqckB6eXRvci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpZm5kZWYgWEZTX1NCX0hfCisjZGVmaW5lCVhGU19TQl9IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHV1aWRfdFsxNl07CisKKy8qCisgKiBTdXBlciBibG9jaworICogRml0cyBpbnRvIGEgc2VjdG9yLXNpemVkIGJ1ZmZlciBhdCBhZGRyZXNzIDAgb2YgZWFjaCBhbGxvY2F0aW9uIGdyb3VwLgorICogT25seSB0aGUgZmlyc3Qgb2YgdGhlc2UgaXMgZXZlciB1cGRhdGVkIGV4Y2VwdCBkdXJpbmcgZ3Jvd2ZzLgorICovCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19tb3VudDsKKworI2RlZmluZQlYRlNfU0JfTUFHSUMJCSJYRlNCIgkJLyogJ1hGU0InICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OXzEJMQkJLyogNS4zLCA2LjAuMSwgNi4xICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OXzIJMgkJLyogNi4yIC0gYXR0cmlidXRlcyAqLworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl8zCTMJCS8qIDYuMiAtIG5ldyBpbm9kZSB2ZXJzaW9uICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OXzQJNAkJLyogNi4yKyAtIGJpdG1hc2sgdmVyc2lvbiAqLworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9OVU1CSVRTCQkweDAwMGYKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQUxMRkJJVFMJCTB4ZmZmMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9TQVNIRkJJVFMJMHhmMDAwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX1JFQUxGQklUUwkweDBmZjAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQVRUUkJJVAkJMHgwMDEwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX05MSU5LQklUCQkweDAwMjAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQJCTB4MDA0MAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BTElHTkJJVAkJMHgwMDgwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0RBTElHTkJJVAkweDAxMDAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fU0hBUkVEQklUCTB4MDIwMAorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9MT0dWMkJJVAkJMHgwNDAwCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVAkweDA4MDAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUCTB4MTAwMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9ESVJWMkJJVAkJMHgyMDAwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0JPUkdCSVQJCTB4NDAwMAkvKiBBU0NJSSBvbmx5IGNhc2UtaW5zZW5zLiAqLworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVAkweDgwMDAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fT0tTQVNIRkJJVFMJXAorCShYRlNfU0JfVkVSU0lPTl9FWFRGTEdCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX0RJUlYyQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9CT1JHQklUKQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9PS1JFQUxGQklUUwlcCisJKFhGU19TQl9WRVJTSU9OX0FUVFJCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX05MSU5LQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX0RBTElHTkJJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fU0hBUkVEQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9MT0dWMkJJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fU0VDVE9SQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCkKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fT0tSRUFMQklUUwlcCisJKFhGU19TQl9WRVJTSU9OX05VTUJJVFMgfCBcCisJIFhGU19TQl9WRVJTSU9OX09LUkVBTEZCSVRTIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9PS1NBU0hGQklUUykKKworLyoKKyAqIFRoZXJlIGFyZSB0d28gd29yZHMgdG8gaG9sZCBYRlMgImZlYXR1cmUiIGJpdHM6IHRoZSBvcmlnaW5hbAorICogd29yZCwgc2JfdmVyc2lvbm51bSwgYW5kIHNiX2ZlYXR1cmVzMi4gIFdoZW5ldmVyIGEgYml0IGlzIHNldCBpbgorICogc2JfZmVhdHVyZXMyLCB0aGUgZmVhdHVyZSBiaXQgWEZTX1NCX1ZFUlNJT05fTU9SRUJJVFNCSVQgbXVzdCBiZSBzZXQuCisgKgorICogVGhlc2UgZGVmaW5lcyByZXByZXNlbnQgYml0cyBpbiBzYl9mZWF0dXJlczIuCisgKi8KKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX1JFQUxGQklUUwkweDAwZmZmZmZmCS8qIE1hc2s6IGZlYXR1cmVzICovCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9SRVNFUlZFRDFCSVQJMHgwMDAwMDAwMQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfTEFaWVNCQ09VTlRCSVQJMHgwMDAwMDAwMgkvKiBTdXBlcmJsayBjb3VudGVycyAqLworI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfUkVTRVJWRUQ0QklUCTB4MDAwMDAwMDQKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX0FUVFIyQklUCTB4MDAwMDAwMDgJLyogSW5saW5lIGF0dHIgcmV3b3JrICovCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9QQVJFTlRCSVQJMHgwMDAwMDAxMAkvKiBwYXJlbnQgcG9pbnRlcnMgKi8KKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX1BST0pJRDMyQklUCTB4MDAwMDAwODAJLyogMzIgYml0IHByb2plY3QgaWQgKi8KKworI2RlZmluZQlYRlNfU0JfVkVSU0lPTjJfT0tSRUFMRkJJVFMJXAorCShYRlNfU0JfVkVSU0lPTjJfTEFaWVNCQ09VTlRCSVQJfCBcCisJIFhGU19TQl9WRVJTSU9OMl9BVFRSMkJJVAl8IFwKKwkgWEZTX1NCX1ZFUlNJT04yX1BST0pJRDMyQklUKQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTjJfT0tTQVNIRkJJVFMJXAorCSgwKQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfT0tSRUFMQklUUwlcCisJKFhGU19TQl9WRVJTSU9OMl9PS1JFQUxGQklUUyB8CVwKKwkgWEZTX1NCX1ZFUlNJT04yX09LU0FTSEZCSVRTICkKKworLyoKKyAqIFNlcXVlbmNlIG51bWJlciB2YWx1ZXMgZm9yIHRoZSBmaWVsZHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJWEZTX1NCU19NQUdJQ05VTSwgWEZTX1NCU19CTE9DS1NJWkUsIFhGU19TQlNfREJMT0NLUywgWEZTX1NCU19SQkxPQ0tTLAorCVhGU19TQlNfUkVYVEVOVFMsIFhGU19TQlNfVVVJRCwgWEZTX1NCU19MT0dTVEFSVCwgWEZTX1NCU19ST09USU5PLAorCVhGU19TQlNfUkJNSU5PLCBYRlNfU0JTX1JTVU1JTk8sIFhGU19TQlNfUkVYVFNJWkUsIFhGU19TQlNfQUdCTE9DS1MsCisJWEZTX1NCU19BR0NPVU5ULCBYRlNfU0JTX1JCTUJMT0NLUywgWEZTX1NCU19MT0dCTE9DS1MsCisJWEZTX1NCU19WRVJTSU9OTlVNLCBYRlNfU0JTX1NFQ1RTSVpFLCBYRlNfU0JTX0lOT0RFU0laRSwKKwlYRlNfU0JTX0lOT1BCTE9DSywgWEZTX1NCU19GTkFNRSwgWEZTX1NCU19CTE9DS0xPRywKKwlYRlNfU0JTX1NFQ1RMT0csIFhGU19TQlNfSU5PREVMT0csIFhGU19TQlNfSU5PUEJMT0csIFhGU19TQlNfQUdCTEtMT0csCisJWEZTX1NCU19SRVhUU0xPRywgWEZTX1NCU19JTlBST0dSRVNTLCBYRlNfU0JTX0lNQVhfUENULCBYRlNfU0JTX0lDT1VOVCwKKwlYRlNfU0JTX0lGUkVFLCBYRlNfU0JTX0ZEQkxPQ0tTLCBYRlNfU0JTX0ZSRVhURU5UUywgWEZTX1NCU19VUVVPVElOTywKKwlYRlNfU0JTX0dRVU9USU5PLCBYRlNfU0JTX1FGTEFHUywgWEZTX1NCU19GTEFHUywgWEZTX1NCU19TSEFSRURfVk4sCisJWEZTX1NCU19JTk9BTElHTk1ULCBYRlNfU0JTX1VOSVQsIFhGU19TQlNfV0lEVEgsIFhGU19TQlNfRElSQkxLTE9HLAorCVhGU19TQlNfTE9HU0VDVExPRywgWEZTX1NCU19MT0dTRUNUU0laRSwgWEZTX1NCU19MT0dTVU5JVCwKKwlYRlNfU0JTX0ZFQVRVUkVTMiwgWEZTX1NCU19CQURfRkVBVFVSRVMyLAorCVhGU19TQlNfRklFTERDT1VOVAorfSB4ZnNfc2JfZmllbGRfdDsKKworLyoKKyAqIE1hc2sgdmFsdWVzLCBkZWZpbmVkIGJhc2VkIG9uIHRoZSB4ZnNfc2JfZmllbGRfdCB2YWx1ZXMuCisgKiBPbmx5IGRlZmluZSB0aGUgb25lcyB3ZSdyZSB1c2luZy4KKyAqLworI2RlZmluZQlYRlNfU0JfTVZBTCh4KQkJKDFMTCA8PCBYRlNfU0JTXyAjIyB4KQorI2RlZmluZQlYRlNfU0JfVVVJRAkJWEZTX1NCX01WQUwoVVVJRCkKKyNkZWZpbmUJWEZTX1NCX0ZOQU1FCQlYRlNfU0JfTVZBTChGTkFNRSkKKyNkZWZpbmUJWEZTX1NCX1JPT1RJTk8JCVhGU19TQl9NVkFMKFJPT1RJTk8pCisjZGVmaW5lCVhGU19TQl9SQk1JTk8JCVhGU19TQl9NVkFMKFJCTUlOTykKKyNkZWZpbmUJWEZTX1NCX1JTVU1JTk8JCVhGU19TQl9NVkFMKFJTVU1JTk8pCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OTlVNCVhGU19TQl9NVkFMKFZFUlNJT05OVU0pCisjZGVmaW5lIFhGU19TQl9VUVVPVElOTwkJWEZTX1NCX01WQUwoVVFVT1RJTk8pCisjZGVmaW5lIFhGU19TQl9HUVVPVElOTwkJWEZTX1NCX01WQUwoR1FVT1RJTk8pCisjZGVmaW5lIFhGU19TQl9RRkxBR1MJCVhGU19TQl9NVkFMKFFGTEFHUykKKyNkZWZpbmUgWEZTX1NCX1NIQVJFRF9WTglYRlNfU0JfTVZBTChTSEFSRURfVk4pCisjZGVmaW5lIFhGU19TQl9VTklUCQlYRlNfU0JfTVZBTChVTklUKQorI2RlZmluZSBYRlNfU0JfV0lEVEgJCVhGU19TQl9NVkFMKFdJRFRIKQorI2RlZmluZSBYRlNfU0JfSUNPVU5UCQlYRlNfU0JfTVZBTChJQ09VTlQpCisjZGVmaW5lIFhGU19TQl9JRlJFRQkJWEZTX1NCX01WQUwoSUZSRUUpCisjZGVmaW5lIFhGU19TQl9GREJMT0NLUwkJWEZTX1NCX01WQUwoRkRCTE9DS1MpCisjZGVmaW5lIFhGU19TQl9GRUFUVVJFUzIJWEZTX1NCX01WQUwoRkVBVFVSRVMyKQorI2RlZmluZSBYRlNfU0JfQkFEX0ZFQVRVUkVTMglYRlNfU0JfTVZBTChCQURfRkVBVFVSRVMyKQorI2RlZmluZQlYRlNfU0JfTlVNX0JJVFMJCSgoaW50KVhGU19TQlNfRklFTERDT1VOVCkKKyNkZWZpbmUJWEZTX1NCX0FMTF9CSVRTCQkoKDFMTCA8PCBYRlNfU0JfTlVNX0JJVFMpIC0gMSkKKyNkZWZpbmUJWEZTX1NCX01PRF9CSVRTCQlcCisJKFhGU19TQl9VVUlEIHwgWEZTX1NCX1JPT1RJTk8gfCBYRlNfU0JfUkJNSU5PIHwgWEZTX1NCX1JTVU1JTk8gfCBcCisJIFhGU19TQl9WRVJTSU9OTlVNIHwgWEZTX1NCX1VRVU9USU5PIHwgWEZTX1NCX0dRVU9USU5PIHwgXAorCSBYRlNfU0JfUUZMQUdTIHwgWEZTX1NCX1NIQVJFRF9WTiB8IFhGU19TQl9VTklUIHwgWEZTX1NCX1dJRFRIIHwgXAorCSBYRlNfU0JfSUNPVU5UIHwgWEZTX1NCX0lGUkVFIHwgWEZTX1NCX0ZEQkxPQ0tTIHwgWEZTX1NCX0ZFQVRVUkVTMiB8IFwKKwkgWEZTX1NCX0JBRF9GRUFUVVJFUzIpCisKKworLyoKKyAqIE1pc2MuIEZsYWdzIC0gd2FybmluZyAtIHRoZXNlIHdpbGwgYmUgY2xlYXJlZCBieSB4ZnNfcmVwYWlyIHVubGVzcworICogYSBmZWF0dXJlIGJpdCBpcyBzZXQgd2hlbiB0aGUgZmxhZyBpcyB1c2VkLgorICovCisjZGVmaW5lIFhGU19TQkZfTk9GTEFHUwkJMHgwMAkvKiBubyBmbGFncyBzZXQgKi8KKyNkZWZpbmUgWEZTX1NCRl9SRUFET05MWQkweDAxCS8qIG9ubHkgcmVhZC1vbmx5IG1vdW50cyBhbGxvd2VkICovCisKKy8qCisgKiBkZWZpbmUgbWF4LiBzaGFyZWQgdmVyc2lvbiB3ZSBjYW4gaW50ZXJvcGVyYXRlIHdpdGgKKyAqLworI2RlZmluZSBYRlNfU0JfTUFYX1NIQVJFRF9WTgkwCisKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fTlVNQklUUykKKworLyoKKyAqIGVuZCBvZiBzdXBlcmJsb2NrIHZlcnNpb24gbWFjcm9zCisgKi8KKworI2RlZmluZQlYRlNfU0JfQkxPQ0sobXApCVhGU19IRFJfQkxPQ0sobXAsIFhGU19TQl9EQUREUikKKyNkZWZpbmUgWEZTX0JVRl9UT19TQlAoYnApCSgoeGZzX2RzYl90ICopKChicCktPmJfYWRkcikpCisKKyNkZWZpbmUJWEZTX0hEUl9CTE9DSyhtcCxkKQkoKHhmc19hZ2Jsb2NrX3QpWEZTX0JCX1RPX0ZTQlQobXAsZCkpCisjZGVmaW5lCVhGU19EQUREUl9UT19GU0IobXAsZCkJWEZTX0FHQl9UT19GU0IobXAsIFwKKwkJCXhmc19kYWRkcl90b19hZ25vKG1wLGQpLCB4ZnNfZGFkZHJfdG9fYWdibm8obXAsZCkpCisjZGVmaW5lCVhGU19GU0JfVE9fREFERFIobXAsZnNibm8pCVhGU19BR0JfVE9fREFERFIobXAsIFwKKwkJCVhGU19GU0JfVE9fQUdOTyhtcCxmc2JubyksIFhGU19GU0JfVE9fQUdCTk8obXAsZnNibm8pKQorCisvKgorICogRmlsZSBzeXN0ZW0gc2VjdG9yIHRvIGJhc2ljIGJsb2NrIGNvbnZlcnNpb25zLgorICovCisjZGVmaW5lIFhGU19GU1NfVE9fQkIobXAsc2VjKQkoKHNlYykgPDwgKG1wKS0+bV9zZWN0YmJfbG9nKQorCisvKgorICogRmlsZSBzeXN0ZW0gYmxvY2sgdG8gYmFzaWMgYmxvY2sgY29udmVyc2lvbnMuCisgKi8KKyNkZWZpbmUJWEZTX0ZTQl9UT19CQihtcCxmc2JubykJKChmc2JubykgPDwgKG1wKS0+bV9ibGtiYl9sb2cpCisjZGVmaW5lCVhGU19CQl9UT19GU0IobXAsYmIpCVwKKwkoKChiYikgKyAoWEZTX0ZTQl9UT19CQihtcCwxKSAtIDEpKSA+PiAobXApLT5tX2Jsa2JiX2xvZykKKyNkZWZpbmUJWEZTX0JCX1RPX0ZTQlQobXAsYmIpCSgoYmIpID4+IChtcCktPm1fYmxrYmJfbG9nKQorCisvKgorICogRmlsZSBzeXN0ZW0gYmxvY2sgdG8gYnl0ZSBjb252ZXJzaW9ucy4KKyAqLworI2RlZmluZSBYRlNfRlNCX1RPX0IobXAsZnNibm8pCSgoeGZzX2ZzaXplX3QpKGZzYm5vKSA8PCAobXApLT5tX3NiLnNiX2Jsb2NrbG9nKQorI2RlZmluZSBYRlNfQl9UT19GU0IobXAsYikJXAorCSgoKCh1aW50NjRfdCkoYikpICsgKG1wKS0+bV9ibG9ja21hc2spID4+IChtcCktPm1fc2Iuc2JfYmxvY2tsb2cpCisjZGVmaW5lIFhGU19CX1RPX0ZTQlQobXAsYikJKCgodWludDY0X3QpKGIpKSA+PiAobXApLT5tX3NiLnNiX2Jsb2NrbG9nKQorI2RlZmluZSBYRlNfQl9GU0JfT0ZGU0VUKG1wLGIpCSgoYikgJiAobXApLT5tX2Jsb2NrbWFzaykKKworI2VuZGlmCS8qIFhGU19TQl9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9mcy94ZnMveGZzX3R5cGVzLmggYi9jb3JlL2ZzL3hmcy94ZnNfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjgwODg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcy94ZnMveGZzX3R5cGVzLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBUYWtlbiBmcm9tIExpbnV4IGtlcm5lbCB0cmVlIChsaW51eC9mcy94ZnMpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bG8gQWxjYW50YXJhIDxwY2FjanJAenl0b3IuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisjaWZuZGVmIFhGU19UWVBFU19IXworI2RlZmluZQlYRlNfVFlQRVNfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK3R5cGVkZWYgZW51bSB7IEJfRkFMU0UsQl9UUlVFIH0JYm9vbGVhbl90OwordHlwZWRlZiB1aW50MzJfdAkJcHJpZF90OwkJLyogcHJvamVjdCBJRCAqLwordHlwZWRlZiB1aW50MzJfdAkJaW5zdF90OwkJLyogYW4gaW5zdHJ1Y3Rpb24gKi8KKwordHlwZWRlZiBpbnQ2NF90CQkJeGZzX29mZl90OwkvKiA8ZmlsZSBvZmZzZXQ+IHR5cGUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nCXhmc19pbm9fdDsJLyogPGlub2RlPiB0eXBlICovCit0eXBlZGVmIGludDY0X3QJCQl4ZnNfZGFkZHJfdDsJLyogPGRpc2sgYWRkcmVzcz4gdHlwZSAqLwordHlwZWRlZiBjaGFyICoJCQl4ZnNfY2FkZHJfdDsJLyogPGNvcmUgYWRkcmVzcz4gdHlwZSAqLwordHlwZWRlZiB1aW50MzJfdAkJCXhmc19kZXZfdDsKK3R5cGVkZWYgdWludDMyX3QJCQl4ZnNfbmxpbmtfdDsKKworLyogX19wc2ludF90IGlzIHRoZSBzYW1lIHNpemUgYXMgYSBwb2ludGVyICovCit0eXBlZGVmIGludDMyX3QgX19wc2ludF90OwordHlwZWRlZiB1aW50MzJfdCBfX3BzdW5zaWduZWRfdDsKKwordHlwZWRlZiB1aW50MzJfdAl4ZnNfYWdibG9ja190OwkvKiBibG9ja25vIGluIGFsbG9jLiBncm91cCAqLwordHlwZWRlZgl1aW50MzJfdAl4ZnNfZXh0bGVuX3Q7CS8qIGV4dGVudCBsZW5ndGggaW4gYmxvY2tzICovCit0eXBlZGVmCXVpbnQzMl90CXhmc19hZ251bWJlcl90OwkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLwordHlwZWRlZiBpbnQzMl90CXhmc19leHRudW1fdDsJLyogIyBvZiBleHRlbnRzIGluIGEgZmlsZSAqLwordHlwZWRlZiBpbnQxNl90CXhmc19hZXh0bnVtX3Q7CS8qICMgZXh0ZW50cyBpbiBhbiBhdHRyaWJ1dGUgZm9yayAqLwordHlwZWRlZglpbnQ2NF90CXhmc19mc2l6ZV90OwkvKiBieXRlcyBpbiBhIGZpbGUgKi8KK3R5cGVkZWYgdWludDY0X3QJeGZzX3Vmc2l6ZV90OwkvKiB1bnNpZ25lZCBieXRlcyBpbiBhIGZpbGUgKi8KKwordHlwZWRlZglpbnQzMl90CXhmc19zdW1pbmZvX3Q7CS8qIHR5cGUgb2YgYml0bWFwIHN1bW1hcnkgaW5mbyAqLwordHlwZWRlZglpbnQzMl90CXhmc19ydHdvcmRfdDsJLyogd29yZCB0eXBlIGZvciBiaXRtYXAgbWFuaXB1bGF0aW9ucyAqLworCit0eXBlZGVmCWludDY0X3QJeGZzX2xzbl90OwkvKiBsb2cgc2VxdWVuY2UgbnVtYmVyICovCit0eXBlZGVmCWludDMyX3QJeGZzX3RpZF90OwkvKiB0cmFuc2FjdGlvbiBpZGVudGlmaWVyICovCisKK3R5cGVkZWYJdWludDMyX3QJeGZzX2RhYmxrX3Q7CS8qIGRpci9hdHRyIGJsb2NrIG51bWJlciAoaW4gZmlsZSkgKi8KK3R5cGVkZWYJdWludDMyX3QJeGZzX2RhaGFzaF90OwkvKiBkaXIvYXR0ciBoYXNoIHZhbHVlICovCisKKy8qCisgKiBUaGVzZSB0eXBlcyBhcmUgNjQgYml0cyBvbiBkaXNrIGJ1dCBhcmUgZWl0aGVyIDMyIG9yIDY0IGJpdHMgaW4gbWVtb3J5LgorICogRGlzayBiYXNlZCB0eXBlczoKKyAqLwordHlwZWRlZiB1aW50NjRfdAl4ZnNfZGZzYm5vX3Q7CS8qIGJsb2Nrbm8gaW4gZmlsZXN5c3RlbSAoYWdub3xhZ2JubykgKi8KK3R5cGVkZWYgdWludDY0X3QJeGZzX2RyZnNibm9fdDsJLyogYmxvY2tubyBpbiBmaWxlc3lzdGVtIChyYXcpICovCit0eXBlZGVmCXVpbnQ2NF90CXhmc19kcnRibm9fdDsJLyogZXh0ZW50IChibG9jaykgaW4gcmVhbHRpbWUgYXJlYSAqLwordHlwZWRlZgl1aW50NjRfdAl4ZnNfZGZpbG9mZl90OwkvKiBibG9jayBudW1iZXIgaW4gYSBmaWxlICovCit0eXBlZGVmCXVpbnQ2NF90CXhmc19kZmlsYmxrc190OwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGEgZmlsZSAqLworCisvKgorICogTWVtb3J5IGJhc2VkIHR5cGVzIGFyZSBjb25kaXRpb25hbC4KKyAqLwordHlwZWRlZgl1aW50NjRfdAl4ZnNfZnNibG9ja190OwkvKiBibG9ja25vIGluIGZpbGVzeXN0ZW0gKGFnbm98YWdibm8pICovCit0eXBlZGVmIHVpbnQ2NF90CXhmc19yZnNibG9ja190OwkvKiBibG9ja25vIGluIGZpbGVzeXN0ZW0gKHJhdykgKi8KK3R5cGVkZWYgdWludDY0X3QJeGZzX3J0YmxvY2tfdDsJLyogZXh0ZW50IChibG9jaykgaW4gcmVhbHRpbWUgYXJlYSAqLwordHlwZWRlZglpbnQ2NF90CXhmc19zcnRibG9ja190OwkvKiBzaWduZWQgdmVyc2lvbiBvZiB4ZnNfcnRibG9ja190ICovCisKK3R5cGVkZWYgdWludDY0X3QJeGZzX2ZpbGVvZmZfdDsJLyogYmxvY2sgbnVtYmVyIGluIGEgZmlsZSAqLwordHlwZWRlZiBpbnQ2NF90CXhmc19zZmlsb2ZmX3Q7CS8qIHNpZ25lZCBibG9jayBudW1iZXIgaW4gYSBmaWxlICovCit0eXBlZGVmIHVpbnQ2NF90CXhmc19maWxibGtzX3Q7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gYSBmaWxlICovCisKKy8qCisgKiBOdWxsIHZhbHVlcyBmb3IgdGhlIHR5cGVzLgorICovCisjZGVmaW5lCU5VTExERlNCTk8JKCh4ZnNfZGZzYm5vX3QpLTEpCisjZGVmaW5lCU5VTExEUkZTQk5PCSgoeGZzX2RyZnNibm9fdCktMSkKKyNkZWZpbmUJTlVMTERSVEJOTwkoKHhmc19kcnRibm9fdCktMSkKKyNkZWZpbmUJTlVMTERGSUxPRkYJKCh4ZnNfZGZpbG9mZl90KS0xKQorCisjZGVmaW5lCU5VTExGU0JMT0NLCSgoeGZzX2ZzYmxvY2tfdCktMSkKKyNkZWZpbmUJTlVMTFJGU0JMT0NLCSgoeGZzX3Jmc2Jsb2NrX3QpLTEpCisjZGVmaW5lCU5VTExSVEJMT0NLCSgoeGZzX3J0YmxvY2tfdCktMSkKKyNkZWZpbmUJTlVMTEZJTEVPRkYJKCh4ZnNfZmlsZW9mZl90KS0xKQorCisjZGVmaW5lCU5VTExBR0JMT0NLCSgoeGZzX2FnYmxvY2tfdCktMSkKKyNkZWZpbmUJTlVMTEFHTlVNQkVSCSgoeGZzX2FnbnVtYmVyX3QpLTEpCisjZGVmaW5lCU5VTExFWFROVU0JKCh4ZnNfZXh0bnVtX3QpLTEpCisKKyNkZWZpbmUgTlVMTENPTU1JVExTTgkoKHhmc19sc25fdCktMSkKKworLyoKKyAqIE1heCB2YWx1ZXMgZm9yIGV4dGxlbiwgZXh0bnVtLCBhZXh0bnVtLgorICovCisjZGVmaW5lCU1BWEVYVExFTgkoKHhmc19leHRsZW5fdCkweDAwMWZmZmZmKQkvKiAyMSBiaXRzICovCisjZGVmaW5lCU1BWEVYVE5VTQkoKHhmc19leHRudW1fdCkweDdmZmZmZmZmKQkvKiBzaWduZWQgaW50ICovCisjZGVmaW5lCU1BWEFFWFROVU0JKCh4ZnNfYWV4dG51bV90KTB4N2ZmZikJCS8qIHNpZ25lZCBzaG9ydCAqLworCisvKgorICogTWluIG51bWJlcnMgb2YgZGF0YS9hdHRyIGZvcmsgYnRyZWUgcm9vdCBwb2ludGVycy4KKyAqLworI2RlZmluZSBNSU5EQlRQVFJTCTMKKyNkZWZpbmUgTUlOQUJUUFRSUwkyCisKKy8qCisgKiBNQVhOQU1FTEVOIGlzIHRoZSBsZW5ndGggKGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCkgb2YKKyAqIHRoZSBsb25nZXN0IHBlcm1pc3NpYmxlIGZpbGUgKGNvbXBvbmVudCkgbmFtZS4KKyAqLworI2RlZmluZSBNQVhOQU1FTEVOCTI1NgorCit0eXBlZGVmIGVudW0geworCVhGU19MT09LVVBfRVFpLCBYRlNfTE9PS1VQX0xFaSwgWEZTX0xPT0tVUF9HRWkKK30geGZzX2xvb2t1cF90OworCit0eXBlZGVmIGVudW0geworCVhGU19CVE5VTV9CTk9pLCBYRlNfQlROVU1fQ05UaSwgWEZTX0JUTlVNX0JNQVBpLCBYRlNfQlROVU1fSU5PaSwKKwlYRlNfQlROVU1fTUFYCit9IHhmc19idG51bV90OworCitzdHJ1Y3QgeGZzX25hbWUgeworCWNvbnN0IHVuc2lnbmVkIGNoYXIJKm5hbWU7CisJaW50CQkJbGVuOworfTsKKworI2VuZGlmCS8qIFhGU19UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9nZW5oYXNoLnBsIGIvY29yZS9nZW5oYXNoLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3OTEzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2dlbmhhc2gucGwKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIEdlbmVyYXRlIGhhc2ggdmFsdWVzIGZvciBrZXl3b3JkcworIworCitldmFsIHsgdXNlIGJ5dGVzOyB9OworCit3aGlsZSAoIGRlZmluZWQoJGtleXdkID0gPFNURElOPikgKSB7CisgICAgY2hvbXAgJGtleXdkOworCisgICAgKCRrZXl3ZCwka2V5d2RuYW1lKSA9IHNwbGl0KC9ccysvLCAka2V5d2QpOworICAgICRrZXl3ZG5hbWUgPSAka2V5d2QgdW5sZXNzICggJGtleXdkbmFtZSApOworCisgICAgJGwgPSBsZW5ndGgoJGtleXdkKTsKKyAgICAkaCA9IDA7CisgICAgZm9yICggJGkgPSAwIDsgJGkgPCAkbCA7ICRpKysgKSB7CisJJGMgPSBvcmQoc3Vic3RyKCRrZXl3ZCwkaSwxKSkgfCAweDIwOworCSRoID0gKCgoJGggPDwgNSl8KCRoID4+IDI3KSkgXiAkYykgJiAweEZGRkZGRkZGOworICAgIH0KKyAgICBpZiAoICRzZWVuaGFzaHskaH0gKSB7CisJcHJpbnRmIFNUREVSUiAiJDA6IGhhc2ggY29sbGlzaW9uICgweCUwOHgpICVzICVzXG4iLAorCSRoLCAka2V5d2QsICRzZWVuaGFzaHskaH07CisgICAgfQorICAgICRzZWVuaGFzaHskaH0gPSAka2V5d2Q7CisgICAgcHJpbnRmKCIlLTIzcyBlcXUgMHglMDh4XG4iLCAiaGFzaF8ke2tleXdkbmFtZX0iLCAkaCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2dyYXBoaWNzLmMgYi9jb3JlL2dyYXBoaWNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxODQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZ3JhcGhpY3MuYwpAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBDb3B5cmlnaHQgMTk5NC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBWR0Egc3BsYXNoIHNjcmVlbiBjb2RlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSA8c3lzL2lvLmg+CisjaW5jbHVkZSA8aHcvdmdhLmg+CisjaW5jbHVkZSAiZnMuaCIKKworI2luY2x1ZGUgImJpb3MuaCIKKyNpbmNsdWRlICJncmFwaGljcy5oIgorI2luY2x1ZGUgPHN5c2xpbnV4L3ZpZGVvLmg+CisKK19fZXhwb3J0IHVpbnQ4X3QgVXNpbmdWR0EgPSAwOwordWludDE2X3QgVkdBUG9zOwkJLyogUG9pbnRlciBpbnRvIFZHQSBtZW1vcnkgKi8KK19fZXhwb3J0IHVpbnQxNl90ICpWR0FGaWxlUHRyOwkvKiBQb2ludGVyIGludG8gVkdBRmlsZUJ1ZiAqLworX19leHBvcnQgdWludDE2X3QgVkdBRm9udFNpemUgPSAxNjsJLyogRGVmYXVsdHMgdG8gMTYgYnl0ZSBmb250ICovCisKK19fZXhwb3J0IGNoYXIgVkdBRmlsZUJ1ZltWR0FfRklMRV9CVUZfU0laRV07CS8qIFVubWFuZ2xlZCBWR0EgaW1hZ2UgbmFtZSAqLworX19leHBvcnQgY2hhciBWR0FGaWxlTUJ1ZltGSUxFTkFNRV9NQVhdOwkvKiBNYW5nbGVkIFZHQSBpbWFnZSBuYW1lICovCisKK3N0YXRpYyB1aW50OF90IFZHQVJvd0J1ZmZlcls2NDAgKyA4MF07CS8qIERlY29tcHJlc3Npb24gYnVmZmVyICovCitzdGF0aWMgdWludDhfdCBWR0FQbGFuZUJ1ZmZlclsoNjQwLzgpICogNF07IC8qIFBsYW5lIGJ1ZmZlcnMgKi8KKworZXh0ZXJuIHVpbnQxNl90IEdYUGl4Q29sczsKK2V4dGVybiB1aW50MTZfdCBHWFBpeFJvd3M7CisKKy8qIE1hcHMgY29sb3JzIHRvIGNvbnNlY3V0aXZlIERBQyByZWdpc3RlcnMgKi8KK3N0YXRpYyB1aW50OF90IGxpbmVhcl9jb2xvcltdID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LAorCQkJCSAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMCB9OworCitzdGF0aWMgRklMRSAqZmQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBMU1NNYWdpYzsJLyogTWFnaWMgbnVtYmVyICovCisJdWludDE2X3QgR3JhcGhYU2l6ZTsJLyogV2lkdGggb2Ygc3BsYXNoIHNjcmVlbiBmaWxlICovCisJdWludDE2X3QgR3JhcGhZU2l6ZTsJLyogSGVpZ2h0IG9mIHNwbGFzaCBzY3JlZW4gZmlsZSAqLworCXVpbnQ4X3QgR3JhcGhDb2xvck1hcFszKjE2XTsKK30gbHNzaGVhZGVyX3Q7CisKK3N0YXRpYyBsc3NoZWFkZXJfdCBMU1NIZWFkZXI7CisKKyNkZWZpbmUgTFNTTWFnaWMJTFNTSGVhZGVyLkxTU01hZ2ljCisjZGVmaW5lIEdyYXBoWFNpemUJTFNTSGVhZGVyLkdyYXBoWFNpemUKKyNkZWZpbmUgR3JhcGhZU2l6ZQlMU1NIZWFkZXIuR3JhcGhZU2l6ZQorCisvKgorICogRW5hYmxlIFZHQSBncmFwaGljcywgaWYgcG9zc2libGUuIFJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgdmdhc2V0bW9kZSh2b2lkKQoreworCWNvbTMyc3lzX3QgaXJlZywgb3JlZzsKKworCWlmIChVc2luZ1ZHQSkKKwkJcmV0dXJuIDA7CQkvKiBOb3RoaW5nIHRvIGRvLi4uICovCisKKwltZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisJbWVtc2V0KCZvcmVnLCAwLCBzaXplb2Yob3JlZykpOworCisJaWYgKFVzaW5nVkdBICYgMHg0KSB7CisJCS8qCisJCSAqIFdlJ3JlIGluIFZFU0EgbW9kZSwgd2hpY2ggbWVhbnMgVkdBOyB1c2UgVkVTQSBjYWxsCisJCSAqIHRvIHJldmVydCB0aGUgbW9kZSwgYW5kIHRoZW4gY2FsbCB0aGUgY29udmVudGlvbmFsCisJCSAqIG1vZGUtc2V0dGluZyBmb3IgZ29vZCBtZWFzdXJlLi4uCisJCSAqLworCQlpcmVnLmVheC53WzBdID0gMHg0RjAyOworCQlpcmVnLmVieC53WzBdID0gMHgwMDEyOworCQlfX2ludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKKwl9IGVsc2UgeworCQkvKiBHZXQgdmlkZW8gY2FyZCBhbmQgbW9uaXRvciAqLworCQlpcmVnLmVheC53WzBdID0gMHgxQTAwOworCQlfX2ludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKKwkJb3JlZy5lYnguYlswXSAtPSA3OyAvKiBCTD0wN2ggYW5kIEJMPTA4aCBPSyAqLworCisJCWlmIChvcmVnLmVieC5iWzBdID4gMSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIFNldCBtb2RlLgorCSAqLworCW1lbXNldCgmaXJlZywgMCwgc2l6ZW9mKGlyZWcpKTsKKwlpcmVnLmVheC53WzBdID0gMHgwMDEyOwkvKiBTZXQgbW9kZSA9IDY0MHg0ODAgVkdBIDE2IGNvbG9ycyAqLworCV9faW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOworCisJbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YoaXJlZykpOworCWlyZWcuZWR4LndbMF0gPSAodWludDMyX3QpbGluZWFyX2NvbG9yOworCWlyZWcuZWF4LndbMF0gPSAweDEwMDI7CS8qIFdyaXRlIGNvbG9yIHJlZ2lzdGVycyAqLworCV9faW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOworCisJVXNpbmdWR0EgPSAxOworCisJLyogU2V0IEdYUGl4Q29scyBhbmQgR1hQaXhSb3dzICovCisJR1hQaXhDb2xzID0gNjQwOworCUdYUGl4Um93cyA9IDQ4MDsKKworCXVzZV9mb250KCk7CisJU2Nyb2xsQXR0cmlidXRlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgZ2V0bnliYmxlKHZvaWQpCit7CisJY2hhciBkYXRhID0gZ2V0YyhmZCk7CisKKwlpZiAoZGF0YSAmIDB4MTApIHsKKwkJZGF0YSAmPSAweDBGOworCQlyZXR1cm4gZGF0YTsKKwl9CisKKwlkYXRhID0gZ2V0YyhmZCk7CisJcmV0dXJuIChkYXRhICYgMHgwRik7Cit9CisKKy8qCisgKiBybGVkZWNvZGU6CisgKglEZWNvZGUgYSBwaXhlbCByb3cgaW4gUkxFMTYgZm9ybWF0LgorICoKKyAqICdpbic6IGlucHV0IChSTEUxNiBlbmNvZGVkKSBidWZmZXIKKyAqICdvdXQnOiBvdXRwdXQgKGRlY29kZWQpIGJ1ZmZlcgorICogJ2NvdW50JzogcGl4ZWwgY291bnQKKyAqLworc3RhdGljIHZvaWQgcmxlZGVjb2RlKHVpbnQ4X3QgKm91dCwgc2l6ZV90IGNvdW50KQoreworCXVpbnQ4X3QgcHJldl9waXhlbCA9IDA7CisJc2l6ZV90IHNpemUgPSBjb3VudDsKKwl1aW50OF90IGRhdGE7CisJaW50IGk7CisKK2FnYWluOgorCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKworCQlkYXRhID0gZ2V0bnliYmxlKCk7CisJCWlmIChkYXRhID09IHByZXZfcGl4ZWwpCisJCQlicmVhazsKKworCQkqb3V0KysgPSBkYXRhOworCQlwcmV2X3BpeGVsID0gZGF0YTsKKwl9CisKKwlzaXplIC09IGk7CisJaWYgKCFzaXplKQorCQlyZXR1cm47CisKKwkvKiBTdGFydCBvZiBydW4gc2VxdWVuY2UgKi8KKwlkYXRhID0gZ2V0bnliYmxlKCk7CisJaWYgKGRhdGEgPT0gMCkgeworCQkvKiBsb25nIHJ1biAqLworCQl1aW50OF90IGhpOworCisJCWRhdGEgPSBnZXRueWJibGUoKTsKKwkJaGkgPSBnZXRueWJibGUoKTsKKwkJaGkgPDw9IDQ7CisJCWRhdGEgfD0gaGk7CisJCWRhdGEgKz0gMTY7CisJfQorCisJLyogZG9ydW4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGF0YTsgaSsrKQorCQkqb3V0KysgPSBwcmV2X3BpeGVsOworCisJc2l6ZSAtPSBpOworCWlmIChzaXplKQorCQlnb3RvIGFnYWluOworfQorCisvKgorICogcGFja2VkcGl4ZWwydmdhOgorICoJQ29udmVydCBwYWNrZWQtcGl4ZWwgdG8gVkdBIGJpdHBsYW5lcworICoKKyAqICdpbic6IHBhY2tlZCBwaXhlbCBzdHJpbmcgKDY0MCBwaXhlbHMpCisgKiAnb3V0Jzogb3V0cHV0IChmb3VyIHBsYW5lcyBAIDY0MC84ID0gODAgYnl0ZXMpCisgKiAnY291bnQnOiBwaXhlbCBjb3VudCAobXVsdGlwbGUgb2YgOCkKKyAqLworc3RhdGljIHZvaWQgcGFja2VkcGl4ZWwydmdhKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50OF90ICpvdXQpCit7CisJaW50IGksIGosIGs7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWNvbnN0IHVpbnQ4X3QgKmlwID0gaW47CisKKwkJZm9yIChqID0gMDsgaiA8IDY0MC84OyBqKyspIHsKKwkJCXVpbnQ4X3Qgb2IgPSAwOworCisJCQlmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisJCQkJdWludDhfdCBweCA9ICppcCsrOworCQkJCW9iID0gKG9iIDw8IDEpIHwgKChweCA+PiBpKSAmIDEpOworCQkJfQorCisJCQkqb3V0KysgPSBvYjsKKwkJfQorCX0KK30KKworLyoKKyAqIG91dHB1dHZnYToKKyAqCU91dHB1dCBmb3VyIHN1YnNlcXVlbnQgbGluZXMgb2YgVkdBIGRhdGEKKyAqCisgKiAnaW4nOiBmb3VyIHBsYW5lcyBAIDY0MC84PTgwIGJ5dGVzCisgKiAnb3V0JzogcG9pbnRlciBpbnRvIFZHQSBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgb3V0cHV0dmdhKGNvbnN0IHZvaWQgKmluLCB2b2lkICpvdXQpCit7CisJaW50IGk7CisKKwkvKiBTZWxlY3QgdGhlIHNlcXVlbmNlciBtYXNrICovCisJb3V0YihWR0FfU0VRX0lYX01BUF9NQVNLLCBWR0FfU0VRX0FERFIpOworCisJZm9yIChpID0gMTsgaSA8PSA4OyBpIDw8PSAxKSB7CisJCS8qIFNlbGVjdCB0aGUgYml0IHBsYW5lIHRvIHdyaXRlICovCisJCW91dGIoaSwgVkdBX1NFUV9EQVRBKTsKKwkJbWVtY3B5KG91dCwgaW4sIDY0MC84KTsKKwkJaW4gPSAoY29uc3QgY2hhciAqKWluICsgNjQwLzg7CisJfQorfQorCisvKgorICogRGlzcGxheSBhIGdyYXBoaWNhbCBzcGxhc2ggc2NyZWVuLgorICovCitfX2V4cG9ydCB2b2lkIHZnYWRpc3BsYXlmaWxlKEZJTEUgKl9mZCkKK3sKKwljaGFyICpwOworCWludCBzaXplOworCisJZmQgPSBfZmQ7CisKKwkvKgorCSAqIFRoaXMgaXMgYSBjaGVhcCBhbmQgZWFzeSB3YXkgdG8gbWFrZSBzdXJlIHRoZSBzY3JlZW4gaXMKKwkgKiBjbGVhcmVkIGluIGNhc2Ugd2Ugd2VyZSBpbiBncmFwaGljcyBtb2RlIGFyZWFkeS4KKwkgKi8KKwlzeXNsaW51eF9mb3JjZV90ZXh0X21vZGUoKTsKKwl2Z2FzZXRtb2RlKCk7CisKKwlzaXplID0gNCsyKjIrMTYqMzsKKwlwID0gKGNoYXIgKikmTFNTSGVhZGVyOworCisJLyogTG9hZCB0aGUgaGVhZGVyICovCisJd2hpbGUgKHNpemUtLSkKKwkJKnAgPSBnZXRjKGZkKTsKKworCWlmICgqcCAhPSBFT0YpIHsKKwkJY29tMzJzeXNfdCBpcmVnLCBvcmVnOworCQl1aW50MTZfdCByb3dzOworCQlpbnQgaTsKKworCQkvKiBUaGUgaGVhZGVyIFdJTEwgYmUgaW4gdGhlIGZpcnN0IGNodW5rLiAqLworCQlpZiAoTFNTTWFnaWMgIT0gMHgxNDEzZjMzZCkKKwkJCXJldHVybjsKKworCQltZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisKKwkJLyogQ29sb3IgbWFwIG9mZnNldCAqLworCQlpcmVnLmVkeC53WzBdID0gb2Zmc2V0b2YobHNzaGVhZGVyX3QsIEdyYXBoQ29sb3JNYXApOworCisJCWlyZWcuZWF4LndbMF0gPSAweDEwMTI7CSAgICAgICAvKiBTZXQgUkdCIHJlZ2lzdGVycyAqLworCQlpcmVnLmVieC53WzBdID0gMDsJICAgICAgIC8qIEZpcnN0IHJlZ2lzdGVyIG51bWJlciAqLworCQlpcmVnLmVjeC53WzBdID0gMTY7CSAgICAgICAvKiAxNiByZWdpc3RlcnMgKi8KKwkJX19pbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CisKKwkJLyogTnVtYmVyIG9mIHBpeGVsIHJvd3MgKi8KKwkJcm93cyA9IChHcmFwaFlTaXplICsgVkdBRm9udFNpemUpIC0gMTsKKwkJcm93cyA9IHJvd3MgLyBWR0FGb250U2l6ZTsKKwkJaWYgKHJvd3MgPj0gVmlkUm93cykKKwkJCXJvd3MgPSBWaWRSb3dzIC0gMTsKKworCQltZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisKKwkJaXJlZy5lZHguYlsxXSA9IHJvd3M7CisJCWlyZWcuZWF4LmJbMV0gPSAyOworCQlpcmVnLmVieC53WzBdID0gMDsKKworCQkvKiBTZXQgY3Vyc29yIGJlbG93IGltYWdlICovCisJCV9faW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOworCisJCXJvd3MgPSBHcmFwaFlTaXplOyAvKiBOdW1iZXIgb2YgZ3JhcGhpY3Mgcm93cyAqLworCQlWR0FQb3MgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKKwkJCS8qIFByZS1jbGVhciB0aGUgcm93IGJ1ZmZlciAqLworCQkJbWVtc2V0KFZHQVJvd0J1ZmZlciwgMCwgNjQwKTsKKworCQkJLyogRGVjb2RlIG9uZSByb3cgKi8KKwkJCXJsZWRlY29kZShWR0FSb3dCdWZmZXIsIEdyYXBoWFNpemUpOworCisJCQlwYWNrZWRwaXhlbDJ2Z2EoVkdBUm93QnVmZmVyLCBWR0FQbGFuZUJ1ZmZlcik7CisJCQlvdXRwdXR2Z2EoVkdBUGxhbmVCdWZmZXIsIE1LX1BUUigweEEwMDAsIFZHQVBvcykpOworCQkJVkdBUG9zICs9IDY0MC84OworCQl9CisJfQorfQorCisvKgorICogRGlzYWJsZSBWR0EgZ3JhcGhpY3MuCisgKi8KK19fZXhwb3J0IHZvaWQgc3lzbGludXhfZm9yY2VfdGV4dF9tb2RlKHZvaWQpCit7CisJY29tMzJzeXNfdCBpcmVnLCBvcmVnOworCisJLyogQWxyZWFkeSBpbiB0ZXh0IG1vZGU/ICovCisJaWYgKCFVc2luZ1ZHQSkKKwkJcmV0dXJuOworCisJaWYgKFVzaW5nVkdBICYgMHg0KSB7CisJCS8qIFZFU0EgcmV0dXJuIHRvIG5vcm1hbCB2aWRlbyBtb2RlICovCisJCW1lbXNldCgmaXJlZywgMCwgc2l6ZW9mKGlyZWcpKTsKKworCQlpcmVnLmVheC53WzBdID0gMHg0RjAyOyAvKiBTZXQgU3VwZXJWR0EgdmlkZW8gbW9kZSAqLworCQlpcmVnLmVieC53WzBdID0gMHgwMDAzOworCQlfX2ludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKKwl9CisKKwkvKiBSZXR1cm4gdG8gbm9ybWFsIHZpZGVvIG1vZGUgKi8KKwltZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisJaXJlZy5lYXgud1swXSA9IDB4MDAwMzsKKwlfX2ludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKKworCVVzaW5nVkdBID0gMDsKKworCVNjcm9sbEF0dHJpYnV0ZSA9IDB4NzsKKwkvKiBSZXN0b3JlIHRleHQgZm9udC9kYXRhICovCisJdXNlX2ZvbnQoKTsKK30KKworc3RhdGljIHZvaWQgdmdhY3Vyc29yY29tbW9uKGNoYXIgZGF0YSkKK3sKKwlpZiAoVXNpbmdWR0EpIHsKKwkJY29tMzJzeXNfdCBpcmVnOworICAgICAgICAgICAgICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mKGlyZWcpKTsKKworCQlpcmVnLmVheC5iWzBdID0gZGF0YTsKKwkJaXJlZy5lYXguYlsxXSA9IDB4MDk7CisJCWlyZWcuZWJ4LndbMF0gPSAweDAwMDc7CisJCWlyZWcuZWN4LndbMF0gPSAxOworCQlfX2ludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOworCX0KK30KKwordm9pZCB2Z2FoaWRlY3Vyc29yKHZvaWQpCit7CisJdmdhY3Vyc29yY29tbW9uKCcgJyk7Cit9CisKK3ZvaWQgdmdhc2hvd2N1cnNvcih2b2lkKQoreworCXZnYWN1cnNvcmNvbW1vbignXycpOworfQorCitfX2V4cG9ydCB2b2lkIHVzaW5nX3ZnYSh1aW50OF90IHZnYSwgdWludDE2X3QgcGl4X2NvbHMsIHVpbnQxNl90IHBpeF9yb3dzKQoreworICAgIFVzaW5nVkdBID0gdmdhOworICAgIEdYUGl4Q29scyA9IHBpeF9jb2xzOworICAgIEdYUGl4Um93cyA9IHBpeF9yb3dzOworCisgICAgaWYgKCEoVXNpbmdWR0EgJiAweDA4KSkKKyAgICAgICAgYWRqdXN0X3NjcmVlbigpOworfQorCit2b2lkIHBtX3VzaW5nX3ZnYShjb20zMnN5c190ICpyZWdzKQoreworICAgIHVzaW5nX3ZnYShyZWdzLT5lYXguYlswXSwgcmVncy0+ZWN4LndbMF0sIHJlZ3MtPmVkeC53WzBdKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvaGVhZC5pbmMgYi9jb3JlL2hlYWQuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZWI1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2hlYWQuaW5jCkBAIC0wLDAgKzEsMzggQEAKKzsgLSotIGZ1bmRhbWVudGFsIC0qLSAoYXNtLW1vZGUgc3Vja3MpCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgQ29weXJpZ2h0IDIwMDYtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzsKKzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCis7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzsgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKzsKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOworOyBoZWFkLmluYworOworOyBDb21tb24gaGVhZGVyIGluY2x1ZGVzCis7CisKKyVpZm5kZWYgX0hFQURfSU5DCislZGVmaW5lIF9IRUFEX0lOQworCislaWYgX19OQVNNX01BSk9SX18gPCAyIHx8IChfX05BU01fTUFKT1JfXyA9PSAyICYmIF9fTkFTTV9NSU5PUl9fIDwgMykKKyAlZXJyb3IgIk5BU00gMi4wMyBvciBsYXRlciByZXF1aXJlZCB0byBjb21waWxlIGNvcnJlY3RseSIKKyVlbmRpZgorCislaW5jbHVkZSAibWFjcm9zLmluYyIKKyVpbmNsdWRlICJjb25maWcuaW5jIgorJWluY2x1ZGUgImxheW91dC5pbmMiCislaW5jbHVkZSAicG1jYWxsLmluYyIKKyVpbmNsdWRlICJleHRlcm4uaW5jIgorJWluY2x1ZGUgImtlcm5lbC5pbmMiCislaW5jbHVkZSAiYmlvcy5pbmMiCislaW5jbHVkZSAidHJhY2Vycy5pbmMiCislaW5jbHVkZSAic3RhY2suaW5jIgorJWluY2x1ZGUgImlvLmluYyIKKworJWVuZGlmIDsgX0hFQURfSU5DCmRpZmYgLS1naXQgYS9jb3JlL2hlbGxvLmMgYi9jb3JlL2hlbGxvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkN2NiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaGVsbG8uYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorCisjaW5jbHVkZSA8Y29uc29sZS5oPgorCit2b2lkIG15cHV0Y2hhcihpbnQgYykKK3sKKyAgICBpZiAoYyA9PSAnXG4nKQorCW15cHV0Y2hhcignXHInKTsKKworICAgIHdyaXRlY2hyKGMpOworfQorCit2b2lkIG15cHV0cyhjb25zdCBjaGFyICpzdHIpCit7CisgICAgd2hpbGUgKCpzdHIpCisJbXlwdXRjaGFyKCpzdHIrKyk7Cit9CisKK3ZvaWQgaGVsbG8odm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBoZWxsb19zdHJbXSA9ICJIZWxsbywgV29ybGQhIjsKKworICAgIHByaW50ZigiJXMgZnJvbSAoJXMpXG4iLCBoZWxsb19zdHIsIF9fRklMRV9fKTsgIC8qIHRlc3RpbmcgKi8KK30KKwordm9pZCBoZXhkdW1wKHZvaWQgKmJ1ZiwgaW50IGJ5dGVsZW4sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBpbnQgKnAzMiwgaTsKKwkKKwlpZiAoc3RyKQorCQlwcmludGYoIkR1bXAgJXM6XG4iLCBzdHIpOworCQkKKwlwMzIgPSAodW5zaWduZWQgaW50ICopYnVmOworCWZvciAoaSA9IDA7IGkgPCAoYnl0ZWxlbiAvIDQpOyBpKyspeworCQlwcmludGYoIiAweCUwOHggIiwgcDMyW2ldKTsKKwl9CisJcHJpbnRmKCJcblxuIik7CQkKK30KKworc3RhdGljIGlubGluZSB2b2lkIG15cHJpbnQoaW50IG51bSkKK3sKKwl1aW50MzJfdCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkgKyspCisJCXByaW50ZigiJWQiLCBudW0pOworCXByaW50ZigiXG4iKTsKK30KKwordm9pZCBtcDEodm9pZCkKK3sKKwlteXByaW50KDEpOworfQorCit2b2lkIG1wMih2b2lkKQoreworCW15cHJpbnQoMik7Cit9CisKK3ZvaWQgbXAzKHZvaWQpCit7CisJbXlwcmludCgzKTsKK30KKwordm9pZCBtcDQodm9pZCkKK3sKKwlteXByaW50KDQpOworfQorCit2b2lkIG1wNSh2b2lkKQoreworCW15cHJpbnQoNSk7Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUvaTM4Ni9zeXNsaW51eC5sZCBiL2NvcmUvaTM4Ni9zeXNsaW51eC5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjRlMDEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9pMzg2L3N5c2xpbnV4LmxkCkBAIC0wLDAgKzEsNDI4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAKKyAqICAgQ29weXJpZ2h0IDIwMDgtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIExpbmtlciBzY3JpcHQgZm9yIHRoZSBTWVNMSU5VWCBjb3JlCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VYVEVSTihfc3RhcnQpCitFTlRSWShfc3RhcnQpCisKK1NUQUNLMzJfTEVOID0gNjU1MzY7CisKK1NFQ1RJT05TCit7CisJLyogUHJlZml4IHN0cnVjdHVyZSBmb3IgdGhlIGNvbXByZXNzaW9uIHByb2dyYW0gKi8KKwkuID0gMDsKKwlfX21vZHVsZV9zdGFydCA9IC47CisJLnByZWZpeCA6IHsKKwkJKigucHJlZml4KQorCX0KKworCS8qICJFYXJseSIgc2VjdGlvbnMgKGJlZm9yZSB0aGUgbG9hZCkgKi8KKwkuID0gMHgxMDAwOworCisJLmVhcmx5YnNzIChOT0xPQUQpIDogeworCQlfX2Vhcmx5YnNzX3N0YXJ0ID0gLjsKKwkJKiguZWFybHlic3MpCisJCV9fZWFybHlic3NfZW5kID0gLjsKKwl9CisJX19lYXJseWJzc19sZW4gPSBBQlNPTFVURShfX2Vhcmx5YnNzX2VuZCkgLSBBQlNPTFVURShfX2Vhcmx5YnNzX3N0YXJ0KTsKKwlfX2Vhcmx5YnNzX2R3b3JkcyA9IChfX2Vhcmx5YnNzX2xlbiArIDMpID4+IDI7CisKKwkuID0gQUxJR04oNCk7CisJLmJzczE2IChOT0xPQUQpIDogeworCQlfX2JzczE2X3N0YXJ0ID0gLjsKKwkJKiguYnNzMTYpCisJCV9fYnNzMTZfZW5kID0gLjsKKwl9CisJX19ic3MxNl9sZW4gPSBBQlNPTFVURShfX2JzczE2X2VuZCkgLSBBQlNPTFVURShfX2JzczE2X3N0YXJ0KTsKKwlfX2JzczE2X2R3b3JkcyA9IChfX2JzczE2X2xlbiArIDMpID4+IDI7CisKKwkuID0gQUxJR04oNCk7CisgCS5jb25maWcgOiBBVCAoX19jb25maWdfbG1hKSB7CisJCV9fY29uZmlnX3N0YXJ0ID0gLjsKKwkJKiguY29uZmlnKQorCQlfX2NvbmZpZ19lbmQgPSAuOworCX0KKwlfX2NvbmZpZ19sZW4gPSBBQlNPTFVURShfX2NvbmZpZ19lbmQpIC0gQUJTT0xVVEUoX19jb25maWdfc3RhcnQpOworCV9fY29uZmlnX2R3b3JkcyA9IChfX2NvbmZpZ19sZW4gKyAzKSA+PiAyOworCisJLyogR2VuZXJhdGVkIGFuZC9vciBjb3BpZWQgY29kZSAqLworCisJLiA9IEFMSUdOKDEyOCk7CQkvKiBNaW5pbXVtIHNlcGFyYXRpb24gZnJvbSBtdXRhYmxlIGRhdGEgKi8KKyAJLnJlcGxhY2VzdHViIDogQVQgKF9fcmVwbGFjZXN0dWJfbG1hKSB7CisJCV9fcmVwbGFjZXN0dWJfc3RhcnQgPSAuOworCQkqKC5yZXBsYWNlc3R1YikKKwkJX19yZXBsYWNlc3R1Yl9lbmQgPSAuOworCX0KKwlfX3JlcGxhY2VzdHViX2xlbiA9IEFCU09MVVRFKF9fcmVwbGFjZXN0dWJfZW5kKSAtIEFCU09MVVRFKF9fcmVwbGFjZXN0dWJfc3RhcnQpOworCV9fcmVwbGFjZXN0dWJfZHdvcmRzID0gKF9fcmVwbGFjZXN0dWJfbGVuICsgMykgPj4gMjsKKworCS4gPSBBTElHTigxNik7CisJX19nZW50ZXh0bnJfbG1hID0gLjsKKwkuZ2VudGV4dG5yIDogQVQoX19nZW50ZXh0bnJfbG1hKSB7CisJCV9fZ2VudGV4dG5yX3N0YXJ0ID0gLjsKKwkJKiguZ2VudGV4dG5yKQorCQlfX2dlbnRleHRucl9lbmQgPSAuOworCX0KKwlfX2dlbnRleHRucl9sZW4gPSBBQlNPTFVURShfX2dlbnRleHRucl9lbmQpIC0gQUJTT0xVVEUoX19nZW50ZXh0bnJfc3RhcnQpOworCV9fZ2VudGV4dG5yX2R3b3JkcyA9IChfX2dlbnRleHRucl9sZW4gKyAzKSA+PiAyOworCisJLiA9IFNUQUNLX0JBU0U7CisJLnN0YWNrMTYgOiBBVChTVEFDS19CQVNFKSB7CisJCV9fc3RhY2sxNl9zdGFydCA9IC47CisJCS4gKz0gU1RBQ0tfTEVOOworCQlfX3N0YWNrMTZfZW5kID0gLjsKKwl9CisJX19zdGFjazE2X2xlbiA9IEFCU09MVVRFKF9fc3RhY2sxNl9lbmQpIC0gQUJTT0xVVEUoX19zdGFjazE2X3N0YXJ0KTsKKwlfX3N0YWNrMTZfZHdvcmRzID0gKF9fc3RhY2sxNl9sZW4gKyAzKSA+PiAyOworCisJLyogSW5pdGlhbGl6ZWQgc2VjdGlvbnMgKi8KKworCS4gPSAweDdjMDA7CisJLmluaXQgOiB7CisJCUZJTEwoMHg5MDkwOTA5MCkKKwkJX19pbml0X3N0YXJ0ID0gLjsKKwkJKiguaW5pdCkKKwkJX19pbml0X2VuZCA9IC47CisJfQorCV9faW5pdF9sZW4gPSBBQlNPTFVURShfX2luaXRfZW5kKSAtIEFCU09MVVRFKF9faW5pdF9zdGFydCk7CisJX19pbml0X2R3b3JkcyA9IChfX2luaXRfbGVuICsgMykgPj4gMjsKKworCS50ZXh0MTYgOiB7CisJCUZJTEwoMHg5MDkwOTA5MCkKKwkJX190ZXh0MTZfc3RhcnQgPSAuOworCQkqKC50ZXh0MTYpCisJCV9fdGV4dDE2X2VuZCA9IC47CisJfQorCV9fdGV4dDE2X2xlbiA9IEFCU09MVVRFKF9fdGV4dDE2X2VuZCkgLSBBQlNPTFVURShfX3RleHQxNl9zdGFydCk7CisJX190ZXh0MTZfZHdvcmRzID0gKF9fdGV4dDE2X2xlbiArIDMpID4+IDI7CisKKwkvKgorCSAqIC50ZXh0bnIgaXMgdXNlZCBmb3IgMzItYml0IGNvZGUgdGhhdCBpcyB1c2VkIG9uIHRoZSBjb2RlCisJICogcGF0aCB0byBpbml0aWFsaXplIHRoZSAudGV4dCBzZWdtZW50CisJICovCisJLiA9IEFMSUdOKDE2KTsKKwkudGV4dG5yIDogeworCQlGSUxMKDB4OTA5MDkwOTApCisJCV9fdGV4dG5yX3N0YXJ0ID0gLjsKKwkJKigudGV4dG5yKQorCQlfX3RleHRucl9lbmQgPSAuOworCX0KKwlfX3RleHRucl9sZW4gPSBBQlNPTFVURShfX3RleHRucl9lbmQpIC0gQUJTT0xVVEUoX190ZXh0bnJfc3RhcnQpOworCV9fdGV4dG5yX2R3b3JkcyA9IChfX3RleHRucl9sZW4gKyAzKSA+PiAyOworCisJLiA9IEFMSUdOKDE2KTsKKwlfX2Jjb3B5eHhfc3RhcnQgPSAuOworCisJLmJjb3B5eHgudGV4dCA6IHsKKwkJRklMTCgweDkwOTA5MDkwKQorCQlfX2Jjb3B5eHhfdGV4dF9zdGFydCA9IC47CisJCSooLmJjb3B5eHgudGV4dCkKKwkJX19iY29weXh4X3RleHRfZW5kID0gLjsKKwl9CisJX19iY29weXh4X3RleHRfbGVuID0gQUJTT0xVVEUoX19iY29weXh4X3RleHRfZW5kKSAtIEFCU09MVVRFKF9fYmNvcHl4eF90ZXh0X3N0YXJ0KTsKKwlfX2Jjb3B5eHhfdGV4dF9kd29yZHMgPSAoX19iY29weXh4X3RleHRfbGVuICsgMykgPj4gMjsKKworCS5iY29weXh4LmRhdGEgOiB7CisJCV9fYmNvcHl4eF9kYXRhX3N0YXJ0ID0gLjsKKwkJKiguYmNvcHl4eC50ZXh0KQorCQlfX2Jjb3B5eHhfZGF0YV9lbmQgPSAuOworCX0KKwlfX2Jjb3B5eHhfZGF0YV9sZW4gPSBBQlNPTFVURShfX2Jjb3B5eHhfZGF0YV9lbmQpIC0gQUJTT0xVVEUoX19iY29weXh4X2RhdGFfc3RhcnQpOworCV9fYmNvcHl4eF9kYXRhX2R3b3JkcyA9IChfX2Jjb3B5eHhfZGF0YV9sZW4gKyAzKSA+PiAyOworCisJX19iY29weXh4X2VuZCA9IC47CisJX19iY29weXh4X2xlbiA9IEFCU09MVVRFKF9fYmNvcHl4eF9lbmQpIC0gQUJTT0xVVEUoX19iY29weXh4X3N0YXJ0KTsKKwlfX2Jjb3B5eHhfZHdvcmRzID0gKF9fYmNvcHl4eF9sZW4gKyAzKSA+PiAyOworCisJLiA9IEFMSUdOKDQpOworCS5kYXRhMTYgOiB7CisJICAgICAgX19kYXRhMTZfc3RhcnQgPSAuOworCSAgICAgICooLmRhdGExNikKKwkgICAgICBfX2RhdGExNl9lbmQgPSAuOworCX0KKwlfX2RhdGExNl9sZW4gPSBBQlNPTFVURShfX2RhdGExNl9lbmQpIC0gQUJTT0xVVEUoX19kYXRhMTZfc3RhcnQpOworCV9fZGF0YTE2X2R3b3JkcyA9IChfX2RhdGExNl9sZW4gKyAzKSA+PiAyOworCisJLiA9IEFMSUdOKDQpOworCV9fY29uZmlnX2xtYSA9IC47CisJLiArPSBTSVpFT0YoLmNvbmZpZyk7CisKKwkuID0gQUxJR04oNCk7CisJX19yZXBsYWNlc3R1Yl9sbWEgPSAuOworCS4gKz0gU0laRU9GKC5yZXBsYWNlc3R1Yik7CisKKwkvKiBUaGUgMzItYml0IGNvZGUgbG9hZHMgYWJvdmUgdGhlIG5vbi1wcm9nYml0cyBzZWN0aW9ucyAqLworCisJLiA9IEFMSUdOKDE2KTsKKwlfX3BtX2NvZGVfbG1hID0gLjsKKworCV9faGlnaF9jbGVhcl9zdGFydCA9IC47CisKKwkuID0gQUxJR04oNTEyKTsKKwkuYWR2IChOT0xPQUQpIDogeworCQlfX2Fkdl9zdGFydCA9IC47CisJCSooLmFkdikKKwkJX19hZHZfZW5kID0gLjsKKwl9CisJX19hZHZfbGVuID0gQUJTT0xVVEUoX19hZHZfZW5kKSAtIEFCU09MVVRFKF9fYWR2X3N0YXJ0KTsKKwlfX2Fkdl9kd29yZHMgPSAoX19hZHZfbGVuICsgMykgPj4gMjsKKworCS8qIExhdGUgdW5pbml0aWFsaXplZCBzZWN0aW9ucyAqLworCisJLiA9IEFMSUdOKDQpOworCS51aWJzcyAoTk9MT0FEKSA6IHsKKwkJX191aWJzc19zdGFydCA9IC47CisJCSooLnVpYnNzKQorCQlfX3VpYnNzX2VuZCA9IC47CisJfQorCV9fdWlic3NfbGVuID0gQUJTT0xVVEUoX191aWJzc19lbmQpIC0gQUJTT0xVVEUoX191aWJzc19zdGFydCk7CisJX191aWJzc19kd29yZHMgPSAoX191aWJzc19sZW4gKyAzKSA+PiAyOworCisJX2VuZDE2ID0gLjsKKwlfX2Fzc2VydF9lbmQxNiA9IEFTU0VSVChfZW5kMTYgPD0gMHgxMDAwMCwgIjY0SyBvdmVyZmxvdyIpOworCisJLyoKKwkgKiBTcGVjaWFsIDE2LWJpdCBzZWdtZW50cworCSAqLworCisJLiA9IEFMSUdOKDY1NTM2KTsKKwkucmVhbF9tb2RlIChOT0xPQUQpIDogeworCQkqKC5yZWFsX21vZGUpCisJfQorCXJlYWxfbW9kZV9zZWcgPSBjb3JlX3JlYWxfbW9kZSA+PiA0OworCisJLiA9IEFMSUdOKDY1NTM2KTsKKwkueGZlcl9idWYgKE5PTE9BRCkgOiB7CisJCSooLnhmZXJfYnVmKQorCX0KKwl4ZmVyX2J1Zl9zZWcgPSBjb3JlX3hmZXJfYnVmID4+IDQ7CisKKwkvKgorCSAqIFRoZSBhdXhpbGxpYXJ5IGRhdGEgc2VnbWVudCBpcyB1c2VkIGJ5IHRoZSAxNi1iaXQgY29kZQorCSAqIGZvciBpdGVtcyB0aGF0IGRvbid0IG5lZWQgdG8gbGl2ZSBpbiB0aGUgYm90dG9tIDY0Sy4KKwkgKi8KKworCS4gPSBBTElHTigxNik7CisJLmF1eHNlZyAoTk9MT0FEKSA6IHsKKwkJX19hdXhzZWdfc3RhcnQgPSAuOworCQkqKC5hdXhzZWcpCisJCV9fYXV4c2VnX2VuZCA9IC47CisJfQorCV9fYXV4c2VnX2xlbiA9IEFCU09MVVRFKF9fYXV4c2VnX2VuZCkgLSBBQlNPTFVURShfX2F1eHNlZ19zdGFydCk7CisJX19hdXhzZWdfZHdvcmRzID0gKF9fYXV4c2VnX2xlbiArIDMpID4+IDI7CisJYXV4X3NlZyA9IF9fYXV4c2VnX3N0YXJ0ID4+IDQ7CisKKwkvKgorCSAqIFVzZWQgdG8gYWxsb2NhdGUgbG93bWVtIGJ1ZmZlcnMgZnJvbSAzMi1iaXQgY29kZQorCSAqLworCS5sb3dtZW0gKE5PTE9BRCkgOiB7CisJCV9fbG93bWVtX3N0YXJ0ID0gLjsKKwkJKigubG93bWVtKQorCQlfX2xvd21lbV9lbmQgPSAuOworCX0KKwlfX2xvd21lbV9sZW4gPSBBQlNPTFVURShfX2xvd21lbV9lbmQpIC0gQUJTT0xVVEUoX19sb3dtZW1fc3RhcnQpOworCV9fbG93bWVtX2R3b3JkcyA9IChfX2xvd21lbV9sZW4gKyAzKSA+PiAyOworCisJX19oaWdoX2NsZWFyX2VuZCA9IC47CisKKwlfX2hpZ2hfY2xlYXJfbGVuID0gQUJTT0xVVEUoX19oaWdoX2NsZWFyX2VuZCkgLSBBQlNPTFVURShfX2hpZ2hfY2xlYXJfc3RhcnQpOworCV9faGlnaF9jbGVhcl9kd29yZHMgPSAoX19oaWdoX2NsZWFyX2xlbiArIDMpID4+IDI7CisKKwkvKiBTdGFydCBvZiB0aGUgbG93bWVtIGhlYXAgKi8KKwkuID0gQUxJR04oMTYpOworCV9fbG93bWVtX2hlYXAgPSAuOworCisJLyoKKwkgKiAzMi1iaXQgY29kZS4gIFRoaXMgaXMgYSBoYWNrIGZvciB0aGUgbW9tZW50IGR1ZSB0byB0aGUKKwkgKiByZWFsLW1vZGUgc2VnbWVudHMgYWxzbyBhbGxvY2F0ZWQuCisJICovCisKKwkuID0gMHgxMDAwMDA7CisKKwlfX3BtX2NvZGVfc3RhcnQgPSAuOworCisJX190ZXh0X3ZtYSA9IC47CisJX190ZXh0X2xtYSA9IF9fcG1fY29kZV9sbWE7CisJLnRleHQgOiBBVChfX3RleHRfbG1hKSB7CisJCUZJTEwoMHg5MDkwOTA5MCkKKwkJX190ZXh0X3N0YXJ0ID0gLjsKKwkJKigudGV4dCkKKwkJKigudGV4dC4qKQorCQlfX3RleHRfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMTYpOworCisJX19yb2RhdGFfdm1hID0gLjsKKwlfX3JvZGF0YV9sbWEgPSBfX3JvZGF0YV92bWEgKyBfX3RleHRfbG1hIC0gX190ZXh0X3ZtYTsKKwkucm9kYXRhIDogQVQoX19yb2RhdGFfbG1hKSB7CisJCV9fcm9kYXRhX3N0YXJ0ID0gLjsKKwkJKigucm9kYXRhKQorCQkqKC5yb2RhdGEuKikKKwkJX19yb2RhdGFfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oNCk7CisKKwlfX2N0b3JzX3ZtYSA9IC47CisJX19jdG9yc19sbWEgPSBfX2N0b3JzX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hOworCS5jdG9ycyA6IEFUKF9fY3RvcnNfbG1hKSB7CisJCV9fY3RvcnNfc3RhcnQgPSAuOworCQlLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKwkJS0VFUCAoKiguY3RvcnMpKQorCQlfX2N0b3JzX2VuZCA9IC47CisJfQorCisJX19kdG9yc192bWEgPSAuOworCV9fZHRvcnNfbG1hID0gX19kdG9yc192bWEgKyBfX3RleHRfbG1hIC0gX190ZXh0X3ZtYTsKKwkuZHRvcnMgOiBBVChfX2R0b3JzX2xtYSkgeworCQlfX2R0b3JzX3N0YXJ0ID0gLjsKKwkJS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisJCUtFRVAgKCooLmR0b3JzKSkKKwkJX19kdG9yc19lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCV9fZHluc3ltX3ZtYSA9IC47CisJX19keW5zeW1fbG1hID0gX19keW5zeW1fdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWE7CisJLmR5bnN5bSA6IEFUKF9fZHluc3ltX2xtYSkgeworCQlfX2R5bnN5bV9zdGFydCA9IC47CisJCSooLmR5bnN5bSkKKwkJX19keW5zeW1fZW5kID0gLjsKKwl9CisJX19keW5zeW1fbGVuID0gX19keW5zeW1fZW5kIC0gX19keW5zeW1fc3RhcnQ7CisKKwkuID0gQUxJR04oNCk7CisKKwlfX2R5bnN0cl92bWEgPSAuOworCV9fZHluc3RyX2xtYSA9IF9fZHluc3RyX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hOworCS5keW5zdHIgOiBBVChfX2R5bnN0cl9sbWEpIHsKKwkJX19keW5zdHJfc3RhcnQgPSAuOworCQkqKC5keW5zdHIpCisJCV9fZHluc3RyX2VuZCA9IC47CisJfQorCV9fZHluc3RyX2xlbiA9IF9fZHluc3RyX2VuZCAtIF9fZHluc3RyX3N0YXJ0OworCisJLiA9IEFMSUdOKDQpOworCisJX19nbnVfaGFzaF92bWEgPSAuOworCV9fZ251X2hhc2hfbG1hID0gX19nbnVfaGFzaF92bWEgKyBfX3RleHRfbG1hIC0gX190ZXh0X3ZtYTsKKwkuZ251Lmhhc2ggOiBBVChfX2dudV9oYXNoX2xtYSkgeworCQlfX2dudV9oYXNoX3N0YXJ0ID0gLjsKKwkJKiguZ251Lmhhc2gpCisJCV9fZ251X2hhc2hfZW5kID0gLjsKKwl9CisKKworCS4gPSBBTElHTig0KTsKKworCV9fZHlubGlua192bWEgPSAuOworCV9fZHlubGlua19sbWEgPSBfX2R5bmxpbmtfdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWE7CisJLmR5bmxpbmsgOiBBVChfX2R5bmxpbmtfbG1hKSB7CisJCV9fZHlubGlua19zdGFydCA9IC47CisJCSooLmR5bmxpbmspCisJCV9fZHlubGlua19lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCV9fZ290X3ZtYSA9IC47CisJX19nb3RfbG1hID0gX19nb3Rfdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWE7CisJLmdvdCA6IEFUKF9fZ290X2xtYSkgeworCQlfX2dvdF9zdGFydCA9IC47CisJCUtFRVAgKCooLmdvdC5wbHQpKQorCQlLRUVQICgqKC5nb3QpKQorCQlfX2dvdF9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCV9fZHluYW1pY192bWEgPSAuOworCV9fZHluYW1pY19sbWEgPSBfX2R5bmFtaWNfdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWE7CisJLmR5bmFtaWMgOiBBVChfX2R5bmFtaWNfbG1hKSB7CisJCV9fZHluYW1pY19zdGFydCA9IC47CisJCSooLmR5bmFtaWMpCisJCV9fZHluYW1pY19lbmQgPSAuOworCX0KKworCS4gPSBBTElHTigxNik7CisKKwlfX2RhdGFfdm1hID0gLjsKKwlfX2RhdGFfbG1hID0gX19kYXRhX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hOworCS5kYXRhIDogQVQoX19kYXRhX2xtYSkgeworCQlfX2RhdGFfc3RhcnQgPSAuOworCQkqKC5kYXRhKQorCQkqKC5kYXRhLiopCisJCV9fZGF0YV9lbmQgPSAuOworCX0KKworCV9fcG1fY29kZV9lbmQgPSAuOworCV9fcG1fY29kZV9sZW4gPSBBQlNPTFVURShfX3BtX2NvZGVfZW5kKSAtIEFCU09MVVRFKF9fcG1fY29kZV9zdGFydCk7CisJX19wbV9jb2RlX2R3b3JkcyA9IChfX3BtX2NvZGVfbGVuICsgMykgPj4gMjsKKworCS4gPSBBTElHTigxMjgpOworCQorCV9fYnNzX3ZtYSA9IC47CisJX19ic3NfbG1hID0gLjsJCS8qIER1bW15ICovCisJLmJzcyAoTk9MT0FEKSA6IEFUIChfX2Jzc19sbWEpIHsKKwkJX19ic3Nfc3RhcnQgPSAuOworCQkqKC5ic3MpCisJCSooLmJzcy4qKQorCQkqKENPTU1PTikKKwkJX19ic3NfZW5kID0gLjsKKwl9CisJX19ic3NfbGVuID0gQUJTT0xVVEUoX19ic3NfZW5kKSAtIEFCU09MVVRFKF9fYnNzX3N0YXJ0KTsKKwlfX2Jzc19kd29yZHMgPSAoX19ic3NfbGVuICsgMykgPj4gMjsKKworCS8qIFZlcnkgbGFyZ2Ugb2JqZWN0cyB3aGljaCBkb24ndCBuZWVkIHRvIGJlIHplcm9lZCAqLworCisJX19odWdlYnNzX3ZtYSA9IC47CisJX19odWdlYnNzX2xtYSA9IC47CQkvKiBEdW1teSAqLworCS5odWdlYnNzIChOT0xPQUQpIDogQVQgKF9faHVnZWJzc19sbWEpIHsKKwkJX19odWdlYnNzX3N0YXJ0ID0gLjsKKwkJKiguaHVnZWJzcykKKwkJKiguaHVnZWJzcy4qKQorCQlfX2h1Z2Vic3NfZW5kID0gLjsKKwl9CisJX19odWdlYnNzX2xlbiA9IEFCU09MVVRFKF9faHVnZWJzc19lbmQpIC0gQUJTT0xVVEUoX19odWdlYnNzX3N0YXJ0KTsKKwlfX2h1Z2Vic3NfZHdvcmRzID0gKF9faHVnZWJzc19sZW4gKyAzKSA+PiAyOworCisKKwkvKiBYWFg6IFRoaXMgc3RhY2sgc2hvdWxkIGJlIHVuaWZpZWQgd2l0aCB0aGUgQ09NMzIgc3RhY2sgKi8KKwlfX3N0YWNrX3ZtYSA9IC47CisJX19zdGFja19sbWEgPSAuOwkvKiBEdW1teSAqLworCS5zdGFjayAoTk9MT0FEKSA6IEFUKF9fc3RhY2tfbG1hKSB7CisJCV9fc3RhY2tfc3RhcnQgPSAuOworCQkqKC5zdGFjaykKKwkJX19zdGFja19lbmQgPSAuOworCX0KKwlfX3N0YWNrX2xlbiA9IEFCU09MVVRFKF9fc3RhY2tfZW5kKSAtIEFCU09MVVRFKF9fc3RhY2tfc3RhcnQpOworCV9fc3RhY2tfZHdvcmRzID0gKF9fc3RhY2tfbGVuICsgMykgPj4gMjsKKworCV9lbmQgPSAuOworCisJLyogQ09NMzJSIGFuZCBrZXJuZWxzIGFyZSBsb2FkZWQgYWZ0ZXIgb3VyIG93biBQTSBjb2RlICovCisJLiA9IEFMSUdOKDY1NTM2KTsKKwlmcmVlX2hpZ2hfbWVtb3J5ID0gLjsKKworCS8qIFN0dWZmIHdlIGRvbid0IG5lZWQuLi4gKi8KKwkvRElTQ0FSRC8gOiB7CisJCSooLmVoX2ZyYW1lKQorCX0KK30KZGlmZiAtLWdpdCBhL2NvcmUvaWRsZS5jIGIvY29yZS9pZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwNTA1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaWRsZS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpZGxlLmM6CisgKgorICogVGhpcyBmdW5jdGlvbiBwcm92aWRlZCBwcm90ZWN0ZWQtbW9kZSBhY2Nlc3MgdG8gdGhlIGlkbGUgaGFuZGxpbmcuCisgKiBJdCBuZWVkcyB0byBiZSBjYXJlZnVsbHkgY29vcmRpbmF0ZWQgd2l0aCBpZGxlLmluYywgd2hpY2ggcHJvdmlkZXMKKyAqIGlkbGUgc2VydmljZXMgdG8gcmVhbC1tb2RlIGNvZGUuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisKKyNkZWZpbmUgVElDS1NfVE9fSURMRQk0CS8qIEFsc28gaW4gaWRsZS5pbmMgKi8KKworc3RhdGljIGppZmZpZXNfdCBfSWRsZVRpbWVyOworX19leHBvcnQgdWludDE2X3QgTm9IYWx0ID0gMDsKKworaW50ICgqaWRsZV9ob29rX2Z1bmMpKHZvaWQpOworCit2b2lkIHJlc2V0X2lkbGUodm9pZCkKK3sKKyAgICBfSWRsZVRpbWVyID0gamlmZmllcygpOworICAgIHN0aSgpOwkvKiBHdWFyZCBhZ2FpbnN0IEJJT1MvUFhFIGJyb2tlbm5lc3MuLi4gKi8KK30KKworX19leHBvcnQgdm9pZCBfX2lkbGUodm9pZCkKK3sKKyAgICBpZiAoamlmZmllcygpIC0gX0lkbGVUaW1lciA8IFRJQ0tTX1RPX0lETEUpCisJcmV0dXJuOworCisgICAgaWYgKGlkbGVfaG9va19mdW5jICYmIGlkbGVfaG9va19mdW5jKCkpCisJcmV0dXJuOwkJCS8qIE5vbnplcm8gcmV0dXJuID0gZG8gbm90IGlkbGUgKi8KKworICAgIHN0aSgpOworICAgIGlmIChOb0hhbHQpCisJY3B1X3JlbGF4KCk7CisgICAgZWxzZQorCWhsdCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Jpb3MuaCBiL2NvcmUvaW5jbHVkZS9iaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmNGVmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW5jbHVkZS9iaW9zLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgQ29weXJpZ2h0IDE5OTQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiBiaW9zLmgKKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIEJJT1MgZGF0YSBzdHJ1Y3R1cmVzIGV0Yy4KKyAqLworCisjaWZuZGVmIF9CSU9TX0gKKyNkZWZpbmUgX0JJT1NfSAorCisjaW5jbHVkZSA8c3lzL2lvLmg+CisKKy8qCisgKiBJbnRlcnJ1cHQgdmVjdG9ycworICovCisjZGVmaW5lIEJJT1NfdGltZXJfaG9vawkoNCAqIDB4MUMpCisjZGVmaW5lIGZkY3RhYgkJKDQgKiAweDFFKQorI2RlZmluZSBmZGN0YWIxCQlmZGN0YWIKKyNkZWZpbmUgZmRjdGFiMgkJKGZkY3RhYiArIDIpCisKKyNkZWZpbmUgU0VSSUFMX0JBU0UJMHgwNDAwCS8qIEJhc2UgYWRkcmVzcyBmb3IgNCBzZXJpYWwgcG9ydHMgKi8KKyNkZWZpbmUgQklPU19mYm0JMHgwNDEzCS8qIEZyZWUgQmFzZSBNZW1vcnkgKGtpbG9ieXRlcykgKi8KKyNkZWZpbmUgQklPU19wYWdlCTB4MDQ2MgkvKiBDdXJyZW50IHZpZGVvIHBhZ2UgKi8KKyNkZWZpbmUgQklPU190aW1lcgkweDA0NkMJLyogVGltZXIgdGlja3MgKi8KKyNkZWZpbmUgQklPU19tYWdpYwkweDA0NzIJLyogQklPUyByZXNldCBtYWdpYyAqLworI2RlZmluZSBCSU9TX3ZpZHJvd3MJMHgwNDg0CS8qIE51bWJlciBvZiBzY3JlZW4gcm93cyAqLworCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGJpb3NfZmJtKHZvaWQpCit7CisJcmV0dXJuICoodm9sYXRpbGUgdWludDE2X3QgKilCSU9TX2ZibTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9iaW9zX2ZibSh1aW50MTZfdCBtZW0pCit7CisJKih2b2xhdGlsZSB1aW50MTZfdCAqKUJJT1NfZmJtID0gbWVtOworfQorCisjZGVmaW5lIHNlcmlhbF9idWZfc2l6ZQkJNDA5NgorI2RlZmluZSBJT19ERUxBWV9QT1JUCQkweDgwIC8qIEludmFsaWQgcG9ydCAod2UgaG9wZSEpICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb19kZWxheSh2b2lkKQoreworCW91dGIoMHgwLCBJT19ERUxBWV9QT1JUKTsKKwlvdXRiKDB4MCwgSU9fREVMQVlfUE9SVCk7Cit9CisKKy8qCisgKiBTb21ldGltZXMgd2UgbmVlZCB0byBhY2Nlc3Mgc2NyZWVuIGNvb3JkaW5hdGVzIGFzIHNlcGFyYXRlIDgtYml0CisgKiBlbnRpdGllcyBhbmQgc29tZXRpbWVzIHdlIG5lZWQgdG8gdXNlIHRoZW0gYXMgMTYtYml0IGVudGl0aWVzLiBVc2luZworICogdGhpcyBzdHJ1Y3R1cmUgYWxsb3dzIHRoZSBjb21waWxlciB0byBkbyBpdCBmb3IgdXMuCisgKi8KK3VuaW9uIHNjcmVlbiB7CisJc3RydWN0IHsKKwkJdWludDhfdCBjb2w7CS8qIEN1cnNvciBjb2x1bW4gZm9yIG1lc3NhZ2UgZmlsZSAqLworCQl1aW50OF90IHJvdzsJLyogQ3Vyc29yIHJvdyBmb3IgbWVzc2FnZSBmaWxlICovCisJfSBiOworCXVpbnQxNl90IGR4OworfTsKK2V4dGVybiB1bmlvbiBzY3JlZW4gX2N1cnNvcjsKK2V4dGVybiB1bmlvbiBzY3JlZW4gX3NjcmVlbnNpemU7CisKKyNkZWZpbmUgQ3Vyc29yRFgJX2N1cnNvci5keAorI2RlZmluZSBDdXJzb3JDb2wJX2N1cnNvci5iLmNvbAorI2RlZmluZSBDdXJzb3JSb3cJX2N1cnNvci5iLnJvdworCisjZGVmaW5lIFNjcmVlblNpemUJX3NjcmVlbnNpemUuZHgKKyNkZWZpbmUgVmlkQ29scwkJX3NjcmVlbnNpemUuYi5jb2wKKyNkZWZpbmUgVmlkUm93cwkJX3NjcmVlbnNpemUuYi5yb3cKKworLyogZm9udC5jICovCitleHRlcm4gdm9pZCB1c2VfZm9udCh2b2lkKTsKK2V4dGVybiB2b2lkIGJpb3NfYWRqdXN0X3NjcmVlbih2b2lkKTsKKworLyogc2VyaXJxLmMgKi8KK2V4dGVybiBjaGFyICpTZXJpYWxIZWFkOworZXh0ZXJuIGNoYXIgKlNlcmlhbFRhaWw7CisKK2V4dGVybiB2b2lkIGJpb3NfaW5pdCh2b2lkKTsKKworc3RhdGljIGlubGluZSB1aW50MTZfdCBnZXRfc2VyaWFsX3BvcnQodWludDE2X3QgcG9ydCkKK3sKKyAgICAvKiBNYWdpYyBhcnJheSBpbiBCSU9TIG1lbW9yeSwgY29udGFpbnMgZm91ciBlbnRyaWVzICovCisgICAgY29uc3QgdWludDE2X3QgKiBjb25zdCBzZXJpYWxfcG9ydHMgPSAoY29uc3QgdWludDE2X3QgKilTRVJJQUxfQkFTRTsKKworICAgIC8qCisgICAgICogSWYgcG9ydCA+IDMgdGhlbiB0aGUgcG9ydCBpcyBzaW1wbHkgdGhlIEkvTyBiYXNlIGFkZHJlc3MKKyAgICAgKi8KKyAgICBpZiAocG9ydCA+IDMpCisJcmV0dXJuIHBvcnQ7CisKKyAgICAvKiBHZXQgdGhlIEkvTyBwb3J0IGZyb20gdGhlIEJJT1MgKi8KKyAgICByZXR1cm4gc2VyaWFsX3BvcnRzW3BvcnRdOworfQorCisjZW5kaWYgLyogX0JJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2NhY2hlLmggYi9jb3JlL2luY2x1ZGUvY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGI4MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9pbmNsdWRlL2NhY2hlLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfQ0FDSEVfSAorI2RlZmluZSBfQ0FDSEVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlICJkaXNrLmgiCisjaW5jbHVkZSAiZnMuaCIKKworLyogVGhlIGNhY2hlIHN0cnVjdHVyZSAqLworc3RydWN0IGNhY2hlIHsKKyAgICBibG9ja190IGJsb2NrOworICAgIHN0cnVjdCBjYWNoZSAqcHJldjsKKyAgICBzdHJ1Y3QgY2FjaGUgKm5leHQ7CisgICAgdm9pZCAqZGF0YTsKK307CisKKy8qIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGNhY2hlLmMgKi8KK3ZvaWQgY2FjaGVfaW5pdChzdHJ1Y3QgZGV2aWNlICosIGludCk7Citjb25zdCB2b2lkICpnZXRfY2FjaGUoc3RydWN0IGRldmljZSAqLCBibG9ja190KTsKK3N0cnVjdCBjYWNoZSAqX2dldF9jYWNoZV9ibG9jayhzdHJ1Y3QgZGV2aWNlICosIGJsb2NrX3QpOwordm9pZCBjYWNoZV9sb2NrX2Jsb2NrKHN0cnVjdCBjYWNoZSAqKTsKK3NpemVfdCBjYWNoZV9yZWFkKHN0cnVjdCBmc19pbmZvICosIHZvaWQgKiwgdWludDY0X3QsIHNpemVfdCk7CisKKyNlbmRpZiAvKiBjYWNoZS5oICovCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvY29kZXBhZ2UuaCBiL2NvcmUvaW5jbHVkZS9jb2RlcGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNGQ5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2luY2x1ZGUvY29kZXBhZ2UuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29kZXBhZ2UgZGF0YSBzdHJ1Y3R1cmUgYXMgZ2VuZXJhdGVkIGJ5IGNwdGFibGUucGwKKyAqLworI2lmbmRlZiBDT0RFUEFHRV9ICisjZGVmaW5lIENPREVQQUdFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIENPREVQQUdFX01BR0lDCVVJTlQ2NF9DKDB4NTFkMjFlYjE1OGE4YjNkNCkKKworc3RydWN0IGNvZGVwYWdlIHsKKyAgICB1aW50NjRfdAltYWdpYzsKKyAgICB1aW50MzJfdAlyZXNlcnZlZFs2XTsKKworICAgIHVpbnQ4X3QJdXBwZXJbMjU2XTsJLyogQ29kZXBhZ2UgdXBwZXIgY2FzZSB0YWJsZSAqLworICAgIHVpbnQ4X3QJbG93ZXJbMjU2XTsJLyogQ29kZXBhZ2UgbG93ZXIgY2FzZSB0YWJsZSAqLworCisgICAgLyoKKyAgICAgKiBUaGUgcHJpbWFyeSBVbmljb2RlIG1hdGNoIGlzIHRoZSBzYW1lIGNhc2UsIGkuZS4gQSAtPiBBLAorICAgICAqIHRoZSBzZWNvbmRhcnkgVW5pY29kZSBtYXRjaCBpcyB0aGUgb3Bwb3NpdGUgY2FzZSwgaS5lLiBBIC0+IGEuCisgICAgICovCisgICAgdWludDE2X3QJdW5pWzJdWzI1Nl07CS8qIFByaW1hcnkgYW5kIGFsdGVybmF0ZSBVbmljb2RlIG1hdGNoZXMgKi8KK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY29kZXBhZ2UgY29kZXBhZ2U7CisKKyNlbmRpZiAvKiBDT0RFUEFHRV9IICovCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvY29yZS5oIGIvY29yZS9pbmNsdWRlL2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzgzZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9pbmNsdWRlL2NvcmUuaApAQCAtMCwwICsxLDE1NiBAQAorI2lmbmRlZiBDT1JFX0gKKyNkZWZpbmUgQ09SRV9ICisKKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9wbWFwaS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3N5c2FwcGVuZC5oPgorI2luY2x1ZGUgPGthYm9vbS5oPgorI2luY2x1ZGUgPHRpbWVyLmg+CisKK2V4dGVybiBjaGFyIGNvcmVfeGZlcl9idWZbNjU1MzZdOworZXh0ZXJuIGNoYXIgY29yZV9jYWNoZV9idWZbNjU1MzZdOworZXh0ZXJuIGNoYXIgdHJhY2tidWZbXTsKK2V4dGVybiBjaGFyIEN1cnJlbnREaXJOYW1lW107CitleHRlcm4gY2hhciBTdWJ2b2xOYW1lW107CitleHRlcm4gY2hhciBDb25maWdOYW1lW107CitleHRlcm4gY2hhciBjb25maWdfY3dkW107CitleHRlcm4gY2hhciBjbWRfbGluZVtdOworZXh0ZXJuIGNoYXIgQ29uZmlnRmlsZVtdOworZXh0ZXJuIGNoYXIgc3lzbGludXhfYmFubmVyW107CitleHRlcm4gY2hhciBjb3B5cmlnaHRfc3RyW107CisKK2V4dGVybiBjb25zdCBzaXplX3QgX19zeXNsaW51eF9zaHVmZmxlcl9zaXplOworCitzdGF0aWMgaW5saW5lIHNpemVfdCBzeXNsaW51eF9zaHVmZmxlcl9zaXplKHZvaWQpCit7CisgICAgcmV0dXJuIF9fc3lzbGludXhfc2h1ZmZsZXJfc2l6ZTsKK30KKworLyoKKyAqIE1hcmsgc3ltYm9scyB0aGF0IGFyZSBvbmx5IHVzZWQgYnkgQklPUyBhcyBfX3dlYWsgdW50aWwgd2UgY2FuIG1vdmUKKyAqIGFsbCByZWZlcmVuY2VzIG91dCBvZiB0aGUgZ2VuZXJpYyAoRUZJICsgQklPUykgY29kZSBhbmQgaW50bworICogQklPUy1zcGVjaWZpYyBjb2RlLgorICovCitleHRlcm4gX193ZWFrIHVpbnQxNl90IEJJT1NOYW1lOworZXh0ZXJuIF9fd2VhayBjaGFyIEtlcm5lbE5hbWVbXTsKK2V4dGVybiBfX3dlYWsgY2hhciBTdGFja0J1ZltdOworCitleHRlcm4gdWludDhfdCBLYmRNYXBbMjU2XTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IElQQXBwZW5kc1tdOworZXh0ZXJuIHNpemVfdCBudW1JUEFwcGVuZHM7CisKK2V4dGVybiB1aW50MTZfdCBTZXJpYWxQb3J0OworZXh0ZXJuIHVpbnQxNl90IEJhdWREaXZpc29yOworZXh0ZXJuIHVpbnQ4X3QgRmxvd091dHB1dDsKK2V4dGVybiB1aW50OF90IEZsb3dJbnB1dDsKK2V4dGVybiB1aW50OF90IEZsb3dJZ25vcmU7CisKK2V4dGVybiB1aW50OF90IFNjcm9sbEF0dHJpYnV0ZTsKK2V4dGVybiB1aW50MTZfdCBEaXNwbGF5Q29uOworCisvKiBkaXNrc3RhcnQuaW5jIGlzb2xpbnV4LmFzbSovCitleHRlcm4gdm9pZCBnZXRsaW5zZWModm9pZCk7CisKKy8qIHBtLmluYyAqLwordm9pZCBjb3JlX3BtX251bGxfaG9vayh2b2lkKTsKK2V4dGVybiB2b2lkICgqY29yZV9wbV9ob29rKSh2b2lkKTsKKworLyogZ2V0Yy5pbmMgKi8KK2V4dGVybiB2b2lkIGNvcmVfb3Blbih2b2lkKTsKKworLyogYWR2LmluYyAqLworZXh0ZXJuIHZvaWQgYWR2X2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBhZHZfd3JpdGUodm9pZCk7CisKKy8qIGhlbGxvLmMgKi8KK2V4dGVybiB2b2lkIG15cHV0cyhjb25zdCBjaGFyKik7CisKKy8qIGlkbGUuYyAqLworZXh0ZXJuIGludCAoKmlkbGVfaG9va19mdW5jKSh2b2lkKTsKK2V4dGVybiB2b2lkIF9faWRsZSh2b2lkKTsKK2V4dGVybiB2b2lkIHJlc2V0X2lkbGUodm9pZCk7CisKKy8qIG1lbS9tYWxsb2MuYywgbWVtL2ZyZWUuYywgbWVtL2luaXQuYyAqLworZXh0ZXJuIHZvaWQgKmxtYWxsb2Moc2l6ZV90KTsKK2V4dGVybiB2b2lkICpwbWFwaV9sbWFsbG9jKHNpemVfdCk7CitleHRlcm4gdm9pZCAqemFsbG9jKHNpemVfdCk7CitleHRlcm4gdm9pZCBmcmVlKHZvaWQgKik7CitleHRlcm4gdm9pZCBtZW1faW5pdCh2b2lkKTsKKworLyogc3lzYXBwZW5kLmMgKi8KK2V4dGVybiB2b2lkIHByaW50X3N5c2FwcGVuZCh2b2lkKTsKK2V4dGVybiBjb25zdCBjaGFyICpzeXNhcHBlbmRfc3RyaW5nc1tTWVNBUFBFTkRfTUFYXTsKK2V4dGVybiB1aW50MzJfdCBTeXNBcHBlbmRzOworZXh0ZXJuIHZvaWQgc3lzYXBwZW5kX3NldF91dWlkKGNvbnN0IHVpbnQ4X3QgKnV1aWQpOworZXh0ZXJuIHZvaWQgc3lzYXBwZW5kX3NldF9mc191dWlkKHZvaWQpOworCit2b2lkIF9fY2RlY2wgY29yZV9pbnRjYWxsKHVpbnQ4X3QsIGNvbnN0IGNvbTMyc3lzX3QgKiwgY29tMzJzeXNfdCAqKTsKK3ZvaWQgX19jZGVjbCBjb3JlX2ZhcmNhbGwodWludDMyX3QsIGNvbnN0IGNvbTMyc3lzX3QgKiwgY29tMzJzeXNfdCAqKTsKK2ludCBfX2NkZWNsIGNvcmVfY2ZhcmNhbGwodWludDMyX3QsIGNvbnN0IHZvaWQgKiwgdWludDMyX3QpOworCitleHRlcm4gY29uc3QgY29tMzJzeXNfdCB6ZXJvX3JlZ3M7Cit2b2lkIGNhbGwxNih2b2lkICgqKSh2b2lkKSwgY29uc3QgY29tMzJzeXNfdCAqLCBjb20zMnN5c190ICopOworCisvKgorICogX19sb3dtZW0gaXMgaW4gdGhlIGxvdyAxIE1COyBfX2JzczE2IGluIHRoZSBsb3cgNjRLCisgKi8KKyNpZmRlZiBfX1NZU0xJTlVYX0NPUkVfXwkvKiBOb3Qgc3VwcG9ydGVkIGluIG1vZHVsZXMgKi8KKyMgZGVmaW5lIF9fbG93bWVtIF9fYXR0cmlidXRlX18oKG5vY29tbW9uLHNlY3Rpb24oIi5sb3dtZW0iKSkpCisjIGRlZmluZSBfX2JzczE2ICBfX2F0dHJpYnV0ZV9fKChub2NvbW1vbixzZWN0aW9uKCIuYnNzMTYiKSkpCisjZW5kaWYKKworLyoKKyAqIEhlbHBlciByb3V0aW5lIHRvIHJldHVybiBhIHNwZWNpZmljIHNldCBvZiBmbGFncworICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZsYWdzKGNvbTMyc3lzX3QgKnJlZ3MsIHVpbnQzMl90IGZsYWdzKQoreworICAgIHVpbnQzMl90IGVmbGFnczsKKworICAgIGVmbGFncyA9IHJlZ3MtPmVmbGFncy5sOworICAgIGVmbGFncyAmPSB+KEVGTEFHU19DRnxFRkxBR1NfUEZ8RUZMQUdTX0FGfEVGTEFHU19aRnxFRkxBR1NfU0Z8RUZMQUdTX09GKTsKKyAgICBlZmxhZ3MgfD0gZmxhZ3M7CisgICAgcmVncy0+ZWZsYWdzLmwgPSBlZmxhZ3M7Cit9CisKK2V4dGVybiBpbnQgc3RhcnRfbGRsaW51eChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworZXh0ZXJuIGludCBjcmVhdGVfYXJnc19hbmRfbG9hZChjaGFyICopOworCitleHRlcm4gdm9pZCB3cml0ZV9zZXJpYWwoY2hhciBkYXRhKTsKK2V4dGVybiB2b2lkIHdyaXRlc3RyKGNoYXIgKnN0cik7CitleHRlcm4gdm9pZCB3cml0ZWNocihjaGFyIGRhdGEpOworZXh0ZXJuIHZvaWQgY3JsZih2b2lkKTsKK2V4dGVybiBpbnQgcG9sbGNoYXIodm9pZCk7CitleHRlcm4gY2hhciBnZXRjaGFyKGNoYXIgKmhpKTsKK2V4dGVybiB1aW50OF90IGtiZF9zaGlmdGZsYWdzKHZvaWQpOworc3RhdGljIGlubGluZSBib29sIHNoaWZ0X2lzX2hlbGQodm9pZCkKK3sKKyAgICByZXR1cm4gISEoa2JkX3NoaWZ0ZmxhZ3MoKSAmIDB4NWQpOyAvKiBDYXBzL1Njcm9sbC9BbHQvU2hpZnQgKi8KK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBjdHJsX2lzX2hlbGQodm9pZCkKK3sKKyAgICByZXR1cm4gISEoa2JkX3NoaWZ0ZmxhZ3MoKSAmIDB4MDQpOyAvKiBPbmx5IEN0cmwgKi8KK30KKworZXh0ZXJuIHZvaWQgY2xlYW51cF9oYXJkd2FyZSh2b2lkKTsKK2V4dGVybiB2b2lkIHNpcnFfY2xlYW51cCh2b2lkKTsKK2V4dGVybiB2b2lkIGFkanVzdF9zY3JlZW4odm9pZCk7CisKK2V4dGVybiB2b2lkIGV4ZWN1dGUoY29uc3QgY2hhciAqY21kbGluZSwgdWludDMyX3QgdHlwZSwgYm9vbCBzeXNhcHBlbmQpOworZXh0ZXJuIHZvaWQgbG9hZF9rZXJuZWwoY29uc3QgY2hhciAqY21kbGluZSk7CisKK2V4dGVybiB2b2lkIGRtaV9pbml0KHZvaWQpOworCitleHRlcm4gdm9pZCBkb19zeXNhcHBlbmQoY2hhciAqYnVmKTsKKworZXh0ZXJuIHZvaWQgbG9hZF9lbnYzMihjb20zMnN5c190ICpyZWdzKTsKKworI2VuZGlmIC8qIENPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2N0eXBlLmggYi9jb3JlL2luY2x1ZGUvY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzdmNTdmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9pbmNsdWRlL2N0eXBlLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBDVFlQRV9ICisjZGVmaW5lIENUWVBFX0gKKworLyoKKyAqIFNtYWxsIHN1YnNldCBvZiA8Y3R5cGUuaD4gZm9yIHBhcnNpbmcgdXNlcywgb25seSBoYW5kbGVzIEFTQ0lJCisgKiBhbmQgcGFzc2VzIHRoZSByZXN0IHRocm91Z2guCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdG91cHBlcihpbnQgYykKK3sKKyAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisJYyAtPSAweDIwOworCisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRvbG93ZXIoaW50IGMpCit7CisgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCWMgKz0gMHgyMDsKKworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc3NwYWNlKGludCBjaCkKK3sKKyAgICBpbnQgc3BhY2UgPSAwOworICAgIGlmICgoY2ggPT0gJyAnKSB8fAorCShjaCA9PSAnXGYnKSB8fAorCShjaCA9PSAnXG4nKSB8fAorCShjaCA9PSAnXHInKSB8fAorCShjaCA9PSAnXHQnKSB8fAorCShjaCA9PSAnXHYnKSkKKwlzcGFjZSA9IDE7CisgICAgcmV0dXJuIHNwYWNlOworfQorCisjZW5kaWYgLyogQ1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Rpc2suaCBiL2NvcmUvaW5jbHVkZS9kaXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExOWU4YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW5jbHVkZS9kaXNrLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBESVNLX0gKKyNkZWZpbmUgRElTS19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorCit0eXBlZGVmIHVpbnQ2NF90IHNlY3Rvcl90OwordHlwZWRlZiB1aW50NjRfdCBibG9ja190OworCitzdHJ1Y3QgYmlvc19kaXNrX3ByaXZhdGUgeworCWNvbTMyc3lzX3QgKnJlZ3M7Cit9OworCisvKgorICogc3RydWN0IGRpc2s6IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGRpc2sgYW5kIGFsc28KKyAqIGNvbnRhaW5zIHRoZSBJL08gZnVuY3Rpb24uCisgKi8KK3N0cnVjdCBkaXNrIHsKKyAgICB2b2lkICpwcml2YXRlOwkvKiBGaXJtd2FyZS1wcml2YXRlIGRpc2sgaW5mbyAqLworICAgIHVuc2lnbmVkIGludCBkaXNrX251bWJlcjsJLyogaW4gQklPUyBzdHlsZSAqLworICAgIHVuc2lnbmVkIGludCBzZWN0b3Jfc2l6ZTsJLyogZ2VuZXI1MTJCIG9yIDIwNDhCICovCisgICAgdW5zaWduZWQgaW50IHNlY3Rvcl9zaGlmdDsKKyAgICB1bnNpZ25lZCBpbnQgbWF4dHJhbnNmZXI7CS8qIE1heCBzZWN0b3JzIHBlciB0cmFuc2ZlciAqLworICAgIAorICAgIHVuc2lnbmVkIGludCBoLCBzOwkJLyogQ0hTIGdlb21ldHJ5ICovCisgICAgdW5zaWduZWQgaW50IHNlY3BlcmN5bDsJLyogaCpzICovCisgICAgdW5zaWduZWQgaW50IF9wYWQ7CisKKyAgICBzZWN0b3JfdCBwYXJ0X3N0YXJ0OyAgIC8qIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoaXMgcGFydGl0aW9uKGluIHNlY3RvcnMpICovCisKKyAgICBpbnQgKCpyZHdyX3NlY3RvcnMpKHN0cnVjdCBkaXNrICosIHZvaWQgKiwgc2VjdG9yX3QsIHNpemVfdCwgYm9vbCk7Cit9OworCitleHRlcm4gdm9pZCByZWFkX3NlY3RvcnMoY2hhciAqLCBzZWN0b3JfdCwgaW50KTsKK2V4dGVybiB2b2lkIGdldG9uZWJsayhzdHJ1Y3QgZGlzayAqLCBjaGFyICosIGJsb2NrX3QsIGludCk7CisKKy8qIGRpc2tpby5jICovCitzdHJ1Y3QgZGlzayAqYmlvc19kaXNrX2luaXQodm9pZCAqKTsKK3N0cnVjdCBkZXZpY2UgKmRldmljZV9pbml0KHZvaWQgKik7CisKKyNlbmRpZiAvKiBESVNLX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcy5oIGIvY29yZS9pbmNsdWRlL2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3ZDY3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW5jbHVkZS9mcy5oCkBAIC0wLDAgKzEsMjU1IEBACisjaWZuZGVmIEZTX0gKKyNkZWZpbmUgRlNfSAorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL2RpcmVudC5oPgorI2luY2x1ZGUgPGRwcmludGYuaD4KKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGlzay5oIgorCisvKgorICogTWF4aW11bSBudW1iZXIgb2Ygb3BlbiBmaWxlcy4KKyAqLworI2RlZmluZSBNQVhfT1BFTl9MRzIJNworI2RlZmluZSBNQVhfT1BFTgkoMSA8PCBNQVhfT1BFTl9MRzIpCisKKyNkZWZpbmUgRklMRU5BTUVfTUFYX0xHMiA4CisjZGVmaW5lIEZJTEVOQU1FX01BWCAgICAgKDEgPDwgRklMRU5BTUVfTUFYX0xHMikKKworI2RlZmluZSBDVVJSRU5URElSX01BWAlGSUxFTkFNRV9NQVgKKworI2RlZmluZSBCTE9DS19TSVpFKGZzKSAgICgoZnMpLT5ibG9ja19zaXplKQorI2RlZmluZSBCTE9DS19TSElGVChmcykJICgoZnMpLT5ibG9ja19zaGlmdCkKKyNkZWZpbmUgU0VDVE9SX1NJWkUoZnMpICAoKGZzKS0+c2VjdG9yX3NpemUpCisjZGVmaW5lIFNFQ1RPUl9TSElGVChmcykgKChmcyktPnNlY3Rvcl9zaGlmdCkKKworc3RydWN0IGZzX2luZm8geworICAgIGNvbnN0IHN0cnVjdCBmc19vcHMgKmZzX29wczsKKyAgICBzdHJ1Y3QgZGV2aWNlICpmc19kZXY7CisgICAgdm9pZCAqZnNfaW5mbzsgICAgICAgICAgICAgLyogVGhlIGZzLXNwZWNpZmljIGluZm9ybWF0aW9uICovCisgICAgaW50IHNlY3Rvcl9zaGlmdCwgc2VjdG9yX3NpemU7CisgICAgaW50IGJsb2NrX3NoaWZ0LCBibG9ja19zaXplOworICAgIHN0cnVjdCBpbm9kZSAqcm9vdCwgKmN3ZDsJICAgCS8qIFJvb3QgYW5kIGN1cnJlbnQgZGlyZWN0b3JpZXMgKi8KKyAgICBjaGFyIGN3ZF9uYW1lW0NVUlJFTlRESVJfTUFYXTsJLyogQ3VycmVudCBkaXJlY3RvcnkgYnkgbmFtZSAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBmc19pbmZvICp0aGlzX2ZzOworCitzdHJ1Y3QgZGlyZW50OyAgICAgICAgICAgICAgICAgIC8qIERpcmVjdG9yeSBlbnRyeSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBmaWxlOworZW51bSBmc19mbGFncyB7CisgICAgRlNfTk9ERVYgICA9IDEgPDwgMCwKKyAgICBGU19VU0VNRU0gID0gMSA8PCAxLCAgICAgICAgLyogSWYgd2UgbmVlZCBhIG1hbGxvYyByb3V0aW5lLCBzZXQgaXQgKi8KKyAgICBGU19USElTSU5EID0gMSA8PCAyLCAgICAgICAgLyogU2V0IGN3ZCBiYXNlZCBvbiBjb25maWcgZmlsZSBsb2NhdGlvbiAqLworfTsKKworc3RydWN0IGZzX29wcyB7CisgICAgLyogaW4gZmFjdCwgd2UgdXNlIGZzX29wcyBzdHJ1Y3R1cmUgdG8gZmluZCB0aGUgcmlnaHQgZnMgKi8KKyAgICBjb25zdCBjaGFyICpmc19uYW1lOworICAgIGVudW0gZnNfZmxhZ3MgZnNfZmxhZ3M7CisgICAgCisgICAgaW50ICAgICAgKCpmc19pbml0KShzdHJ1Y3QgZnNfaW5mbyAqKTsKKyAgICB2b2lkICAgICAoKnNlYXJjaGRpcikoY29uc3QgY2hhciAqLCBpbnQsIHN0cnVjdCBmaWxlICopOworICAgIHVpbnQzMl90ICgqZ2V0ZnNzZWMpKHN0cnVjdCBmaWxlICosIGNoYXIgKiwgaW50LCBib29sICopOworICAgIHZvaWQgICAgICgqY2xvc2VfZmlsZSkoc3RydWN0IGZpbGUgKik7CisgICAgdm9pZCAgICAgKCptYW5nbGVfbmFtZSkoY2hhciAqLCBjb25zdCBjaGFyICopOworICAgIHNpemVfdCAgICgqcmVhbHBhdGgpKHN0cnVjdCBmc19pbmZvICosIGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworICAgIGludCAgICAgICgqY2hkaXIpKHN0cnVjdCBmc19pbmZvICosIGNvbnN0IGNoYXIgKik7CisgICAgaW50ICAgICAgKCpjaGRpcl9zdGFydCkodm9pZCk7CisgICAgaW50ICAgICAgKCpvcGVuX2NvbmZpZykoc3RydWN0IGNvbTMyX2ZpbGVkYXRhICopOworCisgICAgc3RydWN0IGlub2RlICogKCppZ2V0X3Jvb3QpKHN0cnVjdCBmc19pbmZvICopOworICAgIHN0cnVjdCBpbm9kZSAqICgqaWdldCkoY29uc3QgY2hhciAqLCBzdHJ1Y3QgaW5vZGUgKik7CisgICAgaW50CSAgICAgKCpyZWFkbGluaykoc3RydWN0IGlub2RlICosIGNoYXIgKik7CisKKyAgICAvKiB0aGUgX2Rpcl8gc3R1ZmYgKi8KKyAgICBpbnQJICAgICAoKnJlYWRkaXIpKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkaXJlbnQgKik7CisKKyAgICBpbnQgICAgICAoKm5leHRfZXh0ZW50KShzdHJ1Y3QgaW5vZGUgKiwgdWludDMyX3QpOworCisgICAgaW50ICAgICAgKCpjb3B5X3N1cGVyKSh2b2lkICpidWYpOworCisgICAgY2hhciAqICAgKCpmc191dWlkKShzdHJ1Y3QgZnNfaW5mbyAqKTsKKworfTsKKworLyoKKyAqIEV4dGVudCBzdHJ1Y3R1cmU6IGNvbnRhaW5zIHRoZSBtYXBwaW5nIG9mIHNvbWUgY2h1bmsgb2YgYSBmaWxlCisgKiB0aGF0IGlzIGNvbnRpZ3VvdXMgb24gZGlzay4KKyAqLworc3RydWN0IGV4dGVudCB7CisgICAgc2VjdG9yX3QJcHN0YXJ0OwkJLyogUGh5c2ljYWwgc3RhcnQgc2VjdG9yICovCisgICAgdWludDMyX3QJbHN0YXJ0OwkJLyogTG9naWNhbCBzdGFydCBzZWN0b3IgKi8KKyAgICB1aW50MzJfdAlsZW47CQkvKiBOdW1iZXIgb2YgY29udGlndW91cyBzZWN0b3JzICovCit9OworCisvKiBTcGVjaWFsIHNlY3RvciBudW1iZXJzIHVzZWQgZm9yIHN0cnVjdCBleHRlbnQucHN0YXJ0ICovCisjZGVmaW5lIEVYVEVOVF9aRVJPCSgoc2VjdG9yX3QpLTEpIC8qIEFsbC16ZXJvIGV4dGVudCAqLworI2RlZmluZSBFWFRFTlRfVk9JRAkoKHNlY3Rvcl90KS0yKSAvKiBJbnZhbGlkIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgRVhURU5UX1NQRUNJQUwoeCkJKCh4KSA+PSBFWFRFTlRfVk9JRCkKKworLyogCisgKiBUaGUgaW5vZGUgc3RydWN0dXJlLCBpbmNsdWRpbmcgdGhlIGRldGFpbCBmaWxlIGluZm9ybWF0aW9uIAorICovCitzdHJ1Y3QgaW5vZGUgeworICAgIHN0cnVjdCBmc19pbmZvICpmczsJIC8qIFRoZSBmaWxlc3lzdGVtIHRoaXMgaW5vZGUgaXMgYXNzb2NpYXRlZCB3aXRoICovCisgICAgc3RydWN0IGlub2RlICpwYXJlbnQ7CS8qIFBhcmVudCBkaXJlY3RvcnksIGlmIGFueSAqLworICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBOYW1lLCB2YWxpZCBmb3IgZ2VuZXJpYyBwYXRoIHNlYXJjaCBvbmx5ICovCisgICAgaW50CQkgcmVmY250OworICAgIGludCAgICAgICAgICBtb2RlOyAgIC8qIEZJTEUgLCBESVIgb3IgU1lNTElOSyAqLworICAgIHVpbnQ2NF90ICAgICBzaXplOworICAgIHVpbnQ2NF90CSBibG9ja3M7IC8qIEhvdyBtYW55IGJsb2NrcyB0aGUgZmlsZSB0YWtlICovCisgICAgdWludDY0X3QgICAgIGlubzsgICAgLyogSW5vZGUgbnVtYmVyICovCisgICAgdWludDMyX3QgICAgIGF0aW1lOyAgLyogQWNjZXNzIHRpbWUgKi8KKyAgICB1aW50MzJfdCAgICAgbXRpbWU7ICAvKiBNb2RpZnkgdGltZSAqLworICAgIHVpbnQzMl90ICAgICBjdGltZTsgIC8qIENyZWF0ZSB0aW1lICovCisgICAgdWludDMyX3QgICAgIGR0aW1lOyAgLyogRGVsZXRlIHRpbWUgKi8KKyAgICB1aW50MzJfdCAgICAgZmxhZ3M7CisgICAgdWludDMyX3QgICAgIGZpbGVfYWNsOworICAgIHN0cnVjdCBleHRlbnQgdGhpc19leHRlbnQsIG5leHRfZXh0ZW50OworICAgIGNoYXIgICAgICAgICBwdnRbMF07IC8qIFByaXZhdGUgZmlsZXN5c3RlbSBkYXRhICovCit9OworCitzdHJ1Y3QgZmlsZSB7CisgICAgc3RydWN0IGZzX2luZm8gKmZzOworICAgIHVpbnQzMl90IG9mZnNldDsgICAgICAgICAgICAvKiBmb3IgbmV4dCByZWFkICovCisgICAgc3RydWN0IGlub2RlICppbm9kZTsgICAgICAgIC8qIFRoZSBmaWxlLXNwZWNpZmljIGluZm9ybWF0aW9uICovCit9OworCisvKgorICogU3RydWN0IGRldmljZSBjb250YWluczoKKyAqICAgICB0aGUgcG9pbnRlciBwb2ludHMgdG8gdGhlIGRpc2sgc3RydWN0dXJlLAorICogICAgIHRoZSBjYWNoZSBzdHVmZi4KKyAqLworc3RydWN0IGNhY2hlOworCitzdHJ1Y3QgZGV2aWNlIHsKKyAgICBzdHJ1Y3QgZGlzayAqZGlzazsKKworICAgIC8qIHRoZSBjYWNoZSBzdHVmZiAqLworICAgIHVpbnQ4X3QgY2FjaGVfaW5pdDsgLyogY2FjaGUgaW5pdGlhbGl6ZWQgc3RhdGUgKi8KKyAgICBjaGFyICpjYWNoZV9kYXRhOworICAgIHN0cnVjdCBjYWNoZSAqY2FjaGVfaGVhZDsKKyAgICB1aW50MTZfdCBjYWNoZV9ibG9ja19zaXplOworICAgIHVpbnQxNl90IGNhY2hlX2VudHJpZXM7CisgICAgdWludDMyX3QgY2FjaGVfc2l6ZTsKK307CisKKy8qCisgKiBPdXIgZGVmaW5pdGlvbiBvZiAibm90IHdoaXRlc3BhY2UiCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBub3Rfd2hpdGVzcGFjZShjaGFyIGMpCit7CisgIHJldHVybiAodW5zaWduZWQgY2hhciljID4gJyAnOworfQorCisvKgorICogSW5vZGUgYWxsb2NhdG9yL2RlYWxsb2NhdG9yCisgKi8KK3N0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUoc3RydWN0IGZzX2luZm8gKmZzLCB1aW50MzJfdCBpbm8sIHNpemVfdCBkYXRhKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworICAgIGZyZWUoaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqZ2V0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgaW5vZGUtPnJlZmNudCsrOworICAgIGRwcmludGYoImdldF9pbm9kZSAlcCBuYW1lICVzIHJlZmNudCAlZFxuIiwKKwkgICAgaW5vZGUsIGlub2RlLT5uYW1lLCBpbm9kZS0+cmVmY250KTsKKyAgICByZXR1cm4gaW5vZGU7Cit9CisKK3ZvaWQgcHV0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFsbG9jX2Vycm9yKGNoYXIgKm9iaikKK3sKKyAgICAgICAgcHJpbnRmKCJPdXQgb2YgbWVtb3J5OiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICVzXG4iLCBvYmopOworCWthYm9vbSgpOworfQorCisvKgorICogRmlsZSBoYW5kbGUgY29udmVyc2lvbiBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlIGZpbGVzW107CitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGZpbGVfdG9faGFuZGxlKHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIHJldHVybiBmaWxlID8gKGZpbGUgLSBmaWxlcykrMSA6IDA7Cit9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBmaWxlICpoYW5kbGVfdG9fZmlsZSh1aW50MTZfdCBoYW5kbGUpCit7CisgICAgcmV0dXJuIGhhbmRsZSA/ICZmaWxlc1toYW5kbGUtMV0gOiBOVUxMOworfQorCitzdHJ1Y3QgcGF0aF9lbnRyeSB7CisgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworICAgIGNvbnN0IGNoYXIgKnN0cjsKK307CisKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIFBBVEg7CisKK2V4dGVybiBzdHJ1Y3QgcGF0aF9lbnRyeSAqcGF0aF9hZGQoY29uc3QgY2hhciAqc3RyKTsKKworLyogZnMuYyAqLwordm9pZCBmc19pbml0KGNvbnN0IHN0cnVjdCBmc19vcHMgKipvcHMsIHZvaWQgKnByaXYpOwordm9pZCBwbV9tYW5nbGVfbmFtZShjb20zMnN5c190ICopOwordm9pZCBwbV9zZWFyY2hkaXIoY29tMzJzeXNfdCAqKTsKK3ZvaWQgbWFuZ2xlX25hbWUoY2hhciAqLCBjb25zdCBjaGFyICopOworaW50IHNlYXJjaGRpcihjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpOwordm9pZCBfY2xvc2VfZmlsZShzdHJ1Y3QgZmlsZSAqKTsKK3NpemVfdCBwbWFwaV9yZWFkX2ZpbGUodWludDE2X3QgKmhhbmRsZSwgdm9pZCAqYnVmLCBzaXplX3Qgc2VjdG9ycyk7CitpbnQgb3Blbl9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywgc3RydWN0IGNvbTMyX2ZpbGVkYXRhICpmaWxlZGF0YSk7Cit2b2lkIHBtX29wZW5fZmlsZShjb20zMnN5c190ICopOwordm9pZCBjbG9zZV9maWxlKHVpbnQxNl90IGhhbmRsZSk7Cit2b2lkIHBtX2Nsb3NlX2ZpbGUoY29tMzJzeXNfdCAqKTsKK2ludCBvcGVuX2NvbmZpZyh2b2lkKTsKK2NoYXIgKmZzX3V1aWQodm9pZCk7CisKK2V4dGVybiB1aW50MTZfdCBTZWN0b3JTaGlmdDsKKworLyogY2hkaXIuYyAqLwordm9pZCBwbV9yZWFscGF0aChjb20zMnN5c190ICpyZWdzKTsKK3NpemVfdCByZWFscGF0aChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGJ1ZnNpemUpOworaW50IGNoZGlyKGNvbnN0IGNoYXIgKnNyYyk7CisKKy8qIHJlYWRkaXIuYyAqLworRElSICpvcGVuZGlyKGNvbnN0IGNoYXIgKnBhdGhuYW1lKTsKK3N0cnVjdCBkaXJlbnQgKnJlYWRkaXIoRElSICpkaXIpOworaW50IGNsb3NlZGlyKERJUiAqZGlyKTsKKworLyogZ2V0Y3dkLmMgKi8KK2NoYXIgKmNvcmVfZ2V0Y3dkKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworCisvKgorICogR2VuZXJpYyBmdW5jdGlvbnMgdGhhdCBmaWxlc3lzdGVtIGRyaXZlcnMgbWF5IGNob29zZSB0byB1c2UKKyAqLworCisvKiBjaGRpci5jICovCitpbnQgZ2VuZXJpY19jaGRpcl9zdGFydCh2b2lkKTsKKworLyogbWFuZ2xlLmMgKi8KK3ZvaWQgZ2VuZXJpY19tYW5nbGVfbmFtZShjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKy8qIGxvYWRjb25maWcuYyAqLworaW50IHNlYXJjaF9kaXJzKHN0cnVjdCBjb20zMl9maWxlZGF0YSAqZmlsZWRhdGEsCisJCWNvbnN0IGNoYXIgKnNlYXJjaF9kaXJlY3RvcmVzW10sIGNvbnN0IGNoYXIgKmZpbGVuYW1lc1tdLAorCQljaGFyICpyZWFsbmFtZSk7CitpbnQgZ2VuZXJpY19vcGVuX2NvbmZpZyhzdHJ1Y3QgY29tMzJfZmlsZWRhdGEgKmZpbGVkYXRhKTsKKworLyogY2xvc2UuYyAqLwordm9pZCBnZW5lcmljX2Nsb3NlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpOworCisvKiBnZXRmc3NlYy5jICovCit1aW50MzJfdCBnZW5lcmljX2dldGZzc2VjKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCisJCQkgIGludCBzZWN0b3JzLCBib29sICpoYXZlX21vcmUpOworCisvKiBub25leHRleHRlbnQuYyAqLworaW50IG5vX25leHRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqLCB1aW50MzJfdCk7CisKKyNlbmRpZiAvKiBGU19IICovCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZ3JhcGhpY3MuaCBiL2NvcmUvaW5jbHVkZS9ncmFwaGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYjQ0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2luY2x1ZGUvZ3JhcGhpY3MuaApAQCAtMCwwICsxLDYyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMiBQYXVsbyBBbGNhbnRhcmEgPHBjYWNqckB6eXRvci5jb20+CisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgR1JBUEhJQ1NfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImZzLmgiCisKKyNpZmRlZiBJU19TWVNMSU5VWAorI2RlZmluZSBWR0FfRklMRV9CVUZfU0laRQkoRklMRU5BTUVfTUFYICsgMikKKyNlbHNlCisjZGVmaW5lIFZHQV9GSUxFX0JVRl9TSVpFCUZJTEVOQU1FX01BWAorI2VuZGlmCisKK2V4dGVybiB1aW50OF90IFVzaW5nVkdBOworZXh0ZXJuIHVpbnQxNl90IFZHQVBvczsKK2V4dGVybiB1aW50MTZfdCAqVkdBRmlsZVB0cjsKK2V4dGVybiBjaGFyIFZHQUZpbGVCdWZbVkdBX0ZJTEVfQlVGX1NJWkVdOworZXh0ZXJuIGNoYXIgVkdBRmlsZU1CdWZbXTsKK2V4dGVybiB1aW50MTZfdCBWR0FGb250U2l6ZTsKKworZXh0ZXJuIHVpbnQ4X3QgVXNlckZvbnQ7CisKK2V4dGVybiBjaGFyIGZvbnRidWZbODE5Ml07CisKK2V4dGVybiB2b2lkIHZnYWRpc3BsYXlmaWxlKEZJTEUgKl9mZCk7CitleHRlcm4gdm9pZCB1c2luZ192Z2EodWludDhfdCB2Z2EsIHVpbnQxNl90IHBpeF9jb2xzLCB1aW50MTZfdCBwaXhfcm93cyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncmFwaGljc191c2luZ192Z2EodWludDhfdCB2Z2EsIHVpbnQxNl90IHBpeF9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaXhfcm93cykKK3sKKyAgICB1c2luZ192Z2EodmdhLCBwaXhfY29scywgcGl4X3Jvd3MpOworfQorCisjZW5kaWYgLyogR1JBUEhJQ1NfSF8gKi8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9rYWJvb20uaCBiL2NvcmUvaW5jbHVkZS9rYWJvb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc2M2JlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9pbmNsdWRlL2thYm9vbS5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgS0FCT09NX0gKKyNkZWZpbmUgS0FCT09NX0gKKworLyoKKyAqIERlYXRoISAgVGhlIG1hY3JvIHRyaWNrIGlzIHRvIGF2b2lkIHN5bWJvbCBjb25mbGljdCB3aXRoCisgKiB0aGUgcmVhbC1tb2RlIHN5bWJvbCBrYWJvb20uCisgKi8KK19fbm9yZXR1cm4gX2thYm9vbSh2b2lkKTsKKyNkZWZpbmUga2Fib29tKCkgX2thYm9vbSgpCisKKyNlbmRpZiAvKiBLQUJPT01fSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2xvY2FsYm9vdC5oIGIvY29yZS9pbmNsdWRlL2xvY2FsYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjc5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2luY2x1ZGUvbG9jYWxib290LmgKQEAgLTAsMCArMSwzMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTIgUGF1bG8gQWxjYW50YXJhIDxwY2FjanJAenl0b3IuY29tPgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExPQ0FMQk9PVF9IXworI2RlZmluZSBMT0NBTEJPT1RfSF8KKworZXh0ZXJuIHZvaWQgbG9jYWxfYm9vdChpbnQxNl90IGF4KTsKKworI2VuZGlmIC8qIExPQ0FMQk9PVF9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL21ib3guaCBiL2NvcmUvaW5jbHVkZS9tYm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlYzI2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW5jbHVkZS9tYm94LmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIG1ib3guaAorICoKKyAqIFNpbXBsZSB0aHJlYWQgbWFpbGJveCBpbnRlcmZhY2UKKyAqLworCisjaWZuZGVmIF9NQk9YX0gKKyNkZWZpbmUgX01CT1hfSAorCisjaW5jbHVkZSAidGhyZWFkLmgiCisKKy8qCisgKiBJZiBhIG1haWxib3ggaXMgYWxsb2NhdGVkIHN0YXRpY2FsbHkgKGFzIGEgc3RydWN0IG1haWxib3gpLCB0aGlzCisgKiBpcyB0aGUgbnVtYmVyIG9mIHNsb3RzIGl0IGdldHMuCisgKi8KKyNkZWZpbmUgTUFJTEJPWF9TVEFUSUNfU0laRQk1MTIKKworc3RydWN0IG1haWxib3ggeworICAgIHN0cnVjdCBzZW1hcGhvcmUgcHJvZF9zZW07CS8qIFByb2R1Y2VyIHNlbWFwaG9yZSAoZW1wdHkgc2xvdHMpICovCisgICAgc3RydWN0IHNlbWFwaG9yZSBjb25zX3NlbTsJLyogQ29uc3VtZXIgc2VtYXBob3JlIChkYXRhIHNsb3RzKSAqLworICAgIHN0cnVjdCBzZW1hcGhvcmUgaGVhZF9zZW07CS8qIEhlYWQgcG9pbnRlciBzZW1hcGhvcmUgKi8KKyAgICBzdHJ1Y3Qgc2VtYXBob3JlIHRhaWxfc2VtOwkvKiBUYWlsIHBvaW50ZXIgc2VtYXBob3JlICovCisgICAgdm9pZCAqKndyYXA7CQkvKiBXaGVyZSBwb2ludGVycyB3cmFwICovCisgICAgdm9pZCAqKmhlYWQ7CQkvKiBIZWFkIHBvaW50ZXIgKi8KKyAgICB2b2lkICoqdGFpbDsJCS8qIFRhaWwgcG9pbnRlciAqLworCisgICAgdm9pZCAqZGF0YVtNQUlMQk9YX1NUQVRJQ19TSVpFXTsgLyogRGF0YSBhcnJheSAqLworfTsKKworLyogVGhlIG51bWJlciBvZiBieXRlcyBmb3IgYW4gbWFpbGJveCBvZiBzaXplIHMgKi8KKyNkZWZpbmUgTUJPWF9CWVRFUyhzKSAoc2l6ZW9mKHN0cnVjdCBtYWlsYm94KSArIFwKKwkJICAgICAgICgocyktTUFJTEJPWF9TVEFUSUNfU0laRSkqc2l6ZW9mKHZvaWQgKikpCisKK3ZvaWQgbWJveF9pbml0KHN0cnVjdCBtYWlsYm94ICptYm94LCBzaXplX3Qgc2l6ZSk7CitpbnQgbWJveF9wb3N0KHN0cnVjdCBtYWlsYm94ICptYm94LCB2b2lkICptc2csIG1zdGltZV90IHRpbWVvdXQpOworbXN0aW1lX3QgbWJveF9mZXRjaChzdHJ1Y3QgbWFpbGJveCAqbWJveCwgdm9pZCAqKm1zZywgbXN0aW1lX3QgdGltZW91dCk7CisKKy8qCisgKiBUaGlzIG1hcmtzIGEgbWFpbGJveCBvYmplY3QgYXMgdW51c2FibGU7IGl0IHdpbGwgcmVtYWluIHVudXNhYmxlCisgKiB1bnRpbCBzZW1faW5pdCgpIGlzIGNhbGxlZCBvbiBpdCBhZ2Fpbi4gIFRoaXMgRE9FUyBOT1QgY2xlYXIgdGhlCisgKiBsaXN0IG9mIGJsb2NrZWQgcHJvY2Vzc2VzIG9uIHRoaXMgbWFpbGJveCEKKyAqCisgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG1hcmsgdGhlIG1haWxib3ggaW52YWxpZCBieSB6ZXJvaW5nIGl0cworICogbWVtb3J5IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1ib3hfc2V0X2ludmFsaWQoc3RydWN0IG1haWxib3ggKm1ib3gpCit7CisgICAgaWYgKCEhbWJveCkKKwlzZW1fc2V0X2ludmFsaWQoJm1ib3gtPnByb2Rfc2VtKTsKK30KKworLyoKKyAqIEFzayBpZiBhIG1haWxib3ggb2JqZWN0IGhhcyBiZWVuIGluaXRpYWxpemVkLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbWJveF9pc192YWxpZChzdHJ1Y3QgbWFpbGJveCAqbWJveCkKK3sKKyAgICByZXR1cm4gKCghIW1ib3gpICYmIHNlbV9pc192YWxpZCgmbWJveC0+cHJvZF9zZW0pKTsKK30KKworI2VuZGlmIC8qIF9NQk9YX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9uZXQuaCBiL2NvcmUvaW5jbHVkZS9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjQxOTFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9pbmNsdWRlL25ldC5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgX05FVF9ICisjZGVmaW5lIF9ORVRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit2b2lkIG5ldF9jb3JlX2luaXQodm9pZCk7Cit2b2lkIG5ldF9wYXJzZV9kaGNwKHZvaWQpOworCitzdHJ1Y3QgcHhlX3B2dF9pbm9kZTsKKworaW50IGNvcmVfdWRwX29wZW4oc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCk7Cit2b2lkIGNvcmVfdWRwX2Nsb3NlKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQpOworCit2b2lkIGNvcmVfdWRwX2Nvbm5lY3Qoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwKKwkJICAgICAgdWludDMyX3QgaXAsIHVpbnQxNl90IHBvcnQpOwordm9pZCBjb3JlX3VkcF9kaXNjb25uZWN0KHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQpOworCitpbnQgY29yZV91ZHBfcmVjdihzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0LCB2b2lkICpidWYsIHVpbnQxNl90ICpidWZfbGVuLAorCQkgIHVpbnQzMl90ICpzcmNfaXAsIHVpbnQxNl90ICpzcmNfcG9ydCk7CisKK3ZvaWQgY29yZV91ZHBfc2VuZChzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0LAorCQkgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKKwordm9pZCBjb3JlX3VkcF9zZW5kdG8oc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwKKwkJICAgICB1aW50MzJfdCBpcCwgdWludDE2X3QgcG9ydCk7CisKK3ZvaWQgcHJvYmVfdW5kaSh2b2lkKTsKK3ZvaWQgcHhlX2luaXRfaXNyKHZvaWQpOworCitzdHJ1Y3QgaW5vZGU7CisKK2ludCBjb3JlX3RjcF9vcGVuKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQpOworaW50IGNvcmVfdGNwX2Nvbm5lY3Qoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgdWludDMyX3QgaXAsIHVpbnQxNl90IHBvcnQpOworYm9vbCBjb3JlX3RjcF9pc19jb25uZWN0ZWQoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCk7CitpbnQgY29yZV90Y3Bfd3JpdGUoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJICAgc2l6ZV90IGxlbiwgYm9vbCBjb3B5KTsKK3ZvaWQgY29yZV90Y3BfY2xvc2VfZmlsZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgY29yZV90Y3BfZmlsbF9idWZmZXIoc3RydWN0IGlub2RlICppbm9kZSk7CisKKyNlbmRpZiAvKiBfTkVUX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9wbWFwaS5oIGIvY29yZS9pbmNsdWRlL3BtYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkMmU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW5jbHVkZS9wbWFwaS5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBQTUFQSV9ICisjZGVmaW5lIFBNQVBJX0gKKworI2luY2x1ZGUgPHN5c2xpbnV4L3BtYXBpLmg+CisKK3NpemVfdCBwbWFwaV9yZWFkX2ZpbGUodWludDE2X3QgKiwgdm9pZCAqLCBzaXplX3QpOworCisjZW5kaWYgLyogUE1BUElfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL3RocmVhZC5oIGIvY29yZS9pbmNsdWRlL3RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzRhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2luY2x1ZGUvdGhyZWFkLmgKQEAgLTAsMCArMSwxMTYgQEAKKyNpZm5kZWYgX1RIUkVBRF9ICisjZGVmaW5lIF9USFJFQURfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8dGltZXIuaD4KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisKKy8qIFRoZSBpZGxlIHRocmVhZCBydW5zIGF0IHRoaXMgcHJpb3JpdHkgKi8KKyNkZWZpbmUgSURMRV9USFJFQURfUFJJT1JJVFkJSU5UX01BWAorCisvKiBUaGlzIHByaW9yaXR5IHNob3VsZCBub3JtYWxseSBiZSB1c2VkIGZvciBoYXJkd2FyZS1wb2xsaW5nIHRocmVhZHMgKi8KKyNkZWZpbmUgUE9MTF9USFJFQURfUFJJT1JJVFkJKElOVF9NQVgtMSkKKworc3RydWN0IHNlbWFwaG9yZTsKKworc3RydWN0IHRocmVhZF9saXN0IHsKKyAgICBzdHJ1Y3QgdGhyZWFkX2xpc3QgKm5leHQsICpwcmV2OworfTsKKworLyoKKyAqIFN0YWNrIGZyYW1lIHVzZWQgYnkgX19zd2l0Y2hfdG8sIHNlZSB0aHJlYWRfYXNtLlMKKyAqLworc3RydWN0IHRocmVhZF9zdGFjayB7CisgICAgaW50IGVycm5vOworICAgIHVpbnQxNl90IHJtc3AsIHJtc3M7CisgICAgdWludDMyX3QgZWRpLCBlc2ksIGVicCwgZWJ4OworICAgIHZvaWQgKCplaXApKHZvaWQpOworfTsKKworc3RydWN0IHRocmVhZF9ibG9jayB7CisgICAgc3RydWN0IHRocmVhZF9saXN0IGxpc3Q7CisgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkOworICAgIHN0cnVjdCBzZW1hcGhvcmUgKnNlbWFwaG9yZTsKKyAgICBtc3RpbWVfdCBibG9ja190aW1lOworICAgIG1zdGltZV90IHRpbWVvdXQ7CisgICAgYm9vbCB0aW1lZF9vdXQ7Cit9OworCisjZGVmaW5lIFRIUkVBRF9NQUdJQyAweDM1NjhlYjdkCisKK3N0cnVjdCB0aHJlYWQgeworICAgIHN0cnVjdCB0aHJlYWRfc3RhY2sgKmVzcDsJLyogTXVzdCBiZSBmaXJzdDsgc3RhY2sgcG9pbnRlciAqLworICAgIHVuc2lnbmVkIGludCB0aHJlYWRfbWFnaWM7CisgICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIE5hbWUgKGZvciBkZWJ1Z2dpbmcpICovCisgICAgc3RydWN0IHRocmVhZF9saXN0ICBsaXN0OworICAgIHN0cnVjdCB0aHJlYWRfYmxvY2sgKmJsb2NrZWQ7CisgICAgdm9pZCAqc3RhY2ssICpybXN0YWNrOwkvKiBTdGFja3MsIGlmZiBhbGxvY2F0ZWQgYnkgbWFsbG9jL2xtYWxsb2MgKi8KKyAgICB2b2lkICpwdnQ7IAkJCS8qIEZvciB0aGUgYmVuZWZpdCBvZiBsd0lQICovCisgICAgaW50IHByaW87Cit9OworCitleHRlcm4gdm9pZCAoKnNjaGVkX2hvb2tfZnVuYykodm9pZCk7CisKK3ZvaWQgX190aHJlYWRfcHJvY2Vzc190aW1lb3V0cyh2b2lkKTsKK3ZvaWQgX19zY2hlZHVsZSh2b2lkKTsKK3ZvaWQgX19zd2l0Y2hfdG8oc3RydWN0IHRocmVhZCAqKTsKK3ZvaWQgdGhyZWFkX3lpZWxkKHZvaWQpOworCitleHRlcm4gc3RydWN0IHRocmVhZCAqX19jdXJyZW50Oworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGhyZWFkICpjdXJyZW50KHZvaWQpCit7CisgICAgcmV0dXJuIF9fY3VycmVudDsKK30KKworc3RydWN0IHNlbWFwaG9yZSB7CisgICAgaW50IGNvdW50OworICAgIHN0cnVjdCB0aHJlYWRfbGlzdCBsaXN0OworfTsKKworI2RlZmluZSBERUNMQVJFX0lOSVRfU0VNQVBIT1JFKHNlbSwgY250KQlcCisgICAgc3RydWN0IHNlbWFwaG9yZSBzZW0gPSB7CQkJXAorCS5jb3VudCA9IChjbnQpLAkJCQlcCisJLmxpc3QgPQl7CQkJCVwKKyAgICAgICAgICAgIC5uZXh0ID0gJnNlbS5saXN0LAkJCVwKKyAgICAgICAgICAgIC5wcmV2ID0gJnNlbS5saXN0ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQkJCQkJXAorICAgIH0KKworbXN0aW1lX3Qgc2VtX2Rvd24oc3RydWN0IHNlbWFwaG9yZSAqLCBtc3RpbWVfdCk7Cit2b2lkIHNlbV91cChzdHJ1Y3Qgc2VtYXBob3JlICopOwordm9pZCBzZW1faW5pdChzdHJ1Y3Qgc2VtYXBob3JlICosIGludCk7CisKKy8qCisgKiBUaGlzIG1hcmtzIGEgc2VtYXBob3JlIG9iamVjdCBhcyB1bnVzYWJsZTsgaXQgd2lsbCByZW1haW4gdW51c2FibGUKKyAqIHVudGlsIHNlbV9pbml0KCkgaXMgY2FsbGVkIG9uIGl0IGFnYWluLiAgVGhpcyBET0VTIE5PVCBjbGVhciB0aGUKKyAqIGxpc3Qgb2YgYmxvY2tlZCBwcm9jZXNzZXMgb24gdGhpcyBzZW1hcGhvcmUhCisgKgorICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBtYXJrIHRoZSBzZW1hcGhvcmUgaW52YWxpZCBieSB6ZXJvaW5nIGl0cworICogbWVtb3J5IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNlbV9zZXRfaW52YWxpZChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCit7CisgICAgaWYgKCEhc2VtKQorCXNlbS0+bGlzdC5uZXh0ID0gTlVMTDsKK30KKworLyoKKyAqIEFzayBpZiBhIHNlbWFwaG9yZSBvYmplY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBzZW1faXNfdmFsaWQoc3RydWN0IHNlbWFwaG9yZSAqc2VtKQoreworICAgIHJldHVybiAoKCEhc2VtKSAmJiAoISFzZW0tPmxpc3QubmV4dCkpOworfQorCitzdHJ1Y3QgdGhyZWFkICpzdGFydF90aHJlYWQoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHN0YWNrX3NpemUsIGludCBwcmlvLAorCQkJICAgIHZvaWQgKCpzdGFydF9mdW5jKSh2b2lkICopLCB2b2lkICpmdW5jX2FyZyk7Cit2b2lkIF9fZXhpdF90aHJlYWQodm9pZCk7Cit2b2lkIGtpbGxfdGhyZWFkKHN0cnVjdCB0aHJlYWQgKik7CisKK3ZvaWQgc3RhcnRfaWRsZV90aHJlYWQodm9pZCk7Cit2b2lkIHRlc3RfdGhyZWFkKHZvaWQpOworCisjZW5kaWYgLyogX1RIUkVBRF9IICovCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvdGltZXIuaCBiL2NvcmUvaW5jbHVkZS90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjZiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2luY2x1ZGUvdGltZXIuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIFRJTUVSX0gKKyNkZWZpbmUgVElNRVJfSAorCisvKgorICogQmFzaWMgdGltZXIgZnVuY3Rpb24uLi4KKyAqLwordHlwZWRlZiB1aW50MzJfdCBqaWZmaWVzX3Q7CitleHRlcm4gdm9sYXRpbGUgamlmZmllc190IF9famlmZmllcywgX19tc190aW1lcjsKK3N0YXRpYyBpbmxpbmUgamlmZmllc190IGppZmZpZXModm9pZCkKK3sKKyAgICByZXR1cm4gX19qaWZmaWVzOworfQorCit0eXBlZGVmIHVpbnQzMl90IG1zdGltZV90OwordHlwZWRlZiBpbnQzMl90ICBtc3RpbWVkaWZmX3Q7CitzdGF0aWMgaW5saW5lIG1zdGltZV90IG1zX3RpbWVyKHZvaWQpCit7CisgICAgcmV0dXJuIF9fbXNfdGltZXI7Cit9CisKKyNlbmRpZiAvKiBUSU1FUl9IICovCmRpZmYgLS1naXQgYS9jb3JlL2luaXQuYyBiL2NvcmUvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTA1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2luaXQuYwpAQCAtMCwwICsxLDEyIEBACisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3lzL2lvLmg+CisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxiaW9zLmg+CisjaW5jbHVkZSA8c3lzbGludXgvbWVtc2Nhbi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L2Zpcm13YXJlLmg+CisKK3ZvaWQgaW5pdCh2b2lkKQoreworCWZpcm13YXJlLT5pbml0KCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2luaXQuaW5jIGIvY29yZS9pbml0LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNiZGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9pbml0LmluYwpAQCAtMCwwICsxLDc3IEBACis7IC0qLSBmdW5kYW1lbnRhbCAtKi0KKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7Cis7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorOyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7Cis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsKKzsgaW5pdC5pbmMKKzsKKzsgQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgKGlubGluZSkKKzsKKworCQlzZWN0aW9uIC50ZXh0MTYKK2NvbW1vbl9pbml0OgorCQk7IEluaXRpYWxpemUgUE0gaW52b2NhdGlvbiBmcmFtZXdvcmsKKwkJY2FsbCBwbV9pbml0CisKKyVpZiBJU19QWEVMSU5VWAorCQk7IFNhdmUgZGVyaXZhdGl2ZS1zcGVjaWZpYyBkYXRhCisJCXBtX2NhbGwgcG1fc2F2ZV9kYXRhCislZW5kaWYKKworCQk7IERlY29tcHJlc3MgUE0gY29kZSB0byBpdHMgdGFyZ2V0IGxvY2F0aW9uCisJCXBtX2NhbGwgcG1fZGVjb21wcmVzcworCQljbXAgZWF4LF9fcG1fY29kZV9sZW4KKwkJam5lIGthYm9vbQorCisJCWV4dGVybiBzeXNsaW51eF9yZWdpc3Rlcl9iaW9zLCBpbml0CisKKwkJcG1fY2FsbCBzeXNsaW51eF9yZWdpc3Rlcl9iaW9zCisJCXBtX2NhbGwgaW5pdAorCis7Cis7IFRoZSBjb2RlIHRvIGRlY29tcHJlc3MgdGhlIFBNIGNvZGUgYW5kIGluaXRpYWxpemUgb3RoZXIgc2VnbWVudHMuCis7CisJCWV4dGVybiBfbHpvMXhfZGVjb21wcmVzc19hc21fZmFzdF9zYWZlCisKKwkJc2VjdGlvbiAudGV4dG5yCisJCWJpdHMgMzIKK3BtX2RlY29tcHJlc3M6CisJCXB1c2ggX19wbV9jb2RlX2xlbiArIDE2CQk7IFNwYWNlIGZvciBkZWNvbXByZXNzZWQgc2l6ZQorCQlwdXNoIGVzcAkJCTsgUG9pbnRlciB0byBwcmV2aW91cyB3b3JkCisJCXB1c2ggX19wbV9jb2RlX3N0YXJ0CQk7IFRhcmdldCBhZGRyZXNzCisJCXB1c2ggZHdvcmQgW2x6b19kYXRhX3NpemVdCTsgQ29tcHJlc3NlZCBzaXplCisJCXB1c2ggZHdvcmQgX19wbV9jb2RlX2xtYQorCQljYWxsIF9sem8xeF9kZWNvbXByZXNzX2FzbV9mYXN0X3NhZmUKKwkJYWRkIGVzcCwxNgorCQlwb3AgUk1fRUFYCQkJOyBEZWNvbXByZXNzZWQgc2l6ZQorCisJCTsgWmVybyBic3Mgc2VjdGlvbnMgKGJ1dCBub3QgLmVhcmx5YnNzLCBzaW5jZSBpdCBtYXkKKwkJOyBjb250YWluIGFscmVhZHktbGl2ZSBkYXRhLikKKwkJeG9yIGVheCxlYXgKKwkJbW92IGVkaSxfX2Jzc19zdGFydAorCQltb3YgZWN4LF9fYnNzX2R3b3JkcworCQlyZXAgc3Rvc2QKKwkJbW92IGVkaSxfX2JzczE2X3N0YXJ0CisJCW1vdiBlY3gsX19ic3MxNl9kd29yZHMKKwkJcmVwIHN0b3NkCisJCW1vdiBlZGksX19oaWdoX2NsZWFyX3N0YXJ0CTsgLnVpYnNzLCAubG93bWVtCisJCW1vdiBlY3gsX19oaWdoX2NsZWFyX2R3b3JkcworCQlyZXAgc3Rvc2QKKworCQlyZXQKKworCQlzZWN0aW9uIC5kYXRhMTYKK2x6b19kYXRhX3NpemUJZGQgMAkJCQk7IGZpbGxlZCBpbiBieSBjb21wcmVzc29yCisKKwkJc2VjdGlvbiAudGV4dDE2CisJCWJpdHMgMTYKZGlmZiAtLWdpdCBhL2NvcmUvaW8uaW5jIGIvY29yZS9pby5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2MTM0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW8uaW5jCkBAIC0wLDAgKzEsMzUgQEAKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OworOzsgICBDb3B5cmlnaHQgMTk5NC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOzsgICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7ICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCis7OyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOzsKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzs7Cis7OyBpby5pbmMKKzs7Cis7OyBJL08gcmVsYXRlZCBtYWNyb3MKKzs7CisKKyVpZm5kZWYgX0lPX0lOQworJWRlZmluZSBfSU9fSU5DCisKKyVkZWZpbmUgSU9fREVMQVlfUE9SVAk4MGgJCTsgSW52YWxpZCBwb3J0ICh3ZSBob3BlISkKKworJW1hY3JvIGlvX2RlbGF5IDAubm9saXN0CisJCW91dCBJT19ERUxBWV9QT1JULGFsCisJCW91dCBJT19ERUxBWV9QT1JULGFsCislZW5kbWFjcm8KKworJW1hY3JvIHNsb3dfb3V0IDIubm9saXN0CisJCW91dCAlMSwlMgorCQlpb19kZWxheQorJWVuZG1hY3JvCisKKyVlbmRpZiA7IF9JT19JTkMKZGlmZiAtLWdpdCBhL2NvcmUvaXNvbGludXgtYy5jIGIvY29yZS9pc29saW51eC1jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxNzNlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaXNvbGludXgtYy5jCkBAIC0wLDAgKzEsMjIgQEAKKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGZzLmg+CisKK2V4dGVybiB1aW50MzJfdCBPcmlnRVNESTsKK2V4dGVybiBjb25zdCB1aW50NjRfdCBIaWRkZW47CitleHRlcm4gdWludDE2X3QgQklPU1R5cGU7CitleHRlcm4gdWludDE2X3QgYmlvc19jZHJvbTsKK2V4dGVybiB1aW50OF90IERyaXZlTnVtYmVyOworZXh0ZXJuIGNvbnN0IHZvaWQgKnNwZWNfcGFja2V0OworCitfX2V4cG9ydCB2b2lkIGdldF9kZXJpdmF0aXZlX2luZm8odW5pb24gc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvICpkaSkKK3sKKwlkaS0+aXNvLmZpbGVzeXN0ZW0gPSBTWVNMSU5VWF9GU19JU09MSU5VWDsKKwlkaS0+aXNvLnNlY3Rvcl9zaGlmdCA9IFNlY3RvclNoaWZ0OworCWRpLT5pc28uZHJpdmVfbnVtYmVyID0gRHJpdmVOdW1iZXI7CisJZGktPmlzby5jZF9tb2RlID0gKChCSU9TVHlwZSAtIGJpb3NfY2Ryb20pID4+IDIpOworCisJZGktPmlzby5zcGVjX3BhY2tldCA9ICZzcGVjX3BhY2tldDsKKwlkaS0+aXNvLmVzZGlfcHRyID0gJk9yaWdFU0RJOworCWRpLT5pc28ucGFydG9mZnNldCA9ICZIaWRkZW47Cit9CmRpZmYgLS1naXQgYS9jb3JlL2lzb2xpbnV4LWRlYnVnLmFzbSBiL2NvcmUvaXNvbGludXgtZGVidWcuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzRiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2lzb2xpbnV4LWRlYnVnLmFzbQpAQCAtMCwwICsxLDIgQEAKKyVkZWZpbmUgREVCVUdfTUVTU0FHRVMgMQorJWluY2x1ZGUgImlzb2xpbnV4LmFzbSIKZGlmZiAtLWdpdCBhL2NvcmUvaXNvbGludXguYXNtIGIvY29yZS9pc29saW51eC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkOWZlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaXNvbGludXguYXNtCkBAIC0wLDAgKzEsMTIzMiBAQAorOyAtKi0gZnVuZGFtZW50YWwgLSotIChhc20tbW9kZSBzdWNrcykKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOworOyAgaXNvbGludXguYXNtCis7Cis7ICBBIHByb2dyYW0gdG8gYm9vdCBMaW51eCBrZXJuZWxzIG9mZiBhIENELVJPTSB1c2luZyB0aGUgRWwgVG9yaXRvCis7ICBib290IHN0YW5kYXJkIGluICJubyBlbXVsYXRpb24iIG1vZGUsIG1ha2luZyB0aGUgZW50aXJlIGZpbGVzeXN0ZW0KKzsgIGF2YWlsYWJsZS4gIEl0IGlzIGJhc2VkIG9uIHRoZSBTWVNMSU5VWCBib290IGxvYWRlciBmb3IgTVMtRE9TCis7ICBmbG9wcGllcy4KKzsKKzsgICBDb3B5cmlnaHQgMTk5NC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7Cis7ICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzsgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorOyAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzsgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOworOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVkZWZpbmUgSVNfSVNPTElOVVggMQorJWluY2x1ZGUgImhlYWQuaW5jIgorCis7Cis7IFNvbWUgc2VtaS1jb25maWd1cmFibGUgY29uc3RhbnRzLi4uIGNoYW5nZSBvbiB5b3VyIG93biByaXNrLgorOworbXlfaWQJCWVxdSBpc29saW51eF9pZAorTlVMTEZJTEUJZXF1IDAJCQk7IFplcm8gYnl0ZSA9PSBudWxsIGZpbGUgbmFtZQorTlVMTE9GRlNFVAllcXUgMAkJCTsgUG9zaXRpb24gaW4gd2hpY2ggdG8gbG9vaworcmV0cnlfY291bnQJZXF1IDYJCQk7IEhvdyBwYXRpZW50IGFyZSB3ZSB3aXRoIHRoZSBCSU9TPworJWFzc2lnbiBISUdITUVNX1NMT1AgMTI4KjEwMjQJCTsgQXZvaWQgdGhpcyBtdWNoIG1lbW9yeSBuZWFyIHRoZSB0b3AKK1NFQ1RPUl9TSElGVAllcXUgMTEJCQk7IDIwNDggYnl0ZXMvc2VjdG9yIChFbCBUb3JpdG8gcmVxdWlyZW1lbnQpCitTRUNUT1JfU0laRQllcXUgKDEgPDwgU0VDVE9SX1NISUZUKQorCitST09UX0RJUl9XT1JECWVxdSAweDAwMkYKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgICBCRUdJTiBDT0RFCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Cis7IE1lbW9yeSBiZWxvdyB0aGlzIHBvaW50IGlzIHJlc2VydmVkIGZvciB0aGUgQklPUyBhbmQgdGhlIE1CUgorOworCQlzZWN0aW9uIC5lYXJseWJzcworCQlnbG9iYWwgdHJhY2tidWYKK3RyYWNrYnVmc2l6ZQllcXUgODE5MgordHJhY2tidWYJcmVzYiB0cmFja2J1ZnNpemUJOyBUcmFjayBidWZmZXIgZ29lcyBoZXJlCis7CQllbmRzIGF0IDI4MDBoCisKKwkJOyBTb21lIG9mIHRoZXNlIGFyZSB0b3VjaGVkIGJlZm9yZSB0aGUgd2hvbGUgaW1hZ2UKKwkJOyBpcyBsb2FkZWQuICBETyBOT1QgbW92ZSB0aGlzIHRvIC5ic3MxNi8udWlic3MuCisJCXNlY3Rpb24gLmVhcmx5YnNzCisJCWdsb2JhbCBCSU9TTmFtZQorCQlhbGlnbmIgNAorRmlyc3RTZWNTdW0JcmVzZCAxCQkJOyBDaGVja3N1bSBvZiBieXRlcyA2NC0yMDQ4CitJbWFnZUR3b3JkcwlyZXNkIDEJCQk7IGlzb2xpbnV4LmJpbiBzaXplLCBkd29yZHMKK0luaXRTdGFjawlyZXNkIDEJCQk7IEluaXRpYWwgc3RhY2sgcG9pbnRlciAoU1M6U1ApCitEaXNrU3lzCQlyZXN3IDEJCQk7IExhc3QgSU5UIDEzaCBjYWxsCitJbWFnZVNlY3RvcnMJcmVzdyAxCQkJOyBpc29saW51eC5iaW4gc2l6ZSwgc2VjdG9ycworOyBUaGVzZSBmb2xsb3dpbmcgdHdvIGFyZSBhY2Nlc3NlZCBhcyBhIHNpbmdsZSBkd29yZC4uLgorR2V0bGluc2VjUHRyCXJlc3cgMQkJCTsgVGhlIHNlY3Rvci1yZWFkIHBvaW50ZXIKK0JJT1NOYW1lCXJlc3cgMQkJCTsgRGlzcGxheSBzdHJpbmcgZm9yIEJJT1MgdHlwZQorJWRlZmluZSBIQVZFX0JJT1NOQU1FIDEKKwkJZ2xvYmFsIEJJT1NUeXBlCitCSU9TVHlwZQlyZXN3IDEKK0Rpc2tFcnJvcglyZXNiIDEJCQk7IEVycm9yIGNvZGUgZm9yIGRpc2sgSS9PCisJCWdsb2JhbCBEcml2ZU51bWJlcgorRHJpdmVOdW1iZXIJcmVzYiAxCQkJOyBDRC1ST00gQklPUyBkcml2ZSBudW1iZXIKK0lTT0ZsYWdzCXJlc2IgMQkJCTsgRmxhZ3MgZm9yIElTTyBkaXJlY3Rvcnkgc2VhcmNoCitSZXRyeUNvdW50ICAgICAgcmVzYiAxCQkJOyBVc2VkIGZvciBkaXNrIGFjY2VzcyByZXRyaWVzCisKKwkJYWxpZ25iIDgKKwkJZ2xvYmFsIEhpZGRlbgorSGlkZGVuCQlyZXNxIDEJCQk7IFVzZWQgaW4gaHlicmlkIG1vZGUKK2JzU2VjUGVyVHJhY2sJcmVzdyAxCQkJOyBVc2VkIGluIGh5YnJpZCBtb2RlCitic0hlYWRzCQlyZXN3IDEJCQk7IFVzZWQgaW4gaHlicmlkIG1vZGUKKworCis7Cis7IEVsIFRvcml0byBzcGVjIHBhY2tldAorOworCisJCWFsaWduYiA4Citfc3BlY19zdGFydAllcXUgJAorCQlnbG9iYWwgc3BlY19wYWNrZXQKK3NwZWNfcGFja2V0OglyZXNiIDEJCQkJOyBTaXplIG9mIHBhY2tldAorc3BfbWVkaWE6CXJlc2IgMQkJCQk7IE1lZGlhIHR5cGUKK3NwX2RyaXZlOglyZXNiIDEJCQkJOyBEcml2ZSBudW1iZXIKK3NwX2NvbnRyb2xsZXI6CXJlc2IgMQkJCQk7IENvbnRyb2xsZXIgaW5kZXgKK3NwX2xiYToJCXJlc2QgMQkJCQk7IExCQSBmb3IgZW11bGF0ZWQgZGlzayBpbWFnZQorc3BfZGV2c3BlYzoJcmVzdyAxCQkJCTsgSURFL1NDU0kgaW5mb3JtYXRpb24KK3NwX2J1ZmZlcjoJcmVzdyAxCQkJCTsgVXNlci1wcm92aWRlZCBidWZmZXIKK3NwX2xvYWRzZWc6CXJlc3cgMQkJCQk7IExvYWQgc2VnbWVudAorc3Bfc2VjdG9yczoJcmVzdyAxCQkJCTsgU2VjdG9yIGNvdW50CitzcF9jaHM6CQlyZXNiIDMJCQkJOyBTaW11bGF0ZWQgQ0hTIGdlb21ldHJ5CitzcF9kdW1teToJcmVzYiAxCQkJCTsgU2NyYXRjaCwgc2FmZSB0byBvdmVyd3JpdGUKKworOworOyBFQklPUyBkcml2ZSBwYXJhbWV0ZXIgcGFja2V0Cis7CisJCWFsaWduYiA4Citkcml2ZV9wYXJhbXM6CXJlc3cgMQkJCQk7IEJ1ZmZlciBzaXplCitkcF9mbGFnczoJcmVzdyAxCQkJCTsgSW5mb3JtYXRpb24gZmxhZ3MKK2RwX2N5bDoJCXJlc2QgMQkJCQk7IFBoeXNpY2FsIGN5bGluZGVycworZHBfaGVhZDoJcmVzZCAxCQkJCTsgUGh5c2ljYWwgaGVhZHMKK2RwX3NlYzoJCXJlc2QgMQkJCQk7IFBoeXNpY2FsIHNlY3RvcnMvdHJhY2sKK2RwX3RvdGFsc2VjOglyZXNkIDIJCQkJOyBUb3RhbCBzZWN0b3JzCitkcF9zZWNzaXplOglyZXN3IDEJCQkJOyBCeXRlcyBwZXIgc2VjdG9yCitkcF9kcHRlOglyZXNkIDEJCQkJOyBEZXZpY2UgUGFyYW1ldGVyIFRhYmxlCitkcF9kcGlfa2V5OglyZXN3IDEJCQkJOyAwQkVERGggaWYgcmVzdCB2YWxpZAorZHBfZHBpX2xlbjoJcmVzYiAxCQkJCTsgRFBJIGxlbgorCQlyZXNiIDEKKwkJcmVzdyAxCitkcF9idXM6CQlyZXNiIDQJCQkJOyBIb3N0IGJ1cyB0eXBlCitkcF9pbnRlcmZhY2U6CXJlc2IgOAkJCQk7IEludGVyZmFjZSB0eXBlCitkYl9pX3BhdGg6CXJlc2QgMgkJCQk7IEludGVyZmFjZSBwYXRoCitkYl9kX3BhdGg6CXJlc2QgMgkJCQk7IERldmljZSBwYXRoCisJCXJlc2IgMQorZGJfZHBpX2NzdW06CXJlc2IgMQkJCQk7IENoZWNrc3VtIGZvciBEUEkgaW5mbworCis7Cis7IEVCSU9TIGRpc2sgYWRkcmVzcyBwYWNrZXQKKzsKKwkJYWxpZ25iIDgKK2RhcGE6CQlyZXN3IDEJCQkJOyBQYWNrZXQgc2l6ZQorLmNvdW50OgkJcmVzdyAxCQkJCTsgQmxvY2sgY291bnQKKy5vZmY6CQlyZXN3IDEJCQkJOyBPZmZzZXQgb2YgYnVmZmVyCisuc2VnOgkJcmVzdyAxCQkJCTsgU2VnbWVudCBvZiBidWZmZXIKKy5sYmE6CQlyZXNkIDIJCQkJOyBMQkEgKExTVywgTVNXKQorCis7Cis7IFNwZWMgcGFja2V0IGZvciBkaXNrIGltYWdlIGVtdWxhdGlvbgorOworCQlhbGlnbmIgOAorZHNwZWNfcGFja2V0OglyZXNiIDEJCQkJOyBTaXplIG9mIHBhY2tldAorZHNwX21lZGlhOglyZXNiIDEJCQkJOyBNZWRpYSB0eXBlCitkc3BfZHJpdmU6CXJlc2IgMQkJCQk7IERyaXZlIG51bWJlcgorZHNwX2NvbnRyb2xsZXI6CXJlc2IgMQkJCQk7IENvbnRyb2xsZXIgaW5kZXgKK2RzcF9sYmE6CXJlc2QgMQkJCQk7IExCQSBmb3IgZW11bGF0ZWQgZGlzayBpbWFnZQorZHNwX2RldnNwZWM6CXJlc3cgMQkJCQk7IElERS9TQ1NJIGluZm9ybWF0aW9uCitkc3BfYnVmZmVyOglyZXN3IDEJCQkJOyBVc2VyLXByb3ZpZGVkIGJ1ZmZlcgorZHNwX2xvYWRzZWc6CXJlc3cgMQkJCQk7IExvYWQgc2VnbWVudAorZHNwX3NlY3RvcnM6CXJlc3cgMQkJCQk7IFNlY3RvciBjb3VudAorZHNwX2NoczoJcmVzYiAzCQkJCTsgU2ltdWxhdGVkIENIUyBnZW9tZXRyeQorZHNwX2R1bW15OglyZXNiIDEJCQkJOyBTY3JhdGNoLCBzYWZlIHRvIG92ZXJ3cml0ZQorCisJCWFsaWduYiA0Citfc3BlY19lbmQJZXF1ICQKK19zcGVjX2xlbgllcXUgX3NwZWNfZW5kIC0gX3NwZWNfc3RhcnQKKworCQlzZWN0aW9uIC5pbml0Cis7OworOzsgUHJpbWFyeSBlbnRyeSBwb2ludC4gIEJlY2F1c2UgQklPU2VzIGFyZSBidWdneSwgd2Ugb25seSBsb2FkIHRoZSBmaXJzdAorOzsgQ0QtUk9NIHNlY3RvciAoMkspIG9mIHRoZSBmaWxlLCBzbyB0aGUgbnVtYmVyIG9uZSBwcmlvcml0eSBpcyBhY3R1YWxseQorOzsgbG9hZGluZyB0aGUgcmVzdC4KKzs7CisJCWdsb2JhbCBTdGFja0J1ZgorU3RhY2tCdWYJZXF1IFNUQUNLX1RPUC00NAk7IDQ0IGJ5dGVzIG5lZWRlZCBmb3IKKwkJCQkJOyB0aGUgYm9vdHNlY3RvciBjaGFpbmxvYWRpbmcKKwkJCQkJOyBjb2RlIQorCQlnbG9iYWwgT3JpZ0VTREkKK09yaWdFU0RJCWVxdSBTdGFja0J1Zi00ICAgICAgICAgIDsgVGhlIGhpZ2ggZHdvcmQgb24gdGhlIHN0YWNrCitTdGFja0hvbWUJZXF1IE9yaWdFU0RJCisKK2Jvb3RzZWMJCWVxdSAkCisKK19zdGFydDoJCTsgRmFyIGp1bXAgbWFrZXMgc3VyZSB3ZSBjYW5vbmljYWxpemUgdGhlIGFkZHJlc3MKKwkJY2xpCisJCWptcCAwOl9zdGFydDEKKwkJdGltZXMgOC0oJC0kJCkgbm9wCQk7IFBhZCB0byBmaWxlIG9mZnNldCA4CisKKwkJOyBUaGlzIHRhYmxlIGhvcGVmdWxseSBnZXRzIGZpbGxlZCBpbiBieSBta2lzb2ZzIHVzaW5nIHRoZQorCQk7IC1ib290LWluZm8tdGFibGUgb3B0aW9uLiAgSWYgbm90LCB0aGUgdmFsdWVzIGluIHRoaXMKKwkJOyB0YWJsZSBhcmUgZGVmYXVsdCB2YWx1ZXMgdGhhdCB3ZSBjYW4gdXNlIHRvIGdldCB1cyB3aGF0CisJCTsgd2UgbmVlZCwgYXQgbGVhc3QgdW5kZXIgYSBjZXJ0YWluIHNldCBvZiBhc3N1bXB0aW9ucy4KKwkJZ2xvYmFsIGlzb19ib290X2luZm8KK2lzb19ib290X2luZm86CitiaV9wdmQ6CQlkZCAxNgkJCQk7IExCQSBvZiBwcmltYXJ5IHZvbHVtZSBkZXNjcmlwdG9yCitiaV9maWxlOglkZCAwCQkJCTsgTEJBIG9mIGJvb3QgZmlsZQorYmlfbGVuZ3RoOglkZCAweGRlYWRiZWVmCQkJOyBMZW5ndGggb2YgYm9vdCBmaWxlCitiaV9jc3VtOglkZCAweGRlYWRiZWVmCQkJOyBDaGVja3N1bSBvZiBib290IGZpbGUKK2JpX3Jlc2VydmVkOgl0aW1lcyAxMCBkZCAweGRlYWRiZWVmCQk7IFJlc2VydmVkCitiaV9lbmQ6CisKKwkJOyBDdXN0b20gZW50cnkgcG9pbnQgZm9yIHRoZSBoeWJyaWQtbW9kZSBkaXNrLgorCQk7IFRoZSBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgaGF2ZSBiZWVuIHB1c2hlZCBvbnRvIHRoZQorCQk7IGVudHJ5IHN0YWNrOgorCQk7CS0gcGFydGl0aW9uIG9mZnNldCAocXdvcmQpCisJCTsJLSBFUworCQk7CS0gREkKKwkJOwktIERYIChpbmNsdWRpbmcgZHJpdmUgbnVtYmVyKQorCQk7CS0gQ0JJT1MgSGVhZHMKKwkJOwktIENCSU9TIFNlY3RvcnMKKwkJOwktIEVCSU9TIGZsYWcKKwkJOyAgICAgICAodG9wIG9mIHN0YWNrKQorCQk7CisJCTsgSWYgd2UgaGFkIGFuIG9sZCBpc29oeWJyaWQsIHRoZSBwYXJ0aXRpb24gb2Zmc2V0IHdpbGwKKwkJOyBiZSBtaXNzaW5nOyB3ZSBjYW4gY2hlY2sgZm9yIHRoYXQgd2l0aCBzcCA+PSAweDdjMDAuCisJCTsgU2VyaW91cyBoYWNrIGFsZXJ0LgorJWlmbmRlZiBERUJVR19NRVNTQUdFUworX2h5YnJpZF9zaWduYXR1cmU6CisJICAgICAgIGRkIDB4NzA3OGMwZmIJCQk7IEFuIGFyYml0cmFyeSBudW1iZXIuLi4KKworX3N0YXJ0X2h5YnJpZDoKKwkJcG9wIGN4CQkJCTsgRUJJT1MgZmxhZworCQlwb3Agd29yZCBbY3M6YnNTZWNQZXJUcmFja10KKwkJcG9wIHdvcmQgW2NzOmJzSGVhZHNdCisJCXBvcCBkeAorCQlwb3AgZGkKKwkJcG9wIGVzCisJCXhvciBlYXgsZWF4CisJCXhvciBlYngsZWJ4CisJCWNtcCBzcCw3QzAwaAorCQlqYWUgLm5vb2Zmc2V0CisJCXBvcCBlYXgKKwkJcG9wIGVieAorLm5vb2Zmc2V0OgorCQltb3Ygc2ksYmlvc19jYmlvcworCQlqY3h6IF9zdGFydF9jb21tb24KKwkJbW92IHNpLGJpb3NfZWJpb3MKKwkJam1wIF9zdGFydF9jb21tb24KKyVlbmRpZgorCitfc3RhcnQxOgorCQltb3Ygc2ksYmlvc19jZHJvbQorCQl4b3IgZWF4LGVheAorCQl4b3IgZWJ4LGVieAorX3N0YXJ0X2NvbW1vbjoKKwkJbW92IFtjczpJbml0U3RhY2tdLHNwCTsgU2F2ZSBpbml0aWFsIHN0YWNrIHBvaW50ZXIKKwkJbW92IFtjczpJbml0U3RhY2srMl0sc3MKKwkJeG9yIGN4LGN4CisJCW1vdiBzcyxjeAorCQltb3Ygc3AsU3RhY2tCdWYJCTsgU2V0IHVwIHN0YWNrCisJCXB1c2ggZXMJCQk7IFNhdmUgaW5pdGlhbCBFUzpESSAtPiAkUG5QIHBvaW50ZXIKKwkJcHVzaCBkaQorCQltb3YgZHMsY3gKKwkJbW92IGVzLGN4CisJCW1vdiBmcyxjeAorCQltb3YgZ3MsY3gKKwkJc3RpCisJCWNsZAorCisJCW1vdiBbSGlkZGVuXSxlYXgKKwkJbW92IFtIaWRkZW4rNF0sZWJ4CisKKwkJbW92IFtCSU9TVHlwZV0sc2kKKwkJbW92IGVheCxbc2ldCisJCW1vdiBbR2V0bGluc2VjUHRyXSxlYXgKKworCQk7IFNob3cgc2lnbnMgb2YgbGlmZQorCQltb3Ygc2ksc3lzbGludXhfYmFubmVyCisJCWNhbGwgd3JpdGVzdHJfZWFybHkKKyVpZmRlZiBERUJVR19NRVNTQUdFUworCQltb3Ygc2ksY29weXJpZ2h0X3N0cgorJWVsc2UKKwkJbW92IHNpLFtCSU9TTmFtZV0KKyVlbmRpZgorCQljYWxsIHdyaXRlc3RyX2Vhcmx5CisKKwkJOworCQk7IEJlZm9yZSBtb2RpZnlpbmcgYW55IG1lbW9yeSwgZ2V0IHRoZSBjaGVja3N1bSBvZiBieXRlcworCQk7IDY0LTIwNDgKKwkJOworaW5pdGlhbF9jc3VtOgl4b3IgZWRpLGVkaQorCQltb3Ygc2ksYmlfZW5kCisJCW1vdiBjeCwoU0VDVE9SX1NJWkUtNjQpID4+IDIKKy5sb29wOgkJbG9kc2QKKwkJYWRkIGVkaSxlYXgKKwkJbG9vcCAubG9vcAorCQltb3YgW0ZpcnN0U2VjU3VtXSxlZGkKKworCQltb3YgW0RyaXZlTnVtYmVyXSxkbAorJWlmZGVmIERFQlVHX01FU1NBR0VTCisJCW1vdiBzaSxzdGFydHVwX21zZworCQljYWxsIHdyaXRlbXNnCisJCW1vdiBhbCxkbAorCQljYWxsIHdyaXRlaGV4MgorCQljYWxsIGNybGZfZWFybHkKKyVlbmRpZgorCQk7CisJCTsgSW5pdGlhbGl6ZSBzcGVjIHBhY2tldCBidWZmZXJzCisJCTsKKwkJbW92IGRpLF9zcGVjX3N0YXJ0CisJCW1vdiBjeCxfc3BlY19sZW4gPj4gMgorCQl4b3IgZWF4LGVheAorCQlyZXAgc3Rvc2QKKworCQk7IEluaXRpYWxpemUgbGVuZ3RoIGZpZWxkIG9mIHRoZSB2YXJpb3VzIHBhY2tldHMKKwkJbW92IGJ5dGUgW3NwZWNfcGFja2V0XSwxM2gKKwkJbW92IGJ5dGUgW2RyaXZlX3BhcmFtc10sMzAKKwkJbW92IGJ5dGUgW2RhcGFdLDE2CisJCW1vdiBieXRlIFtkc3BlY19wYWNrZXRdLDEzaAorCisJCTsgT3RoZXIgbm9uemVybyBmaWVsZHMKKwkJaW5jIHdvcmQgW2RzcF9zZWN0b3JzXQorCisJCTsgQXJlIHdlIGp1c3QgcHJldGVuZGluZyB0byBiZSBhIENELVJPTT8KKwkJY21wIHdvcmQgW0JJT1NUeXBlXSxiaW9zX2Nkcm9tCisJCWpuZSBmb3VuZF9kcml2ZQkJCTsgSWYgc28sIG5vIHNwZWMgcGFja2V0Li4uCisKKwkJOyBOb3cgZmlndXJlIG91dCB3aGF0IHdlJ3JlIGFjdHVhbGx5IGRvaW5nCisJCTsgTm90ZTogdXNlIHBhc3NlZC1pbiBETCB2YWx1ZSByYXRoZXIgdGhhbiA3RmggYmVjYXVzZQorCQk7IGF0IGxlYXN0IHNvbWUgQklPU2VzIHdpbGwgZ2V0IHRoZSB3cm9uZyB2YWx1ZSBvdGhlcndpc2UKKwkJbW92IGF4LDRCMDFoCQkJOyBHZXQgZGlzayBlbXVsYXRpb24gc3RhdHVzCisJCW1vdiBkbCxbRHJpdmVOdW1iZXJdCisJCW1vdiBzaSxzcGVjX3BhY2tldAorCQljYWxsIGludDEzCisJCWpjIGF3YXJkX2hhY2sJCQk7IGNoYW5nZWQgZm9yIEJyb2tlbkF3YXJkSGFjaworCQltb3YgZGwsW0RyaXZlTnVtYmVyXQorCQljbXAgW3NwX2RyaXZlXSxkbAkJOyBTaG91bGQgY29udGFpbiB0aGUgZHJpdmUgbnVtYmVyCisJCWpuZSBzcGVjX3F1ZXJ5X2ZhaWxlZAorCislaWZkZWYgREVCVUdfTUVTU0FHRVMKKwkJbW92IHNpLHNwZWNfb2tfbXNnCisJCWNhbGwgd3JpdGVtc2cKKwkJbW92IGFsLGJ5dGUgW3NwX2RyaXZlXQorCQljYWxsIHdyaXRlaGV4MgorCQljYWxsIGNybGZfZWFybHkKKyVlbmRpZgorCitmb3VuZF9kcml2ZToKKwkJOyBBbHJpZ2h0LCB3ZSBoYXZlIGZvdW5kIHRoZSBkcml2ZS4gIE5vdywgdHJ5IHRvIGZpbmQgdGhlCisJCTsgYm9vdCBmaWxlIGl0c2VsZi4gIElmIHdlIGhhdmUgYSBib290IGluZm8gdGFibGUsIGxpZmUgaXMKKwkJOyBnb29kOyBpZiBub3QsIHdlIGhhdmUgdG8gbWFrZSBzb21lIGFzc3VtcHRpb25zLCBhbmQgdHJ5CisJCTsgdG8gZmlndXJlIHRoaW5ncyBvdXQgb3Vyc2VsdmVzLiAgSW4gcGFydGljdWxhciwgdGhlCisJCTsgYXNzdW1wdGlvbnMgd2UgaGF2ZSB0byBtYWtlIGFyZToKKwkJOyAtIHNpbmdsZSBzZXNzaW9uIG9ubHkKKwkJOyAtIG9ubHkgb25lIGJvb3QgZW50cnkgKG5vIG1lbnUgb3Igb3RoZXIgYWx0ZXJuYXRpdmVzKQorCisJCWNtcCBkd29yZCBbYmlfZmlsZV0sMAkJOyBBZGRyZXNzIG9mIGNvZGUgdG8gbG9hZAorCQlqbmUgZm91bmRfZmlsZQkJCTsgQm9vdCBpbmZvIHRhYmxlIHByZXNlbnQgOikKKworJWlmZGVmIERFQlVHX01FU1NBR0VTCisJCW1vdiBzaSxub2luZm90YWJsZV9tc2cKKwkJY2FsbCB3cml0ZW1zZworJWVuZGlmCisKKwkJOyBObyBzdWNoIGx1Y2suICBTZWUgaWYgdGhlIHNwZWMgcGFja2V0IGNvbnRhaW5lZCBvbmUuCisJCW1vdiBlYXgsW3NwX2xiYV0KKwkJYW5kIGVheCxlYXgKKwkJanogc2V0X2ZpbGUJCQk7IEdvb2QgZW5vdWdoCisKKyVpZmRlZiBERUJVR19NRVNTQUdFUworCQltb3Ygc2ksbm9pbmZvaW5zcGVjX21zZworCQljYWxsIHdyaXRlbXNnCislZW5kaWYKKworCQk7IE5vIHN1Y2ggbHVjay4gIEdldCB0aGUgQm9vdCBSZWNvcmQgVm9sdW1lLCBhc3N1bWluZyBzaW5nbGUKKwkJOyBzZXNzaW9uIGRpc2ssIGFuZCB0aGF0IHdlJ3JlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgY2hhaW4uCisJCW1vdiBlYXgsMTcJCQk7IEFzc3VtZWQgYWRkcmVzcyBvZiBCUlYKKwkJbW92IGJ4LHRyYWNrYnVmCisJCWNhbGwgZ2V0b25lc2VjCisKKwkJbW92IGVheCxbdHJhY2tidWYrNDdoXQkJOyBHZXQgYm9vdCBjYXRhbG9nIGFkZHJlc3MKKwkJbW92IGJ4LHRyYWNrYnVmCisJCWNhbGwgZ2V0b25lc2VjCQkJOyBHZXQgYm9vdCBjYXRhbG9nCisKKwkJbW92IGVheCxbdHJhY2tidWYrMjhoXQkJOyBGaXJzdCBib290IGVudHJ5CisJCTsgQW5kIGhvcGUgYW5kIHByYXkgdGhpcyBpcyB1cy4uLgorCisJCTsgU29tZSBCSU9TZXMgYXBwYXJlbnRseSBoYXZlIGxpbWl0YXRpb25zIG9uIHRoZSBzaXplCisJCTsgdGhhdCBtYXkgYmUgbG9hZGVkIChkZXNwaXRlIHRoZSBFbCBUb3JpdG8gc3BlYyBiZWluZyB2ZXJ5CisJCTsgY2xlYXIgb24gdGhlIGZhY3QgdGhhdCBpdCBtdXN0IGFsbCBiZSBsb2FkZWQuKSAgVGhlcmVmb3JlLAorCQk7IHdlIGxvYWQgaXQgb3Vyc2VsdmVzLCBhbmQgKmJsZWVwKiB0aGUgQklPUy4KKworc2V0X2ZpbGU6CisJCW1vdiBbYmlfZmlsZV0sZWF4CisKK2ZvdW5kX2ZpbGU6CisJCTsgU2V0IHVwIGJvb3QgZmlsZSBzaXplcworCQltb3YgZWF4LFtiaV9sZW5ndGhdCisJCXN1YiBlYXgsU0VDVE9SX1NJWkUtMwkJOyAuLi4gbWludXMgc2VjdG9yIGxvYWRlZAorCQlzaHIgZWF4LDIJCQk7IGJ5dGVzLT5kd29yZHMKKwkJbW92IFtJbWFnZUR3b3Jkc10sZWF4CQk7IGJvb3QgZmlsZSBkd29yZHMKKwkJYWRkIGVheCwoKFNFQ1RPUl9TSVpFLTEpID4+IDIpCisJCXNociBlYXgsU0VDVE9SX1NISUZULTIJCTsgZHdvcmRzLT5zZWN0b3JzCisJCW1vdiBbSW1hZ2VTZWN0b3JzXSxheAkJOyBib290IGZpbGUgc2VjdG9ycworCisJCW1vdiBlYXgsW2JpX2ZpbGVdCQk7IEFkZHJlc3Mgb2YgY29kZSB0byBsb2FkCisJCWluYyBlYXgJCQkJOyBEb24ndCByZWxvYWQgYm9vdHN0cmFwIGNvZGUKKyVpZmRlZiBERUJVR19NRVNTQUdFUworCQltb3Ygc2ksb2Zmc2V0X21zZworCQljYWxsIHdyaXRlbXNnCisJCWNhbGwgd3JpdGVoZXg4CisJCWNhbGwgY3JsZl9lYXJseQorJWVuZGlmCisKKwkJOyBMb2FkIHRoZSByZXN0IG9mIHRoZSBmaWxlLiAgSG93ZXZlciwganVzdCBpbiBjYXNlIHRoZXJlCisJCTsgYXJlIHN0aWxsIEJJT1NlcyB3aXRoIDY0SyB3cmFwYXJvdW5kIHByb2JsZW1zLCB3ZSBoYXZlIHRvCisJCTsgdGFrZSBzb21lIGV4dHJhIHByZWNhdXRpb25zLiAgU2luY2UgdGhlIG5vcm1hbCBsb2FkCisJCTsgYWRkcmVzcyAoVEVYVF9TVEFSVCkgaXMgKm5vdCogMkstc2VjdG9yLWFsaWduZWQsIHdlIHJvdW5kCisJCTsgdGhlIHRhcmdldCBhZGRyZXNzIHVwd2FyZCB0byBhIHNlY3RvciBib3VuZGFyeSwKKwkJOyBhbmQgdGhlbiBtb3ZlIHRoZSBlbnRpcmUgdGhpbmcgZG93biBhcyBhIHVuaXQuCitNYXhMTUEJCWVxdSAzODQqMTAyNAkJOyBSZWFzb25hYmxlIGxpbWl0ICgzODRLKQorCisJCW1vdiBieCwoKFRFWFRfU1RBUlQrMipTRUNUT1JfU0laRS0xKSAmIH4oU0VDVE9SX1NJWkUtMSkpID4+IDQKKwkJbW92IGJwLFtJbWFnZVNlY3RvcnNdCisJCXB1c2ggYngJCQk7IExvYWQgc2VnbWVudCBhZGRyZXNzCisKKy5tb3JlOgorCQlwdXNoIGJ4CQkJOyBTZWdtZW50IGFkZHJlc3MKKwkJcHVzaCBicAkJCTsgU2VjdG9yIGNvdW50CisJCW1vdiBlcyxieAorCQltb3YgY3gsMHhmZmYKKwkJYW5kIGJ4LGN4CisJCWluYyBjeAorCQlzdWIgY3gsYngKKwkJc2hyIGN4LFNFQ1RPUl9TSElGVCAtIDQKKwkJam56IC5ub3RhbGlnbmVkCisJCW1vdiBjeCwweDEwMDAwID4+IFNFQ1RPUl9TSElGVAk7IEZ1bGwgNjRLIHNlZ21lbnQgcG9zc2libGUKKy5ub3RhbGlnbmVkOgorCQljbXAgYnAsY3gKKwkJamJlIC5vaworCQltb3YgYnAsY3gKKy5vazoKKwkJeG9yIGJ4LGJ4CisJCXB1c2ggYnAKKwkJcHVzaCBlYXgKKwkJY2FsbCBnZXRsaW5zZWMKKwkJcG9wIGVheAorCQlwb3AgY3gKKwkJbW92enggZWR4LGN4CisJCXBvcCBicAorCQlwb3AgYngKKworCQlzaGwgY3gsU0VDVE9SX1NISUZUIC0gNAorCQlhZGQgYngsY3gKKwkJYWRkIGVheCxlZHgKKwkJc3ViIGJwLGR4CisJCWpueiAubW9yZQorCisJCTsgTW92ZSB0aGUgaW1hZ2UgaW50byBwbGFjZSwgYW5kIGFsc28gdmVyaWZ5IHRoZQorCQk7IGNoZWNrc3VtCisJCXBvcCBheAkJCQk7IExvYWQgc2VnbWVudCBhZGRyZXNzCisJCW1vdiBieCwoVEVYVF9TVEFSVCArIFNFQ1RPUl9TSVpFKSA+PiA0CisJCW1vdiBlY3gsW0ltYWdlRHdvcmRzXQorCQltb3YgZWRpLFtGaXJzdFNlY1N1bV0JCTsgRmlyc3Qgc2VjdG9yIGNoZWNrc3VtCisJCXhvciBzaSxzaQorCittb3ZlX3ZlcmlmeV9pbWFnZToKKy5zZXRzZWc6CisJCW1vdiBkcyxheAorCQltb3YgZXMsYngKKy5sb29wOgorCQltb3YgZWR4LFtzaV0KKwkJYWRkIGVkaSxlZHgKKwkJZGVjIGVjeAorCQltb3YgW2VzOnNpXSxlZHgKKwkJanogLmRvbmUKKwkJYWRkIHNpLDQKKwkJam56IC5sb29wCisJCWFkZCBheCwxMDAwaAorCQlhZGQgYngsMTAwMGgKKwkJam1wIC5zZXRzZWcKKy5kb25lOgorCQltb3YgYXgsY3MKKwkJbW92IGRzLGF4CisJCW1vdiBlcyxheAorCisJCTsgVmVyaWZ5IHRoZSBjaGVja3N1bSBvbiB0aGUgbG9hZGVkIGltYWdlLgorCQljbXAgW2JpX2NzdW1dLGVkaQorCQlqZSBpbnRlZ3JpdHlfb2sKKworCQltb3Ygc2ksY2hlY2tlcnJfbXNnCisJCWNhbGwgd3JpdGVtc2cKKwkJam1wIGthYm9vbQorCitpbnRlZ3JpdHlfb2s6CislaWZkZWYgREVCVUdfTUVTU0FHRVMKKwkJbW92IHNpLGFsbHJlYWRfbXNnCisJCWNhbGwgd3JpdGVtc2cKKyVlbmRpZgorCQlqbXAgYWxsX3JlYWQJCQk7IEp1bXAgdG8gbWFpbiBjb2RlCisKKzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKzs7IFN0YXJ0IG9mIEJyb2tlbkF3YXJkSGFjayAtLS0gMTAtbm92LTIwMDIgICAgICAgICAgIEtudXRfUGV0ZXJzZW5AdC1vbmxpbmUuZGUKKzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKzs7Cis7OyBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCBjZXJ0YWluIHZlcnNpb25zIG9mIHRoZSBBV0FSRCBCSU9TIC4uLgorOzsgdGhlIGJvb3Qgc2VjdG9yIHdpbGwgYmUgbG9hZGVkIGFuZCBleGVjdXRlZCBjb3JyZWN0bHksIGJ1dCwgYmVjYXVzZSB0aGUKKzs7IGludCAxMyB2ZWN0b3IgcG9pbnRzIHRvIHRoZSB3cm9uZyBjb2RlIGluIHRoZSBCSU9TLCBldmVyeSBhdHRlbXB0IHRvCis7OyBsb2FkIHRoZSBzcGVjIHBhY2tldCB3aWxsIGZhaWwuIFdlIHNjYW4gZm9yIHRoZSBlcXVpdmFsZW50IG9mCis7OworOzsJbW92CWF4LDAyMDFoCis7Owltb3YJYngsN2MwMGgKKzs7CW1vdgljeCwwMDA2aAorOzsJbW92CWR4LDAxODBoCis7OwlwdXNoZgorOzsJY2FsbAk8ZGlyZWN0IGZhcj4KKzs7Cis7OyBhbmQgdXNlIDxkaXJlY3QgZmFyPiBhcyB0aGUgbmV3IHZlY3RvciBmb3IgaW50IDEzLiBUaGUgY29kZSBhYm92ZSBpcworOzsgdXNlZCB0byBsb2FkIHRoZSBib290IGNvZGUgaW50byByYW0sIGFuZCB0aGVyZSBzaG91bGQgYmUgbm8gcmVhc29uCis7OyBmb3IgYW55Ym9keSB0byBjaGFuZ2UgaXQgbm93IG9yIGluIHRoZSBmdXR1cmUuIFRoZXJlIGFyZSBubyBvcGNvZGVzCis7OyB0aGF0IHVzZSBlbmNvZGluZ3MgcmVsYXRpdiB0byBJUCwgc28gc2Nhbm5pbmcgaXMgZWFzeS4gSWYgd2UgZmluZCB0aGUKKzs7IGNvZGUgYWJvdmUgaW4gdGhlIEJJT1MgY29kZSB3ZSBjYW4gYmUgcHJldHR5IHN1cmUgdG8gcnVuIG9uIGEgbWFjaGluZQorOzsgd2l0aCBhbiBicm9rZW4gQVdBUkQgQklPUyAuLi4KKzs7Cis7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CisJCQkJCQkJCQkgICAgIDs7CislaWZkZWYgREVCVUdfTUVTU0FHRVMJCQkJCQkJICAgICA7OworCQkJCQkJCQkJICAgICA7OworYXdhcmRfbm90aWNlCWRiCSJUcnlpbmcgQnJva2VuQXdhcmRIYWNrIGZpcnN0IC4uLiIsQ1IsTEYsMAkgICAgIDs7Cithd2FyZF9ub3Rfb3JpZwlkYgkiQkFIOiBPcmlnaW5hbCBJbnQgMTMgdmVjdG9yICAgOiAiLDAJCSAgICAgOzsKK2F3YXJkX25vdF9uZXcJZGIJIkJBSDogSW50IDEzIHZlY3RvciBjaGFuZ2VkIHRvIDogIiwwCQkgICAgIDs7Cithd2FyZF9ub3Rfc3VjYwlkYgkiQkFIOiBTVUNDRVNTIixDUixMRiwwCQkJCSAgICAgOzsKK2F3YXJkX25vdF9mYWlsCWRiCSJCQUg6IEZBSUxVUkUiCQkJCQkgICAgIDs7Cithd2FyZF9ub3RfY3JsZglkYglDUixMRiwwCQkJCQkJICAgICA7OworCQkJCQkJCQkJICAgICA7OworJWVuZGlmCQkJCQkJCQkJICAgICA7OworCQkJCQkJCQkJICAgICA7OworYXdhcmRfb2xkaW50MTMJZGQJMAkJCQkJCSAgICAgOzsKK2F3YXJkX3N0cmluZwlkYgkwYjhoLDEsMiwwYmJoLDAsN2NoLDBiOWgsNiwwLDBiYWgsODBoLDEsMDljaCwwOWFoICAgIDs7CisJCQkJCQkJCQkgICAgIDs7CisJCQkJCQk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Cithd2FyZF9oYWNrOgltb3YJc2ksc3BlY19lcnJfbXNnCQk7IE1vdmVkIHRvIHRoaXMgcGxhY2UgZnJvbQorCQljYWxsCXdyaXRlbXNnCQk7IHNwZWNfcXVlcnlfZmFpbGVkCisJCQkJCQk7CislaWZkZWYgREVCVUdfTUVTU0FHRVMJCQkJOworCQkJCQkJOworCQltb3YJc2ksYXdhcmRfbm90aWNlCQk7IGRpc3BsYXkgb3VyIHBsYW4KKwkJY2FsbAl3cml0ZW1zZwkJOworCQltb3YJc2ksYXdhcmRfbm90X29yaWcJOyBkaXNwbGF5IG9yaWdpbmFsIGludCAxMworCQljYWxsCXdyaXRlbXNnCQk7IHZlY3RvcgorJWVuZGlmCQkJCQkJOworCQltb3YJZWF4LFsxM2gqNF0JCTsKKwkJbW92CVthd2FyZF9vbGRpbnQxM10sZWF4CTsKKwkJCQkJCTsKKyVpZmRlZiBERUJVR19NRVNTQUdFUwkJCQk7CisJCQkJCQk7CisJCWNhbGwJd3JpdGVoZXg4CQk7CisJCW1vdglzaSxhd2FyZF9ub3RfY3JsZgk7CisJCWNhbGwJd3JpdGVzdHJfZWFybHkJCTsKKyVlbmRpZgkJCQkJCTsKKwkJcHVzaAllcwkJCTsgc2F2ZSBFUworCQltb3YJYXgsMGYwMDBoCQk7IEVTID0gQklPUyBTZWcKKwkJbW92CWVzLGF4CQkJOworCQljbGQJCQkJOworCQl4b3IJZGksZGkJCQk7IHN0YXJ0IGF0IEVTOkRJID0gZjAwMDowCithd2FyZF9sb29wOglwdXNoCWRpCQkJOyBzYXZlIERJCisJCW1vdglzaSxhd2FyZF9zdHJpbmcJCTsgc2NhbiBmb3IgYXdhcmRfc3RyaW5nCisJCW1vdgljeCw3CQkJOyBsZW5ndGggb2YgYXdhcmRfc3RyaW5nID0gN2R3CisJCXJlcHoJY21wc3cJCQk7IGNvbXBhcmUKKwkJcG9wCWRpCQkJOyByZXN0b3JlIERJCisJCWpjeHoJYXdhcmRfZm91bmQJCTsgam1wIGlmIGZvdW5kCisJCWluYwlkaQkJCTsgbm90IGZvdW5kLCBpbmMgZGkKKwkJam5vCWF3YXJkX2xvb3AJCTsKKwkJCQkJCTsKK2F3YXJkX2ZhaWxlZDoJcG9wCWVzCQkJOyBObywgbm90IHRoaXMgd2F5IDotKCgKK2F3YXJkX2ZhaWwyOgkJCQkJOworCQkJCQkJOworJWlmZGVmIERFQlVHX01FU1NBR0VTCQkJCTsKKwkJCQkJCTsKKwkJbW92CXNpLGF3YXJkX25vdF9mYWlsCTsgZGlzcGxheSBmYWlsdXJlIC4uLgorCQljYWxsCXdyaXRlbXNnCQk7CislZW5kaWYJCQkJCQk7CisJCW1vdgllYXgsW2F3YXJkX29sZGludDEzXQk7IHJlc3RvcmUgdGhlIG9yaWdpbmFsIGludAorCQlvcgllYXgsZWF4CQkJOyAxMyB2ZWN0b3IgaWYgdGhlcmUgaXMgb25lCisJCWp6CXNwZWNfcXVlcnlfZmFpbGVkCTsgYW5kIHRyeSBvdGhlciB3b3JrYXJvdW5kcworCQltb3YJWzEzaCo0XSxlYXgJCTsKKwkJam1wCXNwZWNfcXVlcnlfZmFpbGVkCTsKKwkJCQkJCTsKK2F3YXJkX2ZvdW5kOgltb3YJZWF4LFtlczpkaSswZWhdCQk7IGxvYWQgcG9zc2libGUgaW50IDEzIGFkZHIKKwkJcG9wCWVzCQkJOyByZXN0b3JlIEVTCisJCQkJCQk7CisJCWNtcAllYXgsW2F3YXJkX29sZGludDEzXQk7IGdpdmUgdXAgaWYgdGhpcyBpcyB0aGUKKwkJanoJYXdhcmRfZmFpbGVkCQk7IGFjdGl2ZSBpbnQgMTMgdmVjdG9yLAorCQltb3YJWzEzaCo0XSxlYXgJCTsgb3RoZXJ3aXNlIGNoYW5nZSAwOjEzaCo0CisJCQkJCQk7CisJCQkJCQk7CislaWZkZWYgREVCVUdfTUVTU0FHRVMJCQkJOworCQkJCQkJOworCQlwdXNoCWVheAkJCTsgZGlzcGxheSBtZXNzYWdlIGFuZAorCQltb3YJc2ksYXdhcmRfbm90X25ldwk7IG5ldyB2ZWN0b3IgYWRkcmVzcworCQljYWxsCXdyaXRlbXNnCQk7CisJCXBvcAllYXgJCQk7CisJCWNhbGwJd3JpdGVoZXg4CQk7CisJCW1vdglzaSxhd2FyZF9ub3RfY3JsZgk7CisJCWNhbGwJd3JpdGVzdHJfZWFybHkJCTsKKyVlbmRpZgkJCQkJCTsKKwkJbW92CWF4LDRCMDFoCQk7IHRyeSB0byByZWFkIHRoZSBzcGVjIHBhY2tldAorCQltb3YJZGwsW0RyaXZlTnVtYmVyXQk7IG5vdyAuLi4gaXQgc2hvdWxkIG5vdCBmYWlsCisJCW1vdglzaSxzcGVjX3BhY2tldAkJOyBhbnkgbG9uZ2VyCisJCWludAkxM2gJCQk7CisJCWpjCWF3YXJkX2ZhaWwyCQk7CisJCQkJCQk7CislaWZkZWYgREVCVUdfTUVTU0FHRVMJCQkJOworCQkJCQkJOworCQltb3YJc2ksYXdhcmRfbm90X3N1Y2MJOyBkaXNwbGF5IG91ciBTVUNDRVNTCisJCWNhbGwJd3JpdGVtc2cJCTsKKyVlbmRpZgkJCQkJCTsKKwkJam1wCWZvdW5kX2RyaXZlCQk7IGFuZCBsZWF2ZSBlcnJvciByZWNvdmVyeSBjb2RlCisJCQkJCQk7Cis7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Cis7OyBFbmQgb2YgQnJva2VuQXdhcmRIYWNrIC0tLS0gICAgICAgICAgICAxMC1ub3YtMjAwMiBLbnV0X1BldGVyc2VuQHQtb25saW5lLmRlCis7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CisKKworCQk7IElOVCAxM2gsIEFYPTRCMDFoLCBETD08cGFzc2VkIGluIHZhbHVlPiBmYWlsZWQuCisJCTsgVHJ5IHRvIHNjYW4gdGhlIGVudGlyZSA4MGgtRkZoIGZyb20gdGhlIGVuZC4KKworc3BlY19xdWVyeV9mYWlsZWQ6CisKKwkJOyBzb21lIGNvZGUgbW92ZWQgdG8gQnJva2VuQXdhcmRIYWNrCisKKwkJbW92IGRsLDBGRmgKKy50ZXN0X2xvb3A6CXB1c2hhCisJCW1vdiBheCw0QjAxaAorCQltb3Ygc2ksc3BlY19wYWNrZXQKKwkJbW92IGJ5dGUgW3NpXSwxM2gJCTsgU2l6ZSBvZiBidWZmZXIKKwkJY2FsbCBpbnQxMworCQlwb3BhCisJCWpjIC5zdGlsbF9icm9rZW4KKworCQltb3Ygc2ksbWF5YmVfbXNnCisJCWNhbGwgd3JpdGVtc2cKKwkJbW92IGFsLGRsCisJCWNhbGwgd3JpdGVoZXgyCisJCWNhbGwgY3JsZl9lYXJseQorCisJCWNtcCBieXRlIFtzcF9kcml2ZV0sZGwKKwkJam5lIC5tYXliZV9icm9rZW4KKworCQk7IE9rYXksIGdvb2QgZW5vdWdoLi4uCisJCW1vdiBzaSxhbHJpZ2h0X21zZworCQljYWxsIHdyaXRlbXNnCisuZm91bmRfZHJpdmUwOgltb3YgW0RyaXZlTnVtYmVyXSxkbAorLmZvdW5kX2RyaXZlOglqbXAgZm91bmRfZHJpdmUKKworCQk7IEF3YXJkIEJJT1MgNC41MSBhcHBhcmVudGx5IHBhc3NlcyBnYXJiYWdlIGluIHNwX2RyaXZlLAorCQk7IGJ1dCBpZiB0aGlzIHdhcyB0aGUgZHJpdmUgbnVtYmVyIG9yaWdpbmFsbHkgcGFzc2VkIGluCisJCTsgREwgdGhlbiBjb25zaWRlciBpdCAiZ29vZCBlbm91Z2giCisubWF5YmVfYnJva2VuOgorCQltb3YgYWwsW0RyaXZlTnVtYmVyXQorCQljbXAgYWwsZGwKKwkJamUgLmZvdW5kX2RyaXZlCisKKwkJOyBJbnRlbCBDbGFzc2ljIFIrIGNvbXB1dGVyIHdpdGggQWRhcHRlYyAxNTQyQ1AgQklPUyAxLjAyCisJCTsgcGFzc2VzIGdhcmJhZ2UgaW4gc3BfZHJpdmUsIGFuZCB0aGUgZHJpdmUgbnVtYmVyIG9yaWdpbmFsbHkKKwkJOyBwYXNzZWQgaW4gREwgZG9lcyBub3QgaGF2ZSA4MGggYml0IHNldC4KKwkJb3IgYWwsODBoCisJCWNtcCBhbCxkbAorCQlqZSAuZm91bmRfZHJpdmUwCisKKy5zdGlsbF9icm9rZW46CWRlYyBkeAorCQljbXAgZGwsIDgwaAorCQlqbmIgLnRlc3RfbG9vcAorCisJCTsgTm8gc3BlYyBwYWNrZXQgYW55d2hlcmUuICBTb21lIHBhcnRpY3VsYXJseSBwYXRoZXRpYworCQk7IEJJT1NlcyBhcHBhcmVudGx5IGRvbid0IGV2ZW4gaW1wbGVtZW50IGZ1bmN0aW9uCisJCTsgNEIwMWgsIHNvIHdlIGNhbid0IHF1ZXJ5IGEgc3BlYyBwYWNrZXQgbm8gbWF0dGVyCisJCTsgd2hhdC4gIElmIHdlIGdvdCBhIGRyaXZlIG51bWJlciBpbiBETCwgdGhlbiB0cnkgdG8KKwkJOyB1c2UgaXQsIGFuZCBpZiBpdCB3b3JrcywgdGhlbiB3ZWxsLi4uCisJCW1vdiBkbCxbRHJpdmVOdW1iZXJdCisJCWNtcCBkbCw4MWgJCQk7IFNob3VsZCBiZSA4MS1GRiBhdCBsZWFzdAorCQlqYiBmYXRhbF9lcnJvcgkJCTsgSWYgbm90LCBpdCdzIGhvcGVsZXNzCisKKwkJOyBXcml0ZSBhIHdhcm5pbmcgdG8gaW5kaWNhdGUgd2UncmUgb24gKnZlcnkqIHRoaW4gaWNlIG5vdworCQltb3Ygc2ksbm9zcGVjX21zZworCQljYWxsIHdyaXRlbXNnCisJCW1vdiBhbCxkbAorCQljYWxsIHdyaXRlaGV4MgorCQljYWxsIGNybGZfZWFybHkKKwkJbW92IHNpLHRyeXNibV9tc2cKKwkJY2FsbCB3cml0ZW1zZworCQlqbXAgLmZvdW5kX2RyaXZlCQk7IFByYXkgdGhhdCB0aGlzIHdvcmtzLi4uCisKK2ZhdGFsX2Vycm9yOgorCQltb3Ygc2ksbm90aGluZ19tc2cKKwkJY2FsbCB3cml0ZW1zZworCisubm9yZ2U6CQlqbXAgc2hvcnQgLm5vcmdlCisKKwkJOyBJbmZvcm1hdGlvbiBtZXNzYWdlIChEUzpTSSkgb3V0cHV0CisJCTsgUHJlZml4IHdpdGggImlzb2xpbnV4OiAiCisJCTsKK3dyaXRlbXNnOglwdXNoIGF4CisJCXB1c2ggc2kKKwkJbW92IHNpLGlzb2xpbnV4X3N0cgorCQljYWxsIHdyaXRlc3RyX2Vhcmx5CisJCXBvcCBzaQorCQljYWxsIHdyaXRlc3RyX2Vhcmx5CisJCXBvcCBheAorCQlyZXQKKword3JpdGVzdHJfZWFybHk6CisJCXB1c2hmZAorCQlwdXNoYWQKKy50b3A6CQlsb2RzYgorCQlhbmQgYWwsYWwKKwkJanogLmVuZAorCQljYWxsIHdyaXRlY2hyCisJCWptcCBzaG9ydCAudG9wCisuZW5kOgkJcG9wYWQKKwkJcG9wZmQKKwkJcmV0CisKK2NybGZfZWFybHk6CXB1c2ggYXgKKwkJbW92IGFsLENSCisJCWNhbGwgd3JpdGVjaHIKKwkJbW92IGFsLExGCisJCWNhbGwgd3JpdGVjaHIKKwkJcG9wIGF4CisJCXJldAorCis7Cis7IFdyaXRlIGEgY2hhcmFjdGVyIHRvIHRoZSBzY3JlZW4uICBUaGVyZSBpcyBhIG1vcmUgInNvcGhpc3RpY2F0ZWQiCis7IHZlcnNpb24gb2YgdGhpcyBpbiB0aGUgc3Vic2VxdWVudCBjb2RlLCBzbyB3ZSBwYXRjaCB0aGUgcG9pbnRlcgorOyB3aGVuIGFwcHJvcHJpYXRlLgorOworCit3cml0ZWNocjoKKy5zaW1wbGU6CisJCXB1c2hmZAorCQlwdXNoYWQKKwkJbW92IGFoLDBFaAorCQl4b3IgYngsYngKKwkJaW50IDEwaAorCQlwb3BhZAorCQlwb3BmZAorCQlyZXQKKworOworOyBpbnQxMzogc2F2ZSBhbGwgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIGFuZCBjYWxsIElOVCAxM2guCis7CSBTb21lIENELVJPTSBCSU9TZXMgaGF2ZSBiZWVuIGZvdW5kIHRvIGNvcnJ1cHQgc2VnbWVudCByZWdpc3RlcnMKKzsJIGFuZC9vciBkaXNhYmxlIGludGVycnVwdHMuCis7CitpbnQxMzoKKwkJcHVzaGYKKwkJcHVzaCBicAorCQlwdXNoIGRzCisJCXB1c2ggZXMKKwkJcHVzaCBmcworCQlwdXNoIGdzCisJCWludCAxM2gKKwkJbW92IGJwLHNwCisJCXNldGMgW2JwKzEwXQkJOyBQcm9wYWdhdGUgQ0YgdG8gdGhlIGNhbGxlcgorCQlwb3AgZ3MKKwkJcG9wIGZzCisJCXBvcCBlcworCQlwb3AgZHMKKwkJcG9wIGJwCisJCXBvcGYKKwkJcmV0CisKKzsKKzsgR2V0IG9uZSBzZWN0b3IuICBDb252ZW5pZW5jZSBlbnRyeSBwb2ludC4KKzsKK2dldG9uZXNlYzoKKwkJbW92IGJwLDEKKwkJOyBGYWxsIHRocm91Z2ggdG8gZ2V0bGluc2VjCisKKzsKKzsgR2V0IGxpbmVhciBzZWN0b3JzIC0gRUJJT1MgTEJBIGFkZHJlc3NpbmcsIDIwNDgtYnl0ZSBzZWN0b3JzLgorOworOyBJbnB1dDoKKzsJRUFYCS0gTGluZWFyIHNlY3RvciBudW1iZXIKKzsJRVM6QlgJLSBUYXJnZXQgYnVmZmVyCis7CUJQCS0gU2VjdG9yIGNvdW50Cis7CisJCWdsb2JhbCBnZXRsaW5zZWMKK2dldGxpbnNlYzoJam1wIHdvcmQgW2NzOkdldGxpbnNlY1B0cl0KKworJWlmbmRlZiBERUJVR19NRVNTQUdFUworCis7Cis7IEZpcnN0LCB0aGUgdmFyaWFudHMgdGhhdCB3ZSB1c2Ugd2hlbiBhY3R1YWxseSBsb2FkaW5nIG9mZiBhIGRpc2sKKzsgKGh5YnJpZCBtb2RlLikgIFRoZXNlIGFyZSBhZGFwdGVkIHZlcnNpb25zIG9mIHRoZSBlcXVpdmFsZW50IHJvdXRpbmVzCis7IGluIGxkbGludXguYXNtLgorOworCis7Cis7IGdldGxpbnNlY19lYmlvczoKKzsKKzsgZ2V0bGluc2VjIGltcGxlbWVudGF0aW9uIGZvciBmbG9wcHkvSEREIEVCSU9TIChFREQpCis7CitnZXRsaW5zZWNfZWJpb3M6CisJCXhvciBlZHgsZWR4CisJCXNobGQgZWR4LGVheCwyCisJCXNobCBlYXgsMgkJCTsgQ29udmVydCB0byBIREQgc2VjdG9ycworCQlhZGQgZWF4LFtIaWRkZW5dCisJCWFkYyBlZHgsW0hpZGRlbis0XQorCQlzaGwgYnAsMgorCisubG9vcDoKKyAgICAgICAgICAgICAgICBwdXNoIGJwICAgICAgICAgICAgICAgICAgICAgICAgIDsgU2VjdG9ycyBsZWZ0CisucmV0cnkyOgorCQljYWxsIG1heHRyYW5zCQkJOyBFbmZvcmNlIG1heGltdW0gdHJhbnNmZXIgc2l6ZQorCQltb3Z6eCBlZGksYnAJCQk7IFNlY3RvcnMgd2UgYXJlIGFib3V0IHRvIHJlYWQKKwkJbW92IGN4LHJldHJ5X2NvdW50CisucmV0cnk6CisKKwkJOyBGb3JtIERBUEEgb24gc3RhY2sKKwkJcHVzaCBlZHgKKwkJcHVzaCBlYXgKKwkJcHVzaCBlcworCQlwdXNoIGJ4CisJCXB1c2ggZGkKKwkJcHVzaCB3b3JkIDE2CisJCW1vdiBzaSxzcAorCQlwdXNoYWQKKyAgICAgICAgICAgICAgICBtb3YgZGwsW0RyaXZlTnVtYmVyXQorCQlwdXNoIGRzCisJCXB1c2ggc3MKKwkJcG9wIGRzCQkJCTsgRFMgPC0gU1MKKwkJbW92IGFoLDQyaAkJCTsgRXh0ZW5kZWQgUmVhZAorCQljYWxsIGludDEzCisJCXBvcCBkcworCQlwb3BhZAorCQlsZWEgc3AsW3NpKzE2XQkJCTsgUmVtb3ZlIERBUEEKKwkJamMgLmVycm9yCisJCXBvcCBicAorCQlhZGQgZWF4LGVkaQkJCTsgQWR2YW5jZSBzZWN0b3IgcG9pbnRlcgorCQlhZGMgZWR4LDAKKwkJc3ViIGJwLGRpCQkJOyBTZWN0b3JzIGxlZnQKKyAgICAgICAgICAgICAgICBzaGwgZGksOQkJCTsgNTEyLWJ5dGUgc2VjdG9ycworICAgICAgICAgICAgICAgIGFkZCBieCxkaQkJCTsgQWR2YW5jZSBidWZmZXIgcG9pbnRlcgorICAgICAgICAgICAgICAgIGFuZCBicCxicAorICAgICAgICAgICAgICAgIGpueiAubG9vcAorCisgICAgICAgICAgICAgICAgcmV0CisKKy5lcnJvcjoKKwkJOyBTb21lIHN5c3RlbXMgc2VlbSB0byBnZXQgInN0dWNrIiBpbiBhbiBlcnJvciBzdGF0ZSB3aGVuCisJCTsgdXNpbmcgRUJJT1MuICBEb2Vzbid0IGhhcHBlbiB3aGVuIHVzaW5nIENCSU9TLCB3aGljaCBpcworCQk7IGdvb2QsIHNpbmNlIHNvbWUgb3RoZXIgc3lzdGVtcyBnZXQgdGltZW91dCBmYWlsdXJlcworCQk7IHdhaXRpbmcgZm9yIHRoZSBmbG9wcHkgZGlzayB0byBzcGluIHVwLgorCisJCXB1c2hhZAkJCQk7IFRyeSByZXNldHRpbmcgdGhlIGRldmljZQorCQl4b3IgYXgsYXgKKwkJbW92IGRsLFtEcml2ZU51bWJlcl0KKwkJY2FsbCBpbnQxMworCQlwb3BhZAorCQlsb29wIC5yZXRyeQkJCTsgQ1gtLSBhbmQganVtcCBpZiBub3QgemVybworCisJCTtzaHIgd29yZCBbTWF4VHJhbnNmZXJdLDEJOyBSZWR1Y2UgdGhlIHRyYW5zZmVyIHNpemUKKwkJO2pueiAucmV0cnkyCisKKwkJOyBUb3RhbCBmYWlsdXJlLiAgVHJ5IGZhbGxpbmcgYmFjayB0byBDQklPUy4KKwkJbW92IHdvcmQgW0dldGxpbnNlY1B0cl0sIGdldGxpbnNlY19jYmlvcworCQk7bW92IGJ5dGUgW01heFRyYW5zZmVyXSw2Mwk7IE1heCBwb3NzaWJlIENCSU9TIHRyYW5zZmVyCisKKwkJcG9wIGJwCisJCWptcCBnZXRsaW5zZWNfY2Jpb3MubG9vcAorCis7Cis7IGdldGxpbnNlY19jYmlvczoKKzsKKzsgZ2V0bGluc2VjIGltcGxlbWVudGF0aW9uIGZvciBsZWdhY3kgQ0JJT1MKKzsKK2dldGxpbnNlY19jYmlvczoKKwkJeG9yIGVkeCxlZHgKKwkJc2hsIGVheCwyCQkJOyBDb252ZXJ0IHRvIEhERCBzZWN0b3JzCisJCWFkZCBlYXgsW0hpZGRlbl0KKwkJc2hsIGJwLDIKKworLmxvb3A6CisJCXB1c2ggZWR4CisJCXB1c2ggZWF4CisJCXB1c2ggYnAKKwkJcHVzaCBieAorCisJCW1vdnp4IGVzaSx3b3JkIFtic1NlY1BlclRyYWNrXQorCQltb3Z6eCBlZGksd29yZCBbYnNIZWFkc10KKwkJOworCQk7IERpdmlkaW5nIGJ5IHNlY3RvcnMgdG8gZ2V0ICh0cmFjayxzZWN0b3IpOiB3ZSBtYXkgaGF2ZQorCQk7IHVwIHRvIDJeMTggdHJhY2tzLCBzbyB3ZSBuZWVkIHRvIHVzZSAzMi1iaXQgYXJpdGhtZXRyaWMuCisJCTsKKwkJZGl2IGVzaQorCQl4b3IgY3gsY3gKKwkJeGNoZyBjeCxkeAkJOyBDWCA8LSBzZWN0b3IgaW5kZXggKDAtYmFzZWQpCisJCQkJCTsgRURYIDwtIDAKKwkJOyBlYXggPSB0cmFjayAjCisJCWRpdiBlZGkJCQk7IENvbnZlcnQgdHJhY2sgdG8gaGVhZC9jeWwKKworCQk7IFdlIHNob3VsZCB0ZXN0IHRoaXMsIGJ1dCBpdCBkb2Vzbid0IGZpdC4uLgorCQk7IGNtcCBlYXgsMTAyMworCQk7IGphIC5lcnJvcgorCisJCTsKKwkJOyBOb3cgd2UgaGF2ZSBBWCA9IGN5bCwgRFggPSBoZWFkLCBDWCA9IHNlY3RvciAoMC1iYXNlZCksCisJCTsgQlAgPSBzZWN0b3JzIHRvIHRyYW5zZmVyLCBTSSA9IGJzU2VjUGVyVHJhY2ssCisJCTsgRVM6QlggPSBkYXRhIHRhcmdldAorCQk7CisKKwkJY2FsbCBtYXh0cmFucwkJCTsgRW5mb3JjZSBtYXhpbXVtIHRyYW5zZmVyIHNpemUKKworCQk7IE11c3Qgbm90IGNyb3NzIHRyYWNrIGJvdW5kYXJpZXMsIHNvIEJQIDw9IFNJLUNYCisJCXN1YiBzaSxjeAorCQljbXAgYnAsc2kKKwkJam5hIC5icF9vaworCQltb3YgYnAsc2kKKy5icF9vazoKKworCQlzaGwgYWgsNgkJOyBCZWNhdXNlIElCTSB3YXMgU1RPT1BJRAorCQkJCQk7IGFuZCB0aG91Z2h0IDggYml0cyB3ZXJlIGVub3VnaAorCQkJCQk7IHRoZW4gdGhvdWdodCAxMCBiaXRzIHdlcmUgZW5vdWdoLi4uCisJCWluYyBjeAkJCTsgU2VjdG9yIG51bWJlcnMgYXJlIDEtYmFzZWQsIHNpZ2gKKwkJb3IgY2wsYWgKKwkJbW92IGNoLGFsCisJCW1vdiBkaCxkbAorCQltb3YgZGwsW0RyaXZlTnVtYmVyXQorCQl4Y2hnIGF4LGJwCQk7IFNlY3RvciB0byB0cmFuc2ZlciBjb3VudAorCQltb3YgYWgsMDJoCQk7IFJlYWQgc2VjdG9ycworCQltb3YgYnAscmV0cnlfY291bnQKKy5yZXRyeToKKwkJcHVzaGFkCisJCWNhbGwgaW50MTMKKwkJcG9wYWQKKwkJamMgLmVycm9yCisucmVzdW1lOgorCQltb3Z6eCBlY3gsYWwJCTsgRUNYIDwtIHNlY3RvcnMgdHJhbnNmZXJyZWQKKwkJc2hsIGF4LDkJCTsgQ29udmVydCBzZWN0b3JzIGluIEFMIHRvIGJ5dGVzIGluIEFYCisJCXBvcCBieAorCQlhZGQgYngsYXgKKwkJcG9wIGJwCisJCXBvcCBlYXgKKwkJcG9wIGVkeAorCQlhZGQgZWF4LGVjeAorCQlzdWIgYnAsY3gKKwkJam56IC5sb29wCisJCXJldAorCisuZXJyb3I6CisJCWRlYyBicAorCQlqbnogLnJldHJ5CisKKwkJeGNoZyBheCxicAkJOyBTZWN0b3JzIHRyYW5zZmVycmVkIDwtIDAKKwkJc2hyIHdvcmQgW01heFRyYW5zZmVyXSwxCisJCWpueiAucmVzdW1lCisJCWptcCBkaXNrX2Vycm9yCisKKzsKKzsgVHJ1bmNhdGUgQlAgdG8gTWF4VHJhbnNmZXIKKzsKK21heHRyYW5zOgorCQljbXAgYnAsW01heFRyYW5zZmVyXQorCQlqbmEgLm9rCisJCW1vdiBicCxbTWF4VHJhbnNmZXJdCisub2s6CQlyZXQKKworJWVuZGlmCisKKzsKKzsgVGhpcyBpcyB0aGUgdmFyaWFudCB3ZSB1c2UgZm9yIHJlYWwgQ0QtUk9NczoKKzsgTEJBLCAySyBzZWN0b3JzLCBzb21lIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcuCis7CitnZXRsaW5zZWNfY2Ryb206CisJCW1vdiBzaSxkYXBhCQkJOyBMb2FkIHVwIHRoZSBEQVBBCisJCW1vdiBbc2krNF0sYngKKwkJbW92IFtzaSs2XSxlcworCQltb3YgW3NpKzhdLGVheAorLmxvb3A6CisJCXB1c2ggYnAJCQkJOyBTZWN0b3JzIGxlZnQKKwkJY21wIGJwLFtNYXhUcmFuc2ZlckNEXQorCQlqYmUgLmJwX29rCisJCW1vdiBicCxbTWF4VHJhbnNmZXJDRF0KKy5icF9vazoKKwkJbW92IFtzaSsyXSxicAorCQlwdXNoIHNpCisJCW1vdiBkbCxbRHJpdmVOdW1iZXJdCisJCW1vdiBhaCw0MmgJCQk7IEV4dGVuZGVkIFJlYWQKKwkJY2FsbCB4aW50MTMKKwkJcG9wIHNpCisJCXBvcCBicAorCQltb3Z6eCBlYXgsd29yZCBbc2krMl0JCTsgU2VjdG9ycyB3ZSByZWFkCisJCWFkZCBbc2krOF0sZWF4CQkJOyBBZHZhbmNlIHNlY3RvciBwb2ludGVyCisJCXN1YiBicCxheAkJCTsgU2VjdG9ycyBsZWZ0CisJCXNobCBheCxTRUNUT1JfU0hJRlQtNAkJOyAyMDQ4LWJ5dGUgc2VjdG9ycyAtPiBzZWdtZW50CisJCWFkZCBbc2krNl0sYXgJCQk7IEFkdmFuY2UgYnVmZmVyIHBvaW50ZXIKKwkJYW5kIGJwLGJwCisJCWpueiAubG9vcAorCQltb3YgZWF4LFtzaSs4XQkJCTsgTmV4dCBzZWN0b3IKKwkJcmV0CisKKwkJOyBJTlQgMTNoIHdpdGggcmV0cnkKK3hpbnQxMzoJCW1vdiBieXRlIFtSZXRyeUNvdW50XSxyZXRyeV9jb3VudAorLnRyeToJCXB1c2hhZAorCQljYWxsIGludDEzCisJCWpjIC5lcnJvcgorCQlhZGQgc3AsYnl0ZSA4KjQJCQk7IENsZWFuIHVwIHN0YWNrCisJCXJldAorLmVycm9yOgorCQltb3YgW0Rpc2tFcnJvcl0sYWgJCTsgU2F2ZSBlcnJvciBjb2RlCisJCXBvcGFkCisJCW1vdiBbRGlza1N5c10sYXgJCTsgU2F2ZSBzeXN0ZW0gY2FsbCBudW1iZXIKKwkJZGVjIGJ5dGUgW1JldHJ5Q291bnRdCisJCWp6IC5yZWFsX2Vycm9yCisJCXB1c2ggYXgKKwkJbW92IGFsLFtSZXRyeUNvdW50XQorCQltb3YgYWgsW2RhcGErMl0JCQk7IFNlY3RvciB0cmFuc2ZlciBjb3VudAorCQljbXAgYWwsMgkJCTsgT25seSAyIGF0dGVtcHRzIGxlZnQKKwkJamEgLm5vZGFuZ2VyCisJCW1vdiBhaCwxCQkJOyBEcm9wIHRyYW5zZmVyIHNpemUgdG8gMQorCQlqbXAgc2hvcnQgLnNldHNpemUKKy5ub2RhbmdlcjoKKwkJY21wIGFsLHJldHJ5X2NvdW50LTIKKwkJamEgLmFnYWluCQkJOyBGaXJzdCB0aW1lLCBqdXN0IHRyeSBhZ2FpbgorCQlzaHIgYWgsMQkJCTsgT3RoZXJ3aXNlLCB0cnkgdG8gcmVkdWNlCisJCWFkYyBhaCwwCQkJOyB0aGUgbWF4IHRyYW5zZmVyIHNpemUsIGJ1dCBub3QgdG8gMAorLnNldHNpemU6CisJCW1vdiBbTWF4VHJhbnNmZXJDRF0sYWgKKwkJbW92IFtkYXBhKzJdLGFoCisuYWdhaW46CisJCXBvcCBheAorCQlqbXAgLnRyeQorCisucmVhbF9lcnJvcjoJbW92IHNpLGRpc2tlcnJfbXNnCisJCWNhbGwgd3JpdGVtc2cKKwkJbW92IGFsLFtEaXNrRXJyb3JdCisJCWNhbGwgd3JpdGVoZXgyCisJCW1vdiBzaSxvbmNhbGxfc3RyCisJCWNhbGwgd3JpdGVzdHJfZWFybHkKKwkJbW92IGF4LFtEaXNrU3lzXQorCQljYWxsIHdyaXRlaGV4NAorCQltb3Ygc2ksb25kcml2ZV9zdHIKKwkJY2FsbCB3cml0ZXN0cl9lYXJseQorCQltb3YgYWwsZGwKKwkJY2FsbCB3cml0ZWhleDIKKwkJY2FsbCBjcmxmX2Vhcmx5CisJCTsgRmFsbCB0aHJvdWdoIHRvIGthYm9vbQorCis7Cis7IGthYm9vbTogd3JpdGUgYSBtZXNzYWdlIGFuZCBiYWlsIG91dC4gIFdhaXQgZm9yIGEgdXNlciBrZXlwcmVzcywKKzsJICB0aGVuIGRvIGEgaGFyZCByZWJvb3QuCis7CisJCWdsb2JhbCBrYWJvb20KK2Rpc2tfZXJyb3I6CitrYWJvb206CisJCVJFU0VUX1NUQUNLX0FORF9TRUdTIEFYCisJCW1vdiBzaSxiYWlsbXNnCisJCXBtX2NhbGwgcG1fd3JpdGVzdHIKKwkJcG1fY2FsbCBwbV9nZXRjaGFyCisJCWNsaQorCQltb3Ygd29yZCBbQklPU19tYWdpY10sMAk7IENvbGQgcmVib290CisJCWptcCAwRjAwMGg6MEZGRjBoCTsgUmVzZXQgdmVjdG9yIGFkZHJlc3MKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAgQ29tbW9uIG1vZHVsZXMgbmVlZGVkIGluIHRoZSBmaXJzdCBzZWN0b3IKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJWluY2x1ZGUgIndyaXRlaGV4LmluYyIJCTsgSGV4YWRlY2ltYWwgb3V0cHV0CisKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRGF0YSB0aGF0IG5lZWRzIHRvIGJlIGluIHRoZSBmaXJzdCBzZWN0b3IKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlnbG9iYWwgc3lzbGludXhfYmFubmVyLCBjb3B5cmlnaHRfc3RyCitzeXNsaW51eF9iYW5uZXIJZGIgQ1IsIExGLCBNWV9OQU1FLCAnICcsIFZFUlNJT05fU1RSLCAnICcsIERBVEVfU1RSLCAnICcsIDAKK2NvcHlyaWdodF9zdHIgICBkYiAnIENvcHlyaWdodCAoQykgMTk5NC0nCisJCWFzY2lpZGVjIFlFQVIKKwkJZGIgJyBILiBQZXRlciBBbnZpbiBldCBhbCcsIENSLCBMRiwgMAoraXNvbGludXhfc3RyCWRiICdpc29saW51eDogJywgMAorJWlmZGVmIERFQlVHX01FU1NBR0VTCitzdGFydHVwX21zZzoJZGIgJ1N0YXJ0aW5nIHVwLCBETCA9ICcsIDAKK3NwZWNfb2tfbXNnOglkYiAnTG9hZGVkIHNwZWMgcGFja2V0IE9LLCBkcml2ZSA9ICcsIDAKK3NlY3NpemVfbXNnOglkYiAnU2VjdG9yIHNpemUgJywgMAorb2Zmc2V0X21zZzoJZGIgJ01haW4gaW1hZ2UgTEJBID0gJywgMAordmVyaWZ5X21zZzoJZGIgJ0ltYWdlIGNzdW0gdmVyaWZpZWQuJywgQ1IsIExGLCAwCithbGxyZWFkX21zZwlkYiAnSW1hZ2UgcmVhZCwganVtcGluZyB0byBtYWluIGNvZGUuLi4nLCBDUiwgTEYsIDAKKyVlbmRpZgorbm9pbmZvdGFibGVfbXNnCWRiICdObyBib290IGluZm8gdGFibGUsIGFzc3VtaW5nIHNpbmdsZSBzZXNzaW9uIGRpc2suLi4nLCBDUiwgTEYsIDAKK25vaW5mb2luc3BlY19tc2cgZGIgJ1NwZWMgcGFja2V0IG1pc3NpbmcgTEJBIGluZm9ybWF0aW9uLCB0cnlpbmcgdG8gd2luZyBpdC4uLicsIENSLCBMRiwgMAorc3BlY19lcnJfbXNnOglkYiAnTG9hZGluZyBzcGVjIHBhY2tldCBmYWlsZWQsIHRyeWluZyB0byB3aW5nIGl0Li4uJywgQ1IsIExGLCAwCittYXliZV9tc2c6CWRiICdGb3VuZCBzb21ldGhpbmcgYXQgZHJpdmUgPSAnLCAwCithbHJpZ2h0X21zZzoJZGIgJ0xvb2tzIHJlYXNvbmFibGUsIGNvbnRpbnVpbmcuLi4nLCBDUiwgTEYsIDAKK25vc3BlY19tc2cJZGIgJ0V4dHJlbWVseSBicm9rZW4gQklPUyBkZXRlY3RlZCwgbGFzdCBhdHRlbXB0IHdpdGggZHJpdmUgPSAnLCAwCitub3RoaW5nX21zZzoJZGIgJ0ZhaWxlZCB0byBsb2NhdGUgQ0QtUk9NIGRldmljZTsgYm9vdCBmYWlsZWQuJywgQ1IsIExGCit0cnlzYm1fbXNnCWRiICdTZWUgaHR0cDovL3N5c2xpbnV4Lnp5dG9yLmNvbS9zYm0gZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgQ1IsIExGLCAwCitkaXNrZXJyX21zZzoJZGIgJ0Rpc2sgZXJyb3IgJywgMAorb25jYWxsX3N0cjoJZGIgJywgQVggPSAnLDAKK29uZHJpdmVfc3RyOglkYiAnLCBkcml2ZSAnLCAwCitjaGVja2Vycl9tc2c6CWRiICdJbWFnZSBjaGVja3N1bSBlcnJvciwgc29ycnkuLi4nLCBDUiwgTEYsIDAKKworZXJyX2Jvb3RmYWlsZWQJZGIgQ1IsIExGLCAnQm9vdCBmYWlsZWQ6IHByZXNzIGEga2V5IHRvIHJldHJ5Li4uJworYmFpbG1zZwkJZXF1IGVycl9ib290ZmFpbGVkCitjcmxmX21zZwlkYiBDUiwgTEYKK251bGxfbXNnCWRiIDAKKworYmlvc19jZHJvbV9zdHIJZGIgJ0VUQ0QnLCAwCislaWZuZGVmIERFQlVHX01FU1NBR0VTCitiaW9zX2NiaW9zX3N0cglkYiAnQ0hERCcsIDAKK2Jpb3NfZWJpb3Nfc3RyCWRiICdFSEREJyAsMAorJWVuZGlmCisKKwkJYWxpZ256IDQKKwkJZ2xvYmFsIGJpb3NfY2Ryb20KK2Jpb3NfY2Ryb206CWR3IGdldGxpbnNlY19jZHJvbSwgYmlvc19jZHJvbV9zdHIKKyVpZm5kZWYgREVCVUdfTUVTU0FHRVMKK2Jpb3NfY2Jpb3M6CWR3IGdldGxpbnNlY19jYmlvcywgYmlvc19jYmlvc19zdHIKK2Jpb3NfZWJpb3M6CWR3IGdldGxpbnNlY19lYmlvcywgYmlvc19lYmlvc19zdHIKKyVlbmRpZgorCis7IE1heGltdW0gdHJhbnNmZXIgc2l6ZQorTWF4VHJhbnNmZXIJZHcgMTI3CQkJCTsgSGFyZCBkaXNrIG1vZGVzCitNYXhUcmFuc2ZlckNECWR3IDMyCQkJCTsgQ0QgbW9kZQorCitybF9jaGVja3B0CWVxdSAkCQkJCTsgTXVzdCBiZSA8PSA4MDBoCisKKwkJOyBUaGlzIHBhZHMgdG8gdGhlIGVuZCBvZiBzZWN0b3IgMCBhbmQgZXJyb3JzIG91dCBvbgorCQk7IG92ZXJmbG93LgorCQl0aW1lcyAyMDQ4LSgkLSQkKSBkYiAwCisKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAgRW5kIG9mIGNvZGUgYW5kIGRhdGEgdGhhdCBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCBzZWN0b3IKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCXNlY3Rpb24gLnRleHQxNgorCithbGxfcmVhZDoKKworOyBUZXN0IHRyYWNlcnMKKwkJVFJBQ0VSICdUJworCQlUUkFDRVIgJz4nCisKKzsKKzsgQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUKKzsKKyVpbmNsdWRlICJpbml0LmluYyIKKworOyBUZWxsIHRoZSB1c2VyIHdlIGdvdCB0aGlzIGZhci4uLgorJWlmbmRlZiBERUJVR19NRVNTQUdFUwkJCTsgR2V0cyBtZXNzeSB3aXRoIGRlYnVnZ2luZyBvbgorCQltb3Ygc2ksY29weXJpZ2h0X3N0cgorCQlwbV9jYWxsIHBtX3dyaXRlc3RyCislZW5kaWYKKworOworOyBOb3cgd2UncmUgYWxsIHNldCB0byBzdGFydCB3aXRoIG91ciAqcmVhbCogYnVzaW5lc3MuCUZpcnN0IGxvYWQgdGhlCis7IGNvbmZpZ3VyYXRpb24gZmlsZSAoaWYgYW55KSBhbmQgcGFyc2UgaXQuCis7Cis7IEluIHByZXZpb3VzIHZlcnNpb25zIEkgYXZvaWRlZCB1c2luZyAzMi1iaXQgcmVnaXN0ZXJzIGJlY2F1c2Ugb2YgYQorOyBydW1vdXIgc29tZSBCSU9TZXMgY2xvYmJlcmVkIHRoZSB1cHBlciBoYWxmIG9mIDMyLWJpdCByZWdpc3RlcnMgYXQKKzsgcmFuZG9tLiAgSSBmaWd1cmUsIHRob3VnaCwgdGhhdCBpZiB0aGVyZSBhcmUgYW55IG9mIHRob3NlIHN0aWxsIGxlZnQKKzsgdGhleSBwcm9iYWJseSB3b24ndCBiZSB0cnlpbmcgdG8gaW5zdGFsbCBMaW51eCBvbiB0aGVtLi4uCis7Cis7IFRoZSBjb2RlIGlzIHN0aWxsIHJpcGUgd2l0aCAxNi1iaXRpc21zLCB0aG91Z2guICBOb3Qgd29ydGggdGhlIGhhc3NsZQorOyB0byB0YWtlJ20gb3V0LiAgSW4gZmFjdCwgd2UgbWF5IHdhbnQgdG8gcHV0IHRoZW0gYmFjayBpZiB3ZSdyZSBnb2luZworOyB0byBib290IEVMS1MgYXQgc29tZSBwb2ludC4KKzsKKworOworOyBOb3csIHdlIG5lZWQgdG8gc25pZmYgb3V0IHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBkYXRhIHN0cnVjdHVyZXMuCis7IG1raXNvZnMgZ2F2ZSB1cyBhIHBvaW50ZXIgdG8gdGhlIHByaW1hcnkgdm9sdW1lIGRlc2NyaXB0b3IKKzsgKHdoaWNoIHdpbGwgYmUgYXQgMTYgb25seSBmb3IgYSBzaW5nbGUtc2Vzc2lvbiBkaXNrISk7IGZyb20gdGhlIFBWRAorOyB3ZSBzaG91bGQgYmUgYWJsZSB0byBmaW5kIHRoZSByZXN0IG9mIHdoYXQgd2UgbmVlZCB0byBrbm93LgorOworaW5pdF9mczoKKwkJcHVzaGFkCisJICAgICAgICBtb3YgZWF4LFJPT1RfRlNfT1BTCisJICAgICAgICBtb3YgZGwsW0RyaXZlTnVtYmVyXQorICAgICAgICAgICAgICAgCWNtcCB3b3JkIFtCSU9TVHlwZV0sYmlvc19jZHJvbQorICAgICAgICAgICAgICAgIHNldGUgZGggICAgICAgICAgICAgICAgICAgICAgICA7IDEgZm9yIGNkcm9tLCAwIGZvciBoeWJyaWQgbW9kZQorCQlqbmUgLmh5YnJpZAorCQltb3Z6eCBlYnAsd29yZCBbTWF4VHJhbnNmZXJDRF0KKwkJam1wIC5jb21tb24KKy5oeWJyaWQ6CisJCW1vdnp4IGVicCx3b3JkIFtNYXhUcmFuc2Zlcl0KKy5jb21tb246CisJICAgICAgICBtb3YgZWN4LFtIaWRkZW5dCisJICAgICAgICBtb3YgZWJ4LFtIaWRkZW4rNF0KKyAgICAgICAgICAgICAgICBtb3Ygc2ksW2JzSGVhZHNdCisJCW1vdiBkaSxbYnNTZWNQZXJUcmFja10KKwkJcG1fY2FsbCBwbV9mc19pbml0CisJCXBtX2NhbGwgbG9hZF9lbnYzMgorZW50ZXJfY29tbWFuZDoKK2F1dG9fYm9vdDoKKwkJam1wIGthYm9vbQkJOyBsb2FkX2VudjMyKCkgc2hvdWxkIG5ldmVyIHJldHVybi4gSWYKKwkJICAgICAgICAgICAgICAgICAgICAgICAgOyBpdCBkb2VzLCB0aGVuIGthYm9vbSEKKwkJcG9wYWQKKworCQlzZWN0aW9uIC5yb2RhdGEKKwkJYWxpZ256IDQKK1JPT1RfRlNfT1BTOgorCQlleHRlcm4gaXNvX2ZzX29wcworCQlkZCBpc29fZnNfb3BzCisJCWRkIDAKKworCQlzZWN0aW9uIC50ZXh0MTYKKworJWlmZGVmIERFQlVHX1RSQUNFUlMKKzsKKzsgZGVidWcgaGFjayB0byBwcmludCBhIGNoYXJhY3RlciB3aXRoIG1pbmltYWwgY29kZSBpbXBhY3QKKzsKK2RlYnVnX3RyYWNlcjoJcHVzaGFkCisJCXB1c2hmZAorCQltb3YgYnAsc3AKKwkJbW92IGJ4LFticCs5KjRdCQk7IEdldCByZXR1cm4gYWRkcmVzcworCQltb3YgYWwsW2NzOmJ4XQkJOyBHZXQgZGF0YSBieXRlCisJCWluYyB3b3JkIFticCs5KjRdCTsgUmV0dXJuIHRvIGFmdGVyIGRhdGEgYnl0ZQorCQljYWxsIHdyaXRlY2hyCisJCXBvcGZkCisJCXBvcGFkCisJCXJldAorJWVuZGlmCTsgREVCVUdfVFJBQ0VSUworCisJCXNlY3Rpb24gLmJzczE2CisJCWFsaWduYiA0CitUaGlzS2JkVG8JcmVzZCAxCQkJOyBUZW1wb3JhcnkgaG9sZGVyIGZvciBLYmRUaW1lb3V0CitUaGlzVG90YWxUbwlyZXNkIDEJCQk7IFRlbXBvcmFyeSBob2xkZXIgZm9yIFRvdGFsVGltZW91dAorS2VybmVsRXh0UHRyCXJlc3cgMQkJCTsgRHVyaW5nIHNlYXJjaCwgZmluYWwgbnVsbCBwb2ludGVyCitGdW5jRmxhZwlyZXNiIDEJCQk7IEVzY2FwZSBzZXF1ZW5jZXMgcmVjZWl2ZWQgZnJvbSBrZXlib2FyZAorS2VybmVsVHlwZQlyZXNiIDEJCQk7IEtlcm5lbCB0eXBlLCBmcm9tIHZrZXJuZWwsIGlmIGtub3duCisJCWdsb2JhbCBLZXJuZWxOYW1lCitLZXJuZWxOYW1lCXJlc2IgRklMRU5BTUVfTUFYCTsgTWFuZ2xlZCBuYW1lIGZvciBrZXJuZWwKKworCQlzZWN0aW9uIC50ZXh0MTYKKzsKKzsgQ09NMzIgdmVzdGlnaWFsIGRhdGEgc3RydWN0dXJlCis7CislaW5jbHVkZSAiY29tMzIuaW5jIgorCis7Cis7IENvbW1vbiBsb2NhbCBib290IGNvZGUKKzsKKyVpbmNsdWRlICJsb2NhbGJvb3QuaW5jIgorCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7ICBDb21tb24gbW9kdWxlcworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislaW5jbHVkZSAiY29tbW9uLmluYyIJCTsgVW5pdmVyc2FsIG1vZHVsZXMKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAgQmVnaW4gZGF0YSBzZWN0aW9uCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJc2VjdGlvbiAuZGF0YTE2CitlcnJfZGlza19pbWFnZQlkYiAnQ2Fubm90IGxvYWQgZGlzayBpbWFnZSAoaW52YWxpZCBmaWxlKT8nLCBDUiwgTEYsIDAKKworCQlzZWN0aW9uIC5ic3MxNgorCQlnbG9iYWwgT3JpZ0ZEQ1RhYlB0cgorT3JpZ0ZEQ1RhYlB0cglyZXNkIDEJCQk7IEtlZXAgYmlvc19jbGVhbnVwX2hhcmR3YXJlKCkgaG9uZXN0CmRpZmYgLS1naXQgYS9jb3JlL2thYm9vbS5jIGIvY29yZS9rYWJvb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzE1MGU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9rYWJvb20uYwpAQCAtMCwwICsxLDI4IEBACisvKgorICoga2Fib29tLmMKKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorCisjaWYgZGVmaW5lZChDT1JFX0RFQlVHKSB8fCBkZWZpbmVkKERFQlVHX1BPUlQpCisKKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisKK19fZXhwb3J0IF9fbm9yZXR1cm4gX19iYWRfU0VHKGNvbnN0IHZvbGF0aWxlIHZvaWQgKnApCit7CisgICAgZHByaW50ZigiU0VHKCkgcGFzc2VkIGFuIGludmFsaWQgcG9pbnRlcjogJXBcbiIsIHApOworICAgIGthYm9vbSgpOworfQorCisjZW5kaWYKKworI3VuZGVmIGthYm9vbQorCitfX2V4cG9ydCBfX25vcmV0dXJuIF9rYWJvb20odm9pZCkKK3sKKyAgICBleHRlcm4gdm9pZCBrYWJvb20odm9pZCk7CisgICAgY2FsbDE2KGthYm9vbSwgJnplcm9fcmVncywgTlVMTCk7CisgICAgLyogRG8gdGhpcyBpZiBrYWJvb20gc29tZWhvdyByZXR1cm5zLi4uICovCisgICAgZm9yICg7OykKKwlhc20gdm9sYXRpbGUoImhsdCIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9rZXJuZWwuaW5jIGIvY29yZS9rZXJuZWwuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWM3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2tlcm5lbC5pbmMKQEAgLTAsMCArMSwxMTUgQEAKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OworOzsgICBDb3B5cmlnaHQgMTk5NC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7ICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCis7OyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOzsKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzs7Cis7OyBrZXJuZWwuaW5jCis7OworOzsgSGVhZGVyIGZpbGUgZm9yIHRoZSBrZXJuZWwgaW50ZXJmYWNlIGRlZmluaXRpb25zCis7OworCislaWZuZGVmIF9LRVJORUxfSU5DCislZGVmaW5lIF9LRVJORUxfSU5DCisKKzs7Cis7OyBTdHJ1Y3R1cmUgb2YgdGhlIHJlYWxfbW9kZV9zZWcKKzs7CisKKwkJc3RydWMgcmVhbF9tb2RlX3NlZ190CisJCXJlc2IgMjBoLSgkLSQkKQkJOyBvcmcgMjBoCitrZXJuX2NtZF9tYWdpYwlyZXN3IDEJCQk7IDAwMjAgTWFnaWMgIyBmb3IgY29tbWFuZCBsaW5lCitrZXJuX2NtZF9vZmZzZXQgcmVzdyAxCQkJOyAwMDIyIE9mZnNldCBmb3Iga2VybmVsIGNvbW1hbmQgbGluZQorCQlyZXNiIDQ5Ny0oJC0kJCkJCTsgb3JnIDQ5N2QKK2JzX3NldHVwc2VjcwlyZXNiIDEJCQk7IDAxRjEgU2VjdG9ycyBmb3Igc2V0dXAgY29kZSAoMCAtPiA0KQorYnNfcm9vdGZsYWdzCXJlc3cgMQkJCTsgMDFGMiBSb290IHJlYWRvbmx5IGZsYWcKK2JzX3N5c3NpemUJcmVzdyAxCQkJOyAwMUY0Citic19zd2FwZGV2CXJlc3cgMQkJCTsgMDFGNiBTd2FwIGRldmljZSAob2Jzb2xldGUpCitic19yYW1zaXplCXJlc3cgMQkJCTsgMDFGOCBSYW1kaXNrIGZsYWdzLCBmb3JtZXJseSByYW1kaXNrIHNpemUKK2JzX3ZpZG1vZGUJcmVzdyAxCQkJOyAwMUZBIFZpZGVvIG1vZGUKK2JzX3Jvb3RkZXYJcmVzdyAxCQkJOyAwMUZDIFJvb3QgZGV2aWNlCitic19ib290c2lnbglyZXN3IDEJCQk7IDAxRkUgQm9vdCBzZWN0b3Igc2lnbmF0dXJlICgwQUE1NWgpCitzdV9qdW1wCQlyZXNiIDEJCQk7IDAyMDAgMEVCaAorc3VfanVtcDIJcmVzYiAxCQkJOyAwMjAxIFNpemUgb2YgZm9sbG93aW5nIGhlYWRlcgorc3VfaGVhZGVyCXJlc2QgMQkJCTsgMDIwMiBOZXcgc2V0dXAgY29kZTogaGVhZGVyCitzdV92ZXJzaW9uCXJlc3cgMQkJCTsgMDIwNiBTZWUgbGludXgvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUworc3Vfc3dpdGNoCXJlc3cgMQkJCTsgMDIwOAorc3Vfc2V0dXBzZWcJcmVzdyAxCQkJOyAwMjBBCitzdV9zdGFydHN5cwlyZXN3IDEJCQk7IDAyMEMKK3N1X2t2ZXIJCXJlc3cgMQkJCTsgMDIwRSBLZXJuZWwgdmVyc2lvbiBwb2ludGVyCitzdV9sb2FkZXIJcmVzYiAxCQkJOyAwMjEwIExvYWRlciBJRAorc3VfbG9hZGZsYWdzCXJlc2IgMQkJCTsgMDIxMSBMb2FkIGhpZ2ggZmxhZworc3VfbW92ZXNpemUJcmVzdyAxCQkJOyAwMjEyCitzdV9jb2RlMzJzdGFydAlyZXNkIDEJCQk7IDAyMTQgU3RhcnQgb2YgY29kZSBsb2FkZWQgaGlnaAorc3VfcmFtZGlza2F0CXJlc2QgMQkJCTsgMDIxOCBTdGFydCBvZiBpbml0aWFsIHJhbWRpc2sKK3N1X3JhbWRpc2tsZW4JcmVzZCAxCQkJOyAwMjFDIExlbmd0aCBvZiBpbml0aWFsIHJhbWRpc2sKK3N1X2Jza2x1Z2VvZmZzCXJlc3cgMQkJCTsgMDIyMAorc3VfYnNrbHVnZXNlZwlyZXN3IDEJCQk7IDAyMjIKK3N1X2hlYXBlbmQJcmVzdyAxCQkJOyAwMjI0CitzdV9wYWQxCQlyZXN3IDEJCQk7IDAyMjYKK3N1X2NtZF9saW5lX3B0cglyZXNkIDEJCQk7IDAyMjgKK3N1X3JhbWRpc2tfbWF4CXJlc2QgMQkJCTsgMDIyQworCQlyZXNiICgwZjgwMGgtMTIpLSgkLSQkKQorbGludXhfc3RhY2sJZXF1ICQJCQk7IEY3RjQKK2xpbnV4X2ZkY3RhYglyZXNiIDEyCitjbWRfbGluZV9oZXJlCWVxdSAkCQkJOyBGODAwIFNob3VsZCBiZSBvdXQgb2YgdGhlIHdheQorCQllbmRzdHJ1YworCis7Cis7IE9sZCBrZXJuZWwgY29tbWFuZCBsaW5lIHNpZ25hdHVyZQorOworQ01EX01BR0lDCWVxdSAwQTMzRmgJCTsgQ29tbWFuZCBsaW5lIG1hZ2ljCisKKzsKKzsgSWYgd2UncmUgbG9hZGluZyB0aGUgY29tbWFuZCBsaW5lIG9sZC1zdHlsZSwgd2UgbmVlZCBhIHNtYWxsZXIKKzsgaGVhcC4KKzsKK29sZF9jbWRfbGluZV9oZXJlIGVxdSA5ODAwaAorb2xkX21heF9jbWRfbGVuICAgZXF1IDIwNDcKK29sZF9saW51eF9mZGN0YWIgIGVxdSBvbGRfY21kX2xpbmVfaGVyZS0xMgorb2xkX2xpbnV4X3N0YWNrICAgZXF1IG9sZF9saW51eF9mZGN0YWIKKworOworOyBNYWdpYyBudW1iZXIgb2Ygc3VfaGVhZGVyIGZpZWxkCis7CitIRUFERVJfSUQgICAgICAgZXF1ICdIZHJTJwkJOyBIZHJTIChpbiBsaXR0bGVlbmRpYW4gaGV4KQorCis7Cis7IEZsYWdzIGZvciB0aGUgc3VfbG9hZGZsYWdzIGZpZWxkCis7CitMT0FEX0hJR0gJZXF1IDAxaAkJCTsgTGFyZ2Uga2VybmVsLCBsb2FkIGhpZ2gKK1FVSUVUX0ZMQUcJZXF1IDIwaAkJCTsgUXVpZXQgdGhlIGtlcm5lbAorS0VFUF9TRUdNRU5UUwllcXUgNDBoCQkJOyBEb24ndCByZWxvYWQgc2VnbWVudHMKK0NBTl9VU0VfSEVBUCAgICBlcXUgODBoICAgICAgICAgICAgICAgICA7IEJvb3QgbG9hZGVyIHJlcG9ydHMgaGVhcCBzaXplCisKKzsKKzsgSUQgY29kZXMgZm9yIHZhcmlvdXMgbW9kdWxlcworOworc3lzbGludXhfaWQJZXF1IDAzMWgJCTsgMyA9IFNZU0xJTlVYIGZhbWlseTsgMSA9IFNZU0xJTlVYCitweGVsaW51eF9pZAllcXUgMDMyaAkJOyAzID0gU1lTTElOVVggZmFtaWx5OyAyID0gUFhFTElOVVgKK2lzb2xpbnV4X2lkCWVxdSAwMzNoCQk7IDMgPSBTWVNMSU5VWCBmYW1pbHk7IDMgPSBJU09MSU5VWAorZXh0bGludXhfaWQJZXF1IDAzNGgJCTsgMyA9IFNZU0xJTlVYIGZhbWlseTsgNCA9IEVYVExJTlVYCisKKzsKKzsgVHlwZXMgb2Ygdmtlcm5lbHMKKzsKK1ZLX0xPQ0FMQk9PVAllcXUgLTEJCQk7IGxvY2FsYm9vdCAobm8gYWN0dWFsIGtlcm5lbCBsb2FkZWQpCitWS19LRVJORUwJZXF1IDAJCQk7IENob29zZSBieSBmaWxlbmFtZQorVktfTElOVVgJZXF1IDEJCQk7IExpbnV4IGtlcm5lbCBpbWFnZQorVktfQk9PVAkJZXF1IDIJCQk7IEJvb3Qgc2VjdG9yCitWS19CU1MJCWVxdSAzCQkJOyBCU1MgYm9vdCBzZWN0b3IKK1ZLX1BYRQkJZXF1IDQJCQk7IFBYRSBOQlAKK1ZLX0ZESU1BR0UJZXF1IDUJCQk7IEZsb3BweSBkaXNrIGltYWdlCitWS19DT01CT09UCWVxdSA2CQkJOyBDT01CT09UIGltYWdlCitWS19DT00zMgllcXUgNwkJCTsgQ09NMzIgaW1hZ2UKK1ZLX0NPTkZJRwllcXUgOAkJCTsgQ29uZmlndXJhdGlvbiBmaWxlCitWS19UWVBFUwllcXUgOQkJCTsgTnVtYmVyIG9mIFZLIHR5cGVzCisKKyVlbmRpZiA7IF9LRVJORUxfSU5DCmRpZmYgLS1naXQgYS9jb3JlL2tleXdvcmRzIGIvY29yZS9rZXl3b3JkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWYwMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9rZXl3b3JkcwpAQCAtMCwwICsxLDUxIEBACittZW51Cit0ZXh0CitpbmNsdWRlCithcHBlbmQKK2luaXRyZAorY29uZmlnCitkZWZhdWx0Cit1aQorZGlzcGxheQorZm9udAoraW1wbGljaXQKK2lwYXBwZW5kCitrYmRtYXAKK2tlcm5lbAorbGludXgKK2Jvb3QKK2JzcworcHhlCitweGVyZXRyeQorZmRpbWFnZQorY29tYm9vdAorY29tMzIKK2xhYmVsCitsb2NhbGJvb3QKK3Byb21wdAorc2F5CitzZXJpYWwKK2NvbnNvbGUKK3RpbWVvdXQKK3RvdGFsdGltZW91dAorYWxsb3dvcHRpb25zCitvbnRpbWVvdXQKK29uZXJyb3IKK25vZXNjYXBlCitub2NvbXBsZXRlCitub2hhbHQKK3N5c2FwcGVuZAorc2VuZGNvb2tpZXMKK2YwCitmMQorZjIKK2YzCitmNAorZjUKK2Y2CitmNworZjgKK2Y5CitmMTAKK2YxMQorZjEyCmRpZmYgLS1naXQgYS9jb3JlL2tleXdvcmRzLmluYyBiL2NvcmUva2V5d29yZHMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWNhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2tleXdvcmRzLmluYwpAQCAtMCwwICsxLDEwMiBAQAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKzs7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IGtleXdvcmRzLmluYworOzsKKzs7IENvbW1vbiBoZWFkZXIgZmlsZSBmb3IgdGhlIGhhbmRsaW5nIG9mIGtleXdvcmQgaGFzaCBhbmQgbWFjcm9zCis7OworCislaWZuZGVmIERFUEVORAkJOyBHZW5lcmF0ZWQgZmlsZQorJWluY2x1ZGUgImt3ZGhhc2guZ2VuIgorJWVuZGlmCisKKyVtYWNybyBrZXl3b3JkIDIKKwlkZCBoYXNoXyUxCTsgSGFzaCB2YWx1ZQorCWR3IDAJCTsgTm8gYXJndW1lbnQKKwlkdyAlMgkJOyBFbnRyeXBvaW50CislZW5kbWFjcm8KKworJW1hY3JvIGtleXdvcmQgMworCWRkIGhhc2hfJTEJOyBIYXNoIHZhbHVlCisJZHcgJTMJCTsgMTYtYml0IGFyZ3VtZW50CisJZHcgJTIJCTsgRW50cnlwb2ludAorJWVuZG1hY3JvCisKKyVtYWNybyBrZXl3b3JkIDQKKwlkZCBoYXNoXyUxCTsgSGFzaCB2YWx1ZQorCWRiICUzLCAlNAk7IDIgOC1iaXQgYXJndW1lbnRzCisJZHcgJTIJCTsgRW50cnlwb2ludAorJWVuZG1hY3JvCisKK2tleXdkX3NpemUJZXF1IDgJOyBCeXRlcyBwZXIga2V5d29yZAorCisJCWFsaWdueiA0CisKKyVkZWZpbmUgRktleU4obikgKEZLZXlOYW1lKygoKG4pLTEpIDw8IEZJTEVOQU1FX01BWF9MRzIpKQorCitrZXl3ZF90YWJsZToKKwkJa2V5d29yZCBtZW51LAkJcGNfY29tbWVudAorCQlrZXl3b3JkIHRleHQsCQlwY190ZXh0CisJCWtleXdvcmQgaW5jbHVkZSwJcGNfb3BlbmNtZCwJcGNfaW5jbHVkZQorCQlrZXl3b3JkIGFwcGVuZCwJCXBjX2FwcGVuZAorCQlrZXl3b3JkIGluaXRyZCwJCXBjX2ZpbGVuYW1lLAlJbml0UkQKKwkJa2V5d29yZCBkZWZhdWx0LAlwY19kZWZhdWx0LAkxCisJCWtleXdvcmQgdWksCQlwY19kZWZhdWx0LAkyCisJCWtleXdvcmQgZGlzcGxheSwJcGNfb3BlbmNtZCwJZ2V0X21zZ19maWxlCisJCWtleXdvcmQgZm9udCwJCXBjX29wZW5jbWQsCWxvYWRmb250CisJCWtleXdvcmQgaW1wbGljaXQsCXBjX3NldGludDE2LAlBbGxvd0ltcGxpY2l0CisJCWtleXdvcmQga2JkbWFwLAkJcGNfb3BlbmNtZCwJbG9hZGtleXMKKwkJa2V5d29yZCBrZXJuZWwsCQlwY19rZXJuZWwsCVZLX0tFUk5FTAorCQlrZXl3b3JkIGxpbnV4LAkJcGNfa2VybmVsLAlWS19MSU5VWAorCQlrZXl3b3JkIGJvb3QsCQlwY19rZXJuZWwsCVZLX0JPT1QKKwkJa2V5d29yZCBic3MsCQlwY19rZXJuZWwsCVZLX0JTUworCQlrZXl3b3JkIHB4ZSwJCXBjX2tlcm5lbCwJVktfUFhFCisJCWtleXdvcmQgZmRpbWFnZSwJcGNfa2VybmVsLAlWS19GRElNQUdFCisJCWtleXdvcmQgY29tYm9vdCwJcGNfa2VybmVsLAlWS19DT01CT09UCisJCWtleXdvcmQgY29tMzIsCQlwY19rZXJuZWwsCVZLX0NPTTMyCisJCWtleXdvcmQgY29uZmlnLAkJcGNfa2VybmVsLAlWS19DT05GSUcKKwkJa2V5d29yZCBsYWJlbCwJCXBjX2xhYmVsCisJCWtleXdvcmQgcHJvbXB0LAkJcGNfc2V0aW50MTYsCUZvcmNlUHJvbXB0CisJCWtleXdvcmQgc2F5LAkJcGNfc2F5CisJCWtleXdvcmQgc2VyaWFsLAkJcGNfc2VyaWFsCisJCWtleXdvcmQgY29uc29sZSwJcGNfc2V0aW50MTYsCURpc3BsYXlDb24KKwkJa2V5d29yZCB0aW1lb3V0LAlwY190aW1lb3V0LAlLYmRUaW1lb3V0CisJCWtleXdvcmQgdG90YWx0aW1lb3V0LAlwY190aW1lb3V0LAlUb3RhbFRpbWVvdXQKKwkJa2V5d29yZCBvbnRpbWVvdXQsCXBjX29udGltZW91dAorCQlrZXl3b3JkIG9uZXJyb3IsCXBjX29uZXJyb3IKKwkJa2V5d29yZCBhbGxvd29wdGlvbnMsCXBjX3NldGludDE2LAlBbGxvd09wdGlvbnMKKwkJa2V5d29yZCBub2VzY2FwZSwJcGNfc2V0aW50MTYsCU5vRXNjYXBlCisJCWtleXdvcmQgbm9jb21wbGV0ZSwJcGNfc2V0aW50MTYsCU5vQ29tcGxldGUKKwkJa2V5d29yZCBub2hhbHQsCQlwY19zZXRpbnQxNiwJTm9IYWx0CisJCWtleXdvcmQgcHhlcmV0cnksCXBjX3NldGludDE2LAlQWEVSZXRyeQorCQlrZXl3b3JkIGYxLAkJcGNfZmlsZW5hbWUsCUZLZXlOKDEpCisJCWtleXdvcmQgZjIsCQlwY19maWxlbmFtZSwJRktleU4oMikKKwkJa2V5d29yZCBmMywJCXBjX2ZpbGVuYW1lLAlGS2V5TigzKQorCQlrZXl3b3JkIGY0LAkJcGNfZmlsZW5hbWUsCUZLZXlOKDQpCisJCWtleXdvcmQgZjUsCQlwY19maWxlbmFtZSwJRktleU4oNSkKKwkJa2V5d29yZCBmNiwJCXBjX2ZpbGVuYW1lLAlGS2V5Tig2KQorCQlrZXl3b3JkIGY3LAkJcGNfZmlsZW5hbWUsCUZLZXlOKDcpCisJCWtleXdvcmQgZjgsCQlwY19maWxlbmFtZSwJRktleU4oOCkKKwkJa2V5d29yZCBmOSwJCXBjX2ZpbGVuYW1lLAlGS2V5Tig5KQorCQlrZXl3b3JkIGYxMCwJCXBjX2ZpbGVuYW1lLAlGS2V5TigxMCkKKwkJa2V5d29yZCBmMCwJCXBjX2ZpbGVuYW1lLAlGS2V5TigxMCkKKwkJa2V5d29yZCBmMTEsCQlwY19maWxlbmFtZSwJRktleU4oMTEpCisJCWtleXdvcmQgZjEyLAkJcGNfZmlsZW5hbWUsCUZLZXlOKDEyKQorCQlrZXl3b3JkIGlwYXBwZW5kLAlwY19zeXNhcHBlbmQKKwkJa2V5d29yZCBzeXNhcHBlbmQsCXBjX3N5c2FwcGVuZAorCQlrZXl3b3JkIGxvY2FsYm9vdCwJcGNfbG9jYWxib290CislaWYgSVNfUFhFTElOVVgKKwkJa2V5d29yZCBzZW5kY29va2llcywJcGNfc2VuZGNvb2tpZXMKKyVlbmRpZgorCitrZXl3ZF9jb3VudAllcXUgKCQta2V5d2RfdGFibGUpL2tleXdkX3NpemUKZGlmZiAtLWdpdCBhL2NvcmUvbGF5b3V0LmluYyBiL2NvcmUvbGF5b3V0LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2NhNzgzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sYXlvdXQuaW5jCkBAIC0wLDAgKzEsMTU4IEBACis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgQ29weXJpZ2h0IDE5OTQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzsgICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7Cis7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorOyAgIEJvc3RvbSBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7Cis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsKKzsgbGF5b3V0LmluYworOworOyBNZW1vcnkgbGF5b3V0IG9mIHNlZ21lbnRzCis7CisKKwkJOyBEZWZhdWx0IHRvIDE2LWJpdCBjb2RlCisJCWJpdHMgMTYKKworOyBNZW1vcnkgYmVsb3cgMDgwMGggaXMgcmVzZXJ2ZWQgZm9yIHRoZSBCSU9TIGFuZCB0aGUgTUJSLgorQlNTX1NUQVJUCWVxdSAwODAwaAorCis7IFRleHQgc3RhcnRzIGF0IHRoZSBsb2FkIGFkZHJlc3Mgb2YgMDdDMDBoLgorVEVYVF9TVEFSVAllcXUgN0MwMGgKKworOworOyAxNi1iaXQgc3RhY2sgbGF5b3V0Cis7Cis7IFBYRUxJTlVYOiBUaGVyZSBhcmUgYXBwYXJlbnRseSBzb21lIEFNSSBCSU9TZXMgaW4gdGhlIGZpZWxkIHdoaWNoCis7IHB1dCB0aGVpciBCRVYgc3RhY2sgc29tZXdoZXJlIGJlbG93IDdDMDBoIChhbmQgdGhlcmVmb3JlIGRvbid0Cis7IGhhbmRsZSBsb2NhbGJvb3QgcHJvcGVybHkpLCBzbyBhdm9pZCB0aGF0IGltbWVkaWF0ZSBtZW1vcnkgcmVnaW9uLgorOyBUaGUgcmFuZ2UgdGhhdCBpcyBrbm93biB0byBiZSBiYWQgaXMgYXBwcm94aW1hdGVseSA3NUU4Li43QzAwOyB0aGUKKzsgbG93ZXIgYm91bmQgaXMgdGlnaHQuCis7IAorCQlnbG9iYWwgU1RBQ0tfTEVOLCBTVEFDS19UT1AsIFNUQUNLX0JBU0UKK1NUQUNLX0xFTgllcXUgNDA5NgorJWlmIElTX1BYRUxJTlVYCitTVEFDS19UT1AJZXF1IDcwMDBoCislZWxzZQorU1RBQ0tfVE9QCWVxdSA3YzAwaAorJWVuZGlmCitTVEFDS19CQVNFCWVxdSBTVEFDS19UT1AgLSBTVEFDS19MRU4KKworOyBUaGUgc2Vjb25kYXJ5IEJTUyBzZWN0aW9uLCBhYm92ZSB0aGUgdGV4dDsgd2UgcmVhbGx5IHdpc2ggd2UgY291bGQKKzsganVzdCBtYWtlIGl0IGZvbGxvdyAuYmNvcHkzMiBvciBoYW5nIG9mZiB0aGUgZW5kLAorOyBidXQgaXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgdGhhdCB3YXkuCitMQVRFQlNTX1NUQVJUCWVxdSAwQjgwMGgKKworOworOyAzMi1iaXQgc3RhY2sgbGF5b3V0Cis7CitTVEFDSzMyX0xFTgllcXUgNjQqMTAyNAorCisJCXNlY3Rpb24JLnN0YWNrCQlub2JpdHMgd3JpdGUgYWxpZ249NDA5NgorCQlyZXNiIFNUQUNLMzJfTEVOCisKKzsKKzsgVGhlIHZhcmlvdXMgc2VjdGlvbnMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcAorOworCQk7IFVzZSAuZWFybHlic3MgZm9yIHRoaW5ncyB0aGF0IE1VU1QgYmUgaW4gbG93IG1lbW9yeS4KKwkJc2VjdGlvbiAuZWFybHlic3MJbm9iaXRzIHdyaXRlCisJCXNlY3Rpb24gLmNvbmZpZwkJd3JpdGUgcHJvZ2JpdHMgYWxpZ249NAorCQlzZWN0aW9uIC5yZXBsYWNlc3R1YglleGVjIHdyaXRlIHByb2diaXRzIGFsaWduPTE2CisJCXNlY3Rpb24gLmdlbnRleHRucglleGVjIHdyaXRlIG5vYml0cyBhbGlnbj0xNgorCQlzZWN0aW9uIC5zdGFjazE2CXdyaXRlIG5vYml0cyBhbGlnbj0xNgorCisJCTsgVXNlIC5ic3MxNiBmb3IgdGhpbmdzIHRoYXQgZG9lc24ndCBoYXZlIHRvIGJlIGluIGxvdyBtZW1vcnk7CisJCTsgLmVhcmx5YnNzIHNob3VsZCBiZSB1c2VkIGZvciB0aGluZ3MgdGhhdCBhYnNvbHV0ZWx5IGhhdmUKKwkJOyB0byBiZSBiZWxvdyAweDdjMDAuCisJCXNlY3Rpb24gLmJzczE2CQl3cml0ZSBub2JpdHMgYWxpZ249MTYKKworJWlmIDAgOyBJU19QWEVMSU5VWAorCQk7IFdhcm5pbmcgaGVyZTogUkJGRyBidWlsZCAyMiByYW5kb21seSBvdmVyd3JpdGVzCisJCTsgbWVtb3J5IGxvY2F0aW9uIFsweDU2ODAsMHg1NzZjKSwgcG9zc2libHkgbW9yZS4gIEl0CisJCTsgc2VlbXMgdGhhdCBpdCBnZXRzIGNvbmZ1c2VkIGFuZCBzY3Jld3MgdXAgdGhlCisJCTsgcG9pbnRlciB0byBpdHMgb3duIGludGVybmFsIHBhY2tldCBidWZmZXIgYW5kIHN0YXJ0cworCQk7IHdyaXRpbmcgYSByZWNlaXZlZCBBUlAgcGFja2V0IGludG8gbG93IG1lbW9yeS4KKwkJc2VjdGlvbiAucmJmZwkJd3JpdGUgbm9iaXRzCitSQkZHX2JyYWluZnVjazoJcmVzYiAyMDQ4CQk7IEJpZ2dlciB0aGFuIGFuIEV0aGVybmV0IHBhY2tldC4uLgorJWVuZGlmCisKKwkJc2VjdGlvbiAuaW5pdAkJZXhlYyB3cml0ZSBwcm9nYml0cyBhbGlnbj0xCisJCXNlY3Rpb24gLnRleHQxNgkJZXhlYyB3cml0ZSBwcm9nYml0cyBhbGlnbj0xCisJCXNlY3Rpb24gLnRleHRucgkJZXhlYyBub3dyaXRlIHByb2diaXRzIGFsaWduPTEKKwkJc2VjdGlvbiAuYmNvcHl4eC50ZXh0CWV4ZWMgbm93cml0ZSBwcm9nYml0cyBhbGlnbj0xNgorCQlzZWN0aW9uIC5iY29weXh4LmRhdGEJbm9leGVjIHdyaXRlIHByb2diaXRzIGFsaWduPTE2CisJCXNlY3Rpb24gLmRhdGExNgkJbm9leGVjIHdyaXRlIHByb2diaXRzIGFsaWduPTE2CisKKwkJc2VjdGlvbiAuYWR2CQl3cml0ZSBub2JpdHMgYWxpZ249NTEyCisKKwkJOyAudWlic3MgY29udGFpbnMgYnNzIGRhdGEgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZQorCQk7IHNhZmUgdG8gY2xvYmJlciBkdXJpbmcgdGhlIGxvYWRpbmcgb2YgdGhlIGltYWdlLiAgVGhpcworCQk7IGlzIGJlY2F1c2Ugd2hpbGUgbG9hZGluZyB0aGUgcHJpbWFyeSBpbWFnZSB3ZSB3aWxsIGNsb2JiZXIKKwkJOyB0aGUgc3BpbGxvdmVyIGZyb20gdGhlIGxhc3QgZnJhY3Rpb25hbCBzZWN0b3IgbG9hZC4KKwkJc2VjdGlvbiAudWlic3MJCXdyaXRlIG5vYml0cyBhbGlnbj0xNgorCisJCXNlY3Rpb24gLnNhdmVkYXRhCXdyaXRlIG5vYml0cyBhbGlnbj0xNgorCisJCTsgU3ltYm9scyBmcm9tIGxpbmtlciBzY3JpcHQKKyVtYWNybyBTRUNJTkZPIDEKKwkJZXh0ZXJuIF9fJTFfc3RhcnQsIF9fJTFfbG1hLCBfXyUxX2VuZAorCQlleHRlcm4gX18lMV9sZW4sIF9fJTFfZHdvcmRzCislZW5kbWFjcm8KKwkJU0VDSU5GTyBic3MxNgorCQlTRUNJTkZPIHVpYnNzCisJCVNFQ0lORk8gY29uZmlnCisJCVNFQ0lORk8gcmVwbGFjZXN0dWIKKwkJU0VDSU5GTyBiY29weXh4CisKKwkJU0VDSU5GTyBwbV9jb2RlCisJCVNFQ0lORk8gaGlnaF9jbGVhcgorCisJCVNFQ0lORk8gYnNzCisKKwkJZXh0ZXJuIGZyZWVfaGlnaF9tZW1vcnkKKworCQlnbG9iYWwgX3N0YXJ0CisKKwkJc2VjdGlvbiAudGV4dDE2CisKKzsKKzsgU2VnbWVudCBhc3NpZ25tZW50cyBpbiB0aGUgYm90dG9tIDY0MEsKKzsgS2VlcCB0aGUgbG93LW1lbW9yeSBmb290cHJpbnQgYXMgc21hbGwgYXMgcG9zc2libGUuLi4gb3ZlcnJ1biBpcyBhIGhhcmQKKzsgZmFpbHVyZSEKKzsKKworc2VyaWFsX2J1Zl9zaXplCWVxdSA0MDk2CQk7IFNob3VsZCBiZSBhIHBvd2VyIG9mIDIKKworOworOyBUcmFuc2ZlciBidWZmZXIgc2VnbWVudDogZ3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIDY0SywgdXNlZCBmb3IgZGlzayBJL08KKzsgT25lIHN5bWJvbCBmb3IgdGhlIHNlZ21lbnQgbnVtYmVyLCBvbmUgZm9yIHRoZSBhYnNvbHV0ZSBhZGRyZXNzCis7CisJCWV4dGVybgl4ZmVyX2J1Zl9zZWcKKwkJc2VjdGlvbiAueGZlcl9idWYJd3JpdGUgbm9iaXRzIGFsaWduPTY1NTM2CisJCWdsb2JhbAljb3JlX3hmZXJfYnVmOmRhdGEgaGlkZGVuCitjb3JlX3hmZXJfYnVmCXJlc2IgNjU1MzYKKworOworOyBTZWdtZW50IGZvciB0aGUgcmVhbCBtb2RlIGNvZGUgKG5lZWRlZCBhcyBsb25nIGFzIHdlIGhhdmUgYSBpbi1rZXJuZWwKKzsgbG9hZGVyIGFuZC9vciBDT00xNiBzdXBwb3J0LgorOyBPbmUgc3ltYm9sIGZvciB0aGUgc2VnbWVudCBudW1iZXIsIG9uZSBmb3IgdGhlIGFic29sdXRlIGFkZHJlc3MKKzsKKwkJZXh0ZXJuCXJlYWxfbW9kZV9zZWcKKwkJc2VjdGlvbiAucmVhbF9tb2RlCXdyaXRlIG5vYml0cyBhbGlnbj02NTUzNgorCQlnbG9iYWwJY29yZV9yZWFsX21vZGU6ZGF0YSBoaWRkZW4KK2NvcmVfcmVhbF9tb2RlCXJlc2IgNjU1MzYKK2NvbWJvb3Rfc2VnCWVxdSByZWFsX21vZGVfc2VnCTsgQ09NQk9PVCBpbWFnZSBsb2FkaW5nIHpvbmUKKworOworOyBBdCB0aGUgdmVyeSBlbmQsIHRoZSBsb3dtZW0gaGVhcAorOworCQlleHRlcm4gX19sb3dtZW1faGVhcAorbWluX2xvd21lbV9oZWFwCWVxdSA2NTUzNgorCisJCXNlY3Rpb24gLnRleHQxNgpkaWZmIC0tZ2l0IGEvY29yZS9sZGxpbnV4LWMuYyBiL2NvcmUvbGRsaW51eC1jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwMWQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbGRsaW51eC1jLmMKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8ZnMuaD4KKworZXh0ZXJuIHVpbnQ4X3QgRHJpdmVOdW1iZXI7CitleHRlcm4gdm9pZCAqUGFydEluZm87CitleHRlcm4gdWludDMyX3QgT3JpZ0VTREk7CitleHRlcm4gY29uc3QgdWludDY0X3QgSGlkZGVuOworCitfX2V4cG9ydCB2b2lkIGdldF9kZXJpdmF0aXZlX2luZm8odW5pb24gc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvICpkaSkKK3sKKwlkaS0+ZGlzay5maWxlc3lzdGVtID0gU1lTTElOVVhfRlNfU1lTTElOVVg7CisJZGktPmRpc2suc2VjdG9yX3NoaWZ0ID0gU2VjdG9yU2hpZnQ7CisJZGktPmRpc2suZHJpdmVfbnVtYmVyID0gRHJpdmVOdW1iZXI7CisKKwlkaS0+ZGlzay5wdGFiX3B0ciA9ICZQYXJ0SW5mbzsKKwlkaS0+ZGlzay5lc2RpX3B0ciA9ICZPcmlnRVNESTsKKwlkaS0+ZGlzay5wYXJ0b2Zmc2V0ID0gJkhpZGRlbjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvbGRsaW51eC5hc20gYi9jb3JlL2xkbGludXguYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MGY1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2xkbGludXguYXNtCkBAIC0wLDAgKzEsNTAgQEAKKzsgLSotIGZ1bmRhbWVudGFsIC0qLSAoYXNtLW1vZGUgc3Vja3MpCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsKKzsgIGxkbGludXguYXNtCis7Cis7ICBBIHByb2dyYW0gdG8gYm9vdCBMaW51eCBrZXJuZWxzIG9mZiBhbiBNUy1ET1MgZm9ybWF0dGVkIGZsb3BweSBkaXNrLgkgVGhpcworOyAgZnVuY3Rpb25hbGl0eSBpcyBnb29kIHRvIGhhdmUgZm9yIGluc3RhbGxhdGlvbiBmbG9wcGllcywgd2hlcmUgaXQgbWF5Cis7ICBiZSBoYXJkIHRvIGZpbmQgYSBmdW5jdGlvbmFsIExpbnV4IHN5c3RlbSB0byBydW4gTElMTyBvZmYuCis7Cis7ICBUaGlzIHByb2dyYW0gYWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgZGlzayB0byB0YWtlIHBsYWNlIGVudGlyZWx5Cis7ICBmcm9tIE1TLUxPU1MsIGFuZCBjYW4gYmUgZXNwZWNpYWxseSB1c2VmdWwgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKKzsgIHVtc2RvcyBmaWxlc3lzdGVtLgorOworOyAgIENvcHlyaWdodCAxOTk0LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7ICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKzsKKzsgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7ICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCis7ICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7Cis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWRlZmluZSBJU19TWVNMSU5VWCAxCislaW5jbHVkZSAiaGVhZC5pbmMiCisKKzsKKzsgU29tZSBzZW1pLWNvbmZpZ3VyYWJsZSBjb25zdGFudHMuLi4gY2hhbmdlIG9uIHlvdXIgb3duIHJpc2suCis7CitteV9pZAkJZXF1IHN5c2xpbnV4X2lkCisKKwkJc2VjdGlvbiAucm9kYXRhCisJCWFsaWdueiA0CitST09UX0ZTX09QUzoKKwkJZXh0ZXJuIHZmYXRfZnNfb3BzCisJCWRkIHZmYXRfZnNfb3BzCisJCWV4dGVybiBleHQyX2ZzX29wcworCQlkZCBleHQyX2ZzX29wcworCQlleHRlcm4gbnRmc19mc19vcHMKKwkJZGQgbnRmc19mc19vcHMKKwkJZXh0ZXJuIHhmc19mc19vcHMKKwkJZGQgeGZzX2ZzX29wcworCQlleHRlcm4gYnRyZnNfZnNfb3BzCisJCWRkIGJ0cmZzX2ZzX29wcworCQlleHRlcm4gdWZzX2ZzX29wcworCQlkZCB1ZnNfZnNfb3BzCisJCWRkIDAKKworJWluY2x1ZGUgImRpc2tmcy5pbmMiCmRpZmYgLS1naXQgYS9jb3JlL2xlZ2FjeW5ldC9jb3JlLmMgYi9jb3JlL2xlZ2FjeW5ldC9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjYjQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbGVnYWN5bmV0L2NvcmUuYwpAQCAtMCwwICsxLDIyMiBAQAorI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZV9hcGkuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlIDxweGUuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKworLyogQ29tbW9uIHJlY2VpdmUgYnVmZmVyICovCitzdGF0aWMgX19sb3dtZW0gY2hhciBwYWNrZXRfYnVmW1BLVEJVRl9TSVpFXSBfX2FsaWduZWQoMTYpOworCitleHRlcm4gdWludDE2X3QgZ2V0X3BvcnQodm9pZCk7CitleHRlcm4gdm9pZCBmcmVlX3BvcnQodWludDE2X3QpOworCitjb25zdCBzdHJ1Y3QgdXJsX3NjaGVtZSB1cmxfc2NoZW1lc1tdID0geworICAgIHsgInRmdHAiLCB0ZnRwX29wZW4sIDAgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAgfQorfTsKKworLyoqCisgKiBPcGVuIGEgc29ja2V0CisgKgorICogQHBhcmFtOnNvY2tldCwgdGhlIHNvY2tldCB0byBvcGVuCisgKgorICogQG91dDogZXJyb3IgY29kZSwgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBjb3JlX3VkcF9vcGVuKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQgX191bnVzZWQpCit7CisgICAgc3RydWN0IG5ldF9wcml2YXRlX3RmdHAgKnByaXYgPSAmc29ja2V0LT5uZXQudGZ0cDsKKworICAgIC8qIEFsbG9jYXRlIGxvY2FsIFVEUCBwb3J0IG51bWJlciAqLworICAgIHByaXYtPmxvY2FscG9ydCA9IGdldF9wb3J0KCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDbG9zZSBhIHNvY2tldAorICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBzb2NrZXQgdG8gb3BlbgorICovCit2b2lkIGNvcmVfdWRwX2Nsb3NlKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQpCit7CisgICAgc3RydWN0IG5ldF9wcml2YXRlX3RmdHAgKnByaXYgPSAmc29ja2V0LT5uZXQudGZ0cDsKKworICAgIGlmIChwcml2LT5sb2NhbHBvcnQpCisJZnJlZV9wb3J0KHByaXYtPmxvY2FscG9ydCk7Cit9CisKKy8qKgorICogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiBvbiBhbiBvcGVuIHNvY2tldAorICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBvcGVuIHNvY2tldAorICogQHBhcmFtOmlwLCB0aGUgaXAgYWRkcmVzcworICogQHBhcmFtOnBvcnQsIHRoZSBwb3J0IG51bWJlciwgaG9zdC1ieXRlIG9yZGVyCisgKi8KK3ZvaWQgY29yZV91ZHBfY29ubmVjdChzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0LCB1aW50MzJfdCBpcCwKKwkJICAgICAgdWludDE2X3QgcG9ydCkKK3sKKyAgICBzdHJ1Y3QgbmV0X3ByaXZhdGVfdGZ0cCAqcHJpdiA9ICZzb2NrZXQtPm5ldC50ZnRwOworCisgICAgc29ja2V0LT50ZnRwX3JlbW90ZXBvcnQgPSBodG9ucyhwb3J0KTsKKyAgICBwcml2LT5yZW1vdGVpcCA9IGlwOworCit9CisKKy8qKgorICogVGVhciBkb3duIGEgY29ubmVjdGlvbiBvbiBhbiBvcGVuIHNvY2tldAorICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBvcGVuIHNvY2tldAorICovCit2b2lkIGNvcmVfdWRwX2Rpc2Nvbm5lY3Qoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCBfX3VudXNlZCkKK3sKK30KKworLyoqCisgKiBSZWFkIGRhdGEgZnJvbSB0aGUgbmV0d29yayBzdGFjaworICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBvcGVuIHNvY2tldAorICogQHBhcmFtOmJ1ZiwgbG9jYXRpb24gb2YgYnVmZmVyIHRvIHN0b3JlIGRhdGEKKyAqIEBwYXJhbTpidWZfbGVuLCBzaXplIG9mIGJ1ZmZlcgorCisgKiBAb3V0OiBzcmNfaXAsIGlwIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc291cmNlCisgKiBAb3V0OiBzcmNfcG9ydCwgcG9ydCBudW1iZXIgb2YgdGhlIGRhdGEgc291cmNlLCBob3N0LWJ5dGUgb3JkZXIKKyAqLworaW50IGNvcmVfdWRwX3JlY3Yoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgdm9pZCAqYnVmLCB1aW50MTZfdCAqYnVmX2xlbiwKKwkJICB1aW50MzJfdCAqc3JjX2lwLCB1aW50MTZfdCAqc3JjX3BvcnQpCit7CisgICAgc3RhdGljIF9fbG93bWVtIHN0cnVjdCBzX1BYRU5WX1VEUF9SRUFEICB1ZHBfcmVhZDsKKyAgICBzdHJ1Y3QgbmV0X3ByaXZhdGVfdGZ0cCAqcHJpdiA9ICZzb2NrZXQtPm5ldC50ZnRwOworICAgIHVpbnQxNl90IGJ5dGVzOworICAgIGludCBlcnI7CisKKyAgICB1ZHBfcmVhZC5zdGF0dXMgICAgICA9IDA7CisgICAgdWRwX3JlYWQuYnVmZmVyICAgICAgPSBGQVJfUFRSKHBhY2tldF9idWYpOworICAgIHVkcF9yZWFkLmJ1ZmZlcl9zaXplID0gUEtUQlVGX1NJWkU7CisgICAgdWRwX3JlYWQuZGVzdF9pcCAgICAgPSBJUEluZm8ubXlpcDsKKyAgICB1ZHBfcmVhZC5kX3BvcnQgICAgICA9IHByaXYtPmxvY2FscG9ydDsKKworICAgIGVyciA9IHB4ZV9jYWxsKFBYRU5WX1VEUF9SRUFELCAmdWRwX3JlYWQpOworICAgIGlmIChlcnIpCisJcmV0dXJuIGVycjsKKworICAgIGlmICh1ZHBfcmVhZC5zdGF0dXMpCisJcmV0dXJuIHVkcF9yZWFkLnN0YXR1czsKKworICAgIGJ5dGVzID0gbWluKHVkcF9yZWFkLmJ1ZmZlcl9zaXplLCAqYnVmX2xlbik7CisgICAgbWVtY3B5KGJ1ZiwgcGFja2V0X2J1ZiwgYnl0ZXMpOworCisgICAgKnNyY19pcCA9IHVkcF9yZWFkLnNyY19pcDsKKyAgICAqc3JjX3BvcnQgPSBudG9ocyh1ZHBfcmVhZC5zX3BvcnQpOworICAgICpidWZfbGVuID0gYnl0ZXM7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBTZW5kIGEgVURQIHBhY2tldC4KKyAqCisgKiBAcGFyYW06c29ja2V0LCB0aGUgb3BlbiBzb2NrZXQKKyAqIEBwYXJhbTpkYXRhLCBkYXRhIGJ1ZmZlciB0byBzZW5kCisgKiBAcGFyYW06bGVuLCBzaXplIG9mIGRhdGEgYnVmZXIKKyAqLwordm9pZCBjb3JlX3VkcF9zZW5kKHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgc3RhdGljIF9fbG93bWVtIHN0cnVjdCBzX1BYRU5WX1VEUF9XUklURSB1ZHBfd3JpdGU7CisgICAgc3RydWN0IG5ldF9wcml2YXRlX3RmdHAgKnByaXYgPSAmc29ja2V0LT5uZXQudGZ0cDsKKyAgICB2b2lkICpsYnVmOworICAgIHVpbnQxNl90IHRpZDsKKworICAgIGxidWYgPSBsbWFsbG9jKGxlbik7CisgICAgaWYgKCFsYnVmKQorCXJldHVybjsKKworICAgIG1lbWNweShsYnVmLCBkYXRhLCBsZW4pOworCisgICAgdGlkID0gcHJpdi0+bG9jYWxwb3J0OyAgIC8qIFRJRChsb2NhbCBwb3J0IE5vKSAqLworICAgIHVkcF93cml0ZS5idWZmZXIgICAgPSBGQVJfUFRSKGxidWYpOworICAgIHVkcF93cml0ZS5pcCAgICAgICAgPSBwcml2LT5yZW1vdGVpcDsKKyAgICB1ZHBfd3JpdGUuZ3cgICAgICAgID0gZ2F0ZXdheSh1ZHBfd3JpdGUuaXApOworICAgIHVkcF93cml0ZS5zcmNfcG9ydCAgPSB0aWQ7CisgICAgdWRwX3dyaXRlLmRzdF9wb3J0ICA9IHNvY2tldC0+dGZ0cF9yZW1vdGVwb3J0OworICAgIHVkcF93cml0ZS5idWZmZXJfc2l6ZSA9IGxlbjsKKworICAgIHB4ZV9jYWxsKFBYRU5WX1VEUF9XUklURSwgJnVkcF93cml0ZSk7CisKKyAgICBsZnJlZShsYnVmKTsKK30KKworLyoqCisgKiBTZW5kIGEgVURQIHBhY2tldCB0byBhIGRlc3RpbmF0aW9uCisgKgorICogQHBhcmFtOnNvY2tldCwgdGhlIG9wZW4gc29ja2V0CisgKiBAcGFyYW06ZGF0YSwgZGF0YSBidWZmZXIgdG8gc2VuZAorICogQHBhcmFtOmxlbiwgc2l6ZSBvZiBkYXRhIGJ1ZmVyCisgKiBAcGFyYW06aXAsIHRoZSBpcCBhZGRyZXNzCisgKiBAcGFyYW06cG9ydCwgdGhlIHBvcnQgbnVtYmVyLCBob3N0LWJ5dGUgb3JkZXIKKyAqLwordm9pZCBjb3JlX3VkcF9zZW5kdG8oc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwKKwkJICAgICB1aW50MzJfdCBpcCwgdWludDE2X3QgcG9ydCkKK3sKKyAgICBzdGF0aWMgX19sb3dtZW0gc3RydWN0IHNfUFhFTlZfVURQX1dSSVRFIHVkcF93cml0ZTsKKyAgICBzdHJ1Y3QgbmV0X3ByaXZhdGVfdGZ0cCAqcHJpdiA9ICZzb2NrZXQtPm5ldC50ZnRwOworICAgIHZvaWQgKmxidWY7CisgICAgdWludDE2X3QgdGlkOworCisgICAgbGJ1ZiA9IGxtYWxsb2MobGVuKTsKKyAgICBpZiAoIWxidWYpCisJcmV0dXJuOworCisgICAgbWVtY3B5KGxidWYsIGRhdGEsIGxlbik7CisKKyAgICB0aWQgPSBwcml2LT5sb2NhbHBvcnQ7ICAgLyogVElEKGxvY2FsIHBvcnQgTm8pICovCisgICAgdWRwX3dyaXRlLmJ1ZmZlciAgICA9IEZBUl9QVFIobGJ1Zik7CisgICAgdWRwX3dyaXRlLmlwICAgICAgICA9IGlwOworICAgIHVkcF93cml0ZS5ndyAgICAgICAgPSBnYXRld2F5KHVkcF93cml0ZS5pcCk7CisgICAgdWRwX3dyaXRlLnNyY19wb3J0ICA9IHRpZDsKKyAgICB1ZHBfd3JpdGUuZHN0X3BvcnQgID0gaHRvbnMocG9ydCk7CisgICAgdWRwX3dyaXRlLmJ1ZmZlcl9zaXplID0gbGVuOworCisgICAgcHhlX2NhbGwoUFhFTlZfVURQX1dSSVRFLCAmdWRwX3dyaXRlKTsKKworICAgIGxmcmVlKGxidWYpOworfQorCisKKy8qKgorICogTmV0d29yayBzdGFjay1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICoKKyAqIEluaXRpYWxpemUgVURQIHN0YWNrCisgKi8KK3ZvaWQgbmV0X2NvcmVfaW5pdCh2b2lkKQoreworICAgIGludCBlcnI7CisgICAgc3RhdGljIF9fbG93bWVtIHN0cnVjdCBzX1BYRU5WX1VEUF9PUEVOIHVkcF9vcGVuOworICAgIHVkcF9vcGVuLnNyY19pcCA9IElQSW5mby5teWlwOworICAgIGVyciA9IHB4ZV9jYWxsKFBYRU5WX1VEUF9PUEVOLCAmdWRwX29wZW4pOworICAgIGlmIChlcnIgfHwgdWRwX29wZW4uc3RhdHVzKSB7CisgICAgICAgIHByaW50ZigiRmFpbGVkIHRvIGluaXRpYWxpemUgVURQIHN0YWNrICIpOworICAgICAgICBwcmludGYoIiVkXG4iLCB1ZHBfb3Blbi5zdGF0dXMpOworCWthYm9vbSgpOworICAgIH0KK30KKwordm9pZCBwcm9iZV91bmRpKHZvaWQpCit7Cit9CisKK3ZvaWQgcHhlX2luaXRfaXNyKHZvaWQpCit7Cit9CisKK2ludCByZXNldF9weGUodm9pZCkKK3sKKyAgICBzdGF0aWMgX19sb3dtZW0gc3RydWN0IHNfUFhFTlZfVURQX0NMT1NFIHVkcF9jbG9zZTsKKyAgICBpbnQgZXJyID0gMDsKKworICAgIHB4ZV9pZGxlX2NsZWFudXAoKTsKKworICAgIHB4ZV9jYWxsKFBYRU5WX1VEUF9DTE9TRSwgJnVkcF9jbG9zZSk7CisKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvY29yZS9sZWdhY3luZXQvZG5zcmVzb2x2LmMgYi9jb3JlL2xlZ2FjeW5ldC9kbnNyZXNvbHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJlNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sZWdhY3luZXQvZG5zcmVzb2x2LmMKQEAgLTAsMCArMSwzODggQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKyNpbmNsdWRlICJweGUuaCIKKworLyogRE5TIENMQVNTIHZhbHVlcyB3ZSBjYXJlIGFib3V0ICovCisjZGVmaW5lIENMQVNTX0lOCTEKKworLyogRE5TIFRZUEUgdmFsdWVzIHdlIGNhcmUgYWJvdXQgKi8KKyNkZWZpbmUgVFlQRV9BCQkxCisjZGVmaW5lIFRZUEVfQ05BTUUJNQorCisvKgorICogVGhlIEROUyBoZWFkZXIgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBkbnNoZHIgeworICAgIHVpbnQxNl90IGlkOworICAgIHVpbnQxNl90IGZsYWdzOworICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBxdWVzdGlvbiBzZWN0aW9uICovCisgICAgdWludDE2X3QgcWRjb3VudDsKKyAgICAvKiBudW1iZXIgb2YgcmVzb3VyY2UgcmVjb3JkcyBpbiB0aGUgYW5zd2VyIHNlY3Rpb24gKi8KKyAgICB1aW50MTZfdCBhbmNvdW50OworICAgIC8qIG51bWJlciBvZiBuYW1lIHNlcnZlciByZXNvdXJjZSByZWNvcmRzIGluIHRoZSBhdXRob3JpdHkgcmVjb3JkcyBzZWN0aW9uKi8KKyAgICB1aW50MTZfdCBuc2NvdW50OworICAgIC8qIG51bWJlciBvZiByZXNvdXJjZSByZWNvcmRzIGluIHRoZSBhZGRpdGlvbmFsIHJlY29yZHMgc2VjdGlvbiAqLworICAgIHVpbnQxNl90IGFyY291bnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZSBETlMgcXVlcnkgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBkbnNxdWVyeSB7CisgICAgdWludDE2X3QgcXR5cGU7CisgICAgdWludDE2X3QgcWNsYXNzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBUaGUgRE5TIFJlc291cmNlIHJlY29kZXMgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBkbnNyciB7CisgICAgdWludDE2X3QgdHlwZTsKKyAgICB1aW50MTZfdCBjbGFzczsKKyAgICB1aW50MzJfdCB0dGw7CisgICAgdWludDE2X3QgcmRsZW5ndGg7ICAgLyogVGhlIGxlbmdodCBvZiB0aGlzIHJyIGRhdGEgKi8KKyAgICBjaGFyICAgICByZGF0YVtdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworI2RlZmluZSBETlNfUE9SVAlodG9ucyg1MykgICAgICAgICAgICAgICAvKiBEZWZhdWx0IEROUyBwb3J0ICovCisjZGVmaW5lIEROU19NQVhfU0VSVkVSUyA0CQkvKiBNYXggbm8gb2YgRE5TIHNlcnZlcnMgKi8KKwordWludDMyX3QgZG5zX3NlcnZlcltETlNfTUFYX1NFUlZFUlNdID0gezAsIH07CisKKworLyoKKyAqIFR1cm4gYSBzdHJpbmcgaW4gX3NyY18gaW50byBhIEROUyAibGFiZWwgc2V0IiBpbiBfZHN0XzsgcmV0dXJucyB0aGUKKyAqIG51bWJlciBvZiBkb3RzIGVuY291bnRlcmVkLiBPbiByZXR1cm4sICpkc3QgaXMgdXBkYXRlZC4KKyAqLworaW50IGRuc19tYW5nbGUoY2hhciAqKmRzdCwgY29uc3QgY2hhciAqcCkKK3sKKyAgICBjaGFyICpxID0gKmRzdDsKKyAgICBjaGFyICpjb3VudF9wdHI7CisgICAgY2hhciBjOworICAgIGludCBkb3RzID0gMDsKKworICAgIGNvdW50X3B0ciA9IHE7CisgICAgKnErKyA9IDA7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjID0gKnArKzsKKyAgICAgICAgaWYgKGMgPT0gMCB8fCBjID09ICc6JyB8fCBjID09ICcvJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoYyA9PSAnLicpIHsKKyAgICAgICAgICAgIGRvdHMrKzsKKyAgICAgICAgICAgIGNvdW50X3B0ciA9IHE7CisgICAgICAgICAgICAqcSsrID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgKmNvdW50X3B0ciArPSAxOworICAgICAgICAqcSsrID0gYzsKKyAgICB9CisKKyAgICBpZiAoKmNvdW50X3B0cikKKyAgICAgICAgKnErKyA9IDA7CisKKyAgICAvKiB1cGRhdGUgdGhlIHN0cmluZ3MgKi8KKyAgICAqZHN0ID0gcTsKKyAgICByZXR1cm4gZG90czsKK30KKworCisvKgorICogQ29tcGFyZSB0d28gc2V0cyBvZiBETlMgbGFiZWxzLCBpbiBfczFfIGFuZCBfczJfOyB0aGUgb25lIGluIF9zMl8KKyAqIGlzIGFsbG93ZWQgcG9pbnRlcnMgcmVsYXRpdmUgdG8gYSBwYWNrZXQgaW4gYnVmLgorICoKKyAqLworc3RhdGljIGJvb2wgZG5zX2NvbXBhcmUoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBjb25zdCB2b2lkICpidWYpCit7CisgICAgY29uc3QgdWludDhfdCAqcSA9IHMxOworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzMjsKKyAgICB1bnNpZ25lZCBpbnQgYzAsIGMxOworCisgICAgd2hpbGUgKDEpIHsKKwljMCA9IHBbMF07CisgICAgICAgIGlmIChjMCA+PSAweGMwKSB7CisJICAgIC8qIEZvbGxvdyBwb2ludGVyICovCisJICAgIGMxID0gcFsxXTsKKwkgICAgcCA9IChjb25zdCB1aW50OF90ICopYnVmICsgKChjMCAtIDB4YzApIDw8IDgpICsgYzE7CisJfSBlbHNlIGlmIChjMCkgeworCSAgICBjMCsrOwkJLyogSW5jbHVkZSB0aGUgbGVuZ3RoIGJ5dGUgKi8KKwkgICAgaWYgKG1lbWNtcChxLCBwLCBjMCkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgcSArPSBjMDsKKwkgICAgcCArPSBjMDsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gKnEgPT0gMDsKKwl9CisgICAgfQorfQorCisvKgorICogQ29weSBhIEROUyBsYWJlbCBpbnRvIGEgYnVmZmVyLCBjb25zaWRlcmluZyB0aGUgcG9zc2liaWxpdHkgdGhhdCB3ZSBtaWdodAorICogaGF2ZSB0byBmb2xsb3cgcG9pbnRlcnMgcmVsYXRpdmUgdG8gImJ1ZiIuCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZnJlZSBieXRlICphZnRlciogdGhlIHRlcm1pbmFsIG51bGwuCisgKi8KK3N0YXRpYyB2b2lkICpkbnNfY29weWxhYmVsKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBjb25zdCB2b2lkICpidWYpCit7CisgICAgdWludDhfdCAqcSA9IGRzdDsKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3JjOworICAgIHVuc2lnbmVkIGludCBjMCwgYzE7CisKKyAgICB3aGlsZSAoMSkgeworCWMwID0gcFswXTsKKyAgICAgICAgaWYgKGMwID49IDB4YzApIHsKKwkgICAgLyogRm9sbG93IHBvaW50ZXIgKi8KKwkgICAgYzEgPSBwWzFdOworCSAgICBwID0gKGNvbnN0IHVpbnQ4X3QgKilidWYgKyAoKGMwIC0gMHhjMCkgPDwgOCkgKyBjMTsKKwl9IGVsc2UgaWYgKGMwKSB7CisJICAgIGMwKys7CQkvKiBJbmNsdWRlIHRoZSBsZW5ndGggYnl0ZSAqLworCSAgICBtZW1jcHkocSwgcCwgYzApOworCSAgICBwICs9IGMwOworCSAgICBxICs9IGMwOworCX0gZWxzZSB7CisJICAgICpxKysgPSAwOworCSAgICByZXR1cm4gcTsKKwl9CisgICAgfQorfQorCisvKgorICogU2tpcCBwYXN0IGEgRE5TIGxhYmVsIHNldCBpbiBEUzpTSQorICovCitzdGF0aWMgY2hhciAqZG5zX3NraXBsYWJlbChjaGFyICpsYWJlbCkKK3sKKyAgICB1aW50OF90IGM7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjID0gKmxhYmVsKys7CisgICAgICAgIGlmIChjID49IDB4YzApCisgICAgICAgICAgICByZXR1cm4gKytsYWJlbDsgLyogcG9pbnRlciBpcyB0d28gYnl0ZXMgKi8KKyAgICAgICAgaWYgKGMgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICAgICAgbGFiZWwgKz0gYzsKKyAgICB9Cit9CisKK2V4dGVybiBjb25zdCB1aW50OF90IFRpbWVvdXRUYWJsZVtdOworZXh0ZXJuIHVpbnQxNl90IGdldF9wb3J0KHZvaWQpOworZXh0ZXJuIHZvaWQgZnJlZV9wb3J0KHVpbnQxNl90IHBvcnQpOworCisvKgorICogcGFyc2UgdGhlIGlwX3N0ciBhbmQgcmV0dXJuIHRoZSBpcCBhZGRyZXNzIHdpdGggKnJlcy4KKyAqIHJldHVybiB0cnVlIGlmIHRoZSB3aG9sZSBzdHJpbmcgd2FzIGNvbnN1bWVkIGFuZCB0aGUgcmVzdWx0CisgKiB3YXMgdmFsaWQuCisgKgorICovCitzdGF0aWMgYm9vbCBwYXJzZV9kb3RxdWFkKGNvbnN0IGNoYXIgKmlwX3N0ciwgdWludDMyX3QgKnJlcykKK3sKKyAgICBjb25zdCBjaGFyICpwID0gaXBfc3RyOworICAgIHVpbnQ4X3QgcGFydCA9IDA7CisgICAgdWludDMyX3QgaXAgPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB3aGlsZSAoaXNfZGlnaXQoKnApKSB7CisgICAgICAgICAgICBwYXJ0ID0gcGFydCAqIDEwICsgKnAgLSAnMCc7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgIT0gMyAmJiAqcCAhPSAnLicpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaXAgPSAoaXAgPDwgOCkgfCBwYXJ0OworICAgICAgICBwYXJ0ID0gMDsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICBwLS07CisKKyAgICAqcmVzID0gaHRvbmwoaXApOworICAgIHJldHVybiAqcCA9PSAnXDAnOworfQorCisvKgorICogQWN0dWFsIHJlc29sdmVyIGZ1bmN0aW9uCisgKiBQb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQgb3IgOi10ZXJtaW5hdGVkIHN0cmluZyBpbiBfbmFtZV8KKyAqIGFuZCByZXR1cm5zIHRoZSBpcCBhZGRyIGluIF9pcF8gaWYgaXQgZXhpc3RzIGFuZCBjYW4gYmUgZm91bmQuCisgKiBJZiBfaXBfID0gMCBvbiBleGl0LCB0aGUgbG9va3VwIGZhaWxlZC4gX25hbWVfIHdpbGwgYmUgdXBkYXRlZAorICoKKyAqIFhYWDogcHJvYmFibHkgbmVlZCBzb21lIGNhY2hpbmcgaGVyZS4KKyAqLworX19leHBvcnQgdWludDMyX3QgZG5zX3Jlc29sdihjb25zdCBjaGFyICpuYW1lKQoreworICAgIHN0YXRpYyBjaGFyIF9fbG93bWVtIEROU1NlbmRCdWZbUEtUQlVGX1NJWkVdOworICAgIHN0YXRpYyBjaGFyIF9fbG93bWVtIEROU1JlY3ZCdWZbUEtUQlVGX1NJWkVdOworICAgIGNoYXIgKnA7CisgICAgaW50IGVycjsKKyAgICBpbnQgZG90czsKKyAgICBpbnQgc2FtZTsKKyAgICBpbnQgcmRfbGVuOworICAgIGludCBxdWVzLCByZXBzOyAgICAvKiBudW1iZXIgb2YgcXVlc3Rpb25zIGFuZCByZXBsaWVzICovCisgICAgdWludDhfdCB0aW1lb3V0OworICAgIGNvbnN0IHVpbnQ4X3QgKnRpbWVvdXRfcHRyID0gVGltZW91dFRhYmxlOworICAgIHVpbnQzMl90IG9sZHRpbWU7CisgICAgdWludDMyX3Qgc3J2OworICAgIHVpbnQzMl90ICpzcnZfcHRyOworICAgIHN0cnVjdCBkbnNoZHIgKmhkMSA9IChzdHJ1Y3QgZG5zaGRyICopRE5TU2VuZEJ1ZjsKKyAgICBzdHJ1Y3QgZG5zaGRyICpoZDIgPSAoc3RydWN0IGRuc2hkciAqKUROU1JlY3ZCdWY7CisgICAgc3RydWN0IGRuc3F1ZXJ5ICpxdWVyeTsKKyAgICBzdHJ1Y3QgZG5zcnIgKnJyOworICAgIHN0YXRpYyBfX2xvd21lbSBzdHJ1Y3Qgc19QWEVOVl9VRFBfV1JJVEUgdWRwX3dyaXRlOworICAgIHN0YXRpYyBfX2xvd21lbSBzdHJ1Y3Qgc19QWEVOVl9VRFBfUkVBRCAgdWRwX3JlYWQ7CisgICAgdWludDE2X3QgbG9jYWxfcG9ydDsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworCisgICAgLyoKKyAgICAgKiBSZXR1cm4gZmFpbHVyZSBvbiBhbiBlbXB0eSBpbnB1dC4uLiB0aGlzIGNhbiBoYXBwZW4gZHVyaW5nCisgICAgICogc29tZSB0eXBlcyBvZiBVUkwgcGFyc2luZywgYW5kIHRoaXMgaXMgdGhlIGVhc2llc3QgcGxhY2UgdG8KKyAgICAgKiBjaGVjayBmb3IgaXQuCisgICAgICovCisgICAgaWYgKCFuYW1lIHx8ICEqbmFtZSkKKwlyZXR1cm4gMDsKKworICAgIC8qIElmIGl0IGlzIGEgdmFsaWQgZG90IHF1YWQsIGp1c3QgcmV0dXJuIHRoYXQgdmFsdWUgKi8KKyAgICBpZiAocGFyc2VfZG90cXVhZChuYW1lLCAmcmVzdWx0KSkKKwlyZXR1cm4gcmVzdWx0OworCisgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHZhbGlkIEROUyBzZXJ2ZXIgKi8KKyAgICBpZiAoIWRuc19zZXJ2ZXJbMF0pCisJcmV0dXJuIDA7CisKKyAgICAvKiBHZXQgYSBsb2NhbCBwb3J0IG51bWJlciAqLworICAgIGxvY2FsX3BvcnQgPSBnZXRfcG9ydCgpOworCisgICAgLyogRmlyc3QsIGZpbGwgdGhlIEROUyBoZWFkZXIgc3RydWN0ICovCisgICAgaGQxLT5pZCsrOyAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcXVlcnkgSUQgKi8KKyAgICBoZDEtPmZsYWdzICAgPSBodG9ucygweDAxMDApOyAgIC8qIFJlY3Vyc2lvbiByZXF1ZXN0ZWQgKi8KKyAgICBoZDEtPnFkY291bnQgPSBodG9ucygxKTsgICAgICAgIC8qIE9uZSBxdWVzdGlvbiAqLworICAgIGhkMS0+YW5jb3VudCA9IDA7ICAgICAgICAgICAgICAgLyogTm8gYW5zd2VycyAqLworICAgIGhkMS0+bnNjb3VudCA9IDA7ICAgICAgICAgICAgICAgLyogTm8gTlMgKi8KKyAgICBoZDEtPmFyY291bnQgPSAwOyAgICAgICAgICAgICAgIC8qIE5vIEFSICovCisKKyAgICBwID0gRE5TU2VuZEJ1ZiArIHNpemVvZihzdHJ1Y3QgZG5zaGRyKTsKKyAgICBkb3RzID0gZG5zX21hbmdsZSgmcCwgbmFtZSk7ICAgLyogc3RvcmUgdGhlIENOQU1FICovCisKKyAgICBpZiAoIWRvdHMpIHsKKyAgICAgICAgcC0tOyAvKiBSZW1vdmUgZmluYWwgbnVsbCAqLworICAgICAgICAvKiBVbmNvbXByZXNzZWQgRE5TIGxhYmVsIHNldCBzbyBpdCBlbmRzIGluIG51bGwgKi8KKyAgICAgICAgcCA9IHN0cGNweShwLCBMb2NhbERvbWFpbik7CisgICAgfQorCisgICAgLyogRmlsbCB0aGUgRE5TIHF1ZXJ5IHBhY2tldCAqLworICAgIHF1ZXJ5ID0gKHN0cnVjdCBkbnNxdWVyeSAqKXA7CisgICAgcXVlcnktPnF0eXBlICA9IGh0b25zKFRZUEVfQSk7CisgICAgcXVlcnktPnFjbGFzcyA9IGh0b25zKENMQVNTX0lOKTsKKyAgICBwICs9IHNpemVvZihzdHJ1Y3QgZG5zcXVlcnkpOworCisgICAgLyogTm93IHNlbmQgaXQgdG8gbmFtZSBzZXJ2ZXIgKi8KKyAgICB0aW1lb3V0X3B0ciA9IFRpbWVvdXRUYWJsZTsKKyAgICB0aW1lb3V0ID0gKnRpbWVvdXRfcHRyKys7CisgICAgc3J2X3B0ciA9IGRuc19zZXJ2ZXI7CisgICAgd2hpbGUgKHRpbWVvdXQpIHsKKwlzcnYgPSAqc3J2X3B0cisrOworCWlmICghc3J2KSB7CisJICAgIHNydl9wdHIgPSBkbnNfc2VydmVyOworCSAgICBzcnYgPSAqc3J2X3B0cisrOworCX0KKworICAgICAgICB1ZHBfd3JpdGUuc3RhdHVzICAgICAgPSAwOworICAgICAgICB1ZHBfd3JpdGUuaXAgICAgICAgICAgPSBzcnY7CisgICAgICAgIHVkcF93cml0ZS5ndyAgICAgICAgICA9IGdhdGV3YXkoc3J2KTsKKyAgICAgICAgdWRwX3dyaXRlLnNyY19wb3J0ICAgID0gbG9jYWxfcG9ydDsKKyAgICAgICAgdWRwX3dyaXRlLmRzdF9wb3J0ICAgID0gRE5TX1BPUlQ7CisgICAgICAgIHVkcF93cml0ZS5idWZmZXJfc2l6ZSA9IHAgLSBETlNTZW5kQnVmOworICAgICAgICB1ZHBfd3JpdGUuYnVmZmVyICAgICAgPSBGQVJfUFRSKEROU1NlbmRCdWYpOworICAgICAgICBlcnIgPSBweGVfY2FsbChQWEVOVl9VRFBfV1JJVEUsICZ1ZHBfd3JpdGUpOworICAgICAgICBpZiAoZXJyIHx8IHVkcF93cml0ZS5zdGF0dXMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBvbGR0aW1lID0gamlmZmllcygpOworCWRvIHsKKwkgICAgaWYgKGppZmZpZXMoKSAtIG9sZHRpbWUgPj0gdGltZW91dCkKKwkJZ290byBhZ2FpbjsKKworICAgICAgICAgICAgdWRwX3JlYWQuc3RhdHVzICAgICAgPSAwOworICAgICAgICAgICAgdWRwX3JlYWQuc3JjX2lwICAgICAgPSBzcnY7CisgICAgICAgICAgICB1ZHBfcmVhZC5kZXN0X2lwICAgICA9IElQSW5mby5teWlwOworICAgICAgICAgICAgdWRwX3JlYWQuc19wb3J0ICAgICAgPSBETlNfUE9SVDsKKyAgICAgICAgICAgIHVkcF9yZWFkLmRfcG9ydCAgICAgID0gbG9jYWxfcG9ydDsKKyAgICAgICAgICAgIHVkcF9yZWFkLmJ1ZmZlcl9zaXplID0gUEtUQlVGX1NJWkU7CisgICAgICAgICAgICB1ZHBfcmVhZC5idWZmZXIgICAgICA9IEZBUl9QVFIoRE5TUmVjdkJ1Zik7CisgICAgICAgICAgICBlcnIgPSBweGVfY2FsbChQWEVOVl9VRFBfUkVBRCwgJnVkcF9yZWFkKTsKKwl9IHdoaWxlIChlcnIgfHwgdWRwX3JlYWQuc3RhdHVzIHx8IGhkMi0+aWQgIT0gaGQxLT5pZCk7CisKKyAgICAgICAgaWYgKChoZDItPmZsYWdzIF4gMHg4MCkgJiBodG9ucygweGY4MGYpKQorICAgICAgICAgICAgZ290byBiYWRuZXNzOworCisgICAgICAgIHF1ZXMgPSBodG9ucyhoZDItPnFkY291bnQpOyAgIC8qIFF1ZXN0aW9ucyAqLworICAgICAgICByZXBzID0gaHRvbnMoaGQyLT5hbmNvdW50KTsgICAvKiBSZXBsaWVzICAgKi8KKyAgICAgICAgcCA9IEROU1JlY3ZCdWYgKyBzaXplb2Yoc3RydWN0IGRuc2hkcik7CisgICAgICAgIHdoaWxlIChxdWVzLS0pIHsKKyAgICAgICAgICAgIHAgPSBkbnNfc2tpcGxhYmVsKHApOyAvKiBTa2lwIG5hbWUgKi8KKyAgICAgICAgICAgIHAgKz0gNDsgICAgICAgICAgICAgICAvKiBTa2lwIHF1ZXN0aW9uIHRyYWlsZXIgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIFBhcnNlIHRoZSByZXBsaWVzICovCisgICAgICAgIHdoaWxlIChyZXBzLS0pIHsKKyAgICAgICAgICAgIHNhbWUgPSBkbnNfY29tcGFyZShETlNTZW5kQnVmICsgc2l6ZW9mKHN0cnVjdCBkbnNoZHIpLAorCQkJICAgICAgIHAsIEROU1JlY3ZCdWYpOworICAgICAgICAgICAgcCA9IGRuc19za2lwbGFiZWwocCk7CisgICAgICAgICAgICByciA9IChzdHJ1Y3QgZG5zcnIgKilwOworICAgICAgICAgICAgcmRfbGVuID0gbnRvaHMocnItPnJkbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChzYW1lICYmIG50b2hzKHJyLT5jbGFzcykgPT0gQ0xBU1NfSU4pIHsKKwkJc3dpdGNoIChudG9ocyhyci0+dHlwZSkpIHsKKwkJY2FzZSBUWVBFX0E6CisJCSAgICBpZiAocmRfbGVuID09IDQpIHsKKwkJCXJlc3VsdCA9ICoodWludDMyX3QgKilyci0+cmRhdGE7CisJCQlnb3RvIGRvbmU7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSBUWVBFX0NOQU1FOgorCQkgICAgZG5zX2NvcHlsYWJlbChETlNTZW5kQnVmICsgc2l6ZW9mKHN0cnVjdCBkbnNoZHIpLAorCQkJCSAgcnItPnJkYXRhLCBETlNSZWN2QnVmKTsKKwkJICAgIC8qCisJCSAgICAgKiBXZSBzaG91bGQgcHJvYmFibHkgcmVzY2FuIHRoZSBwYWNrZXQgZnJvbSB0aGUgdG9wCisJCSAgICAgKiBoZXJlLCBhbmQgdGVjaG5pY2FsbHkgd2UgbWlnaHQgaGF2ZSB0byBzZW5kIGEgd2hvbGUKKwkJICAgICAqIG5ldyByZXF1ZXN0IGhlcmUuLi4KKwkJICAgICAqLworCQkgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisKKyAgICAgICAgICAgIC8qIG5vdCB0aGUgb25lIHdlIHdhbnQsIHRyeSBuZXh0ICovCisgICAgICAgICAgICBwICs9IHNpemVvZihzdHJ1Y3QgZG5zcnIpICsgcmRfbGVuOworICAgICAgICB9CisKKyAgICBiYWRuZXNzOgorICAgICAgICAvKgorICAgICAgICAgKgorICAgICAgICAgOyBXZSBnb3QgYmFjayBubyBkYXRhIGZyb20gdGhpcyBzZXJ2ZXIuCisgICAgICAgICA7IFVuZm9ydHVuYXRlbHksIGZvciBhIHJlY3Vyc2l2ZSwgbm9uLWF1dGhvcml0YXRpdmUKKyAgICAgICAgIDsgcXVlcnkgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBOWERPTUFJTiByZXBseSwKKyAgICAgICAgIDsgd2hpY2ggdGVjaG5pY2FsbHkgbWVhbnMgd2UgY2FuJ3QgZHJhdyBhbnkKKyAgICAgICAgIDsgY29uY2x1c2lvbnMuICBIb3dldmVyLCBpbiBwcmFjdGljZSB0aGF0IG1lYW5zIHRoZQorICAgICAgICAgOyBkb21haW4gZG9lc24ndCBleGlzdC4gIElmIHRoaXMgdHVybnMgb3V0IHRvIGJlIGEKKyAgICAgICAgIDsgcHJvYmxlbSwgd2UgbWF5IHdhbnQgdG8gYWRkIGNvZGUgdG8gZ28gdGhyb3VnaCBhbGwKKyAgICAgICAgIDsgdGhlIHNlcnZlcnMgYmVmb3JlIGdpdmluZyB1cC4KKworICAgICAgICAgOyBJZiB0aGUgRE5TIHNlcnZlciB3YXNuJ3QgY2FwYWJsZSBvZiByZWN1cnNpb24sIGFuZAorICAgICAgICAgOyBpc24ndCBjYXBhYmxlIG9mIGdpdmluZyB1cyBhbiBhdXRob3JpdGF0aXZlIHJlcGx5CisgICAgICAgICA7IChpLmUuIG5laXRoZXIgQUEgb3IgUkEgc2V0KSwgdGhlbiBhdCBsZWFzdCB0cnkgYQorICAgICAgICAgOyBkaWZmZXJlbnQgc2V0dmVyLi4uCisgICAgICAgICovCisgICAgICAgIGlmIChoZDItPmZsYWdzID09IGh0b25zKDB4NDgwKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgIGFnYWluOgorCWNvbnRpbnVlOworICAgIH0KKworZG9uZToKKyAgICBmcmVlX3BvcnQobG9jYWxfcG9ydCk7CS8qIFJldHVybiBwb3J0IG51bWJlciB0byB0aGUgZnJlZSBwb29sICovCisKKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvY29yZS9sZWdhY3luZXQvaWRsZS5jIGIvY29yZS9sZWdhY3luZXQvaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODkyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2xlZ2FjeW5ldC9pZGxlLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisjaW5jbHVkZSAicHhlLmgiCisKK3N0YXRpYyBpbnQgcHhlX2lkbGVfcG9sbCh2b2lkKQoreworICAgIHN0YXRpYyBfX2xvd21lbSBjaGFyIGp1bmtfcGt0W1BLVEJVRl9TSVpFXTsKKyAgICBzdGF0aWMgX19sb3dtZW0gdF9QWEVOVl9VRFBfUkVBRCByZWFkX2J1ZjsKKworICAgIG1lbXNldCgmcmVhZF9idWYsIDAsIHNpemVvZiByZWFkX2J1Zik7CisKKyAgICByZWFkX2J1Zi5zcmNfaXAgID0gMDsJIC8qIEFueSBkZXN0aW5hdGlvbiAqLworICAgIHJlYWRfYnVmLmRlc3RfaXAgPSBJUEluZm8ubXlpcDsKKyAgICByZWFkX2J1Zi5zX3BvcnQgID0gMDsJIC8qIEFueSBzb3VyY2UgcG9ydCAqLworICAgIHJlYWRfYnVmLmRfcG9ydCAgPSBodG9ucyg5KTsgLyogRGlzY2FyZCBwb3J0IChub3QgdXNlZC4uLikgKi8KKyAgICByZWFkX2J1Zi5idWZmZXJfc2l6ZSA9IHNpemVvZiBqdW5rX3BrdDsKKyAgICByZWFkX2J1Zi5idWZmZXIgID0gRkFSX1BUUihqdW5rX3BrdCk7CisKKyAgICBweGVfY2FsbChQWEVOVl9VRFBfUkVBRCwgJnJlYWRfYnVmKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgcHhlX2RldGVjdF9uaWNfdHlwZSh2b2lkKQoreworICAgIHN0YXRpYyBfX2xvd21lbSB0X1BYRU5WX1VORElfR0VUX05JQ19UWVBFIG5pY190eXBlOworCisgICAgaWYgKHB4ZV9jYWxsKFBYRU5WX1VORElfR0VUX05JQ19UWVBFLCAmbmljX3R5cGUpKQorCXJldHVybiAtMTsJCS8qIFVua25vd24gTklDICovCisKKyAgICBpZiAobmljX3R5cGUuTmljVHlwZSAhPSBQQ0lfTklDICYmIG5pY190eXBlLk5pY1R5cGUgIT0gQ2FyZEJ1c19OSUMpCisJcmV0dXJuIC0xOwkJLyogTm90IGEgUENJIE5JQyAqLworCisgICAgLyoKKyAgICAgKiBSZXR1cm4gVklEOkRJRCBhcyBhIHNpbmdsZSBudW1iZXIsIHdpdGggdGhlIFZJRCBpbiB0aGUgaGlnaCB3b3JkCisgICAgICogLS0gdGhpcyBpcyBvcHBvc2l0ZSBmcm9tIHRoZSB1c3VhbCBvcmRlciwgYnV0IGl0IG1ha2VzIGl0IGVhc2llciB0bworICAgICAqIGVuZm9yY2UgdGhhdCB0aGUgdGFibGUgaXMgc29ydGVkLgorICAgICAqLworICAgIHJldHVybiAobmljX3R5cGUuaW5mby5wY2kuVmVuZG9yX0lEIDw8IDE2KSArIG5pY190eXBlLmluZm8ucGNpLkRldl9JRDsKK30KKworI2RlZmluZSBQQ0lfREVWKHZpZCwgZGlkKQkoKCh2aWQpIDw8IDE2KSArIChkaWQpKQorCisvKiBUaGlzIGFycmF5IHNob3VsZCBiZSBzb3J0ZWQhISAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IHB4ZV9uZWVkX2lkbGVfZHJhaW5bXSA9Cit7CisgICAgLyoKKyAgICAgKiBPbGRlciBCcm9hZGNvbSBOSUNzOiB0aGV5IG5lZWQgcmVjZWl2ZSBjYWxscyBvbiBpZGxlIHRvIGF2b2lkCisgICAgICogRklGTyBzdGFsbHMuCisgICAgICovCisgICAgUENJX0RFVigweDE0ZTQsIDB4MTY1OSksCS8qIEJDTTU3MjEgKi8KKyAgICBQQ0lfREVWKDB4MTRlNCwgMHgxNjVhKSwJLyogQkNNNTcyMiAqLworICAgIFBDSV9ERVYoMHgxNGU0LCAweDE2NWIpLAkvKiBCQ001NzIzICovCisgICAgUENJX0RFVigweDE0ZTQsIDB4MTY2OCksCS8qIEJDTTU3MTQgKi8KKyAgICBQQ0lfREVWKDB4MTRlNCwgMHgxNjY5KSwJLyogQkNNNTcxNFMgKi8KKyAgICBQQ0lfREVWKDB4MTRlNCwgMHgxNjZhKSwJLyogQkNNNTc4MCAqLworICAgIFBDSV9ERVYoMHgxNGU0LCAweDE2NzMpLAkvKiBCQ001NzU1TSAqLworICAgIFBDSV9ERVYoMHgxNGU0LCAweDE2NzQpLAkvKiBCQ001NzU2TUUgKi8KKyAgICBQQ0lfREVWKDB4MTRlNCwgMHgxNjc4KSwJLyogQkNNNTcxNSAqLworICAgIFBDSV9ERVYoMHgxNGU0LCAweDE2NzkpLAkvKiBCQ001NzE1UyAqLworICAgIFBDSV9ERVYoMHgxNGU0LCAweDE2N2IpLAkvKiBCQ001NzU1ICovCit9OworCit2b2lkIHB4ZV9pZGxlX2luaXQodm9pZCkKK3sKKyAgICB1aW50MzJfdCBkZXZfaWQgPSBweGVfZGV0ZWN0X25pY190eXBlKCk7CisgICAgaW50IGwsIGg7CisgICAgYm9vbCBmb3VuZDsKKworICAgIGwgPSAwOworICAgIGggPSBzaXplb2YgcHhlX25lZWRfaWRsZV9kcmFpbiAvIHNpemVvZiBweGVfbmVlZF9pZGxlX2RyYWluWzBdIC0gMTsKKworICAgIGZvdW5kID0gZmFsc2U7CisgICAgd2hpbGUgKGggPj0gbCkgeworCWludCB4ID0gKGwraCkgPj4gMTsKKwl1aW50MzJfdCBpZCA9IHB4ZV9uZWVkX2lkbGVfZHJhaW5beF07CisKKwlpZiAoaWQgPT0gZGV2X2lkKSB7CisJICAgIGZvdW5kID0gdHJ1ZTsKKwkgICAgYnJlYWs7CisJfSBlbHNlIGlmIChpZCA8IGRldl9pZCkgeworCSAgICBsID0geCsxOworCX0gZWxzZSB7CisJICAgIGggPSB4LTE7CisJfQorICAgIH0KKworICAgIGlmIChmb3VuZCkKKwlpZGxlX2hvb2tfZnVuYyA9IHB4ZV9pZGxlX3BvbGw7Cit9CisKK3ZvaWQgcHhlX2lkbGVfY2xlYW51cCh2b2lkKQoreworICAgIGlkbGVfaG9va19mdW5jID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvbGVnYWN5bmV0L3BvcnRudW0uYyBiL2NvcmUvbGVnYWN5bmV0L3BvcnRudW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTBhZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sZWdhY3luZXQvcG9ydG51bS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgInB4ZS5oIgorCisvKiBQb3J0IG51bWJlciBiaXRtYXAgLSBwb3J0IG51bWJlcnMgNDkxNTIgKDB4YzAwMCkgdG8gNTczNDMgKDB4ZWZmZikgKi8KKyNkZWZpbmUgUE9SVF9OVU1CRVJfQkFTRQk0OTE1MgorI2RlZmluZSBQT1JUX05VTUJFUl9DT1VOVAk4MTkyIC8qIFBvd2VyIG9mIDIsIHBsZWFzZSAqLworc3RhdGljIHVpbnQzMl90IHBvcnRfbnVtYmVyX2JpdG1hcFtQT1JUX05VTUJFUl9DT1VOVC8zMl07CitzdGF0aWMgdWludDE2X3QgZmlyc3RfcG9ydF9udW1iZXIgLyogPSAwICovOworCisvKgorICogQml0bWFwIGZ1bmN0aW9ucworICovCitzdGF0aWMgYm9vbCB0ZXN0X2JpdChjb25zdCB1aW50MzJfdCAqYml0bWFwLCBpbnQzMl90IGluZGV4KQoreworICAgIHVpbnQ4X3Qgc3Q7CisgICAgYXNtKCJidGwgJTIsJTEgOyBzZXRjICUwIiA6ICI9cW0iIChzdCkgOiAibSIgKCpiaXRtYXApLCAiciIgKGluZGV4KSk7CisgICAgcmV0dXJuIHN0OworfQorCitzdGF0aWMgdm9pZCBzZXRfYml0KHVpbnQzMl90ICpiaXRtYXAsIGludDMyX3QgaW5kZXgpCit7CisgICAgYXNtIHZvbGF0aWxlKCJidHNsICUxLCUwIiA6ICIrbSIgKCpiaXRtYXApIDogInIiIChpbmRleCkgOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyB2b2lkIGNscl9iaXQodWludDMyX3QgKmJpdG1hcCwgaW50MzJfdCBpbmRleCkKK3sKKyAgICBhc20gdm9sYXRpbGUoImJ0Y2wgJTEsJTAiIDogIittIiAoKmJpdG1hcCkgOiAiciIgKGluZGV4KSA6ICJtZW1vcnkiKTsKK30KKworLyoKKyAqIEdldCBhbmQgZnJlZSBhIHBvcnQgbnVtYmVyIChob3N0IGJ5dGUgb3JkZXIpCisgKi8KK3VpbnQxNl90IGdldF9wb3J0KHZvaWQpCit7CisgICAgdWludDE2X3QgcG9ydDsKKworICAgIGRvIHsKKwlwb3J0ID0gZmlyc3RfcG9ydF9udW1iZXIrKzsKKwlmaXJzdF9wb3J0X251bWJlciAmPSBQT1JUX05VTUJFUl9DT1VOVCAtIDE7CisgICAgfSB3aGlsZSAodGVzdF9iaXQocG9ydF9udW1iZXJfYml0bWFwLCBwb3J0KSk7CisKKyAgICBzZXRfYml0KHBvcnRfbnVtYmVyX2JpdG1hcCwgcG9ydCk7CisgICAgcmV0dXJuIGh0b25zKHBvcnQgKyBQT1JUX05VTUJFUl9CQVNFKTsKK30KKwordm9pZCBmcmVlX3BvcnQodWludDE2X3QgcG9ydCkKK3sKKyAgICBwb3J0ID0gbnRvaHMocG9ydCkgLSBQT1JUX05VTUJFUl9CQVNFOworCisgICAgaWYgKHBvcnQgPj0gUE9SVF9OVU1CRVJfQ09VTlQpCisJcmV0dXJuOworCisgICAgY2xyX2JpdChwb3J0X251bWJlcl9iaXRtYXAsIHBvcnQpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9sb2NhbGJvb3QuYyBiL2NvcmUvbG9jYWxib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2MzVkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbG9jYWxib290LmMKQEAgLTAsMCArMSw5NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAxOTk5LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisjaW5jbHVkZSA8c3lzL2lvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8Ymlvcy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3ZpZGVvLmg+CisKKy8qCisgKiBsb2NhbGJvb3QuYworICoKKyAqIEJvb3QgZnJvbSBhIGxvY2FsIGRpc2ssIG9yIGludm9rZSBJTlQgMThoLgorICovCisKKyNkZWZpbmUgTE9DQUxCT09UX01TRwkiQm9vdGluZyBmcm9tIGxvY2FsIGRpc2suLi4iCisKKyNkZWZpbmUgcmV0cnlfY291bnQJMTYKKworZXh0ZXJuIHZvaWQgbG9jYWxfYm9vdDE2KHZvaWQpOworCisvKgorICogQm9vdCBhIHNwZWNpZmllZCBsb2NhbCBkaXNrLiAgQVggc3BlY2lmaWVzIHRoZSBCSU9TIGRpc2sgbnVtYmVyOyBvcgorICogLTEgaW4gY2FzZSB3ZSBzaG91bGQgZXhlY3V0ZSBJTlQgMThoICgibmV4dCBkZXZpY2UuIikKKyAqLworX19leHBvcnQgdm9pZCBsb2NhbF9ib290KGludDE2X3QgYXgpCit7CisJY29tMzJzeXNfdCBpcmVnLCBvcmVnOworCWludCBpOworCisgICAgICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mKGlyZWcpKTsKKwlzeXNsaW51eF9mb3JjZV90ZXh0X21vZGUoKTsKKworCXdyaXRlc3RyKExPQ0FMQk9PVF9NU0cpOworCWNybGYoKTsKKwljbGVhbnVwX2hhcmR3YXJlKCk7CisKKwlpZiAoYXggPT0gLTEpIHsKKwkJLyogSG9wZSB0aGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nICovCisJCV9faW50Y2FsbCgweDE4LCAmemVyb19yZWdzLCBOVUxMKTsKKworCQkvKiBJZiB3ZSByZXR1cm5lZCwgb2ggYm95Li4uICovCisJCWthYm9vbSgpOworCX0KKworCS8qCisJICogTG9hZCBib290IHNlY3RvciBmcm9tIHRoZSBzcGVjaWZpZWQgQklPUyBkZXZpY2UgYW5kIGp1bXAgdG8KKwkgKiBpdC4KKwkgKi8KKwltZW1zZXQoJmlyZWcsIDAsIHNpemVvZiBpcmVnKTsKKwlpcmVnLmVkeC5iWzBdID0gYXggJiAweGZmOworCWlyZWcuZWF4LndbMF0gPSAwOwkvKiBSZXNldCBkcml2ZSAqLworCV9faW50Y2FsbCgweDEzLCAmaXJlZywgTlVMTCk7CisKKwltZW1zZXQoJmlyZWcsIDAsIHNpemVvZihpcmVnKSk7CisJaXJlZy5lYXgud1swXSA9IDB4MDIwMTsJLyogUmVhZCBvbmUgc2VjdG9yICovCisJaXJlZy5lY3gud1swXSA9IDB4MDAwMTsJLyogQy9IL1MgPSAwLzAvMSAoZmlyc3Qgc2VjdG9yKSAqLworCWlyZWcuZWJ4LndbMF0gPSBPRkZTKHRyYWNrYnVmKTsKKwlpcmVnLmVzID0gU0VHKHRyYWNrYnVmKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXRyeV9jb3VudDsgaSsrKSB7CisJCV9faW50Y2FsbCgweDEzLCAmaXJlZywgJm9yZWcpOworCisJCWlmICghKG9yZWcuZWZsYWdzLmwgJiBFRkxBR1NfQ0YpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcmV0cnlfY291bnQpCisJCWthYm9vbSgpOworCisJY2xpKCk7CQkJLyogQWJhbmRvbiBob3BlLCB5ZSB3aG8gZW50ZXIgaGVyZSAqLworCW1lbWNweSgodm9pZCAqKTB4MDdDMDAsIHRyYWNrYnVmLCA1MTIpOworCisJaXJlZy5lc2kud1swXSA9IE9GRlModHJhY2tidWYpOworCWlyZWcuZWRpLndbMF0gPSAweDA3QzAwOworCWlyZWcuZWR4LndbMF0gPSBheDsKKwljYWxsMTYobG9jYWxfYm9vdDE2LCAmaXJlZywgTlVMTCk7Cit9CisKK3ZvaWQgcG1fbG9jYWxfYm9vdChjb20zMnN5c190ICpyZWdzKQoreworCWxvY2FsX2Jvb3QocmVncy0+ZWF4LndbMF0pOworfQpkaWZmIC0tZ2l0IGEvY29yZS9sb2NhbGJvb3QuaW5jIGIvY29yZS9sb2NhbGJvb3QuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ODQwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2xvY2FsYm9vdC5pbmMKQEAgLTAsMCArMSw3IEBACisJCXNlY3Rpb24gLnRleHQxNgorCQlnbG9iYWwgbG9jYWxfYm9vdDE2OmZ1bmN0aW9uIGhpZGRlbgorbG9jYWxfYm9vdDE2OgorCQltb3YgY3gsMAorCQltb3Ygc3MsY3gKKwkJbW92IHNwLDdDMDBoCisJCWptcCAwOjA3QzAwaApkaWZmIC0tZ2l0IGEvY29yZS9sc3RhZGp1c3QucGwgYi9jb3JlL2xzdGFkanVzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZWM1NDAyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sc3RhZGp1c3QucGwKQEAgLTAsMCArMSw1NyBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFRha2UgYSBOQVNNIGxpc3QgYW5kIG1hcCBmaWxlIGFuZCBtYWtlIHRoZSBvZmZzZXRzIGluIHRoZSBsaXN0IGZpbGUKKyMgYWJzb2x1dGUuICBUaGlzIG1ha2VzIGRlYnVnZ2luZyBhIGxvdCBlYXNpZXIuCisjCisjIFVzYWdlOgorIworIyAgbHN0YWRqdXN0LnBsIGxpc3RmaWxlIG1hcGZpbGUgb3V0ZmlsZQorIworCisoJGxpc3RmaWxlLCAkbWFwZmlsZSwgJG91dGZpbGUpID0gQEFSR1Y7CisKK29wZW4oTFNULCAiPCAkbGlzdGZpbGVcMCIpCisgICAgb3IgZGllICIkMDogY2Fubm90IG9wZW46ICRsaXN0ZmlsZTogJCFcbiI7CitvcGVuKE1BUCwgIjwgJG1hcGZpbGVcMCIpCisgICAgb3IgZGllICIkMDogY2Fubm90IG9wZW46ICRtYXBmaWxlOiAkIVxuIjsKK29wZW4oT1VULCAiPiAkb3V0ZmlsZVwwIikKKyAgICBvciBkaWUgIiQwOiBjYW5ub3QgY3JlYXRlOiAkb3V0ZmlsZTogJCFcbiI7CisKKyV2c3RhcnQgPSAoKTsKKword2hpbGUgKGRlZmluZWQoJGxpbmUgPSA8TUFQPikpIHsKKyAgICBpZiAoJGxpbmUgPX4gL15ccyooWzAtOV0rKVxzKyhcUyspXHMrKFswLTlhLWZdKylccysoWzAtOWEtZl0rKVxzKyhbMC05YS1mXSspXHMrKFswLTlhLWZdKylccysyXCpcKihbMC05XSspL2kpIHsKKwkkdnN0YXJ0eyQyfSA9IGhleCAkNDsKKyAgICB9Cit9CitjbG9zZShNQVApOworCiskb2Zmc2V0ID0gMDsKK0Bvc3RhY2sgPSAoKTsKKword2hpbGUgKGRlZmluZWQoJGxpbmUgPSA8TFNUPikpIHsKKyAgICBjaG9tcCAkbGluZTsKKworICAgICRzb3VyY2UgPSBzdWJzdHIoJGxpbmUsIDQwKTsKKyAgICBpZiAoJHNvdXJjZSA9fiAvXihbXjtdKik7LykgeworCSRzb3VyY2UgPSAkMTsKKyAgICB9CisKKyAgICAoJGxhYmVsLCAkb3AsICRhcmcsICR0YWlsKSA9IHNwbGl0KC9ccysvLCAkc291cmNlKTsKKyAgICBpZiAoJG9wID1+IC9eKHxcWylzZWN0aW9uJC9pKSB7CisJJG9mZnNldCA9ICR2c3RhcnR7JGFyZ307CisgICAgfSBlbHNpZiAoJG9wID1+IC9eKGFic29sdXRlfFxbYWJzb2x1dGUpJC9pKSB7CisJJG9mZnNldCA9IDA7CisgICAgfSBlbHNpZiAoJG9wID1+IC9ec3RydWMkL2kpIHsKKwlwdXNoKEBvc3RhY2ssICRvZmZzZXQpOworCSRvZmZzZXQgPSAwOworICAgIH0gZWxzaWYgKCRvcCA9fiAvXmVuZHN0cnVjJC9pKSB7CisJJG9mZnNldCA9IHBvcChAb3N0YWNrKTsKKyAgICB9CisKKyAgICBpZiAoJGxpbmUgPX4gL14oXHMqWzAtOV0rICkoWzAtOUEtRl17OH0pKFxzLiopJC8pIHsKKwkkbGluZSA9IHNwcmludGYoIiVzJTA4WCVzIiwgJDEsIChoZXggJDIpKyRvZmZzZXQsICQzKTsKKyAgICB9CisKKyAgICBwcmludCBPVVQgJGxpbmUsICJcbiI7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvQ0hBTkdFTE9HIGIvY29yZS9sd2lwL0NIQU5HRUxPRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTI3YTY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL0NIQU5HRUxPRwpAQCAtMCwwICsxLDMwNTAgQEAKK0hJU1RPUlkKKworKENWUyBIRUFEKQorCisgICogW0VudGVyIG5ldyBjaGFuZ2VzIGp1c3QgYWZ0ZXIgdGhpcyBsaW5lIC0gZG8gbm90IHJlbW92ZSB0aGlzIGxpbmVdCisKKyArKyBOZXcgZmVhdHVyZXM6CisKKworICsrIEJ1Z2ZpeGVzOgorCisKKworCisoU1RBQkxFLTEuNC4wKQorCisgICsrIE5ldyBmZWF0dXJlczoKKworICAyMDExLTAzLTI3OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcF9pbXBsLmgsIHRjcF9pbi5jLCB0Y3Bfb3V0LmM6IFJlbW92ZWQgJ2RhdGFwdHInIGZyb20gJ3N0cnVjdCB0Y3Bfc2VnJyBhbmQKKyAgICBjYWxjdWxhdGUgaXQgaW4gdGNwX3plcm9fd2luZG93X3Byb2JlICh0aGUgb25seSBwbGFjZSB3aGVyZSBpdCB3YXMgdXNlZCkuCisKKyAgMjAxMC0xMS0yMTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmMvLmg6IEFkZGVkIGEgZnVuY3Rpb24gdG8gZGVhbGxvY2F0ZSB0aGUgc3RydWN0IGRoY3AgZnJvbSBhIG5ldGlmCisgICAgKGZpeGVzIGJ1ZyAjMzE1MjUpLgorCisgIDIwMTAtMDctMTI6IFNpbW9uIEdvbGRzY2htaWR0IChwYXRjaCBieSBTdGVwaGFuZSBMZXNhZ2UpCisgICogaXAuYywgdWRwLmMvLmgsIHBidWYuaCwgc29ja2V0cy5jOiB0YXNrICMxMDQ5NTogQWRkZWQgc3VwcG9ydCBmb3IKKyAgICBJUF9NVUxUSUNBU1RfTE9PUCBhdCBzb2NrZXQtIGFuZCByYXctQVBJIGxldmVsLgorCisgIDIwMTAtMDYtMTY6IFNpbW9uIEdvbGRzY2htaWR0CisgICogaXAuYzogQWRkZWQgYW4gb3B0aW9uYWwgZGVmaW5lIChMV0lQX0lQX0FDQ0VQVF9VRFBfUE9SVCkgdGhhdCBjYW4gYWxsb3cKKyAgICBsaW5rLWxheWVyLWFkZHJlc3NlZCBVRFAgdHJhZmZpYyB0byBiZSByZWNlaXZlZCB3aGlsZSBhIG5ldGlmIGlzIGRvd24gKGp1c3QKKyAgICBsaWtlIERIQ1AgZHVyaW5nIGNvbmZpZ3VyYXRpb24pCisKKyAgMjAxMC0wNS0yMjogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtYW55IG1hbnkgZmlsZXM6IGJ1ZyAjMjczNTI6IHJlbW92ZWQgcGFja2luZyBmcm9tIGlwX2FkZHJfdCwgdGhlIHBhY2tlZAorICAgIHZlcnNpb24gaXMgbm93IG9ubHkgdXNlZCBpbiBwcm90b2NvbCBoZWFkZXJzLiBBZGRlZCBnbG9iYWwgc3RvcmFnZSBmb3IKKyAgICBjdXJyZW50IHNyYy9kZXN0IElQIGFkZHJlc3Mgd2hpbGUgaW4gaW5wdXQgZnVuY3Rpb25zLgorCisgIDIwMTAtMDUtMTY6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZGVmLmg6IHRhc2sgIzEwMzkxOiBBZGQgcHJlcHJvY2Vzc29yLW1hY3JvcyBmb3IgY29tcGlsZS10aW1lIGh0b25sCisgICAgY2FsY3VsYXRpb24gKGFuZCB1c2UgdGhlbSB0aHJvdWdob3V0IHRoZSBzdGFjayB3aGVyZSBhcHBsaWNhYmxlKQorCisgIDIwMTAtMDUtMTY6IFNpbW9uIEdvbGRzY2htaWR0CisgICogb3B0LmgsIG1lbXBfc3RkLmgsIG1lbXAuYywgcHBwX29lLmgvLmM6IFBQUG9FIG5vdyB1c2VzIGl0cyBvd24gTUVNUCBwb29sCisgICAgaW5zdGVhZCBvZiB0aGUgaGVhcCAobW92ZWQgc3RydWN0IHBwcG9lX3NvZnRjIGZyb20gcHBwX29lLmMgdG8gcHBwX29lLmgpCisKKyAgMjAxMC0wNS0xNjogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBvcHQuaCwgbWVtcF9zdGQuaCwgZG5zLmgvLmM6IEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDIHVzZXMgaXRzIG93bgorICAgIE1FTVAgcG9vbCBpbnN0ZWFkIG9mIHRoZSBoZWFwCisKKyAgMjAxMC0wNS0xMzogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3AuYywgdWRwLmM6IHRhc2sgIzY5OTU6IEltcGxlbWVudCBTT19SRVVTRUFERFIgKGNvcnJlY3RseSksIGFkZGVkCisgICAgbmV3IG9wdGlvbiBTT19SRVVTRV9SWFRPQUxMIHRvIHBhc3MgcmVjZWl2ZWQgVURQIGJyb2FkY2FzdC9tdWx0aWNhc3QKKyAgICBwYWNrZXRzIHRvIG1vcmUgdGhhbiBvbmUgcGNiLgorCisgIDIwMTAtMDUtMDI6IFNpbW9uIEdvbGRzY2htaWR0CisgICogbmV0YnVmLmgvLmMsIHNvY2tldHMuYywgYXBpX21zZy5jOiB1c2UgY2hlY2tzdW0tb24tY29weSBmb3Igc2VuZGluZworICAgIFVEUCBkYXRhIGZvciBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGPT0xCisKKyAgMjAxMC0wNC0zMDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB1ZHAuaC8uYywgcGJ1Zi5oLy5jOiB0YXNrICM2ODQ5OiBhZGRlZCB1ZHBfc2VuZChfdG8vX2lmKSBmdW5jdGlvbnMgdGhhdAorICAgIHRha2UgYSBwcmVjYWxjdWxhdGVkIGNoZWNrc3VtLCBhZGRlZCBwYnVmX2ZpbGxfY2hrc3VtKCkgdG8gY29weSBkYXRhCisgICAgaW50byBhIHBidWYgYW5kIGF0IHRoZSBzYW1lIHRpbWUgY2FsY3VsYXRpbmcgdGhlIGNoZWNrc3VtIGZvciB0aGF0IGRhdGEKKworICAyMDEwLTA0LTI5OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGlwX2FkZHIuaCwgZXRoYXJwLmgvLmMsIGF1dG9pcC5jOiBDcmVhdGUgb3ZlcnJpZGFibGUgbWFjcm9zIGZvciBjb3B5aW5nCisgICAgMi1ieXRlLWFsaWduZWQgSVAgYWRkcmVzc2VzIGFuZCBNQUMgYWRkcmVzc2VzCisKKyAgMjAxMC0wNC0yODogUGF0Y2ggYnkgQmlsbCBBdWVyYmFjaAorICAqIGlwLmM6IElubGluZSBnZW5lcmF0aW5nIElQIGNoZWNrc3VtIHRvIHNhdmUgYSBmdW5jdGlvbiBjYWxsCisKKyAgMjAxMC0wNC0xNDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3BpcC5oLy5jLCB0aW1lcnMuYzogQWRkZWQgYW4gb3ZlcnJpZGFibGUgZGVmaW5lIHRvIGdldCBpbmZvcm1lZCB3aGVuIHRoZQorICAgIHRjcGlwX3RocmVhZCBwcm9jZXNzZXMgbWVzc2FnZXMgb3IgdGltZW91dHMgdG8gaW1wbGVtZW50IGEgd2F0Y2hkb2cuCisKKyAgMjAxMC0wMy0yODogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpcF9mcmFnLmM6IGNyZWF0ZSBhIG5ldyAoY29udGlndW91cykgUEJVRl9SQU0gZm9yIGV2ZXJ5IG91dGdvaW5nCisgICAgZnJhZ21lbnQgaWYgTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRj09MQorCisgIDIwMTAtMDMtMjc6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZXRoYXJwLmM6IFNwZWVkdXAgVFggYnkgbW92aW5nIGNvZGUgZnJvbSBmaW5kX2VudHJ5IHRvIGV0aGFycF9vdXRwdXQvCisgICAgZXRoYXJwX3F1ZXJ5IHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgZnVuY3Rpb24gY2FsbHMgKGluc3BpcmVkIGJ5CisgICAgcGF0Y2ggIzcxMzUpLgorCisgIDIwMTAtMDMtMjA6IFNpbW9uIEdvbGRzY2htaWR0CisgICogb3B0LmgsIHRjcGlwLmMvLmg6IEFkZGVkIGFuIG9wdGlvbiB0byBkaXNhYmxlIHRjcGlwXyh1bil0aW1lb3V0IGNvZGUKKyAgICBzaW5jZSB0aGUgbGlua2VyIGNhbm5vdCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgdG8gc2F2ZSBzcGFjZS4KKworICAyMDEwLTAzLTIwOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oLCBldGhhcnAuYy8uaDogQWRkZWQgc3VwcG9ydCBmb3Igc3RhdGljIEFSUCB0YWJsZSBlbnRyaWVzCisKKyAgMjAxMC0wMy0xNDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3BfaW1wbC5oLCB0Y3Bfb3V0LmMsIGluZXRfY2hrc3VtLmgvLmM6IHRhc2sgIzY4NDk6IENhbGN1bGF0ZSBjaGVja3N1bQorICAgIHdoZW4gY3JlYXRpbmcgVENQIHNlZ21lbnRzLCBub3Qgd2hlbiAocmUtKXRyYW5zbWl0dGluZyB0aGVtLgorCisgIDIwMTAtMDMtMDc6IFNpbW9uIEdvbGRzY2htaWR0CisgICogc29ja2V0cy5jOiBidWcgIzI4Nzc1IChzZWxlY3QvZXZlbnRfY2FsbGJhY2s6IG9ubHkgY2hlY2sgc2VsZWN0X2NiX2xpc3QKKyAgICBvbiBjaGFuZ2UpIHBsdXMgdXNlIFNZU19MSUdIVFdFSUdIVF9QUk9UIHRvIHByb3RlY3QgdGhlIHNlbGVjdCBjb2RlLgorICAgIFRoaXMgc2hvdWxkIHNwZWVkIHVwIHJlY2VpdmluZyBkYXRhIG9uIHNvY2tldHMgYXMgdGhlIHNlbGVjdCBjb2RlIGluCisgICAgZXZlbnRfY2FsbGJhY2sgaXMgb25seSBleGVjdXRlZCB3aGVuIHNlbGVjdCBpcyB3YWl0aW5nLgorCisgIDIwMTAtMDMtMDY6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwX291dC5jOiB0YXNrICM3MDEzIChDcmVhdGUgb3B0aW9uIHRvIGhhdmUgYWxsIHBhY2tldHMgZGVsaXZlcmVkIHRvCisgICAgbmV0aWYtPm91dHB1dCBpbiBvbmUgcGllY2UpOiBBbHdheXMgY29weSB0byB0cnkgdG8gY3JlYXRlIHNpbmdsZSBwYnVmcworICAgIGluIHRjcF93cml0ZS4KKworICAyMDEwLTAzLTA2OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaS5oLCBhcGlfbGliLmMsIHNvY2tldHMuYzogdGFzayAjMTAxNjcgKHNvY2tldHM6IHNwZWVkIHVwIFRDUCByZWN2CisgICAgYnkgbm90IGFsbG9jYXRpbmcgYSBuZXRidWYpOiBhZGRlZCBmdW5jdGlvbiBuZXRjb25uX3JlY3ZfdGNwX3BidWYoKQorICAgIGZvciB0Y3AgbmV0Y29ubnMgdG8gcmVjZWl2ZSBwYnVmcywgbm90IG5ldGJ1ZnM7IHVzZSB0aGF0IGZ1bmN0aW9uCisgICAgZm9yIHRjcCBzb2NrZXRzLgorCisgIDIwMTAtMDMtMDU6IEpha29iIE9sZSBTdG9rbHVuZHNlbiAvIFNpbW9uIEdvbGRzY2htaWR0CisgICogb3B0LmgsIHRjcC5oLCB0Y3BfaW1wbC5oLCB0Y3AuYywgdGNwX2luLmMsIHRjcF9vdXQuYzogdGFzayAjNzA0MDoKKyAgICBXb3JrIG9uIHRjcF9lbnF1ZXVlOiBEb24ndCB3YXN0ZSBtZW1vcnkgd2hlbiBjaGFpbmluZyBzZWdtZW50cywKKyAgICBhZGRlZCBvcHRpb24gVENQX09WRVJTSVpFIHRvIHByZXZlbnQgY3JlYXRpbmcgbWFueSBzbWFsbCBwYnVmcyB3aGVuCisgICAgY2FsbGluZyB0Y3Bfd3JpdGUgd2l0aCBtYW55IHNtYWxsIGJsb2NrcyBvZiBkYXRhLiBJbnN0ZWFkLCBwYnVmcyBhcmUKKyAgICBhbGxvY2F0ZWQgbGFyZ2VyIHRoYW4gbmVlZGVkIGFuZCB0aGUgc3BhY2UgaXMgdXNlZCBmb3IgbGF0ZXIgY2FsbHMgdG8KKyAgICB0Y3Bfd3JpdGUuCisKKyAgMjAxMC0wMi0yMTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzdGF0cy5jLy5oOiBBZGRlZCBjb25zdCBjaGFyKiBuYW1lIHRvIG1lbS0gYW5kIG1lbXAtc3RhdHMgZm9yIGVhc2llcgorICAgIGRlYnVnZ2luZy4KKworICAyMDEwLTAyLTIxOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5oIChhbmQgdXNhZ2VzKSwgYWRkZWQgdGNwX2ltcGwuaDogU3BsaXR0ZWQgQVBJIGFuZCBpbnRlcm5hbAorICAgIGltcGxlbWVudGF0aW9uIG9mIHRjcCB0byBtYWtlIEFQSSB1c2FnZSBjbGVhcmUgdG8gYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMKKworICAyMDEwLTAyLTE0OiBTaW1vbiBHb2xkc2NobWlkdC9TdGVwaGFuZSBMZXNhZ2UKKyAgKiBpcF9hZGRyLmg6IEltcHJvdmVkIHNvbWUgZGVmaW5lcyB3b3JraW5nIG9uIGlwIGFkZHJlc3NlcywgYWRkZWQgZmFzdGVyCisgICAgbWFjcm8gdG8gY29weSBhZGRyZXNzZXMgdGhhdCBjYW5ub3QgYmUgTlVMTAorCisgIDIwMTAtMDItMTM6IFNpbW9uIEdvbGRzY2htaWR0CisgICogYXBpLmgsIGFwaV9saWIuYywgYXBpX21zZy5jLCBzb2NrZXRzLmM6IHRhc2sgIzc4NjUgKGltcGxlbWVudCBub24tCisgICAgYmxvY2tpbmcgc2VuZCBvcGVyYXRpb24pCisKKyAgMjAxMC0wMi0xMjogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmMvLmg6IEFkZGVkIGEgbWluaW1hbCB2ZXJzaW9uIG9mIHBvc2l4IGZjdGwoKSB0byBoYXZlIGEKKyAgICBzdGFuZGFyZGlzZWQgd2F5IHRvIHNldCBPX05PTkJMT0NLIGZvciBub25ibG9ja2luZyBzb2NrZXRzLgorCisgIDIwMTAtMDItMTI6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZGhjcC5jLy5oLCBhdXRvaXAuYy8uaDogdGFzayAjMTAxMzkgKFByZWZlciBzdGF0aWNhbGx5IGFsbG9jYXRlZAorICAgIG1lbW9yeSk6IGFkZGVkIGF1dG9pcF9zZXRfc3RydWN0KCkgYW5kIGRoY3Bfc2V0X3N0cnVjdCgpIHRvIGxldCBhdXRvaXAKKyAgICBhbmQgZGhjcCB3b3JrIHdpdGggdXNlci1hbGxvY2F0ZWQgc3RydWN0cyBpbnN0ZWFkIG9mIGNhbGxpbiBtZW1fbWFsbG9jCisKKyAgMjAxMC0wMi0xMjogU2ltb24gR29sZHNjaG1pZHQvSmVmZiBCYXJiZXIKKyAgKiB0Y3AuYy9oOiBwYXRjaCAjNjg2NSAoU09fUkVVU0VBRERSIGZvciBUQ1ApOiBpZiBwY2Iuc29fb3B0aW9ucyBoYXMKKyAgICBTT0ZfUkVVU0VBRERSIHNldCwgYWxsb3cgYmluZGluZyB0byBlbmRwb2ludCBpbiBUSU1FX1dBSVQKKworICAyMDEwLTAyLTEyOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHN5cyBsYXllcjogdGFzayAjMTAxMzkgKFByZWZlciBzdGF0aWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkpOiBjb252ZXJ0ZWQKKyAgICBtYm94IGFuZCBzZW1hcGhvcmUgZnVuY3Rpb25zIHRvIHRha2UgcG9pbnRlcnMgdG8gc3lzX21ib3hfdC9zeXNfc2VtX3Q7CisgICAgY29udmVydGVkIHN5c19tYm94X25ldy9zeXNfc2VtX25ldyB0byB0YWtlIHBvaW50ZXJzIGFuZCByZXR1cm4gZXJyX3Q7CisgICAgdGFzayAjNzIxMjogQWRkIE11dGV4IGNvbmNlcHQgaW4gc3lzX2FyY2ggKGRlZmluZSBMV0lQX0NPTVBBVF9NVVRFWAorICAgIHRvIGxldCBzeXMuaCB1c2UgYmluYXJ5IHNlbWFwaG9yZXMgaW5zdGVhZCBvZiBtdXRleGVzIC0gYXMgYmVmb3JlKQorCisgIDIwMTAtMDItMDk6IFNpbW9uIEdvbGRzY2htaWR0IChTaW1vbiBLYWxsd2VpdCkKKyAgKiB0aW1lcnMuYy8uaDogQWRkZWQgZnVuY3Rpb24gc3lzX3Jlc3RhcnRfdGltZW91dHMoKSBmcm9tIHBhdGNoICM3MDg1CisgICAgKFJlc3RhcnQgc3lzdGVtIHRpbWVvdXQgaGFuZGxpbmcpCisKKyAgMjAxMC0wMi0wOTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBuZXRpZi5jLy5oLCByZW1vdmVkIGxvb3BpZi5jLy5oOiB0YXNrICMxMDE1MyAoSW50ZWdyYXRlIGxvb3BpZiBpbnRvCisgICAgbmV0aWYuYykgLSBsb29waWYgZG9lcyBub3QgaGF2ZSB0byBiZSBjcmVhdGVkIGJ5IHRoZSBwb3J0IGFueSBtb3JlLAorICAgIGp1c3QgZGVmaW5lIExXSVBfSEFWRV9MT09QSUYgdG8gMS4KKworICAyMDEwLTAyLTA4OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGluZXQuaCwgaXBfYWRkci5jLy5oOiBBZGRlZCByZWVudHJhbnQgdmVyc2lvbnMgb2YgaW5ldF9udG9hL2lwYWRkcl9udG9hCisgICAgaW5ldF9udG9hX3IvaXBhZGRyX250b2FfcgorCisgIDIwMTAtMDItMDg6IFNpbW9uIEdvbGRzY2htaWR0CisgICogbmV0aWYuaDogQWRkZWQgbmV0aWZfcy9nZXRfaWdtcF9tYWNfZmlsdGVyKCkgbWFjcm9zCisKKyAgMjAxMC0wMi0wNTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBuZXRpZi5oOiBBZGRlZCBmdW5jdGlvbi1saWtlIG1hY3JvcyB0byBnZXQvc2V0IHRoZSBob3N0bmFtZSBvbiBhIG5ldGlmCisKKyAgMjAxMC0wMi0wNDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBuZWFybHkgZXZlcnkgZmlsZTogUmVwbGFjZWQgc3RydWN0IGlwX2FkZHIgYnkgdHlwZWRlZiBpcF9hZGRyX3QgdG8KKyAgICBtYWtlIGNoYW5naW5nIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gYmVoaW5kIHRoZSB0eXBlZGVmIGVhc2llci4KKworICAyMDEwLTAyLTAxOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oLCBtZW1wX3N0ZC5oLCBkbnMuaCwgbmV0ZGIuYywgbWVtcC5jOiBMZXQgbmV0ZGIgdXNlIGEgbWVtcCBwb29sCisgICAgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IHdoZW4gZ2V0YWRkcmluZm8oKSBpcyBjYWxsZWQuCisKKyAgMjAxMC0wMS0zMTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmgsIGRoY3AuYzogUmV3b3JrZWQgdGhlIGNvZGUgdGhhdCBwYXJzZXMgREhDUCBvcHRpb25zOiBwYXJzZQorICAgIHRoZW0gb25jZSBpbnN0ZWFkIG9mIHBhcnNpbmcgZm9yIGV2ZXJ5IG9wdGlvbi4gVGhpcyBhbHNvIHJlbW92ZXMKKyAgICB0aGUgbmVlZCBmb3IgbWVtX21hbGxvYyBmcm9tIGRoY3BfcmVjdiBhbmQgbWFrZXMgaXQgcG9zc2libGUgdG8KKyAgICBjb3JyZWN0bHkgcmV0cmlldmUgdGhlIEJPT1RQIGZpbGUuCisKKyAgMjAxMC0wMS0zMDogc2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmM6IFVzZSBTWVNfTElHSFRXRUlHSFRfUFJPVCBpbnN0ZWFkIG9mIGEgc2VtYXBob3JlIHRvIHByb3RlY3QKKyAgICB0aGUgc29ja2V0cyBhcnJheS4KKworICAyMDEwLTAxLTI5OiBTaW1vbiBHb2xkc2NobWlkdCAocGF0Y2ggYnkgTGF1cmEgR2FycmV0dCkKKyAgKiBhcGkuaCwgYXBpX21zZy5jLCBzb2NrZXRzLmM6IEFkZGVkIGV4Y2VwdCBzZXQgc3VwcG9ydCBpbiBzZWxlY3QKKyAgICAocGF0Y2ggIzY4NjApCisKKyAgMjAxMC0wMS0yOTogU2ltb24gR29sZHNjaG1pZHQgKHBhdGNoIGJ5IExhdXJhIEdhcnJldHQpCisgICogYXBpLmgsIHNvY2tldHMuaCwgZXJyLmgsIGFwaV9saWIuYywgYXBpX21zZy5jLCBzb2NrZXRzLmMsIGVyci5jOgorICAgIEFkZCBub24tYmxvY2tpbmcgc3VwcG9ydCBmb3IgY29ubmVjdCAocGFydGx5IGZyb20gcGF0Y2ggIzY4NjApLAorICAgIHBsdXMgbWFueSBjbGVhbnVwcyBpbiBzb2NrZXQgJiBuZXRjb25uIEFQSS4KKworICAyMDEwLTAxLTI3OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oLCB0Y3AuaCwgaW5pdC5jLCBhcGlfbXNnLmM6IEFkZGVkIFRDUF9TTkRRVUVVRUxPV0FUIGNvcnJlc3BvbmRpbmcKKyAgICB0byBUQ1BfU05ETE9XQVQgYW5kIGFkZGVkIHRjcF9zbmRxdWV1ZWxlbigpIC0gdGhpcyBmaXhlcyBidWcgIzI4NjA1CisKKyAgMjAxMC0wMS0yNjogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzbm1wOiBVc2UgbWVtcCBwb29scyBmb3Igc25tcCBpbnN0ZWFkIG9mIHRoZSBoZWFwOyBhZGRlZCA0IG5ldyBwb29scy4KKworICAyMDEwLTAxLTE0OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHBwcC5jLy5oOiBGaXhlZCBidWcgIzI3ODU2OiBQUFA6IFNldCBuZXRpZiBsaW5rLSBhbmQgc3RhdHVzLWNhbGxiYWNrCisgICAgYnkgYWRkaW5nIHBwcF9zZXRfbmV0aWZfc3RhdHVzY2FsbGJhY2soKS9wcHBfc2V0X25ldGlmX2xpbmtjYWxsYmFjaygpCisKKyAgMjAxMC0wMS0xMzogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtZW0uYzogVGhlIGhlYXAgbm93IG1heSBiZSBtb3ZlZCB0byB1c2VyLWRlZmluZWQgbWVtb3J5IGJ5IGRlZmluaW5nCisgICAgTFdJUF9SQU1fSEVBUF9QT0lOVEVSIGFzIGEgdm9pZCBwb2ludGVyIHRvIHRoYXQgbWVtb3J5J3MgYWRkcmVzcworICAgIChwYXRjaCAjNjk2NiBhbmQgYnVnICMyNjEzMykKKworICAyMDEwLTAxLTEwOiBTaW1vbiBHb2xkc2NobWlkdCAoQmlsbCBBdWVyYmFjaCkKKyAgKiBvcHQuaCwgbWVtcC5jOiBwYXRjaCAjNjgyMiAoQWRkIG9wdGlvbiB0byBwbGFjZSBtZW1vcnkgcG9vbHMgaW4KKyAgICBzZXBhcmF0ZSBhcnJheXMpCisKKyAgMjAxMC0wMS0xMDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpbml0LmMsIGlnbXAuYzogcGF0Y2ggIzY0NjMgKElHTVAgLSBBZGRpbmcgUmFuZG9tIERlbGF5KTogYWRkZWQgZGVmaW5lCisgICAgTFdJUF9SQU5EKCkgZm9yIGx3aXAtd2lkZSByYW5kb21pemF0aW9uICh0byBiZSBkZWZpbmVkIGluIGNjLmgpCisKKyAgMjAwOS0xMi0zMTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3BpcC5jLCBpbml0LmMsIG1lbXAuYywgc3lzLmMsIG1lbXBfc3RkLmgsIHN5cy5oLCB0Y3BpcC5oCisgICAgYWRkZWQgdGltZXJzLmMvLmg6IFNlcGFyYXRlZCB0aW1lciBpbXBsZW1lbnRhdGlvbiBmcm9tIHNlbWFwaG9yZS9tYm94CisgICAgaW1wbGVtZW50YXRpb24sIG1vdmVkIHRpbWVyIGltcGxlbWVudGF0aW9uIHRvIHRpbWVycy5jLy5oLCB0aW1lcnMgYXJlCisgICAgbm93IG9ubHkgY2FsbGVkIGZyb20gdGNwaXBfdGhyZWFkIG9yIGJ5IGV4cGxpY2l0bHkgY2hlY2tpbmcgdGhlbS4KKyAgICAoVEFTSyM3MjM1KQorCisgIDIwMDktMTItMjc6IFNpbW9uIEdvbGRzY2htaWR0CisgICogb3B0LmgsIGV0aGFycC5oLy5jLCBpbml0LmMsIHRjcGlwLmM6IEFkZGVkIGFuIGFkZGl0aW9uYWwgb3B0aW9uCisgICAgTFdJUF9FVEhFUk5FVCB0byBzdXBwb3J0IGV0aGVybmV0IHdpdGhvdXQgQVJQIChuZWNlc3NhcnkgZm9yIHB1cmUgUFBQb0UpCisKKworICArKyBCdWdmaXhlczoKKworICAyMDExLTA0LTIwOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHN5c19hcmNoLnR4dDogc3lzX2FyY2hfdGltZW91dHMoKSBpcyBub3QgbmVlZGVkIGFueSBtb3JlLgorCisgIDIwMTEtMDQtMTM6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmMsIHVkcC5jOiBGaXhlZCBidWcgIzMzMDQ4IChCYWQgcmFuZ2UgZm9yIElQIHNvdXJjZSBwb3J0IG51bWJlcnMpIGJ5CisgICAgdXNpbmcgcG9ydHMgaW4gdGhlIElBTkEgcHJpdmF0ZS9keW5hbWljIHJhbmdlICg0OTE1MiB0aHJvdWdoIDY1NTM1KS4KKworICAyMDExLTAzLTI5OiBTaW1vbiBHb2xkc2NobWlkdCwgcGF0Y2ggYnkgRW1pbCBMaHVuZ2RhaGw6CisgICogZXRoYXJwLmgvLmM6IEZpeGVkIGJyb2tlbiBWTEFOIHN1cHBvcnQuCisKKyAgMjAxMS0wMy0yNzogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3AuYzogRml4ZWQgYnVnICMzMjkyNiAoVENQX1JNVigmdGNwX2JvdW5kX3BjYnMpIGlzIGNhbGxlZCBvbiB1bmJvdW5kIHRjcAorICAgIHBjYnMpIGJ5IGNoZWNraW5nIGlmIHRoZSBwY2Igd2FzIGJvdW5kIChsb2NhbF9wb3J0ICE9IDApLgorCisgIDIwMTEtMDMtMjc6IFNpbW9uIEdvbGRzY2htaWR0CisgICogcHBwLmM6IEZpeGVkIGJ1ZyAjMzIyODAgKHBwcDogYSBwYnVmIGlzIGZyZWVkIHR3aWNlKQorCisgIDIwMTEtMDMtMjc6IFNpbW9uIEdvbGRzY2htaWR0CisgICogc29ja2V0cy5jOiBGaXhlZCBidWcgIzMyOTA2OiBsd2lwX2Nvbm5lY3QrbHdpcF9zZW5kIGRpZCBub3Qgd29yayBmb3IgdWRwIGFuZAorICAgIHJhdyBwY2JzIHdpdGggTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkc9PTEuCisgIAorICAyMDExLTAzLTI3OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcF9vdXQuYzogRml4ZWQgYnVnICMzMjgyMCAoT3V0Z29pbmcgVENQIGNvbm5lY3Rpb25zIGNyZWF0ZWQgYmVmb3JlIHJvdXRlCisgICAgaXMgcHJlc2VudCBuZXZlciB0aW1lcyBvdXQpIGJ5IHN0YXJ0aW5nIHJldHJhbnNtaXNzaW9uIHRpbWVyIGJlZm9yZSBjaGVja2luZworICAgIHJvdXRlLgorCisgIDIwMTEtMDMtMjI6IFNpbW9uIEdvbGRzY2htaWR0CisgICogcHBwLmM6IEZpeGVkIGJ1ZyAjMzI2NDggKFBQUCBjb2RlIGNyYXNoZXMgd2hlbiB0ZXJtaW5hdGluZyBhIGxpbmspIGJ5IG9ubHkKKyAgICBjYWxsaW5nIHNpb19yZWFkX2Fib3J0KCkgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyB2YWxpZC4KKworICAyMDExLTAzLTE0OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGVyci5oLy5jLCBzb2NrZXRzLmMsIGFwaV9tc2cuYzogZml4ZWQgYnVnICMzMTc0OCAoQ2FsbGluZyBub24tYmxvY2tpbmcgY29ubmVjdAorICAgIG1vcmUgdGhhbiBvbmNlIGNhbiByZW5kZXIgYSBzb2NrZXQgdXNlbGVzcykgc2luY2UgaXQgbWFpbmx5IGludm9sdmVzIGNoYW5naW5nCisgICAgIkZBVEFMIiBjbGFzc2lmaWNhdGlvbiBvZiBlcnJvciBjb2RlczogRVJSX1VTRSBhbmQgRVJSX0lTQ09OTiBqdXN0IGFyZW4ndCBmYXRhbC4KKworICAyMDExLTAzLTEzOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNvY2tldHMuYzogZml4ZWQgYnVnICMzMjc2OSAoRVNIVVRET1dOIGlzIGxpbnV4LXNwZWNpZmljKSBieSBmaXhpbmcKKyAgICBlcnJfdG9fZXJybm9fdGFibGUgKEVSUl9DTFNEOiBFTk9UQ09OTiBpbnN0ZWFkIG9mIEVTSFVURE9XTiksIEVSUl9JU0NPTk46CisgICAgdXNlIEVBTFJBRFkgaW5zdGVhZCBvZiAtMQorCisgIDIwMTEtMDMtMTM6IFNpbW9uIEdvbGRzY2htaWR0CisgICogYXBpX2xpYi5jOiBuZXRjb25uX2FjY2VwdDogcmV0dXJuIEVSUl9BQlJUIGluc3RlYWQgb2YgRVJSX0NMU0QgaWYgdGhlCisgICAgY29ubmVjdGlvbiBoYXMgYmVlbiBhYm9ydGVkIGJ5IGVycl90Y3AgKHNpbmNlIHRoaXMgaXMgbm90IGEgbm9ybWFsIGNsb3NpbmcKKyAgICBwcm9jZWR1cmUpLgorCisgIDIwMTEtMDMtMTM6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmM6IHRjcF9iaW5kOiByZXR1cm4gRVJSX1ZBTCBpbnN0ZWFkIG9mIEVSUl9JU0NPTk4gd2hlbiB0cnlpbmcgdG8gYmluZAorICAgIHdpdGggcGNiLT5zdGF0ZSAhPSBDTE9TRUQKKworICAyMDExLTAyLTE3OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHJhd2FwaS50eHQ6IEZpeGVkIGJ1ZyAjMzI1NjEgdGNwX3BvbGwgYXJndW1lbnQgZGVmaW5pdGlvbiBvdXQtb2Ytb3JkZXIgaW4KKyAgICBkb2N1bWVudGF0aW9uCisKKyAgMjAxMS0wMi0xNzogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtYW55IGZpbGVzOiBBZGRlZCBtaXNzaW5nIFUvVUwgbW9kaWZpZXJzIHRvIGZpeCAxNi1iaXQtYXJjaCBwb3J0YWJpbGl0eS4KKworICAyMDExLTAxLTI0OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNvY2tldHMuYzogRml4ZWQgYnVnICMzMTc0MTogbHdpcF9zZWxlY3Qgc2VlbXMgdG8gaGF2ZSB0aHJlYWRpbmcgcHJvYmxlbXMKKworICAyMDEwLTEyLTAyOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGVyci5oOiBGaXhlZCBFUlJfSVNfRkFUQUwgc28gdGhhdCBFUlJfV09VTERCTE9DSyBpcyBub3QgZmF0YWwuCisKKyAgMjAxMC0xMS0yMzogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmMsIHNvY2tldHMuYzogbmV0Y29ubi5yZWN2X2F2YWlsIGlzIG9ubHkgdXNlZCBmb3IKKyAgICBMV0lQX1NPX1JDVkJVRiBhbmQgaW9jdGwvRklPTlJFQUQuCisKKyAgMjAxMC0xMS0yMzogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBldGhhcnAuYzogRml4ZWQgYnVnICMzMTcyMDogQVJQLXF1ZXVlaW5nOiBSRkMgMTEyMiByZWNvbW1lbmRzIHRvIHF1ZXVlIGF0CisgICAgbGVhc3QgMSBwYWNrZXQgLT4gQVJQX1FVRVVFSU5HPT0wIG5vdyBxdWV1ZXMgdGhlIG1vc3QgcmVjZW50IHBhY2tldC4KKworICAyMDEwLTExLTIzOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcF9pbi5jOiBGaXhlZCBidWcgIzMwNTc3OiB0Y3BfaW5wdXQ6IGRvbid0IGRpc2NhcmQgQUNLLW9ubHkgcGFja2V0cyBhZnRlcgorICAgIHJlZnVzaW5nICdyZWZ1c2VkX2RhdGEnIGFnYWluLgorICAKKyAgMjAxMC0xMS0yMjogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmM6IEZpeGVkIGJ1ZyAjMzE1OTA6IGdldHNvY2tvcHQoLi4uIFNPX0VSUk9SIC4uLikgZ2l2ZXMgRUlOUFJPR1JFU1MKKyAgICBhZnRlciBhIHN1Y2Nlc3NmdWwgbm9uYmxvY2tpbmcgY29ubmVjdGlvbi4KKworICAyMDEwLTExLTIyOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGV0aGFycC5jOiBGaXhlZCBidWcgIzMxNzIyOiBJUCBwYWNrZXRzIHNlbnQgd2l0aCBhbiBBdXRvSVAgc291cmNlIGFkZHIKKyAgICBtdXN0IGJlIHNlbnQgbGluay1sb2NhbAorCisgIDIwMTAtMTEtMjI6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGltZXJzLmM6IHBhdGNoICM3MzI5OiB0Y3BfdGltZXJfbmVlZGVkIHByb3RvdHlwZSB3YXMgaWZkZWYnZWQgb3V0IGZvcgorICAgIExXSVBfVElNRVJTPT0wCisKKyAgMjAxMC0xMS0yMDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmM6IEZpeGVkIGJ1ZyAjMzExNzA6IGx3aXBfc2V0c29ja29wdCgpIGRvZXMgbm90IHNldCBzb2NrZXQgbnVtYmVyCisKKyAgMjAxMC0xMS0yMDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmg6IEZpeGVkIGJ1ZyAjMzEzMDQ6IENoYW5nZWQgU0hVVF9SRCwgU0hVVF9XUiBhbmQgU0hVVF9SRFdSIHRvCisgICAgcmVzZW1ibGUgb3RoZXIgc3RhY2tzLgorCisgIDIwMTAtMTEtMjA6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZG5zLmM6IEZpeGVkIGJ1ZyAjMzE1MzU6IFRDUF9TTkRfUVVFVUVMRU4gbXVzdCBiZSBhdCBsZWFzdCAyIG9yIGVsc2UKKyAgICBuby1jb3B5IFRDUCB3cml0ZXMgd2lsbCBuZXZlciBzdWNjZWVkLgorCisgIDIwMTAtMTEtMjA6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZG5zLmM6IEZpeGVkIGJ1ZyAjMzE3MDE6IEVycm9yIHJldHVybiB2YWx1ZSBmcm9tIGRuc19nZXRob3N0YnluYW1lKCkgZG9lcworICAgIG5vdCBtYXRjaCBkb2N1bWVudGF0aW9uOiByZXR1cm4gRVJSX0FSRyBpbnN0ZWFkIG9mIEVSUl9WQUwgaWYgbm90CisgICAgaW5pdGlhbGl6ZWQgb3Igd3JvbmcgYXJndW1lbnQuCisKKyAgMjAxMC0xMC0yMDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmg6IEZpeGVkIGJ1ZyAjMzEzODU6IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpIGlzIDMwIGJ1dCBzaG91bGQgYmUgMTYKKworICAyMDEwLTEwLTA1OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGRoY3AuYzogT25jZSBhZ2FpbiBmaXhlZCAjMzAwMzg6IERIQ1AvQXV0b0lQIGNvb3BlcmF0aW9uIGZhaWxlZCB3aGVuCisgICAgcmVwbHVnZ2luZyB0aGUgbmV0d29yayBjYWJsZSBhZnRlciBhbiBBdXRvSVAgYWRkcmVzcyB3YXMgYXNzaWduZWQuCisKKyAgMjAxMC0wOC0xMDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3AuYzogRml4ZWQgYnVnICMzMDcyODogdGNwX25ld19wb3J0KCkgZGlkIG5vdCBjaGVjayBsaXN0ZW4gcGNicworCisgIDIwMTAtMDgtMDM6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdWRwLmMsIHJhdy5jOiBEb24ndCBjaGFpbiBlbXB0eSBwYnVmcyB3aGVuIHNlbmRpbmcgdGhlbSAoZml4ZXMgYnVnICMzMDYyNSkKKworICAyMDEwLTA4LTAxOiBTaW1vbiBHb2xkc2NobWlkdCAocGF0Y2ggYnkgR3JlZyBSZW5kYSkKKyAgKiBwcHAuYzogQXBwbGllZCBwYXRjaCAjNzI2NCAoUFBQIHByb3RvY29scyBhcmUgcmVqZWN0ZWQgaW5jb3JyZWN0bHkgb24gYmlnCisgICAgZW5kaWFuIGFyY2hpdGVjdHVyZXMpCisgIAorICAyMDEwLTA3LTI4OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9saWIuYywgYXBpX21zZy5jLCBzb2NrZXRzLmMsIG1pYjIuYzogRml4ZWQgY29tcGlsYXRpb24gd2l0aCBUQ1Agb3IgVURQCisgICAgZGlzYWJsZWQuCisgIAorICAyMDEwLTA3LTI3OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5jOiBGaXhlZCBidWcgIzMwNTY1ICh0Y3BfY29ubmVjdCgpIGNoZWNrIGJvdW5kIGxpc3QpOiB0aGF0IGNoZWNrIGRpZCBubworICAgIGhhcm0gYnV0IG5ldmVyIGRpZCBhbnl0aGluZworICAKKyAgMjAxMC0wNy0yMTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpcC5jOiBGaXhlZCBpbnZhbGlkIGZpeCBmb3IgYnVnICMzMDQwMiAoQ0hFQ0tTVU1fR0VOX0lQX0lOTElORSBkb2VzIG5vdAorICAgIGFkZCBJUCBvcHRpb25zKQorCisgIDIwMTAtMDctMTY6IEtpZXJhbiBNYW5zbGV5CisgICogbXNnX2luLmM6IEZpeGVkIFNOTVAgQVNOIGNvbnN0YW50IGRlZmluZXMgdG8gbm90IHVzZSAhIG9wZXJhdG9yIAorCisgIDIwMTAtMDctMTA6IFNpbW9uIEdvbGRzY2htaWR0CisgICogaXAuYzogRml4ZWQgYnVnICMzMDQwMjogQ0hFQ0tTVU1fR0VOX0lQX0lOTElORSBkb2VzIG5vdCBhZGQgSVAgb3B0aW9ucworCisgIDIwMTAtMDYtMzA6IFNpbW9uIEdvbGRzY2htaWR0CisgICogYXBpX21zZy5jOiBmaXhlZCBidWcgIzMwMzAwIChzaHV0ZG93biBwYXJhbWV0ZXIgd2FzIG5vdCBpbml0aWFsaXplZCBpbgorICAgIG5ldGNvbm5fZGVsZXRlKQorCisgIDIwMTAtMDYtMjg6IEtpZXJhbiBNYW5zbGV5CisgICogdGltZXJzLmMgcmVtb3ZlIHVucG9ydGFibGUgcHJpbnRpbmcgb2YgQyBmdW5jdGlvbiBwb2ludGVycworCisgIDIwMTAtMDYtMjQ6IFNpbW9uIEdvbGRzY2htaWR0CisgICogaW5pdC5jLCB0aW1lcnMuYy8uaCwgb3B0LmgsIG1lbXBfc3RkLmg6IEZyb20gcGF0Y2ggIzcyMjE6IGFkZGVkIGZsYWcKKyAgICBOT19TWVNfTk9fVElNRVJTIHRvIGRyb3AgdGltZXIgc3VwcG9ydCBmb3IgTk9fU1lTPT0xIGZvciBlYXNpZXIgdXBncmFkaW5nCisKKyAgMjAxMC0wNi0yNDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGkoX2xpYikuYy8uaCwgYXBpX21zZy5jLy5oLCBzb2NrZXRzLmMvLmg6IEZpeGVkIGJ1ZyAjMTAwODg6IENvcnJlY3RseQorICAgIGltcGxlbWVudGVkIHNodXRkb3duIGF0IHNvY2tldCBsZXZlbC4KKworICAyMDEwLTA2LTIxOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHBidWYuYy8uaCwgaXBfZnJhZy5jLy5oLCBvcHQuaCwgbWVtcF9zdGQuaDogRml4ZWQgYnVnICMyOTM2MSAoaXBfZnJhZyBoYXMKKyAgICBwcm9ibGVtcyB3aXRoIHplcm8tY29weSBETUEgTUFDcykgYnkgYWRkaW5nIGN1c3RvbSBwYnVmcyBhbmQgaW1wbGVtZW50aW5nCisgICAgY3VzdG9tIHBidWZzIHRoYXQgcmVmZXJlbmNlIG90aGVyIChvcmlnaW5hbCkgcGJ1ZnMuIEFkZGl0aW9uYWxseSBzZXQKKyAgICBJUF9GUkFHX1VTRVNfU1RBVElDX0JVRj0wIGFzIGRlZmF1bHQgdG8gYmUgb24gdGhlIHNhZmUgc2lkZS4KKworICAyMDEwLTA2LTE1OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGRoY3AuYzogRml4ZWQgYnVnICMyOTk3MDogREhDUCBlbmRpYW4gaXNzdWUgcGFyc2luZyBvcHRpb24gcmVzcG9uc2VzCisKKyAgMjAxMC0wNi0xNDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhdXRvaXAuYzogRml4ZWQgYnVnICMzMDAzOTogQXV0b0lQIGRvZXMgbm90IHJldXNlIHByZXZpb3VzIGFkZHJlc3NlcworCisgIDIwMTAtMDYtMTI6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZGhjcC5jOiBGaXhlZCBidWcgIzMwMDM4OiBkaGNwX25ldHdvcmtfY2hhbmdlZCBkb2Vzbid0IHJlc2V0IEFVVE9JUCBjb29wCisgICAgc3RhdGUKKworICAyMDEwLTA1LTE3OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG5ldGRiLmM6IENvcnJlY3RseSBOVUxMLXRlcm1pbmF0ZSBoX2FkZHJfbGlzdAorCisgIDIwMTAtMDUtMTY6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZGVmLmgvLmM6IGNoYW5nZWQgdGhlIHNlbWFudGljcyBvZiBMV0lQX1BSRUZJWF9CWVRFT1JERVJfRlVOQ1MgdG8gcHJldmVudAorICAgICJzeW1ib2wgYWxyZWFkeSBkZWZpbmVkIiBpLmUuIHdoZW4gbGlua2luZyB0byB3aW5zb2NrCisKKyAgMjAxMC0wNS0wNTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkZWYuaCwgdGltZXJzLmM6IEZpeGVkIGJ1ZyAjMjk3NjkgKHN5c19jaGVja190aW1lb3V0czogc3lzX25vdygpIG1heQorICAgIG92ZXJmbG93KQorCisgIDIwMTAtMDQtMjE6IFNpbW9uIEdvbGRzY2htaWR0CisgICogYXBpX21zZy5jOiBGaXhlZCBidWcgIzI5NjE3IChzb21ldGltZSBjYXVzZSBzdGFsbCBvbiBkZWxldGUgbGlzdGVuaW5nCisgICAgY29ubmVjdGlvbikKKworICAyMDEwLTAzLTI4OiBMdWNhIENlcmVzb2xpCisgICogaXBfYWRkci5jLy5oOiBwYXRjaCAjNzE0MzogQWRkIGEgZmV3IG1pc3NpbmcgY29uc3QgcXVhbGlmaWVycworCisgIDIwMTAtMDMtMjc6IEx1Y2EgQ2VyZXNvbGkKKyAgKiBtaWIyLmM6IHBhdGNoICM3MTMwOiByZW1vdmUgbWVhbmluZ2xlc3MgY29uc3QgcXVhbGlmaWVycworCisgIDIwMTAtMDMtMjY6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwX291dC5jOiBNYWtlIExXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYgd29yayBmb3IgVENQLCB0b28KKworICAyMDEwLTAzLTI2OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHZhcmlvdXMgZmlsZXM6IEZpeGVkIGNvbXBpbGluZyB3aXRoIGRpZmZlcmVudCBvcHRpb25zIGRpc2FibGVkIChUQ1AvVURQKSwKKyAgICB0cmlnZ2VyZWQgYnkgYnVnICMyOTM0NTsgZG9uJ3QgYWxsb2NhdGUgYWNjZXB0bWJveCBpZiBMV0lQX1RDUCBpcyBkaXNhYmxlZAorCisgIDIwMTAtMDMtMjU6IFNpbW9uIEdvbGRzY2htaWR0CisgICogc29ja2V0cy5jOiBGaXhlZCBidWcgIzI5MzMyOiBsd2lwX3NlbGVjdCgpIHByb2Nlc3NlcyByZWFkc2V0IGluY29ycmVjdGx5CisKKyAgMjAxMC0wMy0yNTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3BfaW4uYywgdGVzdF90Y3Bfb29zLmM6IEZpeGVkIGJ1ZyAjMjkwODA6IENvcnJlY3RseSBoYW5kbGUgcmVtb3RlIHNpZGUKKyAgICBvdmVycnVubmluZyBvdXIgcmN2X3duZCBpbiBvb3NlcSBjYXNlLgorCisgIDIwMTAtMDMtMjI6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmM6IHRjcF9saXN0ZW4oKSBkaWQgbm90IGNvcHkgdGhlIHBjYidzIHByaW8uCisKKyAgMjAxMC0wMy0xOTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzbm1wX21zZy5jOiBGaXhlZCBidWcgIzI5MjU2OiBTTk1QIFRyYXAgYWRkcmVzcyB3YXMgbm90IGNvcnJlY3RseSBzZXQKKworICAyMDEwLTAzLTE0OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oLCBldGhhcnAuaDogRml4ZWQgYnVnICMyOTE0OCAoSW5jb3JyZWN0IFBCVUZfUE9PTF9CVUZTSVpFIGZvciBwb3J0cworICAgIHdoZXJlIEVUSF9QQURfU0laRSA+IDApIGJ5IG1vdmluZyBkZWZpbml0aW9uIG9mIEVUSF9QQURfU0laRSB0byBvcHQuaAorICAgIGFuZCBiYXNpbmcgUEJVRl9MSU5LX0hMRU4gb24gaXQuCisKKyAgMjAxMC0wMy0wODogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBuZXRpZi5jLCBpcHY0L2lwLmM6IHRhc2sgIzEwMjQxIChBdXRvSVA6IGRvbid0IGJyZWFrIGV4aXN0aW5nIGNvbm5lY3Rpb25zCisgICAgd2hlbiBhc3NpZ2luZyByb3V0YWJsZSBhZGRyZXNzKTogd2hlbiBjaGVja2luZyBpbmNvbWluZyBwYWNrZXRzIGFuZAorICAgIGFib3J0aW5nIGV4aXN0aW5nIGNvbm5lY3Rpb24gb24gYWRkcmVzcyBjaGFuZ2UsIGZpbHRlciBvdXQgbGluay1sb2NhbAorICAgIGFkZHJlc3Nlcy4KKworICAyMDEwLTAzLTA2OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNvY2tldHMuYzogRml4ZWQgTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRiBmb3IgTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcKKworICAyMDEwLTAzLTA2OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGlwdjQvaXAuYzogRG9uJ3QgdHJ5IHRvIGZvcndhcmQgbGluay1sb2NhbCBhZGRyZXNzZXMKKworICAyMDEwLTAzLTA2OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGV0aGFycC5jOiBGaXhlZCBidWcgIzI5MDg3OiBldGhhcnA6IGRvbid0IHNlbmQgcGFja2V0cyBmb3IgTGlua0xvY2FsLQorICAgIGFkZHJlc3NlcyB0byBndworCisgIDIwMTAtMDMtMDU6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZGhjcC5jOiBGaXhlZCBidWcgIzI5MDcyOiBDb3JyZWN0bHkgc2V0IGNpYWRkciBiYXNlZCBvbiBtZXNzYWdlLXR5cGUKKyAgICBhbmQgc3RhdGUuCisKKyAgMjAxMC0wMy0wNTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGlfbXNnLmM6IENvcnJlY3RseSBzZXQgVENQX1dSSVRFX0ZMQUdfTU9SRSB3aGVuIG5ldGNvbm5fd3JpdGUgaXMgc3BsaXQKKyAgICBpbnRvIG11bHRpcGxlIGNhbGxzIHRvIHRjcF93cml0ZS4gICAgCisKKyAgMjAxMC0wMi0yMTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBvcHQuaCwgbWVtLmgsIGRucy5jOiB0YXNrICMxMDE0MDogUmVtb3ZlIEROU19VU0VTX1NUQVRJQ19CVUYgKGtlZXAKKyAgICB0aGUgaW1wbGVtZW50YXRpb24gb2YgRE5TX1VTRVNfU1RBVElDX0JVRj09MSkKKworICAyMDEwLTAyLTIwOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5oLCB0Y3AuYywgdGNwX2luLmMsIHRjcF9vdXQuYzogVGFzayAjMTAwODg6IENvcnJlY3RseSBpbXBsZW1lbnQKKyAgICBjbG9zZSgpIHZzLiBzaHV0ZG93bigpLiBOb3cgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IGdldCBhbnkgbW9yZQorICAgIHJlY3YgY2FsbGJhY2tzIGFmdGVyIGNhbGxpbmcgdGNwX2Nsb3NlKCkuIEFkZGVkIHRjcF9zaHV0ZG93bigpLgorCisgIDIwMTAtMDItMTk6IFNpbW9uIEdvbGRzY2htaWR0CisgICogbWVtLmMvLmgsIHBidWYuYzogUmVuYW1lZCBtZW1fcmVhbGxvYygpIHRvIG1lbV90cmltKCkgdG8gcHJldmVudAorICAgIGNvbmZ1c2lvbiB3aXRoIHJlYWxsb2MoKQorCisgIDIwMTAtMDItMTU6IFNpbW9uIEdvbGRzY2htaWR0L1N0ZXBoYW5lIExlc2FnZQorICAqIG5ldGlmLmMvLmg6IExpbmsgc3RhdHVzIGRvZXMgbm90IGRlcGVuZCBvbiBMV0lQX05FVElGX0xJTktfQ0FMTEJBQ0sKKyAgICAoZml4ZXMgYnVnICMyODg5OSkKKworICAyMDEwLTAyLTE0OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG5ldGlmLmM6IEZpeGVkIGJ1ZyAjMjg4NzcgKER1cGxpY2F0ZSBBUlAgZ3JhdHVpdG91cyBwYWNrZXQgd2l0aAorICAgIExXSVBfTkVUSUZfTElOS19DQUxMQkFDSyBzZXQgb24pIGJ5IG9ubHkgc2VuZGluZyBpZiBib3RoIGxpbmstIGFuZAorICAgIGFkbWluLXN0YXR1cyBvZiBhIG5ldGlmIGFyZSB1cAorCisgIDIwMTAtMDItMTQ6IFNpbW9uIEdvbGRzY2htaWR0CisgICogb3B0Lmg6IERpc2FibGUgRVRIQVJQX1RSVVNUX0lQX01BQyBieSBkZWZhdWx0IHNpbmNlIGl0IHNsb3dzIGRvd24gcGFja2V0CisgICAgcmVjZXB0aW9uIGFuZCBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeQorCisgIDIwMTAtMDItMTQ6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZXRoYXJwLmMvLmg6IEZpeGVkIEFSUCBpbnB1dCBwcm9jZXNzaW5nOiBvbmx5IGFkZCBhIG5ldyBlbnRyeSBpZiBhCisgICAgcmVxdWVzdCB3YXMgZGlyZWN0ZWQgYXMgdXMgKFJGQyA4MjYsIFBhY2tldCBSZWNlcHRpb24pLCBvdGhlcndpc2UKKyAgICBvbmx5IHVwZGF0ZSBleGlzdGluZyBlbnRyaWVzOyBpbnRlcm5hbGl6ZWQgc29tZSBmdW5jdGlvbnMKKworICAyMDEwLTAyLTE0OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG5ldGlmLmgsIGV0aGFycC5jLCB0Y3BpcC5jOiBGaXhlZCBidWcgIzI4MTgzIChBUlAgYW5kIFRDUC9JUCBjYW5ub3QgYmUKKyAgICBkaXNhYmxlZCBvbiBuZXRpZiB1c2VkIGZvciBQUFBvRSkgYnkgYWRkaW5nIGEgbmV3IG5ldGlmIGZsYWcKKyAgICAoTkVUSUZfRkxBR19FVEhFUk5FVCkgdGhhdCB0ZWxscyB0aGUgc3RhY2sgdGhlIGRldmljZSBpcyBhbiBldGhlcm5ldAorICAgIGRldmljZSBidXQgcHJldmVudHMgdXNhZ2Ugb2YgQVJQIChzbyB0aGF0IGV0aGVybmV0X2lucHV0IGNhbiBiZSB1c2VkCisgICAgZm9yIFBQUG9FKS4KKworICAyMDEwLTAyLTEyOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG5ldGlmLmM6IG5ldGlmX3NldF9saW5rX3VwL2Rvd246IG9ubHkgZG8gc29tZXRoaW5nIGlmIHRoZSBsaW5rIHN0YXRlCisgICAgYWN0dWFsbHkgY2hhbmdlcworCisgIDIwMTAtMDItMTI6IFNpbW9uIEdvbGRzY2htaWR0L1N0ZXBoYW5lIExlc2FnZQorICAqIGFwaV9tc2cuYzogRml4ZWQgYnVnICMyODg2NSAoQ2Fubm90IGNsb3NlIHNvY2tldC9uZXRjb25uIGluIG5vbi1ibG9ja2luZworICAgIGNvbm5lY3QpCisKKyAgMjAxMC0wMi0xMjogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtZW0uaDogRml4ZWQgYnVnICMyODg2NiAobWVtX3JlYWxsb2MgZnVuY3Rpb24gZGVmaW5lZCBpbiBtZW0uaCkKKworICAyMDEwLTAyLTA5OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9saWIuYywgYXBpX21zZy5jLCBzb2NrZXRzLmMsIGFwaS5oLCBhcGlfbXNnLmg6IEZpeGVkIGJ1ZyAjMjIxMTAKKyAgIChyZWN2KCkgbWFrZXMgcmVjZWl2ZSB3aW5kb3cgdXBkYXRlIGZvciBkYXRhIHRoYXQgd2Fzbid0IHJlY2VpdmVkIGJ5CisgICAgYXBwbGljYXRpb24pCisKKyAgMjAxMC0wMi0wOTogU2ltb24gR29sZHNjaG1pZHQvU3RlcGhhbmUgTGVzYWdlCisgICogc29ja2V0cy5jOiBGaXhlZCBidWcgIzI4ODUzIChsd2lwX3JlY3Zmcm9tKCkgcmV0dXJucyAwIG9uIHJlY2VpdmUgdGltZS1vdXQKKyAgICBvciBhbnkgbmV0Y29ubl9yZWN2KCkgZXJyb3IpCisKKyAgMjAxMC0wMi0wOTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBwcHAuYzogdGFzayAjMTAxNTQgKFBQUDogVXBkYXRlIHNubXAgaW4vb3V0IGNvdW50ZXJzIGZvciB0eC9yeCBwYWNrZXRzKQorCisgIDIwMTAtMDItMDk6IFNpbW9uIEdvbGRzY2htaWR0CisgICogbmV0aWYuYzogRm9yIGxvb3BiYWNrIHBhY2tldHMsIGFkanVzdCB0aGUgc3RhdHMtIGFuZCBzbm1wLWNvdW50ZXJzCisgICAgZm9yIHRoZSBsb29wYmFjayBuZXRpZi4KKworICAyMDEwLTAyLTA4OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGlnbXAuYy8uaCwgaXAuaDogTW92ZWQgbW9zdCBkZWZpbmVzIGZyb20gaWdtcC5oIHRvIGlnbXAuYyBmb3IgY2xhcml0eQorICAgIHNpbmNlIHRoZXkgYXJlIG5vdCB1c2VkIGFueXdoZXJlIGVsc2UuCisKKyAgMjAxMC0wMi0wODogU2ltb24gR29sZHNjaG1pZHQgKFN06XBoYW5lIExlc2FnZSkKKyAgKiBpZ21wLmMsIGlnbXAuaCwgc3RhdHMuYywgc3RhdHMuaDogSW1wcm92ZWQgSUdNUCBzdGF0cworICAgIChwYXRjaCBmcm9tIGJ1ZyAjMjg3OTgpCisKKyAgMjAxMC0wMi0wODogU2ltb24gR29sZHNjaG1pZHQgKFN06XBoYW5lIExlc2FnZSkKKyAgKiBpZ21wLmM6IEZpeGVkIGJ1ZyAjMjg3OTggKEVycm9yIGluICJNYXggUmVzcG9uc2UgVGltZSIgcHJvY2Vzc2luZykgYW5kCisgICAgYW5vdGhlciBidWcgd2hlbiBMV0lQX1JBTkQoKSByZXR1cm5zIHplcm8uCisKKyAgMjAxMC0wMi0wNDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBuZWFybHkgZXZlcnkgZmlsZTogVXNlIG1hY3JvcyBkZWZpbmVkIGluIGlwX2FkZHIuaCAoc29tZSBvZiB0aGVtIG5ldykKKyAgICB0byB3b3JrIHdpdGggSVAgYWRkcmVzc2VzIChwcmVwYXJhdGlvbiBmb3IgYnVnICMyNzM1MiAtIENoYW5nZSBpcF9hZGRyCisgICAgZnJvbSBzdHJ1Y3QgdG8gdHlwZWRlZiAodTMyX3QpIC0gYW5kIGJldHRlciBjb2RlKS4KKworICAyMDEwLTAxLTMxOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG5ldGlmLmM6IERvbid0IGNhbGwgdGhlIGxpbmstY2FsbGJhY2sgZnJvbSBuZXRpZl9zZXRfdXAvZG93bigpIHNpbmNlCisgICAgdGhpcyBpbnZhbGlkbHkgcmV0cmlnZ2VycyBESENQLgorCisgIDIwMTAtMDEtMjk6IFNpbW9uIEdvbGRzY2htaWR0CisgICogaXBfYWRkci5oLCBpbmV0LmgsIGRlZi5oLCBpbmV0LmMsIGRlZi5jLCBtb3JlOiBDbGVhbmx5IHNlcGFyYXRlIHRoZQorICAgIHBvcnRhYmlsaXR5IGZpbGUgaW5ldC5oIGFuZCBpdHMgY29udGVudHMgZnJvbSB0aGUgc3RhY2s6IG1vdmVkIGh0b25YLQorICAgIGZ1bmN0aW9ucyB0byBkZWYuaCAoYW5kIHRoZSBuZXcgZGVmLmMgLSB0aGV5IGFyZSBub3QgaXB2NCBkZXBlbmRlbnQpLAorICAgIGxldCBpbmV0LmggZGVwZW5kIG9uIGlwX2FkZHIuaCBhbmQgbm90IHRoZSBvdGhlciB3YXkgcm91bmQuCisgICAgVGhpcyBmaXhlcyBidWcgIzI4NzMyLgorCisgIDIwMTAtMDEtMjg6IEtpZXJhbiBNYW5zbGV5CisgICogdGNwLmM6IEVuc3VyZSBzc3RocmVzaCA+PSAyKk1TUworCisgIDIwMTAtMDEtMjc6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmgsIHRjcC5jLCB0Y3BfaW4uYzogRml4ZWQgYnVnICMyNzg3MTogQ2FsbGluZyB0Y3BfYWJvcnQoKSBpbiByZWN2CisgICAgY2FsbGJhY2sgY2FuIGxlYWQgdG8gYWNjZXNzaW5nIHVuYWxsb2NhdGVkIG1lbW9yeS4gQXMgYSBjb25zZXF1ZW5jZSwKKyAgICBFUlJfQUJSVCBtZWFucyB0aGUgYXBwbGljYXRpb24gaGFzIGNhbGxlZCB0Y3BfYWJvcnQoKSEKKworICAyMDEwLTAxLTI1OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNubXBfc3RydWN0cy5oLCBtc2dfaW4uYzogUGFydGx5IGZpeGVkIGJ1ZyAjMjIwNzAgKE1JQl9PQkpFQ1RfV1JJVEVfT05MWQorICAgIG5vdCBpbXBsZW1lbnRlZCBpbiBTTk1QKTogd3JpdGUtb25seSBvciBub3QtYWNjZXNzaWJsZSBhcmUgc3RpbGwKKyAgICByZXR1cm5lZCBieSBnZXRuZXh0ICh0aG91Z2ggbm90IGJ5IGdldCkKKworICAyMDEwLTAxLTI0OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNubXA6IFJlbmFtZWQgdGhlIHByaXZhdGUgbWliIG5vZGUgZnJvbSAncHJpdmF0ZScgdG8gJ21pYl9wcml2YXRlJyB0bworICAgIG5vdCB1c2UgcmVzZXJ2ZWQgQy9DKysga2V5d29yZHMKKworICAyMDEwLTAxLTIzOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNvY2tldHMuYzogRml4ZWQgYnVnICMyODcxNjogc2VsZWN0KCkgcmV0dXJucyAwIGFmdGVyIHdhaXRpbmcgZm9yIGxlc3MKKyAgICB0aGFuIDEgbXMKKworICAyMDEwLTAxLTIxOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5jLCBhcGlfbXNnLmM6IEZpeGVkIGJ1ZyAjMjg2NTEgKHRjcF9jb25uZWN0OiBubyBjYWxsYmFja3MgY2FsbGVkCisgICAgaWYgdGNwX2VucXVldWUgZmFpbHMpIGJvdGggaW4gcmF3LSBhbmQgbmV0Y29ubi1BUEkKKworICAyMDEwLTAxLTE5OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9tc2cuYzogRml4ZWQgYnVnICMyNzMxNjogbmV0Y29ubjogUG9zc2libGUgZGVhZGxvY2sgaW4gZXJyX3RjcAorCisgIDIwMTAtMDEtMTg6IElvcmRhbiBOZXNoZXYvU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzcmMvbmV0aWYvcHBwOiByZW9yZ2FuaXNlZCBQUFAgc291cmNlY29kZSB0byAyLjMuMTEgaW5jbHVkaW5nIHNvbWUKKyAgICBidWdmaXggYmFja3BvcnRzIGZyb20gMi40LnguCisKKyAgMjAxMC0wMS0xODogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtZW0uYzogRml4ZWQgYnVnICMyODY3OTogbWVtX3JlYWxsb2MgY2FsY3VsYXRlcyBtZW1fc3RhdHMgd3JvbmcKKworICAyMDEwLTAxLTE3OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9saWIuYywgYXBpX21zZy5jLCAoYXBpX21zZy5oLCBhcGkuaCwgc29ja2V0cy5jLCB0Y3BpcC5jKToKKyAgICB0YXNrICMxMDEwMjogIm5ldGNvbm46IGNsZWFuIHVwIGNvbm4tPmVyciB0aHJlYWRpbmcgaXNzdWVzIiBieSBhZGRpbmcKKyAgICBlcnJvciByZXR1cm4gdmFsdWUgdG8gc3RydWN0IGFwaV9tc2dfbXNnCisKKyAgMjAxMC0wMS0xNzogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGkuaCwgYXBpX2xpYi5jLCBzb2NrZXRzLmM6IENoYW5nZWQgbmV0Y29ubl9yZWN2KCkgYW5kIG5ldGNvbm5fYWNjZXB0KCkKKyAgICB0byByZXR1cm4gZXJyX3QgKGJ1Z3MgIzI3NzA5IGFuZCAjMjgwODcpCisKKyAgMjAxMC0wMS0xNDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiAuLi46IFVzZSB0eXBlZGVmIGZvciBmdW5jdGlvbiBwcm90b3R5cGVzIHRocm91Z2hvdXQgdGhlIHN0YWNrLgorCisgIDIwMTAtMDEtMTM6IFNpbW9uIEdvbGRzY2htaWR0CisgICogYXBpX21zZy5oLy5jLCBhcGlfbGliLmM6IEZpeGVkIGJ1ZyAjMjY2NzIgKGNsb3NlIGNvbm5lY3Rpb24gd2hlbiByZWNlaXZlCisgICAgd2luZG93ID0gMCkgYnkgY29ycmVjdGx5IGRyYWluaW5nIHJlY3ZtYm94L2FjY2VwdG1ib3gKKworICAyMDEwLTAxLTExOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHBhcC5jOiBGaXhlZCBidWcgIzEzMzE1IChQUFAgUEFQIGF1dGhlbnRpY2F0aW9uIGNhbiByZXN1bHQgaW4KKyAgICBlcnJvbmVvdXMgY2FsbGJhY2tzKSBieSBjb3B5aW5nIHRoZSBjb2RlIGZyb20gcmVjZW50IHBwcGQKKworICAyMDEwLTAxLTEwOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHJhdy5jOiBGaXhlZCBidWcgIzI4NTA2IChyYXdfYmluZCBzaG91bGQgZmlsdGVyIHJlY2VpdmVkIHBhY2tldHMpCisKKyAgMjAxMC0wMS0xMDogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3AuaC8uYzogYnVnICMyODEyNyAocmVtb3ZlIGNhbGwgdG8gdGNwX291dHB1dCgpIGZyb20gdGNwX2Fjayhfbm93KSgpKQorCisgIDIwMTAtMDEtMDg6IFNpbW9uIEdvbGRzY2htaWR0CisgICogc29ja2V0cy5jOiBGaXhlZCBidWcgIzI4NTE5IChsd2lwX3JlY3Zmcm9tIGJ1ZyB3aXRoIGxlbiA+IDY1NTM1KQorCisgIDIwMTAtMDEtMDg6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZG5zLmM6IENvcHkgaG9zdG5hbWUgZm9yIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDPT0xIHNpbmNlIHN0cmluZworICAgIHBhc3NlZCB0byBkbnNfbG9jYWxfYWRkaG9zdCgpIG1pZ2h0IGJlIHZvbGF0aWxlCisKKyAgMjAxMC0wMS0wNzogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0aW1lcnMuYywgdGNwLmg6IENhbGwgdGNwX3RpbWVyX25lZWRlZCgpIHdpdGggTk9fU1lTPT0xLCB0b28KKworICAyMDEwLTAxLTA2OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG5ldGRiLmg6IEZpeGVkIGJ1ZyAjMjg0OTY6IG1pc3NpbmcgaW5jbHVkZSBndWFyZHMgaW4gbmV0ZGIuaAorCisgIDIwMDktMTItMzE6IFNpbW9uIEdvbGRzY2htaWR0CisgICogbWFueSBwcHAgZmlsZXM6IFJlb3JnYW5pc2VkIFBQUCBzb3VyY2UgY29kZSBmcm9tIHVjaXAgc3RydWN0dXJlIHRvIHBwcGQKKyAgICBzdHJ1Y3R1cmUgdG8gZWFzaWx5IGNvbXBhcmUgb3VyIGNvZGUgYWdhaW5zdCB0aGUgcHBwZCBjb2RlIChhcm91bmQgdjIuMy4xKQorCisgIDIwMDktMTItMjc6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwX2luLmM6IEFub3RoZXIgZml4IGZvciBidWcgIzI4MjQxIChvb3NlcSBwcm9jZXNzaW5nKSBhbmQgYWRhcHRlZAorICAgIHVuaXQgdGVzdAorCisKKyhTVEFCTEUtMS4zLjIpCisKKyAgKysgTmV3IGZlYXR1cmVzOgorCisgIDIwMDktMTAtMjcgU2ltb24gR29sZHNjaG1pZHQvU3RlcGhhbiBMZXNhZ2UKKyAgKiBuZXRpZmFwaS5jLy5oOiBBZGRlZCBuZXRpZmFwaV9uZXRpZl9zZXRfYWRkcigpCisKKyAgMjAwOS0xMC0wNyBTaW1vbiBHb2xkc2NobWlkdC9GYWJpYW4gS29jaAorICAqIGFwaV9tc2cuYywgbmV0YnVmLmMvLmgsIG9wdC5oOiBwYXRjaCAjNjg4ODogUGF0Y2ggZm9yIFVEUCBOZXRidWZzIHRvCisgICAgc3VwcG9ydCBkZXN0LWFkZHIgYW5kIGRlc3QtcG9ydCAob3B0aW9uYWw6IExXSVBfTkVUQlVGX1JFQ1ZJTkZPKQorCisgIDIwMDktMDgtMjYgU2ltb24gR29sZHNjaG1pZHQvU2ltb24gS2FsbHdlaXQKKyAgKiBzbGlwaWYuYy8uaDogYnVnICMyNjM5NzogU0xJUCBwb2xsaW5nIHN1cHBvcnQKKworICAyMDA5LTA4LTI1IFNpbW9uIEdvbGRzY2htaWR0CisgICogb3B0LmgsIGV0aGFycC5oLy5jOiB0YXNrICM5MDMzOiBTdXBwb3J0IElFRUUgODAyLjFxIHRhZ2dlZCBmcmFtZSAoVkxBTiksCisgICAgTmV3IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBFVEhBUlBfU1VQUE9SVF9WTEFOIGFuZCBFVEhBUlBfVkxBTl9DSEVDSy4KKworICAyMDA5LTA4LTI1IFNpbW9uIEdvbGRzY2htaWR0CisgICogaXBfYWRkci5oLCBuZXRkYi5jOiBwYXRjaCAjNjkwMDogYWRkZWQgZGVmaW5lIGlwX250b2Eoc3RydWN0IGlwX2FkZHIqKQorCisgIDIwMDktMDgtMjQgSmFrb2IgU3Rva2x1bmQgT2xlc2VuCisgICogYXV0b2lwLmMsIGRoY3AuYywgbmV0aWYuYzogcGF0Y2ggIzY3MjU6IFRlYWNoIEF1dG9JUCBhbmQgREhDUCB0byByZXNwb25kCisgICAgdG8gbmV0aWZfc2V0X2xpbmtfdXAoKS4KKworICAyMDA5LTA4LTIzIFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmgvLmM6IEFkZGVkIGZ1bmN0aW9uIHRjcF9kZWJ1Z19zdGF0ZV9zdHIoKSB0byBjb252ZXJ0IGEgdGNwIHN0YXRlCisgICAgdG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuCisKKyAgKysgQnVnZml4ZXM6CisKKyAgMjAwOS0xMi0yNDogS2llcmFuIE1hbnNsZXkKKyAgKiB0Y3BfaW4uYyBBcHBseSBwYXRjaGVzIGZyb20gT2xlZyBUeXNoZXYgdG8gaW1wcm92ZSBPT1MgcHJvY2Vzc2luZworICAgIChCVUcjMjgyNDEpCisKKyAgMjAwOS0xMi0wNjogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBwcHAuaC8uYzogRml4ZWQgYnVnICMyNzA3OSAoWWV0IGFub3RoZXIgbGVhayBpbiBQUFApOiBvdXRwYWNrZXRfYnVmIGNhbgorICAgIGJlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIChsaWtlIGluIHVjaXApCisKKyAgMjAwOS0xMi0wNDogU2ltb24gR29sZHNjaG1pZHQgKHBhdGNoIGJ5IElvYXJkYW4gTmVzaGV2KQorICAqIHBhcC5jOiBwYXRjaCAjNjk2OTogUFBQOiBtaXNzaW5nIFBBUCBhdXRoZW50aWNhdGlvbiBVTlRJTUVPVVQKKworICAyMDA5LTEyLTAzOiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5oLCB0Y3BfaW4uYywgdGNwX291dC5jOiBGaXhlZCBidWcgIzI4MTA2OiBkdXAgYWNrIGZvciBmYXN0IHJldHJhbnNtaXQKKyAgICBjb3VsZCBoYXZlIG5vbi16ZXJvIGxlbmd0aAorCisgIDIwMDktMTItMDI6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwX2luLmM6IEZpeGVkIGJ1ZyAjMjc5MDQ6IFRDUCBzZW5kcyB0b28gbWFueSBBQ0tzOiBkZWxheSByZXNldHRpbmcKKyAgICB0Y3BfaW5wdXRfcGNiIHVudGlsIGFmdGVyIGNhbGxpbmcgdGhlIHBjYidzIGNhbGxiYWNrcworCisgIDIwMDktMTEtMjk6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwX2luLmM6IEZpeGVkIGJ1ZyAjMjgwNTQ6IFR3byBzZWdtZW50cyB3aXRoIEZJTiBmbGFnIG9uIHRoZSBvdXQtb2YtCisgICAgc2VxdWVuY2UgcXVldWUsIGFsc28gZml4ZWQgUEJVRl9QT09MIGxlYWsgaW4gdGhlIG91dC1vZi1zZXF1ZW5jZSBjb2RlCisKKyAgMjAwOS0xMS0yOTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBwYnVmLmM6IEZpeGVkIGJ1ZyAjMjgwNjQ6IHBidWZfYWxsb2MoUEJVRl9QT09MKSBpcyBub3QgdGhyZWFkLXNhZmUgYnkKKyAgICBxdWV1ZWluZyBhIGNhbGwgaW50byB0Y3BpcF90aHJlYWQgdG8gZnJlZSBvb3NlcS1idWZzIGlmIHRoZSBwb29sIGlzIGVtcHR5CisKKyAgMjAwOS0xMS0yNjogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3AuaDogRml4ZWQgYnVnICMyODA5ODogTmFnbGUgY2FuIHByZXZlbnQgZmFzdCByZXRyYW5zbWl0IGZyb20gc2VuZGluZworICAgIHNlZ21lbnQKKworICAyMDA5LTExLTI2OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5oLCBzb2NrZXRzLmM6IEZpeGVkIGJ1ZyAjMjgwOTk6IEFQSSByZXF1aXJlZCB0byBkaXNhYmxlIE5hZ2xlCisgICAgYWxnb3JpdGhtIGF0IFBDQiBsZXZlbAorCisgIDIwMDktMTEtMjI6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwX291dC5jOiBGaXhlZCBidWcgIzI3OTA1OiBGSU4gaXNuJ3QgY29tYmluZWQgd2l0aCBkYXRhIG9uIHVuc2VudAorCisgIDIwMDktMTEtMjI6IFNpbW9uIEdvbGRzY2htaWR0IChzdWdnZXN0ZWQgYnkgQmlsbCBBdWVyYmFjaCkKKyAgKiB0Y3AuYzogdGNwX2FsbG9jOiBwcmV2ZW50IGluY3JlYXNpbmcgc3RhdHMuZXJyIGZvciBNRU1QX1RDUF9QQ0Igd2hlbgorICAgIHJldXNpbmcgdGltZS13YWl0IHBjYgorCisgIDIwMDktMTEtMjA6IFNpbW9uIEdvbGRzY2htaWR0IChwYXRjaCBieSBBbGJlcnQgQmFydGVsKQorICAqIHNvY2tldHMuYzogRml4ZWQgYnVnICMyODA2MjogRGF0YSByZWNlaXZlZCBkaXJlY3RseSBhZnRlciBhY2NlcHRpbmcKKyAgICBkb2VzIG5vdCB3YWtlIHVwIHNlbGVjdAorCisgIDIwMDktMTEtMTE6IFNpbW9uIEdvbGRzY2htaWR0CisgICogbmV0ZGIuaDogRml4ZWQgYnVnICMyNzk5NDogaW5jb3JyZWN0IGRlZmluZSBmb3IgZnJlZWFkZHJpbmZvKGFkZHJpbmZvKQorCisgIDIwMDktMTAtMzA6IFNpbW9uIEdvbGRzY2htaWR0CisgICogb3B0Lmg6IEluY3JlYXNlZCBkZWZhdWx0IHZhbHVlIGZvciBUQ1BfTVNTIHRvIDUzNiwgdXBkYXRlZCBkZWZhdWx0CisgICAgdmFsdWUgZm9yIFRDUF9XTkQgdG8gNCpUQ1BfTVNTIHRvIGtlZXAgZGVsYXllZCBBQ0sgd29ya2luZy4KKworICAyMDA5LTEwLTI4OiBLaWVyYW4gTWFuc2xleQorICAqIHRjcF9pbi5jLCB0Y3Bfb3V0LmMsIHRjcC5oOiByZS13b3JrIHRoZSBmYXN0IHJldHJhbnNtaXNzaW9uIGNvZGUKKyAgICB0byBmb2xsb3cgYWxnb3JpdGhtIGZyb20gVENQL0lQIElsbHVzdHJhdGVkCisKKyAgMjAwOS0xMC0yNzogS2llcmFuIE1hbnNsZXkKKyAgKiB0Y3BfaW4uYzogZml4IEJVRyMyNzQ0NTogZ3JvdyBjd25kIHdpdGggZXZlcnkgZHVwbGljYXRlIEFDSworCisgIDIwMDktMTAtMjU6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmg6IGJ1Zy1maXggaW4gdGhlIFRDUF9FVkVOVF9SRUNWIG1hY3JvIChoYXMgdG8gY2FsbCB0Y3BfcmVjdmVkIGlmCisgICAgcGNiLT5yZWN2IGlzIE5VTEwgdG8ga2VlcCByY3Zfd25kIGNvcnJlY3QpCisKKyAgMjAwOS0xMC0yNTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3BfaW4uYzogRml4ZWQgYnVnICMyNjI1MTogUlNUIHByb2Nlc3MgaW4gVElNRV9XQUlUIFRDUCBzdGF0ZQorCisgIDIwMDktMTAtMjM6IFNpbW9uIEdvbGRzY2htaWR0IChEYXZpZCBFbXBzb24pCisgICogdGNwLmM6IEZpeGVkIGJ1ZyAjMjc3ODM6IFNpbGx5IHdpbmRvdyBhdm9pZGFuY2UgZm9yIHNtYWxsIHdpbmRvdyBzaXplcworCisgIDIwMDktMTAtMjE6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwX2luLmM6IEZpeGVkIGJ1ZyAjMjcyMTU6IFRDUCBzZW50KCkgY2FsbGJhY2sgZ2l2ZXMgbGVhZGluZyBhbmQKKyAgICB0cmFpbGluZyAxIGJ5dGUgbGVuIChTWU4vRklOKQorCisgIDIwMDktMTAtMjE6IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwX291dC5jOiBGaXhlZCBidWcgIzI3MzE1OiB6ZXJvIHdpbmRvdyBwcm9iZSBhbmQgRklOCisKKyAgMjAwOS0xMC0xOTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmMvLmg6IE1pbm9yIGNvZGUgc2ltcGxpZmljYXRpb24gKGRvbid0IHN0b3JlIHJlY2VpdmVkIHBidWYsIGNoYW5nZQorICAgIGNvbmRpdGlvbmFsIGNvZGUgdG8gYXNzZXJ0IHdoZXJlIGFwcGxpY2FibGUpLCBjaGVjayBwYnVmIGxlbmd0aCBiZWZvcmUKKyAgICB0ZXN0aW5nIGZvciB2YWxpZCByZXBseQorCisgIDIwMDktMTAtMTk6IFNpbW9uIEdvbGRzY2htaWR0CisgICogZGhjcC5jOiBSZW1vdmVkIG1vc3QgY2FsbHMgdG8gdWRwX2Nvbm5lY3Qgc2luY2UgdGhleSBhcmVuJ3QgbmVjZXNzYXJ5CisgICAgd2hlbiB1c2luZyB1ZHBfc2VuZHRvX2lmKCkgLSBhbHdheXMgc3RheSBjb25uZWN0ZWQgdG8gSVBfQUREUl9BTlkuCisKKyAgMjAwOS0xMC0xNjogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpcC5jOiBGaXhlZCBidWcgIzI3MzkwOiBTb3VyY2UgSVAgY2hlY2sgaW4gaXBfaW5wdXQoKSBjYXVzZXMgaXQgdG8gZHJvcAorICAgIHZhbGlkIERIQ1AgcGFja2V0cyAtPiBhbGxvdyAwLjAuMC4wIGFzIHNvdXJjZSBhZGRyZXNzIHdoZW4gTFdJUF9ESENQIGlzCisgICAgZW5hYmxlZAorCisgIDIwMDktMTAtMTU6IFNpbW9uIEdvbGRzY2htaWR0IChPbGVnIFR5c2hldikKKyAgKiB0Y3BfaW4uYzogRml4ZWQgYnVnICMyNzMyOTogZHVwYWNrcyBieSB1bmlkaXJlY3Rpb25hbCBkYXRhIHRyYW5zbWl0CisKKyAgMjAwOS0xMC0xNTogU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGlfbGliLmM6IEZpeGVkIGJ1ZyAjMjc3MDk6IGNvbm4tPmVyciByYWNlIGNvbmRpdGlvbiBvbiBuZXRjb25uX3JlY3YoKQorICAgIHRpbWVvdXQKKworICAyMDA5LTEwLTE1OiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGF1dG9pcC5jOiBGaXhlZCBidWcgIzI3NzA0OiBhdXRvaXAgc3RhcnRzIHdpdGggd3JvbmcgYWRkcmVzcworICAgIExXSVBfQVVUT0lQX0NSRUFURV9TRUVEX0FERFIoKSByZXR1cm5lZCBhZGRyZXNzIGluIGhvc3QgYnl0ZSBvcmRlciBpbnN0ZWFkCisgICAgb2YgbmV0d29yayBieXRlIG9yZGVyCisKKyAgMjAwOS0xMC0xMSBTaW1vbiBHb2xkc2NobWlkdCAoSvZyZyBLZXN0ZW4pCisgICogdGNwX291dC5jOiBGaXhlZCBidWcgIzI3NTA0OiB0Y3BfZW5xdWV1ZSB3cm9uZ2x5IGNvbmNhdGVuYXRlcyBzZWdtZW50cworICAgIHdoaWNoIGFyZSBub3QgY29uc2VjdXRpdmUgd2hlbiByZXRyYW5zbWl0dGluZyB1bmFja2VkIHNlZ21lbnRzCisKKyAgMjAwOS0xMC0wOSBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oOiBGaXhlZCBkZWZhdWx0IHZhbHVlcyBvZiBzb21lIHN0YXRzIHRvIG9ubHkgYmUgZW5hYmxlZCBpZiB1c2VkCisgICAgRml4ZXMgYnVnICMyNzMzODogc3lzX3N0YXRzIGlzIGRlZmluZWQgd2hlbiBOT19TWVMgPSAxCisKKyAgMjAwOS0wOC0zMCBTaW1vbiBHb2xkc2NobWlkdAorICAqIGlwLmM6IEZpeGVkIGJ1ZyBidWcgIzI3MzQ1OiAiaXBfZnJhZygpIGRvZXMgbm90IHVzZSB0aGUgTFdJUF9ORVRJRl9MT09QQkFDSworICAgIGZ1bmN0aW9uIiBieSBjaGVja2luZyBmb3IgbG9vcGJhY2sgYmVmb3JlIGNhbGxpbmcgaXBfZnJhZworCisgIDIwMDktMDgtMjUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmM6IGZpeGVkIGludmFsaWQgZGVwZW5kZW5jeSB0byBldGhhcnBfcXVlcnkgaWYgREhDUF9ET0VTX0FSUF9DSEVDSz09MAorCisgIDIwMDktMDgtMjMgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBwcHAuYzogYnVnICMyNzA3ODogUG9zc2libGUgbWVtb3J5IGxlYWsgaW4gcHBwSW5pdCgpCisKKyAgMjAwOS0wOC0yMyBTaW1vbiBHb2xkc2NobWlkdAorICAqIG5ldGRiLmMsIGRucy5jOiBidWcgIzI2NjU3OiBETlMsIGlmIGhvc3QgbmFtZSBpcyAibG9jYWxob3N0IiwgcmVzdWx0CisgICAgaXMgZXJyb3IuCisKKyAgMjAwOS0wOC0yMyBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oLCBpbml0LmM6IGJ1ZyAjMjY2NDk6IFRDUCBmYWlscyB3aGVuIFRDUF9NU1MgPiBUQ1BfU05EX0JVRgorICAgIEZpeGVkIHdyb25nIHBhcmVudGhlc2lzLCBhZGRlZCBjaGVjayBpbiBpbml0LmMKKworICAyMDA5LTA4LTIzIFNpbW9uIEdvbGRzY2htaWR0CisgICogcHBwLmM6IGJ1ZyAjMjcyNjY6IHdhaXQtc3RhdGUgZGVidWcgbWVzc2FnZSBpbiBwcHBNYWluIG9jY3VycyBldmVyeSBtcworCisgIDIwMDktMDgtMjMgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtYW55IHBwcCBmaWxlczogYnVnICMyNzI2NzogQWRkZWQgaW5jbHVkZSB0byBzdHJpbmcuaCB3aGVyZSBuZWVkZWQKKworICAyMDA5LTA4LTIzIFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmg6IHBhdGNoICM2ODQzOiB0Y3AuaCBtYWNybyBvcHRpbWl6YXRpb24gcGF0Y2ggKGZvciBsaXR0bGUgZW5kaWFuKQorCisKKyhTVEFCTEUtMS4zLjEpCisKKyAgKysgTmV3IGZlYXR1cmVzOgorCisgIDIwMDktMDUtMTAgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBvcHQuaCwgc29ja2V0cy5jLCBwYnVmLmMsIG5ldGJ1Zi5oLCBwYnVmLmg6IHRhc2sgIzcwMTM6IEFkZGVkIG9wdGlvbgorICAgIExXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYgdG8gdHJ5IHRvIGNyZWF0ZSB0cmFuc21pdCBwYWNrZXRzIGZyb20gb25seQorICAgIG9uZSBwYnVmIHRvIGhlbHAgTUFDcyB0aGF0IGRvbid0IHN1cHBvcnQgc2NhdHRlci1nYXRoZXIgRE1BLgorCisgIDIwMDktMDUtMDkgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpY21wLmgsIGljbXAuYzogU2hyaW5rZWQgSUNNUCBjb2RlLCBhZGRlZCBvcHRpb24gdG8gTk9UIGNoZWNrIGljb21pbmcKKyAgICBFQ0hPIHBidWYgZm9yIHNpemUgKGp1c3QgdXNlIGl0KTogTFdJUF9JQ01QX0VDSE9fQ0hFQ0tfSU5QVVRfUEJVRl9MRU4KKworICAyMDA5LTA1LTA1IFNpbW9uIEdvbGRzY2htaWR0LCBKYWtvYiBTdG9rbHVuZCBPbGVzZW4KKyAgKiBpcC5oLCBpcC5jOiBBZGRlZCBpcF9jdXJyZW50X25ldGlmKCkgJiBpcF9jdXJyZW50X2hlYWRlcigpIHRvIHJlY2VpdmUKKyAgICBleHRlbmRlZCBpbmZvIGFib3V0IHRoZSBjdXJyZW50bHkgcmVjZWl2ZWQgcGFja2V0LgorCisgIDIwMDktMDQtMjcgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzeXMuaDogTWFkZSBTWVNfTElHSFRXRUlHSFRfUFJPVCBhbmQgc3lzX25vdygpIHdvcmsgd2l0aCBOT19TWVM9MQorCisgIDIwMDktMDQtMjUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtZW0uYywgb3B0Lmg6IEFkZGVkIG9wdGlvbiBNRU1fVVNFX1BPT0xTX1RSWV9CSUdHRVJfUE9PTCB0byB0cnkgdGhlIG5leHQKKyAgICBiaWdnZXIgbWFsbG9jIHBvb2wgaWYgb25lIGlzIGVtcHR5IChvbmx5IHVzYWJsZSB3aXRoIE1FTV9VU0VfUE9PTFMpLgorCisgIDIwMDktMDQtMjEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkbnMuYywgaW5pdC5jLCBkbnMuaCwgb3B0Lmg6IHRhc2sgIzc1MDcsIHBhdGNoICM2Nzg2OiBETlMgc3VwcG9ydHMgc3RhdGljCisgICAgaG9zdHMgdGFibGUuIE5ldyBjb25maWd1cmF0aW9uIG9wdGlvbnMgRE5TX0xPQ0FMX0hPU1RMSVNUIGFuZAorICAgIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDLiBBbHNvLCBETlNfTE9PS1VQX0xPQ0FMX0VYVEVSTigpIGNhbiBiZSBkZWZpbmVkCisgICAgYXMgYW4gZXh0ZXJuYWwgZnVuY3Rpb24gZm9yIGxvb2t1cC4KKworICAyMDA5LTA0LTE1IFNpbW9uIEdvbGRzY2htaWR0CisgICogZGhjcC5jOiBwYXRjaCAjNjc2MzogR2xvYmFsIERIQ1AgWElEIGNhbiBiZSByZWRlZmluZWQgdG8gc29tZXRoaW5nIG1vcmUgdW5pcXVlCisKKyAgMjAwOS0wMy0zMSBLaWVyYW4gTWFuc2xleQorICAqIHRjcC5jLCB0Y3Bfb3V0LmMsIHRjcF9pbi5jLCBzeXMuaCwgdGNwLmgsIG9wdHMuaDogYWRkIHN1cHBvcnQgZm9yCisgICAgVENQIHRpbWVzdGFtcCBvcHRpb25zLCBvZmYgYnkgZGVmYXVsdC4gIFJld29yayB0Y3BfZW5xdWV1ZSgpIHRvCisgICAgdGFrZSBvcHRpb24gZmxhZ3MgcmF0aGVyIHRoYW4gc3BlY2lmaWVkIG9wdGlvbiBkYXRhCisKKyAgMjAwOS0wMi0xOCBTaW1vbiBHb2xkc2NobWlkdAorICAqIGNjLmg6IEFkZGVkIHByaW50ZiBmb3JtYXR0ZXIgZm9yIHNpemVfdDogU1pUX0YKKworICAyMDA5LTAyLTE2IFNpbW9uIEdvbGRzY2htaWR0IChwYXRjaCBieSBSaXNoaSBLaGFuKQorICAqIGljbXAuYywgb3B0Lmg6IHBhdGNoICM2NTM5OiAoY29uZmlndXJhYmxlKSByZXNwb25zZSB0byBicm9hZGNhc3QtIGFuZCBtdWx0aWNhc3QKKyAgICBwaW5ncworCisgIDIwMDktMDItMTIgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpbml0Lmg6IEFkZGVkIExXSVBfVkVSU0lPTiB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc3RhY2sKKworICAyMDA5LTAyLTExIFNpbW9uIEdvbGRzY2htaWR0IChzdWdnZXN0ZWQgYnkgR290dGZyaWVkIFNwaXRhbGVyKQorICAqIG9wdC5oLCBtZW1wLmgvLmM6IGFkZGVkIE1FTVBfTUVNX01BTExPQyB0byB1c2UgbWVtX21hbGxvYy9tZW1fZnJlZSBpbnN0ZWFkCisgICAgb2YgdGhlIHBvb2wgYWxsb2NhdG9yIChjYW4gc2F2ZSBjb2RlIHNpemUgd2l0aCBNRU1fTElCQ19NQUxMT0MgaWYgbGliYy1tYWxsb2MKKyAgICBpcyBvdGhlcndpc2UgdXNlZCkKKworICAyMDA5LTAxLTI4IEpvbmF0aGFuIExhcm1vdXIgKHN1Z2dlc3RlZCBieSBCaWxsIEJhdWVyYmFjaCkKKyAgKiBpcHY0L2luZXRfY2hrc3VtLmMsIGlwdjQvbHdpcC9pbmV0X2Noa3N1bS5oOiBpbmV0X2Noa3N1bV9wc2V1ZG9fcGFydGlhbCgpCisgIGlzIG9ubHkgdXNlZCBieSBVRFBMSVRFIGF0IHByZXNlbnQsIHNvIGNvbmRpdGlvbmFsaXNlIGl0LgorCisgIDIwMDgtMTItMDMgU2ltb24gR29sZHNjaG1pZHQgKGJhc2Ugb24gcGF0Y2ggZnJvbSBMdWNhIENlcmVzb2xpKQorICAqIGF1dG9pcC5jOiBjaGVja2VkIGluIChzbGlnaHRseSBtb2RpZmllZCkgcGF0Y2ggIzY2ODM6IEN1c3RvbWl6YWJsZSBBVVRPSVAKKyAgICAic2VlZCIgYWRkcmVzcy4gVGhpcyBzaG91bGQgcmVkdWNlIEFVVE9JUCBjb25mbGljdHMgaWYKKyAgICBMV0lQX0FVVE9JUF9DUkVBVEVfU0VFRF9BRERSIGlzIG92ZXJyaWRkZW4uCisKKyAgMjAwOC0xMC0wMiBKb25hdGhhbiBMYXJtb3VyIGFuZCBSaXNoaSBLaGFuCisgICogc29ja2V0cy5jIChsd2lwX2FjY2VwdCk6IFJldHVybiBFV09VTERCTE9DSyBpZiB3b3VsZCBibG9jayBvbiBub24tYmxvY2tpbmcKKyAgICBzb2NrZXQuCisKKyAgMjAwOC0wNi0zMCBTaW1vbiBHb2xkc2NobWlkdAorICAqIG1lbS5jLCBvcHQuaCwgc3RhdHMuaDogZml4ZWQgYnVnICMyMTQzMzogQ2FsbGluZyBtZW1fZnJlZS9wYnVmX2ZyZWUgZnJvbQorICAgIGludGVycnVwdCBjb250ZXh0IGlzbid0IHNhZmU6IExXSVBfQUxMT1dfTUVNX0ZSRUVfRlJPTV9PVEhFUl9DT05URVhUIGFsbG93cworICAgIG1lbV9mcmVlIHRvIHJ1biBiZXR3ZWVuIG1lbV9tYWxsb2MgaXRlcmF0aW9ucy4gQWRkZWQgaWxsZWdhbCBjb3VudGVyIGZvcgorICAgIG1lbSBzdGF0cy4KKworICAyMDA4LTA2LTI3IFNpbW9uIEdvbGRzY2htaWR0CisgICogc3RhdHMuaC8uYywgc29tZSBvdGhlciBmaWxlczogcGF0Y2ggIzY0ODM6IHN0YXRzIG1vZHVsZSBpbXByb3ZlbWVudDoKKyAgICBBZGRlZCBkZWZpbmVzIHRvIGRpc3BsYXkgZWFjaCBtb2R1bGUncyBzdGF0aXN0aWMgaW5kaXZpZHVhbGx5LCBhZGRlZCBzdGF0cworICAgIGRlZmluZXMgZm9yIE1FTSwgTUVNUCBhbmQgU1lTIG1vZHVsZXMsIHJlbW92ZWQgKHVudXNlZCkgcmV4bWl0IGNvdW50ZXIuCisKKyAgMjAwOC0wNi0xNyBTaW1vbiBHb2xkc2NobWlkdAorICAqIGVyci5oOiBwYXRjaCAjNjQ1OTogTWFkZSBlcnJfdCBvdmVycmlkYWJsZSB0byB1c2UgYSBtb3JlIGVmZmljaWVudCB0eXBlCisgICAgKGRlZmluZSBMV0lQX0VSUl9UIGluIGNjLmgpCisKKyAgMjAwOC0wNi0xNyBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNsaXBpZi5jOiBwYXRjaCAjNjQ4MDogQWRkZWQgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3Igc2xpcGlmIGZvciBzeW1tZXRyeQorICAgIHRvIGxvb3BpZgorCisgIDIwMDgtMDYtMTcgU2ltb24gR29sZHNjaG1pZHQgKHBhdGNoIGJ5IEx1Y2EgQ2VyZXNvbGkpCisgICogbmV0aWYuYywgbG9vcGlmLmMsIGlwLmMsIG5ldGlmLmgsIGxvb3BpZi5oLCBvcHQuaDogQ2hlY2tlZCBpbiBzbGlnaHRseQorICAgIG1vZGlmaWVkIHZlcnNpb24gb2YgcGF0Y2ggIyA2MzcwOiBNb3ZlZCBsb29waWYgY29kZSB0byBuZXRpZi5jIHNvIHRoYXQKKyAgICBsb29wYmFjayB0cmFmZmljIGlzIHN1cHBvcnRlZCBvbiBhbGwgbmV0aWZzIChhbGwgbG9jYWwgSVBzKS4KKyAgICBBZGRlZCBvcHRpb24gdG8gbGltaXQgbG9vcGJhY2sgcGFja2V0cyBmb3IgZWFjaCBuZXRpZnMuCisKKworICArKyBCdWdmaXhlczoKKyAgMjAwOS0wOC0xMiBLaWVyYW4gTWFuc2xleQorICAqIHRjcF9pbi5jLCB0Y3AuYzogRml4IGJ1ZyAjMjcyMDk6IGhhbmRsZSB0cmltbWluZyBvZiBzZWdtZW50cyB3aGVuCisgICAgb3V0IG9mIHdpbmRvdyBvciBvdXQgb2Ygb3JkZXIgcHJvcGVybHkKKworICAyMDA5LTA4LTEyIEtpZXJhbiBNYW5zbGV5CisgICogdGNwX2luLmM6IEZpeCBidWcgIzI3MTk5OiB1c2Ugc25kX3dsMiBpbnN0ZWFkIG9mIHNuZF93bDEKKworICAyMDA5LTA3LTI4IFNpbW9uIEdvbGRzY2htaWR0CisgICogbWVtLmg6IEZpeGVkIGJ1ZyAjMjcxMDU6ICJyZWFsbG9jKCkgY2Fubm90IHJlcGxhY2UgbWVtX3JlYWxsb2MoKSJzCisKKyAgMjAwOS0wNy0yNyBLaWVyYW4gTWFuc2xleQorICAqIGFwaS5oIGFwaV9tc2cuaCBuZXRkYi5oIHNvY2tldHMuaDogYWRkIG1pc3NpbmcgI2luY2x1ZGUgZGlyZWN0aXZlcworCisgIDIwMDktMDctMDkgS2llcmFuIE1hbnNsZXkKKyAgKiBhcGlfbXNnLmMsIHNvY2tldHMuYywgYXBpLmg6IEJVRzIzMjQwIHVzZSBzaWduZWQgY291bnRlcnMgZm9yCisgICAgcmVjdl9hdmFpbCBhbmQgZG9uJ3QgaW5jcmVtZW50IGNvdW50ZXJzIHVudGlsIG1lc3NhZ2Ugc3VjY2Vzc2Z1bGx5CisgICAgc2VudCB0byBtYm94CisKKyAgMjAwOS0wNi0yNSBLaWVyYW4gTWFuc2xleQorICAqIGFwaV9tc2cuYyBhcGkuaDogQlVHMjY3MjI6IGluaXRpYWxpc2UgbmV0Y29ubiB3cml0ZSB2YXJpYWJsZXMgCisgICAgaW4gbmV0Y29ubl9hbGxvYworCisgIDIwMDktMDYtMjUgS2llcmFuIE1hbnNsZXkKKyAgKiB0Y3AuaDogQlVHMjY4Nzk6IHNldCByZXQgdmFsdWUgaW4gVENQX0VWRU5UIG1hY3JvcyB3aGVuIGZ1bmN0aW9uIGlzIG5vdCBzZXQKKworICAyMDA5LTA2LTI1IEtpZXJhbiBNYW5zbGV5CisgICogdGNwLmMsIHRjcF9pbi5jLCB0Y3Bfb3V0LmMsIHRjcC5oOiBCVUcyNjMwMSBhbmQgQlVHMjYyNjc6IGNvcnJlY3QKKyAgICBzaW11bHRhbmVvdXMgY2xvc2UgYmVoYXZpb3VyLCBhbmQgbWFrZSBzbmRfbnh0IGhhdmUgdGhlIHNhbWUgbWVhbmluZyAKKyAgICBhcyBpbiB0aGUgUkZDcy4KKworICAyMDA5LTA1LTEyIFNpbW9uIEdvbGRzY2htaWR0CisgICogZXRoYXJwLmgsIGV0aGFycC5jLCBuZXRpZi5jOiBmaXhlZCBidWcgIzI2NTA3OiAiR3JhdHVpdG91cyBBUlAgZGVwZW5kcyBvbgorICAgIGFycF90YWJsZSAvIHVzZXMgZXRoYXJwX3F1ZXJ5IiBieSBhZGRpbmcgZXRoYXJwX2dyYXR1aXRvdXMoKQorCisgIDIwMDktMDUtMTIgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpcC5oLCBpcC5jLCBpZ21wLmM6IGJ1ZyAjMjY0ODc6IEFkZGVkIGlwX291dHB1dF9pZl9vcHQgdGhhdCBjYW4gYWRkIElQIG9wdGlvbnMKKyAgICB0byB0aGUgSVAgaGVhZGVyICh1c2VkIGJ5IGlnbXBfaXBfb3V0cHV0X2lmKQorCisgIDIwMDktMDUtMDYgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpbmV0X2Noa3N1bS5jOiBPbiBsaXR0bGUgZW5kaWFuIGFyY2hpdGVjdHVyZXMsIHVzZSBMV0lQX1BMQVRGT1JNX0hUT05TIChpZgorICAgIGRlZmluZWQpIGZvciBTV0FQX0JZVEVTX0lOX1dPUkQgdG8gc3BlZWQgdXAgY2hlY2tzdW1taW5nLgorCisgIDIwMDktMDUtMDUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmM6IGJ1ZyAjMjY0MDU6IFByZW1hdHVyZWx5IHJlbGVhc2VkIHNlbWFwaG9yZSBjYXVzZXMgbHdpcF9zZWxlY3QoKQorICAgIHRvIGNyYXNoCisKKyAgMjAwOS0wNS0wNCBTaW1vbiBHb2xkc2NobWlkdAorICAqIGluaXQuYzogc25tcCB3YXMgbm90IGluaXRpYWxpemVkIGluIGx3aXBfaW5pdCgpCisKKyAgMjAwOS0wNS0wNCBGculk6XJpYyBCZXJub24KKyAgKiBkaGNwLmMsIG5ldGJpb3MuYzogQ2hhbmdlcyBpZiBJUF9TT0ZfQlJPQURDQVNUIGlzIGVuYWJsZWQuCisKKyAgMjAwOS0wNS0wMyBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5oOiBidWcgIzI2MzQ5OiBOYWdsZSBhbGdvcml0aG0gZG9lc24ndCBzZW5kIGFsdGhvdWdoIHNlZ21lbnQgaXMgZnVsbAorICAgIChhbmQgdW5zZW50LT5uZXh0ID09IE5VTEwpCisKKyAgMjAwOS0wNS0wMiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcGlwLmgsIHRjcGlwLmM6IGZpeGVkIHRjcGlwX3VudGltZW91dCAoZG9lcyBub3QgbmVlZCB0aGUgdGltZSwgYnJva2VuIGFmdGVyCisgICAgMS4zLjAgaW4gQ1ZTIG9ubHkpIC0gZml4ZXMgY29tcGlsYXRpb24gb2YgcHBwX29lLmMKKworICAyMDA5LTA1LTAyIFNpbW9uIEdvbGRzY2htaWR0CisgICogbXNnX2luLmM6IGZpeGVkIGJ1ZyAjMjU2MzY6IFNOTVBTRVQgdmFsdWUgaXMgaWdub3JlZCBmb3IgaW50ZWdlciBmaWVsZHMKKworICAyMDA5LTA1LTAxIFNpbW9uIEdvbGRzY2htaWR0CisgICogcGFwLmM6IGJ1ZyAjMjE2ODA6IFBQUCB1cGFwX3JhdXRobmFrKCkgZHJvcHMgbGVnYWwgTkFLIHBhY2tldHMKKworICAyMDA5LTA1LTAxIFNpbW9uIEdvbGRzY2htaWR0CisgICogcHBwLmM6IGJ1ZyAjMjQyMjg6IE1lbW9yeSBjb3JydXB0aW9uIHdpdGggUFBQIGFuZCBESENQCisKKyAgMjAwOS0wNC0yOSBGculk6XJpYyBCZXJub24KKyAgKiByYXcuYywgdWRwLmMsIGluaXQuYywgb3B0LmgsIGlwLmgsIHNvY2tldHMuaDogYnVnICMyNjMwOTogSW1wbGVtZW50IHRoZQorICAgIFNPKEYpX0JST0FEQ0FTVCBmaWx0ZXIgZm9yIGFsbCBBUEkgbGF5ZXJzLiBBdm9pZCB0aGUgdW5pbmRlbnRlZCByZWNlcHRpb24KKyAgICBvZiBicm9hZGNhc3QgcGFja2V0cyBldmVuIHdoZW4gdGhpcyBvcHRpb24gd2Fzbid0IHNldC4gUG9ydCBtYWludGFpbmVycworICAgIHdoaWNoIHdhbnQgdG8gZW5hYmxlIHRoaXMgZmlsdGVyIGhhdmUgdG8gc2V0IElQX1NPRl9CUk9BRENBU1Q9MSBpbiBvcHQuaC4KKyAgICBJZiB5b3Ugd2FudCB0aGlzIG9wdGlvbiBhbHNvIGZpbHRlciBicm9hZGNhc3Qgb24gcmVjdiBvcGVyYXRpb25zLCB5b3UgYWxzbworICAgIGhhdmUgdG8gc2V0IElQX1NPRl9CUk9BRENBU1RfUkVDVj0xIGluIG9wdC5oLgorCisgIDIwMDktMDQtMjggU2ltb24gR29sZHNjaG1pZHQsIEpha29iIFN0b2tsdW5kIE9sZXNlbgorICAqIGRoY3AuYzogcGF0Y2ggIzY3MjEsIGJ1Z3MgIzI1NTc1LCAjMjU1NzY6IFNvbWUgc21hbGwgZml4ZXMgdG8gREhDUCBhbmQKKyAgICBESENQL0FVVE9JUCBjb29wZXJhdGlvbgorCisgIDIwMDktMDQtMjUgU2ltb24gR29sZHNjaG1pZHQsIE9sZWcgVHlzaGV2CisgICogdGNwX291dC5jOiBidWcgIzI0MjEyOiBEZWFkbG9ja2VkIHRjcF9yZXRyYW5zbWl0IGR1ZSB0byBleGNlZWRlZCBwY2ItPmN3bmQKKyAgICBGaXhlZCBieSBzb3J0aW5nIHRoZSB1bnNlbnQgYW5kIHVuYWNrZWQgcXVldWVzIChzZWdtZW50cyBhcmUgaW5zZXJ0ZWQgYXQgdGhlCisgICAgcmlnaHQgcGxhY2UgaW4gdGNwX291dHB1dCBhbmQgdGNwX3JleG1pdCkuCisKKyAgMjAwOS0wNC0yNSBTaW1vbiBHb2xkc2NobWlkdAorICAqIG1lbXAuYywgbWVtLmMsIG1lbXAuaCwgbWVtX3N0ZC5oOiBidWcgIzI2MjEzICJQcm9ibGVtIHdpdGggbWVtb3J5IGFsbG9jYXRpb24KKyAgICB3aGVuIGRlYnVnZ2luZyI6IG1lbXBfc2l6ZXMgY29udGFpbmVkIHRoZSB3cm9uZyBzaXplcyAoaW5jbHVkaW5nIHNhbml0eQorICAgIHJlZ2lvbnMpOyBtZW1wIHBvb2xzIGZvciBNRU1fVVNFX1BPT0xTIHdlcmUgdG9vIHNtYWxsCisKKyAgMjAwOS0wNC0yNCBTaW1vbiBHb2xkc2NobWlkdCwgRnLpZOlyaWMgQmVybm9uCisgICogaW5ldC5jOiBwYXRjaCAjNjc2NTogRml4IGEgc21hbGwgcHJvYmxlbSB3aXRoIHRoZSBsYXN0IGNoYW5nZXMgKGluY29ycmVjdAorICAgIGJlaGF2aW9yLCB3aXRoIHdpdGggaXAgYWRkcmVzcyBzdHJpbmcgbm90IGVuZGVkIGJ5IGEgJ1wwJywgYSBzcGFjZSBvciBhCisgICAgZW5kIG9mIGxpbmUpCisKKyAgMjAwOS0wNC0xOSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHJhd2FwaS50eHQ6IEZpeGVkIGJ1ZyAjMjYwNjk6IENvcnJlY3RlZCBkb2N1bWVudGF0aW9uOiBpZiB0Y3BfY29ubmVjdCBmYWlscywKKyAgICBwY2ItPmVyciBpcyBjYWxsZWQsIG5vdCBwY2ItPmNvbm5lY3RlZCAod2l0aCBhbiBlcnJvciBjb2RlKS4KKworICAyMDA5LTA0LTE5IFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwX291dC5jOiBGaXhlZCBidWcgIzI2MjM2OiAiVENQIG9wdGlvbnMgKHRpbWVzdGFtcCkgZG9uJ3Qgd29yayB3aXRoCisgICAgbm8tY29weS10Y3B3cml0ZSI6IGRlYWxsb2NhdGUgb3B0aW9uIGRhdGEsIG9ubHkgY29uY2F0IHNlZ21lbnRzIHdpdGggc2FtZSBmbGFncworCisgIDIwMDktMDQtMTkgU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3Bfb3V0LmM6IEZpeGVkIGJ1ZyAjMjUwOTQ6ICJaZXJvLWxlbmd0aCBwYnVmIiAob3B0aW9ucyBhcmUgbm93IGFsbG9jYXRlZAorICAgIGluIHRoZSBoZWFkZXIgcGJ1Ziwgbm90IHRoZSBkYXRhIHBidWYpCisKKyAgMjAwOS0wNC0xOCBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9tc2cuYzogZml4ZWQgYnVnICMyNTY5NTogU2VnbWVudGF0aW9uIGZhdWx0IGluIGRvX3dyaXRlbW9yZSgpCisKKyAgMjAwOS0wNC0xNSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNvY2tldHMuYzogdHJpZWQgdG8gZml4IGJ1ZyAjMjM1NTk6IGx3aXBfcmVjdmZyb20gcHJvYmxlbSB3aXRoIHRjcAorCisgIDIwMDktMDQtMTUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmM6IHRhc2sgIzkxOTI6IG1lbV9mcmVlIG9mIGRoY3AtPm9wdGlvbnNfaW4gYW5kIGRoY3AtPm1zZ19pbgorCisgIDIwMDktMDQtMTUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpcC5jLCBpcDYuYywgdGNwX291dC5jLCBpcC5oOiBwYXRjaCAjNjgwODogQWRkIGEgdXRpbGl0eSBmdW5jdGlvbgorICAgIGlwX2hpbnRlZF9vdXRwdXQoKSAoZm9yIHNtYWxsZXIgY29kZSBtYWlubHkpCisKKyAgMjAwOS0wNC0xNSBTaW1vbiBHb2xkc2NobWlkdAorICAqIGluZXQuYzogcGF0Y2ggIzY3NjU6IFN1cHBvcnRpbmcgbmV3IGxpbmUgY2hhcmFjdGVycyBpbiBpbmV0X2F0b24oKQorCisgIDIwMDktMDQtMTUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmM6IHBhdGNoICM2NzY0OiBESENQIHJlYmluZCBhbmQgcmVuZXcgZGlkIG5vdCBzZW5kIGhvc3RuYW0gb3B0aW9uOworICAgIENvbnZlcnRlZCBjb25zdGFudCBPUFRJT05fTUFYX01TR19TSVpFIHRvIG5ldGlmLT5tdHUsIGNoZWNrIGlmIG5ldGlmLT5tdHUKKyAgICBpcyBiaWcgZW5vdWdoIGluIGRoY3Bfc3RhcnQKKworICAyMDA5LTA0LTE1IFNpbW9uIEdvbGRzY2htaWR0CisgICogbmV0YnVmLmM6IGJ1ZyAjMjYwMjc6IG5ldGJ1Zl9jaGFpbiByZXN1bHRlZCBpbiBwYnVmIG1lbW9yeSBsZWFrCisKKyAgMjAwOS0wNC0xNSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNvY2tldHMuYywgcHBwLmM6IGJ1ZyAjMjU3NjM6IGNvcnJlY3RlZCA0IG9jY3VycmVuY2VzIG9mIFNNRU1DUFkgdG8gTUVNQ1BZCisKKyAgMjAwOS0wNC0xNSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNvY2tldHMuYzogYnVnICMyNjEyMTogc2V0X2Vycm5vIGNhbiBiZSBvdmVycmlkZGVuCisKKyAgMjAwOS0wNC0wOSBLaWVyYW4gTWFuc2xleSAocGF0Y2ggZnJvbSBMdWNhIENlcmVzb2xpIDxsdWNhY2VyZXNvbGk+KQorICAqIGluaXQuYywgb3B0Lmg6IFBhdGNoIzY3NzQgVENQX1FVRVVFX09PU0VRIGJyZWFrcyBjb21waWxhdGlvbiB3aGVuCisgICAgTFdJUF9UQ1A9PTAKKworICAyMDA5LTA0LTA5IEtpZXJhbiBNYW5zbGV5IChwYXRjaCBmcm9tIFJveSBMZWUgPHJveWxlZTE3PikKKyAgKiB0Y3AuaDogUGF0Y2gjNjgwMiBBZGQgZG8td2hpbGUtY2xhdXNlcyB0byB0aG9zZSBmdW5jdGlvbiBsaWtlCisgICAgbWFjcm9zIGluIHRjcC5oCisKKyAgMjAwOS0wMy0zMSBLaWVyYW4gTWFuc2xleQorICAqIHRjcC5jLCB0Y3BfaW4uYywgdGNwX291dC5jLCB0Y3AuaCwgb3B0Lmg6IFJld29yayB0aGUgd2F5IHdpbmRvdworICAgIHVwZGF0ZXMgYXJlIGNhbGN1bGF0ZWQgYW5kIHNlbnQgKEJVRzIwNTE1KQorCisgICogdGNwX2luLmM6IGNvcGUgd2l0aCBTWU4gcGFja2V0cyByZWNlaXZlZCBkdXJpbmcgZXN0YWJsaXNoZWQgc3RhdGVzLAorICAgIGFuZCByZXRyYW5zbWlzc2lvbiBvZiBpbml0aWFsIFNZTi4KKworICAqIHRjcF9vdXQuYzogc2V0IHB1c2ggYml0IGNvcnJlY3RseSB3aGVuIHRjcCBzZWdtZW50cyBhcmUgbWVyZ2VkCisKKyAgMjAwOS0wMy0yNyBLaWVyYW4gTWFuc2xleQorICAqIHRjcF9vdXQuYyBzZXQgd2luZG93IGNvcnJlY3RseSBvbiBwcm9iZXMgKGNvcnJlY3RpbmcgY2hhbmdlIG1hZGUKKyAgICB5ZXN0ZXJkYXkpCisKKyAgMjAwOS0wMy0yNiBLaWVyYW4gTWFuc2xleQorICAqIHRjcC5jLCB0Y3BfaW4uYywgdGNwLmg6IGFkZCB0Y3BfYWJhbmRvbigpIHRvIGNvcGUgd2l0aCBkcm9wcGluZworICAgIGNvbm5lY3Rpb25zIHdoZXJlIG5vIHJlc2V0IHJlcXVpcmVkIChidWcgIzI1NjIyKQorCisgICogdGNwX291dC5jOiBzZXQgVENQX0FDSyBmbGFnIG9uIGtlZXBhbGl2ZSBhbmQgemVybyB3aW5kb3cgcHJvYmVzIAorICAgIChidWcgIzIwNzc5KQorCisgIDIwMDktMDItMTggU2ltb24gR29sZHNjaG1pZHQgKEpvbmF0aGFuIExhcm1vdXIgYW5kIEJpbGwgQXVlcmJhY2gpCisgICogaXBfZnJhZy5jOiBwYXRjaCAjNjUyODogdGhlIGJ1ZmZlciB1c2VkIGZvciBJUF9GUkFHX1VTRVNfU1RBVElDX0JVRiBjb3VsZCBiZQorICAgIHRvbyBzbWFsbCBkZXBlbmRpbmcgb24gTUVNX0FMSUdOTUVOVAorCisgIDIwMDktMDItMTYgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmgvLmMsIGFwaV8qLmgvLmM6IGZpeGVkIGFyZ3VtZW50cyBvZiBzb2NrZXQgZnVuY3Rpb25zIHRvIG1hdGNoIHRoZSBzdGFuZGFyZDsKKyAgICBjb252ZXJ0ZWQgc2l6ZSBhcmd1bWVudCBvZiBuZXRjb25uX3dyaXRlIHRvICdzaXplX3QnCisKKyAgMjAwOS0wMi0xNiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5oLCB0Y3AuYzogZml4ZWQgYnVnICMyNDQ0MDogVENQIGNvbm5lY3Rpb24gY2xvc2UgcHJvYmxlbSBvbiA2NC1iaXQgaG9zdAorICAgIGJ5IG1vdmluZyBhY2NlcHQgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciB0byBUQ1BfUENCX0NPTU1PTgorCisgIDIwMDktMDItMTIgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmM6IGZpeGVkIGJ1ZyAjMjUzNDUgKERIQ1BERUNMSU5FIGlzIHNlbnQgd2l0aCAiTWF4aW11bSBtZXNzYWdlIHNpemUiCisgICAgb3B0aW9uKQorCisgIDIwMDktMDItMTEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmM6IGZpeGVkIGJ1ZyAjMjQ0ODAgKHJlbGVhc2luZyBvbGQgdWRwX3BkYiBhbmQgcGJ1ZiBpbiBkaGNwX3N0YXJ0KQorCisgIDIwMDktMDItMTEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBvcHQuaCwgYXBpX21zZy5jOiBhZGRlZCBjb25maWd1cmFibGUgZGVmYXVsdCB2YWx1ZCBmb3IgbmV0Y29ubi0+cmVjdl9idWZzaXplOgorICAgIFJFQ1ZfQlVGU0laRV9ERUZBVUxUIChmaXhlcyBidWcgIzIzNzI2OiBwYnVmIHBvb2wgZXhoYXVzdGlvbiBvbiBzbG93IHJlY3YoKSkKKworICAyMDA5LTAyLTEwIFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmM6IGZpeGVkIGJ1ZyAjMjU0Njc6IExpc3RlbiBiYWNrbG9nIGlzIG5vdCByZXNldCBvbiB0aW1lb3V0IGluIFNZTl9SQ1ZEOgorICAgIEFjY2VwdHNfcGVuZGluZyBpcyBkZWNyZWFzZSBvbiBhIGNvcnJlc3BvbmRpbmcgbGlzdGVuIHBjYiB3aGVuIGEgY29ubmVjdGlvbgorICAgIGluIHN0YXRlIFNZTl9SQ1ZEIGlzIGNsb3NlLgorCisgIDIwMDktMDEtMjggSm9uYXRoYW4gTGFybW91cgorICAqIHBidWYuYzogcmVjbGFpbSBwYnVmcyBmcm9tIFRDUCBvdXQtb2Ytc2VxdWVuY2Ugc2VnbWVudHMgaWYgd2UgcnVuCisgICAgb3V0IG9mIHBvb2wgcGJ1ZnMuCisKKyAgMjAwOC0xMi0xOSBTaW1vbiBHb2xkc2NobWlkdAorICAqIG1hbnkgZmlsZXM6IHBhdGNoICM2Njk5OiBmaXhlZCBzb21lIHdhcm5pbmdzIG9uIHBsYXRmb3JtIHdoZXJlIHNpemVvZihpbnQpID09IDIgCisKKyAgMjAwOC0xMi0xMCBUYW1hcyBTb21vZ3lpLCBGculk6XJpYyBCZXJub24KKyAgKiBzb2NrZXRzLmM6IGZpeGVkIGJ1ZyAjMjUwNTE6IGx3aXBfcmVjdmZyb20gcHJvYmxlbSB3aXRoIHVkcDogZnJvbWFkZHIgYW5kCisgICAgcG9ydCB1c2VzIGRlbGV0ZWQgbmV0YnVmLgorCisgIDIwMDgtMTAtMTggU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3BfaW4uYzogZml4ZWQgYnVnICMjMjQ1OTY6IFZ1bG5lcmFiaWxpdHkgb24gZmF1bHR5IFRDUCBvcHRpb25zIGxlbmd0aAorICAgIGluIHRjcF9wYXJzZW9wdAorCisgIDIwMDgtMTAtMTUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpcF9mcmFnLmM6IGZpeGVkIGJ1ZyAjMjQ1MTc6IElQIHJlYXNzZW1ibHkgY3Jhc2hlcyBvbiB1bmFsaWduZWQgSVAgaGVhZGVycworICAgIGJ5IHBhY2tpbmcgdGhlIHN0cnVjdCBpcF9yZWFzc19oZWxwZXIuCisKKyAgMjAwOC0xMC0wMyBEYXZpZCBXb29kaG91c2UsIEpvbmF0aGFuIExhcm1vdXIKKyAgKiBldGhhcnAuYyAoZXRoYXJwX2FycF9pbnB1dCk6IEZpeCB0eXBlIGFsaWFzaW5nIHByb2JsZW0gY29weWluZyBpcCBhZGRyZXNzLgorCisgIDIwMDgtMTAtMDIgSm9uYXRoYW4gTGFybW91cgorICAqIGRucy5jOiBIYXJkLWNvZGUgc3RydWN0dXJlIHNpemVzLCB0byBhdm9pZCBpc3N1ZXMgb24gc29tZSBjb21waWxlcnMgd2hlcmUKKyAgICBwYWRkaW5nIGlzIGluY2x1ZGVkLgorCisgIDIwMDgtMDktMzAgSm9uYXRoYW4gTGFybW91cgorICAqIHNvY2tldHMuYyAobHdpcF9hY2NlcHQpOiBjaGVjayBhZGRyIGlzbid0IE5VTEwuIElmIGl0J3MgdmFsaWQsIGRvIGFuCisgICAgYXNzZXJ0aW9uIGNoZWNrIHRoYXQgYWRkcmxlbiBpc24ndCBOVUxMLgorCisgIDIwMDgtMDktMzAgSm9uYXRoYW4gTGFybW91cgorICAqIHRjcC5jOiBGaXggYnVnICMyNDIyNywgd3JvbmcgZXJyb3IgbWVzc2FnZSBpbiB0Y3BfYmluZC4KKworICAyMDA4LTA4LTI2IFNpbW9uIEdvbGRzY2htaWR0CisgICogaW5ldC5oLCBpcF9hZGRyLmg6IGZpeGVkIGJ1ZyAjMjQxMzI6IENyb3NzLWRlcGVuZGVuY3kgYmV0d2VlbiBpcF9hZGRyLmggYW5kCisgICAgaW5ldC5oIC0+IG1vdmVkIGRlY2xhcmF0aW9uIG9mIHN0cnVjdCBpbl9hZGRyIGZyb20gaXBfYWRkci5oIHRvIGluZXQuaAorCisgIDIwMDgtMDgtMTQgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGlfbXNnLmM6IGZpeGVkIGJ1ZyAjMjM4NDc6IGRvX2Nsb3NlX2ludGVybmFsIHJlZmVyZW5jZXMgZnJlZWQgbWVtb3J5ICh3aGVuCisgICAgdGNwX2Nsb3NlIHJldHVybnMgIT0gRVJSX09LKQorCisgIDIwMDgtMDctMDggRnLpZOlyaWMgQmVybm9uCisgICogc3RhdHMuaDogRml4IHNvbWUgYnVpbGQgYnVncyBpbnRyb2R1Y2VkIHdpdGggcGF0Y2ggIzY0ODMgKG1pc3Npbmcgc29tZSBwYXJhbWV0ZXJzCisgICAgaW4gbWFjcm9zLCBtYWlubHkgaWYgTUVNX1NUQVRTPTAgYW5kIE1FTVBfU1RBVFM9MCkuCisKKyAgMjAwOC0wNi0yNCBKb25hdGhhbiBMYXJtb3VyCisgICogdGNwX2luLmM6IEZpeCBmb3IgYnVnICMyMzY5MyBhcyBzdWdnZXN0ZWQgYnkgQXJ0IFIuIEVuc3VyZSBjc2VnIGlzIHVudXNlZAorICAgIGlmIHRjcF9zZWdfY29weSBmYWlscy4KKworICAyMDA4LTA2LTE3IFNpbW9uIEdvbGRzY2htaWR0CisgICogaW5ldF9jaGtzdW0uYzogQ2hlY2tlZCBpbiBzb21lIGlkZWFzIG9mIHBhdGNoICM2NDYwIChsb29wIG9wdGltaXphdGlvbnMpCisgICAgYW5kIGNyZWF0ZWQgZGVmaW5lcyBmb3Igc3dhcHBpbmcgYnl0ZXMgYW5kIGZvbGRpbmcgdTMyIHRvIHUxNi4KKworICAyMDA4LTA1LTMwIEtpZXJhbiBNYW5zbGV5CisgICogdGNwX2luLmMgUmVtb3ZlIHJlZHVuZGFudCAiaWYiIHN0YXRlbWVudCwgYW5kIHVzZSByZWFsIHJjdl93bmQKKyAgICByYXRoZXIgdGhhbiByY3ZfYW5uX3duZCB3aGVuIGRlY2lkaW5nIGlmIHBhY2tldHMgYXJlIGluLXdpbmRvdy4KKyAgICBDb250cmlidXRlZCBieSA8YXJhc211c3NlbkBjb25zdWx0YW50LmRhdGFzeXMuc3dyaS5lZHU+CisKKyAgMjAwOC0wNS0zMCBLaWVyYW4gTWFuc2xleQorICAqIG1lbS5oOiBGaXggQlVHIzIzMjU0LiAgQ2hhbmdlIG1hY3JvIGRlZmluaXRpb24gb2YgbWVtXyogdG8gYWxsb3cKKyAgICBwYXNzaW5nIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIHdoZW4gTUVNX0xJQkNfTUFMTE9DIGlzIGRlZmluZWQuCisKKyAgMjAwOC0wNS0wOSBKb25hdGhhbiBMYXJtb3VyCisgICogZXJyLmgsIGVyci5jLCBzb2NrZXRzLmM6IEZpeCBidWcgIzIzMTE5OiBSZW9yZGVyIHRpbWVvdXQgZXJyb3IgY29kZSB0bworICAgIHN0b3AgaXQgYmVpbmcgdHJlYXRlZCBhcyBhIGZhdGFsIGVycm9yLgorCisgIDIwMDgtMDQtMTUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmM6IGZpeGVkIGJ1ZyAjMjI4MDQ6IGRoY3Bfc3RvcCBkb2Vzbid0IGNsZWFyIE5FVElGX0ZMQUdfREhDUAorICAgIChmbGFnIG5vdyBjbGVhcmVkKQorCisgIDIwMDgtMDMtMjcgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtZW0uYywgdGNwaXAuYywgdGNwaXAuaCwgb3B0Lmg6IGZpeGVkIGJ1ZyAjMjE0MzMgKENhbGxpbmcgbWVtX2ZyZWUvcGJ1Zl9mcmVlCisgICAgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCBpc24ndCBzYWZlKTogc2V0IExXSVBfVVNFX0hFQVBfRlJPTV9JTlRFUlJVUFQgdG8gMQorICAgIGluIGx3aXBvcHRzLmggb3IgdXNlIHBidWZfZnJlZV9jYWxsYmFjayhwKS9tZW1fZnJlZV9jYWxsYmFjayhtKSB0byBmcmVlIHBidWZzCisgICAgb3IgaGVhcCBtZW1vcnkgZnJvbSBpbnRlcnJ1cHQgY29udGV4dAorCisgIDIwMDgtMDMtMjYgU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3BfaW4uYywgdGNwLmM6IGZpeGVkIGJ1ZyAjMjIyNDk6IGRpdmlzaW9uIGJ5IHplcm8gY291bGQgb2NjdXIgaWYgYSByZW1vdGUKKyAgICBob3N0IHNlbnQgYSB6ZXJvIG1zcyBhcyBUQ1Agb3B0aW9uLgorCisKKyhTVEFCTEUtMS4zLjApCisKKyAgKysgTmV3IGZlYXR1cmVzOgorCisgIDIwMDgtMDMtMTAgSm9uYXRoYW4gTGFybW91cgorICAqIGluZXRfY2hrc3VtLmM6IEFsbG93IGNob2ljZSBvZiBvbmUgb2YgdGhlIHNhbXBsZSBhbGdvcml0aG1zIHRvIGJlCisgICAgbWFkZSBmcm9tIGx3aXBvcHRzLmguIEZpeCBjb21tZW50IG9uIGhvdyB0byBvdmVycmlkZSBMV0lQX0NIS1NVTS4KKworICAyMDA4LTAxLTIyIEZy6WTpcmljIEJlcm5vbgorICAqIHRjcC5jLCB0Y3BfaW4uYywgdGNwLmgsIG9wdC5oOiBSZW5hbWUgTFdJUF9DQUxDVUxBVEVfRUZGX1NFTkRfTVNTIGluIAorICAgIFRDUF9DQUxDVUxBVEVfRUZGX1NFTkRfTVNTIHRvIGhhdmUgY29oZXJlbnQgVENQIG9wdGlvbnMgbmFtZXMuCisKKyAgMjAwOC0wMS0xNCBGculk6XJpYyBCZXJub24KKyAgKiByYXdhcGkudHh0LCBhcGlfbXNnLmMsIHRjcC5jLCB0Y3BfaW4uYywgdGNwLmg6IGNoYW5nZXMgZm9yIHRhc2sgIzc2NzUgIkVuYWJsZQorICAgIHRvIHJlZnVzZSBkYXRhIG9uIGEgVENQX0VWRU5UX1JFQ1YgY2FsbCIuIEltcG9ydGFudCwgYmVoYXZpb3IgY2hhbmdlcyBmb3IgdGhlCisgICAgdGNwX3JlY3YgY2FsbGJhY2sgKHNlZSByYXdhcGkudHh0KS4KKworICAyMDA4LTAxLTE0IEZy6WTpcmljIEJlcm5vbiwgTWFyYyBDaGFsYW5kCisgICogaXAuYzogSW50ZWdyYXRlIHBhdGNoICM2MzY5IiBpcF9pbnB1dCA6IGNoZWNraW5nIGJlZm9yZSByZWFsbG9jIi4KKyAgCisgIDIwMDgtMDEtMTIgRnLpZOlyaWMgQmVybm9uCisgICogdGNwaXAuaCwgdGNwaXAuYywgYXBpLmgsIGFwaV9saWIuYywgYXBpX21zZy5jLCBzb2NrZXRzLmM6IHJlcGxhY2UgdGhlIGZpZWxkCisgICAgbmV0Y29ubjo6c2VtIHBlciBuZXRjb25uOjpvcF9jb21wbGV0ZWQgbGlrZSBzdWdnZXN0ZWQgZm9yIHRoZSB0YXNrICM3NDkwCisgICAgIkFkZCByZXR1cm4gdmFsdWUgdG8gc3lzX21ib3hfcG9zdCIuCisKKyAgMjAwOC0wMS0xMiBGculk6XJpYyBCZXJub24KKyAgKiBhcGlfbXNnLmMsIG9wdC5oOiByZXBsYWNlIERFRkFVTFRfUkVDVk1CT1hfU0laRSBwZXIgREVGQVVMVF9UQ1BfUkVDVk1CT1hfU0laRSwKKyAgICBERUZBVUxUX1VEUF9SRUNWTUJPWF9TSVpFIGFuZCBERUZBVUxUX1JBV19SRUNWTUJPWF9TSVpFICh0byBvcHRpbWl6ZSBxdWV1ZXMKKyAgICBzaXplcyksIGxpa2Ugc3VnZ2VzdGVkIGZvciB0aGUgdGFzayAjNzQ5MCAiQWRkIHJldHVybiB2YWx1ZSB0byBzeXNfbWJveF9wb3N0Ii4KKworICAyMDA4LTAxLTEwIEZy6WTpcmljIEJlcm5vbgorICAqIHRjcGlwLmgsIHRjcGlwLmM6IGFkZCB0Y3BpcF9jYWxsYmFja193aXRoX2Jsb2NrIGZ1bmN0aW9uIGZvciB0aGUgdGFzayAjNzQ5MAorICAgICJBZGQgcmV0dXJuIHZhbHVlIHRvIHN5c19tYm94X3Bvc3QiLiB0Y3BpcF9jYWxsYmFjayBpcyBhbHdheXMgZGVmaW5lZCBhcworICAgICJibG9ja2luZyIgKCJibG9jayIgcGFyYW1ldGVyID0gMSkuCisKKyAgMjAwOC0wMS0xMCBGculk6XJpYyBCZXJub24KKyAgKiB0Y3BpcC5oLCB0Y3BpcC5jLCBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmMsIHNvY2tldHMuYzogcmVwbGFjZSB0aGUgZmllbGQKKyAgICBuZXRjb25uOjptYm94IChzeXNfbWJveF90KSBwZXIgbmV0Y29ubjo6c2VtIChzeXNfc2VtX3QpIGZvciB0aGUgdGFzayAjNzQ5MAorICAgICJBZGQgcmV0dXJuIHZhbHVlIHRvIHN5c19tYm94X3Bvc3QiLgorCisgIDIwMDgtMDEtMDUgRnLpZOlyaWMgQmVybm9uCisgICogc3lzX2FyY2gudHh0LCBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmgsIGFwaV9tc2cuYywgdGNwaXAuYywgc3lzLmgsIG9wdC5oOgorICAgIEludHJvZHVjZSBjaGFuZ2VzIGZvciB0YXNrICM3NDkwICJBZGQgcmV0dXJuIHZhbHVlIHRvIHN5c19tYm94X3Bvc3QiIHdpdGggc29tZQorICAgIG1vZGlmaWNhdGlvbnMgaW4gdGhlIHN5c19tYm94IGFwaTogc3lzX21ib3hfbmV3IHRha2UgYSAic2l6ZSIgcGFyYW1ldGVycyB3aGljaAorICAgIGluZGljYXRlIHRoZSBudW1iZXIgb2YgcG9pbnRlcnMgcXVlcnkgYnkgdGhlIG1haWxib3guIFRoZXJlIGlzIHRocmVlIGRlZmluZXMKKyAgICBpbiBvcHQuaCB0byBpbmRpY2F0ZSBzaXplcyBmb3IgdGNwaXA6Om1ib3gsIG5ldGNvbm46OnJlY3ZtYm94LCBhbmQgZm9yIHRoZSAKKyAgICBuZXRjb25uOjphY2NlcHRtYm94LiBQb3J0IG1haW50YWluZXJzLCB5b3UgY2FuIGRlY2lkZSB0byBqdXN0IGFkZCB0aGlzIG5ldyAKKyAgICBwYXJhbWV0ZXIgaW4geW91ciBpbXBsZW1lbnRhdGlvbiwgYnV0IHRvIGlnbm9yZSBpdCB0byBrZWVwIHRoZSBwcmV2aW91cyBiZWhhdmlvci4KKyAgICBUaGUgbmV3IHN5c19tYm94X3RyeXBvc3QgZnVuY3Rpb24gcmV0dXJuIGEgdmFsdWUgdG8ga25vdyBpZiB0aGUgbWFpbGJveCBpcworICAgIGZ1bGwgb3IgaWYgdGhlIG1lc3NhZ2UgaXMgcG9zdGVkLiBUYWtlIGEgbG9vayB0byBzeXNfYXJjaC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAgICBUaGlzIG5ldyBmdW5jdGlvbiBpcyB1c2VkIGluIHRjcGlwX2lucHV0IChzbywgY2FuIGJlIGNhbGxlZCBpbiBhbiBpbnRlcnJ1cHQKKyAgICBjb250ZXh0IHNpbmNlIHRoZSBmdW5jdGlvbiBpcyBub3QgYmxvY2tpbmcpLCBhbmQgaW4gcmVjdl91ZHAgYW5kIHJlY3ZfcmF3LgorCisgIDIwMDgtMDEtMDQgRnLpZOlyaWMgQmVybm9uLCBTaW1vbiBHb2xkc2NobWlkdCwgSm9uYXRoYW4gTGFybW91cgorICAqIHJhd2FwaS50eHQsIGFwaS5oLCBhcGlfbGliLmMsIGFwaV9tc2cuaCwgYXBpX21zZy5jLCBzb2NrZXRzLmMsIHRjcC5oLCB0Y3AuYywKKyAgICB0Y3BfaW4uYywgaW5pdC5jLCBvcHQuaDogcmVuYW1lIGJhY2tsb2cgb3B0aW9ucyB3aXRoIFRDUF8gcHJlZml4LCBsaW1pdCB0aGUKKyAgICAiYmFja2xvZyIgcGFyYW1ldGVyIGluIGFuIHU4X3QsIDAgaXMgaW50ZXJwcmV0ZWQgYXMgInNtYWxsZXN0IHF1ZXVlIiwgYWRkCisgICAgZG9jdW1lbnRhdGlvbiBpbiB0aGUgcmF3YXBpLnR4dCBmaWxlLgorCisgIDIwMDctMTItMzEgS2llcmFuIE1hbnNsZXkgKGJhc2VkIG9uIHBhdGNoIGZyb20gUGVyLUhlbnJpayBMdW5kYm9sbSkKKyAgKiB0Y3AuYywgdGNwX2luLmMsIHRjcF9vdXQuYywgdGNwLmg6IEFkZCBUQ1AgcGVyc2lzdCB0aW1lcgorCisgIDIwMDctMTItMzEgRnLpZOlyaWMgQmVybm9uLCBMdWNhIENlcmVzb2xpCisgICogYXV0b2lwLmMsIGV0aGFycC5jOiBpcF9hZGRyLmg6IEludGVncmF0ZSBwYXRjaCAjNjM0ODogIkJyb2FkY2FzdCBBUlAgcGFja2V0cworICAgIGluIGF1dG9pcCIuIFRoZSBjaGFuZ2UgaW4gZXRoYXJwX3JhdyBjb3VsZCBiZSByZW1vdmVkLCBzaW5jZSBhbGwgY2FsbHMgdG8KKyAgICBldGhhcnBfcmF3IHVzZSBldGhicm9hZGNhc3QgZm9yIHRoZSAiZXRoZHN0X2FkZHIiIHBhcmFtZXRlci4gQnV0IGl0IGNvdWxkIGJlCisgICAgd3JvbmcgaW4gdGhlIGZ1dHVyZS4KKworICAyMDA3LTEyLTMwIEZy6WTpcmljIEJlcm5vbiwgVG9tIEV2YW5zCisgICogaXAuYzogRml4IGJ1ZyAjMjE4NDYgIkx3SVAgZG9lc24ndCBhcHBlYXIgdG8gcGVyZm9ybSBhbnkgSVAgU291cmNlIEFkZHJlc3MKKyAgICBGaWx0ZXJpbmciIHJlcG9ydGVkIGJ5IFRvbSBFdmFucy4KKworICAyMDA3LTEyLTIxIEZy6WTpcmljIEJlcm5vbiwgU2ltb24gR29sZHNjaG1pZHQsIEpvbmF0aGFuIExhcm1vdXIKKyAgKiB0Y3AuaCwgb3B0LmgsIGFwaS5oLCBhcGlfbXNnLmgsIHRjcC5jLCB0Y3BfaW4uYywgYXBpX2xpYi5jLCBhcGlfbXNnLmMsCisgICAgc29ja2V0cy5jLCBpbml0LmM6IHRhc2sgIzcyNTI6IEltcGxlbWVudCBUQ1AgbGlzdGVuIGJhY2tsb2c6IFdhcm5pbmc6IHJhdyBBUEkKKyAgICBhcHBsaWNhdGlvbnMgaGF2ZSB0byBjYWxsICd0Y3BfYWNjZXB0ZWQocGNiKScgaW4gdGhlaXIgYWNjZXB0IGNhbGxiYWNrIHRvCisgICAga2VlcCBhY2NlcHRpbmcgbmV3IGNvbm5lY3Rpb25zLgorCisgIDIwMDctMTItMTMgRnLpZOlyaWMgQmVybm9uCisgICogYXBpX21zZy5jLCBlcnIuaCwgZXJyLmMsIHNvY2tldHMuYywgZG5zLmMsIGRucy5oOiByZXBsYWNlICJlbnVtIGRuc19yZXN1bHQiCisgICAgYnkgZXJyX3QgdHlwZS4gQWRkIGEgbmV3IGVycl90IGNvZGUgIkVSUl9JTlBST0dSRVNTIi4KKworICAyMDA3LTEyLTEyIEZy6WTpcmljIEJlcm5vbgorICAqIGRucy5oLCBkbnMuYywgb3B0Lmg6IG1vdmUgRE5TIG9wdGlvbnMgdG8gdGhlICJyaWdodCIgcGxhY2UuIE1vc3QgdmlzaWJsZXMKKyAgICBhcmUgdGhlIG9uZSB3aGljaCBoYXZlIHJhbSB1c2FnZS4KKworICAyMDA3LTEyLTA1IEZy6WTpcmljIEJlcm5vbgorICAqIG5ldGRiLmM6IGFkZCBhIExXSVBfRE5TX0FQSV9IT1NURU5UX1NUT1JBR0Ugb3B0aW9uIHRvIGRlY2lkZSB0byB1c2UgYSBzdGF0aWMKKyAgICBzZXQgb2YgdmFyaWFibGVzICg9MCkgb3IgYSBsb2NhbCBvbmUgKD0xKS4gSW4gdGhpcyBsYXN0IGNhc2UsIHlvdXIgcG9ydCBzaG91bGQKKyAgICBwcm92aWRlIGEgZnVuY3Rpb24gInN0cnVjdCBob3N0ZW50KiBzeXNfdGhyZWFkX2hvc3RlbnQoIHN0cnVjdCBob3N0ZW50KiBoKSIKKyAgICB3aGljaCBoYXZlIHRvIGRvIGEgY29weSBvZiAiaCIgYW5kIHJldHVybiBhIHBvaW50ZXIgb250IHRoZSAicGVyLXRocmVhZCIgY29weS4KKworICAyMDA3LTEyLTAzIFNpbW9uIEdvbGRzY2htaWR0CisgICogaXAuYzogaXBfaW5wdXQ6IGNoZWNrIGlmIGEgcGFja2V0IGlzIGZvciBpbnAgZmlyc3QgYmVmb3JlIGNoZWNraW5nIGFsbCBvdGhlcgorICAgIG5ldGlmcyBvbiBuZXRpZl9saXN0IChzcGVlZHMgdXAgcGFja2V0IHJlY2VpdmluZyBpbiBtb3N0IGNhc2VzKQorCisgIDIwMDctMTEtMzAgU2ltb24gR29sZHNjaG1pZHQKKyAgKiB1ZHAuYywgcmF3LmM6IHRhc2sgIzc0OTc6IFNvcnQgbGlzdHMgKHBjYiwgbmV0aWYsIC4uLikgZm9yIGZhc3RlciBhY2Nlc3MKKyAgICBVRFA6IG1vdmUgYSAoY29ubmVjdGVkKSBwY2Igc2VsZWN0ZWQgZm9yIGlucHV0IHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCBvZgorICAgIHBjYnMgc28gdGhhdCBpdCBpcyBmb3VuZCBmYXN0ZXIgbmV4dCB0aW1lLiBTYW1lIGZvciBSQVcgcGNicyB0aGF0IGhhdmUgZWF0ZW4KKyAgICBhIHBhY2tldC4KKworICAyMDA3LTExLTI4IFNpbW9uIEdvbGRzY2htaWR0CisgICogZXRoYXJwLmMsIHN0YXRzLmMsIHN0YXRzLmgsIG9wdC5oOiBJbnRyb2R1Y2VkIEVUSEFSUF9TVEFUUworCisgIDIwMDctMTEtMjUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkaGNwLmM6IGRoY3BfdW5mb2xkX3JlcGx5KCkgdXNlcyBwYnVmX2NvcHlfcGFydGlhbCBpbnN0ZWFkIG9mIGl0cyBvd24gY29weQorICAgIGFsZ29yaXRobS4KKworICAyMDA3LTExLTI0IFNpbW9uIEdvbGRzY2htaWR0CisgICogbmV0ZGIuaCwgbmV0ZGIuYywgc29ja2V0cy5oLy5jOiBNb3ZlZCBsd2lwX2dldGhvc3RieW5hbWUgZnJvbSBzb2NrZXRzLmMKKyAgICB0byB0aGUgbmV3IGZpbGUgbmV0ZGIuYzsgaW5jbHVkZWQgbHdpcF9nZXRhZGRyaW5mby4KKworICAyMDA3LTExLTIxIFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmgsIG9wdC5oLCB0Y3AuYywgdGNwX2luLmM6IGltcGxlbWVudGVkIGNhbGN1bGF0aW5nIHRoZSBlZmZlY3RpdmUgc2VuZC1tc3MKKyAgICBiYXNlZCBvbiB0aGUgTVRVIG9mIHRoZSBuZXRpZiB1c2VkIHRvIHNlbmQuIEVuYWJsZWQgYnkgZGVmYXVsdC4gRGlzYWJsZSBieQorICAgIHNldHRpbmcgTFdJUF9DQUxDVUxBVEVfRUZGX1NFTkRfTVNTIHRvIDAuIFRoaXMgZml4ZXMgYnVnICMyMTQ5Mi4KKworICAyMDA3LTExLTE5IEZy6WTpcmljIEJlcm5vbgorICAqIGFwaV9tc2cuYywgZG5zLmgsIGRucy5jOiBJbXBsZW1lbnQgRE5TX0RPRVNfTkFNRV9DSEVDSyBvcHRpb24gKGNoZWNrIGlmIG5hbWUKKyAgICByZWNlaXZlZCBtYXRjaCB0aGUgbmFtZSBxdWVyeSksIGltcGxlbWVudCBETlNfVVNFU19TVEFUSUNfQlVGICh0aGUgcGxhY2Ugd2hlcmUKKyAgICBjb3B5IGRucyBwYXlsb2FkIHRvIHBhcnNlIHRoZSByZXNwb25zZSksIHJldHVybiBhbiBlcnJvciBpZiB0aGVyZSBpcyBubyBwbGFjZQorICAgIGZvciBhIG5ldyBxdWVyeSwgYW5kIGZpeCBzb21lIG1pbm9yIHByb2JsZW1zLgorCisgIDIwMDctMTEtMTYgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBuZXcgZmlsZXM6IGlwdjQvaW5ldC5jLCBpcHY0L2luZXRfY2hrc3VtLmMsIGlwdjYvaW5ldDYuYworICAgIHJlbW92ZWQgZmlsZXM6IGNvcmUvaW5ldC5jLCBjb3JlL2luZXQ2LmMKKyAgICBNb3ZlZCBpbmV0IGZpbGVzIGludG8gaXB2NC9pcHY2IGRpcmVjdG9yeTsgc3BsaXR0ZWQgaW5ldC5jL2luZXQuaCBpbnRvCisgICAgaW5ldCBhbmQgY2hrc3VtIHBhcnQ7IGNoYW5nZWQgaW5jbHVkZXMgaW4gYWxsIGx3SVAgZmlsZXMgYXMgYXBwcm9wcmlhdGUKKworICAyMDA3LTExLTE2IFNpbW9uIEdvbGRzY2htaWR0CisgICogYXBpLmgsIGFwaV9tc2cuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmMsIHNvY2tldC5oLCBzb2NrZXQuYzogQWRkZWQgc2VxdWVudGlhbAorICAgIGRucyByZXNvbHZlciBmdW5jdGlvbiBmb3IgbmV0Y29ubiBhcGkgKG5ldGNvbm5fZ2V0aG9zdGJ5bmFtZSkgYW5kIHNvY2tldCBhcGkKKyAgICAoZ2V0aG9zdGJ5bmFtZS9nZXRob3N0YnluYW1lX3IpLgorCisgIDIwMDctMTEtMTUgSmltIFBldHRpbmF0bywgRnLpZOlyaWMgQmVybm9uCisgICogb3B0LmgsIGluaXQuYywgdGNwaXAuYywgZGhjcC5jLCBkbnMuaCwgZG5zLmM6IGFkZCBETlMgY2xpZW50IGZvciBzaW1wbGUgbmFtZQorICAgIHJlcXVlc3RzIHdpdGggUkFXIGFwaSBpbnRlcmZhY2UuIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gbHdpcF9pbml0KCkgd2l0aAorICAgIGJ1aWxkIHRpbWUgb3B0aW9ucy4gRE5TIHRpbWVyIGlzIGFkZGVkIGluIHRjcGlwX3RocmVhZCBjb250ZXh0LiBESENQIGNhbiBzZXQKKyAgICBETlMgc2VydmVyIGlwIGFkZHJlc3NlcyB3aGVuIG9wdGlvbnMgYXJlIHJlY2VpdmVkLiBZb3UgbmVlZCB0byBzZXQgTFdJUF9ETlM9MQorICAgIGluIHlvdXIgbHdpcG9wdHMuaCBmaWxlIChMV0lQX0ROUz0wIGluIG9wdC5oKS4gRE5TX0RFQlVHIGNhbiBiZSBzZXQgdG8gZ2V0CisgICAgc29tZSB0cmFjZXMgd2l0aCBMV0lQX0RFQlVHRi4gU2FuaXR5IGNoZWNrIGhhdmUgYmVlbiBhZGRlZC4gVGhlcmUgaXMgYSAidG9kbyIKKyAgICBsaXN0IHdpdGggcG9pbnRzIHRvIGltcHJvdmUuCisKKyAgMjAwNy0xMS0wNiBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oLCBtaWIyLmM6IFBhdGNoICM2MjE1OiBhZGRlZCBpZkFkbWluU3RhdHVzIHdyaXRlIHN1cHBvcnQgKGlmIGV4cGxpY2l0bHkKKyAgICBlbmFibGVkIGJ5IGRlZmluaW5nIFNOTVBfU0FGRV9SRVFVRVNUUyB0byAwKTsgYWRkZWQgY29kZSB0byBjaGVjayBsaW5rIHN0YXR1cworICAgIGZvciBpZk9wZXJTdGF0dXMgaWYgTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLIGlzIGRlZmluZWQuCisKKyAgMjAwNy0xMS0wNiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaS5oLCBhcGlfbXNnLmggYW5kIGRlcGVuZGVudCBmaWxlczogVGFzayAjNzQxMDogUmVtb3ZlZCB0aGUgbmVlZCB0byBpbmNsdWRlCisgICAgY29yZSBoZWFkZXIgZmlsZXMgaW4gYXBpLmggKGlwL3RjcC91ZHAvcmF3LmgpIHRvIGhpZGUgdGhlIGludGVybmFsCisgICAgaW1wbGVtZW50YXRpb24gZnJvbSBuZXRjb25uIGFwaSBhcHBsaWNhdGlvbnMuCisKKyAgMjAwNy0xMS0wMyBGculk6XJpYyBCZXJub24KKyAgKiBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmMsIHNvY2tldHMuYywgb3B0Lmg6IGFkZCBTT19SQ1ZCVUYgb3B0aW9uIGZvciBVRFAgJgorICAgIFJBVyBuZXRjb25uLiBZb3UgbmVlZCB0byBzZXQgTFdJUF9TT19SQ1ZCVUY9MSBpbiB5b3VyIGx3aXBvcHRzLmggKGl0J3MgZGlzYWJsZWQKKyAgICBieSBkZWZhdWx0KS4gTmV0Y29ubiBBUEkgdXNlcnMgY2FuIHVzZSB0aGUgbmV0Y29ubl9yZWN2X2J1ZnNpemUgbWFjcm8gdG8gYWNjZXNzCisgICAgaXQuIFRoaXMgaXMgYSBmaXJzdCByZWxlYXNlIHdoaWNoIGhhdmUgdG8gYmUgaW1wcm92ZSBmb3IgVENQLiBOb3RlIGl0IHVzZWQgdGhlCisgICAgbmV0Y29ubjo6cmVjdl9hdmFpbCB3aGljaCBuZWVkIHRvIGJlIG1vcmUgInRocmVhZC1zYWZlIiAobm90ZSB0aGVyZSBpcyBhbHJlYWR5CisgICAgdGhlIHByb2JsZW0gZm9yIEZJT05SRUFEIHdpdGggbHdpcF9pb2N0bC9pb2N0bHNvY2tldCkuCisKKyAgMjAwNy0xMS0wMSBGculk6XJpYyBCZXJub24sIE1hcmMgQ2hhbGFuZAorICAqIHNvY2tldHMuaCwgc29ja2V0cy5jLCBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmgsIGFwaV9tc2cuYywgdGNwLmgsIHRjcF9vdXQuYzoKKyAgICBJbnRlZ3JhdGUgInBhdGNoICM2MjUwIDogTVNHX01PUkUgZmxhZyBmb3Igc2VuZCIuIE1TR19NT1JFIGlzIHVzZWQgYXQgc29ja2V0IGFwaQorICAgIGxheWVyLCBORVRDT05OX01PUkUgYXQgbmV0Y29ubiBhcGkgbGF5ZXIsIGFuZCBUQ1BfV1JJVEVfRkxBR19NT1JFIGF0IHJhdyBhcGkKKyAgICBsYXllci4gVGhpcyBvcHRpb24gZW5hYmxlIHRvIGRlbGF5ZWQgVENQIFBVU0ggZmxhZyBvbiBtdWx0aXBsZSAid3JpdGUiIGNhbGxzLgorICAgIE5vdGUgdGhhdCBwcmV2aW91cyAiY29weSIgcGFyYW1ldGVyIGZvciAid3JpdGUiIEFQSXMgaXMgbm93IGNhbGxlZCAiYXBpZmxhZ3MiLgorCisgIDIwMDctMTAtMjQgRnLpZOlyaWMgQmVybm9uCisgICogYXBpLmgsIGFwaV9saWIuYywgYXBpX21zZy5jOiBBZGQgbWFjcm8gQVBJX0VWRU5UIGluIHRoZSBzYW1lIHNwaXJpdCB0aGFuIAorICAgIFRDUF9FVkVOVF94eHggbWFjcm9zIHRvIGdldCBhIGNvZGUgbW9yZSByZWFkYWJsZS4gSXQgY291bGQgYWxzbyBoZWxwIHRvIHJlbW92ZQorICAgIHNvbWUgY29kZSAobGlrZSB3ZSBoYXZlIHRhbGsgaW4gInBhdGNoICM1OTE5IDogQ3JlYXRlIGNvbXBpbGUgc3dpdGNoIHRvIHJlbW92ZQorICAgIHNlbGVjdCBjb2RlIiksIGJ1dCBpdCBjb3VsZCBiZSBkb25lIGxhdGVyLgorCisgIDIwMDctMTAtMDggU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtYW55IGZpbGVzOiBDaGFuZ2VkIGluaXRpYWxpemF0aW9uOiBtYW55IGluaXQgZnVuY3Rpb25zIGFyZSBub3QgbmVlZGVkIGFueQorICAgIG1vcmUgc2luY2Ugd2Ugbm93IHJlbHkgb24gdGhlIGNvbXBpbGVyIGluaXRpYWxpemluZyBnbG9iYWwgYW5kIHN0YXRpYworICAgIHZhcmlhYmxlcyB0byB6ZXJvIQorCisgIDIwMDctMTAtMDYgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpcF9mcmFnLmMsIG1lbXAuYywgbWliMi5jLCBpcF9mcmFnLmgsIG1lbXBfc3RkLmgsIG9wdC5oOiBDaGFuZ2VkIElQX1JFQVNTRU1CTFkKKyAgICB0byBlbnF1ZXVlIHRoZSByZWNlaXZlZCBwYnVmcyBzbyB0aGF0IG11bHRpcGxlIHBhY2tldHMgY2FuIGJlIHJlYXNzZW1ibGVkCisgICAgc2ltdWx0YW5lb3VzbHkgYW5kIG5vIHN0YXRpYyByZWFzc2VtYmx5IGJ1ZmZlciBpcyBuZWVkZWQuCisKKyAgMjAwNy0xMC0wNSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcGlwLmMsIGV0aGFycC5oLCBldGhhcnAuYzogbW92ZWQgZXRoZXJuZXRfaW5wdXQgZnJvbSB0Y3BpcC5jIHRvIGV0aGFycC5jIHNvCisgICAgYWxsIG5ldGlmcyAob3IgcG9ydHMpIGNhbiB1c2UgaXQuCisKKyAgMjAwNy0xMC0wNSBGculk6XJpYyBCZXJub24KKyAgKiBuZXRpZmFwaS5oLCBuZXRpZmFwaS5jOiBhZGQgZnVuY3Rpb24gbmV0aWZhcGlfbmV0aWZfc2V0X2RlZmF1bHQuIENoYW5nZSB0aGUgCisgICAgY29tbW9uIGZ1bmN0aW9uIHRvIHJlZHVjZSBhIGxpdHRsZSBiaXQgdGhlIGZvb3RwcmludCAoZm9yIGFsbCBmdW5jdGlvbnMgdXNpbmcKKyAgICBvbmx5IHRoZSAibmV0aWYiIHBhcmFtZXRlcikuCisKKyAgMjAwNy0xMC0wMyBGculk6XJpYyBCZXJub24KKyAgKiBuZXRpZmFwaS5oLCBuZXRpZmFwaS5jOiBhZGQgZnVuY3Rpb25zIG5ldGlmYXBpX25ldGlmX3NldF91cCwgbmV0aWZhcGlfbmV0aWZfc2V0X2Rvd24sCisgICAgbmV0aWZhcGlfYXV0b2lwX3N0YXJ0IGFuZCBuZXRpZmFwaV9hdXRvaXBfc3RvcC4gVXNlIGEgY29tbW9uIGZ1bmN0aW9uIHRvIHJlZHVjZQorICAgIGEgbGl0dGxlIGJpdCB0aGUgZm9vdHByaW50IChmb3IgYWxsIGZ1bmN0aW9ucyB1c2luZyBvbmx5IHRoZSAibmV0aWYiIHBhcmFtZXRlcikuCisKKyAgMjAwNy0wOS0xNSBGculk6XJpYyBCZXJub24KKyAgKiB1ZHAuaCwgdWRwLmMsIHNvY2tldHMuYzogQ2hhbmdlcyBmb3IgIiMyMDUwMyBJR01QIEltcHJvdmVtZW50Ii4gQWRkIElQX01VTFRJQ0FTVF9JRgorICAgIG9wdGlvbiBpbiBzb2NrZXQgQVBJLCBhbmQgYSBuZXcgZmllbGQgIm11bHRpY2FzdF9pcCIgaW4gInN0cnVjdCB1ZHBfcGNiIiAoZm9yCisgICAgbmV0Y29ubiBhbmQgcmF3IEFQSSB1c2VycyksIG9ubHkgaWYgTFdJUF9JR01QPTEuIEFkZCBnZXRzb2Nrb3B0IHByb2Nlc3NpbmcgZm9yCisgICAgSVBfTVVMVElDQVNUX1RUTCBhbmQgSVBfTVVMVElDQVNUX0lGLgorCisgIDIwMDctMDktMTAgRnLpZOlyaWMgQmVybm9uCisgICogc25tcC5oLCBtaWIyLmM6IGVuYWJsZSB0byByZW1vdmUgU05NUCB0aW1lciAod2hpY2ggY29uc3VtbmUgc2V2ZXJhbCBjeWNsZXMKKyAgICBldmVuIHdoZW4gaXQncyBub3QgbmVjZXNzYXJ5KS4gc25tcF9hZ2VudC50eHQgdGVsbCB0byBjYWxsIHNubXBfaW5jX3N5c3VwdGltZSgpCisgICAgZWFjaCAxMG1zIChidXQsIGl0J3MgaW50cnVzaXZlIGlmIHlvdSB1c2Ugc3lzX3RpbWVvdXQgZmVhdHVyZSkuIE5vdywgeW91IGNhbgorICAgIGRlY2lkZSB0byBjYWxsIHNubXBfYWRkX3N5c3VwdGltZSgxMDApIGVhY2ggMTAwMG1zICh3aGljaCBpcyBiaWdnZXIgInN0ZXAiLCBidXQKKyAgICBjYWxsIHRvIGEgbG93ZXIgZnJlcXVlbmN5KS4gT3IsIHlvdSBjYW4gZGVjaWRlIHRvIG5vdCBjYWxsIHNubXBfaW5jX3N5c3VwdGltZSgpCisgICAgb3Igc25tcF9hZGRfc3lzdXB0aW1lKCksIGFuZCB0byBkZWZpbmUgdGhlIFNOTVBfR0VUX1NZU1VQVElNRShzeXN1cHRpbWUpIG1hY3JvLgorICAgIFRoaXMgb25lIGlzIHVuZGVmaW5lZCBieSBkZWZhdWx0IGluIG1pYjIuYy4gU05NUF9HRVRfU1lTVVBUSU1FIGlzIGNhbGxlZCBpbnNpZGUKKyAgICBzbm1wX2dldF9zeXN1cHRpbWUodTMyX3QgKnZhbHVlKSwgYW5kIGVuYWJsZSB0byBjaGFuZ2UgInN5c3VwdGltZSIgdmFsdWUgb25seQorICAgIHdoZW4gaXQncyBxdWVyaWVkIChhbnkgZGlyZWN0IGNhbGwgdG8gInN5c3VwdGltZSIgaXMgY2hhbmdlZCBieSBhIGNhbGwgdG8gCisgICAgc25tcF9nZXRfc3lzdXB0aW1lKS4KKworICAyMDA3LTA5LTA5IEZy6WTpcmljIEJlcm5vbiwgQmlsbCBGbG9yYWMKKyAgKiBpZ21wLmgsIGlnbXAuYywgbmV0aWYuaCwgbmV0aWYuYywgaXAuYzogVG8gZW5hYmxlIHRvIGhhdmUgaW50ZXJmYWNlcyB3aXRoIElHTVAsCisgICAgYW5kIG90aGVycyB3aXRob3V0IGl0LCB0aGVyZSBpcyBhIG5ldyBORVRJRl9GTEFHX0lHTVAgZmxhZyB0byBzZXQgaW4gbmV0aWYtPmZsYWdzCisgICAgaWYgeW91IHdhbnQgSUdNUCBvbiBhbiBpbnRlcmZhY2UuIGlnbXBfc3RvcCgpIGlzIG5vdyBjYWxsZWQgaW5zaWRlIG5ldGlmX3JlbW92ZSgpLgorICAgIGlnbXBfcmVwb3J0X2dyb3VwcygpIGlzIG5vdyBjYWxsZWQgaW5zaWRlIG5ldGlmX3NldF9saW5rX3VwKCkgKG5lZWQgdG8gaGF2ZQorICAgIExXSVBfTkVUSUZfTElOS19DQUxMQkFDSz0xKSB0byByZXNlbmQgcmVwb3J0cyBvbmNlIHRoZSBsaW5rIGlzIHVwIChhdm9pZCB0byB3YWl0CisgICAgdGhlIG5leHQgcXVlcnkgbWVzc2FnZSB0byByZWNlaXZlIHRoZSBtYXRjaGluZyBtdWx0aWNhc3Qgc3RyZWFtcykuCisKKyAgMjAwNy0wOS0wOCBGculk6XJpYyBCZXJub24KKyAgKiBzb2NrZXRzLmMsIGlwLmgsIGFwaS5oLCB0Y3AuaDogZGVjbGFyZSBhICJzdHJ1Y3QgaXBfcGNiIiB3aGljaCBvbmx5IGNvbnRhaW5zCisgICAgSVBfUENCLiBBZGQgaW4gdGhlIG5ldGNvbm4ncyAicGNiIiB1bmlvbiBhICJzdHJ1Y3QgaXBfcGNiICppcDsiIChubyBzaXplIGNoYW5nZSkuCisgICAgVXNlIHRoaXMgbmV3IGZpZWxkIHRvIGFjY2VzcyB0byBjb21tb24gcGNiIGZpZWxkcyAodHRsLCB0b3MsIHNvX29wdGlvbnMsIGV0Yy4uLikuCisgICAgRW5hYmxlIHRvIGFjY2VzcyB0byB0aGVzZSBmaWVsZHMgd2l0aCBMV0lQX1RDUD0wLgorCisgIDIwMDctMDktMDUgRnLpZOlyaWMgQmVybm9uCisgICogdWRwLmMsIGlwdjQvaWNtcC5jLCBpcHY0L2lwLmMsIGlwdjYvaWNtcC5jLCBpcHY2L2lwNi5jLCBpcHY0L2ljbXAuaCwKKyAgICBpcHY2L2ljbXAuaCwgb3B0Lmg6IEludGVncmF0ZSAidGFzayAjNzI3MiA6IExXSVBfSUNNUCBvcHRpb24iLiBUaGUgbmV3IG9wdGlvbgorICAgIExXSVBfSUNNUCBlbmFibGUvZGlzYWJsZSBJQ01QIG1vZHVsZSBpbnNpZGUgdGhlIElQIHN0YWNrIChlbmFibGUgcGVyIGRlZmF1bHQpLgorICAgIEJlIGNhcmVmdWwsIGRpc2FibGluZyBJQ01QIG1ha2UgeW91ciBwcm9kdWN0IG5vbi1jb21wbGlhbnQgdG8gUkZDMTEyMiwgYnV0CisgICAgaGVscCB0byByZWR1Y2UgZm9vdHByaW50LCBhbmQgdG8gcmVkdWNlICJ2aXNpYmlsaXR5IiBvbiB0aGUgSW50ZXJuZXQuCisKKyAgMjAwNy0wOS0wNSBGculk6XJpYyBCZXJub24sIEJpbGwgRmxvcmFjCisgICogb3B0LmgsIHN5cy5oLCB0Y3BpcC5jLCBzbGlwaWYuYywgcHBwLmMsIHN5c19hcmNoLnR4dDogQ2hhbmdlIHBhcmFtZXRlcnMgbGlzdAorICAgIGZvciBzeXNfdGhyZWFkX25ldyAoc2VlICJ0YXNrICM3MjUyIDogQ3JlYXRlIHN5c190aHJlYWRfbmV3X2V4KCkiKS4gVHdvIG5ldworICAgIHBhcmFtZXRlcnMgaGF2ZSB0byBiZSBwcm92aWRlZDogYSB0YXNrIG5hbWUsIGFuZCBhIHRhc2sgc3RhY2sgc2l6ZS4gRm9yIHRoaXMKKyAgICBvbmUsIHNpbmNlIGl0J3MgcGxhdGZvcm0gZGVwZW5kYW50LCB5b3UgY291bGQgZGVmaW5lIHRoZSBiZXN0IG9uZSBmb3IgeW91IGluCisgICAgeW91ciBsd2lwb3B0cy5oLiBGb3IgcG9ydCBtYWludGFpbmVycywgeW91IGNhbiBqdXN0IGFkZCB0aGVzZSBuZXcgcGFyYW1ldGVycworICAgIGluIHlvdXIgc3lzX2FyY2guYyBmaWxlLCBhbmQgYnV0IGl0J3Mgbm90IG1hbmRhdG9yeSwgdXNlIHRoZW0gaW4geW91ciBPUworICAgIHNwZWNpZmljIGZ1bmN0aW9ucy4KKworICAyMDA3LTA5LTA1IEZy6WTpcmljIEJlcm5vbgorICAqIGluZXQuYywgYXV0b2lwLmMsIG1zZ19pbi5jLCBtc2dfb3V0LmMsIGluaXQuYzogTW92ZSBzb21lIGJ1aWxkIHRpbWUgY2hlY2tpbmdzCisgICAgaW5zaWRlIGluaXQuYyBmb3IgdGFzayAjNzE0MiAiU2FuaXR5IGNoZWNrIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcyIuCisKKyAgMjAwNy0wOS0wNCBGculk6XJpYyBCZXJub24sIEJpbGwgRmxvcmFjCisgICogaWdtcC5oLCBpZ21wLmMsIG1lbXBfc3RkLmgsIG1lbXAuYywgaW5pdC5jLCBvcHQuaDogUmVwbGFjZSBtZW1fbWFsbG9jIGNhbGwgYnkKKyAgICBtZW1wX21hbGxvYywgYW5kIHVzZSBhIG5ldyBNRU1QX05VTV9JR01QX0dST1VQIG9wdGlvbiAoc2VlIG9wdC5oIHRvIGRlZmluZSB0aGUKKyAgICB2YWx1ZSkuIEl0IHdpbGwgYXZvaWQgcG90ZW50aWFsIGZyYWdtZW50YXRpb24gcHJvYmxlbXMsIHVzZSBhIGNvdW50ZXIgdG8ga25vdworICAgIGhvdyBtYW55IHRpbWVzIGEgZ3JvdXAgaXMgdXNlZCBvbiBhbiBuZXRpZiwgYW5kIGZyZWUgaXQgd2hlbiBhbGwgYXBwbGljYXRpb25zCisgICAgbGVhdmUgaXQuIE1FTVBfTlVNX0lHTVBfR1JPVVAgZ290IDggYXMgZGVmYXVsdCB2YWx1ZSAoYW5kIGluaXQuYyBnb3QgYSBzYW5pdHkKKyAgICBjaGVjayBpZiBMV0lQX0lHTVAhPTApLgorCisgIDIwMDctMDktMDMgRnLpZOlyaWMgQmVybm9uCisgICogaWdtcC5oLCBpZ21wLmMsIHNvY2tldHMuYywgYXBpX21zZy5jOiBDaGFuZ2VzIGZvciAiIzIwNTAzIElHTVAgSW1wcm92ZW1lbnQiLgorICAgIEluaXRpYWxpemUgaWdtcF9tYWNfZmlsdGVyIHRvIE5VTEwgaW4gbmV0aWZfYWRkICh0aGlzIGZpZWxkIHNob3VsZCBiZSBzZXQgaW4KKyAgICB0aGUgbmV0aWYncyAiaW5pdCIgZnVuY3Rpb24pLiBVc2UgdGhlICJpbXJfaW50ZXJmYWNlIiBmaWVsZCAoZm9yIHNvY2tldCBsYXllcikKKyAgICBhbmQvb3IgdGhlICJpbnRlcmZhY2UiIGZpZWxkIChmb3IgbmV0Y29ubiBsYXllciksIGZvciBqb2luL2xlYXZlIG9wZXJhdGlvbnMuCisgICAgVGhlIGlnbXBfam9pbi9sZWF2ZWdyb3VwIGZpcnN0IHBhcmFtZXRlciBjaGFuZ2UgZnJvbSBhIG5ldGlmIHRvIGFuIGlwYWRkci4KKyAgICBUaGlzIGZpZWxkIGNvdWxkIGJlIGEgbmV0aWYncyBpcGFkZHIsIG9yICJhbnkiIChzYW1lIG1lYW5pbmcgdGhhbiBpcF9hZGRyX2lzYW55KS4KKworICAyMDA3LTA4LTMwIEZy6WTpcmljIEJlcm5vbgorICAqIEFkZCBuZXRidWYuaCwgbmV0YnVmLmMsIENoYW5nZSBhcGkuaCwgYXBpX2xpYi5jOiAjNzI0OSAiU3BsaXQgbmV0YnVmIGZ1bmN0aW9ucworICAgIGZyb20gYXBpL2FwaV9saWIiLiBOb3cgbmV0YnVmIEFQSSBpcyBpbmRlcGVuZGFudCBvZiBuZXRjb25uLCBhbmQgY2FuIGJlIHVzZWQKKyAgICB3aXRoIG90aGVyIEFQSSAoYXBwbGljYXRpb24gYmFzZWQgb24gcmF3IEFQSSwgb3IgZnV0dXJlICJzb2NrZXQyIiBBUEkpLiBQb3J0cworICAgIG1haW50YWluZXJzIGp1c3QgaGF2ZSB0byBhZGQgc3JjL2FwaS9uZXRidWYuYyBpbiB0aGVpciBtYWtlZmlsZS9wcm9qZWN0cy4KKworICAyMDA3LTA4LTMwIEZy6WTpcmljIEJlcm5vbiwgSm9uYXRoYW4gTGFybW91cgorICAqIGluaXQuYzogQWRkIGZpcnN0IHZlcnNpb24gb2YgbHdpcF9zYW5pdHlfY2hlY2sgZm9yIHRhc2sgIzcxNDIgIlNhbml0eSBjaGVjaworICAgIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcyIuCisKKyAgMjAwNy0wOC0yOSBGculk6XJpYyBCZXJub24KKyAgKiBpZ21wLmgsIGlnbXAuYywgdGNwaXAuYywgaW5pdC5jLCBuZXRpZi5jOiBjaGFuZ2UgaWdtcF9pbml0IGFuZCBhZGQgaWdtcF9zdGFydC4KKyAgICBpZ21wX3N0YXJ0IGlzIGNhbGwgaW5zaWRlIG5ldGlmX2FkZC4gTm93LCBpZ21wIGluaXRpYWxpemF0aW9uIGlzIGluIHRoZSBzYW1lCisgICAgc3Bpcml0IHRoYW4gdGhlIG90aGVycyBtb2R1bGVzLiBNb2RpZnkgc29tZSBJR01QIGRlYnVnIHRyYWNlcy4KKworICAyMDA3LTA4LTI5IEZy6WTpcmljIEJlcm5vbgorICAqIEFkZCBpbml0LmgsIGluaXQuYywgQ2hhbmdlIG9wdC5oLCB0Y3BpcC5jOiBUYXNrICAjNzIxMyAiQWRkIGEgbHdpcF9pbml0IGZ1bmN0aW9uIgorICAgIEFkZCBsd2lwX2luaXQgZnVuY3Rpb24gdG8gcmVncm91cCBhbGwgbW9kdWxlcyBpbml0aWFsaXphdGlvbnMsIGFuZCB0byBwcm92aWRlCisgICAgYSBwbGFjZSB0byBhZGQgY29kZSBmb3IgdGFzayAjNzE0MiAiU2FuaXR5IGNoZWNrIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcyIuCisgICAgUG9ydHMgbWFpbnRhaW5lcnMgc2hvdWxkIHJlbW92ZSBkaXJlY3QgaW5pdGlhbGl6YXRpb25zIGNhbGxzIGZyb20gdGhlaXIgY29kZSwKKyAgICBhbmQgYWRkIGluaXQuYyBpbiB0aGVpciBtYWtlZmlsZXMuIE5vdGUgdGhhdCBsd2lwX2luaXQoKSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAgICBpbnNpZGUgdGNwaXBfaW5pdCwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgcmF3IGFwaSB1c2VycyBzaW5jZSBhbGwgY2FsbHMgYXJlCisgICAgZGlzYWJsZWQgd2hlbiBtYXRjaGluZyBvcHRpb25zIGFyZSBkaXNhYmxlZC4gQWxzbyBub3RlIHRoYXQgdGhlaXIgaXMgbmV3IG9wdGlvbnMKKyAgICBpbiBvcHQuaCwgeW91IHNob3VsZCBjb25maWd1cmUgaW4geW91ciBsd2lwb3B0cy5oICh0aGV5IGFyZSBlbmFibGVkIHBlciBkZWZhdWx0KS4KKworICAyMDA3LTA4LTI2IE1hcmMgQm91Y2hlcgorICAqIGFwaV9tc2cuYzogZG9fY2xvc2VfaW50ZXJuYWwoKTogUmVzZXQgdGhlIGNhbGxiYWNrcyBhbmQgYXJnIChjb25uKSB0byBOVUxMCisgICAgc2luY2UgdGhleSBjYW4gdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzIGJlIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgY29ubgorICAgIHBvaW50ZXIgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIChhbmQgY29ubiBoYXMgYmVlbiBmcmVlZCkuIAorCisgIDIwMDctMDgtMjUgRnLpZOlyaWMgQmVybm9uIChBcnRlbSBNaWdhZXYncyBQYXRjaCkKKyAgKiBuZXRpZi5oLCBuZXRpZi5jOiBJbnRlZ3JhdGUgInBhdGNoICM2MTYzIDogRnVuY3Rpb24gdG8gY2hlY2sgaWYgbGluayBsYXllciBpcyB1cCIuCisgICAgQWRkIGEgbmV0aWZfaXNfbGlua191cCgpIGZ1bmN0aW9uIGlmIExXSVBfTkVUSUZfTElOS19DQUxMQkFDSyBvcHRpb24gaXMgc2V0LgorCisgIDIwMDctMDgtMjIgRnLpZOlyaWMgQmVybm9uCisgICogbmV0aWYuaCwgbmV0aWYuYywgb3B0Lmg6IFJlbmFtZSBMV0lQX05FVElGX0NBTExCQUNLIGluIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLCisgICAgdG8gYmUgY29oZXJlbnQgd2l0aCBuZXcgTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLIG9wdGlvbiBiZWZvcmUgbmV4dCByZWxlYXNlLgorCisgIDIwMDctMDgtMjIgRnLpZOlyaWMgQmVybm9uCisgICogdGNwaXAuaCwgdGNwaXAuYywgZXRoZXJuZXRpZi5jLCBvcHQuaDogcmVtb3ZlIG9wdGlvbnMgRVRIQVJQX1RDUElQX0lOUFVUICYKKyAgICBFVEhBUlBfVENQSVBfRVRISU5QVVQsIG5vdywgb25seSAiZXRoaW5wdXQiIGNvZGUgaXMgc3VwcG9ydGVkLCBldmVuIGlmIHRoZSAKKyAgICBuYW1lIGlzIHRjcGlwX2lucHV0ICh3ZSBrZWVwIHRoZSBuYW1lIG9mIDEuMi4wIGZ1bmN0aW9uKS4KKworICAyMDA3LTA4LTE3IEphcmVkIEdydWJiCisgICogbWVtcF9zdGQuaCwgbWVtcC5oLCBtZW1wLmMsIG1lbS5jLCBzdGF0cy5jOiAoVGFzayAjNzEzNikgQ2VudHJhbGl6ZSBtZW1wb29sIAorICAgIHNldHRpbmdzIGludG8gbmV3IG1lbXBfc3RkLmggYW5kIG9wdGlvbmFsIHVzZXIgZmlsZSBsd2lwcG9vbHMuaC4gVGhpcyBhZGRzCisgICAgbW9yZSBkeW5hbWljIG1lbXBvb2xzLCBhbmQgYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mCisgICAgbWVtcG9vbHMgZm9yIG1lbV9tYWxsb2MuCisKKyAgMjAwNy0wOC0xNiBNYXJjIEJvdWNoZXIKKyAgKiBhcGlfbXNnLmM6IEluaXRpYWxpemUgbmV3Y29ubi0+c3RhdGUgdG8gTkVUQ09OTl9OT05FIGluIGFjY2VwdF9mdW5jdGlvbjsKKyAgICBvdGhlcndpc2UgaXQgd2FzIGxlZnQgdG8gTkVUQ09OTl9DTE9TRSBhbmQgc2VudF90Y3AoKSBjb3VsZCBwcmVtYXR1cmVseQorICAgIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorCisgIDIwMDctMDgtMTYgTWFyYyBCb3VjaGVyCisgICogc29ja2V0cy5jOiBsd2lwX2FjY2VwdCgpOiBjaGVjayBuZXRjb25uX3BlZXIoKSBlcnJvciByZXR1cm4uCisKKyAgMjAwNy0wOC0xNiBNYXJjIEJvdWNoZXIKKyAgKiBtZW0uYywgbWVtLmg6IEFkZGVkIG1lbV9jYWxsb2MoKS4KKworICAyMDA3LTA4LTE2IE1hcmMgQm91Y2hlcgorICAqIHRjcGlwLmMsIHRjcGlwLmggbWVtcC5jLCBtZW1wLmg6IEFkZGVkIGRpc3RpbmN0IG1lbXAgKE1FTVBfVENQSVBfTVNHX0lOUEtUKQorICAgIGZvciBpbnB1dCBwYWNrZXRzIHRvIHByZXZlbnQgZmxvb2RzIGZyb20gY29uc3VtaW5nIGFsbCBvZiBNRU1QX1RDUElQX01TRworICAgIGFuZCBzdGFydmluZyBvdGhlciBtZXNzYWdlIHR5cGVzLgorICAgIFJlbmFtZWQgTUVNUF9UQ1BJUF9NU0cgdG8gTUVNUF9UQ1BJUF9NU0dfQVBJCisKKyAgMjAwNy0wOC0xNiBNYXJjIEJvdWNoZXIKKyAgKiBwYnVmLmMsIHBidWYuaCwgZXRoYXJwLmMsIHRjcF9pbi5jLCBzb2NrZXRzLmM6IFNwbGl0IHBidWYgZmxhZ3MgaW4gcGJ1ZgorICAgIHR5cGUgYW5kIGZsZ3MgKGxhdGVyIHJlbmFtZWQgdG8gZmxhZ3MpLgorICAgIFVzZSBlbnVtIHBidWZfZmxhZyBhcyBwYnVmX3R5cGUuICBSZW51bWJlciBQQlVGX0ZMQUdfKi4KKyAgICBJbXByb3ZlZCBsd2lwX3JlY3Zmcm9tKCkuICBUQ1AgcHVzaCBub3cgcHJvcGFnYXRlZC4KKworICAyMDA3LTA4LTE2IE1hcmMgQm91Y2hlcgorICAqIGV0aGVybmV0aWYuYywgY29udHJpYi9wb3J0cy92YXJpb3VzOiBldGhicm9hZGNhc3Qgbm93IGEgc2hhcmVkIGdsb2JhbAorICAgIHByb3ZpZGVkIGJ5IGV0aGFycC4KKworICAyMDA3LTA4LTE2IE1hcmMgQm91Y2hlcgorICAqIHBwcF9vZS5jIHBwcF9vZS5oLCBhdXRoLmMgY2hhcC5jIGZzbS5jIGxjcC5jIHBwcC5jIHBwcC5oLAorICAgIGV0aGFycC5jIGV0aGVybmV0aWYuYywgZXRoYXJwLmgsIG9wdC5oIHRjcGlwLmgsIHRjcGlwLmM6CisgICAgQWRkZWQgUFBQb0Ugc3VwcG9ydCBhbmQgdmFyaW91cyBQUFAgaW1wcm92ZW1lbnRzLgorCisgIDIwMDctMDctMjUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGlfbGliLmMsIGlwX2ZyYWcuYywgcGJ1Zi5jLCBhcGkuaCwgcGJ1Zi5oOiBJbnRyb2R1Y2VkIHBidWZfY29weV9wYXJ0aWFsLAorICAgIG1ha2luZyBuZXRidWZfY29weV9wYXJ0aWFsIHVzZSB0aGlzIGZ1bmN0aW9uLgorCisgIDIwMDctMDctMjUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3BfaW4uYzogRml4IGJ1ZyAjMjA1MDY6IFNsb3cgc3RhcnQgLyBpbml0aWFsIGNvbmdlc3Rpb24gd2luZG93IHN0YXJ0cyB3aXRoCisgICAgMiAqIG1zcyAoaW5zdGVhZCBvZiAxICogbXNzIHByZXZpb3VzbHkpIHRvIGNvbXBseSB3aXRoIHNvbWUgbmV3ZXIgUkZDcyBhbmQKKyAgICBvdGhlciBzdGFja3MuCisKKyAgMjAwNy0wNy0xMyBKYXJlZCBHcnViYiAoaW50ZWdyYXRlZCBieSBGculk6XJpYyBCZXJub24pCisgICogb3B0LmgsIG5ldGlmLmgsIG5ldGlmLmMsIGV0aGVybmV0aWYuYzogQWRkIG5ldyBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBhZGQKKyAgICBhIGxpbmsgY2FsbGJhY2sgaW4gdGhlIG5ldGlmIHN0cnVjdCwgYW5kIGZ1bmN0aW9ucyB0byBoYW5kbGUgaXQuIEJlIGNhcmVmdWxsCisgICAgZm9yIHBvcnQgbWFpbnRhaW5lcnMgdG8gYWRkIHRoZSBORVRJRl9GTEFHX0xJTktfVVAgZmxhZyAobGlrZSBpbiBldGhlcm5ldGlmLmMpCisgICAgaWYgeW91IHdhbnQgdG8gYmUgc3VyZSB0byBiZSBjb21wYXRpYmxlIHdpdGggZnV0dXJlIGNoYW5nZXMuLi4KKworICAyMDA3LTA2LTMwIEZy6WTpcmljIEJlcm5vbgorICAqIHNvY2tldHMuaCwgc29ja2V0cy5jOiBJbXBsZW1lbnQgTVNHX1BFRUsgZmxhZyBmb3IgcmVjdi9yZWN2ZnJvbSBmdW5jdGlvbnMuCisKKyAgMjAwNy0wNi0yMSBTaW1vbiBHb2xkc2NobWlkdAorICAqIGV0aGFycC5oLCBldGhhcnAuYzogQ29tYmluZWQgZXRoYXJwX3JlcXVlc3Qgd2l0aCBldGhhcnBfcmF3IGZvciBib3RoCisgICAgTFdJUF9BVVRPSVAgPTAgYW5kID0xIHRvIHJlbW92ZSByZWR1bmRhbnQgY29kZS4KKworICAyMDA3LTA2LTIxIFNpbW9uIEdvbGRzY2htaWR0CisgICogbWVtLmMsIG1lbXAuYywgbWVtLmgsIG1lbXAuaCwgb3B0Lmg6IHRhc2sgIzY4NjM6IEludHJvZHVjZWQgdGhlIG9wdGlvbgorICAgIE1FTV9VU0VfUE9PTFMgdG8gdXNlIDQgcG9vbHMgd2l0aCBkaWZmZXJlbnQgc2l6ZWQgZWxlbWVudHMgaW5zdGVhZCBvZiBhCisgICAgaGVhcC4gVGhpcyBib3RoIHByZXZlbnRzIG1lbW9yeSBmcmFnbWVudGF0aW9uIGFuZCBnaXZlcyBhIGhpZ2hlciBzcGVlZAorICAgIGF0IHRoZSBjb3N0IG9mIG1vcmUgbWVtb3J5IGNvbnN1bXB0aW9uLiBUdXJuZWQgb2ZmIGJ5IGRlZmF1bHQuCisKKyAgMjAwNy0wNi0yMSBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9saWIuYywgYXBpX21zZy5jLCBhcGkuaCwgYXBpX21zZy5oOiBDb252ZXJ0ZWQgdGhlIGxlbmd0aCBhcmd1bWVudCBvZgorICAgIG5ldGNvbm5fd3JpdGUgKGFuZCB0aGVyZWZvcmUgYWxzbyBhcGlfbXNnX21zZy5tc2cudy5sZW4pIGZyb20gdTE2X3QgaW50bworICAgIGludCB0byBiZSBhYmxlIHRvIHNlbmQgYSBiaWdnZXIgYnVmZmVyIHRoYW4gNjRLIHdpdGggb25lIHRpbWUgKG1haW5seQorICAgIHVzZWQgZnJvbSBsd2lwX3NlbmQpLgorCisgIDIwMDctMDYtMjEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3AuaCwgYXBpX21zZy5jOiBNb3ZlZCB0aGUgbmFnbGUgYWxnb3JpdGhtIGZyb20gbmV0Y29ubl93cml0ZS9kb193cml0ZQorICAgIGludG8gYSBkZWZpbmUgKHRjcF9vdXRwdXRfbmFnbGUpIGluIHRjcC5oIHRvIHByb3ZpZGUgaXQgdG8gcmF3IGFwaSB1c2VycywgdG9vLgorCisgIDIwMDctMDYtMjEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmM6IEZpeGVkIGJ1ZyAjMjAwMjE6IE1vdmVkIHNlbmRidWYtcHJvY2Vzc2luZyBpbgorICAgIG5ldGNvbm5fd3JpdGUgZnJvbSBhcGlfbGliLmMgdG8gYXBpX21zZy5jIHRvIGFsc28gcHJldmVudCBtdWx0aXBsZSBjb250ZXh0LQorICAgIGNoYW5nZXMgb24gbG93IG1lbW9yeSBvciBlbXB0eSBzZW5kLWJ1ZmZlci4KKworICAyMDA3LTA2LTE4IFNpbW9uIEdvbGRzY2htaWR0CisgICogZXRoYXJwLmMsIGV0aGFycC5oOiBDaGFuZ2VkIGV0aGFycCB0byB1c2UgYSBkZWZpbmVkIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoCisgICAgb2YgNiB0byBhdm9pZCBsb2FkaW5nIG5ldGlmLT5od2FkZHJfbGVuIGV2ZXJ5IHRpbWUgKHNpbmNlIHRoaXMgZmlsZSBpcyBvbmx5CisgICAgdXNlZCBmb3IgZXRoZXJuZXQgYW5kIHN0cnVjdCBldGhfYWRkciBhbHJlYWR5IGhhZCBhIGRlZmluZWQgbGVuZ3RoIG9mIDYpLgorCisgIDIwMDctMDYtMTcgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmMsIHNvY2tldHMuaDogSW1wbGVtZW50ZWQgc29ja2V0IG9wdGlvbnMgU09fTk9fQ0hFQ0sgZm9yIFVEUCBzb2NrZXRzCisgICAgdG8gZGlzYWJsZSBVRFAgY2hlY2tzdW0gZ2VuZXJhdGlvbiBvbiB0cmFuc21pdC4KKworICAyMDA3LTA2LTEzIEZy6WTpcmljIEJlcm5vbiwgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBkZWJ1Zy5oLCBhcGlfbXNnLmM6IGNoYW5nZSBMV0lQX0VSUk9SIHRvIHVzZSBpdCB0byBjaGVjayBlcnJvcnMgbGlrZSBpbnZhbGlkCisgICAgcG9pbnRlcnMgb3IgcGFyYW1ldGVycywgYW5kIGxldCB0aGUgcG9zc2liaWxpdHkgdG8gcmVkZWZpbmVkIGl0IGluIGNjLmguIFVzZQorICAgIHRoaXMgbWFjcm8gdG8gY2hlY2sgImNvbm4iIHBhcmFtZXRlciBpbiBhcGlfbXNnLmMgZnVuY3Rpb25zLgorCisgIDIwMDctMDYtMTEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmMsIHNvY2tldHMuaDogQWRkZWQgVURQIGxpdGUgc3VwcG9ydCBmb3Igc29ja2V0cworCisgIDIwMDctMDYtMTAgU2ltb24gR29sZHNjaG1pZHQKKyAgKiB1ZHAuaCwgb3B0LmgsIGFwaV9tc2cuYywgaXAuYywgdWRwLmM6IEluY2x1ZGVkIHN3aXRjaCBMV0lQX1VEUExJVEUgKGVuYWJsZWQKKyAgICBieSBkZWZhdWx0KSB0byBzd2l0Y2ggb2ZmIFVEUC1MaXRlIHN1cHBvcnQgaWYgbm90IG5lZWRlZCAocmVkdWNlcyB1ZHAuYyBjb2RlCisgICAgc2l6ZSkKKworICAyMDA3LTA2LTA5IERvbWluaWsgU3BpZXMgKGludGVncmF0ZWQgYnkgRnLpZOlyaWMgQmVybm9uKQorICAqIGF1dG9pcC5oLCBhdXRvaXAuYywgZGhjcC5oLCBkaGNwLmMsIG5ldGlmLmgsIG5ldGlmLmMsIGV0aGFycC5oLCBldGhhcnAuYywgb3B0Lmg6CisgICAgQXV0b0lQIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSBmb3IgSVB2NCwgd2l0aCBuZXcgb3B0aW9ucyBMV0lQX0FVVE9JUCBhbmQKKyAgICBMV0lQX0RIQ1BfQVVUT0lQX0NPT1AgaWYgeW91IHdhbnQgdG8gY29vcGVyYXRlIHdpdGggREhDUC4gU29tZSB0aXBzIHRvIGFkYXB0CisgICAgKHNlZSBUT0RPIG1hcmsgaW4gdGhlIHNvdXJjZSBjb2RlKS4KKworICAyMDA3LTA2LTA5IFNpbW9uIEdvbGRzY2htaWR0CisgICogZXRoYXJwLmgsIGV0aGFycC5jLCBldGhlcm5ldGlmLmM6IE1vZGlmaWVkIG9yZGVyIG9mIHBhcmFtZXRlcnMgZm9yCisgICAgZXRoYXJwX291dHB1dCgpIHRvIG1hdGNoIG5ldGlmLT5vdXRwdXQgc28gZXRoYXJwX291dHB1dCgpIGNhbiBiZSB1c2VkCisgICAgZGlyZWN0bHkgYXMgbmV0aWYtPm91dHB1dCB0byBzYXZlIG9uZSBmdW5jdGlvbiBjYWxsLgorCisgIDIwMDctMDYtMDggU2ltb24gR29sZHNjaG1pZHQKKyAgKiBuZXRpZi5oLCBldGhlcm5ldGlmLmMsIHNsaXBpZi5jLCBsb29waWYuYzogQWRkZWQgZGVmaW5lCisgICAgTkVUSUZfSU5JVF9TTk1QKG5ldGlmLCB0eXBlLCBzcGVlZCkgdG8gaW5pdGlhbGl6ZSBwZXItbmV0aWYgc25tcCB2YXJpYWJsZXMsCisgICAgYWRkZWQgaW5pdGlhbGl6YXRpb24gb2YgdGhvc2UgdG8gZXRoZXJuZXRpZiwgc2xpcGlmIGFuZCBsb29waWYuCisKKyAgMjAwNy0wNS0xOCBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oLCBpcF9mcmFnLmMsIGlwX2ZyYWcuaCwgaXAuYzogQWRkZWQgb3B0aW9uIElQX0ZSQUdfVVNFU19TVEFUSUNfQlVGCisgICAgKGRlZmF1bHRpbmcgdG8gb2ZmIGZvciBub3cpIHRoYXQgY2FuIGJlIHNldCB0byAwIHRvIHNlbmQgZnJhZ21lbnRlZAorICAgIHBhY2tldHMgYnkgcGFzc2luZyBQQlVGX1JFRnMgZG93biB0aGUgc3RhY2suCisKKyAgMjAwNy0wNS0yMyBGculk6XJpYyBCZXJub24KKyAgKiBhcGlfbGliLmM6IEltcGxlbWVudCBTT19SQ1ZUSU1FTyBmb3IgYWNjZXB0IGFuZCByZWN2IG9uIFRDUAorICAgIGNvbm5lY3Rpb25zLCBzdWNoIHByZXNlbnQgaW4gcGF0Y2ggIzU5NTkuCisKKyAgMjAwNy0wNS0yMyBGculk6XJpYyBCZXJub24KKyAgKiBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmMsIHNvY2tldHMuYzogZ3JvdXAgdGhlIGRpZmZlcmVudCBORVRDT05OX1VEUHh4eAorICAgIGNvZGUgaW4gb25seSBvbmUgcGFydC4uLgorCisgIDIwMDctMDUtMTggU2ltb24gR29sZHNjaG1pZHQKKyAgKiBvcHQuaCwgbWVtcC5oLCBtZW1wLmM6IEFkZGVkIG9wdGlvbiBNRU1QX09WRVJGTE9XX0NIRUNLIHRvIGNoZWNrIGZvciBtZW1wCisgICAgZWxlbWVudHMgdG8gb3ZlcmZsb3cuIFRoaXMgaXMgYWNoaWV2ZWQgYnkgYWRkaW5nIHNvbWUgYnl0ZXMgYmVmb3JlIGFuZCBhZnRlcgorICAgIGVhY2ggcG9vbCBlbGVtZW50IChpbmNyZWFzaW5nIHRoZWlyIHNpemUsIG9mIGNvdXJzZSksIGZpbGxpbmcgdGhlbSB3aXRoIGEKKyAgICBwcm9taW5lbnQgdmFsdWUgYW5kIGNoZWNraW5nIHRoZW0gb24gZnJlZWluZyB0aGUgZWxlbWVudC4KKyAgICBTZXQgaXQgdG8gMiB0byBhbHNvIGNoZWNrIGV2ZXJ5IGVsZW1lbnQgaW4gZXZlcnkgcG9vbCBlYWNoIHRpbWUgbWVtcF9tYWxsb2MoKQorICAgIG9yIG1lbXBfZnJlZSgpIGlzIGNhbGxlZCAoc2xvd2VyIGJ1dCBtb3JlIGhlbHBmdWwpLgorCisgIDIwMDctMDUtMTAgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBvcHQuaCwgbWVtcC5oLCBtZW1wLmMsIHBidWYuYyAoc2VlIHRhc2sgIzY4MzEpOiB1c2UgYSBuZXcgbWVtcCBwb29sIGZvcgorICAgIFBCVUZfUE9PTCBwYnVmcyBpbnN0ZWFkIG9mIHRoZSBvbGQgcG9vbCBpbXBsZW1lbnRhdGlvbiBpbiBwYnVmLmMgdG8gcmVkdWNlCisgICAgY29kZSBzaXplLgorCisgIDIwMDctMDUtMTEgRnLpZOlyaWMgQmVybm9uCisgICogc29ja2V0cy5jLCBhcGlfbGliLmMsIGFwaV9tc2cuaCwgYXBpX21zZy5jLCBuZXRpZmFwaS5oLCBuZXRpZmFwaS5jLCB0Y3BpcC5jOgorICAgIEluY2x1ZGUgYSBmdW5jdGlvbiBwb2ludGVyIGluc3RlYWQgb2YgYSB0YWJsZSBpbmRleCBpbiB0aGUgbWVzc2FnZSB0byByZWR1Y2UKKyAgICBmb290cHJpbnQuIERpc2FibGUgc29tZSBwYXJ0IG9mIGx3aXBfc2VuZCBhbmQgbHdpcF9zZW5kdG8gaWYgc29tZSBvcHRpb25zIGFyZQorICAgIG5vdCBzZXQgKExXSVBfVENQLCBMV0lQX1VEUCwgTFdJUF9SQVcpLgorCisgIDIwMDctMDUtMTAgU2ltb24gR29sZHNjaG1pZHQKKyAgKiAqLmggKGV4Y2VwdCBuZXRpZi9wcHAvKi5oKTogSW5jbHVkZWQgcGF0Y2ggIzU0NDg6IGluY2x1ZGUgJyNpZmRlZiBfX2NwbHVzcGx1cworICAgIFwgZXh0ZXJuICJDIiB7JyBpbiBhbGwgaGVhZGVyIGZpbGVzLiBOb3cgeW91IGNhbiB3cml0ZSB5b3VyIGFwcGxpY2F0aW9uIHVzaW5nCisgICAgdGhlIGx3SVAgc3RhY2sgaW4gQysrIGFuZCBzaW1wbHkgI2luY2x1ZGUgdGhlIGNvcmUgZmlsZXMuIE5vdGUgSSBoYXZlIGxlZnQKKyAgICBvdXQgdGhlIG5ldGlmL3BwcC8qaCBoZWFkZXIgZmlsZXMgZm9yIG5vdywgc2luY2UgSSBkb24ndCBrbm93IHdoaWNoIGZpbGVzIGFyZQorICAgIGluY2x1ZGVkIGJ5IGFwcGxpY2F0aW9ucyBhbmQgd2hpY2ggYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KKworICAyMDA3LTA1LTA5IFNpbW9uIEdvbGRzY2htaWR0CisgICogb3B0LmgsICouYy8qLmg6IEluY2x1ZGVkIHBhdGNoICM1OTIwOiBDcmVhdGUgZGVmaW5lIHRvIG92ZXJyaWRlIEMtbGlicmFyeQorICAgIG1lbWNweS4gMiBEZWZpbmVzIGFyZSBjcmVhdGVkOiBNRU1DUFkoKSBmb3Igbm9ybWFsIG1lbWNweSwgU01FTUNQWSgpIGZvcgorICAgIHNpdHVhdGlvbnMgd2hlcmUgc29tZSBjb21waWxlcnMgbWlnaHQgaW5saW5lIHRoZSBjb3B5IGFuZCBzYXZlIGEgZnVuY3Rpb24KKyAgICBjYWxsLiBBbHNvIHJlcGxhY2VkIGFsbCBjYWxscyB0byBtZW1jcHkoKSB3aXRoIGNhbGxzIHRvIChTKU1FTUNQWSgpLgorCisgIDIwMDctMDUtMDggU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtZW0uaDogSWYgTUVNX0xJQkNfTUFMTE9DPT0xLCBhbGxvdyB0aGUgZGVmaW5lcyAoZS5nLiBtZW1fbWFsbG9jKCkgLT4gbWFsbG9jKCkpCisgICAgdG8gYmUgb3ZlcnJpZGVuIGluIGNhc2UgdGhlIEMtbGlicmFyeSBtYWxsb2MgaW1wbGVtZW50YXRpb24gaXMgbm90IHByb3RlY3RlZAorICAgIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MuCisKKyAgMjAwNy0wNS0wNCBTaW1vbiBHb2xkc2NobWlkdCAoQXR0ZSBLb2pvKQorICAqIGV0aGFycC5jOiBJbnRyb2R1Y2VkIGZhc3Qgb25lLWVudHJ5LWNhY2hlIHRvIHNwZWVkIHVwIEFSUCBsb29rdXAgd2hlbiBzZW5kaW5nCisgICAgbXVsdGlwbGUgcGFja2V0cyB0byB0aGUgc2FtZSBob3N0LgorCisgIDIwMDctMDUtMDQgRnLpZOlyaWMgQmVybm9uLCBKb25hdGhhbiBMYXJtb3VyCisgICogc29ja2V0cy5jLCBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmgsIGFwaV9tc2cuYzogRml4IGJ1ZyAjMTkxNjIgImx3aXBfc2VudG86IGEgcG9zc2libGUKKyAgICB0byBjb3JydXB0IHJlbW90ZSBhZGRyL3BvcnQgY29ubmVjdGlvbiBzdGF0ZSIuIFJlZHVjZSBwcm9ibGVtcyAibm90IGVub3VnaHQgbWVtb3J5IiB3aXRoCisgICAgbmV0YnVmIChpZiB3ZSByZWNlaXZlIGxvdCBvZiBkYXRhZ3JhbXMpLiBJbXByb3ZlIGx3aXBfc2VuZHRvIChvbmx5IG9uZSBleGNoYW5nZSBiZXR3ZWVuCisgICAgc29ja2V0cyBhcGkgYW5kIGFwaV9tc2cgd2hpY2ggcnVuIGluIHRjcGlwX3RocmVhZCBjb250ZXh0KS4gQWRkIG5ldGNvbm5fc2VudG8gZnVuY3Rpb24uCisgICAgV2FybmluZywgaWYgeW91IGRpcmVjdGx5IGFjY2VzcyB0byAiZnJvbWFkZHIiICYgImZyb21wb3J0IiBmaWVsZCBmcm9tIG5ldGJ1ZiBzdHJ1Y3QsCisgICAgdGhlc2UgZmllbGRzIGFyZSBub3cgcmVuYW1lZCAiYWRkciIgJiAicG9ydCIuCisKKyAgMjAwNy0wNC0xMSBKb25hdGhhbiBMYXJtb3VyCisgICogc3lzLmgsIGFwaV9saWIuYzogUHJvdmlkZSBuZXcgc3lzX21ib3hfdHJ5ZmV0Y2ggZnVuY3Rpb24uIFJlcXVpcmUgcG9ydHMgdG8gcHJvdmlkZSBuZXcKKyAgICBzeXNfYXJjaF9tYm94X3RyeWZldGNoIGZ1bmN0aW9uIHRvIGdldCBhIG1lc3NhZ2UgaWYgb25lIGlzIHRoZXJlLCBvdGhlcndpc2UgcmV0dXJuCisgICAgd2l0aCBTWVNfTUJPWF9FTVBUWS4gc3lzX2FyY2hfbWJveF90cnlmZXRjaCBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYSBmdW5jdGlvbi1saWtlIG1hY3JvCisgICAgYnkgdGhlIHBvcnQgaW4gc3lzX2FyY2guaCBpZiBkZXNpcmVkLgorCisgIDIwMDctMDQtMDYgRnLpZOlyaWMgQmVybm9uLCBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oLCB0Y3BpcC5oLCB0Y3BpcC5jLCBuZXRpZmFwaS5oLCBuZXRpZmFwaS5jOiBOZXcgY29uZmlndXJhdGlvbiBvcHRpb24gTFdJUF9ORVRJRl9BUEkKKyAgICBhbGxvdyB0byB1c2UgdGhyZWFkLXNhZmUgZnVuY3Rpb25zIHRvIGFkZC9yZW1vdmUgbmV0aWYgaW4gbGlzdCwgYW5kIHRvIHN0YXJ0L3N0b3AgZGhjcAorICAgIGNsaWVudHMsIHVzaW5nIG5ldyBmdW5jdGlvbnMgZnJvbSBuZXRpZmFwaS5oLiBEaXNhYmxlIGFzIGRlZmF1bHQgKG5vIHBvcnQgY2hhbmdlIHRvIGRvKS4KKworICAyMDA3LTA0LTA1IEZy6WTpcmljIEJlcm5vbgorICAqIHNvY2tldHMuYzogcmVtcGxhY2UgRU5PQlVGUyBlcnJvcnMgb24gYWxsb2Nfc29ja2V0IGJ5IEVORklMRSB0byBiZSBtb3JlIEJTRCBjb21wbGlhbnQuCisKKyAgMjAwNy0wNC0wNCBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFyY2guaCwgYXBpX21zZy5jLCBkaGNwLmMsIG1zZ19pbi5jLCBzb2NrZXRzLmM6IEludHJvZHVjZWQgI2RlZmluZSBMV0lQX1VOVVNFRF9BUkcoeCkKKyAgICB1c2UgdGhpcyBmb3IgYW5kIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmb3JtIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHlvdSBpbnRlbnRpb25hbGx5CisgICAgYXJlIG5vdCB1c2luZyB0aGlzIHZhcmlhYmxlLiBDYW4gYmUgb3ZlcnJpZGVuIGluIGNjLmguCisKKyAgMjAwNy0wMy0yOCBGculk6XJpYyBCZXJub24KKyAgKiBvcHQuaCwgbmV0aWYuaCwgZGhjcC5oLCBkaGNwLmM6IE5ldyBjb25maWd1cmF0aW9uIG9wdGlvbiBMV0lQX05FVElGX0hPU1ROQU1FIGFsbG93IHRvCisgICAgZGVmaW5lIGEgaG9zdG5hbWUgaW4gbmV0aWYgc3RydWN0ICh0aGlzIGlzIGp1c3QgYSBwb2ludGVyLCBzbywgeW91IGNhbiB1c2UgYSBoYXJkY29kZWQKKyAgICBzdHJpbmcsIHBvaW50IG9uIG9uZSBvZiB5b3VyJ3MgZXRoZXJuZXRpZiBmaWVsZCwgb3IgYWxsb2MgYSBzdHJpbmcgeW91IHdpbGwgZnJlZSB5b3Vyc2VsZikuCisgICAgSXQgd2lsbCBiZSB1c2VkIGJ5IERIQ1AgdG8gcmVnaXN0ZXIgYSBjbGllbnQgaG9zdG5hbWUsIGJ1dCBjYW4gYWxzbyBiZSB1c2Ugd2hlbiB5b3UgY2FsbAorICAgIHNubXBfc2V0X3N5c25hbWUuCisKKyAgMjAwNy0wMy0yOCBGculk6XJpYyBCZXJub24KKyAgKiBuZXRpZi5oLCBuZXRpZi5jOiBBIG5ldyBORVRJRl9GTEFHX0VUSEFSUCBmbGFnIGlzIGRlZmluZWQgaW4gbmV0aWYuaCwgdG8gYWxsb3cgdG8gCisgICAgaW5pdGlhbGl6ZSBhIG5ldHdvcmsgaW50ZXJmYWNlJ3MgZmxhZyB3aXRoLiBJdCB0ZWxsIHRoaXMgaW50ZXJmYWNlIGlzIGFuIGV0aGVybmV0CisgICAgZGV2aWNlLCBhbmQgd2UgY2FuIHVzZSBBUlAgd2l0aCBpdCB0byBkbyBhICJncmF0dWl0b3VzIEFSUCIgKFJGQyAzMjIwICJJUCBNb2JpbGl0eQorICAgIFN1cHBvcnQgZm9yIElQdjQiIHNlY3Rpb24gNC42KSB3aGVuIGludGVyZmFjZSBpcyAidXAiIHdpdGggbmV0aWZfc2V0X3VwKCkuCisKKyAgMjAwNy0wMy0yNiBGculk6XJpYyBCZXJub24sIEpvbmF0aGFuIExhcm1vdXIKKyAgKiBvcHQuaCwgdGNwaXAuYzogTmV3IGNvbmZpZ3VyYXRpb24gb3B0aW9uIExXSVBfQVJQIGFsbG93IHRvIGRpc2FibGUgQVJQIGluaXQgYXQgYnVpbGQKKyAgICB0aW1lIGlmIHlvdSBvbmx5IHVzZSBQUFAgb3IgU0xJUC4gVGhlIGRlZmF1bHQgaXMgZW5hYmxlLiBOb3RlIHdlIGRvbid0IGhhdmUgdG8gY2FsbCAKKyAgICBldGhhcnBfaW5pdCBpbiB5b3VyIHBvcnQncyBpbml0aWxpemF0aW9uIHNlcXVlbmNlIGlmIHlvdSB1c2UgdGNwaXAuYywgYmVjYXVzZSB0aGlzIGNhbGwKKyAgICBpcyBkb25lIGluIHRjcGlwX2luaXQgZnVuY3Rpb24uCisKKyAgMjAwNy0wMy0yMiBGculk6XJpYyBCZXJub24KKyAgKiBzdGF0cy5oLCBzdGF0cy5jLCBtc2dfaW4uYzogU3RhdHMgY291bnRlcnMgY2FuIGJlIGNoYW5nZSB0byB1MzJfdCBpZiBuZWNlc3Nhcnkgd2l0aCB0aGUKKyAgICBuZXcgb3B0aW9uIExXSVBfU1RBVFNfTEFSR0UuIElmIHlvdSBuZWVkIHRoaXMgb3B0aW9uLCBkZWZpbmUgTFdJUF9TVEFUU19MQVJHRSB0byAxIGluCisgICAgeW91ciBsd2lwb3B0cy5oLiBNb3JlLCB1bnVzZWQgY291bnRlcnMgYXJlIG5vdCBkZWZpbmVkIGluIHRoZSBzdGF0cyBzdHJ1Y3RzLCBhbmQgbm90IAorICAgIGRpc3BsYXkgYnkgc3RhdHNfZGlzcGxheSgpLiBOb3RlIHRoYXQgc29tZSBvcHRpb25zIChTWVNfU1RBVFMgYW5kIFJBV19TVEFUUykgYXJlIGRlZmluZWQKKyAgICBidXQgbmV2ZXIgdXNlZC4gRml4IG1zZ19pbi5jIHdpdGggdGhlIGNvcnJlY3QgI2lmIHRlc3QgZm9yIGEgc3RhdCBkaXNwbGF5LgorCisgIDIwMDctMDMtMjEgS2llcmFuIE1hbnNsZXkKKyAgKiBuZXRpZi5jLCBuZXRpZi5oOiBBcHBseSBwYXRjaCM0MTk3IHdpdGggc29tZSBjaGFuZ2VzIChvcmlnaW5hdG9yOiByaXJlbGFuZEBobWdzbC5jb20pLiAKKyAgICBQcm92aWRlcyBjYWxsYmFjayBvbiBuZXRpZiB1cC9kb3duIHN0YXRlIGNoYW5nZS4KKworICAyMDA3LTAzLTExIEZy6WTpcmljIEJlcm5vbiwgTWFjZSBHYWVsLCBTdGV2ZSBSZXlub2xkcworICAqIHNvY2tldHMuaCwgc29ja2V0cy5jLCBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmgsIGFwaV9tc2cuYywgaWdtcC5oLCBpZ21wLmMsCisgICAgaXAuYywgbmV0aWYuaCwgdGNwaXAuYywgb3B0Lmg6CisgICAgTmV3IGNvbmZpZ3VyYXRpb24gb3B0aW9uIExXSVBfSUdNUCB0byBlbmFibGUgSUdNUCBwcm9jZXNzaW5nLiBCYXNlZCBvbiBvbmx5IG9uZSAKKyAgICBmaWx0ZXIgcGVyIGFsbCBuZXR3b3JrIGludGVyZmFjZXMuIERlY2xhcmUgYSBuZXcgZnVuY3Rpb24gaW4gbmV0aWYgdG8gZW5hYmxlIHRvCisgICAgY29udHJvbCB0aGUgTUFDIGZpbHRlciAodG8gcmVkdWNlIGx3SVAgdHJhZmZpYyBwcm9jZXNzaW5nKS4KKworICAyMDA3LTAzLTExIEZy6WTpcmljIEJlcm5vbgorICAqIHRjcC5oLCB0Y3AuYywgc29ja2V0cy5jLCB0Y3Bfb3V0LmMsIHRjcF9pbi5jLCBvcHQuaDogS2VlcGFsaXZlIHZhbHVlcyBjYW4KKyAgICBiZSBjb25maWd1cmVkIGF0IHJ1biB0aW1lIHdpdGggTFdJUF9UQ1BfS0VFUEFMSVZFLCBidXQgZG9uJ3QgY2hhbmdlIHRoaXMKKyAgICB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgKGRlZmF1bHQgYXJlIFJGQzExMjIgY29tcGxpYW50KS4gTm90ZQorICAgIHRoYXQgVENQX0tFRVBJRExFIGFuZCBUQ1BfS0VFUElOVFZMIGhhdmUgdG8gYmUgc2V0IGluIHNlY29uZHMuCisKKyAgMjAwNy0wMy0wOCBGculk6XJpYyBCZXJub24KKyAgKiB0Y3AuaDogS2VlcGFsaXZlIHZhbHVlcyBjYW4gYmUgY29uZmlndXJlZCBhdCBjb21waWxlIHRpbWUsIGJ1dCBkb24ndCBjaGFuZ2UKKyAgICB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZyAoZGVmYXVsdCBhcmUgUkZDMTEyMiBjb21wbGlhbnQpLgorCisgIDIwMDctMDMtMDggRnLpZOlyaWMgQmVybm9uCisgICogc29ja2V0cy5jLCBhcGkuaCwgYXBpX2xpYi5jLCB0Y3BpcC5jLCBzeXMuaCwgc3lzLmMsIGVyci5jLCBvcHQuaDoKKyAgICBJbXBsZW1lbnQgTFdJUF9TT19SQ1ZUSU1FTyBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBlbmFibGUvZGlzYWJsZSBTT19SQ1ZUSU1FTworICAgIG9uIFVEUCBzb2NrZXRzL25ldGNvbm4uCisKKyAgMjAwNy0wMy0wOCBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNubXBfbXNnLmgsIG1zZ19pbi5jOiBTTk1QIFVEUCBwb3J0cyBjYW4gYmUgY29uZmlndXJlZCBhdCBjb21waWxlIHRpbWUuCisKKyAgMjAwNy0wMy0wNiBGculk6XJpYyBCZXJub24KKyAgKiBhcGkuaCwgYXBpX2xpYi5jLCBzb2NrZXRzLmgsIHNvY2tldHMuYywgdGNwaXAuYywgc3lzLmgsIHN5cy5jLCBlcnIuaDogCisgICAgSW1wbGVtZW50IFNPX1JDVlRJTUVPIG9uIFVEUCBzb2NrZXRzL25ldGNvbm4uCisKKyAgMjAwNy0wMi0yOCBLaWVyYW4gTWFuc2xleSAoYmFzZWQgb24gcGF0Y2ggZnJvbSBTaW1vbiBHb2xkc2NobWlkdCkKKyAgKiBhcGlfbGliLmMsIHRjcGlwLmMsIG1lbXAuYywgbWVtcC5oOiBtYWtlIEFQSSBtc2cgc3RydWN0cyBhbGxvY2F0ZWQKKyAgICBvbiB0aGUgc3RhY2sgYW5kIHJlbW92ZSB0aGUgQVBJIG1zZyB0eXBlIGZyb20gbWVtcAorCisgIDIwMDctMDItMjYgSm9uYXRoYW4gTGFybW91ciAoYmFzZWQgb24gcGF0Y2ggZnJvbSBTaW1vbiBHb2xkc2NobWlkdCkKKyAgKiBzb2NrZXRzLmgsIHNvY2tldHMuYzogTW92ZSBzb2NrZXQgaW5pdGlhbGl6YXRpb24gdG8gbmV3CisgICAgbHdpcF9zb2NrZXRfaW5pdCgpIGZ1bmN0aW9uLgorICAgIE5PVEU6IHRoaXMgY2hhbmdlcyB0aGUgQVBJIHdpdGggcG9ydHMuIFBvcnRzIHdpbGwgaGF2ZSB0byBiZQorICAgIHVwZGF0ZWQgdG8gY2FsbCBsd2lwX3NvY2tldF9pbml0KCkgbm93LgorCisgIDIwMDctMDItMjYgSm9uYXRoYW4gTGFybW91ciAoYmFzZWQgb24gcGF0Y2ggZnJvbSBTaW1vbiBHb2xkc2NobWlkdCkKKyAgKiBhcGlfbGliLmM6IFVzZSBtZW1jcHkgaW4gbmV0YnVmX2NvcHlfcGFydGlhbC4KKworCisgICsrIEJ1ZyBmaXhlczoKKworICAyMDA4LTAzLTE3IEZy6WTpcmljIEJlcm5vbiwgRWQgS2VyZWtlcworICAqIGlnbXAuaCwgaWdtcC5jOiBGaXggYnVnICMyMjYxMyAiSUdNUCBpcGhkciBwcm9ibGVtIiAoY291bGQgaGF2ZQorICAgIHNvbWUgcHJvYmxlbXMgdG8gZmlsbCB0aGUgSVAgaGVhZGVyIG9uIHNvbWUgdGFyZ2V0cywgdXNlIG5vdyB0aGUKKyAgICBpcC5oIG1hY3JvcyB0byBkbyBpdCkuCisKKyAgMjAwOC0wMy0xMyBGculk6XJpYyBCZXJub24KKyAgKiBzb2NrZXRzLmM6IEZpeCBidWcgIzIyNDM1ICJsd2lwX3JlY3Zmcm9tIHdpdGggVENQIGJyZWFrOyIuIFVzaW5nCisgICAgKGx3aXBfKXJlY3Zmcm9tIHdpdGggdmFsaWQgImZyb20iIGFuZCAiZnJvbWxlbiIgcGFyYW1ldGVycywgb24gYQorICAgIFRDUCBjb25uZWN0aW9uIGNhdXNlZCBhIGNyYXNoLiBOb3RlIHRoYXQgdXNpbmcgKGx3aXBfKXJlY3Zmcm9tCisgICAgbGlrZSB0aGlzIGlzIGEgYml0IHNsb3cgYW5kIHRoYXQgdXNpbmcgKGx3aXApZ2V0cGVlcm5hbWUgaXMgdGhlCisgICAgZ29vZCBsd2lwIHdheSB0byBkbyBpdCAoc28sIHVzaW5nIHJlY3YgaXMgZmFzdGVyIG9uIHRjcCBzb2NrZXRzKS4KKworICAyMDA4LTAzLTEyIEZy6WTpcmljIEJlcm5vbiwgSm9uYXRoYW4gTGFybW91cgorICAqIGFwaV9tc2cuYywgY29udHJpYi9hcHBzL3BpbmcuYzogRml4IGJ1ZyAjMjI1MzAgImFwaV9tc2cuYydzCisgICAgcmVjdl9yYXcoKSBkb2VzIG5vdCBjb25zdW1lIGRhdGEiLCBhbmQgdGhlIHBpbmcgc2FtcGxlICh3aXRoCisgICAgTFdJUF9TT0NLRVQ9MSwgdGhlIGNvZGUgZGlkIHRoZSB3cm9uZyBzdXBwb3NpdGlvbiB0aGF0IGx3aXBfcmVjdmZyb20KKyAgICByZXR1cm5lZCB0aGUgSVAgcGF5bG9hZCwgd2l0aG91dCB0aGUgSVAgaGVhZGVyKS4KKworICAyMDA4LTAzLTA0IEpvbmF0aGFuIExhcm1vdXIKKyAgKiBtZW0uYywgc3RhdHMuYywgbWVtLmg6IGFwcGx5IHBhdGNoICM2NDE0IHRvIGF2b2lkIGNvbXBpbGVyIGVycm9ycworICBhbmQvb3Igd2FybmluZ3Mgb24gc29tZSBzeXN0ZW1zIHdoZXJlIG1lbV9zaXplX3QgYW5kIHNpemVfdCBkaWZmZXIuCisgICogcGJ1Zi5jLCBwcHAuYzogRml4IHdhcm5pbmdzIG9uIHNvbWUgc3lzdGVtcyB3aXRoIG1lbV9tYWxsb2MuCisKKyAgMjAwOC0wMy0wNCBLaWVyYW4gTWFuc2xleSAoY29udHJpYnV0aW9ucyBieSBvdGhlcnMpIAorICAqIE51bWVyb3VzIHNtYWxsIGNvbXBpbGVyIGVycm9yL3dhcm5pbmcgZml4ZXMgZnJvbSBjb250cmlidXRpb25zIHRvCisgICAgbWFpbGluZyBsaXN0IGFmdGVyIDEuMy4wIHJlbGVhc2UgY2FuZGlkYXRlIG1hZGUuCisKKyAgMjAwOC0wMS0yNSBDdWkgaGVuZ2JpbiAoaW50ZWdyYXRlZCBieSBGculk6XJpYyBCZXJub24pCisgICogZG5zLmM6IEZpeCBidWcgIzIyMTA4ICJETlMgcHJvYmxlbSIgY2F1c2VkIGJ5IHVuYWxpZ25lZCBzdHJ1Y3R1cmVzLgorCisgIDIwMDgtMDEtMTUgS2llcmFuIE1hbnNsZXkKKyAgKiB0Y3Bfb3V0LmM6IEJVRzIwNTExLiAgTW9kaWZ5IHBlcnNpc3QgdGltZXIgdG8gc3RhcnQgd2hlbiB3ZSBhcmUKKyAgICBwcmV2ZW50ZWQgZnJvbSBzZW5kaW5nIGJ5IGEgc21hbGwgc2VuZCB3aW5kb3csIG5vdCBqdXN0IGEgemVybworICAgIHNlbmQgd2luZG93LgorCisgIDIwMDgtMDEtMDkgSm9uYXRoYW4gTGFybW91cgorICAqIG9wdC5oLCBpcC5jOiBSZW5hbWUgSVBfT1BUSU9OUyBkZWZpbmUgdG8gSVBfT1BUSU9OU19BTExPV0VEIHRvIGF2b2lkCisgICAgY29uZmxpY3Qgd2l0aCBMaW51eCBzeXN0ZW0gaGVhZGVycy4KKworICAyMDA4LTAxLTA2IEpvbmF0aGFuIExhcm1vdXIKKyAgKiBkaGNwLmM6IGZpeCBidWcgIzE5OTI3OiAiREhDUCBOQUNLIHByb2JsZW0iIGJ5IGNsZWFyaW5nIGFueSBleGlzdGluZyBzZXQgSVAKKyAgICBhZGRyZXNzIGVudGlyZWx5IG9uIHJlY2VpdmluZyBhIERIQ1BOQUssIGFuZCByZXN0YXJ0aW5nIGRpc2NvdmVyeS4KKworICAyMDA3LTEyLTIxIFNpbW9uIEdvbGRzY2htaWR0CisgICogc3lzLmgsIGFwaV9saWIuYywgYXBpX21zZy5jLCBzb2NrZXRzLmM6IGZpeCBidWcgIzIxNjk4OiAibmV0Y29ubi0+cmVjdl9hdmFpbAorICAgIGlzIG5vdCBwcm90ZWN0ZWQiIGJ5IHVzaW5nIG5ldyBtYWNyb3MgZm9yIGludGVybG9ja2VkIGFjY2VzcyB0byBtb2RpZnkvdGVzdAorICAgIG5ldGNvbm4tPnJlY3ZfYXZhaWwuCisKKyAgMjAwNy0xMi0yMCBLaWVyYW4gTWFuc2xleSAoYmFzZWQgb24gcGF0Y2ggZnJvbSBPbGVnIFR5c2hldikKKyAgKiB0Y3BfaW4uYzogZml4IGJ1ZyMgMjE1MzUgKG5ydHggbm90IHJlc2V0IGNvcnJlY3RseSBpbiBTWU5fU0VOVCBzdGF0ZSkKKworICAyMDA3LTEyLTIwIEtpZXJhbiBNYW5zbGV5IChiYXNlZCBvbiBwYXRjaCBmcm9tIFBlci1IZW5yaWsgTHVuZGJvbG0pCisgICogdGNwLmMsIHRjcF9pbi5jLCB0Y3Bfb3V0LmMsIHRjcC5oOiBmaXggYnVnICMyMDE5OSAoYmV0dGVyIGhhbmRsaW5nCisgICAgb2Ygc2lsbHkgd2luZG93IGF2b2lkYW5jZSBhbmQgcHJldmVudCBsd0lQIGZyb20gc2hyaW5raW5nIHRoZSB3aW5kb3cpCisKKyAgMjAwNy0xMi0wNCBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5jLCB0Y3BfaW4uYzogZml4IGJ1ZyAjMjE2OTkgKHNlZ21lbnQgbGVhayBpbiBvb3NlcSBwcm9jZXNzaW5nIHdoZW4gbGFzdAorICAgIGRhdGEgcGFja2V0IHdhcyBsb3N0KTogYWRkIGFzc2VydCB0aGF0IGFsbCBzZWdtZW50IGxpc3RzIGFyZSBlbXB0eSBpbgorICAgIHRjcF9wY2JfcmVtb3ZlIGJlZm9yZSBzZXR0aW5nIHBjYiB0byBDTE9TRUQgc3RhdGU7IGRvbid0IGRpcmVjdGx5IHNldCBDTE9TRUQKKyAgICBzdGF0ZSBmcm9tIExBU1RfQUNLIGluIHRjcF9wcm9jZXNzCisKKyAgMjAwNy0xMi0wMiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNvY2tldHMuaDogZml4IGJ1ZyAjMjE2NTQ6IGV4Y2x1ZGUgZGVmaW5pdGlvbiBvZiBzdHJ1Y3QgdGltZXZhbCBmcm9tICNpZm5kZWYgRkRfU0VUCisgICAgSWYgaW5jbHVkaW5nIDxzeXMvdGltZS5oPiBmb3Igc3lzdGVtLXN0cnVjdCB0aW1ldmFsLCBMV0lQX1RJTUVWQUxfUFJJVkFURSBub3cKKyAgICBoYXMgdG8gYmUgc2V0IHRvIDAgaW4gbHdpcG9wdHMuaAorCisgIDIwMDctMTItMDIgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGlfbXNnLmMsIGFwaV9saWIuYzogZml4IGJ1ZyAjMjE2NTYgKHJlY3ZtYm94IHByb2JsZW0gaW4gbmV0Y29ubiBBUEkpOiBhbHdheXMKKyAgICBhbGxvY2F0ZSBhIHJlY3ZtYm94IGluIG5ldGNvbm5fbmV3X3dpdGhfcHJvdG9fYW5kX2NhbGxiYWNrLiBGb3IgYSB0Y3AtbGlzdGVuCisgICAgbmV0Y29ubiwgdGhpcyByZWN2bWJveCBpcyBsYXRlciBmcmVlZCBhbmQgYSBuZXcgbWJveCBpcyBhbGxvY2F0ZWQgZm9yIGFjY2VwdG1ib3guCisgICAgVGhpcyBpcyBhIGZpeCBmb3IgdGhyZWFkLXNhZmV0eSBhbmQgYWxsb2NhdGVzIGFsbCBpdGVtcyBuZWVkZWQgZm9yIGEgbmV0Y29ubgorICAgIHdoZW4gdGhlIG5ldGNvbm4gaXMgY3JlYXRlZC4KKworICAyMDA3LTExLTMwIFNpbW9uIEdvbGRzY2htaWR0CisgICogdWRwLmM6IGZpcnN0IGF0dGVtcHQgdG8gZml4IGJ1ZyAjMjE2NTUgKERIQ1AgZG9lc24ndCB3b3JrIHJlbGlhYmx5IHdpdGggbXVsdGlwbGUKKyAgICBuZXRpZnMpOiBpZiBMV0lQX0RIQ1AgaXMgZW5hYmxlZCwgVURQIHBhY2tldHMgdG8gREhDUF9DTElFTlRfUE9SVCBhcmUgcGFzc2VkCisgICAgdG8gbmV0aWYtPmRoY3AtPnBjYiBvbmx5IChpZiB0aGF0IGV4aXN0cykgYW5kIG5vdCB0byBhbnkgb3RoZXIgcGNiIGZvciB0aGUgc2FtZQorICAgIHBvcnQgKG9ubHkgc29sdXRpb24gdG8gbGV0IFVEUCBwY2JzICdiaW5kJyB0byBhIG5ldGlmIGluc3RlYWQgb2YgYW4gSVAgYWRkcmVzcykKKworICAyMDA3LTExLTI3IFNpbW9uIEdvbGRzY2htaWR0CisgICogaXAuYzogZml4ZWQgYnVnICMyMTY0MyAodWRwX3NlbmQvcmF3X3NlbmQgZG9uJ3QgZmFpbCBpZiBuZXRpZiBpcyBkb3duKSBieQorICAgIGxldHRpbmcgaXBfcm91dGUgb25seSB1c2UgbmV0aWZzIHRoYXQgYXJlIHVwLgorCisgIDIwMDctMTEtMjcgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBlcnIuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmMsIHNvY2tldHMuYzogQ2hhbmdlZCBlcnJvciBoYW5kbGluZzogRVJSX01FTSwgRVJSX0JVRgorICAgIGFuZCBFUlJfUlRFIGFyZSBzZWVuIGFzIG5vbi1mYXRhbCwgYWxsIG90aGVyIGVycm9ycyBhcmUgZmF0YWwuIG5ldGNvbm5zIGFuZAorICAgIHNvY2tldHMgYmxvY2sgbW9zdCBvcGVyYXRpb25zIG9uY2UgdGhleSBoYXZlIHNlZW4gYSBmYXRhbCBlcnJvci4KKworICAyMDA3LTExLTI3IFNpbW9uIEdvbGRzY2htaWR0CisgICogdWRwLmgsIHVkcC5jLCBkaGNwLmM6IEltcGxlbWVudGVkIG5ldyBmdW5jdGlvbiB1ZHBfc2VuZHRvX2lmIHdoaWNoIHRha2VzIHRoZQorICAgIG5ldGlmIHRvIHNlbmQgYXMgYW4gYXJndW1lbnQgKHRvIGJlIGFibGUgdG8gc2VuZCBvbiBuZXRpZnMgdGhhdCBhcmUgZG93bikuCisKKyAgMjAwNy0xMS0yNiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcF9pbi5jOiBGaXhlZCBidWcgIzIxNTgyOiBwY2ItPmFja2VkIGFjY291bnRpbmcgY2FuIGJlIHdyb25nIHdoZW4gQUNLcworICAgIGFycml2ZSBvdXQtb2Ytb3JkZXIKKworICAyMDA3LTExLTIxIFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmgsIHRjcF9vdXQuYywgYXBpX21zZy5jOiBGaXhlZCBidWcgIzIwMjg3OiB0Y3Bfb3V0cHV0X25hZ2xlIHNlbmRzIHRvbyBlYXJseQorICAgIEZpeGVkIHRoZSBuYWdsZSBhbGdvcml0aG07IG5hZ2xlIG5vdyBhbHNvIHdvcmtzIGZvciBhbGwgcmF3IEFQSSBhcHBsaWNhdGlvbnMKKyAgICBhbmQgaGFzIHRvIGJlIGV4cGxpY2l0bHkgZGlzYWJsZWQgd2l0aCAndGNwX3BjYi0+ZmxhZ3MgfD0gVEZfTk9ERUxBWScKKworICAyMDA3LTExLTEyIEZy6WTpcmljIEJlcm5vbgorICAqIHNvY2tldHMuYywgYXBpLmgsIGFwaV9saWIuYywgYXBpX21zZy5oLCBhcGlfbXNnLmM6IEZpeGVkIGJ1ZyAjMjA5MDAuIE5vdywgbW9zdAorICAgIG9mIHRoZSBuZXRjb25uX3BlZXIgYW5kIG5ldGNvbm5fYWRkciBwcm9jZXNzaW5nIGlzIGRvbmUgaW5zaWRlIHRjcGlwX3RocmVhZAorICAgIGNvbnRleHQgaW4gZG9fZ2V0YWRkci4KKworICAyMDA3LTExLTEwIFNpbW9uIEdvbGRzY2htaWR0CisgICogZXRoYXJwLmM6IEZpeGVkIGJ1ZzogYXNzZXJ0IGZpcmVkIHdoZW4gTUVNUF9BUlBfUVVFVUUgd2FzIGVtcHR5ICh3aGljaCBjYW4KKyAgICBoYXBwZW4gYW55IHRpbWUpLiBOb3cgdGhlIHBhY2tldCBzaW1wbHkgaXNuJ3QgZW5xdWV1ZWQgd2hlbiBvdXQgb2YgbWVtb3J5LgorCisgIDIwMDctMTEtMDEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3AuYywgdGNwX2luLmM6IEZpeGVkIGJ1ZyAjMjE0OTQ6IFRoZSBzZW5kIG1zcyAocGNiLT5tc3MpIGlzIHNldCB0byA1MzYgKG9yCisgICAgVENQX01TUyBpZiB0aGF0IGlzIHNtYWxsZXIpIGFzIGxvbmcgYXMgbm8gTVNTIG9wdGlvbiBpcyByZWNlaXZlZCBmcm9tIHRoZQorICAgIHJlbW90ZSBob3N0LgorCisgIDIwMDctMTEtMDEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3AuaCwgdGNwLmMsIHRjcF9pbi5jOiBGaXhlZCBidWcgIzIxNDkxOiBUaGUgTVNTIG9wdGlvbiBzZW50ICh3aXRoIFNZTikKKyAgICBpcyBub3cgYmFzZWQgb24gVENQX01TUyBpbnN0ZWFkIG9mIHBjYi0+bXNzIChvbiBwYXNzaXZlIG9wZW4gbm93IGVmZmVjdGl2ZWx5CisgICAgc2VuZGluZyBvdXIgY29uZmlndXJlZCBUQ1BfTVNTIGluc3RlYWQgb2YgdGhlIG9uZSByZWNlaXZlZCkuCisKKyAgMjAwNy0xMS0wMSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcF9pbi5jOiBGaXhlZCBidWcgIzIxMTgxOiBPbiBhY3RpdmUgb3BlbiwgdGhlIGluaXRpYWwgY29uZ2VzdGlvbiB3aW5kb3cgd2FzCisgICAgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBUQ1BfTVNTLCBub3Qgb24gdGhlIE1TUyBvcHRpb24gcmVjZWl2ZWQKKyAgICB3aXRoIFNZTitBQ0suCisKKyAgMjAwNy0xMC0wOSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHVkcC5jLCBpbmV0LmMsIGluZXQuaDogRml4ZWQgVURQTGl0ZTogc2VuZDogQ2hlY2tzdW0gd2FzIGFsd2F5cyBnZW5lcmF0ZWQgdG9vCisgICAgc2hvcnQgYW5kIGFsc28gd2FzIGdlbmVyYXRlZCB3cm9uZyBpZiBjaGVja3N1bSBjb3ZlcmFnZSAhPSB0b3RfbGVuOworICAgIHJlY2VpdmU6IGNoZWNrc3VtIHdhcyBjYWxjdWxhdGVkIHdyb25nIGlmIGNoZWNrc3VtIGNvdmVyYWdlICE9IHRvdF9sZW4KKworICAyMDA3LTEwLTA4IFNpbW9uIEdvbGRzY2htaWR0CisgICogbWVtLmM6IGxmcmVlIHdhcyBub3QgdXBkYXRlZCBpbiBtZW1fcmVhbGxvYyEKKworICAyMDA3LTEwLTA3IEZy6WTpcmljIEJlcm5vbgorICAqIHNvY2tldHMuYywgYXBpLmgsIGFwaV9saWIuYzogRmlyc3Qgc3RlcCB0byBmaXggImJ1ZyAjMjA5MDAgOiBQb3RlbnRpYWwKKyAgICBjcmFzaCBlcnJvciBwcm9ibGVtIHdpdGggbmV0Y29ubl9wZWVyICYgbmV0Y29ubl9hZGRyIi4gVkVSWSBJTVBPUlRBTlQ6CisgICAgdGhpcyBjaGFuZ2UgY2F1c2UgYW4gQVBJIGJyZWFrYWdlIGZvciBuZXRjb25uX2FkZHIsIHNpbmNlIGEgcGFyYW1ldGVyCisgICAgdHlwZSBjaGFuZ2UuIEFueSBjb21waWxlciBzaG91bGQgY2F1c2UgYW4gZXJyb3Igd2l0aG91dCBhbnkgY2hhbmdlcyBpbgorICAgIHlvdXJzIG5ldGNvbm5fcGVlciBjYWxscyAoc28sIGl0IGNhbid0IGJlIGEgInNpbGVudCBjaGFuZ2UiKS4gSXQgYWxzbworICAgIHJlZHVjZSBhIGxpdHRsZSBiaXQgdGhlIGZvb3RwcmludCBmb3Igc29ja2V0IGxheWVyIChsd2lwX2dldHBlZXJuYW1lICYKKyAgICBsd2lwX2dldHNvY2tuYW1lIHVzZSBub3cgYSBjb21tb24gbHdpcF9nZXRhZGRybmFtZSBmdW5jdGlvbiBzaW5jZSAKKyAgICBuZXRjb25uX3BlZXIgJiBuZXRjb25uX2FkZHIgaGF2ZSB0aGUgc2FtZSBwYXJhbWV0ZXJzKS4KKworICAyMDA3LTA5LTIwIFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmM6IEZpeGVkIGJ1ZyAjMjEwODAgKHRjcF9iaW5kIHdpdGhvdXQgY2hlY2sgcGNicyBpbiBUSU1FX1dBSVQgc3RhdGUpCisgICAgYnkgY2hlY2tpbmcgIHRjcF90d19wY2JzIGFsc28KKworICAyMDA3LTA5LTE5IFNpbW9uIEdvbGRzY2htaWR0CisgICogaWNtcC5jOiBGaXhlZCBidWcgIzIxMTA3IChkaWRuJ3QgcmVzZXQgSVAgVFRMIGluIElDTVAgZWNobyByZXBsaWVzKQorCisgIDIwMDctMDktMTUgTWlrZSBLbGVzaG92CisgICogbWVtLmM6IEZpeGVkIGJ1ZyAjMjEwNzcgKGluYWNjdXJhY3kgaW4gY2FsY3VsYXRpb24gb2YgbHdpcF9zdGF0Lm1lbS51c2VkKQorCisgIDIwMDctMDktMDYgRnLpZOlyaWMgQmVybm9uCisgICogc2V2ZXJhbC1maWxlczogcmVwbGFjZSBzb21lICNpbmNsdWRlICJhcmNoL2NjLmgiIGJ5ICJsd2lwL2FyY2guaCIsIG9yIHNpbXBseSByZW1vdmUKKyAgICBpdCBhcyBsb25nIGFzICJsd2lwL29wdC5oIiBpcyBpbmNsdWRlZCBiZWZvcmUgKHRoaXMgb25lIGluY2x1ZGUgImx3aXAvZGVidWcuaCIgd2hpY2gKKyAgICBhbHJlYWR5IGluY2x1ZGUgImx3aXAvYXJjaC5oIikuIExpa2UgdGhhdCwgZGVmYXVsdCBkZWZpbmVzIGFyZSBwcm92aWRlZCBieSAibHdpcC9hcmNoLmgiCisgICAgaWYgdGhleSBhcmUgbm90IGRlZmluZWQgaW4gY2MuaCwgaW4gdGhlIHNhbWUgc3Bpcml0IHRoYW4gImx3aXAvb3B0LmgiIGZvciBsd2lwb3B0cy5oLgorCisgIDIwMDctMDgtMzAgRnLpZOlyaWMgQmVybm9uCisgICogaWdtcC5oLCBpZ21wLmM6IFNvbWUgY2hhbmdlcyB0byByZW1vdmUgc29tZSByZWR1bmRhbnQgY29kZSwgYWRkIHNvbWUgdHJhY2VzLCAKKyAgICBhbmQgZml4IHNvbWUgY29kaW5nIHN0eWxlLgorCisgIDIwMDctMDgtMjggRnLpZOlyaWMgQmVybm9uCisgICogdGNwaXAuYzogRml4IFRDUElQX01TR19JTlBLVCBwcm9jZXNzaW5nOiBub3csIHRjcGlwX2lucHV0IGNhbiBiZSB1c2VkIGZvciBhbnkKKyAgICBraW5kIG9mIHBhY2tldHMuIFRoZXNlIHBhY2tldHMgYXJlIGNvbnNpZGVyZWQgbGlrZSBFdGhlcm5ldCBwYWNrZXRzIChwYXlsb2FkIAorICAgIHBvaW50aW5nIHRvIGV0aGhkcikgaWYgdGhlIG5ldGlmIGdvdCB0aGUgTkVUSUZfRkxBR19FVEhBUlAgZmxhZy4gRWxzZSwgcGFja2V0cyAKKyAgICBhcmUgY29uc2lkZXJlZCBsaWtlIElQIHBhY2tldHMgKHBheWxvYWQgcG9pbnRpbmcgdG8gaXBoZHIpLgorCisgIDIwMDctMDgtMjcgRnLpZOlyaWMgQmVybm9uCisgICogYXBpLmgsIGFwaV9saWIuYywgYXBpX21zZy5jOiBGaXJzdCBmaXggZm9yICJidWcgIzIwOTAwIDogUG90ZW50aWFsIGNyYXNoIGVycm9yCisgICAgcHJvYmxlbSB3aXRoIG5ldGNvbm5fcGVlciAmIG5ldGNvbm5fYWRkciIuIEludHJvZHVjZSBORVRDT05OX0xJU1RFTiBuZXRjb25uX3N0YXRlCisgICAgYW5kIHJlbW92ZSBvYnNvbGV0ZSBvbmVzIChORVRDT05OX1JFQ1YgJiBORVRDT05OX0FDQ0VQVCkuCisKKyAgMjAwNy0wOC0yNCBLaWVyYW4gTWFuc2xleQorICAqIGluZXQuYyBNb2RpZnkgKGFjYyA+PiAxNikgdGVzdCB0byAoKGFjYyA+PiAxNikgIT0gMCkgdG8gaGVscCBidWdneQorICAgIGNvbXBpbGVyIChQYXJhZGlnbSBDKyspCisKKyAgMjAwNy0wOC0wOSBGculk6XJpYyBCZXJub24sIEJpbGwgRmxvcmFjCisgICogc3RhdHMuaCwgc3RhdHMuYywgaWdtcC5oLCBpZ21wLmMsIG9wdC5oOiBGaXggZm9yIGJ1ZyAjMjA1MDMgOiBJR01QIEltcHJvdmVtZW50LgorICAgIEludHJvZHVjZSBJR01QX1NUQVRTIHRvIGNlbnRyYWxpemUgc3RhdGlzdGljcyBtYW5hZ2VtZW50LgorCisgIDIwMDctMDgtMDkgRnLpZOlyaWMgQmVybm9uLCBCaWxsIEZsb3JhYworICAqIHVkcC5jOiBGaXggZm9yIGJ1ZyAjMjA1MDMgOiBJR01QIEltcHJvdmVtZW50LiBFbmFibGUgdG8gcmVjZWl2ZSBhIG11bHRpY2FzdAorICAgIHBhY2tldCBvbiBhIHVkcCBwY2IgYmluZGVkIG9uIGFuIG5ldGlmJ3MgSVAgYWRkcmVzcywgYW5kIG5vdCBvbiAiYW55Ii4KKworICAyMDA3LTA4LTA5IEZy6WTpcmljIEJlcm5vbiwgQmlsbCBGbG9yYWMKKyAgKiBpZ21wLmgsIGlnbXAuYywgaXAuYzogRml4IG1pbm9yIGNoYW5nZXMgZnJvbSBidWcgIzIwNTAzIDogSUdNUCBJbXByb3ZlbWVudC4KKyAgICBUaGlzIGlzIG1haW5seSBvbiB1c2luZyBsb29rdXAvbG9va2ZvciwgYW5kIHNvbWUgY29kaW5nIHN0eWxlcy4uLgorCisgIDIwMDctMDctMjYgRnLpZOlyaWMgQmVybm9uIChhbmQgInRoZWRvY3RvciIpCisgICogaWdtcC5jOiBGaXggYnVnICMyMDU5NSB0byBhY2NlcHQgSUdNUHYzICJRdWVyeSIgbWVzc2FnZXMuCisKKyAgMjAwNy0wNy0yNSBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9tc2cuYywgdGNwLmM6IEFub3RoZXIgZml4IGZvciBidWcgIzIwMDIxOiBieSBub3QgcmV0dXJuaW5nIGFuIGVycm9yIGlmCisgICAgdGNwX291dHB1dCBmYWlscyBpbiB0Y3BfY2xvc2UsIHRoZSBjb2RlIGluIGRvX2Nsb3NlX2ludGVybmFsIGdldHMgc2ltcGxlcgorICAgICh0Y3Bfb3V0cHV0IGlzIGNhbGxlZCBhZ2FpbiBsYXRlciBmcm9tIHRjcCB0aW1lcnMpLgorCisgIDIwMDctMDctMjUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpcF9mcmFnLmM6IEZpeGVkIGJ1ZyAjMjA0Mjk6IHVzZSB0aGUgbmV3IHBidWZfY29weV9wYXJ0aWFsIGluc3RlYWQgb2YgdGhlIG9sZAorICAgIGNvcHlfZnJvbV9wYnVmLCB3aGljaCBpbGxlZ2FsbHkgbW9kaWZpZWQgdGhlIGdpdmVuIHBidWYuCisKKyAgMjAwNy0wNy0yNSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcF9vdXQuYzogdGNwX2VucXVldWU6IHBjYi0+c25kX3F1ZXVlbGVuIGRpZG4ndCB3b3JrIGZvciBjaGFpbmUgUEJVRl9SQU1zOgorICAgIGNoYW5nZWQgc25kX3F1ZXVlbGVuKysgdG8gc25kX3F1ZXVlbGVuICs9IHBidWZfY2xlbihwKS4KKworICAyMDA3LTA3LTI0IFNpbW9uIEdvbGRzY2htaWR0CisgICogYXBpX21zZy5jLCB0Y3AuYzogRml4IGJ1ZyAjMjA0ODA6IENoZWNrIHRoZSBwY2IgcGFzc2VkIHRvIHRjcF9saXN0ZW4oKSBmb3IgdGhlCisgICAgY29ycmVjdCBzdGF0ZSAobXVzdCBiZSBDTE9TRUQpLgorCisgIDIwMDctMDctMTMgVGhvbWFzIFRhcmFub3dza2kgKGNvbW1pdGVkIGJ5IEphcmVkIEdydWJiKQorICAqIG1lbXAuYzogRml4IGJ1ZyAjMjA0Nzg6IG1lbXBfbWFsbG9jIHJldHVybmVkIE5VTEwrTUVNUF9TSVpFIG9uIGZhaWxlZAorICAgIGFsbG9jYXRpb24uIEl0IG5vdyByZXR1cm5zIE5VTEwuCisKKyAgMjAwNy0wNy0xMyBGculk6XJpYyBCZXJub24KKyAgKiBhcGlfbXNnLmM6IEZpeCBidWcgIzIwMzE4OiBhcGlfbXNnICJyZWN2IiBjYWxsYmFja3MgZG9uJ3QgY2FsbCBwYnVmX2ZyZWUgaW4KKyAgICBhbGwgZXJyb3IgY2FzZXMuCisKKyAgMjAwNy0wNy0xMyBGculk6XJpYyBCZXJub24KKyAgKiBhcGlfbXNnLmM6IEZpeCBidWcgIzIwMzE1OiBwb3NzaWJsZSBtZW1vcnkgbGVhayBwcm9ibGVtIGlmIHRjcF9saXN0ZW4gZmFpbGVkLAorICAgIGJlY2F1c2UgY3VycmVudCBjb2RlIGRvZXNuJ3QgZm9sbG93IHJhd2FwaS50eHQgZG9jdW1lbnRhdGlvbi4KKworICAyMDA3LTA3LTEzIEtpZXJhbiBNYW5zbGV5CisgICogc3JjL2NvcmUvdGNwX2luLmMgQXBwbHkgcGF0Y2gjNTc0MSBmcm9tIE9sZWcgVHlzaGV2IHRvIGZpeCBidWcgaW4KKyAgICBvdXQgb2Ygc2VxdWVuY2UgcHJvY2Vzc2luZyBvZiByZWNlaXZlZCBwYWNrZXRzCisKKyAgMjAwNy0wNy0wMyBTaW1vbiBHb2xkc2NobWlkdAorICAqIG5lYXJseS1hbGwtZmlsZXM6IEFkZGVkIGFzc2VydGlvbnMgd2hlcmUgUEJVRl9SQU0gcGJ1ZnMgYXJlIHVzZWQgYW5kIGFuCisgICAgYXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQgdGhpcyBwYnVmIGlzIGluIG9uZSBwaWVjZSAoaS5lLiBub3QgY2hhaW5lZCkuIFRoZXNlCisgICAgYXNzdW1wdGlvbnMgY2xhc2ggd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YgY29udmVydGluZyB0byBmdWxseSBwb29sLWJhc2VkCisgICAgcGJ1ZiBpbXBsZW1lbnRhdGlvbnMsIHdoZXJlIFBCVUZfUkFNIHBidWZzIG1pZ2h0IGJlIGNoYWluZWQuCisKKyAgMjAwNy0wNy0wMyBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaS5oLCBhcGlfbGliLmMsIGFwaV9tc2cuYzogRmluYWwgZml4IGZvciBidWcgIzIwMDIxIGFuZCBzb21lIG90aGVyIHByb2JsZW1zCisgICAgd2hlbiBjbG9zaW5nIHRjcCBuZXRjb25uczogcmVtb3ZlZCBjb25uLT5zZW0sIGxlc3MgY29udGV4dCBzd2l0Y2hlcyB3aGVuCisgICAgY2xvc2luZywgYm90aCBuZXRjb25uX2Nsb3NlIGFuZCBuZXRjb25uX2RlbGV0ZSBzaG91bGQgc2FmZWx5IGNsb3NlIHRjcAorICAgIGNvbm5lY3Rpb25zLgorCisgIDIwMDctMDctMDIgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBpcHY0L2lwLmgsIGlwdjYvaXAuaCwgb3B0LmgsIG5ldGlmLmgsIGV0aGFycC5oLCBpcHY0L2lwLmMsIG5ldGlmLmMsIHJhdy5jLAorICAgIHRjcF9vdXQuYywgdWRwLmMsIGV0aGFycC5jOiBBZGRlZCBvcHRpb24gTFdJUF9ORVRJRl9IV0FERFJISU5UIChkZWZhdWx0PW9mZikKKyAgICB0byBjYWNoZSBBUlAgdGFibGUgaW5kaWNlcyB3aXRoIGVhY2ggcGNiIGluc3RlYWQgb2Ygc2luZ2xlLWVudHJ5IGNhY2hlIGZvcgorICAgIHRoZSBjb21wbGV0ZSBzdGFjay4KKworICAyMDA3LTA3LTAyIFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmgsIHRjcC5jLCB0Y3BfaW4uYywgdGNwX291dC5jOiBBZGRlZCBzb21lIEFTU0VSVFMgYW5kIGNhc3RzIHRvIHByZXZlbnQKKyAgICB3YXJuaW5ncyB3aGVuIGFzc2lnbmluZyB0byBzbWFsbGVyIHR5cGVzLgorCisgIDIwMDctMDYtMjggU2ltb24gR29sZHNjaG1pZHQKKyAgKiB0Y3Bfb3V0LmM6IEFkZGVkIGNoZWNrIHRvIHByZXZlbnQgdGNwX3BjYi0+c25kX3F1ZXVlbGVuIGZyb20gb3ZlcmZsb3dpbmcuCisKKyAgMjAwNy0wNi0yOCBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcC5oOiBGaXhlZCBidWcgIzIwMjg3OiBGaXhlZCBuYWdsZSBhbGdvcml0aG0gKHNlbmRpbmcgd2FzIGRvbmUgdG9vIGVhcmx5IGlmCisgICAgYSBzZWdtZW50IGNvbnRhaW5lZCBjaGFpbmVkIHBidWZzKQorCisgIDIwMDctMDYtMjggRnLpZOlyaWMgQmVybm9uCisgICogYXV0b2lwLmM6IHJlcGxhY2UgbW9zdCBvZiByYW5kKCkgY2FsbHMgYnkgYSBtYWNybyBMV0lQX0FVVE9JUF9SQU5EIHdoaWNoIGNvbXB1dGUKKyAgICBhICJwc2V1ZG8tcmFuZG9tIiB2YWx1ZSBiYXNlZCBvbiBuZXRpZidzIE1BQyBhbmQgc29tZSBhdXRvaXAgZmllbGRzLiBJdCdzIGFsd2F5cworICAgIHBvc3NpYmxlIHRvIGRlZmluZSB0aGlzIG1hY3JvIGluIHlvdXIgb3duIGx3aXBvcHRzLmggdG8gYWx3YXlzIHVzZSBDIGxpYnJhcnkncworICAgIHJhbmQoKS4gTm90ZSB0aGF0IGF1dG9pcF9jcmVhdGVfcmFuZF9hZGRyIGRvZXNuJ3QgdXNlIHRoaXMgbWFjcm8uCisKKyAgMjAwNy0wNi0yOCBGculk6XJpYyBCZXJub24KKyAgKiBuZXRpZmFwaS5oLCBuZXRpZmFwaS5jLCB0Y3BpcC5oLCB0Y3BpcC5jOiBVcGRhdGUgY29kZSB0byBoYW5kbGUgdGhlIG9wdGlvbgorICAgIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HLCBhbmQgZG8gc29tZSBjaGFuZ2VzIHRvIGJlIGNvaGVyZW50IHdpdGggbGFzdCBtb2RpZmljYXRpb25zCisgICAgaW4gYXBpX2xpYi9hcGlfbXNnICh1c2UgcG9pbnRlcnMgYW5kIG5vdCB0eXBlIHdpdGggdGFibGUsIGV0Yy4uLikgCisKKyAgMjAwNy0wNi0yNiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHVkcC5oOiBGaXhlZCBidWcgIzIwMjU5OiBzdHJ1Y3QgdWRwX2hkciB3YXMgbGFja2luZyB0aGUgcGFja2luIGRlZmluZXMuCisKKyAgMjAwNy0wNi0yNSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHVkcC5jOiBGaXhlZCBidWcgIzIwMjUzOiBpY21wX2Rlc3RfdW5yZWFjaCB3YXMgY2FsbGVkIHdpdGggYSB3cm9uZyBwLT5wYXlsb2FkCisgICAgZm9yIHVkcCBwYWNrZXRzIHdpdGggbm8gbWF0Y2hpbmcgcGNiLgorCisgIDIwMDctMDYtMjUgU2ltb24gR29sZHNjaG1pZHQKKyAgKiB1ZHAuYzogRml4ZWQgYnVnICMyMDIyMDogVURQIFBDQiBzZWFyY2ggaW4gdWRwX2lucHV0KCk6IGEgbm9uLWxvY2FsIG1hdGNoCisgICAgY291bGQgZ2V0IHVkcCBpbnB1dCBwYWNrZXRzIGlmIHRoZSByZW1vdGUgc2lkZSBtYXRjaGVkLgorCisgIDIwMDctMDYtMTMgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBuZXRpZi5jOiBGaXhlZCBidWcgIzIwMTgwIChUQ1AgcGNicyBsaXN0ZW5pbmcgb24gSVBfQUREUl9BTlkgY291bGQgZ2V0CisgICAgY2hhbmdlZCBpbiBuZXRpZl9zZXRfaXBhZGRyIGlmIHByZXZpb3VzIG5ldGlmLT5pcF9hZGRyLmFkZHIgd2FzIDAuCisKKyAgMjAwNy0wNi0xMyBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9tc2cuYzogcGNiX25ldyBzZXRzIGNvbm4tPmVyciBpZiBwcm90b2NvbCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAtPiBuZXRjb25uX25ld18uLigpIGRvZXMgbm90IGFsbG9jYXRlIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHVuc3VwcG9ydGVkCisgICAgcHJvdG9jb2xzLgorCisgIDIwMDctMDYtMTMgRnLpZOlyaWMgQmVybm9uLCBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9saWIuYzogY2hhbmdlIHJldHVybiBleHByZXNzaW9uIGluIG5ldGNvbm5fYWRkciBhbmQgbmV0Y29ubl9wZWVyLCBiZWNhdXNlCisgICAgY29ubi0+ZXJyIHdhcyByZXNldCB0byBFUlJfT0sgd2l0aG91dCBhbnkgcmVhc29ucyAoYW5kIGVycm9yIHdhcyBsb3N0KS4uLgorCisgIDIwMDctMDYtMTMgRnLpZOlyaWMgQmVybm9uLCBNYXR0aGlhcyBXZWlzc2VyCisgICogb3B0LmgsIG1lbS5oLCBtZW0uYywgbWVtcC5jLCBwYnVmLmMsIGlwX2ZyYWcuYywgdmouYzogRml4IGJ1ZyAjMjAxNjIuIFJlbmFtZQorICAgIE1FTV9BTElHTiBpbiBMV0lQX01FTV9BTElHTiBhbmQgTUVNX0FMSUdOX1NJWkUgaW4gTFdJUF9NRU1fQUxJR05fU0laRSB0byBhdm9pZAorICAgIHNvbWUgbWFjcm8gbmFtZXMgY29sbGlzaW9uIHdpdGggc29tZSBPUyBtYWNyb3MuCisKKyAgMjAwNy0wNi0xMSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHVkcC5jOiBVRFAgTGl0ZTogY29ycmVjdGVkIHRoZSB1c2Ugb2YgY2hrc3VtX2xlbiAoYmFzZWQgb24gUkZDMzgyODogaWYgaXQncyAwLAorICAgIGNyZWF0ZSBjaGVja3N1bSBvdmVyIHRoZSBjb21wbGV0ZSBwYWNrZXQuIE9uIFJYLCBpZiBpdCdzIDwgOCAoYW5kIG5vdCAwKSwKKyAgICBkaXNjYXJkIHRoZSBwYWNrZXQuIEFsc28gcmVtb3ZlZCB0aGUgZHVwbGljYXRlICd1ZHBoZHItPmNoa3N1bSA9IDAnIGZvciBib3RoCisgICAgVURQICYgVURQIExpdGUuCisKKyAgMjAwNy0wNi0xMSBTcmluaXZhcyBHb2xsYWtvdGEgJiBPbGVnIFR5c2hldgorICAqIHRjcF9vdXQuYzogRml4IGZvciBidWcgIzIwMDc1IDogIkEgcHJvYmxlbSB3aXRoIGtlZXAtYWxpdmUgdGltZXIgYW5kIFRDUCBmbGFncyIKKyAgICB3aGVyZSBUQ1AgZmxhZ3Mgd2Fzbid0IGluaXRpYWxpemVkIGluIHRjcF9rZWVwYWxpdmUuCisKKyAgMjAwNy0wNi0wMyBTaW1vbiBHb2xkc2NobWlkdAorICAqIHVkcC5jOiB1ZHBfaW5wdXQoKTogSW5wdXQgcGJ1ZiB3YXMgbm90IGZyZWVkIGlmIHBjYiBoYWQgbm8gcmVjdiBmdW5jdGlvbgorICAgIHJlZ2lzdGVyZWQsIHAtPnBheWxvYWQgd2FzIG1vZGlmaWVkIHdpdGhvdXQgbW9kaWZ5aW5nIHAtPmxlbiBpZiBzZW5kaW5nCisgICAgaWNtcF9kZXN0X3VucmVhY2goKSAoaGFkIG5vIG5lZ2F0aXZlIGVmZmVjdCBidXQgd2FzIGRlZmluaXRpdmVseSB3cm9uZykuCisKKyAgMjAwNy0wNi0wMyBTaW1vbiBHb2xkc2NobWlkdAorICAqIGljbXAuYzogQ29ycmVjdGVkIGJ1ZyAjMTk5Mzc6IEZvciByZXNwb25kaW5nIHRvIGFuIGljbXAgZWNobyByZXF1ZXN0LCBpY21wCisgICAgcmUtdXNlZCB0aGUgaW5wdXQgcGJ1ZiBldmVuIGlmIHRoYXQgZGlkbid0IGhhdmUgZW5vdWdoIHNwYWNlIHRvIGluY2x1ZGUgdGhlCisgICAgbGluayBoZWFkZXJzLiBOb3cgdGhlIHNwYWNlIGlzIHRlc3RlZCBhbmQgYSBuZXcgcGJ1ZiBpcyBhbGxvY2F0ZWQgZm9yIHRoZQorICAgIGVjaG8gcmVzcG9uc2UgcGFja2V0IGlmIHRoZSBlY2hvIHJlcXVlc3QgcGJ1ZiBpc24ndCBiaWcgZW5vdWdoLgorCisgIDIwMDctMDYtMDEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmM6IENoZWNrZWQgaW4gcGF0Y2ggIzU5MTQ6IE1vdmVkIHNvY2tvcHQgcHJvY2Vzc2luZyBpbnRvIHRjcGlwX3RocmVhZC4KKworICAyMDA3LTA1LTIzIEZy6WTpcmljIEJlcm5vbgorICAqIGFwaV9saWIuYywgc29ja2V0cy5jOiBGaXhlZCBidWcgIzU5NTggZm9yIG5ldGNvbm5fbGlzdGVuIChhY2NlcHRtYm94IG9ubHkKKyAgICBhbGxvY2F0ZWQgYnkgZG9fbGlzdGVuIGlmIHN1Y2Nlc3MpIGFuZCBuZXRjb25uX2FjY2VwdCBlcnJvcnMgaGFuZGxpbmcuIEluCisgICAgbW9zdCBvZiBhcGlfbGliIGZ1bmN0aW9ucywgd2UgcmVwbGFjZSBzb21lIGVycm9ycyBjaGVja2luZ3MgbGlrZSAiaWYgKGNvbm49PU5VTEwpIgorICAgIGJ5IEFTU0VSVCwgZXhjZXB0IGZvciBuZXRjb25uX2RlbGV0ZS4KKworICAyMDA3LTA1LTIzIEZy6WTpcmljIEJlcm5vbgorICAqIGFwaV9saWIuYzogRml4ZWQgYnVnICM1OTU3ICJTYWZlLXRocmVhZCBwcm9ibGVtIGluc2lkZSBuZXRjb25uX3JlY3YiIHRvIHJldHVybgorICAgIGFuIGVycm9yIGNvZGUgaWYgaXQncyBpbXBvc3NpYmxlIHRvIGZldGNoIGEgcGJ1ZiBvbiBhIFRDUCBjb25uZWN0aW9uIChhbmQgbm90CisgICAgZGlyZWN0bHkgY2xvc2UgdGhlIHJlY3ZtYm94KS4KKworICAyMDA3LTA1LTIyIFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmM6IEZpeGVkIGJ1ZyAjMTg5NSAodGNwX2JpbmQgbm90IGNvcnJlY3QpIGJ5IGludHJvZHVjaW5nIGEgbGlzdCBvZgorICAgIGJvdW5kIGJ1dCB1bmNvbm5lY3RlZCAoYW5kIG5vbi1saXN0ZW5pbmcpIHRjcF9wY2JzLgorCisgIDIwMDctMDUtMjIgRnLpZOlyaWMgQmVybm9uCisgICogc3lzLmgsIHN5cy5jLCBhcGlfbGliLmMsIHRjcGlwLmM6IHJlbW92ZSBzeXNfbWJveF9mZXRjaF90aW1lb3V0KCkgKHdhcyBvbmx5CisgICAgdXNlZCBmb3IgTFdJUF9TT19SQ1ZUSU1FTyBvcHRpb24pIGFuZCB1c2Ugc3lzX2FyY2hfbWJveF9mZXRjaCgpIGluc3RlYWQgb2YKKyAgICBzeXNfbWJveF9mZXRjaCgpIGluIGFwaSBmaWxlcy4gTm93LCB1c2VycyBTSE9VTEQgTk9UIHVzZSBpbnRlcm5hbCBsd0lQIGZlYXR1cmVzCisgICAgbGlrZSAic3lzX3RpbWVvdXQiIGluIHRoZWlyIGFwcGxpY2F0aW9uIHRocmVhZHMuCisKKyAgMjAwNy0wNS0yMiBGculk6XJpYyBCZXJub24KKyAgKiBhcGkuaCwgYXBpX2xpYi5jLCBhcGlfbXNnLmgsIGFwaV9tc2cuYzogY2hhbmdlIHRoZSBzdHJ1Y3QgYXBpX21zZ19tc2cgdG8gc2VlCisgICAgd2hpY2ggcGFyYW1ldGVycyBhcmUgdXNlZCBieSB3aGljaCBkb194eHggZnVuY3Rpb24sIGFuZCB0byBhdm9pZCAibWlzdXNpbmciCisgICAgcGFyYW1ldGVycyAocGF0Y2ggIzU5MzgpLgorCisgIDIwMDctMDUtMjIgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBhcGlfbGliLmMsIGFwaV9tc2cuYywgcmF3LmMsIGFwaS5oLCBhcGlfbXNnLmgsIHJhdy5oOiBJbmNsdWRlZCBwYXRjaCAjNTkzODoKKyAgICBjaGFuZ2VkIHJhd19wY2IucHJvdG9jb2wgZnJvbSB1MTZfdCB0byB1OF90IHNpbmNlIGZvciBJUHY0IGFuZCBJUHY2LCBwcm90bworICAgIGlzIG9ubHkgOCBiaXRzIHdpZGUuIFRoaXMgYWZmZWN0cyB0aGUgYXBpLCBhcyB0aGVyZSwgdGhlIHByb3RvY29sIHdhcworICAgIHUxNl90LCB0b28uCisKKyAgMjAwNy0wNS0xOCBTaW1vbiBHb2xkc2NobWlkdAorICAqIG1lbXAuYzogYWRkaXRpb24gdG8gcGF0Y2ggIzU5MTM6IHNtYWxsZXIgcG9pbnRlciB3YXMgcmV0dXJuZWQgYnV0CisgICAgbWVtcF9tZW1vcnkgd2FzIHRoZSBzYW1lIHNpemUgLT4gZGlkIG5vdCBzYXZlIG1lbW9yeS4KKworICAyMDA3LTA1LTE2IFNpbW9uIEdvbGRzY2htaWR0CisgICogbG9vcGlmLmMsIHNsaXBpZi5jOiBGaXggYnVnICMxOTcyOTogZnJlZSBwYnVmIGlmIG5ldGlmLT5pbnB1dCgpIHJldHVybnMKKyAgICAhPSBFUlJfT0suCisKKyAgMjAwNy0wNS0xNiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGFwaV9tc2cuYywgdWRwLmM6IElmIGEgdWRwX3BjYiBoYXMgYSBsb2NhbF9pcCBzZXQsIGNoZWNrIGlmIGl0IGlzIHRoZSBzYW1lCisgICAgYXMgdGhlIG9uZSBvZiB0aGUgbmV0aWYgdXNlZCBmb3Igc2VuZGluZyB0byBwcmV2ZW50IHNlbmRpbmcgZnJvbSBvbGQKKyAgICBhZGRyZXNzZXMgYWZ0ZXIgYSBuZXRpZiBhZGRyZXNzIGdldHMgY2hhbmdlZCAocGFydGx5IGZpeGVzIGJ1ZyAjMzE2OCkuCisKKyAgMjAwNy0wNS0xNiBGculk6XJpYyBCZXJub24KKyAgKiB0Y3BpcC5jLCBpZ21wLmgsIGlnbXAuYzogRml4ZWQgYnVnICIjMTk4MDAgOiBJR01QOiBpZ21wX3RpY2soKSB3aWxsIG5vdCB3b3JrCisgICAgd2l0aCBOT19TWVM9MSIuIE5vdGUgdGhhdCBpZ21wX2luaXQgaXMgYWx3YXlzIGluIHRjcGlwX3RocmVhZCAoYW5kIG5vdCBpbiAKKyAgICB0Y3BpcF9pbml0KSBiZWNhdXNlIHdlIGhhdmUgdG8gYmUgc3VyZSB0aGF0IG5ldHdvcmsgaW50ZXJmYWNlcyBhcmUgYWxyZWFkeQorICAgIGFkZGVkIChtYWMgZmlsdGVyIGlzIHVwZGF0ZWQgb25seSBpbiBpZ21wX2luaXQgZm9yIHRoZSBtb21lbnQpLgorCisgIDIwMDctMDUtMTYgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtZW0uYywgbWVtcC5jOiBSZW1vdmVkIHNlbWFwaG9yZXMgZnJvbSBtZW1wLCBjaGFuZ2VkIHN5c19zZW1fd2FpdCBjYWxscworICAgIGludG8gc3lzX2FyY2hfc2VtX3dhaXQgY2FsbHMgdG8gcHJldmVudCB0aW1lcnMgZnJvbSBydW5uaW5nIHdoaWxlIHdhaXRpbmcKKyAgICBmb3IgdGhlIGhlYXAuIFRoaXMgZml4ZXMgYnVnICMxOTE2Ny4KKworICAyMDA3LTA1LTEzIFNpbW9uIEdvbGRzY2htaWR0CisgICogdGNwLmgsIHNvY2tldHMuaCwgc29ja2V0cy5jOiBGaXhlZCBidWcgZnJvbSBwYXRjaCAjNTg2NSBieSBtb3ZpbmcgdGhlIGRlZmluZXMKKyAgICBmb3Igc29ja2V0IG9wdGlvbnMgKGx3aXBfc2V0Ly1nZXRzb2Nrb3B0KSB1c2VkIHdpdGggbGV2ZWwgSVBQUk9UT19UQ1AgZnJvbQorICAgIHRjcC5oIHRvIHNvY2tldHMuaC4KKworICAyMDA3LTA1LTA3IFNpbW9uIEdvbGRzY2htaWR0CisgICogbWVtLmM6IEFub3RoZXIgYXR0ZW1wdCB0byBmaXggYnVnICMxNzkyMi4KKworICAyMDA3LTA1LTA0IFNpbW9uIEdvbGRzY2htaWR0CisgICogcGJ1Zi5jLCBwYnVmLmgsIGV0aGFycC5jOiBGdXJ0aGVyIHVwZGF0ZSB0byBBUlAgcXVldWVpbmc6IENoYW5nZWQgcGJ1Zl9jb3B5KCkKKyAgICBpbXBsZW1lbnRhdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSByZXVzZWQgKGRvbid0IGFsbG9jYXRlIHRoZSB0YXJnZXQKKyAgICBwYnVmIGluc2lkZSBwYnVmX2NvcHkoKSkuCisKKyAgMjAwNy0wNS0wNCBTaW1vbiBHb2xkc2NobWlkdAorICAqIG1lbXAuYzogY2hlY2tlZCBpbiBwYXRjaCAjNTkxMzogaW4gbWVtcF9tYWxsb2MoKSB3ZSBjYW4gcmV0dXJuIG1lbXAgYXMgbWVtCisgICAgdG8gc2F2ZSBhIGxpdHRsZSBSQU0gKG5leHQgcG9pbnRlciBvZiBtZW1wIGlzIG5vdCB1c2VkIHdoaWxlIG5vdCBpbiBwb29sKS4KKworICAyMDA3LTA1LTAzICJtYXEiCisgICogc29ja2V0cy5jOiBGaXggaW9jdGwgRklPTlJFQUQgd2hlbiBzb21lIGRhdGEgcmVtYWlucyBmcm9tIGxhc3QgcmVjdi4KKyAgICAocGF0Y2ggIzM1NzQpLgorCisgIDIwMDctMDQtMjMgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBsb29waWYuYywgbG9vcGlmLmgsIG9wdC5oLCBzcmMvbmV0aWYvRklMRVM6IGZpeCBidWcgIzI1OTU6ICJsb29waWYgcmVzdWx0cworICAgIGluIE5VTEwgcmVmZXJlbmNlIGZvciBpbmNvbWluZyBUQ1AgcGFja2V0cyIuIExvb3BpZiBoYXMgdG8gYmUgY29uZmlndXJlZAorICAgICh1c2luZyBMV0lQX0xPT1BJRl9NVUxUSVRIUkVBRElORykgdG8gZGlyZWN0bHkgY2FsbCBuZXRpZi0+aW5wdXQoKQorICAgIChtdWx0aXRocmVhZGluZyBlbnZpcm9ubWVudHMsIGUuZy4gbmV0aWYtPmlucHV0KCkgPSB0Y3BpcF9pbnB1dCgpKSBvcgorICAgIHB1dHRpbmcgcGFja2V0cyBvbiBhIGxpc3QgdGhhdCBpcyBmZWQgdG8gdGhlIHN0YWNrIGJ5IGNhbGxpbmcgbG9vcGlmX3BvbGwoKQorICAgIChzaW5nbGUtdGhyZWFkIC8gTk9fU1lTIC8gcG9sbGluZyBlbnZpcm9ubWVudCB3aGVyZSBlLmcuCisgICAgbmV0aWYtPmlucHV0KCkgPSBpcF9pbnB1dCkuCisKKyAgMjAwNy0wNC0xNyBKb25hdGhhbiBMYXJtb3VyCisgICogcGJ1Zi5jOiBVc2UgczMyX3QgaW4gcGJ1Zl9yZWFsbG9jKCksIGFzIGFuIHMxNl90IGNhbid0IHJlbGlhYmx5IGhvbGQKKyAgICB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byB1MTZfdCdzLgorICAqIHNvY2tldHMuaDogRkRfU0VUU0laRSBuZWVkcyB0byBtYXRjaCBudW1iZXIgb2Ygc29ja2V0cywgd2hpY2ggaXMKKyAgICBNRU1QX05VTV9ORVRDT05OIGluIHNvY2tldHMuYyByaWdodCBub3cuCisKKyAgMjAwNy0wNC0xMiBKb25hdGhhbiBMYXJtb3VyCisgICogaWNtcC5jOiBSZXNldCBJUCBoZWFkZXIgVFRMIGluIElDTVAgRUNITyByZXNwb25zZXMgKGJ1ZyAjMTk1ODApLgorCisgIDIwMDctMDQtMTIgS2llcmFuIE1hbnNsZXkKKyAgKiB0Y3AuYywgdGNwX2luLmMsIHRjcF9vdXQuYywgdGNwLmg6IE1vZGlmeSB3YXkgdGhlIHJldHJhbnNtaXNzaW9uCisgICAgdGltZXIgaXMgcmVzZXQgdG8gZml4IGJ1ZyMxOTQzNCwgd2l0aCBoZWxwIGZyb20gT2xlZyBUeXNoZXYuCisKKyAgMjAwNy0wNC0xMSBTaW1vbiBHb2xkc2NobWlkdAorICAqIGV0aGFycC5jLCBwYnVmLmMsIHBidWYuaDogM3JkIGZpeCBmb3IgYnVnICMxMTQwMCAoYXJwLXF1ZXVpbmcpOiBNb3JlIHBidWZzIHRoYW4KKyAgICBwcmV2aW91c2x5IHRob3VnaHQgbmVlZCB0byBiZSBjb3BpZWQgKGV2ZXJ5dGhpbmcgYnV0IFBCVUZfUk9NISkuIENsZWFuZWQgdXAKKyAgICBwYnVmLmM6IHJlbW92ZWQgZnVuY3Rpb25zIG5vIG5lZWRlZCBhbnkgbW9yZSAoYnkgZXRoYXJwKS4KKworICAyMDA3LTA0LTExIEtpZXJhbiBNYW5zbGV5CisgICogaW5ldC5jLCBpcF9hZGRyLmgsIHNvY2tldHMuaCwgc3lzLmgsIHRjcC5oOiBBcHBseSBwYXRjaCAjNTc0NTogRml4CisgICAgIkNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzIHdpdGggMTZiaXQgY29tcGlsZXJzLiAgQ29udHJpYnV0ZWQgYnkKKyAgICBhdmF0YXJAbW1sYWIuY3NlLnl6dS5lZHUudHcKKworICAyMDA3LTA0LTA1IEZy6WTpcmljIEJlcm5vbiwgSm9uYXRoYW4gTGFybW91cgorICAqIGFwaV9tc2cuYzogRml4IGJ1ZyAjMTY4MzA6ICJlcnJfdGNwKCkgcG9zdHMgdG8gY29ubmVjdGlvbiBtYWlsYm94IHdoZW4gbm8gcGVuZCBvbgorICAgIHRoZSBtYWlsYm94IGlzIGFjdGl2ZSIuIE5vdywgdGhlIHBvc3QgaXMgb25seSBkb25lIGR1cmluZyBhIGNvbm5lY3QsIGFuZCBkb19zZW5kLAorICAgIGRvX3dyaXRlIGFuZCBkb19qb2luX2xlYXZlX2dyb3VwIGRvbid0IGRvIGFueXRoaW5nIGlmIGEgcHJldmlvdXMgZXJyb3Igd2FzIHNpZ25hbGVkLgorCisgIDIwMDctMDQtMDMgRnLpZOlyaWMgQmVybm9uCisgICogaXAuYzogRG9uJ3Qgc2V0IHRoZSBJUF9ERiAoIkRvbid0IGZyYWdtZW50IikgZmxhZyBpbiB0aGUgSVAgaGVhZGVyIGluIElQIG91dHB1dAorICAgIHBhY2tldHMuIFNlZSBwYXRjaCAjNTgzNC4KKworICAyMDA3LTAzLTMwIEZy6WTpcmljIEJlcm5vbgorICAqIGFwaV9tc2cuYzogYWRkIGEgInBjYl9uZXciIGhlbHBlciBmdW5jdGlvbiB0byBhdm9pZCByZWR1bmRhbnQgY29kZSwgYW5kIHRvIGFkZAorICAgIG1pc3NpbmcgIHBjYiBhbGxvY2F0aW9ucyBjaGVja2luZyAoaW4gZG9fYmluZCwgYW5kIGZvciBlYWNoIHJhd19uZXcpLiBGaXggc3R5bGUuCisKKyAgMjAwNy0wMy0zMCBGculk6XJpYyBCZXJub24KKyAgKiBtb3N0IG9mIGZpbGVzOiBwcmVmaXggYWxsIGRlYnVnLmggZGVmaW5lIHdpdGggIkxXSVBfIiB0byBhdm9pZCBhbnkgY29uZmxpY3Qgd2l0aAorICAgIG90aGVycyBlbnZpcm9ubWVudCBkZWZpbmVzICh0aGVzZSB3ZXJlIHRvbyAiZ2VuZXJpYyIpLgorCisgIDIwMDctMDMtMjggRnLpZOlyaWMgQmVybm9uCisgICogYXBpLmgsIGFwaV9saWIuYywgc29ja2V0cy5jOiBuZXRidWZfcmVmIGRvZXNuJ3QgY2hlY2sgaXRzIGludGVybmFsIHBidWZfYWxsb2MgY2FsbAorICAgIHJlc3VsdCBhbmQgY2FuIGNhdXNlIGEgY3Jhc2guIGx3aXBfc2VuZCBub3cgY2hlY2sgbmV0YnVmX3JlZiByZXN1bHQuCisKKyAgMjAwNy0wMy0yOCBTaW1vbiBHb2xkc2NobWlkdAorICAqIHNvY2tldHMuYyBSZW1vdmUgIiNpbmNsdWRlIDxlcnJuby5oPiIgZnJvbSBzb2NrZXRzLmMgdG8gYXZvaWQgbXVsdGlwbGUKKyAgICBkZWZpbml0aW9uIG9mIG1hY3JvcyAoaW4gZXJybm8uaCBhbmQgbHdpcC9hcmNoLmgpIGlmIExXSVBfUFJPVklERV9FUlJOTyBpcworICAgIGRlZmluZWQuIFRoaXMgaXMgdGhlIHdheSBpdCBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgKGxvb2tpbmcgYXQKKyAgICBkb2Mvc3lzX2FyY2gudHh0KQorCisgIDIwMDctMDMtMjggS2llcmFuIE1hbnNsZXkKKyAgKiBvcHQuaCBDaGFuZ2UgZGVmYXVsdCBQQlVGX1BPT0xfQlVGU0laRSAoYWdhaW4pIHRvIGFjY29tb2RhdGUgZGVmYXVsdCBNU1MgKworICAgIElQIGFuZCBUQ1AgaGVhZGVycyAqYW5kKiBwaHlzaWNhbCBsaW5rIGhlYWRlcnMKKworICAyMDA3LTAzLTI2IEZy6WTpcmljIEJlcm5vbiAoYmFzZWQgb24gcGF0Y2ggZnJvbSBEbWl0cnkgUG90YXBvdikKKyAgKiBhcGlfbGliLmM6IHBhdGNoIGZvciBuZXRjb25uX3dyaXRlKCksIGZpeGVzIGEgcG9zc2libGUgcmFjZSBjb25kaXRpb24gd2hpY2ggY2F1c2UKKyAgICB0byBzZW5kIHNvbWUgZ2FyYmFnZS4gSXQgaXMgbm90IGEgZGVmaW5pdGl2ZSBzb2x1dGlvbiwgYnV0IHRoZSBwYXRjaCBkb2VzIHNvbHZlCisgICAgdGhlIHByb2JsZW0gZm9yIG1vc3QgY2FzZXMuCisKKyAgMjAwNy0wMy0yMiBGculk6XJpYyBCZXJub24KKyAgKiBhcGlfbXNnLmgsIGFwaV9tc2cuYzogUmVtb3ZlIG9ic29sZXRlIEFQSV9NU0dfQUNDRVBUIGFuZCBkb19hY2NlcHQgKG5ldmVyIHVzZWQpLgorCisgIDIwMDctMDMtMjIgRnLpZOlyaWMgQmVybm9uCisgICogYXBpX2xpYi5jOiBzb21lcyByZXNvdXJjZXMgY291bGRuJ3QgYmUgZnJlZWQgaWYgdGhlcmUgd2FzIGVycm9ycyBkdXJpbmcKKyAgICBuZXRjb25uX25ld193aXRoX3Byb3RvX2FuZF9jYWxsYmFjay4KKworICAyMDA3LTAzLTIyIEZy6WTpcmljIEJlcm5vbgorICAqIGV0aGVybmV0aWYuYzogdXBkYXRlIG5ldGlmLT5pbnB1dCBjYWxscyB0byBjaGVjayByZXR1cm4gdmFsdWUuIEluIG9sZGVyIHBvcnRzLAorICAgIGl0J3MgYSBnb29kIGlkZWEgdG8gdXBncmFkZSB0aGVtLCBldmVuIGlmIGJlZm9yZSwgdGhlcmUgY291bGQgYmUgYW5vdGhlciBwcm9ibGVtCisgICAgKGFjY2VzcyB0byBhbiB1bmluaXRpYWxpemVkIG1haWxib3gpLgorCisgIDIwMDctMDMtMjEgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBzb2NrZXRzLmM6IGZpeGVkIGJ1ZyAjNTA2NyAoZXNzZW50aWFseSBhIHNpZ25lZC91bnNpZ25lZCB3YXJuaW5nIGZpeGVkCisgICAgYnkgY2FzdGluZyB0byB1bnNpZ25lZCkuCisKKyAgMjAwNy0wMy0yMSBGculk6XJpYyBCZXJub24KKyAgKiBhcGlfbGliLmMsIGFwaV9tc2cuYywgdGNwaXAuYzogaW50ZWdyYXRlIHN5c19tYm94X2ZldGNoKGNvbm4tPm1ib3gsIE5VTEwpIGNhbGxzIGZyb20KKyAgICBhcGlfbGliLmMgdG8gdGNwaXAuYydzIHRjcGlwX2FwaW1zZygpLiBOb3csIHVzZSBhIGxvY2FsIHZhcmlhYmxlIGFuZCBub3QgYQorICAgIGR5bmFtaWMgb25lIGZyb20gbWVtcCB0byBzZW5kIHRjcGlwX21zZyB0byB0Y3BpcF90aHJlYWQgaW4gYSBzeW5jaHJvbmUgY2FsbC4KKyAgICBGcmVlIHRjcGlwX21zZyBmcm9tIHRjcGlwX2FwaW1zZyBpcyBub3QgZG9uZSBpbiB0Y3BpcF90aHJlYWQuIFRoaXMgZ2l2ZSBhCisgICAgZmFzdGVyIGFuZCBtb3JlIHJlbGlhYmxlIGNvbW11bmljYXRpb24gYmV0d2VlbiBhcGlfbGliIGFuZCB0Y3BpcC4KKworICAyMDA3LTAzLTIxIEZy6WTpcmljIEJlcm5vbgorICAqIG9wdC5oOiBBZGQgTFdJUF9ORVRJRl9DQUxMQkFDSyAodG8gYXZvaWQgY29tcGlsZXIgd2FybmluZykgYW5kIHNldCBpdCB0byAwLgorCisgIDIwMDctMDMtMjEgRnLpZOlyaWMgQmVybm9uCisgICogYXBpX21zZy5jLCBpZ21wLmMsIGlnbXAuaDogRml4IEMrKyBzdHlsZSBjb21tZW50cworCisgIDIwMDctMDMtMjEgS2llcmFuIE1hbnNsZXkKKyAgKiBvcHQuaCBDaGFuZ2UgZGVmYXVsdCBQQlVGX1BPT0xfQlVGU0laRSB0byBhY2NvbW9kYXRlIGRlZmF1bHQgTVNTICsKKyAgICBJUCBhbmQgVENQIGhlYWRlcnMKKworICAyMDA3LTAzLTIxIEtpZXJhbiBNYW5zbGV5CisgICogRml4IGFsbCB1c2VzIG9mIHBidWZfaGVhZGVyIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUuICBJbiBzb21lCisgICAgY2FzZXMganVzdCBhc3NlcnQgaWYgaXQgZmFpbHMgYXMgSSdtIG5vdCBzdXJlIGhvdyB0byBmaXggdGhlbSwgYnV0CisgICAgdGhpcyBpcyBubyB3b3JzZSB0aGFuIGJlZm9yZSB3aGVuIHRoZXkgd291bGQgY2Fycnkgb24gcmVnYXJkbGVzcworICAgIG9mIHRoZSBmYWlsdXJlLgorCisgIDIwMDctMDMtMjEgS2llcmFuIE1hbnNsZXkKKyAgKiBzb2NrZXRzLmMsIGlnbXAuYywgaWdtcC5oLCBtZW1wLmg6IEZpeCBDKysgc3R5bGUgY29tbWVudHMgYW5kCisgICAgY29tbWVudCBvdXQgbWlzc2luZyBoZWFkZXIgaW5jbHVkZSBpbiBpY21wLmMKKworICAyMDA3LTAzLTIwIEZy6WTpcmljIEJlcm5vbgorICAqIG1lbXAuaCwgc3RhdHMuYzogRml4IHN0YXRzX2Rpc3BsYXkgZnVuY3Rpb24gd2hlcmUgbWVtcF9uYW1lcyB0YWJsZSB3YXNuJ3QKKyAgICBzeW5jaHJvbml6ZWQgd2l0aCBtZW1wLmguCisKKyAgMjAwNy0wMy0yMCBGculk6XJpYyBCZXJub24KKyAgKiB0Y3BpcC5jOiBJbml0aWFsaXplIHRjcGlwJ3MgbWJveCwgYW5kIHZlcmlmeSBpZiBpbml0aWFsaXplZCBpbiB0Y3BpcF9pbnB1dCwKKyAgICB0Y3BpcF9ldGhpbnB1dCwgdGNwaXBfY2FsbGJhY2ssIHRjcGlwX2FwaW1zZywgdG8gZml4IGEgaW5pdCBwcm9ibGVtIHdpdGggCisgICAgbmV0d29yayBpbnRlcmZhY2VzLiBBbHNvIGZpeCBhIGNvbXBpbGVyIHdhcm5pbmcuCisKKyAgMjAwNy0wMy0yMCBLaWVyYW4gTWFuc2xleQorICAqIHVkcC5jOiBPbmx5IHRyeSBhbmQgdXNlIHBidWZfaGVhZGVyKCkgdG8gbWFrZSBzcGFjZSBmb3IgaGVhZGVycyBpZgorICAgIG5vdCBhIFJPTSBvciBSRUYgcGJ1Zi4KKworICAyMDA3LTAzLTE5IEZy6WTpcmljIEJlcm5vbgorICAqIGFwaV9tc2cuaCwgYXBpX21zZy5jLCB0Y3BpcC5oLCB0Y3BpcC5jOiBBZGQgcmV0dXJuIHR5cGVzIHRvIHRjcGlwX2FwaW1zZygpCisgICAgYW5kIGFwaV9tc2dfcG9zdCgpLgorCisgIDIwMDctMDMtMTkgRnLpZOlyaWMgQmVybm9uCisgICogUmVtb3ZlIHVuaW1wbGVtZW50ZWQgIm1lbXBfcmVhbGxvYyIgZnVuY3Rpb24gZnJvbSBtZW1wLmguCisKKyAgMjAwNy0wMy0xMSBTaW1vbiBHb2xkc2NobWlkdAorICAqIHBidWYuYzogY2hlY2tlZCBpbiBwYXRjaCAjNTc5NjogcGJ1Zl9hbGxvYzogbGVuIGZpZWxkIGNsYWN1bGF0aW9uIGNhdXNlZAorICAgIG1lbW9yeSBjb3JydXB0aW9uLgorCisgIDIwMDctMDMtMTEgU2ltb24gR29sZHNjaG1pZHQgKGJhc2VkIG9uIHBhdGNoIGZyb20gRG1pdHJ5IFBvdGFwb3YpCisgICogYXBpX2xpYi5jLCBzb2NrZXRzLmMsIGFwaS5oLCBhcGlfbXNnLmgsIHNvY2tldHMuaDogRml4ZWQgYnVnICMxOTI1MQorICAgIChtaXNzaW5nIGBjb25zdCcgcXVhbGlmaWVyIGluIHNvY2tldCBmdW5jdGlvbnMpLCB0byBnZXQgbW9yZSBjb21wYXRpYmxlIHRvCisgICAgc3RhbmRhcmQgUE9TSVggc29ja2V0cy4KKworICAyMDA3LTAzLTExIEZy6WTpcmljIEJlcm5vbiAoYmFzZWQgb24gcGF0Y2ggZnJvbSBEbWl0cnkgUG90YXBvdikKKyAgKiBzb2NrZXRzLmM6IEFkZCBhc3NlcnRzIGluc2lkZSBiaW5kLCBjb25uZWN0IGFuZCBzZW5kdG8gdG8gY2hlY2sgaW5wdXQKKyAgICBwYXJhbWV0ZXJzLiBSZW1vdmUgZXhjZXNzaXZlIHNldF9lcnJubygpIGNhbGxzIGFmdGVyIGdldF9zb2NrZXQoKSwgYmVjYXVzZQorICAgIGVycm5vIGlzIHNldCBpbnNpZGUgb2YgZ2V0X3NvY2tldCgpLiBNb3ZlIGxhc3Qgc29ja19zZXRfZXJybm8oKSBpbnNpZGUKKyAgICBsd2lwX2Nsb3NlLgorCisgIDIwMDctMDMtMDkgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBtZW1wLmM6IEZpeGVkIGJ1ZyAjMTE0MDA6IE5ldyBldGhhcnAgcXVldWVpbmcgaW50cm9kdWNlZCBidWc6IG1lbXBfbWVtb3J5CisgICAgd2FzIGFsbG9jYXRlZCB0b28gc21hbGwuCisKKyAgMjAwNy0wMy0wNiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcGlwLmM6IEluaXRpYWxpemUgZGhjcCB0aW1lcnMgaW4gdGNwaXBfdGhyZWFkIChpZiBMV0lQX0RIQ1ApIHRvIHByb3RlY3QKKyAgICB0aGUgc3RhY2sgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKworICAyMDA3LTAzLTA2IEZy6WTpcmljIEJlcm5vbiwgRG1pdHJ5IFBvdGFwb3YKKyAgKiB0Y3BpcC5jLCBpcF9mcmFnLmMsIGV0aGVybmV0aWYuYzogRml4IHNvbWUgYnVpbGQgcHJvYmxlbXMsIGFuZCBhIHJlZHVuZGFuY3kKKyAgICBjYWxsIHRvICJsd2lwX3N0YXRzLmxpbmsucmVjdisrOyIgaW4gbG93X2xldmVsX2lucHV0KCkgJiBldGhlcm5ldGlmX2lucHV0KCkuCisKKyAgMjAwNy0wMy0wNiBTaW1vbiBHb2xkc2NobWlkdAorICAqIGlwX2ZyYWcuYywgaXBfZnJhZy5oOiBSZWR1Y2UgY29kZSBzaXplOiBkb24ndCBpbmNsdWRlIGNvZGUgaW4gdGhvc2UgZmlsZXMKKyAgICBpZiBJUF9GUkFHID09IDAgYW5kIElQX1JFQVNTRU1CTFkgPT0gMAorCisgIDIwMDctMDMtMDYgRnLpZOlyaWMgQmVybm9uLCBTaW1vbiBHb2xkc2NobWlkdAorICAqIG9wdC5oLCBpcF9mcmFnLmgsIHRjcGlwLmgsIHRjcGlwLmMsIGV0aGVybmV0aWYuYzogYWRkIG5ldyBjb25maWd1cmF0aW9uCisgICAgb3B0aW9uIG5hbWVkIEVUSEFSUF9UQ1BJUF9FVEhJTlBVVCwgd2hpY2ggZW5hYmxlIHRoZSBuZXcgdGNwaXBfZXRoaW5wdXQuCisgICAgQWxsb3cgdG8gZG8gQVJQIHByb2Nlc3NpbmcgZm9yIGluY29taW5nIHBhY2tldHMgaW5zaWRlIHRjcGlwX3RocmVhZAorICAgIChwcm90ZWN0aW5nIEFSUCBsYXllciBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzKS4gWW91IGNhbiBhbHNvIGRpc2FibGUKKyAgICBvbGQgY29kZSB1c2luZyB0Y3BfaW5wdXQgd2l0aCBuZXcgZGVmaW5lIEVUSEFSUF9UQ1BJUF9JTlBVVCBzZXQgdG8gMC4KKyAgICBPbGRlciBwb3J0cyBoYXZlIHRvIHVzZSB0Y3BpcF9ldGhpbnB1dC4KKworICAyMDA3LTAzLTA2IFNpbW9uIEdvbGRzY2htaWR0IChiYXNlZCBvbiBwYXRjaCBmcm9tIERtaXRyeSBQb3RhcG92KQorICAqIGVyci5oLCBlcnIuYzogZml4ZWQgY29tcGlsZXIgd2FybmluZyAiaW5pdGlhbGl6YXRpb24gZGlyY2FyZHMgcXVhbGlmaWVycworICAgIGZyb20gcG9pbnRlciB0YXJnZXQgdHlwZSIKKworICAyMDA3LTAzLTA1IEZy6WTpcmljIEJlcm5vbgorICAqIG9wdC5oLCBzb2NrZXRzLmg6IGFkZCBuZXcgY29uZmlndXJhdGlvbiBvcHRpb25zIChMV0lQX1BPU0lYX1NPQ0tFVFNfSU9fTkFNRVMsCisgICAgRVRIQVJQX1RSVVNUX0lQX01BQywgcmV2aWV3IFNPX1JFVVNFKQorCisgIDIwMDctMDMtMDQgRnLpZOlyaWMgQmVybm9uCisgICogYXBpX21zZy5jOiBSZW1vdmUgc29tZSBjb21waWxlciB3YXJuaW5ncyA6IHBhcmFtZXRlciAicGNiIiB3YXMgbmV2ZXIKKyAgICByZWZlcmVuY2VkLgorCisgIDIwMDctMDMtMDQgRnLpZOlyaWMgQmVybm9uCisgICogYXBpX2xpYi5jOiBGaXggIltwYXRjaCAjNTc2NF0gYXBpX2xpYi5jIGNsZWFudXA6IGFmdGVyIHBhdGNoICM1Njg3IiAoZnJvbQorICAgIERtaXRyeSBQb3RhcG92KS4KKyAgICBUaGUgYXBpX21zZyBzdHJ1Y3Qgc3RheSBvbiB0aGUgc3RhY2sgKG5vdCBtb3ZlZCB0byBuZXRjb25uIHN0cnVjdCkuCisKKyAgMjAwNy0wMy0wNCBTaW1vbiBHb2xkc2NobWlkdCAoYmFzZWQgb24gcGF0Y2ggZnJvbSBEbWl0cnkgUG90YXBvdikKKyAgKiBwYnVmLmM6IEZpeCBCVUcjMTkxNjggLSBwYnVmX2ZyZWUgY2FuIGNhdXNlIGRlYWRsb2NrIChpZgorICAgIFNZU19MSUdIVFdFSUdIVF9QUk9UPTEgJiBmcmVlaW5nIFBCVUZfUkFNIHdoZW4gbWVtX3NlbSBpcyBub3QgYXZhaWxhYmxlKQorICAgIEFsc28gZml4ZWQgY2FzdCB3YXJuaW5nIGluIHBidWZfYWxsb2MoKQorCisgIDIwMDctMDMtMDQgU2ltb24gR29sZHNjaG1pZHQKKyAgKiBldGhhcnAuYywgZXRoYXJwLmgsIG1lbXAuYywgbWVtcC5oLCBvcHQuaDogRml4IEJVRyMxMTQwMCAtIGRvbid0IGNvcnJ1cHQKKyAgICBleGlzdGluZyBwYnVmIGNoYWluIHdoZW4gZW5xdWV1aW5nIG11bHRpcGxlIHBidWZzIHRvIGEgcGVuZGluZyBBUlAgcmVxdWVzdAorCisgIDIwMDctMDMtMDMgRnLpZOlyaWMgQmVybm9uCisgICogdWRwLmM6IHJlbW92ZSBvYnNvbGV0ZSBsaW5lICJzdGF0aWMgc3RydWN0IHVkcF9wY2IgKnBjYl9jYWNoZSA9IE5VTEw7IgorICAgIEl0IGlzIHN0YXRpYywgYW5kIG5ldmVyIHVzZWQgaW4gdWRwLmMgZXhjZXB0IHVkcF9pbml0KCkuCisKKyAgMjAwNy0wMy0wMiBTaW1vbiBHb2xkc2NobWlkdAorICAqIHRjcGlwLmM6IE1vdmVkIGNhbGwgdG8gaXBfaW5pdCgpLCB1ZHBfaW5pdCgpIGFuZCB0Y3BfaW5pdCgpIGZyb20KKyAgICB0Y3BpcF90aHJlYWQoKSB0byB0Y3BpcF9pbml0KCkuIFRoaXMgd2F5LCByYXcgQVBJIGNvbm5lY3Rpb25zIGNhbiBiZQorICAgIGluaXRpYWxpemVkIGJlZm9yZSB0Y3BpcF90aHJlYWQgaXMgcnVubmluZyAoZS5nLiBiZWZvcmUgT1MgaXMgc3RhcnRlZCkKKworICAyMDA3LTAzLTAyIEZy6WTpcmljIEJlcm5vbgorICAqIHJhd2FwaS50eHQ6IEZpeCBkb2N1bWVudGF0aW9uIG1pc21hdGNoIHdpdGggZXRoYXJwLmggYWJvdXQgZXRoYXJwX3RtcidzIGNhbGwKKyAgICBpbnRlcnZhbC4KKworICAyMDA3LTAyLTI4IEtpZXJhbiBNYW5zbGV5IAorICAqIHBidWYuYzogRml4IEJVRyMxNzY0NSAtIGVuc3VyZSBwYnVmIHBheWxvYWQgcG9pbnRlciBpcyBub3QgbW92ZWQKKyAgICBvdXRzaWRlIHRoZSByZWdpb24gb2YgdGhlIHBidWYgYnkgcGJ1Zl9oZWFkZXIoKQorCisgIDIwMDctMDItMjggS2llcmFuIE1hbnNsZXkgCisgICogc29ja2V0cy5jOiBGaXggQlVHIzE5MTYxIC0gZW5zdXJlIG1pbGxpc2Vjb25kcyB0aW1lb3V0IGlzIG5vbi16ZXJvCisgICAgd2hlbiBzdXBwbGllZCB0aW1lb3V0IGlzIGFsc28gbm9uLXplcm8gCisKKyhTVEFCTEUtMS4yLjApCisKKyAgMjAwNi0xMi0wNSBMZW9uIFdvZXN0ZW5iZXJnCisgICogQ0hBTkdFTE9HOiBNZW50aW9uIFNUQUJMRS0xLjIuMCByZWxlYXNlLgorCisgICsrIE5ldyBmZWF0dXJlczoKKworICAyMDA2LTEyLTAxIENocmlzdGlhYW4gU2ltb25zCisgICogbWVtLmgsIG9wdC5oOiBBZGRlZCBNRU1fTElCQ19NQUxMT0Mgb3B0aW9uLgorICAgIE5vdGUgdGhpcyBpcyBhIHdvcmthcm91bmQuIEN1cnJlbnRseSBJIGhhdmUgbm8gb3RoZXIgb3B0aW9ucyBsZWZ0LgorCisgIDIwMDYtMTAtMjYgQ2hyaXN0aWFhbiBTaW1vbnMgKGFjY2VwdGVkIHBhdGNoIGJ5IEpvbmF0aGFuIExhcm1vdXIpCisgICogaXB2NC9pcF9mcmFnLmM6IHJlbmFtZSBNQVhfTVRVIHRvIElQX0ZSQUdfTUFYX01UVSBhbmQgbW92ZSBkZWZpbmUKKyAgICB0byBpbmNsdWRlL2x3aXAvb3B0LmguCisgICogaXB2NC9sd2lwL2lwX2ZyYWcuaDogUmVtb3ZlIHVudXNlZCBJUF9SRUFTU19JTlRFUlZBTC4KKyAgICBNb3ZlIElQX1JFQVNTX01BWEFHRSBhbmQgSVBfUkVBU1NfQlVGU0laRSB0byBpbmNsdWRlL2x3aXAvb3B0LmguCisgICogb3B0Lmg6IEFkZCBhYm92ZSBuZXcgb3B0aW9ucy4KKworICAyMDA2LTA4LTE4IENocmlzdGlhYW4gU2ltb25zCisgICogdGNwX3tpbixvdXR9LmM6IGFkZGVkIFNOTVAgY291bnRlcnMuCisgICogaXB2NC9pcC5jOiBhZGRlZCBTTk1QIGNvdW50ZXJzLgorICAqIGlwdjQvaXBfZnJhZy5jOiBhZGRlZCBTTk1QIGNvdW50ZXJzLgorCisgIDIwMDYtMDgtMDggQ2hyaXN0aWFhbiBTaW1vbnMKKyAgKiBldGhhcnAue2MsaH06IGFkZGVkIGV0aGFycF9maW5kX2FkZHIoKSB0byByZWFkCisgICAgKHN0YWJsZSkgZXRoZXJuZXQvSVAgYWRkcmVzcyBwYWlyIGZyb20gQVJQIHRhYmxlCisKKyAgMjAwNi0wNy0xNCBDaHJpc3RpYWFuIFNpbW9ucworICAqIG1pYl9zdHJ1Y3RzLmM6IGFkZGVkCisgICogaW5jbHVkZS9sd2lwL3NubXBfc3RydWN0cy5oOiBhZGRlZAorICAqIG5ldGlmLntjLGh9LCBuZXRpZi9ldGhlcm5ldGlmLmM6IGFkZGVkIFNOTVAgc3RhdGlzdGljcyB0byBuZXRpZiBzdHJ1Y3QKKworICAyMDA2LTA3LTA2IENocmlzdGlhYW4gU2ltb25zCisgICogc25tcC9hc24xX3tlbmMsZGVjfS5jIGFkZGVkCisgICogc25tcC9taWIyLmMgYWRkZWQKKyAgKiBzbm1wL21zZ197aW4sb3V0fS5jIGFkZGVkCisgICogaW5jbHVkZS9sd2lwL3NubXBfYXNuMS5oIGFkZGVkCisgICogaW5jbHVkZS9sd2lwL3NubXBfbXNnLmggYWRkZWQKKyAgKiBkb2Mvc25tcF9hZ2VudC50eHQgYWRkZWQKKworICAyMDA2LTAzLTI5IENocmlzdGlhYW4gU2ltb25zCisgICogaW5ldC5jLCBpbmV0Lmg6IEFkZGVkIHBsYXRmb3JtIGJ5dGVzd2FwIHN1cHBvcnQuCisgICAgQWRkZWQgTFdJUF9QTEFURk9STV9CWVRFU1dBUCBkZWZpbmUgKGRlZmF1bHRzIHRvIDApIGFuZAorICAgIG9wdGlvbmFsIExXSVBfUExBVEZPUk1fSFRPTlMoKSwgTFdJUF9QTEFURk9STV9IVE9OTCgpIG1hY3Jvcy4KKworICArKyBCdWcgZml4ZXM6CisKKyAgMjAwNi0xMS0zMCBDaHJpc3RpYWFuIFNpbW9ucworICAqIGRoY3AuYzogRml4ZWQgZmFsc2UgdHJpZ2dlcnMgb2YgcmVxdWVzdF90aW1lb3V0LgorCisgIDIwMDYtMTEtMjggQ2hyaXN0aWFhbiBTaW1vbnMKKyAgKiBuZXRpZi5jOiBJbiBuZXRpZl9hZGQoKSBmaXhlZCBtaXNzaW5nIGNsZWFyIG9mIGlwX2FkZHIsIG5ldG1hc2ssIGd3IGFuZCBmbGFncy4KKworICAyMDA2LTEwLTExIENocmlzdGlhYW4gU2ltb25zCisgICogYXBpX2xpYi5jIGV0aGFycC5jLCBpcC5jLCBtZW1wLmMsIHN0YXRzLmMsIHN5cy57YyxofSB0Y3AuaDoKKyAgICBQYXJ0aWFsbHkgYWNjZXB0ZWQgcGF0Y2ggIzU0NDkgZm9yIEFOU0kgQyBjb21wYXRpYmlsaXR5IC8gYnVpbGQgZml4ZXMuCisgICogaXB2NC9sd2lwL2lwLmggaXB2Ni9sd2lwL2lwLmg6IENvcnJlY3RlZCBVRFAtTGl0ZSBwcm90b2NvbAorICAgIGlkZW50aWZpZXIgZnJvbSAxNzAgdG8gMTM2IChidWcgIzE3NTc0KS4KKworICAyMDA2LTEwLTEwIENocmlzdGlhYW4gU2ltb25zCisgICogYXBpX21zZy5jOiBGaXhlZCBOYWdsZSBhbGdvcml0aG0gYXMgcmVwb3J0ZWQgYnkgQm9iIEdyaWNlLgorCisgIDIwMDYtMDgtMTcgQ2hyaXN0aWFhbiBTaW1vbnMKKyAgKiB1ZHAuYzogRml4ZWQgYnVnICMxNzIwMCwgYWRkZWQgY2hlY2sgZm9yIGJyb2FkY2FzdAorICAgIGRlc3RpbmF0aW9ucyBmb3IgUENCcyBib3VuZCB0byBhIHVuaWNhc3QgYWRkcmVzcy4KKworICAyMDA2LTA4LTA3IENocmlzdGlhYW4gU2ltb25zCisgICogYXBpX21zZy5jOiBGbHVzaGluZyBUQ1Agb3V0cHV0IGluIGRvX2Nsb3NlKCkgKGJ1ZyAjMTU5MjYpLgorCisgIDIwMDYtMDYtMjcgQ2hyaXN0aWFhbiBTaW1vbnMKKyAgKiBhcGlfbXNnLmM6IEFwcGxpZWQgcGF0Y2ggZm9yIGNvbGQgY2FzZSAoYnVnICMxMTEzNSkuCisgICAgSW4gYWNjZXB0X2Z1bmN0aW9uKCkgZW5zdXJlIG5ld2Nvbm4tPmNhbGxiYWNrIGlzIGFsd2F5cyBpbml0aWFsaXplZC4KKworICAyMDA2LTA2LTE1IENocmlzdGlhYW4gU2ltb25zCisgICogbWVtLmg6IGFkZGVkIE1FTV9TSVpFX0YgYWxpYXMgdG8gZml4IGFuIGFuY2llbnQgY29sZCBjYXNlIChidWcgIzE3NDgpLAorICAgIGZhY2lsaXRhdGUgcHJpbnRpbmcgb2YgbWVtX3NpemVfdCBhbmQgdTE2X3Qgc3RhdGlzdGljcy4KKworICAyMDA2LTA2LTE0IENocmlzdGlhYW4gU2ltb25zCisgICogYXBpX21zZy5jOiBBcHBsaWVkIHBhdGNoICM1MTQ2IHRvIGhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmVzCisgICAgaW4gYWNjZXB0KCkgYnkgS2V2aW4gTGF3c29uLgorCisgIDIwMDYtMDUtMjYgQ2hyaXN0aWFhbiBTaW1vbnMKKyAgKiBhcGlfbGliLmM6IFJlbW92ZWQgY29ubi0+c2VtIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAKKyAgICBmcm9tIG5ldGNvbm5fd3JpdGUoKSBhbmQgYWRkZWQgc3lzX3NlbV9uZXcgdG8gbmV0Y29ubl9uZXdfKi4KKworKFNUQUJMRS0xXzFfMSkKKworICAyMDA2LTAzLTAzICBDaHJpc3RpYWFuIFNpbW9ucworICAqIGlwdjQvaXBfZnJhZy5jOiBBZGRlZCBib3VuZC1jaGVja2luZyBhc3NlcnRpb25zIG9uIGlwX3JlYXNzYml0bWFwCisgICAgYWNjZXNzIGFuZCBhZGRlZCBwYnVmX2FsbG9jKCkgcmV0dXJuIHZhbHVlIGNoZWNrcy4KKworICAyMDA2LTAxLTAxICBMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uLndvZXN0ZW5iZXJnQGdteC5uZXQ+CisgICogdGNwX3tpbixvdXR9LmMsIHRjcF9vdXQuYzogUmVtb3ZlZCAnZXZlbiBzbmRidWYnIGZpeCBpbiBUQ1AsIHdoaWNoIGlzCisgICAgbm93IGhhbmRsZWQgYnkgdGhlIGNoZWNrc3VtIHJvdXRpbmUgcHJvcGVybHkuCisKKyAgMjAwNi0wMi0yNyAgTGVvbiBXb2VzdGVuYmVyZyA8bGVvbi53b2VzdGVuYmVyZ0BnbXgubmV0PgorICAgKiBwYnVmLmM6IEZpeCBhbGlnbm1lbnQ7IHBidWZfaW5pdCgpIHdvdWxkIG5vdCB3b3JrIHVubGVzcworICAgICBwYnVmX3Bvb2xfbWVtb3J5W10gd2FzIHByb3Blcmx5IGFsaWduZWQuIChQYXRjaCBieSBDdXJ0IE1jRG93ZWxsLikKKworICAyMDA1LTEyLTIwICBMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uLndvZXN0ZW5iZXJnQGdteC5uZXQ+CisgICogdGNwLmM6IFJlbW92ZSBQQ0JzIHdoaWNoIHN0YXkgaW4gTEFTVF9BQ0sgc3RhdGUgdG9vIGxvbmcuIFBhdGNoCisgICAgc3VibWl0dGVkIGJ5IE1pdHJhbmkgSGlyb3NoaS4KKworICAyMDA1LTEyLTE1ICBDaHJpc3RpYWFuIFNpbW9ucworICAqIGluZXQuYzogRGlzYWJsZWQgdGhlIGFkZGVkIHN1bW1pbmcgcm91dGluZSB0byBwcmVzZXJ2ZSBjb2RlIHNwYWNlLgorCisgIDIwMDUtMTItMTQgIExlb24gV29lc3RlbmJlcmcgPGxlb24ud29lc3RlbmJlcmdAZ214Lm5ldD4KKyAgKiB0Y3BfaW4uYzogRHVwbGljYXRlIEZJTiBBQ0sgcmFjZSBjb25kaXRpb24gZml4IGJ5IEtlbHZpbiBMYXdzb24uCisgICAgQWRkZWQgQ3VydCBNY0Rvd2VsbCdzIG9wdGltaXplZCBjaGVja3N1bW1pbmcgcm91dGluZSBmb3IgZnV0dXJlCisgICAgaW5jbHVzaW9uLiBOZWVkIHRvIGNyZWF0ZSB0ZXN0IGNhc2UgZm9yIHVuYWxpZ2VkLCBhbGlnbmVkLCBvZGQsCisgICAgZXZlbiBsZW5ndGggY29tYmluYXRpb24gb2YgY2FzZXMgb24gdmFyaW91cyBlbmRpYW5lc3MgbWFjaGluZXMuCisKKyAgMjAwNS0xMi0wOSAgQ2hyaXN0aWFhbiBTaW1vbnMKKyAgKiBpbmV0LmM6IFJld3JvdGUgc3RhbmRhcmQgY2hlY2tzdW0gcm91dGluZSBpbiBwcm9wZXIgcG9ydGFibGUgQy4KKworICAyMDA1LTExLTI1ICBDaHJpc3RpYWFuIFNpbW9ucworICAqIHVkcC5jIHRjcC5jOiBSZW1vdmVkIFNPX1JFVVNFIGhhY2suIFNob3VsZCByZXNpZGUgaW4gc29ja2V0IGNvZGUgb25seS4KKyAgKiAqLmM6IGludHJvZHVjZWQgY2MuaCBMV0lQX0RFQlVHIGZvcm1hdHRlcnMgbWF0Y2hpbmcgdGhlIHUxNl90LCBzMTZfdCwKKyAgICB1MzJfdCwgczMyX3QgdHlwZWRlZnMuIFRoaXMgc29sdmVzIG1vc3QgZGVidWcgd29yZC1sZW5ndGggYXNzdW1lcy4KKworICAyMDA1LTA3LTE3IExlb24gV29lc3RlbmJlcmcgPGxlb24ud29lc3RlbmJlcmdAZ214Lm5ldD4KKyAgKiBpbmV0LmM6IEZpeGVkIHVuYWxpZ25lZCAxNi1iaXQgYWNjZXNzIGluIHRoZSBzdGFuZGFyZCBjaGVja3N1bQorICAgIHJvdXRpbmUgYnkgUGV0ZXIgSm9sYXNzb24uCisgICogc2xpcGlmLmM6IEZpeGVkIGltcGxlbWVudGF0aW9uIGFzc3VtcHRpb24gb2Ygc2luZ2xlLXBidWYgZGF0YWdyYW1zLgorCisgIDIwMDUtMDItMDQgTGVvbiBXb2VzdGVuYmVyZyA8bGVvbi53b2VzdGVuYmVyZ0BnbXgubmV0PgorICAqIHRjcF9vdXQuYzogRml4ZWQgdW5pbml0aWFsaXplZCAncXVldWUnIHJlZmVyZW5jZWQgaW4gbWVtZXJyIGJyYW5jaC4KKyAgKiB0Y3Bfe291dHxpbn0uYzogQXBwbGllZCBwYXRjaCBmaXhpbmcgdW5hbGlnbmVkIGFjY2Vzcy4KKworICAyMDA1LTAxLTA0IExlb24gV29lc3RlbmJlcmcgPGxlb24ud29lc3RlbmJlcmdAZ214Lm5ldD4KKyAgKiBwYnVmLmM6IEZpeGVkIG1pc3Npbmcgc2VtaWNvbG9uIGFmdGVyIExXSVBfREVCVUcgc3RhdGVtZW50LgorCisgIDIwMDUtMDEtMDMgTGVvbiBXb2VzdGVuYmVyZyA8bGVvbi53b2VzdGVuYmVyZ0BnbXgubmV0PgorICAqIHVkcC5jOiBVRFAgcGNiLT5yZWN2KCkgd2FzIGNhbGxlZCBldmVuIHdoZW4gaXQgd2FzIE5VTEwuCisKKyhTVEFCTEUtMV8xXzApCisKKyAgMjAwNC0xMi0yOCBMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uLndvZXN0ZW5iZXJnQGdteC5uZXQ+CisgICogZXRoYXJwLio6IERpc2FibGVkIG11bHRpcGxlIHBhY2tldHMgb24gdGhlIEFSUCBxdWV1ZS4KKyAgICBUaGlzIGNsYXNoZXMgd2l0aCBUQ1AgcXVldWVpbmcuCisKKyAgMjAwNC0xMS0yOCBMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uLndvZXN0ZW5iZXJnQGdteC5uZXQ+CisgICogZXRoYXJwLio6IEZpeGVkIHJhY2UgY29uZGl0aW9uIGZyb20gQVJQIHJlcXVlc3QgdG8gQVJQIHRpbWVvdXQuCisgICAgSGFsdmVkIHRoZSBBUlAgcGVyaW9kLCBkb3VibGVkIHRoZSBwZXJpb2QgY291bnRzLgorICAgIEVUSEFSUF9NQVhfUEVORElORyBub3cgc2hvdWxkIGJlIGF0IGxlYXN0IDIuIFRoaXMgcHJldmVudHMKKyAgICB0aGUgY291bnRlciBmcm9tIHJlYWNoaW5nIDAgcmlnaHQgYXdheSAod2hpY2ggd291bGQgYWxsb3cKKyAgICB0b28gbGl0dGxlIHRpbWUgZm9yIEFSUCByZXNwb25zZXMgdG8gYmUgcmVjZWl2ZWQpLgorCisgIDIwMDQtMTEtMjUgTGVvbiBXb2VzdGVuYmVyZyA8bGVvbi53b2VzdGVuYmVyZ0BnbXgubmV0PgorICAqIGRoY3AuYzogRGVjbGluZSBtZXNzYWdlcyB3ZXJlIG5vdCBtdWx0aWNhc3QgYnV0IHVuaWNhc3QuCisgICogZXRoYXJwLmM6IEVUSEFSUF9DUkVBVEUgaXMgcmVuYW1lZCB0byBFVEhBUlBfVFJZX0hBUkQuCisgICAgRG8gbm90IHRyeSBoYXJkIHRvIGluc2VydCBhcmJpdHJhcnkgcGFja2V0J3Mgc291cmNlIGFkZHJlc3MsCisgICAgZXRoYXJwX2lwX2lucHV0KCkgbm93IGNhbGxzIGV0aGFycF91cGRhdGUoKSB3aXRob3V0IEVUSEFSUF9UUllfSEFSRC4gCisgICAgZXRoYXJwX3F1ZXJ5KCkgbm93IGFsd2F5cyBET0VTIGNhbGwgRVRIQVJQX1RSWV9IQVJEIHNvIHRoYXQgdXNlcnMKKyAgICBxdWVyeWluZyBhbiBhZGRyZXNzIHdpbGwgc2VlIGl0IGFwcGVhciBpbiB0aGUgY2FjaGUgKERIQ1AgY291bGQKKyAgICBzdWZmZXIgZnJvbSB0aGlzIHdoZW4gYSBzZXJ2ZXIgaW52YWxpZGx5IGdhdmUgYW4gaW4tdXNlIGFkZHJlc3MuKQorICAqIGlwdjQvaXBfYWRkci5oOiBSZW5hbWVkIGlwX2FkZHJfbWFza2NtcCgpIHRvIF9uZXRjbXAoKSBhcyB3ZSBhcmUKKyAgICBjb21wYXJpbmcgbmV0d29yayBhZGRyZXNzZXMgKGlkZW50aWZpZXJzKSwgbm90IHRoZSBuZXR3b3JrIG1hc2tzCisgICAgdGhlbXNlbHZlcy4KKyAgKiBpcHY0L2lwX2FkZHIuYzogaXBfYWRkcl9pc2Jyb2FkY2FzdCgpIG5vdyBjaGVja3MgdGhhdCB0aGUgZ2l2ZW4KKyAgICBJUCBhZGRyZXNzIGFjdHVhbGx5IGJlbG9uZ3MgdG8gdGhlIG5ldHdvcmsgb2YgdGhlIGdpdmVuIGludGVyZmFjZS4KKworICAyMDA0LTExLTI0IEtpZXJhbiBNYW5zbGV5IDxram0yNUBjYW0uYWMudWs+CisgICogdGNwLmM6IEluY3JlbWVudCBwY2ItPnNuZF9idWYgd2hlbiBBQ0sgaXMgcmVjZWl2ZWQgaW4gU1lOX1NFTlQgc3RhdGUuCisKKyhTVEFCTEUtMV8xXzAtUkMxKQorCisgIDIwMDQtMTAtMTYgS2llcmFuIE1hbnNsZXkgPGtqbTI1QGNhbS5hYy51az4KKyAgKiB0Y3AuYzogQWRkIGNvZGUgdG8gdGNwX3JlY3ZlZCgpIHRvIHNlbmQgYW4gQUNLICh3aW5kb3cgdXBkYXRlKSBpbW1lZGlhdGVseSwKKyAgICBldmVuIGlmIG9uZSBpcyBhbHJlYWR5IHBlbmRpbmcsIGlmIHRoZSByY3Zfd25kIGlzIGFib3ZlIGEgdGhyZXNob2xkCisgICAgKGN1cnJlbnRseSBUQ1BfV05ELzIpLiBUaGlzIGF2b2lkcyB3YWl0aW5nIGZvciBhIHRpbWVyIHRvIGV4cGlyZSB0byBzZW5kIGEKKyAgICBkZWxheWVkIEFDSyBpbiBvcmRlciB0byBvcGVuIHRoZSB3aW5kb3cgaWYgdGhlIHN0YWNrIGlzIG9ubHkgcmVjZWl2aW5nIGRhdGEuCisKKyAgMjAwNC0wOS0xMiBLaWVyYW4gTWFuc2xleSA8a2ptMjVAY2FtLmFjLnVrPgorICAqIHRjcCouKjogUmV0cmFuc21pdCB0aW1lLW91dCBoYW5kbGluZyBpbXByb3ZlbWVudCBieSBTYW0gSmFuc2VuLgorCisgIDIwMDQtMDgtMjAgVG9ueSBNb3VudGlmaWVsZCA8dG9ueUBzb2Z0aW5zLmNvLnVrPgorICAqIGV0aGFycC5jOiBNYWtlIHN1cmUgdGhlIGZpcnN0IHBidWYgcXVldWVkIG9uIGFuIEFSUCBlbnRyeQorICAgIGlzIHByb3Blcmx5IHJlZiBjb3VudGVkLgorCisgIDIwMDQtMDctMjcgVG9ueSBNb3VudGlmaWVsZCA8dG9ueUBzb2Z0aW5zLmNvLnVrPgorICAqIGRlYnVnLmg6IEFkZGVkIChpbnQpIGNhc3QgaW4gTFdJUF9ERUJVR0YoKSB0byBhdm9pZCBjb21waWxlcgorICAgIHdhcm5pbmdzIGFib3V0IGNvbXBhcmlzb24uCisgICogcGJ1Zi5jOiBTdG9wcGVkIGNvbXBpbGVyIGNvbXBsYWluaW5nIG9mIGVtcHR5IGlmIHN0YXRlbWVudAorICAgIHdoZW4gTFdJUF9ERUJVR0YoKSBlbXB0eS4gIENsb3NlZCBhbiB1bmNsb3NlZCBjb21tZW50LgorICAqIHRjcC5jOiBTdG9wcGVkIGNvbXBpbGVyIGNvbXBsYWluaW5nIG9mIGVtcHR5IGlmIHN0YXRlbWVudAorICAgIHdoZW4gTFdJUF9ERUJVR0YoKSBlbXB0eS4KKyAgKiBpcC5oIENvcnJlY3RlZCBJUEhfVE9TKCkgbWFjcm86IHJldHVybnMgYSBieXRlLCBzbyBkb2Vzbid0IG5lZWQgaHRvbnMoKS4KKyAgKiBpbmV0LmM6IEFkZGVkIGEgY291cGxlIG9mIGNhc3RzIHRvIHF1aWV0IHRoZSBjb21waWxlci4KKyAgICBObyBuZWVkIHRvIHRlc3QgaXNhc2NpaShjKSBiZWZvcmUgaXNkaWdpdChjKSBvciBpc3hkaWdpdChjKS4KKworICAyMDA0LTA3LTIyIFRvbnkgTW91bnRpZmllbGQgPHRvbnlAc29mdGlucy5jby51az4KKyAgKiBpbmV0LmM6IE1hZGUgZGF0YSB0eXBlcyBjb25zaXN0ZW50IGluIGluZXRfbnRvYSgpLgorICAgIEFkZGVkIGNhc3RzIGZvciByZXR1cm4gdmFsdWVzIG9mIGNoZWNrc3VtIHJvdXRpbmVzLCB0byBwYWNpZnkgY29tcGlsZXIuCisgICogaXBfZnJhZy5jLCB0Y3Bfb3V0LmMsIHNvY2tldHMuYywgcGJ1Zi5jCisgICAgU21hbGwgY29ycmVjdGlvbnMgdG8gc29tZSBkZWJ1Z2dpbmcgc3RhdGVtZW50cywgdG8gcGFjaWZ5IGNvbXBpbGVyLgorCisgIDIwMDQtMDctMjEgVG9ueSBNb3VudGlmaWVsZCA8dG9ueUBzb2Z0aW5zLmNvLnVrPgorICAqIGV0aGFycC5jOiBSZW1vdmVkIHNwdXJpb3VzIHNlbWljb2xvbiBhbmQgYWRkZWQgbWlzc2luZyBlbmQtb2YtY29tbWVudC4KKyAgKiBldGhlcm5ldGlmLmMgVXBkYXRlZCBsb3dfbGV2ZWxfb3V0cHV0KCkgdG8gbWF0Y2ggcHJvdG90eXBlIGZvcgorICAgIG5ldGlmLT5saW5rb3V0cHV0IGFuZCBjaGFuZ2VkIGxvd19sZXZlbF9pbnB1dCgpIHNpbWlsYXJseSBmb3IgY29uc2lzdGVuY3kuCisgICogYXBpX21zZy5jOiBDaGFuZ2VkIHJlY3ZfcmF3KCkgZnJvbSBpbnQgdG8gdThfdCwgdG8gbWF0Y2ggcHJvdG90eXBlCisgICAgb2YgcmF3X3JlY3YoKSBpbiByYXcuaCBhbmQgc28gYXZvaWQgY29tcGlsZXIgZXJyb3IuCisgICogc29ja2V0cy5jOiBBZGRlZCB0cml2aWFsIChpbnQpIGNhc3QgdG8ga2VlcCBjb21waWxlciBoYXBwaWVyLgorICAqIGlwLmMsIG5ldGlmLmMgQ2hhbmdlZCBkZWJ1ZyBzdGF0ZW1lbnRzIHRvIHVzZSB0aGUgdGlkaWVyIGlwNF9hZGRyTigpIG1hY3Jvcy4KKworKFNUQUJMRS0xXzBfMCkKKworICArKyBDaGFuZ2VzOgorCisgIDIwMDQtMDctMDUgTGVvbiBXb2VzdGVuYmVyZyA8bGVvbi53b2VzdGVuYmVyZ0BnbXgubmV0PgorICAqIHNvY2tldHMuKjogUmVzdHJ1Y3R1cmVkIExXSVBfUFJJVkFURV9USU1FVkFMLiBNYWtlIHN1cmUKKyAgICB5b3VyIGNjLmggZmlsZSBkZWZpbmVzIHRoaXMgZWl0aGVyIDEgb3IgMC4gSWYgbm9uLWRlZmluZWQsCisgICAgZGVmYXVsdHMgdG8gMS4KKyAgKiAuYzogQWRkZWQgPHN0cmluZy5oPiBhbmQgPGVycm5vLmg+IGluY2x1ZGVzIHdoZXJlIHVzZWQuCisgICogZXRoYXJwLmM6IE1hZGUgc29tZSBhcnJheSBpbmRpY2VzIHVuc2lnbmVkLgorCisgIDIwMDQtMDYtMjcgTGVvbiBXb2VzdGVuYmVyZyA8bGVvbi53b2VzdGVuYmVyZ0BnbXgubmV0PgorICAqIG5ldGlmLio6IEFkZGVkIG5ldGlmX3NldF91cCgpL2Rvd24oKS4KKyAgKiBkaGNwLmM6IENoYW5nZXMgdG8gcmVzdGFydCBwcm9ncmFtIGZsb3cuCisKKyAgMjAwNC0wNS0wNyBMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uLndvZXN0ZW5iZXJnQGdteC5uZXQ+CisgICogZXRoYXJwLmM6IEluIGZpbmRfZW50cnkoKSwgaW5zdGVhZCBvZiBhIGxpc3QgdHJhdmVyc2FsIHBlciBjYW5kaWRhdGUsIGRvIGEKKyAgICBzaW5nbGUtcGFzcyBsb29rdXAgZm9yIGRpZmZlcmVudCBjYW5kaWRhdGVzLiBTaG91bGQgZXhwbG9pdCBsb2NhbGl0eS4KKworICAyMDA0LTA0LTI5IExlb24gV29lc3RlbmJlcmcgPGxlb24ud29lc3RlbmJlcmdAZ214Lm5ldD4KKyAgKiB0Y3AqLmM6IENsZWFuZWQgdXAgc291cmNlIGNvbW1lbnQgZG9jdW1lbnRhdGlvbiBmb3IgRG94eWdlbiBwcm9jZXNzaW5nLgorICAqIG9wdC5oOiBFVEhBUlBfQUxXQVlTX0lOU0VSVCBvcHRpb24gcmVtb3ZlZCB0byBjb21wbHkgd2l0aCBBUlAgUkZDLgorICAqIGV0aGFycC5jOiB1cGRhdGVfYXJwX2VudHJ5KCkgb25seSBhZGRzIG5ldyBBUlAgZW50cmllcyB3aGVuIGFkdmljZWQgdG8gYnkKKyAgICB0aGUgY2FsbGVyLiBUaGlzIGRlcHJlY2F0ZXMgdGhlIEVUSEFSUF9BTFdBWVNfSU5TRVJUIG92ZXJydWxlIG9wdGlvbi4KKworICArKyBCdWcgZml4ZXM6CisKKyAgMjAwNC0wNC0yNyBMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uLndvZXN0ZW5iZXJnQGdteC5uZXQ+CisgICogZXRoYXJwLmM6IEFwcGxpZWQgcGF0Y2ggb2YgYnVnICM4NzA4IGJ5IFRvbmkgTW91bnRpZmllbGQgd2l0aCBhIHNvbHV0aW9uCisgICAgc3VnZ2VzdGVkIGJ5IFRpbW15IEJyb2xpbi4gRml4IGZvciAzMi1iaXQgcHJvY2Vzc29ycyB0aGF0IGNhbm5vdCBhY2Nlc3MKKyAgICBub24tYWxpZ25lZCAzMi1iaXQgd29yZHMsIHN1Y2ggYXMgc29tcyAzMi1iaXQgVENQL0lQIGhlYWRlciBmaWVsZHMuIEZpeAorICAgIGlzIHRvIHByZWZpeCB0aGUgMTQtYml0IEV0aGVybmV0IGhlYWRlcnMgd2l0aCB0d28gcGFkZGluZyBieXRlcy4KKworICAyMDA0LTA0LTIzIExlb24gV29lc3RlbmJlcmcgPGxlb24ud29lc3RlbmJlcmdAZ214Lm5ldD4KKyAgKiBpcF9hZGRyLmM6IEZpeCBpbiB0aGUgaXBfYWRkcl9pc2Jyb2FkY2FzdCgpIGNoZWNrLgorICAqIGV0aGFycC5jOiBGaXhlZCB0aGUgY2FzZSB3aGVyZSB0aGUgcGFja2V0IHRoYXQgaW5pdGlhdGVzIHRoZSBBUlAgcmVxdWVzdAorICAgIGlzIG5vdCBxdWV1ZWQsIGFuZCBnZXRzIGxvc3QuIEZpeGVkIHRoZSBjYXNlIHdoZXJlIHRoZSBwYWNrZXRzIGRlc3RpbmF0aW9uCisgICAgYWRkcmVzcyBpcyBhbHJlYWR5IGtub3duOyB3ZSBub3cgYWx3YXlzIHF1ZXVlIHRoZSBwYWNrZXQgYW5kIHBlcmZvcm0gYW4gQVJQCisgICAgcmVxdWVzdC4KKworKFNUQUJMRS0wXzdfMCkKKworICArKyBCdWcgZml4ZXM6CisKKyAgKiBGaXhlZCBUQ1AgYnVnIGZvciBTWU5fU0VOVCB0byBFU1RBQkxJU0hFRCBzdGF0ZSB0cmFuc2l0aW9uLgorICAqIEZpeGVkIFRDUCBidWcgaW4gZGVxdWV1ZWluZyBvZiBGSU4gZnJvbSBvdXQgb2Ygb3JkZXIgc2VnbWVudCBxdWV1ZS4KKyAgKiBGaXhlZCB0d28gcG9zc2libGUgTlVMTCByZWZlcmVuY2VzIGluIHJhcmUgY2FzZXMuCisKKyhTVEFCTEUtMF82XzYpCisKKyAgKysgQnVnIGZpeGVzOgorCisgICogRml4ZWQgREhDUCB3aGljaCBkaWQgbm90IGluY2x1ZGUgdGhlIElQIGFkZHJlc3MgaW4gREVDTElORSBtZXNzYWdlcy4KKworICArKyBDaGFuZ2VzOgorCisgICogZXRoYXJwLmMgaGFzIGJlZW4gaGF1bGVkIG92ZXIgYSBiaXQuCisKKyhTVEFCTEUtMF82XzUpCisKKyAgKysgQnVnIGZpeGVzOgorCisgICogRml4ZWQgVENQIGJ1ZyBpbmR1Y2VkIGJ5IGJhZCB3aW5kb3cgcmVzaXppbmcgd2l0aCB1bmlkaXJlY3Rpb25hbCBUQ1AgdHJhZmZpYy4KKyAgKiBQYWNrZXRzIHNlbnQgZnJvbSBBUlAgcXVldWUgaGFkIGludmFsaWQgc291cmNlIGhhcmR3YXJlIGFkZHJlc3MuCisKKyAgKysgQ2hhbmdlczoKKworICAqIFBhc3MtYnkgQVJQIHJlcXVlc3RzIGRvIG5vdyB1cGRhdGUgdGhlIGNhY2hlLgorCisgICsrIE5ldyBmZWF0dXJlczoKKworICAqIE5vIGxvbmdlciBkZXBlbmRlbnQgb24gY3R5cGUuaC4KKyAgKiBOZXcgc29ja2V0IG9wdGlvbnMuCisgICogUmF3IElQIHBjYiBzdXBwb3J0LgorCisoU1RBQkxFLTBfNl80KQorCisgICsrIEJ1ZyBmaXhlczoKKworICAqIFNvbWUgZGVidWcgZm9ybWF0dGVycyBhbmQgY2FzdHMgZml4ZWQuCisgICogTnVtZXJlb3VzIGZpeGVzIGluIFBQUC4KKworICArKyBDaGFuZ2VzOgorCisgICogREVCVUdGIG5vdyBpcyBMV0lQX0RFQlVHRgorICAqIHBidWZfZGVjaGFpbigpIGhhcyBiZWVuIHJlLWVuYWJsZWQuCisgICogTWVudGlvbmVkIHRoZSBjaGFuZ2VkIHVzZSBvZiBDVlMgYnJhbmNoZXMgaW4gUkVBRE1FLgorCisoU1RBQkxFLTBfNl8zKQorCisgICsrIEJ1ZyBmaXhlczoKKworICAqIEZpeGVkIHBvb2wgcGJ1ZiBtZW1vcnkgbGVhayBpbiBwYnVmX2FsbG9jKCkuCisgICAgT2NjdXJlZCBpZiBub3QgZW5vdWdoIFBCVUZfUE9PTCBwYnVmcyBmb3IgYSBwYWNrZXQgcGJ1ZiBjaGFpbi4KKyAgICBSZXBvcnRlZCBieSBTYXZpbiBabG9iZWMuCisKKyAgKiBQQlVGX1BPT0wgY2hhaW5zIGhhZCB0aGVpciB0b3RfbGVuIGZpZWxkIG5vdCBzZXQgZm9yIG5vbi1maXJzdAorICAgIHBidWZzLiBGaXhlZCBpbiBwYnVmX2FsbG9jKCkuCisKKyAgKysgTmV3IGZlYXR1cmVzOgorCisgICogQWRkZWQgUFBQIHN0YWNrIGNvbnRyaWJ1dGVkIGJ5IE1hcmMgQm91Y2hlcgorCisgICsrIENoYW5nZXM6CisKKyAgKiBOb3cgZHJvcHMgc2hvcnQgcGFja2V0cyBmb3IgSUNNUC9VRFAvVENQIHByb3RvY29scy4gTW9yZSByb2J1c3QuCisKKyAgKiBBUlAgcXVldWV1aW5nIG5vdyBxdWV1ZXMgdGhlIGxhdGVzdCBwYWNrZXQgaW5zdGVhZCBvZiB0aGUgZmlyc3QuCisgICAgVGhpcyBpcyB0aGUgUkZDIHJlY29tbWVuZGVkIGJlaGF2aW91ciwgYnV0IGNhbiBiZSBvdmVycmlkZGVuIGluCisgICAgbHdpcG9wdHMuaC4KKworKDAuNi4yKQorCisgICsrIEJ1Z2ZpeGVzOgorCisgICogVENQIGhhcyBiZWVuIGZpeGVkIHRvIGRlYWwgd2l0aCB0aGUgbmV3IHVzZSBvZiB0aGUgcGJ1Zi0+cmVmCisgICAgY291bnRlci4KKworICAqIERIQ1AgZGhjcF9pbmZvcm0oKSBjcmFzaCBidWcgZml4ZWQuCisKKyAgKysgQ2hhbmdlczoKKworICAqIFJlbW92ZWQgcGJ1Zl9wb29sX2ZyZWVfY2FjaGUgYW5kIHBidWZfcG9vbF9hbGxvY19jYWNoZS4gQWxzbyByZW1vdmVkCisgICAgcGJ1Zl9yZWZyZXNoKCkuIFRoaXMgaGFzIHNwZWQgdXAgcGJ1ZiBwb29sIG9wZXJhdGlvbnMgY29uc2lkZXJhYmx5LgorICAgIEltcGxlbWVudGVkIGJ5IERhdmlkIEhhYXMuCisKKygwLjYuMSkKKworICArKyBOZXcgZmVhdHVyZXM6CisKKyAgKiBUaGUgcGFja2V0IGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBlbmhhbmNlZCB0byBzdXBwb3J0CisgICAgemVyby1jb3B5IGFuZCBjb3B5LW9uLWRlbWFuZCBmb3IgcGFja2V0IGJ1ZmZlcnMgd2hpY2ggaGF2ZSB0aGVpcgorICAgIHBheWxvYWRzIGluIGFwcGxpY2F0aW9uLW1hbmFnZWQgbWVtb3J5LgorICAgIEltcGxlbWVudGVkIGJ5IERhdmlkIEhhYXMuCisKKyAgICBVc2UgUEJVRl9SRUYgdG8gbWFrZSBhIHBidWYgcmVmZXIgdG8gUkFNLiBsd0lQIHdpbGwgdXNlIHplcm8tY29weQorICAgIGlmIGFuIG91dGdvaW5nIHBhY2tldCBjYW4gYmUgZGlyZWN0bHkgc2VudCBvbiB0aGUgbGluaywgb3IgcGVyZm9ybQorICAgIGEgY29weS1vbi1kZW1hbmQgd2hlbiBuZWNlc3NhcnkuCisKKyAgICBUaGUgYXBwbGljYXRpb24gY2FuIHNhZmVseSBhc3N1bWUgdGhlIHBhY2tldCBpcyBzZW50LCBhbmQgdGhlIFJBTQorICAgIGlzIGF2YWlsYWJsZSB0byB0aGUgYXBwbGljYXRpb24gZGlyZWN0bHkgYWZ0ZXIgY2FsbGluZyB1ZHBfc2VuZCgpCisgICAgb3Igc2ltaWxhciBmdW5jdGlvbi4KKworICArKyBCdWdmaXhlczoKKworICAqIEFSUF9RVUVVRUlORyBzaG91bGQgbm93IGNvcnJlY3RseSB3b3JrIGZvciBhbGwgY2FzZXMsIGluY2x1ZGluZworICAgIFBCVUZfUkVGLgorICAgIEltcGxlbWVudGVkIGJ5IExlb24gV29lc3RlbmJlcmcuCisKKyAgKysgQ2hhbmdlczoKKworICAqIElQX0FERFJfQU5ZIGlzIG5vIGxvbmdlciBhIE5VTEwgcG9pbnRlci4gSW5zdGVhZCwgaXQgaXMgYSBwb2ludGVyCisgICAgdG8gYSAnMC4wLjAuMCcgSVAgYWRkcmVzcy4KKworICAqIFRoZSBwYWNrZXQgYnVmZmVyIGltcGxlbWVudGF0aW9uIGlzIGNoYW5nZWQuIFRoZSBwYnVmLT5yZWYgY291bnRlcgorICAgIG1lYW5pbmcgaGFzIGNoYW5nZWQsIGFuZCBzZXZlcmFsIHBidWYgZnVuY3Rpb25zIGhhdmUgYmVlbgorICAgIGFkYXB0ZWQgYWNjb3JkaW5nbHkuCisKKyAgKiBuZXRpZiBkcml2ZXJzIGhhdmUgdG8gYmUgY2hhbmdlZCB0byBzZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoIGZpZWxkCisgICAgdGhhdCBtdXN0IGJlIGluaXRpYWxpemVkIGNvcnJlY3RseSBieSB0aGUgZHJpdmVyIChoaW50OiA2IGZvciBFdGhlcm5ldCBNQUMpLgorICAgIFNlZSB0aGUgY29udHJpYi9wb3J0cy9jMTZ4IGNzODkwMCBkcml2ZXIgYXMgYSBkcml2ZXIgZXhhbXBsZS4KKworICAqIG5ldGlmJ3MgaGF2ZSBhIGRoY3AgZmllbGQgdGhhdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE5VTEwgYnkgdGhlIGRyaXZlci4KKyAgICBTZWUgdGhlIGNvbnRyaWIvcG9ydHMvYzE2eCBjczg5MDAgZHJpdmVyIGFzIGEgZHJpdmVyIGV4YW1wbGUuCisKKygwLjUueCkgVGhpcyBmaWxlIGhhcyBiZWVuIHVubWFpbnRhaW5lZCB1cCB0byAwLjYuMS4gQWxsIGNoYW5nZXMgYXJlCisgIGxvZ2dlZCBpbiBDVlMgYnV0IGhhdmUgbm90IGJlZW4gZXhwbGFpbmVkIGhlcmUuCisKKygwLjUuMykgQ2hhbmdlcyBzaW5jZSB2ZXJzaW9uIDAuNS4yCisKKyAgKysgQnVnZml4ZXM6CisKKyAgKiBtZW1wX21hbGxvYyhNRU1QX0FQSV9NU0cpIGNvdWxkIGZhaWwgd2l0aCBtdWx0aXBsZSBhcHBsaWNhdGlvbgorICAgIHRocmVhZHMgYmVjYXVzZSBpdCB3YXNuJ3QgcHJvdGVjdGVkIGJ5IHNlbWFwaG9yZXMuCisKKyAgKysgT3RoZXIgY2hhbmdlczoKKworICAqIHN0cnVjdCBpcF9hZGRyIG5vdyBwYWNrZWQuCisKKyAgKiBUaGUgbmFtZSBvZiB0aGUgdGltZSB2YXJpYWJsZSBpbiBhcnAuYyBoYXMgYmVlbiBjaGFuZ2VkIHRvIGN0aW1lCisgICAgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIHRpbWUoKSBmdW5jdGlvbi4KKworKDAuNS4yKSBDaGFuZ2VzIHNpbmNlIHZlcnNpb24gMC41LjEKKworICArKyBOZXcgZmVhdHVyZXM6CisKKyAgKiBBIG5ldyBUQ1AgZnVuY3Rpb24sIHRjcF90bXIoKSwgbm93IGhhbmRsZXMgYm90aCBUQ1AgdGltZXJzLgorCisgICsrIEJ1Z2ZpeGVzOgorCisgICogQSBidWcgaW4gdGNwX3BhcnNlb3B0KCkgY291bGQgY2F1c2UgdGhlIHN0YWNrIHRvIGhhbmcgYmVjYXVzZSBvZiBhCisgICAgbWFsZm9ybWVkIFRDUCBvcHRpb24uCisKKyAgKiBUaGUgYWRkcmVzcyBvZiBuZXcgY29ubmVjdGlvbnMgaW4gdGhlIGFjY2VwdCgpIGZ1bmN0aW9uIGluIHRoZSBCU0QKKyAgICBzb2NrZXQgbGlicmFyeSB3YXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LgorCisgICogcGJ1Zl9kZWNoYWluKCkgZGlkIG5vdCB1cGRhdGUgdGhlIC0+dG90X2xlbiBmaWVsZCBvZiB0aGUgdGFpbC4KKworICAqIEFib3J0ZWQgVENQIGNvbm5lY3Rpb25zIHdlcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IGluIGFsbAorICAgIHNpdHVhdGlvbnMuCisKKyAgKysgT3RoZXIgY2hhbmdlczoKKworICAqIEFsbCBwcm90b2NvbCBoZWFkZXIgc3RydWN0cyBhcmUgbm93IHBhY2tlZC4KKworICAqIFRoZSAtPmxlbiBmaWVsZCBpbiB0aGUgdGNwX3NlZyBzdHJ1Y3R1cmUgbm93IGNvdW50cyB0aGUgYWN0dWFsCisgICAgYW1vdW50IG9mIGRhdGEsIGFuZCBkb2VzIG5vdCBhZGQgb25lIGZvciBTWU4gYW5kIEZJTiBzZWdtZW50cy4KKworKDAuNS4xKSBDaGFuZ2VzIHNpbmNlIHZlcnNpb24gMC41LjAKKworICArKyBOZXcgZmVhdHVyZXM6CisKKyAgKiBQb3NzaWJsZSB0byBydW4gYXMgYSB1c2VyIHByb2Nlc3MgdW5kZXIgTGludXguCisKKyAgKiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBjcm9zcyBwbGF0Zm9ybSBwYWNrZWQgc3RydWN0cy4KKworICAqIEFSUCB0aW1lciBub3cgaW1wbGVtZW50ZWQuCisKKyAgKysgQnVnZml4ZXM6CisKKyAgKiBUQ1Agb3V0cHV0IHF1ZXVlIGxlbmd0aCB3YXMgYmFkbHkgaW5pdGlhbGl6ZWQgd2hlbiBvcGVuaW5nCisgICAgY29ubmVjdGlvbnMuCisKKyAgKiBUQ1AgZGVsYXllZCBBQ0tzIHdlcmUgbm90IHNlbnQgY29ycmVjdGx5LgorCisgICogRXhwbGljaXQgaW5pdGlhbGl6YXRpb24gb2YgQlNTIHNlZ21lbnQgdmFyaWFibGVzLgorCisgICogcmVhZCgpIGluIEJTRCBzb2NrZXQgbGlicmFyeSBjb3VsZCBkcm9wIGRhdGEuCisKKyAgKiBQcm9ibGVtcyB3aXRoIG1lbW9yeSBhbGlnbm1lbnQuCisKKyAgKiBTaXR1YXRpb25zIHdoZW4gYWxsIFRDUCBidWZmZXJzIHdlcmUgdXNlZCBjb3VsZCBsZWFkIHRvCisgICAgc3RhcnZhdGlvbi4KKworICAqIFRDUCBNU1Mgb3B0aW9uIHdhc24ndCBwYXJzZWQgY29ycmVjdGx5LgorCisgICogUHJvYmxlbXMgd2l0aCBVRFAgY2hlY2tzdW0gY2FsY3VsYXRpb24uCisKKyAgKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyB0ZXN0cyBoYWQgZW5kaWFuZXNzIHByb2JsZW1zLgorCisgICogQVJQIHJlcXVlc3RzIGhhZCB3cm9uZyBkZXN0aW5hdGlvbiBoYXJkd2FyZSBhZGRyZXNzLgorCisgICsrIE90aGVyIGNoYW5nZXM6CisKKyAgKiBzdHJ1Y3QgZXRoX2FkZHIgY2hhbmdlZCBmcm9tIHUxNl90WzNdIGFycmF5IHRvIHU4X3RbNl0uCisKKyAgKiBBIC0+bGlua291dHB1dCgpIG1lbWJlciB3YXMgYWRkZWQgdG8gc3RydWN0IG5ldGlmLgorCisgICogVENQIGFuZCBVRFAgLT5kZXN0Xyogc3RydWN0IG1lbWJlcnMgd2hlcmUgY2hhbmdlZCB0byAtPnJlbW90ZV8qLgorCisgICogbnRvaCogbWFjcm9zIGFyZSBub3cgbnVsbCBkZWZpbml0aW9ucyBmb3IgYmlnIGVuZGlhbiBDUFVzLgorCisoMC41LjApIENoYW5nZXMgc2luY2UgdmVyc2lvbiAwLjQuMgorCisgICsrIE5ldyBmZWF0dXJlczoKKworICAqIFJlZGVzaWduZWQgb3BlcmF0aW5nIHN5c3RlbSBlbXVsYXRpb24gbGF5ZXIgdG8gbWFrZSBwb3J0aW5nIGVhc2llci4KKworICAqIEJldHRlciBjb250cm9sIG92ZXIgVENQIG91dHB1dCBidWZmZXJzLgorCisgICogRG9jdW1lbmF0aW9uIGFkZGVkLgorCisgICsrIEJ1Z2ZpeGVzOgorCisgICogTG9ja2luZyBpc3N1ZXMgaW4gYnVmZmVyIG1hbmFnZW1lbnQuCisKKyAgKiBCdWdmaXhlcyBpbiB0aGUgc2VxdWVudGlhbCBBUEkuCisKKyAgKiBJUCBmb3J3YXJkaW5nIGNvdWxkIGNhdXNlIG1lbW9yeSBsZWFrYWdlLiBUaGlzIGhhcyBiZWVuIGZpeGVkLgorCisgICsrIE90aGVyIGNoYW5nZXM6CisKKyAgKiBEaXJlY3Rvcnkgc3RydWN0dXJlIHNvbWV3aGF0IGNoYW5nZWQ7IHRoZSBjb3JlLyB0cmVlIGhhcyBiZWVuCisgICAgY29sbGFwc2VkLgorCisoMC40LjIpIENoYW5nZXMgc2luY2UgdmVyc2lvbiAwLjQuMQorCisgICsrIE5ldyBmZWF0dXJlczoKKworICAqIEV4cGVyaW1lbnRhbCBBUlAgaW1wbGVtZW50YXRpb24gYWRkZWQuCisKKyAgKiBTa2VsZXRvbiBFdGhlcm5ldCBkcml2ZXIgYWRkZWQuCisKKyAgKiBFeHBlcmltZW50YWwgQlNEIHNvY2tldCBBUEkgbGlicmFyeSBhZGRlZC4KKworICArKyBCdWdmaXhlczoKKworICAqIEluIHZlcnkgaW50ZW5zZSBzaXR1YXRpb25zLCBtZW1vcnkgbGVha2FnZSBjb3VsZCBvY2N1ci4gVGhpcyBoYXMKKyAgICBiZWVuIGZpeGVkLgorCisgICsrIE90aGVyIGNoYW5nZXM6CisKKyAgKiBWYXJpYWJsZXMgbmFtZWQgImRhdGEiIGFuZCAiY29kZSIgaGF2ZSBiZWVuIHJlbmFtZWQgaW4gb3JkZXIgdG8KKyAgICBhdm9pZCBuYW1lIGNvbmZsaWN0cyBpbiBjZXJ0YWluIGNvbXBpbGVycy4KKworICAqIFZhcmlhYmxlKysgaGF2ZSBpbiBhcHBsaWNpYWJsZSBjYXNlcyBiZWVuIHRyYW5zbGF0ZWQgdG8gKyt2YXJpYWJsZQorICAgIHNpbmNlIHNvbWUgY29tcGlsZXJzIGdlbmVyYXRlIGJldHRlciBjb2RlIGluIHRoZSBsYXR0ZXIgY2FzZS4KKworKDAuNC4xKSBDaGFuZ2VzIHNpbmNlIHZlcnNpb24gMC40CisKKyAgKysgTmV3IGZlYXR1cmVzOgorCisgICogVENQOiBDb25uZWN0aW9uIGF0dGVtcHRzIHRpbWUgb3V0IGVhcmxpZXIgdGhhbiBkYXRhCisgICAgdHJhbnNtaXNzaW9ucy4gTmFnbGUgYWxnb3JpdGhtIGltcGxlbWVudGVkLiBQdXNoIGZsYWcgc2V0IG9uIHRoZQorICAgIGxhc3Qgc2VnbWVudCBpbiBhIGJ1cnN0LgorCisgICogVURQOiBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgVURQLUxpdGUgZXh0ZW5zaW9ucy4KKworICArKyBCdWdmaXhlczoKKworICAqIFRDUDogb3V0IG9mIG9yZGVyIHNlZ21lbnRzIHdlcmUgaW4gc29tZSBjYXNlcyBoYW5kbGVkIGluY29ycmVjdGx5LAorICAgIGFuZCB0aGlzIGhhcyBub3cgYmVlbiBmaXhlZC4gRGVsYXllZCBhY2tub3dsZWRnZW1lbnRzIHdhcyBicm9rZW4KKyAgICBpbiAwLjQsIGhhcyBub3cgYmVlbiBmaXhlZC4gQmluZGluZyB0byBhbiBhZGRyZXNzIHRoYXQgaXMgaW4gdXNlCisgICAgbm93IHJlc3VsdHMgaW4gYW4gZXJyb3IuIFJlc2V0IGNvbm5lY3Rpb25zIHNvbWV0aW1lcyBodW5nIGFuCisgICAgYXBwbGljYXRpb247IHRoaXMgaGFzIGJlZW4gZml4ZWQuCisKKyAgKiBDaGVja3N1bSBjYWxjdWxhdGlvbiBzb21ldGltZXMgZmFpbGVkIGZvciBjaGFpbmVkIHBidWZzIHdpdGggb2RkCisgICAgbGVuZ3Rocy4gVGhpcyBoYXMgYmVlbiBmaXhlZC4KKworICAqIEFQSTogYSBsb3Qgb2YgYnVnIGZpeGVzIGluIHRoZSBBUEkuIFRoZSBVRFAgQVBJIGhhcyBiZWVuIGltcHJvdmVkCisgICAgYW5kIHRlc3RlZC4gRXJyb3IgcmVwb3J0aW5nIGFuZCBoYW5kbGluZyBoYXMgYmVlbgorICAgIGltcHJvdmVkLiBMb2dpY2FsIGZsYXdzIGFuZCByYWNlIGNvbmRpdGlvbnMgZm9yIGluY29taW5nIFRDUAorICAgIGNvbm5lY3Rpb25zIGhhcyBiZWVuIGZvdW5kIGFuZCByZW1vdmVkLgorCisgICogTWVtb3J5IG1hbmFnZXI6IGFsaWdubWVudCBpc3N1ZXMuIFJlYWxsb2NhdGluZyBtZW1vcnkgc29tZXRpbWVzCisgICAgZmFpbGVkLCB0aGlzIGhhcyBiZWVuIGZpeGVkLgorCisgICogR2VuZXJpYyBsaWJyYXJ5OiBiY29weSB3YXMgZmxhd2VkIGFuZCBoYXMgYmVlbiBmaXhlZC4KKworICArKyBPdGhlciBjaGFuZ2VzOgorCisgICogQVBJOiBhbGwgZGF0YXR5cGVzIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSBnZW5lcmljIG9uZXMgc3VjaCBhcworICAgIGludHMsIHRvIHNwZWNpZmllZCBvbmVzIHN1Y2ggYXMgdTE2X3QuIEZ1bmN0aW9ucyB0aGF0IHJldHVybgorICAgIGVycm9ycyBub3cgaGF2ZSB0aGUgY29ycmVjdCB0eXBlIChlcnJfdCkuCisKKyAgKiBHZW5lcmFsOiBBIGxvdCBvZiBjb2RlIGNsZWFuZWQgdXAgYW5kIGRlYnVnZ2luZyBjb2RlIHJlbW92ZWQuIE1hbnkKKyAgICBwb3J0YWJpbGl0eSBpc3N1ZXMgaGF2ZSBiZWVuIGZpeGVkLgorCisgICogVGhlIGxpY2Vuc2Ugd2FzIGNoYW5nZWQ7IHRoZSBhZHZlcnRpc2luZyBjbGF1c2Ugd2FzIHJlbW92ZWQuCisKKyAgKiBDNjQgcG9ydCBhZGRlZC4KKworICAqIFRoYW5rczogSHVnZSB0aGFua3MgZ28gdG8gRGFnYW4gR2FsYXJuZWF1LCBIb3JzdCBHYXJuZXR6a2UsIFBldHJpCisgICAgS29zdW5lbiwgTWlrYWVsIENhbGVyZXMsIGFuZCBGcml0cyBXaWxtaW5rIGZvciByZXBvcnRpbmcgYW5kCisgICAgZml4aW5nIGJ1Z3MhCisKKygwLjQpIENoYW5nZXMgc2luY2UgdmVyc2lvbiAwLjMuMQorCisgICogTWVtb3J5IG1hbmFnZW1lbnQgaGFzIGJlZW4gcmFkaWNhbGx5IGNoYW5nZWQ7IGluc3RlYWQgb2YKKyAgICBhbGxvY2F0aW5nIG1lbW9yeSBmcm9tIGEgc2hhcmVkIGhlYXAsIG1lbW9yeSBmb3Igb2JqZWN0cyB0aGF0IGFyZQorICAgIHJhcGlkbHkgYWxsb2NhdGVkIGFuZCBkZWFsbG9jYXRlZCBpcyBub3cga2VwdCBpbiBwb29scy4gQWxsb2NhdGlvbgorICAgIGFuZCBkZWFsbG9jYXRpb24gZnJvbSB0aG9zZSBtZW1vcnkgcG9vbHMgaXMgdmVyeSBmYXN0LiBUaGUgc2hhcmVkCisgICAgaGVhcCBpcyBzdGlsbCBwcmVzZW50IGJ1dCBpcyB1c2VkIGxlc3MgZnJlcXVlbnRseS4KKworICAqIFRoZSBtZW1vcnksIG1lbW9yeSBwb29sLCBhbmQgcGFja2V0IGJ1ZmZlciBzdWJzeXN0ZW1zIG5vdyBzdXBwb3J0CisgICAgNC0sIDItLCBvciAxLWJ5dGUgYWxpZ25tZW50LgorCisgICogIk91dCBvZiBtZW1vcnkiIHNpdHVhdGlvbnMgYXJlIGhhbmRsZWQgaW4gYSBtb3JlIHJvYnVzdCB3YXkuCisKKyAgKiBTdGFjayB1c2FnZSBoYXMgYmVlbiByZWR1Y2VkLgorCisgICogRWFzaWVyIGNvbmZpZ3VyYXRpb24gb2YgbHdJUCBwYXJhbWV0ZXJzIHN1Y2ggYXMgbWVtb3J5IHVzYWdlLAorICAgIFRUTHMsIHN0YXRpc3RpY3MgZ2F0aGVyaW5nLCBldGMuIEFsbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlCisgICAgbm93IGtlcHQgaW4gYSBzaW5nbGUgaGVhZGVyIGZpbGUgImx3aXBvcHRzLmgiLgorCisgICogVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaGFzIGJlZW4gY2hhbmdlZCBzbGlnaHRseSBzbyB0aGF0IGFsbAorICAgIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmaWxlcyBhcmUga2VwdCB1bmRlciB0aGUgc3JjL2FyY2gKKyAgICBoaWVyYXJjaHkuCisKKyAgKiBFcnJvciBwcm9wYWdhdGlvbiBoYXMgYmVlbiBpbXByb3ZlZCwgYm90aCBpbiB0aGUgcHJvdG9jb2wgbW9kdWxlcworICAgIGFuZCBpbiB0aGUgQVBJLgorCisgICogVGhlIGNvZGUgZm9yIHRoZSBSVFhDIGFyY2hpdGVjdHVyZSBoYXMgYmVlbiBpbXBsZW1lbnRlZCwgdGVzdGVkCisgICAgYW5kIHB1dCB0byB1c2UuCisKKyAgKiBCdWdzIGhhdmUgYmVlbiBmb3VuZCBhbmQgY29ycmVjdGVkIGluIHRoZSBUQ1AsIFVEUCwgSVAsIEFQSSwgYW5kCisgICAgdGhlIEludGVybmV0IGNoZWNrc3VtIG1vZHVsZXMuCisKKyAgKiBCdWdzIHJlbGF0ZWQgdG8gcG9ydGluZyBiZXR3ZWVuIGEgMzItYml0IGFuZCBhIDE2LWJpdCBhcmNoaXRlY3R1cmUKKyAgICBoYXZlIGJlZW4gZm91bmQgYW5kIGNvcnJlY3RlZC4KKworICAqIFRoZSBsaWNlbnNlIGhhcyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkgdG8gY29uZm9ybSBtb3JlIHdpdGggdGhlCisgICAgb3JpZ2luYWwgQlNEIGxpY2Vuc2UsIGluY2x1ZGluZyB0aGUgYWR2ZXJ0aXNlbWVudCBjbGF1c2UuCisKKygwLjMuMSkgQ2hhbmdlcyBzaW5jZSB2ZXJzaW9uIDAuMworCisgICogRml4IG9mIGEgZmF0YWwgYnVnIGluIHRoZSBidWZmZXIgbWFuYWdlbWVudC4gUGJ1ZnMgd2l0aCBhbGxvY2F0ZWQKKyAgICBSQU0gbmV2ZXIgcmV0dXJuZWQgdGhlIFJBTSB3aGVuIHRoZSBwYnVmIHdhcyBkZWFsbG9jYXRlZC4KKworICAqIFRDUCBjb25nZXN0aW9uIGNvbnRyb2wsIHdpbmRvdyB1cGRhdGVzIGFuZCByZXRyYW5zbWlzc2lvbnMgZGlkIG5vdAorICAgIHdvcmsgY29ycmVjdGx5LiBUaGlzIGhhcyBub3cgYmVlbiBmaXhlZC4KKworICAqIEJ1Z2ZpeGVzIGluIHRoZSBBUEkuCisKKygwLjMpIENoYW5nZXMgc2luY2UgdmVyc2lvbiAwLjIKKworICAqIE5ldyBhbmQgaW1wcm92ZWQgZGlyZWN0b3J5IHN0cnVjdHVyZS4gQWxsIGluY2x1ZGUgZmlsZXMgYXJlIG5vdworICAgIGtlcHQgaW4gYSBkZWRpY2F0ZWQgaW5jbHVkZS8gZGlyZWN0b3J5LgorCisgICogVGhlIEFQSSBub3cgaGFzIHByb3BlciBlcnJvciBoYW5kbGluZy4gQSBuZXcgZnVuY3Rpb24sCisgICAgbmV0Y29ubl9lcnIoKSwgbm93IHJldHVybnMgYW4gZXJyb3IgY29kZSBmb3IgdGhlIGNvbm5lY3Rpb24gaW4KKyAgICBjYXNlIG9mIGVycm9ycy4KKworICAqIEltcHJvdmVtZW50cyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBUaGUgc3lzdGVtIG5vdworICAgIGtlZXBzIGEgcG9pbnRlciB0byB0aGUgbG93ZXN0IGZyZWUgbWVtb3J5IGJsb2NrLiBBIG5ldyBmdW5jdGlvbiwKKyAgICBtZW1fbWFsbG9jMigpIHRyaWVzIHRvIGFsbG9jYXRlIG1lbW9yeSBvbmNlLCBhbmQgaWYgaXQgZmFpbHMgdHJpZXMKKyAgICB0byBmcmVlIHNvbWUgbWVtb3J5IGFuZCByZXRyeSB0aGUgYWxsb2NhdGlvbi4KKworICAqIE11Y2ggdGVzdGluZyBoYXMgYmVlbiBkb25lIHdpdGggbGltaXRlZCBtZW1vcnkKKyAgICBjb25maWd1cmF0aW9ucy4gbHdJUCBub3cgZG9lcyBhIGJldHRlciBqb2Igd2hlbiBvdmVybG9hZGVkLgorCisgICogU29tZSBidWdmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIHRoZSBidWZmZXIgKHBidWYpIHN1YnN5c3RlbS4KKworICAqIE1hbnkgYnVnZml4ZXMgaW4gdGhlIFRDUCBjb2RlOgorCisgICAgLSBGaXhlZCBhIGJ1ZyBpbiB0Y3BfY2xvc2UoKS4KKworICAgIC0gVGhlIFRDUCByZWNlaXZlIHdpbmRvdyB3YXMgaW5jb3JyZWN0bHkgY2xvc2VkIHdoZW4gb3V0IG9mCisgICAgICBzZXF1ZW5jZSBzZWdtZW50cyB3YXMgcmVjZWl2ZWQuIFRoaXMgaGFzIGJlZW4gZml4ZWQuCisKKyAgICAtIENvbm5lY3Rpb25zIGFyZSBub3cgdGltZWQtb3V0IG9mIHRoZSBGSU4tV0FJVC0yIHN0YXRlLgorCisgICAgLSBUaGUgaW5pdGlhbCBjb25nZXN0aW9uIHdpbmRvdyBjb3VsZCBpbiBzb21lIGNhc2VzIGJlIHRvbworICAgICAgbGFyZ2UuIFRoaXMgaGFzIGJlZW4gZml4ZWQuCisKKyAgICAtIFRoZSByZXRyYW5zbWlzc2lvbiBxdWV1ZSBjb3VsZCBpbiBzb21lIGNhc2VzIGJlIHNjcmV3ZWQgdXAuIFRoaXMKKyAgICAgIGhhcyBiZWVuIGZpeGVkLgorCisgICAgLSBUQ1AgUlNUIGZsYWcgbm93IGhhbmRsZWQgY29ycmVjdGx5LgorCisgICAgLSBPdXQgb2Ygc2VxdWVuY2UgZGF0YSB3YXMgaW4gc29tZSBjYXNlcyBuZXZlciBkZWxpdmVyZWQgdG8gdGhlCisgICAgICBhcHBsaWNhdGlvbi4gVGhpcyBoYXMgYmVlbiBmaXhlZC4KKworICAgIC0gUmV0cmFuc21pdHRlZCBzZWdtZW50cyBub3cgY29udGFpbiB0aGUgY29ycmVjdCBhY2tub3dsZWRnbWVudAorICAgICAgbnVtYmVyIGFuZCBhZHZlcnRpc2VkIHdpbmRvdy4KKworICAgIC0gVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgYmFja29mZnMgYXJlIG5vdCBjb3JyZWN0bHkgY29tcHV0ZWQKKyAgICAgIChhbGEgQlNEKS4gQWZ0ZXIgYSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zLCBUQ1Agbm93IGdpdmVzIHVwCisgICAgICB0aGUgY29ubmVjdGlvbi4KKworICAqIFRDUCBjb25uZWN0aW9ucyBub3cgYXJlIGtlcHQgb24gdGhyZWUgbGlzdHMsIG9uZSBmb3IgYWN0aXZlCisgICAgY29ubmVjdGlvbnMsIG9uZSBmb3IgbGlzdGVuaW5nIGNvbm5lY3Rpb25zLCBhbmQgb25lIGZvcgorICAgIGNvbm5lY3Rpb25zIHRoYXQgYXJlIGluIFRJTUUtV0FJVC4gVGhpcyBncmVhdGx5IHNwZWVkcyB1cCB0aGUgZmFzdAorICAgIHRpbWVvdXQgcHJvY2Vzc2luZyBmb3Igc2VuZGluZyBkZWxheWVkIEFDS3MuCisKKyAgKiBUQ1Agbm93IHByb3ZpZGVzIHByb3BlciBmZWVkYmFjayB0byB0aGUgYXBwbGljYXRpb24gd2hlbiBhCisgICAgY29ubmVjdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2V0IHVwLgorCisgICogTW9yZSBjb21tZW50cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGNvZGUuIFRoZSBjb2RlIGhhcyBhbHNvIGJlZW4KKyAgICBzb21ld2hhdCBjbGVhbmVkIHVwLgorCisoMC4yKSBJbml0aWFsIHB1YmxpYyByZWxlYXNlLgpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL0NPUFlJTkcgYi9jb3JlL2x3aXAvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM4OThiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL0NPUFlJTkcKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL0ZJTEVTIGIvY29yZS9sd2lwL0ZJTEVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjUzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvRklMRVMKQEAgLTAsMCArMSw0IEBACitzcmMvICAgICAgLSBUaGUgc291cmNlIGNvZGUgZm9yIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KK2RvYy8gICAgICAtIFRoZSBkb2N1bWVudGF0aW9uIGZvciBsd0lQLgorCitTZWUgYWxzbyB0aGUgRklMRVMgZmlsZSBpbiBlYWNoIHN1YmRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9SRUFETUUgYi9jb3JlL2x3aXAvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmNjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvUkVBRE1FCkBAIC0wLDAgKzEsODkgQEAKK0lOVFJPRFVDVElPTgorCitsd0lQIGlzIGEgc21hbGwgaW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbAorc3VpdGUgdGhhdCBoYXMgYmVlbiBkZXZlbG9wZWQgYnkgQWRhbSBEdW5rZWxzIGF0IHRoZSBDb21wdXRlciBhbmQKK05ldHdvcmtzIEFyY2hpdGVjdHVyZXMgKENOQSkgbGFiIGF0IHRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlcgorU2NpZW5jZSAoU0lDUykuCisKK1RoZSBmb2N1cyBvZiB0aGUgbHdJUCBUQ1AvSVAgaW1wbGVtZW50YXRpb24gaXMgdG8gcmVkdWNlIHRoZSBSQU0gdXNhZ2UKK3doaWxlIHN0aWxsIGhhdmluZyBhIGZ1bGwgc2NhbGUgVENQLiBUaGlzIG1ha2luZyBsd0lQIHN1aXRhYmxlIGZvciB1c2UKK2luIGVtYmVkZGVkIHN5c3RlbXMgd2l0aCB0ZW5zIG9mIGtpbG9ieXRlcyBvZiBmcmVlIFJBTSBhbmQgcm9vbSBmb3IKK2Fyb3VuZCA0MCBraWxvYnl0ZXMgb2YgY29kZSBST00uCisKK0ZFQVRVUkVTCisKKyAgKiBJUCAoSW50ZXJuZXQgUHJvdG9jb2wpIGluY2x1ZGluZyBwYWNrZXQgZm9yd2FyZGluZyBvdmVyIG11bHRpcGxlIG5ldHdvcmsKKyAgICBpbnRlcmZhY2VzCisgICogSUNNUCAoSW50ZXJuZXQgQ29udHJvbCBNZXNzYWdlIFByb3RvY29sKSBmb3IgbmV0d29yayBtYWludGVuYW5jZSBhbmQgZGVidWdnaW5nCisgICogSUdNUCAoSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbCkgZm9yIG11bHRpY2FzdCB0cmFmZmljIG1hbmFnZW1lbnQKKyAgKiBVRFAgKFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wpIGluY2x1ZGluZyBleHBlcmltZW50YWwgVURQLWxpdGUgZXh0ZW5zaW9ucworICAqIFRDUCAoVHJhbnNtaXNzaW9uIENvbnRyb2wgUHJvdG9jb2wpIHdpdGggY29uZ2VzdGlvbiBjb250cm9sLCBSVFQgZXN0aW1hdGlvbgorICAgIGFuZCBmYXN0IHJlY292ZXJ5L2Zhc3QgcmV0cmFuc21pdAorICAqIFNwZWNpYWxpemVkIHJhdy9uYXRpdmUgQVBJIGZvciBlbmhhbmNlZCBwZXJmb3JtYW5jZQorICAqIE9wdGlvbmFsIEJlcmtlbGV5LWxpa2Ugc29ja2V0IEFQSQorICAqIEROUyAoRG9tYWluIG5hbWVzIHJlc29sdmVyKQorICAqIFNOTVAgKFNpbXBsZSBOZXR3b3JrIE1hbmFnZW1lbnQgUHJvdG9jb2wpCisgICogREhDUCAoRHluYW1pYyBIb3N0IENvbmZpZ3VyYXRpb24gUHJvdG9jb2wpCisgICogQVVUT0lQIChmb3IgSVB2NCwgY29uZm9ybSB3aXRoIFJGQyAzOTI3KQorICAqIFBQUCAoUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wpCisgICogQVJQIChBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wpIGZvciBFdGhlcm5ldAorCitMSUNFTlNFCisKK2x3SVAgaXMgZnJlZWx5IGF2YWlsYWJsZSB1bmRlciBhIEJTRCBsaWNlbnNlLgorCitERVZFTE9QTUVOVAorCitsd0lQIGhhcyBncm93biBpbnRvIGFuIGV4Y2VsbGVudCBUQ1AvSVAgc3RhY2sgZm9yIGVtYmVkZGVkIGRldmljZXMsCithbmQgZGV2ZWxvcGVycyB1c2luZyB0aGUgc3RhY2sgb2Z0ZW4gc3VibWl0IGJ1ZyBmaXhlcywgaW1wcm92ZW1lbnRzLAorYW5kIGFkZGl0aW9ucyB0byB0aGUgc3RhY2sgdG8gZnVydGhlciBpbmNyZWFzZSBpdHMgdXNlZnVsbmVzcy4KKworRGV2ZWxvcG1lbnQgb2YgbHdJUCBpcyBob3N0ZWQgb24gU2F2YW5uYWgsIGEgY2VudHJhbCBwb2ludCBmb3IKK3NvZnR3YXJlIGRldmVsb3BtZW50LCBtYWludGVuYW5jZSBhbmQgZGlzdHJpYnV0aW9uLiBFdmVyeW9uZSBjYW4KK2hlbHAgaW1wcm92ZSBsd0lQIGJ5IHVzZSBvZiBTYXZhbm5haCdzIGludGVyZmFjZSwgQ1ZTIGFuZCB0aGUKK21haWxpbmcgbGlzdC4gQSBjb3JlIHRlYW0gb2YgZGV2ZWxvcGVycyB3aWxsIGNvbW1pdCBjaGFuZ2VzIHRvIHRoZQorQ1ZTIHNvdXJjZSB0cmVlLgorCitUaGUgbHdJUCBUQ1AvSVAgc3RhY2sgaXMgbWFpbnRhaW5lZCBpbiB0aGUgJ2x3aXAnIENWUyBtb2R1bGUgYW5kCitjb250cmlidXRpb25zIChzdWNoIGFzIHBsYXRmb3JtIHBvcnRzKSBhcmUgaW4gdGhlICdjb250cmliJyBtb2R1bGUuCisKK1NlZSBkb2Mvc2F2YW5uYWgudHh0IGZvciBkZXRhaWxzIG9uIENWUyBzZXJ2ZXIgYWNjZXNzIGZvciB1c2VycyBhbmQKK2RldmVsb3BlcnMuCisKK0xhc3QgbmlnaHQncyBDVlMgdGFyIGJhbGwgY2FuIGJlIGRvd25sb2FkZWQgZnJvbToKKyAgaHR0cDovL3NhdmFubmFoLmdudS5vcmcvY3ZzLmJhY2t1cHMvbHdpcC50YXIuZ3ogW0NIQU5HRUQgLSBORUVEUyBGSVhJTkddCisKK1RoZSBjdXJyZW50IENWUyB0cmVlcyBhcmUgd2ViLWJyb3dzYWJsZToKKyAgaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvY2dpLWJpbi92aWV3Y3ZzL2x3aXAvbHdpcC8KKyAgaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvY2dpLWJpbi92aWV3Y3ZzL2x3aXAvY29udHJpYi8KKworU3VibWl0IHBhdGNoZXMgYW5kIGJ1Z3MgdmlhIHRoZSBsd0lQIHByb2plY3QgcGFnZToKKyAgaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvcHJvamVjdHMvbHdpcC8KKworCitET0NVTUVOVEFUSU9OCisKK1RoZSBvcmlnaW5hbCBvdXQtZGF0ZWQgaG9tZXBhZ2Ugb2YgbHdJUCBhbmQgQWRhbSBEdW5rZWxzJyBwYXBlcnMgb24KK2x3SVAgYXJlIGF0IHRoZSBvZmZpY2lhbCBsd0lQIGhvbWUgcGFnZToKKyAgaHR0cDovL3d3dy5zaWNzLnNlL35hZGFtL2x3aXAvCisKK1NlbGYgZG9jdW1lbnRhdGlvbiBvZiB0aGUgc291cmNlIGNvZGUgaXMgcmVndWxhcmx5IGV4dHJhY3RlZCBmcm9tIHRoZQorY3VycmVudCBDVlMgc291cmNlcyBhbmQgaXMgYXZhaWxhYmxlIGZyb20gdGhpcyB3ZWIgcGFnZToKKyAgaHR0cDovL3d3dy5ub25nbnUub3JnL2x3aXAvCisKK1RoZXJlIGlzIG5vdyBhIGNvbnN0YW50bHkgZ3Jvd2luIHdpa2kgYWJvdXQgbHdJUCBhdAorICBodHRwOi8vbHdpcC53aWtpYS5jb20vd2lraS9Md0lQX1dpa2kKKworQWxzbywgdGhlcmUgYXJlIG1haWxpbmcgbGlzdHMgeW91IGNhbiBzdWJzY3JpYmUgYXQKKyAgaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvbWFpbC8/Z3JvdXA9bHdpcAorcGx1cyBzZWFyY2hhYmxlIGFyY2hpdmVzOgorICBodHRwOi8vbGlzdHMubm9uZ251Lm9yZy9hcmNoaXZlL2h0bWwvbHdpcC11c2Vycy8KKyAgaHR0cDovL2xpc3RzLm5vbmdudS5vcmcvYXJjaGl2ZS9odG1sL2x3aXAtZGV2ZWwvCisKK1JlYWRpbmcgQWRhbSdzIHBhcGVycywgdGhlIGZpbGVzIGluIGRvY3MvLCBicm93c2luZyB0aGUgc291cmNlIGNvZGUKK2RvY3VtZW50YXRpb24gYW5kIGJyb3dzaW5nIHRoZSBtYWlsaW5nIGxpc3QgYXJjaGl2ZXMgaXMgYSBnb29kIHdheSB0bworYmVjb21lIGZhbWlsaWFyIHdpdGggdGhlIGRlc2lnbiBvZiBsd0lQLgorCitBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KK0xlb24gV29lc3RlbmJlcmcgPGxlb24ud29lc3RlbmJlcmdAZ214Lm5ldD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL1VQR1JBRElORyBiL2NvcmUvbHdpcC9VUEdSQURJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwMTEwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9VUEdSQURJTkcKQEAgLTAsMCArMSwxNDQgQEAKK1RoaXMgZmlsZSBsaXN0cyBtYWpvciBjaGFuZ2VzIGJldHdlZW4gcmVsZWFzZSB2ZXJzaW9ucyB0aGF0IHJlcXVpcmUKK3BvcnRzIG9yIGFwcGxpY2F0aW9ucyB0byBiZSBjaGFuZ2VkLiBVc2UgaXQgdG8gdXBkYXRlIGEgcG9ydCBvciBhbgorYXBwbGljYXRpb24gd3JpdHRlbiBmb3IgYW4gb2xkZXIgdmVyc2lvbiBvZiBsd0lQIHRvIGNvcnJlY3RseSB3b3JrCit3aXRoIG5ld2VyIHZlcnNpb25zLgorCisKKyhDVlMgSEVBRCkKKworICAqIFtFbnRlciBuZXcgY2hhbmdlcyBqdXN0IGFmdGVyIHRoaXMgbGluZSAtIGRvIG5vdCByZW1vdmUgdGhpcyBsaW5lXQorCisgICsrIEFwcGxpY2F0aW9uIGNoYW5nZXM6CisKKyAgKiBSZXBsYWNlZCBzdHJ1Y3QgaXBfYWRkciBieSB0eXBlZGVmIGlwX2FkZHJfdCAoc3RydWN0IGlwX2FkZHIgaXMga2VwdCBmb3IKKyAgICBjb21wYXRpYmlsaXR5IHRvIG9sZCBhcHBsaWNhdGlvbnMsIGJ1dCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSkuCisKKyAgKiBSZW5hbWVkIG1lbV9yZWFsbG9jKCkgdG8gbWVtX3RyaW0oKSB0byBwcmV2ZW50IGNvbmZ1c2lvbiB3aXRoIHJlYWxsb2MoKQorCisgICsrKyBSYXcgQVBJOgorICAgICogQ2hhbmdlZCB0aGUgc2VtYW50aWNzIG9mIHRjcF9jbG9zZSgpIChzaW5jZSBpdCB3YXMgcmF0aGVyIGEKKyAgICAgIHNodXRkb3duIGJlZm9yZSk6IE5vdyB0aGUgYXBwbGljYXRpb24gZG9lcyAqTk9UKiBnZXQgYW55IGNhbGxzIHRvIHRoZSByZWN2CisgICAgICBjYWxsYmFjayAoYXNpZGUgZnJvbSBOVUxML2Nsb3NlZCkgYWZ0ZXIgY2FsbGluZyB0Y3BfY2xvc2UoKQorCisgICAgKiBXaGVuIGNhbGxpbmcgdGNwX2Fib3J0KCkgZnJvbSBhIHJhdyBBUEkgVENQIGNhbGxiYWNrIGZ1bmN0aW9uLAorICAgICAgbWFrZSBzdXJlIHlvdSByZXR1cm4gRVJSX0FCUlQgdG8gcHJldmVudCBhY2Nlc3NpbmcgdW5hbGxvY2F0ZWQgbWVtb3J5LgorICAgICAgKEVSUl9BQlJUIG5vdyBtZWFucyB0aGUgYXBwbGljYWl0b24gaGFzIGNhbGxlZCB0Y3BfYWJvcnQhKQorCisgICsrKyBOZXRjb25uIEFQSToKKyAgICAqIENoYW5nZWQgbmV0Y29ubl9yZWNlaXZlKCkgYW5kIG5ldGNvbm5fYWNjZXB0KCkgdG8gcmV0dXJuCisgICAgICBlcnJfdCwgbm90IGEgcG9pbnRlciB0byBuZXcgZGF0YS9uZXRjb25uLgorCisgICsrKyBTb2NrZXQgQVBJOgorICAgICogTFdJUF9TT19SQ1ZUSU1FTzogd2hlbiBhY2NlcHQoKSBvciByZWN2KCkgdGltZSBvdXQsIHRoZXkKKyAgICAgIG5vdyBzZXQgZXJybm8gdG8gRVdPVUxEQkxPQ0svRUFHQUlOLCBub3QgRVRJTUVET1VULgorCisgICAgKiBBZGRlZCBhIG1pbmltYWwgdmVyc2lvbiBvZiBwb3NpeCBmY3RsKCkgdG8gaGF2ZSBhCisgICAgICBzdGFuZGFyZGlzZWQgd2F5IHRvIHNldCBPX05PTkJMT0NLIGZvciBub25ibG9ja2luZyBzb2NrZXRzLgorCisgICsrKyBhbGwgQVBJczoKKyAgICAqIGNvcnJlY3RseSBpbXBsZW1lbnRlZCBTTyhGKV9SRVVTRUFERFIKKworICArKyBQb3J0IGNoYW5nZXMKKworICArKysgbmV3IGZpbGVzOgorCisgICAgKiBBZGRlZCA0IG5ldyBmaWxlczogZGVmLmMsIHRpbWVycy5jLCB0aW1lcnMuaCwgdGNwX2ltcGwuaDoKKworICAgICogTW92ZWQgc3RhY2staW50ZXJuYWwgcGFydHMgb2YgdGNwLmggdG8gdGNwX2ltcGwuaCwgdGNwLmggbm93IG9ubHkgY29udGFpbnMKKyAgICAgIHRoZSBhY3R1YWwgYXBwbGljYXRpb24gcHJvZ3JhbW1lcidzIEFQSQorICAKKyAgICAqIFNlcGFyYXRlZCB0aW1lciBpbXBsZW1lbnRhdGlvbiBmcm9tIHN5cy5oLy5jLCBtb3ZlZCB0byB0aW1lcnMuaC8uYzsKKyAgICAgIEFkZGVkIHRpbWVyIGltcGxlbWVudGF0aW9uIGZvciBOT19TWVM9PTEsIHNldCBOT19TWVNfTk9fVElNRVJTPT0xIGlmIHlvdQorICAgICAgc3RpbGwgd2FudCB0byB1c2UgeW91ciBvd24gdGltZXIgaW1wbGVtZW50YXRpb24gZm9yIE5PX1NZUz09MCAoYXMgYmVmb3JlKS4KKworICArKysgc3lzIGxheWVyOgorCisgICAgKiBDb252ZXJ0ZWQgbWJveC0gYW5kIHNlbWFwaG9yZS1mdW5jdGlvbnMgdG8gdGFrZSBwb2ludGVycyB0byBzeXNfbWJveF90LworICAgICAgc3lzX3NlbV90OworCisgICAgKiBDb252ZXJ0ZWQgc3lzX21ib3hfbmV3L3N5c19zZW1fbmV3IHRvIHRha2UgcG9pbnRlcnMgYW5kIHJldHVybiBlcnJfdDsKKworICAgICogQWRkZWQgTXV0ZXggY29uY2VwdCBpbiBzeXNfYXJjaCAoZGVmaW5lIExXSVBfQ09NUEFUX01VVEVYIHRvIGxldCBzeXMuaCB1c2UKKyAgICAgIGJpbmFyeSBzZW1hcGhvcmVzIGluc3RlYWQgb2YgbXV0ZXhlcyAtIGFzIGJlZm9yZSkKKworICArKysgbmV3IG9wdGlvbnM6CisKKyAgICAgKiBEb24ndCB3YXN0ZSBtZW1vcnkgd2hlbiBjaGFpbmluZyBzZWdtZW50cywgYWRkZWQgb3B0aW9uIFRDUF9PVkVSU0laRSB0bworICAgICAgIHByZXZlbnQgY3JlYXRpbmcgbWFueSBzbWFsbCBwYnVmcyB3aGVuIGNhbGxpbmcgdGNwX3dyaXRlIHdpdGggbWFueSBzbWFsbAorICAgICAgIGJsb2NrcyBvZiBkYXRhLiBJbnN0ZWFkLCBwYnVmcyBhcmUgYWxsb2NhdGVkIGxhcmdlciB0aGFuIG5lZWRlZCBhbmQgdGhlCisgICAgICAgc3BhY2UgaXMgdXNlZCBmb3IgbGF0ZXIgY2FsbHMgdG8gdGNwX3dyaXRlLgorCisgICAgICogQWRkZWQgTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRiB0byBhbHdheXMgY29weSB0byB0cnkgdG8gY3JlYXRlIHNpbmdsZSBwYnVmcworICAgICAgIGluIHRjcF93cml0ZS91ZHBfc2VuZC4KKworICAgICogQWRkZWQgYW4gYWRkaXRpb25hbCBvcHRpb24gTFdJUF9FVEhFUk5FVCB0byBzdXBwb3J0IGV0aGVybmV0IHdpdGhvdXQgQVJQCisgICAgICAobmVjZXNzYXJ5IGZvciBwdXJlIFBQUG9FKQorCisgICAgKiBBZGQgTUVNUF9TRVBBUkFURV9QT09MUyB0byBwbGFjZSBtZW1vcnkgcG9vbHMgaW4gc2VwYXJhdGUgYXJyYXlzLiBUaGlzIG1heQorICAgICAgYmUgdXNlZCB0byBwbGFjZSB0aGVzZSBwb29scyBpbnRvIHVzZXItZGVmaW5lZCBtZW1vcnkgYnkgdXNpbmcgZXh0ZXJuYWwKKyAgICAgIGRlY2xhcmF0aW9uLgorCisgICAgKiBBZGRlZCBUQ1BfU05EUVVFVUVMT1dBVCBjb3JyZXNwb25kaW5nIHRvIFRDUF9TTkRMT1dBVAorCisgICsrKyBuZXcgcG9vbHM6CisKKyAgICAgKiBOZXRkYiB1c2VzIGEgbWVtcCBwb29sIGZvciBhbGxvY2F0aW5nIG1lbW9yeSB3aGVuIGdldGFkZHJpbmZvKCkgaXMgY2FsbGVkLAorICAgICAgIHNvIE1FTVBfTlVNX05FVERCIGhhcyB0byBiZSBzZXQgYWNjb3JkaW5nbHkuCisKKyAgICAgKiBETlNfTE9DQUxfSE9TVExJU1RfSVNfRFlOQU1JQyB1c2VzIGEgbWVtcCBwb29sIGluc3RlYWQgb2YgdGhlIGhlYXAsIHNvCisgICAgICAgTUVNUF9OVU1fTE9DQUxIT1NUTElTVCBoYXMgdG8gYmUgc2V0IGFjY29yZGluZ2x5LgorCisgICAgICogU25tcC1hZ2VudCB1c2VzIGEgbWVtcCBwb29scyBpbnN0ZWFkIG9mIHRoZSBoZWFwLCBzbyBNRU1QX05VTV9TTk1QXyogaGF2ZQorICAgICAgIHRvIGJlIHNldCBhY2NvcmRpbmdseS4KKworICAgICAqIFBQUG9FIHVzZXMgYSBNRU1QIHBvb2wgaW5zdGVhZCBvZiB0aGUgaGVhcCwgc28gTUVNUF9OVU1fUFBQT0VfSU5URVJGQUNFUworICAgICAgIGhhcyB0byBiZSBzZXQgYWNjb3JkaW5nbHkKKworICAqIEludGVncmF0ZWQgbG9vcGlmIGludG8gbmV0aWYuYyAtIGxvb3BpZiBkb2VzIG5vdCBoYXZlIHRvIGJlIGNyZWF0ZWQgYnkgdGhlCisgICAgcG9ydCBhbnkgbW9yZSwganVzdCBkZWZpbmUgTFdJUF9IQVZFX0xPT1BJRiB0byAxLgorCisgICogQWRkZWQgZGVmaW5lIExXSVBfUkFORCgpIGZvciBsd2lwLXdpZGUgcmFuZG9taXphdGlvbiAobmVlZHMgdG8gYmUgZGVmaW5lZAorICAgIGluIGNjLmgsIGUuZy4gdXNlZCBieSBpZ21wKQorCisgICogQWRkZWQgcHJpbnRmLWZvcm1hdHRlciBYOF9GIHRvIHByaW50ZiB1OF90IGFzIGhleAorCisgICogVGhlIGhlYXAgbm93IG1heSBiZSBtb3ZlZCB0byB1c2VyLWRlZmluZWQgbWVtb3J5IGJ5IGRlZmluaW5nCisgICAgTFdJUF9SQU1fSEVBUF9QT0lOVEVSIGFzIGEgdm9pZCBwb2ludGVyIHRvIHRoYXQgbWVtb3J5J3MgYWRkcmVzcworCisgICogYWRkZWQgYXV0b2lwX3NldF9zdHJ1Y3QoKSBhbmQgZGhjcF9zZXRfc3RydWN0KCkgdG8gbGV0IGF1dG9pcCBhbmQgZGhjcCB3b3JrCisgICAgd2l0aCB1c2VyLWFsbG9jYXRlZCBzdHJ1Y3RzIGluc3RlYWQgb2YgY2FsbGluZyBtZW1fbWFsbG9jCisKKyAgKiBBZGRlZCBjb25zdCBjaGFyKiBuYW1lIHRvIG1lbS0gYW5kIG1lbXAtc3RhdHMgZm9yIGVhc2llciBkZWJ1Z2dpbmcuCisKKyAgKiBDYWxjdWxhdGUgdGhlIFRDUC9VRFAgY2hlY2tzdW0gd2hpbGUgY29weWluZyB0byBvbmx5IGZldGNoIGRhdGEgb25jZToKKyAgICBEZWZpbmUgTFdJUF9DSEtTVU1fQ09QWSB0byBhIG1lbWNweS1saWtlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY2hlY2tzdW0KKworICAqIEFkZGVkIFNPX1JFVVNFX1JYVE9BTEwgdG8gcGFzcyByZWNlaXZlZCBVRFAgYnJvYWRjYXN0L211bHRpY2FzdCBwYWNrZXRzIHRvCisgICAgbW9yZSB0aGFuIG9uZSBwY2IuCisKKyAgKiBDaGFuZ2VkIHRoZSBzZW1hbnRpY3Mgb2YgQVJQX1FVRVVFSU5HPT0wOiBBUlBfUVVFVUVJTkcgbm93IGNhbm5vdCBiZSB0dXJuZWQKKyAgICBvZmYgYW55IG1vcmUsIGlmIHRoaXMgaXMgc2V0IHRvIDAsIG9ubHkgb25lIHBhY2tldCAodGhlIG1vc3QgcmVjZW50IG9uZSkgaXMKKyAgICBxdWV1ZWQgKGxpa2UgZGVtYW5kZWQgYnkgUkZDIDExMjIpLgorCisgIAorICArKyBNYWpvciBidWdmaXhlcy9pbXByb3ZlbWVudHMKKworICAqIEltcGxlbWVudGVkIHRjcF9zaHV0ZG93bigpIHRvIG9ubHkgc2h1dCBkb3duIG9uZSBlbmQgb2YgYSBjb25uZWN0aW9uCisgICogSW1wbGVtZW50ZWQgc2h1dGRvd24oKSBhdCBzb2NrZXQtIGFuZCBuZXRjb25uLWxldmVsCisgICogQWRkZWQgZXJyb3JzZXQgc3VwcG9ydCB0byBzZWxlY3QoKSArIGltcHJvdmVkIHNlbGVjdCBzcGVlZCBvdmVyaGVhZAorICAqIE1lcmdlZCBwcHBkIHRvIHYyLjMuMTEgKGluY2x1ZGluZyBzb21lIGJhY2twb3J0ZWQgYnVnZml4ZXMgZnJvbSAyLjQueCkKKyAgKiBBZGRlZCB0aW1lciBpbXBsZW1lbnRhdGlvbiBmb3IgTk9fU1lTPT0xIChtYXkgYmUgZGlzYWJsZWQgd2l0aCBOT19TWVNfTk9fVElNRVJTPT0xCisgICogVXNlIG1hY3JvcyBkZWZpbmVkIGluIGlwX2FkZHIuaCB0byB3b3JrIHdpdGggSVAgYWRkcmVzc2VzCisgICogSW1wbGVtZW50ZWQgbWFueSBub25ibG9ja2luZyBzb2NrZXQvbmV0Y29ubiBmdW5jdGlvbnMKKyAgKiBGaXhlZCBBUlAgaW5wdXQgcHJvY2Vzc2luZzogb25seSBhZGQgYSBuZXcgZW50cnkgaWYgYSByZXF1ZXN0IHdhcyBkaXJlY3RlZCBhcyB1cworICAqIG1lbV9yZWFsbG9jKCkgdG8gbWVtX3RyaW0oKSB0byBwcmV2ZW50IGNvbmZ1c2lvbiB3aXRoIHJlYWxsb2MoKQorICAqIFNvbWUgaW1wcm92ZW1lbnRzIGZvciBBdXRvSVAgKGRvbid0IHJvdXRlL2ZvcndhcmQgbGluay1sb2NhbCBhZGRyZXNzZXMsIGRvbid0IGJyZWFrCisgICAgZXhpc3RpbmcgY29ubmVjdGlvbnMgd2hlbiBhc3NpZ25pbmcgYSByb3V0YWJsZSBhZGRyZXNzKQorICAqIENvcnJlY3RseSBoYW5kbGUgcmVtb3RlIHNpZGUgb3ZlcnJ1bm5pbmcgb3VyIHJjdl93bmQgaW4gb29zZXEgY2FzZQorICAqIFJlbW92ZWQgcGFja2luZyBmcm9tIGlwX2FkZHJfdCwgdGhlIHBhY2tlZCB2ZXJzaW9uIGlzIG5vdyBvbmx5IHVzZWQgaW4gcHJvdG9jb2wgaGVhZGVycworICAqIENvcnJlY3RlZCBQQlVGX1BPT0xfQlVGU0laRSBmb3IgcG9ydHMgd2hlcmUgRVRIX1BBRF9TSVpFID4gMAorICAqIEFkZGVkIHN1cHBvcnQgZm9yIHN0YXRpYyBBUlAgdGFibGUgZW50cmllcworCisoU1RBQkxFLTEuMy4yKQorCisgICogaW5pdGlhbCB2ZXJzaW9uIG9mIHRoaXMgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL2RvYy9GSUxFUyBiL2NvcmUvbHdpcC9kb2MvRklMRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkMzU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9kb2MvRklMRVMKQEAgLTAsMCArMSw2IEBACitzYXZhbm5haC50eHQgICAtIEhvdyB0byBvYnRhaW4gdGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgc291cmNlIGNvZGUuCitjb250cmliLnR4dCAgICAtIEhvdyB0byBjb250cmlidXRlIHRvIGx3SVAgYXMgYSBkZXZlbG9wZXIuCityYXdhcGkudHh0ICAgICAtIFRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgY29yZSBBUEkgb2YgbHdJUC4KKyAgICAgICAgICAgICAgICAgQWxzbyBwcm92aWRlcyBhbiBvdmVydmlldyBhYm91dCB0aGUgb3RoZXIgQVBJcyBhbmQgbXVsdGl0aHJlYWRpbmcuCitzbm1wX2FnZW50LnR4dCAtIFRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbHdJUCBTTk1QIGFnZW50Lgorc3lzX2FyY2gudHh0ICAgLSBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBzeXN0ZW0gYWJzdHJhY3Rpb24gbGF5ZXIgb2YgbHdJUC4KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9kb2MvY29udHJpYi50eHQgYi9jb3JlL2x3aXAvZG9jL2NvbnRyaWIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTk2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvZG9jL2NvbnRyaWIudHh0CkBAIC0wLDAgKzEsNjMgQEAKKzEgSW50cm9kdWN0aW9uCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHNvbWUgZ3VpZGVsaW5lcyBmb3IgcGVvcGxlIHBhcnRpY2lwYXRpbmcKK2luIGx3SVAgZGV2ZWxvcG1lbnQuCisKKzIgSG93IHRvIGNvbnRyaWJ1dGUgdG8gbHdJUAorCitIZXJlIGlzIGEgc2hvcnQgbGlzdCBvZiBzdWdnZXN0aW9ucyB0byBhbnlib2R5IHdvcmtpbmcgd2l0aCBsd0lQIGFuZCAKK3RyeWluZyB0byBjb250cmlidXRlIGJ1ZyByZXBvcnRzLCBmaXhlcywgZW5oYW5jZW1lbnRzLCBwbGF0Zm9ybSBwb3J0cyBldGMuCitGaXJzdCBvZiBhbGwgYXMgeW91IG1heSBhbHJlYWR5IGtub3cgbHdJUCBpcyBhIHZvbHVudGVlciBwcm9qZWN0IHNvIGZlZWRiYWNrCit0byBmaXhlcyBvciBxdWVzdGlvbnMgbWlnaHQgb2Z0ZW4gY29tZSBsYXRlLiBIb3BlZnVsbHkgdGhlIGJ1ZyBhbmQgcGF0Y2ggdHJhY2tpbmcgCitmZWF0dXJlcyBvZiBTYXZhbm5haCBoZWxwIHVzIG5vdCBsb3NlIHVzZXJzJyBpbnB1dC4KKworMi4xIFNvdXJjZSBjb2RlIHN0eWxlOgorCisxLiBkbyBub3QgdXNlIHRhYnMuCisyLiBpbmRlbnRhdGlvbiBpcyB0d28gc3BhY2VzIHBlciBsZXZlbCAoaS5lLiBwZXIgdGFiKS4KKzMuIGVuZCBkZWJ1ZyBtZXNzYWdlcyB3aXRoIGEgdHJhaWxpbmcgbmV3bGluZSAoXG4pLgorNC4gb25lIHNwYWNlIGJldHdlZW4ga2V5d29yZCBhbmQgb3BlbmluZyBicmFja2V0LgorNS4gbm8gc3BhY2UgYmV0d2VlbiBmdW5jdGlvbiBhbmQgb3BlbmluZyBicmFja2V0LgorNi4gb25lIHNwYWNlIGFuZCBubyBuZXdsaW5lIGJlZm9yZSBvcGVuaW5nIGN1cmx5IGJyYWNlcyBvZiBhIGJsb2NrLgorNy4gY2xvc2luZyBjdXJseSBicmFjZSBvbiBhIHNpbmdsZSBsaW5lLgorOC4gc3BhY2VzIHN1cnJvdW5kaW5nIGFzc2lnbm1lbnQgYW5kIGNvbXBhcmlzb25zLgorOS4gZG9uJ3QgaW5pdGlhbGl6ZSBzdGF0aWMgYW5kL29yIGdsb2JhbCB2YXJpYWJsZXMgdG8gemVybywgdGhlIGNvbXBpbGVyIHRha2VzIGNhcmUgb2YgdGhhdC4KKzEwLiB1c2UgY3VycmVudCBzb3VyY2UgY29kZSBzdHlsZSBhcyBmdXJ0aGVyIHJlZmVyZW5jZS4KKworMi4yIFNvdXJjZSBjb2RlIGRvY3VtZW50YXRpb24gc3R5bGU6CisKKzEuIEphdmFEb2MgY29tcGxpYW50IGFuZCBEb3h5Z2VuIGNvbXBhdGlibGUuCisyLiBGdW5jdGlvbiBkb2N1bWVudGF0aW9uIGFib3ZlIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcywgbm90IC5oIGZpbGVzLgorICAgKFRoaXMgZm9yY2VzIHlvdSB0byBzeW5jaHJvbml6ZSBkb2N1bWVudGF0aW9uIGFuZCBpbXBsZW1lbnRhdGlvbi4pCiszLiBVc2UgY3VycmVudCBkb2N1bWVudGF0aW9uIHN0eWxlIGFzIGZ1cnRoZXIgcmVmZXJlbmNlLgorIAorMi4zIEJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzOgorCisxLiBNYWtlIHN1cmUgeW91IGFyZSByZXBvcnRpbmcgYnVncyBvciBzZW5kIHBhdGNoZXMgYWdhaW5zdCB0aGUgbGF0ZXN0CisgICBzb3VyY2VzLiAoRnJvbSB0aGUgbGF0ZXN0IHJlbGVhc2UgYW5kL29yIHRoZSBjdXJyZW50IENWUyBzb3VyY2VzLikKKzIuIElmIHlvdSB0aGluayB5b3UgZm91bmQgYSBidWcgbWFrZSBzdXJlIGl0J3Mgbm90IGFscmVhZHkgZmlsZWQgaW4gdGhlCisgICBidWd0cmFja2VyIGF0IFNhdmFubmFoLgorMy4gSWYgeW91IGhhdmUgYSBmaXggcHV0IHRoZSBwYXRjaCBvbiBTYXZhbm5haC4gSWYgaXQgaXMgYSBwYXRjaCB0aGF0IGFmZmVjdHMKKyAgIGJvdGggY29yZSBhbmQgYXJjaCBzcGVjaWZpYyBzdHVmZiBwbGVhc2Ugc2VwYXJhdGUgdGhlbSBzbyB0aGF0IHRoZSBjb3JlIGNhbgorICAgYmUgYXBwbGllZCBzZXBhcmF0ZWx5IHdoaWxlIGxlYXZpbmcgdGhlIG90aGVyIHBhdGNoICdvcGVuJy4gVGhlIHByZWZlcmVkIHdheQorICAgaXMgdG8gTk9UIHRvdWNoIGFyY2hzIHlvdSBjYW4ndCB0ZXN0IGFuZCBsZXQgbWFpbnRhaW5lcnMgdGFrZSBjYXJlIG9mIHRoZW0uCisgICBUaGlzIGlzIGEgZ29vZCB3YXkgdG8gc2VlIGlmIHRoZXkgYXJlIHVzZWQgYXQgYWxsIC0gdGhlIHNhbWUgZ29lcyBmb3IgdW5peAorICAgbmV0aWZzIGV4Y2VwdCB0YXBpZi4KKzQuIERvIG5vdCBmaWxlIGEgYnVnIGFuZCBwb3N0IGEgZml4IHRvIGl0IHRvIHRoZSBwYXRjaCBhcmVhLiBFaXRoZXIgYSBidWcgcmVwb3J0CisgICBvciBhIHBhdGNoIHdpbGwgYmUgZW5vdWdoLgorICAgSWYgeW91IGNvcnJlY3QgYW4gZXhpc3RpbmcgYnVnIHRoZW4gYXR0YWNoIHRoZSBwYXRjaCB0byB0aGUgYnVnIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGVudHJ5IGluIHRoZSBwYXRjaCBhcmVhLgorNS4gVHJpdmlhbCBwYXRjaGVzIChjb21waWxlciB3YXJuaW5nLCBpbmRlbnRhdGlvbiBhbmQgc3BlbGxpbmcgZml4ZXMgb3IgYW55dGhpbmcgb2J2aW91cyB3aGljaCB0YWtlcyBhIGxpbmUgb3IgdHdvKQorICAgY2FuIGdvIHRvIHRoZSBsd2lwLXVzZXJzIGxpc3QuIFRoaXMgaXMgc3RpbGwgdGhlIGZhc3Rlc3Qgd2F5IG9mIGludGVyYWN0aW9uIGFuZCB0aGUgbGlzdCBpcyBub3Qgc28gY3Jvd2RlZAorICAgYXMgdG8gYWxsb3cgZm9yIGxvc3Mgb2YgZml4ZXMuIFB1dHRpbmcgYnVncyBvbiBTYXZhbm5haCBhbmQgc3Vic2VxdWVudGx5IGNsb3NpbmcgdGhlbSBpcyB0b28gbXVjaCBhbiBvdmVyaGVhZAorICAgZm9yIHJlcG9ydGluZyBhIGNvbXBpbGVyIHdhcm5pbmcgZml4LgorNi4gUGF0Y2hlcyBzaG91bGQgYmUgc3BlY2lmaWMgdG8gYSBzaW5nbGUgY2hhbmdlIG9yIHRvIHJlbGF0ZWQgY2hhbmdlcy5EbyBub3QgbWl4IGJ1Z2ZpeGVzIHdpdGggc3BlbGxpbmcgYW5kIG90aGVyCisgICB0cml2aWFsIGZpeGVzIHVubGVzcyB0aGUgYnVnZml4IGlzIHRyaXZpYWwgdG9vLkRvIG5vdCByZW9yZ2FuaXplIGNvZGUgYW5kIHJlbmFtZSBpZGVudGlmaWVycyBpbiB0aGUgc2FtZSBwYXRjaCB5b3UKKyAgIGNoYW5nZSBiZWhhdmlvdXIgaWYgbm90IG5lY2Vzc2FyeS5BIHBhdGNoIGlzIGVhc2llciB0byByZWFkIGFuZCB1bmRlcnN0YW5kIGlmIGl0J3MgdG8gdGhlIHBvaW50IGFuZCBzaG9ydCB0aGFuCisgICBpZiBpdCdzIG5vdCB0byB0aGUgcG9pbnQgYW5kIGxvbmcgOikgc28gdGhlIGNoYW5jZXMgZm9yIGl0IHRvIGJlIGFwcGxpZWQgYXJlIGdyZWF0ZXIuIAorCisyLjQgUGxhdGZvcm0gcG9ydGVyczoKKworMS4gSWYgeW91IGhhdmUgcG9ydGVkIGx3SVAgdG8gYSBwbGF0Zm9ybSAoYW4gT1MsIGEgdUMvcHJvY2Vzc29yIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UpIGFuZAorICAgeW91IHRoaW5rIGl0IGNvdWxkIGJlbmVmaXQgb3RoZXJzWzFdIHlvdSBtaWdodCB3YW50IGRpc2N1c3MgdGhpcyBvbiB0aGUgbWFpbGluZyBsaXN0LiBZb3UKKyAgIGNhbiBhbHNvIGFzayBmb3IgQ1ZTIGFjY2VzcyB0byBzdWJtaXQgYW5kIG1haW50YWluIHlvdXIgcG9ydCBpbiB0aGUgY29udHJpYiBDVlMgbW9kdWxlLgorICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL2RvYy9yYXdhcGkudHh0IGIvY29yZS9sd2lwL2RvYy9yYXdhcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MjdkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvZG9jL3Jhd2FwaS50eHQKQEAgLTAsMCArMSw1MDUgQEAKK1JhdyBUQ1AvSVAgaW50ZXJmYWNlIGZvciBsd0lQCisKK0F1dGhvcnM6IEFkYW0gRHVua2VscywgTGVvbiBXb2VzdGVuYmVyZywgQ2hyaXN0aWFhbiBTaW1vbnMKKworbHdJUCBwcm92aWRlcyB0aHJlZSBBcHBsaWNhdGlvbiBQcm9ncmFtJ3MgSW50ZXJmYWNlcyAoQVBJcykgZm9yIHByb2dyYW1zCit0byB1c2UgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgVENQL0lQIGNvZGU6CisqIGxvdy1sZXZlbCAiY29yZSIgLyAiY2FsbGJhY2siIG9yICJyYXciIEFQSS4KKyogaGlnaGVyLWxldmVsICJzZXF1ZW50aWFsIiBBUEkuCisqIEJTRC1zdHlsZSBzb2NrZXQgQVBJLgorCitUaGUgc2VxdWVudGlhbCBBUEkgcHJvdmlkZXMgYSB3YXkgZm9yIG9yZGluYXJ5LCBzZXF1ZW50aWFsLCBwcm9ncmFtcwordG8gdXNlIHRoZSBsd0lQIHN0YWNrLiBJdCBpcyBxdWl0ZSBzaW1pbGFyIHRvIHRoZSBCU0Qgc29ja2V0IEFQSS4gVGhlCittb2RlbCBvZiBleGVjdXRpb24gaXMgYmFzZWQgb24gdGhlIGJsb2NraW5nIG9wZW4tcmVhZC13cml0ZS1jbG9zZQorcGFyYWRpZ20uIFNpbmNlIHRoZSBUQ1AvSVAgc3RhY2sgaXMgZXZlbnQgYmFzZWQgYnkgbmF0dXJlLCB0aGUgVENQL0lQCitjb2RlIGFuZCB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSBtdXN0IHJlc2lkZSBpbiBkaWZmZXJlbnQgZXhlY3V0aW9uCitjb250ZXh0cyAodGhyZWFkcykuCisKK1RoZSBzb2NrZXQgQVBJIGlzIGEgY29tcGF0aWJpbGl0eSBBUEkgZm9yIGV4aXN0aW5nIGFwcGxpY2F0aW9ucywKK2N1cnJlbnRseSBpdCBpcyBidWlsdCBvbiB0b3Agb2YgdGhlIHNlcXVlbnRpYWwgQVBJLiBJdCBpcyBtZWFudCB0bworcHJvdmlkZSBhbGwgZnVuY3Rpb25zIG5lZWRlZCB0byBydW4gc29ja2V0IEFQSSBhcHBsaWNhdGlvbnMgcnVubmluZworb24gb3RoZXIgcGxhdGZvcm1zIChlLmcuIHVuaXggLyB3aW5kb3dzIGV0Yy4pLiBIb3dldmVyLCBkdWUgdG8gbGltaXRhdGlvbnMKK2luIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoaXMgQVBJLCB0aGVyZSBtaWdodCBiZSBpbmNvbXBhdGliaWxpdGllcwordGhhdCByZXF1aXJlIHNtYWxsIG1vZGlmaWNhdGlvbnMgb2YgZXhpc3RpbmcgcHJvZ3JhbXMuCisKKyoqIFRocmVhZGluZworCitsd0lQIHN0YXJ0ZWQgdGFyZ2V0aW5nIHNpbmdsZS10aHJlYWRlZCBlbnZpcm9ubWVudHMuIFdoZW4gYWRkaW5nIG11bHRpLQordGhyZWFkaW5nIHN1cHBvcnQsIGluc3RlYWQgb2YgbWFraW5nIHRoZSBjb3JlIHRocmVhZC1zYWZlLCBhbm90aGVyCithcHByb2FjaCB3YXMgY2hvc2VuOiB0aGVyZSBpcyBvbmUgbWFpbiB0aHJlYWQgcnVubmluZyB0aGUgbHdJUCBjb3JlCisoYWxzbyBrbm93biBhcyB0aGUgInRjcGlwX3RocmVhZCIpLiBUaGUgcmF3IEFQSSBtYXkgb25seSBiZSB1c2VkIGZyb20KK3RoaXMgdGhyZWFkISBBcHBsaWNhdGlvbiB0aHJlYWRzIHVzaW5nIHRoZSBzZXF1ZW50aWFsLSBvciBzb2NrZXQgQVBJCitjb21tdW5pY2F0ZSB3aXRoIHRoaXMgbWFpbiB0aHJlYWQgdGhyb3VnaCBtZXNzYWdlIHBhc3NpbmcuCisKKyAgICAgIEFzIHN1Y2gsIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSBjYWxsZWQgZnJvbQorICAgICAgb3RoZXIgdGhyZWFkcyBvciBhbiBJU1IgaXMgdmVyeSBsaW1pdGVkISBPbmx5IGZ1bmN0aW9ucworICAgICAgZnJvbSB0aGVzZSBBUEkgaGVhZGVyIGZpbGVzIGFyZSB0aHJlYWQtc2FmZToKKyAgICAgIC0gYXBpLmgKKyAgICAgIC0gbmV0YnVmLmgKKyAgICAgIC0gbmV0ZGIuaAorICAgICAgLSBuZXRpZmFwaS5oCisgICAgICAtIHNvY2tldHMuaAorICAgICAgLSBzeXMuaAorCisgICAgICBBZGRpdGlvbmFseSwgbWVtb3J5IChkZS0pYWxsb2NhdGlvbiBmdW5jdGlvbnMgbWF5IGJlCisgICAgICBjYWxsZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIChub3QgSVNSISkgd2l0aCBOT19TWVM9MAorICAgICAgc2luY2UgdGhleSBhcmUgcHJvdGVjdGVkIGJ5IFNZU19MSUdIVFdFSUdIVF9QUk9UIGFuZC9vcgorICAgICAgc2VtYXBob3Jlcy4KKworICAgICAgT25seSBzaW5jZSAxLjMuMCwgaWYgU1lTX0xJR0hUV0VJR0hUX1BST1QgaXMgc2V0IHRvIDEKKyAgICAgIGFuZCBMV0lQX0FMTE9XX01FTV9GUkVFX0ZST01fT1RIRVJfQ09OVEVYVCBpcyBzZXQgdG8gMSwKKyAgICAgIHBidWZfZnJlZSgpIG1heSBhbHNvIGJlIGNhbGxlZCBmcm9tIGFub3RoZXIgdGhyZWFkIG9yCisgICAgICBhbiBJU1IgKHNpbmNlIG9ubHkgdGhlbiwgbWVtX2ZyZWUgLSBmb3IgUEJVRl9SQU0gLSBtYXkKKyAgICAgIGJlIGNhbGxlZCBmcm9tIGFuIElTUjogb3RoZXJ3aXNlLCB0aGUgSEVBUCBpcyBvbmx5CisgICAgICBwcm90ZWN0ZWQgYnkgc2VtYXBob3JlcykuCisgICAgICAKKworKiogVGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50IGRpc2N1c3NlcyB0aGUgInJhdyIgQVBJLiAqKgorCitUaGUgcmF3IFRDUC9JUCBpbnRlcmZhY2UgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIGludGVncmF0ZQorYmV0dGVyIHdpdGggdGhlIFRDUC9JUCBjb2RlLiBQcm9ncmFtIGV4ZWN1dGlvbiBpcyBldmVudCBiYXNlZCBieQoraGF2aW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyBiZWluZyBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIFRDUC9JUAorY29kZS4gVGhlIFRDUC9JUCBjb2RlIGFuZCB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSBib3RoIHJ1biBpbiB0aGUgc2FtZQordGhyZWFkLiBUaGUgc2VxdWVudGlhbCBBUEkgaGFzIGEgbXVjaCBoaWdoZXIgb3ZlcmhlYWQgYW5kIGlzIG5vdCB2ZXJ5Cit3ZWxsIHN1aXRlZCBmb3Igc21hbGwgc3lzdGVtcyBzaW5jZSBpdCBmb3JjZXMgYSBtdWx0aXRocmVhZGVkIHBhcmFkaWdtCitvbiB0aGUgYXBwbGljYXRpb24uCisKK1RoZSByYXcgVENQL0lQIGludGVyZmFjZSBpcyBub3Qgb25seSBmYXN0ZXIgaW4gdGVybXMgb2YgY29kZSBleGVjdXRpb24KK3RpbWUgYnV0IGlzIGFsc28gbGVzcyBtZW1vcnkgaW50ZW5zaXZlLiBUaGUgZHJhd2JhY2sgaXMgdGhhdCBwcm9ncmFtCitkZXZlbG9wbWVudCBpcyBzb21ld2hhdCBoYXJkZXIgYW5kIGFwcGxpY2F0aW9uIHByb2dyYW1zIHdyaXR0ZW4gZm9yCit0aGUgcmF3IFRDUC9JUCBpbnRlcmZhY2UgYXJlIG1vcmUgZGlmZmljdWx0IHRvIHVuZGVyc3RhbmQuIFN0aWxsLCB0aGlzCitpcyB0aGUgcHJlZmVycmVkIHdheSBvZiB3cml0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHNob3VsZCBiZSBzbWFsbCBpbgorY29kZSBzaXplIGFuZCBtZW1vcnkgdXNhZ2UuCisKK0JvdGggQVBJcyBjYW4gYmUgdXNlZCBzaW11bHRhbmVvdXNseSBieSBkaWZmZXJlbnQgYXBwbGljYXRpb24KK3Byb2dyYW1zLiBJbiBmYWN0LCB0aGUgc2VxdWVudGlhbCBBUEkgaXMgaW1wbGVtZW50ZWQgYXMgYW4gYXBwbGljYXRpb24KK3Byb2dyYW0gdXNpbmcgdGhlIHJhdyBUQ1AvSVAgaW50ZXJmYWNlLgorCistLS0gQ2FsbGJhY2tzCisKK1Byb2dyYW0gZXhlY3V0aW9uIGlzIGRyaXZlbiBieSBjYWxsYmFja3MuIEVhY2ggY2FsbGJhY2sgaXMgYW4gb3JkaW5hcnkKK0MgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIFRDUC9JUCBjb2RlLiBFdmVyeSBjYWxsYmFjaworZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBjdXJyZW50IFRDUCBvciBVRFAgY29ubmVjdGlvbiBzdGF0ZSBhcyBhbgorYXJndW1lbnQuIEFsc28sIGluIG9yZGVyIHRvIGJlIGFibGUgdG8ga2VlcCBwcm9ncmFtIHNwZWNpZmljIHN0YXRlLAordGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGggYSBwcm9ncmFtIHNwZWNpZmllZCBhcmd1bWVudAordGhhdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgVENQL0lQIHN0YXRlLgorCitUaGUgZnVuY3Rpb24gZm9yIHNldHRpbmcgdGhlIGFwcGxpY2F0aW9uIGNvbm5lY3Rpb24gc3RhdGUgaXM6CisKKy0gdm9pZCB0Y3BfYXJnKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHZvaWQgKmFyZykKKworICBTcGVjaWZpZXMgdGhlIHByb2dyYW0gc3BlY2lmaWMgc3RhdGUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIGFsbAorICBvdGhlciBjYWxsYmFjayBmdW5jdGlvbnMuIFRoZSAicGNiIiBhcmd1bWVudCBpcyB0aGUgY3VycmVudCBUQ1AKKyAgY29ubmVjdGlvbiBjb250cm9sIGJsb2NrLCBhbmQgdGhlICJhcmciIGFyZ3VtZW50IGlzIHRoZSBhcmd1bWVudAorICB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MuCisKKyAgCistLS0gVENQIGNvbm5lY3Rpb24gc2V0dXAKKworVGhlIGZ1bmN0aW9ucyB1c2VkIGZvciBzZXR0aW5nIHVwIGNvbm5lY3Rpb25zIGlzIHNpbWlsYXIgdG8gdGhhdCBvZgordGhlIHNlcXVlbnRpYWwgQVBJIGFuZCBvZiB0aGUgQlNEIHNvY2tldCBBUEkuIEEgbmV3IFRDUCBjb25uZWN0aW9uCitpZGVudGlmaWVyIChpLmUuLCBhIHByb3RvY29sIGNvbnRyb2wgYmxvY2sgLSBQQ0IpIGlzIGNyZWF0ZWQgd2l0aCB0aGUKK3RjcF9uZXcoKSBmdW5jdGlvbi4gVGhpcyBQQ0IgY2FuIHRoZW4gYmUgZWl0aGVyIHNldCB0byBsaXN0ZW4gZm9yIG5ldworaW5jb21pbmcgY29ubmVjdGlvbnMgb3IgYmUgZXhwbGljaXRseSBjb25uZWN0ZWQgdG8gYW5vdGhlciBob3N0LgorCistIHN0cnVjdCB0Y3BfcGNiICp0Y3BfbmV3KHZvaWQpCisKKyAgQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGlkZW50aWZpZXIgKFBDQikuIElmIG1lbW9yeSBpcyBub3QKKyAgYXZhaWxhYmxlIGZvciBjcmVhdGluZyB0aGUgbmV3IHBjYiwgTlVMTCBpcyByZXR1cm5lZC4KKworLSBlcnJfdCB0Y3BfYmluZChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCBzdHJ1Y3QgaXBfYWRkciAqaXBhZGRyLAorICAgICAgICAgICAgICAgICB1MTZfdCBwb3J0KQorCisgIEJpbmRzIHRoZSBwY2IgdG8gYSBsb2NhbCBJUCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlci4gVGhlIElQIGFkZHJlc3MKKyAgY2FuIGJlIHNwZWNpZmllZCBhcyBJUF9BRERSX0FOWSBpbiBvcmRlciB0byBiaW5kIHRoZSBjb25uZWN0aW9uIHRvCisgIGFsbCBsb2NhbCBJUCBhZGRyZXNzZXMuCisKKyAgSWYgYW5vdGhlciBjb25uZWN0aW9uIGlzIGJvdW5kIHRvIHRoZSBzYW1lIHBvcnQsIHRoZSBmdW5jdGlvbiB3aWxsCisgIHJldHVybiBFUlJfVVNFLCBvdGhlcndpc2UgRVJSX09LIGlzIHJldHVybmVkLgorCistIHN0cnVjdCB0Y3BfcGNiICp0Y3BfbGlzdGVuKHN0cnVjdCB0Y3BfcGNiICpwY2IpCisKKyAgQ29tbWFuZHMgYSBwY2IgdG8gc3RhcnQgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4gV2hlbiBhbgorICBpbmNvbWluZyBjb25uZWN0aW9uIGlzIGFjY2VwdGVkLCB0aGUgZnVuY3Rpb24gc3BlY2lmaWVkIHdpdGggdGhlCisgIHRjcF9hY2NlcHQoKSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZC4gVGhlIHBjYiB3aWxsIGhhdmUgdG8gYmUgYm91bmQKKyAgdG8gYSBsb2NhbCBwb3J0IHdpdGggdGhlIHRjcF9iaW5kKCkgZnVuY3Rpb24uCisKKyAgVGhlIHRjcF9saXN0ZW4oKSBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IGNvbm5lY3Rpb24gaWRlbnRpZmllciwgYW5kCisgIHRoZSBvbmUgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbiB3aWxsIGJlCisgIGRlYWxsb2NhdGVkLiBUaGUgcmVhc29uIGZvciB0aGlzIGJlaGF2aW9yIGlzIHRoYXQgbGVzcyBtZW1vcnkgaXMKKyAgbmVlZGVkIGZvciBhIGNvbm5lY3Rpb24gdGhhdCBpcyBsaXN0ZW5pbmcsIHNvIHRjcF9saXN0ZW4oKSB3aWxsCisgIHJlY2xhaW0gdGhlIG1lbW9yeSBuZWVkZWQgZm9yIHRoZSBvcmlnaW5hbCBjb25uZWN0aW9uIGFuZCBhbGxvY2F0ZSBhCisgIG5ldyBzbWFsbGVyIG1lbW9yeSBibG9jayBmb3IgdGhlIGxpc3RlbmluZyBjb25uZWN0aW9uLgorCisgIHRjcF9saXN0ZW4oKSBtYXkgcmV0dXJuIE5VTEwgaWYgbm8gbWVtb3J5IHdhcyBhdmFpbGFibGUgZm9yIHRoZQorICBsaXN0ZW5pbmcgY29ubmVjdGlvbi4gSWYgc28sIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwY2IKKyAgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRjcF9saXN0ZW4oKSB3aWxsIG5vdCBiZSBkZWFsbG9jYXRlZC4KKworLSBzdHJ1Y3QgdGNwX3BjYiAqdGNwX2xpc3Rlbl93aXRoX2JhY2tsb2coc3RydWN0IHRjcF9wY2IgKnBjYiwgdThfdCBiYWNrbG9nKQorCisgIFNhbWUgYXMgdGNwX2xpc3RlbiwgYnV0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGNvbm5lY3Rpb25zCisgIGluIHRoZSBsaXN0ZW4gcXVldWUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgYmFja2xvZyBhcmd1bWVudC4KKyAgVG8gdXNlIGl0LCB5b3VyIG5lZWQgdG8gc2V0IFRDUF9MSVNURU5fQkFDS0xPRz0xIGluIHlvdXIgbHdpcG9wdHMuaC4KKworLSB2b2lkIHRjcF9hY2NlcHRlZChzdHJ1Y3QgdGNwX3BjYiAqcGNiKQorCisgIEluZm9ybSBsd0lQIHRoYXQgYW4gaW5jb21pbmcgY29ubmVjdGlvbiBoYXMgYmVlbiBhY2NlcHRlZC4gVGhpcyB3b3VsZAorICB1c3VhbGx5IGJlIGNhbGxlZCBmcm9tIHRoZSBhY2NlcHQgY2FsbGJhY2suIFRoaXMgYWxsb3dzIGx3SVAgdG8gcGVyZm9ybQorICBob3VzZWtlZXBpbmcgdGFza3MsIHN1Y2ggYXMgYWxsb3dpbmcgZnVydGhlciBpbmNvbWluZyBjb25uZWN0aW9ucyB0byBiZQorICBxdWV1ZWQgaW4gdGhlIGxpc3RlbiBiYWNrbG9nLgorCistIHZvaWQgdGNwX2FjY2VwdChzdHJ1Y3QgdGNwX3BjYiAqcGNiLAorICAgICAgICAgICAgICAgICAgZXJyX3QgKCogYWNjZXB0KSh2b2lkICphcmcsIHN0cnVjdCB0Y3BfcGNiICpuZXdwY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl90IGVycikpCisKKyAgU3BlY2lmaWVkIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIG5ldworICBjb25uZWN0aW9uIGFycml2ZXMgb24gYSBsaXN0ZW5pbmcgY29ubmVjdGlvbi4KKyAgICAgIAorLSBlcnJfdCB0Y3BfY29ubmVjdChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCBzdHJ1Y3QgaXBfYWRkciAqaXBhZGRyLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBwb3J0LCBlcnJfdCAoKiBjb25uZWN0ZWQpKHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGNwX3BjYiAqdHBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfdCBlcnIpKTsKKworICBTZXRzIHVwIHRoZSBwY2IgdG8gY29ubmVjdCB0byB0aGUgcmVtb3RlIGhvc3QgYW5kIHNlbmRzIHRoZQorICBpbml0aWFsIFNZTiBzZWdtZW50IHdoaWNoIG9wZW5zIHRoZSBjb25uZWN0aW9uLiAKKworICBUaGUgdGNwX2Nvbm5lY3QoKSBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5OyBpdCBkb2VzIG5vdCB3YWl0IGZvcgorICB0aGUgY29ubmVjdGlvbiB0byBiZSBwcm9wZXJseSBzZXR1cC4gSW5zdGVhZCwgaXQgd2lsbCBjYWxsIHRoZQorICBmdW5jdGlvbiBzcGVjaWZpZWQgYXMgdGhlIGZvdXJ0aCBhcmd1bWVudCAodGhlICJjb25uZWN0ZWQiIGFyZ3VtZW50KQorICB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLiBJZiB0aGUgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUKKyAgcHJvcGVybHkgZXN0YWJsaXNoZWQsIGVpdGhlciBiZWNhdXNlIHRoZSBvdGhlciBob3N0IHJlZnVzZWQgdGhlCisgIGNvbm5lY3Rpb24gb3IgYmVjYXVzZSB0aGUgb3RoZXIgaG9zdCBkaWRuJ3QgYW5zd2VyLCB0aGUgImVyciIKKyAgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdGhpcyBwY2IgKHJlZ2lzdGVyZWQgd2l0aCB0Y3BfZXJyLCBzZWUgYmVsb3cpCisgIHdpbGwgYmUgY2FsbGVkLgorCisgIFRoZSB0Y3BfY29ubmVjdCgpIGZ1bmN0aW9uIGNhbiByZXR1cm4gRVJSX01FTSBpZiBubyBtZW1vcnkgaXMKKyAgYXZhaWxhYmxlIGZvciBlbnF1ZXVlaW5nIHRoZSBTWU4gc2VnbWVudC4gSWYgdGhlIFNZTiBpbmRlZWQgd2FzCisgIGVucXVldWVkIHN1Y2Nlc3NmdWxseSwgdGhlIHRjcF9jb25uZWN0KCkgZnVuY3Rpb24gcmV0dXJucyBFUlJfT0suCisKKyAgCistLS0gU2VuZGluZyBUQ1AgZGF0YQorCitUQ1AgZGF0YSBpcyBzZW50IGJ5IGVucXVldWVpbmcgdGhlIGRhdGEgd2l0aCBhIGNhbGwgdG8KK3RjcF93cml0ZSgpLiBXaGVuIHRoZSBkYXRhIGlzIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCB0byB0aGUgcmVtb3RlCitob3N0LCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBub3RpZmllZCB3aXRoIGEgY2FsbCB0byBhIHNwZWNpZmllZAorY2FsbGJhY2sgZnVuY3Rpb24uCisKKy0gZXJyX3QgdGNwX3dyaXRlKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHZvaWQgKmRhdGFwdHIsIHUxNl90IGxlbiwKKyAgICAgICAgICAgICAgICAgIHU4X3QgY29weSkKKworICBFbnF1ZXVlcyB0aGUgZGF0YSBwb2ludGVkIHRvIGJ5IHRoZSBhcmd1bWVudCBkYXRhcHRyLiBUaGUgbGVuZ3RoIG9mCisgIHRoZSBkYXRhIGlzIHBhc3NlZCBhcyB0aGUgbGVuIHBhcmFtZXRlci4gVGhlIGNvcHkgYXJndW1lbnQgaXMgZWl0aGVyCisgIDAgb3IgMSBhbmQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5ldyBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZCBmb3IKKyAgdGhlIGRhdGEgdG8gYmUgY29waWVkIGludG8uIElmIHRoZSBhcmd1bWVudCBpcyAwLCBubyBuZXcgbWVtb3J5CisgIHNob3VsZCBiZSBhbGxvY2F0ZWQgYW5kIHRoZSBkYXRhIHNob3VsZCBvbmx5IGJlIHJlZmVyZW5jZWQgYnkKKyAgcG9pbnRlci4KKworICBUaGUgdGNwX3dyaXRlKCkgZnVuY3Rpb24gd2lsbCBmYWlsIGFuZCByZXR1cm4gRVJSX01FTSBpZiB0aGUgbGVuZ3RoCisgIG9mIHRoZSBkYXRhIGV4Y2VlZHMgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgc2l6ZSBvciBpZiB0aGUgbGVuZ3RoIG9mCisgIHRoZSBxdWV1ZSBvZiBvdXRnb2luZyBzZWdtZW50IGlzIGxhcmdlciB0aGFuIHRoZSB1cHBlciBsaW1pdCBkZWZpbmVkCisgIGluIGx3aXBvcHRzLmguIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBvdXRwdXQgcXVldWUgY2FuCisgIGJlIHJldHJpZXZlZCB3aXRoIHRoZSB0Y3Bfc25kYnVmKCkgZnVuY3Rpb24uCisKKyAgVGhlIHByb3BlciB3YXkgdG8gdXNlIHRoaXMgZnVuY3Rpb24gaXMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBhdAorICBtb3N0IHRjcF9zbmRidWYoKSBieXRlcyBvZiBkYXRhLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBFUlJfTUVNLAorICB0aGUgYXBwbGljYXRpb24gc2hvdWxkIHdhaXQgdW50aWwgc29tZSBvZiB0aGUgY3VycmVudGx5IGVucXVldWVkCisgIGRhdGEgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGJ5IHRoZSBvdGhlciBob3N0IGFuZCB0cnkgYWdhaW4uCisKKy0gdm9pZCB0Y3Bfc2VudChzdHJ1Y3QgdGNwX3BjYiAqcGNiLAorICAgICAgICAgICAgICAgIGVycl90ICgqIHNlbnQpKHZvaWQgKmFyZywgc3RydWN0IHRjcF9wY2IgKnRwY2IsCisgICAgICAgICAgICAgICAgdTE2X3QgbGVuKSkKKworICBTcGVjaWZpZXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGRhdGEgaGFzCisgIHN1Y2Nlc3NmdWxseSBiZWVuIHJlY2VpdmVkIChpLmUuLCBhY2tub3dsZWRnZWQpIGJ5IHRoZSByZW1vdGUKKyAgaG9zdC4gVGhlIGxlbiBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGdpdmVzIHRoZQorICBhbW91bnQgYnl0ZXMgdGhhdCB3YXMgYWNrbm93bGVkZ2VkIGJ5IHRoZSBsYXN0IGFja25vd2xlZGdtZW50LgorCisgIAorLS0tIFJlY2VpdmluZyBUQ1AgZGF0YQorCitUQ1AgZGF0YSByZWNlcHRpb24gaXMgY2FsbGJhY2sgYmFzZWQgLSBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpZWQKK2NhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIG5ldyBkYXRhIGFycml2ZXMuIFdoZW4gdGhlCithcHBsaWNhdGlvbiBoYXMgdGFrZW4gdGhlIGRhdGEsIGl0IGhhcyB0byBjYWxsIHRoZSB0Y3BfcmVjdmVkKCkKK2Z1bmN0aW9uIHRvIGluZGljYXRlIHRoYXQgVENQIGNhbiBhZHZlcnRpc2UgaW5jcmVhc2UgdGhlIHJlY2VpdmUKK3dpbmRvdy4KKworLSB2b2lkIHRjcF9yZWN2KHN0cnVjdCB0Y3BfcGNiICpwY2IsCisgICAgICAgICAgICAgICAgZXJyX3QgKCogcmVjdikodm9pZCAqYXJnLCBzdHJ1Y3QgdGNwX3BjYiAqdHBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGJ1ZiAqcCwgZXJyX3QgZXJyKSkKKworICBTZXRzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gbmV3IGRhdGEKKyAgYXJyaXZlcy4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIGEgTlVMTCBwYnVmIHRvCisgIGluZGljYXRlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uIElmCisgIHRoZXJlIGFyZSBubyBlcnJvcnMgYW5kIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyB0byByZXR1cm4KKyAgRVJSX09LLCB0aGVuIGl0IG11c3QgZnJlZSB0aGUgcGJ1Zi4gT3RoZXJ3aXNlLCBpdCBtdXN0IG5vdAorICBmcmVlIHRoZSBwYnVmIHNvIHRoYXQgbHdJUCBjb3JlIGNvZGUgY2FuIHN0b3JlIGl0LgorCistIHZvaWQgdGNwX3JlY3ZlZChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB1MTZfdCBsZW4pCisKKyAgTXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaGFzIHJlY2VpdmVkIHRoZSBkYXRhLiBUaGUgbGVuCisgIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBkYXRhLgorICAgIAorCistLS0gQXBwbGljYXRpb24gcG9sbGluZworCitXaGVuIGEgY29ubmVjdGlvbiBpcyBpZGxlIChpLmUuLCBubyBkYXRhIGlzIGVpdGhlciB0cmFuc21pdHRlZCBvcgorcmVjZWl2ZWQpLCBsd0lQIHdpbGwgcmVwZWF0ZWRseSBwb2xsIHRoZSBhcHBsaWNhdGlvbiBieSBjYWxsaW5nIGEKK3NwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbi4gVGhpcyBjYW4gYmUgdXNlZCBlaXRoZXIgYXMgYSB3YXRjaGRvZwordGltZXIgZm9yIGtpbGxpbmcgY29ubmVjdGlvbnMgdGhhdCBoYXZlIHN0YXllZCBpZGxlIGZvciB0b28gbG9uZywgb3IKK2FzIGEgbWV0aG9kIG9mIHdhaXRpbmcgZm9yIG1lbW9yeSB0byBiZWNvbWUgYXZhaWxhYmxlLiBGb3IgaW5zdGFuY2UsCitpZiBhIGNhbGwgdG8gdGNwX3dyaXRlKCkgaGFzIGZhaWxlZCBiZWNhdXNlIG1lbW9yeSB3YXNuJ3QgYXZhaWxhYmxlLAordGhlIGFwcGxpY2F0aW9uIG1heSB1c2UgdGhlIHBvbGxpbmcgZnVuY3Rpb25hbGl0eSB0byBjYWxsIHRjcF93cml0ZSgpCithZ2FpbiB3aGVuIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGlkbGUgZm9yIGEgd2hpbGUuCisKKy0gdm9pZCB0Y3BfcG9sbChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCAKKyAgICAgICAgICAgICAgICBlcnJfdCAoKiBwb2xsKSh2b2lkICphcmcsIHN0cnVjdCB0Y3BfcGNiICp0cGNiKSwKKwkJCQl1OF90IGludGVydmFsKQorCisgIFNwZWNpZmllcyB0aGUgcG9sbGluZyBpbnRlcnZhbCBhbmQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgc2hvdWxkCisgIGJlIGNhbGxlZCB0byBwb2xsIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGludGVydmFsIGlzIHNwZWNpZmllZCBpbgorICBudW1iZXIgb2YgVENQIGNvYXJzZSBncmFpbmVkIHRpbWVyIHNob3RzLCB3aGljaCB0eXBpY2FsbHkgb2NjdXJzCisgIHR3aWNlIGEgc2Vjb25kLiBBbiBpbnRlcnZhbCBvZiAxMCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3b3VsZAorICBiZSBwb2xsZWQgZXZlcnkgNSBzZWNvbmRzLgorCisKKy0tLSBDbG9zaW5nIGFuZCBhYm9ydGluZyBjb25uZWN0aW9ucworCistIGVycl90IHRjcF9jbG9zZShzdHJ1Y3QgdGNwX3BjYiAqcGNiKQorCisgIENsb3NlcyB0aGUgY29ubmVjdGlvbi4gVGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gRVJSX01FTSBpZiBubyBtZW1vcnkKKyAgd2FzIGF2YWlsYWJsZSBmb3IgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4gSWYgc28sIHRoZSBhcHBsaWNhdGlvbgorICBzaG91bGQgd2FpdCBhbmQgdHJ5IGFnYWluIGVpdGhlciBieSB1c2luZyB0aGUgYWNrbm93bGVkZ21lbnQKKyAgY2FsbGJhY2sgb3IgdGhlIHBvbGxpbmcgZnVuY3Rpb25hbGl0eS4gSWYgdGhlIGNsb3NlIHN1Y2NlZWRzLCB0aGUKKyAgZnVuY3Rpb24gcmV0dXJucyBFUlJfT0suCisKKyAgVGhlIHBjYiBpcyBkZWFsbG9jYXRlZCBieSB0aGUgVENQIGNvZGUgYWZ0ZXIgYSBjYWxsIHRvIHRjcF9jbG9zZSgpLiAKKworLSB2b2lkIHRjcF9hYm9ydChzdHJ1Y3QgdGNwX3BjYiAqcGNiKQorCisgIEFib3J0cyB0aGUgY29ubmVjdGlvbiBieSBzZW5kaW5nIGEgUlNUIChyZXNldCkgc2VnbWVudCB0byB0aGUgcmVtb3RlCisgIGhvc3QuIFRoZSBwY2IgaXMgZGVhbGxvY2F0ZWQuIFRoaXMgZnVuY3Rpb24gbmV2ZXIgZmFpbHMuCisKKyAgQVRURU5USU9OOiBXaGVuIGNhbGxpbmcgdGhpcyBmcm9tIG9uZSBvZiB0aGUgVENQIGNhbGxiYWNrcywgbWFrZQorICBzdXJlIHlvdSBhbHdheXMgcmV0dXJuIEVSUl9BQlJUIChhbmQgbmV2ZXIgcmV0dXJuIEVSUl9BQlJUIG90aGVyd2lzZQorICBvciB5b3Ugd2lsbCByaXNrIGFjY2Vzc2luZyBkZWFsbG9jYXRlZCBtZW1vcnkgb3IgbWVtb3J5IGxlYWtzIQorCisKK0lmIGEgY29ubmVjdGlvbiBpcyBhYm9ydGVkIGJlY2F1c2Ugb2YgYW4gZXJyb3IsIHRoZSBhcHBsaWNhdGlvbiBpcworYWxlcnRlZCBvZiB0aGlzIGV2ZW50IGJ5IHRoZSBlcnIgY2FsbGJhY2suIEVycm9ycyB0aGF0IG1pZ2h0IGFib3J0IGEKK2Nvbm5lY3Rpb24gYXJlIHdoZW4gdGhlcmUgaXMgYSBzaG9ydGFnZSBvZiBtZW1vcnkuIFRoZSBjYWxsYmFjaworZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGlzIHNldCB1c2luZyB0aGUgdGNwX2VycigpIGZ1bmN0aW9uLgorCistIHZvaWQgdGNwX2VycihzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB2b2lkICgqIGVycikodm9pZCAqYXJnLAorICAgICAgIGVycl90IGVycikpCisKKyAgVGhlIGVycm9yIGNhbGxiYWNrIGZ1bmN0aW9uIGRvZXMgbm90IGdldCB0aGUgcGNiIHBhc3NlZCB0byBpdCBhcyBhCisgIHBhcmFtZXRlciBzaW5jZSB0aGUgcGNiIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBkZWFsbG9jYXRlZC4KKworCistLS0gTG93ZXIgbGF5ZXIgVENQIGludGVyZmFjZQorCitUQ1AgcHJvdmlkZXMgYSBzaW1wbGUgaW50ZXJmYWNlIHRvIHRoZSBsb3dlciBsYXllcnMgb2YgdGhlCitzeXN0ZW0uIER1cmluZyBzeXN0ZW0gaW5pdGlhbGl6YXRpb24sIHRoZSBmdW5jdGlvbiB0Y3BfaW5pdCgpIGhhcwordG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgVENQIGZ1bmN0aW9uIGlzIGNhbGxlZC4gV2hlbiB0aGUgc3lzdGVtCitpcyBydW5uaW5nLCB0aGUgdHdvIHRpbWVyIGZ1bmN0aW9ucyB0Y3BfZmFzdHRtcigpIGFuZCB0Y3Bfc2xvd3RtcigpCittdXN0IGJlIGNhbGxlZCB3aXRoIHJlZ3VsYXIgaW50ZXJ2YWxzLiBUaGUgdGNwX2Zhc3R0bXIoKSBzaG91bGQgYmUKK2NhbGxlZCBldmVyeSBUQ1BfRkFTVF9JTlRFUlZBTCBtaWxsaXNlY29uZHMgKGRlZmluZWQgaW4gdGNwLmgpIGFuZAordGNwX3Nsb3d0bXIoKSBzaG91bGQgYmUgY2FsbGVkIGV2ZXJ5IFRDUF9TTE9XX0lOVEVSVkFMIG1pbGxpc2Vjb25kcy4gCisKKworLS0tIFVEUCBpbnRlcmZhY2UKKworVGhlIFVEUCBpbnRlcmZhY2UgaXMgc2ltaWxhciB0byB0aGF0IG9mIFRDUCwgYnV0IGR1ZSB0byB0aGUgbG93ZXIKK2xldmVsIG9mIGNvbXBsZXhpdHkgb2YgVURQLCB0aGUgaW50ZXJmYWNlIGlzIHNpZ25pZmljYW50bHkgc2ltcGxlci4KKworLSBzdHJ1Y3QgdWRwX3BjYiAqdWRwX25ldyh2b2lkKQorCisgIENyZWF0ZXMgYSBuZXcgVURQIHBjYiB3aGljaCBjYW4gYmUgdXNlZCBmb3IgVURQIGNvbW11bmljYXRpb24uIFRoZQorICBwY2IgaXMgbm90IGFjdGl2ZSB1bnRpbCBpdCBoYXMgZWl0aGVyIGJlZW4gYm91bmQgdG8gYSBsb2NhbCBhZGRyZXNzCisgIG9yIGNvbm5lY3RlZCB0byBhIHJlbW90ZSBhZGRyZXNzLgorCistIHZvaWQgdWRwX3JlbW92ZShzdHJ1Y3QgdWRwX3BjYiAqcGNiKQorCisgIFJlbW92ZXMgYW5kIGRlYWxsb2NhdGVzIHRoZSBwY2IuICAKKyAgCistIGVycl90IHVkcF9iaW5kKHN0cnVjdCB1ZHBfcGNiICpwY2IsIHN0cnVjdCBpcF9hZGRyICppcGFkZHIsCisgICAgICAgICAgICAgICAgIHUxNl90IHBvcnQpCisKKyAgQmluZHMgdGhlIHBjYiB0byBhIGxvY2FsIGFkZHJlc3MuIFRoZSBJUC1hZGRyZXNzIGFyZ3VtZW50ICJpcGFkZHIiCisgIGNhbiBiZSBJUF9BRERSX0FOWSB0byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZCBsaXN0ZW4gdG8gYW55IGxvY2FsIElQCisgIGFkZHJlc3MuIFRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYWx3YXlzIHJldHVybiBFUlJfT0suCisKKy0gZXJyX3QgdWRwX2Nvbm5lY3Qoc3RydWN0IHVkcF9wY2IgKnBjYiwgc3RydWN0IGlwX2FkZHIgKmlwYWRkciwKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgcG9ydCkKKworICBTZXRzIHRoZSByZW1vdGUgZW5kIG9mIHRoZSBwY2IuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZ2VuZXJhdGUgYW55CisgIG5ldHdvcmsgdHJhZmZpYywgYnV0IG9ubHkgc2V0IHRoZSByZW1vdGUgYWRkcmVzcyBvZiB0aGUgcGNiLgorCistIGVycl90IHVkcF9kaXNjb25uZWN0KHN0cnVjdCB1ZHBfcGNiICpwY2IpCisKKyAgUmVtb3ZlIHRoZSByZW1vdGUgZW5kIG9mIHRoZSBwY2IuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZ2VuZXJhdGUKKyAgYW55IG5ldHdvcmsgdHJhZmZpYywgYnV0IG9ubHkgcmVtb3ZlcyB0aGUgcmVtb3RlIGFkZHJlc3Mgb2YgdGhlIHBjYi4KKworLSBlcnJfdCB1ZHBfc2VuZChzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCkKKworICBTZW5kcyB0aGUgcGJ1ZiBwLiBUaGUgcGJ1ZiBpcyBub3QgZGVhbGxvY2F0ZWQuCisKKy0gdm9pZCB1ZHBfcmVjdihzdHJ1Y3QgdWRwX3BjYiAqcGNiLAorICAgICAgICAgICAgICAgIHZvaWQgKCogcmVjdikodm9pZCAqYXJnLCBzdHJ1Y3QgdWRwX3BjYiAqdXBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBidWYgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpcF9hZGRyICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBwb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZfYXJnKQorCisgIFNwZWNpZmllcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgVURQCisgIGRhdGFncmFtIGlzIHJlY2VpdmVkLgorICAKKworLS0tIFN5c3RlbSBpbml0YWxpemF0aW9uCisKK0EgdHJ1bHkgY29tcGxldGUgYW5kIGdlbmVyaWMgc2VxdWVuY2UgZm9yIGluaXRpYWxpemluZyB0aGUgbHdpcCBzdGFjaworY2Fubm90IGJlIGdpdmVuIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiAobHdpcG9wdHMuaCkKK2FuZCBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9ucyBmb3IgeW91ciBydW50aW1lIGVudmlyb25tZW50IChlLmcuIHRpbWVycykuCisKK1dlIGNhbiBnaXZlIHlvdSBzb21lIGlkZWEgb24gaG93IHRvIHByb2NlZWQgd2hlbiB1c2luZyB0aGUgcmF3IEFQSS4KK1dlIGFzc3VtZSBhIGNvbmZpZ3VyYXRpb24gdXNpbmcgYSBzaW5nbGUgRXRoZXJuZXQgbmV0aWYgYW5kIHRoZQorVURQIGFuZCBUQ1AgdHJhbnNwb3J0IGxheWVycywgSVB2NCBhbmQgdGhlIERIQ1AgY2xpZW50LgorCitDYWxsIHRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgb3JkZXIgb2YgYXBwZWFyYW5jZToKKworLSBzdGF0c19pbml0KCkKKworICBDbGVhcnMgdGhlIHN0cnVjdHVyZSB3aGVyZSBydW50aW1lIHN0YXRpc3RpY3MgYXJlIGdhdGhlcmVkLgorCistIHN5c19pbml0KCkKKyAgCisgIE5vdCBvZiBtdWNoIHVzZSBzaW5jZSB3ZSBzZXQgdGhlIE5PX1NZUyAxIG9wdGlvbiBpbiBsd2lwb3B0cy5oLAorICB0byBiZSBjYWxsZWQgZm9yIGVhc3kgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorCistIGx3aXBfbWVtX2luaXQoKQorCisgIEluaXRpYWxpemVzIHRoZSBkeW5hbWljIG1lbW9yeSBoZWFwIGRlZmluZWQgYnkgTUVNX1NJWkUuCisKKy0gbWVtcF9pbml0KCkKKworICBJbml0aWFsaXplcyB0aGUgbWVtb3J5IHBvb2xzIGRlZmluZWQgYnkgTUVNUF9OVU1feC4KKworLSBwYnVmX2luaXQoKQorCisgIEluaXRpYWxpemVzIHRoZSBwYnVmIG1lbW9yeSBwb29sIGRlZmluZWQgYnkgUEJVRl9QT09MX1NJWkUuCisgIAorLSBldGhhcnBfaW5pdCgpCisKKyAgSW5pdGlhbGl6ZXMgdGhlIEFSUCB0YWJsZSBhbmQgcXVldWUuCisgIE5vdGU6IHlvdSBtdXN0IGNhbGwgZXRoYXJwX3RtciBhdCBhIEFSUF9UTVJfSU5URVJWQUwgKDUgc2Vjb25kcykgcmVndWxhciBpbnRlcnZhbAorICBhZnRlciB0aGlzIGluaXRpYWxpemF0aW9uLgorCistIGlwX2luaXQoKQorCisgIERvZXNuJ3QgZG8gbXVjaCwgaXQgc2hvdWxkIGJlIGNhbGxlZCB0byBoYW5kbGUgZnV0dXJlIGNoYW5nZXMuCisKKy0gdWRwX2luaXQoKQorCisgIENsZWFycyB0aGUgVURQIFBDQiBsaXN0LgorCistIHRjcF9pbml0KCkKKworICBDbGVhcnMgdGhlIFRDUCBQQ0IgbGlzdCBhbmQgY2xlYXJzIHNvbWUgaW50ZXJuYWwgVENQIHRpbWVycy4KKyAgTm90ZTogeW91IG11c3QgY2FsbCB0Y3BfZmFzdHRtcigpIGFuZCB0Y3Bfc2xvd3RtcigpIGF0IHRoZQorICBwcmVkZWZpbmVkIHJlZ3VsYXIgaW50ZXJ2YWxzIGFmdGVyIHRoaXMgaW5pdGlhbGl6YXRpb24uIAorICAKKy0gbmV0aWZfYWRkKHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBpcF9hZGRyICppcGFkZHIsCisgICAgICAgICAgICBzdHJ1Y3QgaXBfYWRkciAqbmV0bWFzaywgc3RydWN0IGlwX2FkZHIgKmd3LAorICAgICAgICAgICAgdm9pZCAqc3RhdGUsIGVycl90ICgqIGluaXQpKHN0cnVjdCBuZXRpZiAqbmV0aWYpLAorICAgICAgICAgICAgZXJyX3QgKCogaW5wdXQpKHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKm5ldGlmKSkKKworICBBZGRzIHlvdXIgbmV0d29yayBpbnRlcmZhY2UgdG8gdGhlIG5ldGlmX2xpc3QuIEFsbG9jYXRlIGEgc3RydWN0CisgIG5ldGlmIGFuZCBwYXNzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCisgIEdpdmUgcG9pbnRlcnMgdG8gY2xlYXJlZCBpcF9hZGRyIHN0cnVjdHVyZXMgd2hlbiB1c2luZyBESENQLAorICBvciBmaWxsIHRoZW0gd2l0aCBzYW5lIG51bWJlcnMgb3RoZXJ3aXNlLiBUaGUgc3RhdGUgcG9pbnRlciBtYXkgYmUgTlVMTC4KKworICBUaGUgaW5pdCBmdW5jdGlvbiBwb2ludGVyIG11c3QgcG9pbnQgdG8gYSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IKKyAgeW91ciBldGhlcm5ldCBuZXRpZiBpbnRlcmZhY2UuIFRoZSBmb2xsb3dpbmcgY29kZSBpbGx1c3RyYXRlcyBpdCdzIHVzZS4KKyAgCisgIGVycl90IG5ldGlmX2lmX2luaXQoc3RydWN0IG5ldGlmICpuZXRpZikKKyAgeworICAgIHU4X3QgaTsKKyAgICAKKyAgICBmb3IoaSA9IDA7IGkgPCBFVEhBUlBfSFdBRERSX0xFTjsgaSsrKSBuZXRpZi0+aHdhZGRyW2ldID0gc29tZV9ldGhfYWRkcltpXTsKKyAgICBpbml0X215X2V0aF9kZXZpY2UoKTsKKyAgICByZXR1cm4gRVJSX09LOworICB9CisgIAorICBGb3IgZXRoZXJuZXQgZHJpdmVycywgdGhlIGlucHV0IGZ1bmN0aW9uIHBvaW50ZXIgbXVzdCBwb2ludCB0byB0aGUgbHdpcAorICBmdW5jdGlvbiBldGhlcm5ldF9pbnB1dCgpIGRlY2xhcmVkIGluICJuZXRpZi9ldGhhcnAuaCIuIE90aGVyIGRyaXZlcnMKKyAgbXVzdCB1c2UgaXBfaW5wdXQoKSBkZWNsYXJlZCBpbiAibHdpcC9pcC5oIi4KKyAgCistIG5ldGlmX3NldF9kZWZhdWx0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCisKKyAgUmVnaXN0ZXJzIHRoZSBkZWZhdWx0IG5ldHdvcmsgaW50ZXJmYWNlLgorCistIG5ldGlmX3NldF91cChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQorCisgIFdoZW4gdGhlIG5ldGlmIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZC4KKworLSBkaGNwX3N0YXJ0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCisKKyAgQ3JlYXRlcyBhIG5ldyBESENQIGNsaWVudCBmb3IgdGhpcyBpbnRlcmZhY2Ugb24gdGhlIGZpcnN0IGNhbGwuCisgIE5vdGU6IHlvdSBtdXN0IGNhbGwgZGhjcF9maW5lX3RtcigpIGFuZCBkaGNwX2NvYXJzZV90bXIoKSBhdAorICB0aGUgcHJlZGVmaW5lZCByZWd1bGFyIGludGVydmFscyBhZnRlciBzdGFydGluZyB0aGUgY2xpZW50LgorICAKKyAgWW91IGNhbiBwZWVrIGluIHRoZSBuZXRpZi0+ZGhjcCBzdHJ1Y3QgZm9yIHRoZSBhY3R1YWwgREhDUCBzdGF0dXMuCisKKworLS0tIE9wdGltYWxpemF0aW9uIGhpbnRzCisKK1RoZSBmaXJzdCB0aGluZyB5b3Ugd2FudCB0byBvcHRpbWl6ZSBpcyB0aGUgbHdpcF9zdGFuZGFyZF9jaGVja3N1bSgpCityb3V0aW5lIGZyb20gc3JjL2NvcmUvaW5ldC5jLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgc3RhbmRhcmQKK2Z1bmN0aW9uIHdpdGggdGhlICNkZWZpbmUgTFdJUF9DSEtTVU0gPHlvdXJfY2hlY2tzdW1fcm91dGluZT4uCisKK1RoZXJlIGFyZSBDIGV4YW1wbGVzIGdpdmVuIGluIGluZXQuYyBvciB5b3UgbWlnaHQgd2FudCB0bworY3JhZnQgYW4gYXNzZW1ibHkgZnVuY3Rpb24gZm9yIHRoaXMuIFJGQzEwNzEgaXMgYSBnb29kCitpbnRyb2R1Y3Rpb24gdG8gdGhpcyBzdWJqZWN0LgorCitPdGhlciBzaWduaWZpY2FudCBpbXByb3ZlbWVudHMgY2FuIGJlIG1hZGUgYnkgc3VwcGx5aW5nCithc3NlbWJseSBvciBpbmxpbmUgcmVwbGFjZW1lbnRzIGZvciBodG9ucygpIGFuZCBodG9ubCgpCitpZiB5b3UncmUgdXNpbmcgYSBsaXR0bGUtZW5kaWFuIGFyY2hpdGVjdHVyZS4KKyNkZWZpbmUgTFdJUF9QTEFURk9STV9CWVRFU1dBUCAxCisjZGVmaW5lIExXSVBfUExBVEZPUk1fSFRPTlMoeCkgPHlvdXJfaHRvbnM+CisjZGVmaW5lIExXSVBfUExBVEZPUk1fSFRPTkwoeCkgPHlvdXJfaHRvbmw+CisKK0NoZWNrIHlvdXIgbmV0d29yayBpbnRlcmZhY2UgZHJpdmVyIGlmIGl0IHJlYWRzIGF0CithIGhpZ2hlciBzcGVlZCB0aGFuIHRoZSBtYXhpbXVtIHdpcmUtc3BlZWQuIElmIHRoZQoraGFyZHdhcmUgaXNuJ3Qgc2VydmljZWQgZnJlcXVlbnRseSBhbmQgZmFzdCBlbm91Z2gKK2J1ZmZlciBvdmVyZmxvd3MgYXJlIGxpa2VseSB0byBvY2N1ci4KKworRS5nLiB3aGVuIHVzaW5nIHRoZSBjczg5MDAgZHJpdmVyLCBjYWxsIGNzODkwMGlmX3NlcnZpY2UoZXRoaWYpCithcyBmcmVxdWVudGx5IGFzIHBvc3NpYmxlLiBXaGVuIHVzaW5nIGFuIFJUT1MgbGV0IHRoZSBjczg5MDAgaW50ZXJydXB0Cit3YWtlIGEgaGlnaCBwcmlvcml0eSB0YXNrIHRoYXQgc2VydmljZXMgeW91ciBkcml2ZXIgdXNpbmcgYSBiaW5hcnkKK3NlbWFwaG9yZSBvciBldmVudCBmbGFnLiBTb21lIGRyaXZlcnMgbWlnaHQgYWxsb3cgYWRkaXRpb25hbCB0dW5pbmcKK3RvIG1hdGNoIHlvdXIgYXBwbGljYXRpb24gYW5kIG5ldHdvcmsuCisKK0ZvciBhIHByb2R1Y3Rpb24gcmVsZWFzZSBpdCBpcyByZWNvbW1lbmRlZCB0byBzZXQgTFdJUF9TVEFUUyB0byAwLgorTm90ZSB0aGF0IHNwZWVkIHBlcmZvcm1hbmNlIGlzbid0IGluZmx1ZW5jZWQgbXVjaCBieSBzaW1wbHkgc2V0dGluZworaGlnaCB2YWx1ZXMgdG8gdGhlIG1lbW9yeSBvcHRpb25zLgorCitGb3IgbW9yZSBvcHRpbWl6YXRpb24gaGludHMgdGFrZSBhIGxvb2sgYXQgdGhlIGx3SVAgd2lraS4KKworLS0tIFplcm8tY29weSBNQUNzCisKK1RvIGFjaGlldmUgemVyby1jb3B5IG9uIHRyYW5zbWl0LCB0aGUgZGF0YSBwYXNzZWQgdG8gdGhlIHJhdyBBUEkgbXVzdAorcmVtYWluIHVuY2hhbmdlZCB1bnRpbCBzZW50LiBCZWNhdXNlIHRoZSBzZW5kLSAob3Igd3JpdGUtKWZ1bmN0aW9ucyByZXR1cm4KK3doZW4gdGhlIHBhY2tldHMgaGF2ZSBiZWVuIGVucXVldWVkIGZvciBzZW5kaW5nLCBkYXRhIG11c3QgYmUga2VwdCBzdGFibGUKK2FmdGVyIHRoYXQsIHRvby4KKworVGhpcyBpbXBsaWVzIHRoYXQgUEJVRl9SQU0vUEJVRl9QT09MIHBidWZzIHBhc3NlZCB0byByYXctQVBJIHNlbmQgZnVuY3Rpb25zCittdXN0ICpub3QqIGJlIHJldXNlZCBieSB0aGUgYXBwbGljYXRpb24gdW5sZXNzIHRoZWlyIHJlZi1jb3VudCBpcyAxLgorCitGb3Igbm8tY29weSBwYnVmcyAoUEJVRl9ST00vUEJVRl9SRUYpLCBkYXRhIG11c3QgYmUga2VwdCB1bmNoYW5nZWQsIHRvbywKK2J1dCB0aGUgc3RhY2svZHJpdmVyIHdpbGwvbXVzdCBjb3B5IFBCVUZfUkVGJ2VkIGRhdGEgd2hlbiBlbnF1ZXVlaW5nLCB3aGlsZQorUEJVRl9ST00tcGJ1ZnMgYXJlIGp1c3QgZW5xdWV1ZWQgKGFzIFJPTS1kYXRhIGlzIGV4cGVjdGVkIHRvIG5ldmVyIGNoYW5nZSkuCisKK0Fsc28sIGRhdGEgcGFzc2VkIHRvIHRjcF93cml0ZSB3aXRob3V0IHRoZSBjb3B5LWZsYWcgbXVzdCBub3QgYmUgY2hhbmdlZCEKKworVGhlcmVmb3JlLCBiZSBjYXJlZnVsIHdoaWNoIHR5cGUgb2YgUEJVRiB5b3UgdXNlIGFuZCBpZiB5b3UgY29weSBUQ1AgZGF0YQorb3Igbm90IQpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL2RvYy9zYXZhbm5haC50eHQgYi9jb3JlL2x3aXAvZG9jL3NhdmFubmFoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDk5MDViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL2RvYy9zYXZhbm5haC50eHQKQEAgLTAsMCArMSwxMzUgQEAKK0RhaWx5IFVzZSBHdWlkZSBmb3IgdXNpbmcgU2F2YW5uYWggZm9yIGx3SVAKKworVGFibGUgb2YgQ29udGVudHM6CisKKzEgLSBPYnRhaW5pbmcgbHdJUCBmcm9tIHRoZSBDVlMgcmVwb3NpdG9yeQorMiAtIENvbW1pdHRlcnMvZGV2ZWxvcGVycyBDVlMgYWNjZXNzIHVzaW5nIFNTSCAodG8gYmUgd3JpdHRlbikKKzMgLSBNZXJnaW5nIGZyb20gREVWRUwgYnJhbmNoIHRvIG1haW4gdHJ1bmsgKHN0YWJsZSBicmFuY2gpCis0IC0gSG93IHRvIHJlbGVhc2UgbHdJUAorCisKKworMSBPYnRhaW5pbmcgbHdJUCBmcm9tIHRoZSBDVlMgcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBwZXJmb3JtIGFuIGFub255bW91cyBDVlMgY2hlY2tvdXQgb2YgdGhlIG1haW4gdHJ1bmsgKHRoaXMgaXMgd2hlcmUKK2J1ZyBmaXhlcyBhbmQgaW5jcmVtZW50YWwgZW5oYW5jZW1lbnRzIG9jY3VyKSwgZG8gdGhpczoKKworY3ZzIC16MyAtZDpwc2VydmVyOmFub255bW91c0BjdnMuc3YuZ251Lm9yZzovc291cmNlcy9sd2lwIGNoZWNrb3V0IGx3aXAKKyAKK09yLCBvYnRhaW4gYSBzdGFibGUgYnJhbmNoICh1cGRhdGVkIHdpdGggYnVnIGZpeGVzIG9ubHkpIGFzIGZvbGxvd3M6CitjdnMgLXozIC1kOnBzZXJ2ZXI6YW5vbnltb3VzQGN2cy5zdi5nbnUub3JnOi9zb3VyY2VzL2x3aXAgY2hlY2tvdXQgXAorICAtciBTVEFCTEUtMF83IC1kIGx3aXAtMC43IGx3aXAKKworT3IsIG9idGFpbiBhIHNwZWNpZmljIChmaXhlZCkgcmVsZWFzZSBhcyBmb2xsb3dzOgorY3ZzIC16MyAtZDpwc2VydmVyOmFub255bW91c0BjdnMuc3YuZ251Lm9yZzovc291cmNlcy9sd2lwIGNoZWNrb3V0IFwKKyAgLXIgU1RBQkxFLTBfN18wIC1kIGx3aXAtMC43LjAgbHdpcAorCiszIENvbW1pdHRlcnMvZGV2ZWxvcGVycyBDVlMgYWNjZXNzIHVzaW5nIFNTSAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIFNhdmFubmFoIHNlcnZlciB1c2VzIFNTSCAoU2VjdXJlIFNoZWxsKSBwcm90b2NvbCAyIGF1dGhlbnRpY2F0aW9uIGFuZCBlbmNyeXB0aW9uLgorQXMgc3VjaCwgQ1ZTIGNvbW1pdHMgdG8gdGhlIHNlcnZlciBvY2N1ciB0aHJvdWdoIGEgU1NIIHR1bm5lbCBmb3IgcHJvamVjdCBtZW1iZXJzLgorVG8gY3JlYXRlIGEgU1NIMiBrZXkgcGFpciBpbiBVTklYLWxpa2UgZW52aXJvbm1lbnRzLCBkbyB0aGlzOgorCitzc2gta2V5Z2VuIC10IGRzYQorCitVbmRlciBXaW5kb3dzLCBhIHJlY29tbWVuZGVkIFNTSCBjbGllbnQgaXMgIlB1VFRZIiwgZnJlZWx5IGF2YWlsYWJsZSB3aXRoIGdvb2QKK2RvY3VtZW50YXRpb24gYW5kIGEgZ3JhcGhpYyB1c2VyIGludGVyZmFjZS4gVXNlIGl0cyBrZXkgZ2VuZXJhdG9yLgorCitOb3cgcGFzdGUgdGhlIGlkX2RzYS5wdWIgY29udGVudHMgaW50byB5b3VyIFNhdmFubmFoIGFjY291bnQgcHVibGljIGtleSBsaXN0LiBXYWl0CithIHdoaWxlIHNvIHRoYXQgU2F2YW5uYWggY2FuIHVwZGF0ZSBpdHMgY29uZmlndXJhdGlvbiAoVGhpcyBjYW4gdGFrZSBtaW51dGVzKS4KKworVHJ5IHRvIGxvZ2luIHVzaW5nIFNTSDoKKworc3NoIC12IHlvdXJfbG9naW5AY3ZzLnN2LmdudS5vcmcKKworSWYgaXQgdGVsbHMgeW91OgorCitBdXRoZW50aWNhdGluZyB3aXRoIHB1YmxpYyBrZXkgInlvdXJfa2V5X25hbWUiLi4uCitTZXJ2ZXIgcmVmdXNlZCB0byBhbGxvY2F0ZSBwdHkKKwordGhlbiB5b3UgY291bGQgbG9naW47IFNhdmFubmFoIHJlZnVzZXMgdG8gZ2l2ZSB5b3UgYSBzaGVsbCAtIHdoaWNoIGlzIE9LLCBhcyB3ZQorYXJlIGFsbG93ZWQgdG8gdXNlIFNTSCBmb3IgQ1ZTIG9ubHkuIE5vdywgeW91IHNob3VsZCBiZSBhYmxlIHRvIGRvIHRoaXM6CisKK2V4cG9ydCBDVlNfUlNIPXNzaAorY3ZzIC16MyAtZDpleHQ6eW91cl9sb2dpbkBjdnMuc3YuZ251Lm9yZzovc291cmNlcy9sd2lwIGNvIGx3aXAKKyAKK2FmdGVyIHdoaWNoIHlvdSBjYW4gZWRpdCB5b3VyIGxvY2FsIGZpbGVzIHdpdGggYnVnIGZpeGVzIG9yIG5ldyBmZWF0dXJlcyBhbmQKK2NvbW1pdCB0aGVtLiBNYWtlIHN1cmUgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIHdoZW4gdXNpbmcgQ1ZTIHRvIG1ha2UKK2NoYW5nZXMgb24gdGhlIHJlcG9zaXRvcnkuIElmIGluIGRvdWJ0LCBhc2sgb24gdGhlIGx3aXAtbWVtYmVycyBtYWlsaW5nIGxpc3QuCisKKyhJZiBTU0ggYXNrcyBhYm91dCBhdXRoZW50aWNpdHkgb2YgdGhlIGhvc3QsIHlvdSBjYW4gY2hlY2sgdGhlIGtleQorIGZpbmdlcnByaW50IGFnYWluc3QgaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvY3ZzLz9ncm91cD1sd2lwKQorCisKKzMgTWVyZ2luZyBmcm9tIERFVkVMIGJyYW5jaCB0byBtYWluIHRydW5rIChzdGFibGUpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNZXJnaW5nIGlzIGEgZGVsaWNhdGUgcHJvY2VzcyBpbiBDVlMgYW5kIHJlcXVpcmVzIHRoZQorZm9sbG93aW5nIGRpc2NpcGxpbmVkIHN0ZXBzIGluIG9yZGVyIHRvIHByZXZlbnQgY29uZmxpY3RzCitpbiB0aGUgZnV0dXJlLiBDb25mbGljdHMgY2FuIGJlIGhhcmQgdG8gc29sdmUhCisKK01lcmdpbmcgZnJvbSBicmFuY2ggQSB0byBicmFuY2ggQiByZXF1aXJlcyB0aGF0IHRoZSBBIGJyYW5jaAoraGFzIGEgdGFnIGluZGljYXRpbmcgdGhlIHByZXZpb3VzIG1lcmdlci4gVGhpcyB0YWcgaXMgY2FsbGVkCisnbWVyZ2VkX2Zyb21fQV90b19CJy4gQWZ0ZXIgbWVyZ2luZywgdGhlIHRhZyBpcyBtb3ZlZCBpbiB0aGUKK0EgYnJhbmNoIHRvIHJlbWVtYmVyIHRoaXMgbWVyZ2VyIGZvciBmdXR1cmUgbWVyZ2UgYWN0aW9ucy4KKworSU1QT1JUQU5UOiBBRlRFUiBDT01NSVRUSU5HIEEgU1VDQ0VTRlVMIE1FUkdFIElOIFRIRQorUkVQT1NJVE9SWSwgVEhFIFRBRyBNVVNUIEJFIFNFVCBPTiBUSEUgU09VUkNFIEJSQU5DSCBPRiBUSEUKK01FUkdFIEFDVElPTiAoUkVQTEFDSU5HIEVYSVNUSU5HIFRBR1MgV0lUSCBUSEUgU0FNRSBOQU1FKS4KKworTWVyZ2UgYWxsIGNoYW5nZXMgaW4gREVWRUwgc2luY2Ugb3VyIGxhc3QgbWVyZ2UgdG8gbWFpbjoKKworSW4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgbWFpbiB0cnVuazoKK2N2cyB1cGRhdGUgLVAgLWptZXJnZWRfZnJvbV9ERVZFTF90b19tYWluIC1qREVWRUwgCisKKyhUaGlzIHdpbGwgYXBwbHkgdGhlIGNoYW5nZXMgYmV0d2VlbiAnbWVyZ2VkX2Zyb21fREVWRUxfdG9fbWFpbicKK2FuZCAnREVWRUwnIHRvIHlvdXIgd29yayBzZXQgb2YgZmlsZXMpCisKK1dlIGNhbiBub3cgY29tbWl0IHRoZSBtZXJnZSByZXN1bHQuCitjdnMgY29tbWl0IC1SIC1tICJNZXJnZWQgZnJvbSBERVZFTCB0byBtYWluLiIgCisKK0lmIHRoaXMgd29ya2VkIG91dCBPSywgd2Ugbm93IG1vdmUgdGhlIHRhZyBpbiB0aGUgREVWRUwgYnJhbmNoCit0byB0aGlzIG1lcmdlIHBvaW50LCBzbyB3ZSBjYW4gdXNlIHRoaXMgcG9pbnQgZm9yIGZ1dHVyZSBtZXJnZXM6CisKK2N2cyBydGFnIC1GIC1yIERFVkVMIG1lcmdlZF9mcm9tX0RFVkVMX3RvX21haW4gbHdpcCAKKworNCBIb3cgdG8gcmVsZWFzZSBsd0lQCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmlyc3QsIGNoZWNrb3V0IGEgY2xlYW4gY29weSBvZiB0aGUgYnJhbmNoIHRvIGJlIHJlbGVhc2VkLiBUYWcgdGhpcyBzZXQgd2l0aAordGFnIG5hbWUgIlNUQUJMRS0wXzZfMyIuIChJIHVzZSByZWxlYXNlIG51bWJlciAwLjYuMyB0aHJvdWdob3V0IHRoaXMgZXhhbXBsZSkuCisKK0xvZ2luIENWUyB1c2luZyBwc2VydmVyIGF1dGhlbnRpY2F0aW9uLCB0aGVuIGV4cG9ydCBhIGNsZWFuIGNvcHkgb2YgdGhlCit0YWdnZWQgdHJlZS4gRXhwb3J0IGlzIHNpbWlsYXIgdG8gYSBjaGVja291dCwgZXhjZXB0IHRoYXQgdGhlIENWUyBtZXRhZGF0YQoraXMgbm90IGNyZWF0ZWQgbG9jYWxseS4gCisKK2V4cG9ydCBDVlNfUlNIPXNzaAorY3ZzIC16MyAtZDpwc2VydmVyOmFub255bW91c0BjdnMuc3YuZ251Lm9yZzovc291cmNlcy9sd2lwIGNoZWNrb3V0IFwKKyAgLXIgU1RBQkxFLTBfNl8zIC1kIGx3aXAtMC42LjMgbHdpcAorCitBcmNoaXZlIHRoaXMgZGlyZWN0b3J5IHVzaW5nIHRhciwgZ3ppcCdkLCBiemlwMidkIGFuZCB6aXAnZC4KKwordGFyIGN6dmYgbHdpcC0wLjYuMy50YXIuZ3ogbHdpcC0wLjYuMwordGFyIGNqdmYgbHdpcC0wLjYuMy50YXIuYnoyIGx3aXAtMC42LjMKK3ppcCAtciBsd2lwLTAuNi4zLnppcCBsd2lwLTAuNi4zCisKK05vdywgc2lnbiB0aGUgYXJjaGl2ZXMgd2l0aCBhIGRldGFjaGVkIEdQRyBiaW5hcnkgc2lnbmF0dXJlIGFzIGZvbGxvd3M6CisKK2dwZyAtYiBsd2lwLTAuNi4zLnRhci5negorZ3BnIC1iIGx3aXAtMC42LjMudGFyLmJ6MgorZ3BnIC1iIGx3aXAtMC42LjMuemlwCisKK1VwbG9hZCB0aGVzZSBmaWxlcyB1c2luZyBhbm9ueW1vdXMgRlRQOgorbmNmdHAgZnRwOi8vc2F2YW5uYWguZ251Lm9yZy9pbmNvbWluZy9zYXZhbm5haC9sd2lwCisKK25jZnRwPm1wdXQgKjAuNi4zLioKKworQWRkaXRpb25hbGx5LCB5b3UgbWF5IHBvc3QgYSBuZXdzIGl0ZW0gb24gU2F2YW5uYWgsIGxpa2UgdGhpczoKKworQSBuZXcgMC42LjMgcmVsZWFzZSBpcyBub3cgYXZhaWxhYmxlIGhlcmU6CitodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9maWxlcy8/Z3JvdXA9bHdpcCZoaWdobGlnaHQ9MC42LjMKKworWW91IHdpbGwgaGF2ZSB0byBzdWJtaXQgdGhpcyB2aWEgdGhlIHVzZXIgTmV3cyBpbnRlcmZhY2UsIHRoZW4gYXBwcm92ZQordGhpcyB2aWEgdGhlIEFkbWluaXN0cmF0b3IgTmV3cyBpbnRlcmZhY2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL2RvYy9zbm1wX2FnZW50LnR4dCBiL2NvcmUvbHdpcC9kb2Mvc25tcF9hZ2VudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1MzIzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9kb2Mvc25tcF9hZ2VudC50eHQKQEAgLTAsMCArMSwxODEgQEAKK1NOTVB2MSBhZ2VudCBmb3IgbHdJUAorCitBdXRob3I6IENocmlzdGlhYW4gU2ltb25zCisKK1RoaXMgaXMgYSBicmllZiBpbnRyb2R1Y3Rpb24gaG93IHRvIHVzZSBhbmQgY29uZmlndXJlIHRoZSBTTk1QIGFnZW50LgorTm90ZSB0aGUgYWdlbnQgdXNlcyB0aGUgcmF3LUFQSSBVRFAgaW50ZXJmYWNlIHNvIHlvdSBtYXkgYWxzbyB3YW50IHRvCityZWFkIHJhd2FwaS50eHQgdG8gZ2FpbiBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBTTk1QIG1lc3NhZ2UgaGFuZGxpbmcuCisKKzAgQWdlbnQgQ2FwYWJpbGl0aWVzCis9PT09PT09PT09PT09PT09PT09PQorCitTTk1QdjEgcGVyIFJGQzExNTcKKyAgVGhpcyBpcyBhbiBvbGQoZXIpIHN0YW5kYXJkIGJ1dCBpcyBzdGlsbCB3aWRlbHkgc3VwcG9ydGVkLgorICBGb3IgU05NUHYyYyBhbmQgdjMgaGF2ZSBhIGdyZWF0ZXIgY29tcGxleGl0eSBhbmQgbmVlZCBtYW55CisgIG1vcmUgbGluZXMgb2YgY29kZS4gSU1ITyB0aGlzIGJyZWFrcyB0aGUgaWRlYSBvZiAibGlnaHR3ZWlnaHQgSVAiLgorCisgIE5vdGUgdGhlIFMgaW4gU05NUCBzdGFuZHMgZm9yICJTaW1wbGUiLiBOb3RlIHRoYXQgIlNpbXBsZSIgaXMKKyAgcmVsYXRpdmUuIFNOTVAgaXMgc2ltcGxlIGNvbXBhcmVkIHRvIHRoZSBjb21wbGV4IElTTyBuZXR3b3JrCisgIG1hbmFnZW1lbnQgcHJvdG9jb2xzIENNSVAgKENvbW1vbiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uIFByb3RvY29sKQorICBhbmQgQ01PVCAoQ01pcCBPdmVyIFRjcCkuCisKK01JQiBJSSBwZXIgUkZDMTIxMworICBUaGUgc3RhbmRhcmQgbHdJUCBzdGFjayBtYW5hZ2VtZW50IGluZm9ybWF0aW9uIGJhc2UuCisgIFRoaXMgaXMgYSByZXF1aXJlZCBNSUIsIHNvIHRoaXMgaXMgYWx3YXlzIGVuYWJsZWQuCisgIFdoZW4gYnVpbGluZyBsd0lQIHdpdGhvdXQgVENQLCB0aGUgbWliLTIudGNwIGdyb3VwIGlzIG9taXR0ZWQuCisgIFRoZSBncm91cHMgRUdQLCBDTU9UIGFuZCB0cmFuc21pc3Npb24gYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgIAorICBNb3N0IG1pYi0yIG9iamVjdHMgYXJlIG5vdCB3cml0YWJsZSBleGNlcHQ6CisgIHN5c05hbWUsIHN5c0xvY2F0aW9uLCBzeXNDb250YWN0LCBzbm1wRW5hYmxlQXV0aGVuVHJhcHMuCisgIFdyaXRpbmcgdG8gb3IgY2hhbmdpbmcgdGhlIEFSUCBhbmQgSVAgYWRkcmVzcyBhbmQgcm91dGUKKyAgdGFibGVzIGlzIG5vdCBwb3NzaWJsZS4KKyAKKyAgTm90ZSBsd0lQIGhhcyBhIHZlcnkgbGltaXRlZCBub3Rpb24gb2YgSVAgcm91dGluZy4gSXQgY3VycmVudGx5CisgIGRvZW4ndCBoYXZlIGEgcm91dGUgdGFibGUgYW5kIGRvZXNuJ3QgaGF2ZSBhIG5vdGlvbiBvZiB0aGUgVSxHLEggZmxhZ3MuCisgIEluc3RlYWQgbHdJUCB1c2VzIHRoZSBpbnRlcmZhY2UgbGlzdCB3aXRoIG9ubHkgb25lIGRlZmF1bHQgaW50ZXJmYWNlCisgIGFjdGluZyBhcyBhIHNpbmdsZSBnYXRld2F5IGludGVyZmFjZSAoRykgZm9yIHRoZSBkZWZhdWx0IHJvdXRlLgorCisgIFRoZSBhZ2VudCByZXR1cm5zIGEgInZpcnR1YWwgdGFibGUiIHdpdGggdGhlIGRlZmF1bHQgcm91dGUgMC4wLjAuMAorICBmb3IgdGhlIGRlZmF1bHQgaW50ZXJmYWNlIGFuZCBuZXR3b3JrIHJvdXRlcyAobm8gSCkgZm9yIGVhY2gKKyAgbmV0d29yayBpbnRlcmZhY2UgaW4gdGhlIG5ldGlmX2xpc3QuCisgIEFsbCByb3V0ZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgdXAgKFUpLgorCitMb2FkaW5nIGFkZGl0aW9uYWwgTUlCcworICBNSUJzIGNhbiBvbmx5IGJlIGFkZGVkIGluIGNvbXBpbGUtdGltZSwgbm90IGluIHJ1bi10aW1lLgorICBUaGVyZSBpcyBubyBNSUIgY29tcGlsZXIgdGh1cyBhZGRpdGlvbmFsIE1JQnMgbXVzdCBiZSBoYW5kIGNvZGVkLgorCitMYXJnZSBTTk1QIG1lc3NhZ2Ugc3VwcG9ydAorICBUaGUgcGFja2V0IGRlY29kaW5nIGFuZCBlbmNvZGluZyByb3V0aW5lcyBhcmUgZGVzaWduZWQKKyAgdG8gdXNlIHBidWYtY2hhaW5zLiBMYXJnZXIgcGF5bG9hZHMgdGhhbiB0aGUgbWluaW11bQorICBTTk1QIHJlcXVpcmVtZW50IG9mIDQ4NCBvY3RldHMgYXJlIHN1cHBvcnRlZCBpZiB0aGUgCisgIFBCVUZfUE9PTF9TSVpFIGFuZCBJUF9SRUFTU19CVUZTSVpFIGFyZSBzZXQgdG8gbWF0Y2ggeW91cgorICBsb2NhbCByZXF1aXJlbWVudC4KKworMSBCdWlsZGluZyB0aGUgQWdlbnQKKz09PT09PT09PT09PT09PT09PT09CisKK0ZpcnN0IG9mIGFsbCB5b3UnbGwgbmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZyBkZWZpbmUKK3RvIHlvdXIgbG9jYWwgbHdpcG9wdHMuaDoKKworI2RlZmluZSBMV0lQX1NOTVAgICAgICAgICAgICAgICAxCisKK2FuZCBhZGQgdGhlIHNvdXJjZSBmaWxlcyBpbiBsd2lwL3NyYy9jb3JlL3NubXAKK2FuZCBzb21lIHNubXAgaGVhZGVycyBpbiBsd2lwL3NyYy9pbmNsdWRlL2x3aXAgdG8geW91ciBtYWtlZmlsZS4KKworTm90ZSB5b3UnbGwgbWlnaHQgbmVlZCB0byBhZGFwdCB5b3UgbmV0d29yayBkcml2ZXIgdG8gdXBkYXRlCit0aGUgbWliMiB2YXJpYWJsZXMgZm9yIHlvdXIgaW50ZXJmYWNlLgorCisyIFJ1bm5pbmcgdGhlIEFnZW50Cis9PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbHMgbXVzdCBiZSBtYWRlIGluIHlvdXIgcHJvZ3JhbSB0bworYWN0dWFsbHkgZ2V0IHRoZSBTTk1QIGFnZW50IHJ1bm5pbmcuCisKK0JlZm9yZSBzdGFydGluZyB0aGUgYWdlbnQgeW91IHNob3VsZCBzdXBwbHkgcG9pbnRlcnMKK3RvIG5vbi12b2xhdGlsZSBtZW1vcnkgZm9yIHN5c0NvbnRhY3QsIHN5c0xvY2F0aW9uLAorYW5kIHNubXBFbmFibGVBdXRoZW5UcmFwcy4gWW91IGNhbiBkbyB0aGlzIGJ5IGNhbGxpbmcKKworc25tcF9zZXRfc3lzY29udGFjdCgpCitzbm1wX3NldF9zeXNsb2NhdGlvbigpCitzbm1wX3NldF9zbm1wZW5hYmxlYXV0aGVudHJhcHMoKQorCitBZGRpdGlvbmFsbHkgeW91IG1heSB3YW50IHRvIHNldAorCitzbm1wX3NldF9zeXNkZXNjcigpCitzbm1wX3NldF9zeXNvYmppZCgpIChpZiB5b3UgaGF2ZSBhIHByaXZhdGUgTUlCKQorc25tcF9zZXRfc3lzbmFtZSgpCisKK0Fsc28gYmVmb3JlIHN0YXJ0aW5nIHRoZSBhZ2VudCB5b3UgbmVlZCB0byBzZXR1cAorb25lIG9yIG1vcmUgdHJhcCBkZXN0aW5hdGlvbnMgdXNpbmcgdGhlc2UgY2FsbHM6CisKK3NubXBfdHJhcF9kc3RfZW5hYmxlKCk7Citzbm1wX3RyYXBfZHN0X2lwX3NldCgpOworCitJbiB0aGUgbHdJUCBpbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSBjYWxsIHNubXBfaW5pdCgpIGp1c3QgYWZ0ZXIKK3RoZSBjYWxsIHRvIHVkcF9pbml0KCkuCisKK0V4YWN0bHkgZXZlcnkgMTAgbXNlYyB0aGUgU05NUCB1cHRpbWUgdGltZXN0YW1wIG11c3QgYmUgdXBkYXRlZCB3aXRoCitzbm1wX2luY19zeXN1cHRpbWUoKS4gWW91IHNob3VsZCBjYWxsIHRoaXMgZnJvbSBhIHRpbWVyIGludGVycnVwdAorb3IgYSB0aW1lciBzaWduYWwgaGFuZGxlciBkZXBlbmRpbmcgb24geW91ciBydW50aW1lIGVudmlyb25tZW50LgorCitBbiBhbHRlcm5hdGl2ZSB3YXkgdG8gdXBkYXRlIHRoZSBTTk1QIHVwdGltZSB0aW1lc3RhbXAgaXMgdG8gZG8gYSBjYWxsIGxpa2UKK3NubXBfYWRkX3N5c3VwdGltZSgxMDApIGVhY2ggMTAwMG1zICh3aGljaCBpcyBiaWdnZXIgInN0ZXAiLCBidXQgY2FsbCB0bworYSBsb3dlciBmcmVxdWVuY3kpLiBBbm90aGVyIG9uZSBpcyB0byBub3QgY2FsbCBzbm1wX2luY19zeXN1cHRpbWUoKSBvcgorc25tcF9hZGRfc3lzdXB0aW1lKCksIGFuZCB0byBkZWZpbmUgdGhlIFNOTVBfR0VUX1NZU1VQVElNRShzeXN1cHRpbWUpIG1hY3JvLgorVGhpcyBvbmUgaXMgdW5kZWZpbmVkIGJ5IGRlZmF1bHQgaW4gbWliMi5jLiBTTk1QX0dFVF9TWVNVUFRJTUUgaXMgY2FsbGVkIGluc2lkZQorc25tcF9nZXRfc3lzdXB0aW1lKHUzMl90ICp2YWx1ZSksIGFuZCBlbmFibGUgdG8gY2hhbmdlICJzeXN1cHRpbWUiIHZhbHVlIG9ubHkKK3doZW4gaXQncyBxdWVyaWVkIChhbnkgZnVuY3Rpb24gd2hpY2ggbmVlZCAic3lzdXB0aW1lIiBoYXZlIHRvIGNhbGwKK3NubXBfZ2V0X3N5c3VwdGltZSkuCisKKworMyBQcml2YXRlIE1JQnMKKz09PT09PT09PT09PT09CisKK0lmIHdhbnQgdG8gZXh0ZW5kIHRoZSBhZ2VudCB3aXRoIHlvdXIgb3duIHByaXZhdGUgTUlCIHlvdSdsbCBuZWVkIHRvCithZGQgdGhlIGZvbGxvd2luZyBkZWZpbmUgdG8geW91ciBsb2NhbCBsd2lwb3B0cy5oOgorCisjZGVmaW5lIFNOTVBfUFJJVkFURV9NSUIgICAgICAgIDEKKworWW91IG11c3QgcHJvdmlkZSB0aGUgcHJpdmF0ZV9taWIuaCBhbmQgYXNzb2NpYXRlZCBmaWxlcyB5b3Vyc2VsZi4KK05vdGUgd2UgZG9uJ3QgaGF2ZSBhICJNSUIgY29tcGlsZXIiIHRoYXQgZ2VuZXJhdGVzIEMgc291cmNlIGZyb20gYSBNSUIsCitzbyB5b3UncmUgcmVxdWlyZWQgdG8gZG8gc29tZSBzZXJpb3VzIGNvZGluZyBpZiB5b3UgZW5hYmxlIHRoaXMhCisKK05vdGUgdGhlIGx3SVAgZW50ZXJwcmlzZSBJRCAoMjYzODEpIGlzIGFzc2lnbmVkIHRvIHRoZSBsd0lQIHByb2plY3QsCitBTEwgT0JKRUNUIElERU5USUZJRVJTIExJVklORyBVTkRFUiBUSElTIElEIEFSRSBBU1NJR05FRCBCWSBUSEUgbHdJUAorTUFJTlRBSU5FUlMhCisKK0lmIHlvdSBuZWVkIHRvIGNyZWF0ZSB5b3VyIG93biBwcml2YXRlIE1JQiB5b3UnbGwgbmVlZAordG8gYXBwbHkgZm9yIHlvdXIgb3duIGVudGVycHJpc2UgSUQgd2l0aCBJQU5BOiBodHRwOi8vd3d3LmlhbmEub3JnL251bWJlcnMuaHRtbCAKKworWW91IGNhbiBzZXQgaXQgYnkgcGFzc2luZyBhIHN0cnVjdCBzbm1wX29ial9pZCB0byB0aGUgYWdlbnQKK3VzaW5nIHNubXBfc2V0X3N5c29iamlkKCZteV9vYmplY3RfaWQpLCBqdXN0IGJlZm9yZSBzbm1wX2luaXQoKS4KKworTm90ZSB0aGUgb2JqZWN0IGlkZW50aWZpZXJzIGZvciB0aGVzIE1JQi0yIGFuZCB5b3VyIHByaXZhdGUgTUlCCit0cmVlIG11c3QgYmUga2VwdCBpbiBzb3J0ZWQgYXNjZW5kaW5nIChsZXhpY29ncmFwaGljYWwpIG9yZGVyLgorVGhpcyB0byBlbnN1cmUgY29ycmVjdCBnZXRuZXh0IG9wZXJhdGlvbi4KKworQW4gZXhhbXBsZSBmb3IgYSBwcml2YXRlIE1JQiBpcyBwYXJ0IG9mIHRoZSAibWluaW1hbCBVbml4IiBwcm9qZWN0OgorY29udHJpYi9wb3J0cy91bml4L3Byb2ovbWluaW1hbC9sd2lwX3Bydm1pYi5jCisKK1RoZSBuZXh0IGNoYXB0ZXIgZ2l2ZXMgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorTUlCLTIgdHJlZSBhbmQgdGhlIG9wdGlvbmFsIHByaXZhdGUgTUlCLgorCis0IFRoZSBHb3J5IERldGFpbHMKKz09PT09PT09PT09PT09PT09PQorCis0LjAgT2JqZWN0IGlkZW50aWZpZXJzIGFuZCB0aGUgTUlCIHRyZWUuCisKK1dlIGhhdmUgdGhyZWUgZGlzdGluY3QgcGFydHMgZm9yIGFsbCBvYmplY3QgaWRlbnRpZmllcnM6CisKK1RoZSBwcmVmaXgKKyAgLmlzby5vcmcuZG9kLmludGVybmV0CisKK3RoZSBtaWRkbGUgcGFydCAKKyAgLm1nbXQubWliLTIuaXAuaXBOZXRUb01lZGlhVGFibGUuaXBOZXRUb01lZGlhRW50cnkuaXBOZXRUb01lZGlhUGh5c0FkZHJlc3MKKworYW5kIHRoZSBpbmRleCBwYXJ0CisgIC4xLjE5Mi4xNjguMC4xCisKK09iamVjdHMgbG9jYXRlZCBhYm92ZSB0aGUgLmludGVybmV0IGhpZXJhcmNoeSBhcmVuJ3Qgc3VwcG9ydGVkLgorQ3VycmVudGx5IG9ubHkgdGhlIC5tZ210IHN1Yi10cmVlIGlzIGF2YWlsYWJsZSBhbmQKK3doZW4gdGhlIFNOTVBfUFJJVkFURV9NSUIgaXMgZW5hYmxlZCB0aGUgLnByaXZhdGUgdHJlZQorYmVjb21lcyBhdmFpbGFibGUgdG9vLgorCitPYmplY3QgaWRlbnRpZmllcnMgZnJvbSBpbmNvbWluZyByZXF1ZXN0cyBhcmUgY2hlY2tlZAorZm9yIGEgbWF0Y2hpbmcgcHJlZml4LCBtaWRkbGUgcGFydCBhbmQgaW5kZXggcGFydAorb3IgYXJlIGV4cGFuZGVkKCopIGZvciBHZXROZXh0IHJlcXVlc3RzIHdpdGggc2hvcnQKK29yIGluZXhpc3RpbmcgbmFtZXMgaW4gdGhlIHJlcXVlc3QuCisoKiB3ZSBjYWxsIHRoaXMgImV4cGFuc2lvbiIgYnV0IHRoaXMgYWxzbworcmVzZW1ibGVzIHRoZSAiYXV0by1jb21wbGV0aW9uIiBvcGVyYXRpb24pCisKK1RoZSBtaWRkbGUgcGFydCBpcyB1c3VhbGx5IGxvY2F0ZWQgaW4gUk9NIChjb25zdCkKK3RvIHByZXNlcnZlIHByZWNpb3VzIFJBTSBvbiBzbWFsbCBtaWNyb2NvbnRyb2xsZXJzLgorSG93ZXZlciBSQU0gbG9jYXRpb24gaXMgcG9zc2libGUgZm9yIGEgZHluYW1pY2FsbHkKK2NoYW5naW5nIHByaXZhdGUgdHJlZS4KKworVGhlIGluZGV4IHBhcnQgaXMgaGFuZGxlZCBieSBmdW5jdGlvbnMgd2hpY2ggaW4KK3R1cm4gdXNlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpbmRleCB0cmVlcyBmcm9tIFJBTS4KK1RoZXNlIHRyZWVzIGFyZSB1cGRhdGVkIGJ5IGUuZy4gdGhlIGV0aGFycCBjb2RlCit3aGVuIG5ldyBlbnRyaWVzIGFyZSBtYWRlIG9yIHJlbW92ZWQgZm9ybSB0aGUgQVJQIGNhY2hlLgorCisvKiogQHRvZG8gbW9yZSBnb3J5IGRldGFpbHMgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9kb2Mvc3lzX2FyY2gudHh0IGIvY29yZS9sd2lwL2RvYy9zeXNfYXJjaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViOTMwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9kb2Mvc3lzX2FyY2gudHh0CkBAIC0wLDAgKzEsMjE2IEBACitzeXNfYXJjaCBpbnRlcmZhY2UgZm9yIGx3SVAgMC42KysKKworQXV0aG9yOiBBZGFtIER1bmtlbHMKKworVGhlIG9wZXJhdGluZyBzeXN0ZW0gZW11bGF0aW9uIGxheWVyIHByb3ZpZGVzIGEgY29tbW9uIGludGVyZmFjZQorYmV0d2VlbiB0aGUgbHdJUCBjb2RlIGFuZCB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtIGtlcm5lbC4gVGhlCitnZW5lcmFsIGlkZWEgaXMgdGhhdCBwb3J0aW5nIGx3SVAgdG8gbmV3IGFyY2hpdGVjdHVyZXMgcmVxdWlyZXMgb25seQorc21hbGwgY2hhbmdlcyB0byBhIGZldyBoZWFkZXIgZmlsZXMgYW5kIGEgbmV3IHN5c19hcmNoCitpbXBsZW1lbnRhdGlvbi4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkbyBhIHN5c19hcmNoIGltcGxlbWVudGF0aW9uCit0aGF0IGRvZXMgbm90IHJlbHkgb24gYW55IHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbS4KKworVGhlIHN5c19hcmNoIHByb3ZpZGVzIHNlbWFwaG9yZXMgYW5kIG1haWxib3hlcyB0byBsd0lQLiBGb3IgdGhlIGZ1bGwKK2x3SVAgZnVuY3Rpb25hbGl0eSwgbXVsdGlwbGUgdGhyZWFkcyBzdXBwb3J0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKK3N5c19hcmNoLCBidXQgdGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZSBiYXNpYyBsd0lQCitmdW5jdGlvbmFsaXR5LiBQcmV2aW91cyB2ZXJzaW9ucyBvZiBsd0lQIHJlcXVpcmVkIHRoZSBzeXNfYXJjaCB0bworaW1wbGVtZW50IHRpbWVyIHNjaGVkdWxpbmcgYXMgd2VsbCBidXQgYXMgb2YgbHdJUCAwLjUgdGhpcyBpcworaW1wbGVtZW50ZWQgaW4gYSBoaWdoZXIgbGF5ZXIuCisKK0luIGFkZGl0aW9uIHRvIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygc3lzX2FyY2gsCit0aGUgT1MgZW11bGF0aW9uIGxheWVyIG11c3QgcHJvdmlkZSBzZXZlcmFsIGhlYWRlciBmaWxlcyBkZWZpbmluZworbWFjcm9zIHVzZWQgdGhyb3VnaG91dCBsd2lwLiAgVGhlIGZpbGVzIHJlcXVpcmVkIGFuZCB0aGUgbWFjcm9zIHRoZXkKK211c3QgZGVmaW5lIGFyZSBsaXN0ZWQgYmVsb3cgdGhlIHN5c19hcmNoIGRlc2NyaXB0aW9uLgorCitTZW1hcGhvcmVzIGNhbiBiZSBlaXRoZXIgY291bnRpbmcgb3IgYmluYXJ5IC0gbHdJUCB3b3JrcyB3aXRoIGJvdGgKK2tpbmRzLiBNYWlsYm94ZXMgYXJlIHVzZWQgZm9yIG1lc3NhZ2UgcGFzc2luZyBhbmQgY2FuIGJlIGltcGxlbWVudGVkCitlaXRoZXIgYXMgYSBxdWV1ZSB3aGljaCBhbGxvd3MgbXVsdGlwbGUgbWVzc2FnZXMgdG8gYmUgcG9zdGVkIHRvIGEKK21haWxib3gsIG9yIGFzIGEgcmVuZGV6LXZvdXMgcG9pbnQgd2hlcmUgb25seSBvbmUgbWVzc2FnZSBjYW4gYmUKK3Bvc3RlZCBhdCBhIHRpbWUuIGx3SVAgd29ya3Mgd2l0aCBib3RoIGtpbmRzLCBidXQgdGhlIGZvcm1lciB0eXBlIHdpbGwKK2JlIG1vcmUgZWZmaWNpZW50LiBBIG1lc3NhZ2UgaW4gYSBtYWlsYm94IGlzIGp1c3QgYSBwb2ludGVyLCBub3RoaW5nCittb3JlLiAKKworU2VtYXBob3JlcyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIHR5cGUgInN5c19zZW1fdCIgd2hpY2ggaXMgdHlwZWRlZidkCitpbiB0aGUgc3lzX2FyY2guaCBmaWxlLiBNYWlsYm94ZXMgYXJlIGVxdWl2YWxlbnRseSByZXByZXNlbnRlZCBieSB0aGUKK3R5cGUgInN5c19tYm94X3QiLiBsd0lQIGRvZXMgbm90IHBsYWNlIGFueSByZXN0cmljdGlvbnMgb24gaG93CitzeXNfc2VtX3Qgb3Igc3lzX21ib3hfdCBhcmUgcmVwcmVzZW50ZWQgaW50ZXJuYWxseS4KKworVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc3lzX2FyY2g6CisKKy0gdm9pZCBzeXNfaW5pdCh2b2lkKQorCisgIElzIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBzeXNfYXJjaCBsYXllci4KKworLSBzeXNfc2VtX3Qgc3lzX3NlbV9uZXcodThfdCBjb3VudCkKKworICBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHNlbWFwaG9yZS4gVGhlICJjb3VudCIgYXJndW1lbnQgc3BlY2lmaWVzCisgIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBzZW1hcGhvcmUuCisKKy0gdm9pZCBzeXNfc2VtX2ZyZWUoc3lzX3NlbV90IHNlbSkKKworICBEZWFsbG9jYXRlcyBhIHNlbWFwaG9yZS4KKworLSB2b2lkIHN5c19zZW1fc2lnbmFsKHN5c19zZW1fdCBzZW0pCisKKyAgU2lnbmFscyBhIHNlbWFwaG9yZS4KKworLSB1MzJfdCBzeXNfYXJjaF9zZW1fd2FpdChzeXNfc2VtX3Qgc2VtLCB1MzJfdCB0aW1lb3V0KQorCisgIEJsb2NrcyB0aGUgdGhyZWFkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBzZW1hcGhvcmUgdG8gYmUKKyAgc2lnbmFsZWQuIElmIHRoZSAidGltZW91dCIgYXJndW1lbnQgaXMgbm9uLXplcm8sIHRoZSB0aHJlYWQgc2hvdWxkCisgIG9ubHkgYmUgYmxvY2tlZCBmb3IgdGhlIHNwZWNpZmllZCB0aW1lIChtZWFzdXJlZCBpbgorICBtaWxsaXNlY29uZHMpLiBJZiB0aGUgInRpbWVvdXQiIGFyZ3VtZW50IGlzIHplcm8sIHRoZSB0aHJlYWQgc2hvdWxkIGJlCisgIGJsb2NrZWQgdW50aWwgdGhlIHNlbWFwaG9yZSBpcyBzaWduYWxsZWQuCisKKyAgSWYgdGhlIHRpbWVvdXQgYXJndW1lbnQgaXMgbm9uLXplcm8sIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZgorICBtaWxsaXNlY29uZHMgc3BlbnQgd2FpdGluZyBmb3IgdGhlIHNlbWFwaG9yZSB0byBiZSBzaWduYWxlZC4gSWYgdGhlCisgIHNlbWFwaG9yZSB3YXNuJ3Qgc2lnbmFsZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZSwgdGhlIHJldHVybiB2YWx1ZSBpcworICBTWVNfQVJDSF9USU1FT1VULiBJZiB0aGUgdGhyZWFkIGRpZG4ndCBoYXZlIHRvIHdhaXQgZm9yIHRoZSBzZW1hcGhvcmUKKyAgKGkuZS4sIGl0IHdhcyBhbHJlYWR5IHNpZ25hbGVkKSwgdGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gemVyby4KKworICBOb3RpY2UgdGhhdCBsd0lQIGltcGxlbWVudHMgYSBmdW5jdGlvbiB3aXRoIGEgc2ltaWxhciBuYW1lLAorICBzeXNfc2VtX3dhaXQoKSwgdGhhdCB1c2VzIHRoZSBzeXNfYXJjaF9zZW1fd2FpdCgpIGZ1bmN0aW9uLgorCistIHN5c19tYm94X3Qgc3lzX21ib3hfbmV3KGludCBzaXplKQorCisgIENyZWF0ZXMgYW4gZW1wdHkgbWFpbGJveCBmb3IgbWF4aW11bSAic2l6ZSIgZWxlbWVudHMuIEVsZW1lbnRzIHN0b3JlZAorICBpbiBtYWlsYm94ZXMgYXJlIHBvaW50ZXJzLiBZb3UgaGF2ZSB0byBkZWZpbmUgbWFjcm9zICJfTUJPWF9TSVpFIgorICBpbiB5b3VyIGx3aXBvcHRzLmgsIG9yIGlnbm9yZSB0aGlzIHBhcmFtZXRlciBpbiB5b3VyIGltcGxlbWVudGF0aW9uCisgIGFuZCB1c2UgYSBkZWZhdWx0IHNpemUuCisKKy0gdm9pZCBzeXNfbWJveF9mcmVlKHN5c19tYm94X3QgbWJveCkKKworICBEZWFsbG9jYXRlcyBhIG1haWxib3guIElmIHRoZXJlIGFyZSBtZXNzYWdlcyBzdGlsbCBwcmVzZW50IGluIHRoZQorICBtYWlsYm94IHdoZW4gdGhlIG1haWxib3ggaXMgZGVhbGxvY2F0ZWQsIGl0IGlzIGFuIGluZGljYXRpb24gb2YgYQorICBwcm9ncmFtbWluZyBlcnJvciBpbiBsd0lQIGFuZCB0aGUgZGV2ZWxvcGVyIHNob3VsZCBiZSBub3RpZmllZC4KKworLSB2b2lkIHN5c19tYm94X3Bvc3Qoc3lzX21ib3hfdCBtYm94LCB2b2lkICptc2cpCisKKyAgUG9zdHMgdGhlICJtc2ciIHRvIHRoZSBtYWlsYm94LiBUaGlzIGZ1bmN0aW9uIGhhdmUgdG8gYmxvY2sgdW50aWwKKyAgdGhlICJtc2ciIGlzIHJlYWxseSBwb3N0ZWQuCisKKy0gZXJyX3Qgc3lzX21ib3hfdHJ5cG9zdChzeXNfbWJveF90IG1ib3gsIHZvaWQgKm1zZykKKworICBUcnkgdG8gcG9zdCB0aGUgIm1zZyIgdG8gdGhlIG1haWxib3guIFJldHVybnMgRVJSX01FTSBpZiB0aGlzIG9uZQorICBpcyBmdWxsLCBlbHNlLCBFUlJfT0sgaWYgdGhlICJtc2ciIGlzIHBvc3RlZC4KKworLSB1MzJfdCBzeXNfYXJjaF9tYm94X2ZldGNoKHN5c19tYm94X3QgbWJveCwgdm9pZCAqKm1zZywgdTMyX3QgdGltZW91dCkKKworICBCbG9ja3MgdGhlIHRocmVhZCB1bnRpbCBhIG1lc3NhZ2UgYXJyaXZlcyBpbiB0aGUgbWFpbGJveCwgYnV0IGRvZXMKKyAgbm90IGJsb2NrIHRoZSB0aHJlYWQgbG9uZ2VyIHRoYW4gInRpbWVvdXQiIG1pbGxpc2Vjb25kcyAoc2ltaWxhciB0bworICB0aGUgc3lzX2FyY2hfc2VtX3dhaXQoKSBmdW5jdGlvbikuIElmICJ0aW1lb3V0IiBpcyAwLCB0aGUgdGhyZWFkIHNob3VsZAorICBiZSBibG9ja2VkIHVudGlsIGEgbWVzc2FnZSBhcnJpdmVzLiBUaGUgIm1zZyIgYXJndW1lbnQgaXMgYSByZXN1bHQKKyAgcGFyYW1ldGVyIHRoYXQgaXMgc2V0IGJ5IHRoZSBmdW5jdGlvbiAoaS5lLiwgYnkgZG9pbmcgIiptc2cgPQorICBwdHIiKS4gVGhlICJtc2ciIHBhcmFtZXRlciBtYXliZSBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlIG1lc3NhZ2UKKyAgc2hvdWxkIGJlIGRyb3BwZWQuCisKKyAgVGhlIHJldHVybiB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgc3lzX2FyY2hfc2VtX3dhaXQoKSBmdW5jdGlvbjoKKyAgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCB3YWl0aW5nIG9yIFNZU19BUkNIX1RJTUVPVVQgaWYgdGhlcmUgd2FzIGEKKyAgdGltZW91dC4KKworICBOb3RlIHRoYXQgYSBmdW5jdGlvbiB3aXRoIGEgc2ltaWxhciBuYW1lLCBzeXNfbWJveF9mZXRjaCgpLCBpcworICBpbXBsZW1lbnRlZCBieSBsd0lQLiAKKworLSB1MzJfdCBzeXNfYXJjaF9tYm94X3RyeWZldGNoKHN5c19tYm94X3QgbWJveCwgdm9pZCAqKm1zZykKKworICBUaGlzIGlzIHNpbWlsYXIgdG8gc3lzX2FyY2hfbWJveF9mZXRjaCwgaG93ZXZlciBpZiBhIG1lc3NhZ2UgaXMgbm90CisgIHByZXNlbnQgaW4gdGhlIG1haWxib3gsIGl0IGltbWVkaWF0ZWx5IHJldHVybnMgd2l0aCB0aGUgY29kZQorICBTWVNfTUJPWF9FTVBUWS4gT24gc3VjY2VzcyAwIGlzIHJldHVybmVkLgorCisgIFRvIGFsbG93IGZvciBlZmZpY2llbnQgaW1wbGVtZW50YXRpb25zLCB0aGlzIGNhbiBiZSBkZWZpbmVkIGFzIGEKKyAgZnVuY3Rpb24tbGlrZSBtYWNybyBpbiBzeXNfYXJjaC5oIGluc3RlYWQgb2YgYSBub3JtYWwgZnVuY3Rpb24uIEZvcgorICBleGFtcGxlLCBhIG5haXZlIGltcGxlbWVudGF0aW9uIGNvdWxkIGJlOgorICAgICNkZWZpbmUgc3lzX2FyY2hfbWJveF90cnlmZXRjaChtYm94LG1zZykgXAorICAgICAgc3lzX2FyY2hfbWJveF9mZXRjaChtYm94LG1zZywxKQorICBhbHRob3VnaCB0aGlzIHdvdWxkIGludHJvZHVjZSB1bm5lY2Vzc2FyeSBkZWxheXMuCisgIAorSWYgdGhyZWFkcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0gYW5kIGlmCitzdWNoIGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkIGluIGx3SVAsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gd2lsbCBoYXZlCit0byBiZSBpbXBsZW1lbnRlZCBhcyB3ZWxsOgorCistIHN5c190aHJlYWRfdCBzeXNfdGhyZWFkX25ldyhjaGFyICpuYW1lLCB2b2lkICgqIHRocmVhZCkodm9pZCAqYXJnKSwgdm9pZCAqYXJnLCBpbnQgc3RhY2tzaXplLCBpbnQgcHJpbykKKworICBTdGFydHMgYSBuZXcgdGhyZWFkIG5hbWVkICJuYW1lIiB3aXRoIHByaW9yaXR5ICJwcmlvIiB0aGF0IHdpbGwgYmVnaW4gaXRzCisgIGV4ZWN1dGlvbiBpbiB0aGUgZnVuY3Rpb24gInRocmVhZCgpIi4gVGhlICJhcmciIGFyZ3VtZW50IHdpbGwgYmUgcGFzc2VkIGFzIGFuCisgIGFyZ3VtZW50IHRvIHRoZSB0aHJlYWQoKSBmdW5jdGlvbi4gVGhlIHN0YWNrIHNpemUgdG8gdXNlZCBmb3IgdGhpcyB0aHJlYWQgaXMKKyAgdGhlICJzdGFja3NpemUiIHBhcmFtZXRlci4gVGhlIGlkIG9mIHRoZSBuZXcgdGhyZWFkIGlzIHJldHVybmVkLiBCb3RoIHRoZSBpZAorICBhbmQgdGhlIHByaW9yaXR5IGFyZSBzeXN0ZW0gZGVwZW5kZW50LgorCistIHN5c19wcm90X3Qgc3lzX2FyY2hfcHJvdGVjdCh2b2lkKQorCisgIFRoaXMgb3B0aW9uYWwgZnVuY3Rpb24gZG9lcyBhICJmYXN0IiBjcml0aWNhbCByZWdpb24gcHJvdGVjdGlvbiBhbmQgcmV0dXJucworICB0aGUgcHJldmlvdXMgcHJvdGVjdGlvbiBsZXZlbC4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBkdXJpbmcgdmVyeSBzaG9ydAorICBjcml0aWNhbCByZWdpb25zLiBBbiBlbWJlZGRlZCBzeXN0ZW0gd2hpY2ggc3VwcG9ydHMgSVNSLWJhc2VkIGRyaXZlcnMgbWlnaHQKKyAgd2FudCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBieSBkaXNhYmxpbmcgaW50ZXJydXB0cy4gVGFzay1iYXNlZCBzeXN0ZW1zCisgIG1pZ2h0IHdhbnQgdG8gaW1wbGVtZW50IHRoaXMgYnkgdXNpbmcgYSBtdXRleCBvciBkaXNhYmxpbmcgdGFza2luZy4gVGhpcworICBmdW5jdGlvbiBzaG91bGQgc3VwcG9ydCByZWN1cnNpdmUgY2FsbHMgZnJvbSB0aGUgc2FtZSB0YXNrIG9yIGludGVycnVwdC4gSW4KKyAgb3RoZXIgd29yZHMsIHN5c19hcmNoX3Byb3RlY3QoKSBjb3VsZCBiZSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBwcm90ZWN0ZWQuIEluCisgIHRoYXQgY2FzZSB0aGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGF0IGl0IGlzIGFscmVhZHkgcHJvdGVjdGVkLgorCisgIHN5c19hcmNoX3Byb3RlY3QoKSBpcyBvbmx5IHJlcXVpcmVkIGlmIHlvdXIgcG9ydCBpcyBzdXBwb3J0aW5nIGFuIG9wZXJhdGluZworICBzeXN0ZW0uCisKKy0gdm9pZCBzeXNfYXJjaF91bnByb3RlY3Qoc3lzX3Byb3RfdCBwdmFsKQorCisgIFRoaXMgb3B0aW9uYWwgZnVuY3Rpb24gZG9lcyBhICJmYXN0IiBzZXQgb2YgY3JpdGljYWwgcmVnaW9uIHByb3RlY3Rpb24gdG8gdGhlCisgIHZhbHVlIHNwZWNpZmllZCBieSBwdmFsLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHN5c19hcmNoX3Byb3RlY3QoKSBmb3IKKyAgbW9yZSBpbmZvcm1hdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHJlcXVpcmVkIGlmIHlvdXIgcG9ydCBpcyBzdXBwb3J0aW5nCisgIGFuIG9wZXJhdGluZyBzeXN0ZW0uCisKK05vdGU6CisKK0JlIGNhcmVmdWxsIHdpdGggdXNpbmcgbWVtX21hbGxvYygpIGluIHN5c19hcmNoLiBXaGVuIG1hbGxvYygpIHJlZmVycyB0bworbWVtX21hbGxvYygpIHlvdSBjYW4gcnVuIGludG8gYSBjaXJjdWxhciBmdW5jdGlvbiBjYWxsIHByb2JsZW0uIEluIG1lbS5jCitsd2lwX21lbV9pbml0KCkgdHJpZXMgdG8gYWxsY2F0ZSBhIHNlbWFwaG9yZSB1c2luZyBtZW1fbWFsbG9jLCB3aGljaCBvZiBjb3Vyc2UKK2Nhbid0IGJlIHBlcmZvcm1lZCB3aGVuIHN5c19hcmNoIHVzZXMgbWVtX21hbGxvYy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWRkaXRpb25hbCBmaWxlcyByZXF1aXJlZCBmb3IgdGhlICJPUyBzdXBwb3J0IiBlbXVsYXRpb24gbGF5ZXI6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NjLmggICAgICAgLSBBcmNoaXRlY3R1cmUgZW52aXJvbm1lbnQsIHNvbWUgY29tcGlsZXIgc3BlY2lmaWMsIHNvbWUKKyAgICAgICAgICAgICBlbnZpcm9ubWVudCBzcGVjaWZpYyAocHJvYmFibHkgc2hvdWxkIG1vdmUgZW52IHN0dWZmIAorICAgICAgICAgICAgIHRvIHN5c19hcmNoLmguKQorCisgIFR5cGVkZWZzIGZvciB0aGUgdHlwZXMgdXNlZCBieSBsd2lwIC0KKyAgICB1OF90LCBzOF90LCB1MTZfdCwgczE2X3QsIHUzMl90LCBzMzJfdCwgbWVtX3B0cl90CisKKyAgQ29tcGlsZXIgaGludHMgZm9yIHBhY2tpbmcgbHdpcCdzIHN0cnVjdHVyZXMgLQorICAgIFBBQ0tfU1RSVUNUX0ZJRUxEKHgpCisgICAgUEFDS19TVFJVQ1RfU1RSVUNUCisgICAgUEFDS19TVFJVQ1RfQkVHSU4KKyAgICBQQUNLX1NUUlVDVF9FTkQKKworICBQbGF0Zm9ybSBzcGVjaWZpYyBkaWFnbm9zdGljIG91dHB1dCAtCisgICAgTFdJUF9QTEFURk9STV9ESUFHKHgpICAgIC0gbm9uLWZhdGFsLCBwcmludCBhIG1lc3NhZ2UuCisgICAgTFdJUF9QTEFURk9STV9BU1NFUlQoeCkgIC0gZmF0YWwsIHByaW50IG1lc3NhZ2UgYW5kIGFiYW5kb24gZXhlY3V0aW9uLgorICAgIFBvcnRhYmlsaXR5IGRlZmluZXMgZm9yIHByaW50ZiBmb3JtYXR0ZXJzOgorICAgIFUxNl9GLCBTMTZfRiwgWDE2X0YsIFUzMl9GLCBTMzJfRiwgWDMyX0YsIFNaVF9GCisKKyAgImxpZ2h0d2VpZ2h0IiBzeW5jaHJvbml6YXRpb24gbWVjaGFuaXNtcyAtCisgICAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKHgpIC0gZGVjbGFyZSBhIHByb3RlY3Rpb24gc3RhdGUgdmFyaWFibGUuCisgICAgU1lTX0FSQ0hfUFJPVEVDVCh4KSAgICAgIC0gZW50ZXIgcHJvdGVjdGlvbiBtb2RlLgorICAgIFNZU19BUkNIX1VOUFJPVEVDVCh4KSAgICAtIGxlYXZlIHByb3RlY3Rpb24gbW9kZS4KKworICBJZiB0aGUgY29tcGlsZXIgZG9lcyBub3QgcHJvdmlkZSBtZW1zZXQoKSB0aGlzIGZpbGUgbXVzdCBpbmNsdWRlIGEKKyAgZGVmaW5pdGlvbiBvZiBpdCwgb3IgaW5jbHVkZSBhIGZpbGUgd2hpY2ggZGVmaW5lcyBpdC4KKworICBUaGlzIGZpbGUgbXVzdCBlaXRoZXIgaW5jbHVkZSBhIHN5c3RlbS1sb2NhbCA8ZXJybm8uaD4gd2hpY2ggZGVmaW5lcworICB0aGUgc3RhbmRhcmQgKm5peCBlcnJvciBjb2Rlcywgb3IgaXQgc2hvdWxkICNkZWZpbmUgTFdJUF9QUk9WSURFX0VSUk5PCisgIHRvIG1ha2UgbHdpcC9hcmNoLmggZGVmaW5lIHRoZSBjb2RlcyB3aGljaCBhcmUgdXNlZCB0aHJvdWdob3V0LgorCisKK3BlcmYuaCAgICAgLSBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQuCisgIE1lYXN1cmVtZW50IGNhbGxzIG1hZGUgdGhyb3VnaG91dCBsd2lwLCB0aGVzZSBjYW4gYmUgZGVmaW5lZCB0byBub3RoaW5nLgorICAgIFBFUkZfU1RBUlQgICAgICAgICAgICAgICAtIHN0YXJ0IG1lYXN1cmluZyBzb21ldGhpbmcuCisgICAgUEVSRl9TVE9QKHgpICAgICAgICAgICAgIC0gc3RvcCBtZWFzdXJpbmcgc29tZXRoaW5nLCBhbmQgcmVjb3JkIHRoZSByZXN1bHQuCisKK3N5c19hcmNoLmggLSBUaWVkIHRvIHN5c19hcmNoLmMKKworICBBcmNoIGRlcGVuZGVudCB0eXBlcyBmb3IgdGhlIGZvbGxvd2luZyBvYmplY3RzOgorICAgIHN5c19zZW1fdCwgc3lzX21ib3hfdCwgc3lzX3RocmVhZF90LAorICBBbmQsIG9wdGlvbmFsbHk6CisgICAgc3lzX3Byb3RfdAorCisgIERlZmluZXMgdG8gc2V0IHZhcnMgb2Ygc3lzX21ib3hfdCBhbmQgc3lzX3NlbV90IHRvIE5VTEwuCisgICAgU1lTX01CT1hfTlVMTCBOVUxMCisgICAgU1lTX1NFTV9OVUxMIE5VTEwKZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvRklMRVMgYi9jb3JlL2x3aXAvc3JjL0ZJTEVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmFlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL0ZJTEVTCkBAIC0wLDAgKzEsMTMgQEAKK2FwaS8gICAgICAtIFRoZSBjb2RlIGZvciB0aGUgaGlnaC1sZXZlbCB3cmFwcGVyIEFQSS4gTm90IG5lZWRlZCBpZgorICAgICAgICAgICAgeW91IHVzZSB0aGUgbG93ZWwtbGV2ZWwgY2FsbC1iYWNrL3JhdyBBUEkuCisKK2NvcmUvICAgICAtIFRoZSBjb3JlIG9mIHRoZSBUUEMvSVAgc3RhY2s7IHByb3RvY29sIGltcGxlbWVudGF0aW9ucywKKyAgICAgICAgICAgIG1lbW9yeSBhbmQgYnVmZmVyIG1hbmFnZW1lbnQsIGFuZCB0aGUgbG93LWxldmVsIHJhdyBBUEkuCisKK2luY2x1ZGUvICAtIGx3SVAgaW5jbHVkZSBmaWxlcy4KKworbmV0aWYvICAgIC0gR2VuZXJpYyBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2UgZHJpdmVycyBhcmUga2VwdCBoZXJlLAorICAgICAgICAgICAgYXMgd2VsbCBhcyB0aGUgQVJQIG1vZHVsZS4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHZhcmlvdXMgc3ViZGlyZWN0b3JpZXMsIGNoZWNrIHRoZSBGSUxFUworZmlsZSBpbiBlYWNoIGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvYXBpL2FwaV9saWIuYyBiL2NvcmUvbHdpcC9zcmMvYXBpL2FwaV9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWE5ZTUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9hcGkvYXBpX2xpYi5jCkBAIC0wLDAgKzEsNzQwIEBACisvKioKKyAqIEBmaWxlCisgKiBTZXF1ZW50aWFsIEFQSSBFeHRlcm5hbCBtb2R1bGUKKyAqCisgKi8KKyAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKy8qIFRoaXMgaXMgdGhlIHBhcnQgb2YgdGhlIEFQSSB0aGF0IGlzIGxpbmtlZCB3aXRoCisgICB0aGUgYXBwbGljYXRpb24gKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX05FVENPTk4gLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL2FwaS5oIgorI2luY2x1ZGUgImx3aXAvdGNwaXAuaCIKKyNpbmNsdWRlICJsd2lwL21lbXAuaCIKKworI2luY2x1ZGUgImx3aXAvaXAuaCIKKyNpbmNsdWRlICJsd2lwL3Jhdy5oIgorI2luY2x1ZGUgImx3aXAvdWRwLmgiCisjaW5jbHVkZSAibHdpcC90Y3AuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBuZXRjb25uIChvZiBhIHNwZWNpZmljIHR5cGUpIHRoYXQgaGFzIGEgY2FsbGJhY2sgZnVuY3Rpb24uCisgKiBUaGUgY29ycmVzcG9uZGluZyBwY2IgaXMgYWxzbyBjcmVhdGVkLgorICoKKyAqIEBwYXJhbSB0IHRoZSB0eXBlIG9mICdjb25uZWN0aW9uJyB0byBjcmVhdGUgKEBzZWUgZW51bSBuZXRjb25uX3R5cGUpCisgKiBAcGFyYW0gcHJvdG8gdGhlIElQIHByb3RvY29sIGZvciBSQVcgSVAgcGNicworICogQHBhcmFtIGNhbGxiYWNrIGEgZnVuY3Rpb24gdG8gY2FsbCBvbiBzdGF0dXMgY2hhbmdlcyAoUlggYXZhaWxhYmxlLCBUWCdlZCkKKyAqIEByZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgc3RydWN0IG5ldGNvbm4gb3IKKyAqICAgICAgICAgTlVMTCBvbiBtZW1vcnkgZXJyb3IKKyAqLworc3RydWN0IG5ldGNvbm4qCituZXRjb25uX25ld193aXRoX3Byb3RvX2FuZF9jYWxsYmFjayhlbnVtIG5ldGNvbm5fdHlwZSB0LCB1OF90IHByb3RvLCBuZXRjb25uX2NhbGxiYWNrIGNhbGxiYWNrKQoreworICBzdHJ1Y3QgbmV0Y29ubiAqY29ubjsKKyAgc3RydWN0IGFwaV9tc2cgbXNnOworCisgIGNvbm4gPSBuZXRjb25uX2FsbG9jKHQsIGNhbGxiYWNrKTsKKyAgaWYgKGNvbm4gIT0gTlVMTCkgeworICAgIG1zZy5mdW5jdGlvbiA9IGRvX25ld2Nvbm47CisgICAgbXNnLm1zZy5tc2cubi5wcm90byA9IHByb3RvOworICAgIG1zZy5tc2cuY29ubiA9IGNvbm47CisgICAgaWYgKFRDUElQX0FQSU1TRygmbXNnKSAhPSBFUlJfT0spIHsKKyAgICAgIExXSVBfQVNTRVJUKCJmcmVlaW5nIGNvbm4gd2l0aG91dCBmcmVlaW5nIHBjYiIsIGNvbm4tPnBjYi50Y3AgPT0gTlVMTCk7CisgICAgICBMV0lQX0FTU0VSVCgiY29ubiBoYXMgbm8gb3BfY29tcGxldGVkIiwgc3lzX3NlbV92YWxpZCgmY29ubi0+b3BfY29tcGxldGVkKSk7CisgICAgICBMV0lQX0FTU0VSVCgiY29ubiBoYXMgbm8gcmVjdm1ib3giLCBzeXNfbWJveF92YWxpZCgmY29ubi0+cmVjdm1ib3gpKTsKKyNpZiBMV0lQX1RDUAorICAgICAgTFdJUF9BU1NFUlQoImNvbm4tPmFjY2VwdG1ib3ggc2hvdWxkbid0IGV4aXN0IiwgIXN5c19tYm94X3ZhbGlkKCZjb25uLT5hY2NlcHRtYm94KSk7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKyAgICAgIHN5c19zZW1fZnJlZSgmY29ubi0+b3BfY29tcGxldGVkKTsKKyAgICAgIHN5c19tYm94X2ZyZWUoJmNvbm4tPnJlY3ZtYm94KTsKKyAgICAgIG1lbXBfZnJlZShNRU1QX05FVENPTk4sIGNvbm4pOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIHJldHVybiBjb25uOworfQorCisvKioKKyAqIENsb3NlIGEgbmV0Y29ubiAnY29ubmVjdGlvbicgYW5kIGZyZWUgaXRzIHJlc291cmNlcy4KKyAqIFVEUCBhbmQgUkFXIGNvbm5lY3Rpb24gYXJlIGNvbXBsZXRlbHkgY2xvc2VkLCBUQ1AgcGNicyBtaWdodCBzdGlsbCBiZSBpbiBhIHdhaXRzdGF0ZQorICogYWZ0ZXIgdGhpcyByZXR1cm5zLgorICoKKyAqIEBwYXJhbSBjb25uIHRoZSBuZXRjb25uIHRvIGRlbGV0ZQorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGRlbGV0ZWQKKyAqLworZXJyX3QKK25ldGNvbm5fZGVsZXRlKHN0cnVjdCBuZXRjb25uICpjb25uKQoreworICBzdHJ1Y3QgYXBpX21zZyBtc2c7CisKKyAgLyogTm8gQVNTRVJUIGhlcmUgYmVjYXVzZSBwb3NzaWJsZSB0byBnZXQgYSAoY29ubiA9PSBOVUxMKSBpZiB3ZSBnb3QgYW4gYWNjZXB0IGVycm9yICovCisgIGlmIChjb25uID09IE5VTEwpIHsKKyAgICByZXR1cm4gRVJSX09LOworICB9CisKKyAgbXNnLmZ1bmN0aW9uID0gZG9fZGVsY29ubjsKKyAgbXNnLm1zZy5jb25uID0gY29ubjsKKyAgdGNwaXBfYXBpbXNnKCZtc2cpOworCisgIG5ldGNvbm5fZnJlZShjb25uKTsKKworICAvKiBkb24ndCBjYXJlIGZvciByZXR1cm4gdmFsdWUgb2YgZG9fZGVsY29ubiBzaW5jZSBpdCBvbmx5IGNhbGxzIHZvaWQgZnVuY3Rpb25zICovCisKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBHZXQgdGhlIGxvY2FsIG9yIHJlbW90ZSBJUCBhZGRyZXNzIGFuZCBwb3J0IG9mIGEgbmV0Y29ubi4KKyAqIEZvciBSQVcgbmV0Y29ubnMsIHRoaXMgcmV0dXJucyB0aGUgcHJvdG9jb2wgaW5zdGVhZCBvZiBhIHBvcnQhCisgKgorICogQHBhcmFtIGNvbm4gdGhlIG5ldGNvbm4gdG8gcXVlcnkKKyAqIEBwYXJhbSBhZGRyIGEgcG9pbnRlciB0byB3aGljaCB0byBzYXZlIHRoZSBJUCBhZGRyZXNzCisgKiBAcGFyYW0gcG9ydCBhIHBvaW50ZXIgdG8gd2hpY2ggdG8gc2F2ZSB0aGUgcG9ydCAob3IgcHJvdG9jb2wgZm9yIFJBVykKKyAqIEBwYXJhbSBsb2NhbCAxIHRvIGdldCB0aGUgbG9jYWwgSVAgYWRkcmVzcywgMCB0byBnZXQgdGhlIHJlbW90ZSBvbmUKKyAqIEByZXR1cm4gRVJSX0NPTk4gZm9yIGludmFsaWQgY29ubmVjdGlvbnMKKyAqICAgICAgICAgRVJSX09LIGlmIHRoZSBpbmZvcm1hdGlvbiB3YXMgcmV0cmlldmVkCisgKi8KK2Vycl90CituZXRjb25uX2dldGFkZHIoc3RydWN0IG5ldGNvbm4gKmNvbm4sIGlwX2FkZHJfdCAqYWRkciwgdTE2X3QgKnBvcnQsIHU4X3QgbG9jYWwpCit7CisgIHN0cnVjdCBhcGlfbXNnIG1zZzsKKyAgZXJyX3QgZXJyOworCisgIExXSVBfRVJST1IoIm5ldGNvbm5fZ2V0YWRkcjogaW52YWxpZCBjb25uIiwgKGNvbm4gIT0gTlVMTCksIHJldHVybiBFUlJfQVJHOyk7CisgIExXSVBfRVJST1IoIm5ldGNvbm5fZ2V0YWRkcjogaW52YWxpZCBhZGRyIiwgKGFkZHIgIT0gTlVMTCksIHJldHVybiBFUlJfQVJHOyk7CisgIExXSVBfRVJST1IoIm5ldGNvbm5fZ2V0YWRkcjogaW52YWxpZCBwb3J0IiwgKHBvcnQgIT0gTlVMTCksIHJldHVybiBFUlJfQVJHOyk7CisKKyAgbXNnLmZ1bmN0aW9uID0gZG9fZ2V0YWRkcjsKKyAgbXNnLm1zZy5jb25uID0gY29ubjsKKyAgbXNnLm1zZy5tc2cuYWQuaXBhZGRyID0gYWRkcjsKKyAgbXNnLm1zZy5tc2cuYWQucG9ydCA9IHBvcnQ7CisgIG1zZy5tc2cubXNnLmFkLmxvY2FsID0gbG9jYWw7CisgIGVyciA9IFRDUElQX0FQSU1TRygmbXNnKTsKKworICBORVRDT05OX1NFVF9TQUZFX0VSUihjb25uLCBlcnIpOworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIEJpbmQgYSBuZXRjb25uIHRvIGEgc3BlY2lmaWMgbG9jYWwgSVAgYWRkcmVzcyBhbmQgcG9ydC4KKyAqIEJpbmRpbmcgb25lIG5ldGNvbm4gdHdpY2UgbWlnaHQgbm90IGFsd2F5cyBiZSBjaGVja2VkIGNvcnJlY3RseSEKKyAqCisgKiBAcGFyYW0gY29ubiB0aGUgbmV0Y29ubiB0byBiaW5kCisgKiBAcGFyYW0gYWRkciB0aGUgbG9jYWwgSVAgYWRkcmVzcyB0byBiaW5kIHRoZSBuZXRjb25uIHRvICh1c2UgSVBfQUREUl9BTlkKKyAqICAgICAgICAgICAgIHRvIGJpbmQgdG8gYWxsIGFkZHJlc3NlcykKKyAqIEBwYXJhbSBwb3J0IHRoZSBsb2NhbCBwb3J0IHRvIGJpbmQgdGhlIG5ldGNvbm4gdG8gKG5vdCB1c2VkIGZvciBSQVcpCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBib3VuZCwgYW55IG90aGVyIGVycl90IG9uIGZhaWx1cmUKKyAqLworZXJyX3QKK25ldGNvbm5fYmluZChzdHJ1Y3QgbmV0Y29ubiAqY29ubiwgaXBfYWRkcl90ICphZGRyLCB1MTZfdCBwb3J0KQoreworICBzdHJ1Y3QgYXBpX21zZyBtc2c7CisgIGVycl90IGVycjsKKworICBMV0lQX0VSUk9SKCJuZXRjb25uX2JpbmQ6IGludmFsaWQgY29ubiIsIChjb25uICE9IE5VTEwpLCByZXR1cm4gRVJSX0FSRzspOworCisgIG1zZy5mdW5jdGlvbiA9IGRvX2JpbmQ7CisgIG1zZy5tc2cuY29ubiA9IGNvbm47CisgIG1zZy5tc2cubXNnLmJjLmlwYWRkciA9IGFkZHI7CisgIG1zZy5tc2cubXNnLmJjLnBvcnQgPSBwb3J0OworICBlcnIgPSBUQ1BJUF9BUElNU0coJm1zZyk7CisKKyAgTkVUQ09OTl9TRVRfU0FGRV9FUlIoY29ubiwgZXJyKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBDb25uZWN0IGEgbmV0Y29ubiB0byBhIHNwZWNpZmljIHJlbW90ZSBJUCBhZGRyZXNzIGFuZCBwb3J0LgorICoKKyAqIEBwYXJhbSBjb25uIHRoZSBuZXRjb25uIHRvIGNvbm5lY3QKKyAqIEBwYXJhbSBhZGRyIHRoZSByZW1vdGUgSVAgYWRkcmVzcyB0byBjb25uZWN0IHRvCisgKiBAcGFyYW0gcG9ydCB0aGUgcmVtb3RlIHBvcnQgdG8gY29ubmVjdCB0byAobm8gdXNlZCBmb3IgUkFXKQorICogQHJldHVybiBFUlJfT0sgaWYgY29ubmVjdGVkLCByZXR1cm4gdmFsdWUgb2YgdGNwXy91ZHBfL3Jhd19jb25uZWN0IG90aGVyd2lzZQorICovCitlcnJfdAorbmV0Y29ubl9jb25uZWN0KHN0cnVjdCBuZXRjb25uICpjb25uLCBpcF9hZGRyX3QgKmFkZHIsIHUxNl90IHBvcnQpCit7CisgIHN0cnVjdCBhcGlfbXNnIG1zZzsKKyAgZXJyX3QgZXJyOworCisgIExXSVBfRVJST1IoIm5ldGNvbm5fY29ubmVjdDogaW52YWxpZCBjb25uIiwgKGNvbm4gIT0gTlVMTCksIHJldHVybiBFUlJfQVJHOyk7CisKKyAgbXNnLmZ1bmN0aW9uID0gZG9fY29ubmVjdDsKKyAgbXNnLm1zZy5jb25uID0gY29ubjsKKyAgbXNnLm1zZy5tc2cuYmMuaXBhZGRyID0gYWRkcjsKKyAgbXNnLm1zZy5tc2cuYmMucG9ydCA9IHBvcnQ7CisgIC8qIFRoaXMgaXMgdGhlIG9ubHkgZnVuY3Rpb24gd2hpY2ggbmVlZCB0byBub3QgYmxvY2sgdGNwaXBfdGhyZWFkICovCisgIGVyciA9IHRjcGlwX2FwaW1zZygmbXNnKTsKKworICBORVRDT05OX1NFVF9TQUZFX0VSUihjb25uLCBlcnIpOworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIERpc2Nvbm5lY3QgYSBuZXRjb25uIGZyb20gaXRzIGN1cnJlbnQgcGVlciAob25seSB2YWxpZCBmb3IgVURQIG5ldGNvbm5zKS4KKyAqCisgKiBAcGFyYW0gY29ubiB0aGUgbmV0Y29ubiB0byBkaXNjb25uZWN0CisgKiBAcmV0dXJuIFRPRE86IHJldHVybiB2YWx1ZSBpcyBub3Qgc2V0IGhlcmUuLi4KKyAqLworZXJyX3QKK25ldGNvbm5fZGlzY29ubmVjdChzdHJ1Y3QgbmV0Y29ubiAqY29ubikKK3sKKyAgc3RydWN0IGFwaV9tc2cgbXNnOworICBlcnJfdCBlcnI7CisKKyAgTFdJUF9FUlJPUigibmV0Y29ubl9kaXNjb25uZWN0OiBpbnZhbGlkIGNvbm4iLCAoY29ubiAhPSBOVUxMKSwgcmV0dXJuIEVSUl9BUkc7KTsKKworICBtc2cuZnVuY3Rpb24gPSBkb19kaXNjb25uZWN0OworICBtc2cubXNnLmNvbm4gPSBjb25uOworICBlcnIgPSBUQ1BJUF9BUElNU0coJm1zZyk7CisKKyAgTkVUQ09OTl9TRVRfU0FGRV9FUlIoY29ubiwgZXJyKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBTZXQgYSBUQ1AgbmV0Y29ubiBpbnRvIGxpc3RlbiBtb2RlCisgKgorICogQHBhcmFtIGNvbm4gdGhlIHRjcCBuZXRjb25uIHRvIHNldCB0byBsaXN0ZW4gbW9kZQorICogQHBhcmFtIGJhY2tsb2cgdGhlIGxpc3RlbiBiYWNrbG9nLCBvbmx5IHVzZWQgaWYgVENQX0xJU1RFTl9CQUNLTE9HPT0xCisgKiBAcmV0dXJuIEVSUl9PSyBpZiB0aGUgbmV0Y29ubiB3YXMgc2V0IHRvIGxpc3RlbiAoVURQIGFuZCBSQVcgbmV0Y29ubnMKKyAqICAgICAgICAgZG9uJ3QgcmV0dXJuIGFueSBlcnJvciAoeWV0PykpCisgKi8KK2Vycl90CituZXRjb25uX2xpc3Rlbl93aXRoX2JhY2tsb2coc3RydWN0IG5ldGNvbm4gKmNvbm4sIHU4X3QgYmFja2xvZykKK3sKKyNpZiBMV0lQX1RDUAorICBzdHJ1Y3QgYXBpX21zZyBtc2c7CisgIGVycl90IGVycjsKKworICAvKiBUaGlzIGRvZXMgbm8gaGFybS4gSWYgVENQX0xJU1RFTl9CQUNLTE9HIGlzIG9mZiwgYmFja2xvZyBpcyB1bnVzZWQuICovCisgIExXSVBfVU5VU0VEX0FSRyhiYWNrbG9nKTsKKworICBMV0lQX0VSUk9SKCJuZXRjb25uX2xpc3RlbjogaW52YWxpZCBjb25uIiwgKGNvbm4gIT0gTlVMTCksIHJldHVybiBFUlJfQVJHOyk7CisKKyAgbXNnLmZ1bmN0aW9uID0gZG9fbGlzdGVuOworICBtc2cubXNnLmNvbm4gPSBjb25uOworI2lmIFRDUF9MSVNURU5fQkFDS0xPRworICBtc2cubXNnLm1zZy5sYi5iYWNrbG9nID0gYmFja2xvZzsKKyNlbmRpZiAvKiBUQ1BfTElTVEVOX0JBQ0tMT0cgKi8KKyAgZXJyID0gVENQSVBfQVBJTVNHKCZtc2cpOworCisgIE5FVENPTk5fU0VUX1NBRkVfRVJSKGNvbm4sIGVycik7CisgIHJldHVybiBlcnI7CisjZWxzZSAvKiBMV0lQX1RDUCAqLworICBMV0lQX1VOVVNFRF9BUkcoY29ubik7CisgIExXSVBfVU5VU0VEX0FSRyhiYWNrbG9nKTsKKyAgcmV0dXJuIEVSUl9BUkc7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KK30KKworLyoqCisgKiBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbiBvbiBhIFRDUCBsaXN0ZW5pbmcgbmV0Y29ubi4KKyAqCisgKiBAcGFyYW0gY29ubiB0aGUgVENQIGxpc3RlbiBuZXRjb25uCisgKiBAcGFyYW0gbmV3X2Nvbm4gcG9pbnRlciB3aGVyZSB0aGUgbmV3IGNvbm5lY3Rpb24gaXMgc3RvcmVkCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBhIG5ldyBjb25uZWN0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIG9yIGFuIGVycm9yCisgKiAgICAgICAgICAgICAgICBjb2RlIG90aGVyd2lzZQorICovCitlcnJfdAorbmV0Y29ubl9hY2NlcHQoc3RydWN0IG5ldGNvbm4gKmNvbm4sIHN0cnVjdCBuZXRjb25uICoqbmV3X2Nvbm4pCit7CisjaWYgTFdJUF9UQ1AKKyAgc3RydWN0IG5ldGNvbm4gKm5ld2Nvbm47CisgIGVycl90IGVycjsKKyNpZiBUQ1BfTElTVEVOX0JBQ0tMT0cKKyAgc3RydWN0IGFwaV9tc2cgbXNnOworI2VuZGlmIC8qIFRDUF9MSVNURU5fQkFDS0xPRyAqLworCisgIExXSVBfRVJST1IoIm5ldGNvbm5fYWNjZXB0OiBpbnZhbGlkIHBvaW50ZXIiLCAgICAobmV3X2Nvbm4gIT0gTlVMTCksICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9BUkc7KTsKKyAgKm5ld19jb25uID0gTlVMTDsKKyAgTFdJUF9FUlJPUigibmV0Y29ubl9hY2NlcHQ6IGludmFsaWQgY29ubiIsICAgICAgIChjb25uICE9IE5VTEwpLCAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJSX0FSRzspOworICBMV0lQX0VSUk9SKCJuZXRjb25uX2FjY2VwdDogaW52YWxpZCBhY2NlcHRtYm94Iiwgc3lzX21ib3hfdmFsaWQoJmNvbm4tPmFjY2VwdG1ib3gpLCAgIHJldHVybiBFUlJfQVJHOyk7CisKKyAgZXJyID0gY29ubi0+bGFzdF9lcnI7CisgIGlmIChFUlJfSVNfRkFUQUwoZXJyKSkgeworICAgIC8qIGRvbid0IHJlY3Ygb24gZmF0YWwgZXJyb3JzOiB0aGlzIG1pZ2h0IGJsb2NrIHRoZSBhcHBsaWNhdGlvbiB0YXNrCisgICAgICAgd2FpdGluZyBvbiBhY2NlcHRtYm94IGZvcmV2ZXIhICovCisgICAgcmV0dXJuIGVycjsKKyAgfQorCisjaWYgTFdJUF9TT19SQ1ZUSU1FTworICBpZiAoc3lzX2FyY2hfbWJveF9mZXRjaCgmY29ubi0+YWNjZXB0bWJveCwgKHZvaWQgKiopJm5ld2Nvbm4sIGNvbm4tPnJlY3ZfdGltZW91dCkgPT0gU1lTX0FSQ0hfVElNRU9VVCkgeworICAgIE5FVENPTk5fU0VUX1NBRkVfRVJSKGNvbm4sIEVSUl9USU1FT1VUKTsKKyAgICByZXR1cm4gRVJSX1RJTUVPVVQ7CisgIH0KKyNlbHNlCisgIHN5c19hcmNoX21ib3hfZmV0Y2goJmNvbm4tPmFjY2VwdG1ib3gsICh2b2lkICoqKSZuZXdjb25uLCAwKTsKKyNlbmRpZiAvKiBMV0lQX1NPX1JDVlRJTUVPKi8KKyAgLyogUmVnaXN0ZXIgZXZlbnQgd2l0aCBjYWxsYmFjayAqLworICBBUElfRVZFTlQoY29ubiwgTkVUQ09OTl9FVlRfUkNWTUlOVVMsIDApOworCisgIGlmIChuZXdjb25uID09IE5VTEwpIHsKKyAgICAvKiBjb25uZWN0aW9uIGhhcyBiZWVuIGFib3J0ZWQgKi8KKyAgICBORVRDT05OX1NFVF9TQUZFX0VSUihjb25uLCBFUlJfQUJSVCk7CisgICAgcmV0dXJuIEVSUl9BQlJUOworICB9CisjaWYgVENQX0xJU1RFTl9CQUNLTE9HCisgIC8qIExldCB0aGUgc3RhY2sga25vdyB0aGF0IHdlIGhhdmUgYWNjZXB0ZWQgdGhlIGNvbm5lY3Rpb24uICovCisgIG1zZy5mdW5jdGlvbiA9IGRvX3JlY3Y7CisgIG1zZy5tc2cuY29ubiA9IGNvbm47CisgIC8qIGRvbid0IGNhcmUgZm9yIHRoZSByZXR1cm4gdmFsdWUgb2YgZG9fcmVjdiAqLworICBUQ1BJUF9BUElNU0coJm1zZyk7CisjZW5kaWYgLyogVENQX0xJU1RFTl9CQUNLTE9HICovCisKKyAgKm5ld19jb25uID0gbmV3Y29ubjsKKyAgLyogZG9uJ3Qgc2V0IGNvbm4tPmxhc3RfZXJyOiBpdCdzIG9ubHkgRVJSX09LLCBhbnl3YXkgKi8KKyAgcmV0dXJuIEVSUl9PSzsKKyNlbHNlIC8qIExXSVBfVENQICovCisgIExXSVBfVU5VU0VEX0FSRyhjb25uKTsKKyAgTFdJUF9VTlVTRURfQVJHKG5ld19jb25uKTsKKyAgcmV0dXJuIEVSUl9BUkc7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KK30KKworLyoqCisgKiBSZWNlaXZlIGRhdGE6IGFjdHVhbCBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXNuJ3QgY2FyZSB3aGV0aGVyIHBidWYgb3IgbmV0YnVmCisgKiBpcyByZWNlaXZlZAorICoKKyAqIEBwYXJhbSBjb25uIHRoZSBuZXRjb25uIGZyb20gd2hpY2ggdG8gcmVjZWl2ZSBkYXRhCisgKiBAcGFyYW0gbmV3X2J1ZiBwb2ludGVyIHdoZXJlIGEgbmV3IHBidWYvbmV0YnVmIGlzIHN0b3JlZCB3aGVuIHJlY2VpdmVkIGRhdGEKKyAqIEByZXR1cm4gRVJSX09LIGlmIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlICh0aW1lb3V0LAorICogICAgICAgICAgICAgICAgbWVtb3J5IGVycm9yIG9yIGFub3RoZXIgZXJyb3IpCisgKi8KK3N0YXRpYyBlcnJfdAorbmV0Y29ubl9yZWN2X2RhdGEoc3RydWN0IG5ldGNvbm4gKmNvbm4sIHZvaWQgKipuZXdfYnVmKQoreworICB2b2lkICpidWYgPSBOVUxMOworICB1MTZfdCBsZW47CisgIGVycl90IGVycjsKKyNpZiBMV0lQX1RDUAorICBzdHJ1Y3QgYXBpX21zZyBtc2c7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKworICBMV0lQX0VSUk9SKCJuZXRjb25uX3JlY3Y6IGludmFsaWQgcG9pbnRlciIsIChuZXdfYnVmICE9IE5VTEwpLCByZXR1cm4gRVJSX0FSRzspOworICAqbmV3X2J1ZiA9IE5VTEw7CisgIExXSVBfRVJST1IoIm5ldGNvbm5fcmVjdjogaW52YWxpZCBjb25uIiwgICAgKGNvbm4gIT0gTlVMTCksICAgIHJldHVybiBFUlJfQVJHOyk7CisgIExXSVBfRVJST1IoIm5ldGNvbm5fYWNjZXB0OiBpbnZhbGlkIHJlY3ZtYm94Iiwgc3lzX21ib3hfdmFsaWQoJmNvbm4tPnJlY3ZtYm94KSwgcmV0dXJuIEVSUl9DT05OOyk7CisKKyAgZXJyID0gY29ubi0+bGFzdF9lcnI7CisgIGlmIChFUlJfSVNfRkFUQUwoZXJyKSkgeworICAgIC8qIGRvbid0IHJlY3Ygb24gZmF0YWwgZXJyb3JzOiB0aGlzIG1pZ2h0IGJsb2NrIHRoZSBhcHBsaWNhdGlvbiB0YXNrCisgICAgICAgd2FpdGluZyBvbiByZWN2bWJveCBmb3JldmVyISAqLworICAgIC8qIEB0b2RvOiB0aGlzIGRvZXMgbm90IGFsbG93IHVzIHRvIGZldGNoIGRhdGEgdGhhdCBoYXMgYmVlbiBwdXQgaW50byByZWN2bWJveAorICAgICAgIGJlZm9yZSB0aGUgZmF0YWwgZXJyb3Igb2NjdXJyZWQgLSBpcyB0aGF0IGEgcHJvYmxlbT8gKi8KKyAgICByZXR1cm4gZXJyOworICB9CisKKyNpZiBMV0lQX1NPX1JDVlRJTUVPCisgIGlmIChzeXNfYXJjaF9tYm94X2ZldGNoKCZjb25uLT5yZWN2bWJveCwgJmJ1ZiwgY29ubi0+cmVjdl90aW1lb3V0KSA9PSBTWVNfQVJDSF9USU1FT1VUKSB7CisgICAgTkVUQ09OTl9TRVRfU0FGRV9FUlIoY29ubiwgRVJSX1RJTUVPVVQpOworICAgIHJldHVybiBFUlJfVElNRU9VVDsKKyAgfQorI2Vsc2UKKyAgc3lzX2FyY2hfbWJveF9mZXRjaCgmY29ubi0+cmVjdm1ib3gsICZidWYsIDApOworI2VuZGlmIC8qIExXSVBfU09fUkNWVElNRU8qLworCisjaWYgTFdJUF9UQ1AKKyAgaWYgKGNvbm4tPnR5cGUgPT0gTkVUQ09OTl9UQ1ApIHsKKyAgICBpZiAoIW5ldGNvbm5fZ2V0X25vYXV0b3JlY3ZlZChjb25uKSB8fCAoYnVmID09IE5VTEwpKSB7CisgICAgICAvKiBMZXQgdGhlIHN0YWNrIGtub3cgdGhhdCB3ZSBoYXZlIHRha2VuIHRoZSBkYXRhLiAqLworICAgICAgLyogVE9ETzogU3BlZWR1cDogRG9uJ3QgYmxvY2sgYW5kIHdhaXQgZm9yIHRoZSBhbnN3ZXIgaGVyZQorICAgICAgICAgKHRvIHByZXZlbnQgbXVsdGlwbGUgdGhyZWFkLXN3aXRjaGVzKS4gKi8KKyAgICAgIG1zZy5mdW5jdGlvbiA9IGRvX3JlY3Y7CisgICAgICBtc2cubXNnLmNvbm4gPSBjb25uOworICAgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1zZy5tc2cubXNnLnIubGVuID0gKChzdHJ1Y3QgcGJ1ZiAqKWJ1ZiktPnRvdF9sZW47CisgICAgICB9IGVsc2UgeworICAgICAgICBtc2cubXNnLm1zZy5yLmxlbiA9IDE7CisgICAgICB9CisgICAgICAvKiBkb24ndCBjYXJlIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIGRvX3JlY3YgKi8KKyAgICAgIFRDUElQX0FQSU1TRygmbXNnKTsKKyAgICB9CisKKyAgICAvKiBJZiB3ZSBhcmUgY2xvc2VkLCB3ZSBpbmRpY2F0ZSB0aGF0IHdlIG5vIGxvbmdlciB3aXNoIHRvIHVzZSB0aGUgc29ja2V0ICovCisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICBBUElfRVZFTlQoY29ubiwgTkVUQ09OTl9FVlRfUkNWTUlOVVMsIDApOworICAgICAgLyogQXZvaWQgdG8gbG9zZSBhbnkgcHJldmlvdXMgZXJyb3IgY29kZSAqLworICAgICAgTkVUQ09OTl9TRVRfU0FGRV9FUlIoY29ubiwgRVJSX0NMU0QpOworICAgICAgcmV0dXJuIEVSUl9DTFNEOworICAgIH0KKyAgICBsZW4gPSAoKHN0cnVjdCBwYnVmICopYnVmKS0+dG90X2xlbjsKKyAgfQorI2VuZGlmIC8qIExXSVBfVENQICovCisjaWYgTFdJUF9UQ1AgJiYgKExXSVBfVURQIHx8IExXSVBfUkFXKQorICBlbHNlCisjZW5kaWYgLyogTFdJUF9UQ1AgJiYgKExXSVBfVURQIHx8IExXSVBfUkFXKSAqLworI2lmIChMV0lQX1VEUCB8fCBMV0lQX1JBVykKKyAgeworICAgIExXSVBfQVNTRVJUKCJidWYgIT0gTlVMTCIsIGJ1ZiAhPSBOVUxMKTsKKyAgICBsZW4gPSBuZXRidWZfbGVuKChzdHJ1Y3QgbmV0YnVmICopYnVmKTsKKyAgfQorI2VuZGlmIC8qIChMV0lQX1VEUCB8fCBMV0lQX1JBVykgKi8KKworI2lmIExXSVBfU09fUkNWQlVGCisgIFNZU19BUkNIX0RFQyhjb25uLT5yZWN2X2F2YWlsLCBsZW4pOworI2VuZGlmIC8qIExXSVBfU09fUkNWQlVGICovCisgIC8qIFJlZ2lzdGVyIGV2ZW50IHdpdGggY2FsbGJhY2sgKi8KKyAgQVBJX0VWRU5UKGNvbm4sIE5FVENPTk5fRVZUX1JDVk1JTlVTLCBsZW4pOworCisgIExXSVBfREVCVUdGKEFQSV9MSUJfREVCVUcsICgibmV0Y29ubl9yZWN2X2RhdGE6IHJlY2VpdmVkICVwLCBsZW49JSJVMTZfRiJcbiIsIGJ1ZiwgbGVuKSk7CisKKyAgKm5ld19idWYgPSBidWY7CisgIC8qIGRvbid0IHNldCBjb25uLT5sYXN0X2VycjogaXQncyBvbmx5IEVSUl9PSywgYW55d2F5ICovCisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogUmVjZWl2ZSBkYXRhIChpbiBmb3JtIG9mIGEgcGJ1ZikgZnJvbSBhIFRDUCBuZXRjb25uCisgKgorICogQHBhcmFtIGNvbm4gdGhlIG5ldGNvbm4gZnJvbSB3aGljaCB0byByZWNlaXZlIGRhdGEKKyAqIEBwYXJhbSBuZXdfYnVmIHBvaW50ZXIgd2hlcmUgYSBuZXcgcGJ1ZiBpcyBzdG9yZWQgd2hlbiByZWNlaXZlZCBkYXRhCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZSAodGltZW91dCwKKyAqICAgICAgICAgICAgICAgIG1lbW9yeSBlcnJvciBvciBhbm90aGVyIGVycm9yKQorICogICAgICAgICBFUlJfQVJHIGlmIGNvbm4gaXMgbm90IGEgVENQIG5ldGNvbm4KKyAqLworZXJyX3QKK25ldGNvbm5fcmVjdl90Y3BfcGJ1ZihzdHJ1Y3QgbmV0Y29ubiAqY29ubiwgc3RydWN0IHBidWYgKipuZXdfYnVmKQoreworICBMV0lQX0VSUk9SKCJuZXRjb25uX3JlY3Y6IGludmFsaWQgY29ubiIsIChjb25uICE9IE5VTEwpICYmCisgICAgICAgICAgICAgbmV0Y29ubl90eXBlKGNvbm4pID09IE5FVENPTk5fVENQLCByZXR1cm4gRVJSX0FSRzspOworCisgIHJldHVybiBuZXRjb25uX3JlY3ZfZGF0YShjb25uLCAodm9pZCAqKiluZXdfYnVmKTsKK30KKworLyoqCisgKiBSZWNlaXZlIGRhdGEgKGluIGZvcm0gb2YgYSBuZXRidWYgY29udGFpbmluZyBhIHBhY2tldCBidWZmZXIpIGZyb20gYSBuZXRjb25uCisgKgorICogQHBhcmFtIGNvbm4gdGhlIG5ldGNvbm4gZnJvbSB3aGljaCB0byByZWNlaXZlIGRhdGEKKyAqIEBwYXJhbSBuZXdfYnVmIHBvaW50ZXIgd2hlcmUgYSBuZXcgbmV0YnVmIGlzIHN0b3JlZCB3aGVuIHJlY2VpdmVkIGRhdGEKKyAqIEByZXR1cm4gRVJSX09LIGlmIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlICh0aW1lb3V0LAorICogICAgICAgICAgICAgICAgbWVtb3J5IGVycm9yIG9yIGFub3RoZXIgZXJyb3IpCisgKi8KK2Vycl90CituZXRjb25uX3JlY3Yoc3RydWN0IG5ldGNvbm4gKmNvbm4sIHN0cnVjdCBuZXRidWYgKipuZXdfYnVmKQoreworI2lmIExXSVBfVENQCisgIHN0cnVjdCBuZXRidWYgKmJ1ZiA9IE5VTEw7CisgIGVycl90IGVycjsKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworCisgIExXSVBfRVJST1IoIm5ldGNvbm5fcmVjdjogaW52YWxpZCBwb2ludGVyIiwgKG5ld19idWYgIT0gTlVMTCksIHJldHVybiBFUlJfQVJHOyk7CisgICpuZXdfYnVmID0gTlVMTDsKKyAgTFdJUF9FUlJPUigibmV0Y29ubl9yZWN2OiBpbnZhbGlkIGNvbm4iLCAgICAoY29ubiAhPSBOVUxMKSwgICAgcmV0dXJuIEVSUl9BUkc7KTsKKyAgTFdJUF9FUlJPUigibmV0Y29ubl9hY2NlcHQ6IGludmFsaWQgcmVjdm1ib3giLCBzeXNfbWJveF92YWxpZCgmY29ubi0+cmVjdm1ib3gpLCByZXR1cm4gRVJSX0NPTk47KTsKKworI2lmIExXSVBfVENQCisgIGlmIChjb25uLT50eXBlID09IE5FVENPTk5fVENQKSB7CisgICAgc3RydWN0IHBidWYgKnAgPSBOVUxMOworICAgIC8qIFRoaXMgaXMgbm90IGEgbGlzdGVuaW5nIG5ldGNvbm4sIHNpbmNlIHJlY3ZtYm94IGlzIHNldCAqLworCisgICAgYnVmID0gKHN0cnVjdCBuZXRidWYgKiltZW1wX21hbGxvYyhNRU1QX05FVEJVRik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICBORVRDT05OX1NFVF9TQUZFX0VSUihjb25uLCBFUlJfTUVNKTsKKyAgICAgIHJldHVybiBFUlJfTUVNOworICAgIH0KKworICAgIGVyciA9IG5ldGNvbm5fcmVjdl9kYXRhKGNvbm4sICh2b2lkICoqKSZwKTsKKyAgICBpZiAoZXJyICE9IEVSUl9PSykgeworICAgICAgbWVtcF9mcmVlKE1FTVBfTkVUQlVGLCBidWYpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgTFdJUF9BU1NFUlQoInAgIT0gTlVMTCIsIHAgIT0gTlVMTCk7CisKKyAgICBidWYtPnAgPSBwOworICAgIGJ1Zi0+cHRyID0gcDsKKyAgICBidWYtPnBvcnQgPSAwOworICAgIGlwX2FkZHJfc2V0X2FueSgmYnVmLT5hZGRyKTsKKyAgICAqbmV3X2J1ZiA9IGJ1ZjsKKyAgICAvKiBkb24ndCBzZXQgY29ubi0+bGFzdF9lcnI6IGl0J3Mgb25seSBFUlJfT0ssIGFueXdheSAqLworICAgIHJldHVybiBFUlJfT0s7CisgIH0gZWxzZQorI2VuZGlmIC8qIExXSVBfVENQICovCisgIHsKKyNpZiAoTFdJUF9VRFAgfHwgTFdJUF9SQVcpCisgICAgcmV0dXJuIG5ldGNvbm5fcmVjdl9kYXRhKGNvbm4sICh2b2lkICoqKW5ld19idWYpOworI2VuZGlmIC8qIChMV0lQX1VEUCB8fCBMV0lQX1JBVykgKi8KKyAgfQorfQorCisvKioKKyAqIFRDUDogdXBkYXRlIHRoZSByZWNlaXZlIHdpbmRvdzogYnkgY2FsbGluZyB0aGlzLCB0aGUgYXBwbGljYXRpb24KKyAqIHRlbGxzIHRoZSBzdGFjayB0aGF0IGl0IGhhcyBwcm9jZXNzZWQgZGF0YSBhbmQgaXMgYWJsZSB0byBhY2NlcHQKKyAqIG5ldyBkYXRhLgorICogQVRURU5USU9OOiB1c2Ugd2l0aCBjYXJlLCB0aGlzIGlzIG1haW5seSB1c2VkIGZvciBzb2NrZXRzIQorICogQ2FuIG9ubHkgYmUgdXNlZCB3aGVuIGNhbGxpbmcgbmV0Y29ubl9zZXRfbm9hdXRvcmVjdmVkKGNvbm4sIDEpIGJlZm9yZS4KKyAqCisgKiBAcGFyYW0gY29ubiB0aGUgbmV0Y29ubiBmb3Igd2hpY2ggdG8gdXBkYXRlIHRoZSByZWNlaXZlIHdpbmRvdworICogQHBhcmFtIGxlbmd0aCBhbW91bnQgb2YgZGF0YSBwcm9jZXNzZWQgKEFUVEVOVElPTjogdGhpcyBtdXN0IGJlIGFjY3VyYXRlISkKKyAqLwordm9pZAorbmV0Y29ubl9yZWN2ZWQoc3RydWN0IG5ldGNvbm4gKmNvbm4sIHUzMl90IGxlbmd0aCkKK3sKKyNpZiBMV0lQX1RDUAorICBpZiAoKGNvbm4gIT0gTlVMTCkgJiYgKGNvbm4tPnR5cGUgPT0gTkVUQ09OTl9UQ1ApICYmCisgICAgICAobmV0Y29ubl9nZXRfbm9hdXRvcmVjdmVkKGNvbm4pKSkgeworICAgIHN0cnVjdCBhcGlfbXNnIG1zZzsKKyAgICAvKiBMZXQgdGhlIHN0YWNrIGtub3cgdGhhdCB3ZSBoYXZlIHRha2VuIHRoZSBkYXRhLiAqLworICAgIC8qIFRPRE86IFNwZWVkdXA6IERvbid0IGJsb2NrIGFuZCB3YWl0IGZvciB0aGUgYW5zd2VyIGhlcmUKKyAgICAgICAodG8gcHJldmVudCBtdWx0aXBsZSB0aHJlYWQtc3dpdGNoZXMpLiAqLworICAgIG1zZy5mdW5jdGlvbiA9IGRvX3JlY3Y7CisgICAgbXNnLm1zZy5jb25uID0gY29ubjsKKyAgICBtc2cubXNnLm1zZy5yLmxlbiA9IGxlbmd0aDsKKyAgICAvKiBkb24ndCBjYXJlIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIGRvX3JlY3YgKi8KKyAgICBUQ1BJUF9BUElNU0coJm1zZyk7CisgIH0KKyNlbHNlIC8qIExXSVBfVENQICovCisgIExXSVBfVU5VU0VEX0FSRyhjb25uKTsKKyAgTFdJUF9VTlVTRURfQVJHKGxlbmd0aCk7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KK30KKworLyoqCisgKiBTZW5kIGRhdGEgKGluIGZvcm0gb2YgYSBuZXRidWYpIHRvIGEgc3BlY2lmaWMgcmVtb3RlIElQIGFkZHJlc3MgYW5kIHBvcnQuCisgKiBPbmx5IHRvIGJlIHVzZWQgZm9yIFVEUCBhbmQgUkFXIG5ldGNvbm5zIChub3QgVENQKS4KKyAqCisgKiBAcGFyYW0gY29ubiB0aGUgbmV0Y29ubiBvdmVyIHdoaWNoIHRvIHNlbmQgZGF0YQorICogQHBhcmFtIGJ1ZiBhIG5ldGJ1ZiBjb250YWluaW5nIHRoZSBkYXRhIHRvIHNlbmQKKyAqIEBwYXJhbSBhZGRyIHRoZSByZW1vdGUgSVAgYWRkcmVzcyB0byB3aGljaCB0byBzZW5kIHRoZSBkYXRhCisgKiBAcGFyYW0gcG9ydCB0aGUgcmVtb3RlIHBvcnQgdG8gd2hpY2ggdG8gc2VuZCB0aGUgZGF0YQorICogQHJldHVybiBFUlJfT0sgaWYgZGF0YSB3YXMgc2VudCwgYW55IG90aGVyIGVycl90IG9uIGVycm9yCisgKi8KK2Vycl90CituZXRjb25uX3NlbmR0byhzdHJ1Y3QgbmV0Y29ubiAqY29ubiwgc3RydWN0IG5ldGJ1ZiAqYnVmLCBpcF9hZGRyX3QgKmFkZHIsIHUxNl90IHBvcnQpCit7CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIGlwX2FkZHJfc2V0KCZidWYtPmFkZHIsIGFkZHIpOworICAgIGJ1Zi0+cG9ydCA9IHBvcnQ7CisgICAgcmV0dXJuIG5ldGNvbm5fc2VuZChjb25uLCBidWYpOworICB9CisgIHJldHVybiBFUlJfVkFMOworfQorCisvKioKKyAqIFNlbmQgZGF0YSBvdmVyIGEgVURQIG9yIFJBVyBuZXRjb25uICh0aGF0IGlzIGFscmVhZHkgY29ubmVjdGVkKS4KKyAqCisgKiBAcGFyYW0gY29ubiB0aGUgVURQIG9yIFJBVyBuZXRjb25uIG92ZXIgd2hpY2ggdG8gc2VuZCBkYXRhCisgKiBAcGFyYW0gYnVmIGEgbmV0YnVmIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gc2VuZAorICogQHJldHVybiBFUlJfT0sgaWYgZGF0YSB3YXMgc2VudCwgYW55IG90aGVyIGVycl90IG9uIGVycm9yCisgKi8KK2Vycl90CituZXRjb25uX3NlbmQoc3RydWN0IG5ldGNvbm4gKmNvbm4sIHN0cnVjdCBuZXRidWYgKmJ1ZikKK3sKKyAgc3RydWN0IGFwaV9tc2cgbXNnOworICBlcnJfdCBlcnI7CisKKyAgTFdJUF9FUlJPUigibmV0Y29ubl9zZW5kOiBpbnZhbGlkIGNvbm4iLCAgKGNvbm4gIT0gTlVMTCksIHJldHVybiBFUlJfQVJHOyk7CisKKyAgTFdJUF9ERUJVR0YoQVBJX0xJQl9ERUJVRywgKCJuZXRjb25uX3NlbmQ6IHNlbmRpbmcgJSJVMTZfRiIgYnl0ZXNcbiIsIGJ1Zi0+cC0+dG90X2xlbikpOworICBtc2cuZnVuY3Rpb24gPSBkb19zZW5kOworICBtc2cubXNnLmNvbm4gPSBjb25uOworICBtc2cubXNnLm1zZy5iID0gYnVmOworICBlcnIgPSBUQ1BJUF9BUElNU0coJm1zZyk7CisKKyAgTkVUQ09OTl9TRVRfU0FGRV9FUlIoY29ubiwgZXJyKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBTZW5kIGRhdGEgb3ZlciBhIFRDUCBuZXRjb25uLgorICoKKyAqIEBwYXJhbSBjb25uIHRoZSBUQ1AgbmV0Y29ubiBvdmVyIHdoaWNoIHRvIHNlbmQgZGF0YQorICogQHBhcmFtIGRhdGFwdHIgcG9pbnRlciB0byB0aGUgYXBwbGljYXRpb24gYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gc2VuZAorICogQHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgYXBwbGljYXRpb24gZGF0YSB0byBzZW5kCisgKiBAcGFyYW0gYXBpZmxhZ3MgY29tYmluYXRpb24gb2YgZm9sbG93aW5nIGZsYWdzIDoKKyAqIC0gTkVUQ09OTl9DT1BZOiBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gbWVtb3J5IGJlbG9uZ2luZyB0byB0aGUgc3RhY2sKKyAqIC0gTkVUQ09OTl9NT1JFOiBmb3IgVENQIGNvbm5lY3Rpb24sIFBTSCBmbGFnIHdpbGwgYmUgc2V0IG9uIGxhc3Qgc2VnbWVudCBzZW50CisgKiAtIE5FVENPTk5fRE9OVEJMT0NLOiBvbmx5IHdyaXRlIHRoZSBkYXRhIGlmIGFsbCBkYXQgY2FuIGJlIHdyaXR0ZW4gYXQgb25jZQorICogQHJldHVybiBFUlJfT0sgaWYgZGF0YSB3YXMgc2VudCwgYW55IG90aGVyIGVycl90IG9uIGVycm9yCisgKi8KK2Vycl90CituZXRjb25uX3dyaXRlKHN0cnVjdCBuZXRjb25uICpjb25uLCBjb25zdCB2b2lkICpkYXRhcHRyLCBzaXplX3Qgc2l6ZSwgdThfdCBhcGlmbGFncykKK3sKKyAgc3RydWN0IGFwaV9tc2cgbXNnOworICBlcnJfdCBlcnI7CisKKyAgTFdJUF9FUlJPUigibmV0Y29ubl93cml0ZTogaW52YWxpZCBjb25uIiwgIChjb25uICE9IE5VTEwpLCByZXR1cm4gRVJSX0FSRzspOworICBMV0lQX0VSUk9SKCJuZXRjb25uX3dyaXRlOiBpbnZhbGlkIGNvbm4tPnR5cGUiLCAgKGNvbm4tPnR5cGUgPT0gTkVUQ09OTl9UQ1ApLCByZXR1cm4gRVJSX1ZBTDspOworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIEVSUl9PSzsKKyAgfQorCisgIC8qIEB0b2RvOiBmb3Igbm9uLWJsb2NraW5nIHdyaXRlLCBjaGVjayBpZiAnc2l6ZScgd291bGQgZXZlciBmaXQgaW50bworICAgICAgICAgICAgc25kX3F1ZXVlIG9yIHNuZF9idWYgKi8KKyAgbXNnLmZ1bmN0aW9uID0gZG9fd3JpdGU7CisgIG1zZy5tc2cuY29ubiA9IGNvbm47CisgIG1zZy5tc2cubXNnLncuZGF0YXB0ciA9IGRhdGFwdHI7CisgIG1zZy5tc2cubXNnLncuYXBpZmxhZ3MgPSBhcGlmbGFnczsKKyAgbXNnLm1zZy5tc2cudy5sZW4gPSBzaXplOworICAvKiBGb3IgbG9ja2luZyB0aGUgY29yZTogdGhpcyBfY2FuXyBiZSBkZWxheWVkIG9uIGxvdyBtZW1vcnkvbG93IHNlbmQgYnVmZmVyLAorICAgICBidXQgaWYgaXQgaXMsIHRoaXMgaXMgZG9uZSBpbnNpZGUgYXBpX21zZy5jOmRvX3dyaXRlKCksIHNvIHdlIGNhbiB1c2UgdGhlCisgICAgIG5vbi1ibG9ja2luZyB2ZXJzaW9uIGhlcmUuICovCisgIGVyciA9IFRDUElQX0FQSU1TRygmbXNnKTsKKworICBORVRDT05OX1NFVF9TQUZFX0VSUihjb25uLCBlcnIpOworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIENsb3NlIG90IHNodXRkb3duIGEgVENQIG5ldGNvbm4gKGRvZXNuJ3QgZGVsZXRlIGl0KS4KKyAqCisgKiBAcGFyYW0gY29ubiB0aGUgVENQIG5ldGNvbm4gdG8gY2xvc2Ugb3Igc2h1dGRvd24KKyAqIEBwYXJhbSBob3cgZnVsbHkgY2xvc2Ugb3Igb25seSBzaHV0ZG93biBvbmUgc2lkZT8KKyAqIEByZXR1cm4gRVJSX09LIGlmIHRoZSBuZXRjb25uIHdhcyBjbG9zZWQsIGFueSBvdGhlciBlcnJfdCBvbiBlcnJvcgorICovCitzdGF0aWMgZXJyX3QKK25ldGNvbm5fY2xvc2Vfc2h1dGRvd24oc3RydWN0IG5ldGNvbm4gKmNvbm4sIHU4X3QgaG93KQoreworICBzdHJ1Y3QgYXBpX21zZyBtc2c7CisgIGVycl90IGVycjsKKworICBMV0lQX0VSUk9SKCJuZXRjb25uX2Nsb3NlOiBpbnZhbGlkIGNvbm4iLCAgKGNvbm4gIT0gTlVMTCksIHJldHVybiBFUlJfQVJHOyk7CisKKyAgbXNnLmZ1bmN0aW9uID0gZG9fY2xvc2U7CisgIG1zZy5tc2cuY29ubiA9IGNvbm47CisgIC8qIHNodXR0aW5nIGRvd24gYm90aCBlbmRzIGlzIHRoZSBzYW1lIGFzIGNsb3NpbmcgKi8KKyAgbXNnLm1zZy5tc2cuc2Quc2h1dCA9IGhvdzsKKyAgLyogYmVjYXVzZSBvZiB0aGUgTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcgaW1wbGVtZW50YXRpb24gb2YgZG9fY2xvc2UsCisgICAgIGRvbid0IHVzZSBUQ1BJUF9BUElNU0cgaGVyZSAqLworICBlcnIgPSB0Y3BpcF9hcGltc2coJm1zZyk7CisKKyAgTkVUQ09OTl9TRVRfU0FGRV9FUlIoY29ubiwgZXJyKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBDbG9zZSBhIFRDUCBuZXRjb25uIChkb2Vzbid0IGRlbGV0ZSBpdCkuCisgKgorICogQHBhcmFtIGNvbm4gdGhlIFRDUCBuZXRjb25uIHRvIGNsb3NlCisgKiBAcmV0dXJuIEVSUl9PSyBpZiB0aGUgbmV0Y29ubiB3YXMgY2xvc2VkLCBhbnkgb3RoZXIgZXJyX3Qgb24gZXJyb3IKKyAqLworZXJyX3QKK25ldGNvbm5fY2xvc2Uoc3RydWN0IG5ldGNvbm4gKmNvbm4pCit7CisgIC8qIHNodXR0aW5nIGRvd24gYm90aCBlbmRzIGlzIHRoZSBzYW1lIGFzIGNsb3NpbmcgKi8KKyAgcmV0dXJuIG5ldGNvbm5fY2xvc2Vfc2h1dGRvd24oY29ubiwgTkVUQ09OTl9TSFVUX1JEV1IpOworfQorCisvKioKKyAqIFNodXQgZG93biBvbmUgb3IgYm90aCBzaWRlcyBvZiBhIFRDUCBuZXRjb25uIChkb2Vzbid0IGRlbGV0ZSBpdCkuCisgKgorICogQHBhcmFtIGNvbm4gdGhlIFRDUCBuZXRjb25uIHRvIHNodXQgZG93bgorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIG5ldGNvbm4gd2FzIGNsb3NlZCwgYW55IG90aGVyIGVycl90IG9uIGVycm9yCisgKi8KK2Vycl90CituZXRjb25uX3NodXRkb3duKHN0cnVjdCBuZXRjb25uICpjb25uLCB1OF90IHNodXRfcngsIHU4X3Qgc2h1dF90eCkKK3sKKyAgcmV0dXJuIG5ldGNvbm5fY2xvc2Vfc2h1dGRvd24oY29ubiwgKHNodXRfcnggPyBORVRDT05OX1NIVVRfUkQgOiAwKSB8IChzaHV0X3R4ID8gTkVUQ09OTl9TSFVUX1dSIDogMCkpOworfQorCisjaWYgTFdJUF9JR01QCisvKioKKyAqIEpvaW4gbXVsdGljYXN0IGdyb3VwcyBmb3IgVURQIG5ldGNvbm5zLgorICoKKyAqIEBwYXJhbSBjb25uIHRoZSBVRFAgbmV0Y29ubiBmb3Igd2hpY2ggdG8gY2hhbmdlIG11bHRpY2FzdCBhZGRyZXNzZXMKKyAqIEBwYXJhbSBtdWx0aWFkZHIgSVAgYWRkcmVzcyBvZiB0aGUgbXVsdGljYXN0IGdyb3VwIHRvIGpvaW4gb3IgbGVhdmUKKyAqIEBwYXJhbSBuZXRpZl9hZGRyIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCB0byBzZW5kCisgKiAgICAgICAgICAgICAgICAgIHRoZSBpZ21wIG1lc3NhZ2UKKyAqIEBwYXJhbSBqb2luX29yX2xlYXZlIGZsYWcgd2hldGhlciB0byBzZW5kIGEgam9pbi0gb3IgbGVhdmUtbWVzc2FnZQorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIGFjdGlvbiB3YXMgdGFrZW4sIGFueSBlcnJfdCBvbiBlcnJvcgorICovCitlcnJfdAorbmV0Y29ubl9qb2luX2xlYXZlX2dyb3VwKHN0cnVjdCBuZXRjb25uICpjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqbXVsdGlhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqbmV0aWZfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG5ldGNvbm5faWdtcCBqb2luX29yX2xlYXZlKQoreworICBzdHJ1Y3QgYXBpX21zZyBtc2c7CisgIGVycl90IGVycjsKKworICBMV0lQX0VSUk9SKCJuZXRjb25uX2pvaW5fbGVhdmVfZ3JvdXA6IGludmFsaWQgY29ubiIsICAoY29ubiAhPSBOVUxMKSwgcmV0dXJuIEVSUl9BUkc7KTsKKworICBtc2cuZnVuY3Rpb24gPSBkb19qb2luX2xlYXZlX2dyb3VwOworICBtc2cubXNnLmNvbm4gPSBjb25uOworICBtc2cubXNnLm1zZy5qbC5tdWx0aWFkZHIgPSBtdWx0aWFkZHI7CisgIG1zZy5tc2cubXNnLmpsLm5ldGlmX2FkZHIgPSBuZXRpZl9hZGRyOworICBtc2cubXNnLm1zZy5qbC5qb2luX29yX2xlYXZlID0gam9pbl9vcl9sZWF2ZTsKKyAgZXJyID0gVENQSVBfQVBJTVNHKCZtc2cpOworCisgIE5FVENPTk5fU0VUX1NBRkVfRVJSKGNvbm4sIGVycik7CisgIHJldHVybiBlcnI7Cit9CisjZW5kaWYgLyogTFdJUF9JR01QICovCisKKyNpZiBMV0lQX0ROUworLyoqCisgKiBFeGVjdXRlIGEgRE5TIHF1ZXJ5LCBvbmx5IG9uZSBJUCBhZGRyZXNzIGlzIHJldHVybmVkCisgKgorICogQHBhcmFtIG5hbWUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEROUyBob3N0IG5hbWUgdG8gcXVlcnkKKyAqIEBwYXJhbSBhZGRyIGEgcHJlYWxsb2NhdGVkIGlwX2FkZHJfdCB3aGVyZSB0byBzdG9yZSB0aGUgcmVzb2x2ZWQgSVAgYWRkcmVzcworICogQHJldHVybiBFUlJfT0s6IHJlc29sdmluZyBzdWNjZWVkZWQKKyAqICAgICAgICAgRVJSX01FTTogbWVtb3J5IGVycm9yLCB0cnkgYWdhaW4gbGF0ZXIKKyAqICAgICAgICAgRVJSX0FSRzogZG5zIGNsaWVudCBub3QgaW5pdGlhbGl6ZWQgb3IgaW52YWxpZCBob3N0bmFtZQorICogICAgICAgICBFUlJfVkFMOiBkbnMgc2VydmVyIHJlc3BvbnNlIHdhcyBpbnZhbGlkCisgKi8KK2Vycl90CituZXRjb25uX2dldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSwgaXBfYWRkcl90ICphZGRyKQoreworICBzdHJ1Y3QgZG5zX2FwaV9tc2cgbXNnOworICBlcnJfdCBlcnI7CisgIHN5c19zZW1fdCBzZW07CisKKyAgTFdJUF9FUlJPUigibmV0Y29ubl9nZXRob3N0YnluYW1lOiBpbnZhbGlkIG5hbWUiLCAobmFtZSAhPSBOVUxMKSwgcmV0dXJuIEVSUl9BUkc7KTsKKyAgTFdJUF9FUlJPUigibmV0Y29ubl9nZXRob3N0YnluYW1lOiBpbnZhbGlkIGFkZHIiLCAoYWRkciAhPSBOVUxMKSwgcmV0dXJuIEVSUl9BUkc7KTsKKworICBlcnIgPSBzeXNfc2VtX25ldygmc2VtLCAwKTsKKyAgaWYgKGVyciAhPSBFUlJfT0spIHsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgbXNnLm5hbWUgPSBuYW1lOworICBtc2cuYWRkciA9IGFkZHI7CisgIG1zZy5lcnIgPSAmZXJyOworICBtc2cuc2VtID0gJnNlbTsKKworICB0Y3BpcF9jYWxsYmFjayhkb19nZXRob3N0YnluYW1lLCAmbXNnKTsKKyAgc3lzX3NlbV93YWl0KCZzZW0pOworICBzeXNfc2VtX2ZyZWUoJnNlbSk7CisKKyAgcmV0dXJuIGVycjsKK30KKyNlbmRpZiAvKiBMV0lQX0ROUyovCisKKyNlbmRpZiAvKiBMV0lQX05FVENPTk4gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvYXBpL2FwaV9tc2cuYyBiL2NvcmUvbHdpcC9zcmMvYXBpL2FwaV9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDhmOTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9hcGkvYXBpX21zZy5jCkBAIC0wLDAgKzEsMTUzNSBAQAorLyoqCisgKiBAZmlsZQorICogU2VxdWVudGlhbCBBUEkgSW50ZXJuYWwgbW9kdWxlCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9ORVRDT05OIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9hcGlfbXNnLmgiCisKKyNpbmNsdWRlICJsd2lwL2lwLmgiCisjaW5jbHVkZSAibHdpcC91ZHAuaCIKKyNpbmNsdWRlICJsd2lwL3RjcC5oIgorI2luY2x1ZGUgImx3aXAvcmF3LmgiCisKKyNpbmNsdWRlICJsd2lwL21lbXAuaCIKKyNpbmNsdWRlICJsd2lwL3RjcGlwLmgiCisjaW5jbHVkZSAibHdpcC9pZ21wLmgiCisjaW5jbHVkZSAibHdpcC9kbnMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFNFVF9OT05CTE9DS0lOR19DT05ORUNUKGNvbm4sIHZhbCkgIGRvIHsgaWYodmFsKSB7IFwKKyAgKGNvbm4pLT5mbGFncyB8PSBORVRDT05OX0ZMQUdfSU5fTk9OQkxPQ0tJTkdfQ09OTkVDVDsgXAorfSBlbHNlIHsgXAorICAoY29ubiktPmZsYWdzICY9IH4gTkVUQ09OTl9GTEFHX0lOX05PTkJMT0NLSU5HX0NPTk5FQ1Q7IH19IHdoaWxlKDApCisjZGVmaW5lIElOX05PTkJMT0NLSU5HX0NPTk5FQ1QoY29ubikgKCgoY29ubiktPmZsYWdzICYgTkVUQ09OTl9GTEFHX0lOX05PTkJMT0NLSU5HX0NPTk5FQ1QpICE9IDApCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCisjaWYgTFdJUF9UQ1AKK3N0YXRpYyBlcnJfdCBkb193cml0ZW1vcmUoc3RydWN0IG5ldGNvbm4gKmNvbm4pOworc3RhdGljIHZvaWQgZG9fY2xvc2VfaW50ZXJuYWwoc3RydWN0IG5ldGNvbm4gKmNvbm4pOworI2VuZGlmCisKKyNpZiBMV0lQX1JBVworLyoqCisgKiBSZWNlaXZlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBSQVcgbmV0Y29ubnMuCisgKiBEb2Vzbid0ICdlYXQnIHRoZSBwYWNrZXQsIG9ubHkgcmVmZXJlbmNlcyBpdCBhbmQgc2VuZHMgaXQgdG8KKyAqIGNvbm4tPnJlY3ZtYm94CisgKgorICogQHNlZSByYXcuaCAoc3RydWN0IHJhd19wY2IucmVjdikgZm9yIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZQorICovCitzdGF0aWMgdThfdAorcmVjdl9yYXcodm9pZCAqYXJnLCBzdHJ1Y3QgcmF3X3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwKKyAgICBpcF9hZGRyX3QgKmFkZHIpCit7CisgIHN0cnVjdCBwYnVmICpxOworICBzdHJ1Y3QgbmV0YnVmICpidWY7CisgIHN0cnVjdCBuZXRjb25uICpjb25uOworCisgIExXSVBfVU5VU0VEX0FSRyhhZGRyKTsKKyAgY29ubiA9IChzdHJ1Y3QgbmV0Y29ubiAqKWFyZzsKKworICBpZiAoKGNvbm4gIT0gTlVMTCkgJiYgc3lzX21ib3hfdmFsaWQoJmNvbm4tPnJlY3ZtYm94KSkgeworI2lmIExXSVBfU09fUkNWQlVGCisgICAgaW50IHJlY3ZfYXZhaWw7CisgICAgU1lTX0FSQ0hfR0VUKGNvbm4tPnJlY3ZfYXZhaWwsIHJlY3ZfYXZhaWwpOworICAgIGlmICgocmVjdl9hdmFpbCArIChpbnQpKHAtPnRvdF9sZW4pKSA+IGNvbm4tPnJlY3ZfYnVmc2l6ZSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmIC8qIExXSVBfU09fUkNWQlVGICovCisgICAgLyogY29weSB0aGUgd2hvbGUgcGFja2V0IGludG8gbmV3IHBidWZzICovCisgICAgcSA9IHBidWZfYWxsb2MoUEJVRl9SQVcsIHAtPnRvdF9sZW4sIFBCVUZfUkFNKTsKKyAgICBpZihxICE9IE5VTEwpIHsKKyAgICAgIGlmIChwYnVmX2NvcHkocSwgcCkgIT0gRVJSX09LKSB7CisgICAgICAgIHBidWZfZnJlZShxKTsKKyAgICAgICAgcSA9IE5VTEw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHEgIT0gTlVMTCkgeworICAgICAgdTE2X3QgbGVuOworICAgICAgYnVmID0gKHN0cnVjdCBuZXRidWYgKiltZW1wX21hbGxvYyhNRU1QX05FVEJVRik7CisgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgcGJ1Zl9mcmVlKHEpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgYnVmLT5wID0gcTsKKyAgICAgIGJ1Zi0+cHRyID0gcTsKKyAgICAgIGlwX2FkZHJfY29weShidWYtPmFkZHIsICppcF9jdXJyZW50X3NyY19hZGRyKCkpOworICAgICAgYnVmLT5wb3J0ID0gcGNiLT5wcm90b2NvbDsKKworICAgICAgbGVuID0gcS0+dG90X2xlbjsKKyAgICAgIGlmIChzeXNfbWJveF90cnlwb3N0KCZjb25uLT5yZWN2bWJveCwgYnVmKSAhPSBFUlJfT0spIHsKKyAgICAgICAgbmV0YnVmX2RlbGV0ZShidWYpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0gZWxzZSB7CisjaWYgTFdJUF9TT19SQ1ZCVUYKKyAgICAgICAgU1lTX0FSQ0hfSU5DKGNvbm4tPnJlY3ZfYXZhaWwsIGxlbik7CisjZW5kaWYgLyogTFdJUF9TT19SQ1ZCVUYgKi8KKyAgICAgICAgLyogUmVnaXN0ZXIgZXZlbnQgd2l0aCBjYWxsYmFjayAqLworICAgICAgICBBUElfRVZFTlQoY29ubiwgTkVUQ09OTl9FVlRfUkNWUExVUywgbGVuKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMDsgLyogZG8gbm90IGVhdCB0aGUgcGFja2V0ICovCit9CisjZW5kaWYgLyogTFdJUF9SQVcqLworCisjaWYgTFdJUF9VRFAKKy8qKgorICogUmVjZWl2ZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgVURQIG5ldGNvbm5zLgorICogUG9zdHMgdGhlIHBhY2tldCB0byBjb25uLT5yZWN2bWJveCBvciBkZWxldGVzIGl0IG9uIG1lbW9yeSBlcnJvci4KKyAqCisgKiBAc2VlIHVkcC5oIChzdHJ1Y3QgdWRwX3BjYi5yZWN2KSBmb3IgcGFyYW1ldGVycworICovCitzdGF0aWMgdm9pZAorcmVjdl91ZHAodm9pZCAqYXJnLCBzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwKKyAgIGlwX2FkZHJfdCAqYWRkciwgdTE2X3QgcG9ydCkKK3sKKyAgc3RydWN0IG5ldGJ1ZiAqYnVmOworICBzdHJ1Y3QgbmV0Y29ubiAqY29ubjsKKyAgdTE2X3QgbGVuOworI2lmIExXSVBfU09fUkNWQlVGCisgIGludCByZWN2X2F2YWlsOworI2VuZGlmIC8qIExXSVBfU09fUkNWQlVGICovCisKKyAgTFdJUF9VTlVTRURfQVJHKHBjYik7IC8qIG9ubHkgdXNlZCBmb3IgYXNzZXJ0cy4uLiAqLworICBMV0lQX0FTU0VSVCgicmVjdl91ZHAgbXVzdCBoYXZlIGEgcGNiIGFyZ3VtZW50IiwgcGNiICE9IE5VTEwpOworICBMV0lQX0FTU0VSVCgicmVjdl91ZHAgbXVzdCBoYXZlIGFuIGFyZ3VtZW50IiwgYXJnICE9IE5VTEwpOworICBjb25uID0gKHN0cnVjdCBuZXRjb25uICopYXJnOworICBMV0lQX0FTU0VSVCgicmVjdl91ZHA6IHJlY3YgZm9yIHdyb25nIHBjYiEiLCBjb25uLT5wY2IudWRwID09IHBjYik7CisKKyNpZiBMV0lQX1NPX1JDVkJVRgorICBTWVNfQVJDSF9HRVQoY29ubi0+cmVjdl9hdmFpbCwgcmVjdl9hdmFpbCk7CisgIGlmICgoY29ubiA9PSBOVUxMKSB8fCAhc3lzX21ib3hfdmFsaWQoJmNvbm4tPnJlY3ZtYm94KSB8fAorICAgICAgKChyZWN2X2F2YWlsICsgKGludCkocC0+dG90X2xlbikpID4gY29ubi0+cmVjdl9idWZzaXplKSkgeworI2Vsc2UgIC8qIExXSVBfU09fUkNWQlVGICovCisgIGlmICgoY29ubiA9PSBOVUxMKSB8fCAhc3lzX21ib3hfdmFsaWQoJmNvbm4tPnJlY3ZtYm94KSkgeworI2VuZGlmIC8qIExXSVBfU09fUkNWQlVGICovCisgICAgcGJ1Zl9mcmVlKHApOworICAgIHJldHVybjsKKyAgfQorCisgIGJ1ZiA9IChzdHJ1Y3QgbmV0YnVmICopbWVtcF9tYWxsb2MoTUVNUF9ORVRCVUYpOworICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICBwYnVmX2ZyZWUocCk7CisgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIGJ1Zi0+cCA9IHA7CisgICAgYnVmLT5wdHIgPSBwOworICAgIGlwX2FkZHJfc2V0KCZidWYtPmFkZHIsIGFkZHIpOworICAgIGJ1Zi0+cG9ydCA9IHBvcnQ7CisjaWYgTFdJUF9ORVRCVUZfUkVDVklORk8KKyAgICB7CisgICAgICBjb25zdCBzdHJ1Y3QgaXBfaGRyKiBpcGhkciA9IGlwX2N1cnJlbnRfaGVhZGVyKCk7CisgICAgICAvKiBnZXQgdGhlIFVEUCBoZWFkZXIgLSBhbHdheXMgaW4gdGhlIGZpcnN0IHBidWYsIGVuc3VyZWQgYnkgdWRwX2lucHV0ICovCisgICAgICBjb25zdCBzdHJ1Y3QgdWRwX2hkciogdWRwaGRyID0gKHZvaWQqKSgoKGNoYXIqKWlwaGRyKSArIElQSF9MRU4oaXBoZHIpKTsKKyNpZiBMV0lQX0NIRUNLU1VNX09OX0NPUFkKKyAgICAgIGJ1Zi0+ZmxhZ3MgPSBORVRCVUZfRkxBR19ERVNUQUREUjsKKyNlbmRpZiAvKiBMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KKyAgICAgIGlwX2FkZHJfc2V0KCZidWYtPnRvYWRkciwgaXBfY3VycmVudF9kZXN0X2FkZHIoKSk7CisgICAgICBidWYtPnRvcG9ydF9jaGtzdW0gPSB1ZHBoZHItPmRlc3Q7CisgICAgfQorI2VuZGlmIC8qIExXSVBfTkVUQlVGX1JFQ1ZJTkZPICovCisgIH0KKworICBsZW4gPSBwLT50b3RfbGVuOworICBpZiAoc3lzX21ib3hfdHJ5cG9zdCgmY29ubi0+cmVjdm1ib3gsIGJ1ZikgIT0gRVJSX09LKSB7CisgICAgbmV0YnVmX2RlbGV0ZShidWYpOworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyNpZiBMV0lQX1NPX1JDVkJVRgorICAgIFNZU19BUkNIX0lOQyhjb25uLT5yZWN2X2F2YWlsLCBsZW4pOworI2VuZGlmIC8qIExXSVBfU09fUkNWQlVGICovCisgICAgLyogUmVnaXN0ZXIgZXZlbnQgd2l0aCBjYWxsYmFjayAqLworICAgIEFQSV9FVkVOVChjb25uLCBORVRDT05OX0VWVF9SQ1ZQTFVTLCBsZW4pOworICB9Cit9CisjZW5kaWYgLyogTFdJUF9VRFAgKi8KKworI2lmIExXSVBfVENQCisvKioKKyAqIFJlY2VpdmUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIFRDUCBuZXRjb25ucy4KKyAqIFBvc3RzIHRoZSBwYWNrZXQgdG8gY29ubi0+cmVjdm1ib3gsIGJ1dCBkb2Vzbid0IGRlbGV0ZSBpdCBvbiBlcnJvcnMuCisgKgorICogQHNlZSB0Y3AuaCAoc3RydWN0IHRjcF9wY2IucmVjdikgZm9yIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZQorICovCitzdGF0aWMgZXJyX3QKK3JlY3ZfdGNwKHZvaWQgKmFyZywgc3RydWN0IHRjcF9wY2IgKnBjYiwgc3RydWN0IHBidWYgKnAsIGVycl90IGVycikKK3sKKyAgc3RydWN0IG5ldGNvbm4gKmNvbm47CisgIHUxNl90IGxlbjsKKworICBMV0lQX1VOVVNFRF9BUkcocGNiKTsKKyAgTFdJUF9BU1NFUlQoInJlY3ZfdGNwIG11c3QgaGF2ZSBhIHBjYiBhcmd1bWVudCIsIHBjYiAhPSBOVUxMKTsKKyAgTFdJUF9BU1NFUlQoInJlY3ZfdGNwIG11c3QgaGF2ZSBhbiBhcmd1bWVudCIsIGFyZyAhPSBOVUxMKTsKKyAgY29ubiA9IChzdHJ1Y3QgbmV0Y29ubiAqKWFyZzsKKyAgTFdJUF9BU1NFUlQoInJlY3ZfdGNwOiByZWN2IGZvciB3cm9uZyBwY2IhIiwgY29ubi0+cGNiLnRjcCA9PSBwY2IpOworCisgIGlmIChjb25uID09IE5VTEwpIHsKKyAgICByZXR1cm4gRVJSX1ZBTDsKKyAgfQorICBpZiAoIXN5c19tYm94X3ZhbGlkKCZjb25uLT5yZWN2bWJveCkpIHsKKyAgICAvKiByZWN2bWJveCBhbHJlYWR5IGRlbGV0ZWQgKi8KKyAgICBpZiAocCAhPSBOVUxMKSB7CisgICAgICB0Y3BfcmVjdmVkKHBjYiwgcC0+dG90X2xlbik7CisgICAgICBwYnVmX2ZyZWUocCk7CisgICAgfQorICAgIHJldHVybiBFUlJfT0s7CisgIH0KKyAgLyogVW5saWtlIGZvciBVRFAgb3IgUkFXIHBjYnMsIGRvbid0IGNoZWNrIGZvciBhdmFpbGFibGUgc3BhY2UKKyAgICAgdXNpbmcgcmVjdl9hdmFpbCBzaW5jZSB0aGF0IGNvdWxkIGJyZWFrIHRoZSBjb25uZWN0aW9uCisgICAgIChkYXRhIGlzIGFscmVhZHkgQUNLZWQpICovCisKKyAgLyogZG9uJ3Qgb3ZlcndyaXRlIGZhdGFsIGVycm9ycyEgKi8KKyAgTkVUQ09OTl9TRVRfU0FGRV9FUlIoY29ubiwgZXJyKTsKKworICBpZiAocCAhPSBOVUxMKSB7CisgICAgbGVuID0gcC0+dG90X2xlbjsKKyAgfSBlbHNlIHsKKyAgICBsZW4gPSAwOworICB9CisKKyAgaWYgKHN5c19tYm94X3RyeXBvc3QoJmNvbm4tPnJlY3ZtYm94LCBwKSAhPSBFUlJfT0spIHsKKyAgICAvKiBkb24ndCBkZWFsbG9jYXRlIHA6IGl0IGlzIHByZXNlbnRlZCB0byB1cyBsYXRlciBhZ2FpbiBmcm9tIHRjcF9mYXN0dG1yISAqLworICAgIHJldHVybiBFUlJfTUVNOworICB9IGVsc2UgeworI2lmIExXSVBfU09fUkNWQlVGCisgICAgU1lTX0FSQ0hfSU5DKGNvbm4tPnJlY3ZfYXZhaWwsIGxlbik7CisjZW5kaWYgLyogTFdJUF9TT19SQ1ZCVUYgKi8KKyAgICAvKiBSZWdpc3RlciBldmVudCB3aXRoIGNhbGxiYWNrICovCisgICAgQVBJX0VWRU5UKGNvbm4sIE5FVENPTk5fRVZUX1JDVlBMVVMsIGxlbik7CisgIH0KKworICByZXR1cm4gRVJSX09LOworfQorCisvKioKKyAqIFBvbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIFRDUCBuZXRjb25ucy4KKyAqIFdha2VzIHVwIGFuIGFwcGxpY2F0aW9uIHRocmVhZCB0aGF0IHdhaXRzIGZvciBhIGNvbm5lY3Rpb24gdG8gY2xvc2UKKyAqIG9yIGRhdGEgdG8gYmUgc2VudC4gVGhlIGFwcGxpY2F0aW9uIHRocmVhZCB0aGVuIHRha2VzIHRoZQorICogYXBwcm9wcmlhdGUgYWN0aW9uIHRvIGdvIG9uLgorICoKKyAqIFNpZ25hbHMgdGhlIGNvbm4tPnNlbS4KKyAqIG5ldGNvbm5fY2xvc2Ugd2FpdHMgZm9yIGNvbm4tPnNlbSBpZiBjbG9zaW5nIGZhaWxlZC4KKyAqCisgKiBAc2VlIHRjcC5oIChzdHJ1Y3QgdGNwX3BjYi5wb2xsKSBmb3IgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlCisgKi8KK3N0YXRpYyBlcnJfdAorcG9sbF90Y3Aodm9pZCAqYXJnLCBzdHJ1Y3QgdGNwX3BjYiAqcGNiKQoreworICBzdHJ1Y3QgbmV0Y29ubiAqY29ubiA9IChzdHJ1Y3QgbmV0Y29ubiAqKWFyZzsKKworICBMV0lQX1VOVVNFRF9BUkcocGNiKTsKKyAgTFdJUF9BU1NFUlQoImNvbm4gIT0gTlVMTCIsIChjb25uICE9IE5VTEwpKTsKKworICBpZiAoY29ubi0+c3RhdGUgPT0gTkVUQ09OTl9XUklURSkgeworICAgIGRvX3dyaXRlbW9yZShjb25uKTsKKyAgfSBlbHNlIGlmIChjb25uLT5zdGF0ZSA9PSBORVRDT05OX0NMT1NFKSB7CisgICAgZG9fY2xvc2VfaW50ZXJuYWwoY29ubik7CisgIH0KKyAgLyogQHRvZG86IGltcGxlbWVudCBjb25uZWN0IHRpbWVvdXQgaGVyZT8gKi8KKworICAvKiBEaWQgYSBub25ibG9ja2luZyB3cml0ZSBmYWlsIGJlZm9yZT8gVGhlbiBjaGVjayBhdmFpbGFibGUgd3JpdGUtc3BhY2UuICovCisgIGlmIChjb25uLT5mbGFncyAmIE5FVENPTk5fRkxBR19DSEVDS19XUklURVNQQUNFKSB7CisgICAgLyogSWYgdGhlIHF1ZXVlZCBieXRlLSBvciBwYnVmLWNvdW50IGRyb3BzIGJlbG93IHRoZSBjb25maWd1cmVkIGxvdy13YXRlciBsaW1pdCwKKyAgICAgICBsZXQgc2VsZWN0IG1hcmsgdGhpcyBwY2IgYXMgd3JpdGFibGUgYWdhaW4uICovCisgICAgaWYgKChjb25uLT5wY2IudGNwICE9IE5VTEwpICYmICh0Y3Bfc25kYnVmKGNvbm4tPnBjYi50Y3ApID4gVENQX1NORExPV0FUKSAmJgorICAgICAgKHRjcF9zbmRxdWV1ZWxlbihjb25uLT5wY2IudGNwKSA8IFRDUF9TTkRRVUVVRUxPV0FUKSkgeworICAgICAgY29ubi0+ZmxhZ3MgJj0gfk5FVENPTk5fRkxBR19DSEVDS19XUklURVNQQUNFOworICAgICAgQVBJX0VWRU5UKGNvbm4sIE5FVENPTk5fRVZUX1NFTkRQTFVTLCAwKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gRVJSX09LOworfQorCisvKioKKyAqIFNlbnQgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIFRDUCBuZXRjb25ucy4KKyAqIFNpZ25hbHMgdGhlIGNvbm4tPnNlbSBhbmQgY2FsbHMgQVBJX0VWRU5ULgorICogbmV0Y29ubl93cml0ZSB3YWl0cyBmb3IgY29ubi0+c2VtIGlmIHNlbmQgYnVmZmVyIGlzIGxvdy4KKyAqCisgKiBAc2VlIHRjcC5oIChzdHJ1Y3QgdGNwX3BjYi5zZW50KSBmb3IgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlCisgKi8KK3N0YXRpYyBlcnJfdAorc2VudF90Y3Aodm9pZCAqYXJnLCBzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB1MTZfdCBsZW4pCit7CisgIHN0cnVjdCBuZXRjb25uICpjb25uID0gKHN0cnVjdCBuZXRjb25uICopYXJnOworCisgIExXSVBfVU5VU0VEX0FSRyhwY2IpOworICBMV0lQX0FTU0VSVCgiY29ubiAhPSBOVUxMIiwgKGNvbm4gIT0gTlVMTCkpOworCisgIGlmIChjb25uLT5zdGF0ZSA9PSBORVRDT05OX1dSSVRFKSB7CisgICAgZG9fd3JpdGVtb3JlKGNvbm4pOworICB9IGVsc2UgaWYgKGNvbm4tPnN0YXRlID09IE5FVENPTk5fQ0xPU0UpIHsKKyAgICBkb19jbG9zZV9pbnRlcm5hbChjb25uKTsKKyAgfQorCisgIGlmIChjb25uKSB7CisgICAgLyogSWYgdGhlIHF1ZXVlZCBieXRlLSBvciBwYnVmLWNvdW50IGRyb3BzIGJlbG93IHRoZSBjb25maWd1cmVkIGxvdy13YXRlciBsaW1pdCwKKyAgICAgICBsZXQgc2VsZWN0IG1hcmsgdGhpcyBwY2IgYXMgd3JpdGFibGUgYWdhaW4uICovCisgICAgaWYgKChjb25uLT5wY2IudGNwICE9IE5VTEwpICYmICh0Y3Bfc25kYnVmKGNvbm4tPnBjYi50Y3ApID4gVENQX1NORExPV0FUKSAmJgorICAgICAgKHRjcF9zbmRxdWV1ZWxlbihjb25uLT5wY2IudGNwKSA8IFRDUF9TTkRRVUVVRUxPV0FUKSkgeworICAgICAgY29ubi0+ZmxhZ3MgJj0gfk5FVENPTk5fRkxBR19DSEVDS19XUklURVNQQUNFOworICAgICAgQVBJX0VWRU5UKGNvbm4sIE5FVENPTk5fRVZUX1NFTkRQTFVTLCBsZW4pOworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBFcnJvciBjYWxsYmFjayBmdW5jdGlvbiBmb3IgVENQIG5ldGNvbm5zLgorICogU2lnbmFscyBjb25uLT5zZW0sIHBvc3RzIHRvIGFsbCBjb25uIG1ib3hlcyBhbmQgY2FsbHMgQVBJX0VWRU5ULgorICogVGhlIGFwcGxpY2F0aW9uIHRocmVhZCBoYXMgdGhlbiB0byBkZWNpZGUgd2hhdCB0byBkby4KKyAqCisgKiBAc2VlIHRjcC5oIChzdHJ1Y3QgdGNwX3BjYi5lcnIpIGZvciBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkCitlcnJfdGNwKHZvaWQgKmFyZywgZXJyX3QgZXJyKQoreworICBzdHJ1Y3QgbmV0Y29ubiAqY29ubjsKKyAgZW51bSBuZXRjb25uX3N0YXRlIG9sZF9zdGF0ZTsKKyAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldik7CisKKyAgY29ubiA9IChzdHJ1Y3QgbmV0Y29ubiAqKWFyZzsKKyAgTFdJUF9BU1NFUlQoImNvbm4gIT0gTlVMTCIsIChjb25uICE9IE5VTEwpKTsKKworICBjb25uLT5wY2IudGNwID0gTlVMTDsKKworICAvKiBubyBjaGVjayBzaW5jZSB0aGlzIGlzIGFsd2F5cyBmYXRhbCEgKi8KKyAgU1lTX0FSQ0hfUFJPVEVDVChsZXYpOworICBjb25uLT5sYXN0X2VyciA9IGVycjsKKyAgU1lTX0FSQ0hfVU5QUk9URUNUKGxldik7CisKKyAgLyogcmVzZXQgY29ubi0+c3RhdGUgbm93IGJlZm9yZSB3YWtpbmcgdXAgb3RoZXIgdGhyZWFkcyAqLworICBvbGRfc3RhdGUgPSBjb25uLT5zdGF0ZTsKKyAgY29ubi0+c3RhdGUgPSBORVRDT05OX05PTkU7CisKKyAgLyogTm90aWZ5IHRoZSB1c2VyIGxheWVyIGFib3V0IGEgY29ubmVjdGlvbiBlcnJvci4gVXNlZCB0byBzaWduYWwKKyAgICAgc2VsZWN0LiAqLworICBBUElfRVZFTlQoY29ubiwgTkVUQ09OTl9FVlRfRVJST1IsIDApOworICAvKiBUcnkgdG8gcmVsZWFzZSBzZWxlY3RzIHBlbmRpbmcgb24gJ3JlYWQnIG9yICd3cml0ZScsIHRvby4KKyAgICAgVGhleSB3aWxsIGdldCBhbiBlcnJvciBpZiB0aGV5IGFjdHVhbGx5IHRyeSB0byByZWFkIG9yIHdyaXRlLiAqLworICBBUElfRVZFTlQoY29ubiwgTkVUQ09OTl9FVlRfUkNWUExVUywgMCk7CisgIEFQSV9FVkVOVChjb25uLCBORVRDT05OX0VWVF9TRU5EUExVUywgMCk7CisKKyAgLyogcGFzcyBOVUxMLW1lc3NhZ2UgdG8gcmVjdm1ib3ggdG8gd2FrZSB1cCBwZW5kaW5nIHJlY3YgKi8KKyAgaWYgKHN5c19tYm94X3ZhbGlkKCZjb25uLT5yZWN2bWJveCkpIHsKKyAgICAvKiB1c2UgdHJ5cG9zdCB0byBwcmV2ZW50IGRlYWRsb2NrICovCisgICAgc3lzX21ib3hfdHJ5cG9zdCgmY29ubi0+cmVjdm1ib3gsIE5VTEwpOworICB9CisgIC8qIHBhc3MgTlVMTC1tZXNzYWdlIHRvIGFjY2VwdG1ib3ggdG8gd2FrZSB1cCBwZW5kaW5nIGFjY2VwdCAqLworICBpZiAoc3lzX21ib3hfdmFsaWQoJmNvbm4tPmFjY2VwdG1ib3gpKSB7CisgICAgLyogdXNlIHRyeXBvc3QgdG8gcHJldmVuIGRlYWRsb2NrICovCisgICAgc3lzX21ib3hfdHJ5cG9zdCgmY29ubi0+YWNjZXB0bWJveCwgTlVMTCk7CisgIH0KKworICBpZiAoKG9sZF9zdGF0ZSA9PSBORVRDT05OX1dSSVRFKSB8fCAob2xkX3N0YXRlID09IE5FVENPTk5fQ0xPU0UpIHx8CisgICAgICAob2xkX3N0YXRlID09IE5FVENPTk5fQ09OTkVDVCkpIHsKKyAgICAvKiBjYWxsaW5nIGRvX3dyaXRlbW9yZS9kb19jbG9zZV9pbnRlcm5hbCBpcyBub3QgbmVjZXNzYXJ5CisgICAgICAgc2luY2UgdGhlIHBjYiBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQhICovCisgICAgaW50IHdhc19ub25ibG9ja2luZ19jb25uZWN0ID0gSU5fTk9OQkxPQ0tJTkdfQ09OTkVDVChjb25uKTsKKyAgICBTRVRfTk9OQkxPQ0tJTkdfQ09OTkVDVChjb25uLCAwKTsKKworICAgIGlmICghd2FzX25vbmJsb2NraW5nX2Nvbm5lY3QpIHsKKyAgICAgIC8qIHNldCBlcnJvciByZXR1cm4gY29kZSAqLworICAgICAgTFdJUF9BU1NFUlQoImNvbm4tPmN1cnJlbnRfbXNnICE9IE5VTEwiLCBjb25uLT5jdXJyZW50X21zZyAhPSBOVUxMKTsKKyAgICAgIGNvbm4tPmN1cnJlbnRfbXNnLT5lcnIgPSBlcnI7CisgICAgICBjb25uLT5jdXJyZW50X21zZyA9IE5VTEw7CisgICAgICAvKiB3YWtlIHVwIHRoZSB3YWl0aW5nIHRhc2sgKi8KKyAgICAgIHN5c19zZW1fc2lnbmFsKCZjb25uLT5vcF9jb21wbGV0ZWQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBMV0lQX0FTU0VSVCgiY29ubi0+Y3VycmVudF9tc2cgPT0gTlVMTCIsIGNvbm4tPmN1cnJlbnRfbXNnID09IE5VTEwpOworICB9Cit9CisKKy8qKgorICogU2V0dXAgYSB0Y3BfcGNiIHdpdGggdGhlIGNvcnJlY3QgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcnMKKyAqIGFuZCB0aGVpciBhcmd1bWVudHMuCisgKgorICogQHBhcmFtIGNvbm4gdGhlIFRDUCBuZXRjb25uIHRvIHNldHVwCisgKi8KK3N0YXRpYyB2b2lkCitzZXR1cF90Y3Aoc3RydWN0IG5ldGNvbm4gKmNvbm4pCit7CisgIHN0cnVjdCB0Y3BfcGNiICpwY2I7CisKKyAgcGNiID0gY29ubi0+cGNiLnRjcDsKKyAgdGNwX2FyZyhwY2IsIGNvbm4pOworICB0Y3BfcmVjdihwY2IsIHJlY3ZfdGNwKTsKKyAgdGNwX3NlbnQocGNiLCBzZW50X3RjcCk7CisgIHRjcF9wb2xsKHBjYiwgcG9sbF90Y3AsIDQpOworICB0Y3BfZXJyKHBjYiwgZXJyX3RjcCk7Cit9CisKKy8qKgorICogQWNjZXB0IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBUQ1AgbmV0Y29ubnMuCisgKiBBbGxvY2F0ZXMgYSBuZXcgbmV0Y29ubiBhbmQgcG9zdHMgdGhhdCB0byBjb25uLT5hY2NlcHRtYm94LgorICoKKyAqIEBzZWUgdGNwLmggKHN0cnVjdCB0Y3BfcGNiX2xpc3Rlbi5hY2NlcHQpIGZvciBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWUKKyAqLworc3RhdGljIGVycl90CithY2NlcHRfZnVuY3Rpb24odm9pZCAqYXJnLCBzdHJ1Y3QgdGNwX3BjYiAqbmV3cGNiLCBlcnJfdCBlcnIpCit7CisgIHN0cnVjdCBuZXRjb25uICpuZXdjb25uOworICBzdHJ1Y3QgbmV0Y29ubiAqY29ubiA9IChzdHJ1Y3QgbmV0Y29ubiAqKWFyZzsKKworICBMV0lQX0RFQlVHRihBUElfTVNHX0RFQlVHLCAoImFjY2VwdF9mdW5jdGlvbjogbmV3cGNiLT50YXRlOiAlc1xuIiwgdGNwX2RlYnVnX3N0YXRlX3N0cihuZXdwY2ItPnN0YXRlKSkpOworCisgIGlmICghc3lzX21ib3hfdmFsaWQoJmNvbm4tPmFjY2VwdG1ib3gpKSB7CisgICAgTFdJUF9ERUJVR0YoQVBJX01TR19ERUJVRywgKCJhY2NlcHRfZnVuY3Rpb246IGFjY2VwdG1ib3ggYWxyZWFkeSBkZWxldGVkXG4iKSk7CisgICAgcmV0dXJuIEVSUl9WQUw7CisgIH0KKworICAvKiBXZSBoYXZlIHRvIHNldCB0aGUgY2FsbGJhY2sgaGVyZSBldmVuIHRob3VnaAorICAgKiB0aGUgbmV3IHNvY2tldCBpcyB1bmtub3duLiBjb25uLT5zb2NrZXQgaXMgbWFya2VkIGFzIC0xLiAqLworICBuZXdjb25uID0gbmV0Y29ubl9hbGxvYyhjb25uLT50eXBlLCBjb25uLT5jYWxsYmFjayk7CisgIGlmIChuZXdjb25uID09IE5VTEwpIHsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorICBuZXdjb25uLT5wY2IudGNwID0gbmV3cGNiOworICBzZXR1cF90Y3AobmV3Y29ubik7CisgIC8qIG5vIHByb3RlY3Rpb246IHdoZW4gY3JlYXRpbmcgdGhlIHBjYiwgdGhlIG5ldGNvbm4gaXMgbm90IHlldCBrbm93bgorICAgICB0byB0aGUgYXBwbGljYXRpb24gdGhyZWFkICovCisgIG5ld2Nvbm4tPmxhc3RfZXJyID0gZXJyOworCisgIGlmIChzeXNfbWJveF90cnlwb3N0KCZjb25uLT5hY2NlcHRtYm94LCBuZXdjb25uKSAhPSBFUlJfT0spIHsKKyAgICAvKiBXaGVuIHJldHVybmluZyAhPSBFUlJfT0ssIHRoZSBwY2IgaXMgYWJvcnRlZCBpbiB0Y3BfcHJvY2VzcygpLAorICAgICAgIHNvIGRvIG5vdGhpbmcgaGVyZSEgKi8KKyAgICBuZXdjb25uLT5wY2IudGNwID0gTlVMTDsKKyAgICAvKiBubyBuZWVkIHRvIGRyYWluIHNpbmNlIHdlIGtub3cgdGhlIHJlY3ZtYm94IGlzIGVtcHR5LiAqLworICAgIHN5c19tYm94X2ZyZWUoJm5ld2Nvbm4tPnJlY3ZtYm94KTsKKyAgICBzeXNfbWJveF9zZXRfaW52YWxpZCgmbmV3Y29ubi0+cmVjdm1ib3gpOworICAgIG5ldGNvbm5fZnJlZShuZXdjb25uKTsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfSBlbHNlIHsKKyAgICAvKiBSZWdpc3RlciBldmVudCB3aXRoIGNhbGxiYWNrICovCisgICAgQVBJX0VWRU5UKGNvbm4sIE5FVENPTk5fRVZUX1JDVlBMVVMsIDApOworICB9CisKKyAgcmV0dXJuIEVSUl9PSzsKK30KKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBwY2Igb2YgYSBzcGVjaWZpYyB0eXBlLgorICogQ2FsbGVkIGZyb20gZG9fbmV3Y29ubigpLgorICoKKyAqIEBwYXJhbSBtc2cgdGhlIGFwaV9tc2dfbXNnIGRlc2NyaWJpbmcgdGhlIGNvbm5lY3Rpb24gdHlwZQorICogQHJldHVybiBtc2ctPmNvbm4tPmVyciwgYnV0IHRoZSByZXR1cm4gdmFsdWUgaXMgY3VycmVudGx5IGlnbm9yZWQKKyAqLworc3RhdGljIHZvaWQKK3BjYl9uZXcoc3RydWN0IGFwaV9tc2dfbXNnICptc2cpCit7CisgIExXSVBfQVNTRVJUKCJwY2JfbmV3OiBwY2IgYWxyZWFkeSBhbGxvY2F0ZWQiLCBtc2ctPmNvbm4tPnBjYi50Y3AgPT0gTlVMTCk7CisKKyAgLyogQWxsb2NhdGUgYSBQQ0IgZm9yIHRoaXMgY29ubmVjdGlvbiAqLworICBzd2l0Y2goTkVUQ09OTlRZUEVfR1JPVVAobXNnLT5jb25uLT50eXBlKSkgeworI2lmIExXSVBfUkFXCisgIGNhc2UgTkVUQ09OTl9SQVc6CisgICAgbXNnLT5jb25uLT5wY2IucmF3ID0gcmF3X25ldyhtc2ctPm1zZy5uLnByb3RvKTsKKyAgICBpZihtc2ctPmNvbm4tPnBjYi5yYXcgPT0gTlVMTCkgeworICAgICAgbXNnLT5lcnIgPSBFUlJfTUVNOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHJhd19yZWN2KG1zZy0+Y29ubi0+cGNiLnJhdywgcmVjdl9yYXcsIG1zZy0+Y29ubik7CisgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9SQVcgKi8KKyNpZiBMV0lQX1VEUAorICBjYXNlIE5FVENPTk5fVURQOgorICAgIG1zZy0+Y29ubi0+cGNiLnVkcCA9IHVkcF9uZXcoKTsKKyAgICBpZihtc2ctPmNvbm4tPnBjYi51ZHAgPT0gTlVMTCkgeworICAgICAgbXNnLT5lcnIgPSBFUlJfTUVNOworICAgICAgYnJlYWs7CisgICAgfQorI2lmIExXSVBfVURQTElURQorICAgIGlmIChtc2ctPmNvbm4tPnR5cGU9PU5FVENPTk5fVURQTElURSkgeworICAgICAgdWRwX3NldGZsYWdzKG1zZy0+Y29ubi0+cGNiLnVkcCwgVURQX0ZMQUdTX1VEUExJVEUpOworICAgIH0KKyNlbmRpZiAvKiBMV0lQX1VEUExJVEUgKi8KKyAgICBpZiAobXNnLT5jb25uLT50eXBlPT1ORVRDT05OX1VEUE5PQ0hLU1VNKSB7CisgICAgICB1ZHBfc2V0ZmxhZ3MobXNnLT5jb25uLT5wY2IudWRwLCBVRFBfRkxBR1NfTk9DSEtTVU0pOworICAgIH0KKyAgICB1ZHBfcmVjdihtc2ctPmNvbm4tPnBjYi51ZHAsIHJlY3ZfdWRwLCBtc2ctPmNvbm4pOworICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVURQICovCisjaWYgTFdJUF9UQ1AKKyAgY2FzZSBORVRDT05OX1RDUDoKKyAgICBtc2ctPmNvbm4tPnBjYi50Y3AgPSB0Y3BfbmV3KCk7CisgICAgaWYobXNnLT5jb25uLT5wY2IudGNwID09IE5VTEwpIHsKKyAgICAgIG1zZy0+ZXJyID0gRVJSX01FTTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzZXR1cF90Y3AobXNnLT5jb25uKTsKKyAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworICBkZWZhdWx0OgorICAgIC8qIFVuc3VwcG9ydGVkIG5ldGNvbm4gdHlwZSwgZS5nLiBwcm90b2NvbCBkaXNhYmxlZCAqLworICAgIG1zZy0+ZXJyID0gRVJSX1ZBTDsKKyAgICBicmVhazsKKyAgfQorfQorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBwY2Igb2YgYSBzcGVjaWZpYyB0eXBlIGluc2lkZSBhIG5ldGNvbm4uCisgKiBDYWxsZWQgZnJvbSBuZXRjb25uX25ld193aXRoX3Byb3RvX2FuZF9jYWxsYmFjay4KKyAqCisgKiBAcGFyYW0gbXNnIHRoZSBhcGlfbXNnX21zZyBkZXNjcmliaW5nIHRoZSBjb25uZWN0aW9uIHR5cGUKKyAqLwordm9pZAorZG9fbmV3Y29ubihzdHJ1Y3QgYXBpX21zZ19tc2cgKm1zZykKK3sKKyAgbXNnLT5lcnIgPSBFUlJfT0s7CisgIGlmKG1zZy0+Y29ubi0+cGNiLnRjcCA9PSBOVUxMKSB7CisgICAgcGNiX25ldyhtc2cpOworICB9CisgIC8qIEVsc2U/IFRoaXMgIm5ldyIgY29ubmVjdGlvbiBhbHJlYWR5IGhhcyBhIFBDQiBhbGxvY2F0ZWQuICovCisgIC8qIElzIHRoaXMgYW4gZXJyb3IgY29uZGl0aW9uPyBTaG91bGQgaXQgYmUgZGVsZXRlZD8gKi8KKyAgLyogV2UgY3VycmVudGx5IGp1c3QgYXJlIGhhcHB5IGFuZCByZXR1cm4uICovCisKKyAgVENQSVBfQVBJTVNHX0FDSyhtc2cpOworfQorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBuZXRjb25uIChvZiBhIHNwZWNpZmljIHR5cGUpIHRoYXQgaGFzIGEgY2FsbGJhY2sgZnVuY3Rpb24uCisgKiBUaGUgY29ycmVzcG9uZGluZyBwY2IgaXMgTk9UIGNyZWF0ZWQhCisgKgorICogQHBhcmFtIHQgdGhlIHR5cGUgb2YgJ2Nvbm5lY3Rpb24nIHRvIGNyZWF0ZSAoQHNlZSBlbnVtIG5ldGNvbm5fdHlwZSkKKyAqIEBwYXJhbSBwcm90byB0aGUgSVAgcHJvdG9jb2wgZm9yIFJBVyBJUCBwY2JzCisgKiBAcGFyYW0gY2FsbGJhY2sgYSBmdW5jdGlvbiB0byBjYWxsIG9uIHN0YXR1cyBjaGFuZ2VzIChSWCBhdmFpbGFibGUsIFRYJ2VkKQorICogQHJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBzdHJ1Y3QgbmV0Y29ubiBvcgorICogICAgICAgICBOVUxMIG9uIG1lbW9yeSBlcnJvcgorICovCitzdHJ1Y3QgbmV0Y29ubioKK25ldGNvbm5fYWxsb2MoZW51bSBuZXRjb25uX3R5cGUgdCwgbmV0Y29ubl9jYWxsYmFjayBjYWxsYmFjaykKK3sKKyAgc3RydWN0IG5ldGNvbm4gKmNvbm47CisgIGludCBzaXplOworCisgIGNvbm4gPSAoc3RydWN0IG5ldGNvbm4gKiltZW1wX21hbGxvYyhNRU1QX05FVENPTk4pOworICBpZiAoY29ubiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjb25uLT5sYXN0X2VyciA9IEVSUl9PSzsKKyAgY29ubi0+dHlwZSA9IHQ7CisgIGNvbm4tPnBjYi50Y3AgPSBOVUxMOworCisjaWYgKERFRkFVTFRfUkFXX1JFQ1ZNQk9YX1NJWkUgPT0gREVGQVVMVF9VRFBfUkVDVk1CT1hfU0laRSkgJiYgXAorICAgIChERUZBVUxUX1JBV19SRUNWTUJPWF9TSVpFID09IERFRkFVTFRfVENQX1JFQ1ZNQk9YX1NJWkUpCisgIHNpemUgPSBERUZBVUxUX1JBV19SRUNWTUJPWF9TSVpFOworI2Vsc2UKKyAgc3dpdGNoKE5FVENPTk5UWVBFX0dST1VQKHQpKSB7CisjaWYgTFdJUF9SQVcKKyAgY2FzZSBORVRDT05OX1JBVzoKKyAgICBzaXplID0gREVGQVVMVF9SQVdfUkVDVk1CT1hfU0laRTsKKyAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1JBVyAqLworI2lmIExXSVBfVURQCisgIGNhc2UgTkVUQ09OTl9VRFA6CisgICAgc2l6ZSA9IERFRkFVTFRfVURQX1JFQ1ZNQk9YX1NJWkU7CisgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9VRFAgKi8KKyNpZiBMV0lQX1RDUAorICBjYXNlIE5FVENPTk5fVENQOgorICAgIHNpemUgPSBERUZBVUxUX1RDUF9SRUNWTUJPWF9TSVpFOworICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVENQICovCisgIGRlZmF1bHQ6CisgICAgTFdJUF9BU1NFUlQoIm5ldGNvbm5fYWxsb2M6IHVuZGVmaW5lZCBuZXRjb25uX3R5cGUiLCAwKTsKKyAgICBicmVhazsKKyAgfQorI2VuZGlmCisKKyAgaWYgKHN5c19zZW1fbmV3KCZjb25uLT5vcF9jb21wbGV0ZWQsIDApICE9IEVSUl9PSykgeworICAgIG1lbXBfZnJlZShNRU1QX05FVENPTk4sIGNvbm4pOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzeXNfbWJveF9uZXcoJmNvbm4tPnJlY3ZtYm94LCBzaXplKSAhPSBFUlJfT0spIHsKKyAgICBzeXNfc2VtX2ZyZWUoJmNvbm4tPm9wX2NvbXBsZXRlZCk7CisgICAgbWVtcF9mcmVlKE1FTVBfTkVUQ09OTiwgY29ubik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworI2lmIExXSVBfVENQCisgIHN5c19tYm94X3NldF9pbnZhbGlkKCZjb25uLT5hY2NlcHRtYm94KTsKKyNlbmRpZgorICBjb25uLT5zdGF0ZSAgICAgICAgPSBORVRDT05OX05PTkU7CisjaWYgTFdJUF9TT0NLRVQKKyAgLyogaW5pdGlhbGl6ZSBzb2NrZXQgdG8gLTEgc2luY2UgMCBpcyBhIHZhbGlkIHNvY2tldCAqLworICBjb25uLT5zb2NrZXQgICAgICAgPSAtMTsKKyNlbmRpZiAvKiBMV0lQX1NPQ0tFVCAqLworICBjb25uLT5jYWxsYmFjayAgICAgPSBjYWxsYmFjazsKKyNpZiBMV0lQX1RDUAorICBjb25uLT5jdXJyZW50X21zZyAgPSBOVUxMOworICBjb25uLT53cml0ZV9vZmZzZXQgPSAwOworI2VuZGlmIC8qIExXSVBfVENQICovCisjaWYgTFdJUF9TT19SQ1ZUSU1FTworICBjb25uLT5yZWN2X3RpbWVvdXQgPSAwOworI2VuZGlmIC8qIExXSVBfU09fUkNWVElNRU8gKi8KKyNpZiBMV0lQX1NPX1JDVkJVRgorICBjb25uLT5yZWN2X2J1ZnNpemUgPSBSRUNWX0JVRlNJWkVfREVGQVVMVDsKKyAgY29ubi0+cmVjdl9hdmFpbCAgID0gMDsKKyNlbmRpZiAvKiBMV0lQX1NPX1JDVkJVRiAqLworICBjb25uLT5mbGFncyA9IDA7CisgIHJldHVybiBjb25uOworfQorCisvKioKKyAqIERlbGV0ZSBhIG5ldGNvbm4gYW5kIGFsbCBpdHMgcmVzb3VyY2VzLgorICogVGhlIHBjYiBpcyBOT1QgZnJlZWQgKHNpbmNlIHdlIG1pZ2h0IG5vdCBiZSBpbiB0aGUgcmlnaHQgdGhyZWFkIGNvbnRleHQgZG8gdGhpcykuCisgKgorICogQHBhcmFtIGNvbm4gdGhlIG5ldGNvbm4gdG8gZnJlZQorICovCit2b2lkCituZXRjb25uX2ZyZWUoc3RydWN0IG5ldGNvbm4gKmNvbm4pCit7CisgIExXSVBfQVNTRVJUKCJQQ0IgbXVzdCBiZSBkZWFsbG9jYXRlZCBvdXRzaWRlIHRoaXMgZnVuY3Rpb24iLCBjb25uLT5wY2IudGNwID09IE5VTEwpOworICBMV0lQX0FTU0VSVCgicmVjdm1ib3ggbXVzdCBiZSBkZWFsbG9jYXRlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIiwKKyAgICAhc3lzX21ib3hfdmFsaWQoJmNvbm4tPnJlY3ZtYm94KSk7CisjaWYgTFdJUF9UQ1AKKyAgTFdJUF9BU1NFUlQoImFjY2VwdG1ib3ggbXVzdCBiZSBkZWFsbG9jYXRlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIiwKKyAgICAhc3lzX21ib3hfdmFsaWQoJmNvbm4tPmFjY2VwdG1ib3gpKTsKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworCisgIHN5c19zZW1fZnJlZSgmY29ubi0+b3BfY29tcGxldGVkKTsKKyAgc3lzX3NlbV9zZXRfaW52YWxpZCgmY29ubi0+b3BfY29tcGxldGVkKTsKKworICBtZW1wX2ZyZWUoTUVNUF9ORVRDT05OLCBjb25uKTsKK30KKworLyoqCisgKiBEZWxldGUgcmN2bWJveCBhbmQgYWNjZXB0bWJveCBvZiBhIG5ldGNvbm4gYW5kIGZyZWUgdGhlIGxlZnQtb3ZlciBkYXRhIGluCisgKiB0aGVzZSBtYm94ZXMKKyAqCisgKiBAcGFyYW0gY29ubiB0aGUgbmV0Y29ubiB0byBmcmVlCisgKiBAYnl0ZXNfZHJhaW5lZCBieXRlcyBkcmFpbmVkIGZyb20gcmVjdm1ib3gKKyAqIEBhY2NlcHRzX2RyYWluZWQgcGVuZGluZyBjb25uZWN0aW9ucyBkcmFpbmVkIGZyb20gYWNjZXB0bWJveAorICovCitzdGF0aWMgdm9pZAorbmV0Y29ubl9kcmFpbihzdHJ1Y3QgbmV0Y29ubiAqY29ubikKK3sKKyAgdm9pZCAqbWVtOworI2lmIExXSVBfVENQCisgIHN0cnVjdCBwYnVmICpwOworI2VuZGlmIC8qIExXSVBfVENQICovCisKKyAgLyogVGhpcyBydW5zIGluIHRjcGlwX3RocmVhZCwgc28gd2UgZG9uJ3QgbmVlZCB0byBsb2NrIGFnYWluc3QgcnggcGFja2V0cyAqLworCisgIC8qIERlbGV0ZSBhbmQgZHJhaW4gdGhlIHJlY3ZtYm94LiAqLworICBpZiAoc3lzX21ib3hfdmFsaWQoJmNvbm4tPnJlY3ZtYm94KSkgeworICAgIHdoaWxlIChzeXNfbWJveF90cnlmZXRjaCgmY29ubi0+cmVjdm1ib3gsICZtZW0pICE9IFNZU19NQk9YX0VNUFRZKSB7CisjaWYgTFdJUF9UQ1AKKyAgICAgIGlmIChjb25uLT50eXBlID09IE5FVENPTk5fVENQKSB7CisgICAgICAgIGlmKG1lbSAhPSBOVUxMKSB7CisgICAgICAgICAgcCA9IChzdHJ1Y3QgcGJ1ZiopbWVtOworICAgICAgICAgIC8qIHBjYiBtaWdodCBiZSBzZXQgdG8gTlVMTCBhbHJlYWR5IGJ5IGVycl90Y3AoKSAqLworICAgICAgICAgIGlmIChjb25uLT5wY2IudGNwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRjcF9yZWN2ZWQoY29ubi0+cGNiLnRjcCwgcC0+dG90X2xlbik7CisgICAgICAgICAgfQorICAgICAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlCisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKyAgICAgIHsKKyAgICAgICAgbmV0YnVmX2RlbGV0ZSgoc3RydWN0IG5ldGJ1ZiAqKW1lbSk7CisgICAgICB9CisgICAgfQorICAgIHN5c19tYm94X2ZyZWUoJmNvbm4tPnJlY3ZtYm94KTsKKyAgICBzeXNfbWJveF9zZXRfaW52YWxpZCgmY29ubi0+cmVjdm1ib3gpOworICB9CisKKyAgLyogRGVsZXRlIGFuZCBkcmFpbiB0aGUgYWNjZXB0bWJveC4gKi8KKyNpZiBMV0lQX1RDUAorICBpZiAoc3lzX21ib3hfdmFsaWQoJmNvbm4tPmFjY2VwdG1ib3gpKSB7CisgICAgd2hpbGUgKHN5c19tYm94X3RyeWZldGNoKCZjb25uLT5hY2NlcHRtYm94LCAmbWVtKSAhPSBTWVNfTUJPWF9FTVBUWSkgeworICAgICAgc3RydWN0IG5ldGNvbm4gKm5ld2Nvbm4gPSAoc3RydWN0IG5ldGNvbm4gKiltZW07CisgICAgICAvKiBPbmx5IHRjcCBwY2JzIGhhdmUgYW4gYWNjZXB0bWJveCwgc28gbm8gbmVlZCB0byBjaGVjayBjb25uLT50eXBlICovCisgICAgICAvKiBwY2IgbWlnaHQgYmUgc2V0IHRvIE5VTEwgYWxyZWFkeSBieSBlcnJfdGNwKCkgKi8KKyAgICAgIGlmIChjb25uLT5wY2IudGNwICE9IE5VTEwpIHsKKyAgICAgICAgdGNwX2FjY2VwdGVkKGNvbm4tPnBjYi50Y3ApOworICAgICAgfQorICAgICAgLyogZHJhaW4gcmVjdm1ib3ggKi8KKyAgICAgIG5ldGNvbm5fZHJhaW4obmV3Y29ubik7CisgICAgICBpZiAobmV3Y29ubi0+cGNiLnRjcCAhPSBOVUxMKSB7CisgICAgICAgIHRjcF9hYm9ydChuZXdjb25uLT5wY2IudGNwKTsKKyAgICAgICAgbmV3Y29ubi0+cGNiLnRjcCA9IE5VTEw7CisgICAgICB9CisgICAgICBuZXRjb25uX2ZyZWUobmV3Y29ubik7CisgICAgfQorICAgIHN5c19tYm94X2ZyZWUoJmNvbm4tPmFjY2VwdG1ib3gpOworICAgIHN5c19tYm94X3NldF9pbnZhbGlkKCZjb25uLT5hY2NlcHRtYm94KTsKKyAgfQorI2VuZGlmIC8qIExXSVBfVENQICovCit9CisKKyNpZiBMV0lQX1RDUAorLyoqCisgKiBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdG8gY2xvc2UgYSBUQ1AgbmV0Y29ubjogc2luY2UgdGhpcyBzb21ldGltZXMKKyAqIGRvZXNuJ3Qgd29yayBhdCB0aGUgZmlyc3QgYXR0ZW1wdCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBtdWx0aXBsZQorICogcGxhY2VzLgorICoKKyAqIEBwYXJhbSBjb25uIHRoZSBUQ1AgbmV0Y29ubiB0byBjbG9zZQorICovCitzdGF0aWMgdm9pZAorZG9fY2xvc2VfaW50ZXJuYWwoc3RydWN0IG5ldGNvbm4gKmNvbm4pCit7CisgIGVycl90IGVycjsKKyAgdThfdCBzaHV0LCBzaHV0X3J4LCBzaHV0X3R4LCBjbG9zZTsKKworICBMV0lQX0FTU0VSVCgiaW52YWxpZCBjb25uIiwgKGNvbm4gIT0gTlVMTCkpOworICBMV0lQX0FTU0VSVCgidGhpcyBpcyBmb3IgdGNwIG5ldGNvbm5zIG9ubHkiLCAoY29ubi0+dHlwZSA9PSBORVRDT05OX1RDUCkpOworICBMV0lQX0FTU0VSVCgiY29ubiBtdXN0IGJlIGluIHN0YXRlIE5FVENPTk5fQ0xPU0UiLCAoY29ubi0+c3RhdGUgPT0gTkVUQ09OTl9DTE9TRSkpOworICBMV0lQX0FTU0VSVCgicGNiIGFscmVhZHkgY2xvc2VkIiwgKGNvbm4tPnBjYi50Y3AgIT0gTlVMTCkpOworICBMV0lQX0FTU0VSVCgiY29ubi0+Y3VycmVudF9tc2cgIT0gTlVMTCIsIGNvbm4tPmN1cnJlbnRfbXNnICE9IE5VTEwpOworCisgIHNodXQgPSBjb25uLT5jdXJyZW50X21zZy0+bXNnLnNkLnNodXQ7CisgIHNodXRfcnggPSBzaHV0ICYgTkVUQ09OTl9TSFVUX1JEOworICBzaHV0X3R4ID0gc2h1dCAmIE5FVENPTk5fU0hVVF9XUjsKKyAgLyogc2h1dHRpbmcgZG93biBib3RoIGVuZHMgaXMgdGhlIHNhbWUgYXMgY2xvc2luZyAqLworICBjbG9zZSA9IHNodXQgPT0gTkVUQ09OTl9TSFVUX1JEV1I7CisKKyAgLyogU2V0IGJhY2sgc29tZSBjYWxsYmFjayBwb2ludGVycyAqLworICBpZiAoY2xvc2UpIHsKKyAgICB0Y3BfYXJnKGNvbm4tPnBjYi50Y3AsIE5VTEwpOworICB9CisgIGlmIChjb25uLT5wY2IudGNwLT5zdGF0ZSA9PSBMSVNURU4pIHsKKyAgICB0Y3BfYWNjZXB0KGNvbm4tPnBjYi50Y3AsIE5VTEwpOworICB9IGVsc2UgeworICAgIC8qIHNvbWUgY2FsbGJhY2tzIGhhdmUgdG8gYmUgcmVzZXQgaWYgdGNwX2Nsb3NlIGlzIG5vdCBzdWNjZXNzZnVsICovCisgICAgaWYgKHNodXRfcngpIHsKKyAgICAgIHRjcF9yZWN2KGNvbm4tPnBjYi50Y3AsIE5VTEwpOworICAgICAgdGNwX2FjY2VwdChjb25uLT5wY2IudGNwLCBOVUxMKTsKKyAgICB9CisgICAgaWYgKHNodXRfdHgpIHsKKyAgICAgIHRjcF9zZW50KGNvbm4tPnBjYi50Y3AsIE5VTEwpOworICAgIH0KKyAgICBpZiAoY2xvc2UpIHsKKyAgICAgIHRjcF9wb2xsKGNvbm4tPnBjYi50Y3AsIE5VTEwsIDQpOworICAgICAgdGNwX2Vycihjb25uLT5wY2IudGNwLCBOVUxMKTsKKyAgICB9CisgIH0KKyAgLyogVHJ5IHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uICovCisgIGlmIChzaHV0ID09IE5FVENPTk5fU0hVVF9SRFdSKSB7CisgICAgZXJyID0gdGNwX2Nsb3NlKGNvbm4tPnBjYi50Y3ApOworICB9IGVsc2UgeworICAgIGVyciA9IHRjcF9zaHV0ZG93bihjb25uLT5wY2IudGNwLCBzaHV0ICYgTkVUQ09OTl9TSFVUX1JELCBzaHV0ICYgTkVUQ09OTl9TSFVUX1dSKTsKKyAgfQorICBpZiAoZXJyID09IEVSUl9PSykgeworICAgIC8qIENsb3Npbmcgc3VjY2VlZGVkICovCisgICAgY29ubi0+Y3VycmVudF9tc2ctPmVyciA9IEVSUl9PSzsKKyAgICBjb25uLT5jdXJyZW50X21zZyA9IE5VTEw7CisgICAgY29ubi0+c3RhdGUgPSBORVRDT05OX05PTkU7CisgICAgLyogU2V0IGJhY2sgc29tZSBjYWxsYmFjayBwb2ludGVycyBhcyBjb25uIGlzIGdvaW5nIGF3YXkgKi8KKyAgICBjb25uLT5wY2IudGNwID0gTlVMTDsKKyAgICAvKiBUcmlnZ2VyIHNlbGVjdCgpIGluIHNvY2tldCBsYXllci4gTWFrZSBzdXJlIGV2ZXJ5Ym9keSBub3RpY2VzIGFjdGl2aXR5CisgICAgICAgb24gdGhlIGNvbm5lY3Rpb24sIGVycm9yIGZpcnN0ISAqLworICAgIGlmIChjbG9zZSkgeworICAgICAgQVBJX0VWRU5UKGNvbm4sIE5FVENPTk5fRVZUX0VSUk9SLCAwKTsKKyAgICB9CisgICAgaWYgKHNodXRfcngpIHsKKyAgICAgIEFQSV9FVkVOVChjb25uLCBORVRDT05OX0VWVF9SQ1ZQTFVTLCAwKTsKKyAgICB9CisgICAgaWYgKHNodXRfdHgpIHsKKyAgICAgIEFQSV9FVkVOVChjb25uLCBORVRDT05OX0VWVF9TRU5EUExVUywgMCk7CisgICAgfQorICAgIC8qIHdha2UgdXAgdGhlIGFwcGxpY2F0aW9uIHRhc2sgKi8KKyAgICBzeXNfc2VtX3NpZ25hbCgmY29ubi0+b3BfY29tcGxldGVkKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBDbG9zaW5nIGZhaWxlZCwgcmVzdG9yZSBzb21lIG9mIHRoZSBjYWxsYmFja3MgKi8KKyAgICAvKiBDbG9zaW5nIG9mIGxpc3RlbiBwY2Igd2lsbCBuZXZlciBmYWlsISAqLworICAgIExXSVBfQVNTRVJUKCJDbG9zaW5nIGEgbGlzdGVuIHBjYiBtYXkgbm90IGZhaWwhIiwgKGNvbm4tPnBjYi50Y3AtPnN0YXRlICE9IExJU1RFTikpOworICAgIHRjcF9zZW50KGNvbm4tPnBjYi50Y3AsIHNlbnRfdGNwKTsKKyAgICB0Y3BfcG9sbChjb25uLT5wY2IudGNwLCBwb2xsX3RjcCwgNCk7CisgICAgdGNwX2Vycihjb25uLT5wY2IudGNwLCBlcnJfdGNwKTsKKyAgICB0Y3BfYXJnKGNvbm4tPnBjYi50Y3AsIGNvbm4pOworICAgIC8qIGRvbid0IHJlc3RvcmUgcmVjdiBjYWxsYmFjazogd2UgZG9uJ3Qgd2FudCB0byByZWNlaXZlIGFueSBtb3JlIGRhdGEgKi8KKyAgfQorICAvKiBJZiBjbG9zaW5nIGRpZG4ndCBzdWNjZWVkLCB3ZSBnZXQgY2FsbGVkIGFnYWluIGVpdGhlcgorICAgICBmcm9tIHBvbGxfdGNwIG9yIGZyb20gc2VudF90Y3AgKi8KK30KKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworCisvKioKKyAqIERlbGV0ZSB0aGUgcGNiIGluc2lkZSBhIG5ldGNvbm4uCisgKiBDYWxsZWQgZnJvbSBuZXRjb25uX2RlbGV0ZS4KKyAqCisgKiBAcGFyYW0gbXNnIHRoZSBhcGlfbXNnX21zZyBwb2ludGluZyB0byB0aGUgY29ubmVjdGlvbgorICovCit2b2lkCitkb19kZWxjb25uKHN0cnVjdCBhcGlfbXNnX21zZyAqbXNnKQoreworICAvKiBAdG9kbyBUQ1A6IGFib3J0IHJ1bm5pbmcgd3JpdGUvY29ubmVjdD8gKi8KKyBpZiAoKG1zZy0+Y29ubi0+c3RhdGUgIT0gTkVUQ09OTl9OT05FKSAmJgorICAgICAobXNnLT5jb25uLT5zdGF0ZSAhPSBORVRDT05OX0xJU1RFTikgJiYKKyAgICAgKG1zZy0+Y29ubi0+c3RhdGUgIT0gTkVUQ09OTl9DT05ORUNUKSkgeworICAgIC8qIHRoaXMgb25seSBoYXBwZW5zIGZvciBUQ1AgbmV0Y29ubnMgKi8KKyAgICBMV0lQX0FTU0VSVCgibXNnLT5jb25uLT50eXBlID09IE5FVENPTk5fVENQIiwgbXNnLT5jb25uLT50eXBlID09IE5FVENPTk5fVENQKTsKKyAgICBtc2ctPmVyciA9IEVSUl9JTlBST0dSRVNTOworICB9IGVsc2UgeworICAgIExXSVBfQVNTRVJUKCJibG9ja2luZyBjb25uZWN0IGluIHByb2dyZXNzIiwKKyAgICAgIChtc2ctPmNvbm4tPnN0YXRlICE9IE5FVENPTk5fQ09OTkVDVCkgfHwgSU5fTk9OQkxPQ0tJTkdfQ09OTkVDVChtc2ctPmNvbm4pKTsKKyAgICAvKiBEcmFpbiBhbmQgZGVsZXRlIG1ib3hlcyAqLworICAgIG5ldGNvbm5fZHJhaW4obXNnLT5jb25uKTsKKworICAgIGlmIChtc2ctPmNvbm4tPnBjYi50Y3AgIT0gTlVMTCkgeworCisgICAgICBzd2l0Y2ggKE5FVENPTk5UWVBFX0dST1VQKG1zZy0+Y29ubi0+dHlwZSkpIHsKKyNpZiBMV0lQX1JBVworICAgICAgY2FzZSBORVRDT05OX1JBVzoKKyAgICAgICAgcmF3X3JlbW92ZShtc2ctPmNvbm4tPnBjYi5yYXcpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1JBVyAqLworI2lmIExXSVBfVURQCisgICAgICBjYXNlIE5FVENPTk5fVURQOgorICAgICAgICBtc2ctPmNvbm4tPnBjYi51ZHAtPnJlY3ZfYXJnID0gTlVMTDsKKyAgICAgICAgdWRwX3JlbW92ZShtc2ctPmNvbm4tPnBjYi51ZHApOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1VEUCAqLworI2lmIExXSVBfVENQCisgICAgICBjYXNlIE5FVENPTk5fVENQOgorICAgICAgICBMV0lQX0FTU0VSVCgiYWxyZWFkeSB3cml0aW5nIG9yIGNsb3NpbmciLCBtc2ctPmNvbm4tPmN1cnJlbnRfbXNnID09IE5VTEwgJiYKKyAgICAgICAgICBtc2ctPmNvbm4tPndyaXRlX29mZnNldCA9PSAwKTsKKyAgICAgICAgbXNnLT5jb25uLT5zdGF0ZSA9IE5FVENPTk5fQ0xPU0U7CisgICAgICAgIG1zZy0+bXNnLnNkLnNodXQgPSBORVRDT05OX1NIVVRfUkRXUjsKKyAgICAgICAgbXNnLT5jb25uLT5jdXJyZW50X21zZyA9IG1zZzsKKyAgICAgICAgZG9fY2xvc2VfaW50ZXJuYWwobXNnLT5jb25uKTsKKyAgICAgICAgLyogQVBJX0VWRU5UIGlzIGNhbGxlZCBpbnNpZGUgZG9fY2xvc2VfaW50ZXJuYWwsIGJlZm9yZSByZWxlYXNpbmcKKyAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRocmVhZCwgc28gd2UgY2FuIHJldHVybiBhdCB0aGlzIHBvaW50ISAqLworICAgICAgICByZXR1cm47CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgbXNnLT5jb25uLT5wY2IudGNwID0gTlVMTDsKKyAgICB9CisgICAgLyogdGNwIG5ldGNvbm5zIGRvbid0IGNvbWUgaGVyZSEgKi8KKworICAgIC8qIEB0b2RvOiB0aGlzIGxldHMgc2VsZWN0IG1ha2UgdGhlIHNvY2tldCByZWFkYWJsZSBhbmQgd3JpdGFibGUsCisgICAgICAgd2hpY2ggaXMgd3JvbmchIGVycmZkIGluc3RlYWQ/ICovCisgICAgQVBJX0VWRU5UKG1zZy0+Y29ubiwgTkVUQ09OTl9FVlRfUkNWUExVUywgMCk7CisgICAgQVBJX0VWRU5UKG1zZy0+Y29ubiwgTkVUQ09OTl9FVlRfU0VORFBMVVMsIDApOworICB9CisgIGlmIChzeXNfc2VtX3ZhbGlkKCZtc2ctPmNvbm4tPm9wX2NvbXBsZXRlZCkpIHsKKyAgICBzeXNfc2VtX3NpZ25hbCgmbXNnLT5jb25uLT5vcF9jb21wbGV0ZWQpOworICB9Cit9CisKKy8qKgorICogQmluZCBhIHBjYiBjb250YWluZWQgaW4gYSBuZXRjb25uCisgKiBDYWxsZWQgZnJvbSBuZXRjb25uX2JpbmQuCisgKgorICogQHBhcmFtIG1zZyB0aGUgYXBpX21zZ19tc2cgcG9pbnRpbmcgdG8gdGhlIGNvbm5lY3Rpb24gYW5kIGNvbnRhaW5pbmcKKyAqICAgICAgICAgICAgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgdG8gYmluZCB0bworICovCit2b2lkCitkb19iaW5kKHN0cnVjdCBhcGlfbXNnX21zZyAqbXNnKQoreworICBpZiAoRVJSX0lTX0ZBVEFMKG1zZy0+Y29ubi0+bGFzdF9lcnIpKSB7CisgICAgbXNnLT5lcnIgPSBtc2ctPmNvbm4tPmxhc3RfZXJyOworICB9IGVsc2UgeworICAgIG1zZy0+ZXJyID0gRVJSX1ZBTDsKKyAgICBpZiAobXNnLT5jb25uLT5wY2IudGNwICE9IE5VTEwpIHsKKyAgICAgIHN3aXRjaCAoTkVUQ09OTlRZUEVfR1JPVVAobXNnLT5jb25uLT50eXBlKSkgeworI2lmIExXSVBfUkFXCisgICAgICBjYXNlIE5FVENPTk5fUkFXOgorICAgICAgICBtc2ctPmVyciA9IHJhd19iaW5kKG1zZy0+Y29ubi0+cGNiLnJhdywgbXNnLT5tc2cuYmMuaXBhZGRyKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9SQVcgKi8KKyNpZiBMV0lQX1VEUAorICAgICAgY2FzZSBORVRDT05OX1VEUDoKKyAgICAgICAgbXNnLT5lcnIgPSB1ZHBfYmluZChtc2ctPmNvbm4tPnBjYi51ZHAsIG1zZy0+bXNnLmJjLmlwYWRkciwgbXNnLT5tc2cuYmMucG9ydCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVURQICovCisjaWYgTFdJUF9UQ1AKKyAgICAgIGNhc2UgTkVUQ09OTl9UQ1A6CisgICAgICAgIG1zZy0+ZXJyID0gdGNwX2JpbmQobXNnLT5jb25uLT5wY2IudGNwLCBtc2ctPm1zZy5iYy5pcGFkZHIsIG1zZy0+bXNnLmJjLnBvcnQpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIFRDUElQX0FQSU1TR19BQ0sobXNnKTsKK30KKworI2lmIExXSVBfVENQCisvKioKKyAqIFRDUCBjYWxsYmFjayBmdW5jdGlvbiBpZiBhIGNvbm5lY3Rpb24gKG9wZW5lZCBieSB0Y3BfY29ubmVjdC9kb19jb25uZWN0KSBoYXMKKyAqIGJlZW4gZXN0YWJsaXNoZWQgKG9yIHJlc2V0IGJ5IHRoZSByZW1vdGUgaG9zdCkuCisgKgorICogQHNlZSB0Y3AuaCAoc3RydWN0IHRjcF9wY2IuY29ubmVjdGVkKSBmb3IgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcworICovCitzdGF0aWMgZXJyX3QKK2RvX2Nvbm5lY3RlZCh2b2lkICphcmcsIHN0cnVjdCB0Y3BfcGNiICpwY2IsIGVycl90IGVycikKK3sKKyAgc3RydWN0IG5ldGNvbm4gKmNvbm47CisgIGludCB3YXNfYmxvY2tpbmc7CisKKyAgTFdJUF9VTlVTRURfQVJHKHBjYik7CisKKyAgY29ubiA9IChzdHJ1Y3QgbmV0Y29ubiAqKWFyZzsKKworICBpZiAoY29ubiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEVSUl9WQUw7CisgIH0KKworICBMV0lQX0FTU0VSVCgiY29ubi0+c3RhdGUgPT0gTkVUQ09OTl9DT05ORUNUIiwgY29ubi0+c3RhdGUgPT0gTkVUQ09OTl9DT05ORUNUKTsKKyAgTFdJUF9BU1NFUlQoIihjb25uLT5jdXJyZW50X21zZyAhPSBOVUxMKSB8fCBjb25uLT5pbl9ub25fYmxvY2tpbmdfY29ubmVjdCIsCisgICAgKGNvbm4tPmN1cnJlbnRfbXNnICE9IE5VTEwpIHx8IElOX05PTkJMT0NLSU5HX0NPTk5FQ1QoY29ubikpOworCisgIGlmIChjb25uLT5jdXJyZW50X21zZyAhPSBOVUxMKSB7CisgICAgY29ubi0+Y3VycmVudF9tc2ctPmVyciA9IGVycjsKKyAgfQorICBpZiAoKGNvbm4tPnR5cGUgPT0gTkVUQ09OTl9UQ1ApICYmIChlcnIgPT0gRVJSX09LKSkgeworICAgIHNldHVwX3RjcChjb25uKTsKKyAgfQorICB3YXNfYmxvY2tpbmcgPSAhSU5fTk9OQkxPQ0tJTkdfQ09OTkVDVChjb25uKTsKKyAgU0VUX05PTkJMT0NLSU5HX0NPTk5FQ1QoY29ubiwgMCk7CisgIGNvbm4tPmN1cnJlbnRfbXNnID0gTlVMTDsKKyAgY29ubi0+c3RhdGUgPSBORVRDT05OX05PTkU7CisgIGlmICghd2FzX2Jsb2NraW5nKSB7CisgICAgTkVUQ09OTl9TRVRfU0FGRV9FUlIoY29ubiwgRVJSX09LKTsKKyAgfQorICBBUElfRVZFTlQoY29ubiwgTkVUQ09OTl9FVlRfU0VORFBMVVMsIDApOworCisgIGlmICh3YXNfYmxvY2tpbmcpIHsKKyAgICBzeXNfc2VtX3NpZ25hbCgmY29ubi0+b3BfY29tcGxldGVkKTsKKyAgfQorICByZXR1cm4gRVJSX09LOworfQorI2VuZGlmIC8qIExXSVBfVENQICovCisKKy8qKgorICogQ29ubmVjdCBhIHBjYiBjb250YWluZWQgaW5zaWRlIGEgbmV0Y29ubgorICogQ2FsbGVkIGZyb20gbmV0Y29ubl9jb25uZWN0LgorICoKKyAqIEBwYXJhbSBtc2cgdGhlIGFwaV9tc2dfbXNnIHBvaW50aW5nIHRvIHRoZSBjb25uZWN0aW9uIGFuZCBjb250YWluaW5nCisgKiAgICAgICAgICAgIHRoZSBJUCBhZGRyZXNzIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG8KKyAqLwordm9pZAorZG9fY29ubmVjdChzdHJ1Y3QgYXBpX21zZ19tc2cgKm1zZykKK3sKKyAgaWYgKG1zZy0+Y29ubi0+cGNiLnRjcCA9PSBOVUxMKSB7CisgICAgLyogVGhpcyBtYXkgaGFwcGVuIHdoZW4gY2FsbGluZyBuZXRjb25uX2Nvbm5lY3QoKSBhIHNlY29uZCB0aW1lICovCisgICAgbXNnLT5lcnIgPSBFUlJfQ0xTRDsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKE5FVENPTk5UWVBFX0dST1VQKG1zZy0+Y29ubi0+dHlwZSkpIHsKKyNpZiBMV0lQX1JBVworICBjYXNlIE5FVENPTk5fUkFXOgorICAgIG1zZy0+ZXJyID0gcmF3X2Nvbm5lY3QobXNnLT5jb25uLT5wY2IucmF3LCBtc2ctPm1zZy5iYy5pcGFkZHIpOworICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfUkFXICovCisjaWYgTFdJUF9VRFAKKyAgY2FzZSBORVRDT05OX1VEUDoKKyAgICBtc2ctPmVyciA9IHVkcF9jb25uZWN0KG1zZy0+Y29ubi0+cGNiLnVkcCwgbXNnLT5tc2cuYmMuaXBhZGRyLCBtc2ctPm1zZy5iYy5wb3J0KTsKKyAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1VEUCAqLworI2lmIExXSVBfVENQCisgIGNhc2UgTkVUQ09OTl9UQ1A6CisgICAgLyogUHJldmVudCBjb25uZWN0IHdoaWxlIGRvaW5nIGFueSBvdGhlciBhY3Rpb24uICovCisgICAgaWYgKG1zZy0+Y29ubi0+c3RhdGUgIT0gTkVUQ09OTl9OT05FKSB7CisgICAgICBtc2ctPmVyciA9IEVSUl9JU0NPTk47CisgICAgfSBlbHNlIHsKKyAgICAgIHNldHVwX3RjcChtc2ctPmNvbm4pOworICAgICAgbXNnLT5lcnIgPSB0Y3BfY29ubmVjdChtc2ctPmNvbm4tPnBjYi50Y3AsIG1zZy0+bXNnLmJjLmlwYWRkciwKKyAgICAgICAgbXNnLT5tc2cuYmMucG9ydCwgZG9fY29ubmVjdGVkKTsKKyAgICAgIGlmIChtc2ctPmVyciA9PSBFUlJfT0spIHsKKyAgICAgICAgdThfdCBub25fYmxvY2tpbmcgPSBuZXRjb25uX2lzX25vbmJsb2NraW5nKG1zZy0+Y29ubik7CisgICAgICAgIG1zZy0+Y29ubi0+c3RhdGUgPSBORVRDT05OX0NPTk5FQ1Q7CisgICAgICAgIFNFVF9OT05CTE9DS0lOR19DT05ORUNUKG1zZy0+Y29ubiwgbm9uX2Jsb2NraW5nKTsKKyAgICAgICAgaWYgKG5vbl9ibG9ja2luZykgeworICAgICAgICAgIG1zZy0+ZXJyID0gRVJSX0lOUFJPR1JFU1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbXNnLT5jb25uLT5jdXJyZW50X21zZyA9IG1zZzsKKyAgICAgICAgICAvKiBzeXNfc2VtX3NpZ25hbCgpIGlzIGNhbGxlZCBmcm9tIGRvX2Nvbm5lY3RlZCAob3IgZXJyX3RjcCgpKSwKKyAgICAgICAgICAqIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQhICovCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVENQICovCisgIGRlZmF1bHQ6CisgICAgTFdJUF9FUlJPUigiSW52YWxpZCBuZXRjb25uIHR5cGUiLCAwLCBkb3sgbXNnLT5lcnIgPSBFUlJfVkFMOyB9d2hpbGUoMCkpOworICAgIGJyZWFrOworICAgIH0KKyAgfQorICBzeXNfc2VtX3NpZ25hbCgmbXNnLT5jb25uLT5vcF9jb21wbGV0ZWQpOworfQorCisvKioKKyAqIENvbm5lY3QgYSBwY2IgY29udGFpbmVkIGluc2lkZSBhIG5ldGNvbm4KKyAqIE9ubHkgdXNlZCBmb3IgVURQIG5ldGNvbm5zLgorICogQ2FsbGVkIGZyb20gbmV0Y29ubl9kaXNjb25uZWN0LgorICoKKyAqIEBwYXJhbSBtc2cgdGhlIGFwaV9tc2dfbXNnIHBvaW50aW5nIHRvIHRoZSBjb25uZWN0aW9uIHRvIGRpc2Nvbm5lY3QKKyAqLwordm9pZAorZG9fZGlzY29ubmVjdChzdHJ1Y3QgYXBpX21zZ19tc2cgKm1zZykKK3sKKyNpZiBMV0lQX1VEUAorICBpZiAoTkVUQ09OTlRZUEVfR1JPVVAobXNnLT5jb25uLT50eXBlKSA9PSBORVRDT05OX1VEUCkgeworICAgIHVkcF9kaXNjb25uZWN0KG1zZy0+Y29ubi0+cGNiLnVkcCk7CisgICAgbXNnLT5lcnIgPSBFUlJfT0s7CisgIH0gZWxzZQorI2VuZGlmIC8qIExXSVBfVURQICovCisgIHsKKyAgICBtc2ctPmVyciA9IEVSUl9WQUw7CisgIH0KKyAgVENQSVBfQVBJTVNHX0FDSyhtc2cpOworfQorCisjaWYgTFdJUF9UQ1AKKy8qKgorICogU2V0IGEgVENQIHBjYiBjb250YWluZWQgaW4gYSBuZXRjb25uIGludG8gbGlzdGVuIG1vZGUKKyAqIENhbGxlZCBmcm9tIG5ldGNvbm5fbGlzdGVuLgorICoKKyAqIEBwYXJhbSBtc2cgdGhlIGFwaV9tc2dfbXNnIHBvaW50aW5nIHRvIHRoZSBjb25uZWN0aW9uCisgKi8KK3ZvaWQKK2RvX2xpc3RlbihzdHJ1Y3QgYXBpX21zZ19tc2cgKm1zZykKK3sKKyAgaWYgKEVSUl9JU19GQVRBTChtc2ctPmNvbm4tPmxhc3RfZXJyKSkgeworICAgIG1zZy0+ZXJyID0gbXNnLT5jb25uLT5sYXN0X2VycjsKKyAgfSBlbHNlIHsKKyAgICBtc2ctPmVyciA9IEVSUl9DT05OOworICAgIGlmIChtc2ctPmNvbm4tPnBjYi50Y3AgIT0gTlVMTCkgeworICAgICAgaWYgKG1zZy0+Y29ubi0+dHlwZSA9PSBORVRDT05OX1RDUCkgeworICAgICAgICBpZiAobXNnLT5jb25uLT5zdGF0ZSA9PSBORVRDT05OX05PTkUpIHsKKyNpZiBUQ1BfTElTVEVOX0JBQ0tMT0cKKyAgICAgICAgICBzdHJ1Y3QgdGNwX3BjYiogbHBjYiA9IHRjcF9saXN0ZW5fd2l0aF9iYWNrbG9nKG1zZy0+Y29ubi0+cGNiLnRjcCwgbXNnLT5tc2cubGIuYmFja2xvZyk7CisjZWxzZSAgLyogVENQX0xJU1RFTl9CQUNLTE9HICovCisgICAgICAgICAgc3RydWN0IHRjcF9wY2IqIGxwY2IgPSB0Y3BfbGlzdGVuKG1zZy0+Y29ubi0+cGNiLnRjcCk7CisjZW5kaWYgLyogVENQX0xJU1RFTl9CQUNLTE9HICovCisgICAgICAgICAgaWYgKGxwY2IgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogaW4gdGhpcyBjYXNlLCB0aGUgb2xkIHBjYiBpcyBzdGlsbCBhbGxvY2F0ZWQgKi8KKyAgICAgICAgICAgIG1zZy0+ZXJyID0gRVJSX01FTTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZGVsZXRlIHRoZSByZWN2bWJveCBhbmQgYWxsb2NhdGUgdGhlIGFjY2VwdG1ib3ggKi8KKyAgICAgICAgICAgIGlmIChzeXNfbWJveF92YWxpZCgmbXNnLT5jb25uLT5yZWN2bWJveCkpIHsKKyAgICAgICAgICAgICAgLyoqIEB0b2RvOiBzaG91bGQgd2UgZHJhaW4gdGhlIHJlY3ZtYm94IGhlcmU/ICovCisgICAgICAgICAgICAgIHN5c19tYm94X2ZyZWUoJm1zZy0+Y29ubi0+cmVjdm1ib3gpOworICAgICAgICAgICAgICBzeXNfbWJveF9zZXRfaW52YWxpZCgmbXNnLT5jb25uLT5yZWN2bWJveCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPmVyciA9IEVSUl9PSzsKKyAgICAgICAgICAgIGlmICghc3lzX21ib3hfdmFsaWQoJm1zZy0+Y29ubi0+YWNjZXB0bWJveCkpIHsKKyAgICAgICAgICAgICAgbXNnLT5lcnIgPSBzeXNfbWJveF9uZXcoJm1zZy0+Y29ubi0+YWNjZXB0bWJveCwgREVGQVVMVF9BQ0NFUFRNQk9YX1NJWkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1zZy0+ZXJyID09IEVSUl9PSykgeworICAgICAgICAgICAgICBtc2ctPmNvbm4tPnN0YXRlID0gTkVUQ09OTl9MSVNURU47CisgICAgICAgICAgICAgIG1zZy0+Y29ubi0+cGNiLnRjcCA9IGxwY2I7CisgICAgICAgICAgICAgIHRjcF9hcmcobXNnLT5jb25uLT5wY2IudGNwLCBtc2ctPmNvbm4pOworICAgICAgICAgICAgICB0Y3BfYWNjZXB0KG1zZy0+Y29ubi0+cGNiLnRjcCwgYWNjZXB0X2Z1bmN0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIHNpbmNlIHRoZSBvbGQgcGNiIGlzIGFscmVhZHkgZGVhbGxvY2F0ZWQsIGZyZWUgbHBjYiBub3cgKi8KKyAgICAgICAgICAgICAgdGNwX2Nsb3NlKGxwY2IpOworICAgICAgICAgICAgICBtc2ctPmNvbm4tPnBjYi50Y3AgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBUQ1BJUF9BUElNU0dfQUNLKG1zZyk7Cit9CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKworLyoqCisgKiBTZW5kIHNvbWUgZGF0YSBvbiBhIFJBVyBvciBVRFAgcGNiIGNvbnRhaW5lZCBpbiBhIG5ldGNvbm4KKyAqIENhbGxlZCBmcm9tIG5ldGNvbm5fc2VuZAorICoKKyAqIEBwYXJhbSBtc2cgdGhlIGFwaV9tc2dfbXNnIHBvaW50aW5nIHRvIHRoZSBjb25uZWN0aW9uCisgKi8KK3ZvaWQKK2RvX3NlbmQoc3RydWN0IGFwaV9tc2dfbXNnICptc2cpCit7CisgIGlmIChFUlJfSVNfRkFUQUwobXNnLT5jb25uLT5sYXN0X2VycikpIHsKKyAgICBtc2ctPmVyciA9IG1zZy0+Y29ubi0+bGFzdF9lcnI7CisgIH0gZWxzZSB7CisgICAgbXNnLT5lcnIgPSBFUlJfQ09OTjsKKyAgICBpZiAobXNnLT5jb25uLT5wY2IudGNwICE9IE5VTEwpIHsKKyAgICAgIHN3aXRjaCAoTkVUQ09OTlRZUEVfR1JPVVAobXNnLT5jb25uLT50eXBlKSkgeworI2lmIExXSVBfUkFXCisgICAgICBjYXNlIE5FVENPTk5fUkFXOgorICAgICAgICBpZiAoaXBfYWRkcl9pc2FueSgmbXNnLT5tc2cuYi0+YWRkcikpIHsKKyAgICAgICAgICBtc2ctPmVyciA9IHJhd19zZW5kKG1zZy0+Y29ubi0+cGNiLnJhdywgbXNnLT5tc2cuYi0+cCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbXNnLT5lcnIgPSByYXdfc2VuZHRvKG1zZy0+Y29ubi0+cGNiLnJhdywgbXNnLT5tc2cuYi0+cCwgJm1zZy0+bXNnLmItPmFkZHIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWYgTFdJUF9VRFAKKyAgICAgIGNhc2UgTkVUQ09OTl9VRFA6CisjaWYgTFdJUF9DSEVDS1NVTV9PTl9DT1BZCisgICAgICAgIGlmIChpcF9hZGRyX2lzYW55KCZtc2ctPm1zZy5iLT5hZGRyKSkgeworICAgICAgICAgIG1zZy0+ZXJyID0gdWRwX3NlbmRfY2hrc3VtKG1zZy0+Y29ubi0+cGNiLnVkcCwgbXNnLT5tc2cuYi0+cCwKKyAgICAgICAgICAgIG1zZy0+bXNnLmItPmZsYWdzICYgTkVUQlVGX0ZMQUdfQ0hLU1VNLCBtc2ctPm1zZy5iLT50b3BvcnRfY2hrc3VtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtc2ctPmVyciA9IHVkcF9zZW5kdG9fY2hrc3VtKG1zZy0+Y29ubi0+cGNiLnVkcCwgbXNnLT5tc2cuYi0+cCwKKyAgICAgICAgICAgICZtc2ctPm1zZy5iLT5hZGRyLCBtc2ctPm1zZy5iLT5wb3J0LAorICAgICAgICAgICAgbXNnLT5tc2cuYi0+ZmxhZ3MgJiBORVRCVUZfRkxBR19DSEtTVU0sIG1zZy0+bXNnLmItPnRvcG9ydF9jaGtzdW0pOworICAgICAgICB9CisjZWxzZSAvKiBMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KKyAgICAgICAgaWYgKGlwX2FkZHJfaXNhbnkoJm1zZy0+bXNnLmItPmFkZHIpKSB7CisgICAgICAgICAgbXNnLT5lcnIgPSB1ZHBfc2VuZChtc2ctPmNvbm4tPnBjYi51ZHAsIG1zZy0+bXNnLmItPnApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1zZy0+ZXJyID0gdWRwX3NlbmR0byhtc2ctPmNvbm4tPnBjYi51ZHAsIG1zZy0+bXNnLmItPnAsICZtc2ctPm1zZy5iLT5hZGRyLCBtc2ctPm1zZy5iLT5wb3J0KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIExXSVBfQ0hFQ0tTVU1fT05fQ09QWSAqLworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1VEUCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIFRDUElQX0FQSU1TR19BQ0sobXNnKTsKK30KKworI2lmIExXSVBfVENQCisvKioKKyAqIEluZGljYXRlIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSBhIFRDUCBwY2IgY29udGFpbmVkIGluIGEgbmV0Y29ubgorICogQ2FsbGVkIGZyb20gbmV0Y29ubl9yZWN2CisgKgorICogQHBhcmFtIG1zZyB0aGUgYXBpX21zZ19tc2cgcG9pbnRpbmcgdG8gdGhlIGNvbm5lY3Rpb24KKyAqLwordm9pZAorZG9fcmVjdihzdHJ1Y3QgYXBpX21zZ19tc2cgKm1zZykKK3sKKyAgbXNnLT5lcnIgPSBFUlJfT0s7CisgIGlmIChtc2ctPmNvbm4tPnBjYi50Y3AgIT0gTlVMTCkgeworICAgIGlmIChtc2ctPmNvbm4tPnR5cGUgPT0gTkVUQ09OTl9UQ1ApIHsKKyNpZiBUQ1BfTElTVEVOX0JBQ0tMT0cKKyAgICAgIGlmIChtc2ctPmNvbm4tPnBjYi50Y3AtPnN0YXRlID09IExJU1RFTikgeworICAgICAgICB0Y3BfYWNjZXB0ZWQobXNnLT5jb25uLT5wY2IudGNwKTsKKyAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFRDUF9MSVNURU5fQkFDS0xPRyAqLworICAgICAgeworICAgICAgICB1MzJfdCByZW1haW5pbmcgPSBtc2ctPm1zZy5yLmxlbjsKKyAgICAgICAgZG8geworICAgICAgICAgIHUxNl90IHJlY3ZlZCA9IChyZW1haW5pbmcgPiAweGZmZmYpID8gMHhmZmZmIDogKHUxNl90KXJlbWFpbmluZzsKKyAgICAgICAgICB0Y3BfcmVjdmVkKG1zZy0+Y29ubi0+cGNiLnRjcCwgcmVjdmVkKTsKKyAgICAgICAgICByZW1haW5pbmcgLT0gcmVjdmVkOworICAgICAgICB9d2hpbGUocmVtYWluaW5nICE9IDApOworICAgICAgfQorICAgIH0KKyAgfQorICBUQ1BJUF9BUElNU0dfQUNLKG1zZyk7Cit9CisKKy8qKgorICogU2VlIGlmIG1vcmUgZGF0YSBuZWVkcyB0byBiZSB3cml0dGVuIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIG5ldGNvbm5fd3JpdGUuCisgKiBDYWxsZWQgaW5pdGlhbGx5IGZyb20gZG9fd3JpdGUuIElmIHRoZSBmaXJzdCBjYWxsIGNhbid0IHNlbmQgYWxsIGRhdGEKKyAqIChiZWNhdXNlIG9mIGxvdyBtZW1vcnkgb3IgZW1wdHkgc2VuZC1idWZmZXIpLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZ2FpbgorICogZnJvbSBzZW50X3RjcCgpIG9yIHBvbGxfdGNwKCkgdG8gc2VuZCBtb3JlIGRhdGEuIElmIGFsbCBkYXRhIGlzIHNlbnQsIHRoZQorICogYmxvY2tpbmcgYXBwbGljYXRpb24gdGhyZWFkICh3YWl0aW5nIGluIG5ldGNvbm5fd3JpdGUpIGlzIHJlbGVhc2VkLgorICoKKyAqIEBwYXJhbSBjb25uIG5ldGNvbm4gKHRoYXQgaXMgY3VycmVudGx5IGluIHN0YXRlIE5FVENPTk5fV1JJVEUpIHRvIHByb2Nlc3MKKyAqIEByZXR1cm4gRVJSX09LCisgKiAgICAgICAgIEVSUl9NRU0gaWYgTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkc9MSBhbmQgc2VuZGluZyBoYXNuJ3QgeWV0IGZpbmlzaGVkCisgKi8KK3N0YXRpYyBlcnJfdAorZG9fd3JpdGVtb3JlKHN0cnVjdCBuZXRjb25uICpjb25uKQoreworICBlcnJfdCBlcnIgPSBFUlJfT0s7CisgIHZvaWQgKmRhdGFwdHI7CisgIHUxNl90IGxlbiwgYXZhaWxhYmxlOworICB1OF90IHdyaXRlX2ZpbmlzaGVkID0gMDsKKyAgc2l6ZV90IGRpZmY7CisgIHU4X3QgZG9udGJsb2NrID0gbmV0Y29ubl9pc19ub25ibG9ja2luZyhjb25uKSB8fAorICAgICAgIChjb25uLT5jdXJyZW50X21zZy0+bXNnLncuYXBpZmxhZ3MgJiBORVRDT05OX0RPTlRCTE9DSyk7CisgIHU4X3QgYXBpZmxhZ3MgPSBjb25uLT5jdXJyZW50X21zZy0+bXNnLncuYXBpZmxhZ3M7CisKKyAgTFdJUF9BU1NFUlQoImNvbm4gIT0gTlVMTCIsIGNvbm4gIT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJjb25uLT5zdGF0ZSA9PSBORVRDT05OX1dSSVRFIiwgKGNvbm4tPnN0YXRlID09IE5FVENPTk5fV1JJVEUpKTsKKyAgTFdJUF9BU1NFUlQoImNvbm4tPmN1cnJlbnRfbXNnICE9IE5VTEwiLCBjb25uLT5jdXJyZW50X21zZyAhPSBOVUxMKTsKKyAgTFdJUF9BU1NFUlQoImNvbm4tPnBjYi50Y3AgIT0gTlVMTCIsIGNvbm4tPnBjYi50Y3AgIT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJjb25uLT53cml0ZV9vZmZzZXQgPCBjb25uLT5jdXJyZW50X21zZy0+bXNnLncubGVuIiwKKyAgICBjb25uLT53cml0ZV9vZmZzZXQgPCBjb25uLT5jdXJyZW50X21zZy0+bXNnLncubGVuKTsKKworICBkYXRhcHRyID0gKHU4X3QqKWNvbm4tPmN1cnJlbnRfbXNnLT5tc2cudy5kYXRhcHRyICsgY29ubi0+d3JpdGVfb2Zmc2V0OworICBkaWZmID0gY29ubi0+Y3VycmVudF9tc2ctPm1zZy53LmxlbiAtIGNvbm4tPndyaXRlX29mZnNldDsKKyAgaWYgKGRpZmYgPiAweGZmZmZVTCkgeyAvKiBtYXhfdTE2X3QgKi8KKyAgICBsZW4gPSAweGZmZmY7CisjaWYgTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcKKyAgICBjb25uLT5mbGFncyB8PSBORVRDT05OX0ZMQUdfV1JJVEVfREVMQVlFRDsKKyNlbmRpZgorICAgIGFwaWZsYWdzIHw9IFRDUF9XUklURV9GTEFHX01PUkU7CisgIH0gZWxzZSB7CisgICAgbGVuID0gKHUxNl90KWRpZmY7CisgIH0KKyAgYXZhaWxhYmxlID0gdGNwX3NuZGJ1Zihjb25uLT5wY2IudGNwKTsKKyAgaWYgKGF2YWlsYWJsZSA8IGxlbikgeworICAgIC8qIGRvbid0IHRyeSB0byB3cml0ZSBtb3JlIHRoYW4gc2VuZGJ1ZiAqLworICAgIGxlbiA9IGF2YWlsYWJsZTsKKyNpZiBMV0lQX1RDUElQX0NPUkVfTE9DS0lORworICAgIGNvbm4tPmZsYWdzIHw9IE5FVENPTk5fRkxBR19XUklURV9ERUxBWUVEOworI2VuZGlmCisgICAgYXBpZmxhZ3MgfD0gVENQX1dSSVRFX0ZMQUdfTU9SRTsKKyAgfQorICBpZiAoZG9udGJsb2NrICYmIChsZW4gPCBjb25uLT5jdXJyZW50X21zZy0+bXNnLncubGVuKSkgeworICAgIC8qIGZhaWxlZCB0byBzZW5kIGFsbCBkYXRhIGF0IG9uY2UgLT4gbm9uYmxvY2tpbmcgd3JpdGUgbm90IHBvc3NpYmxlICovCisgICAgZXJyID0gRVJSX01FTTsKKyAgfQorICBpZiAoZXJyID09IEVSUl9PSykgeworICAgIExXSVBfQVNTRVJUKCJkb193cml0ZW1vcmU6IGludmFsaWQgbGVuZ3RoISIsICgoY29ubi0+d3JpdGVfb2Zmc2V0ICsgbGVuKSA8PSBjb25uLT5jdXJyZW50X21zZy0+bXNnLncubGVuKSk7CisgICAgZXJyID0gdGNwX3dyaXRlKGNvbm4tPnBjYi50Y3AsIGRhdGFwdHIsIGxlbiwgYXBpZmxhZ3MpOworICB9CisgIGlmIChkb250YmxvY2sgJiYgKGVyciA9PSBFUlJfTUVNKSkgeworICAgIC8qIG5vbmJsb2NraW5nIHdyaXRlIGZhaWxlZCAqLworICAgIHdyaXRlX2ZpbmlzaGVkID0gMTsKKyAgICBlcnIgPSBFUlJfV09VTERCTE9DSzsKKyAgICAvKiBsZXQgcG9sbF90Y3AgY2hlY2sgd3JpdGFibGUgc3BhY2UgdG8gbWFyayB0aGUgcGNiCisgICAgICAgd3JpdGFibGUgYWdhaW4gKi8KKyAgICBjb25uLT5mbGFncyB8PSBORVRDT05OX0ZMQUdfQ0hFQ0tfV1JJVEVTUEFDRTsKKyAgICAvKiBsZXQgc2VsZWN0IG1hcmsgdGhpcyBwY2IgYXMgbm9uLXdyaXRhYmxlLiAqLworICAgIEFQSV9FVkVOVChjb25uLCBORVRDT05OX0VWVF9TRU5ETUlOVVMsIGxlbik7CisgIH0gZWxzZSB7CisgICAgLyogaWYgT0sgb3IgbWVtb3J5IGVycm9yLCBjaGVjayBhdmFpbGFibGUgc3BhY2UgKi8KKyAgICBpZiAoKChlcnIgPT0gRVJSX09LKSB8fCAoZXJyID09IEVSUl9NRU0pKSAmJgorICAgICAgICAoKHRjcF9zbmRidWYoY29ubi0+cGNiLnRjcCkgPD0gVENQX1NORExPV0FUKSB8fAorICAgICAgICAgKHRjcF9zbmRxdWV1ZWxlbihjb25uLT5wY2IudGNwKSA+PSBUQ1BfU05EUVVFVUVMT1dBVCkpKSB7CisgICAgICAvKiBUaGUgcXVldWVkIGJ5dGUtIG9yIHBidWYtY291bnQgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBsb3ctd2F0ZXIgbGltaXQsCisgICAgICAgICBsZXQgc2VsZWN0IG1hcmsgdGhpcyBwY2IgYXMgbm9uLXdyaXRhYmxlLiAqLworICAgICAgQVBJX0VWRU5UKGNvbm4sIE5FVENPTk5fRVZUX1NFTkRNSU5VUywgbGVuKTsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IEVSUl9PSykgeworICAgICAgY29ubi0+d3JpdGVfb2Zmc2V0ICs9IGxlbjsKKyAgICAgIGlmIChjb25uLT53cml0ZV9vZmZzZXQgPT0gY29ubi0+Y3VycmVudF9tc2ctPm1zZy53LmxlbikgeworICAgICAgICAvKiBldmVyeXRoaW5nIHdhcyB3cml0dGVuICovCisgICAgICAgIHdyaXRlX2ZpbmlzaGVkID0gMTsKKyAgICAgICAgY29ubi0+d3JpdGVfb2Zmc2V0ID0gMDsKKyAgICAgIH0KKyAgICAgIHRjcF9vdXRwdXQoY29ubi0+cGNiLnRjcCk7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJSX01FTSkgeworICAgICAgLyogSWYgRVJSX01FTSwgd2Ugd2FpdCBmb3Igc2VudF90Y3Agb3IgcG9sbF90Y3AgdG8gYmUgY2FsbGVkCisgICAgICAgICB3ZSBkbyBOT1QgcmV0dXJuIHRvIHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQsIHNpbmNlIEVSUl9NRU0gaXMKKyAgICAgICAgIG9ubHkgYSB0ZW1wb3JhcnkgZXJyb3IhICovCisKKyAgICAgIC8qIHRjcF93cml0ZSByZXR1cm5lZCBFUlJfTUVNLCB0cnkgdGNwX291dHB1dCBhbnl3YXkgKi8KKyAgICAgIHRjcF9vdXRwdXQoY29ubi0+cGNiLnRjcCk7CisKKyAgI2lmIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HCisgICAgICBjb25uLT5mbGFncyB8PSBORVRDT05OX0ZMQUdfV1JJVEVfREVMQVlFRDsKKyAgI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE9uIGVycm9ycyAhPSBFUlJfTUVNLCB3ZSBkb24ndCB0cnkgd3JpdGluZyBhbnkgbW9yZSBidXQgcmV0dXJuCisgICAgICAgICB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uIHRocmVhZC4gKi8KKyAgICAgIHdyaXRlX2ZpbmlzaGVkID0gMTsKKyAgICB9CisgIH0KKworICBpZiAod3JpdGVfZmluaXNoZWQpIHsKKyAgICAvKiBldmVyeXRoaW5nIHdhcyB3cml0dGVuOiBzZXQgYmFjayBjb25uZWN0aW9uIHN0YXRlCisgICAgICAgYW5kIGJhY2sgdG8gYXBwbGljYXRpb24gdGFzayAqLworICAgIGNvbm4tPmN1cnJlbnRfbXNnLT5lcnIgPSBlcnI7CisgICAgY29ubi0+Y3VycmVudF9tc2cgPSBOVUxMOworICAgIGNvbm4tPnN0YXRlID0gTkVUQ09OTl9OT05FOworI2lmIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HCisgICAgaWYgKChjb25uLT5mbGFncyAmIE5FVENPTk5fRkxBR19XUklURV9ERUxBWUVEKSAhPSAwKQorI2VuZGlmCisgICAgeworICAgICAgc3lzX3NlbV9zaWduYWwoJmNvbm4tPm9wX2NvbXBsZXRlZCk7CisgICAgfQorICB9CisjaWYgTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcKKyAgZWxzZQorICAgIHJldHVybiBFUlJfTUVNOworI2VuZGlmCisgIHJldHVybiBFUlJfT0s7Cit9CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKworLyoqCisgKiBTZW5kIHNvbWUgZGF0YSBvbiBhIFRDUCBwY2IgY29udGFpbmVkIGluIGEgbmV0Y29ubgorICogQ2FsbGVkIGZyb20gbmV0Y29ubl93cml0ZQorICoKKyAqIEBwYXJhbSBtc2cgdGhlIGFwaV9tc2dfbXNnIHBvaW50aW5nIHRvIHRoZSBjb25uZWN0aW9uCisgKi8KK3ZvaWQKK2RvX3dyaXRlKHN0cnVjdCBhcGlfbXNnX21zZyAqbXNnKQoreworICBpZiAoRVJSX0lTX0ZBVEFMKG1zZy0+Y29ubi0+bGFzdF9lcnIpKSB7CisgICAgbXNnLT5lcnIgPSBtc2ctPmNvbm4tPmxhc3RfZXJyOworICB9IGVsc2UgeworICAgIGlmIChtc2ctPmNvbm4tPnR5cGUgPT0gTkVUQ09OTl9UQ1ApIHsKKyNpZiBMV0lQX1RDUAorICAgICAgaWYgKG1zZy0+Y29ubi0+c3RhdGUgIT0gTkVUQ09OTl9OT05FKSB7CisgICAgICAgIC8qIG5ldGNvbm4gaXMgY29ubmVjdGluZywgY2xvc2luZyBvciBpbiBibG9ja2luZyB3cml0ZSAqLworICAgICAgICBtc2ctPmVyciA9IEVSUl9JTlBST0dSRVNTOworICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbm4tPnBjYi50Y3AgIT0gTlVMTCkgeworICAgICAgICBtc2ctPmNvbm4tPnN0YXRlID0gTkVUQ09OTl9XUklURTsKKyAgICAgICAgLyogc2V0IGFsbCB0aGUgdmFyaWFibGVzIHVzZWQgYnkgZG9fd3JpdGVtb3JlICovCisgICAgICAgIExXSVBfQVNTRVJUKCJhbHJlYWR5IHdyaXRpbmcgb3IgY2xvc2luZyIsIG1zZy0+Y29ubi0+Y3VycmVudF9tc2cgPT0gTlVMTCAmJgorICAgICAgICAgIG1zZy0+Y29ubi0+d3JpdGVfb2Zmc2V0ID09IDApOworICAgICAgICBMV0lQX0FTU0VSVCgibXNnLT5tc2cudy5sZW4gIT0gMCIsIG1zZy0+bXNnLncubGVuICE9IDApOworICAgICAgICBtc2ctPmNvbm4tPmN1cnJlbnRfbXNnID0gbXNnOworICAgICAgICBtc2ctPmNvbm4tPndyaXRlX29mZnNldCA9IDA7CisjaWYgTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcKKyAgICAgICAgbXNnLT5jb25uLT5mbGFncyAmPSB+TkVUQ09OTl9GTEFHX1dSSVRFX0RFTEFZRUQ7CisgICAgICAgIGlmIChkb193cml0ZW1vcmUobXNnLT5jb25uKSAhPSBFUlJfT0spIHsKKyAgICAgICAgICBMV0lQX0FTU0VSVCgic3RhdGUhIiwgbXNnLT5jb25uLT5zdGF0ZSA9PSBORVRDT05OX1dSSVRFKTsKKyAgICAgICAgICBVTkxPQ0tfVENQSVBfQ09SRSgpOworICAgICAgICAgIHN5c19hcmNoX3NlbV93YWl0KCZtc2ctPmNvbm4tPm9wX2NvbXBsZXRlZCwgMCk7CisgICAgICAgICAgTE9DS19UQ1BJUF9DT1JFKCk7CisgICAgICAgICAgTFdJUF9BU1NFUlQoInN0YXRlISIsIG1zZy0+Y29ubi0+c3RhdGUgPT0gTkVUQ09OTl9OT05FKTsKKyAgICAgICAgfQorI2Vsc2UgLyogTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcgKi8KKyAgICAgICAgZG9fd3JpdGVtb3JlKG1zZy0+Y29ubik7CisjZW5kaWYgLyogTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcgKi8KKyAgICAgICAgLyogZm9yIGJvdGggY2FzZXM6IGlmIGRvX3dyaXRlbW9yZSB3YXMgY2FsbGVkLCBkb24ndCBBQ0sgdGhlIEFQSU1TRworICAgICAgICAgICBzaW5jZSBkb193cml0ZW1vcmUgQUNLcyBpdCEgKi8KKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbXNnLT5lcnIgPSBFUlJfQ09OTjsKKyAgICAgIH0KKyNlbHNlIC8qIExXSVBfVENQICovCisgICAgICBtc2ctPmVyciA9IEVSUl9WQUw7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKyNpZiAoTFdJUF9VRFAgfHwgTFdJUF9SQVcpCisgICAgfSBlbHNlIHsKKyAgICAgIG1zZy0+ZXJyID0gRVJSX1ZBTDsKKyNlbmRpZiAvKiAoTFdJUF9VRFAgfHwgTFdJUF9SQVcpICovCisgICAgfQorICB9CisgIFRDUElQX0FQSU1TR19BQ0sobXNnKTsKK30KKworLyoqCisgKiBSZXR1cm4gYSBjb25uZWN0aW9uJ3MgbG9jYWwgb3IgcmVtb3RlIGFkZHJlc3MKKyAqIENhbGxlZCBmcm9tIG5ldGNvbm5fZ2V0YWRkcgorICoKKyAqIEBwYXJhbSBtc2cgdGhlIGFwaV9tc2dfbXNnIHBvaW50aW5nIHRvIHRoZSBjb25uZWN0aW9uCisgKi8KK3ZvaWQKK2RvX2dldGFkZHIoc3RydWN0IGFwaV9tc2dfbXNnICptc2cpCit7CisgIGlmIChtc2ctPmNvbm4tPnBjYi5pcCAhPSBOVUxMKSB7CisgICAgKihtc2ctPm1zZy5hZC5pcGFkZHIpID0gKG1zZy0+bXNnLmFkLmxvY2FsID8gbXNnLT5jb25uLT5wY2IuaXAtPmxvY2FsX2lwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5jb25uLT5wY2IuaXAtPnJlbW90ZV9pcCk7CisKKyAgICBtc2ctPmVyciA9IEVSUl9PSzsKKyAgICBzd2l0Y2ggKE5FVENPTk5UWVBFX0dST1VQKG1zZy0+Y29ubi0+dHlwZSkpIHsKKyNpZiBMV0lQX1JBVworICAgIGNhc2UgTkVUQ09OTl9SQVc6CisgICAgICBpZiAobXNnLT5tc2cuYWQubG9jYWwpIHsKKyAgICAgICAgKihtc2ctPm1zZy5hZC5wb3J0KSA9IG1zZy0+Y29ubi0+cGNiLnJhdy0+cHJvdG9jb2w7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiByZXR1cm4gYW4gZXJyb3IgYXMgY29ubmVjdGluZyBpcyBvbmx5IGEgaGVscGVyIGZvciB1cHBlciBsYXllcnMgKi8KKyAgICAgICAgbXNnLT5lcnIgPSBFUlJfQ09OTjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfUkFXICovCisjaWYgTFdJUF9VRFAKKyAgICBjYXNlIE5FVENPTk5fVURQOgorICAgICAgaWYgKG1zZy0+bXNnLmFkLmxvY2FsKSB7CisgICAgICAgICoobXNnLT5tc2cuYWQucG9ydCkgPSBtc2ctPmNvbm4tPnBjYi51ZHAtPmxvY2FsX3BvcnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKG1zZy0+Y29ubi0+cGNiLnVkcC0+ZmxhZ3MgJiBVRFBfRkxBR1NfQ09OTkVDVEVEKSA9PSAwKSB7CisgICAgICAgICAgbXNnLT5lcnIgPSBFUlJfQ09OTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqKG1zZy0+bXNnLmFkLnBvcnQpID0gbXNnLT5jb25uLT5wY2IudWRwLT5yZW1vdGVfcG9ydDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9VRFAgKi8KKyNpZiBMV0lQX1RDUAorICAgIGNhc2UgTkVUQ09OTl9UQ1A6CisgICAgICAqKG1zZy0+bXNnLmFkLnBvcnQpID0gKG1zZy0+bXNnLmFkLmxvY2FsP21zZy0+Y29ubi0+cGNiLnRjcC0+bG9jYWxfcG9ydDptc2ctPmNvbm4tPnBjYi50Y3AtPnJlbW90ZV9wb3J0KTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVENQICovCisgICAgZGVmYXVsdDoKKyAgICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIG5ldGNvbm5fdHlwZSIsIDApOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIG1zZy0+ZXJyID0gRVJSX0NPTk47CisgIH0KKyAgVENQSVBfQVBJTVNHX0FDSyhtc2cpOworfQorCisvKioKKyAqIENsb3NlIGEgVENQIHBjYiBjb250YWluZWQgaW4gYSBuZXRjb25uCisgKiBDYWxsZWQgZnJvbSBuZXRjb25uX2Nsb3NlCisgKgorICogQHBhcmFtIG1zZyB0aGUgYXBpX21zZ19tc2cgcG9pbnRpbmcgdG8gdGhlIGNvbm5lY3Rpb24KKyAqLwordm9pZAorZG9fY2xvc2Uoc3RydWN0IGFwaV9tc2dfbXNnICptc2cpCit7CisjaWYgTFdJUF9UQ1AKKyAgLyogQHRvZG86IGFib3J0IHJ1bm5pbmcgd3JpdGUvY29ubmVjdD8gKi8KKyAgaWYgKChtc2ctPmNvbm4tPnN0YXRlICE9IE5FVENPTk5fTk9ORSkgJiYgKG1zZy0+Y29ubi0+c3RhdGUgIT0gTkVUQ09OTl9MSVNURU4pKSB7CisgICAgLyogdGhpcyBvbmx5IGhhcHBlbnMgZm9yIFRDUCBuZXRjb25ucyAqLworICAgIExXSVBfQVNTRVJUKCJtc2ctPmNvbm4tPnR5cGUgPT0gTkVUQ09OTl9UQ1AiLCBtc2ctPmNvbm4tPnR5cGUgPT0gTkVUQ09OTl9UQ1ApOworICAgIG1zZy0+ZXJyID0gRVJSX0lOUFJPR1JFU1M7CisgIH0gZWxzZSBpZiAoKG1zZy0+Y29ubi0+cGNiLnRjcCAhPSBOVUxMKSAmJiAobXNnLT5jb25uLT50eXBlID09IE5FVENPTk5fVENQKSkgeworICAgIGlmICgobXNnLT5tc2cuc2Quc2h1dCAhPSBORVRDT05OX1NIVVRfUkRXUikgJiYgKG1zZy0+Y29ubi0+c3RhdGUgPT0gTkVUQ09OTl9MSVNURU4pKSB7CisgICAgICAvKiBMSVNURU4gZG9lc24ndCBzdXBwb3J0IGhhbGYgc2h1dGRvd24gKi8KKyAgICAgIG1zZy0+ZXJyID0gRVJSX0NPTk47CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtc2ctPm1zZy5zZC5zaHV0ICYgTkVUQ09OTl9TSFVUX1JEKSB7CisgICAgICAgIC8qIERyYWluIGFuZCBkZWxldGUgbWJveGVzICovCisgICAgICAgIG5ldGNvbm5fZHJhaW4obXNnLT5jb25uKTsKKyAgICAgIH0KKyAgICAgIExXSVBfQVNTRVJUKCJhbHJlYWR5IHdyaXRpbmcgb3IgY2xvc2luZyIsIG1zZy0+Y29ubi0+Y3VycmVudF9tc2cgPT0gTlVMTCAmJgorICAgICAgICBtc2ctPmNvbm4tPndyaXRlX29mZnNldCA9PSAwKTsKKyAgICAgIG1zZy0+Y29ubi0+c3RhdGUgPSBORVRDT05OX0NMT1NFOworICAgICAgbXNnLT5jb25uLT5jdXJyZW50X21zZyA9IG1zZzsKKyAgICAgIGRvX2Nsb3NlX2ludGVybmFsKG1zZy0+Y29ubik7CisgICAgICAvKiBmb3IgdGNwIG5ldGNvbm5zLCBkb19jbG9zZV9pbnRlcm5hbCBBQ0tzIHRoZSBtZXNzYWdlICovCisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworICB7CisgICAgbXNnLT5lcnIgPSBFUlJfVkFMOworICB9CisgIHN5c19zZW1fc2lnbmFsKCZtc2ctPmNvbm4tPm9wX2NvbXBsZXRlZCk7Cit9CisKKyNpZiBMV0lQX0lHTVAKKy8qKgorICogSm9pbiBtdWx0aWNhc3QgZ3JvdXBzIGZvciBVRFAgbmV0Y29ubnMuCisgKiBDYWxsZWQgZnJvbSBuZXRjb25uX2pvaW5fbGVhdmVfZ3JvdXAKKyAqCisgKiBAcGFyYW0gbXNnIHRoZSBhcGlfbXNnX21zZyBwb2ludGluZyB0byB0aGUgY29ubmVjdGlvbgorICovCit2b2lkCitkb19qb2luX2xlYXZlX2dyb3VwKHN0cnVjdCBhcGlfbXNnX21zZyAqbXNnKQoreyAKKyAgaWYgKEVSUl9JU19GQVRBTChtc2ctPmNvbm4tPmxhc3RfZXJyKSkgeworICAgIG1zZy0+ZXJyID0gbXNnLT5jb25uLT5sYXN0X2VycjsKKyAgfSBlbHNlIHsKKyAgICBpZiAobXNnLT5jb25uLT5wY2IudGNwICE9IE5VTEwpIHsKKyAgICAgIGlmIChORVRDT05OVFlQRV9HUk9VUChtc2ctPmNvbm4tPnR5cGUpID09IE5FVENPTk5fVURQKSB7CisjaWYgTFdJUF9VRFAKKyAgICAgICAgaWYgKG1zZy0+bXNnLmpsLmpvaW5fb3JfbGVhdmUgPT0gTkVUQ09OTl9KT0lOKSB7CisgICAgICAgICAgbXNnLT5lcnIgPSBpZ21wX2pvaW5ncm91cChtc2ctPm1zZy5qbC5uZXRpZl9hZGRyLCBtc2ctPm1zZy5qbC5tdWx0aWFkZHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1zZy0+ZXJyID0gaWdtcF9sZWF2ZWdyb3VwKG1zZy0+bXNnLmpsLm5ldGlmX2FkZHIsIG1zZy0+bXNnLmpsLm11bHRpYWRkcik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBMV0lQX1VEUCAqLworI2lmIChMV0lQX1RDUCB8fCBMV0lQX1JBVykKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1zZy0+ZXJyID0gRVJSX1ZBTDsKKyNlbmRpZiAvKiAoTFdJUF9UQ1AgfHwgTFdJUF9SQVcpICovCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1zZy0+ZXJyID0gRVJSX0NPTk47CisgICAgfQorICB9CisgIFRDUElQX0FQSU1TR19BQ0sobXNnKTsKK30KKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKworI2lmIExXSVBfRE5TCisvKioKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gRE5TIG5hbWUgaXMgcmVzb2x2ZWQKKyAqIChvciBvbiB0aW1lb3V0KS4gQSB3YWl0aW5nIGFwcGxpY2F0aW9uIHRocmVhZCBpcyB3YWtlZCB1cCBieQorICogc2lnbmFsaW5nIHRoZSBzZW1hcGhvcmUuCisgKi8KK3N0YXRpYyB2b2lkCitkb19kbnNfZm91bmQoY29uc3QgY2hhciAqbmFtZSwgaXBfYWRkcl90ICppcGFkZHIsIHZvaWQgKmFyZykKK3sKKyAgc3RydWN0IGRuc19hcGlfbXNnICptc2cgPSAoc3RydWN0IGRuc19hcGlfbXNnKilhcmc7CisKKyAgTFdJUF9BU1NFUlQoIkROUyByZXNwb25zZSBmb3Igd3JvbmcgaG9zdCBuYW1lIiwgc3RyY21wKG1zZy0+bmFtZSwgbmFtZSkgPT0gMCk7CisgIExXSVBfVU5VU0VEX0FSRyhuYW1lKTsKKworICBpZiAoaXBhZGRyID09IE5VTEwpIHsKKyAgICAvKiB0aW1lb3V0IG9yIG1lbW9yeSBlcnJvciAqLworICAgICptc2ctPmVyciA9IEVSUl9WQUw7CisgIH0gZWxzZSB7CisgICAgLyogYWRkcmVzcyB3YXMgcmVzb2x2ZWQgKi8KKyAgICAqbXNnLT5lcnIgPSBFUlJfT0s7CisgICAgKm1zZy0+YWRkciA9ICppcGFkZHI7CisgIH0KKyAgLyogd2FrZSB1cCB0aGUgYXBwbGljYXRpb24gdGFzayB3YWl0aW5nIGluIG5ldGNvbm5fZ2V0aG9zdGJ5bmFtZSAqLworICBzeXNfc2VtX3NpZ25hbChtc2ctPnNlbSk7Cit9CisKKy8qKgorICogRXhlY3V0ZSBhIEROUyBxdWVyeQorICogQ2FsbGVkIGZyb20gbmV0Y29ubl9nZXRob3N0YnluYW1lCisgKgorICogQHBhcmFtIGFyZyB0aGUgZG5zX2FwaV9tc2cgcG9pbnRpbmcgdG8gdGhlIHF1ZXJ5CisgKi8KK3ZvaWQKK2RvX2dldGhvc3RieW5hbWUodm9pZCAqYXJnKQoreworICBzdHJ1Y3QgZG5zX2FwaV9tc2cgKm1zZyA9IChzdHJ1Y3QgZG5zX2FwaV9tc2cqKWFyZzsKKworICAqbXNnLT5lcnIgPSBkbnNfZ2V0aG9zdGJ5bmFtZShtc2ctPm5hbWUsIG1zZy0+YWRkciwgZG9fZG5zX2ZvdW5kLCBtc2cpOworICBpZiAoKm1zZy0+ZXJyICE9IEVSUl9JTlBST0dSRVNTKSB7CisgICAgLyogb24gZXJyb3Igb3IgaW1tZWRpYXRlIHN1Y2Nlc3MsIHdha2UgdXAgdGhlIGFwcGxpY2F0aW9uCisgICAgICogdGFzayB3YWl0aW5nIGluIG5ldGNvbm5fZ2V0aG9zdGJ5bmFtZSAqLworICAgIHN5c19zZW1fc2lnbmFsKG1zZy0+c2VtKTsKKyAgfQorfQorI2VuZGlmIC8qIExXSVBfRE5TICovCisKKyNlbmRpZiAvKiBMV0lQX05FVENPTk4gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvYXBpL2Vyci5jIGIvY29yZS9sd2lwL3NyYy9hcGkvZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmYThiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvYXBpL2Vyci5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQGZpbGUKKyAqIEVycm9yIE1hbmFnZW1lbnQgbW9kdWxlCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL2Vyci5oIgorCisjaWZkZWYgTFdJUF9ERUJVRworCitzdGF0aWMgY29uc3QgY2hhciAqZXJyX3N0cmVycltdID0geworICAgICAgICAgICAiT2suIiwgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9PSyAgICAgICAgICAwICAqLworICAgICAgICAgICAiT3V0IG9mIG1lbW9yeSBlcnJvci4iLCAgIC8qIEVSUl9NRU0gICAgICAgIC0xICAqLworICAgICAgICAgICAiQnVmZmVyIGVycm9yLiIsICAgICAgICAgIC8qIEVSUl9CVUYgICAgICAgIC0yICAqLworICAgICAgICAgICAiVGltZW91dC4iLCAgICAgICAgICAgICAgIC8qIEVSUl9USU1FT1VUICAgIC0zICAqLworICAgICAgICAgICAiUm91dGluZyBwcm9ibGVtLiIsICAgICAgIC8qIEVSUl9SVEUgICAgICAgIC00ICAqLworICAgICAgICAgICAiT3BlcmF0aW9uIGluIHByb2dyZXNzLiIsIC8qIEVSUl9JTlBST0dSRVNTIC01ICAqLworICAgICAgICAgICAiSWxsZWdhbCB2YWx1ZS4iLCAgICAgICAgIC8qIEVSUl9WQUwgICAgICAgIC02ICAqLworICAgICAgICAgICAiT3BlcmF0aW9uIHdvdWxkIGJsb2NrLiIsIC8qIEVSUl9XT1VMREJMT0NLIC03ICAqLworICAgICAgICAgICAiQWRkcmVzcyBpbiB1c2UuIiwgICAgICAgIC8qIEVSUl9VU0UgICAgICAgIC04ICAqLworICAgICAgICAgICAiQWxyZWFkeSBjb25uZWN0ZWQuIiwgICAgIC8qIEVSUl9JU0NPTk4gICAgIC05ICAqLworICAgICAgICAgICAiQ29ubmVjdGlvbiBhYm9ydGVkLiIsICAgIC8qIEVSUl9BQlJUICAgICAgIC0xMCAqLworICAgICAgICAgICAiQ29ubmVjdGlvbiByZXNldC4iLCAgICAgIC8qIEVSUl9SU1QgICAgICAgIC0xMSAqLworICAgICAgICAgICAiQ29ubmVjdGlvbiBjbG9zZWQuIiwgICAgIC8qIEVSUl9DTFNEICAgICAgIC0xMiAqLworICAgICAgICAgICAiTm90IGNvbm5lY3RlZC4iLCAgICAgICAgIC8qIEVSUl9DT05OICAgICAgIC0xMyAqLworICAgICAgICAgICAiSWxsZWdhbCBhcmd1bWVudC4iLCAgICAgIC8qIEVSUl9BUkcgICAgICAgIC0xNCAqLworICAgICAgICAgICAiTG93LWxldmVsIG5ldGlmIGVycm9yLiIsIC8qIEVSUl9JRiAgICAgICAgIC0xNSAqLworfTsKKworLyoqCisgKiBDb252ZXJ0IGFuIGx3aXAgaW50ZXJuYWwgZXJyb3IgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgKgorICogQHBhcmFtIGVyciBhbiBsd2lwIGludGVybmFsIGVycl90CisgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBlcnIKKyAqLworY29uc3QgY2hhciAqCitsd2lwX3N0cmVycihlcnJfdCBlcnIpCit7CisgIHJldHVybiBlcnJfc3RyZXJyWy1lcnJdOworCit9CisKKyNlbmRpZiAvKiBMV0lQX0RFQlVHICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2FwaS9uZXRidWYuYyBiL2NvcmUvbHdpcC9zcmMvYXBpL25ldGJ1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTBjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2FwaS9uZXRidWYuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoqCisgKiBAZmlsZQorICogTmV0d29yayBidWZmZXIgbWFuYWdlbWVudAorICoKKyAqLworIAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX05FVENPTk4gLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL25ldGJ1Zi5oIgorI2luY2x1ZGUgImx3aXAvbWVtcC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogQ3JlYXRlIChhbGxvY2F0ZSkgYW5kIGluaXRpYWxpemUgYSBuZXcgbmV0YnVmLgorICogVGhlIG5ldGJ1ZiBkb2Vzbid0IHlldCBjb250YWluIGEgcGFja2V0IGJ1ZmZlciEKKyAqCisgKiBAcmV0dXJuIGEgcG9pbnRlciB0byBhIG5ldyBuZXRidWYKKyAqICAgICAgICAgTlVMTCBvbiBsYWNrIG9mIG1lbW9yeQorICovCitzdHJ1Y3QKK25ldGJ1ZiAqbmV0YnVmX25ldyh2b2lkKQoreworICBzdHJ1Y3QgbmV0YnVmICpidWY7CisKKyAgYnVmID0gKHN0cnVjdCBuZXRidWYgKiltZW1wX21hbGxvYyhNRU1QX05FVEJVRik7CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIGJ1Zi0+cCA9IE5VTEw7CisgICAgYnVmLT5wdHIgPSBOVUxMOworICAgIGlwX2FkZHJfc2V0X2FueSgmYnVmLT5hZGRyKTsKKyAgICBidWYtPnBvcnQgPSAwOworI2lmIExXSVBfTkVUQlVGX1JFQ1ZJTkZPIHx8IExXSVBfQ0hFQ0tTVU1fT05fQ09QWQorI2lmIExXSVBfQ0hFQ0tTVU1fT05fQ09QWQorICAgIGJ1Zi0+ZmxhZ3MgPSAwOworI2VuZGlmIC8qIExXSVBfQ0hFQ0tTVU1fT05fQ09QWSAqLworICAgIGJ1Zi0+dG9wb3J0X2Noa3N1bSA9IDA7CisjaWYgTFdJUF9ORVRCVUZfUkVDVklORk8KKyAgICBpcF9hZGRyX3NldF9hbnkoJmJ1Zi0+dG9hZGRyKTsKKyNlbmRpZiAvKiBMV0lQX05FVEJVRl9SRUNWSU5GTyAqLworI2VuZGlmIC8qIExXSVBfTkVUQlVGX1JFQ1ZJTkZPIHx8IExXSVBfQ0hFQ0tTVU1fT05fQ09QWSAqLworICAgIHJldHVybiBidWY7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyoqCisgKiBEZWFsbG9jYXRlIGEgbmV0YnVmIGFsbG9jYXRlZCBieSBuZXRidWZfbmV3KCkuCisgKgorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIGEgbmV0YnVmIGFsbG9jYXRlZCBieSBuZXRidWZfbmV3KCkKKyAqLwordm9pZAorbmV0YnVmX2RlbGV0ZShzdHJ1Y3QgbmV0YnVmICpidWYpCit7CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIGlmIChidWYtPnAgIT0gTlVMTCkgeworICAgICAgcGJ1Zl9mcmVlKGJ1Zi0+cCk7CisgICAgICBidWYtPnAgPSBidWYtPnB0ciA9IE5VTEw7CisgICAgfQorICAgIG1lbXBfZnJlZShNRU1QX05FVEJVRiwgYnVmKTsKKyAgfQorfQorCisvKioKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBwYWNrZXQgYnVmZmVyIGZvciBhIGdpdmVuIG5ldGJ1Zi4KKyAqCisgKiBAcGFyYW0gYnVmIHRoZSBuZXRidWYgZm9yIHdoaWNoIHRvIGFsbG9jYXRlIGEgcGFja2V0IGJ1ZmZlcgorICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIHBhY2tldCBidWZmZXIgdG8gYWxsb2NhdGUKKyAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeQorICogICAgICAgICBOVUxMIGlmIG5vIG1lbW9yeSBjb3VsZCBiZSBhbGxvY2F0ZWQKKyAqLwordm9pZCAqCituZXRidWZfYWxsb2Moc3RydWN0IG5ldGJ1ZiAqYnVmLCB1MTZfdCBzaXplKQoreworICBMV0lQX0VSUk9SKCJuZXRidWZfYWxsb2M6IGludmFsaWQgYnVmIiwgKGJ1ZiAhPSBOVUxMKSwgcmV0dXJuIE5VTEw7KTsKKworICAvKiBEZWFsbG9jYXRlIGFueSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkuICovCisgIGlmIChidWYtPnAgIT0gTlVMTCkgeworICAgIHBidWZfZnJlZShidWYtPnApOworICB9CisgIGJ1Zi0+cCA9IHBidWZfYWxsb2MoUEJVRl9UUkFOU1BPUlQsIHNpemUsIFBCVUZfUkFNKTsKKyAgaWYgKGJ1Zi0+cCA9PSBOVUxMKSB7CisgICAgIHJldHVybiBOVUxMOworICB9CisgIExXSVBfQVNTRVJUKCJjaGVjayB0aGF0IGZpcnN0IHBidWYgY2FuIGhvbGQgc2l6ZSIsCisgICAgICAgICAgICAgKGJ1Zi0+cC0+bGVuID49IHNpemUpKTsKKyAgYnVmLT5wdHIgPSBidWYtPnA7CisgIHJldHVybiBidWYtPnAtPnBheWxvYWQ7Cit9CisKKy8qKgorICogRnJlZSB0aGUgcGFja2V0IGJ1ZmZlciBpbmNsdWRlZCBpbiBhIG5ldGJ1ZgorICoKKyAqIEBwYXJhbSBidWYgcG9pbnRlciB0byB0aGUgbmV0YnVmIHdoaWNoIGNvbnRhaW5zIHRoZSBwYWNrZXQgYnVmZmVyIHRvIGZyZWUKKyAqLwordm9pZAorbmV0YnVmX2ZyZWUoc3RydWN0IG5ldGJ1ZiAqYnVmKQoreworICBMV0lQX0VSUk9SKCJuZXRidWZfZnJlZTogaW52YWxpZCBidWYiLCAoYnVmICE9IE5VTEwpLCByZXR1cm47KTsKKyAgaWYgKGJ1Zi0+cCAhPSBOVUxMKSB7CisgICAgcGJ1Zl9mcmVlKGJ1Zi0+cCk7CisgIH0KKyAgYnVmLT5wID0gYnVmLT5wdHIgPSBOVUxMOworfQorCisvKioKKyAqIExldCBhIG5ldGJ1ZiByZWZlcmVuY2UgZXhpc3RpbmcgKG5vbi12b2xhdGlsZSkgZGF0YS4KKyAqCisgKiBAcGFyYW0gYnVmIG5ldGJ1ZiB3aGljaCBzaG91bGQgcmVmZXJlbmNlIHRoZSBkYXRhCisgKiBAcGFyYW0gZGF0YXB0ciBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIHJlZmVyZW5jZQorICogQHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgZGF0YQorICogQHJldHVybiBFUlJfT0sgaWYgZGF0YSBpcyByZWZlcmVuY2VkCisgKiAgICAgICAgIEVSUl9NRU0gaWYgZGF0YSBjb3VsZG4ndCBiZSByZWZlcmVuY2VkIGR1ZSB0byBsYWNrIG9mIG1lbW9yeQorICovCitlcnJfdAorbmV0YnVmX3JlZihzdHJ1Y3QgbmV0YnVmICpidWYsIGNvbnN0IHZvaWQgKmRhdGFwdHIsIHUxNl90IHNpemUpCit7CisgIExXSVBfRVJST1IoIm5ldGJ1Zl9yZWY6IGludmFsaWQgYnVmIiwgKGJ1ZiAhPSBOVUxMKSwgcmV0dXJuIEVSUl9BUkc7KTsKKyAgaWYgKGJ1Zi0+cCAhPSBOVUxMKSB7CisgICAgcGJ1Zl9mcmVlKGJ1Zi0+cCk7CisgIH0KKyAgYnVmLT5wID0gcGJ1Zl9hbGxvYyhQQlVGX1RSQU5TUE9SVCwgMCwgUEJVRl9SRUYpOworICBpZiAoYnVmLT5wID09IE5VTEwpIHsKKyAgICBidWYtPnB0ciA9IE5VTEw7CisgICAgcmV0dXJuIEVSUl9NRU07CisgIH0KKyAgYnVmLT5wLT5wYXlsb2FkID0gKHZvaWQqKWRhdGFwdHI7CisgIGJ1Zi0+cC0+bGVuID0gYnVmLT5wLT50b3RfbGVuID0gc2l6ZTsKKyAgYnVmLT5wdHIgPSBidWYtPnA7CisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogQ2hhaW4gb25lIG5ldGJ1ZiB0byBhbm90aGVyIChAc2VlIHBidWZfY2hhaW4pCisgKgorICogQHBhcmFtIGhlYWQgdGhlIGZpcnN0IG5ldGJ1ZgorICogQHBhcmFtIHRhaWwgbmV0YnVmIHRvIGNoYWluIGFmdGVyIGhlYWQsIGZyZWVkIGJ5IHRoaXMgZnVuY3Rpb24sIG1heSBub3QgYmUgcmVmZXJlbmNlIGFmdGVyIHJldHVybmluZworICovCit2b2lkCituZXRidWZfY2hhaW4oc3RydWN0IG5ldGJ1ZiAqaGVhZCwgc3RydWN0IG5ldGJ1ZiAqdGFpbCkKK3sKKyAgTFdJUF9FUlJPUigibmV0YnVmX3JlZjogaW52YWxpZCBoZWFkIiwgKGhlYWQgIT0gTlVMTCksIHJldHVybjspOworICBMV0lQX0VSUk9SKCJuZXRidWZfY2hhaW46IGludmFsaWQgdGFpbCIsICh0YWlsICE9IE5VTEwpLCByZXR1cm47KTsKKyAgcGJ1Zl9jYXQoaGVhZC0+cCwgdGFpbC0+cCk7CisgIGhlYWQtPnB0ciA9IGhlYWQtPnA7CisgIG1lbXBfZnJlZShNRU1QX05FVEJVRiwgdGFpbCk7Cit9CisKKy8qKgorICogR2V0IHRoZSBkYXRhIHBvaW50ZXIgYW5kIGxlbmd0aCBvZiB0aGUgZGF0YSBpbnNpZGUgYSBuZXRidWYuCisgKgorICogQHBhcmFtIGJ1ZiBuZXRidWYgdG8gZ2V0IHRoZSBkYXRhIGZyb20KKyAqIEBwYXJhbSBkYXRhcHRyIHBvaW50ZXIgdG8gYSB2b2lkIHBvaW50ZXIgd2hlcmUgdG8gc3RvcmUgdGhlIGRhdGEgcG9pbnRlcgorICogQHBhcmFtIGxlbiBwb2ludGVyIHRvIGFuIHUxNl90IHdoZXJlIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaXMgc3RvcmVkCisgKiBAcmV0dXJuIEVSUl9PSyBpZiB0aGUgaW5mb3JtYXRpb24gd2FzIHJldHJlaXZlZCwKKyAqICAgICAgICAgRVJSX0JVRiBvbiBlcnJvci4KKyAqLworZXJyX3QKK25ldGJ1Zl9kYXRhKHN0cnVjdCBuZXRidWYgKmJ1Ziwgdm9pZCAqKmRhdGFwdHIsIHUxNl90ICpsZW4pCit7CisgIExXSVBfRVJST1IoIm5ldGJ1Zl9kYXRhOiBpbnZhbGlkIGJ1ZiIsIChidWYgIT0gTlVMTCksIHJldHVybiBFUlJfQVJHOyk7CisgIExXSVBfRVJST1IoIm5ldGJ1Zl9kYXRhOiBpbnZhbGlkIGRhdGFwdHIiLCAoZGF0YXB0ciAhPSBOVUxMKSwgcmV0dXJuIEVSUl9BUkc7KTsKKyAgTFdJUF9FUlJPUigibmV0YnVmX2RhdGE6IGludmFsaWQgbGVuIiwgKGxlbiAhPSBOVUxMKSwgcmV0dXJuIEVSUl9BUkc7KTsKKworICBpZiAoYnVmLT5wdHIgPT0gTlVMTCkgeworICAgIHJldHVybiBFUlJfQlVGOworICB9CisgICpkYXRhcHRyID0gYnVmLT5wdHItPnBheWxvYWQ7CisgICpsZW4gPSBidWYtPnB0ci0+bGVuOworICByZXR1cm4gRVJSX09LOworfQorCisvKioKKyAqIE1vdmUgdGhlIGN1cnJlbnQgZGF0YSBwb2ludGVyIG9mIGEgcGFja2V0IGJ1ZmZlciBjb250YWluZWQgaW4gYSBuZXRidWYKKyAqIHRvIHRoZSBuZXh0IHBhcnQuCisgKiBUaGUgcGFja2V0IGJ1ZmZlciBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgorICoKKyAqIEBwYXJhbSBidWYgdGhlIG5ldGJ1ZiB0byBtb2RpZnkKKyAqIEByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gbmV4dCBwYXJ0CisgKiAgICAgICAgIDEgIGlmIG1vdmVkIHRvIHRoZSBuZXh0IHBhcnQgYnV0IG5vdyB0aGVyZSBpcyBubyBuZXh0IHBhcnQKKyAqICAgICAgICAgMCAgaWYgbW92ZWQgdG8gdGhlIG5leHQgcGFydCBhbmQgdGhlcmUgYXJlIHN0aWxsIG1vcmUgcGFydHMKKyAqLworczhfdAorbmV0YnVmX25leHQoc3RydWN0IG5ldGJ1ZiAqYnVmKQoreworICBMV0lQX0VSUk9SKCJuZXRidWZfZnJlZTogaW52YWxpZCBidWYiLCAoYnVmICE9IE5VTEwpLCByZXR1cm4gLTE7KTsKKyAgaWYgKGJ1Zi0+cHRyLT5uZXh0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgYnVmLT5wdHIgPSBidWYtPnB0ci0+bmV4dDsKKyAgaWYgKGJ1Zi0+cHRyLT5uZXh0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqCisgKiBNb3ZlIHRoZSBjdXJyZW50IGRhdGEgcG9pbnRlciBvZiBhIHBhY2tldCBidWZmZXIgY29udGFpbmVkIGluIGEgbmV0YnVmCisgKiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQuCisgKiBUaGUgcGFja2V0IGJ1ZmZlciBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgorICoKKyAqIEBwYXJhbSBidWYgdGhlIG5ldGJ1ZiB0byBtb2RpZnkKKyAqLwordm9pZAorbmV0YnVmX2ZpcnN0KHN0cnVjdCBuZXRidWYgKmJ1ZikKK3sKKyAgTFdJUF9FUlJPUigibmV0YnVmX2ZyZWU6IGludmFsaWQgYnVmIiwgKGJ1ZiAhPSBOVUxMKSwgcmV0dXJuOyk7CisgIGJ1Zi0+cHRyID0gYnVmLT5wOworfQorCisjZW5kaWYgLyogTFdJUF9ORVRDT05OICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2FwaS9uZXRkYi5jIGIvY29yZS9sd2lwL3NyYy9hcGkvbmV0ZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2U0ZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9hcGkvbmV0ZGIuYwpAQCAtMCwwICsxLDM1MiBAQAorLyoqCisgKiBAZmlsZQorICogQVBJIGZ1bmN0aW9ucyBmb3IgbmFtZSByZXNvbHZpbmcKKyAqCisgKi8KKworLyoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogU2ltb24gR29sZHNjaG1pZHQKKyAqCisgKi8KKworI2luY2x1ZGUgImx3aXAvbmV0ZGIuaCIKKworI2lmIExXSVBfRE5TICYmIExXSVBfU09DS0VUCisKKyNpbmNsdWRlICJsd2lwL2Vyci5oIgorI2luY2x1ZGUgImx3aXAvbWVtLmgiCisjaW5jbHVkZSAibHdpcC9tZW1wLmgiCisjaW5jbHVkZSAibHdpcC9pcF9hZGRyLmgiCisjaW5jbHVkZSAibHdpcC9hcGkuaCIKKyNpbmNsdWRlICJsd2lwL2Rucy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qKiBoZWxwZXIgc3RydWN0IGZvciBnZXRob3N0YnluYW1lX3IgdG8gYWNjZXNzIHRoZSBjaGFyKiBidWZmZXIgKi8KK3N0cnVjdCBnZXRob3N0YnluYW1lX3JfaGVscGVyIHsKKyAgaXBfYWRkcl90ICphZGRyczsKKyAgaXBfYWRkcl90IGFkZHI7CisgIGNoYXIgKmFsaWFzZXM7Cit9OworCisvKiogaF9lcnJubyBpcyBleHBvcnRlZCBpbiBuZXRkYi5oIGZvciBhY2Nlc3MgYnkgYXBwbGljYXRpb25zLiAqLworI2lmIExXSVBfRE5TX0FQSV9ERUNMQVJFX0hfRVJSTk8KK2ludCBoX2Vycm5vOworI2VuZGlmIC8qIExXSVBfRE5TX0FQSV9ERUNMQVJFX0hfRVJSTk8gKi8KKworLyoqIGRlZmluZSAiaG9zdGVudCIgdmFyaWFibGVzIHN0b3JhZ2U6IDAgaWYgd2UgdXNlIGEgc3RhdGljIChidXQgdW5wcm90ZWN0ZWQpCisgKiBzZXQgb2YgdmFyaWFibGVzIGZvciBsd2lwX2dldGhvc3RieW5hbWUsIDEgaWYgd2UgdXNlIGEgbG9jYWwgc3RvcmFnZSAqLworI2lmbmRlZiBMV0lQX0ROU19BUElfSE9TVEVOVF9TVE9SQUdFCisjZGVmaW5lIExXSVBfRE5TX0FQSV9IT1NURU5UX1NUT1JBR0UgMAorI2VuZGlmCisKKy8qKiBkZWZpbmUgImhvc3RlbnQiIHZhcmlhYmxlcyBzdG9yYWdlICovCisjaWYgTFdJUF9ETlNfQVBJX0hPU1RFTlRfU1RPUkFHRQorI2RlZmluZSBIT1NURU5UX1NUT1JBR0UKKyNlbHNlCisjZGVmaW5lIEhPU1RFTlRfU1RPUkFHRSBzdGF0aWMKKyNlbmRpZiAvKiBMV0lQX0ROU19BUElfU1RBVElDX0hPU1RFTlQgKi8KKworLyoqCisgKiBSZXR1cm5zIGFuIGVudHJ5IGNvbnRhaW5pbmcgYWRkcmVzc2VzIG9mIGFkZHJlc3MgZmFtaWx5IEFGX0lORVQKKyAqIGZvciB0aGUgaG9zdCB3aXRoIG5hbWUgbmFtZS4KKyAqIER1ZSB0byBkbnNfZ2V0aG9zdGJ5bmFtZSBsaW1pdGF0aW9ucywgb25seSBvbmUgYWRkcmVzcyBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgaG9zdG5hbWUgdG8gcmVzb2x2ZQorICogQHJldHVybiBhbiBlbnRyeSBjb250YWluaW5nIGFkZHJlc3NlcyBvZiBhZGRyZXNzIGZhbWlseSBBRl9JTkVUCisgKiAgICAgICAgIGZvciB0aGUgaG9zdCB3aXRoIG5hbWUgbmFtZQorICovCitzdHJ1Y3QgaG9zdGVudCoKK2x3aXBfZ2V0aG9zdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICBlcnJfdCBlcnI7CisgIGlwX2FkZHJfdCBhZGRyOworCisgIC8qIGJ1ZmZlciB2YXJpYWJsZXMgZm9yIGx3aXBfZ2V0aG9zdGJ5bmFtZSgpICovCisgIEhPU1RFTlRfU1RPUkFHRSBzdHJ1Y3QgaG9zdGVudCBzX2hvc3RlbnQ7CisgIEhPU1RFTlRfU1RPUkFHRSBjaGFyICpzX2FsaWFzZXM7CisgIEhPU1RFTlRfU1RPUkFHRSBpcF9hZGRyX3Qgc19ob3N0ZW50X2FkZHI7CisgIEhPU1RFTlRfU1RPUkFHRSBpcF9hZGRyX3QgKnNfcGhvc3RlbnRfYWRkclsyXTsKKworICAvKiBxdWVyeSBob3N0IElQIGFkZHJlc3MgKi8KKyAgZXJyID0gbmV0Y29ubl9nZXRob3N0YnluYW1lKG5hbWUsICZhZGRyKTsKKyAgaWYgKGVyciAhPSBFUlJfT0spIHsKKyAgICBMV0lQX0RFQlVHRihETlNfREVCVUcsICgibHdpcF9nZXRob3N0YnluYW1lKCVzKSBmYWlsZWQsIGVycj0lZFxuIiwgbmFtZSwgZXJyKSk7CisgICAgaF9lcnJubyA9IEhPU1RfTk9UX0ZPVU5EOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyogZmlsbCBob3N0ZW50ICovCisgIHNfaG9zdGVudF9hZGRyID0gYWRkcjsKKyAgc19waG9zdGVudF9hZGRyWzBdID0gJnNfaG9zdGVudF9hZGRyOworICBzX3Bob3N0ZW50X2FkZHJbMV0gPSBOVUxMOworICBzX2hvc3RlbnQuaF9uYW1lID0gKGNoYXIqKW5hbWU7CisgIHNfaG9zdGVudC5oX2FsaWFzZXMgPSAmc19hbGlhc2VzOworICBzX2hvc3RlbnQuaF9hZGRydHlwZSA9IEFGX0lORVQ7CisgIHNfaG9zdGVudC5oX2xlbmd0aCA9IHNpemVvZihpcF9hZGRyX3QpOworICBzX2hvc3RlbnQuaF9hZGRyX2xpc3QgPSAoY2hhcioqKSZzX3Bob3N0ZW50X2FkZHI7CisKKyNpZiBETlNfREVCVUcKKyAgLyogZHVtcCBob3N0ZW50ICovCisgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJob3N0ZW50LmhfbmFtZSAgICAgICAgICAgPT0gJXNcbiIsIHNfaG9zdGVudC5oX25hbWUpKTsKKyAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImhvc3RlbnQuaF9hbGlhc2VzICAgICAgICA9PSAlcFxuIiwgc19ob3N0ZW50LmhfYWxpYXNlcykpOworICBpZiAoc19ob3N0ZW50LmhfYWxpYXNlcyAhPSBOVUxMKSB7CisgICAgdThfdCBpZHg7CisgICAgZm9yICggaWR4PTA7IHNfaG9zdGVudC5oX2FsaWFzZXNbaWR4XTsgaWR4KyspIHsKKyAgICAgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJob3N0ZW50LmhfYWxpYXNlc1slaV0tPiAgID09ICVwXG4iLCBpZHgsIHNfaG9zdGVudC5oX2FsaWFzZXNbaWR4XSkpOworICAgICAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImhvc3RlbnQuaF9hbGlhc2VzWyVpXS0+ICAgPT0gJXNcbiIsIGlkeCwgc19ob3N0ZW50LmhfYWxpYXNlc1tpZHhdKSk7CisgICAgfQorICB9CisgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJob3N0ZW50LmhfYWRkcnR5cGUgICAgICAgPT0gJWRcbiIsIHNfaG9zdGVudC5oX2FkZHJ0eXBlKSk7CisgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJob3N0ZW50LmhfbGVuZ3RoICAgICAgICAgPT0gJWRcbiIsIHNfaG9zdGVudC5oX2xlbmd0aCkpOworICBMV0lQX0RFQlVHRihETlNfREVCVUcsICgiaG9zdGVudC5oX2FkZHJfbGlzdCAgICAgID09ICVwXG4iLCBzX2hvc3RlbnQuaF9hZGRyX2xpc3QpKTsKKyAgaWYgKHNfaG9zdGVudC5oX2FkZHJfbGlzdCAhPSBOVUxMKSB7CisgICAgdThfdCBpZHg7CisgICAgZm9yICggaWR4PTA7IHNfaG9zdGVudC5oX2FkZHJfbGlzdFtpZHhdOyBpZHgrKykgeworICAgICAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImhvc3RlbnQuaF9hZGRyX2xpc3RbJWldICAgPT0gJXBcbiIsIGlkeCwgc19ob3N0ZW50LmhfYWRkcl9saXN0W2lkeF0pKTsKKyAgICAgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJob3N0ZW50LmhfYWRkcl9saXN0WyVpXS0+ID09ICVzXG4iLCBpZHgsIGlwX250b2EoKGlwX2FkZHJfdCopc19ob3N0ZW50LmhfYWRkcl9saXN0W2lkeF0pKSk7CisgICAgfQorICB9CisjZW5kaWYgLyogRE5TX0RFQlVHICovCisKKyNpZiBMV0lQX0ROU19BUElfSE9TVEVOVF9TVE9SQUdFCisgIC8qIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgInBlci10aHJlYWQiIGhvc3RlbnQgYWZ0ZXIgY29weSBmcm9tIHNfaG9zdGVudCAqLworICByZXR1cm4gc3lzX3RocmVhZF9ob3N0ZW50KCZzX2hvc3RlbnQpOworI2Vsc2UKKyAgcmV0dXJuICZzX2hvc3RlbnQ7CisjZW5kaWYgLyogTFdJUF9ETlNfQVBJX0hPU1RFTlRfU1RPUkFHRSAqLworfQorCisvKioKKyAqIFRocmVhZC1zYWZlIHZhcmlhbnQgb2YgbHdpcF9nZXRob3N0YnluYW1lOiBpbnN0ZWFkIG9mIHVzaW5nIGEgc3RhdGljCisgKiBidWZmZXIsIHRoaXMgZnVuY3Rpb24gdGFrZXMgYnVmZmVyIGFuZCBlcnJubyBwb2ludGVycyBhcyBhcmd1bWVudHMKKyAqIGFuZCB1c2VzIHRoZXNlIGZvciB0aGUgcmVzdWx0LgorICoKKyAqIEBwYXJhbSBuYW1lIHRoZSBob3N0bmFtZSB0byByZXNvbHZlCisgKiBAcGFyYW0gcmV0IHByZS1hbGxvY2F0ZWQgc3RydWN0IHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyAqIEBwYXJhbSBidWYgcHJlLWFsbG9jYXRlZCBidWZmZXIgd2hlcmUgdG8gc3RvcmUgYWRkaXRpb25hbCBkYXRhCisgKiBAcGFyYW0gYnVmbGVuIHRoZSBzaXplIG9mIGJ1ZgorICogQHBhcmFtIHJlc3VsdCBwb2ludGVyIHRvIGEgaG9zdGVudCBwb2ludGVyIHRoYXQgaXMgc2V0IHRvIHJldCBvbiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgIGFuZCBzZXQgdG8gemVybyBvbiBlcnJvcgorICogQHBhcmFtIGhfZXJybm9wIHBvaW50ZXIgdG8gYW4gaW50IHdoZXJlIHRvIHN0b3JlIGVycm9ycyAoaW5zdGVhZCBvZiBtb2RpZnlpbmcKKyAqICAgICAgICAgICAgICAgICB0aGUgZ2xvYmFsIGhfZXJybm8pCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IsIGFkZGl0aW9uYWwgZXJyb3IgaW5mb3JtYXRpb24KKyAqICAgICAgICAgaXMgc3RvcmVkIGluICpoX2Vycm5vcCBpbnN0ZWFkIG9mIGhfZXJybm8gdG8gYmUgdGhyZWFkLXNhZmUKKyAqLworaW50Citsd2lwX2dldGhvc3RieW5hbWVfcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaG9zdGVudCAqcmV0LCBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zmxlbiwgc3RydWN0IGhvc3RlbnQgKipyZXN1bHQsIGludCAqaF9lcnJub3ApCit7CisgIGVycl90IGVycjsKKyAgc3RydWN0IGdldGhvc3RieW5hbWVfcl9oZWxwZXIgKmg7CisgIGNoYXIgKmhvc3RuYW1lOworICBzaXplX3QgbmFtZWxlbjsKKyAgaW50IGxoX2Vycm5vOworCisgIGlmIChoX2Vycm5vcCA9PSBOVUxMKSB7CisgICAgLyogZW5zdXJlIGhfZXJybm9wIGlzIG5ldmVyIE5VTEwgKi8KKyAgICBoX2Vycm5vcCA9ICZsaF9lcnJubzsKKyAgfQorCisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIC8qIG5vdCBhbGwgYXJndW1lbnRzIGdpdmVuICovCisgICAgKmhfZXJybm9wID0gRUlOVkFMOworICAgIHJldHVybiAtMTsKKyAgfQorICAvKiBmaXJzdCB0aGluZyB0byBkbzogc2V0ICpyZXN1bHQgdG8gbm90aGluZyAqLworICAqcmVzdWx0ID0gTlVMTDsKKyAgaWYgKChuYW1lID09IE5VTEwpIHx8IChyZXQgPT0gTlVMTCkgfHwgKGJ1ZiA9PSAwKSkgeworICAgIC8qIG5vdCBhbGwgYXJndW1lbnRzIGdpdmVuICovCisgICAgKmhfZXJybm9wID0gRUlOVkFMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisgIGlmIChidWZsZW4gPCAoc2l6ZW9mKHN0cnVjdCBnZXRob3N0YnluYW1lX3JfaGVscGVyKSArIG5hbWVsZW4gKyAxICsgKE1FTV9BTElHTk1FTlQgLSAxKSkpIHsKKyAgICAvKiBidWYgY2FuJ3QgaG9sZCB0aGUgZGF0YSBuZWVkZWQgKyBhIGNvcHkgb2YgbmFtZSAqLworICAgICpoX2Vycm5vcCA9IEVSQU5HRTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBoID0gKHN0cnVjdCBnZXRob3N0YnluYW1lX3JfaGVscGVyKilMV0lQX01FTV9BTElHTihidWYpOworICBob3N0bmFtZSA9ICgoY2hhciopaCkgKyBzaXplb2Yoc3RydWN0IGdldGhvc3RieW5hbWVfcl9oZWxwZXIpOworCisgIC8qIHF1ZXJ5IGhvc3QgSVAgYWRkcmVzcyAqLworICBlcnIgPSBuZXRjb25uX2dldGhvc3RieW5hbWUobmFtZSwgJihoLT5hZGRyKSk7CisgIGlmIChlcnIgIT0gRVJSX09LKSB7CisgICAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImx3aXBfZ2V0aG9zdGJ5bmFtZSglcykgZmFpbGVkLCBlcnI9JWRcbiIsIG5hbWUsIGVycikpOworICAgICpoX2Vycm5vcCA9IEVOU1JOT1RGT1VORDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBjb3B5IHRoZSBob3N0bmFtZSBpbnRvIGJ1ZiAqLworICBNRU1DUFkoaG9zdG5hbWUsIG5hbWUsIG5hbWVsZW4pOworICBob3N0bmFtZVtuYW1lbGVuXSA9IDA7CisKKyAgLyogZmlsbCBob3N0ZW50ICovCisgIGgtPmFkZHJzID0gJihoLT5hZGRyKTsKKyAgaC0+YWxpYXNlcyA9IE5VTEw7CisgIHJldC0+aF9uYW1lID0gKGNoYXIqKWhvc3RuYW1lOworICByZXQtPmhfYWxpYXNlcyA9ICYoaC0+YWxpYXNlcyk7CisgIHJldC0+aF9hZGRydHlwZSA9IEFGX0lORVQ7CisgIHJldC0+aF9sZW5ndGggPSBzaXplb2YoaXBfYWRkcl90KTsKKyAgcmV0LT5oX2FkZHJfbGlzdCA9IChjaGFyKiopJihoLT5hZGRycyk7CisKKyAgLyogc2V0IHJlc3VsdCAhPSBOVUxMICovCisgICpyZXN1bHQgPSByZXQ7CisKKyAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRnJlZXMgb25lIG9yIG1vcmUgYWRkcmluZm8gc3RydWN0dXJlcyByZXR1cm5lZCBieSBnZXRhZGRyaW5mbygpLCBhbG9uZyB3aXRoCisgKiBhbnkgYWRkaXRpb25hbCBzdG9yYWdlIGFzc29jaWF0ZWQgd2l0aCB0aG9zZSBzdHJ1Y3R1cmVzLiBJZiB0aGUgYWlfbmV4dCBmaWVsZAorICogb2YgdGhlIHN0cnVjdHVyZSBpcyBub3QgbnVsbCwgdGhlIGVudGlyZSBsaXN0IG9mIHN0cnVjdHVyZXMgaXMgZnJlZWQuCisgKgorICogQHBhcmFtIGFpIHN0cnVjdCBhZGRyaW5mbyB0byBmcmVlCisgKi8KK3ZvaWQKK2x3aXBfZnJlZWFkZHJpbmZvKHN0cnVjdCBhZGRyaW5mbyAqYWkpCit7CisgIHN0cnVjdCBhZGRyaW5mbyAqbmV4dDsKKworICB3aGlsZSAoYWkgIT0gTlVMTCkgeworICAgIG5leHQgPSBhaS0+YWlfbmV4dDsKKyAgICBtZW1wX2ZyZWUoTUVNUF9ORVREQiwgYWkpOworICAgIGFpID0gbmV4dDsKKyAgfQorfQorCisvKioKKyAqIFRyYW5zbGF0ZXMgdGhlIG5hbWUgb2YgYSBzZXJ2aWNlIGxvY2F0aW9uIChmb3IgZXhhbXBsZSwgYSBob3N0IG5hbWUpIGFuZC9vcgorICogYSBzZXJ2aWNlIG5hbWUgYW5kIHJldHVybnMgYSBzZXQgb2Ygc29ja2V0IGFkZHJlc3NlcyBhbmQgYXNzb2NpYXRlZAorICogaW5mb3JtYXRpb24gdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIHNvY2tldCB3aXRoIHdoaWNoIHRvIGFkZHJlc3MgdGhlCisgKiBzcGVjaWZpZWQgc2VydmljZS4KKyAqIE1lbW9yeSBmb3IgdGhlIHJlc3VsdCBpcyBhbGxvY2F0ZWQgaW50ZXJuYWxseSBhbmQgbXVzdCBiZSBmcmVlZCBieSBjYWxsaW5nCisgKiBsd2lwX2ZyZWVhZGRyaW5mbygpIQorICoKKyAqIER1ZSB0byBhIGxpbWl0YXRpb24gaW4gZG5zX2dldGhvc3RieW5hbWUsIG9ubHkgdGhlIGZpcnN0IGFkZHJlc3Mgb2YgYQorICogaG9zdCBpcyByZXR1cm5lZC4KKyAqIEFsc28sIHNlcnZpY2UgbmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQgKG9ubHkgcG9ydCBudW1iZXJzKSEKKyAqCisgKiBAcGFyYW0gbm9kZW5hbWUgZGVzY3JpcHRpdmUgbmFtZSBvciBhZGRyZXNzIHN0cmluZyBvZiB0aGUgaG9zdAorICogICAgICAgICAgICAgICAgIChtYXkgYmUgTlVMTCAtPiBsb2NhbCBhZGRyZXNzKQorICogQHBhcmFtIHNlcnZuYW1lIHBvcnQgbnVtYmVyIGFzIHN0cmluZyBvZiBOVUxMIAorICogQHBhcmFtIGhpbnRzIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IHZhbHVlcyB0aGF0IHNldCBzb2NrdHlwZSBhbmQgcHJvdG9jb2wKKyAqIEBwYXJhbSByZXMgcG9pbnRlciB0byBhIHBvaW50ZXIgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdCAoc2V0IHRvIE5VTEwgb24gZmFpbHVyZSkKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlCisgKi8KK2ludAorbHdpcF9nZXRhZGRyaW5mbyhjb25zdCBjaGFyICpub2RlbmFtZSwgY29uc3QgY2hhciAqc2Vydm5hbWUsCisgICAgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cywgc3RydWN0IGFkZHJpbmZvICoqcmVzKQoreworICBlcnJfdCBlcnI7CisgIGlwX2FkZHJfdCBhZGRyOworICBzdHJ1Y3QgYWRkcmluZm8gKmFpOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhID0gTlVMTDsKKyAgaW50IHBvcnRfbnIgPSAwOworICBzaXplX3QgdG90YWxfc2l6ZTsKKyAgc2l6ZV90IG5hbWVsZW4gPSAwOworCisgIGlmIChyZXMgPT0gTlVMTCkgeworICAgIHJldHVybiBFQUlfRkFJTDsKKyAgfQorICAqcmVzID0gTlVMTDsKKyAgaWYgKChub2RlbmFtZSA9PSBOVUxMKSAmJiAoc2Vydm5hbWUgPT0gTlVMTCkpIHsKKyAgICByZXR1cm4gRUFJX05PTkFNRTsKKyAgfQorCisgIGlmIChzZXJ2bmFtZSAhPSBOVUxMKSB7CisgICAgLyogc2VydmljZSBuYW1lIHNwZWNpZmllZDogY29udmVydCB0byBwb3J0IG51bWJlcgorICAgICAqIEB0b2RvPzogY3VycmVudGx5LCBvbmx5IEFTQ0lJIGludGVnZXJzIChwb3J0IG51bWJlcnMpIGFyZSBzdXBwb3J0ZWQhICovCisgICAgcG9ydF9uciA9IGF0b2koc2Vydm5hbWUpOworICAgIGlmICgocG9ydF9uciA8PSAwKSB8fCAocG9ydF9uciA+IDB4ZmZmZikpIHsKKyAgICAgIHJldHVybiBFQUlfU0VSVklDRTsKKyAgICB9CisgIH0KKworICBpZiAobm9kZW5hbWUgIT0gTlVMTCkgeworICAgIC8qIHNlcnZpY2UgbG9jYXRpb24gc3BlY2lmaWVkLCB0cnkgdG8gcmVzb2x2ZSAqLworICAgIGVyciA9IG5ldGNvbm5fZ2V0aG9zdGJ5bmFtZShub2RlbmFtZSwgJmFkZHIpOworICAgIGlmIChlcnIgIT0gRVJSX09LKSB7CisgICAgICByZXR1cm4gRUFJX0ZBSUw7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIHNlcnZpY2UgbG9jYXRpb24gc3BlY2lmaWVkLCB1c2UgbG9vcGJhY2sgYWRkcmVzcyAqLworICAgIGlwX2FkZHJfc2V0X2xvb3BiYWNrKCZhZGRyKTsKKyAgfQorCisgIHRvdGFsX3NpemUgPSBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICBpZiAobm9kZW5hbWUgIT0gTlVMTCkgeworICAgIG5hbWVsZW4gPSBzdHJsZW4obm9kZW5hbWUpOworICAgIExXSVBfQVNTRVJUKCJuYW1lbGVuIGlzIHRvbyBsb25nIiwgKG5hbWVsZW4gKyAxKSA8PSAobWVtX3NpemVfdCktMSk7CisgICAgdG90YWxfc2l6ZSArPSBuYW1lbGVuICsgMTsKKyAgfQorICAvKiBJZiB0aGlzIGZhaWxzLCBwbGVhc2UgcmVwb3J0IHRvIGx3aXAtZGV2ZWwhIDotKSAqLworICBMV0lQX0FTU0VSVCgidG90YWxfc2l6ZSA8PSBORVREQl9FTEVNX1NJWkU6IHBsZWFzZSByZXBvcnQgdGhpcyEiLAorICAgIHRvdGFsX3NpemUgPD0gTkVUREJfRUxFTV9TSVpFKTsKKyAgYWkgPSAoc3RydWN0IGFkZHJpbmZvICopbWVtcF9tYWxsb2MoTUVNUF9ORVREQik7CisgIGlmIChhaSA9PSBOVUxMKSB7CisgICAgZ290byBtZW1lcnI7CisgIH0KKyAgbWVtc2V0KGFpLCAwLCB0b3RhbF9zaXplKTsKKyAgc2EgPSAoc3RydWN0IHNvY2thZGRyX2luKikoKHU4X3QqKWFpICsgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworICAvKiBzZXQgdXAgc29ja2FkZHIgKi8KKyAgaW5ldF9hZGRyX2Zyb21faXBhZGRyKCZzYS0+c2luX2FkZHIsICZhZGRyKTsKKyAgc2EtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzYS0+c2luX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICBzYS0+c2luX3BvcnQgPSBodG9ucygodTE2X3QpcG9ydF9ucik7CisKKyAgLyogc2V0IHVwIGFkZHJpbmZvICovCisgIGFpLT5haV9mYW1pbHkgPSBBRl9JTkVUOworICBpZiAoaGludHMgIT0gTlVMTCkgeworICAgIC8qIGNvcHkgc29ja3R5cGUgJiBwcm90b2NvbCBmcm9tIGhpbnRzIGlmIHNwZWNpZmllZCAqLworICAgIGFpLT5haV9zb2NrdHlwZSA9IGhpbnRzLT5haV9zb2NrdHlwZTsKKyAgICBhaS0+YWlfcHJvdG9jb2wgPSBoaW50cy0+YWlfcHJvdG9jb2w7CisgIH0KKyAgaWYgKG5vZGVuYW1lICE9IE5VTEwpIHsKKyAgICAvKiBjb3B5IG5vZGVuYW1lIHRvIGNhbm9ubmFtZSBpZiBzcGVjaWZpZWQgKi8KKyAgICBhaS0+YWlfY2Fub25uYW1lID0gKChjaGFyKilhaSArIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworICAgIE1FTUNQWShhaS0+YWlfY2Fub25uYW1lLCBub2RlbmFtZSwgbmFtZWxlbik7CisgICAgYWktPmFpX2Nhbm9ubmFtZVtuYW1lbGVuXSA9IDA7CisgIH0KKyAgYWktPmFpX2FkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgYWktPmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyKilzYTsKKworICAqcmVzID0gYWk7CisKKyAgcmV0dXJuIDA7CittZW1lcnI6CisgIGlmIChhaSAhPSBOVUxMKSB7CisgICAgbWVtcF9mcmVlKE1FTVBfTkVUREIsIGFpKTsKKyAgfQorICByZXR1cm4gRUFJX01FTU9SWTsKK30KKworI2VuZGlmIC8qIExXSVBfRE5TICYmIExXSVBfU09DS0VUICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2FwaS9uZXRpZmFwaS5jIGIvY29yZS9sd2lwL3NyYy9hcGkvbmV0aWZhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2U0NzIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9hcGkvbmV0aWZhcGkuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoqCisgKiBAZmlsZQorICogTmV0d29yayBJbnRlcmZhY2UgU2VxdWVudGlhbCBBUEkgbW9kdWxlCisgKgorICovCisKKy8qCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX05FVElGX0FQSSAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvbmV0aWZhcGkuaCIKKyNpbmNsdWRlICJsd2lwL3RjcGlwLmgiCisKKy8qKgorICogQ2FsbCBuZXRpZl9hZGQoKSBpbnNpZGUgdGhlIHRjcGlwX3RocmVhZCBjb250ZXh0LgorICovCit2b2lkCitkb19uZXRpZmFwaV9uZXRpZl9hZGQoc3RydWN0IG5ldGlmYXBpX21zZ19tc2cgKm1zZykKK3sKKyAgaWYgKCFuZXRpZl9hZGQoIG1zZy0+bmV0aWYsCisgICAgICAgICAgICAgICAgICBtc2ctPm1zZy5hZGQuaXBhZGRyLAorICAgICAgICAgICAgICAgICAgbXNnLT5tc2cuYWRkLm5ldG1hc2ssCisgICAgICAgICAgICAgICAgICBtc2ctPm1zZy5hZGQuZ3csCisgICAgICAgICAgICAgICAgICBtc2ctPm1zZy5hZGQuc3RhdGUsCisgICAgICAgICAgICAgICAgICBtc2ctPm1zZy5hZGQuaW5pdCwKKyAgICAgICAgICAgICAgICAgIG1zZy0+bXNnLmFkZC5pbnB1dCkpIHsKKyAgICBtc2ctPmVyciA9IEVSUl9JRjsKKyAgfSBlbHNlIHsKKyAgICBtc2ctPmVyciA9IEVSUl9PSzsKKyAgfQorICBUQ1BJUF9ORVRJRkFQSV9BQ0sobXNnKTsKK30KKworLyoqCisgKiBDYWxsIG5ldGlmX3NldF9hZGRyKCkgaW5zaWRlIHRoZSB0Y3BpcF90aHJlYWQgY29udGV4dC4KKyAqLwordm9pZAorZG9fbmV0aWZhcGlfbmV0aWZfc2V0X2FkZHIoc3RydWN0IG5ldGlmYXBpX21zZ19tc2cgKm1zZykKK3sKKyAgbmV0aWZfc2V0X2FkZHIoIG1zZy0+bmV0aWYsCisgICAgICAgICAgICAgICAgICBtc2ctPm1zZy5hZGQuaXBhZGRyLAorICAgICAgICAgICAgICAgICAgbXNnLT5tc2cuYWRkLm5ldG1hc2ssCisgICAgICAgICAgICAgICAgICBtc2ctPm1zZy5hZGQuZ3cpOworICBtc2ctPmVyciA9IEVSUl9PSzsKKyAgVENQSVBfTkVUSUZBUElfQUNLKG1zZyk7Cit9CisKKy8qKgorICogQ2FsbCB0aGUgImVycnRmdW5jIiAob3IgdGhlICJ2b2lkZnVuYyIgaWYgImVycnRmdW5jIiBpcyBOVUxMKSBpbnNpZGUgdGhlCisgKiB0Y3BpcF90aHJlYWQgY29udGV4dC4KKyAqLwordm9pZAorZG9fbmV0aWZhcGlfbmV0aWZfY29tbW9uKHN0cnVjdCBuZXRpZmFwaV9tc2dfbXNnICptc2cpCit7CisgIGlmIChtc2ctPm1zZy5jb21tb24uZXJydGZ1bmMgIT0gTlVMTCkgeworICAgIG1zZy0+ZXJyID0gbXNnLT5tc2cuY29tbW9uLmVycnRmdW5jKG1zZy0+bmV0aWYpOworICB9IGVsc2UgeworICAgIG1zZy0+ZXJyID0gRVJSX09LOworICAgIG1zZy0+bXNnLmNvbW1vbi52b2lkZnVuYyhtc2ctPm5ldGlmKTsKKyAgfQorICBUQ1BJUF9ORVRJRkFQSV9BQ0sobXNnKTsKK30KKworLyoqCisgKiBDYWxsIG5ldGlmX2FkZCgpIGluIGEgdGhyZWFkLXNhZmUgd2F5IGJ5IHJ1bm5pbmcgdGhhdCBmdW5jdGlvbiBpbnNpZGUgdGhlCisgKiB0Y3BpcF90aHJlYWQgY29udGV4dC4KKyAqCisgKiBAbm90ZSBmb3IgcGFyYW1zIEBzZWUgbmV0aWZfYWRkKCkKKyAqLworZXJyX3QKK25ldGlmYXBpX25ldGlmX2FkZChzdHJ1Y3QgbmV0aWYgKm5ldGlmLAorICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqaXBhZGRyLAorICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqbmV0bWFzaywKKyAgICAgICAgICAgICAgICAgICBpcF9hZGRyX3QgKmd3LAorICAgICAgICAgICAgICAgICAgIHZvaWQgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgIG5ldGlmX2luaXRfZm4gaW5pdCwKKyAgICAgICAgICAgICAgICAgICBuZXRpZl9pbnB1dF9mbiBpbnB1dCkKK3sKKyAgc3RydWN0IG5ldGlmYXBpX21zZyBtc2c7CisgIG1zZy5mdW5jdGlvbiA9IGRvX25ldGlmYXBpX25ldGlmX2FkZDsKKyAgbXNnLm1zZy5uZXRpZiA9IG5ldGlmOworICBtc2cubXNnLm1zZy5hZGQuaXBhZGRyICA9IGlwYWRkcjsKKyAgbXNnLm1zZy5tc2cuYWRkLm5ldG1hc2sgPSBuZXRtYXNrOworICBtc2cubXNnLm1zZy5hZGQuZ3cgICAgICA9IGd3OworICBtc2cubXNnLm1zZy5hZGQuc3RhdGUgICA9IHN0YXRlOworICBtc2cubXNnLm1zZy5hZGQuaW5pdCAgICA9IGluaXQ7CisgIG1zZy5tc2cubXNnLmFkZC5pbnB1dCAgID0gaW5wdXQ7CisgIFRDUElQX05FVElGQVBJKCZtc2cpOworICByZXR1cm4gbXNnLm1zZy5lcnI7Cit9CisKKy8qKgorICogQ2FsbCBuZXRpZl9zZXRfYWRkcigpIGluIGEgdGhyZWFkLXNhZmUgd2F5IGJ5IHJ1bm5pbmcgdGhhdCBmdW5jdGlvbiBpbnNpZGUgdGhlCisgKiB0Y3BpcF90aHJlYWQgY29udGV4dC4KKyAqCisgKiBAbm90ZSBmb3IgcGFyYW1zIEBzZWUgbmV0aWZfc2V0X2FkZHIoKQorICovCitlcnJfdAorbmV0aWZhcGlfbmV0aWZfc2V0X2FkZHIoc3RydWN0IG5ldGlmICpuZXRpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqaXBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgaXBfYWRkcl90ICpuZXRtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgaXBfYWRkcl90ICpndykKK3sKKyAgc3RydWN0IG5ldGlmYXBpX21zZyBtc2c7CisgIG1zZy5mdW5jdGlvbiA9IGRvX25ldGlmYXBpX25ldGlmX3NldF9hZGRyOworICBtc2cubXNnLm5ldGlmID0gbmV0aWY7CisgIG1zZy5tc2cubXNnLmFkZC5pcGFkZHIgID0gaXBhZGRyOworICBtc2cubXNnLm1zZy5hZGQubmV0bWFzayA9IG5ldG1hc2s7CisgIG1zZy5tc2cubXNnLmFkZC5ndyAgICAgID0gZ3c7CisgIFRDUElQX05FVElGQVBJKCZtc2cpOworICByZXR1cm4gbXNnLm1zZy5lcnI7Cit9CisKKy8qKgorICogY2FsbCB0aGUgImVycnRmdW5jIiAob3IgdGhlICJ2b2lkZnVuYyIgaWYgImVycnRmdW5jIiBpcyBOVUxMKSBpbiBhIHRocmVhZC1zYWZlCisgKiB3YXkgYnkgcnVubmluZyB0aGF0IGZ1bmN0aW9uIGluc2lkZSB0aGUgdGNwaXBfdGhyZWFkIGNvbnRleHQuCisgKgorICogQG5vdGUgdXNlIG9ubHkgZm9yIGZ1bmN0aW9ucyB3aGVyZSB0aGVyZSBpcyBvbmx5ICJuZXRpZiIgcGFyYW1ldGVyLgorICovCitlcnJfdAorbmV0aWZhcGlfbmV0aWZfY29tbW9uKHN0cnVjdCBuZXRpZiAqbmV0aWYsIG5ldGlmYXBpX3ZvaWRfZm4gdm9pZGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmYXBpX2VycnRfZm4gZXJydGZ1bmMpCit7CisgIHN0cnVjdCBuZXRpZmFwaV9tc2cgbXNnOworICBtc2cuZnVuY3Rpb24gPSBkb19uZXRpZmFwaV9uZXRpZl9jb21tb247CisgIG1zZy5tc2cubmV0aWYgPSBuZXRpZjsKKyAgbXNnLm1zZy5tc2cuY29tbW9uLnZvaWRmdW5jID0gdm9pZGZ1bmM7CisgIG1zZy5tc2cubXNnLmNvbW1vbi5lcnJ0ZnVuYyA9IGVycnRmdW5jOworICBUQ1BJUF9ORVRJRkFQSSgmbXNnKTsKKyAgcmV0dXJuIG1zZy5tc2cuZXJyOworfQorCisjZW5kaWYgLyogTFdJUF9ORVRJRl9BUEkgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvYXBpL3NvY2tldHMuYyBiL2NvcmUvbHdpcC9zcmMvYXBpL3NvY2tldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzYwMTJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9hcGkvc29ja2V0cy5jCkBAIC0wLDAgKzEsMjM0NyBAQAorLyoqCisgKiBAZmlsZQorICogU29ja2V0cyBCU0QtTGlrZSBBUEkgbW9kdWxlCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqIEltcHJvdmVkIGJ5IE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiBhbmQgRGF2aWQgSGFhcyA8ZGhhYXNAYWx1bS5ycGkuZWR1PgorICoKKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfU09DS0VUIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9zb2NrZXRzLmgiCisjaW5jbHVkZSAibHdpcC9hcGkuaCIKKyNpbmNsdWRlICJsd2lwL3N5cy5oIgorI2luY2x1ZGUgImx3aXAvaWdtcC5oIgorI2luY2x1ZGUgImx3aXAvaW5ldC5oIgorI2luY2x1ZGUgImx3aXAvdGNwLmgiCisjaW5jbHVkZSAibHdpcC9yYXcuaCIKKyNpbmNsdWRlICJsd2lwL3VkcC5oIgorI2luY2x1ZGUgImx3aXAvdGNwaXAuaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpZiBMV0lQX0NIRUNLU1VNX09OX0NPUFkKKyNpbmNsdWRlICJsd2lwL2luZXRfY2hrc3VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIE5VTV9TT0NLRVRTIE1FTVBfTlVNX05FVENPTk4KKworLyoqIENvbnRhaW5zIGFsbCBpbnRlcm5hbCBwb2ludGVycyBhbmQgc3RhdGVzIHVzZWQgZm9yIGEgc29ja2V0ICovCitzdHJ1Y3QgbHdpcF9zb2NrIHsKKyAgLyoqIHNvY2tldHMgY3VycmVudGx5IGFyZSBidWlsdCBvbiBuZXRjb25ucywgZWFjaCBzb2NrZXQgaGFzIG9uZSBuZXRjb25uICovCisgIHN0cnVjdCBuZXRjb25uICpjb25uOworICAvKiogZGF0YSB0aGF0IHdhcyBsZWZ0IGZyb20gdGhlIHByZXZpb3VzIHJlYWQgKi8KKyAgdm9pZCAqbGFzdGRhdGE7CisgIC8qKiBvZmZzZXQgaW4gdGhlIGRhdGEgdGhhdCB3YXMgbGVmdCBmcm9tIHRoZSBwcmV2aW91cyByZWFkICovCisgIHUxNl90IGxhc3RvZmZzZXQ7CisgIC8qKiBudW1iZXIgb2YgdGltZXMgZGF0YSB3YXMgcmVjZWl2ZWQsIHNldCBieSBldmVudF9jYWxsYmFjaygpLAorICAgICAgdGVzdGVkIGJ5IHRoZSByZWNlaXZlIGFuZCBzZWxlY3QgZnVuY3Rpb25zICovCisgIHMxNl90IHJjdmV2ZW50OworICAvKiogbnVtYmVyIG9mIHRpbWVzIGRhdGEgd2FzIEFDS2VkIChmcmVlIHNlbmQgYnVmZmVyKSwgc2V0IGJ5IGV2ZW50X2NhbGxiYWNrKCksCisgICAgICB0ZXN0ZWQgYnkgc2VsZWN0ICovCisgIHUxNl90IHNlbmRldmVudDsKKyAgLyoqIGVycm9yIGhhcHBlbmVkIGZvciB0aGlzIHNvY2tldCwgc2V0IGJ5IGV2ZW50X2NhbGxiYWNrKCksIHRlc3RlZCBieSBzZWxlY3QgKi8KKyAgdTE2X3QgZXJyZXZlbnQ7IAorICAvKiogbGFzdCBlcnJvciB0aGF0IG9jY3VycmVkIG9uIHRoaXMgc29ja2V0ICovCisgIGludCBlcnI7CisgIC8qKiBjb3VudGVyIG9mIGhvdyBtYW55IHRocmVhZHMgYXJlIHdhaXRpbmcgZm9yIHRoaXMgc29ja2V0IHVzaW5nIHNlbGVjdCAqLworICBpbnQgc2VsZWN0X3dhaXRpbmc7Cit9OworCisvKiogRGVzY3JpcHRpb24gZm9yIGEgdGFzayB3YWl0aW5nIGluIHNlbGVjdCAqLworc3RydWN0IGx3aXBfc2VsZWN0X2NiIHsKKyAgLyoqIFBvaW50ZXIgdG8gdGhlIG5leHQgd2FpdGluZyB0YXNrICovCisgIHN0cnVjdCBsd2lwX3NlbGVjdF9jYiAqbmV4dDsKKyAgLyoqIFBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHdhaXRpbmcgdGFzayAqLworICBzdHJ1Y3QgbHdpcF9zZWxlY3RfY2IgKnByZXY7CisgIC8qKiByZWFkc2V0IHBhc3NlZCB0byBzZWxlY3QgKi8KKyAgZmRfc2V0ICpyZWFkc2V0OworICAvKiogd3JpdGVzZXQgcGFzc2VkIHRvIHNlbGVjdCAqLworICBmZF9zZXQgKndyaXRlc2V0OworICAvKiogdW5pbXBsZW1lbnRlZDogZXhjZXB0c2V0IHBhc3NlZCB0byBzZWxlY3QgKi8KKyAgZmRfc2V0ICpleGNlcHRzZXQ7CisgIC8qKiBkb24ndCBzaWduYWwgdGhlIHNhbWUgc2VtYXBob3JlIHR3aWNlOiBzZXQgdG8gMSB3aGVuIHNpZ25hbGxlZCAqLworICBpbnQgc2VtX3NpZ25hbGxlZDsKKyAgLyoqIHNlbWFwaG9yZSB0byB3YWtlIHVwIGEgdGFzayB3YWl0aW5nIGZvciBzZWxlY3QgKi8KKyAgc3lzX3NlbV90IHNlbTsKK307CisKKy8qKiBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIHBhc3MgZGF0YSB0byB0aGUgc2V0L2dldHNvY2tvcHRfaW50ZXJuYWwKKyAqIGZ1bmN0aW9ucyBydW5uaW5nIGluIHRjcGlwX3RocmVhZCBjb250ZXh0IChvbmx5IGEgdm9pZCogaXMgYWxsb3dlZCkgKi8KK3N0cnVjdCBsd2lwX3NldGdldHNvY2tvcHRfZGF0YSB7CisgIC8qKiBzb2NrZXQgc3RydWN0IGZvciB3aGljaCB0byBjaGFuZ2Ugb3B0aW9ucyAqLworICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrOworI2lmZGVmIExXSVBfREVCVUcKKyAgLyoqIHNvY2tldCBpbmRleCBmb3Igd2hpY2ggdG8gY2hhbmdlIG9wdGlvbnMgKi8KKyAgaW50IHM7CisjZW5kaWYgLyogTFdJUF9ERUJVRyAqLworICAvKiogbGV2ZWwgb2YgdGhlIG9wdGlvbiB0byBwcm9jZXNzICovCisgIGludCBsZXZlbDsKKyAgLyoqIG5hbWUgb2YgdGhlIG9wdGlvbiB0byBwcm9jZXNzICovCisgIGludCBvcHRuYW1lOworICAvKiogc2V0OiB2YWx1ZSB0byBzZXQgdGhlIG9wdGlvbiB0bworICAgICogZ2V0OiB2YWx1ZSBvZiB0aGUgb3B0aW9uIGlzIHN0b3JlZCBoZXJlICovCisgIHZvaWQgKm9wdHZhbDsKKyAgLyoqIHNpemUgb2YgKm9wdHZhbCAqLworICBzb2NrbGVuX3QgKm9wdGxlbjsKKyAgLyoqIGlmIGFuIGVycm9yIG9jY3VyZXMsIGl0IGlzIHRlbXBvcmFyaWx5IHN0b3JlZCBoZXJlICovCisgIGVycl90IGVycjsKK307CisKKy8qKiBUaGUgZ2xvYmFsIGFycmF5IG9mIGF2YWlsYWJsZSBzb2NrZXRzICovCitzdGF0aWMgc3RydWN0IGx3aXBfc29jayBzb2NrZXRzW05VTV9TT0NLRVRTXTsKKy8qKiBUaGUgZ2xvYmFsIGxpc3Qgb2YgdGFza3Mgd2FpdGluZyBmb3Igc2VsZWN0ICovCitzdGF0aWMgc3RydWN0IGx3aXBfc2VsZWN0X2NiICpzZWxlY3RfY2JfbGlzdDsKKy8qKiBUaGlzIGNvdW50ZXIgaXMgaW5jcmVhc2VkIGZyb20gbHdpcF9zZWxlY3Qgd2hlbiB0aGUgbGlzdCBpcyBjaGFnbmVkCisgICAgYW5kIGNoZWNrZWQgaW4gZXZlbnRfY2FsbGJhY2sgdG8gc2VlIGlmIGl0IGhhcyBjaGFuZ2VkLiAqLworc3RhdGljIHZvbGF0aWxlIGludCBzZWxlY3RfY2JfY3RyOworCisvKiogVGFibGUgdG8gcXVpY2tseSBtYXAgYW4gbHdJUCBlcnJvciAoZXJyX3QpIHRvIGEgc29ja2V0IGVycm9yCisgICogYnkgdXNpbmcgLWVyciBhcyBhbiBpbmRleCAqLworc3RhdGljIGNvbnN0IGludCBlcnJfdG9fZXJybm9fdGFibGVbXSA9IHsKKyAgMCwgICAgICAgICAgICAgLyogRVJSX09LICAgICAgICAgIDAgICAgICBObyBlcnJvciwgZXZlcnl0aGluZyBPSy4gKi8KKyAgRU5PTUVNLCAgICAgICAgLyogRVJSX01FTSAgICAgICAgLTEgICAgICBPdXQgb2YgbWVtb3J5IGVycm9yLiAgICAgKi8KKyAgRU5PQlVGUywgICAgICAgLyogRVJSX0JVRiAgICAgICAgLTIgICAgICBCdWZmZXIgZXJyb3IuICAgICAgICAgICAgKi8KKyAgRVdPVUxEQkxPQ0ssICAgLyogRVJSX1RJTUVPVVQgICAgLTMgICAgICBUaW1lb3V0ICAgICAgICAgICAgICAgICAgKi8KKyAgRUhPU1RVTlJFQUNILCAgLyogRVJSX1JURSAgICAgICAgLTQgICAgICBSb3V0aW5nIHByb2JsZW0uICAgICAgICAgKi8KKyAgRUlOUFJPR1JFU1MsICAgLyogRVJSX0lOUFJPR1JFU1MgLTUgICAgICBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MgICAgKi8KKyAgRUlOVkFMLCAgICAgICAgLyogRVJSX1ZBTCAgICAgICAgLTYgICAgICBJbGxlZ2FsIHZhbHVlLiAgICAgICAgICAgKi8KKyAgRVdPVUxEQkxPQ0ssICAgLyogRVJSX1dPVUxEQkxPQ0sgLTcgICAgICBPcGVyYXRpb24gd291bGQgYmxvY2suICAgKi8KKyAgRUFERFJJTlVTRSwgICAgLyogRVJSX1VTRSAgICAgICAgLTggICAgICBBZGRyZXNzIGluIHVzZS4gICAgICAgICAgKi8KKyAgRUFMUkVBRFksICAgICAgLyogRVJSX0lTQ09OTiAgICAgLTkgICAgICBBbHJlYWR5IGNvbm5lY3RlZC4gICAgICAgKi8KKyAgRUNPTk5BQk9SVEVELCAgLyogRVJSX0FCUlQgICAgICAgLTEwICAgICBDb25uZWN0aW9uIGFib3J0ZWQuICAgICAgKi8KKyAgRUNPTk5SRVNFVCwgICAgLyogRVJSX1JTVCAgICAgICAgLTExICAgICBDb25uZWN0aW9uIHJlc2V0LiAgICAgICAgKi8KKyAgRU5PVENPTk4sICAgICAgLyogRVJSX0NMU0QgICAgICAgLTEyICAgICBDb25uZWN0aW9uIGNsb3NlZC4gICAgICAgKi8KKyAgRU5PVENPTk4sICAgICAgLyogRVJSX0NPTk4gICAgICAgLTEzICAgICBOb3QgY29ubmVjdGVkLiAgICAgICAgICAgKi8KKyAgRUlPLCAgICAgICAgICAgLyogRVJSX0FSRyAgICAgICAgLTE0ICAgICBJbGxlZ2FsIGFyZ3VtZW50LiAgICAgICAgKi8KKyAgLTEsICAgICAgICAgICAgLyogRVJSX0lGICAgICAgICAgLTE1ICAgICBMb3ctbGV2ZWwgbmV0aWYgZXJyb3IgICAgKi8KK307CisKKyNkZWZpbmUgRVJSX1RPX0VSUk5PX1RBQkxFX1NJWkUgXAorICAoc2l6ZW9mKGVycl90b19lcnJub190YWJsZSkvc2l6ZW9mKGVycl90b19lcnJub190YWJsZVswXSkpCisKKyNkZWZpbmUgZXJyX3RvX2Vycm5vKGVycikgXAorICAoKHVuc2lnbmVkKSgtKGVycikpIDwgRVJSX1RPX0VSUk5PX1RBQkxFX1NJWkUgPyBcCisgICAgZXJyX3RvX2Vycm5vX3RhYmxlWy0oZXJyKV0gOiBFSU8pCisKKyNpZmRlZiBFUlJOTworI2lmbmRlZiBzZXRfZXJybm8KKyNkZWZpbmUgc2V0X2Vycm5vKGVycikgZXJybm8gPSAoZXJyKQorI2VuZGlmCisjZWxzZSAvKiBFUlJOTyAqLworI2RlZmluZSBzZXRfZXJybm8oZXJyKQorI2VuZGlmIC8qIEVSUk5PICovCisKKyNkZWZpbmUgc29ja19zZXRfZXJybm8oc2ssIGUpIGRvIHsgXAorICBzay0+ZXJyID0gKGUpOyBcCisgIHNldF9lcnJubyhzay0+ZXJyKTsgXAorfSB3aGlsZSAoMCkKKworLyogRm9yd2FyZCBkZWxjYXJhdGlvbiBvZiBzb21lIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZXZlbnRfY2FsbGJhY2soc3RydWN0IG5ldGNvbm4gKmNvbm4sIGVudW0gbmV0Y29ubl9ldnQgZXZ0LCB1MTZfdCBsZW4pOworc3RhdGljIHZvaWQgbHdpcF9nZXRzb2Nrb3B0X2ludGVybmFsKHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZCBsd2lwX3NldHNvY2tvcHRfaW50ZXJuYWwodm9pZCAqYXJnKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRoaXMgbW9kdWxlLiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlcgorICogZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIQorICovCit2b2lkCitsd2lwX3NvY2tldF9pbml0KHZvaWQpCit7Cit9CisKKy8qKgorICogTWFwIGEgZXh0ZXJuYWxseSB1c2VkIHNvY2tldCBpbmRleCB0byB0aGUgaW50ZXJuYWwgc29ja2V0IHJlcHJlc2VudGF0aW9uLgorICoKKyAqIEBwYXJhbSBzIGV4dGVybmFsbHkgdXNlZCBzb2NrZXQgaW5kZXgKKyAqIEByZXR1cm4gc3RydWN0IGx3aXBfc29jayBmb3IgdGhlIHNvY2tldCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgc3RydWN0IGx3aXBfc29jayAqCitnZXRfc29ja2V0KGludCBzKQoreworICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrOworCisgIGlmICgocyA8IDApIHx8IChzID49IE5VTV9TT0NLRVRTKSkgeworICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgiZ2V0X3NvY2tldCglZCk6IGludmFsaWRcbiIsIHMpKTsKKyAgICBzZXRfZXJybm8oRUJBREYpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgc29jayA9ICZzb2NrZXRzW3NdOworCisgIGlmICghc29jay0+Y29ubikgeworICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgiZ2V0X3NvY2tldCglZCk6IG5vdCBhY3RpdmVcbiIsIHMpKTsKKyAgICBzZXRfZXJybm8oRUJBREYpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHNvY2s7Cit9CisKKy8qKgorICogU2FtZSBhcyBnZXRfc29ja2V0IGJ1dCBkb2Vzbid0IHNldCBlcnJubworICoKKyAqIEBwYXJhbSBzIGV4dGVybmFsbHkgdXNlZCBzb2NrZXQgaW5kZXgKKyAqIEByZXR1cm4gc3RydWN0IGx3aXBfc29jayBmb3IgdGhlIHNvY2tldCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgc3RydWN0IGx3aXBfc29jayAqCit0cnlnZXRfc29ja2V0KGludCBzKQoreworICBpZiAoKHMgPCAwKSB8fCAocyA+PSBOVU1fU09DS0VUUykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoIXNvY2tldHNbc10uY29ubikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAmc29ja2V0c1tzXTsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBhIG5ldyBzb2NrZXQgZm9yIGEgZ2l2ZW4gbmV0Y29ubi4KKyAqCisgKiBAcGFyYW0gbmV3Y29ubiB0aGUgbmV0Y29ubiBmb3Igd2hpY2ggdG8gYWxsb2NhdGUgYSBzb2NrZXQKKyAqIEBwYXJhbSBhY2NlcHRlZCAxIGlmIHNvY2tldCBoYXMgYmVlbiBjcmVhdGVkIGJ5IGFjY2VwdCgpLAorICogICAgICAgICAgICAgICAgIDAgaWYgc29ja2V0IGhhcyBiZWVuIGNyZWF0ZWQgYnkgc29ja2V0KCkKKyAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZXcgc29ja2V0OyAtMSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50CithbGxvY19zb2NrZXQoc3RydWN0IG5ldGNvbm4gKm5ld2Nvbm4sIGludCBhY2NlcHRlZCkKK3sKKyAgaW50IGk7CisgIFNZU19BUkNIX0RFQ0xfUFJPVEVDVChsZXYpOworCisgIC8qIGFsbG9jYXRlIGEgbmV3IHNvY2tldCBpZGVudGlmaWVyICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fU09DS0VUUzsgKytpKSB7CisgICAgLyogUHJvdGVjdCBzb2NrZXQgYXJyYXkgKi8KKyAgICBTWVNfQVJDSF9QUk9URUNUKGxldik7CisgICAgaWYgKCFzb2NrZXRzW2ldLmNvbm4pIHsKKyAgICAgIHNvY2tldHNbaV0uY29ubiAgICAgICA9IG5ld2Nvbm47CisgICAgICAvKiBUaGUgc29ja2V0IGlzIG5vdCB5ZXQga25vd24gdG8gYW55b25lLCBzbyBubyBuZWVkIHRvIHByb3RlY3QKKyAgICAgICAgIGFmdGVyIGhhdmluZyBtYXJrZWQgaXQgYXMgdXNlZC4gKi8KKyAgICAgIFNZU19BUkNIX1VOUFJPVEVDVChsZXYpOworICAgICAgc29ja2V0c1tpXS5sYXN0ZGF0YSAgID0gTlVMTDsKKyAgICAgIHNvY2tldHNbaV0ubGFzdG9mZnNldCA9IDA7CisgICAgICBzb2NrZXRzW2ldLnJjdmV2ZW50ICAgPSAwOworICAgICAgLyogVENQIHNlbmRidWYgaXMgZW1wdHksIGJ1dCB0aGUgc29ja2V0IGlzIG5vdCB5ZXQgd3JpdGFibGUgdW50aWwgY29ubmVjdGVkCisgICAgICAgKiAodW5sZXNzIGl0IGhhcyBiZWVuIGNyZWF0ZWQgYnkgYWNjZXB0KCkpLiAqLworICAgICAgc29ja2V0c1tpXS5zZW5kZXZlbnQgID0gKG5ld2Nvbm4tPnR5cGUgPT0gTkVUQ09OTl9UQ1AgPyAoYWNjZXB0ZWQgIT0gMCkgOiAxKTsKKyAgICAgIHNvY2tldHNbaV0uZXJyZXZlbnQgICA9IDA7CisgICAgICBzb2NrZXRzW2ldLmVyciAgICAgICAgPSAwOworICAgICAgc29ja2V0c1tpXS5zZWxlY3Rfd2FpdGluZyA9IDA7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgU1lTX0FSQ0hfVU5QUk9URUNUKGxldik7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisvKiogRnJlZSBhIHNvY2tldC4gVGhlIHNvY2tldCdzIG5ldGNvbm4gbXVzdCBoYXZlIGJlZW4KKyAqIGRlbGV0ZSBiZWZvcmUhCisgKgorICogQHBhcmFtIHNvY2sgdGhlIHNvY2tldCB0byBmcmVlCisgKiBAcGFyYW0gaXNfdGNwICE9IDAgZm9yIFRDUCBzb2NrZXRzLCB1c2VkIHRvIGZyZWUgbGFzdGRhdGEKKyAqLworc3RhdGljIHZvaWQKK2ZyZWVfc29ja2V0KHN0cnVjdCBsd2lwX3NvY2sgKnNvY2ssIGludCBpc190Y3ApCit7CisgIHZvaWQgKmxhc3RkYXRhOworICBTWVNfQVJDSF9ERUNMX1BST1RFQ1QobGV2KTsKKworICBsYXN0ZGF0YSAgICAgICAgID0gc29jay0+bGFzdGRhdGE7CisgIHNvY2stPmxhc3RkYXRhICAgPSBOVUxMOworICBzb2NrLT5sYXN0b2Zmc2V0ID0gMDsKKyAgc29jay0+ZXJyICAgICAgICA9IDA7CisKKyAgLyogUHJvdGVjdCBzb2NrZXQgYXJyYXkgKi8KKyAgU1lTX0FSQ0hfUFJPVEVDVChsZXYpOworICBzb2NrLT5jb25uICAgICAgID0gTlVMTDsKKyAgU1lTX0FSQ0hfVU5QUk9URUNUKGxldik7CisgIC8qIGRvbid0IHVzZSAnc29jaycgYWZ0ZXIgdGhpcyBsaW5lLCBhcyBhbm90aGVyIHRhc2sgbWlnaHQgaGF2ZSBhbGxvY2F0ZWQgaXQgKi8KKworICBpZiAobGFzdGRhdGEgIT0gTlVMTCkgeworICAgIGlmIChpc190Y3ApIHsKKyAgICAgIHBidWZfZnJlZSgoc3RydWN0IHBidWYgKilsYXN0ZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG5ldGJ1Zl9kZWxldGUoKHN0cnVjdCBuZXRidWYgKilsYXN0ZGF0YSk7CisgICAgfQorICB9Cit9CisKKy8qIEJlbG93IHRoaXMsIHRoZSB3ZWxsLWtub3duIHNvY2tldCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkLgorICogVXNlIGdvb2dsZS5jb20gb3Igb3Blbmdyb3VwLm9yZyB0byBnZXQgYSBnb29kIGRlc2NyaXB0aW9uIDotKQorICoKKyAqIEV4Y2VwdGlvbnMgYXJlIGRvY3VtZW50ZWQhCisgKi8KKworaW50Citsd2lwX2FjY2VwdChpbnQgcywgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgKmFkZHJsZW4pCit7CisgIHN0cnVjdCBsd2lwX3NvY2sgKnNvY2ssICpuc29jazsKKyAgc3RydWN0IG5ldGNvbm4gKm5ld2Nvbm47CisgIGlwX2FkZHJfdCBuYWRkcjsKKyAgdTE2X3QgcG9ydDsKKyAgaW50IG5ld3NvY2s7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisgIGVycl90IGVycjsKKyAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldik7CisKKyAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2FjY2VwdCglZCkuLi5cbiIsIHMpKTsKKyAgc29jayA9IGdldF9zb2NrZXQocyk7CisgIGlmICghc29jaykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChuZXRjb25uX2lzX25vbmJsb2NraW5nKHNvY2stPmNvbm4pICYmIChzb2NrLT5yY3ZldmVudCA8PSAwKSkgeworICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9hY2NlcHQoJWQpOiByZXR1cm5pbmcgRVdPVUxEQkxPQ0tcbiIsIHMpKTsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBFV09VTERCTE9DSyk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogd2FpdCBmb3IgYSBuZXcgY29ubmVjdGlvbiAqLworICBlcnIgPSBuZXRjb25uX2FjY2VwdChzb2NrLT5jb25uLCAmbmV3Y29ubik7CisgIGlmIChlcnIgIT0gRVJSX09LKSB7CisgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2FjY2VwdCglZCk6IG5ldGNvbm5fYWNlcHQgZmFpbGVkLCBlcnI9JWRcbiIsIHMsIGVycikpOworICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIGVycl90b19lcnJubyhlcnIpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgTFdJUF9BU1NFUlQoIm5ld2Nvbm4gIT0gTlVMTCIsIG5ld2Nvbm4gIT0gTlVMTCk7CisgIC8qIFByZXZlbnQgYXV0b21hdGljIHdpbmRvdyB1cGRhdGVzLCB3ZSBkbyB0aGlzIG9uIG91ciBvd24hICovCisgIG5ldGNvbm5fc2V0X25vYXV0b3JlY3ZlZChuZXdjb25uLCAxKTsKKworICAvKiBnZXQgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIHJlbW90ZSBob3N0ICovCisgIGVyciA9IG5ldGNvbm5fcGVlcihuZXdjb25uLCAmbmFkZHIsICZwb3J0KTsKKyAgaWYgKGVyciAhPSBFUlJfT0spIHsKKyAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfYWNjZXB0KCVkKTogbmV0Y29ubl9wZWVyIGZhaWxlZCwgZXJyPSVkXG4iLCBzLCBlcnIpKTsKKyAgICBuZXRjb25uX2RlbGV0ZShuZXdjb25uKTsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBlcnJfdG9fZXJybm8oZXJyKSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogTm90ZSB0aGF0IFBPU0lYIG9ubHkgcmVxdWlyZXMgdXMgdG8gY2hlY2sgYWRkciBpcyBub24tTlVMTC4gYWRkcmxlbiBtdXN0CisgICAqIG5vdCBiZSBOVUxMIGlmIGFkZHIgaXMgdmFsaWQuCisgICAqLworICBpZiAoTlVMTCAhPSBhZGRyKSB7CisgICAgTFdJUF9BU1NFUlQoImFkZHIgdmFsaWQgYnV0IGFkZHJsZW4gTlVMTCIsIGFkZHJsZW4gIT0gTlVMTCk7CisgICAgbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKyAgICBzaW4uc2luX2xlbiA9IHNpemVvZihzaW4pOworICAgIHNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBzaW4uc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgICBpbmV0X2FkZHJfZnJvbV9pcGFkZHIoJnNpbi5zaW5fYWRkciwgJm5hZGRyKTsKKworICAgIGlmICgqYWRkcmxlbiA+IHNpemVvZihzaW4pKQorICAgICAgKmFkZHJsZW4gPSBzaXplb2Yoc2luKTsKKworICAgIE1FTUNQWShhZGRyLCAmc2luLCAqYWRkcmxlbik7CisgIH0KKworICBuZXdzb2NrID0gYWxsb2Nfc29ja2V0KG5ld2Nvbm4sIDEpOworICBpZiAobmV3c29jayA9PSAtMSkgeworICAgIG5ldGNvbm5fZGVsZXRlKG5ld2Nvbm4pOworICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIEVORklMRSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIExXSVBfQVNTRVJUKCJpbnZhbGlkIHNvY2tldCBpbmRleCIsIChuZXdzb2NrID49IDApICYmIChuZXdzb2NrIDwgTlVNX1NPQ0tFVFMpKTsKKyAgTFdJUF9BU1NFUlQoIm5ld2Nvbm4tPmNhbGxiYWNrID09IGV2ZW50X2NhbGxiYWNrIiwgbmV3Y29ubi0+Y2FsbGJhY2sgPT0gZXZlbnRfY2FsbGJhY2spOworICBuc29jayA9ICZzb2NrZXRzW25ld3NvY2tdOworCisgIC8qIFNlZSBldmVudF9jYWxsYmFjazogSWYgZGF0YSBjb21lcyBpbiByaWdodCBhd2F5IGFmdGVyIGFuIGFjY2VwdCwgZXZlbgorICAgKiB0aG91Z2ggdGhlIHNlcnZlciB0YXNrIG1pZ2h0IG5vdCBoYXZlIGNyZWF0ZWQgYSBuZXcgc29ja2V0IHlldC4KKyAgICogSW4gdGhhdCBjYXNlLCBuZXdjb25uLT5zb2NrZXQgaXMgY291bnRlZCBkb3duIChuZXdjb25uLT5zb2NrZXQtLSksCisgICAqIHNvIG5zb2NrLT5yY3ZldmVudCBpcyA+PSAxIGhlcmUhCisgICAqLworICBTWVNfQVJDSF9QUk9URUNUKGxldik7CisgIG5zb2NrLT5yY3ZldmVudCArPSAoczE2X3QpKC0xIC0gbmV3Y29ubi0+c29ja2V0KTsKKyAgbmV3Y29ubi0+c29ja2V0ID0gbmV3c29jazsKKyAgU1lTX0FSQ0hfVU5QUk9URUNUKGxldik7CisKKyAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2FjY2VwdCglZCkgcmV0dXJuaW5nIG5ldyBzb2NrPSVkIGFkZHI9IiwgcywgbmV3c29jaykpOworICBpcF9hZGRyX2RlYnVnX3ByaW50KFNPQ0tFVFNfREVCVUcsICZuYWRkcik7CisgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgiIHBvcnQ9JSJVMTZfRiJcbiIsIHBvcnQpKTsKKworICBzb2NrX3NldF9lcnJubyhzb2NrLCAwKTsKKyAgcmV0dXJuIG5ld3NvY2s7Cit9CisKK2ludAorbHdpcF9iaW5kKGludCBzLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIHNvY2tsZW5fdCBuYW1lbGVuKQoreworICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrOworICBpcF9hZGRyX3QgbG9jYWxfYWRkcjsKKyAgdTE2X3QgbG9jYWxfcG9ydDsKKyAgZXJyX3QgZXJyOworICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKm5hbWVfaW47CisKKyAgc29jayA9IGdldF9zb2NrZXQocyk7CisgIGlmICghc29jaykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGNoZWNrIHNpemUsIGZhbWlsaXkgYW5kIGFsaWdubWVudCBvZiAnbmFtZScgKi8KKyAgTFdJUF9FUlJPUigibHdpcF9iaW5kOiBpbnZhbGlkIGFkZHJlc3MiLCAoKG5hbWVsZW4gPT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpICYmCisgICAgICAgICAgICAgKChuYW1lLT5zYV9mYW1pbHkpID09IEFGX0lORVQpICYmICgoKChtZW1fcHRyX3QpbmFtZSkgJSA0KSA9PSAwKSksCisgICAgICAgICAgICAgc29ja19zZXRfZXJybm8oc29jaywgZXJyX3RvX2Vycm5vKEVSUl9BUkcpKTsgcmV0dXJuIC0xOyk7CisgIG5hbWVfaW4gPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopKHZvaWQqKW5hbWU7CisKKyAgaW5ldF9hZGRyX3RvX2lwYWRkcigmbG9jYWxfYWRkciwgJm5hbWVfaW4tPnNpbl9hZGRyKTsKKyAgbG9jYWxfcG9ydCA9IG5hbWVfaW4tPnNpbl9wb3J0OworCisgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9iaW5kKCVkLCBhZGRyPSIsIHMpKTsKKyAgaXBfYWRkcl9kZWJ1Z19wcmludChTT0NLRVRTX0RFQlVHLCAmbG9jYWxfYWRkcik7CisgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgiIHBvcnQ9JSJVMTZfRiIpXG4iLCBudG9ocyhsb2NhbF9wb3J0KSkpOworCisgIGVyciA9IG5ldGNvbm5fYmluZChzb2NrLT5jb25uLCAmbG9jYWxfYWRkciwgbnRvaHMobG9jYWxfcG9ydCkpOworCisgIGlmIChlcnIgIT0gRVJSX09LKSB7CisgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2JpbmQoJWQpIGZhaWxlZCwgZXJyPSVkXG4iLCBzLCBlcnIpKTsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBlcnJfdG9fZXJybm8oZXJyKSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2JpbmQoJWQpIHN1Y2NlZWRlZFxuIiwgcykpOworICBzb2NrX3NldF9lcnJubyhzb2NrLCAwKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorbHdpcF9jbG9zZShpbnQgcykKK3sKKyAgc3RydWN0IGx3aXBfc29jayAqc29jazsKKyAgaW50IGlzX3RjcCA9IDA7CisKKyAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2Nsb3NlKCVkKVxuIiwgcykpOworCisgIHNvY2sgPSBnZXRfc29ja2V0KHMpOworICBpZiAoIXNvY2spIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZihzb2NrLT5jb25uICE9IE5VTEwpIHsKKyAgICBpc190Y3AgPSBuZXRjb25uX3R5cGUoc29jay0+Y29ubikgPT0gTkVUQ09OTl9UQ1A7CisgIH0gZWxzZSB7CisgICAgTFdJUF9BU1NFUlQoInNvY2stPmxhc3RkYXRhID09IE5VTEwiLCBzb2NrLT5sYXN0ZGF0YSA9PSBOVUxMKTsKKyAgfQorCisgIG5ldGNvbm5fZGVsZXRlKHNvY2stPmNvbm4pOworCisgIGZyZWVfc29ja2V0KHNvY2ssIGlzX3RjcCk7CisgIHNldF9lcnJubygwKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorbHdpcF9jb25uZWN0KGludCBzLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIHNvY2tsZW5fdCBuYW1lbGVuKQoreworICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrOworICBlcnJfdCBlcnI7CisgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqbmFtZV9pbjsKKworICBzb2NrID0gZ2V0X3NvY2tldChzKTsKKyAgaWYgKCFzb2NrKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogY2hlY2sgc2l6ZSwgZmFtaWxpeSBhbmQgYWxpZ25tZW50IG9mICduYW1lJyAqLworICBMV0lQX0VSUk9SKCJsd2lwX2Nvbm5lY3Q6IGludmFsaWQgYWRkcmVzcyIsICgobmFtZWxlbiA9PSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkgJiYKKyAgICAgICAgICAgICAoKG5hbWUtPnNhX2ZhbWlseSkgPT0gQUZfSU5FVCkgJiYgKCgoKG1lbV9wdHJfdCluYW1lKSAlIDQpID09IDApKSwKKyAgICAgICAgICAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBlcnJfdG9fZXJybm8oRVJSX0FSRykpOyByZXR1cm4gLTE7KTsKKyAgbmFtZV9pbiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikodm9pZCopbmFtZTsKKworICBpZiAobmFtZV9pbi0+c2luX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKyAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfY29ubmVjdCglZCwgQUZfVU5TUEVDKVxuIiwgcykpOworICAgIGVyciA9IG5ldGNvbm5fZGlzY29ubmVjdChzb2NrLT5jb25uKTsKKyAgfSBlbHNlIHsKKyAgICBpcF9hZGRyX3QgcmVtb3RlX2FkZHI7CisgICAgdTE2X3QgcmVtb3RlX3BvcnQ7CisKKyAgICBpbmV0X2FkZHJfdG9faXBhZGRyKCZyZW1vdGVfYWRkciwgJm5hbWVfaW4tPnNpbl9hZGRyKTsKKyAgICByZW1vdGVfcG9ydCA9IG5hbWVfaW4tPnNpbl9wb3J0OworCisgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2Nvbm5lY3QoJWQsIGFkZHI9IiwgcykpOworICAgIGlwX2FkZHJfZGVidWdfcHJpbnQoU09DS0VUU19ERUJVRywgJnJlbW90ZV9hZGRyKTsKKyAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoIiBwb3J0PSUiVTE2X0YiKVxuIiwgbnRvaHMocmVtb3RlX3BvcnQpKSk7CisKKyAgICBlcnIgPSBuZXRjb25uX2Nvbm5lY3Qoc29jay0+Y29ubiwgJnJlbW90ZV9hZGRyLCBudG9ocyhyZW1vdGVfcG9ydCkpOworICB9CisKKyAgaWYgKGVyciAhPSBFUlJfT0spIHsKKyAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfY29ubmVjdCglZCkgZmFpbGVkLCBlcnI9JWRcbiIsIHMsIGVycikpOworICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIGVycl90b19lcnJubyhlcnIpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfY29ubmVjdCglZCkgc3VjY2VlZGVkXG4iLCBzKSk7CisgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIDApOworICByZXR1cm4gMDsKK30KKworLyoqCisgKiBTZXQgYSBzb2NrZXQgaW50byBsaXN0ZW4gbW9kZS4KKyAqIFRoZSBzb2NrZXQgbWF5IG5vdCBoYXZlIGJlZW4gdXNlZCBmb3IgYW5vdGhlciBjb25uZWN0aW9uIHByZXZpb3VzbHkuCisgKgorICogQHBhcmFtIHMgdGhlIHNvY2tldCB0byBzZXQgdG8gbGlzdGVuaW5nIG1vZGUKKyAqIEBwYXJhbSBiYWNrbG9nIChBVFRFTlRJT046IG5lZWRzIFRDUF9MSVNURU5fQkFDS0xPRz0xKQorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKKyAqLworaW50Citsd2lwX2xpc3RlbihpbnQgcywgaW50IGJhY2tsb2cpCit7CisgIHN0cnVjdCBsd2lwX3NvY2sgKnNvY2s7CisgIGVycl90IGVycjsKKworICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfbGlzdGVuKCVkLCBiYWNrbG9nPSVkKVxuIiwgcywgYmFja2xvZykpOworCisgIHNvY2sgPSBnZXRfc29ja2V0KHMpOworICBpZiAoIXNvY2spIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBsaW1pdCB0aGUgImJhY2tsb2ciIHBhcmFtZXRlciB0byBmaXQgaW4gYW4gdThfdCAqLworICBiYWNrbG9nID0gTFdJUF9NSU4oTFdJUF9NQVgoYmFja2xvZywgMCksIDB4ZmYpOworCisgIGVyciA9IG5ldGNvbm5fbGlzdGVuX3dpdGhfYmFja2xvZyhzb2NrLT5jb25uLCAodThfdCliYWNrbG9nKTsKKworICBpZiAoZXJyICE9IEVSUl9PSykgeworICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9saXN0ZW4oJWQpIGZhaWxlZCwgZXJyPSVkXG4iLCBzLCBlcnIpKTsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBlcnJfdG9fZXJybm8oZXJyKSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgc29ja19zZXRfZXJybm8oc29jaywgMCk7CisgIHJldHVybiAwOworfQorCitpbnQKK2x3aXBfcmVjdmZyb20oaW50IHMsIHZvaWQgKm1lbSwgc2l6ZV90IGxlbiwgaW50IGZsYWdzLAorICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sIHNvY2tsZW5fdCAqZnJvbWxlbikKK3sKKyAgc3RydWN0IGx3aXBfc29jayAqc29jazsKKyAgdm9pZCAgICAgICAgICAgICAqYnVmID0gTlVMTDsKKyAgc3RydWN0IHBidWYgICAgICAqcDsKKyAgdTE2X3QgICAgICAgICAgICBidWZsZW4sIGNvcHlsZW47CisgIGludCAgICAgICAgICAgICAgb2ZmID0gMDsKKyAgaXBfYWRkcl90ICAgICAgICAqYWRkcjsKKyAgdTE2X3QgICAgICAgICAgICBwb3J0OworICB1OF90ICAgICAgICAgICAgIGRvbmUgPSAwOworICBlcnJfdCAgICAgICAgICAgIGVycjsKKworICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfcmVjdmZyb20oJWQsICVwLCAlIlNaVF9GIiwgMHgleCwgLi4pXG4iLCBzLCBtZW0sIGxlbiwgZmxhZ3MpKTsKKyAgc29jayA9IGdldF9zb2NrZXQocyk7CisgIGlmICghc29jaykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGRvIHsKKyAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfcmVjdmZyb206IHRvcCB3aGlsZSBzb2NrLT5sYXN0ZGF0YT0lcFxuIiwgc29jay0+bGFzdGRhdGEpKTsKKyAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBkYXRhIGxlZnQgZnJvbSB0aGUgbGFzdCByZWN2IG9wZXJhdGlvbi4gKi8KKyAgICBpZiAoc29jay0+bGFzdGRhdGEpIHsKKyAgICAgIGJ1ZiA9IHNvY2stPmxhc3RkYXRhOworICAgIH0gZWxzZSB7CisgICAgICAvKiBJZiB0aGlzIGlzIG5vbi1ibG9ja2luZyBjYWxsLCB0aGVuIGNoZWNrIGZpcnN0ICovCisgICAgICBpZiAoKChmbGFncyAmIE1TR19ET05UV0FJVCkgfHwgbmV0Y29ubl9pc19ub25ibG9ja2luZyhzb2NrLT5jb25uKSkgJiYgCisgICAgICAgICAgKHNvY2stPnJjdmV2ZW50IDw9IDApKSB7CisgICAgICAgIGlmIChvZmYgPiAwKSB7CisgICAgICAgICAgLyogdXBkYXRlIHJlY2VpdmUgd2luZG93ICovCisgICAgICAgICAgbmV0Y29ubl9yZWN2ZWQoc29jay0+Y29ubiwgKHUzMl90KW9mZik7CisgICAgICAgICAgLyogYWxyZWFkeSByZWNlaXZlZCBkYXRhLCByZXR1cm4gdGhhdCAqLworICAgICAgICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIDApOworICAgICAgICAgIHJldHVybiBvZmY7CisgICAgICAgIH0KKyAgICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3JlY3Zmcm9tKCVkKTogcmV0dXJuaW5nIEVXT1VMREJMT0NLXG4iLCBzKSk7CisgICAgICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIEVXT1VMREJMT0NLKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICAvKiBObyBkYXRhIHdhcyBsZWZ0IGZyb20gdGhlIHByZXZpb3VzIG9wZXJhdGlvbiwgc28gd2UgdHJ5IHRvIGdldAorICAgICAgICAgc29tZSBmcm9tIHRoZSBuZXR3b3JrLiAqLworICAgICAgaWYgKG5ldGNvbm5fdHlwZShzb2NrLT5jb25uKSA9PSBORVRDT05OX1RDUCkgeworICAgICAgICBlcnIgPSBuZXRjb25uX3JlY3ZfdGNwX3BidWYoc29jay0+Y29ubiwgKHN0cnVjdCBwYnVmICoqKSZidWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbmV0Y29ubl9yZWN2KHNvY2stPmNvbm4sIChzdHJ1Y3QgbmV0YnVmICoqKSZidWYpOworICAgICAgfQorICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3JlY3Zmcm9tOiBuZXRjb25uX3JlY3YgZXJyPSVkLCBuZXRidWY9JXBcbiIsCisgICAgICAgIGVyciwgYnVmKSk7CisKKyAgICAgIGlmIChlcnIgIT0gRVJSX09LKSB7CisgICAgICAgIGlmIChvZmYgPiAwKSB7CisgICAgICAgICAgLyogdXBkYXRlIHJlY2VpdmUgd2luZG93ICovCisgICAgICAgICAgbmV0Y29ubl9yZWN2ZWQoc29jay0+Y29ubiwgKHUzMl90KW9mZik7CisgICAgICAgICAgLyogYWxyZWFkeSByZWNlaXZlZCBkYXRhLCByZXR1cm4gdGhhdCAqLworICAgICAgICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIDApOworICAgICAgICAgIHJldHVybiBvZmY7CisgICAgICAgIH0KKyAgICAgICAgLyogV2Ugc2hvdWxkIHJlYWxseSBkbyBzb21lIGVycm9yIGNoZWNraW5nIGhlcmUuICovCisgICAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9yZWN2ZnJvbSglZCk6IGJ1ZiA9PSBOVUxMLCBlcnJvciBpcyBcIiVzXCIhXG4iLAorICAgICAgICAgIHMsIGx3aXBfc3RyZXJyKGVycikpKTsKKyAgICAgICAgc29ja19zZXRfZXJybm8oc29jaywgZXJyX3RvX2Vycm5vKGVycikpOworICAgICAgICBpZiAoZXJyID09IEVSUl9DTFNEKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CisgICAgICBMV0lQX0FTU0VSVCgiYnVmICE9IE5VTEwiLCBidWYgIT0gTlVMTCk7CisgICAgICBzb2NrLT5sYXN0ZGF0YSA9IGJ1ZjsKKyAgICB9CisKKyAgICBpZiAobmV0Y29ubl90eXBlKHNvY2stPmNvbm4pID09IE5FVENPTk5fVENQKSB7CisgICAgICBwID0gKHN0cnVjdCBwYnVmICopYnVmOworICAgIH0gZWxzZSB7CisgICAgICBwID0gKChzdHJ1Y3QgbmV0YnVmICopYnVmKS0+cDsKKyAgICB9CisgICAgYnVmbGVuID0gcC0+dG90X2xlbjsKKyAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfcmVjdmZyb206IGJ1Zmxlbj0lIlUxNl9GIiBsZW49JSJTWlRfRiIgb2ZmPSVkIHNvY2stPmxhc3RvZmZzZXQ9JSJVMTZfRiJcbiIsCisgICAgICBidWZsZW4sIGxlbiwgb2ZmLCBzb2NrLT5sYXN0b2Zmc2V0KSk7CisKKyAgICBidWZsZW4gLT0gc29jay0+bGFzdG9mZnNldDsKKworICAgIGlmIChsZW4gPiBidWZsZW4pIHsKKyAgICAgIGNvcHlsZW4gPSBidWZsZW47CisgICAgfSBlbHNlIHsKKyAgICAgIGNvcHlsZW4gPSAodTE2X3QpbGVuOworICAgIH0KKworICAgIC8qIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWNlaXZlZCBidWZmZXIgaW50bworICAgIHRoZSBzdXBwbGllZCBtZW1vcnkgcG9pbnRlciBtZW0gKi8KKyAgICBwYnVmX2NvcHlfcGFydGlhbChwLCAodThfdCopbWVtICsgb2ZmLCBjb3B5bGVuLCBzb2NrLT5sYXN0b2Zmc2V0KTsKKworICAgIG9mZiArPSBjb3B5bGVuOworCisgICAgaWYgKG5ldGNvbm5fdHlwZShzb2NrLT5jb25uKSA9PSBORVRDT05OX1RDUCkgeworICAgICAgTFdJUF9BU1NFUlQoImludmFsaWQgY29weWxlbiwgbGVuIHdvdWxkIHVuZGVyZmxvdyIsIGxlbiA+PSBjb3B5bGVuKTsKKyAgICAgIGxlbiAtPSBjb3B5bGVuOworICAgICAgaWYgKCAobGVuIDw9IDApIHx8IAorICAgICAgICAgICAocC0+ZmxhZ3MgJiBQQlVGX0ZMQUdfUFVTSCkgfHwgCisgICAgICAgICAgIChzb2NrLT5yY3ZldmVudCA8PSAwKSB8fCAKKyAgICAgICAgICAgKChmbGFncyAmIE1TR19QRUVLKSE9MCkpIHsKKyAgICAgICAgZG9uZSA9IDE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGRvbmUgPSAxOworICAgIH0KKworICAgIC8qIENoZWNrIHRvIHNlZSBmcm9tIHdoZXJlIHRoZSBkYXRhIHdhcy4qLworICAgIGlmIChkb25lKSB7CisgICAgICBpcF9hZGRyX3QgZnJvbWFkZHI7CisgICAgICBpZiAoZnJvbSAmJiBmcm9tbGVuKSB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisKKyAgICAgICAgaWYgKG5ldGNvbm5fdHlwZShzb2NrLT5jb25uKSA9PSBORVRDT05OX1RDUCkgeworICAgICAgICAgIGFkZHIgPSAmZnJvbWFkZHI7CisgICAgICAgICAgbmV0Y29ubl9nZXRhZGRyKHNvY2stPmNvbm4sIGFkZHIsICZwb3J0LCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhZGRyID0gbmV0YnVmX2Zyb21hZGRyKChzdHJ1Y3QgbmV0YnVmICopYnVmKTsKKyAgICAgICAgICBwb3J0ID0gbmV0YnVmX2Zyb21wb3J0KChzdHJ1Y3QgbmV0YnVmICopYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisgICAgICAgIHNpbi5zaW5fbGVuID0gc2l6ZW9mKHNpbik7CisgICAgICAgIHNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgc2luLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisgICAgICAgIGluZXRfYWRkcl9mcm9tX2lwYWRkcigmc2luLnNpbl9hZGRyLCBhZGRyKTsKKworICAgICAgICBpZiAoKmZyb21sZW4gPiBzaXplb2Yoc2luKSkgeworICAgICAgICAgICpmcm9tbGVuID0gc2l6ZW9mKHNpbik7CisgICAgICAgIH0KKworICAgICAgICBNRU1DUFkoZnJvbSwgJnNpbiwgKmZyb21sZW4pOworCisgICAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9yZWN2ZnJvbSglZCk6IGFkZHI9IiwgcykpOworICAgICAgICBpcF9hZGRyX2RlYnVnX3ByaW50KFNPQ0tFVFNfREVCVUcsIGFkZHIpOworICAgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoIiBwb3J0PSUiVTE2X0YiIGxlbj0lZFxuIiwgcG9ydCwgb2ZmKSk7CisgICAgICB9IGVsc2UgeworI2lmIFNPQ0tFVFNfREVCVUcKKyAgICAgICAgaWYgKG5ldGNvbm5fdHlwZShzb2NrLT5jb25uKSA9PSBORVRDT05OX1RDUCkgeworICAgICAgICAgIGFkZHIgPSAmZnJvbWFkZHI7CisgICAgICAgICAgbmV0Y29ubl9nZXRhZGRyKHNvY2stPmNvbm4sIGFkZHIsICZwb3J0LCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhZGRyID0gbmV0YnVmX2Zyb21hZGRyKChzdHJ1Y3QgbmV0YnVmICopYnVmKTsKKyAgICAgICAgICBwb3J0ID0gbmV0YnVmX2Zyb21wb3J0KChzdHJ1Y3QgbmV0YnVmICopYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9yZWN2ZnJvbSglZCk6IGFkZHI9IiwgcykpOworICAgICAgICBpcF9hZGRyX2RlYnVnX3ByaW50KFNPQ0tFVFNfREVCVUcsIGFkZHIpOworICAgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoIiBwb3J0PSUiVTE2X0YiIGxlbj0lZFxuIiwgcG9ydCwgb2ZmKSk7CisjZW5kaWYgLyogIFNPQ0tFVFNfREVCVUcgKi8KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB3ZSBkb24ndCBwZWVrIHRoZSBpbmNvbWluZyBtZXNzYWdlLi4uICovCisgICAgaWYgKChmbGFncyAmIE1TR19QRUVLKSA9PSAwKSB7CisgICAgICAvKiBJZiB0aGlzIGlzIGEgVENQIHNvY2tldCwgY2hlY2sgaWYgdGhlcmUgaXMgZGF0YSBsZWZ0IGluIHRoZQorICAgICAgICAgYnVmZmVyLiBJZiBzbywgaXQgc2hvdWxkIGJlIHNhdmVkIGluIHRoZSBzb2NrIHN0cnVjdHVyZSBmb3IgbmV4dAorICAgICAgICAgdGltZSBhcm91bmQuICovCisgICAgICBpZiAoKG5ldGNvbm5fdHlwZShzb2NrLT5jb25uKSA9PSBORVRDT05OX1RDUCkgJiYgKGJ1ZmxlbiAtIGNvcHlsZW4gPiAwKSkgeworICAgICAgICBzb2NrLT5sYXN0ZGF0YSA9IGJ1ZjsKKyAgICAgICAgc29jay0+bGFzdG9mZnNldCArPSBjb3B5bGVuOworICAgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfcmVjdmZyb206IGxhc3RkYXRhIG5vdyBuZXRidWY9JXBcbiIsIGJ1ZikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc29jay0+bGFzdGRhdGEgPSBOVUxMOworICAgICAgICBzb2NrLT5sYXN0b2Zmc2V0ID0gMDsKKyAgICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3JlY3Zmcm9tOiBkZWxldGluZyBuZXRidWY9JXBcbiIsIGJ1ZikpOworICAgICAgICBpZiAobmV0Y29ubl90eXBlKHNvY2stPmNvbm4pID09IE5FVENPTk5fVENQKSB7CisgICAgICAgICAgcGJ1Zl9mcmVlKChzdHJ1Y3QgcGJ1ZiAqKWJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV0YnVmX2RlbGV0ZSgoc3RydWN0IG5ldGJ1ZiAqKWJ1Zik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKCFkb25lKTsKKworICBpZiAob2ZmID4gMCkgeworICAgIC8qIHVwZGF0ZSByZWNlaXZlIHdpbmRvdyAqLworICAgIG5ldGNvbm5fcmVjdmVkKHNvY2stPmNvbm4sICh1MzJfdClvZmYpOworICB9CisgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIDApOworICByZXR1cm4gb2ZmOworfQorCitpbnQKK2x3aXBfcmVhZChpbnQgcywgdm9pZCAqbWVtLCBzaXplX3QgbGVuKQoreworICByZXR1cm4gbHdpcF9yZWN2ZnJvbShzLCBtZW0sIGxlbiwgMCwgTlVMTCwgTlVMTCk7Cit9CisKK2ludAorbHdpcF9yZWN2KGludCBzLCB2b2lkICptZW0sIHNpemVfdCBsZW4sIGludCBmbGFncykKK3sKKyAgcmV0dXJuIGx3aXBfcmVjdmZyb20ocywgbWVtLCBsZW4sIGZsYWdzLCBOVUxMLCBOVUxMKTsKK30KKworaW50Citsd2lwX3NlbmQoaW50IHMsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisgIHN0cnVjdCBsd2lwX3NvY2sgKnNvY2s7CisgIGVycl90IGVycjsKKyAgdThfdCB3cml0ZV9mbGFnczsKKworICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2VuZCglZCwgZGF0YT0lcCwgc2l6ZT0lIlNaVF9GIiwgZmxhZ3M9MHgleClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBkYXRhLCBzaXplLCBmbGFncykpOworCisgIHNvY2sgPSBnZXRfc29ja2V0KHMpOworICBpZiAoIXNvY2spIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoc29jay0+Y29ubi0+dHlwZSAhPSBORVRDT05OX1RDUCkgeworI2lmIChMV0lQX1VEUCB8fCBMV0lQX1JBVykKKyAgICByZXR1cm4gbHdpcF9zZW5kdG8ocywgZGF0YSwgc2l6ZSwgZmxhZ3MsIE5VTEwsIDApOworI2Vsc2UgLyogKExXSVBfVURQIHx8IExXSVBfUkFXKSAqLworICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIGVycl90b19lcnJubyhFUlJfQVJHKSk7CisgICAgcmV0dXJuIC0xOworI2VuZGlmIC8qIChMV0lQX1VEUCB8fCBMV0lQX1JBVykgKi8KKyAgfQorCisgIGlmICgoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpIHx8IG5ldGNvbm5faXNfbm9uYmxvY2tpbmcoc29jay0+Y29ubikpIHsKKyAgICBpZiAoKHNpemUgPiBUQ1BfU05EX0JVRikgfHwgKChzaXplIC8gVENQX01TUykgPiBUQ1BfU05EX1FVRVVFTEVOKSkgeworICAgICAgLyogdG9vIG11Y2ggZGF0YSB0byBldmVyIHNlbmQgbm9uYmxvY2tpbmchICovCisgICAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBFTVNHU0laRSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgd3JpdGVfZmxhZ3MgPSBORVRDT05OX0NPUFkgfAorICAgICgoZmxhZ3MgJiBNU0dfTU9SRSkgICAgID8gTkVUQ09OTl9NT1JFICAgICAgOiAwKSB8CisgICAgKChmbGFncyAmIE1TR19ET05UV0FJVCkgPyBORVRDT05OX0RPTlRCTE9DSyA6IDApOworICBlcnIgPSBuZXRjb25uX3dyaXRlKHNvY2stPmNvbm4sIGRhdGEsIHNpemUsIHdyaXRlX2ZsYWdzKTsKKworICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2VuZCglZCkgZXJyPSVkIHNpemU9JSJTWlRfRiJcbiIsIHMsIGVyciwgc2l6ZSkpOworICBzb2NrX3NldF9lcnJubyhzb2NrLCBlcnJfdG9fZXJybm8oZXJyKSk7CisgIHJldHVybiAoZXJyID09IEVSUl9PSyA/IChpbnQpc2l6ZSA6IC0xKTsKK30KKworaW50Citsd2lwX3NlbmR0byhpbnQgcywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludCBmbGFncywKKyAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBzb2NrbGVuX3QgdG9sZW4pCit7CisgIHN0cnVjdCBsd2lwX3NvY2sgKnNvY2s7CisgIGVycl90IGVycjsKKyAgdTE2X3Qgc2hvcnRfc2l6ZTsKKyAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICp0b19pbjsKKyAgdTE2X3QgcmVtb3RlX3BvcnQ7CisjaWYgIUxXSVBfVENQSVBfQ09SRV9MT0NLSU5HCisgIHN0cnVjdCBuZXRidWYgYnVmOworI2VuZGlmCisKKyAgc29jayA9IGdldF9zb2NrZXQocyk7CisgIGlmICghc29jaykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChzb2NrLT5jb25uLT50eXBlID09IE5FVENPTk5fVENQKSB7CisjaWYgTFdJUF9UQ1AKKyAgICByZXR1cm4gbHdpcF9zZW5kKHMsIGRhdGEsIHNpemUsIGZsYWdzKTsKKyNlbHNlIC8qIExXSVBfVENQICovCisgICAgTFdJUF9VTlVTRURfQVJHKGZsYWdzKTsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBlcnJfdG9fZXJybm8oRVJSX0FSRykpOworICAgIHJldHVybiAtMTsKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworICB9CisKKyAgLyogQHRvZG86IHNwbGl0IGludG8gbXVsdGlwbGUgc2VuZHRvJ3M/ICovCisgIExXSVBfQVNTRVJUKCJsd2lwX3NlbmR0bzogc2l6ZSBtdXN0IGZpdCBpbiB1MTZfdCIsIHNpemUgPD0gMHhmZmZmKTsKKyAgc2hvcnRfc2l6ZSA9ICh1MTZfdClzaXplOworICBMV0lQX0VSUk9SKCJsd2lwX3NlbmR0bzogaW52YWxpZCBhZGRyZXNzIiwgKCgodG8gPT0gTlVMTCkgJiYgKHRvbGVuID09IDApKSB8fAorICAgICAgICAgICAgICgodG9sZW4gPT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpICYmCisgICAgICAgICAgICAgKCh0by0+c2FfZmFtaWx5KSA9PSBBRl9JTkVUKSAmJiAoKCgobWVtX3B0cl90KXRvKSAlIDQpID09IDApKSksCisgICAgICAgICAgICAgc29ja19zZXRfZXJybm8oc29jaywgZXJyX3RvX2Vycm5vKEVSUl9BUkcpKTsgcmV0dXJuIC0xOyk7CisgIHRvX2luID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKSh2b2lkKil0bzsKKworI2lmIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HCisgIC8qIFNob3VsZCBvbmx5IGJlIGNvbnNpZGVyIGxpa2UgYSBzYW1wbGUgb3IgYSBzaW1wbGUgd2F5IHRvIGV4cGVyaW1lbnQgdGhpcyBvcHRpb24gKG5vIGNoZWNrIG9mICJ0byIgZmllbGQuLi4pICovCisgIHsKKyAgICBzdHJ1Y3QgcGJ1ZiogcDsKKyAgICBpcF9hZGRyX3QgKnJlbW90ZV9hZGRyOworCisjaWYgTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRgorICAgIHAgPSBwYnVmX2FsbG9jKFBCVUZfVFJBTlNQT1JULCBzaG9ydF9zaXplLCBQQlVGX1JBTSk7CisgICAgaWYgKHAgIT0gTlVMTCkgeworI2lmIExXSVBfQ0hFQ0tTVU1fT05fQ09QWQorICAgICAgdTE2X3QgY2hrc3VtID0gMDsKKyAgICAgIGlmIChzb2NrLT5jb25uLT50eXBlICE9IE5FVENPTk5fUkFXKSB7CisgICAgICAgIGNoa3N1bSA9IExXSVBfQ0hLU1VNX0NPUFkocC0+cGF5bG9hZCwgZGF0YSwgc2hvcnRfc2l6ZSk7CisgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KKyAgICAgIE1FTUNQWShwLT5wYXlsb2FkLCBkYXRhLCBzaXplKTsKKyNlbHNlIC8qIExXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYgKi8KKyAgICBwID0gcGJ1Zl9hbGxvYyhQQlVGX1RSQU5TUE9SVCwgc2hvcnRfc2l6ZSwgUEJVRl9SRUYpOworICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgIHAtPnBheWxvYWQgPSAodm9pZCopZGF0YTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGICovCisKKyAgICAgIGlmICh0b19pbiAhPSBOVUxMKSB7CisgICAgICAgIGluZXRfYWRkcl90b19pcGFkZHJfcChyZW1vdGVfYWRkciwgJnRvX2luLT5zaW5fYWRkcik7CisgICAgICAgIHJlbW90ZV9wb3J0ID0gbnRvaHModG9faW4tPnNpbl9wb3J0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbW90ZV9hZGRyID0gJnNvY2stPmNvbm4tPnBjYi5yYXctPnJlbW90ZV9pcDsKKyAgICAgICAgaWYgKHNvY2stPmNvbm4tPnR5cGUgPT0gTkVUQ09OTl9SQVcpIHsKKyAgICAgICAgICByZW1vdGVfcG9ydCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVtb3RlX3BvcnQgPSBzb2NrLT5jb25uLT5wY2IudWRwLT5yZW1vdGVfcG9ydDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBMT0NLX1RDUElQX0NPUkUoKTsKKyAgICAgIGlmIChzb2NrLT5jb25uLT50eXBlID09IE5FVENPTk5fUkFXKSB7CisgICAgICAgIGVyciA9IHNvY2stPmNvbm4tPmxhc3RfZXJyID0gcmF3X3NlbmR0byhzb2NrLT5jb25uLT5wY2IucmF3LCBwLCByZW1vdGVfYWRkcik7CisgICAgICB9IGVsc2UgeworI2lmIExXSVBfVURQCisjaWYgTFdJUF9DSEVDS1NVTV9PTl9DT1BZICYmIExXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYKKyAgICAgICAgZXJyID0gc29jay0+Y29ubi0+bGFzdF9lcnIgPSB1ZHBfc2VuZHRvX2Noa3N1bShzb2NrLT5jb25uLT5wY2IudWRwLCBwLAorICAgICAgICAgIHJlbW90ZV9hZGRyLCByZW1vdGVfcG9ydCwgMSwgY2hrc3VtKTsKKyNlbHNlIC8qIExXSVBfQ0hFQ0tTVU1fT05fQ09QWSAmJiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGICovCisgICAgICAgIGVyciA9IHNvY2stPmNvbm4tPmxhc3RfZXJyID0gdWRwX3NlbmR0byhzb2NrLT5jb25uLT5wY2IudWRwLCBwLAorICAgICAgICAgIHJlbW90ZV9hZGRyLCByZW1vdGVfcG9ydCk7CisjZW5kaWYgLyogTFdJUF9DSEVDS1NVTV9PTl9DT1BZICYmIExXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYgKi8KKyNlbHNlIC8qIExXSVBfVURQICovCisgICAgICAgIGVyciA9IEVSUl9BUkc7CisjZW5kaWYgLyogTFdJUF9VRFAgKi8KKyAgICAgIH0KKyAgICAgIFVOTE9DS19UQ1BJUF9DT1JFKCk7CisgICAgICAKKyAgICAgIHBidWZfZnJlZShwKTsKKyAgICB9IGVsc2UgeworICAgICAgZXJyID0gRVJSX01FTTsKKyAgICB9CisgIH0KKyNlbHNlIC8qIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HICovCisgIC8qIGluaXRpYWxpemUgYSBidWZmZXIgKi8KKyAgYnVmLnAgPSBidWYucHRyID0gTlVMTDsKKyNpZiBMV0lQX0NIRUNLU1VNX09OX0NPUFkKKyAgYnVmLmZsYWdzID0gMDsKKyNlbmRpZiAvKiBMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KKyAgaWYgKHRvKSB7CisgICAgaW5ldF9hZGRyX3RvX2lwYWRkcigmYnVmLmFkZHIsICZ0b19pbi0+c2luX2FkZHIpOworICAgIHJlbW90ZV9wb3J0ICAgICAgICAgICA9IG50b2hzKHRvX2luLT5zaW5fcG9ydCk7CisgICAgbmV0YnVmX2Zyb21wb3J0KCZidWYpID0gcmVtb3RlX3BvcnQ7CisgIH0gZWxzZSB7CisgICAgcmVtb3RlX3BvcnQgICAgICAgICAgID0gMDsKKyAgICBpcF9hZGRyX3NldF9hbnkoJmJ1Zi5hZGRyKTsKKyAgICBuZXRidWZfZnJvbXBvcnQoJmJ1ZikgPSAwOworICB9CisKKyAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NlbmR0byglZCwgZGF0YT0lcCwgc2hvcnRfc2l6ZT0lIlUxNl9GIiwgZmxhZ3M9MHgleCB0bz0iLAorICAgICAgICAgICAgICBzLCBkYXRhLCBzaG9ydF9zaXplLCBmbGFncykpOworICBpcF9hZGRyX2RlYnVnX3ByaW50KFNPQ0tFVFNfREVCVUcsICZidWYuYWRkcik7CisgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgiIHBvcnQ9JSJVMTZfRiJcbiIsIHJlbW90ZV9wb3J0KSk7CisKKyAgLyogbWFrZSB0aGUgYnVmZmVyIHBvaW50IHRvIHRoZSBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgKi8KKyNpZiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGCisgIC8qIEFsbG9jYXRlIGEgbmV3IG5ldGJ1ZiBhbmQgY29weSB0aGUgZGF0YSBpbnRvIGl0LiAqLworICBpZiAobmV0YnVmX2FsbG9jKCZidWYsIHNob3J0X3NpemUpID09IE5VTEwpIHsKKyAgICBlcnIgPSBFUlJfTUVNOworICB9IGVsc2UgeworI2lmIExXSVBfQ0hFQ0tTVU1fT05fQ09QWQorICAgIGlmIChzb2NrLT5jb25uLT50eXBlICE9IE5FVENPTk5fUkFXKSB7CisgICAgICB1MTZfdCBjaGtzdW0gPSBMV0lQX0NIS1NVTV9DT1BZKGJ1Zi5wLT5wYXlsb2FkLCBkYXRhLCBzaG9ydF9zaXplKTsKKyAgICAgIG5ldGJ1Zl9zZXRfY2hrc3VtKCZidWYsIGNoa3N1bSk7CisgICAgICBlcnIgPSBFUlJfT0s7CisgICAgfSBlbHNlCisjZW5kaWYgLyogTFdJUF9DSEVDS1NVTV9PTl9DT1BZICovCisgICAgeworICAgICAgZXJyID0gbmV0YnVmX3Rha2UoJmJ1ZiwgZGF0YSwgc2hvcnRfc2l6ZSk7CisgICAgfQorICB9CisjZWxzZSAvKiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGICovCisgIGVyciA9IG5ldGJ1Zl9yZWYoJmJ1ZiwgZGF0YSwgc2hvcnRfc2l6ZSk7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRiAqLworICBpZiAoZXJyID09IEVSUl9PSykgeworICAgIC8qIHNlbmQgdGhlIGRhdGEgKi8KKyAgICBlcnIgPSBuZXRjb25uX3NlbmQoc29jay0+Y29ubiwgJmJ1Zik7CisgIH0KKworICAvKiBkZWFsbG9jYXRlZCB0aGUgYnVmZmVyICovCisgIG5ldGJ1Zl9mcmVlKCZidWYpOworI2VuZGlmIC8qIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HICovCisgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIGVycl90b19lcnJubyhlcnIpKTsKKyAgcmV0dXJuIChlcnIgPT0gRVJSX09LID8gc2hvcnRfc2l6ZSA6IC0xKTsKK30KKworaW50Citsd2lwX3NvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworICBzdHJ1Y3QgbmV0Y29ubiAqY29ubjsKKyAgaW50IGk7CisKKyAgTFdJUF9VTlVTRURfQVJHKGRvbWFpbik7CisKKyAgLyogY3JlYXRlIGEgbmV0Y29ubiAqLworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBTT0NLX1JBVzoKKyAgICBjb25uID0gbmV0Y29ubl9uZXdfd2l0aF9wcm90b19hbmRfY2FsbGJhY2soTkVUQ09OTl9SQVcsICh1OF90KXByb3RvY29sLCBldmVudF9jYWxsYmFjayk7CisgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NvY2tldCglcywgU09DS19SQVcsICVkKSA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4gPT0gUEZfSU5FVCA/ICJQRl9JTkVUIiA6ICJVTktOT1dOIiwgcHJvdG9jb2wpKTsKKyAgICBicmVhazsKKyAgY2FzZSBTT0NLX0RHUkFNOgorICAgIGNvbm4gPSBuZXRjb25uX25ld193aXRoX2NhbGxiYWNrKCAocHJvdG9jb2wgPT0gSVBQUk9UT19VRFBMSVRFKSA/CisgICAgICAgICAgICAgICAgIE5FVENPTk5fVURQTElURSA6IE5FVENPTk5fVURQLCBldmVudF9jYWxsYmFjayk7CisgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NvY2tldCglcywgU09DS19ER1JBTSwgJWQpID0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9PSBQRl9JTkVUID8gIlBGX0lORVQiIDogIlVOS05PV04iLCBwcm90b2NvbCkpOworICAgIGJyZWFrOworICBjYXNlIFNPQ0tfU1RSRUFNOgorICAgIGNvbm4gPSBuZXRjb25uX25ld193aXRoX2NhbGxiYWNrKE5FVENPTk5fVENQLCBldmVudF9jYWxsYmFjayk7CisgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NvY2tldCglcywgU09DS19TVFJFQU0sICVkKSA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4gPT0gUEZfSU5FVCA/ICJQRl9JTkVUIiA6ICJVTktOT1dOIiwgcHJvdG9jb2wpKTsKKyAgICBpZiAoY29ubiAhPSBOVUxMKSB7CisgICAgICAvKiBQcmV2ZW50IGF1dG9tYXRpYyB3aW5kb3cgdXBkYXRlcywgd2UgZG8gdGhpcyBvbiBvdXIgb3duISAqLworICAgICAgbmV0Y29ubl9zZXRfbm9hdXRvcmVjdmVkKGNvbm4sIDEpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc29ja2V0KCVkLCAlZC9VTktOT1dOLCAlZCkgPSAtMVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpKTsKKyAgICBzZXRfZXJybm8oRUlOVkFMKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoIWNvbm4pIHsKKyAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoIi0xIC8gRU5PQlVGUyAoY291bGQgbm90IGNyZWF0ZSBuZXRjb25uKVxuIikpOworICAgIHNldF9lcnJubyhFTk9CVUZTKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpID0gYWxsb2Nfc29ja2V0KGNvbm4sIDApOworCisgIGlmIChpID09IC0xKSB7CisgICAgbmV0Y29ubl9kZWxldGUoY29ubik7CisgICAgc2V0X2Vycm5vKEVORklMRSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNvbm4tPnNvY2tldCA9IGk7CisgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgiJWRcbiIsIGkpKTsKKyAgc2V0X2Vycm5vKDApOworICByZXR1cm4gaTsKK30KKworaW50Citsd2lwX3dyaXRlKGludCBzLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIGx3aXBfc2VuZChzLCBkYXRhLCBzaXplLCAwKTsKK30KKworLyoqCisgKiBHbyB0aHJvdWdoIHRoZSByZWFkc2V0IGFuZCB3cml0ZXNldCBsaXN0cyBhbmQgc2VlIHdoaWNoIHNvY2tldCBvZiB0aGUgc29ja2V0cworICogc2V0IGluIHRoZSBzZXRzIGhhcyBldmVudHMuIE9uIHJldHVybiwgcmVhZHNldCwgd3JpdGVzZXQgYW5kIGV4Y2VwdHNldCBoYXZlCisgKiB0aGUgc29ja2V0cyBlbmFibGVkIHRoYXQgaGFkIGV2ZW50cy4KKyAqCisgKiBleGNlcHRzZXQgaXMgbm90IHVzZWQgZm9yIG5vdyEhIQorICoKKyAqIEBwYXJhbSBtYXhmZHAxIHRoZSBoaWdoZXN0IHNvY2tldCBpbmRleCBpbiB0aGUgc2V0cworICogQHBhcmFtIHJlYWRzZXRfaW46ICAgIHNldCBvZiBzb2NrZXRzIHRvIGNoZWNrIGZvciByZWFkIGV2ZW50cworICogQHBhcmFtIHdyaXRlc2V0X2luOiAgIHNldCBvZiBzb2NrZXRzIHRvIGNoZWNrIGZvciB3cml0ZSBldmVudHMKKyAqIEBwYXJhbSBleGNlcHRzZXRfaW46ICBzZXQgb2Ygc29ja2V0cyB0byBjaGVjayBmb3IgZXJyb3IgZXZlbnRzCisgKiBAcGFyYW0gcmVhZHNldF9vdXQ6ICAgc2V0IG9mIHNvY2tldHMgdGhhdCBoYWQgcmVhZCBldmVudHMKKyAqIEBwYXJhbSB3cml0ZXNldF9vdXQ6ICBzZXQgb2Ygc29ja2V0cyB0aGF0IGhhZCB3cml0ZSBldmVudHMKKyAqIEBwYXJhbSBleGNlcHRzZXRfb3V0OiBzZXQgb3Mgc29ja2V0cyB0aGF0IGhhZCBlcnJvciBldmVudHMKKyAqIEByZXR1cm4gbnVtYmVyIG9mIHNvY2tldHMgdGhhdCBoYWQgZXZlbnRzIChyZWFkL3dyaXRlL2V4Y2VwdGlvbikgKD49IDApCisgKi8KK3N0YXRpYyBpbnQKK2x3aXBfc2Vsc2NhbihpbnQgbWF4ZmRwMSwgZmRfc2V0ICpyZWFkc2V0X2luLCBmZF9zZXQgKndyaXRlc2V0X2luLCBmZF9zZXQgKmV4Y2VwdHNldF9pbiwKKyAgICAgICAgICAgICBmZF9zZXQgKnJlYWRzZXRfb3V0LCBmZF9zZXQgKndyaXRlc2V0X291dCwgZmRfc2V0ICpleGNlcHRzZXRfb3V0KQoreworICBpbnQgaSwgbnJlYWR5ID0gMDsKKyAgZmRfc2V0IGxyZWFkc2V0LCBsd3JpdGVzZXQsIGxleGNlcHRzZXQ7CisgIHN0cnVjdCBsd2lwX3NvY2sgKnNvY2s7CisgIFNZU19BUkNIX0RFQ0xfUFJPVEVDVChsZXYpOworCisgIEZEX1pFUk8oJmxyZWFkc2V0KTsKKyAgRkRfWkVSTygmbHdyaXRlc2V0KTsKKyAgRkRfWkVSTygmbGV4Y2VwdHNldCk7CisKKyAgLyogR28gdGhyb3VnaCBlYWNoIHNvY2tldCBpbiBlYWNoIGxpc3QgdG8gY291bnQgbnVtYmVyIG9mIHNvY2tldHMgd2hpY2gKKyAgICAgY3VycmVudGx5IG1hdGNoICovCisgIGZvcihpID0gMDsgaSA8IG1heGZkcDE7IGkrKykgeworICAgIHZvaWQqIGxhc3RkYXRhID0gTlVMTDsKKyAgICBzMTZfdCByY3ZldmVudCA9IDA7CisgICAgdTE2X3Qgc2VuZGV2ZW50ID0gMDsKKyAgICB1MTZfdCBlcnJldmVudCA9IDA7CisgICAgLyogRmlyc3QgZ2V0IHRoZSBzb2NrZXQncyBzdGF0dXMgKHByb3RlY3RlZCkuLi4gKi8KKyAgICBTWVNfQVJDSF9QUk9URUNUKGxldik7CisgICAgc29jayA9IHRyeWdldF9zb2NrZXQoaSk7CisgICAgaWYgKHNvY2sgIT0gTlVMTCkgeworICAgICAgbGFzdGRhdGEgPSBzb2NrLT5sYXN0ZGF0YTsKKyAgICAgIHJjdmV2ZW50ID0gc29jay0+cmN2ZXZlbnQ7CisgICAgICBzZW5kZXZlbnQgPSBzb2NrLT5zZW5kZXZlbnQ7CisgICAgICBlcnJldmVudCA9IHNvY2stPmVycmV2ZW50OworICAgIH0KKyAgICBTWVNfQVJDSF9VTlBST1RFQ1QobGV2KTsKKyAgICAvKiAuLi4gdGhlbiBleGFtaW5lIGl0OiAqLworICAgIC8qIFNlZSBpZiBuZXRjb25uIG9mIHRoaXMgc29ja2V0IGlzIHJlYWR5IGZvciByZWFkICovCisgICAgaWYgKHJlYWRzZXRfaW4gJiYgRkRfSVNTRVQoaSwgcmVhZHNldF9pbikgJiYgKChsYXN0ZGF0YSAhPSBOVUxMKSB8fCAocmN2ZXZlbnQgPiAwKSkpIHsKKyAgICAgIEZEX1NFVChpLCAmbHJlYWRzZXQpOworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NlbHNjYW46IGZkPSVkIHJlYWR5IGZvciByZWFkaW5nXG4iLCBpKSk7CisgICAgICBucmVhZHkrKzsKKyAgICB9CisgICAgLyogU2VlIGlmIG5ldGNvbm4gb2YgdGhpcyBzb2NrZXQgaXMgcmVhZHkgZm9yIHdyaXRlICovCisgICAgaWYgKHdyaXRlc2V0X2luICYmIEZEX0lTU0VUKGksIHdyaXRlc2V0X2luKSAmJiAoc2VuZGV2ZW50ICE9IDApKSB7CisgICAgICBGRF9TRVQoaSwgJmx3cml0ZXNldCk7CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2Vsc2NhbjogZmQ9JWQgcmVhZHkgZm9yIHdyaXRpbmdcbiIsIGkpKTsKKyAgICAgIG5yZWFkeSsrOworICAgIH0KKyAgICAvKiBTZWUgaWYgbmV0Y29ubiBvZiB0aGlzIHNvY2tldCBoYWQgYW4gZXJyb3IgKi8KKyAgICBpZiAoZXhjZXB0c2V0X2luICYmIEZEX0lTU0VUKGksIGV4Y2VwdHNldF9pbikgJiYgKGVycmV2ZW50ICE9IDApKSB7CisgICAgICBGRF9TRVQoaSwgJmxleGNlcHRzZXQpOworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NlbHNjYW46IGZkPSVkIHJlYWR5IGZvciBleGNlcHRpb25cbiIsIGkpKTsKKyAgICAgIG5yZWFkeSsrOworICAgIH0KKyAgfQorICAvKiBjb3B5IGxvY2FsIHNldHMgdG8gdGhlIG9uZXMgcHJvdmlkZWQgYXMgYXJndW1lbnRzICovCisgICpyZWFkc2V0X291dCA9IGxyZWFkc2V0OworICAqd3JpdGVzZXRfb3V0ID0gbHdyaXRlc2V0OworICAqZXhjZXB0c2V0X291dCA9IGxleGNlcHRzZXQ7CisKKyAgTFdJUF9BU1NFUlQoIm5yZWFkeSA+PSAwIiwgbnJlYWR5ID49IDApOworICByZXR1cm4gbnJlYWR5OworfQorCisvKioKKyAqIFByb2Nlc3NpbmcgZXhjZXB0c2V0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisgKi8KK2ludAorbHdpcF9zZWxlY3QoaW50IG1heGZkcDEsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCwgZmRfc2V0ICpleGNlcHRzZXQsCisgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKK3sKKyAgdTMyX3Qgd2FpdHJlcyA9IDA7CisgIGludCBucmVhZHk7CisgIGZkX3NldCBscmVhZHNldCwgbHdyaXRlc2V0LCBsZXhjZXB0c2V0OworICB1MzJfdCBtc2VjdGltZW91dDsKKyAgc3RydWN0IGx3aXBfc2VsZWN0X2NiIHNlbGVjdF9jYjsKKyAgZXJyX3QgZXJyOworICBpbnQgaTsKKyAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldik7CisKKyAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NlbGVjdCglZCwgJXAsICVwLCAlcCwgdHZzZWM9JSJTMzJfRiIgdHZ1c2VjPSUiUzMyX0YiKVxuIiwKKyAgICAgICAgICAgICAgICAgIG1heGZkcDEsICh2b2lkICopcmVhZHNldCwgKHZvaWQgKikgd3JpdGVzZXQsICh2b2lkICopIGV4Y2VwdHNldCwKKyAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPyAoczMyX3QpdGltZW91dC0+dHZfc2VjIDogKHMzMl90KS0xLAorICAgICAgICAgICAgICAgICAgdGltZW91dCA/IChzMzJfdCl0aW1lb3V0LT50dl91c2VjIDogKHMzMl90KS0xKSk7CisKKyAgLyogR28gdGhyb3VnaCBlYWNoIHNvY2tldCBpbiBlYWNoIGxpc3QgdG8gY291bnQgbnVtYmVyIG9mIHNvY2tldHMgd2hpY2gKKyAgICAgY3VycmVudGx5IG1hdGNoICovCisgIG5yZWFkeSA9IGx3aXBfc2Vsc2NhbihtYXhmZHAxLCByZWFkc2V0LCB3cml0ZXNldCwgZXhjZXB0c2V0LCAmbHJlYWRzZXQsICZsd3JpdGVzZXQsICZsZXhjZXB0c2V0KTsKKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSBjdXJyZW50IGV2ZW50cywgdGhlbiBzdXNwZW5kIGlmIHdlIGFyZSBzdXBwb3NlZCB0byAqLworICBpZiAoIW5yZWFkeSkgeworICAgIGlmICh0aW1lb3V0ICYmIHRpbWVvdXQtPnR2X3NlYyA9PSAwICYmIHRpbWVvdXQtPnR2X3VzZWMgPT0gMCkgeworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NlbGVjdDogbm8gdGltZW91dCwgcmV0dXJuaW5nIDBcbiIpKTsKKyAgICAgIC8qIFRoaXMgaXMgT0sgYXMgdGhlIGxvY2FsIGZkc2V0cyBhcmUgZW1wdHkgYW5kIG5yZWFkeSBpcyB6ZXJvLAorICAgICAgICAgb3Igd2Ugd291bGQgaGF2ZSByZXR1cm5lZCBlYXJsaWVyLiAqLworICAgICAgZ290byByZXR1cm5fY29weV9mZHNldHM7CisgICAgfQorCisgICAgLyogTm9uZSByZWFkeTogYWRkIG91ciBzZW1hcGhvcmUgdG8gbGlzdDoKKyAgICAgICBXZSBkb24ndCBhY3R1YWxseSBuZWVkIGFueSBkeW5hbWljIG1lbW9yeS4gT3VyIGVudHJ5IG9uIHRoZQorICAgICAgIGxpc3QgaXMgb25seSB2YWxpZCB3aGlsZSB3ZSBhcmUgaW4gdGhpcyBmdW5jdGlvbiwgc28gaXQncyBvaworICAgICAgIHRvIHVzZSBsb2NhbCB2YXJpYWJsZXMuICovCisKKyAgICBzZWxlY3RfY2IubmV4dCA9IE5VTEw7CisgICAgc2VsZWN0X2NiLnByZXYgPSBOVUxMOworICAgIHNlbGVjdF9jYi5yZWFkc2V0ID0gcmVhZHNldDsKKyAgICBzZWxlY3RfY2Iud3JpdGVzZXQgPSB3cml0ZXNldDsKKyAgICBzZWxlY3RfY2IuZXhjZXB0c2V0ID0gZXhjZXB0c2V0OworICAgIHNlbGVjdF9jYi5zZW1fc2lnbmFsbGVkID0gMDsKKyAgICBlcnIgPSBzeXNfc2VtX25ldygmc2VsZWN0X2NiLnNlbSwgMCk7CisgICAgaWYgKGVyciAhPSBFUlJfT0spIHsKKyAgICAgIC8qIGZhaWxlZCB0byBjcmVhdGUgc2VtYXBob3JlICovCisgICAgICBzZXRfZXJybm8oRU5PTUVNKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBQcm90ZWN0IHRoZSBzZWxlY3RfY2JfbGlzdCAqLworICAgIFNZU19BUkNIX1BST1RFQ1QobGV2KTsKKworICAgIC8qIFB1dCB0aGlzIHNlbGVjdF9jYiBvbiB0b3Agb2YgbGlzdCAqLworICAgIHNlbGVjdF9jYi5uZXh0ID0gc2VsZWN0X2NiX2xpc3Q7CisgICAgaWYgKHNlbGVjdF9jYl9saXN0ICE9IE5VTEwpIHsKKyAgICAgIHNlbGVjdF9jYl9saXN0LT5wcmV2ID0gJnNlbGVjdF9jYjsKKyAgICB9CisgICAgc2VsZWN0X2NiX2xpc3QgPSAmc2VsZWN0X2NiOworICAgIC8qIEluY3JlYXNpbmcgdGhpcyBjb3VudGVyIHRlbGxzIGV2ZW5fY2FsbGJhY2sgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZC4gKi8KKyAgICBzZWxlY3RfY2JfY3RyKys7CisKKyAgICAvKiBOb3cgd2UgY2FuIHNhZmVseSB1bnByb3RlY3QgKi8KKyAgICBTWVNfQVJDSF9VTlBST1RFQ1QobGV2KTsKKworICAgIC8qIEluY3JlYXNlIHNlbGVjdF93YWl0aW5nIGZvciBlYWNoIHNvY2tldCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAqLworICAgIGZvcihpID0gMDsgaSA8IG1heGZkcDE7IGkrKykgeworICAgICAgaWYgKChyZWFkc2V0ICYmIEZEX0lTU0VUKGksIHJlYWRzZXQpKSB8fAorICAgICAgICAgICh3cml0ZXNldCAmJiBGRF9JU1NFVChpLCB3cml0ZXNldCkpIHx8CisgICAgICAgICAgKGV4Y2VwdHNldCAmJiBGRF9JU1NFVChpLCBleGNlcHRzZXQpKSkgeworICAgICAgICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrID0gdHJ5Z2V0X3NvY2tldChpKTsKKyAgICAgICAgTFdJUF9BU1NFUlQoInNvY2sgIT0gTlVMTCIsIHNvY2sgIT0gTlVMTCk7CisgICAgICAgIFNZU19BUkNIX1BST1RFQ1QobGV2KTsKKyAgICAgICAgc29jay0+c2VsZWN0X3dhaXRpbmcrKzsKKyAgICAgICAgTFdJUF9BU1NFUlQoInNvY2stPnNlbGVjdF93YWl0aW5nID4gMCIsIHNvY2stPnNlbGVjdF93YWl0aW5nID4gMCk7CisgICAgICAgIFNZU19BUkNIX1VOUFJPVEVDVChsZXYpOworICAgICAgfQorICAgIH0KKworICAgIC8qIENhbGwgbHdpcF9zZWxzY2FuIGFnYWluOiB0aGVyZSBjb3VsZCBoYXZlIGJlZW4gZXZlbnRzIGJldHdlZW4KKyAgICAgICB0aGUgbGFzdCBzY2FuICh3aGl0aG91dCB1cyBvbiB0aGUgbGlzdCkgYW5kIHB1dHRpbmcgdXMgb24gdGhlIGxpc3QhICovCisgICAgbnJlYWR5ID0gbHdpcF9zZWxzY2FuKG1heGZkcDEsIHJlYWRzZXQsIHdyaXRlc2V0LCBleGNlcHRzZXQsICZscmVhZHNldCwgJmx3cml0ZXNldCwgJmxleGNlcHRzZXQpOworICAgIGlmICghbnJlYWR5KSB7CisgICAgICAvKiBTdGlsbCBub25lIHJlYWR5LCBqdXN0IHdhaXQgdG8gYmUgd29rZW4gKi8KKyAgICAgIGlmICh0aW1lb3V0ID09IDApIHsKKyAgICAgICAgLyogV2FpdCBmb3JldmVyICovCisgICAgICAgIG1zZWN0aW1lb3V0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1zZWN0aW1lb3V0ID0gICgodGltZW91dC0+dHZfc2VjICogMTAwMCkgKyAoKHRpbWVvdXQtPnR2X3VzZWMgKyA1MDApLzEwMDApKTsKKyAgICAgICAgaWYgKG1zZWN0aW1lb3V0ID09IDApIHsKKyAgICAgICAgICAvKiBXYWl0IDFtcyBhdCBsZWFzdCAoMCBtZWFucyB3YWl0IGZvcmV2ZXIpICovCisgICAgICAgICAgbXNlY3RpbWVvdXQgPSAxOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHdhaXRyZXMgPSBzeXNfYXJjaF9zZW1fd2FpdCgmc2VsZWN0X2NiLnNlbSwgbXNlY3RpbWVvdXQpOworICAgIH0KKyAgICAvKiBJbmNyZWFzZSBzZWxlY3Rfd2FpdGluZyBmb3IgZWFjaCBzb2NrZXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBtYXhmZHAxOyBpKyspIHsKKyAgICAgIGlmICgocmVhZHNldCAmJiBGRF9JU1NFVChpLCByZWFkc2V0KSkgfHwKKyAgICAgICAgICAod3JpdGVzZXQgJiYgRkRfSVNTRVQoaSwgd3JpdGVzZXQpKSB8fAorICAgICAgICAgIChleGNlcHRzZXQgJiYgRkRfSVNTRVQoaSwgZXhjZXB0c2V0KSkpIHsKKyAgICAgICAgc3RydWN0IGx3aXBfc29jayAqc29jayA9IHRyeWdldF9zb2NrZXQoaSk7CisgICAgICAgIExXSVBfQVNTRVJUKCJzb2NrICE9IE5VTEwiLCBzb2NrICE9IE5VTEwpOworICAgICAgICBTWVNfQVJDSF9QUk9URUNUKGxldik7CisgICAgICAgIHNvY2stPnNlbGVjdF93YWl0aW5nLS07CisgICAgICAgIExXSVBfQVNTRVJUKCJzb2NrLT5zZWxlY3Rfd2FpdGluZyA+PSAwIiwgc29jay0+c2VsZWN0X3dhaXRpbmcgPj0gMCk7CisgICAgICAgIFNZU19BUkNIX1VOUFJPVEVDVChsZXYpOworICAgICAgfQorICAgIH0KKyAgICAvKiBUYWtlIHVzIG9mZiB0aGUgbGlzdCAqLworICAgIFNZU19BUkNIX1BST1RFQ1QobGV2KTsKKyAgICBpZiAoc2VsZWN0X2NiLm5leHQgIT0gTlVMTCkgeworICAgICAgc2VsZWN0X2NiLm5leHQtPnByZXYgPSBzZWxlY3RfY2IucHJldjsKKyAgICB9CisgICAgaWYgKHNlbGVjdF9jYl9saXN0ID09ICZzZWxlY3RfY2IpIHsKKyAgICAgIExXSVBfQVNTRVJUKCJzZWxlY3RfY2IucHJldiA9PSBOVUxMIiwgc2VsZWN0X2NiLnByZXYgPT0gTlVMTCk7CisgICAgICBzZWxlY3RfY2JfbGlzdCA9IHNlbGVjdF9jYi5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICBMV0lQX0FTU0VSVCgic2VsZWN0X2NiLnByZXYgIT0gTlVMTCIsIHNlbGVjdF9jYi5wcmV2ICE9IE5VTEwpOworICAgICAgc2VsZWN0X2NiLnByZXYtPm5leHQgPSBzZWxlY3RfY2IubmV4dDsKKyAgICB9CisgICAgLyogSW5jcmVhc2luZyB0aGlzIGNvdW50ZXIgdGVsbHMgZXZlbl9jYWxsYmFjayB0aGF0IHRoZSBsaXN0IGhhcyBjaGFuZ2VkLiAqLworICAgIHNlbGVjdF9jYl9jdHIrKzsKKyAgICBTWVNfQVJDSF9VTlBST1RFQ1QobGV2KTsKKworICAgIHN5c19zZW1fZnJlZSgmc2VsZWN0X2NiLnNlbSk7CisgICAgaWYgKHdhaXRyZXMgPT0gU1lTX0FSQ0hfVElNRU9VVCkgIHsKKyAgICAgIC8qIFRpbWVvdXQgKi8KKyAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9zZWxlY3Q6IHRpbWVvdXQgZXhwaXJlZFxuIikpOworICAgICAgLyogVGhpcyBpcyBPSyBhcyB0aGUgbG9jYWwgZmRzZXRzIGFyZSBlbXB0eSBhbmQgbnJlYWR5IGlzIHplcm8sCisgICAgICAgICBvciB3ZSB3b3VsZCBoYXZlIHJldHVybmVkIGVhcmxpZXIuICovCisgICAgICBnb3RvIHJldHVybl9jb3B5X2Zkc2V0czsKKyAgICB9CisKKyAgICAvKiBTZWUgd2hhdCdzIHNldCAqLworICAgIG5yZWFkeSA9IGx3aXBfc2Vsc2NhbihtYXhmZHAxLCByZWFkc2V0LCB3cml0ZXNldCwgZXhjZXB0c2V0LCAmbHJlYWRzZXQsICZsd3JpdGVzZXQsICZsZXhjZXB0c2V0KTsKKyAgfQorCisgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9zZWxlY3Q6IG5yZWFkeT0lZFxuIiwgbnJlYWR5KSk7CityZXR1cm5fY29weV9mZHNldHM6CisgIHNldF9lcnJubygwKTsKKyAgaWYgKHJlYWRzZXQpIHsKKyAgICAqcmVhZHNldCA9IGxyZWFkc2V0OworICB9CisgIGlmICh3cml0ZXNldCkgeworICAgICp3cml0ZXNldCA9IGx3cml0ZXNldDsKKyAgfQorICBpZiAoZXhjZXB0c2V0KSB7CisgICAgKmV4Y2VwdHNldCA9IGxleGNlcHRzZXQ7CisgIH0KKworCisgIHJldHVybiBucmVhZHk7Cit9CisKKy8qKgorICogQ2FsbGJhY2sgcmVnaXN0ZXJlZCBpbiB0aGUgbmV0Y29ubiBsYXllciBmb3IgZWFjaCBzb2NrZXQtbmV0Y29ubi4KKyAqIFByb2Nlc3NlcyByZWN2ZXZlbnQgKGRhdGEgYXZhaWxhYmxlKSBhbmQgd2FrZXMgdXAgdGFza3Mgd2FpdGluZyBmb3Igc2VsZWN0LgorICovCitzdGF0aWMgdm9pZAorZXZlbnRfY2FsbGJhY2soc3RydWN0IG5ldGNvbm4gKmNvbm4sIGVudW0gbmV0Y29ubl9ldnQgZXZ0LCB1MTZfdCBsZW4pCit7CisgIGludCBzOworICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrOworICBzdHJ1Y3QgbHdpcF9zZWxlY3RfY2IgKnNjYjsKKyAgaW50IGxhc3Rfc2VsZWN0X2NiX2N0cjsKKyAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldik7CisKKyAgTFdJUF9VTlVTRURfQVJHKGxlbik7CisKKyAgLyogR2V0IHNvY2tldCAqLworICBpZiAoY29ubikgeworICAgIHMgPSBjb25uLT5zb2NrZXQ7CisgICAgaWYgKHMgPCAwKSB7CisgICAgICAvKiBEYXRhIGNvbWVzIGluIHJpZ2h0IGF3YXkgYWZ0ZXIgYW4gYWNjZXB0LCBldmVuIHRob3VnaAorICAgICAgICogdGhlIHNlcnZlciB0YXNrIG1pZ2h0IG5vdCBoYXZlIGNyZWF0ZWQgYSBuZXcgc29ja2V0IHlldC4KKyAgICAgICAqIEp1c3QgY291bnQgZG93biAob3IgdXApIGlmIHRoYXQncyB0aGUgY2FzZSBhbmQgd2UKKyAgICAgICAqIHdpbGwgdXNlIHRoZSBkYXRhIGxhdGVyLiBOb3RlIHRoYXQgb25seSByZWNlaXZlIGV2ZW50cworICAgICAgICogY2FuIGhhcHBlbiBiZWZvcmUgdGhlIG5ldyBzb2NrZXQgaXMgc2V0IHVwLiAqLworICAgICAgU1lTX0FSQ0hfUFJPVEVDVChsZXYpOworICAgICAgaWYgKGNvbm4tPnNvY2tldCA8IDApIHsKKyAgICAgICAgaWYgKGV2dCA9PSBORVRDT05OX0VWVF9SQ1ZQTFVTKSB7CisgICAgICAgICAgY29ubi0+c29ja2V0LS07CisgICAgICAgIH0KKyAgICAgICAgU1lTX0FSQ0hfVU5QUk9URUNUKGxldik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHMgPSBjb25uLT5zb2NrZXQ7CisgICAgICBTWVNfQVJDSF9VTlBST1RFQ1QobGV2KTsKKyAgICB9CisKKyAgICBzb2NrID0gZ2V0X3NvY2tldChzKTsKKyAgICBpZiAoIXNvY2spIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9CisKKyAgU1lTX0FSQ0hfUFJPVEVDVChsZXYpOworICAvKiBTZXQgZXZlbnQgYXMgcmVxdWlyZWQgKi8KKyAgc3dpdGNoIChldnQpIHsKKyAgICBjYXNlIE5FVENPTk5fRVZUX1JDVlBMVVM6CisgICAgICBzb2NrLT5yY3ZldmVudCsrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBORVRDT05OX0VWVF9SQ1ZNSU5VUzoKKyAgICAgIHNvY2stPnJjdmV2ZW50LS07CisgICAgICBicmVhazsKKyAgICBjYXNlIE5FVENPTk5fRVZUX1NFTkRQTFVTOgorICAgICAgc29jay0+c2VuZGV2ZW50ID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTkVUQ09OTl9FVlRfU0VORE1JTlVTOgorICAgICAgc29jay0+c2VuZGV2ZW50ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTkVUQ09OTl9FVlRfRVJST1I6CisgICAgICBzb2NrLT5lcnJldmVudCA9IDE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTFdJUF9BU1NFUlQoInVua25vd24gZXZlbnQiLCAwKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHNvY2stPnNlbGVjdF93YWl0aW5nID09IDApIHsKKyAgICAvKiBub29uZSBpcyB3YWl0aW5nIGZvciB0aGlzIHNvY2tldCwgbm8gbmVlZCB0byBjaGVjayBzZWxlY3RfY2JfbGlzdCAqLworICAgIFNZU19BUkNIX1VOUFJPVEVDVChsZXYpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIE5vdyBkZWNpZGUgaWYgYW55b25lIGlzIHdhaXRpbmcgZm9yIHRoaXMgc29ja2V0ICovCisgIC8qIE5PVEU6IFRoaXMgY29kZSBnb2VzIHRocm91Z2ggdGhlIHNlbGVjdF9jYl9saXN0IGxpc3QgbXVsdGlwbGUgdGltZXMKKyAgICAgT05MWSBJRiBhIHNlbGVjdCB3YXMgYWN0dWFsbHkgd2FpdGluZy4gV2UgZ28gdGhyb3VnaCB0aGUgbGlzdCB0aGUgbnVtYmVyCisgICAgIG9mIHdhaXRpbmcgc2VsZWN0IGNhbGxzICsgMS4gVGhpcyBsaXN0IGlzIGV4cGVjdGVkIHRvIGJlIHNtYWxsLiAqLworCisgIC8qIEF0IHRoaXMgcG9pbnQsIFNZU19BUkNIIGlzIHN0aWxsIHByb3RlY3RlZCEgKi8KK2FnYWluOgorICBmb3IgKHNjYiA9IHNlbGVjdF9jYl9saXN0OyBzY2IgIT0gTlVMTDsgc2NiID0gc2NiLT5uZXh0KSB7CisgICAgaWYgKHNjYi0+c2VtX3NpZ25hbGxlZCA9PSAwKSB7CisgICAgICAvKiBzZW1hcGhvcmUgbm90IHNpZ25hbGxlZCB5ZXQgKi8KKyAgICAgIGludCBkb19zaWduYWwgPSAwOworICAgICAgLyogVGVzdCB0aGlzIHNlbGVjdCBjYWxsIGZvciBvdXIgc29ja2V0ICovCisgICAgICBpZiAoc29jay0+cmN2ZXZlbnQgPiAwKSB7CisgICAgICAgIGlmIChzY2ItPnJlYWRzZXQgJiYgRkRfSVNTRVQocywgc2NiLT5yZWFkc2V0KSkgeworICAgICAgICAgIGRvX3NpZ25hbCA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzb2NrLT5zZW5kZXZlbnQgIT0gMCkgeworICAgICAgICBpZiAoIWRvX3NpZ25hbCAmJiBzY2ItPndyaXRlc2V0ICYmIEZEX0lTU0VUKHMsIHNjYi0+d3JpdGVzZXQpKSB7CisgICAgICAgICAgZG9fc2lnbmFsID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHNvY2stPmVycmV2ZW50ICE9IDApIHsKKyAgICAgICAgaWYgKCFkb19zaWduYWwgJiYgc2NiLT5leGNlcHRzZXQgJiYgRkRfSVNTRVQocywgc2NiLT5leGNlcHRzZXQpKSB7CisgICAgICAgICAgZG9fc2lnbmFsID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGRvX3NpZ25hbCkgeworICAgICAgICBzY2ItPnNlbV9zaWduYWxsZWQgPSAxOworICAgICAgICAvKiBEb24ndCBjYWxsIFNZU19BUkNIX1VOUFJPVEVDVCgpIGJlZm9yZSBzaWduYWxpbmcgdGhlIHNlbWFwaG9yZSwgYXMgdGhpcyBtaWdodAorICAgICAgICAgICBsZWFkIHRvIHRoZSBzZWxlY3QgdGhyZWFkIHRha2luZyBpdHNlbGYgb2ZmIHRoZSBsaXN0LCBpbnZhbGlkYWdpbiB0aGUgc2VtYXBob3JlLiAqLworICAgICAgICBzeXNfc2VtX3NpZ25hbCgmc2NiLT5zZW0pOworICAgICAgfQorICAgIH0KKyAgICAvKiB1bmxvY2sgaW50ZXJydXB0cyB3aXRoIGVhY2ggc3RlcCAqLworICAgIGxhc3Rfc2VsZWN0X2NiX2N0ciA9IHNlbGVjdF9jYl9jdHI7CisgICAgU1lTX0FSQ0hfVU5QUk9URUNUKGxldik7CisgICAgLyogdGhpcyBtYWtlcyBzdXJlIGludGVycnVwdCBwcm90ZWN0aW9uIHRpbWUgaXMgc2hvcnQgKi8KKyAgICBTWVNfQVJDSF9QUk9URUNUKGxldik7CisgICAgaWYgKGxhc3Rfc2VsZWN0X2NiX2N0ciAhPSBzZWxlY3RfY2JfY3RyKSB7CisgICAgICAvKiBzb21lb25lIGhhcyBjaGFuZ2VkIHNlbGVjdF9jYl9saXN0LCByZXN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgKi8KKyAgICAgIGdvdG8gYWdhaW47CisgICAgfQorICB9CisgIFNZU19BUkNIX1VOUFJPVEVDVChsZXYpOworfQorCisvKioKKyAqIFVuaW1wbGVtZW50ZWQ6IENsb3NlIG9uZSBlbmQgb2YgYSBmdWxsLWR1cGxleCBjb25uZWN0aW9uLgorICogQ3VycmVudGx5LCB0aGUgZnVsbCBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAqLworaW50Citsd2lwX3NodXRkb3duKGludCBzLCBpbnQgaG93KQoreworICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrOworICBlcnJfdCBlcnI7CisgIHU4X3Qgc2h1dF9yeCA9IDAsIHNodXRfdHggPSAwOworCisgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9zaHV0ZG93biglZCwgaG93PSVkKVxuIiwgcywgaG93KSk7CisKKyAgc29jayA9IGdldF9zb2NrZXQocyk7CisgIGlmICghc29jaykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChzb2NrLT5jb25uICE9IE5VTEwpIHsKKyAgICBpZiAobmV0Y29ubl90eXBlKHNvY2stPmNvbm4pICE9IE5FVENPTk5fVENQKSB7CisgICAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBFT1BOT1RTVVBQKTsKKyAgICAgIHJldHVybiBFT1BOT1RTVVBQOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBFTk9UQ09OTik7CisgICAgcmV0dXJuIEVOT1RDT05OOworICB9CisKKyAgaWYgKGhvdyA9PSBTSFVUX1JEKSB7CisgICAgc2h1dF9yeCA9IDE7CisgIH0gZWxzZSBpZiAoaG93ID09IFNIVVRfV1IpIHsKKyAgICBzaHV0X3R4ID0gMTsKKyAgfSBlbHNlIGlmKGhvdyA9PSBTSFVUX1JEV1IpIHsKKyAgICBzaHV0X3J4ID0gMTsKKyAgICBzaHV0X3R4ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBFSU5WQUwpOworICAgIHJldHVybiBFSU5WQUw7CisgIH0KKyAgZXJyID0gbmV0Y29ubl9zaHV0ZG93bihzb2NrLT5jb25uLCBzaHV0X3J4LCBzaHV0X3R4KTsKKworICBzb2NrX3NldF9lcnJubyhzb2NrLCBlcnJfdG9fZXJybm8oZXJyKSk7CisgIHJldHVybiAoZXJyID09IEVSUl9PSyA/IDAgOiAtMSk7Cit9CisKK3N0YXRpYyBpbnQKK2x3aXBfZ2V0YWRkcm5hbWUoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgc29ja2xlbl90ICpuYW1lbGVuLCB1OF90IGxvY2FsKQoreworICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworICBpcF9hZGRyX3QgbmFkZHI7CisKKyAgc29jayA9IGdldF9zb2NrZXQocyk7CisgIGlmICghc29jaykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIG1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisgIHNpbi5zaW5fbGVuID0gc2l6ZW9mKHNpbik7CisgIHNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworICAvKiBnZXQgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgKi8KKyAgbmV0Y29ubl9nZXRhZGRyKHNvY2stPmNvbm4sICZuYWRkciwgJnNpbi5zaW5fcG9ydCwgbG9jYWwpOworCisgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9nZXRhZGRybmFtZSglZCwgYWRkcj0iLCBzKSk7CisgIGlwX2FkZHJfZGVidWdfcHJpbnQoU09DS0VUU19ERUJVRywgJm5hZGRyKTsKKyAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCIgcG9ydD0lIlUxNl9GIilcbiIsIHNpbi5zaW5fcG9ydCkpOworCisgIHNpbi5zaW5fcG9ydCA9IGh0b25zKHNpbi5zaW5fcG9ydCk7CisgIGluZXRfYWRkcl9mcm9tX2lwYWRkcigmc2luLnNpbl9hZGRyLCAmbmFkZHIpOworCisgIGlmICgqbmFtZWxlbiA+IHNpemVvZihzaW4pKSB7CisgICAgKm5hbWVsZW4gPSBzaXplb2Yoc2luKTsKKyAgfQorCisgIE1FTUNQWShuYW1lLCAmc2luLCAqbmFtZWxlbik7CisgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIDApOworICByZXR1cm4gMDsKK30KKworaW50Citsd2lwX2dldHBlZXJuYW1lKGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIHNvY2tsZW5fdCAqbmFtZWxlbikKK3sKKyAgcmV0dXJuIGx3aXBfZ2V0YWRkcm5hbWUocywgbmFtZSwgbmFtZWxlbiwgMCk7Cit9CisKK2ludAorbHdpcF9nZXRzb2NrbmFtZShpbnQgcywgc3RydWN0IHNvY2thZGRyICpuYW1lLCBzb2NrbGVuX3QgKm5hbWVsZW4pCit7CisgIHJldHVybiBsd2lwX2dldGFkZHJuYW1lKHMsIG5hbWUsIG5hbWVsZW4sIDEpOworfQorCitpbnQKK2x3aXBfZ2V0c29ja29wdChpbnQgcywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgdm9pZCAqb3B0dmFsLCBzb2NrbGVuX3QgKm9wdGxlbikKK3sKKyAgZXJyX3QgZXJyID0gRVJSX09LOworICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrID0gZ2V0X3NvY2tldChzKTsKKyAgc3RydWN0IGx3aXBfc2V0Z2V0c29ja29wdF9kYXRhIGRhdGE7CisKKyAgaWYgKCFzb2NrKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKChOVUxMID09IG9wdHZhbCkgfHwgKE5VTEwgPT0gb3B0bGVuKSkgeworICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIEVGQVVMVCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogRG8gbGVuZ3RoIGFuZCB0eXBlIGNoZWNrcyBmb3IgdGhlIHZhcmlvdXMgb3B0aW9ucyBmaXJzdCwgdG8ga2VlcCBpdCByZWFkYWJsZS4gKi8KKyAgc3dpdGNoIChsZXZlbCkgeworICAgCisvKiBMZXZlbDogU09MX1NPQ0tFVCAqLworICBjYXNlIFNPTF9TT0NLRVQ6CisgICAgc3dpdGNoIChvcHRuYW1lKSB7CisgICAgICAgCisgICAgY2FzZSBTT19BQ0NFUFRDT05OOgorICAgIGNhc2UgU09fQlJPQURDQVNUOgorICAgIC8qIFVOSU1QTCBjYXNlIFNPX0RFQlVHOiAqLworICAgIC8qIFVOSU1QTCBjYXNlIFNPX0RPTlRST1VURTogKi8KKyAgICBjYXNlIFNPX0VSUk9SOgorICAgIGNhc2UgU09fS0VFUEFMSVZFOgorICAgIC8qIFVOSU1QTCBjYXNlIFNPX0NPTlRJTUVPOiAqLworICAgIC8qIFVOSU1QTCBjYXNlIFNPX1NORFRJTUVPOiAqLworI2lmIExXSVBfU09fUkNWVElNRU8KKyAgICBjYXNlIFNPX1JDVlRJTUVPOgorI2VuZGlmIC8qIExXSVBfU09fUkNWVElNRU8gKi8KKyNpZiBMV0lQX1NPX1JDVkJVRgorICAgIGNhc2UgU09fUkNWQlVGOgorI2VuZGlmIC8qIExXSVBfU09fUkNWQlVGICovCisgICAgLyogVU5JTVBMIGNhc2UgU09fT09CSU5MSU5FOiAqLworICAgIC8qIFVOSU1QTCBjYXNlIFNPX1NOREJVRjogKi8KKyAgICAvKiBVTklNUEwgY2FzZSBTT19SQ1ZMT1dBVDogKi8KKyAgICAvKiBVTklNUEwgY2FzZSBTT19TTkRMT1dBVDogKi8KKyNpZiBTT19SRVVTRQorICAgIGNhc2UgU09fUkVVU0VBRERSOgorICAgIGNhc2UgU09fUkVVU0VQT1JUOgorI2VuZGlmIC8qIFNPX1JFVVNFICovCisgICAgY2FzZSBTT19UWVBFOgorICAgIC8qIFVOSU1QTCBjYXNlIFNPX1VTRUxPT1BCQUNLOiAqLworICAgICAgaWYgKCpvcHRsZW4gPCBzaXplb2YoaW50KSkgeworICAgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU09fTk9fQ0hFQ0s6CisgICAgICBpZiAoKm9wdGxlbiA8IHNpemVvZihpbnQpKSB7CisgICAgICAgIGVyciA9IEVJTlZBTDsKKyAgICAgIH0KKyNpZiBMV0lQX1VEUAorICAgICAgaWYgKChzb2NrLT5jb25uLT50eXBlICE9IE5FVENPTk5fVURQKSB8fAorICAgICAgICAgICgodWRwX2ZsYWdzKHNvY2stPmNvbm4tPnBjYi51ZHApICYgVURQX0ZMQUdTX1VEUExJVEUpICE9IDApKSB7CisgICAgICAgIC8qIHRoaXMgZmxhZyBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgVURQLCBub3QgZm9yIFVEUCBsaXRlICovCisgICAgICAgIGVyciA9IEVBRk5PU1VQUE9SVDsKKyAgICAgIH0KKyNlbmRpZiAvKiBMV0lQX1VEUCAqLworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2dldHNvY2tvcHQoJWQsIFNPTF9TT0NLRVQsIFVOSU1QTDogb3B0bmFtZT0weCV4LCAuLilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgb3B0bmFtZSkpOworICAgICAgZXJyID0gRU5PUFJPVE9PUFQ7CisgICAgfSAgLyogc3dpdGNoIChvcHRuYW1lKSAqLworICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgCisvKiBMZXZlbDogSVBQUk9UT19JUCAqLworICBjYXNlIElQUFJPVE9fSVA6CisgICAgc3dpdGNoIChvcHRuYW1lKSB7CisgICAgLyogVU5JTVBMIGNhc2UgSVBfSERSSU5DTDogKi8KKyAgICAvKiBVTklNUEwgY2FzZSBJUF9SQ1ZEU1RBRERSOiAqLworICAgIC8qIFVOSU1QTCBjYXNlIElQX1JDVklGOiAqLworICAgIGNhc2UgSVBfVFRMOgorICAgIGNhc2UgSVBfVE9TOgorICAgICAgaWYgKCpvcHRsZW4gPCBzaXplb2YoaW50KSkgeworICAgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICB9CisgICAgICBicmVhazsKKyNpZiBMV0lQX0lHTVAKKyAgICBjYXNlIElQX01VTFRJQ0FTVF9UVEw6CisgICAgICBpZiAoKm9wdGxlbiA8IHNpemVvZih1OF90KSkgeworICAgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElQX01VTFRJQ0FTVF9JRjoKKyAgICAgIGlmICgqb3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworICAgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElQX01VTFRJQ0FTVF9MT09QOgorICAgICAgaWYgKCpvcHRsZW4gPCBzaXplb2YodThfdCkpIHsKKyAgICAgICAgZXJyID0gRUlOVkFMOworICAgICAgfQorICAgICAgaWYgKE5FVENPTk5UWVBFX0dST1VQKHNvY2stPmNvbm4tPnR5cGUpICE9IE5FVENPTk5fVURQKSB7CisgICAgICAgIGVyciA9IEVBRk5PU1VQUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfSUdNUCAqLworCisgICAgZGVmYXVsdDoKKyAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9nZXRzb2Nrb3B0KCVkLCBJUFBST1RPX0lQLCBVTklNUEw6IG9wdG5hbWU9MHgleCwgLi4pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIG9wdG5hbWUpKTsKKyAgICAgIGVyciA9IEVOT1BST1RPT1BUOworICAgIH0gIC8qIHN3aXRjaCAob3B0bmFtZSkgKi8KKyAgICBicmVhazsKKyAgICAgICAgIAorI2lmIExXSVBfVENQCisvKiBMZXZlbDogSVBQUk9UT19UQ1AgKi8KKyAgY2FzZSBJUFBST1RPX1RDUDoKKyAgICBpZiAoKm9wdGxlbiA8IHNpemVvZihpbnQpKSB7CisgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgLyogSWYgdGhpcyBpcyBubyBUQ1Agc29ja2V0LCBpZ25vcmUgYW55IG9wdGlvbnMuICovCisgICAgaWYgKHNvY2stPmNvbm4tPnR5cGUgIT0gTkVUQ09OTl9UQ1ApCisgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCAob3B0bmFtZSkgeworICAgIGNhc2UgVENQX05PREVMQVk6CisgICAgY2FzZSBUQ1BfS0VFUEFMSVZFOgorI2lmIExXSVBfVENQX0tFRVBBTElWRQorICAgIGNhc2UgVENQX0tFRVBJRExFOgorICAgIGNhc2UgVENQX0tFRVBJTlRWTDoKKyAgICBjYXNlIFRDUF9LRUVQQ05UOgorI2VuZGlmIC8qIExXSVBfVENQX0tFRVBBTElWRSAqLworICAgICAgYnJlYWs7CisgICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9nZXRzb2Nrb3B0KCVkLCBJUFBST1RPX1RDUCwgVU5JTVBMOiBvcHRuYW1lPTB4JXgsIC4uKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBvcHRuYW1lKSk7CisgICAgICBlcnIgPSBFTk9QUk9UT09QVDsKKyAgICB9ICAvKiBzd2l0Y2ggKG9wdG5hbWUpICovCisgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKyNpZiBMV0lQX1VEUCAmJiBMV0lQX1VEUExJVEUKKy8qIExldmVsOiBJUFBST1RPX1VEUExJVEUgKi8KKyAgY2FzZSBJUFBST1RPX1VEUExJVEU6CisgICAgaWYgKCpvcHRsZW4gPCBzaXplb2YoaW50KSkgeworICAgICAgZXJyID0gRUlOVkFMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIC8qIElmIHRoaXMgaXMgbm8gVURQIGxpdGUgc29ja2V0LCBpZ25vcmUgYW55IG9wdGlvbnMuICovCisgICAgaWYgKHNvY2stPmNvbm4tPnR5cGUgIT0gTkVUQ09OTl9VRFBMSVRFKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wdG5hbWUpIHsKKyAgICBjYXNlIFVEUExJVEVfU0VORF9DU0NPVjoKKyAgICBjYXNlIFVEUExJVEVfUkVDVl9DU0NPVjoKKyAgICAgIGJyZWFrOworICAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfZ2V0c29ja29wdCglZCwgSVBQUk9UT19VRFBMSVRFLCBVTklNUEw6IG9wdG5hbWU9MHgleCwgLi4pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIG9wdG5hbWUpKTsKKyAgICAgIGVyciA9IEVOT1BST1RPT1BUOworICAgIH0gIC8qIHN3aXRjaCAob3B0bmFtZSkgKi8KKyAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1VEUCAmJiBMV0lQX1VEUExJVEUqLworLyogVU5ERUZJTkVEIExFVkVMICovCisgIGRlZmF1bHQ6CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfZ2V0c29ja29wdCglZCwgbGV2ZWw9MHgleCwgVU5JTVBMOiBvcHRuYW1lPTB4JXgsIC4uKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBsZXZlbCwgb3B0bmFtZSkpOworICAgICAgZXJyID0gRU5PUFJPVE9PUFQ7CisgIH0gIC8qIHN3aXRjaCAqLworCisgICAKKyAgaWYgKGVyciAhPSBFUlJfT0spIHsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIE5vdyBkbyB0aGUgYWN0dWFsIG9wdGlvbiBwcm9jZXNzaW5nICovCisgIGRhdGEuc29jayA9IHNvY2s7CisjaWZkZWYgTFdJUF9ERUJVRworICBkYXRhLnMgPSBzOworI2VuZGlmIC8qIExXSVBfREVCVUcgKi8KKyAgZGF0YS5sZXZlbCA9IGxldmVsOworICBkYXRhLm9wdG5hbWUgPSBvcHRuYW1lOworICBkYXRhLm9wdHZhbCA9IG9wdHZhbDsKKyAgZGF0YS5vcHRsZW4gPSBvcHRsZW47CisgIGRhdGEuZXJyID0gZXJyOworICB0Y3BpcF9jYWxsYmFjayhsd2lwX2dldHNvY2tvcHRfaW50ZXJuYWwsICZkYXRhKTsKKyAgc3lzX2FyY2hfc2VtX3dhaXQoJnNvY2stPmNvbm4tPm9wX2NvbXBsZXRlZCwgMCk7CisgIC8qIG1heWJlIGx3aXBfZ2V0c29ja29wdF9pbnRlcm5hbCBoYXMgY2hhbmdlZCBlcnIgKi8KKyAgZXJyID0gZGF0YS5lcnI7CisKKyAgc29ja19zZXRfZXJybm8oc29jaywgZXJyKTsKKyAgcmV0dXJuIGVyciA/IC0xIDogMDsKK30KKworc3RhdGljIHZvaWQKK2x3aXBfZ2V0c29ja29wdF9pbnRlcm5hbCh2b2lkICphcmcpCit7CisgIHN0cnVjdCBsd2lwX3NvY2sgKnNvY2s7CisjaWZkZWYgTFdJUF9ERUJVRworICBpbnQgczsKKyNlbmRpZiAvKiBMV0lQX0RFQlVHICovCisgIGludCBsZXZlbCwgb3B0bmFtZTsKKyAgdm9pZCAqb3B0dmFsOworICBzdHJ1Y3QgbHdpcF9zZXRnZXRzb2Nrb3B0X2RhdGEgKmRhdGE7CisKKyAgTFdJUF9BU1NFUlQoImFyZyAhPSBOVUxMIiwgYXJnICE9IE5VTEwpOworCisgIGRhdGEgPSAoc3RydWN0IGx3aXBfc2V0Z2V0c29ja29wdF9kYXRhKilhcmc7CisgIHNvY2sgPSBkYXRhLT5zb2NrOworI2lmZGVmIExXSVBfREVCVUcKKyAgcyA9IGRhdGEtPnM7CisjZW5kaWYgLyogTFdJUF9ERUJVRyAqLworICBsZXZlbCA9IGRhdGEtPmxldmVsOworICBvcHRuYW1lID0gZGF0YS0+b3B0bmFtZTsKKyAgb3B0dmFsID0gZGF0YS0+b3B0dmFsOworCisgIHN3aXRjaCAobGV2ZWwpIHsKKworLyogTGV2ZWw6IFNPTF9TT0NLRVQgKi8KKyAgY2FzZSBTT0xfU09DS0VUOgorICAgIHN3aXRjaCAob3B0bmFtZSkgeworCisgICAgLyogVGhlIG9wdGlvbiBmbGFncyAqLworICAgIGNhc2UgU09fQUNDRVBUQ09OTjoKKyAgICBjYXNlIFNPX0JST0FEQ0FTVDoKKyAgICAvKiBVTklNUEwgY2FzZSBTT19ERUJVRzogKi8KKyAgICAvKiBVTklNUEwgY2FzZSBTT19ET05UUk9VVEU6ICovCisgICAgY2FzZSBTT19LRUVQQUxJVkU6CisgICAgLyogVU5JTVBMIGNhc2UgU09fT09CSU5DTFVERTogKi8KKyNpZiBTT19SRVVTRQorICAgIGNhc2UgU09fUkVVU0VBRERSOgorICAgIGNhc2UgU09fUkVVU0VQT1JUOgorI2VuZGlmIC8qIFNPX1JFVVNFICovCisgICAgLypjYXNlIFNPX1VTRUxPT1BCQUNLOiBVTklNUEwgKi8KKyAgICAgICooaW50KilvcHR2YWwgPSBzb2NrLT5jb25uLT5wY2IuaXAtPnNvX29wdGlvbnMgJiBvcHRuYW1lOworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2dldHNvY2tvcHQoJWQsIFNPTF9TT0NLRVQsIG9wdG5hbWU9MHgleCwgLi4pID0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgb3B0bmFtZSwgKCooaW50KilvcHR2YWw/Im9uIjoib2ZmIikpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTT19UWVBFOgorICAgICAgc3dpdGNoIChORVRDT05OVFlQRV9HUk9VUChzb2NrLT5jb25uLT50eXBlKSkgeworICAgICAgY2FzZSBORVRDT05OX1JBVzoKKyAgICAgICAgKihpbnQqKW9wdHZhbCA9IFNPQ0tfUkFXOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTkVUQ09OTl9UQ1A6CisgICAgICAgICooaW50KilvcHR2YWwgPSBTT0NLX1NUUkVBTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5FVENPTk5fVURQOgorICAgICAgICAqKGludCopb3B0dmFsID0gU09DS19ER1JBTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAvKiB1bnJlY29nbml6ZWQgc29ja2V0IHR5cGUgKi8KKyAgICAgICAgKihpbnQqKW9wdHZhbCA9IHNvY2stPmNvbm4tPnR5cGU7CisgICAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICgibHdpcF9nZXRzb2Nrb3B0KCVkLCBTT0xfU09DS0VULCBTT19UWVBFKTogdW5yZWNvZ25pemVkIHNvY2tldCB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBzLCAqKGludCAqKW9wdHZhbCkpOworICAgICAgfSAgLyogc3dpdGNoIChzb2NrLT5jb25uLT50eXBlKSAqLworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2dldHNvY2tvcHQoJWQsIFNPTF9TT0NLRVQsIFNPX1RZUEUpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBzLCAqKGludCAqKW9wdHZhbCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNPX0VSUk9SOgorICAgICAgLyogb25seSBvdmVyd3JpdGUgRVJSX09LIG9yIHRlbXBvYXJ5IGVycm9ycyAqLworICAgICAgaWYgKChzb2NrLT5lcnIgPT0gMCkgfHwgKHNvY2stPmVyciA9PSBFSU5QUk9HUkVTUykpIHsKKyAgICAgICAgc29ja19zZXRfZXJybm8oc29jaywgZXJyX3RvX2Vycm5vKHNvY2stPmNvbm4tPmxhc3RfZXJyKSk7CisgICAgICB9IAorICAgICAgKihpbnQgKilvcHR2YWwgPSBzb2NrLT5lcnI7CisgICAgICBzb2NrLT5lcnIgPSAwOworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2dldHNvY2tvcHQoJWQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcywgKihpbnQgKilvcHR2YWwpKTsKKyAgICAgIGJyZWFrOworCisjaWYgTFdJUF9TT19SQ1ZUSU1FTworICAgIGNhc2UgU09fUkNWVElNRU86CisgICAgICAqKGludCAqKW9wdHZhbCA9IG5ldGNvbm5fZ2V0X3JlY3Z0aW1lb3V0KHNvY2stPmNvbm4pOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9TT19SQ1ZUSU1FTyAqLworI2lmIExXSVBfU09fUkNWQlVGCisgICAgY2FzZSBTT19SQ1ZCVUY6CisgICAgICAqKGludCAqKW9wdHZhbCA9IG5ldGNvbm5fZ2V0X3JlY3ZidWZzaXplKHNvY2stPmNvbm4pOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9TT19SQ1ZCVUYgKi8KKyNpZiBMV0lQX1VEUAorICAgIGNhc2UgU09fTk9fQ0hFQ0s6CisgICAgICAqKGludCopb3B0dmFsID0gKHVkcF9mbGFncyhzb2NrLT5jb25uLT5wY2IudWRwKSAmIFVEUF9GTEFHU19OT0NIS1NVTSkgPyAxIDogMDsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVURQKi8KKyAgICBkZWZhdWx0OgorICAgICAgTFdJUF9BU1NFUlQoInVuaGFuZGxlZCBvcHRuYW1lIiwgMCk7CisgICAgICBicmVhazsKKyAgICB9ICAvKiBzd2l0Y2ggKG9wdG5hbWUpICovCisgICAgYnJlYWs7CisKKy8qIExldmVsOiBJUFBST1RPX0lQICovCisgIGNhc2UgSVBQUk9UT19JUDoKKyAgICBzd2l0Y2ggKG9wdG5hbWUpIHsKKyAgICBjYXNlIElQX1RUTDoKKyAgICAgICooaW50KilvcHR2YWwgPSBzb2NrLT5jb25uLT5wY2IuaXAtPnR0bDsKKyAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9nZXRzb2Nrb3B0KCVkLCBJUFBST1RPX0lQLCBJUF9UVEwpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBzLCAqKGludCAqKW9wdHZhbCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUF9UT1M6CisgICAgICAqKGludCopb3B0dmFsID0gc29jay0+Y29ubi0+cGNiLmlwLT50b3M7CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfZ2V0c29ja29wdCglZCwgSVBQUk9UT19JUCwgSVBfVE9TKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcywgKihpbnQgKilvcHR2YWwpKTsKKyAgICAgIGJyZWFrOworI2lmIExXSVBfSUdNUAorICAgIGNhc2UgSVBfTVVMVElDQVNUX1RUTDoKKyAgICAgICoodThfdCopb3B0dmFsID0gc29jay0+Y29ubi0+cGNiLmlwLT50dGw7CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfZ2V0c29ja29wdCglZCwgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX1RUTCkgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHMsICooaW50ICopb3B0dmFsKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElQX01VTFRJQ0FTVF9JRjoKKyAgICAgIGluZXRfYWRkcl9mcm9tX2lwYWRkcigoc3RydWN0IGluX2FkZHIqKW9wdHZhbCwgJnNvY2stPmNvbm4tPnBjYi51ZHAtPm11bHRpY2FzdF9pcCk7CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfZ2V0c29ja29wdCglZCwgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX0lGKSA9IDB4JSJYMzJfRiJcbiIsCisgICAgICAgICAgICAgICAgICBzLCAqKHUzMl90ICopb3B0dmFsKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElQX01VTFRJQ0FTVF9MT09QOgorICAgICAgaWYgKChzb2NrLT5jb25uLT5wY2IudWRwLT5mbGFncyAmIFVEUF9GTEFHU19NVUxUSUNBU1RfTE9PUCkgIT0gMCkgeworICAgICAgICAqKHU4X3QqKW9wdHZhbCA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICAqKHU4X3QqKW9wdHZhbCA9IDA7CisgICAgICB9CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfZ2V0c29ja29wdCglZCwgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX0xPT1ApID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBzLCAqKGludCAqKW9wdHZhbCkpOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9JR01QICovCisgICAgZGVmYXVsdDoKKyAgICAgIExXSVBfQVNTRVJUKCJ1bmhhbmRsZWQgb3B0bmFtZSIsIDApOworICAgICAgYnJlYWs7CisgICAgfSAgLyogc3dpdGNoIChvcHRuYW1lKSAqLworICAgIGJyZWFrOworCisjaWYgTFdJUF9UQ1AKKy8qIExldmVsOiBJUFBST1RPX1RDUCAqLworICBjYXNlIElQUFJPVE9fVENQOgorICAgIHN3aXRjaCAob3B0bmFtZSkgeworICAgIGNhc2UgVENQX05PREVMQVk6CisgICAgICAqKGludCopb3B0dmFsID0gdGNwX25hZ2xlX2Rpc2FibGVkKHNvY2stPmNvbm4tPnBjYi50Y3ApOworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2dldHNvY2tvcHQoJWQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSkgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHMsICgqKGludCopb3B0dmFsKT8ib24iOiJvZmYiKSApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ1BfS0VFUEFMSVZFOgorICAgICAgKihpbnQqKW9wdHZhbCA9IChpbnQpc29jay0+Y29ubi0+cGNiLnRjcC0+a2VlcF9pZGxlOworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2dldHNvY2tvcHQoJWQsIElQUFJPVE9fSVAsIFRDUF9LRUVQQUxJVkUpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBzLCAqKGludCAqKW9wdHZhbCkpOworICAgICAgYnJlYWs7CisKKyNpZiBMV0lQX1RDUF9LRUVQQUxJVkUKKyAgICBjYXNlIFRDUF9LRUVQSURMRToKKyAgICAgICooaW50KilvcHR2YWwgPSAoaW50KShzb2NrLT5jb25uLT5wY2IudGNwLT5rZWVwX2lkbGUvMTAwMCk7CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfZ2V0c29ja29wdCglZCwgSVBQUk9UT19JUCwgVENQX0tFRVBJRExFKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcywgKihpbnQgKilvcHR2YWwpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVENQX0tFRVBJTlRWTDoKKyAgICAgICooaW50KilvcHR2YWwgPSAoaW50KShzb2NrLT5jb25uLT5wY2IudGNwLT5rZWVwX2ludHZsLzEwMDApOworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2dldHNvY2tvcHQoJWQsIElQUFJPVE9fSVAsIFRDUF9LRUVQSU5UVkwpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBzLCAqKGludCAqKW9wdHZhbCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ1BfS0VFUENOVDoKKyAgICAgICooaW50KilvcHR2YWwgPSAoaW50KXNvY2stPmNvbm4tPnBjYi50Y3AtPmtlZXBfY250OworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2dldHNvY2tvcHQoJWQsIElQUFJPVE9fSVAsIFRDUF9LRUVQQ05UKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcywgKihpbnQgKilvcHR2YWwpKTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVENQX0tFRVBBTElWRSAqLworICAgIGRlZmF1bHQ6CisgICAgICBMV0lQX0FTU0VSVCgidW5oYW5kbGVkIG9wdG5hbWUiLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0gIC8qIHN3aXRjaCAob3B0bmFtZSkgKi8KKyAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworI2lmIExXSVBfVURQICYmIExXSVBfVURQTElURQorICAvKiBMZXZlbDogSVBQUk9UT19VRFBMSVRFICovCisgIGNhc2UgSVBQUk9UT19VRFBMSVRFOgorICAgIHN3aXRjaCAob3B0bmFtZSkgeworICAgIGNhc2UgVURQTElURV9TRU5EX0NTQ09WOgorICAgICAgKihpbnQqKW9wdHZhbCA9IHNvY2stPmNvbm4tPnBjYi51ZHAtPmNoa3N1bV9sZW5fdHg7CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfZ2V0c29ja29wdCglZCwgSVBQUk9UT19VRFBMSVRFLCBVRFBMSVRFX1NFTkRfQ1NDT1YpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBzLCAoKihpbnQqKW9wdHZhbCkpICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVEUExJVEVfUkVDVl9DU0NPVjoKKyAgICAgICooaW50KilvcHR2YWwgPSBzb2NrLT5jb25uLT5wY2IudWRwLT5jaGtzdW1fbGVuX3J4OworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2dldHNvY2tvcHQoJWQsIElQUFJPVE9fVURQTElURSwgVURQTElURV9SRUNWX0NTQ09WKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcywgKCooaW50KilvcHR2YWwpKSApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIExXSVBfQVNTRVJUKCJ1bmhhbmRsZWQgb3B0bmFtZSIsIDApOworICAgICAgYnJlYWs7CisgICAgfSAgLyogc3dpdGNoIChvcHRuYW1lKSAqLworICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVURQICovCisgIGRlZmF1bHQ6CisgICAgTFdJUF9BU1NFUlQoInVuaGFuZGxlZCBsZXZlbCIsIDApOworICAgIGJyZWFrOworICB9IC8qIHN3aXRjaCAobGV2ZWwpICovCisgIHN5c19zZW1fc2lnbmFsKCZzb2NrLT5jb25uLT5vcF9jb21wbGV0ZWQpOworfQorCitpbnQKK2x3aXBfc2V0c29ja29wdChpbnQgcywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY29uc3Qgdm9pZCAqb3B0dmFsLCBzb2NrbGVuX3Qgb3B0bGVuKQoreworICBzdHJ1Y3QgbHdpcF9zb2NrICpzb2NrID0gZ2V0X3NvY2tldChzKTsKKyAgZXJyX3QgZXJyID0gRVJSX09LOworICBzdHJ1Y3QgbHdpcF9zZXRnZXRzb2Nrb3B0X2RhdGEgZGF0YTsKKworICBpZiAoIXNvY2spIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoTlVMTCA9PSBvcHR2YWwpIHsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBFRkFVTFQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIERvIGxlbmd0aCBhbmQgdHlwZSBjaGVja3MgZm9yIHRoZSB2YXJpb3VzIG9wdGlvbnMgZmlyc3QsIHRvIGtlZXAgaXQgcmVhZGFibGUuICovCisgIHN3aXRjaCAobGV2ZWwpIHsKKworLyogTGV2ZWw6IFNPTF9TT0NLRVQgKi8KKyAgY2FzZSBTT0xfU09DS0VUOgorICAgIHN3aXRjaCAob3B0bmFtZSkgeworCisgICAgY2FzZSBTT19CUk9BRENBU1Q6CisgICAgLyogVU5JTVBMIGNhc2UgU09fREVCVUc6ICovCisgICAgLyogVU5JTVBMIGNhc2UgU09fRE9OVFJPVVRFOiAqLworICAgIGNhc2UgU09fS0VFUEFMSVZFOgorICAgIC8qIFVOSU1QTCBjYXNlIGNhc2UgU09fQ09OVElNRU86ICovCisgICAgLyogVU5JTVBMIGNhc2UgY2FzZSBTT19TTkRUSU1FTzogKi8KKyNpZiBMV0lQX1NPX1JDVlRJTUVPCisgICAgY2FzZSBTT19SQ1ZUSU1FTzoKKyNlbmRpZiAvKiBMV0lQX1NPX1JDVlRJTUVPICovCisjaWYgTFdJUF9TT19SQ1ZCVUYKKyAgICBjYXNlIFNPX1JDVkJVRjoKKyNlbmRpZiAvKiBMV0lQX1NPX1JDVkJVRiAqLworICAgIC8qIFVOSU1QTCBjYXNlIFNPX09PQklOTElORTogKi8KKyAgICAvKiBVTklNUEwgY2FzZSBTT19TTkRCVUY6ICovCisgICAgLyogVU5JTVBMIGNhc2UgU09fUkNWTE9XQVQ6ICovCisgICAgLyogVU5JTVBMIGNhc2UgU09fU05ETE9XQVQ6ICovCisjaWYgU09fUkVVU0UKKyAgICBjYXNlIFNPX1JFVVNFQUREUjoKKyAgICBjYXNlIFNPX1JFVVNFUE9SVDoKKyNlbmRpZiAvKiBTT19SRVVTRSAqLworICAgIC8qIFVOSU1QTCBjYXNlIFNPX1VTRUxPT1BCQUNLOiAqLworICAgICAgaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKSB7CisgICAgICAgIGVyciA9IEVJTlZBTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09fTk9fQ0hFQ0s6CisgICAgICBpZiAob3B0bGVuIDwgc2l6ZW9mKGludCkpIHsKKyAgICAgICAgZXJyID0gRUlOVkFMOworICAgICAgfQorI2lmIExXSVBfVURQCisgICAgICBpZiAoKHNvY2stPmNvbm4tPnR5cGUgIT0gTkVUQ09OTl9VRFApIHx8CisgICAgICAgICAgKCh1ZHBfZmxhZ3Moc29jay0+Y29ubi0+cGNiLnVkcCkgJiBVRFBfRkxBR1NfVURQTElURSkgIT0gMCkpIHsKKyAgICAgICAgLyogdGhpcyBmbGFnIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBVRFAsIG5vdCBmb3IgVURQIGxpdGUgKi8KKyAgICAgICAgZXJyID0gRUFGTk9TVVBQT1JUOworICAgICAgfQorI2VuZGlmIC8qIExXSVBfVURQICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NldHNvY2tvcHQoJWQsIFNPTF9TT0NLRVQsIFVOSU1QTDogb3B0bmFtZT0weCV4LCAuLilcbiIsCisgICAgICAgICAgICAgICAgICBzLCBvcHRuYW1lKSk7CisgICAgICBlcnIgPSBFTk9QUk9UT09QVDsKKyAgICB9ICAvKiBzd2l0Y2ggKG9wdG5hbWUpICovCisgICAgYnJlYWs7CisKKy8qIExldmVsOiBJUFBST1RPX0lQICovCisgIGNhc2UgSVBQUk9UT19JUDoKKyAgICBzd2l0Y2ggKG9wdG5hbWUpIHsKKyAgICAvKiBVTklNUEwgY2FzZSBJUF9IRFJJTkNMOiAqLworICAgIC8qIFVOSU1QTCBjYXNlIElQX1JDVkRTVEFERFI6ICovCisgICAgLyogVU5JTVBMIGNhc2UgSVBfUkNWSUY6ICovCisgICAgY2FzZSBJUF9UVEw6CisgICAgY2FzZSBJUF9UT1M6CisgICAgICBpZiAob3B0bGVuIDwgc2l6ZW9mKGludCkpIHsKKyAgICAgICAgZXJyID0gRUlOVkFMOworICAgICAgfQorICAgICAgYnJlYWs7CisjaWYgTFdJUF9JR01QCisgICAgY2FzZSBJUF9NVUxUSUNBU1RfVFRMOgorICAgICAgaWYgKG9wdGxlbiA8IHNpemVvZih1OF90KSkgeworICAgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICB9CisgICAgICBpZiAoTkVUQ09OTlRZUEVfR1JPVVAoc29jay0+Y29ubi0+dHlwZSkgIT0gTkVUQ09OTl9VRFApIHsKKyAgICAgICAgZXJyID0gRUFGTk9TVVBQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJUF9NVUxUSUNBU1RfSUY6CisgICAgICBpZiAob3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworICAgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICB9CisgICAgICBpZiAoTkVUQ09OTlRZUEVfR1JPVVAoc29jay0+Y29ubi0+dHlwZSkgIT0gTkVUQ09OTl9VRFApIHsKKyAgICAgICAgZXJyID0gRUFGTk9TVVBQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJUF9NVUxUSUNBU1RfTE9PUDoKKyAgICAgIGlmIChvcHRsZW4gPCBzaXplb2YodThfdCkpIHsKKyAgICAgICAgZXJyID0gRUlOVkFMOworICAgICAgfQorICAgICAgaWYgKE5FVENPTk5UWVBFX0dST1VQKHNvY2stPmNvbm4tPnR5cGUpICE9IE5FVENPTk5fVURQKSB7CisgICAgICAgIGVyciA9IEVBRk5PU1VQUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVBfQUREX01FTUJFUlNISVA6CisgICAgY2FzZSBJUF9EUk9QX01FTUJFUlNISVA6CisgICAgICBpZiAob3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcF9tcmVxKSkgeworICAgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICB9CisgICAgICBpZiAoTkVUQ09OTlRZUEVfR1JPVVAoc29jay0+Y29ubi0+dHlwZSkgIT0gTkVUQ09OTl9VRFApIHsKKyAgICAgICAgZXJyID0gRUFGTk9TVVBQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9JR01QICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2V0c29ja29wdCglZCwgSVBQUk9UT19JUCwgVU5JTVBMOiBvcHRuYW1lPTB4JXgsIC4uKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcywgb3B0bmFtZSkpOworICAgICAgICBlcnIgPSBFTk9QUk9UT09QVDsKKyAgICB9ICAvKiBzd2l0Y2ggKG9wdG5hbWUpICovCisgICAgYnJlYWs7CisKKyNpZiBMV0lQX1RDUAorLyogTGV2ZWw6IElQUFJPVE9fVENQICovCisgIGNhc2UgSVBQUk9UT19UQ1A6CisgICAgaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKSB7CisgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBJZiB0aGlzIGlzIG5vIFRDUCBzb2NrZXQsIGlnbm9yZSBhbnkgb3B0aW9ucy4gKi8KKyAgICBpZiAoc29jay0+Y29ubi0+dHlwZSAhPSBORVRDT05OX1RDUCkKKyAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoIChvcHRuYW1lKSB7CisgICAgY2FzZSBUQ1BfTk9ERUxBWToKKyAgICBjYXNlIFRDUF9LRUVQQUxJVkU6CisjaWYgTFdJUF9UQ1BfS0VFUEFMSVZFCisgICAgY2FzZSBUQ1BfS0VFUElETEU6CisgICAgY2FzZSBUQ1BfS0VFUElOVFZMOgorICAgIGNhc2UgVENQX0tFRVBDTlQ6CisjZW5kaWYgLyogTFdJUF9UQ1BfS0VFUEFMSVZFICovCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2V0c29ja29wdCglZCwgSVBQUk9UT19UQ1AsIFVOSU1QTDogb3B0bmFtZT0weCV4LCAuLilcbiIsCisgICAgICAgICAgICAgICAgICBzLCBvcHRuYW1lKSk7CisgICAgICBlcnIgPSBFTk9QUk9UT09QVDsKKyAgICB9ICAvKiBzd2l0Y2ggKG9wdG5hbWUpICovCisgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKyNpZiBMV0lQX1VEUCAmJiBMV0lQX1VEUExJVEUKKy8qIExldmVsOiBJUFBST1RPX1VEUExJVEUgKi8KKyAgY2FzZSBJUFBST1RPX1VEUExJVEU6CisgICAgaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKSB7CisgICAgICBlcnIgPSBFSU5WQUw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBJZiB0aGlzIGlzIG5vIFVEUCBsaXRlIHNvY2tldCwgaWdub3JlIGFueSBvcHRpb25zLiAqLworICAgIGlmIChzb2NrLT5jb25uLT50eXBlICE9IE5FVENPTk5fVURQTElURSkKKyAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoIChvcHRuYW1lKSB7CisgICAgY2FzZSBVRFBMSVRFX1NFTkRfQ1NDT1Y6CisgICAgY2FzZSBVRFBMSVRFX1JFQ1ZfQ1NDT1Y6CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2V0c29ja29wdCglZCwgSVBQUk9UT19VRFBMSVRFLCBVTklNUEw6IG9wdG5hbWU9MHgleCwgLi4pXG4iLAorICAgICAgICAgICAgICAgICAgcywgb3B0bmFtZSkpOworICAgICAgZXJyID0gRU5PUFJPVE9PUFQ7CisgICAgfSAgLyogc3dpdGNoIChvcHRuYW1lKSAqLworICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVURQICYmIExXSVBfVURQTElURSAqLworLyogVU5ERUZJTkVEIExFVkVMICovCisgIGRlZmF1bHQ6CisgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NldHNvY2tvcHQoJWQsIGxldmVsPTB4JXgsIFVOSU1QTDogb3B0bmFtZT0weCV4LCAuLilcbiIsCisgICAgICAgICAgICAgICAgcywgbGV2ZWwsIG9wdG5hbWUpKTsKKyAgICBlcnIgPSBFTk9QUk9UT09QVDsKKyAgfSAgLyogc3dpdGNoIChsZXZlbCkgKi8KKworCisgIGlmIChlcnIgIT0gRVJSX09LKSB7CisgICAgc29ja19zZXRfZXJybm8oc29jaywgZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworCisgIC8qIE5vdyBkbyB0aGUgYWN0dWFsIG9wdGlvbiBwcm9jZXNzaW5nICovCisgIGRhdGEuc29jayA9IHNvY2s7CisjaWZkZWYgTFdJUF9ERUJVRworICBkYXRhLnMgPSBzOworI2VuZGlmIC8qIExXSVBfREVCVUcgKi8KKyAgZGF0YS5sZXZlbCA9IGxldmVsOworICBkYXRhLm9wdG5hbWUgPSBvcHRuYW1lOworICBkYXRhLm9wdHZhbCA9ICh2b2lkKilvcHR2YWw7CisgIGRhdGEub3B0bGVuID0gJm9wdGxlbjsKKyAgZGF0YS5lcnIgPSBlcnI7CisgIHRjcGlwX2NhbGxiYWNrKGx3aXBfc2V0c29ja29wdF9pbnRlcm5hbCwgJmRhdGEpOworICBzeXNfYXJjaF9zZW1fd2FpdCgmc29jay0+Y29ubi0+b3BfY29tcGxldGVkLCAwKTsKKyAgLyogbWF5YmUgbHdpcF9zZXRzb2Nrb3B0X2ludGVybmFsIGhhcyBjaGFuZ2VkIGVyciAqLworICBlcnIgPSBkYXRhLmVycjsKKworICBzb2NrX3NldF9lcnJubyhzb2NrLCBlcnIpOworICByZXR1cm4gZXJyID8gLTEgOiAwOworfQorCitzdGF0aWMgdm9pZAorbHdpcF9zZXRzb2Nrb3B0X2ludGVybmFsKHZvaWQgKmFyZykKK3sKKyAgc3RydWN0IGx3aXBfc29jayAqc29jazsKKyNpZmRlZiBMV0lQX0RFQlVHCisgIGludCBzOworI2VuZGlmIC8qIExXSVBfREVCVUcgKi8KKyAgaW50IGxldmVsLCBvcHRuYW1lOworICBjb25zdCB2b2lkICpvcHR2YWw7CisgIHN0cnVjdCBsd2lwX3NldGdldHNvY2tvcHRfZGF0YSAqZGF0YTsKKworICBMV0lQX0FTU0VSVCgiYXJnICE9IE5VTEwiLCBhcmcgIT0gTlVMTCk7CisKKyAgZGF0YSA9IChzdHJ1Y3QgbHdpcF9zZXRnZXRzb2Nrb3B0X2RhdGEqKWFyZzsKKyAgc29jayA9IGRhdGEtPnNvY2s7CisjaWZkZWYgTFdJUF9ERUJVRworICBzID0gZGF0YS0+czsKKyNlbmRpZiAvKiBMV0lQX0RFQlVHICovCisgIGxldmVsID0gZGF0YS0+bGV2ZWw7CisgIG9wdG5hbWUgPSBkYXRhLT5vcHRuYW1lOworICBvcHR2YWwgPSBkYXRhLT5vcHR2YWw7CisKKyAgc3dpdGNoIChsZXZlbCkgeworCisvKiBMZXZlbDogU09MX1NPQ0tFVCAqLworICBjYXNlIFNPTF9TT0NLRVQ6CisgICAgc3dpdGNoIChvcHRuYW1lKSB7CisKKyAgICAvKiBUaGUgb3B0aW9uIGZsYWdzICovCisgICAgY2FzZSBTT19CUk9BRENBU1Q6CisgICAgLyogVU5JTVBMIGNhc2UgU09fREVCVUc6ICovCisgICAgLyogVU5JTVBMIGNhc2UgU09fRE9OVFJPVVRFOiAqLworICAgIGNhc2UgU09fS0VFUEFMSVZFOgorICAgIC8qIFVOSU1QTCBjYXNlIFNPX09PQklOQ0xVREU6ICovCisjaWYgU09fUkVVU0UKKyAgICBjYXNlIFNPX1JFVVNFQUREUjoKKyAgICBjYXNlIFNPX1JFVVNFUE9SVDoKKyNlbmRpZiAvKiBTT19SRVVTRSAqLworICAgIC8qIFVOSU1QTCBjYXNlIFNPX1VTRUxPT1BCQUNLOiAqLworICAgICAgaWYgKCooaW50KilvcHR2YWwpIHsKKyAgICAgICAgc29jay0+Y29ubi0+cGNiLmlwLT5zb19vcHRpb25zIHw9IG9wdG5hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzb2NrLT5jb25uLT5wY2IuaXAtPnNvX29wdGlvbnMgJj0gfm9wdG5hbWU7CisgICAgICB9CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2V0c29ja29wdCglZCwgU09MX1NPQ0tFVCwgb3B0bmFtZT0weCV4LCAuLikgLT4gJXNcbiIsCisgICAgICAgICAgICAgICAgICBzLCBvcHRuYW1lLCAoKihpbnQqKW9wdHZhbD8ib24iOiJvZmYiKSkpOworICAgICAgYnJlYWs7CisjaWYgTFdJUF9TT19SQ1ZUSU1FTworICAgIGNhc2UgU09fUkNWVElNRU86CisgICAgICBuZXRjb25uX3NldF9yZWN2dGltZW91dChzb2NrLT5jb25uLCAqKGludCopb3B0dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfU09fUkNWVElNRU8gKi8KKyNpZiBMV0lQX1NPX1JDVkJVRgorICAgIGNhc2UgU09fUkNWQlVGOgorICAgICAgbmV0Y29ubl9zZXRfcmVjdmJ1ZnNpemUoc29jay0+Y29ubiwgKihpbnQqKW9wdHZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1NPX1JDVkJVRiAqLworI2lmIExXSVBfVURQCisgICAgY2FzZSBTT19OT19DSEVDSzoKKyAgICAgIGlmICgqKGludCopb3B0dmFsKSB7CisgICAgICAgIHVkcF9zZXRmbGFncyhzb2NrLT5jb25uLT5wY2IudWRwLCB1ZHBfZmxhZ3Moc29jay0+Y29ubi0+cGNiLnVkcCkgfCBVRFBfRkxBR1NfTk9DSEtTVU0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdWRwX3NldGZsYWdzKHNvY2stPmNvbm4tPnBjYi51ZHAsIHVkcF9mbGFncyhzb2NrLT5jb25uLT5wY2IudWRwKSAmIH5VRFBfRkxBR1NfTk9DSEtTVU0pOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9VRFAgKi8KKyAgICBkZWZhdWx0OgorICAgICAgTFdJUF9BU1NFUlQoInVuaGFuZGxlZCBvcHRuYW1lIiwgMCk7CisgICAgICBicmVhazsKKyAgICB9ICAvKiBzd2l0Y2ggKG9wdG5hbWUpICovCisgICAgYnJlYWs7CisKKy8qIExldmVsOiBJUFBST1RPX0lQICovCisgIGNhc2UgSVBQUk9UT19JUDoKKyAgICBzd2l0Y2ggKG9wdG5hbWUpIHsKKyAgICBjYXNlIElQX1RUTDoKKyAgICAgIHNvY2stPmNvbm4tPnBjYi5pcC0+dHRsID0gKHU4X3QpKCooaW50KilvcHR2YWwpOworICAgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX3NldHNvY2tvcHQoJWQsIElQUFJPVE9fSVAsIElQX1RUTCwgLi4pIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcywgc29jay0+Y29ubi0+cGNiLmlwLT50dGwpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVBfVE9TOgorICAgICAgc29jay0+Y29ubi0+cGNiLmlwLT50b3MgPSAodThfdCkoKihpbnQqKW9wdHZhbCk7CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2V0c29ja29wdCglZCwgSVBQUk9UT19JUCwgSVBfVE9TLCAuLiktPiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHMsIHNvY2stPmNvbm4tPnBjYi5pcC0+dG9zKSk7CisgICAgICBicmVhazsKKyNpZiBMV0lQX0lHTVAKKyAgICBjYXNlIElQX01VTFRJQ0FTVF9UVEw6CisgICAgICBzb2NrLT5jb25uLT5wY2IudWRwLT50dGwgPSAodThfdCkoKih1OF90KilvcHR2YWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUF9NVUxUSUNBU1RfSUY6CisgICAgICBpbmV0X2FkZHJfdG9faXBhZGRyKCZzb2NrLT5jb25uLT5wY2IudWRwLT5tdWx0aWNhc3RfaXAsIChzdHJ1Y3QgaW5fYWRkciopb3B0dmFsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVBfTVVMVElDQVNUX0xPT1A6CisgICAgICBpZiAoKih1OF90KilvcHR2YWwpIHsKKyAgICAgICAgdWRwX3NldGZsYWdzKHNvY2stPmNvbm4tPnBjYi51ZHAsIHVkcF9mbGFncyhzb2NrLT5jb25uLT5wY2IudWRwKSB8IFVEUF9GTEFHU19NVUxUSUNBU1RfTE9PUCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB1ZHBfc2V0ZmxhZ3Moc29jay0+Y29ubi0+cGNiLnVkcCwgdWRwX2ZsYWdzKHNvY2stPmNvbm4tPnBjYi51ZHApICYgflVEUF9GTEFHU19NVUxUSUNBU1RfTE9PUCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElQX0FERF9NRU1CRVJTSElQOgorICAgIGNhc2UgSVBfRFJPUF9NRU1CRVJTSElQOgorICAgICAgeworICAgICAgICAvKiBJZiB0aGlzIGlzIGEgVENQIG9yIGEgUkFXIHNvY2tldCwgaWdub3JlIHRoZXNlIG9wdGlvbnMuICovCisgICAgICAgIHN0cnVjdCBpcF9tcmVxICppbXIgPSAoc3RydWN0IGlwX21yZXEgKilvcHR2YWw7CisgICAgICAgIGlwX2FkZHJfdCBpZl9hZGRyOworICAgICAgICBpcF9hZGRyX3QgbXVsdGlfYWRkcjsKKyAgICAgICAgaW5ldF9hZGRyX3RvX2lwYWRkcigmaWZfYWRkciwgJmltci0+aW1yX2ludGVyZmFjZSk7CisgICAgICAgIGluZXRfYWRkcl90b19pcGFkZHIoJm11bHRpX2FkZHIsICZpbXItPmltcl9tdWx0aWFkZHIpOworICAgICAgICBpZihvcHRuYW1lID09IElQX0FERF9NRU1CRVJTSElQKXsKKyAgICAgICAgICBkYXRhLT5lcnIgPSBpZ21wX2pvaW5ncm91cCgmaWZfYWRkciwgJm11bHRpX2FkZHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRhdGEtPmVyciA9IGlnbXBfbGVhdmVncm91cCgmaWZfYWRkciwgJm11bHRpX2FkZHIpOworICAgICAgICB9CisgICAgICAgIGlmKGRhdGEtPmVyciAhPSBFUlJfT0spIHsKKyAgICAgICAgICBkYXRhLT5lcnIgPSBFQUREUk5PVEFWQUlMOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKyAgICBkZWZhdWx0OgorICAgICAgTFdJUF9BU1NFUlQoInVuaGFuZGxlZCBvcHRuYW1lIiwgMCk7CisgICAgICBicmVhazsKKyAgICB9ICAvKiBzd2l0Y2ggKG9wdG5hbWUpICovCisgICAgYnJlYWs7CisKKyNpZiBMV0lQX1RDUAorLyogTGV2ZWw6IElQUFJPVE9fVENQICovCisgIGNhc2UgSVBQUk9UT19UQ1A6CisgICAgc3dpdGNoIChvcHRuYW1lKSB7CisgICAgY2FzZSBUQ1BfTk9ERUxBWToKKyAgICAgIGlmICgqKGludCopb3B0dmFsKSB7CisgICAgICAgIHRjcF9uYWdsZV9kaXNhYmxlKHNvY2stPmNvbm4tPnBjYi50Y3ApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGNwX25hZ2xlX2VuYWJsZShzb2NrLT5jb25uLT5wY2IudGNwKTsKKyAgICAgIH0KKyAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9zZXRzb2Nrb3B0KCVkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVkpIC0+ICVzXG4iLAorICAgICAgICAgICAgICAgICAgcywgKCooaW50ICopb3B0dmFsKT8ib24iOiJvZmYiKSApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ1BfS0VFUEFMSVZFOgorICAgICAgc29jay0+Y29ubi0+cGNiLnRjcC0+a2VlcF9pZGxlID0gKHUzMl90KSgqKGludCopb3B0dmFsKTsKKyAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9zZXRzb2Nrb3B0KCVkLCBJUFBST1RPX1RDUCwgVENQX0tFRVBBTElWRSkgLT4gJSJVMzJfRiJcbiIsCisgICAgICAgICAgICAgICAgICBzLCBzb2NrLT5jb25uLT5wY2IudGNwLT5rZWVwX2lkbGUpKTsKKyAgICAgIGJyZWFrOworCisjaWYgTFdJUF9UQ1BfS0VFUEFMSVZFCisgICAgY2FzZSBUQ1BfS0VFUElETEU6CisgICAgICBzb2NrLT5jb25uLT5wY2IudGNwLT5rZWVwX2lkbGUgPSAxMDAwKih1MzJfdCkoKihpbnQqKW9wdHZhbCk7CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2V0c29ja29wdCglZCwgSVBQUk9UT19UQ1AsIFRDUF9LRUVQSURMRSkgLT4gJSJVMzJfRiJcbiIsCisgICAgICAgICAgICAgICAgICBzLCBzb2NrLT5jb25uLT5wY2IudGNwLT5rZWVwX2lkbGUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVENQX0tFRVBJTlRWTDoKKyAgICAgIHNvY2stPmNvbm4tPnBjYi50Y3AtPmtlZXBfaW50dmwgPSAxMDAwKih1MzJfdCkoKihpbnQqKW9wdHZhbCk7CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2V0c29ja29wdCglZCwgSVBQUk9UT19UQ1AsIFRDUF9LRUVQSU5UVkwpIC0+ICUiVTMyX0YiXG4iLAorICAgICAgICAgICAgICAgICAgcywgc29jay0+Y29ubi0+cGNiLnRjcC0+a2VlcF9pbnR2bCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ1BfS0VFUENOVDoKKyAgICAgIHNvY2stPmNvbm4tPnBjYi50Y3AtPmtlZXBfY250ID0gKHUzMl90KSgqKGludCopb3B0dmFsKTsKKyAgICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9zZXRzb2Nrb3B0KCVkLCBJUFBST1RPX1RDUCwgVENQX0tFRVBDTlQpIC0+ICUiVTMyX0YiXG4iLAorICAgICAgICAgICAgICAgICAgcywgc29jay0+Y29ubi0+cGNiLnRjcC0+a2VlcF9jbnQpKTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVENQX0tFRVBBTElWRSAqLworICAgIGRlZmF1bHQ6CisgICAgICBMV0lQX0FTU0VSVCgidW5oYW5kbGVkIG9wdG5hbWUiLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0gIC8qIHN3aXRjaCAob3B0bmFtZSkgKi8KKyAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1RDUCovCisjaWYgTFdJUF9VRFAgJiYgTFdJUF9VRFBMSVRFCisgIC8qIExldmVsOiBJUFBST1RPX1VEUExJVEUgKi8KKyAgY2FzZSBJUFBST1RPX1VEUExJVEU6CisgICAgc3dpdGNoIChvcHRuYW1lKSB7CisgICAgY2FzZSBVRFBMSVRFX1NFTkRfQ1NDT1Y6CisgICAgICBpZiAoKCooaW50KilvcHR2YWwgIT0gMCkgJiYgKCgqKGludCopb3B0dmFsIDwgOCkpIHx8ICgqKGludCopb3B0dmFsID4gMHhmZmZmKSkgeworICAgICAgICAvKiBkb24ndCBhbGxvdyBpbGxlZ2FsIHZhbHVlcyEgKi8KKyAgICAgICAgc29jay0+Y29ubi0+cGNiLnVkcC0+Y2hrc3VtX2xlbl90eCA9IDg7CisgICAgICB9IGVsc2UgeworICAgICAgICBzb2NrLT5jb25uLT5wY2IudWRwLT5jaGtzdW1fbGVuX3R4ID0gKHUxNl90KSooaW50KilvcHR2YWw7CisgICAgICB9CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2V0c29ja29wdCglZCwgSVBQUk9UT19VRFBMSVRFLCBVRFBMSVRFX1NFTkRfQ1NDT1YpIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcywgKCooaW50KilvcHR2YWwpKSApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVRFBMSVRFX1JFQ1ZfQ1NDT1Y6CisgICAgICBpZiAoKCooaW50KilvcHR2YWwgIT0gMCkgJiYgKCgqKGludCopb3B0dmFsIDwgOCkpIHx8ICgqKGludCopb3B0dmFsID4gMHhmZmZmKSkgeworICAgICAgICAvKiBkb24ndCBhbGxvdyBpbGxlZ2FsIHZhbHVlcyEgKi8KKyAgICAgICAgc29jay0+Y29ubi0+cGNiLnVkcC0+Y2hrc3VtX2xlbl9yeCA9IDg7CisgICAgICB9IGVsc2UgeworICAgICAgICBzb2NrLT5jb25uLT5wY2IudWRwLT5jaGtzdW1fbGVuX3J4ID0gKHUxNl90KSooaW50KilvcHR2YWw7CisgICAgICB9CisgICAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfc2V0c29ja29wdCglZCwgSVBQUk9UT19VRFBMSVRFLCBVRFBMSVRFX1JFQ1ZfQ1NDT1YpIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcywgKCooaW50KilvcHR2YWwpKSApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIExXSVBfQVNTRVJUKCJ1bmhhbmRsZWQgb3B0bmFtZSIsIDApOworICAgICAgYnJlYWs7CisgICAgfSAgLyogc3dpdGNoIChvcHRuYW1lKSAqLworICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVURQICovCisgIGRlZmF1bHQ6CisgICAgTFdJUF9BU1NFUlQoInVuaGFuZGxlZCBsZXZlbCIsIDApOworICAgIGJyZWFrOworICB9ICAvKiBzd2l0Y2ggKGxldmVsKSAqLworICBzeXNfc2VtX3NpZ25hbCgmc29jay0+Y29ubi0+b3BfY29tcGxldGVkKTsKK30KKworaW50Citsd2lwX2lvY3RsKGludCBzLCBsb25nIGNtZCwgdm9pZCAqYXJncCkKK3sKKyAgc3RydWN0IGx3aXBfc29jayAqc29jayA9IGdldF9zb2NrZXQocyk7CisgIHU4X3QgdmFsOworI2lmIExXSVBfU09fUkNWQlVGCisgIHUxNl90IGJ1ZmxlbiA9IDA7CisgIHMxNl90IHJlY3ZfYXZhaWw7CisjZW5kaWYgLyogTFdJUF9TT19SQ1ZCVUYgKi8KKworICBpZiAoIXNvY2spIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBzd2l0Y2ggKGNtZCkgeworI2lmIExXSVBfU09fUkNWQlVGCisgIGNhc2UgRklPTlJFQUQ6CisgICAgaWYgKCFhcmdwKSB7CisgICAgICBzb2NrX3NldF9lcnJubyhzb2NrLCBFSU5WQUwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFNZU19BUkNIX0dFVChzb2NrLT5jb25uLT5yZWN2X2F2YWlsLCByZWN2X2F2YWlsKTsKKyAgICBpZiAocmVjdl9hdmFpbCA8IDApIHsKKyAgICAgIHJlY3ZfYXZhaWwgPSAwOworICAgIH0KKyAgICAqKCh1MTZfdCopYXJncCkgPSAodTE2X3QpcmVjdl9hdmFpbDsKKworICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGRhdGEgbGVmdCBmcm9tIHRoZSBsYXN0IHJlY3Ygb3BlcmF0aW9uLiAvbWFxIDA0MTIxNSAqLworICAgIGlmIChzb2NrLT5sYXN0ZGF0YSkgeworICAgICAgc3RydWN0IHBidWYgKnAgPSAoc3RydWN0IHBidWYgKilzb2NrLT5sYXN0ZGF0YTsKKyAgICAgIGlmIChuZXRjb25uX3R5cGUoc29jay0+Y29ubikgIT0gTkVUQ09OTl9UQ1ApIHsKKyAgICAgICAgcCA9ICgoc3RydWN0IG5ldGJ1ZiAqKXApLT5wOworICAgICAgfQorICAgICAgYnVmbGVuID0gcC0+dG90X2xlbjsKKyAgICAgIGJ1ZmxlbiAtPSBzb2NrLT5sYXN0b2Zmc2V0OworCisgICAgICAqKCh1MTZfdCopYXJncCkgKz0gYnVmbGVuOworICAgIH0KKworICAgIExXSVBfREVCVUdGKFNPQ0tFVFNfREVCVUcsICgibHdpcF9pb2N0bCglZCwgRklPTlJFQUQsICVwKSA9ICUiVTE2X0YiXG4iLCBzLCBhcmdwLCAqKCh1MTZfdCopYXJncCkpKTsKKyAgICBzb2NrX3NldF9lcnJubyhzb2NrLCAwKTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZiAvKiBMV0lQX1NPX1JDVkJVRiAqLworCisgIGNhc2UgRklPTkJJTzoKKyAgICB2YWwgPSAwOworICAgIGlmIChhcmdwICYmICoodTMyX3QqKWFyZ3ApIHsKKyAgICAgIHZhbCA9IDE7CisgICAgfQorICAgIG5ldGNvbm5fc2V0X25vbmJsb2NraW5nKHNvY2stPmNvbm4sIHZhbCk7CisgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2lvY3RsKCVkLCBGSU9OQklPLCAlZClcbiIsIHMsIHZhbCkpOworICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIDApOworICAgIHJldHVybiAwOworCisgIGRlZmF1bHQ6CisgICAgTFdJUF9ERUJVR0YoU09DS0VUU19ERUJVRywgKCJsd2lwX2lvY3RsKCVkLCBVTklNUEw6IDB4JWx4LCAlcClcbiIsIHMsIGNtZCwgYXJncCkpOworICAgIHNvY2tfc2V0X2Vycm5vKHNvY2ssIEVOT1NZUyk7IC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKyAgICByZXR1cm4gLTE7CisgIH0gLyogc3dpdGNoIChjbWQpICovCit9CisKKy8qKiBBIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgZmNudGwuCisgKiBDdXJyZW50bHkgb25seSB0aGUgY29tbWFuZHMgRl9HRVRGTCBhbmQgRl9TRVRGTCBhcmUgaW1wbGVtZW50ZWQuCisgKiBPbmx5IHRoZSBmbGFnIE9fTk9OQkxPQ0sgaXMgaW1wbGVtZW50ZWQuCisgKi8KK2ludAorbHdpcF9mY250bChpbnQgcywgaW50IGNtZCwgaW50IHZhbCkKK3sKKyAgc3RydWN0IGx3aXBfc29jayAqc29jayA9IGdldF9zb2NrZXQocyk7CisgIGludCByZXQgPSAtMTsKKworICBpZiAoIXNvY2sgfHwgIXNvY2stPmNvbm4pIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBzd2l0Y2ggKGNtZCkgeworICBjYXNlIEZfR0VURkw6CisgICAgcmV0ID0gbmV0Y29ubl9pc19ub25ibG9ja2luZyhzb2NrLT5jb25uKSA/IE9fTk9OQkxPQ0sgOiAwOworICAgIGJyZWFrOworICBjYXNlIEZfU0VURkw6CisgICAgaWYgKCh2YWwgJiB+T19OT05CTE9DSykgPT0gMCkgeworICAgICAgLyogb25seSBPX05PTkJMT0NLLCBhbGwgb3RoZXIgYml0cyBhcmUgemVybyAqLworICAgICAgbmV0Y29ubl9zZXRfbm9uYmxvY2tpbmcoc29jay0+Y29ubiwgdmFsICYgT19OT05CTE9DSyk7CisgICAgICByZXQgPSAwOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBMV0lQX0RFQlVHRihTT0NLRVRTX0RFQlVHLCAoImx3aXBfZmNudGwoJWQsIFVOSU1QTDogJWQsICVkKVxuIiwgcywgY21kLCB2YWwpKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogTFdJUF9TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvYXBpL3RjcGlwLmMgYi9jb3JlL2x3aXAvc3JjL2FwaS90Y3BpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1N2U3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2FwaS90Y3BpcC5jCkBAIC0wLDAgKzEsNDYwIEBACisvKioKKyAqIEBmaWxlCisgKiBTZXF1ZW50aWFsIEFQSSBNYWluIHRocmVhZCBtb2R1bGUKKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICoKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgIU5PX1NZUyAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvc3lzLmgiCisjaW5jbHVkZSAibHdpcC9tZW1wLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpbmNsdWRlICJsd2lwL3RjcGlwLmgiCisjaW5jbHVkZSAibHdpcC9pbml0LmgiCisjaW5jbHVkZSAibmV0aWYvZXRoYXJwLmgiCisjaW5jbHVkZSAibmV0aWYvcHBwX29lLmgiCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyB0Y3BpcF9pbml0X2RvbmVfZm4gdGNwaXBfaW5pdF9kb25lOworc3RhdGljIHZvaWQgKnRjcGlwX2luaXRfZG9uZV9hcmc7CitzdGF0aWMgc3lzX21ib3hfdCBtYm94OworCisjaWYgTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcKKy8qKiBUaGUgZ2xvYmFsIHNlbWFwaG9yZSB0byBsb2NrIHRoZSBzdGFjay4gKi8KK3N5c19tdXRleF90IGxvY2tfdGNwaXBfY29yZTsKKyNlbmRpZiAvKiBMV0lQX1RDUElQX0NPUkVfTE9DS0lORyAqLworCisKKy8qKgorICogVGhlIG1haW4gbHdJUCB0aHJlYWQuIFRoaXMgdGhyZWFkIGhhcyBleGNsdXNpdmUgYWNjZXNzIHRvIGx3SVAgY29yZSBmdW5jdGlvbnMKKyAqICh1bmxlc3MgYWNjZXNzIHRvIHRoZW0gaXMgbm90IGxvY2tlZCkuIE90aGVyIHRocmVhZHMgY29tbXVuaWNhdGUgd2l0aCB0aGlzCisgKiB0aHJlYWQgdXNpbmcgbWVzc2FnZSBib3hlcy4KKyAqCisgKiBJdCBhbHNvIHN0YXJ0cyBhbGwgdGhlIHRpbWVycyB0byBtYWtlIHN1cmUgdGhleSBhcmUgcnVubmluZyBpbiB0aGUgcmlnaHQKKyAqIHRocmVhZCBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBhcmcgdW51c2VkIGFyZ3VtZW50CisgKi8KK3N0YXRpYyB2b2lkCit0Y3BpcF90aHJlYWQodm9pZCAqYXJnKQoreworICBzdHJ1Y3QgdGNwaXBfbXNnICptc2c7CisgIExXSVBfVU5VU0VEX0FSRyhhcmcpOworCisgIGlmICh0Y3BpcF9pbml0X2RvbmUgIT0gTlVMTCkgeworICAgIHRjcGlwX2luaXRfZG9uZSh0Y3BpcF9pbml0X2RvbmVfYXJnKTsKKyAgfQorCisgIExPQ0tfVENQSVBfQ09SRSgpOworICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUFJTiBMb29wICovCisgICAgVU5MT0NLX1RDUElQX0NPUkUoKTsKKyAgICBMV0lQX1RDUElQX1RIUkVBRF9BTElWRSgpOworICAgIC8qIHdhaXQgZm9yIGEgbWVzc2FnZSwgdGltZW91dHMgYXJlIHByb2Nlc3NlZCB3aGlsZSB3YWl0aW5nICovCisgICAgc3lzX3RpbWVvdXRzX21ib3hfZmV0Y2goJm1ib3gsICh2b2lkICoqKSZtc2cpOworICAgIExPQ0tfVENQSVBfQ09SRSgpOworICAgIHN3aXRjaCAobXNnLT50eXBlKSB7CisjaWYgTFdJUF9ORVRDT05OCisgICAgY2FzZSBUQ1BJUF9NU0dfQVBJOgorICAgICAgTFdJUF9ERUJVR0YoVENQSVBfREVCVUcsICgidGNwaXBfdGhyZWFkOiBBUEkgbWVzc2FnZSAlcFxuIiwgKHZvaWQgKiltc2cpKTsKKyAgICAgIG1zZy0+bXNnLmFwaW1zZy0+ZnVuY3Rpb24oJihtc2ctPm1zZy5hcGltc2ctPm1zZykpOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9ORVRDT05OICovCisKKyNpZiAhTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkdfSU5QVVQKKyAgICBjYXNlIFRDUElQX01TR19JTlBLVDoKKyAgICAgIExXSVBfREVCVUdGKFRDUElQX0RFQlVHLCAoInRjcGlwX3RocmVhZDogUEFDS0VUICVwXG4iLCAodm9pZCAqKW1zZykpOworI2lmIExXSVBfRVRIRVJORVQKKyAgICAgIGlmIChtc2ctPm1zZy5pbnAubmV0aWYtPmZsYWdzICYgKE5FVElGX0ZMQUdfRVRIQVJQIHwgTkVUSUZfRkxBR19FVEhFUk5FVCkpIHsKKyAgICAgICAgZXRoZXJuZXRfaW5wdXQobXNnLT5tc2cuaW5wLnAsIG1zZy0+bXNnLmlucC5uZXRpZik7CisgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBMV0lQX0VUSEVSTkVUICovCisgICAgICB7CisgICAgICAgIGlwX2lucHV0KG1zZy0+bXNnLmlucC5wLCBtc2ctPm1zZy5pbnAubmV0aWYpOworICAgICAgfQorICAgICAgbWVtcF9mcmVlKE1FTVBfVENQSVBfTVNHX0lOUEtULCBtc2cpOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkdfSU5QVVQgKi8KKworI2lmIExXSVBfTkVUSUZfQVBJCisgICAgY2FzZSBUQ1BJUF9NU0dfTkVUSUZBUEk6CisgICAgICBMV0lQX0RFQlVHRihUQ1BJUF9ERUJVRywgKCJ0Y3BpcF90aHJlYWQ6IE5ldGlmIEFQSSBtZXNzYWdlICVwXG4iLCAodm9pZCAqKW1zZykpOworICAgICAgbXNnLT5tc2cubmV0aWZhcGltc2ctPmZ1bmN0aW9uKCYobXNnLT5tc2cubmV0aWZhcGltc2ctPm1zZykpOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9BUEkgKi8KKworICAgIGNhc2UgVENQSVBfTVNHX0NBTExCQUNLOgorICAgICAgTFdJUF9ERUJVR0YoVENQSVBfREVCVUcsICgidGNwaXBfdGhyZWFkOiBDQUxMQkFDSyAlcFxuIiwgKHZvaWQgKiltc2cpKTsKKyAgICAgIG1zZy0+bXNnLmNiLmZ1bmN0aW9uKG1zZy0+bXNnLmNiLmN0eCk7CisgICAgICBtZW1wX2ZyZWUoTUVNUF9UQ1BJUF9NU0dfQVBJLCBtc2cpOworICAgICAgYnJlYWs7CisKKyNpZiBMV0lQX1RDUElQX1RJTUVPVVQKKyAgICBjYXNlIFRDUElQX01TR19USU1FT1VUOgorICAgICAgTFdJUF9ERUJVR0YoVENQSVBfREVCVUcsICgidGNwaXBfdGhyZWFkOiBUSU1FT1VUICVwXG4iLCAodm9pZCAqKW1zZykpOworICAgICAgc3lzX3RpbWVvdXQobXNnLT5tc2cudG1vLm1zZWNzLCBtc2ctPm1zZy50bW8uaCwgbXNnLT5tc2cudG1vLmFyZyk7CisgICAgICBtZW1wX2ZyZWUoTUVNUF9UQ1BJUF9NU0dfQVBJLCBtc2cpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ1BJUF9NU0dfVU5USU1FT1VUOgorICAgICAgTFdJUF9ERUJVR0YoVENQSVBfREVCVUcsICgidGNwaXBfdGhyZWFkOiBVTlRJTUVPVVQgJXBcbiIsICh2b2lkICopbXNnKSk7CisgICAgICBzeXNfdW50aW1lb3V0KG1zZy0+bXNnLnRtby5oLCBtc2ctPm1zZy50bW8uYXJnKTsKKyAgICAgIG1lbXBfZnJlZShNRU1QX1RDUElQX01TR19BUEksIG1zZyk7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX1RDUElQX1RJTUVPVVQgKi8KKworICAgIGRlZmF1bHQ6CisgICAgICBMV0lQX0RFQlVHRihUQ1BJUF9ERUJVRywgKCJ0Y3BpcF90aHJlYWQ6IGludmFsaWQgbWVzc2FnZTogJWRcbiIsIG1zZy0+dHlwZSkpOworICAgICAgTFdJUF9BU1NFUlQoInRjcGlwX3RocmVhZDogaW52YWxpZCBtZXNzYWdlIiwgMCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBQYXNzIGEgcmVjZWl2ZWQgcGFja2V0IHRvIHRjcGlwX3RocmVhZCBmb3IgaW5wdXQgcHJvY2Vzc2luZworICoKKyAqIEBwYXJhbSBwIHRoZSByZWNlaXZlZCBwYWNrZXQsIHAtPnBheWxvYWQgcG9pbnRpbmcgdG8gdGhlIEV0aGVybmV0IGhlYWRlciBvcgorICogICAgICAgICAgdG8gYW4gSVAgaGVhZGVyIChpZiBpbnAgZG9lc24ndCBoYXZlIE5FVElGX0ZMQUdfRVRIQVJQIG9yCisgKiAgICAgICAgICBORVRJRl9GTEFHX0VUSEVSTkVUIGZsYWdzKQorICogQHBhcmFtIGlucCB0aGUgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQKKyAqLworZXJyX3QKK3RjcGlwX2lucHV0KHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKmlucCkKK3sKKyNpZiBMV0lQX1RDUElQX0NPUkVfTE9DS0lOR19JTlBVVAorICBlcnJfdCByZXQ7CisgIExXSVBfREVCVUdGKFRDUElQX0RFQlVHLCAoInRjcGlwX2lucHV0OiBQQUNLRVQgJXAvJXBcbiIsICh2b2lkICopcCwgKHZvaWQgKilpbnApKTsKKyAgTE9DS19UQ1BJUF9DT1JFKCk7CisjaWYgTFdJUF9FVEhFUk5FVAorICBpZiAoaW5wLT5mbGFncyAmIChORVRJRl9GTEFHX0VUSEFSUCB8IE5FVElGX0ZMQUdfRVRIRVJORVQpKSB7CisgICAgcmV0ID0gZXRoZXJuZXRfaW5wdXQocCwgaW5wKTsKKyAgfSBlbHNlCisjZW5kaWYgLyogTFdJUF9FVEhFUk5FVCAqLworICB7CisgICAgcmV0ID0gaXBfaW5wdXQocCwgaW5wKTsKKyAgfQorICBVTkxPQ0tfVENQSVBfQ09SRSgpOworICByZXR1cm4gcmV0OworI2Vsc2UgLyogTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkdfSU5QVVQgKi8KKyAgc3RydWN0IHRjcGlwX21zZyAqbXNnOworCisgIGlmIChzeXNfbWJveF92YWxpZCgmbWJveCkpIHsKKyAgICBtc2cgPSAoc3RydWN0IHRjcGlwX21zZyAqKW1lbXBfbWFsbG9jKE1FTVBfVENQSVBfTVNHX0lOUEtUKTsKKyAgICBpZiAobXNnID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBFUlJfTUVNOworICAgIH0KKworICAgIG1zZy0+dHlwZSA9IFRDUElQX01TR19JTlBLVDsKKyAgICBtc2ctPm1zZy5pbnAucCA9IHA7CisgICAgbXNnLT5tc2cuaW5wLm5ldGlmID0gaW5wOworICAgIGlmIChzeXNfbWJveF90cnlwb3N0KCZtYm94LCBtc2cpICE9IEVSUl9PSykgeworICAgICAgbWVtcF9mcmVlKE1FTVBfVENQSVBfTVNHX0lOUEtULCBtc2cpOworICAgICAgcmV0dXJuIEVSUl9NRU07CisgICAgfQorICAgIHJldHVybiBFUlJfT0s7CisgIH0KKyAgcmV0dXJuIEVSUl9WQUw7CisjZW5kaWYgLyogTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkdfSU5QVVQgKi8KK30KKworLyoqCisgKiBDYWxsIGEgc3BlY2lmaWMgZnVuY3Rpb24gaW4gdGhlIHRocmVhZCBjb250ZXh0IG9mCisgKiB0Y3BpcF90aHJlYWQgZm9yIGVhc3kgYWNjZXNzIHN5bmNocm9uaXphdGlvbi4KKyAqIEEgZnVuY3Rpb24gY2FsbGVkIGluIHRoYXQgd2F5IG1heSBhY2Nlc3MgbHdJUCBjb3JlIGNvZGUKKyAqIHdpdGhvdXQgZmVhcmluZyBjb25jdXJyZW50IGFjY2Vzcy4KKyAqCisgKiBAcGFyYW0gZiB0aGUgZnVuY3Rpb24gdG8gY2FsbAorICogQHBhcmFtIGN0eCBwYXJhbWV0ZXIgcGFzc2VkIHRvIGYKKyAqIEBwYXJhbSBibG9jayAxIHRvIGJsb2NrIHVudGlsIHRoZSByZXF1ZXN0IGlzIHBvc3RlZCwgMCB0byBub24tYmxvY2tpbmcgbW9kZQorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQsIGFub3RoZXIgZXJyX3QgaWYgbm90CisgKi8KK2Vycl90Cit0Y3BpcF9jYWxsYmFja193aXRoX2Jsb2NrKHRjcGlwX2NhbGxiYWNrX2ZuIGZ1bmN0aW9uLCB2b2lkICpjdHgsIHU4X3QgYmxvY2spCit7CisgIHN0cnVjdCB0Y3BpcF9tc2cgKm1zZzsKKworICBpZiAoc3lzX21ib3hfdmFsaWQoJm1ib3gpKSB7CisgICAgbXNnID0gKHN0cnVjdCB0Y3BpcF9tc2cgKiltZW1wX21hbGxvYyhNRU1QX1RDUElQX01TR19BUEkpOworICAgIGlmIChtc2cgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEVSUl9NRU07CisgICAgfQorCisgICAgbXNnLT50eXBlID0gVENQSVBfTVNHX0NBTExCQUNLOworICAgIG1zZy0+bXNnLmNiLmZ1bmN0aW9uID0gZnVuY3Rpb247CisgICAgbXNnLT5tc2cuY2IuY3R4ID0gY3R4OworICAgIGlmIChibG9jaykgeworICAgICAgc3lzX21ib3hfcG9zdCgmbWJveCwgbXNnKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHN5c19tYm94X3RyeXBvc3QoJm1ib3gsIG1zZykgIT0gRVJSX09LKSB7CisgICAgICAgIG1lbXBfZnJlZShNRU1QX1RDUElQX01TR19BUEksIG1zZyk7CisgICAgICAgIHJldHVybiBFUlJfTUVNOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRVJSX09LOworICB9CisgIHJldHVybiBFUlJfVkFMOworfQorCisjaWYgTFdJUF9UQ1BJUF9USU1FT1VUCisvKioKKyAqIGNhbGwgc3lzX3RpbWVvdXQgaW4gdGNwaXBfdGhyZWFkCisgKgorICogQHBhcmFtIG1zZWMgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRpbWVvdXQKKyAqIEBwYXJhbSBoIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiB0aW1lb3V0CisgKiBAcGFyYW0gYXJnIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGltZW91dCBmdW5jdGlvbiBoCisgKiBAcmV0dXJuIEVSUl9NRU0gb24gbWVtb3J5IGVycm9yLCBFUlJfT0sgb3RoZXJ3aXNlCisgKi8KK2Vycl90Cit0Y3BpcF90aW1lb3V0KHUzMl90IG1zZWNzLCBzeXNfdGltZW91dF9oYW5kbGVyIGgsIHZvaWQgKmFyZykKK3sKKyAgc3RydWN0IHRjcGlwX21zZyAqbXNnOworCisgIGlmIChzeXNfbWJveF92YWxpZCgmbWJveCkpIHsKKyAgICBtc2cgPSAoc3RydWN0IHRjcGlwX21zZyAqKW1lbXBfbWFsbG9jKE1FTVBfVENQSVBfTVNHX0FQSSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRVJSX01FTTsKKyAgICB9CisKKyAgICBtc2ctPnR5cGUgPSBUQ1BJUF9NU0dfVElNRU9VVDsKKyAgICBtc2ctPm1zZy50bW8ubXNlY3MgPSBtc2VjczsKKyAgICBtc2ctPm1zZy50bW8uaCA9IGg7CisgICAgbXNnLT5tc2cudG1vLmFyZyA9IGFyZzsKKyAgICBzeXNfbWJveF9wb3N0KCZtYm94LCBtc2cpOworICAgIHJldHVybiBFUlJfT0s7CisgIH0KKyAgcmV0dXJuIEVSUl9WQUw7Cit9CisKKy8qKgorICogY2FsbCBzeXNfdW50aW1lb3V0IGluIHRjcGlwX3RocmVhZAorICoKKyAqIEBwYXJhbSBtc2VjIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aW1lb3V0CisgKiBAcGFyYW0gaCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gdGltZW91dAorICogQHBhcmFtIGFyZyBhcmd1bWVudCB0byBwYXNzIHRvIHRpbWVvdXQgZnVuY3Rpb24gaAorICogQHJldHVybiBFUlJfTUVNIG9uIG1lbW9yeSBlcnJvciwgRVJSX09LIG90aGVyd2lzZQorICovCitlcnJfdAordGNwaXBfdW50aW1lb3V0KHN5c190aW1lb3V0X2hhbmRsZXIgaCwgdm9pZCAqYXJnKQoreworICBzdHJ1Y3QgdGNwaXBfbXNnICptc2c7CisKKyAgaWYgKHN5c19tYm94X3ZhbGlkKCZtYm94KSkgeworICAgIG1zZyA9IChzdHJ1Y3QgdGNwaXBfbXNnICopbWVtcF9tYWxsb2MoTUVNUF9UQ1BJUF9NU0dfQVBJKTsKKyAgICBpZiAobXNnID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBFUlJfTUVNOworICAgIH0KKworICAgIG1zZy0+dHlwZSA9IFRDUElQX01TR19VTlRJTUVPVVQ7CisgICAgbXNnLT5tc2cudG1vLmggPSBoOworICAgIG1zZy0+bXNnLnRtby5hcmcgPSBhcmc7CisgICAgc3lzX21ib3hfcG9zdCgmbWJveCwgbXNnKTsKKyAgICByZXR1cm4gRVJSX09LOworICB9CisgIHJldHVybiBFUlJfVkFMOworfQorI2VuZGlmIC8qIExXSVBfVENQSVBfVElNRU9VVCAqLworCisjaWYgTFdJUF9ORVRDT05OCisvKioKKyAqIENhbGwgdGhlIGxvd2VyIHBhcnQgb2YgYSBuZXRjb25uXyogZnVuY3Rpb24KKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlbiBydW5uaW5nIGluIHRoZSB0aHJlYWQgY29udGV4dAorICogb2YgdGNwaXBfdGhyZWFkIGFuZCBoYXMgZXhjbHVzaXZlIGFjY2VzcyB0byBsd0lQIGNvcmUgY29kZS4KKyAqCisgKiBAcGFyYW0gYXBpbXNnIGEgc3RydWN0IGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYW5kIGl0cyBwYXJhbWV0ZXJzCisgKiBAcmV0dXJuIEVSUl9PSyBpZiB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCwgYW5vdGhlciBlcnJfdCBpZiBub3QKKyAqLworZXJyX3QKK3RjcGlwX2FwaW1zZyhzdHJ1Y3QgYXBpX21zZyAqYXBpbXNnKQoreworICBzdHJ1Y3QgdGNwaXBfbXNnIG1zZzsKKyNpZmRlZiBMV0lQX0RFQlVHCisgIC8qIGNhdGNoIGZ1bmN0aW9ucyB0aGF0IGRvbid0IHNldCBlcnIgKi8KKyAgYXBpbXNnLT5tc2cuZXJyID0gRVJSX1ZBTDsKKyNlbmRpZgorICAKKyAgaWYgKHN5c19tYm94X3ZhbGlkKCZtYm94KSkgeworICAgIG1zZy50eXBlID0gVENQSVBfTVNHX0FQSTsKKyAgICBtc2cubXNnLmFwaW1zZyA9IGFwaW1zZzsKKyAgICBzeXNfbWJveF9wb3N0KCZtYm94LCAmbXNnKTsKKyAgICBzeXNfYXJjaF9zZW1fd2FpdCgmYXBpbXNnLT5tc2cuY29ubi0+b3BfY29tcGxldGVkLCAwKTsKKyAgICByZXR1cm4gYXBpbXNnLT5tc2cuZXJyOworICB9CisgIHJldHVybiBFUlJfVkFMOworfQorCisjaWYgTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcKKy8qKgorICogQ2FsbCB0aGUgbG93ZXIgcGFydCBvZiBhIG5ldGNvbm5fKiBmdW5jdGlvbgorICogVGhpcyBmdW5jdGlvbiBoYXMgZXhjbHVzaXZlIGFjY2VzcyB0byBsd0lQIGNvcmUgY29kZSBieSBsb2NraW5nIGl0CisgKiBiZWZvcmUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gYXBpbXNnIGEgc3RydWN0IGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYW5kIGl0cyBwYXJhbWV0ZXJzCisgKiBAcmV0dXJuIEVSUl9PSyAob25seSBmb3IgY29tcGF0aWJpbGl0eSBmbyB0Y3BpcF9hcGltc2coKSkKKyAqLworZXJyX3QKK3RjcGlwX2FwaW1zZ19sb2NrKHN0cnVjdCBhcGlfbXNnICphcGltc2cpCit7CisjaWZkZWYgTFdJUF9ERUJVRworICAvKiBjYXRjaCBmdW5jdGlvbnMgdGhhdCBkb24ndCBzZXQgZXJyICovCisgIGFwaW1zZy0+bXNnLmVyciA9IEVSUl9WQUw7CisjZW5kaWYKKworICBMT0NLX1RDUElQX0NPUkUoKTsKKyAgYXBpbXNnLT5mdW5jdGlvbigmKGFwaW1zZy0+bXNnKSk7CisgIFVOTE9DS19UQ1BJUF9DT1JFKCk7CisgIHJldHVybiBhcGltc2ctPm1zZy5lcnI7CisKK30KKyNlbmRpZiAvKiBMV0lQX1RDUElQX0NPUkVfTE9DS0lORyAqLworI2VuZGlmIC8qIExXSVBfTkVUQ09OTiAqLworCisjaWYgTFdJUF9ORVRJRl9BUEkKKyNpZiAhTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcKKy8qKgorICogTXVjaCBsaWtlIHRjcGlwX2FwaW1zZywgYnV0IGNhbGxzIHRoZSBsb3dlciBwYXJ0IG9mIGEgbmV0aWZhcGlfKgorICogZnVuY3Rpb24uCisgKgorICogQHBhcmFtIG5ldGlmYXBpbXNnIGEgc3RydWN0IGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYW5kIGl0cyBwYXJhbWV0ZXJzCisgKiBAcmV0dXJuIGVycm9yIGNvZGUgZ2l2ZW4gYmFjayBieSB0aGUgZnVuY3Rpb24gdGhhdCB3YXMgY2FsbGVkCisgKi8KK2Vycl90Cit0Y3BpcF9uZXRpZmFwaShzdHJ1Y3QgbmV0aWZhcGlfbXNnKiBuZXRpZmFwaW1zZykKK3sKKyAgc3RydWN0IHRjcGlwX21zZyBtc2c7CisgIAorICBpZiAoc3lzX21ib3hfdmFsaWQoJm1ib3gpKSB7CisgICAgZXJyX3QgZXJyID0gc3lzX3NlbV9uZXcoJm5ldGlmYXBpbXNnLT5tc2cuc2VtLCAwKTsKKyAgICBpZiAoZXJyICE9IEVSUl9PSykgeworICAgICAgbmV0aWZhcGltc2ctPm1zZy5lcnIgPSBlcnI7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAKKyAgICBtc2cudHlwZSA9IFRDUElQX01TR19ORVRJRkFQSTsKKyAgICBtc2cubXNnLm5ldGlmYXBpbXNnID0gbmV0aWZhcGltc2c7CisgICAgc3lzX21ib3hfcG9zdCgmbWJveCwgJm1zZyk7CisgICAgc3lzX3NlbV93YWl0KCZuZXRpZmFwaW1zZy0+bXNnLnNlbSk7CisgICAgc3lzX3NlbV9mcmVlKCZuZXRpZmFwaW1zZy0+bXNnLnNlbSk7CisgICAgcmV0dXJuIG5ldGlmYXBpbXNnLT5tc2cuZXJyOworICB9CisgIHJldHVybiBFUlJfVkFMOworfQorI2Vsc2UgLyogIUxXSVBfVENQSVBfQ09SRV9MT0NLSU5HICovCisvKioKKyAqIENhbGwgdGhlIGxvd2VyIHBhcnQgb2YgYSBuZXRpZmFwaV8qIGZ1bmN0aW9uCisgKiBUaGlzIGZ1bmN0aW9uIGhhcyBleGNsdXNpdmUgYWNjZXNzIHRvIGx3SVAgY29yZSBjb2RlIGJ5IGxvY2tpbmcgaXQKKyAqIGJlZm9yZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqIEBwYXJhbSBuZXRpZmFwaW1zZyBhIHN0cnVjdCBjb250YWluaW5nIHRoZSBmdW5jdGlvbiB0byBjYWxsIGFuZCBpdHMgcGFyYW1ldGVycworICogQHJldHVybiBFUlJfT0sgKG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgZm8gdGNwaXBfbmV0aWZhcGkoKSkKKyAqLworZXJyX3QKK3RjcGlwX25ldGlmYXBpX2xvY2soc3RydWN0IG5ldGlmYXBpX21zZyogbmV0aWZhcGltc2cpCit7CisgIExPQ0tfVENQSVBfQ09SRSgpOyAgCisgIG5ldGlmYXBpbXNnLT5mdW5jdGlvbigmKG5ldGlmYXBpbXNnLT5tc2cpKTsKKyAgVU5MT0NLX1RDUElQX0NPUkUoKTsKKyAgcmV0dXJuIG5ldGlmYXBpbXNnLT5tc2cuZXJyOworfQorI2VuZGlmIC8qICFMV0lQX1RDUElQX0NPUkVfTE9DS0lORyAqLworI2VuZGlmIC8qIExXSVBfTkVUSUZfQVBJICovCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGlzIG1vZHVsZToKKyAqIC0gaW5pdGlhbGl6ZSBhbGwgc3ViIG1vZHVsZXMKKyAqIC0gc3RhcnQgdGhlIHRjcGlwX3RocmVhZAorICoKKyAqIEBwYXJhbSBpbml0ZnVuYyBhIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0Y3BpcF90aHJlYWQgaXMgcnVubmluZyBhbmQgZmluaXNoZWQgaW5pdGlhbGl6aW5nCisgKiBAcGFyYW0gYXJnIGFyZ3VtZW50IHRvIHBhc3MgdG8gaW5pdGZ1bmMKKyAqLwordm9pZAordGNwaXBfaW5pdCh0Y3BpcF9pbml0X2RvbmVfZm4gaW5pdGZ1bmMsIHZvaWQgKmFyZykKK3sKKyAgbHdpcF9pbml0KCk7CisKKyAgdGNwaXBfaW5pdF9kb25lID0gaW5pdGZ1bmM7CisgIHRjcGlwX2luaXRfZG9uZV9hcmcgPSBhcmc7CisgIGlmKHN5c19tYm94X25ldygmbWJveCwgVENQSVBfTUJPWF9TSVpFKSAhPSBFUlJfT0spIHsKKyAgICBMV0lQX0FTU0VSVCgiZmFpbGVkIHRvIGNyZWF0ZSB0Y3BpcF90aHJlYWQgbWJveCIsIDApOworICB9CisjaWYgTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcKKyAgaWYoc3lzX211dGV4X25ldygmbG9ja190Y3BpcF9jb3JlKSAhPSBFUlJfT0spIHsKKyAgICBMV0lQX0FTU0VSVCgiZmFpbGVkIHRvIGNyZWF0ZSBsb2NrX3RjcGlwX2NvcmUiLCAwKTsKKyAgfQorI2VuZGlmIC8qIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HICovCisKKyAgc3lzX3RocmVhZF9uZXcoVENQSVBfVEhSRUFEX05BTUUsIHRjcGlwX3RocmVhZCwgTlVMTCwgVENQSVBfVEhSRUFEX1NUQUNLU0laRSwgVENQSVBfVEhSRUFEX1BSSU8pOworfQorCisvKioKKyAqIFNpbXBsZSBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIHdpdGggdGNwaXBfY2FsbGJhY2sgdG8gZnJlZSBhIHBidWYKKyAqIChwYnVmX2ZyZWUgaGFzIGEgd3Jvbmcgc2lnbmF0dXJlIGZvciB0Y3BpcF9jYWxsYmFjaykKKyAqCisgKiBAcGFyYW0gcCBUaGUgcGJ1ZiAoY2hhaW4pIHRvIGJlIGRlcmVmZXJlbmNlZC4KKyAqLworc3RhdGljIHZvaWQKK3BidWZfZnJlZV9pbnQodm9pZCAqcCkKK3sKKyAgc3RydWN0IHBidWYgKnEgPSAoc3RydWN0IHBidWYgKilwOworICBwYnVmX2ZyZWUocSk7Cit9CisKKy8qKgorICogQSBzaW1wbGUgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFsbG93cyB5b3UgdG8gZnJlZSBhIHBidWYgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gcCBUaGUgcGJ1ZiAoY2hhaW4pIHRvIGJlIGRlcmVmZXJlbmNlZC4KKyAqIEByZXR1cm4gRVJSX09LIGlmIGNhbGxiYWNrIGNvdWxkIGJlIGVucXVldWVkLCBhbiBlcnJfdCBpZiBub3QKKyAqLworZXJyX3QKK3BidWZfZnJlZV9jYWxsYmFjayhzdHJ1Y3QgcGJ1ZiAqcCkKK3sKKyAgcmV0dXJuIHRjcGlwX2NhbGxiYWNrX3dpdGhfYmxvY2socGJ1Zl9mcmVlX2ludCwgcCwgMCk7Cit9CisKKy8qKgorICogQSBzaW1wbGUgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFsbG93cyB5b3UgdG8gZnJlZSBoZWFwIG1lbW9yeSBmcm9tCisgKiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gbSB0aGUgaGVhcCBtZW1vcnkgdG8gZnJlZQorICogQHJldHVybiBFUlJfT0sgaWYgY2FsbGJhY2sgY291bGQgYmUgZW5xdWV1ZWQsIGFuIGVycl90IGlmIG5vdAorICovCitlcnJfdAorbWVtX2ZyZWVfY2FsbGJhY2sodm9pZCAqbSkKK3sKKyAgcmV0dXJuIHRjcGlwX2NhbGxiYWNrX3dpdGhfYmxvY2sobWVtX2ZyZWUsIG0sIDApOworfQorCisjZW5kaWYgLyogIU5PX1NZUyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9hcmNoL3N5c19hcmNoLmMgYi9jb3JlL2x3aXAvc3JjL2FyY2gvc3lzX2FyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDgxZDAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9hcmNoL3N5c19hcmNoLmMKQEAgLTAsMCArMSwxMzEgQEAKKyNpbmNsdWRlICJhcmNoL3N5c19hcmNoLmgiCisjaW5jbHVkZSAibHdpcC9zeXMuaCIKKyNpbmNsdWRlICJsd2lwL21lbS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRocmVhZC5oPgorCit2b2lkIHN5c19pbml0KHZvaWQpCit7Cit9CisKK2Vycl90IHN5c19zZW1fbmV3KHN5c19zZW1fdCAqc2VtLCB1OF90IGNvdW50KQoreworICAgIGlmICghc2VtKQorCXJldHVybiBFSU5WQUw7CisgICAgKnNlbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNlbWFwaG9yZSkpOworICAgIGlmICghKnNlbSkKKwlyZXR1cm4gRU5PTUVNOworCisgICAgc2VtX2luaXQoKnNlbSwgY291bnQpOworICAgIHJldHVybiAwOworfQorCit2b2lkIHN5c19zZW1fZnJlZShzeXNfc2VtX3QgKnNlbSkKK3sKKyAgICBpZiAoISFzZW0gJiYgISEqc2VtKSB7CisJc3lzX3NlbV9zZXRfaW52YWxpZChzZW0pOworCWZyZWUoKnNlbSk7CisJKnNlbSA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIHN5c19zZW1fc2V0X2ludmFsaWQoc3lzX3NlbV90ICpzZW0pCit7CisgICAgaWYgKCFzZW0gfHwgISpzZW0pCisJcmV0dXJuOworICAgIHNlbV9zZXRfaW52YWxpZCgqc2VtKTsKK30KKworCitpbnQgc3lzX3NlbV92YWxpZChzeXNfc2VtX3QgKnNlbSkKK3sKKyAgICBpZiAoIXNlbSB8fCAhKnNlbSkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gc2VtX2lzX3ZhbGlkKCpzZW0pOworfQorCit1MzJfdCBzeXNfYXJjaF9zZW1fd2FpdChzeXNfc2VtX3QgKnNlbSwgdTMyX3QgdGltZW91dCkKK3sKKyAgICBtc3RpbWVfdCBydjsKKworICAgIGlmICghc2VtIHx8ICEqc2VtKQorCXJldHVybiBTWVNfQVJDSF9USU1FT1VUOworICAgIHJ2ID0gc2VtX2Rvd24oKnNlbSwgdGltZW91dCk7CisgICAgaWYgKHJ2ID09IChtc3RpbWVfdCktMSkKKwlyZXR1cm4gU1lTX0FSQ0hfVElNRU9VVDsKKyAgICBlbHNlCisJcmV0dXJuIHJ2OworfQorCitlcnJfdCBzeXNfbWJveF9uZXcoc3lzX21ib3hfdCAqbWJveCwgaW50IHNpemUpCit7CisgICAgaWYgKCFtYm94KQorCXJldHVybiBFSU5WQUw7CisgICAgKm1ib3ggPSBtYWxsb2MoTUJPWF9CWVRFUyhzaXplKSk7CisgICAgaWYgKCEoKm1ib3gpKQorCXJldHVybiBFTk9NRU07CisKKyAgICBtYm94X2luaXQoKm1ib3gsIHNpemUpOworICAgIHJldHVybiAwOworfQorCit2b2lkIHN5c19tYm94X2ZyZWUoc3lzX21ib3hfdCAqbWJveCkKK3sKKyAgICBpZiAoISFtYm94ICYmICEhKm1ib3gpIHsKKwlzeXNfbWJveF9zZXRfaW52YWxpZChtYm94KTsKKwlmcmVlKCptYm94KTsKKwkqbWJveCA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIHN5c19tYm94X3Bvc3Qoc3lzX21ib3hfdCAqbWJveCwgdm9pZCAqbXNnKQoreworICAgIGlmICghIW1ib3gpCisJbWJveF9wb3N0KCptYm94LCBtc2csIDApOworfQorCitlcnJfdCBzeXNfbWJveF90cnlwb3N0KHN5c19tYm94X3QgKm1ib3gsIHZvaWQgKm1zZykKK3sKKyAgICBpZiAoIW1ib3gpCisJcmV0dXJuIEVJTlZBTDsKKyAgICByZXR1cm4gbWJveF9wb3N0KCptYm94LCBtc2csIC0xKTsKK30KKwordTMyX3Qgc3lzX2FyY2hfbWJveF9mZXRjaChzeXNfbWJveF90ICptYm94LCB2b2lkICoqbXNnLCB1MzJfdCB0aW1lb3V0KQoreworICAgIG1zdGltZV90IHJ2OworCisgICAgaWYgKCFtYm94KQorCXJldHVybiBTWVNfTUJPWF9FTVBUWTsKKyAgICBydiA9IG1ib3hfZmV0Y2goKm1ib3gsIG1zZywgdGltZW91dCk7CisgICAgaWYgKHJ2ID09IChtc3RpbWVfdCktMSkKKwlyZXR1cm4gU1lTX0FSQ0hfVElNRU9VVDsKKyAgICBlbHNlCisJcmV0dXJuIHJ2OworfQorCit1MzJfdCBzeXNfYXJjaF9tYm94X3RyeWZldGNoKHN5c19tYm94X3QgKm1ib3gsIHZvaWQgKiptc2cpCit7CisgICAgaWYgKCFtYm94KQorCXJldHVybiBTWVNfTUJPWF9FTVBUWTsKKyAgICByZXR1cm4gbWJveF9mZXRjaCgqbWJveCwgbXNnLCAtMSk7Cit9CisKK3ZvaWQgc3lzX21ib3hfc2V0X2ludmFsaWQoc3lzX21ib3hfdCAqbWJveCkKK3sKKyAgICBpZiAoISFtYm94KQorCW1ib3hfc2V0X2ludmFsaWQoKm1ib3gpOworfQorCitpbnQgc3lzX21ib3hfdmFsaWQoc3lzX21ib3hfdCAqbWJveCkKK3sKKyAgICByZXR1cm4gKCghIW1ib3gpICYmIG1ib3hfaXNfdmFsaWQoKm1ib3gpKTsKK30KKworCitzeXNfdGhyZWFkX3Qgc3lzX3RocmVhZF9uZXcoY29uc3QgY2hhciAqbmFtZSwgbHdpcF90aHJlYWRfZm4gdGhyZWFkLAorCQkJICAgIHZvaWQgKmFyZywgaW50IHN0YWNrc2l6ZSwgaW50IHByaW8pCit7CisgICAgcmV0dXJuIHN0YXJ0X3RocmVhZChuYW1lLCBzdGFja3NpemUsIHByaW8sIHRocmVhZCwgYXJnKTsKK30KKwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL2RlZi5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL2RlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MmI1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvZGVmLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qKgorICogQGZpbGUKKyAqIENvbW1vbiBmdW5jdGlvbnMgdXNlZCB0aHJvdWdob3V0IHRoZSBzdGFjay4KKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICoKKyAqIEF1dGhvcjogU2ltb24gR29sZHNjaG1pZHQKKyAqCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKworLyoqCisgKiBUaGVzZSBhcmUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYnl0ZSBzd2FwcGluZyBmdW5jdGlvbnMuCisgKiBBZ2FpbiB3aXRoIHRoZSBhaW0gb2YgYmVpbmcgc2ltcGxlLCBjb3JyZWN0IGFuZCBmdWxseSBwb3J0YWJsZS4KKyAqIEJ5dGUgc3dhcHBpbmcgaXMgdGhlIHNlY29uZCB0aGluZyB5b3Ugd291bGQgd2FudCB0byBvcHRpbWl6ZS4gWW91IHdpbGwKKyAqIG5lZWQgdG8gcG9ydCBpdCB0byB5b3VyIGFyY2hpdGVjdHVyZSBhbmQgaW4geW91ciBjYy5oOgorICogCisgKiAjZGVmaW5lIExXSVBfUExBVEZPUk1fQllURVNXQVAgMQorICogI2RlZmluZSBMV0lQX1BMQVRGT1JNX0hUT05TKHgpIDx5b3VyX2h0b25zPgorICogI2RlZmluZSBMV0lQX1BMQVRGT1JNX0hUT05MKHgpIDx5b3VyX2h0b25sPgorICoKKyAqIE5vdGUgbnRvaHMoKSBhbmQgbnRvaGwoKSBhcmUgbWVyZWx5IHJlZmVyZW5jZXMgdG8gdGhlIGh0b254IGNvdW50ZXJwYXJ0cy4KKyAqLworCisjaWYgKExXSVBfUExBVEZPUk1fQllURVNXQVAgPT0gMCkgJiYgKEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikKKworLyoqCisgKiBDb252ZXJ0IGFuIHUxNl90IGZyb20gaG9zdC0gdG8gbmV0d29yayBieXRlIG9yZGVyLgorICoKKyAqIEBwYXJhbSBuIHUxNl90IGluIGhvc3QgYnl0ZSBvcmRlcgorICogQHJldHVybiBuIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICovCit1MTZfdAorbHdpcF9odG9ucyh1MTZfdCBuKQoreworICByZXR1cm4gKChuICYgMHhmZikgPDwgOCkgfCAoKG4gJiAweGZmMDApID4+IDgpOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gdTE2X3QgZnJvbSBuZXR3b3JrLSB0byBob3N0IGJ5dGUgb3JkZXIuCisgKgorICogQHBhcmFtIG4gdTE2X3QgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiBAcmV0dXJuIG4gaW4gaG9zdCBieXRlIG9yZGVyCisgKi8KK3UxNl90Citsd2lwX250b2hzKHUxNl90IG4pCit7CisgIHJldHVybiBsd2lwX2h0b25zKG4pOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gdTMyX3QgZnJvbSBob3N0LSB0byBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKgorICogQHBhcmFtIG4gdTMyX3QgaW4gaG9zdCBieXRlIG9yZGVyCisgKiBAcmV0dXJuIG4gaW4gbmV0d29yayBieXRlIG9yZGVyCisgKi8KK3UzMl90Citsd2lwX2h0b25sKHUzMl90IG4pCit7CisgIHJldHVybiAoKG4gJiAweGZmKSA8PCAyNCkgfAorICAgICgobiAmIDB4ZmYwMCkgPDwgOCkgfAorICAgICgobiAmIDB4ZmYwMDAwVUwpID4+IDgpIHwKKyAgICAoKG4gJiAweGZmMDAwMDAwVUwpID4+IDI0KTsKK30KKworLyoqCisgKiBDb252ZXJ0IGFuIHUzMl90IGZyb20gbmV0d29yay0gdG8gaG9zdCBieXRlIG9yZGVyLgorICoKKyAqIEBwYXJhbSBuIHUzMl90IGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICogQHJldHVybiBuIGluIGhvc3QgYnl0ZSBvcmRlcgorICovCit1MzJfdAorbHdpcF9udG9obCh1MzJfdCBuKQoreworICByZXR1cm4gbHdpcF9odG9ubChuKTsKK30KKworI2VuZGlmIC8qIChMV0lQX1BMQVRGT1JNX0JZVEVTV0FQID09IDApICYmIChCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2NvcmUvZGhjcC5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL2RoY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWI0YmUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL2RoY3AuYwpAQCAtMCwwICsxLDE3NDUgQEAKKy8qKgorICogQGZpbGUKKyAqIER5bmFtaWMgSG9zdCBDb25maWd1cmF0aW9uIFByb3RvY29sIGNsaWVudAorICoKKyAqLworCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IExlb24gV29lc3RlbmJlcmcgPGxlb24ud29lc3RlbmJlcmdAZ214Lm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEF4b24gRGlnaXRhbCBEZXNpZ24gQi5WLiwgVGhlIE5ldGhlcmxhbmRzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBhIGNvbnRyaWJ1dGlvbiB0byB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiBUaGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZSBhbmQgQWRhbSBEdW5rZWxzCisgKiBhcmUgc3BlY2lmaWNhbGx5IGdyYW50ZWQgcGVybWlzc2lvbiB0byByZWRpc3RyaWJ1dGUgdGhpcworICogc291cmNlIGNvZGUuCisgKgorICogQXV0aG9yOiBMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uLndvZXN0ZW5iZXJnQGdteC5uZXQ+CisgKgorICogVGhpcyBpcyBhIERIQ1AgY2xpZW50IGZvciB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suIEl0IGFpbXMgdG8gY29uZm9ybQorICogd2l0aCBSRkMgMjEzMSBhbmQgUkZDIDIxMzIuCisgKgorICogVE9ETzoKKyAqIC0gU3VwcG9ydCBmb3IgaW50ZXJmYWNlcyBvdGhlciB0aGFuIEV0aGVybmV0IChTTElQLCBQUFAsIC4uLikKKyAqCisgKiBQbGVhc2UgY29vcmRpbmF0ZSBjaGFuZ2VzIGFuZCByZXF1ZXN0cyB3aXRoIExlb24gV29lc3RlbmJlcmcKKyAqIDxsZW9uLndvZXN0ZW5iZXJnQGdteC5uZXQ+CisgKgorICogSW50ZWdyYXRpb24gd2l0aCB5b3VyIGNvZGU6CisgKgorICogSW4gbHdpcC9kaGNwLmgKKyAqICNkZWZpbmUgREhDUF9DT0FSU0VfVElNRVJfU0VDUyAocmVjb21tZW5kZWQgNjAgd2hpY2ggaXMgYSBtaW51dGUpCisgKiAjZGVmaW5lIERIQ1BfRklORV9USU1FUl9NU0VDUyAocmVjb21tZW5kZWQgNTAwIHdoaWNoIGVxdWFscyBUQ1AgY29hcnNlIHRpbWVyKQorICoKKyAqIFRoZW4gaGF2ZSB5b3VyIGFwcGxpY2F0aW9uIGNhbGwgZGhjcF9jb2Fyc2VfdG1yKCkgYW5kCisgKiBkaGNwX2ZpbmVfdG1yKCkgb24gdGhlIGRlZmluZWQgaW50ZXJ2YWxzLgorICoKKyAqIGRoY3Bfc3RhcnQoc3RydWN0IG5ldGlmICpuZXRpZik7CisgKiBzdGFydHMgYSBESENQIGNsaWVudCBpbnN0YW5jZSB3aGljaCBjb25maWd1cmVzIHRoZSBpbnRlcmZhY2UgYnkKKyAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzIGxlYXNlIGFuZCBtYWludGFpbmluZyBpdC4KKyAqCisgKiBVc2UgZGhjcF9yZWxlYXNlKG5ldGlmKSB0byBlbmQgdGhlIGxlYXNlIGFuZCB1c2UgZGhjcF9zdG9wKG5ldGlmKQorICogdG8gcmVtb3ZlIHRoZSBESENQIGNsaWVudC4KKyAqCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX0RIQ1AgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL3N0YXRzLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL3VkcC5oIgorI2luY2x1ZGUgImx3aXAvaXBfYWRkci5oIgorI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKyNpbmNsdWRlICJsd2lwL2RlZi5oIgorI2luY2x1ZGUgImx3aXAvc3lzLmgiCisjaW5jbHVkZSAibHdpcC9kaGNwLmgiCisjaW5jbHVkZSAibHdpcC9hdXRvaXAuaCIKKyNpbmNsdWRlICJsd2lwL2Rucy5oIgorI2luY2x1ZGUgIm5ldGlmL2V0aGFycC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKiBEZWZhdWx0IGZvciBESENQX0dMT0JBTF9YSUQgaXMgMHhBQkNEMDAwMAorICogVGhpcyBjYW4gYmUgY2hhbmdlZCBieSBkZWZpbmluZyBESENQX0dMT0JBTF9YSUQgYW5kIERIQ1BfR0xPQkFMX1hJRF9IRUFERVIsIGUuZy4KKyAqICAjZGVmaW5lIERIQ1BfR0xPQkFMX1hJRF9IRUFERVIgInN0ZGxpYi5oIgorICogICNkZWZpbmUgREhDUF9HTE9CQUxfWElEIHJhbmQoKQorICovCisjaWZkZWYgREhDUF9HTE9CQUxfWElEX0hFQURFUgorI2luY2x1ZGUgREhDUF9HTE9CQUxfWElEX0hFQURFUiAvKiBpbmNsdWRlIG9wdGlvbmFsIHN0YXJ0aW5nIFhJRCBnZW5lcmF0aW9uIHByb3RvdHlwZXMgKi8KKyNlbmRpZgorCisvKiogREhDUF9PUFRJT05fTUFYX01TR19TSVpFIGlzIHNldCB0byB0aGUgTVRVCisgKiBNVFUgaXMgY2hlY2tlZCB0byBiZSBiaWcgZW5vdWdoIGluIGRoY3Bfc3RhcnQgKi8KKyNkZWZpbmUgREhDUF9NQVhfTVNHX0xFTihuZXRpZikgICAgICAgIChuZXRpZi0+bXR1KQorI2RlZmluZSBESENQX01BWF9NU0dfTEVOX01JTl9SRVFVSVJFRCAgNTc2CisvKiogTWluaW11bSBsZW5ndGggZm9yIHJlcGx5IGJlZm9yZSBwYWNrZXQgaXMgcGFyc2VkICovCisjZGVmaW5lIERIQ1BfTUlOX1JFUExZX0xFTiAgICAgICAgICAgICA0NAorCisjZGVmaW5lIFJFQk9PVF9UUklFUyAyCisKKy8qKiBPcHRpb24gaGFuZGxpbmc6IG9wdGlvbnMgYXJlIHBhcnNlZCBpbiBkaGNwX3BhcnNlX3JlcGx5CisgKiBhbmQgc2F2ZWQgaW4gYW4gYXJyYXkgd2hlcmUgb3RoZXIgZnVuY3Rpb25zIGNhbiBsb2FkIHRoZW0gZnJvbS4KKyAqIFRoaXMgbWlnaHQgYmUgbW92ZWQgaW50byB0aGUgc3RydWN0IGRoY3AgKG5vdCBuZWNlc3NhcmlseSBzaW5jZQorICogbHdJUCBpcyBzaW5nbGUtdGhyZWFkZWQgYW5kIHRoZSBhcnJheSBpcyBvbmx5IHVzZWQgd2hpbGUgaW4gcmVjdgorICogY2FsbGJhY2spLiAqLworI2RlZmluZSBESENQX09QVElPTl9JRFhfT1ZFUkxPQUQgICAgMAorI2RlZmluZSBESENQX09QVElPTl9JRFhfTVNHX1RZUEUgICAgMQorI2RlZmluZSBESENQX09QVElPTl9JRFhfU0VSVkVSX0lEICAgMgorI2RlZmluZSBESENQX09QVElPTl9JRFhfTEVBU0VfVElNRSAgMworI2RlZmluZSBESENQX09QVElPTl9JRFhfVDEgICAgICAgICAgNAorI2RlZmluZSBESENQX09QVElPTl9JRFhfVDIgICAgICAgICAgNQorI2RlZmluZSBESENQX09QVElPTl9JRFhfU1VCTkVUX01BU0sgNgorI2RlZmluZSBESENQX09QVElPTl9JRFhfUk9VVEVSICAgICAgNworI2RlZmluZSBESENQX09QVElPTl9JRFhfRE5TX1NFUlZFUgk4CisjZGVmaW5lIERIQ1BfT1BUSU9OX0lEWF9NQVggICAgICAgICAoREhDUF9PUFRJT05fSURYX0ROU19TRVJWRVIgKyBETlNfTUFYX1NFUlZFUlMpCisKKy8qKiBIb2xkcyB0aGUgZGVjb2RlZCBvcHRpb24gdmFsdWVzLCBvbmx5IHZhbGlkIHdoaWxlIGluIGRoY3BfcmVjdi4KKyAgICBAdG9kbzogbW92ZSB0aGlzIGludG8gc3RydWN0IGRoY3A/ICovCit1MzJfdCBkaGNwX3J4X29wdGlvbnNfdmFsW0RIQ1BfT1BUSU9OX0lEWF9NQVhdOworLyoqIEhvbGRzIGEgZmxhZyB3aGljaCBvcHRpb24gd2FzIHJlY2VpdmVkIGFuZCBpcyBjb250YWluZWQgaW4gZGhjcF9yeF9vcHRpb25zX3ZhbCwKKyAgICBvbmx5IHZhbGlkIHdoaWxlIGluIGRoY3BfcmVjdi4KKyAgICBAdG9kbzogbW92ZSB0aGlzIGludG8gc3RydWN0IGRoY3A/ICovCit1OF90ICBkaGNwX3J4X29wdGlvbnNfZ2l2ZW5bREhDUF9PUFRJT05fSURYX01BWF07CisKKyNkZWZpbmUgZGhjcF9vcHRpb25fZ2l2ZW4oZGhjcCwgaWR4KSAgICAgICAgICAoZGhjcF9yeF9vcHRpb25zX2dpdmVuW2lkeF0gIT0gMCkKKyNkZWZpbmUgZGhjcF9nb3Rfb3B0aW9uKGRoY3AsIGlkeCkgICAgICAgICAgICAoZGhjcF9yeF9vcHRpb25zX2dpdmVuW2lkeF0gPSAxKQorI2RlZmluZSBkaGNwX2NsZWFyX29wdGlvbihkaGNwLCBpZHgpICAgICAgICAgIChkaGNwX3J4X29wdGlvbnNfZ2l2ZW5baWR4XSA9IDApCisjZGVmaW5lIGRoY3BfY2xlYXJfYWxsX29wdGlvbnMoZGhjcCkgICAgICAgICAgKG1lbXNldChkaGNwX3J4X29wdGlvbnNfZ2l2ZW4sIDAsIHNpemVvZihkaGNwX3J4X29wdGlvbnNfZ2l2ZW4pKSkKKyNkZWZpbmUgZGhjcF9nZXRfb3B0aW9uX3ZhbHVlKGRoY3AsIGlkeCkgICAgICAoZGhjcF9yeF9vcHRpb25zX3ZhbFtpZHhdKQorI2RlZmluZSBkaGNwX3NldF9vcHRpb25fdmFsdWUoZGhjcCwgaWR4LCB2YWwpIChkaGNwX3J4X29wdGlvbnNfdmFsW2lkeF0gPSAodmFsKSkKKworCisvKiBESENQIGNsaWVudCBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9ucyAqLworc3RhdGljIGVycl90IGRoY3BfZGlzY292ZXIoc3RydWN0IG5ldGlmICpuZXRpZik7CitzdGF0aWMgZXJyX3QgZGhjcF9zZWxlY3Qoc3RydWN0IG5ldGlmICpuZXRpZik7CitzdGF0aWMgdm9pZCBkaGNwX2JpbmQoc3RydWN0IG5ldGlmICpuZXRpZik7CisjaWYgREhDUF9ET0VTX0FSUF9DSEVDSworc3RhdGljIGVycl90IGRoY3BfZGVjbGluZShzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKKyNlbmRpZiAvKiBESENQX0RPRVNfQVJQX0NIRUNLICovCitzdGF0aWMgZXJyX3QgZGhjcF9yZWJpbmQoc3RydWN0IG5ldGlmICpuZXRpZik7CitzdGF0aWMgZXJyX3QgZGhjcF9yZWJvb3Qoc3RydWN0IG5ldGlmICpuZXRpZik7CitzdGF0aWMgdm9pZCBkaGNwX3NldF9zdGF0ZShzdHJ1Y3QgZGhjcCAqZGhjcCwgdThfdCBuZXdfc3RhdGUpOworCisvKiByZWNlaXZlLCB1bmZvbGQsIHBhcnNlIGFuZCBmcmVlIGluY29taW5nIG1lc3NhZ2VzICovCitzdGF0aWMgdm9pZCBkaGNwX3JlY3Yodm9pZCAqYXJnLCBzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwgaXBfYWRkcl90ICphZGRyLCB1MTZfdCBwb3J0KTsKKworLyogc2V0IHRoZSBESENQIHRpbWVycyAqLworc3RhdGljIHZvaWQgZGhjcF90aW1lb3V0KHN0cnVjdCBuZXRpZiAqbmV0aWYpOworc3RhdGljIHZvaWQgZGhjcF90MV90aW1lb3V0KHN0cnVjdCBuZXRpZiAqbmV0aWYpOworc3RhdGljIHZvaWQgZGhjcF90Ml90aW1lb3V0KHN0cnVjdCBuZXRpZiAqbmV0aWYpOworCisvKiBidWlsZCBvdXRnb2luZyBtZXNzYWdlcyAqLworLyogY3JlYXRlIGEgREhDUCBtZXNzYWdlLCBmaWxsIGluIGNvbW1vbiBoZWFkZXJzICovCitzdGF0aWMgZXJyX3QgZGhjcF9jcmVhdGVfbXNnKHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBkaGNwICpkaGNwLCB1OF90IG1lc3NhZ2VfdHlwZSk7CisvKiBmcmVlIGEgREhDUCByZXF1ZXN0ICovCitzdGF0aWMgdm9pZCBkaGNwX2RlbGV0ZV9tc2coc3RydWN0IGRoY3AgKmRoY3ApOworLyogYWRkIGEgREhDUCBvcHRpb24gKHR5cGUsIHRoZW4gbGVuZ3RoIGluIGJ5dGVzKSAqLworc3RhdGljIHZvaWQgZGhjcF9vcHRpb24oc3RydWN0IGRoY3AgKmRoY3AsIHU4X3Qgb3B0aW9uX3R5cGUsIHU4X3Qgb3B0aW9uX2xlbik7CisvKiBhZGQgb3B0aW9uIHZhbHVlcyAqLworc3RhdGljIHZvaWQgZGhjcF9vcHRpb25fYnl0ZShzdHJ1Y3QgZGhjcCAqZGhjcCwgdThfdCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBkaGNwX29wdGlvbl9zaG9ydChzdHJ1Y3QgZGhjcCAqZGhjcCwgdTE2X3QgdmFsdWUpOworc3RhdGljIHZvaWQgZGhjcF9vcHRpb25fbG9uZyhzdHJ1Y3QgZGhjcCAqZGhjcCwgdTMyX3QgdmFsdWUpOworLyogYWx3YXlzIGFkZCB0aGUgREhDUCBvcHRpb25zIHRyYWlsZXIgdG8gZW5kIGFuZCBwYWQgKi8KK3N0YXRpYyB2b2lkIGRoY3Bfb3B0aW9uX3RyYWlsZXIoc3RydWN0IGRoY3AgKmRoY3ApOworCisvKioKKyAqIEJhY2stb2ZmIHRoZSBESENQIGNsaWVudCAoYmVjYXVzZSBvZiBhIHJlY2VpdmVkIE5BSyByZXNwb25zZSkuCisgKgorICogQmFjay1vZmYgdGhlIERIQ1AgY2xpZW50IGJlY2F1c2Ugb2YgYSByZWNlaXZlZCBOQUsuIFJlY2VpdmluZyBhCisgKiBOQUsgbWVhbnMgdGhlIGNsaWVudCBhc2tlZCBmb3Igc29tZXRoaW5nIG5vbi1zZW5zaWJsZSwgZm9yCisgKiBleGFtcGxlIHdoZW4gaXQgdHJpZXMgdG8gcmVuZXcgYSBsZWFzZSBvYnRhaW5lZCBvbiBhbm90aGVyIG5ldHdvcmsuCisgKgorICogV2UgY2xlYXIgYW55IGV4aXN0aW5nIHNldCBJUCBhZGRyZXNzIGFuZCByZXN0YXJ0IERIQ1AgbmVnb3RpYXRpb24KKyAqIGFmcmVzaCAoYXMgcGVyIFJGQzIxMzEgMy4yLjMpLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbmV0aWYgdW5kZXIgREhDUCBjb250cm9sCisgKi8KK3N0YXRpYyB2b2lkCitkaGNwX2hhbmRsZV9uYWsoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgc3RydWN0IGRoY3AgKmRoY3AgPSBuZXRpZi0+ZGhjcDsKKyAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImRoY3BfaGFuZGxlX25hayhuZXRpZj0lcCkgJWMlYyUiVTE2X0YiXG4iLCAKKyAgICAodm9pZCopbmV0aWYsIG5ldGlmLT5uYW1lWzBdLCBuZXRpZi0+bmFtZVsxXSwgKHUxNl90KW5ldGlmLT5udW0pKTsKKyAgLyogU2V0IHRoZSBpbnRlcmZhY2UgZG93biBzaW5jZSB0aGUgYWRkcmVzcyBtdXN0IG5vIGxvbmdlciBiZSB1c2VkLCBhcyBwZXIgUkZDMjEzMSAqLworICBuZXRpZl9zZXRfZG93bihuZXRpZik7CisgIC8qIHJlbW92ZSBJUCBhZGRyZXNzIGZyb20gaW50ZXJmYWNlICovCisgIG5ldGlmX3NldF9pcGFkZHIobmV0aWYsIElQX0FERFJfQU5ZKTsKKyAgbmV0aWZfc2V0X2d3KG5ldGlmLCBJUF9BRERSX0FOWSk7CisgIG5ldGlmX3NldF9uZXRtYXNrKG5ldGlmLCBJUF9BRERSX0FOWSk7IAorICAvKiBDaGFuZ2UgdG8gYSBkZWZpbmVkIHN0YXRlICovCisgIGRoY3Bfc2V0X3N0YXRlKGRoY3AsIERIQ1BfQkFDS0lOR19PRkYpOworICAvKiBXZSBjYW4gaW1tZWRpYXRlbHkgcmVzdGFydCBkaXNjb3ZlcnkgKi8KKyAgZGhjcF9kaXNjb3ZlcihuZXRpZik7Cit9CisKKyNpZiBESENQX0RPRVNfQVJQX0NIRUNLCisvKioKKyAqIENoZWNrcyBpZiB0aGUgb2ZmZXJlZCBJUCBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlLgorICoKKyAqIEl0IGRvZXMgc28gYnkgc2VuZGluZyBhbiBBUlAgcmVxdWVzdCBmb3IgdGhlIG9mZmVyZWQgYWRkcmVzcyBhbmQKKyAqIGVudGVyaW5nIENIRUNLSU5HIHN0YXRlLiBJZiBubyBBUlAgcmVwbHkgaXMgcmVjZWl2ZWQgd2l0aGluIGEgc21hbGwKKyAqIGludGVydmFsLCB0aGUgYWRkcmVzcyBpcyBhc3N1bWVkIHRvIGJlIGZyZWUgZm9yIHVzZSBieSB1cy4KKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldGlmIHVuZGVyIERIQ1AgY29udHJvbAorICovCitzdGF0aWMgdm9pZAorZGhjcF9jaGVjayhzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZGhjcCAqZGhjcCA9IG5ldGlmLT5kaGNwOworICBlcnJfdCByZXN1bHQ7CisgIHUxNl90IG1zZWNzOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9jaGVjayhuZXRpZj0lcCkgJWMlY1xuIiwgKHZvaWQgKiluZXRpZiwgKHMxNl90KW5ldGlmLT5uYW1lWzBdLAorICAgIChzMTZfdCluZXRpZi0+bmFtZVsxXSkpOworICBkaGNwX3NldF9zdGF0ZShkaGNwLCBESENQX0NIRUNLSU5HKTsKKyAgLyogY3JlYXRlIGFuIEFSUCBxdWVyeSBmb3IgdGhlIG9mZmVyZWQgSVAgYWRkcmVzcywgZXhwZWN0aW5nIHRoYXQgbm8gaG9zdAorICAgICByZXNwb25kcywgYXMgdGhlIElQIGFkZHJlc3Mgc2hvdWxkIG5vdCBiZSBpbiB1c2UuICovCisgIHJlc3VsdCA9IGV0aGFycF9xdWVyeShuZXRpZiwgJmRoY3AtPm9mZmVyZWRfaXBfYWRkciwgTlVMTCk7CisgIGlmIChyZXN1bHQgIT0gRVJSX09LKSB7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywgKCJkaGNwX2NoZWNrOiBjb3VsZCBub3QgcGVyZm9ybSBBUlAgcXVlcnlcbiIpKTsKKyAgfQorICBkaGNwLT50cmllcysrOworICBtc2VjcyA9IDUwMDsKKyAgZGhjcC0+cmVxdWVzdF90aW1lb3V0ID0gKG1zZWNzICsgREhDUF9GSU5FX1RJTUVSX01TRUNTIC0gMSkgLyBESENQX0ZJTkVfVElNRVJfTVNFQ1M7CisgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLCAoImRoY3BfY2hlY2soKTogc2V0IHJlcXVlc3QgdGltZW91dCAlIlUxNl9GIiBtc2Vjc1xuIiwgbXNlY3MpKTsKK30KKyNlbmRpZiAvKiBESENQX0RPRVNfQVJQX0NIRUNLICovCisKKy8qKgorICogUmVtZW1iZXIgdGhlIGNvbmZpZ3VyYXRpb24gb2ZmZXJlZCBieSBhIERIQ1Agc2VydmVyLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbmV0aWYgdW5kZXIgREhDUCBjb250cm9sCisgKi8KK3N0YXRpYyB2b2lkCitkaGNwX2hhbmRsZV9vZmZlcihzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZGhjcCAqZGhjcCA9IG5ldGlmLT5kaGNwOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9oYW5kbGVfb2ZmZXIobmV0aWY9JXApICVjJWMlIlUxNl9GIlxuIiwKKyAgICAodm9pZCopbmV0aWYsIG5ldGlmLT5uYW1lWzBdLCBuZXRpZi0+bmFtZVsxXSwgKHUxNl90KW5ldGlmLT5udW0pKTsKKyAgLyogb2J0YWluIHRoZSBzZXJ2ZXIgYWRkcmVzcyAqLworICBpZiAoZGhjcF9vcHRpb25fZ2l2ZW4oZGhjcCwgREhDUF9PUFRJT05fSURYX1NFUlZFUl9JRCkpIHsKKyAgICBpcDRfYWRkcl9zZXRfdTMyKCZkaGNwLT5zZXJ2ZXJfaXBfYWRkciwgaHRvbmwoZGhjcF9nZXRfb3B0aW9uX3ZhbHVlKGRoY3AsIERIQ1BfT1BUSU9OX0lEWF9TRVJWRVJfSUQpKSk7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1NUQVRFLCAoImRoY3BfaGFuZGxlX29mZmVyKCk6IHNlcnZlciAweCUwOCJYMzJfRiJcbiIsCisgICAgICBpcDRfYWRkcl9nZXRfdTMyKCZkaGNwLT5zZXJ2ZXJfaXBfYWRkcikpKTsKKyAgICAvKiByZW1lbWJlciBvZmZlcmVkIGFkZHJlc3MgKi8KKyAgICBpcF9hZGRyX2NvcHkoZGhjcC0+b2ZmZXJlZF9pcF9hZGRyLCBkaGNwLT5tc2dfaW4tPnlpYWRkcik7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1NUQVRFLCAoImRoY3BfaGFuZGxlX29mZmVyKCk6IG9mZmVyIGZvciAweCUwOCJYMzJfRiJcbiIsCisgICAgICBpcDRfYWRkcl9nZXRfdTMyKCZkaGNwLT5vZmZlcmVkX2lwX2FkZHIpKSk7CisKKyAgICBkaGNwX3NlbGVjdChuZXRpZik7CisgIH0gZWxzZSB7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfU0VSSU9VUywKKyAgICAgICgiZGhjcF9oYW5kbGVfb2ZmZXIobmV0aWY9JXApIGRpZCBub3QgZ2V0IHNlcnZlciBJRCFcbiIsICh2b2lkKiluZXRpZikpOworICB9Cit9CisKKy8qKgorICogU2VsZWN0IGEgREhDUCBzZXJ2ZXIgb2ZmZXIgb3V0IG9mIGFsbCBvZmZlcnMuCisgKgorICogU2ltcGx5IHNlbGVjdCB0aGUgZmlyc3Qgb2ZmZXIgcmVjZWl2ZWQuCisgKgorICogQHBhcmFtIG5ldGlmIHRoZSBuZXRpZiB1bmRlciBESENQIGNvbnRyb2wKKyAqIEByZXR1cm4gbHdJUCBzcGVjaWZpYyBlcnJvciAoc2VlIGVycm9yLmgpCisgKi8KK3N0YXRpYyBlcnJfdAorZGhjcF9zZWxlY3Qoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgc3RydWN0IGRoY3AgKmRoY3AgPSBuZXRpZi0+ZGhjcDsKKyAgZXJyX3QgcmVzdWx0OworICB1MTZfdCBtc2VjczsKKworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9zZWxlY3QobmV0aWY9JXApICVjJWMlIlUxNl9GIlxuIiwgKHZvaWQqKW5ldGlmLCBuZXRpZi0+bmFtZVswXSwgbmV0aWYtPm5hbWVbMV0sICh1MTZfdCluZXRpZi0+bnVtKSk7CisgIGRoY3Bfc2V0X3N0YXRlKGRoY3AsIERIQ1BfUkVRVUVTVElORyk7CisKKyAgLyogY3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBESENQIG1lc3NhZ2UgaGVhZGVyICovCisgIHJlc3VsdCA9IGRoY3BfY3JlYXRlX21zZyhuZXRpZiwgZGhjcCwgREhDUF9SRVFVRVNUKTsKKyAgaWYgKHJlc3VsdCA9PSBFUlJfT0spIHsKKyAgICBkaGNwX29wdGlvbihkaGNwLCBESENQX09QVElPTl9NQVhfTVNHX1NJWkUsIERIQ1BfT1BUSU9OX01BWF9NU0dfU0laRV9MRU4pOworICAgIGRoY3Bfb3B0aW9uX3Nob3J0KGRoY3AsIERIQ1BfTUFYX01TR19MRU4obmV0aWYpKTsKKworICAgIC8qIE1VU1QgcmVxdWVzdCB0aGUgb2ZmZXJlZCBJUCBhZGRyZXNzICovCisgICAgZGhjcF9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fUkVRVUVTVEVEX0lQLCA0KTsKKyAgICBkaGNwX29wdGlvbl9sb25nKGRoY3AsIG50b2hsKGlwNF9hZGRyX2dldF91MzIoJmRoY3AtPm9mZmVyZWRfaXBfYWRkcikpKTsKKworICAgIGRoY3Bfb3B0aW9uKGRoY3AsIERIQ1BfT1BUSU9OX1NFUlZFUl9JRCwgNCk7CisgICAgZGhjcF9vcHRpb25fbG9uZyhkaGNwLCBudG9obChpcDRfYWRkcl9nZXRfdTMyKCZkaGNwLT5zZXJ2ZXJfaXBfYWRkcikpKTsKKworICAgIGRoY3Bfb3B0aW9uKGRoY3AsIERIQ1BfT1BUSU9OX1BBUkFNRVRFUl9SRVFVRVNUX0xJU1QsIDQvKm51bSBvcHRpb25zKi8pOworICAgIGRoY3Bfb3B0aW9uX2J5dGUoZGhjcCwgREhDUF9PUFRJT05fU1VCTkVUX01BU0spOworICAgIGRoY3Bfb3B0aW9uX2J5dGUoZGhjcCwgREhDUF9PUFRJT05fUk9VVEVSKTsKKyAgICBkaGNwX29wdGlvbl9ieXRlKGRoY3AsIERIQ1BfT1BUSU9OX0JST0FEQ0FTVCk7CisgICAgZGhjcF9vcHRpb25fYnl0ZShkaGNwLCBESENQX09QVElPTl9ETlNfU0VSVkVSKTsKKworI2lmIExXSVBfTkVUSUZfSE9TVE5BTUUKKyAgICBpZiAobmV0aWYtPmhvc3RuYW1lICE9IE5VTEwpIHsKKyAgICAgIGNvbnN0IGNoYXIgKnAgPSAoY29uc3QgY2hhciopbmV0aWYtPmhvc3RuYW1lOworICAgICAgdThfdCBuYW1lbGVuID0gKHU4X3Qpc3RybGVuKHApOworICAgICAgaWYgKG5hbWVsZW4gPiAwKSB7CisgICAgICAgIExXSVBfQVNTRVJUKCJESENQOiBob3N0bmFtZSBpcyB0b28gbG9uZyEiLCBuYW1lbGVuIDwgMjU1KTsKKyAgICAgICAgZGhjcF9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fSE9TVE5BTUUsIG5hbWVsZW4pOworICAgICAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgICBkaGNwX29wdGlvbl9ieXRlKGRoY3AsICpwKyspOworICAgICAgICB9CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qIExXSVBfTkVUSUZfSE9TVE5BTUUgKi8KKworICAgIGRoY3Bfb3B0aW9uX3RyYWlsZXIoZGhjcCk7CisgICAgLyogc2hyaW5rIHRoZSBwYnVmIHRvIHRoZSBhY3R1YWwgY29udGVudCBsZW5ndGggKi8KKyAgICBwYnVmX3JlYWxsb2MoZGhjcC0+cF9vdXQsIHNpemVvZihzdHJ1Y3QgZGhjcF9tc2cpIC0gREhDUF9PUFRJT05TX0xFTiArIGRoY3AtPm9wdGlvbnNfb3V0X2xlbik7CisKKyAgICAvKiBzZW5kIGJyb2FkY2FzdCB0byBhbnkgREhDUCBzZXJ2ZXIgKi8KKyAgICB1ZHBfc2VuZHRvX2lmKGRoY3AtPnBjYiwgZGhjcC0+cF9vdXQsIElQX0FERFJfQlJPQURDQVNULCBESENQX1NFUlZFUl9QT1JULCBuZXRpZik7CisgICAgZGhjcF9kZWxldGVfbXNnKGRoY3ApOworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLCAoImRoY3Bfc2VsZWN0OiBSRVFVRVNUSU5HXG4iKSk7CisgIH0gZWxzZSB7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywgKCJkaGNwX3NlbGVjdDogY291bGQgbm90IGFsbG9jYXRlIERIQ1AgcmVxdWVzdFxuIikpOworICB9CisgIGRoY3AtPnRyaWVzKys7CisgIG1zZWNzID0gKGRoY3AtPnRyaWVzIDwgNiA/IDEgPDwgZGhjcC0+dHJpZXMgOiA2MCkgKiAxMDAwOworICBkaGNwLT5yZXF1ZXN0X3RpbWVvdXQgPSAobXNlY3MgKyBESENQX0ZJTkVfVElNRVJfTVNFQ1MgLSAxKSAvIERIQ1BfRklORV9USU1FUl9NU0VDUzsKKyAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1NUQVRFLCAoImRoY3Bfc2VsZWN0KCk6IHNldCByZXF1ZXN0IHRpbWVvdXQgJSJVMTZfRiIgbXNlY3NcbiIsIG1zZWNzKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogVGhlIERIQ1AgdGltZXIgdGhhdCBjaGVja3MgZm9yIGxlYXNlIHJlbmV3YWwvcmViaW5kIHRpbWVvdXRzLgorICovCit2b2lkCitkaGNwX2NvYXJzZV90bXIoKQoreworICBzdHJ1Y3QgbmV0aWYgKm5ldGlmID0gbmV0aWZfbGlzdDsKKyAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImRoY3BfY29hcnNlX3RtcigpXG4iKSk7CisgIC8qIGl0ZXJhdGUgdGhyb3VnaCBhbGwgbmV0d29yayBpbnRlcmZhY2VzICovCisgIHdoaWxlIChuZXRpZiAhPSBOVUxMKSB7CisgICAgLyogb25seSBhY3Qgb24gREhDUCBjb25maWd1cmVkIGludGVyZmFjZXMgKi8KKyAgICBpZiAobmV0aWYtPmRoY3AgIT0gTlVMTCkgeworICAgICAgLyogdGltZXIgaXMgYWN0aXZlIChub24gemVybyksIGFuZCB0cmlnZ2VycyAoemVyb2VzKSBub3c/ICovCisgICAgICBpZiAobmV0aWYtPmRoY3AtPnQyX3RpbWVvdXQtLSA9PSAxKSB7CisgICAgICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLCAoImRoY3BfY29hcnNlX3RtcigpOiB0MiB0aW1lb3V0XG4iKSk7CisgICAgICAgIC8qIHRoaXMgY2xpZW50cycgcmViaW5kIHRpbWVvdXQgdHJpZ2dlcmVkICovCisgICAgICAgIGRoY3BfdDJfdGltZW91dChuZXRpZik7CisgICAgICAvKiB0aW1lciBpcyBhY3RpdmUgKG5vbiB6ZXJvKSwgYW5kIHRyaWdnZXJzICh6ZXJvZXMpIG5vdyAqLworICAgICAgfSBlbHNlIGlmIChuZXRpZi0+ZGhjcC0+dDFfdGltZW91dC0tID09IDEpIHsKKyAgICAgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9jb2Fyc2VfdG1yKCk6IHQxIHRpbWVvdXRcbiIpKTsKKyAgICAgICAgLyogdGhpcyBjbGllbnRzJyByZW5ld2FsIHRpbWVvdXQgdHJpZ2dlcmVkICovCisgICAgICAgIGRoY3BfdDFfdGltZW91dChuZXRpZik7CisgICAgICB9CisgICAgfQorICAgIC8qIHByb2NlZWQgdG8gbmV4dCBuZXRpZiAqLworICAgIG5ldGlmID0gbmV0aWYtPm5leHQ7CisgIH0KK30KKworLyoqCisgKiBESENQIHRyYW5zYWN0aW9uIHRpbWVvdXQgaGFuZGxpbmcKKyAqCisgKiBBIERIQ1Agc2VydmVyIGlzIGV4cGVjdGVkIHRvIHJlc3BvbmQgd2l0aGluIGEgc2hvcnQgcGVyaW9kIG9mIHRpbWUuCisgKiBUaGlzIHRpbWVyIGNoZWNrcyB3aGV0aGVyIGFuIG91dHN0YW5kaW5nIERIQ1AgcmVxdWVzdCBpcyB0aW1lZCBvdXQuCisgKi8KK3ZvaWQKK2RoY3BfZmluZV90bXIoKQoreworICBzdHJ1Y3QgbmV0aWYgKm5ldGlmID0gbmV0aWZfbGlzdDsKKyAgLyogbG9vcCB0aHJvdWdoIG5ldGlmJ3MgKi8KKyAgd2hpbGUgKG5ldGlmICE9IE5VTEwpIHsKKyAgICAvKiBvbmx5IGFjdCBvbiBESENQIGNvbmZpZ3VyZWQgaW50ZXJmYWNlcyAqLworICAgIGlmIChuZXRpZi0+ZGhjcCAhPSBOVUxMKSB7CisgICAgICAvKiB0aW1lciBpcyBhY3RpdmUgKG5vbiB6ZXJvKSwgYW5kIGlzIGFib3V0IHRvIHRyaWdnZXIgbm93ICovICAgICAgCisgICAgICBpZiAobmV0aWYtPmRoY3AtPnJlcXVlc3RfdGltZW91dCA+IDEpIHsKKyAgICAgICAgbmV0aWYtPmRoY3AtPnJlcXVlc3RfdGltZW91dC0tOworICAgICAgfQorICAgICAgZWxzZSBpZiAobmV0aWYtPmRoY3AtPnJlcXVlc3RfdGltZW91dCA9PSAxKSB7CisgICAgICAgIG5ldGlmLT5kaGNwLT5yZXF1ZXN0X3RpbWVvdXQtLTsKKyAgICAgICAgLyogeyBuZXRpZi0+ZGhjcC0+cmVxdWVzdF90aW1lb3V0ID09IDAgfSAqLworICAgICAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX2ZpbmVfdG1yKCk6IHJlcXVlc3QgdGltZW91dFxuIikpOworICAgICAgICAvKiB0aGlzIGNsaWVudCdzIHJlcXVlc3QgdGltZW91dCB0cmlnZ2VyZWQgKi8KKyAgICAgICAgZGhjcF90aW1lb3V0KG5ldGlmKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogcHJvY2VlZCB0byBuZXh0IG5ldHdvcmsgaW50ZXJmYWNlICovCisgICAgbmV0aWYgPSBuZXRpZi0+bmV4dDsKKyAgfQorfQorCisvKioKKyAqIEEgREhDUCBuZWdvdGlhdGlvbiB0cmFuc2FjdGlvbiwgb3IgQVJQIHJlcXVlc3QsIGhhcyB0aW1lZCBvdXQuCisgKgorICogVGhlIHRpbWVyIHRoYXQgd2FzIHN0YXJ0ZWQgd2l0aCB0aGUgREhDUCBvciBBUlAgcmVxdWVzdCBoYXMKKyAqIHRpbWVkIG91dCwgaW5kaWNhdGluZyBubyByZXNwb25zZSB3YXMgcmVjZWl2ZWQgaW4gdGltZS4KKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldGlmIHVuZGVyIERIQ1AgY29udHJvbAorICovCitzdGF0aWMgdm9pZAorZGhjcF90aW1lb3V0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBkaGNwICpkaGNwID0gbmV0aWYtPmRoY3A7CisgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJkaGNwX3RpbWVvdXQoKVxuIikpOworICAvKiBiYWNrLW9mZiBwZXJpb2QgaGFzIHBhc3NlZCwgb3Igc2VydmVyIHNlbGVjdGlvbiB0aW1lZCBvdXQgKi8KKyAgaWYgKChkaGNwLT5zdGF0ZSA9PSBESENQX0JBQ0tJTkdfT0ZGKSB8fCAoZGhjcC0+c3RhdGUgPT0gREhDUF9TRUxFQ1RJTkcpKSB7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImRoY3BfdGltZW91dCgpOiByZXN0YXJ0aW5nIGRpc2NvdmVyeVxuIikpOworICAgIGRoY3BfZGlzY292ZXIobmV0aWYpOworICAvKiByZWNlaXZpbmcgdGhlIHJlcXVlc3RlZCBsZWFzZSB0aW1lZCBvdXQgKi8KKyAgfSBlbHNlIGlmIChkaGNwLT5zdGF0ZSA9PSBESENQX1JFUVVFU1RJTkcpIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3RpbWVvdXQoKTogUkVRVUVTVElORywgREhDUCByZXF1ZXN0IHRpbWVkIG91dFxuIikpOworICAgIGlmIChkaGNwLT50cmllcyA8PSA1KSB7CisgICAgICBkaGNwX3NlbGVjdChuZXRpZik7CisgICAgfSBlbHNlIHsKKyAgICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLCAoImRoY3BfdGltZW91dCgpOiBSRVFVRVNUSU5HLCByZWxlYXNpbmcsIHJlc3RhcnRpbmdcbiIpKTsKKyAgICAgIGRoY3BfcmVsZWFzZShuZXRpZik7CisgICAgICBkaGNwX2Rpc2NvdmVyKG5ldGlmKTsKKyAgICB9CisjaWYgREhDUF9ET0VTX0FSUF9DSEVDSworICAvKiByZWNlaXZlZCBubyBBUlAgcmVwbHkgZm9yIHRoZSBvZmZlcmVkIGFkZHJlc3MgKHdoaWNoIGlzIGdvb2QpICovCisgIH0gZWxzZSBpZiAoZGhjcC0+c3RhdGUgPT0gREhDUF9DSEVDS0lORykgeworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLCAoImRoY3BfdGltZW91dCgpOiBDSEVDS0lORywgQVJQIHJlcXVlc3QgdGltZWQgb3V0XG4iKSk7CisgICAgaWYgKGRoY3AtPnRyaWVzIDw9IDEpIHsKKyAgICAgIGRoY3BfY2hlY2sobmV0aWYpOworICAgIC8qIG5vIEFSUCByZXBsaWVzIG9uIHRoZSBvZmZlcmVkIGFkZHJlc3MsCisgICAgICAgbG9va3MgbGlrZSB0aGUgSVAgYWRkcmVzcyBpcyBpbmRlZWQgZnJlZSAqLworICAgIH0gZWxzZSB7CisgICAgICAvKiBiaW5kIHRoZSBpbnRlcmZhY2UgdG8gdGhlIG9mZmVyZWQgYWRkcmVzcyAqLworICAgICAgZGhjcF9iaW5kKG5ldGlmKTsKKyAgICB9CisjZW5kaWYgLyogREhDUF9ET0VTX0FSUF9DSEVDSyAqLworICB9CisgIC8qIGRpZCBub3QgZ2V0IHJlc3BvbnNlIHRvIHJlbmV3IHJlcXVlc3Q/ICovCisgIGVsc2UgaWYgKGRoY3AtPnN0YXRlID09IERIQ1BfUkVORVdJTkcpIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3RpbWVvdXQoKTogUkVORVdJTkcsIERIQ1AgcmVxdWVzdCB0aW1lZCBvdXRcbiIpKTsKKyAgICAvKiBqdXN0IHJldHJ5IHJlbmV3YWwgKi8KKyAgICAvKiBub3RlIHRoYXQgdGhlIHJlYmluZCB0aW1lciB3aWxsIGV2ZW50dWFsbHkgdGltZS1vdXQgaWYgcmVuZXcgZG9lcyBub3Qgd29yayAqLworICAgIGRoY3BfcmVuZXcobmV0aWYpOworICAvKiBkaWQgbm90IGdldCByZXNwb25zZSB0byByZWJpbmQgcmVxdWVzdD8gKi8KKyAgfSBlbHNlIGlmIChkaGNwLT5zdGF0ZSA9PSBESENQX1JFQklORElORykgeworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLCAoImRoY3BfdGltZW91dCgpOiBSRUJJTkRJTkcsIERIQ1AgcmVxdWVzdCB0aW1lZCBvdXRcbiIpKTsKKyAgICBpZiAoZGhjcC0+dHJpZXMgPD0gOCkgeworICAgICAgZGhjcF9yZWJpbmQobmV0aWYpOworICAgIH0gZWxzZSB7CisgICAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3RpbWVvdXQoKTogUkVMRUFTSU5HLCBESVNDT1ZFUklOR1xuIikpOworICAgICAgZGhjcF9yZWxlYXNlKG5ldGlmKTsKKyAgICAgIGRoY3BfZGlzY292ZXIobmV0aWYpOworICAgIH0KKyAgfSBlbHNlIGlmIChkaGNwLT5zdGF0ZSA9PSBESENQX1JFQk9PVElORykgeworICAgIGlmIChkaGNwLT50cmllcyA8IFJFQk9PVF9UUklFUykgeworICAgICAgZGhjcF9yZWJvb3QobmV0aWYpOworICAgIH0gZWxzZSB7CisgICAgICBkaGNwX2Rpc2NvdmVyKG5ldGlmKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBUaGUgcmVuZXdhbCBwZXJpb2QgaGFzIHRpbWVkIG91dC4KKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldGlmIHVuZGVyIERIQ1AgY29udHJvbAorICovCitzdGF0aWMgdm9pZAorZGhjcF90MV90aW1lb3V0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBkaGNwICpkaGNwID0gbmV0aWYtPmRoY3A7CisgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3QxX3RpbWVvdXQoKVxuIikpOworICBpZiAoKGRoY3AtPnN0YXRlID09IERIQ1BfUkVRVUVTVElORykgfHwgKGRoY3AtPnN0YXRlID09IERIQ1BfQk9VTkQpIHx8CisgICAgICAoZGhjcC0+c3RhdGUgPT0gREhDUF9SRU5FV0lORykpIHsKKyAgICAvKiBqdXN0IHJldHJ5IHRvIHJlbmV3IC0gbm90ZSB0aGF0IHRoZSByZWJpbmQgdGltZXIgKHQyKSB3aWxsCisgICAgICogZXZlbnR1YWxseSB0aW1lLW91dCBpZiByZW5ldyB0cmllcyBmYWlsLiAqLworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLAorICAgICAgICAgICAgICAgICgiZGhjcF90MV90aW1lb3V0KCk6IG11c3QgcmVuZXdcbiIpKTsKKyAgICAvKiBUaGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byBSRkMyMTMxOiBESENQUkVRVUVTVCB3aWxsIGJlIHNlbnQgZnJvbSBzdGF0ZQorICAgICAgIERIQ1BfUkVORVdJTkcsIG5vdCBESENQX0JPVU5EICovCisgICAgZGhjcF9yZW5ldyhuZXRpZik7CisgIH0KK30KKworLyoqCisgKiBUaGUgcmViaW5kIHBlcmlvZCBoYXMgdGltZWQgb3V0LgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbmV0aWYgdW5kZXIgREhDUCBjb250cm9sCisgKi8KK3N0YXRpYyB2b2lkCitkaGNwX3QyX3RpbWVvdXQoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgc3RydWN0IGRoY3AgKmRoY3AgPSBuZXRpZi0+ZGhjcDsKKyAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF90Ml90aW1lb3V0KClcbiIpKTsKKyAgaWYgKChkaGNwLT5zdGF0ZSA9PSBESENQX1JFUVVFU1RJTkcpIHx8IChkaGNwLT5zdGF0ZSA9PSBESENQX0JPVU5EKSB8fAorICAgICAgKGRoY3AtPnN0YXRlID09IERIQ1BfUkVORVdJTkcpKSB7CisgICAgLyoganVzdCByZXRyeSB0byByZWJpbmQgKi8KKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwKKyAgICAgICAgICAgICAgICAoImRoY3BfdDJfdGltZW91dCgpOiBtdXN0IHJlYmluZFxuIikpOworICAgIC8qIFRoaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIFJGQzIxMzE6IERIQ1BSRVFVRVNUIHdpbGwgYmUgc2VudCBmcm9tIHN0YXRlCisgICAgICAgREhDUF9SRUJJTkRJTkcsIG5vdCBESENQX0JPVU5EICovCisgICAgZGhjcF9yZWJpbmQobmV0aWYpOworICB9Cit9CisKKy8qKgorICogSGFuZGxlIGEgREhDUCBBQ0sgcGFja2V0CisgKgorICogQHBhcmFtIG5ldGlmIHRoZSBuZXRpZiB1bmRlciBESENQIGNvbnRyb2wKKyAqLworc3RhdGljIHZvaWQKK2RoY3BfaGFuZGxlX2FjayhzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZGhjcCAqZGhjcCA9IG5ldGlmLT5kaGNwOworI2lmIExXSVBfRE5TCisgIHU4X3QgbjsKKyNlbmRpZiAvKiBMV0lQX0ROUyAqLworCisgIC8qIGNsZWFyIG9wdGlvbnMgd2UgbWlnaHQgbm90IGdldCBmcm9tIHRoZSBBQ0sgKi8KKyAgaXBfYWRkcl9zZXRfemVybygmZGhjcC0+b2ZmZXJlZF9zbl9tYXNrKTsKKyAgaXBfYWRkcl9zZXRfemVybygmZGhjcC0+b2ZmZXJlZF9nd19hZGRyKTsKKyNpZiBMV0lQX0RIQ1BfQk9PVFBfRklMRQorICBpcF9hZGRyX3NldF96ZXJvKCZkaGNwLT5vZmZlcmVkX3NpX2FkZHIpOworI2VuZGlmIC8qIExXSVBfREhDUF9CT09UUF9GSUxFICovCisKKyAgLyogbGVhc2UgdGltZSBnaXZlbj8gKi8KKyAgaWYgKGRoY3Bfb3B0aW9uX2dpdmVuKGRoY3AsIERIQ1BfT1BUSU9OX0lEWF9MRUFTRV9USU1FKSkgeworICAgIC8qIHJlbWVtYmVyIG9mZmVyZWQgbGVhc2UgdGltZSAqLworICAgIGRoY3AtPm9mZmVyZWRfdDBfbGVhc2UgPSBkaGNwX2dldF9vcHRpb25fdmFsdWUoZGhjcCwgREhDUF9PUFRJT05fSURYX0xFQVNFX1RJTUUpOworICB9CisgIC8qIHJlbmV3YWwgcGVyaW9kIGdpdmVuPyAqLworICBpZiAoZGhjcF9vcHRpb25fZ2l2ZW4oZGhjcCwgREhDUF9PUFRJT05fSURYX1QxKSkgeworICAgIC8qIHJlbWVtYmVyIGdpdmVuIHJlbmV3YWwgcGVyaW9kICovCisgICAgZGhjcC0+b2ZmZXJlZF90MV9yZW5ldyA9IGRoY3BfZ2V0X29wdGlvbl92YWx1ZShkaGNwLCBESENQX09QVElPTl9JRFhfVDEpOworICB9IGVsc2UgeworICAgIC8qIGNhbGN1bGF0ZSBzYWZlIHBlcmlvZHMgZm9yIHJlbmV3YWwgKi8KKyAgICBkaGNwLT5vZmZlcmVkX3QxX3JlbmV3ID0gZGhjcC0+b2ZmZXJlZF90MF9sZWFzZSAvIDI7CisgIH0KKworICAvKiByZW5ld2FsIHBlcmlvZCBnaXZlbj8gKi8KKyAgaWYgKGRoY3Bfb3B0aW9uX2dpdmVuKGRoY3AsIERIQ1BfT1BUSU9OX0lEWF9UMikpIHsKKyAgICAvKiByZW1lbWJlciBnaXZlbiByZWJpbmQgcGVyaW9kICovCisgICAgZGhjcC0+b2ZmZXJlZF90Ml9yZWJpbmQgPSBkaGNwX2dldF9vcHRpb25fdmFsdWUoZGhjcCwgREhDUF9PUFRJT05fSURYX1QyKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBjYWxjdWxhdGUgc2FmZSBwZXJpb2RzIGZvciByZWJpbmRpbmcgKi8KKyAgICBkaGNwLT5vZmZlcmVkX3QyX3JlYmluZCA9IGRoY3AtPm9mZmVyZWRfdDBfbGVhc2U7CisgIH0KKworICAvKiAoeSlvdXIgaW50ZXJuZXQgYWRkcmVzcyAqLworICBpcF9hZGRyX2NvcHkoZGhjcC0+b2ZmZXJlZF9pcF9hZGRyLCBkaGNwLT5tc2dfaW4tPnlpYWRkcik7CisKKyNpZiBMV0lQX0RIQ1BfQk9PVFBfRklMRQorICAvKiBjb3B5IGJvb3Qgc2VydmVyIGFkZHJlc3MsCisgICAgIGJvb3QgZmlsZSBuYW1lIGNvcGllZCBpbiBkaGNwX3BhcnNlX3JlcGx5IGlmIG5vdCBvdmVybG9hZGVkICovCisgIGlwX2FkZHJfY29weShkaGNwLT5vZmZlcmVkX3NpX2FkZHIsIGRoY3AtPm1zZ19pbi0+c2lhZGRyKTsKKyNlbmRpZiAvKiBMV0lQX0RIQ1BfQk9PVFBfRklMRSAqLworCisgIC8qIHN1Ym5ldCBtYXNrIGdpdmVuPyAqLworICBpZiAoZGhjcF9vcHRpb25fZ2l2ZW4oZGhjcCwgREhDUF9PUFRJT05fSURYX1NVQk5FVF9NQVNLKSkgeworICAgIC8qIHJlbWVtYmVyIGdpdmVuIHN1Ym5ldCBtYXNrICovCisgICAgaXA0X2FkZHJfc2V0X3UzMigmZGhjcC0+b2ZmZXJlZF9zbl9tYXNrLCBodG9ubChkaGNwX2dldF9vcHRpb25fdmFsdWUoZGhjcCwgREhDUF9PUFRJT05fSURYX1NVQk5FVF9NQVNLKSkpOworICAgIGRoY3AtPnN1Ym5ldF9tYXNrX2dpdmVuID0gMTsKKyAgfSBlbHNlIHsKKyAgICBkaGNwLT5zdWJuZXRfbWFza19naXZlbiA9IDA7CisgIH0KKworICAvKiBnYXRld2F5IHJvdXRlciAqLworICBpZiAoZGhjcF9vcHRpb25fZ2l2ZW4oZGhjcCwgREhDUF9PUFRJT05fSURYX1JPVVRFUikpIHsKKyAgICBpcDRfYWRkcl9zZXRfdTMyKCZkaGNwLT5vZmZlcmVkX2d3X2FkZHIsIGh0b25sKGRoY3BfZ2V0X29wdGlvbl92YWx1ZShkaGNwLCBESENQX09QVElPTl9JRFhfUk9VVEVSKSkpOworICB9CisgIAorI2lmIExXSVBfRE5TCisgIC8qIEROUyBzZXJ2ZXJzICovCisgIG4gPSAwOworICB3aGlsZShkaGNwX29wdGlvbl9naXZlbihkaGNwLCBESENQX09QVElPTl9JRFhfRE5TX1NFUlZFUiArIG4pICYmIChuIDwgRE5TX01BWF9TRVJWRVJTKSkgeworICAgIGlwX2FkZHJfdCBkbnNfYWRkcjsKKyAgICBpcDRfYWRkcl9zZXRfdTMyKCZkbnNfYWRkciwgaHRvbmwoZGhjcF9nZXRfb3B0aW9uX3ZhbHVlKGRoY3AsIERIQ1BfT1BUSU9OX0lEWF9ETlNfU0VSVkVSICsgbikpKTsKKyAgICBkbnNfc2V0c2VydmVyKG4sICZkbnNfYWRkcik7CisgICAgbisrOworICB9CisjZW5kaWYgLyogTFdJUF9ETlMgKi8KK30KKworLyoqIFNldCBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHN0cnVjdCBkaGNwIHRvIHdvcmsgd2l0aC4KKyAqIFVzaW5nIHRoaXMgcHJldmVudHMgZGhjcF9zdGFydCB0byBhbGxvY2F0ZSBpdCB1c2luZyBtZW1fbWFsbG9jLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbmV0aWYgZm9yIHdoaWNoIHRvIHNldCB0aGUgc3RydWN0IGRoY3AKKyAqIEBwYXJhbSBkaGNwICh1bmluaXRpYWxpc2VkKSBkaGNwIHN0cnVjdCBhbGxvY2F0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uCisgKi8KK3ZvaWQKK2RoY3Bfc2V0X3N0cnVjdChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBzdHJ1Y3QgZGhjcCAqZGhjcCkKK3sKKyAgTFdJUF9BU1NFUlQoIm5ldGlmICE9IE5VTEwiLCBuZXRpZiAhPSBOVUxMKTsKKyAgTFdJUF9BU1NFUlQoImRoY3AgIT0gTlVMTCIsIGRoY3AgIT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJuZXRpZiBhbHJlYWR5IGhhcyBhIHN0cnVjdCBkaGNwIHNldCIsIG5ldGlmLT5kaGNwID09IE5VTEwpOworCisgIC8qIGNsZWFyIGRhdGEgc3RydWN0dXJlICovCisgIG1lbXNldChkaGNwLCAwLCBzaXplb2Yoc3RydWN0IGRoY3ApKTsKKyAgLyogZGhjcF9zZXRfc3RhdGUoJmRoY3AsIERIQ1BfT0ZGKTsgKi8KKyAgbmV0aWYtPmRoY3AgPSBkaGNwOworfQorCisvKiogUmVtb3ZlcyBhIHN0cnVjdCBkaGNwIGZyb20gYSBuZXRpZi4KKyAqCisgKiBBVFRFTlRJT046IE9ubHkgdXNlIHRoaXMgd2hlbiBub3QgdXNpbmcgZGhjcF9zZXRfc3RydWN0KCkgdG8gYWxsb2NhdGUgdGhlCisgKiAgICAgICAgICAgIHN0cnVjdCBkaGNwIHNpbmNlIHRoZSBtZW1vcnkgaXMgcGFzc2VkIGJhY2sgdG8gdGhlIGhlYXAuCisgKgorICogQHBhcmFtIG5ldGlmIHRoZSBuZXRpZiBmcm9tIHdoaWNoIHRvIHJlbW92ZSB0aGUgc3RydWN0IGRoY3AKKyAqLwordm9pZCBkaGNwX2NsZWFudXAoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgTFdJUF9BU1NFUlQoIm5ldGlmICE9IE5VTEwiLCBuZXRpZiAhPSBOVUxMKTsKKworICBpZiAobmV0aWYtPmRoY3AgIT0gTlVMTCkgeworICAgIG1lbV9mcmVlKG5ldGlmLT5kaGNwKTsKKyAgICBuZXRpZi0+ZGhjcCA9IE5VTEw7CisgIH0KK30KKworLyoqCisgKiBTdGFydCBESENQIG5lZ290aWF0aW9uIGZvciBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICoKKyAqIElmIG5vIERIQ1AgY2xpZW50IGluc3RhbmNlIHdhcyBhdHRhY2hlZCB0byB0aGlzIGludGVyZmFjZSwKKyAqIGEgbmV3IGNsaWVudCBpcyBjcmVhdGVkIGZpcnN0LiBJZiBhIERIQ1AgY2xpZW50IGluc3RhbmNlCisgKiB3YXMgYWxyZWFkeSBwcmVzZW50LCBpdCByZXN0YXJ0cyBuZWdvdGlhdGlvbi4KKyAqCisgKiBAcGFyYW0gbmV0aWYgVGhlIGx3SVAgbmV0d29yayBpbnRlcmZhY2UKKyAqIEByZXR1cm4gbHdJUCBlcnJvciBjb2RlCisgKiAtIEVSUl9PSyAtIE5vIGVycm9yCisgKiAtIEVSUl9NRU0gLSBPdXQgb2YgbWVtb3J5CisgKi8KK2Vycl90CitkaGNwX3N0YXJ0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBkaGNwICpkaGNwOworICBlcnJfdCByZXN1bHQgPSBFUlJfT0s7CisKKyAgTFdJUF9FUlJPUigibmV0aWYgIT0gTlVMTCIsIChuZXRpZiAhPSBOVUxMKSwgcmV0dXJuIEVSUl9BUkc7KTsKKyAgZGhjcCA9IG5ldGlmLT5kaGNwOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3N0YXJ0KG5ldGlmPSVwKSAlYyVjJSJVMTZfRiJcbiIsICh2b2lkKiluZXRpZiwgbmV0aWYtPm5hbWVbMF0sIG5ldGlmLT5uYW1lWzFdLCAodTE2X3QpbmV0aWYtPm51bSkpOworICAvKiBSZW1vdmUgdGhlIGZsYWcgdGhhdCBzYXlzIHRoaXMgbmV0aWYgaXMgaGFuZGxlZCBieSBESENQLAorICAgICBpdCBpcyBzZXQgd2hlbiB3ZSBzdWNjZWVkZWQgc3RhcnRpbmcuICovCisgIG5ldGlmLT5mbGFncyAmPSB+TkVUSUZfRkxBR19ESENQOworCisgIC8qIGNoZWNrIGh3dHlwZSBvZiB0aGUgbmV0aWYgKi8KKyAgaWYgKChuZXRpZi0+ZmxhZ3MgJiBORVRJRl9GTEFHX0VUSEFSUCkgPT0gMCkgeworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJkaGNwX3N0YXJ0KCk6IE5vIEVUSEFSUCBuZXRpZlxuIikpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisKKyAgLyogY2hlY2sgTVRVIG9mIHRoZSBuZXRpZiAqLworICBpZiAobmV0aWYtPm10dSA8IERIQ1BfTUFYX01TR19MRU5fTUlOX1JFUVVJUkVEKSB7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImRoY3Bfc3RhcnQoKTogQ2Fubm90IHVzZSB0aGlzIG5ldGlmIHdpdGggREhDUDogTVRVIGlzIHRvbyBzbWFsbFxuIikpOworICAgIHJldHVybiBFUlJfTUVNOworICB9CisKKyAgLyogbm8gREhDUCBjbGllbnQgYXR0YWNoZWQgeWV0PyAqLworICBpZiAoZGhjcCA9PSBOVUxMKSB7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImRoY3Bfc3RhcnQoKTogc3RhcnRpbmcgbmV3IERIQ1AgY2xpZW50XG4iKSk7CisgICAgZGhjcCA9IChzdHJ1Y3QgZGhjcCAqKW1lbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaGNwKSk7CisgICAgaWYgKGRoY3AgPT0gTlVMTCkgeworICAgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImRoY3Bfc3RhcnQoKTogY291bGQgbm90IGFsbG9jYXRlIGRoY3BcbiIpKTsKKyAgICAgIHJldHVybiBFUlJfTUVNOworICAgIH0KKyAgICAvKiBzdG9yZSB0aGlzIGRoY3AgY2xpZW50IGluIHRoZSBuZXRpZiAqLworICAgIG5ldGlmLT5kaGNwID0gZGhjcDsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9zdGFydCgpOiBhbGxvY2F0ZWQgZGhjcCIpKTsKKyAgLyogYWxyZWFkeSBoYXMgREhDUCBjbGllbnQgYXR0YWNoZWQgKi8KKyAgfSBlbHNlIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3N0YXJ0KCk6IHJlc3RhcnRpbmcgREhDUCBjb25maWd1cmF0aW9uXG4iKSk7CisgICAgaWYgKGRoY3AtPnBjYiAhPSBOVUxMKSB7CisgICAgICB1ZHBfcmVtb3ZlKGRoY3AtPnBjYik7CisgICAgfQorICAgIExXSVBfQVNTRVJUKCJwYnVmIHBfb3V0IHdhc24ndCBmcmVlZCIsIGRoY3AtPnBfb3V0ID09IE5VTEwpOworICAgIExXSVBfQVNTRVJUKCJyZXBseSB3YXNuJ3QgZnJlZWQiLCBkaGNwLT5tc2dfaW4gPT0gTlVMTCApOworICB9CisgICAgCisgIC8qIGNsZWFyIGRhdGEgc3RydWN0dXJlICovCisgIG1lbXNldChkaGNwLCAwLCBzaXplb2Yoc3RydWN0IGRoY3ApKTsKKyAgLyogZGhjcF9zZXRfc3RhdGUoJmRoY3AsIERIQ1BfT0ZGKTsgKi8KKyAgLyogYWxsb2NhdGUgVURQIFBDQiAqLworICBkaGNwLT5wY2IgPSB1ZHBfbmV3KCk7CisgIGlmIChkaGNwLT5wY2IgPT0gTlVMTCkgeworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9zdGFydCgpOiBjb3VsZCBub3Qgb2J0YWluIHBjYlxuIikpOworICAgIHJldHVybiBFUlJfTUVNOworICB9CisgIGRoY3AtPnBjYi0+c29fb3B0aW9ucyB8PSBTT0ZfQlJPQURDQVNUOworICAvKiBzZXQgdXAgbG9jYWwgYW5kIHJlbW90ZSBwb3J0IGZvciB0aGUgcGNiICovCisgIHVkcF9iaW5kKGRoY3AtPnBjYiwgSVBfQUREUl9BTlksIERIQ1BfQ0xJRU5UX1BPUlQpOworICB1ZHBfY29ubmVjdChkaGNwLT5wY2IsIElQX0FERFJfQU5ZLCBESENQX1NFUlZFUl9QT1JUKTsKKyAgLyogc2V0IHVwIHRoZSByZWN2IGNhbGxiYWNrIGFuZCBhcmd1bWVudCAqLworICB1ZHBfcmVjdihkaGNwLT5wY2IsIGRoY3BfcmVjdiwgbmV0aWYpOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9zdGFydCgpOiBzdGFydGluZyBESENQIGNvbmZpZ3VyYXRpb25cbiIpKTsKKyAgLyogKHJlKXN0YXJ0IHRoZSBESENQIG5lZ290aWF0aW9uICovCisgIHJlc3VsdCA9IGRoY3BfZGlzY292ZXIobmV0aWYpOworICBpZiAocmVzdWx0ICE9IEVSUl9PSykgeworICAgIC8qIGZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBhYm92ZSAqLworICAgIGRoY3Bfc3RvcChuZXRpZik7CisgICAgcmV0dXJuIEVSUl9NRU07CisgIH0KKyAgLyogU2V0IHRoZSBmbGFnIHRoYXQgc2F5cyB0aGlzIG5ldGlmIGlzIGhhbmRsZWQgYnkgREhDUC4gKi8KKyAgbmV0aWYtPmZsYWdzIHw9IE5FVElGX0ZMQUdfREhDUDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBJbmZvcm0gYSBESENQIHNlcnZlciBvZiBvdXIgbWFudWFsIGNvbmZpZ3VyYXRpb24uCisgKgorICogVGhpcyBpbmZvcm1zIERIQ1Agc2VydmVycyBvZiBvdXIgZml4ZWQgSVAgYWRkcmVzcyBjb25maWd1cmF0aW9uCisgKiBieSBzZW5kaW5nIGFuIElORk9STSBtZXNzYWdlLiBJdCBkb2VzIG5vdCBpbnZvbHZlIERIQ1AgYWRkcmVzcworICogY29uZmlndXJhdGlvbiwgaXQgaXMganVzdCBoZXJlIHRvIGJlIG5pY2UgdG8gdGhlIG5ldHdvcmsuCisgKgorICogQHBhcmFtIG5ldGlmIFRoZSBsd0lQIG5ldHdvcmsgaW50ZXJmYWNlCisgKi8KK3ZvaWQKK2RoY3BfaW5mb3JtKHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBkaGNwIGRoY3A7CisgIGVycl90IHJlc3VsdCA9IEVSUl9PSzsKKyAgc3RydWN0IHVkcF9wY2IgKnBjYjsKKworICBMV0lQX0VSUk9SKCJuZXRpZiAhPSBOVUxMIiwgKG5ldGlmICE9IE5VTEwpLCByZXR1cm47KTsKKworICBtZW1zZXQoJmRoY3AsIDAsIHNpemVvZihzdHJ1Y3QgZGhjcCkpOworICBkaGNwX3NldF9zdGF0ZSgmZGhjcCwgREhDUF9JTkZPUk0pOworCisgIGlmICgobmV0aWYtPmRoY3AgIT0gTlVMTCkgJiYgKG5ldGlmLT5kaGNwLT5wY2IgIT0gTlVMTCkpIHsKKyAgICAvKiByZS11c2UgZXhpc3RpbmcgcGNiICovCisgICAgcGNiID0gbmV0aWYtPmRoY3AtPnBjYjsKKyAgfSBlbHNlIHsKKyAgICBwY2IgPSB1ZHBfbmV3KCk7CisgICAgaWYgKHBjYiA9PSBOVUxMKSB7CisgICAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLCAoImRoY3BfaW5mb3JtKCk6IGNvdWxkIG5vdCBvYnRhaW4gcGNiIikpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkaGNwLnBjYiA9IHBjYjsKKyAgICBkaGNwLnBjYi0+c29fb3B0aW9ucyB8PSBTT0ZfQlJPQURDQVNUOworICAgIHVkcF9iaW5kKGRoY3AucGNiLCBJUF9BRERSX0FOWSwgREhDUF9DTElFTlRfUE9SVCk7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImRoY3BfaW5mb3JtKCk6IGNyZWF0ZWQgbmV3IHVkcCBwY2JcbiIpKTsKKyAgfQorICAvKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIERIQ1AgbWVzc2FnZSBoZWFkZXIgKi8KKyAgcmVzdWx0ID0gZGhjcF9jcmVhdGVfbXNnKG5ldGlmLCAmZGhjcCwgREhDUF9JTkZPUk0pOworICBpZiAocmVzdWx0ID09IEVSUl9PSykgeworICAgIGRoY3Bfb3B0aW9uKCZkaGNwLCBESENQX09QVElPTl9NQVhfTVNHX1NJWkUsIERIQ1BfT1BUSU9OX01BWF9NU0dfU0laRV9MRU4pOworICAgIGRoY3Bfb3B0aW9uX3Nob3J0KCZkaGNwLCBESENQX01BWF9NU0dfTEVOKG5ldGlmKSk7CisKKyAgICBkaGNwX29wdGlvbl90cmFpbGVyKCZkaGNwKTsKKworICAgIHBidWZfcmVhbGxvYyhkaGNwLnBfb3V0LCBzaXplb2Yoc3RydWN0IGRoY3BfbXNnKSAtIERIQ1BfT1BUSU9OU19MRU4gKyBkaGNwLm9wdGlvbnNfb3V0X2xlbik7CisKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX2luZm9ybTogSU5GT1JNSU5HXG4iKSk7CisgICAgdWRwX3NlbmR0b19pZihwY2IsIGRoY3AucF9vdXQsIElQX0FERFJfQlJPQURDQVNULCBESENQX1NFUlZFUl9QT1JULCBuZXRpZik7CisgICAgZGhjcF9kZWxldGVfbXNnKCZkaGNwKTsKKyAgfSBlbHNlIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLCAoImRoY3BfaW5mb3JtOiBjb3VsZCBub3QgYWxsb2NhdGUgREhDUCByZXF1ZXN0XG4iKSk7CisgIH0KKworICBpZiAoZGhjcC5wY2IgIT0gTlVMTCkgeworICAgIC8qIG90aGVyd2lzZSwgdGhlIGV4aXN0aW5nIHBjYiB3YXMgdXNlZCAqLworICAgIHVkcF9yZW1vdmUoZGhjcC5wY2IpOworICB9Cit9CisKKy8qKiBIYW5kbGUgYSBwb3NzaWJsZSBjaGFuZ2UgaW4gdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbi4KKyAqCisgKiBUaGlzIGVudGVycyB0aGUgUkVCT09USU5HIHN0YXRlIHRvIHZlcmlmeSB0aGF0IHRoZSBjdXJyZW50bHkgYm91bmQKKyAqIGFkZHJlc3MgaXMgc3RpbGwgdmFsaWQuCisgKi8KK3ZvaWQKK2RoY3BfbmV0d29ya19jaGFuZ2VkKHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBkaGNwICpkaGNwID0gbmV0aWYtPmRoY3A7CisgIGlmICghZGhjcCkKKyAgICByZXR1cm47CisgIHN3aXRjaCAoZGhjcC0+c3RhdGUpIHsKKyAgY2FzZSBESENQX1JFQklORElORzoKKyAgY2FzZSBESENQX1JFTkVXSU5HOgorICBjYXNlIERIQ1BfQk9VTkQ6CisgIGNhc2UgREhDUF9SRUJPT1RJTkc6CisgICAgbmV0aWZfc2V0X2Rvd24obmV0aWYpOworICAgIGRoY3AtPnRyaWVzID0gMDsKKyAgICBkaGNwX3JlYm9vdChuZXRpZik7CisgICAgYnJlYWs7CisgIGNhc2UgREhDUF9PRkY6CisgICAgLyogc3RheSBvZmYgKi8KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBkaGNwLT50cmllcyA9IDA7CisjaWYgTFdJUF9ESENQX0FVVE9JUF9DT09QCisgICAgaWYoZGhjcC0+YXV0b2lwX2Nvb3Bfc3RhdGUgPT0gREhDUF9BVVRPSVBfQ09PUF9TVEFURV9PTikgeworICAgICAgYXV0b2lwX3N0b3AobmV0aWYpOworICAgICAgZGhjcC0+YXV0b2lwX2Nvb3Bfc3RhdGUgPSBESENQX0FVVE9JUF9DT09QX1NUQVRFX09GRjsKKyAgICB9CisjZW5kaWYgLyogTFdJUF9ESENQX0FVVE9JUF9DT09QICovCisgICAgZGhjcF9kaXNjb3ZlcihuZXRpZik7CisgICAgYnJlYWs7CisgIH0KK30KKworI2lmIERIQ1BfRE9FU19BUlBfQ0hFQ0sKKy8qKgorICogTWF0Y2ggYW4gQVJQIHJlcGx5IHdpdGggdGhlIG9mZmVyZWQgSVAgYWRkcmVzcy4KKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSByZXBseSB3YXMgcmVjZWl2ZWQKKyAqIEBwYXJhbSBhZGRyIFRoZSBJUCBhZGRyZXNzIHdlIHJlY2VpdmVkIGEgcmVwbHkgZnJvbQorICovCit2b2lkIGRoY3BfYXJwX3JlcGx5KHN0cnVjdCBuZXRpZiAqbmV0aWYsIGlwX2FkZHJfdCAqYWRkcikKK3sKKyAgTFdJUF9FUlJPUigibmV0aWYgIT0gTlVMTCIsIChuZXRpZiAhPSBOVUxMKSwgcmV0dXJuOyk7CisgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJkaGNwX2FycF9yZXBseSgpXG4iKSk7CisgIC8qIGlzIGEgREhDUCBjbGllbnQgZG9pbmcgYW4gQVJQIGNoZWNrPyAqLworICBpZiAoKG5ldGlmLT5kaGNwICE9IE5VTEwpICYmIChuZXRpZi0+ZGhjcC0+c3RhdGUgPT0gREhDUF9DSEVDS0lORykpIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX2FycF9yZXBseSgpOiBDSEVDS0lORywgYXJwIHJlcGx5IGZvciAweCUwOCJYMzJfRiJcbiIsCisgICAgICBpcDRfYWRkcl9nZXRfdTMyKGFkZHIpKSk7CisgICAgLyogZGlkIGEgaG9zdCByZXNwb25kIHdpdGggdGhlIGFkZHJlc3Mgd2UKKyAgICAgICB3ZXJlIG9mZmVyZWQgYnkgdGhlIERIQ1Agc2VydmVyPyAqLworICAgIGlmIChpcF9hZGRyX2NtcChhZGRyLCAmbmV0aWYtPmRoY3AtPm9mZmVyZWRfaXBfYWRkcikpIHsKKyAgICAgIC8qIHdlIHdpbGwgbm90IGFjY2VwdCB0aGUgb2ZmZXJlZCBhZGRyZXNzICovCisgICAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSB8IExXSVBfREJHX0xFVkVMX1dBUk5JTkcsCisgICAgICAgICgiZGhjcF9hcnBfcmVwbHkoKTogYXJwIHJlcGx5IG1hdGNoZWQgd2l0aCBvZmZlcmVkIGFkZHJlc3MsIGRlY2xpbmluZ1xuIikpOworICAgICAgZGhjcF9kZWNsaW5lKG5ldGlmKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBEZWNsaW5lIGFuIG9mZmVyZWQgbGVhc2UuCisgKgorICogVGVsbCB0aGUgREhDUCBzZXJ2ZXIgd2UgZG8gbm90IGFjY2VwdCB0aGUgb2ZmZXJlZCBhZGRyZXNzLgorICogT25lIHJlYXNvbiB0byBkZWNsaW5lIHRoZSBsZWFzZSBpcyB3aGVuIHdlIGZpbmQgb3V0IHRoZSBhZGRyZXNzCisgKiBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIGhvc3QgKHRocm91Z2ggQVJQKS4KKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldGlmIHVuZGVyIERIQ1AgY29udHJvbAorICovCitzdGF0aWMgZXJyX3QKK2RoY3BfZGVjbGluZShzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZGhjcCAqZGhjcCA9IG5ldGlmLT5kaGNwOworICBlcnJfdCByZXN1bHQgPSBFUlJfT0s7CisgIHUxNl90IG1zZWNzOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9kZWNsaW5lKClcbiIpKTsKKyAgZGhjcF9zZXRfc3RhdGUoZGhjcCwgREhDUF9CQUNLSU5HX09GRik7CisgIC8qIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgREhDUCBtZXNzYWdlIGhlYWRlciAqLworICByZXN1bHQgPSBkaGNwX2NyZWF0ZV9tc2cobmV0aWYsIGRoY3AsIERIQ1BfREVDTElORSk7CisgIGlmIChyZXN1bHQgPT0gRVJSX09LKSB7CisgICAgZGhjcF9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fUkVRVUVTVEVEX0lQLCA0KTsKKyAgICBkaGNwX29wdGlvbl9sb25nKGRoY3AsIG50b2hsKGlwNF9hZGRyX2dldF91MzIoJmRoY3AtPm9mZmVyZWRfaXBfYWRkcikpKTsKKworICAgIGRoY3Bfb3B0aW9uX3RyYWlsZXIoZGhjcCk7CisgICAgLyogcmVzaXplIHBidWYgdG8gcmVmbGVjdCB0cnVlIHNpemUgb2Ygb3B0aW9ucyAqLworICAgIHBidWZfcmVhbGxvYyhkaGNwLT5wX291dCwgc2l6ZW9mKHN0cnVjdCBkaGNwX21zZykgLSBESENQX09QVElPTlNfTEVOICsgZGhjcC0+b3B0aW9uc19vdXRfbGVuKTsKKworICAgIC8qIHBlciBzZWN0aW9uIDQuNC40LCBicm9hZGNhc3QgREVDTElORSBtZXNzYWdlcyAqLworICAgIHVkcF9zZW5kdG9faWYoZGhjcC0+cGNiLCBkaGNwLT5wX291dCwgSVBfQUREUl9CUk9BRENBU1QsIERIQ1BfU0VSVkVSX1BPUlQsIG5ldGlmKTsKKyAgICBkaGNwX2RlbGV0ZV9tc2coZGhjcCk7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9kZWNsaW5lOiBCQUNLSU5HIE9GRlxuIikpOworICB9IGVsc2UgeworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsCisgICAgICAoImRoY3BfZGVjbGluZTogY291bGQgbm90IGFsbG9jYXRlIERIQ1AgcmVxdWVzdFxuIikpOworICB9CisgIGRoY3AtPnRyaWVzKys7CisgIG1zZWNzID0gMTAqMTAwMDsKKyAgZGhjcC0+cmVxdWVzdF90aW1lb3V0ID0gKG1zZWNzICsgREhDUF9GSU5FX1RJTUVSX01TRUNTIC0gMSkgLyBESENQX0ZJTkVfVElNRVJfTVNFQ1M7CisgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJkaGNwX2RlY2xpbmUoKTogc2V0IHJlcXVlc3QgdGltZW91dCAlIlUxNl9GIiBtc2Vjc1xuIiwgbXNlY3MpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvKiBESENQX0RPRVNfQVJQX0NIRUNLICovCisKKworLyoqCisgKiBTdGFydCB0aGUgREhDUCBwcm9jZXNzLCBkaXNjb3ZlciBhIERIQ1Agc2VydmVyLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbmV0aWYgdW5kZXIgREhDUCBjb250cm9sCisgKi8KK3N0YXRpYyBlcnJfdAorZGhjcF9kaXNjb3ZlcihzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZGhjcCAqZGhjcCA9IG5ldGlmLT5kaGNwOworICBlcnJfdCByZXN1bHQgPSBFUlJfT0s7CisgIHUxNl90IG1zZWNzOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9kaXNjb3ZlcigpXG4iKSk7CisgIGlwX2FkZHJfc2V0X2FueSgmZGhjcC0+b2ZmZXJlZF9pcF9hZGRyKTsKKyAgZGhjcF9zZXRfc3RhdGUoZGhjcCwgREhDUF9TRUxFQ1RJTkcpOworICAvKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIERIQ1AgbWVzc2FnZSBoZWFkZXIgKi8KKyAgcmVzdWx0ID0gZGhjcF9jcmVhdGVfbXNnKG5ldGlmLCBkaGNwLCBESENQX0RJU0NPVkVSKTsKKyAgaWYgKHJlc3VsdCA9PSBFUlJfT0spIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9kaXNjb3ZlcjogbWFraW5nIHJlcXVlc3RcbiIpKTsKKworICAgIGRoY3Bfb3B0aW9uKGRoY3AsIERIQ1BfT1BUSU9OX01BWF9NU0dfU0laRSwgREhDUF9PUFRJT05fTUFYX01TR19TSVpFX0xFTik7CisgICAgZGhjcF9vcHRpb25fc2hvcnQoZGhjcCwgREhDUF9NQVhfTVNHX0xFTihuZXRpZikpOworCisgICAgZGhjcF9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fUEFSQU1FVEVSX1JFUVVFU1RfTElTVCwgNC8qbnVtIG9wdGlvbnMqLyk7CisgICAgZGhjcF9vcHRpb25fYnl0ZShkaGNwLCBESENQX09QVElPTl9TVUJORVRfTUFTSyk7CisgICAgZGhjcF9vcHRpb25fYnl0ZShkaGNwLCBESENQX09QVElPTl9ST1VURVIpOworICAgIGRoY3Bfb3B0aW9uX2J5dGUoZGhjcCwgREhDUF9PUFRJT05fQlJPQURDQVNUKTsKKyAgICBkaGNwX29wdGlvbl9ieXRlKGRoY3AsIERIQ1BfT1BUSU9OX0ROU19TRVJWRVIpOworCisgICAgZGhjcF9vcHRpb25fdHJhaWxlcihkaGNwKTsKKworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJkaGNwX2Rpc2NvdmVyOiByZWFsbG9jKClpbmdcbiIpKTsKKyAgICBwYnVmX3JlYWxsb2MoZGhjcC0+cF9vdXQsIHNpemVvZihzdHJ1Y3QgZGhjcF9tc2cpIC0gREhDUF9PUFRJT05TX0xFTiArIGRoY3AtPm9wdGlvbnNfb3V0X2xlbik7CisKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9kaXNjb3Zlcjogc2VuZHRvKERJU0NPVkVSLCBJUF9BRERSX0JST0FEQ0FTVCwgREhDUF9TRVJWRVJfUE9SVClcbiIpKTsKKyAgICB1ZHBfc2VuZHRvX2lmKGRoY3AtPnBjYiwgZGhjcC0+cF9vdXQsIElQX0FERFJfQlJPQURDQVNULCBESENQX1NFUlZFUl9QT1JULCBuZXRpZik7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImRoY3BfZGlzY292ZXI6IGRlbGV0aW5nKClpbmdcbiIpKTsKKyAgICBkaGNwX2RlbGV0ZV9tc2coZGhjcCk7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9kaXNjb3ZlcjogU0VMRUNUSU5HXG4iKSk7CisgIH0gZWxzZSB7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfU0VSSU9VUywgKCJkaGNwX2Rpc2NvdmVyOiBjb3VsZCBub3QgYWxsb2NhdGUgREhDUCByZXF1ZXN0XG4iKSk7CisgIH0KKyAgZGhjcC0+dHJpZXMrKzsKKyNpZiBMV0lQX0RIQ1BfQVVUT0lQX0NPT1AKKyAgaWYoZGhjcC0+dHJpZXMgPj0gTFdJUF9ESENQX0FVVE9JUF9DT09QX1RSSUVTICYmIGRoY3AtPmF1dG9pcF9jb29wX3N0YXRlID09IERIQ1BfQVVUT0lQX0NPT1BfU1RBVEVfT0ZGKSB7CisgICAgZGhjcC0+YXV0b2lwX2Nvb3Bfc3RhdGUgPSBESENQX0FVVE9JUF9DT09QX1NUQVRFX09OOworICAgIGF1dG9pcF9zdGFydChuZXRpZik7CisgIH0KKyNlbmRpZiAvKiBMV0lQX0RIQ1BfQVVUT0lQX0NPT1AgKi8KKyAgbXNlY3MgPSAoZGhjcC0+dHJpZXMgPCA2ID8gMSA8PCBkaGNwLT50cmllcyA6IDYwKSAqIDEwMDA7CisgIGRoY3AtPnJlcXVlc3RfdGltZW91dCA9IChtc2VjcyArIERIQ1BfRklORV9USU1FUl9NU0VDUyAtIDEpIC8gREhDUF9GSU5FX1RJTUVSX01TRUNTOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX2Rpc2NvdmVyKCk6IHNldCByZXF1ZXN0IHRpbWVvdXQgJSJVMTZfRiIgbXNlY3NcbiIsIG1zZWNzKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiBCaW5kIHRoZSBpbnRlcmZhY2UgdG8gdGhlIG9mZmVyZWQgSVAgYWRkcmVzcy4KKyAqCisgKiBAcGFyYW0gbmV0aWYgbmV0d29yayBpbnRlcmZhY2UgdG8gYmluZCB0byB0aGUgb2ZmZXJlZCBhZGRyZXNzCisgKi8KK3N0YXRpYyB2b2lkCitkaGNwX2JpbmQoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgdTMyX3QgdGltZW91dDsKKyAgc3RydWN0IGRoY3AgKmRoY3A7CisgIGlwX2FkZHJfdCBzbl9tYXNrLCBnd19hZGRyOworICBMV0lQX0VSUk9SKCJkaGNwX2JpbmQ6IG5ldGlmICE9IE5VTEwiLCAobmV0aWYgIT0gTlVMTCksIHJldHVybjspOworICBkaGNwID0gbmV0aWYtPmRoY3A7CisgIExXSVBfRVJST1IoImRoY3BfYmluZDogZGhjcCAhPSBOVUxMIiwgKGRoY3AgIT0gTlVMTCksIHJldHVybjspOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9iaW5kKG5ldGlmPSVwKSAlYyVjJSJVMTZfRiJcbiIsICh2b2lkKiluZXRpZiwgbmV0aWYtPm5hbWVbMF0sIG5ldGlmLT5uYW1lWzFdLCAodTE2X3QpbmV0aWYtPm51bSkpOworCisgIC8qIHRlbXBvcmFyeSBESENQIGxlYXNlPyAqLworICBpZiAoZGhjcC0+b2ZmZXJlZF90MV9yZW5ldyAhPSAweGZmZmZmZmZmVUwpIHsKKyAgICAvKiBzZXQgcmVuZXdhbCBwZXJpb2QgdGltZXIgKi8KKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9iaW5kKCk6IHQxIHJlbmV3YWwgdGltZXIgJSJVMzJfRiIgc2Vjc1xuIiwgZGhjcC0+b2ZmZXJlZF90MV9yZW5ldykpOworICAgIHRpbWVvdXQgPSAoZGhjcC0+b2ZmZXJlZF90MV9yZW5ldyArIERIQ1BfQ09BUlNFX1RJTUVSX1NFQ1MgLyAyKSAvIERIQ1BfQ09BUlNFX1RJTUVSX1NFQ1M7CisgICAgaWYodGltZW91dCA+IDB4ZmZmZikgeworICAgICAgdGltZW91dCA9IDB4ZmZmZjsKKyAgICB9CisgICAgZGhjcC0+dDFfdGltZW91dCA9ICh1MTZfdCl0aW1lb3V0OworICAgIGlmIChkaGNwLT50MV90aW1lb3V0ID09IDApIHsKKyAgICAgIGRoY3AtPnQxX3RpbWVvdXQgPSAxOworICAgIH0KKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX2JpbmQoKTogc2V0IHJlcXVlc3QgdGltZW91dCAlIlUzMl9GIiBtc2Vjc1xuIiwgZGhjcC0+b2ZmZXJlZF90MV9yZW5ldyoxMDAwKSk7CisgIH0KKyAgLyogc2V0IHJlbmV3YWwgcGVyaW9kIHRpbWVyICovCisgIGlmIChkaGNwLT5vZmZlcmVkX3QyX3JlYmluZCAhPSAweGZmZmZmZmZmVUwpIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9iaW5kKCk6IHQyIHJlYmluZCB0aW1lciAlIlUzMl9GIiBzZWNzXG4iLCBkaGNwLT5vZmZlcmVkX3QyX3JlYmluZCkpOworICAgIHRpbWVvdXQgPSAoZGhjcC0+b2ZmZXJlZF90Ml9yZWJpbmQgKyBESENQX0NPQVJTRV9USU1FUl9TRUNTIC8gMikgLyBESENQX0NPQVJTRV9USU1FUl9TRUNTOworICAgIGlmKHRpbWVvdXQgPiAweGZmZmYpIHsKKyAgICAgIHRpbWVvdXQgPSAweGZmZmY7CisgICAgfQorICAgIGRoY3AtPnQyX3RpbWVvdXQgPSAodTE2X3QpdGltZW91dDsKKyAgICBpZiAoZGhjcC0+dDJfdGltZW91dCA9PSAwKSB7CisgICAgICBkaGNwLT50Ml90aW1lb3V0ID0gMTsKKyAgICB9CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9iaW5kKCk6IHNldCByZXF1ZXN0IHRpbWVvdXQgJSJVMzJfRiIgbXNlY3NcbiIsIGRoY3AtPm9mZmVyZWRfdDJfcmViaW5kKjEwMDApKTsKKyAgfQorCisgIGlmIChkaGNwLT5zdWJuZXRfbWFza19naXZlbikgeworICAgIC8qIGNvcHkgb2ZmZXJlZCBuZXR3b3JrIG1hc2sgKi8KKyAgICBpcF9hZGRyX2NvcHkoc25fbWFzaywgZGhjcC0+b2ZmZXJlZF9zbl9tYXNrKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBzdWJuZXQgbWFzayBub3QgZ2l2ZW4sIGNob29zZSBhIHNhZmUgc3VibmV0IG1hc2sgZ2l2ZW4gdGhlIG5ldHdvcmsgY2xhc3MgKi8KKyAgICB1OF90IGZpcnN0X29jdGV0ID0gaXA0X2FkZHIxKCZkaGNwLT5vZmZlcmVkX2lwX2FkZHIpOworICAgIGlmIChmaXJzdF9vY3RldCA8PSAxMjcpIHsKKyAgICAgIGlwNF9hZGRyX3NldF91MzIoJnNuX21hc2ssIFBQX0hUT05MKDB4ZmYwMDAwMDBVTCkpOworICAgIH0gZWxzZSBpZiAoZmlyc3Rfb2N0ZXQgPj0gMTkyKSB7CisgICAgICBpcDRfYWRkcl9zZXRfdTMyKCZzbl9tYXNrLCBQUF9IVE9OTCgweGZmZmZmZjAwVUwpKTsKKyAgICB9IGVsc2UgeworICAgICAgaXA0X2FkZHJfc2V0X3UzMigmc25fbWFzaywgUFBfSFRPTkwoMHhmZmZmMDAwMFVMKSk7CisgICAgfQorICB9CisKKyAgaXBfYWRkcl9jb3B5KGd3X2FkZHIsIGRoY3AtPm9mZmVyZWRfZ3dfYWRkcik7CisgIC8qIGdhdGV3YXkgYWRkcmVzcyBub3QgZ2l2ZW4/ICovCisgIGlmIChpcF9hZGRyX2lzYW55KCZnd19hZGRyKSkgeworICAgIC8qIGNvcHkgbmV0d29yayBhZGRyZXNzICovCisgICAgaXBfYWRkcl9nZXRfbmV0d29yaygmZ3dfYWRkciwgJmRoY3AtPm9mZmVyZWRfaXBfYWRkciwgJnNuX21hc2spOworICAgIC8qIHVzZSBmaXJzdCBob3N0IGFkZHJlc3Mgb24gbmV0d29yayBhcyBnYXRld2F5ICovCisgICAgaXA0X2FkZHJfc2V0X3UzMigmZ3dfYWRkciwgaXA0X2FkZHJfZ2V0X3UzMigmZ3dfYWRkcikgfCBQUF9IVE9OTCgweDAwMDAwMDAxVUwpKTsKKyAgfQorCisjaWYgTFdJUF9ESENQX0FVVE9JUF9DT09QCisgIGlmKGRoY3AtPmF1dG9pcF9jb29wX3N0YXRlID09IERIQ1BfQVVUT0lQX0NPT1BfU1RBVEVfT04pIHsKKyAgICBhdXRvaXBfc3RvcChuZXRpZik7CisgICAgZGhjcC0+YXV0b2lwX2Nvb3Bfc3RhdGUgPSBESENQX0FVVE9JUF9DT09QX1NUQVRFX09GRjsKKyAgfQorI2VuZGlmIC8qIExXSVBfREhDUF9BVVRPSVBfQ09PUCAqLworCisgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX2JpbmQoKTogSVA6IDB4JTA4IlgzMl9GIlxuIiwKKyAgICBpcDRfYWRkcl9nZXRfdTMyKCZkaGNwLT5vZmZlcmVkX2lwX2FkZHIpKSk7CisgIG5ldGlmX3NldF9pcGFkZHIobmV0aWYsICZkaGNwLT5vZmZlcmVkX2lwX2FkZHIpOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9iaW5kKCk6IFNOOiAweCUwOCJYMzJfRiJcbiIsCisgICAgaXA0X2FkZHJfZ2V0X3UzMigmc25fbWFzaykpKTsKKyAgbmV0aWZfc2V0X25ldG1hc2sobmV0aWYsICZzbl9tYXNrKTsKKyAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1NUQVRFLCAoImRoY3BfYmluZCgpOiBHVzogMHglMDgiWDMyX0YiXG4iLAorICAgIGlwNF9hZGRyX2dldF91MzIoJmd3X2FkZHIpKSk7CisgIG5ldGlmX3NldF9ndyhuZXRpZiwgJmd3X2FkZHIpOworICAvKiBicmluZyB0aGUgaW50ZXJmYWNlIHVwICovCisgIG5ldGlmX3NldF91cChuZXRpZik7CisgIC8qIG5ldGlmIGlzIG5vdyBib3VuZCB0byBESENQIGxlYXNlZCBhZGRyZXNzICovCisgIGRoY3Bfc2V0X3N0YXRlKGRoY3AsIERIQ1BfQk9VTkQpOworfQorCisvKioKKyAqIFJlbmV3IGFuIGV4aXN0aW5nIERIQ1AgbGVhc2UgYXQgdGhlIGludm9sdmVkIERIQ1Agc2VydmVyLgorICoKKyAqIEBwYXJhbSBuZXRpZiBuZXR3b3JrIGludGVyZmFjZSB3aGljaCBtdXN0IHJlbmV3IGl0cyBsZWFzZQorICovCitlcnJfdAorZGhjcF9yZW5ldyhzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZGhjcCAqZGhjcCA9IG5ldGlmLT5kaGNwOworICBlcnJfdCByZXN1bHQ7CisgIHUxNl90IG1zZWNzOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9yZW5ldygpXG4iKSk7CisgIGRoY3Bfc2V0X3N0YXRlKGRoY3AsIERIQ1BfUkVORVdJTkcpOworCisgIC8qIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgREhDUCBtZXNzYWdlIGhlYWRlciAqLworICByZXN1bHQgPSBkaGNwX2NyZWF0ZV9tc2cobmV0aWYsIGRoY3AsIERIQ1BfUkVRVUVTVCk7CisgIGlmIChyZXN1bHQgPT0gRVJSX09LKSB7CisgICAgZGhjcF9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fTUFYX01TR19TSVpFLCBESENQX09QVElPTl9NQVhfTVNHX1NJWkVfTEVOKTsKKyAgICBkaGNwX29wdGlvbl9zaG9ydChkaGNwLCBESENQX01BWF9NU0dfTEVOKG5ldGlmKSk7CisKKyNpZiBMV0lQX05FVElGX0hPU1ROQU1FCisgICAgaWYgKG5ldGlmLT5ob3N0bmFtZSAhPSBOVUxMKSB7CisgICAgICBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIqKW5ldGlmLT5ob3N0bmFtZTsKKyAgICAgIHU4X3QgbmFtZWxlbiA9ICh1OF90KXN0cmxlbihwKTsKKyAgICAgIGlmIChuYW1lbGVuID4gMCkgeworICAgICAgICBMV0lQX0FTU0VSVCgiREhDUDogaG9zdG5hbWUgaXMgdG9vIGxvbmchIiwgbmFtZWxlbiA8IDI1NSk7CisgICAgICAgIGRoY3Bfb3B0aW9uKGRoY3AsIERIQ1BfT1BUSU9OX0hPU1ROQU1FLCBuYW1lbGVuKTsKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgZGhjcF9vcHRpb25fYnl0ZShkaGNwLCAqcCsrKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBMV0lQX05FVElGX0hPU1ROQU1FICovCisKKyNpZiAwCisgICAgZGhjcF9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fUkVRVUVTVEVEX0lQLCA0KTsKKyAgICBkaGNwX29wdGlvbl9sb25nKGRoY3AsIG50b2hsKGRoY3AtPm9mZmVyZWRfaXBfYWRkci5hZGRyKSk7CisjZW5kaWYKKworI2lmIDAKKyAgICBkaGNwX29wdGlvbihkaGNwLCBESENQX09QVElPTl9TRVJWRVJfSUQsIDQpOworICAgIGRoY3Bfb3B0aW9uX2xvbmcoZGhjcCwgbnRvaGwoZGhjcC0+c2VydmVyX2lwX2FkZHIuYWRkcikpOworI2VuZGlmCisgICAgLyogYXBwZW5kIERIQ1AgbWVzc2FnZSB0cmFpbGVyICovCisgICAgZGhjcF9vcHRpb25fdHJhaWxlcihkaGNwKTsKKworICAgIHBidWZfcmVhbGxvYyhkaGNwLT5wX291dCwgc2l6ZW9mKHN0cnVjdCBkaGNwX21zZykgLSBESENQX09QVElPTlNfTEVOICsgZGhjcC0+b3B0aW9uc19vdXRfbGVuKTsKKworICAgIHVkcF9zZW5kdG9faWYoZGhjcC0+cGNiLCBkaGNwLT5wX291dCwgJmRoY3AtPnNlcnZlcl9pcF9hZGRyLCBESENQX1NFUlZFUl9QT1JULCBuZXRpZik7CisgICAgZGhjcF9kZWxldGVfbXNnKGRoY3ApOworCisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9yZW5ldzogUkVORVdJTkdcbiIpKTsKKyAgfSBlbHNlIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLCAoImRoY3BfcmVuZXc6IGNvdWxkIG5vdCBhbGxvY2F0ZSBESENQIHJlcXVlc3RcbiIpKTsKKyAgfQorICBkaGNwLT50cmllcysrOworICAvKiBiYWNrLW9mZiBvbiByZXRyaWVzLCBidXQgdG8gYSBtYXhpbXVtIG9mIDIwIHNlY29uZHMgKi8KKyAgbXNlY3MgPSBkaGNwLT50cmllcyA8IDEwID8gZGhjcC0+dHJpZXMgKiAyMDAwIDogMjAgKiAxMDAwOworICBkaGNwLT5yZXF1ZXN0X3RpbWVvdXQgPSAobXNlY3MgKyBESENQX0ZJTkVfVElNRVJfTVNFQ1MgLSAxKSAvIERIQ1BfRklORV9USU1FUl9NU0VDUzsKKyAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9yZW5ldygpOiBzZXQgcmVxdWVzdCB0aW1lb3V0ICUiVTE2X0YiIG1zZWNzXG4iLCBtc2VjcykpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlYmluZCB3aXRoIGEgREhDUCBzZXJ2ZXIgZm9yIGFuIGV4aXN0aW5nIERIQ1AgbGVhc2UuCisgKgorICogQHBhcmFtIG5ldGlmIG5ldHdvcmsgaW50ZXJmYWNlIHdoaWNoIG11c3QgcmViaW5kIHdpdGggYSBESENQIHNlcnZlcgorICovCitzdGF0aWMgZXJyX3QKK2RoY3BfcmViaW5kKHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBkaGNwICpkaGNwID0gbmV0aWYtPmRoY3A7CisgIGVycl90IHJlc3VsdDsKKyAgdTE2X3QgbXNlY3M7CisgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLCAoImRoY3BfcmViaW5kKClcbiIpKTsKKyAgZGhjcF9zZXRfc3RhdGUoZGhjcCwgREhDUF9SRUJJTkRJTkcpOworCisgIC8qIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgREhDUCBtZXNzYWdlIGhlYWRlciAqLworICByZXN1bHQgPSBkaGNwX2NyZWF0ZV9tc2cobmV0aWYsIGRoY3AsIERIQ1BfUkVRVUVTVCk7CisgIGlmIChyZXN1bHQgPT0gRVJSX09LKSB7CisgICAgZGhjcF9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fTUFYX01TR19TSVpFLCBESENQX09QVElPTl9NQVhfTVNHX1NJWkVfTEVOKTsKKyAgICBkaGNwX29wdGlvbl9zaG9ydChkaGNwLCBESENQX01BWF9NU0dfTEVOKG5ldGlmKSk7CisKKyNpZiBMV0lQX05FVElGX0hPU1ROQU1FCisgICAgaWYgKG5ldGlmLT5ob3N0bmFtZSAhPSBOVUxMKSB7CisgICAgICBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIqKW5ldGlmLT5ob3N0bmFtZTsKKyAgICAgIHU4X3QgbmFtZWxlbiA9ICh1OF90KXN0cmxlbihwKTsKKyAgICAgIGlmIChuYW1lbGVuID4gMCkgeworICAgICAgICBMV0lQX0FTU0VSVCgiREhDUDogaG9zdG5hbWUgaXMgdG9vIGxvbmchIiwgbmFtZWxlbiA8IDI1NSk7CisgICAgICAgIGRoY3Bfb3B0aW9uKGRoY3AsIERIQ1BfT1BUSU9OX0hPU1ROQU1FLCBuYW1lbGVuKTsKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgZGhjcF9vcHRpb25fYnl0ZShkaGNwLCAqcCsrKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBMV0lQX05FVElGX0hPU1ROQU1FICovCisKKyNpZiAwCisgICAgZGhjcF9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fUkVRVUVTVEVEX0lQLCA0KTsKKyAgICBkaGNwX29wdGlvbl9sb25nKGRoY3AsIG50b2hsKGRoY3AtPm9mZmVyZWRfaXBfYWRkci5hZGRyKSk7CisKKyAgICBkaGNwX29wdGlvbihkaGNwLCBESENQX09QVElPTl9TRVJWRVJfSUQsIDQpOworICAgIGRoY3Bfb3B0aW9uX2xvbmcoZGhjcCwgbnRvaGwoZGhjcC0+c2VydmVyX2lwX2FkZHIuYWRkcikpOworI2VuZGlmCisKKyAgICBkaGNwX29wdGlvbl90cmFpbGVyKGRoY3ApOworCisgICAgcGJ1Zl9yZWFsbG9jKGRoY3AtPnBfb3V0LCBzaXplb2Yoc3RydWN0IGRoY3BfbXNnKSAtIERIQ1BfT1BUSU9OU19MRU4gKyBkaGNwLT5vcHRpb25zX291dF9sZW4pOworCisgICAgLyogYnJvYWRjYXN0IHRvIHNlcnZlciAqLworICAgIHVkcF9zZW5kdG9faWYoZGhjcC0+cGNiLCBkaGNwLT5wX291dCwgSVBfQUREUl9CUk9BRENBU1QsIERIQ1BfU0VSVkVSX1BPUlQsIG5ldGlmKTsKKyAgICBkaGNwX2RlbGV0ZV9tc2coZGhjcCk7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9yZWJpbmQ6IFJFQklORElOR1xuIikpOworICB9IGVsc2UgeworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsICgiZGhjcF9yZWJpbmQ6IGNvdWxkIG5vdCBhbGxvY2F0ZSBESENQIHJlcXVlc3RcbiIpKTsKKyAgfQorICBkaGNwLT50cmllcysrOworICBtc2VjcyA9IGRoY3AtPnRyaWVzIDwgMTAgPyBkaGNwLT50cmllcyAqIDEwMDAgOiAxMCAqIDEwMDA7CisgIGRoY3AtPnJlcXVlc3RfdGltZW91dCA9IChtc2VjcyArIERIQ1BfRklORV9USU1FUl9NU0VDUyAtIDEpIC8gREhDUF9GSU5FX1RJTUVSX01TRUNTOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3JlYmluZCgpOiBzZXQgcmVxdWVzdCB0aW1lb3V0ICUiVTE2X0YiIG1zZWNzXG4iLCBtc2VjcykpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEVudGVyIFJFQk9PVElORyBzdGF0ZSB0byB2ZXJpZnkgYW4gZXhpc3RpbmcgbGVhc2UKKyAqCisgKiBAcGFyYW0gbmV0aWYgbmV0d29yayBpbnRlcmZhY2Ugd2hpY2ggbXVzdCByZWJvb3QKKyAqLworc3RhdGljIGVycl90CitkaGNwX3JlYm9vdChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZGhjcCAqZGhjcCA9IG5ldGlmLT5kaGNwOworICBlcnJfdCByZXN1bHQ7CisgIHUxNl90IG1zZWNzOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3JlYm9vdCgpXG4iKSk7CisgIGRoY3Bfc2V0X3N0YXRlKGRoY3AsIERIQ1BfUkVCT09USU5HKTsKKworICAvKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIERIQ1AgbWVzc2FnZSBoZWFkZXIgKi8KKyAgcmVzdWx0ID0gZGhjcF9jcmVhdGVfbXNnKG5ldGlmLCBkaGNwLCBESENQX1JFUVVFU1QpOworICBpZiAocmVzdWx0ID09IEVSUl9PSykgeworICAgIGRoY3Bfb3B0aW9uKGRoY3AsIERIQ1BfT1BUSU9OX01BWF9NU0dfU0laRSwgREhDUF9PUFRJT05fTUFYX01TR19TSVpFX0xFTik7CisgICAgZGhjcF9vcHRpb25fc2hvcnQoZGhjcCwgNTc2KTsKKworICAgIGRoY3Bfb3B0aW9uKGRoY3AsIERIQ1BfT1BUSU9OX1JFUVVFU1RFRF9JUCwgNCk7CisgICAgZGhjcF9vcHRpb25fbG9uZyhkaGNwLCBudG9obChpcDRfYWRkcl9nZXRfdTMyKCZkaGNwLT5vZmZlcmVkX2lwX2FkZHIpKSk7CisKKyAgICBkaGNwX29wdGlvbl90cmFpbGVyKGRoY3ApOworCisgICAgcGJ1Zl9yZWFsbG9jKGRoY3AtPnBfb3V0LCBzaXplb2Yoc3RydWN0IGRoY3BfbXNnKSAtIERIQ1BfT1BUSU9OU19MRU4gKyBkaGNwLT5vcHRpb25zX291dF9sZW4pOworCisgICAgLyogYnJvYWRjYXN0IHRvIHNlcnZlciAqLworICAgIHVkcF9zZW5kdG9faWYoZGhjcC0+cGNiLCBkaGNwLT5wX291dCwgSVBfQUREUl9CUk9BRENBU1QsIERIQ1BfU0VSVkVSX1BPUlQsIG5ldGlmKTsKKyAgICBkaGNwX2RlbGV0ZV9tc2coZGhjcCk7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9yZWJvb3Q6IFJFQk9PVElOR1xuIikpOworICB9IGVsc2UgeworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsICgiZGhjcF9yZWJvb3Q6IGNvdWxkIG5vdCBhbGxvY2F0ZSBESENQIHJlcXVlc3RcbiIpKTsKKyAgfQorICBkaGNwLT50cmllcysrOworICBtc2VjcyA9IGRoY3AtPnRyaWVzIDwgMTAgPyBkaGNwLT50cmllcyAqIDEwMDAgOiAxMCAqIDEwMDA7CisgIGRoY3AtPnJlcXVlc3RfdGltZW91dCA9IChtc2VjcyArIERIQ1BfRklORV9USU1FUl9NU0VDUyAtIDEpIC8gREhDUF9GSU5FX1RJTUVSX01TRUNTOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3JlYm9vdCgpOiBzZXQgcmVxdWVzdCB0aW1lb3V0ICUiVTE2X0YiIG1zZWNzXG4iLCBtc2VjcykpOworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogUmVsZWFzZSBhIERIQ1AgbGVhc2UuCisgKgorICogQHBhcmFtIG5ldGlmIG5ldHdvcmsgaW50ZXJmYWNlIHdoaWNoIG11c3QgcmVsZWFzZSBpdHMgbGVhc2UKKyAqLworZXJyX3QKK2RoY3BfcmVsZWFzZShzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZGhjcCAqZGhjcCA9IG5ldGlmLT5kaGNwOworICBlcnJfdCByZXN1bHQ7CisgIHUxNl90IG1zZWNzOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9yZWxlYXNlKClcbiIpKTsKKworICAvKiBpZGxlIERIQ1AgY2xpZW50ICovCisgIGRoY3Bfc2V0X3N0YXRlKGRoY3AsIERIQ1BfT0ZGKTsKKyAgLyogY2xlYW4gb2xkIERIQ1Agb2ZmZXIgKi8KKyAgaXBfYWRkcl9zZXRfemVybygmZGhjcC0+c2VydmVyX2lwX2FkZHIpOworICBpcF9hZGRyX3NldF96ZXJvKCZkaGNwLT5vZmZlcmVkX2lwX2FkZHIpOworICBpcF9hZGRyX3NldF96ZXJvKCZkaGNwLT5vZmZlcmVkX3NuX21hc2spOworICBpcF9hZGRyX3NldF96ZXJvKCZkaGNwLT5vZmZlcmVkX2d3X2FkZHIpOworI2lmIExXSVBfREhDUF9CT09UUF9GSUxFCisgIGlwX2FkZHJfc2V0X3plcm8oJmRoY3AtPm9mZmVyZWRfc2lfYWRkcik7CisjZW5kaWYgLyogTFdJUF9ESENQX0JPT1RQX0ZJTEUgKi8KKyAgZGhjcC0+b2ZmZXJlZF90MF9sZWFzZSA9IGRoY3AtPm9mZmVyZWRfdDFfcmVuZXcgPSBkaGNwLT5vZmZlcmVkX3QyX3JlYmluZCA9IDA7CisgIAorICAvKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIERIQ1AgbWVzc2FnZSBoZWFkZXIgKi8KKyAgcmVzdWx0ID0gZGhjcF9jcmVhdGVfbXNnKG5ldGlmLCBkaGNwLCBESENQX1JFTEVBU0UpOworICBpZiAocmVzdWx0ID09IEVSUl9PSykgeworICAgIGRoY3Bfb3B0aW9uX3RyYWlsZXIoZGhjcCk7CisKKyAgICBwYnVmX3JlYWxsb2MoZGhjcC0+cF9vdXQsIHNpemVvZihzdHJ1Y3QgZGhjcF9tc2cpIC0gREhDUF9PUFRJT05TX0xFTiArIGRoY3AtPm9wdGlvbnNfb3V0X2xlbik7CisKKyAgICB1ZHBfc2VuZHRvX2lmKGRoY3AtPnBjYiwgZGhjcC0+cF9vdXQsICZkaGNwLT5zZXJ2ZXJfaXBfYWRkciwgREhDUF9TRVJWRVJfUE9SVCwgbmV0aWYpOworICAgIGRoY3BfZGVsZXRlX21zZyhkaGNwKTsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJkaGNwX3JlbGVhc2U6IFJFTEVBU0VELCBESENQX09GRlxuIikpOworICB9IGVsc2UgeworICAgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsICgiZGhjcF9yZWxlYXNlOiBjb3VsZCBub3QgYWxsb2NhdGUgREhDUCByZXF1ZXN0XG4iKSk7CisgIH0KKyAgZGhjcC0+dHJpZXMrKzsKKyAgbXNlY3MgPSBkaGNwLT50cmllcyA8IDEwID8gZGhjcC0+dHJpZXMgKiAxMDAwIDogMTAgKiAxMDAwOworICBkaGNwLT5yZXF1ZXN0X3RpbWVvdXQgPSAobXNlY3MgKyBESENQX0ZJTkVfVElNRVJfTVNFQ1MgLSAxKSAvIERIQ1BfRklORV9USU1FUl9NU0VDUzsKKyAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgiZGhjcF9yZWxlYXNlKCk6IHNldCByZXF1ZXN0IHRpbWVvdXQgJSJVMTZfRiIgbXNlY3NcbiIsIG1zZWNzKSk7CisgIC8qIGJyaW5nIHRoZSBpbnRlcmZhY2UgZG93biAqLworICBuZXRpZl9zZXRfZG93bihuZXRpZik7CisgIC8qIHJlbW92ZSBJUCBhZGRyZXNzIGZyb20gaW50ZXJmYWNlICovCisgIG5ldGlmX3NldF9pcGFkZHIobmV0aWYsIElQX0FERFJfQU5ZKTsKKyAgbmV0aWZfc2V0X2d3KG5ldGlmLCBJUF9BRERSX0FOWSk7CisgIG5ldGlmX3NldF9uZXRtYXNrKG5ldGlmLCBJUF9BRERSX0FOWSk7CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbW92ZSB0aGUgREhDUCBjbGllbnQgZnJvbSB0aGUgaW50ZXJmYWNlLgorICoKKyAqIEBwYXJhbSBuZXRpZiBUaGUgbmV0d29yayBpbnRlcmZhY2UgdG8gc3RvcCBESENQIG9uCisgKi8KK3ZvaWQKK2RoY3Bfc3RvcChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZGhjcCAqZGhjcDsKKyAgTFdJUF9FUlJPUigiZGhjcF9zdG9wOiBuZXRpZiAhPSBOVUxMIiwgKG5ldGlmICE9IE5VTEwpLCByZXR1cm47KTsKKyAgZGhjcCA9IG5ldGlmLT5kaGNwOworICAvKiBSZW1vdmUgdGhlIGZsYWcgdGhhdCBzYXlzIHRoaXMgbmV0aWYgaXMgaGFuZGxlZCBieSBESENQLiAqLworICBuZXRpZi0+ZmxhZ3MgJj0gfk5FVElGX0ZMQUdfREhDUDsKKworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZGhjcF9zdG9wKClcbiIpKTsKKyAgLyogbmV0aWYgaXMgREhDUCBjb25maWd1cmVkPyAqLworICBpZiAoZGhjcCAhPSBOVUxMKSB7CisjaWYgTFdJUF9ESENQX0FVVE9JUF9DT09QCisgICAgaWYoZGhjcC0+YXV0b2lwX2Nvb3Bfc3RhdGUgPT0gREhDUF9BVVRPSVBfQ09PUF9TVEFURV9PTikgeworICAgICAgYXV0b2lwX3N0b3AobmV0aWYpOworICAgICAgZGhjcC0+YXV0b2lwX2Nvb3Bfc3RhdGUgPSBESENQX0FVVE9JUF9DT09QX1NUQVRFX09GRjsKKyAgICB9CisjZW5kaWYgLyogTFdJUF9ESENQX0FVVE9JUF9DT09QICovCisKKyAgICBpZiAoZGhjcC0+cGNiICE9IE5VTEwpIHsKKyAgICAgIHVkcF9yZW1vdmUoZGhjcC0+cGNiKTsKKyAgICAgIGRoY3AtPnBjYiA9IE5VTEw7CisgICAgfQorICAgIExXSVBfQVNTRVJUKCJyZXBseSB3YXNuJ3QgZnJlZWQiLCBkaGNwLT5tc2dfaW4gPT0gTlVMTCk7CisgICAgZGhjcF9zZXRfc3RhdGUoZGhjcCwgREhDUF9PRkYpOworICB9Cit9CisKKy8qCisgKiBTZXQgdGhlIERIQ1Agc3RhdGUgb2YgYSBESENQIGNsaWVudC4KKyAqCisgKiBJZiB0aGUgc3RhdGUgY2hhbmdlZCwgcmVzZXQgdGhlIG51bWJlciBvZiB0cmllcy4KKyAqLworc3RhdGljIHZvaWQKK2RoY3Bfc2V0X3N0YXRlKHN0cnVjdCBkaGNwICpkaGNwLCB1OF90IG5ld19zdGF0ZSkKK3sKKyAgaWYgKG5ld19zdGF0ZSAhPSBkaGNwLT5zdGF0ZSkgeworICAgIGRoY3AtPnN0YXRlID0gbmV3X3N0YXRlOworICAgIGRoY3AtPnRyaWVzID0gMDsKKyAgICBkaGNwLT5yZXF1ZXN0X3RpbWVvdXQgPSAwOworICB9Cit9CisKKy8qCisgKiBDb25jYXRlbmF0ZSBhbiBvcHRpb24gdHlwZSBhbmQgbGVuZ3RoIGZpZWxkIHRvIHRoZSBvdXRnb2luZworICogREhDUCBtZXNzYWdlLgorICoKKyAqLworc3RhdGljIHZvaWQKK2RoY3Bfb3B0aW9uKHN0cnVjdCBkaGNwICpkaGNwLCB1OF90IG9wdGlvbl90eXBlLCB1OF90IG9wdGlvbl9sZW4pCit7CisgIExXSVBfQVNTRVJUKCJkaGNwX29wdGlvbjogZGhjcC0+b3B0aW9uc19vdXRfbGVuICsgMiArIG9wdGlvbl9sZW4gPD0gREhDUF9PUFRJT05TX0xFTiIsIGRoY3AtPm9wdGlvbnNfb3V0X2xlbiArIDJVICsgb3B0aW9uX2xlbiA8PSBESENQX09QVElPTlNfTEVOKTsKKyAgZGhjcC0+bXNnX291dC0+b3B0aW9uc1tkaGNwLT5vcHRpb25zX291dF9sZW4rK10gPSBvcHRpb25fdHlwZTsKKyAgZGhjcC0+bXNnX291dC0+b3B0aW9uc1tkaGNwLT5vcHRpb25zX291dF9sZW4rK10gPSBvcHRpb25fbGVuOworfQorLyoKKyAqIENvbmNhdGVuYXRlIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIG91dGdvaW5nIERIQ1AgbWVzc2FnZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkCitkaGNwX29wdGlvbl9ieXRlKHN0cnVjdCBkaGNwICpkaGNwLCB1OF90IHZhbHVlKQoreworICBMV0lQX0FTU0VSVCgiZGhjcF9vcHRpb25fYnl0ZTogZGhjcC0+b3B0aW9uc19vdXRfbGVuIDwgREhDUF9PUFRJT05TX0xFTiIsIGRoY3AtPm9wdGlvbnNfb3V0X2xlbiA8IERIQ1BfT1BUSU9OU19MRU4pOworICBkaGNwLT5tc2dfb3V0LT5vcHRpb25zW2RoY3AtPm9wdGlvbnNfb3V0X2xlbisrXSA9IHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorZGhjcF9vcHRpb25fc2hvcnQoc3RydWN0IGRoY3AgKmRoY3AsIHUxNl90IHZhbHVlKQoreworICBMV0lQX0FTU0VSVCgiZGhjcF9vcHRpb25fc2hvcnQ6IGRoY3AtPm9wdGlvbnNfb3V0X2xlbiArIDIgPD0gREhDUF9PUFRJT05TX0xFTiIsIGRoY3AtPm9wdGlvbnNfb3V0X2xlbiArIDJVIDw9IERIQ1BfT1BUSU9OU19MRU4pOworICBkaGNwLT5tc2dfb3V0LT5vcHRpb25zW2RoY3AtPm9wdGlvbnNfb3V0X2xlbisrXSA9ICh1OF90KSgodmFsdWUgJiAweGZmMDBVKSA+PiA4KTsKKyAgZGhjcC0+bXNnX291dC0+b3B0aW9uc1tkaGNwLT5vcHRpb25zX291dF9sZW4rK10gPSAodThfdCkgKHZhbHVlICYgMHgwMGZmVSk7Cit9CisKK3N0YXRpYyB2b2lkCitkaGNwX29wdGlvbl9sb25nKHN0cnVjdCBkaGNwICpkaGNwLCB1MzJfdCB2YWx1ZSkKK3sKKyAgTFdJUF9BU1NFUlQoImRoY3Bfb3B0aW9uX2xvbmc6IGRoY3AtPm9wdGlvbnNfb3V0X2xlbiArIDQgPD0gREhDUF9PUFRJT05TX0xFTiIsIGRoY3AtPm9wdGlvbnNfb3V0X2xlbiArIDRVIDw9IERIQ1BfT1BUSU9OU19MRU4pOworICBkaGNwLT5tc2dfb3V0LT5vcHRpb25zW2RoY3AtPm9wdGlvbnNfb3V0X2xlbisrXSA9ICh1OF90KSgodmFsdWUgJiAweGZmMDAwMDAwVUwpID4+IDI0KTsKKyAgZGhjcC0+bXNnX291dC0+b3B0aW9uc1tkaGNwLT5vcHRpb25zX291dF9sZW4rK10gPSAodThfdCkoKHZhbHVlICYgMHgwMGZmMDAwMFVMKSA+PiAxNik7CisgIGRoY3AtPm1zZ19vdXQtPm9wdGlvbnNbZGhjcC0+b3B0aW9uc19vdXRfbGVuKytdID0gKHU4X3QpKCh2YWx1ZSAmIDB4MDAwMGZmMDBVTCkgPj4gOCk7CisgIGRoY3AtPm1zZ19vdXQtPm9wdGlvbnNbZGhjcC0+b3B0aW9uc19vdXRfbGVuKytdID0gKHU4X3QpKCh2YWx1ZSAmIDB4MDAwMDAwZmZVTCkpOworfQorCisvKioKKyAqIEV4dHJhY3QgdGhlIERIQ1AgbWVzc2FnZSBhbmQgdGhlIERIQ1Agb3B0aW9ucy4KKyAqCisgKiBFeHRyYWN0IHRoZSBESENQIG1lc3NhZ2UgYW5kIHRoZSBESENQIG9wdGlvbnMsIGVhY2ggaW50byBhIGNvbnRpZ3VvdXMKKyAqIHBpZWNlIG9mIG1lbW9yeS4gQXMgYSBESENQIG1lc3NhZ2UgaXMgdmFyaWFibGUgc2l6ZWQgYnkgaXRzIG9wdGlvbnMsCisgKiBhbmQgYWxzbyBhbGxvd3Mgb3ZlcnJpZGluZyBzb21lIGZpZWxkcyBmb3Igb3B0aW9ucywgdGhlIGVhc3kgYXBwcm9hY2gKKyAqIGlzIHRvIGZpcnN0IHVuZm9sZCB0aGUgb3B0aW9ucyBpbnRvIGEgY29uaXRndW91cyBwaWVjZSBvZiBtZW1vcnksIGFuZAorICogdXNlIHRoYXQgZnVydGhlciBvbi4KKyAqCisgKi8KK3N0YXRpYyBlcnJfdAorZGhjcF9wYXJzZV9yZXBseShzdHJ1Y3QgZGhjcCAqZGhjcCwgc3RydWN0IHBidWYgKnApCit7CisgIHU4X3QgKm9wdGlvbnM7CisgIHUxNl90IG9mZnNldDsKKyAgdTE2X3Qgb2Zmc2V0X21heDsKKyAgdTE2X3Qgb3B0aW9uc19pZHg7CisgIHUxNl90IG9wdGlvbnNfaWR4X21heDsKKyAgc3RydWN0IHBidWYgKnE7CisgIGludCBwYXJzZV9maWxlX2FzX29wdGlvbnMgPSAwOworICBpbnQgcGFyc2Vfc25hbWVfYXNfb3B0aW9ucyA9IDA7CisKKyAgLyogY2xlYXIgcmVjZWl2ZWQgb3B0aW9ucyAqLworICBkaGNwX2NsZWFyX2FsbF9vcHRpb25zKGRoY3ApOworICAvKiBjaGVjayB0aGF0IGJlZ2lubmluZyBvZiBkaGNwX21zZyAodXAgdG8gYW5kIGluY2x1ZGluZyBjaGFkZHIpIGlzIGluIGZpcnN0IHBidWYgKi8KKyAgaWYgKHAtPmxlbiA8IERIQ1BfU05BTUVfT0ZTKSB7CisgICAgcmV0dXJuIEVSUl9CVUY7CisgIH0KKyAgZGhjcC0+bXNnX2luID0gKHN0cnVjdCBkaGNwX21zZyAqKXAtPnBheWxvYWQ7CisjaWYgTFdJUF9ESENQX0JPT1RQX0ZJTEUKKyAgLyogY2xlYXIgYm9vdCBmaWxlIG5hbWUgKi8KKyAgZGhjcC0+Ym9vdF9maWxlX25hbWVbMF0gPSAwOworI2VuZGlmIC8qIExXSVBfREhDUF9CT09UUF9GSUxFICovCisKKyAgLyogcGFyc2Ugb3B0aW9ucyAqLworCisgIC8qIHN0YXJ0IHdpdGggb3B0aW9ucyBmaWVsZCAqLworICBvcHRpb25zX2lkeCA9IERIQ1BfT1BUSU9OU19PRlM7CisgIC8qIHBhcnNlIG9wdGlvbnMgdG8gdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0ICovCisgIG9wdGlvbnNfaWR4X21heCA9IHAtPnRvdF9sZW47CithZ2FpbjoKKyAgcSA9IHA7CisgIHdoaWxlKChxICE9IE5VTEwpICYmIChvcHRpb25zX2lkeCA+PSBxLT5sZW4pKSB7CisgICAgb3B0aW9uc19pZHggLT0gcS0+bGVuOworICAgIG9wdGlvbnNfaWR4X21heCAtPSBxLT5sZW47CisgICAgcSA9IHEtPm5leHQ7CisgIH0KKyAgaWYgKHEgPT0gTlVMTCkgeworICAgIHJldHVybiBFUlJfQlVGOworICB9CisgIG9mZnNldCA9IG9wdGlvbnNfaWR4OworICBvZmZzZXRfbWF4ID0gb3B0aW9uc19pZHhfbWF4OworICBvcHRpb25zID0gKHU4X3QqKXEtPnBheWxvYWQ7CisgIC8qIGF0IGxlYXN0IDEgYnl0ZSB0byByZWFkIGFuZCBubyBlbmQgbWFya2VyLCB0aGVuIGF0IGxlYXN0IDMgYnl0ZXMgdG8gcmVhZD8gKi8KKyAgd2hpbGUoKHEgIT0gTlVMTCkgJiYgKG9wdGlvbnNbb2Zmc2V0XSAhPSBESENQX09QVElPTl9FTkQpICYmIChvZmZzZXQgPCBvZmZzZXRfbWF4KSkgeworICAgIHU4X3Qgb3AgPSBvcHRpb25zW29mZnNldF07CisgICAgdThfdCBsZW47CisgICAgdThfdCBkZWNvZGVfbGVuID0gMDsKKyAgICBpbnQgZGVjb2RlX2lkeCA9IC0xOworICAgIHUxNl90IHZhbF9vZmZzZXQgPSBvZmZzZXQgKyAyOworICAgIC8qIGxlbiBieXRlIG1pZ2h0IGJlIGluIHRoZSBuZXh0IHBidWYgKi8KKyAgICBpZiAob2Zmc2V0ICsgMSA8IHEtPmxlbikgeworICAgICAgbGVuID0gb3B0aW9uc1tvZmZzZXQgKyAxXTsKKyAgICB9IGVsc2UgeworICAgICAgbGVuID0gKHEtPm5leHQgIT0gTlVMTCA/ICgodThfdCopcS0+bmV4dC0+cGF5bG9hZClbMF0gOiAwKTsKKyAgICB9CisgICAgLyogTFdJUF9ERUJVR0YoREhDUF9ERUJVRywgKCJtc2dfb2Zmc2V0PSUiVTE2X0YiLCBxLT5sZW49JSJVMTZfRiwgbXNnX29mZnNldCwgcS0+bGVuKSk7ICovCisgICAgZGVjb2RlX2xlbiA9IGxlbjsKKyAgICBzd2l0Y2gob3ApIHsKKyAgICAgIC8qIGNhc2UoREhDUF9PUFRJT05fRU5EKTogaGFuZGxlZCBhYm92ZSAqLworICAgICAgY2FzZShESENQX09QVElPTl9QQUQpOgorICAgICAgICAvKiBzcGVjaWFsIG9wdGlvbjogbm8gbGVuIGVuY29kZWQgKi8KKyAgICAgICAgZGVjb2RlX2xlbiA9IGxlbiA9IDA7CisgICAgICAgIC8qIHdpbGwgYmUgaW5jcmVhc2VkIGJlbG93ICovCisgICAgICAgIG9mZnNldC0tOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoREhDUF9PUFRJT05fU1VCTkVUX01BU0spOgorICAgICAgICBMV0lQX0FTU0VSVCgibGVuID09IDQiLCBsZW4gPT0gNCk7CisgICAgICAgIGRlY29kZV9pZHggPSBESENQX09QVElPTl9JRFhfU1VCTkVUX01BU0s7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZShESENQX09QVElPTl9ST1VURVIpOgorICAgICAgICBkZWNvZGVfbGVuID0gNDsgLyogb25seSBjb3B5IHRoZSBmaXJzdCBnaXZlbiByb3V0ZXIgKi8KKyAgICAgICAgTFdJUF9BU1NFUlQoImxlbiA+PSBkZWNvZGVfbGVuIiwgbGVuID49IGRlY29kZV9sZW4pOworICAgICAgICBkZWNvZGVfaWR4ID0gREhDUF9PUFRJT05fSURYX1JPVVRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlKERIQ1BfT1BUSU9OX0ROU19TRVJWRVIpOgorICAgICAgICAvKiBzcGVjaWFsIGNhc2U6IHRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiBvbmUgc2VydmVyICovCisgICAgICAgIExXSVBfQVNTRVJUKCJsZW4gJSA0ID09IDAiLCBsZW4gJSA0ID09IDApOworICAgICAgICAvKiBsaW1pdCBudW1iZXIgb2YgRE5TIHNlcnZlcnMgKi8KKyAgICAgICAgZGVjb2RlX2xlbiA9IExXSVBfTUlOKGxlbiwgNCAqIEROU19NQVhfU0VSVkVSUyk7CisgICAgICAgIExXSVBfQVNTRVJUKCJsZW4gPj0gZGVjb2RlX2xlbiIsIGxlbiA+PSBkZWNvZGVfbGVuKTsKKyAgICAgICAgZGVjb2RlX2lkeCA9IERIQ1BfT1BUSU9OX0lEWF9ETlNfU0VSVkVSOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoREhDUF9PUFRJT05fTEVBU0VfVElNRSk6CisgICAgICAgIExXSVBfQVNTRVJUKCJsZW4gPT0gNCIsIGxlbiA9PSA0KTsKKyAgICAgICAgZGVjb2RlX2lkeCA9IERIQ1BfT1BUSU9OX0lEWF9MRUFTRV9USU1FOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoREhDUF9PUFRJT05fT1ZFUkxPQUQpOgorICAgICAgICBMV0lQX0FTU0VSVCgibGVuID09IDEiLCBsZW4gPT0gMSk7CisgICAgICAgIGRlY29kZV9pZHggPSBESENQX09QVElPTl9JRFhfT1ZFUkxPQUQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZShESENQX09QVElPTl9NRVNTQUdFX1RZUEUpOgorICAgICAgICBMV0lQX0FTU0VSVCgibGVuID09IDEiLCBsZW4gPT0gMSk7CisgICAgICAgIGRlY29kZV9pZHggPSBESENQX09QVElPTl9JRFhfTVNHX1RZUEU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZShESENQX09QVElPTl9TRVJWRVJfSUQpOgorICAgICAgICBMV0lQX0FTU0VSVCgibGVuID09IDQiLCBsZW4gPT0gNCk7CisgICAgICAgIGRlY29kZV9pZHggPSBESENQX09QVElPTl9JRFhfU0VSVkVSX0lEOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UoREhDUF9PUFRJT05fVDEpOgorICAgICAgICBMV0lQX0FTU0VSVCgibGVuID09IDQiLCBsZW4gPT0gNCk7CisgICAgICAgIGRlY29kZV9pZHggPSBESENQX09QVElPTl9JRFhfVDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZShESENQX09QVElPTl9UMik6CisgICAgICAgIExXSVBfQVNTRVJUKCJsZW4gPT0gNCIsIGxlbiA9PSA0KTsKKyAgICAgICAgZGVjb2RlX2lkeCA9IERIQ1BfT1BUSU9OX0lEWF9UMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBkZWNvZGVfbGVuID0gMDsKKyAgICAgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRywgKCJza2lwcGluZyBvcHRpb24gJSJVMTZfRiIgaW4gb3B0aW9uc1xuIiwgb3ApKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG9mZnNldCArPSBsZW4gKyAyOworICAgIGlmIChkZWNvZGVfbGVuID4gMCkgeworICAgICAgdTMyX3QgdmFsdWUgPSAwOworICAgICAgdTE2X3QgY29weV9sZW47CitkZWNvZGVfbmV4dDoKKyAgICAgIExXSVBfQVNTRVJUKCJjaGVjayBkZWNvZGVfaWR4IiwgZGVjb2RlX2lkeCA+PSAwICYmIGRlY29kZV9pZHggPCBESENQX09QVElPTl9JRFhfTUFYKTsKKyAgICAgIExXSVBfQVNTRVJUKCJvcHRpb24gYWxyZWFkeSBkZWNvZGVkIiwgIWRoY3Bfb3B0aW9uX2dpdmVuKGRoY3AsIGRlY29kZV9pZHgpKTsKKyAgICAgIGNvcHlfbGVuID0gTFdJUF9NSU4oZGVjb2RlX2xlbiwgNCk7CisgICAgICBwYnVmX2NvcHlfcGFydGlhbChxLCAmdmFsdWUsIGNvcHlfbGVuLCB2YWxfb2Zmc2V0KTsKKyAgICAgIGlmIChkZWNvZGVfbGVuID4gNCkgeworICAgICAgICAvKiBkZWNvZGUgbW9yZSB0aGFuIG9uZSB1MzJfdCAqLworICAgICAgICBMV0lQX0FTU0VSVCgiZGVjb2RlX2xlbiAlIDQgPT0gMCIsIGRlY29kZV9sZW4gJSA0ID09IDApOworICAgICAgICBkaGNwX2dvdF9vcHRpb24oZGhjcCwgZGVjb2RlX2lkeCk7CisgICAgICAgIGRoY3Bfc2V0X29wdGlvbl92YWx1ZShkaGNwLCBkZWNvZGVfaWR4LCBodG9ubCh2YWx1ZSkpOworICAgICAgICBkZWNvZGVfbGVuIC09IDQ7CisgICAgICAgIHZhbF9vZmZzZXQgKz0gNDsKKyAgICAgICAgZGVjb2RlX2lkeCsrOworICAgICAgICBnb3RvIGRlY29kZV9uZXh0OworICAgICAgfSBlbHNlIGlmIChkZWNvZGVfbGVuID09IDQpIHsKKyAgICAgICAgdmFsdWUgPSBudG9obCh2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMV0lQX0FTU0VSVCgiaW52YWxpZCBkZWNvZGVfbGVuIiwgZGVjb2RlX2xlbiA9PSAxKTsKKyAgICAgICAgdmFsdWUgPSAoKHU4X3QqKSZ2YWx1ZSlbMF07CisgICAgICB9CisgICAgICBkaGNwX2dvdF9vcHRpb24oZGhjcCwgZGVjb2RlX2lkeCk7CisgICAgICBkaGNwX3NldF9vcHRpb25fdmFsdWUoZGhjcCwgZGVjb2RlX2lkeCwgdmFsdWUpOworICAgIH0KKyAgICBpZiAob2Zmc2V0ID49IHEtPmxlbikgeworICAgICAgb2Zmc2V0IC09IHEtPmxlbjsKKyAgICAgIG9mZnNldF9tYXggLT0gcS0+bGVuOworICAgICAgcSA9IHEtPm5leHQ7CisgICAgICBvcHRpb25zID0gKHU4X3QqKXEtPnBheWxvYWQ7CisgICAgfQorICB9CisgIC8qIGlzIHRoaXMgYW4gb3ZlcmxvYWRlZCBtZXNzYWdlPyAqLworICBpZiAoZGhjcF9vcHRpb25fZ2l2ZW4oZGhjcCwgREhDUF9PUFRJT05fSURYX09WRVJMT0FEKSkgeworICAgIHUzMl90IG92ZXJsb2FkID0gZGhjcF9nZXRfb3B0aW9uX3ZhbHVlKGRoY3AsIERIQ1BfT1BUSU9OX0lEWF9PVkVSTE9BRCk7CisgICAgZGhjcF9jbGVhcl9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fSURYX09WRVJMT0FEKTsKKyAgICBpZiAob3ZlcmxvYWQgPT0gREhDUF9PVkVSTE9BRF9GSUxFKSB7CisgICAgICBwYXJzZV9maWxlX2FzX29wdGlvbnMgPSAxOworICAgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoIm92ZXJsb2FkZWQgZmlsZSBmaWVsZFxuIikpOworICAgIH0gZWxzZSBpZiAob3ZlcmxvYWQgPT0gREhDUF9PVkVSTE9BRF9TTkFNRSkgeworICAgICAgcGFyc2Vfc25hbWVfYXNfb3B0aW9ucyA9IDE7CisgICAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgib3ZlcmxvYWRlZCBzbmFtZSBmaWVsZFxuIikpOworICAgIH0gZWxzZSBpZiAob3ZlcmxvYWQgPT0gREhDUF9PVkVSTE9BRF9TTkFNRV9GSUxFKSB7CisgICAgICBwYXJzZV9zbmFtZV9hc19vcHRpb25zID0gMTsKKyAgICAgIHBhcnNlX2ZpbGVfYXNfb3B0aW9ucyA9IDE7CisgICAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgib3ZlcmxvYWRlZCBzbmFtZSBhbmQgZmlsZSBmaWVsZFxuIikpOworICAgIH0gZWxzZSB7CisgICAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiaW52YWxpZCBvdmVybG9hZCBvcHRpb246ICVkXG4iLCAoaW50KW92ZXJsb2FkKSk7CisgICAgfQorI2lmIExXSVBfREhDUF9CT09UUF9GSUxFCisgICAgaWYgKCFwYXJzZV9maWxlX2FzX29wdGlvbnMpIHsKKyAgICAgIC8qIG9ubHkgZG8gdGhpcyBmb3IgQUNLIG1lc3NhZ2VzICovCisgICAgICBpZiAoZGhjcF9vcHRpb25fZ2l2ZW4oZGhjcCwgREhDUF9PUFRJT05fSURYX01TR19UWVBFKSAmJgorICAgICAgICAoZGhjcF9nZXRfb3B0aW9uX3ZhbHVlKGRoY3AsIERIQ1BfT1BUSU9OX0lEWF9NU0dfVFlQRSkgPT0gREhDUF9BQ0spKQorICAgICAgLyogY29weSBib290cCBmaWxlIG5hbWUsIGRvbid0IGNhcmUgZm9yIHNuYW1lIChzZXJ2ZXIgaG9zdG5hbWUpICovCisgICAgICBwYnVmX2NvcHlfcGFydGlhbChwLCBkaGNwLT5ib290X2ZpbGVfbmFtZSwgREhDUF9GSUxFX0xFTi0xLCBESENQX0ZJTEVfT0ZTKTsKKyAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzIHJlYWxseSBOVUxMLXRlcm1pbmF0ZWQgKi8KKyAgICAgIGRoY3AtPmJvb3RfZmlsZV9uYW1lW0RIQ1BfRklMRV9MRU4tMV0gPSAwOworICAgIH0KKyNlbmRpZiAvKiBMV0lQX0RIQ1BfQk9PVFBfRklMRSAqLworICB9CisgIGlmIChwYXJzZV9maWxlX2FzX29wdGlvbnMpIHsKKyAgICAvKiBpZiBib3RoIGFyZSBvdmVybG9hZGVkLCBwYXJzZSBmaWxlIGZpcnN0IGFuZCB0aGVuIHNuYW1lIChSRkMgMjEzMSBjaC4gNC4xKSAqLworICAgIHBhcnNlX2ZpbGVfYXNfb3B0aW9ucyA9IDA7CisgICAgb3B0aW9uc19pZHggPSBESENQX0ZJTEVfT0ZTOworICAgIG9wdGlvbnNfaWR4X21heCA9IERIQ1BfRklMRV9PRlMgKyBESENQX0ZJTEVfTEVOOworICAgIGdvdG8gYWdhaW47CisgIH0gZWxzZSBpZiAocGFyc2Vfc25hbWVfYXNfb3B0aW9ucykgeworICAgIHBhcnNlX3NuYW1lX2FzX29wdGlvbnMgPSAwOworICAgIG9wdGlvbnNfaWR4ID0gREhDUF9TTkFNRV9PRlM7CisgICAgb3B0aW9uc19pZHhfbWF4ID0gREhDUF9TTkFNRV9PRlMgKyBESENQX1NOQU1FX0xFTjsKKyAgICBnb3RvIGFnYWluOworICB9CisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogSWYgYW4gaW5jb21pbmcgREhDUCBtZXNzYWdlIGlzIGluIHJlc3BvbnNlIHRvIHVzLCB0aGVuIHRyaWdnZXIgdGhlIHN0YXRlIG1hY2hpbmUKKyAqLworc3RhdGljIHZvaWQKK2RoY3BfcmVjdih2b2lkICphcmcsIHN0cnVjdCB1ZHBfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKmFkZHIsIHUxNl90IHBvcnQpCit7CisgIHN0cnVjdCBuZXRpZiAqbmV0aWYgPSAoc3RydWN0IG5ldGlmICopYXJnOworICBzdHJ1Y3QgZGhjcCAqZGhjcCA9IG5ldGlmLT5kaGNwOworICBzdHJ1Y3QgZGhjcF9tc2cgKnJlcGx5X21zZyA9IChzdHJ1Y3QgZGhjcF9tc2cgKilwLT5wYXlsb2FkOworICB1OF90IG1zZ190eXBlOworICB1OF90IGk7CisgIExXSVBfREVCVUdGKERIQ1BfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJkaGNwX3JlY3YocGJ1ZiA9ICVwKSBmcm9tIERIQ1Agc2VydmVyICUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiIHBvcnQgJSJVMTZfRiJcbiIsICh2b2lkKilwLAorICAgIGlwNF9hZGRyMV8xNihhZGRyKSwgaXA0X2FkZHIyXzE2KGFkZHIpLCBpcDRfYWRkcjNfMTYoYWRkciksIGlwNF9hZGRyNF8xNihhZGRyKSwgcG9ydCkpOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgicGJ1Zi0+bGVuID0gJSJVMTZfRiJcbiIsIHAtPmxlbikpOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgicGJ1Zi0+dG90X2xlbiA9ICUiVTE2X0YiXG4iLCBwLT50b3RfbGVuKSk7CisgIC8qIHByZXZlbnQgd2FybmluZ3MgYWJvdXQgdW51c2VkIGFyZ3VtZW50cyAqLworICBMV0lQX1VOVVNFRF9BUkcocGNiKTsKKyAgTFdJUF9VTlVTRURfQVJHKGFkZHIpOworICBMV0lQX1VOVVNFRF9BUkcocG9ydCk7CisKKyAgTFdJUF9BU1NFUlQoInJlcGx5IHdhc24ndCBmcmVlZCIsIGRoY3AtPm1zZ19pbiA9PSBOVUxMKTsKKworICBpZiAocC0+bGVuIDwgREhDUF9NSU5fUkVQTFlfTEVOKSB7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywgKCJESENQIHJlcGx5IG1lc3NhZ2Ugb3IgcGJ1ZiB0b28gc2hvcnRcbiIpKTsKKyAgICBnb3RvIGZyZWVfcGJ1Zl9hbmRfcmV0dXJuOworICB9CisKKyAgaWYgKHJlcGx5X21zZy0+b3AgIT0gREhDUF9CT09UUkVQTFkpIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9XQVJOSU5HLCAoIm5vdCBhIERIQ1AgcmVwbHkgbWVzc2FnZSwgYnV0IHR5cGUgJSJVMTZfRiJcbiIsICh1MTZfdClyZXBseV9tc2ctPm9wKSk7CisgICAgZ290byBmcmVlX3BidWZfYW5kX3JldHVybjsKKyAgfQorICAvKiBpdGVyYXRlIHRocm91Z2ggaGFyZHdhcmUgYWRkcmVzcyBhbmQgbWF0Y2ggYWdhaW5zdCBESENQIG1lc3NhZ2UgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5ldGlmLT5od2FkZHJfbGVuOyBpKyspIHsKKyAgICBpZiAobmV0aWYtPmh3YWRkcltpXSAhPSByZXBseV9tc2ctPmNoYWRkcltpXSkgeworICAgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywKKyAgICAgICAgKCJuZXRpZi0+aHdhZGRyWyUiVTE2X0YiXT09JTAyIlgxNl9GIiAhPSByZXBseV9tc2ctPmNoYWRkclslIlUxNl9GIl09PSUwMiJYMTZfRiJcbiIsCisgICAgICAgICh1MTZfdClpLCAodTE2X3QpbmV0aWYtPmh3YWRkcltpXSwgKHUxNl90KWksICh1MTZfdClyZXBseV9tc2ctPmNoYWRkcltpXSkpOworICAgICAgZ290byBmcmVlX3BidWZfYW5kX3JldHVybjsKKyAgICB9CisgIH0KKyAgLyogbWF0Y2ggdHJhbnNhY3Rpb24gSUQgYWdhaW5zdCB3aGF0IHdlIGV4cGVjdGVkICovCisgIGlmIChudG9obChyZXBseV9tc2ctPnhpZCkgIT0gZGhjcC0+eGlkKSB7CisgICAgTFdJUF9ERUJVR0YoREhDUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywKKyAgICAgICgidHJhbnNhY3Rpb24gaWQgbWlzbWF0Y2ggcmVwbHlfbXNnLT54aWQoJSJYMzJfRiIpIT1kaGNwLT54aWQoJSJYMzJfRiIpXG4iLG50b2hsKHJlcGx5X21zZy0+eGlkKSxkaGNwLT54aWQpKTsKKyAgICBnb3RvIGZyZWVfcGJ1Zl9hbmRfcmV0dXJuOworICB9CisgIC8qIG9wdGlvbiBmaWVsZHMgY291bGQgYmUgdW5mb2xkPyAqLworICBpZiAoZGhjcF9wYXJzZV9yZXBseShkaGNwLCBwKSAhPSBFUlJfT0spIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgKCJwcm9ibGVtIHVuZm9sZGluZyBESENQIG1lc3NhZ2UgLSB0b28gc2hvcnQgb24gbWVtb3J5P1xuIikpOworICAgIGdvdG8gZnJlZV9wYnVmX2FuZF9yZXR1cm47CisgIH0KKworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgic2VhcmNoaW5nIERIQ1BfT1BUSU9OX01FU1NBR0VfVFlQRVxuIikpOworICAvKiBvYnRhaW4gcG9pbnRlciB0byBESENQIG1lc3NhZ2UgdHlwZSAqLworICBpZiAoIWRoY3Bfb3B0aW9uX2dpdmVuKGRoY3AsIERIQ1BfT1BUSU9OX0lEWF9NU0dfVFlQRSkpIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9XQVJOSU5HLCAoIkRIQ1BfT1BUSU9OX01FU1NBR0VfVFlQRSBvcHRpb24gbm90IGZvdW5kXG4iKSk7CisgICAgZ290byBmcmVlX3BidWZfYW5kX3JldHVybjsKKyAgfQorCisgIC8qIHJlYWQgREhDUCBtZXNzYWdlIHR5cGUgKi8KKyAgbXNnX3R5cGUgPSAodThfdClkaGNwX2dldF9vcHRpb25fdmFsdWUoZGhjcCwgREhDUF9PUFRJT05fSURYX01TR19UWVBFKTsKKyAgLyogbWVzc2FnZSB0eXBlIGlzIERIQ1AgQUNLPyAqLworICBpZiAobXNnX3R5cGUgPT0gREhDUF9BQ0spIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiREhDUF9BQ0sgcmVjZWl2ZWRcbiIpKTsKKyAgICAvKiBpbiByZXF1ZXN0aW5nIHN0YXRlPyAqLworICAgIGlmIChkaGNwLT5zdGF0ZSA9PSBESENQX1JFUVVFU1RJTkcpIHsKKyAgICAgIGRoY3BfaGFuZGxlX2FjayhuZXRpZik7CisjaWYgREhDUF9ET0VTX0FSUF9DSEVDSworICAgICAgLyogY2hlY2sgaWYgdGhlIGFja25vd2xlZGdlZCBsZWFzZSBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlICovCisgICAgICBkaGNwX2NoZWNrKG5ldGlmKTsKKyNlbHNlCisgICAgICAvKiBiaW5kIGludGVyZmFjZSB0byB0aGUgYWNrbm93bGVkZ2VkIGxlYXNlIGFkZHJlc3MgKi8KKyAgICAgIGRoY3BfYmluZChuZXRpZik7CisjZW5kaWYKKyAgICB9CisgICAgLyogYWxyZWFkeSBib3VuZCB0byB0aGUgZ2l2ZW4gbGVhc2UgYWRkcmVzcz8gKi8KKyAgICBlbHNlIGlmICgoZGhjcC0+c3RhdGUgPT0gREhDUF9SRUJPT1RJTkcpIHx8IChkaGNwLT5zdGF0ZSA9PSBESENQX1JFQklORElORykgfHwgKGRoY3AtPnN0YXRlID09IERIQ1BfUkVORVdJTkcpKSB7CisgICAgICBkaGNwX2JpbmQobmV0aWYpOworICAgIH0KKyAgfQorICAvKiByZWNlaXZlZCBhIERIQ1BfTkFLIGluIGFwcHJvcHJpYXRlIHN0YXRlPyAqLworICBlbHNlIGlmICgobXNnX3R5cGUgPT0gREhDUF9OQUspICYmCisgICAgKChkaGNwLT5zdGF0ZSA9PSBESENQX1JFQk9PVElORykgfHwgKGRoY3AtPnN0YXRlID09IERIQ1BfUkVRVUVTVElORykgfHwKKyAgICAgKGRoY3AtPnN0YXRlID09IERIQ1BfUkVCSU5ESU5HKSB8fCAoZGhjcC0+c3RhdGUgPT0gREhDUF9SRU5FV0lORyAgKSkpIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiREhDUF9OQUsgcmVjZWl2ZWRcbiIpKTsKKyAgICBkaGNwX2hhbmRsZV9uYWsobmV0aWYpOworICB9CisgIC8qIHJlY2VpdmVkIGEgREhDUF9PRkZFUiBpbiBESENQX1NFTEVDVElORyBzdGF0ZT8gKi8KKyAgZWxzZSBpZiAoKG1zZ190eXBlID09IERIQ1BfT0ZGRVIpICYmIChkaGNwLT5zdGF0ZSA9PSBESENQX1NFTEVDVElORykpIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiREhDUF9PRkZFUiByZWNlaXZlZCBpbiBESENQX1NFTEVDVElORyBzdGF0ZVxuIikpOworICAgIGRoY3AtPnJlcXVlc3RfdGltZW91dCA9IDA7CisgICAgLyogcmVtZW1iZXIgb2ZmZXJlZCBsZWFzZSAqLworICAgIGRoY3BfaGFuZGxlX29mZmVyKG5ldGlmKTsKKyAgfQorZnJlZV9wYnVmX2FuZF9yZXR1cm46CisgIGRoY3AtPm1zZ19pbiA9IE5VTEw7CisgIHBidWZfZnJlZShwKTsKK30KKworLyoqCisgKiBDcmVhdGUgYSBESENQIHJlcXVlc3QsIGZpbGwgaW4gY29tbW9uIGhlYWRlcnMKKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldGlmIHVuZGVyIERIQ1AgY29udHJvbAorICogQHBhcmFtIGRoY3AgZGhjcCBjb250cm9sIHN0cnVjdAorICogQHBhcmFtIG1lc3NhZ2VfdHlwZSBtZXNzYWdlIHR5cGUgb2YgdGhlIHJlcXVlc3QKKyAqLworc3RhdGljIGVycl90CitkaGNwX2NyZWF0ZV9tc2coc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IGRoY3AgKmRoY3AsIHU4X3QgbWVzc2FnZV90eXBlKQoreworICB1MTZfdCBpOworI2lmbmRlZiBESENQX0dMT0JBTF9YSUQKKyAgLyoqIGRlZmF1bHQgZ2xvYmFsIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIgc3RhcnRpbmcgdmFsdWUgKGVhc3kgdG8gbWF0Y2gKKyAgICogIHdpdGggYSBwYWNrZXQgYW5hbHlzZXIpLiBXZSBzaW1wbHkgaW5jcmVtZW50IGZvciBlYWNoIG5ldyByZXF1ZXN0LgorICAgKiAgUHJlZGVmaW5lIERIQ1BfR0xPQkFMX1hJRCB0byBhIGJldHRlciB2YWx1ZSBvciBhIGZ1bmN0aW9uIGNhbGwgdG8gZ2VuZXJhdGUgb25lCisgICAqICBhdCBydW50aW1lLCBhbnkgc3VwcG9ydGluZyBmdW5jdGlvbiBwcm90b3R5cGVzIGNhbiBiZSBkZWZpbmVkIGluIERIQ1BfR0xPQkFMX1hJRF9IRUFERVIgKi8KKyAgc3RhdGljIHUzMl90IHhpZCA9IDB4QUJDRDAwMDA7CisjZWxzZQorICBzdGF0aWMgdTMyX3QgeGlkOworICBzdGF0aWMgdThfdCB4aWRfaW5pdGlhbGlzZWQgPSAwOworICBpZiAoIXhpZF9pbml0aWFsaXNlZCkgeworICAgIHhpZCA9IERIQ1BfR0xPQkFMX1hJRDsKKyAgICB4aWRfaW5pdGlhbGlzZWQgPSAheGlkX2luaXRpYWxpc2VkOworICB9CisjZW5kaWYKKyAgTFdJUF9FUlJPUigiZGhjcF9jcmVhdGVfbXNnOiBuZXRpZiAhPSBOVUxMIiwgKG5ldGlmICE9IE5VTEwpLCByZXR1cm4gRVJSX0FSRzspOworICBMV0lQX0VSUk9SKCJkaGNwX2NyZWF0ZV9tc2c6IGRoY3AgIT0gTlVMTCIsIChkaGNwICE9IE5VTEwpLCByZXR1cm4gRVJSX1ZBTDspOworICBMV0lQX0FTU0VSVCgiZGhjcF9jcmVhdGVfbXNnOiBkaGNwLT5wX291dCA9PSBOVUxMIiwgZGhjcC0+cF9vdXQgPT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJkaGNwX2NyZWF0ZV9tc2c6IGRoY3AtPm1zZ19vdXQgPT0gTlVMTCIsIGRoY3AtPm1zZ19vdXQgPT0gTlVMTCk7CisgIGRoY3AtPnBfb3V0ID0gcGJ1Zl9hbGxvYyhQQlVGX1RSQU5TUE9SVCwgc2l6ZW9mKHN0cnVjdCBkaGNwX21zZyksIFBCVUZfUkFNKTsKKyAgaWYgKGRoY3AtPnBfb3V0ID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgKCJkaGNwX2NyZWF0ZV9tc2coKTogY291bGQgbm90IGFsbG9jYXRlIHBidWZcbiIpKTsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorICBMV0lQX0FTU0VSVCgiZGhjcF9jcmVhdGVfbXNnOiBjaGVjayB0aGF0IGZpcnN0IHBidWYgY2FuIGhvbGQgc3RydWN0IGRoY3BfbXNnIiwKKyAgICAgICAgICAgKGRoY3AtPnBfb3V0LT5sZW4gPj0gc2l6ZW9mKHN0cnVjdCBkaGNwX21zZykpKTsKKworICAvKiByZXVzZSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIGluIHJldHJhbnNtaXNzaW9ucyAqLworICBpZiAoZGhjcC0+dHJpZXMgPT0gMCkgeworICAgICAgeGlkKys7CisgIH0KKyAgZGhjcC0+eGlkID0geGlkOworICBMV0lQX0RFQlVHRihESENQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsCisgICAgICAgICAgICAgICgidHJhbnNhY3Rpb24gaWQgeGlkKCUiWDMyX0YiKVxuIiwgeGlkKSk7CisKKyAgZGhjcC0+bXNnX291dCA9IChzdHJ1Y3QgZGhjcF9tc2cgKilkaGNwLT5wX291dC0+cGF5bG9hZDsKKworICBkaGNwLT5tc2dfb3V0LT5vcCA9IERIQ1BfQk9PVFJFUVVFU1Q7CisgIC8qIFRPRE86IG1ha2UgbGluayBsYXllciBpbmRlcGVuZGVudCAqLworICBkaGNwLT5tc2dfb3V0LT5odHlwZSA9IERIQ1BfSFRZUEVfRVRIOworICBkaGNwLT5tc2dfb3V0LT5obGVuID0gbmV0aWYtPmh3YWRkcl9sZW47CisgIGRoY3AtPm1zZ19vdXQtPmhvcHMgPSAwOworICBkaGNwLT5tc2dfb3V0LT54aWQgPSBodG9ubChkaGNwLT54aWQpOworICBkaGNwLT5tc2dfb3V0LT5zZWNzID0gMDsKKyAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgYnJvYWRjYXN0IGZsYWcgc2luY2Ugd2UgY2FuIHJlY2VpdmUgdW5pY2FzdCB0cmFmZmljCisgICAgIGJlZm9yZSBiZWluZyBmdWxseSBjb25maWd1cmVkISAqLworICBkaGNwLT5tc2dfb3V0LT5mbGFncyA9IDA7CisgIGlwX2FkZHJfc2V0X3plcm8oJmRoY3AtPm1zZ19vdXQtPmNpYWRkcik7CisgIC8qIHNldCBjaWFkZHIgdG8gbmV0aWYtPmlwX2FkZHIgYmFzZWQgb24gbWVzc2FnZV90eXBlIGFuZCBzdGF0ZSAqLworICBpZiAoKG1lc3NhZ2VfdHlwZSA9PSBESENQX0lORk9STSkgfHwgKG1lc3NhZ2VfdHlwZSA9PSBESENQX0RFQ0xJTkUpIHx8CisgICAgICAoKG1lc3NhZ2VfdHlwZSA9PSBESENQX1JFUVVFU1QpICYmIC8qIERIQ1BfQk9VTkQgbm90IHVzZWQgZm9yIHNlbmRpbmchICovCisgICAgICAgKChkaGNwLT5zdGF0ZT09REhDUF9SRU5FV0lORykgfHwgZGhjcC0+c3RhdGU9PURIQ1BfUkVCSU5ESU5HKSkpIHsKKyAgICBpcF9hZGRyX2NvcHkoZGhjcC0+bXNnX291dC0+Y2lhZGRyLCBuZXRpZi0+aXBfYWRkcik7CisgIH0KKyAgaXBfYWRkcl9zZXRfemVybygmZGhjcC0+bXNnX291dC0+eWlhZGRyKTsKKyAgaXBfYWRkcl9zZXRfemVybygmZGhjcC0+bXNnX291dC0+c2lhZGRyKTsKKyAgaXBfYWRkcl9zZXRfemVybygmZGhjcC0+bXNnX291dC0+Z2lhZGRyKTsKKyAgZm9yIChpID0gMDsgaSA8IERIQ1BfQ0hBRERSX0xFTjsgaSsrKSB7CisgICAgLyogY29weSBuZXRpZiBoYXJkd2FyZSBhZGRyZXNzLCBwYWQgd2l0aCB6ZXJvZXMgKi8KKyAgICBkaGNwLT5tc2dfb3V0LT5jaGFkZHJbaV0gPSAoaSA8IG5ldGlmLT5od2FkZHJfbGVuKSA/IG5ldGlmLT5od2FkZHJbaV0gOiAwLyogcGFkIGJ5dGUqLzsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgREhDUF9TTkFNRV9MRU47IGkrKykgeworICAgIGRoY3AtPm1zZ19vdXQtPnNuYW1lW2ldID0gMDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgREhDUF9GSUxFX0xFTjsgaSsrKSB7CisgICAgZGhjcC0+bXNnX291dC0+ZmlsZVtpXSA9IDA7CisgIH0KKyAgZGhjcC0+bXNnX291dC0+Y29va2llID0gUFBfSFRPTkwoREhDUF9NQUdJQ19DT09LSUUpOworICBkaGNwLT5vcHRpb25zX291dF9sZW4gPSAwOworICAvKiBmaWxsIG9wdGlvbnMgZmllbGQgd2l0aCBhbiBpbmNyZW1lbnRpbmcgYXJyYXkgKGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMpICovCisgIGZvciAoaSA9IDA7IGkgPCBESENQX09QVElPTlNfTEVOOyBpKyspIHsKKyAgICBkaGNwLT5tc2dfb3V0LT5vcHRpb25zW2ldID0gKHU4X3QpaTsgLyogZm9yIGRlYnVnZ2luZyBvbmx5LCBubyBtYXR0ZXIgaWYgdHJ1bmNhdGVkICovCisgIH0KKyAgLyogQWRkIG9wdGlvbiBNRVNTQUdFX1RZUEUgKi8KKyAgZGhjcF9vcHRpb24oZGhjcCwgREhDUF9PUFRJT05fTUVTU0FHRV9UWVBFLCBESENQX09QVElPTl9NRVNTQUdFX1RZUEVfTEVOKTsKKyAgZGhjcF9vcHRpb25fYnl0ZShkaGNwLCBtZXNzYWdlX3R5cGUpOworICByZXR1cm4gRVJSX09LOworfQorCisvKioKKyAqIEZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5IHVzZWQgdG8gc2VuZCBhIERIQ1AgcmVxdWVzdC4KKyAqCisgKiBAcGFyYW0gZGhjcCB0aGUgZGhjcCBzdHJ1Y3QgdG8gZnJlZSB0aGUgcmVxdWVzdCBmcm9tCisgKi8KK3N0YXRpYyB2b2lkCitkaGNwX2RlbGV0ZV9tc2coc3RydWN0IGRoY3AgKmRoY3ApCit7CisgIExXSVBfRVJST1IoImRoY3BfZGVsZXRlX21zZzogZGhjcCAhPSBOVUxMIiwgKGRoY3AgIT0gTlVMTCksIHJldHVybjspOworICBMV0lQX0FTU0VSVCgiZGhjcF9kZWxldGVfbXNnOiBkaGNwLT5wX291dCAhPSBOVUxMIiwgZGhjcC0+cF9vdXQgIT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJkaGNwX2RlbGV0ZV9tc2c6IGRoY3AtPm1zZ19vdXQgIT0gTlVMTCIsIGRoY3AtPm1zZ19vdXQgIT0gTlVMTCk7CisgIGlmIChkaGNwLT5wX291dCAhPSBOVUxMKSB7CisgICAgcGJ1Zl9mcmVlKGRoY3AtPnBfb3V0KTsKKyAgfQorICBkaGNwLT5wX291dCA9IE5VTEw7CisgIGRoY3AtPm1zZ19vdXQgPSBOVUxMOworfQorCisvKioKKyAqIEFkZCBhIERIQ1AgbWVzc2FnZSB0cmFpbGVyCisgKgorICogQWRkcyB0aGUgRU5EIG9wdGlvbiB0byB0aGUgREhDUCBtZXNzYWdlLCBhbmQgaWYKKyAqIG5lY2Vzc2FyeSwgdXAgdG8gdGhyZWUgcGFkZGluZyBieXRlcy4KKyAqCisgKiBAcGFyYW0gZGhjcCBESENQIHN0YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZAorZGhjcF9vcHRpb25fdHJhaWxlcihzdHJ1Y3QgZGhjcCAqZGhjcCkKK3sKKyAgTFdJUF9FUlJPUigiZGhjcF9vcHRpb25fdHJhaWxlcjogZGhjcCAhPSBOVUxMIiwgKGRoY3AgIT0gTlVMTCksIHJldHVybjspOworICBMV0lQX0FTU0VSVCgiZGhjcF9vcHRpb25fdHJhaWxlcjogZGhjcC0+bXNnX291dCAhPSBOVUxMXG4iLCBkaGNwLT5tc2dfb3V0ICE9IE5VTEwpOworICBMV0lQX0FTU0VSVCgiZGhjcF9vcHRpb25fdHJhaWxlcjogZGhjcC0+b3B0aW9uc19vdXRfbGVuIDwgREhDUF9PUFRJT05TX0xFTlxuIiwgZGhjcC0+b3B0aW9uc19vdXRfbGVuIDwgREhDUF9PUFRJT05TX0xFTik7CisgIGRoY3AtPm1zZ19vdXQtPm9wdGlvbnNbZGhjcC0+b3B0aW9uc19vdXRfbGVuKytdID0gREhDUF9PUFRJT05fRU5EOworICAvKiBwYWNrZXQgaXMgdG9vIHNtYWxsLCBvciBub3QgNCBieXRlIGFsaWduZWQ/ICovCisgIHdoaWxlICgoZGhjcC0+b3B0aW9uc19vdXRfbGVuIDwgREhDUF9NSU5fT1BUSU9OU19MRU4pIHx8IChkaGNwLT5vcHRpb25zX291dF9sZW4gJiAzKSkgeworICAgIC8qIExXSVBfREVCVUdGKERIQ1BfREVCVUcsKCJkaGNwX29wdGlvbl90cmFpbGVyOmRoY3AtPm9wdGlvbnNfb3V0X2xlbj0lIlUxNl9GIiwgREhDUF9PUFRJT05TX0xFTj0lIlUxNl9GLCBkaGNwLT5vcHRpb25zX291dF9sZW4sIERIQ1BfT1BUSU9OU19MRU4pKTsgKi8KKyAgICBMV0lQX0FTU0VSVCgiZGhjcF9vcHRpb25fdHJhaWxlcjogZGhjcC0+b3B0aW9uc19vdXRfbGVuIDwgREhDUF9PUFRJT05TX0xFTlxuIiwgZGhjcC0+b3B0aW9uc19vdXRfbGVuIDwgREhDUF9PUFRJT05TX0xFTik7CisgICAgLyogYWRkIGEgZmlsbC9wYWRkaW5nIGJ5dGUgKi8KKyAgICBkaGNwLT5tc2dfb3V0LT5vcHRpb25zW2RoY3AtPm9wdGlvbnNfb3V0X2xlbisrXSA9IDA7CisgIH0KK30KKworI2VuZGlmIC8qIExXSVBfREhDUCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL2Rucy5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL2Rucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODA3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvZG5zLmMKQEAgLTAsMCArMSw5NzUgQEAKKy8qKgorICogQGZpbGUKKyAqIEROUyAtIGhvc3QgbmFtZSB0byBJUCBhZGRyZXNzIHJlc29sdmVyLgorICoKKyAqLworCisvKioKKworICogVGhpcyBmaWxlIGltcGxlbWVudHMgYSBETlMgaG9zdCBuYW1lIHRvIElQIGFkZHJlc3MgcmVzb2x2ZXIuCisKKyAqIFBvcnQgdG8gbHdJUCBmcm9tIHVJUAorICogYnkgSmltIFBldHRpbmF0byBBcHJpbCAyMDA3CisKKyAqIHVJUCB2ZXJzaW9uIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBBZGFtIER1bmtlbHMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MKKyAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEROUy5DCisgKgorICogVGhlIGx3SVAgRE5TIHJlc29sdmVyIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBsb29rdXAgYSBob3N0IG5hbWUgYW5kCisgKiBtYXAgaXQgdG8gYSBudW1lcmljYWwgSVAgYWRkcmVzcy4gSXQgbWFpbnRhaW5zIGEgbGlzdCBvZiByZXNvbHZlZAorICogaG9zdG5hbWVzIHRoYXQgY2FuIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZG5zX2xvb2t1cCgpIGZ1bmN0aW9uLgorICogTmV3IGhvc3RuYW1lcyBjYW4gYmUgcmVzb2x2ZWQgdXNpbmcgdGhlIGRuc19xdWVyeSgpIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBsd0lQIHZlcnNpb24gb2YgdGhlIHJlc29sdmVyIGFsc28gYWRkcyBhIG5vbi1ibG9ja2luZyB2ZXJzaW9uIG9mCisgKiBnZXRob3N0YnluYW1lKCkgdGhhdCB3aWxsIHdvcmsgd2l0aCBhIHJhdyBBUEkgYXBwbGljYXRpb24uIFRoaXMgZnVuY3Rpb24KKyAqIGNoZWNrcyBmb3IgYW4gSVAgYWRkcmVzcyBzdHJpbmcgZmlyc3QgYW5kIGNvbnZlcnRzIGl0IGlmIGl0IGlzIHZhbGlkLgorICogZ2V0aG9zdGJ5bmFtZSgpIHRoZW4gZG9lcyBhIGRuc19sb29rdXAoKSB0byBzZWUgaWYgdGhlIG5hbWUgaXMgCisgKiBhbHJlYWR5IGluIHRoZSB0YWJsZS4gSWYgc28sIHRoZSBJUCBpcyByZXR1cm5lZC4gSWYgbm90LCBhIHF1ZXJ5IGlzIAorICogaXNzdWVkIGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJucyB3aXRoIGEgRVJSX0lOUFJPR1JFU1Mgc3RhdHVzLiBUaGUgYXBwCisgKiB1c2luZyB0aGUgZG5zIGNsaWVudCBtdXN0IHRoZW4gZ28gaW50byBhIHdhaXRpbmcgc3RhdGUuCisgKgorICogT25jZSBhIGhvc3RuYW1lIGhhcyBiZWVuIHJlc29sdmVkIChvciBmb3VuZCB0byBiZSBub24tZXhpc3RlbnQpLAorICogdGhlIHJlc29sdmVyIGNvZGUgY2FsbHMgYSBzcGVjaWZpZWQgY2FsbGJhY2sgZnVuY3Rpb24gKHdoaWNoIAorICogbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgbW9kdWxlIHRoYXQgdXNlcyB0aGUgcmVzb2x2ZXIpLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJGQyAxMDM1IC0gRG9tYWluIG5hbWVzIC0gaW1wbGVtZW50YXRpb24gYW5kIHNwZWNpZmljYXRpb24KKyAqIFJGQyAyMTgxIC0gQ2xhcmlmaWNhdGlvbnMgdG8gdGhlIEROUyBTcGVjaWZpY2F0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQHRvZG86IGRlZmluZSBnb29kIGRlZmF1bHQgdmFsdWVzIChyZmMgY29tcGxpYW5jZSkgKi8KKy8qKiBAdG9kbzogaW1wcm92ZSBhbnN3ZXIgcGFyc2luZywgbW9yZSBjaGVja2luZ3MuLi4gKi8KKy8qKiBAdG9kbzogY2hlY2sgUkZDMTAzNSAtIDcuMy4gUHJvY2Vzc2luZyByZXNwb25zZXMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9ETlMgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL3VkcC5oIgorI2luY2x1ZGUgImx3aXAvbWVtLmgiCisjaW5jbHVkZSAibHdpcC9tZW1wLmgiCisjaW5jbHVkZSAibHdpcC9kbnMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiogRE5TIHNlcnZlciBJUCBhZGRyZXNzICovCisjaWZuZGVmIEROU19TRVJWRVJfQUREUkVTUworI2RlZmluZSBETlNfU0VSVkVSX0FERFJFU1MoaXBhZGRyKSAgICAgICAgKGlwNF9hZGRyX3NldF91MzIoaXBhZGRyLCBpcGFkZHJfYWRkcigiMjA4LjY3LjIyMi4yMjIiKSkpIC8qIHJlc29sdmVyMS5vcGVuZG5zLmNvbSAqLworI2VuZGlmCisKKy8qKiBETlMgc2VydmVyIHBvcnQgYWRkcmVzcyAqLworI2lmbmRlZiBETlNfU0VSVkVSX1BPUlQKKyNkZWZpbmUgRE5TX1NFUlZFUl9QT1JUICAgICAgICAgICA1MworI2VuZGlmCisKKy8qKiBETlMgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyB3aGVuIGFza2luZyBmb3IgYSBuYW1lLCBiZWZvcmUgInRpbWVvdXQiLiAqLworI2lmbmRlZiBETlNfTUFYX1JFVFJJRVMKKyNkZWZpbmUgRE5TX01BWF9SRVRSSUVTICAgICAgICAgICA0CisjZW5kaWYKKworLyoqIEROUyByZXNvdXJjZSByZWNvcmQgbWF4LiBUVEwgKG9uZSB3ZWVrIGFzIGRlZmF1bHQpICovCisjaWZuZGVmIEROU19NQVhfVFRMCisjZGVmaW5lIEROU19NQVhfVFRMICAgICAgICAgICAgICAgNjA0ODAwCisjZW5kaWYKKworLyogRE5TIHByb3RvY29sIGZsYWdzICovCisjZGVmaW5lIEROU19GTEFHMV9SRVNQT05TRSAgICAgICAgMHg4MAorI2RlZmluZSBETlNfRkxBRzFfT1BDT0RFX1NUQVRVUyAgIDB4MTAKKyNkZWZpbmUgRE5TX0ZMQUcxX09QQ09ERV9JTlZFUlNFICAweDA4CisjZGVmaW5lIEROU19GTEFHMV9PUENPREVfU1RBTkRBUkQgMHgwMAorI2RlZmluZSBETlNfRkxBRzFfQVVUSE9SQVRJVkUgICAgIDB4MDQKKyNkZWZpbmUgRE5TX0ZMQUcxX1RSVU5DICAgICAgICAgICAweDAyCisjZGVmaW5lIEROU19GTEFHMV9SRCAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBETlNfRkxBRzJfUkEgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgRE5TX0ZMQUcyX0VSUl9NQVNLICAgICAgICAweDBmCisjZGVmaW5lIEROU19GTEFHMl9FUlJfTk9ORSAgICAgICAgMHgwMAorI2RlZmluZSBETlNfRkxBRzJfRVJSX05BTUUgICAgICAgIDB4MDMKKworLyogRE5TIHByb3RvY29sIHN0YXRlcyAqLworI2RlZmluZSBETlNfU1RBVEVfVU5VU0VEICAgICAgICAgIDAKKyNkZWZpbmUgRE5TX1NUQVRFX05FVyAgICAgICAgICAgICAxCisjZGVmaW5lIEROU19TVEFURV9BU0tJTkcgICAgICAgICAgMgorI2RlZmluZSBETlNfU1RBVEVfRE9ORSAgICAgICAgICAgIDMKKworI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9icHN0cnVjdC5oIgorI2VuZGlmCitQQUNLX1NUUlVDVF9CRUdJTgorLyoqIEROUyBtZXNzYWdlIGhlYWRlciAqLworc3RydWN0IGRuc19oZHIgeworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBpZCk7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHU4X3QgZmxhZ3MxKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCBmbGFnczIpOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBudW1xdWVzdGlvbnMpOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBudW1hbnN3ZXJzKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3QgbnVtYXV0aHJyKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3QgbnVtZXh0cmFycik7Cit9IFBBQ0tfU1RSVUNUX1NUUlVDVDsKK1BBQ0tfU1RSVUNUX0VORAorI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9lcHN0cnVjdC5oIgorI2VuZGlmCisjZGVmaW5lIFNJWkVPRl9ETlNfSERSIDEyCisKKy8qKiBETlMgcXVlcnkgbWVzc2FnZSBzdHJ1Y3R1cmUuCisgICAgTm8gcGFja2luZyBuZWVkZWQ6IG9ubHkgdXNlZCBsb2NhbGx5IG9uIHRoZSBzdGFjay4gKi8KK3N0cnVjdCBkbnNfcXVlcnkgeworICAvKiBETlMgcXVlcnkgcmVjb3JkIHN0YXJ0cyB3aXRoIGVpdGhlciBhIGRvbWFpbiBuYW1lIG9yIGEgcG9pbnRlcgorICAgICB0byBhIG5hbWUgYWxyZWFkeSBwcmVzZW50IHNvbWV3aGVyZSBpbiB0aGUgcGFja2V0LiAqLworICB1MTZfdCB0eXBlOworICB1MTZfdCBjbHM7Cit9OworI2RlZmluZSBTSVpFT0ZfRE5TX1FVRVJZIDQKKworLyoqIEROUyBhbnN3ZXIgbWVzc2FnZSBzdHJ1Y3R1cmUuCisgICAgTm8gcGFja2luZyBuZWVkZWQ6IG9ubHkgdXNlZCBsb2NhbGx5IG9uIHRoZSBzdGFjay4gKi8KK3N0cnVjdCBkbnNfYW5zd2VyIHsKKyAgLyogRE5TIGFuc3dlciByZWNvcmQgc3RhcnRzIHdpdGggZWl0aGVyIGEgZG9tYWluIG5hbWUgb3IgYSBwb2ludGVyCisgICAgIHRvIGEgbmFtZSBhbHJlYWR5IHByZXNlbnQgc29tZXdoZXJlIGluIHRoZSBwYWNrZXQuICovCisgIHUxNl90IHR5cGU7CisgIHUxNl90IGNsczsKKyAgdTMyX3QgdHRsOworICB1MTZfdCBsZW47Cit9OworI2RlZmluZSBTSVpFT0ZfRE5TX0FOU1dFUiAxMAorCisvKiogRE5TIHRhYmxlIGVudHJ5ICovCitzdHJ1Y3QgZG5zX3RhYmxlX2VudHJ5IHsKKyAgdThfdCAgc3RhdGU7CisgIHU4X3QgIG51bWRuczsKKyAgdThfdCAgdG1yOworICB1OF90ICByZXRyaWVzOworICB1OF90ICBzZXFubzsKKyAgdThfdCAgZXJyOworICB1MzJfdCB0dGw7CisgIGNoYXIgbmFtZVtETlNfTUFYX05BTUVfTEVOR1RIXTsKKyAgaXBfYWRkcl90IGlwYWRkcjsKKyAgLyogcG9pbnRlciB0byBjYWxsYmFjayBvbiBETlMgcXVlcnkgZG9uZSAqLworICBkbnNfZm91bmRfY2FsbGJhY2sgZm91bmQ7CisgIHZvaWQgKmFyZzsKK307CisKKyNpZiBETlNfTE9DQUxfSE9TVExJU1QKKworI2lmIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDCisvKiogTG9jYWwgaG9zdC1saXN0LiBGb3IgaG9zdG5hbWVzIGluIHRoaXMgbGlzdCwgbm8KKyAqICBleHRlcm5hbCBuYW1lIHJlc29sdXRpb24gaXMgcGVyZm9ybWVkICovCitzdGF0aWMgc3RydWN0IGxvY2FsX2hvc3RsaXN0X2VudHJ5ICpsb2NhbF9ob3N0bGlzdF9keW5hbWljOworI2Vsc2UgLyogRE5TX0xPQ0FMX0hPU1RMSVNUX0lTX0RZTkFNSUMgKi8KKworLyoqIERlZmluaW5nIHRoaXMgYWxsb3dzIHRoZSBsb2NhbF9ob3N0bGlzdF9zdGF0aWMgdG8gYmUgcGxhY2VkIGluIGEgZGlmZmVyZW50CisgKiBsaW5rZXIgc2VjdGlvbiAoZS5nLiBGTEFTSCkgKi8KKyNpZm5kZWYgRE5TX0xPQ0FMX0hPU1RMSVNUX1NUT1JBR0VfUFJFCisjZGVmaW5lIEROU19MT0NBTF9IT1NUTElTVF9TVE9SQUdFX1BSRSBzdGF0aWMKKyNlbmRpZiAvKiBETlNfTE9DQUxfSE9TVExJU1RfU1RPUkFHRV9QUkUgKi8KKy8qKiBEZWZpbmluZyB0aGlzIGFsbG93cyB0aGUgbG9jYWxfaG9zdGxpc3Rfc3RhdGljIHRvIGJlIHBsYWNlZCBpbiBhIGRpZmZlcmVudAorICogbGlua2VyIHNlY3Rpb24gKGUuZy4gRkxBU0gpICovCisjaWZuZGVmIEROU19MT0NBTF9IT1NUTElTVF9TVE9SQUdFX1BPU1QKKyNkZWZpbmUgRE5TX0xPQ0FMX0hPU1RMSVNUX1NUT1JBR0VfUE9TVAorI2VuZGlmIC8qIEROU19MT0NBTF9IT1NUTElTVF9TVE9SQUdFX1BPU1QgKi8KK0ROU19MT0NBTF9IT1NUTElTVF9TVE9SQUdFX1BSRSBzdHJ1Y3QgbG9jYWxfaG9zdGxpc3RfZW50cnkgbG9jYWxfaG9zdGxpc3Rfc3RhdGljW10KKyAgRE5TX0xPQ0FMX0hPU1RMSVNUX1NUT1JBR0VfUE9TVCA9IEROU19MT0NBTF9IT1NUTElTVF9JTklUOworCisjZW5kaWYgLyogRE5TX0xPQ0FMX0hPU1RMSVNUX0lTX0RZTkFNSUMgKi8KKworc3RhdGljIHZvaWQgZG5zX2luaXRfbG9jYWwoKTsKKyNlbmRpZiAvKiBETlNfTE9DQUxfSE9TVExJU1QgKi8KKworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIHZvaWQgZG5zX3JlY3Yodm9pZCAqcywgc3RydWN0IHVkcF9wY2IgKnBjYiwgc3RydWN0IHBidWYgKnAsIGlwX2FkZHJfdCAqYWRkciwgdTE2X3QgcG9ydCk7CitzdGF0aWMgdm9pZCBkbnNfY2hlY2tfZW50cmllcyh2b2lkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEROUyB2YXJpYWJsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgdWRwX3BjYiAgICAgICAgKmRuc19wY2I7CitzdGF0aWMgdThfdCAgICAgICAgICAgICAgICAgICBkbnNfc2Vxbm87CitzdGF0aWMgc3RydWN0IGRuc190YWJsZV9lbnRyeSBkbnNfdGFibGVbRE5TX1RBQkxFX1NJWkVdOworc3RhdGljIGlwX2FkZHJfdCAgICAgICAgICAgICAgZG5zX3NlcnZlcnNbRE5TX01BWF9TRVJWRVJTXTsKKy8qKiBDb250aWd1b3VzIGJ1ZmZlciBmb3IgcHJvY2Vzc2luZyByZXNwb25zZXMgKi8KK3N0YXRpYyB1OF90ICAgICAgICAgICAgICAgICAgIGRuc19wYXlsb2FkX2J1ZmZlcltMV0lQX01FTV9BTElHTl9CVUZGRVIoRE5TX01TR19TSVpFKV07CitzdGF0aWMgdThfdCogICAgICAgICAgICAgICAgICBkbnNfcGF5bG9hZDsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSByZXNvbHZlcjogc2V0IHVwIHRoZSBVRFAgcGNiIGFuZCBjb25maWd1cmUgdGhlIGRlZmF1bHQgc2VydmVyCisgKiAoRE5TX1NFUlZFUl9BRERSRVNTKS4KKyAqLwordm9pZAorZG5zX2luaXQoKQoreworICBpcF9hZGRyX3QgZG5zc2VydmVyOworCisgIGRuc19wYXlsb2FkID0gKHU4X3QgKilMV0lQX01FTV9BTElHTihkbnNfcGF5bG9hZF9idWZmZXIpOworICAKKyAgLyogaW5pdGlhbGl6ZSBkZWZhdWx0IEROUyBzZXJ2ZXIgYWRkcmVzcyAqLworICBETlNfU0VSVkVSX0FERFJFU1MoJmRuc3NlcnZlcik7CisKKyAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImRuc19pbml0OiBpbml0aWFsaXppbmdcbiIpKTsKKworICAvKiBpZiBkbnMgY2xpZW50IG5vdCB5ZXQgaW5pdGlhbGl6ZWQuLi4gKi8KKyAgaWYgKGRuc19wY2IgPT0gTlVMTCkgeworICAgIGRuc19wY2IgPSB1ZHBfbmV3KCk7CisKKyAgICBpZiAoZG5zX3BjYiAhPSBOVUxMKSB7CisgICAgICAvKiBpbml0aWFsaXplIEROUyB0YWJsZSBub3QgbmVlZGVkIChpbml0aWFsaXplZCB0byB6ZXJvIHNpbmNlIGl0IGlzIGEKKyAgICAgICAqIGdsb2JhbCB2YXJpYWJsZSkgKi8KKyAgICAgIExXSVBfQVNTRVJUKCJGb3IgaW1wbGljaXQgaW5pdGlhbGl6YXRpb24gdG8gd29yaywgRE5TX1NUQVRFX1VOVVNFRCBuZWVkcyB0byBiZSAwIiwKKyAgICAgICAgRE5TX1NUQVRFX1VOVVNFRCA9PSAwKTsKKworICAgICAgLyogaW5pdGlhbGl6ZSBETlMgY2xpZW50ICovCisgICAgICB1ZHBfYmluZChkbnNfcGNiLCBJUF9BRERSX0FOWSwgMCk7CisgICAgICB1ZHBfcmVjdihkbnNfcGNiLCBkbnNfcmVjdiwgTlVMTCk7CisKKyAgICAgIC8qIGluaXRpYWxpemUgZGVmYXVsdCBETlMgcHJpbWFyeSBzZXJ2ZXIgKi8KKyAgICAgIGRuc19zZXRzZXJ2ZXIoMCwgJmRuc3NlcnZlcik7CisgICAgfQorICB9CisjaWYgRE5TX0xPQ0FMX0hPU1RMSVNUCisgIGRuc19pbml0X2xvY2FsKCk7CisjZW5kaWYKK30KKworLyoqCisgKiBJbml0aWFsaXplIG9uZSBvZiB0aGUgRE5TIHNlcnZlcnMuCisgKgorICogQHBhcmFtIG51bWRucyB0aGUgaW5kZXggb2YgdGhlIEROUyBzZXJ2ZXIgdG8gc2V0IG11c3QgYmUgPCBETlNfTUFYX1NFUlZFUlMKKyAqIEBwYXJhbSBkbnNzZXJ2ZXIgSVAgYWRkcmVzcyBvZiB0aGUgRE5TIHNlcnZlciB0byBzZXQKKyAqLwordm9pZAorZG5zX3NldHNlcnZlcih1OF90IG51bWRucywgaXBfYWRkcl90ICpkbnNzZXJ2ZXIpCit7CisgIC8qCisgICAqIGhwYTogdGhlIGx3aXAgY29kZSBoYXMgdGhlIGRuc3NlcnZlci0+YWRkciAhPSAwIHRlc3QsIGJ1dCB0aGF0IHdvdWxkCisgICAqIHNlZW0gdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB3YXkgdG8gY2FuY2VsIGEgcHJldmlvdXNseSBnaXZlbgorICAgKiBETlMgc2VydmVyLi4uCisgICAqLworICBpZiAoKG51bWRucyA8IEROU19NQVhfU0VSVkVSUykgJiYgKGRuc19wY2IgIT0gTlVMTCkgJiYKKyAgICAgIChkbnNzZXJ2ZXIgIT0gTlVMTCkgLyogJiYgIWlwX2FkZHJfaXNhbnkoZG5zc2VydmVyKSAqLykgeworICAgIGRuc19zZXJ2ZXJzW251bWRuc10gPSAoKmRuc3NlcnZlcik7CisgIH0KK30KKworLyoqCisgKiBPYnRhaW4gb25lIG9mIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBETlMgc2VydmVyLgorICoKKyAqIEBwYXJhbSBudW1kbnMgdGhlIGluZGV4IG9mIHRoZSBETlMgc2VydmVyCisgKiBAcmV0dXJuIElQIGFkZHJlc3Mgb2YgdGhlIGluZGV4ZWQgRE5TIHNlcnZlciBvciAiaXBfYWRkcl9hbnkiIGlmIHRoZSBETlMKKyAqICAgICAgICAgc2VydmVyIGhhcyBub3QgYmVlbiBjb25maWd1cmVkLgorICovCitpcF9hZGRyX3QKK2Ruc19nZXRzZXJ2ZXIodThfdCBudW1kbnMpCit7CisgIGlmIChudW1kbnMgPCBETlNfTUFYX1NFUlZFUlMpIHsKKyAgICByZXR1cm4gZG5zX3NlcnZlcnNbbnVtZG5zXTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKklQX0FERFJfQU5ZOworICB9Cit9CisKKy8qKgorICogVGhlIEROUyByZXNvbHZlciBjbGllbnQgdGltZXIgLSBoYW5kbGUgcmV0cmllcyBhbmQgdGltZW91dHMgYW5kIHNob3VsZAorICogYmUgY2FsbGVkIGV2ZXJ5IEROU19UTVJfSU5URVJWQUwgbWlsbGlzZWNvbmRzIChldmVyeSBzZWNvbmQgYnkgZGVmYXVsdCkuCisgKi8KK3ZvaWQKK2Ruc190bXIodm9pZCkKK3sKKyAgaWYgKGRuc19wY2IgIT0gTlVMTCkgeworICAgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJkbnNfdG1yOiBkbnNfY2hlY2tfZW50cmllc1xuIikpOworICAgIGRuc19jaGVja19lbnRyaWVzKCk7CisgIH0KK30KKworI2lmIEROU19MT0NBTF9IT1NUTElTVAorc3RhdGljIHZvaWQKK2Ruc19pbml0X2xvY2FsKCkKK3sKKyNpZiBETlNfTE9DQUxfSE9TVExJU1RfSVNfRFlOQU1JQyAmJiBkZWZpbmVkKEROU19MT0NBTF9IT1NUTElTVF9JTklUKQorICBpbnQgaTsKKyAgc3RydWN0IGxvY2FsX2hvc3RsaXN0X2VudHJ5ICplbnRyeTsKKyAgLyogRHluYW1pYzogY29weSBlbnRyaWVzIGZyb20gRE5TX0xPQ0FMX0hPU1RMSVNUX0lOSVQgdG8gbGlzdCAqLworICBzdHJ1Y3QgbG9jYWxfaG9zdGxpc3RfZW50cnkgbG9jYWxfaG9zdGxpc3RfaW5pdFtdID0gRE5TX0xPQ0FMX0hPU1RMSVNUX0lOSVQ7CisgIHNpemVfdCBuYW1lbGVuOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGxvY2FsX2hvc3RsaXN0X2luaXQpIC8gc2l6ZW9mKHN0cnVjdCBsb2NhbF9ob3N0bGlzdF9lbnRyeSk7IGkrKykgeworICAgIHN0cnVjdCBsb2NhbF9ob3N0bGlzdF9lbnRyeSAqaW5pdF9lbnRyeSA9ICZsb2NhbF9ob3N0bGlzdF9pbml0W2ldOworICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGhvc3QgbmFtZSAoTlVMTCkiLCBpbml0X2VudHJ5LT5uYW1lICE9IE5VTEwpOworICAgIG5hbWVsZW4gPSBzdHJsZW4oaW5pdF9lbnRyeS0+bmFtZSk7CisgICAgTFdJUF9BU1NFUlQoIm5hbWVsZW4gPD0gRE5TX0xPQ0FMX0hPU1RMSVNUX01BWF9OQU1FTEVOIiwgbmFtZWxlbiA8PSBETlNfTE9DQUxfSE9TVExJU1RfTUFYX05BTUVMRU4pOworICAgIGVudHJ5ID0gKHN0cnVjdCBsb2NhbF9ob3N0bGlzdF9lbnRyeSAqKW1lbXBfbWFsbG9jKE1FTVBfTE9DQUxIT1NUTElTVCk7CisgICAgTFdJUF9BU1NFUlQoIm1lbS1lcnJvciBpbiBkbnNfaW5pdF9sb2NhbCIsIGVudHJ5ICE9IE5VTEwpOworICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7CisgICAgICBlbnRyeS0+bmFtZSA9IChjaGFyKillbnRyeSArIHNpemVvZihzdHJ1Y3QgbG9jYWxfaG9zdGxpc3RfZW50cnkpOworICAgICAgTUVNQ1BZKChjaGFyKillbnRyeS0+bmFtZSwgaW5pdF9lbnRyeS0+bmFtZSwgbmFtZWxlbik7CisgICAgICAoKGNoYXIqKWVudHJ5LT5uYW1lKVtuYW1lbGVuXSA9IDA7CisgICAgICBlbnRyeS0+YWRkciA9IGluaXRfZW50cnktPmFkZHI7CisgICAgICBlbnRyeS0+bmV4dCA9IGxvY2FsX2hvc3RsaXN0X2R5bmFtaWM7CisgICAgICBsb2NhbF9ob3N0bGlzdF9keW5hbWljID0gZW50cnk7CisgICAgfQorICB9CisjZW5kaWYgLyogRE5TX0xPQ0FMX0hPU1RMSVNUX0lTX0RZTkFNSUMgJiYgZGVmaW5lZChETlNfTE9DQUxfSE9TVExJU1RfSU5JVCkgKi8KK30KKworLyoqCisgKiBTY2FucyB0aGUgbG9jYWwgaG9zdC1saXN0IGZvciBhIGhvc3RuYW1lLgorICoKKyAqIEBwYXJhbSBob3N0bmFtZSBIb3N0bmFtZSB0byBsb29rIGZvciBpbiB0aGUgbG9jYWwgaG9zdC1saXN0CisgKiBAcmV0dXJuIFRoZSBmaXJzdCBJUCBhZGRyZXNzIGZvciB0aGUgaG9zdG5hbWUgaW4gdGhlIGxvY2FsIGhvc3QtbGlzdCBvcgorICogICAgICAgICBJUEFERFJfTk9ORSBpZiBub3QgZm91bmQuCisgKi8KK3N0YXRpYyB1MzJfdAorZG5zX2xvb2t1cF9sb2NhbChjb25zdCBjaGFyICpob3N0bmFtZSkKK3sKKyNpZiBETlNfTE9DQUxfSE9TVExJU1RfSVNfRFlOQU1JQworICBzdHJ1Y3QgbG9jYWxfaG9zdGxpc3RfZW50cnkgKmVudHJ5ID0gbG9jYWxfaG9zdGxpc3RfZHluYW1pYzsKKyAgd2hpbGUoZW50cnkgIT0gTlVMTCkgeworICAgIGlmKHN0cmNtcChlbnRyeS0+bmFtZSwgaG9zdG5hbWUpID09IDApIHsKKyAgICAgIHJldHVybiBpcDRfYWRkcl9nZXRfdTMyKCZlbnRyeS0+YWRkcik7CisgICAgfQorICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgIH0KKyNlbHNlIC8qIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDICovCisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGxvY2FsX2hvc3RsaXN0X3N0YXRpYykgLyBzaXplb2Yoc3RydWN0IGxvY2FsX2hvc3RsaXN0X2VudHJ5KTsgaSsrKSB7CisgICAgaWYoc3RyY21wKGxvY2FsX2hvc3RsaXN0X3N0YXRpY1tpXS5uYW1lLCBob3N0bmFtZSkgPT0gMCkgeworICAgICAgcmV0dXJuIGlwNF9hZGRyX2dldF91MzIoJmxvY2FsX2hvc3RsaXN0X3N0YXRpY1tpXS5hZGRyKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBETlNfTE9DQUxfSE9TVExJU1RfSVNfRFlOQU1JQyAqLworICByZXR1cm4gSVBBRERSX05PTkU7Cit9CisKKyNpZiBETlNfTE9DQUxfSE9TVExJU1RfSVNfRFlOQU1JQworLyoqIFJlbW92ZSBhbGwgZW50cmllcyBmcm9tIHRoZSBsb2NhbCBob3N0LWxpc3QgZm9yIGEgc3BlY2lmaWMgaG9zdG5hbWUKKyAqIGFuZC9vciBJUCBhZGRlc3MKKyAqCisgKiBAcGFyYW0gaG9zdG5hbWUgaG9zdG5hbWUgZm9yIHdoaWNoIGVudHJpZXMgc2hhbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsb2NhbAorICogICAgICAgICAgICAgICAgIGhvc3QtbGlzdAorICogQHBhcmFtIGFkZHIgYWRkcmVzcyBmb3Igd2hpY2ggZW50cmllcyBzaGFsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxvY2FsIGhvc3QtbGlzdAorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJlbW92ZWQgZW50cmllcworICovCitpbnQKK2Ruc19sb2NhbF9yZW1vdmVob3N0KGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBpcF9hZGRyX3QgKmFkZHIpCit7CisgIGludCByZW1vdmVkID0gMDsKKyAgc3RydWN0IGxvY2FsX2hvc3RsaXN0X2VudHJ5ICplbnRyeSA9IGxvY2FsX2hvc3RsaXN0X2R5bmFtaWM7CisgIHN0cnVjdCBsb2NhbF9ob3N0bGlzdF9lbnRyeSAqbGFzdF9lbnRyeSA9IE5VTEw7CisgIHdoaWxlIChlbnRyeSAhPSBOVUxMKSB7CisgICAgaWYgKCgoaG9zdG5hbWUgPT0gTlVMTCkgfHwgIXN0cmNtcChlbnRyeS0+bmFtZSwgaG9zdG5hbWUpKSAmJgorICAgICAgICAoKGFkZHIgPT0gTlVMTCkgfHwgaXBfYWRkcl9jbXAoJmVudHJ5LT5hZGRyLCBhZGRyKSkpIHsKKyAgICAgIHN0cnVjdCBsb2NhbF9ob3N0bGlzdF9lbnRyeSAqZnJlZV9lbnRyeTsKKyAgICAgIGlmIChsYXN0X2VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgbGFzdF9lbnRyeS0+bmV4dCA9IGVudHJ5LT5uZXh0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9jYWxfaG9zdGxpc3RfZHluYW1pYyA9IGVudHJ5LT5uZXh0OworICAgICAgfQorICAgICAgZnJlZV9lbnRyeSA9IGVudHJ5OworICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICAgIG1lbXBfZnJlZShNRU1QX0xPQ0FMSE9TVExJU1QsIGZyZWVfZW50cnkpOworICAgICAgcmVtb3ZlZCsrOworICAgIH0gZWxzZSB7CisgICAgICBsYXN0X2VudHJ5ID0gZW50cnk7CisgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgIH0KKyAgfQorICByZXR1cm4gcmVtb3ZlZDsKK30KKworLyoqCisgKiBBZGQgYSBob3N0bmFtZS9JUCBhZGRyZXNzIHBhaXIgdG8gdGhlIGxvY2FsIGhvc3QtbGlzdC4KKyAqIER1cGxpY2F0ZXMgYXJlIG5vdCBjaGVja2VkLgorICoKKyAqIEBwYXJhbSBob3N0bmFtZSBob3N0bmFtZSBvZiB0aGUgbmV3IGVudHJ5CisgKiBAcGFyYW0gYWRkciBJUCBhZGRyZXNzIG9mIHRoZSBuZXcgZW50cnkKKyAqIEByZXR1cm4gRVJSX09LIGlmIHN1Y2NlZWRlZCBvciBFUlJfTUVNIG9uIG1lbW9yeSBlcnJvcgorICovCitlcnJfdAorZG5zX2xvY2FsX2FkZGhvc3QoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGlwX2FkZHJfdCAqYWRkcikKK3sKKyAgc3RydWN0IGxvY2FsX2hvc3RsaXN0X2VudHJ5ICplbnRyeTsKKyAgc2l6ZV90IG5hbWVsZW47CisgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGhvc3QgbmFtZSAoTlVMTCkiLCBob3N0bmFtZSAhPSBOVUxMKTsKKyAgbmFtZWxlbiA9IHN0cmxlbihob3N0bmFtZSk7CisgIExXSVBfQVNTRVJUKCJuYW1lbGVuIDw9IEROU19MT0NBTF9IT1NUTElTVF9NQVhfTkFNRUxFTiIsIG5hbWVsZW4gPD0gRE5TX0xPQ0FMX0hPU1RMSVNUX01BWF9OQU1FTEVOKTsKKyAgZW50cnkgPSAoc3RydWN0IGxvY2FsX2hvc3RsaXN0X2VudHJ5ICopbWVtcF9tYWxsb2MoTUVNUF9MT0NBTEhPU1RMSVNUKTsKKyAgaWYgKGVudHJ5ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorICBlbnRyeS0+bmFtZSA9IChjaGFyKillbnRyeSArIHNpemVvZihzdHJ1Y3QgbG9jYWxfaG9zdGxpc3RfZW50cnkpOworICBNRU1DUFkoKGNoYXIqKWVudHJ5LT5uYW1lLCBob3N0bmFtZSwgbmFtZWxlbik7CisgICgoY2hhciopZW50cnktPm5hbWUpW25hbWVsZW5dID0gMDsKKyAgaXBfYWRkcl9jb3B5KGVudHJ5LT5hZGRyLCAqYWRkcik7CisgIGVudHJ5LT5uZXh0ID0gbG9jYWxfaG9zdGxpc3RfZHluYW1pYzsKKyAgbG9jYWxfaG9zdGxpc3RfZHluYW1pYyA9IGVudHJ5OworICByZXR1cm4gRVJSX09LOworfQorI2VuZGlmIC8qIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDKi8KKyNlbmRpZiAvKiBETlNfTE9DQUxfSE9TVExJU1QgKi8KKworLyoqCisgKiBMb29rIHVwIGEgaG9zdG5hbWUgaW4gdGhlIGFycmF5IG9mIGtub3duIGhvc3RuYW1lcy4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG9ubHkgbG9va3MgaW4gdGhlIGludGVybmFsIGFycmF5IG9mIGtub3duCisgKiBob3N0bmFtZXMsIGl0IGRvZXMgbm90IHNlbmQgb3V0IGEgcXVlcnkgZm9yIHRoZSBob3N0bmFtZSBpZiBub25lCisgKiB3YXMgZm91bmQuIFRoZSBmdW5jdGlvbiBkbnNfZW5xdWV1ZSgpIGNhbiBiZSB1c2VkIHRvIHNlbmQgYSBxdWVyeQorICogZm9yIGEgaG9zdG5hbWUuCisgKgorICogQHBhcmFtIG5hbWUgdGhlIGhvc3RuYW1lIHRvIGxvb2sgdXAKKyAqIEByZXR1cm4gdGhlIGhvc3RuYW1lJ3MgSVAgYWRkcmVzcywgYXMgdTMyX3QgKGluc3RlYWQgb2YgaXBfYWRkcl90IHRvCisgKiAgICAgICAgIGJldHRlciBjaGVjayBmb3IgZmFpbHVyZTogIT0gSVBBRERSX05PTkUpIG9yIElQQUREUl9OT05FIGlmIHRoZSBob3N0bmFtZQorICogICAgICAgICB3YXMgbm90IGZvdW5kIGluIHRoZSBjYWNoZWQgZG5zX3RhYmxlLgorICovCitzdGF0aWMgdTMyX3QKK2Ruc19sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgdThfdCBpOworI2lmIEROU19MT0NBTF9IT1NUTElTVCB8fCBkZWZpbmVkKEROU19MT09LVVBfTE9DQUxfRVhURVJOKQorICB1MzJfdCBhZGRyOworI2VuZGlmIC8qIEROU19MT0NBTF9IT1NUTElTVCB8fCBkZWZpbmVkKEROU19MT09LVVBfTE9DQUxfRVhURVJOKSAqLworI2lmIEROU19MT0NBTF9IT1NUTElTVAorICBpZiAoKGFkZHIgPSBkbnNfbG9va3VwX2xvY2FsKG5hbWUpKSAhPSBJUEFERFJfTk9ORSkgeworICAgIHJldHVybiBhZGRyOworICB9CisjZW5kaWYgLyogRE5TX0xPQ0FMX0hPU1RMSVNUICovCisjaWZkZWYgRE5TX0xPT0tVUF9MT0NBTF9FWFRFUk4KKyAgaWYoKGFkZHIgPSBETlNfTE9PS1VQX0xPQ0FMX0VYVEVSTihuYW1lKSkgIT0gSVBBRERSX05PTkUpIHsKKyAgICByZXR1cm4gYWRkcjsKKyAgfQorI2VuZGlmIC8qIEROU19MT09LVVBfTE9DQUxfRVhURVJOICovCisKKyAgLyogV2FsayB0aHJvdWdoIG5hbWUgbGlzdCwgcmV0dXJuIGVudHJ5IGlmIGZvdW5kLiBJZiBub3QsIHJldHVybiBOVUxMLiAqLworICBmb3IgKGkgPSAwOyBpIDwgRE5TX1RBQkxFX1NJWkU7ICsraSkgeworICAgIGlmICgoZG5zX3RhYmxlW2ldLnN0YXRlID09IEROU19TVEFURV9ET05FKSAmJgorICAgICAgICAoc3RyY21wKG5hbWUsIGRuc190YWJsZVtpXS5uYW1lKSA9PSAwKSkgeworICAgICAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImRuc19sb29rdXA6IFwiJXNcIjogZm91bmQgPSAiLCBuYW1lKSk7CisgICAgICBpcF9hZGRyX2RlYnVnX3ByaW50KEROU19ERUJVRywgJihkbnNfdGFibGVbaV0uaXBhZGRyKSk7CisgICAgICBMV0lQX0RFQlVHRihETlNfREVCVUcsICgiXG4iKSk7CisgICAgICByZXR1cm4gaXA0X2FkZHJfZ2V0X3UzMigmZG5zX3RhYmxlW2ldLmlwYWRkcik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIElQQUREUl9OT05FOworfQorCisjaWYgRE5TX0RPRVNfTkFNRV9DSEVDSworLyoqCisgKiBDb21wYXJlIHRoZSAiZG90dGVkIiBuYW1lICJxdWVyeSIgd2l0aCB0aGUgZW5jb2RlZCBuYW1lICJyZXNwb25zZSIKKyAqIHRvIG1ha2Ugc3VyZSBhbiBhbnN3ZXIgZnJvbSB0aGUgRE5TIHNlcnZlciBtYXRjaGVzIHRoZSBjdXJyZW50IGRuc190YWJsZQorICogZW50cnkgKG90aGVyd2lzZSwgYW5zd2VycyBtaWdodCBhcnJpdmUgbGF0ZSBmb3IgaG9zdG5hbWUgbm90IG9uIHRoZSBsaXN0CisgKiBhbnkgbW9yZSkuCisgKgorICogQHBhcmFtIHF1ZXJ5IGhvc3RuYW1lIChub3QgZW5jb2RlZCkgZnJvbSB0aGUgZG5zX3RhYmxlCisgKiBAcGFyYW0gcmVzcG9uc2UgZW5jb2RlZCBob3N0bmFtZSBpbiB0aGUgRE5TIHJlc3BvbnNlCisgKiBAcmV0dXJuIDA6IG5hbWVzIGVxdWFsOyAxOiBuYW1lcyBkaWZmZXIKKyAqLworc3RhdGljIHU4X3QKK2Ruc19jb21wYXJlX25hbWUodW5zaWduZWQgY2hhciAqcXVlcnksIHVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlKQoreworICB1bnNpZ25lZCBjaGFyIG47CisKKyAgZG8geworICAgIG4gPSAqcmVzcG9uc2UrKzsKKyAgICAvKiogQHNlZSBSRkMgMTAzNSAtIDQuMS40LiBNZXNzYWdlIGNvbXByZXNzaW9uICovCisgICAgaWYgKChuICYgMHhjMCkgPT0gMHhjMCkgeworICAgICAgLyogQ29tcHJlc3NlZCBuYW1lICovCisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgLyogTm90IGNvbXByZXNzZWQgbmFtZSAqLworICAgICAgd2hpbGUgKG4gPiAwKSB7CisgICAgICAgIGlmICgoKnF1ZXJ5KSAhPSAoKnJlc3BvbnNlKSkgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICsrcmVzcG9uc2U7CisgICAgICAgICsrcXVlcnk7CisgICAgICAgIC0tbjsKKyAgICAgIH07CisgICAgICArK3F1ZXJ5OworICAgIH0KKyAgfSB3aGlsZSAoKnJlc3BvbnNlICE9IDApOworCisgIHJldHVybiAwOworfQorI2VuZGlmIC8qIEROU19ET0VTX05BTUVfQ0hFQ0sgKi8KKworLyoqCisgKiBXYWxrIHRocm91Z2ggYSBjb21wYWN0IGVuY29kZWQgRE5TIG5hbWUgYW5kIHJldHVybiB0aGUgZW5kIG9mIHRoZSBuYW1lLgorICoKKyAqIEBwYXJhbSBxdWVyeSBlbmNvZGVkIEROUyBuYW1lIGluIHRoZSBETlMgc2VydmVyIHJlc3BvbnNlCisgKiBAcmV0dXJuIGVuZCBvZiB0aGUgbmFtZQorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitkbnNfcGFyc2VfbmFtZSh1bnNpZ25lZCBjaGFyICpxdWVyeSkKK3sKKyAgdW5zaWduZWQgY2hhciBuOworCisgIGRvIHsKKyAgICBuID0gKnF1ZXJ5Kys7CisgICAgLyoqIEBzZWUgUkZDIDEwMzUgLSA0LjEuNC4gTWVzc2FnZSBjb21wcmVzc2lvbiAqLworICAgIGlmICgobiAmIDB4YzApID09IDB4YzApIHsKKyAgICAgIC8qIENvbXByZXNzZWQgbmFtZSAqLworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE5vdCBjb21wcmVzc2VkIG5hbWUgKi8KKyAgICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICArK3F1ZXJ5OworICAgICAgICAtLW47CisgICAgICB9OworICAgIH0KKyAgfSB3aGlsZSAoKnF1ZXJ5ICE9IDApOworCisgIHJldHVybiBxdWVyeSArIDE7Cit9CisKKy8qKgorICogU2VuZCBhIEROUyBxdWVyeSBwYWNrZXQuCisgKgorICogQHBhcmFtIG51bWRucyBpbmRleCBvZiB0aGUgRE5TIHNlcnZlciBpbiB0aGUgZG5zX3NlcnZlcnMgdGFibGUKKyAqIEBwYXJhbSBuYW1lIGhvc3RuYW1lIHRvIHF1ZXJ5CisgKiBAcGFyYW0gaWQgaW5kZXggb2YgdGhlIGhvc3RuYW1lIGluIGRuc190YWJsZSwgdXNlZCBhcyB0cmFuc2FjdGlvbiBJRCBpbiB0aGUKKyAqICAgICAgICBETlMgcXVlcnkgcGFja2V0CisgKiBAcmV0dXJuIEVSUl9PSyBpZiBwYWNrZXQgaXMgc2VudDsgYW4gZXJyX3QgaW5kaWNhdGluZyB0aGUgcHJvYmxlbSBvdGhlcndpc2UKKyAqLworc3RhdGljIGVycl90CitkbnNfc2VuZCh1OF90IG51bWRucywgY29uc3QgY2hhciogbmFtZSwgdThfdCBpZCkKK3sKKyAgZXJyX3QgZXJyOworICBzdHJ1Y3QgZG5zX2hkciAqaGRyOworICBzdHJ1Y3QgZG5zX3F1ZXJ5IHFyeTsKKyAgc3RydWN0IHBidWYgKnA7CisgIGNoYXIgKnF1ZXJ5LCAqbnB0cjsKKyAgY29uc3QgY2hhciAqcEhvc3RuYW1lOworICB1OF90IG47CisKKyAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImRuc19zZW5kOiBkbnNfc2VydmVyc1slIlUxNl9GIl0gXCIlc1wiOiByZXF1ZXN0XG4iLAorICAgICAgICAgICAgICAodTE2X3QpKG51bWRucyksIG5hbWUpKTsKKyAgTFdJUF9BU1NFUlQoImRucyBzZXJ2ZXIgb3V0IG9mIGFycmF5IiwgbnVtZG5zIDwgRE5TX01BWF9TRVJWRVJTKTsKKyAgTFdJUF9BU1NFUlQoImRucyBzZXJ2ZXIgaGFzIG5vIElQIGFkZHJlc3Mgc2V0IiwgIWlwX2FkZHJfaXNhbnkoJmRuc19zZXJ2ZXJzW251bWRuc10pKTsKKworICAvKiBpZiBoZXJlLCB3ZSBoYXZlIGVpdGhlciBhIG5ldyBxdWVyeSBvciBhIHJldHJ5IG9uIGEgcHJldmlvdXMgcXVlcnkgdG8gcHJvY2VzcyAqLworICBwID0gcGJ1Zl9hbGxvYyhQQlVGX1RSQU5TUE9SVCwgU0laRU9GX0ROU19IRFIgKyBETlNfTUFYX05BTUVfTEVOR1RIICsKKyAgICAgICAgICAgICAgICAgU0laRU9GX0ROU19RVUVSWSwgUEJVRl9SQU0pOworICBpZiAocCAhPSBOVUxMKSB7CisgICAgTFdJUF9BU1NFUlQoInBidWYgbXVzdCBiZSBpbiBvbmUgcGllY2UiLCBwLT5uZXh0ID09IE5VTEwpOworICAgIC8qIGZpbGwgZG5zIGhlYWRlciAqLworICAgIGhkciA9IChzdHJ1Y3QgZG5zX2hkciopcC0+cGF5bG9hZDsKKyAgICBtZW1zZXQoaGRyLCAwLCBTSVpFT0ZfRE5TX0hEUik7CisgICAgaGRyLT5pZCA9IGh0b25zKGlkKTsKKyAgICBoZHItPmZsYWdzMSA9IEROU19GTEFHMV9SRDsKKyAgICBoZHItPm51bXF1ZXN0aW9ucyA9IFBQX0hUT05TKDEpOworICAgIHF1ZXJ5ID0gKGNoYXIqKWhkciArIFNJWkVPRl9ETlNfSERSOworICAgIHBIb3N0bmFtZSA9IG5hbWU7CisgICAgLS1wSG9zdG5hbWU7CisKKyAgICAvKiBjb252ZXJ0IGhvc3RuYW1lIGludG8gc3VpdGFibGUgcXVlcnkgZm9ybWF0LiAqLworICAgIGRvIHsKKyAgICAgICsrcEhvc3RuYW1lOworICAgICAgbnB0ciA9IHF1ZXJ5OworICAgICAgKytxdWVyeTsKKyAgICAgIGZvcihuID0gMDsgKnBIb3N0bmFtZSAhPSAnLicgJiYgKnBIb3N0bmFtZSAhPSAwOyArK3BIb3N0bmFtZSkgeworICAgICAgICAqcXVlcnkgPSAqcEhvc3RuYW1lOworICAgICAgICArK3F1ZXJ5OworICAgICAgICArK247CisgICAgICB9CisgICAgICAqbnB0ciA9IG47CisgICAgfSB3aGlsZSgqcEhvc3RuYW1lICE9IDApOworICAgICpxdWVyeSsrPSdcMCc7CisKKyAgICAvKiBmaWxsIGRucyBxdWVyeSAqLworICAgIHFyeS50eXBlID0gUFBfSFRPTlMoRE5TX1JSVFlQRV9BKTsKKyAgICBxcnkuY2xzID0gUFBfSFRPTlMoRE5TX1JSQ0xBU1NfSU4pOworICAgIFNNRU1DUFkocXVlcnksICZxcnksIFNJWkVPRl9ETlNfUVVFUlkpOworCisgICAgLyogcmVzaXplIHBidWYgdG8gdGhlIGV4YWN0IGRucyBxdWVyeSAqLworICAgIHBidWZfcmVhbGxvYyhwLCAodTE2X3QpKChxdWVyeSArIFNJWkVPRl9ETlNfUVVFUlkpIC0gKChjaGFyKikocC0+cGF5bG9hZCkpKSk7CisKKyAgICAvKiBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgZm9yIGZhc3RlciByZWNlaXZpbmcgKi8KKyAgICB1ZHBfY29ubmVjdChkbnNfcGNiLCAmZG5zX3NlcnZlcnNbbnVtZG5zXSwgRE5TX1NFUlZFUl9QT1JUKTsKKyAgICAvKiBzZW5kIGRucyBwYWNrZXQgKi8KKyAgICBlcnIgPSB1ZHBfc2VuZHRvKGRuc19wY2IsIHAsICZkbnNfc2VydmVyc1tudW1kbnNdLCBETlNfU0VSVkVSX1BPUlQpOworCisgICAgLyogZnJlZSBwYnVmICovCisgICAgcGJ1Zl9mcmVlKHApOworICB9IGVsc2UgeworICAgIGVyciA9IEVSUl9NRU07CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIGRuc19jaGVja19lbnRyeSgpIC0gc2VlIGlmIHBFbnRyeSBoYXMgbm90IHlldCBiZWVuIHF1ZXJpZWQgYW5kLCBpZiBzbywgc2VuZHMgb3V0IGEgcXVlcnkuCisgKiBDaGVjayBhbiBlbnRyeSBpbiB0aGUgZG5zX3RhYmxlOgorICogLSBzZW5kIG91dCBxdWVyeSBmb3IgbmV3IGVudHJpZXMKKyAqIC0gcmV0cnkgb2xkIHBlbmRpbmcgZW50cmllcyBvbiB0aW1lb3V0IChhbHNvIHdpdGggZGlmZmVyZW50IHNlcnZlcnMpCisgKiAtIHJlbW92ZSBjb21wbGV0ZWQgZW50cmllcyBmcm9tIHRoZSB0YWJsZSBpZiB0aGVpciBUVEwgaGFzIGV4cGlyZWQKKyAqCisgKiBAcGFyYW0gaSBpbmRleCBvZiB0aGUgZG5zX3RhYmxlIGVudHJ5IHRvIGNoZWNrCisgKi8KK3N0YXRpYyB2b2lkCitkbnNfY2hlY2tfZW50cnkodThfdCBpKQoreworICBlcnJfdCBlcnI7CisgIHN0cnVjdCBkbnNfdGFibGVfZW50cnkgKnBFbnRyeSA9ICZkbnNfdGFibGVbaV07CisKKyAgTFdJUF9BU1NFUlQoImFycmF5IGluZGV4IG91dCBvZiBib3VuZHMiLCBpIDwgRE5TX1RBQkxFX1NJWkUpOworCisgIHN3aXRjaChwRW50cnktPnN0YXRlKSB7CisKKyAgICBjYXNlIEROU19TVEFURV9ORVc6IHsKKyAgICAgIC8qIGluaXRpYWxpemUgbmV3IGVudHJ5ICovCisgICAgICBwRW50cnktPnN0YXRlICAgPSBETlNfU1RBVEVfQVNLSU5HOworICAgICAgcEVudHJ5LT5udW1kbnMgID0gMDsKKyAgICAgIHBFbnRyeS0+dG1yICAgICA9IDE7CisgICAgICBwRW50cnktPnJldHJpZXMgPSAwOworICAgICAgCisgICAgICAvKiBzZW5kIEROUyBwYWNrZXQgZm9yIHRoaXMgZW50cnkgKi8KKyAgICAgIGVyciA9IGRuc19zZW5kKHBFbnRyeS0+bnVtZG5zLCBwRW50cnktPm5hbWUsIGkpOworICAgICAgaWYgKGVyciAhPSBFUlJfT0spIHsKKyAgICAgICAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgKCJkbnNfc2VuZCByZXR1cm5lZCBlcnJvcjogJXNcbiIsIGx3aXBfc3RyZXJyKGVycikpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgRE5TX1NUQVRFX0FTS0lORzogeworICAgICAgaWYgKC0tcEVudHJ5LT50bXIgPT0gMCkgeworICAgICAgICBpZiAoKytwRW50cnktPnJldHJpZXMgPT0gRE5TX01BWF9SRVRSSUVTKSB7CisgICAgICAgICAgaWYgKChwRW50cnktPm51bWRucysxPEROU19NQVhfU0VSVkVSUykgJiYgIWlwX2FkZHJfaXNhbnkoJmRuc19zZXJ2ZXJzW3BFbnRyeS0+bnVtZG5zKzFdKSkgeworICAgICAgICAgICAgLyogY2hhbmdlIG9mIHNlcnZlciAqLworICAgICAgICAgICAgcEVudHJ5LT5udW1kbnMrKzsKKyAgICAgICAgICAgIHBFbnRyeS0+dG1yICAgICA9IDE7CisgICAgICAgICAgICBwRW50cnktPnJldHJpZXMgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJkbnNfY2hlY2tfZW50cnk6IFwiJXNcIjogdGltZW91dFxuIiwgcEVudHJ5LT5uYW1lKSk7CisgICAgICAgICAgICAvKiBjYWxsIHNwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbiBpZiBwcm92aWRlZCAqLworICAgICAgICAgICAgaWYgKHBFbnRyeS0+Zm91bmQpCisgICAgICAgICAgICAgICgqcEVudHJ5LT5mb3VuZCkocEVudHJ5LT5uYW1lLCBOVUxMLCBwRW50cnktPmFyZyk7CisgICAgICAgICAgICAvKiBmbHVzaCB0aGlzIGVudHJ5ICovCisgICAgICAgICAgICBwRW50cnktPnN0YXRlICAgPSBETlNfU1RBVEVfVU5VU0VEOworICAgICAgICAgICAgcEVudHJ5LT5mb3VuZCAgID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHdhaXQgbG9uZ2VyIGZvciB0aGUgbmV4dCByZXRyeSAqLworICAgICAgICBwRW50cnktPnRtciA9IHBFbnRyeS0+cmV0cmllczsKKworICAgICAgICAvKiBzZW5kIEROUyBwYWNrZXQgZm9yIHRoaXMgZW50cnkgKi8KKyAgICAgICAgZXJyID0gZG5zX3NlbmQocEVudHJ5LT5udW1kbnMsIHBFbnRyeS0+bmFtZSwgaSk7CisgICAgICAgIGlmIChlcnIgIT0gRVJSX09LKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAoImRuc19zZW5kIHJldHVybmVkIGVycm9yOiAlc1xuIiwgbHdpcF9zdHJlcnIoZXJyKSkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEROU19TVEFURV9ET05FOiB7CisgICAgICAvKiBpZiB0aGUgdGltZSB0byBsaXZlIGlzIG51bCAqLworICAgICAgaWYgKC0tcEVudHJ5LT50dGwgPT0gMCkgeworICAgICAgICBMV0lQX0RFQlVHRihETlNfREVCVUcsICgiZG5zX2NoZWNrX2VudHJ5OiBcIiVzXCI6IGZsdXNoXG4iLCBwRW50cnktPm5hbWUpKTsKKyAgICAgICAgLyogZmx1c2ggdGhpcyBlbnRyeSAqLworICAgICAgICBwRW50cnktPnN0YXRlID0gRE5TX1NUQVRFX1VOVVNFRDsKKyAgICAgICAgcEVudHJ5LT5mb3VuZCA9IE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBETlNfU1RBVEVfVU5VU0VEOgorICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIExXSVBfQVNTRVJUKCJ1bmtub3duIGRuc190YWJsZSBlbnRyeSBzdGF0ZToiLCAwKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qKgorICogQ2FsbCBkbnNfY2hlY2tfZW50cnkgZm9yIGVhY2ggZW50cnkgaW4gZG5zX3RhYmxlIC0gY2hlY2sgYWxsIGVudHJpZXMuCisgKi8KK3N0YXRpYyB2b2lkCitkbnNfY2hlY2tfZW50cmllcyh2b2lkKQoreworICB1OF90IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IEROU19UQUJMRV9TSVpFOyArK2kpIHsKKyAgICBkbnNfY2hlY2tfZW50cnkoaSk7CisgIH0KK30KKworLyoqCisgKiBSZWNlaXZlIGlucHV0IGZ1bmN0aW9uIGZvciBETlMgcmVzcG9uc2UgcGFja2V0cyBhcnJpdmluZyBmb3IgdGhlIGRucyBVRFAgcGNiLgorICoKKyAqIEBwYXJhbXMgc2VlIHVkcC5oCisgKi8KK3N0YXRpYyB2b2lkCitkbnNfcmVjdih2b2lkICphcmcsIHN0cnVjdCB1ZHBfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKmFkZHIsIHUxNl90IHBvcnQpCit7CisgIHUxNl90IGk7CisgIGNoYXIgKnBIb3N0bmFtZTsKKyAgc3RydWN0IGRuc19oZHIgKmhkcjsKKyAgc3RydWN0IGRuc19hbnN3ZXIgYW5zOworICBzdHJ1Y3QgZG5zX3RhYmxlX2VudHJ5ICpwRW50cnk7CisgIHUxNl90IG5xdWVzdGlvbnMsIG5hbnN3ZXJzOworCisgIExXSVBfVU5VU0VEX0FSRyhhcmcpOworICBMV0lQX1VOVVNFRF9BUkcocGNiKTsKKyAgTFdJUF9VTlVTRURfQVJHKGFkZHIpOworICBMV0lQX1VOVVNFRF9BUkcocG9ydCk7CisKKyAgLyogaXMgdGhlIGRucyBtZXNzYWdlIHRvbyBiaWcgPyAqLworICBpZiAocC0+dG90X2xlbiA+IEROU19NU0dfU0laRSkgeworICAgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJkbnNfcmVjdjogcGJ1ZiB0b28gYmlnXG4iKSk7CisgICAgLyogZnJlZSBwYnVmIGFuZCByZXR1cm4gKi8KKyAgICBnb3RvIG1lbWVycjsKKyAgfQorCisgIC8qIGlzIHRoZSBkbnMgbWVzc2FnZSBiaWcgZW5vdWdoID8gKi8KKyAgaWYgKHAtPnRvdF9sZW4gPCAoU0laRU9GX0ROU19IRFIgKyBTSVpFT0ZfRE5TX1FVRVJZICsgU0laRU9GX0ROU19BTlNXRVIpKSB7CisgICAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImRuc19yZWN2OiBwYnVmIHRvbyBzbWFsbFxuIikpOworICAgIC8qIGZyZWUgcGJ1ZiBhbmQgcmV0dXJuICovCisgICAgZ290byBtZW1lcnI7CisgIH0KKworICAvKiBjb3B5IGRucyBwYXlsb2FkIGluc2lkZSBzdGF0aWMgYnVmZmVyIGZvciBwcm9jZXNzaW5nICovIAorICBpZiAocGJ1Zl9jb3B5X3BhcnRpYWwocCwgZG5zX3BheWxvYWQsIHAtPnRvdF9sZW4sIDApID09IHAtPnRvdF9sZW4pIHsKKyAgICAvKiBUaGUgSUQgaW4gdGhlIEROUyBoZWFkZXIgc2hvdWxkIGJlIG91ciBlbnRyeSBpbnRvIHRoZSBuYW1lIHRhYmxlLiAqLworICAgIGhkciA9IChzdHJ1Y3QgZG5zX2hkciopZG5zX3BheWxvYWQ7CisgICAgaSA9IGh0b25zKGhkci0+aWQpOworICAgIGlmIChpIDwgRE5TX1RBQkxFX1NJWkUpIHsKKyAgICAgIHBFbnRyeSA9ICZkbnNfdGFibGVbaV07CisgICAgICBpZihwRW50cnktPnN0YXRlID09IEROU19TVEFURV9BU0tJTkcpIHsKKyAgICAgICAgLyogVGhpcyBlbnRyeSBpcyBub3cgY29tcGxldGVkLiAqLworICAgICAgICBwRW50cnktPnN0YXRlID0gRE5TX1NUQVRFX0RPTkU7CisgICAgICAgIHBFbnRyeS0+ZXJyICAgPSBoZHItPmZsYWdzMiAmIEROU19GTEFHMl9FUlJfTUFTSzsKKworICAgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHF1ZXN0aW9uKHMpIGFuZCB0aGUgYW5zd2Vycy4gVGhlIGF1dGhycgorICAgICAgICAgICBhbmQgdGhlIGV4dHJhcnIgYXJlIHNpbXBseSBkaXNjYXJkZWQuICovCisgICAgICAgIG5xdWVzdGlvbnMgPSBodG9ucyhoZHItPm51bXF1ZXN0aW9ucyk7CisgICAgICAgIG5hbnN3ZXJzICAgPSBodG9ucyhoZHItPm51bWFuc3dlcnMpOworCisgICAgICAgIC8qIENoZWNrIGZvciBlcnJvci4gSWYgc28sIGNhbGwgY2FsbGJhY2sgdG8gaW5mb3JtLiAqLworICAgICAgICBpZiAoKChoZHItPmZsYWdzMSAmIEROU19GTEFHMV9SRVNQT05TRSkgPT0gMCkgfHwgKHBFbnRyeS0+ZXJyICE9IDApIHx8IChucXVlc3Rpb25zICE9IDEpKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImRuc19yZWN2OiBcIiVzXCI6IGVycm9yIGluIGZsYWdzXG4iLCBwRW50cnktPm5hbWUpKTsKKyAgICAgICAgICAvKiBjYWxsIGNhbGxiYWNrIHRvIGluZGljYXRlIGVycm9yLCBjbGVhbiB1cCBtZW1vcnkgYW5kIHJldHVybiAqLworICAgICAgICAgIGdvdG8gcmVzcG9uc2VlcnI7CisgICAgICAgIH0KKworI2lmIEROU19ET0VTX05BTUVfQ0hFQ0sKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG5hbWUgaW4gdGhlICJxdWVzdGlvbiIgcGFydCBtYXRjaCB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeS4gKi8KKyAgICAgICAgaWYgKGRuc19jb21wYXJlX25hbWUoKHVuc2lnbmVkIGNoYXIgKikocEVudHJ5LT5uYW1lKSwgKHVuc2lnbmVkIGNoYXIgKilkbnNfcGF5bG9hZCArIFNJWkVPRl9ETlNfSERSKSAhPSAwKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoRE5TX0RFQlVHLCAoImRuc19yZWN2OiBcIiVzXCI6IHJlc3BvbnNlIG5vdCBtYXRjaCB0byBxdWVyeVxuIiwgcEVudHJ5LT5uYW1lKSk7CisgICAgICAgICAgLyogY2FsbCBjYWxsYmFjayB0byBpbmRpY2F0ZSBlcnJvciwgY2xlYW4gdXAgbWVtb3J5IGFuZCByZXR1cm4gKi8KKyAgICAgICAgICBnb3RvIHJlc3BvbnNlZXJyOworICAgICAgICB9CisjZW5kaWYgLyogRE5TX0RPRVNfTkFNRV9DSEVDSyAqLworCisgICAgICAgIC8qIFNraXAgdGhlIG5hbWUgaW4gdGhlICJxdWVzdGlvbiIgcGFydCAqLworICAgICAgICBwSG9zdG5hbWUgPSAoY2hhciAqKSBkbnNfcGFyc2VfbmFtZSgodW5zaWduZWQgY2hhciAqKWRuc19wYXlsb2FkICsgU0laRU9GX0ROU19IRFIpICsgU0laRU9GX0ROU19RVUVSWTsKKworICAgICAgICB3aGlsZSAobmFuc3dlcnMgPiAwKSB7CisgICAgICAgICAgLyogc2tpcCBhbnN3ZXIgcmVzb3VyY2UgcmVjb3JkJ3MgaG9zdCBuYW1lICovCisgICAgICAgICAgcEhvc3RuYW1lID0gKGNoYXIgKikgZG5zX3BhcnNlX25hbWUoKHVuc2lnbmVkIGNoYXIgKilwSG9zdG5hbWUpOworCisgICAgICAgICAgLyogQ2hlY2sgZm9yIElQIGFkZHJlc3MgdHlwZSBhbmQgSW50ZXJuZXQgY2xhc3MuIE90aGVycyBhcmUgZGlzY2FyZGVkLiAqLworICAgICAgICAgIFNNRU1DUFkoJmFucywgcEhvc3RuYW1lLCBTSVpFT0ZfRE5TX0FOU1dFUik7CisgICAgICAgICAgaWYoKGFucy50eXBlID09IFBQX0hUT05TKEROU19SUlRZUEVfQSkpICYmIChhbnMuY2xzID09IFBQX0hUT05TKEROU19SUkNMQVNTX0lOKSkgJiYKKyAgICAgICAgICAgICAoYW5zLmxlbiA9PSBQUF9IVE9OUyhzaXplb2YoaXBfYWRkcl90KSkpICkgeworICAgICAgICAgICAgLyogcmVhZCB0aGUgYW5zd2VyIHJlc291cmNlIHJlY29yZCdzIFRUTCwgYW5kIG1heGltaXplIGl0IGlmIG5lZWRlZCAqLworICAgICAgICAgICAgcEVudHJ5LT50dGwgPSBudG9obChhbnMudHRsKTsKKyAgICAgICAgICAgIGlmIChwRW50cnktPnR0bCA+IEROU19NQVhfVFRMKSB7CisgICAgICAgICAgICAgIHBFbnRyeS0+dHRsID0gRE5TX01BWF9UVEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiByZWFkIHRoZSBJUCBhZGRyZXNzIGFmdGVyIGFuc3dlciByZXNvdXJjZSByZWNvcmQncyBoZWFkZXIgKi8KKyAgICAgICAgICAgIFNNRU1DUFkoJihwRW50cnktPmlwYWRkciksIChwSG9zdG5hbWUrU0laRU9GX0ROU19BTlNXRVIpLCBzaXplb2YoaXBfYWRkcl90KSk7CisgICAgICAgICAgICBMV0lQX0RFQlVHRihETlNfREVCVUcsICgiZG5zX3JlY3Y6IFwiJXNcIjogcmVzcG9uc2UgPSAiLCBwRW50cnktPm5hbWUpKTsKKyAgICAgICAgICAgIGlwX2FkZHJfZGVidWdfcHJpbnQoRE5TX0RFQlVHLCAoJihwRW50cnktPmlwYWRkcikpKTsKKyAgICAgICAgICAgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJcbiIpKTsKKyAgICAgICAgICAgIC8qIGNhbGwgc3BlY2lmaWVkIGNhbGxiYWNrIGZ1bmN0aW9uIGlmIHByb3ZpZGVkICovCisgICAgICAgICAgICBpZiAocEVudHJ5LT5mb3VuZCkgeworICAgICAgICAgICAgICAoKnBFbnRyeS0+Zm91bmQpKHBFbnRyeS0+bmFtZSwgJnBFbnRyeS0+aXBhZGRyLCBwRW50cnktPmFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZWFsbG9jYXRlIG1lbW9yeSBhbmQgcmV0dXJuICovCisgICAgICAgICAgICBnb3RvIG1lbWVycjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcEhvc3RuYW1lID0gcEhvc3RuYW1lICsgU0laRU9GX0ROU19BTlNXRVIgKyBodG9ucyhhbnMubGVuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLS1uYW5zd2VyczsKKyAgICAgICAgfQorICAgICAgICBMV0lQX0RFQlVHRihETlNfREVCVUcsICgiZG5zX3JlY3Y6IFwiJXNcIjogZXJyb3IgaW4gcmVzcG9uc2VcbiIsIHBFbnRyeS0+bmFtZSkpOworICAgICAgICAvKiBjYWxsIGNhbGxiYWNrIHRvIGluZGljYXRlIGVycm9yLCBjbGVhbiB1cCBtZW1vcnkgYW5kIHJldHVybiAqLworICAgICAgICBnb3RvIHJlc3BvbnNlZXJyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGRlYWxsb2NhdGUgbWVtb3J5IGFuZCByZXR1cm4gKi8KKyAgZ290byBtZW1lcnI7CisKK3Jlc3BvbnNlZXJyOgorICAvKiBFUlJPUjogY2FsbCBzcGVjaWZpZWQgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBOVUxMIGFzIG5hbWUgdG8gaW5kaWNhdGUgYW4gZXJyb3IgKi8KKyAgaWYgKHBFbnRyeS0+Zm91bmQpIHsKKyAgICAoKnBFbnRyeS0+Zm91bmQpKHBFbnRyeS0+bmFtZSwgTlVMTCwgcEVudHJ5LT5hcmcpOworICB9CisgIC8qIGZsdXNoIHRoaXMgZW50cnkgKi8KKyAgcEVudHJ5LT5zdGF0ZSA9IEROU19TVEFURV9VTlVTRUQ7CisgIHBFbnRyeS0+Zm91bmQgPSBOVUxMOworCittZW1lcnI6CisgIC8qIGZyZWUgcGJ1ZiAqLworICBwYnVmX2ZyZWUocCk7CisgIHJldHVybjsKK30KKworLyoqCisgKiBRdWV1ZXMgYSBuZXcgaG9zdG5hbWUgdG8gcmVzb2x2ZSBhbmQgc2VuZHMgb3V0IGEgRE5TIHF1ZXJ5IGZvciB0aGF0IGhvc3RuYW1lCisgKgorICogQHBhcmFtIG5hbWUgdGhlIGhvc3RuYW1lIHRoYXQgaXMgdG8gYmUgcXVlcmllZAorICogQHBhcmFtIGZvdW5kIGEgY2FsbGJhY2sgZm91bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBzdWNjZXNzLCBmYWlsdXJlIG9yIHRpbWVvdXQKKyAqIEBwYXJhbSBjYWxsYmFja19hcmcgYXJndW1lbnQgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEByZXR1cm4gQHJldHVybiBhIGVycl90IHJldHVybiBjb2RlLgorICovCitzdGF0aWMgZXJyX3QKK2Ruc19lbnF1ZXVlKGNvbnN0IGNoYXIgKm5hbWUsIGRuc19mb3VuZF9jYWxsYmFjayBmb3VuZCwgdm9pZCAqY2FsbGJhY2tfYXJnKQoreworICB1OF90IGk7CisgIHU4X3QgbHNlcSwgbHNlcWk7CisgIHN0cnVjdCBkbnNfdGFibGVfZW50cnkgKnBFbnRyeSA9IE5VTEw7CisgIHNpemVfdCBuYW1lbGVuOworCisgIC8qIHNlYXJjaCBhbiB1bnVzZWQgZW50cnksIG9yIHRoZSBvbGRlc3Qgb25lICovCisgIGxzZXEgPSBsc2VxaSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBETlNfVEFCTEVfU0laRTsgKytpKSB7CisgICAgcEVudHJ5ID0gJmRuc190YWJsZVtpXTsKKyAgICAvKiBpcyBpdCBhbiB1bnVzZWQgZW50cnkgPyAqLworICAgIGlmIChwRW50cnktPnN0YXRlID09IEROU19TVEFURV9VTlVTRUQpCisgICAgICBicmVhazsKKworICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIG9sZGVzdCBjb21wbGV0ZWQgZW50cnkgKi8KKyAgICBpZiAocEVudHJ5LT5zdGF0ZSA9PSBETlNfU1RBVEVfRE9ORSkgeworICAgICAgaWYgKChkbnNfc2Vxbm8gLSBwRW50cnktPnNlcW5vKSA+IGxzZXEpIHsKKyAgICAgICAgbHNlcSA9IGRuc19zZXFubyAtIHBFbnRyeS0+c2Vxbm87CisgICAgICAgIGxzZXFpID0gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBpZiB3ZSBkb24ndCBoYXZlIGZvdW5kIGFuIHVudXNlZCBlbnRyeSwgdXNlIHRoZSBvbGRlc3QgY29tcGxldGVkIG9uZSAqLworICBpZiAoaSA9PSBETlNfVEFCTEVfU0laRSkgeworICAgIGlmICgobHNlcWkgPj0gRE5TX1RBQkxFX1NJWkUpIHx8IChkbnNfdGFibGVbbHNlcWldLnN0YXRlICE9IEROU19TVEFURV9ET05FKSkgeworICAgICAgLyogbm8gZW50cnkgY2FuJ3QgYmUgdXNlZCBub3csIHRhYmxlIGlzIGZ1bGwgKi8KKyAgICAgIExXSVBfREVCVUdGKEROU19ERUJVRywgKCJkbnNfZW5xdWV1ZTogXCIlc1wiOiBETlMgZW50cmllcyB0YWJsZSBpcyBmdWxsXG4iLCBuYW1lKSk7CisgICAgICByZXR1cm4gRVJSX01FTTsKKyAgICB9IGVsc2UgeworICAgICAgLyogdXNlIHRoZSBvbGRlc3QgY29tcGxldGVkIG9uZSAqLworICAgICAgaSA9IGxzZXFpOworICAgICAgcEVudHJ5ID0gJmRuc190YWJsZVtpXTsKKyAgICB9CisgIH0KKworICAvKiB1c2UgdGhpcyBlbnRyeSAqLworICBMV0lQX0RFQlVHRihETlNfREVCVUcsICgiZG5zX2VucXVldWU6IFwiJXNcIjogdXNlIEROUyBlbnRyeSAlIlUxNl9GIlxuIiwgbmFtZSwgKHUxNl90KShpKSkpOworCisgIC8qIGZpbGwgdGhlIGVudHJ5ICovCisgIHBFbnRyeS0+c3RhdGUgPSBETlNfU1RBVEVfTkVXOworICBwRW50cnktPnNlcW5vID0gZG5zX3NlcW5vKys7CisgIHBFbnRyeS0+Zm91bmQgPSBmb3VuZDsKKyAgcEVudHJ5LT5hcmcgICA9IGNhbGxiYWNrX2FyZzsKKyAgbmFtZWxlbiA9IExXSVBfTUlOKHN0cmxlbihuYW1lKSwgRE5TX01BWF9OQU1FX0xFTkdUSC0xKTsKKyAgTUVNQ1BZKHBFbnRyeS0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CisgIHBFbnRyeS0+bmFtZVtuYW1lbGVuXSA9IDA7CisKKyAgLyogZm9yY2UgdG8gc2VuZCBxdWVyeSB3aXRob3V0IHdhaXRpbmcgdGltZXIgKi8KKyAgZG5zX2NoZWNrX2VudHJ5KGkpOworCisgIC8qIGRucyBxdWVyeSBpcyBlbnF1ZXVlZCAqLworICByZXR1cm4gRVJSX0lOUFJPR1JFU1M7Cit9CisKKy8qKgorICogUmVzb2x2ZSBhIGhvc3RuYW1lIChzdHJpbmcpIGludG8gYW4gSVAgYWRkcmVzcy4KKyAqIE5PTi1CTE9DS0lORyBjYWxsYmFjayB2ZXJzaW9uIGZvciB1c2Ugd2l0aCByYXcgQVBJISEhCisgKgorICogUmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIG9uZSBvZiBlcnJfdCByZXR1cm4gY29kZXM6CisgKiAtIEVSUl9PSyBpZiBob3N0bmFtZSBpcyBhIHZhbGlkIElQIGFkZHJlc3Mgc3RyaW5nIG9yIHRoZSBob3N0CisgKiAgIG5hbWUgaXMgYWxyZWFkeSBpbiB0aGUgbG9jYWwgbmFtZXMgdGFibGUuCisgKiAtIEVSUl9JTlBST0dSRVNTIGVucXVldWUgYSByZXF1ZXN0IHRvIGJlIHNlbnQgdG8gdGhlIEROUyBzZXJ2ZXIKKyAqICAgZm9yIHJlc29sdXRpb24gaWYgbm8gZXJyb3JzIGFyZSBwcmVzZW50LgorICogLSBFUlJfQVJHOiBkbnMgY2xpZW50IG5vdCBpbml0aWFsaXplZCBvciBpbnZhbGlkIGhvc3RuYW1lCisgKgorICogQHBhcmFtIGhvc3RuYW1lIHRoZSBob3N0bmFtZSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQKKyAqIEBwYXJhbSBhZGRyIHBvaW50ZXIgdG8gYSBpcF9hZGRyX3Qgd2hlcmUgdG8gc3RvcmUgdGhlIGFkZHJlc3MgaWYgaXQgaXMgYWxyZWFkeQorICogICAgICAgICAgICAgY2FjaGVkIGluIHRoZSBkbnNfdGFibGUgKG9ubHkgdmFsaWQgaWYgRVJSX09LIGlzIHJldHVybmVkISkKKyAqIEBwYXJhbSBmb3VuZCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBzdWNjZXNzLCBmYWlsdXJlIG9yIHRpbWVvdXQgKG9ubHkgaWYKKyAqICAgICAgICAgICAgICBFUlJfSU5QUk9HUkVTUyBpcyByZXR1cm5lZCEpCisgKiBAcGFyYW0gY2FsbGJhY2tfYXJnIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcmV0dXJuIGEgZXJyX3QgcmV0dXJuIGNvZGUuCisgKi8KK2Vycl90CitkbnNfZ2V0aG9zdGJ5bmFtZShjb25zdCBjaGFyICpob3N0bmFtZSwgaXBfYWRkcl90ICphZGRyLCBkbnNfZm91bmRfY2FsbGJhY2sgZm91bmQsCisgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja19hcmcpCit7CisgIHUzMl90IGlwYWRkcjsKKyAgLyogbm90IGluaXRpYWxpemVkIG9yIG5vIHZhbGlkIHNlcnZlciB5ZXQsIG9yIGludmFsaWQgYWRkciBwb2ludGVyCisgICAqIG9yIGludmFsaWQgaG9zdG5hbWUgb3IgaW52YWxpZCBob3N0bmFtZSBsZW5ndGggKi8KKyAgaWYgKChkbnNfcGNiID09IE5VTEwpIHx8IChhZGRyID09IE5VTEwpIHx8CisgICAgICAoIWhvc3RuYW1lKSB8fCAoIWhvc3RuYW1lWzBdKSB8fAorICAgICAgKHN0cmxlbihob3N0bmFtZSkgPj0gRE5TX01BWF9OQU1FX0xFTkdUSCkpIHsKKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorCisjaWYgTFdJUF9IQVZFX0xPT1BJRgorICBpZiAoc3RyY21wKGhvc3RuYW1lLCAibG9jYWxob3N0Iik9PTApIHsKKyAgICBpcF9hZGRyX3NldF9sb29wYmFjayhhZGRyKTsKKyAgICByZXR1cm4gRVJSX09LOworICB9CisjZW5kaWYgLyogTFdJUF9IQVZFX0xPT1BJRiAqLworCisgIC8qIGhvc3QgbmFtZSBhbHJlYWR5IGluIG9jdGV0IG5vdGF0aW9uPyBzZXQgaXAgYWRkciBhbmQgcmV0dXJuIEVSUl9PSyAqLworICBpcGFkZHIgPSBpcGFkZHJfYWRkcihob3N0bmFtZSk7CisgIGlmIChpcGFkZHIgPT0gSVBBRERSX05PTkUpIHsKKyAgICAvKiBhbHJlYWR5IGhhdmUgdGhpcyBhZGRyZXNzIGNhY2hlZD8gKi8KKyAgICBpcGFkZHIgPSBkbnNfbG9va3VwKGhvc3RuYW1lKTsKKyAgfQorICBpZiAoaXBhZGRyICE9IElQQUREUl9OT05FKSB7CisgICAgaXA0X2FkZHJfc2V0X3UzMihhZGRyLCBpcGFkZHIpOworICAgIHJldHVybiBFUlJfT0s7CisgIH0KKworICAvKiBxdWV1ZSBxdWVyeSB3aXRoIHNwZWNpZmllZCBjYWxsYmFjayAqLworICByZXR1cm4gZG5zX2VucXVldWUoaG9zdG5hbWUsIGZvdW5kLCBjYWxsYmFja19hcmcpOworfQorCisjZW5kaWYgLyogTFdJUF9ETlMgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS9pbml0LmMgYi9jb3JlL2x3aXAvc3JjL2NvcmUvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MDM4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvaW5pdC5jCkBAIC0wLDAgKzEsMzA2IEBACisvKioKKyAqIEBmaWxlCisgKiBNb2R1bGVzIGluaXRpYWxpemF0aW9uCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaW5jbHVkZSAibHdpcC9pbml0LmgiCisjaW5jbHVkZSAibHdpcC9zdGF0cy5oIgorI2luY2x1ZGUgImx3aXAvc3lzLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL21lbXAuaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpbmNsdWRlICJsd2lwL25ldGlmLmgiCisjaW5jbHVkZSAibHdpcC9zb2NrZXRzLmgiCisjaW5jbHVkZSAibHdpcC9pcC5oIgorI2luY2x1ZGUgImx3aXAvcmF3LmgiCisjaW5jbHVkZSAibHdpcC91ZHAuaCIKKyNpbmNsdWRlICJsd2lwL3RjcF9pbXBsLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wX21zZy5oIgorI2luY2x1ZGUgImx3aXAvYXV0b2lwLmgiCisjaW5jbHVkZSAibHdpcC9pZ21wLmgiCisjaW5jbHVkZSAibHdpcC9kbnMuaCIKKyNpbmNsdWRlICJsd2lwL3RpbWVycy5oIgorI2luY2x1ZGUgIm5ldGlmL2V0aGFycC5oIgorCisvKiBDb21waWxlLXRpbWUgc2FuaXR5IGNoZWNrcyBmb3IgY29uZmlndXJhdGlvbiBlcnJvcnMuCisgKiBUaGVzZSBjYW4gYmUgZG9uZSBpbmRlcGVuZGVudGx5IG9mIExXSVBfREVCVUcsIHdpdGhvdXQgcGVuYWx0eS4KKyAqLworI2lmbmRlZiBCWVRFX09SREVSCisgICNlcnJvciAiQllURV9PUkRFUiBpcyBub3QgZGVmaW5lZCwgeW91IGhhdmUgdG8gZGVmaW5lIGl0IGluIHlvdXIgY2MuaCIKKyNlbmRpZgorI2lmICghSVBfU09GX0JST0FEQ0FTVCAmJiBJUF9TT0ZfQlJPQURDQVNUX1JFQ1YpCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIGJyb2FkY2FzdCBmaWx0ZXIgcGVyIHBjYiBvbiByZWN2IG9wZXJhdGlvbnMsIHlvdSBoYXZlIHRvIGRlZmluZSBJUF9TT0ZfQlJPQURDQVNUPTEgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKCFMV0lQX0FSUCAmJiBBUlBfUVVFVUVJTkcpCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIEFSUCBRdWV1ZWluZywgeW91IGhhdmUgdG8gZGVmaW5lIExXSVBfQVJQPTEgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKCFMV0lQX1VEUCAmJiBMV0lQX1VEUExJVEUpCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIFVEUCBMaXRlLCB5b3UgaGF2ZSB0byBkZWZpbmUgTFdJUF9VRFA9MSBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoIUxXSVBfVURQICYmIExXSVBfU05NUCkKKyAgI2Vycm9yICJJZiB5b3Ugd2FudCB0byB1c2UgU05NUCwgeW91IGhhdmUgdG8gZGVmaW5lIExXSVBfVURQPTEgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKCFMV0lQX1VEUCAmJiBMV0lQX0RIQ1ApCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIERIQ1AsIHlvdSBoYXZlIHRvIGRlZmluZSBMV0lQX1VEUD0xIGluIHlvdXIgbHdpcG9wdHMuaCIKKyNlbmRpZgorI2lmICghTFdJUF9VRFAgJiYgTFdJUF9JR01QKQorICAjZXJyb3IgIklmIHlvdSB3YW50IHRvIHVzZSBJR01QLCB5b3UgaGF2ZSB0byBkZWZpbmUgTFdJUF9VRFA9MSBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoIUxXSVBfVURQICYmIExXSVBfU05NUCkKKyAgI2Vycm9yICJJZiB5b3Ugd2FudCB0byB1c2UgU05NUCwgeW91IGhhdmUgdG8gZGVmaW5lIExXSVBfVURQPTEgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKCFMV0lQX1VEUCAmJiBMV0lQX0ROUykKKyAgI2Vycm9yICJJZiB5b3Ugd2FudCB0byB1c2UgRE5TLCB5b3UgaGF2ZSB0byBkZWZpbmUgTFdJUF9VRFA9MSBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoTFdJUF9BUlAgJiYgQVJQX1FVRVVFSU5HICYmIChNRU1QX05VTV9BUlBfUVVFVUU8PTApKQorICAjZXJyb3IgIklmIHlvdSB3YW50IHRvIHVzZSBBUlAgUXVldWVpbmcsIHlvdSBoYXZlIHRvIGRlZmluZSBNRU1QX05VTV9BUlBfUVVFVUU+PTEgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKExXSVBfUkFXICYmIChNRU1QX05VTV9SQVdfUENCPD0wKSkKKyAgI2Vycm9yICJJZiB5b3Ugd2FudCB0byB1c2UgUkFXLCB5b3UgaGF2ZSB0byBkZWZpbmUgTUVNUF9OVU1fUkFXX1BDQj49MSBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoTFdJUF9VRFAgJiYgKE1FTVBfTlVNX1VEUF9QQ0I8PTApKQorICAjZXJyb3IgIklmIHlvdSB3YW50IHRvIHVzZSBVRFAsIHlvdSBoYXZlIHRvIGRlZmluZSBNRU1QX05VTV9VRFBfUENCPj0xIGluIHlvdXIgbHdpcG9wdHMuaCIKKyNlbmRpZgorI2lmIChMV0lQX1RDUCAmJiAoTUVNUF9OVU1fVENQX1BDQjw9MCkpCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIFRDUCwgeW91IGhhdmUgdG8gZGVmaW5lIE1FTVBfTlVNX1RDUF9QQ0I+PTEgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKExXSVBfVENQICYmIChUQ1BfV05EID4gMHhmZmZmKSkKKyAgI2Vycm9yICJJZiB5b3Ugd2FudCB0byB1c2UgVENQLCBUQ1BfV05EIG11c3QgZml0IGluIGFuIHUxNl90LCBzbywgeW91IGhhdmUgdG8gcmVkdWNlIGl0IGluIHlvdXIgbHdpcG9wdHMuaCIKKyNlbmRpZgorI2lmIChMV0lQX1RDUCAmJiAoVENQX1NORF9RVUVVRUxFTiA+IDB4ZmZmZikpCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIFRDUCwgVENQX1NORF9RVUVVRUxFTiBtdXN0IGZpdCBpbiBhbiB1MTZfdCwgc28sIHlvdSBoYXZlIHRvIHJlZHVjZSBpdCBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoTFdJUF9UQ1AgJiYgKFRDUF9TTkRfUVVFVUVMRU4gPCAyKSkKKyAgI2Vycm9yICJUQ1BfU05EX1FVRVVFTEVOIG11c3QgYmUgYXQgbGVhc3QgMiBmb3Igbm8tY29weSBUQ1Agd3JpdGVzIHRvIHdvcmsiCisjZW5kaWYKKyNpZiAoTFdJUF9UQ1AgJiYgKChUQ1BfTUFYUlRYID4gMTIpIHx8IChUQ1BfU1lOTUFYUlRYID4gMTIpKSkKKyAgI2Vycm9yICJJZiB5b3Ugd2FudCB0byB1c2UgVENQLCBUQ1BfTUFYUlRYIGFuZCBUQ1BfU1lOTUFYUlRYIG11c3QgbGVzcyBvciBlcXVhbCB0byAxMiAoZHVlIHRvIHRjcF9iYWNrb2ZmIHRhYmxlKSwgc28sIHlvdSBoYXZlIHRvIHJlZHVjZSB0aGVtIGluIHlvdXIgbHdpcG9wdHMuaCIKKyNlbmRpZgorI2lmIChMV0lQX1RDUCAmJiBUQ1BfTElTVEVOX0JBQ0tMT0cgJiYgKFRDUF9ERUZBVUxUX0xJU1RFTl9CQUNLTE9HIDwgMCkgfHwgKFRDUF9ERUZBVUxUX0xJU1RFTl9CQUNLTE9HID4gMHhmZikpCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIFRDUCBiYWNrbG9nLCBUQ1BfREVGQVVMVF9MSVNURU5fQkFDS0xPRyBtdXN0IGZpdCBpbnRvIGFuIHU4X3QiCisjZW5kaWYKKyNpZiAoTFdJUF9JR01QICYmIChNRU1QX05VTV9JR01QX0dST1VQPD0xKSkKKyAgI2Vycm9yICJJZiB5b3Ugd2FudCB0byB1c2UgSUdNUCwgeW91IGhhdmUgdG8gZGVmaW5lIE1FTVBfTlVNX0lHTVBfR1JPVVA+MSBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoTFdJUF9ORVRJRl9BUEkgJiYgKE5PX1NZUz09MSkpCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIE5FVElGIEFQSSwgeW91IGhhdmUgdG8gZGVmaW5lIE5PX1NZUz0wIGluIHlvdXIgbHdpcG9wdHMuaCIKKyNlbmRpZgorI2lmICgoTFdJUF9TT0NLRVQgfHwgTFdJUF9ORVRDT05OKSAmJiAoTk9fU1lTPT0xKSkKKyAgI2Vycm9yICJJZiB5b3Ugd2FudCB0byB1c2UgU2VxdWVudGlhbCBBUEksIHlvdSBoYXZlIHRvIGRlZmluZSBOT19TWVM9MCBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoKExXSVBfTkVUQ09OTiB8fCBMV0lQX1NPQ0tFVCkgJiYgKE1FTVBfTlVNX1RDUElQX01TR19BUEk8PTApKQorICAjZXJyb3IgIklmIHlvdSB3YW50IHRvIHVzZSBTZXF1ZW50aWFsIEFQSSwgeW91IGhhdmUgdG8gZGVmaW5lIE1FTVBfTlVNX1RDUElQX01TR19BUEk+PTEgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKCFMV0lQX05FVENPTk4gJiYgTFdJUF9TT0NLRVQpCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIFNvY2tldCBBUEksIHlvdSBoYXZlIHRvIGRlZmluZSBMV0lQX05FVENPTk49MSBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoKCghTFdJUF9ESENQKSB8fCAoIUxXSVBfQVVUT0lQKSkgJiYgTFdJUF9ESENQX0FVVE9JUF9DT09QKQorICAjZXJyb3IgIklmIHlvdSB3YW50IHRvIHVzZSBESENQL0FVVE9JUCBjb29wZXJhdGlvbiBtb2RlLCB5b3UgaGF2ZSB0byBkZWZpbmUgTFdJUF9ESENQPTEgYW5kIExXSVBfQVVUT0lQPTEgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKCgoIUxXSVBfREhDUCkgfHwgKCFMV0lQX0FSUCkpICYmIERIQ1BfRE9FU19BUlBfQ0hFQ0spCisgICNlcnJvciAiSWYgeW91IHdhbnQgdG8gdXNlIERIQ1AgQVJQIGNoZWNraW5nLCB5b3UgaGF2ZSB0byBkZWZpbmUgTFdJUF9ESENQPTEgYW5kIExXSVBfQVJQPTEgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKCFMV0lQX0FSUCAmJiBMV0lQX0FVVE9JUCkKKyAgI2Vycm9yICJJZiB5b3Ugd2FudCB0byB1c2UgQVVUT0lQLCB5b3UgaGF2ZSB0byBkZWZpbmUgTFdJUF9BUlA9MSBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoTFdJUF9TTk1QICYmIChTTk1QX0NPTkNVUlJFTlRfUkVRVUVTVFM8PTApKQorICAjZXJyb3IgIklmIHlvdSB3YW50IHRvIHVzZSBTTk1QLCB5b3UgaGF2ZSB0byBkZWZpbmUgU05NUF9DT05DVVJSRU5UX1JFUVVFU1RTPj0xIGluIHlvdXIgbHdpcG9wdHMuaCIKKyNlbmRpZgorI2lmIChMV0lQX1NOTVAgJiYgKFNOTVBfVFJBUF9ERVNUSU5BVElPTlM8PTApKQorICAjZXJyb3IgIklmIHlvdSB3YW50IHRvIHVzZSBTTk1QLCB5b3UgaGF2ZSB0byBkZWZpbmUgU05NUF9UUkFQX0RFU1RJTkFUSU9OUz49MSBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKyNpZiAoTFdJUF9UQ1AgJiYgKChMV0lQX0VWRU5UX0FQSSAmJiBMV0lQX0NBTExCQUNLX0FQSSkgfHwgKCFMV0lQX0VWRU5UX0FQSSAmJiAhTFdJUF9DQUxMQkFDS19BUEkpKSkKKyAgI2Vycm9yICJPbmUgYW5kIGV4YWN0bHkgb25lIG9mIExXSVBfRVZFTlRfQVBJIGFuZCBMV0lQX0NBTExCQUNLX0FQSSBoYXMgdG8gYmUgZW5hYmxlZCBpbiB5b3VyIGx3aXBvcHRzLmgiCisjZW5kaWYKKy8qIFRoZXJlIG11c3QgYmUgc3VmZmljaWVudCB0aW1lb3V0cywgdGFraW5nIGludG8gYWNjb3VudCByZXF1aXJlbWVudHMgb2YgdGhlIHN1YnN5c3RlbXMuICovCisjaWYgTFdJUF9USU1FUlMgJiYgKE1FTVBfTlVNX1NZU19USU1FT1VUIDwgKExXSVBfVENQICsgSVBfUkVBU1NFTUJMWSArIExXSVBfQVJQICsgKDIqTFdJUF9ESENQKSArIExXSVBfQVVUT0lQICsgTFdJUF9JR01QICsgTFdJUF9ETlMgKyBQUFBfU1VQUE9SVCkpCisgICNlcnJvciAiTUVNUF9OVU1fU1lTX1RJTUVPVVQgaXMgdG9vIGxvdyB0byBhY2NvbW9kYXRlIGFsbCByZXF1aXJlZCB0aW1lb3V0cyIKKyNlbmRpZgorI2lmIChJUF9SRUFTU0VNQkxZICYmIChNRU1QX05VTV9SRUFTU0RBVEEgPiBJUF9SRUFTU19NQVhfUEJVRlMpKQorICAjZXJyb3IgIk1FTVBfTlVNX1JFQVNTREFUQSA+IElQX1JFQVNTX01BWF9QQlVGUyBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2luY2UgZWFjaCBzdHJ1Y3QgaXBfcmVhc3NkYXRhIG11c3QgaG9sZCAyIHBidWZzIGF0IGxlYXN0ISIKKyNlbmRpZgorI2lmIChNRU1fTElCQ19NQUxMT0MgJiYgTUVNX1VTRV9QT09MUykKKyAgI2Vycm9yICJNRU1fTElCQ19NQUxMT0MgYW5kIE1FTV9VU0VfUE9PTFMgbWF5IG5vdCBib3RoIGJlIHNpbXVsdGFuZW91c2x5IGVuYWJsZWQgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisjaWYgKE1FTV9VU0VfUE9PTFMgJiYgIU1FTVBfVVNFX0NVU1RPTV9QT09MUykKKyAgI2Vycm9yICJNRU1fVVNFX1BPT0xTIHJlcXVpcmVzIGN1c3RvbSBwb29scyAoTUVNUF9VU0VfQ1VTVE9NX1BPT0xTKSB0byBiZSBlbmFibGVkIGluIHlvdXIgbHdpcG9wdHMuaCIKKyNlbmRpZgorI2lmIChQQlVGX1BPT0xfQlVGU0laRSA8PSBNRU1fQUxJR05NRU5UKQorICAjZXJyb3IgIlBCVUZfUE9PTF9CVUZTSVpFIG11c3QgYmUgZ3JlYXRlciB0aGFuIE1FTV9BTElHTk1FTlQgb3IgdGhlIG9mZnNldCBtYXkgdGFrZSB0aGUgZnVsbCBmaXJzdCBwYnVmIgorI2VuZGlmCisjaWYgKFRDUF9RVUVVRV9PT1NFUSAmJiAhTFdJUF9UQ1ApCisgICNlcnJvciAiVENQX1FVRVVFX09PU0VRIHJlcXVpcmVzIExXSVBfVENQIgorI2VuZGlmCisjaWYgKEROU19MT0NBTF9IT1NUTElTVCAmJiAhRE5TX0xPQ0FMX0hPU1RMSVNUX0lTX0RZTkFNSUMgJiYgIShkZWZpbmVkKEROU19MT0NBTF9IT1NUTElTVF9JTklUKSkpCisgICNlcnJvciAieW91IGhhdmUgdG8gZGVmaW5lIGRlZmluZSBETlNfTE9DQUxfSE9TVExJU1RfSU5JVCB7eydob3N0MScsIDB4MTIzfSwgeydob3N0MicsIDB4MjM0fX0gdG8gaW5pdGlhbGl6ZSBETlNfTE9DQUxfSE9TVExJU1QiCisjZW5kaWYKKyNpZiBQUFBfU1VQUE9SVCAmJiAhUFBQT1NfU1VQUE9SVCAmICFQUFBPRV9TVVBQT1JUCisgICNlcnJvciAiUFBQX1NVUFBPUlQgbmVlZHMgZWl0aGVyIFBQUE9TX1NVUFBPUlQgb3IgUFBQT0VfU1VQUE9SVCB0dXJuZWQgb24iCisjZW5kaWYKKyNpZiAhTFdJUF9FVEhFUk5FVCAmJiAoTFdJUF9BUlAgfHwgUFBQT0VfU1VQUE9SVCkKKyAgI2Vycm9yICJMV0lQX0VUSEVSTkVUIG5lZWRzIHRvIGJlIHR1cm5lZCBvbiBmb3IgTFdJUF9BUlAgb3IgUFBQT0VfU1VQUE9SVCIKKyNlbmRpZgorI2lmIExXSVBfSUdNUCAmJiAhZGVmaW5lZChMV0lQX1JBTkQpCisgICNlcnJvciAiV2hlbiB1c2luZyBJR01QLCBMV0lQX1JBTkQoKSBuZWVkcyB0byBiZSBkZWZpbmVkIHRvIGEgcmFuZG9tLWZ1bmN0aW9uIHJldHVybmluZyBhbiB1MzJfdCByYW5kb20gdmFsdWUiCisjZW5kaWYKKyNpZiBMV0lQX1RDUElQX0NPUkVfTE9DS0lOR19JTlBVVCAmJiAhTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcKKyAgI2Vycm9yICJXaGVuIHVzaW5nIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HX0lOUFVULCBMV0lQX1RDUElQX0NPUkVfTE9DS0lORyBtdXN0IGJlIGVuYWJsZWQsIHRvbyIKKyNlbmRpZgorI2lmIExXSVBfVENQICYmIExXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYgJiYgIVRDUF9PVkVSU0laRQorICAjZXJyb3IgIkxXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYgbmVlZHMgVENQX09WRVJTSVpFIGVuYWJsZWQgdG8gY3JlYXRlIHNpbmdsZS1wYnVmIFRDUCBwYWNrZXRzIgorI2VuZGlmCisjaWYgSVBfRlJBRyAmJiBJUF9GUkFHX1VTRVNfU1RBVElDX0JVRiAmJiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGCisgICNlcnJvciAiTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRiBkb2VzIG5vdCB3b3JrIHdpdGggSVBfRlJBR19VU0VTX1NUQVRJQ19CVUY9PTEgYXMgdGhhdCBjcmVhdGVzIHBidWYgcXVldWVzIgorI2VuZGlmCisKKworLyogQ29tcGlsZS10aW1lIGNoZWNrcyBmb3IgZGVwcmVjYXRlZCBvcHRpb25zLgorICovCisjaWZkZWYgTUVNUF9OVU1fVENQSVBfTVNHCisgICNlcnJvciAiTUVNUF9OVU1fVENQSVBfTVNHIG9wdGlvbiBpcyBkZXByZWNhdGVkLiBSZW1vdmUgaXQgZnJvbSB5b3VyIGx3aXBvcHRzLmguIgorI2VuZGlmCisjaWZkZWYgTUVNUF9OVU1fQVBJX01TRworICAjZXJyb3IgIk1FTVBfTlVNX0FQSV9NU0cgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIFJlbW92ZSBpdCBmcm9tIHlvdXIgbHdpcG9wdHMuaC4iCisjZW5kaWYKKyNpZmRlZiBUQ1BfUkVYTUlUX0RFQlVHCisgICNlcnJvciAiVENQX1JFWE1JVF9ERUJVRyBvcHRpb24gaXMgZGVwcmVjYXRlZC4gUmVtb3ZlIGl0IGZyb20geW91ciBsd2lwb3B0cy5oLiIKKyNlbmRpZgorI2lmZGVmIFJBV19TVEFUUworICAjZXJyb3IgIlJBV19TVEFUUyBvcHRpb24gaXMgZGVwcmVjYXRlZC4gUmVtb3ZlIGl0IGZyb20geW91ciBsd2lwb3B0cy5oLiIKKyNlbmRpZgorI2lmZGVmIEVUSEFSUF9RVUVVRV9GSVJTVAorICAjZXJyb3IgIkVUSEFSUF9RVUVVRV9GSVJTVCBvcHRpb24gaXMgZGVwcmVjYXRlZC4gUmVtb3ZlIGl0IGZyb20geW91ciBsd2lwb3B0cy5oLiIKKyNlbmRpZgorI2lmZGVmIEVUSEFSUF9BTFdBWVNfSU5TRVJUCisgICNlcnJvciAiRVRIQVJQX0FMV0FZU19JTlNFUlQgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIFJlbW92ZSBpdCBmcm9tIHlvdXIgbHdpcG9wdHMuaC4iCisjZW5kaWYKKworI2lmZGVmIExXSVBfREVCVUcKK3N0YXRpYyB2b2lkCitsd2lwX3Nhbml0eV9jaGVjayh2b2lkKQoreworICAvKiBXYXJuaW5ncyAqLworI2lmIExXSVBfTkVUQ09OTgorICBpZiAoTUVNUF9OVU1fTkVUQ09OTiA+IChNRU1QX05VTV9UQ1BfUENCK01FTVBfTlVNX1RDUF9QQ0JfTElTVEVOK01FTVBfTlVNX1VEUF9QQ0IrTUVNUF9OVU1fUkFXX1BDQikpCisgICAgTFdJUF9QTEFURk9STV9ESUFHKCgibHdpcF9zYW5pdHlfY2hlY2s6IFdBUk5JTkc6IE1FTVBfTlVNX05FVENPTk4gc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgc3VtIG9mIE1FTVBfTlVNX3tUQ1AsUkFXLFVEUH1fUENCK01FTVBfTlVNX1RDUF9QQ0JfTElTVEVOXG4iKSk7CisjZW5kaWYgLyogTFdJUF9ORVRDT05OICovCisjaWYgTFdJUF9UQ1AKKyAgaWYgKE1FTVBfTlVNX1RDUF9TRUcgPCBUQ1BfU05EX1FVRVVFTEVOKQorICAgIExXSVBfUExBVEZPUk1fRElBRygoImx3aXBfc2FuaXR5X2NoZWNrOiBXQVJOSU5HOiBNRU1QX05VTV9UQ1BfU0VHIHNob3VsZCBiZSBhdCBsZWFzdCBhcyBiaWcgYXMgVENQX1NORF9RVUVVRUxFTlxuIikpOworICBpZiAoVENQX1NORF9CVUYgPCAyICogVENQX01TUykKKyAgICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJsd2lwX3Nhbml0eV9jaGVjazogV0FSTklORzogVENQX1NORF9CVUYgbXVzdCBiZSBhdCBsZWFzdCBhcyBtdWNoIGFzICgyICogVENQX01TUykgZm9yIHRoaW5ncyB0byB3b3JrIHNtb290aGx5XG4iKSk7CisgIGlmIChUQ1BfU05EX1FVRVVFTEVOIDwgKDIgKiAoVENQX1NORF9CVUYvVENQX01TUykpKQorICAgIExXSVBfUExBVEZPUk1fRElBRygoImx3aXBfc2FuaXR5X2NoZWNrOiBXQVJOSU5HOiBUQ1BfU05EX1FVRVVFTEVOIG11c3QgYmUgYXQgbGVhc3QgYXMgbXVjaCBhcyAoMiAqIFRDUF9TTkRfQlVGL1RDUF9NU1MpIGZvciB0aGluZ3MgdG8gd29ya1xuIikpOworICBpZiAoVENQX1NORExPV0FUID49IFRDUF9TTkRfQlVGKQorICAgIExXSVBfUExBVEZPUk1fRElBRygoImx3aXBfc2FuaXR5X2NoZWNrOiBXQVJOSU5HOiBUQ1BfU05ETE9XQVQgbXVzdCBiZSBsZXNzIHRoYW4gVENQX1NORF9CVUYuXG4iKSk7CisgIGlmIChUQ1BfU05EUVVFVUVMT1dBVCA+PSBUQ1BfU05EX1FVRVVFTEVOKQorICAgIExXSVBfUExBVEZPUk1fRElBRygoImx3aXBfc2FuaXR5X2NoZWNrOiBXQVJOSU5HOiBUQ1BfU05EUVVFVUVMT1dBVCBtdXN0IGJlIGxlc3MgdGhhbiBUQ1BfU05EX1FVRVVFTEVOLlxuIikpOworICBpZiAoVENQX1dORCA+IChQQlVGX1BPT0xfU0laRSpQQlVGX1BPT0xfQlVGU0laRSkpCisgICAgTFdJUF9QTEFURk9STV9ESUFHKCgibHdpcF9zYW5pdHlfY2hlY2s6IFdBUk5JTkc6IFRDUF9XTkQgaXMgbGFyZ2VyIHRoYW4gc3BhY2UgcHJvdmlkZWQgYnkgUEJVRl9QT09MX1NJWkUqUEJVRl9QT09MX0JVRlNJWkVcbiIpKTsKKyAgaWYgKFRDUF9XTkQgPCBUQ1BfTVNTKQorICAgIExXSVBfUExBVEZPUk1fRElBRygoImx3aXBfc2FuaXR5X2NoZWNrOiBXQVJOSU5HOiBUQ1BfV05EIGlzIHNtYWxsZXIgdGhhbiBNU1NcbiIpKTsKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworI2lmIExXSVBfU09DS0VUCisgIC8qIENoZWNrIHRoYXQgdGhlIFNPXyogc29ja2V0IG9wdGlvbnMgYW5kIFNPRl8qIGx3SVAtaW50ZXJuYWwgZmxhZ3MgbWF0Y2ggKi8KKyAgaWYgKFNPX0FDQ0VQVENPTk4gIT0gU09GX0FDQ0VQVENPTk4pCisgICAgTFdJUF9QTEFURk9STV9ESUFHKCgibHdpcF9zYW5pdHlfY2hlY2s6IFdBUk5JTkc6IFNPX0FDQ0VQVENPTk4gIT0gU09GX0FDQ0VQVENPTk5cbiIpKTsKKyAgaWYgKFNPX1JFVVNFQUREUiAhPSBTT0ZfUkVVU0VBRERSKQorICAgIExXSVBfUExBVEZPUk1fRElBRygoImx3aXBfc2FuaXR5X2NoZWNrOiBXQVJOSU5HOiBTT19SRVVTRUFERFIgIT0gU09GX1JFVVNFQUREUlxuIikpOworICBpZiAoU09fS0VFUEFMSVZFICE9IFNPRl9LRUVQQUxJVkUpCisgICAgTFdJUF9QTEFURk9STV9ESUFHKCgibHdpcF9zYW5pdHlfY2hlY2s6IFdBUk5JTkc6IFNPX0tFRVBBTElWRSAhPSBTT0ZfS0VFUEFMSVZFXG4iKSk7CisgIGlmIChTT19CUk9BRENBU1QgIT0gU09GX0JST0FEQ0FTVCkKKyAgICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJsd2lwX3Nhbml0eV9jaGVjazogV0FSTklORzogU09fQlJPQURDQVNUICE9IFNPRl9CUk9BRENBU1RcbiIpKTsKKyAgaWYgKFNPX0xJTkdFUiAhPSBTT0ZfTElOR0VSKQorICAgIExXSVBfUExBVEZPUk1fRElBRygoImx3aXBfc2FuaXR5X2NoZWNrOiBXQVJOSU5HOiBTT19MSU5HRVIgIT0gU09GX0xJTkdFUlxuIikpOworI2VuZGlmIC8qIExXSVBfU09DS0VUICovCit9CisjZWxzZSAgLyogTFdJUF9ERUJVRyAqLworI2RlZmluZSBsd2lwX3Nhbml0eV9jaGVjaygpCisjZW5kaWYgLyogTFdJUF9ERUJVRyAqLworCisvKioKKyAqIFBlcmZvcm0gU2FuaXR5IGNoZWNrIG9mIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcywgYW5kIGluaXRpYWxpemUgYWxsIG1vZHVsZXMuCisgKi8KK3ZvaWQKK2x3aXBfaW5pdCh2b2lkKQoreworICAvKiBTYW5pdHkgY2hlY2sgdXNlci1jb25maWd1cmFibGUgdmFsdWVzICovCisgIGx3aXBfc2FuaXR5X2NoZWNrKCk7CisKKyAgLyogTW9kdWxlcyBpbml0aWFsaXphdGlvbiAqLworICBzdGF0c19pbml0KCk7CisjaWYgIU5PX1NZUworICBzeXNfaW5pdCgpOworI2VuZGlmIC8qICFOT19TWVMgKi8KKyAgbHdpcF9tZW1faW5pdCgpOworICBtZW1wX2luaXQoKTsKKyAgcGJ1Zl9pbml0KCk7CisgIG5ldGlmX2luaXQoKTsKKyNpZiBMV0lQX1NPQ0tFVAorICBsd2lwX3NvY2tldF9pbml0KCk7CisjZW5kaWYgLyogTFdJUF9TT0NLRVQgKi8KKyAgaXBfaW5pdCgpOworI2lmIExXSVBfQVJQCisgIGV0aGFycF9pbml0KCk7CisjZW5kaWYgLyogTFdJUF9BUlAgKi8KKyNpZiBMV0lQX1JBVworICByYXdfaW5pdCgpOworI2VuZGlmIC8qIExXSVBfUkFXICovCisjaWYgTFdJUF9VRFAKKyAgdWRwX2luaXQoKTsKKyNlbmRpZiAvKiBMV0lQX1VEUCAqLworI2lmIExXSVBfVENQCisgIHRjcF9pbml0KCk7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKyNpZiBMV0lQX1NOTVAKKyAgc25tcF9pbml0KCk7CisjZW5kaWYgLyogTFdJUF9TTk1QICovCisjaWYgTFdJUF9BVVRPSVAKKyAgYXV0b2lwX2luaXQoKTsKKyNlbmRpZiAvKiBMV0lQX0FVVE9JUCAqLworI2lmIExXSVBfSUdNUAorICBpZ21wX2luaXQoKTsKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKyNpZiBMV0lQX0ROUworICBkbnNfaW5pdCgpOworI2VuZGlmIC8qIExXSVBfRE5TICovCisKKyNpZiBMV0lQX1RJTUVSUworICBzeXNfdGltZW91dHNfaW5pdCgpOworI2VuZGlmIC8qIExXSVBfVElNRVJTICovCit9CmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2NvcmUvaXB2NC9hdXRvaXAuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS9pcHY0L2F1dG9pcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmI0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvaXB2NC9hdXRvaXAuYwpAQCAtMCwwICsxLDUzNiBAQAorLyoqCisgKiBAZmlsZQorICogQXV0b0lQIEF1dG9tYXRpYyBMaW5rTG9jYWwgSVAgQ29uZmlndXJhdGlvbgorICoKKyAqLworCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBEb21pbmlrIFNwaWVzIDxrb250YWt0QGRzcGllcy5kZT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3I6IERvbWluaWsgU3BpZXMgPGtvbnRha3RAZHNwaWVzLmRlPgorICoKKyAqIFRoaXMgaXMgYSBBdXRvSVAgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4gSXQgYWltcyB0byBjb25mb3JtCisgKiB3aXRoIFJGQyAzOTI3LgorICoKKyAqCisgKiBQbGVhc2UgY29vcmRpbmF0ZSBjaGFuZ2VzIGFuZCByZXF1ZXN0cyB3aXRoIERvbWluaWsgU3BpZXMKKyAqIDxrb250YWt0QGRzcGllcy5kZT4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNBR0U6CisgKiAKKyAqIGRlZmluZSBMV0lQX0FVVE9JUCAxICBpbiB5b3VyIGx3aXBvcHRzLmgKKyAqIAorICogSWYgeW91IGRvbid0IHVzZSB0Y3BpcC5jIChzbywgZG9uJ3QgY2FsbCwgeW91IGRvbid0IGNhbGwgdGNwaXBfaW5pdCk6CisgKiAtIEZpcnN0LCBjYWxsIGF1dG9pcF9pbml0KCkuCisgKiAtIGNhbGwgYXV0b2lwX3RtcigpIGFsbCBBVVRPSVBfVE1SX0lOVEVSVkFMIG1zY2VzLAorICogICB0aGF0IHNob3VsZCBiZSBkZWZpbmVkIGluIGF1dG9pcC5oLgorICogICBJIHJlY29tbWVuZCBhIHZhbHVlIG9mIDEwMC4gVGhlIHZhbHVlIG11c3QgZGl2aWRlIDEwMDAgd2l0aCBhIHJlbWFpbmRlciBhbG1vc3QgMC4KKyAqICAgUG9zc2libGUgdmFsdWVzIGFyZSAxMDAwLCA1MDAsIDMzMywgMjUwLCAyMDAsIDE2NiwgMTQyLCAxMjUsIDExMSwgMTAwIC4uLi4KKyAqCisgKiBXaXRob3V0IERIQ1A6CisgKiAtIENhbGwgYXV0b2lwX3N0YXJ0KCkgYWZ0ZXIgbmV0aWZfYWRkKCkuCisgKiAKKyAqIFdpdGggREhDUDoKKyAqIC0gZGVmaW5lIExXSVBfREhDUF9BVVRPSVBfQ09PUCAxIGluIHlvdXIgbHdpcG9wdHMuaC4KKyAqIC0gQ29uZmlndXJlIHlvdXIgREhDUCBDbGllbnQuCisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9BVVRPSVAgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL21lbS5oIgorI2luY2x1ZGUgImx3aXAvdWRwLmgiCisjaW5jbHVkZSAibHdpcC9pcF9hZGRyLmgiCisjaW5jbHVkZSAibHdpcC9uZXRpZi5oIgorI2luY2x1ZGUgImx3aXAvYXV0b2lwLmgiCisjaW5jbHVkZSAibmV0aWYvZXRoYXJwLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogMTY5LjI1NC4wLjAgKi8KKyNkZWZpbmUgQVVUT0lQX05FVCAgICAgICAgIDB4QTlGRTAwMDAKKy8qIDE2OS4yNTQuMS4wICovCisjZGVmaW5lIEFVVE9JUF9SQU5HRV9TVEFSVCAoQVVUT0lQX05FVCB8IDB4MDEwMCkKKy8qIDE2OS4yNTQuMjU0LjI1NSAqLworI2RlZmluZSBBVVRPSVBfUkFOR0VfRU5EICAgKEFVVE9JUF9ORVQgfCAweEZFRkYpCisKKworLyoqIFBzZXVkbyByYW5kb20gbWFjcm8gYmFzZWQgb24gbmV0aWYgaW5mb3JtYXRpb25zLgorICogWW91IGNvdWxkIHVzZSAicmFuZCgpIiBmcm9tIHRoZSBDIExpYnJhcnkgaWYgeW91IGRlZmluZSBMV0lQX0FVVE9JUF9SQU5EIGluIGx3aXBvcHRzLmggKi8KKyNpZm5kZWYgTFdJUF9BVVRPSVBfUkFORAorI2RlZmluZSBMV0lQX0FVVE9JUF9SQU5EKG5ldGlmKSAoICgoKHUzMl90KSgobmV0aWYtPmh3YWRkcls1XSkgJiAweGZmKSA8PCAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyX3QpKChuZXRpZi0+aHdhZGRyWzNdKSAmIDB4ZmYpIDw8IDE2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzJfdCkoKG5ldGlmLT5od2FkZHJbMl0pICYgMHhmZikgPDwgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyX3QpKChuZXRpZi0+aHdhZGRyWzRdKSAmIDB4ZmYpKSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXRpZi0+YXV0b2lwP25ldGlmLT5hdXRvaXAtPnRyaWVkX2xsaXBhZGRyOjApKQorI2VuZGlmIC8qIExXSVBfQVVUT0lQX1JBTkQgKi8KKworLyoqCisgKiBNYWNybyB0aGF0IGdlbmVyYXRlcyB0aGUgaW5pdGlhbCBJUCBhZGRyZXNzIHRvIGJlIHRyaWVkIGJ5IEFVVE9JUC4KKyAqIElmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoaXMsIGRlZmluZSBpdCB0byBzb21ldGhpbmcgZWxzZSBpbiBsd2lwb3B0cy5oLgorICovCisjaWZuZGVmIExXSVBfQVVUT0lQX0NSRUFURV9TRUVEX0FERFIKKyNkZWZpbmUgTFdJUF9BVVRPSVBfQ1JFQVRFX1NFRURfQUREUihuZXRpZikgXAorICBodG9ubChBVVRPSVBfUkFOR0VfU1RBUlQgKyAoKHUzMl90KSgoKHU4X3QpKG5ldGlmLT5od2FkZHJbNF0pKSB8IFwKKyAgICAgICAgICAgICAgICAgKCh1MzJfdCkoKHU4X3QpKG5ldGlmLT5od2FkZHJbNV0pKSkgPDwgOCkpKQorI2VuZGlmIC8qIExXSVBfQVVUT0lQX0NSRUFURV9TRUVEX0FERFIgKi8KKworLyogc3RhdGljIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgYXV0b2lwX2hhbmRsZV9hcnBfY29uZmxpY3Qoc3RydWN0IG5ldGlmICpuZXRpZik7CisKKy8qIGNyZWF0ZXMgYSBwc2V1ZG8gcmFuZG9tIExMIElQLUFkZHJlc3MgZm9yIGEgbmV0d29yayBpbnRlcmZhY2UgKi8KK3N0YXRpYyB2b2lkIGF1dG9pcF9jcmVhdGVfYWRkcihzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKmlwYWRkcik7CisKKy8qIHNlbmRzIGFuIEFSUCBwcm9iZSAqLworc3RhdGljIGVycl90IGF1dG9pcF9hcnBfcHJvYmUoc3RydWN0IG5ldGlmICpuZXRpZik7CisKKy8qIHNlbmRzIGFuIEFSUCBhbm5vdW5jZSAqLworc3RhdGljIGVycl90IGF1dG9pcF9hcnBfYW5ub3VuY2Uoc3RydWN0IG5ldGlmICpuZXRpZik7CisKKy8qIGNvbmZpZ3VyZSBpbnRlcmZhY2UgZm9yIHVzZSB3aXRoIGN1cnJlbnQgTEwgSVAtQWRkcmVzcyAqLworc3RhdGljIGVycl90IGF1dG9pcF9iaW5kKHN0cnVjdCBuZXRpZiAqbmV0aWYpOworCisvKiBzdGFydCBzZW5kaW5nIHByb2JlcyBmb3IgbGxpcGFkZHIgKi8KK3N0YXRpYyB2b2lkIGF1dG9pcF9zdGFydF9wcm9iaW5nKHN0cnVjdCBuZXRpZiAqbmV0aWYpOworCisvKioKKyAqIEluaXRpYWxpemUgdGhpcyBtb2R1bGUKKyAqLwordm9pZAorYXV0b2lwX2luaXQodm9pZCkKK3sKKyAgTFdJUF9ERUJVR0YoQVVUT0lQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiYXV0b2lwX2luaXQoKVxuIikpOworfQorCisvKiogU2V0IGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgc3RydWN0IGF1dG9pcCB0byB3b3JrIHdpdGguCisgKiBVc2luZyB0aGlzIHByZXZlbnRzIGF1dG9pcF9zdGFydCB0byBhbGxvY2F0ZSBpdCB1c2luZyBtZW1fbWFsbG9jLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbmV0aWYgZm9yIHdoaWNoIHRvIHNldCB0aGUgc3RydWN0IGF1dG9pcAorICogQHBhcmFtIGRoY3AgKHVuaW5pdGlhbGlzZWQpIGRoY3Agc3RydWN0IGFsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24KKyAqLwordm9pZAorYXV0b2lwX3NldF9zdHJ1Y3Qoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IGF1dG9pcCAqYXV0b2lwKQoreworICBMV0lQX0FTU0VSVCgibmV0aWYgIT0gTlVMTCIsIG5ldGlmICE9IE5VTEwpOworICBMV0lQX0FTU0VSVCgiYXV0b2lwICE9IE5VTEwiLCBhdXRvaXAgIT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJuZXRpZiBhbHJlYWR5IGhhcyBhIHN0cnVjdCBhdXRvaXAgc2V0IiwgbmV0aWYtPmF1dG9pcCA9PSBOVUxMKTsKKworICAvKiBjbGVhciBkYXRhIHN0cnVjdHVyZSAqLworICBtZW1zZXQoYXV0b2lwLCAwLCBzaXplb2Yoc3RydWN0IGF1dG9pcCkpOworICAvKiBhdXRvaXAtPnN0YXRlID0gQVVUT0lQX1NUQVRFX09GRjsgKi8KKyAgbmV0aWYtPmF1dG9pcCA9IGF1dG9pcDsKK30KKworLyoqIFJlc3RhcnQgQXV0b0lQIGNsaWVudCBhbmQgY2hlY2sgdGhlIG5leHQgYWRkcmVzcyAoY29uZmxpY3QgZGV0ZWN0ZWQpCisgKgorICogQHBhcmFtIG5ldGlmIFRoZSBuZXRpZiB1bmRlciBBdXRvSVAgY29udHJvbAorICovCitzdGF0aWMgdm9pZAorYXV0b2lwX3Jlc3RhcnQoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgbmV0aWYtPmF1dG9pcC0+dHJpZWRfbGxpcGFkZHIrKzsKKyAgYXV0b2lwX3N0YXJ0KG5ldGlmKTsKK30KKworLyoqCisgKiBIYW5kbGUgYSBJUCBhZGRyZXNzIGNvbmZsaWN0IGFmdGVyIGFuIEFSUCBjb25mbGljdCBkZXRlY3Rpb24KKyAqLworc3RhdGljIHZvaWQKK2F1dG9pcF9oYW5kbGVfYXJwX2NvbmZsaWN0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIC8qIFNvbWVob3cgZGV0ZWN0IGlmIHdlIGFyZSBkZWZlbmRpbmcgb3IgcmV0cmVhdGluZyAqLworICB1bnNpZ25lZCBjaGFyIGRlZmVuZCA9IDE7IC8qIHRiZCAqLworCisgIGlmKGRlZmVuZCkgeworICAgIGlmKG5ldGlmLT5hdXRvaXAtPmxhc3Rjb25mbGljdCA+IDApIHsKKyAgICAgIC8qIHJldHJlYXQsIHRoZXJlIHdhcyBhIGNvbmZsaWN0aW5nIEFSUCBpbiB0aGUgbGFzdAorICAgICAgICogREVGRU5EX0lOVEVSVkFMIHNlY29uZHMKKyAgICAgICAqLworICAgICAgTFdJUF9ERUJVR0YoQVVUT0lQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwKKyAgICAgICAgKCJhdXRvaXBfaGFuZGxlX2FycF9jb25mbGljdCgpOiB3ZSBhcmUgZGVmZW5kaW5nLCBidXQgaW4gREVGRU5EX0lOVEVSVkFMLCByZXRyZWF0aW5nXG4iKSk7CisKKyAgICAgIC8qIFRPRE86IGNsb3NlIGFsbCBUQ1Agc2Vzc2lvbnMgKi8KKyAgICAgIGF1dG9pcF9yZXN0YXJ0KG5ldGlmKTsKKyAgICB9IGVsc2UgeworICAgICAgTFdJUF9ERUJVR0YoQVVUT0lQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwKKyAgICAgICAgKCJhdXRvaXBfaGFuZGxlX2FycF9jb25mbGljdCgpOiB3ZSBhcmUgZGVmZW5kLCBzZW5kIEFSUCBBbm5vdW5jZVxuIikpOworICAgICAgYXV0b2lwX2FycF9hbm5vdW5jZShuZXRpZik7CisgICAgICBuZXRpZi0+YXV0b2lwLT5sYXN0Y29uZmxpY3QgPSBERUZFTkRfSU5URVJWQUwgKiBBVVRPSVBfVElDS1NfUEVSX1NFQ09ORDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgTFdJUF9ERUJVR0YoQVVUT0lQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwKKyAgICAgICgiYXV0b2lwX2hhbmRsZV9hcnBfY29uZmxpY3QoKTogd2UgZG8gbm90IGRlZmVuZCwgcmV0cmVhdGluZ1xuIikpOworICAgIC8qIFRPRE86IGNsb3NlIGFsbCBUQ1Agc2Vzc2lvbnMgKi8KKyAgICBhdXRvaXBfcmVzdGFydChuZXRpZik7CisgIH0KK30KKworLyoqCisgKiBDcmVhdGUgYW4gSVAtQWRkcmVzcyBvdXQgb2YgcmFuZ2UgMTY5LjI1NC4xLjAgdG8gMTY5LjI1NC4yNTQuMjU1CisgKgorICogQHBhcmFtIG5ldGlmIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIGNyZWF0ZSB0aGUgSVAtQWRkcmVzcworICogQHBhcmFtIGlwYWRkciBpcCBhZGRyZXNzIHRvIGluaXRpYWxpemUKKyAqLworc3RhdGljIHZvaWQKK2F1dG9pcF9jcmVhdGVfYWRkcihzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKmlwYWRkcikKK3sKKyAgLyogSGVyZSB3ZSBjcmVhdGUgYW4gSVAtQWRkcmVzcyBvdXQgb2YgcmFuZ2UgMTY5LjI1NC4xLjAgdG8gMTY5LjI1NC4yNTQuMjU1CisgICAqIGNvbXBsaWFudCB0byBSRkMgMzkyNyBTZWN0aW9uIDIuMQorICAgKiBXZSBoYXZlIDI1NCAqIDI1NiBwb3NzaWJpbGl0aWVzICovCisKKyAgdTMyX3QgYWRkciA9IG50b2hsKExXSVBfQVVUT0lQX0NSRUFURV9TRUVEX0FERFIobmV0aWYpKTsKKyAgYWRkciArPSBuZXRpZi0+YXV0b2lwLT50cmllZF9sbGlwYWRkcjsKKyAgYWRkciA9IEFVVE9JUF9ORVQgfCAoYWRkciAmIDB4ZmZmZik7CisgIC8qIE5vdywgMTY5LjI1NC4wLjAgPD0gYWRkciA8PSAxNjkuMjU0LjI1NS4yNTUgKi8gCisKKyAgaWYgKGFkZHIgPCBBVVRPSVBfUkFOR0VfU1RBUlQpIHsKKyAgICBhZGRyICs9IEFVVE9JUF9SQU5HRV9FTkQgLSBBVVRPSVBfUkFOR0VfU1RBUlQgKyAxOworICB9CisgIGlmIChhZGRyID4gQVVUT0lQX1JBTkdFX0VORCkgeworICAgIGFkZHIgLT0gQVVUT0lQX1JBTkdFX0VORCAtIEFVVE9JUF9SQU5HRV9TVEFSVCArIDE7CisgIH0KKyAgTFdJUF9BU1NFUlQoIkFVVE9JUCBhZGRyZXNzIG5vdCBpbiByYW5nZSIsIChhZGRyID49IEFVVE9JUF9SQU5HRV9TVEFSVCkgJiYKKyAgICAoYWRkciA8PSBBVVRPSVBfUkFOR0VfRU5EKSk7CisgIGlwNF9hZGRyX3NldF91MzIoaXBhZGRyLCBodG9ubChhZGRyKSk7CisgIAorICBMV0lQX0RFQlVHRihBVVRPSVBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLAorICAgICgiYXV0b2lwX2NyZWF0ZV9hZGRyKCk6IHRyaWVkX2xsaXBhZGRyPSUiVTE2X0YiLCAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICAodTE2X3QpKG5ldGlmLT5hdXRvaXAtPnRyaWVkX2xsaXBhZGRyKSwgaXA0X2FkZHIxXzE2KGlwYWRkciksIGlwNF9hZGRyMl8xNihpcGFkZHIpLAorICAgIGlwNF9hZGRyM18xNihpcGFkZHIpLCBpcDRfYWRkcjRfMTYoaXBhZGRyKSkpOworfQorCisvKioKKyAqIFNlbmRzIGFuIEFSUCBwcm9iZSBmcm9tIGEgbmV0d29yayBpbnRlcmZhY2UKKyAqCisgKiBAcGFyYW0gbmV0aWYgbmV0d29yayBpbnRlcmZhY2UgdXNlZCB0byBzZW5kIHRoZSBwcm9iZQorICovCitzdGF0aWMgZXJyX3QKK2F1dG9pcF9hcnBfcHJvYmUoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgcmV0dXJuIGV0aGFycF9yYXcobmV0aWYsIChzdHJ1Y3QgZXRoX2FkZHIgKiluZXRpZi0+aHdhZGRyLCAmZXRoYnJvYWRjYXN0LAorICAgIChzdHJ1Y3QgZXRoX2FkZHIgKiluZXRpZi0+aHdhZGRyLCBJUF9BRERSX0FOWSwgJmV0aHplcm8sCisgICAgJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyLCBBUlBfUkVRVUVTVCk7Cit9CisKKy8qKgorICogU2VuZHMgYW4gQVJQIGFubm91bmNlIGZyb20gYSBuZXR3b3JrIGludGVyZmFjZQorICoKKyAqIEBwYXJhbSBuZXRpZiBuZXR3b3JrIGludGVyZmFjZSB1c2VkIHRvIHNlbmQgdGhlIGFubm91bmNlCisgKi8KK3N0YXRpYyBlcnJfdAorYXV0b2lwX2FycF9hbm5vdW5jZShzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICByZXR1cm4gZXRoYXJwX3JhdyhuZXRpZiwgKHN0cnVjdCBldGhfYWRkciAqKW5ldGlmLT5od2FkZHIsICZldGhicm9hZGNhc3QsCisgICAgKHN0cnVjdCBldGhfYWRkciAqKW5ldGlmLT5od2FkZHIsICZuZXRpZi0+YXV0b2lwLT5sbGlwYWRkciwgJmV0aHplcm8sCisgICAgJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyLCBBUlBfUkVRVUVTVCk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIGludGVyZmFjZSBmb3IgdXNlIHdpdGggY3VycmVudCBMTCBJUC1BZGRyZXNzCisgKgorICogQHBhcmFtIG5ldGlmIG5ldHdvcmsgaW50ZXJmYWNlIHRvIGNvbmZpZ3VyZSB3aXRoIGN1cnJlbnQgTEwgSVAtQWRkcmVzcworICovCitzdGF0aWMgZXJyX3QKK2F1dG9pcF9iaW5kKHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBhdXRvaXAgKmF1dG9pcCA9IG5ldGlmLT5hdXRvaXA7CisgIGlwX2FkZHJfdCBzbl9tYXNrLCBnd19hZGRyOworCisgIExXSVBfREVCVUdGKEFVVE9JUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLAorICAgICgiYXV0b2lwX2JpbmQobmV0aWY9JXApICVjJWMlIlUxNl9GIiAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICAodm9pZCopbmV0aWYsIG5ldGlmLT5uYW1lWzBdLCBuZXRpZi0+bmFtZVsxXSwgKHUxNl90KW5ldGlmLT5udW0sCisgICAgaXA0X2FkZHIxXzE2KCZhdXRvaXAtPmxsaXBhZGRyKSwgaXA0X2FkZHIyXzE2KCZhdXRvaXAtPmxsaXBhZGRyKSwKKyAgICBpcDRfYWRkcjNfMTYoJmF1dG9pcC0+bGxpcGFkZHIpLCBpcDRfYWRkcjRfMTYoJmF1dG9pcC0+bGxpcGFkZHIpKSk7CisKKyAgSVA0X0FERFIoJnNuX21hc2ssIDI1NSwgMjU1LCAwLCAwKTsKKyAgSVA0X0FERFIoJmd3X2FkZHIsIDAsIDAsIDAsIDApOworCisgIG5ldGlmX3NldF9pcGFkZHIobmV0aWYsICZhdXRvaXAtPmxsaXBhZGRyKTsKKyAgbmV0aWZfc2V0X25ldG1hc2sobmV0aWYsICZzbl9tYXNrKTsKKyAgbmV0aWZfc2V0X2d3KG5ldGlmLCAmZ3dfYWRkcik7ICAKKworICAvKiBicmluZyB0aGUgaW50ZXJmYWNlIHVwICovCisgIG5ldGlmX3NldF91cChuZXRpZik7CisKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBTdGFydCBBdXRvSVAgY2xpZW50CisgKgorICogQHBhcmFtIG5ldGlmIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHN0YXJ0IHRoZSBBdXRvSVAgY2xpZW50CisgKi8KK2Vycl90CithdXRvaXBfc3RhcnQoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgc3RydWN0IGF1dG9pcCAqYXV0b2lwID0gbmV0aWYtPmF1dG9pcDsKKyAgZXJyX3QgcmVzdWx0ID0gRVJSX09LOworCisgIGlmKG5ldGlmX2lzX3VwKG5ldGlmKSkgeworICAgIG5ldGlmX3NldF9kb3duKG5ldGlmKTsKKyAgfQorCisgIC8qIFNldCBJUC1BZGRyZXNzLCBOZXRtYXNrIGFuZCBHYXRld2F5IHRvIDAgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICogQVJQIFBhY2tldHMgYXJlIGZvcm1lZCBjb3JyZWN0bHkKKyAgICovCisgIGlwX2FkZHJfc2V0X3plcm8oJm5ldGlmLT5pcF9hZGRyKTsKKyAgaXBfYWRkcl9zZXRfemVybygmbmV0aWYtPm5ldG1hc2spOworICBpcF9hZGRyX3NldF96ZXJvKCZuZXRpZi0+Z3cpOworCisgIExXSVBfREVCVUdGKEFVVE9JUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsCisgICAgKCJhdXRvaXBfc3RhcnQobmV0aWY9JXApICVjJWMlIlUxNl9GIlxuIiwgKHZvaWQqKW5ldGlmLCBuZXRpZi0+bmFtZVswXSwKKyAgICBuZXRpZi0+bmFtZVsxXSwgKHUxNl90KW5ldGlmLT5udW0pKTsKKyAgaWYoYXV0b2lwID09IE5VTEwpIHsKKyAgICAvKiBubyBBdXRvSVAgY2xpZW50IGF0dGFjaGVkIHlldD8gKi8KKyAgICBMV0lQX0RFQlVHRihBVVRPSVBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwKKyAgICAgICgiYXV0b2lwX3N0YXJ0KCk6IHN0YXJ0aW5nIG5ldyBBVVRPSVAgY2xpZW50XG4iKSk7CisgICAgYXV0b2lwID0gKHN0cnVjdCBhdXRvaXAgKiltZW1fbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXV0b2lwKSk7CisgICAgaWYoYXV0b2lwID09IE5VTEwpIHsKKyAgICAgIExXSVBfREVCVUdGKEFVVE9JUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLAorICAgICAgICAoImF1dG9pcF9zdGFydCgpOiBjb3VsZCBub3QgYWxsb2NhdGUgYXV0b2lwXG4iKSk7CisgICAgICByZXR1cm4gRVJSX01FTTsKKyAgICB9CisgICAgbWVtc2V0KGF1dG9pcCwgMCwgc2l6ZW9mKHN0cnVjdCBhdXRvaXApKTsKKyAgICAvKiBzdG9yZSB0aGlzIEF1dG9JUCBjbGllbnQgaW4gdGhlIG5ldGlmICovCisgICAgbmV0aWYtPmF1dG9pcCA9IGF1dG9pcDsKKyAgICBMV0lQX0RFQlVHRihBVVRPSVBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJhdXRvaXBfc3RhcnQoKTogYWxsb2NhdGVkIGF1dG9pcCIpKTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvaXAtPnN0YXRlID0gQVVUT0lQX1NUQVRFX09GRjsKKyAgICBhdXRvaXAtPnR0dyA9IDA7CisgICAgYXV0b2lwLT5zZW50X251bSA9IDA7CisgICAgaXBfYWRkcl9zZXRfemVybygmYXV0b2lwLT5sbGlwYWRkcik7CisgICAgYXV0b2lwLT5sYXN0Y29uZmxpY3QgPSAwOworICB9CisKKyAgYXV0b2lwX2NyZWF0ZV9hZGRyKG5ldGlmLCAmKGF1dG9pcC0+bGxpcGFkZHIpKTsKKyAgYXV0b2lwX3N0YXJ0X3Byb2JpbmcobmV0aWYpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCithdXRvaXBfc3RhcnRfcHJvYmluZyhzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgYXV0b2lwICphdXRvaXAgPSBuZXRpZi0+YXV0b2lwOworCisgIGF1dG9pcC0+c3RhdGUgPSBBVVRPSVBfU1RBVEVfUFJPQklORzsKKyAgYXV0b2lwLT5zZW50X251bSA9IDA7CisgIExXSVBfREVCVUdGKEFVVE9JUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsCisgICAgICgiYXV0b2lwX3N0YXJ0X3Byb2JpbmcoKTogY2hhbmdpbmcgc3RhdGUgdG8gUFJPQklORzogJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiJcbiIsCisgICAgICBpcDRfYWRkcjFfMTYoJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyKSwgaXA0X2FkZHIyXzE2KCZuZXRpZi0+YXV0b2lwLT5sbGlwYWRkciksCisgICAgICBpcDRfYWRkcjNfMTYoJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyKSwgaXA0X2FkZHI0XzE2KCZuZXRpZi0+YXV0b2lwLT5sbGlwYWRkcikpKTsKKworICAvKiB0aW1lIHRvIHdhaXQgdG8gZmlyc3QgcHJvYmUsIHRoaXMgaXMgcmFuZG9tbHkKKyAgICogY2hvb3NlbiBvdXQgb2YgMCB0byBQUk9CRV9XQUlUIHNlY29uZHMuCisgICAqIGNvbXBsaWFudCB0byBSRkMgMzkyNyBTZWN0aW9uIDIuMi4xCisgICAqLworICBhdXRvaXAtPnR0dyA9ICh1MTZfdCkoTFdJUF9BVVRPSVBfUkFORChuZXRpZikgJSAoUFJPQkVfV0FJVCAqIEFVVE9JUF9USUNLU19QRVJfU0VDT05EKSk7CisKKyAgLyoKKyAgICogaWYgd2UgdHJpZWQgbW9yZSB0aGVuIE1BWF9DT05GTElDVFMgd2UgbXVzdCBsaW1pdCBvdXIgcmF0ZSBmb3IKKyAgICogYWNjcXVpcmluZyBhbmQgcHJvYmluZyBhZGRyZXNzCisgICAqIGNvbXBsaWFudCB0byBSRkMgMzkyNyBTZWN0aW9uIDIuMi4xCisgICAqLworICBpZihhdXRvaXAtPnRyaWVkX2xsaXBhZGRyID4gTUFYX0NPTkZMSUNUUykgeworICAgIGF1dG9pcC0+dHR3ID0gUkFURV9MSU1JVF9JTlRFUlZBTCAqIEFVVE9JUF9USUNLU19QRVJfU0VDT05EOworICB9Cit9CisKKy8qKgorICogSGFuZGxlIGEgcG9zc2libGUgY2hhbmdlIGluIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uCisgKgorICogSWYgdGhlcmUgaXMgYW4gQXV0b0lQIGFkZHJlc3MgY29uZmlndXJlZCwgdGFrZSB0aGUgaW50ZXJmYWNlIGRvd24KKyAqIGFuZCBiZWdpbiBwcm9iaW5nIHdpdGggdGhlIHNhbWUgYWRkcmVzcy4KKyAqLwordm9pZAorYXV0b2lwX25ldHdvcmtfY2hhbmdlZChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBpZiAobmV0aWYtPmF1dG9pcCAmJiBuZXRpZi0+YXV0b2lwLT5zdGF0ZSAhPSBBVVRPSVBfU1RBVEVfT0ZGKSB7CisgICAgbmV0aWZfc2V0X2Rvd24obmV0aWYpOworICAgIGF1dG9pcF9zdGFydF9wcm9iaW5nKG5ldGlmKTsKKyAgfQorfQorCisvKioKKyAqIFN0b3AgQXV0b0lQIGNsaWVudAorICoKKyAqIEBwYXJhbSBuZXRpZiBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCBzdG9wIHRoZSBBdXRvSVAgY2xpZW50CisgKi8KK2Vycl90CithdXRvaXBfc3RvcChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBuZXRpZi0+YXV0b2lwLT5zdGF0ZSA9IEFVVE9JUF9TVEFURV9PRkY7CisgIG5ldGlmX3NldF9kb3duKG5ldGlmKTsKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBIYXMgdG8gYmUgY2FsbGVkIGluIGxvb3AgZXZlcnkgQVVUT0lQX1RNUl9JTlRFUlZBTCBtaWxsaXNlY29uZHMKKyAqLwordm9pZAorYXV0b2lwX3RtcigpCit7CisgIHN0cnVjdCBuZXRpZiAqbmV0aWYgPSBuZXRpZl9saXN0OworICAvKiBsb29wIHRocm91Z2ggbmV0aWYncyAqLworICB3aGlsZSAobmV0aWYgIT0gTlVMTCkgeworICAgIC8qIG9ubHkgYWN0IG9uIEF1dG9JUCBjb25maWd1cmVkIGludGVyZmFjZXMgKi8KKyAgICBpZiAobmV0aWYtPmF1dG9pcCAhPSBOVUxMKSB7CisgICAgICBpZihuZXRpZi0+YXV0b2lwLT5sYXN0Y29uZmxpY3QgPiAwKSB7CisgICAgICAgIG5ldGlmLT5hdXRvaXAtPmxhc3Rjb25mbGljdC0tOworICAgICAgfQorCisgICAgICBMV0lQX0RFQlVHRihBVVRPSVBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwKKyAgICAgICAgKCJhdXRvaXBfdG1yKCkgQXV0b0lQLVN0YXRlOiAlIlUxNl9GIiwgdHR3PSUiVTE2X0YiXG4iLAorICAgICAgICAodTE2X3QpKG5ldGlmLT5hdXRvaXAtPnN0YXRlKSwgbmV0aWYtPmF1dG9pcC0+dHR3KSk7CisKKyAgICAgIHN3aXRjaChuZXRpZi0+YXV0b2lwLT5zdGF0ZSkgeworICAgICAgICBjYXNlIEFVVE9JUF9TVEFURV9QUk9CSU5HOgorICAgICAgICAgIGlmKG5ldGlmLT5hdXRvaXAtPnR0dyA+IDApIHsKKyAgICAgICAgICAgIG5ldGlmLT5hdXRvaXAtPnR0dy0tOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihuZXRpZi0+YXV0b2lwLT5zZW50X251bSA+PSBQUk9CRV9OVU0pIHsKKyAgICAgICAgICAgICAgbmV0aWYtPmF1dG9pcC0+c3RhdGUgPSBBVVRPSVBfU1RBVEVfQU5OT1VOQ0lORzsKKyAgICAgICAgICAgICAgbmV0aWYtPmF1dG9pcC0+c2VudF9udW0gPSAwOworICAgICAgICAgICAgICBuZXRpZi0+YXV0b2lwLT50dHcgPSBBTk5PVU5DRV9XQUlUICogQVVUT0lQX1RJQ0tTX1BFUl9TRUNPTkQ7CisgICAgICAgICAgICAgIExXSVBfREVCVUdGKEFVVE9JUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsCisgICAgICAgICAgICAgICAgICgiYXV0b2lwX3RtcigpOiBjaGFuZ2luZyBzdGF0ZSB0byBBTk5PVU5DSU5HOiAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgIGlwNF9hZGRyMV8xNigmbmV0aWYtPmF1dG9pcC0+bGxpcGFkZHIpLCBpcDRfYWRkcjJfMTYoJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyKSwKKyAgICAgICAgICAgICAgICAgIGlwNF9hZGRyM18xNigmbmV0aWYtPmF1dG9pcC0+bGxpcGFkZHIpLCBpcDRfYWRkcjRfMTYoJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgYXV0b2lwX2FycF9wcm9iZShuZXRpZik7CisgICAgICAgICAgICAgIExXSVBfREVCVUdGKEFVVE9JUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLAorICAgICAgICAgICAgICAgICgiYXV0b2lwX3RtcigpIFBST0JJTkcgU2VudCBQcm9iZVxuIikpOworICAgICAgICAgICAgICBuZXRpZi0+YXV0b2lwLT5zZW50X251bSsrOworICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGltZSB0byB3YWl0IHRvIG5leHQgcHJvYmUgKi8KKyAgICAgICAgICAgICAgbmV0aWYtPmF1dG9pcC0+dHR3ID0gKHUxNl90KSgoTFdJUF9BVVRPSVBfUkFORChuZXRpZikgJQorICAgICAgICAgICAgICAgICgoUFJPQkVfTUFYIC0gUFJPQkVfTUlOKSAqIEFVVE9JUF9USUNLU19QRVJfU0VDT05EKSApICsKKyAgICAgICAgICAgICAgICBQUk9CRV9NSU4gKiBBVVRPSVBfVElDS1NfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVVUT0lQX1NUQVRFX0FOTk9VTkNJTkc6CisgICAgICAgICAgaWYobmV0aWYtPmF1dG9pcC0+dHR3ID4gMCkgeworICAgICAgICAgICAgbmV0aWYtPmF1dG9pcC0+dHR3LS07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKG5ldGlmLT5hdXRvaXAtPnNlbnRfbnVtID09IDApIHsKKyAgICAgICAgICAgICAvKiBXZSBhcmUgaGVyZSB0aGUgZmlyc3QgdGltZSwgc28gd2Ugd2FpdGVkIEFOTk9VTkNFX1dBSVQgc2Vjb25kcworICAgICAgICAgICAgICAqIE5vdyB3ZSBjYW4gYmluZCB0byBhbiBJUCBhZGRyZXNzIGFuZCB1c2UgaXQuCisgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgKiBhdXRvaXBfYmluZCBjYWxscyBuZXRpZl9zZXRfdXAuIFRoaXMgdHJpZ2dlcnMgYSBncmF0dWl0b3VzIEFSUAorICAgICAgICAgICAgICAqIHdoaWNoIGNvdW50cyBhcyBhbiBhbm5vdW5jZW1lbnQuCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGF1dG9pcF9iaW5kKG5ldGlmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGF1dG9pcF9hcnBfYW5ub3VuY2UobmV0aWYpOworICAgICAgICAgICAgICBMV0lQX0RFQlVHRihBVVRPSVBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwKKyAgICAgICAgICAgICAgICAoImF1dG9pcF90bXIoKSBBTk5PVU5DSU5HIFNlbnQgQW5ub3VuY2VcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ldGlmLT5hdXRvaXAtPnR0dyA9IEFOTk9VTkNFX0lOVEVSVkFMICogQVVUT0lQX1RJQ0tTX1BFUl9TRUNPTkQ7CisgICAgICAgICAgICBuZXRpZi0+YXV0b2lwLT5zZW50X251bSsrOworCisgICAgICAgICAgICBpZihuZXRpZi0+YXV0b2lwLT5zZW50X251bSA+PSBBTk5PVU5DRV9OVU0pIHsKKyAgICAgICAgICAgICAgICBuZXRpZi0+YXV0b2lwLT5zdGF0ZSA9IEFVVE9JUF9TVEFURV9CT1VORDsKKyAgICAgICAgICAgICAgICBuZXRpZi0+YXV0b2lwLT5zZW50X251bSA9IDA7CisgICAgICAgICAgICAgICAgbmV0aWYtPmF1dG9pcC0+dHR3ID0gMDsKKyAgICAgICAgICAgICAgICAgTFdJUF9ERUJVR0YoQVVUT0lQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgKCJhdXRvaXBfdG1yKCk6IGNoYW5naW5nIHN0YXRlIHRvIEJPVU5EOiAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGlwNF9hZGRyMV8xNigmbmV0aWYtPmF1dG9pcC0+bGxpcGFkZHIpLCBpcDRfYWRkcjJfMTYoJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgIGlwNF9hZGRyM18xNigmbmV0aWYtPmF1dG9pcC0+bGxpcGFkZHIpLCBpcDRfYWRkcjRfMTYoJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLyogcHJvY2VlZCB0byBuZXh0IG5ldHdvcmsgaW50ZXJmYWNlICovCisgICAgbmV0aWYgPSBuZXRpZi0+bmV4dDsKKyAgfQorfQorCisvKioKKyAqIEhhbmRsZXMgZXZlcnkgaW5jb21pbmcgQVJQIFBhY2tldCwgY2FsbGVkIGJ5IGV0aGFycF9hcnBfaW5wdXQuCisgKgorICogQHBhcmFtIG5ldGlmIG5ldHdvcmsgaW50ZXJmYWNlIHRvIHVzZSBmb3IgYXV0b2lwIHByb2Nlc3NpbmcKKyAqIEBwYXJhbSBoZHIgSW5jb21pbmcgQVJQIHBhY2tldAorICovCit2b2lkCithdXRvaXBfYXJwX3JlcGx5KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBldGhhcnBfaGRyICpoZHIpCit7CisgIExXSVBfREVCVUdGKEFVVE9JUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImF1dG9pcF9hcnBfcmVwbHkoKVxuIikpOworICBpZiAoKG5ldGlmLT5hdXRvaXAgIT0gTlVMTCkgJiYgKG5ldGlmLT5hdXRvaXAtPnN0YXRlICE9IEFVVE9JUF9TVEFURV9PRkYpKSB7CisgICAvKiB3aGVuIGlwLnNyYyA9PSBsbGlwYWRkciAmJiBody5zcmMgIT0gbmV0aWYtPmh3YWRkcgorICAgICoKKyAgICAqIHdoZW4gcHJvYmluZyAgaXAuZHN0ID09IGxsaXBhZGRyICYmIGh3LnNyYyAhPSBuZXRpZi0+aHdhZGRyCisgICAgKiB3ZSBoYXZlIGEgY29uZmxpY3QgYW5kIG11c3Qgc29sdmUgaXQKKyAgICAqLworICAgIGlwX2FkZHJfdCBzaXBhZGRyLCBkaXBhZGRyOworICAgIHN0cnVjdCBldGhfYWRkciBuZXRpZmFkZHI7CisgICAgRVRIQUREUjE2X0NPUFkobmV0aWZhZGRyLmFkZHIsIG5ldGlmLT5od2FkZHIpOworCisgICAgLyogQ29weSBzdHJ1Y3QgaXBfYWRkcjIgdG8gYWxpZ25lZCBpcF9hZGRyLCB0byBzdXBwb3J0IGNvbXBpbGVycyB3aXRob3V0CisgICAgICogc3RydWN0dXJlIHBhY2tpbmcgKG5vdCB1c2luZyBzdHJ1Y3R1cmUgY29weSB3aGljaCBicmVha3Mgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzKS4KKyAgICAgKi8KKyAgICBJUEFERFIyX0NPUFkoJnNpcGFkZHIsICZoZHItPnNpcGFkZHIpOworICAgIElQQUREUjJfQ09QWSgmZGlwYWRkciwgJmhkci0+ZGlwYWRkcik7CisgICAgICAKKyAgICBpZiAoKG5ldGlmLT5hdXRvaXAtPnN0YXRlID09IEFVVE9JUF9TVEFURV9QUk9CSU5HKSB8fAorICAgICAgICAoKG5ldGlmLT5hdXRvaXAtPnN0YXRlID09IEFVVE9JUF9TVEFURV9BTk5PVU5DSU5HKSAmJgorICAgICAgICAgKG5ldGlmLT5hdXRvaXAtPnNlbnRfbnVtID09IDApKSkgeworICAgICAvKiBSRkMgMzkyNyBTZWN0aW9uIDIuMi4xOgorICAgICAgKiBmcm9tIGJlZ2lubmluZyB0byBhZnRlciBBTk5PVU5DRV9XQUlUCisgICAgICAqIHNlY29uZHMgd2UgaGF2ZSBhIGNvbmZsaWN0IGlmCisgICAgICAqIGlwLnNyYyA9PSBsbGlwYWRkciBPUgorICAgICAgKiBpcC5kc3QgPT0gbGxpcGFkZHIgJiYgaHcuc3JjICE9IG93biBod2FkZHIKKyAgICAgICovCisgICAgICBpZiAoKGlwX2FkZHJfY21wKCZzaXBhZGRyLCAmbmV0aWYtPmF1dG9pcC0+bGxpcGFkZHIpKSB8fAorICAgICAgICAgIChpcF9hZGRyX2NtcCgmZGlwYWRkciwgJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyKSAmJgorICAgICAgICAgICAhZXRoX2FkZHJfY21wKCZuZXRpZmFkZHIsICZoZHItPnNod2FkZHIpKSkgeworICAgICAgICBMV0lQX0RFQlVHRihBVVRPSVBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywKKyAgICAgICAgICAoImF1dG9pcF9hcnBfcmVwbHkoKTogUHJvYmUgQ29uZmxpY3QgZGV0ZWN0ZWRcbiIpKTsKKyAgICAgICAgYXV0b2lwX3Jlc3RhcnQobmV0aWYpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgIC8qIFJGQyAzOTI3IFNlY3Rpb24gMi41OgorICAgICAgKiBpbiBhbnkgc3RhdGUgd2UgaGF2ZSBhIGNvbmZsaWN0IGlmCisgICAgICAqIGlwLnNyYyA9PSBsbGlwYWRkciAmJiBody5zcmMgIT0gb3duIGh3YWRkcgorICAgICAgKi8KKyAgICAgIGlmIChpcF9hZGRyX2NtcCgmc2lwYWRkciwgJm5ldGlmLT5hdXRvaXAtPmxsaXBhZGRyKSAmJgorICAgICAgICAgICFldGhfYWRkcl9jbXAoJm5ldGlmYWRkciwgJmhkci0+c2h3YWRkcikpIHsKKyAgICAgICAgTFdJUF9ERUJVR0YoQVVUT0lQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSB8IExXSVBfREJHX0xFVkVMX1dBUk5JTkcsCisgICAgICAgICAgKCJhdXRvaXBfYXJwX3JlcGx5KCk6IENvbmZsaWN0aW5nIEFSUC1QYWNrZXQgZGV0ZWN0ZWRcbiIpKTsKKyAgICAgICAgYXV0b2lwX2hhbmRsZV9hcnBfY29uZmxpY3QobmV0aWYpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjZW5kaWYgLyogTFdJUF9BVVRPSVAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS9pcHY0L2ljbXAuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS9pcHY0L2ljbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjkwMmE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaWNtcC5jCkBAIC0wLDAgKzEsMzM1IEBACisvKioKKyAqIEBmaWxlCisgKiBJQ01QIC0gSW50ZXJuZXQgQ29udHJvbCBNZXNzYWdlIFByb3RvY29sCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworCisvKiBTb21lIElDTVAgbWVzc2FnZXMgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgdHJhbnNwb3J0IHByb3RvY29scy4gVGhpcworICAgaXMgbm90IGltcGxlbWVudGVkLiAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfSUNNUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvaWNtcC5oIgorI2luY2x1ZGUgImx3aXAvaW5ldF9jaGtzdW0uaCIKKyNpbmNsdWRlICJsd2lwL2lwLmgiCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL3N0YXRzLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqIFNtYWxsIG9wdGltaXphdGlvbjogc2V0IHRvIDAgaWYgaW5jb21pbmcgUEJVRl9QT09MIHBidWYgYWx3YXlzIGNhbiBiZQorICogdXNlZCB0byBtb2RpZnkgYW5kIHNlbmQgYSByZXNwb25zZSBwYWNrZXQgKGFuZCB0byAxIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLAorICogZS5nLiB3aGVuIGxpbmsgaGVhZGVyIGlzIHN0cmlwcGVkIG9mIHdoZW4gcmVjZWl2aW5nKSAqLworI2lmbmRlZiBMV0lQX0lDTVBfRUNIT19DSEVDS19JTlBVVF9QQlVGX0xFTgorI2RlZmluZSBMV0lQX0lDTVBfRUNIT19DSEVDS19JTlBVVF9QQlVGX0xFTiAxCisjZW5kaWYgLyogTFdJUF9JQ01QX0VDSE9fQ0hFQ0tfSU5QVVRfUEJVRl9MRU4gKi8KKworLyogVGhlIGFtb3VudCBvZiBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIHBhY2tldCB0byByZXR1cm4gaW4gYSBkZXN0LXVucmVhY2hhYmxlICovCisjZGVmaW5lIElDTVBfREVTVF9VTlJFQUNIX0RBVEFTSVpFIDgKKworc3RhdGljIHZvaWQgaWNtcF9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBwYnVmICpwLCB1OF90IHR5cGUsIHU4X3QgY29kZSk7CisKKy8qKgorICogUHJvY2Vzc2VzIElDTVAgaW5wdXQgcGFja2V0cywgY2FsbGVkIGZyb20gaXBfaW5wdXQoKS4KKyAqCisgKiBDdXJyZW50bHkgb25seSBwcm9jZXNzZXMgaWNtcCBlY2hvIHJlcXVlc3RzIGFuZCBzZW5kcworICogb3V0IHRoZSBlY2hvIHJlc3BvbnNlLgorICoKKyAqIEBwYXJhbSBwIHRoZSBpY21wIGVjaG8gcmVxdWVzdCBwYWNrZXQsIHAtPnBheWxvYWQgcG9pbnRpbmcgdG8gdGhlIGlwIGhlYWRlcgorICogQHBhcmFtIGlucCB0aGUgbmV0aWYgb24gd2hpY2ggdGhpcyBwYWNrZXQgd2FzIHJlY2VpdmVkCisgKi8KK3ZvaWQKK2ljbXBfaW5wdXQoc3RydWN0IHBidWYgKnAsIHN0cnVjdCBuZXRpZiAqaW5wKQoreworICB1OF90IHR5cGU7CisjaWZkZWYgTFdJUF9ERUJVRworICB1OF90IGNvZGU7CisjZW5kaWYgLyogTFdJUF9ERUJVRyAqLworICBzdHJ1Y3QgaWNtcF9lY2hvX2hkciAqaWVjaG87CisgIHN0cnVjdCBpcF9oZHIgKmlwaGRyOworICBzMTZfdCBobGVuOworCisgIElDTVBfU1RBVFNfSU5DKGljbXAucmVjdik7CisgIHNubXBfaW5jX2ljbXBpbm1zZ3MoKTsKKworCisgIGlwaGRyID0gKHN0cnVjdCBpcF9oZHIgKilwLT5wYXlsb2FkOworICBobGVuID0gSVBIX0hMKGlwaGRyKSAqIDQ7CisgIGlmIChwYnVmX2hlYWRlcihwLCAtaGxlbikgfHwgKHAtPnRvdF9sZW4gPCBzaXplb2YodTE2X3QpKjIpKSB7CisgICAgTFdJUF9ERUJVR0YoSUNNUF9ERUJVRywgKCJpY21wX2lucHV0OiBzaG9ydCBJQ01QICglIlUxNl9GIiBieXRlcykgcmVjZWl2ZWRcbiIsIHAtPnRvdF9sZW4pKTsKKyAgICBnb3RvIGxlbmVycjsKKyAgfQorCisgIHR5cGUgPSAqKCh1OF90ICopcC0+cGF5bG9hZCk7CisjaWZkZWYgTFdJUF9ERUJVRworICBjb2RlID0gKigoKHU4X3QgKilwLT5wYXlsb2FkKSsxKTsKKyNlbmRpZiAvKiBMV0lQX0RFQlVHICovCisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIElDTVBfRVI6CisgICAgLyogVGhpcyBpcyBPSywgZWNobyByZXBseSBtaWdodCBoYXZlIGJlZW4gcGFyc2VkIGJ5IGEgcmF3IFBDQgorICAgICAgIChhcyBvYnZpb3VzbHksIGFuIGVjaG8gcmVxdWVzdCBoYXMgYmVlbiBzZW50LCB0b28pLiAqLworICAgIGJyZWFrOyAKKyAgY2FzZSBJQ01QX0VDSE86CisjaWYgIUxXSVBfTVVMVElDQVNUX1BJTkcgfHwgIUxXSVBfQlJPQURDQVNUX1BJTkcKKyAgICB7CisgICAgICBpbnQgYWNjZXB0ZWQgPSAxOworI2lmICFMV0lQX01VTFRJQ0FTVF9QSU5HCisgICAgICAvKiBtdWx0aWNhc3QgZGVzdGluYXRpb24gYWRkcmVzcz8gKi8KKyAgICAgIGlmIChpcF9hZGRyX2lzbXVsdGljYXN0KCZjdXJyZW50X2lwaGRyX2Rlc3QpKSB7CisgICAgICAgIGFjY2VwdGVkID0gMDsKKyAgICAgIH0KKyNlbmRpZiAvKiBMV0lQX01VTFRJQ0FTVF9QSU5HICovCisjaWYgIUxXSVBfQlJPQURDQVNUX1BJTkcKKyAgICAgIC8qIGJyb2FkY2FzdCBkZXN0aW5hdGlvbiBhZGRyZXNzPyAqLworICAgICAgaWYgKGlwX2FkZHJfaXNicm9hZGNhc3QoJmN1cnJlbnRfaXBoZHJfZGVzdCwgaW5wKSkgeworICAgICAgICBhY2NlcHRlZCA9IDA7CisgICAgICB9CisjZW5kaWYgLyogTFdJUF9CUk9BRENBU1RfUElORyAqLworICAgICAgLyogYnJvYWRjYXN0IG9yIG11bHRpY2FzdCBkZXN0aW5hdGlvbiBhZGRyZXNzIG5vdCBhY2NlcHRkPyAqLworICAgICAgaWYgKCFhY2NlcHRlZCkgeworICAgICAgICBMV0lQX0RFQlVHRihJQ01QX0RFQlVHLCAoImljbXBfaW5wdXQ6IE5vdCBlY2hvaW5nIHRvIG11bHRpY2FzdCBvciBicm9hZGNhc3QgcGluZ3NcbiIpKTsKKyAgICAgICAgSUNNUF9TVEFUU19JTkMoaWNtcC5lcnIpOworICAgICAgICBwYnVmX2ZyZWUocCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogIUxXSVBfTVVMVElDQVNUX1BJTkcgfHwgIUxXSVBfQlJPQURDQVNUX1BJTkcgKi8KKyAgICBMV0lQX0RFQlVHRihJQ01QX0RFQlVHLCAoImljbXBfaW5wdXQ6IHBpbmdcbiIpKTsKKyAgICBpZiAocC0+dG90X2xlbiA8IHNpemVvZihzdHJ1Y3QgaWNtcF9lY2hvX2hkcikpIHsKKyAgICAgIExXSVBfREVCVUdGKElDTVBfREVCVUcsICgiaWNtcF9pbnB1dDogYmFkIElDTVAgZWNobyByZWNlaXZlZFxuIikpOworICAgICAgZ290byBsZW5lcnI7CisgICAgfQorICAgIGlmIChpbmV0X2Noa3N1bV9wYnVmKHApICE9IDApIHsKKyAgICAgIExXSVBfREVCVUdGKElDTVBfREVCVUcsICgiaWNtcF9pbnB1dDogY2hlY2tzdW0gZmFpbGVkIGZvciByZWNlaXZlZCBJQ01QIGVjaG9cbiIpKTsKKyAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgIElDTVBfU1RBVFNfSU5DKGljbXAuY2hrZXJyKTsKKyAgICAgIHNubXBfaW5jX2ljbXBpbmVycm9ycygpOworICAgICAgcmV0dXJuOworICAgIH0KKyNpZiBMV0lQX0lDTVBfRUNIT19DSEVDS19JTlBVVF9QQlVGX0xFTgorICAgIGlmIChwYnVmX2hlYWRlcihwLCAoUEJVRl9JUF9ITEVOICsgUEJVRl9MSU5LX0hMRU4pKSkgeworICAgICAgLyogcCBpcyBub3QgYmlnIGVub3VnaCB0byBjb250YWluIGxpbmsgaGVhZGVycworICAgICAgICogYWxsb2NhdGUgYSBuZXcgb25lIGFuZCBjb3B5IHAgaW50byBpdAorICAgICAgICovCisgICAgICBzdHJ1Y3QgcGJ1ZiAqcjsKKyAgICAgIC8qIHN3aXRjaCBwLT5wYXlsb2FkIHRvIGlwIGhlYWRlciAqLworICAgICAgaWYgKHBidWZfaGVhZGVyKHAsIGhsZW4pKSB7CisgICAgICAgIExXSVBfQVNTRVJUKCJpY21wX2lucHV0OiBtb3ZpbmcgcC0+cGF5bG9hZCB0byBpcCBoZWFkZXIgZmFpbGVkXG4iLCAwKTsKKyAgICAgICAgZ290byBtZW1lcnI7CisgICAgICB9CisgICAgICAvKiBhbGxvY2F0ZSBuZXcgcGFja2V0IGJ1ZmZlciB3aXRoIHNwYWNlIGZvciBsaW5rIGhlYWRlcnMgKi8KKyAgICAgIHIgPSBwYnVmX2FsbG9jKFBCVUZfTElOSywgcC0+dG90X2xlbiwgUEJVRl9SQU0pOworICAgICAgaWYgKHIgPT0gTlVMTCkgeworICAgICAgICBMV0lQX0RFQlVHRihJQ01QX0RFQlVHLCAoImljbXBfaW5wdXQ6IGFsbG9jYXRpbmcgbmV3IHBidWYgZmFpbGVkXG4iKSk7CisgICAgICAgIGdvdG8gbWVtZXJyOworICAgICAgfQorICAgICAgTFdJUF9BU1NFUlQoImNoZWNrIHRoYXQgZmlyc3QgcGJ1ZiBjYW4gaG9sZCBzdHJ1Y3QgdGhlIElDTVAgaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgIChyLT5sZW4gPj0gaGxlbiArIHNpemVvZihzdHJ1Y3QgaWNtcF9lY2hvX2hkcikpKTsKKyAgICAgIC8qIGNvcHkgdGhlIHdob2xlIHBhY2tldCBpbmNsdWRpbmcgaXAgaGVhZGVyICovCisgICAgICBpZiAocGJ1Zl9jb3B5KHIsIHApICE9IEVSUl9PSykgeworICAgICAgICBMV0lQX0FTU0VSVCgiaWNtcF9pbnB1dDogY29weWluZyB0byBuZXcgcGJ1ZiBmYWlsZWRcbiIsIDApOworICAgICAgICBnb3RvIG1lbWVycjsKKyAgICAgIH0KKyAgICAgIGlwaGRyID0gKHN0cnVjdCBpcF9oZHIgKilyLT5wYXlsb2FkOworICAgICAgLyogc3dpdGNoIHItPnBheWxvYWQgYmFjayB0byBpY21wIGhlYWRlciAqLworICAgICAgaWYgKHBidWZfaGVhZGVyKHIsIC1obGVuKSkgeworICAgICAgICBMV0lQX0FTU0VSVCgiaWNtcF9pbnB1dDogcmVzdG9yaW5nIG9yaWdpbmFsIHAtPnBheWxvYWQgZmFpbGVkXG4iLCAwKTsKKyAgICAgICAgZ290byBtZW1lcnI7CisgICAgICB9CisgICAgICAvKiBmcmVlIHRoZSBvcmlnaW5hbCBwICovCisgICAgICBwYnVmX2ZyZWUocCk7CisgICAgICAvKiB3ZSBub3cgaGF2ZSBhbiBpZGVudGljYWwgY29weSBvZiBwIHRoYXQgaGFzIHJvb20gZm9yIGxpbmsgaGVhZGVycyAqLworICAgICAgcCA9IHI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHJlc3RvcmUgcC0+cGF5bG9hZCB0byBwb2ludCB0byBpY21wIGhlYWRlciAqLworICAgICAgaWYgKHBidWZfaGVhZGVyKHAsIC0oczE2X3QpKFBCVUZfSVBfSExFTiArIFBCVUZfTElOS19ITEVOKSkpIHsKKyAgICAgICAgTFdJUF9BU1NFUlQoImljbXBfaW5wdXQ6IHJlc3RvcmluZyBvcmlnaW5hbCBwLT5wYXlsb2FkIGZhaWxlZFxuIiwgMCk7CisgICAgICAgIGdvdG8gbWVtZXJyOworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBMV0lQX0lDTVBfRUNIT19DSEVDS19JTlBVVF9QQlVGX0xFTiAqLworICAgIC8qIEF0IHRoaXMgcG9pbnQsIGFsbCBjaGVja3MgYXJlIE9LLiAqLworICAgIC8qIFdlIGdlbmVyYXRlIGFuIGFuc3dlciBieSBzd2l0Y2hpbmcgdGhlIGRlc3QgYW5kIHNyYyBpcCBhZGRyZXNzZXMsCisgICAgICogc2V0dGluZyB0aGUgaWNtcCB0eXBlIHRvIEVDSE9fUkVTUE9OU0UgYW5kIHVwZGF0aW5nIHRoZSBjaGVja3N1bS4gKi8KKyAgICBpZWNobyA9IChzdHJ1Y3QgaWNtcF9lY2hvX2hkciAqKXAtPnBheWxvYWQ7CisgICAgaXBfYWRkcl9jb3B5KGlwaGRyLT5zcmMsICppcF9jdXJyZW50X2Rlc3RfYWRkcigpKTsKKyAgICBpcF9hZGRyX2NvcHkoaXBoZHItPmRlc3QsICppcF9jdXJyZW50X3NyY19hZGRyKCkpOworICAgIElDTVBIX1RZUEVfU0VUKGllY2hvLCBJQ01QX0VSKTsKKyAgICAvKiBhZGp1c3QgdGhlIGNoZWNrc3VtICovCisgICAgaWYgKGllY2hvLT5jaGtzdW0gPj0gUFBfSFRPTlMoMHhmZmZmVSAtIChJQ01QX0VDSE8gPDwgOCkpKSB7CisgICAgICBpZWNoby0+Y2hrc3VtICs9IFBQX0hUT05TKElDTVBfRUNITyA8PCA4KSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGllY2hvLT5jaGtzdW0gKz0gUFBfSFRPTlMoSUNNUF9FQ0hPIDw8IDgpOworICAgIH0KKworICAgIC8qIFNldCB0aGUgY29ycmVjdCBUVEwgYW5kIHJlY2FsY3VsYXRlIHRoZSBoZWFkZXIgY2hlY2tzdW0uICovCisgICAgSVBIX1RUTF9TRVQoaXBoZHIsIElDTVBfVFRMKTsKKyAgICBJUEhfQ0hLU1VNX1NFVChpcGhkciwgMCk7CisjaWYgQ0hFQ0tTVU1fR0VOX0lQCisgICAgSVBIX0NIS1NVTV9TRVQoaXBoZHIsIGluZXRfY2hrc3VtKGlwaGRyLCBJUF9ITEVOKSk7CisjZW5kaWYgLyogQ0hFQ0tTVU1fR0VOX0lQICovCisKKyAgICBJQ01QX1NUQVRTX0lOQyhpY21wLnhtaXQpOworICAgIC8qIGluY3JlYXNlIG51bWJlciBvZiBtZXNzYWdlcyBhdHRlbXB0ZWQgdG8gc2VuZCAqLworICAgIHNubXBfaW5jX2ljbXBvdXRtc2dzKCk7CisgICAgLyogaW5jcmVhc2UgbnVtYmVyIG9mIGVjaG8gcmVwbGllcyBhdHRlbXB0ZWQgdG8gc2VuZCAqLworICAgIHNubXBfaW5jX2ljbXBvdXRlY2hvcmVwcygpOworCisgICAgaWYocGJ1Zl9oZWFkZXIocCwgaGxlbikpIHsKKyAgICAgIExXSVBfQVNTRVJUKCJDYW4ndCBtb3ZlIG92ZXIgaGVhZGVyIGluIHBhY2tldCIsIDApOworICAgIH0gZWxzZSB7CisgICAgICBlcnJfdCByZXQ7CisgICAgICAvKiBzZW5kIGFuIElDTVAgcGFja2V0LCBzcmMgYWRkciBpcyB0aGUgZGVzdCBhZGRyIG9mIHRoZSBjdXJyZW4gcGFja2V0ICovCisgICAgICByZXQgPSBpcF9vdXRwdXRfaWYocCwgaXBfY3VycmVudF9kZXN0X2FkZHIoKSwgSVBfSERSSU5DTCwKKyAgICAgICAgICAgICAgICAgICBJQ01QX1RUTCwgMCwgSVBfUFJPVE9fSUNNUCwgaW5wKTsKKyAgICAgIGlmIChyZXQgIT0gRVJSX09LKSB7CisgICAgICAgIExXSVBfREVCVUdGKElDTVBfREVCVUcsICgiaWNtcF9pbnB1dDogaXBfb3V0cHV0X2lmIHJldHVybmVkIGFuIGVycm9yOiAlYy5cbiIsIHJldCkpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBMV0lQX0RFQlVHRihJQ01QX0RFQlVHLCAoImljbXBfaW5wdXQ6IElDTVAgdHlwZSAlIlMxNl9GIiBjb2RlICUiUzE2X0YiIG5vdCBzdXBwb3J0ZWQuXG4iLCAKKyAgICAgICAgICAgICAgICAoczE2X3QpdHlwZSwgKHMxNl90KWNvZGUpKTsKKyAgICBJQ01QX1NUQVRTX0lOQyhpY21wLnByb3RlcnIpOworICAgIElDTVBfU1RBVFNfSU5DKGljbXAuZHJvcCk7CisgIH0KKyAgcGJ1Zl9mcmVlKHApOworICByZXR1cm47CitsZW5lcnI6CisgIHBidWZfZnJlZShwKTsKKyAgSUNNUF9TVEFUU19JTkMoaWNtcC5sZW5lcnIpOworICBzbm1wX2luY19pY21waW5lcnJvcnMoKTsKKyAgcmV0dXJuOworI2lmIExXSVBfSUNNUF9FQ0hPX0NIRUNLX0lOUFVUX1BCVUZfTEVOCittZW1lcnI6CisgIHBidWZfZnJlZShwKTsKKyAgSUNNUF9TVEFUU19JTkMoaWNtcC5lcnIpOworICBzbm1wX2luY19pY21waW5lcnJvcnMoKTsKKyAgcmV0dXJuOworI2VuZGlmIC8qIExXSVBfSUNNUF9FQ0hPX0NIRUNLX0lOUFVUX1BCVUZfTEVOICovCit9CisKKy8qKgorICogU2VuZCBhbiBpY21wICdkZXN0aW5hdGlvbiB1bnJlYWNoYWJsZScgcGFja2V0LCBjYWxsZWQgZnJvbSBpcF9pbnB1dCgpIGlmCisgKiB0aGUgdHJhbnNwb3J0IGxheWVyIHByb3RvY29sIGlzIHVua25vd24gYW5kIGZyb20gdWRwX2lucHV0KCkgaWYgdGhlIGxvY2FsCisgKiBwb3J0IGlzIG5vdCBib3VuZC4KKyAqCisgKiBAcGFyYW0gcCB0aGUgaW5wdXQgcGFja2V0IGZvciB3aGljaCB0aGUgJ3VucmVhY2hhYmxlJyBzaG91bGQgYmUgc2VudCwKKyAqICAgICAgICAgIHAtPnBheWxvYWQgcG9pbnRpbmcgdG8gdGhlIElQIGhlYWRlcgorICogQHBhcmFtIHQgdHlwZSBvZiB0aGUgJ3VucmVhY2hhYmxlJyBwYWNrZXQKKyAqLwordm9pZAoraWNtcF9kZXN0X3VucmVhY2goc3RydWN0IHBidWYgKnAsIGVudW0gaWNtcF9kdXJfdHlwZSB0KQoreworICBpY21wX3NlbmRfcmVzcG9uc2UocCwgSUNNUF9EVVIsIHQpOworfQorCisjaWYgSVBfRk9SV0FSRCB8fCBJUF9SRUFTU0VNQkxZCisvKioKKyAqIFNlbmQgYSAndGltZSBleGNlZWRlZCcgcGFja2V0LCBjYWxsZWQgZnJvbSBpcF9mb3J3YXJkKCkgaWYgVFRMIGlzIDAuCisgKgorICogQHBhcmFtIHAgdGhlIGlucHV0IHBhY2tldCBmb3Igd2hpY2ggdGhlICd0aW1lIGV4Y2VlZGVkJyBzaG91bGQgYmUgc2VudCwKKyAqICAgICAgICAgIHAtPnBheWxvYWQgcG9pbnRpbmcgdG8gdGhlIElQIGhlYWRlcgorICogQHBhcmFtIHQgdHlwZSBvZiB0aGUgJ3RpbWUgZXhjZWVkZWQnIHBhY2tldAorICovCit2b2lkCitpY21wX3RpbWVfZXhjZWVkZWQoc3RydWN0IHBidWYgKnAsIGVudW0gaWNtcF90ZV90eXBlIHQpCit7CisgIGljbXBfc2VuZF9yZXNwb25zZShwLCBJQ01QX1RFLCB0KTsKK30KKworI2VuZGlmIC8qIElQX0ZPUldBUkQgfHwgSVBfUkVBU1NFTUJMWSAqLworCisvKioKKyAqIFNlbmQgYW4gaWNtcCBwYWNrZXQgaW4gcmVzcG9uc2UgdG8gYW4gaW5jb21pbmcgcGFja2V0LgorICoKKyAqIEBwYXJhbSBwIHRoZSBpbnB1dCBwYWNrZXQgZm9yIHdoaWNoIHRoZSAndW5yZWFjaGFibGUnIHNob3VsZCBiZSBzZW50LAorICogICAgICAgICAgcC0+cGF5bG9hZCBwb2ludGluZyB0byB0aGUgSVAgaGVhZGVyCisgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIHRoZSBJQ01QIGhlYWRlcgorICogQHBhcmFtIGNvZGUgQ29kZSBvZiB0aGUgSUNNUCBoZWFkZXIKKyAqLworc3RhdGljIHZvaWQKK2ljbXBfc2VuZF9yZXNwb25zZShzdHJ1Y3QgcGJ1ZiAqcCwgdThfdCB0eXBlLCB1OF90IGNvZGUpCit7CisgIHN0cnVjdCBwYnVmICpxOworICBzdHJ1Y3QgaXBfaGRyICppcGhkcjsKKyAgLyogd2UgY2FuIHVzZSB0aGUgZWNobyBoZWFkZXIgaGVyZSAqLworICBzdHJ1Y3QgaWNtcF9lY2hvX2hkciAqaWNtcGhkcjsKKyAgaXBfYWRkcl90IGlwaGRyX3NyYzsKKworICAvKiBJQ01QIGhlYWRlciArIElQIGhlYWRlciArIDggYnl0ZXMgb2YgZGF0YSAqLworICBxID0gcGJ1Zl9hbGxvYyhQQlVGX0lQLCBzaXplb2Yoc3RydWN0IGljbXBfZWNob19oZHIpICsgSVBfSExFTiArIElDTVBfREVTVF9VTlJFQUNIX0RBVEFTSVpFLAorICAgICAgICAgICAgICAgICBQQlVGX1JBTSk7CisgIGlmIChxID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihJQ01QX0RFQlVHLCAoImljbXBfdGltZV9leGNlZWRlZDogZmFpbGVkIHRvIGFsbG9jYXRlIHBidWYgZm9yIElDTVAgcGFja2V0LlxuIikpOworICAgIHJldHVybjsKKyAgfQorICBMV0lQX0FTU0VSVCgiY2hlY2sgdGhhdCBmaXJzdCBwYnVmIGNhbiBob2xkIGljbXAgbWVzc2FnZSIsCisgICAgICAgICAgICAgKHEtPmxlbiA+PSAoc2l6ZW9mKHN0cnVjdCBpY21wX2VjaG9faGRyKSArIElQX0hMRU4gKyBJQ01QX0RFU1RfVU5SRUFDSF9EQVRBU0laRSkpKTsKKworICBpcGhkciA9IChzdHJ1Y3QgaXBfaGRyICopcC0+cGF5bG9hZDsKKyAgTFdJUF9ERUJVR0YoSUNNUF9ERUJVRywgKCJpY21wX3RpbWVfZXhjZWVkZWQgZnJvbSAiKSk7CisgIGlwX2FkZHJfZGVidWdfcHJpbnQoSUNNUF9ERUJVRywgJihpcGhkci0+c3JjKSk7CisgIExXSVBfREVCVUdGKElDTVBfREVCVUcsICgiIHRvICIpKTsKKyAgaXBfYWRkcl9kZWJ1Z19wcmludChJQ01QX0RFQlVHLCAmKGlwaGRyLT5kZXN0KSk7CisgIExXSVBfREVCVUdGKElDTVBfREVCVUcsICgiXG4iKSk7CisKKyAgaWNtcGhkciA9IChzdHJ1Y3QgaWNtcF9lY2hvX2hkciAqKXEtPnBheWxvYWQ7CisgIGljbXBoZHItPnR5cGUgPSB0eXBlOworICBpY21waGRyLT5jb2RlID0gY29kZTsKKyAgaWNtcGhkci0+aWQgPSAwOworICBpY21waGRyLT5zZXFubyA9IDA7CisKKyAgLyogY29weSBmaWVsZHMgZnJvbSBvcmlnaW5hbCBwYWNrZXQgKi8KKyAgU01FTUNQWSgodThfdCAqKXEtPnBheWxvYWQgKyBzaXplb2Yoc3RydWN0IGljbXBfZWNob19oZHIpLCAodThfdCAqKXAtPnBheWxvYWQsCisgICAgICAgICAgSVBfSExFTiArIElDTVBfREVTVF9VTlJFQUNIX0RBVEFTSVpFKTsKKworICAvKiBjYWxjdWxhdGUgY2hlY2tzdW0gKi8KKyAgaWNtcGhkci0+Y2hrc3VtID0gMDsKKyAgaWNtcGhkci0+Y2hrc3VtID0gaW5ldF9jaGtzdW0oaWNtcGhkciwgcS0+bGVuKTsKKyAgSUNNUF9TVEFUU19JTkMoaWNtcC54bWl0KTsKKyAgLyogaW5jcmVhc2UgbnVtYmVyIG9mIG1lc3NhZ2VzIGF0dGVtcHRlZCB0byBzZW5kICovCisgIHNubXBfaW5jX2ljbXBvdXRtc2dzKCk7CisgIC8qIGluY3JlYXNlIG51bWJlciBvZiBkZXN0aW5hdGlvbiB1bnJlYWNoYWJsZSBtZXNzYWdlcyBhdHRlbXB0ZWQgdG8gc2VuZCAqLworICBzbm1wX2luY19pY21wb3V0dGltZWV4Y2RzKCk7CisgIGlwX2FkZHJfY29weShpcGhkcl9zcmMsIGlwaGRyLT5zcmMpOworICBpcF9vdXRwdXQocSwgTlVMTCwgJmlwaGRyX3NyYywgSUNNUF9UVEwsIDAsIElQX1BST1RPX0lDTVApOworICBwYnVmX2ZyZWUocSk7Cit9CisKKyNlbmRpZiAvKiBMV0lQX0lDTVAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS9pcHY0L2lnbXAuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS9pcHY0L2lnbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQ0MDVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaWdtcC5jCkBAIC0wLDAgKzEsODE3IEBACisvKioKKyAqIEBmaWxlCisgKiBJR01QIC0gSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbAorICoKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIENJVEVMIFRlY2hub2xvZ2llcyBMdGQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKKyAqIGFyZSBtZXQ6IAorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIAorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIENJVEVMIFRlY2hub2xvZ2llcyBMdGQgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIAorICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIAorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQ0lURUwgVEVDSE5PTE9HSUVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIENJVEVMIFRFQ0hOT0xPR0lFUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIAorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyAKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSAKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgCisgKiBTVUNIIERBTUFHRS4gCisgKgorICogVGhpcyBmaWxlIGlzIGEgY29udHJpYnV0aW9uIHRvIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIFRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlIGFuZCBBZGFtIER1bmtlbHMKKyAqIGFyZSBzcGVjaWZpY2FsbHkgZ3JhbnRlZCBwZXJtaXNzaW9uIHRvIHJlZGlzdHJpYnV0ZSB0aGlzCisgKiBzb3VyY2UgY29kZS4KKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTm90ZSAxKQorQWx0aG91Z2ggdGhlIHJmYyByZXF1aXJlcyBWMSBBTkQgVjIgY2FwYWJpbGl0eQord2Ugd2lsbCBvbmx5IHN1cHBvcnQgdjIgc2luY2Ugbm93IFYxIGlzIHZlcnkgb2xkIChBdWd1c3QgMTk4OSkKK1YxIGNhbiBiZSBhZGRlZCBpZiByZXF1aXJlZAorCithIGRlYnVnIHByaW50IGFuZCBzdGF0aXN0aWMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIHRvCitzaG93IHRoaXMgdXAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitOb3RlIDIpCitBIHF1ZXJ5IGZvciBhIHNwZWNpZmljIGdyb3VwIGFkZHJlc3MgKGFzIG9wcG9zZWQgdG8gQUxMSE9TVFMpCitoYXMgbm93IGJlZW4gaW1wbGVtZW50ZWQgYXMgSSBhbSB1bnN1cmUgaWYgaXQgaXMgcmVxdWlyZWQKKworYSBkZWJ1ZyBwcmludCBhbmQgc3RhdGlzdGljIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCB0bworc2hvdyB0aGlzIHVwLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTm90ZSAzKQorVGhlIHJvdXRlciBhbGVydCByZmMgMjExMyBpcyBpbXBsZW1lbnRlZCBpbiBvdXRnb2luZyBwYWNrZXRzCitidXQgbm90IGNoZWNrZWQgcmlnb3JvdXNseSBpbmNvbWluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU3RldmUgUmV5bm9sZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJGQyA5ODggIC0gSG9zdCBleHRlbnNpb25zIGZvciBJUCBtdWx0aWNhc3RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgLSBWMAorICogUkZDIDEwNTQgLSBIb3N0IGV4dGVuc2lvbnMgZm9yIElQIG11bHRpY2FzdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAtCisgKiBSRkMgMTExMiAtIEhvc3QgZXh0ZW5zaW9ucyBmb3IgSVAgbXVsdGljYXN0aW5nICAgICAgICAgICAgICAgICAgICAgICAgIC0gVjEKKyAqIFJGQyAyMjM2IC0gSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbCwgVmVyc2lvbiAyICAgICAgICAgICAgICAgLSBWMiAgPC0gdGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoaXMgUkZDIChpdCdzIHRoZSAiZGUgZmFjdG8iIHN0YW5kYXJkKQorICogUkZDIDMzNzYgLSBJbnRlcm5ldCBHcm91cCBNYW5hZ2VtZW50IFByb3RvY29sLCBWZXJzaW9uIDMgICAgICAgICAgICAgICAtIFYzCisgKiBSRkMgNDYwNCAtIFVzaW5nIEludGVybmV0IEdyb3VwIE1hbmFnZW1lbnQgUHJvdG9jb2wgVmVyc2lvbiAzLi4uICAgICAgIC0gVjMrCisgKiBSRkMgMjExMyAtIElQIFJvdXRlciBBbGVydCBPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX0lHTVAgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL2lnbXAuaCIKKyNpbmNsdWRlICJsd2lwL2RlYnVnLmgiCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL21lbS5oIgorI2luY2x1ZGUgImx3aXAvaXAuaCIKKyNpbmNsdWRlICJsd2lwL2luZXRfY2hrc3VtLmgiCisjaW5jbHVkZSAibHdpcC9uZXRpZi5oIgorI2luY2x1ZGUgImx3aXAvaWNtcC5oIgorI2luY2x1ZGUgImx3aXAvdWRwLmgiCisjaW5jbHVkZSAibHdpcC90Y3AuaCIKKyNpbmNsdWRlICJsd2lwL3N0YXRzLmgiCisKKyNpbmNsdWRlICJzdHJpbmcuaCIKKworLyogCisgKiBJR01QIGNvbnN0YW50cworICovCisjZGVmaW5lIElHTVBfVFRMICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElHTVBfTUlOTEVOICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFJPVVRFUl9BTEVSVCAgICAgICAgICAgICAgICAgICAweDk0MDRVCisjZGVmaW5lIFJPVVRFUl9BTEVSVExFTiAgICAgICAgICAgICAgICA0CisKKy8qCisgKiBJR01QIG1lc3NhZ2UgdHlwZXMsIGluY2x1ZGluZyB2ZXJzaW9uIG51bWJlci4KKyAqLworI2RlZmluZSBJR01QX01FTUJfUVVFUlkgICAgICAgICAgICAgICAgMHgxMSAvKiBNZW1iZXJzaGlwIHF1ZXJ5ICAgICAgICAgKi8KKyNkZWZpbmUgSUdNUF9WMV9NRU1CX1JFUE9SVCAgICAgICAgICAgIDB4MTIgLyogVmVyLiAxIG1lbWJlcnNoaXAgcmVwb3J0ICovCisjZGVmaW5lIElHTVBfVjJfTUVNQl9SRVBPUlQgICAgICAgICAgICAweDE2IC8qIFZlci4gMiBtZW1iZXJzaGlwIHJlcG9ydCAqLworI2RlZmluZSBJR01QX0xFQVZFX0dST1VQICAgICAgICAgICAgICAgMHgxNyAvKiBMZWF2ZS1ncm91cCBtZXNzYWdlICAgICAgKi8KKworLyogR3JvdXAgIG1lbWJlcnNoaXAgc3RhdGVzICovCisjZGVmaW5lIElHTVBfR1JPVVBfTk9OX01FTUJFUiAgICAgICAgICAwCisjZGVmaW5lIElHTVBfR1JPVVBfREVMQVlJTkdfTUVNQkVSICAgICAxCisjZGVmaW5lIElHTVBfR1JPVVBfSURMRV9NRU1CRVIgICAgICAgICAyCisKKy8qKgorICogSUdNUCBwYWNrZXQgZm9ybWF0LgorICovCisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Jwc3RydWN0LmgiCisjZW5kaWYKK1BBQ0tfU1RSVUNUX0JFR0lOCitzdHJ1Y3QgaWdtcF9tc2cgeworIFBBQ0tfU1RSVUNUX0ZJRUxEKHU4X3QgICAgICAgICAgIGlnbXBfbXNndHlwZSk7CisgUEFDS19TVFJVQ1RfRklFTEQodThfdCAgICAgICAgICAgaWdtcF9tYXhyZXNwKTsKKyBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCAgICAgICAgICBpZ21wX2NoZWNrc3VtKTsKKyBQQUNLX1NUUlVDVF9GSUVMRChpcF9hZGRyX3BfdCAgICBpZ21wX2dyb3VwX2FkZHJlc3MpOworfSBQQUNLX1NUUlVDVF9TVFJVQ1Q7CitQQUNLX1NUUlVDVF9FTkQKKyNpZmRlZiBQQUNLX1NUUlVDVF9VU0VfSU5DTFVERVMKKyMgIGluY2x1ZGUgImFyY2gvZXBzdHJ1Y3QuaCIKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgaWdtcF9ncm91cCAqaWdtcF9sb29rdXBfZ3JvdXAoc3RydWN0IG5ldGlmICppZnAsIGlwX2FkZHJfdCAqYWRkcik7CitzdGF0aWMgZXJyX3QgIGlnbXBfcmVtb3ZlX2dyb3VwKHN0cnVjdCBpZ21wX2dyb3VwICpncm91cCk7CitzdGF0aWMgdm9pZCAgIGlnbXBfdGltZW91dCggc3RydWN0IGlnbXBfZ3JvdXAgKmdyb3VwKTsKK3N0YXRpYyB2b2lkICAgaWdtcF9zdGFydF90aW1lcihzdHJ1Y3QgaWdtcF9ncm91cCAqZ3JvdXAsIHU4X3QgbWF4X3RpbWUpOworc3RhdGljIHZvaWQgICBpZ21wX3N0b3BfdGltZXIoc3RydWN0IGlnbXBfZ3JvdXAgKmdyb3VwKTsKK3N0YXRpYyB2b2lkICAgaWdtcF9kZWxheWluZ19tZW1iZXIoc3RydWN0IGlnbXBfZ3JvdXAgKmdyb3VwLCB1OF90IG1heHJlc3ApOworc3RhdGljIGVycl90ICBpZ21wX2lwX291dHB1dF9pZihzdHJ1Y3QgcGJ1ZiAqcCwgaXBfYWRkcl90ICpzcmMsIGlwX2FkZHJfdCAqZGVzdCwgc3RydWN0IG5ldGlmICpuZXRpZik7CitzdGF0aWMgdm9pZCAgIGlnbXBfc2VuZChzdHJ1Y3QgaWdtcF9ncm91cCAqZ3JvdXAsIHU4X3QgdHlwZSk7CisKKworc3RhdGljIHN0cnVjdCBpZ21wX2dyb3VwKiBpZ21wX2dyb3VwX2xpc3Q7CitzdGF0aWMgaXBfYWRkcl90ICAgICBhbGxzeXN0ZW1zOworc3RhdGljIGlwX2FkZHJfdCAgICAgYWxscm91dGVyczsKKworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIElHTVAgbW9kdWxlCisgKi8KK3ZvaWQKK2lnbXBfaW5pdCh2b2lkKQoreworICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfaW5pdDogaW5pdGlhbGl6aW5nXG4iKSk7CisKKyAgSVA0X0FERFIoJmFsbHN5c3RlbXMsIDIyNCwgMCwgMCwgMSk7CisgIElQNF9BRERSKCZhbGxyb3V0ZXJzLCAyMjQsIDAsIDAsIDIpOworfQorCisjaWZkZWYgTFdJUF9ERUJVRworLyoqCisgKiBEdW1wIGdsb2JhbCBJR01QIGdyb3VwcyBsaXN0CisgKi8KK3ZvaWQKK2lnbXBfZHVtcF9ncm91cF9saXN0KCkKK3sgCisgIHN0cnVjdCBpZ21wX2dyb3VwICpncm91cCA9IGlnbXBfZ3JvdXBfbGlzdDsKKworICB3aGlsZSAoZ3JvdXAgIT0gTlVMTCkgeworICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiaWdtcF9kdW1wX2dyb3VwX2xpc3Q6IFslIlUzMl9GIl0gIiwgKHUzMl90KShncm91cC0+Z3JvdXBfc3RhdGUpKSk7CisgICAgaXBfYWRkcl9kZWJ1Z19wcmludChJR01QX0RFQlVHLCAmZ3JvdXAtPmdyb3VwX2FkZHJlc3MpOworICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiIG9uIGlmICVwXG4iLCBncm91cC0+bmV0aWYpKTsKKyAgICBncm91cCA9IGdyb3VwLT5uZXh0OworICB9CisgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiXG4iKSk7Cit9CisjZWxzZQorI2RlZmluZSBpZ21wX2R1bXBfZ3JvdXBfbGlzdCgpCisjZW5kaWYgLyogTFdJUF9ERUJVRyAqLworCisvKioKKyAqIFN0YXJ0IElHTVAgcHJvY2Vzc2luZyBvbiBpbnRlcmZhY2UKKyAqCisgKiBAcGFyYW0gbmV0aWYgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggc3RhcnQgSUdNUCBwcm9jZXNzaW5nCisgKi8KK2Vycl90CitpZ21wX3N0YXJ0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBpZ21wX2dyb3VwKiBncm91cDsKKworICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfc3RhcnQ6IHN0YXJ0aW5nIElHTVAgcHJvY2Vzc2luZyBvbiBpZiAlcFxuIiwgbmV0aWYpKTsKKworICBncm91cCA9IGlnbXBfbG9va3VwX2dyb3VwKG5ldGlmLCAmYWxsc3lzdGVtcyk7CisKKyAgaWYgKGdyb3VwICE9IE5VTEwpIHsKKyAgICBncm91cC0+Z3JvdXBfc3RhdGUgPSBJR01QX0dST1VQX0lETEVfTUVNQkVSOworICAgIGdyb3VwLT51c2UrKzsKKworICAgIC8qIEFsbG93IHRoZSBpZ21wIG1lc3NhZ2VzIGF0IHRoZSBNQUMgbGV2ZWwgKi8KKyAgICBpZiAobmV0aWYtPmlnbXBfbWFjX2ZpbHRlciAhPSBOVUxMKSB7CisgICAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfc3RhcnQ6IGlnbXBfbWFjX2ZpbHRlcihBREQgIikpOworICAgICAgaXBfYWRkcl9kZWJ1Z19wcmludChJR01QX0RFQlVHLCAmYWxsc3lzdGVtcyk7CisgICAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoIikgb24gaWYgJXBcbiIsIG5ldGlmKSk7CisgICAgICBuZXRpZi0+aWdtcF9tYWNfZmlsdGVyKG5ldGlmLCAmYWxsc3lzdGVtcywgSUdNUF9BRERfTUFDX0ZJTFRFUik7CisgICAgfQorCisgICAgcmV0dXJuIEVSUl9PSzsKKyAgfQorCisgIHJldHVybiBFUlJfTUVNOworfQorCisvKioKKyAqIFN0b3AgSUdNUCBwcm9jZXNzaW5nIG9uIGludGVyZmFjZQorICoKKyAqIEBwYXJhbSBuZXRpZiBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCBzdG9wIElHTVAgcHJvY2Vzc2luZworICovCitlcnJfdAoraWdtcF9zdG9wKHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBpZ21wX2dyb3VwICpncm91cCA9IGlnbXBfZ3JvdXBfbGlzdDsKKyAgc3RydWN0IGlnbXBfZ3JvdXAgKnByZXYgID0gTlVMTDsKKyAgc3RydWN0IGlnbXBfZ3JvdXAgKm5leHQ7CisKKyAgLyogbG9vayBmb3IgZ3JvdXBzIGpvaW5lZCBvbiB0aGlzIGludGVyZmFjZSBmdXJ0aGVyIGRvd24gdGhlIGxpc3QgKi8KKyAgd2hpbGUgKGdyb3VwICE9IE5VTEwpIHsKKyAgICBuZXh0ID0gZ3JvdXAtPm5leHQ7CisgICAgLyogaXMgaXQgYSBncm91cCBqb2luZWQgb24gdGhpcyBpbnRlcmZhY2U/ICovCisgICAgaWYgKGdyb3VwLT5uZXRpZiA9PSBuZXRpZikgeworICAgICAgLyogaXMgaXQgdGhlIGZpcnN0IGdyb3VwIG9mIHRoZSBsaXN0PyAqLworICAgICAgaWYgKGdyb3VwID09IGlnbXBfZ3JvdXBfbGlzdCkgeworICAgICAgICBpZ21wX2dyb3VwX2xpc3QgPSBuZXh0OworICAgICAgfQorICAgICAgLyogaXMgdGhlcmUgYSAicHJldmlvdXMiIGdyb3VwIGRlZmluZWQ/ICovCisgICAgICBpZiAocHJldiAhPSBOVUxMKSB7CisgICAgICAgIHByZXYtPm5leHQgPSBuZXh0OworICAgICAgfQorICAgICAgLyogZGlzYWJsZSB0aGUgZ3JvdXAgYXQgdGhlIE1BQyBsZXZlbCAqLworICAgICAgaWYgKG5ldGlmLT5pZ21wX21hY19maWx0ZXIgIT0gTlVMTCkgeworICAgICAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfc3RvcDogaWdtcF9tYWNfZmlsdGVyKERFTCAiKSk7CisgICAgICAgIGlwX2FkZHJfZGVidWdfcHJpbnQoSUdNUF9ERUJVRywgJmdyb3VwLT5ncm91cF9hZGRyZXNzKTsKKyAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCIpIG9uIGlmICVwXG4iLCBuZXRpZikpOworICAgICAgICBuZXRpZi0+aWdtcF9tYWNfZmlsdGVyKG5ldGlmLCAmKGdyb3VwLT5ncm91cF9hZGRyZXNzKSwgSUdNUF9ERUxfTUFDX0ZJTFRFUik7CisgICAgICB9CisgICAgICAvKiBmcmVlIGdyb3VwICovCisgICAgICBtZW1wX2ZyZWUoTUVNUF9JR01QX0dST1VQLCBncm91cCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNoYW5nZSB0aGUgInByZXZpb3VzIiAqLworICAgICAgcHJldiA9IGdyb3VwOworICAgIH0KKyAgICAvKiBtb3ZlIHRvICJuZXh0IiAqLworICAgIGdyb3VwID0gbmV4dDsKKyAgfQorICByZXR1cm4gRVJSX09LOworfQorCisvKioKKyAqIFJlcG9ydCBJR01QIG1lbWJlcnNoaXBzIGZvciB0aGlzIGludGVyZmFjZQorICoKKyAqIEBwYXJhbSBuZXRpZiBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCByZXBvcnQgSUdNUCBtZW1iZXJzaGlwcworICovCit2b2lkCitpZ21wX3JlcG9ydF9ncm91cHMoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgc3RydWN0IGlnbXBfZ3JvdXAgKmdyb3VwID0gaWdtcF9ncm91cF9saXN0OworCisgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiaWdtcF9yZXBvcnRfZ3JvdXBzOiBzZW5kaW5nIElHTVAgcmVwb3J0cyBvbiBpZiAlcFxuIiwgbmV0aWYpKTsKKworICB3aGlsZSAoZ3JvdXAgIT0gTlVMTCkgeworICAgIGlmIChncm91cC0+bmV0aWYgPT0gbmV0aWYpIHsKKyAgICAgIGlnbXBfZGVsYXlpbmdfbWVtYmVyKGdyb3VwLCBJR01QX0pPSU5fREVMQVlJTkdfTUVNQkVSX1RNUik7CisgICAgfQorICAgIGdyb3VwID0gZ3JvdXAtPm5leHQ7CisgIH0KK30KKworLyoqCisgKiBTZWFyY2ggZm9yIGEgZ3JvdXAgaW4gdGhlIGdsb2JhbCBpZ21wX2dyb3VwX2xpc3QKKyAqCisgKiBAcGFyYW0gaWZwIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmb3Igd2hpY2ggdG8gbG9vaworICogQHBhcmFtIGFkZHIgdGhlIGdyb3VwIGlwIGFkZHJlc3MgdG8gc2VhcmNoIGZvcgorICogQHJldHVybiBhIHN0cnVjdCBpZ21wX2dyb3VwKiBpZiB0aGUgZ3JvdXAgaGFzIGJlZW4gZm91bmQsCisgKiAgICAgICAgIE5VTEwgaWYgdGhlIGdyb3VwIHdhc24ndCBmb3VuZC4KKyAqLworc3RydWN0IGlnbXBfZ3JvdXAgKgoraWdtcF9sb29rZm9yX2dyb3VwKHN0cnVjdCBuZXRpZiAqaWZwLCBpcF9hZGRyX3QgKmFkZHIpCit7CisgIHN0cnVjdCBpZ21wX2dyb3VwICpncm91cCA9IGlnbXBfZ3JvdXBfbGlzdDsKKworICB3aGlsZSAoZ3JvdXAgIT0gTlVMTCkgeworICAgIGlmICgoZ3JvdXAtPm5ldGlmID09IGlmcCkgJiYgKGlwX2FkZHJfY21wKCYoZ3JvdXAtPmdyb3VwX2FkZHJlc3MpLCBhZGRyKSkpIHsKKyAgICAgIHJldHVybiBncm91cDsKKyAgICB9CisgICAgZ3JvdXAgPSBncm91cC0+bmV4dDsKKyAgfQorCisgIC8qIHRvIGJlIGNsZWFyZXIsIHdlIHJldHVybiBOVUxMIGhlcmUgaW5zdGVhZCBvZgorICAgKiAnZ3JvdXAnICh3aGljaCBpcyBhbHNvIE5VTEwgYXQgdGhpcyBwb2ludCkuCisgICAqLworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBTZWFyY2ggZm9yIGEgc3BlY2lmaWMgaWdtcCBncm91cCBhbmQgY3JlYXRlIGEgbmV3IG9uZSBpZiBub3QgZm91bmQtCisgKgorICogQHBhcmFtIGlmcCB0aGUgbmV0d29yayBpbnRlcmZhY2UgZm9yIHdoaWNoIHRvIGxvb2sKKyAqIEBwYXJhbSBhZGRyIHRoZSBncm91cCBpcCBhZGRyZXNzIHRvIHNlYXJjaAorICogQHJldHVybiBhIHN0cnVjdCBpZ21wX2dyb3VwKiwKKyAqICAgICAgICAgTlVMTCBvbiBtZW1vcnkgZXJyb3IuCisgKi8KK3N0cnVjdCBpZ21wX2dyb3VwICoKK2lnbXBfbG9va3VwX2dyb3VwKHN0cnVjdCBuZXRpZiAqaWZwLCBpcF9hZGRyX3QgKmFkZHIpCit7CisgIHN0cnVjdCBpZ21wX2dyb3VwICpncm91cCA9IGlnbXBfZ3JvdXBfbGlzdDsKKyAgCisgIC8qIFNlYXJjaCBpZiB0aGUgZ3JvdXAgYWxyZWFkeSBleGlzdHMgKi8KKyAgZ3JvdXAgPSBpZ21wX2xvb2tmb3JfZ3JvdXAoaWZwLCBhZGRyKTsKKyAgaWYgKGdyb3VwICE9IE5VTEwpIHsKKyAgICAvKiBHcm91cCBhbHJlYWR5IGV4aXN0cy4gKi8KKyAgICByZXR1cm4gZ3JvdXA7CisgIH0KKworICAvKiBHcm91cCBkb2Vzbid0IGV4aXN0IHlldCwgY3JlYXRlIGEgbmV3IG9uZSAqLworICBncm91cCA9IChzdHJ1Y3QgaWdtcF9ncm91cCAqKW1lbXBfbWFsbG9jKE1FTVBfSUdNUF9HUk9VUCk7CisgIGlmIChncm91cCAhPSBOVUxMKSB7CisgICAgZ3JvdXAtPm5ldGlmICAgICAgICAgICAgICA9IGlmcDsKKyAgICBpcF9hZGRyX3NldCgmKGdyb3VwLT5ncm91cF9hZGRyZXNzKSwgYWRkcik7CisgICAgZ3JvdXAtPnRpbWVyICAgICAgICAgICAgICA9IDA7IC8qIE5vdCBydW5uaW5nICovCisgICAgZ3JvdXAtPmdyb3VwX3N0YXRlICAgICAgICA9IElHTVBfR1JPVVBfTk9OX01FTUJFUjsKKyAgICBncm91cC0+bGFzdF9yZXBvcnRlcl9mbGFnID0gMDsKKyAgICBncm91cC0+dXNlICAgICAgICAgICAgICAgID0gMDsKKyAgICBncm91cC0+bmV4dCAgICAgICAgICAgICAgID0gaWdtcF9ncm91cF9saXN0OworICAgIAorICAgIGlnbXBfZ3JvdXBfbGlzdCA9IGdyb3VwOworICB9CisKKyAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJpZ21wX2xvb2t1cF9ncm91cDogJXNhbGxvY2F0ZWQgYSBuZXcgZ3JvdXAgd2l0aCBhZGRyZXNzICIsIChncm91cD8iIjoiaW1wb3NzaWJsZSB0byAiKSkpOworICBpcF9hZGRyX2RlYnVnX3ByaW50KElHTVBfREVCVUcsIGFkZHIpOworICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoIiBvbiBpZiAlcFxuIiwgaWZwKSk7CisKKyAgcmV0dXJuIGdyb3VwOworfQorCisvKioKKyAqIFJlbW92ZSBhIGdyb3VwIGluIHRoZSBnbG9iYWwgaWdtcF9ncm91cF9saXN0CisgKgorICogQHBhcmFtIGdyb3VwIHRoZSBncm91cCB0byByZW1vdmUgZnJvbSB0aGUgZ2xvYmFsIGlnbXBfZ3JvdXBfbGlzdAorICogQHJldHVybiBFUlJfT0sgaWYgZ3JvdXAgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCwgYW4gZXJyX3Qgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBlcnJfdAoraWdtcF9yZW1vdmVfZ3JvdXAoc3RydWN0IGlnbXBfZ3JvdXAgKmdyb3VwKQoreworICBlcnJfdCBlcnIgPSBFUlJfT0s7CisKKyAgLyogSXMgaXQgdGhlIGZpcnN0IGdyb3VwPyAqLworICBpZiAoaWdtcF9ncm91cF9saXN0ID09IGdyb3VwKSB7CisgICAgaWdtcF9ncm91cF9saXN0ID0gZ3JvdXAtPm5leHQ7CisgIH0gZWxzZSB7CisgICAgLyogbG9vayBmb3IgZ3JvdXAgZnVydGhlciBkb3duIHRoZSBsaXN0ICovCisgICAgc3RydWN0IGlnbXBfZ3JvdXAgKnRtcEdyb3VwOworICAgIGZvciAodG1wR3JvdXAgPSBpZ21wX2dyb3VwX2xpc3Q7IHRtcEdyb3VwICE9IE5VTEw7IHRtcEdyb3VwID0gdG1wR3JvdXAtPm5leHQpIHsKKyAgICAgIGlmICh0bXBHcm91cC0+bmV4dCA9PSBncm91cCkgeworICAgICAgICB0bXBHcm91cC0+bmV4dCA9IGdyb3VwLT5uZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLyogR3JvdXAgbm90IGZvdW5kIGluIHRoZSBnbG9iYWwgaWdtcF9ncm91cF9saXN0ICovCisgICAgaWYgKHRtcEdyb3VwID09IE5VTEwpCisgICAgICBlcnIgPSBFUlJfQVJHOworICB9CisgIC8qIGZyZWUgZ3JvdXAgKi8KKyAgbWVtcF9mcmVlKE1FTVBfSUdNUF9HUk9VUCwgZ3JvdXApOworCisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICogQ2FsbGVkIGZyb20gaXBfaW5wdXQoKSBpZiBhIG5ldyBJR01QIHBhY2tldCBpcyByZWNlaXZlZC4KKyAqCisgKiBAcGFyYW0gcCByZWNlaXZlZCBpZ21wIHBhY2tldCwgcC0+cGF5bG9hZCBwb2ludGluZyB0byB0aGUgaXAgaGVhZGVyCisgKiBAcGFyYW0gaW5wIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBwYWNrZXQgd2FzIHJlY2VpdmVkCisgKiBAcGFyYW0gZGVzdCBkZXN0aW5hdGlvbiBpcCBhZGRyZXNzIG9mIHRoZSBpZ21wIHBhY2tldAorICovCit2b2lkCitpZ21wX2lucHV0KHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKmlucCwgaXBfYWRkcl90ICpkZXN0KQoreworICBzdHJ1Y3QgaXBfaGRyICogICAgaXBoZHI7CisgIHN0cnVjdCBpZ21wX21zZyogICBpZ21wOworICBzdHJ1Y3QgaWdtcF9ncm91cCogZ3JvdXA7CisgIHN0cnVjdCBpZ21wX2dyb3VwKiBncm91cHJlZjsKKworICBJR01QX1NUQVRTX0lOQyhpZ21wLnJlY3YpOworCisgIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIENBTiBiZSBncmVhdGVyIHRoYW4gOCBidXQgb25seSA4IGFyZSB1c2VkIC0gQWxsIGFyZSBpbmNsdWRlZCBpbiB0aGUgY2hlY2tzdW0gKi8gICAgCisgIGlwaGRyID0gKHN0cnVjdCBpcF9oZHIgKilwLT5wYXlsb2FkOworICBpZiAocGJ1Zl9oZWFkZXIocCwgLShzMTZfdCkoSVBIX0hMKGlwaGRyKSAqIDQpKSB8fCAocC0+bGVuIDwgSUdNUF9NSU5MRU4pKSB7CisgICAgcGJ1Zl9mcmVlKHApOworICAgIElHTVBfU1RBVFNfSU5DKGlnbXAubGVuZXJyKTsKKyAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfaW5wdXQ6IGxlbmd0aCBlcnJvclxuIikpOworICAgIHJldHVybjsKKyAgfQorCisgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiaWdtcF9pbnB1dDogbWVzc2FnZSBmcm9tICIpKTsKKyAgaXBfYWRkcl9kZWJ1Z19wcmludChJR01QX0RFQlVHLCAmKGlwaGRyLT5zcmMpKTsKKyAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCIgdG8gYWRkcmVzcyAiKSk7CisgIGlwX2FkZHJfZGVidWdfcHJpbnQoSUdNUF9ERUJVRywgJihpcGhkci0+ZGVzdCkpOworICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoIiBvbiBpZiAlcFxuIiwgaW5wKSk7CisKKyAgLyogTm93IGNhbGN1bGF0ZSBhbmQgY2hlY2sgdGhlIGNoZWNrc3VtICovCisgIGlnbXAgPSAoc3RydWN0IGlnbXBfbXNnICopcC0+cGF5bG9hZDsKKyAgaWYgKGluZXRfY2hrc3VtKGlnbXAsIHAtPmxlbikpIHsKKyAgICBwYnVmX2ZyZWUocCk7CisgICAgSUdNUF9TVEFUU19JTkMoaWdtcC5jaGtlcnIpOworICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiaWdtcF9pbnB1dDogY2hlY2tzdW0gZXJyb3JcbiIpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBQYWNrZXQgaXMgb2sgc28gZmluZCBhbiBleGlzdGluZyBncm91cCAqLworICBncm91cCA9IGlnbXBfbG9va2Zvcl9ncm91cChpbnAsIGRlc3QpOyAvKiB1c2UgdGhlIGRlc3RpbmF0aW9uIElQIGFkZHJlc3Mgb2YgaW5jb21pbmcgcGFja2V0ICovCisgIAorICAvKiBJZiBncm91cCBjYW4gYmUgZm91bmQgb3IgY3JlYXRlLi4uICovCisgIGlmICghZ3JvdXApIHsKKyAgICBwYnVmX2ZyZWUocCk7CisgICAgSUdNUF9TVEFUU19JTkMoaWdtcC5kcm9wKTsKKyAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfaW5wdXQ6IElHTVAgZnJhbWUgbm90IGZvciB1c1xuIikpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIE5PVyBBQ1QgT04gVEhFIElOQ09NSU5HIE1FU1NBR0UgVFlQRS4uLiAqLworICBzd2l0Y2ggKGlnbXAtPmlnbXBfbXNndHlwZSkgeworICAgY2FzZSBJR01QX01FTUJfUVVFUlk6IHsKKyAgICAgLyogSUdNUF9NRU1CX1FVRVJZIHRvIHRoZSAiYWxsIHN5c3RlbXMiIGFkZHJlc3MgPyAqLworICAgICBpZiAoKGlwX2FkZHJfY21wKGRlc3QsICZhbGxzeXN0ZW1zKSkgJiYgaXBfYWRkcl9pc2FueSgmaWdtcC0+aWdtcF9ncm91cF9hZGRyZXNzKSkgeworICAgICAgIC8qIFRISVMgSVMgVEhFIEdFTkVSQUwgUVVFUlkgKi8KKyAgICAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfaW5wdXQ6IEdlbmVyYWwgSUdNUF9NRU1CX1FVRVJZIG9uIFwiQUxMIFNZU1RFTVNcIiBhZGRyZXNzICgyMjQuMC4wLjEpIFtpZ21wX21heHJlc3A9JWldXG4iLCAoaW50KShpZ21wLT5pZ21wX21heHJlc3ApKSk7CisKKyAgICAgICBpZiAoaWdtcC0+aWdtcF9tYXhyZXNwID09IDApIHsKKyAgICAgICAgIElHTVBfU1RBVFNfSU5DKGlnbXAucnhfdjEpOworICAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJpZ21wX2lucHV0OiBnb3QgYW4gYWxsIGhvc3RzIHF1ZXJ5IHdpdGggdGltZT09IDAgLSB0aGlzIGlzIFYxIGFuZCBub3QgaW1wbGVtZW50ZWQgLSB0cmVhdCBhcyB2MlxuIikpOworICAgICAgICAgaWdtcC0+aWdtcF9tYXhyZXNwID0gSUdNUF9WMV9ERUxBWUlOR19NRU1CRVJfVE1SOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICBJR01QX1NUQVRTX0lOQyhpZ21wLnJ4X2dlbmVyYWwpOworICAgICAgIH0KKworICAgICAgIGdyb3VwcmVmID0gaWdtcF9ncm91cF9saXN0OworICAgICAgIHdoaWxlIChncm91cHJlZikgeworICAgICAgICAgLyogRG8gbm90IHNlbmQgbWVzc2FnZXMgb24gdGhlIGFsbCBzeXN0ZW1zIGdyb3VwIGFkZHJlc3MhICovCisgICAgICAgICBpZiAoKGdyb3VwcmVmLT5uZXRpZiA9PSBpbnApICYmICghKGlwX2FkZHJfY21wKCYoZ3JvdXByZWYtPmdyb3VwX2FkZHJlc3MpLCAmYWxsc3lzdGVtcykpKSkgeworICAgICAgICAgICBpZ21wX2RlbGF5aW5nX21lbWJlcihncm91cHJlZiwgaWdtcC0+aWdtcF9tYXhyZXNwKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGdyb3VwcmVmID0gZ3JvdXByZWYtPm5leHQ7CisgICAgICAgfQorICAgICB9IGVsc2UgeworICAgICAgIC8qIElHTVBfTUVNQl9RVUVSWSB0byBhIHNwZWNpZmljIGdyb3VwID8gKi8KKyAgICAgICBpZiAoIWlwX2FkZHJfaXNhbnkoJmlnbXAtPmlnbXBfZ3JvdXBfYWRkcmVzcykpIHsKKyAgICAgICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiaWdtcF9pbnB1dDogSUdNUF9NRU1CX1FVRVJZIHRvIGEgc3BlY2lmaWMgZ3JvdXAgIikpOworICAgICAgICAgaXBfYWRkcl9kZWJ1Z19wcmludChJR01QX0RFQlVHLCAmaWdtcC0+aWdtcF9ncm91cF9hZGRyZXNzKTsKKyAgICAgICAgIGlmIChpcF9hZGRyX2NtcChkZXN0LCAmYWxsc3lzdGVtcykpIHsKKyAgICAgICAgICAgaXBfYWRkcl90IGdyb3VwYWRkcjsKKyAgICAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCIgdXNpbmcgXCJBTEwgU1lTVEVNU1wiIGFkZHJlc3MgKDIyNC4wLjAuMSkgW2lnbXBfbWF4cmVzcD0laV1cbiIsIChpbnQpKGlnbXAtPmlnbXBfbWF4cmVzcCkpKTsKKyAgICAgICAgICAgLyogd2UgZmlyc3QgbmVlZCB0byByZS1sb29rIGZvciB0aGUgZ3JvdXAgc2luY2Ugd2UgdXNlZCBkZXN0IGxhc3QgdGltZSAqLworICAgICAgICAgICBpcF9hZGRyX2NvcHkoZ3JvdXBhZGRyLCBpZ21wLT5pZ21wX2dyb3VwX2FkZHJlc3MpOworICAgICAgICAgICBncm91cCA9IGlnbXBfbG9va2Zvcl9ncm91cChpbnAsICZncm91cGFkZHIpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCIgd2l0aCB0aGUgZ3JvdXAgYWRkcmVzcyBhcyBkZXN0aW5hdGlvbiBbaWdtcF9tYXhyZXNwPSVpXVxuIiwgKGludCkoaWdtcC0+aWdtcF9tYXhyZXNwKSkpOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoZ3JvdXAgIT0gTlVMTCkgeworICAgICAgICAgICBJR01QX1NUQVRTX0lOQyhpZ21wLnJ4X2dyb3VwKTsKKyAgICAgICAgICAgaWdtcF9kZWxheWluZ19tZW1iZXIoZ3JvdXAsIGlnbXAtPmlnbXBfbWF4cmVzcCk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBJR01QX1NUQVRTX0lOQyhpZ21wLmRyb3ApOworICAgICAgICAgfQorICAgICAgIH0gZWxzZSB7CisgICAgICAgICBJR01QX1NUQVRTX0lOQyhpZ21wLnByb3RlcnIpOworICAgICAgIH0KKyAgICAgfQorICAgICBicmVhazsKKyAgIH0KKyAgIGNhc2UgSUdNUF9WMl9NRU1CX1JFUE9SVDogeworICAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfaW5wdXQ6IElHTVBfVjJfTUVNQl9SRVBPUlRcbiIpKTsKKyAgICAgSUdNUF9TVEFUU19JTkMoaWdtcC5yeF9yZXBvcnQpOworICAgICBpZiAoZ3JvdXAtPmdyb3VwX3N0YXRlID09IElHTVBfR1JPVVBfREVMQVlJTkdfTUVNQkVSKSB7CisgICAgICAgLyogVGhpcyBpcyBvbiBhIHNwZWNpZmljIGdyb3VwIHdlIGhhdmUgYWxyZWFkeSBsb29rZWQgdXAgKi8KKyAgICAgICBncm91cC0+dGltZXIgPSAwOyAvKiBzdG9wcGVkICovCisgICAgICAgZ3JvdXAtPmdyb3VwX3N0YXRlID0gSUdNUF9HUk9VUF9JRExFX01FTUJFUjsKKyAgICAgICBncm91cC0+bGFzdF9yZXBvcnRlcl9mbGFnID0gMDsKKyAgICAgfQorICAgICBicmVhazsKKyAgIH0KKyAgIGRlZmF1bHQ6IHsKKyAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJpZ21wX2lucHV0OiB1bmV4cGVjdGVkIG1zZyAlZCBpbiBzdGF0ZSAlZCBvbiBncm91cCAlcCBvbiBpZiAlcFxuIiwKKyAgICAgICBpZ21wLT5pZ21wX21zZ3R5cGUsIGdyb3VwLT5ncm91cF9zdGF0ZSwgJmdyb3VwLCBncm91cC0+bmV0aWYpKTsKKyAgICAgSUdNUF9TVEFUU19JTkMoaWdtcC5wcm90ZXJyKTsKKyAgICAgYnJlYWs7CisgICB9CisgIH0KKworICBwYnVmX2ZyZWUocCk7CisgIHJldHVybjsKK30KKworLyoqCisgKiBKb2luIGEgZ3JvdXAgb24gb25lIG5ldHdvcmsgaW50ZXJmYWNlLgorICoKKyAqIEBwYXJhbSBpZmFkZHIgaXAgYWRkcmVzcyBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2Ugd2hpY2ggc2hvdWxkIGpvaW4gYSBuZXcgZ3JvdXAKKyAqIEBwYXJhbSBncm91cGFkZHIgdGhlIGlwIGFkZHJlc3Mgb2YgdGhlIGdyb3VwIHdoaWNoIHRvIGpvaW4KKyAqIEByZXR1cm4gRVJSX09LIGlmIGdyb3VwIHdhcyBqb2luZWQgb24gdGhlIG5ldGlmKHMpLCBhbiBlcnJfdCBvdGhlcndpc2UKKyAqLworZXJyX3QKK2lnbXBfam9pbmdyb3VwKGlwX2FkZHJfdCAqaWZhZGRyLCBpcF9hZGRyX3QgKmdyb3VwYWRkcikKK3sKKyAgZXJyX3QgICAgICAgICAgICAgIGVyciA9IEVSUl9WQUw7IC8qIG5vIG1hdGNoaW5nIGludGVyZmFjZSAqLworICBzdHJ1Y3QgaWdtcF9ncm91cCAqZ3JvdXA7CisgIHN0cnVjdCBuZXRpZiAgICAgICpuZXRpZjsKKworICAvKiBtYWtlIHN1cmUgaXQgaXMgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyAgTFdJUF9FUlJPUigiaWdtcF9qb2luZ3JvdXA6IGF0dGVtcHQgdG8gam9pbiBub24tbXVsdGljYXN0IGFkZHJlc3MiLCBpcF9hZGRyX2lzbXVsdGljYXN0KGdyb3VwYWRkciksIHJldHVybiBFUlJfVkFMOyk7CisgIExXSVBfRVJST1IoImlnbXBfam9pbmdyb3VwOiBhdHRlbXB0IHRvIGpvaW4gYWxsc3lzdGVtcyBhZGRyZXNzIiwgKCFpcF9hZGRyX2NtcChncm91cGFkZHIsICZhbGxzeXN0ZW1zKSksIHJldHVybiBFUlJfVkFMOyk7CisKKyAgLyogbG9vcCB0aHJvdWdoIG5ldGlmJ3MgKi8KKyAgbmV0aWYgPSBuZXRpZl9saXN0OworICB3aGlsZSAobmV0aWYgIT0gTlVMTCkgeworICAgIC8qIFNob3VsZCB3ZSBqb2luIHRoaXMgaW50ZXJmYWNlID8gKi8KKyAgICBpZiAoKG5ldGlmLT5mbGFncyAmIE5FVElGX0ZMQUdfSUdNUCkgJiYgKChpcF9hZGRyX2lzYW55KGlmYWRkcikgfHwgaXBfYWRkcl9jbXAoJihuZXRpZi0+aXBfYWRkciksIGlmYWRkcikpKSkgeworICAgICAgLyogZmluZCBncm91cCBvciBjcmVhdGUgYSBuZXcgb25lIGlmIG5vdCBmb3VuZCAqLworICAgICAgZ3JvdXAgPSBpZ21wX2xvb2t1cF9ncm91cChuZXRpZiwgZ3JvdXBhZGRyKTsKKworICAgICAgaWYgKGdyb3VwICE9IE5VTEwpIHsKKyAgICAgICAgLyogVGhpcyBzaG91bGQgY3JlYXRlIGEgbmV3IGdyb3VwLCBjaGVjayB0aGUgc3RhdGUgdG8gbWFrZSBzdXJlICovCisgICAgICAgIGlmIChncm91cC0+Z3JvdXBfc3RhdGUgIT0gSUdNUF9HUk9VUF9OT05fTUVNQkVSKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJpZ21wX2pvaW5ncm91cDogam9pbiB0byBncm91cCBub3QgaW4gc3RhdGUgSUdNUF9HUk9VUF9OT05fTUVNQkVSXG4iKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogT0sgLSBpdCB3YXMgbmV3IGdyb3VwICovCisgICAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJpZ21wX2pvaW5ncm91cDogam9pbiB0byBuZXcgZ3JvdXA6ICIpKTsKKyAgICAgICAgICBpcF9hZGRyX2RlYnVnX3ByaW50KElHTVBfREVCVUcsIGdyb3VwYWRkcik7CisgICAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJcbiIpKTsKKworICAgICAgICAgIC8qIElmIGZpcnN0IHVzZSBvZiB0aGUgZ3JvdXAsIGFsbG93IHRoZSBncm91cCBhdCB0aGUgTUFDIGxldmVsICovCisgICAgICAgICAgaWYgKChncm91cC0+dXNlPT0wKSAmJiAobmV0aWYtPmlnbXBfbWFjX2ZpbHRlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJpZ21wX2pvaW5ncm91cDogaWdtcF9tYWNfZmlsdGVyKEFERCAiKSk7CisgICAgICAgICAgICBpcF9hZGRyX2RlYnVnX3ByaW50KElHTVBfREVCVUcsIGdyb3VwYWRkcik7CisgICAgICAgICAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoIikgb24gaWYgJXBcbiIsIG5ldGlmKSk7CisgICAgICAgICAgICBuZXRpZi0+aWdtcF9tYWNfZmlsdGVyKG5ldGlmLCBncm91cGFkZHIsIElHTVBfQUREX01BQ19GSUxURVIpOworICAgICAgICAgIH0KKworICAgICAgICAgIElHTVBfU1RBVFNfSU5DKGlnbXAudHhfam9pbik7CisgICAgICAgICAgaWdtcF9zZW5kKGdyb3VwLCBJR01QX1YyX01FTUJfUkVQT1JUKTsKKworICAgICAgICAgIGlnbXBfc3RhcnRfdGltZXIoZ3JvdXAsIElHTVBfSk9JTl9ERUxBWUlOR19NRU1CRVJfVE1SKTsKKworICAgICAgICAgIC8qIE5lZWQgdG8gd29yayBvdXQgd2hlcmUgdGhpcyB0aW1lciBjb21lcyBmcm9tICovCisgICAgICAgICAgZ3JvdXAtPmdyb3VwX3N0YXRlID0gSUdNUF9HUk9VUF9ERUxBWUlOR19NRU1CRVI7CisgICAgICAgIH0KKyAgICAgICAgLyogSW5jcmVtZW50IGdyb3VwIHVzZSAqLworICAgICAgICBncm91cC0+dXNlKys7CisgICAgICAgIC8qIEpvaW4gb24gdGhpcyBpbnRlcmZhY2UgKi8KKyAgICAgICAgZXJyID0gRVJSX09LOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUmV0dXJuIGFuIGVycm9yIGV2ZW4gaWYgc29tZSBuZXR3b3JrIGludGVyZmFjZXMgYXJlIGpvaW5lZCAqLworICAgICAgICAvKiogQHRvZG8gdW5kbyBhbnkgb3RoZXIgbmV0aWYgYWxyZWFkeSBqb2luZWQgKi8KKyAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJpZ21wX2pvaW5ncm91cDogTm90IGVub3VnaHQgbWVtb3J5IHRvIGpvaW4gdG8gZ3JvdXBcbiIpKTsKKyAgICAgICAgcmV0dXJuIEVSUl9NRU07CisgICAgICB9CisgICAgfQorICAgIC8qIHByb2NlZWQgdG8gbmV4dCBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIG5ldGlmID0gbmV0aWYtPm5leHQ7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIExlYXZlIGEgZ3JvdXAgb24gb25lIG5ldHdvcmsgaW50ZXJmYWNlLgorICoKKyAqIEBwYXJhbSBpZmFkZHIgaXAgYWRkcmVzcyBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2Ugd2hpY2ggc2hvdWxkIGxlYXZlIGEgZ3JvdXAKKyAqIEBwYXJhbSBncm91cGFkZHIgdGhlIGlwIGFkZHJlc3Mgb2YgdGhlIGdyb3VwIHdoaWNoIHRvIGxlYXZlCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBncm91cCB3YXMgbGVmdCBvbiB0aGUgbmV0aWYocyksIGFuIGVycl90IG90aGVyd2lzZQorICovCitlcnJfdAoraWdtcF9sZWF2ZWdyb3VwKGlwX2FkZHJfdCAqaWZhZGRyLCBpcF9hZGRyX3QgKmdyb3VwYWRkcikKK3sKKyAgZXJyX3QgICAgICAgICAgICAgIGVyciA9IEVSUl9WQUw7IC8qIG5vIG1hdGNoaW5nIGludGVyZmFjZSAqLworICBzdHJ1Y3QgaWdtcF9ncm91cCAqZ3JvdXA7CisgIHN0cnVjdCBuZXRpZiAgICAgICpuZXRpZjsKKworICAvKiBtYWtlIHN1cmUgaXQgaXMgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyAgTFdJUF9FUlJPUigiaWdtcF9sZWF2ZWdyb3VwOiBhdHRlbXB0IHRvIGxlYXZlIG5vbi1tdWx0aWNhc3QgYWRkcmVzcyIsIGlwX2FkZHJfaXNtdWx0aWNhc3QoZ3JvdXBhZGRyKSwgcmV0dXJuIEVSUl9WQUw7KTsKKyAgTFdJUF9FUlJPUigiaWdtcF9sZWF2ZWdyb3VwOiBhdHRlbXB0IHRvIGxlYXZlIGFsbHN5c3RlbXMgYWRkcmVzcyIsICghaXBfYWRkcl9jbXAoZ3JvdXBhZGRyLCAmYWxsc3lzdGVtcykpLCByZXR1cm4gRVJSX1ZBTDspOworCisgIC8qIGxvb3AgdGhyb3VnaCBuZXRpZidzICovCisgIG5ldGlmID0gbmV0aWZfbGlzdDsKKyAgd2hpbGUgKG5ldGlmICE9IE5VTEwpIHsKKyAgICAvKiBTaG91bGQgd2UgbGVhdmUgdGhpcyBpbnRlcmZhY2UgPyAqLworICAgIGlmICgobmV0aWYtPmZsYWdzICYgTkVUSUZfRkxBR19JR01QKSAmJiAoKGlwX2FkZHJfaXNhbnkoaWZhZGRyKSB8fCBpcF9hZGRyX2NtcCgmKG5ldGlmLT5pcF9hZGRyKSwgaWZhZGRyKSkpKSB7CisgICAgICAvKiBmaW5kIGdyb3VwICovCisgICAgICBncm91cCA9IGlnbXBfbG9va2Zvcl9ncm91cChuZXRpZiwgZ3JvdXBhZGRyKTsKKworICAgICAgaWYgKGdyb3VwICE9IE5VTEwpIHsKKyAgICAgICAgLyogT25seSBzZW5kIGEgbGVhdmUgaWYgdGhlIGZsYWcgaXMgc2V0IGFjY29yZGluZyB0byB0aGUgc3RhdGUgZGlhZ3JhbSAqLworICAgICAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfbGVhdmVncm91cDogTGVhdmluZyBncm91cDogIikpOworICAgICAgICBpcF9hZGRyX2RlYnVnX3ByaW50KElHTVBfREVCVUcsIGdyb3VwYWRkcik7CisgICAgICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiXG4iKSk7CisKKyAgICAgICAgLyogSWYgdGhlcmUgaXMgbm8gb3RoZXIgdXNlIG9mIHRoZSBncm91cCAqLworICAgICAgICBpZiAoZ3JvdXAtPnVzZSA8PSAxKSB7CisgICAgICAgICAgLyogSWYgd2UgYXJlIHRoZSBsYXN0IHJlcG9ydGVyIGZvciB0aGlzIGdyb3VwICovCisgICAgICAgICAgaWYgKGdyb3VwLT5sYXN0X3JlcG9ydGVyX2ZsYWcpIHsKKyAgICAgICAgICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiaWdtcF9sZWF2ZWdyb3VwOiBzZW5kaW5nIGxlYXZpbmcgZ3JvdXBcbiIpKTsKKyAgICAgICAgICAgIElHTVBfU1RBVFNfSU5DKGlnbXAudHhfbGVhdmUpOworICAgICAgICAgICAgaWdtcF9zZW5kKGdyb3VwLCBJR01QX0xFQVZFX0dST1VQKTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgZ3JvdXAgYXQgdGhlIE1BQyBsZXZlbCAqLworICAgICAgICAgIGlmIChuZXRpZi0+aWdtcF9tYWNfZmlsdGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiaWdtcF9sZWF2ZWdyb3VwOiBpZ21wX21hY19maWx0ZXIoREVMICIpKTsKKyAgICAgICAgICAgIGlwX2FkZHJfZGVidWdfcHJpbnQoSUdNUF9ERUJVRywgZ3JvdXBhZGRyKTsKKyAgICAgICAgICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiKSBvbiBpZiAlcFxuIiwgbmV0aWYpKTsKKyAgICAgICAgICAgIG5ldGlmLT5pZ21wX21hY19maWx0ZXIobmV0aWYsIGdyb3VwYWRkciwgSUdNUF9ERUxfTUFDX0ZJTFRFUik7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiaWdtcF9sZWF2ZWdyb3VwOiByZW1vdmUgZ3JvdXA6ICIpKTsKKyAgICAgICAgICBpcF9hZGRyX2RlYnVnX3ByaW50KElHTVBfREVCVUcsIGdyb3VwYWRkcik7CisgICAgICAgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJcbiIpKTsgICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgLyogRnJlZSB0aGUgZ3JvdXAgKi8KKyAgICAgICAgICBpZ21wX3JlbW92ZV9ncm91cChncm91cCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogRGVjcmVtZW50IGdyb3VwIHVzZSAqLworICAgICAgICAgIGdyb3VwLT51c2UtLTsKKyAgICAgICAgfQorICAgICAgICAvKiBMZWF2ZSBvbiB0aGlzIGludGVyZmFjZSAqLworICAgICAgICBlcnIgPSBFUlJfT0s7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJdCdzIG5vdCBhIGZhdGFsIGVycm9yIG9uICJsZWF2ZWdyb3VwIiAqLworICAgICAgICBMV0lQX0RFQlVHRihJR01QX0RFQlVHLCAoImlnbXBfbGVhdmVncm91cDogbm90IG1lbWJlciBvZiBncm91cFxuIikpOworICAgICAgfQorICAgIH0KKyAgICAvKiBwcm9jZWVkIHRvIG5leHQgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICBuZXRpZiA9IG5ldGlmLT5uZXh0OworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBUaGUgaWdtcCB0aW1lciBmdW5jdGlvbiAoYm90aCBmb3IgTk9fU1lTPTEgYW5kID0wKQorICogU2hvdWxkIGJlIGNhbGxlZCBldmVyeSBJR01QX1RNUl9JTlRFUlZBTCBtaWxsaXNlY29uZHMgKDEwMCBtcyBpcyBkZWZhdWx0KS4KKyAqLwordm9pZAoraWdtcF90bXIodm9pZCkKK3sKKyAgc3RydWN0IGlnbXBfZ3JvdXAgKmdyb3VwID0gaWdtcF9ncm91cF9saXN0OworCisgIHdoaWxlIChncm91cCAhPSBOVUxMKSB7CisgICAgaWYgKGdyb3VwLT50aW1lciA+IDApIHsKKyAgICAgIGdyb3VwLT50aW1lci0tOworICAgICAgaWYgKGdyb3VwLT50aW1lciA9PSAwKSB7CisgICAgICAgIGlnbXBfdGltZW91dChncm91cCk7CisgICAgICB9CisgICAgfQorICAgIGdyb3VwID0gZ3JvdXAtPm5leHQ7CisgIH0KK30KKworLyoqCisgKiBDYWxsZWQgaWYgYSB0aW1lb3V0IGZvciBvbmUgZ3JvdXAgaXMgcmVhY2hlZC4KKyAqIFNlbmRzIGEgcmVwb3J0IGZvciB0aGlzIGdyb3VwLgorICoKKyAqIEBwYXJhbSBncm91cCBhbiBpZ21wX2dyb3VwIGZvciB3aGljaCBhIHRpbWVvdXQgaXMgcmVhY2hlZAorICovCitzdGF0aWMgdm9pZAoraWdtcF90aW1lb3V0KHN0cnVjdCBpZ21wX2dyb3VwICpncm91cCkKK3sKKyAgLyogSWYgdGhlIHN0YXRlIGlzIElHTVBfR1JPVVBfREVMQVlJTkdfTUVNQkVSIHRoZW4gd2Ugc2VuZCBhIHJlcG9ydCBmb3IgdGhpcyBncm91cCAqLworICBpZiAoZ3JvdXAtPmdyb3VwX3N0YXRlID09IElHTVBfR1JPVVBfREVMQVlJTkdfTUVNQkVSKSB7CisgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJpZ21wX3RpbWVvdXQ6IHJlcG9ydCBtZW1iZXJzaGlwIGZvciBncm91cCB3aXRoIGFkZHJlc3MgIikpOworICAgIGlwX2FkZHJfZGVidWdfcHJpbnQoSUdNUF9ERUJVRywgJihncm91cC0+Z3JvdXBfYWRkcmVzcykpOworICAgIExXSVBfREVCVUdGKElHTVBfREVCVUcsICgiIG9uIGlmICVwXG4iLCBncm91cC0+bmV0aWYpKTsKKworICAgIElHTVBfU1RBVFNfSU5DKGlnbXAudHhfcmVwb3J0KTsKKyAgICBpZ21wX3NlbmQoZ3JvdXAsIElHTVBfVjJfTUVNQl9SRVBPUlQpOworICB9Cit9CisKKy8qKgorICogU3RhcnQgYSB0aW1lciBmb3IgYW4gaWdtcCBncm91cAorICoKKyAqIEBwYXJhbSBncm91cCB0aGUgaWdtcF9ncm91cCBmb3Igd2hpY2ggdG8gc3RhcnQgYSB0aW1lcgorICogQHBhcmFtIG1heF90aW1lIHRoZSB0aW1lIGluIG11bHRpcGxlcyBvZiBJR01QX1RNUl9JTlRFUlZBTCAoZGVjcmVhc2Ugd2l0aAorICogICAgICAgIGV2ZXJ5IGNhbGwgdG8gaWdtcF90bXIoKSkKKyAqLworc3RhdGljIHZvaWQKK2lnbXBfc3RhcnRfdGltZXIoc3RydWN0IGlnbXBfZ3JvdXAgKmdyb3VwLCB1OF90IG1heF90aW1lKQoreworICAvKiBlbnN1cmUgdGhlIGlucHV0IHZhbHVlIGlzID4gMCAqLworICBpZiAobWF4X3RpbWUgPT0gMCkgeworICAgIG1heF90aW1lID0gMTsKKyAgfQorICAvKiBlbnN1cmUgdGhlIHJhbmRvbSB2YWx1ZSBpcyA+IDAgKi8KKyAgZ3JvdXAtPnRpbWVyID0gKExXSVBfUkFORCgpICUgKG1heF90aW1lIC0gMSkpICsgMTsKK30KKworLyoqCisgKiBTdG9wIGEgdGltZXIgZm9yIGFuIGlnbXBfZ3JvdXAKKyAqCisgKiBAcGFyYW0gZ3JvdXAgdGhlIGlnbXBfZ3JvdXAgZm9yIHdoaWNoIHRvIHN0b3AgdGhlIHRpbWVyCisgKi8KK3N0YXRpYyB2b2lkCitpZ21wX3N0b3BfdGltZXIoc3RydWN0IGlnbXBfZ3JvdXAgKmdyb3VwKQoreworICBncm91cC0+dGltZXIgPSAwOworfQorCisvKioKKyAqIERlbGF5aW5nIG1lbWJlcnNoaXAgcmVwb3J0IGZvciBhIGdyb3VwIGlmIG5lY2Vzc2FyeQorICoKKyAqIEBwYXJhbSBncm91cCB0aGUgaWdtcF9ncm91cCBmb3Igd2hpY2ggImRlbGF5aW5nIiBtZW1iZXJzaGlwIHJlcG9ydAorICogQHBhcmFtIG1heHJlc3AgcXVlcnkgZGVsYXkKKyAqLworc3RhdGljIHZvaWQKK2lnbXBfZGVsYXlpbmdfbWVtYmVyKHN0cnVjdCBpZ21wX2dyb3VwICpncm91cCwgdThfdCBtYXhyZXNwKQoreworICBpZiAoKGdyb3VwLT5ncm91cF9zdGF0ZSA9PSBJR01QX0dST1VQX0lETEVfTUVNQkVSKSB8fAorICAgICAoKGdyb3VwLT5ncm91cF9zdGF0ZSA9PSBJR01QX0dST1VQX0RFTEFZSU5HX01FTUJFUikgJiYKKyAgICAgICgoZ3JvdXAtPnRpbWVyID09IDApIHx8IChtYXhyZXNwIDwgZ3JvdXAtPnRpbWVyKSkpKSB7CisgICAgaWdtcF9zdGFydF90aW1lcihncm91cCwgbWF4cmVzcCk7CisgICAgZ3JvdXAtPmdyb3VwX3N0YXRlID0gSUdNUF9HUk9VUF9ERUxBWUlOR19NRU1CRVI7CisgIH0KK30KKworCisvKioKKyAqIFNlbmRzIGFuIElQIHBhY2tldCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlLiBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgdGhlIElQIGhlYWRlcgorICogYW5kIGNhbGN1bGF0ZXMgdGhlIElQIGhlYWRlciBjaGVja3N1bS4gSWYgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIGlzIE5VTEwsCisgKiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgb3V0Z29pbmcgbmV0d29yayBpbnRlcmZhY2UgaXMgZmlsbGVkIGluIGFzIHNvdXJjZSBhZGRyZXNzLgorICoKKyAqIEBwYXJhbSBwIHRoZSBwYWNrZXQgdG8gc2VuZCAocC0+cGF5bG9hZCBwb2ludHMgdG8gdGhlIGRhdGEsIGUuZy4gbmV4dAorICAgICAgICAgICAgcHJvdG9jb2wgaGVhZGVyOyBpZiBkZXN0ID09IElQX0hEUklOQ0wsIHAgYWxyZWFkeSBpbmNsdWRlcyBhbiBJUAorICAgICAgICAgICAgaGVhZGVyIGFuZCBwLT5wYXlsb2FkIHBvaW50cyB0byB0aGF0IElQIGhlYWRlcikKKyAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIHRvIHNlbmQgZnJvbSAoaWYgc3JjID09IElQX0FERFJfQU5ZLCB0aGUKKyAqICAgICAgICAgSVAgIGFkZHJlc3Mgb2YgdGhlIG5ldGlmIHVzZWQgdG8gc2VuZCBpcyB1c2VkIGFzIHNvdXJjZSBhZGRyZXNzKQorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgdG8gc2VuZCB0aGUgcGFja2V0IHRvCisgKiBAcGFyYW0gdHRsIHRoZSBUVEwgdmFsdWUgdG8gYmUgc2V0IGluIHRoZSBJUCBoZWFkZXIKKyAqIEBwYXJhbSBwcm90byB0aGUgUFJPVE9DT0wgdG8gYmUgc2V0IGluIHRoZSBJUCBoZWFkZXIKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbmV0aWYgb24gd2hpY2ggdG8gc2VuZCB0aGlzIHBhY2tldAorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIHBhY2tldCB3YXMgc2VudCBPSworICogICAgICAgICBFUlJfQlVGIGlmIHAgZG9lc24ndCBoYXZlIGVub3VnaCBzcGFjZSBmb3IgSVAvTElOSyBoZWFkZXJzCisgKiAgICAgICAgIHJldHVybnMgZXJyb3JzIHJldHVybmVkIGJ5IG5ldGlmLT5vdXRwdXQKKyAqLworc3RhdGljIGVycl90CitpZ21wX2lwX291dHB1dF9pZihzdHJ1Y3QgcGJ1ZiAqcCwgaXBfYWRkcl90ICpzcmMsIGlwX2FkZHJfdCAqZGVzdCwgc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgLyogVGhpcyBpcyB0aGUgInJvdXRlciBhbGVydCIgb3B0aW9uICovCisgIHUxNl90IHJhWzJdOworICByYVswXSA9IFBQX0hUT05TKFJPVVRFUl9BTEVSVCk7CisgIHJhWzFdID0gMHgwMDAwOyAvKiBSb3V0ZXIgc2hhbGwgZXhhbWluZSBwYWNrZXQgKi8KKyAgSUdNUF9TVEFUU19JTkMoaWdtcC54bWl0KTsKKyAgcmV0dXJuIGlwX291dHB1dF9pZl9vcHQocCwgc3JjLCBkZXN0LCBJR01QX1RUTCwgMCwgSVBfUFJPVE9fSUdNUCwgbmV0aWYsIHJhLCBST1VURVJfQUxFUlRMRU4pOworfQorCisvKioKKyAqIFNlbmQgYW4gaWdtcCBwYWNrZXQgdG8gYSBzcGVjaWZpYyBncm91cC4KKyAqCisgKiBAcGFyYW0gZ3JvdXAgdGhlIGdyb3VwIHRvIHdoaWNoIHRvIHNlbmQgdGhlIHBhY2tldAorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgaWdtcCBwYWNrZXQgdG8gc2VuZAorICovCitzdGF0aWMgdm9pZAoraWdtcF9zZW5kKHN0cnVjdCBpZ21wX2dyb3VwICpncm91cCwgdThfdCB0eXBlKQoreworICBzdHJ1Y3QgcGJ1ZiogICAgIHAgICAgPSBOVUxMOworICBzdHJ1Y3QgaWdtcF9tc2cqIGlnbXAgPSBOVUxMOworICBpcF9hZGRyX3QgICBzcmMgID0gKklQX0FERFJfQU5ZOworICBpcF9hZGRyX3QqICBkZXN0ID0gTlVMTDsKKworICAvKiBJUCBoZWFkZXIgKyAicm91dGVyIGFsZXJ0IiBvcHRpb24gKyBJR01QIGhlYWRlciAqLworICBwID0gcGJ1Zl9hbGxvYyhQQlVGX1RSQU5TUE9SVCwgSUdNUF9NSU5MRU4sIFBCVUZfUkFNKTsKKyAgCisgIGlmIChwKSB7CisgICAgaWdtcCA9IChzdHJ1Y3QgaWdtcF9tc2cgKilwLT5wYXlsb2FkOworICAgIExXSVBfQVNTRVJUKCJpZ21wX3NlbmQ6IGNoZWNrIHRoYXQgZmlyc3QgcGJ1ZiBjYW4gaG9sZCBzdHJ1Y3QgaWdtcF9tc2ciLAorICAgICAgICAgICAgICAgKHAtPmxlbiA+PSBzaXplb2Yoc3RydWN0IGlnbXBfbXNnKSkpOworICAgIGlwX2FkZHJfY29weShzcmMsIGdyb3VwLT5uZXRpZi0+aXBfYWRkcik7CisgICAgIAorICAgIGlmICh0eXBlID09IElHTVBfVjJfTUVNQl9SRVBPUlQpIHsKKyAgICAgIGRlc3QgPSAmKGdyb3VwLT5ncm91cF9hZGRyZXNzKTsKKyAgICAgIGlwX2FkZHJfY29weShpZ21wLT5pZ21wX2dyb3VwX2FkZHJlc3MsIGdyb3VwLT5ncm91cF9hZGRyZXNzKTsKKyAgICAgIGdyb3VwLT5sYXN0X3JlcG9ydGVyX2ZsYWcgPSAxOyAvKiBSZW1lbWJlciB3ZSB3ZXJlIHRoZSBsYXN0IHRvIHJlcG9ydCAqLworICAgIH0gZWxzZSB7CisgICAgICBpZiAodHlwZSA9PSBJR01QX0xFQVZFX0dST1VQKSB7CisgICAgICAgIGRlc3QgPSAmYWxscm91dGVyczsKKyAgICAgICAgaXBfYWRkcl9jb3B5KGlnbXAtPmlnbXBfZ3JvdXBfYWRkcmVzcywgZ3JvdXAtPmdyb3VwX2FkZHJlc3MpOworICAgICAgfQorICAgIH0KKworICAgIGlmICgodHlwZSA9PSBJR01QX1YyX01FTUJfUkVQT1JUKSB8fCAodHlwZSA9PSBJR01QX0xFQVZFX0dST1VQKSkgeworICAgICAgaWdtcC0+aWdtcF9tc2d0eXBlICA9IHR5cGU7CisgICAgICBpZ21wLT5pZ21wX21heHJlc3AgID0gMDsKKyAgICAgIGlnbXAtPmlnbXBfY2hlY2tzdW0gPSAwOworICAgICAgaWdtcC0+aWdtcF9jaGVja3N1bSA9IGluZXRfY2hrc3VtKGlnbXAsIElHTVBfTUlOTEVOKTsKKworICAgICAgaWdtcF9pcF9vdXRwdXRfaWYocCwgJnNyYywgZGVzdCwgZ3JvdXAtPm5ldGlmKTsKKyAgICB9CisKKyAgICBwYnVmX2ZyZWUocCk7CisgIH0gZWxzZSB7CisgICAgTFdJUF9ERUJVR0YoSUdNUF9ERUJVRywgKCJpZ21wX3NlbmQ6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBpZ21wX3NlbmRcbiIpKTsKKyAgICBJR01QX1NUQVRTX0lOQyhpZ21wLm1lbWVycik7CisgIH0KK30KKworI2VuZGlmIC8qIExXSVBfSUdNUCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaW5ldC5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaW5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODNhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvaXB2NC9pbmV0LmMKQEAgLTAsMCArMSw0MiBAQAorLyoqCisgKiBAZmlsZQorICogRnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgVENQL0lQdjQgbW9kdWxlcywgc3VjaCBhcyB0aGUgYnl0ZSBvcmRlciBmdW5jdGlvbnMuCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2luY2x1ZGUgImx3aXAvaW5ldC5oIgorCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2NvcmUvaXB2NC9pbmV0X2Noa3N1bS5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaW5ldF9jaGtzdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjAyNTJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaW5ldF9jaGtzdW0uYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoqCisgKiBAZmlsZQorICogSW5jbHVzZSBpbnRlcm5ldCBjaGVja3N1bSBmdW5jdGlvbnMuCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2luY2x1ZGUgImx3aXAvaW5ldF9jaGtzdW0uaCIKKyNpbmNsdWRlICJsd2lwL2RlZi5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIFRoZXNlIGFyZSBzb21lIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGNoZWNrc3VtIGFsZ29yaXRobSwgd2l0aCB0aGUKKyAqIGFpbSBvZiBiZWluZyBzaW1wbGUsIGNvcnJlY3QgYW5kIGZ1bGx5IHBvcnRhYmxlLiBDaGVja3N1bW1pbmcgaXMgdGhlCisgKiBmaXJzdCB0aGluZyB5b3Ugd291bGQgd2FudCB0byBvcHRpbWl6ZSBmb3IgeW91ciBwbGF0Zm9ybS4gSWYgeW91IGNyZWF0ZQorICogeW91ciBvd24gdmVyc2lvbiwgbGluayBpdCBpbiBhbmQgaW4geW91ciBjYy5oIHB1dDoKKyAqIAorICogI2RlZmluZSBMV0lQX0NIS1NVTSA8eW91cl9jaGVja3N1bV9yb3V0aW5lPiAKKyAqCisgKiBPciB5b3UgY2FuIHNlbGVjdCBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbnMgYmVsb3cgYnkgZGVmaW5pbmcKKyAqIExXSVBfQ0hLU1VNX0FMR09SSVRITSB0byAxLCAyIG9yIDMuCisgKi8KKworI2lmbmRlZiBMV0lQX0NIS1NVTQorIyBkZWZpbmUgTFdJUF9DSEtTVU0gbHdpcF9zdGFuZGFyZF9jaGtzdW0KKyMgaWZuZGVmIExXSVBfQ0hLU1VNX0FMR09SSVRITQorIyAgZGVmaW5lIExXSVBfQ0hLU1VNX0FMR09SSVRITSAyCisjIGVuZGlmCisjZW5kaWYKKy8qIElmIG5vbmUgc2V0OiAqLworI2lmbmRlZiBMV0lQX0NIS1NVTV9BTEdPUklUSE0KKyMgZGVmaW5lIExXSVBfQ0hLU1VNX0FMR09SSVRITSAwCisjZW5kaWYKKworI2lmIChMV0lQX0NIS1NVTV9BTEdPUklUSE0gPT0gMSkgLyogVmVyc2lvbiAjMSAqLworLyoqCisgKiBsd2lwIGNoZWNrc3VtCisgKgorICogQHBhcmFtIGRhdGFwdHIgcG9pbnRzIHRvIHN0YXJ0IG9mIGRhdGEgdG8gYmUgc3VtbWVkIGF0IGFueSBib3VuZGFyeQorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgZGF0YSB0byBiZSBzdW1tZWQKKyAqIEByZXR1cm4gaG9zdCBvcmRlciAoISkgbHdpcCBjaGVja3N1bSAobm9uLWludmVydGVkIEludGVybmV0IHN1bSkgCisgKgorICogQG5vdGUgYWNjdW11bGF0b3Igc2l6ZSBsaW1pdHMgc3VtbWFibGUgbGVuZ3RoIHRvIDY0aworICogQG5vdGUgaG9zdCBlbmRpYW5lc3MgaXMgaXJyZWxldmFudCAocDMgUkZDMTA3MSkKKyAqLworc3RhdGljIHUxNl90Citsd2lwX3N0YW5kYXJkX2Noa3N1bSh2b2lkICpkYXRhcHRyLCB1MTZfdCBsZW4pCit7CisgIHUzMl90IGFjYzsKKyAgdTE2X3Qgc3JjOworICB1OF90ICpvY3RldHB0cjsKKworICBhY2MgPSAwOworICAvKiBkYXRhcHRyIG1heSBiZSBhdCBvZGQgb3IgZXZlbiBhZGRyZXNzZXMgKi8KKyAgb2N0ZXRwdHIgPSAodThfdCopZGF0YXB0cjsKKyAgd2hpbGUgKGxlbiA+IDEpIHsKKyAgICAvKiBkZWNsYXJlIGZpcnN0IG9jdGV0IGFzIG1vc3Qgc2lnbmlmaWNhbnQKKyAgICAgICB0aHVzIGFzc3VtZSBuZXR3b3JrIG9yZGVyLCBpZ25vcmluZyBob3N0IG9yZGVyICovCisgICAgc3JjID0gKCpvY3RldHB0cikgPDwgODsKKyAgICBvY3RldHB0cisrOworICAgIC8qIGRlY2xhcmUgc2Vjb25kIG9jdGV0IGFzIGxlYXN0IHNpZ25pZmljYW50ICovCisgICAgc3JjIHw9ICgqb2N0ZXRwdHIpOworICAgIG9jdGV0cHRyKys7CisgICAgYWNjICs9IHNyYzsKKyAgICBsZW4gLT0gMjsKKyAgfQorICBpZiAobGVuID4gMCkgeworICAgIC8qIGFjY3VtdWxhdGUgcmVtYWluaW5nIG9jdGV0ICovCisgICAgc3JjID0gKCpvY3RldHB0cikgPDwgODsKKyAgICBhY2MgKz0gc3JjOworICB9CisgIC8qIGFkZCBkZWZlcnJlZCBjYXJyeSBiaXRzICovCisgIGFjYyA9IChhY2MgPj4gMTYpICsgKGFjYyAmIDB4MDAwMGZmZmZVTCk7CisgIGlmICgoYWNjICYgMHhmZmZmMDAwMFVMKSAhPSAwKSB7CisgICAgYWNjID0gKGFjYyA+PiAxNikgKyAoYWNjICYgMHgwMDAwZmZmZlVMKTsKKyAgfQorICAvKiBUaGlzIG1heWJlIGEgbGl0dGxlIGNvbmZ1c2luZzogcmVvcmRlciBzdW0gdXNpbmcgaHRvbnMoKQorICAgICBpbnN0ZWFkIG9mIG50b2hzKCkgc2luY2UgaXQgaGFzIGEgbGl0dGxlIGxlc3MgY2FsbCBvdmVyaGVhZC4KKyAgICAgVGhlIGNhbGxlciBtdXN0IGludmVydCBiaXRzIGZvciBJbnRlcm5ldCBzdW0gISAqLworICByZXR1cm4gaHRvbnMoKHUxNl90KWFjYyk7Cit9CisjZW5kaWYKKworI2lmIChMV0lQX0NIS1NVTV9BTEdPUklUSE0gPT0gMikgLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiAjMiAqLworLyoKKyAqIEN1cnQgTWNEb3dlbGwKKyAqIEJyb2FkY29tIENvcnAuCisgKiBjc21AYnJvYWRjb20uY29tCisgKgorICogSVAgY2hlY2tzdW0gdHdvIGJ5dGVzIGF0IGEgdGltZSB3aXRoIHN1cHBvcnQgZm9yCisgKiB1bmFsaWduZWQgYnVmZmVyLgorICogV29ya3MgZm9yIGxlbiB1cCB0byBhbmQgaW5jbHVkaW5nIDB4MjAwMDAuCisgKiBieSBDdXJ0IE1jRG93ZWxsLCBCcm9hZGNvbSBDb3JwLiAxMi8wOC8yMDA1CisgKgorICogQHBhcmFtIGRhdGFwdHIgcG9pbnRzIHRvIHN0YXJ0IG9mIGRhdGEgdG8gYmUgc3VtbWVkIGF0IGFueSBib3VuZGFyeQorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgZGF0YSB0byBiZSBzdW1tZWQKKyAqIEByZXR1cm4gaG9zdCBvcmRlciAoISkgbHdpcCBjaGVja3N1bSAobm9uLWludmVydGVkIEludGVybmV0IHN1bSkgCisgKi8KKworc3RhdGljIHUxNl90Citsd2lwX3N0YW5kYXJkX2Noa3N1bSh2b2lkICpkYXRhcHRyLCBpbnQgbGVuKQoreworICB1OF90ICpwYiA9ICh1OF90ICopZGF0YXB0cjsKKyAgdTE2X3QgKnBzLCB0ID0gMDsKKyAgdTMyX3Qgc3VtID0gMDsKKyAgaW50IG9kZCA9ICgobWVtX3B0cl90KXBiICYgMSk7CisKKyAgLyogR2V0IGFsaWduZWQgdG8gdTE2X3QgKi8KKyAgaWYgKG9kZCAmJiBsZW4gPiAwKSB7CisgICAgKCh1OF90ICopJnQpWzFdID0gKnBiKys7CisgICAgbGVuLS07CisgIH0KKworICAvKiBBZGQgdGhlIGJ1bGsgb2YgdGhlIGRhdGEgKi8KKyAgcHMgPSAodTE2X3QgKikodm9pZCAqKXBiOworICB3aGlsZSAobGVuID4gMSkgeworICAgIHN1bSArPSAqcHMrKzsKKyAgICBsZW4gLT0gMjsKKyAgfQorCisgIC8qIENvbnN1bWUgbGVmdC1vdmVyIGJ5dGUsIGlmIGFueSAqLworICBpZiAobGVuID4gMCkgeworICAgICgodThfdCAqKSZ0KVswXSA9ICoodThfdCAqKXBzOworICB9CisKKyAgLyogQWRkIGVuZCBieXRlcyAqLworICBzdW0gKz0gdDsKKworICAvKiBGb2xkIDMyLWJpdCBzdW0gdG8gMTYgYml0cworICAgICBjYWxsaW5nIHRoaXMgdHdpY2UgaXMgcHJvcGFibHkgZmFzdGVyIHRoYW4gaWYgc3RhdGVtZW50cy4uLiAqLworICBzdW0gPSBGT0xEX1UzMlQoc3VtKTsKKyAgc3VtID0gRk9MRF9VMzJUKHN1bSk7CisKKyAgLyogU3dhcCBpZiBhbGlnbm1lbnQgd2FzIG9kZCAqLworICBpZiAob2RkKSB7CisgICAgc3VtID0gU1dBUF9CWVRFU19JTl9XT1JEKHN1bSk7CisgIH0KKworICByZXR1cm4gKHUxNl90KXN1bTsKK30KKyNlbmRpZgorCisjaWYgKExXSVBfQ0hLU1VNX0FMR09SSVRITSA9PSAzKSAvKiBBbHRlcm5hdGl2ZSB2ZXJzaW9uICMzICovCisvKioKKyAqIEFuIG9wdGltaXplZCBjaGVja3N1bSByb3V0aW5lLiBCYXNpY2FsbHksIGl0IHVzZXMgbG9vcC11bnJvbGxpbmcgb24KKyAqIHRoZSBjaGVja3N1bSBsb29wLCB0cmVhdGluZyB0aGUgaGVhZCBhbmQgdGFpbCBieXRlcyBzcGVjaWFsbHksIHdoZXJlYXMKKyAqIHRoZSBpbm5lciBsb29wIGFjdHMgb24gOCBieXRlcyBhdCBhIHRpbWUuIAorICoKKyAqIEBhcmcgc3RhcnQgb2YgYnVmZmVyIHRvIGJlIGNoZWNrc3VtbWVkLiBNYXkgYmUgYW4gb2RkIGJ5dGUgYWRkcmVzcy4KKyAqIEBsZW4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gYmUgY2hlY2tzdW1tZWQuCisgKiBAcmV0dXJuIGhvc3Qgb3JkZXIgKCEpIGx3aXAgY2hlY2tzdW0gKG5vbi1pbnZlcnRlZCBJbnRlcm5ldCBzdW0pIAorICogCisgKiBieSBDdXJ0IE1jRG93ZWxsLCBCcm9hZGNvbSBDb3JwLiBEZWNlbWJlciA4dGgsIDIwMDUKKyAqLworCitzdGF0aWMgdTE2X3QKK2x3aXBfc3RhbmRhcmRfY2hrc3VtKHZvaWQgKmRhdGFwdHIsIGludCBsZW4pCit7CisgIHU4X3QgKnBiID0gKHU4X3QgKilkYXRhcHRyOworICB1MTZfdCAqcHMsIHQgPSAwOworICB1MzJfdCAqcGw7CisgIHUzMl90IHN1bSA9IDAsIHRtcDsKKyAgLyogc3RhcnRzIGF0IG9kZCBieXRlIGFkZHJlc3M/ICovCisgIGludCBvZGQgPSAoKG1lbV9wdHJfdClwYiAmIDEpOworCisgIGlmIChvZGQgJiYgbGVuID4gMCkgeworICAgICgodThfdCAqKSZ0KVsxXSA9ICpwYisrOworICAgIGxlbi0tOworICB9CisKKyAgcHMgPSAodTE2X3QgKilwYjsKKworICBpZiAoKChtZW1fcHRyX3QpcHMgJiAzKSAmJiBsZW4gPiAxKSB7CisgICAgc3VtICs9ICpwcysrOworICAgIGxlbiAtPSAyOworICB9CisKKyAgcGwgPSAodTMyX3QgKilwczsKKworICB3aGlsZSAobGVuID4gNykgIHsKKyAgICB0bXAgPSBzdW0gKyAqcGwrKzsgICAgICAgICAgLyogcGluZyAqLworICAgIGlmICh0bXAgPCBzdW0pIHsKKyAgICAgIHRtcCsrOyAgICAgICAgICAgICAgICAgICAgLyogYWRkIGJhY2sgY2FycnkgKi8KKyAgICB9CisKKyAgICBzdW0gPSB0bXAgKyAqcGwrKzsgICAgICAgICAgLyogcG9uZyAqLworICAgIGlmIChzdW0gPCB0bXApIHsKKyAgICAgIHN1bSsrOyAgICAgICAgICAgICAgICAgICAgLyogYWRkIGJhY2sgY2FycnkgKi8KKyAgICB9CisKKyAgICBsZW4gLT0gODsKKyAgfQorCisgIC8qIG1ha2Ugcm9vbSBpbiB1cHBlciBiaXRzICovCisgIHN1bSA9IEZPTERfVTMyVChzdW0pOworCisgIHBzID0gKHUxNl90ICopcGw7CisKKyAgLyogMTYtYml0IGFsaWduZWQgd29yZCByZW1haW5pbmc/ICovCisgIHdoaWxlIChsZW4gPiAxKSB7CisgICAgc3VtICs9ICpwcysrOworICAgIGxlbiAtPSAyOworICB9CisKKyAgLyogZGFuZ2xpbmcgdGFpbCBieXRlIHJlbWFpbmluZz8gKi8KKyAgaWYgKGxlbiA+IDApIHsgICAgICAgICAgICAgICAgLyogaW5jbHVkZSBvZGQgYnl0ZSAqLworICAgICgodThfdCAqKSZ0KVswXSA9ICoodThfdCAqKXBzOworICB9CisKKyAgc3VtICs9IHQ7ICAgICAgICAgICAgICAgICAgICAgLyogYWRkIGVuZCBieXRlcyAqLworCisgIC8qIEZvbGQgMzItYml0IHN1bSB0byAxNiBiaXRzCisgICAgIGNhbGxpbmcgdGhpcyB0d2ljZSBpcyBwcm9wYWJseSBmYXN0ZXIgdGhhbiBpZiBzdGF0ZW1lbnRzLi4uICovCisgIHN1bSA9IEZPTERfVTMyVChzdW0pOworICBzdW0gPSBGT0xEX1UzMlQoc3VtKTsKKworICBpZiAob2RkKSB7CisgICAgc3VtID0gU1dBUF9CWVRFU19JTl9XT1JEKHN1bSk7CisgIH0KKworICByZXR1cm4gKHUxNl90KXN1bTsKK30KKyNlbmRpZgorCisvKiBpbmV0X2Noa3N1bV9wc2V1ZG86CisgKgorICogQ2FsY3VsYXRlcyB0aGUgcHNldWRvIEludGVybmV0IGNoZWNrc3VtIHVzZWQgYnkgVENQIGFuZCBVRFAgZm9yIGEgcGJ1ZiBjaGFpbi4KKyAqIElQIGFkZHJlc3NlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICoKKyAqIEBwYXJhbSBwIGNoYWluIG9mIHBidWZzIG92ZXIgdGhhdCBhIGNoZWNrc3VtIHNob3VsZCBiZSBjYWxjdWxhdGVkIChpcCBkYXRhIHBhcnQpCisgKiBAcGFyYW0gc3JjIHNvdXJjZSBpcCBhZGRyZXNzICh1c2VkIGZvciBjaGVja3N1bSBvZiBwc2V1ZG8gaGVhZGVyKQorICogQHBhcmFtIGRzdCBkZXN0aW5hdGlvbiBpcCBhZGRyZXNzICh1c2VkIGZvciBjaGVja3N1bSBvZiBwc2V1ZG8gaGVhZGVyKQorICogQHBhcmFtIHByb3RvIGlwIHByb3RvY29sICh1c2VkIGZvciBjaGVja3N1bSBvZiBwc2V1ZG8gaGVhZGVyKQorICogQHBhcmFtIHByb3RvX2xlbiBsZW5ndGggb2YgdGhlIGlwIGRhdGEgcGFydCAodXNlZCBmb3IgY2hlY2tzdW0gb2YgcHNldWRvIGhlYWRlcikKKyAqIEByZXR1cm4gY2hlY2tzdW0gKGFzIHUxNl90KSB0byBiZSBzYXZlZCBkaXJlY3RseSBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyCisgKi8KK3UxNl90CitpbmV0X2Noa3N1bV9wc2V1ZG8oc3RydWN0IHBidWYgKnAsCisgICAgICAgaXBfYWRkcl90ICpzcmMsIGlwX2FkZHJfdCAqZGVzdCwKKyAgICAgICB1OF90IHByb3RvLCB1MTZfdCBwcm90b19sZW4pCit7CisgIHUzMl90IGFjYzsKKyAgdTMyX3QgYWRkcjsKKyAgc3RydWN0IHBidWYgKnE7CisgIHU4X3Qgc3dhcHBlZDsKKworICBhY2MgPSAwOworICBzd2FwcGVkID0gMDsKKyAgLyogaXRlcmF0ZSB0aHJvdWdoIGFsbCBwYnVmIGluIGNoYWluICovCisgIGZvcihxID0gcDsgcSAhPSBOVUxMOyBxID0gcS0+bmV4dCkgeworICAgIExXSVBfREVCVUdGKElORVRfREVCVUcsICgiaW5ldF9jaGtzdW1fcHNldWRvKCk6IGNoZWNrc3VtbWluZyBwYnVmICVwIChoYXMgbmV4dCAlcCkgXG4iLAorICAgICAgKHZvaWQgKilxLCAodm9pZCAqKXEtPm5leHQpKTsKKyAgICBhY2MgKz0gTFdJUF9DSEtTVU0ocS0+cGF5bG9hZCwgcS0+bGVuKTsKKyAgICAvKkxXSVBfREVCVUdGKElORVRfREVCVUcsICgiaW5ldF9jaGtzdW1fcHNldWRvKCk6IHVud3JhcHBlZCBsd2lwX2Noa3N1bSgpPSUiWDMyX0YiIFxuIiwgYWNjKSk7Ki8KKyAgICAvKiBqdXN0IGV4ZWN1dGluZyB0aGlzIG5leHQgbGluZSBpcyBwcm9iYWJseSBmYXN0ZXIgdGhhdCB0aGUgaWYgc3RhdGVtZW50IG5lZWRlZAorICAgICAgIHRvIGNoZWNrIHdoZXRoZXIgd2UgcmVhbGx5IG5lZWQgdG8gZXhlY3V0ZSBpdCwgYW5kIGRvZXMgbm8gaGFybSAqLworICAgIGFjYyA9IEZPTERfVTMyVChhY2MpOworICAgIGlmIChxLT5sZW4gJSAyICE9IDApIHsKKyAgICAgIHN3YXBwZWQgPSAxIC0gc3dhcHBlZDsKKyAgICAgIGFjYyA9IFNXQVBfQllURVNfSU5fV09SRChhY2MpOworICAgIH0KKyAgICAvKkxXSVBfREVCVUdGKElORVRfREVCVUcsICgiaW5ldF9jaGtzdW1fcHNldWRvKCk6IHdyYXBwZWQgbHdpcF9jaGtzdW0oKT0lIlgzMl9GIiBcbiIsIGFjYykpOyovCisgIH0KKworICBpZiAoc3dhcHBlZCkgeworICAgIGFjYyA9IFNXQVBfQllURVNfSU5fV09SRChhY2MpOworICB9CisgIGFkZHIgPSBpcDRfYWRkcl9nZXRfdTMyKHNyYyk7CisgIGFjYyArPSAoYWRkciAmIDB4ZmZmZlVMKTsKKyAgYWNjICs9ICgoYWRkciA+PiAxNikgJiAweGZmZmZVTCk7CisgIGFkZHIgPSBpcDRfYWRkcl9nZXRfdTMyKGRlc3QpOworICBhY2MgKz0gKGFkZHIgJiAweGZmZmZVTCk7CisgIGFjYyArPSAoKGFkZHIgPj4gMTYpICYgMHhmZmZmVUwpOworICBhY2MgKz0gKHUzMl90KWh0b25zKCh1MTZfdClwcm90byk7CisgIGFjYyArPSAodTMyX3QpaHRvbnMocHJvdG9fbGVuKTsKKworICAvKiBGb2xkIDMyLWJpdCBzdW0gdG8gMTYgYml0cworICAgICBjYWxsaW5nIHRoaXMgdHdpY2UgaXMgcHJvcGFibHkgZmFzdGVyIHRoYW4gaWYgc3RhdGVtZW50cy4uLiAqLworICBhY2MgPSBGT0xEX1UzMlQoYWNjKTsKKyAgYWNjID0gRk9MRF9VMzJUKGFjYyk7CisgIExXSVBfREVCVUdGKElORVRfREVCVUcsICgiaW5ldF9jaGtzdW1fcHNldWRvKCk6IHBidWYgY2hhaW4gbHdpcF9jaGtzdW0oKT0lIlgzMl9GIlxuIiwgYWNjKSk7CisgIHJldHVybiAodTE2X3QpfihhY2MgJiAweGZmZmZVTCk7Cit9CisKKy8qIGluZXRfY2hrc3VtX3BzZXVkbzoKKyAqCisgKiBDYWxjdWxhdGVzIHRoZSBwc2V1ZG8gSW50ZXJuZXQgY2hlY2tzdW0gdXNlZCBieSBUQ1AgYW5kIFVEUCBmb3IgYSBwYnVmIGNoYWluLgorICogSVAgYWRkcmVzc2VzIGFyZSBleHBlY3RlZCB0byBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKgorICogQHBhcmFtIHAgY2hhaW4gb2YgcGJ1ZnMgb3ZlciB0aGF0IGEgY2hlY2tzdW0gc2hvdWxkIGJlIGNhbGN1bGF0ZWQgKGlwIGRhdGEgcGFydCkKKyAqIEBwYXJhbSBzcmMgc291cmNlIGlwIGFkZHJlc3MgKHVzZWQgZm9yIGNoZWNrc3VtIG9mIHBzZXVkbyBoZWFkZXIpCisgKiBAcGFyYW0gZHN0IGRlc3RpbmF0aW9uIGlwIGFkZHJlc3MgKHVzZWQgZm9yIGNoZWNrc3VtIG9mIHBzZXVkbyBoZWFkZXIpCisgKiBAcGFyYW0gcHJvdG8gaXAgcHJvdG9jb2wgKHVzZWQgZm9yIGNoZWNrc3VtIG9mIHBzZXVkbyBoZWFkZXIpCisgKiBAcGFyYW0gcHJvdG9fbGVuIGxlbmd0aCBvZiB0aGUgaXAgZGF0YSBwYXJ0ICh1c2VkIGZvciBjaGVja3N1bSBvZiBwc2V1ZG8gaGVhZGVyKQorICogQHJldHVybiBjaGVja3N1bSAoYXMgdTE2X3QpIHRvIGJlIHNhdmVkIGRpcmVjdGx5IGluIHRoZSBwcm90b2NvbCBoZWFkZXIKKyAqLwordTE2X3QKK2luZXRfY2hrc3VtX3BzZXVkb19wYXJ0aWFsKHN0cnVjdCBwYnVmICpwLAorICAgICAgIGlwX2FkZHJfdCAqc3JjLCBpcF9hZGRyX3QgKmRlc3QsCisgICAgICAgdThfdCBwcm90bywgdTE2X3QgcHJvdG9fbGVuLCB1MTZfdCBjaGtzdW1fbGVuKQoreworICB1MzJfdCBhY2M7CisgIHUzMl90IGFkZHI7CisgIHN0cnVjdCBwYnVmICpxOworICB1OF90IHN3YXBwZWQ7CisgIHUxNl90IGNoa2xlbjsKKworICBhY2MgPSAwOworICBzd2FwcGVkID0gMDsKKyAgLyogaXRlcmF0ZSB0aHJvdWdoIGFsbCBwYnVmIGluIGNoYWluICovCisgIGZvcihxID0gcDsgKHEgIT0gTlVMTCkgJiYgKGNoa3N1bV9sZW4gPiAwKTsgcSA9IHEtPm5leHQpIHsKKyAgICBMV0lQX0RFQlVHRihJTkVUX0RFQlVHLCAoImluZXRfY2hrc3VtX3BzZXVkbygpOiBjaGVja3N1bW1pbmcgcGJ1ZiAlcCAoaGFzIG5leHQgJXApIFxuIiwKKyAgICAgICh2b2lkICopcSwgKHZvaWQgKilxLT5uZXh0KSk7CisgICAgY2hrbGVuID0gcS0+bGVuOworICAgIGlmIChjaGtsZW4gPiBjaGtzdW1fbGVuKSB7CisgICAgICBjaGtsZW4gPSBjaGtzdW1fbGVuOworICAgIH0KKyAgICBhY2MgKz0gTFdJUF9DSEtTVU0ocS0+cGF5bG9hZCwgY2hrbGVuKTsKKyAgICBjaGtzdW1fbGVuIC09IGNoa2xlbjsKKyAgICBMV0lQX0FTU0VSVCgiZGVsZXRlIG1lIiwgY2hrc3VtX2xlbiA8IDB4N2ZmZik7CisgICAgLypMV0lQX0RFQlVHRihJTkVUX0RFQlVHLCAoImluZXRfY2hrc3VtX3BzZXVkbygpOiB1bndyYXBwZWQgbHdpcF9jaGtzdW0oKT0lIlgzMl9GIiBcbiIsIGFjYykpOyovCisgICAgLyogZm9sZCB0aGUgdXBwZXIgYml0IGRvd24gKi8KKyAgICBhY2MgPSBGT0xEX1UzMlQoYWNjKTsKKyAgICBpZiAocS0+bGVuICUgMiAhPSAwKSB7CisgICAgICBzd2FwcGVkID0gMSAtIHN3YXBwZWQ7CisgICAgICBhY2MgPSBTV0FQX0JZVEVTX0lOX1dPUkQoYWNjKTsKKyAgICB9CisgICAgLypMV0lQX0RFQlVHRihJTkVUX0RFQlVHLCAoImluZXRfY2hrc3VtX3BzZXVkbygpOiB3cmFwcGVkIGx3aXBfY2hrc3VtKCk9JSJYMzJfRiIgXG4iLCBhY2MpKTsqLworICB9CisKKyAgaWYgKHN3YXBwZWQpIHsKKyAgICBhY2MgPSBTV0FQX0JZVEVTX0lOX1dPUkQoYWNjKTsKKyAgfQorICBhZGRyID0gaXA0X2FkZHJfZ2V0X3UzMihzcmMpOworICBhY2MgKz0gKGFkZHIgJiAweGZmZmZVTCk7CisgIGFjYyArPSAoKGFkZHIgPj4gMTYpICYgMHhmZmZmVUwpOworICBhZGRyID0gaXA0X2FkZHJfZ2V0X3UzMihkZXN0KTsKKyAgYWNjICs9IChhZGRyICYgMHhmZmZmVUwpOworICBhY2MgKz0gKChhZGRyID4+IDE2KSAmIDB4ZmZmZlVMKTsKKyAgYWNjICs9ICh1MzJfdClodG9ucygodTE2X3QpcHJvdG8pOworICBhY2MgKz0gKHUzMl90KWh0b25zKHByb3RvX2xlbik7CisKKyAgLyogRm9sZCAzMi1iaXQgc3VtIHRvIDE2IGJpdHMKKyAgICAgY2FsbGluZyB0aGlzIHR3aWNlIGlzIHByb3BhYmx5IGZhc3RlciB0aGFuIGlmIHN0YXRlbWVudHMuLi4gKi8KKyAgYWNjID0gRk9MRF9VMzJUKGFjYyk7CisgIGFjYyA9IEZPTERfVTMyVChhY2MpOworICBMV0lQX0RFQlVHRihJTkVUX0RFQlVHLCAoImluZXRfY2hrc3VtX3BzZXVkbygpOiBwYnVmIGNoYWluIGx3aXBfY2hrc3VtKCk9JSJYMzJfRiJcbiIsIGFjYykpOworICByZXR1cm4gKHUxNl90KX4oYWNjICYgMHhmZmZmVUwpOworfQorCisvKiBpbmV0X2Noa3N1bToKKyAqCisgKiBDYWxjdWxhdGVzIHRoZSBJbnRlcm5ldCBjaGVja3N1bSBvdmVyIGEgcG9ydGlvbiBvZiBtZW1vcnkuIFVzZWQgcHJpbWFyaWx5IGZvciBJUAorICogYW5kIElDTVAuCisgKgorICogQHBhcmFtIGRhdGFwdHIgc3RhcnQgb2YgdGhlIGJ1ZmZlciB0byBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtIChubyBhbGlnbm1lbnQgbmVlZGVkKQorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtCisgKiBAcmV0dXJuIGNoZWNrc3VtIChhcyB1MTZfdCkgdG8gYmUgc2F2ZWQgZGlyZWN0bHkgaW4gdGhlIHByb3RvY29sIGhlYWRlcgorICovCisKK3UxNl90CitpbmV0X2Noa3N1bSh2b2lkICpkYXRhcHRyLCB1MTZfdCBsZW4pCit7CisgIHJldHVybiB+TFdJUF9DSEtTVU0oZGF0YXB0ciwgbGVuKTsKK30KKworLyoqCisgKiBDYWxjdWxhdGUgYSBjaGVja3N1bSBvdmVyIGEgY2hhaW4gb2YgcGJ1ZnMgKHdpdGhvdXQgcHNldWRvLWhlYWRlciwgbXVjaCBsaWtlCisgKiBpbmV0X2Noa3N1bSBvbmx5IHBidWZzIGFyZSB1c2VkKS4KKyAqCisgKiBAcGFyYW0gcCBwYnVmIGNoYWluIG92ZXIgdGhhdCB0aGUgY2hlY2tzdW0gc2hvdWxkIGJlIGNhbGN1bGF0ZWQKKyAqIEByZXR1cm4gY2hlY2tzdW0gKGFzIHUxNl90KSB0byBiZSBzYXZlZCBkaXJlY3RseSBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyCisgKi8KK3UxNl90CitpbmV0X2Noa3N1bV9wYnVmKHN0cnVjdCBwYnVmICpwKQoreworICB1MzJfdCBhY2M7CisgIHN0cnVjdCBwYnVmICpxOworICB1OF90IHN3YXBwZWQ7CisKKyAgYWNjID0gMDsKKyAgc3dhcHBlZCA9IDA7CisgIGZvcihxID0gcDsgcSAhPSBOVUxMOyBxID0gcS0+bmV4dCkgeworICAgIGFjYyArPSBMV0lQX0NIS1NVTShxLT5wYXlsb2FkLCBxLT5sZW4pOworICAgIGFjYyA9IEZPTERfVTMyVChhY2MpOworICAgIGlmIChxLT5sZW4gJSAyICE9IDApIHsKKyAgICAgIHN3YXBwZWQgPSAxIC0gc3dhcHBlZDsKKyAgICAgIGFjYyA9IFNXQVBfQllURVNfSU5fV09SRChhY2MpOworICAgIH0KKyAgfQorCisgIGlmIChzd2FwcGVkKSB7CisgICAgYWNjID0gU1dBUF9CWVRFU19JTl9XT1JEKGFjYyk7CisgIH0KKyAgcmV0dXJuICh1MTZfdCl+KGFjYyAmIDB4ZmZmZlVMKTsKK30KKworLyogVGhlc2UgYXJlIHNvbWUgaW1wbGVtZW50YXRpb25zIGZvciBMV0lQX0NIS1NVTV9DT1BZLCB3aGljaCBjb3BpZXMgZGF0YQorICogbGlrZSBNRU1DUFkgYnV0IGdlbmVyYXRlcyBhIGNoZWNrc3VtIGF0IHRoZSBzYW1lIHRpbWUuIFNpbmNlIHRoaXMgaXMgYQorICogcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIGZ1bmN0aW9uLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgeW91ciBvd24gdmVyc2lvbgorICogaW4gYXNzZW1ibHkgdGFyZ2V0ZWQgYXQgeW91ciBoYXJkd2FyZSBieSBkZWZpbmluZyBpdCBpbiBsd2lwb3B0cy5oOgorICogICAjZGVmaW5lIExXSVBfQ0hLU1VNX0NPUFkoZHN0LCBzcmMsIGxlbikgeW91cl9jaGtzdW1fY29weShkc3QsIHNyYywgbGVuKQorICovCisKKyNpZiAoTFdJUF9DSEtTVU1fQ09QWV9BTEdPUklUSE0gPT0gMSkgLyogVmVyc2lvbiAjMSAqLworLyoqIFNhZmUgYnV0IHNsb3c6IGZpcnN0IGNhbGwgTUVNQ1BZLCB0aGVuIGNhbGwgTFdJUF9DSEtTVU0uCisgKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGJpZyBjYWNoZXMsIGRhdGEgbWlnaHQgc3RpbGwgYmUgaW4gY2FjaGUgd2hlbgorICogZ2VuZXJhdGluZyB0aGUgY2hlY2tzdW0gYWZ0ZXIgY29weWluZy4KKyAqLwordTE2X3QKK2x3aXBfY2hrc3VtX2NvcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHUxNl90IGxlbikKK3sKKyAgTUVNQ1BZKGRzdCwgc3JjLCBsZW4pOworICByZXR1cm4gTFdJUF9DSEtTVU0oZHN0LCBsZW4pOworfQorI2VuZGlmIC8qIChMV0lQX0NIS1NVTV9DT1BZX0FMR09SSVRITSA9PSAxKSAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaXAuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS9pcHY0L2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyNDg3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvY29yZS9pcHY0L2lwLmMKQEAgLTAsMCArMSw4NTcgQEAKKy8qKgorICogQGZpbGUKKyAqIFRoaXMgaXMgdGhlIElQdjQgbGF5ZXIgaW1wbGVtZW50YXRpb24gZm9yIGluY29taW5nIGFuZCBvdXRnb2luZyBJUCB0cmFmZmljLgorICogCisgKiBAc2VlIGlwX2ZyYWcuYworICoKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKgorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisjaW5jbHVkZSAibHdpcC9pcC5oIgorI2luY2x1ZGUgImx3aXAvZGVmLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL2lwX2ZyYWcuaCIKKyNpbmNsdWRlICJsd2lwL2luZXRfY2hrc3VtLmgiCisjaW5jbHVkZSAibHdpcC9uZXRpZi5oIgorI2luY2x1ZGUgImx3aXAvaWNtcC5oIgorI2luY2x1ZGUgImx3aXAvaWdtcC5oIgorI2luY2x1ZGUgImx3aXAvcmF3LmgiCisjaW5jbHVkZSAibHdpcC91ZHAuaCIKKyNpbmNsdWRlICJsd2lwL3RjcF9pbXBsLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wLmgiCisjaW5jbHVkZSAibHdpcC9kaGNwLmgiCisjaW5jbHVkZSAibHdpcC9hdXRvaXAuaCIKKyNpbmNsdWRlICJsd2lwL3N0YXRzLmgiCisjaW5jbHVkZSAiYXJjaC9wZXJmLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqIFNldCB0aGlzIHRvIDAgaW4gdGhlIHJhcmUgY2FzZSBvZiB3YW50aW5nIHRvIGNhbGwgYW4gZXh0cmEgZnVuY3Rpb24gdG8KKyAqIGdlbmVyYXRlIHRoZSBJUCBjaGVja3N1bSAoaW4gY29udHJhc3QgdG8gY2FsY3VsYXRpbmcgaXQgb24tdGhlLWZseSkuICovCisjaWZuZGVmIExXSVBfSU5MSU5FX0lQX0NIS1NVTQorI2RlZmluZSBMV0lQX0lOTElORV9JUF9DSEtTVU0gICAxCisjZW5kaWYKKyNpZiBMV0lQX0lOTElORV9JUF9DSEtTVU0gJiYgQ0hFQ0tTVU1fR0VOX0lQCisjZGVmaW5lIENIRUNLU1VNX0dFTl9JUF9JTkxJTkUgIDEKKyNlbHNlCisjZGVmaW5lIENIRUNLU1VNX0dFTl9JUF9JTkxJTkUgIDAKKyNlbmRpZgorCisjaWYgTFdJUF9ESENQIHx8IGRlZmluZWQoTFdJUF9JUF9BQ0NFUFRfVURQX1BPUlQpCisjZGVmaW5lIElQX0FDQ0VQVF9MSU5LX0xBWUVSX0FERFJFU1NJTkcgMQorCisvKiogU29tZSBkZWZpbmVzIGZvciBESENQIHRvIGxldCBsaW5rLWxheWVyLWFkZHJlc3NlZCBwYWNrZXRzIHRocm91Z2ggd2hpbGUgdGhlCisgKiBuZXRpZiBpcyBkb3duLgorICogVG8gdXNlIHRoaXMgaW4geW91ciBvd24gYXBwbGljYXRpb24vcHJvdG9jb2wsIGRlZmluZSBMV0lQX0lQX0FDQ0VQVF9VRFBfUE9SVAorICogdG8gcmV0dXJuIDEgaWYgdGhlIHBvcnQgaXMgYWNjZXB0ZWQgYW5kIDAgaWYgdGhlIHBvcnQgaXMgbm90IGFjY2VwdGVkLgorICovCisjaWYgTFdJUF9ESENQICYmIGRlZmluZWQoTFdJUF9JUF9BQ0NFUFRfVURQX1BPUlQpCisvKiBhY2NlcHQgREhDUCBjbGllbnQgcG9ydCBhbmQgY3VzdG9tIHBvcnQgKi8KKyNkZWZpbmUgSVBfQUNDRVBUX0xJTktfTEFZRVJfQUREUkVTU0VEX1BPUlQocG9ydCkgKCgocG9ydCkgPT0gUFBfTlRPSFMoREhDUF9DTElFTlRfUE9SVCkpIFwKKyAgICAgICAgIHx8IChMV0lQX0lQX0FDQ0VQVF9VRFBfUE9SVChwb3J0KSkpCisjZWxpZiBkZWZpbmVkKExXSVBfSVBfQUNDRVBUX1VEUF9QT1JUKSAvKiBMV0lQX0RIQ1AgJiYgZGVmaW5lZChMV0lQX0lQX0FDQ0VQVF9VRFBfUE9SVCkgKi8KKy8qIGFjY2VwdCBjdXN0b20gcG9ydCBvbmx5ICovCisjZGVmaW5lIElQX0FDQ0VQVF9MSU5LX0xBWUVSX0FERFJFU1NFRF9QT1JUKHBvcnQpIChMV0lQX0lQX0FDQ0VQVF9VRFBfUE9SVChkc3RfcG9ydCkpCisjZWxzZSAvKiBMV0lQX0RIQ1AgJiYgZGVmaW5lZChMV0lQX0lQX0FDQ0VQVF9VRFBfUE9SVCkgKi8KKy8qIGFjY2VwdCBESENQIGNsaWVudCBwb3J0IG9ubHkgKi8KKyNkZWZpbmUgSVBfQUNDRVBUX0xJTktfTEFZRVJfQUREUkVTU0VEX1BPUlQocG9ydCkgKChwb3J0KSA9PSBQUF9OVE9IUyhESENQX0NMSUVOVF9QT1JUKSkKKyNlbmRpZiAvKiBMV0lQX0RIQ1AgJiYgZGVmaW5lZChMV0lQX0lQX0FDQ0VQVF9VRFBfUE9SVCkgKi8KKworI2Vsc2UgLyogTFdJUF9ESENQICovCisjZGVmaW5lIElQX0FDQ0VQVF9MSU5LX0xBWUVSX0FERFJFU1NJTkcgMAorI2VuZGlmIC8qIExXSVBfREhDUCAqLworCisvKioKKyAqIFRoZSBpbnRlcmZhY2UgdGhhdCBwcm92aWRlZCB0aGUgcGFja2V0IGZvciB0aGUgY3VycmVudCBjYWxsYmFjaworICogaW52b2NhdGlvbi4KKyAqLworc3RydWN0IG5ldGlmICpjdXJyZW50X25ldGlmOworCisvKioKKyAqIEhlYWRlciBvZiB0aGUgaW5wdXQgcGFja2V0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuCisgKi8KK2NvbnN0IHN0cnVjdCBpcF9oZHIgKmN1cnJlbnRfaGVhZGVyOworLyoqIFNvdXJjZSBJUCBhZGRyZXNzIG9mIGN1cnJlbnRfaGVhZGVyICovCitpcF9hZGRyX3QgY3VycmVudF9pcGhkcl9zcmM7CisvKiogRGVzdGluYXRpb24gSVAgYWRkcmVzcyBvZiBjdXJyZW50X2hlYWRlciAqLworaXBfYWRkcl90IGN1cnJlbnRfaXBoZHJfZGVzdDsKKworLyoqIFRoZSBJUCBoZWFkZXIgSUQgb2YgdGhlIG5leHQgb3V0Z29pbmcgSVAgcGFja2V0ICovCitzdGF0aWMgdTE2X3QgaXBfaWQ7CisKKy8qKgorICogRmluZHMgdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgaW50ZXJmYWNlIGZvciBhIGdpdmVuIElQIGFkZHJlc3MuIEl0CisgKiBzZWFyY2hlcyB0aGUgbGlzdCBvZiBuZXR3b3JrIGludGVyZmFjZXMgbGluZWFybHkuIEEgbWF0Y2ggaXMgZm91bmQKKyAqIGlmIHRoZSBtYXNrZWQgSVAgYWRkcmVzcyBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgZXF1YWxzIHRoZSBtYXNrZWQKKyAqIElQIGFkZHJlc3MgZ2l2ZW4gdG8gdGhlIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzIGZvciB3aGljaCB0byBmaW5kIHRoZSByb3V0ZQorICogQHJldHVybiB0aGUgbmV0aWYgb24gd2hpY2ggdG8gc2VuZCB0byByZWFjaCBkZXN0CisgKi8KK3N0cnVjdCBuZXRpZiAqCitpcF9yb3V0ZShpcF9hZGRyX3QgKmRlc3QpCit7CisgIHN0cnVjdCBuZXRpZiAqbmV0aWY7CisKKyAgLyogaXRlcmF0ZSB0aHJvdWdoIG5ldGlmcyAqLworICBmb3IobmV0aWYgPSBuZXRpZl9saXN0OyBuZXRpZiAhPSBOVUxMOyBuZXRpZiA9IG5ldGlmLT5uZXh0KSB7CisgICAgLyogbmV0d29yayBtYXNrIG1hdGNoZXM/ICovCisgICAgaWYgKG5ldGlmX2lzX3VwKG5ldGlmKSkgeworICAgICAgaWYgKGlwX2FkZHJfbmV0Y21wKGRlc3QsICYobmV0aWYtPmlwX2FkZHIpLCAmKG5ldGlmLT5uZXRtYXNrKSkpIHsKKyAgICAgICAgLyogcmV0dXJuIG5ldGlmIG9uIHdoaWNoIHRvIGZvcndhcmQgSVAgcGFja2V0ICovCisgICAgICAgIHJldHVybiBuZXRpZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKChuZXRpZl9kZWZhdWx0ID09IE5VTEwpIHx8ICghbmV0aWZfaXNfdXAobmV0aWZfZGVmYXVsdCkpKSB7CisgICAgTFdJUF9ERUJVR0YoSVBfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLCAoImlwX3JvdXRlOiBObyByb3V0ZSB0byAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICAgIGlwNF9hZGRyMV8xNihkZXN0KSwgaXA0X2FkZHIyXzE2KGRlc3QpLCBpcDRfYWRkcjNfMTYoZGVzdCksIGlwNF9hZGRyNF8xNihkZXN0KSkpOworICAgIElQX1NUQVRTX0lOQyhpcC5ydGVycik7CisgICAgc25tcF9pbmNfaXBvdXRub3JvdXRlcygpOworICAgIHJldHVybiBOVUxMOworICB9CisgIC8qIG5vIG1hdGNoaW5nIG5ldGlmIGZvdW5kLCB1c2UgZGVmYXVsdCBuZXRpZiAqLworICByZXR1cm4gbmV0aWZfZGVmYXVsdDsKK30KKworI2lmIElQX0ZPUldBUkQKKy8qKgorICogRm9yd2FyZHMgYW4gSVAgcGFja2V0LiBJdCBmaW5kcyBhbiBhcHByb3ByaWF0ZSByb3V0ZSBmb3IgdGhlCisgKiBwYWNrZXQsIGRlY3JlbWVudHMgdGhlIFRUTCB2YWx1ZSBvZiB0aGUgcGFja2V0LCBhZGp1c3RzIHRoZQorICogY2hlY2tzdW0gYW5kIG91dHB1dHMgdGhlIHBhY2tldCBvbiB0aGUgYXBwcm9wcmlhdGUgaW50ZXJmYWNlLgorICoKKyAqIEBwYXJhbSBwIHRoZSBwYWNrZXQgdG8gZm9yd2FyZCAocC0+cGF5bG9hZCBwb2ludHMgdG8gSVAgaGVhZGVyKQorICogQHBhcmFtIGlwaGRyIHRoZSBJUCBoZWFkZXIgb2YgdGhlIGlucHV0IHBhY2tldAorICogQHBhcmFtIGlucCB0aGUgbmV0aWYgb24gd2hpY2ggdGhpcyBwYWNrZXQgd2FzIHJlY2VpdmVkCisgKi8KK3N0YXRpYyB2b2lkCitpcF9mb3J3YXJkKHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgaXBfaGRyICppcGhkciwgc3RydWN0IG5ldGlmICppbnApCit7CisgIHN0cnVjdCBuZXRpZiAqbmV0aWY7CisKKyAgUEVSRl9TVEFSVDsKKworICAvKiBSRkMzOTI3IDIuNzogZG8gbm90IGZvcndhcmQgbGluay1sb2NhbCBhZGRyZXNzZXMgKi8KKyAgaWYgKGlwX2FkZHJfaXNsaW5rbG9jYWwoJmN1cnJlbnRfaXBoZHJfZGVzdCkpIHsKKyAgICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJpcF9mb3J3YXJkOiBub3QgZm9yd2FyZGluZyBMTEEgJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiJcbiIsCisgICAgICBpcDRfYWRkcjFfMTYoJmN1cnJlbnRfaXBoZHJfZGVzdCksIGlwNF9hZGRyMl8xNigmY3VycmVudF9pcGhkcl9kZXN0KSwKKyAgICAgIGlwNF9hZGRyM18xNigmY3VycmVudF9pcGhkcl9kZXN0KSwgaXA0X2FkZHI0XzE2KCZjdXJyZW50X2lwaGRyX2Rlc3QpKSk7CisgICAgZ290byByZXR1cm5fbm9yb3V0ZTsKKyAgfQorCisgIC8qIEZpbmQgbmV0d29yayBpbnRlcmZhY2Ugd2hlcmUgdG8gZm9yd2FyZCB0aGlzIElQIHBhY2tldCB0by4gKi8KKyAgbmV0aWYgPSBpcF9yb3V0ZSgmY3VycmVudF9pcGhkcl9kZXN0KTsKKyAgaWYgKG5ldGlmID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJpcF9mb3J3YXJkOiBubyBmb3J3YXJkaW5nIHJvdXRlIGZvciAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIiBmb3VuZFxuIiwKKyAgICAgIGlwNF9hZGRyMV8xNigmY3VycmVudF9pcGhkcl9kZXN0KSwgaXA0X2FkZHIyXzE2KCZjdXJyZW50X2lwaGRyX2Rlc3QpLAorICAgICAgaXA0X2FkZHIzXzE2KCZjdXJyZW50X2lwaGRyX2Rlc3QpLCBpcDRfYWRkcjRfMTYoJmN1cnJlbnRfaXBoZHJfZGVzdCkpKTsKKyAgICBnb3RvIHJldHVybl9ub3JvdXRlOworICB9CisgIC8qIERvIG5vdCBmb3J3YXJkIHBhY2tldHMgb250byB0aGUgc2FtZSBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaAorICAgKiB0aGV5IGFycml2ZWQuICovCisgIGlmIChuZXRpZiA9PSBpbnApIHsKKyAgICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJpcF9mb3J3YXJkOiBub3QgYm91bmNpbmcgcGFja2V0cyBiYWNrIG9uIGluY29taW5nIGludGVyZmFjZS5cbiIpKTsKKyAgICBnb3RvIHJldHVybl9ub3JvdXRlOworICB9CisKKyAgLyogZGVjcmVtZW50IFRUTCAqLworICBJUEhfVFRMX1NFVChpcGhkciwgSVBIX1RUTChpcGhkcikgLSAxKTsKKyAgLyogc2VuZCBJQ01QIGlmIFRUTCA9PSAwICovCisgIGlmIChJUEhfVFRMKGlwaGRyKSA9PSAwKSB7CisgICAgc25tcF9pbmNfaXBpbmhkcmVycm9ycygpOworI2lmIExXSVBfSUNNUAorICAgIC8qIERvbid0IHNlbmQgSUNNUCBtZXNzYWdlcyBpbiByZXNwb25zZSB0byBJQ01QIG1lc3NhZ2VzICovCisgICAgaWYgKElQSF9QUk9UTyhpcGhkcikgIT0gSVBfUFJPVE9fSUNNUCkgeworICAgICAgaWNtcF90aW1lX2V4Y2VlZGVkKHAsIElDTVBfVEVfVFRMKTsKKyAgICB9CisjZW5kaWYgLyogTFdJUF9JQ01QICovCisgICAgcmV0dXJuOworICB9CisKKyAgLyogSW5jcmVtZW50YWxseSB1cGRhdGUgdGhlIElQIGNoZWNrc3VtLiAqLworICBpZiAoSVBIX0NIS1NVTShpcGhkcikgPj0gUFBfSFRPTlMoMHhmZmZmVSAtIDB4MTAwKSkgeworICAgIElQSF9DSEtTVU1fU0VUKGlwaGRyLCBJUEhfQ0hLU1VNKGlwaGRyKSArIFBQX0hUT05TKDB4MTAwKSArIDEpOworICB9IGVsc2UgeworICAgIElQSF9DSEtTVU1fU0VUKGlwaGRyLCBJUEhfQ0hLU1VNKGlwaGRyKSArIFBQX0hUT05TKDB4MTAwKSk7CisgIH0KKworICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJpcF9mb3J3YXJkOiBmb3J3YXJkaW5nIHBhY2tldCB0byAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICBpcDRfYWRkcjFfMTYoJmN1cnJlbnRfaXBoZHJfZGVzdCksIGlwNF9hZGRyMl8xNigmY3VycmVudF9pcGhkcl9kZXN0KSwKKyAgICBpcDRfYWRkcjNfMTYoJmN1cnJlbnRfaXBoZHJfZGVzdCksIGlwNF9hZGRyNF8xNigmY3VycmVudF9pcGhkcl9kZXN0KSkpOworCisgIElQX1NUQVRTX0lOQyhpcC5mdyk7CisgIElQX1NUQVRTX0lOQyhpcC54bWl0KTsKKyAgc25tcF9pbmNfaXBmb3J3ZGF0YWdyYW1zKCk7CisKKyAgUEVSRl9TVE9QKCJpcF9mb3J3YXJkIik7CisgIC8qIHRyYW5zbWl0IHBidWYgb24gY2hvc2VuIGludGVyZmFjZSAqLworICBuZXRpZi0+b3V0cHV0KG5ldGlmLCBwLCAmY3VycmVudF9pcGhkcl9kZXN0KTsKKyAgcmV0dXJuOworcmV0dXJuX25vcm91dGU6CisgIHNubXBfaW5jX2lwb3V0bm9yb3V0ZXMoKTsKK30KKyNlbmRpZiAvKiBJUF9GT1JXQVJEICovCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBkcml2ZXIgd2hlbgorICogYW4gSVAgcGFja2V0IGlzIHJlY2VpdmVkLiBUaGUgZnVuY3Rpb24gZG9lcyB0aGUgYmFzaWMgY2hlY2tzIG9mIHRoZQorICogSVAgaGVhZGVyIHN1Y2ggYXMgcGFja2V0IHNpemUgYmVpbmcgYXQgbGVhc3QgbGFyZ2VyIHRoYW4gdGhlIGhlYWRlcgorICogc2l6ZSBldGMuIElmIHRoZSBwYWNrZXQgd2FzIG5vdCBkZXN0aW5lZCBmb3IgdXMsIHRoZSBwYWNrZXQgaXMKKyAqIGZvcndhcmRlZCAodXNpbmcgaXBfZm9yd2FyZCkuIFRoZSBJUCBjaGVja3N1bSBpcyBhbHdheXMgY2hlY2tlZC4KKyAqCisgKiBGaW5hbGx5LCB0aGUgcGFja2V0IGlzIHNlbnQgdG8gdGhlIHVwcGVyIGxheWVyIHByb3RvY29sIGlucHV0IGZ1bmN0aW9uLgorICogCisgKiBAcGFyYW0gcCB0aGUgcmVjZWl2ZWQgSVAgcGFja2V0IChwLT5wYXlsb2FkIHBvaW50cyB0byBJUCBoZWFkZXIpCisgKiBAcGFyYW0gaW5wIHRoZSBuZXRpZiBvbiB3aGljaCB0aGlzIHBhY2tldCB3YXMgcmVjZWl2ZWQKKyAqIEByZXR1cm4gRVJSX09LIGlmIHRoZSBwYWNrZXQgd2FzIHByb2Nlc3NlZCAoY291bGQgcmV0dXJuIEVSUl8qIGlmIGl0IHdhc24ndAorICogICAgICAgICBwcm9jZXNzZWQsIGJ1dCBjdXJyZW50bHkgYWx3YXlzIHJldHVybnMgRVJSX09LKQorICovCitlcnJfdAoraXBfaW5wdXQoc3RydWN0IHBidWYgKnAsIHN0cnVjdCBuZXRpZiAqaW5wKQoreworICBzdHJ1Y3QgaXBfaGRyICppcGhkcjsKKyAgc3RydWN0IG5ldGlmICpuZXRpZjsKKyAgdTE2X3QgaXBoZHJfaGxlbjsKKyAgdTE2X3QgaXBoZHJfbGVuOworI2lmIElQX0FDQ0VQVF9MSU5LX0xBWUVSX0FERFJFU1NJTkcKKyAgaW50IGNoZWNrX2lwX3NyYz0xOworI2VuZGlmIC8qIElQX0FDQ0VQVF9MSU5LX0xBWUVSX0FERFJFU1NJTkcgKi8KKworICBJUF9TVEFUU19JTkMoaXAucmVjdik7CisgIHNubXBfaW5jX2lwaW5yZWNlaXZlcygpOworCisgIC8qIGlkZW50aWZ5IHRoZSBJUCBoZWFkZXIgKi8KKyAgaXBoZHIgPSAoc3RydWN0IGlwX2hkciAqKXAtPnBheWxvYWQ7CisgIGlmIChJUEhfVihpcGhkcikgIT0gNCkgeworICAgIExXSVBfREVCVUdGKElQX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywgKCJJUCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gYmFkIHZlcnNpb24gbnVtYmVyICUiVTE2X0YiXG4iLCBJUEhfVihpcGhkcikpKTsKKyAgICBpcF9kZWJ1Z19wcmludChwKTsKKyAgICBwYnVmX2ZyZWUocCk7CisgICAgSVBfU1RBVFNfSU5DKGlwLmVycik7CisgICAgSVBfU1RBVFNfSU5DKGlwLmRyb3ApOworICAgIHNubXBfaW5jX2lwaW5oZHJlcnJvcnMoKTsKKyAgICByZXR1cm4gRVJSX09LOworICB9CisKKyAgLyogb2J0YWluIElQIGhlYWRlciBsZW5ndGggaW4gbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyAqLworICBpcGhkcl9obGVuID0gSVBIX0hMKGlwaGRyKTsKKyAgLyogY2FsY3VsYXRlIElQIGhlYWRlciBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgaXBoZHJfaGxlbiAqPSA0OworICAvKiBvYnRhaW4gaXAgbGVuZ3RoIGluIGJ5dGVzICovCisgIGlwaGRyX2xlbiA9IG50b2hzKElQSF9MRU4oaXBoZHIpKTsKKworICAvKiBoZWFkZXIgbGVuZ3RoIGV4Y2VlZHMgZmlyc3QgcGJ1ZiBsZW5ndGgsIG9yIGlwIGxlbmd0aCBleGNlZWRzIHRvdGFsIHBidWYgbGVuZ3RoPyAqLworICBpZiAoKGlwaGRyX2hsZW4gPiBwLT5sZW4pIHx8IChpcGhkcl9sZW4gPiBwLT50b3RfbGVuKSkgeworICAgIGlmIChpcGhkcl9obGVuID4gcC0+bGVuKSB7CisgICAgICBMV0lQX0RFQlVHRihJUF9ERUJVRyB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsCisgICAgICAgICgiSVAgaGVhZGVyIChsZW4gJSJVMTZfRiIpIGRvZXMgbm90IGZpdCBpbiBmaXJzdCBwYnVmIChsZW4gJSJVMTZfRiIpLCBJUCBwYWNrZXQgZHJvcHBlZC5cbiIsCisgICAgICAgIGlwaGRyX2hsZW4sIHAtPmxlbikpOworICAgIH0KKyAgICBpZiAoaXBoZHJfbGVuID4gcC0+dG90X2xlbikgeworICAgICAgTFdJUF9ERUJVR0YoSVBfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgICAoIklQIChsZW4gJSJVMTZfRiIpIGlzIGxvbmdlciB0aGFuIHBidWYgKGxlbiAlIlUxNl9GIiksIElQIHBhY2tldCBkcm9wcGVkLlxuIiwKKyAgICAgICAgaXBoZHJfbGVuLCBwLT50b3RfbGVuKSk7CisgICAgfQorICAgIC8qIGZyZWUgKGRyb3ApIHBhY2tldCBwYnVmcyAqLworICAgIHBidWZfZnJlZShwKTsKKyAgICBJUF9TVEFUU19JTkMoaXAubGVuZXJyKTsKKyAgICBJUF9TVEFUU19JTkMoaXAuZHJvcCk7CisgICAgc25tcF9pbmNfaXBpbmRpc2NhcmRzKCk7CisgICAgcmV0dXJuIEVSUl9PSzsKKyAgfQorCisgIC8qIHZlcmlmeSBjaGVja3N1bSAqLworI2lmIENIRUNLU1VNX0NIRUNLX0lQCisgIGlmIChpbmV0X2Noa3N1bShpcGhkciwgaXBoZHJfaGxlbikgIT0gMCkgeworCisgICAgTFdJUF9ERUJVR0YoSVBfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgKCJDaGVja3N1bSAoMHglIlgxNl9GIikgZmFpbGVkLCBJUCBwYWNrZXQgZHJvcHBlZC5cbiIsIGluZXRfY2hrc3VtKGlwaGRyLCBpcGhkcl9obGVuKSkpOworICAgIGlwX2RlYnVnX3ByaW50KHApOworICAgIHBidWZfZnJlZShwKTsKKyAgICBJUF9TVEFUU19JTkMoaXAuY2hrZXJyKTsKKyAgICBJUF9TVEFUU19JTkMoaXAuZHJvcCk7CisgICAgc25tcF9pbmNfaXBpbmhkcmVycm9ycygpOworICAgIHJldHVybiBFUlJfT0s7CisgIH0KKyNlbmRpZgorCisgIC8qIFRyaW0gcGJ1Zi4gVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRvbmUgYXQgdGhlIG5ldGlmIGxheWVyLAorICAgKiBidXQgd2UnbGwgZG8gaXQgYW55d2F5IGp1c3QgdG8gYmUgc3VyZSB0aGF0IGl0cyBkb25lLiAqLworICBwYnVmX3JlYWxsb2MocCwgaXBoZHJfbGVuKTsKKworICAvKiBjb3B5IElQIGFkZHJlc3NlcyB0byBhbGlnbmVkIGlwX2FkZHJfdCAqLworICBpcF9hZGRyX2NvcHkoY3VycmVudF9pcGhkcl9kZXN0LCBpcGhkci0+ZGVzdCk7CisgIGlwX2FkZHJfY29weShjdXJyZW50X2lwaGRyX3NyYywgaXBoZHItPnNyYyk7CisKKyAgLyogbWF0Y2ggcGFja2V0IGFnYWluc3QgYW4gaW50ZXJmYWNlLCBpLmUuIGlzIHRoaXMgcGFja2V0IGZvciB1cz8gKi8KKyNpZiBMV0lQX0lHTVAKKyAgaWYgKGlwX2FkZHJfaXNtdWx0aWNhc3QoJmN1cnJlbnRfaXBoZHJfZGVzdCkpIHsKKyAgICBpZiAoKGlucC0+ZmxhZ3MgJiBORVRJRl9GTEFHX0lHTVApICYmIChpZ21wX2xvb2tmb3JfZ3JvdXAoaW5wLCAmY3VycmVudF9pcGhkcl9kZXN0KSkpIHsKKyAgICAgIG5ldGlmID0gaW5wOworICAgIH0gZWxzZSB7CisgICAgICBuZXRpZiA9IE5VTEw7CisgICAgfQorICB9IGVsc2UKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKyAgeworICAgIC8qIHN0YXJ0IHRyeWluZyB3aXRoIGlucC4gaWYgdGhhdCdzIG5vdCBhY2NlcHRhYmxlLCBzdGFydCB3YWxraW5nIHRoZQorICAgICAgIGxpc3Qgb2YgY29uZmlndXJlZCBuZXRpZnMuCisgICAgICAgJ2ZpcnN0JyBpcyB1c2VkIGFzIGEgYm9vbGVhbiB0byBtYXJrIHdoZXRoZXIgd2Ugc3RhcnRlZCB3YWxraW5nIHRoZSBsaXN0ICovCisgICAgaW50IGZpcnN0ID0gMTsKKyAgICBuZXRpZiA9IGlucDsKKyAgICBkbyB7CisgICAgICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJpcF9pbnB1dDogaXBoZHItPmRlc3QgMHglIlgzMl9GIiBuZXRpZi0+aXBfYWRkciAweCUiWDMyX0YiICgweCUiWDMyX0YiLCAweCUiWDMyX0YiLCAweCUiWDMyX0YiKVxuIiwKKyAgICAgICAgICBpcDRfYWRkcl9nZXRfdTMyKCZpcGhkci0+ZGVzdCksIGlwNF9hZGRyX2dldF91MzIoJm5ldGlmLT5pcF9hZGRyKSwKKyAgICAgICAgICBpcDRfYWRkcl9nZXRfdTMyKCZpcGhkci0+ZGVzdCkgJiBpcDRfYWRkcl9nZXRfdTMyKCZuZXRpZi0+bmV0bWFzayksCisgICAgICAgICAgaXA0X2FkZHJfZ2V0X3UzMigmbmV0aWYtPmlwX2FkZHIpICYgaXA0X2FkZHJfZ2V0X3UzMigmbmV0aWYtPm5ldG1hc2spLAorICAgICAgICAgIGlwNF9hZGRyX2dldF91MzIoJmlwaGRyLT5kZXN0KSAmIH5pcDRfYWRkcl9nZXRfdTMyKCZuZXRpZi0+bmV0bWFzaykpKTsKKworICAgICAgLyogaW50ZXJmYWNlIGlzIHVwIGFuZCBjb25maWd1cmVkPyAqLworICAgICAgaWYgKChuZXRpZl9pc191cChuZXRpZikpICYmICghaXBfYWRkcl9pc2FueSgmKG5ldGlmLT5pcF9hZGRyKSkpKSB7CisgICAgICAgIC8qIHVuaWNhc3QgdG8gdGhpcyBpbnRlcmZhY2UgYWRkcmVzcz8gKi8KKyAgICAgICAgaWYgKGlwX2FkZHJfY21wKCZjdXJyZW50X2lwaGRyX2Rlc3QsICYobmV0aWYtPmlwX2FkZHIpKSB8fAorICAgICAgICAgICAgLyogb3IgYnJvYWRjYXN0IG9uIHRoaXMgaW50ZXJmYWNlIG5ldHdvcmsgYWRkcmVzcz8gKi8KKyAgICAgICAgICAgIGlwX2FkZHJfaXNicm9hZGNhc3QoJmN1cnJlbnRfaXBoZHJfZGVzdCwgbmV0aWYpKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoSVBfREVCVUcsICgiaXBfaW5wdXQ6IHBhY2tldCBhY2NlcHRlZCBvbiBpbnRlcmZhY2UgJWMlY1xuIiwKKyAgICAgICAgICAgICAgbmV0aWYtPm5hbWVbMF0sIG5ldGlmLT5uYW1lWzFdKSk7CisgICAgICAgICAgLyogYnJlYWsgb3V0IG9mIGZvciBsb29wICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNpZiBMV0lQX0FVVE9JUAorICAgICAgICAvKiBjb25uZWN0aW9ucyB0byBsaW5rLWxvY2FsIGFkZHJlc3NlcyBtdXN0IHBlcnNpc3QgYWZ0ZXIgY2hhbmdpbmcKKyAgICAgICAgICAgdGhlIG5ldGlmJ3MgYWRkcmVzcyAoUkZDMzkyNyBjaC4gMS45KSAqLworICAgICAgICBpZiAoKG5ldGlmLT5hdXRvaXAgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgIGlwX2FkZHJfY21wKCZjdXJyZW50X2lwaGRyX2Rlc3QsICYobmV0aWYtPmF1dG9pcC0+bGxpcGFkZHIpKSkgeworICAgICAgICAgIExXSVBfREVCVUdGKElQX0RFQlVHLCAoImlwX2lucHV0OiBMTEEgcGFja2V0IGFjY2VwdGVkIG9uIGludGVyZmFjZSAlYyVjXG4iLAorICAgICAgICAgICAgICBuZXRpZi0+bmFtZVswXSwgbmV0aWYtPm5hbWVbMV0pKTsKKyAgICAgICAgICAvKiBicmVhayBvdXQgb2YgZm9yIGxvb3AgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2VuZGlmIC8qIExXSVBfQVVUT0lQICovCisgICAgICB9CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSAwOworICAgICAgICBuZXRpZiA9IG5ldGlmX2xpc3Q7CisgICAgICB9IGVsc2UgeworICAgICAgICBuZXRpZiA9IG5ldGlmLT5uZXh0OworICAgICAgfQorICAgICAgaWYgKG5ldGlmID09IGlucCkgeworICAgICAgICBuZXRpZiA9IG5ldGlmLT5uZXh0OworICAgICAgfQorICAgIH0gd2hpbGUobmV0aWYgIT0gTlVMTCk7CisgIH0KKworI2lmIElQX0FDQ0VQVF9MSU5LX0xBWUVSX0FERFJFU1NJTkcKKyAgLyogUGFzcyBESENQIG1lc3NhZ2VzIHJlZ2FyZGxlc3Mgb2YgZGVzdGluYXRpb24gYWRkcmVzcy4gREhDUCB0cmFmZmljIGlzIGFkZHJlc3NlZAorICAgKiB1c2luZyBsaW5rIGxheWVyIGFkZHJlc3NpbmcgKHN1Y2ggYXMgRXRoZXJuZXQgTUFDKSBzbyB3ZSBtdXN0IG5vdCBmaWx0ZXIgb24gSVAuCisgICAqIEFjY29yZGluZyB0byBSRkMgMTU0MiBzZWN0aW9uIDMuMS4xLCByZWZlcnJlZCBieSBSRkMgMjEzMSkuCisgICAqCisgICAqIElmIHlvdSB3YW50IHRvIGFjY2VwdCBwcml2YXRlIGJyb2FkY2FzdCBjb21tdW5pY2F0aW9uIHdoaWxlIGEgbmV0aWYgaXMgZG93biwKKyAgICogZGVmaW5lIExXSVBfSVBfQUNDRVBUX1VEUF9QT1JUKGRzdF9wb3J0KSwgZS5nLjoKKyAgICoKKyAgICogI2RlZmluZSBMV0lQX0lQX0FDQ0VQVF9VRFBfUE9SVChkc3RfcG9ydCkgKChkc3RfcG9ydCkgPT0gUFBfTlRPSFMoMTIzNDUpKQorICAgKi8KKyAgaWYgKG5ldGlmID09IE5VTEwpIHsKKyAgICAvKiByZW1vdGUgcG9ydCBpcyBESENQIHNlcnZlcj8gKi8KKyAgICBpZiAoSVBIX1BST1RPKGlwaGRyKSA9PSBJUF9QUk9UT19VRFApIHsKKyAgICAgIHN0cnVjdCB1ZHBfaGRyICp1ZHBoZHIgPSAoc3RydWN0IHVkcF9oZHIgKikoKHU4X3QgKilpcGhkciArIGlwaGRyX2hsZW4pOworICAgICAgTFdJUF9ERUJVR0YoSVBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJpcF9pbnB1dDogVURQIHBhY2tldCB0byBESENQIGNsaWVudCBwb3J0ICUiVTE2X0YiXG4iLAorICAgICAgICBudG9ocyh1ZHBoZHItPmRlc3QpKSk7CisgICAgICBpZiAoSVBfQUNDRVBUX0xJTktfTEFZRVJfQUREUkVTU0VEX1BPUlQodWRwaGRyLT5kZXN0KSkgeworICAgICAgICBMV0lQX0RFQlVHRihJUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImlwX2lucHV0OiBESENQIHBhY2tldCBhY2NlcHRlZC5cbiIpKTsKKyAgICAgICAgbmV0aWYgPSBpbnA7CisgICAgICAgIGNoZWNrX2lwX3NyYyA9IDA7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgLyogSVBfQUNDRVBUX0xJTktfTEFZRVJfQUREUkVTU0lORyAqLworCisgIC8qIGJyb2FkY2FzdCBvciBtdWx0aWNhc3QgcGFja2V0IHNvdXJjZSBhZGRyZXNzPyBDb21wbGlhbnQgd2l0aCBSRkMgMTEyMjogMy4yLjEuMyAqLworI2lmIElQX0FDQ0VQVF9MSU5LX0xBWUVSX0FERFJFU1NJTkcKKyAgLyogREhDUCBzZXJ2ZXJzIG5lZWQgMC4wLjAuMCB0byBiZSBhbGxvd2VkIGFzIHNvdXJjZSBhZGRyZXNzIChSRkMgMS4xLjIuMjogMy4yLjEuMy9hKSAqLworICBpZiAoY2hlY2tfaXBfc3JjICYmICFpcF9hZGRyX2lzYW55KCZjdXJyZW50X2lwaGRyX3NyYykpCisjZW5kaWYgLyogSVBfQUNDRVBUX0xJTktfTEFZRVJfQUREUkVTU0lORyAqLworICB7ICBpZiAoKGlwX2FkZHJfaXNicm9hZGNhc3QoJmN1cnJlbnRfaXBoZHJfc3JjLCBpbnApKSB8fAorICAgICAgICAgKGlwX2FkZHJfaXNtdWx0aWNhc3QoJmN1cnJlbnRfaXBoZHJfc3JjKSkpIHsKKyAgICAgIC8qIHBhY2tldCBzb3VyY2UgaXMgbm90IHZhbGlkICovCisgICAgICBMV0lQX0RFQlVHRihJUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywgKCJpcF9pbnB1dDogcGFja2V0IHNvdXJjZSBpcyBub3QgdmFsaWQuXG4iKSk7CisgICAgICAvKiBmcmVlIChkcm9wKSBwYWNrZXQgcGJ1ZnMgKi8KKyAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgIElQX1NUQVRTX0lOQyhpcC5kcm9wKTsKKyAgICAgIHNubXBfaW5jX2lwaW5hZGRyZXJyb3JzKCk7CisgICAgICBzbm1wX2luY19pcGluZGlzY2FyZHMoKTsKKyAgICAgIHJldHVybiBFUlJfT0s7CisgICAgfQorICB9CisKKyAgLyogcGFja2V0IG5vdCBmb3IgdXM/ICovCisgIGlmIChuZXRpZiA9PSBOVUxMKSB7CisgICAgLyogcGFja2V0IG5vdCBmb3IgdXMsIHJvdXRlIG9yIGRpc2NhcmQgKi8KKyAgICBMV0lQX0RFQlVHRihJUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImlwX2lucHV0OiBwYWNrZXQgbm90IGZvciB1cy5cbiIpKTsKKyNpZiBJUF9GT1JXQVJECisgICAgLyogbm9uLWJyb2FkY2FzdCBwYWNrZXQ/ICovCisgICAgaWYgKCFpcF9hZGRyX2lzYnJvYWRjYXN0KCZjdXJyZW50X2lwaGRyX2Rlc3QsIGlucCkpIHsKKyAgICAgIC8qIHRyeSB0byBmb3J3YXJkIElQIHBhY2tldCBvbiAob3RoZXIpIGludGVyZmFjZXMgKi8KKyAgICAgIGlwX2ZvcndhcmQocCwgaXBoZHIsIGlucCk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogSVBfRk9SV0FSRCAqLworICAgIHsKKyAgICAgIHNubXBfaW5jX2lwaW5hZGRyZXJyb3JzKCk7CisgICAgICBzbm1wX2luY19pcGluZGlzY2FyZHMoKTsKKyAgICB9CisgICAgcGJ1Zl9mcmVlKHApOworICAgIHJldHVybiBFUlJfT0s7CisgIH0KKyAgLyogcGFja2V0IGNvbnNpc3RzIG9mIG11bHRpcGxlIGZyYWdtZW50cz8gKi8KKyAgaWYgKChJUEhfT0ZGU0VUKGlwaGRyKSAmIFBQX0hUT05TKElQX09GRk1BU0sgfCBJUF9NRikpICE9IDApIHsKKyNpZiBJUF9SRUFTU0VNQkxZIC8qIHBhY2tldCBmcmFnbWVudCByZWFzc2VtYmx5IGNvZGUgcHJlc2VudD8gKi8KKyAgICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJJUCBwYWNrZXQgaXMgYSBmcmFnbWVudCAoaWQ9MHglMDQiWDE2X0YiIHRvdF9sZW49JSJVMTZfRiIgbGVuPSUiVTE2X0YiIE1GPSUiVTE2X0YiIG9mZnNldD0lIlUxNl9GIiksIGNhbGxpbmcgaXBfcmVhc3MoKVxuIiwKKyAgICAgIG50b2hzKElQSF9JRChpcGhkcikpLCBwLT50b3RfbGVuLCBudG9ocyhJUEhfTEVOKGlwaGRyKSksICEhKElQSF9PRkZTRVQoaXBoZHIpICYgUFBfSFRPTlMoSVBfTUYpKSwgKG50b2hzKElQSF9PRkZTRVQoaXBoZHIpKSAmIElQX09GRk1BU0spKjgpKTsKKyAgICAvKiByZWFzc2VtYmxlIHRoZSBwYWNrZXQqLworICAgIHAgPSBpcF9yZWFzcyhwKTsKKyAgICAvKiBwYWNrZXQgbm90IGZ1bGx5IHJlYXNzZW1ibGVkIHlldD8gKi8KKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRVJSX09LOworICAgIH0KKyAgICBpcGhkciA9IChzdHJ1Y3QgaXBfaGRyICopcC0+cGF5bG9hZDsKKyNlbHNlIC8qIElQX1JFQVNTRU1CTFkgPT0gMCwgbm8gcGFja2V0IGZyYWdtZW50IHJlYXNzZW1ibHkgY29kZSBwcmVzZW50ICovCisgICAgcGJ1Zl9mcmVlKHApOworICAgIExXSVBfREVCVUdGKElQX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfU0VSSU9VUywgKCJJUCBwYWNrZXQgZHJvcHBlZCBzaW5jZSBpdCB3YXMgZnJhZ21lbnRlZCAoMHglIlgxNl9GIikgKHdoaWxlIElQX1JFQVNTRU1CTFkgPT0gMCkuXG4iLAorICAgICAgbnRvaHMoSVBIX09GRlNFVChpcGhkcikpKSk7CisgICAgSVBfU1RBVFNfSU5DKGlwLm9wdGVycik7CisgICAgSVBfU1RBVFNfSU5DKGlwLmRyb3ApOworICAgIC8qIHVuc3VwcG9ydGVkIHByb3RvY29sIGZlYXR1cmUgKi8KKyAgICBzbm1wX2luY19pcGludW5rbm93bnByb3RvcygpOworICAgIHJldHVybiBFUlJfT0s7CisjZW5kaWYgLyogSVBfUkVBU1NFTUJMWSAqLworICB9CisKKyNpZiBJUF9PUFRJT05TX0FMTE9XRUQgPT0gMCAvKiBubyBzdXBwb3J0IGZvciBJUCBvcHRpb25zIGluIHRoZSBJUCBoZWFkZXI/ICovCisKKyNpZiBMV0lQX0lHTVAKKyAgLyogdGhlcmUgaXMgYW4gZXh0cmEgInJvdXRlciBhbGVydCIgb3B0aW9uIGluIElHTVAgbWVzc2FnZXMgd2hpY2ggd2UgYWxsb3cgZm9yIGJ1dCBkbyBub3QgcG9saWNlICovCisgIGlmKChpcGhkcl9obGVuID4gSVBfSExFTikgJiYgIChJUEhfUFJPVE8oaXBoZHIpICE9IElQX1BST1RPX0lHTVApKSB7CisjZWxzZQorICBpZiAoaXBoZHJfaGxlbiA+IElQX0hMRU4pIHsKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKyAgICBMV0lQX0RFQlVHRihJUF9ERUJVRyB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsICgiSVAgcGFja2V0IGRyb3BwZWQgc2luY2UgdGhlcmUgd2VyZSBJUCBvcHRpb25zICh3aGlsZSBJUF9PUFRJT05TX0FMTE9XRUQgPT0gMCkuXG4iKSk7CisgICAgcGJ1Zl9mcmVlKHApOworICAgIElQX1NUQVRTX0lOQyhpcC5vcHRlcnIpOworICAgIElQX1NUQVRTX0lOQyhpcC5kcm9wKTsKKyAgICAvKiB1bnN1cHBvcnRlZCBwcm90b2NvbCBmZWF0dXJlICovCisgICAgc25tcF9pbmNfaXBpbnVua25vd25wcm90b3MoKTsKKyAgICByZXR1cm4gRVJSX09LOworICB9CisjZW5kaWYgLyogSVBfT1BUSU9OU19BTExPV0VEID09IDAgKi8KKworICAvKiBzZW5kIHRvIHVwcGVyIGxheWVycyAqLworICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJpcF9pbnB1dDogXG4iKSk7CisgIGlwX2RlYnVnX3ByaW50KHApOworICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJpcF9pbnB1dDogcC0+bGVuICUiVTE2X0YiIHAtPnRvdF9sZW4gJSJVMTZfRiJcbiIsIHAtPmxlbiwgcC0+dG90X2xlbikpOworCisgIGN1cnJlbnRfbmV0aWYgPSBpbnA7CisgIGN1cnJlbnRfaGVhZGVyID0gaXBoZHI7CisKKyNpZiBMV0lQX1JBVworICAvKiByYXcgaW5wdXQgZGlkIG5vdCBlYXQgdGhlIHBhY2tldD8gKi8KKyAgaWYgKHJhd19pbnB1dChwLCBpbnApID09IDApCisjZW5kaWYgLyogTFdJUF9SQVcgKi8KKyAgeworCisgICAgc3dpdGNoIChJUEhfUFJPVE8oaXBoZHIpKSB7CisjaWYgTFdJUF9VRFAKKyAgICBjYXNlIElQX1BST1RPX1VEUDoKKyNpZiBMV0lQX1VEUExJVEUKKyAgICBjYXNlIElQX1BST1RPX1VEUExJVEU6CisjZW5kaWYgLyogTFdJUF9VRFBMSVRFICovCisgICAgICBzbm1wX2luY19pcGluZGVsaXZlcnMoKTsKKyAgICAgIHVkcF9pbnB1dChwLCBpbnApOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFdJUF9VRFAgKi8KKyNpZiBMV0lQX1RDUAorICAgIGNhc2UgSVBfUFJPVE9fVENQOgorICAgICAgc25tcF9pbmNfaXBpbmRlbGl2ZXJzKCk7CisgICAgICB0Y3BfaW5wdXQocCwgaW5wKTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfVENQICovCisjaWYgTFdJUF9JQ01QCisgICAgY2FzZSBJUF9QUk9UT19JQ01QOgorICAgICAgc25tcF9pbmNfaXBpbmRlbGl2ZXJzKCk7CisgICAgICBpY21wX2lucHV0KHAsIGlucCk7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX0lDTVAgKi8KKyNpZiBMV0lQX0lHTVAKKyAgICBjYXNlIElQX1BST1RPX0lHTVA6CisgICAgICBpZ21wX2lucHV0KHAsIGlucCwgJmN1cnJlbnRfaXBoZHJfZGVzdCk7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKyAgICBkZWZhdWx0OgorI2lmIExXSVBfSUNNUAorICAgICAgLyogc2VuZCBJQ01QIGRlc3RpbmF0aW9uIHByb3RvY29sIHVucmVhY2hhYmxlIHVubGVzcyBpcyB3YXMgYSBicm9hZGNhc3QgKi8KKyAgICAgIGlmICghaXBfYWRkcl9pc2Jyb2FkY2FzdCgmY3VycmVudF9pcGhkcl9kZXN0LCBpbnApICYmCisgICAgICAgICAgIWlwX2FkZHJfaXNtdWx0aWNhc3QoJmN1cnJlbnRfaXBoZHJfZGVzdCkpIHsKKyAgICAgICAgcC0+cGF5bG9hZCA9IGlwaGRyOworICAgICAgICBpY21wX2Rlc3RfdW5yZWFjaChwLCBJQ01QX0RVUl9QUk9UTyk7CisgICAgICB9CisjZW5kaWYgLyogTFdJUF9JQ01QICovCisgICAgICBwYnVmX2ZyZWUocCk7CisKKyAgICAgIExXSVBfREVCVUdGKElQX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfU0VSSU9VUywgKCJVbnN1cHBvcnRlZCB0cmFuc3BvcnQgcHJvdG9jb2wgJSJVMTZfRiJcbiIsIElQSF9QUk9UTyhpcGhkcikpKTsKKworICAgICAgSVBfU1RBVFNfSU5DKGlwLnByb3RlcnIpOworICAgICAgSVBfU1RBVFNfSU5DKGlwLmRyb3ApOworICAgICAgc25tcF9pbmNfaXBpbnVua25vd25wcm90b3MoKTsKKyAgICB9CisgIH0KKworICBjdXJyZW50X25ldGlmID0gTlVMTDsKKyAgY3VycmVudF9oZWFkZXIgPSBOVUxMOworICBpcF9hZGRyX3NldF9hbnkoJmN1cnJlbnRfaXBoZHJfc3JjKTsKKyAgaXBfYWRkcl9zZXRfYW55KCZjdXJyZW50X2lwaGRyX2Rlc3QpOworCisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogU2VuZHMgYW4gSVAgcGFja2V0IG9uIGEgbmV0d29yayBpbnRlcmZhY2UuIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cworICogdGhlIElQIGhlYWRlciBhbmQgY2FsY3VsYXRlcyB0aGUgSVAgaGVhZGVyIGNoZWNrc3VtLiBJZiB0aGUgc291cmNlCisgKiBJUCBhZGRyZXNzIGlzIE5VTEwsIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBvdXRnb2luZyBuZXR3b3JrCisgKiBpbnRlcmZhY2UgaXMgZmlsbGVkIGluIGFzIHNvdXJjZSBhZGRyZXNzLgorICogSWYgdGhlIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgaXMgSVBfSERSSU5DTCwgcCBpcyBhc3N1bWVkIHRvIGFscmVhZHkKKyAqIGluY2x1ZGUgYW4gSVAgaGVhZGVyIGFuZCBwLT5wYXlsb2FkIHBvaW50cyB0byBpdCBpbnN0ZWFkIG9mIHRoZSBkYXRhLgorICoKKyAqIEBwYXJhbSBwIHRoZSBwYWNrZXQgdG8gc2VuZCAocC0+cGF5bG9hZCBwb2ludHMgdG8gdGhlIGRhdGEsIGUuZy4gbmV4dAorICAgICAgICAgICAgcHJvdG9jb2wgaGVhZGVyOyBpZiBkZXN0ID09IElQX0hEUklOQ0wsIHAgYWxyZWFkeSBpbmNsdWRlcyBhbiBJUAorICAgICAgICAgICAgaGVhZGVyIGFuZCBwLT5wYXlsb2FkIHBvaW50cyB0byB0aGF0IElQIGhlYWRlcikKKyAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIHRvIHNlbmQgZnJvbSAoaWYgc3JjID09IElQX0FERFJfQU5ZLCB0aGUKKyAqICAgICAgICAgSVAgIGFkZHJlc3Mgb2YgdGhlIG5ldGlmIHVzZWQgdG8gc2VuZCBpcyB1c2VkIGFzIHNvdXJjZSBhZGRyZXNzKQorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgdG8gc2VuZCB0aGUgcGFja2V0IHRvCisgKiBAcGFyYW0gdHRsIHRoZSBUVEwgdmFsdWUgdG8gYmUgc2V0IGluIHRoZSBJUCBoZWFkZXIKKyAqIEBwYXJhbSB0b3MgdGhlIFRPUyB2YWx1ZSB0byBiZSBzZXQgaW4gdGhlIElQIGhlYWRlcgorICogQHBhcmFtIHByb3RvIHRoZSBQUk9UT0NPTCB0byBiZSBzZXQgaW4gdGhlIElQIGhlYWRlcgorICogQHBhcmFtIG5ldGlmIHRoZSBuZXRpZiBvbiB3aGljaCB0byBzZW5kIHRoaXMgcGFja2V0CisgKiBAcmV0dXJuIEVSUl9PSyBpZiB0aGUgcGFja2V0IHdhcyBzZW50IE9LCisgKiAgICAgICAgIEVSUl9CVUYgaWYgcCBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlIGZvciBJUC9MSU5LIGhlYWRlcnMKKyAqICAgICAgICAgcmV0dXJucyBlcnJvcnMgcmV0dXJuZWQgYnkgbmV0aWYtPm91dHB1dAorICoKKyAqIEBub3RlIGlwX2lkOiBSRkM3OTEgInNvbWUgaG9zdCBtYXkgYmUgYWJsZSB0byBzaW1wbHkgdXNlCisgKiAgdW5pcXVlIGlkZW50aWZpZXJzIGluZGVwZW5kZW50IG9mIGRlc3RpbmF0aW9uIgorICovCitlcnJfdAoraXBfb3V0cHV0X2lmKHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKnNyYywgaXBfYWRkcl90ICpkZXN0LAorICAgICAgICAgICAgIHU4X3QgdHRsLCB1OF90IHRvcywKKyAgICAgICAgICAgICB1OF90IHByb3RvLCBzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworI2lmIElQX09QVElPTlNfU0VORAorICByZXR1cm4gaXBfb3V0cHV0X2lmX29wdChwLCBzcmMsIGRlc3QsIHR0bCwgdG9zLCBwcm90bywgbmV0aWYsIE5VTEwsIDApOworfQorCisvKioKKyAqIFNhbWUgYXMgaXBfb3V0cHV0X2lmKCkgYnV0IHdpdGggdGhlIHBvc3NpYmlsaXR5IHRvIGluY2x1ZGUgSVAgb3B0aW9uczoKKyAqCisgKiBAIHBhcmFtIGlwX29wdGlvbnMgcG9pbnRlciB0byB0aGUgSVAgb3B0aW9ucywgY29waWVkIGludG8gdGhlIElQIGhlYWRlcgorICogQCBwYXJhbSBvcHRsZW4gbGVuZ3RoIG9mIGlwX29wdGlvbnMKKyAqLworZXJyX3QgaXBfb3V0cHV0X2lmX29wdChzdHJ1Y3QgcGJ1ZiAqcCwgaXBfYWRkcl90ICpzcmMsIGlwX2FkZHJfdCAqZGVzdCwKKyAgICAgICB1OF90IHR0bCwgdThfdCB0b3MsIHU4X3QgcHJvdG8sIHN0cnVjdCBuZXRpZiAqbmV0aWYsIHZvaWQgKmlwX29wdGlvbnMsCisgICAgICAgdTE2X3Qgb3B0bGVuKQoreworI2VuZGlmIC8qIElQX09QVElPTlNfU0VORCAqLworICBzdHJ1Y3QgaXBfaGRyICppcGhkcjsKKyAgaXBfYWRkcl90IGRlc3RfYWRkcjsKKyNpZiBDSEVDS1NVTV9HRU5fSVBfSU5MSU5FCisgIHUzMl90IGNoa19zdW0gPSAwOworI2VuZGlmIC8qIENIRUNLU1VNX0dFTl9JUF9JTkxJTkUgKi8KKworICAvKiBwYnVmcyBwYXNzZWQgdG8gSVAgbXVzdCBoYXZlIGEgcmVmLWNvdW50IG9mIDEgYXMgdGhlaXIgcGF5bG9hZCBwb2ludGVyCisgICAgIGdldHMgYWx0ZXJlZCBhcyB0aGUgcGFja2V0IGlzIHBhc3NlZCBkb3duIHRoZSBzdGFjayAqLworICBMV0lQX0FTU0VSVCgicC0+cmVmID09IDEiLCBwLT5yZWYgPT0gMSk7CisKKyAgc25tcF9pbmNfaXBvdXRyZXF1ZXN0cygpOworCisgIC8qIFNob3VsZCB0aGUgSVAgaGVhZGVyIGJlIGdlbmVyYXRlZCBvciBpcyBpdCBhbHJlYWR5IGluY2x1ZGVkIGluIHA/ICovCisgIGlmIChkZXN0ICE9IElQX0hEUklOQ0wpIHsKKyAgICB1MTZfdCBpcF9obGVuID0gSVBfSExFTjsKKyNpZiBJUF9PUFRJT05TX1NFTkQKKyAgICB1MTZfdCBvcHRsZW5fYWxpZ25lZCA9IDA7CisgICAgaWYgKG9wdGxlbiAhPSAwKSB7CisjaWYgQ0hFQ0tTVU1fR0VOX0lQX0lOTElORQorICAgICAgaW50IGk7CisjZW5kaWYgLyogQ0hFQ0tTVU1fR0VOX0lQX0lOTElORSAqLworICAgICAgLyogcm91bmQgdXAgdG8gYSBtdWx0aXBsZSBvZiA0ICovCisgICAgICBvcHRsZW5fYWxpZ25lZCA9ICgob3B0bGVuICsgMykgJiB+Myk7CisgICAgICBpcF9obGVuICs9IG9wdGxlbl9hbGlnbmVkOworICAgICAgLyogRmlyc3Qgd3JpdGUgaW4gdGhlIElQIG9wdGlvbnMgKi8KKyAgICAgIGlmIChwYnVmX2hlYWRlcihwLCBvcHRsZW5fYWxpZ25lZCkpIHsKKyAgICAgICAgTFdJUF9ERUJVR0YoSVBfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLCAoImlwX291dHB1dF9pZl9vcHQ6IG5vdCBlbm91Z2ggcm9vbSBmb3IgSVAgb3B0aW9ucyBpbiBwYnVmXG4iKSk7CisgICAgICAgIElQX1NUQVRTX0lOQyhpcC5lcnIpOworICAgICAgICBzbm1wX2luY19pcG91dGRpc2NhcmRzKCk7CisgICAgICAgIHJldHVybiBFUlJfQlVGOworICAgICAgfQorICAgICAgTUVNQ1BZKHAtPnBheWxvYWQsIGlwX29wdGlvbnMsIG9wdGxlbik7CisgICAgICBpZiAob3B0bGVuIDwgb3B0bGVuX2FsaWduZWQpIHsKKyAgICAgICAgLyogemVybyB0aGUgcmVtYWluaW5nIGJ5dGVzICovCisgICAgICAgIG1lbXNldCgoKGNoYXIqKXAtPnBheWxvYWQpICsgb3B0bGVuLCAwLCBvcHRsZW5fYWxpZ25lZCAtIG9wdGxlbik7CisgICAgICB9CisjaWYgQ0hFQ0tTVU1fR0VOX0lQX0lOTElORQorICAgICAgZm9yIChpID0gMDsgaSA8IG9wdGxlbl9hbGlnbmVkLzI7IGkrKykgeworICAgICAgICBjaGtfc3VtICs9ICgodTE2X3QqKXAtPnBheWxvYWQpW2ldOworICAgICAgfQorI2VuZGlmIC8qIENIRUNLU1VNX0dFTl9JUF9JTkxJTkUgKi8KKyAgICB9CisjZW5kaWYgLyogSVBfT1BUSU9OU19TRU5EICovCisgICAgLyogZ2VuZXJhdGUgSVAgaGVhZGVyICovCisgICAgaWYgKHBidWZfaGVhZGVyKHAsIElQX0hMRU4pKSB7CisgICAgICBMV0lQX0RFQlVHRihJUF9ERUJVRyB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsICgiaXBfb3V0cHV0OiBub3QgZW5vdWdoIHJvb20gZm9yIElQIGhlYWRlciBpbiBwYnVmXG4iKSk7CisKKyAgICAgIElQX1NUQVRTX0lOQyhpcC5lcnIpOworICAgICAgc25tcF9pbmNfaXBvdXRkaXNjYXJkcygpOworICAgICAgcmV0dXJuIEVSUl9CVUY7CisgICAgfQorCisgICAgaXBoZHIgPSAoc3RydWN0IGlwX2hkciAqKXAtPnBheWxvYWQ7CisgICAgTFdJUF9BU1NFUlQoImNoZWNrIHRoYXQgZmlyc3QgcGJ1ZiBjYW4gaG9sZCBzdHJ1Y3QgaXBfaGRyIiwKKyAgICAgICAgICAgICAgIChwLT5sZW4gPj0gc2l6ZW9mKHN0cnVjdCBpcF9oZHIpKSk7CisKKyAgICBJUEhfVFRMX1NFVChpcGhkciwgdHRsKTsKKyAgICBJUEhfUFJPVE9fU0VUKGlwaGRyLCBwcm90byk7CisjaWYgQ0hFQ0tTVU1fR0VOX0lQX0lOTElORQorICAgIGNoa19zdW0gKz0gTFdJUF9NQUtFX1UxNihwcm90bywgdHRsKTsKKyNlbmRpZiAvKiBDSEVDS1NVTV9HRU5fSVBfSU5MSU5FICovCisKKyAgICAvKiBkZXN0IGNhbm5vdCBiZSBOVUxMIGhlcmUgKi8KKyAgICBpcF9hZGRyX2NvcHkoaXBoZHItPmRlc3QsICpkZXN0KTsKKyNpZiBDSEVDS1NVTV9HRU5fSVBfSU5MSU5FCisgICAgY2hrX3N1bSArPSBpcDRfYWRkcl9nZXRfdTMyKCZpcGhkci0+ZGVzdCkgJiAweEZGRkY7CisgICAgY2hrX3N1bSArPSBpcDRfYWRkcl9nZXRfdTMyKCZpcGhkci0+ZGVzdCkgPj4gMTY7CisjZW5kaWYgLyogQ0hFQ0tTVU1fR0VOX0lQX0lOTElORSAqLworCisgICAgSVBIX1ZITFRPU19TRVQoaXBoZHIsIDQsIGlwX2hsZW4gLyA0LCB0b3MpOworI2lmIENIRUNLU1VNX0dFTl9JUF9JTkxJTkUKKyAgICBjaGtfc3VtICs9IGlwaGRyLT5fdl9obF90b3M7CisjZW5kaWYgLyogQ0hFQ0tTVU1fR0VOX0lQX0lOTElORSAqLworICAgIElQSF9MRU5fU0VUKGlwaGRyLCBodG9ucyhwLT50b3RfbGVuKSk7CisjaWYgQ0hFQ0tTVU1fR0VOX0lQX0lOTElORQorICAgIGNoa19zdW0gKz0gaXBoZHItPl9sZW47CisjZW5kaWYgLyogQ0hFQ0tTVU1fR0VOX0lQX0lOTElORSAqLworICAgIElQSF9PRkZTRVRfU0VUKGlwaGRyLCAwKTsKKyAgICBJUEhfSURfU0VUKGlwaGRyLCBodG9ucyhpcF9pZCkpOworI2lmIENIRUNLU1VNX0dFTl9JUF9JTkxJTkUKKyAgICBjaGtfc3VtICs9IGlwaGRyLT5faWQ7CisjZW5kaWYgLyogQ0hFQ0tTVU1fR0VOX0lQX0lOTElORSAqLworICAgICsraXBfaWQ7CisKKyAgICBpZiAoaXBfYWRkcl9pc2FueShzcmMpKSB7CisgICAgICBpcF9hZGRyX2NvcHkoaXBoZHItPnNyYywgbmV0aWYtPmlwX2FkZHIpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBzcmMgY2Fubm90IGJlIE5VTEwgaGVyZSAqLworICAgICAgaXBfYWRkcl9jb3B5KGlwaGRyLT5zcmMsICpzcmMpOworICAgIH0KKworI2lmIENIRUNLU1VNX0dFTl9JUF9JTkxJTkUKKyAgICBjaGtfc3VtICs9IGlwNF9hZGRyX2dldF91MzIoJmlwaGRyLT5zcmMpICYgMHhGRkZGOworICAgIGNoa19zdW0gKz0gaXA0X2FkZHJfZ2V0X3UzMigmaXBoZHItPnNyYykgPj4gMTY7CisgICAgY2hrX3N1bSA9IChjaGtfc3VtID4+IDE2KSArIChjaGtfc3VtICYgMHhGRkZGKTsKKyAgICBjaGtfc3VtID0gKGNoa19zdW0gPj4gMTYpICsgY2hrX3N1bTsKKyAgICBjaGtfc3VtID0gfmNoa19zdW07CisgICAgaXBoZHItPl9jaGtzdW0gPSBjaGtfc3VtOyAvKiBuZXR3b3JrIG9yZGVyICovCisjZWxzZSAvKiBDSEVDS1NVTV9HRU5fSVBfSU5MSU5FICovCisgICAgSVBIX0NIS1NVTV9TRVQoaXBoZHIsIDApOworI2lmIENIRUNLU1VNX0dFTl9JUAorICAgIElQSF9DSEtTVU1fU0VUKGlwaGRyLCBpbmV0X2Noa3N1bShpcGhkciwgaXBfaGxlbikpOworI2VuZGlmCisjZW5kaWYgLyogQ0hFQ0tTVU1fR0VOX0lQX0lOTElORSAqLworICB9IGVsc2UgeworICAgIC8qIElQIGhlYWRlciBhbHJlYWR5IGluY2x1ZGVkIGluIHAgKi8KKyAgICBpcGhkciA9IChzdHJ1Y3QgaXBfaGRyICopcC0+cGF5bG9hZDsKKyAgICBpcF9hZGRyX2NvcHkoZGVzdF9hZGRyLCBpcGhkci0+ZGVzdCk7CisgICAgZGVzdCA9ICZkZXN0X2FkZHI7CisgIH0KKworICBJUF9TVEFUU19JTkMoaXAueG1pdCk7CisKKyAgTFdJUF9ERUJVR0YoSVBfREVCVUcsICgiaXBfb3V0cHV0X2lmOiAlYyVjJSJVMTZfRiJcbiIsIG5ldGlmLT5uYW1lWzBdLCBuZXRpZi0+bmFtZVsxXSwgbmV0aWYtPm51bSkpOworICBpcF9kZWJ1Z19wcmludChwKTsKKworI2lmIEVOQUJMRV9MT09QQkFDSworICBpZiAoaXBfYWRkcl9jbXAoZGVzdCwgJm5ldGlmLT5pcF9hZGRyKSkgeworICAgIC8qIFBhY2tldCB0byBzZWxmLCBlbnF1ZXVlIGl0IGZvciBsb29wYmFjayAqLworICAgIExXSVBfREVCVUdGKElQX0RFQlVHLCAoIm5ldGlmX2xvb3Bfb3V0cHV0KCkiKSk7CisgICAgcmV0dXJuIG5ldGlmX2xvb3Bfb3V0cHV0KG5ldGlmLCBwLCBkZXN0KTsKKyAgfQorI2lmIExXSVBfSUdNUAorICBpZiAoKHAtPmZsYWdzICYgUEJVRl9GTEFHX01DQVNUTE9PUCkgIT0gMCkgeworICAgIG5ldGlmX2xvb3Bfb3V0cHV0KG5ldGlmLCBwLCBkZXN0KTsKKyAgfQorI2VuZGlmIC8qIExXSVBfSUdNUCAqLworI2VuZGlmIC8qIEVOQUJMRV9MT09QQkFDSyAqLworI2lmIElQX0ZSQUcKKyAgLyogZG9uJ3QgZnJhZ21lbnQgaWYgaW50ZXJmYWNlIGhhcyBtdHUgc2V0IHRvIDAgW2xvb3BpZl0gKi8KKyAgaWYgKG5ldGlmLT5tdHUgJiYgKHAtPnRvdF9sZW4gPiBuZXRpZi0+bXR1KSkgeworICAgIHJldHVybiBpcF9mcmFnKHAsIG5ldGlmLCBkZXN0KTsKKyAgfQorI2VuZGlmIC8qIElQX0ZSQUcgKi8KKworICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJuZXRpZi0+b3V0cHV0KCkiKSk7CisgIHJldHVybiBuZXRpZi0+b3V0cHV0KG5ldGlmLCBwLCBkZXN0KTsKK30KKworLyoqCisgKiBTaW1wbGUgaW50ZXJmYWNlIHRvIGlwX291dHB1dF9pZi4gSXQgZmluZHMgdGhlIG91dGdvaW5nIG5ldHdvcmsKKyAqIGludGVyZmFjZSBhbmQgY2FsbHMgdXBvbiBpcF9vdXRwdXRfaWYgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLgorICoKKyAqIEBwYXJhbSBwIHRoZSBwYWNrZXQgdG8gc2VuZCAocC0+cGF5bG9hZCBwb2ludHMgdG8gdGhlIGRhdGEsIGUuZy4gbmV4dAorICAgICAgICAgICAgcHJvdG9jb2wgaGVhZGVyOyBpZiBkZXN0ID09IElQX0hEUklOQ0wsIHAgYWxyZWFkeSBpbmNsdWRlcyBhbiBJUAorICAgICAgICAgICAgaGVhZGVyIGFuZCBwLT5wYXlsb2FkIHBvaW50cyB0byB0aGF0IElQIGhlYWRlcikKKyAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIHRvIHNlbmQgZnJvbSAoaWYgc3JjID09IElQX0FERFJfQU5ZLCB0aGUKKyAqICAgICAgICAgSVAgIGFkZHJlc3Mgb2YgdGhlIG5ldGlmIHVzZWQgdG8gc2VuZCBpcyB1c2VkIGFzIHNvdXJjZSBhZGRyZXNzKQorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgdG8gc2VuZCB0aGUgcGFja2V0IHRvCisgKiBAcGFyYW0gdHRsIHRoZSBUVEwgdmFsdWUgdG8gYmUgc2V0IGluIHRoZSBJUCBoZWFkZXIKKyAqIEBwYXJhbSB0b3MgdGhlIFRPUyB2YWx1ZSB0byBiZSBzZXQgaW4gdGhlIElQIGhlYWRlcgorICogQHBhcmFtIHByb3RvIHRoZSBQUk9UT0NPTCB0byBiZSBzZXQgaW4gdGhlIElQIGhlYWRlcgorICoKKyAqIEByZXR1cm4gRVJSX1JURSBpZiBubyByb3V0ZSBpcyBmb3VuZAorICogICAgICAgICBzZWUgaXBfb3V0cHV0X2lmKCkgZm9yIG1vcmUgcmV0dXJuIHZhbHVlcworICovCitlcnJfdAoraXBfb3V0cHV0KHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKnNyYywgaXBfYWRkcl90ICpkZXN0LAorICAgICAgICAgIHU4X3QgdHRsLCB1OF90IHRvcywgdThfdCBwcm90bykKK3sKKyAgc3RydWN0IG5ldGlmICpuZXRpZjsKKworICAvKiBwYnVmcyBwYXNzZWQgdG8gSVAgbXVzdCBoYXZlIGEgcmVmLWNvdW50IG9mIDEgYXMgdGhlaXIgcGF5bG9hZCBwb2ludGVyCisgICAgIGdldHMgYWx0ZXJlZCBhcyB0aGUgcGFja2V0IGlzIHBhc3NlZCBkb3duIHRoZSBzdGFjayAqLworICBMV0lQX0FTU0VSVCgicC0+cmVmID09IDEiLCBwLT5yZWYgPT0gMSk7CisKKyAgaWYgKChuZXRpZiA9IGlwX3JvdXRlKGRlc3QpKSA9PSBOVUxMKSB7CisgICAgTFdJUF9ERUJVR0YoSVBfREVCVUcsICgiaXBfb3V0cHV0OiBObyByb3V0ZSB0byAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICAgIGlwNF9hZGRyMV8xNihkZXN0KSwgaXA0X2FkZHIyXzE2KGRlc3QpLCBpcDRfYWRkcjNfMTYoZGVzdCksIGlwNF9hZGRyNF8xNihkZXN0KSkpOworICAgIElQX1NUQVRTX0lOQyhpcC5ydGVycik7CisgICAgcmV0dXJuIEVSUl9SVEU7CisgIH0KKworICByZXR1cm4gaXBfb3V0cHV0X2lmKHAsIHNyYywgZGVzdCwgdHRsLCB0b3MsIHByb3RvLCBuZXRpZik7Cit9CisKKyNpZiBMV0lQX05FVElGX0hXQUREUkhJTlQKKy8qKiBMaWtlIGlwX291dHB1dCwgYnV0IHRha2VzIGFuZCBhZGRyX2hpbnQgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCBvbiB0byBuZXRpZi0+YWRkcl9oaW50CisgKiAgYmVmb3JlIGNhbGxpbmcgaXBfb3V0cHV0X2lmLgorICoKKyAqIEBwYXJhbSBwIHRoZSBwYWNrZXQgdG8gc2VuZCAocC0+cGF5bG9hZCBwb2ludHMgdG8gdGhlIGRhdGEsIGUuZy4gbmV4dAorICAgICAgICAgICAgcHJvdG9jb2wgaGVhZGVyOyBpZiBkZXN0ID09IElQX0hEUklOQ0wsIHAgYWxyZWFkeSBpbmNsdWRlcyBhbiBJUAorICAgICAgICAgICAgaGVhZGVyIGFuZCBwLT5wYXlsb2FkIHBvaW50cyB0byB0aGF0IElQIGhlYWRlcikKKyAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIHRvIHNlbmQgZnJvbSAoaWYgc3JjID09IElQX0FERFJfQU5ZLCB0aGUKKyAqICAgICAgICAgSVAgIGFkZHJlc3Mgb2YgdGhlIG5ldGlmIHVzZWQgdG8gc2VuZCBpcyB1c2VkIGFzIHNvdXJjZSBhZGRyZXNzKQorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgdG8gc2VuZCB0aGUgcGFja2V0IHRvCisgKiBAcGFyYW0gdHRsIHRoZSBUVEwgdmFsdWUgdG8gYmUgc2V0IGluIHRoZSBJUCBoZWFkZXIKKyAqIEBwYXJhbSB0b3MgdGhlIFRPUyB2YWx1ZSB0byBiZSBzZXQgaW4gdGhlIElQIGhlYWRlcgorICogQHBhcmFtIHByb3RvIHRoZSBQUk9UT0NPTCB0byBiZSBzZXQgaW4gdGhlIElQIGhlYWRlcgorICogQHBhcmFtIGFkZHJfaGludCBhZGRyZXNzIGhpbnQgcG9pbnRlciBzZXQgdG8gbmV0aWYtPmFkZHJfaGludCBiZWZvcmUKKyAqICAgICAgICBjYWxsaW5nIGlwX291dHB1dF9pZigpCisgKgorICogQHJldHVybiBFUlJfUlRFIGlmIG5vIHJvdXRlIGlzIGZvdW5kCisgKiAgICAgICAgIHNlZSBpcF9vdXRwdXRfaWYoKSBmb3IgbW9yZSByZXR1cm4gdmFsdWVzCisgKi8KK2Vycl90CitpcF9vdXRwdXRfaGludGVkKHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKnNyYywgaXBfYWRkcl90ICpkZXN0LAorICAgICAgICAgIHU4X3QgdHRsLCB1OF90IHRvcywgdThfdCBwcm90bywgdThfdCAqYWRkcl9oaW50KQoreworICBzdHJ1Y3QgbmV0aWYgKm5ldGlmOworICBlcnJfdCBlcnI7CisKKyAgLyogcGJ1ZnMgcGFzc2VkIHRvIElQIG11c3QgaGF2ZSBhIHJlZi1jb3VudCBvZiAxIGFzIHRoZWlyIHBheWxvYWQgcG9pbnRlcgorICAgICBnZXRzIGFsdGVyZWQgYXMgdGhlIHBhY2tldCBpcyBwYXNzZWQgZG93biB0aGUgc3RhY2sgKi8KKyAgTFdJUF9BU1NFUlQoInAtPnJlZiA9PSAxIiwgcC0+cmVmID09IDEpOworCisgIGlmICgobmV0aWYgPSBpcF9yb3V0ZShkZXN0KSkgPT0gTlVMTCkgeworICAgIExXSVBfREVCVUdGKElQX0RFQlVHLCAoImlwX291dHB1dDogTm8gcm91dGUgdG8gJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiJcbiIsCisgICAgICBpcDRfYWRkcjFfMTYoZGVzdCksIGlwNF9hZGRyMl8xNihkZXN0KSwgaXA0X2FkZHIzXzE2KGRlc3QpLCBpcDRfYWRkcjRfMTYoZGVzdCkpKTsKKyAgICBJUF9TVEFUU19JTkMoaXAucnRlcnIpOworICAgIHJldHVybiBFUlJfUlRFOworICB9CisKKyAgbmV0aWYtPmFkZHJfaGludCA9IGFkZHJfaGludDsKKyAgZXJyID0gaXBfb3V0cHV0X2lmKHAsIHNyYywgZGVzdCwgdHRsLCB0b3MsIHByb3RvLCBuZXRpZik7CisgIG5ldGlmLT5hZGRyX2hpbnQgPSBOVUxMOworCisgIHJldHVybiBlcnI7Cit9CisjZW5kaWYgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UKi8KKworI2lmIElQX0RFQlVHCisvKiBQcmludCBhbiBJUCBoZWFkZXIgYnkgdXNpbmcgTFdJUF9ERUJVR0YKKyAqIEBwYXJhbSBwIGFuIElQIHBhY2tldCwgcC0+cGF5bG9hZCBwb2ludGluZyB0byB0aGUgSVAgaGVhZGVyCisgKi8KK3ZvaWQKK2lwX2RlYnVnX3ByaW50KHN0cnVjdCBwYnVmICpwKQoreworICBzdHJ1Y3QgaXBfaGRyICppcGhkciA9IChzdHJ1Y3QgaXBfaGRyICopcC0+cGF5bG9hZDsKKyAgdThfdCAqcGF5bG9hZDsKKworICBwYXlsb2FkID0gKHU4X3QgKilpcGhkciArIElQX0hMRU47CisKKyAgTFdJUF9ERUJVR0YoSVBfREVCVUcsICgiSVAgaGVhZGVyOlxuIikpOworICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpKTsKKyAgTFdJUF9ERUJVR0YoSVBfREVCVUcsICgifCUyIlMxNl9GIiB8JTIiUzE2X0YiIHwgIDB4JTAyIlgxNl9GIiB8ICAgICAlNSJVMTZfRiIgICAgIHwgKHYsIGhsLCB0b3MsIGxlbilcbiIsCisgICAgICAgICAgICAgICAgICAgIElQSF9WKGlwaGRyKSwKKyAgICAgICAgICAgICAgICAgICAgSVBIX0hMKGlwaGRyKSwKKyAgICAgICAgICAgICAgICAgICAgSVBIX1RPUyhpcGhkciksCisgICAgICAgICAgICAgICAgICAgIG50b2hzKElQSF9MRU4oaXBoZHIpKSkpOworICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpKTsKKyAgTFdJUF9ERUJVR0YoSVBfREVCVUcsICgifCAgICAlNSJVMTZfRiIgICAgICB8JSJVMTZfRiIlIlUxNl9GIiUiVTE2X0YifCAgICAlNCJVMTZfRiIgICB8IChpZCwgZmxhZ3MsIG9mZnNldClcbiIsCisgICAgICAgICAgICAgICAgICAgIG50b2hzKElQSF9JRChpcGhkcikpLAorICAgICAgICAgICAgICAgICAgICBudG9ocyhJUEhfT0ZGU0VUKGlwaGRyKSkgPj4gMTUgJiAxLAorICAgICAgICAgICAgICAgICAgICBudG9ocyhJUEhfT0ZGU0VUKGlwaGRyKSkgPj4gMTQgJiAxLAorICAgICAgICAgICAgICAgICAgICBudG9ocyhJUEhfT0ZGU0VUKGlwaGRyKSkgPj4gMTMgJiAxLAorICAgICAgICAgICAgICAgICAgICBudG9ocyhJUEhfT0ZGU0VUKGlwaGRyKSkgJiBJUF9PRkZNQVNLKSk7CisgIExXSVBfREVCVUdGKElQX0RFQlVHLCAoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIikpOworICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCJ8ICAlMyJVMTZfRiIgIHwgICUzIlUxNl9GIiAgfCAgICAweCUwNCJYMTZfRiIgICAgIHwgKHR0bCwgcHJvdG8sIGNoa3N1bSlcbiIsCisgICAgICAgICAgICAgICAgICAgIElQSF9UVEwoaXBoZHIpLAorICAgICAgICAgICAgICAgICAgICBJUEhfUFJPVE8oaXBoZHIpLAorICAgICAgICAgICAgICAgICAgICBudG9ocyhJUEhfQ0hLU1VNKGlwaGRyKSkpKTsKKyAgTFdJUF9ERUJVR0YoSVBfREVCVUcsICgiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKSk7CisgIExXSVBfREVCVUdGKElQX0RFQlVHLCAoInwgICUzIlUxNl9GIiAgfCAgJTMiVTE2X0YiICB8ICAlMyJVMTZfRiIgIHwgICUzIlUxNl9GIiAgfCAoc3JjKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgaXA0X2FkZHIxXzE2KCZpcGhkci0+c3JjKSwKKyAgICAgICAgICAgICAgICAgICAgaXA0X2FkZHIyXzE2KCZpcGhkci0+c3JjKSwKKyAgICAgICAgICAgICAgICAgICAgaXA0X2FkZHIzXzE2KCZpcGhkci0+c3JjKSwKKyAgICAgICAgICAgICAgICAgICAgaXA0X2FkZHI0XzE2KCZpcGhkci0+c3JjKSkpOworICBMV0lQX0RFQlVHRihJUF9ERUJVRywgKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpKTsKKyAgTFdJUF9ERUJVR0YoSVBfREVCVUcsICgifCAgJTMiVTE2X0YiICB8ICAlMyJVMTZfRiIgIHwgICUzIlUxNl9GIiAgfCAgJTMiVTE2X0YiICB8IChkZXN0KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgaXA0X2FkZHIxXzE2KCZpcGhkci0+ZGVzdCksCisgICAgICAgICAgICAgICAgICAgIGlwNF9hZGRyMl8xNigmaXBoZHItPmRlc3QpLAorICAgICAgICAgICAgICAgICAgICBpcDRfYWRkcjNfMTYoJmlwaGRyLT5kZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgaXA0X2FkZHI0XzE2KCZpcGhkci0+ZGVzdCkpKTsKKyAgTFdJUF9ERUJVR0YoSVBfREVCVUcsICgiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKSk7Cit9CisjZW5kaWYgLyogSVBfREVCVUcgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS9pcHY0L2lwX2FkZHIuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS9pcHY0L2lwX2FkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYzM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaXBfYWRkci5jCkBAIC0wLDAgKzEsMzEyIEBACisvKioKKyAqIEBmaWxlCisgKiBUaGlzIGlzIHRoZSBJUHY0IGFkZHJlc3MgdG9vbHMgaW1wbGVtZW50YXRpb24uCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorI2luY2x1ZGUgImx3aXAvaXBfYWRkci5oIgorI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKworLyogdXNlZCBieSBJUF9BRERSX0FOWSBhbmQgSVBfQUREUl9CUk9BRENBU1QgaW4gaXBfYWRkci5oICovCitjb25zdCBpcF9hZGRyX3QgaXBfYWRkcl9hbnkgPSB7IElQQUREUl9BTlkgfTsKK2NvbnN0IGlwX2FkZHJfdCBpcF9hZGRyX2Jyb2FkY2FzdCA9IHsgSVBBRERSX0JST0FEQ0FTVCB9OworCisvKioKKyAqIERldGVybWluZSBpZiBhbiBhZGRyZXNzIGlzIGEgYnJvYWRjYXN0IGFkZHJlc3Mgb24gYSBuZXR3b3JrIGludGVyZmFjZSAKKyAqIAorICogQHBhcmFtIGFkZHIgYWRkcmVzcyB0byBiZSBjaGVja2VkCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGFnYWluc3Qgd2hpY2ggdGhlIGFkZHJlc3MgaXMgY2hlY2tlZAorICogQHJldHVybiByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBhZGRyZXNzIGlzIGEgYnJvYWRjYXN0IGFkZHJlc3MKKyAqLwordThfdAoraXA0X2FkZHJfaXNicm9hZGNhc3QodTMyX3QgYWRkciwgY29uc3Qgc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgaXBfYWRkcl90IGlwYWRkcjsKKyAgaXA0X2FkZHJfc2V0X3UzMigmaXBhZGRyLCBhZGRyKTsKKworICAvKiBhbGwgb25lcyAoYnJvYWRjYXN0KSBvciBhbGwgemVyb2VzIChvbGQgc2tvb2wgYnJvYWRjYXN0KSAqLworICBpZiAoKH5hZGRyID09IElQQUREUl9BTlkpIHx8CisgICAgICAoYWRkciA9PSBJUEFERFJfQU5ZKSkgeworICAgIHJldHVybiAxOworICAvKiBubyBicm9hZGNhc3Qgc3VwcG9ydCBvbiB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlPyAqLworICB9IGVsc2UgaWYgKChuZXRpZi0+ZmxhZ3MgJiBORVRJRl9GTEFHX0JST0FEQ0FTVCkgPT0gMCkgeworICAgIC8qIHRoZSBnaXZlbiBhZGRyZXNzIGNhbm5vdCBiZSBhIGJyb2FkY2FzdCBhZGRyZXNzCisgICAgICogbm9yIGNhbiB3ZSBjaGVjayBhZ2FpbnN0IGFueSBicm9hZGNhc3QgYWRkcmVzc2VzICovCisgICAgcmV0dXJuIDA7CisgIC8qIGFkZHJlc3MgbWF0Y2hlcyBuZXR3b3JrIGludGVyZmFjZSBhZGRyZXNzIGV4YWN0bHk/ID0+IG5vIGJyb2FkY2FzdCAqLworICB9IGVsc2UgaWYgKGFkZHIgPT0gaXA0X2FkZHJfZ2V0X3UzMigmbmV0aWYtPmlwX2FkZHIpKSB7CisgICAgcmV0dXJuIDA7CisgIC8qICBvbiB0aGUgc2FtZSAoc3ViKSBuZXR3b3JrLi4uICovCisgIH0gZWxzZSBpZiAoaXBfYWRkcl9uZXRjbXAoJmlwYWRkciwgJihuZXRpZi0+aXBfYWRkciksICYobmV0aWYtPm5ldG1hc2spKQorICAgICAgICAgLyogLi4uYW5kIGhvc3QgaWRlbnRpZmllciBiaXRzIGFyZSBhbGwgb25lcz8gPT4uLi4gKi8KKyAgICAgICAgICAmJiAoKGFkZHIgJiB+aXA0X2FkZHJfZ2V0X3UzMigmbmV0aWYtPm5ldG1hc2spKSA9PQorICAgICAgICAgICAoSVBBRERSX0JST0FEQ0FTVCAmIH5pcDRfYWRkcl9nZXRfdTMyKCZuZXRpZi0+bmV0bWFzaykpKSkgeworICAgIC8qID0+IG5ldHdvcmsgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiogQ2hlY2tzIGlmIGEgbmV0bWFzayBpcyB2YWxpZCAoc3RhcnRpbmcgd2l0aCBvbmVzLCB0aGVuIG9ubHkgemVyb3MpCisgKgorICogQHBhcmFtIG5ldG1hc2sgdGhlIElQdjQgbmV0bWFzayB0byBjaGVjayAoaW4gbmV0d29yayBieXRlIG9yZGVyISkKKyAqIEByZXR1cm4gMSBpZiB0aGUgbmV0bWFzayBpcyB2YWxpZCwgMCBpZiBpdCBpcyBub3QKKyAqLwordThfdAoraXA0X2FkZHJfbmV0bWFza192YWxpZCh1MzJfdCBuZXRtYXNrKQoreworICB1MzJfdCBtYXNrOworICB1MzJfdCBubV9ob3N0b3JkZXIgPSBsd2lwX2h0b25sKG5ldG1hc2spOworCisgIC8qIGZpcnN0LCBjaGVjayBmb3IgdGhlIGZpcnN0IHplcm8gKi8KKyAgZm9yIChtYXNrID0gMVVMIDw8IDMxIDsgbWFzayAhPSAwOyBtYXNrID4+PSAxKSB7CisgICAgaWYgKChubV9ob3N0b3JkZXIgJiBtYXNrKSA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLyogdGhlbiBjaGVjayB0aGF0IHRoZXJlIGlzIG5vIG9uZSAqLworICBmb3IgKDsgbWFzayAhPSAwOyBtYXNrID4+PSAxKSB7CisgICAgaWYgKChubV9ob3N0b3JkZXIgJiBtYXNrKSAhPSAwKSB7CisgICAgICAvKiB0aGVyZSBpcyBhIG9uZSBhZnRlciB0aGUgZmlyc3QgemVybyAtPiBpbnZhbGlkICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgLyogbm8gb25lIGFmdGVyIHRoZSBmaXJzdCB6ZXJvIC0+IHZhbGlkICovCisgIHJldHVybiAxOworfQorCisvKiBIZXJlIGZvciBub3cgdW50aWwgbmVlZGVkIGluIG90aGVyIHBsYWNlcyBpbiBsd0lQICovCisjaWZuZGVmIGlzcHJpbnQKKyNkZWZpbmUgaW5fcmFuZ2UoYywgbG8sIHVwKSAgKCh1OF90KWMgPj0gbG8gJiYgKHU4X3QpYyA8PSB1cCkKKyNkZWZpbmUgaXNwcmludChjKSAgICAgICAgICAgaW5fcmFuZ2UoYywgMHgyMCwgMHg3ZikKKyNkZWZpbmUgaXNkaWdpdChjKSAgICAgICAgICAgaW5fcmFuZ2UoYywgJzAnLCAnOScpCisjZGVmaW5lIGlzeGRpZ2l0KGMpICAgICAgICAgIChpc2RpZ2l0KGMpIHx8IGluX3JhbmdlKGMsICdhJywgJ2YnKSB8fCBpbl9yYW5nZShjLCAnQScsICdGJykpCisjZGVmaW5lIGlzbG93ZXIoYykgICAgICAgICAgIGluX3JhbmdlKGMsICdhJywgJ3onKQorI2RlZmluZSBpc3NwYWNlKGMpICAgICAgICAgICAoYyA9PSAnICcgfHwgYyA9PSAnXGYnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1x2JykKKyNlbmRpZgorCisvKioKKyAqIEFzY2lpIGludGVybmV0IGFkZHJlc3MgaW50ZXJwcmV0YXRpb24gcm91dGluZS4KKyAqIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBpbiBuZXR3b3JrIG9yZGVyLgorICoKKyAqIEBwYXJhbSBjcCBJUCBhZGRyZXNzIGluIGFzY2lpIHJlcHJlc2VuYXRpb24gKGUuZy4gIjEyNy4wLjAuMSIpCisgKiBAcmV0dXJuIGlwIGFkZHJlc3MgaW4gbmV0d29yayBvcmRlcgorICovCit1MzJfdAoraXBhZGRyX2FkZHIoY29uc3QgY2hhciAqY3ApCit7CisgIGlwX2FkZHJfdCB2YWw7CisKKyAgaWYgKGlwYWRkcl9hdG9uKGNwLCAmdmFsKSkgeworICAgIHJldHVybiBpcDRfYWRkcl9nZXRfdTMyKCZ2YWwpOworICB9CisgIHJldHVybiAoSVBBRERSX05PTkUpOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgImNwIiBpcyBhIHZhbGlkIGFzY2lpIHJlcHJlc2VudGF0aW9uCisgKiBvZiBhbiBJbnRlcm5ldCBhZGRyZXNzIGFuZCBjb252ZXJ0IHRvIGEgYmluYXJ5IGFkZHJlc3MuCisgKiBSZXR1cm5zIDEgaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQsIDAgaWYgbm90LgorICogVGhpcyByZXBsYWNlcyBpbmV0X2FkZHIsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB3aGljaAorICogY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gZmFpbHVyZSBhbmQgYSBsb2NhbCBicm9hZGNhc3QgYWRkcmVzcy4KKyAqCisgKiBAcGFyYW0gY3AgSVAgYWRkcmVzcyBpbiBhc2NpaSByZXByZXNlbmF0aW9uIChlLmcuICIxMjcuMC4wLjEiKQorICogQHBhcmFtIGFkZHIgcG9pbnRlciB0byB3aGljaCB0byBzYXZlIHRoZSBpcCBhZGRyZXNzIGluIG5ldHdvcmsgb3JkZXIKKyAqIEByZXR1cm4gMSBpZiBjcCBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYWRkciwgMCBvbiBmYWlsdXJlCisgKi8KK2ludAoraXBhZGRyX2F0b24oY29uc3QgY2hhciAqY3AsIGlwX2FkZHJfdCAqYWRkcikKK3sKKyAgdTMyX3QgdmFsOworICB1OF90IGJhc2U7CisgIGNoYXIgYzsKKyAgdTMyX3QgcGFydHNbNF07CisgIHUzMl90ICpwcCA9IHBhcnRzOworCisgIGMgPSAqY3A7CisgIGZvciAoOzspIHsKKyAgICAvKgorICAgICAqIENvbGxlY3QgbnVtYmVyIHVwIHRvIGBgLicnLgorICAgICAqIFZhbHVlcyBhcmUgc3BlY2lmaWVkIGFzIGZvciBDOgorICAgICAqIDB4PWhleCwgMD1vY3RhbCwgMS05PWRlY2ltYWwuCisgICAgICovCisgICAgaWYgKCFpc2RpZ2l0KGMpKQorICAgICAgcmV0dXJuICgwKTsKKyAgICB2YWwgPSAwOworICAgIGJhc2UgPSAxMDsKKyAgICBpZiAoYyA9PSAnMCcpIHsKKyAgICAgIGMgPSAqKytjcDsKKyAgICAgIGlmIChjID09ICd4JyB8fCBjID09ICdYJykgeworICAgICAgICBiYXNlID0gMTY7CisgICAgICAgIGMgPSAqKytjcDsKKyAgICAgIH0gZWxzZQorICAgICAgICBiYXNlID0gODsKKyAgICB9CisgICAgZm9yICg7OykgeworICAgICAgaWYgKGlzZGlnaXQoYykpIHsKKyAgICAgICAgdmFsID0gKHZhbCAqIGJhc2UpICsgKGludCkoYyAtICcwJyk7CisgICAgICAgIGMgPSAqKytjcDsKKyAgICAgIH0gZWxzZSBpZiAoYmFzZSA9PSAxNiAmJiBpc3hkaWdpdChjKSkgeworICAgICAgICB2YWwgPSAodmFsIDw8IDQpIHwgKGludCkoYyArIDEwIC0gKGlzbG93ZXIoYykgPyAnYScgOiAnQScpKTsKKyAgICAgICAgYyA9ICorK2NwOworICAgICAgfSBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYyA9PSAnLicpIHsKKyAgICAgIC8qCisgICAgICAgKiBJbnRlcm5ldCBmb3JtYXQ6CisgICAgICAgKiAgYS5iLmMuZAorICAgICAgICogIGEuYi5jICAgKHdpdGggYyB0cmVhdGVkIGFzIDE2IGJpdHMpCisgICAgICAgKiAgYS5iICh3aXRoIGIgdHJlYXRlZCBhcyAyNCBiaXRzKQorICAgICAgICovCisgICAgICBpZiAocHAgPj0gcGFydHMgKyAzKSB7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgICB9CisgICAgICAqcHArKyA9IHZhbDsKKyAgICAgIGMgPSAqKytjcDsKKyAgICB9IGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIC8qCisgICAqIENoZWNrIGZvciB0cmFpbGluZyBjaGFyYWN0ZXJzLgorICAgKi8KKyAgaWYgKGMgIT0gJ1wwJyAmJiAhaXNzcGFjZShjKSkgeworICAgIHJldHVybiAoMCk7CisgIH0KKyAgLyoKKyAgICogQ29uY29jdCB0aGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8KKyAgICogdGhlIG51bWJlciBvZiBwYXJ0cyBzcGVjaWZpZWQuCisgICAqLworICBzd2l0Y2ggKHBwIC0gcGFydHMgKyAxKSB7CisKKyAgY2FzZSAwOgorICAgIHJldHVybiAoMCk7ICAgICAgIC8qIGluaXRpYWwgbm9uZGlnaXQgKi8KKworICBjYXNlIDE6ICAgICAgICAgICAgIC8qIGEgLS0gMzIgYml0cyAqLworICAgIGJyZWFrOworCisgIGNhc2UgMjogICAgICAgICAgICAgLyogYS5iIC0tIDguMjQgYml0cyAqLworICAgIGlmICh2YWwgPiAweGZmZmZmZlVMKSB7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgICB2YWwgfD0gcGFydHNbMF0gPDwgMjQ7CisgICAgYnJlYWs7CisKKyAgY2FzZSAzOiAgICAgICAgICAgICAvKiBhLmIuYyAtLSA4LjguMTYgYml0cyAqLworICAgIGlmICh2YWwgPiAweGZmZmYpIHsKKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KTsKKyAgICBicmVhazsKKworICBjYXNlIDQ6ICAgICAgICAgICAgIC8qIGEuYi5jLmQgLS0gOC44LjguOCBiaXRzICovCisgICAgaWYgKHZhbCA+IDB4ZmYpIHsKKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KSB8IChwYXJ0c1syXSA8PCA4KTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBMV0lQX0FTU0VSVCgidW5oYW5kbGVkIiwgMCk7CisgICAgYnJlYWs7CisgIH0KKyAgaWYgKGFkZHIpIHsKKyAgICBpcDRfYWRkcl9zZXRfdTMyKGFkZHIsIGh0b25sKHZhbCkpOworICB9CisgIHJldHVybiAoMSk7Cit9CisKKy8qKgorICogQ29udmVydCBudW1lcmljIElQIGFkZHJlc3MgaW50byBkZWNpbWFsIGRvdHRlZCBBU0NJSSByZXByZXNlbnRhdGlvbi4KKyAqIHJldHVybnMgcHRyIHRvIHN0YXRpYyBidWZmZXI7IG5vdCByZWVudHJhbnQhCisgKgorICogQHBhcmFtIGFkZHIgaXAgYWRkcmVzcyBpbiBuZXR3b3JrIG9yZGVyIHRvIGNvbnZlcnQKKyAqIEByZXR1cm4gcG9pbnRlciB0byBhIGdsb2JhbCBzdGF0aWMgKCEpIGJ1ZmZlciB0aGF0IGhvbGRzIHRoZSBBU0NJSQorICogICAgICAgICByZXByZXNlbmF0aW9uIG9mIGFkZHIKKyAqLworY2hhciAqCitpcGFkZHJfbnRvYShjb25zdCBpcF9hZGRyX3QgKmFkZHIpCit7CisgIHN0YXRpYyBjaGFyIHN0clsxNl07CisgIHJldHVybiBpcGFkZHJfbnRvYV9yKGFkZHIsIHN0ciwgMTYpOworfQorCisvKioKKyAqIFNhbWUgYXMgaXBhZGRyX250b2EsIGJ1dCByZWVudHJhbnQgc2luY2UgYSB1c2VyLXN1cHBsaWVkIGJ1ZmZlciBpcyB1c2VkLgorICoKKyAqIEBwYXJhbSBhZGRyIGlwIGFkZHJlc3MgaW4gbmV0d29yayBvcmRlciB0byBjb252ZXJ0CisgKiBAcGFyYW0gYnVmIHRhcmdldCBidWZmZXIgd2hlcmUgdGhlIHN0cmluZyBpcyBzdG9yZWQKKyAqIEBwYXJhbSBidWZsZW4gbGVuZ3RoIG9mIGJ1ZgorICogQHJldHVybiBlaXRoZXIgcG9pbnRlciB0byBidWYgd2hpY2ggbm93IGhvbGRzIHRoZSBBU0NJSQorICogICAgICAgICByZXByZXNlbnRhdGlvbiBvZiBhZGRyIG9yIE5VTEwgaWYgYnVmIHdhcyB0b28gc21hbGwKKyAqLworY2hhciAqaXBhZGRyX250b2Ffcihjb25zdCBpcF9hZGRyX3QgKmFkZHIsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKyAgdTMyX3Qgc19hZGRyOworICBjaGFyIGludlszXTsKKyAgY2hhciAqcnA7CisgIHU4X3QgKmFwOworICB1OF90IHJlbTsKKyAgdThfdCBuOworICB1OF90IGk7CisgIGludCBsZW4gPSAwOworCisgIHNfYWRkciA9IGlwNF9hZGRyX2dldF91MzIoYWRkcik7CisKKyAgcnAgPSBidWY7CisgIGFwID0gKHU4X3QgKikmc19hZGRyOworICBmb3IobiA9IDA7IG4gPCA0OyBuKyspIHsKKyAgICBpID0gMDsKKyAgICBkbyB7CisgICAgICByZW0gPSAqYXAgJSAodThfdCkxMDsKKyAgICAgICphcCAvPSAodThfdCkxMDsKKyAgICAgIGludltpKytdID0gJzAnICsgcmVtOworICAgIH0gd2hpbGUoKmFwKTsKKyAgICB3aGlsZShpLS0pIHsKKyAgICAgIGlmIChsZW4rKyA+PSBidWZsZW4pIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICAqcnArKyA9IGludltpXTsKKyAgICB9CisgICAgaWYgKGxlbisrID49IGJ1ZmxlbikgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICpycCsrID0gJy4nOworICAgIGFwKys7CisgIH0KKyAgKi0tcnAgPSAwOworICByZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaXBfZnJhZy5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL2lwdjQvaXBfZnJhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMTg0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvaXB2NC9pcF9mcmFnLmMKQEAgLTAsMCArMSw4NjMgQEAKKy8qKgorICogQGZpbGUKKyAqIFRoaXMgaXMgdGhlIElQdjQgcGFja2V0IHNlZ21lbnRhdGlvbiBhbmQgcmVhc3NlbWJseSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBKYW5pIE1vbm9zZXMgPGphbmlAaXYucm8+IAorICogICAgICAgICBTaW1vbiBHb2xkc2NobWlkdAorICogb3JpZ2luYWwgcmVhc3NlbWJseSBjb2RlIGJ5IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICogCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisjaW5jbHVkZSAibHdpcC9pcF9mcmFnLmgiCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL2luZXRfY2hrc3VtLmgiCisjaW5jbHVkZSAibHdpcC9uZXRpZi5oIgorI2luY2x1ZGUgImx3aXAvc25tcC5oIgorI2luY2x1ZGUgImx3aXAvc3RhdHMuaCIKKyNpbmNsdWRlICJsd2lwL2ljbXAuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgSVBfUkVBU1NFTUJMWQorLyoqCisgKiBUaGUgSVAgcmVhc3NlbWJseSBjb2RlIGN1cnJlbnRseSBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczoKKyAqIC0gSVAgaGVhZGVyIG9wdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAqIC0gZnJhZ21lbnRzIG11c3Qgbm90IG92ZXJsYXAgKGUuZy4gZHVlIHRvIGRpZmZlcmVudCByb3V0ZXMpLAorICogICBjdXJyZW50bHksIG92ZXJsYXBwaW5nIG9yIGR1cGxpY2F0ZSBmcmFnbWVudHMgYXJlIHRocm93biBhd2F5CisgKiAgIGlmIElQX1JFQVNTX0NIRUNLX09WRVJMQVA9MSAodGhlIGRlZmF1bHQpIQorICoKKyAqIEB0b2RvOiB3b3JrIHdpdGggSVAgaGVhZGVyIG9wdGlvbnMKKyAqLworCisvKiogU2V0dGluZyB0aGlzIHRvIDAsIHlvdSBjYW4gdHVybiBvZmYgY2hlY2tpbmcgdGhlIGZyYWdtZW50cyBmb3Igb3ZlcmxhcHBpbmcKKyAqIHJlZ2lvbnMuIFRoZSBjb2RlIGdldHMgYSBsaXR0bGUgc21hbGxlci4gT25seSB1c2UgdGhpcyBpZiB5b3Uga25vdyB0aGF0CisgKiBvdmVybGFwcGluZyB3b24ndCBvY2N1ciBvbiB5b3VyIG5ldHdvcmshICovCisjaWZuZGVmIElQX1JFQVNTX0NIRUNLX09WRVJMQVAKKyNkZWZpbmUgSVBfUkVBU1NfQ0hFQ0tfT1ZFUkxBUCAxCisjZW5kaWYgLyogSVBfUkVBU1NfQ0hFQ0tfT1ZFUkxBUCAqLworCisvKiogU2V0IHRvIDAgdG8gcHJldmVudCBmcmVlaW5nIHRoZSBvbGRlc3QgZGF0YWdyYW0gd2hlbiB0aGUgcmVhc3NlbWJseSBidWZmZXIgaXMKKyAqIGZ1bGwgKElQX1JFQVNTX01BWF9QQlVGUyBwYnVmcyBhcmUgZW5xdWV1ZWQpLiBUaGUgY29kZSBnZXRzIGEgbGl0dGxlIHNtYWxsZXIuCisgKiBEYXRhZ3JhbXMgd2lsbCBiZSBmcmVlZCBieSB0aW1lb3V0IG9ubHkuIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gTUVNUF9OVU1fUkVBU1NEQVRBCisgKiBpcyBzZXQgdG8gMSwgc28gb25lIGRhdGFncmFtIGNhbiBiZSByZWFzc2VtYmxlZCBhdCBhIHRpbWUsIG9ubHkuICovCisjaWZuZGVmIElQX1JFQVNTX0ZSRUVfT0xERVNUCisjZGVmaW5lIElQX1JFQVNTX0ZSRUVfT0xERVNUIDEKKyNlbmRpZiAvKiBJUF9SRUFTU19GUkVFX09MREVTVCAqLworCisjZGVmaW5lIElQX1JFQVNTX0ZMQUdfTEFTVEZSQUcgMHgwMQorCisvKiogVGhpcyBpcyBhIGhlbHBlciBzdHJ1Y3Qgd2hpY2ggaG9sZHMgdGhlIHN0YXJ0aW5nCisgKiBvZmZzZXQgYW5kIHRoZSBlbmRpbmcgb2Zmc2V0IG9mIHRoaXMgZnJhZ21lbnQgdG8KKyAqIGVhc2lseSBjaGFpbiB0aGUgZnJhZ21lbnRzLgorICogSXQgaGFzIHRoZSBzYW1lIHBhY2tpbmcgcmVxdWlyZW1lbnRzIGFzIHRoZSBJUCBoZWFkZXIsIHNpbmNlIGl0IHJlcGxhY2VzCisgKiB0aGUgSVAgaGVhZGVyIGluIG1lbW9yeSBpbiBpbmNvbWluZyBmcmFnbWVudHMgKGFmdGVyIGNvcHlpbmcgaXQpIHRvIGtlZXAKKyAqIHRyYWNrIG9mIHRoZSB2YXJpb3VzIGZyYWdtZW50cy4gKC0+IElmIHRoZSBJUCBoZWFkZXIgZG9lc24ndCBuZWVkIHBhY2tpbmcsCisgKiB0aGlzIHN0cnVjdCBkb2Vzbid0IG5lZWQgcGFja2luZywgdG9vLikKKyAqLworI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9icHN0cnVjdC5oIgorI2VuZGlmCitQQUNLX1NUUlVDVF9CRUdJTgorc3RydWN0IGlwX3JlYXNzX2hlbHBlciB7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHN0cnVjdCBwYnVmICpuZXh0X3BidWYpOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBzdGFydCk7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IGVuZCk7Cit9IFBBQ0tfU1RSVUNUX1NUUlVDVDsKK1BBQ0tfU1RSVUNUX0VORAorI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9lcHN0cnVjdC5oIgorI2VuZGlmCisKKyNkZWZpbmUgSVBfQUREUkVTU0VTX0FORF9JRF9NQVRDSChpcGhkckEsIGlwaGRyQikgIFwKKyAgKGlwX2FkZHJfY21wKCYoaXBoZHJBKS0+c3JjLCAmKGlwaGRyQiktPnNyYykgJiYgXAorICAgaXBfYWRkcl9jbXAoJihpcGhkckEpLT5kZXN0LCAmKGlwaGRyQiktPmRlc3QpICYmIFwKKyAgIElQSF9JRChpcGhkckEpID09IElQSF9JRChpcGhkckIpKSA/IDEgOiAwCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfcmVhc3NkYXRhICpyZWFzc2RhdGFncmFtczsKK3N0YXRpYyB1MTZfdCBpcF9yZWFzc19wYnVmY291bnQ7CisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIGlwX3JlYXNzX2RlcXVldWVfZGF0YWdyYW0oc3RydWN0IGlwX3JlYXNzZGF0YSAqaXByLCBzdHJ1Y3QgaXBfcmVhc3NkYXRhICpwcmV2KTsKK3N0YXRpYyBpbnQgaXBfcmVhc3NfZnJlZV9jb21wbGV0ZV9kYXRhZ3JhbShzdHJ1Y3QgaXBfcmVhc3NkYXRhICppcHIsIHN0cnVjdCBpcF9yZWFzc2RhdGEgKnByZXYpOworCisvKioKKyAqIFJlYXNzZW1ibHkgdGltZXIgYmFzZSBmdW5jdGlvbgorICogZm9yIGJvdGggTk9fU1lTID09IDAgYW5kIDEgKCEpLgorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgZXZlcnkgMTAwMCBtc2VjIChkZWZpbmVkIGJ5IElQX1RNUl9JTlRFUlZBTCkuCisgKi8KK3ZvaWQKK2lwX3JlYXNzX3Rtcih2b2lkKQoreworICBzdHJ1Y3QgaXBfcmVhc3NkYXRhICpyLCAqcHJldiA9IE5VTEw7CisKKyAgciA9IHJlYXNzZGF0YWdyYW1zOworICB3aGlsZSAociAhPSBOVUxMKSB7CisgICAgLyogRGVjcmVtZW50IHRoZSB0aW1lci4gT25jZSBpdCByZWFjaGVzIDAsCisgICAgICogY2xlYW4gdXAgdGhlIGluY29tcGxldGUgZnJhZ21lbnQgYXNzZW1ibHkgKi8KKyAgICBpZiAoci0+dGltZXIgPiAwKSB7CisgICAgICByLT50aW1lci0tOworICAgICAgTFdJUF9ERUJVR0YoSVBfUkVBU1NfREVCVUcsICgiaXBfcmVhc3NfdG1yOiB0aW1lciBkZWMgJSJVMTZfRiJcbiIsKHUxNl90KXItPnRpbWVyKSk7CisgICAgICBwcmV2ID0gcjsKKyAgICAgIHIgPSByLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICAvKiByZWFzc2VtYmx5IHRpbWVkIG91dCAqLworICAgICAgc3RydWN0IGlwX3JlYXNzZGF0YSAqdG1wOworICAgICAgTFdJUF9ERUJVR0YoSVBfUkVBU1NfREVCVUcsICgiaXBfcmVhc3NfdG1yOiB0aW1lciB0aW1lZCBvdXRcbiIpKTsKKyAgICAgIHRtcCA9IHI7CisgICAgICAvKiBnZXQgdGhlIG5leHQgcG9pbnRlciBiZWZvcmUgZnJlZWluZyAqLworICAgICAgciA9IHItPm5leHQ7CisgICAgICAvKiBmcmVlIHRoZSBoZWxwZXIgc3RydWN0IGFuZCBhbGwgZW5xdWV1ZWQgcGJ1ZnMgKi8KKyAgICAgIGlwX3JlYXNzX2ZyZWVfY29tcGxldGVfZGF0YWdyYW0odG1wLCBwcmV2KTsKKyAgICAgfQorICAgfQorfQorCisvKioKKyAqIEZyZWUgYSBkYXRhZ3JhbSAoc3RydWN0IGlwX3JlYXNzZGF0YSkgYW5kIGFsbCBpdHMgcGJ1ZnMuCisgKiBVcGRhdGVzIHRoZSB0b3RhbCBjb3VudCBvZiBlbnF1ZXVlZCBwYnVmcyAoaXBfcmVhc3NfcGJ1ZmNvdW50KSwKKyAqIFNOTVAgY291bnRlcnMgYW5kIHNlbmRzIGFuIElDTVAgdGltZSBleGNlZWRlZCBwYWNrZXQuCisgKgorICogQHBhcmFtIGlwciBkYXRhZ3JhbSB0byBmcmVlCisgKiBAcGFyYW0gcHJldiB0aGUgcHJldmlvdXMgZGF0YWdyYW0gaW4gdGhlIGxpbmtlZCBsaXN0CisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGJ1ZnMgZnJlZWQKKyAqLworc3RhdGljIGludAoraXBfcmVhc3NfZnJlZV9jb21wbGV0ZV9kYXRhZ3JhbShzdHJ1Y3QgaXBfcmVhc3NkYXRhICppcHIsIHN0cnVjdCBpcF9yZWFzc2RhdGEgKnByZXYpCit7CisgIHUxNl90IHBidWZzX2ZyZWVkID0gMDsKKyAgdThfdCBjbGVuOworICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgc3RydWN0IGlwX3JlYXNzX2hlbHBlciAqaXByaDsKKworICBMV0lQX0FTU0VSVCgicHJldiAhPSBpcHIiLCBwcmV2ICE9IGlwcik7CisgIGlmIChwcmV2ICE9IE5VTEwpIHsKKyAgICBMV0lQX0FTU0VSVCgicHJldi0+bmV4dCA9PSBpcHIiLCBwcmV2LT5uZXh0ID09IGlwcik7CisgIH0KKworICBzbm1wX2luY19pcHJlYXNtZmFpbHMoKTsKKyNpZiBMV0lQX0lDTVAKKyAgaXByaCA9IChzdHJ1Y3QgaXBfcmVhc3NfaGVscGVyICopaXByLT5wLT5wYXlsb2FkOworICBpZiAoaXByaC0+c3RhcnQgPT0gMCkgeworICAgIC8qIFRoZSBmaXJzdCBmcmFnbWVudCB3YXMgcmVjZWl2ZWQsIHNlbmQgSUNNUCB0aW1lIGV4Y2VlZGVkLiAqLworICAgIC8qIEZpcnN0LCBkZS1xdWV1ZSB0aGUgZmlyc3QgcGJ1ZiBmcm9tIHItPnAuICovCisgICAgcCA9IGlwci0+cDsKKyAgICBpcHItPnAgPSBpcHJoLT5uZXh0X3BidWY7CisgICAgLyogVGhlbiwgY29weSB0aGUgb3JpZ2luYWwgaGVhZGVyIGludG8gaXQuICovCisgICAgU01FTUNQWShwLT5wYXlsb2FkLCAmaXByLT5pcGhkciwgSVBfSExFTik7CisgICAgaWNtcF90aW1lX2V4Y2VlZGVkKHAsIElDTVBfVEVfRlJBRyk7CisgICAgY2xlbiA9IHBidWZfY2xlbihwKTsKKyAgICBMV0lQX0FTU0VSVCgicGJ1ZnNfZnJlZWQgKyBjbGVuIDw9IDB4ZmZmZiIsIHBidWZzX2ZyZWVkICsgY2xlbiA8PSAweGZmZmYpOworICAgIHBidWZzX2ZyZWVkICs9IGNsZW47CisgICAgcGJ1Zl9mcmVlKHApOworICB9CisjZW5kaWYgLyogTFdJUF9JQ01QICovCisKKyAgLyogRmlyc3QsIGZyZWUgYWxsIHJlY2VpdmVkIHBidWZzLiAgVGhlIGluZGl2aWR1YWwgcGJ1ZnMgbmVlZCB0byBiZSByZWxlYXNlZCAKKyAgICAgc2VwYXJhdGVseSBhcyB0aGV5IGhhdmUgbm90IHlldCBiZWVuIGNoYWluZWQgKi8KKyAgcCA9IGlwci0+cDsKKyAgd2hpbGUgKHAgIT0gTlVMTCkgeworICAgIHN0cnVjdCBwYnVmICpwY3VyOworICAgIGlwcmggPSAoc3RydWN0IGlwX3JlYXNzX2hlbHBlciAqKXAtPnBheWxvYWQ7CisgICAgcGN1ciA9IHA7CisgICAgLyogZ2V0IHRoZSBuZXh0IHBvaW50ZXIgYmVmb3JlIGZyZWVpbmcgKi8KKyAgICBwID0gaXByaC0+bmV4dF9wYnVmOworICAgIGNsZW4gPSBwYnVmX2NsZW4ocGN1cik7CisgICAgTFdJUF9BU1NFUlQoInBidWZzX2ZyZWVkICsgY2xlbiA8PSAweGZmZmYiLCBwYnVmc19mcmVlZCArIGNsZW4gPD0gMHhmZmZmKTsKKyAgICBwYnVmc19mcmVlZCArPSBjbGVuOworICAgIHBidWZfZnJlZShwY3VyKTsKKyAgfQorICAvKiBUaGVuLCB1bmNoYWluIHRoZSBzdHJ1Y3QgaXBfcmVhc3NkYXRhIGZyb20gdGhlIGxpc3QgYW5kIGZyZWUgaXQuICovCisgIGlwX3JlYXNzX2RlcXVldWVfZGF0YWdyYW0oaXByLCBwcmV2KTsKKyAgTFdJUF9BU1NFUlQoImlwX3JlYXNzX3BidWZjb3VudCA+PSBjbGVuIiwgaXBfcmVhc3NfcGJ1ZmNvdW50ID49IHBidWZzX2ZyZWVkKTsKKyAgaXBfcmVhc3NfcGJ1ZmNvdW50IC09IHBidWZzX2ZyZWVkOworCisgIHJldHVybiBwYnVmc19mcmVlZDsKK30KKworI2lmIElQX1JFQVNTX0ZSRUVfT0xERVNUCisvKioKKyAqIEZyZWUgdGhlIG9sZGVzdCBkYXRhZ3JhbSB0byBtYWtlIHJvb20gZm9yIGVucXVldWVpbmcgbmV3IGZyYWdtZW50cy4KKyAqIFRoZSBkYXRhZ3JhbSAnZnJhZ2hkcicgYmVsb25ncyB0byBpcyBub3QgZnJlZWQhCisgKgorICogQHBhcmFtIGZyYWdoZHIgSVAgaGVhZGVyIG9mIHRoZSBjdXJyZW50IGZyYWdtZW50CisgKiBAcGFyYW0gcGJ1ZnNfbmVlZGVkIG51bWJlciBvZiBwYnVmcyBuZWVkZWQgdG8gZW5xdWV1ZQorICogICAgICAgICh1c2VkIGZvciBmcmVlaW5nIG90aGVyIGRhdGFncmFtcyBpZiBub3QgZW5vdWdoIHNwYWNlKQorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBidWZzIGZyZWVkCisgKi8KK3N0YXRpYyBpbnQKK2lwX3JlYXNzX3JlbW92ZV9vbGRlc3RfZGF0YWdyYW0oc3RydWN0IGlwX2hkciAqZnJhZ2hkciwgaW50IHBidWZzX25lZWRlZCkKK3sKKyAgLyogQHRvZG8gQ2FuJ3Qgd2Ugc2ltcGx5IHJlbW92ZSB0aGUgbGFzdCBkYXRhZ3JhbSBpbiB0aGUKKyAgICogICAgICAgbGlua2VkIGxpc3QgYmVoaW5kIHJlYXNzZGF0YWdyYW1zPworICAgKi8KKyAgc3RydWN0IGlwX3JlYXNzZGF0YSAqciwgKm9sZGVzdCwgKnByZXY7CisgIGludCBwYnVmc19mcmVlZCA9IDAsIHBidWZzX2ZyZWVkX2N1cnJlbnQ7CisgIGludCBvdGhlcl9kYXRhZ3JhbXM7CisKKyAgLyogRnJlZSBkYXRhZ3JhbXMgdW50aWwgYmVpbmcgYWxsb3dlZCB0byBlbnF1ZXVlICdwYnVmc19uZWVkZWQnIHBidWZzLAorICAgKiBidXQgZG9uJ3QgZnJlZSB0aGUgZGF0YWdyYW0gdGhhdCAnZnJhZ2hkcicgYmVsb25ncyB0byEgKi8KKyAgZG8geworICAgIG9sZGVzdCA9IE5VTEw7CisgICAgcHJldiA9IE5VTEw7CisgICAgb3RoZXJfZGF0YWdyYW1zID0gMDsKKyAgICByID0gcmVhc3NkYXRhZ3JhbXM7CisgICAgd2hpbGUgKHIgIT0gTlVMTCkgeworICAgICAgaWYgKCFJUF9BRERSRVNTRVNfQU5EX0lEX01BVENIKCZyLT5pcGhkciwgZnJhZ2hkcikpIHsKKyAgICAgICAgLyogTm90IHRoZSBzYW1lIGRhdGFncmFtIGFzIGZyYWdoZHIgKi8KKyAgICAgICAgb3RoZXJfZGF0YWdyYW1zKys7CisgICAgICAgIGlmIChvbGRlc3QgPT0gTlVMTCkgeworICAgICAgICAgIG9sZGVzdCA9IHI7CisgICAgICAgIH0gZWxzZSBpZiAoci0+dGltZXIgPD0gb2xkZXN0LT50aW1lcikgeworICAgICAgICAgIC8qIG9sZGVyIHRoYW4gdGhlIHByZXZpb3VzIG9sZGVzdCAqLworICAgICAgICAgIG9sZGVzdCA9IHI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChyLT5uZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgcHJldiA9IHI7CisgICAgICB9CisgICAgICByID0gci0+bmV4dDsKKyAgICB9CisgICAgaWYgKG9sZGVzdCAhPSBOVUxMKSB7CisgICAgICBwYnVmc19mcmVlZF9jdXJyZW50ID0gaXBfcmVhc3NfZnJlZV9jb21wbGV0ZV9kYXRhZ3JhbShvbGRlc3QsIHByZXYpOworICAgICAgcGJ1ZnNfZnJlZWQgKz0gcGJ1ZnNfZnJlZWRfY3VycmVudDsKKyAgICB9CisgIH0gd2hpbGUgKChwYnVmc19mcmVlZCA8IHBidWZzX25lZWRlZCkgJiYgKG90aGVyX2RhdGFncmFtcyA+IDEpKTsKKyAgcmV0dXJuIHBidWZzX2ZyZWVkOworfQorI2VuZGlmIC8qIElQX1JFQVNTX0ZSRUVfT0xERVNUICovCisKKy8qKgorICogRW5xdWV1ZXMgYSBuZXcgZnJhZ21lbnQgaW50byB0aGUgZnJhZ21lbnQgcXVldWUKKyAqIEBwYXJhbSBmcmFnaGRyIHBvaW50cyB0byB0aGUgbmV3IGZyYWdtZW50cyBJUCBoZHIKKyAqIEBwYXJhbSBjbGVuIG51bWJlciBvZiBwYnVmcyBuZWVkZWQgdG8gZW5xdWV1ZSAodXNlZCBmb3IgZnJlZWluZyBvdGhlciBkYXRhZ3JhbXMgaWYgbm90IGVub3VnaCBzcGFjZSkKKyAqIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSBxdWV1ZSBsb2NhdGlvbiBpbnRvIHdoaWNoIHRoZSBmcmFnbWVudCB3YXMgZW5xdWV1ZWQKKyAqLworc3RhdGljIHN0cnVjdCBpcF9yZWFzc2RhdGEqCitpcF9yZWFzc19lbnF1ZXVlX25ld19kYXRhZ3JhbShzdHJ1Y3QgaXBfaGRyICpmcmFnaGRyLCBpbnQgY2xlbikKK3sKKyAgc3RydWN0IGlwX3JlYXNzZGF0YSogaXByOworICAvKiBObyBtYXRjaGluZyBwcmV2aW91cyBmcmFnbWVudCBmb3VuZCwgYWxsb2NhdGUgYSBuZXcgcmVhc3NkYXRhIHN0cnVjdCAqLworICBpcHIgPSAoc3RydWN0IGlwX3JlYXNzZGF0YSAqKW1lbXBfbWFsbG9jKE1FTVBfUkVBU1NEQVRBKTsKKyAgaWYgKGlwciA9PSBOVUxMKSB7CisjaWYgSVBfUkVBU1NfRlJFRV9PTERFU1QKKyAgICBpZiAoaXBfcmVhc3NfcmVtb3ZlX29sZGVzdF9kYXRhZ3JhbShmcmFnaGRyLCBjbGVuKSA+PSBjbGVuKSB7CisgICAgICBpcHIgPSAoc3RydWN0IGlwX3JlYXNzZGF0YSAqKW1lbXBfbWFsbG9jKE1FTVBfUkVBU1NEQVRBKTsKKyAgICB9CisgICAgaWYgKGlwciA9PSBOVUxMKQorI2VuZGlmIC8qIElQX1JFQVNTX0ZSRUVfT0xERVNUICovCisgICAgeworICAgICAgSVBGUkFHX1NUQVRTX0lOQyhpcF9mcmFnLm1lbWVycik7CisgICAgICBMV0lQX0RFQlVHRihJUF9SRUFTU19ERUJVRywoIkZhaWxlZCB0byBhbGxvYyByZWFzc2RhdGEgc3RydWN0XG4iKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgbWVtc2V0KGlwciwgMCwgc2l6ZW9mKHN0cnVjdCBpcF9yZWFzc2RhdGEpKTsKKyAgaXByLT50aW1lciA9IElQX1JFQVNTX01BWEFHRTsKKworICAvKiBlbnF1ZXVlIHRoZSBuZXcgc3RydWN0dXJlIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCAqLworICBpcHItPm5leHQgPSByZWFzc2RhdGFncmFtczsKKyAgcmVhc3NkYXRhZ3JhbXMgPSBpcHI7CisgIC8qIGNvcHkgdGhlIGlwIGhlYWRlciBmb3IgbGF0ZXIgdGVzdHMgYW5kIGlucHV0ICovCisgIC8qIEB0b2RvOiBubyBpcCBvcHRpb25zIHN1cHBvcnRlZD8gKi8KKyAgU01FTUNQWSgmKGlwci0+aXBoZHIpLCBmcmFnaGRyLCBJUF9ITEVOKTsKKyAgcmV0dXJuIGlwcjsKK30KKworLyoqCisgKiBEZXF1ZXVlcyBhIGRhdGFncmFtIGZyb20gdGhlIGRhdGFncmFtIHF1ZXVlLiBEb2Vzbid0IGRlYWxsb2NhdGUgdGhlIHBidWZzLgorICogQHBhcmFtIGlwciBwb2ludHMgdG8gdGhlIHF1ZXVlIGVudHJ5IHRvIGRlcXVldWUKKyAqLworc3RhdGljIHZvaWQKK2lwX3JlYXNzX2RlcXVldWVfZGF0YWdyYW0oc3RydWN0IGlwX3JlYXNzZGF0YSAqaXByLCBzdHJ1Y3QgaXBfcmVhc3NkYXRhICpwcmV2KQoreworICAKKyAgLyogZGVxdWV1ZSB0aGUgcmVhc3Mgc3RydWN0ICAqLworICBpZiAocmVhc3NkYXRhZ3JhbXMgPT0gaXByKSB7CisgICAgLyogaXQgd2FzIHRoZSBmaXJzdCBpbiB0aGUgbGlzdCAqLworICAgIHJlYXNzZGF0YWdyYW1zID0gaXByLT5uZXh0OworICB9IGVsc2UgeworICAgIC8qIGl0IHdhc24ndCB0aGUgZmlyc3QsIHNvIGl0IG11c3QgaGF2ZSBhIHZhbGlkICdwcmV2JyAqLworICAgIExXSVBfQVNTRVJUKCJzYW5pdHkgY2hlY2sgbGlua2VkIGxpc3QiLCBwcmV2ICE9IE5VTEwpOworICAgIHByZXYtPm5leHQgPSBpcHItPm5leHQ7CisgIH0KKworICAvKiBub3cgd2UgY2FuIGZyZWUgdGhlIGlwX3JlYXNzIHN0cnVjdCAqLworICBtZW1wX2ZyZWUoTUVNUF9SRUFTU0RBVEEsIGlwcik7Cit9CisKKy8qKgorICogQ2hhaW4gYSBuZXcgcGJ1ZiBpbnRvIHRoZSBwYnVmIGxpc3QgdGhhdCBjb21wb3NlcyB0aGUgZGF0YWdyYW0uICBUaGUgcGJ1ZiBsaXN0CisgKiB3aWxsIGdyb3cgb3ZlciB0aW1lIGFzICBuZXcgcGJ1ZnMgYXJlIHJ4LgorICogQWxzbyBjaGVja3MgdGhhdCB0aGUgZGF0YWdyYW0gcGFzc2VzIGJhc2ljIGNvbnRpbnVpdHkgY2hlY2tzIChpZiB0aGUgbGFzdAorICogZnJhZ21lbnQgd2FzIHJlY2VpdmVkIGF0IGxlYXN0IG9uY2UpLgorICogQHBhcmFtIHJvb3RfcCBwb2ludHMgdG8gdGhlICdyb290JyBwYnVmIGZvciB0aGUgY3VycmVudCBkYXRhZ3JhbSBiZWluZyBhc3NlbWJsZWQuCisgKiBAcGFyYW0gbmV3X3AgcG9pbnRzIHRvIHRoZSBwYnVmIGZvciB0aGUgY3VycmVudCBmcmFnbWVudAorICogQHJldHVybiAwIGlmIGludmFsaWQsID4wIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50CitpcF9yZWFzc19jaGFpbl9mcmFnX2ludG9fZGF0YWdyYW1fYW5kX3ZhbGlkYXRlKHN0cnVjdCBpcF9yZWFzc2RhdGEgKmlwciwgc3RydWN0IHBidWYgKm5ld19wKQoreworICBzdHJ1Y3QgaXBfcmVhc3NfaGVscGVyICppcHJoLCAqaXByaF90bXAsICppcHJoX3ByZXY9TlVMTDsKKyAgc3RydWN0IHBidWYgKnE7CisgIHUxNl90IG9mZnNldCxsZW47CisgIHN0cnVjdCBpcF9oZHIgKmZyYWdoZHI7CisgIGludCB2YWxpZCA9IDE7CisKKyAgLyogRXh0cmFjdCBsZW5ndGggYW5kIGZyYWdtZW50IG9mZnNldCBmcm9tIGN1cnJlbnQgZnJhZ21lbnQgKi8KKyAgZnJhZ2hkciA9IChzdHJ1Y3QgaXBfaGRyKiluZXdfcC0+cGF5bG9hZDsgCisgIGxlbiA9IG50b2hzKElQSF9MRU4oZnJhZ2hkcikpIC0gSVBIX0hMKGZyYWdoZHIpICogNDsKKyAgb2Zmc2V0ID0gKG50b2hzKElQSF9PRkZTRVQoZnJhZ2hkcikpICYgSVBfT0ZGTUFTSykgKiA4OworCisgIC8qIG92ZXJ3cml0ZSB0aGUgZnJhZ21lbnQncyBpcCBoZWFkZXIgZnJvbSB0aGUgcGJ1ZiB3aXRoIG91ciBoZWxwZXIgc3RydWN0LAorICAgKiBhbmQgc2V0dXAgdGhlIGVtYmVkZGVkIGhlbHBlciBzdHJ1Y3R1cmUuICovCisgIC8qIG1ha2Ugc3VyZSB0aGUgc3RydWN0IGlwX3JlYXNzX2hlbHBlciBmaXRzIGludG8gdGhlIElQIGhlYWRlciAqLworICBMV0lQX0FTU0VSVCgic2l6ZW9mKHN0cnVjdCBpcF9yZWFzc19oZWxwZXIpIDw9IElQX0hMRU4iLAorICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGlwX3JlYXNzX2hlbHBlcikgPD0gSVBfSExFTik7CisgIGlwcmggPSAoc3RydWN0IGlwX3JlYXNzX2hlbHBlciopbmV3X3AtPnBheWxvYWQ7CisgIGlwcmgtPm5leHRfcGJ1ZiA9IE5VTEw7CisgIGlwcmgtPnN0YXJ0ID0gb2Zmc2V0OworICBpcHJoLT5lbmQgPSBvZmZzZXQgKyBsZW47CisKKyAgLyogSXRlcmF0ZSB0aHJvdWdoIHVudGlsIHdlIGVpdGhlciBnZXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCAoYXBwZW5kKSwKKyAgICogb3Igd2UgZmluZCBvbiB3aXRoIGEgbGFyZ2VyIG9mZnNldCAoaW5zZXJ0KS4gKi8KKyAgZm9yIChxID0gaXByLT5wOyBxICE9IE5VTEw7KSB7CisgICAgaXByaF90bXAgPSAoc3RydWN0IGlwX3JlYXNzX2hlbHBlciopcS0+cGF5bG9hZDsKKyAgICBpZiAoaXByaC0+c3RhcnQgPCBpcHJoX3RtcC0+c3RhcnQpIHsKKyAgICAgIC8qIHRoZSBuZXcgcGJ1ZiBzaG91bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoaXMgKi8KKyAgICAgIGlwcmgtPm5leHRfcGJ1ZiA9IHE7CisgICAgICBpZiAoaXByaF9wcmV2ICE9IE5VTEwpIHsKKyAgICAgICAgLyogbm90IHRoZSBmcmFnbWVudCB3aXRoIHRoZSBsb3dlc3Qgb2Zmc2V0ICovCisjaWYgSVBfUkVBU1NfQ0hFQ0tfT1ZFUkxBUAorICAgICAgICBpZiAoKGlwcmgtPnN0YXJ0IDwgaXByaF9wcmV2LT5lbmQpIHx8IChpcHJoLT5lbmQgPiBpcHJoX3RtcC0+c3RhcnQpKSB7CisgICAgICAgICAgLyogZnJhZ21lbnQgb3ZlcmxhcHMgd2l0aCBwcmV2aW91cyBvciBmb2xsb3dpbmcsIHRocm93IGF3YXkgKi8KKyAgICAgICAgICBnb3RvIGZyZWVwYnVmOworICAgICAgICB9CisjZW5kaWYgLyogSVBfUkVBU1NfQ0hFQ0tfT1ZFUkxBUCAqLworICAgICAgICBpcHJoX3ByZXYtPm5leHRfcGJ1ZiA9IG5ld19wOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZnJhZ21lbnQgd2l0aCB0aGUgbG93ZXN0IG9mZnNldCAqLworICAgICAgICBpcHItPnAgPSBuZXdfcDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZihpcHJoLT5zdGFydCA9PSBpcHJoX3RtcC0+c3RhcnQpIHsKKyAgICAgIC8qIHJlY2VpdmVkIHRoZSBzYW1lIGRhdGFncmFtIHR3aWNlOiBubyBuZWVkIHRvIGtlZXAgdGhlIGRhdGFncmFtICovCisgICAgICBnb3RvIGZyZWVwYnVmOworI2lmIElQX1JFQVNTX0NIRUNLX09WRVJMQVAKKyAgICB9IGVsc2UgaWYoaXByaC0+c3RhcnQgPCBpcHJoX3RtcC0+ZW5kKSB7CisgICAgICAvKiBvdmVybGFwOiBubyBuZWVkIHRvIGtlZXAgdGhlIG5ldyBkYXRhZ3JhbSAqLworICAgICAgZ290byBmcmVlcGJ1ZjsKKyNlbmRpZiAvKiBJUF9SRUFTU19DSEVDS19PVkVSTEFQICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBmcmFnbWVudHMgcmVjZWl2ZWQgc28gZmFyIGhhdmUgbm8gd2hvbGVzLiAqLworICAgICAgaWYgKGlwcmhfcHJldiAhPSBOVUxMKSB7CisgICAgICAgIGlmIChpcHJoX3ByZXYtPmVuZCAhPSBpcHJoX3RtcC0+c3RhcnQpIHsKKyAgICAgICAgICAvKiBUaGVyZSBpcyBhIGZyYWdtZW50IG1pc3NpbmcgYmV0d2VlbiB0aGUgY3VycmVudAorICAgICAgICAgICAqIGFuZCB0aGUgcHJldmlvdXMgZnJhZ21lbnQgKi8KKyAgICAgICAgICB2YWxpZCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcSA9IGlwcmhfdG1wLT5uZXh0X3BidWY7CisgICAgaXByaF9wcmV2ID0gaXByaF90bXA7CisgIH0KKworICAvKiBJZiBxIGlzIE5VTEwsIHRoZW4gd2UgbWFkZSBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBEZXRlcm1pbmUgd2hhdCB0byBkbyBub3cgKi8KKyAgaWYgKHEgPT0gTlVMTCkgeworICAgIGlmIChpcHJoX3ByZXYgIT0gTlVMTCkgeworICAgICAgLyogdGhpcyBpcyAoZm9yIG5vdyksIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBoaWdoZXN0IG9mZnNldDoKKyAgICAgICAqIGNoYWluIGl0IHRvIHRoZSBsYXN0IGZyYWdtZW50ICovCisjaWYgSVBfUkVBU1NfQ0hFQ0tfT1ZFUkxBUAorICAgICAgTFdJUF9BU1NFUlQoImNoZWNrIGZyYWdtZW50cyBkb24ndCBvdmVybGFwIiwgaXByaF9wcmV2LT5lbmQgPD0gaXByaC0+c3RhcnQpOworI2VuZGlmIC8qIElQX1JFQVNTX0NIRUNLX09WRVJMQVAgKi8KKyAgICAgIGlwcmhfcHJldi0+bmV4dF9wYnVmID0gbmV3X3A7CisgICAgICBpZiAoaXByaF9wcmV2LT5lbmQgIT0gaXByaC0+c3RhcnQpIHsKKyAgICAgICAgdmFsaWQgPSAwOworICAgICAgfQorICAgIH0gZWxzZSB7CisjaWYgSVBfUkVBU1NfQ0hFQ0tfT1ZFUkxBUAorICAgICAgTFdJUF9BU1NFUlQoIm5vIHByZXZpb3VzIGZyYWdtZW50LCB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IGZyYWdtZW50ISIsCisgICAgICAgIGlwci0+cCA9PSBOVUxMKTsKKyNlbmRpZiAvKiBJUF9SRUFTU19DSEVDS19PVkVSTEFQICovCisgICAgICAvKiB0aGlzIGlzIHRoZSBmaXJzdCBmcmFnbWVudCB3ZSBldmVyIHJlY2VpdmVkIGZvciB0aGlzIGlwIGRhdGFncmFtICovCisgICAgICBpcHItPnAgPSBuZXdfcDsKKyAgICB9CisgIH0KKworICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgdmFsaWRhdGlvbiBwYXJ0IGJlZ2luczogKi8KKyAgLyogSWYgd2UgYWxyZWFkeSByZWNlaXZlZCB0aGUgbGFzdCBmcmFnbWVudCAqLworICBpZiAoKGlwci0+ZmxhZ3MgJiBJUF9SRUFTU19GTEFHX0xBU1RGUkFHKSAhPSAwKSB7CisgICAgLyogYW5kIGhhZCBubyB3aG9sZXMgc28gZmFyICovCisgICAgaWYgKHZhbGlkKSB7CisgICAgICAvKiB0aGVuIGNoZWNrIGlmIHRoZSByZXN0IG9mIHRoZSBmcmFnbWVudHMgaXMgaGVyZSAqLworICAgICAgLyogQ2hlY2sgaWYgdGhlIHF1ZXVlIHN0YXJ0cyB3aXRoIHRoZSBmaXJzdCBkYXRhZ3JhbSAqLworICAgICAgaWYgKCgoc3RydWN0IGlwX3JlYXNzX2hlbHBlciopaXByLT5wLT5wYXlsb2FkKS0+c3RhcnQgIT0gMCkgeworICAgICAgICB2YWxpZCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBhbmQgY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gd2hvbGVzIGFmdGVyIHRoaXMgZGF0YWdyYW0gKi8KKyAgICAgICAgaXByaF9wcmV2ID0gaXByaDsKKyAgICAgICAgcSA9IGlwcmgtPm5leHRfcGJ1ZjsKKyAgICAgICAgd2hpbGUgKHEgIT0gTlVMTCkgeworICAgICAgICAgIGlwcmggPSAoc3RydWN0IGlwX3JlYXNzX2hlbHBlciopcS0+cGF5bG9hZDsKKyAgICAgICAgICBpZiAoaXByaF9wcmV2LT5lbmQgIT0gaXByaC0+c3RhcnQpIHsKKyAgICAgICAgICAgIHZhbGlkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpcHJoX3ByZXYgPSBpcHJoOworICAgICAgICAgIHEgPSBpcHJoLT5uZXh0X3BidWY7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgc3RpbGwgdmFsaWQsIGFsbCBmcmFnbWVudHMgYXJlIHJlY2VpdmVkCisgICAgICAgICAqIChiZWNhdXNlIHRvIHRoZSBNRj09MCBhbHJlYWR5IGFycml2ZWQgKi8KKyAgICAgICAgaWYgKHZhbGlkKSB7CisgICAgICAgICAgTFdJUF9BU1NFUlQoInNhbml0eSBjaGVjayIsIGlwci0+cCAhPSBOVUxMKTsKKyAgICAgICAgICBMV0lQX0FTU0VSVCgic2FuaXR5IGNoZWNrIiwKKyAgICAgICAgICAgICgoc3RydWN0IGlwX3JlYXNzX2hlbHBlciopaXByLT5wLT5wYXlsb2FkKSAhPSBpcHJoKTsKKyAgICAgICAgICBMV0lQX0FTU0VSVCgidmFsaWRhdGVfZGF0YWdyYW06bmV4dF9wYnVmIT1OVUxMIiwKKyAgICAgICAgICAgIGlwcmgtPm5leHRfcGJ1ZiA9PSBOVUxMKTsKKyAgICAgICAgICBMV0lQX0FTU0VSVCgidmFsaWRhdGVfZGF0YWdyYW06ZGF0YWdyYW0gZW5kIT1kYXRhZ3JhbSBsZW4iLAorICAgICAgICAgICAgaXByaC0+ZW5kID09IGlwci0+ZGF0YWdyYW1fbGVuKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBJZiB2YWxpZCBpcyAwIGhlcmUsIHRoZXJlIGFyZSBzb21lIGZyYWdtZW50cyBtaXNzaW5nIGluIHRoZSBtaWRkbGUKKyAgICAgKiAoc2luY2UgTUYgPT0gMCBoYXMgYWxyZWFkeSBhcnJpdmVkKS4gU3VjaCBkYXRhZ3JhbXMgc2ltcGx5IHRpbWUgb3V0IGlmCisgICAgICogbm8gbW9yZSBmcmFnbWVudHMgYXJlIHJlY2VpdmVkLi4uICovCisgICAgcmV0dXJuIHZhbGlkOworICB9CisgIC8qIElmIHdlIGNvbWUgaGVyZSwgbm90IGFsbCBmcmFnbWVudHMgd2VyZSByZWNlaXZlZCwgeWV0ISAqLworICByZXR1cm4gMDsgLyogbm90IHlldCB2YWxpZCEgKi8KKyNpZiBJUF9SRUFTU19DSEVDS19PVkVSTEFQCitmcmVlcGJ1ZjoKKyAgaXBfcmVhc3NfcGJ1ZmNvdW50IC09IHBidWZfY2xlbihuZXdfcCk7CisgIHBidWZfZnJlZShuZXdfcCk7CisgIHJldHVybiAwOworI2VuZGlmIC8qIElQX1JFQVNTX0NIRUNLX09WRVJMQVAgKi8KK30KKworLyoqCisgKiBSZWFzc2VtYmxlcyBpbmNvbWluZyBJUCBmcmFnbWVudHMgaW50byBhbiBJUCBkYXRhZ3JhbS4KKyAqCisgKiBAcGFyYW0gcCBwb2ludHMgdG8gYSBwYnVmIGNoYWluIG9mIHRoZSBmcmFnbWVudAorICogQHJldHVybiBOVUxMIGlmIHJlYXNzZW1ibHkgaXMgaW5jb21wbGV0ZSwgPyBvdGhlcndpc2UKKyAqLworc3RydWN0IHBidWYgKgoraXBfcmVhc3Moc3RydWN0IHBidWYgKnApCit7CisgIHN0cnVjdCBwYnVmICpyOworICBzdHJ1Y3QgaXBfaGRyICpmcmFnaGRyOworICBzdHJ1Y3QgaXBfcmVhc3NkYXRhICppcHI7CisgIHN0cnVjdCBpcF9yZWFzc19oZWxwZXIgKmlwcmg7CisgIHUxNl90IG9mZnNldCwgbGVuOworICB1OF90IGNsZW47CisgIHN0cnVjdCBpcF9yZWFzc2RhdGEgKmlwcl9wcmV2ID0gTlVMTDsKKworICBJUEZSQUdfU1RBVFNfSU5DKGlwX2ZyYWcucmVjdik7CisgIHNubXBfaW5jX2lwcmVhc21yZXFkcygpOworCisgIGZyYWdoZHIgPSAoc3RydWN0IGlwX2hkciopcC0+cGF5bG9hZDsKKworICBpZiAoKElQSF9ITChmcmFnaGRyKSAqIDQpICE9IElQX0hMRU4pIHsKKyAgICBMV0lQX0RFQlVHRihJUF9SRUFTU19ERUJVRywoImlwX3JlYXNzOiBJUCBvcHRpb25zIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIVxuIikpOworICAgIElQRlJBR19TVEFUU19JTkMoaXBfZnJhZy5lcnIpOworICAgIGdvdG8gbnVsbHJldHVybjsKKyAgfQorCisgIG9mZnNldCA9IChudG9ocyhJUEhfT0ZGU0VUKGZyYWdoZHIpKSAmIElQX09GRk1BU0spICogODsKKyAgbGVuID0gbnRvaHMoSVBIX0xFTihmcmFnaGRyKSkgLSBJUEhfSEwoZnJhZ2hkcikgKiA0OworCisgIC8qIENoZWNrIGlmIHdlIGFyZSBhbGxvd2VkIHRvIGVucXVldWUgbW9yZSBkYXRhZ3JhbXMuICovCisgIGNsZW4gPSBwYnVmX2NsZW4ocCk7CisgIGlmICgoaXBfcmVhc3NfcGJ1ZmNvdW50ICsgY2xlbikgPiBJUF9SRUFTU19NQVhfUEJVRlMpIHsKKyNpZiBJUF9SRUFTU19GUkVFX09MREVTVAorICAgIGlmICghaXBfcmVhc3NfcmVtb3ZlX29sZGVzdF9kYXRhZ3JhbShmcmFnaGRyLCBjbGVuKSB8fAorICAgICAgICAoKGlwX3JlYXNzX3BidWZjb3VudCArIGNsZW4pID4gSVBfUkVBU1NfTUFYX1BCVUZTKSkKKyNlbmRpZiAvKiBJUF9SRUFTU19GUkVFX09MREVTVCAqLworICAgIHsKKyAgICAgIC8qIE5vIGRhdGFncmFtIGNvdWxkIGJlIGZyZWVkIGFuZCBzdGlsbCB0b28gbWFueSBwYnVmcyBlbnF1ZXVlZCAqLworICAgICAgTFdJUF9ERUJVR0YoSVBfUkVBU1NfREVCVUcsKCJpcF9yZWFzczogT3ZlcmZsb3cgY29uZGl0aW9uOiBwYnVmY3Q9JWQsIGNsZW49JWQsIE1BWD0lZFxuIiwKKyAgICAgICAgaXBfcmVhc3NfcGJ1ZmNvdW50LCBjbGVuLCBJUF9SRUFTU19NQVhfUEJVRlMpKTsKKyAgICAgIElQRlJBR19TVEFUU19JTkMoaXBfZnJhZy5tZW1lcnIpOworICAgICAgLyogQHRvZG86IHNlbmQgSUNNUCB0aW1lIGV4Y2VlZGVkIGhlcmU/ICovCisgICAgICAvKiBkcm9wIHRoaXMgcGJ1ZiAqLworICAgICAgZ290byBudWxscmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIExvb2sgZm9yIHRoZSBkYXRhZ3JhbSB0aGUgZnJhZ21lbnQgYmVsb25ncyB0byBpbiB0aGUgY3VycmVudCBkYXRhZ3JhbSBxdWV1ZSwKKyAgICogcmVtZW1iZXJpbmcgdGhlIHByZXZpb3VzIGluIHRoZSBxdWV1ZSBmb3IgbGF0ZXIgZGVxdWV1ZWluZy4gKi8KKyAgZm9yIChpcHIgPSByZWFzc2RhdGFncmFtczsgaXByICE9IE5VTEw7IGlwciA9IGlwci0+bmV4dCkgeworICAgIC8qIENoZWNrIGlmIHRoZSBpbmNvbWluZyBmcmFnbWVudCBtYXRjaGVzIHRoZSBvbmUgY3VycmVudGx5IHByZXNlbnQKKyAgICAgICBpbiB0aGUgcmVhc3NlbWJseSBidWZmZXIuIElmIHNvLCB3ZSBwcm9jZWVkIHdpdGggY29weWluZyB0aGUKKyAgICAgICBmcmFnbWVudCBpbnRvIHRoZSBidWZmZXIuICovCisgICAgaWYgKElQX0FERFJFU1NFU19BTkRfSURfTUFUQ0goJmlwci0+aXBoZHIsIGZyYWdoZHIpKSB7CisgICAgICBMV0lQX0RFQlVHRihJUF9SRUFTU19ERUJVRywgKCJpcF9yZWFzczogbWF0Y2hpbmcgcHJldmlvdXMgZnJhZ21lbnQgSUQ9JSJYMTZfRiJcbiIsCisgICAgICAgIG50b2hzKElQSF9JRChmcmFnaGRyKSkpKTsKKyAgICAgIElQRlJBR19TVEFUU19JTkMoaXBfZnJhZy5jYWNoZWhpdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaXByX3ByZXYgPSBpcHI7CisgIH0KKworICBpZiAoaXByID09IE5VTEwpIHsKKyAgLyogRW5xdWV1ZSBhIG5ldyBkYXRhZ3JhbSBpbnRvIHRoZSBkYXRhZ3JhbSBxdWV1ZSAqLworICAgIGlwciA9IGlwX3JlYXNzX2VucXVldWVfbmV3X2RhdGFncmFtKGZyYWdoZHIsIGNsZW4pOworICAgIC8qIEJhaWwgaWYgdW5hYmxlIHRvIGVucXVldWUgKi8KKyAgICBpZihpcHIgPT0gTlVMTCkgeworICAgICAgZ290byBudWxscmV0dXJuOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoKChudG9ocyhJUEhfT0ZGU0VUKGZyYWdoZHIpKSAmIElQX09GRk1BU0spID09IDApICYmIAorICAgICAgKChudG9ocyhJUEhfT0ZGU0VUKCZpcHItPmlwaGRyKSkgJiBJUF9PRkZNQVNLKSAhPSAwKSkgeworICAgICAgLyogaXByLT5pcGhkciBpcyBub3QgdGhlIGhlYWRlciBmcm9tIHRoZSBmaXJzdCBmcmFnbWVudCwgYnV0IGZyYWdoZHIgaXMKKyAgICAgICAqIC0+IGNvcHkgZnJhZ2hkciBpbnRvIGlwci0+aXBoZHIgc2luY2Ugd2Ugd2FudCB0byBoYXZlIHRoZSBoZWFkZXIKKyAgICAgICAqIG9mIHRoZSBmaXJzdCBmcmFnbWVudCAoZm9yIElDTVAgdGltZSBleGNlZWRlZCBhbmQgbGF0ZXIsIGZvciBjb3B5aW5nCisgICAgICAgKiBhbGwgb3B0aW9ucywgaWYgc3VwcG9ydGVkKSovCisgICAgICBTTUVNQ1BZKCZpcHItPmlwaGRyLCBmcmFnaGRyLCBJUF9ITEVOKTsKKyAgICB9CisgIH0KKyAgLyogVHJhY2sgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBidWZzIGN1cnJlbnQgJ2luLWZsaWdodCcsIGluIG9yZGVyIHRvIGxpbWl0IAorICB0aGUgbnVtYmVyIG9mIGZyYWdtZW50cyB0aGF0IG1heSBiZSBlbnF1ZXVlZCBhdCBhbnkgb25lIHRpbWUgKi8KKyAgaXBfcmVhc3NfcGJ1ZmNvdW50ICs9IGNsZW47CisKKyAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBlaXRoZXIgY3JlYXRlZCBhIG5ldyBlbnRyeSBvciBwb2ludGluZyAKKyAgICogdG8gYW4gZXhpc3Rpbmcgb25lICovCisKKyAgLyogY2hlY2sgZm9yICdubyBtb3JlIGZyYWdtZW50cycsIGFuZCB1cGRhdGUgcXVldWUgZW50cnkqLworICBpZiAoKElQSF9PRkZTRVQoZnJhZ2hkcikgJiBQUF9OVE9IUyhJUF9NRikpID09IDApIHsKKyAgICBpcHItPmZsYWdzIHw9IElQX1JFQVNTX0ZMQUdfTEFTVEZSQUc7CisgICAgaXByLT5kYXRhZ3JhbV9sZW4gPSBvZmZzZXQgKyBsZW47CisgICAgTFdJUF9ERUJVR0YoSVBfUkVBU1NfREVCVUcsCisgICAgICgiaXBfcmVhc3M6IGxhc3QgZnJhZ21lbnQgc2VlbiwgdG90YWwgbGVuICUiUzE2X0YiXG4iLAorICAgICAgaXByLT5kYXRhZ3JhbV9sZW4pKTsKKyAgfQorICAvKiBmaW5kIHRoZSByaWdodCBwbGFjZSB0byBpbnNlcnQgdGhpcyBwYnVmICovCisgIC8qIEB0b2RvOiB0cmltIHBidWZzIGlmIGZyYWdtZW50cyBhcmUgb3ZlcmxhcHBpbmcgKi8KKyAgaWYgKGlwX3JlYXNzX2NoYWluX2ZyYWdfaW50b19kYXRhZ3JhbV9hbmRfdmFsaWRhdGUoaXByLCBwKSkgeworICAgIC8qIHRoZSB0b3RhbGx5IGxhc3QgZnJhZ21lbnQgKGZsYWcgbW9yZSBmcmFnbWVudHMgPSAwKSB3YXMgcmVjZWl2ZWQgYXQgbGVhc3QKKyAgICAgKiBvbmNlIEFORCBhbGwgZnJhZ21lbnRzIGFyZSByZWNlaXZlZCAqLworICAgIGlwci0+ZGF0YWdyYW1fbGVuICs9IElQX0hMRU47CisKKyAgICAvKiBzYXZlIHRoZSBzZWNvbmQgcGJ1ZiBiZWZvcmUgY29weWluZyB0aGUgaGVhZGVyIG92ZXIgdGhlIHBvaW50ZXIgKi8KKyAgICByID0gKChzdHJ1Y3QgaXBfcmVhc3NfaGVscGVyKilpcHItPnAtPnBheWxvYWQpLT5uZXh0X3BidWY7CisKKyAgICAvKiBjb3B5IHRoZSBvcmlnaW5hbCBpcCBoZWFkZXIgYmFjayB0byB0aGUgZmlyc3QgcGJ1ZiAqLworICAgIGZyYWdoZHIgPSAoc3RydWN0IGlwX2hkciopKGlwci0+cC0+cGF5bG9hZCk7CisgICAgU01FTUNQWShmcmFnaGRyLCAmaXByLT5pcGhkciwgSVBfSExFTik7CisgICAgSVBIX0xFTl9TRVQoZnJhZ2hkciwgaHRvbnMoaXByLT5kYXRhZ3JhbV9sZW4pKTsKKyAgICBJUEhfT0ZGU0VUX1NFVChmcmFnaGRyLCAwKTsKKyAgICBJUEhfQ0hLU1VNX1NFVChmcmFnaGRyLCAwKTsKKyAgICAvKiBAdG9kbzogZG8gd2UgbmVlZCB0byBzZXQgY2FsY3VsYXRlIHRoZSBjb3JyZWN0IGNoZWNrc3VtPyAqLworICAgIElQSF9DSEtTVU1fU0VUKGZyYWdoZHIsIGluZXRfY2hrc3VtKGZyYWdoZHIsIElQX0hMRU4pKTsKKworICAgIHAgPSBpcHItPnA7CisKKyAgICAvKiBjaGFpbiB0b2dldGhlciB0aGUgcGJ1ZnMgY29udGFpbmVkIHdpdGhpbiB0aGUgcmVhc3NfZGF0YSBsaXN0LiAqLworICAgIHdoaWxlKHIgIT0gTlVMTCkgeworICAgICAgaXByaCA9IChzdHJ1Y3QgaXBfcmVhc3NfaGVscGVyKilyLT5wYXlsb2FkOworCisgICAgICAvKiBoaWRlIHRoZSBpcCBoZWFkZXIgZm9yIGV2ZXJ5IHN1Y2NlZGluZyBmcmFnbWVudCAqLworICAgICAgcGJ1Zl9oZWFkZXIociwgLUlQX0hMRU4pOworICAgICAgcGJ1Zl9jYXQocCwgcik7CisgICAgICByID0gaXByaC0+bmV4dF9wYnVmOworICAgIH0KKyAgICAvKiByZWxlYXNlIHRoZSBzb3VyY2VzIGFsbG9jYXRlIGZvciB0aGUgZnJhZ21lbnQgcXVldWUgZW50cnkgKi8KKyAgICBpcF9yZWFzc19kZXF1ZXVlX2RhdGFncmFtKGlwciwgaXByX3ByZXYpOworCisgICAgLyogYW5kIGFkanVzdCB0aGUgbnVtYmVyIG9mIHBidWZzIGN1cnJlbnRseSBxdWV1ZWQgZm9yIHJlYXNzZW1ibHkuICovCisgICAgaXBfcmVhc3NfcGJ1ZmNvdW50IC09IHBidWZfY2xlbihwKTsKKworICAgIC8qIFJldHVybiB0aGUgcGJ1ZiBjaGFpbiAqLworICAgIHJldHVybiBwOworICB9CisgIC8qIHRoZSBkYXRhZ3JhbSBpcyBub3QgKHlldD8pIHJlYXNzZW1ibGVkIGNvbXBsZXRlbHkgKi8KKyAgTFdJUF9ERUJVR0YoSVBfUkVBU1NfREVCVUcsKCJpcF9yZWFzc19wYnVmY291bnQ6ICVkIG91dFxuIiwgaXBfcmVhc3NfcGJ1ZmNvdW50KSk7CisgIHJldHVybiBOVUxMOworCitudWxscmV0dXJuOgorICBMV0lQX0RFQlVHRihJUF9SRUFTU19ERUJVRywoImlwX3JlYXNzOiBudWxscmV0dXJuXG4iKSk7CisgIElQRlJBR19TVEFUU19JTkMoaXBfZnJhZy5kcm9wKTsKKyAgcGJ1Zl9mcmVlKHApOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBJUF9SRUFTU0VNQkxZICovCisKKyNpZiBJUF9GUkFHCisjaWYgSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYKK3N0YXRpYyB1OF90IGJ1ZltMV0lQX01FTV9BTElHTl9TSVpFKElQX0ZSQUdfTUFYX01UVSArIE1FTV9BTElHTk1FTlQgLSAxKV07CisjZWxzZSAvKiBJUF9GUkFHX1VTRVNfU1RBVElDX0JVRiAqLworCisjaWYgIUxXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYKKy8qKiBBbGxvY2F0ZSBhIG5ldyBzdHJ1Y3QgcGJ1Zl9jdXN0b21fcmVmICovCitzdGF0aWMgc3RydWN0IHBidWZfY3VzdG9tX3JlZioKK2lwX2ZyYWdfYWxsb2NfcGJ1Zl9jdXN0b21fcmVmKHZvaWQpCit7CisgIHJldHVybiAoc3RydWN0IHBidWZfY3VzdG9tX3JlZiopbWVtcF9tYWxsb2MoTUVNUF9GUkFHX1BCVUYpOworfQorCisvKiogRnJlZSBhIHN0cnVjdCBwYnVmX2N1c3RvbV9yZWYgKi8KK3N0YXRpYyB2b2lkCitpcF9mcmFnX2ZyZWVfcGJ1Zl9jdXN0b21fcmVmKHN0cnVjdCBwYnVmX2N1c3RvbV9yZWYqIHApCit7CisgIExXSVBfQVNTRVJUKCJwICE9IE5VTEwiLCBwICE9IE5VTEwpOworICBtZW1wX2ZyZWUoTUVNUF9GUkFHX1BCVUYsIHApOworfQorCisvKiogRnJlZS1jYWxsYmFjayBmdW5jdGlvbiB0byBmcmVlIGEgJ3N0cnVjdCBwYnVmX2N1c3RvbV9yZWYnLCBjYWxsZWQgYnkKKyAqIHBidWZfZnJlZS4gKi8KK3N0YXRpYyB2b2lkCitpcGZyYWdfZnJlZV9wYnVmX2N1c3RvbShzdHJ1Y3QgcGJ1ZiAqcCkKK3sKKyAgc3RydWN0IHBidWZfY3VzdG9tX3JlZiAqcGNyID0gKHN0cnVjdCBwYnVmX2N1c3RvbV9yZWYqKXA7CisgIExXSVBfQVNTRVJUKCJwY3IgIT0gTlVMTCIsIHBjciAhPSBOVUxMKTsKKyAgTFdJUF9BU1NFUlQoInBjciA9PSBwIiwgKHZvaWQqKXBjciA9PSAodm9pZCopcCk7CisgIGlmIChwY3ItPm9yaWdpbmFsICE9IE5VTEwpIHsKKyAgICBwYnVmX2ZyZWUocGNyLT5vcmlnaW5hbCk7CisgIH0KKyAgaXBfZnJhZ19mcmVlX3BidWZfY3VzdG9tX3JlZihwY3IpOworfQorI2VuZGlmIC8qICFMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGICovCisjZW5kaWYgLyogSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgKi8KKworLyoqCisgKiBGcmFnbWVudCBhbiBJUCBkYXRhZ3JhbSBpZiB0b28gbGFyZ2UgZm9yIHRoZSBuZXRpZi4KKyAqCisgKiBDaG9wIHRoZSBkYXRhZ3JhbSBpbiBNVFUgc2l6ZWQgY2h1bmtzIGFuZCBzZW5kIHRoZW0gaW4gb3JkZXIKKyAqIGJ5IHVzaW5nIGEgZml4ZWQgc2l6ZSBzdGF0aWMgbWVtb3J5IGJ1ZmZlciAoUEJVRl9SRUYpIG9yCisgKiBwb2ludCBQQlVGX1JFRnMgaW50byBwIChkZXBlbmRpbmcgb24gSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYpLgorICoKKyAqIEBwYXJhbSBwIGlwIHBhY2tldCB0byBzZW5kCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldGlmIG9uIHdoaWNoIHRvIHNlbmQKKyAqIEBwYXJhbSBkZXN0IGRlc3RpbmF0aW9uIGlwIGFkZHJlc3MgdG8gd2hpY2ggdG8gc2VuZAorICoKKyAqIEByZXR1cm4gRVJSX09LIGlmIHNlbnQgc3VjY2Vzc2Z1bGx5LCBlcnJfdCBvdGhlcndpc2UKKyAqLworZXJyX3QgCitpcF9mcmFnKHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKmRlc3QpCit7CisgIHN0cnVjdCBwYnVmICpyYW1idWY7CisjaWYgSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYKKyAgc3RydWN0IHBidWYgKmhlYWRlcjsKKyNlbHNlCisjaWYgIUxXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYKKyAgc3RydWN0IHBidWYgKm5ld3BidWY7CisjZW5kaWYKKyAgc3RydWN0IGlwX2hkciAqb3JpZ2luYWxfaXBoZHI7CisjZW5kaWYKKyAgc3RydWN0IGlwX2hkciAqaXBoZHI7CisgIHUxNl90IG5mYjsKKyAgdTE2X3QgbGVmdCwgY29wOworICB1MTZfdCBtdHUgPSBuZXRpZi0+bXR1OworICB1MTZfdCBvZm8sIG9tZjsKKyAgdTE2X3QgbGFzdDsKKyAgdTE2X3QgcG9mZiA9IElQX0hMRU47CisgIHUxNl90IHRtcDsKKyNpZiAhSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgJiYgIUxXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYKKyAgdTE2X3QgbmV3cGJ1ZmxlbiA9IDA7CisgIHUxNl90IGxlZnRfdG9fY29weTsKKyNlbmRpZgorCisgIC8qIEdldCBhIFJBTSBiYXNlZCBNVFUgc2l6ZWQgcGJ1ZiAqLworI2lmIElQX0ZSQUdfVVNFU19TVEFUSUNfQlVGCisgIC8qIFdoZW4gdXNpbmcgYSBzdGF0aWMgYnVmZmVyLCB3ZSB1c2UgYSBQQlVGX1JFRiwgd2hpY2ggd2Ugd2lsbAorICAgKiB1c2UgdG8gcmVmZXJlbmNlIHRoZSBwYWNrZXQgKHdpdGhvdXQgbGluayBoZWFkZXIpLgorICAgKiBMYXllciBhbmQgbGVuZ3RoIGlzIGlycmVsZXZhbnQuCisgICAqLworICByYW1idWYgPSBwYnVmX2FsbG9jKFBCVUZfTElOSywgMCwgUEJVRl9SRUYpOworICBpZiAocmFtYnVmID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihJUF9SRUFTU19ERUJVRywgKCJpcF9mcmFnOiBwYnVmX2FsbG9jKFBCVUZfTElOSywgMCwgUEJVRl9SRUYpIGZhaWxlZFxuIikpOworICAgIHJldHVybiBFUlJfTUVNOworICB9CisgIHJhbWJ1Zi0+dG90X2xlbiA9IHJhbWJ1Zi0+bGVuID0gbXR1OworICByYW1idWYtPnBheWxvYWQgPSBMV0lQX01FTV9BTElHTigodm9pZCAqKWJ1Zik7CisKKyAgLyogQ29weSB0aGUgSVAgaGVhZGVyIGluIGl0ICovCisgIGlwaGRyID0gKHN0cnVjdCBpcF9oZHIgKilyYW1idWYtPnBheWxvYWQ7CisgIFNNRU1DUFkoaXBoZHIsIHAtPnBheWxvYWQsIElQX0hMRU4pOworI2Vsc2UgLyogSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgKi8KKyAgb3JpZ2luYWxfaXBoZHIgPSAoc3RydWN0IGlwX2hkciAqKXAtPnBheWxvYWQ7CisgIGlwaGRyID0gb3JpZ2luYWxfaXBoZHI7CisjZW5kaWYgLyogSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgKi8KKworICAvKiBTYXZlIG9yaWdpbmFsIG9mZnNldCAqLworICB0bXAgPSBudG9ocyhJUEhfT0ZGU0VUKGlwaGRyKSk7CisgIG9mbyA9IHRtcCAmIElQX09GRk1BU0s7CisgIG9tZiA9IHRtcCAmIElQX01GOworCisgIGxlZnQgPSBwLT50b3RfbGVuIC0gSVBfSExFTjsKKworICBuZmIgPSAobXR1IC0gSVBfSExFTikgLyA4OworCisgIHdoaWxlIChsZWZ0KSB7CisgICAgbGFzdCA9IChsZWZ0IDw9IG10dSAtIElQX0hMRU4pOworCisgICAgLyogU2V0IG5ldyBvZmZzZXQgYW5kIE1GIGZsYWcgKi8KKyAgICB0bXAgPSBvbWYgfCAoSVBfT0ZGTUFTSyAmIChvZm8pKTsKKyAgICBpZiAoIWxhc3QpIHsKKyAgICAgIHRtcCA9IHRtcCB8IElQX01GOworICAgIH0KKworICAgIC8qIEZpbGwgdGhpcyBmcmFnbWVudCAqLworICAgIGNvcCA9IGxhc3QgPyBsZWZ0IDogbmZiICogODsKKworI2lmIElQX0ZSQUdfVVNFU19TVEFUSUNfQlVGCisgICAgcG9mZiArPSBwYnVmX2NvcHlfcGFydGlhbChwLCAodThfdCopaXBoZHIgKyBJUF9ITEVOLCBjb3AsIHBvZmYpOworI2Vsc2UgLyogSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgKi8KKyNpZiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGCisgICAgcmFtYnVmID0gcGJ1Zl9hbGxvYyhQQlVGX0lQLCBjb3AsIFBCVUZfUkFNKTsKKyAgICBpZiAocmFtYnVmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBFUlJfTUVNOworICAgIH0KKyAgICBMV0lQX0FTU0VSVCgidGhpcyBuZWVkcyBhIHBidWYgaW4gb25lIHBpZWNlISIsCisgICAgICAocmFtYnVmLT5sZW4gPT0gcmFtYnVmLT50b3RfbGVuKSAmJiAocmFtYnVmLT5uZXh0ID09IE5VTEwpKTsKKyAgICBwb2ZmICs9IHBidWZfY29weV9wYXJ0aWFsKHAsIHJhbWJ1Zi0+cGF5bG9hZCwgY29wLCBwb2ZmKTsKKyAgICAvKiBtYWtlIHJvb20gZm9yIHRoZSBJUCBoZWFkZXIgKi8KKyAgICBpZihwYnVmX2hlYWRlcihyYW1idWYsIElQX0hMRU4pKSB7CisgICAgICBwYnVmX2ZyZWUocmFtYnVmKTsKKyAgICAgIHJldHVybiBFUlJfTUVNOworICAgIH0KKyAgICAvKiBmaWxsIGluIHRoZSBJUCBoZWFkZXIgKi8KKyAgICBTTUVNQ1BZKHJhbWJ1Zi0+cGF5bG9hZCwgb3JpZ2luYWxfaXBoZHIsIElQX0hMRU4pOworICAgIGlwaGRyID0gcmFtYnVmLT5wYXlsb2FkOworI2Vsc2UgLyogTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRiAqLworICAgIC8qIFdoZW4gbm90IHVzaW5nIGEgc3RhdGljIGJ1ZmZlciwgY3JlYXRlIGEgY2hhaW4gb2YgcGJ1ZnMuCisgICAgICogVGhlIGZpcnN0IHdpbGwgYmUgYSBQQlVGX1JBTSBob2xkaW5nIHRoZSBsaW5rIGFuZCBJUCBoZWFkZXIuCisgICAgICogVGhlIHJlc3Qgd2lsbCBiZSBQQlVGX1JFRnMgbWlycm9yaW5nIHRoZSBwYnVmIGNoYWluIHRvIGJlIGZyYWdnZWQsCisgICAgICogYnV0IGxpbWl0ZWQgdG8gdGhlIHNpemUgb2YgYW4gbXR1LgorICAgICAqLworICAgIHJhbWJ1ZiA9IHBidWZfYWxsb2MoUEJVRl9MSU5LLCBJUF9ITEVOLCBQQlVGX1JBTSk7CisgICAgaWYgKHJhbWJ1ZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRVJSX01FTTsKKyAgICB9CisgICAgTFdJUF9BU1NFUlQoInRoaXMgbmVlZHMgYSBwYnVmIGluIG9uZSBwaWVjZSEiLAorICAgICAgICAgICAgICAgIChwLT5sZW4gPj0gKElQX0hMRU4pKSk7CisgICAgU01FTUNQWShyYW1idWYtPnBheWxvYWQsIG9yaWdpbmFsX2lwaGRyLCBJUF9ITEVOKTsKKyAgICBpcGhkciA9IChzdHJ1Y3QgaXBfaGRyICopcmFtYnVmLT5wYXlsb2FkOworCisgICAgLyogQ2FuIGp1c3QgYWRqdXN0IHAgZGlyZWN0bHkgZm9yIG5lZWRlZCBvZmZzZXQuICovCisgICAgcC0+cGF5bG9hZCA9ICh1OF90ICopcC0+cGF5bG9hZCArIHBvZmY7CisgICAgcC0+bGVuIC09IHBvZmY7CisKKyAgICBsZWZ0X3RvX2NvcHkgPSBjb3A7CisgICAgd2hpbGUgKGxlZnRfdG9fY29weSkgeworICAgICAgc3RydWN0IHBidWZfY3VzdG9tX3JlZiAqcGNyOworICAgICAgbmV3cGJ1ZmxlbiA9IChsZWZ0X3RvX2NvcHkgPCBwLT5sZW4pID8gbGVmdF90b19jb3B5IDogcC0+bGVuOworICAgICAgLyogSXMgdGhpcyBwYnVmIGFscmVhZHkgZW1wdHk/ICovCisgICAgICBpZiAoIW5ld3BidWZsZW4pIHsKKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcGNyID0gaXBfZnJhZ19hbGxvY19wYnVmX2N1c3RvbV9yZWYoKTsKKyAgICAgIGlmIChwY3IgPT0gTlVMTCkgeworICAgICAgICBwYnVmX2ZyZWUocmFtYnVmKTsKKyAgICAgICAgcmV0dXJuIEVSUl9NRU07CisgICAgICB9CisgICAgICAvKiBNaXJyb3IgdGhpcyBwYnVmLCBhbHRob3VnaCB3ZSBtaWdodCBub3QgbmVlZCBhbGwgb2YgaXQuICovCisgICAgICBuZXdwYnVmID0gcGJ1Zl9hbGxvY2VkX2N1c3RvbShQQlVGX1JBVywgbmV3cGJ1ZmxlbiwgUEJVRl9SRUYsICZwY3ItPnBjLCBwLT5wYXlsb2FkLCBuZXdwYnVmbGVuKTsKKyAgICAgIGlmIChuZXdwYnVmID09IE5VTEwpIHsKKyAgICAgICAgaXBfZnJhZ19mcmVlX3BidWZfY3VzdG9tX3JlZihwY3IpOworICAgICAgICBwYnVmX2ZyZWUocmFtYnVmKTsKKyAgICAgICAgcmV0dXJuIEVSUl9NRU07CisgICAgICB9CisgICAgICBwYnVmX3JlZihwKTsKKyAgICAgIHBjci0+b3JpZ2luYWwgPSBwOworICAgICAgcGNyLT5wYy5jdXN0b21fZnJlZV9mdW5jdGlvbiA9IGlwZnJhZ19mcmVlX3BidWZfY3VzdG9tOworCisgICAgICAvKiBBZGQgaXQgdG8gZW5kIG9mIHJhbWJ1ZidzIGNoYWluLCBidXQgdXNpbmcgcGJ1Zl9jYXQsIG5vdCBwYnVmX2NoYWluCisgICAgICAgKiBzbyB0aGF0IGl0IGlzIHJlbW92ZWQgd2hlbiBwYnVmX2RlY2hhaW4gaXMgbGF0ZXIgY2FsbGVkIG9uIHJhbWJ1Zi4KKyAgICAgICAqLworICAgICAgcGJ1Zl9jYXQocmFtYnVmLCBuZXdwYnVmKTsKKyAgICAgIGxlZnRfdG9fY29weSAtPSBuZXdwYnVmbGVuOworICAgICAgaWYgKGxlZnRfdG9fY29weSkgeworICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisgICAgcG9mZiA9IG5ld3BidWZsZW47CisjZW5kaWYgLyogTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRiAqLworI2VuZGlmIC8qIElQX0ZSQUdfVVNFU19TVEFUSUNfQlVGICovCisKKyAgICAvKiBDb3JyZWN0IGhlYWRlciAqLworICAgIElQSF9PRkZTRVRfU0VUKGlwaGRyLCBodG9ucyh0bXApKTsKKyAgICBJUEhfTEVOX1NFVChpcGhkciwgaHRvbnMoY29wICsgSVBfSExFTikpOworICAgIElQSF9DSEtTVU1fU0VUKGlwaGRyLCAwKTsKKyAgICBJUEhfQ0hLU1VNX1NFVChpcGhkciwgaW5ldF9jaGtzdW0oaXBoZHIsIElQX0hMRU4pKTsKKworI2lmIElQX0ZSQUdfVVNFU19TVEFUSUNfQlVGCisgICAgaWYgKGxhc3QpIHsKKyAgICAgIHBidWZfcmVhbGxvYyhyYW1idWYsIGxlZnQgKyBJUF9ITEVOKTsKKyAgICB9CisKKyAgICAvKiBUaGlzIHBhcnQgaXMgdWdseTogd2UgYWxsb2MgYSBSQU0gYmFzZWQgcGJ1ZiBmb3IgCisgICAgICogdGhlIGxpbmsgbGV2ZWwgaGVhZGVyIGZvciBlYWNoIGNodW5rIGFuZCB0aGVuIAorICAgICAqIGZyZWUgaXQuQSBQQlVGX1JPTSBzdHlsZSBwYnVmIGZvciB3aGljaCBwYnVmX2hlYWRlcgorICAgICAqIHdvcmtlZCB3b3VsZCBtYWtlIHRoaW5ncyBzaW1wbGVyLgorICAgICAqLworICAgIGhlYWRlciA9IHBidWZfYWxsb2MoUEJVRl9MSU5LLCAwLCBQQlVGX1JBTSk7CisgICAgaWYgKGhlYWRlciAhPSBOVUxMKSB7CisgICAgICBwYnVmX2NoYWluKGhlYWRlciwgcmFtYnVmKTsKKyAgICAgIG5ldGlmLT5vdXRwdXQobmV0aWYsIGhlYWRlciwgZGVzdCk7CisgICAgICBJUEZSQUdfU1RBVFNfSU5DKGlwX2ZyYWcueG1pdCk7CisgICAgICBzbm1wX2luY19pcGZyYWdjcmVhdGVzKCk7CisgICAgICBwYnVmX2ZyZWUoaGVhZGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgTFdJUF9ERUJVR0YoSVBfUkVBU1NfREVCVUcsICgiaXBfZnJhZzogcGJ1Zl9hbGxvYygpIGZvciBoZWFkZXIgZmFpbGVkXG4iKSk7CisgICAgICBwYnVmX2ZyZWUocmFtYnVmKTsKKyAgICAgIHJldHVybiBFUlJfTUVNOworICAgIH0KKyNlbHNlIC8qIElQX0ZSQUdfVVNFU19TVEFUSUNfQlVGICovCisgICAgLyogTm8gbmVlZCBmb3Igc2VwYXJhdGUgaGVhZGVyIHBidWYgLSB3ZSBhbGxvd2VkIHJvb20gZm9yIGl0IGluIHJhbWJ1ZgorICAgICAqIHdoZW4gYWxsb2NhdGVkLgorICAgICAqLworICAgIG5ldGlmLT5vdXRwdXQobmV0aWYsIHJhbWJ1ZiwgZGVzdCk7CisgICAgSVBGUkFHX1NUQVRTX0lOQyhpcF9mcmFnLnhtaXQpOworCisgICAgLyogVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCByZXVzZSByYW1idWYgLSB0aGUgaGFyZHdhcmUgbWF5IHN0aWxsIGJlCisgICAgICogdXNpbmcgdGhlIGJ1ZmZlci4gSW5zdGVhZCB3ZSBmcmVlIGl0IChhbmQgdGhlIGVuc3VpbmcgY2hhaW4pIGFuZAorICAgICAqIHJlY3JlYXRlIGl0IG5leHQgdGltZSByb3VuZCB0aGUgbG9vcC4gSWYgd2UncmUgbHVja3kgdGhlIGhhcmR3YXJlCisgICAgICogd2lsbCBoYXZlIGFscmVhZHkgc2VudCB0aGUgcGFja2V0LCB0aGUgZnJlZSB3aWxsIHJlYWxseSBmcmVlLCBhbmQKKyAgICAgKiB0aGVyZSB3aWxsIGJlIHplcm8gbWVtb3J5IHBlbmFsdHkuCisgICAgICovCisgICAgCisgICAgcGJ1Zl9mcmVlKHJhbWJ1Zik7CisjZW5kaWYgLyogSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgKi8KKyAgICBsZWZ0IC09IGNvcDsKKyAgICBvZm8gKz0gbmZiOworICB9CisjaWYgSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYKKyAgcGJ1Zl9mcmVlKHJhbWJ1Zik7CisjZW5kaWYgLyogSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgKi8KKyAgc25tcF9pbmNfaXBmcmFnb2tzKCk7CisgIHJldHVybiBFUlJfT0s7Cit9CisjZW5kaWYgLyogSVBfRlJBRyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL21lbS5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzRlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvbWVtLmMKQEAgLTAsMCArMSw2NDIgQEAKKy8qKgorICogQGZpbGUKKyAqIER5bmFtaWMgbWVtb3J5IG1hbmFnZXIKKyAqCisgKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgbWFsbG9jKCkuCisgKgorICogSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgbWFsbG9jKCkgaW5zdGVhZCwgZGVmaW5lCisgKiBNRU1fTElCQ19NQUxMT0MgdG8gMSBpbiB5b3VyIGx3aXBvcHRzLmgKKyAqCisgKiBUbyBsZXQgbWVtX21hbGxvYygpIHVzZSBwb29scyAocHJldmVudHMgZnJhZ21lbnRhdGlvbiBhbmQgaXMgbXVjaCBmYXN0ZXIgdGhhbgorICogYSBoZWFwIGJ1dCBtaWdodCB3YXN0ZSBzb21lIG1lbW9yeSksIGRlZmluZSBNRU1fVVNFX1BPT0xTIHRvIDEsIGRlZmluZQorICogTUVNX1VTRV9DVVNUT01fUE9PTFMgdG8gMSBhbmQgY3JlYXRlIGEgZmlsZSAibHdpcHBvb2xzLmgiIHRoYXQgaW5jbHVkZXMgYSBsaXN0CisgKiBvZiBwb29scyBsaWtlIHRoaXMgKG1vcmUgcG9vbHMgY2FuIGJlIGFkZGVkIGJldHdlZW4gX1NUQVJUIGFuZCBfRU5EKToKKyAqCisgKiBEZWZpbmUgdGhyZWUgcG9vbHMgd2l0aCBzaXplcyAyNTYsIDUxMiwgYW5kIDE1MTIgYnl0ZXMKKyAqIExXSVBfTUFMTE9DX01FTVBPT0xfU1RBUlQKKyAqIExXSVBfTUFMTE9DX01FTVBPT0woMjAsIDI1NikKKyAqIExXSVBfTUFMTE9DX01FTVBPT0woMTAsIDUxMikKKyAqIExXSVBfTUFMTE9DX01FTVBPT0woNSwgMTUxMikKKyAqIExXSVBfTUFMTE9DX01FTVBPT0xfRU5ECisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICoKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKiAgICAgICAgIFNpbW9uIEdvbGRzY2htaWR0CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgIU1FTV9MSUJDX01BTExPQyAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvZGVmLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL3N5cy5oIgorI2luY2x1ZGUgImx3aXAvc3RhdHMuaCIKKyNpbmNsdWRlICJsd2lwL2Vyci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBNRU1fVVNFX1BPT0xTCisvKiBsd0lQIGhlYWQgaW1wbGVtZW50ZWQgd2l0aCBkaWZmZXJlbnQgc2l6ZWQgcG9vbHMgKi8KKworLyoqCisgKiBBbGxvY2F0ZSBtZW1vcnk6IGRldGVybWluZSB0aGUgc21hbGxlc3QgcG9vbCB0aGF0IGlzIGJpZyBlbm91Z2gKKyAqIHRvIGNvbnRhaW4gYW4gZWxlbWVudCBvZiAnc2l6ZScgYW5kIGdldCBhbiBlbGVtZW50IGZyb20gdGhhdCBwb29sLgorICoKKyAqIEBwYXJhbSBzaXplIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgbmVlZGVkCisgKiBAcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSBvciBOVUxMIGlmIHRoZSBwb29sIGlzIGVtcHR5CisgKi8KK3ZvaWQgKgorbWVtX21hbGxvYyhtZW1fc2l6ZV90IHNpemUpCit7CisgIHN0cnVjdCBtZW1wX21hbGxvY19oZWxwZXIgKmVsZW1lbnQ7CisgIG1lbXBfdCBwb29sbnI7CisgIG1lbV9zaXplX3QgcmVxdWlyZWRfc2l6ZSA9IHNpemUgKyBzaXplb2Yoc3RydWN0IG1lbXBfbWFsbG9jX2hlbHBlcik7CisKKyAgZm9yIChwb29sbnIgPSBNRU1QX1BPT0xfRklSU1Q7IHBvb2xuciA8PSBNRU1QX1BPT0xfTEFTVDsgcG9vbG5yID0gKG1lbXBfdCkocG9vbG5yICsgMSkpIHsKKyNpZiBNRU1fVVNFX1BPT0xTX1RSWV9CSUdHRVJfUE9PTAorYWdhaW46CisjZW5kaWYgLyogTUVNX1VTRV9QT09MU19UUllfQklHR0VSX1BPT0wgKi8KKyAgICAvKiBpcyB0aGlzIHBvb2wgYmlnIGVub3VnaCB0byBob2xkIGFuIGVsZW1lbnQgb2YgdGhlIHJlcXVpcmVkIHNpemUKKyAgICAgICBwbHVzIGEgc3RydWN0IG1lbXBfbWFsbG9jX2hlbHBlciB0aGF0IHNhdmVzIHRoZSBwb29sIHRoaXMgZWxlbWVudCBjYW1lIGZyb20/ICovCisgICAgaWYgKHJlcXVpcmVkX3NpemUgPD0gbWVtcF9zaXplc1twb29sbnJdKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHBvb2xuciA+IE1FTVBfUE9PTF9MQVNUKSB7CisgICAgTFdJUF9BU1NFUlQoIm1lbV9tYWxsb2MoKTogbm8gcG9vbCBpcyB0aGF0IGJpZyEiLCAwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbGVtZW50ID0gKHN0cnVjdCBtZW1wX21hbGxvY19oZWxwZXIqKW1lbXBfbWFsbG9jKHBvb2xucik7CisgIGlmIChlbGVtZW50ID09IE5VTEwpIHsKKyAgICAvKiBObyBuZWVkIHRvIERFQlVHRiBvciBBU1NFUlQ6IFRoaXMgZXJyb3IgaXMgYWxyZWFkeQorICAgICAgIHRha2VuIGNhcmUgb2YgaW4gbWVtcC5jICovCisjaWYgTUVNX1VTRV9QT09MU19UUllfQklHR0VSX1BPT0wKKyAgICAvKiogVHJ5IGEgYmlnZ2VyIHBvb2wgaWYgdGhpcyBvbmUgaXMgZW1wdHkhICovCisgICAgaWYgKHBvb2xuciA8IE1FTVBfUE9PTF9MQVNUKSB7CisgICAgICBwb29sbnIrKzsKKyAgICAgIGdvdG8gYWdhaW47CisgICAgfQorI2VuZGlmIC8qIE1FTV9VU0VfUE9PTFNfVFJZX0JJR0dFUl9QT09MICovCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBzYXZlIHRoZSBwb29sIG51bWJlciB0aGlzIGVsZW1lbnQgY2FtZSBmcm9tICovCisgIGVsZW1lbnQtPnBvb2xuciA9IHBvb2xucjsKKyAgLyogYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkaXJlY3RseSBhZnRlciB0aGUgc3RydWN0IG1lbXBfbWFsbG9jX2hlbHBlciAqLworICBlbGVtZW50Kys7CisKKyAgcmV0dXJuIGVsZW1lbnQ7Cit9CisKKy8qKgorICogRnJlZSBtZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgbWVtX21hbGxvYy4gTG9hZHMgdGhlIHBvb2wgbnVtYmVyCisgKiBhbmQgY2FsbHMgbWVtcF9mcmVlIHdpdGggdGhhdCBwb29sIG51bWJlciB0byBwdXQgdGhlIGVsZW1lbnQgYmFjayBpbnRvCisgKiBpdHMgcG9vbAorICoKKyAqIEBwYXJhbSBybWVtIHRoZSBtZW1vcnkgZWxlbWVudCB0byBmcmVlCisgKi8KK3ZvaWQKK21lbV9mcmVlKHZvaWQgKnJtZW0pCit7CisgIHN0cnVjdCBtZW1wX21hbGxvY19oZWxwZXIgKmhtZW0gPSAoc3RydWN0IG1lbXBfbWFsbG9jX2hlbHBlciopcm1lbTsKKworICBMV0lQX0FTU0VSVCgicm1lbSAhPSBOVUxMIiwgKHJtZW0gIT0gTlVMTCkpOworICBMV0lQX0FTU0VSVCgicm1lbSA9PSBNRU1fQUxJR04ocm1lbSkiLCAocm1lbSA9PSBMV0lQX01FTV9BTElHTihybWVtKSkpOworCisgIC8qIGdldCB0aGUgb3JpZ2luYWwgc3RydWN0IG1lbXBfbWFsbG9jX2hlbHBlciAqLworICBobWVtLS07CisKKyAgTFdJUF9BU1NFUlQoImhtZW0gIT0gTlVMTCIsIChobWVtICE9IE5VTEwpKTsKKyAgTFdJUF9BU1NFUlQoImhtZW0gPT0gTUVNX0FMSUdOKGhtZW0pIiwgKGhtZW0gPT0gTFdJUF9NRU1fQUxJR04oaG1lbSkpKTsKKyAgTFdJUF9BU1NFUlQoImhtZW0tPnBvb2xuciA8IE1FTVBfTUFYIiwgKGhtZW0tPnBvb2xuciA8IE1FTVBfTUFYKSk7CisKKyAgLyogYW5kIHB1dCBpdCBpbiB0aGUgcG9vbCB3ZSBzYXZlZCBlYXJsaWVyICovCisgIG1lbXBfZnJlZShobWVtLT5wb29sbnIsIGhtZW0pOworfQorCisjZWxzZSAvKiBNRU1fVVNFX1BPT0xTICovCisvKiBsd0lQIHJlcGxhY2VtZW50IGZvciB5b3VyIGxpYmMgbWFsbG9jKCkgKi8KKworLyoqCisgKiBUaGUgaGVhcCBpcyBtYWRlIHVwIGFzIGEgbGlzdCBvZiBzdHJ1Y3RzIG9mIHRoaXMgdHlwZS4KKyAqIFRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBhbGlnbmVkIHNpbmNlIGZvciBnZXR0aW5nIGl0cyBzaXplLAorICogd2Ugb25seSB1c2UgdGhlIG1hY3JvIFNJWkVPRl9TVFJVQ1RfTUVNLCB3aGljaCBhdXRvbWF0aWNhbGx5IGFsaWduZXMuCisgKi8KK3N0cnVjdCBtZW0geworICAvKiogaW5kZXggKC0+IHJhbVtuZXh0XSkgb2YgdGhlIG5leHQgc3RydWN0ICovCisgIG1lbV9zaXplX3QgbmV4dDsKKyAgLyoqIGluZGV4ICgtPiByYW1bcHJldl0pIG9mIHRoZSBwcmV2aW91cyBzdHJ1Y3QgKi8KKyAgbWVtX3NpemVfdCBwcmV2OworICAvKiogMTogdGhpcyBhcmVhIGlzIHVzZWQ7IDA6IHRoaXMgYXJlYSBpcyB1bnVzZWQgKi8KKyAgdThfdCB1c2VkOworfTsKKworLyoqIEFsbCBhbGxvY2F0ZWQgYmxvY2tzIHdpbGwgYmUgTUlOX1NJWkUgYnl0ZXMgYmlnLCBhdCBsZWFzdCEKKyAqIE1JTl9TSVpFIGNhbiBiZSBvdmVycmlkZGVuIHRvIHN1aXQgeW91ciBuZWVkcy4gU21hbGxlciB2YWx1ZXMgc2F2ZSBzcGFjZSwKKyAqIGxhcmdlciB2YWx1ZXMgY291bGQgcHJldmVudCB0b28gc21hbGwgYmxvY2tzIHRvIGZyYWdtZW50IHRoZSBSQU0gdG9vIG11Y2guICovCisjaWZuZGVmIE1JTl9TSVpFCisjZGVmaW5lIE1JTl9TSVpFICAgICAgICAgICAgIDEyCisjZW5kaWYgLyogTUlOX1NJWkUgKi8KKy8qIHNvbWUgYWxpZ25tZW50IG1hY3Jvczogd2UgZGVmaW5lIHRoZW0gaGVyZSBmb3IgYmV0dGVyIHNvdXJjZSBjb2RlIGxheW91dCAqLworI2RlZmluZSBNSU5fU0laRV9BTElHTkVEICAgICBMV0lQX01FTV9BTElHTl9TSVpFKE1JTl9TSVpFKQorI2RlZmluZSBTSVpFT0ZfU1RSVUNUX01FTSAgICBMV0lQX01FTV9BTElHTl9TSVpFKHNpemVvZihzdHJ1Y3QgbWVtKSkKKyNkZWZpbmUgTUVNX1NJWkVfQUxJR05FRCAgICAgTFdJUF9NRU1fQUxJR05fU0laRShNRU1fU0laRSkKKworLyoqIElmIHlvdSB3YW50IHRvIHJlbG9jYXRlIHRoZSBoZWFwIHRvIGV4dGVybmFsIG1lbW9yeSwgc2ltcGx5IGRlZmluZQorICogTFdJUF9SQU1fSEVBUF9QT0lOVEVSIGFzIGEgdm9pZC1wb2ludGVyIHRvIHRoYXQgbG9jYXRpb24uCisgKiBJZiBzbywgbWFrZSBzdXJlIHRoZSBtZW1vcnkgYXQgdGhhdCBsb2NhdGlvbiBpcyBiaWcgZW5vdWdoIChzZWUgYmVsb3cgb24KKyAqIGhvdyB0aGF0IHNwYWNlIGlzIGNhbGN1bGF0ZWQpLiAqLworI2lmbmRlZiBMV0lQX1JBTV9IRUFQX1BPSU5URVIKKy8qKiB0aGUgaGVhcC4gd2UgbmVlZCBvbmUgc3RydWN0IG1lbSBhdCB0aGUgZW5kIGFuZCBzb21lIHJvb20gZm9yIGFsaWdubWVudCAqLwordThfdCByYW1faGVhcFtNRU1fU0laRV9BTElHTkVEICsgKDIqU0laRU9GX1NUUlVDVF9NRU0pICsgTUVNX0FMSUdOTUVOVF07CisjZGVmaW5lIExXSVBfUkFNX0hFQVBfUE9JTlRFUiByYW1faGVhcAorI2VuZGlmIC8qIExXSVBfUkFNX0hFQVBfUE9JTlRFUiAqLworCisvKiogcG9pbnRlciB0byB0aGUgaGVhcCAocmFtX2hlYXApOiBmb3IgYWxpZ25tZW50LCByYW0gaXMgbm93IGEgcG9pbnRlciBpbnN0ZWFkIG9mIGFuIGFycmF5ICovCitzdGF0aWMgdThfdCAqcmFtOworLyoqIHRoZSBsYXN0IGVudHJ5LCBhbHdheXMgdW51c2VkISAqLworc3RhdGljIHN0cnVjdCBtZW0gKnJhbV9lbmQ7CisvKiogcG9pbnRlciB0byB0aGUgbG93ZXN0IGZyZWUgYmxvY2ssIHRoaXMgaXMgdXNlZCBmb3IgZmFzdGVyIHNlYXJjaCAqLworc3RhdGljIHN0cnVjdCBtZW0gKmxmcmVlOworCisvKiogY29uY3VycmVudCBhY2Nlc3MgcHJvdGVjdGlvbiAqLworc3RhdGljIHN5c19tdXRleF90IG1lbV9tdXRleDsKKworI2lmIExXSVBfQUxMT1dfTUVNX0ZSRUVfRlJPTV9PVEhFUl9DT05URVhUCisKK3N0YXRpYyB2b2xhdGlsZSB1OF90IG1lbV9mcmVlX2NvdW50OworCisvKiBBbGxvdyBtZW1fZnJlZSBmcm9tIG90aGVyIChlLmcuIGludGVycnVwdCkgY29udGV4dCAqLworI2RlZmluZSBMV0lQX01FTV9GUkVFX0RFQ0xfUFJPVEVDVCgpICBTWVNfQVJDSF9ERUNMX1BST1RFQ1QobGV2X2ZyZWUpCisjZGVmaW5lIExXSVBfTUVNX0ZSRUVfUFJPVEVDVCgpICAgICAgIFNZU19BUkNIX1BST1RFQ1QobGV2X2ZyZWUpCisjZGVmaW5lIExXSVBfTUVNX0ZSRUVfVU5QUk9URUNUKCkgICAgIFNZU19BUkNIX1VOUFJPVEVDVChsZXZfZnJlZSkKKyNkZWZpbmUgTFdJUF9NRU1fQUxMT0NfREVDTF9QUk9URUNUKCkgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldl9hbGxvYykKKyNkZWZpbmUgTFdJUF9NRU1fQUxMT0NfUFJPVEVDVCgpICAgICAgU1lTX0FSQ0hfUFJPVEVDVChsZXZfYWxsb2MpCisjZGVmaW5lIExXSVBfTUVNX0FMTE9DX1VOUFJPVEVDVCgpICAgIFNZU19BUkNIX1VOUFJPVEVDVChsZXZfYWxsb2MpCisKKyNlbHNlIC8qIExXSVBfQUxMT1dfTUVNX0ZSRUVfRlJPTV9PVEhFUl9DT05URVhUICovCisKKy8qIFByb3RlY3QgdGhlIGhlYXAgb25seSBieSB1c2luZyBhIHNlbWFwaG9yZSAqLworI2RlZmluZSBMV0lQX01FTV9GUkVFX0RFQ0xfUFJPVEVDVCgpCisjZGVmaW5lIExXSVBfTUVNX0ZSRUVfUFJPVEVDVCgpICAgIHN5c19tdXRleF9sb2NrKCZtZW1fbXV0ZXgpCisjZGVmaW5lIExXSVBfTUVNX0ZSRUVfVU5QUk9URUNUKCkgIHN5c19tdXRleF91bmxvY2soJm1lbV9tdXRleCkKKy8qIG1lbV9tYWxsb2MgaXMgcHJvdGVjdGVkIHVzaW5nIHNlbWFwaG9yZSBBTkQgTFdJUF9NRU1fQUxMT0NfUFJPVEVDVCAqLworI2RlZmluZSBMV0lQX01FTV9BTExPQ19ERUNMX1BST1RFQ1QoKQorI2RlZmluZSBMV0lQX01FTV9BTExPQ19QUk9URUNUKCkKKyNkZWZpbmUgTFdJUF9NRU1fQUxMT0NfVU5QUk9URUNUKCkKKworI2VuZGlmIC8qIExXSVBfQUxMT1dfTUVNX0ZSRUVfRlJPTV9PVEhFUl9DT05URVhUICovCisKKworLyoqCisgKiAiUGx1ZyBob2xlcyIgYnkgY29tYmluaW5nIGFkamFjZW50IGVtcHR5IHN0cnVjdCBtZW1zLgorICogQWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyB0aHJvdWdoLCB0aGVyZSBzaG91bGQgbm90IGV4aXN0CisgKiBvbmUgZW1wdHkgc3RydWN0IG1lbSBwb2ludGluZyB0byBhbm90aGVyIGVtcHR5IHN0cnVjdCBtZW0uCisgKgorICogQHBhcmFtIG1lbSB0aGlzIHBvaW50cyB0byBhIHN0cnVjdCBtZW0gd2hpY2gganVzdCBoYXMgYmVlbiBmcmVlZAorICogQGludGVybmFsIHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYnkgbWVtX2ZyZWUoKSBhbmQgbWVtX3RyaW0oKQorICoKKyAqIFRoaXMgYXNzdW1lcyBhY2Nlc3MgdG8gdGhlIGhlYXAgaXMgcHJvdGVjdGVkIGJ5IHRoZSBjYWxsaW5nIGZ1bmN0aW9uCisgKiBhbHJlYWR5LgorICovCitzdGF0aWMgdm9pZAorcGx1Z19ob2xlcyhzdHJ1Y3QgbWVtICptZW0pCit7CisgIHN0cnVjdCBtZW0gKm5tZW07CisgIHN0cnVjdCBtZW0gKnBtZW07CisKKyAgTFdJUF9BU1NFUlQoInBsdWdfaG9sZXM6IG1lbSA+PSByYW0iLCAodThfdCAqKW1lbSA+PSByYW0pOworICBMV0lQX0FTU0VSVCgicGx1Z19ob2xlczogbWVtIDwgcmFtX2VuZCIsICh1OF90ICopbWVtIDwgKHU4X3QgKilyYW1fZW5kKTsKKyAgTFdJUF9BU1NFUlQoInBsdWdfaG9sZXM6IG1lbS0+dXNlZCA9PSAwIiwgbWVtLT51c2VkID09IDApOworCisgIC8qIHBsdWcgaG9sZSBmb3J3YXJkICovCisgIExXSVBfQVNTRVJUKCJwbHVnX2hvbGVzOiBtZW0tPm5leHQgPD0gTUVNX1NJWkVfQUxJR05FRCIsIG1lbS0+bmV4dCA8PSBNRU1fU0laRV9BTElHTkVEKTsKKworICBubWVtID0gKHN0cnVjdCBtZW0gKikodm9pZCAqKSZyYW1bbWVtLT5uZXh0XTsKKyAgaWYgKG1lbSAhPSBubWVtICYmIG5tZW0tPnVzZWQgPT0gMCAmJiAodThfdCAqKW5tZW0gIT0gKHU4X3QgKilyYW1fZW5kKSB7CisgICAgLyogaWYgbWVtLT5uZXh0IGlzIHVudXNlZCBhbmQgbm90IGVuZCBvZiByYW0sIGNvbWJpbmUgbWVtIGFuZCBtZW0tPm5leHQgKi8KKyAgICBpZiAobGZyZWUgPT0gbm1lbSkgeworICAgICAgbGZyZWUgPSBtZW07CisgICAgfQorICAgIG1lbS0+bmV4dCA9IG5tZW0tPm5leHQ7CisgICAgKChzdHJ1Y3QgbWVtICopKHZvaWQgKikmcmFtW25tZW0tPm5leHRdKS0+cHJldiA9IChtZW1fc2l6ZV90KSgodThfdCAqKW1lbSAtIHJhbSk7CisgIH0KKworICAvKiBwbHVnIGhvbGUgYmFja3dhcmQgKi8KKyAgcG1lbSA9IChzdHJ1Y3QgbWVtICopKHZvaWQgKikmcmFtW21lbS0+cHJldl07CisgIGlmIChwbWVtICE9IG1lbSAmJiBwbWVtLT51c2VkID09IDApIHsKKyAgICAvKiBpZiBtZW0tPnByZXYgaXMgdW51c2VkLCBjb21iaW5lIG1lbSBhbmQgbWVtLT5wcmV2ICovCisgICAgaWYgKGxmcmVlID09IG1lbSkgeworICAgICAgbGZyZWUgPSBwbWVtOworICAgIH0KKyAgICBwbWVtLT5uZXh0ID0gbWVtLT5uZXh0OworICAgICgoc3RydWN0IG1lbSAqKSh2b2lkICopJnJhbVttZW0tPm5leHRdKS0+cHJldiA9IChtZW1fc2l6ZV90KSgodThfdCAqKXBtZW0gLSByYW0pOworICB9Cit9CisKKy8qKgorICogWmVybyB0aGUgaGVhcCBhbmQgaW5pdGlhbGl6ZSBzdGFydCwgZW5kIGFuZCBsb3dlc3QtZnJlZQorICovCit2b2lkCitsd2lwX21lbV9pbml0KHZvaWQpCit7CisgIHN0cnVjdCBtZW0gKm1lbTsKKworICBMV0lQX0FTU0VSVCgiU2FuaXR5IGNoZWNrIGFsaWdubWVudCIsCisgICAgKFNJWkVPRl9TVFJVQ1RfTUVNICYgKE1FTV9BTElHTk1FTlQtMSkpID09IDApOworCisgIC8qIGFsaWduIHRoZSBoZWFwICovCisgIHJhbSA9ICh1OF90ICopTFdJUF9NRU1fQUxJR04oTFdJUF9SQU1fSEVBUF9QT0lOVEVSKTsKKyAgLyogaW5pdGlhbGl6ZSB0aGUgc3RhcnQgb2YgdGhlIGhlYXAgKi8KKyAgbWVtID0gKHN0cnVjdCBtZW0gKikodm9pZCAqKXJhbTsKKyAgbWVtLT5uZXh0ID0gTUVNX1NJWkVfQUxJR05FRDsKKyAgbWVtLT5wcmV2ID0gMDsKKyAgbWVtLT51c2VkID0gMDsKKyAgLyogaW5pdGlhbGl6ZSB0aGUgZW5kIG9mIHRoZSBoZWFwICovCisgIHJhbV9lbmQgPSAoc3RydWN0IG1lbSAqKSh2b2lkICopJnJhbVtNRU1fU0laRV9BTElHTkVEXTsKKyAgcmFtX2VuZC0+dXNlZCA9IDE7CisgIHJhbV9lbmQtPm5leHQgPSBNRU1fU0laRV9BTElHTkVEOworICByYW1fZW5kLT5wcmV2ID0gTUVNX1NJWkVfQUxJR05FRDsKKworICAvKiBpbml0aWFsaXplIHRoZSBsb3dlc3QtZnJlZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgaGVhcCAqLworICBsZnJlZSA9IChzdHJ1Y3QgbWVtICopKHZvaWQgKilyYW07CisKKyAgTUVNX1NUQVRTX0FWQUlMKGF2YWlsLCBNRU1fU0laRV9BTElHTkVEKTsKKworICBpZihzeXNfbXV0ZXhfbmV3KCZtZW1fbXV0ZXgpICE9IEVSUl9PSykgeworICAgIExXSVBfQVNTRVJUKCJmYWlsZWQgdG8gY3JlYXRlIG1lbV9tdXRleCIsIDApOworICB9Cit9CisKKy8qKgorICogUHV0IGEgc3RydWN0IG1lbSBiYWNrIG9uIHRoZSBoZWFwCisgKgorICogQHBhcmFtIHJtZW0gaXMgdGhlIGRhdGEgcG9ydGlvbiBvZiBhIHN0cnVjdCBtZW0gYXMgcmV0dXJuZWQgYnkgYSBwcmV2aW91cworICogICAgICAgICAgICAgY2FsbCB0byBtZW1fbWFsbG9jKCkKKyAqLwordm9pZAorbWVtX2ZyZWUodm9pZCAqcm1lbSkKK3sKKyAgc3RydWN0IG1lbSAqbWVtOworICBMV0lQX01FTV9GUkVFX0RFQ0xfUFJPVEVDVCgpOworCisgIGlmIChybWVtID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihNRU1fREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsICgibWVtX2ZyZWUocCA9PSBOVUxMKSB3YXMgY2FsbGVkLlxuIikpOworICAgIHJldHVybjsKKyAgfQorICBMV0lQX0FTU0VSVCgibWVtX2ZyZWU6IHNhbml0eSBjaGVjayBhbGlnbm1lbnQiLCAoKChtZW1fcHRyX3Qpcm1lbSkgJiAoTUVNX0FMSUdOTUVOVC0xKSkgPT0gMCk7CisKKyAgTFdJUF9BU1NFUlQoIm1lbV9mcmVlOiBsZWdhbCBtZW1vcnkiLCAodThfdCAqKXJtZW0gPj0gKHU4X3QgKilyYW0gJiYKKyAgICAodThfdCAqKXJtZW0gPCAodThfdCAqKXJhbV9lbmQpOworCisgIGlmICgodThfdCAqKXJtZW0gPCAodThfdCAqKXJhbSB8fCAodThfdCAqKXJtZW0gPj0gKHU4X3QgKilyYW1fZW5kKSB7CisgICAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldik7CisgICAgTFdJUF9ERUJVR0YoTUVNX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfU0VWRVJFLCAoIm1lbV9mcmVlOiBpbGxlZ2FsIG1lbW9yeVxuIikpOworICAgIC8qIHByb3RlY3QgbWVtIHN0YXRzIGZyb20gY29uY3VycmVudCBhY2Nlc3MgKi8KKyAgICBTWVNfQVJDSF9QUk9URUNUKGxldik7CisgICAgTUVNX1NUQVRTX0lOQyhpbGxlZ2FsKTsKKyAgICBTWVNfQVJDSF9VTlBST1RFQ1QobGV2KTsKKyAgICByZXR1cm47CisgIH0KKyAgLyogcHJvdGVjdCB0aGUgaGVhcCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzICovCisgIExXSVBfTUVNX0ZSRUVfUFJPVEVDVCgpOworICAvKiBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0IG1lbSAuLi4gKi8KKyAgbWVtID0gKHN0cnVjdCBtZW0gKikodm9pZCAqKSgodThfdCAqKXJtZW0gLSBTSVpFT0ZfU1RSVUNUX01FTSk7CisgIC8qIC4uLiB3aGljaCBoYXMgdG8gYmUgaW4gYSB1c2VkIHN0YXRlIC4uLiAqLworICBMV0lQX0FTU0VSVCgibWVtX2ZyZWU6IG1lbS0+dXNlZCIsIG1lbS0+dXNlZCk7CisgIC8qIC4uLiBhbmQgaXMgbm93IHVudXNlZC4gKi8KKyAgbWVtLT51c2VkID0gMDsKKworICBpZiAobWVtIDwgbGZyZWUpIHsKKyAgICAvKiB0aGUgbmV3bHkgZnJlZWQgc3RydWN0IGlzIG5vdyB0aGUgbG93ZXN0ICovCisgICAgbGZyZWUgPSBtZW07CisgIH0KKworICBNRU1fU1RBVFNfREVDX1VTRUQodXNlZCwgbWVtLT5uZXh0IC0gKG1lbV9zaXplX3QpKCgodThfdCAqKW1lbSAtIHJhbSkpKTsKKworICAvKiBmaW5hbGx5LCBzZWUgaWYgcHJldiBvciBuZXh0IGFyZSBmcmVlIGFsc28gKi8KKyAgcGx1Z19ob2xlcyhtZW0pOworI2lmIExXSVBfQUxMT1dfTUVNX0ZSRUVfRlJPTV9PVEhFUl9DT05URVhUCisgIG1lbV9mcmVlX2NvdW50ID0gMTsKKyNlbmRpZiAvKiBMV0lQX0FMTE9XX01FTV9GUkVFX0ZST01fT1RIRVJfQ09OVEVYVCAqLworICBMV0lQX01FTV9GUkVFX1VOUFJPVEVDVCgpOworfQorCisvKioKKyAqIFNocmluayBtZW1vcnkgcmV0dXJuZWQgYnkgbWVtX21hbGxvYygpLgorICoKKyAqIEBwYXJhbSBybWVtIHBvaW50ZXIgdG8gbWVtb3J5IGFsbG9jYXRlZCBieSBtZW1fbWFsbG9jIHRoZSBpcyB0byBiZSBzaHJpbmtlZAorICogQHBhcmFtIG5ld3NpemUgcmVxdWlyZWQgc2l6ZSBhZnRlciBzaHJpbmtpbmcgKG5lZWRzIHRvIGJlIHNtYWxsZXIgdGhhbiBvcgorICogICAgICAgICAgICAgICAgZXF1YWwgdG8gdGhlIHByZXZpb3VzIHNpemUpCisgKiBAcmV0dXJuIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnM6IGlzIGFsd2F5cyA9PSBybWVtLCBhdCB0aGUgbW9tZW50CisgKiAgICAgICAgIG9yIE5VTEwgaWYgbmV3c2l6ZSBpcyA+IG9sZCBzaXplLCBpbiB3aGljaCBjYXNlIHJtZW0gaXMgTk9UIHRvdWNoZWQKKyAqICAgICAgICAgb3IgZnJlZWQhCisgKi8KK3ZvaWQgKgorbWVtX3RyaW0odm9pZCAqcm1lbSwgbWVtX3NpemVfdCBuZXdzaXplKQoreworICBtZW1fc2l6ZV90IHNpemU7CisgIG1lbV9zaXplX3QgcHRyLCBwdHIyOworICBzdHJ1Y3QgbWVtICptZW0sICptZW0yOworICAvKiB1c2UgdGhlIEZSRUVfUFJPVEVDVCBoZXJlOiBpdCBwcm90ZWN0cyB3aXRoIHNlbSBPUiBTWVNfQVJDSF9QUk9URUNUICovCisgIExXSVBfTUVNX0ZSRUVfREVDTF9QUk9URUNUKCk7CisKKyAgLyogRXhwYW5kIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IHJlZ2lvbiBzbyB0aGF0IHdlIGNhbgorICAgICBhZGp1c3QgZm9yIGFsaWdubWVudC4gKi8KKyAgbmV3c2l6ZSA9IExXSVBfTUVNX0FMSUdOX1NJWkUobmV3c2l6ZSk7CisKKyAgaWYobmV3c2l6ZSA8IE1JTl9TSVpFX0FMSUdORUQpIHsKKyAgICAvKiBldmVyeSBkYXRhIGJsb2NrIG11c3QgYmUgYXQgbGVhc3QgTUlOX1NJWkVfQUxJR05FRCBsb25nICovCisgICAgbmV3c2l6ZSA9IE1JTl9TSVpFX0FMSUdORUQ7CisgIH0KKworICBpZiAobmV3c2l6ZSA+IE1FTV9TSVpFX0FMSUdORUQpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIExXSVBfQVNTRVJUKCJtZW1fdHJpbTogbGVnYWwgbWVtb3J5IiwgKHU4X3QgKilybWVtID49ICh1OF90ICopcmFtICYmCisgICAodThfdCAqKXJtZW0gPCAodThfdCAqKXJhbV9lbmQpOworCisgIGlmICgodThfdCAqKXJtZW0gPCAodThfdCAqKXJhbSB8fCAodThfdCAqKXJtZW0gPj0gKHU4X3QgKilyYW1fZW5kKSB7CisgICAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldik7CisgICAgTFdJUF9ERUJVR0YoTUVNX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfU0VWRVJFLCAoIm1lbV90cmltOiBpbGxlZ2FsIG1lbW9yeVxuIikpOworICAgIC8qIHByb3RlY3QgbWVtIHN0YXRzIGZyb20gY29uY3VycmVudCBhY2Nlc3MgKi8KKyAgICBTWVNfQVJDSF9QUk9URUNUKGxldik7CisgICAgTUVNX1NUQVRTX0lOQyhpbGxlZ2FsKTsKKyAgICBTWVNfQVJDSF9VTlBST1RFQ1QobGV2KTsKKyAgICByZXR1cm4gcm1lbTsKKyAgfQorICAvKiBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0IG1lbSAuLi4gKi8KKyAgbWVtID0gKHN0cnVjdCBtZW0gKikodm9pZCAqKSgodThfdCAqKXJtZW0gLSBTSVpFT0ZfU1RSVUNUX01FTSk7CisgIC8qIC4uLiBhbmQgaXRzIG9mZnNldCBwb2ludGVyICovCisgIHB0ciA9IChtZW1fc2l6ZV90KSgodThfdCAqKW1lbSAtIHJhbSk7CisKKyAgc2l6ZSA9IG1lbS0+bmV4dCAtIHB0ciAtIFNJWkVPRl9TVFJVQ1RfTUVNOworICBMV0lQX0FTU0VSVCgibWVtX3RyaW0gY2FuIG9ubHkgc2hyaW5rIG1lbW9yeSIsIG5ld3NpemUgPD0gc2l6ZSk7CisgIGlmIChuZXdzaXplID4gc2l6ZSkgeworICAgIC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAobmV3c2l6ZSA9PSBzaXplKSB7CisgICAgLyogTm8gY2hhbmdlIGluIHNpemUsIHNpbXBseSByZXR1cm4gKi8KKyAgICByZXR1cm4gcm1lbTsKKyAgfQorCisgIC8qIHByb3RlY3QgdGhlIGhlYXAgZnJvbSBjb25jdXJyZW50IGFjY2VzcyAqLworICBMV0lQX01FTV9GUkVFX1BST1RFQ1QoKTsKKworICBtZW0yID0gKHN0cnVjdCBtZW0gKikodm9pZCAqKSZyYW1bbWVtLT5uZXh0XTsKKyAgaWYobWVtMi0+dXNlZCA9PSAwKSB7CisgICAgLyogVGhlIG5leHQgc3RydWN0IGlzIHVudXNlZCwgd2UgY2FuIHNpbXBseSBtb3ZlIGl0IGF0IGxpdHRsZSAqLworICAgIG1lbV9zaXplX3QgbmV4dDsKKyAgICAvKiByZW1lbWJlciB0aGUgb2xkIG5leHQgcG9pbnRlciAqLworICAgIG5leHQgPSBtZW0yLT5uZXh0OworICAgIC8qIGNyZWF0ZSBuZXcgc3RydWN0IG1lbSB3aGljaCBpcyBtb3ZlZCBkaXJlY3RseSBhZnRlciB0aGUgc2hyaW5rZWQgbWVtICovCisgICAgcHRyMiA9IHB0ciArIFNJWkVPRl9TVFJVQ1RfTUVNICsgbmV3c2l6ZTsKKyAgICBpZiAobGZyZWUgPT0gbWVtMikgeworICAgICAgbGZyZWUgPSAoc3RydWN0IG1lbSAqKSh2b2lkICopJnJhbVtwdHIyXTsKKyAgICB9CisgICAgbWVtMiA9IChzdHJ1Y3QgbWVtICopKHZvaWQgKikmcmFtW3B0cjJdOworICAgIG1lbTItPnVzZWQgPSAwOworICAgIC8qIHJlc3RvcmUgdGhlIG5leHQgcG9pbnRlciAqLworICAgIG1lbTItPm5leHQgPSBuZXh0OworICAgIC8qIGxpbmsgaXQgYmFjayB0byBtZW0gKi8KKyAgICBtZW0yLT5wcmV2ID0gcHRyOworICAgIC8qIGxpbmsgbWVtIHRvIGl0ICovCisgICAgbWVtLT5uZXh0ID0gcHRyMjsKKyAgICAvKiBsYXN0IHRoaW5nIHRvIHJlc3RvcmUgbGlua2VkIGxpc3Q6IGFzIHdlIGhhdmUgbW92ZWQgbWVtMiwKKyAgICAgKiBsZXQgJ21lbTItPm5leHQtPnByZXYnIHBvaW50IHRvIG1lbTIgYWdhaW4uIGJ1dCBvbmx5IGlmIG1lbTItPm5leHQgaXMgbm90CisgICAgICogdGhlIGVuZCBvZiB0aGUgaGVhcCAqLworICAgIGlmIChtZW0yLT5uZXh0ICE9IE1FTV9TSVpFX0FMSUdORUQpIHsKKyAgICAgICgoc3RydWN0IG1lbSAqKSh2b2lkICopJnJhbVttZW0yLT5uZXh0XSktPnByZXYgPSBwdHIyOworICAgIH0KKyAgICBNRU1fU1RBVFNfREVDX1VTRUQodXNlZCwgKHNpemUgLSBuZXdzaXplKSk7CisgICAgLyogbm8gbmVlZCB0byBwbHVnIGhvbGVzLCB3ZSd2ZSBhbHJlYWR5IGRvbmUgdGhhdCAqLworICB9IGVsc2UgaWYgKG5ld3NpemUgKyBTSVpFT0ZfU1RSVUNUX01FTSArIE1JTl9TSVpFX0FMSUdORUQgPD0gc2l6ZSkgeworICAgIC8qIE5leHQgc3RydWN0IGlzIHVzZWQgYnV0IHRoZXJlJ3Mgcm9vbSBmb3IgYW5vdGhlciBzdHJ1Y3QgbWVtIHdpdGgKKyAgICAgKiBhdCBsZWFzdCBNSU5fU0laRV9BTElHTkVEIG9mIGRhdGEuCisgICAgICogT2xkIHNpemUgKCdzaXplJykgbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gYXQgbGVhc3QgJ25ld3NpemUnIHBsdXMgYSBzdHJ1Y3QgbWVtCisgICAgICogKCdTSVpFT0ZfU1RSVUNUX01FTScpIHdpdGggc29tZSBkYXRhICgnTUlOX1NJWkVfQUxJR05FRCcpLgorICAgICAqIEB0b2RvIHdlIGNvdWxkIGxlYXZlIG91dCBNSU5fU0laRV9BTElHTkVELiBXZSB3b3VsZCBjcmVhdGUgYW4gZW1wdHkKKyAgICAgKiAgICAgICByZWdpb24gdGhhdCBjb3VsZG4ndCBob2xkIGRhdGEsIGJ1dCB3aGVuIG1lbS0+bmV4dCBnZXRzIGZyZWVkLAorICAgICAqICAgICAgIHRoZSAyIHJlZ2lvbnMgd291bGQgYmUgY29tYmluZWQsIHJlc3VsdGluZyBpbiBtb3JlIGZyZWUgbWVtb3J5ICovCisgICAgcHRyMiA9IHB0ciArIFNJWkVPRl9TVFJVQ1RfTUVNICsgbmV3c2l6ZTsKKyAgICBtZW0yID0gKHN0cnVjdCBtZW0gKikodm9pZCAqKSZyYW1bcHRyMl07CisgICAgaWYgKG1lbTIgPCBsZnJlZSkgeworICAgICAgbGZyZWUgPSBtZW0yOworICAgIH0KKyAgICBtZW0yLT51c2VkID0gMDsKKyAgICBtZW0yLT5uZXh0ID0gbWVtLT5uZXh0OworICAgIG1lbTItPnByZXYgPSBwdHI7CisgICAgbWVtLT5uZXh0ID0gcHRyMjsKKyAgICBpZiAobWVtMi0+bmV4dCAhPSBNRU1fU0laRV9BTElHTkVEKSB7CisgICAgICAoKHN0cnVjdCBtZW0gKikodm9pZCAqKSZyYW1bbWVtMi0+bmV4dF0pLT5wcmV2ID0gcHRyMjsKKyAgICB9CisgICAgTUVNX1NUQVRTX0RFQ19VU0VEKHVzZWQsIChzaXplIC0gbmV3c2l6ZSkpOworICAgIC8qIHRoZSBvcmlnaW5hbCBtZW0tPm5leHQgaXMgdXNlZCwgc28gbm8gbmVlZCB0byBwbHVnIGhvbGVzISAqLworICB9CisgIC8qIGVsc2UgeworICAgIG5leHQgc3RydWN0IG1lbSBpcyB1c2VkIGJ1dCBzaXplIGJldHdlZW4gbWVtIGFuZCBtZW0yIGlzIG5vdCBiaWcgZW5vdWdoCisgICAgdG8gY3JlYXRlIGFub3RoZXIgc3RydWN0IG1lbQorICAgIC0+IGRvbid0IGRvIGFueWh0aW5nLiAKKyAgICAtPiB0aGUgcmVtYWluaW5nIHNwYWNlIHN0YXlzIHVudXNlZCBzaW5jZSBpdCBpcyB0b28gc21hbGwKKyAgfSAqLworI2lmIExXSVBfQUxMT1dfTUVNX0ZSRUVfRlJPTV9PVEhFUl9DT05URVhUCisgIG1lbV9mcmVlX2NvdW50ID0gMTsKKyNlbmRpZiAvKiBMV0lQX0FMTE9XX01FTV9GUkVFX0ZST01fT1RIRVJfQ09OVEVYVCAqLworICBMV0lQX01FTV9GUkVFX1VOUFJPVEVDVCgpOworICByZXR1cm4gcm1lbTsKK30KKworLyoqCisgKiBBZGFtJ3MgbWVtX21hbGxvYygpIHBsdXMgc29sdXRpb24gZm9yIGJ1ZyAjMTc5MjIKKyAqIEFsbG9jYXRlIGEgYmxvY2sgb2YgbWVtb3J5IHdpdGggYSBtaW5pbXVtIG9mICdzaXplJyBieXRlcy4KKyAqCisgKiBAcGFyYW0gc2l6ZSBpcyB0aGUgbWluaW11bSBzaXplIG9mIHRoZSByZXF1ZXN0ZWQgYmxvY2sgaW4gYnl0ZXMuCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSBvciBOVUxMIGlmIG5vIGZyZWUgbWVtb3J5IHdhcyBmb3VuZC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgKGFzIGRlZmluZWQgYnkgTUVNX0FMSUdOTUVOVCkuCisgKi8KK3ZvaWQgKgorbWVtX21hbGxvYyhtZW1fc2l6ZV90IHNpemUpCit7CisgIG1lbV9zaXplX3QgcHRyLCBwdHIyOworICBzdHJ1Y3QgbWVtICptZW0sICptZW0yOworI2lmIExXSVBfQUxMT1dfTUVNX0ZSRUVfRlJPTV9PVEhFUl9DT05URVhUCisgIHU4X3QgbG9jYWxfbWVtX2ZyZWVfY291bnQgPSAwOworI2VuZGlmIC8qIExXSVBfQUxMT1dfTUVNX0ZSRUVfRlJPTV9PVEhFUl9DT05URVhUICovCisgIExXSVBfTUVNX0FMTE9DX0RFQ0xfUFJPVEVDVCgpOworCisgIGlmIChzaXplID09IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qIEV4cGFuZCB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSByZWdpb24gc28gdGhhdCB3ZSBjYW4KKyAgICAgYWRqdXN0IGZvciBhbGlnbm1lbnQuICovCisgIHNpemUgPSBMV0lQX01FTV9BTElHTl9TSVpFKHNpemUpOworCisgIGlmKHNpemUgPCBNSU5fU0laRV9BTElHTkVEKSB7CisgICAgLyogZXZlcnkgZGF0YSBibG9jayBtdXN0IGJlIGF0IGxlYXN0IE1JTl9TSVpFX0FMSUdORUQgbG9uZyAqLworICAgIHNpemUgPSBNSU5fU0laRV9BTElHTkVEOworICB9CisKKyAgaWYgKHNpemUgPiBNRU1fU0laRV9BTElHTkVEKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBwcm90ZWN0IHRoZSBoZWFwIGZyb20gY29uY3VycmVudCBhY2Nlc3MgKi8KKyAgc3lzX211dGV4X2xvY2soJm1lbV9tdXRleCk7CisgIExXSVBfTUVNX0FMTE9DX1BST1RFQ1QoKTsKKyNpZiBMV0lQX0FMTE9XX01FTV9GUkVFX0ZST01fT1RIRVJfQ09OVEVYVAorICAvKiBydW4gYXMgbG9uZyBhcyBhIG1lbV9mcmVlIGRpc3R1cmJlZCBtZW1fbWFsbG9jICovCisgIGRvIHsKKyAgICBsb2NhbF9tZW1fZnJlZV9jb3VudCA9IDA7CisjZW5kaWYgLyogTFdJUF9BTExPV19NRU1fRlJFRV9GUk9NX09USEVSX0NPTlRFWFQgKi8KKworICAgIC8qIFNjYW4gdGhyb3VnaCB0aGUgaGVhcCBzZWFyY2hpbmcgZm9yIGEgZnJlZSBibG9jayB0aGF0IGlzIGJpZyBlbm91Z2gsCisgICAgICogYmVnaW5uaW5nIHdpdGggdGhlIGxvd2VzdCBmcmVlIGJsb2NrLgorICAgICAqLworICAgIGZvciAocHRyID0gKG1lbV9zaXplX3QpKCh1OF90ICopbGZyZWUgLSByYW0pOyBwdHIgPCBNRU1fU0laRV9BTElHTkVEIC0gc2l6ZTsKKyAgICAgICAgIHB0ciA9ICgoc3RydWN0IG1lbSAqKSh2b2lkICopJnJhbVtwdHJdKS0+bmV4dCkgeworICAgICAgbWVtID0gKHN0cnVjdCBtZW0gKikodm9pZCAqKSZyYW1bcHRyXTsKKyNpZiBMV0lQX0FMTE9XX01FTV9GUkVFX0ZST01fT1RIRVJfQ09OVEVYVAorICAgICAgbWVtX2ZyZWVfY291bnQgPSAwOworICAgICAgTFdJUF9NRU1fQUxMT0NfVU5QUk9URUNUKCk7CisgICAgICAvKiBhbGxvdyBtZW1fZnJlZSB0byBydW4gKi8KKyAgICAgIExXSVBfTUVNX0FMTE9DX1BST1RFQ1QoKTsKKyAgICAgIGlmIChtZW1fZnJlZV9jb3VudCAhPSAwKSB7CisgICAgICAgIGxvY2FsX21lbV9mcmVlX2NvdW50ID0gbWVtX2ZyZWVfY291bnQ7CisgICAgICB9CisgICAgICBtZW1fZnJlZV9jb3VudCA9IDA7CisjZW5kaWYgLyogTFdJUF9BTExPV19NRU1fRlJFRV9GUk9NX09USEVSX0NPTlRFWFQgKi8KKworICAgICAgaWYgKCghbWVtLT51c2VkKSAmJgorICAgICAgICAgIChtZW0tPm5leHQgLSAocHRyICsgU0laRU9GX1NUUlVDVF9NRU0pKSA+PSBzaXplKSB7CisgICAgICAgIC8qIG1lbSBpcyBub3QgdXNlZCBhbmQgYXQgbGVhc3QgcGVyZmVjdCBmaXQgaXMgcG9zc2libGU6CisgICAgICAgICAqIG1lbS0+bmV4dCAtIChwdHIgKyBTSVpFT0ZfU1RSVUNUX01FTSkgZ2l2ZXMgdXMgdGhlICd1c2VyIGRhdGEgc2l6ZScgb2YgbWVtICovCisKKyAgICAgICAgaWYgKG1lbS0+bmV4dCAtIChwdHIgKyBTSVpFT0ZfU1RSVUNUX01FTSkgPj0gKHNpemUgKyBTSVpFT0ZfU1RSVUNUX01FTSArIE1JTl9TSVpFX0FMSUdORUQpKSB7CisgICAgICAgICAgLyogKGluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSwgd2UgdGVzdCBpZiBhbm90aGVyIHN0cnVjdCBtZW0gKFNJWkVPRl9TVFJVQ1RfTUVNKSBjb250YWluaW5nCisgICAgICAgICAgICogYXQgbGVhc3QgTUlOX1NJWkVfQUxJR05FRCBvZiBkYXRhIGFsc28gZml0cyBpbiB0aGUgJ3VzZXIgZGF0YSBzcGFjZScgb2YgJ21lbScpCisgICAgICAgICAgICogLT4gc3BsaXQgbGFyZ2UgYmxvY2ssIGNyZWF0ZSBlbXB0eSByZW1haW5kZXIsCisgICAgICAgICAgICogcmVtYWluZGVyIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gTUlOX1NJWkVfQUxJR05FRCBkYXRhOiBpZgorICAgICAgICAgICAqIG1lbS0+bmV4dCAtIChwdHIgKyAoMipTSVpFT0ZfU1RSVUNUX01FTSkpID09IHNpemUsCisgICAgICAgICAgICogc3RydWN0IG1lbSB3b3VsZCBmaXQgaW4gYnV0IG5vIGRhdGEgYmV0d2VlbiBtZW0yIGFuZCBtZW0yLT5uZXh0CisgICAgICAgICAgICogQHRvZG8gd2UgY291bGQgbGVhdmUgb3V0IE1JTl9TSVpFX0FMSUdORUQuIFdlIHdvdWxkIGNyZWF0ZSBhbiBlbXB0eQorICAgICAgICAgICAqICAgICAgIHJlZ2lvbiB0aGF0IGNvdWxkbid0IGhvbGQgZGF0YSwgYnV0IHdoZW4gbWVtLT5uZXh0IGdldHMgZnJlZWQsCisgICAgICAgICAgICogICAgICAgdGhlIDIgcmVnaW9ucyB3b3VsZCBiZSBjb21iaW5lZCwgcmVzdWx0aW5nIGluIG1vcmUgZnJlZSBtZW1vcnkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBwdHIyID0gcHRyICsgU0laRU9GX1NUUlVDVF9NRU0gKyBzaXplOworICAgICAgICAgIC8qIGNyZWF0ZSBtZW0yIHN0cnVjdCAqLworICAgICAgICAgIG1lbTIgPSAoc3RydWN0IG1lbSAqKSh2b2lkICopJnJhbVtwdHIyXTsKKyAgICAgICAgICBtZW0yLT51c2VkID0gMDsKKyAgICAgICAgICBtZW0yLT5uZXh0ID0gbWVtLT5uZXh0OworICAgICAgICAgIG1lbTItPnByZXYgPSBwdHI7CisgICAgICAgICAgLyogYW5kIGluc2VydCBpdCBiZXR3ZWVuIG1lbSBhbmQgbWVtLT5uZXh0ICovCisgICAgICAgICAgbWVtLT5uZXh0ID0gcHRyMjsKKyAgICAgICAgICBtZW0tPnVzZWQgPSAxOworCisgICAgICAgICAgaWYgKG1lbTItPm5leHQgIT0gTUVNX1NJWkVfQUxJR05FRCkgeworICAgICAgICAgICAgKChzdHJ1Y3QgbWVtICopKHZvaWQgKikmcmFtW21lbTItPm5leHRdKS0+cHJldiA9IHB0cjI7CisgICAgICAgICAgfQorICAgICAgICAgIE1FTV9TVEFUU19JTkNfVVNFRCh1c2VkLCAoc2l6ZSArIFNJWkVPRl9TVFJVQ1RfTUVNKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogKGEgbWVtMiBzdHJ1Y3QgZG9lcyBubyBmaXQgaW50byB0aGUgdXNlciBkYXRhIHNwYWNlIG9mIG1lbSBhbmQgbWVtLT5uZXh0IHdpbGwgYWx3YXlzCisgICAgICAgICAgICogYmUgdXNlZCBhdCB0aGlzIHBvaW50OiBpZiBub3Qgd2UgaGF2ZSAyIHVudXNlZCBzdHJ1Y3RzIGluIGEgcm93LCBwbHVnX2hvbGVzIHNob3VsZCBoYXZlCisgICAgICAgICAgICogdGFrZSBjYXJlIG9mIHRoaXMpLgorICAgICAgICAgICAqIC0+IG5lYXIgZml0IG9yIGV4Y2FjdCBmaXQ6IGRvIG5vdCBzcGxpdCwgbm8gbWVtMiBjcmVhdGlvbgorICAgICAgICAgICAqIGFsc28gY2FuJ3QgbW92ZSBtZW0tPm5leHQgZGlyZWN0bHkgYmVoaW5kIG1lbSwgc2luY2UgbWVtLT5uZXh0CisgICAgICAgICAgICogd2lsbCBhbHdheXMgYmUgdXNlZCBhdCB0aGlzIHBvaW50IQorICAgICAgICAgICAqLworICAgICAgICAgIG1lbS0+dXNlZCA9IDE7CisgICAgICAgICAgTUVNX1NUQVRTX0lOQ19VU0VEKHVzZWQsIG1lbS0+bmV4dCAtIChtZW1fc2l6ZV90KSgodThfdCAqKW1lbSAtIHJhbSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lbSA9PSBsZnJlZSkgeworICAgICAgICAgIC8qIEZpbmQgbmV4dCBmcmVlIGJsb2NrIGFmdGVyIG1lbSBhbmQgdXBkYXRlIGxvd2VzdCBmcmVlIHBvaW50ZXIgKi8KKyAgICAgICAgICB3aGlsZSAobGZyZWUtPnVzZWQgJiYgbGZyZWUgIT0gcmFtX2VuZCkgeworICAgICAgICAgICAgTFdJUF9NRU1fQUxMT0NfVU5QUk9URUNUKCk7CisgICAgICAgICAgICAvKiBwcmV2ZW50IGhpZ2ggaW50ZXJydXB0IGxhdGVuY3kuLi4gKi8KKyAgICAgICAgICAgIExXSVBfTUVNX0FMTE9DX1BST1RFQ1QoKTsKKyAgICAgICAgICAgIGxmcmVlID0gKHN0cnVjdCBtZW0gKikodm9pZCAqKSZyYW1bbGZyZWUtPm5leHRdOworICAgICAgICAgIH0KKyAgICAgICAgICBMV0lQX0FTU0VSVCgibWVtX21hbGxvYzogIWxmcmVlLT51c2VkIiwgKChsZnJlZSA9PSByYW1fZW5kKSB8fCAoIWxmcmVlLT51c2VkKSkpOworICAgICAgICB9CisgICAgICAgIExXSVBfTUVNX0FMTE9DX1VOUFJPVEVDVCgpOworICAgICAgICBzeXNfbXV0ZXhfdW5sb2NrKCZtZW1fbXV0ZXgpOworICAgICAgICBMV0lQX0FTU0VSVCgibWVtX21hbGxvYzogYWxsb2NhdGVkIG1lbW9yeSBub3QgYWJvdmUgcmFtX2VuZC4iLAorICAgICAgICAgKG1lbV9wdHJfdCltZW0gKyBTSVpFT0ZfU1RSVUNUX01FTSArIHNpemUgPD0gKG1lbV9wdHJfdClyYW1fZW5kKTsKKyAgICAgICAgTFdJUF9BU1NFUlQoIm1lbV9tYWxsb2M6IGFsbG9jYXRlZCBtZW1vcnkgcHJvcGVybHkgYWxpZ25lZC4iLAorICAgICAgICAgKChtZW1fcHRyX3QpbWVtICsgU0laRU9GX1NUUlVDVF9NRU0pICUgTUVNX0FMSUdOTUVOVCA9PSAwKTsKKyAgICAgICAgTFdJUF9BU1NFUlQoIm1lbV9tYWxsb2M6IHNhbml0eSBjaGVjayBhbGlnbm1lbnQiLAorICAgICAgICAgICgoKG1lbV9wdHJfdCltZW0pICYgKE1FTV9BTElHTk1FTlQtMSkpID09IDApOworCisgICAgICAgIHJldHVybiAodThfdCAqKW1lbSArIFNJWkVPRl9TVFJVQ1RfTUVNOworICAgICAgfQorICAgIH0KKyNpZiBMV0lQX0FMTE9XX01FTV9GUkVFX0ZST01fT1RIRVJfQ09OVEVYVAorICAgIC8qIGlmIHdlIGdvdCBpbnRlcnJ1cHRlZCBieSBhIG1lbV9mcmVlLCB0cnkgYWdhaW4gKi8KKyAgfSB3aGlsZShsb2NhbF9tZW1fZnJlZV9jb3VudCAhPSAwKTsKKyNlbmRpZiAvKiBMV0lQX0FMTE9XX01FTV9GUkVFX0ZST01fT1RIRVJfQ09OVEVYVCAqLworICBMV0lQX0RFQlVHRihNRU1fREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLCAoIm1lbV9tYWxsb2M6IGNvdWxkIG5vdCBhbGxvY2F0ZSAlIlMxNl9GIiBieXRlc1xuIiwgKHMxNl90KXNpemUpKTsKKyAgTUVNX1NUQVRTX0lOQyhlcnIpOworICBMV0lQX01FTV9BTExPQ19VTlBST1RFQ1QoKTsKKyAgc3lzX211dGV4X3VubG9jaygmbWVtX211dGV4KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZiAvKiBNRU1fVVNFX1BPT0xTICovCisvKioKKyAqIENvbnRpZ3VvdXNseSBhbGxvY2F0ZXMgZW5vdWdoIHNwYWNlIGZvciBjb3VudCBvYmplY3RzIHRoYXQgYXJlIHNpemUgYnl0ZXMKKyAqIG9mIG1lbW9yeSBlYWNoIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBUaGUgYWxsb2NhdGVkIG1lbW9yeSBpcyBmaWxsZWQgd2l0aCBieXRlcyBvZiB2YWx1ZSB6ZXJvLgorICoKKyAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2Ygb2JqZWN0cyB0byBhbGxvY2F0ZQorICogQHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgb2JqZWN0cyB0byBhbGxvY2F0ZQorICogQHJldHVybiBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgLyBOVUxMIHBvaW50ZXIgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAqLwordm9pZCAqbWVtX2NhbGxvYyhtZW1fc2l6ZV90IGNvdW50LCBtZW1fc2l6ZV90IHNpemUpCit7CisgIHZvaWQgKnA7CisKKyAgLyogYWxsb2NhdGUgJ2NvdW50JyBvYmplY3RzIG9mIHNpemUgJ3NpemUnICovCisgIHAgPSBtZW1fbWFsbG9jKGNvdW50ICogc2l6ZSk7CisgIGlmIChwKSB7CisgICAgLyogemVybyB0aGUgbWVtb3J5ICovCisgICAgbWVtc2V0KHAsIDAsIGNvdW50ICogc2l6ZSk7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisKKyNlbmRpZiAvKiAhTUVNX0xJQkNfTUFMTE9DICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2NvcmUvbWVtcC5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL21lbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE4NzlhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL21lbXAuYwpAQCAtMCwwICsxLDQ2OSBAQAorLyoqCisgKiBAZmlsZQorICogRHluYW1pYyBwb29sIG1lbW9yeSBtYW5hZ2VyCisgKgorICogbHdJUCBoYXMgZGVkaWNhdGVkIHBvb2xzIGZvciBtYW55IHN0cnVjdHVyZXMgKG5ldGNvbm4sIHByb3RvY29sIGNvbnRyb2wgYmxvY2tzLAorICogcGFja2V0IGJ1ZmZlcnMsIC4uLikuIEFsbCB0aGVzZSBwb29scyBhcmUgbWFuYWdlZCBoZXJlLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaW5jbHVkZSAibHdpcC9tZW1wLmgiCisjaW5jbHVkZSAibHdpcC9wYnVmLmgiCisjaW5jbHVkZSAibHdpcC91ZHAuaCIKKyNpbmNsdWRlICJsd2lwL3Jhdy5oIgorI2luY2x1ZGUgImx3aXAvdGNwX2ltcGwuaCIKKyNpbmNsdWRlICJsd2lwL2lnbXAuaCIKKyNpbmNsdWRlICJsd2lwL2FwaS5oIgorI2luY2x1ZGUgImx3aXAvYXBpX21zZy5oIgorI2luY2x1ZGUgImx3aXAvdGNwaXAuaCIKKyNpbmNsdWRlICJsd2lwL3N5cy5oIgorI2luY2x1ZGUgImx3aXAvdGltZXJzLmgiCisjaW5jbHVkZSAibHdpcC9zdGF0cy5oIgorI2luY2x1ZGUgIm5ldGlmL2V0aGFycC5oIgorI2luY2x1ZGUgImx3aXAvaXBfZnJhZy5oIgorI2luY2x1ZGUgImx3aXAvc25tcF9zdHJ1Y3RzLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wX21zZy5oIgorI2luY2x1ZGUgImx3aXAvZG5zLmgiCisjaW5jbHVkZSAibmV0aWYvcHBwX29lLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmICFNRU1QX01FTV9NQUxMT0MgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKK3N0cnVjdCBtZW1wIHsKKyAgc3RydWN0IG1lbXAgKm5leHQ7CisjaWYgTUVNUF9PVkVSRkxPV19DSEVDSworICBjb25zdCBjaGFyICpmaWxlOworICBpbnQgbGluZTsKKyNlbmRpZiAvKiBNRU1QX09WRVJGTE9XX0NIRUNLICovCit9OworCisjaWYgTUVNUF9PVkVSRkxPV19DSEVDSworLyogaWYgTUVNUF9PVkVSRkxPV19DSEVDSyBpcyB0dXJuZWQgb24sIHdlIHJlc2VydmUgc29tZSBieXRlcyBhdCB0aGUgYmVnaW5uaW5nCisgKiBhbmQgYXQgdGhlIGVuZCBvZiBlYWNoIGVsZW1lbnQsIGluaXRpYWxpemUgdGhlbSBhcyAweGNkIGFuZCBjaGVjaworICogdGhlbSBsYXRlci4gKi8KKy8qIElmIE1FTVBfT1ZFUkZMT1dfQ0hFQ0sgaXMgPj0gMiwgb24gZXZlcnkgY2FsbCB0byBtZW1wX21hbGxvYyBvciBtZW1wX2ZyZWUsCisgKiBldmVyeSBzaW5nbGUgZWxlbWVudCBpbiBlYWNoIHBvb2wgaXMgY2hlY2tlZCEKKyAqIFRoaXMgaXMgVkVSWSBTTE9XIGJ1dCBhbHNvIHZlcnkgaGVscGZ1bC4gKi8KKy8qIE1FTVBfU0FOSVRZX1JFR0lPTl9CRUZPUkUgYW5kIE1FTVBfU0FOSVRZX1JFR0lPTl9BRlRFUiBjYW4gYmUgb3ZlcnJpZGRlbiBpbgorICogbHdpcG9wdHMuaCB0byBjaGFuZ2UgdGhlIGFtb3VudCByZXNlcnZlZCBmb3IgY2hlY2tpbmcuICovCisjaWZuZGVmIE1FTVBfU0FOSVRZX1JFR0lPTl9CRUZPUkUKKyNkZWZpbmUgTUVNUF9TQU5JVFlfUkVHSU9OX0JFRk9SRSAgMTYKKyNlbmRpZiAvKiBNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFKi8KKyNpZiBNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFID4gMAorI2RlZmluZSBNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFX0FMSUdORUQgICAgTFdJUF9NRU1fQUxJR05fU0laRShNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFKQorI2Vsc2UKKyNkZWZpbmUgTUVNUF9TQU5JVFlfUkVHSU9OX0JFRk9SRV9BTElHTkVEICAgIDAKKyNlbmRpZiAvKiBNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFKi8KKyNpZm5kZWYgTUVNUF9TQU5JVFlfUkVHSU9OX0FGVEVSCisjZGVmaW5lIE1FTVBfU0FOSVRZX1JFR0lPTl9BRlRFUiAgIDE2CisjZW5kaWYgLyogTUVNUF9TQU5JVFlfUkVHSU9OX0FGVEVSKi8KKyNpZiBNRU1QX1NBTklUWV9SRUdJT05fQUZURVIgPiAwCisjZGVmaW5lIE1FTVBfU0FOSVRZX1JFR0lPTl9BRlRFUl9BTElHTkVEICAgICBMV0lQX01FTV9BTElHTl9TSVpFKE1FTVBfU0FOSVRZX1JFR0lPTl9BRlRFUikKKyNlbHNlCisjZGVmaW5lIE1FTVBfU0FOSVRZX1JFR0lPTl9BRlRFUl9BTElHTkVEICAgICAwCisjZW5kaWYgLyogTUVNUF9TQU5JVFlfUkVHSU9OX0FGVEVSKi8KKworLyogTUVNUF9TSVpFOiBzYXZlIHNwYWNlIGZvciBzdHJ1Y3QgbWVtcCBhbmQgZm9yIHNhbml0eSBjaGVjayAqLworI2RlZmluZSBNRU1QX1NJWkUgICAgICAgICAgKExXSVBfTUVNX0FMSUdOX1NJWkUoc2l6ZW9mKHN0cnVjdCBtZW1wKSkgKyBNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFX0FMSUdORUQpCisjZGVmaW5lIE1FTVBfQUxJR05fU0laRSh4KSAoTFdJUF9NRU1fQUxJR05fU0laRSh4KSArIE1FTVBfU0FOSVRZX1JFR0lPTl9BRlRFUl9BTElHTkVEKQorCisjZWxzZSAvKiBNRU1QX09WRVJGTE9XX0NIRUNLICovCisKKy8qIE5vIHNhbml0eSBjaGVja3MKKyAqIFdlIGRvbid0IG5lZWQgdG8gcHJlc2VydmUgdGhlIHN0cnVjdCBtZW1wIHdoaWxlIG5vdCBhbGxvY2F0ZWQsIHNvIHdlCisgKiBjYW4gc2F2ZSBhIGxpdHRsZSBzcGFjZSBhbmQgc2V0IE1FTVBfU0laRSB0byAwLgorICovCisjZGVmaW5lIE1FTVBfU0laRSAgICAgICAgICAgMAorI2RlZmluZSBNRU1QX0FMSUdOX1NJWkUoeCkgKExXSVBfTUVNX0FMSUdOX1NJWkUoeCkpCisKKyNlbmRpZiAvKiBNRU1QX09WRVJGTE9XX0NIRUNLICovCisKKy8qKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBmaXJzdCBmcmVlIGVsZW1lbnQgb2YgZWFjaCBwb29sLgorICogIEVsZW1lbnRzIGZvcm0gYSBsaW5rZWQgbGlzdC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbWVtcCAqbWVtcF90YWJbTUVNUF9NQVhdOworCisjZWxzZSAvKiBNRU1QX01FTV9NQUxMT0MgKi8KKworI2RlZmluZSBNRU1QX0FMSUdOX1NJWkUoeCkgKExXSVBfTUVNX0FMSUdOX1NJWkUoeCkpCisKKyNlbmRpZiAvKiBNRU1QX01FTV9NQUxMT0MgKi8KKworLyoqIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGVsZW1lbnQgc2l6ZXMgb2YgZWFjaCBwb29sLiAqLworI2lmICFNRU1fVVNFX1BPT0xTICYmICFNRU1QX01FTV9NQUxMT0MKK3N0YXRpYworI2VuZGlmCitjb25zdCB1MTZfdCBtZW1wX3NpemVzW01FTVBfTUFYXSA9IHsKKyNkZWZpbmUgTFdJUF9NRU1QT09MKG5hbWUsbnVtLHNpemUsZGVzYykgIExXSVBfTUVNX0FMSUdOX1NJWkUoc2l6ZSksCisjaW5jbHVkZSAibHdpcC9tZW1wX3N0ZC5oIgorfTsKKworI2lmICFNRU1QX01FTV9NQUxMT0MgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKy8qKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gZWFjaCBwb29sLiAqLworc3RhdGljIGNvbnN0IHUxNl90IG1lbXBfbnVtW01FTVBfTUFYXSA9IHsKKyNkZWZpbmUgTFdJUF9NRU1QT09MKG5hbWUsbnVtLHNpemUsZGVzYykgIChudW0pLAorI2luY2x1ZGUgImx3aXAvbWVtcF9zdGQuaCIKK307CisKKy8qKiBUaGlzIGFycmF5IGhvbGRzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBlYWNoIHBvb2wuICovCisjaWZkZWYgTFdJUF9ERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKm1lbXBfZGVzY1tNRU1QX01BWF0gPSB7CisjZGVmaW5lIExXSVBfTUVNUE9PTChuYW1lLG51bSxzaXplLGRlc2MpICAoZGVzYyksCisjaW5jbHVkZSAibHdpcC9tZW1wX3N0ZC5oIgorfTsKKyNlbmRpZiAvKiBMV0lQX0RFQlVHICovCisKKyNpZiBNRU1QX1NFUEFSQVRFX1BPT0xTCisKKy8qKiBUaGlzIGNyZWF0ZXMgZWFjaCBtZW1vcnkgcG9vbC4gVGhlc2UgYXJlIG5hbWVkIG1lbXBfbWVtb3J5X1hYWF9iYXNlICh3aGVyZQorICogWFhYIGlzIHRoZSBuYW1lIG9mIHRoZSBwb29sIGRlZmluZWQgaW4gbWVtcF9zdGQuaCkuCisgKiBUbyByZWxvY2F0ZSBhIHBvb2wsIGRlY2xhcmUgaXQgYXMgZXh0ZXJuIGluIGNjLmguIEV4YW1wbGUgZm9yIEdDQzoKKyAqICAgZXh0ZXJuIHU4X3QgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLm9uY2hpcF9tZW0iKSkpIG1lbXBfbWVtb3J5X1VEUF9QQ0JfYmFzZVtdOworICovCisjZGVmaW5lIExXSVBfTUVNUE9PTChuYW1lLG51bSxzaXplLGRlc2MpIHU4X3QgbWVtcF9tZW1vcnlfICMjIG5hbWUgIyMgX2Jhc2UgXAorICBbKChudW0pICogKE1FTVBfU0laRSArIE1FTVBfQUxJR05fU0laRShzaXplKSkpXTsgICAKKyNpbmNsdWRlICJsd2lwL21lbXBfc3RkLmgiCisKKy8qKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBiYXNlIG9mIGVhY2ggbWVtb3J5IHBvb2wuICovCitzdGF0aWMgdThfdCAqY29uc3QgbWVtcF9iYXNlc1tdID0geyAKKyNkZWZpbmUgTFdJUF9NRU1QT09MKG5hbWUsbnVtLHNpemUsZGVzYykgbWVtcF9tZW1vcnlfICMjIG5hbWUgIyMgX2Jhc2UsICAgCisjaW5jbHVkZSAibHdpcC9tZW1wX3N0ZC5oIgorfTsKKworI2Vsc2UgLyogTUVNUF9TRVBBUkFURV9QT09MUyAqLworCisvKiogVGhpcyBpcyB0aGUgYWN0dWFsIG1lbW9yeSB1c2VkIGJ5IHRoZSBwb29scyAoYWxsIHBvb2xzIGluIG9uZSBiaWcgYmxvY2spLiAqLworc3RhdGljIHU4X3QgbWVtcF9tZW1vcnlbTUVNX0FMSUdOTUVOVCAtIDEgCisjZGVmaW5lIExXSVBfTUVNUE9PTChuYW1lLG51bSxzaXplLGRlc2MpICsgKCAobnVtKSAqIChNRU1QX1NJWkUgKyBNRU1QX0FMSUdOX1NJWkUoc2l6ZSkgKSApCisjaW5jbHVkZSAibHdpcC9tZW1wX3N0ZC5oIgorXTsKKworI2VuZGlmIC8qIE1FTVBfU0VQQVJBVEVfUE9PTFMgKi8KKworI2lmIE1FTVBfU0FOSVRZX0NIRUNLCisvKioKKyAqIENoZWNrIHRoYXQgbWVtcC1saXN0cyBkb24ndCBmb3JtIGEgY2lyY2xlCisgKi8KK3N0YXRpYyBpbnQKK21lbXBfc2FuaXR5KHZvaWQpCit7CisgIHMxNl90IGksIGM7CisgIHN0cnVjdCBtZW1wICptLCAqbjsKKworICBmb3IgKGkgPSAwOyBpIDwgTUVNUF9NQVg7IGkrKykgeworICAgIGZvciAobSA9IG1lbXBfdGFiW2ldOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KSB7CisgICAgICBjID0gMTsKKyAgICAgIGZvciAobiA9IG1lbXBfdGFiW2ldOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGlmIChuID09IG0gJiYgLS1jIDwgMCkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorI2VuZGlmIC8qIE1FTVBfU0FOSVRZX0NIRUNLKi8KKyNpZiBNRU1QX09WRVJGTE9XX0NIRUNLCisjaWYgZGVmaW5lZChMV0lQX0RFQlVHKSAmJiBNRU1QX1NUQVRTCitzdGF0aWMgY29uc3QgY2hhciAqIG1lbXBfb3ZlcmZsb3dfbmFtZXNbXSA9IHsKKyNkZWZpbmUgTFdJUF9NRU1QT09MKG5hbWUsbnVtLHNpemUsZGVzYykgIi8iZGVzYywKKyNpbmNsdWRlICJsd2lwL21lbXBfc3RkLmgiCisgIH07CisjZW5kaWYKKworLyoqCisgKiBDaGVjayBpZiBhIG1lbXAgZWxlbWVudCB3YXMgdmljdGltIG9mIGFuIG92ZXJmbG93CisgKiAoZS5nLiB0aGUgcmVzdHJpY3RlZCBhcmVhIGFmdGVyIGl0IGhhcyBiZWVuIGFsdGVyZWQpCisgKgorICogQHBhcmFtIHAgdGhlIG1lbXAgZWxlbWVudCB0byBjaGVjaworICogQHBhcmFtIG1lbXBfdHlwZSB0aGUgcG9vbCBwIGNvbWVzIGZyb20KKyAqLworc3RhdGljIHZvaWQKK21lbXBfb3ZlcmZsb3dfY2hlY2tfZWxlbWVudF9vdmVyZmxvdyhzdHJ1Y3QgbWVtcCAqcCwgdTE2X3QgbWVtcF90eXBlKQoreworICB1MTZfdCBrOworICB1OF90ICptOworI2lmIE1FTVBfU0FOSVRZX1JFR0lPTl9BRlRFUl9BTElHTkVEID4gMAorICBtID0gKHU4X3QqKXAgKyBNRU1QX1NJWkUgKyBtZW1wX3NpemVzW21lbXBfdHlwZV07CisgIGZvciAoayA9IDA7IGsgPCBNRU1QX1NBTklUWV9SRUdJT05fQUZURVJfQUxJR05FRDsgaysrKSB7CisgICAgaWYgKG1ba10gIT0gMHhjZCkgeworICAgICAgY2hhciBlcnJzdHJbMTI4XSA9ICJkZXRlY3RlZCBtZW1wIG92ZXJmbG93IGluIHBvb2wgIjsKKyAgICAgIGNoYXIgZGlnaXRbXSA9ICIwIjsKKyAgICAgIGlmKG1lbXBfdHlwZSA+PSAxMCkgeworICAgICAgICBkaWdpdFswXSA9ICcwJyArIChtZW1wX3R5cGUvMTApOworICAgICAgICBzdHJjYXQoZXJyc3RyLCBkaWdpdCk7CisgICAgICB9CisgICAgICBkaWdpdFswXSA9ICcwJyArIChtZW1wX3R5cGUlMTApOworICAgICAgc3RyY2F0KGVycnN0ciwgZGlnaXQpOworI2lmIGRlZmluZWQoTFdJUF9ERUJVRykgJiYgTUVNUF9TVEFUUworICAgICAgc3RyY2F0KGVycnN0ciwgbWVtcF9vdmVyZmxvd19uYW1lc1ttZW1wX3R5cGVdKTsKKyNlbmRpZgorICAgICAgTFdJUF9BU1NFUlQoZXJyc3RyLCAwKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorCisvKioKKyAqIENoZWNrIGlmIGEgbWVtcCBlbGVtZW50IHdhcyB2aWN0aW0gb2YgYW4gdW5kZXJmbG93CisgKiAoZS5nLiB0aGUgcmVzdHJpY3RlZCBhcmVhIGJlZm9yZSBpdCBoYXMgYmVlbiBhbHRlcmVkKQorICoKKyAqIEBwYXJhbSBwIHRoZSBtZW1wIGVsZW1lbnQgdG8gY2hlY2sKKyAqIEBwYXJhbSBtZW1wX3R5cGUgdGhlIHBvb2wgcCBjb21lcyBmcm9tCisgKi8KK3N0YXRpYyB2b2lkCittZW1wX292ZXJmbG93X2NoZWNrX2VsZW1lbnRfdW5kZXJmbG93KHN0cnVjdCBtZW1wICpwLCB1MTZfdCBtZW1wX3R5cGUpCit7CisgIHUxNl90IGs7CisgIHU4X3QgKm07CisjaWYgTUVNUF9TQU5JVFlfUkVHSU9OX0JFRk9SRV9BTElHTkVEID4gMAorICBtID0gKHU4X3QqKXAgKyBNRU1QX1NJWkUgLSBNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFX0FMSUdORUQ7CisgIGZvciAoayA9IDA7IGsgPCBNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFX0FMSUdORUQ7IGsrKykgeworICAgIGlmIChtW2tdICE9IDB4Y2QpIHsKKyAgICAgIGNoYXIgZXJyc3RyWzEyOF0gPSAiZGV0ZWN0ZWQgbWVtcCB1bmRlcmZsb3cgaW4gcG9vbCAiOworICAgICAgY2hhciBkaWdpdFtdID0gIjAiOworICAgICAgaWYobWVtcF90eXBlID49IDEwKSB7CisgICAgICAgIGRpZ2l0WzBdID0gJzAnICsgKG1lbXBfdHlwZS8xMCk7CisgICAgICAgIHN0cmNhdChlcnJzdHIsIGRpZ2l0KTsKKyAgICAgIH0KKyAgICAgIGRpZ2l0WzBdID0gJzAnICsgKG1lbXBfdHlwZSUxMCk7CisgICAgICBzdHJjYXQoZXJyc3RyLCBkaWdpdCk7CisjaWYgZGVmaW5lZChMV0lQX0RFQlVHKSAmJiBNRU1QX1NUQVRTCisgICAgICBzdHJjYXQoZXJyc3RyLCBtZW1wX292ZXJmbG93X25hbWVzW21lbXBfdHlwZV0pOworI2VuZGlmCisgICAgICBMV0lQX0FTU0VSVChlcnJzdHIsIDApOworICAgIH0KKyAgfQorI2VuZGlmCit9CisKKy8qKgorICogRG8gYW4gb3ZlcmZsb3cgY2hlY2sgZm9yIGFsbCBlbGVtZW50cyBpbiBldmVyeSBwb29sLgorICoKKyAqIEBzZWUgbWVtcF9vdmVyZmxvd19jaGVja19lbGVtZW50IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGVjaworICovCitzdGF0aWMgdm9pZAorbWVtcF9vdmVyZmxvd19jaGVja19hbGwodm9pZCkKK3sKKyAgdTE2X3QgaSwgajsKKyAgc3RydWN0IG1lbXAgKnA7CisKKyAgcCA9IChzdHJ1Y3QgbWVtcCAqKUxXSVBfTUVNX0FMSUdOKG1lbXBfbWVtb3J5KTsKKyAgZm9yIChpID0gMDsgaSA8IE1FTVBfTUFYOyArK2kpIHsKKyAgICBwID0gcDsKKyAgICBmb3IgKGogPSAwOyBqIDwgbWVtcF9udW1baV07ICsraikgeworICAgICAgbWVtcF9vdmVyZmxvd19jaGVja19lbGVtZW50X292ZXJmbG93KHAsIGkpOworICAgICAgcCA9IChzdHJ1Y3QgbWVtcCopKCh1OF90KilwICsgTUVNUF9TSVpFICsgbWVtcF9zaXplc1tpXSArIE1FTVBfU0FOSVRZX1JFR0lPTl9BRlRFUl9BTElHTkVEKTsKKyAgICB9CisgIH0KKyAgcCA9IChzdHJ1Y3QgbWVtcCAqKUxXSVBfTUVNX0FMSUdOKG1lbXBfbWVtb3J5KTsKKyAgZm9yIChpID0gMDsgaSA8IE1FTVBfTUFYOyArK2kpIHsKKyAgICBwID0gcDsKKyAgICBmb3IgKGogPSAwOyBqIDwgbWVtcF9udW1baV07ICsraikgeworICAgICAgbWVtcF9vdmVyZmxvd19jaGVja19lbGVtZW50X3VuZGVyZmxvdyhwLCBpKTsKKyAgICAgIHAgPSAoc3RydWN0IG1lbXAqKSgodThfdCopcCArIE1FTVBfU0laRSArIG1lbXBfc2l6ZXNbaV0gKyBNRU1QX1NBTklUWV9SRUdJT05fQUZURVJfQUxJR05FRCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgcmVzdHJpY3RlZCBhcmVhcyBvZiBhbGwgbWVtcCBlbGVtZW50cyBpbiBldmVyeSBwb29sLgorICovCitzdGF0aWMgdm9pZAorbWVtcF9vdmVyZmxvd19pbml0KHZvaWQpCit7CisgIHUxNl90IGksIGo7CisgIHN0cnVjdCBtZW1wICpwOworICB1OF90ICptOworCisgIHAgPSAoc3RydWN0IG1lbXAgKilMV0lQX01FTV9BTElHTihtZW1wX21lbW9yeSk7CisgIGZvciAoaSA9IDA7IGkgPCBNRU1QX01BWDsgKytpKSB7CisgICAgcCA9IHA7CisgICAgZm9yIChqID0gMDsgaiA8IG1lbXBfbnVtW2ldOyArK2opIHsKKyNpZiBNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFX0FMSUdORUQgPiAwCisgICAgICBtID0gKHU4X3QqKXAgKyBNRU1QX1NJWkUgLSBNRU1QX1NBTklUWV9SRUdJT05fQkVGT1JFX0FMSUdORUQ7CisgICAgICBtZW1zZXQobSwgMHhjZCwgTUVNUF9TQU5JVFlfUkVHSU9OX0JFRk9SRV9BTElHTkVEKTsKKyNlbmRpZgorI2lmIE1FTVBfU0FOSVRZX1JFR0lPTl9BRlRFUl9BTElHTkVEID4gMAorICAgICAgbSA9ICh1OF90KilwICsgTUVNUF9TSVpFICsgbWVtcF9zaXplc1tpXTsKKyAgICAgIG1lbXNldChtLCAweGNkLCBNRU1QX1NBTklUWV9SRUdJT05fQUZURVJfQUxJR05FRCk7CisjZW5kaWYKKyAgICAgIHAgPSAoc3RydWN0IG1lbXAqKSgodThfdCopcCArIE1FTVBfU0laRSArIG1lbXBfc2l6ZXNbaV0gKyBNRU1QX1NBTklUWV9SRUdJT05fQUZURVJfQUxJR05FRCk7CisgICAgfQorICB9Cit9CisjZW5kaWYgLyogTUVNUF9PVkVSRkxPV19DSEVDSyAqLworCisvKioKKyAqIEluaXRpYWxpemUgdGhpcyBtb2R1bGUuCisgKiAKKyAqIENhcnZlcyBvdXQgbWVtcF9tZW1vcnkgaW50byBsaW5rZWQgbGlzdHMgZm9yIGVhY2ggcG9vbC10eXBlLgorICovCit2b2lkCittZW1wX2luaXQodm9pZCkKK3sKKyAgc3RydWN0IG1lbXAgKm1lbXA7CisgIHUxNl90IGksIGo7CisKKyAgZm9yIChpID0gMDsgaSA8IE1FTVBfTUFYOyArK2kpIHsKKyAgICBNRU1QX1NUQVRTX0FWQUlMKHVzZWQsIGksIDApOworICAgIE1FTVBfU1RBVFNfQVZBSUwobWF4LCBpLCAwKTsKKyAgICBNRU1QX1NUQVRTX0FWQUlMKGVyciwgaSwgMCk7CisgICAgTUVNUF9TVEFUU19BVkFJTChhdmFpbCwgaSwgbWVtcF9udW1baV0pOworICB9CisKKyNpZiAhTUVNUF9TRVBBUkFURV9QT09MUworICBtZW1wID0gKHN0cnVjdCBtZW1wICopTFdJUF9NRU1fQUxJR04obWVtcF9tZW1vcnkpOworI2VuZGlmIC8qICFNRU1QX1NFUEFSQVRFX1BPT0xTICovCisgIC8qIGZvciBldmVyeSBwb29sOiAqLworICBmb3IgKGkgPSAwOyBpIDwgTUVNUF9NQVg7ICsraSkgeworICAgIG1lbXBfdGFiW2ldID0gTlVMTDsKKyNpZiBNRU1QX1NFUEFSQVRFX1BPT0xTCisgICAgbWVtcCA9IChzdHJ1Y3QgbWVtcCopbWVtcF9iYXNlc1tpXTsKKyNlbmRpZiAvKiBNRU1QX1NFUEFSQVRFX1BPT0xTICovCisgICAgLyogY3JlYXRlIGEgbGlua2VkIGxpc3Qgb2YgbWVtcCBlbGVtZW50cyAqLworICAgIGZvciAoaiA9IDA7IGogPCBtZW1wX251bVtpXTsgKytqKSB7CisgICAgICBtZW1wLT5uZXh0ID0gbWVtcF90YWJbaV07CisgICAgICBtZW1wX3RhYltpXSA9IG1lbXA7CisgICAgICBtZW1wID0gKHN0cnVjdCBtZW1wICopKHZvaWQgKikoKHU4X3QgKiltZW1wICsgTUVNUF9TSVpFICsgbWVtcF9zaXplc1tpXQorI2lmIE1FTVBfT1ZFUkZMT1dfQ0hFQ0sKKyAgICAgICAgKyBNRU1QX1NBTklUWV9SRUdJT05fQUZURVJfQUxJR05FRAorI2VuZGlmCisgICAgICApOworICAgIH0KKyAgfQorI2lmIE1FTVBfT1ZFUkZMT1dfQ0hFQ0sKKyAgbWVtcF9vdmVyZmxvd19pbml0KCk7CisgIC8qIGNoZWNrIGV2ZXJ5dGhpbmcgYSBmaXJzdCB0aW1lIHRvIHNlZSBpZiBpdCB3b3JrZWQgKi8KKyAgbWVtcF9vdmVyZmxvd19jaGVja19hbGwoKTsKKyNlbmRpZiAvKiBNRU1QX09WRVJGTE9XX0NIRUNLICovCit9CisKKy8qKgorICogR2V0IGFuIGVsZW1lbnQgZnJvbSBhIHNwZWNpZmljIHBvb2wuCisgKgorICogQHBhcmFtIHR5cGUgdGhlIHBvb2wgdG8gZ2V0IGFuIGVsZW1lbnQgZnJvbQorICoKKyAqIHRoZSBkZWJ1ZyB2ZXJzaW9uIGhhcyB0d28gbW9yZSBwYXJhbWV0ZXJzOgorICogQHBhcmFtIGZpbGUgZmlsZSBuYW1lIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogQHBhcmFtIGxpbmUgbnVtYmVyIG9mIGxpbmUgd2hlcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqCisgKiBAcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSBvciBhIE5VTEwgcG9pbnRlciBvbiBlcnJvcgorICovCit2b2lkICoKKyNpZiAhTUVNUF9PVkVSRkxPV19DSEVDSworbWVtcF9tYWxsb2MobWVtcF90IHR5cGUpCisjZWxzZQorbWVtcF9tYWxsb2NfZm4obWVtcF90IHR5cGUsIGNvbnN0IGNoYXIqIGZpbGUsIGNvbnN0IGludCBsaW5lKQorI2VuZGlmCit7CisgIHN0cnVjdCBtZW1wICptZW1wOworICBTWVNfQVJDSF9ERUNMX1BST1RFQ1Qob2xkX2xldmVsKTsKKyAKKyAgTFdJUF9FUlJPUigibWVtcF9tYWxsb2M6IHR5cGUgPCBNRU1QX01BWCIsICh0eXBlIDwgTUVNUF9NQVgpLCByZXR1cm4gTlVMTDspOworCisgIFNZU19BUkNIX1BST1RFQ1Qob2xkX2xldmVsKTsKKyNpZiBNRU1QX09WRVJGTE9XX0NIRUNLID49IDIKKyAgbWVtcF9vdmVyZmxvd19jaGVja19hbGwoKTsKKyNlbmRpZiAvKiBNRU1QX09WRVJGTE9XX0NIRUNLID49IDIgKi8KKworICBtZW1wID0gbWVtcF90YWJbdHlwZV07CisgIAorICBpZiAobWVtcCAhPSBOVUxMKSB7CisgICAgbWVtcF90YWJbdHlwZV0gPSBtZW1wLT5uZXh0OworI2lmIE1FTVBfT1ZFUkZMT1dfQ0hFQ0sKKyAgICBtZW1wLT5uZXh0ID0gTlVMTDsKKyAgICBtZW1wLT5maWxlID0gZmlsZTsKKyAgICBtZW1wLT5saW5lID0gbGluZTsKKyNlbmRpZiAvKiBNRU1QX09WRVJGTE9XX0NIRUNLICovCisgICAgTUVNUF9TVEFUU19JTkNfVVNFRCh1c2VkLCB0eXBlKTsKKyAgICBMV0lQX0FTU0VSVCgibWVtcF9tYWxsb2M6IG1lbXAgcHJvcGVybHkgYWxpZ25lZCIsCisgICAgICAgICAgICAgICAgKChtZW1fcHRyX3QpbWVtcCAlIE1FTV9BTElHTk1FTlQpID09IDApOworICAgIG1lbXAgPSAoc3RydWN0IG1lbXAqKSh2b2lkICopKCh1OF90KiltZW1wICsgTUVNUF9TSVpFKTsKKyAgfSBlbHNlIHsKKyAgICBMV0lQX0RFQlVHRihNRU1QX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfU0VSSU9VUywgKCJtZW1wX21hbGxvYzogb3V0IG9mIG1lbW9yeSBpbiBwb29sICVzXG4iLCBtZW1wX2Rlc2NbdHlwZV0pKTsKKyAgICBNRU1QX1NUQVRTX0lOQyhlcnIsIHR5cGUpOworICB9CisKKyAgU1lTX0FSQ0hfVU5QUk9URUNUKG9sZF9sZXZlbCk7CisKKyAgcmV0dXJuIG1lbXA7Cit9CisKKy8qKgorICogUHV0IGFuIGVsZW1lbnQgYmFjayBpbnRvIGl0cyBwb29sLgorICoKKyAqIEBwYXJhbSB0eXBlIHRoZSBwb29sIHdoZXJlIHRvIHB1dCBtZW0KKyAqIEBwYXJhbSBtZW0gdGhlIG1lbXAgZWxlbWVudCB0byBmcmVlCisgKi8KK3ZvaWQKK21lbXBfZnJlZShtZW1wX3QgdHlwZSwgdm9pZCAqbWVtKQoreworICBzdHJ1Y3QgbWVtcCAqbWVtcDsKKyAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKG9sZF9sZXZlbCk7CisKKyAgaWYgKG1lbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIExXSVBfQVNTRVJUKCJtZW1wX2ZyZWU6IG1lbSBwcm9wZXJseSBhbGlnbmVkIiwKKyAgICAgICAgICAgICAgICAoKG1lbV9wdHJfdCltZW0gJSBNRU1fQUxJR05NRU5UKSA9PSAwKTsKKworICBtZW1wID0gKHN0cnVjdCBtZW1wICopKHZvaWQgKikoKHU4X3QqKW1lbSAtIE1FTVBfU0laRSk7CisKKyAgU1lTX0FSQ0hfUFJPVEVDVChvbGRfbGV2ZWwpOworI2lmIE1FTVBfT1ZFUkZMT1dfQ0hFQ0sKKyNpZiBNRU1QX09WRVJGTE9XX0NIRUNLID49IDIKKyAgbWVtcF9vdmVyZmxvd19jaGVja19hbGwoKTsKKyNlbHNlCisgIG1lbXBfb3ZlcmZsb3dfY2hlY2tfZWxlbWVudF9vdmVyZmxvdyhtZW1wLCB0eXBlKTsKKyAgbWVtcF9vdmVyZmxvd19jaGVja19lbGVtZW50X3VuZGVyZmxvdyhtZW1wLCB0eXBlKTsKKyNlbmRpZiAvKiBNRU1QX09WRVJGTE9XX0NIRUNLID49IDIgKi8KKyNlbmRpZiAvKiBNRU1QX09WRVJGTE9XX0NIRUNLICovCisKKyAgTUVNUF9TVEFUU19ERUModXNlZCwgdHlwZSk7IAorICAKKyAgbWVtcC0+bmV4dCA9IG1lbXBfdGFiW3R5cGVdOyAKKyAgbWVtcF90YWJbdHlwZV0gPSBtZW1wOworCisjaWYgTUVNUF9TQU5JVFlfQ0hFQ0sKKyAgTFdJUF9BU1NFUlQoIm1lbXAgc2FuaXR5IiwgbWVtcF9zYW5pdHkoKSk7CisjZW5kaWYgLyogTUVNUF9TQU5JVFlfQ0hFQ0sgKi8KKworICBTWVNfQVJDSF9VTlBST1RFQ1Qob2xkX2xldmVsKTsKK30KKworI2VuZGlmIC8qIE1FTVBfTUVNX01BTExPQyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL25ldGlmLmMgYi9jb3JlL2x3aXAvc3JjL2NvcmUvbmV0aWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTkwYjFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL25ldGlmLmMKQEAgLTAsMCArMSw3NTIgQEAKKy8qKgorICogQGZpbGUKKyAqIGx3SVAgbmV0d29yayBpbnRlcmZhY2UgYWJzdHJhY3Rpb24KKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICoKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKyNpbmNsdWRlICJsd2lwL25ldGlmLmgiCisjaW5jbHVkZSAibHdpcC90Y3BfaW1wbC5oIgorI2luY2x1ZGUgImx3aXAvc25tcC5oIgorI2luY2x1ZGUgImx3aXAvaWdtcC5oIgorI2luY2x1ZGUgIm5ldGlmL2V0aGFycC5oIgorI2luY2x1ZGUgImx3aXAvc3RhdHMuaCIKKyNpZiBFTkFCTEVfTE9PUEJBQ0sKKyNpbmNsdWRlICJsd2lwL3N5cy5oIgorI2lmIExXSVBfTkVUSUZfTE9PUEJBQ0tfTVVMVElUSFJFQURJTkcKKyNpbmNsdWRlICJsd2lwL3RjcGlwLmgiCisjZW5kaWYgLyogTFdJUF9ORVRJRl9MT09QQkFDS19NVUxUSVRIUkVBRElORyAqLworI2VuZGlmIC8qIEVOQUJMRV9MT09QQkFDSyAqLworCisjaWYgTFdJUF9BVVRPSVAKKyNpbmNsdWRlICJsd2lwL2F1dG9pcC5oIgorI2VuZGlmIC8qIExXSVBfQVVUT0lQICovCisjaWYgTFdJUF9ESENQCisjaW5jbHVkZSAibHdpcC9kaGNwLmgiCisjZW5kaWYgLyogTFdJUF9ESENQICovCisKKyNpZiBMV0lQX05FVElGX1NUQVRVU19DQUxMQkFDSworI2RlZmluZSBORVRJRl9TVEFUVVNfQ0FMTEJBQ0sobikgZG97IGlmIChuLT5zdGF0dXNfY2FsbGJhY2spIHsgKG4tPnN0YXR1c19jYWxsYmFjaykobik7IH19d2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIE5FVElGX1NUQVRVU19DQUxMQkFDSyhuKQorI2VuZGlmIC8qIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLICovIAorCisjaWYgTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLCisjZGVmaW5lIE5FVElGX0xJTktfQ0FMTEJBQ0sobikgZG97IGlmIChuLT5saW5rX2NhbGxiYWNrKSB7IChuLT5saW5rX2NhbGxiYWNrKShuKTsgfX13aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgTkVUSUZfTElOS19DQUxMQkFDSyhuKQorI2VuZGlmIC8qIExXSVBfTkVUSUZfTElOS19DQUxMQkFDSyAqLyAKKworc3RydWN0IG5ldGlmICpuZXRpZl9saXN0Oworc3RydWN0IG5ldGlmICpuZXRpZl9kZWZhdWx0OworCisjaWYgTFdJUF9IQVZFX0xPT1BJRgorc3RhdGljIHN0cnVjdCBuZXRpZiBsb29wX25ldGlmOworCisvKioKKyAqIEluaXRpYWxpemUgYSBsd2lwIG5ldHdvcmsgaW50ZXJmYWNlIHN0cnVjdHVyZSBmb3IgYSBsb29wYmFjayBpbnRlcmZhY2UKKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIGx3aXAgbmV0d29yayBpbnRlcmZhY2Ugc3RydWN0dXJlIGZvciB0aGlzIGxvb3BpZgorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIGxvb3BpZiBpcyBpbml0aWFsaXplZAorICogICAgICAgICBFUlJfTUVNIGlmIHByaXZhdGUgZGF0YSBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQKKyAqLworc3RhdGljIGVycl90CituZXRpZl9sb29waWZfaW5pdChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICAvKiBpbml0aWFsaXplIHRoZSBzbm1wIHZhcmlhYmxlcyBhbmQgY291bnRlcnMgaW5zaWRlIHRoZSBzdHJ1Y3QgbmV0aWYKKyAgICogaWZTcGVlZDogbm8gYXNzdW1wdGlvbiBjYW4gYmUgbWFkZSEKKyAgICovCisgIE5FVElGX0lOSVRfU05NUChuZXRpZiwgc25tcF9pZlR5cGVfc29mdHdhcmVMb29wYmFjaywgMCk7CisKKyAgbmV0aWYtPm5hbWVbMF0gPSAnbCc7CisgIG5ldGlmLT5uYW1lWzFdID0gJ28nOworICBuZXRpZi0+b3V0cHV0ID0gbmV0aWZfbG9vcF9vdXRwdXQ7CisgIHJldHVybiBFUlJfT0s7Cit9CisjZW5kaWYgLyogTFdJUF9IQVZFX0xPT1BJRiAqLworCit2b2lkCituZXRpZl9pbml0KHZvaWQpCit7CisjaWYgTFdJUF9IQVZFX0xPT1BJRgorICBpcF9hZGRyX3QgbG9vcF9pcGFkZHIsIGxvb3BfbmV0bWFzaywgbG9vcF9ndzsKKyAgSVA0X0FERFIoJmxvb3BfZ3csIDEyNywwLDAsMSk7CisgIElQNF9BRERSKCZsb29wX2lwYWRkciwgMTI3LDAsMCwxKTsKKyAgSVA0X0FERFIoJmxvb3BfbmV0bWFzaywgMjU1LDAsMCwwKTsKKworI2lmIE5PX1NZUworICBuZXRpZl9hZGQoJmxvb3BfbmV0aWYsICZsb29wX2lwYWRkciwgJmxvb3BfbmV0bWFzaywgJmxvb3BfZ3csIE5VTEwsIG5ldGlmX2xvb3BpZl9pbml0LCBpcF9pbnB1dCk7CisjZWxzZSAgLyogTk9fU1lTICovCisgIG5ldGlmX2FkZCgmbG9vcF9uZXRpZiwgJmxvb3BfaXBhZGRyLCAmbG9vcF9uZXRtYXNrLCAmbG9vcF9ndywgTlVMTCwgbmV0aWZfbG9vcGlmX2luaXQsIHRjcGlwX2lucHV0KTsKKyNlbmRpZiAvKiBOT19TWVMgKi8KKyAgbmV0aWZfc2V0X3VwKCZsb29wX25ldGlmKTsKKworI2VuZGlmIC8qIExXSVBfSEFWRV9MT09QSUYgKi8KK30KKworLyoqCisgKiBBZGQgYSBuZXR3b3JrIGludGVyZmFjZSB0byB0aGUgbGlzdCBvZiBsd0lQIG5ldGlmcy4KKyAqCisgKiBAcGFyYW0gbmV0aWYgYSBwcmUtYWxsb2NhdGVkIG5ldGlmIHN0cnVjdHVyZQorICogQHBhcmFtIGlwYWRkciBJUCBhZGRyZXNzIGZvciB0aGUgbmV3IG5ldGlmCisgKiBAcGFyYW0gbmV0bWFzayBuZXR3b3JrIG1hc2sgZm9yIHRoZSBuZXcgbmV0aWYKKyAqIEBwYXJhbSBndyBkZWZhdWx0IGdhdGV3YXkgSVAgYWRkcmVzcyBmb3IgdGhlIG5ldyBuZXRpZgorICogQHBhcmFtIHN0YXRlIG9wYXF1ZSBkYXRhIHBhc3NlZCB0byB0aGUgbmV3IG5ldGlmCisgKiBAcGFyYW0gaW5pdCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBpbnRlcmZhY2UKKyAqIEBwYXJhbSBpbnB1dCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBwYXNzCisgKiBpbmdyZXNzIHBhY2tldHMgdXAgaW4gdGhlIHByb3RvY29sIGxheWVyIHN0YWNrLgorICoKKyAqIEByZXR1cm4gbmV0aWYsIG9yIE5VTEwgaWYgZmFpbGVkLgorICovCitzdHJ1Y3QgbmV0aWYgKgorbmV0aWZfYWRkKHN0cnVjdCBuZXRpZiAqbmV0aWYsIGlwX2FkZHJfdCAqaXBhZGRyLCBpcF9hZGRyX3QgKm5ldG1hc2ssCisgIGlwX2FkZHJfdCAqZ3csIHZvaWQgKnN0YXRlLCBuZXRpZl9pbml0X2ZuIGluaXQsIG5ldGlmX2lucHV0X2ZuIGlucHV0KQoreworICBzdGF0aWMgdThfdCBuZXRpZm51bSA9IDA7CisKKyAgTFdJUF9BU1NFUlQoIk5vIGluaXQgZnVuY3Rpb24gZ2l2ZW4iLCBpbml0ICE9IE5VTEwpOworCisgIC8qIHJlc2V0IG5ldyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdGF0ZSAqLworICBpcF9hZGRyX3NldF96ZXJvKCZuZXRpZi0+aXBfYWRkcik7CisgIGlwX2FkZHJfc2V0X3plcm8oJm5ldGlmLT5uZXRtYXNrKTsKKyAgaXBfYWRkcl9zZXRfemVybygmbmV0aWYtPmd3KTsKKyAgbmV0aWYtPmZsYWdzID0gMDsKKyNpZiBMV0lQX0RIQ1AKKyAgLyogbmV0aWYgbm90IHVuZGVyIERIQ1AgY29udHJvbCBieSBkZWZhdWx0ICovCisgIG5ldGlmLT5kaGNwID0gTlVMTDsKKyNlbmRpZiAvKiBMV0lQX0RIQ1AgKi8KKyNpZiBMV0lQX0FVVE9JUAorICAvKiBuZXRpZiBub3QgdW5kZXIgQXV0b0lQIGNvbnRyb2wgYnkgZGVmYXVsdCAqLworICBuZXRpZi0+YXV0b2lwID0gTlVMTDsKKyNlbmRpZiAvKiBMV0lQX0FVVE9JUCAqLworI2lmIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLCisgIG5ldGlmLT5zdGF0dXNfY2FsbGJhY2sgPSBOVUxMOworI2VuZGlmIC8qIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLICovCisjaWYgTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLCisgIG5ldGlmLT5saW5rX2NhbGxiYWNrID0gTlVMTDsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0xJTktfQ0FMTEJBQ0sgKi8KKyNpZiBMV0lQX0lHTVAKKyAgbmV0aWYtPmlnbXBfbWFjX2ZpbHRlciA9IE5VTEw7CisjZW5kaWYgLyogTFdJUF9JR01QICovCisjaWYgRU5BQkxFX0xPT1BCQUNLCisgIG5ldGlmLT5sb29wX2ZpcnN0ID0gTlVMTDsKKyAgbmV0aWYtPmxvb3BfbGFzdCA9IE5VTEw7CisjZW5kaWYgLyogRU5BQkxFX0xPT1BCQUNLICovCisKKyAgLyogcmVtZW1iZXIgbmV0aWYgc3BlY2lmaWMgc3RhdGUgaW5mb3JtYXRpb24gZGF0YSAqLworICBuZXRpZi0+c3RhdGUgPSBzdGF0ZTsKKyAgbmV0aWYtPm51bSA9IG5ldGlmbnVtKys7CisgIG5ldGlmLT5pbnB1dCA9IGlucHV0OworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICBuZXRpZi0+YWRkcl9oaW50ID0gTlVMTDsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQqLworI2lmIEVOQUJMRV9MT09QQkFDSyAmJiBMV0lQX0xPT1BCQUNLX01BWF9QQlVGUworICBuZXRpZi0+bG9vcF9jbnRfY3VycmVudCA9IDA7CisjZW5kaWYgLyogRU5BQkxFX0xPT1BCQUNLICYmIExXSVBfTE9PUEJBQ0tfTUFYX1BCVUZTICovCisKKyAgbmV0aWZfc2V0X2FkZHIobmV0aWYsIGlwYWRkciwgbmV0bWFzaywgZ3cpOworCisgIC8qIGNhbGwgdXNlciBzcGVjaWZpZWQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIG5ldGlmICovCisgIGlmIChpbml0KG5ldGlmKSAhPSBFUlJfT0spIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qIGFkZCB0aGlzIG5ldGlmIHRvIHRoZSBsaXN0ICovCisgIG5ldGlmLT5uZXh0ID0gbmV0aWZfbGlzdDsKKyAgbmV0aWZfbGlzdCA9IG5ldGlmOworICBzbm1wX2luY19pZmxpc3QoKTsKKworI2lmIExXSVBfSUdNUAorICAvKiBzdGFydCBJR01QIHByb2Nlc3NpbmcgKi8KKyAgaWYgKG5ldGlmLT5mbGFncyAmIE5FVElGX0ZMQUdfSUdNUCkgeworICAgIGlnbXBfc3RhcnQobmV0aWYpOworICB9CisjZW5kaWYgLyogTFdJUF9JR01QICovCisKKyAgTFdJUF9ERUJVR0YoTkVUSUZfREVCVUcsICgibmV0aWY6IGFkZGVkIGludGVyZmFjZSAlYyVjIElQIGFkZHIgIiwKKyAgICBuZXRpZi0+bmFtZVswXSwgbmV0aWYtPm5hbWVbMV0pKTsKKyAgaXBfYWRkcl9kZWJ1Z19wcmludChORVRJRl9ERUJVRywgaXBhZGRyKTsKKyAgTFdJUF9ERUJVR0YoTkVUSUZfREVCVUcsICgiIG5ldG1hc2sgIikpOworICBpcF9hZGRyX2RlYnVnX3ByaW50KE5FVElGX0RFQlVHLCBuZXRtYXNrKTsKKyAgTFdJUF9ERUJVR0YoTkVUSUZfREVCVUcsICgiIGd3ICIpKTsKKyAgaXBfYWRkcl9kZWJ1Z19wcmludChORVRJRl9ERUJVRywgZ3cpOworICBMV0lQX0RFQlVHRihORVRJRl9ERUJVRywgKCJcbiIpKTsKKyAgcmV0dXJuIG5ldGlmOworfQorCisvKioKKyAqIENoYW5nZSBJUCBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZm9yIGEgbmV0d29yayBpbnRlcmZhY2UgKGluY2x1ZGluZyBuZXRtYXNrCisgKiBhbmQgZGVmYXVsdCBnYXRld2F5KS4KKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHRvIGNoYW5nZQorICogQHBhcmFtIGlwYWRkciB0aGUgbmV3IElQIGFkZHJlc3MKKyAqIEBwYXJhbSBuZXRtYXNrIHRoZSBuZXcgbmV0bWFzaworICogQHBhcmFtIGd3IHRoZSBuZXcgZGVmYXVsdCBnYXRld2F5CisgKi8KK3ZvaWQKK25ldGlmX3NldF9hZGRyKHN0cnVjdCBuZXRpZiAqbmV0aWYsIGlwX2FkZHJfdCAqaXBhZGRyLCBpcF9hZGRyX3QgKm5ldG1hc2ssCisgICAgaXBfYWRkcl90ICpndykKK3sKKyAgbmV0aWZfc2V0X2lwYWRkcihuZXRpZiwgaXBhZGRyKTsKKyAgbmV0aWZfc2V0X25ldG1hc2sobmV0aWYsIG5ldG1hc2spOworICBuZXRpZl9zZXRfZ3cobmV0aWYsIGd3KTsKK30KKworLyoqCisgKiBSZW1vdmUgYSBuZXR3b3JrIGludGVyZmFjZSBmcm9tIHRoZSBsaXN0IG9mIGx3SVAgbmV0aWZzLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgdG8gcmVtb3ZlCisgKi8KK3ZvaWQKK25ldGlmX3JlbW92ZShzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBpZiAobmV0aWYgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisjaWYgTFdJUF9JR01QCisgIC8qIHN0b3AgSUdNUCBwcm9jZXNzaW5nICovCisgIGlmIChuZXRpZi0+ZmxhZ3MgJiBORVRJRl9GTEFHX0lHTVApIHsKKyAgICBpZ21wX3N0b3AobmV0aWYpOworICB9CisjZW5kaWYgLyogTFdJUF9JR01QICovCisgIGlmIChuZXRpZl9pc191cChuZXRpZikpIHsKKyAgICAvKiBzZXQgbmV0aWYgZG93biBiZWZvcmUgcmVtb3ZpbmcgKGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24pICovCisgICAgbmV0aWZfc2V0X2Rvd24obmV0aWYpOworICB9CisKKyAgc25tcF9kZWxldGVfaXBhZGRyaWR4X3RyZWUobmV0aWYpOworCisgIC8qICBpcyBpdCB0aGUgZmlyc3QgbmV0aWY/ICovCisgIGlmIChuZXRpZl9saXN0ID09IG5ldGlmKSB7CisgICAgbmV0aWZfbGlzdCA9IG5ldGlmLT5uZXh0OworICB9IGVsc2UgeworICAgIC8qICBsb29rIGZvciBuZXRpZiBmdXJ0aGVyIGRvd24gdGhlIGxpc3QgKi8KKyAgICBzdHJ1Y3QgbmV0aWYgKiB0bXBOZXRpZjsKKyAgICBmb3IgKHRtcE5ldGlmID0gbmV0aWZfbGlzdDsgdG1wTmV0aWYgIT0gTlVMTDsgdG1wTmV0aWYgPSB0bXBOZXRpZi0+bmV4dCkgeworICAgICAgaWYgKHRtcE5ldGlmLT5uZXh0ID09IG5ldGlmKSB7CisgICAgICAgIHRtcE5ldGlmLT5uZXh0ID0gbmV0aWYtPm5leHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAodG1wTmV0aWYgPT0gTlVMTCkKKyAgICAgIHJldHVybjsgLyogIHdlIGRpZG4ndCBmaW5kIGFueSBuZXRpZiB0b2RheSAqLworICB9CisgIHNubXBfZGVjX2lmbGlzdCgpOworICAvKiB0aGlzIG5ldGlmIGlzIGRlZmF1bHQ/ICovCisgIGlmIChuZXRpZl9kZWZhdWx0ID09IG5ldGlmKSB7CisgICAgLyogcmVzZXQgZGVmYXVsdCBuZXRpZiAqLworICAgIG5ldGlmX3NldF9kZWZhdWx0KE5VTEwpOworICB9CisgIExXSVBfREVCVUdGKCBORVRJRl9ERUJVRywgKCJuZXRpZl9yZW1vdmU6IHJlbW92ZWQgbmV0aWZcbiIpICk7Cit9CisKKy8qKgorICogRmluZCBhIG5ldHdvcmsgaW50ZXJmYWNlIGJ5IHNlYXJjaGluZyBmb3IgaXRzIG5hbWUKKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV0aWYgKGxpa2UgbmV0aWYtPm5hbWUpIHBsdXMgY29uY2F0ZW5hdGVkIG51bWJlcgorICogaW4gYXNjaWkgcmVwcmVzZW50YXRpb24gKGUuZy4gJ2VuMCcpCisgKi8KK3N0cnVjdCBuZXRpZiAqCituZXRpZl9maW5kKGNoYXIgKm5hbWUpCit7CisgIHN0cnVjdCBuZXRpZiAqbmV0aWY7CisgIHU4X3QgbnVtOworCisgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG51bSA9IG5hbWVbMl0gLSAnMCc7CisKKyAgZm9yKG5ldGlmID0gbmV0aWZfbGlzdDsgbmV0aWYgIT0gTlVMTDsgbmV0aWYgPSBuZXRpZi0+bmV4dCkgeworICAgIGlmIChudW0gPT0gbmV0aWYtPm51bSAmJgorICAgICAgIG5hbWVbMF0gPT0gbmV0aWYtPm5hbWVbMF0gJiYKKyAgICAgICBuYW1lWzFdID09IG5ldGlmLT5uYW1lWzFdKSB7CisgICAgICBMV0lQX0RFQlVHRihORVRJRl9ERUJVRywgKCJuZXRpZl9maW5kOiBmb3VuZCAlYyVjXG4iLCBuYW1lWzBdLCBuYW1lWzFdKSk7CisgICAgICByZXR1cm4gbmV0aWY7CisgICAgfQorICB9CisgIExXSVBfREVCVUdGKE5FVElGX0RFQlVHLCAoIm5ldGlmX2ZpbmQ6IGRpZG4ndCBmaW5kICVjJWNcbiIsIG5hbWVbMF0sIG5hbWVbMV0pKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBJUCBhZGRyZXNzIG9mIGEgbmV0d29yayBpbnRlcmZhY2UKKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHRvIGNoYW5nZQorICogQHBhcmFtIGlwYWRkciB0aGUgbmV3IElQIGFkZHJlc3MKKyAqCisgKiBAbm90ZSBjYWxsIG5ldGlmX3NldF9hZGRyKCkgaWYgeW91IGFsc28gd2FudCB0byBjaGFuZ2UgbmV0bWFzayBhbmQKKyAqIGRlZmF1bHQgZ2F0ZXdheQorICovCit2b2lkCituZXRpZl9zZXRfaXBhZGRyKHN0cnVjdCBuZXRpZiAqbmV0aWYsIGlwX2FkZHJfdCAqaXBhZGRyKQoreworICAvKiBUT0RPOiBIYW5kbGluZyBvZiBvYnNvbGV0ZSBwY2JzICovCisgIC8qIFNlZTogIGh0dHA6Ly9tYWlsLmdudS5vcmcvYXJjaGl2ZS9odG1sL2x3aXAtdXNlcnMvMjAwMy0wMy9tc2cwMDExOC5odG1sICovCisjaWYgTFdJUF9UQ1AKKyAgc3RydWN0IHRjcF9wY2IgKnBjYjsKKyAgc3RydWN0IHRjcF9wY2JfbGlzdGVuICpscGNiOworCisgIC8qIGFkZHJlc3MgaXMgYWN0dWFsbHkgYmVpbmcgY2hhbmdlZD8gKi8KKyAgaWYgKChpcF9hZGRyX2NtcChpcGFkZHIsICYobmV0aWYtPmlwX2FkZHIpKSkgPT0gMCkgeworICAgIC8qIGV4dGVybiBzdHJ1Y3QgdGNwX3BjYiAqdGNwX2FjdGl2ZV9wY2JzOyBkZWZpbmVkIGJ5IHRjcC5oICovCisgICAgTFdJUF9ERUJVR0YoTkVUSUZfREVCVUcgfCBMV0lQX0RCR19TVEFURSwgKCJuZXRpZl9zZXRfaXBhZGRyOiBuZXRpZiBhZGRyZXNzIGJlaW5nIGNoYW5nZWRcbiIpKTsKKyAgICBwY2IgPSB0Y3BfYWN0aXZlX3BjYnM7CisgICAgd2hpbGUgKHBjYiAhPSBOVUxMKSB7CisgICAgICAvKiBQQ0IgYm91bmQgdG8gY3VycmVudCBsb2NhbCBpbnRlcmZhY2UgYWRkcmVzcz8gKi8KKyAgICAgIGlmIChpcF9hZGRyX2NtcCgmKHBjYi0+bG9jYWxfaXApLCAmKG5ldGlmLT5pcF9hZGRyKSkKKyNpZiBMV0lQX0FVVE9JUAorICAgICAgICAvKiBjb25uZWN0aW9ucyB0byBsaW5rLWxvY2FsIGFkZHJlc3NlcyBtdXN0IHBlcnNpc3QgKFJGQzM5MjcgY2guIDEuOSkgKi8KKyAgICAgICAgJiYgIWlwX2FkZHJfaXNsaW5rbG9jYWwoJihwY2ItPmxvY2FsX2lwKSkKKyNlbmRpZiAvKiBMV0lQX0FVVE9JUCAqLworICAgICAgICApIHsKKyAgICAgICAgLyogdGhpcyBjb25uZWN0aW9uIG11c3QgYmUgYWJvcnRlZCAqLworICAgICAgICBzdHJ1Y3QgdGNwX3BjYiAqbmV4dCA9IHBjYi0+bmV4dDsKKyAgICAgICAgTFdJUF9ERUJVR0YoTkVUSUZfREVCVUcgfCBMV0lQX0RCR19TVEFURSwgKCJuZXRpZl9zZXRfaXBhZGRyOiBhYm9ydGluZyBUQ1AgcGNiICVwXG4iLCAodm9pZCAqKXBjYikpOworICAgICAgICB0Y3BfYWJvcnQocGNiKTsKKyAgICAgICAgcGNiID0gbmV4dDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBjYiA9IHBjYi0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChscGNiID0gdGNwX2xpc3Rlbl9wY2JzLmxpc3Rlbl9wY2JzOyBscGNiICE9IE5VTEw7IGxwY2IgPSBscGNiLT5uZXh0KSB7CisgICAgICAvKiBQQ0IgYm91bmQgdG8gY3VycmVudCBsb2NhbCBpbnRlcmZhY2UgYWRkcmVzcz8gKi8KKyAgICAgIGlmICgoIShpcF9hZGRyX2lzYW55KCYobHBjYi0+bG9jYWxfaXApKSkpICYmCisgICAgICAgICAgKGlwX2FkZHJfY21wKCYobHBjYi0+bG9jYWxfaXApLCAmKG5ldGlmLT5pcF9hZGRyKSkpKSB7CisgICAgICAgIC8qIFRoZSBQQ0IgaXMgbGlzdGVuaW5nIHRvIHRoZSBvbGQgaXBhZGRyIGFuZAorICAgICAgICAgKiBpcyBzZXQgdG8gbGlzdGVuIHRvIHRoZSBuZXcgb25lIGluc3RlYWQgKi8KKyAgICAgICAgaXBfYWRkcl9zZXQoJihscGNiLT5sb2NhbF9pcCksIGlwYWRkcik7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgc25tcF9kZWxldGVfaXBhZGRyaWR4X3RyZWUobmV0aWYpOworICBzbm1wX2RlbGV0ZV9pcHJ0ZWlkeF90cmVlKDAsbmV0aWYpOworICAvKiBzZXQgbmV3IElQIGFkZHJlc3MgdG8gbmV0aWYgKi8KKyAgaXBfYWRkcl9zZXQoJihuZXRpZi0+aXBfYWRkciksIGlwYWRkcik7CisgIHNubXBfaW5zZXJ0X2lwYWRkcmlkeF90cmVlKG5ldGlmKTsKKyAgc25tcF9pbnNlcnRfaXBydGVpZHhfdHJlZSgwLG5ldGlmKTsKKworICBMV0lQX0RFQlVHRihORVRJRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsICgibmV0aWY6IElQIGFkZHJlc3Mgb2YgaW50ZXJmYWNlICVjJWMgc2V0IHRvICUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiXG4iLAorICAgIG5ldGlmLT5uYW1lWzBdLCBuZXRpZi0+bmFtZVsxXSwKKyAgICBpcDRfYWRkcjFfMTYoJm5ldGlmLT5pcF9hZGRyKSwKKyAgICBpcDRfYWRkcjJfMTYoJm5ldGlmLT5pcF9hZGRyKSwKKyAgICBpcDRfYWRkcjNfMTYoJm5ldGlmLT5pcF9hZGRyKSwKKyAgICBpcDRfYWRkcjRfMTYoJm5ldGlmLT5pcF9hZGRyKSkpOworfQorCisvKioKKyAqIENoYW5nZSB0aGUgZGVmYXVsdCBnYXRld2F5IGZvciBhIG5ldHdvcmsgaW50ZXJmYWNlCisgKgorICogQHBhcmFtIG5ldGlmIHRoZSBuZXR3b3JrIGludGVyZmFjZSB0byBjaGFuZ2UKKyAqIEBwYXJhbSBndyB0aGUgbmV3IGRlZmF1bHQgZ2F0ZXdheQorICoKKyAqIEBub3RlIGNhbGwgbmV0aWZfc2V0X2FkZHIoKSBpZiB5b3UgYWxzbyB3YW50IHRvIGNoYW5nZSBpcCBhZGRyZXNzIGFuZCBuZXRtYXNrCisgKi8KK3ZvaWQKK25ldGlmX3NldF9ndyhzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKmd3KQoreworICBpcF9hZGRyX3NldCgmKG5ldGlmLT5ndyksIGd3KTsKKyAgTFdJUF9ERUJVR0YoTkVUSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX1NUQVRFLCAoIm5ldGlmOiBHVyBhZGRyZXNzIG9mIGludGVyZmFjZSAlYyVjIHNldCB0byAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICBuZXRpZi0+bmFtZVswXSwgbmV0aWYtPm5hbWVbMV0sCisgICAgaXA0X2FkZHIxXzE2KCZuZXRpZi0+Z3cpLAorICAgIGlwNF9hZGRyMl8xNigmbmV0aWYtPmd3KSwKKyAgICBpcDRfYWRkcjNfMTYoJm5ldGlmLT5ndyksCisgICAgaXA0X2FkZHI0XzE2KCZuZXRpZi0+Z3cpKSk7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBuZXRtYXNrIG9mIGEgbmV0d29yayBpbnRlcmZhY2UKKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHRvIGNoYW5nZQorICogQHBhcmFtIG5ldG1hc2sgdGhlIG5ldyBuZXRtYXNrCisgKgorICogQG5vdGUgY2FsbCBuZXRpZl9zZXRfYWRkcigpIGlmIHlvdSBhbHNvIHdhbnQgdG8gY2hhbmdlIGlwIGFkZHJlc3MgYW5kCisgKiBkZWZhdWx0IGdhdGV3YXkKKyAqLwordm9pZAorbmV0aWZfc2V0X25ldG1hc2soc3RydWN0IG5ldGlmICpuZXRpZiwgaXBfYWRkcl90ICpuZXRtYXNrKQoreworICBzbm1wX2RlbGV0ZV9pcHJ0ZWlkeF90cmVlKDAsIG5ldGlmKTsKKyAgLyogc2V0IG5ldyBuZXRtYXNrIHRvIG5ldGlmICovCisgIGlwX2FkZHJfc2V0KCYobmV0aWYtPm5ldG1hc2spLCBuZXRtYXNrKTsKKyAgc25tcF9pbnNlcnRfaXBydGVpZHhfdHJlZSgwLCBuZXRpZik7CisgIExXSVBfREVCVUdGKE5FVElGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwgKCJuZXRpZjogbmV0bWFzayBvZiBpbnRlcmZhY2UgJWMlYyBzZXQgdG8gJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiJcbiIsCisgICAgbmV0aWYtPm5hbWVbMF0sIG5ldGlmLT5uYW1lWzFdLAorICAgIGlwNF9hZGRyMV8xNigmbmV0aWYtPm5ldG1hc2spLAorICAgIGlwNF9hZGRyMl8xNigmbmV0aWYtPm5ldG1hc2spLAorICAgIGlwNF9hZGRyM18xNigmbmV0aWYtPm5ldG1hc2spLAorICAgIGlwNF9hZGRyNF8xNigmbmV0aWYtPm5ldG1hc2spKSk7Cit9CisKKy8qKgorICogU2V0IGEgbmV0d29yayBpbnRlcmZhY2UgYXMgdGhlIGRlZmF1bHQgbmV0d29yayBpbnRlcmZhY2UKKyAqICh1c2VkIHRvIG91dHB1dCBhbGwgcGFja2V0cyBmb3Igd2hpY2ggbm8gc3BlY2lmaWMgcm91dGUgaXMgZm91bmQpCisgKgorICogQHBhcmFtIG5ldGlmIHRoZSBkZWZhdWx0IG5ldHdvcmsgaW50ZXJmYWNlCisgKi8KK3ZvaWQKK25ldGlmX3NldF9kZWZhdWx0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIGlmIChuZXRpZiA9PSBOVUxMKSB7CisgICAgLyogcmVtb3ZlIGRlZmF1bHQgcm91dGUgKi8KKyAgICBzbm1wX2RlbGV0ZV9pcHJ0ZWlkeF90cmVlKDEsIG5ldGlmKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBpbnN0YWxsIGRlZmF1bHQgcm91dGUgKi8KKyAgICBzbm1wX2luc2VydF9pcHJ0ZWlkeF90cmVlKDEsIG5ldGlmKTsKKyAgfQorICBuZXRpZl9kZWZhdWx0ID0gbmV0aWY7CisgIExXSVBfREVCVUdGKE5FVElGX0RFQlVHLCAoIm5ldGlmOiBzZXR0aW5nIGRlZmF1bHQgaW50ZXJmYWNlICVjJWNcbiIsCisgICAgICAgICAgIG5ldGlmID8gbmV0aWYtPm5hbWVbMF0gOiAnXCcnLCBuZXRpZiA/IG5ldGlmLT5uYW1lWzFdIDogJ1wnJykpOworfQorCisvKioKKyAqIEJyaW5nIGFuIGludGVyZmFjZSB1cCwgYXZhaWxhYmxlIGZvciBwcm9jZXNzaW5nCisgKiB0cmFmZmljLgorICogCisgKiBAbm90ZTogRW5hYmxpbmcgREhDUCBvbiBhIGRvd24gaW50ZXJmYWNlIHdpbGwgbWFrZSBpdCBjb21lCisgKiB1cCBvbmNlIGNvbmZpZ3VyZWQuCisgKiAKKyAqIEBzZWUgZGhjcF9zdGFydCgpCisgKi8gCit2b2lkIG5ldGlmX3NldF91cChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBpZiAoIShuZXRpZi0+ZmxhZ3MgJiBORVRJRl9GTEFHX1VQKSkgeworICAgIG5ldGlmLT5mbGFncyB8PSBORVRJRl9GTEFHX1VQOworICAgIAorI2lmIExXSVBfU05NUAorICAgIHNubXBfZ2V0X3N5c3VwdGltZSgmbmV0aWYtPnRzKTsKKyNlbmRpZiAvKiBMV0lQX1NOTVAgKi8KKworICAgIE5FVElGX1NUQVRVU19DQUxMQkFDSyhuZXRpZik7CisKKyAgICBpZiAobmV0aWYtPmZsYWdzICYgTkVUSUZfRkxBR19MSU5LX1VQKSB7CisjaWYgTFdJUF9BUlAKKyAgICAgIC8qIEZvciBFdGhlcm5ldCBuZXR3b3JrIGludGVyZmFjZXMsIHdlIHdvdWxkIGxpa2UgdG8gc2VuZCBhICJncmF0dWl0b3VzIEFSUCIgKi8gCisgICAgICBpZiAobmV0aWYtPmZsYWdzICYgKE5FVElGX0ZMQUdfRVRIQVJQKSkgeworICAgICAgICBldGhhcnBfZ3JhdHVpdG91cyhuZXRpZik7CisgICAgICB9CisjZW5kaWYgLyogTFdJUF9BUlAgKi8KKworI2lmIExXSVBfSUdNUAorICAgICAgLyogcmVzZW5kIElHTVAgbWVtYmVyc2hpcHMgKi8KKyAgICAgIGlmIChuZXRpZi0+ZmxhZ3MgJiBORVRJRl9GTEFHX0lHTVApIHsKKyAgICAgICAgaWdtcF9yZXBvcnRfZ3JvdXBzKCBuZXRpZik7CisgICAgICB9CisjZW5kaWYgLyogTFdJUF9JR01QICovCisgICAgfQorICB9Cit9CisKKy8qKgorICogQnJpbmcgYW4gaW50ZXJmYWNlIGRvd24sIGRpc2FibGluZyBhbnkgdHJhZmZpYyBwcm9jZXNzaW5nLgorICoKKyAqIEBub3RlOiBFbmFibGluZyBESENQIG9uIGEgZG93biBpbnRlcmZhY2Ugd2lsbCBtYWtlIGl0IGNvbWUKKyAqIHVwIG9uY2UgY29uZmlndXJlZC4KKyAqIAorICogQHNlZSBkaGNwX3N0YXJ0KCkKKyAqLyAKK3ZvaWQgbmV0aWZfc2V0X2Rvd24oc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgaWYgKG5ldGlmLT5mbGFncyAmIE5FVElGX0ZMQUdfVVApIHsKKyAgICBuZXRpZi0+ZmxhZ3MgJj0gfk5FVElGX0ZMQUdfVVA7CisjaWYgTFdJUF9TTk1QCisgICAgc25tcF9nZXRfc3lzdXB0aW1lKCZuZXRpZi0+dHMpOworI2VuZGlmCisKKyAgICBORVRJRl9TVEFUVVNfQ0FMTEJBQ0sobmV0aWYpOworICB9Cit9CisKKyNpZiBMV0lQX05FVElGX1NUQVRVU19DQUxMQkFDSworLyoqCisgKiBTZXQgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gaW50ZXJmYWNlIGlzIGJyb3VnaHQgdXAvZG93bgorICovCit2b2lkIG5ldGlmX3NldF9zdGF0dXNfY2FsbGJhY2soc3RydWN0IG5ldGlmICpuZXRpZiwgbmV0aWZfc3RhdHVzX2NhbGxiYWNrX2ZuIHN0YXR1c19jYWxsYmFjaykKK3sKKyAgaWYgKG5ldGlmKSB7CisgICAgbmV0aWYtPnN0YXR1c19jYWxsYmFjayA9IHN0YXR1c19jYWxsYmFjazsKKyAgfQorfQorI2VuZGlmIC8qIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLICovCisKKy8qKgorICogQ2FsbGVkIGJ5IGEgZHJpdmVyIHdoZW4gaXRzIGxpbmsgZ29lcyB1cAorICovCit2b2lkIG5ldGlmX3NldF9saW5rX3VwKHN0cnVjdCBuZXRpZiAqbmV0aWYgKQoreworICBpZiAoIShuZXRpZi0+ZmxhZ3MgJiBORVRJRl9GTEFHX0xJTktfVVApKSB7CisgICAgbmV0aWYtPmZsYWdzIHw9IE5FVElGX0ZMQUdfTElOS19VUDsKKworI2lmIExXSVBfREhDUAorICAgIGlmIChuZXRpZi0+ZGhjcCkgeworICAgICAgZGhjcF9uZXR3b3JrX2NoYW5nZWQobmV0aWYpOworICAgIH0KKyNlbmRpZiAvKiBMV0lQX0RIQ1AgKi8KKworI2lmIExXSVBfQVVUT0lQCisgICAgaWYgKG5ldGlmLT5hdXRvaXApIHsKKyAgICAgIGF1dG9pcF9uZXR3b3JrX2NoYW5nZWQobmV0aWYpOworICAgIH0KKyNlbmRpZiAvKiBMV0lQX0FVVE9JUCAqLworCisgICAgaWYgKG5ldGlmLT5mbGFncyAmIE5FVElGX0ZMQUdfVVApIHsKKyNpZiBMV0lQX0FSUAorICAgICAgLyogRm9yIEV0aGVybmV0IG5ldHdvcmsgaW50ZXJmYWNlcywgd2Ugd291bGQgbGlrZSB0byBzZW5kIGEgImdyYXR1aXRvdXMgQVJQIiAqLyAKKyAgICAgIGlmIChuZXRpZi0+ZmxhZ3MgJiBORVRJRl9GTEFHX0VUSEFSUCkgeworICAgICAgICBldGhhcnBfZ3JhdHVpdG91cyhuZXRpZik7CisgICAgICB9CisjZW5kaWYgLyogTFdJUF9BUlAgKi8KKworI2lmIExXSVBfSUdNUAorICAgICAgLyogcmVzZW5kIElHTVAgbWVtYmVyc2hpcHMgKi8KKyAgICAgIGlmIChuZXRpZi0+ZmxhZ3MgJiBORVRJRl9GTEFHX0lHTVApIHsKKyAgICAgICAgaWdtcF9yZXBvcnRfZ3JvdXBzKCBuZXRpZik7CisgICAgICB9CisjZW5kaWYgLyogTFdJUF9JR01QICovCisgICAgfQorICAgIE5FVElGX0xJTktfQ0FMTEJBQ0sobmV0aWYpOworICB9Cit9CisKKy8qKgorICogQ2FsbGVkIGJ5IGEgZHJpdmVyIHdoZW4gaXRzIGxpbmsgZ29lcyBkb3duCisgKi8KK3ZvaWQgbmV0aWZfc2V0X2xpbmtfZG93bihzdHJ1Y3QgbmV0aWYgKm5ldGlmICkKK3sKKyAgaWYgKG5ldGlmLT5mbGFncyAmIE5FVElGX0ZMQUdfTElOS19VUCkgeworICAgIG5ldGlmLT5mbGFncyAmPSB+TkVUSUZfRkxBR19MSU5LX1VQOworICAgIE5FVElGX0xJTktfQ0FMTEJBQ0sobmV0aWYpOworICB9Cit9CisKKyNpZiBMV0lQX05FVElGX0xJTktfQ0FMTEJBQ0sKKy8qKgorICogU2V0IGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGxpbmsgaXMgYnJvdWdodCB1cC9kb3duCisgKi8KK3ZvaWQgbmV0aWZfc2V0X2xpbmtfY2FsbGJhY2soc3RydWN0IG5ldGlmICpuZXRpZiwgbmV0aWZfc3RhdHVzX2NhbGxiYWNrX2ZuIGxpbmtfY2FsbGJhY2spCit7CisgIGlmIChuZXRpZikgeworICAgIG5ldGlmLT5saW5rX2NhbGxiYWNrID0gbGlua19jYWxsYmFjazsKKyAgfQorfQorI2VuZGlmIC8qIExXSVBfTkVUSUZfTElOS19DQUxMQkFDSyAqLworCisjaWYgRU5BQkxFX0xPT1BCQUNLCisvKioKKyAqIFNlbmQgYW4gSVAgcGFja2V0IHRvIGJlIHJlY2VpdmVkIG9uIHRoZSBzYW1lIG5ldGlmIChsb29waWYtbGlrZSkuCisgKiBUaGUgcGJ1ZiBpcyBzaW1wbHkgY29waWVkIGFuZCBoYW5kZWQgYmFjayB0byBuZXRpZi0+aW5wdXQuCisgKiBJbiBtdWx0aXRocmVhZGVkIG1vZGUsIHRoaXMgaXMgZG9uZSBkaXJlY3RseSBzaW5jZSBuZXRpZi0+aW5wdXQgbXVzdCBwdXQKKyAqIHRoZSBwYWNrZXQgb24gYSBxdWV1ZS4KKyAqIEluIGNhbGxiYWNrIG1vZGUsIHRoZSBwYWNrZXQgaXMgcHV0IG9uIGFuIGludGVybmFsIHF1ZXVlIGFuZCBpcyBmZWQgdG8KKyAqIG5ldGlmLT5pbnB1dCBieSBuZXRpZl9wb2xsKCkuCisgKgorICogQHBhcmFtIG5ldGlmIHRoZSBsd2lwIG5ldHdvcmsgaW50ZXJmYWNlIHN0cnVjdHVyZQorICogQHBhcmFtIHAgdGhlIChJUCkgcGFja2V0IHRvICdzZW5kJworICogQHBhcmFtIGlwYWRkciB0aGUgaXAgYWRkcmVzcyB0byBzZW5kIHRoZSBwYWNrZXQgdG8gKG5vdCB1c2VkKQorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIHBhY2tldCBoYXMgYmVlbiBzZW50CisgKiAgICAgICAgIEVSUl9NRU0gaWYgdGhlIHBidWYgdXNlZCB0byBjb3B5IHRoZSBwYWNrZXQgY291bGRuJ3QgYmUgYWxsb2NhdGVkCisgKi8KK2Vycl90CituZXRpZl9sb29wX291dHB1dChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBzdHJ1Y3QgcGJ1ZiAqcCwKKyAgICAgICBpcF9hZGRyX3QgKmlwYWRkcikKK3sKKyAgc3RydWN0IHBidWYgKnI7CisgIGVycl90IGVycjsKKyAgc3RydWN0IHBidWYgKmxhc3Q7CisjaWYgTFdJUF9MT09QQkFDS19NQVhfUEJVRlMKKyAgdThfdCBjbGVuID0gMDsKKyNlbmRpZiAvKiBMV0lQX0xPT1BCQUNLX01BWF9QQlVGUyAqLworICAvKiBJZiB3ZSBoYXZlIGEgbG9vcGlmLCBTTk1QIGNvdW50ZXJzIGFyZSBhZGp1c3RlZCBmb3IgaXQsCisgICAqIGlmIG5vdCB0aGV5IGFyZSBhZGp1c3RlZCBmb3IgJ25ldGlmJy4gKi8KKyNpZiBMV0lQX1NOTVAKKyNpZiBMV0lQX0hBVkVfTE9PUElGCisgIHN0cnVjdCBuZXRpZiAqc3RhdHNfaWYgPSAmbG9vcF9uZXRpZjsKKyNlbHNlIC8qIExXSVBfSEFWRV9MT09QSUYgKi8KKyAgc3RydWN0IG5ldGlmICpzdGF0c19pZiA9IG5ldGlmOworI2VuZGlmIC8qIExXSVBfSEFWRV9MT09QSUYgKi8KKyNlbmRpZiAvKiBMV0lQX1NOTVAgKi8KKyAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldik7CisgIExXSVBfVU5VU0VEX0FSRyhpcGFkZHIpOworCisgIC8qIEFsbG9jYXRlIGEgbmV3IHBidWYgKi8KKyAgciA9IHBidWZfYWxsb2MoUEJVRl9MSU5LLCBwLT50b3RfbGVuLCBQQlVGX1JBTSk7CisgIGlmIChyID09IE5VTEwpIHsKKyAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLm1lbWVycik7CisgICAgTElOS19TVEFUU19JTkMobGluay5kcm9wKTsKKyAgICBzbm1wX2luY19pZm91dGRpc2NhcmRzKHN0YXRzX2lmKTsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorI2lmIExXSVBfTE9PUEJBQ0tfTUFYX1BCVUZTCisgIGNsZW4gPSBwYnVmX2NsZW4ocik7CisgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyBvciB0b28gbWFueSBwYnVmIG9uIHF1ZXVlICovCisgIGlmKCgobmV0aWYtPmxvb3BfY250X2N1cnJlbnQgKyBjbGVuKSA8IG5ldGlmLT5sb29wX2NudF9jdXJyZW50KSB8fAorICAgICAoKG5ldGlmLT5sb29wX2NudF9jdXJyZW50ICsgY2xlbikgPiBMV0lQX0xPT1BCQUNLX01BWF9QQlVGUykpIHsKKyAgICBwYnVmX2ZyZWUocik7CisgICAgTElOS19TVEFUU19JTkMobGluay5tZW1lcnIpOworICAgIExJTktfU1RBVFNfSU5DKGxpbmsuZHJvcCk7CisgICAgc25tcF9pbmNfaWZvdXRkaXNjYXJkcyhzdGF0c19pZik7CisgICAgcmV0dXJuIEVSUl9NRU07CisgIH0KKyAgbmV0aWYtPmxvb3BfY250X2N1cnJlbnQgKz0gY2xlbjsKKyNlbmRpZiAvKiBMV0lQX0xPT1BCQUNLX01BWF9QQlVGUyAqLworCisgIC8qIENvcHkgdGhlIHdob2xlIHBidWYgcXVldWUgcCBpbnRvIHRoZSBzaW5nbGUgcGJ1ZiByICovCisgIGlmICgoZXJyID0gcGJ1Zl9jb3B5KHIsIHApKSAhPSBFUlJfT0spIHsKKyAgICBwYnVmX2ZyZWUocik7CisgICAgTElOS19TVEFUU19JTkMobGluay5tZW1lcnIpOworICAgIExJTktfU1RBVFNfSU5DKGxpbmsuZHJvcCk7CisgICAgc25tcF9pbmNfaWZvdXRkaXNjYXJkcyhzdGF0c19pZik7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8qIFB1dCB0aGUgcGFja2V0IG9uIGEgbGlua2VkIGxpc3Qgd2hpY2ggZ2V0cyBlbXB0aWVkIHRocm91Z2ggY2FsbGluZworICAgICBuZXRpZl9wb2xsKCkuICovCisKKyAgLyogbGV0IGxhc3QgcG9pbnQgdG8gdGhlIGxhc3QgcGJ1ZiBpbiBjaGFpbiByICovCisgIGZvciAobGFzdCA9IHI7IGxhc3QtPm5leHQgIT0gTlVMTDsgbGFzdCA9IGxhc3QtPm5leHQpOworCisgIFNZU19BUkNIX1BST1RFQ1QobGV2KTsKKyAgaWYobmV0aWYtPmxvb3BfZmlyc3QgIT0gTlVMTCkgeworICAgIExXSVBfQVNTRVJUKCJpZiBmaXJzdCAhPSBOVUxMLCBsYXN0IG11c3QgYWxzbyBiZSAhPSBOVUxMIiwgbmV0aWYtPmxvb3BfbGFzdCAhPSBOVUxMKTsKKyAgICBuZXRpZi0+bG9vcF9sYXN0LT5uZXh0ID0gcjsKKyAgICBuZXRpZi0+bG9vcF9sYXN0ID0gbGFzdDsKKyAgfSBlbHNlIHsKKyAgICBuZXRpZi0+bG9vcF9maXJzdCA9IHI7CisgICAgbmV0aWYtPmxvb3BfbGFzdCA9IGxhc3Q7CisgIH0KKyAgU1lTX0FSQ0hfVU5QUk9URUNUKGxldik7CisKKyAgTElOS19TVEFUU19JTkMobGluay54bWl0KTsKKyAgc25tcF9hZGRfaWZvdXRvY3RldHMoc3RhdHNfaWYsIHAtPnRvdF9sZW4pOworICBzbm1wX2luY19pZm91dHVjYXN0cGt0cyhzdGF0c19pZik7CisKKyNpZiBMV0lQX05FVElGX0xPT1BCQUNLX01VTFRJVEhSRUFESU5HCisgIC8qIEZvciBtdWx0aXRocmVhZGluZyBlbnZpcm9ubWVudCwgc2NoZWR1bGUgYSBjYWxsIHRvIG5ldGlmX3BvbGwgKi8KKyAgdGNwaXBfY2FsbGJhY2soKHRjcGlwX2NhbGxiYWNrX2ZuKW5ldGlmX3BvbGwsIG5ldGlmKTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0xPT1BCQUNLX01VTFRJVEhSRUFESU5HICovCisKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBDYWxsIG5ldGlmX3BvbGwoKSBpbiB0aGUgbWFpbiBsb29wIG9mIHlvdXIgYXBwbGljYXRpb24uIFRoaXMgaXMgdG8gcHJldmVudAorICogcmVlbnRlcmluZyBub24tcmVlbnRyYW50IGZ1bmN0aW9ucyBsaWtlIHRjcF9pbnB1dCgpLiBQYWNrZXRzIHBhc3NlZCB0bworICogbmV0aWZfbG9vcF9vdXRwdXQoKSBhcmUgcHV0IG9uIGEgbGlzdCB0aGF0IGlzIHBhc3NlZCB0byBuZXRpZi0+aW5wdXQoKSBieQorICogbmV0aWZfcG9sbCgpLgorICovCit2b2lkCituZXRpZl9wb2xsKHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBwYnVmICppbjsKKyAgLyogSWYgd2UgaGF2ZSBhIGxvb3BpZiwgU05NUCBjb3VudGVycyBhcmUgYWRqdXN0ZWQgZm9yIGl0LAorICAgKiBpZiBub3QgdGhleSBhcmUgYWRqdXN0ZWQgZm9yICduZXRpZicuICovCisjaWYgTFdJUF9TTk1QCisjaWYgTFdJUF9IQVZFX0xPT1BJRgorICBzdHJ1Y3QgbmV0aWYgKnN0YXRzX2lmID0gJmxvb3BfbmV0aWY7CisjZWxzZSAvKiBMV0lQX0hBVkVfTE9PUElGICovCisgIHN0cnVjdCBuZXRpZiAqc3RhdHNfaWYgPSBuZXRpZjsKKyNlbmRpZiAvKiBMV0lQX0hBVkVfTE9PUElGICovCisjZW5kaWYgLyogTFdJUF9TTk1QICovCisgIFNZU19BUkNIX0RFQ0xfUFJPVEVDVChsZXYpOworCisgIGRvIHsKKyAgICAvKiBHZXQgYSBwYWNrZXQgZnJvbSB0aGUgbGlzdC4gV2l0aCBTWVNfTElHSFRXRUlHSFRfUFJPVD0xLCB0aGlzIGlzIHByb3RlY3RlZCAqLworICAgIFNZU19BUkNIX1BST1RFQ1QobGV2KTsKKyAgICBpbiA9IG5ldGlmLT5sb29wX2ZpcnN0OworICAgIGlmIChpbiAhPSBOVUxMKSB7CisgICAgICBzdHJ1Y3QgcGJ1ZiAqaW5fZW5kID0gaW47CisjaWYgTFdJUF9MT09QQkFDS19NQVhfUEJVRlMKKyAgICAgIHU4X3QgY2xlbiA9IHBidWZfY2xlbihpbik7CisgICAgICAvKiBhZGp1c3QgdGhlIG51bWJlciBvZiBwYnVmcyBvbiBxdWV1ZSAqLworICAgICAgTFdJUF9BU1NFUlQoIm5ldGlmLT5sb29wX2NudF9jdXJyZW50IHVuZGVyZmxvdyIsCisgICAgICAgICgobmV0aWYtPmxvb3BfY250X2N1cnJlbnQgLSBjbGVuKSA8IG5ldGlmLT5sb29wX2NudF9jdXJyZW50KSk7CisgICAgICBuZXRpZi0+bG9vcF9jbnRfY3VycmVudCAtPSBjbGVuOworI2VuZGlmIC8qIExXSVBfTE9PUEJBQ0tfTUFYX1BCVUZTICovCisgICAgICB3aGlsZSAoaW5fZW5kLT5sZW4gIT0gaW5fZW5kLT50b3RfbGVuKSB7CisgICAgICAgIExXSVBfQVNTRVJUKCJib2d1cyBwYnVmOiBsZW4gIT0gdG90X2xlbiBidXQgbmV4dCA9PSBOVUxMISIsIGluX2VuZC0+bmV4dCAhPSBOVUxMKTsKKyAgICAgICAgaW5fZW5kID0gaW5fZW5kLT5uZXh0OworICAgICAgfQorICAgICAgLyogJ2luX2VuZCcgbm93IHBvaW50cyB0byB0aGUgbGFzdCBwYnVmIGZyb20gJ2luJyAqLworICAgICAgaWYgKGluX2VuZCA9PSBuZXRpZi0+bG9vcF9sYXN0KSB7CisgICAgICAgIC8qIHRoaXMgd2FzIHRoZSBsYXN0IHBidWYgaW4gdGhlIGxpc3QgKi8KKyAgICAgICAgbmV0aWYtPmxvb3BfZmlyc3QgPSBuZXRpZi0+bG9vcF9sYXN0ID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHBvcCB0aGUgcGJ1ZiBvZmYgdGhlIGxpc3QgKi8KKyAgICAgICAgbmV0aWYtPmxvb3BfZmlyc3QgPSBpbl9lbmQtPm5leHQ7CisgICAgICAgIExXSVBfQVNTRVJUKCJzaG91bGQgbm90IGJlIG51bGwgc2luY2UgZmlyc3QgIT0gbGFzdCEiLCBuZXRpZi0+bG9vcF9maXJzdCAhPSBOVUxMKTsKKyAgICAgIH0KKyAgICAgIC8qIERlLXF1ZXVlIHRoZSBwYnVmIGZyb20gaXRzIHN1Y2Nlc3NvcnMgb24gdGhlICdsb29wXycgbGlzdC4gKi8KKyAgICAgIGluX2VuZC0+bmV4dCA9IE5VTEw7CisgICAgfQorICAgIFNZU19BUkNIX1VOUFJPVEVDVChsZXYpOworCisgICAgaWYgKGluICE9IE5VTEwpIHsKKyAgICAgIExJTktfU1RBVFNfSU5DKGxpbmsucmVjdik7CisgICAgICBzbm1wX2FkZF9pZmlub2N0ZXRzKHN0YXRzX2lmLCBpbi0+dG90X2xlbik7CisgICAgICBzbm1wX2luY19pZmludWNhc3Rwa3RzKHN0YXRzX2lmKTsKKyAgICAgIC8qIGxvb3BiYWNrIHBhY2tldHMgYXJlIGFsd2F5cyBJUCBwYWNrZXRzISAqLworICAgICAgaWYgKGlwX2lucHV0KGluLCBuZXRpZikgIT0gRVJSX09LKSB7CisgICAgICAgIHBidWZfZnJlZShpbik7CisgICAgICB9CisgICAgICAvKiBEb24ndCByZWZlcmVuY2UgdGhlIHBhY2tldCBhbnkgbW9yZSEgKi8KKyAgICAgIGluID0gTlVMTDsKKyAgICB9CisgIC8qIGdvIG9uIHdoaWxlIHRoZXJlIGlzIGEgcGFja2V0IG9uIHRoZSBsaXN0ICovCisgIH0gd2hpbGUgKG5ldGlmLT5sb29wX2ZpcnN0ICE9IE5VTEwpOworfQorCisjaWYgIUxXSVBfTkVUSUZfTE9PUEJBQ0tfTVVMVElUSFJFQURJTkcKKy8qKgorICogQ2FsbHMgbmV0aWZfcG9sbCgpIGZvciBldmVyeSBuZXRpZiBvbiB0aGUgbmV0aWZfbGlzdC4KKyAqLwordm9pZAorbmV0aWZfcG9sbF9hbGwodm9pZCkKK3sKKyAgc3RydWN0IG5ldGlmICpuZXRpZiA9IG5ldGlmX2xpc3Q7CisgIC8qIGxvb3AgdGhyb3VnaCBuZXRpZnMgKi8KKyAgd2hpbGUgKG5ldGlmICE9IE5VTEwpIHsKKyAgICBuZXRpZl9wb2xsKG5ldGlmKTsKKyAgICAvKiBwcm9jZWVkIHRvIG5leHQgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICBuZXRpZiA9IG5ldGlmLT5uZXh0OworICB9Cit9CisjZW5kaWYgLyogIUxXSVBfTkVUSUZfTE9PUEJBQ0tfTVVMVElUSFJFQURJTkcgKi8KKyNlbmRpZiAvKiBFTkFCTEVfTE9PUEJBQ0sgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS9wYnVmLmMgYi9jb3JlL2x3aXAvc3JjL2NvcmUvcGJ1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOWZmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvcGJ1Zi5jCkBAIC0wLDAgKzEsMTE1NiBAQAorLyoqCisgKiBAZmlsZQorICogUGFja2V0IGJ1ZmZlciBtYW5hZ2VtZW50CisgKgorICogUGFja2V0cyBhcmUgYnVpbHQgZnJvbSB0aGUgcGJ1ZiBkYXRhIHN0cnVjdHVyZS4gSXQgc3VwcG9ydHMgZHluYW1pYworICogbWVtb3J5IGFsbG9jYXRpb24gZm9yIHBhY2tldCBjb250ZW50cyBvciBjYW4gcmVmZXJlbmNlIGV4dGVybmFsbHkKKyAqIG1hbmFnZWQgcGFja2V0IGNvbnRlbnRzIGJvdGggaW4gUkFNIGFuZCBST00uIFF1aWNrIGFsbG9jYXRpb24gZm9yCisgKiBpbmNvbWluZyBwYWNrZXRzIGlzIHByb3ZpZGVkIHRocm91Z2ggcG9vbHMgd2l0aCBmaXhlZCBzaXplZCBwYnVmcy4KKyAqCisgKiBBIHBhY2tldCBtYXkgc3BhbiBvdmVyIG11bHRpcGxlIHBidWZzLCBjaGFpbmVkIGFzIGEgc2luZ2x5IGxpbmtlZAorICogbGlzdC4gVGhpcyBpcyBjYWxsZWQgYSAicGJ1ZiBjaGFpbiIuCisgKgorICogTXVsdGlwbGUgcGFja2V0cyBtYXkgYmUgcXVldWVkLCBhbHNvIHVzaW5nIHRoaXMgc2luZ2x5IGxpbmtlZCBsaXN0LgorICogVGhpcyBpcyBjYWxsZWQgYSAicGFja2V0IHF1ZXVlIi4KKyAqIAorICogU28sIGEgcGFja2V0IHF1ZXVlIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIHBidWYgY2hhaW5zLCBlYWNoIG9mCisgKiB3aGljaCBjb25zaXN0IG9mIG9uZSBvciBtb3JlIHBidWZzLiBDVVJSRU5UTFksIFBBQ0tFVCBRVUVVRVMgQVJFCisgKiBOT1QgU1VQUE9SVEVEISEhIFVzZSBoZWxwZXIgc3RydWN0cyB0byBxdWV1ZSBtdWx0aXBsZSBwYWNrZXRzLgorICogCisgKiBUaGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIHBidWYgY2hhaW4gYW5kIGEgcGFja2V0IHF1ZXVlIGFyZSB2ZXJ5CisgKiBwcmVjaXNlIGJ1dCBzdWJ0bGUuIAorICoKKyAqIFRoZSBsYXN0IHBidWYgb2YgYSBwYWNrZXQgaGFzIGEgLT50b3RfbGVuIGZpZWxkIHRoYXQgZXF1YWxzIHRoZQorICogLT5sZW4gZmllbGQuIEl0IGNhbiBiZSBmb3VuZCBieSB0cmF2ZXJzaW5nIHRoZSBsaXN0LiBJZiB0aGUgbGFzdAorICogcGJ1ZiBvZiBhIHBhY2tldCBoYXMgYSAtPm5leHQgZmllbGQgb3RoZXIgdGhhbiBOVUxMLCBtb3JlIHBhY2tldHMKKyAqIGFyZSBvbiB0aGUgcXVldWUuCisgKgorICogVGhlcmVmb3JlLCBsb29waW5nIHRocm91Z2ggYSBwYnVmIG9mIGEgc2luZ2xlIHBhY2tldCwgaGFzIGFuCisgKiBsb29wIGVuZCBjb25kaXRpb24gKHRvdF9sZW4gPT0gcC0+bGVuKSwgTk9UIChuZXh0ID09IE5VTEwpLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2luY2x1ZGUgImx3aXAvc3RhdHMuaCIKKyNpbmNsdWRlICJsd2lwL2RlZi5oIgorI2luY2x1ZGUgImx3aXAvbWVtLmgiCisjaW5jbHVkZSAibHdpcC9tZW1wLmgiCisjaW5jbHVkZSAibHdpcC9wYnVmLmgiCisjaW5jbHVkZSAibHdpcC9zeXMuaCIKKyNpbmNsdWRlICJhcmNoL3BlcmYuaCIKKyNpZiBUQ1BfUVVFVUVfT09TRVEKKyNpbmNsdWRlICJsd2lwL3RjcF9pbXBsLmgiCisjZW5kaWYKKyNpZiBMV0lQX0NIRUNLU1VNX09OX0NPUFkKKyNpbmNsdWRlICJsd2lwL2luZXRfY2hrc3VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFNJWkVPRl9TVFJVQ1RfUEJVRiAgICAgICAgTFdJUF9NRU1fQUxJR05fU0laRShzaXplb2Yoc3RydWN0IHBidWYpKQorLyogU2luY2UgdGhlIHBvb2wgaXMgY3JlYXRlZCBpbiBtZW1wLCBQQlVGX1BPT0xfQlVGU0laRSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKyAgIGFsaWduZWQgdGhlcmUuIFRoZXJlZm9yZSwgUEJVRl9QT09MX0JVRlNJWkVfQUxJR05FRCBjYW4gYmUgdXNlZCBoZXJlLiAqLworI2RlZmluZSBQQlVGX1BPT0xfQlVGU0laRV9BTElHTkVEIExXSVBfTUVNX0FMSUdOX1NJWkUoUEJVRl9QT09MX0JVRlNJWkUpCisKKyNpZiAhTFdJUF9UQ1AgfHwgIVRDUF9RVUVVRV9PT1NFUSB8fCBOT19TWVMKKyNkZWZpbmUgUEJVRl9QT09MX0lTX0VNUFRZKCkKKyNlbHNlIC8qICFMV0lQX1RDUCB8fCAhVENQX1FVRVVFX09PU0VRIHx8IE5PX1NZUyAqLworLyoqIERlZmluZSB0aGlzIHRvIDAgdG8gcHJldmVudCBmcmVlaW5nIG9vc2VxIHBidWZzIHdoZW4gdGhlIFBCVUZfUE9PTCBpcyBlbXB0eSAqLworI2lmbmRlZiBQQlVGX1BPT0xfRlJFRV9PT1NFUQorI2RlZmluZSBQQlVGX1BPT0xfRlJFRV9PT1NFUSAxCisjZW5kaWYgLyogUEJVRl9QT09MX0ZSRUVfT09TRVEgKi8KKworI2lmIFBCVUZfUE9PTF9GUkVFX09PU0VRCisjaW5jbHVkZSAibHdpcC90Y3BpcC5oIgorI2RlZmluZSBQQlVGX1BPT0xfSVNfRU1QVFkoKSBwYnVmX3Bvb2xfaXNfZW1wdHkoKQorc3RhdGljIHU4X3QgcGJ1Zl9mcmVlX29vc2VxX3F1ZXVlZDsKKy8qKgorICogQXR0ZW1wdCB0byByZWNsYWltIHNvbWUgbWVtb3J5IGZyb20gcXVldWVkIG91dC1vZi1zZXF1ZW5jZSBUQ1Agc2VnbWVudHMKKyAqIGlmIHdlIHJ1biBvdXQgb2YgcG9vbCBwYnVmcy4gSXQncyBiZXR0ZXIgdG8gZ2l2ZSBwcmlvcml0eSB0byBuZXcgcGFja2V0cworICogaWYgd2UncmUgcnVubmluZyBvdXQuCisgKgorICogVGhpcyBtdXN0IGJlIGRvbmUgaW4gdGhlIGNvcnJlY3QgdGhyZWFkIGNvbnRleHQgdGhlcmVmb3JlIHRoaXMgZnVuY3Rpb24KKyAqIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBOT19TWVM9MCBhbmQgdGhyb3VnaCB0Y3BpcF9jYWxsYmFjay4KKyAqLworc3RhdGljIHZvaWQKK3BidWZfZnJlZV9vb3NlcSh2b2lkKiBhcmcpCit7CisgIHN0cnVjdCB0Y3BfcGNiKiBwY2I7CisgIFNZU19BUkNIX0RFQ0xfUFJPVEVDVChvbGRfbGV2ZWwpOworICBMV0lQX1VOVVNFRF9BUkcoYXJnKTsKKworICBTWVNfQVJDSF9QUk9URUNUKG9sZF9sZXZlbCk7CisgIHBidWZfZnJlZV9vb3NlcV9xdWV1ZWQgPSAwOworICBTWVNfQVJDSF9VTlBST1RFQ1Qob2xkX2xldmVsKTsKKworICBmb3IgKHBjYiA9IHRjcF9hY3RpdmVfcGNiczsgTlVMTCAhPSBwY2I7IHBjYiA9IHBjYi0+bmV4dCkgeworICAgIGlmIChOVUxMICE9IHBjYi0+b29zZXEpIHsKKyAgICAgIC8qKiBGcmVlIHRoZSBvb3NlcSBwYnVmcyBvZiBvbmUgUENCIG9ubHkgKi8KKyAgICAgIExXSVBfREVCVUdGKFBCVUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJwYnVmX2ZyZWVfb29zZXE6IGZyZWVpbmcgb3V0LW9mLXNlcXVlbmNlIHBidWZzXG4iKSk7CisgICAgICB0Y3Bfc2Vnc19mcmVlKHBjYi0+b29zZXEpOworICAgICAgcGNiLT5vb3NlcSA9IE5VTEw7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKKy8qKiBRdWV1ZSBhIGNhbGwgdG8gcGJ1Zl9mcmVlX29vc2VxIGlmIG5vdCBhbHJlYWR5IHF1ZXVlZC4gKi8KK3N0YXRpYyB2b2lkCitwYnVmX3Bvb2xfaXNfZW1wdHkodm9pZCkKK3sKKyAgdThfdCBxdWV1ZWQ7CisgIFNZU19BUkNIX0RFQ0xfUFJPVEVDVChvbGRfbGV2ZWwpOworCisgIFNZU19BUkNIX1BST1RFQ1Qob2xkX2xldmVsKTsKKyAgcXVldWVkID0gcGJ1Zl9mcmVlX29vc2VxX3F1ZXVlZDsKKyAgcGJ1Zl9mcmVlX29vc2VxX3F1ZXVlZCA9IDE7CisgIFNZU19BUkNIX1VOUFJPVEVDVChvbGRfbGV2ZWwpOworCisgIGlmKCFxdWV1ZWQpIHsKKyAgICAvKiBxdWV1ZSBhIGNhbGwgdG8gcGJ1Zl9mcmVlX29vc2VxIGlmIG5vdCBhbHJlYWR5IHF1ZXVlZCAqLworICAgIGlmKHRjcGlwX2NhbGxiYWNrX3dpdGhfYmxvY2socGJ1Zl9mcmVlX29vc2VxLCBOVUxMLCAwKSAhPSBFUlJfT0spIHsKKyAgICAgIFNZU19BUkNIX1BST1RFQ1Qob2xkX2xldmVsKTsKKyAgICAgIHBidWZfZnJlZV9vb3NlcV9xdWV1ZWQgPSAwOworICAgICAgU1lTX0FSQ0hfVU5QUk9URUNUKG9sZF9sZXZlbCk7CisgICAgfQorICB9Cit9CisjZW5kaWYgLyogUEJVRl9QT09MX0ZSRUVfT09TRVEgKi8KKyNlbmRpZiAvKiAhTFdJUF9UQ1AgfHwgIVRDUF9RVUVVRV9PT1NFUSB8fCBOT19TWVMgKi8KKworLyoqCisgKiBBbGxvY2F0ZXMgYSBwYnVmIG9mIHRoZSBnaXZlbiB0eXBlIChwb3NzaWJseSBhIGNoYWluIGZvciBQQlVGX1BPT0wgdHlwZSkuCisgKgorICogVGhlIGFjdHVhbCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgcGJ1ZiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQorICogbGF5ZXIgYXQgd2hpY2ggdGhlIHBidWYgaXMgYWxsb2NhdGVkIGFuZCB0aGUgcmVxdWVzdGVkIHNpemUKKyAqIChmcm9tIHRoZSBzaXplIHBhcmFtZXRlcikuCisgKgorICogQHBhcmFtIGxheWVyIGZsYWcgdG8gZGVmaW5lIGhlYWRlciBzaXplCisgKiBAcGFyYW0gbGVuZ3RoIHNpemUgb2YgdGhlIHBidWYncyBwYXlsb2FkCisgKiBAcGFyYW0gdHlwZSB0aGlzIHBhcmFtZXRlciBkZWNpZGVzIGhvdyBhbmQgd2hlcmUgdGhlIHBidWYKKyAqIHNob3VsZCBiZSBhbGxvY2F0ZWQgYXMgZm9sbG93czoKKyAqCisgKiAtIFBCVUZfUkFNOiBidWZmZXIgbWVtb3J5IGZvciBwYnVmIGlzIGFsbG9jYXRlZCBhcyBvbmUgbGFyZ2UKKyAqICAgICAgICAgICAgIGNodW5rLiBUaGlzIGluY2x1ZGVzIHByb3RvY29sIGhlYWRlcnMgYXMgd2VsbC4KKyAqIC0gUEJVRl9ST006IG5vIGJ1ZmZlciBtZW1vcnkgaXMgYWxsb2NhdGVkIGZvciB0aGUgcGJ1ZiwgZXZlbiBmb3IKKyAqICAgICAgICAgICAgIHByb3RvY29sIGhlYWRlcnMuIEFkZGl0aW9uYWwgaGVhZGVycyBtdXN0IGJlIHByZXBlbmRlZAorICogICAgICAgICAgICAgYnkgYWxsb2NhdGluZyBhbm90aGVyIHBidWYgYW5kIGNoYWluIGluIHRvIHRoZSBmcm9udCBvZgorICogICAgICAgICAgICAgdGhlIFJPTSBwYnVmLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIG1lbW9yeSB1c2VkIGlzIHJlYWxseQorICogICAgICAgICAgICAgc2ltaWxhciB0byBST00gaW4gdGhhdCBpdCBpcyBpbW11dGFibGUgYW5kIHdpbGwgbm90IGJlCisgKiAgICAgICAgICAgICBjaGFuZ2VkLiBNZW1vcnkgd2hpY2ggaXMgZHluYW1pYyBzaG91bGQgZ2VuZXJhbGx5IG5vdAorICogICAgICAgICAgICAgYmUgYXR0YWNoZWQgdG8gUEJVRl9ST00gcGJ1ZnMuIFVzZSBQQlVGX1JFRiBpbnN0ZWFkLgorICogLSBQQlVGX1JFRjogbm8gYnVmZmVyIG1lbW9yeSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBwYnVmLCBldmVuIGZvcgorICogICAgICAgICAgICAgcHJvdG9jb2wgaGVhZGVycy4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBwYnVmIGlzIG9ubHkKKyAqICAgICAgICAgICAgIGJlaW5nIHVzZWQgaW4gYSBzaW5nbGUgdGhyZWFkLiBJZiB0aGUgcGJ1ZiBnZXRzIHF1ZXVlZCwKKyAqICAgICAgICAgICAgIHRoZW4gcGJ1Zl90YWtlIHNob3VsZCBiZSBjYWxsZWQgdG8gY29weSB0aGUgYnVmZmVyLgorICogLSBQQlVGX1BPT0w6IHRoZSBwYnVmIGlzIGFsbG9jYXRlZCBhcyBhIHBidWYgY2hhaW4sIHdpdGggcGJ1ZnMgZnJvbQorICogICAgICAgICAgICAgIHRoZSBwYnVmIHBvb2wgdGhhdCBpcyBhbGxvY2F0ZWQgZHVyaW5nIHBidWZfaW5pdCgpLgorICoKKyAqIEByZXR1cm4gdGhlIGFsbG9jYXRlZCBwYnVmLiBJZiBtdWx0aXBsZSBwYnVmcyB3aGVyZSBhbGxvY2F0ZWQsIHRoaXMKKyAqIGlzIHRoZSBmaXJzdCBwYnVmIG9mIGEgcGJ1ZiBjaGFpbi4KKyAqLworc3RydWN0IHBidWYgKgorcGJ1Zl9hbGxvYyhwYnVmX2xheWVyIGxheWVyLCB1MTZfdCBsZW5ndGgsIHBidWZfdHlwZSB0eXBlKQoreworICBzdHJ1Y3QgcGJ1ZiAqcCwgKnEsICpyOworICB1MTZfdCBvZmZzZXQ7CisgIHMzMl90IHJlbV9sZW47IC8qIHJlbWFpbmluZyBsZW5ndGggKi8KKyAgTFdJUF9ERUJVR0YoUEJVRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInBidWZfYWxsb2MobGVuZ3RoPSUiVTE2X0YiKVxuIiwgbGVuZ3RoKSk7CisKKyAgLyogZGV0ZXJtaW5lIGhlYWRlciBvZmZzZXQgKi8KKyAgb2Zmc2V0ID0gMDsKKyAgc3dpdGNoIChsYXllcikgeworICBjYXNlIFBCVUZfVFJBTlNQT1JUOgorICAgIC8qIGFkZCByb29tIGZvciB0cmFuc3BvcnQgKG9mdGVuIFRDUCkgbGF5ZXIgaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IFBCVUZfVFJBTlNQT1JUX0hMRU47CisgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgY2FzZSBQQlVGX0lQOgorICAgIC8qIGFkZCByb29tIGZvciBJUCBsYXllciBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gUEJVRl9JUF9ITEVOOworICAgIC8qIEZBTExUSFJPVUdIICovCisgIGNhc2UgUEJVRl9MSU5LOgorICAgIC8qIGFkZCByb29tIGZvciBsaW5rIGxheWVyIGhlYWRlciAqLworICAgIG9mZnNldCArPSBQQlVGX0xJTktfSExFTjsKKyAgICBicmVhazsKKyAgY2FzZSBQQlVGX1JBVzoKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBMV0lQX0FTU0VSVCgicGJ1Zl9hbGxvYzogYmFkIHBidWYgbGF5ZXIiLCAwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFBCVUZfUE9PTDoKKyAgICAvKiBhbGxvY2F0ZSBoZWFkIG9mIHBidWYgY2hhaW4gaW50byBwICovCisgICAgcCA9IChzdHJ1Y3QgcGJ1ZiAqKW1lbXBfbWFsbG9jKE1FTVBfUEJVRl9QT09MKTsKKyAgICBMV0lQX0RFQlVHRihQQlVGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgicGJ1Zl9hbGxvYzogYWxsb2NhdGVkIHBidWYgJXBcbiIsICh2b2lkICopcCkpOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgIFBCVUZfUE9PTF9JU19FTVBUWSgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHAtPnR5cGUgPSB0eXBlOworICAgIHAtPm5leHQgPSBOVUxMOworCisgICAgLyogbWFrZSB0aGUgcGF5bG9hZCBwb2ludGVyIHBvaW50ICdvZmZzZXQnIGJ5dGVzIGludG8gcGJ1ZiBkYXRhIG1lbW9yeSAqLworICAgIHAtPnBheWxvYWQgPSBMV0lQX01FTV9BTElHTigodm9pZCAqKSgodThfdCAqKXAgKyAoU0laRU9GX1NUUlVDVF9QQlVGICsgb2Zmc2V0KSkpOworICAgIExXSVBfQVNTRVJUKCJwYnVmX2FsbG9jOiBwYnVmIHAtPnBheWxvYWQgcHJvcGVybHkgYWxpZ25lZCIsCisgICAgICAgICAgICAoKG1lbV9wdHJfdClwLT5wYXlsb2FkICUgTUVNX0FMSUdOTUVOVCkgPT0gMCk7CisgICAgLyogdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgcGJ1ZiBjaGFpbiBpcyB0aGUgcmVxdWVzdGVkIHNpemUgKi8KKyAgICBwLT50b3RfbGVuID0gbGVuZ3RoOworICAgIC8qIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBwYnVmIGluIHRoZSBjaGFpbiAqLworICAgIHAtPmxlbiA9IExXSVBfTUlOKGxlbmd0aCwgUEJVRl9QT09MX0JVRlNJWkVfQUxJR05FRCAtIExXSVBfTUVNX0FMSUdOX1NJWkUob2Zmc2V0KSk7CisgICAgTFdJUF9BU1NFUlQoImNoZWNrIHAtPnBheWxvYWQgKyBwLT5sZW4gZG9lcyBub3Qgb3ZlcmZsb3cgcGJ1ZiIsCisgICAgICAgICAgICAgICAgKCh1OF90KilwLT5wYXlsb2FkICsgcC0+bGVuIDw9CisgICAgICAgICAgICAgICAgICh1OF90KilwICsgU0laRU9GX1NUUlVDVF9QQlVGICsgUEJVRl9QT09MX0JVRlNJWkVfQUxJR05FRCkpOworICAgIExXSVBfQVNTRVJUKCJQQlVGX1BPT0xfQlVGU0laRSBtdXN0IGJlIGJpZ2dlciB0aGFuIE1FTV9BTElHTk1FTlQiLAorICAgICAgKFBCVUZfUE9PTF9CVUZTSVpFX0FMSUdORUQgLSBMV0lQX01FTV9BTElHTl9TSVpFKG9mZnNldCkpID4gMCApOworICAgIC8qIHNldCByZWZlcmVuY2UgY291bnQgKG5lZWRlZCBoZXJlIGluIGNhc2Ugd2UgZmFpbCkgKi8KKyAgICBwLT5yZWYgPSAxOworCisgICAgLyogbm93IGFsbG9jYXRlIHRoZSB0YWlsIG9mIHRoZSBwYnVmIGNoYWluICovCisKKyAgICAvKiByZW1lbWJlciBmaXJzdCBwYnVmIGZvciBsaW5rYWdlIGluIG5leHQgaXRlcmF0aW9uICovCisgICAgciA9IHA7CisgICAgLyogcmVtYWluaW5nIGxlbmd0aCB0byBiZSBhbGxvY2F0ZWQgKi8KKyAgICByZW1fbGVuID0gbGVuZ3RoIC0gcC0+bGVuOworICAgIC8qIGFueSByZW1haW5pbmcgcGJ1ZnMgdG8gYmUgYWxsb2NhdGVkPyAqLworICAgIHdoaWxlIChyZW1fbGVuID4gMCkgeworICAgICAgcSA9IChzdHJ1Y3QgcGJ1ZiAqKW1lbXBfbWFsbG9jKE1FTVBfUEJVRl9QT09MKTsKKyAgICAgIGlmIChxID09IE5VTEwpIHsKKyAgICAgICAgUEJVRl9QT09MX0lTX0VNUFRZKCk7CisgICAgICAgIC8qIGZyZWUgY2hhaW4gc28gZmFyIGFsbG9jYXRlZCAqLworICAgICAgICBwYnVmX2ZyZWUocCk7CisgICAgICAgIC8qIGJhaWwgb3V0IHVuc3VjY2VzZnVsbHkgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBxLT50eXBlID0gdHlwZTsKKyAgICAgIHEtPmZsYWdzID0gMDsKKyAgICAgIHEtPm5leHQgPSBOVUxMOworICAgICAgLyogbWFrZSBwcmV2aW91cyBwYnVmIHBvaW50IHRvIHRoaXMgcGJ1ZiAqLworICAgICAgci0+bmV4dCA9IHE7CisgICAgICAvKiBzZXQgdG90YWwgbGVuZ3RoIG9mIHRoaXMgcGJ1ZiBhbmQgbmV4dCBpbiBjaGFpbiAqLworICAgICAgTFdJUF9BU1NFUlQoInJlbV9sZW4gPCBtYXhfdTE2X3QiLCByZW1fbGVuIDwgMHhmZmZmKTsKKyAgICAgIHEtPnRvdF9sZW4gPSAodTE2X3QpcmVtX2xlbjsKKyAgICAgIC8qIHRoaXMgcGJ1ZiBsZW5ndGggaXMgcG9vbCBzaXplLCB1bmxlc3Mgc21hbGxlciBzaXplZCB0YWlsICovCisgICAgICBxLT5sZW4gPSBMV0lQX01JTigodTE2X3QpcmVtX2xlbiwgUEJVRl9QT09MX0JVRlNJWkVfQUxJR05FRCk7CisgICAgICBxLT5wYXlsb2FkID0gKHZvaWQgKikoKHU4X3QgKilxICsgU0laRU9GX1NUUlVDVF9QQlVGKTsKKyAgICAgIExXSVBfQVNTRVJUKCJwYnVmX2FsbG9jOiBwYnVmIHEtPnBheWxvYWQgcHJvcGVybHkgYWxpZ25lZCIsCisgICAgICAgICAgICAgICgobWVtX3B0cl90KXEtPnBheWxvYWQgJSBNRU1fQUxJR05NRU5UKSA9PSAwKTsKKyAgICAgIExXSVBfQVNTRVJUKCJjaGVjayBwLT5wYXlsb2FkICsgcC0+bGVuIGRvZXMgbm90IG92ZXJmbG93IHBidWYiLAorICAgICAgICAgICAgICAgICAgKCh1OF90KilwLT5wYXlsb2FkICsgcC0+bGVuIDw9CisgICAgICAgICAgICAgICAgICAgKHU4X3QqKXAgKyBTSVpFT0ZfU1RSVUNUX1BCVUYgKyBQQlVGX1BPT0xfQlVGU0laRV9BTElHTkVEKSk7CisgICAgICBxLT5yZWYgPSAxOworICAgICAgLyogY2FsY3VsYXRlIHJlbWFpbmluZyBsZW5ndGggdG8gYmUgYWxsb2NhdGVkICovCisgICAgICByZW1fbGVuIC09IHEtPmxlbjsKKyAgICAgIC8qIHJlbWVtYmVyIHRoaXMgcGJ1ZiBmb3IgbGlua2FnZSBpbiBuZXh0IGl0ZXJhdGlvbiAqLworICAgICAgciA9IHE7CisgICAgfQorICAgIC8qIGVuZCBvZiBjaGFpbiAqLworICAgIC8qci0+bmV4dCA9IE5VTEw7Ki8KKworICAgIGJyZWFrOworICBjYXNlIFBCVUZfUkFNOgorICAgIC8qIElmIHBidWYgaXMgdG8gYmUgYWxsb2NhdGVkIGluIFJBTSwgYWxsb2NhdGUgbWVtb3J5IGZvciBpdC4gKi8KKyAgICBwID0gKHN0cnVjdCBwYnVmKiltZW1fbWFsbG9jKExXSVBfTUVNX0FMSUdOX1NJWkUoU0laRU9GX1NUUlVDVF9QQlVGICsgb2Zmc2V0KSArIExXSVBfTUVNX0FMSUdOX1NJWkUobGVuZ3RoKSk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFNldCB1cCBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgdGhlIHBidWYuICovCisgICAgcC0+cGF5bG9hZCA9IExXSVBfTUVNX0FMSUdOKCh2b2lkICopKCh1OF90ICopcCArIFNJWkVPRl9TVFJVQ1RfUEJVRiArIG9mZnNldCkpOworICAgIHAtPmxlbiA9IHAtPnRvdF9sZW4gPSBsZW5ndGg7CisgICAgcC0+bmV4dCA9IE5VTEw7CisgICAgcC0+dHlwZSA9IHR5cGU7CisKKyAgICBMV0lQX0FTU0VSVCgicGJ1Zl9hbGxvYzogcGJ1Zi0+cGF5bG9hZCBwcm9wZXJseSBhbGlnbmVkIiwKKyAgICAgICAgICAgKChtZW1fcHRyX3QpcC0+cGF5bG9hZCAlIE1FTV9BTElHTk1FTlQpID09IDApOworICAgIGJyZWFrOworICAvKiBwYnVmIHJlZmVyZW5jZXMgZXhpc3RpbmcgKG5vbi12b2xhdGlsZSBzdGF0aWMgY29uc3RhbnQpIFJPTSBwYXlsb2FkPyAqLworICBjYXNlIFBCVUZfUk9NOgorICAvKiBwYnVmIHJlZmVyZW5jZXMgZXhpc3RpbmcgKGV4dGVybmFsbHkgYWxsb2NhdGVkKSBSQU0gcGF5bG9hZD8gKi8KKyAgY2FzZSBQQlVGX1JFRjoKKyAgICAvKiBvbmx5IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBidWYgc3RydWN0dXJlICovCisgICAgcCA9IChzdHJ1Y3QgcGJ1ZiAqKW1lbXBfbWFsbG9jKE1FTVBfUEJVRik7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgTFdJUF9ERUJVR0YoUEJVRl9ERUJVRyB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsCisgICAgICAgICAgICAgICAgICAoInBidWZfYWxsb2M6IENvdWxkIG5vdCBhbGxvY2F0ZSBNRU1QX1BCVUYgZm9yIFBCVUZfJXMuXG4iLAorICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gUEJVRl9ST00pID8gIlJPTSIgOiAiUkVGIikpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIGNhbGxlciBtdXN0IHNldCB0aGlzIGZpZWxkIHByb3Blcmx5LCBhZnRlcndhcmRzICovCisgICAgcC0+cGF5bG9hZCA9IE5VTEw7CisgICAgcC0+bGVuID0gcC0+dG90X2xlbiA9IGxlbmd0aDsKKyAgICBwLT5uZXh0ID0gTlVMTDsKKyAgICBwLT50eXBlID0gdHlwZTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBMV0lQX0FTU0VSVCgicGJ1Zl9hbGxvYzogZXJyb25lb3VzIHR5cGUiLCAwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBzZXQgcmVmZXJlbmNlIGNvdW50ICovCisgIHAtPnJlZiA9IDE7CisgIC8qIHNldCBmbGFncyAqLworICBwLT5mbGFncyA9IDA7CisgIExXSVBfREVCVUdGKFBCVUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJwYnVmX2FsbG9jKGxlbmd0aD0lIlUxNl9GIikgPT0gJXBcbiIsIGxlbmd0aCwgKHZvaWQgKilwKSk7CisgIHJldHVybiBwOworfQorCisjaWYgTFdJUF9TVVBQT1JUX0NVU1RPTV9QQlVGCisvKiogSW5pdGlhbGl6ZSBhIGN1c3RvbSBwYnVmIChhbHJlYWR5IGFsbG9jYXRlZCkuCisgKgorICogQHBhcmFtIGxheWVyIGZsYWcgdG8gZGVmaW5lIGhlYWRlciBzaXplCisgKiBAcGFyYW0gbGVuZ3RoIHNpemUgb2YgdGhlIHBidWYncyBwYXlsb2FkCisgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHRoZSBwYnVmIChvbmx5IHVzZWQgdG8gdHJlYXQgdGhlIHBidWYgYWNjb3JkaW5nbHksIGFzCisgKiAgICAgICAgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbm8gbWVtb3J5KQorICogQHBhcmFtIHAgcG9pbnRlciB0byB0aGUgY3VzdG9tIHBidWYgdG8gaW5pdGlhbGl6ZSAoYWxyZWFkeSBhbGxvY2F0ZWQpCisgKiBAcGFyYW0gcGF5bG9hZF9tZW0gcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgaXMgdXNlZCBmb3IgcGF5bG9hZCBhbmQgaGVhZGVycywKKyAqICAgICAgICBtdXN0IGJlIGF0IGxlYXN0IGJpZyBlbm91Z2ggdG8gaG9sZCAnbGVuZ3RoJyBwbHVzIHRoZSBoZWFkZXIgc2l6ZSwKKyAqICAgICAgICBtYXkgYmUgTlVMTCBpZiBzZXQgbGF0ZXIKKyAqIEBwYXJhbSBwYXlsb2FkX21lbV9sZW4gdGhlIHNpemUgb2YgdGhlICdwYXlsb2FkX21lbScgYnVmZmVyLCBtdXN0IGJlIGF0IGxlYXN0CisgKiAgICAgICAgYmlnIGVub3VnaCB0byBob2xkICdsZW5ndGgnIHBsdXMgdGhlIGhlYWRlciBzaXplCisgKi8KK3N0cnVjdCBwYnVmKgorcGJ1Zl9hbGxvY2VkX2N1c3RvbShwYnVmX2xheWVyIGwsIHUxNl90IGxlbmd0aCwgcGJ1Zl90eXBlIHR5cGUsIHN0cnVjdCBwYnVmX2N1c3RvbSAqcCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGF5bG9hZF9tZW0sIHUxNl90IHBheWxvYWRfbWVtX2xlbikKK3sKKyAgdTE2X3Qgb2Zmc2V0OworICBMV0lQX0RFQlVHRihQQlVGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgicGJ1Zl9hbGxvY2VkX2N1c3RvbShsZW5ndGg9JSJVMTZfRiIpXG4iLCBsZW5ndGgpKTsKKworICAvKiBkZXRlcm1pbmUgaGVhZGVyIG9mZnNldCAqLworICBvZmZzZXQgPSAwOworICBzd2l0Y2ggKGwpIHsKKyAgY2FzZSBQQlVGX1RSQU5TUE9SVDoKKyAgICAvKiBhZGQgcm9vbSBmb3IgdHJhbnNwb3J0IChvZnRlbiBUQ1ApIGxheWVyIGhlYWRlciAqLworICAgIG9mZnNldCArPSBQQlVGX1RSQU5TUE9SVF9ITEVOOworICAgIC8qIEZBTExUSFJPVUdIICovCisgIGNhc2UgUEJVRl9JUDoKKyAgICAvKiBhZGQgcm9vbSBmb3IgSVAgbGF5ZXIgaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IFBCVUZfSVBfSExFTjsKKyAgICAvKiBGQUxMVEhST1VHSCAqLworICBjYXNlIFBCVUZfTElOSzoKKyAgICAvKiBhZGQgcm9vbSBmb3IgbGluayBsYXllciBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gUEJVRl9MSU5LX0hMRU47CisgICAgYnJlYWs7CisgIGNhc2UgUEJVRl9SQVc6CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgTFdJUF9BU1NFUlQoInBidWZfYWxsb2NlZF9jdXN0b206IGJhZCBwYnVmIGxheWVyIiwgMCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoTFdJUF9NRU1fQUxJR05fU0laRShvZmZzZXQpICsgbGVuZ3RoIDwgcGF5bG9hZF9tZW1fbGVuKSB7CisgICAgTFdJUF9ERUJVR0YoUEJVRl9ERUJVRyB8IExXSVBfREJHX0xFVkVMX1dBUk5JTkcsICgicGJ1Zl9hbGxvY2VkX2N1c3RvbShsZW5ndGg9JSJVMTZfRiIpIGJ1ZmZlciB0b28gc2hvcnRcbiIsIGxlbmd0aCkpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcC0+cGJ1Zi5uZXh0ID0gTlVMTDsKKyAgaWYgKHBheWxvYWRfbWVtICE9IE5VTEwpIHsKKyAgICBwLT5wYnVmLnBheWxvYWQgPSBMV0lQX01FTV9BTElHTigodm9pZCAqKSgodThfdCAqKXBheWxvYWRfbWVtICsgb2Zmc2V0KSk7CisgIH0gZWxzZSB7CisgICAgcC0+cGJ1Zi5wYXlsb2FkID0gTlVMTDsKKyAgfQorICBwLT5wYnVmLmZsYWdzID0gUEJVRl9GTEFHX0lTX0NVU1RPTTsKKyAgcC0+cGJ1Zi5sZW4gPSBwLT5wYnVmLnRvdF9sZW4gPSBsZW5ndGg7CisgIHAtPnBidWYudHlwZSA9IHR5cGU7CisgIHAtPnBidWYucmVmID0gMTsKKyAgcmV0dXJuICZwLT5wYnVmOworfQorI2VuZGlmIC8qIExXSVBfU1VQUE9SVF9DVVNUT01fUEJVRiAqLworCisvKioKKyAqIFNocmluayBhIHBidWYgY2hhaW4gdG8gYSBkZXNpcmVkIGxlbmd0aC4KKyAqCisgKiBAcGFyYW0gcCBwYnVmIHRvIHNocmluay4KKyAqIEBwYXJhbSBuZXdfbGVuIGRlc2lyZWQgbmV3IGxlbmd0aCBvZiBwYnVmIGNoYWluCisgKgorICogRGVwZW5kaW5nIG9uIHRoZSBkZXNpcmVkIGxlbmd0aCwgdGhlIGZpcnN0IGZldyBwYnVmcyBpbiBhIGNoYWluIG1pZ2h0CisgKiBiZSBza2lwcGVkIGFuZCBsZWZ0IHVuY2hhbmdlZC4gVGhlIG5ldyBsYXN0IHBidWYgaW4gdGhlIGNoYWluIHdpbGwgYmUKKyAqIHJlc2l6ZWQsIGFuZCBhbnkgcmVtYWluaW5nIHBidWZzIHdpbGwgYmUgZnJlZWQuCisgKgorICogQG5vdGUgSWYgdGhlIHBidWYgaXMgUk9NL1JFRiwgb25seSB0aGUgLT50b3RfbGVuIGFuZCAtPmxlbiBmaWVsZHMgYXJlIGFkanVzdGVkLgorICogQG5vdGUgTWF5IG5vdCBiZSBjYWxsZWQgb24gYSBwYWNrZXQgcXVldWUuCisgKgorICogQG5vdGUgRGVzcGl0ZSBpdHMgbmFtZSwgcGJ1Zl9yZWFsbG9jIGNhbm5vdCBncm93IHRoZSBzaXplIG9mIGEgcGJ1ZiAoY2hhaW4pLgorICovCit2b2lkCitwYnVmX3JlYWxsb2Moc3RydWN0IHBidWYgKnAsIHUxNl90IG5ld19sZW4pCit7CisgIHN0cnVjdCBwYnVmICpxOworICB1MTZfdCByZW1fbGVuOyAvKiByZW1haW5pbmcgbGVuZ3RoICovCisgIHMzMl90IGdyb3c7CisKKyAgTFdJUF9BU1NFUlQoInBidWZfcmVhbGxvYzogcCAhPSBOVUxMIiwgcCAhPSBOVUxMKTsKKyAgTFdJUF9BU1NFUlQoInBidWZfcmVhbGxvYzogc2FuZSBwLT50eXBlIiwgcC0+dHlwZSA9PSBQQlVGX1BPT0wgfHwKKyAgICAgICAgICAgICAgcC0+dHlwZSA9PSBQQlVGX1JPTSB8fAorICAgICAgICAgICAgICBwLT50eXBlID09IFBCVUZfUkFNIHx8CisgICAgICAgICAgICAgIHAtPnR5cGUgPT0gUEJVRl9SRUYpOworCisgIC8qIGRlc2lyZWQgbGVuZ3RoIGxhcmdlciB0aGFuIGN1cnJlbnQgbGVuZ3RoPyAqLworICBpZiAobmV3X2xlbiA+PSBwLT50b3RfbGVuKSB7CisgICAgLyogZW5sYXJnaW5nIG5vdCB5ZXQgc3VwcG9ydGVkICovCisgICAgcmV0dXJuOworICB9CisKKyAgLyogdGhlIHBidWYgY2hhaW4gZ3Jvd3MgYnkgKG5ld19sZW4gLSBwLT50b3RfbGVuKSBieXRlcworICAgKiAod2hpY2ggbWF5IGJlIG5lZ2F0aXZlIGluIGNhc2Ugb2Ygc2hyaW5raW5nKSAqLworICBncm93ID0gbmV3X2xlbiAtIHAtPnRvdF9sZW47CisKKyAgLyogZmlyc3QsIHN0ZXAgb3ZlciBhbnkgcGJ1ZnMgdGhhdCBzaG91bGQgcmVtYWluIGluIHRoZSBjaGFpbiAqLworICByZW1fbGVuID0gbmV3X2xlbjsKKyAgcSA9IHA7CisgIC8qIHNob3VsZCB0aGlzIHBidWYgYmUga2VwdD8gKi8KKyAgd2hpbGUgKHJlbV9sZW4gPiBxLT5sZW4pIHsKKyAgICAvKiBkZWNyZWFzZSByZW1haW5pbmcgbGVuZ3RoIGJ5IHBidWYgbGVuZ3RoICovCisgICAgcmVtX2xlbiAtPSBxLT5sZW47CisgICAgLyogZGVjcmVhc2UgdG90YWwgbGVuZ3RoIGluZGljYXRvciAqLworICAgIExXSVBfQVNTRVJUKCJncm93IDwgbWF4X3UxNl90IiwgZ3JvdyA8IDB4ZmZmZik7CisgICAgcS0+dG90X2xlbiArPSAodTE2X3QpZ3JvdzsKKyAgICAvKiBwcm9jZWVkIHRvIG5leHQgcGJ1ZiBpbiBjaGFpbiAqLworICAgIHEgPSBxLT5uZXh0OworICAgIExXSVBfQVNTRVJUKCJwYnVmX3JlYWxsb2M6IHEgIT0gTlVMTCIsIHEgIT0gTlVMTCk7CisgIH0KKyAgLyogd2UgaGF2ZSBub3cgcmVhY2hlZCB0aGUgbmV3IGxhc3QgcGJ1ZiAoaW4gcSkgKi8KKyAgLyogcmVtX2xlbiA9PSBkZXNpcmVkIGxlbmd0aCBmb3IgcGJ1ZiBxICovCisKKyAgLyogc2hyaW5rIGFsbG9jYXRlZCBtZW1vcnkgZm9yIFBCVUZfUkFNICovCisgIC8qIChvdGhlciB0eXBlcyBtZXJlbHkgYWRqdXN0IHRoZWlyIGxlbmd0aCBmaWVsZHMgKi8KKyAgaWYgKChxLT50eXBlID09IFBCVUZfUkFNKSAmJiAocmVtX2xlbiAhPSBxLT5sZW4pKSB7CisgICAgLyogcmVhbGxvY2F0ZSBhbmQgYWRqdXN0IHRoZSBsZW5ndGggb2YgdGhlIHBidWYgdGhhdCB3aWxsIGJlIHNwbGl0ICovCisgICAgcSA9IChzdHJ1Y3QgcGJ1ZiAqKW1lbV90cmltKHEsICh1MTZfdCkoKHU4X3QgKilxLT5wYXlsb2FkIC0gKHU4X3QgKilxKSArIHJlbV9sZW4pOworICAgIExXSVBfQVNTRVJUKCJtZW1fdHJpbSByZXR1cm5lZCBxID09IE5VTEwiLCBxICE9IE5VTEwpOworICB9CisgIC8qIGFkanVzdCBsZW5ndGggZmllbGRzIGZvciBuZXcgbGFzdCBwYnVmICovCisgIHEtPmxlbiA9IHJlbV9sZW47CisgIHEtPnRvdF9sZW4gPSBxLT5sZW47CisKKyAgLyogYW55IHJlbWFpbmluZyBwYnVmcyBpbiBjaGFpbj8gKi8KKyAgaWYgKHEtPm5leHQgIT0gTlVMTCkgeworICAgIC8qIGZyZWUgcmVtYWluaW5nIHBidWZzIGluIGNoYWluICovCisgICAgcGJ1Zl9mcmVlKHEtPm5leHQpOworICB9CisgIC8qIHEgaXMgbGFzdCBwYWNrZXQgaW4gY2hhaW4gKi8KKyAgcS0+bmV4dCA9IE5VTEw7CisKK30KKworLyoqCisgKiBBZGp1c3RzIHRoZSBwYXlsb2FkIHBvaW50ZXIgdG8gaGlkZSBvciByZXZlYWwgaGVhZGVycyBpbiB0aGUgcGF5bG9hZC4KKyAqCisgKiBBZGp1c3RzIHRoZSAtPnBheWxvYWQgcG9pbnRlciBzbyB0aGF0IHNwYWNlIGZvciBhIGhlYWRlcgorICogKGRpcylhcHBlYXJzIGluIHRoZSBwYnVmIHBheWxvYWQuCisgKgorICogVGhlIC0+cGF5bG9hZCwgLT50b3RfbGVuIGFuZCAtPmxlbiBmaWVsZHMgYXJlIGFkanVzdGVkLgorICoKKyAqIEBwYXJhbSBwIHBidWYgdG8gY2hhbmdlIHRoZSBoZWFkZXIgc2l6ZS4KKyAqIEBwYXJhbSBoZWFkZXJfc2l6ZV9pbmNyZW1lbnQgTnVtYmVyIG9mIGJ5dGVzIHRvIGluY3JlbWVudCBoZWFkZXIgc2l6ZSB3aGljaAorICogaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBwYnVmLiBOZXcgc3BhY2UgaXMgb24gdGhlIGZyb250LgorICogKFVzaW5nIGEgbmVnYXRpdmUgdmFsdWUgZGVjcmVhc2VzIHRoZSBoZWFkZXIgc2l6ZS4pCisgKiBJZiBoZHJfc2l6ZV9pbmMgaXMgMCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgc3VjY2VzZnVsLgorICoKKyAqIFBCVUZfUk9NIGFuZCBQQlVGX1JFRiB0eXBlIGJ1ZmZlcnMgY2Fubm90IGhhdmUgdGhlaXIgc2l6ZXMgaW5jcmVhc2VkLCBzbworICogdGhlIGNhbGwgd2lsbCBmYWlsLiBBIGNoZWNrIGlzIG1hZGUgdGhhdCB0aGUgaW5jcmVhc2UgaW4gaGVhZGVyIHNpemUgZG9lcworICogbm90IG1vdmUgdGhlIHBheWxvYWQgcG9pbnRlciBpbiBmcm9udCBvZiB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKyAqIEByZXR1cm4gbm9uLXplcm8gb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgorICoKKyAqLwordThfdAorcGJ1Zl9oZWFkZXIoc3RydWN0IHBidWYgKnAsIHMxNl90IGhlYWRlcl9zaXplX2luY3JlbWVudCkKK3sKKyAgdTE2X3QgdHlwZTsKKyAgdm9pZCAqcGF5bG9hZDsKKyAgdTE2X3QgaW5jcmVtZW50X21hZ25pdHVkZTsKKworICBMV0lQX0FTU0VSVCgicCAhPSBOVUxMIiwgcCAhPSBOVUxMKTsKKyAgaWYgKChoZWFkZXJfc2l6ZV9pbmNyZW1lbnQgPT0gMCkgfHwgKHAgPT0gTlVMTCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorIAorICBpZiAoaGVhZGVyX3NpemVfaW5jcmVtZW50IDwgMCl7CisgICAgaW5jcmVtZW50X21hZ25pdHVkZSA9IC1oZWFkZXJfc2l6ZV9pbmNyZW1lbnQ7CisgICAgLyogQ2hlY2sgdGhhdCB3ZSBhcmVuJ3QgZ29pbmcgdG8gbW92ZSBvZmYgdGhlIGVuZCBvZiB0aGUgcGJ1ZiAqLworICAgIExXSVBfRVJST1IoImluY3JlbWVudF9tYWduaXR1ZGUgPD0gcC0+bGVuIiwgKGluY3JlbWVudF9tYWduaXR1ZGUgPD0gcC0+bGVuKSwgcmV0dXJuIDE7KTsKKyAgfSBlbHNlIHsKKyAgICBpbmNyZW1lbnRfbWFnbml0dWRlID0gaGVhZGVyX3NpemVfaW5jcmVtZW50OworI2lmIDAKKyAgICAvKiBDYW4ndCBhc3NlcnQgdGhlc2UgYXMgc29tZSBjYWxsZXJzIHNwZWN1bGF0aXZlbHkgY2FsbAorICAgICAgICAgcGJ1Zl9oZWFkZXIoKSB0byBzZWUgaWYgaXQncyBPSy4gIFdpbGwgcmV0dXJuIDEgYmVsb3cgaW5zdGVhZC4gKi8KKyAgICAvKiBDaGVjayB0aGF0IHdlJ3ZlIGdvdCB0aGUgY29ycmVjdCB0eXBlIG9mIHBidWYgdG8gd29yayB3aXRoICovCisgICAgTFdJUF9BU1NFUlQoInAtPnR5cGUgPT0gUEJVRl9SQU0gfHwgcC0+dHlwZSA9PSBQQlVGX1BPT0wiLCAKKyAgICAgICAgICAgICAgICBwLT50eXBlID09IFBCVUZfUkFNIHx8IHAtPnR5cGUgPT0gUEJVRl9QT09MKTsKKyAgICAvKiBDaGVjayB0aGF0IHdlIGFyZW4ndCBnb2luZyB0byBtb3ZlIG9mZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYnVmICovCisgICAgTFdJUF9BU1NFUlQoInAtPnBheWxvYWQgLSBpbmNyZW1lbnRfbWFnbml0dWRlID49IHAgKyBTSVpFT0ZfU1RSVUNUX1BCVUYiLAorICAgICAgICAgICAgICAgICh1OF90ICopcC0+cGF5bG9hZCAtIGluY3JlbWVudF9tYWduaXR1ZGUgPj0gKHU4X3QgKilwICsgU0laRU9GX1NUUlVDVF9QQlVGKTsKKyNlbmRpZgorICB9CisKKyAgdHlwZSA9IHAtPnR5cGU7CisgIC8qIHJlbWVtYmVyIGN1cnJlbnQgcGF5bG9hZCBwb2ludGVyICovCisgIHBheWxvYWQgPSBwLT5wYXlsb2FkOworCisgIC8qIHBidWYgdHlwZXMgY29udGFpbmluZyBwYXlsb2Fkcz8gKi8KKyAgaWYgKHR5cGUgPT0gUEJVRl9SQU0gfHwgdHlwZSA9PSBQQlVGX1BPT0wpIHsKKyAgICAvKiBzZXQgbmV3IHBheWxvYWQgcG9pbnRlciAqLworICAgIHAtPnBheWxvYWQgPSAodThfdCAqKXAtPnBheWxvYWQgLSBoZWFkZXJfc2l6ZV9pbmNyZW1lbnQ7CisgICAgLyogYm91bmRhcnkgY2hlY2sgZmFpbHM/ICovCisgICAgaWYgKCh1OF90ICopcC0+cGF5bG9hZCA8ICh1OF90ICopcCArIFNJWkVPRl9TVFJVQ1RfUEJVRikgeworICAgICAgTFdJUF9ERUJVR0YoIFBCVUZfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgICAoInBidWZfaGVhZGVyOiBmYWlsZWQgYXMgJXAgPCAlcCAobm90IGVub3VnaCBzcGFjZSBmb3IgbmV3IGhlYWRlciBzaXplKVxuIiwKKyAgICAgICAgKHZvaWQgKilwLT5wYXlsb2FkLCAodm9pZCAqKShwICsgMSkpKTsKKyAgICAgIC8qIHJlc3RvcmUgb2xkIHBheWxvYWQgcG9pbnRlciAqLworICAgICAgcC0+cGF5bG9hZCA9IHBheWxvYWQ7CisgICAgICAvKiBiYWlsIG91dCB1bnN1Y2Nlc2Z1bGx5ICovCisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIC8qIHBidWYgdHlwZXMgcmVmZXJpbmcgdG8gZXh0ZXJuYWwgcGF5bG9hZHM/ICovCisgIH0gZWxzZSBpZiAodHlwZSA9PSBQQlVGX1JFRiB8fCB0eXBlID09IFBCVUZfUk9NKSB7CisgICAgLyogaGlkZSBhIGhlYWRlciBpbiB0aGUgcGF5bG9hZD8gKi8KKyAgICBpZiAoKGhlYWRlcl9zaXplX2luY3JlbWVudCA8IDApICYmIChpbmNyZW1lbnRfbWFnbml0dWRlIDw9IHAtPmxlbikpIHsKKyAgICAgIC8qIGluY3JlYXNlIHBheWxvYWQgcG9pbnRlciAqLworICAgICAgcC0+cGF5bG9hZCA9ICh1OF90ICopcC0+cGF5bG9hZCAtIGhlYWRlcl9zaXplX2luY3JlbWVudDsKKyAgICB9IGVsc2UgeworICAgICAgLyogY2Fubm90IGV4cGFuZCBwYXlsb2FkIHRvIGZyb250ICh5ZXQhKQorICAgICAgICogYmFpbCBvdXQgdW5zdWNjZXNmdWxseSAqLworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIFVua25vd24gdHlwZSAqLworICAgIExXSVBfQVNTRVJUKCJiYWQgcGJ1ZiB0eXBlIiwgMCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLyogbW9kaWZ5IHBidWYgbGVuZ3RoIGZpZWxkcyAqLworICBwLT5sZW4gKz0gaGVhZGVyX3NpemVfaW5jcmVtZW50OworICBwLT50b3RfbGVuICs9IGhlYWRlcl9zaXplX2luY3JlbWVudDsKKworICBMV0lQX0RFQlVHRihQQlVGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgicGJ1Zl9oZWFkZXI6IG9sZCAlcCBuZXcgJXAgKCUiUzE2X0YiKVxuIiwKKyAgICAodm9pZCAqKXBheWxvYWQsICh2b2lkICopcC0+cGF5bG9hZCwgaGVhZGVyX3NpemVfaW5jcmVtZW50KSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVyZWZlcmVuY2UgYSBwYnVmIGNoYWluIG9yIHF1ZXVlIGFuZCBkZWFsbG9jYXRlIGFueSBuby1sb25nZXItdXNlZAorICogcGJ1ZnMgYXQgdGhlIGhlYWQgb2YgdGhpcyBjaGFpbiBvciBxdWV1ZS4KKyAqCisgKiBEZWNyZW1lbnRzIHRoZSBwYnVmIHJlZmVyZW5jZSBjb3VudC4gSWYgaXQgcmVhY2hlcyB6ZXJvLCB0aGUgcGJ1ZiBpcworICogZGVhbGxvY2F0ZWQuCisgKgorICogRm9yIGEgcGJ1ZiBjaGFpbiwgdGhpcyBpcyByZXBlYXRlZCBmb3IgZWFjaCBwYnVmIGluIHRoZSBjaGFpbiwKKyAqIHVwIHRvIHRoZSBmaXJzdCBwYnVmIHdoaWNoIGhhcyBhIG5vbi16ZXJvIHJlZmVyZW5jZSBjb3VudCBhZnRlcgorICogZGVjcmVtZW50aW5nLiBTbywgd2hlbiBhbGwgcmVmZXJlbmNlIGNvdW50cyBhcmUgb25lLCB0aGUgd2hvbGUKKyAqIGNoYWluIGlzIGZyZWUnZC4KKyAqCisgKiBAcGFyYW0gcCBUaGUgcGJ1ZiAoY2hhaW4pIHRvIGJlIGRlcmVmZXJlbmNlZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGJ1ZnMgdGhhdCB3ZXJlIGRlLWFsbG9jYXRlZAorICogZnJvbSB0aGUgaGVhZCBvZiB0aGUgY2hhaW4uCisgKgorICogQG5vdGUgTVVTVCBOT1QgYmUgY2FsbGVkIG9uIGEgcGFja2V0IHF1ZXVlIChOb3QgdmVyaWZpZWQgdG8gd29yayB5ZXQpLgorICogQG5vdGUgdGhlIHJlZmVyZW5jZSBjb3VudGVyIG9mIGEgcGJ1ZiBlcXVhbHMgdGhlIG51bWJlciBvZiBwb2ludGVycworICogdGhhdCByZWZlciB0byB0aGUgcGJ1ZiAob3IgaW50byB0aGUgcGJ1ZikuCisgKgorICogQGludGVybmFsIGV4YW1wbGVzOgorICoKKyAqIEFzc3VtaW5nIGV4aXN0aW5nIGNoYWlucyBhLT5iLT5jIHdpdGggdGhlIGZvbGxvd2luZyByZWZlcmVuY2UKKyAqIGNvdW50cywgY2FsbGluZyBwYnVmX2ZyZWUoYSkgcmVzdWx0cyBpbjoKKyAqIAorICogMS0+Mi0+MyBiZWNvbWVzIC4uLjEtPjMKKyAqIDMtPjMtPjMgYmVjb21lcyAyLT4zLT4zCisgKiAxLT4xLT4yIGJlY29tZXMgLi4uLi4uMQorICogMi0+MS0+MSBiZWNvbWVzIDEtPjEtPjEKKyAqIDEtPjEtPjEgYmVjb21lcyAuLi4uLi4uCisgKgorICovCit1OF90CitwYnVmX2ZyZWUoc3RydWN0IHBidWYgKnApCit7CisgIHUxNl90IHR5cGU7CisgIHN0cnVjdCBwYnVmICpxOworICB1OF90IGNvdW50OworCisgIGlmIChwID09IE5VTEwpIHsKKyAgICBMV0lQX0FTU0VSVCgicCAhPSBOVUxMIiwgcCAhPSBOVUxMKTsKKyAgICAvKiBpZiBhc3NlcnRpb25zIGFyZSBkaXNhYmxlZCwgcHJvY2VlZCB3aXRoIGRlYnVnIG91dHB1dCAqLworICAgIExXSVBfREVCVUdGKFBCVUZfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgKCJwYnVmX2ZyZWUocCA9PSBOVUxMKSB3YXMgY2FsbGVkLlxuIikpOworICAgIHJldHVybiAwOworICB9CisgIExXSVBfREVCVUdGKFBCVUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJwYnVmX2ZyZWUoJXApXG4iLCAodm9pZCAqKXApKTsKKworICBQRVJGX1NUQVJUOworCisgIExXSVBfQVNTRVJUKCJwYnVmX2ZyZWU6IHNhbmUgdHlwZSIsCisgICAgcC0+dHlwZSA9PSBQQlVGX1JBTSB8fCBwLT50eXBlID09IFBCVUZfUk9NIHx8CisgICAgcC0+dHlwZSA9PSBQQlVGX1JFRiB8fCBwLT50eXBlID09IFBCVUZfUE9PTCk7CisKKyAgY291bnQgPSAwOworICAvKiBkZS1hbGxvY2F0ZSBhbGwgY29uc2VjdXRpdmUgcGJ1ZnMgZnJvbSB0aGUgaGVhZCBvZiB0aGUgY2hhaW4gdGhhdAorICAgKiBvYnRhaW4gYSB6ZXJvIHJlZmVyZW5jZSBjb3VudCBhZnRlciBkZWNyZW1lbnRpbmcqLworICB3aGlsZSAocCAhPSBOVUxMKSB7CisgICAgdTE2X3QgcmVmOworICAgIFNZU19BUkNIX0RFQ0xfUFJPVEVDVChvbGRfbGV2ZWwpOworICAgIC8qIFNpbmNlIGRlY3JlbWVudGluZyByZWYgY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gYmUgYSBzaW5nbGUgbWFjaGluZSBvcGVyYXRpb24KKyAgICAgKiB3ZSBtdXN0IHByb3RlY3QgaXQuIFdlIHB1dCB0aGUgbmV3IHJlZiBpbnRvIGEgbG9jYWwgdmFyaWFibGUgdG8gcHJldmVudAorICAgICAqIGZ1cnRoZXIgcHJvdGVjdGlvbi4gKi8KKyAgICBTWVNfQVJDSF9QUk9URUNUKG9sZF9sZXZlbCk7CisgICAgLyogYWxsIHBidWZzIGluIGEgY2hhaW4gYXJlIHJlZmVyZW5jZWQgYXQgbGVhc3Qgb25jZSAqLworICAgIExXSVBfQVNTRVJUKCJwYnVmX2ZyZWU6IHAtPnJlZiA+IDAiLCBwLT5yZWYgPiAwKTsKKyAgICAvKiBkZWNyZWFzZSByZWZlcmVuY2UgY291bnQgKG51bWJlciBvZiBwb2ludGVycyB0byBwYnVmKSAqLworICAgIHJlZiA9IC0tKHAtPnJlZik7CisgICAgU1lTX0FSQ0hfVU5QUk9URUNUKG9sZF9sZXZlbCk7CisgICAgLyogdGhpcyBwYnVmIGlzIG5vIGxvbmdlciByZWZlcmVuY2VkIHRvPyAqLworICAgIGlmIChyZWYgPT0gMCkgeworICAgICAgLyogcmVtZW1iZXIgbmV4dCBwYnVmIGluIGNoYWluIGZvciBuZXh0IGl0ZXJhdGlvbiAqLworICAgICAgcSA9IHAtPm5leHQ7CisgICAgICBMV0lQX0RFQlVHRiggUEJVRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInBidWZfZnJlZTogZGVhbGxvY2F0aW5nICVwXG4iLCAodm9pZCAqKXApKTsKKyAgICAgIHR5cGUgPSBwLT50eXBlOworI2lmIExXSVBfU1VQUE9SVF9DVVNUT01fUEJVRgorICAgICAgLyogaXMgdGhpcyBhIGN1c3RvbSBwYnVmPyAqLworICAgICAgaWYgKChwLT5mbGFncyAmIFBCVUZfRkxBR19JU19DVVNUT00pICE9IDApIHsKKyAgICAgICAgc3RydWN0IHBidWZfY3VzdG9tICpwYyA9IChzdHJ1Y3QgcGJ1Zl9jdXN0b20qKXA7CisgICAgICAgIExXSVBfQVNTRVJUKCJwYy0+Y3VzdG9tX2ZyZWVfZnVuY3Rpb24gIT0gTlVMTCIsIHBjLT5jdXN0b21fZnJlZV9mdW5jdGlvbiAhPSBOVUxMKTsKKyAgICAgICAgcGMtPmN1c3RvbV9mcmVlX2Z1bmN0aW9uKHApOworICAgICAgfSBlbHNlCisjZW5kaWYgLyogTFdJUF9TVVBQT1JUX0NVU1RPTV9QQlVGICovCisgICAgICB7CisgICAgICAgIC8qIGlzIHRoaXMgYSBwYnVmIGZyb20gdGhlIHBvb2w/ICovCisgICAgICAgIGlmICh0eXBlID09IFBCVUZfUE9PTCkgeworICAgICAgICAgIG1lbXBfZnJlZShNRU1QX1BCVUZfUE9PTCwgcCk7CisgICAgICAgIC8qIGlzIHRoaXMgYSBST00gb3IgUkFNIHJlZmVyZW5jaW5nIHBidWY/ICovCisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBQQlVGX1JPTSB8fCB0eXBlID09IFBCVUZfUkVGKSB7CisgICAgICAgICAgbWVtcF9mcmVlKE1FTVBfUEJVRiwgcCk7CisgICAgICAgIC8qIHR5cGUgPT0gUEJVRl9SQU0gKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZW1fZnJlZShwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY291bnQrKzsKKyAgICAgIC8qIHByb2NlZWQgdG8gbmV4dCBwYnVmICovCisgICAgICBwID0gcTsKKyAgICAvKiBwLT5yZWYgPiAwLCB0aGlzIHBidWYgaXMgc3RpbGwgcmVmZXJlbmNlZCB0byAqLworICAgIC8qIChhbmQgc28gdGhlIHJlbWFpbmluZyBwYnVmcyBpbiBjaGFpbiBhcyB3ZWxsKSAqLworICAgIH0gZWxzZSB7CisgICAgICBMV0lQX0RFQlVHRiggUEJVRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInBidWZfZnJlZTogJXAgaGFzIHJlZiAlIlUxNl9GIiwgZW5kaW5nIGhlcmUuXG4iLCAodm9pZCAqKXAsIHJlZikpOworICAgICAgLyogc3RvcCB3YWxraW5nIHRocm91Z2ggdGhlIGNoYWluICovCisgICAgICBwID0gTlVMTDsKKyAgICB9CisgIH0KKyAgUEVSRl9TVE9QKCJwYnVmX2ZyZWUiKTsKKyAgLyogcmV0dXJuIG51bWJlciBvZiBkZS1hbGxvY2F0ZWQgcGJ1ZnMgKi8KKyAgcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIENvdW50IG51bWJlciBvZiBwYnVmcyBpbiBhIGNoYWluCisgKgorICogQHBhcmFtIHAgZmlyc3QgcGJ1ZiBvZiBjaGFpbgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBidWZzIGluIGEgY2hhaW4KKyAqLworCit1OF90CitwYnVmX2NsZW4oc3RydWN0IHBidWYgKnApCit7CisgIHU4X3QgbGVuOworCisgIGxlbiA9IDA7CisgIHdoaWxlIChwICE9IE5VTEwpIHsKKyAgICArK2xlbjsKKyAgICBwID0gcC0+bmV4dDsKKyAgfQorICByZXR1cm4gbGVuOworfQorCisvKioKKyAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBwYnVmLgorICoKKyAqIEBwYXJhbSBwIHBidWYgdG8gaW5jcmVhc2UgcmVmZXJlbmNlIGNvdW50ZXIgb2YKKyAqCisgKi8KK3ZvaWQKK3BidWZfcmVmKHN0cnVjdCBwYnVmICpwKQoreworICBTWVNfQVJDSF9ERUNMX1BST1RFQ1Qob2xkX2xldmVsKTsKKyAgLyogcGJ1ZiBnaXZlbj8gKi8KKyAgaWYgKHAgIT0gTlVMTCkgeworICAgIFNZU19BUkNIX1BST1RFQ1Qob2xkX2xldmVsKTsKKyAgICArKyhwLT5yZWYpOworICAgIFNZU19BUkNIX1VOUFJPVEVDVChvbGRfbGV2ZWwpOworICB9Cit9CisKKy8qKgorICogQ29uY2F0ZW5hdGUgdHdvIHBidWZzIChlYWNoIG1heSBiZSBhIHBidWYgY2hhaW4pIGFuZCB0YWtlIG92ZXIKKyAqIHRoZSBjYWxsZXIncyByZWZlcmVuY2Ugb2YgdGhlIHRhaWwgcGJ1Zi4KKyAqIAorICogQG5vdGUgVGhlIGNhbGxlciBNQVkgTk9UIHJlZmVyZW5jZSB0aGUgdGFpbCBwYnVmIGFmdGVyd2FyZHMuCisgKiBVc2UgcGJ1Zl9jaGFpbigpIGZvciB0aGF0IHB1cnBvc2UuCisgKiAKKyAqIEBzZWUgcGJ1Zl9jaGFpbigpCisgKi8KKwordm9pZAorcGJ1Zl9jYXQoc3RydWN0IHBidWYgKmgsIHN0cnVjdCBwYnVmICp0KQoreworICBzdHJ1Y3QgcGJ1ZiAqcDsKKworICBMV0lQX0VSUk9SKCIoaCAhPSBOVUxMKSAmJiAodCAhPSBOVUxMKSAocHJvZ3JhbW1lciB2aW9sYXRlcyBBUEkpIiwKKyAgICAgICAgICAgICAoKGggIT0gTlVMTCkgJiYgKHQgIT0gTlVMTCkpLCByZXR1cm47KTsKKworICAvKiBwcm9jZWVkIHRvIGxhc3QgcGJ1ZiBvZiBjaGFpbiAqLworICBmb3IgKHAgPSBoOyBwLT5uZXh0ICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7CisgICAgLyogYWRkIHRvdGFsIGxlbmd0aCBvZiBzZWNvbmQgY2hhaW4gdG8gYWxsIHRvdGFscyBvZiBmaXJzdCBjaGFpbiAqLworICAgIHAtPnRvdF9sZW4gKz0gdC0+dG90X2xlbjsKKyAgfQorICAvKiB7IHAgaXMgbGFzdCBwYnVmIG9mIGZpcnN0IGggY2hhaW4sIHAtPm5leHQgPT0gTlVMTCB9ICovCisgIExXSVBfQVNTRVJUKCJwLT50b3RfbGVuID09IHAtPmxlbiAob2YgbGFzdCBwYnVmIGluIGNoYWluKSIsIHAtPnRvdF9sZW4gPT0gcC0+bGVuKTsKKyAgTFdJUF9BU1NFUlQoInAtPm5leHQgPT0gTlVMTCIsIHAtPm5leHQgPT0gTlVMTCk7CisgIC8qIGFkZCB0b3RhbCBsZW5ndGggb2Ygc2Vjb25kIGNoYWluIHRvIGxhc3QgcGJ1ZiB0b3RhbCBvZiBmaXJzdCBjaGFpbiAqLworICBwLT50b3RfbGVuICs9IHQtPnRvdF9sZW47CisgIC8qIGNoYWluIGxhc3QgcGJ1ZiBvZiBoZWFkIChwKSB3aXRoIGZpcnN0IG9mIHRhaWwgKHQpICovCisgIHAtPm5leHQgPSB0OworICAvKiBwLT5uZXh0IG5vdyByZWZlcmVuY2VzIHQsIGJ1dCB0aGUgY2FsbGVyIHdpbGwgZHJvcCBpdHMgcmVmZXJlbmNlIHRvIHQsCisgICAqIHNvIG5ldHRvIHRoZXJlIGlzIG5vIGNoYW5nZSB0byB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHQuCisgICAqLworfQorCisvKioKKyAqIENoYWluIHR3byBwYnVmcyAob3IgcGJ1ZiBjaGFpbnMpIHRvZ2V0aGVyLgorICogCisgKiBUaGUgY2FsbGVyIE1VU1QgY2FsbCBwYnVmX2ZyZWUodCkgb25jZSBpdCBoYXMgc3RvcHBlZAorICogdXNpbmcgaXQuIFVzZSBwYnVmX2NhdCgpIGluc3RlYWQgaWYgeW91IG5vIGxvbmdlciB1c2UgdC4KKyAqIAorICogQHBhcmFtIGggaGVhZCBwYnVmIChjaGFpbikKKyAqIEBwYXJhbSB0IHRhaWwgcGJ1ZiAoY2hhaW4pCisgKiBAbm90ZSBUaGUgcGJ1ZnMgTVVTVCBiZWxvbmcgdG8gdGhlIHNhbWUgcGFja2V0LgorICogQG5vdGUgTUFZIE5PVCBiZSBjYWxsZWQgb24gYSBwYWNrZXQgcXVldWUuCisgKgorICogVGhlIC0+dG90X2xlbiBmaWVsZHMgb2YgYWxsIHBidWZzIG9mIHRoZSBoZWFkIGNoYWluIGFyZSBhZGp1c3RlZC4KKyAqIFRoZSAtPm5leHQgZmllbGQgb2YgdGhlIGxhc3QgcGJ1ZiBvZiB0aGUgaGVhZCBjaGFpbiBpcyBhZGp1c3RlZC4KKyAqIFRoZSAtPnJlZiBmaWVsZCBvZiB0aGUgZmlyc3QgcGJ1ZiBvZiB0aGUgdGFpbCBjaGFpbiBpcyBhZGp1c3RlZC4KKyAqCisgKi8KK3ZvaWQKK3BidWZfY2hhaW4oc3RydWN0IHBidWYgKmgsIHN0cnVjdCBwYnVmICp0KQoreworICBwYnVmX2NhdChoLCB0KTsKKyAgLyogdCBpcyBub3cgcmVmZXJlbmNlZCBieSBoICovCisgIHBidWZfcmVmKHQpOworICBMV0lQX0RFQlVHRihQQlVGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgicGJ1Zl9jaGFpbjogJXAgcmVmZXJlbmNlcyAlcFxuIiwgKHZvaWQgKiloLCAodm9pZCAqKXQpKTsKK30KKworLyoqCisgKiBEZWNoYWlucyB0aGUgZmlyc3QgcGJ1ZiBmcm9tIGl0cyBzdWNjZWVkaW5nIHBidWZzIGluIHRoZSBjaGFpbi4KKyAqCisgKiBNYWtlcyBwLT50b3RfbGVuIGZpZWxkIGVxdWFsIHRvIHAtPmxlbi4KKyAqIEBwYXJhbSBwIHBidWYgdG8gZGVjaGFpbgorICogQHJldHVybiByZW1haW5kZXIgb2YgdGhlIHBidWYgY2hhaW4sIG9yIE5VTEwgaWYgaXQgd2FzIGRlLWFsbG9jYXRlZC4KKyAqIEBub3RlIE1heSBub3QgYmUgY2FsbGVkIG9uIGEgcGFja2V0IHF1ZXVlLgorICovCitzdHJ1Y3QgcGJ1ZiAqCitwYnVmX2RlY2hhaW4oc3RydWN0IHBidWYgKnApCit7CisgIHN0cnVjdCBwYnVmICpxOworICB1OF90IHRhaWxfZ29uZSA9IDE7CisgIC8qIHRhaWwgKi8KKyAgcSA9IHAtPm5leHQ7CisgIC8qIHBidWYgaGFzIHN1Y2Nlc3NvciBpbiBjaGFpbj8gKi8KKyAgaWYgKHEgIT0gTlVMTCkgeworICAgIC8qIGFzc2VydCB0b3RfbGVuIGludmFyaWFudDogKHAtPnRvdF9sZW4gPT0gcC0+bGVuICsgKHAtPm5leHQ/IHAtPm5leHQtPnRvdF9sZW46IDApICovCisgICAgTFdJUF9BU1NFUlQoInAtPnRvdF9sZW4gPT0gcC0+bGVuICsgcS0+dG90X2xlbiIsIHEtPnRvdF9sZW4gPT0gcC0+dG90X2xlbiAtIHAtPmxlbik7CisgICAgLyogZW5mb3JjZSBpbnZhcmlhbnQgaWYgYXNzZXJ0aW9uIGlzIGRpc2FibGVkICovCisgICAgcS0+dG90X2xlbiA9IHAtPnRvdF9sZW4gLSBwLT5sZW47CisgICAgLyogZGVjb3VwbGUgcGJ1ZiBmcm9tIHJlbWFpbmRlciAqLworICAgIHAtPm5leHQgPSBOVUxMOworICAgIC8qIHRvdGFsIGxlbmd0aCBvZiBwYnVmIHAgaXMgaXRzIG93biBsZW5ndGggb25seSAqLworICAgIHAtPnRvdF9sZW4gPSBwLT5sZW47CisgICAgLyogcSBpcyBubyBsb25nZXIgcmVmZXJlbmNlZCBieSBwLCBmcmVlIGl0ICovCisgICAgTFdJUF9ERUJVR0YoUEJVRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInBidWZfZGVjaGFpbjogdW5yZWZlcmVuY2luZyAlcFxuIiwgKHZvaWQgKilxKSk7CisgICAgdGFpbF9nb25lID0gcGJ1Zl9mcmVlKHEpOworICAgIGlmICh0YWlsX2dvbmUgPiAwKSB7CisgICAgICBMV0lQX0RFQlVHRihQQlVGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsCisgICAgICAgICAgICAgICAgICAoInBidWZfZGVjaGFpbjogZGVhbGxvY2F0ZWQgJXAgKGFzIGl0IGlzIG5vIGxvbmdlciByZWZlcmVuY2VkKVxuIiwgKHZvaWQgKilxKSk7CisgICAgfQorICAgIC8qIHJldHVybiByZW1haW5pbmcgdGFpbCBvciBOVUxMIGlmIGRlYWxsb2NhdGVkICovCisgIH0KKyAgLyogYXNzZXJ0IHRvdF9sZW4gaW52YXJpYW50OiAocC0+dG90X2xlbiA9PSBwLT5sZW4gKyAocC0+bmV4dD8gcC0+bmV4dC0+dG90X2xlbjogMCkgKi8KKyAgTFdJUF9BU1NFUlQoInAtPnRvdF9sZW4gPT0gcC0+bGVuIiwgcC0+dG90X2xlbiA9PSBwLT5sZW4pOworICByZXR1cm4gKCh0YWlsX2dvbmUgPiAwKSA/IE5VTEwgOiBxKTsKK30KKworLyoqCisgKgorICogQ3JlYXRlIFBCVUZfUkFNIGNvcGllcyBvZiBwYnVmcy4KKyAqCisgKiBVc2VkIHRvIHF1ZXVlIHBhY2tldHMgb24gYmVoYWxmIG9mIHRoZSBsd0lQIHN0YWNrLCBzdWNoIGFzCisgKiBBUlAgYmFzZWQgcXVldWVpbmcuCisgKgorICogQG5vdGUgWW91IE1VU1QgZXhwbGljaXRseSB1c2UgcCA9IHBidWZfdGFrZShwKTsKKyAqCisgKiBAbm90ZSBPbmx5IG9uZSBwYWNrZXQgaXMgY29waWVkLCBubyBwYWNrZXQgcXVldWUhCisgKgorICogQHBhcmFtIHBfdG8gcGJ1ZiBkZXN0aW5hdGlvbiBvZiB0aGUgY29weQorICogQHBhcmFtIHBfZnJvbSBwYnVmIHNvdXJjZSBvZiB0aGUgY29weQorICoKKyAqIEByZXR1cm4gRVJSX09LIGlmIHBidWYgd2FzIGNvcGllZAorICogICAgICAgICBFUlJfQVJHIGlmIG9uZSBvZiB0aGUgcGJ1ZnMgaXMgTlVMTCBvciBwX3RvIGlzIG5vdCBiaWcKKyAqICAgICAgICAgICAgICAgICBlbm91Z2ggdG8gaG9sZCBwX2Zyb20KKyAqLworZXJyX3QKK3BidWZfY29weShzdHJ1Y3QgcGJ1ZiAqcF90bywgc3RydWN0IHBidWYgKnBfZnJvbSkKK3sKKyAgdTE2X3Qgb2Zmc2V0X3RvPTAsIG9mZnNldF9mcm9tPTAsIGxlbjsKKworICBMV0lQX0RFQlVHRihQQlVGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgicGJ1Zl9jb3B5KCVwLCAlcClcbiIsCisgICAgKHZvaWQqKXBfdG8sICh2b2lkKilwX2Zyb20pKTsKKworICAvKiBpcyB0aGUgdGFyZ2V0IGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgc291cmNlPyAqLworICBMV0lQX0VSUk9SKCJwYnVmX2NvcHk6IHRhcmdldCBub3QgYmlnIGVub3VnaCB0byBob2xkIHNvdXJjZSIsICgocF90byAhPSBOVUxMKSAmJgorICAgICAgICAgICAgIChwX2Zyb20gIT0gTlVMTCkgJiYgKHBfdG8tPnRvdF9sZW4gPj0gcF9mcm9tLT50b3RfbGVuKSksIHJldHVybiBFUlJfQVJHOyk7CisKKyAgLyogaXRlcmF0ZSB0aHJvdWdoIHBidWYgY2hhaW4gKi8KKyAgZG8KKyAgeworICAgIExXSVBfQVNTRVJUKCJwX3RvICE9IE5VTEwiLCBwX3RvICE9IE5VTEwpOworICAgIC8qIGNvcHkgb25lIHBhcnQgb2YgdGhlIG9yaWdpbmFsIGNoYWluICovCisgICAgaWYgKChwX3RvLT5sZW4gLSBvZmZzZXRfdG8pID49IChwX2Zyb20tPmxlbiAtIG9mZnNldF9mcm9tKSkgeworICAgICAgLyogY29tcGxldGUgY3VycmVudCBwX2Zyb20gZml0cyBpbnRvIGN1cnJlbnQgcF90byAqLworICAgICAgbGVuID0gcF9mcm9tLT5sZW4gLSBvZmZzZXRfZnJvbTsKKyAgICB9IGVsc2UgeworICAgICAgLyogY3VycmVudCBwX2Zyb20gZG9lcyBub3QgZml0IGludG8gY3VycmVudCBwX3RvICovCisgICAgICBsZW4gPSBwX3RvLT5sZW4gLSBvZmZzZXRfdG87CisgICAgfQorICAgIE1FTUNQWSgodThfdCopcF90by0+cGF5bG9hZCArIG9mZnNldF90bywgKHU4X3QqKXBfZnJvbS0+cGF5bG9hZCArIG9mZnNldF9mcm9tLCBsZW4pOworICAgIG9mZnNldF90byArPSBsZW47CisgICAgb2Zmc2V0X2Zyb20gKz0gbGVuOworICAgIExXSVBfQVNTRVJUKCJvZmZzZXRfdG8gPD0gcF90by0+bGVuIiwgb2Zmc2V0X3RvIDw9IHBfdG8tPmxlbik7CisgICAgaWYgKG9mZnNldF90byA9PSBwX3RvLT5sZW4pIHsKKyAgICAgIC8qIG9uIHRvIG5leHQgcF90byAoaWYgYW55KSAqLworICAgICAgb2Zmc2V0X3RvID0gMDsKKyAgICAgIHBfdG8gPSBwX3RvLT5uZXh0OworICAgIH0KKyAgICBMV0lQX0FTU0VSVCgib2Zmc2V0X2Zyb20gPD0gcF9mcm9tLT5sZW4iLCBvZmZzZXRfZnJvbSA8PSBwX2Zyb20tPmxlbik7CisgICAgaWYgKG9mZnNldF9mcm9tID49IHBfZnJvbS0+bGVuKSB7CisgICAgICAvKiBvbiB0byBuZXh0IHBfZnJvbSAoaWYgYW55KSAqLworICAgICAgb2Zmc2V0X2Zyb20gPSAwOworICAgICAgcF9mcm9tID0gcF9mcm9tLT5uZXh0OworICAgIH0KKworICAgIGlmKChwX2Zyb20gIT0gTlVMTCkgJiYgKHBfZnJvbS0+bGVuID09IHBfZnJvbS0+dG90X2xlbikpIHsKKyAgICAgIC8qIGRvbid0IGNvcHkgbW9yZSB0aGFuIG9uZSBwYWNrZXQhICovCisgICAgICBMV0lQX0VSUk9SKCJwYnVmX2NvcHkoKSBkb2VzIG5vdCBhbGxvdyBwYWNrZXQgcXVldWVzIVxuIiwKKyAgICAgICAgICAgICAgICAgKHBfZnJvbS0+bmV4dCA9PSBOVUxMKSwgcmV0dXJuIEVSUl9WQUw7KTsKKyAgICB9CisgICAgaWYoKHBfdG8gIT0gTlVMTCkgJiYgKHBfdG8tPmxlbiA9PSBwX3RvLT50b3RfbGVuKSkgeworICAgICAgLyogZG9uJ3QgY29weSBtb3JlIHRoYW4gb25lIHBhY2tldCEgKi8KKyAgICAgIExXSVBfRVJST1IoInBidWZfY29weSgpIGRvZXMgbm90IGFsbG93IHBhY2tldCBxdWV1ZXMhXG4iLAorICAgICAgICAgICAgICAgICAgKHBfdG8tPm5leHQgPT0gTlVMTCksIHJldHVybiBFUlJfVkFMOyk7CisgICAgfQorICB9IHdoaWxlIChwX2Zyb20pOworICBMV0lQX0RFQlVHRihQQlVGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgicGJ1Zl9jb3B5OiBlbmQgb2YgY2hhaW4gcmVhY2hlZC5cbiIpKTsKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBDb3B5IChwYXJ0IG9mKSB0aGUgY29udGVudHMgb2YgYSBwYWNrZXQgYnVmZmVyCisgKiB0byBhbiBhcHBsaWNhdGlvbiBzdXBwbGllZCBidWZmZXIuCisgKgorICogQHBhcmFtIGJ1ZiB0aGUgcGJ1ZiBmcm9tIHdoaWNoIHRvIGNvcHkgZGF0YQorICogQHBhcmFtIGRhdGFwdHIgdGhlIGFwcGxpY2F0aW9uIHN1cHBsaWVkIGJ1ZmZlcgorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgZGF0YSB0byBjb3B5IChkYXRhcHRyIG11c3QgYmUgYmlnIGVub3VnaCkuIE5vIG1vcmUgCisgKiB0aGFuIGJ1Zi0+dG90X2xlbiB3aWxsIGJlIGNvcGllZCwgaXJyZXNwZWN0aXZlIG9mIGxlbgorICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW50byB0aGUgcGFja2V0IGJ1ZmZlciBmcm9tIHdoZXJlIHRvIGJlZ2luIGNvcHlpbmcgbGVuIGJ5dGVzCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLCBvciAwIG9uIGZhaWx1cmUKKyAqLwordTE2X3QKK3BidWZfY29weV9wYXJ0aWFsKHN0cnVjdCBwYnVmICpidWYsIHZvaWQgKmRhdGFwdHIsIHUxNl90IGxlbiwgdTE2X3Qgb2Zmc2V0KQoreworICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgdTE2X3QgbGVmdDsKKyAgdTE2X3QgYnVmX2NvcHlfbGVuOworICB1MTZfdCBjb3BpZWRfdG90YWwgPSAwOworCisgIExXSVBfRVJST1IoInBidWZfY29weV9wYXJ0aWFsOiBpbnZhbGlkIGJ1ZiIsIChidWYgIT0gTlVMTCksIHJldHVybiAwOyk7CisgIExXSVBfRVJST1IoInBidWZfY29weV9wYXJ0aWFsOiBpbnZhbGlkIGRhdGFwdHIiLCAoZGF0YXB0ciAhPSBOVUxMKSwgcmV0dXJuIDA7KTsKKworICBsZWZ0ID0gMDsKKworICBpZigoYnVmID09IE5VTEwpIHx8IChkYXRhcHRyID09IE5VTEwpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBOb3RlIHNvbWUgc3lzdGVtcyB1c2UgYnl0ZSBjb3B5IGlmIGRhdGFwdHIgb3Igb25lIG9mIHRoZSBwYnVmIHBheWxvYWQgcG9pbnRlcnMgYXJlIHVuYWxpZ25lZC4gKi8KKyAgZm9yKHAgPSBidWY7IGxlbiAhPSAwICYmIHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpIHsKKyAgICBpZiAoKG9mZnNldCAhPSAwKSAmJiAob2Zmc2V0ID49IHAtPmxlbikpIHsKKyAgICAgIC8qIGRvbid0IGNvcHkgZnJvbSB0aGlzIGJ1ZmZlciAtPiBvbiB0byB0aGUgbmV4dCAqLworICAgICAgb2Zmc2V0IC09IHAtPmxlbjsKKyAgICB9IGVsc2UgeworICAgICAgLyogY29weSBmcm9tIHRoaXMgYnVmZmVyLiBtYXliZSBvbmx5IHBhcnRpYWxseS4gKi8KKyAgICAgIGJ1Zl9jb3B5X2xlbiA9IHAtPmxlbiAtIG9mZnNldDsKKyAgICAgIGlmIChidWZfY29weV9sZW4gPiBsZW4pCisgICAgICAgICAgYnVmX2NvcHlfbGVuID0gbGVuOworICAgICAgLyogY29weSB0aGUgbmVjZXNzYXJ5IHBhcnRzIG9mIHRoZSBidWZmZXIgKi8KKyAgICAgIE1FTUNQWSgmKChjaGFyKilkYXRhcHRyKVtsZWZ0XSwgJigoY2hhciopcC0+cGF5bG9hZClbb2Zmc2V0XSwgYnVmX2NvcHlfbGVuKTsKKyAgICAgIGNvcGllZF90b3RhbCArPSBidWZfY29weV9sZW47CisgICAgICBsZWZ0ICs9IGJ1Zl9jb3B5X2xlbjsKKyAgICAgIGxlbiAtPSBidWZfY29weV9sZW47CisgICAgICBvZmZzZXQgPSAwOworICAgIH0KKyAgfQorICByZXR1cm4gY29waWVkX3RvdGFsOworfQorCisvKioKKyAqIENvcHkgYXBwbGljYXRpb24gc3VwcGxpZWQgZGF0YSBpbnRvIGEgcGJ1Zi4KKyAqIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCB0byBjb3B5IHRoZSBlcXVpdmFsZW50IG9mIGJ1Zi0+dG90X2xlbiBkYXRhLgorICoKKyAqIEBwYXJhbSBidWYgcGJ1ZiB0byBmaWxsIHdpdGggZGF0YQorICogQHBhcmFtIGRhdGFwdHIgYXBwbGljYXRpb24gc3VwcGxpZWQgZGF0YSBidWZmZXIKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHRoZSBhcHBsaWNhdGlvbiBzdXBwbGllZCBkYXRhIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIEVSUl9NRU0gaWYgdGhlIHBidWYgaXMgbm90IGJpZyBlbm91Z2gKKyAqLworZXJyX3QKK3BidWZfdGFrZShzdHJ1Y3QgcGJ1ZiAqYnVmLCBjb25zdCB2b2lkICpkYXRhcHRyLCB1MTZfdCBsZW4pCit7CisgIHN0cnVjdCBwYnVmICpwOworICB1MTZfdCBidWZfY29weV9sZW47CisgIHUxNl90IHRvdGFsX2NvcHlfbGVuID0gbGVuOworICB1MTZfdCBjb3BpZWRfdG90YWwgPSAwOworCisgIExXSVBfRVJST1IoInBidWZfdGFrZTogaW52YWxpZCBidWYiLCAoYnVmICE9IE5VTEwpLCByZXR1cm4gMDspOworICBMV0lQX0VSUk9SKCJwYnVmX3Rha2U6IGludmFsaWQgZGF0YXB0ciIsIChkYXRhcHRyICE9IE5VTEwpLCByZXR1cm4gMDspOworCisgIGlmICgoYnVmID09IE5VTEwpIHx8IChkYXRhcHRyID09IE5VTEwpIHx8IChidWYtPnRvdF9sZW4gPCBsZW4pKSB7CisgICAgcmV0dXJuIEVSUl9BUkc7CisgIH0KKworICAvKiBOb3RlIHNvbWUgc3lzdGVtcyB1c2UgYnl0ZSBjb3B5IGlmIGRhdGFwdHIgb3Igb25lIG9mIHRoZSBwYnVmIHBheWxvYWQgcG9pbnRlcnMgYXJlIHVuYWxpZ25lZC4gKi8KKyAgZm9yKHAgPSBidWY7IHRvdGFsX2NvcHlfbGVuICE9IDA7IHAgPSBwLT5uZXh0KSB7CisgICAgTFdJUF9BU1NFUlQoInBidWZfdGFrZTogaW52YWxpZCBwYnVmIiwgcCAhPSBOVUxMKTsKKyAgICBidWZfY29weV9sZW4gPSB0b3RhbF9jb3B5X2xlbjsKKyAgICBpZiAoYnVmX2NvcHlfbGVuID4gcC0+bGVuKSB7CisgICAgICAvKiB0aGlzIHBidWYgY2Fubm90IGhvbGQgYWxsIHJlbWFpbmluZyBkYXRhICovCisgICAgICBidWZfY29weV9sZW4gPSBwLT5sZW47CisgICAgfQorICAgIC8qIGNvcHkgdGhlIG5lY2Vzc2FyeSBwYXJ0cyBvZiB0aGUgYnVmZmVyICovCisgICAgTUVNQ1BZKHAtPnBheWxvYWQsICYoKGNoYXIqKWRhdGFwdHIpW2NvcGllZF90b3RhbF0sIGJ1Zl9jb3B5X2xlbik7CisgICAgdG90YWxfY29weV9sZW4gLT0gYnVmX2NvcHlfbGVuOworICAgIGNvcGllZF90b3RhbCArPSBidWZfY29weV9sZW47CisgIH0KKyAgTFdJUF9BU1NFUlQoImRpZCBub3QgY29weSBhbGwgZGF0YSIsIHRvdGFsX2NvcHlfbGVuID09IDAgJiYgY29waWVkX3RvdGFsID09IGxlbik7CisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNpbmdsZSBwYnVmIG91dCBvZiBhIHF1ZXVlIG9mIHBidWZzLgorICoKKyAqIEByZW1hcms6IEVpdGhlciB0aGUgc291cmNlIHBidWYgJ3AnIGlzIGZyZWVkIGJ5IHRoaXMgZnVuY3Rpb24gb3IgdGhlIG9yaWdpbmFsCisgKiAgICAgICAgICBwYnVmICdwJyBpcyByZXR1cm5lZCwgdGhlcmVmb3JlIHRoZSBjYWxsZXIgaGFzIHRvIGNoZWNrIHRoZSByZXN1bHQhCisgKgorICogQHBhcmFtIHAgdGhlIHNvdXJjZSBwYnVmCisgKiBAcGFyYW0gbGF5ZXIgcGJ1Zl9sYXllciBvZiB0aGUgbmV3IHBidWYKKyAqCisgKiBAcmV0dXJuIGEgbmV3LCBzaW5nbGUgcGJ1ZiAocC0+bmV4dCBpcyBOVUxMKQorICogICAgICAgICBvciB0aGUgb2xkIHBidWYgaWYgYWxsb2NhdGlvbiBmYWlscworICovCitzdHJ1Y3QgcGJ1ZioKK3BidWZfY29hbGVzY2Uoc3RydWN0IHBidWYgKnAsIHBidWZfbGF5ZXIgbGF5ZXIpCit7CisgIHN0cnVjdCBwYnVmICpxOworICBlcnJfdCBlcnI7CisgIGlmIChwLT5uZXh0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gcDsKKyAgfQorICBxID0gcGJ1Zl9hbGxvYyhsYXllciwgcC0+dG90X2xlbiwgUEJVRl9SQU0pOworICBpZiAocSA9PSBOVUxMKSB7CisgICAgLyogQHRvZG86IHdoYXQgZG8gd2UgZG8gbm93PyAqLworICAgIHJldHVybiBwOworICB9CisgIGVyciA9IHBidWZfY29weShxLCBwKTsKKyAgTFdJUF9BU1NFUlQoInBidWZfY29weSBmYWlsZWQiLCBlcnIgPT0gRVJSX09LKTsKKyAgcGJ1Zl9mcmVlKHApOworICByZXR1cm4gcTsKK30KKworI2lmIExXSVBfQ0hFQ0tTVU1fT05fQ09QWQorLyoqCisgKiBDb3BpZXMgZGF0YSBpbnRvIGEgc2luZ2xlIHBidWYgKCpub3QqIGludG8gYSBwYnVmIHF1ZXVlISkgYW5kIHVwZGF0ZXMKKyAqIHRoZSBjaGVja3N1bSB3aGlsZSBjb3B5aW5nCisgKgorICogQHBhcmFtIHAgdGhlIHBidWYgdG8gY29weSBkYXRhIGludG8KKyAqIEBwYXJhbSBzdGFydF9vZmZzZXQgb2Zmc2V0IG9mIHAtPnBheWxvYWQgd2hlcmUgdG8gY29weSB0aGUgZGF0YSB0bworICogQHBhcmFtIGRhdGFwdHIgZGF0YSB0byBjb3B5IGludG8gdGhlIHBidWYKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIGRhdGEgdG8gY29weSBpbnRvIHRoZSBwYnVmCisgKiBAcGFyYW0gY2hrc3VtIHBvaW50ZXIgdG8gdGhlIGNoZWNrc3VtIHdoaWNoIGlzIHVwZGF0ZWQKKyAqIEByZXR1cm4gRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIGFub3RoZXIgZXJyb3IgaWYgdGhlIGRhdGEgZG9lcyBub3QgZml0CisgKiAgICAgICAgIHdpdGhpbiB0aGUgKGZpcnN0KSBwYnVmIChubyBwYnVmIHF1ZXVlcyEpCisgKi8KK2Vycl90CitwYnVmX2ZpbGxfY2hrc3VtKHN0cnVjdCBwYnVmICpwLCB1MTZfdCBzdGFydF9vZmZzZXQsIGNvbnN0IHZvaWQgKmRhdGFwdHIsCisgICAgICAgICAgICAgICAgIHUxNl90IGxlbiwgdTE2X3QgKmNoa3N1bSkKK3sKKyAgdTMyX3QgYWNjOworICB1MTZfdCBjb3B5X2Noa3N1bTsKKyAgY2hhciAqZHN0X3B0cjsKKyAgTFdJUF9BU1NFUlQoInAgIT0gTlVMTCIsIHAgIT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJkYXRhcHRyICE9IE5VTEwiLCBkYXRhcHRyICE9IE5VTEwpOworICBMV0lQX0FTU0VSVCgiY2hrc3VtICE9IE5VTEwiLCBjaGtzdW0gIT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJsZW4gIT0gMCIsIGxlbiAhPSAwKTsKKworICBpZiAoKHN0YXJ0X29mZnNldCA+PSBwLT5sZW4pIHx8IChzdGFydF9vZmZzZXQgKyBsZW4gPiBwLT5sZW4pKSB7CisgICAgcmV0dXJuIEVSUl9BUkc7CisgIH0KKworICBkc3RfcHRyID0gKChjaGFyKilwLT5wYXlsb2FkKSArIHN0YXJ0X29mZnNldDsKKyAgY29weV9jaGtzdW0gPSBMV0lQX0NIS1NVTV9DT1BZKGRzdF9wdHIsIGRhdGFwdHIsIGxlbik7CisgIGlmICgoc3RhcnRfb2Zmc2V0ICYgMSkgIT0gMCkgeworICAgIGNvcHlfY2hrc3VtID0gU1dBUF9CWVRFU19JTl9XT1JEKGNvcHlfY2hrc3VtKTsKKyAgfQorICBhY2MgPSAqY2hrc3VtOworICBhY2MgKz0gY29weV9jaGtzdW07CisgICpjaGtzdW0gPSBGT0xEX1UzMlQoYWNjKTsKKyAgcmV0dXJuIEVSUl9PSzsKK30KKyNlbmRpZiAvKiBMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KKworIC8qKiBHZXQgb25lIGJ5dGUgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIGEgcGJ1ZgorICogV0FSTklORzogcmV0dXJucyB6ZXJvIGZvciBvZmZzZXQgPj0gcC0+dG90X2xlbgorICoKKyAqIEBwYXJhbSBwIHBidWYgdG8gcGFyc2UKKyAqIEBwYXJhbSBvZmZzZXQgb2Zmc2V0IGludG8gcCBvZiB0aGUgYnl0ZSB0byByZXR1cm4KKyAqIEByZXR1cm4gYnl0ZSBhdCBhbiBvZmZzZXQgaW50byBwIE9SIFpFUk8gSUYgJ29mZnNldCcgPj0gcC0+dG90X2xlbgorICovCit1OF90CitwYnVmX2dldF9hdChzdHJ1Y3QgcGJ1ZiogcCwgdTE2X3Qgb2Zmc2V0KQoreworICB1MTZfdCBjb3B5X2Zyb20gPSBvZmZzZXQ7CisgIHN0cnVjdCBwYnVmKiBxID0gcDsKKworICAvKiBnZXQgdGhlIGNvcnJlY3QgcGJ1ZiAqLworICB3aGlsZSAoKHEgIT0gTlVMTCkgJiYgKHEtPmxlbiA8PSBjb3B5X2Zyb20pKSB7CisgICAgY29weV9mcm9tIC09IHEtPmxlbjsKKyAgICBxID0gcS0+bmV4dDsKKyAgfQorICAvKiByZXR1cm4gcmVxdWVzdGVkIGRhdGEgaWYgcGJ1ZiBpcyBPSyAqLworICBpZiAoKHEgIT0gTlVMTCkgJiYgKHEtPmxlbiA+IGNvcHlfZnJvbSkpIHsKKyAgICByZXR1cm4gKCh1OF90KilxLT5wYXlsb2FkKVtjb3B5X2Zyb21dOworICB9CisgIHJldHVybiAwOworfQorCisvKiogQ29tcGFyZSBwYnVmIGNvbnRlbnRzIGF0IHNwZWNpZmllZCBvZmZzZXQgd2l0aCBtZW1vcnkgczIsIGJvdGggb2YgbGVuZ3RoIG4KKyAqCisgKiBAcGFyYW0gcCBwYnVmIHRvIGNvbXBhcmUKKyAqIEBwYXJhbSBvZmZzZXQgb2Zmc2V0IGludG8gcCBhdCB3aWNoIHRvIHN0YXJ0IGNvbXBhcmluZworICogQHBhcmFtIHMyIGJ1ZmZlciB0byBjb21wYXJlCisgKiBAcGFyYW0gbiBsZW5ndGggb2YgYnVmZmVyIHRvIGNvbXBhcmUKKyAqIEByZXR1cm4gemVybyBpZiBlcXVhbCwgbm9uemVybyBvdGhlcndpc2UKKyAqICAgICAgICAgKDB4ZmZmZiBpZiBwIGlzIHRvbyBzaG9ydCwgZGlmZm9mZnNldCsxIG90aGVyd2lzZSkKKyAqLwordTE2X3QKK3BidWZfbWVtY21wKHN0cnVjdCBwYnVmKiBwLCB1MTZfdCBvZmZzZXQsIGNvbnN0IHZvaWQqIHMyLCB1MTZfdCBuKQoreworICB1MTZfdCBzdGFydCA9IG9mZnNldDsKKyAgc3RydWN0IHBidWYqIHEgPSBwOworCisgIC8qIGdldCB0aGUgY29ycmVjdCBwYnVmICovCisgIHdoaWxlICgocSAhPSBOVUxMKSAmJiAocS0+bGVuIDw9IHN0YXJ0KSkgeworICAgIHN0YXJ0IC09IHEtPmxlbjsKKyAgICBxID0gcS0+bmV4dDsKKyAgfQorICAvKiByZXR1cm4gcmVxdWVzdGVkIGRhdGEgaWYgcGJ1ZiBpcyBPSyAqLworICBpZiAoKHEgIT0gTlVMTCkgJiYgKHEtPmxlbiA+IHN0YXJ0KSkgeworICAgIHUxNl90IGk7CisgICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICB1OF90IGEgPSBwYnVmX2dldF9hdChxLCBzdGFydCArIGkpOworICAgICAgdThfdCBiID0gKCh1OF90KilzMilbaV07CisgICAgICBpZiAoYSAhPSBiKSB7CisgICAgICAgIHJldHVybiBpKzE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAweGZmZmY7Cit9CisKKy8qKiBGaW5kIG9jY3VycmVuY2Ugb2YgbWVtICh3aXRoIGxlbmd0aCBtZW1fbGVuKSBpbiBwYnVmIHAsIHN0YXJ0aW5nIGF0IG9mZnNldAorICogc3RhcnRfb2Zmc2V0LgorICoKKyAqIEBwYXJhbSBwIHBidWYgdG8gc2VhcmNoLCBtYXhpbXVtIGxlbmd0aCBpcyAweEZGRkUgc2luY2UgMHhGRkZGIGlzIHVzZWQgYXMKKyAqICAgICAgICByZXR1cm4gdmFsdWUgJ25vdCBmb3VuZCcKKyAqIEBwYXJhbSBtZW0gc2VhcmNoIGZvciB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIKKyAqIEBwYXJhbSBtZW1fbGVuIGxlbmd0aCBvZiAnbWVtJworICogQHBhcmFtIHN0YXJ0X29mZnNldCBvZmZzZXQgaW50byBwIGF0IHdoaWNoIHRvIHN0YXJ0IHNlYXJjaGluZworICogQHJldHVybiAweEZGRkYgaWYgc3Vic3RyIHdhcyBub3QgZm91bmQgaW4gcCBvciB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kCisgKi8KK3UxNl90CitwYnVmX21lbWZpbmQoc3RydWN0IHBidWYqIHAsIGNvbnN0IHZvaWQqIG1lbSwgdTE2X3QgbWVtX2xlbiwgdTE2X3Qgc3RhcnRfb2Zmc2V0KQoreworICB1MTZfdCBpOworICB1MTZfdCBtYXggPSBwLT50b3RfbGVuIC0gbWVtX2xlbjsKKyAgaWYgKHAtPnRvdF9sZW4gPj0gbWVtX2xlbiArIHN0YXJ0X29mZnNldCkgeworICAgIGZvcihpID0gc3RhcnRfb2Zmc2V0OyBpIDw9IG1heDsgKSB7CisgICAgICB1MTZfdCBwbHVzID0gcGJ1Zl9tZW1jbXAocCwgaSwgbWVtLCBtZW1fbGVuKTsKKyAgICAgIGlmIChwbHVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpICs9IHBsdXM7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAweEZGRkY7Cit9CisKKy8qKiBGaW5kIG9jY3VycmVuY2Ugb2Ygc3Vic3RyIHdpdGggbGVuZ3RoIHN1YnN0cl9sZW4gaW4gcGJ1ZiBwLCBzdGFydCBhdCBvZmZzZXQKKyAqIHN0YXJ0X29mZnNldAorICogV0FSTklORzogaW4gY29udHJhc3QgdG8gc3Ryc3RyKCksIHRoaXMgb25lIGRvZXMgbm90IHN0b3AgYXQgdGhlIGZpcnN0IFwwIGluCisgKiB0aGUgcGJ1Zi9zb3VyY2Ugc3RyaW5nIQorICoKKyAqIEBwYXJhbSBwIHBidWYgdG8gc2VhcmNoLCBtYXhpbXVtIGxlbmd0aCBpcyAweEZGRkUgc2luY2UgMHhGRkZGIGlzIHVzZWQgYXMKKyAqICAgICAgICByZXR1cm4gdmFsdWUgJ25vdCBmb3VuZCcKKyAqIEBwYXJhbSBzdWJzdHIgc3RyaW5nIHRvIHNlYXJjaCBmb3IgaW4gcCwgbWF4aW11bSBsZW5ndGggaXMgMHhGRkZFCisgKiBAcmV0dXJuIDB4RkZGRiBpZiBzdWJzdHIgd2FzIG5vdCBmb3VuZCBpbiBwIG9yIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQKKyAqLwordTE2X3QKK3BidWZfc3Ryc3RyKHN0cnVjdCBwYnVmKiBwLCBjb25zdCBjaGFyKiBzdWJzdHIpCit7CisgIHNpemVfdCBzdWJzdHJfbGVuOworICBpZiAoKHN1YnN0ciA9PSBOVUxMKSB8fCAoc3Vic3RyWzBdID09IDApIHx8IChwLT50b3RfbGVuID09IDB4RkZGRikpIHsKKyAgICByZXR1cm4gMHhGRkZGOworICB9CisgIHN1YnN0cl9sZW4gPSBzdHJsZW4oc3Vic3RyKTsKKyAgaWYgKHN1YnN0cl9sZW4gPj0gMHhGRkZGKSB7CisgICAgcmV0dXJuIDB4RkZGRjsKKyAgfQorICByZXR1cm4gcGJ1Zl9tZW1maW5kKHAsIHN1YnN0ciwgKHUxNl90KXN1YnN0cl9sZW4sIDApOworfQpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL3Jhdy5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL3Jhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmY2IxMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvcmF3LmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qKgorICogQGZpbGUKKyAqIEltcGxlbWVudGF0aW9uIG9mIHJhdyBwcm90b2NvbCBQQ0JzIGZvciBsb3ctbGV2ZWwgaGFuZGxpbmcgb2YKKyAqIGRpZmZlcmVudCB0eXBlcyBvZiBwcm90b2NvbHMgYmVzaWRlcyAob3Igb3ZlcnJpZGluZykgdGhvc2UKKyAqIGFscmVhZHkgYXZhaWxhYmxlIGluIGx3SVAuCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfUkFXIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL21lbXAuaCIKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKyNpbmNsdWRlICJsd2lwL25ldGlmLmgiCisjaW5jbHVkZSAibHdpcC9yYXcuaCIKKyNpbmNsdWRlICJsd2lwL3N0YXRzLmgiCisjaW5jbHVkZSAiYXJjaC9wZXJmLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqIFRoZSBsaXN0IG9mIFJBVyBQQ0JzICovCitzdGF0aWMgc3RydWN0IHJhd19wY2IgKnJhd19wY2JzOworCisvKioKKyAqIERldGVybWluZSBpZiBpbiBpbmNvbWluZyBJUCBwYWNrZXQgaXMgY292ZXJlZCBieSBhIFJBVyBQQ0IKKyAqIGFuZCBpZiBzbywgcGFzcyBpdCB0byBhIHVzZXItcHJvdmlkZWQgcmVjZWl2ZSBjYWxsYmFjayBmdW5jdGlvbi4KKyAqCisgKiBHaXZlbiBhbiBpbmNvbWluZyBJUCBkYXRhZ3JhbSAoYXMgYSBjaGFpbiBvZiBwYnVmcykgdGhpcyBmdW5jdGlvbgorICogZmluZHMgYSBjb3JyZXNwb25kaW5nIFJBVyBQQ0IgYW5kIGNhbGxzIHRoZSBjb3JyZXNwb25kaW5nIHJlY2VpdmUKKyAqIGNhbGxiYWNrIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBwIHBidWYgdG8gYmUgZGVtdWx0aXBsZXhlZCB0byBhIFJBVyBQQ0IuCisgKiBAcGFyYW0gaW5wIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBkYXRhZ3JhbSB3YXMgcmVjZWl2ZWQuCisgKiBAcmV0dXJuIC0gMSBpZiB0aGUgcGFja2V0IGhhcyBiZWVuIGVhdGVuIGJ5IGEgUkFXIFBDQiByZWNlaXZlCisgKiAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24uIFRoZSBjYWxsZXIgTUFZIE5PVCBub3QgcmVmZXJlbmNlIHRoZQorICogICAgICAgICAgIHBhY2tldCBhbnkgbG9uZ2VyLCBhbmQgTUFZIE5PVCBjYWxsIHBidWZfZnJlZSgpLgorICogQHJldHVybiAtIDAgaWYgcGFja2V0IGlzIG5vdCBlYXRlbiAocGJ1ZiBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoZQorICogICAgICAgICAgIGNhbGxlcikuCisgKgorICovCit1OF90CityYXdfaW5wdXQoc3RydWN0IHBidWYgKnAsIHN0cnVjdCBuZXRpZiAqaW5wKQoreworICBzdHJ1Y3QgcmF3X3BjYiAqcGNiLCAqcHJldjsKKyAgc3RydWN0IGlwX2hkciAqaXBoZHI7CisgIHMxNl90IHByb3RvOworICB1OF90IGVhdGVuID0gMDsKKworICBMV0lQX1VOVVNFRF9BUkcoaW5wKTsKKworICBpcGhkciA9IChzdHJ1Y3QgaXBfaGRyICopcC0+cGF5bG9hZDsKKyAgcHJvdG8gPSBJUEhfUFJPVE8oaXBoZHIpOworCisgIHByZXYgPSBOVUxMOworICBwY2IgPSByYXdfcGNiczsKKyAgLyogbG9vcCB0aHJvdWdoIGFsbCByYXcgcGNicyB1bnRpbCB0aGUgcGFja2V0IGlzIGVhdGVuIGJ5IG9uZSAqLworICAvKiB0aGlzIGFsbG93cyBtdWx0aXBsZSBwY2JzIHRvIG1hdGNoIGFnYWluc3QgdGhlIHBhY2tldCBieSBkZXNpZ24gKi8KKyAgd2hpbGUgKChlYXRlbiA9PSAwKSAmJiAocGNiICE9IE5VTEwpKSB7CisgICAgaWYgKChwY2ItPnByb3RvY29sID09IHByb3RvKSAmJgorICAgICAgICAoaXBfYWRkcl9pc2FueSgmcGNiLT5sb2NhbF9pcCkgfHwKKyAgICAgICAgIGlwX2FkZHJfY21wKCYocGNiLT5sb2NhbF9pcCksICZjdXJyZW50X2lwaGRyX2Rlc3QpKSkgeworI2lmIElQX1NPRl9CUk9BRENBU1RfUkVDVgorICAgICAgLyogYnJvYWRjYXN0IGZpbHRlcj8gKi8KKyAgICAgIGlmICgocGNiLT5zb19vcHRpb25zICYgU09GX0JST0FEQ0FTVCkgfHwgIWlwX2FkZHJfaXNicm9hZGNhc3QoJmN1cnJlbnRfaXBoZHJfZGVzdCwgaW5wKSkKKyNlbmRpZiAvKiBJUF9TT0ZfQlJPQURDQVNUX1JFQ1YgKi8KKyAgICAgIHsKKyAgICAgICAgLyogcmVjZWl2ZSBjYWxsYmFjayBmdW5jdGlvbiBhdmFpbGFibGU/ICovCisgICAgICAgIGlmIChwY2ItPnJlY3YgIT0gTlVMTCkgeworICAgICAgICAgIC8qIHRoZSByZWNlaXZlIGNhbGxiYWNrIGZ1bmN0aW9uIGRpZCBub3QgZWF0IHRoZSBwYWNrZXQ/ICovCisgICAgICAgICAgaWYgKHBjYi0+cmVjdihwY2ItPnJlY3ZfYXJnLCBwY2IsIHAsIGlwX2N1cnJlbnRfc3JjX2FkZHIoKSkgIT0gMCkgeworICAgICAgICAgICAgLyogcmVjZWl2ZSBmdW5jdGlvbiBhdGUgdGhlIHBhY2tldCAqLworICAgICAgICAgICAgcCA9IE5VTEw7CisgICAgICAgICAgICBlYXRlbiA9IDE7CisgICAgICAgICAgICBpZiAocHJldiAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBtb3ZlIHRoZSBwY2IgdG8gdGhlIGZyb250IG9mIHJhd19wY2JzIHNvIHRoYXQgaXMKKyAgICAgICAgICAgICAgIGZvdW5kIGZhc3RlciBuZXh0IHRpbWUgKi8KKyAgICAgICAgICAgICAgcHJldi0+bmV4dCA9IHBjYi0+bmV4dDsKKyAgICAgICAgICAgICAgcGNiLT5uZXh0ID0gcmF3X3BjYnM7CisgICAgICAgICAgICAgIHJhd19wY2JzID0gcGNiOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBubyByZWNlaXZlIGNhbGxiYWNrIGZ1bmN0aW9uIHdhcyBzZXQgZm9yIHRoaXMgcmF3IFBDQiAqLworICAgICAgfQorICAgICAgLyogZHJvcCB0aGUgcGFja2V0ICovCisgICAgfQorICAgIHByZXYgPSBwY2I7CisgICAgcGNiID0gcGNiLT5uZXh0OworICB9CisgIHJldHVybiBlYXRlbjsKK30KKworLyoqCisgKiBCaW5kIGEgUkFXIFBDQi4KKyAqCisgKiBAcGFyYW0gcGNiIFJBVyBQQ0IgdG8gYmUgYm91bmQgd2l0aCBhIGxvY2FsIGFkZHJlc3MgaXBhZGRyLgorICogQHBhcmFtIGlwYWRkciBsb2NhbCBJUCBhZGRyZXNzIHRvIGJpbmQgd2l0aC4gVXNlIElQX0FERFJfQU5ZIHRvCisgKiBiaW5kIHRvIGFsbCBsb2NhbCBpbnRlcmZhY2VzLgorICoKKyAqIEByZXR1cm4gbHdJUCBlcnJvciBjb2RlLgorICogLSBFUlJfT0suIFN1Y2Nlc3NmdWwuIE5vIGVycm9yIG9jY3VyZWQuCisgKiAtIEVSUl9VU0UuIFRoZSBzcGVjaWZpZWQgSVAgYWRkcmVzcyBpcyBhbHJlYWR5IGJvdW5kIHRvIGJ5CisgKiBhbm90aGVyIFJBVyBQQ0IuCisgKgorICogQHNlZSByYXdfZGlzY29ubmVjdCgpCisgKi8KK2Vycl90CityYXdfYmluZChzdHJ1Y3QgcmF3X3BjYiAqcGNiLCBpcF9hZGRyX3QgKmlwYWRkcikKK3sKKyAgaXBfYWRkcl9zZXQoJnBjYi0+bG9jYWxfaXAsIGlwYWRkcik7CisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogQ29ubmVjdCBhbiBSQVcgUENCLiBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGJ5IHVwcGVyIGxheWVycworICogb2YgbHdpcC4gVXNpbmcgdGhlIHJhdyBhcGkgeW91IGNvdWxkIHVzZSByYXdfc2VuZHRvKCkgaW5zdGVhZAorICoKKyAqIFRoaXMgd2lsbCBhc3NvY2lhdGUgdGhlIFJBVyBQQ0Igd2l0aCB0aGUgcmVtb3RlIGFkZHJlc3MuCisgKgorICogQHBhcmFtIHBjYiBSQVcgUENCIHRvIGJlIGNvbm5lY3RlZCB3aXRoIHJlbW90ZSBhZGRyZXNzIGlwYWRkciBhbmQgcG9ydC4KKyAqIEBwYXJhbSBpcGFkZHIgcmVtb3RlIElQIGFkZHJlc3MgdG8gY29ubmVjdCB3aXRoLgorICoKKyAqIEByZXR1cm4gbHdJUCBlcnJvciBjb2RlCisgKgorICogQHNlZSByYXdfZGlzY29ubmVjdCgpIGFuZCByYXdfc2VuZHRvKCkKKyAqLworZXJyX3QKK3Jhd19jb25uZWN0KHN0cnVjdCByYXdfcGNiICpwY2IsIGlwX2FkZHJfdCAqaXBhZGRyKQoreworICBpcF9hZGRyX3NldCgmcGNiLT5yZW1vdGVfaXAsIGlwYWRkcik7CisgIHJldHVybiBFUlJfT0s7Cit9CisKKworLyoqCisgKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZWNlaXZlZCBwYWNrZXRzIHRoYXQgbWF0Y2ggdGhlCisgKiByYXcgUENCJ3MgcHJvdG9jb2wgYW5kIGJpbmRpbmcuIAorICogCisgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gTVVTVCBlaXRoZXIKKyAqIC0gZWF0IHRoZSBwYWNrZXQgYnkgY2FsbGluZyBwYnVmX2ZyZWUoKSBhbmQgcmV0dXJuaW5nIG5vbi16ZXJvLiBUaGUKKyAqICAgcGFja2V0IHdpbGwgbm90IGJlIHBhc3NlZCB0byBvdGhlciByYXcgUENCcyBvciBvdGhlciBwcm90b2NvbCBsYXllcnMuCisgKiAtIG5vdCBmcmVlIHRoZSBwYWNrZXQsIGFuZCByZXR1cm4gemVyby4gVGhlIHBhY2tldCB3aWxsIGJlIG1hdGNoZWQKKyAqICAgYWdhaW5zdCBmdXJ0aGVyIFBDQnMgYW5kL29yIGZvcndhcmRlZCB0byBhbm90aGVyIHByb3RvY29sIGxheWVycy4KKyAqIAorICogQHJldHVybiBub24temVybyBpZiB0aGUgcGFja2V0IHdhcyBmcmVlKClkLCB6ZXJvIGlmIHRoZSBwYWNrZXQgcmVtYWlucworICogYXZhaWxhYmxlIGZvciBvdGhlcnMuCisgKi8KK3ZvaWQKK3Jhd19yZWN2KHN0cnVjdCByYXdfcGNiICpwY2IsIHJhd19yZWN2X2ZuIHJlY3YsIHZvaWQgKnJlY3ZfYXJnKQoreworICAvKiByZW1lbWJlciByZWN2KCkgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YSAqLworICBwY2ItPnJlY3YgPSByZWN2OworICBwY2ItPnJlY3ZfYXJnID0gcmVjdl9hcmc7Cit9CisKKy8qKgorICogU2VuZCB0aGUgcmF3IElQIHBhY2tldCB0byB0aGUgZ2l2ZW4gYWRkcmVzcy4gTm90ZSB0aGF0IGFjdHVhbGx5IHlvdSBjYW5ub3QKKyAqIG1vZGlmeSB0aGUgSVAgaGVhZGVycyAodGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgcmVjZWl2ZSBjYWxsYmFjayB3aGVyZQorICogeW91IGFjdHVhbGx5IGdldCB0aGUgSVAgaGVhZGVycyksIHlvdSBjYW4gb25seSBzcGVjaWZ5IHRoZSBJUCBwYXlsb2FkIGhlcmUuCisgKiBJdCByZXF1aXJlcyBzb21lIG1vcmUgY2hhbmdlcyBpbiBsd0lQLiAodGhlcmUgd2lsbCBiZSBhIHJhd19zZW5kKCkgZnVuY3Rpb24KKyAqIHRoZW4uKQorICoKKyAqIEBwYXJhbSBwY2IgdGhlIHJhdyBwY2Igd2hpY2ggdG8gc2VuZAorICogQHBhcmFtIHAgdGhlIElQIHBheWxvYWQgdG8gc2VuZAorICogQHBhcmFtIGlwYWRkciB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgSVAgcGFja2V0CisgKgorICovCitlcnJfdAorcmF3X3NlbmR0byhzdHJ1Y3QgcmF3X3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwgaXBfYWRkcl90ICppcGFkZHIpCit7CisgIGVycl90IGVycjsKKyAgc3RydWN0IG5ldGlmICpuZXRpZjsKKyAgaXBfYWRkcl90ICpzcmNfaXA7CisgIHN0cnVjdCBwYnVmICpxOyAvKiBxIHdpbGwgYmUgc2VudCBkb3duIHRoZSBzdGFjayAqLworICAKKyAgTFdJUF9ERUJVR0YoUkFXX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgicmF3X3NlbmR0b1xuIikpOworICAKKyAgLyogbm90IGVub3VnaCBzcGFjZSB0byBhZGQgYW4gSVAgaGVhZGVyIHRvIGZpcnN0IHBidWYgaW4gZ2l2ZW4gcCBjaGFpbj8gKi8KKyAgaWYgKHBidWZfaGVhZGVyKHAsIElQX0hMRU4pKSB7CisgICAgLyogYWxsb2NhdGUgaGVhZGVyIGluIG5ldyBwYnVmICovCisgICAgcSA9IHBidWZfYWxsb2MoUEJVRl9JUCwgMCwgUEJVRl9SQU0pOworICAgIC8qIG5ldyBoZWFkZXIgcGJ1ZiBjb3VsZCBub3QgYmUgYWxsb2NhdGVkPyAqLworICAgIGlmIChxID09IE5VTEwpIHsKKyAgICAgIExXSVBfREVCVUdGKFJBV19ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfU0VSSU9VUywgKCJyYXdfc2VuZHRvOiBjb3VsZCBub3QgYWxsb2NhdGUgaGVhZGVyXG4iKSk7CisgICAgICByZXR1cm4gRVJSX01FTTsKKyAgICB9CisgICAgaWYgKHAtPnRvdF9sZW4gIT0gMCkgeworICAgICAgLyogY2hhaW4gaGVhZGVyIHEgaW4gZnJvbnQgb2YgZ2l2ZW4gcGJ1ZiBwICovCisgICAgICBwYnVmX2NoYWluKHEsIHApOworICAgIH0KKyAgICAvKiB7IGZpcnN0IHBidWYgcSBwb2ludHMgdG8gaGVhZGVyIHBidWYgfSAqLworICAgIExXSVBfREVCVUdGKFJBV19ERUJVRywgKCJyYXdfc2VuZHRvOiBhZGRlZCBoZWFkZXIgcGJ1ZiAlcCBiZWZvcmUgZ2l2ZW4gcGJ1ZiAlcFxuIiwgKHZvaWQgKilxLCAodm9pZCAqKXApKTsKKyAgfSAgZWxzZSB7CisgICAgLyogZmlyc3QgcGJ1ZiBxIGVxdWFscyBnaXZlbiBwYnVmICovCisgICAgcSA9IHA7CisgICAgaWYocGJ1Zl9oZWFkZXIocSwgLUlQX0hMRU4pKSB7CisgICAgICBMV0lQX0FTU0VSVCgiQ2FuJ3QgcmVzdG9yZSBoZWFkZXIgd2UganVzdCByZW1vdmVkISIsIDApOworICAgICAgcmV0dXJuIEVSUl9NRU07CisgICAgfQorICB9CisKKyAgaWYgKChuZXRpZiA9IGlwX3JvdXRlKGlwYWRkcikpID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihSQVdfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9XQVJOSU5HLCAoInJhd19zZW5kdG86IE5vIHJvdXRlIHRvICUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiXG4iLAorICAgICAgaXA0X2FkZHIxXzE2KGlwYWRkciksIGlwNF9hZGRyMl8xNihpcGFkZHIpLCBpcDRfYWRkcjNfMTYoaXBhZGRyKSwgaXA0X2FkZHI0XzE2KGlwYWRkcikpKTsKKyAgICAvKiBmcmVlIGFueSB0ZW1wb3JhcnkgaGVhZGVyIHBidWYgYWxsb2NhdGVkIGJ5IHBidWZfaGVhZGVyKCkgKi8KKyAgICBpZiAocSAhPSBwKSB7CisgICAgICBwYnVmX2ZyZWUocSk7CisgICAgfQorICAgIHJldHVybiBFUlJfUlRFOworICB9CisKKyNpZiBJUF9TT0ZfQlJPQURDQVNUCisgIC8qIGJyb2FkY2FzdCBmaWx0ZXI/ICovCisgIGlmICgoKHBjYi0+c29fb3B0aW9ucyAmIFNPRl9CUk9BRENBU1QpID09IDApICYmIGlwX2FkZHJfaXNicm9hZGNhc3QoaXBhZGRyLCBuZXRpZikpIHsKKyAgICBMV0lQX0RFQlVHRihSQVdfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9XQVJOSU5HLCAoInJhd19zZW5kdG86IFNPRl9CUk9BRENBU1Qgbm90IGVuYWJsZWQgb24gcGNiICVwXG4iLCAodm9pZCAqKXBjYikpOworICAgIC8qIGZyZWUgYW55IHRlbXBvcmFyeSBoZWFkZXIgcGJ1ZiBhbGxvY2F0ZWQgYnkgcGJ1Zl9oZWFkZXIoKSAqLworICAgIGlmIChxICE9IHApIHsKKyAgICAgIHBidWZfZnJlZShxKTsKKyAgICB9CisgICAgcmV0dXJuIEVSUl9WQUw7CisgIH0KKyNlbmRpZiAvKiBJUF9TT0ZfQlJPQURDQVNUICovCisKKyAgaWYgKGlwX2FkZHJfaXNhbnkoJnBjYi0+bG9jYWxfaXApKSB7CisgICAgLyogdXNlIG91dGdvaW5nIG5ldHdvcmsgaW50ZXJmYWNlIElQIGFkZHJlc3MgYXMgc291cmNlIGFkZHJlc3MgKi8KKyAgICBzcmNfaXAgPSAmKG5ldGlmLT5pcF9hZGRyKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB1c2UgUkFXIFBDQiBsb2NhbCBJUCBhZGRyZXNzIGFzIHNvdXJjZSBhZGRyZXNzICovCisgICAgc3JjX2lwID0gJihwY2ItPmxvY2FsX2lwKTsKKyAgfQorCisjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UCisgIG5ldGlmLT5hZGRyX2hpbnQgPSAmKHBjYi0+YWRkcl9oaW50KTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQqLworICBlcnIgPSBpcF9vdXRwdXRfaWYgKHEsIHNyY19pcCwgaXBhZGRyLCBwY2ItPnR0bCwgcGNiLT50b3MsIHBjYi0+cHJvdG9jb2wsIG5ldGlmKTsKKyNpZiBMV0lQX05FVElGX0hXQUREUkhJTlQKKyAgbmV0aWYtPmFkZHJfaGludCA9IE5VTEw7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UKi8KKworICAvKiBkaWQgd2UgY2hhaW4gYSBoZWFkZXIgZWFybGllcj8gKi8KKyAgaWYgKHEgIT0gcCkgeworICAgIC8qIGZyZWUgdGhlIGhlYWRlciAqLworICAgIHBidWZfZnJlZShxKTsKKyAgfQorICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIFNlbmQgdGhlIHJhdyBJUCBwYWNrZXQgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gYnkgcmF3X2Nvbm5lY3QoKQorICoKKyAqIEBwYXJhbSBwY2IgdGhlIHJhdyBwY2Igd2hpY2ggdG8gc2VuZAorICogQHBhcmFtIHAgdGhlIElQIHBheWxvYWQgdG8gc2VuZAorICoKKyAqLworZXJyX3QKK3Jhd19zZW5kKHN0cnVjdCByYXdfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwKQoreworICByZXR1cm4gcmF3X3NlbmR0byhwY2IsIHAsICZwY2ItPnJlbW90ZV9pcCk7Cit9CisKKy8qKgorICogUmVtb3ZlIGFuIFJBVyBQQ0IuCisgKgorICogQHBhcmFtIHBjYiBSQVcgUENCIHRvIGJlIHJlbW92ZWQuIFRoZSBQQ0IgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mCisgKiBSQVcgUENCJ3MgYW5kIHRoZSBkYXRhIHN0cnVjdHVyZSBpcyBmcmVlZCBmcm9tIG1lbW9yeS4KKyAqCisgKiBAc2VlIHJhd19uZXcoKQorICovCit2b2lkCityYXdfcmVtb3ZlKHN0cnVjdCByYXdfcGNiICpwY2IpCit7CisgIHN0cnVjdCByYXdfcGNiICpwY2IyOworICAvKiBwY2IgdG8gYmUgcmVtb3ZlZCBpcyBmaXJzdCBpbiBsaXN0PyAqLworICBpZiAocmF3X3BjYnMgPT0gcGNiKSB7CisgICAgLyogbWFrZSBsaXN0IHN0YXJ0IGF0IDJuZCBwY2IgKi8KKyAgICByYXdfcGNicyA9IHJhd19wY2JzLT5uZXh0OworICAgIC8qIHBjYiBub3QgMXN0IGluIGxpc3QgKi8KKyAgfSBlbHNlIHsKKyAgICBmb3IocGNiMiA9IHJhd19wY2JzOyBwY2IyICE9IE5VTEw7IHBjYjIgPSBwY2IyLT5uZXh0KSB7CisgICAgICAvKiBmaW5kIHBjYiBpbiByYXdfcGNicyBsaXN0ICovCisgICAgICBpZiAocGNiMi0+bmV4dCAhPSBOVUxMICYmIHBjYjItPm5leHQgPT0gcGNiKSB7CisgICAgICAgIC8qIHJlbW92ZSBwY2IgZnJvbSBsaXN0ICovCisgICAgICAgIHBjYjItPm5leHQgPSBwY2ItPm5leHQ7CisgICAgICB9CisgICAgfQorICB9CisgIG1lbXBfZnJlZShNRU1QX1JBV19QQ0IsIHBjYik7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgUkFXIFBDQi4KKyAqCisgKiBAcmV0dXJuIFRoZSBSQVcgUENCIHdoaWNoIHdhcyBjcmVhdGVkLiBOVUxMIGlmIHRoZSBQQ0IgZGF0YSBzdHJ1Y3R1cmUKKyAqIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgKgorICogQHBhcmFtIHByb3RvIHRoZSBwcm90b2NvbCBudW1iZXIgb2YgdGhlIElQcyBwYXlsb2FkIChlLmcuIElQX1BST1RPX0lDTVApCisgKgorICogQHNlZSByYXdfcmVtb3ZlKCkKKyAqLworc3RydWN0IHJhd19wY2IgKgorcmF3X25ldyh1OF90IHByb3RvKQoreworICBzdHJ1Y3QgcmF3X3BjYiAqcGNiOworCisgIExXSVBfREVCVUdGKFJBV19ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInJhd19uZXdcbiIpKTsKKworICBwY2IgPSAoc3RydWN0IHJhd19wY2IgKiltZW1wX21hbGxvYyhNRU1QX1JBV19QQ0IpOworICAvKiBjb3VsZCBhbGxvY2F0ZSBSQVcgUENCPyAqLworICBpZiAocGNiICE9IE5VTEwpIHsKKyAgICAvKiBpbml0aWFsaXplIFBDQiB0byBhbGwgemVyb2VzICovCisgICAgbWVtc2V0KHBjYiwgMCwgc2l6ZW9mKHN0cnVjdCByYXdfcGNiKSk7CisgICAgcGNiLT5wcm90b2NvbCA9IHByb3RvOworICAgIHBjYi0+dHRsID0gUkFXX1RUTDsKKyAgICBwY2ItPm5leHQgPSByYXdfcGNiczsKKyAgICByYXdfcGNicyA9IHBjYjsKKyAgfQorICByZXR1cm4gcGNiOworfQorCisjZW5kaWYgLyogTFdJUF9SQVcgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS9zbm1wL2FzbjFfZGVjLmMgYi9jb3JlL2x3aXAvc3JjL2NvcmUvc25tcC9hc24xX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNTY1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvc25tcC9hc24xX2RlYy5jCkBAIC0wLDAgKzEsNjU3IEBACisvKioKKyAqIEBmaWxlCisgKiBBYnN0cmFjdCBTeW50YXggTm90YXRpb24gT25lIChJU08gODgyNCwgODgyNSkgZGVjb2RpbmcKKyAqCisgKiBAdG9kbyBub3Qgb3B0aW1pc2VkICh5ZXQpLCBmYXZvciBjb3JyZWN0bmVzcyBvdmVyIHNwZWVkLCBmYXZvciBzcGVlZCBvdmVyIHNpemUKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEF4b24gRGlnaXRhbCBEZXNpZ24gQi5WLiwgVGhlIE5ldGhlcmxhbmRzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogQ2hyaXN0aWFhbiBTaW1vbnMgPGNocmlzdGlhYW4uc2ltb25zQGF4b24udHY+CisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX1NOTVAgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL3NubXBfYXNuMS5oIgorCisvKioKKyAqIFJldHJpZXZlcyB0eXBlIGZpZWxkIGZyb20gaW5jb21pbmcgcGJ1ZiBjaGFpbi4KKyAqCisgKiBAcGFyYW0gcCBwb2ludHMgdG8gYSBwYnVmIGhvbGRpbmcgYW4gQVNOMSBjb2RlZCB0eXBlIGZpZWxkCisgKiBAcGFyYW0gb2ZzIHBvaW50cyB0byB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGJ1ZiBjaGFpbiBvZiB0aGUgQVNOMSBjb2RlZCB0eXBlIGZpZWxkCisgKiBAcGFyYW0gdHlwZSByZXR1cm4gQVNOMSB0eXBlCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsbCwgRVJSX0FSRyBpZiB3ZSBjYW4ndCAob3Igd29uJ3QpIGRlY29kZQorICovCitlcnJfdAorc25tcF9hc24xX2RlY190eXBlKHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMsIHU4X3QgKnR5cGUpCit7CisgIHUxNl90IHBsZW4sIGJhc2U7CisgIHU4X3QgKm1zZ19wdHI7CisKKyAgcGxlbiA9IDA7CisgIHdoaWxlIChwICE9IE5VTEwpCisgIHsKKyAgICBiYXNlID0gcGxlbjsKKyAgICBwbGVuICs9IHAtPmxlbjsKKyAgICBpZiAob2ZzIDwgcGxlbikKKyAgICB7CisgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICBtc2dfcHRyICs9IG9mcyAtIGJhc2U7CisgICAgICAqdHlwZSA9ICptc2dfcHRyOworICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICB9CisgICAgcCA9IHAtPm5leHQ7CisgIH0KKyAgLyogcCA9PSBOVUxMLCBvZnMgPj0gcGxlbiAqLworICByZXR1cm4gRVJSX0FSRzsKK30KKworLyoqCisgKiBEZWNvZGVzIGxlbmd0aCBmaWVsZCBmcm9tIGluY29taW5nIHBidWYgY2hhaW4gaW50byBob3N0IGxlbmd0aC4KKyAqCisgKiBAcGFyYW0gcCBwb2ludHMgdG8gYSBwYnVmIGhvbGRpbmcgYW4gQVNOMSBjb2RlZCBsZW5ndGgKKyAqIEBwYXJhbSBvZnMgcG9pbnRzIHRvIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYnVmIGNoYWluIG9mIHRoZSBBU04xIGNvZGVkIGxlbmd0aAorICogQHBhcmFtIG9jdGV0c191c2VkIHJldHVybnMgbnVtYmVyIG9mIG9jdGV0cyB1c2VkIGJ5IHRoZSBsZW5ndGggY29kZQorICogQHBhcmFtIGxlbmd0aCByZXR1cm4gaG9zdCBvcmRlciBsZW5ndGgsIHVwdG8gNjRrCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsbCwgRVJSX0FSRyBpZiB3ZSBjYW4ndCAob3Igd29uJ3QpIGRlY29kZQorICovCitlcnJfdAorc25tcF9hc24xX2RlY19sZW5ndGgoc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcywgdThfdCAqb2N0ZXRzX3VzZWQsIHUxNl90ICpsZW5ndGgpCit7CisgIHUxNl90IHBsZW4sIGJhc2U7CisgIHU4X3QgKm1zZ19wdHI7CisKKyAgcGxlbiA9IDA7CisgIHdoaWxlIChwICE9IE5VTEwpCisgIHsKKyAgICBiYXNlID0gcGxlbjsKKyAgICBwbGVuICs9IHAtPmxlbjsKKyAgICBpZiAob2ZzIDwgcGxlbikKKyAgICB7CisgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICBtc2dfcHRyICs9IG9mcyAtIGJhc2U7CisKKyAgICAgIGlmICgqbXNnX3B0ciA8IDB4ODApCisgICAgICB7CisgICAgICAgIC8qIHByaW1pdGl2ZSBkZWZpbml0ZSBsZW5ndGggZm9ybWF0ICovCisgICAgICAgICpvY3RldHNfdXNlZCA9IDE7CisgICAgICAgICpsZW5ndGggPSAqbXNnX3B0cjsKKyAgICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCptc2dfcHRyID09IDB4ODApCisgICAgICB7CisgICAgICAgIC8qIGNvbnN0cnVjdGVkIGluZGVmaW5pdGUgbGVuZ3RoIGZvcm1hdCwgdGVybWluYXRpb24gd2l0aCB0d28gemVybyBvY3RldHMgKi8KKyAgICAgICAgdThfdCB6ZXJvczsKKyAgICAgICAgdThfdCBpOworCisgICAgICAgICpsZW5ndGggPSAwOworICAgICAgICB6ZXJvcyA9IDA7CisgICAgICAgIHdoaWxlICh6ZXJvcyAhPSAyKQorICAgICAgICB7CisgICAgICAgICAgaSA9IDI7CisgICAgICAgICAgd2hpbGUgKGkgPiAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICgqbGVuZ3RoKSArPSAxOworICAgICAgICAgICAgb2ZzICs9IDE7CisgICAgICAgICAgICBpZiAob2ZzID49IHBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gbmV4dCBwYnVmICovCisgICAgICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7IHJldHVybiBFUlJfQVJHOyB9CisgICAgICAgICAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgICAgICAgICAgcGxlbiArPSBwLT5sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gc2FtZSBwYnVmICovCisgICAgICAgICAgICAgIG1zZ19wdHIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqbXNnX3B0ciA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB6ZXJvcysrOworICAgICAgICAgICAgICBpZiAoemVyb3MgPT0gMikKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHN0b3Agd2hpbGUgKGkgPiAwKSAqLworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHplcm9zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKm9jdGV0c191c2VkID0gMTsKKyAgICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCptc2dfcHRyID09IDB4ODEpCisgICAgICB7CisgICAgICAgIC8qIGNvbnN0cnVjdGVkIGRlZmluaXRlIGxlbmd0aCBmb3JtYXQsIG9uZSBvY3RldCAqLworICAgICAgICBvZnMgKz0gMTsKKyAgICAgICAgaWYgKG9mcyA+PSBwbGVuKQorICAgICAgICB7CisgICAgICAgICAgLyogbmV4dCBvY3RldCBpbiBuZXh0IHBidWYgKi8KKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7IHJldHVybiBFUlJfQVJHOyB9CisgICAgICAgICAgbXNnX3B0ciA9ICh1OF90KilwLT5wYXlsb2FkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gc2FtZSBwYnVmICovCisgICAgICAgICAgbXNnX3B0cisrOworICAgICAgICB9CisgICAgICAgICpsZW5ndGggPSAqbXNnX3B0cjsKKyAgICAgICAgKm9jdGV0c191c2VkID0gMjsKKyAgICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCptc2dfcHRyID09IDB4ODIpCisgICAgICB7CisgICAgICAgIHU4X3QgaTsKKworICAgICAgICAvKiBjb25zdHJ1Y3RlZCBkZWZpbml0ZSBsZW5ndGggZm9ybWF0LCB0d28gb2N0ZXRzICovCisgICAgICAgIGkgPSAyOworICAgICAgICB3aGlsZSAoaSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpLS07CisgICAgICAgICAgb2ZzICs9IDE7CisgICAgICAgICAgaWYgKG9mcyA+PSBwbGVuKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gbmV4dCBwYnVmICovCisgICAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpIHsgcmV0dXJuIEVSUl9BUkc7IH0KKyAgICAgICAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgICAgICAgIHBsZW4gKz0gcC0+bGVuOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogbmV4dCBvY3RldCBpbiBzYW1lIHBidWYgKi8KKyAgICAgICAgICAgIG1zZ19wdHIrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBsZWFzdCBzaWduaWZpY2FudCBsZW5ndGggb2N0ZXQgKi8KKyAgICAgICAgICAgICpsZW5ndGggfD0gKm1zZ19wdHI7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBtb3N0IHNpZ25pZmljYW50IGxlbmd0aCBvY3RldCAqLworICAgICAgICAgICAgKmxlbmd0aCA9ICgqbXNnX3B0cikgPDwgODsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKm9jdGV0c191c2VkID0gMzsKKyAgICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogY29uc3RydWN0ZWQgZGVmaW5pdGUgbGVuZ3RoIGZvcm1hdCAzLi4xMjcgb2N0ZXRzLCB0aGlzIGlzIHRvbyBiaWcgKD42NGspICovCisgICAgICAgIC8qKiAgQHRvZG86IGRvIHdlIG5lZWQgdG8gYWNjZXB0IGluZWZmaWNpZW50IGNvZGluZ3Mgd2l0aCBtYW55IGxlYWRpbmcgemVybydzPyAqLworICAgICAgICAqb2N0ZXRzX3VzZWQgPSAxICsgKCgqbXNnX3B0cikgJiAweDdmKTsKKyAgICAgICAgcmV0dXJuIEVSUl9BUkc7CisgICAgICB9CisgICAgfQorICAgIHAgPSBwLT5uZXh0OworICB9CisKKyAgLyogcCA9PSBOVUxMLCBvZnMgPj0gcGxlbiAqLworICByZXR1cm4gRVJSX0FSRzsKK30KKworLyoqCisgKiBEZWNvZGVzIHBvc2l0aXZlIGludGVnZXIgKGNvdW50ZXIsIGdhdWdlLCB0aW1ldGlja3MpIGludG8gdTMyX3QuCisgKgorICogQHBhcmFtIHAgcG9pbnRzIHRvIGEgcGJ1ZiBob2xkaW5nIGFuIEFTTjEgY29kZWQgaW50ZWdlcgorICogQHBhcmFtIG9mcyBwb2ludHMgdG8gdGhlIG9mZnNldCB3aXRoaW4gdGhlIHBidWYgY2hhaW4gb2YgdGhlIEFTTjEgY29kZWQgaW50ZWdlcgorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgdGhlIGNvZGVkIGludGVnZXIgZmllbGQKKyAqIEBwYXJhbSB2YWx1ZSByZXR1cm4gaG9zdCBvcmRlciBpbnRlZ2VyCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsbCwgRVJSX0FSRyBpZiB3ZSBjYW4ndCAob3Igd29uJ3QpIGRlY29kZQorICoKKyAqIEBub3RlIEFTTiBjb2RlZCBpbnRlZ2VycyBhcmUgX2Fsd2F5c18gc2lnbmVkLiBFLmcuICsweEZGRkYgaXMgY29kZWQKKyAqIGFzIDB4MDAsMHhGRiwweEZGLiBOb3RlIHRoZSBsZWFkaW5nIHNpZ24gb2N0ZXQuIEEgcG9zaXRpdmUgdmFsdWUKKyAqIG9mIDB4RkZGRkZGRkYgaXMgcHJlY2VkZWQgd2l0aCAweDAwIGFuZCB0aGUgbGVuZ3RoIGlzIDUgb2N0ZXRzISEKKyAqLworZXJyX3QKK3NubXBfYXNuMV9kZWNfdTMydChzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1MTZfdCBsZW4sIHUzMl90ICp2YWx1ZSkKK3sKKyAgdTE2X3QgcGxlbiwgYmFzZTsKKyAgdThfdCAqbXNnX3B0cjsKKworICBwbGVuID0gMDsKKyAgd2hpbGUgKHAgIT0gTlVMTCkKKyAgeworICAgIGJhc2UgPSBwbGVuOworICAgIHBsZW4gKz0gcC0+bGVuOworICAgIGlmIChvZnMgPCBwbGVuKQorICAgIHsKKyAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgIG1zZ19wdHIgKz0gb2ZzIC0gYmFzZTsKKyAgICAgIGlmICgobGVuID4gMCkgJiYgKGxlbiA8IDYpKQorICAgICAgeworICAgICAgICAvKiBzdGFydCBmcm9tIHplcm8gKi8KKyAgICAgICAgKnZhbHVlID0gMDsKKyAgICAgICAgaWYgKCptc2dfcHRyICYgMHg4MCkKKyAgICAgICAgeworICAgICAgICAgIC8qIG5lZ2F0aXZlLCBleHBlY3RpbmcgemVybyBzaWduIGJpdCEgKi8KKyAgICAgICAgICByZXR1cm4gRVJSX0FSRzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBwb3NpdGl2ZSAqLworICAgICAgICAgIGlmICgobGVuID4gMSkgJiYgKCptc2dfcHRyID09IDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNraXAgbGVhZGluZyAic2lnbiBieXRlIiBvY3RldCAweDAwICovCisgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgIG9mcyArPSAxOworICAgICAgICAgICAgaWYgKG9mcyA+PSBwbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIG5leHQgcGJ1ZiAqLworICAgICAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeyByZXR1cm4gRVJSX0FSRzsgfQorICAgICAgICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgICAgICAgIHBsZW4gKz0gcC0+bGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIHNhbWUgcGJ1ZiAqLworICAgICAgICAgICAgICBtc2dfcHRyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIE9SIG9jdGV0cyB3aXRoIHZhbHVlICovCisgICAgICAgIHdoaWxlIChsZW4gPiAxKQorICAgICAgICB7CisgICAgICAgICAgbGVuLS07CisgICAgICAgICAgKnZhbHVlIHw9ICptc2dfcHRyOworICAgICAgICAgICp2YWx1ZSA8PD0gODsKKyAgICAgICAgICBvZnMgKz0gMTsKKyAgICAgICAgICBpZiAob2ZzID49IHBsZW4pCisgICAgICAgICAgeworICAgICAgICAgICAgLyogbmV4dCBvY3RldCBpbiBuZXh0IHBidWYgKi8KKyAgICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeyByZXR1cm4gRVJSX0FSRzsgfQorICAgICAgICAgICAgbXNnX3B0ciA9ICh1OF90KilwLT5wYXlsb2FkOworICAgICAgICAgICAgcGxlbiArPSBwLT5sZW47CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIHNhbWUgcGJ1ZiAqLworICAgICAgICAgICAgbXNnX3B0cisrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqdmFsdWUgfD0gKm1zZ19wdHI7CisgICAgICAgIHJldHVybiBFUlJfT0s7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiBFUlJfQVJHOworICAgICAgfQorICAgIH0KKyAgICBwID0gcC0+bmV4dDsKKyAgfQorICAvKiBwID09IE5VTEwsIG9mcyA+PSBwbGVuICovCisgIHJldHVybiBFUlJfQVJHOworfQorCisvKioKKyAqIERlY29kZXMgaW50ZWdlciBpbnRvIHMzMl90LgorICoKKyAqIEBwYXJhbSBwIHBvaW50cyB0byBhIHBidWYgaG9sZGluZyBhbiBBU04xIGNvZGVkIGludGVnZXIKKyAqIEBwYXJhbSBvZnMgcG9pbnRzIHRvIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYnVmIGNoYWluIG9mIHRoZSBBU04xIGNvZGVkIGludGVnZXIKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHRoZSBjb2RlZCBpbnRlZ2VyIGZpZWxkCisgKiBAcGFyYW0gdmFsdWUgcmV0dXJuIGhvc3Qgb3JkZXIgaW50ZWdlcgorICogQHJldHVybiBFUlJfT0sgaWYgc3VjY2Vzc2Z1bGwsIEVSUl9BUkcgaWYgd2UgY2FuJ3QgKG9yIHdvbid0KSBkZWNvZGUKKyAqCisgKiBAbm90ZSBBU04gY29kZWQgaW50ZWdlcnMgYXJlIF9hbHdheXNfIHNpZ25lZCEKKyAqLworZXJyX3QKK3NubXBfYXNuMV9kZWNfczMydChzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1MTZfdCBsZW4sIHMzMl90ICp2YWx1ZSkKK3sKKyAgdTE2X3QgcGxlbiwgYmFzZTsKKyAgdThfdCAqbXNnX3B0cjsKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyAgdThfdCAqbHNiX3B0ciA9ICh1OF90Kil2YWx1ZTsKKyNlbmRpZgorI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorICB1OF90ICpsc2JfcHRyID0gKHU4X3QqKXZhbHVlICsgc2l6ZW9mKHMzMl90KSAtIDE7CisjZW5kaWYKKyAgdThfdCBzaWduOworCisgIHBsZW4gPSAwOworICB3aGlsZSAocCAhPSBOVUxMKQorICB7CisgICAgYmFzZSA9IHBsZW47CisgICAgcGxlbiArPSBwLT5sZW47CisgICAgaWYgKG9mcyA8IHBsZW4pCisgICAgeworICAgICAgbXNnX3B0ciA9ICh1OF90KilwLT5wYXlsb2FkOworICAgICAgbXNnX3B0ciArPSBvZnMgLSBiYXNlOworICAgICAgaWYgKChsZW4gPiAwKSAmJiAobGVuIDwgNSkpCisgICAgICB7CisgICAgICAgIGlmICgqbXNnX3B0ciAmIDB4ODApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBuZWdhdGl2ZSwgc3RhcnQgZnJvbSAtMSAqLworICAgICAgICAgICp2YWx1ZSA9IC0xOworICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHBvc2l0aXZlLCBzdGFydCBmcm9tIDAgKi8KKyAgICAgICAgICAqdmFsdWUgPSAwOworICAgICAgICAgIHNpZ24gPSAwOworICAgICAgICB9CisgICAgICAgIC8qIE9SL0FORCBvY3RldHMgd2l0aCB2YWx1ZSAqLworICAgICAgICB3aGlsZSAobGVuID4gMSkKKyAgICAgICAgeworICAgICAgICAgIGxlbi0tOworICAgICAgICAgIGlmIChzaWduKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICpsc2JfcHRyICY9ICptc2dfcHRyOworICAgICAgICAgICAgKnZhbHVlIDw8PSA4OworICAgICAgICAgICAgKmxzYl9wdHIgfD0gMjU1OworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgKmxzYl9wdHIgfD0gKm1zZ19wdHI7CisgICAgICAgICAgICAqdmFsdWUgPDw9IDg7CisgICAgICAgICAgfQorICAgICAgICAgIG9mcyArPSAxOworICAgICAgICAgIGlmIChvZnMgPj0gcGxlbikKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIG5leHQgcGJ1ZiAqLworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7IHJldHVybiBFUlJfQVJHOyB9CisgICAgICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgICAgICBwbGVuICs9IHAtPmxlbjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gc2FtZSBwYnVmICovCisgICAgICAgICAgICBtc2dfcHRyKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaWduKQorICAgICAgICB7CisgICAgICAgICAgKmxzYl9wdHIgJj0gKm1zZ19wdHI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKmxzYl9wdHIgfD0gKm1zZ19wdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEVSUl9BUkc7CisgICAgICB9CisgICAgfQorICAgIHAgPSBwLT5uZXh0OworICB9CisgIC8qIHAgPT0gTlVMTCwgb2ZzID49IHBsZW4gKi8KKyAgcmV0dXJuIEVSUl9BUkc7Cit9CisKKy8qKgorICogRGVjb2RlcyBvYmplY3QgaWRlbnRpZmllciBmcm9tIGluY29taW5nIG1lc3NhZ2UgaW50byBhcnJheSBvZiBzMzJfdC4KKyAqCisgKiBAcGFyYW0gcCBwb2ludHMgdG8gYSBwYnVmIGhvbGRpbmcgYW4gQVNOMSBjb2RlZCBvYmplY3QgaWRlbnRpZmllcgorICogQHBhcmFtIG9mcyBwb2ludHMgdG8gdGhlIG9mZnNldCB3aXRoaW4gdGhlIHBidWYgY2hhaW4gb2YgdGhlIEFTTjEgY29kZWQgb2JqZWN0IGlkZW50aWZpZXIKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHRoZSBjb2RlZCBvYmplY3QgaWRlbnRpZmllcgorICogQHBhcmFtIG9pZCByZXR1cm4gb2JqZWN0IGlkZW50aWZpZXIgc3RydWN0CisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsbCwgRVJSX0FSRyBpZiB3ZSBjYW4ndCAob3Igd29uJ3QpIGRlY29kZQorICovCitlcnJfdAorc25tcF9hc24xX2RlY19vaWQoc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcywgdTE2X3QgbGVuLCBzdHJ1Y3Qgc25tcF9vYmpfaWQgKm9pZCkKK3sKKyAgdTE2X3QgcGxlbiwgYmFzZTsKKyAgdThfdCAqbXNnX3B0cjsKKyAgczMyX3QgKm9pZF9wdHI7CisKKyAgcGxlbiA9IDA7CisgIHdoaWxlIChwICE9IE5VTEwpCisgIHsKKyAgICBiYXNlID0gcGxlbjsKKyAgICBwbGVuICs9IHAtPmxlbjsKKyAgICBpZiAob2ZzIDwgcGxlbikKKyAgICB7CisgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICBtc2dfcHRyICs9IG9mcyAtIGJhc2U7CisKKyAgICAgIG9pZC0+bGVuID0gMDsKKyAgICAgIG9pZF9wdHIgPSAmb2lkLT5pZFswXTsKKyAgICAgIGlmIChsZW4gPiAwKQorICAgICAgeworICAgICAgICAvKiBmaXJzdCBjb21wcmVzc2VkIG9jdGV0ICovCisgICAgICAgIGlmICgqbXNnX3B0ciA9PSAweDJCKQorICAgICAgICB7CisgICAgICAgICAgLyogKG1vc3QpIGNvbW1vbiBjYXNlIDEuMyAoaXNvLm9yZykgKi8KKyAgICAgICAgICAqb2lkX3B0ciA9IDE7CisgICAgICAgICAgb2lkX3B0cisrOworICAgICAgICAgICpvaWRfcHRyID0gMzsKKyAgICAgICAgICBvaWRfcHRyKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKm1zZ19wdHIgPCA0MCkKKyAgICAgICAgeworICAgICAgICAgICpvaWRfcHRyID0gMDsKKyAgICAgICAgICBvaWRfcHRyKys7CisgICAgICAgICAgKm9pZF9wdHIgPSAqbXNnX3B0cjsKKyAgICAgICAgICBvaWRfcHRyKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKm1zZ19wdHIgPCA4MCkKKyAgICAgICAgeworICAgICAgICAgICpvaWRfcHRyID0gMTsKKyAgICAgICAgICBvaWRfcHRyKys7CisgICAgICAgICAgKm9pZF9wdHIgPSAoKm1zZ19wdHIpIC0gNDA7CisgICAgICAgICAgb2lkX3B0cisrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICpvaWRfcHRyID0gMjsKKyAgICAgICAgICBvaWRfcHRyKys7CisgICAgICAgICAgKm9pZF9wdHIgPSAoKm1zZ19wdHIpIC0gODA7CisgICAgICAgICAgb2lkX3B0cisrOworICAgICAgICB9CisgICAgICAgIG9pZC0+bGVuID0gMjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogYWNjZXB0aW5nIHplcm8gbGVuZ3RoIGlkZW50aWZpZXJzIGUuZy4gZm9yCisgICAgICAgICAgIGdldG5leHQgb3BlcmF0aW9uLiB1bmNvbW1vbiBidXQgdmFsaWQgKi8KKyAgICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICAgIH0KKyAgICAgIGxlbi0tOworICAgICAgaWYgKGxlbiA+IDApCisgICAgICB7CisgICAgICAgIG9mcyArPSAxOworICAgICAgICBpZiAob2ZzID49IHBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIG5leHQgcGJ1ZiAqLworICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICAgIGlmIChwID09IE5VTEwpIHsgcmV0dXJuIEVSUl9BUkc7IH0KKyAgICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgICAgcGxlbiArPSBwLT5sZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogbmV4dCBvY3RldCBpbiBzYW1lIHBidWYgKi8KKyAgICAgICAgICBtc2dfcHRyKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlICgobGVuID4gMCkgJiYgKG9pZC0+bGVuIDwgTFdJUF9TTk1QX09CSl9JRF9MRU4pKQorICAgICAgeworICAgICAgICAvKiBzdWItaWRlbnRpZmllciB1c2VzIG11bHRpcGxlIG9jdGV0cyAqLworICAgICAgICBpZiAoKm1zZ19wdHIgJiAweDgwKQorICAgICAgICB7CisgICAgICAgICAgczMyX3Qgc3ViX2lkID0gMDsKKworICAgICAgICAgIHdoaWxlICgoKm1zZ19wdHIgJiAweDgwKSAmJiAobGVuID4gMSkpCisgICAgICAgICAgeworICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICBzdWJfaWQgPSAoc3ViX2lkIDw8IDcpICsgKCptc2dfcHRyICYgfjB4ODApOworICAgICAgICAgICAgb2ZzICs9IDE7CisgICAgICAgICAgICBpZiAob2ZzID49IHBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gbmV4dCBwYnVmICovCisgICAgICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7IHJldHVybiBFUlJfQVJHOyB9CisgICAgICAgICAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgICAgICAgICAgcGxlbiArPSBwLT5sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gc2FtZSBwYnVmICovCisgICAgICAgICAgICAgIG1zZ19wdHIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCEoKm1zZ19wdHIgJiAweDgwKSAmJiAobGVuID4gMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogbGFzdCBvY3RldCBzdWItaWRlbnRpZmllciAqLworICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICBzdWJfaWQgPSAoc3ViX2lkIDw8IDcpICsgKm1zZ19wdHI7CisgICAgICAgICAgICAqb2lkX3B0ciA9IHN1Yl9pZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogISgqbXNnX3B0ciAmIDB4ODApIHN1Yi1pZGVudGlmaWVyIHVzZXMgc2luZ2xlIG9jdGV0ICovCisgICAgICAgICAgbGVuLS07CisgICAgICAgICAgKm9pZF9wdHIgPSAqbXNnX3B0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHJlbWFpbmluZyBvaWQgYnl0ZXMgYXZhaWxhYmxlIC4uLiAqLworICAgICAgICAgIG9mcyArPSAxOworICAgICAgICAgIGlmIChvZnMgPj0gcGxlbikKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIG5leHQgcGJ1ZiAqLworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7IHJldHVybiBFUlJfQVJHOyB9CisgICAgICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgICAgICBwbGVuICs9IHAtPmxlbjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gc2FtZSBwYnVmICovCisgICAgICAgICAgICBtc2dfcHRyKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9pZF9wdHIrKzsKKyAgICAgICAgb2lkLT5sZW4rKzsKKyAgICAgIH0KKyAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgIHsKKyAgICAgICAgLyogbGVuID09IDAsIGVuZCBvZiBvaWQgKi8KKyAgICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogbGVuID4gMCwgb2lkLT5sZW4gPT0gTFdJUF9TTk1QX09CSl9JRF9MRU4gb3IgbWFsZm9ybWVkIGVuY29kaW5nICovCisgICAgICAgIHJldHVybiBFUlJfQVJHOworICAgICAgfQorCisgICAgfQorICAgIHAgPSBwLT5uZXh0OworICB9CisgIC8qIHAgPT0gTlVMTCwgb2ZzID49IHBsZW4gKi8KKyAgcmV0dXJuIEVSUl9BUkc7Cit9CisKKy8qKgorICogRGVjb2RlcyAoY29waWVzKSByYXcgZGF0YSAoaXAtYWRkcmVzc2VzLCBvY3RldCBzdHJpbmdzLCBvcGFxdWUgZW5jb2RpbmcpCisgKiBmcm9tIGluY29taW5nIG1lc3NhZ2UgaW50byBhcnJheS4KKyAqCisgKiBAcGFyYW0gcCBwb2ludHMgdG8gYSBwYnVmIGhvbGRpbmcgYW4gQVNOMSBjb2RlZCByYXcgZGF0YQorICogQHBhcmFtIG9mcyBwb2ludHMgdG8gdGhlIG9mZnNldCB3aXRoaW4gdGhlIHBidWYgY2hhaW4gb2YgdGhlIEFTTjEgY29kZWQgcmF3IGRhdGEKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHRoZSBjb2RlZCByYXcgZGF0YSAoemVybyBpcyB2YWxpZCwgZS5nLiBlbXB0eSBzdHJpbmchKQorICogQHBhcmFtIHJhd19sZW4gbGVuZ3RoIG9mIHRoZSByYXcgcmV0dXJuIHZhbHVlCisgKiBAcGFyYW0gcmF3IHJldHVybiByYXcgYnl0ZXMKKyAqIEByZXR1cm4gRVJSX09LIGlmIHN1Y2Nlc3NmdWxsLCBFUlJfQVJHIGlmIHdlIGNhbid0IChvciB3b24ndCkgZGVjb2RlCisgKi8KK2Vycl90Citzbm1wX2FzbjFfZGVjX3JhdyhzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1MTZfdCBsZW4sIHUxNl90IHJhd19sZW4sIHU4X3QgKnJhdykKK3sKKyAgdTE2X3QgcGxlbiwgYmFzZTsKKyAgdThfdCAqbXNnX3B0cjsKKworICBpZiAobGVuID4gMCkKKyAgeworICAgIHBsZW4gPSAwOworICAgIHdoaWxlIChwICE9IE5VTEwpCisgICAgeworICAgICAgYmFzZSA9IHBsZW47CisgICAgICBwbGVuICs9IHAtPmxlbjsKKyAgICAgIGlmIChvZnMgPCBwbGVuKQorICAgICAgeworICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgIG1zZ19wdHIgKz0gb2ZzIC0gYmFzZTsKKyAgICAgICAgaWYgKHJhd19sZW4gPj0gbGVuKQorICAgICAgICB7CisgICAgICAgICAgd2hpbGUgKGxlbiA+IDEpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogY29weSBsZW4gLSAxIG9jdGV0cyAqLworICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICAqcmF3ID0gKm1zZ19wdHI7CisgICAgICAgICAgICByYXcrKzsKKyAgICAgICAgICAgIG9mcyArPSAxOworICAgICAgICAgICAgaWYgKG9mcyA+PSBwbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIG5leHQgcGJ1ZiAqLworICAgICAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeyByZXR1cm4gRVJSX0FSRzsgfQorICAgICAgICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgICAgICAgIHBsZW4gKz0gcC0+bGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIHNhbWUgcGJ1ZiAqLworICAgICAgICAgICAgICBtc2dfcHRyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGNvcHkgbGFzdCBvY3RldCAqLworICAgICAgICAgICpyYXcgPSAqbXNnX3B0cjsKKyAgICAgICAgICByZXR1cm4gRVJSX09LOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHJhd19sZW4gPCBsZW4sIG5vdCBlbm91Z2ggZHN0IHNwYWNlICovCisgICAgICAgICAgcmV0dXJuIEVSUl9BUkc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHAgPSBwLT5uZXh0OworICAgIH0KKyAgICAvKiBwID09IE5VTEwsIG9mcyA+PSBwbGVuICovCisgICAgcmV0dXJuIEVSUl9BUkc7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbGVuID09IDAsIGVtcHR5IHN0cmluZyAqLworICAgIHJldHVybiBFUlJfT0s7CisgIH0KK30KKworI2VuZGlmIC8qIExXSVBfU05NUCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL3NubXAvYXNuMV9lbmMuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS9zbm1wL2FzbjFfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkZmM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvY29yZS9zbm1wL2FzbjFfZW5jLmMKQEAgLTAsMCArMSw2MTEgQEAKKy8qKgorICogQGZpbGUKKyAqIEFic3RyYWN0IFN5bnRheCBOb3RhdGlvbiBPbmUgKElTTyA4ODI0LCA4ODI1KSBlbmNvZGluZworICoKKyAqIEB0b2RvIG5vdCBvcHRpbWlzZWQgKHlldCksIGZhdm9yIGNvcnJlY3RuZXNzIG92ZXIgc3BlZWQsIGZhdm9yIHNwZWVkIG92ZXIgc2l6ZQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQXhvbiBEaWdpdGFsIERlc2lnbiBCLlYuLCBUaGUgTmV0aGVybGFuZHMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yOiBDaHJpc3RpYWFuIFNpbW9ucyA8Y2hyaXN0aWFhbi5zaW1vbnNAYXhvbi50dj4KKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfU05NUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvc25tcF9hc24xLmgiCisKKy8qKgorICogUmV0dXJucyBvY3RldCBjb3VudCBmb3IgbGVuZ3RoLgorICoKKyAqIEBwYXJhbSBsZW5ndGgKKyAqIEBwYXJhbSBvY3RldHNfbmVlZGVkIHBvaW50cyB0byB0aGUgcmV0dXJuIHZhbHVlCisgKi8KK3ZvaWQKK3NubXBfYXNuMV9lbmNfbGVuZ3RoX2NudCh1MTZfdCBsZW5ndGgsIHU4X3QgKm9jdGV0c19uZWVkZWQpCit7CisgIGlmIChsZW5ndGggPCAweDgwVSkKKyAgeworICAgICpvY3RldHNfbmVlZGVkID0gMTsKKyAgfQorICBlbHNlIGlmIChsZW5ndGggPCAweDEwMFUpCisgIHsKKyAgICAqb2N0ZXRzX25lZWRlZCA9IDI7CisgIH0KKyAgZWxzZQorICB7CisgICAgKm9jdGV0c19uZWVkZWQgPSAzOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBvY3RldCBjb3VudCBmb3IgYW4gdTMyX3QuCisgKgorICogQHBhcmFtIHZhbHVlCisgKiBAcGFyYW0gb2N0ZXRzX25lZWRlZCBwb2ludHMgdG8gdGhlIHJldHVybiB2YWx1ZQorICoKKyAqIEBub3RlIEFTTiBjb2RlZCBpbnRlZ2VycyBhcmUgX2Fsd2F5c18gc2lnbmVkLiBFLmcuICsweEZGRkYgaXMgY29kZWQKKyAqIGFzIDB4MDAsMHhGRiwweEZGLiBOb3RlIHRoZSBsZWFkaW5nIHNpZ24gb2N0ZXQuIEEgcG9zaXRpdmUgdmFsdWUKKyAqIG9mIDB4RkZGRkZGRkYgaXMgcHJlY2VkZWQgd2l0aCAweDAwIGFuZCB0aGUgbGVuZ3RoIGlzIDUgb2N0ZXRzISEKKyAqLwordm9pZAorc25tcF9hc24xX2VuY191MzJ0X2NudCh1MzJfdCB2YWx1ZSwgdTE2X3QgKm9jdGV0c19uZWVkZWQpCit7CisgIGlmICh2YWx1ZSA8IDB4ODBVTCkKKyAgeworICAgICpvY3RldHNfbmVlZGVkID0gMTsKKyAgfQorICBlbHNlIGlmICh2YWx1ZSA8IDB4ODAwMFVMKQorICB7CisgICAgKm9jdGV0c19uZWVkZWQgPSAyOworICB9CisgIGVsc2UgaWYgKHZhbHVlIDwgMHg4MDAwMDBVTCkKKyAgeworICAgICpvY3RldHNfbmVlZGVkID0gMzsKKyAgfQorICBlbHNlIGlmICh2YWx1ZSA8IDB4ODAwMDAwMDBVTCkKKyAgeworICAgICpvY3RldHNfbmVlZGVkID0gNDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAqb2N0ZXRzX25lZWRlZCA9IDU7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIG9jdGV0IGNvdW50IGZvciBhbiBzMzJfdC4KKyAqCisgKiBAcGFyYW0gdmFsdWUKKyAqIEBwYXJhbSBvY3RldHNfbmVlZGVkIHBvaW50cyB0byB0aGUgcmV0dXJuIHZhbHVlCisgKgorICogQG5vdGUgQVNOIGNvZGVkIGludGVnZXJzIGFyZSBfYWx3YXlzXyBzaWduZWQuCisgKi8KK3ZvaWQKK3NubXBfYXNuMV9lbmNfczMydF9jbnQoczMyX3QgdmFsdWUsIHUxNl90ICpvY3RldHNfbmVlZGVkKQoreworICBpZiAodmFsdWUgPCAwKQorICB7CisgICAgdmFsdWUgPSB+dmFsdWU7CisgIH0KKyAgaWYgKHZhbHVlIDwgMHg4MEwpCisgIHsKKyAgICAqb2N0ZXRzX25lZWRlZCA9IDE7CisgIH0KKyAgZWxzZSBpZiAodmFsdWUgPCAweDgwMDBMKQorICB7CisgICAgKm9jdGV0c19uZWVkZWQgPSAyOworICB9CisgIGVsc2UgaWYgKHZhbHVlIDwgMHg4MDAwMDBMKQorICB7CisgICAgKm9jdGV0c19uZWVkZWQgPSAzOworICB9CisgIGVsc2UKKyAgeworICAgICpvY3RldHNfbmVlZGVkID0gNDsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgb2N0ZXQgY291bnQgZm9yIGFuIG9iamVjdCBpZGVudGlmaWVyLgorICoKKyAqIEBwYXJhbSBpZGVudF9sZW4gb2JqZWN0IGlkZW50aWZpZXIgYXJyYXkgbGVuZ3RoCisgKiBAcGFyYW0gaWRlbnQgcG9pbnRzIHRvIG9iamVjdCBpZGVudGlmaWVyIGFycmF5CisgKiBAcGFyYW0gb2N0ZXRzX25lZWRlZCBwb2ludHMgdG8gdGhlIHJldHVybiB2YWx1ZQorICovCit2b2lkCitzbm1wX2FzbjFfZW5jX29pZF9jbnQodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgdTE2X3QgKm9jdGV0c19uZWVkZWQpCit7CisgIHMzMl90IHN1Yl9pZDsKKyAgdThfdCBjbnQ7CisKKyAgY250ID0gMDsKKyAgaWYgKGlkZW50X2xlbiA+IDEpCisgIHsKKyAgICAvKiBjb21wcmVzc2VkIHByZWZpeCBpbiBvbmUgb2N0ZXQgKi8KKyAgICBjbnQrKzsKKyAgICBpZGVudF9sZW4gLT0gMjsKKyAgICBpZGVudCArPSAyOworICB9CisgIHdoaWxlKGlkZW50X2xlbiA+IDApCisgIHsKKyAgICBpZGVudF9sZW4tLTsKKyAgICBzdWJfaWQgPSAqaWRlbnQ7CisKKyAgICBzdWJfaWQgPj49IDc7CisgICAgY250Kys7CisgICAgd2hpbGUoc3ViX2lkID4gMCkKKyAgICB7CisgICAgICBzdWJfaWQgPj49IDc7CisgICAgICBjbnQrKzsKKyAgICB9CisgICAgaWRlbnQrKzsKKyAgfQorICAqb2N0ZXRzX25lZWRlZCA9IGNudDsKK30KKworLyoqCisgKiBFbmNvZGVzIEFTTiB0eXBlIGZpZWxkIGludG8gYSBwYnVmIGNoYWluZWQgQVNOMSBtc2cuCisgKgorICogQHBhcmFtIHAgcG9pbnRzIHRvIG91dHB1dCBwYnVmIHRvIGVuY29kZSB2YWx1ZSBpbnRvCisgKiBAcGFyYW0gb2ZzIHBvaW50cyB0byB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGJ1ZiBjaGFpbgorICogQHBhcmFtIHR5cGUgaW5wdXQgQVNOMSB0eXBlCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsbCwgRVJSX0FSRyBpZiB3ZSBjYW4ndCAob3Igd29uJ3QpIGVuY29kZQorICovCitlcnJfdAorc25tcF9hc24xX2VuY190eXBlKHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMsIHU4X3QgdHlwZSkKK3sKKyAgdTE2X3QgcGxlbiwgYmFzZTsKKyAgdThfdCAqbXNnX3B0cjsKKworICBwbGVuID0gMDsKKyAgd2hpbGUgKHAgIT0gTlVMTCkKKyAgeworICAgIGJhc2UgPSBwbGVuOworICAgIHBsZW4gKz0gcC0+bGVuOworICAgIGlmIChvZnMgPCBwbGVuKQorICAgIHsKKyAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgIG1zZ19wdHIgKz0gb2ZzIC0gYmFzZTsKKyAgICAgICptc2dfcHRyID0gdHlwZTsKKyAgICAgIHJldHVybiBFUlJfT0s7CisgICAgfQorICAgIHAgPSBwLT5uZXh0OworICB9CisgIC8qIHAgPT0gTlVMTCwgb2ZzID49IHBsZW4gKi8KKyAgcmV0dXJuIEVSUl9BUkc7Cit9CisKKy8qKgorICogRW5jb2RlcyBob3N0IG9yZGVyIGxlbmd0aCBmaWVsZCBpbnRvIGEgcGJ1ZiBjaGFpbmVkIEFTTjEgbXNnLgorICoKKyAqIEBwYXJhbSBwIHBvaW50cyB0byBvdXRwdXQgcGJ1ZiB0byBlbmNvZGUgbGVuZ3RoIGludG8KKyAqIEBwYXJhbSBvZnMgcG9pbnRzIHRvIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYnVmIGNoYWluCisgKiBAcGFyYW0gbGVuZ3RoIGlzIHRoZSBob3N0IG9yZGVyIGxlbmd0aCB0byBiZSBlbmNvZGVkCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsbCwgRVJSX0FSRyBpZiB3ZSBjYW4ndCAob3Igd29uJ3QpIGVuY29kZQorICovCitlcnJfdAorc25tcF9hc24xX2VuY19sZW5ndGgoc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcywgdTE2X3QgbGVuZ3RoKQoreworICB1MTZfdCBwbGVuLCBiYXNlOworICB1OF90ICptc2dfcHRyOworCisgIHBsZW4gPSAwOworICB3aGlsZSAocCAhPSBOVUxMKQorICB7CisgICAgYmFzZSA9IHBsZW47CisgICAgcGxlbiArPSBwLT5sZW47CisgICAgaWYgKG9mcyA8IHBsZW4pCisgICAgeworICAgICAgbXNnX3B0ciA9ICh1OF90KilwLT5wYXlsb2FkOworICAgICAgbXNnX3B0ciArPSBvZnMgLSBiYXNlOworCisgICAgICBpZiAobGVuZ3RoIDwgMHg4MCkKKyAgICAgIHsKKyAgICAgICAgKm1zZ19wdHIgPSAodThfdClsZW5ndGg7CisgICAgICAgIHJldHVybiBFUlJfT0s7CisgICAgICB9CisgICAgICBlbHNlIGlmIChsZW5ndGggPCAweDEwMCkKKyAgICAgIHsKKyAgICAgICAgKm1zZ19wdHIgPSAweDgxOworICAgICAgICBvZnMgKz0gMTsKKyAgICAgICAgaWYgKG9mcyA+PSBwbGVuKQorICAgICAgICB7CisgICAgICAgICAgLyogbmV4dCBvY3RldCBpbiBuZXh0IHBidWYgKi8KKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7IHJldHVybiBFUlJfQVJHOyB9CisgICAgICAgICAgbXNnX3B0ciA9ICh1OF90KilwLT5wYXlsb2FkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gc2FtZSBwYnVmICovCisgICAgICAgICAgbXNnX3B0cisrOworICAgICAgICB9CisgICAgICAgICptc2dfcHRyID0gKHU4X3QpbGVuZ3RoOworICAgICAgICByZXR1cm4gRVJSX09LOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB1OF90IGk7CisKKyAgICAgICAgLyogbGVuZ3RoID49IDB4MTAwICYmIGxlbmd0aCA8PSAweEZGRkYgKi8KKyAgICAgICAgKm1zZ19wdHIgPSAweDgyOworICAgICAgICBpID0gMjsKKyAgICAgICAgd2hpbGUgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaS0tOworICAgICAgICAgIG9mcyArPSAxOworICAgICAgICAgIGlmIChvZnMgPj0gcGxlbikKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIG5leHQgcGJ1ZiAqLworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7IHJldHVybiBFUlJfQVJHOyB9CisgICAgICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgICAgICBwbGVuICs9IHAtPmxlbjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gc2FtZSBwYnVmICovCisgICAgICAgICAgICBtc2dfcHRyKys7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgeworICAgICAgICAgICAgLyogbGVhc3Qgc2lnbmlmaWNhbnQgbGVuZ3RoIG9jdGV0ICovCisgICAgICAgICAgICAqbXNnX3B0ciA9ICh1OF90KWxlbmd0aDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG1vc3Qgc2lnbmlmaWNhbnQgbGVuZ3RoIG9jdGV0ICovCisgICAgICAgICAgICAqbXNnX3B0ciA9ICh1OF90KShsZW5ndGggPj4gOCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBFUlJfT0s7CisgICAgICB9CisgICAgfQorICAgIHAgPSBwLT5uZXh0OworICB9CisgIC8qIHAgPT0gTlVMTCwgb2ZzID49IHBsZW4gKi8KKyAgcmV0dXJuIEVSUl9BUkc7Cit9CisKKy8qKgorICogRW5jb2RlcyB1MzJfdCAoY291bnRlciwgZ2F1Z2UsIHRpbWV0aWNrcykgaW50byBhIHBidWYgY2hhaW5lZCBBU04xIG1zZy4KKyAqCisgKiBAcGFyYW0gcCBwb2ludHMgdG8gb3V0cHV0IHBidWYgdG8gZW5jb2RlIHZhbHVlIGludG8KKyAqIEBwYXJhbSBvZnMgcG9pbnRzIHRvIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYnVmIGNoYWluCisgKiBAcGFyYW0gb2N0ZXRzX25lZWRlZCBlbmNvZGluZyBsZW5ndGggKGZyb20gc25tcF9hc24xX2VuY191MzJ0X2NudCgpKQorICogQHBhcmFtIHZhbHVlIGlzIHRoZSBob3N0IG9yZGVyIHUzMl90IHZhbHVlIHRvIGJlIGVuY29kZWQKKyAqIEByZXR1cm4gRVJSX09LIGlmIHN1Y2Nlc3NmdWxsLCBFUlJfQVJHIGlmIHdlIGNhbid0IChvciB3b24ndCkgZW5jb2RlCisgKgorICogQHNlZSBzbm1wX2FzbjFfZW5jX3UzMnRfY250KCkKKyAqLworZXJyX3QKK3NubXBfYXNuMV9lbmNfdTMydChzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1MTZfdCBvY3RldHNfbmVlZGVkLCB1MzJfdCB2YWx1ZSkKK3sKKyAgdTE2X3QgcGxlbiwgYmFzZTsKKyAgdThfdCAqbXNnX3B0cjsKKworICBwbGVuID0gMDsKKyAgd2hpbGUgKHAgIT0gTlVMTCkKKyAgeworICAgIGJhc2UgPSBwbGVuOworICAgIHBsZW4gKz0gcC0+bGVuOworICAgIGlmIChvZnMgPCBwbGVuKQorICAgIHsKKyAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgIG1zZ19wdHIgKz0gb2ZzIC0gYmFzZTsKKworICAgICAgaWYgKG9jdGV0c19uZWVkZWQgPT0gNSkKKyAgICAgIHsKKyAgICAgICAgLyogbm90IGVub3VnaCBiaXRzIGluICd2YWx1ZScgYWRkIGxlYWRpbmcgMHgwMCAqLworICAgICAgICBvY3RldHNfbmVlZGVkLS07CisgICAgICAgICptc2dfcHRyID0gMHgwMDsKKyAgICAgICAgb2ZzICs9IDE7CisgICAgICAgIGlmIChvZnMgPj0gcGxlbikKKyAgICAgICAgeworICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gbmV4dCBwYnVmICovCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeyByZXR1cm4gRVJSX0FSRzsgfQorICAgICAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgICAgICBwbGVuICs9IHAtPmxlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIHNhbWUgcGJ1ZiAqLworICAgICAgICAgIG1zZ19wdHIrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgd2hpbGUgKG9jdGV0c19uZWVkZWQgPiAxKQorICAgICAgeworICAgICAgICBvY3RldHNfbmVlZGVkLS07CisgICAgICAgICptc2dfcHRyID0gKHU4X3QpKHZhbHVlID4+IChvY3RldHNfbmVlZGVkIDw8IDMpKTsKKyAgICAgICAgb2ZzICs9IDE7CisgICAgICAgIGlmIChvZnMgPj0gcGxlbikKKyAgICAgICAgeworICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gbmV4dCBwYnVmICovCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeyByZXR1cm4gRVJSX0FSRzsgfQorICAgICAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgICAgICBwbGVuICs9IHAtPmxlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIHNhbWUgcGJ1ZiAqLworICAgICAgICAgIG1zZ19wdHIrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogKG9ubHkpIG9uZSBsZWFzdCBzaWduaWZpY2FudCBvY3RldCAqLworICAgICAgKm1zZ19wdHIgPSAodThfdCl2YWx1ZTsKKyAgICAgIHJldHVybiBFUlJfT0s7CisgICAgfQorICAgIHAgPSBwLT5uZXh0OworICB9CisgIC8qIHAgPT0gTlVMTCwgb2ZzID49IHBsZW4gKi8KKyAgcmV0dXJuIEVSUl9BUkc7Cit9CisKKy8qKgorICogRW5jb2RlcyBzMzJfdCBpbnRlZ2VyIGludG8gYSBwYnVmIGNoYWluZWQgQVNOMSBtc2cuCisgKgorICogQHBhcmFtIHAgcG9pbnRzIHRvIG91dHB1dCBwYnVmIHRvIGVuY29kZSB2YWx1ZSBpbnRvCisgKiBAcGFyYW0gb2ZzIHBvaW50cyB0byB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGJ1ZiBjaGFpbgorICogQHBhcmFtIG9jdGV0c19uZWVkZWQgZW5jb2RpbmcgbGVuZ3RoIChmcm9tIHNubXBfYXNuMV9lbmNfczMydF9jbnQoKSkKKyAqIEBwYXJhbSB2YWx1ZSBpcyB0aGUgaG9zdCBvcmRlciBzMzJfdCB2YWx1ZSB0byBiZSBlbmNvZGVkCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsbCwgRVJSX0FSRyBpZiB3ZSBjYW4ndCAob3Igd29uJ3QpIGVuY29kZQorICoKKyAqIEBzZWUgc25tcF9hc24xX2VuY19zMzJ0X2NudCgpCisgKi8KK2Vycl90Citzbm1wX2FzbjFfZW5jX3MzMnQoc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcywgdTE2X3Qgb2N0ZXRzX25lZWRlZCwgczMyX3QgdmFsdWUpCit7CisgIHUxNl90IHBsZW4sIGJhc2U7CisgIHU4X3QgKm1zZ19wdHI7CisKKyAgcGxlbiA9IDA7CisgIHdoaWxlIChwICE9IE5VTEwpCisgIHsKKyAgICBiYXNlID0gcGxlbjsKKyAgICBwbGVuICs9IHAtPmxlbjsKKyAgICBpZiAob2ZzIDwgcGxlbikKKyAgICB7CisgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICBtc2dfcHRyICs9IG9mcyAtIGJhc2U7CisKKyAgICAgIHdoaWxlIChvY3RldHNfbmVlZGVkID4gMSkKKyAgICAgIHsKKyAgICAgICAgb2N0ZXRzX25lZWRlZC0tOworICAgICAgICAqbXNnX3B0ciA9ICh1OF90KSh2YWx1ZSA+PiAob2N0ZXRzX25lZWRlZCA8PCAzKSk7CisgICAgICAgIG9mcyArPSAxOworICAgICAgICBpZiAob2ZzID49IHBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIG5leHQgcGJ1ZiAqLworICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICAgIGlmIChwID09IE5VTEwpIHsgcmV0dXJuIEVSUl9BUkc7IH0KKyAgICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgICAgcGxlbiArPSBwLT5sZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogbmV4dCBvY3RldCBpbiBzYW1lIHBidWYgKi8KKyAgICAgICAgICBtc2dfcHRyKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIChvbmx5KSBvbmUgbGVhc3Qgc2lnbmlmaWNhbnQgb2N0ZXQgKi8KKyAgICAgICptc2dfcHRyID0gKHU4X3QpdmFsdWU7CisgICAgICByZXR1cm4gRVJSX09LOworICAgIH0KKyAgICBwID0gcC0+bmV4dDsKKyAgfQorICAvKiBwID09IE5VTEwsIG9mcyA+PSBwbGVuICovCisgIHJldHVybiBFUlJfQVJHOworfQorCisvKioKKyAqIEVuY29kZXMgb2JqZWN0IGlkZW50aWZpZXIgaW50byBhIHBidWYgY2hhaW5lZCBBU04xIG1zZy4KKyAqCisgKiBAcGFyYW0gcCBwb2ludHMgdG8gb3V0cHV0IHBidWYgdG8gZW5jb2RlIG9pZCBpbnRvCisgKiBAcGFyYW0gb2ZzIHBvaW50cyB0byB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGJ1ZiBjaGFpbgorICogQHBhcmFtIGlkZW50X2xlbiBvYmplY3QgaWRlbnRpZmllciBhcnJheSBsZW5ndGgKKyAqIEBwYXJhbSBpZGVudCBwb2ludHMgdG8gb2JqZWN0IGlkZW50aWZpZXIgYXJyYXkKKyAqIEByZXR1cm4gRVJSX09LIGlmIHN1Y2Nlc3NmdWxsLCBFUlJfQVJHIGlmIHdlIGNhbid0IChvciB3b24ndCkgZW5jb2RlCisgKi8KK2Vycl90Citzbm1wX2FzbjFfZW5jX29pZChzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50KQoreworICB1MTZfdCBwbGVuLCBiYXNlOworICB1OF90ICptc2dfcHRyOworCisgIHBsZW4gPSAwOworICB3aGlsZSAocCAhPSBOVUxMKQorICB7CisgICAgYmFzZSA9IHBsZW47CisgICAgcGxlbiArPSBwLT5sZW47CisgICAgaWYgKG9mcyA8IHBsZW4pCisgICAgeworICAgICAgbXNnX3B0ciA9ICh1OF90KilwLT5wYXlsb2FkOworICAgICAgbXNnX3B0ciArPSBvZnMgLSBiYXNlOworCisgICAgICBpZiAoaWRlbnRfbGVuID4gMSkKKyAgICAgIHsKKyAgICAgICAgaWYgKChpZGVudFswXSA9PSAxKSAmJiAoaWRlbnRbMV0gPT0gMykpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBjb21wcmVzc2VkIChtb3N0IGNvbW1vbikgcHJlZml4IC5pc28ub3JnICovCisgICAgICAgICAgKm1zZ19wdHIgPSAweDJiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGNhbGN1bGF0ZSBwcmVmaXggKi8KKyAgICAgICAgICAqbXNnX3B0ciA9ICh1OF90KSgoaWRlbnRbMF0gKiA0MCkgKyBpZGVudFsxXSk7CisgICAgICAgIH0KKyAgICAgICAgb2ZzICs9IDE7CisgICAgICAgIGlmIChvZnMgPj0gcGxlbikKKyAgICAgICAgeworICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gbmV4dCBwYnVmICovCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeyByZXR1cm4gRVJSX0FSRzsgfQorICAgICAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgICAgICBwbGVuICs9IHAtPmxlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIHNhbWUgcGJ1ZiAqLworICAgICAgICAgIG1zZ19wdHIrKzsKKyAgICAgICAgfQorICAgICAgICBpZGVudF9sZW4gLT0gMjsKKyAgICAgICAgaWRlbnQgKz0gMjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKy8qIEBidWc6ICBhbGxvdyBlbXB0eSB2YXJiaW5kcyBmb3Igc3ltbWV0cnkgKHdlIG11c3QgZGVjb2RlIHRoZW0gZm9yIGdldG5leHQpLCBhbGxvdyBwYXJ0aWFsIGNvbXByZXNzaW9uPz8gICovCisgICAgICAgIC8qIGlkZW50X2xlbiA8PSAxLCBhdCBsZWFzdCB3ZSBuZWVkIHplcm9Eb3RaZXJvICgwLjApIChpZGVudF9sZW4gPT0gMikgKi8KKyAgICAgICAgcmV0dXJuIEVSUl9BUkc7CisgICAgICB9CisgICAgICB3aGlsZSAoaWRlbnRfbGVuID4gMCkKKyAgICAgIHsKKyAgICAgICAgczMyX3Qgc3ViX2lkOworICAgICAgICB1OF90IHNoaWZ0LCB0YWlsOworCisgICAgICAgIGlkZW50X2xlbi0tOworICAgICAgICBzdWJfaWQgPSAqaWRlbnQ7CisgICAgICAgIHRhaWwgPSAwOworICAgICAgICBzaGlmdCA9IDI4OworICAgICAgICB3aGlsZShzaGlmdCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICB1OF90IGNvZGU7CisKKyAgICAgICAgICBjb2RlID0gKHU4X3QpKHN1Yl9pZCA+PiBzaGlmdCk7CisgICAgICAgICAgaWYgKChjb2RlICE9IDApIHx8ICh0YWlsICE9IDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRhaWwgPSAxOworICAgICAgICAgICAgKm1zZ19wdHIgPSBjb2RlIHwgMHg4MDsKKyAgICAgICAgICAgIG9mcyArPSAxOworICAgICAgICAgICAgaWYgKG9mcyA+PSBwbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIG5leHQgcGJ1ZiAqLworICAgICAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeyByZXR1cm4gRVJSX0FSRzsgfQorICAgICAgICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgICAgICAgIHBsZW4gKz0gcC0+bGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIHNhbWUgcGJ1ZiAqLworICAgICAgICAgICAgICBtc2dfcHRyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHNoaWZ0IC09IDc7CisgICAgICAgIH0KKyAgICAgICAgKm1zZ19wdHIgPSAodThfdClzdWJfaWQgJiAweDdGOworICAgICAgICBpZiAoaWRlbnRfbGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgIG9mcyArPSAxOworICAgICAgICAgIGlmIChvZnMgPj0gcGxlbikKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIG5leHQgcGJ1ZiAqLworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7IHJldHVybiBFUlJfQVJHOyB9CisgICAgICAgICAgICBtc2dfcHRyID0gKHU4X3QqKXAtPnBheWxvYWQ7CisgICAgICAgICAgICBwbGVuICs9IHAtPmxlbjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gc2FtZSBwYnVmICovCisgICAgICAgICAgICBtc2dfcHRyKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHByb2NlZWQgdG8gbmV4dCBzdWItaWRlbnRpZmllciAqLworICAgICAgICBpZGVudCsrOworICAgICAgfQorICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICB9CisgICAgcCA9IHAtPm5leHQ7CisgIH0KKyAgLyogcCA9PSBOVUxMLCBvZnMgPj0gcGxlbiAqLworICByZXR1cm4gRVJSX0FSRzsKK30KKworLyoqCisgKiBFbmNvZGVzIHJhdyBkYXRhIChvY3RldCBzdHJpbmcsIG9wYXF1ZSkgaW50byBhIHBidWYgY2hhaW5lZCBBU04xIG1zZy4KKyAqCisgKiBAcGFyYW0gcCBwb2ludHMgdG8gb3V0cHV0IHBidWYgdG8gZW5jb2RlIHJhdyBkYXRhIGludG8KKyAqIEBwYXJhbSBvZnMgcG9pbnRzIHRvIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYnVmIGNoYWluCisgKiBAcGFyYW0gcmF3X2xlbiByYXcgZGF0YSBsZW5ndGgKKyAqIEBwYXJhbSByYXcgcG9pbnRzIHJhdyBkYXRhCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsbCwgRVJSX0FSRyBpZiB3ZSBjYW4ndCAob3Igd29uJ3QpIGVuY29kZQorICovCitlcnJfdAorc25tcF9hc24xX2VuY19yYXcoc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcywgdTE2X3QgcmF3X2xlbiwgdThfdCAqcmF3KQoreworICB1MTZfdCBwbGVuLCBiYXNlOworICB1OF90ICptc2dfcHRyOworCisgIHBsZW4gPSAwOworICB3aGlsZSAocCAhPSBOVUxMKQorICB7CisgICAgYmFzZSA9IHBsZW47CisgICAgcGxlbiArPSBwLT5sZW47CisgICAgaWYgKG9mcyA8IHBsZW4pCisgICAgeworICAgICAgbXNnX3B0ciA9ICh1OF90KilwLT5wYXlsb2FkOworICAgICAgbXNnX3B0ciArPSBvZnMgLSBiYXNlOworCisgICAgICB3aGlsZSAocmF3X2xlbiA+IDEpCisgICAgICB7CisgICAgICAgIC8qIGNvcHkgcmF3X2xlbiAtIDEgb2N0ZXRzICovCisgICAgICAgIHJhd19sZW4tLTsKKyAgICAgICAgKm1zZ19wdHIgPSAqcmF3OworICAgICAgICByYXcrKzsKKyAgICAgICAgb2ZzICs9IDE7CisgICAgICAgIGlmIChvZnMgPj0gcGxlbikKKyAgICAgICAgeworICAgICAgICAgIC8qIG5leHQgb2N0ZXQgaW4gbmV4dCBwYnVmICovCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeyByZXR1cm4gRVJSX0FSRzsgfQorICAgICAgICAgIG1zZ19wdHIgPSAodThfdCopcC0+cGF5bG9hZDsKKyAgICAgICAgICBwbGVuICs9IHAtPmxlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBuZXh0IG9jdGV0IGluIHNhbWUgcGJ1ZiAqLworICAgICAgICAgIG1zZ19wdHIrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHJhd19sZW4gPiAwKQorICAgICAgeworICAgICAgICAvKiBjb3B5IGxhc3Qgb3Igc2luZ2xlIG9jdGV0ICovCisgICAgICAgICptc2dfcHRyID0gKnJhdzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBFUlJfT0s7CisgICAgfQorICAgIHAgPSBwLT5uZXh0OworICB9CisgIC8qIHAgPT0gTlVMTCwgb2ZzID49IHBsZW4gKi8KKyAgcmV0dXJuIEVSUl9BUkc7Cit9CisKKyNlbmRpZiAvKiBMV0lQX1NOTVAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS9zbm1wL21pYjIuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS9zbm1wL21pYjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWRlY2QzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL3NubXAvbWliMi5jCkBAIC0wLDAgKzEsNDE0NiBAQAorLyoqCisgKiBAZmlsZQorICogTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBCYXNlIElJIChSRkMxMjEzKSBvYmplY3RzIGFuZCBmdW5jdGlvbnMuCisgKgorICogQG5vdGUgdGhlIG9iamVjdCBpZGVudGlmaWVycyBmb3IgdGhpcyBNSUItMiBhbmQgcHJpdmF0ZSBNSUIgdHJlZQorICogbXVzdCBiZSBrZXB0IGluIHNvcnRlZCBhc2NlbmRpbmcgb3JkZXIuIFRoaXMgdG8gZW5zdXJlIGNvcnJlY3QgZ2V0bmV4dCBvcGVyYXRpb24uCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBBeG9uIERpZ2l0YWwgRGVzaWduIEIuVi4sIFRoZSBOZXRoZXJsYW5kcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3I6IENocmlzdGlhYW4gU2ltb25zIDxjaHJpc3RpYWFuLnNpbW9uc0BheG9uLnR2PgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9TTk1QIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9zbm1wLmgiCisjaW5jbHVkZSAibHdpcC9uZXRpZi5oIgorI2luY2x1ZGUgImx3aXAvaXAuaCIKKyNpbmNsdWRlICJsd2lwL2lwX2ZyYWcuaCIKKyNpbmNsdWRlICJsd2lwL21lbS5oIgorI2luY2x1ZGUgImx3aXAvdGNwX2ltcGwuaCIKKyNpbmNsdWRlICJsd2lwL3VkcC5oIgorI2luY2x1ZGUgImx3aXAvc25tcF9hc24xLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wX3N0cnVjdHMuaCIKKyNpbmNsdWRlICJsd2lwL3N5cy5oIgorI2luY2x1ZGUgIm5ldGlmL2V0aGFycC5oIgorCisvKioKKyAqIElBTkEgYXNzaWduZWQgZW50ZXJwcmlzZSBJRCBmb3IgbHdJUCBpcyAyNjM4MQorICogQHNlZSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2VudGVycHJpc2UtbnVtYmVycworICoKKyAqIEBub3RlIHRoaXMgZW50ZXJwcmlzZSBJRCBpcyBhc3NpZ25lZCB0byB0aGUgbHdJUCBwcm9qZWN0LAorICogYWxsIG9iamVjdCBpZGVudGlmaWVycyBsaXZpbmcgdW5kZXIgdGhpcyBJRCBhcmUgYXNzaWduZWQKKyAqIGJ5IHRoZSBsd0lQIG1haW50YWluZXJzIChjb250YWN0IENocmlzdGlhYW4gU2ltb25zKSEKKyAqIEBub3RlIGRvbid0IGNoYW5nZSB0aGlzIGRlZmluZSwgdXNlIHNubXBfc2V0X3N5c29iamlkKCkKKyAqCisgKiBJZiB5b3UgbmVlZCB0byBjcmVhdGUgeW91ciBvd24gcHJpdmF0ZSBNSUIgeW91J2xsIG5lZWQKKyAqIHRvIGFwcGx5IGZvciB5b3VyIG93biBlbnRlcnByaXNlIElEIHdpdGggSUFOQToKKyAqIGh0dHA6Ly93d3cuaWFuYS5vcmcvbnVtYmVycy5odG1sCisgKi8KKyNkZWZpbmUgU05NUF9FTlRFUlBSSVNFX0lEIDI2MzgxCisjZGVmaW5lIFNOTVBfU1lTT0JKSURfTEVOIDcKKyNkZWZpbmUgU05NUF9TWVNPQkpJRCB7MSwgMywgNiwgMSwgNCwgMSwgU05NUF9FTlRFUlBSSVNFX0lEfQorCisjaWZuZGVmIFNOTVBfU1lTU0VSVklDRVMKKyNkZWZpbmUgU05NUF9TWVNTRVJWSUNFUyAoKDEgPDwgNikgfCAoMSA8PCAzKSB8ICgoSVBfRk9SV0FSRCkgPDwgMikpCisjZW5kaWYKKworI2lmbmRlZiBTTk1QX0dFVF9TWVNVUFRJTUUKKyNkZWZpbmUgU05NUF9HRVRfU1lTVVBUSU1FKHN5c3VwdGltZSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzeXN0ZW1fZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKTsKK3N0YXRpYyB2b2lkIHN5c3RlbV9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyB1OF90IHN5c3RlbV9zZXRfdGVzdChzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworc3RhdGljIHZvaWQgc3lzdGVtX3NldF92YWx1ZShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworc3RhdGljIHZvaWQgaW50ZXJmYWNlc19nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpOworc3RhdGljIHZvaWQgaW50ZXJmYWNlc19nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyB2b2lkIGlmZW50cnlfZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKTsKK3N0YXRpYyB2b2lkIGlmZW50cnlfZ2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSk7CisjaWYgIVNOTVBfU0FGRV9SRVFVRVNUUworc3RhdGljIHU4X3QgaWZlbnRyeV9zZXRfdGVzdCAoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyB2b2lkIGlmZW50cnlfc2V0X3ZhbHVlIChzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworI2VuZGlmIC8qIFNOTVBfU0FGRV9SRVFVRVNUUyAqLworc3RhdGljIHZvaWQgYXRlbnRyeV9nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpOworc3RhdGljIHZvaWQgYXRlbnRyeV9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyB2b2lkIGlwX2dldF9vYmplY3RfZGVmKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBvYmpfZGVmICpvZCk7CitzdGF0aWMgdm9pZCBpcF9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyB1OF90IGlwX3NldF90ZXN0KHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSk7CitzdGF0aWMgdm9pZCBpcF9hZGRyZW50cnlfZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKTsKK3N0YXRpYyB2b2lkIGlwX2FkZHJlbnRyeV9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyB2b2lkIGlwX3J0ZWVudHJ5X2dldF9vYmplY3RfZGVmKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBvYmpfZGVmICpvZCk7CitzdGF0aWMgdm9pZCBpcF9ydGVlbnRyeV9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyB2b2lkIGlwX250b21lbnRyeV9nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpOworc3RhdGljIHZvaWQgaXBfbnRvbWVudHJ5X2dldF92YWx1ZShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworc3RhdGljIHZvaWQgaWNtcF9nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpOworc3RhdGljIHZvaWQgaWNtcF9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKKyNpZiBMV0lQX1RDUAorc3RhdGljIHZvaWQgdGNwX2dldF9vYmplY3RfZGVmKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBvYmpfZGVmICpvZCk7CitzdGF0aWMgdm9pZCB0Y3BfZ2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSk7CisjaWZkZWYgVEhJU19TRUVNU19VTlVTRUQKK3N0YXRpYyB2b2lkIHRjcGNvbm5lbnRyeV9nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpOworc3RhdGljIHZvaWQgdGNwY29ubmVudHJ5X2dldF92YWx1ZShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworI2VuZGlmCisjZW5kaWYKK3N0YXRpYyB2b2lkIHVkcF9nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpOworc3RhdGljIHZvaWQgdWRwX2dldF92YWx1ZShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworc3RhdGljIHZvaWQgdWRwZW50cnlfZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKTsKK3N0YXRpYyB2b2lkIHVkcGVudHJ5X2dldF92YWx1ZShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworc3RhdGljIHZvaWQgc25tcF9nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpOworc3RhdGljIHZvaWQgc25tcF9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyB1OF90IHNubXBfc2V0X3Rlc3Qoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3N0YXRpYyB2b2lkIHNubXBfc2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSk7CisKKworLyogc25tcCAuMS4zLjYuMS4yLjEuMTEgKi8KK2NvbnN0IG1pYl9zY2FsYXJfbm9kZSBzbm1wX3NjYWxhciA9IHsKKyAgJnNubXBfZ2V0X29iamVjdF9kZWYsCisgICZzbm1wX2dldF92YWx1ZSwKKyAgJnNubXBfc2V0X3Rlc3QsCisgICZzbm1wX3NldF92YWx1ZSwKKyAgTUlCX05PREVfU0MsCisgIDAKK307Citjb25zdCBzMzJfdCBzbm1wX2lkc1syOF0gPSB7CisgIDEsIDIsIDMsIDQsIDUsIDYsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMAorfTsKK3N0cnVjdCBtaWJfbm9kZSogY29uc3Qgc25tcF9ub2Rlc1syOF0gPSB7CisgIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJnNubXBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmc25tcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnNubXBfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmc25tcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJnNubXBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmc25tcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnNubXBfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmc25tcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJnNubXBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmc25tcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnNubXBfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmc25tcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJnNubXBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmc25tcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnNubXBfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmc25tcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJnNubXBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmc25tcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wX3NjYWxhcgorfTsKK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSBzbm1wID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgMjgsCisgIHNubXBfaWRzLAorICBzbm1wX25vZGVzCit9OworCisvKiBkb3QzIGFuZCBFdGhlckxpa2UgTUlCIG5vdCBwbGFubmVkLiAodHJhbnNtaXNzaW9uIC4xLjMuNi4xLjIuMS4xMCkgKi8KKy8qIGhpc3RvcmljYWwgKHNvbWUgc2F5IGh5c3RlcmljYWwpLiAoY21vdCAuMS4zLjYuMS4yLjEuOSkgKi8KKy8qIGx3SVAgaGFzIG5vIEVHUCwgdGh1cyBtYXkgbm90IGltcGxlbWVudCBpdC4gKGVncCAuMS4zLjYuMS4yLjEuOCkgKi8KKworLyogdWRwIC4xLjMuNi4xLjIuMS43ICovCisvKiogaW5kZXggcm9vdCBub2RlIGZvciB1ZHBUYWJsZSAqLworc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlIHVkcF9yb290ID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9MUiwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgMAorfTsKK2NvbnN0IHMzMl90IHVkcGVudHJ5X2lkc1syXSA9IHsgMSwgMiB9Oworc3RydWN0IG1pYl9ub2RlKiBjb25zdCB1ZHBlbnRyeV9ub2Rlc1syXSA9IHsKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnVkcF9yb290LCAoc3RydWN0IG1pYl9ub2RlKikmdWRwX3Jvb3QsCit9OworY29uc3Qgc3RydWN0IG1pYl9hcnJheV9ub2RlIHVkcGVudHJ5ID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgMiwKKyAgdWRwZW50cnlfaWRzLAorICB1ZHBlbnRyeV9ub2RlcworfTsKKworczMyX3QgdWRwdGFibGVfaWQgPSAxOworc3RydWN0IG1pYl9ub2RlKiB1ZHB0YWJsZV9ub2RlID0gKHN0cnVjdCBtaWJfbm9kZSopJnVkcGVudHJ5Oworc3RydWN0IG1pYl9yYW1fYXJyYXlfbm9kZSB1ZHB0YWJsZSA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfUkEsCisgIDAsCisgICZ1ZHB0YWJsZV9pZCwKKyAgJnVkcHRhYmxlX25vZGUKK307CisKK2NvbnN0IG1pYl9zY2FsYXJfbm9kZSB1ZHBfc2NhbGFyID0geworICAmdWRwX2dldF9vYmplY3RfZGVmLAorICAmdWRwX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfU0MsCisgIDAKK307Citjb25zdCBzMzJfdCB1ZHBfaWRzWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CitzdHJ1Y3QgbWliX25vZGUqIGNvbnN0IHVkcF9ub2Rlc1s1XSA9IHsKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnVkcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZ1ZHBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmdWRwX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJnVkcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZ1ZHB0YWJsZQorfTsKK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSB1ZHAgPSB7CisgICZub2xlYWZzX2dldF9vYmplY3RfZGVmLAorICAmbm9sZWFmc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX0FSLAorICA1LAorICB1ZHBfaWRzLAorICB1ZHBfbm9kZXMKK307CisKKy8qIHRjcCAuMS4zLjYuMS4yLjEuNiAqLworI2lmIExXSVBfVENQCisvKiBvbmx5IGlmIHRoZSBUQ1AgcHJvdG9jb2wgaXMgYXZhaWxhYmxlIG1heSBpbXBsZW1lbnQgdGhpcyBncm91cCAqLworLyoqIGluZGV4IHJvb3Qgbm9kZSBmb3IgdGNwQ29ublRhYmxlICovCitzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgdGNwY29ubnRyZWVfcm9vdCA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfTFIsCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIDAKK307Citjb25zdCBzMzJfdCB0Y3Bjb25uZW50cnlfaWRzWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CitzdHJ1Y3QgbWliX25vZGUqIGNvbnN0IHRjcGNvbm5lbnRyeV9ub2Rlc1s1XSA9IHsKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnRjcGNvbm50cmVlX3Jvb3QsIChzdHJ1Y3QgbWliX25vZGUqKSZ0Y3Bjb25udHJlZV9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmdGNwY29ubnRyZWVfcm9vdCwgKHN0cnVjdCBtaWJfbm9kZSopJnRjcGNvbm50cmVlX3Jvb3QsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZ0Y3Bjb25udHJlZV9yb290Cit9OworY29uc3Qgc3RydWN0IG1pYl9hcnJheV9ub2RlIHRjcGNvbm5lbnRyeSA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfQVIsCisgIDUsCisgIHRjcGNvbm5lbnRyeV9pZHMsCisgIHRjcGNvbm5lbnRyeV9ub2RlcworfTsKKworczMyX3QgdGNwY29ubnRhYmxlX2lkID0gMTsKK3N0cnVjdCBtaWJfbm9kZSogdGNwY29ubnRhYmxlX25vZGUgPSAoc3RydWN0IG1pYl9ub2RlKikmdGNwY29ubmVudHJ5Oworc3RydWN0IG1pYl9yYW1fYXJyYXlfbm9kZSB0Y3Bjb25udGFibGUgPSB7CisgICZub2xlYWZzX2dldF9vYmplY3RfZGVmLAorICAmbm9sZWFmc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX1JBLAorLyoqIEB0b2RvIHVwZGF0ZSBtYXhsZW5ndGggd2hlbiBpbnNlcnRpbmcgLyBkZWxldGluZyBmcm9tIHRhYmxlCisgICAwIHdoZW4gdGFibGUgaXMgZW1wdHksIDEgd2hlbiBtb3JlIHRoYW4gb25lIGVudHJ5ICovCisgIDAsCisgICZ0Y3Bjb25udGFibGVfaWQsCisgICZ0Y3Bjb25udGFibGVfbm9kZQorfTsKKworY29uc3QgbWliX3NjYWxhcl9ub2RlIHRjcF9zY2FsYXIgPSB7CisgICZ0Y3BfZ2V0X29iamVjdF9kZWYsCisgICZ0Y3BfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9TQywKKyAgMAorfTsKK2NvbnN0IHMzMl90IHRjcF9pZHNbMTVdID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CitzdHJ1Y3QgbWliX25vZGUqIGNvbnN0IHRjcF9ub2Rlc1sxNV0gPSB7CisgIChzdHJ1Y3QgbWliX25vZGUqKSZ0Y3Bfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmdGNwX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnRjcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZ0Y3Bfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmdGNwX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJnRjcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZ0Y3Bfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmdGNwX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnRjcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZ0Y3Bfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmdGNwX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJnRjcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZ0Y3Bjb25udGFibGUsIChzdHJ1Y3QgbWliX25vZGUqKSZ0Y3Bfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmdGNwX3NjYWxhcgorfTsKK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSB0Y3AgPSB7CisgICZub2xlYWZzX2dldF9vYmplY3RfZGVmLAorICAmbm9sZWFmc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX0FSLAorICAxNSwKKyAgdGNwX2lkcywKKyAgdGNwX25vZGVzCit9OworI2VuZGlmCisKKy8qIGljbXAgLjEuMy42LjEuMi4xLjUgKi8KK2NvbnN0IG1pYl9zY2FsYXJfbm9kZSBpY21wX3NjYWxhciA9IHsKKyAgJmljbXBfZ2V0X29iamVjdF9kZWYsCisgICZpY21wX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfU0MsCisgIDAKK307Citjb25zdCBzMzJfdCBpY21wX2lkc1syNl0gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiB9Oworc3RydWN0IG1pYl9ub2RlKiBjb25zdCBpY21wX25vZGVzWzI2XSA9IHsKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmljbXBfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmaWNtcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpY21wX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJmljbXBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmaWNtcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpY21wX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmljbXBfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmaWNtcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpY21wX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJmljbXBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmaWNtcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpY21wX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmljbXBfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmaWNtcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpY21wX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJmljbXBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmaWNtcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpY21wX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmljbXBfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmaWNtcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpY21wX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJmljbXBfc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmaWNtcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpY21wX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmljbXBfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmaWNtcF9zY2FsYXIKK307Citjb25zdCBzdHJ1Y3QgbWliX2FycmF5X25vZGUgaWNtcCA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfQVIsCisgIDI2LAorICBpY21wX2lkcywKKyAgaWNtcF9ub2RlcworfTsKKworLyoqIGluZGV4IHJvb3Qgbm9kZSBmb3IgaXBOZXRUb01lZGlhVGFibGUgKi8KK3N0cnVjdCBtaWJfbGlzdF9yb290bm9kZSBpcG50b210cmVlX3Jvb3QgPSB7CisgICZub2xlYWZzX2dldF9vYmplY3RfZGVmLAorICAmbm9sZWFmc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX0xSLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICAwCit9OworY29uc3QgczMyX3QgaXBudG9tZW50cnlfaWRzWzRdID0geyAxLCAyLCAzLCA0IH07CitzdHJ1Y3QgbWliX25vZGUqIGNvbnN0IGlwbnRvbWVudHJ5X25vZGVzWzRdID0geworICAoc3RydWN0IG1pYl9ub2RlKikmaXBudG9tdHJlZV9yb290LCAoc3RydWN0IG1pYl9ub2RlKikmaXBudG9tdHJlZV9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaXBudG9tdHJlZV9yb290LCAoc3RydWN0IG1pYl9ub2RlKikmaXBudG9tdHJlZV9yb290Cit9OworY29uc3Qgc3RydWN0IG1pYl9hcnJheV9ub2RlIGlwbnRvbWVudHJ5ID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgNCwKKyAgaXBudG9tZW50cnlfaWRzLAorICBpcG50b21lbnRyeV9ub2RlcworfTsKKworczMyX3QgaXBudG9tdGFibGVfaWQgPSAxOworc3RydWN0IG1pYl9ub2RlKiBpcG50b210YWJsZV9ub2RlID0gKHN0cnVjdCBtaWJfbm9kZSopJmlwbnRvbWVudHJ5Oworc3RydWN0IG1pYl9yYW1fYXJyYXlfbm9kZSBpcG50b210YWJsZSA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfUkEsCisgIDAsCisgICZpcG50b210YWJsZV9pZCwKKyAgJmlwbnRvbXRhYmxlX25vZGUKK307CisKKy8qKiBpbmRleCByb290IG5vZGUgZm9yIGlwUm91dGVUYWJsZSAqLworc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlIGlwcnRldHJlZV9yb290ID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9MUiwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgMAorfTsKK2NvbnN0IHMzMl90IGlwcnRlZW50cnlfaWRzWzEzXSA9IHsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMgfTsKK3N0cnVjdCBtaWJfbm9kZSogY29uc3QgaXBydGVlbnRyeV9ub2Rlc1sxM10gPSB7CisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcHJ0ZXRyZWVfcm9vdCwgKHN0cnVjdCBtaWJfbm9kZSopJmlwcnRldHJlZV9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaXBydGV0cmVlX3Jvb3QsIChzdHJ1Y3QgbWliX25vZGUqKSZpcHJ0ZXRyZWVfcm9vdCwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmlwcnRldHJlZV9yb290LCAoc3RydWN0IG1pYl9ub2RlKikmaXBydGV0cmVlX3Jvb3QsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcHJ0ZXRyZWVfcm9vdCwgKHN0cnVjdCBtaWJfbm9kZSopJmlwcnRldHJlZV9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaXBydGV0cmVlX3Jvb3QsIChzdHJ1Y3QgbWliX25vZGUqKSZpcHJ0ZXRyZWVfcm9vdCwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmlwcnRldHJlZV9yb290LCAoc3RydWN0IG1pYl9ub2RlKikmaXBydGV0cmVlX3Jvb3QsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcHJ0ZXRyZWVfcm9vdAorfTsKK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSBpcHJ0ZWVudHJ5ID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgMTMsCisgIGlwcnRlZW50cnlfaWRzLAorICBpcHJ0ZWVudHJ5X25vZGVzCit9OworCitzMzJfdCBpcHJ0ZXRhYmxlX2lkID0gMTsKK3N0cnVjdCBtaWJfbm9kZSogaXBydGV0YWJsZV9ub2RlID0gKHN0cnVjdCBtaWJfbm9kZSopJmlwcnRlZW50cnk7CitzdHJ1Y3QgbWliX3JhbV9hcnJheV9ub2RlIGlwcnRldGFibGUgPSB7CisgICZub2xlYWZzX2dldF9vYmplY3RfZGVmLAorICAmbm9sZWFmc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX1JBLAorICAwLAorICAmaXBydGV0YWJsZV9pZCwKKyAgJmlwcnRldGFibGVfbm9kZQorfTsKKworLyoqIGluZGV4IHJvb3Qgbm9kZSBmb3IgaXBBZGRyVGFibGUgKi8KK3N0cnVjdCBtaWJfbGlzdF9yb290bm9kZSBpcGFkZHJ0cmVlX3Jvb3QgPSB7CisgICZub2xlYWZzX2dldF9vYmplY3RfZGVmLAorICAmbm9sZWFmc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX0xSLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICAwCit9OworY29uc3QgczMyX3QgaXBhZGRyZW50cnlfaWRzWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CitzdHJ1Y3QgbWliX25vZGUqIGNvbnN0IGlwYWRkcmVudHJ5X25vZGVzWzVdID0geworICAoc3RydWN0IG1pYl9ub2RlKikmaXBhZGRydHJlZV9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaXBhZGRydHJlZV9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaXBhZGRydHJlZV9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaXBhZGRydHJlZV9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaXBhZGRydHJlZV9yb290Cit9OworY29uc3Qgc3RydWN0IG1pYl9hcnJheV9ub2RlIGlwYWRkcmVudHJ5ID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgNSwKKyAgaXBhZGRyZW50cnlfaWRzLAorICBpcGFkZHJlbnRyeV9ub2RlcworfTsKKworczMyX3QgaXBhZGRydGFibGVfaWQgPSAxOworc3RydWN0IG1pYl9ub2RlKiBpcGFkZHJ0YWJsZV9ub2RlID0gKHN0cnVjdCBtaWJfbm9kZSopJmlwYWRkcmVudHJ5Oworc3RydWN0IG1pYl9yYW1fYXJyYXlfbm9kZSBpcGFkZHJ0YWJsZSA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfUkEsCisgIDAsCisgICZpcGFkZHJ0YWJsZV9pZCwKKyAgJmlwYWRkcnRhYmxlX25vZGUKK307CisKKy8qIGlwIC4xLjMuNi4xLjIuMS40ICovCitjb25zdCBtaWJfc2NhbGFyX25vZGUgaXBfc2NhbGFyID0geworICAmaXBfZ2V0X29iamVjdF9kZWYsCisgICZpcF9nZXRfdmFsdWUsCisgICZpcF9zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9TQywKKyAgMAorfTsKK2NvbnN0IHMzMl90IGlwX2lkc1syM10gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMyB9Oworc3RydWN0IG1pYl9ub2RlKiBjb25zdCBpcF9ub2Rlc1syM10gPSB7CisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpcF9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZpcGFkZHJ0YWJsZSwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmlwcnRldGFibGUsIChzdHJ1Y3QgbWliX25vZGUqKSZpcG50b210YWJsZSwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmlwX3NjYWxhcgorfTsKK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSBtaWIyX2lwID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgMjMsCisgIGlwX2lkcywKKyAgaXBfbm9kZXMKK307CisKKy8qKiBpbmRleCByb290IG5vZGUgZm9yIGF0VGFibGUgKi8KK3N0cnVjdCBtaWJfbGlzdF9yb290bm9kZSBhcnB0cmVlX3Jvb3QgPSB7CisgICZub2xlYWZzX2dldF9vYmplY3RfZGVmLAorICAmbm9sZWFmc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX0xSLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICAwCit9OworY29uc3QgczMyX3QgYXRlbnRyeV9pZHNbM10gPSB7IDEsIDIsIDMgfTsKK3N0cnVjdCBtaWJfbm9kZSogY29uc3QgYXRlbnRyeV9ub2Rlc1szXSA9IHsKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmFycHRyZWVfcm9vdCwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmFycHRyZWVfcm9vdCwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmFycHRyZWVfcm9vdAorfTsKK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSBhdGVudHJ5ID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgMywKKyAgYXRlbnRyeV9pZHMsCisgIGF0ZW50cnlfbm9kZXMKK307CisKK2NvbnN0IHMzMl90IGF0dGFibGVfaWQgPSAxOworc3RydWN0IG1pYl9ub2RlKiBjb25zdCBhdHRhYmxlX25vZGUgPSAoc3RydWN0IG1pYl9ub2RlKikmYXRlbnRyeTsKK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSBhdHRhYmxlID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgMSwKKyAgJmF0dGFibGVfaWQsCisgICZhdHRhYmxlX25vZGUKK307CisKKy8qIGF0IC4xLjMuNi4xLjIuMS4zICovCitzMzJfdCBhdF9pZCA9IDE7CitzdHJ1Y3QgbWliX25vZGUqIG1pYjJfYXRfbm9kZSA9IChzdHJ1Y3QgbWliX25vZGUqKSZhdHRhYmxlOworc3RydWN0IG1pYl9yYW1fYXJyYXlfbm9kZSBhdCA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfUkEsCisgIDAsCisgICZhdF9pZCwKKyAgJm1pYjJfYXRfbm9kZQorfTsKKworLyoqIGluZGV4IHJvb3Qgbm9kZSBmb3IgaWZUYWJsZSAqLworc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlIGlmbGlzdF9yb290ID0geworICAmaWZlbnRyeV9nZXRfb2JqZWN0X2RlZiwKKyAgJmlmZW50cnlfZ2V0X3ZhbHVlLAorI2lmIFNOTVBfU0FGRV9SRVFVRVNUUworICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorI2Vsc2UgLyogU05NUF9TQUZFX1JFUVVFU1RTICovCisgICZpZmVudHJ5X3NldF90ZXN0LAorICAmaWZlbnRyeV9zZXRfdmFsdWUsCisjZW5kaWYgLyogU05NUF9TQUZFX1JFUVVFU1RTICovCisgIE1JQl9OT0RFX0xSLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICAwCit9OworY29uc3QgczMyX3QgaWZlbnRyeV9pZHNbMjJdID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiB9Oworc3RydWN0IG1pYl9ub2RlKiBjb25zdCBpZmVudHJ5X25vZGVzWzIyXSA9IHsKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmlmbGlzdF9yb290LCAoc3RydWN0IG1pYl9ub2RlKikmaWZsaXN0X3Jvb3QsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpZmxpc3Rfcm9vdCwgKHN0cnVjdCBtaWJfbm9kZSopJmlmbGlzdF9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaWZsaXN0X3Jvb3QsIChzdHJ1Y3QgbWliX25vZGUqKSZpZmxpc3Rfcm9vdCwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmlmbGlzdF9yb290LCAoc3RydWN0IG1pYl9ub2RlKikmaWZsaXN0X3Jvb3QsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpZmxpc3Rfcm9vdCwgKHN0cnVjdCBtaWJfbm9kZSopJmlmbGlzdF9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaWZsaXN0X3Jvb3QsIChzdHJ1Y3QgbWliX25vZGUqKSZpZmxpc3Rfcm9vdCwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmlmbGlzdF9yb290LCAoc3RydWN0IG1pYl9ub2RlKikmaWZsaXN0X3Jvb3QsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpZmxpc3Rfcm9vdCwgKHN0cnVjdCBtaWJfbm9kZSopJmlmbGlzdF9yb290LAorICAoc3RydWN0IG1pYl9ub2RlKikmaWZsaXN0X3Jvb3QsIChzdHJ1Y3QgbWliX25vZGUqKSZpZmxpc3Rfcm9vdCwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmlmbGlzdF9yb290LCAoc3RydWN0IG1pYl9ub2RlKikmaWZsaXN0X3Jvb3QsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpZmxpc3Rfcm9vdCwgKHN0cnVjdCBtaWJfbm9kZSopJmlmbGlzdF9yb290Cit9OworY29uc3Qgc3RydWN0IG1pYl9hcnJheV9ub2RlIGlmZW50cnkgPSB7CisgICZub2xlYWZzX2dldF9vYmplY3RfZGVmLAorICAmbm9sZWFmc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX0FSLAorICAyMiwKKyAgaWZlbnRyeV9pZHMsCisgIGlmZW50cnlfbm9kZXMKK307CisKK3MzMl90IGlmdGFibGVfaWQgPSAxOworc3RydWN0IG1pYl9ub2RlKiBpZnRhYmxlX25vZGUgPSAoc3RydWN0IG1pYl9ub2RlKikmaWZlbnRyeTsKK3N0cnVjdCBtaWJfcmFtX2FycmF5X25vZGUgaWZ0YWJsZSA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfUkEsCisgIDAsCisgICZpZnRhYmxlX2lkLAorICAmaWZ0YWJsZV9ub2RlCit9OworCisvKiBpbnRlcmZhY2VzIC4xLjMuNi4xLjIuMS4yICovCitjb25zdCBtaWJfc2NhbGFyX25vZGUgaW50ZXJmYWNlc19zY2FsYXIgPSB7CisgICZpbnRlcmZhY2VzX2dldF9vYmplY3RfZGVmLAorICAmaW50ZXJmYWNlc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX1NDLAorICAwCit9OworY29uc3QgczMyX3QgaW50ZXJmYWNlc19pZHNbMl0gPSB7IDEsIDIgfTsKK3N0cnVjdCBtaWJfbm9kZSogY29uc3QgaW50ZXJmYWNlc19ub2Rlc1syXSA9IHsKKyAgKHN0cnVjdCBtaWJfbm9kZSopJmludGVyZmFjZXNfc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmaWZ0YWJsZQorfTsKK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSBpbnRlcmZhY2VzID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgMiwKKyAgaW50ZXJmYWNlc19pZHMsCisgIGludGVyZmFjZXNfbm9kZXMKK307CisKKworLyogICAgICAgICAgICAgMCAxIDIgMyA0IDUgNiAqLworLyogc3lzdGVtIC4xLjMuNi4xLjIuMS4xICovCitjb25zdCBtaWJfc2NhbGFyX25vZGUgc3lzX3RlbV9zY2FsYXIgPSB7CisgICZzeXN0ZW1fZ2V0X29iamVjdF9kZWYsCisgICZzeXN0ZW1fZ2V0X3ZhbHVlLAorICAmc3lzdGVtX3NldF90ZXN0LAorICAmc3lzdGVtX3NldF92YWx1ZSwKKyAgTUlCX05PREVfU0MsCisgIDAKK307Citjb25zdCBzMzJfdCBzeXNfdGVtX2lkc1s3XSA9IHsgMSwgMiwgMywgNCwgNSwgNiwgNyB9Oworc3RydWN0IG1pYl9ub2RlKiBjb25zdCBzeXNfdGVtX25vZGVzWzddID0geworICAoc3RydWN0IG1pYl9ub2RlKikmc3lzX3RlbV9zY2FsYXIsIChzdHJ1Y3QgbWliX25vZGUqKSZzeXNfdGVtX3NjYWxhciwKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnN5c190ZW1fc2NhbGFyLCAoc3RydWN0IG1pYl9ub2RlKikmc3lzX3RlbV9zY2FsYXIsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZzeXNfdGVtX3NjYWxhciwgKHN0cnVjdCBtaWJfbm9kZSopJnN5c190ZW1fc2NhbGFyLAorICAoc3RydWN0IG1pYl9ub2RlKikmc3lzX3RlbV9zY2FsYXIKK307CisvKiB3b3JrIGFyb3VuZCBuYW1lIGlzc3VlIHdpdGggJ3N5c190ZW0nLCBzb21lIGNvbXBpbGVyKHM/KSBzZWVtIHRvIHJlc2VydmUgJ3N5c3RlbScgKi8KK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSBzeXNfdGVtID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgNywKKyAgc3lzX3RlbV9pZHMsCisgIHN5c190ZW1fbm9kZXMKK307CisKKy8qIG1pYi0yIC4xLjMuNi4xLjIuMSAqLworI2lmIExXSVBfVENQCisjZGVmaW5lIE1JQjJfR1JPVVBTIDgKKyNlbHNlCisjZGVmaW5lIE1JQjJfR1JPVVBTIDcKKyNlbmRpZgorY29uc3QgczMyX3QgbWliMl9pZHNbTUlCMl9HUk9VUFNdID0KK3sKKyAgMSwKKyAgMiwKKyAgMywKKyAgNCwKKyAgNSwKKyNpZiBMV0lQX1RDUAorICA2LAorI2VuZGlmCisgIDcsCisgIDExCit9Oworc3RydWN0IG1pYl9ub2RlKiBjb25zdCBtaWIyX25vZGVzW01JQjJfR1JPVVBTXSA9IHsKKyAgKHN0cnVjdCBtaWJfbm9kZSopJnN5c190ZW0sCisgIChzdHJ1Y3QgbWliX25vZGUqKSZpbnRlcmZhY2VzLAorICAoc3RydWN0IG1pYl9ub2RlKikmYXQsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZtaWIyX2lwLAorICAoc3RydWN0IG1pYl9ub2RlKikmaWNtcCwKKyNpZiBMV0lQX1RDUAorICAoc3RydWN0IG1pYl9ub2RlKikmdGNwLAorI2VuZGlmCisgIChzdHJ1Y3QgbWliX25vZGUqKSZ1ZHAsCisgIChzdHJ1Y3QgbWliX25vZGUqKSZzbm1wCit9OworCitjb25zdCBzdHJ1Y3QgbWliX2FycmF5X25vZGUgbWliMiA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfQVIsCisgIE1JQjJfR1JPVVBTLAorICBtaWIyX2lkcywKKyAgbWliMl9ub2RlcworfTsKKworLyogbWdtdCAuMS4zLjYuMS4yICovCitjb25zdCBzMzJfdCBtZ210X2lkc1sxXSA9IHsgMSB9Oworc3RydWN0IG1pYl9ub2RlKiBjb25zdCBtZ210X25vZGVzWzFdID0geyAoc3RydWN0IG1pYl9ub2RlKikmbWliMiB9OworY29uc3Qgc3RydWN0IG1pYl9hcnJheV9ub2RlIG1nbXQgPSB7CisgICZub2xlYWZzX2dldF9vYmplY3RfZGVmLAorICAmbm9sZWFmc19nZXRfdmFsdWUsCisgICZub2xlYWZzX3NldF90ZXN0LAorICAmbm9sZWFmc19zZXRfdmFsdWUsCisgIE1JQl9OT0RFX0FSLAorICAxLAorICBtZ210X2lkcywKKyAgbWdtdF9ub2RlcworfTsKKworLyogaW50ZXJuZXQgLjEuMy42LjEgKi8KKyNpZiBTTk1QX1BSSVZBVEVfTUlCCisvKiBXaGVuIHVzaW5nIGEgcHJpdmF0ZSBNSUIsIHlvdSBoYXZlIHRvIGNyZWF0ZSBhIGZpbGUgJ3ByaXZhdGVfbWliLmgnIHRoYXQgY29udGFpbnMKKyAqIGEgJ3N0cnVjdCBtaWJfYXJyYXlfbm9kZSBtaWJfcHJpdmF0ZScgd2hpY2ggY29udGFpbnMgeW91ciBNSUIuICovCitzMzJfdCBpbnRlcm5ldF9pZHNbMl0gPSB7IDIsIDQgfTsKK3N0cnVjdCBtaWJfbm9kZSogY29uc3QgaW50ZXJuZXRfbm9kZXNbMl0gPSB7IChzdHJ1Y3QgbWliX25vZGUqKSZtZ210LCAoc3RydWN0IG1pYl9ub2RlKikmbWliX3ByaXZhdGUgfTsKK2NvbnN0IHN0cnVjdCBtaWJfYXJyYXlfbm9kZSBpbnRlcm5ldCA9IHsKKyAgJm5vbGVhZnNfZ2V0X29iamVjdF9kZWYsCisgICZub2xlYWZzX2dldF92YWx1ZSwKKyAgJm5vbGVhZnNfc2V0X3Rlc3QsCisgICZub2xlYWZzX3NldF92YWx1ZSwKKyAgTUlCX05PREVfQVIsCisgIDIsCisgIGludGVybmV0X2lkcywKKyAgaW50ZXJuZXRfbm9kZXMKK307CisjZWxzZQorY29uc3QgczMyX3QgaW50ZXJuZXRfaWRzWzFdID0geyAyIH07CitzdHJ1Y3QgbWliX25vZGUqIGNvbnN0IGludGVybmV0X25vZGVzWzFdID0geyAoc3RydWN0IG1pYl9ub2RlKikmbWdtdCB9OworY29uc3Qgc3RydWN0IG1pYl9hcnJheV9ub2RlIGludGVybmV0ID0geworICAmbm9sZWFmc19nZXRfb2JqZWN0X2RlZiwKKyAgJm5vbGVhZnNfZ2V0X3ZhbHVlLAorICAmbm9sZWFmc19zZXRfdGVzdCwKKyAgJm5vbGVhZnNfc2V0X3ZhbHVlLAorICBNSUJfTk9ERV9BUiwKKyAgMSwKKyAgaW50ZXJuZXRfaWRzLAorICBpbnRlcm5ldF9ub2RlcworfTsKKyNlbmRpZgorCisvKiogbWliLTIuc3lzdGVtLnN5c09iamVjdElEICAqLworc3RhdGljIHN0cnVjdCBzbm1wX29ial9pZCBzeXNvYmppZCA9IHtTTk1QX1NZU09CSklEX0xFTiwgU05NUF9TWVNPQkpJRH07CisvKiogZW50ZXJwcmlzZSBJRCBmb3IgZ2VuZXJpYyBUUkFQcywgLmlzby5vcmcuZG9kLmludGVybmV0Lm1nbXQubWliLTIuc25tcCAqLworc3RhdGljIHN0cnVjdCBzbm1wX29ial9pZCBzbm1wZ3JwX2lkID0gezcsezEsMyw2LDEsMiwxLDExfX07CisvKiogbWliLTIuc3lzdGVtLnN5c1NlcnZpY2VzICovCitzdGF0aWMgY29uc3QgczMyX3Qgc3lzc2VydmljZXMgPSBTTk1QX1NZU1NFUlZJQ0VTOworCisvKiogbWliLTIuc3lzdGVtLnN5c0Rlc2NyICovCitzdGF0aWMgY29uc3QgdThfdCBzeXNkZXNjcl9sZW5fZGVmYXVsdCA9IDQ7CitzdGF0aWMgY29uc3QgdThfdCBzeXNkZXNjcl9kZWZhdWx0W10gPSAibHdJUCI7CitzdGF0aWMgdThfdCogc3lzZGVzY3JfbGVuX3B0ciA9ICh1OF90Kikmc3lzZGVzY3JfbGVuX2RlZmF1bHQ7CitzdGF0aWMgdThfdCogc3lzZGVzY3JfcHRyID0gKHU4X3QqKSZzeXNkZXNjcl9kZWZhdWx0WzBdOworLyoqIG1pYi0yLnN5c3RlbS5zeXNDb250YWN0ICovCitzdGF0aWMgY29uc3QgdThfdCBzeXNjb250YWN0X2xlbl9kZWZhdWx0ID0gMDsKK3N0YXRpYyBjb25zdCB1OF90IHN5c2NvbnRhY3RfZGVmYXVsdFtdID0gIiI7CitzdGF0aWMgdThfdCogc3lzY29udGFjdF9sZW5fcHRyID0gKHU4X3QqKSZzeXNjb250YWN0X2xlbl9kZWZhdWx0Oworc3RhdGljIHU4X3QqIHN5c2NvbnRhY3RfcHRyID0gKHU4X3QqKSZzeXNjb250YWN0X2RlZmF1bHRbMF07CisvKiogbWliLTIuc3lzdGVtLnN5c05hbWUgKi8KK3N0YXRpYyBjb25zdCB1OF90IHN5c25hbWVfbGVuX2RlZmF1bHQgPSA4Oworc3RhdGljIGNvbnN0IHU4X3Qgc3lzbmFtZV9kZWZhdWx0W10gPSAiRlFETi11bmsiOworc3RhdGljIHU4X3QqIHN5c25hbWVfbGVuX3B0ciA9ICh1OF90Kikmc3lzbmFtZV9sZW5fZGVmYXVsdDsKK3N0YXRpYyB1OF90KiBzeXNuYW1lX3B0ciA9ICh1OF90Kikmc3lzbmFtZV9kZWZhdWx0WzBdOworLyoqIG1pYi0yLnN5c3RlbS5zeXNMb2NhdGlvbiAqLworc3RhdGljIGNvbnN0IHU4X3Qgc3lzbG9jYXRpb25fbGVuX2RlZmF1bHQgPSAwOworc3RhdGljIGNvbnN0IHU4X3Qgc3lzbG9jYXRpb25fZGVmYXVsdFtdID0gIiI7CitzdGF0aWMgdThfdCogc3lzbG9jYXRpb25fbGVuX3B0ciA9ICh1OF90Kikmc3lzbG9jYXRpb25fbGVuX2RlZmF1bHQ7CitzdGF0aWMgdThfdCogc3lzbG9jYXRpb25fcHRyID0gKHU4X3QqKSZzeXNsb2NhdGlvbl9kZWZhdWx0WzBdOworLyoqIG1pYi0yLnNubXAuc25tcEVuYWJsZUF1dGhlblRyYXBzICovCitzdGF0aWMgY29uc3QgdThfdCBzbm1wZW5hYmxlYXV0aGVudHJhcHNfZGVmYXVsdCA9IDI7IC8qIGRpc2FibGVkICovCitzdGF0aWMgdThfdCogc25tcGVuYWJsZWF1dGhlbnRyYXBzX3B0ciA9ICh1OF90Kikmc25tcGVuYWJsZWF1dGhlbnRyYXBzX2RlZmF1bHQ7CisKKy8qKiBtaWItMi5pbnRlcmZhY2VzLmlmVGFibGUuaWZFbnRyeS5pZlNwZWNpZmljICh6ZXJvRG90WmVybykgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25tcF9vYmpfaWQgaWZzcGVjaWZpYyA9IHsyLCB7MCwgMH19OworLyoqIG1pYi0yLmlwLmlwUm91dGVUYWJsZS5pcFJvdXRlRW50cnkuaXBSb3V0ZUluZm8gKHplcm9Eb3RaZXJvKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbm1wX29ial9pZCBpcHJvdXRlaW5mbyA9IHsyLCB7MCwgMH19OworCisKKworLyogbWliLTIuc3lzdGVtIGNvdW50ZXIocykgKi8KK3N0YXRpYyB1MzJfdCBzeXN1cHRpbWUgPSAwOworCisvKiBtaWItMi5pcCBjb3VudGVyKHMpICovCitzdGF0aWMgdTMyX3QgaXBpbnJlY2VpdmVzID0gMCwKKyAgICAgICAgICAgICBpcGluaGRyZXJyb3JzID0gMCwKKyAgICAgICAgICAgICBpcGluYWRkcmVycm9ycyA9IDAsCisgICAgICAgICAgICAgaXBmb3J3ZGF0YWdyYW1zID0gMCwKKyAgICAgICAgICAgICBpcGludW5rbm93bnByb3RvcyA9IDAsCisgICAgICAgICAgICAgaXBpbmRpc2NhcmRzID0gMCwKKyAgICAgICAgICAgICBpcGluZGVsaXZlcnMgPSAwLAorICAgICAgICAgICAgIGlwb3V0cmVxdWVzdHMgPSAwLAorICAgICAgICAgICAgIGlwb3V0ZGlzY2FyZHMgPSAwLAorICAgICAgICAgICAgIGlwb3V0bm9yb3V0ZXMgPSAwLAorICAgICAgICAgICAgIGlwcmVhc21yZXFkcyA9IDAsCisgICAgICAgICAgICAgaXByZWFzbW9rcyA9IDAsCisgICAgICAgICAgICAgaXByZWFzbWZhaWxzID0gMCwKKyAgICAgICAgICAgICBpcGZyYWdva3MgPSAwLAorICAgICAgICAgICAgIGlwZnJhZ2ZhaWxzID0gMCwKKyAgICAgICAgICAgICBpcGZyYWdjcmVhdGVzID0gMCwKKyAgICAgICAgICAgICBpcHJvdXRpbmdkaXNjYXJkcyA9IDA7CisvKiBtaWItMi5pY21wIGNvdW50ZXIocykgKi8KK3N0YXRpYyB1MzJfdCBpY21waW5tc2dzID0gMCwKKyAgICAgICAgICAgICBpY21waW5lcnJvcnMgPSAwLAorICAgICAgICAgICAgIGljbXBpbmRlc3R1bnJlYWNocyA9IDAsCisgICAgICAgICAgICAgaWNtcGludGltZWV4Y2RzID0gMCwKKyAgICAgICAgICAgICBpY21waW5wYXJtcHJvYnMgPSAwLAorICAgICAgICAgICAgIGljbXBpbnNyY3F1ZW5jaHMgPSAwLAorICAgICAgICAgICAgIGljbXBpbnJlZGlyZWN0cyA9IDAsCisgICAgICAgICAgICAgaWNtcGluZWNob3MgPSAwLAorICAgICAgICAgICAgIGljbXBpbmVjaG9yZXBzID0gMCwKKyAgICAgICAgICAgICBpY21waW50aW1lc3RhbXBzID0gMCwKKyAgICAgICAgICAgICBpY21waW50aW1lc3RhbXByZXBzID0gMCwKKyAgICAgICAgICAgICBpY21waW5hZGRybWFza3MgPSAwLAorICAgICAgICAgICAgIGljbXBpbmFkZHJtYXNrcmVwcyA9IDAsCisgICAgICAgICAgICAgaWNtcG91dG1zZ3MgPSAwLAorICAgICAgICAgICAgIGljbXBvdXRlcnJvcnMgPSAwLAorICAgICAgICAgICAgIGljbXBvdXRkZXN0dW5yZWFjaHMgPSAwLAorICAgICAgICAgICAgIGljbXBvdXR0aW1lZXhjZHMgPSAwLAorICAgICAgICAgICAgIGljbXBvdXRwYXJtcHJvYnMgPSAwLAorICAgICAgICAgICAgIGljbXBvdXRzcmNxdWVuY2hzID0gMCwKKyAgICAgICAgICAgICBpY21wb3V0cmVkaXJlY3RzID0gMCwKKyAgICAgICAgICAgICBpY21wb3V0ZWNob3MgPSAwLAorICAgICAgICAgICAgIGljbXBvdXRlY2hvcmVwcyA9IDAsCisgICAgICAgICAgICAgaWNtcG91dHRpbWVzdGFtcHMgPSAwLAorICAgICAgICAgICAgIGljbXBvdXR0aW1lc3RhbXByZXBzID0gMCwKKyAgICAgICAgICAgICBpY21wb3V0YWRkcm1hc2tzID0gMCwKKyAgICAgICAgICAgICBpY21wb3V0YWRkcm1hc2tyZXBzID0gMDsKKy8qIG1pYi0yLnRjcCBjb3VudGVyKHMpICovCitzdGF0aWMgdTMyX3QgdGNwYWN0aXZlb3BlbnMgPSAwLAorICAgICAgICAgICAgIHRjcHBhc3NpdmVvcGVucyA9IDAsCisgICAgICAgICAgICAgdGNwYXR0ZW1wdGZhaWxzID0gMCwKKyAgICAgICAgICAgICB0Y3Blc3RhYnJlc2V0cyA9IDAsCisgICAgICAgICAgICAgdGNwaW5zZWdzID0gMCwKKyAgICAgICAgICAgICB0Y3BvdXRzZWdzID0gMCwKKyAgICAgICAgICAgICB0Y3ByZXRyYW5zc2VncyA9IDAsCisgICAgICAgICAgICAgdGNwaW5lcnJzID0gMCwKKyAgICAgICAgICAgICB0Y3BvdXRyc3RzID0gMDsKKy8qIG1pYi0yLnVkcCBjb3VudGVyKHMpICovCitzdGF0aWMgdTMyX3QgdWRwaW5kYXRhZ3JhbXMgPSAwLAorICAgICAgICAgICAgIHVkcG5vcG9ydHMgPSAwLAorICAgICAgICAgICAgIHVkcGluZXJyb3JzID0gMCwKKyAgICAgICAgICAgICB1ZHBvdXRkYXRhZ3JhbXMgPSAwOworLyogbWliLTIuc25tcCBjb3VudGVyKHMpICovCitzdGF0aWMgdTMyX3Qgc25tcGlucGt0cyA9IDAsCisgICAgICAgICAgICAgc25tcG91dHBrdHMgPSAwLAorICAgICAgICAgICAgIHNubXBpbmJhZHZlcnNpb25zID0gMCwKKyAgICAgICAgICAgICBzbm1waW5iYWRjb21tdW5pdHluYW1lcyA9IDAsCisgICAgICAgICAgICAgc25tcGluYmFkY29tbXVuaXR5dXNlcyA9IDAsCisgICAgICAgICAgICAgc25tcGluYXNucGFyc2VlcnJzID0gMCwKKyAgICAgICAgICAgICBzbm1waW50b29iaWdzID0gMCwKKyAgICAgICAgICAgICBzbm1waW5ub3N1Y2huYW1lcyA9IDAsCisgICAgICAgICAgICAgc25tcGluYmFkdmFsdWVzID0gMCwKKyAgICAgICAgICAgICBzbm1waW5yZWFkb25seXMgPSAwLAorICAgICAgICAgICAgIHNubXBpbmdlbmVycnMgPSAwLAorICAgICAgICAgICAgIHNubXBpbnRvdGFscmVxdmFycyA9IDAsCisgICAgICAgICAgICAgc25tcGludG90YWxzZXR2YXJzID0gMCwKKyAgICAgICAgICAgICBzbm1waW5nZXRyZXF1ZXN0cyA9IDAsCisgICAgICAgICAgICAgc25tcGluZ2V0bmV4dHMgPSAwLAorICAgICAgICAgICAgIHNubXBpbnNldHJlcXVlc3RzID0gMCwKKyAgICAgICAgICAgICBzbm1waW5nZXRyZXNwb25zZXMgPSAwLAorICAgICAgICAgICAgIHNubXBpbnRyYXBzID0gMCwKKyAgICAgICAgICAgICBzbm1wb3V0dG9vYmlncyA9IDAsCisgICAgICAgICAgICAgc25tcG91dG5vc3VjaG5hbWVzID0gMCwKKyAgICAgICAgICAgICBzbm1wb3V0YmFkdmFsdWVzID0gMCwKKyAgICAgICAgICAgICBzbm1wb3V0Z2VuZXJycyA9IDAsCisgICAgICAgICAgICAgc25tcG91dGdldHJlcXVlc3RzID0gMCwKKyAgICAgICAgICAgICBzbm1wb3V0Z2V0bmV4dHMgPSAwLAorICAgICAgICAgICAgIHNubXBvdXRzZXRyZXF1ZXN0cyA9IDAsCisgICAgICAgICAgICAgc25tcG91dGdldHJlc3BvbnNlcyA9IDAsCisgICAgICAgICAgICAgc25tcG91dHRyYXBzID0gMDsKKworCisKKy8qIHByb3RvdHlwZXMgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGluIGx3aXAvc3JjL2luY2x1ZGUvbHdpcC9zbm1wLmggKi8KKy8qKgorICogQ29weSBvY3RldCBzdHJpbmcuCisgKgorICogQHBhcmFtIGRzdCBwb2ludHMgdG8gZGVzdGluYXRpb24KKyAqIEBwYXJhbSBzcmMgcG9pbnRzIHRvIHNvdXJjZQorICogQHBhcmFtIG4gbnVtYmVyIG9mIG9jdGV0cyB0byBjb3B5LgorICovCitzdGF0aWMgdm9pZCBvY3N0cm5jcHkodThfdCAqZHN0LCB1OF90ICpzcmMsIHUxNl90IG4pCit7CisgIHUxNl90IGkgPSBuOworICB3aGlsZSAoaSA+IDApIHsKKyAgICBpLS07CisgICAgKmRzdCsrID0gKnNyYysrOworICB9Cit9CisKKy8qKgorICogQ29weSBvYmplY3QgaWRlbnRpZmllciAoczMyX3QpIGFycmF5LgorICoKKyAqIEBwYXJhbSBkc3QgcG9pbnRzIHRvIGRlc3RpbmF0aW9uCisgKiBAcGFyYW0gc3JjIHBvaW50cyB0byBzb3VyY2UKKyAqIEBwYXJhbSBuIG51bWJlciBvZiBzdWIgaWRlbnRpZmllcnMgdG8gY29weS4KKyAqLwordm9pZCBvYmplY3RpZG5jcHkoczMyX3QgKmRzdCwgczMyX3QgKnNyYywgdThfdCBuKQoreworICB1OF90IGkgPSBuOworICB3aGlsZShpID4gMCkgeworICAgIGktLTsKKyAgICAqZHN0KysgPSAqc3JjKys7CisgIH0KK30KKworLyoqCisgKiBJbml0aWFsaXplcyBzeXNEZXNjciBwb2ludGVycy4KKyAqCisgKiBAcGFyYW0gc3RyIGlmIG5vbi1OVUxMIHRoZW4gY29weSBzdHIgcG9pbnRlcgorICogQHBhcmFtIGxlbiBwb2ludHMgdG8gc3RyaW5nIGxlbmd0aCwgZXhjbHVkaW5nIHplcm8gdGVybWluYXRvcgorICovCit2b2lkIHNubXBfc2V0X3N5c2Rlc3IodThfdCAqc3RyLCB1OF90ICpsZW4pCit7CisgIGlmIChzdHIgIT0gTlVMTCkKKyAgeworICAgIHN5c2Rlc2NyX3B0ciA9IHN0cjsKKyAgICBzeXNkZXNjcl9sZW5fcHRyID0gbGVuOworICB9Cit9CisKK3ZvaWQgc25tcF9nZXRfc3lzb2JqaWRfcHRyKHN0cnVjdCBzbm1wX29ial9pZCAqKm9pZCkKK3sKKyAgKm9pZCA9ICZzeXNvYmppZDsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBzeXNPYmplY3RJRCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gb2lkIHBvaW50cyB0byBzdHVjdCBzbm1wX29ial9pZCB0byBjb3B5CisgKi8KK3ZvaWQgc25tcF9zZXRfc3lzb2JqaWQoc3RydWN0IHNubXBfb2JqX2lkICpvaWQpCit7CisgIHN5c29iamlkID0gKm9pZDsKK30KKworLyoqCisgKiBNdXN0IGJlIGNhbGxlZCBhdCByZWd1bGFyIDEwIG1zZWMgaW50ZXJ2YWwgZnJvbSBhIHRpbWVyIGludGVycnVwdAorICogb3Igc2lnbmFsIGhhbmRsZXIgZGVwZW5kaW5nIG9uIHlvdXIgcnVudGltZSBlbnZpcm9ubWVudC4KKyAqLwordm9pZCBzbm1wX2luY19zeXN1cHRpbWUodm9pZCkKK3sKKyAgc3lzdXB0aW1lKys7Cit9CisKK3ZvaWQgc25tcF9hZGRfc3lzdXB0aW1lKHUzMl90IHZhbHVlKQoreworICBzeXN1cHRpbWUrPXZhbHVlOworfQorCit2b2lkIHNubXBfZ2V0X3N5c3VwdGltZSh1MzJfdCAqdmFsdWUpCit7CisgIFNOTVBfR0VUX1NZU1VQVElNRShzeXN1cHRpbWUpOworICAqdmFsdWUgPSBzeXN1cHRpbWU7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgc3lzQ29udGFjdCBwb2ludGVycywKKyAqIGUuZy4gcHRycyB0byBub24tdm9sYXRpbGUgbWVtb3J5IGV4dGVybmFsIHRvIGx3SVAuCisgKgorICogQHBhcmFtIG9jc3RyIGlmIG5vbi1OVUxMIHRoZW4gY29weSBzdHIgcG9pbnRlcgorICogQHBhcmFtIG9jc3RybGVuIHBvaW50cyB0byBzdHJpbmcgbGVuZ3RoLCBleGNsdWRpbmcgemVybyB0ZXJtaW5hdG9yCisgKi8KK3ZvaWQgc25tcF9zZXRfc3lzY29udGFjdCh1OF90ICpvY3N0ciwgdThfdCAqb2NzdHJsZW4pCit7CisgIGlmIChvY3N0ciAhPSBOVUxMKQorICB7CisgICAgc3lzY29udGFjdF9wdHIgPSBvY3N0cjsKKyAgICBzeXNjb250YWN0X2xlbl9wdHIgPSBvY3N0cmxlbjsKKyAgfQorfQorCisvKioKKyAqIEluaXRpYWxpemVzIHN5c05hbWUgcG9pbnRlcnMsCisgKiBlLmcuIHB0cnMgdG8gbm9uLXZvbGF0aWxlIG1lbW9yeSBleHRlcm5hbCB0byBsd0lQLgorICoKKyAqIEBwYXJhbSBvY3N0ciBpZiBub24tTlVMTCB0aGVuIGNvcHkgc3RyIHBvaW50ZXIKKyAqIEBwYXJhbSBvY3N0cmxlbiBwb2ludHMgdG8gc3RyaW5nIGxlbmd0aCwgZXhjbHVkaW5nIHplcm8gdGVybWluYXRvcgorICovCit2b2lkIHNubXBfc2V0X3N5c25hbWUodThfdCAqb2NzdHIsIHU4X3QgKm9jc3RybGVuKQoreworICBpZiAob2NzdHIgIT0gTlVMTCkKKyAgeworICAgIHN5c25hbWVfcHRyID0gb2NzdHI7CisgICAgc3lzbmFtZV9sZW5fcHRyID0gb2NzdHJsZW47CisgIH0KK30KKworLyoqCisgKiBJbml0aWFsaXplcyBzeXNMb2NhdGlvbiBwb2ludGVycywKKyAqIGUuZy4gcHRycyB0byBub24tdm9sYXRpbGUgbWVtb3J5IGV4dGVybmFsIHRvIGx3SVAuCisgKgorICogQHBhcmFtIG9jc3RyIGlmIG5vbi1OVUxMIHRoZW4gY29weSBzdHIgcG9pbnRlcgorICogQHBhcmFtIG9jc3RybGVuIHBvaW50cyB0byBzdHJpbmcgbGVuZ3RoLCBleGNsdWRpbmcgemVybyB0ZXJtaW5hdG9yCisgKi8KK3ZvaWQgc25tcF9zZXRfc3lzbG9jYXRpb24odThfdCAqb2NzdHIsIHU4X3QgKm9jc3RybGVuKQoreworICBpZiAob2NzdHIgIT0gTlVMTCkKKyAgeworICAgIHN5c2xvY2F0aW9uX3B0ciA9IG9jc3RyOworICAgIHN5c2xvY2F0aW9uX2xlbl9wdHIgPSBvY3N0cmxlbjsKKyAgfQorfQorCisKK3ZvaWQgc25tcF9hZGRfaWZpbm9jdGV0cyhzdHJ1Y3QgbmV0aWYgKm5pLCB1MzJfdCB2YWx1ZSkKK3sKKyAgbmktPmlmaW5vY3RldHMgKz0gdmFsdWU7Cit9CisKK3ZvaWQgc25tcF9pbmNfaWZpbnVjYXN0cGt0cyhzdHJ1Y3QgbmV0aWYgKm5pKQoreworICAobmktPmlmaW51Y2FzdHBrdHMpKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfaWZpbm51Y2FzdHBrdHMoc3RydWN0IG5ldGlmICpuaSkKK3sKKyAgKG5pLT5pZmlubnVjYXN0cGt0cykrKzsKK30KKwordm9pZCBzbm1wX2luY19pZmluZGlzY2FyZHMoc3RydWN0IG5ldGlmICpuaSkKK3sKKyAgKG5pLT5pZmluZGlzY2FyZHMpKys7Cit9CisKK3ZvaWQgc25tcF9hZGRfaWZvdXRvY3RldHMoc3RydWN0IG5ldGlmICpuaSwgdTMyX3QgdmFsdWUpCit7CisgIG5pLT5pZm91dG9jdGV0cyArPSB2YWx1ZTsKK30KKwordm9pZCBzbm1wX2luY19pZm91dHVjYXN0cGt0cyhzdHJ1Y3QgbmV0aWYgKm5pKQoreworICAobmktPmlmb3V0dWNhc3Rwa3RzKSsrOworfQorCit2b2lkIHNubXBfaW5jX2lmb3V0bnVjYXN0cGt0cyhzdHJ1Y3QgbmV0aWYgKm5pKQoreworICAobmktPmlmb3V0bnVjYXN0cGt0cykrKzsKK30KKwordm9pZCBzbm1wX2luY19pZm91dGRpc2NhcmRzKHN0cnVjdCBuZXRpZiAqbmkpCit7CisgIChuaS0+aWZvdXRkaXNjYXJkcykrKzsKK30KKwordm9pZCBzbm1wX2luY19pZmxpc3Qodm9pZCkKK3sKKyAgc3RydWN0IG1pYl9saXN0X25vZGUgKmlmX25vZGUgPSBOVUxMOworCisgIHNubXBfbWliX25vZGVfaW5zZXJ0KCZpZmxpc3Rfcm9vdCwgaWZsaXN0X3Jvb3QuY291bnQgKyAxLCAmaWZfbm9kZSk7CisgIC8qIGVuYWJsZSBnZXRuZXh0IHRyYXZlcnNhbCBvbiBmaWxsZWQgdGFibGUgKi8KKyAgaWZ0YWJsZS5tYXhsZW5ndGggPSAxOworfQorCit2b2lkIHNubXBfZGVjX2lmbGlzdCh2b2lkKQoreworICBzbm1wX21pYl9ub2RlX2RlbGV0ZSgmaWZsaXN0X3Jvb3QsIGlmbGlzdF9yb290LnRhaWwpOworICAvKiBkaXNhYmxlIGdldG5leHQgdHJhdmVyc2FsIG9uIGVtcHR5IHRhYmxlICovCisgIGlmKGlmbGlzdF9yb290LmNvdW50ID09IDApIGlmdGFibGUubWF4bGVuZ3RoID0gMDsKK30KKworLyoqCisgKiBJbnNlcnRzIEFSUCB0YWJsZSBpbmRleGVzICgueElmSW5kZXgueE5ldEFkZHJlc3MpCisgKiBpbnRvIGFycCB0YWJsZSBpbmRleCB0cmVlcyAoYm90aCBhdFRhYmxlIGFuZCBpcE5ldFRvTWVkaWFUYWJsZSkuCisgKi8KK3ZvaWQgc25tcF9pbnNlcnRfYXJwaWR4X3RyZWUoc3RydWN0IG5ldGlmICpuaSwgaXBfYWRkcl90ICppcCkKK3sKKyAgc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICphdF9ybjsKKyAgc3RydWN0IG1pYl9saXN0X25vZGUgKmF0X25vZGU7CisgIHMzMl90IGFycGlkeFs1XTsKKyAgdThfdCBsZXZlbCwgdHJlZTsKKworICBMV0lQX0FTU0VSVCgibmkgIT0gTlVMTCIsIG5pICE9IE5VTEwpOworICBzbm1wX25ldGlmdG9pZmluZGV4KG5pLCAmYXJwaWR4WzBdKTsKKyAgc25tcF9pcHRvb2lkKGlwLCAmYXJwaWR4WzFdKTsKKworICBmb3IgKHRyZWUgPSAwOyB0cmVlIDwgMjsgdHJlZSsrKQorICB7CisgICAgaWYgKHRyZWUgPT0gMCkKKyAgICB7CisgICAgICBhdF9ybiA9ICZhcnB0cmVlX3Jvb3Q7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhdF9ybiA9ICZpcG50b210cmVlX3Jvb3Q7CisgICAgfQorICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IDU7IGxldmVsKyspCisgICAgeworICAgICAgYXRfbm9kZSA9IE5VTEw7CisgICAgICBzbm1wX21pYl9ub2RlX2luc2VydChhdF9ybiwgYXJwaWR4W2xldmVsXSwgJmF0X25vZGUpOworICAgICAgaWYgKChsZXZlbCAhPSA0KSAmJiAoYXRfbm9kZSAhPSBOVUxMKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGF0X25vZGUtPm5wdHIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGF0X3JuID0gc25tcF9taWJfbHJuX2FsbG9jKCk7CisgICAgICAgICAgYXRfbm9kZS0+bnB0ciA9IChzdHJ1Y3QgbWliX25vZGUqKWF0X3JuOworICAgICAgICAgIGlmIChhdF9ybiAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAodHJlZSA9PSAwKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXRfcm4tPmdldF9vYmplY3RfZGVmID0gYXRlbnRyeV9nZXRfb2JqZWN0X2RlZjsKKyAgICAgICAgICAgICAgICBhdF9ybi0+Z2V0X3ZhbHVlID0gYXRlbnRyeV9nZXRfdmFsdWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXRfcm4tPmdldF9vYmplY3RfZGVmID0gaXBfbnRvbWVudHJ5X2dldF9vYmplY3RfZGVmOworICAgICAgICAgICAgICAgIGF0X3JuLT5nZXRfdmFsdWUgPSBpcF9udG9tZW50cnlfZ2V0X3ZhbHVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGF0X3JuLT5zZXRfdGVzdCA9IG5vbGVhZnNfc2V0X3Rlc3Q7CisgICAgICAgICAgICAgIGF0X3JuLT5zZXRfdmFsdWUgPSBub2xlYWZzX3NldF92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGF0X3JuID09IE5VTEwsIG1hbGxvYyBmYWlsdXJlICovCisgICAgICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoInNubXBfaW5zZXJ0X2FycGlkeF90cmVlKCkgaW5zZXJ0IGZhaWxlZCwgbWVtIGZ1bGwiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYXRfcm4gPSAoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlKilhdF9ub2RlLT5ucHRyOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qIGVuYWJsZSBnZXRuZXh0IHRyYXZlcnNhbCBvbiBmaWxsZWQgdGFibGVzICovCisgIGF0Lm1heGxlbmd0aCA9IDE7CisgIGlwbnRvbXRhYmxlLm1heGxlbmd0aCA9IDE7Cit9CisKKy8qKgorICogUmVtb3ZlcyBBUlAgdGFibGUgaW5kZXhlcyAoLnhJZkluZGV4LnhOZXRBZGRyZXNzKQorICogZnJvbSBhcnAgdGFibGUgaW5kZXggdHJlZXMuCisgKi8KK3ZvaWQgc25tcF9kZWxldGVfYXJwaWR4X3RyZWUoc3RydWN0IG5ldGlmICpuaSwgaXBfYWRkcl90ICppcCkKK3sKKyAgc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICphdF9ybiwgKm5leHQsICpkZWxfcm5bNV07CisgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICphdF9uLCAqZGVsX25bNV07CisgIHMzMl90IGFycGlkeFs1XTsKKyAgdThfdCBmYywgdHJlZSwgbGV2ZWwsIGRlbF9jbnQ7CisKKyAgc25tcF9uZXRpZnRvaWZpbmRleChuaSwgJmFycGlkeFswXSk7CisgIHNubXBfaXB0b29pZChpcCwgJmFycGlkeFsxXSk7CisKKyAgZm9yICh0cmVlID0gMDsgdHJlZSA8IDI7IHRyZWUrKykKKyAgeworICAgIC8qIG1hcmsgbm9kZXMgZm9yIGRlbGV0aW9uICovCisgICAgaWYgKHRyZWUgPT0gMCkKKyAgICB7CisgICAgICBhdF9ybiA9ICZhcnB0cmVlX3Jvb3Q7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhdF9ybiA9ICZpcG50b210cmVlX3Jvb3Q7CisgICAgfQorICAgIGxldmVsID0gMDsKKyAgICBkZWxfY250ID0gMDsKKyAgICB3aGlsZSAoKGxldmVsIDwgNSkgJiYgKGF0X3JuICE9IE5VTEwpKQorICAgIHsKKyAgICAgIGZjID0gc25tcF9taWJfbm9kZV9maW5kKGF0X3JuLCBhcnBpZHhbbGV2ZWxdLCAmYXRfbik7CisgICAgICBpZiAoZmMgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgLyogYXJwaWR4W2xldmVsXSBkb2VzIG5vdCBleGlzdCAqLworICAgICAgICBkZWxfY250ID0gMDsKKyAgICAgICAgYXRfcm4gPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZmMgPT0gMSkKKyAgICAgIHsKKyAgICAgICAgZGVsX3JuW2RlbF9jbnRdID0gYXRfcm47CisgICAgICAgIGRlbF9uW2RlbF9jbnRdID0gYXRfbjsKKyAgICAgICAgZGVsX2NudCsrOworICAgICAgICBhdF9ybiA9IChzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUqKShhdF9uLT5ucHRyKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGZjID09IDIpCisgICAgICB7CisgICAgICAgIC8qIHJlc2V0IGRlbGV0ZSAoMiBvciBtb3JlIGNoaWxkcykgKi8KKyAgICAgICAgZGVsX2NudCA9IDA7CisgICAgICAgIGF0X3JuID0gKHN0cnVjdCBtaWJfbGlzdF9yb290bm9kZSopKGF0X24tPm5wdHIpOworICAgICAgfQorICAgICAgbGV2ZWwrKzsKKyAgICB9CisgICAgLyogZGVsZXRlIG1hcmtlZCBpbmRleCBub2RlcyAqLworICAgIHdoaWxlIChkZWxfY250ID4gMCkKKyAgICB7CisgICAgICBkZWxfY250LS07CisKKyAgICAgIGF0X3JuID0gZGVsX3JuW2RlbF9jbnRdOworICAgICAgYXRfbiA9IGRlbF9uW2RlbF9jbnRdOworCisgICAgICBuZXh0ID0gc25tcF9taWJfbm9kZV9kZWxldGUoYXRfcm4sIGF0X24pOworICAgICAgaWYgKG5leHQgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgTFdJUF9BU1NFUlQoIm5leHRfY291bnQgPT0gMCIsbmV4dC0+Y291bnQgPT0gMCk7CisgICAgICAgIHNubXBfbWliX2xybl9mcmVlKG5leHQpOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBkaXNhYmxlIGdldG5leHQgdHJhdmVyc2FsIG9uIGVtcHR5IHRhYmxlcyAqLworICBpZihhcnB0cmVlX3Jvb3QuY291bnQgPT0gMCkgYXQubWF4bGVuZ3RoID0gMDsKKyAgaWYoaXBudG9tdHJlZV9yb290LmNvdW50ID09IDApIGlwbnRvbXRhYmxlLm1heGxlbmd0aCA9IDA7Cit9CisKK3ZvaWQgc25tcF9pbmNfaXBpbnJlY2VpdmVzKHZvaWQpCit7CisgIGlwaW5yZWNlaXZlcysrOworfQorCit2b2lkIHNubXBfaW5jX2lwaW5oZHJlcnJvcnModm9pZCkKK3sKKyAgaXBpbmhkcmVycm9ycysrOworfQorCit2b2lkIHNubXBfaW5jX2lwaW5hZGRyZXJyb3JzKHZvaWQpCit7CisgIGlwaW5hZGRyZXJyb3JzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfaXBmb3J3ZGF0YWdyYW1zKHZvaWQpCit7CisgIGlwZm9yd2RhdGFncmFtcysrOworfQorCit2b2lkIHNubXBfaW5jX2lwaW51bmtub3ducHJvdG9zKHZvaWQpCit7CisgIGlwaW51bmtub3ducHJvdG9zKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfaXBpbmRpc2NhcmRzKHZvaWQpCit7CisgIGlwaW5kaXNjYXJkcysrOworfQorCit2b2lkIHNubXBfaW5jX2lwaW5kZWxpdmVycyh2b2lkKQoreworICBpcGluZGVsaXZlcnMrKzsKK30KKwordm9pZCBzbm1wX2luY19pcG91dHJlcXVlc3RzKHZvaWQpCit7CisgIGlwb3V0cmVxdWVzdHMrKzsKK30KKwordm9pZCBzbm1wX2luY19pcG91dGRpc2NhcmRzKHZvaWQpCit7CisgIGlwb3V0ZGlzY2FyZHMrKzsKK30KKwordm9pZCBzbm1wX2luY19pcG91dG5vcm91dGVzKHZvaWQpCit7CisgIGlwb3V0bm9yb3V0ZXMrKzsKK30KKwordm9pZCBzbm1wX2luY19pcHJlYXNtcmVxZHModm9pZCkKK3sKKyAgaXByZWFzbXJlcWRzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfaXByZWFzbW9rcyh2b2lkKQoreworICBpcHJlYXNtb2tzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfaXByZWFzbWZhaWxzKHZvaWQpCit7CisgIGlwcmVhc21mYWlscysrOworfQorCit2b2lkIHNubXBfaW5jX2lwZnJhZ29rcyh2b2lkKQoreworICBpcGZyYWdva3MrKzsKK30KKwordm9pZCBzbm1wX2luY19pcGZyYWdmYWlscyh2b2lkKQoreworICBpcGZyYWdmYWlscysrOworfQorCit2b2lkIHNubXBfaW5jX2lwZnJhZ2NyZWF0ZXModm9pZCkKK3sKKyAgaXBmcmFnY3JlYXRlcysrOworfQorCit2b2lkIHNubXBfaW5jX2lwcm91dGluZ2Rpc2NhcmRzKHZvaWQpCit7CisgIGlwcm91dGluZ2Rpc2NhcmRzKys7Cit9CisKKy8qKgorICogSW5zZXJ0cyBpcEFkZHJUYWJsZSBpbmRleGVzICguaXBBZEVudEFkZHIpCisgKiBpbnRvIGluZGV4IHRyZWUuCisgKi8KK3ZvaWQgc25tcF9pbnNlcnRfaXBhZGRyaWR4X3RyZWUoc3RydWN0IG5ldGlmICpuaSkKK3sKKyAgc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICppcGFfcm47CisgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICppcGFfbm9kZTsKKyAgczMyX3QgaXBhZGRyaWR4WzRdOworICB1OF90IGxldmVsOworCisgIExXSVBfQVNTRVJUKCJuaSAhPSBOVUxMIiwgbmkgIT0gTlVMTCk7CisgIHNubXBfaXB0b29pZCgmbmktPmlwX2FkZHIsICZpcGFkZHJpZHhbMF0pOworCisgIGxldmVsID0gMDsKKyAgaXBhX3JuID0gJmlwYWRkcnRyZWVfcm9vdDsKKyAgd2hpbGUgKGxldmVsIDwgNCkKKyAgeworICAgIGlwYV9ub2RlID0gTlVMTDsKKyAgICBzbm1wX21pYl9ub2RlX2luc2VydChpcGFfcm4sIGlwYWRkcmlkeFtsZXZlbF0sICZpcGFfbm9kZSk7CisgICAgaWYgKChsZXZlbCAhPSAzKSAmJiAoaXBhX25vZGUgIT0gTlVMTCkpCisgICAgeworICAgICAgaWYgKGlwYV9ub2RlLT5ucHRyID09IE5VTEwpCisgICAgICB7CisgICAgICAgIGlwYV9ybiA9IHNubXBfbWliX2xybl9hbGxvYygpOworICAgICAgICBpcGFfbm9kZS0+bnB0ciA9IChzdHJ1Y3QgbWliX25vZGUqKWlwYV9ybjsKKyAgICAgICAgaWYgKGlwYV9ybiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGxldmVsID09IDIpCisgICAgICAgICAgeworICAgICAgICAgICAgaXBhX3JuLT5nZXRfb2JqZWN0X2RlZiA9IGlwX2FkZHJlbnRyeV9nZXRfb2JqZWN0X2RlZjsKKyAgICAgICAgICAgIGlwYV9ybi0+Z2V0X3ZhbHVlID0gaXBfYWRkcmVudHJ5X2dldF92YWx1ZTsKKyAgICAgICAgICAgIGlwYV9ybi0+c2V0X3Rlc3QgPSBub2xlYWZzX3NldF90ZXN0OworICAgICAgICAgICAgaXBhX3JuLT5zZXRfdmFsdWUgPSBub2xlYWZzX3NldF92YWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogaXBhX3JuID09IE5VTEwsIG1hbGxvYyBmYWlsdXJlICovCisgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJzbm1wX2luc2VydF9pcGFkZHJpZHhfdHJlZSgpIGluc2VydCBmYWlsZWQsIG1lbSBmdWxsIikpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlwYV9ybiA9IChzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUqKWlwYV9ub2RlLT5ucHRyOworICAgICAgfQorICAgIH0KKyAgICBsZXZlbCsrOworICB9CisgIC8qIGVuYWJsZSBnZXRuZXh0IHRyYXZlcnNhbCBvbiBmaWxsZWQgdGFibGUgKi8KKyAgaXBhZGRydGFibGUubWF4bGVuZ3RoID0gMTsKK30KKworLyoqCisgKiBSZW1vdmVzIGlwQWRkclRhYmxlIGluZGV4ZXMgKC5pcEFkRW50QWRkcikKKyAqIGZyb20gaW5kZXggdHJlZS4KKyAqLwordm9pZCBzbm1wX2RlbGV0ZV9pcGFkZHJpZHhfdHJlZShzdHJ1Y3QgbmV0aWYgKm5pKQoreworICBzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKmlwYV9ybiwgKm5leHQsICpkZWxfcm5bNF07CisgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICppcGFfbiwgKmRlbF9uWzRdOworICBzMzJfdCBpcGFkZHJpZHhbNF07CisgIHU4X3QgZmMsIGxldmVsLCBkZWxfY250OworCisgIExXSVBfQVNTRVJUKCJuaSAhPSBOVUxMIiwgbmkgIT0gTlVMTCk7CisgIHNubXBfaXB0b29pZCgmbmktPmlwX2FkZHIsICZpcGFkZHJpZHhbMF0pOworCisgIC8qIG1hcmsgbm9kZXMgZm9yIGRlbGV0aW9uICovCisgIGxldmVsID0gMDsKKyAgZGVsX2NudCA9IDA7CisgIGlwYV9ybiA9ICZpcGFkZHJ0cmVlX3Jvb3Q7CisgIHdoaWxlICgobGV2ZWwgPCA0KSAmJiAoaXBhX3JuICE9IE5VTEwpKQorICB7CisgICAgZmMgPSBzbm1wX21pYl9ub2RlX2ZpbmQoaXBhX3JuLCBpcGFkZHJpZHhbbGV2ZWxdLCAmaXBhX24pOworICAgIGlmIChmYyA9PSAwKQorICAgIHsKKyAgICAgIC8qIGlwYWRkcmlkeFtsZXZlbF0gZG9lcyBub3QgZXhpc3QgKi8KKyAgICAgIGRlbF9jbnQgPSAwOworICAgICAgaXBhX3JuID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoZmMgPT0gMSkKKyAgICB7CisgICAgICBkZWxfcm5bZGVsX2NudF0gPSBpcGFfcm47CisgICAgICBkZWxfbltkZWxfY250XSA9IGlwYV9uOworICAgICAgZGVsX2NudCsrOworICAgICAgaXBhX3JuID0gKHN0cnVjdCBtaWJfbGlzdF9yb290bm9kZSopKGlwYV9uLT5ucHRyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZmMgPT0gMikKKyAgICB7CisgICAgICAvKiByZXNldCBkZWxldGUgKDIgb3IgbW9yZSBjaGlsZHMpICovCisgICAgICBkZWxfY250ID0gMDsKKyAgICAgIGlwYV9ybiA9IChzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUqKShpcGFfbi0+bnB0cik7CisgICAgfQorICAgIGxldmVsKys7CisgIH0KKyAgLyogZGVsZXRlIG1hcmtlZCBpbmRleCBub2RlcyAqLworICB3aGlsZSAoZGVsX2NudCA+IDApCisgIHsKKyAgICBkZWxfY250LS07CisKKyAgICBpcGFfcm4gPSBkZWxfcm5bZGVsX2NudF07CisgICAgaXBhX24gPSBkZWxfbltkZWxfY250XTsKKworICAgIG5leHQgPSBzbm1wX21pYl9ub2RlX2RlbGV0ZShpcGFfcm4sIGlwYV9uKTsKKyAgICBpZiAobmV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgIExXSVBfQVNTRVJUKCJuZXh0X2NvdW50ID09IDAiLG5leHQtPmNvdW50ID09IDApOworICAgICAgc25tcF9taWJfbHJuX2ZyZWUobmV4dCk7CisgICAgfQorICB9CisgIC8qIGRpc2FibGUgZ2V0bmV4dCB0cmF2ZXJzYWwgb24gZW1wdHkgdGFibGUgKi8KKyAgaWYgKGlwYWRkcnRyZWVfcm9vdC5jb3VudCA9PSAwKSBpcGFkZHJ0YWJsZS5tYXhsZW5ndGggPSAwOworfQorCisvKioKKyAqIEluc2VydHMgaXBSb3V0ZVRhYmxlIGluZGV4ZXMgKC5pcFJvdXRlRGVzdCkKKyAqIGludG8gaW5kZXggdHJlZS4KKyAqCisgKiBAcGFyYW0gZGZsdCBub24temVybyBmb3IgdGhlIGRlZmF1bHQgcnRlLCB6ZXJvIGZvciBuZXR3b3JrIHJ0ZQorICogQHBhcmFtIG5pIHBvaW50cyB0byBuZXR3b3JrIGludGVyZmFjZSBmb3IgdGhpcyBydGUKKyAqCisgKiBAdG9kbyByZWNvcmQgc3lzdXB0aW1lIGZvciBfdGhpc18gcm91dGUgd2hlbiBpdCBpcyBpbnN0YWxsZWQKKyAqICAgKG5lZWRlZCBmb3IgaXBSb3V0ZUFnZSkgaW4gdGhlIG5ldGlmLgorICovCit2b2lkIHNubXBfaW5zZXJ0X2lwcnRlaWR4X3RyZWUodThfdCBkZmx0LCBzdHJ1Y3QgbmV0aWYgKm5pKQoreworICB1OF90IGluc2VydCA9IDA7CisgIGlwX2FkZHJfdCBkc3Q7CisKKyAgaWYgKGRmbHQgIT0gMCkKKyAgeworICAgIC8qIHRoZSBkZWZhdWx0IHJvdXRlIDAuMC4wLjAgKi8KKyAgICBpcF9hZGRyX3NldF9hbnkoJmRzdCk7CisgICAgaW5zZXJ0ID0gMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiByb3V0ZSB0byB0aGUgbmV0d29yayBhZGRyZXNzICovCisgICAgaXBfYWRkcl9nZXRfbmV0d29yaygmZHN0LCAmbmktPmlwX2FkZHIsICZuaS0+bmV0bWFzayk7CisgICAgLyogZXhjbHVkZSAwLjAuMC4wIG5ldHdvcmsgKHJlc2VydmVkIGZvciBkZWZhdWx0IHJ0ZSkgKi8KKyAgICBpZiAoIWlwX2FkZHJfaXNhbnkoJmRzdCkpIHsKKyAgICAgIGluc2VydCA9IDE7CisgICAgfQorICB9CisgIGlmIChpbnNlcnQpCisgIHsKKyAgICBzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKmlwcnRlX3JuOworICAgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICppcHJ0ZV9ub2RlOworICAgIHMzMl90IGlwcnRlaWR4WzRdOworICAgIHU4X3QgbGV2ZWw7CisKKyAgICBzbm1wX2lwdG9vaWQoJmRzdCwgJmlwcnRlaWR4WzBdKTsKKyAgICBsZXZlbCA9IDA7CisgICAgaXBydGVfcm4gPSAmaXBydGV0cmVlX3Jvb3Q7CisgICAgd2hpbGUgKGxldmVsIDwgNCkKKyAgICB7CisgICAgICBpcHJ0ZV9ub2RlID0gTlVMTDsKKyAgICAgIHNubXBfbWliX25vZGVfaW5zZXJ0KGlwcnRlX3JuLCBpcHJ0ZWlkeFtsZXZlbF0sICZpcHJ0ZV9ub2RlKTsKKyAgICAgIGlmICgobGV2ZWwgIT0gMykgJiYgKGlwcnRlX25vZGUgIT0gTlVMTCkpCisgICAgICB7CisgICAgICAgIGlmIChpcHJ0ZV9ub2RlLT5ucHRyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpcHJ0ZV9ybiA9IHNubXBfbWliX2xybl9hbGxvYygpOworICAgICAgICAgIGlwcnRlX25vZGUtPm5wdHIgPSAoc3RydWN0IG1pYl9ub2RlKilpcHJ0ZV9ybjsKKyAgICAgICAgICBpZiAoaXBydGVfcm4gIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaXBydGVfcm4tPmdldF9vYmplY3RfZGVmID0gaXBfcnRlZW50cnlfZ2V0X29iamVjdF9kZWY7CisgICAgICAgICAgICAgIGlwcnRlX3JuLT5nZXRfdmFsdWUgPSBpcF9ydGVlbnRyeV9nZXRfdmFsdWU7CisgICAgICAgICAgICAgIGlwcnRlX3JuLT5zZXRfdGVzdCA9IG5vbGVhZnNfc2V0X3Rlc3Q7CisgICAgICAgICAgICAgIGlwcnRlX3JuLT5zZXRfdmFsdWUgPSBub2xlYWZzX3NldF92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlwcnRlX3JuID09IE5VTEwsIG1hbGxvYyBmYWlsdXJlICovCisgICAgICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoInNubXBfaW5zZXJ0X2lwcnRlaWR4X3RyZWUoKSBpbnNlcnQgZmFpbGVkLCBtZW0gZnVsbCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpcHJ0ZV9ybiA9IChzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUqKWlwcnRlX25vZGUtPm5wdHI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxldmVsKys7CisgICAgfQorICB9CisgIC8qIGVuYWJsZSBnZXRuZXh0IHRyYXZlcnNhbCBvbiBmaWxsZWQgdGFibGUgKi8KKyAgaXBydGV0YWJsZS5tYXhsZW5ndGggPSAxOworfQorCisvKioKKyAqIFJlbW92ZXMgaXBSb3V0ZVRhYmxlIGluZGV4ZXMgKC5pcFJvdXRlRGVzdCkKKyAqIGZyb20gaW5kZXggdHJlZS4KKyAqCisgKiBAcGFyYW0gZGZsdCBub24temVybyBmb3IgdGhlIGRlZmF1bHQgcnRlLCB6ZXJvIGZvciBuZXR3b3JrIHJ0ZQorICogQHBhcmFtIG5pIHBvaW50cyB0byBuZXR3b3JrIGludGVyZmFjZSBmb3IgdGhpcyBydGUgb3IgTlVMTAorICogICBmb3IgZGVmYXVsdCByb3V0ZSB0byBiZSByZW1vdmVkLgorICovCit2b2lkIHNubXBfZGVsZXRlX2lwcnRlaWR4X3RyZWUodThfdCBkZmx0LCBzdHJ1Y3QgbmV0aWYgKm5pKQoreworICB1OF90IGRlbCA9IDA7CisgIGlwX2FkZHJfdCBkc3Q7CisKKyAgaWYgKGRmbHQgIT0gMCkKKyAgeworICAgIC8qIHRoZSBkZWZhdWx0IHJvdXRlIDAuMC4wLjAgKi8KKyAgICBpcF9hZGRyX3NldF9hbnkoJmRzdCk7CisgICAgZGVsID0gMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiByb3V0ZSB0byB0aGUgbmV0d29yayBhZGRyZXNzICovCisgICAgaXBfYWRkcl9nZXRfbmV0d29yaygmZHN0LCAmbmktPmlwX2FkZHIsICZuaS0+bmV0bWFzayk7CisgICAgLyogZXhjbHVkZSAwLjAuMC4wIG5ldHdvcmsgKHJlc2VydmVkIGZvciBkZWZhdWx0IHJ0ZSkgKi8KKyAgICBpZiAoIWlwX2FkZHJfaXNhbnkoJmRzdCkpIHsKKyAgICAgIGRlbCA9IDE7CisgICAgfQorICB9CisgIGlmIChkZWwpCisgIHsKKyAgICBzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKmlwcnRlX3JuLCAqbmV4dCwgKmRlbF9ybls0XTsKKyAgICBzdHJ1Y3QgbWliX2xpc3Rfbm9kZSAqaXBydGVfbiwgKmRlbF9uWzRdOworICAgIHMzMl90IGlwcnRlaWR4WzRdOworICAgIHU4X3QgZmMsIGxldmVsLCBkZWxfY250OworCisgICAgc25tcF9pcHRvb2lkKCZkc3QsICZpcHJ0ZWlkeFswXSk7CisgICAgLyogbWFyayBub2RlcyBmb3IgZGVsZXRpb24gKi8KKyAgICBsZXZlbCA9IDA7CisgICAgZGVsX2NudCA9IDA7CisgICAgaXBydGVfcm4gPSAmaXBydGV0cmVlX3Jvb3Q7CisgICAgd2hpbGUgKChsZXZlbCA8IDQpICYmIChpcHJ0ZV9ybiAhPSBOVUxMKSkKKyAgICB7CisgICAgICBmYyA9IHNubXBfbWliX25vZGVfZmluZChpcHJ0ZV9ybiwgaXBydGVpZHhbbGV2ZWxdLCAmaXBydGVfbik7CisgICAgICBpZiAoZmMgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgLyogaXBydGVpZHhbbGV2ZWxdIGRvZXMgbm90IGV4aXN0ICovCisgICAgICAgIGRlbF9jbnQgPSAwOworICAgICAgICBpcHJ0ZV9ybiA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlIGlmIChmYyA9PSAxKQorICAgICAgeworICAgICAgICBkZWxfcm5bZGVsX2NudF0gPSBpcHJ0ZV9ybjsKKyAgICAgICAgZGVsX25bZGVsX2NudF0gPSBpcHJ0ZV9uOworICAgICAgICBkZWxfY250Kys7CisgICAgICAgIGlwcnRlX3JuID0gKHN0cnVjdCBtaWJfbGlzdF9yb290bm9kZSopKGlwcnRlX24tPm5wdHIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZmMgPT0gMikKKyAgICAgIHsKKyAgICAgICAgLyogcmVzZXQgZGVsZXRlICgyIG9yIG1vcmUgY2hpbGRzKSAqLworICAgICAgICBkZWxfY250ID0gMDsKKyAgICAgICAgaXBydGVfcm4gPSAoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlKikoaXBydGVfbi0+bnB0cik7CisgICAgICB9CisgICAgICBsZXZlbCsrOworICAgIH0KKyAgICAvKiBkZWxldGUgbWFya2VkIGluZGV4IG5vZGVzICovCisgICAgd2hpbGUgKGRlbF9jbnQgPiAwKQorICAgIHsKKyAgICAgIGRlbF9jbnQtLTsKKworICAgICAgaXBydGVfcm4gPSBkZWxfcm5bZGVsX2NudF07CisgICAgICBpcHJ0ZV9uID0gZGVsX25bZGVsX2NudF07CisKKyAgICAgIG5leHQgPSBzbm1wX21pYl9ub2RlX2RlbGV0ZShpcHJ0ZV9ybiwgaXBydGVfbik7CisgICAgICBpZiAobmV4dCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBMV0lQX0FTU0VSVCgibmV4dF9jb3VudCA9PSAwIixuZXh0LT5jb3VudCA9PSAwKTsKKyAgICAgICAgc25tcF9taWJfbHJuX2ZyZWUobmV4dCk7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIGRpc2FibGUgZ2V0bmV4dCB0cmF2ZXJzYWwgb24gZW1wdHkgdGFibGUgKi8KKyAgaWYgKGlwcnRldHJlZV9yb290LmNvdW50ID09IDApIGlwcnRldGFibGUubWF4bGVuZ3RoID0gMDsKK30KKworCit2b2lkIHNubXBfaW5jX2ljbXBpbm1zZ3Modm9pZCkKK3sKKyAgaWNtcGlubXNncysrOworfQorCit2b2lkIHNubXBfaW5jX2ljbXBpbmVycm9ycyh2b2lkKQoreworICBpY21waW5lcnJvcnMrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21waW5kZXN0dW5yZWFjaHModm9pZCkKK3sKKyAgaWNtcGluZGVzdHVucmVhY2hzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfaWNtcGludGltZWV4Y2RzKHZvaWQpCit7CisgIGljbXBpbnRpbWVleGNkcysrOworfQorCit2b2lkIHNubXBfaW5jX2ljbXBpbnBhcm1wcm9icyh2b2lkKQoreworICBpY21waW5wYXJtcHJvYnMrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21waW5zcmNxdWVuY2hzKHZvaWQpCit7CisgIGljbXBpbnNyY3F1ZW5jaHMrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21waW5yZWRpcmVjdHModm9pZCkKK3sKKyAgaWNtcGlucmVkaXJlY3RzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfaWNtcGluZWNob3Modm9pZCkKK3sKKyAgaWNtcGluZWNob3MrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21waW5lY2hvcmVwcyh2b2lkKQoreworICBpY21waW5lY2hvcmVwcysrOworfQorCit2b2lkIHNubXBfaW5jX2ljbXBpbnRpbWVzdGFtcHModm9pZCkKK3sKKyAgaWNtcGludGltZXN0YW1wcysrOworfQorCit2b2lkIHNubXBfaW5jX2ljbXBpbnRpbWVzdGFtcHJlcHModm9pZCkKK3sKKyAgaWNtcGludGltZXN0YW1wcmVwcysrOworfQorCit2b2lkIHNubXBfaW5jX2ljbXBpbmFkZHJtYXNrcyh2b2lkKQoreworICBpY21waW5hZGRybWFza3MrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21waW5hZGRybWFza3JlcHModm9pZCkKK3sKKyAgaWNtcGluYWRkcm1hc2tyZXBzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfaWNtcG91dG1zZ3Modm9pZCkKK3sKKyAgaWNtcG91dG1zZ3MrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21wb3V0ZXJyb3JzKHZvaWQpCit7CisgIGljbXBvdXRlcnJvcnMrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21wb3V0ZGVzdHVucmVhY2hzKHZvaWQpCit7CisgIGljbXBvdXRkZXN0dW5yZWFjaHMrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21wb3V0dGltZWV4Y2RzKHZvaWQpCit7CisgIGljbXBvdXR0aW1lZXhjZHMrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21wb3V0cGFybXByb2JzKHZvaWQpCit7CisgIGljbXBvdXRwYXJtcHJvYnMrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21wb3V0c3JjcXVlbmNocyh2b2lkKQoreworICBpY21wb3V0c3JjcXVlbmNocysrOworfQorCit2b2lkIHNubXBfaW5jX2ljbXBvdXRyZWRpcmVjdHModm9pZCkKK3sKKyAgaWNtcG91dHJlZGlyZWN0cysrOworfQorCit2b2lkIHNubXBfaW5jX2ljbXBvdXRlY2hvcyh2b2lkKQoreworICBpY21wb3V0ZWNob3MrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21wb3V0ZWNob3JlcHModm9pZCkKK3sKKyAgaWNtcG91dGVjaG9yZXBzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfaWNtcG91dHRpbWVzdGFtcHModm9pZCkKK3sKKyAgaWNtcG91dHRpbWVzdGFtcHMrKzsKK30KKwordm9pZCBzbm1wX2luY19pY21wb3V0dGltZXN0YW1wcmVwcyh2b2lkKQoreworICBpY21wb3V0dGltZXN0YW1wcmVwcysrOworfQorCit2b2lkIHNubXBfaW5jX2ljbXBvdXRhZGRybWFza3Modm9pZCkKK3sKKyAgaWNtcG91dGFkZHJtYXNrcysrOworfQorCit2b2lkIHNubXBfaW5jX2ljbXBvdXRhZGRybWFza3JlcHModm9pZCkKK3sKKyAgaWNtcG91dGFkZHJtYXNrcmVwcysrOworfQorCit2b2lkIHNubXBfaW5jX3RjcGFjdGl2ZW9wZW5zKHZvaWQpCit7CisgIHRjcGFjdGl2ZW9wZW5zKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfdGNwcGFzc2l2ZW9wZW5zKHZvaWQpCit7CisgIHRjcHBhc3NpdmVvcGVucysrOworfQorCit2b2lkIHNubXBfaW5jX3RjcGF0dGVtcHRmYWlscyh2b2lkKQoreworICB0Y3BhdHRlbXB0ZmFpbHMrKzsKK30KKwordm9pZCBzbm1wX2luY190Y3Blc3RhYnJlc2V0cyh2b2lkKQoreworICB0Y3Blc3RhYnJlc2V0cysrOworfQorCit2b2lkIHNubXBfaW5jX3RjcGluc2Vncyh2b2lkKQoreworICB0Y3BpbnNlZ3MrKzsKK30KKwordm9pZCBzbm1wX2luY190Y3BvdXRzZWdzKHZvaWQpCit7CisgIHRjcG91dHNlZ3MrKzsKK30KKwordm9pZCBzbm1wX2luY190Y3ByZXRyYW5zc2Vncyh2b2lkKQoreworICB0Y3ByZXRyYW5zc2VncysrOworfQorCit2b2lkIHNubXBfaW5jX3RjcGluZXJycyh2b2lkKQoreworICB0Y3BpbmVycnMrKzsKK30KKwordm9pZCBzbm1wX2luY190Y3BvdXRyc3RzKHZvaWQpCit7CisgIHRjcG91dHJzdHMrKzsKK30KKwordm9pZCBzbm1wX2luY191ZHBpbmRhdGFncmFtcyh2b2lkKQoreworICB1ZHBpbmRhdGFncmFtcysrOworfQorCit2b2lkIHNubXBfaW5jX3VkcG5vcG9ydHModm9pZCkKK3sKKyAgdWRwbm9wb3J0cysrOworfQorCit2b2lkIHNubXBfaW5jX3VkcGluZXJyb3JzKHZvaWQpCit7CisgIHVkcGluZXJyb3JzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfdWRwb3V0ZGF0YWdyYW1zKHZvaWQpCit7CisgIHVkcG91dGRhdGFncmFtcysrOworfQorCisvKioKKyAqIEluc2VydHMgdWRwVGFibGUgaW5kZXhlcyAoLnVkcExvY2FsQWRkcmVzcy51ZHBMb2NhbFBvcnQpCisgKiBpbnRvIGluZGV4IHRyZWUuCisgKi8KK3ZvaWQgc25tcF9pbnNlcnRfdWRwaWR4X3RyZWUoc3RydWN0IHVkcF9wY2IgKnBjYikKK3sKKyAgc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICp1ZHBfcm47CisgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICp1ZHBfbm9kZTsKKyAgczMyX3QgdWRwaWR4WzVdOworICB1OF90IGxldmVsOworCisgIExXSVBfQVNTRVJUKCJwY2IgIT0gTlVMTCIsIHBjYiAhPSBOVUxMKTsKKyAgc25tcF9pcHRvb2lkKCZwY2ItPmxvY2FsX2lwLCAmdWRwaWR4WzBdKTsKKyAgdWRwaWR4WzRdID0gcGNiLT5sb2NhbF9wb3J0OworCisgIHVkcF9ybiA9ICZ1ZHBfcm9vdDsKKyAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgNTsgbGV2ZWwrKykKKyAgeworICAgIHVkcF9ub2RlID0gTlVMTDsKKyAgICBzbm1wX21pYl9ub2RlX2luc2VydCh1ZHBfcm4sIHVkcGlkeFtsZXZlbF0sICZ1ZHBfbm9kZSk7CisgICAgaWYgKChsZXZlbCAhPSA0KSAmJiAodWRwX25vZGUgIT0gTlVMTCkpCisgICAgeworICAgICAgaWYgKHVkcF9ub2RlLT5ucHRyID09IE5VTEwpCisgICAgICB7CisgICAgICAgIHVkcF9ybiA9IHNubXBfbWliX2xybl9hbGxvYygpOworICAgICAgICB1ZHBfbm9kZS0+bnB0ciA9IChzdHJ1Y3QgbWliX25vZGUqKXVkcF9ybjsKKyAgICAgICAgaWYgKHVkcF9ybiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGxldmVsID09IDMpCisgICAgICAgICAgeworICAgICAgICAgICAgdWRwX3JuLT5nZXRfb2JqZWN0X2RlZiA9IHVkcGVudHJ5X2dldF9vYmplY3RfZGVmOworICAgICAgICAgICAgdWRwX3JuLT5nZXRfdmFsdWUgPSB1ZHBlbnRyeV9nZXRfdmFsdWU7CisgICAgICAgICAgICB1ZHBfcm4tPnNldF90ZXN0ID0gbm9sZWFmc19zZXRfdGVzdDsKKyAgICAgICAgICAgIHVkcF9ybi0+c2V0X3ZhbHVlID0gbm9sZWFmc19zZXRfdmFsdWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHVkcF9ybiA9PSBOVUxMLCBtYWxsb2MgZmFpbHVyZSAqLworICAgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgic25tcF9pbnNlcnRfdWRwaWR4X3RyZWUoKSBpbnNlcnQgZmFpbGVkLCBtZW0gZnVsbCIpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB1ZHBfcm4gPSAoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlKil1ZHBfbm9kZS0+bnB0cjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdWRwdGFibGUubWF4bGVuZ3RoID0gMTsKK30KKworLyoqCisgKiBSZW1vdmVzIHVkcFRhYmxlIGluZGV4ZXMgKC51ZHBMb2NhbEFkZHJlc3MudWRwTG9jYWxQb3J0KQorICogZnJvbSBpbmRleCB0cmVlLgorICovCit2b2lkIHNubXBfZGVsZXRlX3VkcGlkeF90cmVlKHN0cnVjdCB1ZHBfcGNiICpwY2IpCit7CisgIHN0cnVjdCB1ZHBfcGNiICpucGNiOworICBzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKnVkcF9ybiwgKm5leHQsICpkZWxfcm5bNV07CisgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICp1ZHBfbiwgKmRlbF9uWzVdOworICBzMzJfdCB1ZHBpZHhbNV07CisgIHU4X3QgYmluZGluZ3MsIGZjLCBsZXZlbCwgZGVsX2NudDsKKworICBMV0lQX0FTU0VSVCgicGNiICE9IE5VTEwiLCBwY2IgIT0gTlVMTCk7CisgIHNubXBfaXB0b29pZCgmcGNiLT5sb2NhbF9pcCwgJnVkcGlkeFswXSk7CisgIHVkcGlkeFs0XSA9IHBjYi0+bG9jYWxfcG9ydDsKKworICAvKiBjb3VudCBQQ0JzIGZvciBhIGdpdmVuIGJpbmRpbmcKKyAgICAgKGUuZy4gd2hlbiByZXVzaW5nIHBvcnRzIG9yIGZvciB0ZW1wIG91dHB1dCBQQ0JzKSAqLworICBiaW5kaW5ncyA9IDA7CisgIG5wY2IgPSB1ZHBfcGNiczsKKyAgd2hpbGUgKChucGNiICE9IE5VTEwpKQorICB7CisgICAgaWYgKGlwX2FkZHJfY21wKCZucGNiLT5sb2NhbF9pcCwgJnBjYi0+bG9jYWxfaXApICYmCisgICAgICAgIChucGNiLT5sb2NhbF9wb3J0ID09IHVkcGlkeFs0XSkpCisgICAgeworICAgICAgYmluZGluZ3MrKzsKKyAgICB9CisgICAgbnBjYiA9IG5wY2ItPm5leHQ7CisgIH0KKyAgaWYgKGJpbmRpbmdzID09IDEpCisgIHsKKyAgICAvKiBzZWxlY3RpdmVseSByZW1vdmUgKi8KKyAgICAvKiBtYXJrIG5vZGVzIGZvciBkZWxldGlvbiAqLworICAgIGxldmVsID0gMDsKKyAgICBkZWxfY250ID0gMDsKKyAgICB1ZHBfcm4gPSAmdWRwX3Jvb3Q7CisgICAgd2hpbGUgKChsZXZlbCA8IDUpICYmICh1ZHBfcm4gIT0gTlVMTCkpCisgICAgeworICAgICAgZmMgPSBzbm1wX21pYl9ub2RlX2ZpbmQodWRwX3JuLCB1ZHBpZHhbbGV2ZWxdLCAmdWRwX24pOworICAgICAgaWYgKGZjID09IDApCisgICAgICB7CisgICAgICAgIC8qIHVkcGlkeFtsZXZlbF0gZG9lcyBub3QgZXhpc3QgKi8KKyAgICAgICAgZGVsX2NudCA9IDA7CisgICAgICAgIHVkcF9ybiA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlIGlmIChmYyA9PSAxKQorICAgICAgeworICAgICAgICBkZWxfcm5bZGVsX2NudF0gPSB1ZHBfcm47CisgICAgICAgIGRlbF9uW2RlbF9jbnRdID0gdWRwX247CisgICAgICAgIGRlbF9jbnQrKzsKKyAgICAgICAgdWRwX3JuID0gKHN0cnVjdCBtaWJfbGlzdF9yb290bm9kZSopKHVkcF9uLT5ucHRyKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGZjID09IDIpCisgICAgICB7CisgICAgICAgIC8qIHJlc2V0IGRlbGV0ZSAoMiBvciBtb3JlIGNoaWxkcykgKi8KKyAgICAgICAgZGVsX2NudCA9IDA7CisgICAgICAgIHVkcF9ybiA9IChzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUqKSh1ZHBfbi0+bnB0cik7CisgICAgICB9CisgICAgICBsZXZlbCsrOworICAgIH0KKyAgICAvKiBkZWxldGUgbWFya2VkIGluZGV4IG5vZGVzICovCisgICAgd2hpbGUgKGRlbF9jbnQgPiAwKQorICAgIHsKKyAgICAgIGRlbF9jbnQtLTsKKworICAgICAgdWRwX3JuID0gZGVsX3JuW2RlbF9jbnRdOworICAgICAgdWRwX24gPSBkZWxfbltkZWxfY250XTsKKworICAgICAgbmV4dCA9IHNubXBfbWliX25vZGVfZGVsZXRlKHVkcF9ybiwgdWRwX24pOworICAgICAgaWYgKG5leHQgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgTFdJUF9BU1NFUlQoIm5leHRfY291bnQgPT0gMCIsbmV4dC0+Y291bnQgPT0gMCk7CisgICAgICAgIHNubXBfbWliX2xybl9mcmVlKG5leHQpOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBkaXNhYmxlIGdldG5leHQgdHJhdmVyc2FsIG9uIGVtcHR5IHRhYmxlICovCisgIGlmICh1ZHBfcm9vdC5jb3VudCA9PSAwKSB1ZHB0YWJsZS5tYXhsZW5ndGggPSAwOworfQorCisKK3ZvaWQgc25tcF9pbmNfc25tcGlucGt0cyh2b2lkKQoreworICBzbm1waW5wa3RzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcG91dHBrdHModm9pZCkKK3sKKyAgc25tcG91dHBrdHMrKzsKK30KKwordm9pZCBzbm1wX2luY19zbm1waW5iYWR2ZXJzaW9ucyh2b2lkKQoreworICBzbm1waW5iYWR2ZXJzaW9ucysrOworfQorCit2b2lkIHNubXBfaW5jX3NubXBpbmJhZGNvbW11bml0eW5hbWVzKHZvaWQpCit7CisgIHNubXBpbmJhZGNvbW11bml0eW5hbWVzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcGluYmFkY29tbXVuaXR5dXNlcyh2b2lkKQoreworICBzbm1waW5iYWRjb21tdW5pdHl1c2VzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcGluYXNucGFyc2VlcnJzKHZvaWQpCit7CisgIHNubXBpbmFzbnBhcnNlZXJycysrOworfQorCit2b2lkIHNubXBfaW5jX3NubXBpbnRvb2JpZ3Modm9pZCkKK3sKKyAgc25tcGludG9vYmlncysrOworfQorCit2b2lkIHNubXBfaW5jX3NubXBpbm5vc3VjaG5hbWVzKHZvaWQpCit7CisgIHNubXBpbm5vc3VjaG5hbWVzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcGluYmFkdmFsdWVzKHZvaWQpCit7CisgIHNubXBpbmJhZHZhbHVlcysrOworfQorCit2b2lkIHNubXBfaW5jX3NubXBpbnJlYWRvbmx5cyh2b2lkKQoreworICBzbm1waW5yZWFkb25seXMrKzsKK30KKwordm9pZCBzbm1wX2luY19zbm1waW5nZW5lcnJzKHZvaWQpCit7CisgIHNubXBpbmdlbmVycnMrKzsKK30KKwordm9pZCBzbm1wX2FkZF9zbm1waW50b3RhbHJlcXZhcnModThfdCB2YWx1ZSkKK3sKKyAgc25tcGludG90YWxyZXF2YXJzICs9IHZhbHVlOworfQorCit2b2lkIHNubXBfYWRkX3NubXBpbnRvdGFsc2V0dmFycyh1OF90IHZhbHVlKQoreworICBzbm1waW50b3RhbHNldHZhcnMgKz0gdmFsdWU7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcGluZ2V0cmVxdWVzdHModm9pZCkKK3sKKyAgc25tcGluZ2V0cmVxdWVzdHMrKzsKK30KKwordm9pZCBzbm1wX2luY19zbm1waW5nZXRuZXh0cyh2b2lkKQoreworICBzbm1waW5nZXRuZXh0cysrOworfQorCit2b2lkIHNubXBfaW5jX3NubXBpbnNldHJlcXVlc3RzKHZvaWQpCit7CisgIHNubXBpbnNldHJlcXVlc3RzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcGluZ2V0cmVzcG9uc2VzKHZvaWQpCit7CisgIHNubXBpbmdldHJlc3BvbnNlcysrOworfQorCit2b2lkIHNubXBfaW5jX3NubXBpbnRyYXBzKHZvaWQpCit7CisgIHNubXBpbnRyYXBzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcG91dHRvb2JpZ3Modm9pZCkKK3sKKyAgc25tcG91dHRvb2JpZ3MrKzsKK30KKwordm9pZCBzbm1wX2luY19zbm1wb3V0bm9zdWNobmFtZXModm9pZCkKK3sKKyAgc25tcG91dG5vc3VjaG5hbWVzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcG91dGJhZHZhbHVlcyh2b2lkKQoreworICBzbm1wb3V0YmFkdmFsdWVzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcG91dGdlbmVycnModm9pZCkKK3sKKyAgc25tcG91dGdlbmVycnMrKzsKK30KKwordm9pZCBzbm1wX2luY19zbm1wb3V0Z2V0cmVxdWVzdHModm9pZCkKK3sKKyAgc25tcG91dGdldHJlcXVlc3RzKys7Cit9CisKK3ZvaWQgc25tcF9pbmNfc25tcG91dGdldG5leHRzKHZvaWQpCit7CisgIHNubXBvdXRnZXRuZXh0cysrOworfQorCit2b2lkIHNubXBfaW5jX3NubXBvdXRzZXRyZXF1ZXN0cyh2b2lkKQoreworICBzbm1wb3V0c2V0cmVxdWVzdHMrKzsKK30KKwordm9pZCBzbm1wX2luY19zbm1wb3V0Z2V0cmVzcG9uc2VzKHZvaWQpCit7CisgIHNubXBvdXRnZXRyZXNwb25zZXMrKzsKK30KKwordm9pZCBzbm1wX2luY19zbm1wb3V0dHJhcHModm9pZCkKK3sKKyAgc25tcG91dHRyYXBzKys7Cit9CisKK3ZvaWQgc25tcF9nZXRfc25tcGdycGlkX3B0cihzdHJ1Y3Qgc25tcF9vYmpfaWQgKipvaWQpCit7CisgICpvaWQgPSAmc25tcGdycF9pZDsKK30KKwordm9pZCBzbm1wX3NldF9zbm1wZW5hYmxlYXV0aGVudHJhcHModThfdCAqdmFsdWUpCit7CisgIGlmICh2YWx1ZSAhPSBOVUxMKQorICB7CisgICAgc25tcGVuYWJsZWF1dGhlbnRyYXBzX3B0ciA9IHZhbHVlOworICB9Cit9CisKK3ZvaWQgc25tcF9nZXRfc25tcGVuYWJsZWF1dGhlbnRyYXBzKHU4X3QgKnZhbHVlKQoreworICAqdmFsdWUgPSAqc25tcGVuYWJsZWF1dGhlbnRyYXBzX3B0cjsKK30KKwordm9pZAorbm9sZWFmc19nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpCit7CisgIExXSVBfVU5VU0VEX0FSRyhpZGVudF9sZW4pOworICBMV0lQX1VOVVNFRF9BUkcoaWRlbnQpOworICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX05PTkU7Cit9CisKK3ZvaWQKK25vbGVhZnNfZ2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSkKK3sKKyAgTFdJUF9VTlVTRURfQVJHKG9kKTsKKyAgTFdJUF9VTlVTRURfQVJHKGxlbik7CisgIExXSVBfVU5VU0VEX0FSRyh2YWx1ZSk7Cit9CisKK3U4X3QKK25vbGVhZnNfc2V0X3Rlc3Qoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICBMV0lQX1VOVVNFRF9BUkcob2QpOworICBMV0lQX1VOVVNFRF9BUkcobGVuKTsKKyAgTFdJUF9VTlVTRURfQVJHKHZhbHVlKTsKKyAgLyogY2FuJ3Qgc2V0ICovCisgIHJldHVybiAwOworfQorCit2b2lkCitub2xlYWZzX3NldF92YWx1ZShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpCit7CisgIExXSVBfVU5VU0VEX0FSRyhvZCk7CisgIExXSVBfVU5VU0VEX0FSRyhsZW4pOworICBMV0lQX1VOVVNFRF9BUkcodmFsdWUpOworfQorCisKKy8qKgorICogUmV0dXJucyBzeXN0ZW1zIG9iamVjdCBkZWZpbml0aW9ucy4KKyAqCisgKiBAcGFyYW0gaWRlbnRfbGVuIHRoZSBhZGRyZXNzIGxlbmd0aCAoMikKKyAqIEBwYXJhbSBpZGVudCBwb2ludHMgdG8gb2JqZWN0bmFtZS4wIChvYmplY3QgaWQgdHJhaWxlcikKKyAqIEBwYXJhbSBvZCBwb2ludHMgdG8gb2JqZWN0IGRlZmluaXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitzeXN0ZW1fZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKQoreworICB1OF90IGlkOworCisgIC8qIHJldHVybiB0byBvYmplY3QgbmFtZSwgYWRkaW5nIGluZGV4IGRlcHRoICgxKSAqLworICBpZGVudF9sZW4gKz0gMTsKKyAgaWRlbnQgLT0gMTsKKyAgaWYgKGlkZW50X2xlbiA9PSAyKQorICB7CisgICAgb2QtPmlkX2luc3RfbGVuID0gaWRlbnRfbGVuOworICAgIG9kLT5pZF9pbnN0X3B0ciA9IGlkZW50OworCisgICAgTFdJUF9BU1NFUlQoImludmFsaWQgaWQiLCAoaWRlbnRbMF0gPj0gMCkgJiYgKGlkZW50WzBdIDw9IDB4ZmYpKTsKKyAgICBpZCA9ICh1OF90KWlkZW50WzBdOworICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiZ2V0X29iamVjdF9kZWYgc3lzdGVtLiUiVTE2X0YiLjBcbiIsKHUxNl90KWlkKSk7CisgICAgc3dpdGNoIChpZCkKKyAgICB7CisgICAgICBjYXNlIDE6IC8qIHN5c0Rlc2NyICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfU0NBTEFSOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX09OTFk7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfT0NfU1RSKTsKKyAgICAgICAgb2QtPnZfbGVuID0gKnN5c2Rlc2NyX2xlbl9wdHI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAvKiBzeXNPYmplY3RJRCAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1NDQUxBUjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9PTkxZOworICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09CSl9JRCk7CisgICAgICAgIG9kLT52X2xlbiA9IHN5c29iamlkLmxlbiAqIHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiBzeXNVcFRpbWUgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9TQ0FMQVI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX1RJTUVUSUNLUyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZih1MzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OiAvKiBzeXNDb250YWN0ICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfU0NBTEFSOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX1dSSVRFOworICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09DX1NUUik7CisgICAgICAgIG9kLT52X2xlbiA9ICpzeXNjb250YWN0X2xlbl9wdHI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OiAvKiBzeXNOYW1lICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfU0NBTEFSOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX1dSSVRFOworICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09DX1NUUik7CisgICAgICAgIG9kLT52X2xlbiA9ICpzeXNuYW1lX2xlbl9wdHI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2OiAvKiBzeXNMb2NhdGlvbiAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1NDQUxBUjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9XUklURTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9PQ19TVFIpOworICAgICAgICBvZC0+dl9sZW4gPSAqc3lzbG9jYXRpb25fbGVuX3B0cjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDc6IC8qIHN5c1NlcnZpY2VzICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfU0NBTEFSOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX09OTFk7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSU5URUcpOworICAgICAgICBvZC0+dl9sZW4gPSBzaXplb2YoczMyX3QpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgic3lzdGVtX2dldF9vYmplY3RfZGVmOiBubyBzdWNoIG9iamVjdFxuIikpOworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX05PTkU7CisgICAgICAgIGJyZWFrOworICAgIH07CisgIH0KKyAgZWxzZQorICB7CisgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJzeXN0ZW1fZ2V0X29iamVjdF9kZWY6IG5vIHNjYWxhclxuIikpOworICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfTk9ORTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgc3lzdGVtIG9iamVjdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gaWRlbnRfbGVuIHRoZSBhZGRyZXNzIGxlbmd0aCAoMikKKyAqIEBwYXJhbSBpZGVudCBwb2ludHMgdG8gb2JqZWN0bmFtZS4wIChvYmplY3QgaWQgdHJhaWxlcikKKyAqIEBwYXJhbSBsZW4gcmV0dXJuIHZhbHVlIHNwYWNlIChpbiBieXRlcykKKyAqIEBwYXJhbSB2YWx1ZSBwb2ludHMgdG8gKHZhcmJpbmQpIHNwYWNlIHRvIGNvcHkgdmFsdWUgaW50by4KKyAqLworc3RhdGljIHZvaWQKK3N5c3RlbV9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICB1OF90IGlkOworCisgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGlkIiwgKG9kLT5pZF9pbnN0X3B0clswXSA+PSAwKSAmJiAob2QtPmlkX2luc3RfcHRyWzBdIDw9IDB4ZmYpKTsKKyAgaWQgPSAodThfdClvZC0+aWRfaW5zdF9wdHJbMF07CisgIHN3aXRjaCAoaWQpCisgIHsKKyAgICBjYXNlIDE6IC8qIHN5c0Rlc2NyICovCisgICAgICBvY3N0cm5jcHkoKHU4X3QqKXZhbHVlLCBzeXNkZXNjcl9wdHIsIGxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIHN5c09iamVjdElEICovCisgICAgICBvYmplY3RpZG5jcHkoKHMzMl90Kil2YWx1ZSwgKHMzMl90KilzeXNvYmppZC5pZCwgKHU4X3QpKGxlbiAvIHNpemVvZihzMzJfdCkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyogc3lzVXBUaW1lICovCisgICAgICB7CisgICAgICAgIHNubXBfZ2V0X3N5c3VwdGltZSgodTMyX3QqKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDogLyogc3lzQ29udGFjdCAqLworICAgICAgb2NzdHJuY3B5KCh1OF90Kil2YWx1ZSwgc3lzY29udGFjdF9wdHIsIGxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6IC8qIHN5c05hbWUgKi8KKyAgICAgIG9jc3RybmNweSgodThfdCopdmFsdWUsIHN5c25hbWVfcHRyLCBsZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAvKiBzeXNMb2NhdGlvbiAqLworICAgICAgb2NzdHJuY3B5KCh1OF90Kil2YWx1ZSwgc3lzbG9jYXRpb25fcHRyLCBsZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OiAvKiBzeXNTZXJ2aWNlcyAqLworICAgICAgeworICAgICAgICBzMzJfdCAqc2ludF9wdHIgPSAoczMyX3QqKXZhbHVlOworICAgICAgICAqc2ludF9wdHIgPSBzeXNzZXJ2aWNlczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9OworfQorCitzdGF0aWMgdThfdAorc3lzdGVtX3NldF90ZXN0KHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSkKK3sKKyAgdThfdCBpZCwgc2V0X29rOworCisgIExXSVBfVU5VU0VEX0FSRyh2YWx1ZSk7CisgIHNldF9vayA9IDA7CisgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGlkIiwgKG9kLT5pZF9pbnN0X3B0clswXSA+PSAwKSAmJiAob2QtPmlkX2luc3RfcHRyWzBdIDw9IDB4ZmYpKTsKKyAgaWQgPSAodThfdClvZC0+aWRfaW5zdF9wdHJbMF07CisgIHN3aXRjaCAoaWQpCisgIHsKKyAgICBjYXNlIDQ6IC8qIHN5c0NvbnRhY3QgKi8KKyAgICAgIGlmICgoc3lzY29udGFjdF9wdHIgIT0gc3lzY29udGFjdF9kZWZhdWx0KSAmJgorICAgICAgICAgIChsZW4gPD0gMjU1KSkKKyAgICAgIHsKKyAgICAgICAgc2V0X29rID0gMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTogLyogc3lzTmFtZSAqLworICAgICAgaWYgKChzeXNuYW1lX3B0ciAhPSBzeXNuYW1lX2RlZmF1bHQpICYmCisgICAgICAgICAgKGxlbiA8PSAyNTUpKQorICAgICAgeworICAgICAgICBzZXRfb2sgPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAvKiBzeXNMb2NhdGlvbiAqLworICAgICAgaWYgKChzeXNsb2NhdGlvbl9wdHIgIT0gc3lzbG9jYXRpb25fZGVmYXVsdCkgJiYKKyAgICAgICAgICAobGVuIDw9IDI1NSkpCisgICAgICB7CisgICAgICAgIHNldF9vayA9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfTsKKyAgcmV0dXJuIHNldF9vazsKK30KKworc3RhdGljIHZvaWQKK3N5c3RlbV9zZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICB1OF90IGlkOworCisgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGxlbiIsIGxlbiA8PSAweGZmKTsKKyAgTFdJUF9BU1NFUlQoImludmFsaWQgaWQiLCAob2QtPmlkX2luc3RfcHRyWzBdID49IDApICYmIChvZC0+aWRfaW5zdF9wdHJbMF0gPD0gMHhmZikpOworICBpZCA9ICh1OF90KW9kLT5pZF9pbnN0X3B0clswXTsKKyAgc3dpdGNoIChpZCkKKyAgeworICAgIGNhc2UgNDogLyogc3lzQ29udGFjdCAqLworICAgICAgb2NzdHJuY3B5KHN5c2NvbnRhY3RfcHRyLCAodThfdCopdmFsdWUsIGxlbik7CisgICAgICAqc3lzY29udGFjdF9sZW5fcHRyID0gKHU4X3QpbGVuOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OiAvKiBzeXNOYW1lICovCisgICAgICBvY3N0cm5jcHkoc3lzbmFtZV9wdHIsICh1OF90Kil2YWx1ZSwgbGVuKTsKKyAgICAgICpzeXNuYW1lX2xlbl9wdHIgPSAodThfdClsZW47CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6IC8qIHN5c0xvY2F0aW9uICovCisgICAgICBvY3N0cm5jcHkoc3lzbG9jYXRpb25fcHRyLCAodThfdCopdmFsdWUsIGxlbik7CisgICAgICAqc3lzbG9jYXRpb25fbGVuX3B0ciA9ICh1OF90KWxlbjsKKyAgICAgIGJyZWFrOworICB9OworfQorCisvKioKKyAqIFJldHVybnMgaW50ZXJmYWNlcy5pZm51bWJlciBvYmplY3QgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gaWRlbnRfbGVuIHRoZSBhZGRyZXNzIGxlbmd0aCAoMikKKyAqIEBwYXJhbSBpZGVudCBwb2ludHMgdG8gb2JqZWN0bmFtZS5pbmRleAorICogQHBhcmFtIG9kIHBvaW50cyB0byBvYmplY3QgZGVmaW5pdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2ludGVyZmFjZXNfZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKQoreworICAvKiByZXR1cm4gdG8gb2JqZWN0IG5hbWUsIGFkZGluZyBpbmRleCBkZXB0aCAoMSkgKi8KKyAgaWRlbnRfbGVuICs9IDE7CisgIGlkZW50IC09IDE7CisgIGlmIChpZGVudF9sZW4gPT0gMikKKyAgeworICAgIG9kLT5pZF9pbnN0X2xlbiA9IGlkZW50X2xlbjsKKyAgICBvZC0+aWRfaW5zdF9wdHIgPSBpZGVudDsKKworICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfU0NBTEFSOworICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKTsKKyAgICBvZC0+dl9sZW4gPSBzaXplb2YoczMyX3QpOworICB9CisgIGVsc2UKKyAgeworICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiaW50ZXJmYWNlc19nZXRfb2JqZWN0X2RlZjogbm8gc2NhbGFyXG4iKSk7CisgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBpbnRlcmZhY2VzLmlmbnVtYmVyIG9iamVjdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gaWRlbnRfbGVuIHRoZSBhZGRyZXNzIGxlbmd0aCAoMikKKyAqIEBwYXJhbSBpZGVudCBwb2ludHMgdG8gb2JqZWN0bmFtZS4wIChvYmplY3QgaWQgdHJhaWxlcikKKyAqIEBwYXJhbSBsZW4gcmV0dXJuIHZhbHVlIHNwYWNlIChpbiBieXRlcykKKyAqIEBwYXJhbSB2YWx1ZSBwb2ludHMgdG8gKHZhcmJpbmQpIHNwYWNlIHRvIGNvcHkgdmFsdWUgaW50by4KKyAqLworc3RhdGljIHZvaWQKK2ludGVyZmFjZXNfZ2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSkKK3sKKyAgTFdJUF9VTlVTRURfQVJHKGxlbik7CisgIGlmIChvZC0+aWRfaW5zdF9wdHJbMF0gPT0gMSkKKyAgeworICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisgICAgKnNpbnRfcHRyID0gaWZsaXN0X3Jvb3QuY291bnQ7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGlmZW50cnkgb2JqZWN0IGRlZmluaXRpb25zLgorICoKKyAqIEBwYXJhbSBpZGVudF9sZW4gdGhlIGFkZHJlc3MgbGVuZ3RoICgyKQorICogQHBhcmFtIGlkZW50IHBvaW50cyB0byBvYmplY3RuYW1lLmluZGV4CisgKiBAcGFyYW0gb2QgcG9pbnRzIHRvIG9iamVjdCBkZWZpbml0aW9uLgorICovCitzdGF0aWMgdm9pZAoraWZlbnRyeV9nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpCit7CisgIHU4X3QgaWQ7CisKKyAgLyogcmV0dXJuIHRvIG9iamVjdCBuYW1lLCBhZGRpbmcgaW5kZXggZGVwdGggKDEpICovCisgIGlkZW50X2xlbiArPSAxOworICBpZGVudCAtPSAxOworICBpZiAoaWRlbnRfbGVuID09IDIpCisgIHsKKyAgICBvZC0+aWRfaW5zdF9sZW4gPSBpZGVudF9sZW47CisgICAgb2QtPmlkX2luc3RfcHRyID0gaWRlbnQ7CisKKyAgICBMV0lQX0FTU0VSVCgiaW52YWxpZCBpZCIsIChpZGVudFswXSA+PSAwKSAmJiAoaWRlbnRbMF0gPD0gMHhmZikpOworICAgIGlkID0gKHU4X3QpaWRlbnRbMF07CisgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJnZXRfb2JqZWN0X2RlZiBpZmVudHJ5LiUiVTE2X0YiXG4iLCh1MTZfdClpZCkpOworICAgIHN3aXRjaCAoaWQpCisgICAgeworICAgICAgY2FzZSAxOiAvKiBpZkluZGV4ICovCisgICAgICBjYXNlIDM6IC8qIGlmVHlwZSAqLworICAgICAgY2FzZSA0OiAvKiBpZk10dSAqLworICAgICAgY2FzZSA4OiAvKiBpZk9wZXJTdGF0dXMgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9UQUI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAvKiBpZkRlc2NyICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfVEFCOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX09OTFk7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfT0NfU1RSKTsKKyAgICAgICAgLyoqIEB0b2RvIHRoaXMgc2hvdWxkIGJlIHNvbWUgc29ydCBvZiBzaXplb2Yoc3RydWN0IG5ldGlmLm5hbWUpICovCisgICAgICAgIG9kLT52X2xlbiA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OiAvKiBpZlNwZWVkICovCisgICAgICBjYXNlIDIxOiAvKiBpZk91dFFMZW4gKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9UQUI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0dBVUdFKTsKKyAgICAgICAgb2QtPnZfbGVuID0gc2l6ZW9mKHUzMl90KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDY6IC8qIGlmUGh5c0FkZHJlc3MgKi8KKyAgICAgICAgeworICAgICAgICAgIHN0cnVjdCBuZXRpZiAqbmV0aWY7CisKKyAgICAgICAgICBzbm1wX2lmaW5kZXh0b25ldGlmKGlkZW50WzFdLCAmbmV0aWYpOworICAgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfVEFCOworICAgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09DX1NUUik7CisgICAgICAgICAgb2QtPnZfbGVuID0gbmV0aWYtPmh3YWRkcl9sZW47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDc6IC8qIGlmQWRtaW5TdGF0dXMgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9UQUI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfV1JJVEU7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSU5URUcpOworICAgICAgICBvZC0+dl9sZW4gPSBzaXplb2YoczMyX3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOTogLyogaWZMYXN0Q2hhbmdlICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfVEFCOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX09OTFk7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9USU1FVElDS1MpOworICAgICAgICBvZC0+dl9sZW4gPSBzaXplb2YodTMyX3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA6IC8qIGlmSW5PY3RldHMgKi8KKyAgICAgIGNhc2UgMTE6IC8qIGlmSW5VY2FzdFBrdHMgKi8KKyAgICAgIGNhc2UgMTI6IC8qIGlmSW5OVWNhc3RQa3RzICovCisgICAgICBjYXNlIDEzOiAvKiBpZkluRGlzY2FydHMgKi8KKyAgICAgIGNhc2UgMTQ6IC8qIGlmSW5FcnJvcnMgKi8KKyAgICAgIGNhc2UgMTU6IC8qIGlmSW5Vbmtvd25Qcm90b3MgKi8KKyAgICAgIGNhc2UgMTY6IC8qIGlmT3V0T2N0ZXRzICovCisgICAgICBjYXNlIDE3OiAvKiBpZk91dFVjYXN0UGt0cyAqLworICAgICAgY2FzZSAxODogLyogaWZPdXROVWNhc3RQa3RzICovCisgICAgICBjYXNlIDE5OiAvKiBpZk91dERpc2NhcnRzICovCisgICAgICBjYXNlIDIwOiAvKiBpZk91dEVycm9ycyAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1RBQjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9PTkxZOworICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX0FQUExJQyB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfQ09VTlRFUik7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZih1MzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMjogLyogaWZTcGVjaWZpYyAqLworICAgICAgICAvKiogQG5vdGUgcmV0dXJuaW5nIHplcm9Eb3RaZXJvICgwLjApIG5vIG1lZGlhIHNwZWNpZmljIE1JQiBzdXBwb3J0ICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfVEFCOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX09OTFk7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfT0JKX0lEKTsKKyAgICAgICAgb2QtPnZfbGVuID0gaWZzcGVjaWZpYy5sZW4gKiBzaXplb2YoczMyX3QpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiaWZlbnRyeV9nZXRfb2JqZWN0X2RlZjogbm8gc3VjaCBvYmplY3RcbiIpKTsKKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICAgICAgICBicmVhazsKKyAgICB9OworICB9CisgIGVsc2UKKyAgeworICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiaWZlbnRyeV9nZXRfb2JqZWN0X2RlZjogbm8gc2NhbGFyXG4iKSk7CisgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBpZmVudHJ5IG9iamVjdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gaWRlbnRfbGVuIHRoZSBhZGRyZXNzIGxlbmd0aCAoMikKKyAqIEBwYXJhbSBpZGVudCBwb2ludHMgdG8gb2JqZWN0bmFtZS4wIChvYmplY3QgaWQgdHJhaWxlcikKKyAqIEBwYXJhbSBsZW4gcmV0dXJuIHZhbHVlIHNwYWNlIChpbiBieXRlcykKKyAqIEBwYXJhbSB2YWx1ZSBwb2ludHMgdG8gKHZhcmJpbmQpIHNwYWNlIHRvIGNvcHkgdmFsdWUgaW50by4KKyAqLworc3RhdGljIHZvaWQKK2lmZW50cnlfZ2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSkKK3sKKyAgc3RydWN0IG5ldGlmICpuZXRpZjsKKyAgdThfdCBpZDsKKworICBzbm1wX2lmaW5kZXh0b25ldGlmKG9kLT5pZF9pbnN0X3B0clsxXSwgJm5ldGlmKTsKKyAgTFdJUF9BU1NFUlQoImludmFsaWQgaWQiLCAob2QtPmlkX2luc3RfcHRyWzBdID49IDApICYmIChvZC0+aWRfaW5zdF9wdHJbMF0gPD0gMHhmZikpOworICBpZCA9ICh1OF90KW9kLT5pZF9pbnN0X3B0clswXTsKKyAgc3dpdGNoIChpZCkKKyAgeworICAgIGNhc2UgMTogLyogaWZJbmRleCAqLworICAgICAgeworICAgICAgICBzMzJfdCAqc2ludF9wdHIgPSAoczMyX3QqKXZhbHVlOworICAgICAgICAqc2ludF9wdHIgPSBvZC0+aWRfaW5zdF9wdHJbMV07CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIGlmRGVzY3IgKi8KKyAgICAgIG9jc3RybmNweSgodThfdCopdmFsdWUsICh1OF90KiluZXRpZi0+bmFtZSwgbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyogaWZUeXBlICovCisgICAgICB7CisgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisgICAgICAgICpzaW50X3B0ciA9IG5ldGlmLT5saW5rX3R5cGU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6IC8qIGlmTXR1ICovCisgICAgICB7CisgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisgICAgICAgICpzaW50X3B0ciA9IG5ldGlmLT5tdHU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6IC8qIGlmU3BlZWQgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gbmV0aWYtPmxpbmtfc3BlZWQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6IC8qIGlmUGh5c0FkZHJlc3MgKi8KKyAgICAgIG9jc3RybmNweSgodThfdCopdmFsdWUsIG5ldGlmLT5od2FkZHIsIGxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6IC8qIGlmQWRtaW5TdGF0dXMgKi8KKyAgICAgIHsKKyAgICAgICAgczMyX3QgKnNpbnRfcHRyID0gKHMzMl90Kil2YWx1ZTsKKyAgICAgICAgaWYgKG5ldGlmX2lzX3VwKG5ldGlmKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChuZXRpZl9pc19saW5rX3VwKG5ldGlmKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAqc2ludF9wdHIgPSAxOyAvKiB1cCAqLworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgKnNpbnRfcHRyID0gNzsgLyogbG93ZXJMYXllckRvd24gKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKnNpbnRfcHRyID0gMjsgLyogZG93biAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6IC8qIGlmT3BlclN0YXR1cyAqLworICAgICAgeworICAgICAgICBzMzJfdCAqc2ludF9wdHIgPSAoczMyX3QqKXZhbHVlOworICAgICAgICBpZiAobmV0aWZfaXNfdXAobmV0aWYpKQorICAgICAgICB7CisgICAgICAgICAgKnNpbnRfcHRyID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAqc2ludF9wdHIgPSAyOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDk6IC8qIGlmTGFzdENoYW5nZSAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSBuZXRpZi0+dHM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOiAvKiBpZkluT2N0ZXRzICovCisgICAgICB7CisgICAgICAgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgICAgICAgICp1aW50X3B0ciA9IG5ldGlmLT5pZmlub2N0ZXRzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTogLyogaWZJblVjYXN0UGt0cyAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSBuZXRpZi0+aWZpbnVjYXN0cGt0czsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6IC8qIGlmSW5OVWNhc3RQa3RzICovCisgICAgICB7CisgICAgICAgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgICAgICAgICp1aW50X3B0ciA9IG5ldGlmLT5pZmlubnVjYXN0cGt0czsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6IC8qIGlmSW5EaXNjYXJ0cyAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSBuZXRpZi0+aWZpbmRpc2NhcmRzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxNDogLyogaWZJbkVycm9ycyAqLworICAgIGNhc2UgMTU6IC8qIGlmSW5Vbmtvd25Qcm90b3MgKi8KKyAgICAgIC8qKiBAdG9kbyBhZGQgdGhlc2UgY291bnRlcnMhICovCisgICAgICB7CisgICAgICAgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgICAgICAgICp1aW50X3B0ciA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OiAvKiBpZk91dE9jdGV0cyAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSBuZXRpZi0+aWZvdXRvY3RldHM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDE3OiAvKiBpZk91dFVjYXN0UGt0cyAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSBuZXRpZi0+aWZvdXR1Y2FzdHBrdHM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4OiAvKiBpZk91dE5VY2FzdFBrdHMgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gbmV0aWYtPmlmb3V0bnVjYXN0cGt0czsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTk6IC8qIGlmT3V0RGlzY2FydHMgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gbmV0aWYtPmlmb3V0ZGlzY2FyZHM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDIwOiAvKiBpZk91dEVycm9ycyAqLworICAgICAgIC8qKiBAdG9kbyBhZGQgdGhpcyBjb3VudGVyISAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyMTogLyogaWZPdXRRTGVuICovCisgICAgICAvKiogQHRvZG8gZmlndXJlIG91dCBpZiB0aGlzIG11c3QgYmUgMCAobm8gcXVldWUpIG9yIDE/ICovCisgICAgICB7CisgICAgICAgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgICAgICAgICp1aW50X3B0ciA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDIyOiAvKiBpZlNwZWNpZmljICovCisgICAgICBvYmplY3RpZG5jcHkoKHMzMl90Kil2YWx1ZSwgKHMzMl90KilpZnNwZWNpZmljLmlkLCAodThfdCkobGVuIC8gc2l6ZW9mKHMzMl90KSkpOworICAgICAgYnJlYWs7CisgIH07Cit9CisKKyNpZiAhU05NUF9TQUZFX1JFUVVFU1RTCitzdGF0aWMgdThfdAoraWZlbnRyeV9zZXRfdGVzdChzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpCit7CisgIHN0cnVjdCBuZXRpZiAqbmV0aWY7CisgIHU4X3QgaWQsIHNldF9vazsKKyAgTFdJUF9VTlVTRURfQVJHKGxlbik7CisKKyAgc2V0X29rID0gMDsKKyAgc25tcF9pZmluZGV4dG9uZXRpZihvZC0+aWRfaW5zdF9wdHJbMV0sICZuZXRpZik7CisgIGlkID0gKHU4X3Qpb2QtPmlkX2luc3RfcHRyWzBdOworICBzd2l0Y2ggKGlkKQorICB7CisgICAgY2FzZSA3OiAvKiBpZkFkbWluU3RhdHVzICovCisgICAgICB7CisgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisgICAgICAgIGlmICgqc2ludF9wdHIgPT0gMSB8fCAqc2ludF9wdHIgPT0gMikKKyAgICAgICAgICBzZXRfb2sgPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHNldF9vazsKK30KKworc3RhdGljIHZvaWQKK2lmZW50cnlfc2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSkKK3sKKyAgc3RydWN0IG5ldGlmICpuZXRpZjsKKyAgdThfdCBpZDsKKyAgTFdJUF9VTlVTRURfQVJHKGxlbik7CisKKyAgc25tcF9pZmluZGV4dG9uZXRpZihvZC0+aWRfaW5zdF9wdHJbMV0sICZuZXRpZik7CisgIGlkID0gKHU4X3Qpb2QtPmlkX2luc3RfcHRyWzBdOworICBzd2l0Y2ggKGlkKQorICB7CisgICAgY2FzZSA3OiAvKiBpZkFkbWluU3RhdHVzICovCisgICAgICB7CisgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisgICAgICAgIGlmICgqc2ludF9wdHIgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgIG5ldGlmX3NldF91cChuZXRpZik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKnNpbnRfcHRyID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICBuZXRpZl9zZXRfZG93bihuZXRpZik7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorI2VuZGlmIC8qIFNOTVBfU0FGRV9SRVFVRVNUUyAqLworCisvKioKKyAqIFJldHVybnMgYXRlbnRyeSBvYmplY3QgZGVmaW5pdGlvbnMuCisgKgorICogQHBhcmFtIGlkZW50X2xlbiB0aGUgYWRkcmVzcyBsZW5ndGggKDYpCisgKiBAcGFyYW0gaWRlbnQgcG9pbnRzIHRvIG9iamVjdG5hbWUuYXRpZmluZGV4LmF0bmV0YWRkcmVzcworICogQHBhcmFtIG9kIHBvaW50cyB0byBvYmplY3QgZGVmaW5pdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2F0ZW50cnlfZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKQoreworICAvKiByZXR1cm4gdG8gb2JqZWN0IG5hbWUsIGFkZGluZyBpbmRleCBkZXB0aCAoNSkgKi8KKyAgaWRlbnRfbGVuICs9IDU7CisgIGlkZW50IC09IDU7CisKKyAgaWYgKGlkZW50X2xlbiA9PSA2KQorICB7CisgICAgb2QtPmlkX2luc3RfbGVuID0gaWRlbnRfbGVuOworICAgIG9kLT5pZF9pbnN0X3B0ciA9IGlkZW50OworCisgICAgc3dpdGNoIChpZGVudFswXSkKKyAgICB7CisgICAgICBjYXNlIDE6IC8qIGF0SWZJbmRleCAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1RBQjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9XUklURTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAvKiBhdFBoeXNBZGRyZXNzICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfVEFCOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX1dSSVRFOworICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09DX1NUUik7CisgICAgICAgIG9kLT52X2xlbiA9IDY7IC8qKiBAdG9kbyB0cnkgdG8gdXNlIG5ldGlmOjpod2FkZHJfbGVuICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiBhdE5ldEFkZHJlc3MgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9UQUI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfV1JJVEU7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JUEFERFIpOworICAgICAgICBvZC0+dl9sZW4gPSA0OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiYXRlbnRyeV9nZXRfb2JqZWN0X2RlZjogbm8gc3VjaCBvYmplY3RcbiIpKTsKKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJhdGVudHJ5X2dldF9vYmplY3RfZGVmOiBubyBzY2FsYXJcbiIpKTsKKyAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX05PTkU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2F0ZW50cnlfZ2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSkKK3sKKyNpZiBMV0lQX0FSUAorICB1OF90IGlkOworICBzdHJ1Y3QgZXRoX2FkZHIqIGV0aGFkZHJfcmV0OworICBpcF9hZGRyX3QqIGlwYWRkcl9yZXQ7CisjZW5kaWYgLyogTFdJUF9BUlAgKi8KKyAgaXBfYWRkcl90IGlwOworICBzdHJ1Y3QgbmV0aWYgKm5ldGlmOworCisgIExXSVBfVU5VU0VEX0FSRyhsZW4pOworICBMV0lQX1VOVVNFRF9BUkcodmFsdWUpOy8qIGlmICFMV0lQX0FSUCAqLworCisgIHNubXBfaWZpbmRleHRvbmV0aWYob2QtPmlkX2luc3RfcHRyWzFdLCAmbmV0aWYpOworICBzbm1wX29pZHRvaXAoJm9kLT5pZF9pbnN0X3B0clsyXSwgJmlwKTsKKworI2lmIExXSVBfQVJQIC8qKiBAdG9kbyBpbXBsZW1lbnQgYSBuZXRpZl9maW5kX2FkZHIgKi8KKyAgaWYgKGV0aGFycF9maW5kX2FkZHIobmV0aWYsICZpcCwgJmV0aGFkZHJfcmV0LCAmaXBhZGRyX3JldCkgPiAtMSkKKyAgeworICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGlkIiwgKG9kLT5pZF9pbnN0X3B0clswXSA+PSAwKSAmJiAob2QtPmlkX2luc3RfcHRyWzBdIDw9IDB4ZmYpKTsKKyAgICBpZCA9ICh1OF90KW9kLT5pZF9pbnN0X3B0clswXTsKKyAgICBzd2l0Y2ggKGlkKQorICAgIHsKKyAgICAgIGNhc2UgMTogLyogYXRJZkluZGV4ICovCisgICAgICAgIHsKKyAgICAgICAgICBzMzJfdCAqc2ludF9wdHIgPSAoczMyX3QqKXZhbHVlOworICAgICAgICAgICpzaW50X3B0ciA9IG9kLT5pZF9pbnN0X3B0clsxXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjogLyogYXRQaHlzQWRkcmVzcyAqLworICAgICAgICB7CisgICAgICAgICAgc3RydWN0IGV0aF9hZGRyICpkc3QgPSAoc3RydWN0IGV0aF9hZGRyKil2YWx1ZTsKKworICAgICAgICAgICpkc3QgPSAqZXRoYWRkcl9yZXQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6IC8qIGF0TmV0QWRkcmVzcyAqLworICAgICAgICB7CisgICAgICAgICAgaXBfYWRkcl90ICpkc3QgPSAoaXBfYWRkcl90Kil2YWx1ZTsKKworICAgICAgICAgICpkc3QgPSAqaXBhZGRyX3JldDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBMV0lQX0FSUCAqLworfQorCitzdGF0aWMgdm9pZAoraXBfZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKQoreworICB1OF90IGlkOworCisgIC8qIHJldHVybiB0byBvYmplY3QgbmFtZSwgYWRkaW5nIGluZGV4IGRlcHRoICgxKSAqLworICBpZGVudF9sZW4gKz0gMTsKKyAgaWRlbnQgLT0gMTsKKyAgaWYgKGlkZW50X2xlbiA9PSAyKQorICB7CisgICAgb2QtPmlkX2luc3RfbGVuID0gaWRlbnRfbGVuOworICAgIG9kLT5pZF9pbnN0X3B0ciA9IGlkZW50OworCisgICAgTFdJUF9BU1NFUlQoImludmFsaWQgaWQiLCAoaWRlbnRbMF0gPj0gMCkgJiYgKGlkZW50WzBdIDw9IDB4ZmYpKTsKKyAgICBpZCA9ICh1OF90KWlkZW50WzBdOworICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiZ2V0X29iamVjdF9kZWYgaXAuJSJVMTZfRiIuMFxuIiwodTE2X3QpaWQpKTsKKyAgICBzd2l0Y2ggKGlkKQorICAgIHsKKyAgICAgIGNhc2UgMTogLyogaXBGb3J3YXJkaW5nICovCisgICAgICBjYXNlIDI6IC8qIGlwRGVmYXVsdFRUTCAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1NDQUxBUjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9XUklURTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiBpcEluUmVjZWl2ZXMgKi8KKyAgICAgIGNhc2UgNDogLyogaXBJbkhkckVycm9ycyAqLworICAgICAgY2FzZSA1OiAvKiBpcEluQWRkckVycm9ycyAqLworICAgICAgY2FzZSA2OiAvKiBpcEZvcndEYXRhZ3JhbXMgKi8KKyAgICAgIGNhc2UgNzogLyogaXBJblVua25vd25Qcm90b3MgKi8KKyAgICAgIGNhc2UgODogLyogaXBJbkRpc2NhcmRzICovCisgICAgICBjYXNlIDk6IC8qIGlwSW5EZWxpdmVycyAqLworICAgICAgY2FzZSAxMDogLyogaXBPdXRSZXF1ZXN0cyAqLworICAgICAgY2FzZSAxMTogLyogaXBPdXREaXNjYXJkcyAqLworICAgICAgY2FzZSAxMjogLyogaXBPdXROb1JvdXRlcyAqLworICAgICAgY2FzZSAxNDogLyogaXBSZWFzbVJlcWRzICovCisgICAgICBjYXNlIDE1OiAvKiBpcFJlYXNtT0tzICovCisgICAgICBjYXNlIDE2OiAvKiBpcFJlYXNtRmFpbHMgKi8KKyAgICAgIGNhc2UgMTc6IC8qIGlwRnJhZ09LcyAqLworICAgICAgY2FzZSAxODogLyogaXBGcmFnRmFpbHMgKi8KKyAgICAgIGNhc2UgMTk6IC8qIGlwRnJhZ0NyZWF0ZXMgKi8KKyAgICAgIGNhc2UgMjM6IC8qIGlwUm91dGluZ0Rpc2NhcmRzICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfU0NBTEFSOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX09OTFk7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9DT1VOVEVSKTsKKyAgICAgICAgb2QtPnZfbGVuID0gc2l6ZW9mKHUzMl90KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEzOiAvKiBpcFJlYXNtVGltZW91dCAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1NDQUxBUjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9PTkxZOworICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKTsKKyAgICAgICAgb2QtPnZfbGVuID0gc2l6ZW9mKHMzMl90KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImlwX2dldF9vYmplY3RfZGVmOiBubyBzdWNoIG9iamVjdFxuIikpOworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX05PTkU7CisgICAgICAgIGJyZWFrOworICAgIH07CisgIH0KKyAgZWxzZQorICB7CisgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJpcF9nZXRfb2JqZWN0X2RlZjogbm8gc2NhbGFyXG4iKSk7CisgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpcF9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICB1OF90IGlkOworCisgIExXSVBfVU5VU0VEX0FSRyhsZW4pOworICBMV0lQX0FTU0VSVCgiaW52YWxpZCBpZCIsIChvZC0+aWRfaW5zdF9wdHJbMF0gPj0gMCkgJiYgKG9kLT5pZF9pbnN0X3B0clswXSA8PSAweGZmKSk7CisgIGlkID0gKHU4X3Qpb2QtPmlkX2luc3RfcHRyWzBdOworICBzd2l0Y2ggKGlkKQorICB7CisgICAgY2FzZSAxOiAvKiBpcEZvcndhcmRpbmcgKi8KKyAgICAgIHsKKyAgICAgICAgczMyX3QgKnNpbnRfcHRyID0gKHMzMl90Kil2YWx1ZTsKKyNpZiBJUF9GT1JXQVJECisgICAgICAgIC8qIGZvcndhcmRpbmcgKi8KKyAgICAgICAgKnNpbnRfcHRyID0gMTsKKyNlbHNlCisgICAgICAgIC8qIG5vdC1mb3J3YXJkaW5nICovCisgICAgICAgICpzaW50X3B0ciA9IDI7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjogLyogaXBEZWZhdWx0VFRMICovCisgICAgICB7CisgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisgICAgICAgICpzaW50X3B0ciA9IElQX0RFRkFVTFRfVFRMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAvKiBpcEluUmVjZWl2ZXMgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gaXBpbnJlY2VpdmVzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAvKiBpcEluSGRyRXJyb3JzICovCisgICAgICB7CisgICAgICAgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgICAgICAgICp1aW50X3B0ciA9IGlwaW5oZHJlcnJvcnM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6IC8qIGlwSW5BZGRyRXJyb3JzICovCisgICAgICB7CisgICAgICAgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgICAgICAgICp1aW50X3B0ciA9IGlwaW5hZGRyZXJyb3JzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAvKiBpcEZvcndEYXRhZ3JhbXMgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gaXBmb3J3ZGF0YWdyYW1zOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA3OiAvKiBpcEluVW5rbm93blByb3RvcyAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSBpcGludW5rbm93bnByb3RvczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgODogLyogaXBJbkRpc2NhcmRzICovCisgICAgICB7CisgICAgICAgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgICAgICAgICp1aW50X3B0ciA9IGlwaW5kaXNjYXJkczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTogLyogaXBJbkRlbGl2ZXJzICovCisgICAgICB7CisgICAgICAgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgICAgICAgICp1aW50X3B0ciA9IGlwaW5kZWxpdmVyczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6IC8qIGlwT3V0UmVxdWVzdHMgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gaXBvdXRyZXF1ZXN0czsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6IC8qIGlwT3V0RGlzY2FyZHMgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gaXBvdXRkaXNjYXJkczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6IC8qIGlwT3V0Tm9Sb3V0ZXMgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gaXBvdXRub3JvdXRlczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6IC8qIGlwUmVhc21UaW1lb3V0ICovCisgICAgICB7CisgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisjaWYgSVBfUkVBU1NFTUJMWQorICAgICAgICAqc2ludF9wdHIgPSBJUF9SRUFTU19NQVhBR0U7CisjZWxzZQorICAgICAgICAqc2ludF9wdHIgPSAwOworI2VuZGlmCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDE0OiAvKiBpcFJlYXNtUmVxZHMgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gaXByZWFzbXJlcWRzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxNTogLyogaXBSZWFzbU9LcyAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSBpcHJlYXNtb2tzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjogLyogaXBSZWFzbUZhaWxzICovCisgICAgICB7CisgICAgICAgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgICAgICAgICp1aW50X3B0ciA9IGlwcmVhc21mYWlsczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTc6IC8qIGlwRnJhZ09LcyAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSBpcGZyYWdva3M7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4OiAvKiBpcEZyYWdGYWlscyAqLworICAgICAgeworICAgICAgICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICAgICAgICAqdWludF9wdHIgPSBpcGZyYWdmYWlsczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTk6IC8qIGlwRnJhZ0NyZWF0ZXMgKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gaXBmcmFnY3JlYXRlczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjM6IC8qIGlwUm91dGluZ0Rpc2NhcmRzICovCisgICAgICAvKiogQHRvZG8gY2FuIGx3SVAgZGlzY2FyZCByb3V0ZXMgYXQgYWxsPz8gaGFyZHdpcmUgdGhpcyB0byAwPz8gKi8KKyAgICAgIHsKKyAgICAgICAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgICAgICAgKnVpbnRfcHRyID0gaXByb3V0aW5nZGlzY2FyZHM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfTsKK30KKworLyoqCisgKiBUZXN0IGlwIG9iamVjdCB2YWx1ZSBiZWZvcmUgc2V0dGluZy4KKyAqCisgKiBAcGFyYW0gb2QgaXMgdGhlIG9iamVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gbGVuIHJldHVybiB2YWx1ZSBzcGFjZSAoaW4gYnl0ZXMpCisgKiBAcGFyYW0gdmFsdWUgcG9pbnRzIHRvICh2YXJiaW5kKSBzcGFjZSB0byBjb3B5IHZhbHVlIGZyb20uCisgKgorICogQG5vdGUgd2UgYWxsb3cgc2V0IGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBoYXJkd2lyZWQgdmFsdWUsCisgKiAgIG90aGVyd2lzZSByZXR1cm4gYmFkdmFsdWUuCisgKi8KK3N0YXRpYyB1OF90CitpcF9zZXRfdGVzdChzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpCit7CisgIHU4X3QgaWQsIHNldF9vazsKKyAgczMyX3QgKnNpbnRfcHRyID0gKHMzMl90Kil2YWx1ZTsKKworICBMV0lQX1VOVVNFRF9BUkcobGVuKTsKKyAgc2V0X29rID0gMDsKKyAgTFdJUF9BU1NFUlQoImludmFsaWQgaWQiLCAob2QtPmlkX2luc3RfcHRyWzBdID49IDApICYmIChvZC0+aWRfaW5zdF9wdHJbMF0gPD0gMHhmZikpOworICBpZCA9ICh1OF90KW9kLT5pZF9pbnN0X3B0clswXTsKKyAgc3dpdGNoIChpZCkKKyAgeworICAgIGNhc2UgMTogLyogaXBGb3J3YXJkaW5nICovCisjaWYgSVBfRk9SV0FSRAorICAgICAgLyogZm9yd2FyZGluZyAqLworICAgICAgaWYgKCpzaW50X3B0ciA9PSAxKQorI2Vsc2UKKyAgICAgIC8qIG5vdC1mb3J3YXJkaW5nICovCisgICAgICBpZiAoKnNpbnRfcHRyID09IDIpCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgc2V0X29rID0gMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjogLyogaXBEZWZhdWx0VFRMICovCisgICAgICBpZiAoKnNpbnRfcHRyID09IElQX0RFRkFVTFRfVFRMKQorICAgICAgeworICAgICAgICBzZXRfb2sgPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH07CisgIHJldHVybiBzZXRfb2s7Cit9CisKK3N0YXRpYyB2b2lkCitpcF9hZGRyZW50cnlfZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKQoreworICAvKiByZXR1cm4gdG8gb2JqZWN0IG5hbWUsIGFkZGluZyBpbmRleCBkZXB0aCAoNCkgKi8KKyAgaWRlbnRfbGVuICs9IDQ7CisgIGlkZW50IC09IDQ7CisKKyAgaWYgKGlkZW50X2xlbiA9PSA1KQorICB7CisgICAgdThfdCBpZDsKKworICAgIG9kLT5pZF9pbnN0X2xlbiA9IGlkZW50X2xlbjsKKyAgICBvZC0+aWRfaW5zdF9wdHIgPSBpZGVudDsKKworICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGlkIiwgKGlkZW50WzBdID49IDApICYmIChpZGVudFswXSA8PSAweGZmKSk7CisgICAgaWQgPSAodThfdClpZGVudFswXTsKKyAgICBzd2l0Y2ggKGlkKQorICAgIHsKKyAgICAgIGNhc2UgMTogLyogaXBBZEVudEFkZHIgKi8KKyAgICAgIGNhc2UgMzogLyogaXBBZEVudE5ldE1hc2sgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9UQUI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lQQUREUik7CisgICAgICAgIG9kLT52X2xlbiA9IDQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAvKiBpcEFkRW50SWZJbmRleCAqLworICAgICAgY2FzZSA0OiAvKiBpcEFkRW50QmNhc3RBZGRyICovCisgICAgICBjYXNlIDU6IC8qIGlwQWRFbnRSZWFzbU1heFNpemUgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9UQUI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJpcF9hZGRyZW50cnlfZ2V0X29iamVjdF9kZWY6IG5vIHN1Y2ggb2JqZWN0XG4iKSk7CisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfTk9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiaXBfYWRkcmVudHJ5X2dldF9vYmplY3RfZGVmOiBubyBzY2FsYXJcbiIpKTsKKyAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX05PTkU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2lwX2FkZHJlbnRyeV9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICB1OF90IGlkOworICB1MTZfdCBpZmlkeDsKKyAgaXBfYWRkcl90IGlwOworICBzdHJ1Y3QgbmV0aWYgKm5ldGlmID0gbmV0aWZfbGlzdDsKKworICBMV0lQX1VOVVNFRF9BUkcobGVuKTsKKyAgc25tcF9vaWR0b2lwKCZvZC0+aWRfaW5zdF9wdHJbMV0sICZpcCk7CisgIGlmaWR4ID0gMDsKKyAgd2hpbGUgKChuZXRpZiAhPSBOVUxMKSAmJiAhaXBfYWRkcl9jbXAoJmlwLCAmbmV0aWYtPmlwX2FkZHIpKQorICB7CisgICAgbmV0aWYgPSBuZXRpZi0+bmV4dDsKKyAgICBpZmlkeCsrOworICB9CisKKyAgaWYgKG5ldGlmICE9IE5VTEwpCisgIHsKKyAgICBMV0lQX0FTU0VSVCgiaW52YWxpZCBpZCIsIChvZC0+aWRfaW5zdF9wdHJbMF0gPj0gMCkgJiYgKG9kLT5pZF9pbnN0X3B0clswXSA8PSAweGZmKSk7CisgICAgaWQgPSAodThfdClvZC0+aWRfaW5zdF9wdHJbMF07CisgICAgc3dpdGNoIChpZCkKKyAgICB7CisgICAgICBjYXNlIDE6IC8qIGlwQWRFbnRBZGRyICovCisgICAgICAgIHsKKyAgICAgICAgICBpcF9hZGRyX3QgKmRzdCA9IChpcF9hZGRyX3QqKXZhbHVlOworICAgICAgICAgICpkc3QgPSBuZXRpZi0+aXBfYWRkcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjogLyogaXBBZEVudElmSW5kZXggKi8KKyAgICAgICAgeworICAgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisgICAgICAgICAgKnNpbnRfcHRyID0gaWZpZHggKyAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiBpcEFkRW50TmV0TWFzayAqLworICAgICAgICB7CisgICAgICAgICAgaXBfYWRkcl90ICpkc3QgPSAoaXBfYWRkcl90Kil2YWx1ZTsKKyAgICAgICAgICAqZHN0ID0gbmV0aWYtPm5ldG1hc2s7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6IC8qIGlwQWRFbnRCY2FzdEFkZHIgKi8KKyAgICAgICAgeworICAgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisKKyAgICAgICAgICAvKiBsd0lQIG9kZGl0eSwgdGhlcmUncyBubyBicm9hZGNhc3QKKyAgICAgICAgICAgIGFkZHJlc3MgaW4gdGhlIG5ldGlmIHdlIGNhbiByZWx5IG9uICovCisgICAgICAgICAgKnNpbnRfcHRyID0gSVBBRERSX0JST0FEQ0FTVCAmIDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6IC8qIGlwQWRFbnRSZWFzbU1heFNpemUgKi8KKyAgICAgICAgeworICAgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisjaWYgSVBfUkVBU1NFTUJMWQorICAgICAgICAgIC8qIEB0b2RvIFRoZSB0aGVvcmV0aWNhbCBtYXhpbXVtIGlzIElQX1JFQVNTX01BWF9QQlVGUyAqIHNpemUgb2YgdGhlIHBidWZzLAorICAgICAgICAgICAqIGJ1dCBvbmx5IGlmIHJlY2VpdmluZyBvbmUgZnJhZ21lbnRlZCBwYWNrZXQgYXQgYSB0aW1lLgorICAgICAgICAgICAqIFRoZSBjdXJyZW50IHNvbHV0aW9uIGlzIHRvIGNhbGN1bGF0ZSBmb3IgMiBzaW11bHRhbmVvdXMgcGFja2V0cy4uLgorICAgICAgICAgICAqLworICAgICAgICAgICpzaW50X3B0ciA9IChJUF9ITEVOICsgKChJUF9SRUFTU19NQVhfUEJVRlMvMikgKgorICAgICAgICAgICAgKFBCVUZfUE9PTF9CVUZTSVpFIC0gUEJVRl9MSU5LX0hMRU4gLSBJUF9ITEVOKSkpOworI2Vsc2UKKyAgICAgICAgICAvKiogQHRvZG8gcmV0dXJuaW5nIE1UVSB3b3VsZCBiZSBhIGJhZCB0aGluZyBhbmQKKyAgICAgICAgICAgICByZXR1cm5pbmcgYSB3aWxkIGd1ZXNzIGxpa2UgJzU3NicgaXNuJ3QgZ29vZCBlaXRoZXIgKi8KKyAgICAgICAgICAqc2ludF9wdHIgPSAwOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8qKgorICogQG5vdGUKKyAqIGx3SVAgSVAgcm91dGluZyBpcyBjdXJyZW50bHkgdXNpbmcgdGhlIG5ldHdvcmsgYWRkcmVzc2VzIGluIG5ldGlmX2xpc3QuCisgKiBpZiBubyBzdWl0YWJsZSBuZXR3b3JrIElQIGlzIGZvdW5kIGluIG5ldGlmX2xpc3QsIHRoZSBkZWZhdWx0X25ldGlmIGlzIHVzZWQuCisgKi8KK3N0YXRpYyB2b2lkCitpcF9ydGVlbnRyeV9nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpCit7CisgIHU4X3QgaWQ7CisKKyAgLyogcmV0dXJuIHRvIG9iamVjdCBuYW1lLCBhZGRpbmcgaW5kZXggZGVwdGggKDQpICovCisgIGlkZW50X2xlbiArPSA0OworICBpZGVudCAtPSA0OworCisgIGlmIChpZGVudF9sZW4gPT0gNSkKKyAgeworICAgIG9kLT5pZF9pbnN0X2xlbiA9IGlkZW50X2xlbjsKKyAgICBvZC0+aWRfaW5zdF9wdHIgPSBpZGVudDsKKworICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGlkIiwgKGlkZW50WzBdID49IDApICYmIChpZGVudFswXSA8PSAweGZmKSk7CisgICAgaWQgPSAodThfdClpZGVudFswXTsKKyAgICBzd2l0Y2ggKGlkKQorICAgIHsKKyAgICAgIGNhc2UgMTogLyogaXBSb3V0ZURlc3QgKi8KKyAgICAgIGNhc2UgNzogLyogaXBSb3V0ZU5leHRIb3AgKi8KKyAgICAgIGNhc2UgMTE6IC8qIGlwUm91dGVNYXNrICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfVEFCOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX1dSSVRFOworICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX0FQUExJQyB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSVBBRERSKTsKKyAgICAgICAgb2QtPnZfbGVuID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6IC8qIGlwUm91dGVJZkluZGV4ICovCisgICAgICBjYXNlIDM6IC8qIGlwUm91dGVNZXRyaWMxICovCisgICAgICBjYXNlIDQ6IC8qIGlwUm91dGVNZXRyaWMyICovCisgICAgICBjYXNlIDU6IC8qIGlwUm91dGVNZXRyaWMzICovCisgICAgICBjYXNlIDY6IC8qIGlwUm91dGVNZXRyaWM0ICovCisgICAgICBjYXNlIDg6IC8qIGlwUm91dGVUeXBlICovCisgICAgICBjYXNlIDEwOiAvKiBpcFJvdXRlQWdlICovCisgICAgICBjYXNlIDEyOiAvKiBpcFJvdXRlTWV0cmljNSAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1RBQjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9XUklURTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5OiAvKiBpcFJvdXRlUHJvdG8gKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9UQUI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMzogLyogaXBSb3V0ZUluZm8gKi8KKyAgICAgICAgLyoqIEBub3RlIHJldHVybmluZyB6ZXJvRG90WmVybyAoMC4wKSBubyByb3V0aW5nIHByb3RvY29sIHNwZWNpZmljIE1JQiAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1RBQjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9PTkxZOworICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09CSl9JRCk7CisgICAgICAgIG9kLT52X2xlbiA9IGlwcm91dGVpbmZvLmxlbiAqIHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJpcF9ydGVlbnRyeV9nZXRfb2JqZWN0X2RlZjogbm8gc3VjaCBvYmplY3RcbiIpKTsKKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJpcF9ydGVlbnRyeV9nZXRfb2JqZWN0X2RlZjogbm8gc2NhbGFyXG4iKSk7CisgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpcF9ydGVlbnRyeV9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICBzdHJ1Y3QgbmV0aWYgKm5ldGlmOworICBpcF9hZGRyX3QgZGVzdDsKKyAgczMyX3QgKmlkZW50OworICB1OF90IGlkOworCisgIGlkZW50ID0gb2QtPmlkX2luc3RfcHRyOworICBzbm1wX29pZHRvaXAoJmlkZW50WzFdLCAmZGVzdCk7CisKKyAgaWYgKGlwX2FkZHJfaXNhbnkoJmRlc3QpKQorICB7CisgICAgLyogaXBfcm91dGUoKSB1c2VzIGRlZmF1bHQgbmV0aWYgZm9yIGRlZmF1bHQgcm91dGUgKi8KKyAgICBuZXRpZiA9IG5ldGlmX2RlZmF1bHQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90IHVzaW5nIGlwX3JvdXRlKCksIG5lZWQgZXhhY3QgbWF0Y2ghICovCisgICAgbmV0aWYgPSBuZXRpZl9saXN0OworICAgIHdoaWxlICgobmV0aWYgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICFpcF9hZGRyX25ldGNtcCgmZGVzdCwgJihuZXRpZi0+aXBfYWRkciksICYobmV0aWYtPm5ldG1hc2spKSApCisgICAgeworICAgICAgbmV0aWYgPSBuZXRpZi0+bmV4dDsKKyAgICB9CisgIH0KKyAgaWYgKG5ldGlmICE9IE5VTEwpCisgIHsKKyAgICBMV0lQX0FTU0VSVCgiaW52YWxpZCBpZCIsIChpZGVudFswXSA+PSAwKSAmJiAoaWRlbnRbMF0gPD0gMHhmZikpOworICAgIGlkID0gKHU4X3QpaWRlbnRbMF07CisgICAgc3dpdGNoIChpZCkKKyAgICB7CisgICAgICBjYXNlIDE6IC8qIGlwUm91dGVEZXN0ICovCisgICAgICAgIHsKKyAgICAgICAgICBpcF9hZGRyX3QgKmRzdCA9IChpcF9hZGRyX3QqKXZhbHVlOworCisgICAgICAgICAgaWYgKGlwX2FkZHJfaXNhbnkoJmRlc3QpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRlZmF1bHQgcnRlIGhhcyAwLjAuMC4wIGRlc3QgKi8KKyAgICAgICAgICAgIGlwX2FkZHJfc2V0X3plcm8oZHN0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5ldGlmcyBoYXZlIG5ldGFkZHJlc3MgZGVzdCAqLworICAgICAgICAgICAgaXBfYWRkcl9nZXRfbmV0d29yayhkc3QsICZuZXRpZi0+aXBfYWRkciwgJm5ldGlmLT5uZXRtYXNrKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6IC8qIGlwUm91dGVJZkluZGV4ICovCisgICAgICAgIHsKKyAgICAgICAgICBzMzJfdCAqc2ludF9wdHIgPSAoczMyX3QqKXZhbHVlOworCisgICAgICAgICAgc25tcF9uZXRpZnRvaWZpbmRleChuZXRpZiwgc2ludF9wdHIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiBpcFJvdXRlTWV0cmljMSAqLworICAgICAgICB7CisgICAgICAgICAgczMyX3QgKnNpbnRfcHRyID0gKHMzMl90Kil2YWx1ZTsKKworICAgICAgICAgIGlmIChpcF9hZGRyX2lzYW55KCZkZXN0KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBkZWZhdWx0IHJ0ZSBoYXMgbWV0cmljIDEgKi8KKyAgICAgICAgICAgICpzaW50X3B0ciA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBvdGhlciBydGVzIGhhdmUgbWV0cmljIDAgKi8KKyAgICAgICAgICAgICpzaW50X3B0ciA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OiAvKiBpcFJvdXRlTWV0cmljMiAqLworICAgICAgY2FzZSA1OiAvKiBpcFJvdXRlTWV0cmljMyAqLworICAgICAgY2FzZSA2OiAvKiBpcFJvdXRlTWV0cmljNCAqLworICAgICAgY2FzZSAxMjogLyogaXBSb3V0ZU1ldHJpYzUgKi8KKyAgICAgICAgeworICAgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisgICAgICAgICAgLyogbm90IHVzZWQgKi8KKyAgICAgICAgICAqc2ludF9wdHIgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNzogLyogaXBSb3V0ZU5leHRIb3AgKi8KKyAgICAgICAgeworICAgICAgICAgIGlwX2FkZHJfdCAqZHN0ID0gKGlwX2FkZHJfdCopdmFsdWU7CisKKyAgICAgICAgICBpZiAoaXBfYWRkcl9pc2FueSgmZGVzdCkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogZGVmYXVsdCBydGU6IGdhdGV3YXkgKi8KKyAgICAgICAgICAgICpkc3QgPSBuZXRpZi0+Z3c7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBvdGhlciBydGVzOiBuZXRpZiBpcF9hZGRyICAqLworICAgICAgICAgICAgKmRzdCA9IG5ldGlmLT5pcF9hZGRyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgODogLyogaXBSb3V0ZVR5cGUgKi8KKyAgICAgICAgeworICAgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisKKyAgICAgICAgICBpZiAoaXBfYWRkcl9pc2FueSgmZGVzdCkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogZGVmYXVsdCBydGUgaXMgaW5kaXJlY3QgKi8KKyAgICAgICAgICAgICpzaW50X3B0ciA9IDQ7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBvdGhlciBydGVzIGFyZSBkaXJlY3QgKi8KKyAgICAgICAgICAgICpzaW50X3B0ciA9IDM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5OiAvKiBpcFJvdXRlUHJvdG8gKi8KKyAgICAgICAgeworICAgICAgICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisgICAgICAgICAgLyogbG9jYWxseSBkZWZpbmVkIHJvdXRlcyAqLworICAgICAgICAgICpzaW50X3B0ciA9IDI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwOiAvKiBpcFJvdXRlQWdlICovCisgICAgICAgIHsKKyAgICAgICAgICBzMzJfdCAqc2ludF9wdHIgPSAoczMyX3QqKXZhbHVlOworICAgICAgICAgIC8qKiBAdG9kbyAoc3lzdXB0aW1lIC0gdGltZXN0YW1wIGxhc3QgY2hhbmdlKSAvIDEwMAorICAgICAgICAgICAgICBAc2VlIHNubXBfaW5zZXJ0X2lwcnRlaWR4X3RyZWUoKSAqLworICAgICAgICAgICpzaW50X3B0ciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExOiAvKiBpcFJvdXRlTWFzayAqLworICAgICAgICB7CisgICAgICAgICAgaXBfYWRkcl90ICpkc3QgPSAoaXBfYWRkcl90Kil2YWx1ZTsKKworICAgICAgICAgIGlmIChpcF9hZGRyX2lzYW55KCZkZXN0KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBkZWZhdWx0IHJ0ZSB1c2UgMC4wLjAuMCBtYXNrICovCisgICAgICAgICAgICBpcF9hZGRyX3NldF96ZXJvKGRzdCk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBvdGhlciBydGVzIHVzZSBuZXRtYXNrICovCisgICAgICAgICAgICAqZHN0ID0gbmV0aWYtPm5ldG1hc2s7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMzogLyogaXBSb3V0ZUluZm8gKi8KKyAgICAgICAgb2JqZWN0aWRuY3B5KChzMzJfdCopdmFsdWUsIChzMzJfdCopaXByb3V0ZWluZm8uaWQsICh1OF90KShsZW4gLyBzaXplb2YoczMyX3QpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAoraXBfbnRvbWVudHJ5X2dldF9vYmplY3RfZGVmKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBvYmpfZGVmICpvZCkKK3sKKyAgLyogcmV0dXJuIHRvIG9iamVjdCBuYW1lLCBhZGRpbmcgaW5kZXggZGVwdGggKDUpICovCisgIGlkZW50X2xlbiArPSA1OworICBpZGVudCAtPSA1OworCisgIGlmIChpZGVudF9sZW4gPT0gNikKKyAgeworICAgIHU4X3QgaWQ7CisKKyAgICBvZC0+aWRfaW5zdF9sZW4gPSBpZGVudF9sZW47CisgICAgb2QtPmlkX2luc3RfcHRyID0gaWRlbnQ7CisKKyAgICBMV0lQX0FTU0VSVCgiaW52YWxpZCBpZCIsIChpZGVudFswXSA+PSAwKSAmJiAoaWRlbnRbMF0gPD0gMHhmZikpOworICAgIGlkID0gKHU4X3QpaWRlbnRbMF07CisgICAgc3dpdGNoIChpZCkKKyAgICB7CisgICAgICBjYXNlIDE6IC8qIGlwTmV0VG9NZWRpYUlmSW5kZXggKi8KKyAgICAgIGNhc2UgNDogLyogaXBOZXRUb01lZGlhVHlwZSAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1RBQjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9XUklURTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAvKiBpcE5ldFRvTWVkaWFQaHlzQWRkcmVzcyAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1RBQjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9XUklURTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9PQ19TVFIpOworICAgICAgICBvZC0+dl9sZW4gPSA2OyAvKiogQHRvZG8gdHJ5IHRvIHVzZSBuZXRpZjo6aHdhZGRyX2xlbiAqLworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzogLyogaXBOZXRUb01lZGlhTmV0QWRkcmVzcyAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1RBQjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9XUklURTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lQQUREUik7CisgICAgICAgIG9kLT52X2xlbiA9IDQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJpcF9udG9tZW50cnlfZ2V0X29iamVjdF9kZWY6IG5vIHN1Y2ggb2JqZWN0XG4iKSk7CisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfTk9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiaXBfbnRvbWVudHJ5X2dldF9vYmplY3RfZGVmOiBubyBzY2FsYXJcbiIpKTsKKyAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX05PTkU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2lwX250b21lbnRyeV9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworI2lmIExXSVBfQVJQCisgIHU4X3QgaWQ7CisgIHN0cnVjdCBldGhfYWRkciogZXRoYWRkcl9yZXQ7CisgIGlwX2FkZHJfdCogaXBhZGRyX3JldDsKKyNlbmRpZiAvKiBMV0lQX0FSUCAqLworICBpcF9hZGRyX3QgaXA7CisgIHN0cnVjdCBuZXRpZiAqbmV0aWY7CisKKyAgTFdJUF9VTlVTRURfQVJHKGxlbik7CisgIExXSVBfVU5VU0VEX0FSRyh2YWx1ZSk7LyogaWYgIUxXSVBfQVJQICovCisKKyAgc25tcF9pZmluZGV4dG9uZXRpZihvZC0+aWRfaW5zdF9wdHJbMV0sICZuZXRpZik7CisgIHNubXBfb2lkdG9pcCgmb2QtPmlkX2luc3RfcHRyWzJdLCAmaXApOworCisjaWYgTFdJUF9BUlAgLyoqIEB0b2RvIGltcGxlbWVudCBhIG5ldGlmX2ZpbmRfYWRkciAqLworICBpZiAoZXRoYXJwX2ZpbmRfYWRkcihuZXRpZiwgJmlwLCAmZXRoYWRkcl9yZXQsICZpcGFkZHJfcmV0KSA+IC0xKQorICB7CisgICAgTFdJUF9BU1NFUlQoImludmFsaWQgaWQiLCAob2QtPmlkX2luc3RfcHRyWzBdID49IDApICYmIChvZC0+aWRfaW5zdF9wdHJbMF0gPD0gMHhmZikpOworICAgIGlkID0gKHU4X3Qpb2QtPmlkX2luc3RfcHRyWzBdOworICAgIHN3aXRjaCAoaWQpCisgICAgeworICAgICAgY2FzZSAxOiAvKiBpcE5ldFRvTWVkaWFJZkluZGV4ICovCisgICAgICAgIHsKKyAgICAgICAgICBzMzJfdCAqc2ludF9wdHIgPSAoczMyX3QqKXZhbHVlOworICAgICAgICAgICpzaW50X3B0ciA9IG9kLT5pZF9pbnN0X3B0clsxXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjogLyogaXBOZXRUb01lZGlhUGh5c0FkZHJlc3MgKi8KKyAgICAgICAgeworICAgICAgICAgIHN0cnVjdCBldGhfYWRkciAqZHN0ID0gKHN0cnVjdCBldGhfYWRkciopdmFsdWU7CisKKyAgICAgICAgICAqZHN0ID0gKmV0aGFkZHJfcmV0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiBpcE5ldFRvTWVkaWFOZXRBZGRyZXNzICovCisgICAgICAgIHsKKyAgICAgICAgICBpcF9hZGRyX3QgKmRzdCA9IChpcF9hZGRyX3QqKXZhbHVlOworCisgICAgICAgICAgKmRzdCA9ICppcGFkZHJfcmV0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OiAvKiBpcE5ldFRvTWVkaWFUeXBlICovCisgICAgICAgIHsKKyAgICAgICAgICBzMzJfdCAqc2ludF9wdHIgPSAoczMyX3QqKXZhbHVlOworICAgICAgICAgIC8qIGR5bmFtaWMgKD8pICovCisgICAgICAgICAgKnNpbnRfcHRyID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBMV0lQX0FSUCAqLworfQorCitzdGF0aWMgdm9pZAoraWNtcF9nZXRfb2JqZWN0X2RlZih1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpCit7CisgIC8qIHJldHVybiB0byBvYmplY3QgbmFtZSwgYWRkaW5nIGluZGV4IGRlcHRoICgxKSAqLworICBpZGVudF9sZW4gKz0gMTsKKyAgaWRlbnQgLT0gMTsKKyAgaWYgKChpZGVudF9sZW4gPT0gMikgJiYKKyAgICAgIChpZGVudFswXSA+IDApICYmIChpZGVudFswXSA8IDI3KSkKKyAgeworICAgIG9kLT5pZF9pbnN0X2xlbiA9IGlkZW50X2xlbjsKKyAgICBvZC0+aWRfaW5zdF9wdHIgPSBpZGVudDsKKworICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfU0NBTEFSOworICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX0FQUExJQyB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfQ09VTlRFUik7CisgICAgb2QtPnZfbGVuID0gc2l6ZW9mKHUzMl90KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImljbXBfZ2V0X29iamVjdF9kZWY6IG5vIHNjYWxhclxuIikpOworICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfTk9ORTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraWNtcF9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICB1MzJfdCAqdWludF9wdHIgPSAodTMyX3QqKXZhbHVlOworICB1OF90IGlkOworCisgIExXSVBfVU5VU0VEX0FSRyhsZW4pOworICBMV0lQX0FTU0VSVCgiaW52YWxpZCBpZCIsIChvZC0+aWRfaW5zdF9wdHJbMF0gPj0gMCkgJiYgKG9kLT5pZF9pbnN0X3B0clswXSA8PSAweGZmKSk7CisgIGlkID0gKHU4X3Qpb2QtPmlkX2luc3RfcHRyWzBdOworICBzd2l0Y2ggKGlkKQorICB7CisgICAgY2FzZSAxOiAvKiBpY21wSW5Nc2dzICovCisgICAgICAqdWludF9wdHIgPSBpY21waW5tc2dzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiBpY21wSW5FcnJvcnMgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBpbmVycm9yczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyogaWNtcEluRGVzdFVucmVhY2hzICovCisgICAgICAqdWludF9wdHIgPSBpY21waW5kZXN0dW5yZWFjaHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6IC8qIGljbXBJblRpbWVFeGNkcyAqLworICAgICAgKnVpbnRfcHRyID0gaWNtcGludGltZWV4Y2RzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OiAvKiBpY21wSW5QYXJtUHJvYnMgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBpbnBhcm1wcm9iczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjogLyogaWNtcEluU3JjUXVlbmNocyAqLworICAgICAgKnVpbnRfcHRyID0gaWNtcGluc3JjcXVlbmNoczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzogLyogaWNtcEluUmVkaXJlY3RzICovCisgICAgICAqdWludF9wdHIgPSBpY21waW5yZWRpcmVjdHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6IC8qIGljbXBJbkVjaG9zICovCisgICAgICAqdWludF9wdHIgPSBpY21waW5lY2hvczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTogLyogaWNtcEluRWNob1JlcHMgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBpbmVjaG9yZXBzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDogLyogaWNtcEluVGltZXN0YW1wcyAqLworICAgICAgKnVpbnRfcHRyID0gaWNtcGludGltZXN0YW1wczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6IC8qIGljbXBJblRpbWVzdGFtcFJlcHMgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBpbnRpbWVzdGFtcHJlcHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyOiAvKiBpY21wSW5BZGRyTWFza3MgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBpbmFkZHJtYXNrczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6IC8qIGljbXBJbkFkZHJNYXNrUmVwcyAqLworICAgICAgKnVpbnRfcHRyID0gaWNtcGluYWRkcm1hc2tyZXBzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNDogLyogaWNtcE91dE1zZ3MgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBvdXRtc2dzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNTogLyogaWNtcE91dEVycm9ycyAqLworICAgICAgKnVpbnRfcHRyID0gaWNtcG91dGVycm9yczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6IC8qIGljbXBPdXREZXN0VW5yZWFjaHMgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBvdXRkZXN0dW5yZWFjaHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE3OiAvKiBpY21wT3V0VGltZUV4Y2RzICovCisgICAgICAqdWludF9wdHIgPSBpY21wb3V0dGltZWV4Y2RzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxODogLyogaWNtcE91dFBhcm1Qcm9icyAqLworICAgICAgKnVpbnRfcHRyID0gaWNtcG91dHBhcm1wcm9iczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTk6IC8qIGljbXBPdXRTcmNRdWVuY2hzICovCisgICAgICAqdWludF9wdHIgPSBpY21wb3V0c3JjcXVlbmNoczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjA6IC8qIGljbXBPdXRSZWRpcmVjdHMgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBvdXRyZWRpcmVjdHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIxOiAvKiBpY21wT3V0RWNob3MgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBvdXRlY2hvczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjI6IC8qIGljbXBPdXRFY2hvUmVwcyAqLworICAgICAgKnVpbnRfcHRyID0gaWNtcG91dGVjaG9yZXBzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMzogLyogaWNtcE91dFRpbWVzdGFtcHMgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBvdXR0aW1lc3RhbXBzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDogLyogaWNtcE91dFRpbWVzdGFtcFJlcHMgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBvdXR0aW1lc3RhbXByZXBzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNTogLyogaWNtcE91dEFkZHJNYXNrcyAqLworICAgICAgKnVpbnRfcHRyID0gaWNtcG91dGFkZHJtYXNrczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjY6IC8qIGljbXBPdXRBZGRyTWFza1JlcHMgKi8KKyAgICAgICp1aW50X3B0ciA9IGljbXBvdXRhZGRybWFza3JlcHM7CisgICAgICBicmVhazsKKyAgfQorfQorCisjaWYgTFdJUF9UQ1AKKy8qKiBAdG9kbyB0Y3AgZ3JwICovCitzdGF0aWMgdm9pZAordGNwX2dldF9vYmplY3RfZGVmKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBvYmpfZGVmICpvZCkKK3sKKyAgdThfdCBpZDsKKworICAvKiByZXR1cm4gdG8gb2JqZWN0IG5hbWUsIGFkZGluZyBpbmRleCBkZXB0aCAoMSkgKi8KKyAgaWRlbnRfbGVuICs9IDE7CisgIGlkZW50IC09IDE7CisgIGlmIChpZGVudF9sZW4gPT0gMikKKyAgeworICAgIG9kLT5pZF9pbnN0X2xlbiA9IGlkZW50X2xlbjsKKyAgICBvZC0+aWRfaW5zdF9wdHIgPSBpZGVudDsKKworICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGlkIiwgKGlkZW50WzBdID49IDApICYmIChpZGVudFswXSA8PSAweGZmKSk7CisgICAgaWQgPSAodThfdClpZGVudFswXTsKKyAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImdldF9vYmplY3RfZGVmIHRjcC4lIlUxNl9GIi4wXG4iLCh1MTZfdClpZCkpOworCisgICAgc3dpdGNoIChpZCkKKyAgICB7CisgICAgICBjYXNlIDE6IC8qIHRjcFJ0b0FsZ29yaXRobSAqLworICAgICAgY2FzZSAyOiAvKiB0Y3BSdG9NaW4gKi8KKyAgICAgIGNhc2UgMzogLyogdGNwUnRvTWF4ICovCisgICAgICBjYXNlIDQ6IC8qIHRjcE1heENvbm4gKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9TQ0FMQVI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OiAvKiB0Y3BBY3RpdmVPcGVucyAqLworICAgICAgY2FzZSA2OiAvKiB0Y3BQYXNzaXZlT3BlbnMgKi8KKyAgICAgIGNhc2UgNzogLyogdGNwQXR0ZW1wdEZhaWxzICovCisgICAgICBjYXNlIDg6IC8qIHRjcEVzdGFiUmVzZXRzICovCisgICAgICBjYXNlIDEwOiAvKiB0Y3BJblNlZ3MgKi8KKyAgICAgIGNhc2UgMTE6IC8qIHRjcE91dFNlZ3MgKi8KKyAgICAgIGNhc2UgMTI6IC8qIHRjcFJldHJhbnNTZWdzICovCisgICAgICBjYXNlIDE0OiAvKiB0Y3BJbkVycnMgKi8KKyAgICAgIGNhc2UgMTU6IC8qIHRjcE91dFJzdHMgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9TQ0FMQVI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0NPVU5URVIpOworICAgICAgICBvZC0+dl9sZW4gPSBzaXplb2YodTMyX3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOTogLyogdGNwQ3VyckVzdGFiICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfVEFCOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX09OTFk7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9HQVVHRSk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZih1MzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJ0Y3BfZ2V0X29iamVjdF9kZWY6IG5vIHN1Y2ggb2JqZWN0XG4iKSk7CisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfTk9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgfTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoInRjcF9nZXRfb2JqZWN0X2RlZjogbm8gc2NhbGFyXG4iKSk7CisgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0Y3BfZ2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSkKK3sKKyAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgczMyX3QgKnNpbnRfcHRyID0gKHMzMl90Kil2YWx1ZTsKKyAgdThfdCBpZDsKKworICBMV0lQX1VOVVNFRF9BUkcobGVuKTsKKyAgTFdJUF9BU1NFUlQoImludmFsaWQgaWQiLCAob2QtPmlkX2luc3RfcHRyWzBdID49IDApICYmIChvZC0+aWRfaW5zdF9wdHJbMF0gPD0gMHhmZikpOworICBpZCA9ICh1OF90KW9kLT5pZF9pbnN0X3B0clswXTsKKyAgc3dpdGNoIChpZCkKKyAgeworICAgIGNhc2UgMTogLyogdGNwUnRvQWxnb3JpdGhtLCB2YW5qKDQpICovCisgICAgICAqc2ludF9wdHIgPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiB0Y3BSdG9NaW4gKi8KKyAgICAgIC8qIEB0b2RvIG5vdCB0aGUgYWN0dWFsIHZhbHVlLCBhIGd1ZXNzLAorICAgICAgICAgIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQgKi8KKyAgICAgICpzaW50X3B0ciA9IDEwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6IC8qIHRjcFJ0b01heCAqLworICAgICAgLyogQHRvZG8gbm90IHRoZSBhY3R1YWwgdmFsdWUsIGEgZ3Vlc3MsCisgICAgICAgICBuZWVkcyB0byBiZSBjYWxjdWxhdGVkICovCisgICAgICAqc2ludF9wdHIgPSA2MDAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDogLyogdGNwTWF4Q29ubiAqLworICAgICAgKnNpbnRfcHRyID0gTUVNUF9OVU1fVENQX1BDQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTogLyogdGNwQWN0aXZlT3BlbnMgKi8KKyAgICAgICp1aW50X3B0ciA9IHRjcGFjdGl2ZW9wZW5zOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAvKiB0Y3BQYXNzaXZlT3BlbnMgKi8KKyAgICAgICp1aW50X3B0ciA9IHRjcHBhc3NpdmVvcGVuczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzogLyogdGNwQXR0ZW1wdEZhaWxzICovCisgICAgICAqdWludF9wdHIgPSB0Y3BhdHRlbXB0ZmFpbHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6IC8qIHRjcEVzdGFiUmVzZXRzICovCisgICAgICAqdWludF9wdHIgPSB0Y3Blc3RhYnJlc2V0czsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTogLyogdGNwQ3VyckVzdGFiICovCisgICAgICB7CisgICAgICAgIHUxNl90IHRjcGN1cnJlc3RhYiA9IDA7CisgICAgICAgIHN0cnVjdCB0Y3BfcGNiICpwY2IgPSB0Y3BfYWN0aXZlX3BjYnM7CisgICAgICAgIHdoaWxlIChwY2IgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmICgocGNiLT5zdGF0ZSA9PSBFU1RBQkxJU0hFRCkgfHwKKyAgICAgICAgICAgICAgKHBjYi0+c3RhdGUgPT0gQ0xPU0VfV0FJVCkpCisgICAgICAgICAgeworICAgICAgICAgICAgdGNwY3VycmVzdGFiKys7CisgICAgICAgICAgfQorICAgICAgICAgIHBjYiA9IHBjYi0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICAqdWludF9wdHIgPSB0Y3BjdXJyZXN0YWI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOiAvKiB0Y3BJblNlZ3MgKi8KKyAgICAgICp1aW50X3B0ciA9IHRjcGluc2VnczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6IC8qIHRjcE91dFNlZ3MgKi8KKyAgICAgICp1aW50X3B0ciA9IHRjcG91dHNlZ3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyOiAvKiB0Y3BSZXRyYW5zU2VncyAqLworICAgICAgKnVpbnRfcHRyID0gdGNwcmV0cmFuc3NlZ3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE0OiAvKiB0Y3BJbkVycnMgKi8KKyAgICAgICp1aW50X3B0ciA9IHRjcGluZXJyczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTU6IC8qIHRjcE91dFJzdHMgKi8KKyAgICAgICp1aW50X3B0ciA9IHRjcG91dHJzdHM7CisgICAgICBicmVhazsKKyAgfQorfQorI2lmZGVmIFRISVNfU0VFTVNfVU5VU0VECitzdGF0aWMgdm9pZAordGNwY29ubmVudHJ5X2dldF9vYmplY3RfZGVmKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBvYmpfZGVmICpvZCkKK3sKKyAgLyogcmV0dXJuIHRvIG9iamVjdCBuYW1lLCBhZGRpbmcgaW5kZXggZGVwdGggKDEwKSAqLworICBpZGVudF9sZW4gKz0gMTA7CisgIGlkZW50IC09IDEwOworCisgIGlmIChpZGVudF9sZW4gPT0gMTEpCisgIHsKKyAgICB1OF90IGlkOworCisgICAgb2QtPmlkX2luc3RfbGVuID0gaWRlbnRfbGVuOworICAgIG9kLT5pZF9pbnN0X3B0ciA9IGlkZW50OworCisgICAgaWQgPSBpZGVudFswXTsKKyAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImdldF9vYmplY3RfZGVmIHRjcC4lIlUxNl9GIi4wXG4iLCh1MTZfdClpZCkpOworCisgICAgc3dpdGNoIChpZCkKKyAgICB7CisgICAgICBjYXNlIDE6IC8qIHRjcENvbm5TdGF0ZSAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1RBQjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9XUklURTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAvKiB0Y3BDb25uTG9jYWxBZGRyZXNzICovCisgICAgICBjYXNlIDQ6IC8qIHRjcENvbm5SZW1BZGRyZXNzICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfVEFCOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX09OTFk7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JUEFERFIpOworICAgICAgICBvZC0+dl9sZW4gPSA0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzogLyogdGNwQ29ubkxvY2FsUG9ydCAqLworICAgICAgY2FzZSA1OiAvKiB0Y3BDb25uUmVtUG9ydCAqLworICAgICAgICBvZC0+aW5zdGFuY2UgPSBNSUJfT0JKRUNUX1RBQjsKKyAgICAgICAgb2QtPmFjY2VzcyA9IE1JQl9PQkpFQ1RfUkVBRF9PTkxZOworICAgICAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKTsKKyAgICAgICAgb2QtPnZfbGVuID0gc2l6ZW9mKHMzMl90KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoInRjcGNvbm5lbnRyeV9nZXRfb2JqZWN0X2RlZjogbm8gc3VjaCBvYmplY3RcbiIpKTsKKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICAgICAgICBicmVhazsKKyAgICB9OworICB9CisgIGVsc2UKKyAgeworICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgidGNwY29ubmVudHJ5X2dldF9vYmplY3RfZGVmOiBubyBzdWNoIG9iamVjdFxuIikpOworICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfTk9ORTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGNwY29ubmVudHJ5X2dldF92YWx1ZShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpCit7CisgIGlwX2FkZHJfdCBsaXAsIHJpcDsKKyAgdTE2X3QgbHBvcnQsIHJwb3J0OworICBzMzJfdCAqaWRlbnQ7CisKKyAgaWRlbnQgPSBvZC0+aWRfaW5zdF9wdHI7CisgIHNubXBfb2lkdG9pcCgmaWRlbnRbMV0sICZsaXApOworICBscG9ydCA9IGlkZW50WzVdOworICBzbm1wX29pZHRvaXAoJmlkZW50WzZdLCAmcmlwKTsKKyAgcnBvcnQgPSBpZGVudFsxMF07CisKKyAgLyoqIEB0b2RvIGZpbmQgbWF0Y2hpbmcgUENCICovCit9CisjZW5kaWYgLyogaWYgMCAqLworI2VuZGlmCisKK3N0YXRpYyB2b2lkCit1ZHBfZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKQoreworICAvKiByZXR1cm4gdG8gb2JqZWN0IG5hbWUsIGFkZGluZyBpbmRleCBkZXB0aCAoMSkgKi8KKyAgaWRlbnRfbGVuICs9IDE7CisgIGlkZW50IC09IDE7CisgIGlmICgoaWRlbnRfbGVuID09IDIpICYmCisgICAgICAoaWRlbnRbMF0gPiAwKSAmJiAoaWRlbnRbMF0gPCA2KSkKKyAgeworICAgIG9kLT5pZF9pbnN0X2xlbiA9IGlkZW50X2xlbjsKKyAgICBvZC0+aWRfaW5zdF9wdHIgPSBpZGVudDsKKworICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfU0NBTEFSOworICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICBvZC0+YXNuX3R5cGUgPSAoU05NUF9BU04xX0FQUExJQyB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfQ09VTlRFUik7CisgICAgb2QtPnZfbGVuID0gc2l6ZW9mKHUzMl90KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoInVkcF9nZXRfb2JqZWN0X2RlZjogbm8gc2NhbGFyXG4iKSk7CisgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit1ZHBfZ2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSkKK3sKKyAgdTMyX3QgKnVpbnRfcHRyID0gKHUzMl90Kil2YWx1ZTsKKyAgdThfdCBpZDsKKworICBMV0lQX1VOVVNFRF9BUkcobGVuKTsKKyAgTFdJUF9BU1NFUlQoImludmFsaWQgaWQiLCAob2QtPmlkX2luc3RfcHRyWzBdID49IDApICYmIChvZC0+aWRfaW5zdF9wdHJbMF0gPD0gMHhmZikpOworICBpZCA9ICh1OF90KW9kLT5pZF9pbnN0X3B0clswXTsKKyAgc3dpdGNoIChpZCkKKyAgeworICAgIGNhc2UgMTogLyogdWRwSW5EYXRhZ3JhbXMgKi8KKyAgICAgICp1aW50X3B0ciA9IHVkcGluZGF0YWdyYW1zOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiB1ZHBOb1BvcnRzICovCisgICAgICAqdWludF9wdHIgPSB1ZHBub3BvcnRzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAvKiB1ZHBJbkVycm9ycyAqLworICAgICAgKnVpbnRfcHRyID0gdWRwaW5lcnJvcnM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6IC8qIHVkcE91dERhdGFncmFtcyAqLworICAgICAgKnVpbnRfcHRyID0gdWRwb3V0ZGF0YWdyYW1zOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3VkcGVudHJ5X2dldF9vYmplY3RfZGVmKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBvYmpfZGVmICpvZCkKK3sKKyAgLyogcmV0dXJuIHRvIG9iamVjdCBuYW1lLCBhZGRpbmcgaW5kZXggZGVwdGggKDUpICovCisgIGlkZW50X2xlbiArPSA1OworICBpZGVudCAtPSA1OworCisgIGlmIChpZGVudF9sZW4gPT0gNikKKyAgeworICAgIG9kLT5pZF9pbnN0X2xlbiA9IGlkZW50X2xlbjsKKyAgICBvZC0+aWRfaW5zdF9wdHIgPSBpZGVudDsKKworICAgIHN3aXRjaCAoaWRlbnRbMF0pCisgICAgeworICAgICAgY2FzZSAxOiAvKiB1ZHBMb2NhbEFkZHJlc3MgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9UQUI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lQQUREUik7CisgICAgICAgIG9kLT52X2xlbiA9IDQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAvKiB1ZHBMb2NhbFBvcnQgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9UQUI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfT05MWTsKKyAgICAgICAgb2QtPmFzbl90eXBlID0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk7CisgICAgICAgIG9kLT52X2xlbiA9IHNpemVvZihzMzJfdCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJ1ZHBlbnRyeV9nZXRfb2JqZWN0X2RlZjogbm8gc3VjaCBvYmplY3RcbiIpKTsKKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJ1ZHBlbnRyeV9nZXRfb2JqZWN0X2RlZjogbm8gc2NhbGFyXG4iKSk7CisgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit1ZHBlbnRyeV9nZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICB1OF90IGlkOworICBzdHJ1Y3QgdWRwX3BjYiAqcGNiOworICBpcF9hZGRyX3QgaXA7CisgIHUxNl90IHBvcnQ7CisKKyAgTFdJUF9VTlVTRURfQVJHKGxlbik7CisgIHNubXBfb2lkdG9pcCgmb2QtPmlkX2luc3RfcHRyWzFdLCAmaXApOworICBMV0lQX0FTU0VSVCgiaW52YWxpZCBwb3J0IiwgKG9kLT5pZF9pbnN0X3B0cls1XSA+PSAwKSAmJiAob2QtPmlkX2luc3RfcHRyWzVdIDw9IDB4ZmZmZikpOworICBwb3J0ID0gKHUxNl90KW9kLT5pZF9pbnN0X3B0cls1XTsKKworICBwY2IgPSB1ZHBfcGNiczsKKyAgd2hpbGUgKChwY2IgIT0gTlVMTCkgJiYKKyAgICAgICAgICEoaXBfYWRkcl9jbXAoJnBjYi0+bG9jYWxfaXAsICZpcCkgJiYKKyAgICAgICAgICAgKHBjYi0+bG9jYWxfcG9ydCA9PSBwb3J0KSkpCisgIHsKKyAgICBwY2IgPSBwY2ItPm5leHQ7CisgIH0KKworICBpZiAocGNiICE9IE5VTEwpCisgIHsKKyAgICBMV0lQX0FTU0VSVCgiaW52YWxpZCBpZCIsIChvZC0+aWRfaW5zdF9wdHJbMF0gPj0gMCkgJiYgKG9kLT5pZF9pbnN0X3B0clswXSA8PSAweGZmKSk7CisgICAgaWQgPSAodThfdClvZC0+aWRfaW5zdF9wdHJbMF07CisgICAgc3dpdGNoIChpZCkKKyAgICB7CisgICAgICBjYXNlIDE6IC8qIHVkcExvY2FsQWRkcmVzcyAqLworICAgICAgICB7CisgICAgICAgICAgaXBfYWRkcl90ICpkc3QgPSAoaXBfYWRkcl90Kil2YWx1ZTsKKyAgICAgICAgICAqZHN0ID0gcGNiLT5sb2NhbF9pcDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjogLyogdWRwTG9jYWxQb3J0ICovCisgICAgICAgIHsKKyAgICAgICAgICBzMzJfdCAqc2ludF9wdHIgPSAoczMyX3QqKXZhbHVlOworICAgICAgICAgICpzaW50X3B0ciA9IHBjYi0+bG9jYWxfcG9ydDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK3NubXBfZ2V0X29iamVjdF9kZWYodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKQoreworICAvKiByZXR1cm4gdG8gb2JqZWN0IG5hbWUsIGFkZGluZyBpbmRleCBkZXB0aCAoMSkgKi8KKyAgaWRlbnRfbGVuICs9IDE7CisgIGlkZW50IC09IDE7CisgIGlmIChpZGVudF9sZW4gPT0gMikKKyAgeworICAgIHU4X3QgaWQ7CisKKyAgICBvZC0+aWRfaW5zdF9sZW4gPSBpZGVudF9sZW47CisgICAgb2QtPmlkX2luc3RfcHRyID0gaWRlbnQ7CisKKyAgICBMV0lQX0FTU0VSVCgiaW52YWxpZCBpZCIsIChpZGVudFswXSA+PSAwKSAmJiAoaWRlbnRbMF0gPD0gMHhmZikpOworICAgIGlkID0gKHU4X3QpaWRlbnRbMF07CisgICAgc3dpdGNoIChpZCkKKyAgICB7CisgICAgICBjYXNlIDE6IC8qIHNubXBJblBrdHMgKi8KKyAgICAgIGNhc2UgMjogLyogc25tcE91dFBrdHMgKi8KKyAgICAgIGNhc2UgMzogLyogc25tcEluQmFkVmVyc2lvbnMgKi8KKyAgICAgIGNhc2UgNDogLyogc25tcEluQmFkQ29tbXVuaXR5TmFtZXMgKi8KKyAgICAgIGNhc2UgNTogLyogc25tcEluQmFkQ29tbXVuaXR5VXNlcyAqLworICAgICAgY2FzZSA2OiAvKiBzbm1wSW5BU05QYXJzZUVycnMgKi8KKyAgICAgIGNhc2UgODogLyogc25tcEluVG9vQmlncyAqLworICAgICAgY2FzZSA5OiAvKiBzbm1wSW5Ob1N1Y2hOYW1lcyAqLworICAgICAgY2FzZSAxMDogLyogc25tcEluQmFkVmFsdWVzICovCisgICAgICBjYXNlIDExOiAvKiBzbm1wSW5SZWFkT25seXMgKi8KKyAgICAgIGNhc2UgMTI6IC8qIHNubXBJbkdlbkVycnMgKi8KKyAgICAgIGNhc2UgMTM6IC8qIHNubXBJblRvdGFsUmVxVmFycyAqLworICAgICAgY2FzZSAxNDogLyogc25tcEluVG90YWxTZXRWYXJzICovCisgICAgICBjYXNlIDE1OiAvKiBzbm1wSW5HZXRSZXF1ZXN0cyAqLworICAgICAgY2FzZSAxNjogLyogc25tcEluR2V0TmV4dHMgKi8KKyAgICAgIGNhc2UgMTc6IC8qIHNubXBJblNldFJlcXVlc3RzICovCisgICAgICBjYXNlIDE4OiAvKiBzbm1wSW5HZXRSZXNwb25zZXMgKi8KKyAgICAgIGNhc2UgMTk6IC8qIHNubXBJblRyYXBzICovCisgICAgICBjYXNlIDIwOiAvKiBzbm1wT3V0VG9vQmlncyAqLworICAgICAgY2FzZSAyMTogLyogc25tcE91dE5vU3VjaE5hbWVzICovCisgICAgICBjYXNlIDIyOiAvKiBzbm1wT3V0QmFkVmFsdWVzICovCisgICAgICBjYXNlIDI0OiAvKiBzbm1wT3V0R2VuRXJycyAqLworICAgICAgY2FzZSAyNTogLyogc25tcE91dEdldFJlcXVlc3RzICovCisgICAgICBjYXNlIDI2OiAvKiBzbm1wT3V0R2V0TmV4dHMgKi8KKyAgICAgIGNhc2UgMjc6IC8qIHNubXBPdXRTZXRSZXF1ZXN0cyAqLworICAgICAgY2FzZSAyODogLyogc25tcE91dEdldFJlc3BvbnNlcyAqLworICAgICAgY2FzZSAyOTogLyogc25tcE91dFRyYXBzICovCisgICAgICAgIG9kLT5pbnN0YW5jZSA9IE1JQl9PQkpFQ1RfU0NBTEFSOworICAgICAgICBvZC0+YWNjZXNzID0gTUlCX09CSkVDVF9SRUFEX09OTFk7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9DT1VOVEVSKTsKKyAgICAgICAgb2QtPnZfbGVuID0gc2l6ZW9mKHUzMl90KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMwOiAvKiBzbm1wRW5hYmxlQXV0aGVuVHJhcHMgKi8KKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9TQ0FMQVI7CisgICAgICAgIG9kLT5hY2Nlc3MgPSBNSUJfT0JKRUNUX1JFQURfV1JJVEU7CisgICAgICAgIG9kLT5hc25fdHlwZSA9IChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSU5URUcpOworICAgICAgICBvZC0+dl9sZW4gPSBzaXplb2YoczMyX3QpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgic25tcF9nZXRfb2JqZWN0X2RlZjogbm8gc3VjaCBvYmplY3RcbiIpKTsKKyAgICAgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICAgICAgICBicmVhazsKKyAgICB9OworICB9CisgIGVsc2UKKyAgeworICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgic25tcF9nZXRfb2JqZWN0X2RlZjogbm8gc2NhbGFyXG4iKSk7CisgICAgb2QtPmluc3RhbmNlID0gTUlCX09CSkVDVF9OT05FOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzbm1wX2dldF92YWx1ZShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpCit7CisgIHUzMl90ICp1aW50X3B0ciA9ICh1MzJfdCopdmFsdWU7CisgIHU4X3QgaWQ7CisKKyAgTFdJUF9VTlVTRURfQVJHKGxlbik7CisgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGlkIiwgKG9kLT5pZF9pbnN0X3B0clswXSA+PSAwKSAmJiAob2QtPmlkX2luc3RfcHRyWzBdIDw9IDB4ZmYpKTsKKyAgaWQgPSAodThfdClvZC0+aWRfaW5zdF9wdHJbMF07CisgIHN3aXRjaCAoaWQpCisgIHsKKyAgICAgIGNhc2UgMTogLyogc25tcEluUGt0cyAqLworICAgICAgICAqdWludF9wdHIgPSBzbm1waW5wa3RzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjogLyogc25tcE91dFBrdHMgKi8KKyAgICAgICAgKnVpbnRfcHRyID0gc25tcG91dHBrdHM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiBzbm1wSW5CYWRWZXJzaW9ucyAqLworICAgICAgICAqdWludF9wdHIgPSBzbm1waW5iYWR2ZXJzaW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6IC8qIHNubXBJbkJhZENvbW11bml0eU5hbWVzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBpbmJhZGNvbW11bml0eW5hbWVzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTogLyogc25tcEluQmFkQ29tbXVuaXR5VXNlcyAqLworICAgICAgICAqdWludF9wdHIgPSBzbm1waW5iYWRjb21tdW5pdHl1c2VzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjogLyogc25tcEluQVNOUGFyc2VFcnJzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBpbmFzbnBhcnNlZXJyczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6IC8qIHNubXBJblRvb0JpZ3MgKi8KKyAgICAgICAgKnVpbnRfcHRyID0gc25tcGludG9vYmlnczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDk6IC8qIHNubXBJbk5vU3VjaE5hbWVzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBpbm5vc3VjaG5hbWVzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA6IC8qIHNubXBJbkJhZFZhbHVlcyAqLworICAgICAgICAqdWludF9wdHIgPSBzbm1waW5iYWR2YWx1ZXM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTogLyogc25tcEluUmVhZE9ubHlzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBpbnJlYWRvbmx5czsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyOiAvKiBzbm1wSW5HZW5FcnJzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBpbmdlbmVycnM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMzogLyogc25tcEluVG90YWxSZXFWYXJzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBpbnRvdGFscmVxdmFyczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE0OiAvKiBzbm1wSW5Ub3RhbFNldFZhcnMgKi8KKyAgICAgICAgKnVpbnRfcHRyID0gc25tcGludG90YWxzZXR2YXJzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTU6IC8qIHNubXBJbkdldFJlcXVlc3RzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBpbmdldHJlcXVlc3RzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTY6IC8qIHNubXBJbkdldE5leHRzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBpbmdldG5leHRzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTc6IC8qIHNubXBJblNldFJlcXVlc3RzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBpbnNldHJlcXVlc3RzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTg6IC8qIHNubXBJbkdldFJlc3BvbnNlcyAqLworICAgICAgICAqdWludF9wdHIgPSBzbm1waW5nZXRyZXNwb25zZXM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOTogLyogc25tcEluVHJhcHMgKi8KKyAgICAgICAgKnVpbnRfcHRyID0gc25tcGludHJhcHM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMDogLyogc25tcE91dFRvb0JpZ3MgKi8KKyAgICAgICAgKnVpbnRfcHRyID0gc25tcG91dHRvb2JpZ3M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMTogLyogc25tcE91dE5vU3VjaE5hbWVzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBvdXRub3N1Y2huYW1lczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIyOiAvKiBzbm1wT3V0QmFkVmFsdWVzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBvdXRiYWR2YWx1ZXM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyNDogLyogc25tcE91dEdlbkVycnMgKi8KKyAgICAgICAgKnVpbnRfcHRyID0gc25tcG91dGdlbmVycnM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyNTogLyogc25tcE91dEdldFJlcXVlc3RzICovCisgICAgICAgICp1aW50X3B0ciA9IHNubXBvdXRnZXRyZXF1ZXN0czsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI2OiAvKiBzbm1wT3V0R2V0TmV4dHMgKi8KKyAgICAgICAgKnVpbnRfcHRyID0gc25tcG91dGdldG5leHRzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjc6IC8qIHNubXBPdXRTZXRSZXF1ZXN0cyAqLworICAgICAgICAqdWludF9wdHIgPSBzbm1wb3V0c2V0cmVxdWVzdHM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyODogLyogc25tcE91dEdldFJlc3BvbnNlcyAqLworICAgICAgICAqdWludF9wdHIgPSBzbm1wb3V0Z2V0cmVzcG9uc2VzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjk6IC8qIHNubXBPdXRUcmFwcyAqLworICAgICAgICAqdWludF9wdHIgPSBzbm1wb3V0dHJhcHM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzMDogLyogc25tcEVuYWJsZUF1dGhlblRyYXBzICovCisgICAgICAgICp1aW50X3B0ciA9ICpzbm1wZW5hYmxlYXV0aGVudHJhcHNfcHRyOworICAgICAgICBicmVhazsKKyAgfTsKK30KKworLyoqCisgKiBUZXN0IHNubXAgb2JqZWN0IHZhbHVlIGJlZm9yZSBzZXR0aW5nLgorICoKKyAqIEBwYXJhbSBvZCBpcyB0aGUgb2JqZWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBsZW4gcmV0dXJuIHZhbHVlIHNwYWNlIChpbiBieXRlcykKKyAqIEBwYXJhbSB2YWx1ZSBwb2ludHMgdG8gKHZhcmJpbmQpIHNwYWNlIHRvIGNvcHkgdmFsdWUgZnJvbS4KKyAqLworc3RhdGljIHU4X3QKK3NubXBfc2V0X3Rlc3Qoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICB1OF90IGlkLCBzZXRfb2s7CisKKyAgTFdJUF9VTlVTRURfQVJHKGxlbik7CisgIHNldF9vayA9IDA7CisgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGlkIiwgKG9kLT5pZF9pbnN0X3B0clswXSA+PSAwKSAmJiAob2QtPmlkX2luc3RfcHRyWzBdIDw9IDB4ZmYpKTsKKyAgaWQgPSAodThfdClvZC0+aWRfaW5zdF9wdHJbMF07CisgIGlmIChpZCA9PSAzMCkKKyAgeworICAgIC8qIHNubXBFbmFibGVBdXRoZW5UcmFwcyAqLworICAgIHMzMl90ICpzaW50X3B0ciA9IChzMzJfdCopdmFsdWU7CisKKyAgICBpZiAoc25tcGVuYWJsZWF1dGhlbnRyYXBzX3B0ciAhPSAmc25tcGVuYWJsZWF1dGhlbnRyYXBzX2RlZmF1bHQpCisgICAgeworICAgICAgLyogd2Ugc2hvdWxkIGhhdmUgd3JpdGFibGUgbm9uLXZvbGF0aWxlIG1lbSBoZXJlICovCisgICAgICBpZiAoKCpzaW50X3B0ciA9PSAxKSB8fCAoKnNpbnRfcHRyID09IDIpKQorICAgICAgeworICAgICAgICBzZXRfb2sgPSAxOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogY29uc3Qgb3IgaGFyZHdpcmVkIHZhbHVlICovCisgICAgICBpZiAoKnNpbnRfcHRyID09IHNubXBlbmFibGVhdXRoZW50cmFwc19kZWZhdWx0KQorICAgICAgeworICAgICAgICBzZXRfb2sgPSAxOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc2V0X29rOworfQorCitzdGF0aWMgdm9pZAorc25tcF9zZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKQoreworICB1OF90IGlkOworCisgIExXSVBfVU5VU0VEX0FSRyhsZW4pOworICBMV0lQX0FTU0VSVCgiaW52YWxpZCBpZCIsIChvZC0+aWRfaW5zdF9wdHJbMF0gPj0gMCkgJiYgKG9kLT5pZF9pbnN0X3B0clswXSA8PSAweGZmKSk7CisgIGlkID0gKHU4X3Qpb2QtPmlkX2luc3RfcHRyWzBdOworICBpZiAoaWQgPT0gMzApCisgIHsKKyAgICAvKiBzbm1wRW5hYmxlQXV0aGVuVHJhcHMgKi8KKyAgICAvKiBAdG9kbyBAZml4bWU6IHdoaWNoIGtpbmQgb2YgcG9pbnRlciBpcyAndmFsdWUnPyBzMzJfdCBvciB1OF90Pz8/ICovCisgICAgdThfdCAqcHRyID0gKHU4X3QqKXZhbHVlOworICAgICpzbm1wZW5hYmxlYXV0aGVudHJhcHNfcHRyID0gKnB0cjsKKyAgfQorfQorCisjZW5kaWYgLyogTFdJUF9TTk1QICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2NvcmUvc25tcC9taWJfc3RydWN0cy5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL3NubXAvbWliX3N0cnVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjE4NWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL3NubXAvbWliX3N0cnVjdHMuYwpAQCAtMCwwICsxLDExNzQgQEAKKy8qKgorICogQGZpbGUKKyAqIE1JQiB0cmVlIGFjY2Vzcy9jb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQXhvbiBEaWdpdGFsIERlc2lnbiBCLlYuLCBUaGUgTmV0aGVybGFuZHMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yOiBDaHJpc3RpYWFuIFNpbW9ucyA8Y2hyaXN0aWFhbi5zaW1vbnNAYXhvbi50dj4KKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfU05NUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvc25tcF9zdHJ1Y3RzLmgiCisjaW5jbHVkZSAibHdpcC9tZW1wLmgiCisjaW5jbHVkZSAibHdpcC9uZXRpZi5oIgorCisvKiogLmlzby5vcmcuZG9kLmludGVybmV0IGFkZHJlc3MgcHJlZml4LCBAc2VlIHNubXBfaXNvXyooKSAqLworY29uc3QgczMyX3QgcHJlZml4WzRdID0gezEsIDMsIDYsIDF9OworCisjZGVmaW5lIE5PREVfU1RBQ0tfU0laRSAoTFdJUF9TTk1QX09CSl9JRF9MRU4pCisvKiogbm9kZSBzdGFjayBlbnRyeSAob2xkIG5ld3M/KSAqLworc3RydWN0IG5zZQoreworICAvKiogcmlnaHQgY2hpbGQgKi8KKyAgc3RydWN0IG1pYl9ub2RlKiByX3B0cjsKKyAgLyoqIHJpZ2h0IGNoaWxkIGlkZW50aWZpZXIgKi8KKyAgczMyX3Qgcl9pZDsKKyAgLyoqIHJpZ2h0IGNoaWxkIG5leHQgbGV2ZWwgKi8KKyAgdThfdCByX25sOworfTsKK3N0YXRpYyB1OF90IG5vZGVfc3RhY2tfY250Oworc3RhdGljIHN0cnVjdCBuc2Ugbm9kZV9zdGFja1tOT0RFX1NUQUNLX1NJWkVdOworCisvKioKKyAqIFB1c2hlcyBuc2Ugc3RydWN0IG9udG8gc3RhY2suCisgKi8KK3N0YXRpYyB2b2lkCitwdXNoX25vZGUoc3RydWN0IG5zZSogbm9kZSkKK3sKKyAgTFdJUF9BU1NFUlQoIm5vZGVfc3RhY2tfY250IDwgTk9ERV9TVEFDS19TSVpFIixub2RlX3N0YWNrX2NudCA8IE5PREVfU1RBQ0tfU0laRSk7CisgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgicHVzaF9ub2RlKCkgbm9kZT0lcCBpZD0lIlMzMl9GIlxuIiwodm9pZCopKG5vZGUtPnJfcHRyKSxub2RlLT5yX2lkKSk7CisgIGlmIChub2RlX3N0YWNrX2NudCA8IE5PREVfU1RBQ0tfU0laRSkKKyAgeworICAgIG5vZGVfc3RhY2tbbm9kZV9zdGFja19jbnRdID0gKm5vZGU7CisgICAgbm9kZV9zdGFja19jbnQrKzsKKyAgfQorfQorCisvKioKKyAqIFBvcHMgbnNlIHN0cnVjdCBmcm9tIHN0YWNrLgorICovCitzdGF0aWMgdm9pZAorcG9wX25vZGUoc3RydWN0IG5zZSogbm9kZSkKK3sKKyAgaWYgKG5vZGVfc3RhY2tfY250ID4gMCkKKyAgeworICAgIG5vZGVfc3RhY2tfY250LS07CisgICAgKm5vZGUgPSBub2RlX3N0YWNrW25vZGVfc3RhY2tfY250XTsKKyAgfQorICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoInBvcF9ub2RlKCkgbm9kZT0lcCBpZD0lIlMzMl9GIlxuIiwodm9pZCAqKShub2RlLT5yX3B0ciksbm9kZS0+cl9pZCkpOworfQorCisvKioKKyAqIENvbnZlcnNpb24gZnJvbSBpZkluZGV4IHRvIGx3SVAgbmV0aWYKKyAqIEBwYXJhbSBpZmluZGV4IGlzIGEgczMyX3Qgb2JqZWN0IHN1Yi1pZGVudGlmaWVyCisgKiBAcGFyYW0gbmV0aWYgcG9pbnRzIHRvIHJldHVybmVkIG5ldGlmIHN0cnVjdCBwb2ludGVyCisgKi8KK3ZvaWQKK3NubXBfaWZpbmRleHRvbmV0aWYoczMyX3QgaWZpbmRleCwgc3RydWN0IG5ldGlmICoqbmV0aWYpCit7CisgIHN0cnVjdCBuZXRpZiAqbmlmID0gbmV0aWZfbGlzdDsKKyAgczMyX3QgaSwgaWZpZHg7CisKKyAgaWZpZHggPSBpZmluZGV4IC0gMTsKKyAgaSA9IDA7CisgIHdoaWxlICgobmlmICE9IE5VTEwpICYmIChpIDwgaWZpZHgpKQorICB7CisgICAgbmlmID0gbmlmLT5uZXh0OworICAgIGkrKzsKKyAgfQorICAqbmV0aWYgPSBuaWY7Cit9CisKKy8qKgorICogQ29udmVyc2lvbiBmcm9tIGx3SVAgbmV0aWYgdG8gaWZJbmRleAorICogQHBhcmFtIG5ldGlmIHBvaW50cyB0byBhIG5ldGlmIHN0cnVjdAorICogQHBhcmFtIGlmaWR4IHBvaW50cyB0byBzMzJfdCBvYmplY3Qgc3ViLWlkZW50aWZpZXIKKyAqLwordm9pZAorc25tcF9uZXRpZnRvaWZpbmRleChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBzMzJfdCAqaWZpZHgpCit7CisgIHN0cnVjdCBuZXRpZiAqbmlmID0gbmV0aWZfbGlzdDsKKyAgdTE2X3QgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKChuaWYgIT0gTlVMTCkgJiYgKG5pZiAhPSBuZXRpZikpCisgIHsKKyAgICBuaWYgPSBuaWYtPm5leHQ7CisgICAgaSsrOworICB9CisgICppZmlkeCA9IGkrMTsKK30KKworLyoqCisgKiBDb252ZXJzaW9uIGZyb20gb2lkIHRvIGx3SVAgaXBfYWRkcgorICogQHBhcmFtIGlkZW50IHBvaW50cyB0byBzMzJfdCBpZGVudFs0XSBpbnB1dAorICogQHBhcmFtIGlwIHBvaW50cyB0byBvdXRwdXQgc3RydWN0CisgKi8KK3ZvaWQKK3NubXBfb2lkdG9pcChzMzJfdCAqaWRlbnQsIGlwX2FkZHJfdCAqaXApCit7CisgIElQNF9BRERSKGlwLCBpZGVudFswXSwgaWRlbnRbMV0sIGlkZW50WzJdLCBpZGVudFszXSk7Cit9CisKKy8qKgorICogQ29udmVyc2lvbiBmcm9tIGx3SVAgaXBfYWRkciB0byBvaWQKKyAqIEBwYXJhbSBpcCBwb2ludHMgdG8gaW5wdXQgc3RydWN0CisgKiBAcGFyYW0gaWRlbnQgcG9pbnRzIHRvIHMzMl90IGlkZW50WzRdIG91dHB1dAorICovCit2b2lkCitzbm1wX2lwdG9vaWQoaXBfYWRkcl90ICppcCwgczMyX3QgKmlkZW50KQoreworICBpZGVudFswXSA9IGlwNF9hZGRyMShpcCk7CisgIGlkZW50WzFdID0gaXA0X2FkZHIyKGlwKTsKKyAgaWRlbnRbMl0gPSBpcDRfYWRkcjMoaXApOworICBpZGVudFszXSA9IGlwNF9hZGRyNChpcCk7Cit9CisKK3N0cnVjdCBtaWJfbGlzdF9ub2RlICoKK3NubXBfbWliX2xuX2FsbG9jKHMzMl90IGlkKQoreworICBzdHJ1Y3QgbWliX2xpc3Rfbm9kZSAqbG47CisKKyAgbG4gPSAoc3RydWN0IG1pYl9saXN0X25vZGUgKiltZW1wX21hbGxvYyhNRU1QX1NOTVBfTk9ERSk7CisgIGlmIChsbiAhPSBOVUxMKQorICB7CisgICAgbG4tPnByZXYgPSBOVUxMOworICAgIGxuLT5uZXh0ID0gTlVMTDsKKyAgICBsbi0+b2JqaWQgPSBpZDsKKyAgICBsbi0+bnB0ciA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIGxuOworfQorCit2b2lkCitzbm1wX21pYl9sbl9mcmVlKHN0cnVjdCBtaWJfbGlzdF9ub2RlICpsbikKK3sKKyAgbWVtcF9mcmVlKE1FTVBfU05NUF9OT0RFLCBsbik7Cit9CisKK3N0cnVjdCBtaWJfbGlzdF9yb290bm9kZSAqCitzbm1wX21pYl9scm5fYWxsb2Modm9pZCkKK3sKKyAgc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICpscm47CisKKyAgbHJuID0gKHN0cnVjdCBtaWJfbGlzdF9yb290bm9kZSopbWVtcF9tYWxsb2MoTUVNUF9TTk1QX1JPT1ROT0RFKTsKKyAgaWYgKGxybiAhPSBOVUxMKQorICB7CisgICAgbHJuLT5nZXRfb2JqZWN0X2RlZiA9IG5vbGVhZnNfZ2V0X29iamVjdF9kZWY7CisgICAgbHJuLT5nZXRfdmFsdWUgPSBub2xlYWZzX2dldF92YWx1ZTsKKyAgICBscm4tPnNldF90ZXN0ID0gbm9sZWFmc19zZXRfdGVzdDsKKyAgICBscm4tPnNldF92YWx1ZSA9IG5vbGVhZnNfc2V0X3ZhbHVlOworICAgIGxybi0+bm9kZV90eXBlID0gTUlCX05PREVfTFI7CisgICAgbHJuLT5tYXhsZW5ndGggPSAwOworICAgIGxybi0+aGVhZCA9IE5VTEw7CisgICAgbHJuLT50YWlsID0gTlVMTDsKKyAgICBscm4tPmNvdW50ID0gMDsKKyAgfQorICByZXR1cm4gbHJuOworfQorCit2b2lkCitzbm1wX21pYl9scm5fZnJlZShzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKmxybikKK3sKKyAgbWVtcF9mcmVlKE1FTVBfU05NUF9ST09UTk9ERSwgbHJuKTsKK30KKworLyoqCisgKiBJbnNlcnRzIG5vZGUgaW4gaWR4IGxpc3QgaW4gYSBzb3J0ZWQKKyAqIChhc2NlbmRpbmcgb3JkZXIpIGZhc2hpb24gYW5kCisgKiBhbGxvY2F0ZXMgdGhlIG5vZGUgaWYgbmVlZGVkLgorICoKKyAqIEBwYXJhbSBybiBwb2ludHMgdG8gdGhlIHJvb3Qgbm9kZQorICogQHBhcmFtIG9iamlkIGlzIHRoZSBvYmplY3Qgc3ViIGlkZW50aWZpZXIKKyAqIEBwYXJhbSBpbnNuIHBvaW50cyB0byBhIHBvaW50ZXIgdG8gdGhlIGluc2VydGVkIG5vZGUKKyAqICAgdXNlZCBmb3IgY29uc3RydWN0aW5nIHRoZSB0cmVlLgorICogQHJldHVybiAtMSBpZiBmYWlsZWQsIDEgaWYgaW5zZXJ0ZWQsIDIgaWYgcHJlc2VudC4KKyAqLworczhfdAorc25tcF9taWJfbm9kZV9pbnNlcnQoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICpybiwgczMyX3Qgb2JqaWQsIHN0cnVjdCBtaWJfbGlzdF9ub2RlICoqaW5zbikKK3sKKyAgc3RydWN0IG1pYl9saXN0X25vZGUgKm5uOworICBzOF90IGluc2VydDsKKworICBMV0lQX0FTU0VSVCgicm4gIT0gTlVMTCIscm4gIT0gTlVMTCk7CisKKyAgLyogLTEgPSBtYWxsb2MgZmFpbHVyZSwgMCA9IG5vdCBpbnNlcnRlZCwgMSA9IGluc2VydGVkLCAyID0gd2FzIHByZXNlbnQgKi8KKyAgaW5zZXJ0ID0gMDsKKyAgaWYgKHJuLT5oZWFkID09IE5VTEwpCisgIHsKKyAgICAvKiBlbXB0eSBsaXN0LCBhZGQgZmlyc3Qgbm9kZSAqLworICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiYWxsb2MgZW1wdHkgbGlzdCBvYmppZD09JSJTMzJfRiJcbiIsb2JqaWQpKTsKKyAgICBubiA9IHNubXBfbWliX2xuX2FsbG9jKG9iamlkKTsKKyAgICBpZiAobm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBybi0+aGVhZCA9IG5uOworICAgICAgcm4tPnRhaWwgPSBubjsKKyAgICAgICppbnNuID0gbm47CisgICAgICBpbnNlcnQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaW5zZXJ0ID0gLTE7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICpuOworICAgIC8qIGF0IGxlYXN0IG9uZSBub2RlIGlzIHByZXNlbnQgKi8KKyAgICBuID0gcm4tPmhlYWQ7CisgICAgd2hpbGUgKChuICE9IE5VTEwpICYmIChpbnNlcnQgPT0gMCkpCisgICAgeworICAgICAgaWYgKG4tPm9iamlkID09IG9iamlkKQorICAgICAgeworICAgICAgICAvKiBub2RlIGlzIGFscmVhZHkgdGhlcmUgKi8KKyAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJub2RlIGFscmVhZHkgdGhlcmUgb2JqaWQ9PSUiUzMyX0YiXG4iLG9iamlkKSk7CisgICAgICAgICppbnNuID0gbjsKKyAgICAgICAgaW5zZXJ0ID0gMjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG4tPm9iamlkIDwgb2JqaWQpCisgICAgICB7CisgICAgICAgIGlmIChuLT5uZXh0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBhbGxvYyBhbmQgaW5zZXJ0IGF0IHRoZSB0YWlsICovCisgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJhbGxvYyBpbnMgdGFpbCBvYmppZD09JSJTMzJfRiJcbiIsb2JqaWQpKTsKKyAgICAgICAgICBubiA9IHNubXBfbWliX2xuX2FsbG9jKG9iamlkKTsKKyAgICAgICAgICBpZiAobm4gIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBubi0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICBubi0+cHJldiA9IG47CisgICAgICAgICAgICBuLT5uZXh0ID0gbm47CisgICAgICAgICAgICBybi0+dGFpbCA9IG5uOworICAgICAgICAgICAgKmluc24gPSBubjsKKyAgICAgICAgICAgIGluc2VydCA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBpbnNlcnRpb24gZmFpbHVyZSAqLworICAgICAgICAgICAgaW5zZXJ0ID0gLTE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHRoZXJlJ3MgbW9yZSB0byBleHBsb3JlOiB0cmF2ZXJzZSBsaXN0ICovCisgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJ0cmF2ZXJzZSBsaXN0XG4iKSk7CisgICAgICAgICAgbiA9IG4tPm5leHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogbi0+b2JqaWQgPiBvYmppZCAqLworICAgICAgICAvKiBhbGxvYyBhbmQgaW5zZXJ0IGJldHdlZW4gbi0+cHJldiBhbmQgbiAqLworICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImFsbG9jIGlucyBuLT5wcmV2LCBvYmppZD09JSJTMzJfRiIsIG5cbiIsb2JqaWQpKTsKKyAgICAgICAgbm4gPSBzbm1wX21pYl9sbl9hbGxvYyhvYmppZCk7CisgICAgICAgIGlmIChubiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKG4tPnByZXYgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBpbnNlcnQgYXQgdGhlIGhlYWQgKi8KKyAgICAgICAgICAgIG5uLT5uZXh0ID0gbjsKKyAgICAgICAgICAgIG5uLT5wcmV2ID0gTlVMTDsKKyAgICAgICAgICAgIHJuLT5oZWFkID0gbm47CisgICAgICAgICAgICBuLT5wcmV2ID0gbm47CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBpbnNlcnQgaW4gdGhlIG1pZGRsZSAqLworICAgICAgICAgICAgbm4tPm5leHQgPSBuOworICAgICAgICAgICAgbm4tPnByZXYgPSBuLT5wcmV2OworICAgICAgICAgICAgbi0+cHJldi0+bmV4dCA9IG5uOworICAgICAgICAgICAgbi0+cHJldiA9IG5uOworICAgICAgICAgIH0KKyAgICAgICAgICAqaW5zbiA9IG5uOworICAgICAgICAgIGluc2VydCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogaW5zZXJ0aW9uIGZhaWx1cmUgKi8KKyAgICAgICAgICBpbnNlcnQgPSAtMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoaW5zZXJ0ID09IDEpCisgIHsKKyAgICBybi0+Y291bnQgKz0gMTsKKyAgfQorICBMV0lQX0FTU0VSVCgiaW5zZXJ0ICE9IDAiLGluc2VydCAhPSAwKTsKKyAgcmV0dXJuIGluc2VydDsKK30KKworLyoqCisgKiBGaW5kcyBub2RlIGluIGlkeCBsaXN0IGFuZCByZXR1cm5zIGRlbGV0aW9uIG1hcmsuCisgKgorICogQHBhcmFtIHJuIHBvaW50cyB0byB0aGUgcm9vdCBub2RlCisgKiBAcGFyYW0gb2JqaWQgIGlzIHRoZSBvYmplY3Qgc3ViIGlkZW50aWZpZXIKKyAqIEBwYXJhbSBmbiByZXR1cm5zIHBvaW50ZXIgdG8gZm91bmQgbm9kZQorICogQHJldHVybiAwIGlmIG5vdCBmb3VuZCwgMSBpZiBkZWxldGFibGUsCisgKiAgIDIgY2FuJ3QgZGVsZXRlICgyIG9yIG1vcmUgY2hpbGRyZW4pLCAzIG5vdCBhIGxpc3Rfbm9kZQorICovCitzOF90Citzbm1wX21pYl9ub2RlX2ZpbmQoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICpybiwgczMyX3Qgb2JqaWQsIHN0cnVjdCBtaWJfbGlzdF9ub2RlICoqZm4pCit7CisgIHM4X3QgZmM7CisgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICpuOworCisgIExXSVBfQVNTRVJUKCJybiAhPSBOVUxMIixybiAhPSBOVUxMKTsKKyAgbiA9IHJuLT5oZWFkOworICB3aGlsZSAoKG4gIT0gTlVMTCkgJiYgKG4tPm9iamlkICE9IG9iamlkKSkKKyAgeworICAgIG4gPSBuLT5uZXh0OworICB9CisgIGlmIChuID09IE5VTEwpCisgIHsKKyAgICBmYyA9IDA7CisgIH0KKyAgZWxzZSBpZiAobi0+bnB0ciA9PSBOVUxMKQorICB7CisgICAgLyogbGVhZiwgY2FuIGRlbGV0ZSBub2RlICovCisgICAgZmMgPSAxOworICB9CisgIGVsc2UKKyAgeworICAgIHN0cnVjdCBtaWJfbGlzdF9yb290bm9kZSAqcjsKKworICAgIGlmIChuLT5ucHRyLT5ub2RlX3R5cGUgPT0gTUlCX05PREVfTFIpCisgICAgeworICAgICAgciA9IChzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKiluLT5ucHRyOworICAgICAgaWYgKHItPmNvdW50ID4gMSkKKyAgICAgIHsKKyAgICAgICAgLyogY2FuJ3QgZGVsZXRlIG5vZGUgKi8KKyAgICAgICAgZmMgPSAyOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBjb3VudCA8PSAxLCBjYW4gZGVsZXRlIG5vZGUgKi8KKyAgICAgICAgZmMgPSAxOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogb3RoZXIgbm9kZSB0eXBlICovCisgICAgICBmYyA9IDM7CisgICAgfQorICB9CisgICpmbiA9IG47CisgIHJldHVybiBmYzsKK30KKworLyoqCisgKiBSZW1vdmVzIG5vZGUgZnJvbSBpZHggbGlzdAorICogaWYgaXQgaGFzIGEgc2luZ2xlIGNoaWxkIGxlZnQuCisgKgorICogQHBhcmFtIHJuIHBvaW50cyB0byB0aGUgcm9vdCBub2RlCisgKiBAcGFyYW0gbiBwb2ludHMgdG8gdGhlIG5vZGUgdG8gZGVsZXRlCisgKiBAcmV0dXJuIHRoZSBucHRyIHRvIGJlIGZyZWVkIGJ5IGNhbGxlcgorICovCitzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKgorc25tcF9taWJfbm9kZV9kZWxldGUoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICpybiwgc3RydWN0IG1pYl9saXN0X25vZGUgKm4pCit7CisgIHN0cnVjdCBtaWJfbGlzdF9yb290bm9kZSAqbmV4dDsKKworICBMV0lQX0FTU0VSVCgicm4gIT0gTlVMTCIscm4gIT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJuICE9IE5VTEwiLG4gIT0gTlVMTCk7CisKKyAgLyogY2FsbGVyIG11c3QgcmVtb3ZlIHRoaXMgc3ViLXRyZWUgKi8KKyAgbmV4dCA9IChzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUqKShuLT5ucHRyKTsKKyAgcm4tPmNvdW50IC09IDE7CisKKyAgaWYgKG4gPT0gcm4tPmhlYWQpCisgIHsKKyAgICBybi0+aGVhZCA9IG4tPm5leHQ7CisgICAgaWYgKG4tPm5leHQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBub3QgbGFzdCBub2RlLCBuZXcgbGlzdCBiZWdpbiAqLworICAgICAgbi0+bmV4dC0+cHJldiA9IE5VTEw7CisgICAgfQorICB9CisgIGVsc2UgaWYgKG4gPT0gcm4tPnRhaWwpCisgIHsKKyAgICBybi0+dGFpbCA9IG4tPnByZXY7CisgICAgaWYgKG4tPnByZXYgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBub3QgbGFzdCBub2RlLCBuZXcgbGlzdCBlbmQgKi8KKyAgICAgIG4tPnByZXYtPm5leHQgPSBOVUxMOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub2RlIG11c3QgYmUgaW4gdGhlIG1pZGRsZSAqLworICAgIG4tPnByZXYtPm5leHQgPSBuLT5uZXh0OworICAgIG4tPm5leHQtPnByZXYgPSBuLT5wcmV2OworICB9CisgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiZnJlZSBsaXN0IG9iamlkPT0lIlMzMl9GIlxuIixuLT5vYmppZCkpOworICBzbm1wX21pYl9sbl9mcmVlKG4pOworICBpZiAocm4tPmNvdW50ID09IDApCisgIHsKKyAgICBybi0+aGVhZCA9IE5VTEw7CisgICAgcm4tPnRhaWwgPSBOVUxMOworICB9CisgIHJldHVybiBuZXh0OworfQorCisKKworLyoqCisgKiBTZWFyY2hlcyB0cmVlIGZvciB0aGUgc3VwcGxpZWQgKHNjYWxhcj8pIG9iamVjdCBpZGVudGlmaWVyLgorICoKKyAqIEBwYXJhbSBub2RlIHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZSAoJy5pbnRlcm5ldCcpCisgKiBAcGFyYW0gaWRlbnRfbGVuIHRoZSBsZW5ndGggb2YgdGhlIHN1cHBsaWVkIG9iamVjdCBpZGVudGlmaWVyCisgKiBAcGFyYW0gaWRlbnQgcG9pbnRzIHRvIHRoZSBhcnJheSBvZiBzdWIgaWRlbnRpZmllcnMKKyAqIEBwYXJhbSBucCBwb2ludHMgdG8gdGhlIGZvdW5kIG9iamVjdCBpbnN0YW5jZSAocmV0dXJuKQorICogQHJldHVybiBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgcGFyZW50ICghKSBub2RlIGlmIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3N0cnVjdCBtaWJfbm9kZSAqCitzbm1wX3NlYXJjaF90cmVlKHN0cnVjdCBtaWJfbm9kZSAqbm9kZSwgdThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IHNubXBfbmFtZV9wdHIgKm5wKQoreworICB1OF90IG5vZGVfdHlwZSwgZXh0X2xldmVsOworCisgIGV4dF9sZXZlbCA9IDA7CisgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgibm9kZT09JXAgKmlkZW50PT0lIlMzMl9GIlxuIiwodm9pZCopbm9kZSwqaWRlbnQpKTsKKyAgd2hpbGUgKG5vZGUgIT0gTlVMTCkKKyAgeworICAgIG5vZGVfdHlwZSA9IG5vZGUtPm5vZGVfdHlwZTsKKyAgICBpZiAoKG5vZGVfdHlwZSA9PSBNSUJfTk9ERV9BUikgfHwgKG5vZGVfdHlwZSA9PSBNSUJfTk9ERV9SQSkpCisgICAgeworICAgICAgc3RydWN0IG1pYl9hcnJheV9ub2RlICphbjsKKyAgICAgIHUxNl90IGk7CisKKyAgICAgIGlmIChpZGVudF9sZW4gPiAwKQorICAgICAgeworICAgICAgICAvKiBhcnJheSBub2RlIChpbnRlcm5hbCBST00gb3IgUkFNLCBmaXhlZCBsZW5ndGgpICovCisgICAgICAgIGFuID0gKHN0cnVjdCBtaWJfYXJyYXlfbm9kZSAqKW5vZGU7CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoKGkgPCBhbi0+bWF4bGVuZ3RoKSAmJiAoYW4tPm9iamlkW2ldICE9ICppZGVudCkpCisgICAgICAgIHsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPCBhbi0+bWF4bGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgLyogZm91bmQgaXQsIGlmIGF2YWlsYWJsZSBwcm9jZWVkIHRvIGNoaWxkLCBvdGhlcndpc2UgaW5zcGVjdCBsZWFmICovCisgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJhbi0+b2JqaWRbJSJVMTZfRiJdPT0lIlMzMl9GIiAqaWRlbnQ9PSUiUzMyX0YiXG4iLGksYW4tPm9iamlkW2ldLCppZGVudCkpOworICAgICAgICAgIGlmIChhbi0+bnB0cltpXSA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGEgc2NhbGFyIGxlYWYgT1IgdGFibGUsCisgICAgICAgICAgICAgICBpbnNwZWN0IHJlbWFpbmluZyBpbnN0YW5jZSBudW1iZXIgLyB0YWJsZSBpbmRleCAqLworICAgICAgICAgICAgbnAtPmlkZW50X2xlbiA9IGlkZW50X2xlbjsKKyAgICAgICAgICAgIG5wLT5pZGVudCA9IGlkZW50OworICAgICAgICAgICAgcmV0dXJuIChzdHJ1Y3QgbWliX25vZGUqKWFuOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogZm9sbG93IG5leHQgY2hpbGQgcG9pbnRlciAqLworICAgICAgICAgICAgaWRlbnQrKzsKKyAgICAgICAgICAgIGlkZW50X2xlbi0tOworICAgICAgICAgICAgbm9kZSA9IGFuLT5ucHRyW2ldOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBzZWFyY2ggZmFpbGVkLCBpZGVudGlmaWVyIG1pc21hdGNoIChub3N1Y2huYW1lKSAqLworICAgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiYW4gc2VhcmNoIGZhaWxlZCAqaWRlbnQ9PSUiUzMyX0YiXG4iLCppZGVudCkpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIHNlYXJjaCBmYWlsZWQsIHNob3J0IG9iamVjdCBpZGVudGlmaWVyIChub3N1Y2huYW1lKSAqLworICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImFuIHNlYXJjaCBmYWlsZWQsIHNob3J0IG9iamVjdCBpZGVudGlmaWVyXG4iKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKG5vZGVfdHlwZSA9PSBNSUJfTk9ERV9MUikKKyAgICB7CisgICAgICBzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKmxybjsKKyAgICAgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICpsbjsKKworICAgICAgaWYgKGlkZW50X2xlbiA+IDApCisgICAgICB7CisgICAgICAgIC8qIGxpc3Qgcm9vdCBub2RlIChpbnRlcm5hbCAnUkFNJywgdmFyaWFibGUgbGVuZ3RoKSAqLworICAgICAgICBscm4gPSAoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICopbm9kZTsKKyAgICAgICAgbG4gPSBscm4tPmhlYWQ7CisgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBsaXN0LCBoZWFkIHRvIHRhaWwgKi8KKyAgICAgICAgd2hpbGUgKChsbiAhPSBOVUxMKSAmJiAobG4tPm9iamlkICE9ICppZGVudCkpCisgICAgICAgIHsKKyAgICAgICAgICBsbiA9IGxuLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChsbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogZm91bmQgaXQsIHByb2NlZWQgdG8gY2hpbGQgKi87CisgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJsbi0+b2JqaWQ9PSUiUzMyX0YiICppZGVudD09JSJTMzJfRiJcbiIsbG4tPm9iamlkLCppZGVudCkpOworICAgICAgICAgIGlmIChsbi0+bnB0ciA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG5wLT5pZGVudF9sZW4gPSBpZGVudF9sZW47CisgICAgICAgICAgICBucC0+aWRlbnQgPSBpZGVudDsKKyAgICAgICAgICAgIHJldHVybiAoc3RydWN0IG1pYl9ub2RlKilscm47CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBmb2xsb3cgbmV4dCBjaGlsZCBwb2ludGVyICovCisgICAgICAgICAgICBpZGVudF9sZW4tLTsKKyAgICAgICAgICAgIGlkZW50Kys7CisgICAgICAgICAgICBub2RlID0gbG4tPm5wdHI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHNlYXJjaCBmYWlsZWQgKi8KKyAgICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImxuIHNlYXJjaCBmYWlsZWQgKmlkZW50PT0lIlMzMl9GIlxuIiwqaWRlbnQpKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBzZWFyY2ggZmFpbGVkLCBzaG9ydCBvYmplY3QgaWRlbnRpZmllciAobm9zdWNobmFtZSkgKi8KKyAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJsbiBzZWFyY2ggZmFpbGVkLCBzaG9ydCBvYmplY3QgaWRlbnRpZmllclxuIikpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihub2RlX3R5cGUgPT0gTUlCX05PREVfRVgpCisgICAgeworICAgICAgc3RydWN0IG1pYl9leHRlcm5hbF9ub2RlICplbjsKKyAgICAgIHUxNl90IGksIGxlbjsKKworICAgICAgaWYgKGlkZW50X2xlbiA+IDApCisgICAgICB7CisgICAgICAgIC8qIGV4dGVybmFsIG5vZGUgKGFkZHJlc3NpbmcgYW5kIGFjY2VzcyB2aWEgZnVuY3Rpb25zKSAqLworICAgICAgICBlbiA9IChzdHJ1Y3QgbWliX2V4dGVybmFsX25vZGUgKilub2RlOworCisgICAgICAgIGkgPSAwOworICAgICAgICBsZW4gPSBlbi0+bGV2ZWxfbGVuZ3RoKGVuLT5hZGRyX2luZixleHRfbGV2ZWwpOworICAgICAgICB3aGlsZSAoKGkgPCBsZW4pICYmIChlbi0+aWRlbnRfY21wKGVuLT5hZGRyX2luZixleHRfbGV2ZWwsaSwqaWRlbnQpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmIChpIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgczMyX3QgZGVidWdfaWQ7CisKKyAgICAgICAgICBlbi0+Z2V0X29iamlkKGVuLT5hZGRyX2luZixleHRfbGV2ZWwsaSwmZGVidWdfaWQpOworICAgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiZW4tPm9iamlkPT0lIlMzMl9GIiAqaWRlbnQ9PSUiUzMyX0YiXG4iLGRlYnVnX2lkLCppZGVudCkpOworICAgICAgICAgIGlmICgoZXh0X2xldmVsICsgMSkgPT0gZW4tPnRyZWVfbGV2ZWxzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG5wLT5pZGVudF9sZW4gPSBpZGVudF9sZW47CisgICAgICAgICAgICBucC0+aWRlbnQgPSBpZGVudDsKKyAgICAgICAgICAgIHJldHVybiAoc3RydWN0IG1pYl9ub2RlKillbjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZvdW5kIGl0LCBwcm9jZWVkIHRvIGNoaWxkICovCisgICAgICAgICAgICBpZGVudF9sZW4tLTsKKyAgICAgICAgICAgIGlkZW50Kys7CisgICAgICAgICAgICBleHRfbGV2ZWwrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogc2VhcmNoIGZhaWxlZCAqLworICAgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiZW4gc2VhcmNoIGZhaWxlZCAqaWRlbnQ9PSUiUzMyX0YiXG4iLCppZGVudCkpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIHNlYXJjaCBmYWlsZWQsIHNob3J0IG9iamVjdCBpZGVudGlmaWVyIChub3N1Y2huYW1lKSAqLworICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImVuIHNlYXJjaCBmYWlsZWQsIHNob3J0IG9iamVjdCBpZGVudGlmaWVyXG4iKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChub2RlX3R5cGUgPT0gTUlCX05PREVfU0MpCisgICAgeworICAgICAgbWliX3NjYWxhcl9ub2RlICpzbjsKKworICAgICAgc24gPSAobWliX3NjYWxhcl9ub2RlICopbm9kZTsKKyAgICAgIGlmICgoaWRlbnRfbGVuID09IDEpICYmICgqaWRlbnQgPT0gMCkpCisgICAgICB7CisgICAgICAgIG5wLT5pZGVudF9sZW4gPSBpZGVudF9sZW47CisgICAgICAgIG5wLT5pZGVudCA9IGlkZW50OworICAgICAgICByZXR1cm4gKHN0cnVjdCBtaWJfbm9kZSopc247CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIHNlYXJjaCBmYWlsZWQsIHNob3J0IG9iamVjdCBpZGVudGlmaWVyIChub3N1Y2huYW1lKSAqLworICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoInNlYXJjaCBmYWlsZWQsIGludmFsaWQgb2JqZWN0IGlkZW50aWZpZXIgbGVuZ3RoXG4iKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogdW5rbm93biBub2RlX3R5cGUgKi8KKyAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgic2VhcmNoIGZhaWxlZCBub2RlX3R5cGUgJSJVMTZfRiIgdW5rb3duXG4iLCh1MTZfdClub2RlX3R5cGUpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICAvKiBkb25lLCBmb3VuZCBub3RoaW5nICovCisgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgic2VhcmNoIGZhaWxlZCBub2RlPT0lcFxuIiwodm9pZCopbm9kZSkpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBUZXN0IHRhYmxlIGZvciBwcmVzZW5jZSBvZiBhdCBsZWFzdCBvbmUgdGFibGUgZW50cnkuCisgKi8KK3N0YXRpYyB1OF90CitlbXB0eV90YWJsZShzdHJ1Y3QgbWliX25vZGUgKm5vZGUpCit7CisgIHU4X3Qgbm9kZV90eXBlOworICB1OF90IGVtcHR5ID0gMDsKKworICBpZiAobm9kZSAhPSBOVUxMKQorICB7CisgICAgbm9kZV90eXBlID0gbm9kZS0+bm9kZV90eXBlOworICAgIGlmIChub2RlX3R5cGUgPT0gTUlCX05PREVfTFIpCisgICAgeworICAgICAgc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICpscm47CisgICAgICBscm4gPSAoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICopbm9kZTsKKyAgICAgIGlmICgobHJuLT5jb3VudCA9PSAwKSB8fCAobHJuLT5oZWFkID09IE5VTEwpKQorICAgICAgeworICAgICAgICBlbXB0eSA9IDE7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChub2RlX3R5cGUgPT0gTUlCX05PREVfQVIpIHx8IChub2RlX3R5cGUgPT0gTUlCX05PREVfUkEpKQorICAgIHsKKyAgICAgIHN0cnVjdCBtaWJfYXJyYXlfbm9kZSAqYW47CisgICAgICBhbiA9IChzdHJ1Y3QgbWliX2FycmF5X25vZGUgKilub2RlOworICAgICAgaWYgKChhbi0+bWF4bGVuZ3RoID09IDApIHx8IChhbi0+bnB0ciA9PSBOVUxMKSkKKyAgICAgIHsKKyAgICAgICAgZW1wdHkgPSAxOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChub2RlX3R5cGUgPT0gTUlCX05PREVfRVgpCisgICAgeworICAgICAgc3RydWN0IG1pYl9leHRlcm5hbF9ub2RlICplbjsKKyAgICAgIGVuID0gKHN0cnVjdCBtaWJfZXh0ZXJuYWxfbm9kZSAqKW5vZGU7CisgICAgICBpZiAoZW4tPnRyZWVfbGV2ZWxzID09IDApCisgICAgICB7CisgICAgICAgIGVtcHR5ID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGVtcHR5OworfQorCisvKioKKyAqIFRyZWUgZXhwYW5zaW9uLgorICovCitzdHJ1Y3QgbWliX25vZGUgKgorc25tcF9leHBhbmRfdHJlZShzdHJ1Y3QgbWliX25vZGUgKm5vZGUsIHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBzbm1wX29ial9pZCAqb2lkcmV0KQoreworICB1OF90IG5vZGVfdHlwZSwgZXh0X2xldmVsLCBjbGltYl90cmVlOworCisgIGV4dF9sZXZlbCA9IDA7CisgIC8qIHJlc2V0IG5vZGUgc3RhY2sgKi8KKyAgbm9kZV9zdGFja19jbnQgPSAwOworICB3aGlsZSAobm9kZSAhPSBOVUxMKQorICB7CisgICAgY2xpbWJfdHJlZSA9IDA7CisgICAgbm9kZV90eXBlID0gbm9kZS0+bm9kZV90eXBlOworICAgIGlmICgobm9kZV90eXBlID09IE1JQl9OT0RFX0FSKSB8fCAobm9kZV90eXBlID09IE1JQl9OT0RFX1JBKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgbWliX2FycmF5X25vZGUgKmFuOworICAgICAgdTE2X3QgaTsKKworICAgICAgLyogYXJyYXkgbm9kZSAoaW50ZXJuYWwgUk9NIG9yIFJBTSwgZml4ZWQgbGVuZ3RoKSAqLworICAgICAgYW4gPSAoc3RydWN0IG1pYl9hcnJheV9ub2RlICopbm9kZTsKKyAgICAgIGlmIChpZGVudF9sZW4gPiAwKQorICAgICAgeworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKChpIDwgYW4tPm1heGxlbmd0aCkgJiYgKGFuLT5vYmppZFtpXSA8ICppZGVudCkpCisgICAgICAgIHsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPCBhbi0+bWF4bGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJhbi0+b2JqaWRbJSJVMTZfRiJdPT0lIlMzMl9GIiAqaWRlbnQ9PSUiUzMyX0YiXG4iLGksYW4tPm9iamlkW2ldLCppZGVudCkpOworICAgICAgICAgIC8qIGFkZCBpZGVudGlmaWVyIHRvIG9pZHJldCAqLworICAgICAgICAgIG9pZHJldC0+aWRbb2lkcmV0LT5sZW5dID0gYW4tPm9iamlkW2ldOworICAgICAgICAgIChvaWRyZXQtPmxlbikrKzsKKworICAgICAgICAgIGlmIChhbi0+bnB0cltpXSA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgibGVhZiBub2RlXG4iKSk7CisgICAgICAgICAgICAvKiBsZWFmIG5vZGUgKGUuZy4gaW4gYSBmaXhlZCBzaXplIHRhYmxlKSAqLworICAgICAgICAgICAgaWYgKGFuLT5vYmppZFtpXSA+ICppZGVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIChzdHJ1Y3QgbWliX25vZGUqKWFuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKGkgKyAxKSA8IGFuLT5tYXhsZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIGFuLT5vYmppZFtpXSA9PSAqaWRlbnQgKi8KKyAgICAgICAgICAgICAgKG9pZHJldC0+bGVuKS0tOworICAgICAgICAgICAgICBvaWRyZXQtPmlkW29pZHJldC0+bGVuXSA9IGFuLT5vYmppZFtpICsgMV07CisgICAgICAgICAgICAgIChvaWRyZXQtPmxlbikrKzsKKyAgICAgICAgICAgICAgcmV0dXJuIChzdHJ1Y3QgbWliX25vZGUqKWFuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiAoaSArIDEpID09IGFuLT5tYXhsZW5ndGggKi8KKyAgICAgICAgICAgICAgKG9pZHJldC0+bGVuKS0tOworICAgICAgICAgICAgICBjbGltYl90cmVlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgajsKKyAgICAgICAgICAgIHN0cnVjdCBuc2UgY3VyX25vZGU7CisKKyAgICAgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgibm9uLWxlYWYgbm9kZVxuIikpOworICAgICAgICAgICAgLyogbm9uLWxlYWYsIHN0b3JlIHJpZ2h0IGNoaWxkIHB0ciBhbmQgaWQgKi8KKyAgICAgICAgICAgIExXSVBfQVNTRVJUKCJpIDwgMHhmZiIsIGkgPCAweGZmKTsKKyAgICAgICAgICAgIGogPSAodThfdClpICsgMTsKKyAgICAgICAgICAgIHdoaWxlICgoaiA8IGFuLT5tYXhsZW5ndGgpICYmIChlbXB0eV90YWJsZShhbi0+bnB0cltqXSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA8IGFuLT5tYXhsZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGN1cl9ub2RlLnJfcHRyID0gYW4tPm5wdHJbal07CisgICAgICAgICAgICAgIGN1cl9ub2RlLnJfaWQgPSBhbi0+b2JqaWRbal07CisgICAgICAgICAgICAgIGN1cl9ub2RlLnJfbmwgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjdXJfbm9kZS5yX3B0ciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoX25vZGUoJmN1cl9ub2RlKTsKKyAgICAgICAgICAgIGlmIChhbi0+b2JqaWRbaV0gPT0gKmlkZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZGVudF9sZW4tLTsKKyAgICAgICAgICAgICAgaWRlbnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogYW4tPm9iamlkW2ldIDwgKmlkZW50ICovCisgICAgICAgICAgICAgIGlkZW50X2xlbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBmb2xsb3cgbmV4dCBjaGlsZCBwb2ludGVyICovCisgICAgICAgICAgICBub2RlID0gYW4tPm5wdHJbaV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGkgPT0gYW4tPm1heGxlbmd0aCAqLworICAgICAgICAgIGNsaW1iX3RyZWUgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHU4X3QgajsKKyAgICAgICAgLyogaWRlbnRfbGVuID09IDAsIGNvbXBsZXRlIHdpdGggbGVmdG1vc3QgJy50aGluZycgKi8KKyAgICAgICAgaiA9IDA7CisgICAgICAgIHdoaWxlICgoaiA8IGFuLT5tYXhsZW5ndGgpICYmIGVtcHR5X3RhYmxlKGFuLT5ucHRyW2pdKSkKKyAgICAgICAgeworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoaiA8IGFuLT5tYXhsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImxlZnQgYW4tPm9iamlkW2pdPT0lIlMzMl9GIlxuIixhbi0+b2JqaWRbal0pKTsKKyAgICAgICAgICBvaWRyZXQtPmlkW29pZHJldC0+bGVuXSA9IGFuLT5vYmppZFtqXTsKKyAgICAgICAgICAob2lkcmV0LT5sZW4pKys7CisgICAgICAgICAgaWYgKGFuLT5ucHRyW2pdID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogbGVhZiBub2RlICovCisgICAgICAgICAgICByZXR1cm4gKHN0cnVjdCBtaWJfbm9kZSopYW47CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBubyBsZWFmLCBjb250aW51ZSAqLworICAgICAgICAgICAgbm9kZSA9IGFuLT5ucHRyW2pdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBqID09IGFuLT5tYXhsZW5ndGggKi8KKyAgICAgICAgICBjbGltYl90cmVlID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKG5vZGVfdHlwZSA9PSBNSUJfTk9ERV9MUikKKyAgICB7CisgICAgICBzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKmxybjsKKyAgICAgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICpsbjsKKworICAgICAgLyogbGlzdCByb290IG5vZGUgKGludGVybmFsICdSQU0nLCB2YXJpYWJsZSBsZW5ndGgpICovCisgICAgICBscm4gPSAoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICopbm9kZTsKKyAgICAgIGlmIChpZGVudF9sZW4gPiAwKQorICAgICAgeworICAgICAgICBsbiA9IGxybi0+aGVhZDsKKyAgICAgICAgLyogaXRlcmF0ZSBvdmVyIGxpc3QsIGhlYWQgdG8gdGFpbCAqLworICAgICAgICB3aGlsZSAoKGxuICE9IE5VTEwpICYmIChsbi0+b2JqaWQgPCAqaWRlbnQpKQorICAgICAgICB7CisgICAgICAgICAgbG4gPSBsbi0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAobG4gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgibG4tPm9iamlkPT0lIlMzMl9GIiAqaWRlbnQ9PSUiUzMyX0YiXG4iLGxuLT5vYmppZCwqaWRlbnQpKTsKKyAgICAgICAgICBvaWRyZXQtPmlkW29pZHJldC0+bGVuXSA9IGxuLT5vYmppZDsKKyAgICAgICAgICAob2lkcmV0LT5sZW4pKys7CisgICAgICAgICAgaWYgKGxuLT5ucHRyID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogbGVhZiBub2RlICovCisgICAgICAgICAgICBpZiAobG4tPm9iamlkID4gKmlkZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXR1cm4gKHN0cnVjdCBtaWJfbm9kZSopbHJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobG4tPm5leHQgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogbG4tPm9iamlkID09ICppZGVudCAqLworICAgICAgICAgICAgICAob2lkcmV0LT5sZW4pLS07CisgICAgICAgICAgICAgIG9pZHJldC0+aWRbb2lkcmV0LT5sZW5dID0gbG4tPm5leHQtPm9iamlkOworICAgICAgICAgICAgICAob2lkcmV0LT5sZW4pKys7CisgICAgICAgICAgICAgIHJldHVybiAoc3RydWN0IG1pYl9ub2RlKilscm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIGxuLT5uZXh0ID09IE5VTEwgKi8KKyAgICAgICAgICAgICAgKG9pZHJldC0+bGVuKS0tOworICAgICAgICAgICAgICBjbGltYl90cmVlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBtaWJfbGlzdF9ub2RlICpqbjsKKyAgICAgICAgICAgIHN0cnVjdCBuc2UgY3VyX25vZGU7CisKKyAgICAgICAgICAgIC8qIG5vbi1sZWFmLCBzdG9yZSByaWdodCBjaGlsZCBwdHIgYW5kIGlkICovCisgICAgICAgICAgICBqbiA9IGxuLT5uZXh0OworICAgICAgICAgICAgd2hpbGUgKChqbiAhPSBOVUxMKSAmJiBlbXB0eV90YWJsZShqbi0+bnB0cikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGpuID0gam4tPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam4gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY3VyX25vZGUucl9wdHIgPSBqbi0+bnB0cjsKKyAgICAgICAgICAgICAgY3VyX25vZGUucl9pZCA9IGpuLT5vYmppZDsKKyAgICAgICAgICAgICAgY3VyX25vZGUucl9ubCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGN1cl9ub2RlLnJfcHRyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hfbm9kZSgmY3VyX25vZGUpOworICAgICAgICAgICAgaWYgKGxuLT5vYmppZCA9PSAqaWRlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlkZW50X2xlbi0tOworICAgICAgICAgICAgICBpZGVudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBsbi0+b2JqaWQgPCAqaWRlbnQgKi8KKyAgICAgICAgICAgICAgaWRlbnRfbGVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGZvbGxvdyBuZXh0IGNoaWxkIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIG5vZGUgPSBsbi0+bnB0cjsKKyAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBsbiA9PSBOVUxMICovCisgICAgICAgICAgY2xpbWJfdHJlZSA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3RydWN0IG1pYl9saXN0X25vZGUgKmpuOworICAgICAgICAvKiBpZGVudF9sZW4gPT0gMCwgY29tcGxldGUgd2l0aCBsZWZ0bW9zdCAnLnRoaW5nJyAqLworICAgICAgICBqbiA9IGxybi0+aGVhZDsKKyAgICAgICAgd2hpbGUgKChqbiAhPSBOVUxMKSAmJiBlbXB0eV90YWJsZShqbi0+bnB0cikpCisgICAgICAgIHsKKyAgICAgICAgICBqbiA9IGpuLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChqbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJsZWZ0IGpuLT5vYmppZD09JSJTMzJfRiJcbiIsam4tPm9iamlkKSk7CisgICAgICAgICAgb2lkcmV0LT5pZFtvaWRyZXQtPmxlbl0gPSBqbi0+b2JqaWQ7CisgICAgICAgICAgKG9pZHJldC0+bGVuKSsrOworICAgICAgICAgIGlmIChqbi0+bnB0ciA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGxlYWYgbm9kZSAqLworICAgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJqbi0+bnB0ciA9PSBOVUxMXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gKHN0cnVjdCBtaWJfbm9kZSopbHJuOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogbm8gbGVhZiwgY29udGludWUgKi8KKyAgICAgICAgICAgIG5vZGUgPSBqbi0+bnB0cjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogam4gPT0gTlVMTCAqLworICAgICAgICAgIGNsaW1iX3RyZWUgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYobm9kZV90eXBlID09IE1JQl9OT0RFX0VYKQorICAgIHsKKyAgICAgIHN0cnVjdCBtaWJfZXh0ZXJuYWxfbm9kZSAqZW47CisgICAgICBzMzJfdCBleF9pZDsKKworICAgICAgLyogZXh0ZXJuYWwgbm9kZSAoYWRkcmVzc2luZyBhbmQgYWNjZXNzIHZpYSBmdW5jdGlvbnMpICovCisgICAgICBlbiA9IChzdHJ1Y3QgbWliX2V4dGVybmFsX25vZGUgKilub2RlOworICAgICAgaWYgKGlkZW50X2xlbiA+IDApCisgICAgICB7CisgICAgICAgIHUxNl90IGksIGxlbjsKKworICAgICAgICBpID0gMDsKKyAgICAgICAgbGVuID0gZW4tPmxldmVsX2xlbmd0aChlbi0+YWRkcl9pbmYsZXh0X2xldmVsKTsKKyAgICAgICAgd2hpbGUgKChpIDwgbGVuKSAmJiAoZW4tPmlkZW50X2NtcChlbi0+YWRkcl9pbmYsZXh0X2xldmVsLGksKmlkZW50KSA8IDApKQorICAgICAgICB7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmIChpIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgLyogYWRkIGlkZW50aWZpZXIgdG8gb2lkcmV0ICovCisgICAgICAgICAgZW4tPmdldF9vYmppZChlbi0+YWRkcl9pbmYsZXh0X2xldmVsLGksJmV4X2lkKTsKKyAgICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImVuLT5vYmppZFslIlUxNl9GIl09PSUiUzMyX0YiICppZGVudD09JSJTMzJfRiJcbiIsaSxleF9pZCwqaWRlbnQpKTsKKyAgICAgICAgICBvaWRyZXQtPmlkW29pZHJldC0+bGVuXSA9IGV4X2lkOworICAgICAgICAgIChvaWRyZXQtPmxlbikrKzsKKworICAgICAgICAgIGlmICgoZXh0X2xldmVsICsgMSkgPT0gZW4tPnRyZWVfbGV2ZWxzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgibGVhZiBub2RlXG4iKSk7CisgICAgICAgICAgICAvKiBsZWFmIG5vZGUgKi8KKyAgICAgICAgICAgIGlmIChleF9pZCA+ICppZGVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIChzdHJ1Y3QgbWliX25vZGUqKWVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKGkgKyAxKSA8IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogZXhfaWQgPT0gKmlkZW50ICovCisgICAgICAgICAgICAgIGVuLT5nZXRfb2JqaWQoZW4tPmFkZHJfaW5mLGV4dF9sZXZlbCxpICsgMSwmZXhfaWQpOworICAgICAgICAgICAgICAob2lkcmV0LT5sZW4pLS07CisgICAgICAgICAgICAgIG9pZHJldC0+aWRbb2lkcmV0LT5sZW5dID0gZXhfaWQ7CisgICAgICAgICAgICAgIChvaWRyZXQtPmxlbikrKzsKKyAgICAgICAgICAgICAgcmV0dXJuIChzdHJ1Y3QgbWliX25vZGUqKWVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiAoaSArIDEpID09IGxlbiAqLworICAgICAgICAgICAgICAob2lkcmV0LT5sZW4pLS07CisgICAgICAgICAgICAgIGNsaW1iX3RyZWUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgdThfdCBqOworICAgICAgICAgICAgc3RydWN0IG5zZSBjdXJfbm9kZTsKKworICAgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJub24tbGVhZiBub2RlXG4iKSk7CisgICAgICAgICAgICAvKiBub24tbGVhZiwgc3RvcmUgcmlnaHQgY2hpbGQgcHRyIGFuZCBpZCAqLworICAgICAgICAgICAgTFdJUF9BU1NFUlQoImkgPCAweGZmIiwgaSA8IDB4ZmYpOworICAgICAgICAgICAgaiA9ICh1OF90KWkgKyAxOworICAgICAgICAgICAgaWYgKGogPCBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIHJpZ2h0IG5vZGUgaXMgdGhlIGN1cnJlbnQgZXh0ZXJuYWwgbm9kZSAqLworICAgICAgICAgICAgICBjdXJfbm9kZS5yX3B0ciA9IG5vZGU7CisgICAgICAgICAgICAgIGVuLT5nZXRfb2JqaWQoZW4tPmFkZHJfaW5mLGV4dF9sZXZlbCxqLCZjdXJfbm9kZS5yX2lkKTsKKyAgICAgICAgICAgICAgY3VyX25vZGUucl9ubCA9IGV4dF9sZXZlbCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGN1cl9ub2RlLnJfcHRyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hfbm9kZSgmY3VyX25vZGUpOworICAgICAgICAgICAgaWYgKGVuLT5pZGVudF9jbXAoZW4tPmFkZHJfaW5mLGV4dF9sZXZlbCxpLCppZGVudCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWRlbnRfbGVuLS07CisgICAgICAgICAgICAgIGlkZW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIGV4dGVybmFsIGlkIDwgKmlkZW50ICovCisgICAgICAgICAgICAgIGlkZW50X2xlbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBwcm9jZWVkIHRvIGNoaWxkICovCisgICAgICAgICAgICBleHRfbGV2ZWwrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogaSA9PSBsZW4gKGVuLT5sZXZlbF9sZW4oKSkgKi8KKyAgICAgICAgICBjbGltYl90cmVlID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBpZGVudF9sZW4gPT0gMCwgY29tcGxldGUgd2l0aCBsZWZ0bW9zdCAnLnRoaW5nJyAqLworICAgICAgICBlbi0+Z2V0X29iamlkKGVuLT5hZGRyX2luZixleHRfbGV2ZWwsMCwmZXhfaWQpOworICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01JQl9ERUJVRywoImxlZnQgZW4tPm9iamlkPT0lIlMzMl9GIlxuIixleF9pZCkpOworICAgICAgICBvaWRyZXQtPmlkW29pZHJldC0+bGVuXSA9IGV4X2lkOworICAgICAgICAob2lkcmV0LT5sZW4pKys7CisgICAgICAgIGlmICgoZXh0X2xldmVsICsgMSkgPT0gZW4tPnRyZWVfbGV2ZWxzKQorICAgICAgICB7CisgICAgICAgICAgLyogbGVhZiBub2RlICovCisgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCIoZXh0X2xldmVsICsgMSkgPT0gZW4tPnRyZWVfbGV2ZWxzXG4iKSk7CisgICAgICAgICAgcmV0dXJuIChzdHJ1Y3QgbWliX25vZGUqKWVuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIG5vIGxlYWYsIHByb2NlZWQgdG8gY2hpbGQgKi8KKyAgICAgICAgICBleHRfbGV2ZWwrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKG5vZGVfdHlwZSA9PSBNSUJfTk9ERV9TQykKKyAgICB7CisgICAgICBtaWJfc2NhbGFyX25vZGUgKnNuOworCisgICAgICAvKiBzY2FsYXIgbm9kZSAgKi8KKyAgICAgIHNuID0gKG1pYl9zY2FsYXJfbm9kZSAqKW5vZGU7CisgICAgICBpZiAoaWRlbnRfbGVuID4gMCkKKyAgICAgIHsKKyAgICAgICAgLyogYXQgLjAgKi8KKyAgICAgICAgY2xpbWJfdHJlZSA9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIGlkZW50X2xlbiA9PSAwLCBjb21wbGV0ZSBvYmplY3QgaWRlbnRpZmllciAqLworICAgICAgICBvaWRyZXQtPmlkW29pZHJldC0+bGVuXSA9IDA7CisgICAgICAgIChvaWRyZXQtPmxlbikrKzsKKyAgICAgICAgLyogbGVhZiBub2RlICovCisgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiY29tcGxldGVkIHNjYWxhciBsZWFmXG4iKSk7CisgICAgICAgIHJldHVybiAoc3RydWN0IG1pYl9ub2RlKilzbjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIHVua25vd24vdW5oYW5kbGVkIG5vZGVfdHlwZSAqLworICAgICAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJleHBhbmQgZmFpbGVkIG5vZGVfdHlwZSAlIlUxNl9GIiB1bmtvd25cbiIsKHUxNl90KW5vZGVfdHlwZSkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGNsaW1iX3RyZWUpCisgICAgeworICAgICAgc3RydWN0IG5zZSBjaGlsZDsKKworICAgICAgLyogZmluZCByaWdodCBjaGlsZCBwdHIgKi8KKyAgICAgIGNoaWxkLnJfcHRyID0gTlVMTDsKKyAgICAgIGNoaWxkLnJfaWQgPSAwOworICAgICAgY2hpbGQucl9ubCA9IDA7CisgICAgICB3aGlsZSAoKG5vZGVfc3RhY2tfY250ID4gMCkgJiYgKGNoaWxkLnJfcHRyID09IE5VTEwpKQorICAgICAgeworICAgICAgICBwb3Bfbm9kZSgmY2hpbGQpOworICAgICAgICAvKiB0cmltIHJldHVybmVkIG9pZCAqLworICAgICAgICAob2lkcmV0LT5sZW4pLS07CisgICAgICB9CisgICAgICBpZiAoY2hpbGQucl9wdHIgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgLyogaW5jb21pbmcgaWRlbnQgaXMgdXNlbGVzcyBiZXlvbmQgdGhpcyBwb2ludCAqLworICAgICAgICBpZGVudF9sZW4gPSAwOworICAgICAgICBvaWRyZXQtPmlkW29pZHJldC0+bGVuXSA9IGNoaWxkLnJfaWQ7CisgICAgICAgIG9pZHJldC0+bGVuKys7CisgICAgICAgIG5vZGUgPSBjaGlsZC5yX3B0cjsKKyAgICAgICAgZXh0X2xldmVsID0gY2hpbGQucl9ubDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogdHJlZSBlbmRzIGhlcmUgLi4uICovCisgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTUlCX0RFQlVHLCgiZXhwYW5kIGZhaWxlZCwgdHJlZSBlbmRzIGhlcmVcbiIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIGRvbmUsIGZvdW5kIG5vdGhpbmcgKi8KKyAgTFdJUF9ERUJVR0YoU05NUF9NSUJfREVCVUcsKCJleHBhbmQgZmFpbGVkIG5vZGU9PSVwXG4iLCh2b2lkKilub2RlKSk7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFRlc3Qgb2JqZWN0IGlkZW50aWZpZXIgZm9yIHRoZSBpc28ub3JnLmRvZC5pbnRlcm5ldCBwcmVmaXguCisgKgorICogQHBhcmFtIGlkZW50X2xlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdXBwbGllZCBvYmplY3QgaWRlbnRpZmllcgorICogQHBhcmFtIGlkZW50IHBvaW50cyB0byB0aGUgYXJyYXkgb2Ygc3ViIGlkZW50aWZpZXJzCisgKiBAcmV0dXJuIDEgaWYgaXQgbWF0Y2hlcywgMCBvdGhlcndpc2UKKyAqLwordThfdAorc25tcF9pc29fcHJlZml4X3RzdCh1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50KQoreworICBpZiAoKGlkZW50X2xlbiA+IDMpICYmCisgICAgICAoaWRlbnRbMF0gPT0gMSkgJiYgKGlkZW50WzFdID09IDMpICYmCisgICAgICAoaWRlbnRbMl0gPT0gNikgJiYgKGlkZW50WzNdID09IDEpKQorICB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworLyoqCisgKiBFeHBhbmRzIG9iamVjdCBpZGVudGlmaWVyIHRvIHRoZSBpc28ub3JnLmRvZC5pbnRlcm5ldAorICogcHJlZml4IGZvciB1c2UgaW4gZ2V0bmV4dCBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGlkZW50X2xlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdXBwbGllZCBvYmplY3QgaWRlbnRpZmllcgorICogQHBhcmFtIGlkZW50IHBvaW50cyB0byB0aGUgYXJyYXkgb2Ygc3ViIGlkZW50aWZpZXJzCisgKiBAcGFyYW0gb2lkcmV0IHBvaW50cyB0byByZXR1cm5lZCBleHBhbmRlZCBvYmplY3QgaWRlbnRpZmllcgorICogQHJldHVybiAxIGlmIGl0IG1hdGNoZXMsIDAgb3RoZXJ3aXNlCisgKgorICogQG5vdGUgaWRlbnRfbGVuIDAgaXMgYWxsb3dlZCwgZXhwYW5kaW5nIHRvIHRoZSBmaXJzdCBrbm93biBvYmplY3QgaWQhIQorICovCit1OF90Citzbm1wX2lzb19wcmVmaXhfZXhwYW5kKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBzbm1wX29ial9pZCAqb2lkcmV0KQoreworICBjb25zdCBzMzJfdCAqcHJlZml4X3B0cjsKKyAgczMyX3QgKnJldF9wdHI7CisgIHU4X3QgaTsKKworICBpID0gMDsKKyAgcHJlZml4X3B0ciA9ICZwcmVmaXhbMF07CisgIHJldF9wdHIgPSAmb2lkcmV0LT5pZFswXTsKKyAgaWRlbnRfbGVuID0gKChpZGVudF9sZW4gPCA0KT9pZGVudF9sZW46NCk7CisgIHdoaWxlICgoaSA8IGlkZW50X2xlbikgJiYgKCgqaWRlbnQpIDw9ICgqcHJlZml4X3B0cikpKQorICB7CisgICAgKnJldF9wdHIrKyA9ICpwcmVmaXhfcHRyKys7CisgICAgaWRlbnQrKzsKKyAgICBpKys7CisgIH0KKyAgaWYgKGkgPT0gaWRlbnRfbGVuKQorICB7CisgICAgLyogbWF0Y2gsIGNvbXBsZXRlIG1pc3NpbmcgYml0cyAqLworICAgIHdoaWxlIChpIDwgNCkKKyAgICB7CisgICAgICAqcmV0X3B0cisrID0gKnByZWZpeF9wdHIrKzsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgb2lkcmV0LT5sZW4gPSBpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIGkgIT0gaWRlbnRfbGVuICovCisgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2VuZGlmIC8qIExXSVBfU05NUCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL3NubXAvbXNnX2luLmMgYi9jb3JlL2x3aXAvc3JjL2NvcmUvc25tcC9tc2dfaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGZiNTViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL3NubXAvbXNnX2luLmMKQEAgLTAsMCArMSwxNDM3IEBACisvKioKKyAqIEBmaWxlCisgKiBTTk1QIGlucHV0IG1lc3NhZ2UgcHJvY2Vzc2luZyAoUkZDMTE1NykuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBBeG9uIERpZ2l0YWwgRGVzaWduIEIuVi4sIFRoZSBOZXRoZXJsYW5kcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBBdXRob3I6IENocmlzdGlhYW4gU2ltb25zIDxjaHJpc3RpYWFuLnNpbW9uc0BheG9uLnR2PgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9TTk1QIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9zbm1wLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wX2FzbjEuaCIKKyNpbmNsdWRlICJsd2lwL3NubXBfbXNnLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wX3N0cnVjdHMuaCIKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKyNpbmNsdWRlICJsd2lwL21lbXAuaCIKKyNpbmNsdWRlICJsd2lwL3VkcC5oIgorI2luY2x1ZGUgImx3aXAvc3RhdHMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBwdWJsaWMgKG5vbi1zdGF0aWMpIGNvbnN0YW50cyAqLworLyoqIFNOTVAgdjEgPT0gMCAqLworY29uc3QgczMyX3Qgc25tcF92ZXJzaW9uID0gMDsKKy8qKiBkZWZhdWx0IFNOTVAgY29tbXVuaXR5IHN0cmluZyAqLworY29uc3QgY2hhciBzbm1wX3B1YmxpY2NvbW11bml0eVs3XSA9ICJwdWJsaWMiOworCisvKiBzdGF0aWNhbGx5IGFsbG9jYXRlZCBidWZmZXJzIGZvciBTTk1QX0NPTkNVUlJFTlRfUkVRVUVTVFMgKi8KK3N0cnVjdCBzbm1wX21zZ19wc3RhdCBtc2dfaW5wdXRfbGlzdFtTTk1QX0NPTkNVUlJFTlRfUkVRVUVTVFNdOworLyogVURQIFByb3RvY29sIENvbnRyb2wgQmxvY2sgKi8KK3N0cnVjdCB1ZHBfcGNiICpzbm1wMV9wY2I7CisKK3N0YXRpYyB2b2lkIHNubXBfcmVjdih2b2lkICphcmcsIHN0cnVjdCB1ZHBfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKmFkZHIsIHUxNl90IHBvcnQpOworc3RhdGljIGVycl90IHNubXBfcGR1X2hlYWRlcl9jaGVjayhzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1MTZfdCBwZHVfbGVuLCB1MTZfdCAqb2ZzX3JldCwgc3RydWN0IHNubXBfbXNnX3BzdGF0ICptX3N0YXQpOworc3RhdGljIGVycl90IHNubXBfcGR1X2RlY192YXJiaW5kbGlzdChzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1MTZfdCAqb2ZzX3JldCwgc3RydWN0IHNubXBfbXNnX3BzdGF0ICptX3N0YXQpOworCisKKy8qKgorICogU3RhcnRzIFNOTVAgQWdlbnQuCisgKiBBbGxvY2F0ZXMgVURQIHBjYiBhbmQgYmluZHMgaXQgdG8gSVBfQUREUl9BTlkgcG9ydCAxNjEuCisgKi8KK3ZvaWQKK3NubXBfaW5pdCh2b2lkKQoreworICBzdHJ1Y3Qgc25tcF9tc2dfcHN0YXQgKm1zZ19wczsKKyAgdThfdCBpOworCisgIHNubXAxX3BjYiA9IHVkcF9uZXcoKTsKKyAgaWYgKHNubXAxX3BjYiAhPSBOVUxMKQorICB7CisgICAgdWRwX3JlY3Yoc25tcDFfcGNiLCBzbm1wX3JlY3YsICh2b2lkICopU05NUF9JTl9QT1JUKTsKKyAgICB1ZHBfYmluZChzbm1wMV9wY2IsIElQX0FERFJfQU5ZLCBTTk1QX0lOX1BPUlQpOworICB9CisgIG1zZ19wcyA9ICZtc2dfaW5wdXRfbGlzdFswXTsKKyAgZm9yIChpPTA7IGk8U05NUF9DT05DVVJSRU5UX1JFUVVFU1RTOyBpKyspCisgIHsKKyAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfRU1QVFk7CisgICAgbXNnX3BzLT5lcnJvcl9pbmRleCA9IDA7CisgICAgbXNnX3BzLT5lcnJvcl9zdGF0dXMgPSBTTk1QX0VTX05PRVJST1I7CisgICAgbXNnX3BzKys7CisgIH0KKyAgdHJhcF9tc2cucGNiID0gc25tcDFfcGNiOworCisjaWZkZWYgU05NUF9QUklWQVRFX01JQl9JTklUCisgIC8qIElmIGRlZmluZWQsIHJoaXMgbXVzdCBiZSBhIGZ1bmN0aW9uLWxpa2UgZGVmaW5lIHRvIGluaXRpYWxpemUgdGhlCisgICAqIHByaXZhdGUgTUlCIGFmdGVyIHRoZSBzdGFjayBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICogVGhlIHByaXZhdGUgTUlCIGNhbiBhbHNvIGJlIGluaXRpYWxpemVkIGluIHRjcGlwX2NhbGxiYWNrIChvciBhZnRlcgorICAgKiB0aGUgc3RhY2sgaXMgaW5pdGlhbGl6ZWQpLCB0aGlzIGRlZmluZSBpcyBvbmx5IGZvciBjb252ZW5pZW5jZS4gKi8KKyAgU05NUF9QUklWQVRFX01JQl9JTklUKCk7CisjZW5kaWYgLyogU05NUF9QUklWQVRFX01JQl9JTklUICovCisKKyAgLyogVGhlIGNvbGRzdGFydCB0cmFwIHdpbGwgb25seSBiZSBvdXRwdXQKKyAgICAgaWYgb3VyIG91dGdvaW5nIGludGVyZmFjZSBpcyB1cCAmIGNvbmZpZ3VyZWQgICovCisgIHNubXBfY29sZHN0YXJ0X3RyYXAoKTsKK30KKworc3RhdGljIHZvaWQKK3NubXBfZXJyb3JfcmVzcG9uc2Uoc3RydWN0IHNubXBfbXNnX3BzdGF0ICptc2dfcHMsIHU4X3QgZXJyb3IpCit7CisgIHNubXBfdmFyYmluZF9saXN0X2ZyZWUoJm1zZ19wcy0+b3V0dmIpOworICBtc2dfcHMtPm91dHZiID0gbXNnX3BzLT5pbnZiOworICBtc2dfcHMtPmludmIuaGVhZCA9IE5VTEw7CisgIG1zZ19wcy0+aW52Yi50YWlsID0gTlVMTDsKKyAgbXNnX3BzLT5pbnZiLmNvdW50ID0gMDsKKyAgbXNnX3BzLT5lcnJvcl9zdGF0dXMgPSBlcnJvcjsKKyAgbXNnX3BzLT5lcnJvcl9pbmRleCA9IDEgKyBtc2dfcHMtPnZiX2lkeDsKKyAgc25tcF9zZW5kX3Jlc3BvbnNlKG1zZ19wcyk7CisgIHNubXBfdmFyYmluZF9saXN0X2ZyZWUoJm1zZ19wcy0+b3V0dmIpOworICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfRU1QVFk7Cit9CisKK3N0YXRpYyB2b2lkCitzbm1wX29rX3Jlc3BvbnNlKHN0cnVjdCBzbm1wX21zZ19wc3RhdCAqbXNnX3BzKQoreworICBlcnJfdCBlcnJfcmV0OworCisgIGVycl9yZXQgPSBzbm1wX3NlbmRfcmVzcG9uc2UobXNnX3BzKTsKKyAgaWYgKGVycl9yZXQgPT0gRVJSX01FTSkKKyAgeworICAgIC8qIHNlcmlvdXMgbWVtb3J5IHByb2JsZW0sIGNhbid0IHJldHVybiB0b29CaWcgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICBMV0lQX0RFQlVHRihTTk1QX01TR19ERUJVRywgKCJzbm1wX21zZ19ldmVudCA9ICUiUzMyX0YiXG4iLG1zZ19wcy0+ZXJyb3Jfc3RhdHVzKSk7CisgIH0KKyAgLyogZnJlZSB2YXJiaW5kcyAoaWYgYXZhaWxhYmxlKSAqLworICBzbm1wX3ZhcmJpbmRfbGlzdF9mcmVlKCZtc2dfcHMtPmludmIpOworICBzbm1wX3ZhcmJpbmRfbGlzdF9mcmVlKCZtc2dfcHMtPm91dHZiKTsKKyAgbXNnX3BzLT5zdGF0ZSA9IFNOTVBfTVNHX0VNUFRZOworfQorCisvKioKKyAqIFNlcnZpY2UgYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZXZlbnQgZm9yIFNOTVAgR0VULgorICoKKyAqIEBwYXJhbSByZXF1ZXN0X2lkIGlkZW50aWZpZXMgcmVxdWVzdHMgZnJvbSAwIHRvIChTTk1QX0NPTkNVUlJFTlRfUkVRVUVTVFMtMSkKKyAqIEBwYXJhbSBtc2dfcHMgcG9pbnRzIHRvIHRoZSBhc3Nvc2ljYXRlZCBtZXNzYWdlIHByb2Nlc3Mgc3RhdGUKKyAqLworc3RhdGljIHZvaWQKK3NubXBfbXNnX2dldF9ldmVudCh1OF90IHJlcXVlc3RfaWQsIHN0cnVjdCBzbm1wX21zZ19wc3RhdCAqbXNnX3BzKQoreworICBMV0lQX0RFQlVHRihTTk1QX01TR19ERUJVRywgKCJzbm1wX21zZ19nZXRfZXZlbnQ6IG1zZ19wcy0+c3RhdGU9PSUiVTE2X0YiXG4iLCh1MTZfdCltc2dfcHMtPnN0YXRlKSk7CisKKyAgaWYgKG1zZ19wcy0+c3RhdGUgPT0gU05NUF9NU0dfRVhURVJOQUxfR0VUX09CSkRFRikKKyAgeworICAgIHN0cnVjdCBtaWJfZXh0ZXJuYWxfbm9kZSAqZW47CisgICAgc3RydWN0IHNubXBfbmFtZV9wdHIgbnA7CisKKyAgICAvKiBnZXRfb2JqZWN0X2RlZigpIGFuc3dlciovCisgICAgZW4gPSBtc2dfcHMtPmV4dF9taWJfbm9kZTsKKyAgICBucCA9IG1zZ19wcy0+ZXh0X25hbWVfcHRyOworCisgICAgLyogdHJhbnNsYXRlIGFuc3dlciBpbnRvIGEga25vd24gbGlmZWZvcm0gKi8KKyAgICBlbi0+Z2V0X29iamVjdF9kZWZfYShyZXF1ZXN0X2lkLCBucC5pZGVudF9sZW4sIG5wLmlkZW50LCAmbXNnX3BzLT5leHRfb2JqZWN0X2RlZik7CisgICAgaWYgKChtc2dfcHMtPmV4dF9vYmplY3RfZGVmLmluc3RhbmNlICE9IE1JQl9PQkpFQ1RfTk9ORSkgJiYKKyAgICAgICAgKG1zZ19wcy0+ZXh0X29iamVjdF9kZWYuYWNjZXNzICYgTUlCX0FDQ0VTU19SRUFEKSkKKyAgICB7CisgICAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfRVhURVJOQUxfR0VUX1ZBTFVFOworICAgICAgZW4tPmdldF92YWx1ZV9xKHJlcXVlc3RfaWQsICZtc2dfcHMtPmV4dF9vYmplY3RfZGVmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGVuLT5nZXRfb2JqZWN0X2RlZl9wYyhyZXF1ZXN0X2lkLCBucC5pZGVudF9sZW4sIG5wLmlkZW50KTsKKyAgICAgIC8qIHNlYXJjaCBmYWlsZWQsIG9iamVjdCBpZCBwb2ludHMgdG8gdW5rbm93biBvYmplY3QgKG5vc3VjaG5hbWUpICovCisgICAgICBzbm1wX2Vycm9yX3Jlc3BvbnNlKG1zZ19wcyxTTk1QX0VTX05PU1VDSE5BTUUpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChtc2dfcHMtPnN0YXRlID09IFNOTVBfTVNHX0VYVEVSTkFMX0dFVF9WQUxVRSkKKyAgeworICAgIHN0cnVjdCBtaWJfZXh0ZXJuYWxfbm9kZSAqZW47CisgICAgc3RydWN0IHNubXBfdmFyYmluZCAqdmI7CisKKyAgICAvKiBnZXRfdmFsdWUoKSBhbnN3ZXIgKi8KKyAgICBlbiA9IG1zZ19wcy0+ZXh0X21pYl9ub2RlOworCisgICAgLyogYWxsb2NhdGUgb3V0cHV0IHZhcmJpbmQgKi8KKyAgICB2YiA9IChzdHJ1Y3Qgc25tcF92YXJiaW5kICopbWVtcF9tYWxsb2MoTUVNUF9TTk1QX1ZBUkJJTkQpOworICAgIExXSVBfQVNTRVJUKCJ2YiAhPSBOVUxMIix2YiAhPSBOVUxMKTsKKyAgICBpZiAodmIgIT0gTlVMTCkKKyAgICB7CisgICAgICB2Yi0+bmV4dCA9IE5VTEw7CisgICAgICB2Yi0+cHJldiA9IE5VTEw7CisKKyAgICAgIC8qIG1vdmUgbmFtZSBmcm9tIGludmIgdG8gb3V0dmIgKi8KKyAgICAgIHZiLT5pZGVudCA9IG1zZ19wcy0+dmJfcHRyLT5pZGVudDsKKyAgICAgIHZiLT5pZGVudF9sZW4gPSBtc2dfcHMtPnZiX3B0ci0+aWRlbnRfbGVuOworICAgICAgLyogZW5zdXJlIHRoaXMgbWVtb3J5IGlzIHJlZmVyZWNlZCBvbmNlIG9ubHkgKi8KKyAgICAgIG1zZ19wcy0+dmJfcHRyLT5pZGVudCA9IE5VTEw7CisgICAgICBtc2dfcHMtPnZiX3B0ci0+aWRlbnRfbGVuID0gMDsKKworICAgICAgdmItPnZhbHVlX3R5cGUgPSBtc2dfcHMtPmV4dF9vYmplY3RfZGVmLmFzbl90eXBlOworICAgICAgTFdJUF9BU1NFUlQoImludmFsaWQgbGVuZ3RoIiwgbXNnX3BzLT5leHRfb2JqZWN0X2RlZi52X2xlbiA8PSAweGZmKTsKKyAgICAgIHZiLT52YWx1ZV9sZW4gPSAodThfdCltc2dfcHMtPmV4dF9vYmplY3RfZGVmLnZfbGVuOworICAgICAgaWYgKHZiLT52YWx1ZV9sZW4gPiAwKQorICAgICAgeworICAgICAgICBMV0lQX0FTU0VSVCgiU05NUF9NQVhfT0NURVRfU1RSSU5HX0xFTiBpcyBjb25maWd1cmVkIHRvbyBsb3ciLCB2Yi0+dmFsdWVfbGVuIDw9IFNOTVBfTUFYX1ZBTFVFX1NJWkUpOworICAgICAgICB2Yi0+dmFsdWUgPSBtZW1wX21hbGxvYyhNRU1QX1NOTVBfVkFMVUUpOworICAgICAgICBMV0lQX0FTU0VSVCgidmItPnZhbHVlICE9IE5VTEwiLHZiLT52YWx1ZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKHZiLT52YWx1ZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZW4tPmdldF92YWx1ZV9hKHJlcXVlc3RfaWQsICZtc2dfcHMtPmV4dF9vYmplY3RfZGVmLCB2Yi0+dmFsdWVfbGVuLCB2Yi0+dmFsdWUpOworICAgICAgICAgIHNubXBfdmFyYmluZF90YWlsX2FkZCgmbXNnX3BzLT5vdXR2YiwgdmIpOworICAgICAgICAgIC8qIHNlYXJjaCBhZ2FpbiAoaWYgdmJfaWR4IDwgbXNnX3BzLT5pbnZiLmNvdW50KSAqLworICAgICAgICAgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19TRUFSQ0hfT0JKOworICAgICAgICAgIG1zZ19wcy0+dmJfaWR4ICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZW4tPmdldF92YWx1ZV9wYyhyZXF1ZXN0X2lkLCAmbXNnX3BzLT5leHRfb2JqZWN0X2RlZik7CisgICAgICAgICAgTFdJUF9ERUJVR0YoU05NUF9NU0dfREVCVUcsICgic25tcF9tc2dfZXZlbnQ6IG5vIHZhcmlhYmxlIHNwYWNlXG4iKSk7CisgICAgICAgICAgbXNnX3BzLT52Yl9wdHItPmlkZW50ID0gdmItPmlkZW50OworICAgICAgICAgIG1zZ19wcy0+dmJfcHRyLT5pZGVudF9sZW4gPSB2Yi0+aWRlbnRfbGVuOworICAgICAgICAgIG1lbXBfZnJlZShNRU1QX1NOTVBfVkFSQklORCwgdmIpOworICAgICAgICAgIHNubXBfZXJyb3JfcmVzcG9uc2UobXNnX3BzLFNOTVBfRVNfVE9PQklHKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiB2Yi0+dmFsdWVfbGVuID09IDAsIGVtcHR5IHZhbHVlIChlLmcuIGVtcHR5IHN0cmluZykgKi8KKyAgICAgICAgZW4tPmdldF92YWx1ZV9hKHJlcXVlc3RfaWQsICZtc2dfcHMtPmV4dF9vYmplY3RfZGVmLCAwLCBOVUxMKTsKKyAgICAgICAgdmItPnZhbHVlID0gTlVMTDsKKyAgICAgICAgc25tcF92YXJiaW5kX3RhaWxfYWRkKCZtc2dfcHMtPm91dHZiLCB2Yik7CisgICAgICAgIC8qIHNlYXJjaCBhZ2FpbiAoaWYgdmJfaWR4IDwgbXNnX3BzLT5pbnZiLmNvdW50KSAqLworICAgICAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfU0VBUkNIX09CSjsKKyAgICAgICAgbXNnX3BzLT52Yl9pZHggKz0gMTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGVuLT5nZXRfdmFsdWVfcGMocmVxdWVzdF9pZCwgJm1zZ19wcy0+ZXh0X29iamVjdF9kZWYpOworICAgICAgTFdJUF9ERUJVR0YoU05NUF9NU0dfREVCVUcsICgic25tcF9tc2dfZXZlbnQ6IG5vIG91dHZiIHNwYWNlXG4iKSk7CisgICAgICBzbm1wX2Vycm9yX3Jlc3BvbnNlKG1zZ19wcyxTTk1QX0VTX1RPT0JJRyk7CisgICAgfQorICB9CisKKyAgd2hpbGUgKChtc2dfcHMtPnN0YXRlID09IFNOTVBfTVNHX1NFQVJDSF9PQkopICYmCisgICAgICAgICAobXNnX3BzLT52Yl9pZHggPCBtc2dfcHMtPmludmIuY291bnQpKQorICB7CisgICAgc3RydWN0IG1pYl9ub2RlICptbjsKKyAgICBzdHJ1Y3Qgc25tcF9uYW1lX3B0ciBucDsKKworICAgIGlmIChtc2dfcHMtPnZiX2lkeCA9PSAwKQorICAgIHsKKyAgICAgIG1zZ19wcy0+dmJfcHRyID0gbXNnX3BzLT5pbnZiLmhlYWQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBtc2dfcHMtPnZiX3B0ciA9IG1zZ19wcy0+dmJfcHRyLT5uZXh0OworICAgIH0KKyAgICAvKiogdGVzdCBvYmplY3QgaWRlbnRpZmllciBmb3IgLmlzby5vcmcuZG9kLmludGVybmV0IHByZWZpeCAqLworICAgIGlmIChzbm1wX2lzb19wcmVmaXhfdHN0KG1zZ19wcy0+dmJfcHRyLT5pZGVudF9sZW4sICBtc2dfcHMtPnZiX3B0ci0+aWRlbnQpKQorICAgIHsKKyAgICAgIG1uID0gc25tcF9zZWFyY2hfdHJlZSgoc3RydWN0IG1pYl9ub2RlKikmaW50ZXJuZXQsIG1zZ19wcy0+dmJfcHRyLT5pZGVudF9sZW4gLSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfcHMtPnZiX3B0ci0+aWRlbnQgKyA0LCAmbnApOworICAgICAgaWYgKG1uICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGlmIChtbi0+bm9kZV90eXBlID09IE1JQl9OT0RFX0VYKQorICAgICAgICB7CisgICAgICAgICAgLyogZXh0ZXJuYWwgb2JqZWN0ICovCisgICAgICAgICAgc3RydWN0IG1pYl9leHRlcm5hbF9ub2RlICplbiA9IChzdHJ1Y3QgbWliX2V4dGVybmFsX25vZGUqKW1uOworCisgICAgICAgICAgbXNnX3BzLT5zdGF0ZSA9IFNOTVBfTVNHX0VYVEVSTkFMX0dFVF9PQkpERUY7CisgICAgICAgICAgLyogc2F2ZSBlbiAmJiBhcmdzIGluIG1zZ19wcyEhICovCisgICAgICAgICAgbXNnX3BzLT5leHRfbWliX25vZGUgPSBlbjsKKyAgICAgICAgICBtc2dfcHMtPmV4dF9uYW1lX3B0ciA9IG5wOworCisgICAgICAgICAgZW4tPmdldF9vYmplY3RfZGVmX3EoZW4tPmFkZHJfaW5mLCByZXF1ZXN0X2lkLCBucC5pZGVudF9sZW4sIG5wLmlkZW50KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBpbnRlcm5hbCBvYmplY3QgKi8KKyAgICAgICAgICBzdHJ1Y3Qgb2JqX2RlZiBvYmplY3RfZGVmOworCisgICAgICAgICAgbXNnX3BzLT5zdGF0ZSA9IFNOTVBfTVNHX0lOVEVSTkFMX0dFVF9PQkpERUY7CisgICAgICAgICAgbW4tPmdldF9vYmplY3RfZGVmKG5wLmlkZW50X2xlbiwgbnAuaWRlbnQsICZvYmplY3RfZGVmKTsKKyAgICAgICAgICBpZiAoKG9iamVjdF9kZWYuaW5zdGFuY2UgIT0gTUlCX09CSkVDVF9OT05FKSAmJgorICAgICAgICAgICAgKG9iamVjdF9kZWYuYWNjZXNzICYgTUlCX0FDQ0VTU19SRUFEKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBtbiA9IG1uOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogc2VhcmNoIGZhaWxlZCwgb2JqZWN0IGlkIHBvaW50cyB0byB1bmtub3duIG9iamVjdCAobm9zdWNobmFtZSkgKi8KKyAgICAgICAgICAgIG1uID0gIE5VTEw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtbiAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzbm1wX3ZhcmJpbmQgKnZiOworCisgICAgICAgICAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfSU5URVJOQUxfR0VUX1ZBTFVFOworICAgICAgICAgICAgLyogYWxsb2NhdGUgb3V0cHV0IHZhcmJpbmQgKi8KKyAgICAgICAgICAgIHZiID0gKHN0cnVjdCBzbm1wX3ZhcmJpbmQgKiltZW1wX21hbGxvYyhNRU1QX1NOTVBfVkFSQklORCk7CisgICAgICAgICAgICBMV0lQX0FTU0VSVCgidmIgIT0gTlVMTCIsdmIgIT0gTlVMTCk7CisgICAgICAgICAgICBpZiAodmIgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdmItPm5leHQgPSBOVUxMOworICAgICAgICAgICAgICB2Yi0+cHJldiA9IE5VTEw7CisKKyAgICAgICAgICAgICAgLyogbW92ZSBuYW1lIGZyb20gaW52YiB0byBvdXR2YiAqLworICAgICAgICAgICAgICB2Yi0+aWRlbnQgPSBtc2dfcHMtPnZiX3B0ci0+aWRlbnQ7CisgICAgICAgICAgICAgIHZiLT5pZGVudF9sZW4gPSBtc2dfcHMtPnZiX3B0ci0+aWRlbnRfbGVuOworICAgICAgICAgICAgICAvKiBlbnN1cmUgdGhpcyBtZW1vcnkgaXMgcmVmZXJlY2VkIG9uY2Ugb25seSAqLworICAgICAgICAgICAgICBtc2dfcHMtPnZiX3B0ci0+aWRlbnQgPSBOVUxMOworICAgICAgICAgICAgICBtc2dfcHMtPnZiX3B0ci0+aWRlbnRfbGVuID0gMDsKKworICAgICAgICAgICAgICB2Yi0+dmFsdWVfdHlwZSA9IG9iamVjdF9kZWYuYXNuX3R5cGU7CisgICAgICAgICAgICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGxlbmd0aCIsIG9iamVjdF9kZWYudl9sZW4gPD0gMHhmZik7CisgICAgICAgICAgICAgIHZiLT52YWx1ZV9sZW4gPSAodThfdClvYmplY3RfZGVmLnZfbGVuOworICAgICAgICAgICAgICBpZiAodmItPnZhbHVlX2xlbiA+IDApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMV0lQX0FTU0VSVCgiU05NUF9NQVhfT0NURVRfU1RSSU5HX0xFTiBpcyBjb25maWd1cmVkIHRvbyBsb3ciLAorICAgICAgICAgICAgICAgICAgdmItPnZhbHVlX2xlbiA8PSBTTk1QX01BWF9WQUxVRV9TSVpFKTsKKyAgICAgICAgICAgICAgICB2Yi0+dmFsdWUgPSBtZW1wX21hbGxvYyhNRU1QX1NOTVBfVkFMVUUpOworICAgICAgICAgICAgICAgIExXSVBfQVNTRVJUKCJ2Yi0+dmFsdWUgIT0gTlVMTCIsdmItPnZhbHVlICE9IE5VTEwpOworICAgICAgICAgICAgICAgIGlmICh2Yi0+dmFsdWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtbi0+Z2V0X3ZhbHVlKCZvYmplY3RfZGVmLCB2Yi0+dmFsdWVfbGVuLCB2Yi0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgc25tcF92YXJiaW5kX3RhaWxfYWRkKCZtc2dfcHMtPm91dHZiLCB2Yik7CisgICAgICAgICAgICAgICAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfU0VBUkNIX09CSjsKKyAgICAgICAgICAgICAgICAgIG1zZ19wcy0+dmJfaWR4ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01TR19ERUJVRywgKCJzbm1wX21zZ19ldmVudDogY291bGRuJ3QgYWxsb2NhdGUgdmFyaWFibGUgc3BhY2VcbiIpKTsKKyAgICAgICAgICAgICAgICAgIG1zZ19wcy0+dmJfcHRyLT5pZGVudCA9IHZiLT5pZGVudDsKKyAgICAgICAgICAgICAgICAgIG1zZ19wcy0+dmJfcHRyLT5pZGVudF9sZW4gPSB2Yi0+aWRlbnRfbGVuOworICAgICAgICAgICAgICAgICAgbWVtcF9mcmVlKE1FTVBfU05NUF9WQVJCSU5ELCB2Yik7CisgICAgICAgICAgICAgICAgICBzbm1wX2Vycm9yX3Jlc3BvbnNlKG1zZ19wcyxTTk1QX0VTX1RPT0JJRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHZiLT52YWx1ZV9sZW4gPT0gMCwgZW1wdHkgdmFsdWUgKGUuZy4gZW1wdHkgc3RyaW5nKSAqLworICAgICAgICAgICAgICAgIHZiLT52YWx1ZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgc25tcF92YXJiaW5kX3RhaWxfYWRkKCZtc2dfcHMtPm91dHZiLCB2Yik7CisgICAgICAgICAgICAgICAgbXNnX3BzLT5zdGF0ZSA9IFNOTVBfTVNHX1NFQVJDSF9PQko7CisgICAgICAgICAgICAgICAgbXNnX3BzLT52Yl9pZHggKz0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBMV0lQX0RFQlVHRihTTk1QX01TR19ERUJVRywgKCJzbm1wX21zZ19ldmVudDogY291bGRuJ3QgYWxsb2NhdGUgb3V0dmIgc3BhY2VcbiIpKTsKKyAgICAgICAgICAgICAgc25tcF9lcnJvcl9yZXNwb25zZShtc2dfcHMsU05NUF9FU19UT09CSUcpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbW4gPSBOVUxMOworICAgIH0KKyAgICBpZiAobW4gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBtbiA9PSBOVUxMLCBub1N1Y2hOYW1lICovCisgICAgICBzbm1wX2Vycm9yX3Jlc3BvbnNlKG1zZ19wcyxTTk1QX0VTX05PU1VDSE5BTUUpOworICAgIH0KKyAgfQorICBpZiAoKG1zZ19wcy0+c3RhdGUgPT0gU05NUF9NU0dfU0VBUkNIX09CSikgJiYKKyAgICAgIChtc2dfcHMtPnZiX2lkeCA9PSBtc2dfcHMtPmludmIuY291bnQpKQorICB7CisgICAgc25tcF9va19yZXNwb25zZShtc2dfcHMpOworICB9Cit9CisKKy8qKgorICogU2VydmljZSBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBldmVudCBmb3IgU05NUCBHRVRORVhULgorICoKKyAqIEBwYXJhbSByZXF1ZXN0X2lkIGlkZW50aWZpZXMgcmVxdWVzdHMgZnJvbSAwIHRvIChTTk1QX0NPTkNVUlJFTlRfUkVRVUVTVFMtMSkKKyAqIEBwYXJhbSBtc2dfcHMgcG9pbnRzIHRvIHRoZSBhc3Nvc2ljYXRlZCBtZXNzYWdlIHByb2Nlc3Mgc3RhdGUKKyAqLworc3RhdGljIHZvaWQKK3NubXBfbXNnX2dldG5leHRfZXZlbnQodThfdCByZXF1ZXN0X2lkLCBzdHJ1Y3Qgc25tcF9tc2dfcHN0YXQgKm1zZ19wcykKK3sKKyAgTFdJUF9ERUJVR0YoU05NUF9NU0dfREVCVUcsICgic25tcF9tc2dfZ2V0bmV4dF9ldmVudDogbXNnX3BzLT5zdGF0ZT09JSJVMTZfRiJcbiIsKHUxNl90KW1zZ19wcy0+c3RhdGUpKTsKKworICBpZiAobXNnX3BzLT5zdGF0ZSA9PSBTTk1QX01TR19FWFRFUk5BTF9HRVRfT0JKREVGKQorICB7CisgICAgc3RydWN0IG1pYl9leHRlcm5hbF9ub2RlICplbjsKKworICAgIC8qIGdldF9vYmplY3RfZGVmKCkgYW5zd2VyKi8KKyAgICBlbiA9IG1zZ19wcy0+ZXh0X21pYl9ub2RlOworCisgICAgLyogdHJhbnNsYXRlIGFuc3dlciBpbnRvIGEga25vd24gbGlmZWZvcm0gKi8KKyAgICBlbi0+Z2V0X29iamVjdF9kZWZfYShyZXF1ZXN0X2lkLCAxLCAmbXNnX3BzLT5leHRfb2lkLmlkW21zZ19wcy0+ZXh0X29pZC5sZW4gLSAxXSwgJm1zZ19wcy0+ZXh0X29iamVjdF9kZWYpOworICAgIGlmIChtc2dfcHMtPmV4dF9vYmplY3RfZGVmLmluc3RhbmNlICE9IE1JQl9PQkpFQ1RfTk9ORSkKKyAgICB7CisgICAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfRVhURVJOQUxfR0VUX1ZBTFVFOworICAgICAgZW4tPmdldF92YWx1ZV9xKHJlcXVlc3RfaWQsICZtc2dfcHMtPmV4dF9vYmplY3RfZGVmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGVuLT5nZXRfb2JqZWN0X2RlZl9wYyhyZXF1ZXN0X2lkLCAxLCAmbXNnX3BzLT5leHRfb2lkLmlkW21zZ19wcy0+ZXh0X29pZC5sZW4gLSAxXSk7CisgICAgICAvKiBzZWFyY2ggZmFpbGVkLCBvYmplY3QgaWQgcG9pbnRzIHRvIHVua25vd24gb2JqZWN0IChub3N1Y2huYW1lKSAqLworICAgICAgc25tcF9lcnJvcl9yZXNwb25zZShtc2dfcHMsU05NUF9FU19OT1NVQ0hOQU1FKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAobXNnX3BzLT5zdGF0ZSA9PSBTTk1QX01TR19FWFRFUk5BTF9HRVRfVkFMVUUpCisgIHsKKyAgICBzdHJ1Y3QgbWliX2V4dGVybmFsX25vZGUgKmVuOworICAgIHN0cnVjdCBzbm1wX3ZhcmJpbmQgKnZiOworCisgICAgLyogZ2V0X3ZhbHVlKCkgYW5zd2VyICovCisgICAgZW4gPSBtc2dfcHMtPmV4dF9taWJfbm9kZTsKKworICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGxlbmd0aCIsIG1zZ19wcy0+ZXh0X29iamVjdF9kZWYudl9sZW4gPD0gMHhmZik7CisgICAgdmIgPSBzbm1wX3ZhcmJpbmRfYWxsb2MoJm1zZ19wcy0+ZXh0X29pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfcHMtPmV4dF9vYmplY3RfZGVmLmFzbl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90KW1zZ19wcy0+ZXh0X29iamVjdF9kZWYudl9sZW4pOworICAgIGlmICh2YiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGVuLT5nZXRfdmFsdWVfYShyZXF1ZXN0X2lkLCAmbXNnX3BzLT5leHRfb2JqZWN0X2RlZiwgdmItPnZhbHVlX2xlbiwgdmItPnZhbHVlKTsKKyAgICAgIHNubXBfdmFyYmluZF90YWlsX2FkZCgmbXNnX3BzLT5vdXR2YiwgdmIpOworICAgICAgbXNnX3BzLT5zdGF0ZSA9IFNOTVBfTVNHX1NFQVJDSF9PQko7CisgICAgICBtc2dfcHMtPnZiX2lkeCArPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZW4tPmdldF92YWx1ZV9wYyhyZXF1ZXN0X2lkLCAmbXNnX3BzLT5leHRfb2JqZWN0X2RlZik7CisgICAgICBMV0lQX0RFQlVHRihTTk1QX01TR19ERUJVRywgKCJzbm1wX21zZ19nZXRuZXh0X2V2ZW50OiBjb3VsZG4ndCBhbGxvY2F0ZSBvdXR2YiBzcGFjZVxuIikpOworICAgICAgc25tcF9lcnJvcl9yZXNwb25zZShtc2dfcHMsU05NUF9FU19UT09CSUcpOworICAgIH0KKyAgfQorCisgIHdoaWxlICgobXNnX3BzLT5zdGF0ZSA9PSBTTk1QX01TR19TRUFSQ0hfT0JKKSAmJgorICAgICAgICAgKG1zZ19wcy0+dmJfaWR4IDwgbXNnX3BzLT5pbnZiLmNvdW50KSkKKyAgeworICAgIHN0cnVjdCBtaWJfbm9kZSAqbW47CisgICAgc3RydWN0IHNubXBfb2JqX2lkIG9pZDsKKworICAgIGlmIChtc2dfcHMtPnZiX2lkeCA9PSAwKQorICAgIHsKKyAgICAgIG1zZ19wcy0+dmJfcHRyID0gbXNnX3BzLT5pbnZiLmhlYWQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBtc2dfcHMtPnZiX3B0ciA9IG1zZ19wcy0+dmJfcHRyLT5uZXh0OworICAgIH0KKyAgICBpZiAoc25tcF9pc29fcHJlZml4X2V4cGFuZChtc2dfcHMtPnZiX3B0ci0+aWRlbnRfbGVuLCBtc2dfcHMtPnZiX3B0ci0+aWRlbnQsICZvaWQpKQorICAgIHsKKyAgICAgIGlmIChtc2dfcHMtPnZiX3B0ci0+aWRlbnRfbGVuID4gMykKKyAgICAgIHsKKyAgICAgICAgLyogY2FuIG9mZnNldCBpZGVudF9sZW4gYW5kIGlkZW50ICovCisgICAgICAgIG1uID0gc25tcF9leHBhbmRfdHJlZSgoc3RydWN0IG1pYl9ub2RlKikmaW50ZXJuZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfcHMtPnZiX3B0ci0+aWRlbnRfbGVuIC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19wcy0+dmJfcHRyLT5pZGVudCArIDQsICZvaWQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBjYW4ndCBvZmZzZXQgaWRlbnRfbGVuIC00LCBpZGVudCArIDQgKi8KKyAgICAgICAgbW4gPSBzbm1wX2V4cGFuZF90cmVlKChzdHJ1Y3QgbWliX25vZGUqKSZpbnRlcm5ldCwgMCwgTlVMTCwgJm9pZCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBtbiA9IE5VTEw7CisgICAgfQorICAgIGlmIChtbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChtbi0+bm9kZV90eXBlID09IE1JQl9OT0RFX0VYKQorICAgICAgeworICAgICAgICAvKiBleHRlcm5hbCBvYmplY3QgKi8KKyAgICAgICAgc3RydWN0IG1pYl9leHRlcm5hbF9ub2RlICplbiA9IChzdHJ1Y3QgbWliX2V4dGVybmFsX25vZGUqKW1uOworCisgICAgICAgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19FWFRFUk5BTF9HRVRfT0JKREVGOworICAgICAgICAvKiBzYXZlIGVuICYmIGFyZ3MgaW4gbXNnX3BzISEgKi8KKyAgICAgICAgbXNnX3BzLT5leHRfbWliX25vZGUgPSBlbjsKKyAgICAgICAgbXNnX3BzLT5leHRfb2lkID0gb2lkOworCisgICAgICAgIGVuLT5nZXRfb2JqZWN0X2RlZl9xKGVuLT5hZGRyX2luZiwgcmVxdWVzdF9pZCwgMSwgJm9pZC5pZFtvaWQubGVuIC0gMV0pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBpbnRlcm5hbCBvYmplY3QgKi8KKyAgICAgICAgc3RydWN0IG9ial9kZWYgb2JqZWN0X2RlZjsKKyAgICAgICAgc3RydWN0IHNubXBfdmFyYmluZCAqdmI7CisKKyAgICAgICAgbXNnX3BzLT5zdGF0ZSA9IFNOTVBfTVNHX0lOVEVSTkFMX0dFVF9PQkpERUY7CisgICAgICAgIG1uLT5nZXRfb2JqZWN0X2RlZigxLCAmb2lkLmlkW29pZC5sZW4gLSAxXSwgJm9iamVjdF9kZWYpOworCisgICAgICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGxlbmd0aCIsIG9iamVjdF9kZWYudl9sZW4gPD0gMHhmZik7CisgICAgICAgIHZiID0gc25tcF92YXJiaW5kX2FsbG9jKCZvaWQsIG9iamVjdF9kZWYuYXNuX3R5cGUsICh1OF90KW9iamVjdF9kZWYudl9sZW4pOworICAgICAgICBpZiAodmIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19JTlRFUk5BTF9HRVRfVkFMVUU7CisgICAgICAgICAgbW4tPmdldF92YWx1ZSgmb2JqZWN0X2RlZiwgb2JqZWN0X2RlZi52X2xlbiwgdmItPnZhbHVlKTsKKyAgICAgICAgICBzbm1wX3ZhcmJpbmRfdGFpbF9hZGQoJm1zZ19wcy0+b3V0dmIsIHZiKTsKKyAgICAgICAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfU0VBUkNIX09CSjsKKyAgICAgICAgICBtc2dfcHMtPnZiX2lkeCArPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIExXSVBfREVCVUdGKFNOTVBfTVNHX0RFQlVHLCAoInNubXBfcmVjdiBjb3VsZG4ndCBhbGxvY2F0ZSBvdXR2YiBzcGFjZVxuIikpOworICAgICAgICAgIHNubXBfZXJyb3JfcmVzcG9uc2UobXNnX3BzLFNOTVBfRVNfVE9PQklHKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAobW4gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBtbiA9PSBOVUxMLCBub1N1Y2hOYW1lICovCisgICAgICBzbm1wX2Vycm9yX3Jlc3BvbnNlKG1zZ19wcyxTTk1QX0VTX05PU1VDSE5BTUUpOworICAgIH0KKyAgfQorICBpZiAoKG1zZ19wcy0+c3RhdGUgPT0gU05NUF9NU0dfU0VBUkNIX09CSikgJiYKKyAgICAgIChtc2dfcHMtPnZiX2lkeCA9PSBtc2dfcHMtPmludmIuY291bnQpKQorICB7CisgICAgc25tcF9va19yZXNwb25zZShtc2dfcHMpOworICB9Cit9CisKKy8qKgorICogU2VydmljZSBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBldmVudCBmb3IgU05NUCBTRVQuCisgKgorICogQHBhcmFtIHJlcXVlc3RfaWQgaWRlbnRpZmllcyByZXF1ZXN0cyBmcm9tIDAgdG8gKFNOTVBfQ09OQ1VSUkVOVF9SRVFVRVNUUy0xKQorICogQHBhcmFtIG1zZ19wcyBwb2ludHMgdG8gdGhlIGFzc29zaWNhdGVkIG1lc3NhZ2UgcHJvY2VzcyBzdGF0ZQorICovCitzdGF0aWMgdm9pZAorc25tcF9tc2dfc2V0X2V2ZW50KHU4X3QgcmVxdWVzdF9pZCwgc3RydWN0IHNubXBfbXNnX3BzdGF0ICptc2dfcHMpCit7CisgIExXSVBfREVCVUdGKFNOTVBfTVNHX0RFQlVHLCAoInNubXBfbXNnX3NldF9ldmVudDogbXNnX3BzLT5zdGF0ZT09JSJVMTZfRiJcbiIsKHUxNl90KW1zZ19wcy0+c3RhdGUpKTsKKworICBpZiAobXNnX3BzLT5zdGF0ZSA9PSBTTk1QX01TR19FWFRFUk5BTF9HRVRfT0JKREVGKQorICB7CisgICAgc3RydWN0IG1pYl9leHRlcm5hbF9ub2RlICplbjsKKyAgICBzdHJ1Y3Qgc25tcF9uYW1lX3B0ciBucDsKKworICAgIC8qIGdldF9vYmplY3RfZGVmKCkgYW5zd2VyKi8KKyAgICBlbiA9IG1zZ19wcy0+ZXh0X21pYl9ub2RlOworICAgIG5wID0gbXNnX3BzLT5leHRfbmFtZV9wdHI7CisKKyAgICAvKiB0cmFuc2xhdGUgYW5zd2VyIGludG8gYSBrbm93biBsaWZlZm9ybSAqLworICAgIGVuLT5nZXRfb2JqZWN0X2RlZl9hKHJlcXVlc3RfaWQsIG5wLmlkZW50X2xlbiwgbnAuaWRlbnQsICZtc2dfcHMtPmV4dF9vYmplY3RfZGVmKTsKKyAgICBpZiAobXNnX3BzLT5leHRfb2JqZWN0X2RlZi5pbnN0YW5jZSAhPSBNSUJfT0JKRUNUX05PTkUpCisgICAgeworICAgICAgbXNnX3BzLT5zdGF0ZSA9IFNOTVBfTVNHX0VYVEVSTkFMX1NFVF9URVNUOworICAgICAgZW4tPnNldF90ZXN0X3EocmVxdWVzdF9pZCwgJm1zZ19wcy0+ZXh0X29iamVjdF9kZWYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZW4tPmdldF9vYmplY3RfZGVmX3BjKHJlcXVlc3RfaWQsIG5wLmlkZW50X2xlbiwgbnAuaWRlbnQpOworICAgICAgLyogc2VhcmNoIGZhaWxlZCwgb2JqZWN0IGlkIHBvaW50cyB0byB1bmtub3duIG9iamVjdCAobm9zdWNobmFtZSkgKi8KKyAgICAgIHNubXBfZXJyb3JfcmVzcG9uc2UobXNnX3BzLFNOTVBfRVNfTk9TVUNITkFNRSk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKG1zZ19wcy0+c3RhdGUgPT0gU05NUF9NU0dfRVhURVJOQUxfU0VUX1RFU1QpCisgIHsKKyAgICBzdHJ1Y3QgbWliX2V4dGVybmFsX25vZGUgKmVuOworCisgICAgLyogc2V0X3Rlc3QoKSBhbnN3ZXIqLworICAgIGVuID0gbXNnX3BzLT5leHRfbWliX25vZGU7CisKKyAgICBpZiAobXNnX3BzLT5leHRfb2JqZWN0X2RlZi5hY2Nlc3MgJiBNSUJfQUNDRVNTX1dSSVRFKQorICAgIHsKKyAgICAgICBpZiAoKG1zZ19wcy0+ZXh0X29iamVjdF9kZWYuYXNuX3R5cGUgPT0gbXNnX3BzLT52Yl9wdHItPnZhbHVlX3R5cGUpICYmCisgICAgICAgICAgIChlbi0+c2V0X3Rlc3RfYShyZXF1ZXN0X2lkLCZtc2dfcHMtPmV4dF9vYmplY3RfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3BzLT52Yl9wdHItPnZhbHVlX2xlbixtc2dfcHMtPnZiX3B0ci0+dmFsdWUpICE9IDApKQorICAgICAgeworICAgICAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfU0VBUkNIX09CSjsKKyAgICAgICAgbXNnX3BzLT52Yl9pZHggKz0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZW4tPnNldF90ZXN0X3BjKHJlcXVlc3RfaWQsJm1zZ19wcy0+ZXh0X29iamVjdF9kZWYpOworICAgICAgICAvKiBiYWQgdmFsdWUgKi8KKyAgICAgICAgc25tcF9lcnJvcl9yZXNwb25zZShtc2dfcHMsU05NUF9FU19CQURWQUxVRSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBlbi0+c2V0X3Rlc3RfcGMocmVxdWVzdF9pZCwmbXNnX3BzLT5leHRfb2JqZWN0X2RlZik7CisgICAgICAvKiBvYmplY3Qgbm90IGF2YWlsYWJsZSBmb3Igc2V0ICovCisgICAgICBzbm1wX2Vycm9yX3Jlc3BvbnNlKG1zZ19wcyxTTk1QX0VTX05PU1VDSE5BTUUpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChtc2dfcHMtPnN0YXRlID09IFNOTVBfTVNHX0VYVEVSTkFMX0dFVF9PQkpERUZfUykKKyAgeworICAgIHN0cnVjdCBtaWJfZXh0ZXJuYWxfbm9kZSAqZW47CisgICAgc3RydWN0IHNubXBfbmFtZV9wdHIgbnA7CisKKyAgICAvKiBnZXRfb2JqZWN0X2RlZigpIGFuc3dlciovCisgICAgZW4gPSBtc2dfcHMtPmV4dF9taWJfbm9kZTsKKyAgICBucCA9IG1zZ19wcy0+ZXh0X25hbWVfcHRyOworCisgICAgLyogdHJhbnNsYXRlIGFuc3dlciBpbnRvIGEga25vd24gbGlmZWZvcm0gKi8KKyAgICBlbi0+Z2V0X29iamVjdF9kZWZfYShyZXF1ZXN0X2lkLCBucC5pZGVudF9sZW4sIG5wLmlkZW50LCAmbXNnX3BzLT5leHRfb2JqZWN0X2RlZik7CisgICAgaWYgKG1zZ19wcy0+ZXh0X29iamVjdF9kZWYuaW5zdGFuY2UgIT0gTUlCX09CSkVDVF9OT05FKQorICAgIHsKKyAgICAgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19FWFRFUk5BTF9TRVRfVkFMVUU7CisgICAgICBlbi0+c2V0X3ZhbHVlX3EocmVxdWVzdF9pZCwgJm1zZ19wcy0+ZXh0X29iamVjdF9kZWYsCisgICAgICAgICAgICAgICAgICAgICAgbXNnX3BzLT52Yl9wdHItPnZhbHVlX2xlbixtc2dfcHMtPnZiX3B0ci0+dmFsdWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZW4tPmdldF9vYmplY3RfZGVmX3BjKHJlcXVlc3RfaWQsIG5wLmlkZW50X2xlbiwgbnAuaWRlbnQpOworICAgICAgLyogc2V0X3ZhbHVlIGZhaWxlZCwgb2JqZWN0IGhhcyBkaXNhcHBlYXJlZCBmb3Igc29tZSBvZGQgcmVhc29uPz8gKi8KKyAgICAgIHNubXBfZXJyb3JfcmVzcG9uc2UobXNnX3BzLFNOTVBfRVNfR0VORVJST1IpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChtc2dfcHMtPnN0YXRlID09IFNOTVBfTVNHX0VYVEVSTkFMX1NFVF9WQUxVRSkKKyAgeworICAgIHN0cnVjdCBtaWJfZXh0ZXJuYWxfbm9kZSAqZW47CisKKyAgICAvKiogc2V0X3ZhbHVlX2EoKSAqLworICAgIGVuID0gbXNnX3BzLT5leHRfbWliX25vZGU7CisgICAgZW4tPnNldF92YWx1ZV9hKHJlcXVlc3RfaWQsICZtc2dfcHMtPmV4dF9vYmplY3RfZGVmLAorICAgICAgbXNnX3BzLT52Yl9wdHItPnZhbHVlX2xlbiwgbXNnX3BzLT52Yl9wdHItPnZhbHVlKTsKKworICAgIC8qKiBAdG9kbyB1c2Ugc2V0X3ZhbHVlX3BjKCkgaWYgdG9vYmlnICovCisgICAgbXNnX3BzLT5zdGF0ZSA9IFNOTVBfTVNHX0lOVEVSTkFMX1NFVF9WQUxVRTsKKyAgICBtc2dfcHMtPnZiX2lkeCArPSAxOworICB9CisKKyAgLyogdGVzdCBhbGwgdmFsdWVzIGJlZm9yZSBzZXR0aW5nICovCisgIHdoaWxlICgobXNnX3BzLT5zdGF0ZSA9PSBTTk1QX01TR19TRUFSQ0hfT0JKKSAmJgorICAgICAgICAgKG1zZ19wcy0+dmJfaWR4IDwgbXNnX3BzLT5pbnZiLmNvdW50KSkKKyAgeworICAgIHN0cnVjdCBtaWJfbm9kZSAqbW47CisgICAgc3RydWN0IHNubXBfbmFtZV9wdHIgbnA7CisKKyAgICBpZiAobXNnX3BzLT52Yl9pZHggPT0gMCkKKyAgICB7CisgICAgICBtc2dfcHMtPnZiX3B0ciA9IG1zZ19wcy0+aW52Yi5oZWFkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbXNnX3BzLT52Yl9wdHIgPSBtc2dfcHMtPnZiX3B0ci0+bmV4dDsKKyAgICB9CisgICAgLyoqIHRlc3Qgb2JqZWN0IGlkZW50aWZpZXIgZm9yIC5pc28ub3JnLmRvZC5pbnRlcm5ldCBwcmVmaXggKi8KKyAgICBpZiAoc25tcF9pc29fcHJlZml4X3RzdChtc2dfcHMtPnZiX3B0ci0+aWRlbnRfbGVuLCAgbXNnX3BzLT52Yl9wdHItPmlkZW50KSkKKyAgICB7CisgICAgICBtbiA9IHNubXBfc2VhcmNoX3RyZWUoKHN0cnVjdCBtaWJfbm9kZSopJmludGVybmV0LCBtc2dfcHMtPnZiX3B0ci0+aWRlbnRfbGVuIC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3BzLT52Yl9wdHItPmlkZW50ICsgNCwgJm5wKTsKKyAgICAgIGlmIChtbiAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAobW4tPm5vZGVfdHlwZSA9PSBNSUJfTk9ERV9FWCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGV4dGVybmFsIG9iamVjdCAqLworICAgICAgICAgIHN0cnVjdCBtaWJfZXh0ZXJuYWxfbm9kZSAqZW4gPSAoc3RydWN0IG1pYl9leHRlcm5hbF9ub2RlKiltbjsKKworICAgICAgICAgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19FWFRFUk5BTF9HRVRfT0JKREVGOworICAgICAgICAgIC8qIHNhdmUgZW4gJiYgYXJncyBpbiBtc2dfcHMhISAqLworICAgICAgICAgIG1zZ19wcy0+ZXh0X21pYl9ub2RlID0gZW47CisgICAgICAgICAgbXNnX3BzLT5leHRfbmFtZV9wdHIgPSBucDsKKworICAgICAgICAgIGVuLT5nZXRfb2JqZWN0X2RlZl9xKGVuLT5hZGRyX2luZiwgcmVxdWVzdF9pZCwgbnAuaWRlbnRfbGVuLCBucC5pZGVudCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogaW50ZXJuYWwgb2JqZWN0ICovCisgICAgICAgICAgc3RydWN0IG9ial9kZWYgb2JqZWN0X2RlZjsKKworICAgICAgICAgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19JTlRFUk5BTF9HRVRfT0JKREVGOworICAgICAgICAgIG1uLT5nZXRfb2JqZWN0X2RlZihucC5pZGVudF9sZW4sIG5wLmlkZW50LCAmb2JqZWN0X2RlZik7CisgICAgICAgICAgaWYgKG9iamVjdF9kZWYuaW5zdGFuY2UgIT0gTUlCX09CSkVDVF9OT05FKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1uID0gbW47CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBzZWFyY2ggZmFpbGVkLCBvYmplY3QgaWQgcG9pbnRzIHRvIHVua25vd24gb2JqZWN0IChub3N1Y2huYW1lKSAqLworICAgICAgICAgICAgbW4gPSBOVUxMOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobW4gIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfSU5URVJOQUxfU0VUX1RFU1Q7CisKKyAgICAgICAgICAgIGlmIChvYmplY3RfZGVmLmFjY2VzcyAmIE1JQl9BQ0NFU1NfV1JJVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgob2JqZWN0X2RlZi5hc25fdHlwZSA9PSBtc2dfcHMtPnZiX3B0ci0+dmFsdWVfdHlwZSkgJiYKKyAgICAgICAgICAgICAgICAgIChtbi0+c2V0X3Rlc3QoJm9iamVjdF9kZWYsbXNnX3BzLT52Yl9wdHItPnZhbHVlX2xlbixtc2dfcHMtPnZiX3B0ci0+dmFsdWUpICE9IDApKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXNnX3BzLT5zdGF0ZSA9IFNOTVBfTVNHX1NFQVJDSF9PQko7CisgICAgICAgICAgICAgICAgbXNnX3BzLT52Yl9pZHggKz0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBiYWQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBzbm1wX2Vycm9yX3Jlc3BvbnNlKG1zZ19wcyxTTk1QX0VTX0JBRFZBTFVFKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBvYmplY3Qgbm90IGF2YWlsYWJsZSBmb3Igc2V0ICovCisgICAgICAgICAgICAgIHNubXBfZXJyb3JfcmVzcG9uc2UobXNnX3BzLFNOTVBfRVNfTk9TVUNITkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBtbiA9IE5VTEw7CisgICAgfQorICAgIGlmIChtbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIG1uID09IE5VTEwsIG5vU3VjaE5hbWUgKi8KKyAgICAgIHNubXBfZXJyb3JfcmVzcG9uc2UobXNnX3BzLFNOTVBfRVNfTk9TVUNITkFNRSk7CisgICAgfQorICB9CisKKyAgaWYgKChtc2dfcHMtPnN0YXRlID09IFNOTVBfTVNHX1NFQVJDSF9PQkopICYmCisgICAgICAobXNnX3BzLT52Yl9pZHggPT0gbXNnX3BzLT5pbnZiLmNvdW50KSkKKyAgeworICAgIG1zZ19wcy0+dmJfaWR4ID0gMDsKKyAgICBtc2dfcHMtPnN0YXRlID0gU05NUF9NU0dfSU5URVJOQUxfU0VUX1ZBTFVFOworICB9CisKKyAgLyogc2V0IGFsbCB2YWx1ZXMgImF0b21pY2FsbHkiIChiZSBhcyAiYXRvbWljIiBhcyBwb3NzaWJsZSkgKi8KKyAgd2hpbGUgKChtc2dfcHMtPnN0YXRlID09IFNOTVBfTVNHX0lOVEVSTkFMX1NFVF9WQUxVRSkgJiYKKyAgICAgICAgIChtc2dfcHMtPnZiX2lkeCA8IG1zZ19wcy0+aW52Yi5jb3VudCkpCisgIHsKKyAgICBzdHJ1Y3QgbWliX25vZGUgKm1uOworICAgIHN0cnVjdCBzbm1wX25hbWVfcHRyIG5wOworCisgICAgaWYgKG1zZ19wcy0+dmJfaWR4ID09IDApCisgICAgeworICAgICAgbXNnX3BzLT52Yl9wdHIgPSBtc2dfcHMtPmludmIuaGVhZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIG1zZ19wcy0+dmJfcHRyID0gbXNnX3BzLT52Yl9wdHItPm5leHQ7CisgICAgfQorICAgIC8qIHNraXAgaXNvIHByZWZpeCB0ZXN0LCB3YXMgZG9uZSBwcmV2aW91c2x5IHdoaWxlIHNldHRlc3RpbmcoKSAqLworICAgIG1uID0gc25tcF9zZWFyY2hfdHJlZSgoc3RydWN0IG1pYl9ub2RlKikmaW50ZXJuZXQsIG1zZ19wcy0+dmJfcHRyLT5pZGVudF9sZW4gLSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3BzLT52Yl9wdHItPmlkZW50ICsgNCwgJm5wKTsKKyAgICAvKiBjaGVjayBpZiBvYmplY3QgaXMgc3RpbGwgYXZhaWxhYmxlCisgICAgICAgKGUuZy4gZXh0ZXJuYWwgaG90LXBsdWcgdGhpbmd5IHByZXNlbnQ/KSAqLworICAgIGlmIChtbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChtbi0+bm9kZV90eXBlID09IE1JQl9OT0RFX0VYKQorICAgICAgeworICAgICAgICAvKiBleHRlcm5hbCBvYmplY3QgKi8KKyAgICAgICAgc3RydWN0IG1pYl9leHRlcm5hbF9ub2RlICplbiA9IChzdHJ1Y3QgbWliX2V4dGVybmFsX25vZGUqKW1uOworCisgICAgICAgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19FWFRFUk5BTF9HRVRfT0JKREVGX1M7CisgICAgICAgIC8qIHNhdmUgZW4gJiYgYXJncyBpbiBtc2dfcHMhISAqLworICAgICAgICBtc2dfcHMtPmV4dF9taWJfbm9kZSA9IGVuOworICAgICAgICBtc2dfcHMtPmV4dF9uYW1lX3B0ciA9IG5wOworCisgICAgICAgIGVuLT5nZXRfb2JqZWN0X2RlZl9xKGVuLT5hZGRyX2luZiwgcmVxdWVzdF9pZCwgbnAuaWRlbnRfbGVuLCBucC5pZGVudCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIGludGVybmFsIG9iamVjdCAqLworICAgICAgICBzdHJ1Y3Qgb2JqX2RlZiBvYmplY3RfZGVmOworCisgICAgICAgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19JTlRFUk5BTF9HRVRfT0JKREVGX1M7CisgICAgICAgIG1uLT5nZXRfb2JqZWN0X2RlZihucC5pZGVudF9sZW4sIG5wLmlkZW50LCAmb2JqZWN0X2RlZik7CisgICAgICAgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19JTlRFUk5BTF9TRVRfVkFMVUU7CisgICAgICAgIG1uLT5zZXRfdmFsdWUoJm9iamVjdF9kZWYsbXNnX3BzLT52Yl9wdHItPnZhbHVlX2xlbixtc2dfcHMtPnZiX3B0ci0+dmFsdWUpOworICAgICAgICBtc2dfcHMtPnZiX2lkeCArPSAxOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoKG1zZ19wcy0+c3RhdGUgPT0gU05NUF9NU0dfSU5URVJOQUxfU0VUX1ZBTFVFKSAmJgorICAgICAgKG1zZ19wcy0+dmJfaWR4ID09IG1zZ19wcy0+aW52Yi5jb3VudCkpCisgIHsKKyAgICAvKiBzaW1wbHkgZWNobyB0aGUgaW5wdXQgaWYgd2UgY2FuIHNldCBpdAorICAgICAgIEB0b2RvIGRvIHdlIG5lZWQgdG8gcmV0dXJuIHRoZSBhY3R1YWwgdmFsdWU/CisgICAgICAgZS5nLiBpZiB2YWx1ZSBpcyBzaWxlbnRseSBtb2RpZmllZCBvciBiZWhhdmVzIHN0aWNreT8gKi8KKyAgICBtc2dfcHMtPm91dHZiID0gbXNnX3BzLT5pbnZiOworICAgIG1zZ19wcy0+aW52Yi5oZWFkID0gTlVMTDsKKyAgICBtc2dfcHMtPmludmIudGFpbCA9IE5VTEw7CisgICAgbXNnX3BzLT5pbnZiLmNvdW50ID0gMDsKKyAgICBzbm1wX29rX3Jlc3BvbnNlKG1zZ19wcyk7CisgIH0KK30KKworCisvKioKKyAqIEhhbmRsZSBvbmUgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZXZlbnQuCisgKiBDYWxsZWQgZm9yIG9uZSBhc3luYyBldmVudC4gKHJlY3YgZXh0ZXJuYWwvcHJpdmF0ZSBhbnN3ZXIpCisgKgorICogQHBhcmFtIHJlcXVlc3RfaWQgaWRlbnRpZmllcyByZXF1ZXN0cyBmcm9tIDAgdG8gKFNOTVBfQ09OQ1VSUkVOVF9SRVFVRVNUUy0xKQorICovCit2b2lkCitzbm1wX21zZ19ldmVudCh1OF90IHJlcXVlc3RfaWQpCit7CisgIHN0cnVjdCBzbm1wX21zZ19wc3RhdCAqbXNnX3BzOworCisgIGlmIChyZXF1ZXN0X2lkIDwgU05NUF9DT05DVVJSRU5UX1JFUVVFU1RTKQorICB7CisgICAgbXNnX3BzID0gJm1zZ19pbnB1dF9saXN0W3JlcXVlc3RfaWRdOworICAgIGlmIChtc2dfcHMtPnJ0ID09IFNOTVBfQVNOMV9QRFVfR0VUX05FWFRfUkVRKQorICAgIHsKKyAgICAgIHNubXBfbXNnX2dldG5leHRfZXZlbnQocmVxdWVzdF9pZCwgbXNnX3BzKTsKKyAgICB9CisgICAgZWxzZSBpZiAobXNnX3BzLT5ydCA9PSBTTk1QX0FTTjFfUERVX0dFVF9SRVEpCisgICAgeworICAgICAgc25tcF9tc2dfZ2V0X2V2ZW50KHJlcXVlc3RfaWQsIG1zZ19wcyk7CisgICAgfQorICAgIGVsc2UgaWYobXNnX3BzLT5ydCA9PSBTTk1QX0FTTjFfUERVX1NFVF9SRVEpCisgICAgeworICAgICAgc25tcF9tc2dfc2V0X2V2ZW50KHJlcXVlc3RfaWQsIG1zZ19wcyk7CisgICAgfQorICB9Cit9CisKKworLyogbHdJUCBVRFAgcmVjZWl2ZSBjYWxsYmFjayBmdW5jdGlvbiAqLworc3RhdGljIHZvaWQKK3NubXBfcmVjdih2b2lkICphcmcsIHN0cnVjdCB1ZHBfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKmFkZHIsIHUxNl90IHBvcnQpCit7CisgIHN0cnVjdCBzbm1wX21zZ19wc3RhdCAqbXNnX3BzOworICB1OF90IHJlcV9pZHg7CisgIGVycl90IGVycl9yZXQ7CisgIHUxNl90IHBheWxvYWRfbGVuID0gcC0+dG90X2xlbjsKKyAgdTE2X3QgcGF5bG9hZF9vZnMgPSAwOworICB1MTZfdCB2YXJiaW5kX29mcyA9IDA7CisKKyAgLyogc3VwcHJlc3MgdW51c2VkIGFyZ3VtZW50IHdhcm5pbmcgKi8KKyAgTFdJUF9VTlVTRURfQVJHKGFyZyk7CisKKyAgLyogdHJhdmVyc2UgaW5wdXQgbWVzc2FnZSBwcm9jZXNzIGxpc3QsIGxvb2sgZm9yIFNOTVBfTVNHX0VNUFRZICovCisgIG1zZ19wcyA9ICZtc2dfaW5wdXRfbGlzdFswXTsKKyAgcmVxX2lkeCA9IDA7CisgIHdoaWxlICgocmVxX2lkeCA8IFNOTVBfQ09OQ1VSUkVOVF9SRVFVRVNUUykgJiYgKG1zZ19wcy0+c3RhdGUgIT0gU05NUF9NU0dfRU1QVFkpKQorICB7CisgICAgcmVxX2lkeCsrOworICAgIG1zZ19wcysrOworICB9CisgIGlmIChyZXFfaWR4ID09IFNOTVBfQ09OQ1VSUkVOVF9SRVFVRVNUUykKKyAgeworICAgIC8qIGV4Y2VlZGluZyBudW1iZXIgb2YgY29uY3VycmVudCByZXF1ZXN0cyAqLworICAgIHBidWZfZnJlZShwKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBhY2NlcHRpbmcgcmVxdWVzdCAqLworICBzbm1wX2luY19zbm1waW5wa3RzKCk7CisgIC8qIHJlY29yZCB1c2VkICdwcm90b2NvbCBjb250cm9sIGJsb2NrJyAqLworICBtc2dfcHMtPnBjYiA9IHBjYjsKKyAgLyogc291cmNlIGFkZHJlc3MgKG5ldHdvcmsgb3JkZXIpICovCisgIG1zZ19wcy0+c2lwID0gKmFkZHI7CisgIC8qIHNvdXJjZSBwb3J0IChob3N0IG9yZGVyIChsd0lQIG9kZGl0eSkpICovCisgIG1zZ19wcy0+c3AgPSBwb3J0OworCisgIC8qIGNoZWNrIHRvdGFsIGxlbmd0aCwgdmVyc2lvbiwgY29tbXVuaXR5LCBwZHUgdHlwZSAqLworICBlcnJfcmV0ID0gc25tcF9wZHVfaGVhZGVyX2NoZWNrKHAsIHBheWxvYWRfb2ZzLCBwYXlsb2FkX2xlbiwgJnZhcmJpbmRfb2ZzLCBtc2dfcHMpOworICAvKiBPbmx5IGFjY2VwdCByZXF1ZXN0cyBhbmQgcmVxdWVzdHMgd2l0aG91dCBlcnJvciAoYmUgcm9idXN0KSAqLworICAvKiBSZWplY3QgcmVzcG9uc2UgYW5kIHRyYXAgaGVhZGVycyBvciBlcnJvciByZXF1ZXN0cyBhcyBpbnB1dCEgKi8KKyAgaWYgKChlcnJfcmV0ICE9IEVSUl9PSykgfHwKKyAgICAgICgobXNnX3BzLT5ydCAhPSBTTk1QX0FTTjFfUERVX0dFVF9SRVEpICYmCisgICAgICAgKG1zZ19wcy0+cnQgIT0gU05NUF9BU04xX1BEVV9HRVRfTkVYVF9SRVEpICYmCisgICAgICAgKG1zZ19wcy0+cnQgIT0gU05NUF9BU04xX1BEVV9TRVRfUkVRKSkgfHwKKyAgICAgICgobXNnX3BzLT5lcnJvcl9zdGF0dXMgIT0gU05NUF9FU19OT0VSUk9SKSB8fAorICAgICAgIChtc2dfcHMtPmVycm9yX2luZGV4ICE9IDApKSApCisgIHsKKyAgICAvKiBoZWFkZXIgY2hlY2sgZmFpbGVkIGRyb3AgcmVxdWVzdCBzaWxlbnRseSwgZG8gbm90IHJldHVybiBlcnJvciEgKi8KKyAgICBwYnVmX2ZyZWUocCk7CisgICAgTFdJUF9ERUJVR0YoU05NUF9NU0dfREVCVUcsICgic25tcF9wZHVfaGVhZGVyX2NoZWNrKCkgZmFpbGVkXG4iKSk7CisgICAgcmV0dXJuOworICB9CisgIExXSVBfREVCVUdGKFNOTVBfTVNHX0RFQlVHLCAoInNubXBfcmVjdiBvaywgY29tbXVuaXR5ICVzXG4iLCBtc2dfcHMtPmNvbW11bml0eSkpOworCisgIC8qIEJ1aWxkcyBhIGxpc3Qgb2YgdmFyaWFibGUgYmluZGluZ3MuIENvcHkgdGhlIHZhcmJpbmRzIGZyb20gdGhlIHBidWYKKyAgICBjaGFpbiB0byBnbHVlIHRoZW0gd2hlbiB0aGVzZSBhcmUgZGl2aWRlZCBvdmVyIHR3byBvciBtb3JlIHBidWYncy4gKi8KKyAgZXJyX3JldCA9IHNubXBfcGR1X2RlY192YXJiaW5kbGlzdChwLCB2YXJiaW5kX29mcywgJnZhcmJpbmRfb2ZzLCBtc2dfcHMpOworICAvKiB3ZSd2ZSBkZWNvZGVkIHRoZSBpbmNvbWluZyBtZXNzYWdlLCByZWxlYXNlIGlucHV0IG1zZyBub3cgKi8KKyAgcGJ1Zl9mcmVlKHApOworICBpZiAoKGVycl9yZXQgIT0gRVJSX09LKSB8fCAobXNnX3BzLT5pbnZiLmNvdW50ID09IDApKQorICB7CisgICAgLyogdmFyYmluZC1saXN0IGRlY29kZSBmYWlsZWQsIG9yIHZhcmJpbmQgbGlzdCBlbXB0eS4KKyAgICAgICBkcm9wIHJlcXVlc3Qgc2lsZW50bHksIGRvIG5vdCByZXR1cm4gZXJyb3IhCisgICAgICAgKGVycm9ycyBhcmUgb25seSByZXR1cm5lZCBmb3IgYSBzcGVjaWZpYyB2YXJiaW5kIGZhaWx1cmUpICovCisgICAgTFdJUF9ERUJVR0YoU05NUF9NU0dfREVCVUcsICgic25tcF9wZHVfZGVjX3ZhcmJpbmRsaXN0KCkgZmFpbGVkXG4iKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgbXNnX3BzLT5lcnJvcl9zdGF0dXMgPSBTTk1QX0VTX05PRVJST1I7CisgIG1zZ19wcy0+ZXJyb3JfaW5kZXggPSAwOworICAvKiBmaW5kIG9iamVjdCBmb3IgZWFjaCB2YXJpYWJsZSBiaW5kaW5nICovCisgIG1zZ19wcy0+c3RhdGUgPSBTTk1QX01TR19TRUFSQ0hfT0JKOworICAvKiBmaXJzdCB2YXJpYWJsZSBiaW5kaW5nIGZyb20gbGlzdCB0byBpbnNwZWN0ICovCisgIG1zZ19wcy0+dmJfaWR4ID0gMDsKKworICBMV0lQX0RFQlVHRihTTk1QX01TR19ERUJVRywgKCJzbm1wX3JlY3YgdmFyYmluZCBjbnQ9JSJVMTZfRiJcbiIsKHUxNl90KW1zZ19wcy0+aW52Yi5jb3VudCkpOworCisgIC8qIGhhbmRsZSBpbnB1dCBldmVudCBhbmQgYXMgbXVjaCBvYmplY3RzIGFzIHBvc3NpYmxlIGluIG9uZSBnbyAqLworICBzbm1wX21zZ19ldmVudChyZXFfaWR4KTsKK30KKworLyoqCisgKiBDaGVja3MgYW5kIGRlY29kZXMgaW5jb21pbmcgU05NUCBtZXNzYWdlIGhlYWRlciwgbG9ncyBoZWFkZXIgZXJyb3JzLgorICoKKyAqIEBwYXJhbSBwIHBvaW50cyB0byBwYnVmIGNoYWluIG9mIFNOTVAgbWVzc2FnZSAoVURQIHBheWxvYWQpCisgKiBAcGFyYW0gb2ZzIHBvaW50cyB0byBmaXJzdCBvY3RldCBvZiBTTk1QIG1lc3NhZ2UKKyAqIEBwYXJhbSBwZHVfbGVuIHRoZSBsZW5ndGggb2YgdGhlIFVEUCBwYXlsb2FkCisgKiBAcGFyYW0gb2ZzX3JldCByZXR1cm5zIHRoZSBvZnNldCBvZiB0aGUgdmFyaWFibGUgYmluZGluZ3MKKyAqIEBwYXJhbSBtX3N0YXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IG1lc3NhZ2UgcmVxdWVzdCBzdGF0ZSByZXR1cm4KKyAqIEByZXR1cm4KKyAqIC0gRVJSX09LIFNOTVAgaGVhZGVyIGlzIHNhbmUgYW5kIGFjY2VwdGVkCisgKiAtIEVSUl9BUkcgU05NUCBoZWFkZXIgaXMgZWl0aGVyIG1hbGZvcm1lZCBvciByZWplY3RlZAorICovCitzdGF0aWMgZXJyX3QKK3NubXBfcGR1X2hlYWRlcl9jaGVjayhzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1MTZfdCBwZHVfbGVuLCB1MTZfdCAqb2ZzX3JldCwgc3RydWN0IHNubXBfbXNnX3BzdGF0ICptX3N0YXQpCit7CisgIGVycl90IGRlcnI7CisgIHUxNl90IGxlbiwgb2ZzX2Jhc2U7CisgIHU4X3QgIGxlbl9vY3RldHM7CisgIHU4X3QgIHR5cGU7CisgIHMzMl90IHZlcnNpb247CisKKyAgb2ZzX2Jhc2UgPSBvZnM7CisgIHNubXBfYXNuMV9kZWNfdHlwZShwLCBvZnMsICZ0eXBlKTsKKyAgZGVyciA9IHNubXBfYXNuMV9kZWNfbGVuZ3RoKHAsIG9mcysxLCAmbGVuX29jdGV0cywgJmxlbik7CisgIGlmICgoZGVyciAhPSBFUlJfT0spIHx8CisgICAgICAocGR1X2xlbiAhPSAoMSArIGxlbl9vY3RldHMgKyBsZW4pKSB8fAorICAgICAgKHR5cGUgIT0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX0NPTlNUUiB8IFNOTVBfQVNOMV9TRVEpKSkKKyAgeworICAgIHNubXBfaW5jX3NubXBpbmFzbnBhcnNlZXJycygpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIG9mcyArPSAoMSArIGxlbl9vY3RldHMpOworICBzbm1wX2FzbjFfZGVjX3R5cGUocCwgb2ZzLCAmdHlwZSk7CisgIGRlcnIgPSBzbm1wX2FzbjFfZGVjX2xlbmd0aChwLCBvZnMrMSwgJmxlbl9vY3RldHMsICZsZW4pOworICBpZiAoKGRlcnIgIT0gRVJSX09LKSB8fCAodHlwZSAhPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKSkpCisgIHsKKyAgICAvKiBjYW4ndCBkZWNvZGUgb3Igbm8gaW50ZWdlciAodmVyc2lvbikgKi8KKyAgICBzbm1wX2luY19zbm1waW5hc25wYXJzZWVycnMoKTsKKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorICBkZXJyID0gc25tcF9hc24xX2RlY19zMzJ0KHAsIG9mcyArIDEgKyBsZW5fb2N0ZXRzLCBsZW4sICZ2ZXJzaW9uKTsKKyAgaWYgKGRlcnIgIT0gRVJSX09LKQorICB7CisgICAgLyogY2FuJ3QgZGVjb2RlICovCisgICAgc25tcF9pbmNfc25tcGluYXNucGFyc2VlcnJzKCk7CisgICAgcmV0dXJuIEVSUl9BUkc7CisgIH0KKyAgaWYgKHZlcnNpb24gIT0gMCkKKyAgeworICAgIC8qIG5vdCB2ZXJzaW9uIDEgKi8KKyAgICBzbm1wX2luY19zbm1waW5iYWR2ZXJzaW9ucygpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIG9mcyArPSAoMSArIGxlbl9vY3RldHMgKyBsZW4pOworICBzbm1wX2FzbjFfZGVjX3R5cGUocCwgb2ZzLCAmdHlwZSk7CisgIGRlcnIgPSBzbm1wX2FzbjFfZGVjX2xlbmd0aChwLCBvZnMrMSwgJmxlbl9vY3RldHMsICZsZW4pOworICBpZiAoKGRlcnIgIT0gRVJSX09LKSB8fCAodHlwZSAhPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09DX1NUUikpKQorICB7CisgICAgLyogY2FuJ3QgZGVjb2RlIG9yIG5vIG9jdGV0IHN0cmluZyAoY29tbXVuaXR5KSAqLworICAgIHNubXBfaW5jX3NubXBpbmFzbnBhcnNlZXJycygpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIGRlcnIgPSBzbm1wX2FzbjFfZGVjX3JhdyhwLCBvZnMgKyAxICsgbGVuX29jdGV0cywgbGVuLCBTTk1QX0NPTU1VTklUWV9TVFJfTEVOLCBtX3N0YXQtPmNvbW11bml0eSk7CisgIGlmIChkZXJyICE9IEVSUl9PSykKKyAgeworICAgIHNubXBfaW5jX3NubXBpbmFzbnBhcnNlZXJycygpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIC8qIGFkZCB6ZXJvIHRlcm1pbmF0b3IgKi8KKyAgbGVuID0gKChsZW4gPCAoU05NUF9DT01NVU5JVFlfU1RSX0xFTikpPyhsZW4pOihTTk1QX0NPTU1VTklUWV9TVFJfTEVOKSk7CisgIG1fc3RhdC0+Y29tbXVuaXR5W2xlbl0gPSAwOworICBtX3N0YXQtPmNvbV9zdHJsZW4gPSAodThfdClsZW47CisgIGlmIChzdHJuY21wKHNubXBfcHVibGljY29tbXVuaXR5LCAoY29uc3QgY2hhciopbV9zdGF0LT5jb21tdW5pdHksIFNOTVBfQ09NTVVOSVRZX1NUUl9MRU4pICE9IDApCisgIHsKKyAgICAvKiogQHRvZG86IG1vdmUgdGhpcyBpZiB3ZSBuZWVkIHRvIGNoZWNrIG1vcmUgbmFtZXMgKi8KKyAgICBzbm1wX2luY19zbm1waW5iYWRjb21tdW5pdHluYW1lcygpOworICAgIHNubXBfYXV0aGZhaWxfdHJhcCgpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIG9mcyArPSAoMSArIGxlbl9vY3RldHMgKyBsZW4pOworICBzbm1wX2FzbjFfZGVjX3R5cGUocCwgb2ZzLCAmdHlwZSk7CisgIGRlcnIgPSBzbm1wX2FzbjFfZGVjX2xlbmd0aChwLCBvZnMrMSwgJmxlbl9vY3RldHMsICZsZW4pOworICBpZiAoZGVyciAhPSBFUlJfT0spCisgIHsKKyAgICBzbm1wX2luY19zbm1waW5hc25wYXJzZWVycnMoKTsKKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorICBzd2l0Y2godHlwZSkKKyAgeworICAgIGNhc2UgKFNOTVBfQVNOMV9DT05UWFQgfCBTTk1QX0FTTjFfQ09OU1RSIHwgU05NUF9BU04xX1BEVV9HRVRfUkVRKToKKyAgICAgIC8qIEdldFJlcXVlc3QgUERVICovCisgICAgICBzbm1wX2luY19zbm1waW5nZXRyZXF1ZXN0cygpOworICAgICAgZGVyciA9IEVSUl9PSzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgKFNOTVBfQVNOMV9DT05UWFQgfCBTTk1QX0FTTjFfQ09OU1RSIHwgU05NUF9BU04xX1BEVV9HRVRfTkVYVF9SRVEpOgorICAgICAgLyogR2V0TmV4dFJlcXVlc3QgUERVICovCisgICAgICBzbm1wX2luY19zbm1waW5nZXRuZXh0cygpOworICAgICAgZGVyciA9IEVSUl9PSzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgKFNOTVBfQVNOMV9DT05UWFQgfCBTTk1QX0FTTjFfQ09OU1RSIHwgU05NUF9BU04xX1BEVV9HRVRfUkVTUCk6CisgICAgICAvKiBHZXRSZXNwb25zZSBQRFUgKi8KKyAgICAgIHNubXBfaW5jX3NubXBpbmdldHJlc3BvbnNlcygpOworICAgICAgZGVyciA9IEVSUl9BUkc7CisgICAgICBicmVhazsKKyAgICBjYXNlIChTTk1QX0FTTjFfQ09OVFhUIHwgU05NUF9BU04xX0NPTlNUUiB8IFNOTVBfQVNOMV9QRFVfU0VUX1JFUSk6CisgICAgICAvKiBTZXRSZXF1ZXN0IFBEVSAqLworICAgICAgc25tcF9pbmNfc25tcGluc2V0cmVxdWVzdHMoKTsKKyAgICAgIGRlcnIgPSBFUlJfT0s7CisgICAgICBicmVhazsKKyAgICBjYXNlIChTTk1QX0FTTjFfQ09OVFhUIHwgU05NUF9BU04xX0NPTlNUUiB8IFNOTVBfQVNOMV9QRFVfVFJBUCk6CisgICAgICAvKiBUcmFwIFBEVSAqLworICAgICAgc25tcF9pbmNfc25tcGludHJhcHMoKTsKKyAgICAgIGRlcnIgPSBFUlJfQVJHOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNubXBfaW5jX3NubXBpbmFzbnBhcnNlZXJycygpOworICAgICAgZGVyciA9IEVSUl9BUkc7CisgICAgICBicmVhazsKKyAgfQorICBpZiAoZGVyciAhPSBFUlJfT0spCisgIHsKKyAgICAvKiB1bnN1cHBvcnRlZCBpbnB1dCBQRFUgZm9yIHRoaXMgYWdlbnQgKG5vIHBhcnNlIGVycm9yKSAqLworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIG1fc3RhdC0+cnQgPSB0eXBlICYgMHgxRjsKKyAgb2ZzICs9ICgxICsgbGVuX29jdGV0cyk7CisgIGlmIChsZW4gIT0gKHBkdV9sZW4gLSAob2ZzIC0gb2ZzX2Jhc2UpKSkKKyAgeworICAgIC8qIGRlY29kZWQgUERVIGxlbmd0aCBkb2VzIG5vdCBlcXVhbCBhY3R1YWwgcGF5bG9hZCBsZW5ndGggKi8KKyAgICBzbm1wX2luY19zbm1waW5hc25wYXJzZWVycnMoKTsKKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorICBzbm1wX2FzbjFfZGVjX3R5cGUocCwgb2ZzLCAmdHlwZSk7CisgIGRlcnIgPSBzbm1wX2FzbjFfZGVjX2xlbmd0aChwLCBvZnMrMSwgJmxlbl9vY3RldHMsICZsZW4pOworICBpZiAoKGRlcnIgIT0gRVJSX09LKSB8fCAodHlwZSAhPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKSkpCisgIHsKKyAgICAvKiBjYW4ndCBkZWNvZGUgb3Igbm8gaW50ZWdlciAocmVxdWVzdCBJRCkgKi8KKyAgICBzbm1wX2luY19zbm1waW5hc25wYXJzZWVycnMoKTsKKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorICBkZXJyID0gc25tcF9hc24xX2RlY19zMzJ0KHAsIG9mcyArIDEgKyBsZW5fb2N0ZXRzLCBsZW4sICZtX3N0YXQtPnJpZCk7CisgIGlmIChkZXJyICE9IEVSUl9PSykKKyAgeworICAgIC8qIGNhbid0IGRlY29kZSAqLworICAgIHNubXBfaW5jX3NubXBpbmFzbnBhcnNlZXJycygpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIG9mcyArPSAoMSArIGxlbl9vY3RldHMgKyBsZW4pOworICBzbm1wX2FzbjFfZGVjX3R5cGUocCwgb2ZzLCAmdHlwZSk7CisgIGRlcnIgPSBzbm1wX2FzbjFfZGVjX2xlbmd0aChwLCBvZnMrMSwgJmxlbl9vY3RldHMsICZsZW4pOworICBpZiAoKGRlcnIgIT0gRVJSX09LKSB8fCAodHlwZSAhPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKSkpCisgIHsKKyAgICAvKiBjYW4ndCBkZWNvZGUgb3Igbm8gaW50ZWdlciAoZXJyb3Itc3RhdHVzKSAqLworICAgIHNubXBfaW5jX3NubXBpbmFzbnBhcnNlZXJycygpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIC8qIG11c3QgYmUgbm9FcnJvciAoMCkgZm9yIGluY29taW5nIHJlcXVlc3RzLgorICAgICBsb2cgZXJyb3JzIGZvciBtaWItMiBjb21wbGV0ZW5lc3MgYW5kIGZvciBkZWJ1ZyBwdXJwb3NlcyAqLworICBkZXJyID0gc25tcF9hc24xX2RlY19zMzJ0KHAsIG9mcyArIDEgKyBsZW5fb2N0ZXRzLCBsZW4sICZtX3N0YXQtPmVycm9yX3N0YXR1cyk7CisgIGlmIChkZXJyICE9IEVSUl9PSykKKyAgeworICAgIC8qIGNhbid0IGRlY29kZSAqLworICAgIHNubXBfaW5jX3NubXBpbmFzbnBhcnNlZXJycygpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIHN3aXRjaCAobV9zdGF0LT5lcnJvcl9zdGF0dXMpCisgIHsKKyAgICBjYXNlIFNOTVBfRVNfVE9PQklHOgorICAgICAgc25tcF9pbmNfc25tcGludG9vYmlncygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTTk1QX0VTX05PU1VDSE5BTUU6CisgICAgICBzbm1wX2luY19zbm1waW5ub3N1Y2huYW1lcygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTTk1QX0VTX0JBRFZBTFVFOgorICAgICAgc25tcF9pbmNfc25tcGluYmFkdmFsdWVzKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNOTVBfRVNfUkVBRE9OTFk6CisgICAgICBzbm1wX2luY19zbm1waW5yZWFkb25seXMoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU05NUF9FU19HRU5FUlJPUjoKKyAgICAgIHNubXBfaW5jX3NubXBpbmdlbmVycnMoKTsKKyAgICAgIGJyZWFrOworICB9CisgIG9mcyArPSAoMSArIGxlbl9vY3RldHMgKyBsZW4pOworICBzbm1wX2FzbjFfZGVjX3R5cGUocCwgb2ZzLCAmdHlwZSk7CisgIGRlcnIgPSBzbm1wX2FzbjFfZGVjX2xlbmd0aChwLCBvZnMrMSwgJmxlbl9vY3RldHMsICZsZW4pOworICBpZiAoKGRlcnIgIT0gRVJSX09LKSB8fCAodHlwZSAhPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKSkpCisgIHsKKyAgICAvKiBjYW4ndCBkZWNvZGUgb3Igbm8gaW50ZWdlciAoZXJyb3ItaW5kZXgpICovCisgICAgc25tcF9pbmNfc25tcGluYXNucGFyc2VlcnJzKCk7CisgICAgcmV0dXJuIEVSUl9BUkc7CisgIH0KKyAgLyogbXVzdCBiZSAwIGZvciBpbmNvbWluZyByZXF1ZXN0cy4KKyAgICAgZGVjb2RlIGFueXdheSB0byBjYXRjaCBiYWQgaW50ZWdlcnMgKGFuZCBkaXJ0eSB0cmlja3MpICovCisgIGRlcnIgPSBzbm1wX2FzbjFfZGVjX3MzMnQocCwgb2ZzICsgMSArIGxlbl9vY3RldHMsIGxlbiwgJm1fc3RhdC0+ZXJyb3JfaW5kZXgpOworICBpZiAoZGVyciAhPSBFUlJfT0spCisgIHsKKyAgICAvKiBjYW4ndCBkZWNvZGUgKi8KKyAgICBzbm1wX2luY19zbm1waW5hc25wYXJzZWVycnMoKTsKKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorICBvZnMgKz0gKDEgKyBsZW5fb2N0ZXRzICsgbGVuKTsKKyAgKm9mc19yZXQgPSBvZnM7CisgIHJldHVybiBFUlJfT0s7Cit9CisKK3N0YXRpYyBlcnJfdAorc25tcF9wZHVfZGVjX3ZhcmJpbmRsaXN0KHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMsIHUxNl90ICpvZnNfcmV0LCBzdHJ1Y3Qgc25tcF9tc2dfcHN0YXQgKm1fc3RhdCkKK3sKKyAgZXJyX3QgZGVycjsKKyAgdTE2X3QgbGVuLCB2Yl9sZW47CisgIHU4X3QgIGxlbl9vY3RldHM7CisgIHU4X3QgdHlwZTsKKworICAvKiB2YXJpYWJsZSBiaW5kaW5nIGxpc3QgKi8KKyAgc25tcF9hc24xX2RlY190eXBlKHAsIG9mcywgJnR5cGUpOworICBkZXJyID0gc25tcF9hc24xX2RlY19sZW5ndGgocCwgb2ZzKzEsICZsZW5fb2N0ZXRzLCAmdmJfbGVuKTsKKyAgaWYgKChkZXJyICE9IEVSUl9PSykgfHwKKyAgICAgICh0eXBlICE9IChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9DT05TVFIgfCBTTk1QX0FTTjFfU0VRKSkpCisgIHsKKyAgICBzbm1wX2luY19zbm1waW5hc25wYXJzZWVycnMoKTsKKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorICBvZnMgKz0gKDEgKyBsZW5fb2N0ZXRzKTsKKworICAvKiBzdGFydCB3aXRoIGVtcHR5IGxpc3QgKi8KKyAgbV9zdGF0LT5pbnZiLmNvdW50ID0gMDsKKyAgbV9zdGF0LT5pbnZiLmhlYWQgPSBOVUxMOworICBtX3N0YXQtPmludmIudGFpbCA9IE5VTEw7CisKKyAgd2hpbGUgKHZiX2xlbiA+IDApCisgIHsKKyAgICBzdHJ1Y3Qgc25tcF9vYmpfaWQgb2lkLCBvaWRfdmFsdWU7CisgICAgc3RydWN0IHNubXBfdmFyYmluZCAqdmI7CisKKyAgICBzbm1wX2FzbjFfZGVjX3R5cGUocCwgb2ZzLCAmdHlwZSk7CisgICAgZGVyciA9IHNubXBfYXNuMV9kZWNfbGVuZ3RoKHAsIG9mcysxLCAmbGVuX29jdGV0cywgJmxlbik7CisgICAgaWYgKChkZXJyICE9IEVSUl9PSykgfHwKKyAgICAgICAgKHR5cGUgIT0gKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX0NPTlNUUiB8IFNOTVBfQVNOMV9TRVEpKSB8fAorICAgICAgICAobGVuID09IDApIHx8IChsZW4gPiB2Yl9sZW4pKQorICAgIHsKKyAgICAgIHNubXBfaW5jX3NubXBpbmFzbnBhcnNlZXJycygpOworICAgICAgLyogZnJlZSB2YXJiaW5kcyAoaWYgYXZhaWxhYmxlKSAqLworICAgICAgc25tcF92YXJiaW5kX2xpc3RfZnJlZSgmbV9zdGF0LT5pbnZiKTsKKyAgICAgIHJldHVybiBFUlJfQVJHOworICAgIH0KKyAgICBvZnMgKz0gKDEgKyBsZW5fb2N0ZXRzKTsKKyAgICB2Yl9sZW4gLT0gKDEgKyBsZW5fb2N0ZXRzKTsKKworICAgIHNubXBfYXNuMV9kZWNfdHlwZShwLCBvZnMsICZ0eXBlKTsKKyAgICBkZXJyID0gc25tcF9hc24xX2RlY19sZW5ndGgocCwgb2ZzKzEsICZsZW5fb2N0ZXRzLCAmbGVuKTsKKyAgICBpZiAoKGRlcnIgIT0gRVJSX09LKSB8fCAodHlwZSAhPSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09CSl9JRCkpKQorICAgIHsKKyAgICAgIC8qIGNhbid0IGRlY29kZSBvYmplY3QgbmFtZSBsZW5ndGggKi8KKyAgICAgIHNubXBfaW5jX3NubXBpbmFzbnBhcnNlZXJycygpOworICAgICAgLyogZnJlZSB2YXJiaW5kcyAoaWYgYXZhaWxhYmxlKSAqLworICAgICAgc25tcF92YXJiaW5kX2xpc3RfZnJlZSgmbV9zdGF0LT5pbnZiKTsKKyAgICAgIHJldHVybiBFUlJfQVJHOworICAgIH0KKyAgICBkZXJyID0gc25tcF9hc24xX2RlY19vaWQocCwgb2ZzICsgMSArIGxlbl9vY3RldHMsIGxlbiwgJm9pZCk7CisgICAgaWYgKGRlcnIgIT0gRVJSX09LKQorICAgIHsKKyAgICAgIC8qIGNhbid0IGRlY29kZSBvYmplY3QgbmFtZSAqLworICAgICAgc25tcF9pbmNfc25tcGluYXNucGFyc2VlcnJzKCk7CisgICAgICAvKiBmcmVlIHZhcmJpbmRzIChpZiBhdmFpbGFibGUpICovCisgICAgICBzbm1wX3ZhcmJpbmRfbGlzdF9mcmVlKCZtX3N0YXQtPmludmIpOworICAgICAgcmV0dXJuIEVSUl9BUkc7CisgICAgfQorICAgIG9mcyArPSAoMSArIGxlbl9vY3RldHMgKyBsZW4pOworICAgIHZiX2xlbiAtPSAoMSArIGxlbl9vY3RldHMgKyBsZW4pOworCisgICAgc25tcF9hc24xX2RlY190eXBlKHAsIG9mcywgJnR5cGUpOworICAgIGRlcnIgPSBzbm1wX2FzbjFfZGVjX2xlbmd0aChwLCBvZnMrMSwgJmxlbl9vY3RldHMsICZsZW4pOworICAgIGlmIChkZXJyICE9IEVSUl9PSykKKyAgICB7CisgICAgICAvKiBjYW4ndCBkZWNvZGUgb2JqZWN0IHZhbHVlIGxlbmd0aCAqLworICAgICAgc25tcF9pbmNfc25tcGluYXNucGFyc2VlcnJzKCk7CisgICAgICAvKiBmcmVlIHZhcmJpbmRzIChpZiBhdmFpbGFibGUpICovCisgICAgICBzbm1wX3ZhcmJpbmRfbGlzdF9mcmVlKCZtX3N0YXQtPmludmIpOworICAgICAgcmV0dXJuIEVSUl9BUkc7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRyk6CisgICAgICAgIHZiID0gc25tcF92YXJiaW5kX2FsbG9jKCZvaWQsIHR5cGUsIHNpemVvZihzMzJfdCkpOworICAgICAgICBpZiAodmIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHMzMl90ICp2cHRyID0gKHMzMl90Kil2Yi0+dmFsdWU7CisKKyAgICAgICAgICBkZXJyID0gc25tcF9hc24xX2RlY19zMzJ0KHAsIG9mcyArIDEgKyBsZW5fb2N0ZXRzLCBsZW4sIHZwdHIpOworICAgICAgICAgIHNubXBfdmFyYmluZF90YWlsX2FkZCgmbV9zdGF0LT5pbnZiLCB2Yik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGVyciA9IEVSUl9BUkc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9DT1VOVEVSKToKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0dBVUdFKToKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX1RJTUVUSUNLUyk6CisgICAgICAgIHZiID0gc25tcF92YXJiaW5kX2FsbG9jKCZvaWQsIHR5cGUsIHNpemVvZih1MzJfdCkpOworICAgICAgICBpZiAodmIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHUzMl90ICp2cHRyID0gKHUzMl90Kil2Yi0+dmFsdWU7CisKKyAgICAgICAgICBkZXJyID0gc25tcF9hc24xX2RlY191MzJ0KHAsIG9mcyArIDEgKyBsZW5fb2N0ZXRzLCBsZW4sIHZwdHIpOworICAgICAgICAgIHNubXBfdmFyYmluZF90YWlsX2FkZCgmbV9zdGF0LT5pbnZiLCB2Yik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGVyciA9IEVSUl9BUkc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfT0NfU1RSKToKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09QQVFVRSk6CisgICAgICAgIExXSVBfQVNTRVJUKCJpbnZhbGlkIGxlbmd0aCIsIGxlbiA8PSAweGZmKTsKKyAgICAgICAgdmIgPSBzbm1wX3ZhcmJpbmRfYWxsb2MoJm9pZCwgdHlwZSwgKHU4X3QpbGVuKTsKKyAgICAgICAgaWYgKHZiICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkZXJyID0gc25tcF9hc24xX2RlY19yYXcocCwgb2ZzICsgMSArIGxlbl9vY3RldHMsIGxlbiwgdmItPnZhbHVlX2xlbiwgKHU4X3QqKXZiLT52YWx1ZSk7CisgICAgICAgICAgc25tcF92YXJiaW5kX3RhaWxfYWRkKCZtX3N0YXQtPmludmIsIHZiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkZXJyID0gRVJSX0FSRzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9OVUwpOgorICAgICAgICB2YiA9IHNubXBfdmFyYmluZF9hbGxvYygmb2lkLCB0eXBlLCAwKTsKKyAgICAgICAgaWYgKHZiICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBzbm1wX3ZhcmJpbmRfdGFpbF9hZGQoJm1fc3RhdC0+aW52YiwgdmIpOworICAgICAgICAgIGRlcnIgPSBFUlJfT0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGVyciA9IEVSUl9BUkc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfT0JKX0lEKToKKyAgICAgICAgZGVyciA9IHNubXBfYXNuMV9kZWNfb2lkKHAsIG9mcyArIDEgKyBsZW5fb2N0ZXRzLCBsZW4sICZvaWRfdmFsdWUpOworICAgICAgICBpZiAoZGVyciA9PSBFUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICB2YiA9IHNubXBfdmFyYmluZF9hbGxvYygmb2lkLCB0eXBlLCBvaWRfdmFsdWUubGVuICogc2l6ZW9mKHMzMl90KSk7CisgICAgICAgICAgaWYgKHZiICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgdThfdCBpID0gb2lkX3ZhbHVlLmxlbjsKKyAgICAgICAgICAgIHMzMl90ICp2cHRyID0gKHMzMl90Kil2Yi0+dmFsdWU7CisKKyAgICAgICAgICAgIHdoaWxlKGkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgIHZwdHJbaV0gPSBvaWRfdmFsdWUuaWRbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbm1wX3ZhcmJpbmRfdGFpbF9hZGQoJm1fc3RhdC0+aW52YiwgdmIpOworICAgICAgICAgICAgZGVyciA9IEVSUl9PSzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRlcnIgPSBFUlJfQVJHOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lQQUREUik6CisgICAgICAgIGlmIChsZW4gPT0gNCkKKyAgICAgICAgeworICAgICAgICAgIC8qIG11c3QgYmUgZXhhY3RseSA0IG9jdGV0cyEgKi8KKyAgICAgICAgICB2YiA9IHNubXBfdmFyYmluZF9hbGxvYygmb2lkLCB0eXBlLCA0KTsKKyAgICAgICAgICBpZiAodmIgIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkZXJyID0gc25tcF9hc24xX2RlY19yYXcocCwgb2ZzICsgMSArIGxlbl9vY3RldHMsIGxlbiwgdmItPnZhbHVlX2xlbiwgKHU4X3QqKXZiLT52YWx1ZSk7CisgICAgICAgICAgICBzbm1wX3ZhcmJpbmRfdGFpbF9hZGQoJm1fc3RhdC0+aW52YiwgdmIpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgZGVyciA9IEVSUl9BUkc7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRlcnIgPSBFUlJfQVJHOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZGVyciA9IEVSUl9BUkc7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZGVyciAhPSBFUlJfT0spCisgICAgeworICAgICAgc25tcF9pbmNfc25tcGluYXNucGFyc2VlcnJzKCk7CisgICAgICAvKiBmcmVlIHZhcmJpbmRzIChpZiBhdmFpbGFibGUpICovCisgICAgICBzbm1wX3ZhcmJpbmRfbGlzdF9mcmVlKCZtX3N0YXQtPmludmIpOworICAgICAgcmV0dXJuIEVSUl9BUkc7CisgICAgfQorICAgIG9mcyArPSAoMSArIGxlbl9vY3RldHMgKyBsZW4pOworICAgIHZiX2xlbiAtPSAoMSArIGxlbl9vY3RldHMgKyBsZW4pOworICB9CisKKyAgaWYgKG1fc3RhdC0+cnQgPT0gU05NUF9BU04xX1BEVV9TRVRfUkVRKQorICB7CisgICAgc25tcF9hZGRfc25tcGludG90YWxzZXR2YXJzKG1fc3RhdC0+aW52Yi5jb3VudCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc25tcF9hZGRfc25tcGludG90YWxyZXF2YXJzKG1fc3RhdC0+aW52Yi5jb3VudCk7CisgIH0KKworICAqb2ZzX3JldCA9IG9mczsKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworc3RydWN0IHNubXBfdmFyYmluZCoKK3NubXBfdmFyYmluZF9hbGxvYyhzdHJ1Y3Qgc25tcF9vYmpfaWQgKm9pZCwgdThfdCB0eXBlLCB1OF90IGxlbikKK3sKKyAgc3RydWN0IHNubXBfdmFyYmluZCAqdmI7CisKKyAgdmIgPSAoc3RydWN0IHNubXBfdmFyYmluZCAqKW1lbXBfbWFsbG9jKE1FTVBfU05NUF9WQVJCSU5EKTsKKyAgTFdJUF9BU1NFUlQoInZiICE9IE5VTEwiLHZiICE9IE5VTEwpOworICBpZiAodmIgIT0gTlVMTCkKKyAgeworICAgIHU4X3QgaTsKKworICAgIHZiLT5uZXh0ID0gTlVMTDsKKyAgICB2Yi0+cHJldiA9IE5VTEw7CisgICAgaSA9IG9pZC0+bGVuOworICAgIHZiLT5pZGVudF9sZW4gPSBpOworICAgIGlmIChpID4gMCkKKyAgICB7CisgICAgICBMV0lQX0FTU0VSVCgiU05NUF9NQVhfVFJFRV9ERVBUSCBpcyBjb25maWd1cmVkIHRvbyBsb3ciLCBpIDw9IFNOTVBfTUFYX1RSRUVfREVQVEgpOworICAgICAgLyogYWxsb2NhdGUgYXJyYXkgb2YgczMyX3QgZm9yIG91ciBvYmplY3QgaWRlbnRpZmllciAqLworICAgICAgdmItPmlkZW50ID0gKHMzMl90KiltZW1wX21hbGxvYyhNRU1QX1NOTVBfVkFMVUUpOworICAgICAgTFdJUF9BU1NFUlQoInZiLT5pZGVudCAhPSBOVUxMIix2Yi0+aWRlbnQgIT0gTlVMTCk7CisgICAgICBpZiAodmItPmlkZW50ID09IE5VTEwpCisgICAgICB7CisgICAgICAgIG1lbXBfZnJlZShNRU1QX1NOTVBfVkFSQklORCwgdmIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHdoaWxlKGkgPiAwKQorICAgICAgeworICAgICAgICBpLS07CisgICAgICAgIHZiLT5pZGVudFtpXSA9IG9pZC0+aWRbaV07CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBpID09IDAsIHBhc3MgemVybyBsZW5ndGggb2JqZWN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHZiLT5pZGVudCA9IE5VTEw7CisgICAgfQorICAgIHZiLT52YWx1ZV90eXBlID0gdHlwZTsKKyAgICB2Yi0+dmFsdWVfbGVuID0gbGVuOworICAgIGlmIChsZW4gPiAwKQorICAgIHsKKyAgICAgIExXSVBfQVNTRVJUKCJTTk1QX01BWF9PQ1RFVF9TVFJJTkdfTEVOIGlzIGNvbmZpZ3VyZWQgdG9vIGxvdyIsIHZiLT52YWx1ZV9sZW4gPD0gU05NUF9NQVhfVkFMVUVfU0laRSk7CisgICAgICAvKiBhbGxvY2F0ZSByYXcgYnl0ZXMgZm9yIG91ciBvYmplY3QgdmFsdWUgKi8KKyAgICAgIHZiLT52YWx1ZSA9IG1lbXBfbWFsbG9jKE1FTVBfU05NUF9WQUxVRSk7CisgICAgICBMV0lQX0FTU0VSVCgidmItPnZhbHVlICE9IE5VTEwiLHZiLT52YWx1ZSAhPSBOVUxMKTsKKyAgICAgIGlmICh2Yi0+dmFsdWUgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaWYgKHZiLT5pZGVudCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgbWVtcF9mcmVlKE1FTVBfU05NUF9WQUxVRSwgdmItPmlkZW50KTsKKyAgICAgICAgfQorICAgICAgICBtZW1wX2ZyZWUoTUVNUF9TTk1QX1ZBUkJJTkQsIHZiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBBU04xX05VTCB0eXBlLCBvciB6ZXJvIGxlbmd0aCBBU04xX09DX1NUUiAqLworICAgICAgdmItPnZhbHVlID0gTlVMTDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHZiOworfQorCit2b2lkCitzbm1wX3ZhcmJpbmRfZnJlZShzdHJ1Y3Qgc25tcF92YXJiaW5kICp2YikKK3sKKyAgaWYgKHZiLT52YWx1ZSAhPSBOVUxMICkKKyAgeworICAgIG1lbXBfZnJlZShNRU1QX1NOTVBfVkFMVUUsIHZiLT52YWx1ZSk7CisgIH0KKyAgaWYgKHZiLT5pZGVudCAhPSBOVUxMICkKKyAgeworICAgIG1lbXBfZnJlZShNRU1QX1NOTVBfVkFMVUUsIHZiLT5pZGVudCk7CisgIH0KKyAgbWVtcF9mcmVlKE1FTVBfU05NUF9WQVJCSU5ELCB2Yik7Cit9CisKK3ZvaWQKK3NubXBfdmFyYmluZF9saXN0X2ZyZWUoc3RydWN0IHNubXBfdmFyYmluZF9yb290ICpyb290KQoreworICBzdHJ1Y3Qgc25tcF92YXJiaW5kICp2YiwgKnByZXY7CisKKyAgdmIgPSByb290LT50YWlsOworICB3aGlsZSAoIHZiICE9IE5VTEwgKQorICB7CisgICAgcHJldiA9IHZiLT5wcmV2OworICAgIHNubXBfdmFyYmluZF9mcmVlKHZiKTsKKyAgICB2YiA9IHByZXY7CisgIH0KKyAgcm9vdC0+Y291bnQgPSAwOworICByb290LT5oZWFkID0gTlVMTDsKKyAgcm9vdC0+dGFpbCA9IE5VTEw7Cit9CisKK3ZvaWQKK3NubXBfdmFyYmluZF90YWlsX2FkZChzdHJ1Y3Qgc25tcF92YXJiaW5kX3Jvb3QgKnJvb3QsIHN0cnVjdCBzbm1wX3ZhcmJpbmQgKnZiKQoreworICBpZiAocm9vdC0+Y291bnQgPT0gMCkKKyAgeworICAgIC8qIGFkZCBmaXJzdCB2YXJiaW5kIHRvIGxpc3QgKi8KKyAgICByb290LT5oZWFkID0gdmI7CisgICAgcm9vdC0+dGFpbCA9IHZiOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIGFkZCBudGggdmFyYmluZCB0byBsaXN0IHRhaWwgKi8KKyAgICByb290LT50YWlsLT5uZXh0ID0gdmI7CisgICAgdmItPnByZXYgPSByb290LT50YWlsOworICAgIHJvb3QtPnRhaWwgPSB2YjsKKyAgfQorICByb290LT5jb3VudCArPSAxOworfQorCitzdHJ1Y3Qgc25tcF92YXJiaW5kKgorc25tcF92YXJiaW5kX3RhaWxfcmVtb3ZlKHN0cnVjdCBzbm1wX3ZhcmJpbmRfcm9vdCAqcm9vdCkKK3sKKyAgc3RydWN0IHNubXBfdmFyYmluZCogdmI7CisKKyAgaWYgKHJvb3QtPmNvdW50ID4gMCkKKyAgeworICAgIC8qIHJlbW92ZSB0YWlsIHZhcmJpbmQgKi8KKyAgICB2YiA9IHJvb3QtPnRhaWw7CisgICAgcm9vdC0+dGFpbCA9IHZiLT5wcmV2OworICAgIHZiLT5wcmV2LT5uZXh0ID0gTlVMTDsKKyAgICByb290LT5jb3VudCAtPSAxOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gcmVtb3ZlICovCisgICAgdmIgPSBOVUxMOworICB9CisgIHJldHVybiB2YjsKK30KKworI2VuZGlmIC8qIExXSVBfU05NUCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL3NubXAvbXNnX291dC5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL3NubXAvbXNnX291dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzhiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvc25tcC9tc2dfb3V0LmMKQEAgLTAsMCArMSw2ODEgQEAKKy8qKgorICogQGZpbGUKKyAqIFNOTVAgb3V0cHV0IG1lc3NhZ2UgcHJvY2Vzc2luZyAoUkZDMTE1NykuCisgKgorICogT3V0cHV0IHJlc3BvbnNlcyBhbmQgdHJhcHMgYXJlIGJ1aWxkIGluIHR3byBwYXNzZXM6CisgKgorICogUGFzcyAwOiBpdGVyYXRlIG92ZXIgdGhlIG91dHB1dCBtZXNzYWdlIGJhY2t3YXJkcyB0byBkZXRlcm1pbmUgZW5jb2RpbmcgbGVuZ3RocworICogUGFzcyAxOiB0aGUgYWN0dWFsIGZvcndhcmQgZW5jb2Rpbmcgb2YgaW50ZXJuYWwgZm9ybSBpbnRvIEFTTjEKKyAqCisgKiBUaGUgc2luZ2xlLXBhc3MgZW5jb2RpbmcgbWV0aG9kIGRlc2NyaWJlZCBieSBDb21lciAmIFN0ZXZlbnMKKyAqIHJlcXVpcmVzIGV4dHJhIGJ1ZmZlciBzcGFjZSBhbmQgY29weWluZyBmb3IgcmV2ZXJzYWwgb2YgdGhlIHBhY2tldC4KKyAqIFRoZSBidWZmZXIgcmVxdWlyZW1lbnQgY2FuIGJlIHByb2hpYml0aXZlbHkgbGFyZ2UgZm9yIGJpZyBwYXlsb2FkcworICogKD49IDQ4NCkgdGhlcmVmb3JlIHdlIHVzZSB0aGUgdHdvIGVuY29kaW5nIHBhc3Nlcy4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEF4b24gRGlnaXRhbCBEZXNpZ24gQi5WLiwgVGhlIE5ldGhlcmxhbmRzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogQ2hyaXN0aWFhbiBTaW1vbnMgPGNocmlzdGlhYW4uc2ltb25zQGF4b24udHY+CisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX1NOTVAgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL3VkcC5oIgorI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKyNpbmNsdWRlICJsd2lwL3NubXAuaCIKKyNpbmNsdWRlICJsd2lwL3NubXBfYXNuMS5oIgorI2luY2x1ZGUgImx3aXAvc25tcF9tc2cuaCIKKworc3RydWN0IHNubXBfdHJhcF9kc3QKK3sKKyAgLyogZGVzdGluYXRpb24gSVAgYWRkcmVzcyBpbiBuZXR3b3JrIG9yZGVyICovCisgIGlwX2FkZHJfdCBkaXA7CisgIC8qIHNldCB0byAwIHdoZW4gZGlzYWJsZWQsID4wIHdoZW4gZW5hYmxlZCAqLworICB1OF90IGVuYWJsZTsKK307CitzdHJ1Y3Qgc25tcF90cmFwX2RzdCB0cmFwX2RzdFtTTk1QX1RSQVBfREVTVElOQVRJT05TXTsKKworLyoqIFRSQVAgbWVzc2FnZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBzbm1wX21zZ190cmFwIHRyYXBfbXNnOworCitzdGF0aWMgdTE2X3Qgc25tcF9yZXNwX2hlYWRlcl9zdW0oc3RydWN0IHNubXBfbXNnX3BzdGF0ICptX3N0YXQsIHUxNl90IHZiX2xlbik7CitzdGF0aWMgdTE2X3Qgc25tcF90cmFwX2hlYWRlcl9zdW0oc3RydWN0IHNubXBfbXNnX3RyYXAgKm1fdHJhcCwgdTE2X3QgdmJfbGVuKTsKK3N0YXRpYyB1MTZfdCBzbm1wX3ZhcmJpbmRfbGlzdF9zdW0oc3RydWN0IHNubXBfdmFyYmluZF9yb290ICpyb290KTsKKworc3RhdGljIHUxNl90IHNubXBfcmVzcF9oZWFkZXJfZW5jKHN0cnVjdCBzbm1wX21zZ19wc3RhdCAqbV9zdGF0LCBzdHJ1Y3QgcGJ1ZiAqcCk7CitzdGF0aWMgdTE2X3Qgc25tcF90cmFwX2hlYWRlcl9lbmMoc3RydWN0IHNubXBfbXNnX3RyYXAgKm1fdHJhcCwgc3RydWN0IHBidWYgKnApOworc3RhdGljIHUxNl90IHNubXBfdmFyYmluZF9saXN0X2VuYyhzdHJ1Y3Qgc25tcF92YXJiaW5kX3Jvb3QgKnJvb3QsIHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMpOworCisvKioKKyAqIFNldHMgZW5hYmxlIHN3aXRjaCBmb3IgdGhpcyB0cmFwIGRlc3RpbmF0aW9uLgorICogQHBhcmFtIGRzdF9pZHggaW5kZXggaW4gMCAuLiBTTk1QX1RSQVBfREVTVElOQVRJT05TLTEKKyAqIEBwYXJhbSBlbmFibGUgc3dpdGNoIGlmIDAgZGVzdGluYXRpb24gaXMgZGlzYWJsZWQgPjAgZW5hYmxlZC4KKyAqLwordm9pZAorc25tcF90cmFwX2RzdF9lbmFibGUodThfdCBkc3RfaWR4LCB1OF90IGVuYWJsZSkKK3sKKyAgaWYgKGRzdF9pZHggPCBTTk1QX1RSQVBfREVTVElOQVRJT05TKQorICB7CisgICAgdHJhcF9kc3RbZHN0X2lkeF0uZW5hYmxlID0gZW5hYmxlOworICB9Cit9CisKKy8qKgorICogU2V0cyBJUHY0IGFkZHJlc3MgZm9yIHRoaXMgdHJhcCBkZXN0aW5hdGlvbi4KKyAqIEBwYXJhbSBkc3RfaWR4IGluZGV4IGluIDAgLi4gU05NUF9UUkFQX0RFU1RJTkFUSU9OUy0xCisgKiBAcGFyYW0gZHN0IElQdjQgYWRkcmVzcyBpbiBob3N0IG9yZGVyLgorICovCit2b2lkCitzbm1wX3RyYXBfZHN0X2lwX3NldCh1OF90IGRzdF9pZHgsIGlwX2FkZHJfdCAqZHN0KQoreworICBpZiAoZHN0X2lkeCA8IFNOTVBfVFJBUF9ERVNUSU5BVElPTlMpCisgIHsKKyAgICBpcF9hZGRyX3NldCgmdHJhcF9kc3RbZHN0X2lkeF0uZGlwLCBkc3QpOworICB9Cit9CisKKy8qKgorICogU2VuZHMgYSAnZ2V0cmVzcG9uc2UnIG1lc3NhZ2UgdG8gdGhlIHJlcXVlc3Qgb3JpZ2luYXRvci4KKyAqCisgKiBAcGFyYW0gbV9zdGF0IHBvaW50cyB0byB0aGUgY3VycmVudCBtZXNzYWdlIHJlcXVlc3Qgc3RhdGUgc291cmNlCisgKiBAcmV0dXJuIEVSUl9PSyB3aGVuIHN1Y2Nlc3MsIEVSUl9NRU0gaWYgd2UncmUgb3V0IG9mIG1lbW9yeQorICoKKyAqIEBub3RlIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gb3V0dmIgaW4gdGhlIG1fc3RhdAorICogYW5kIHByb3ZpZGUgZXJyb3Itc3RhdHVzIGFuZCBpbmRleCAoZXhjZXB0IGZvciB0b29CaWcgZXJyb3JzKSAuLi4KKyAqLworZXJyX3QKK3NubXBfc2VuZF9yZXNwb25zZShzdHJ1Y3Qgc25tcF9tc2dfcHN0YXQgKm1fc3RhdCkKK3sKKyAgc3RydWN0IHNubXBfdmFyYmluZF9yb290IGVtcHR5dmIgPSB7TlVMTCwgTlVMTCwgMCwgMCwgMH07CisgIHN0cnVjdCBwYnVmICpwOworICB1MTZfdCB0b3RfbGVuOworICBlcnJfdCBlcnI7CisKKyAgLyogcGFzcyAwLCBjYWxjdWxhdGUgbGVuZ3RoIGZpZWxkcyAqLworICB0b3RfbGVuID0gc25tcF92YXJiaW5kX2xpc3Rfc3VtKCZtX3N0YXQtPm91dHZiKTsKKyAgdG90X2xlbiA9IHNubXBfcmVzcF9oZWFkZXJfc3VtKG1fc3RhdCwgdG90X2xlbik7CisKKyAgLyogdHJ5IGFsbG9jYXRpbmcgcGJ1ZihzKSBmb3IgY29tcGxldGUgcmVzcG9uc2UgKi8KKyAgcCA9IHBidWZfYWxsb2MoUEJVRl9UUkFOU1BPUlQsIHRvdF9sZW4sIFBCVUZfUE9PTCk7CisgIGlmIChwID09IE5VTEwpCisgIHsKKyAgICBMV0lQX0RFQlVHRihTTk1QX01TR19ERUJVRywgKCJzbm1wX3NuZF9yZXNwb25zZSgpIHRvb0JpZ1xuIikpOworCisgICAgLyogY2FuJ3QgY29uc3RydWN0IHJlcGx5LCByZXR1cm4gZXJyb3Itc3RhdHVzIHRvb0JpZyAqLworICAgIG1fc3RhdC0+ZXJyb3Jfc3RhdHVzID0gU05NUF9FU19UT09CSUc7CisgICAgbV9zdGF0LT5lcnJvcl9pbmRleCA9IDA7CisgICAgLyogcGFzcyAwLCByZWNhbGN1bGF0ZSBsZW5ndGhzLCBmb3IgZW1wdHkgdmFyYmluZC1saXN0ICovCisgICAgdG90X2xlbiA9IHNubXBfdmFyYmluZF9saXN0X3N1bSgmZW1wdHl2Yik7CisgICAgdG90X2xlbiA9IHNubXBfcmVzcF9oZWFkZXJfc3VtKG1fc3RhdCwgdG90X2xlbik7CisgICAgLyogcmV0cnkgYWxsb2NhdGlvbiBvbmNlIGZvciBoZWFkZXIgYW5kIGVtcHR5IHZhcmJpbmQtbGlzdCAqLworICAgIHAgPSBwYnVmX2FsbG9jKFBCVUZfVFJBTlNQT1JULCB0b3RfbGVuLCBQQlVGX1BPT0wpOworICB9CisgIGlmIChwICE9IE5VTEwpCisgIHsKKyAgICAvKiBmaXJzdCBwYnVmIGFsbG9jIHRyeSBvciByZXRyeSBhbGxvYyBzdWNjZXNzICovCisgICAgdTE2X3Qgb2ZzOworCisgICAgTFdJUF9ERUJVR0YoU05NUF9NU0dfREVCVUcsICgic25tcF9zbmRfcmVzcG9uc2UoKSBwICE9IE5VTExcbiIpKTsKKworICAgIC8qIHBhc3MgMSwgc2l6ZSBlcnJvciwgZW5jb2RlIHBhY2tldCBpbm8gdGhlIHBidWYocykgKi8KKyAgICBvZnMgPSBzbm1wX3Jlc3BfaGVhZGVyX2VuYyhtX3N0YXQsIHApOworICAgIGlmIChtX3N0YXQtPmVycm9yX3N0YXR1cyA9PSBTTk1QX0VTX1RPT0JJRykKKyAgICB7CisgICAgICBzbm1wX3ZhcmJpbmRfbGlzdF9lbmMoJmVtcHR5dmIsIHAsIG9mcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzbm1wX3ZhcmJpbmRfbGlzdF9lbmMoJm1fc3RhdC0+b3V0dmIsIHAsIG9mcyk7CisgICAgfQorCisgICAgc3dpdGNoIChtX3N0YXQtPmVycm9yX3N0YXR1cykKKyAgICB7CisgICAgICBjYXNlIFNOTVBfRVNfVE9PQklHOgorICAgICAgICBzbm1wX2luY19zbm1wb3V0dG9vYmlncygpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU05NUF9FU19OT1NVQ0hOQU1FOgorICAgICAgICBzbm1wX2luY19zbm1wb3V0bm9zdWNobmFtZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNOTVBfRVNfQkFEVkFMVUU6CisgICAgICAgIHNubXBfaW5jX3NubXBvdXRiYWR2YWx1ZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNOTVBfRVNfR0VORVJST1I6CisgICAgICAgIHNubXBfaW5jX3NubXBvdXRnZW5lcnJzKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzbm1wX2luY19zbm1wb3V0Z2V0cmVzcG9uc2VzKCk7CisgICAgc25tcF9pbmNfc25tcG91dHBrdHMoKTsKKworICAgIC8qKiBAdG9kbyBkbyB3ZSBuZWVkIHNlcGFyYXRlIHJ4IGFuZCB0eCBwY2JzIGZvciB0aHJlYWRlZCBjYXNlPyAqLworICAgIC8qKiBjb25uZWN0IHRvIHRoZSBvcmlnaW5hdGluZyBzb3VyY2UgKi8KKyAgICB1ZHBfY29ubmVjdChtX3N0YXQtPnBjYiwgJm1fc3RhdC0+c2lwLCBtX3N0YXQtPnNwKTsKKyAgICBlcnIgPSB1ZHBfc2VuZChtX3N0YXQtPnBjYiwgcCk7CisgICAgaWYgKGVyciA9PSBFUlJfTUVNKQorICAgIHsKKyAgICAgIC8qKiBAdG9kbyByZWxlYXNlIHNvbWUgbWVtb3J5LCByZXRyeSBhbmQgcmV0dXJuIHRvb0JpZz8gdG9vTXVjaEhhc3NsZT8gKi8KKyAgICAgIGVyciA9IEVSUl9NRU07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBlcnIgPSBFUlJfT0s7CisgICAgfQorICAgIC8qKiBkaXNhc3NvY2lhdGUgcmVtb3RlIGFkZHJlc3MgYW5kIHBvcnQgd2l0aCB0aGlzIHBjYiAqLworICAgIHVkcF9kaXNjb25uZWN0KG1fc3RhdC0+cGNiKTsKKworICAgIHBidWZfZnJlZShwKTsKKyAgICBMV0lQX0RFQlVHRihTTk1QX01TR19ERUJVRywgKCJzbm1wX3NuZF9yZXNwb25zZSgpIGRvbmVcbiIpKTsKKyAgICByZXR1cm4gZXJyOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIGZpcnN0IHBidWYgYWxsb2MgdHJ5IG9yIHJldHJ5IGFsbG9jIGZhaWxlZAorICAgICAgIHZlcnkgbG93IG9uIG1lbW9yeSwgY291bGRuJ3QgcmV0dXJuIHRvb0JpZyAqLworICAgIHJldHVybiBFUlJfTUVNOworICB9Cit9CisKKworLyoqCisgKiBTZW5kcyBhbiBnZW5lcmljIG9yIGVudGVycHJpc2Ugc3BlY2lmaWMgdHJhcCBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBnZW5lcmljX3RyYXAgaXMgdGhlIHRyYXAgY29kZQorICogQHBhcmFtIGVvaWQgcG9pbnRzIHRvIGVudGVycHJpc2Ugb2JqZWN0IGlkZW50aWZpZXIKKyAqIEBwYXJhbSBzcGVjaWZpY190cmFwIHVzZWQgZm9yIGVudGVycHJpc2UgdHJhcHMgd2hlbiBnZW5lcmljX3RyYXAgPT0gNgorICogQHJldHVybiBFUlJfT0sgd2hlbiBzdWNjZXNzLCBFUlJfTUVNIGlmIHdlJ3JlIG91dCBvZiBtZW1vcnkKKyAqCisgKiBAbm90ZSB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIG91dHZiIGluIHRoZSB0cmFwX21zZworICogQG5vdGUgdGhlIHVzZSBvZiB0aGUgZW50ZXJwaXNlIGlkZW50aWZpZXIgZmllbGQKKyAqIGlzIHBlciBSRkMxMjE1LgorICogVXNlIC5pc28ub3JnLmRvZC5pbnRlcm5ldC5tZ210Lm1pYi0yLnNubXAgZm9yIGdlbmVyaWMgdHJhcHMKKyAqIGFuZCAuaXNvLm9yZy5kb2QuaW50ZXJuZXQucHJpdmF0ZS5lbnRlcnByaXNlcy55b3VyZW50ZXJwcmlzZQorICogKHN5c09iamVjdElEKSBmb3Igc3BlY2lmaWMgdHJhcHMuCisgKi8KK2Vycl90Citzbm1wX3NlbmRfdHJhcChzOF90IGdlbmVyaWNfdHJhcCwgc3RydWN0IHNubXBfb2JqX2lkICplb2lkLCBzMzJfdCBzcGVjaWZpY190cmFwKQoreworICBzdHJ1Y3Qgc25tcF90cmFwX2RzdCAqdGQ7CisgIHN0cnVjdCBuZXRpZiAqZHN0X2lmOworICBpcF9hZGRyX3QgZHN0X2lwOworICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgdTE2X3QgaSx0b3RfbGVuOworCisgIGZvciAoaT0wLCB0ZCA9ICZ0cmFwX2RzdFswXTsgaTxTTk1QX1RSQVBfREVTVElOQVRJT05TOyBpKyssIHRkKyspCisgIHsKKyAgICBpZiAoKHRkLT5lbmFibGUgIT0gMCkgJiYgIWlwX2FkZHJfaXNhbnkoJnRkLT5kaXApKQorICAgIHsKKyAgICAgIC8qIG5ldHdvcmsgb3JkZXIgdHJhcCBkZXN0aW5hdGlvbiAqLworICAgICAgaXBfYWRkcl9jb3B5KHRyYXBfbXNnLmRpcCwgdGQtPmRpcCk7CisgICAgICAvKiBsb29rdXAgY3VycmVudCBzb3VyY2UgYWRkcmVzcyBmb3IgdGhpcyBkc3QgKi8KKyAgICAgIGRzdF9pZiA9IGlwX3JvdXRlKCZ0ZC0+ZGlwKTsKKyAgICAgIGlwX2FkZHJfY29weShkc3RfaXAsIGRzdF9pZi0+aXBfYWRkcik7CisgICAgICAvKiBAdG9kbzogd2hhdCBhYm91dCBJUHY2PyAqLworICAgICAgdHJhcF9tc2cuc2lwX3Jhd1swXSA9IGlwNF9hZGRyMSgmZHN0X2lwKTsKKyAgICAgIHRyYXBfbXNnLnNpcF9yYXdbMV0gPSBpcDRfYWRkcjIoJmRzdF9pcCk7CisgICAgICB0cmFwX21zZy5zaXBfcmF3WzJdID0gaXA0X2FkZHIzKCZkc3RfaXApOworICAgICAgdHJhcF9tc2cuc2lwX3Jhd1szXSA9IGlwNF9hZGRyNCgmZHN0X2lwKTsKKyAgICAgIHRyYXBfbXNnLmdlbl90cmFwID0gZ2VuZXJpY190cmFwOworICAgICAgdHJhcF9tc2cuc3BjX3RyYXAgPSBzcGVjaWZpY190cmFwOworICAgICAgaWYgKGdlbmVyaWNfdHJhcCA9PSBTTk1QX0dFTlRSQVBfRU5URVJQUklTRVNQQykKKyAgICAgIHsKKyAgICAgICAgLyogZW50ZXJwcmlzZS1TcGVjaWZpYyB0cmFwICovCisgICAgICAgIHRyYXBfbXNnLmVudGVycHJpc2UgPSBlb2lkOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBnZW5lcmljIChNSUItSUkpIHRyYXAgKi8KKyAgICAgICAgc25tcF9nZXRfc25tcGdycGlkX3B0cigmdHJhcF9tc2cuZW50ZXJwcmlzZSk7CisgICAgICB9CisgICAgICBzbm1wX2dldF9zeXN1cHRpbWUoJnRyYXBfbXNnLnRzKTsKKworICAgICAgLyogcGFzcyAwLCBjYWxjdWxhdGUgbGVuZ3RoIGZpZWxkcyAqLworICAgICAgdG90X2xlbiA9IHNubXBfdmFyYmluZF9saXN0X3N1bSgmdHJhcF9tc2cub3V0dmIpOworICAgICAgdG90X2xlbiA9IHNubXBfdHJhcF9oZWFkZXJfc3VtKCZ0cmFwX21zZywgdG90X2xlbik7CisKKyAgICAgIC8qIGFsbG9jYXRlIHBidWYocykgKi8KKyAgICAgIHAgPSBwYnVmX2FsbG9jKFBCVUZfVFJBTlNQT1JULCB0b3RfbGVuLCBQQlVGX1BPT0wpOworICAgICAgaWYgKHAgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgdTE2X3Qgb2ZzOworCisgICAgICAgIC8qIHBhc3MgMSwgZW5jb2RlIHBhY2tldCBpbm8gdGhlIHBidWYocykgKi8KKyAgICAgICAgb2ZzID0gc25tcF90cmFwX2hlYWRlcl9lbmMoJnRyYXBfbXNnLCBwKTsKKyAgICAgICAgc25tcF92YXJiaW5kX2xpc3RfZW5jKCZ0cmFwX21zZy5vdXR2YiwgcCwgb2ZzKTsKKworICAgICAgICBzbm1wX2luY19zbm1wb3V0dHJhcHMoKTsKKyAgICAgICAgc25tcF9pbmNfc25tcG91dHBrdHMoKTsKKworICAgICAgICAvKiogc2VuZCB0byB0aGUgVFJBUCBkZXN0aW5hdGlvbiAqLworICAgICAgICB1ZHBfc2VuZHRvKHRyYXBfbXNnLnBjYiwgcCwgJnRyYXBfbXNnLmRpcCwgU05NUF9UUkFQX1BPUlQpOworCisgICAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEVSUl9NRU07CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBFUlJfT0s7Cit9CisKK3ZvaWQKK3NubXBfY29sZHN0YXJ0X3RyYXAodm9pZCkKK3sKKyAgdHJhcF9tc2cub3V0dmIuaGVhZCA9IE5VTEw7CisgIHRyYXBfbXNnLm91dHZiLnRhaWwgPSBOVUxMOworICB0cmFwX21zZy5vdXR2Yi5jb3VudCA9IDA7CisgIHNubXBfc2VuZF90cmFwKFNOTVBfR0VOVFJBUF9DT0xEU1RBUlQsIE5VTEwsIDApOworfQorCit2b2lkCitzbm1wX2F1dGhmYWlsX3RyYXAodm9pZCkKK3sKKyAgdThfdCBlbmFibGU7CisgIHNubXBfZ2V0X3NubXBlbmFibGVhdXRoZW50cmFwcygmZW5hYmxlKTsKKyAgaWYgKGVuYWJsZSA9PSAxKQorICB7CisgICAgdHJhcF9tc2cub3V0dmIuaGVhZCA9IE5VTEw7CisgICAgdHJhcF9tc2cub3V0dmIudGFpbCA9IE5VTEw7CisgICAgdHJhcF9tc2cub3V0dmIuY291bnQgPSAwOworICAgIHNubXBfc2VuZF90cmFwKFNOTVBfR0VOVFJBUF9BVVRIRkFJTCwgTlVMTCwgMCk7CisgIH0KK30KKworLyoqCisgKiBTdW1zIHJlc3BvbnNlIGhlYWRlciBmaWVsZCBsZW5ndGhzIGZyb20gdGFpbCB0byBoZWFkIGFuZAorICogcmV0dXJucyByZXNwX2hlYWRlcl9sZW5ndGhzIGZvciBzZWNvbmQgZW5jb2RpbmcgcGFzcy4KKyAqCisgKiBAcGFyYW0gdmJfbGVuIHZhcmJpbmQtbGlzdCBsZW5ndGgKKyAqIEBwYXJhbSByaGwgcG9pbnRzIHRvIHJldHVybmVkIGhlYWRlciBsZW5ndGhzCisgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBsZW5naHQgZm9yIGVuY29kaW5nIHRoZSByZXNwb25zZSBoZWFkZXIKKyAqLworc3RhdGljIHUxNl90Citzbm1wX3Jlc3BfaGVhZGVyX3N1bShzdHJ1Y3Qgc25tcF9tc2dfcHN0YXQgKm1fc3RhdCwgdTE2X3QgdmJfbGVuKQoreworICB1MTZfdCB0b3RfbGVuOworICBzdHJ1Y3Qgc25tcF9yZXNwX2hlYWRlcl9sZW5ndGhzICpyaGw7CisKKyAgcmhsID0gJm1fc3RhdC0+cmhsOworICB0b3RfbGVuID0gdmJfbGVuOworICBzbm1wX2FzbjFfZW5jX3MzMnRfY250KG1fc3RhdC0+ZXJyb3JfaW5kZXgsICZyaGwtPmVycmlkeGxlbik7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoX2NudChyaGwtPmVycmlkeGxlbiwgJnJobC0+ZXJyaWR4bGVubGVuKTsKKyAgdG90X2xlbiArPSAxICsgcmhsLT5lcnJpZHhsZW5sZW4gKyByaGwtPmVycmlkeGxlbjsKKworICBzbm1wX2FzbjFfZW5jX3MzMnRfY250KG1fc3RhdC0+ZXJyb3Jfc3RhdHVzLCAmcmhsLT5lcnJzdGF0bGVuKTsKKyAgc25tcF9hc24xX2VuY19sZW5ndGhfY250KHJobC0+ZXJyc3RhdGxlbiwgJnJobC0+ZXJyc3RhdGxlbmxlbik7CisgIHRvdF9sZW4gKz0gMSArIHJobC0+ZXJyc3RhdGxlbmxlbiArIHJobC0+ZXJyc3RhdGxlbjsKKworICBzbm1wX2FzbjFfZW5jX3MzMnRfY250KG1fc3RhdC0+cmlkLCAmcmhsLT5yaWRsZW4pOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQocmhsLT5yaWRsZW4sICZyaGwtPnJpZGxlbmxlbik7CisgIHRvdF9sZW4gKz0gMSArIHJobC0+cmlkbGVubGVuICsgcmhsLT5yaWRsZW47CisKKyAgcmhsLT5wZHVsZW4gPSB0b3RfbGVuOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQocmhsLT5wZHVsZW4sICZyaGwtPnBkdWxlbmxlbik7CisgIHRvdF9sZW4gKz0gMSArIHJobC0+cGR1bGVubGVuOworCisgIHJobC0+Y29tbGVuID0gbV9zdGF0LT5jb21fc3RybGVuOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQocmhsLT5jb21sZW4sICZyaGwtPmNvbWxlbmxlbik7CisgIHRvdF9sZW4gKz0gMSArIHJobC0+Y29tbGVubGVuICsgcmhsLT5jb21sZW47CisKKyAgc25tcF9hc24xX2VuY19zMzJ0X2NudChzbm1wX3ZlcnNpb24sICZyaGwtPnZlcmxlbik7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoX2NudChyaGwtPnZlcmxlbiwgJnJobC0+dmVybGVubGVuKTsKKyAgdG90X2xlbiArPSAxICsgcmhsLT52ZXJsZW4gKyByaGwtPnZlcmxlbmxlbjsKKworICByaGwtPnNlcWxlbiA9IHRvdF9sZW47CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoX2NudChyaGwtPnNlcWxlbiwgJnJobC0+c2VxbGVubGVuKTsKKyAgdG90X2xlbiArPSAxICsgcmhsLT5zZXFsZW5sZW47CisKKyAgcmV0dXJuIHRvdF9sZW47Cit9CisKKy8qKgorICogU3VtcyB0cmFwIGhlYWRlciBmaWVsZCBsZW5ndGhzIGZyb20gdGFpbCB0byBoZWFkIGFuZAorICogcmV0dXJucyB0cmFwX2hlYWRlcl9sZW5ndGhzIGZvciBzZWNvbmQgZW5jb2RpbmcgcGFzcy4KKyAqCisgKiBAcGFyYW0gdmJfbGVuIHZhcmJpbmQtbGlzdCBsZW5ndGgKKyAqIEBwYXJhbSB0aGwgcG9pbnRzIHRvIHJldHVybmVkIGhlYWRlciBsZW5ndGhzCisgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBsZW5naHQgZm9yIGVuY29kaW5nIHRoZSB0cmFwIGhlYWRlcgorICovCitzdGF0aWMgdTE2X3QKK3NubXBfdHJhcF9oZWFkZXJfc3VtKHN0cnVjdCBzbm1wX21zZ190cmFwICptX3RyYXAsIHUxNl90IHZiX2xlbikKK3sKKyAgdTE2X3QgdG90X2xlbjsKKyAgc3RydWN0IHNubXBfdHJhcF9oZWFkZXJfbGVuZ3RocyAqdGhsOworCisgIHRobCA9ICZtX3RyYXAtPnRobDsKKyAgdG90X2xlbiA9IHZiX2xlbjsKKworICBzbm1wX2FzbjFfZW5jX3UzMnRfY250KG1fdHJhcC0+dHMsICZ0aGwtPnRzbGVuKTsKKyAgc25tcF9hc24xX2VuY19sZW5ndGhfY250KHRobC0+dHNsZW4sICZ0aGwtPnRzbGVubGVuKTsKKyAgdG90X2xlbiArPSAxICsgdGhsLT50c2xlbiArIHRobC0+dHNsZW5sZW47CisKKyAgc25tcF9hc24xX2VuY19zMzJ0X2NudChtX3RyYXAtPnNwY190cmFwLCAmdGhsLT5zdHJwbGVuKTsKKyAgc25tcF9hc24xX2VuY19sZW5ndGhfY250KHRobC0+c3RycGxlbiwgJnRobC0+c3RycGxlbmxlbik7CisgIHRvdF9sZW4gKz0gMSArIHRobC0+c3RycGxlbiArIHRobC0+c3RycGxlbmxlbjsKKworICBzbm1wX2FzbjFfZW5jX3MzMnRfY250KG1fdHJhcC0+Z2VuX3RyYXAsICZ0aGwtPmd0cnBsZW4pOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQodGhsLT5ndHJwbGVuLCAmdGhsLT5ndHJwbGVubGVuKTsKKyAgdG90X2xlbiArPSAxICsgdGhsLT5ndHJwbGVuICsgdGhsLT5ndHJwbGVubGVuOworCisgIHRobC0+YWFkZHJsZW4gPSA0OworICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQodGhsLT5hYWRkcmxlbiwgJnRobC0+YWFkZHJsZW5sZW4pOworICB0b3RfbGVuICs9IDEgKyB0aGwtPmFhZGRybGVuICsgdGhsLT5hYWRkcmxlbmxlbjsKKworICBzbm1wX2FzbjFfZW5jX29pZF9jbnQobV90cmFwLT5lbnRlcnByaXNlLT5sZW4sICZtX3RyYXAtPmVudGVycHJpc2UtPmlkWzBdLCAmdGhsLT5laWRsZW4pOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQodGhsLT5laWRsZW4sICZ0aGwtPmVpZGxlbmxlbik7CisgIHRvdF9sZW4gKz0gMSArIHRobC0+ZWlkbGVuICsgdGhsLT5laWRsZW5sZW47CisKKyAgdGhsLT5wZHVsZW4gPSB0b3RfbGVuOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQodGhsLT5wZHVsZW4sICZ0aGwtPnBkdWxlbmxlbik7CisgIHRvdF9sZW4gKz0gMSArIHRobC0+cGR1bGVubGVuOworCisgIHRobC0+Y29tbGVuID0gc2l6ZW9mKHNubXBfcHVibGljY29tbXVuaXR5KSAtIDE7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoX2NudCh0aGwtPmNvbWxlbiwgJnRobC0+Y29tbGVubGVuKTsKKyAgdG90X2xlbiArPSAxICsgdGhsLT5jb21sZW5sZW4gKyB0aGwtPmNvbWxlbjsKKworICBzbm1wX2FzbjFfZW5jX3MzMnRfY250KHNubXBfdmVyc2lvbiwgJnRobC0+dmVybGVuKTsKKyAgc25tcF9hc24xX2VuY19sZW5ndGhfY250KHRobC0+dmVybGVuLCAmdGhsLT52ZXJsZW5sZW4pOworICB0b3RfbGVuICs9IDEgKyB0aGwtPnZlcmxlbiArIHRobC0+dmVybGVubGVuOworCisgIHRobC0+c2VxbGVuID0gdG90X2xlbjsKKyAgc25tcF9hc24xX2VuY19sZW5ndGhfY250KHRobC0+c2VxbGVuLCAmdGhsLT5zZXFsZW5sZW4pOworICB0b3RfbGVuICs9IDEgKyB0aGwtPnNlcWxlbmxlbjsKKworICByZXR1cm4gdG90X2xlbjsKK30KKworLyoqCisgKiBTdW1zIHZhcmJpbmQgbGVuZ3RocyBmcm9tIHRhaWwgdG8gaGVhZCBhbmQKKyAqIGFubm90YXRlcyBsZW5ndGhzIGluIHZhcmJpbmQgZm9yIHNlY29uZCBlbmNvZGluZyBwYXNzLgorICoKKyAqIEBwYXJhbSByb290IHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgdmFyaWFibGUgYmluZGluZyBsaXN0CisgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBsZW5naHQgZm9yIGVuY29kaW5nIHRoZSB2YXJpYWJsZSBiaW5kaW5ncworICovCitzdGF0aWMgdTE2X3QKK3NubXBfdmFyYmluZF9saXN0X3N1bShzdHJ1Y3Qgc25tcF92YXJiaW5kX3Jvb3QgKnJvb3QpCit7CisgIHN0cnVjdCBzbm1wX3ZhcmJpbmQgKnZiOworICB1MzJfdCAqdWludF9wdHI7CisgIHMzMl90ICpzaW50X3B0cjsKKyAgdTE2X3QgdG90X2xlbjsKKworICB0b3RfbGVuID0gMDsKKyAgdmIgPSByb290LT50YWlsOworICB3aGlsZSAoIHZiICE9IE5VTEwgKQorICB7CisgICAgLyogZW5jb2RlZCB2YWx1ZSBsZW5naHQgZGVwZW5kcyBvbiB0eXBlICovCisgICAgc3dpdGNoICh2Yi0+dmFsdWVfdHlwZSkKKyAgICB7CisgICAgICBjYXNlIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSU5URUcpOgorICAgICAgICBzaW50X3B0ciA9IChzMzJfdCopdmItPnZhbHVlOworICAgICAgICBzbm1wX2FzbjFfZW5jX3MzMnRfY250KCpzaW50X3B0ciwgJnZiLT52bGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9DT1VOVEVSKToKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0dBVUdFKToKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX1RJTUVUSUNLUyk6CisgICAgICAgIHVpbnRfcHRyID0gKHUzMl90Kil2Yi0+dmFsdWU7CisgICAgICAgIHNubXBfYXNuMV9lbmNfdTMydF9jbnQoKnVpbnRfcHRyLCAmdmItPnZsZW4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9PQ19TVFIpOgorICAgICAgY2FzZSAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX05VTCk6CisgICAgICBjYXNlIChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JUEFERFIpOgorICAgICAgY2FzZSAoU05NUF9BU04xX0FQUExJQyB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfT1BBUVVFKToKKyAgICAgICAgdmItPnZsZW4gPSB2Yi0+dmFsdWVfbGVuOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9PQkpfSUQpOgorICAgICAgICBzaW50X3B0ciA9IChzMzJfdCopdmItPnZhbHVlOworICAgICAgICBzbm1wX2FzbjFfZW5jX29pZF9jbnQodmItPnZhbHVlX2xlbiAvIHNpemVvZihzMzJfdCksIHNpbnRfcHRyLCAmdmItPnZsZW4pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIHVuc3VwcG9ydGVkIHR5cGUgKi8KKyAgICAgICAgdmItPnZsZW4gPSAwOworICAgICAgICBicmVhazsKKyAgICB9OworICAgIC8qIGVuY29kaW5nIGxlbmd0aCBvZiB2YWx1ZSBsZW5ndGggZmllbGQgKi8KKyAgICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQodmItPnZsZW4sICZ2Yi0+dmxlbmxlbik7CisgICAgc25tcF9hc24xX2VuY19vaWRfY250KHZiLT5pZGVudF9sZW4sIHZiLT5pZGVudCwgJnZiLT5vbGVuKTsKKyAgICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQodmItPm9sZW4sICZ2Yi0+b2xlbmxlbik7CisKKyAgICB2Yi0+c2VxbGVuID0gMSArIHZiLT52bGVubGVuICsgdmItPnZsZW47CisgICAgdmItPnNlcWxlbiArPSAxICsgdmItPm9sZW5sZW4gKyB2Yi0+b2xlbjsKKyAgICBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQodmItPnNlcWxlbiwgJnZiLT5zZXFsZW5sZW4pOworCisgICAgLyogdmFyYmluZCBzZXEgKi8KKyAgICB0b3RfbGVuICs9IDEgKyB2Yi0+c2VxbGVubGVuICsgdmItPnNlcWxlbjsKKworICAgIHZiID0gdmItPnByZXY7CisgIH0KKworICAvKiB2YXJiaW5kLWxpc3Qgc2VxICovCisgIHJvb3QtPnNlcWxlbiA9IHRvdF9sZW47CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoX2NudChyb290LT5zZXFsZW4sICZyb290LT5zZXFsZW5sZW4pOworICB0b3RfbGVuICs9IDEgKyByb290LT5zZXFsZW5sZW47CisKKyAgcmV0dXJuIHRvdF9sZW47Cit9CisKKy8qKgorICogRW5jb2RlcyByZXNwb25zZSBoZWFkZXIgZnJvbSBoZWFkIHRvIHRhaWwuCisgKi8KK3N0YXRpYyB1MTZfdAorc25tcF9yZXNwX2hlYWRlcl9lbmMoc3RydWN0IHNubXBfbXNnX3BzdGF0ICptX3N0YXQsIHN0cnVjdCBwYnVmICpwKQoreworICB1MTZfdCBvZnM7CisKKyAgb2ZzID0gMDsKKyAgc25tcF9hc24xX2VuY190eXBlKHAsIG9mcywgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX0NPTlNUUiB8IFNOTVBfQVNOMV9TRVEpKTsKKyAgb2ZzICs9IDE7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoKHAsIG9mcywgbV9zdGF0LT5yaGwuc2VxbGVuKTsKKyAgb2ZzICs9IG1fc3RhdC0+cmhsLnNlcWxlbmxlbjsKKworICBzbm1wX2FzbjFfZW5jX3R5cGUocCwgb2ZzLCAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKSk7CisgIG9mcyArPSAxOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aChwLCBvZnMsIG1fc3RhdC0+cmhsLnZlcmxlbik7CisgIG9mcyArPSBtX3N0YXQtPnJobC52ZXJsZW5sZW47CisgIHNubXBfYXNuMV9lbmNfczMydChwLCBvZnMsIG1fc3RhdC0+cmhsLnZlcmxlbiwgc25tcF92ZXJzaW9uKTsKKyAgb2ZzICs9IG1fc3RhdC0+cmhsLnZlcmxlbjsKKworICBzbm1wX2FzbjFfZW5jX3R5cGUocCwgb2ZzLCAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09DX1NUUikpOworICBvZnMgKz0gMTsKKyAgc25tcF9hc24xX2VuY19sZW5ndGgocCwgb2ZzLCBtX3N0YXQtPnJobC5jb21sZW4pOworICBvZnMgKz0gbV9zdGF0LT5yaGwuY29tbGVubGVuOworICBzbm1wX2FzbjFfZW5jX3JhdyhwLCBvZnMsIG1fc3RhdC0+cmhsLmNvbWxlbiwgbV9zdGF0LT5jb21tdW5pdHkpOworICBvZnMgKz0gbV9zdGF0LT5yaGwuY29tbGVuOworCisgIHNubXBfYXNuMV9lbmNfdHlwZShwLCBvZnMsIChTTk1QX0FTTjFfQ09OVFhUIHwgU05NUF9BU04xX0NPTlNUUiB8IFNOTVBfQVNOMV9QRFVfR0VUX1JFU1ApKTsKKyAgb2ZzICs9IDE7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoKHAsIG9mcywgbV9zdGF0LT5yaGwucGR1bGVuKTsKKyAgb2ZzICs9IG1fc3RhdC0+cmhsLnBkdWxlbmxlbjsKKworICBzbm1wX2FzbjFfZW5jX3R5cGUocCwgb2ZzLCAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKSk7CisgIG9mcyArPSAxOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aChwLCBvZnMsIG1fc3RhdC0+cmhsLnJpZGxlbik7CisgIG9mcyArPSBtX3N0YXQtPnJobC5yaWRsZW5sZW47CisgIHNubXBfYXNuMV9lbmNfczMydChwLCBvZnMsIG1fc3RhdC0+cmhsLnJpZGxlbiwgbV9zdGF0LT5yaWQpOworICBvZnMgKz0gbV9zdGF0LT5yaGwucmlkbGVuOworCisgIHNubXBfYXNuMV9lbmNfdHlwZShwLCBvZnMsIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSU5URUcpKTsKKyAgb2ZzICs9IDE7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoKHAsIG9mcywgbV9zdGF0LT5yaGwuZXJyc3RhdGxlbik7CisgIG9mcyArPSBtX3N0YXQtPnJobC5lcnJzdGF0bGVubGVuOworICBzbm1wX2FzbjFfZW5jX3MzMnQocCwgb2ZzLCBtX3N0YXQtPnJobC5lcnJzdGF0bGVuLCBtX3N0YXQtPmVycm9yX3N0YXR1cyk7CisgIG9mcyArPSBtX3N0YXQtPnJobC5lcnJzdGF0bGVuOworCisgIHNubXBfYXNuMV9lbmNfdHlwZShwLCBvZnMsIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSU5URUcpKTsKKyAgb2ZzICs9IDE7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoKHAsIG9mcywgbV9zdGF0LT5yaGwuZXJyaWR4bGVuKTsKKyAgb2ZzICs9IG1fc3RhdC0+cmhsLmVycmlkeGxlbmxlbjsKKyAgc25tcF9hc24xX2VuY19zMzJ0KHAsIG9mcywgbV9zdGF0LT5yaGwuZXJyaWR4bGVuLCBtX3N0YXQtPmVycm9yX2luZGV4KTsKKyAgb2ZzICs9IG1fc3RhdC0+cmhsLmVycmlkeGxlbjsKKworICByZXR1cm4gb2ZzOworfQorCisvKioKKyAqIEVuY29kZXMgdHJhcCBoZWFkZXIgZnJvbSBoZWFkIHRvIHRhaWwuCisgKi8KK3N0YXRpYyB1MTZfdAorc25tcF90cmFwX2hlYWRlcl9lbmMoc3RydWN0IHNubXBfbXNnX3RyYXAgKm1fdHJhcCwgc3RydWN0IHBidWYgKnApCit7CisgIHUxNl90IG9mczsKKworICBvZnMgPSAwOworICBzbm1wX2FzbjFfZW5jX3R5cGUocCwgb2ZzLCAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfQ09OU1RSIHwgU05NUF9BU04xX1NFUSkpOworICBvZnMgKz0gMTsKKyAgc25tcF9hc24xX2VuY19sZW5ndGgocCwgb2ZzLCBtX3RyYXAtPnRobC5zZXFsZW4pOworICBvZnMgKz0gbV90cmFwLT50aGwuc2VxbGVubGVuOworCisgIHNubXBfYXNuMV9lbmNfdHlwZShwLCBvZnMsIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSU5URUcpKTsKKyAgb2ZzICs9IDE7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoKHAsIG9mcywgbV90cmFwLT50aGwudmVybGVuKTsKKyAgb2ZzICs9IG1fdHJhcC0+dGhsLnZlcmxlbmxlbjsKKyAgc25tcF9hc24xX2VuY19zMzJ0KHAsIG9mcywgbV90cmFwLT50aGwudmVybGVuLCBzbm1wX3ZlcnNpb24pOworICBvZnMgKz0gbV90cmFwLT50aGwudmVybGVuOworCisgIHNubXBfYXNuMV9lbmNfdHlwZShwLCBvZnMsIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfT0NfU1RSKSk7CisgIG9mcyArPSAxOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aChwLCBvZnMsIG1fdHJhcC0+dGhsLmNvbWxlbik7CisgIG9mcyArPSBtX3RyYXAtPnRobC5jb21sZW5sZW47CisgIHNubXBfYXNuMV9lbmNfcmF3KHAsIG9mcywgbV90cmFwLT50aGwuY29tbGVuLCAodThfdCAqKSZzbm1wX3B1YmxpY2NvbW11bml0eVswXSk7CisgIG9mcyArPSBtX3RyYXAtPnRobC5jb21sZW47CisKKyAgc25tcF9hc24xX2VuY190eXBlKHAsIG9mcywgKFNOTVBfQVNOMV9DT05UWFQgfCBTTk1QX0FTTjFfQ09OU1RSIHwgU05NUF9BU04xX1BEVV9UUkFQKSk7CisgIG9mcyArPSAxOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aChwLCBvZnMsIG1fdHJhcC0+dGhsLnBkdWxlbik7CisgIG9mcyArPSBtX3RyYXAtPnRobC5wZHVsZW5sZW47CisKKyAgc25tcF9hc24xX2VuY190eXBlKHAsIG9mcywgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9PQkpfSUQpKTsKKyAgb2ZzICs9IDE7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoKHAsIG9mcywgbV90cmFwLT50aGwuZWlkbGVuKTsKKyAgb2ZzICs9IG1fdHJhcC0+dGhsLmVpZGxlbmxlbjsKKyAgc25tcF9hc24xX2VuY19vaWQocCwgb2ZzLCBtX3RyYXAtPmVudGVycHJpc2UtPmxlbiwgJm1fdHJhcC0+ZW50ZXJwcmlzZS0+aWRbMF0pOworICBvZnMgKz0gbV90cmFwLT50aGwuZWlkbGVuOworCisgIHNubXBfYXNuMV9lbmNfdHlwZShwLCBvZnMsIChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JUEFERFIpKTsKKyAgb2ZzICs9IDE7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoKHAsIG9mcywgbV90cmFwLT50aGwuYWFkZHJsZW4pOworICBvZnMgKz0gbV90cmFwLT50aGwuYWFkZHJsZW5sZW47CisgIHNubXBfYXNuMV9lbmNfcmF3KHAsIG9mcywgbV90cmFwLT50aGwuYWFkZHJsZW4sICZtX3RyYXAtPnNpcF9yYXdbMF0pOworICBvZnMgKz0gbV90cmFwLT50aGwuYWFkZHJsZW47CisKKyAgc25tcF9hc24xX2VuY190eXBlKHAsIG9mcywgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9JTlRFRykpOworICBvZnMgKz0gMTsKKyAgc25tcF9hc24xX2VuY19sZW5ndGgocCwgb2ZzLCBtX3RyYXAtPnRobC5ndHJwbGVuKTsKKyAgb2ZzICs9IG1fdHJhcC0+dGhsLmd0cnBsZW5sZW47CisgIHNubXBfYXNuMV9lbmNfdTMydChwLCBvZnMsIG1fdHJhcC0+dGhsLmd0cnBsZW4sIG1fdHJhcC0+Z2VuX3RyYXApOworICBvZnMgKz0gbV90cmFwLT50aGwuZ3RycGxlbjsKKworICBzbm1wX2FzbjFfZW5jX3R5cGUocCwgb2ZzLCAoU05NUF9BU04xX1VOSVYgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0lOVEVHKSk7CisgIG9mcyArPSAxOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aChwLCBvZnMsIG1fdHJhcC0+dGhsLnN0cnBsZW4pOworICBvZnMgKz0gbV90cmFwLT50aGwuc3RycGxlbmxlbjsKKyAgc25tcF9hc24xX2VuY191MzJ0KHAsIG9mcywgbV90cmFwLT50aGwuc3RycGxlbiwgbV90cmFwLT5zcGNfdHJhcCk7CisgIG9mcyArPSBtX3RyYXAtPnRobC5zdHJwbGVuOworCisgIHNubXBfYXNuMV9lbmNfdHlwZShwLCBvZnMsIChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9USU1FVElDS1MpKTsKKyAgb2ZzICs9IDE7CisgIHNubXBfYXNuMV9lbmNfbGVuZ3RoKHAsIG9mcywgbV90cmFwLT50aGwudHNsZW4pOworICBvZnMgKz0gbV90cmFwLT50aGwudHNsZW5sZW47CisgIHNubXBfYXNuMV9lbmNfdTMydChwLCBvZnMsIG1fdHJhcC0+dGhsLnRzbGVuLCBtX3RyYXAtPnRzKTsKKyAgb2ZzICs9IG1fdHJhcC0+dGhsLnRzbGVuOworCisgIHJldHVybiBvZnM7Cit9CisKKy8qKgorICogRW5jb2RlcyB2YXJiaW5kIGxpc3QgZnJvbSBoZWFkIHRvIHRhaWwuCisgKi8KK3N0YXRpYyB1MTZfdAorc25tcF92YXJiaW5kX2xpc3RfZW5jKHN0cnVjdCBzbm1wX3ZhcmJpbmRfcm9vdCAqcm9vdCwgc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcykKK3sKKyAgc3RydWN0IHNubXBfdmFyYmluZCAqdmI7CisgIHMzMl90ICpzaW50X3B0cjsKKyAgdTMyX3QgKnVpbnRfcHRyOworICB1OF90ICpyYXdfcHRyOworCisgIHNubXBfYXNuMV9lbmNfdHlwZShwLCBvZnMsIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9DT05TVFIgfCBTTk1QX0FTTjFfU0VRKSk7CisgIG9mcyArPSAxOworICBzbm1wX2FzbjFfZW5jX2xlbmd0aChwLCBvZnMsIHJvb3QtPnNlcWxlbik7CisgIG9mcyArPSByb290LT5zZXFsZW5sZW47CisKKyAgdmIgPSByb290LT5oZWFkOworICB3aGlsZSAoIHZiICE9IE5VTEwgKQorICB7CisgICAgc25tcF9hc24xX2VuY190eXBlKHAsIG9mcywgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX0NPTlNUUiB8IFNOTVBfQVNOMV9TRVEpKTsKKyAgICBvZnMgKz0gMTsKKyAgICBzbm1wX2FzbjFfZW5jX2xlbmd0aChwLCBvZnMsIHZiLT5zZXFsZW4pOworICAgIG9mcyArPSB2Yi0+c2VxbGVubGVuOworCisgICAgc25tcF9hc24xX2VuY190eXBlKHAsIG9mcywgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9PQkpfSUQpKTsKKyAgICBvZnMgKz0gMTsKKyAgICBzbm1wX2FzbjFfZW5jX2xlbmd0aChwLCBvZnMsIHZiLT5vbGVuKTsKKyAgICBvZnMgKz0gdmItPm9sZW5sZW47CisgICAgc25tcF9hc24xX2VuY19vaWQocCwgb2ZzLCB2Yi0+aWRlbnRfbGVuLCAmdmItPmlkZW50WzBdKTsKKyAgICBvZnMgKz0gdmItPm9sZW47CisKKyAgICBzbm1wX2FzbjFfZW5jX3R5cGUocCwgb2ZzLCB2Yi0+dmFsdWVfdHlwZSk7CisgICAgb2ZzICs9IDE7CisgICAgc25tcF9hc24xX2VuY19sZW5ndGgocCwgb2ZzLCB2Yi0+dmxlbik7CisgICAgb2ZzICs9IHZiLT52bGVubGVuOworCisgICAgc3dpdGNoICh2Yi0+dmFsdWVfdHlwZSkKKyAgICB7CisgICAgICBjYXNlIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSU5URUcpOgorICAgICAgICBzaW50X3B0ciA9IChzMzJfdCopdmItPnZhbHVlOworICAgICAgICBzbm1wX2FzbjFfZW5jX3MzMnQocCwgb2ZzLCB2Yi0+dmxlbiwgKnNpbnRfcHRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIChTTk1QX0FTTjFfQVBQTElDIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9DT1VOVEVSKToKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX0dBVUdFKToKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX1RJTUVUSUNLUyk6CisgICAgICAgIHVpbnRfcHRyID0gKHUzMl90Kil2Yi0+dmFsdWU7CisgICAgICAgIHNubXBfYXNuMV9lbmNfdTMydChwLCBvZnMsIHZiLT52bGVuLCAqdWludF9wdHIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9VTklWIHwgU05NUF9BU04xX1BSSU1JVCB8IFNOTVBfQVNOMV9PQ19TVFIpOgorICAgICAgY2FzZSAoU05NUF9BU04xX0FQUExJQyB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfSVBBRERSKToKKyAgICAgIGNhc2UgKFNOTVBfQVNOMV9BUFBMSUMgfCBTTk1QX0FTTjFfUFJJTUlUIHwgU05NUF9BU04xX09QQVFVRSk6CisgICAgICAgIHJhd19wdHIgPSAodThfdCopdmItPnZhbHVlOworICAgICAgICBzbm1wX2FzbjFfZW5jX3JhdyhwLCBvZnMsIHZiLT52bGVuLCByYXdfcHRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfTlVMKToKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIChTTk1QX0FTTjFfVU5JViB8IFNOTVBfQVNOMV9QUklNSVQgfCBTTk1QX0FTTjFfT0JKX0lEKToKKyAgICAgICAgc2ludF9wdHIgPSAoczMyX3QqKXZiLT52YWx1ZTsKKyAgICAgICAgc25tcF9hc24xX2VuY19vaWQocCwgb2ZzLCB2Yi0+dmFsdWVfbGVuIC8gc2l6ZW9mKHMzMl90KSwgc2ludF9wdHIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIHVuc3VwcG9ydGVkIHR5cGUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfTsKKyAgICBvZnMgKz0gdmItPnZsZW47CisgICAgdmIgPSB2Yi0+bmV4dDsKKyAgfQorICByZXR1cm4gb2ZzOworfQorCisjZW5kaWYgLyogTFdJUF9TTk1QICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2NvcmUvc3RhdHMuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS9zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Zjk3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvc3RhdHMuYwpAQCAtMCwwICsxLDE3NiBAQAorLyoqCisgKiBAZmlsZQorICogU3RhdGlzdGljcyBtb2R1bGUKKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX1NUQVRTIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL3N0YXRzLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdHJ1Y3Qgc3RhdHNfIGx3aXBfc3RhdHM7CisKK3ZvaWQgc3RhdHNfaW5pdCh2b2lkKQoreworI2lmZGVmIExXSVBfREVCVUcKKyNpZiBNRU1QX1NUQVRTCisgIGNvbnN0IGNoYXIgKiBtZW1wX25hbWVzW10gPSB7CisjZGVmaW5lIExXSVBfTUVNUE9PTChuYW1lLG51bSxzaXplLGRlc2MpIGRlc2MsCisjaW5jbHVkZSAibHdpcC9tZW1wX3N0ZC5oIgorICB9OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IE1FTVBfTUFYOyBpKyspIHsKKyAgICBsd2lwX3N0YXRzLm1lbXBbaV0ubmFtZSA9IG1lbXBfbmFtZXNbaV07CisgIH0KKyNlbmRpZiAvKiBNRU1QX1NUQVRTICovCisjaWYgTUVNX1NUQVRTCisgIGx3aXBfc3RhdHMubWVtLm5hbWUgPSAiTUVNIjsKKyNlbmRpZiAvKiBNRU1fU1RBVFMgKi8KKyNlbmRpZiAvKiBMV0lQX0RFQlVHICovCit9CisKKyNpZiBMV0lQX1NUQVRTX0RJU1BMQVkKK3ZvaWQKK3N0YXRzX2Rpc3BsYXlfcHJvdG8oc3RydWN0IHN0YXRzX3Byb3RvICpwcm90bywgY2hhciAqbmFtZSkKK3sKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgiXG4lc1xuXHQiLCBuYW1lKSk7CisgIExXSVBfUExBVEZPUk1fRElBRygoInhtaXQ6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIHByb3RvLT54bWl0KSk7IAorICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJyZWN2OiAlIlNUQVRfQ09VTlRFUl9GIlxuXHQiLCBwcm90by0+cmVjdikpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgiZnc6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIHByb3RvLT5mdykpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgiZHJvcDogJSJTVEFUX0NPVU5URVJfRiJcblx0IiwgcHJvdG8tPmRyb3ApKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoImNoa2VycjogJSJTVEFUX0NPVU5URVJfRiJcblx0IiwgcHJvdG8tPmNoa2VycikpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgibGVuZXJyOiAlIlNUQVRfQ09VTlRFUl9GIlxuXHQiLCBwcm90by0+bGVuZXJyKSk7IAorICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJtZW1lcnI6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIHByb3RvLT5tZW1lcnIpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoInJ0ZXJyOiAlIlNUQVRfQ09VTlRFUl9GIlxuXHQiLCBwcm90by0+cnRlcnIpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoInByb3RlcnI6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIHByb3RvLT5wcm90ZXJyKSk7IAorICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJvcHRlcnI6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIHByb3RvLT5vcHRlcnIpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoImVycjogJSJTVEFUX0NPVU5URVJfRiJcblx0IiwgcHJvdG8tPmVycikpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgiY2FjaGVoaXQ6ICUiU1RBVF9DT1VOVEVSX0YiXG4iLCBwcm90by0+Y2FjaGVoaXQpKTsgCit9CisKKyNpZiBJR01QX1NUQVRTCit2b2lkCitzdGF0c19kaXNwbGF5X2lnbXAoc3RydWN0IHN0YXRzX2lnbXAgKmlnbXApCit7CisgIExXSVBfUExBVEZPUk1fRElBRygoIlxuSUdNUFxuXHQiKSk7CisgIExXSVBfUExBVEZPUk1fRElBRygoInhtaXQ6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIGlnbXAtPnhtaXQpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoInJlY3Y6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIGlnbXAtPnJlY3YpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoImRyb3A6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIGlnbXAtPmRyb3ApKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoImNoa2VycjogJSJTVEFUX0NPVU5URVJfRiJcblx0IiwgaWdtcC0+Y2hrZXJyKSk7IAorICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJsZW5lcnI6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIGlnbXAtPmxlbmVycikpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgibWVtZXJyOiAlIlNUQVRfQ09VTlRFUl9GIlxuXHQiLCBpZ21wLT5tZW1lcnIpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoInByb3RlcnI6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIGlnbXAtPnByb3RlcnIpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoInJ4X3YxOiAlIlNUQVRfQ09VTlRFUl9GIlxuXHQiLCBpZ21wLT5yeF92MSkpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgicnhfZ3JvdXA6ICUiU1RBVF9DT1VOVEVSX0YiXG4iLCBpZ21wLT5yeF9ncm91cCkpOworICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJyeF9nZW5lcmFsOiAlIlNUQVRfQ09VTlRFUl9GIlxuIiwgaWdtcC0+cnhfZ2VuZXJhbCkpOworICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJyeF9yZXBvcnQ6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIGlnbXAtPnJ4X3JlcG9ydCkpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgidHhfam9pbjogJSJTVEFUX0NPVU5URVJfRiJcblx0IiwgaWdtcC0+dHhfam9pbikpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgidHhfbGVhdmU6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIGlnbXAtPnR4X2xlYXZlKSk7IAorICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJ0eF9yZXBvcnQ6ICUiU1RBVF9DT1VOVEVSX0YiXG5cdCIsIGlnbXAtPnR4X3JlcG9ydCkpOyAKK30KKyNlbmRpZiAvKiBJR01QX1NUQVRTICovCisKKyNpZiBNRU1fU1RBVFMgfHwgTUVNUF9TVEFUUwordm9pZAorc3RhdHNfZGlzcGxheV9tZW0oc3RydWN0IHN0YXRzX21lbSAqbWVtLCBjaGFyICpuYW1lKQoreworICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJcbk1FTSAlc1xuXHQiLCBuYW1lKSk7CisgIExXSVBfUExBVEZPUk1fRElBRygoImF2YWlsOiAlIlUzMl9GIlxuXHQiLCAodTMyX3QpbWVtLT5hdmFpbCkpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgidXNlZDogJSJVMzJfRiJcblx0IiwgKHUzMl90KW1lbS0+dXNlZCkpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgibWF4OiAlIlUzMl9GIlxuXHQiLCAodTMyX3QpbWVtLT5tYXgpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoImVycjogJSJVMzJfRiJcbiIsICh1MzJfdCltZW0tPmVycikpOworfQorCisjaWYgTUVNUF9TVEFUUwordm9pZAorc3RhdHNfZGlzcGxheV9tZW1wKHN0cnVjdCBzdGF0c19tZW0gKm1lbSwgaW50IGluZGV4KQoreworICBjaGFyICogbWVtcF9uYW1lc1tdID0geworI2RlZmluZSBMV0lQX01FTVBPT0wobmFtZSxudW0sc2l6ZSxkZXNjKSBkZXNjLAorI2luY2x1ZGUgImx3aXAvbWVtcF9zdGQuaCIKKyAgfTsKKyAgaWYoaW5kZXggPCBNRU1QX01BWCkgeworICAgIHN0YXRzX2Rpc3BsYXlfbWVtKG1lbSwgbWVtcF9uYW1lc1tpbmRleF0pOworICB9Cit9CisjZW5kaWYgLyogTUVNUF9TVEFUUyAqLworI2VuZGlmIC8qIE1FTV9TVEFUUyB8fCBNRU1QX1NUQVRTICovCisKKyNpZiBTWVNfU1RBVFMKK3ZvaWQKK3N0YXRzX2Rpc3BsYXlfc3lzKHN0cnVjdCBzdGF0c19zeXMgKnN5cykKK3sKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgiXG5TWVNcblx0IikpOworICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJzZW0udXNlZDogICUiVTMyX0YiXG5cdCIsICh1MzJfdClzeXMtPnNlbS51c2VkKSk7IAorICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJzZW0ubWF4OiAgICUiVTMyX0YiXG5cdCIsICh1MzJfdClzeXMtPnNlbS5tYXgpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoInNlbS5lcnI6ICAgJSJVMzJfRiJcblx0IiwgKHUzMl90KXN5cy0+c2VtLmVycikpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgibXV0ZXgudXNlZDogJSJVMzJfRiJcblx0IiwgKHUzMl90KXN5cy0+bXV0ZXgudXNlZCkpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgibXV0ZXgubWF4OiAgJSJVMzJfRiJcblx0IiwgKHUzMl90KXN5cy0+bXV0ZXgubWF4KSk7IAorICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJtdXRleC5lcnI6ICAlIlUzMl9GIlxuXHQiLCAodTMyX3Qpc3lzLT5tdXRleC5lcnIpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoIm1ib3gudXNlZDogICUiVTMyX0YiXG5cdCIsICh1MzJfdClzeXMtPm1ib3gudXNlZCkpOyAKKyAgTFdJUF9QTEFURk9STV9ESUFHKCgibWJveC5tYXg6ICAgJSJVMzJfRiJcblx0IiwgKHUzMl90KXN5cy0+bWJveC5tYXgpKTsgCisgIExXSVBfUExBVEZPUk1fRElBRygoIm1ib3guZXJyOiAgICUiVTMyX0YiXG5cdCIsICh1MzJfdClzeXMtPm1ib3guZXJyKSk7IAorfQorI2VuZGlmIC8qIFNZU19TVEFUUyAqLworCit2b2lkCitzdGF0c19kaXNwbGF5KHZvaWQpCit7CisgIHMxNl90IGk7CisKKyAgTElOS19TVEFUU19ESVNQTEFZKCk7CisgIEVUSEFSUF9TVEFUU19ESVNQTEFZKCk7CisgIElQRlJBR19TVEFUU19ESVNQTEFZKCk7CisgIElQX1NUQVRTX0RJU1BMQVkoKTsKKyAgSUdNUF9TVEFUU19ESVNQTEFZKCk7CisgIElDTVBfU1RBVFNfRElTUExBWSgpOworICBVRFBfU1RBVFNfRElTUExBWSgpOworICBUQ1BfU1RBVFNfRElTUExBWSgpOworICBNRU1fU1RBVFNfRElTUExBWSgpOworICBmb3IgKGkgPSAwOyBpIDwgTUVNUF9NQVg7IGkrKykgeworICAgIE1FTVBfU1RBVFNfRElTUExBWShpKTsKKyAgfQorICBTWVNfU1RBVFNfRElTUExBWSgpOworfQorI2VuZGlmIC8qIExXSVBfU1RBVFNfRElTUExBWSAqLworCisjZW5kaWYgLyogTFdJUF9TVEFUUyAqLworCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2NvcmUvc3lzLmMgYi9jb3JlL2x3aXAvc3JjL2NvcmUvc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhNzdkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvY29yZS9zeXMuYwpAQCAtMCwwICsxLDY2IEBACisvKioKKyAqIEBmaWxlCisgKiBsd0lQIE9wZXJhdGluZyBTeXN0ZW0gYWJzdHJhY3Rpb24KKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICoKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaW5jbHVkZSAibHdpcC9zeXMuaCIKKworLyogTW9zdCBvZiB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gc3lzLmggbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAqIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZSBzeXNfYXJjaC5jICovCisKKyNpZiAhTk9fU1lTCisKKy8qKgorICogU2xlZXAgZm9yIHNvbWUgbXMuIFRpbWVvdXRzIGFyZSBOT1QgcHJvY2Vzc2VkIHdoaWxlIHNsZWVwaW5nLgorICoKKyAqIEBwYXJhbSBtcyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwCisgKi8KK3ZvaWQKK3N5c19tc2xlZXAodTMyX3QgbXMpCit7CisgIGlmIChtcyA+IDApIHsKKyAgICBzeXNfc2VtX3QgZGVsYXlzZW07CisgICAgZXJyX3QgZXJyID0gc3lzX3NlbV9uZXcoJmRlbGF5c2VtLCAwKTsKKyAgICBpZiAoZXJyID09IEVSUl9PSykgeworICAgICAgc3lzX2FyY2hfc2VtX3dhaXQoJmRlbGF5c2VtLCBtcyk7CisgICAgICBzeXNfc2VtX2ZyZWUoJmRlbGF5c2VtKTsKKyAgICB9CisgIH0KK30KKworI2VuZGlmIC8qICFOT19TWVMgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS90Y3AuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS90Y3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjI5YmM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL3RjcC5jCkBAIC0wLDAgKzEsMTYzNSBAQAorLyoqCisgKiBAZmlsZQorICogVHJhbnNtaXNzaW9uIENvbnRyb2wgUHJvdG9jb2wgZm9yIElQCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBmdW5jdGlvbnMgZm9yIHRoZSBUQ1AgaW1wbGVtZW50YXRpb24sIHN1Y2ggYXMgZnVuY3Rpbm9zCisgKiBmb3IgbWFuaXB1bGF0aW5nIHRoZSBkYXRhIHN0cnVjdHVyZXMgYW5kIHRoZSBUQ1AgdGltZXIgZnVuY3Rpb25zLiBUQ1AgZnVuY3Rpb25zCisgKiByZWxhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgaXMgZm91bmQgaW4gdGNwX2luLmMgYW5kIHRjcF9vdXQuYyByZXNwZWN0aXZlbHkuCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9UQ1AgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL2RlZi5oIgorI2luY2x1ZGUgImx3aXAvbWVtLmgiCisjaW5jbHVkZSAibHdpcC9tZW1wLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wLmgiCisjaW5jbHVkZSAibHdpcC90Y3AuaCIKKyNpbmNsdWRlICJsd2lwL3RjcF9pbXBsLmgiCisjaW5jbHVkZSAibHdpcC9kZWJ1Zy5oIgorI2luY2x1ZGUgImx3aXAvc3RhdHMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjb25zdCBjaGFyICogY29uc3QgdGNwX3N0YXRlX3N0cltdID0geworICAiQ0xPU0VEIiwgICAgICAKKyAgIkxJU1RFTiIsICAgICAgCisgICJTWU5fU0VOVCIsICAgIAorICAiU1lOX1JDVkQiLCAgICAKKyAgIkVTVEFCTElTSEVEIiwgCisgICJGSU5fV0FJVF8xIiwgIAorICAiRklOX1dBSVRfMiIsICAKKyAgIkNMT1NFX1dBSVQiLCAgCisgICJDTE9TSU5HIiwgICAgIAorICAiTEFTVF9BQ0siLCAgICAKKyAgIlRJTUVfV0FJVCIgICAKK307CisKKy8qIEluY3JlbWVudGVkIGV2ZXJ5IGNvYXJzZSBncmFpbmVkIHRpbWVyIHNob3QgKHR5cGljYWxseSBldmVyeSA1MDAgbXMpLiAqLwordTMyX3QgdGNwX3RpY2tzOworY29uc3QgdThfdCB0Y3BfYmFja29mZlsxM10gPQorICAgIHsgMSwgMiwgMywgNCwgNSwgNiwgNywgNywgNywgNywgNywgNywgN307CisgLyogVGltZXMgcGVyIHNsb3d0bXIgaGl0cyAqLworY29uc3QgdThfdCB0Y3BfcGVyc2lzdF9iYWNrb2ZmWzddID0geyAzLCA2LCAxMiwgMjQsIDQ4LCA5NiwgMTIwIH07CisKKy8qIFRoZSBUQ1AgUENCIGxpc3RzLiAqLworCisvKiogTGlzdCBvZiBhbGwgVENQIFBDQnMgYm91bmQgYnV0IG5vdCB5ZXQgKGNvbm5lY3RlZCB8fCBsaXN0ZW5pbmcpICovCitzdHJ1Y3QgdGNwX3BjYiAqdGNwX2JvdW5kX3BjYnM7CisvKiogTGlzdCBvZiBhbGwgVENQIFBDQnMgaW4gTElTVEVOIHN0YXRlICovCit1bmlvbiB0Y3BfbGlzdGVuX3BjYnNfdCB0Y3BfbGlzdGVuX3BjYnM7CisvKiogTGlzdCBvZiBhbGwgVENQIFBDQnMgdGhhdCBhcmUgaW4gYSBzdGF0ZSBpbiB3aGljaAorICogdGhleSBhY2NlcHQgb3Igc2VuZCBkYXRhLiAqLworc3RydWN0IHRjcF9wY2IgKnRjcF9hY3RpdmVfcGNiczsKKy8qKiBMaXN0IG9mIGFsbCBUQ1AgUENCcyBpbiBUSU1FLVdBSVQgc3RhdGUgKi8KK3N0cnVjdCB0Y3BfcGNiICp0Y3BfdHdfcGNiczsKKworI2RlZmluZSBOVU1fVENQX1BDQl9MSVNUUyAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX1RDUF9QQ0JfTElTVFNfTk9fVElNRV9XQUlUICAzCisvKiogQW4gYXJyYXkgd2l0aCBhbGwgKG5vbi10ZW1wb3JhcnkpIFBDQiBsaXN0cywgbWFpbmx5IHVzZWQgZm9yIHNtYWxsZXIgY29kZSBzaXplICovCitzdHJ1Y3QgdGNwX3BjYiAqKiBjb25zdCB0Y3BfcGNiX2xpc3RzW10gPSB7JnRjcF9saXN0ZW5fcGNicy5wY2JzLCAmdGNwX2JvdW5kX3BjYnMsCisgICZ0Y3BfYWN0aXZlX3BjYnMsICZ0Y3BfdHdfcGNic307CisKKy8qKiBPbmx5IHVzZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlLiAqLworc3RydWN0IHRjcF9wY2IgKnRjcF90bXBfcGNiOworCisvKiogVGltZXIgY291bnRlciB0byBoYW5kbGUgY2FsbGluZyBzbG93LXRpbWVyIGZyb20gdGNwX3RtcigpICovIAorc3RhdGljIHU4X3QgdGNwX3RpbWVyOworc3RhdGljIHUxNl90IHRjcF9uZXdfcG9ydCh2b2lkKTsKKworLyoqCisgKiBDYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGRpc3BhdGNoIFRDUCB0aW1lcnMuCisgKgorICovCit2b2lkCit0Y3BfdG1yKHZvaWQpCit7CisgIC8qIENhbGwgdGNwX2Zhc3R0bXIoKSBldmVyeSAyNTAgbXMgKi8KKyAgdGNwX2Zhc3R0bXIoKTsKKworICBpZiAoKyt0Y3BfdGltZXIgJiAxKSB7CisgICAgLyogQ2FsbCB0Y3BfdG1yKCkgZXZlcnkgNTAwIG1zLCBpLmUuLCBldmVyeSBvdGhlciB0aW1lcgorICAgICAgIHRjcF90bXIoKSBpcyBjYWxsZWQuICovCisgICAgdGNwX3Nsb3d0bXIoKTsKKyAgfQorfQorCisvKioKKyAqIENsb3NlcyB0aGUgVFggc2lkZSBvZiBhIGNvbm5lY3Rpb24gaGVsZCBieSB0aGUgUENCLgorICogRm9yIHRjcF9jbG9zZSgpLCBhIFJTVCBpcyBzZW50IGlmIHRoZSBhcHBsaWNhdGlvbiBkaWRuJ3QgcmVjZWl2ZSBhbGwgZGF0YQorICogKHRjcF9yZWN2ZWQoKSBub3QgY2FsbGVkIGZvciBhbGwgZGF0YSBwYXNzZWQgdG8gcmVjdiBjYWxsYmFjaykuCisgKgorICogTGlzdGVuaW5nIHBjYnMgYXJlIGZyZWVkIGFuZCBtYXkgbm90IGJlIHJlZmVyZW5jZWQgYW55IG1vcmUuCisgKiBDb25uZWN0aW9uIHBjYnMgYXJlIGZyZWVkIGlmIG5vdCB5ZXQgY29ubmVjdGVkIGFuZCBtYXkgbm90IGJlIHJlZmVyZW5jZWQKKyAqIGFueSBtb3JlLiBJZiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgKGF0IGxlYXN0IFNZTiByZWNlaXZlZCBvciBpbgorICogYSBjbG9zaW5nIHN0YXRlKSwgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCBhbmQgcHV0IGluIGEgY2xvc2luZyBzdGF0ZS4KKyAqIFRoZSBwY2IgaXMgdGhlbiBhdXRvbWF0aWNhbGx5IGZyZWVkIGluIHRjcF9zbG93dG1yKCkuIEl0IGlzIHRoZXJlZm9yZQorICogdW5zYWZlIHRvIHJlZmVyZW5jZSBpdC4KKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB0Y3BfcGNiIHRvIGNsb3NlCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZAorICogICAgICAgICBhbm90aGVyIGVycl90IGlmIGNsb3NpbmcgZmFpbGVkIGFuZCBwY2IgaXMgbm90IGZyZWVkCisgKi8KK3N0YXRpYyBlcnJfdAordGNwX2Nsb3NlX3NodXRkb3duKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHU4X3QgcnN0X29uX3VuYWNrZWRfZGF0YSkKK3sKKyAgZXJyX3QgZXJyOworCisgIGlmIChyc3Rfb25fdW5hY2tlZF9kYXRhICYmIChwY2ItPnN0YXRlICE9IExJU1RFTikpIHsKKyAgICBpZiAoKHBjYi0+cmVmdXNlZF9kYXRhICE9IE5VTEwpIHx8IChwY2ItPnJjdl93bmQgIT0gVENQX1dORCkpIHsKKyAgICAgIC8qIE5vdCBhbGwgZGF0YSByZWNlaXZlZCBieSBhcHBsaWNhdGlvbiwgc2VuZCBSU1QgdG8gdGVsbCB0aGUgcmVtb3RlCisgICAgICAgICBzaWRlIGFib3V0IHRoaXMuICovCisgICAgICBMV0lQX0FTU0VSVCgicGNiLT5mbGFncyAmIFRGX1JYQ0xPU0VEIiwgcGNiLT5mbGFncyAmIFRGX1JYQ0xPU0VEKTsKKworICAgICAgLyogZG9uJ3QgY2FsbCB0Y3BfYWJvcnQgaGVyZTogd2UgbXVzdCBub3QgZGVhbGxvY2F0ZSB0aGUgcGNiIHNpbmNlCisgICAgICAgICB0aGF0IG1pZ2h0IG5vdCBiZSBleHBlY3RlZCB3aGVuIGNhbGxpbmcgdGNwX2Nsb3NlICovCisgICAgICB0Y3BfcnN0KHBjYi0+c25kX254dCwgcGNiLT5yY3Zfbnh0LCAmcGNiLT5sb2NhbF9pcCwgJnBjYi0+cmVtb3RlX2lwLAorICAgICAgICBwY2ItPmxvY2FsX3BvcnQsIHBjYi0+cmVtb3RlX3BvcnQpOworCisgICAgICB0Y3BfcGNiX3B1cmdlKHBjYik7CisKKyAgICAgIC8qIFRPRE86IHRvIHdoaWNoIHN0YXRlIGRvIHdlIG1vdmUgbm93PyAqLworCisgICAgICAvKiBtb3ZlIHRvIFRJTUVfV0FJVCBzaW5jZSB3ZSBjbG9zZSBhY3RpdmVseSAqLworICAgICAgVENQX1JNVigmdGNwX2FjdGl2ZV9wY2JzLCBwY2IpOworICAgICAgcGNiLT5zdGF0ZSA9IFRJTUVfV0FJVDsKKyAgICAgIFRDUF9SRUcoJnRjcF90d19wY2JzLCBwY2IpOworCisgICAgICByZXR1cm4gRVJSX09LOworICAgIH0KKyAgfQorCisgIHN3aXRjaCAocGNiLT5zdGF0ZSkgeworICBjYXNlIENMT1NFRDoKKyAgICAvKiBDbG9zaW5nIGEgcGNiIGluIHRoZSBDTE9TRUQgc3RhdGUgbWlnaHQgc2VlbSBlcnJvbmVvdXMsCisgICAgICogaG93ZXZlciwgaXQgaXMgaW4gdGhpcyBzdGF0ZSBvbmNlIGFsbG9jYXRlZCBhbmQgYXMgeWV0IHVudXNlZAorICAgICAqIGFuZCB0aGUgdXNlciBuZWVkcyBzb21lIHdheSB0byBmcmVlIGl0IHNob3VsZCB0aGUgbmVlZCBhcmlzZS4KKyAgICAgKiBDYWxsaW5nIHRjcF9jbG9zZSgpIHdpdGggYSBwY2IgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCwgKGkuZS4gdHdpY2UpCisgICAgICogb3IgZm9yIGEgcGNiIHRoYXQgaGFzIGJlZW4gdXNlZCBhbmQgdGhlbiBlbnRlcmVkIHRoZSBDTE9TRUQgc3RhdGUgCisgICAgICogaXMgZXJyb25lb3VzLCBidXQgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHRoZSBwY2IgaGFzIGluIHRob3NlIGNhc2VzCisgICAgICogYmVlbiBmcmVlZCwgYW5kIHNvIGFueSByZW1haW5pbmcgaGFuZGxlcyBhcmUgYm9ndXMuICovCisgICAgZXJyID0gRVJSX09LOworICAgIGlmIChwY2ItPmxvY2FsX3BvcnQgIT0gMCkgeworICAgICAgVENQX1JNVigmdGNwX2JvdW5kX3BjYnMsIHBjYik7CisgICAgfQorICAgIG1lbXBfZnJlZShNRU1QX1RDUF9QQ0IsIHBjYik7CisgICAgcGNiID0gTlVMTDsKKyAgICBicmVhazsKKyAgY2FzZSBMSVNURU46CisgICAgZXJyID0gRVJSX09LOworICAgIHRjcF9wY2JfcmVtb3ZlKCZ0Y3BfbGlzdGVuX3BjYnMucGNicywgcGNiKTsKKyAgICBtZW1wX2ZyZWUoTUVNUF9UQ1BfUENCX0xJU1RFTiwgcGNiKTsKKyAgICBwY2IgPSBOVUxMOworICAgIGJyZWFrOworICBjYXNlIFNZTl9TRU5UOgorICAgIGVyciA9IEVSUl9PSzsKKyAgICB0Y3BfcGNiX3JlbW92ZSgmdGNwX2FjdGl2ZV9wY2JzLCBwY2IpOworICAgIG1lbXBfZnJlZShNRU1QX1RDUF9QQ0IsIHBjYik7CisgICAgcGNiID0gTlVMTDsKKyAgICBzbm1wX2luY190Y3BhdHRlbXB0ZmFpbHMoKTsKKyAgICBicmVhazsKKyAgY2FzZSBTWU5fUkNWRDoKKyAgICBlcnIgPSB0Y3Bfc2VuZF9maW4ocGNiKTsKKyAgICBpZiAoZXJyID09IEVSUl9PSykgeworICAgICAgc25tcF9pbmNfdGNwYXR0ZW1wdGZhaWxzKCk7CisgICAgICBwY2ItPnN0YXRlID0gRklOX1dBSVRfMTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgRVNUQUJMSVNIRUQ6CisgICAgZXJyID0gdGNwX3NlbmRfZmluKHBjYik7CisgICAgaWYgKGVyciA9PSBFUlJfT0spIHsKKyAgICAgIHNubXBfaW5jX3RjcGVzdGFicmVzZXRzKCk7CisgICAgICBwY2ItPnN0YXRlID0gRklOX1dBSVRfMTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgQ0xPU0VfV0FJVDoKKyAgICBlcnIgPSB0Y3Bfc2VuZF9maW4ocGNiKTsKKyAgICBpZiAoZXJyID09IEVSUl9PSykgeworICAgICAgc25tcF9pbmNfdGNwZXN0YWJyZXNldHMoKTsKKyAgICAgIHBjYi0+c3RhdGUgPSBMQVNUX0FDSzsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgLyogSGFzIGFscmVhZHkgYmVlbiBjbG9zZWQsIGRvIG5vdGhpbmcuICovCisgICAgZXJyID0gRVJSX09LOworICAgIHBjYiA9IE5VTEw7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAocGNiICE9IE5VTEwgJiYgZXJyID09IEVSUl9PSykgeworICAgIC8qIFRvIGVuc3VyZSBhbGwgZGF0YSBoYXMgYmVlbiBzZW50IHdoZW4gdGNwX2Nsb3NlIHJldHVybnMsIHdlIGhhdmUKKyAgICAgICB0byBtYWtlIHN1cmUgdGNwX291dHB1dCBkb2Vzbid0IGZhaWwuCisgICAgICAgU2luY2Ugd2UgZG9uJ3QgcmVhbGx5IGhhdmUgdG8gZW5zdXJlIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQgd2hlbiB0Y3BfY2xvc2UKKyAgICAgICByZXR1cm5zICh1bnNlbnQgZGF0YSBpcyBzZW50IGZyb20gdGNwIHRpbWVyIGZ1bmN0aW9ucywgYWxzbyksIHdlIGRvbid0IGNhcmUKKyAgICAgICBmb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB0Y3Bfb3V0cHV0IGZvciBub3cuICovCisgICAgLyogQHRvZG86IFdoZW4gaW1wbGVtZW50aW5nIFNPX0xJTkdFUiwgdGhpcyBtdXN0IGJlIGNoYW5nZWQgc29tZWhvdzoKKyAgICAgICBJZiBTT0ZfTElOR0VSIGlzIHNldCwgdGhlIGRhdGEgc2hvdWxkIGJlIHNlbnQgYW5kIGFja2VkIGJlZm9yZSBjbG9zZSByZXR1cm5zLgorICAgICAgIFRoaXMgY2FuIG9ubHkgYmUgdmFsaWQgZm9yIHNlcXVlbnRpYWwgQVBJcywgbm90IGZvciB0aGUgcmF3IEFQSS4gKi8KKyAgICB0Y3Bfb3V0cHV0KHBjYik7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gaGVsZCBieSB0aGUgUENCLgorICoKKyAqIExpc3RlbmluZyBwY2JzIGFyZSBmcmVlZCBhbmQgbWF5IG5vdCBiZSByZWZlcmVuY2VkIGFueSBtb3JlLgorICogQ29ubmVjdGlvbiBwY2JzIGFyZSBmcmVlZCBpZiBub3QgeWV0IGNvbm5lY3RlZCBhbmQgbWF5IG5vdCBiZSByZWZlcmVuY2VkCisgKiBhbnkgbW9yZS4gSWYgYSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIChhdCBsZWFzdCBTWU4gcmVjZWl2ZWQgb3IgaW4KKyAqIGEgY2xvc2luZyBzdGF0ZSksIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCwgYW5kIHB1dCBpbiBhIGNsb3Npbmcgc3RhdGUuCisgKiBUaGUgcGNiIGlzIHRoZW4gYXV0b21hdGljYWxseSBmcmVlZCBpbiB0Y3Bfc2xvd3RtcigpLiBJdCBpcyB0aGVyZWZvcmUKKyAqIHVuc2FmZSB0byByZWZlcmVuY2UgaXQgKHVubGVzcyBhbiBlcnJvciBpcyByZXR1cm5lZCkuCisgKgorICogQHBhcmFtIHBjYiB0aGUgdGNwX3BjYiB0byBjbG9zZQorICogQHJldHVybiBFUlJfT0sgaWYgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQKKyAqICAgICAgICAgYW5vdGhlciBlcnJfdCBpZiBjbG9zaW5nIGZhaWxlZCBhbmQgcGNiIGlzIG5vdCBmcmVlZAorICovCitlcnJfdAordGNwX2Nsb3NlKHN0cnVjdCB0Y3BfcGNiICpwY2IpCit7CisjaWYgVENQX0RFQlVHCisgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3BfY2xvc2U6IGNsb3NpbmcgaW4gIikpOworICB0Y3BfZGVidWdfcHJpbnRfc3RhdGUocGNiLT5zdGF0ZSk7CisjZW5kaWYgLyogVENQX0RFQlVHICovCisKKyAgaWYgKHBjYi0+c3RhdGUgIT0gTElTVEVOKSB7CisgICAgLyogU2V0IGEgZmxhZyBub3QgdG8gcmVjZWl2ZSBhbnkgbW9yZSBkYXRhLi4uICovCisgICAgcGNiLT5mbGFncyB8PSBURl9SWENMT1NFRDsKKyAgfQorICAvKiAuLi4gYW5kIGNsb3NlICovCisgIHJldHVybiB0Y3BfY2xvc2Vfc2h1dGRvd24ocGNiLCAxKTsKK30KKworLyoqCisgKiBDYXVzZXMgYWxsIG9yIHBhcnQgb2YgYSBmdWxsLWR1cGxleCBjb25uZWN0aW9uIG9mIHRoaXMgUENCIHRvIGJlIHNodXQgZG93bi4KKyAqIFRoaXMgZG9lc24ndCBkZWFsbG9jYXRlIHRoZSBQQ0IhCisgKgorICogQHBhcmFtIHBjYiBQQ0IgdG8gc2h1dGRvd24KKyAqIEBwYXJhbSBzaHV0X3J4IHNodXQgZG93biByZWNlaXZlIHNpZGUgaWYgdGhpcyBpcyAhPSAwCisgKiBAcGFyYW0gc2h1dF90eCBzaHV0IGRvd24gc2VuZCBzaWRlIGlmIHRoaXMgaXMgIT0gMAorICogQHJldHVybiBFUlJfT0sgaWYgc2h1dGRvd24gc3VjY2VlZGVkIChvciB0aGUgUENCIGhhcyBhbHJlYWR5IGJlZW4gc2h1dCBkb3duKQorICogICAgICAgICBhbm90aGVyIGVycl90IG9uIGVycm9yLgorICovCitlcnJfdAordGNwX3NodXRkb3duKHN0cnVjdCB0Y3BfcGNiICpwY2IsIGludCBzaHV0X3J4LCBpbnQgc2h1dF90eCkKK3sKKyAgaWYgKHBjYi0+c3RhdGUgPT0gTElTVEVOKSB7CisgICAgcmV0dXJuIEVSUl9DT05OOworICB9CisgIGlmIChzaHV0X3J4KSB7CisgICAgLyogc2h1dCBkb3duIHRoZSByZWNlaXZlIHNpZGU6IGZyZWUgYnVmZmVyZWQgZGF0YS4uLiAqLworICAgIGlmIChwY2ItPnJlZnVzZWRfZGF0YSAhPSBOVUxMKSB7CisgICAgICBwYnVmX2ZyZWUocGNiLT5yZWZ1c2VkX2RhdGEpOworICAgICAgcGNiLT5yZWZ1c2VkX2RhdGEgPSBOVUxMOworICAgIH0KKyAgICAvKiAuLi4gYW5kIHNldCBhIGZsYWcgbm90IHRvIHJlY2VpdmUgYW55IG1vcmUgZGF0YSAqLworICAgIHBjYi0+ZmxhZ3MgfD0gVEZfUlhDTE9TRUQ7CisgIH0KKyAgaWYgKHNodXRfdHgpIHsKKyAgICAvKiBUaGlzIGNhbid0IGhhcHBlbiB0d2ljZSBzaW5jZSBpZiBpdCBzdWNjZWVkcywgdGhlIHBjYidzIHN0YXRlIGlzIGNoYW5nZWQuCisgICAgICAgT25seSBjbG9zZSBpbiB0aGVzZSBzdGF0ZXMgYXMgdGhlIG90aGVycyBkaXJlY3RseSBkZWFsbG9jYXRlIHRoZSBQQ0IgKi8KKyAgICBzd2l0Y2ggKHBjYi0+c3RhdGUpIHsKKyAgY2FzZSBTWU5fUkNWRDoKKyAgY2FzZSBFU1RBQkxJU0hFRDoKKyAgY2FzZSBDTE9TRV9XQUlUOgorICAgIHJldHVybiB0Y3BfY2xvc2Vfc2h1dGRvd24ocGNiLCAwKTsKKyAgZGVmYXVsdDoKKyAgICAvKiBkb24ndCBzaHV0IGRvd24gb3RoZXIgc3RhdGVzICovCisgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8qIEB0b2RvOiByZXR1cm4gYW5vdGhlciBlcnJfdCBpZiBub3QgaW4gY29ycmVjdCBzdGF0ZSBvciBhbHJlYWR5IHNodXQ/ICovCisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogQWJhbmRvbnMgYSBjb25uZWN0aW9uIGFuZCBvcHRpb25hbGx5IHNlbmRzIGEgUlNUIHRvIHRoZSByZW1vdGUKKyAqIGhvc3QuICBEZWxldGVzIHRoZSBsb2NhbCBwcm90b2NvbCBjb250cm9sIGJsb2NrLiBUaGlzIGlzIGRvbmUgd2hlbgorICogYSBjb25uZWN0aW9uIGlzIGtpbGxlZCBiZWNhdXNlIG9mIHNob3J0YWdlIG9mIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB0Y3BfcGNiIHRvIGFib3J0CisgKiBAcGFyYW0gcmVzZXQgYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgcmVzZXQgc2hvdWxkIGJlIHNlbnQKKyAqLwordm9pZAordGNwX2FiYW5kb24oc3RydWN0IHRjcF9wY2IgKnBjYiwgaW50IHJlc2V0KQoreworICB1MzJfdCBzZXFubywgYWNrbm87CisgIHUxNl90IHJlbW90ZV9wb3J0LCBsb2NhbF9wb3J0OworICBpcF9hZGRyX3QgcmVtb3RlX2lwLCBsb2NhbF9pcDsKKyNpZiBMV0lQX0NBTExCQUNLX0FQSSAgCisgIHRjcF9lcnJfZm4gZXJyZjsKKyNlbmRpZiAvKiBMV0lQX0NBTExCQUNLX0FQSSAqLworICB2b2lkICplcnJmX2FyZzsKKworICAvKiBwY2ItPnN0YXRlIExJU1RFTiBub3QgYWxsb3dlZCBoZXJlICovCisgIExXSVBfQVNTRVJUKCJkb24ndCBjYWxsIHRjcF9hYm9ydC90Y3BfYWJhbmRvbiBmb3IgbGlzdGVuLXBjYnMiLAorICAgIHBjYi0+c3RhdGUgIT0gTElTVEVOKTsKKyAgLyogRmlndXJlIG91dCBvbiB3aGljaCBUQ1AgUENCIGxpc3Qgd2UgYXJlLCBhbmQgcmVtb3ZlIHVzLiBJZiB3ZQorICAgICBhcmUgaW4gYW4gYWN0aXZlIHN0YXRlLCBjYWxsIHRoZSByZWNlaXZlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aAorICAgICB0aGUgUENCIHdpdGggYSBOVUxMIGFyZ3VtZW50LCBhbmQgc2VuZCBhbiBSU1QgdG8gdGhlIHJlbW90ZSBlbmQuICovCisgIGlmIChwY2ItPnN0YXRlID09IFRJTUVfV0FJVCkgeworICAgIHRjcF9wY2JfcmVtb3ZlKCZ0Y3BfdHdfcGNicywgcGNiKTsKKyAgICBtZW1wX2ZyZWUoTUVNUF9UQ1BfUENCLCBwY2IpOworICB9IGVsc2UgeworICAgIHNlcW5vID0gcGNiLT5zbmRfbnh0OworICAgIGFja25vID0gcGNiLT5yY3Zfbnh0OworICAgIGlwX2FkZHJfY29weShsb2NhbF9pcCwgcGNiLT5sb2NhbF9pcCk7CisgICAgaXBfYWRkcl9jb3B5KHJlbW90ZV9pcCwgcGNiLT5yZW1vdGVfaXApOworICAgIGxvY2FsX3BvcnQgPSBwY2ItPmxvY2FsX3BvcnQ7CisgICAgcmVtb3RlX3BvcnQgPSBwY2ItPnJlbW90ZV9wb3J0OworI2lmIExXSVBfQ0FMTEJBQ0tfQVBJCisgICAgZXJyZiA9IHBjYi0+ZXJyZjsKKyNlbmRpZiAvKiBMV0lQX0NBTExCQUNLX0FQSSAqLworICAgIGVycmZfYXJnID0gcGNiLT5jYWxsYmFja19hcmc7CisgICAgdGNwX3BjYl9yZW1vdmUoJnRjcF9hY3RpdmVfcGNicywgcGNiKTsKKyAgICBpZiAocGNiLT51bmFja2VkICE9IE5VTEwpIHsKKyAgICAgIHRjcF9zZWdzX2ZyZWUocGNiLT51bmFja2VkKTsKKyAgICB9CisgICAgaWYgKHBjYi0+dW5zZW50ICE9IE5VTEwpIHsKKyAgICAgIHRjcF9zZWdzX2ZyZWUocGNiLT51bnNlbnQpOworICAgIH0KKyNpZiBUQ1BfUVVFVUVfT09TRVEgICAgCisgICAgaWYgKHBjYi0+b29zZXEgIT0gTlVMTCkgeworICAgICAgdGNwX3NlZ3NfZnJlZShwY2ItPm9vc2VxKTsKKyAgICB9CisjZW5kaWYgLyogVENQX1FVRVVFX09PU0VRICovCisgICAgbWVtcF9mcmVlKE1FTVBfVENQX1BDQiwgcGNiKTsKKyAgICBUQ1BfRVZFTlRfRVJSKGVycmYsIGVycmZfYXJnLCBFUlJfQUJSVCk7CisgICAgaWYgKHJlc2V0KSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfUlNUX0RFQlVHLCAoInRjcF9hYmFuZG9uOiBzZW5kaW5nIFJTVFxuIikpOworICAgICAgdGNwX3JzdChzZXFubywgYWNrbm8sICZsb2NhbF9pcCwgJnJlbW90ZV9pcCwgbG9jYWxfcG9ydCwgcmVtb3RlX3BvcnQpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEFib3J0cyB0aGUgY29ubmVjdGlvbiBieSBzZW5kaW5nIGEgUlNUIChyZXNldCkgc2VnbWVudCB0byB0aGUgcmVtb3RlCisgKiBob3N0LiBUaGUgcGNiIGlzIGRlYWxsb2NhdGVkLiBUaGlzIGZ1bmN0aW9uIG5ldmVyIGZhaWxzLgorICoKKyAqIEFUVEVOVElPTjogV2hlbiBjYWxsaW5nIHRoaXMgZnJvbSBvbmUgb2YgdGhlIFRDUCBjYWxsYmFja3MsIG1ha2UKKyAqIHN1cmUgeW91IGFsd2F5cyByZXR1cm4gRVJSX0FCUlQgKGFuZCBuZXZlciByZXR1cm4gRVJSX0FCUlQgb3RoZXJ3aXNlCisgKiBvciB5b3Ugd2lsbCByaXNrIGFjY2Vzc2luZyBkZWFsbG9jYXRlZCBtZW1vcnkgb3IgbWVtb3J5IGxlYWtzIQorICoKKyAqIEBwYXJhbSBwY2IgdGhlIHRjcCBwY2IgdG8gYWJvcnQKKyAqLwordm9pZAordGNwX2Fib3J0KHN0cnVjdCB0Y3BfcGNiICpwY2IpCit7CisgIHRjcF9hYmFuZG9uKHBjYiwgMSk7Cit9CisKKy8qKgorICogQmluZHMgdGhlIGNvbm5lY3Rpb24gdG8gYSBsb2NhbCBwb3J0bnVtYmVyIGFuZCBJUCBhZGRyZXNzLiBJZiB0aGUKKyAqIElQIGFkZHJlc3MgaXMgbm90IGdpdmVuIChpLmUuLCBpcGFkZHIgPT0gTlVMTCksIHRoZSBJUCBhZGRyZXNzIG9mCisgKiB0aGUgb3V0Z29pbmcgbmV0d29yayBpbnRlcmZhY2UgaXMgdXNlZCBpbnN0ZWFkLgorICoKKyAqIEBwYXJhbSBwY2IgdGhlIHRjcF9wY2IgdG8gYmluZCAobm8gY2hlY2sgaXMgZG9uZSB3aGV0aGVyIHRoaXMgcGNiIGlzCisgKiAgICAgICAgYWxyZWFkeSBib3VuZCEpCisgKiBAcGFyYW0gaXBhZGRyIHRoZSBsb2NhbCBpcCBhZGRyZXNzIHRvIGJpbmQgdG8gKHVzZSBJUF9BRERSX0FOWSB0byBiaW5kCisgKiAgICAgICAgdG8gYW55IGxvY2FsIGFkZHJlc3MKKyAqIEBwYXJhbSBwb3J0IHRoZSBsb2NhbCBwb3J0IHRvIGJpbmQgdG8KKyAqIEByZXR1cm4gRVJSX1VTRSBpZiB0aGUgcG9ydCBpcyBhbHJlYWR5IGluIHVzZQorICogICAgICAgICBFUlJfVkFMIGlmIGJpbmQgZmFpbGVkIGJlY2F1c2UgdGhlIFBDQiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZQorICogICAgICAgICBFUlJfT0sgaWYgYm91bmQKKyAqLworZXJyX3QKK3RjcF9iaW5kKHN0cnVjdCB0Y3BfcGNiICpwY2IsIGlwX2FkZHJfdCAqaXBhZGRyLCB1MTZfdCBwb3J0KQoreworICBpbnQgaTsKKyAgaW50IG1heF9wY2JfbGlzdCA9IE5VTV9UQ1BfUENCX0xJU1RTOworICBzdHJ1Y3QgdGNwX3BjYiAqY3BjYjsKKworICBMV0lQX0VSUk9SKCJ0Y3BfYmluZDogY2FuIG9ubHkgYmluZCBpbiBzdGF0ZSBDTE9TRUQiLCBwY2ItPnN0YXRlID09IENMT1NFRCwgcmV0dXJuIEVSUl9WQUwpOworCisjaWYgU09fUkVVU0UKKyAgLyogVW5sZXNzIHRoZSBSRVVTRUFERFIgZmxhZyBpcyBzZXQsCisgICAgIHdlIGhhdmUgdG8gY2hlY2sgdGhlIHBjYnMgaW4gVElNRS1XQUlUIHN0YXRlLCBhbHNvLgorICAgICBXZSBkbyBub3QgZHVtcCBUSU1FX1dBSVQgcGNiJ3M7IHRoZXkgY2FuIHN0aWxsIGJlIG1hdGNoZWQgYnkgaW5jb21pbmcKKyAgICAgcGFja2V0cyB1c2luZyBib3RoIGxvY2FsIGFuZCByZW1vdGUgSVAgYWRkcmVzc2VzIGFuZCBwb3J0cyB0byBkaXN0aW5ndWlzaC4KKyAgICovCisgIGlmICgocGNiLT5zb19vcHRpb25zICYgU09GX1JFVVNFQUREUikgIT0gMCkgeworICAgIG1heF9wY2JfbGlzdCA9IE5VTV9UQ1BfUENCX0xJU1RTX05PX1RJTUVfV0FJVDsKKyAgfQorI2VuZGlmIC8qIFNPX1JFVVNFICovCisKKyAgaWYgKHBvcnQgPT0gMCkgeworICAgIHBvcnQgPSB0Y3BfbmV3X3BvcnQoKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBhZGRyZXNzIGFscmVhZHkgaXMgaW4gdXNlIChvbiBhbGwgbGlzdHMpICovCisgIGZvciAoaSA9IDA7IGkgPCBtYXhfcGNiX2xpc3Q7IGkrKykgeworICAgIGZvcihjcGNiID0gKnRjcF9wY2JfbGlzdHNbaV07IGNwY2IgIT0gTlVMTDsgY3BjYiA9IGNwY2ItPm5leHQpIHsKKyAgICAgIGlmIChjcGNiLT5sb2NhbF9wb3J0ID09IHBvcnQpIHsKKyNpZiBTT19SRVVTRQorICAgICAgICAvKiBPbWl0IGNoZWNraW5nIGZvciB0aGUgc2FtZSBwb3J0IGlmIGJvdGggcGNicyBoYXZlIFJFVVNFQUREUiBzZXQuCisgICAgICAgICAgIEZvciBTT19SRVVTRUFERFIsIHRoZSBkdXBsaWNhdGUtY2hlY2sgZm9yIGEgNS10dXBsZSBpcyBkb25lIGluCisgICAgICAgICAgIHRjcF9jb25uZWN0LiAqLworICAgICAgICBpZiAoKChwY2ItPnNvX29wdGlvbnMgJiBTT0ZfUkVVU0VBRERSKSA9PSAwKSB8fAorICAgICAgICAgICgoY3BjYi0+c29fb3B0aW9ucyAmIFNPRl9SRVVTRUFERFIpID09IDApKQorI2VuZGlmIC8qIFNPX1JFVVNFICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaXBfYWRkcl9pc2FueSgmKGNwY2ItPmxvY2FsX2lwKSkgfHwKKyAgICAgICAgICAgICAgaXBfYWRkcl9pc2FueShpcGFkZHIpIHx8CisgICAgICAgICAgICAgIGlwX2FkZHJfY21wKCYoY3BjYi0+bG9jYWxfaXApLCBpcGFkZHIpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJSX1VTRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIWlwX2FkZHJfaXNhbnkoaXBhZGRyKSkgeworICAgIHBjYi0+bG9jYWxfaXAgPSAqaXBhZGRyOworICB9CisgIHBjYi0+bG9jYWxfcG9ydCA9IHBvcnQ7CisgIFRDUF9SRUcoJnRjcF9ib3VuZF9wY2JzLCBwY2IpOworICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX2JpbmQ6IGJpbmQgdG8gcG9ydCAlIlUxNl9GIlxuIiwgcG9ydCkpOworICByZXR1cm4gRVJSX09LOworfQorI2lmIExXSVBfQ0FMTEJBQ0tfQVBJCisvKioKKyAqIERlZmF1bHQgYWNjZXB0IGNhbGxiYWNrIGlmIG5vIGFjY2VwdCBjYWxsYmFjayBpcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgKi8KK3N0YXRpYyBlcnJfdAordGNwX2FjY2VwdF9udWxsKHZvaWQgKmFyZywgc3RydWN0IHRjcF9wY2IgKnBjYiwgZXJyX3QgZXJyKQoreworICBMV0lQX1VOVVNFRF9BUkcoYXJnKTsKKyAgTFdJUF9VTlVTRURfQVJHKHBjYik7CisgIExXSVBfVU5VU0VEX0FSRyhlcnIpOworCisgIHJldHVybiBFUlJfQUJSVDsKK30KKyNlbmRpZiAvKiBMV0lQX0NBTExCQUNLX0FQSSAqLworCisvKioKKyAqIFNldCB0aGUgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gYmUgTElTVEVOLCB3aGljaCBtZWFucyB0aGF0IGl0CisgKiBpcyBhYmxlIHRvIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucy4gVGhlIHByb3RvY29sIGNvbnRyb2wgYmxvY2sKKyAqIGlzIHJlYWxsb2NhdGVkIGluIG9yZGVyIHRvIGNvbnN1bWUgbGVzcyBtZW1vcnkuIFNldHRpbmcgdGhlCisgKiBjb25uZWN0aW9uIHRvIExJU1RFTiBpcyBhbiBpcnJldmVyc2libGUgcHJvY2Vzcy4KKyAqCisgKiBAcGFyYW0gcGNiIHRoZSBvcmlnaW5hbCB0Y3BfcGNiCisgKiBAcGFyYW0gYmFja2xvZyB0aGUgaW5jb21pbmcgY29ubmVjdGlvbnMgcXVldWUgbGltaXQKKyAqIEByZXR1cm4gdGNwX3BjYiB1c2VkIGZvciBsaXN0ZW5pbmcsIGNvbnN1bWVzIGxlc3MgbWVtb3J5LgorICoKKyAqIEBub3RlIFRoZSBvcmlnaW5hbCB0Y3BfcGNiIGlzIGZyZWVkLiBUaGlzIGZ1bmN0aW9uIHRoZXJlZm9yZSBoYXMgdG8gYmUKKyAqICAgICAgIGNhbGxlZCBsaWtlIHRoaXM6CisgKiAgICAgICAgICAgICB0cGNiID0gdGNwX2xpc3Rlbih0cGNiKTsKKyAqLworc3RydWN0IHRjcF9wY2IgKgordGNwX2xpc3Rlbl93aXRoX2JhY2tsb2coc3RydWN0IHRjcF9wY2IgKnBjYiwgdThfdCBiYWNrbG9nKQoreworICBzdHJ1Y3QgdGNwX3BjYl9saXN0ZW4gKmxwY2I7CisKKyAgTFdJUF9VTlVTRURfQVJHKGJhY2tsb2cpOworICBMV0lQX0VSUk9SKCJ0Y3BfbGlzdGVuOiBwY2IgYWxyZWFkeSBjb25uZWN0ZWQiLCBwY2ItPnN0YXRlID09IENMT1NFRCwgcmV0dXJuIE5VTEwpOworCisgIC8qIGFscmVhZHkgbGlzdGVuaW5nPyAqLworICBpZiAocGNiLT5zdGF0ZSA9PSBMSVNURU4pIHsKKyAgICByZXR1cm4gcGNiOworICB9CisjaWYgU09fUkVVU0UKKyAgaWYgKChwY2ItPnNvX29wdGlvbnMgJiBTT0ZfUkVVU0VBRERSKSAhPSAwKSB7CisgICAgLyogU2luY2UgU09GX1JFVVNFQUREUiBhbGxvd3MgcmV1c2luZyBhIGxvY2FsIGFkZHJlc3MgYmVmb3JlIHRoZSBwY2IncyB1c2FnZQorICAgICAgIGlzIGRlY2xhcmVkIChsaXN0ZW4tL2Nvbm5lY3Rpb24tcGNiKSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgbm93IHRoYXQKKyAgICAgICB0aGlzIHBvcnQgaXMgb25seSB1c2VkIG9uY2UgZm9yIGV2ZXJ5IGxvY2FsIElQLiAqLworICAgIGZvcihscGNiID0gdGNwX2xpc3Rlbl9wY2JzLmxpc3Rlbl9wY2JzOyBscGNiICE9IE5VTEw7IGxwY2IgPSBscGNiLT5uZXh0KSB7CisgICAgICBpZiAobHBjYi0+bG9jYWxfcG9ydCA9PSBwY2ItPmxvY2FsX3BvcnQpIHsKKyAgICAgICAgaWYgKGlwX2FkZHJfY21wKCZscGNiLT5sb2NhbF9pcCwgJnBjYi0+bG9jYWxfaXApKSB7CisgICAgICAgICAgLyogdGhpcyBhZGRyZXNzL3BvcnQgaXMgYWxyZWFkeSB1c2VkICovCisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZiAvKiBTT19SRVVTRSAqLworICBscGNiID0gKHN0cnVjdCB0Y3BfcGNiX2xpc3RlbiAqKW1lbXBfbWFsbG9jKE1FTVBfVENQX1BDQl9MSVNURU4pOworICBpZiAobHBjYiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbHBjYi0+Y2FsbGJhY2tfYXJnID0gcGNiLT5jYWxsYmFja19hcmc7CisgIGxwY2ItPmxvY2FsX3BvcnQgPSBwY2ItPmxvY2FsX3BvcnQ7CisgIGxwY2ItPnN0YXRlID0gTElTVEVOOworICBscGNiLT5wcmlvID0gcGNiLT5wcmlvOworICBscGNiLT5zb19vcHRpb25zID0gcGNiLT5zb19vcHRpb25zOworICBscGNiLT5zb19vcHRpb25zIHw9IFNPRl9BQ0NFUFRDT05OOworICBscGNiLT50dGwgPSBwY2ItPnR0bDsKKyAgbHBjYi0+dG9zID0gcGNiLT50b3M7CisgIGlwX2FkZHJfY29weShscGNiLT5sb2NhbF9pcCwgcGNiLT5sb2NhbF9pcCk7CisgIGlmIChwY2ItPmxvY2FsX3BvcnQgIT0gMCkgeworICAgIFRDUF9STVYoJnRjcF9ib3VuZF9wY2JzLCBwY2IpOworICB9CisgIG1lbXBfZnJlZShNRU1QX1RDUF9QQ0IsIHBjYik7CisjaWYgTFdJUF9DQUxMQkFDS19BUEkKKyAgbHBjYi0+YWNjZXB0ID0gdGNwX2FjY2VwdF9udWxsOworI2VuZGlmIC8qIExXSVBfQ0FMTEJBQ0tfQVBJICovCisjaWYgVENQX0xJU1RFTl9CQUNLTE9HCisgIGxwY2ItPmFjY2VwdHNfcGVuZGluZyA9IDA7CisgIGxwY2ItPmJhY2tsb2cgPSAoYmFja2xvZyA/IGJhY2tsb2cgOiAxKTsKKyNlbmRpZiAvKiBUQ1BfTElTVEVOX0JBQ0tMT0cgKi8KKyAgVENQX1JFRygmdGNwX2xpc3Rlbl9wY2JzLnBjYnMsIChzdHJ1Y3QgdGNwX3BjYiAqKWxwY2IpOworICByZXR1cm4gKHN0cnVjdCB0Y3BfcGNiICopbHBjYjsKK30KKworLyoqIAorICogVXBkYXRlIHRoZSBzdGF0ZSB0aGF0IHRyYWNrcyB0aGUgYXZhaWxhYmxlIHdpbmRvdyBzcGFjZSB0byBhZHZlcnRpc2UuCisgKgorICogUmV0dXJucyBob3cgbXVjaCBleHRyYSB3aW5kb3cgd291bGQgYmUgYWR2ZXJ0aXNlZCBpZiB3ZSBzZW50IGFuCisgKiB1cGRhdGUgbm93LgorICovCit1MzJfdCB0Y3BfdXBkYXRlX3Jjdl9hbm5fd25kKHN0cnVjdCB0Y3BfcGNiICpwY2IpCit7CisgIHUzMl90IG5ld19yaWdodF9lZGdlID0gcGNiLT5yY3Zfbnh0ICsgcGNiLT5yY3Zfd25kOworCisgIGlmIChUQ1BfU0VRX0dFUShuZXdfcmlnaHRfZWRnZSwgcGNiLT5yY3ZfYW5uX3JpZ2h0X2VkZ2UgKyBMV0lQX01JTigoVENQX1dORCAvIDIpLCBwY2ItPm1zcykpKSB7CisgICAgLyogd2UgY2FuIGFkdmVydGlzZSBtb3JlIHdpbmRvdyAqLworICAgIHBjYi0+cmN2X2Fubl93bmQgPSBwY2ItPnJjdl93bmQ7CisgICAgcmV0dXJuIG5ld19yaWdodF9lZGdlIC0gcGNiLT5yY3ZfYW5uX3JpZ2h0X2VkZ2U7CisgIH0gZWxzZSB7CisgICAgaWYgKFRDUF9TRVFfR1QocGNiLT5yY3Zfbnh0LCBwY2ItPnJjdl9hbm5fcmlnaHRfZWRnZSkpIHsKKyAgICAgIC8qIENhbiBoYXBwZW4gZHVlIHRvIG90aGVyIGVuZCBzZW5kaW5nIG91dCBvZiBhZHZlcnRpc2VkIHdpbmRvdywKKyAgICAgICAqIGJ1dCB3aXRoaW4gYWN0dWFsIGF2YWlsYWJsZSAoYnV0IG5vdCB5ZXQgYWR2ZXJ0aXNlZCkgd2luZG93ICovCisgICAgICBwY2ItPnJjdl9hbm5fd25kID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgLyoga2VlcCB0aGUgcmlnaHQgZWRnZSBvZiB3aW5kb3cgY29uc3RhbnQgKi8KKyAgICAgIHUzMl90IG5ld19yY3ZfYW5uX3duZCA9IHBjYi0+cmN2X2Fubl9yaWdodF9lZGdlIC0gcGNiLT5yY3Zfbnh0OworICAgICAgTFdJUF9BU1NFUlQoIm5ld19yY3ZfYW5uX3duZCA8PSAweGZmZmYiLCBuZXdfcmN2X2Fubl93bmQgPD0gMHhmZmZmKTsKKyAgICAgIHBjYi0+cmN2X2Fubl93bmQgPSAodTE2X3QpbmV3X3Jjdl9hbm5fd25kOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgYXBwbGljYXRpb24gd2hlbiBpdCBoYXMKKyAqIHByb2Nlc3NlZCB0aGUgZGF0YS4gVGhlIHB1cnBvc2UgaXMgdG8gYWR2ZXJ0aXNlIGEgbGFyZ2VyIHdpbmRvdworICogd2hlbiB0aGUgZGF0YSBoYXMgYmVlbiBwcm9jZXNzZWQuCisgKgorICogQHBhcmFtIHBjYiB0aGUgdGNwX3BjYiBmb3Igd2hpY2ggZGF0YSBpcyByZWFkCisgKiBAcGFyYW0gbGVuIHRoZSBhbW91bnQgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcmVhZCBieSB0aGUgYXBwbGljYXRpb24KKyAqLwordm9pZAordGNwX3JlY3ZlZChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB1MTZfdCBsZW4pCit7CisgIGludCB3bmRfaW5mbGF0aW9uOworCisgIExXSVBfQVNTRVJUKCJ0Y3BfcmVjdmVkOiBsZW4gd291bGQgd3JhcCByY3Zfd25kXG4iLAorICAgICAgICAgICAgICBsZW4gPD0gMHhmZmZmIC0gcGNiLT5yY3Zfd25kICk7CisKKyAgcGNiLT5yY3Zfd25kICs9IGxlbjsKKyAgaWYgKHBjYi0+cmN2X3duZCA+IFRDUF9XTkQpIHsKKyAgICBwY2ItPnJjdl93bmQgPSBUQ1BfV05EOworICB9CisKKyAgd25kX2luZmxhdGlvbiA9IHRjcF91cGRhdGVfcmN2X2Fubl93bmQocGNiKTsKKworICAvKiBJZiB0aGUgY2hhbmdlIGluIHRoZSByaWdodCBlZGdlIG9mIHdpbmRvdyBpcyBzaWduaWZpY2FudCAoZGVmYXVsdAorICAgKiB3YXRlcm1hcmsgaXMgVENQX1dORC80KSwgdGhlbiBzZW5kIGFuIGV4cGxpY2l0IHVwZGF0ZSBub3cuCisgICAqIE90aGVyd2lzZSB3YWl0IGZvciBhIHBhY2tldCB0byBiZSBzZW50IGluIHRoZSBub3JtYWwgY291cnNlIG9mCisgICAqIGV2ZW50cyAob3IgbW9yZSB3aW5kb3cgdG8gYmUgYXZhaWxhYmxlIGxhdGVyKSAqLworICBpZiAod25kX2luZmxhdGlvbiA+PSBUQ1BfV05EX1VQREFURV9USFJFU0hPTEQpIHsKKyAgICB0Y3BfYWNrX25vdyhwY2IpOworICAgIHRjcF9vdXRwdXQocGNiKTsKKyAgfQorCisgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3BfcmVjdmVkOiByZWN2ZWl2ZWQgJSJVMTZfRiIgYnl0ZXMsIHduZCAlIlUxNl9GIiAoJSJVMTZfRiIpLlxuIiwKKyAgICAgICAgIGxlbiwgcGNiLT5yY3Zfd25kLCBUQ1BfV05EIC0gcGNiLT5yY3Zfd25kKSk7Cit9CisKKy8qKgorICogQSBuYXN0bHkgaGFjayBmZWF0dXJpbmcgJ2dvdG8nIHN0YXRlbWVudHMgdGhhdCBhbGxvY2F0ZXMgYQorICogbmV3IFRDUCBsb2NhbCBwb3J0LgorICoKKyAqIEByZXR1cm4gYSBuZXcgKGZyZWUpIGxvY2FsIFRDUCBwb3J0IG51bWJlcgorICovCitzdGF0aWMgdTE2X3QKK3RjcF9uZXdfcG9ydCh2b2lkKQoreworICBpbnQgaTsKKyAgc3RydWN0IHRjcF9wY2IgKnBjYjsKKyNpZm5kZWYgVENQX0xPQ0FMX1BPUlRfUkFOR0VfU1RBUlQKKy8qIEZyb20gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9wb3J0LW51bWJlcnM6CisgICAiVGhlIER5bmFtaWMgYW5kL29yIFByaXZhdGUgUG9ydHMgYXJlIHRob3NlIGZyb20gNDkxNTIgdGhyb3VnaCA2NTUzNSIgKi8KKyNkZWZpbmUgVENQX0xPQ0FMX1BPUlRfUkFOR0VfU1RBUlQgIDB4YzAwMAorI2RlZmluZSBUQ1BfTE9DQUxfUE9SVF9SQU5HRV9FTkQgICAgMHhmZmZmCisjZW5kaWYKKyAgc3RhdGljIHUxNl90IHBvcnQgPSBUQ1BfTE9DQUxfUE9SVF9SQU5HRV9TVEFSVDsKKyAgCisgYWdhaW46CisgIGlmIChwb3J0KysgPj0gVENQX0xPQ0FMX1BPUlRfUkFOR0VfRU5EKSB7CisgICAgcG9ydCA9IFRDUF9MT0NBTF9QT1JUX1JBTkdFX1NUQVJUOworICB9CisgIC8qIENoZWNrIGFsbCBQQ0IgbGlzdHMuICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fVENQX1BDQl9MSVNUUzsgaSsrKSB7CisgICAgZm9yKHBjYiA9ICp0Y3BfcGNiX2xpc3RzW2ldOyBwY2IgIT0gTlVMTDsgcGNiID0gcGNiLT5uZXh0KSB7CisgICAgICBpZiAocGNiLT5sb2NhbF9wb3J0ID09IHBvcnQpIHsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHBvcnQ7Cit9CisKKy8qKgorICogQ29ubmVjdHMgdG8gYW5vdGhlciBob3N0LiBUaGUgZnVuY3Rpb24gZ2l2ZW4gYXMgdGhlICJjb25uZWN0ZWQiCisgKiBhcmd1bWVudCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICoKKyAqIEBwYXJhbSBwY2IgdGhlIHRjcF9wY2IgdXNlZCB0byBlc3RhYmxpc2ggdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBpcGFkZHIgdGhlIHJlbW90ZSBpcCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8KKyAqIEBwYXJhbSBwb3J0IHRoZSByZW1vdGUgdGNwIHBvcnQgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGNvbm5lY3RlZCBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gY29ubmVjdGVkIChvciBvbiBlcnJvcikKKyAqIEByZXR1cm4gRVJSX1ZBTCBpZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgZ2l2ZW4KKyAqICAgICAgICAgRVJSX09LIGlmIGNvbm5lY3QgcmVxdWVzdCBoYXMgYmVlbiBzZW50CisgKiAgICAgICAgIG90aGVyIGVycl90IHZhbHVlcyBpZiBjb25uZWN0IHJlcXVlc3QgY291bGRuJ3QgYmUgc2VudAorICovCitlcnJfdAordGNwX2Nvbm5lY3Qoc3RydWN0IHRjcF9wY2IgKnBjYiwgaXBfYWRkcl90ICppcGFkZHIsIHUxNl90IHBvcnQsCisgICAgICB0Y3BfY29ubmVjdGVkX2ZuIGNvbm5lY3RlZCkKK3sKKyAgZXJyX3QgcmV0OworICB1MzJfdCBpc3M7CisgIHUxNl90IG9sZF9sb2NhbF9wb3J0OworCisgIExXSVBfRVJST1IoInRjcF9jb25uZWN0OiBjYW4gb25seSBjb25uZWN0IGZyb20gc3RhdGUgQ0xPU0VEIiwgcGNiLT5zdGF0ZSA9PSBDTE9TRUQsIHJldHVybiBFUlJfSVNDT05OKTsKKworICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX2Nvbm5lY3QgdG8gcG9ydCAlIlUxNl9GIlxuIiwgcG9ydCkpOworICBpZiAoaXBhZGRyICE9IE5VTEwpIHsKKyAgICBwY2ItPnJlbW90ZV9pcCA9ICppcGFkZHI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEVSUl9WQUw7CisgIH0KKyAgcGNiLT5yZW1vdGVfcG9ydCA9IHBvcnQ7CisKKyAgLyogY2hlY2sgaWYgd2UgaGF2ZSBhIHJvdXRlIHRvIHRoZSByZW1vdGUgaG9zdCAqLworICBpZiAoaXBfYWRkcl9pc2FueSgmKHBjYi0+bG9jYWxfaXApKSkgeworICAgIC8qIG5vIGxvY2FsIElQIGFkZHJlc3Mgc2V0LCB5ZXQuICovCisgICAgc3RydWN0IG5ldGlmICpuZXRpZiA9IGlwX3JvdXRlKCYocGNiLT5yZW1vdGVfaXApKTsKKyAgICBpZiAobmV0aWYgPT0gTlVMTCkgeworICAgICAgLyogRG9uJ3QgZXZlbiB0cnkgdG8gc2VuZCBhIFNZTiBwYWNrZXQgaWYgd2UgaGF2ZSBubyByb3V0ZQorICAgICAgICAgc2luY2UgdGhhdCB3aWxsIGZhaWwuICovCisgICAgICByZXR1cm4gRVJSX1JURTsKKyAgICB9CisgICAgLyogVXNlIHRoZSBuZXRpZidzIElQIGFkZHJlc3MgYXMgbG9jYWwgYWRkcmVzcy4gKi8KKyAgICBpcF9hZGRyX2NvcHkocGNiLT5sb2NhbF9pcCwgbmV0aWYtPmlwX2FkZHIpOworICB9CisKKyAgb2xkX2xvY2FsX3BvcnQgPSBwY2ItPmxvY2FsX3BvcnQ7CisgIGlmIChwY2ItPmxvY2FsX3BvcnQgPT0gMCkgeworICAgIHBjYi0+bG9jYWxfcG9ydCA9IHRjcF9uZXdfcG9ydCgpOworICB9CisjaWYgU09fUkVVU0UKKyAgaWYgKChwY2ItPnNvX29wdGlvbnMgJiBTT0ZfUkVVU0VBRERSKSAhPSAwKSB7CisgICAgLyogU2luY2UgU09GX1JFVVNFQUREUiBhbGxvd3MgcmV1c2luZyBhIGxvY2FsIGFkZHJlc3MsIHdlIGhhdmUgdG8gbWFrZSBzdXJlCisgICAgICAgbm93IHRoYXQgdGhlIDUtdHVwbGUgaXMgdW5pcXVlLiAqLworICAgIHN0cnVjdCB0Y3BfcGNiICpjcGNiOworICAgIGludCBpOworICAgIC8qIERvbid0IGNoZWNrIGxpc3Rlbi0gYW5kIGJvdW5kLVBDQnMsIGNoZWNrIGFjdGl2ZS0gYW5kIFRJTUUtV0FJVCBQQ0JzLiAqLworICAgIGZvciAoaSA9IDI7IGkgPCBOVU1fVENQX1BDQl9MSVNUUzsgaSsrKSB7CisgICAgICBmb3IoY3BjYiA9ICp0Y3BfcGNiX2xpc3RzW2ldOyBjcGNiICE9IE5VTEw7IGNwY2IgPSBjcGNiLT5uZXh0KSB7CisgICAgICAgIGlmICgoY3BjYi0+bG9jYWxfcG9ydCA9PSBwY2ItPmxvY2FsX3BvcnQpICYmCisgICAgICAgICAgICAoY3BjYi0+cmVtb3RlX3BvcnQgPT0gcG9ydCkgJiYKKyAgICAgICAgICAgIGlwX2FkZHJfY21wKCZjcGNiLT5sb2NhbF9pcCwgJnBjYi0+bG9jYWxfaXApICYmCisgICAgICAgICAgICBpcF9hZGRyX2NtcCgmY3BjYi0+cmVtb3RlX2lwLCBpcGFkZHIpKSB7CisgICAgICAgICAgLyogbGludXggcmV0dXJucyBFSVNDT05OIGhlcmUsIGJ1dCBFUlJfVVNFIHNob3VsZCBiZSBPSyBmb3IgdXMgKi8KKyAgICAgICAgICByZXR1cm4gRVJSX1VTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmIC8qIFNPX1JFVVNFICovCisgIGlzcyA9IHRjcF9uZXh0X2lzcygpOworICBwY2ItPnJjdl9ueHQgPSAwOworICBwY2ItPnNuZF9ueHQgPSBpc3M7CisgIHBjYi0+bGFzdGFjayA9IGlzcyAtIDE7CisgIHBjYi0+c25kX2xiYiA9IGlzcyAtIDE7CisgIHBjYi0+cmN2X3duZCA9IFRDUF9XTkQ7CisgIHBjYi0+cmN2X2Fubl93bmQgPSBUQ1BfV05EOworICBwY2ItPnJjdl9hbm5fcmlnaHRfZWRnZSA9IHBjYi0+cmN2X254dDsKKyAgcGNiLT5zbmRfd25kID0gVENQX1dORDsKKyAgLyogQXMgaW5pdGlhbCBzZW5kIE1TUywgd2UgdXNlIFRDUF9NU1MgYnV0IGxpbWl0IGl0IHRvIDUzNi4KKyAgICAgVGhlIHNlbmQgTVNTIGlzIHVwZGF0ZWQgd2hlbiBhbiBNU1Mgb3B0aW9uIGlzIHJlY2VpdmVkLiAqLworICBwY2ItPm1zcyA9IChUQ1BfTVNTID4gNTM2KSA/IDUzNiA6IFRDUF9NU1M7CisjaWYgVENQX0NBTENVTEFURV9FRkZfU0VORF9NU1MKKyAgcGNiLT5tc3MgPSB0Y3BfZWZmX3NlbmRfbXNzKHBjYi0+bXNzLCBpcGFkZHIpOworI2VuZGlmIC8qIFRDUF9DQUxDVUxBVEVfRUZGX1NFTkRfTVNTICovCisgIHBjYi0+Y3duZCA9IDE7CisgIHBjYi0+c3N0aHJlc2ggPSBwY2ItPm1zcyAqIDEwOworI2lmIExXSVBfQ0FMTEJBQ0tfQVBJCisgIHBjYi0+Y29ubmVjdGVkID0gY29ubmVjdGVkOworI2Vsc2UgLyogTFdJUF9DQUxMQkFDS19BUEkgKi8gIAorICBMV0lQX1VOVVNFRF9BUkcoY29ubmVjdGVkKTsKKyNlbmRpZiAvKiBMV0lQX0NBTExCQUNLX0FQSSAqLworCisgIC8qIFNlbmQgYSBTWU4gdG9nZXRoZXIgd2l0aCB0aGUgTVNTIG9wdGlvbi4gKi8KKyAgcmV0ID0gdGNwX2VucXVldWVfZmxhZ3MocGNiLCBUQ1BfU1lOKTsKKyAgaWYgKHJldCA9PSBFUlJfT0spIHsKKyAgICAvKiBTWU4gc2VnbWVudCB3YXMgZW5xdWV1ZWQsIGNoYW5nZWQgdGhlIHBjYnMgc3RhdGUgbm93ICovCisgICAgcGNiLT5zdGF0ZSA9IFNZTl9TRU5UOworICAgIGlmIChvbGRfbG9jYWxfcG9ydCAhPSAwKSB7CisgICAgICBUQ1BfUk1WKCZ0Y3BfYm91bmRfcGNicywgcGNiKTsKKyAgICB9CisgICAgVENQX1JFRygmdGNwX2FjdGl2ZV9wY2JzLCBwY2IpOworICAgIHNubXBfaW5jX3RjcGFjdGl2ZW9wZW5zKCk7CisKKyAgICB0Y3Bfb3V0cHV0KHBjYik7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBDYWxsZWQgZXZlcnkgNTAwIG1zIGFuZCBpbXBsZW1lbnRzIHRoZSByZXRyYW5zbWlzc2lvbiB0aW1lciBhbmQgdGhlIHRpbWVyIHRoYXQKKyAqIHJlbW92ZXMgUENCcyB0aGF0IGhhdmUgYmVlbiBpbiBUSU1FLVdBSVQgZm9yIGVub3VnaCB0aW1lLiBJdCBhbHNvIGluY3JlbWVudHMKKyAqIHZhcmlvdXMgdGltZXJzIHN1Y2ggYXMgdGhlIGluYWN0aXZpdHkgdGltZXIgaW4gZWFjaCBQQ0IuCisgKgorICogQXV0b21hdGljYWxseSBjYWxsZWQgZnJvbSB0Y3BfdG1yKCkuCisgKi8KK3ZvaWQKK3RjcF9zbG93dG1yKHZvaWQpCit7CisgIHN0cnVjdCB0Y3BfcGNiICpwY2IsICpwcmV2OworICB1MTZfdCBlZmZfd25kOworICB1OF90IHBjYl9yZW1vdmU7ICAgICAgLyogZmxhZyBpZiBhIFBDQiBzaG91bGQgYmUgcmVtb3ZlZCAqLworICB1OF90IHBjYl9yZXNldDsgICAgICAgLyogZmxhZyBpZiBhIFJTVCBzaG91bGQgYmUgc2VudCB3aGVuIHJlbW92aW5nICovCisgIGVycl90IGVycjsKKworICBlcnIgPSBFUlJfT0s7CisKKyAgKyt0Y3BfdGlja3M7CisKKyAgLyogU3RlcHMgdGhyb3VnaCBhbGwgb2YgdGhlIGFjdGl2ZSBQQ0JzLiAqLworICBwcmV2ID0gTlVMTDsKKyAgcGNiID0gdGNwX2FjdGl2ZV9wY2JzOworICBpZiAocGNiID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX3Nsb3d0bXI6IG5vIGFjdGl2ZSBwY2JzXG4iKSk7CisgIH0KKyAgd2hpbGUgKHBjYiAhPSBOVUxMKSB7CisgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9zbG93dG1yOiBwcm9jZXNzaW5nIGFjdGl2ZSBwY2JcbiIpKTsKKyAgICBMV0lQX0FTU0VSVCgidGNwX3Nsb3d0bXI6IGFjdGl2ZSBwY2ItPnN0YXRlICE9IENMT1NFRFxuIiwgcGNiLT5zdGF0ZSAhPSBDTE9TRUQpOworICAgIExXSVBfQVNTRVJUKCJ0Y3Bfc2xvd3RtcjogYWN0aXZlIHBjYi0+c3RhdGUgIT0gTElTVEVOXG4iLCBwY2ItPnN0YXRlICE9IExJU1RFTik7CisgICAgTFdJUF9BU1NFUlQoInRjcF9zbG93dG1yOiBhY3RpdmUgcGNiLT5zdGF0ZSAhPSBUSU1FLVdBSVRcbiIsIHBjYi0+c3RhdGUgIT0gVElNRV9XQUlUKTsKKworICAgIHBjYl9yZW1vdmUgPSAwOworICAgIHBjYl9yZXNldCA9IDA7CisKKyAgICBpZiAocGNiLT5zdGF0ZSA9PSBTWU5fU0VOVCAmJiBwY2ItPm5ydHggPT0gVENQX1NZTk1BWFJUWCkgeworICAgICAgKytwY2JfcmVtb3ZlOworICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9zbG93dG1yOiBtYXggU1lOIHJldHJpZXMgcmVhY2hlZFxuIikpOworICAgIH0KKyAgICBlbHNlIGlmIChwY2ItPm5ydHggPT0gVENQX01BWFJUWCkgeworICAgICAgKytwY2JfcmVtb3ZlOworICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9zbG93dG1yOiBtYXggREFUQSByZXRyaWVzIHJlYWNoZWRcbiIpKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHBjYi0+cGVyc2lzdF9iYWNrb2ZmID4gMCkgeworICAgICAgICAvKiBJZiBzbmRfd25kIGlzIHplcm8sIHVzZSBwZXJzaXN0IHRpbWVyIHRvIHNlbmQgMSBieXRlIHByb2JlcworICAgICAgICAgKiBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBzdGFuZGFyZCByZXRyYW5zbWlzc2lvbiBtZWNoYW5pc20uICovCisgICAgICAgIHBjYi0+cGVyc2lzdF9jbnQrKzsKKyAgICAgICAgaWYgKHBjYi0+cGVyc2lzdF9jbnQgPj0gdGNwX3BlcnNpc3RfYmFja29mZltwY2ItPnBlcnNpc3RfYmFja29mZi0xXSkgeworICAgICAgICAgIHBjYi0+cGVyc2lzdF9jbnQgPSAwOworICAgICAgICAgIGlmIChwY2ItPnBlcnNpc3RfYmFja29mZiA8IHNpemVvZih0Y3BfcGVyc2lzdF9iYWNrb2ZmKSkgeworICAgICAgICAgICAgcGNiLT5wZXJzaXN0X2JhY2tvZmYrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgdGNwX3plcm9fd2luZG93X3Byb2JlKHBjYik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEluY3JlYXNlIHRoZSByZXRyYW5zbWlzc2lvbiB0aW1lciBpZiBpdCBpcyBydW5uaW5nICovCisgICAgICAgIGlmKHBjYi0+cnRpbWUgPj0gMCkKKyAgICAgICAgICArK3BjYi0+cnRpbWU7CisKKyAgICAgICAgaWYgKHBjYi0+dW5hY2tlZCAhPSBOVUxMICYmIHBjYi0+cnRpbWUgPj0gcGNiLT5ydG8pIHsKKyAgICAgICAgICAvKiBUaW1lIGZvciBhIHJldHJhbnNtaXNzaW9uLiAqLworICAgICAgICAgIExXSVBfREVCVUdGKFRDUF9SVE9fREVCVUcsICgidGNwX3Nsb3d0bXI6IHJ0aW1lICUiUzE2X0YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwY2ItPnJ0byAlIlMxNl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNiLT5ydGltZSwgcGNiLT5ydG8pKTsKKworICAgICAgICAgIC8qIERvdWJsZSByZXRyYW5zbWlzc2lvbiB0aW1lLW91dCB1bmxlc3Mgd2UgYXJlIHRyeWluZyB0bworICAgICAgICAgICAqIGNvbm5lY3QgdG8gc29tZWJvZHkgKGkuZS4sIHdlIGFyZSBpbiBTWU5fU0VOVCkuICovCisgICAgICAgICAgaWYgKHBjYi0+c3RhdGUgIT0gU1lOX1NFTlQpIHsKKyAgICAgICAgICAgIHBjYi0+cnRvID0gKChwY2ItPnNhID4+IDMpICsgcGNiLT5zdikgPDwgdGNwX2JhY2tvZmZbcGNiLT5ucnR4XTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBSZXNldCB0aGUgcmV0cmFuc21pc3Npb24gdGltZXIuICovCisgICAgICAgICAgcGNiLT5ydGltZSA9IDA7CisKKyAgICAgICAgICAvKiBSZWR1Y2UgY29uZ2VzdGlvbiB3aW5kb3cgYW5kIHNzdGhyZXNoLiAqLworICAgICAgICAgIGVmZl93bmQgPSBMV0lQX01JTihwY2ItPmN3bmQsIHBjYi0+c25kX3duZCk7CisgICAgICAgICAgcGNiLT5zc3RocmVzaCA9IGVmZl93bmQgPj4gMTsKKyAgICAgICAgICBpZiAocGNiLT5zc3RocmVzaCA8IChwY2ItPm1zcyA8PCAxKSkgeworICAgICAgICAgICAgcGNiLT5zc3RocmVzaCA9IChwY2ItPm1zcyA8PCAxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcGNiLT5jd25kID0gcGNiLT5tc3M7CisgICAgICAgICAgTFdJUF9ERUJVR0YoVENQX0NXTkRfREVCVUcsICgidGNwX3Nsb3d0bXI6IGN3bmQgJSJVMTZfRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzc3RocmVzaCAlIlUxNl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjYi0+Y3duZCwgcGNiLT5zc3RocmVzaCkpOworIAorICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgbmVlZHMgdG8gYmUgY2FsbGVkIEFGVEVSIGN3bmQgaXMgc2V0IHRvIG9uZQorICAgICAgICAgICAgIG1zcyAtIFNUSiAqLworICAgICAgICAgIHRjcF9yZXhtaXRfcnRvKHBjYik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogQ2hlY2sgaWYgdGhpcyBQQ0IgaGFzIHN0YXllZCB0b28gbG9uZyBpbiBGSU4tV0FJVC0yICovCisgICAgaWYgKHBjYi0+c3RhdGUgPT0gRklOX1dBSVRfMikgeworICAgICAgaWYgKCh1MzJfdCkodGNwX3RpY2tzIC0gcGNiLT50bXIpID4KKyAgICAgICAgICBUQ1BfRklOX1dBSVRfVElNRU9VVCAvIFRDUF9TTE9XX0lOVEVSVkFMKSB7CisgICAgICAgICsrcGNiX3JlbW92ZTsKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9zbG93dG1yOiByZW1vdmluZyBwY2Igc3R1Y2sgaW4gRklOLVdBSVQtMlxuIikpOworICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIGlmIEtFRVBBTElWRSBzaG91bGQgYmUgc2VudCAqLworICAgIGlmKChwY2ItPnNvX29wdGlvbnMgJiBTT0ZfS0VFUEFMSVZFKSAmJgorICAgICAgICgocGNiLT5zdGF0ZSA9PSBFU1RBQkxJU0hFRCkgfHwKKyAgICAgICAgKHBjYi0+c3RhdGUgPT0gQ0xPU0VfV0FJVCkpKSB7CisjaWYgTFdJUF9UQ1BfS0VFUEFMSVZFCisgICAgICBpZigodTMyX3QpKHRjcF90aWNrcyAtIHBjYi0+dG1yKSA+CisgICAgICAgICAocGNiLT5rZWVwX2lkbGUgKyAocGNiLT5rZWVwX2NudCpwY2ItPmtlZXBfaW50dmwpKQorICAgICAgICAgLyBUQ1BfU0xPV19JTlRFUlZBTCkKKyNlbHNlICAgICAgCisgICAgICBpZigodTMyX3QpKHRjcF90aWNrcyAtIHBjYi0+dG1yKSA+CisgICAgICAgICAocGNiLT5rZWVwX2lkbGUgKyBUQ1BfTUFYSURMRSkgLyBUQ1BfU0xPV19JTlRFUlZBTCkKKyNlbmRpZiAvKiBMV0lQX1RDUF9LRUVQQUxJVkUgKi8KKyAgICAgIHsKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9zbG93dG1yOiBLRUVQQUxJVkUgdGltZW91dC4gQWJvcnRpbmcgY29ubmVjdGlvbiB0byAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNF9hZGRyMV8xNigmcGNiLT5yZW1vdGVfaXApLCBpcDRfYWRkcjJfMTYoJnBjYi0+cmVtb3RlX2lwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXA0X2FkZHIzXzE2KCZwY2ItPnJlbW90ZV9pcCksIGlwNF9hZGRyNF8xNigmcGNiLT5yZW1vdGVfaXApKSk7CisgICAgICAgIAorICAgICAgICArK3BjYl9yZW1vdmU7CisgICAgICAgICsrcGNiX3Jlc2V0OworICAgICAgfQorI2lmIExXSVBfVENQX0tFRVBBTElWRQorICAgICAgZWxzZSBpZigodTMyX3QpKHRjcF90aWNrcyAtIHBjYi0+dG1yKSA+IAorICAgICAgICAgICAgICAocGNiLT5rZWVwX2lkbGUgKyBwY2ItPmtlZXBfY250X3NlbnQgKiBwY2ItPmtlZXBfaW50dmwpCisgICAgICAgICAgICAgIC8gVENQX1NMT1dfSU5URVJWQUwpCisjZWxzZQorICAgICAgZWxzZSBpZigodTMyX3QpKHRjcF90aWNrcyAtIHBjYi0+dG1yKSA+IAorICAgICAgICAgICAgICAocGNiLT5rZWVwX2lkbGUgKyBwY2ItPmtlZXBfY250X3NlbnQgKiBUQ1BfS0VFUElOVFZMX0RFRkFVTFQpIAorICAgICAgICAgICAgICAvIFRDUF9TTE9XX0lOVEVSVkFMKQorI2VuZGlmIC8qIExXSVBfVENQX0tFRVBBTElWRSAqLworICAgICAgeworICAgICAgICB0Y3Bfa2VlcGFsaXZlKHBjYik7CisgICAgICAgIHBjYi0+a2VlcF9jbnRfc2VudCsrOworICAgICAgfQorICAgIH0KKworICAgIC8qIElmIHRoaXMgUENCIGhhcyBxdWV1ZWQgb3V0IG9mIHNlcXVlbmNlIGRhdGEsIGJ1dCBoYXMgYmVlbgorICAgICAgIGluYWN0aXZlIGZvciB0b28gbG9uZywgd2lsbCBkcm9wIHRoZSBkYXRhIChpdCB3aWxsIGV2ZW50dWFsbHkKKyAgICAgICBiZSByZXRyYW5zbWl0dGVkKS4gKi8KKyNpZiBUQ1BfUVVFVUVfT09TRVEKKyAgICBpZiAocGNiLT5vb3NlcSAhPSBOVUxMICYmCisgICAgICAgICh1MzJfdCl0Y3BfdGlja3MgLSBwY2ItPnRtciA+PSBwY2ItPnJ0byAqIFRDUF9PT1NFUV9USU1FT1VUKSB7CisgICAgICB0Y3Bfc2Vnc19mcmVlKHBjYi0+b29zZXEpOworICAgICAgcGNiLT5vb3NlcSA9IE5VTEw7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfQ1dORF9ERUJVRywgKCJ0Y3Bfc2xvd3RtcjogZHJvcHBpbmcgT09TRVEgcXVldWVkIGRhdGFcbiIpKTsKKyAgICB9CisjZW5kaWYgLyogVENQX1FVRVVFX09PU0VRICovCisKKyAgICAvKiBDaGVjayBpZiB0aGlzIFBDQiBoYXMgc3RheWVkIHRvbyBsb25nIGluIFNZTi1SQ1ZEICovCisgICAgaWYgKHBjYi0+c3RhdGUgPT0gU1lOX1JDVkQpIHsKKyAgICAgIGlmICgodTMyX3QpKHRjcF90aWNrcyAtIHBjYi0+dG1yKSA+CisgICAgICAgICAgVENQX1NZTl9SQ1ZEX1RJTUVPVVQgLyBUQ1BfU0xPV19JTlRFUlZBTCkgeworICAgICAgICArK3BjYl9yZW1vdmU7CisgICAgICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3Bfc2xvd3RtcjogcmVtb3ZpbmcgcGNiIHN0dWNrIGluIFNZTi1SQ1ZEXG4iKSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhpcyBQQ0IgaGFzIHN0YXllZCB0b28gbG9uZyBpbiBMQVNULUFDSyAqLworICAgIGlmIChwY2ItPnN0YXRlID09IExBU1RfQUNLKSB7CisgICAgICBpZiAoKHUzMl90KSh0Y3BfdGlja3MgLSBwY2ItPnRtcikgPiAyICogVENQX01TTCAvIFRDUF9TTE9XX0lOVEVSVkFMKSB7CisgICAgICAgICsrcGNiX3JlbW92ZTsKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9zbG93dG1yOiByZW1vdmluZyBwY2Igc3R1Y2sgaW4gTEFTVC1BQ0tcbiIpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB0aGUgUENCIHNob3VsZCBiZSByZW1vdmVkLCBkbyBpdC4gKi8KKyAgICBpZiAocGNiX3JlbW92ZSkgeworICAgICAgc3RydWN0IHRjcF9wY2IgKnBjYjI7CisgICAgICB0Y3BfcGNiX3B1cmdlKHBjYik7CisgICAgICAvKiBSZW1vdmUgUENCIGZyb20gdGNwX2FjdGl2ZV9wY2JzIGxpc3QuICovCisgICAgICBpZiAocHJldiAhPSBOVUxMKSB7CisgICAgICAgIExXSVBfQVNTRVJUKCJ0Y3Bfc2xvd3RtcjogbWlkZGxlIHRjcCAhPSB0Y3BfYWN0aXZlX3BjYnMiLCBwY2IgIT0gdGNwX2FjdGl2ZV9wY2JzKTsKKyAgICAgICAgcHJldi0+bmV4dCA9IHBjYi0+bmV4dDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoaXMgUENCIHdhcyB0aGUgZmlyc3QuICovCisgICAgICAgIExXSVBfQVNTRVJUKCJ0Y3Bfc2xvd3RtcjogZmlyc3QgcGNiID09IHRjcF9hY3RpdmVfcGNicyIsIHRjcF9hY3RpdmVfcGNicyA9PSBwY2IpOworICAgICAgICB0Y3BfYWN0aXZlX3BjYnMgPSBwY2ItPm5leHQ7CisgICAgICB9CisKKyAgICAgIFRDUF9FVkVOVF9FUlIocGNiLT5lcnJmLCBwY2ItPmNhbGxiYWNrX2FyZywgRVJSX0FCUlQpOworICAgICAgaWYgKHBjYl9yZXNldCkgeworICAgICAgICB0Y3BfcnN0KHBjYi0+c25kX254dCwgcGNiLT5yY3Zfbnh0LCAmcGNiLT5sb2NhbF9pcCwgJnBjYi0+cmVtb3RlX2lwLAorICAgICAgICAgIHBjYi0+bG9jYWxfcG9ydCwgcGNiLT5yZW1vdGVfcG9ydCk7CisgICAgICB9CisKKyAgICAgIHBjYjIgPSBwY2I7CisgICAgICBwY2IgPSBwY2ItPm5leHQ7CisgICAgICBtZW1wX2ZyZWUoTUVNUF9UQ1BfUENCLCBwY2IyKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogZ2V0IHRoZSAnbmV4dCcgZWxlbWVudCBub3cgYW5kIHdvcmsgd2l0aCAncHJldicgYmVsb3cgKGluIGNhc2Ugb2YgYWJvcnQpICovCisgICAgICBwcmV2ID0gcGNiOworICAgICAgcGNiID0gcGNiLT5uZXh0OworCisgICAgICAvKiBXZSBjaGVjayBpZiB3ZSBzaG91bGQgcG9sbCB0aGUgY29ubmVjdGlvbi4gKi8KKyAgICAgICsrcHJldi0+cG9sbHRtcjsKKyAgICAgIGlmIChwcmV2LT5wb2xsdG1yID49IHByZXYtPnBvbGxpbnRlcnZhbCkgeworICAgICAgICBwcmV2LT5wb2xsdG1yID0gMDsKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9zbG93dG1yOiBwb2xsaW5nIGFwcGxpY2F0aW9uXG4iKSk7CisgICAgICAgIFRDUF9FVkVOVF9QT0xMKHByZXYsIGVycik7CisgICAgICAgIC8qIGlmIGVyciA9PSBFUlJfQUJSVCwgJ3ByZXYnIGlzIGFscmVhZHkgZGVhbGxvY2F0ZWQgKi8KKyAgICAgICAgaWYgKGVyciA9PSBFUlJfT0spIHsKKyAgICAgICAgICB0Y3Bfb3V0cHV0KHByZXYpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgCisgIC8qIFN0ZXBzIHRocm91Z2ggYWxsIG9mIHRoZSBUSU1FLVdBSVQgUENCcy4gKi8KKyAgcHJldiA9IE5VTEw7CisgIHBjYiA9IHRjcF90d19wY2JzOworICB3aGlsZSAocGNiICE9IE5VTEwpIHsKKyAgICBMV0lQX0FTU0VSVCgidGNwX3Nsb3d0bXI6IFRJTUUtV0FJVCBwY2ItPnN0YXRlID09IFRJTUUtV0FJVCIsIHBjYi0+c3RhdGUgPT0gVElNRV9XQUlUKTsKKyAgICBwY2JfcmVtb3ZlID0gMDsKKworICAgIC8qIENoZWNrIGlmIHRoaXMgUENCIGhhcyBzdGF5ZWQgbG9uZyBlbm91Z2ggaW4gVElNRS1XQUlUICovCisgICAgaWYgKCh1MzJfdCkodGNwX3RpY2tzIC0gcGNiLT50bXIpID4gMiAqIFRDUF9NU0wgLyBUQ1BfU0xPV19JTlRFUlZBTCkgeworICAgICAgKytwY2JfcmVtb3ZlOworICAgIH0KKyAgICAKKworCisgICAgLyogSWYgdGhlIFBDQiBzaG91bGQgYmUgcmVtb3ZlZCwgZG8gaXQuICovCisgICAgaWYgKHBjYl9yZW1vdmUpIHsKKyAgICAgIHN0cnVjdCB0Y3BfcGNiICpwY2IyOworICAgICAgdGNwX3BjYl9wdXJnZShwY2IpOworICAgICAgLyogUmVtb3ZlIFBDQiBmcm9tIHRjcF90d19wY2JzIGxpc3QuICovCisgICAgICBpZiAocHJldiAhPSBOVUxMKSB7CisgICAgICAgIExXSVBfQVNTRVJUKCJ0Y3Bfc2xvd3RtcjogbWlkZGxlIHRjcCAhPSB0Y3BfdHdfcGNicyIsIHBjYiAhPSB0Y3BfdHdfcGNicyk7CisgICAgICAgIHByZXYtPm5leHQgPSBwY2ItPm5leHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGlzIFBDQiB3YXMgdGhlIGZpcnN0LiAqLworICAgICAgICBMV0lQX0FTU0VSVCgidGNwX3Nsb3d0bXI6IGZpcnN0IHBjYiA9PSB0Y3BfdHdfcGNicyIsIHRjcF90d19wY2JzID09IHBjYik7CisgICAgICAgIHRjcF90d19wY2JzID0gcGNiLT5uZXh0OworICAgICAgfQorICAgICAgcGNiMiA9IHBjYjsKKyAgICAgIHBjYiA9IHBjYi0+bmV4dDsKKyAgICAgIG1lbXBfZnJlZShNRU1QX1RDUF9QQ0IsIHBjYjIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmV2ID0gcGNiOworICAgICAgcGNiID0gcGNiLT5uZXh0OworICAgIH0KKyAgfQorfQorCisvKioKKyAqIElzIGNhbGxlZCBldmVyeSBUQ1BfRkFTVF9JTlRFUlZBTCAoMjUwIG1zKSBhbmQgcHJvY2VzcyBkYXRhIHByZXZpb3VzbHkKKyAqICJyZWZ1c2VkIiBieSB1cHBlciBsYXllciAoYXBwbGljYXRpb24pIGFuZCBzZW5kcyBkZWxheWVkIEFDS3MuCisgKgorICogQXV0b21hdGljYWxseSBjYWxsZWQgZnJvbSB0Y3BfdG1yKCkuCisgKi8KK3ZvaWQKK3RjcF9mYXN0dG1yKHZvaWQpCit7CisgIHN0cnVjdCB0Y3BfcGNiICpwY2IgPSB0Y3BfYWN0aXZlX3BjYnM7CisKKyAgd2hpbGUocGNiICE9IE5VTEwpIHsKKyAgICBzdHJ1Y3QgdGNwX3BjYiAqbmV4dCA9IHBjYi0+bmV4dDsKKyAgICAvKiBJZiB0aGVyZSBpcyBkYXRhIHdoaWNoIHdhcyBwcmV2aW91c2x5ICJyZWZ1c2VkIiBieSB1cHBlciBsYXllciAqLworICAgIGlmIChwY2ItPnJlZnVzZWRfZGF0YSAhPSBOVUxMKSB7CisgICAgICAvKiBOb3RpZnkgYWdhaW4gYXBwbGljYXRpb24gd2l0aCBkYXRhIHByZXZpb3VzbHkgcmVjZWl2ZWQuICovCisgICAgICBlcnJfdCBlcnI7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX2Zhc3R0bXI6IG5vdGlmeSBrZXB0IHBhY2tldFxuIikpOworICAgICAgVENQX0VWRU5UX1JFQ1YocGNiLCBwY2ItPnJlZnVzZWRfZGF0YSwgRVJSX09LLCBlcnIpOworICAgICAgaWYgKGVyciA9PSBFUlJfT0spIHsKKyAgICAgICAgcGNiLT5yZWZ1c2VkX2RhdGEgPSBOVUxMOworICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJSX0FCUlQpIHsKKyAgICAgICAgLyogaWYgZXJyID09IEVSUl9BQlJULCAncGNiJyBpcyBhbHJlYWR5IGRlYWxsb2NhdGVkICovCisgICAgICAgIHBjYiA9IE5VTEw7CisgICAgICB9CisgICAgfQorCisgICAgLyogc2VuZCBkZWxheWVkIEFDS3MgKi8KKyAgICBpZiAocGNiICYmIChwY2ItPmZsYWdzICYgVEZfQUNLX0RFTEFZKSkgeworICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9mYXN0dG1yOiBkZWxheWVkIEFDS1xuIikpOworICAgICAgdGNwX2Fja19ub3cocGNiKTsKKyAgICAgIHRjcF9vdXRwdXQocGNiKTsKKyAgICAgIHBjYi0+ZmxhZ3MgJj0gfihURl9BQ0tfREVMQVkgfCBURl9BQ0tfTk9XKTsKKyAgICB9CisKKyAgICBwY2IgPSBuZXh0OworICB9Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYSBsaXN0IG9mIFRDUCBzZWdtZW50cyAodGNwX3NlZyBzdHJ1Y3R1cmVzKS4KKyAqCisgKiBAcGFyYW0gc2VnIHRjcF9zZWcgbGlzdCBvZiBUQ1Agc2VnbWVudHMgdG8gZnJlZQorICovCit2b2lkCit0Y3Bfc2Vnc19mcmVlKHN0cnVjdCB0Y3Bfc2VnICpzZWcpCit7CisgIHdoaWxlIChzZWcgIT0gTlVMTCkgeworICAgIHN0cnVjdCB0Y3Bfc2VnICpuZXh0ID0gc2VnLT5uZXh0OworICAgIHRjcF9zZWdfZnJlZShzZWcpOworICAgIHNlZyA9IG5leHQ7CisgIH0KK30KKworLyoqCisgKiBGcmVlcyBhIFRDUCBzZWdtZW50ICh0Y3Bfc2VnIHN0cnVjdHVyZSkuCisgKgorICogQHBhcmFtIHNlZyBzaW5nbGUgdGNwX3NlZyB0byBmcmVlCisgKi8KK3ZvaWQKK3RjcF9zZWdfZnJlZShzdHJ1Y3QgdGNwX3NlZyAqc2VnKQoreworICBpZiAoc2VnICE9IE5VTEwpIHsKKyAgICBpZiAoc2VnLT5wICE9IE5VTEwpIHsKKyAgICAgIHBidWZfZnJlZShzZWctPnApOworI2lmIFRDUF9ERUJVRworICAgICAgc2VnLT5wID0gTlVMTDsKKyNlbmRpZiAvKiBUQ1BfREVCVUcgKi8KKyAgICB9CisgICAgbWVtcF9mcmVlKE1FTVBfVENQX1NFRywgc2VnKTsKKyAgfQorfQorCisvKioKKyAqIFNldHMgdGhlIHByaW9yaXR5IG9mIGEgY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB0Y3BfcGNiIHRvIG1hbmlwdWxhdGUKKyAqIEBwYXJhbSBwcmlvIG5ldyBwcmlvcml0eQorICovCit2b2lkCit0Y3Bfc2V0cHJpbyhzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB1OF90IHByaW8pCit7CisgIHBjYi0+cHJpbyA9IHByaW87Cit9CisKKyNpZiBUQ1BfUVVFVUVfT09TRVEKKy8qKgorICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGdpdmVuIFRDUCBzZWdtZW50LgorICogVGhlIHBidWYgYW5kIGRhdGEgYXJlIG5vdCBjb3BpZWQsIG9ubHkgdGhlIHBvaW50ZXJzCisgKgorICogQHBhcmFtIHNlZyB0aGUgb2xkIHRjcF9zZWcKKyAqIEByZXR1cm4gYSBjb3B5IG9mIHNlZworICovIAorc3RydWN0IHRjcF9zZWcgKgordGNwX3NlZ19jb3B5KHN0cnVjdCB0Y3Bfc2VnICpzZWcpCit7CisgIHN0cnVjdCB0Y3Bfc2VnICpjc2VnOworCisgIGNzZWcgPSAoc3RydWN0IHRjcF9zZWcgKiltZW1wX21hbGxvYyhNRU1QX1RDUF9TRUcpOworICBpZiAoY3NlZyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgU01FTUNQWSgodThfdCAqKWNzZWcsIChjb25zdCB1OF90ICopc2VnLCBzaXplb2Yoc3RydWN0IHRjcF9zZWcpKTsgCisgIHBidWZfcmVmKGNzZWctPnApOworICByZXR1cm4gY3NlZzsKK30KKyNlbmRpZiAvKiBUQ1BfUVVFVUVfT09TRVEgKi8KKworI2lmIExXSVBfQ0FMTEJBQ0tfQVBJCisvKioKKyAqIERlZmF1bHQgcmVjZWl2ZSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiB0aGUgdXNlciBkaWRuJ3QgcmVnaXN0ZXIKKyAqIGEgcmVjdiBjYWxsYmFjayBmb3IgdGhlIHBjYi4KKyAqLworZXJyX3QKK3RjcF9yZWN2X251bGwodm9pZCAqYXJnLCBzdHJ1Y3QgdGNwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwgZXJyX3QgZXJyKQoreworICBMV0lQX1VOVVNFRF9BUkcoYXJnKTsKKyAgaWYgKHAgIT0gTlVMTCkgeworICAgIHRjcF9yZWN2ZWQocGNiLCBwLT50b3RfbGVuKTsKKyAgICBwYnVmX2ZyZWUocCk7CisgIH0gZWxzZSBpZiAoZXJyID09IEVSUl9PSykgeworICAgIHJldHVybiB0Y3BfY2xvc2UocGNiKTsKKyAgfQorICByZXR1cm4gRVJSX09LOworfQorI2VuZGlmIC8qIExXSVBfQ0FMTEJBQ0tfQVBJICovCisKKy8qKgorICogS2lsbHMgdGhlIG9sZGVzdCBhY3RpdmUgY29ubmVjdGlvbiB0aGF0IGhhcyBsb3dlciBwcmlvcml0eSB0aGFuIHByaW8uCisgKgorICogQHBhcmFtIHByaW8gbWluaW11bSBwcmlvcml0eQorICovCitzdGF0aWMgdm9pZAordGNwX2tpbGxfcHJpbyh1OF90IHByaW8pCit7CisgIHN0cnVjdCB0Y3BfcGNiICpwY2IsICppbmFjdGl2ZTsKKyAgdTMyX3QgaW5hY3Rpdml0eTsKKyAgdThfdCBtcHJpbzsKKworCisgIG1wcmlvID0gVENQX1BSSU9fTUFYOworICAKKyAgLyogV2Uga2lsbCB0aGUgb2xkZXN0IGFjdGl2ZSBjb25uZWN0aW9uIHRoYXQgaGFzIGxvd2VyIHByaW9yaXR5IHRoYW4gcHJpby4gKi8KKyAgaW5hY3Rpdml0eSA9IDA7CisgIGluYWN0aXZlID0gTlVMTDsKKyAgZm9yKHBjYiA9IHRjcF9hY3RpdmVfcGNiczsgcGNiICE9IE5VTEw7IHBjYiA9IHBjYi0+bmV4dCkgeworICAgIGlmIChwY2ItPnByaW8gPD0gcHJpbyAmJgorICAgICAgIHBjYi0+cHJpbyA8PSBtcHJpbyAmJgorICAgICAgICh1MzJfdCkodGNwX3RpY2tzIC0gcGNiLT50bXIpID49IGluYWN0aXZpdHkpIHsKKyAgICAgIGluYWN0aXZpdHkgPSB0Y3BfdGlja3MgLSBwY2ItPnRtcjsKKyAgICAgIGluYWN0aXZlID0gcGNiOworICAgICAgbXByaW8gPSBwY2ItPnByaW87CisgICAgfQorICB9CisgIGlmIChpbmFjdGl2ZSAhPSBOVUxMKSB7CisgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9raWxsX3ByaW86IGtpbGxpbmcgb2xkZXN0IFBDQiAlcCAoJSJTMzJfRiIpXG4iLAorICAgICAgICAgICAodm9pZCAqKWluYWN0aXZlLCBpbmFjdGl2aXR5KSk7CisgICAgdGNwX2Fib3J0KGluYWN0aXZlKTsKKyAgfQorfQorCisvKioKKyAqIEtpbGxzIHRoZSBvbGRlc3QgY29ubmVjdGlvbiB0aGF0IGlzIGluIFRJTUVfV0FJVCBzdGF0ZS4KKyAqIENhbGxlZCBmcm9tIHRjcF9hbGxvYygpIGlmIG5vIG1vcmUgY29ubmVjdGlvbnMgYXJlIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIHZvaWQKK3RjcF9raWxsX3RpbWV3YWl0KHZvaWQpCit7CisgIHN0cnVjdCB0Y3BfcGNiICpwY2IsICppbmFjdGl2ZTsKKyAgdTMyX3QgaW5hY3Rpdml0eTsKKworICBpbmFjdGl2aXR5ID0gMDsKKyAgaW5hY3RpdmUgPSBOVUxMOworICAvKiBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIFRJTUVfV0FJVCBwY2JzIGFuZCBnZXQgdGhlIG9sZGVzdCBwY2IuICovCisgIGZvcihwY2IgPSB0Y3BfdHdfcGNiczsgcGNiICE9IE5VTEw7IHBjYiA9IHBjYi0+bmV4dCkgeworICAgIGlmICgodTMyX3QpKHRjcF90aWNrcyAtIHBjYi0+dG1yKSA+PSBpbmFjdGl2aXR5KSB7CisgICAgICBpbmFjdGl2aXR5ID0gdGNwX3RpY2tzIC0gcGNiLT50bXI7CisgICAgICBpbmFjdGl2ZSA9IHBjYjsKKyAgICB9CisgIH0KKyAgaWYgKGluYWN0aXZlICE9IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX2tpbGxfdGltZXdhaXQ6IGtpbGxpbmcgb2xkZXN0IFRJTUUtV0FJVCBQQ0IgJXAgKCUiUzMyX0YiKVxuIiwKKyAgICAgICAgICAgKHZvaWQgKilpbmFjdGl2ZSwgaW5hY3Rpdml0eSkpOworICAgIHRjcF9hYm9ydChpbmFjdGl2ZSk7CisgIH0KK30KKworLyoqCisgKiBBbGxvY2F0ZSBhIG5ldyB0Y3BfcGNiIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gcHJpbyBwcmlvcml0eSBmb3IgdGhlIG5ldyBwY2IKKyAqIEByZXR1cm4gYSBuZXcgdGNwX3BjYiB0aGF0IGluaXRpYWxseSBpcyBpbiBzdGF0ZSBDTE9TRUQKKyAqLworc3RydWN0IHRjcF9wY2IgKgordGNwX2FsbG9jKHU4X3QgcHJpbykKK3sKKyAgc3RydWN0IHRjcF9wY2IgKnBjYjsKKyAgdTMyX3QgaXNzOworICAKKyAgcGNiID0gKHN0cnVjdCB0Y3BfcGNiICopbWVtcF9tYWxsb2MoTUVNUF9UQ1BfUENCKTsKKyAgaWYgKHBjYiA9PSBOVUxMKSB7CisgICAgLyogVHJ5IGtpbGxpbmcgb2xkZXN0IGNvbm5lY3Rpb24gaW4gVElNRS1XQUlULiAqLworICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3BfYWxsb2M6IGtpbGxpbmcgb2ZmIG9sZGVzdCBUSU1FLVdBSVQgY29ubmVjdGlvblxuIikpOworICAgIHRjcF9raWxsX3RpbWV3YWl0KCk7CisgICAgLyogVHJ5IHRvIGFsbG9jYXRlIGEgdGNwX3BjYiBhZ2Fpbi4gKi8KKyAgICBwY2IgPSAoc3RydWN0IHRjcF9wY2IgKiltZW1wX21hbGxvYyhNRU1QX1RDUF9QQ0IpOworICAgIGlmIChwY2IgPT0gTlVMTCkgeworICAgICAgLyogVHJ5IGtpbGxpbmcgYWN0aXZlIGNvbm5lY3Rpb25zIHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgbmV3IG9uZS4gKi8KKyAgICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3BfYWxsb2M6IGtpbGxpbmcgY29ubmVjdGlvbiB3aXRoIHByaW8gbG93ZXIgdGhhbiAlZFxuIiwgcHJpbykpOworICAgICAgdGNwX2tpbGxfcHJpbyhwcmlvKTsKKyAgICAgIC8qIFRyeSB0byBhbGxvY2F0ZSBhIHRjcF9wY2IgYWdhaW4uICovCisgICAgICBwY2IgPSAoc3RydWN0IHRjcF9wY2IgKiltZW1wX21hbGxvYyhNRU1QX1RDUF9QQ0IpOworICAgICAgaWYgKHBjYiAhPSBOVUxMKSB7CisgICAgICAgIC8qIGFkanVzdCBlcnIgc3RhdHM6IG1lbXBfbWFsbG9jIGZhaWxlZCB0d2ljZSBiZWZvcmUgKi8KKyAgICAgICAgTUVNUF9TVEFUU19ERUMoZXJyLCBNRU1QX1RDUF9QQ0IpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocGNiICE9IE5VTEwpIHsKKyAgICAgIC8qIGFkanVzdCBlcnIgc3RhdHM6IHRpbWV3YWl0IFBDQiB3YXMgZnJlZWQgYWJvdmUgKi8KKyAgICAgIE1FTVBfU1RBVFNfREVDKGVyciwgTUVNUF9UQ1BfUENCKTsKKyAgICB9CisgIH0KKyAgaWYgKHBjYiAhPSBOVUxMKSB7CisgICAgbWVtc2V0KHBjYiwgMCwgc2l6ZW9mKHN0cnVjdCB0Y3BfcGNiKSk7CisgICAgcGNiLT5wcmlvID0gcHJpbzsKKyAgICBwY2ItPnNuZF9idWYgPSBUQ1BfU05EX0JVRjsKKyAgICBwY2ItPnNuZF9xdWV1ZWxlbiA9IDA7CisgICAgcGNiLT5yY3Zfd25kID0gVENQX1dORDsKKyAgICBwY2ItPnJjdl9hbm5fd25kID0gVENQX1dORDsKKyAgICBwY2ItPnRvcyA9IDA7CisgICAgcGNiLT50dGwgPSBUQ1BfVFRMOworICAgIC8qIEFzIGluaXRpYWwgc2VuZCBNU1MsIHdlIHVzZSBUQ1BfTVNTIGJ1dCBsaW1pdCBpdCB0byA1MzYuCisgICAgICAgVGhlIHNlbmQgTVNTIGlzIHVwZGF0ZWQgd2hlbiBhbiBNU1Mgb3B0aW9uIGlzIHJlY2VpdmVkLiAqLworICAgIHBjYi0+bXNzID0gKFRDUF9NU1MgPiA1MzYpID8gNTM2IDogVENQX01TUzsKKyAgICBwY2ItPnJ0byA9IDMwMDAgLyBUQ1BfU0xPV19JTlRFUlZBTDsKKyAgICBwY2ItPnNhID0gMDsKKyAgICBwY2ItPnN2ID0gMzAwMCAvIFRDUF9TTE9XX0lOVEVSVkFMOworICAgIHBjYi0+cnRpbWUgPSAtMTsKKyAgICBwY2ItPmN3bmQgPSAxOworICAgIGlzcyA9IHRjcF9uZXh0X2lzcygpOworICAgIHBjYi0+c25kX3dsMiA9IGlzczsKKyAgICBwY2ItPnNuZF9ueHQgPSBpc3M7CisgICAgcGNiLT5sYXN0YWNrID0gaXNzOworICAgIHBjYi0+c25kX2xiYiA9IGlzczsgICAKKyAgICBwY2ItPnRtciA9IHRjcF90aWNrczsKKworICAgIHBjYi0+cG9sbHRtciA9IDA7CisKKyNpZiBMV0lQX0NBTExCQUNLX0FQSQorICAgIHBjYi0+cmVjdiA9IHRjcF9yZWN2X251bGw7CisjZW5kaWYgLyogTFdJUF9DQUxMQkFDS19BUEkgKi8gIAorICAgIAorICAgIC8qIEluaXQgS0VFUEFMSVZFIHRpbWVyICovCisgICAgcGNiLT5rZWVwX2lkbGUgID0gVENQX0tFRVBJRExFX0RFRkFVTFQ7CisgICAgCisjaWYgTFdJUF9UQ1BfS0VFUEFMSVZFCisgICAgcGNiLT5rZWVwX2ludHZsID0gVENQX0tFRVBJTlRWTF9ERUZBVUxUOworICAgIHBjYi0+a2VlcF9jbnQgICA9IFRDUF9LRUVQQ05UX0RFRkFVTFQ7CisjZW5kaWYgLyogTFdJUF9UQ1BfS0VFUEFMSVZFICovCisKKyAgICBwY2ItPmtlZXBfY250X3NlbnQgPSAwOworICB9CisgIHJldHVybiBwY2I7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBUQ1AgcHJvdG9jb2wgY29udHJvbCBibG9jayBidXQgZG9lc24ndCBwbGFjZSBpdCBvbgorICogYW55IG9mIHRoZSBUQ1AgUENCIGxpc3RzLgorICogVGhlIHBjYiBpcyBub3QgcHV0IG9uIGFueSBsaXN0IHVudGlsIGJpbmRpbmcgdXNpbmcgdGNwX2JpbmQoKS4KKyAqCisgKiBAaW50ZXJuYWw6IE1heWJlIHRoZXJlIHNob3VsZCBiZSBhIGlkbGUgVENQIFBDQiBsaXN0IHdoZXJlIHRoZXNlCisgKiBQQ0JzIGFyZSBwdXQgb24uIFBvcnQgcmVzZXJ2YXRpb24gdXNpbmcgdGNwX2JpbmQoKSBpcyBpbXBsZW1lbnRlZCBidXQKKyAqIGFsbG9jYXRlZCBwY2JzIHRoYXQgYXJlIG5vdCBib3VuZCBjYW4ndCBiZSBraWxsZWQgYXV0b21hdGljYWxseSBpZiB3YW50aW5nCisgKiB0byBhbGxvY2F0ZSBhIHBjYiB3aXRoIGhpZ2hlciBwcmlvIChAc2VlIHRjcF9raWxsX3ByaW8oKSkKKyAqCisgKiBAcmV0dXJuIGEgbmV3IHRjcF9wY2IgdGhhdCBpbml0aWFsbHkgaXMgaW4gc3RhdGUgQ0xPU0VECisgKi8KK3N0cnVjdCB0Y3BfcGNiICoKK3RjcF9uZXcodm9pZCkKK3sKKyAgcmV0dXJuIHRjcF9hbGxvYyhUQ1BfUFJJT19OT1JNQUwpOworfQorCisvKioKKyAqIFVzZWQgdG8gc3BlY2lmeSB0aGUgYXJndW1lbnQgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGNhbGxiYWNrCisgKiBmdW5jdGlvbnMuCisgKgorICogQHBhcmFtIHBjYiB0Y3BfcGNiIHRvIHNldCB0aGUgY2FsbGJhY2sgYXJndW1lbnQKKyAqIEBwYXJhbSBhcmcgdm9pZCBwb2ludGVyIGFyZ3VtZW50IHRvIHBhc3MgdG8gY2FsbGJhY2sgZnVuY3Rpb25zCisgKi8gCit2b2lkCit0Y3BfYXJnKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHZvaWQgKmFyZykKK3sgIAorICBwY2ItPmNhbGxiYWNrX2FyZyA9IGFyZzsKK30KKyNpZiBMV0lQX0NBTExCQUNLX0FQSQorCisvKioKKyAqIFVzZWQgdG8gc3BlY2lmeSB0aGUgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBUQ1AKKyAqIGNvbm5lY3Rpb24gcmVjZWl2ZXMgZGF0YS4KKyAqCisgKiBAcGFyYW0gcGNiIHRjcF9wY2IgdG8gc2V0IHRoZSByZWN2IGNhbGxiYWNrCisgKiBAcGFyYW0gcmVjdiBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIGZvciB0aGlzIHBjYiB3aGVuIGRhdGEgaXMgcmVjZWl2ZWQKKyAqLyAKK3ZvaWQKK3RjcF9yZWN2KHN0cnVjdCB0Y3BfcGNiICpwY2IsIHRjcF9yZWN2X2ZuIHJlY3YpCit7CisgIHBjYi0+cmVjdiA9IHJlY3Y7Cit9CisKKy8qKgorICogVXNlZCB0byBzcGVjaWZ5IHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBUQ1AgZGF0YQorICogaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCB0byB0aGUgcmVtb3RlIGhvc3QuCisgKgorICogQHBhcmFtIHBjYiB0Y3BfcGNiIHRvIHNldCB0aGUgc2VudCBjYWxsYmFjaworICogQHBhcmFtIHNlbnQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCBmb3IgdGhpcyBwY2Igd2hlbiBkYXRhIGlzIHN1Y2Nlc3NmdWxseSBzZW50CisgKi8gCit2b2lkCit0Y3Bfc2VudChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB0Y3Bfc2VudF9mbiBzZW50KQoreworICBwY2ItPnNlbnQgPSBzZW50OworfQorCisvKioKKyAqIFVzZWQgdG8gc3BlY2lmeSB0aGUgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBmYXRhbCBlcnJvcgorICogaGFzIG9jY3VyZWQgb24gdGhlIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIHBjYiB0Y3BfcGNiIHRvIHNldCB0aGUgZXJyIGNhbGxiYWNrCisgKiBAcGFyYW0gZXJyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIHRoaXMgcGNiIHdoZW4gYSBmYXRhbCBlcnJvcgorICogICAgICAgIGhhcyBvY2N1cmVkIG9uIHRoZSBjb25uZWN0aW9uCisgKi8gCit2b2lkCit0Y3BfZXJyKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHRjcF9lcnJfZm4gZXJyKQoreworICBwY2ItPmVycmYgPSBlcnI7Cit9CisKKy8qKgorICogVXNlZCBmb3Igc3BlY2lmeWluZyB0aGUgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYQorICogTElTVEVOaW5nIGNvbm5lY3Rpb24gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFub3RoZXIgaG9zdC4KKyAqCisgKiBAcGFyYW0gcGNiIHRjcF9wY2IgdG8gc2V0IHRoZSBhY2NlcHQgY2FsbGJhY2sKKyAqIEBwYXJhbSBhY2NlcHQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCBmb3IgdGhpcyBwY2Igd2hlbiBMSVNURU5pbmcKKyAqICAgICAgICBjb25uZWN0aW9uIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhbm90aGVyIGhvc3QKKyAqLyAKK3ZvaWQKK3RjcF9hY2NlcHQoc3RydWN0IHRjcF9wY2IgKnBjYiwgdGNwX2FjY2VwdF9mbiBhY2NlcHQpCit7CisgIHBjYi0+YWNjZXB0ID0gYWNjZXB0OworfQorI2VuZGlmIC8qIExXSVBfQ0FMTEJBQ0tfQVBJICovCisKKworLyoqCisgKiBVc2VkIHRvIHNwZWNpZnkgdGhlIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkKKyAqIGZyb20gVENQLiBUaGUgaW50ZXJ2YWwgaXMgc3BlY2lmaWVkIGluIHRlcm1zIG9mIHRoZSBUQ1AgY29hcnNlCisgKiB0aW1lciBpbnRlcnZhbCwgd2hpY2ggaXMgY2FsbGVkIHR3aWNlIGEgc2Vjb25kLgorICoKKyAqLyAKK3ZvaWQKK3RjcF9wb2xsKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHRjcF9wb2xsX2ZuIHBvbGwsIHU4X3QgaW50ZXJ2YWwpCit7CisjaWYgTFdJUF9DQUxMQkFDS19BUEkKKyAgcGNiLT5wb2xsID0gcG9sbDsKKyNlbHNlIC8qIExXSVBfQ0FMTEJBQ0tfQVBJICovICAKKyAgTFdJUF9VTlVTRURfQVJHKHBvbGwpOworI2VuZGlmIC8qIExXSVBfQ0FMTEJBQ0tfQVBJICovICAKKyAgcGNiLT5wb2xsaW50ZXJ2YWwgPSBpbnRlcnZhbDsKK30KKworLyoqCisgKiBQdXJnZXMgYSBUQ1AgUENCLiBSZW1vdmVzIGFueSBidWZmZXJlZCBkYXRhIGFuZCBmcmVlcyB0aGUgYnVmZmVyIG1lbW9yeQorICogKHBjYi0+b29zZXEsIHBjYi0+dW5zZW50IGFuZCBwY2ItPnVuYWNrZWQgYXJlIGZyZWVkKS4KKyAqCisgKiBAcGFyYW0gcGNiIHRjcF9wY2IgdG8gcHVyZ2UuIFRoZSBwY2IgaXRzZWxmIGlzIG5vdCBkZWFsbG9jYXRlZCEKKyAqLwordm9pZAordGNwX3BjYl9wdXJnZShzdHJ1Y3QgdGNwX3BjYiAqcGNiKQoreworICBpZiAocGNiLT5zdGF0ZSAhPSBDTE9TRUQgJiYKKyAgICAgcGNiLT5zdGF0ZSAhPSBUSU1FX1dBSVQgJiYKKyAgICAgcGNiLT5zdGF0ZSAhPSBMSVNURU4pIHsKKworICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3BfcGNiX3B1cmdlXG4iKSk7CisKKyNpZiBUQ1BfTElTVEVOX0JBQ0tMT0cKKyAgICBpZiAocGNiLT5zdGF0ZSA9PSBTWU5fUkNWRCkgeworICAgICAgLyogTmVlZCB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGxpc3Rlbl9wY2IgYW5kIGRlY3JlYXNlIGl0cyBhY2NlcHRzX3BlbmRpbmcgKi8KKyAgICAgIHN0cnVjdCB0Y3BfcGNiX2xpc3RlbiAqbHBjYjsKKyAgICAgIExXSVBfQVNTRVJUKCJ0Y3BfcGNiX3B1cmdlOiBwY2ItPnN0YXRlID09IFNZTl9SQ1ZEIGJ1dCB0Y3BfbGlzdGVuX3BjYnMgaXMgTlVMTCIsCisgICAgICAgIHRjcF9saXN0ZW5fcGNicy5saXN0ZW5fcGNicyAhPSBOVUxMKTsKKyAgICAgIGZvciAobHBjYiA9IHRjcF9saXN0ZW5fcGNicy5saXN0ZW5fcGNiczsgbHBjYiAhPSBOVUxMOyBscGNiID0gbHBjYi0+bmV4dCkgeworICAgICAgICBpZiAoKGxwY2ItPmxvY2FsX3BvcnQgPT0gcGNiLT5sb2NhbF9wb3J0KSAmJgorICAgICAgICAgICAgKGlwX2FkZHJfaXNhbnkoJmxwY2ItPmxvY2FsX2lwKSB8fAorICAgICAgICAgICAgIGlwX2FkZHJfY21wKCZwY2ItPmxvY2FsX2lwLCAmbHBjYi0+bG9jYWxfaXApKSkgeworICAgICAgICAgICAgLyogcG9ydCBhbmQgYWRkcmVzcyBvZiB0aGUgbGlzdGVuIHBjYiBtYXRjaCB0aGUgdGltZWQtb3V0IHBjYiAqLworICAgICAgICAgICAgTFdJUF9BU1NFUlQoInRjcF9wY2JfcHVyZ2U6IGxpc3RlbiBwY2IgZG9lcyBub3QgaGF2ZSBhY2NlcHRzIHBlbmRpbmciLAorICAgICAgICAgICAgICBscGNiLT5hY2NlcHRzX3BlbmRpbmcgPiAwKTsKKyAgICAgICAgICAgIGxwY2ItPmFjY2VwdHNfcGVuZGluZy0tOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBUQ1BfTElTVEVOX0JBQ0tMT0cgKi8KKworCisgICAgaWYgKHBjYi0+cmVmdXNlZF9kYXRhICE9IE5VTEwpIHsKKyAgICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3BfcGNiX3B1cmdlOiBkYXRhIGxlZnQgb24gLT5yZWZ1c2VkX2RhdGFcbiIpKTsKKyAgICAgIHBidWZfZnJlZShwY2ItPnJlZnVzZWRfZGF0YSk7CisgICAgICBwY2ItPnJlZnVzZWRfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIGlmIChwY2ItPnVuc2VudCAhPSBOVUxMKSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX3BjYl9wdXJnZTogbm90IGFsbCBkYXRhIHNlbnRcbiIpKTsKKyAgICB9CisgICAgaWYgKHBjYi0+dW5hY2tlZCAhPSBOVUxMKSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX3BjYl9wdXJnZTogZGF0YSBsZWZ0IG9uIC0+dW5hY2tlZFxuIikpOworICAgIH0KKyNpZiBUQ1BfUVVFVUVfT09TRVEKKyAgICBpZiAocGNiLT5vb3NlcSAhPSBOVUxMKSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX3BjYl9wdXJnZTogZGF0YSBsZWZ0IG9uIC0+b29zZXFcbiIpKTsKKyAgICB9CisgICAgdGNwX3NlZ3NfZnJlZShwY2ItPm9vc2VxKTsKKyAgICBwY2ItPm9vc2VxID0gTlVMTDsKKyNlbmRpZiAvKiBUQ1BfUVVFVUVfT09TRVEgKi8KKworICAgIC8qIFN0b3AgdGhlIHJldHJhbnNtaXNzaW9uIHRpbWVyIGFzIGl0IHdpbGwgZXhwZWN0IGRhdGEgb24gdW5hY2tlZAorICAgICAgIHF1ZXVlIGlmIGl0IGZpcmVzICovCisgICAgcGNiLT5ydGltZSA9IC0xOworCisgICAgdGNwX3NlZ3NfZnJlZShwY2ItPnVuc2VudCk7CisgICAgdGNwX3NlZ3NfZnJlZShwY2ItPnVuYWNrZWQpOworICAgIHBjYi0+dW5hY2tlZCA9IHBjYi0+dW5zZW50ID0gTlVMTDsKKyNpZiBUQ1BfT1ZFUlNJWkUKKyAgICBwY2ItPnVuc2VudF9vdmVyc2l6ZSA9IDA7CisjZW5kaWYgLyogVENQX09WRVJTSVpFICovCisgIH0KK30KKworLyoqCisgKiBQdXJnZXMgdGhlIFBDQiBhbmQgcmVtb3ZlcyBpdCBmcm9tIGEgUENCIGxpc3QuIEFueSBkZWxheWVkIEFDS3MgYXJlIHNlbnQgZmlyc3QuCisgKgorICogQHBhcmFtIHBjYmxpc3QgUENCIGxpc3QgdG8gcHVyZ2UuCisgKiBAcGFyYW0gcGNiIHRjcF9wY2IgdG8gcHVyZ2UuIFRoZSBwY2IgaXRzZWxmIGlzIE5PVCBkZWFsbG9jYXRlZCEKKyAqLwordm9pZAordGNwX3BjYl9yZW1vdmUoc3RydWN0IHRjcF9wY2IgKipwY2JsaXN0LCBzdHJ1Y3QgdGNwX3BjYiAqcGNiKQoreworICBUQ1BfUk1WKHBjYmxpc3QsIHBjYik7CisKKyAgdGNwX3BjYl9wdXJnZShwY2IpOworICAKKyAgLyogaWYgdGhlcmUgaXMgYW4gb3V0c3RhbmRpbmcgZGVsYXllZCBBQ0tzLCBzZW5kIGl0ICovCisgIGlmIChwY2ItPnN0YXRlICE9IFRJTUVfV0FJVCAmJgorICAgICBwY2ItPnN0YXRlICE9IExJU1RFTiAmJgorICAgICBwY2ItPmZsYWdzICYgVEZfQUNLX0RFTEFZKSB7CisgICAgcGNiLT5mbGFncyB8PSBURl9BQ0tfTk9XOworICAgIHRjcF9vdXRwdXQocGNiKTsKKyAgfQorCisgIGlmIChwY2ItPnN0YXRlICE9IExJU1RFTikgeworICAgIExXSVBfQVNTRVJUKCJ1bnNlbnQgc2VnbWVudHMgbGVha2luZyIsIHBjYi0+dW5zZW50ID09IE5VTEwpOworICAgIExXSVBfQVNTRVJUKCJ1bmFja2VkIHNlZ21lbnRzIGxlYWtpbmciLCBwY2ItPnVuYWNrZWQgPT0gTlVMTCk7CisjaWYgVENQX1FVRVVFX09PU0VRCisgICAgTFdJUF9BU1NFUlQoIm9vc2VxIHNlZ21lbnRzIGxlYWtpbmciLCBwY2ItPm9vc2VxID09IE5VTEwpOworI2VuZGlmIC8qIFRDUF9RVUVVRV9PT1NFUSAqLworICB9CisKKyAgcGNiLT5zdGF0ZSA9IENMT1NFRDsKKworICBMV0lQX0FTU0VSVCgidGNwX3BjYl9yZW1vdmU6IHRjcF9wY2JzX3NhbmUoKSIsIHRjcF9wY2JzX3NhbmUoKSk7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlcyBhIG5ldyBpbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICoKKyAqIEByZXR1cm4gdTMyX3QgcHNldWRvIHJhbmRvbSBzZXF1ZW5jZSBudW1iZXIKKyAqLwordTMyX3QKK3RjcF9uZXh0X2lzcyh2b2lkKQoreworICBzdGF0aWMgdTMyX3QgaXNzID0gNjUxMDsKKyAgCisgIGlzcyArPSB0Y3BfdGlja3M7ICAgICAgIC8qIFhYWCAqLworICByZXR1cm4gaXNzOworfQorCisjaWYgVENQX0NBTENVTEFURV9FRkZfU0VORF9NU1MKKy8qKgorICogQ2FsY2x1YXRlcyB0aGUgZWZmZWN0aXZlIHNlbmQgbXNzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGEgc3BlY2lmaWMgSVAgYWRkcmVzcworICogYnkgdXNpbmcgaXBfcm91dGUgdG8gZGV0ZXJtaW4gdGhlIG5ldGlmIHVzZWQgdG8gc2VuZCB0byB0aGUgYWRkcmVzcyBhbmQKKyAqIGNhbGN1bGF0aW5nIHRoZSBtaW5pbXVtIG9mIFRDUF9NU1MgYW5kIHRoYXQgbmV0aWYncyBtdHUgKGlmIHNldCkuCisgKi8KK3UxNl90Cit0Y3BfZWZmX3NlbmRfbXNzKHUxNl90IHNlbmRtc3MsIGlwX2FkZHJfdCAqYWRkcikKK3sKKyAgdTE2X3QgbXNzX3M7CisgIHN0cnVjdCBuZXRpZiAqb3V0aWY7CisKKyAgb3V0aWYgPSBpcF9yb3V0ZShhZGRyKTsKKyAgaWYgKChvdXRpZiAhPSBOVUxMKSAmJiAob3V0aWYtPm10dSAhPSAwKSkgeworICAgIG1zc19zID0gb3V0aWYtPm10dSAtIElQX0hMRU4gLSBUQ1BfSExFTjsKKyAgICAvKiBSRkMgMTEyMiwgY2hhcCA0LjIuMi42OgorICAgICAqIEVmZi5zbmQuTVNTID0gbWluKFNlbmRNU1MrMjAsIE1NU19TKSAtIFRDUGhkcnNpemUgLSBJUG9wdGlvbnNpemUKKyAgICAgKiBXZSBjb3JyZWN0IGZvciBUQ1Agb3B0aW9ucyBpbiB0Y3Bfd3JpdGUoKSwgYW5kIGRvbid0IHN1cHBvcnQgSVAgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBzZW5kbXNzID0gTFdJUF9NSU4oc2VuZG1zcywgbXNzX3MpOworICB9CisgIHJldHVybiBzZW5kbXNzOworfQorI2VuZGlmIC8qIFRDUF9DQUxDVUxBVEVfRUZGX1NFTkRfTVNTICovCisKK2NvbnN0IGNoYXIqCit0Y3BfZGVidWdfc3RhdGVfc3RyKGVudW0gdGNwX3N0YXRlIHMpCit7CisgIHJldHVybiB0Y3Bfc3RhdGVfc3RyW3NdOworfQorCisjaWYgVENQX0RFQlVHIHx8IFRDUF9JTlBVVF9ERUJVRyB8fCBUQ1BfT1VUUFVUX0RFQlVHCisvKioKKyAqIFByaW50IGEgdGNwIGhlYWRlciBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICoKKyAqIEBwYXJhbSB0Y3BoZHIgcG9pbnRlciB0byBhIHN0cnVjdCB0Y3BfaGRyCisgKi8KK3ZvaWQKK3RjcF9kZWJ1Z19wcmludChzdHJ1Y3QgdGNwX2hkciAqdGNwaGRyKQoreworICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiVENQIGhlYWRlcjpcbiIpKTsKKyAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIikpOworICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgifCAgICAlNSJVMTZfRiIgICAgICB8ICAgICU1IlUxNl9GIiAgICAgIHwgKHNyYyBwb3J0LCBkZXN0IHBvcnQpXG4iLAorICAgICAgICAgbnRvaHModGNwaGRyLT5zcmMpLCBudG9ocyh0Y3BoZHItPmRlc3QpKSk7CisgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpKTsKKyAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInwgICAgICAgICAgICUwMTAiVTMyX0YiICAgICAgICAgIHwgKHNlcSBubylcbiIsCisgICAgICAgICAgbnRvaGwodGNwaGRyLT5zZXFubykpKTsKKyAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIikpOworICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgifCAgICAgICAgICAgJTAxMCJVMzJfRiIgICAgICAgICAgfCAoYWNrIG5vKVxuIiwKKyAgICAgICAgIG50b2hsKHRjcGhkci0+YWNrbm8pKSk7CisgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpKTsKKyAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInwgJTIiVTE2X0YiIHwgICB8JSJVMTZfRiIlIlUxNl9GIiUiVTE2X0YiJSJVMTZfRiIlIlUxNl9GIiUiVTE2X0YifCAgICAgJTUiVTE2X0YiICAgICB8IChoZHJsZW4sIGZsYWdzICgiLAorICAgICAgIFRDUEhfSERSTEVOKHRjcGhkciksCisgICAgICAgICBUQ1BIX0ZMQUdTKHRjcGhkcikgPj4gNSAmIDEsCisgICAgICAgICBUQ1BIX0ZMQUdTKHRjcGhkcikgPj4gNCAmIDEsCisgICAgICAgICBUQ1BIX0ZMQUdTKHRjcGhkcikgPj4gMyAmIDEsCisgICAgICAgICBUQ1BIX0ZMQUdTKHRjcGhkcikgPj4gMiAmIDEsCisgICAgICAgICBUQ1BIX0ZMQUdTKHRjcGhkcikgPj4gMSAmIDEsCisgICAgICAgICBUQ1BIX0ZMQUdTKHRjcGhkcikgJiAxLAorICAgICAgICAgbnRvaHModGNwaGRyLT53bmQpKSk7CisgIHRjcF9kZWJ1Z19wcmludF9mbGFncyhUQ1BIX0ZMQUdTKHRjcGhkcikpOworICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiKSwgd2luKVxuIikpOworICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKSk7CisgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ8ICAgIDB4JTA0IlgxNl9GIiAgICAgfCAgICAgJTUiVTE2X0YiICAgICB8IChjaGtzdW0sIHVyZ3ApXG4iLAorICAgICAgICAgbnRvaHModGNwaGRyLT5jaGtzdW0pLCBudG9ocyh0Y3BoZHItPnVyZ3ApKSk7CisgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpKTsKK30KKworLyoqCisgKiBQcmludCBhIHRjcCBzdGF0ZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICoKKyAqIEBwYXJhbSBzIGVudW0gdGNwX3N0YXRlIHRvIHByaW50CisgKi8KK3ZvaWQKK3RjcF9kZWJ1Z19wcmludF9zdGF0ZShlbnVtIHRjcF9zdGF0ZSBzKQoreworICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiU3RhdGU6ICVzXG4iLCB0Y3Bfc3RhdGVfc3RyW3NdKSk7Cit9CisKKy8qKgorICogUHJpbnQgdGNwIGZsYWdzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgKgorICogQHBhcmFtIGZsYWdzIHRjcCBmbGFncywgYWxsIGFjdGl2ZSBmbGFncyBhcmUgcHJpbnRlZAorICovCit2b2lkCit0Y3BfZGVidWdfcHJpbnRfZmxhZ3ModThfdCBmbGFncykKK3sKKyAgaWYgKGZsYWdzICYgVENQX0ZJTikgeworICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJGSU4gIikpOworICB9CisgIGlmIChmbGFncyAmIFRDUF9TWU4pIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiU1lOICIpKTsKKyAgfQorICBpZiAoZmxhZ3MgJiBUQ1BfUlNUKSB7CisgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIlJTVCAiKSk7CisgIH0KKyAgaWYgKGZsYWdzICYgVENQX1BTSCkgeworICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJQU0ggIikpOworICB9CisgIGlmIChmbGFncyAmIFRDUF9BQ0spIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiQUNLICIpKTsKKyAgfQorICBpZiAoZmxhZ3MgJiBUQ1BfVVJHKSB7CisgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIlVSRyAiKSk7CisgIH0KKyAgaWYgKGZsYWdzICYgVENQX0VDRSkgeworICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJFQ0UgIikpOworICB9CisgIGlmIChmbGFncyAmIFRDUF9DV1IpIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiQ1dSICIpKTsKKyAgfQorICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiXG4iKSk7Cit9CisKKy8qKgorICogUHJpbnQgYWxsIHRjcF9wY2JzIGluIGV2ZXJ5IGxpc3QgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqLwordm9pZAordGNwX2RlYnVnX3ByaW50X3BjYnModm9pZCkKK3sKKyAgc3RydWN0IHRjcF9wY2IgKnBjYjsKKyAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIkFjdGl2ZSBQQ0Igc3RhdGVzOlxuIikpOworICBmb3IocGNiID0gdGNwX2FjdGl2ZV9wY2JzOyBwY2IgIT0gTlVMTDsgcGNiID0gcGNiLT5uZXh0KSB7CisgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIkxvY2FsIHBvcnQgJSJVMTZfRiIsIGZvcmVpZ24gcG9ydCAlIlUxNl9GIiBzbmRfbnh0ICUiVTMyX0YiIHJjdl9ueHQgJSJVMzJfRiIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcGNiLT5sb2NhbF9wb3J0LCBwY2ItPnJlbW90ZV9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICBwY2ItPnNuZF9ueHQsIHBjYi0+cmN2X254dCkpOworICAgIHRjcF9kZWJ1Z19wcmludF9zdGF0ZShwY2ItPnN0YXRlKTsKKyAgfSAgICAKKyAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIkxpc3RlbiBQQ0Igc3RhdGVzOlxuIikpOworICBmb3IocGNiID0gKHN0cnVjdCB0Y3BfcGNiICopdGNwX2xpc3Rlbl9wY2JzLnBjYnM7IHBjYiAhPSBOVUxMOyBwY2IgPSBwY2ItPm5leHQpIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiTG9jYWwgcG9ydCAlIlUxNl9GIiwgZm9yZWlnbiBwb3J0ICUiVTE2X0YiIHNuZF9ueHQgJSJVMzJfRiIgcmN2X254dCAlIlUzMl9GIiAiLAorICAgICAgICAgICAgICAgICAgICAgICBwY2ItPmxvY2FsX3BvcnQsIHBjYi0+cmVtb3RlX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHBjYi0+c25kX254dCwgcGNiLT5yY3Zfbnh0KSk7CisgICAgdGNwX2RlYnVnX3ByaW50X3N0YXRlKHBjYi0+c3RhdGUpOworICB9ICAgIAorICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiVElNRS1XQUlUIFBDQiBzdGF0ZXM6XG4iKSk7CisgIGZvcihwY2IgPSB0Y3BfdHdfcGNiczsgcGNiICE9IE5VTEw7IHBjYiA9IHBjYi0+bmV4dCkgeworICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJMb2NhbCBwb3J0ICUiVTE2X0YiLCBmb3JlaWduIHBvcnQgJSJVMTZfRiIgc25kX254dCAlIlUzMl9GIiByY3Zfbnh0ICUiVTMyX0YiICIsCisgICAgICAgICAgICAgICAgICAgICAgIHBjYi0+bG9jYWxfcG9ydCwgcGNiLT5yZW1vdGVfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgcGNiLT5zbmRfbnh0LCBwY2ItPnJjdl9ueHQpKTsKKyAgICB0Y3BfZGVidWdfcHJpbnRfc3RhdGUocGNiLT5zdGF0ZSk7CisgIH0gICAgCit9CisKKy8qKgorICogQ2hlY2sgc3RhdGUgY29uc2lzdGVuY3kgb2YgdGhlIHRjcF9wY2IgbGlzdHMuCisgKi8KK3MxNl90Cit0Y3BfcGNic19zYW5lKHZvaWQpCit7CisgIHN0cnVjdCB0Y3BfcGNiICpwY2I7CisgIGZvcihwY2IgPSB0Y3BfYWN0aXZlX3BjYnM7IHBjYiAhPSBOVUxMOyBwY2IgPSBwY2ItPm5leHQpIHsKKyAgICBMV0lQX0FTU0VSVCgidGNwX3BjYnNfc2FuZTogYWN0aXZlIHBjYi0+c3RhdGUgIT0gQ0xPU0VEIiwgcGNiLT5zdGF0ZSAhPSBDTE9TRUQpOworICAgIExXSVBfQVNTRVJUKCJ0Y3BfcGNic19zYW5lOiBhY3RpdmUgcGNiLT5zdGF0ZSAhPSBMSVNURU4iLCBwY2ItPnN0YXRlICE9IExJU1RFTik7CisgICAgTFdJUF9BU1NFUlQoInRjcF9wY2JzX3NhbmU6IGFjdGl2ZSBwY2ItPnN0YXRlICE9IFRJTUUtV0FJVCIsIHBjYi0+c3RhdGUgIT0gVElNRV9XQUlUKTsKKyAgfQorICBmb3IocGNiID0gdGNwX3R3X3BjYnM7IHBjYiAhPSBOVUxMOyBwY2IgPSBwY2ItPm5leHQpIHsKKyAgICBMV0lQX0FTU0VSVCgidGNwX3BjYnNfc2FuZTogdHcgcGNiLT5zdGF0ZSA9PSBUSU1FLVdBSVQiLCBwY2ItPnN0YXRlID09IFRJTUVfV0FJVCk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogVENQX0RFQlVHICovCisKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9jb3JlL3RjcF9pbi5jIGIvY29yZS9sd2lwL3NyYy9jb3JlL3RjcF9pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTUyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvdGNwX2luLmMKQEAgLTAsMCArMSwxNTY3IEBACisvKioKKyAqIEBmaWxlCisgKiBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbCwgaW5jb21pbmcgdHJhZmZpYworICoKKyAqIFRoZSBpbnB1dCBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBvZiB0aGUgVENQIGxheWVyLgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhbGx5IGNhbGxlZCBpbiB0aGUgb3JkZXIgKGlwX2lucHV0KCkgLT4pCisgKiB0Y3BfaW5wdXQoKSAtPiAqIHRjcF9wcm9jZXNzKCkgLT4gdGNwX3JlY2VpdmUoKSAoLT4gYXBwbGljYXRpb24pLgorICogCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICoKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9UQ1AgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL3RjcF9pbXBsLmgiCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKyNpbmNsdWRlICJsd2lwL25ldGlmLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL21lbXAuaCIKKyNpbmNsdWRlICJsd2lwL2luZXRfY2hrc3VtLmgiCisjaW5jbHVkZSAibHdpcC9zdGF0cy5oIgorI2luY2x1ZGUgImx3aXAvc25tcC5oIgorI2luY2x1ZGUgImFyY2gvcGVyZi5oIgorCisvKiBUaGVzZSB2YXJpYWJsZXMgYXJlIGdsb2JhbCB0byBhbGwgZnVuY3Rpb25zIGludm9sdmVkIGluIHRoZSBpbnB1dAorICAgcHJvY2Vzc2luZyBvZiBUQ1Agc2VnbWVudHMuIFRoZXkgYXJlIHNldCBieSB0aGUgdGNwX2lucHV0KCkKKyAgIGZ1bmN0aW9uLiAqLworc3RhdGljIHN0cnVjdCB0Y3Bfc2VnIGluc2VnOworc3RhdGljIHN0cnVjdCB0Y3BfaGRyICp0Y3BoZHI7CitzdGF0aWMgc3RydWN0IGlwX2hkciAqaXBoZHI7CitzdGF0aWMgdTMyX3Qgc2Vxbm8sIGFja25vOworc3RhdGljIHU4X3QgZmxhZ3M7CitzdGF0aWMgdTE2X3QgdGNwbGVuOworCitzdGF0aWMgdThfdCByZWN2X2ZsYWdzOworc3RhdGljIHN0cnVjdCBwYnVmICpyZWN2X2RhdGE7CisKK3N0cnVjdCB0Y3BfcGNiICp0Y3BfaW5wdXRfcGNiOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gKi8KK3N0YXRpYyBlcnJfdCB0Y3BfcHJvY2VzcyhzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKK3N0YXRpYyB2b2lkIHRjcF9yZWNlaXZlKHN0cnVjdCB0Y3BfcGNiICpwY2IpOworc3RhdGljIHZvaWQgdGNwX3BhcnNlb3B0KHN0cnVjdCB0Y3BfcGNiICpwY2IpOworCitzdGF0aWMgZXJyX3QgdGNwX2xpc3Rlbl9pbnB1dChzdHJ1Y3QgdGNwX3BjYl9saXN0ZW4gKnBjYik7CitzdGF0aWMgZXJyX3QgdGNwX3RpbWV3YWl0X2lucHV0KHN0cnVjdCB0Y3BfcGNiICpwY2IpOworCisvKioKKyAqIFRoZSBpbml0aWFsIGlucHV0IHByb2Nlc3Npbmcgb2YgVENQLiBJdCB2ZXJpZmllcyB0aGUgVENQIGhlYWRlciwgZGVtdWx0aXBsZXhlcworICogdGhlIHNlZ21lbnQgYmV0d2VlbiB0aGUgUENCcyBhbmQgcGFzc2VzIGl0IG9uIHRvIHRjcF9wcm9jZXNzKCksIHdoaWNoIGltcGxlbWVudHMKKyAqIHRoZSBUQ1AgZmluaXRlIHN0YXRlIG1hY2hpbmUuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBJUCBsYXllciAoaW4KKyAqIGlwX2lucHV0KCkpLgorICoKKyAqIEBwYXJhbSBwIHJlY2VpdmVkIFRDUCBzZWdtZW50IHRvIHByb2Nlc3MgKHAtPnBheWxvYWQgcG9pbnRpbmcgdG8gdGhlIElQIGhlYWRlcikKKyAqIEBwYXJhbSBpbnAgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdGhpcyBzZWdtZW50IHdhcyByZWNlaXZlZAorICovCit2b2lkCit0Y3BfaW5wdXQoc3RydWN0IHBidWYgKnAsIHN0cnVjdCBuZXRpZiAqaW5wKQoreworICBzdHJ1Y3QgdGNwX3BjYiAqcGNiLCAqcHJldjsKKyAgc3RydWN0IHRjcF9wY2JfbGlzdGVuICpscGNiOworI2lmIFNPX1JFVVNFCisgIHN0cnVjdCB0Y3BfcGNiICpscGNiX3ByZXYgPSBOVUxMOworICBzdHJ1Y3QgdGNwX3BjYl9saXN0ZW4gKmxwY2JfYW55ID0gTlVMTDsKKyNlbmRpZiAvKiBTT19SRVVTRSAqLworICB1OF90IGhkcmxlbjsKKyAgZXJyX3QgZXJyOworCisgIFBFUkZfU1RBUlQ7CisKKyAgVENQX1NUQVRTX0lOQyh0Y3AucmVjdik7CisgIHNubXBfaW5jX3RjcGluc2VncygpOworCisgIGlwaGRyID0gKHN0cnVjdCBpcF9oZHIgKilwLT5wYXlsb2FkOworICB0Y3BoZHIgPSAoc3RydWN0IHRjcF9oZHIgKikoKHU4X3QgKilwLT5wYXlsb2FkICsgSVBIX0hMKGlwaGRyKSAqIDQpOworCisjaWYgVENQX0lOUFVUX0RFQlVHCisgIHRjcF9kZWJ1Z19wcmludCh0Y3BoZHIpOworI2VuZGlmCisKKyAgLyogcmVtb3ZlIGhlYWRlciBmcm9tIHBheWxvYWQgKi8KKyAgaWYgKHBidWZfaGVhZGVyKHAsIC0oKHMxNl90KShJUEhfSEwoaXBoZHIpICogNCkpKSB8fCAocC0+dG90X2xlbiA8IHNpemVvZihzdHJ1Y3QgdGNwX2hkcikpKSB7CisgICAgLyogZHJvcCBzaG9ydCBwYWNrZXRzICovCisgICAgTFdJUF9ERUJVR0YoVENQX0lOUFVUX0RFQlVHLCAoInRjcF9pbnB1dDogc2hvcnQgcGFja2V0ICglIlUxNl9GIiBieXRlcykgZGlzY2FyZGVkXG4iLCBwLT50b3RfbGVuKSk7CisgICAgVENQX1NUQVRTX0lOQyh0Y3AubGVuZXJyKTsKKyAgICBUQ1BfU1RBVFNfSU5DKHRjcC5kcm9wKTsKKyAgICBzbm1wX2luY190Y3BpbmVycnMoKTsKKyAgICBwYnVmX2ZyZWUocCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogRG9uJ3QgZXZlbiBwcm9jZXNzIGluY29taW5nIGJyb2FkY2FzdHMvbXVsdGljYXN0cy4gKi8KKyAgaWYgKGlwX2FkZHJfaXNicm9hZGNhc3QoJmN1cnJlbnRfaXBoZHJfZGVzdCwgaW5wKSB8fAorICAgICAgaXBfYWRkcl9pc211bHRpY2FzdCgmY3VycmVudF9pcGhkcl9kZXN0KSkgeworICAgIFRDUF9TVEFUU19JTkModGNwLnByb3RlcnIpOworICAgIFRDUF9TVEFUU19JTkModGNwLmRyb3ApOworICAgIHNubXBfaW5jX3RjcGluZXJycygpOworICAgIHBidWZfZnJlZShwKTsKKyAgICByZXR1cm47CisgIH0KKworI2lmIENIRUNLU1VNX0NIRUNLX1RDUAorICAvKiBWZXJpZnkgVENQIGNoZWNrc3VtLiAqLworICBpZiAoaW5ldF9jaGtzdW1fcHNldWRvKHAsIGlwX2N1cnJlbnRfc3JjX2FkZHIoKSwgaXBfY3VycmVudF9kZXN0X2FkZHIoKSwKKyAgICAgIElQX1BST1RPX1RDUCwgcC0+dG90X2xlbikgIT0gMCkgeworICAgICAgTFdJUF9ERUJVR0YoVENQX0lOUFVUX0RFQlVHLCAoInRjcF9pbnB1dDogcGFja2V0IGRpc2NhcmRlZCBkdWUgdG8gZmFpbGluZyBjaGVja3N1bSAweCUwNCJYMTZfRiJcbiIsCisgICAgICAgIGluZXRfY2hrc3VtX3BzZXVkbyhwLCBpcF9jdXJyZW50X3NyY19hZGRyKCksIGlwX2N1cnJlbnRfZGVzdF9hZGRyKCksCisgICAgICBJUF9QUk9UT19UQ1AsIHAtPnRvdF9sZW4pKSk7CisjaWYgVENQX0RFQlVHCisgICAgdGNwX2RlYnVnX3ByaW50KHRjcGhkcik7CisjZW5kaWYgLyogVENQX0RFQlVHICovCisgICAgVENQX1NUQVRTX0lOQyh0Y3AuY2hrZXJyKTsKKyAgICBUQ1BfU1RBVFNfSU5DKHRjcC5kcm9wKTsKKyAgICBzbm1wX2luY190Y3BpbmVycnMoKTsKKyAgICBwYnVmX2ZyZWUocCk7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKworICAvKiBNb3ZlIHRoZSBwYXlsb2FkIHBvaW50ZXIgaW4gdGhlIHBidWYgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgICAgIFRDUCBkYXRhIGluc3RlYWQgb2YgdGhlIFRDUCBoZWFkZXIuICovCisgIGhkcmxlbiA9IFRDUEhfSERSTEVOKHRjcGhkcik7CisgIGlmKHBidWZfaGVhZGVyKHAsIC0oaGRybGVuICogNCkpKXsKKyAgICAvKiBkcm9wIHNob3J0IHBhY2tldHMgKi8KKyAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX2lucHV0OiBzaG9ydCBwYWNrZXRcbiIpKTsKKyAgICBUQ1BfU1RBVFNfSU5DKHRjcC5sZW5lcnIpOworICAgIFRDUF9TVEFUU19JTkModGNwLmRyb3ApOworICAgIHNubXBfaW5jX3RjcGluZXJycygpOworICAgIHBidWZfZnJlZShwKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBDb252ZXJ0IGZpZWxkcyBpbiBUQ1AgaGVhZGVyIHRvIGhvc3QgYnl0ZSBvcmRlci4gKi8KKyAgdGNwaGRyLT5zcmMgPSBudG9ocyh0Y3BoZHItPnNyYyk7CisgIHRjcGhkci0+ZGVzdCA9IG50b2hzKHRjcGhkci0+ZGVzdCk7CisgIHNlcW5vID0gdGNwaGRyLT5zZXFubyA9IG50b2hsKHRjcGhkci0+c2Vxbm8pOworICBhY2tubyA9IHRjcGhkci0+YWNrbm8gPSBudG9obCh0Y3BoZHItPmFja25vKTsKKyAgdGNwaGRyLT53bmQgPSBudG9ocyh0Y3BoZHItPnduZCk7CisKKyAgZmxhZ3MgPSBUQ1BIX0ZMQUdTKHRjcGhkcik7CisgIHRjcGxlbiA9IHAtPnRvdF9sZW4gKyAoKGZsYWdzICYgKFRDUF9GSU4gfCBUQ1BfU1lOKSkgPyAxIDogMCk7CisKKyAgLyogRGVtdWx0aXBsZXggYW4gaW5jb21pbmcgc2VnbWVudC4gRmlyc3QsIHdlIGNoZWNrIGlmIGl0IGlzIGRlc3RpbmVkCisgICAgIGZvciBhbiBhY3RpdmUgY29ubmVjdGlvbi4gKi8KKyAgcHJldiA9IE5VTEw7CisKKyAgCisgIGZvcihwY2IgPSB0Y3BfYWN0aXZlX3BjYnM7IHBjYiAhPSBOVUxMOyBwY2IgPSBwY2ItPm5leHQpIHsKKyAgICBMV0lQX0FTU0VSVCgidGNwX2lucHV0OiBhY3RpdmUgcGNiLT5zdGF0ZSAhPSBDTE9TRUQiLCBwY2ItPnN0YXRlICE9IENMT1NFRCk7CisgICAgTFdJUF9BU1NFUlQoInRjcF9pbnB1dDogYWN0aXZlIHBjYi0+c3RhdGUgIT0gVElNRS1XQUlUIiwgcGNiLT5zdGF0ZSAhPSBUSU1FX1dBSVQpOworICAgIExXSVBfQVNTRVJUKCJ0Y3BfaW5wdXQ6IGFjdGl2ZSBwY2ItPnN0YXRlICE9IExJU1RFTiIsIHBjYi0+c3RhdGUgIT0gTElTVEVOKTsKKyAgICBpZiAocGNiLT5yZW1vdGVfcG9ydCA9PSB0Y3BoZHItPnNyYyAmJgorICAgICAgIHBjYi0+bG9jYWxfcG9ydCA9PSB0Y3BoZHItPmRlc3QgJiYKKyAgICAgICBpcF9hZGRyX2NtcCgmKHBjYi0+cmVtb3RlX2lwKSwgJmN1cnJlbnRfaXBoZHJfc3JjKSAmJgorICAgICAgIGlwX2FkZHJfY21wKCYocGNiLT5sb2NhbF9pcCksICZjdXJyZW50X2lwaGRyX2Rlc3QpKSB7CisKKyAgICAgIC8qIE1vdmUgdGhpcyBQQ0IgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0IHNvIHRoYXQgc3Vic2VxdWVudAorICAgICAgICAgbG9va3VwcyB3aWxsIGJlIGZhc3RlciAod2UgZXhwbG9pdCBsb2NhbGl0eSBpbiBUQ1Agc2VnbWVudAorICAgICAgICAgYXJyaXZhbHMpLiAqLworICAgICAgTFdJUF9BU1NFUlQoInRjcF9pbnB1dDogcGNiLT5uZXh0ICE9IHBjYiAoYmVmb3JlIGNhY2hlKSIsIHBjYi0+bmV4dCAhPSBwY2IpOworICAgICAgaWYgKHByZXYgIT0gTlVMTCkgeworICAgICAgICBwcmV2LT5uZXh0ID0gcGNiLT5uZXh0OworICAgICAgICBwY2ItPm5leHQgPSB0Y3BfYWN0aXZlX3BjYnM7CisgICAgICAgIHRjcF9hY3RpdmVfcGNicyA9IHBjYjsKKyAgICAgIH0KKyAgICAgIExXSVBfQVNTRVJUKCJ0Y3BfaW5wdXQ6IHBjYi0+bmV4dCAhPSBwY2IgKGFmdGVyIGNhY2hlKSIsIHBjYi0+bmV4dCAhPSBwY2IpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHByZXYgPSBwY2I7CisgIH0KKworICBpZiAocGNiID09IE5VTEwpIHsKKyAgICAvKiBJZiBpdCBkaWQgbm90IGdvIHRvIGFuIGFjdGl2ZSBjb25uZWN0aW9uLCB3ZSBjaGVjayB0aGUgY29ubmVjdGlvbnMKKyAgICAgICBpbiB0aGUgVElNRS1XQUlUIHN0YXRlLiAqLworICAgIGZvcihwY2IgPSB0Y3BfdHdfcGNiczsgcGNiICE9IE5VTEw7IHBjYiA9IHBjYi0+bmV4dCkgeworICAgICAgTFdJUF9BU1NFUlQoInRjcF9pbnB1dDogVElNRS1XQUlUIHBjYi0+c3RhdGUgPT0gVElNRS1XQUlUIiwgcGNiLT5zdGF0ZSA9PSBUSU1FX1dBSVQpOworICAgICAgaWYgKHBjYi0+cmVtb3RlX3BvcnQgPT0gdGNwaGRyLT5zcmMgJiYKKyAgICAgICAgIHBjYi0+bG9jYWxfcG9ydCA9PSB0Y3BoZHItPmRlc3QgJiYKKyAgICAgICAgIGlwX2FkZHJfY21wKCYocGNiLT5yZW1vdGVfaXApLCAmY3VycmVudF9pcGhkcl9zcmMpICYmCisgICAgICAgICBpcF9hZGRyX2NtcCgmKHBjYi0+bG9jYWxfaXApLCAmY3VycmVudF9pcGhkcl9kZXN0KSkgeworICAgICAgICAvKiBXZSBkb24ndCByZWFsbHkgY2FyZSBlbm91Z2ggdG8gbW92ZSB0aGlzIFBDQiB0byB0aGUgZnJvbnQKKyAgICAgICAgICAgb2YgdGhlIGxpc3Qgc2luY2Ugd2UgYXJlIG5vdCB2ZXJ5IGxpa2VseSB0byByZWNlaXZlIHRoYXQKKyAgICAgICAgICAgbWFueSBzZWdtZW50cyBmb3IgY29ubmVjdGlvbnMgaW4gVElNRS1XQUlULiAqLworICAgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX2lucHV0OiBwYWNrZWQgZm9yIFRJTUVfV0FJVGluZyBjb25uZWN0aW9uLlxuIikpOworICAgICAgICB0Y3BfdGltZXdhaXRfaW5wdXQocGNiKTsKKyAgICAgICAgcGJ1Zl9mcmVlKHApOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgLyogRmluYWxseSwgaWYgd2Ugc3RpbGwgZGlkIG5vdCBnZXQgYSBtYXRjaCwgd2UgY2hlY2sgYWxsIFBDQnMgdGhhdAorICAgICAgIGFyZSBMSVNURU5pbmcgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zLiAqLworICAgIHByZXYgPSBOVUxMOworICAgIGZvcihscGNiID0gdGNwX2xpc3Rlbl9wY2JzLmxpc3Rlbl9wY2JzOyBscGNiICE9IE5VTEw7IGxwY2IgPSBscGNiLT5uZXh0KSB7CisgICAgICBpZiAobHBjYi0+bG9jYWxfcG9ydCA9PSB0Y3BoZHItPmRlc3QpIHsKKyNpZiBTT19SRVVTRQorICAgICAgICBpZiAoaXBfYWRkcl9jbXAoJihscGNiLT5sb2NhbF9pcCksICZjdXJyZW50X2lwaGRyX2Rlc3QpKSB7CisgICAgICAgICAgLyogZm91bmQgYW4gZXhhY3QgbWF0Y2ggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmKGlwX2FkZHJfaXNhbnkoJihscGNiLT5sb2NhbF9pcCkpKSB7CisgICAgICAgICAgLyogZm91bmQgYW4gQU5ZLW1hdGNoICovCisgICAgICAgICAgbHBjYl9hbnkgPSBscGNiOworICAgICAgICAgIGxwY2JfcHJldiA9IHByZXY7CisgICAgICAgIH0KKyNlbHNlIC8qIFNPX1JFVVNFICovCisgICAgICAgIGlmIChpcF9hZGRyX2NtcCgmKGxwY2ItPmxvY2FsX2lwKSwgJmN1cnJlbnRfaXBoZHJfZGVzdCkgfHwKKyAgICAgICAgICAgIGlwX2FkZHJfaXNhbnkoJihscGNiLT5sb2NhbF9pcCkpKSB7CisgICAgICAgICAgLyogZm91bmQgYSBtYXRjaCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYgLyogU09fUkVVU0UgKi8KKyAgICAgIH0KKyAgICAgIHByZXYgPSAoc3RydWN0IHRjcF9wY2IgKilscGNiOworICAgIH0KKyNpZiBTT19SRVVTRQorICAgIC8qIGZpcnN0IHRyeSBzcGVjaWZpYyBsb2NhbCBJUCAqLworICAgIGlmIChscGNiID09IE5VTEwpIHsKKyAgICAgIC8qIG9ubHkgcGFzcyB0byBBTlkgaWYgbm8gc3BlY2lmaWMgbG9jYWwgSVAgaGFzIGJlZW4gZm91bmQgKi8KKyAgICAgIGxwY2IgPSBscGNiX2FueTsKKyAgICAgIHByZXYgPSBscGNiX3ByZXY7CisgICAgfQorI2VuZGlmIC8qIFNPX1JFVVNFICovCisgICAgaWYgKGxwY2IgIT0gTlVMTCkgeworICAgICAgLyogTW92ZSB0aGlzIFBDQiB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3Qgc28gdGhhdCBzdWJzZXF1ZW50CisgICAgICAgICBsb29rdXBzIHdpbGwgYmUgZmFzdGVyICh3ZSBleHBsb2l0IGxvY2FsaXR5IGluIFRDUCBzZWdtZW50CisgICAgICAgICBhcnJpdmFscykuICovCisgICAgICBpZiAocHJldiAhPSBOVUxMKSB7CisgICAgICAgICgoc3RydWN0IHRjcF9wY2JfbGlzdGVuICopcHJldiktPm5leHQgPSBscGNiLT5uZXh0OworICAgICAgICAgICAgICAvKiBvdXIgc3VjY2Vzc29yIGlzIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpc3RlbmluZyBsaXN0ICovCisgICAgICAgIGxwY2ItPm5leHQgPSB0Y3BfbGlzdGVuX3BjYnMubGlzdGVuX3BjYnM7CisgICAgICAgICAgICAgIC8qIHB1dCB0aGlzIGxpc3RlbmluZyBwY2IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3RlbmluZyBsaXN0ICovCisgICAgICAgIHRjcF9saXN0ZW5fcGNicy5saXN0ZW5fcGNicyA9IGxwY2I7CisgICAgICB9CisgICAgCisgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX2lucHV0OiBwYWNrZWQgZm9yIExJU1RFTmluZyBjb25uZWN0aW9uLlxuIikpOworICAgICAgdGNwX2xpc3Rlbl9pbnB1dChscGNiKTsKKyAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworI2lmIFRDUF9JTlBVVF9ERUJVRworICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgiKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSB0Y3BfaW5wdXQ6IGZsYWdzICIpKTsKKyAgdGNwX2RlYnVnX3ByaW50X2ZsYWdzKFRDUEhfRkxBR1ModGNwaGRyKSk7CisgIExXSVBfREVCVUdGKFRDUF9JTlBVVF9ERUJVRywgKCItKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4iKSk7CisjZW5kaWYgLyogVENQX0lOUFVUX0RFQlVHICovCisKKworICBpZiAocGNiICE9IE5VTEwpIHsKKyAgICAvKiBUaGUgaW5jb21pbmcgc2VnbWVudCBiZWxvbmdzIHRvIGEgY29ubmVjdGlvbi4gKi8KKyNpZiBUQ1BfSU5QVVRfREVCVUcKKyNpZiBUQ1BfREVCVUcKKyAgICB0Y3BfZGVidWdfcHJpbnRfc3RhdGUocGNiLT5zdGF0ZSk7CisjZW5kaWYgLyogVENQX0RFQlVHICovCisjZW5kaWYgLyogVENQX0lOUFVUX0RFQlVHICovCisKKyAgICAvKiBTZXQgdXAgYSB0Y3Bfc2VnIHN0cnVjdHVyZS4gKi8KKyAgICBpbnNlZy5uZXh0ID0gTlVMTDsKKyAgICBpbnNlZy5sZW4gPSBwLT50b3RfbGVuOworICAgIGluc2VnLnAgPSBwOworICAgIGluc2VnLnRjcGhkciA9IHRjcGhkcjsKKworICAgIHJlY3ZfZGF0YSA9IE5VTEw7CisgICAgcmVjdl9mbGFncyA9IDA7CisKKyAgICAvKiBJZiB0aGVyZSBpcyBkYXRhIHdoaWNoIHdhcyBwcmV2aW91c2x5ICJyZWZ1c2VkIiBieSB1cHBlciBsYXllciAqLworICAgIGlmIChwY2ItPnJlZnVzZWRfZGF0YSAhPSBOVUxMKSB7CisgICAgICAvKiBOb3RpZnkgYWdhaW4gYXBwbGljYXRpb24gd2l0aCBkYXRhIHByZXZpb3VzbHkgcmVjZWl2ZWQuICovCisgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX2lucHV0OiBub3RpZnkga2VwdCBwYWNrZXRcbiIpKTsKKyAgICAgIFRDUF9FVkVOVF9SRUNWKHBjYiwgcGNiLT5yZWZ1c2VkX2RhdGEsIEVSUl9PSywgZXJyKTsKKyAgICAgIGlmIChlcnIgPT0gRVJSX09LKSB7CisgICAgICAgIHBjYi0+cmVmdXNlZF9kYXRhID0gTlVMTDsKKyAgICAgIH0gZWxzZSBpZiAoKGVyciA9PSBFUlJfQUJSVCkgfHwgKHRjcGxlbiA+IDApKSB7CisgICAgICAgIC8qIGlmIGVyciA9PSBFUlJfQUJSVCwgJ3BjYicgaXMgYWxyZWFkeSBkZWFsbG9jYXRlZCAqLworICAgICAgICAvKiBEcm9wIGluY29taW5nIHBhY2tldHMgYmVjYXVzZSBwY2IgaXMgImZ1bGwiIChvbmx5IGlmIHRoZSBpbmNvbWluZworICAgICAgICAgICBzZWdtZW50IGNvbnRhaW5zIGRhdGEpLiAqLworICAgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX2lucHV0OiBkcm9wIGluY29taW5nIHBhY2tldHMsIGJlY2F1c2UgcGNiIGlzIFwiZnVsbFwiXG4iKSk7CisgICAgICAgIFRDUF9TVEFUU19JTkModGNwLmRyb3ApOworICAgICAgICBzbm1wX2luY190Y3BpbmVycnMoKTsKKyAgICAgICAgcGJ1Zl9mcmVlKHApOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIHRjcF9pbnB1dF9wY2IgPSBwY2I7CisgICAgZXJyID0gdGNwX3Byb2Nlc3MocGNiKTsKKyAgICAvKiBBIHJldHVybiB2YWx1ZSBvZiBFUlJfQUJSVCBtZWFucyB0aGF0IHRjcF9hYm9ydCgpIHdhcyBjYWxsZWQKKyAgICAgICBhbmQgdGhhdCB0aGUgcGNiIGhhcyBiZWVuIGZyZWVkLiBJZiBzbywgd2UgZG9uJ3QgZG8gYW55dGhpbmcuICovCisgICAgaWYgKGVyciAhPSBFUlJfQUJSVCkgeworICAgICAgaWYgKHJlY3ZfZmxhZ3MgJiBURl9SRVNFVCkgeworICAgICAgICAvKiBURl9SRVNFVCBtZWFucyB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyByZXNldCBieSB0aGUgb3RoZXIKKyAgICAgICAgICAgZW5kLiBXZSB0aGVuIGNhbGwgdGhlIGVycm9yIGNhbGxiYWNrIHRvIGluZm9ybSB0aGUKKyAgICAgICAgICAgYXBwbGljYXRpb24gdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBkZWFkIGJlZm9yZSB3ZQorICAgICAgICAgICBkZWFsbG9jYXRlIHRoZSBQQ0IuICovCisgICAgICAgIFRDUF9FVkVOVF9FUlIocGNiLT5lcnJmLCBwY2ItPmNhbGxiYWNrX2FyZywgRVJSX1JTVCk7CisgICAgICAgIHRjcF9wY2JfcmVtb3ZlKCZ0Y3BfYWN0aXZlX3BjYnMsIHBjYik7CisgICAgICAgIG1lbXBfZnJlZShNRU1QX1RDUF9QQ0IsIHBjYik7CisgICAgICB9IGVsc2UgaWYgKHJlY3ZfZmxhZ3MgJiBURl9DTE9TRUQpIHsKKyAgICAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIGFuZCB3ZSB3aWxsIGRlYWxsb2NhdGUgdGhlCisgICAgICAgICAgIFBDQi4gKi8KKyAgICAgICAgdGNwX3BjYl9yZW1vdmUoJnRjcF9hY3RpdmVfcGNicywgcGNiKTsKKyAgICAgICAgbWVtcF9mcmVlKE1FTVBfVENQX1BDQiwgcGNiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IEVSUl9PSzsKKyAgICAgICAgLyogSWYgdGhlIGFwcGxpY2F0aW9uIGhhcyByZWdpc3RlcmVkIGEgInNlbnQiIGZ1bmN0aW9uIHRvIGJlCisgICAgICAgICAgIGNhbGxlZCB3aGVuIG5ldyBzZW5kIGJ1ZmZlciBzcGFjZSBpcyBhdmFpbGFibGUsIHdlIGNhbGwgaXQKKyAgICAgICAgICAgbm93LiAqLworICAgICAgICBpZiAocGNiLT5hY2tlZCA+IDApIHsKKyAgICAgICAgICBUQ1BfRVZFTlRfU0VOVChwY2IsIHBjYi0+YWNrZWQsIGVycik7CisgICAgICAgICAgaWYgKGVyciA9PSBFUlJfQUJSVCkgeworICAgICAgICAgICAgZ290byBhYm9ydGVkOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWN2X2RhdGEgIT0gTlVMTCkgeworICAgICAgICAgIExXSVBfQVNTRVJUKCJwY2ItPnJlZnVzZWRfZGF0YSA9PSBOVUxMIiwgcGNiLT5yZWZ1c2VkX2RhdGEgPT0gTlVMTCk7CisgICAgICAgICAgaWYgKHBjYi0+ZmxhZ3MgJiBURl9SWENMT1NFRCkgeworICAgICAgICAgICAgLyogcmVjZWl2ZWQgZGF0YSBhbHRob3VnaCBhbHJlYWR5IGNsb3NlZCAtPiBhYm9ydCAoc2VuZCBSU1QpIHRvCisgICAgICAgICAgICAgICBub3RpZnkgdGhlIHJlbW90ZSBob3N0IHRoYXQgbm90IGFsbCBkYXRhIGhhcyBiZWVuIHByb2Nlc3NlZCAqLworICAgICAgICAgICAgcGJ1Zl9mcmVlKHJlY3ZfZGF0YSk7CisgICAgICAgICAgICB0Y3BfYWJvcnQocGNiKTsKKyAgICAgICAgICAgIGdvdG8gYWJvcnRlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGZsYWdzICYgVENQX1BTSCkgeworICAgICAgICAgICAgcmVjdl9kYXRhLT5mbGFncyB8PSBQQlVGX0ZMQUdfUFVTSDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBOb3RpZnkgYXBwbGljYXRpb24gdGhhdCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLiAqLworICAgICAgICAgIFRDUF9FVkVOVF9SRUNWKHBjYiwgcmVjdl9kYXRhLCBFUlJfT0ssIGVycik7CisgICAgICAgICAgaWYgKGVyciA9PSBFUlJfQUJSVCkgeworICAgICAgICAgICAgZ290byBhYm9ydGVkOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIElmIHRoZSB1cHBlciBsYXllciBjYW4ndCByZWNlaXZlIHRoaXMgZGF0YSwgc3RvcmUgaXQgKi8KKyAgICAgICAgICBpZiAoZXJyICE9IEVSUl9PSykgeworICAgICAgICAgICAgcGNiLT5yZWZ1c2VkX2RhdGEgPSByZWN2X2RhdGE7CisgICAgICAgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX2lucHV0OiBrZWVwIGluY29taW5nIHBhY2tldCwgYmVjYXVzZSBwY2IgaXMgXCJmdWxsXCJcbiIpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiBhIEZJTiBzZWdtZW50IHdhcyByZWNlaXZlZCwgd2UgY2FsbCB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgZnVuY3Rpb24gd2l0aCBhIE5VTEwgYnVmZmVyIHRvIGluZGljYXRlIEVPRi4gKi8KKyAgICAgICAgaWYgKHJlY3ZfZmxhZ3MgJiBURl9HT1RfRklOKSB7CisgICAgICAgICAgLyogY29ycmVjdCByY3Zfd25kIGFzIHRoZSBhcHBsaWNhdGlvbiB3b24ndCBjYWxsIHRjcF9yZWN2ZWQoKQorICAgICAgICAgICAgIGZvciB0aGUgRklOJ3Mgc2Vxbm8gKi8KKyAgICAgICAgICBpZiAocGNiLT5yY3Zfd25kICE9IFRDUF9XTkQpIHsKKyAgICAgICAgICAgIHBjYi0+cmN2X3duZCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBUQ1BfRVZFTlRfQ0xPU0VEKHBjYiwgZXJyKTsKKyAgICAgICAgICBpZiAoZXJyID09IEVSUl9BQlJUKSB7CisgICAgICAgICAgICBnb3RvIGFib3J0ZWQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGNwX2lucHV0X3BjYiA9IE5VTEw7CisgICAgICAgIC8qIFRyeSB0byBzZW5kIHNvbWV0aGluZyBvdXQuICovCisgICAgICAgIHRjcF9vdXRwdXQocGNiKTsKKyNpZiBUQ1BfSU5QVVRfREVCVUcKKyNpZiBUQ1BfREVCVUcKKyAgICAgICAgdGNwX2RlYnVnX3ByaW50X3N0YXRlKHBjYi0+c3RhdGUpOworI2VuZGlmIC8qIFRDUF9ERUJVRyAqLworI2VuZGlmIC8qIFRDUF9JTlBVVF9ERUJVRyAqLworICAgICAgfQorICAgIH0KKyAgICAvKiBKdW1wIHRhcmdldCBpZiBwY2IgaGFzIGJlZW4gYWJvcnRlZCBpbiBhIGNhbGxiYWNrIChieSBjYWxsaW5nIHRjcF9hYm9ydCgpKS4KKyAgICAgICBCZWxvdyB0aGlzIGxpbmUsICdwY2InIG1heSBub3QgYmUgZGVyZWZlcmVuY2VkISAqLworYWJvcnRlZDoKKyAgICB0Y3BfaW5wdXRfcGNiID0gTlVMTDsKKyAgICByZWN2X2RhdGEgPSBOVUxMOworCisgICAgLyogZ2l2ZSB1cCBvdXIgcmVmZXJlbmNlIHRvIGluc2VnLnAgKi8KKyAgICBpZiAoaW5zZWcucCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHBidWZfZnJlZShpbnNlZy5wKTsKKyAgICAgIGluc2VnLnAgPSBOVUxMOworICAgIH0KKyAgfSBlbHNlIHsKKworICAgIC8qIElmIG5vIG1hdGNoaW5nIFBDQiB3YXMgZm91bmQsIHNlbmQgYSBUQ1AgUlNUIChyZXNldCkgdG8gdGhlCisgICAgICAgc2VuZGVyLiAqLworICAgIExXSVBfREVCVUdGKFRDUF9SU1RfREVCVUcsICgidGNwX2lucHV0OiBubyBQQ0IgbWF0Y2ggZm91bmQsIHJlc2V0dGluZy5cbiIpKTsKKyAgICBpZiAoIShUQ1BIX0ZMQUdTKHRjcGhkcikgJiBUQ1BfUlNUKSkgeworICAgICAgVENQX1NUQVRTX0lOQyh0Y3AucHJvdGVycik7CisgICAgICBUQ1BfU1RBVFNfSU5DKHRjcC5kcm9wKTsKKyAgICAgIHRjcF9yc3QoYWNrbm8sIHNlcW5vICsgdGNwbGVuLAorICAgICAgICBpcF9jdXJyZW50X2Rlc3RfYWRkcigpLCBpcF9jdXJyZW50X3NyY19hZGRyKCksCisgICAgICAgIHRjcGhkci0+ZGVzdCwgdGNwaGRyLT5zcmMpOworICAgIH0KKyAgICBwYnVmX2ZyZWUocCk7CisgIH0KKworICBMV0lQX0FTU0VSVCgidGNwX2lucHV0OiB0Y3BfcGNic19zYW5lKCkiLCB0Y3BfcGNic19zYW5lKCkpOworICBQRVJGX1NUT1AoInRjcF9pbnB1dCIpOworfQorCisvKioKKyAqIENhbGxlZCBieSB0Y3BfaW5wdXQoKSB3aGVuIGEgc2VnbWVudCBhcnJpdmVzIGZvciBhIGxpc3RlbmluZworICogY29ubmVjdGlvbiAoZnJvbSB0Y3BfaW5wdXQoKSkuCisgKgorICogQHBhcmFtIHBjYiB0aGUgdGNwX3BjYl9saXN0ZW4gZm9yIHdoaWNoIGEgc2VnbWVudCBhcnJpdmVkCisgKiBAcmV0dXJuIEVSUl9PSyBpZiB0aGUgc2VnbWVudCB3YXMgcHJvY2Vzc2VkCisgKiAgICAgICAgIGFub3RoZXIgZXJyX3Qgb24gZXJyb3IKKyAqCisgKiBAbm90ZSB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCAoeWV0PykgdXNlZCBpbiB0Y3BfaW5wdXQoKQorICogQG5vdGUgdGhlIHNlZ21lbnQgd2hpY2ggYXJyaXZlZCBpcyBzYXZlZCBpbiBnbG9iYWwgdmFyaWFibGVzLCB0aGVyZWZvcmUgb25seSB0aGUgcGNiCisgKiAgICAgICBpbnZvbHZlZCBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhpcyBmdW5jdGlvbgorICovCitzdGF0aWMgZXJyX3QKK3RjcF9saXN0ZW5faW5wdXQoc3RydWN0IHRjcF9wY2JfbGlzdGVuICpwY2IpCit7CisgIHN0cnVjdCB0Y3BfcGNiICpucGNiOworICBlcnJfdCByYzsKKworICAvKiBJbiB0aGUgTElTVEVOIHN0YXRlLCB3ZSBjaGVjayBmb3IgaW5jb21pbmcgU1lOIHNlZ21lbnRzLAorICAgICBjcmVhdGVzIGEgbmV3IFBDQiwgYW5kIHJlc3BvbmRzIHdpdGggYSBTWU58QUNLLiAqLworICBpZiAoZmxhZ3MgJiBUQ1BfQUNLKSB7CisgICAgLyogRm9yIGluY29taW5nIHNlZ21lbnRzIHdpdGggdGhlIEFDSyBmbGFnIHNldCwgcmVzcG9uZCB3aXRoIGEKKyAgICAgICBSU1QuICovCisgICAgTFdJUF9ERUJVR0YoVENQX1JTVF9ERUJVRywgKCJ0Y3BfbGlzdGVuX2lucHV0OiBBQ0sgaW4gTElTVEVOLCBzZW5kaW5nIHJlc2V0XG4iKSk7CisgICAgdGNwX3JzdChhY2tubyArIDEsIHNlcW5vICsgdGNwbGVuLAorICAgICAgaXBfY3VycmVudF9kZXN0X2FkZHIoKSwgaXBfY3VycmVudF9zcmNfYWRkcigpLAorICAgICAgdGNwaGRyLT5kZXN0LCB0Y3BoZHItPnNyYyk7CisgIH0gZWxzZSBpZiAoZmxhZ3MgJiBUQ1BfU1lOKSB7CisgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIlRDUCBjb25uZWN0aW9uIHJlcXVlc3QgJSJVMTZfRiIgLT4gJSJVMTZfRiIuXG4iLCB0Y3BoZHItPnNyYywgdGNwaGRyLT5kZXN0KSk7CisjaWYgVENQX0xJU1RFTl9CQUNLTE9HCisgICAgaWYgKHBjYi0+YWNjZXB0c19wZW5kaW5nID49IHBjYi0+YmFja2xvZykgeworICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9saXN0ZW5faW5wdXQ6IGxpc3RlbiBiYWNrbG9nIGV4Y2VlZGVkIGZvciBwb3J0ICUiVTE2X0YiXG4iLCB0Y3BoZHItPmRlc3QpKTsKKyAgICAgIHJldHVybiBFUlJfQUJSVDsKKyAgICB9CisjZW5kaWYgLyogVENQX0xJU1RFTl9CQUNLTE9HICovCisgICAgbnBjYiA9IHRjcF9hbGxvYyhwY2ItPnByaW8pOworICAgIC8qIElmIGEgbmV3IFBDQiBjb3VsZCBub3QgYmUgY3JlYXRlZCAocHJvYmFibHkgZHVlIHRvIGxhY2sgb2YgbWVtb3J5KSwKKyAgICAgICB3ZSBkb24ndCBkbyBhbnl0aGluZywgYnV0IHJlbHkgb24gdGhlIHNlbmRlciB3aWxsIHJldHJhbnNtaXQgdGhlCisgICAgICAgU1lOIGF0IGEgdGltZSB3aGVuIHdlIGhhdmUgbW9yZSBtZW1vcnkgYXZhaWxhYmxlLiAqLworICAgIGlmIChucGNiID09IE5VTEwpIHsKKyAgICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3BfbGlzdGVuX2lucHV0OiBjb3VsZCBub3QgYWxsb2NhdGUgUENCXG4iKSk7CisgICAgICBUQ1BfU1RBVFNfSU5DKHRjcC5tZW1lcnIpOworICAgICAgcmV0dXJuIEVSUl9NRU07CisgICAgfQorI2lmIFRDUF9MSVNURU5fQkFDS0xPRworICAgIHBjYi0+YWNjZXB0c19wZW5kaW5nKys7CisjZW5kaWYgLyogVENQX0xJU1RFTl9CQUNLTE9HICovCisgICAgLyogU2V0IHVwIHRoZSBuZXcgUENCLiAqLworICAgIGlwX2FkZHJfY29weShucGNiLT5sb2NhbF9pcCwgY3VycmVudF9pcGhkcl9kZXN0KTsKKyAgICBucGNiLT5sb2NhbF9wb3J0ID0gcGNiLT5sb2NhbF9wb3J0OworICAgIGlwX2FkZHJfY29weShucGNiLT5yZW1vdGVfaXAsIGN1cnJlbnRfaXBoZHJfc3JjKTsKKyAgICBucGNiLT5yZW1vdGVfcG9ydCA9IHRjcGhkci0+c3JjOworICAgIG5wY2ItPnN0YXRlID0gU1lOX1JDVkQ7CisgICAgbnBjYi0+cmN2X254dCA9IHNlcW5vICsgMTsKKyAgICBucGNiLT5yY3ZfYW5uX3JpZ2h0X2VkZ2UgPSBucGNiLT5yY3Zfbnh0OworICAgIG5wY2ItPnNuZF93bmQgPSB0Y3BoZHItPnduZDsKKyAgICBucGNiLT5zc3RocmVzaCA9IG5wY2ItPnNuZF93bmQ7CisgICAgbnBjYi0+c25kX3dsMSA9IHNlcW5vIC0gMTsvKiBpbml0aWFsaXNlIHRvIHNlcW5vLTEgdG8gZm9yY2Ugd2luZG93IHVwZGF0ZSAqLworICAgIG5wY2ItPmNhbGxiYWNrX2FyZyA9IHBjYi0+Y2FsbGJhY2tfYXJnOworI2lmIExXSVBfQ0FMTEJBQ0tfQVBJCisgICAgbnBjYi0+YWNjZXB0ID0gcGNiLT5hY2NlcHQ7CisjZW5kaWYgLyogTFdJUF9DQUxMQkFDS19BUEkgKi8KKyAgICAvKiBpbmhlcml0IHNvY2tldCBvcHRpb25zICovCisgICAgbnBjYi0+c29fb3B0aW9ucyA9IHBjYi0+c29fb3B0aW9ucyAmIFNPRl9JTkhFUklURUQ7CisgICAgLyogUmVnaXN0ZXIgdGhlIG5ldyBQQ0Igc28gdGhhdCB3ZSBjYW4gYmVnaW4gcmVjZWl2aW5nIHNlZ21lbnRzCisgICAgICAgZm9yIGl0LiAqLworICAgIFRDUF9SRUcoJnRjcF9hY3RpdmVfcGNicywgbnBjYik7CisKKyAgICAvKiBQYXJzZSBhbnkgb3B0aW9ucyBpbiB0aGUgU1lOLiAqLworICAgIHRjcF9wYXJzZW9wdChucGNiKTsKKyNpZiBUQ1BfQ0FMQ1VMQVRFX0VGRl9TRU5EX01TUworICAgIG5wY2ItPm1zcyA9IHRjcF9lZmZfc2VuZF9tc3MobnBjYi0+bXNzLCAmKG5wY2ItPnJlbW90ZV9pcCkpOworI2VuZGlmIC8qIFRDUF9DQUxDVUxBVEVfRUZGX1NFTkRfTVNTICovCisKKyAgICBzbm1wX2luY190Y3BwYXNzaXZlb3BlbnMoKTsKKworICAgIC8qIFNlbmQgYSBTWU58QUNLIHRvZ2V0aGVyIHdpdGggdGhlIE1TUyBvcHRpb24uICovCisgICAgcmMgPSB0Y3BfZW5xdWV1ZV9mbGFncyhucGNiLCBUQ1BfU1lOIHwgVENQX0FDSyk7CisgICAgaWYgKHJjICE9IEVSUl9PSykgeworICAgICAgdGNwX2FiYW5kb24obnBjYiwgMCk7CisgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIHJldHVybiB0Y3Bfb3V0cHV0KG5wY2IpOworICB9CisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogQ2FsbGVkIGJ5IHRjcF9pbnB1dCgpIHdoZW4gYSBzZWdtZW50IGFycml2ZXMgZm9yIGEgY29ubmVjdGlvbiBpbgorICogVElNRV9XQUlULgorICoKKyAqIEBwYXJhbSBwY2IgdGhlIHRjcF9wY2IgZm9yIHdoaWNoIGEgc2VnbWVudCBhcnJpdmVkCisgKgorICogQG5vdGUgdGhlIHNlZ21lbnQgd2hpY2ggYXJyaXZlZCBpcyBzYXZlZCBpbiBnbG9iYWwgdmFyaWFibGVzLCB0aGVyZWZvcmUgb25seSB0aGUgcGNiCisgKiAgICAgICBpbnZvbHZlZCBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhpcyBmdW5jdGlvbgorICovCitzdGF0aWMgZXJyX3QKK3RjcF90aW1ld2FpdF9pbnB1dChzdHJ1Y3QgdGNwX3BjYiAqcGNiKQoreworICAvKiBSRkMgMTMzNzogaW4gVElNRV9XQUlULCBpZ25vcmUgUlNUIGFuZCBBQ0sgRklOcyArIGFueSAnYWNjZXB0YWJsZScgc2VnbWVudHMgKi8KKyAgLyogUkZDIDc5MyAzLjkgRXZlbnQgUHJvY2Vzc2luZyAtIFNlZ21lbnQgQXJyaXZlczoKKyAgICogLSBmaXJzdCBjaGVjayBzZXF1ZW5jZSBudW1iZXIgLSB3ZSBza2lwIHRoYXQgb25lIGluIFRJTUVfV0FJVCAoYWx3YXlzCisgICAqICAgYWNjZXB0YWJsZSBzaW5jZSB3ZSBvbmx5IHNlbmQgQUNLcykKKyAgICogLSBzZWNvbmQgY2hlY2sgdGhlIFJTVCBiaXQgKC4uLiByZXR1cm4pICovCisgIGlmIChmbGFncyAmIFRDUF9SU1QpICB7CisgICAgcmV0dXJuIEVSUl9PSzsKKyAgfQorICAvKiAtIGZvdXJ0aCwgY2hlY2sgdGhlIFNZTiBiaXQsICovCisgIGlmIChmbGFncyAmIFRDUF9TWU4pIHsKKyAgICAvKiBJZiBhbiBpbmNvbWluZyBzZWdtZW50IGlzIG5vdCBhY2NlcHRhYmxlLCBhbiBhY2tub3dsZWRnbWVudAorICAgICAgIHNob3VsZCBiZSBzZW50IGluIHJlcGx5ICovCisgICAgaWYgKFRDUF9TRVFfQkVUV0VFTihzZXFubywgcGNiLT5yY3Zfbnh0LCBwY2ItPnJjdl9ueHQrcGNiLT5yY3Zfd25kKSkgeworICAgICAgLyogSWYgdGhlIFNZTiBpcyBpbiB0aGUgd2luZG93IGl0IGlzIGFuIGVycm9yLCBzZW5kIGEgcmVzZXQgKi8KKyAgICAgIHRjcF9yc3QoYWNrbm8sIHNlcW5vICsgdGNwbGVuLCBpcF9jdXJyZW50X2Rlc3RfYWRkcigpLCBpcF9jdXJyZW50X3NyY19hZGRyKCksCisgICAgICAgIHRjcGhkci0+ZGVzdCwgdGNwaGRyLT5zcmMpOworICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICB9CisgIH0gZWxzZSBpZiAoZmxhZ3MgJiBUQ1BfRklOKSB7CisgICAgLyogLSBlaWdodGgsIGNoZWNrIHRoZSBGSU4gYml0OiBSZW1haW4gaW4gdGhlIFRJTUUtV0FJVCBzdGF0ZS4KKyAgICAgICAgIFJlc3RhcnQgdGhlIDIgTVNMIHRpbWUtd2FpdCB0aW1lb3V0LiovCisgICAgcGNiLT50bXIgPSB0Y3BfdGlja3M7CisgIH0KKworICBpZiAoKHRjcGxlbiA+IDApKSAgeworICAgIC8qIEFja25vd2xlZGdlIGRhdGEsIEZJTiBvciBvdXQtb2Ytd2luZG93IFNZTiAqLworICAgIHBjYi0+ZmxhZ3MgfD0gVEZfQUNLX05PVzsKKyAgICByZXR1cm4gdGNwX291dHB1dChwY2IpOworICB9CisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogSW1wbGVtZW50cyB0aGUgVENQIHN0YXRlIG1hY2hpbmUuIENhbGxlZCBieSB0Y3BfaW5wdXQuIEluIHNvbWUKKyAqIHN0YXRlcyB0Y3BfcmVjZWl2ZSgpIGlzIGNhbGxlZCB0byByZWNlaXZlIGRhdGEuIFRoZSB0Y3Bfc2VnCisgKiBhcmd1bWVudCB3aWxsIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgKHRjcF9pbnB1dCgpKSB1bmxlc3MgdGhlCisgKiByZWN2X2RhdGEgcG9pbnRlciBpbiB0aGUgcGNiIGlzIHNldC4KKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB0Y3BfcGNiIGZvciB3aGljaCBhIHNlZ21lbnQgYXJyaXZlZAorICoKKyAqIEBub3RlIHRoZSBzZWdtZW50IHdoaWNoIGFycml2ZWQgaXMgc2F2ZWQgaW4gZ2xvYmFsIHZhcmlhYmxlcywgdGhlcmVmb3JlIG9ubHkgdGhlIHBjYgorICogICAgICAgaW52b2x2ZWQgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24KKyAqLworc3RhdGljIGVycl90Cit0Y3BfcHJvY2VzcyhzdHJ1Y3QgdGNwX3BjYiAqcGNiKQoreworICBzdHJ1Y3QgdGNwX3NlZyAqcnNlZzsKKyAgdThfdCBhY2NlcHRhYmxlID0gMDsKKyAgZXJyX3QgZXJyOworCisgIGVyciA9IEVSUl9PSzsKKworICAvKiBQcm9jZXNzIGluY29taW5nIFJTVCBzZWdtZW50cy4gKi8KKyAgaWYgKGZsYWdzICYgVENQX1JTVCkgeworICAgIC8qIEZpcnN0LCBkZXRlcm1pbmUgaWYgdGhlIHJlc2V0IGlzIGFjY2VwdGFibGUuICovCisgICAgaWYgKHBjYi0+c3RhdGUgPT0gU1lOX1NFTlQpIHsKKyAgICAgIGlmIChhY2tubyA9PSBwY2ItPnNuZF9ueHQpIHsKKyAgICAgICAgYWNjZXB0YWJsZSA9IDE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChUQ1BfU0VRX0JFVFdFRU4oc2Vxbm8sIHBjYi0+cmN2X254dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBjYi0+cmN2X254dCtwY2ItPnJjdl93bmQpKSB7CisgICAgICAgIGFjY2VwdGFibGUgPSAxOworICAgICAgfQorICAgIH0KKworICAgIGlmIChhY2NlcHRhYmxlKSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX3Byb2Nlc3M6IENvbm5lY3Rpb24gUkVTRVRcbiIpKTsKKyAgICAgIExXSVBfQVNTRVJUKCJ0Y3BfaW5wdXQ6IHBjYi0+c3RhdGUgIT0gQ0xPU0VEIiwgcGNiLT5zdGF0ZSAhPSBDTE9TRUQpOworICAgICAgcmVjdl9mbGFncyB8PSBURl9SRVNFVDsKKyAgICAgIHBjYi0+ZmxhZ3MgJj0gflRGX0FDS19ERUxBWTsKKyAgICAgIHJldHVybiBFUlJfUlNUOworICAgIH0gZWxzZSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX3Byb2Nlc3M6IHVuYWNjZXB0YWJsZSByZXNldCBzZXFubyAlIlUzMl9GIiByY3Zfbnh0ICUiVTMyX0YiXG4iLAorICAgICAgIHNlcW5vLCBwY2ItPnJjdl9ueHQpKTsKKyAgICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3BfcHJvY2VzczogdW5hY2NlcHRhYmxlIHJlc2V0IHNlcW5vICUiVTMyX0YiIHJjdl9ueHQgJSJVMzJfRiJcbiIsCisgICAgICAgc2Vxbm8sIHBjYi0+cmN2X254dCkpOworICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICB9CisgIH0KKworICBpZiAoKGZsYWdzICYgVENQX1NZTikgJiYgKHBjYi0+c3RhdGUgIT0gU1lOX1NFTlQgJiYgcGNiLT5zdGF0ZSAhPSBTWU5fUkNWRCkpIHsgCisgICAgLyogQ29wZSB3aXRoIG5ldyBjb25uZWN0aW9uIGF0dGVtcHQgYWZ0ZXIgcmVtb3RlIGVuZCBjcmFzaGVkICovCisgICAgdGNwX2Fja19ub3cocGNiKTsKKyAgICByZXR1cm4gRVJSX09LOworICB9CisgIAorICBpZiAoKHBjYi0+ZmxhZ3MgJiBURl9SWENMT1NFRCkgPT0gMCkgeworICAgIC8qIFVwZGF0ZSB0aGUgUENCIChpbilhY3Rpdml0eSB0aW1lciB1bmxlc3MgcnggaXMgY2xvc2VkIChzZWUgdGNwX3NodXRkb3duKSAqLworICAgIHBjYi0+dG1yID0gdGNwX3RpY2tzOworICB9CisgIHBjYi0+a2VlcF9jbnRfc2VudCA9IDA7CisKKyAgdGNwX3BhcnNlb3B0KHBjYik7CisKKyAgLyogRG8gZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24gdGhlIFRDUCBzdGF0ZS4gKi8KKyAgc3dpdGNoIChwY2ItPnN0YXRlKSB7CisgIGNhc2UgU1lOX1NFTlQ6CisgICAgTFdJUF9ERUJVR0YoVENQX0lOUFVUX0RFQlVHLCAoIlNZTi1TRU5UOiBhY2tubyAlIlUzMl9GIiBwY2ItPnNuZF9ueHQgJSJVMzJfRiIgdW5hY2tlZCAlIlUzMl9GIlxuIiwgYWNrbm8sCisgICAgIHBjYi0+c25kX254dCwgbnRvaGwocGNiLT51bmFja2VkLT50Y3BoZHItPnNlcW5vKSkpOworICAgIC8qIHJlY2VpdmVkIFNZTiBBQ0sgd2l0aCBleHBlY3RlZCBzZXF1ZW5jZSBudW1iZXI/ICovCisgICAgaWYgKChmbGFncyAmIFRDUF9BQ0spICYmIChmbGFncyAmIFRDUF9TWU4pCisgICAgICAgICYmIGFja25vID09IG50b2hsKHBjYi0+dW5hY2tlZC0+dGNwaGRyLT5zZXFubykgKyAxKSB7CisgICAgICBwY2ItPnNuZF9idWYrKzsKKyAgICAgIHBjYi0+cmN2X254dCA9IHNlcW5vICsgMTsKKyAgICAgIHBjYi0+cmN2X2Fubl9yaWdodF9lZGdlID0gcGNiLT5yY3Zfbnh0OworICAgICAgcGNiLT5sYXN0YWNrID0gYWNrbm87CisgICAgICBwY2ItPnNuZF93bmQgPSB0Y3BoZHItPnduZDsKKyAgICAgIHBjYi0+c25kX3dsMSA9IHNlcW5vIC0gMTsgLyogaW5pdGlhbGlzZSB0byBzZXFubyAtIDEgdG8gZm9yY2Ugd2luZG93IHVwZGF0ZSAqLworICAgICAgcGNiLT5zdGF0ZSA9IEVTVEFCTElTSEVEOworCisjaWYgVENQX0NBTENVTEFURV9FRkZfU0VORF9NU1MKKyAgICAgIHBjYi0+bXNzID0gdGNwX2VmZl9zZW5kX21zcyhwY2ItPm1zcywgJihwY2ItPnJlbW90ZV9pcCkpOworI2VuZGlmIC8qIFRDUF9DQUxDVUxBVEVfRUZGX1NFTkRfTVNTICovCisKKyAgICAgIC8qIFNldCBzc3RocmVzaCBhZ2FpbiBhZnRlciBjaGFuZ2luZyBwY2ItPm1zcyAoYWxyZWFkeSBzZXQgaW4gdGNwX2Nvbm5lY3QKKyAgICAgICAqIGJ1dCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgcGNiLT5tc3MpICovCisgICAgICBwY2ItPnNzdGhyZXNoID0gcGNiLT5tc3MgKiAxMDsKKworICAgICAgcGNiLT5jd25kID0gKChwY2ItPmN3bmQgPT0gMSkgPyAocGNiLT5tc3MgKiAyKSA6IHBjYi0+bXNzKTsKKyAgICAgIExXSVBfQVNTRVJUKCJwY2ItPnNuZF9xdWV1ZWxlbiA+IDAiLCAocGNiLT5zbmRfcXVldWVsZW4gPiAwKSk7CisgICAgICAtLXBjYi0+c25kX3F1ZXVlbGVuOworICAgICAgTFdJUF9ERUJVR0YoVENQX1FMRU5fREVCVUcsICgidGNwX3Byb2Nlc3M6IFNZTi1TRU5UIC0tcXVldWVsZW4gJSJVMTZfRiJcbiIsICh1MTZfdClwY2ItPnNuZF9xdWV1ZWxlbikpOworICAgICAgcnNlZyA9IHBjYi0+dW5hY2tlZDsKKyAgICAgIHBjYi0+dW5hY2tlZCA9IHJzZWctPm5leHQ7CisKKyAgICAgIC8qIElmIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGFja25vd2xlZGdlLCBzdG9wIHRoZSByZXRyYW5zbWl0CisgICAgICAgICB0aW1lciwgb3RoZXJ3aXNlIHJlc2V0IGl0IHRvIHN0YXJ0IGFnYWluICovCisgICAgICBpZihwY2ItPnVuYWNrZWQgPT0gTlVMTCkKKyAgICAgICAgcGNiLT5ydGltZSA9IC0xOworICAgICAgZWxzZSB7CisgICAgICAgIHBjYi0+cnRpbWUgPSAwOworICAgICAgICBwY2ItPm5ydHggPSAwOworICAgICAgfQorCisgICAgICB0Y3Bfc2VnX2ZyZWUocnNlZyk7CisKKyAgICAgIC8qIENhbGwgdGhlIHVzZXIgc3BlY2lmaWVkIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBzdWNlc3NmdWxseQorICAgICAgICogY29ubmVjdGVkLiAqLworICAgICAgVENQX0VWRU5UX0NPTk5FQ1RFRChwY2IsIEVSUl9PSywgZXJyKTsKKyAgICAgIGlmIChlcnIgPT0gRVJSX0FCUlQpIHsKKyAgICAgICAgcmV0dXJuIEVSUl9BQlJUOworICAgICAgfQorICAgICAgdGNwX2Fja19ub3cocGNiKTsKKyAgICB9CisgICAgLyogcmVjZWl2ZWQgQUNLPyBwb3NzaWJseSBhIGhhbGYtb3BlbiBjb25uZWN0aW9uICovCisgICAgZWxzZSBpZiAoZmxhZ3MgJiBUQ1BfQUNLKSB7CisgICAgICAvKiBzZW5kIGEgUlNUIHRvIGJyaW5nIHRoZSBvdGhlciBzaWRlIGluIGEgbm9uLXN5bmNocm9uaXplZCBzdGF0ZS4gKi8KKyAgICAgIHRjcF9yc3QoYWNrbm8sIHNlcW5vICsgdGNwbGVuLCBpcF9jdXJyZW50X2Rlc3RfYWRkcigpLCBpcF9jdXJyZW50X3NyY19hZGRyKCksCisgICAgICAgIHRjcGhkci0+ZGVzdCwgdGNwaGRyLT5zcmMpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBTWU5fUkNWRDoKKyAgICBpZiAoZmxhZ3MgJiBUQ1BfQUNLKSB7CisgICAgICAvKiBleHBlY3RlZCBBQ0sgbnVtYmVyPyAqLworICAgICAgaWYgKFRDUF9TRVFfQkVUV0VFTihhY2tubywgcGNiLT5sYXN0YWNrKzEsIHBjYi0+c25kX254dCkpIHsKKyAgICAgICAgdTE2X3Qgb2xkX2N3bmQ7CisgICAgICAgIHBjYi0+c3RhdGUgPSBFU1RBQkxJU0hFRDsKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIlRDUCBjb25uZWN0aW9uIGVzdGFibGlzaGVkICUiVTE2X0YiIC0+ICUiVTE2X0YiLlxuIiwgaW5zZWcudGNwaGRyLT5zcmMsIGluc2VnLnRjcGhkci0+ZGVzdCkpOworI2lmIExXSVBfQ0FMTEJBQ0tfQVBJCisgICAgICAgIExXSVBfQVNTRVJUKCJwY2ItPmFjY2VwdCAhPSBOVUxMIiwgcGNiLT5hY2NlcHQgIT0gTlVMTCk7CisjZW5kaWYKKyAgICAgICAgLyogQ2FsbCB0aGUgYWNjZXB0IGZ1bmN0aW9uLiAqLworICAgICAgICBUQ1BfRVZFTlRfQUNDRVBUKHBjYiwgRVJSX09LLCBlcnIpOworICAgICAgICBpZiAoZXJyICE9IEVSUl9PSykgeworICAgICAgICAgIC8qIElmIHRoZSBhY2NlcHQgZnVuY3Rpb24gcmV0dXJucyB3aXRoIGFuIGVycm9yLCB3ZSBhYm9ydAorICAgICAgICAgICAqIHRoZSBjb25uZWN0aW9uLiAqLworICAgICAgICAgIC8qIEFscmVhZHkgYWJvcnRlZD8gKi8KKyAgICAgICAgICBpZiAoZXJyICE9IEVSUl9BQlJUKSB7CisgICAgICAgICAgICB0Y3BfYWJvcnQocGNiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIEVSUl9BQlJUOworICAgICAgICB9CisgICAgICAgIG9sZF9jd25kID0gcGNiLT5jd25kOworICAgICAgICAvKiBJZiB0aGVyZSB3YXMgYW55IGRhdGEgY29udGFpbmVkIHdpdGhpbiB0aGlzIEFDSywKKyAgICAgICAgICogd2UnZCBiZXR0ZXIgcGFzcyBpdCBvbiB0byB0aGUgYXBwbGljYXRpb24gYXMgd2VsbC4gKi8KKyAgICAgICAgdGNwX3JlY2VpdmUocGNiKTsKKworICAgICAgICAvKiBQcmV2ZW50IEFDSyBmb3IgU1lOIHRvIGdlbmVyYXRlIGEgc2VudCBldmVudCAqLworICAgICAgICBpZiAocGNiLT5hY2tlZCAhPSAwKSB7CisgICAgICAgICAgcGNiLT5hY2tlZC0tOworICAgICAgICB9CisKKyAgICAgICAgcGNiLT5jd25kID0gKChvbGRfY3duZCA9PSAxKSA/IChwY2ItPm1zcyAqIDIpIDogcGNiLT5tc3MpOworCisgICAgICAgIGlmIChyZWN2X2ZsYWdzICYgVEZfR09UX0ZJTikgeworICAgICAgICAgIHRjcF9hY2tfbm93KHBjYik7CisgICAgICAgICAgcGNiLT5zdGF0ZSA9IENMT1NFX1dBSVQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGluY29ycmVjdCBBQ0sgbnVtYmVyLCBzZW5kIFJTVCAqLworICAgICAgICB0Y3BfcnN0KGFja25vLCBzZXFubyArIHRjcGxlbiwgaXBfY3VycmVudF9kZXN0X2FkZHIoKSwgaXBfY3VycmVudF9zcmNfYWRkcigpLAorICAgICAgICAgICAgICAgIHRjcGhkci0+ZGVzdCwgdGNwaGRyLT5zcmMpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgVENQX1NZTikgJiYgKHNlcW5vID09IHBjYi0+cmN2X254dCAtIDEpKSB7CisgICAgICAvKiBMb29rcyBsaWtlIGFub3RoZXIgY29weSBvZiB0aGUgU1lOIC0gcmV0cmFuc21pdCBvdXIgU1lOLUFDSyAqLworICAgICAgdGNwX3JleG1pdChwY2IpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBDTE9TRV9XQUlUOgorICAgIC8qIEZBTExUSFJPVUdIICovCisgIGNhc2UgRVNUQUJMSVNIRUQ6CisgICAgdGNwX3JlY2VpdmUocGNiKTsKKyAgICBpZiAocmVjdl9mbGFncyAmIFRGX0dPVF9GSU4pIHsgLyogcGFzc2l2ZSBjbG9zZSAqLworICAgICAgdGNwX2Fja19ub3cocGNiKTsKKyAgICAgIHBjYi0+c3RhdGUgPSBDTE9TRV9XQUlUOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBGSU5fV0FJVF8xOgorICAgIHRjcF9yZWNlaXZlKHBjYik7CisgICAgaWYgKHJlY3ZfZmxhZ3MgJiBURl9HT1RfRklOKSB7CisgICAgICBpZiAoKGZsYWdzICYgVENQX0FDSykgJiYgKGFja25vID09IHBjYi0+c25kX254dCkpIHsKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLAorICAgICAgICAgICgiVENQIGNvbm5lY3Rpb24gY2xvc2VkOiBGSU5fV0FJVF8xICUiVTE2X0YiIC0+ICUiVTE2X0YiLlxuIiwgaW5zZWcudGNwaGRyLT5zcmMsIGluc2VnLnRjcGhkci0+ZGVzdCkpOworICAgICAgICB0Y3BfYWNrX25vdyhwY2IpOworICAgICAgICB0Y3BfcGNiX3B1cmdlKHBjYik7CisgICAgICAgIFRDUF9STVYoJnRjcF9hY3RpdmVfcGNicywgcGNiKTsKKyAgICAgICAgcGNiLT5zdGF0ZSA9IFRJTUVfV0FJVDsKKyAgICAgICAgVENQX1JFRygmdGNwX3R3X3BjYnMsIHBjYik7CisgICAgICB9IGVsc2UgeworICAgICAgICB0Y3BfYWNrX25vdyhwY2IpOworICAgICAgICBwY2ItPnN0YXRlID0gQ0xPU0lORzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChmbGFncyAmIFRDUF9BQ0spICYmIChhY2tubyA9PSBwY2ItPnNuZF9ueHQpKSB7CisgICAgICBwY2ItPnN0YXRlID0gRklOX1dBSVRfMjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgRklOX1dBSVRfMjoKKyAgICB0Y3BfcmVjZWl2ZShwY2IpOworICAgIGlmIChyZWN2X2ZsYWdzICYgVEZfR09UX0ZJTikgeworICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIlRDUCBjb25uZWN0aW9uIGNsb3NlZDogRklOX1dBSVRfMiAlIlUxNl9GIiAtPiAlIlUxNl9GIi5cbiIsIGluc2VnLnRjcGhkci0+c3JjLCBpbnNlZy50Y3BoZHItPmRlc3QpKTsKKyAgICAgIHRjcF9hY2tfbm93KHBjYik7CisgICAgICB0Y3BfcGNiX3B1cmdlKHBjYik7CisgICAgICBUQ1BfUk1WKCZ0Y3BfYWN0aXZlX3BjYnMsIHBjYik7CisgICAgICBwY2ItPnN0YXRlID0gVElNRV9XQUlUOworICAgICAgVENQX1JFRygmdGNwX3R3X3BjYnMsIHBjYik7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIENMT1NJTkc6CisgICAgdGNwX3JlY2VpdmUocGNiKTsKKyAgICBpZiAoZmxhZ3MgJiBUQ1BfQUNLICYmIGFja25vID09IHBjYi0+c25kX254dCkgeworICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIlRDUCBjb25uZWN0aW9uIGNsb3NlZDogQ0xPU0lORyAlIlUxNl9GIiAtPiAlIlUxNl9GIi5cbiIsIGluc2VnLnRjcGhkci0+c3JjLCBpbnNlZy50Y3BoZHItPmRlc3QpKTsKKyAgICAgIHRjcF9wY2JfcHVyZ2UocGNiKTsKKyAgICAgIFRDUF9STVYoJnRjcF9hY3RpdmVfcGNicywgcGNiKTsKKyAgICAgIHBjYi0+c3RhdGUgPSBUSU1FX1dBSVQ7CisgICAgICBUQ1BfUkVHKCZ0Y3BfdHdfcGNicywgcGNiKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgTEFTVF9BQ0s6CisgICAgdGNwX3JlY2VpdmUocGNiKTsKKyAgICBpZiAoZmxhZ3MgJiBUQ1BfQUNLICYmIGFja25vID09IHBjYi0+c25kX254dCkgeworICAgICAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoIlRDUCBjb25uZWN0aW9uIGNsb3NlZDogTEFTVF9BQ0sgJSJVMTZfRiIgLT4gJSJVMTZfRiIuXG4iLCBpbnNlZy50Y3BoZHItPnNyYywgaW5zZWcudGNwaGRyLT5kZXN0KSk7CisgICAgICAvKiBidWdmaXggIzIxNjk5OiBkb24ndCBzZXQgcGNiLT5zdGF0ZSB0byBDTE9TRUQgaGVyZSBvciB3ZSByaXNrIGxlYWtpbmcgc2VnbWVudHMgKi8KKyAgICAgIHJlY3ZfZmxhZ3MgfD0gVEZfQ0xPU0VEOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gRVJSX09LOworfQorCisjaWYgVENQX1FVRVVFX09PU0VRCisvKioKKyAqIEluc2VydCBzZWdtZW50IGludG8gdGhlIGxpc3QgKHNlZ21lbnRzIGNvdmVyZWQgd2l0aCBuZXcgb25lIHdpbGwgYmUgZGVsZXRlZCkKKyAqCisgKiBDYWxsZWQgZnJvbSB0Y3BfcmVjZWl2ZSgpCisgKi8KK3N0YXRpYyB2b2lkCit0Y3Bfb29zX2luc2VydF9zZWdtZW50KHN0cnVjdCB0Y3Bfc2VnICpjc2VnLCBzdHJ1Y3QgdGNwX3NlZyAqbmV4dCkKK3sKKyAgc3RydWN0IHRjcF9zZWcgKm9sZF9zZWc7CisKKyAgaWYgKFRDUEhfRkxBR1MoY3NlZy0+dGNwaGRyKSAmIFRDUF9GSU4pIHsKKyAgICAvKiByZWNlaXZlZCBzZWdtZW50IG92ZXJsYXBzIGFsbCBmb2xsb3dpbmcgc2VnbWVudHMgKi8KKyAgICB0Y3Bfc2Vnc19mcmVlKG5leHQpOworICAgIG5leHQgPSBOVUxMOworICB9CisgIGVsc2UgeworICAgIC8qIGRlbGV0ZSBzb21lIGZvbGxvd2luZyBzZWdtZW50cworICAgICAgIG9vcyBxdWV1ZSBtYXkgaGF2ZSBzZWdtZW50cyB3aXRoIEZJTiBmbGFnICovCisgICAgd2hpbGUgKG5leHQgJiYKKyAgICAgICAgICAgVENQX1NFUV9HRVEoKHNlcW5vICsgY3NlZy0+bGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAobmV4dC0+dGNwaGRyLT5zZXFubyArIG5leHQtPmxlbikpKSB7CisgICAgICAvKiBjc2VnIHdpdGggRklOIGFscmVhZHkgcHJvY2Vzc2VkICovCisgICAgICBpZiAoVENQSF9GTEFHUyhuZXh0LT50Y3BoZHIpICYgVENQX0ZJTikgeworICAgICAgICBUQ1BIX1NFVF9GTEFHKGNzZWctPnRjcGhkciwgVENQX0ZJTik7CisgICAgICB9CisgICAgICBvbGRfc2VnID0gbmV4dDsKKyAgICAgIG5leHQgPSBuZXh0LT5uZXh0OworICAgICAgdGNwX3NlZ19mcmVlKG9sZF9zZWcpOworICAgIH0KKyAgICBpZiAobmV4dCAmJgorICAgICAgICBUQ1BfU0VRX0dUKHNlcW5vICsgY3NlZy0+bGVuLCBuZXh0LT50Y3BoZHItPnNlcW5vKSkgeworICAgICAgLyogV2UgbmVlZCB0byB0cmltIHRoZSBpbmNvbWluZyBzZWdtZW50LiAqLworICAgICAgY3NlZy0+bGVuID0gKHUxNl90KShuZXh0LT50Y3BoZHItPnNlcW5vIC0gc2Vxbm8pOworICAgICAgcGJ1Zl9yZWFsbG9jKGNzZWctPnAsIGNzZWctPmxlbik7CisgICAgfQorICB9CisgIGNzZWctPm5leHQgPSBuZXh0OworfQorI2VuZGlmIC8qIFRDUF9RVUVVRV9PT1NFUSAqLworCisvKioKKyAqIENhbGxlZCBieSB0Y3BfcHJvY2Vzcy4gQ2hlY2tzIGlmIHRoZSBnaXZlbiBzZWdtZW50IGlzIGFuIEFDSyBmb3Igb3V0c3RhbmRpbmcKKyAqIGRhdGEsIGFuZCBpZiBzbyBmcmVlcyB0aGUgbWVtb3J5IG9mIHRoZSBidWZmZXJlZCBkYXRhLiBOZXh0LCBpcyBwbGFjZXMgdGhlCisgKiBzZWdtZW50IG9uIGFueSBvZiB0aGUgcmVjZWl2ZSBxdWV1ZXMgKHBjYi0+cmVjdmVkIG9yIHBjYi0+b29zZXEpLiBJZiB0aGUgc2VnbWVudAorICogaXMgYnVmZmVyZWQsIHRoZSBwYnVmIGlzIHJlZmVyZW5jZWQgYnkgcGJ1Zl9yZWYgc28gdGhhdCBpdCB3aWxsIG5vdCBiZSBmcmVlZCB1bnRpbAorICogaSBpdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGJ1ZmZlci4KKyAqCisgKiBJZiB0aGUgaW5jb21pbmcgc2VnbWVudCBjb25zdGl0dXRlcyBhbiBBQ0sgZm9yIGEgc2VnbWVudCB0aGF0IHdhcyB1c2VkIGZvciBSVFQKKyAqIGVzdGltYXRpb24sIHRoZSBSVFQgaXMgZXN0aW1hdGVkIGhlcmUgYXMgd2VsbC4KKyAqCisgKiBDYWxsZWQgZnJvbSB0Y3BfcHJvY2VzcygpLgorICovCitzdGF0aWMgdm9pZAordGNwX3JlY2VpdmUoc3RydWN0IHRjcF9wY2IgKnBjYikKK3sKKyAgc3RydWN0IHRjcF9zZWcgKm5leHQ7CisjaWYgVENQX1FVRVVFX09PU0VRCisgIHN0cnVjdCB0Y3Bfc2VnICpwcmV2LCAqY3NlZzsKKyNlbmRpZiAvKiBUQ1BfUVVFVUVfT09TRVEgKi8KKyAgc3RydWN0IHBidWYgKnA7CisgIHMzMl90IG9mZjsKKyAgczE2X3QgbTsKKyAgdTMyX3QgcmlnaHRfd25kX2VkZ2U7CisgIHUxNl90IG5ld190b3RfbGVuOworICBpbnQgZm91bmRfZHVwYWNrID0gMDsKKworICBpZiAoZmxhZ3MgJiBUQ1BfQUNLKSB7CisgICAgcmlnaHRfd25kX2VkZ2UgPSBwY2ItPnNuZF93bmQgKyBwY2ItPnNuZF93bDI7CisKKyAgICAvKiBVcGRhdGUgd2luZG93LiAqLworICAgIGlmIChUQ1BfU0VRX0xUKHBjYi0+c25kX3dsMSwgc2Vxbm8pIHx8CisgICAgICAgKHBjYi0+c25kX3dsMSA9PSBzZXFubyAmJiBUQ1BfU0VRX0xUKHBjYi0+c25kX3dsMiwgYWNrbm8pKSB8fAorICAgICAgIChwY2ItPnNuZF93bDIgPT0gYWNrbm8gJiYgdGNwaGRyLT53bmQgPiBwY2ItPnNuZF93bmQpKSB7CisgICAgICBwY2ItPnNuZF93bmQgPSB0Y3BoZHItPnduZDsKKyAgICAgIHBjYi0+c25kX3dsMSA9IHNlcW5vOworICAgICAgcGNiLT5zbmRfd2wyID0gYWNrbm87CisgICAgICBpZiAocGNiLT5zbmRfd25kID4gMCAmJiBwY2ItPnBlcnNpc3RfYmFja29mZiA+IDApIHsKKyAgICAgICAgICBwY2ItPnBlcnNpc3RfYmFja29mZiA9IDA7CisgICAgICB9CisgICAgICBMV0lQX0RFQlVHRihUQ1BfV05EX0RFQlVHLCAoInRjcF9yZWNlaXZlOiB3aW5kb3cgdXBkYXRlICUiVTE2X0YiXG4iLCBwY2ItPnNuZF93bmQpKTsKKyNpZiBUQ1BfV05EX0RFQlVHCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwY2ItPnNuZF93bmQgIT0gdGNwaGRyLT53bmQpIHsKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX1dORF9ERUJVRywgCisgICAgICAgICAgICAgICAgICAgICgidGNwX3JlY2VpdmU6IG5vIHdpbmRvdyB1cGRhdGUgbGFzdGFjayAlIlUzMl9GIiBhY2tubyAlIgorICAgICAgICAgICAgICAgICAgICAgVTMyX0YiIHdsMSAlIlUzMl9GIiBzZXFubyAlIlUzMl9GIiB3bDIgJSJVMzJfRiJcbiIsCisgICAgICAgICAgICAgICAgICAgICBwY2ItPmxhc3RhY2ssIGFja25vLCBwY2ItPnNuZF93bDEsIHNlcW5vLCBwY2ItPnNuZF93bDIpKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBUQ1BfV05EX0RFQlVHICovCisgICAgfQorCisgICAgLyogKEZyb20gU3RldmVucyBUQ1AvSVAgSWxsdXN0cmF0ZWQgVm9sIElJLCBwOTcwLikgSXRzIG9ubHkgYQorICAgICAqIGR1cGxpY2F0ZSBhY2sgaWY6CisgICAgICogMSkgSXQgZG9lc24ndCBBQ0sgbmV3IGRhdGEgCisgICAgICogMikgbGVuZ3RoIG9mIHJlY2VpdmVkIHBhY2tldCBpcyB6ZXJvIChpLmUuIG5vIHBheWxvYWQpIAorICAgICAqIDMpIHRoZSBhZHZlcnRpc2VkIHdpbmRvdyBoYXNuJ3QgY2hhbmdlZCAKKyAgICAgKiA0KSBUaGVyZSBpcyBvdXRzdGFuZGluZyB1bmFja25vd2xlZGdlZCBkYXRhIChyZXRyYW5zbWlzc2lvbiB0aW1lciBydW5uaW5nKQorICAgICAqIDUpIFRoZSBBQ0sgaXMgPT0gYmlnZ2VzdCBBQ0sgc2VxdWVuY2UgbnVtYmVyIHNvIGZhciBzZWVuIChzbmRfdW5hKQorICAgICAqIAorICAgICAqIElmIGl0IHBhc3NlcyBhbGwgZml2ZSwgc2hvdWxkIHByb2Nlc3MgYXMgYSBkdXBhY2s6IAorICAgICAqIGEpIGR1cGFja3MgPCAzOiBkbyBub3RoaW5nIAorICAgICAqIGIpIGR1cGFja3MgPT0gMzogZmFzdCByZXRyYW5zbWl0IAorICAgICAqIGMpIGR1cGFja3MgPiAzOiBpbmNyZWFzZSBjd25kIAorICAgICAqIAorICAgICAqIElmIGl0IG9ubHkgcGFzc2VzIDEtMywgc2hvdWxkIHJlc2V0IGR1cGFjayBjb3VudGVyIChhbmQgYWRkIHRvCisgICAgICogc3RhdHMsIHdoaWNoIHdlIGRvbid0IGRvIGluIGx3SVApCisgICAgICoKKyAgICAgKiBJZiBpdCBvbmx5IHBhc3NlcyAxLCBzaG91bGQgcmVzZXQgZHVwYWNrIGNvdW50ZXIKKyAgICAgKgorICAgICAqLworCisgICAgLyogQ2xhdXNlIDEgKi8KKyAgICBpZiAoVENQX1NFUV9MRVEoYWNrbm8sIHBjYi0+bGFzdGFjaykpIHsKKyAgICAgIHBjYi0+YWNrZWQgPSAwOworICAgICAgLyogQ2xhdXNlIDIgKi8KKyAgICAgIGlmICh0Y3BsZW4gPT0gMCkgeworICAgICAgICAvKiBDbGF1c2UgMyAqLworICAgICAgICBpZiAocGNiLT5zbmRfd2wyICsgcGNiLT5zbmRfd25kID09IHJpZ2h0X3duZF9lZGdlKXsKKyAgICAgICAgICAvKiBDbGF1c2UgNCAqLworICAgICAgICAgIGlmIChwY2ItPnJ0aW1lID49IDApIHsKKyAgICAgICAgICAgIC8qIENsYXVzZSA1ICovCisgICAgICAgICAgICBpZiAocGNiLT5sYXN0YWNrID09IGFja25vKSB7CisgICAgICAgICAgICAgIGZvdW5kX2R1cGFjayA9IDE7CisgICAgICAgICAgICAgIGlmIChwY2ItPmR1cGFja3MgKyAxID4gcGNiLT5kdXBhY2tzKQorICAgICAgICAgICAgICAgICsrcGNiLT5kdXBhY2tzOworICAgICAgICAgICAgICBpZiAocGNiLT5kdXBhY2tzID4gMykgeworICAgICAgICAgICAgICAgIC8qIEluZmxhdGUgdGhlIGNvbmdlc3Rpb24gd2luZG93LCBidXQgbm90IGlmIGl0IG1lYW5zIHRoYXQKKyAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgb3ZlcmZsb3dzLiAqLworICAgICAgICAgICAgICAgIGlmICgodTE2X3QpKHBjYi0+Y3duZCArIHBjYi0+bXNzKSA+IHBjYi0+Y3duZCkgeworICAgICAgICAgICAgICAgICAgcGNiLT5jd25kICs9IHBjYi0+bXNzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChwY2ItPmR1cGFja3MgPT0gMykgeworICAgICAgICAgICAgICAgIC8qIERvIGZhc3QgcmV0cmFuc21pdCAqLworICAgICAgICAgICAgICAgIHRjcF9yZXhtaXRfZmFzdChwY2IpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBJZiBDbGF1c2UgKDEpIG9yIG1vcmUgaXMgdHJ1ZSwgYnV0IG5vdCBhIGR1cGxpY2F0ZSBhY2ssIHJlc2V0CisgICAgICAgKiBjb3VudCBvZiBjb25zZWN1dGl2ZSBkdXBsaWNhdGUgYWNrcyAqLworICAgICAgaWYgKCFmb3VuZF9kdXBhY2spIHsKKyAgICAgICAgcGNiLT5kdXBhY2tzID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFRDUF9TRVFfQkVUV0VFTihhY2tubywgcGNiLT5sYXN0YWNrKzEsIHBjYi0+c25kX254dCkpeworICAgICAgLyogV2UgY29tZSBoZXJlIHdoZW4gdGhlIEFDSyBhY2tub3dsZWRnZXMgbmV3IGRhdGEuICovCisKKyAgICAgIC8qIFJlc2V0IHRoZSAiSU4gRmFzdCBSZXRyYW5zbWl0IiBmbGFnLCBzaW5jZSB3ZSBhcmUgbm8gbG9uZ2VyCisgICAgICAgICBpbiBmYXN0IHJldHJhbnNtaXQuIEFsc28gcmVzZXQgdGhlIGNvbmdlc3Rpb24gd2luZG93IHRvIHRoZQorICAgICAgICAgc2xvdyBzdGFydCB0aHJlc2hvbGQuICovCisgICAgICBpZiAocGNiLT5mbGFncyAmIFRGX0lORlIpIHsKKyAgICAgICAgcGNiLT5mbGFncyAmPSB+VEZfSU5GUjsKKyAgICAgICAgcGNiLT5jd25kID0gcGNiLT5zc3RocmVzaDsKKyAgICAgIH0KKworICAgICAgLyogUmVzZXQgdGhlIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMuICovCisgICAgICBwY2ItPm5ydHggPSAwOworCisgICAgICAvKiBSZXNldCB0aGUgcmV0cmFuc21pc3Npb24gdGltZS1vdXQuICovCisgICAgICBwY2ItPnJ0byA9IChwY2ItPnNhID4+IDMpICsgcGNiLT5zdjsKKworICAgICAgLyogVXBkYXRlIHRoZSBzZW5kIGJ1ZmZlciBzcGFjZS4gRGlmZiBiZXR3ZWVuIHRoZSB0d28gY2FuIG5ldmVyIGV4Y2VlZCA2NEs/ICovCisgICAgICBwY2ItPmFja2VkID0gKHUxNl90KShhY2tubyAtIHBjYi0+bGFzdGFjayk7CisKKyAgICAgIHBjYi0+c25kX2J1ZiArPSBwY2ItPmFja2VkOworCisgICAgICAvKiBSZXNldCB0aGUgZmFzdCByZXRyYW5zbWl0IHZhcmlhYmxlcy4gKi8KKyAgICAgIHBjYi0+ZHVwYWNrcyA9IDA7CisgICAgICBwY2ItPmxhc3RhY2sgPSBhY2tubzsKKworICAgICAgLyogVXBkYXRlIHRoZSBjb25nZXN0aW9uIGNvbnRyb2wgdmFyaWFibGVzIChjd25kIGFuZAorICAgICAgICAgc3N0aHJlc2gpLiAqLworICAgICAgaWYgKHBjYi0+c3RhdGUgPj0gRVNUQUJMSVNIRUQpIHsKKyAgICAgICAgaWYgKHBjYi0+Y3duZCA8IHBjYi0+c3N0aHJlc2gpIHsKKyAgICAgICAgICBpZiAoKHUxNl90KShwY2ItPmN3bmQgKyBwY2ItPm1zcykgPiBwY2ItPmN3bmQpIHsKKyAgICAgICAgICAgIHBjYi0+Y3duZCArPSBwY2ItPm1zczsKKyAgICAgICAgICB9CisgICAgICAgICAgTFdJUF9ERUJVR0YoVENQX0NXTkRfREVCVUcsICgidGNwX3JlY2VpdmU6IHNsb3cgc3RhcnQgY3duZCAlIlUxNl9GIlxuIiwgcGNiLT5jd25kKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdTE2X3QgbmV3X2N3bmQgPSAocGNiLT5jd25kICsgcGNiLT5tc3MgKiBwY2ItPm1zcyAvIHBjYi0+Y3duZCk7CisgICAgICAgICAgaWYgKG5ld19jd25kID4gcGNiLT5jd25kKSB7CisgICAgICAgICAgICBwY2ItPmN3bmQgPSBuZXdfY3duZDsKKyAgICAgICAgICB9CisgICAgICAgICAgTFdJUF9ERUJVR0YoVENQX0NXTkRfREVCVUcsICgidGNwX3JlY2VpdmU6IGNvbmdlc3Rpb24gYXZvaWRhbmNlIGN3bmQgJSJVMTZfRiJcbiIsIHBjYi0+Y3duZCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX3JlY2VpdmU6IEFDSyBmb3IgJSJVMzJfRiIsIHVuYWNrZWQtPnNlcW5vICUiVTMyX0YiOiUiVTMyX0YiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2ItPnVuYWNrZWQgIT0gTlVMTD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hsKHBjYi0+dW5hY2tlZC0+dGNwaGRyLT5zZXFubyk6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2ItPnVuYWNrZWQgIT0gTlVMTD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hsKHBjYi0+dW5hY2tlZC0+dGNwaGRyLT5zZXFubykgKyBUQ1BfVENQTEVOKHBjYi0+dW5hY2tlZCk6IDApKTsKKworICAgICAgLyogUmVtb3ZlIHNlZ21lbnQgZnJvbSB0aGUgdW5hY2tub3dsZWRnZWQgbGlzdCBpZiB0aGUgaW5jb21pbmcKKyAgICAgICAgIEFDSyBhY2tub3dsZWdkZXMgdGhlbS4gKi8KKyAgICAgIHdoaWxlIChwY2ItPnVuYWNrZWQgIT0gTlVMTCAmJgorICAgICAgICAgICAgIFRDUF9TRVFfTEVRKG50b2hsKHBjYi0+dW5hY2tlZC0+dGNwaGRyLT5zZXFubykgKworICAgICAgICAgICAgICAgICAgICAgICAgIFRDUF9UQ1BMRU4ocGNiLT51bmFja2VkKSwgYWNrbm8pKSB7CisgICAgICAgIExXSVBfREVCVUdGKFRDUF9JTlBVVF9ERUJVRywgKCJ0Y3BfcmVjZWl2ZTogcmVtb3ZpbmcgJSJVMzJfRiI6JSJVMzJfRiIgZnJvbSBwY2ItPnVuYWNrZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hsKHBjYi0+dW5hY2tlZC0+dGNwaGRyLT5zZXFubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hsKHBjYi0+dW5hY2tlZC0+dGNwaGRyLT5zZXFubykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1BfVENQTEVOKHBjYi0+dW5hY2tlZCkpKTsKKworICAgICAgICBuZXh0ID0gcGNiLT51bmFja2VkOworICAgICAgICBwY2ItPnVuYWNrZWQgPSBwY2ItPnVuYWNrZWQtPm5leHQ7CisKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX1FMRU5fREVCVUcsICgidGNwX3JlY2VpdmU6IHF1ZXVlbGVuICUiVTE2X0YiIC4uLiAiLCAodTE2X3QpcGNiLT5zbmRfcXVldWVsZW4pKTsKKyAgICAgICAgTFdJUF9BU1NFUlQoInBjYi0+c25kX3F1ZXVlbGVuID49IHBidWZfY2xlbihuZXh0LT5wKSIsIChwY2ItPnNuZF9xdWV1ZWxlbiA+PSBwYnVmX2NsZW4obmV4dC0+cCkpKTsKKyAgICAgICAgLyogUHJldmVudCBBQ0sgZm9yIEZJTiB0byBnZW5lcmF0ZSBhIHNlbnQgZXZlbnQgKi8KKyAgICAgICAgaWYgKChwY2ItPmFja2VkICE9IDApICYmICgoVENQSF9GTEFHUyhuZXh0LT50Y3BoZHIpICYgVENQX0ZJTikgIT0gMCkpIHsKKyAgICAgICAgICBwY2ItPmFja2VkLS07CisgICAgICAgIH0KKworICAgICAgICBwY2ItPnNuZF9xdWV1ZWxlbiAtPSBwYnVmX2NsZW4obmV4dC0+cCk7CisgICAgICAgIHRjcF9zZWdfZnJlZShuZXh0KTsKKworICAgICAgICBMV0lQX0RFQlVHRihUQ1BfUUxFTl9ERUJVRywgKCIlIlUxNl9GIiAoYWZ0ZXIgZnJlZWluZyB1bmFja2VkKVxuIiwgKHUxNl90KXBjYi0+c25kX3F1ZXVlbGVuKSk7CisgICAgICAgIGlmIChwY2ItPnNuZF9xdWV1ZWxlbiAhPSAwKSB7CisgICAgICAgICAgTFdJUF9BU1NFUlQoInRjcF9yZWNlaXZlOiB2YWxpZCBxdWV1ZSBsZW5ndGgiLCBwY2ItPnVuYWNrZWQgIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgIHBjYi0+dW5zZW50ICE9IE5VTEwpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIElmIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGFja25vd2xlZGdlLCBzdG9wIHRoZSByZXRyYW5zbWl0CisgICAgICAgICB0aW1lciwgb3RoZXJ3aXNlIHJlc2V0IGl0IHRvIHN0YXJ0IGFnYWluICovCisgICAgICBpZihwY2ItPnVuYWNrZWQgPT0gTlVMTCkKKyAgICAgICAgcGNiLT5ydGltZSA9IC0xOworICAgICAgZWxzZQorICAgICAgICBwY2ItPnJ0aW1lID0gMDsKKworICAgICAgcGNiLT5wb2xsdG1yID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgLyogRml4IGJ1ZyBidWcgIzIxNTgyOiBvdXQgb2Ygc2VxdWVuY2UgQUNLLCBkaWRuJ3QgcmVhbGx5IGFjayBhbnl0aGluZyAqLworICAgICAgcGNiLT5hY2tlZCA9IDA7CisgICAgfQorCisgICAgLyogV2UgZ28gdGhyb3VnaCB0aGUgLT51bnNlbnQgbGlzdCB0byBzZWUgaWYgYW55IG9mIHRoZSBzZWdtZW50cworICAgICAgIG9uIHRoZSBsaXN0IGFyZSBhY2tub3dsZWRnZWQgYnkgdGhlIEFDSy4gVGhpcyBtYXkgc2VlbQorICAgICAgIHN0cmFuZ2Ugc2luY2UgYW4gInVuc2VudCIgc2VnbWVudCBzaG91bGRuJ3QgYmUgYWNrZWQuIFRoZQorICAgICAgIHJhdGlvbmFsZSBpcyB0aGF0IGx3SVAgcHV0cyBhbGwgb3V0c3RhbmRpbmcgc2VnbWVudHMgb24gdGhlCisgICAgICAgLT51bnNlbnQgbGlzdCBhZnRlciBhIHJldHJhbnNtaXNzaW9uLCBzbyB0aGVzZSBzZWdtZW50cyBtYXkKKyAgICAgICBpbiBmYWN0IGhhdmUgYmVlbiBzZW50IG9uY2UuICovCisgICAgd2hpbGUgKHBjYi0+dW5zZW50ICE9IE5VTEwgJiYKKyAgICAgICAgICAgVENQX1NFUV9CRVRXRUVOKGFja25vLCBudG9obChwY2ItPnVuc2VudC0+dGNwaGRyLT5zZXFubykgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDUF9UQ1BMRU4ocGNiLT51bnNlbnQpLCBwY2ItPnNuZF9ueHQpKSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX3JlY2VpdmU6IHJlbW92aW5nICUiVTMyX0YiOiUiVTMyX0YiIGZyb20gcGNiLT51bnNlbnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9obChwY2ItPnVuc2VudC0+dGNwaGRyLT5zZXFubyksIG50b2hsKHBjYi0+dW5zZW50LT50Y3BoZHItPnNlcW5vKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1BfVENQTEVOKHBjYi0+dW5zZW50KSkpOworCisgICAgICBuZXh0ID0gcGNiLT51bnNlbnQ7CisgICAgICBwY2ItPnVuc2VudCA9IHBjYi0+dW5zZW50LT5uZXh0OworICAgICAgTFdJUF9ERUJVR0YoVENQX1FMRU5fREVCVUcsICgidGNwX3JlY2VpdmU6IHF1ZXVlbGVuICUiVTE2X0YiIC4uLiAiLCAodTE2X3QpcGNiLT5zbmRfcXVldWVsZW4pKTsKKyAgICAgIExXSVBfQVNTRVJUKCJwY2ItPnNuZF9xdWV1ZWxlbiA+PSBwYnVmX2NsZW4obmV4dC0+cCkiLCAocGNiLT5zbmRfcXVldWVsZW4gPj0gcGJ1Zl9jbGVuKG5leHQtPnApKSk7CisgICAgICAvKiBQcmV2ZW50IEFDSyBmb3IgRklOIHRvIGdlbmVyYXRlIGEgc2VudCBldmVudCAqLworICAgICAgaWYgKChwY2ItPmFja2VkICE9IDApICYmICgoVENQSF9GTEFHUyhuZXh0LT50Y3BoZHIpICYgVENQX0ZJTikgIT0gMCkpIHsKKyAgICAgICAgcGNiLT5hY2tlZC0tOworICAgICAgfQorICAgICAgcGNiLT5zbmRfcXVldWVsZW4gLT0gcGJ1Zl9jbGVuKG5leHQtPnApOworICAgICAgdGNwX3NlZ19mcmVlKG5leHQpOworICAgICAgTFdJUF9ERUJVR0YoVENQX1FMRU5fREVCVUcsICgiJSJVMTZfRiIgKGFmdGVyIGZyZWVpbmcgdW5zZW50KVxuIiwgKHUxNl90KXBjYi0+c25kX3F1ZXVlbGVuKSk7CisgICAgICBpZiAocGNiLT5zbmRfcXVldWVsZW4gIT0gMCkgeworICAgICAgICBMV0lQX0FTU0VSVCgidGNwX3JlY2VpdmU6IHZhbGlkIHF1ZXVlIGxlbmd0aCIsCisgICAgICAgICAgcGNiLT51bmFja2VkICE9IE5VTEwgfHwgcGNiLT51bnNlbnQgIT0gTlVMTCk7CisgICAgICB9CisgICAgfQorICAgIC8qIEVuZCBvZiBBQ0sgZm9yIG5ldyBkYXRhIHByb2Nlc3NpbmcuICovCisKKyAgICBMV0lQX0RFQlVHRihUQ1BfUlRPX0RFQlVHLCAoInRjcF9yZWNlaXZlOiBwY2ItPnJ0dGVzdCAlIlUzMl9GIiBydHNlcSAlIlUzMl9GIiBhY2tubyAlIlUzMl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNiLT5ydHRlc3QsIHBjYi0+cnRzZXEsIGFja25vKSk7CisKKyAgICAvKiBSVFQgZXN0aW1hdGlvbiBjYWxjdWxhdGlvbnMuIFRoaXMgaXMgZG9uZSBieSBjaGVja2luZyBpZiB0aGUKKyAgICAgICBpbmNvbWluZyBzZWdtZW50IGFja25vd2xlZGdlcyB0aGUgc2VnbWVudCB3ZSB1c2UgdG8gdGFrZSBhCisgICAgICAgcm91bmQtdHJpcCB0aW1lIG1lYXN1cmVtZW50LiAqLworICAgIGlmIChwY2ItPnJ0dGVzdCAmJiBUQ1BfU0VRX0xUKHBjYi0+cnRzZXEsIGFja25vKSkgeworICAgICAgLyogZGlmZiBiZXR3ZWVuIHRoaXMgc2hvdWxkbid0IGV4Y2VlZCAzMksgc2luY2UgdGhpcyBhcmUgdGNwIHRpbWVyIHRpY2tzCisgICAgICAgICBhbmQgYSByb3VuZC10cmlwIHNob3VsZG4ndCBiZSB0aGF0IGxvbmcuLi4gKi8KKyAgICAgIG0gPSAoczE2X3QpKHRjcF90aWNrcyAtIHBjYi0+cnR0ZXN0KTsKKworICAgICAgTFdJUF9ERUJVR0YoVENQX1JUT19ERUJVRywgKCJ0Y3BfcmVjZWl2ZTogZXhwZXJpZW5jZWQgcnR0ICUiVTE2X0YiIHRpY2tzICglIlUxNl9GIiBtc2VjKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwgbSAqIFRDUF9TTE9XX0lOVEVSVkFMKSk7CisKKyAgICAgIC8qIFRoaXMgaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSBWSnMgb3JpZ2luYWwgY29kZSBpbiBoaXMgcGFwZXIgKi8KKyAgICAgIG0gPSBtIC0gKHBjYi0+c2EgPj4gMyk7CisgICAgICBwY2ItPnNhICs9IG07CisgICAgICBpZiAobSA8IDApIHsKKyAgICAgICAgbSA9IC1tOworICAgICAgfQorICAgICAgbSA9IG0gLSAocGNiLT5zdiA+PiAyKTsKKyAgICAgIHBjYi0+c3YgKz0gbTsKKyAgICAgIHBjYi0+cnRvID0gKHBjYi0+c2EgPj4gMykgKyBwY2ItPnN2OworCisgICAgICBMV0lQX0RFQlVHRihUQ1BfUlRPX0RFQlVHLCAoInRjcF9yZWNlaXZlOiBSVE8gJSJVMTZfRiIgKCUiVTE2X0YiIG1pbGxpc2Vjb25kcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNiLT5ydG8sIHBjYi0+cnRvICogVENQX1NMT1dfSU5URVJWQUwpKTsKKworICAgICAgcGNiLT5ydHRlc3QgPSAwOworICAgIH0KKyAgfQorCisgIC8qIElmIHRoZSBpbmNvbWluZyBzZWdtZW50IGNvbnRhaW5zIGRhdGEsIHdlIG11c3QgcHJvY2VzcyBpdAorICAgICBmdXJ0aGVyLiAqLworICBpZiAodGNwbGVuID4gMCkgeworICAgIC8qIFRoaXMgY29kZSBiYXNpY2FsbHkgZG9lcyB0aHJlZSB0aGluZ3M6CisKKyAgICArKSBJZiB0aGUgaW5jb21pbmcgc2VnbWVudCBjb250YWlucyBkYXRhIHRoYXQgaXMgdGhlIG5leHQKKyAgICBpbi1zZXF1ZW5jZSBkYXRhLCB0aGlzIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhpcworICAgIG1pZ2h0IGludm9sdmUgdHJpbW1pbmcgdGhlIGZpcnN0IGVkZ2Ugb2YgdGhlIGRhdGEuIFRoZSByY3Zfbnh0CisgICAgdmFyaWFibGUgYW5kIHRoZSBhZHZlcnRpc2VkIHdpbmRvdyBhcmUgYWRqdXN0ZWQuCisKKyAgICArKSBJZiB0aGUgaW5jb21pbmcgc2VnbWVudCBoYXMgZGF0YSB0aGF0IGlzIGFib3ZlIHRoZSBuZXh0CisgICAgc2VxdWVuY2UgbnVtYmVyIGV4cGVjdGVkICgtPnJjdl9ueHQpLCB0aGUgc2VnbWVudCBpcyBwbGFjZWQgb24KKyAgICB0aGUgLT5vb3NlcSBxdWV1ZS4gVGhpcyBpcyBkb25lIGJ5IGZpbmRpbmcgdGhlIGFwcHJvcHJpYXRlCisgICAgcGxhY2UgaW4gdGhlIC0+b29zZXEgcXVldWUgKHdoaWNoIGlzIG9yZGVyZWQgYnkgc2VxdWVuY2UKKyAgICBudW1iZXIpIGFuZCB0cmltIHRoZSBzZWdtZW50IGluIGJvdGggZW5kcyBpZiBuZWVkZWQuIEFuCisgICAgaW1tZWRpYXRlIEFDSyBpcyBzZW50IHRvIGluZGljYXRlIHRoYXQgd2UgcmVjZWl2ZWQgYW4KKyAgICBvdXQtb2Ytc2VxdWVuY2Ugc2VnbWVudC4KKworICAgICspIEZpbmFsbHksIHdlIGNoZWNrIGlmIHRoZSBmaXJzdCBzZWdtZW50IG9uIHRoZSAtPm9vc2VxIHF1ZXVlCisgICAgbm93IGlzIGluIHNlcXVlbmNlIChpLmUuLCBpZiByY3Zfbnh0ID49IG9vc2VxLT5zZXFubykuIElmCisgICAgcmN2X254dCA+IG9vc2VxLT5zZXFubywgd2UgbXVzdCB0cmltIHRoZSBmaXJzdCBlZGdlIG9mIHRoZQorICAgIHNlZ21lbnQgb24gLT5vb3NlcSBiZWZvcmUgd2UgYWRqdXN0IHJjdl9ueHQuIFRoZSBkYXRhIGluIHRoZQorICAgIHNlZ21lbnRzIHRoYXQgYXJlIG5vdyBvbiBzZXF1ZW5jZSBhcmUgY2hhaW5lZCBvbnRvIHRoZQorICAgIGluY29taW5nIHNlZ21lbnQgc28gdGhhdCB3ZSBvbmx5IG5lZWQgdG8gY2FsbCB0aGUgYXBwbGljYXRpb24KKyAgICBvbmNlLgorICAgICovCisKKyAgICAvKiBGaXJzdCwgd2UgY2hlY2sgaWYgd2UgbXVzdCB0cmltIHRoZSBmaXJzdCBlZGdlLiBXZSBoYXZlIHRvIGRvCisgICAgICAgdGhpcyBpZiB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBpbmNvbWluZyBzZWdtZW50IGlzIGxlc3MKKyAgICAgICB0aGFuIHJjdl9ueHQsIGFuZCB0aGUgc2VxdWVuY2UgbnVtYmVyIHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAgICAgICBzZWdtZW50IGlzIGxhcmdlciB0aGFuIHJjdl9ueHQuICovCisgICAgLyogICAgaWYgKFRDUF9TRVFfTFQoc2Vxbm8sIHBjYi0+cmN2X254dCkpeworICAgICAgICAgIGlmIChUQ1BfU0VRX0xUKHBjYi0+cmN2X254dCwgc2Vxbm8gKyB0Y3BsZW4pKSB7Ki8KKyAgICBpZiAoVENQX1NFUV9CRVRXRUVOKHBjYi0+cmN2X254dCwgc2Vxbm8gKyAxLCBzZXFubyArIHRjcGxlbiAtIDEpKXsKKyAgICAgIC8qIFRyaW1taW5nIHRoZSBmaXJzdCBlZGdlIGlzIGRvbmUgYnkgcHVzaGluZyB0aGUgcGF5bG9hZAorICAgICAgICAgcG9pbnRlciBpbiB0aGUgcGJ1ZiBkb3dud2FyZHMuIFRoaXMgaXMgc29tZXdoYXQgdHJpY2t5IHNpbmNlCisgICAgICAgICB3ZSBkbyBub3Qgd2FudCB0byBkaXNjYXJkIHRoZSBmdWxsIGNvbnRlbnRzIG9mIHRoZSBwYnVmIHVwIHRvCisgICAgICAgICB0aGUgbmV3IHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBkYXRhIHNpbmNlIHdlIGhhdmUgdG8ga2VlcCB0aGUKKyAgICAgICAgIFRDUCBoZWFkZXIgd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgZmlyc3QgcGJ1ZiBpbiB0aGUgY2hhaW4uCisKKyAgICAgICAgIFdoYXQgaXMgZG9uZSBpcyByZWFsbHkgcXVpdGUgYSBuYXN0eSBoYWNrOiB0aGUgZmlyc3QgcGJ1ZiBpbgorICAgICAgICAgdGhlIHBidWYgY2hhaW4gaXMgcG9pbnRlZCB0byBieSBpbnNlZy5wLiBTaW5jZSB3ZSBuZWVkIHRvIGJlCisgICAgICAgICBhYmxlIHRvIGRlYWxsb2NhdGUgdGhlIHdob2xlIHBidWYsIHdlIGNhbm5vdCBjaGFuZ2UgdGhpcworICAgICAgICAgaW5zZWcucCBwb2ludGVyIHRvIHBvaW50IHRvIGFueSBvZiB0aGUgbGF0ZXIgcGJ1ZnMgaW4gdGhlCisgICAgICAgICBjaGFpbi4gSW5zdGVhZCwgd2UgcG9pbnQgdGhlIC0+cGF5bG9hZCBwb2ludGVyIGluIHRoZSBmaXJzdAorICAgICAgICAgcGJ1ZiB0byBkYXRhIGluIG9uZSBvZiB0aGUgbGF0ZXIgcGJ1ZnMuIFdlIGFsc28gc2V0IHRoZQorICAgICAgICAgaW5zZWcuZGF0YSBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSByaWdodCBwbGFjZS4gVGhpcyB3YXksIHRoZQorICAgICAgICAgLT5wIHBvaW50ZXIgd2lsbCBzdGlsbCBwb2ludCB0byB0aGUgZmlyc3QgcGJ1ZiwgYnV0IHRoZQorICAgICAgICAgLT5wLT5wYXlsb2FkIHBvaW50ZXIgd2lsbCBwb2ludCB0byBkYXRhIGluIGFub3RoZXIgcGJ1Zi4KKworICAgICAgICAgQWZ0ZXIgd2UgYXJlIGRvbmUgd2l0aCBhZGp1c3RpbmcgdGhlIHBidWYgcG9pbnRlcnMgd2UgbXVzdAorICAgICAgICAgYWRqdXN0IHRoZSAtPmRhdGEgcG9pbnRlciBpbiB0aGUgc2VnIGFuZCB0aGUgc2VnbWVudAorICAgICAgICAgbGVuZ3RoLiovCisKKyAgICAgIG9mZiA9IHBjYi0+cmN2X254dCAtIHNlcW5vOworICAgICAgcCA9IGluc2VnLnA7CisgICAgICBMV0lQX0FTU0VSVCgiaW5zZWcucCAhPSBOVUxMIiwgaW5zZWcucCk7CisgICAgICBMV0lQX0FTU0VSVCgiaW5zYW5lIG9mZnNldCEiLCAob2ZmIDwgMHg3ZmZmKSk7CisgICAgICBpZiAoaW5zZWcucC0+bGVuIDwgb2ZmKSB7CisgICAgICAgIExXSVBfQVNTRVJUKCJwYnVmIHRvbyBzaG9ydCEiLCAoKChzMzJfdClpbnNlZy5wLT50b3RfbGVuKSA+PSBvZmYpKTsKKyAgICAgICAgbmV3X3RvdF9sZW4gPSAodTE2X3QpKGluc2VnLnAtPnRvdF9sZW4gLSBvZmYpOworICAgICAgICB3aGlsZSAocC0+bGVuIDwgb2ZmKSB7CisgICAgICAgICAgb2ZmIC09IHAtPmxlbjsKKyAgICAgICAgICAvKiBLSk0gZm9sbG93aW5nIGxpbmUgY2hhbmdlZCAod2l0aCBhZGRpdGlvbiBvZiBuZXdfdG90X2xlbiB2YXIpCisgICAgICAgICAgICAgdG8gZml4IGJ1ZyAjOTA3NgorICAgICAgICAgICAgIGluc2VnLnAtPnRvdF9sZW4gLT0gcC0+bGVuOyAqLworICAgICAgICAgIHAtPnRvdF9sZW4gPSBuZXdfdG90X2xlbjsKKyAgICAgICAgICBwLT5sZW4gPSAwOworICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmKHBidWZfaGVhZGVyKHAsIChzMTZfdCktb2ZmKSkgeworICAgICAgICAgIC8qIERvIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRoaXMgZmFpbGluZz8gIEFzc2VydCBmb3Igbm93ICovCisgICAgICAgICAgTFdJUF9BU1NFUlQoInBidWZfaGVhZGVyIGZhaWxlZCIsIDApOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZihwYnVmX2hlYWRlcihpbnNlZy5wLCAoczE2X3QpLW9mZikpIHsKKyAgICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0aGlzIGZhaWxpbmc/ICBBc3NlcnQgZm9yIG5vdyAqLworICAgICAgICAgIExXSVBfQVNTRVJUKCJwYnVmX2hlYWRlciBmYWlsZWQiLCAwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5zZWcubGVuIC09ICh1MTZfdCkocGNiLT5yY3Zfbnh0IC0gc2Vxbm8pOworICAgICAgaW5zZWcudGNwaGRyLT5zZXFubyA9IHNlcW5vID0gcGNiLT5yY3Zfbnh0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChUQ1BfU0VRX0xUKHNlcW5vLCBwY2ItPnJjdl9ueHQpKXsKKyAgICAgICAgLyogdGhlIHdob2xlIHNlZ21lbnQgaXMgPCByY3Zfbnh0ICovCisgICAgICAgIC8qIG11c3QgYmUgYSBkdXBsaWNhdGUgb2YgYSBwYWNrZXQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNvcnJlY3RseSBoYW5kbGVkICovCisKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX0lOUFVUX0RFQlVHLCAoInRjcF9yZWNlaXZlOiBkdXBsaWNhdGUgc2Vxbm8gJSJVMzJfRiJcbiIsIHNlcW5vKSk7CisgICAgICAgIHRjcF9hY2tfbm93KHBjYik7CisgICAgICB9CisgICAgfQorCisgICAgLyogVGhlIHNlcXVlbmNlIG51bWJlciBtdXN0IGJlIHdpdGhpbiB0aGUgd2luZG93IChhYm92ZSByY3Zfbnh0CisgICAgICAgYW5kIGJlbG93IHJjdl9ueHQgKyByY3Zfd25kKSBpbiBvcmRlciB0byBiZSBmdXJ0aGVyCisgICAgICAgcHJvY2Vzc2VkLiAqLworICAgIGlmIChUQ1BfU0VRX0JFVFdFRU4oc2Vxbm8sIHBjYi0+cmN2X254dCwgCisgICAgICAgICAgICAgICAgICAgICAgICBwY2ItPnJjdl9ueHQgKyBwY2ItPnJjdl93bmQgLSAxKSl7CisgICAgICBpZiAocGNiLT5yY3Zfbnh0ID09IHNlcW5vKSB7CisgICAgICAgIC8qIFRoZSBpbmNvbWluZyBzZWdtZW50IGlzIHRoZSBuZXh0IGluIHNlcXVlbmNlLiBXZSBjaGVjayBpZgorICAgICAgICAgICB3ZSBoYXZlIHRvIHRyaW0gdGhlIGVuZCBvZiB0aGUgc2VnbWVudCBhbmQgdXBkYXRlIHJjdl9ueHQKKyAgICAgICAgICAgYW5kIHBhc3MgdGhlIGRhdGEgdG8gdGhlIGFwcGxpY2F0aW9uLiAqLworICAgICAgICB0Y3BsZW4gPSBUQ1BfVENQTEVOKCZpbnNlZyk7CisKKyAgICAgICAgaWYgKHRjcGxlbiA+IHBjYi0+cmN2X3duZCkgeworICAgICAgICAgIExXSVBfREVCVUdGKFRDUF9JTlBVVF9ERUJVRywgCisgICAgICAgICAgICAgICAgICAgICAgKCJ0Y3BfcmVjZWl2ZTogb3RoZXIgZW5kIG92ZXJyYW4gcmVjZWl2ZSB3aW5kb3ciCisgICAgICAgICAgICAgICAgICAgICAgICJzZXFubyAlIlUzMl9GIiBsZW4gJSJVMTZfRiIgcmlnaHQgZWRnZSAlIlUzMl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vxbm8sIHRjcGxlbiwgcGNiLT5yY3Zfbnh0ICsgcGNiLT5yY3Zfd25kKSk7CisgICAgICAgICAgaWYgKFRDUEhfRkxBR1MoaW5zZWcudGNwaGRyKSAmIFRDUF9GSU4pIHsKKyAgICAgICAgICAgIC8qIE11c3QgcmVtb3ZlIHRoZSBGSU4gZnJvbSB0aGUgaGVhZGVyIGFzIHdlJ3JlIHRyaW1taW5nIAorICAgICAgICAgICAgICogdGhhdCBieXRlIG9mIHNlcXVlbmNlLXNwYWNlIGZyb20gdGhlIHBhY2tldCAqLworICAgICAgICAgICAgVENQSF9GTEFHU19TRVQoaW5zZWcudGNwaGRyLCBUQ1BIX0ZMQUdTKGluc2VnLnRjcGhkcikgJn4gVENQX0ZJTik7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIEFkanVzdCBsZW5ndGggb2Ygc2VnbWVudCB0byBmaXQgaW4gdGhlIHdpbmRvdy4gKi8KKyAgICAgICAgICBpbnNlZy5sZW4gPSBwY2ItPnJjdl93bmQ7CisgICAgICAgICAgaWYgKFRDUEhfRkxBR1MoaW5zZWcudGNwaGRyKSAmIFRDUF9TWU4pIHsKKyAgICAgICAgICAgIGluc2VnLmxlbiAtPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBwYnVmX3JlYWxsb2MoaW5zZWcucCwgaW5zZWcubGVuKTsKKyAgICAgICAgICB0Y3BsZW4gPSBUQ1BfVENQTEVOKCZpbnNlZyk7CisgICAgICAgICAgTFdJUF9BU1NFUlQoInRjcF9yZWNlaXZlOiBzZWdtZW50IG5vdCB0cmltbWVkIGNvcnJlY3RseSB0byByY3Zfd25kXG4iLAorICAgICAgICAgICAgICAgICAgICAgIChzZXFubyArIHRjcGxlbikgPT0gKHBjYi0+cmN2X254dCArIHBjYi0+cmN2X3duZCkpOworICAgICAgICB9CisjaWYgVENQX1FVRVVFX09PU0VRCisgICAgICAgIC8qIFJlY2VpdmVkIGluLXNlcXVlbmNlIGRhdGEsIGFkanVzdCBvb3NlcSBkYXRhIGlmOgorICAgICAgICAgICAtIEZJTiBoYXMgYmVlbiByZWNlaXZlZCBvcgorICAgICAgICAgICAtIGluc2VxIG92ZXJsYXBzIHdpdGggb29zZXEgKi8KKyAgICAgICAgaWYgKHBjYi0+b29zZXEgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChUQ1BIX0ZMQUdTKGluc2VnLnRjcGhkcikgJiBUQ1BfRklOKSB7CisgICAgICAgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsIAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ0Y3BfcmVjZWl2ZTogcmVjZWl2ZWQgaW4tb3JkZXIgRklOLCBiaW5uaW5nIG9vc2VxIHF1ZXVlXG4iKSk7CisgICAgICAgICAgICAvKiBSZWNlaXZlZCBpbi1vcmRlciBGSU4gbWVhbnMgYW55dGhpbmcgdGhhdCB3YXMgcmVjZWl2ZWQKKyAgICAgICAgICAgICAqIG91dCBvZiBvcmRlciBtdXN0IG5vdyBoYXZlIGJlZW4gcmVjZWl2ZWQgaW4tb3JkZXIsIHNvCisgICAgICAgICAgICAgKiBiaW4gdGhlIG9vc2VxIHF1ZXVlICovCisgICAgICAgICAgICB3aGlsZSAocGNiLT5vb3NlcSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIHN0cnVjdCB0Y3Bfc2VnICpvbGRfb29zZXEgPSBwY2ItPm9vc2VxOworICAgICAgICAgICAgICBwY2ItPm9vc2VxID0gcGNiLT5vb3NlcS0+bmV4dDsKKyAgICAgICAgICAgICAgdGNwX3NlZ19mcmVlKG9sZF9vb3NlcSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbmV4dCA9IHBjYi0+b29zZXE7CisgICAgICAgICAgICAvKiBSZW1vdmUgYWxsIHNlZ21lbnRzIG9uIG9vc2VxIHRoYXQgYXJlIGNvdmVyZWQgYnkgaW5zZWcgYWxyZWFkeS4KKyAgICAgICAgICAgICAqIEZJTiBpcyBjb3BpZWQgZnJvbSBvb3NlcSB0byBpbnNlZyBpZiBwcmVzZW50LiAqLworICAgICAgICAgICAgd2hpbGUgKG5leHQgJiYKKyAgICAgICAgICAgICAgICAgICBUQ1BfU0VRX0dFUShzZXFubyArIHRjcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LT50Y3BoZHItPnNlcW5vICsgbmV4dC0+bGVuKSkgeworICAgICAgICAgICAgICAvKiBpbnNlZyBjYW5ub3QgaGF2ZSBGSU4gaGVyZSAoYWxyZWFkeSBwcm9jZXNzZWQgYWJvdmUpICovCisgICAgICAgICAgICAgIGlmIChUQ1BIX0ZMQUdTKG5leHQtPnRjcGhkcikgJiBUQ1BfRklOICYmCisgICAgICAgICAgICAgICAgICAoVENQSF9GTEFHUyhpbnNlZy50Y3BoZHIpICYgVENQX1NZTikgPT0gMCkgeworICAgICAgICAgICAgICAgIFRDUEhfU0VUX0ZMQUcoaW5zZWcudGNwaGRyLCBUQ1BfRklOKTsKKyAgICAgICAgICAgICAgICB0Y3BsZW4gPSBUQ1BfVENQTEVOKCZpbnNlZyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgICAgICAgIG5leHQgPSBuZXh0LT5uZXh0OworICAgICAgICAgICAgICB0Y3Bfc2VnX2ZyZWUocHJldik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBOb3cgdHJpbSByaWdodCBzaWRlIG9mIGluc2VnIGlmIGl0IG92ZXJsYXBzIHdpdGggdGhlIGZpcnN0CisgICAgICAgICAgICAgKiBzZWdtZW50IG9uIG9vc2VxICovCisgICAgICAgICAgICBpZiAobmV4dCAmJgorICAgICAgICAgICAgICAgIFRDUF9TRVFfR1Qoc2Vxbm8gKyB0Y3BsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LT50Y3BoZHItPnNlcW5vKSkgeworICAgICAgICAgICAgICAvKiBpbnNlZyBjYW5ub3QgaGF2ZSBGSU4gaGVyZSAoYWxyZWFkeSBwcm9jZXNzZWQgYWJvdmUpICovCisgICAgICAgICAgICAgIGluc2VnLmxlbiA9ICh1MTZfdCkobmV4dC0+dGNwaGRyLT5zZXFubyAtIHNlcW5vKTsKKyAgICAgICAgICAgICAgaWYgKFRDUEhfRkxBR1MoaW5zZWcudGNwaGRyKSAmIFRDUF9TWU4pIHsKKyAgICAgICAgICAgICAgICBpbnNlZy5sZW4gLT0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwYnVmX3JlYWxsb2MoaW5zZWcucCwgaW5zZWcubGVuKTsKKyAgICAgICAgICAgICAgdGNwbGVuID0gVENQX1RDUExFTigmaW5zZWcpOworICAgICAgICAgICAgICBMV0lQX0FTU0VSVCgidGNwX3JlY2VpdmU6IHNlZ21lbnQgbm90IHRyaW1tZWQgY29ycmVjdGx5IHRvIG9vc2VxIHF1ZXVlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vxbm8gKyB0Y3BsZW4pID09IG5leHQtPnRjcGhkci0+c2Vxbm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGNiLT5vb3NlcSA9IG5leHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogVENQX1FVRVVFX09PU0VRICovCisKKyAgICAgICAgcGNiLT5yY3Zfbnh0ID0gc2Vxbm8gKyB0Y3BsZW47CisKKyAgICAgICAgLyogVXBkYXRlIHRoZSByZWNlaXZlcidzIChvdXIpIHdpbmRvdy4gKi8KKyAgICAgICAgTFdJUF9BU1NFUlQoInRjcF9yZWNlaXZlOiB0Y3BsZW4gPiByY3Zfd25kXG4iLCBwY2ItPnJjdl93bmQgPj0gdGNwbGVuKTsKKyAgICAgICAgcGNiLT5yY3Zfd25kIC09IHRjcGxlbjsKKworICAgICAgICB0Y3BfdXBkYXRlX3Jjdl9hbm5fd25kKHBjYik7CisKKyAgICAgICAgLyogSWYgdGhlcmUgaXMgZGF0YSBpbiB0aGUgc2VnbWVudCwgd2UgbWFrZSBwcmVwYXJhdGlvbnMgdG8KKyAgICAgICAgICAgcGFzcyB0aGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhlIC0+cmVjdl9kYXRhIHZhcmlhYmxlCisgICAgICAgICAgIGlzIHVzZWQgZm9yIGhvbGRpbmcgdGhlIHBidWYgdGhhdCBnb2VzIHRvIHRoZQorICAgICAgICAgICBhcHBsaWNhdGlvbi4gVGhlIGNvZGUgZm9yIHJlYXNzZW1ibGluZyBvdXQtb2Ytc2VxdWVuY2UgZGF0YQorICAgICAgICAgICBjaGFpbnMgaXRzIGRhdGEgb24gdGhpcyBwYnVmIGFzIHdlbGwuCisKKyAgICAgICAgICAgSWYgdGhlIHNlZ21lbnQgd2FzIGEgRklOLCB3ZSBzZXQgdGhlIFRGX0dPVF9GSU4gZmxhZyB0aGF0IHdpbGwKKyAgICAgICAgICAgYmUgdXNlZCB0byBpbmRpY2F0ZSB0byB0aGUgYXBwbGljYXRpb24gdGhhdCB0aGUgcmVtb3RlIHNpZGUgaGFzCisgICAgICAgICAgIGNsb3NlZCBpdHMgZW5kIG9mIHRoZSBjb25uZWN0aW9uLiAqLworICAgICAgICBpZiAoaW5zZWcucC0+dG90X2xlbiA+IDApIHsKKyAgICAgICAgICByZWN2X2RhdGEgPSBpbnNlZy5wOworICAgICAgICAgIC8qIFNpbmNlIHRoaXMgcGJ1ZiBub3cgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQorICAgICAgICAgICAgIGFwcGxpY2F0aW9uLCB3ZSBkZWxldGUgb3VyIHJlZmVyZW5jZSB0byBpdCBzbyB0aGF0IHdlIHdvbid0CisgICAgICAgICAgICAgKG1pc3Rha2luZ2x5KSBkZWFsbG9jYXRlIGl0LiAqLworICAgICAgICAgIGluc2VnLnAgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChUQ1BIX0ZMQUdTKGluc2VnLnRjcGhkcikgJiBUQ1BfRklOKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoVENQX0lOUFVUX0RFQlVHLCAoInRjcF9yZWNlaXZlOiByZWNlaXZlZCBGSU4uXG4iKSk7CisgICAgICAgICAgcmVjdl9mbGFncyB8PSBURl9HT1RfRklOOworICAgICAgICB9CisKKyNpZiBUQ1BfUVVFVUVfT09TRVEKKyAgICAgICAgLyogV2Ugbm93IGNoZWNrIGlmIHdlIGhhdmUgc2VnbWVudHMgb24gdGhlIC0+b29zZXEgcXVldWUgdGhhdAorICAgICAgICAgICBhcmUgbm93IGluIHNlcXVlbmNlLiAqLworICAgICAgICB3aGlsZSAocGNiLT5vb3NlcSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICBwY2ItPm9vc2VxLT50Y3BoZHItPnNlcW5vID09IHBjYi0+cmN2X254dCkgeworCisgICAgICAgICAgY3NlZyA9IHBjYi0+b29zZXE7CisgICAgICAgICAgc2Vxbm8gPSBwY2ItPm9vc2VxLT50Y3BoZHItPnNlcW5vOworCisgICAgICAgICAgcGNiLT5yY3Zfbnh0ICs9IFRDUF9UQ1BMRU4oY3NlZyk7CisgICAgICAgICAgTFdJUF9BU1NFUlQoInRjcF9yZWNlaXZlOiBvb3NlcSB0Y3BsZW4gPiByY3Zfd25kXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBjYi0+cmN2X3duZCA+PSBUQ1BfVENQTEVOKGNzZWcpKTsKKyAgICAgICAgICBwY2ItPnJjdl93bmQgLT0gVENQX1RDUExFTihjc2VnKTsKKworICAgICAgICAgIHRjcF91cGRhdGVfcmN2X2Fubl93bmQocGNiKTsKKworICAgICAgICAgIGlmIChjc2VnLT5wLT50b3RfbGVuID4gMCkgeworICAgICAgICAgICAgLyogQ2hhaW4gdGhpcyBwYnVmIG9udG8gdGhlIHBidWYgdGhhdCB3ZSB3aWxsIHBhc3MgdG8KKyAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbi4gKi8KKyAgICAgICAgICAgIGlmIChyZWN2X2RhdGEpIHsKKyAgICAgICAgICAgICAgcGJ1Zl9jYXQocmVjdl9kYXRhLCBjc2VnLT5wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJlY3ZfZGF0YSA9IGNzZWctPnA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjc2VnLT5wID0gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKFRDUEhfRkxBR1MoY3NlZy0+dGNwaGRyKSAmIFRDUF9GSU4pIHsKKyAgICAgICAgICAgIExXSVBfREVCVUdGKFRDUF9JTlBVVF9ERUJVRywgKCJ0Y3BfcmVjZWl2ZTogZGVxdWV1ZWQgRklOLlxuIikpOworICAgICAgICAgICAgcmVjdl9mbGFncyB8PSBURl9HT1RfRklOOworICAgICAgICAgICAgaWYgKHBjYi0+c3RhdGUgPT0gRVNUQUJMSVNIRUQpIHsgLyogZm9yY2UgcGFzc2l2ZSBjbG9zZSBvciB3ZSBjYW4gbW92ZSB0byBhY3RpdmUgY2xvc2UgKi8KKyAgICAgICAgICAgICAgcGNiLT5zdGF0ZSA9IENMT1NFX1dBSVQ7CisgICAgICAgICAgICB9IAorICAgICAgICAgIH0KKworICAgICAgICAgIHBjYi0+b29zZXEgPSBjc2VnLT5uZXh0OworICAgICAgICAgIHRjcF9zZWdfZnJlZShjc2VnKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFRDUF9RVUVVRV9PT1NFUSAqLworCisKKyAgICAgICAgLyogQWNrbm93bGVkZ2UgdGhlIHNlZ21lbnQocykuICovCisgICAgICAgIHRjcF9hY2socGNiKTsKKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2UgZ2V0IGhlcmUgaWYgdGhlIGluY29taW5nIHNlZ21lbnQgaXMgb3V0LW9mLXNlcXVlbmNlLiAqLworICAgICAgICB0Y3Bfc2VuZF9lbXB0eV9hY2socGNiKTsKKyNpZiBUQ1BfUVVFVUVfT09TRVEKKyAgICAgICAgLyogV2UgcXVldWUgdGhlIHNlZ21lbnQgb24gdGhlIC0+b29zZXEgcXVldWUuICovCisgICAgICAgIGlmIChwY2ItPm9vc2VxID09IE5VTEwpIHsKKyAgICAgICAgICBwY2ItPm9vc2VxID0gdGNwX3NlZ19jb3B5KCZpbnNlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogSWYgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eSwgd2Ugd2FsayB0aHJvdWdoIHRoZSBxdWV1ZSBhbmQKKyAgICAgICAgICAgICB0cnkgdG8gZmluZCBhIHBsYWNlIHdoZXJlIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlCisgICAgICAgICAgICAgaW5jb21pbmcgc2VnbWVudCBpcyBiZXR3ZWVuIHRoZSBzZXF1ZW5jZSBudW1iZXJzIG9mIHRoZQorICAgICAgICAgICAgIHByZXZpb3VzIGFuZCB0aGUgbmV4dCBzZWdtZW50IG9uIHRoZSAtPm9vc2VxIHF1ZXVlLiBUaGF0IGlzCisgICAgICAgICAgICAgdGhlIHBsYWNlIHdoZXJlIHdlIHB1dCB0aGUgaW5jb21pbmcgc2VnbWVudC4gSWYgbmVlZGVkLCB3ZQorICAgICAgICAgICAgIHRyaW0gdGhlIHNlY29uZCBlZGdlcyBvZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBpbmNvbWluZworICAgICAgICAgICAgIHNlZ21lbnQgc28gdGhhdCBpdCB3aWxsIGZpdCBpbnRvIHRoZSBzZXF1ZW5jZS4KKworICAgICAgICAgICAgIElmIHRoZSBpbmNvbWluZyBzZWdtZW50IGhhcyB0aGUgc2FtZSBzZXF1ZW5jZSBudW1iZXIgYXMgYQorICAgICAgICAgICAgIHNlZ21lbnQgb24gdGhlIC0+b29zZXEgcXVldWUsIHdlIGRpc2NhcmQgdGhlIHNlZ21lbnQgdGhhdAorICAgICAgICAgICAgIGNvbnRhaW5zIGxlc3MgZGF0YS4gKi8KKworICAgICAgICAgIHByZXYgPSBOVUxMOworICAgICAgICAgIGZvcihuZXh0ID0gcGNiLT5vb3NlcTsgbmV4dCAhPSBOVUxMOyBuZXh0ID0gbmV4dC0+bmV4dCkgeworICAgICAgICAgICAgaWYgKHNlcW5vID09IG5leHQtPnRjcGhkci0+c2Vxbm8pIHsKKyAgICAgICAgICAgICAgLyogVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgaW5jb21pbmcgc2VnbWVudCBpcyB0aGUKKyAgICAgICAgICAgICAgICAgc2FtZSBhcyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzZWdtZW50IG9uCisgICAgICAgICAgICAgICAgIC0+b29zZXEuIFdlIGNoZWNrIHRoZSBsZW5ndGhzIHRvIHNlZSB3aGljaCBvbmUgdG8KKyAgICAgICAgICAgICAgICAgZGlzY2FyZC4gKi8KKyAgICAgICAgICAgICAgaWYgKGluc2VnLmxlbiA+IG5leHQtPmxlbikgeworICAgICAgICAgICAgICAgIC8qIFRoZSBpbmNvbWluZyBzZWdtZW50IGlzIGxhcmdlciB0aGFuIHRoZSBvbGQKKyAgICAgICAgICAgICAgICAgICBzZWdtZW50LiBXZSByZXBsYWNlIHNvbWUgc2VnbWVudHMgd2l0aCB0aGUgbmV3CisgICAgICAgICAgICAgICAgICAgb25lLiAqLworICAgICAgICAgICAgICAgIGNzZWcgPSB0Y3Bfc2VnX2NvcHkoJmluc2VnKTsKKyAgICAgICAgICAgICAgICBpZiAoY3NlZyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBjc2VnOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGNiLT5vb3NlcSA9IGNzZWc7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB0Y3Bfb29zX2luc2VydF9zZWdtZW50KGNzZWcsIG5leHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBFaXRoZXIgdGhlIGxlbmdodHMgYXJlIHRoZSBzYW1lIG9yIHRoZSBpbmNvbWluZworICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgd2FzIHNtYWxsZXIgdGhhbiB0aGUgb2xkIG9uZTsgaW4gZWl0aGVyCisgICAgICAgICAgICAgICAgICAgY2FzZSwgd2UgZGl0Y2ggdGhlIGluY29taW5nIHNlZ21lbnQuICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoVENQX1NFUV9MVChzZXFubywgbmV4dC0+dGNwaGRyLT5zZXFubykpIHsKKyAgICAgICAgICAgICAgICAgIC8qIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGluY29taW5nIHNlZ21lbnQgaXMgbG93ZXIKKyAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgZmlyc3Qgc2VnbWVudCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLiBXZSBwdXQgdGhlIGluY29taW5nIHNlZ21lbnQgZmlyc3Qgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICBxdWV1ZS4gKi8KKyAgICAgICAgICAgICAgICAgIGNzZWcgPSB0Y3Bfc2VnX2NvcHkoJmluc2VnKTsKKyAgICAgICAgICAgICAgICAgIGlmIChjc2VnICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGNiLT5vb3NlcSA9IGNzZWc7CisgICAgICAgICAgICAgICAgICAgIHRjcF9vb3NfaW5zZXJ0X3NlZ21lbnQoY3NlZywgbmV4dCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyppZiAoVENQX1NFUV9MVChwcmV2LT50Y3BoZHItPnNlcW5vLCBzZXFubykgJiYKKyAgICAgICAgICAgICAgICAgIFRDUF9TRVFfTFQoc2Vxbm8sIG5leHQtPnRjcGhkci0+c2Vxbm8pKSB7Ki8KKyAgICAgICAgICAgICAgICBpZiAoVENQX1NFUV9CRVRXRUVOKHNlcW5vLCBwcmV2LT50Y3BoZHItPnNlcW5vKzEsIG5leHQtPnRjcGhkci0+c2Vxbm8tMSkpIHsKKyAgICAgICAgICAgICAgICAgIC8qIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGluY29taW5nIHNlZ21lbnQgaXMgaW4KKyAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdGhlIHNlcXVlbmNlIG51bWJlcnMgb2YgdGhlIHByZXZpb3VzIGFuZAorICAgICAgICAgICAgICAgICAgICAgdGhlIG5leHQgc2VnbWVudCBvbiAtPm9vc2VxLiBXZSB0cmltIHRyaW0gdGhlIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LCBkZWxldGUgbmV4dCBzZWdtZW50cyB0aGF0IGluY2x1ZGVkIGluIHJlY2VpdmVkIHNlZ21lbnQKKyAgICAgICAgICAgICAgICAgICAgIGFuZCB0cmltIHJlY2VpdmVkLCBpZiBuZWVkZWQuICovCisgICAgICAgICAgICAgICAgICBjc2VnID0gdGNwX3NlZ19jb3B5KCZpbnNlZyk7CisgICAgICAgICAgICAgICAgICBpZiAoY3NlZyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChUQ1BfU0VRX0dUKHByZXYtPnRjcGhkci0+c2Vxbm8gKyBwcmV2LT5sZW4sIHNlcW5vKSkgeworICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdHJpbSB0aGUgcHJldiBzZWdtZW50LiAqLworICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmxlbiA9ICh1MTZfdCkoc2Vxbm8gLSBwcmV2LT50Y3BoZHItPnNlcW5vKTsKKyAgICAgICAgICAgICAgICAgICAgICBwYnVmX3JlYWxsb2MocHJldi0+cCwgcHJldi0+bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmV2LT5uZXh0ID0gY3NlZzsKKyAgICAgICAgICAgICAgICAgICAgdGNwX29vc19pbnNlcnRfc2VnbWVudChjc2VnLCBuZXh0KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBJZiB0aGUgIm5leHQiIHNlZ21lbnQgaXMgdGhlIGxhc3Qgc2VnbWVudCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgb29zZXEgcXVldWUsIHdlIGFkZCB0aGUgaW5jb21pbmcgc2VnbWVudCB0byB0aGUgZW5kCisgICAgICAgICAgICAgICAgIG9mIHRoZSBsaXN0LiAqLworICAgICAgICAgICAgICBpZiAobmV4dC0+bmV4dCA9PSBOVUxMICYmCisgICAgICAgICAgICAgICAgICBUQ1BfU0VRX0dUKHNlcW5vLCBuZXh0LT50Y3BoZHItPnNlcW5vKSkgeworICAgICAgICAgICAgICAgIGlmIChUQ1BIX0ZMQUdTKG5leHQtPnRjcGhkcikgJiBUQ1BfRklOKSB7CisgICAgICAgICAgICAgICAgICAvKiBzZWdtZW50ICJuZXh0IiBhbHJlYWR5IGNvbnRhaW5zIGFsbCBkYXRhICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV4dC0+bmV4dCA9IHRjcF9zZWdfY29weSgmaW5zZWcpOworICAgICAgICAgICAgICAgIGlmIChuZXh0LT5uZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChUQ1BfU0VRX0dUKG5leHQtPnRjcGhkci0+c2Vxbm8gKyBuZXh0LT5sZW4sIHNlcW5vKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHRyaW0gdGhlIGxhc3Qgc2VnbWVudC4gKi8KKyAgICAgICAgICAgICAgICAgICAgbmV4dC0+bGVuID0gKHUxNl90KShzZXFubyAtIG5leHQtPnRjcGhkci0+c2Vxbm8pOworICAgICAgICAgICAgICAgICAgICBwYnVmX3JlYWxsb2MobmV4dC0+cCwgbmV4dC0+bGVuKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZSByZW1vdGUgc2lkZSBvdmVycnVucyBvdXIgcmVjZWl2ZSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgIGlmICgodTMyX3QpdGNwbGVuICsgc2Vxbm8gPiBwY2ItPnJjdl9ueHQgKyAodTMyX3QpcGNiLT5yY3Zfd25kKSB7CisgICAgICAgICAgICAgICAgICAgIExXSVBfREVCVUdGKFRDUF9JTlBVVF9ERUJVRywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgidGNwX3JlY2VpdmU6IG90aGVyIGVuZCBvdmVycmFuIHJlY2VpdmUgd2luZG93IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcW5vICUiVTMyX0YiIGxlbiAlIlUxNl9GIiByaWdodCBlZGdlICUiVTMyX0YiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vxbm8sIHRjcGxlbiwgcGNiLT5yY3Zfbnh0ICsgcGNiLT5yY3Zfd25kKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChUQ1BIX0ZMQUdTKG5leHQtPm5leHQtPnRjcGhkcikgJiBUQ1BfRklOKSB7CisgICAgICAgICAgICAgICAgICAgICAgLyogTXVzdCByZW1vdmUgdGhlIEZJTiBmcm9tIHRoZSBoZWFkZXIgYXMgd2UncmUgdHJpbW1pbmcgCisgICAgICAgICAgICAgICAgICAgICAgICogdGhhdCBieXRlIG9mIHNlcXVlbmNlLXNwYWNlIGZyb20gdGhlIHBhY2tldCAqLworICAgICAgICAgICAgICAgICAgICAgIFRDUEhfRkxBR1NfU0VUKG5leHQtPm5leHQtPnRjcGhkciwgVENQSF9GTEFHUyhuZXh0LT5uZXh0LT50Y3BoZHIpICZ+IFRDUF9GSU4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIEFkanVzdCBsZW5ndGggb2Ygc2VnbWVudCB0byBmaXQgaW4gdGhlIHdpbmRvdy4gKi8KKyAgICAgICAgICAgICAgICAgICAgbmV4dC0+bmV4dC0+bGVuID0gcGNiLT5yY3Zfbnh0ICsgcGNiLT5yY3Zfd25kIC0gc2Vxbm87CisgICAgICAgICAgICAgICAgICAgIHBidWZfcmVhbGxvYyhuZXh0LT5uZXh0LT5wLCBuZXh0LT5uZXh0LT5sZW4pOworICAgICAgICAgICAgICAgICAgICB0Y3BsZW4gPSBUQ1BfVENQTEVOKG5leHQtPm5leHQpOworICAgICAgICAgICAgICAgICAgICBMV0lQX0FTU0VSVCgidGNwX3JlY2VpdmU6IHNlZ21lbnQgbm90IHRyaW1tZWQgY29ycmVjdGx5IHRvIHJjdl93bmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXFubyArIHRjcGxlbikgPT0gKHBjYi0+cmN2X254dCArIHBjYi0+cmN2X3duZCkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogVENQX1FVRVVFX09PU0VRICovCisKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogVGhlIGluY29taW5nIHNlZ21lbnQgaXMgbm90IHdpdGhpbmcgdGhlIHdpbmRvdy4gKi8KKyAgICAgIHRjcF9zZW5kX2VtcHR5X2FjayhwY2IpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBTZWdtZW50cyB3aXRoIGxlbmd0aCAwIGlzIHRha2VuIGNhcmUgb2YgaGVyZS4gU2VnbWVudHMgdGhhdAorICAgICAgIGZhbGwgb3V0IG9mIHRoZSB3aW5kb3cgYXJlIEFDS2VkLiAqLworICAgIC8qaWYgKFRDUF9TRVFfR1QocGNiLT5yY3Zfbnh0LCBzZXFubykgfHwKKyAgICAgIFRDUF9TRVFfR0VRKHNlcW5vLCBwY2ItPnJjdl9ueHQgKyBwY2ItPnJjdl93bmQpKSB7Ki8KKyAgICBpZighVENQX1NFUV9CRVRXRUVOKHNlcW5vLCBwY2ItPnJjdl9ueHQsIHBjYi0+cmN2X254dCArIHBjYi0+cmN2X3duZC0xKSl7CisgICAgICB0Y3BfYWNrX25vdyhwY2IpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFBhcnNlcyB0aGUgb3B0aW9ucyBjb250YWluZWQgaW4gdGhlIGluY29taW5nIHNlZ21lbnQuIAorICoKKyAqIENhbGxlZCBmcm9tIHRjcF9saXN0ZW5faW5wdXQoKSBhbmQgdGNwX3Byb2Nlc3MoKS4KKyAqIEN1cnJlbnRseSwgb25seSB0aGUgTVNTIG9wdGlvbiBpcyBzdXBwb3J0ZWQhCisgKgorICogQHBhcmFtIHBjYiB0aGUgdGNwX3BjYiBmb3Igd2hpY2ggYSBzZWdtZW50IGFycml2ZWQKKyAqLworc3RhdGljIHZvaWQKK3RjcF9wYXJzZW9wdChzdHJ1Y3QgdGNwX3BjYiAqcGNiKQoreworICB1MTZfdCBjLCBtYXhfYzsKKyAgdTE2X3QgbXNzOworICB1OF90ICpvcHRzLCBvcHQ7CisjaWYgTFdJUF9UQ1BfVElNRVNUQU1QUworICB1MzJfdCB0c3ZhbDsKKyNlbmRpZgorCisgIG9wdHMgPSAodThfdCAqKXRjcGhkciArIFRDUF9ITEVOOworCisgIC8qIFBhcnNlIHRoZSBUQ1AgTVNTIG9wdGlvbiwgaWYgcHJlc2VudC4gKi8KKyAgaWYoVENQSF9IRFJMRU4odGNwaGRyKSA+IDB4NSkgeworICAgIG1heF9jID0gKFRDUEhfSERSTEVOKHRjcGhkcikgLSA1KSA8PCAyOworICAgIGZvciAoYyA9IDA7IGMgPCBtYXhfYzsgKSB7CisgICAgICBvcHQgPSBvcHRzW2NdOworICAgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgLyogRW5kIG9mIG9wdGlvbnMuICovCisgICAgICAgIExXSVBfREVCVUdGKFRDUF9JTlBVVF9ERUJVRywgKCJ0Y3BfcGFyc2VvcHQ6IEVPTFxuIikpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIDB4MDE6CisgICAgICAgIC8qIE5PUCBvcHRpb24uICovCisgICAgICAgICsrYzsKKyAgICAgICAgTFdJUF9ERUJVR0YoVENQX0lOUFVUX0RFQlVHLCAoInRjcF9wYXJzZW9wdDogTk9QXG4iKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDAyOgorICAgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX3BhcnNlb3B0OiBNU1NcbiIpKTsKKyAgICAgICAgaWYgKG9wdHNbYyArIDFdICE9IDB4MDQgfHwgYyArIDB4MDQgPiBtYXhfYykgeworICAgICAgICAgIC8qIEJhZCBsZW5ndGggKi8KKyAgICAgICAgICBMV0lQX0RFQlVHRihUQ1BfSU5QVVRfREVCVUcsICgidGNwX3BhcnNlb3B0OiBiYWQgbGVuZ3RoXG4iKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIEFuIE1TUyBvcHRpb24gd2l0aCB0aGUgcmlnaHQgb3B0aW9uIGxlbmd0aC4gKi8KKyAgICAgICAgbXNzID0gKG9wdHNbYyArIDJdIDw8IDgpIHwgb3B0c1tjICsgM107CisgICAgICAgIC8qIExpbWl0IHRoZSBtc3MgdG8gdGhlIGNvbmZpZ3VyZWQgVENQX01TUyBhbmQgcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvICovCisgICAgICAgIHBjYi0+bXNzID0gKChtc3MgPiBUQ1BfTVNTKSB8fCAobXNzID09IDApKSA/IFRDUF9NU1MgOiBtc3M7CisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBvcHRpb24gKi8KKyAgICAgICAgYyArPSAweDA0OworICAgICAgICBicmVhazsKKyNpZiBMV0lQX1RDUF9USU1FU1RBTVBTCisgICAgICBjYXNlIDB4MDg6CisgICAgICAgIExXSVBfREVCVUdGKFRDUF9JTlBVVF9ERUJVRywgKCJ0Y3BfcGFyc2VvcHQ6IFRTXG4iKSk7CisgICAgICAgIGlmIChvcHRzW2MgKyAxXSAhPSAweDBBIHx8IGMgKyAweDBBID4gbWF4X2MpIHsKKyAgICAgICAgICAvKiBCYWQgbGVuZ3RoICovCisgICAgICAgICAgTFdJUF9ERUJVR0YoVENQX0lOUFVUX0RFQlVHLCAoInRjcF9wYXJzZW9wdDogYmFkIGxlbmd0aFxuIikpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvKiBUQ1AgdGltZXN0YW1wIG9wdGlvbiB3aXRoIHZhbGlkIGxlbmd0aCAqLworICAgICAgICB0c3ZhbCA9IChvcHRzW2MrMl0pIHwgKG9wdHNbYyszXSA8PCA4KSB8IAorICAgICAgICAgIChvcHRzW2MrNF0gPDwgMTYpIHwgKG9wdHNbYys1XSA8PCAyNCk7CisgICAgICAgIGlmIChmbGFncyAmIFRDUF9TWU4pIHsKKyAgICAgICAgICBwY2ItPnRzX3JlY2VudCA9IG50b2hsKHRzdmFsKTsKKyAgICAgICAgICBwY2ItPmZsYWdzIHw9IFRGX1RJTUVTVEFNUDsKKyAgICAgICAgfSBlbHNlIGlmIChUQ1BfU0VRX0JFVFdFRU4ocGNiLT50c19sYXN0YWNrc2VudCwgc2Vxbm8sIHNlcW5vK3RjcGxlbikpIHsKKyAgICAgICAgICBwY2ItPnRzX3JlY2VudCA9IG50b2hsKHRzdmFsKTsKKyAgICAgICAgfQorICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgb3B0aW9uICovCisgICAgICAgIGMgKz0gMHgwQTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExXSVBfREVCVUdGKFRDUF9JTlBVVF9ERUJVRywgKCJ0Y3BfcGFyc2VvcHQ6IG90aGVyXG4iKSk7CisgICAgICAgIGlmIChvcHRzW2MgKyAxXSA9PSAwKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoVENQX0lOUFVUX0RFQlVHLCAoInRjcF9wYXJzZW9wdDogYmFkIGxlbmd0aFxuIikpOworICAgICAgICAgIC8qIElmIHRoZSBsZW5ndGggZmllbGQgaXMgemVybywgdGhlIG9wdGlvbnMgYXJlIG1hbGZvcm1lZAorICAgICAgICAgICAgIGFuZCB3ZSBkb24ndCBwcm9jZXNzIHRoZW0gZnVydGhlci4gKi8KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLyogQWxsIG90aGVyIG9wdGlvbnMgaGF2ZSBhIGxlbmd0aCBmaWVsZCwgc28gdGhhdCB3ZSBlYXNpbHkKKyAgICAgICAgICAgY2FuIHNraXAgcGFzdCB0aGVtLiAqLworICAgICAgICBjICs9IG9wdHNbYyArIDFdOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS90Y3Bfb3V0LmMgYi9jb3JlL2x3aXAvc3JjL2NvcmUvdGNwX291dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTA5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2NvcmUvdGNwX291dC5jCkBAIC0wLDAgKzEsMTQ2OCBAQAorLyoqCisgKiBAZmlsZQorICogVHJhbnNtaXNzaW9uIENvbnRyb2wgUHJvdG9jb2wsIG91dGdvaW5nIHRyYWZmaWMKKyAqCisgKiBUaGUgb3V0cHV0IGZ1bmN0aW9ucyBvZiBUQ1AuCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfVENQIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC90Y3BfaW1wbC5oIgorI2luY2x1ZGUgImx3aXAvZGVmLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL21lbXAuaCIKKyNpbmNsdWRlICJsd2lwL3N5cy5oIgorI2luY2x1ZGUgImx3aXAvaXBfYWRkci5oIgorI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKyNpbmNsdWRlICJsd2lwL2luZXRfY2hrc3VtLmgiCisjaW5jbHVkZSAibHdpcC9zdGF0cy5oIgorI2luY2x1ZGUgImx3aXAvc25tcC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIERlZmluZSBzb21lIGNvcHktbWFjcm9zIGZvciBjaGVja3N1bS1vbi1jb3B5IHNvIHRoYXQgdGhlIGNvZGUgbG9va3MKKyAgIG5pY2VyIGJ5IHByZXZlbnRpbmcgdG9vIG1hbnkgaWZkZWYncy4gKi8KKyNpZiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWQorI2RlZmluZSBUQ1BfREFUQV9DT1BZKGRzdCwgc3JjLCBsZW4sIHNlZykgZG8geyBcCisgIHRjcF9zZWdfYWRkX2Noa3N1bShMV0lQX0NIS1NVTV9DT1BZKGRzdCwgc3JjLCBsZW4pLCBcCisgICAgICAgICAgICAgICAgICAgICBsZW4sICZzZWctPmNoa3N1bSwgJnNlZy0+Y2hrc3VtX3N3YXBwZWQpOyBcCisgIHNlZy0+ZmxhZ3MgfD0gVEZfU0VHX0RBVEFfQ0hFQ0tTVU1NRUQ7IH0gd2hpbGUoMCkKKyNkZWZpbmUgVENQX0RBVEFfQ09QWTIoZHN0LCBzcmMsIGxlbiwgY2hrc3VtLCBjaGtzdW1fc3dhcHBlZCkgIFwKKyAgdGNwX3NlZ19hZGRfY2hrc3VtKExXSVBfQ0hLU1VNX0NPUFkoZHN0LCBzcmMsIGxlbiksIGxlbiwgY2hrc3VtLCBjaGtzdW1fc3dhcHBlZCk7CisjZWxzZSAvKiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWSovCisjZGVmaW5lIFRDUF9EQVRBX0NPUFkoZHN0LCBzcmMsIGxlbiwgc2VnKSAgICAgICAgICAgICAgICAgICAgIE1FTUNQWShkc3QsIHNyYywgbGVuKQorI2RlZmluZSBUQ1BfREFUQV9DT1BZMihkc3QsIHNyYywgbGVuLCBjaGtzdW0sIGNoa3N1bV9zd2FwcGVkKSBNRU1DUFkoZHN0LCBzcmMsIGxlbikKKyNlbmRpZiAvKiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWSovCisKKy8qKiBEZWZpbmUgdGhpcyB0byAxIGZvciBhbiBleHRyYSBjaGVjayB0aGF0IHRoZSBvdXRwdXQgY2hlY2tzdW0gaXMgdmFsaWQKKyAqICh1c2VmdWxlIHdoZW4gdGhlIGNoZWNrc3VtIGlzIGdlbmVyYXRlZCBieSB0aGUgYXBwbGljYXRpb24sIG5vdCB0aGUgc3RhY2spICovCisjaWZuZGVmIFRDUF9DSEVDS1NVTV9PTl9DT1BZX1NBTklUWV9DSEVDSworI2RlZmluZSBUQ1BfQ0hFQ0tTVU1fT05fQ09QWV9TQU5JVFlfQ0hFQ0sgICAwCisjZW5kaWYKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuKi8KK3N0YXRpYyB2b2lkIHRjcF9vdXRwdXRfc2VnbWVudChzdHJ1Y3QgdGNwX3NlZyAqc2VnLCBzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKKworLyoqIEFsbG9jYXRlIGEgcGJ1ZiBhbmQgY3JlYXRlIGEgdGNwaGRyIGF0IHAtPnBheWxvYWQsIHVzZWQgZm9yIG91dHB1dAorICogZnVuY3Rpb25zIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgdGNwX291dHB1dCAtPiB0Y3Bfb3V0cHV0X3NlZ21lbnQKKyAqIChlLmcuIHRjcF9zZW5kX2VtcHR5X2FjaywgZXRjLikKKyAqCisgKiBAcGFyYW0gcGNiIHRjcCBwY2IgZm9yIHdoaWNoIHRvIHNlbmQgYSBwYWNrZXQgKHVzZWQgdG8gaW5pdGlhbGl6ZSB0Y3BfaGRyKQorICogQHBhcmFtIG9wdGxlbiBsZW5ndGggb2YgaGVhZGVyLW9wdGlvbnMKKyAqIEBwYXJhbSBkYXRhbGVuIGxlbmd0aCBvZiB0Y3AgZGF0YSB0byByZXNlcnZlIGluIHBidWYKKyAqIEBwYXJhbSBzZXFub19iZSBzZXFubyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4pCisgKiBAcmV0dXJuIHBidWYgd2l0aCBwLT5wYXlsb2FkIGJlaW5nIHRoZSB0Y3BfaGRyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGJ1ZiAqCit0Y3Bfb3V0cHV0X2FsbG9jX2hlYWRlcihzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB1MTZfdCBvcHRsZW4sIHUxNl90IGRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdTMyX3Qgc2Vxbm9fYmUgLyogYWxyZWFkeSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8pCit7CisgIHN0cnVjdCB0Y3BfaGRyICp0Y3BoZHI7CisgIHN0cnVjdCBwYnVmICpwID0gcGJ1Zl9hbGxvYyhQQlVGX0lQLCBUQ1BfSExFTiArIG9wdGxlbiArIGRhdGFsZW4sIFBCVUZfUkFNKTsKKyAgaWYgKHAgIT0gTlVMTCkgeworICAgIExXSVBfQVNTRVJUKCJjaGVjayB0aGF0IGZpcnN0IHBidWYgY2FuIGhvbGQgc3RydWN0IHRjcF9oZHIiLAorICAgICAgICAgICAgICAgICAocC0+bGVuID49IFRDUF9ITEVOICsgb3B0bGVuKSk7CisgICAgdGNwaGRyID0gKHN0cnVjdCB0Y3BfaGRyICopcC0+cGF5bG9hZDsKKyAgICB0Y3BoZHItPnNyYyA9IGh0b25zKHBjYi0+bG9jYWxfcG9ydCk7CisgICAgdGNwaGRyLT5kZXN0ID0gaHRvbnMocGNiLT5yZW1vdGVfcG9ydCk7CisgICAgdGNwaGRyLT5zZXFubyA9IHNlcW5vX2JlOworICAgIHRjcGhkci0+YWNrbm8gPSBodG9ubChwY2ItPnJjdl9ueHQpOworICAgIFRDUEhfSERSTEVOX0ZMQUdTX1NFVCh0Y3BoZHIsICg1ICsgb3B0bGVuIC8gNCksIFRDUF9BQ0spOworICAgIHRjcGhkci0+d25kID0gaHRvbnMocGNiLT5yY3ZfYW5uX3duZCk7CisgICAgdGNwaGRyLT5jaGtzdW0gPSAwOworICAgIHRjcGhkci0+dXJncCA9IDA7CisKKyAgICAvKiBJZiB3ZSdyZSBzZW5kaW5nIGEgcGFja2V0LCB1cGRhdGUgdGhlIGFubm91bmNlZCByaWdodCB3aW5kb3cgZWRnZSAqLworICAgIHBjYi0+cmN2X2Fubl9yaWdodF9lZGdlID0gcGNiLT5yY3Zfbnh0ICsgcGNiLT5yY3ZfYW5uX3duZDsKKyAgfQorICByZXR1cm4gcDsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgdGNwX2Nsb3NlKCkgdG8gc2VuZCBhIHNlZ21lbnQgaW5jbHVkaW5nIEZJTiBmbGFnIGJ1dCBub3QgZGF0YS4KKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB0Y3BfcGNiIG92ZXIgd2hpY2ggdG8gc2VuZCBhIHNlZ21lbnQKKyAqIEByZXR1cm4gRVJSX09LIGlmIHNlbnQsIGFub3RoZXIgZXJyX3Qgb3RoZXJ3aXNlCisgKi8KK2Vycl90Cit0Y3Bfc2VuZF9maW4oc3RydWN0IHRjcF9wY2IgKnBjYikKK3sKKyAgLyogZmlyc3QsIHRyeSB0byBhZGQgdGhlIGZpbiB0byB0aGUgbGFzdCB1bnNlbnQgc2VnbWVudCAqLworICBpZiAocGNiLT51bnNlbnQgIT0gTlVMTCkgeworICAgIHN0cnVjdCB0Y3Bfc2VnICpsYXN0X3Vuc2VudDsKKyAgICBmb3IgKGxhc3RfdW5zZW50ID0gcGNiLT51bnNlbnQ7IGxhc3RfdW5zZW50LT5uZXh0ICE9IE5VTEw7CisgICAgICAgICBsYXN0X3Vuc2VudCA9IGxhc3RfdW5zZW50LT5uZXh0KTsKKworICAgIGlmICgoVENQSF9GTEFHUyhsYXN0X3Vuc2VudC0+dGNwaGRyKSAmIChUQ1BfU1lOIHwgVENQX0ZJTiB8IFRDUF9SU1QpKSA9PSAwKSB7CisgICAgICAvKiBubyBTWU4vRklOL1JTVCBmbGFnIGluIHRoZSBoZWFkZXIsIHdlIGNhbiBhZGQgdGhlIEZJTiBmbGFnICovCisgICAgICBUQ1BIX1NFVF9GTEFHKGxhc3RfdW5zZW50LT50Y3BoZHIsIFRDUF9GSU4pOworICAgICAgcmV0dXJuIEVSUl9PSzsKKyAgICB9CisgIH0KKyAgLyogbm8gZGF0YSwgbm8gbGVuZ3RoLCBmbGFncywgY29weT0xLCBubyBvcHRkYXRhICovCisgIHJldHVybiB0Y3BfZW5xdWV1ZV9mbGFncyhwY2IsIFRDUF9GSU4pOworfQorCisvKioKKyAqIENyZWF0ZSBhIFRDUCBzZWdtZW50IHdpdGggcHJlZmlsbGVkIGhlYWRlci4KKyAqCisgKiBDYWxsZWQgYnkgdGNwX3dyaXRlIGFuZCB0Y3BfZW5xdWV1ZV9mbGFncy4KKyAqCisgKiBAcGFyYW0gcGNiIFByb3RvY29sIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBUQ1AgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBwIHBidWYgdGhhdCBpcyB1c2VkIHRvIGhvbGQgdGhlIFRDUCBoZWFkZXIuCisgKiBAcGFyYW0gZmxhZ3MgVENQIGZsYWdzIGZvciBoZWFkZXIuCisgKiBAcGFyYW0gc2Vxbm8gVENQIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIHBhY2tldAorICogQHBhcmFtIG9wdGZsYWdzIG9wdGlvbnMgdG8gaW5jbHVkZSBpbiBUQ1AgaGVhZGVyCisgKiBAcmV0dXJuIGEgbmV3IHRjcF9zZWcgcG9pbnRpbmcgdG8gcCwgb3IgTlVMTC4KKyAqIFRoZSBUQ1AgaGVhZGVyIGlzIGZpbGxlZCBpbiBleGNlcHQgYWNrbm8gYW5kIHduZC4KKyAqIHAgaXMgZnJlZWQgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCB0Y3Bfc2VnICoKK3RjcF9jcmVhdGVfc2VnbWVudChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwgdThfdCBmbGFncywgdTMyX3Qgc2Vxbm8sIHU4X3Qgb3B0ZmxhZ3MpCit7CisgIHN0cnVjdCB0Y3Bfc2VnICpzZWc7CisgIHU4X3Qgb3B0bGVuID0gTFdJUF9UQ1BfT1BUX0xFTkdUSChvcHRmbGFncyk7CisKKyAgaWYgKChzZWcgPSAoc3RydWN0IHRjcF9zZWcgKiltZW1wX21hbGxvYyhNRU1QX1RDUF9TRUcpKSA9PSBOVUxMKSB7CisgICAgTFdJUF9ERUJVR0YoVENQX09VVFBVVF9ERUJVRyB8IDIsICgidGNwX2NyZWF0ZV9zZWdtZW50OiBubyBtZW1vcnkuXG4iKSk7CisgICAgcGJ1Zl9mcmVlKHApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHNlZy0+ZmxhZ3MgPSBvcHRmbGFnczsKKyAgc2VnLT5uZXh0ID0gTlVMTDsKKyAgc2VnLT5wID0gcDsKKyAgc2VnLT5sZW4gPSBwLT50b3RfbGVuIC0gb3B0bGVuOworI2lmIFRDUF9PVkVSU0laRV9EQkdDSEVDSworICBzZWctPm92ZXJzaXplX2xlZnQgPSAwOworI2VuZGlmIC8qIFRDUF9PVkVSU0laRV9EQkdDSEVDSyAqLworI2lmIFRDUF9DSEVDS1NVTV9PTl9DT1BZCisgIHNlZy0+Y2hrc3VtID0gMDsKKyAgc2VnLT5jaGtzdW1fc3dhcHBlZCA9IDA7CisgIC8qIGNoZWNrIG9wdGZsYWdzICovCisgIExXSVBfQVNTRVJUKCJpbnZhbGlkIG9wdGZsYWdzIHBhc3NlZDogVEZfU0VHX0RBVEFfQ0hFQ0tTVU1NRUQiLAorICAgICAgICAgICAgICAob3B0ZmxhZ3MgJiBURl9TRUdfREFUQV9DSEVDS1NVTU1FRCkgPT0gMCk7CisjZW5kaWYgLyogVENQX0NIRUNLU1VNX09OX0NPUFkgKi8KKworICAvKiBidWlsZCBUQ1AgaGVhZGVyICovCisgIGlmIChwYnVmX2hlYWRlcihwLCBUQ1BfSExFTikpIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfT1VUUFVUX0RFQlVHIHwgMiwgKCJ0Y3BfY3JlYXRlX3NlZ21lbnQ6IG5vIHJvb20gZm9yIFRDUCBoZWFkZXIgaW4gcGJ1Zi5cbiIpKTsKKyAgICBUQ1BfU1RBVFNfSU5DKHRjcC5lcnIpOworICAgIHRjcF9zZWdfZnJlZShzZWcpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHNlZy0+dGNwaGRyID0gKHN0cnVjdCB0Y3BfaGRyICopc2VnLT5wLT5wYXlsb2FkOworICBzZWctPnRjcGhkci0+c3JjID0gaHRvbnMocGNiLT5sb2NhbF9wb3J0KTsKKyAgc2VnLT50Y3BoZHItPmRlc3QgPSBodG9ucyhwY2ItPnJlbW90ZV9wb3J0KTsKKyAgc2VnLT50Y3BoZHItPnNlcW5vID0gaHRvbmwoc2Vxbm8pOworICAvKiBhY2tubyBpcyBzZXQgaW4gdGNwX291dHB1dCAqLworICBUQ1BIX0hEUkxFTl9GTEFHU19TRVQoc2VnLT50Y3BoZHIsICg1ICsgb3B0bGVuIC8gNCksIGZsYWdzKTsKKyAgLyogd25kIGFuZCBjaGtzdW0gYXJlIHNldCBpbiB0Y3Bfb3V0cHV0ICovCisgIHNlZy0+dGNwaGRyLT51cmdwID0gMDsKKyAgcmV0dXJuIHNlZzsKK30gCisKKy8qKgorICogQWxsb2NhdGUgYSBQQlVGX1JBTSBwYnVmLCBwZXJoYXBzIHdpdGggZXh0cmEgc3BhY2UgYXQgdGhlIGVuZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgcGJ1Zl9hbGxvYyhsYXllciwgbGVuZ3RoLCBQQlVGX1JBTSkgZXhjZXB0CisgKiB0aGVyZSBtYXkgYmUgZXh0cmEgYnl0ZXMgYXZhaWxhYmxlIGF0IHRoZSBlbmQuCisgKgorICogQHBhcmFtIGxheWVyIGZsYWcgdG8gZGVmaW5lIGhlYWRlciBzaXplLgorICogQHBhcmFtIGxlbmd0aCBzaXplIG9mIHRoZSBwYnVmJ3MgcGF5bG9hZC4KKyAqIEBwYXJhbSBtYXhfbGVuZ3RoIG1heGltdW0gdXNhYmxlIHNpemUgb2YgcGF5bG9hZCtvdmVyc2l6ZS4KKyAqIEBwYXJhbSBvdmVyc2l6ZSBwb2ludGVyIHRvIGEgdTE2X3QgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIG51bWJlciBvZiB1c2FibGUgdGFpbCBieXRlcy4KKyAqIEBwYXJhbSBwY2IgVGhlIFRDUCBjb25uZWN0aW9uIHRoYXQgd2lsbG8gZW5xdWV1ZSB0aGUgcGJ1Zi4KKyAqIEBwYXJhbSBhcGlmbGFncyBBUEkgZmxhZ3MgZ2l2ZW4gdG8gdGNwX3dyaXRlLgorICogQHBhcmFtIGZpcnN0X3NlZyB0cnVlIHdoZW4gdGhpcyBwYnVmIHdpbGwgYmUgdXNlZCBpbiB0aGUgZmlyc3QgZW5xdWV1ZWQgc2VnbWVudC4KKyAqIEBwYXJhbSAKKyAqLworI2lmIFRDUF9PVkVSU0laRQorc3RhdGljIHN0cnVjdCBwYnVmICoKK3RjcF9wYnVmX3ByZWFsbG9jKHBidWZfbGF5ZXIgbGF5ZXIsIHUxNl90IGxlbmd0aCwgdTE2X3QgbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgIHUxNl90ICpvdmVyc2l6ZSwgc3RydWN0IHRjcF9wY2IgKnBjYiwgdThfdCBhcGlmbGFncywKKyAgICAgICAgICAgICAgICAgIHU4X3QgZmlyc3Rfc2VnKQoreworICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgdTE2X3QgYWxsb2MgPSBsZW5ndGg7CisKKyNpZiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGCisgIExXSVBfVU5VU0VEX0FSRyhtYXhfbGVuZ3RoKTsKKyAgTFdJUF9VTlVTRURfQVJHKHBjYik7CisgIExXSVBfVU5VU0VEX0FSRyhhcGlmbGFncyk7CisgIExXSVBfVU5VU0VEX0FSRyhmaXJzdF9zZWcpOworICAvKiBhbHdheXMgY3JlYXRlIE1TUy1zaXplZCBwYnVmcyAqLworICBhbGxvYyA9IFRDUF9NU1M7CisjZWxzZSAvKiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGICovCisgIGlmIChsZW5ndGggPCBtYXhfbGVuZ3RoKSB7CisgICAgLyogU2hvdWxkIHdlIGFsbG9jYXRlIGFuIG92ZXJzaXplZCBwYnVmLCBvciBqdXN0IHRoZSBtaW5pbXVtCisgICAgICogbGVuZ3RoIHJlcXVpcmVkPyBJZiB0Y3Bfd3JpdGUgaXMgZ29pbmcgdG8gYmUgY2FsbGVkIGFnYWluCisgICAgICogYmVmb3JlIHRoaXMgc2VnbWVudCBpcyB0cmFuc21pdHRlZCwgd2Ugd2FudCB0aGUgb3ZlcnNpemVkCisgICAgICogYnVmZmVyLiBJZiB0aGUgc2VnbWVudCB3aWxsIGJlIHRyYW5zbWl0dGVkIGltbWVkaWF0ZWx5LCB3ZSBjYW4KKyAgICAgKiBzYXZlIG1lbW9yeSBieSBhbGxvY2F0aW5nIG9ubHkgbGVuZ3RoLiBXZSB1c2UgYSBzaW1wbGUKKyAgICAgKiBoZXVyaXN0aWMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKyAgICAgKgorICAgICAqIERpZCB0aGUgdXNlciBzZXQgVENQX1dSSVRFX0ZMQUdfTU9SRT8KKyAgICAgKgorICAgICAqIFdpbGwgdGhlIE5hZ2xlIGFsZ29yaXRobSBkZWZlciB0cmFuc21pc3Npb24gb2YgdGhpcyBzZWdtZW50PworICAgICAqLworICAgIGlmICgoYXBpZmxhZ3MgJiBUQ1BfV1JJVEVfRkxBR19NT1JFKSB8fAorICAgICAgICAoIShwY2ItPmZsYWdzICYgVEZfTk9ERUxBWSkgJiYKKyAgICAgICAgICghZmlyc3Rfc2VnIHx8CisgICAgICAgICAgcGNiLT51bnNlbnQgIT0gTlVMTCB8fAorICAgICAgICAgIHBjYi0+dW5hY2tlZCAhPSBOVUxMKSkpIHsKKyAgICAgIGFsbG9jID0gTFdJUF9NSU4obWF4X2xlbmd0aCwgTFdJUF9NRU1fQUxJR05fU0laRShsZW5ndGggKyBUQ1BfT1ZFUlNJWkUpKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGICovCisgIHAgPSBwYnVmX2FsbG9jKGxheWVyLCBhbGxvYywgUEJVRl9SQU0pOworICBpZiAocCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgTFdJUF9BU1NFUlQoIm5lZWQgdW5jaGFpbmVkIHBidWYiLCBwLT5uZXh0ID09IE5VTEwpOworICAqb3ZlcnNpemUgPSBwLT5sZW4gLSBsZW5ndGg7CisgIC8qIHRyaW0gcC0+bGVuIHRvIHRoZSBjdXJyZW50bHkgdXNlZCBzaXplICovCisgIHAtPmxlbiA9IHAtPnRvdF9sZW4gPSBsZW5ndGg7CisgIHJldHVybiBwOworfQorI2Vsc2UgLyogVENQX09WRVJTSVpFICovCisjZGVmaW5lIHRjcF9wYnVmX3ByZWFsbG9jKGxheWVyLCBsZW5ndGgsIG14LCBvcywgcGNiLCBhcGksIGZzdCkgcGJ1Zl9hbGxvYygobGF5ZXIpLCAobGVuZ3RoKSwgUEJVRl9SQU0pCisjZW5kaWYgLyogVENQX09WRVJTSVpFICovCisKKyNpZiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWQorLyoqIEFkZCBhIGNoZWNrc3VtIG9mIG5ld2x5IGFkZGVkIGRhdGEgdG8gdGhlIHNlZ21lbnQgKi8KK3N0YXRpYyB2b2lkCit0Y3Bfc2VnX2FkZF9jaGtzdW0odTE2X3QgY2hrc3VtLCB1MTZfdCBsZW4sIHUxNl90ICpzZWdfY2hrc3VtLAorICAgICAgICAgICAgICAgICAgIHU4X3QgKnNlZ19jaGtzdW1fc3dhcHBlZCkKK3sKKyAgdTMyX3QgaGVscGVyOworICAvKiBhZGQgY2hrc3VtIHRvIG9sZCBjaGtzdW0gYW5kIGZvbGQgdG8gdTE2X3QgKi8KKyAgaGVscGVyID0gY2hrc3VtICsgKnNlZ19jaGtzdW07CisgIGNoa3N1bSA9IEZPTERfVTMyVChoZWxwZXIpOworICBpZiAoKGxlbiAmIDEpICE9IDApIHsKKyAgICAqc2VnX2Noa3N1bV9zd2FwcGVkID0gMSAtICpzZWdfY2hrc3VtX3N3YXBwZWQ7CisgICAgY2hrc3VtID0gU1dBUF9CWVRFU19JTl9XT1JEKGNoa3N1bSk7CisgIH0KKyAgKnNlZ19jaGtzdW0gPSBjaGtzdW07Cit9CisjZW5kaWYgLyogVENQX0NIRUNLU1VNX09OX0NPUFkgKi8KKworLyoqIENoZWNrcyBpZiB0Y3Bfd3JpdGUgaXMgYWxsb3dlZCBvciBub3QgKGNoZWNrcyBzdGF0ZSwgc25kX2J1ZiBhbmQgc25kX3F1ZXVlbGVuKS4KKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB0Y3AgcGNiIHRvIGNoZWNrIGZvcgorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgZGF0YSB0byBzZW5kIChjaGVja2VkIGFnYWlucyBzbmRfYnVmKQorICogQHJldHVybiBFUlJfT0sgaWYgdGNwX3dyaXRlIGlzIGFsbG93ZWQgdG8gcHJvY2VlZCwgYW5vdGhlciBlcnJfdCBvdGhlcndpc2UKKyAqLworc3RhdGljIGVycl90Cit0Y3Bfd3JpdGVfY2hlY2tzKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHUxNl90IGxlbikKK3sKKyAgLyogY29ubmVjdGlvbiBpcyBpbiBpbnZhbGlkIHN0YXRlIGZvciBkYXRhIHRyYW5zbWlzc2lvbj8gKi8KKyAgaWYgKChwY2ItPnN0YXRlICE9IEVTVEFCTElTSEVEKSAmJgorICAgICAgKHBjYi0+c3RhdGUgIT0gQ0xPU0VfV0FJVCkgJiYKKyAgICAgIChwY2ItPnN0YXRlICE9IFNZTl9TRU5UKSAmJgorICAgICAgKHBjYi0+c3RhdGUgIT0gU1lOX1JDVkQpKSB7CisgICAgTFdJUF9ERUJVR0YoVENQX09VVFBVVF9ERUJVRyB8IExXSVBfREJHX1NUQVRFIHwgTFdJUF9EQkdfTEVWRUxfU0VWRVJFLCAoInRjcF93cml0ZSgpIGNhbGxlZCBpbiBpbnZhbGlkIHN0YXRlXG4iKSk7CisgICAgcmV0dXJuIEVSUl9DT05OOworICB9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisgICAgcmV0dXJuIEVSUl9PSzsKKyAgfQorCisgIC8qIGZhaWwgb24gdG9vIG11Y2ggZGF0YSAqLworICBpZiAobGVuID4gcGNiLT5zbmRfYnVmKSB7CisgICAgTFdJUF9ERUJVR0YoVENQX09VVFBVVF9ERUJVRyB8IDMsICgidGNwX3dyaXRlOiB0b28gbXVjaCBkYXRhIChsZW49JSJVMTZfRiIgPiBzbmRfYnVmPSUiVTE2X0YiKVxuIiwKKyAgICAgIGxlbiwgcGNiLT5zbmRfYnVmKSk7CisgICAgcGNiLT5mbGFncyB8PSBURl9OQUdMRU1FTUVSUjsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorCisgIExXSVBfREVCVUdGKFRDUF9RTEVOX0RFQlVHLCAoInRjcF93cml0ZTogcXVldWVsZW46ICUiVTE2X0YiXG4iLCAodTE2X3QpcGNiLT5zbmRfcXVldWVsZW4pKTsKKworICAvKiBJZiB0b3RhbCBudW1iZXIgb2YgcGJ1ZnMgb24gdGhlIHVuc2VudC91bmFja2VkIHF1ZXVlcyBleGNlZWRzIHRoZQorICAgKiBjb25maWd1cmVkIG1heGltdW0sIHJldHVybiBhbiBlcnJvciAqLworICAvKiBjaGVjayBmb3IgY29uZmlndXJlZCBtYXggcXVldWVsZW4gYW5kIHBvc3NpYmxlIG92ZXJmbG93ICovCisgIGlmICgocGNiLT5zbmRfcXVldWVsZW4gPj0gVENQX1NORF9RVUVVRUxFTikgfHwgKHBjYi0+c25kX3F1ZXVlbGVuID4gVENQX1NORFFVRVVFTEVOX09WRVJGTE9XKSkgeworICAgIExXSVBfREVCVUdGKFRDUF9PVVRQVVRfREVCVUcgfCAzLCAoInRjcF93cml0ZTogdG9vIGxvbmcgcXVldWUgJSJVMTZfRiIgKG1heCAlIlUxNl9GIilcbiIsCisgICAgICBwY2ItPnNuZF9xdWV1ZWxlbiwgVENQX1NORF9RVUVVRUxFTikpOworICAgIFRDUF9TVEFUU19JTkModGNwLm1lbWVycik7CisgICAgcGNiLT5mbGFncyB8PSBURl9OQUdMRU1FTUVSUjsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorICBpZiAocGNiLT5zbmRfcXVldWVsZW4gIT0gMCkgeworICAgIExXSVBfQVNTRVJUKCJ0Y3Bfd3JpdGU6IHBidWZzIG9uIHF1ZXVlID0+IGF0IGxlYXN0IG9uZSBxdWV1ZSBub24tZW1wdHkiLAorICAgICAgcGNiLT51bmFja2VkICE9IE5VTEwgfHwgcGNiLT51bnNlbnQgIT0gTlVMTCk7CisgIH0gZWxzZSB7CisgICAgTFdJUF9BU1NFUlQoInRjcF93cml0ZTogbm8gcGJ1ZnMgb24gcXVldWUgPT4gYm90aCBxdWV1ZXMgZW1wdHkiLAorICAgICAgcGNiLT51bmFja2VkID09IE5VTEwgJiYgcGNiLT51bnNlbnQgPT0gTlVMTCk7CisgIH0KKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBXcml0ZSBkYXRhIGZvciBzZW5kaW5nIChidXQgZG9lcyBub3Qgc2VuZCBpdCBpbW1lZGlhdGVseSkuCisgKgorICogSXQgd2FpdHMgaW4gdGhlIGV4cGVjdGF0aW9uIG9mIG1vcmUgZGF0YSBiZWluZyBzZW50IHNvb24gKGFzCisgKiBpdCBjYW4gc2VuZCB0aGVtIG1vcmUgZWZmaWNpZW50bHkgYnkgY29tYmluaW5nIHRoZW0gdG9nZXRoZXIpLgorICogVG8gcHJvbXB0IHRoZSBzeXN0ZW0gdG8gc2VuZCBkYXRhIG5vdywgY2FsbCB0Y3Bfb3V0cHV0KCkgYWZ0ZXIKKyAqIGNhbGxpbmcgdGNwX3dyaXRlKCkuCisgKgorICogQHBhcmFtIHBjYiBQcm90b2NvbCBjb250cm9sIGJsb2NrIGZvciB0aGUgVENQIGNvbm5lY3Rpb24gdG8gZW5xdWV1ZSBkYXRhIGZvci4KKyAqIEBwYXJhbSBhcmcgUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBlbnF1ZXVlZCBmb3Igc2VuZGluZy4KKyAqIEBwYXJhbSBsZW4gRGF0YSBsZW5ndGggaW4gYnl0ZXMKKyAqIEBwYXJhbSBhcGlmbGFncyBjb21iaW5hdGlvbiBvZiBmb2xsb3dpbmcgZmxhZ3MgOgorICogLSBUQ1BfV1JJVEVfRkxBR19DT1BZICgweDAxKSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gbWVtb3J5IGJlbG9uZ2luZyB0byB0aGUgc3RhY2sKKyAqIC0gVENQX1dSSVRFX0ZMQUdfTU9SRSAoMHgwMikgZm9yIFRDUCBjb25uZWN0aW9uLCBQU0ggZmxhZyB3aWxsIGJlIHNldCBvbiBsYXN0IHNlZ21lbnQgc2VudCwKKyAqIEByZXR1cm4gRVJSX09LIGlmIGVucXVldWVkLCBhbm90aGVyIGVycl90IG9uIGVycm9yCisgKi8KK2Vycl90Cit0Y3Bfd3JpdGUoc3RydWN0IHRjcF9wY2IgKnBjYiwgY29uc3Qgdm9pZCAqYXJnLCB1MTZfdCBsZW4sIHU4X3QgYXBpZmxhZ3MpCit7CisgIHN0cnVjdCBwYnVmICpjb25jYXRfcCA9IE5VTEw7CisgIHN0cnVjdCB0Y3Bfc2VnICpsYXN0X3Vuc2VudCA9IE5VTEwsICpzZWcgPSBOVUxMLCAqcHJldl9zZWcgPSBOVUxMLCAqcXVldWUgPSBOVUxMOworICB1MTZfdCBwb3MgPSAwOyAvKiBwb3NpdGlvbiBpbiAnYXJnJyBkYXRhICovCisgIHUxNl90IHF1ZXVlbGVuOworICB1OF90IG9wdGxlbiA9IDA7CisgIHU4X3Qgb3B0ZmxhZ3MgPSAwOworI2lmIFRDUF9PVkVSU0laRQorICB1MTZfdCBvdmVyc2l6ZSA9IDA7CisgIHUxNl90IG92ZXJzaXplX3VzZWQgPSAwOworI2VuZGlmIC8qIFRDUF9PVkVSU0laRSAqLworI2lmIFRDUF9DSEVDS1NVTV9PTl9DT1BZCisgIHUxNl90IGNvbmNhdF9jaGtzdW0gPSAwOworICB1OF90IGNvbmNhdF9jaGtzdW1fc3dhcHBlZCA9IDA7CisgIHUxNl90IGNvbmNhdF9jaGtzdW1tZWQgPSAwOworI2VuZGlmIC8qIFRDUF9DSEVDS1NVTV9PTl9DT1BZICovCisgIGVycl90IGVycjsKKworI2lmIExXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYKKyAgLyogQWx3YXlzIGNvcHkgdG8gdHJ5IHRvIGNyZWF0ZSBzaW5nbGUgcGJ1ZnMgZm9yIFRYICovCisgIGFwaWZsYWdzIHw9IFRDUF9XUklURV9GTEFHX0NPUFk7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRiAqLworCisgIExXSVBfREVCVUdGKFRDUF9PVVRQVVRfREVCVUcsICgidGNwX3dyaXRlKHBjYj0lcCwgZGF0YT0lcCwgbGVuPSUiVTE2X0YiLCBhcGlmbGFncz0lIlUxNl9GIilcbiIsCisgICAgKHZvaWQgKilwY2IsIGFyZywgbGVuLCAodTE2X3QpYXBpZmxhZ3MpKTsKKyAgTFdJUF9FUlJPUigidGNwX3dyaXRlOiBhcmcgPT0gTlVMTCAocHJvZ3JhbW1lciB2aW9sYXRlcyBBUEkpIiwgCisgICAgICAgICAgICAgYXJnICE9IE5VTEwsIHJldHVybiBFUlJfQVJHOyk7CisKKyAgZXJyID0gdGNwX3dyaXRlX2NoZWNrcyhwY2IsIGxlbik7CisgIGlmIChlcnIgIT0gRVJSX09LKSB7CisgICAgcmV0dXJuIGVycjsKKyAgfQorICBxdWV1ZWxlbiA9IHBjYi0+c25kX3F1ZXVlbGVuOworCisjaWYgTFdJUF9UQ1BfVElNRVNUQU1QUworICBpZiAoKHBjYi0+ZmxhZ3MgJiBURl9USU1FU1RBTVApKSB7CisgICAgb3B0ZmxhZ3MgPSBURl9TRUdfT1BUU19UUzsKKyAgICBvcHRsZW4gPSBMV0lQX1RDUF9PUFRfTEVOR1RIKFRGX1NFR19PUFRTX1RTKTsKKyAgfQorI2VuZGlmIC8qIExXSVBfVENQX1RJTUVTVEFNUFMgKi8KKworCisgIC8qCisgICAqIFRDUCBzZWdtZW50YXRpb24gaXMgZG9uZSBpbiB0aHJlZSBwaGFzZXMgd2l0aCBpbmNyZWFzaW5nIGNvbXBsZXhpdHk6CisgICAqCisgICAqIDEuIENvcHkgZGF0YSBkaXJlY3RseSBpbnRvIGFuIG92ZXJzaXplZCBwYnVmLgorICAgKiAyLiBDaGFpbiBhIG5ldyBwYnVmIHRvIHRoZSBlbmQgb2YgcGNiLT51bnNlbnQuCisgICAqIDMuIENyZWF0ZSBuZXcgc2VnbWVudHMuCisgICAqCisgICAqIFdlIG1heSBydW4gb3V0IG9mIG1lbW9yeSBhdCBhbnkgcG9pbnQuIEluIHRoYXQgY2FzZSB3ZSBtdXN0CisgICAqIHJldHVybiBFUlJfTUVNIGFuZCBub3QgY2hhbmdlIGFueXRoaW5nIGluIHBjYi4gVGhlcmVmb3JlLCBhbGwKKyAgICogY2hhbmdlcyBhcmUgcmVjb3JkZWQgaW4gbG9jYWwgdmFyaWFibGVzIGFuZCBjb21taXR0ZWQgYXQgdGhlIGVuZAorICAgKiBvZiB0aGUgZnVuY3Rpb24uIFNvbWUgcGNiIGZpZWxkcyBhcmUgbWFpbnRhaW5lZCBpbiBsb2NhbCBjb3BpZXM6CisgICAqCisgICAqIHF1ZXVlbGVuID0gcGNiLT5zbmRfcXVldWVsZW4KKyAgICogb3ZlcnNpemUgPSBwY2ItPnVuc2VudF9vdmVyc2l6ZQorICAgKgorICAgKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHNldCBjb25zaXN0ZW50bHkgYnkgdGhlIHBoYXNlczoKKyAgICoKKyAgICogc2VnIHBvaW50cyB0byB0aGUgbGFzdCBzZWdtZW50IHRhbXBlcmVkIHdpdGguCisgICAqCisgICAqIHBvcyByZWNvcmRzIHByb2dyZXNzIGFzIGRhdGEgaXMgc2VnbWVudGVkLgorICAgKi8KKworICAvKiBGaW5kIHRoZSB0YWlsIG9mIHRoZSB1bnNlbnQgcXVldWUuICovCisgIGlmIChwY2ItPnVuc2VudCAhPSBOVUxMKSB7CisgICAgdTE2X3Qgc3BhY2U7CisgICAgdTE2X3QgdW5zZW50X29wdGxlbjsKKworICAgIC8qIEB0b2RvOiB0aGlzIGNvdWxkIGJlIHNwZWQgdXAgYnkga2VlcGluZyBsYXN0X3Vuc2VudCBpbiB0aGUgcGNiICovCisgICAgZm9yIChsYXN0X3Vuc2VudCA9IHBjYi0+dW5zZW50OyBsYXN0X3Vuc2VudC0+bmV4dCAhPSBOVUxMOworICAgICAgICAgbGFzdF91bnNlbnQgPSBsYXN0X3Vuc2VudC0+bmV4dCk7CisKKyAgICAvKiBVc2FibGUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCB1bnNlbnQgc2VnbWVudCAqLworICAgIHVuc2VudF9vcHRsZW4gPSBMV0lQX1RDUF9PUFRfTEVOR1RIKGxhc3RfdW5zZW50LT5mbGFncyk7CisgICAgc3BhY2UgPSBwY2ItPm1zcyAtIChsYXN0X3Vuc2VudC0+bGVuICsgdW5zZW50X29wdGxlbik7CisKKyAgICAvKgorICAgICAqIFBoYXNlIDE6IENvcHkgZGF0YSBkaXJlY3RseSBpbnRvIGFuIG92ZXJzaXplZCBwYnVmLgorICAgICAqCisgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgcmVjb3JkZWQgaW4gdGhlIG92ZXJzaXplX3VzZWQKKyAgICAgKiB2YXJpYWJsZS4gVGhlIGFjdHVhbCBjb3B5aW5nIGlzIGRvbmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUKKyAgICAgKiBmdW5jdGlvbi4KKyAgICAgKi8KKyNpZiBUQ1BfT1ZFUlNJWkUKKyNpZiBUQ1BfT1ZFUlNJWkVfREJHQ0hFQ0sKKyAgICAvKiBjaGVjayB0aGF0IHBjYi0+dW5zZW50X292ZXJzaXplIG1hdGNoZXMgbGFzdF91bnNlbnQtPnVuc2VudF9vdmVyc2l6ZSAqLworICAgIExXSVBfQVNTRVJUKCJ1bnNlbnRfb3ZlcnNpemUgbWlzbWF0Y2ggKHBjYiB2cy4gbGFzdF91bnNlbnQpIiwKKyAgICAgICAgICAgICAgICBwY2ItPnVuc2VudF9vdmVyc2l6ZSA9PSBsYXN0X3Vuc2VudC0+b3ZlcnNpemVfbGVmdCk7CisjZW5kaWYgLyogVENQX09WRVJTSVpFX0RCR0NIRUNLICovCisgICAgb3ZlcnNpemUgPSBwY2ItPnVuc2VudF9vdmVyc2l6ZTsKKyAgICBpZiAob3ZlcnNpemUgPiAwKSB7CisgICAgICBMV0lQX0FTU0VSVCgiaW5jb25zaXN0ZW50IG92ZXJzaXplIHZzLiBzcGFjZSIsIG92ZXJzaXplX3VzZWQgPD0gc3BhY2UpOworICAgICAgc2VnID0gbGFzdF91bnNlbnQ7CisgICAgICBvdmVyc2l6ZV91c2VkID0gb3ZlcnNpemUgPCBsZW4gPyBvdmVyc2l6ZSA6IGxlbjsKKyAgICAgIHBvcyArPSBvdmVyc2l6ZV91c2VkOworICAgICAgb3ZlcnNpemUgLT0gb3ZlcnNpemVfdXNlZDsKKyAgICAgIHNwYWNlIC09IG92ZXJzaXplX3VzZWQ7CisgICAgfQorICAgIC8qIG5vdyB3ZSBhcmUgZWl0aGVyIGZpbmlzaGVkIG9yIG92ZXJzaXplIGlzIHplcm8gKi8KKyAgICBMV0lQX0FTU0VSVCgiaW5jb25zaXN0ZW5kIG92ZXJzaXplIHZzLiBsZW4iLCAob3ZlcnNpemUgPT0gMCkgfHwgKHBvcyA9PSBsZW4pKTsKKyNlbmRpZiAvKiBUQ1BfT1ZFUlNJWkUgKi8KKworICAgIC8qCisgICAgICogUGhhc2UgMjogQ2hhaW4gYSBuZXcgcGJ1ZiB0byB0aGUgZW5kIG9mIHBjYi0+dW5zZW50LgorICAgICAqCisgICAgICogV2UgZG9uJ3QgZXh0ZW5kIHNlZ21lbnRzIGNvbnRhaW5pbmcgU1lOL0ZJTiBmbGFncyBvciBvcHRpb25zCisgICAgICogKGxlbj09MCkuIFRoZSBuZXcgcGJ1ZiBpcyBrZXB0IGluIGNvbmNhdF9wIGFuZCBwYnVmX2NhdCdlZCBhdAorICAgICAqIHRoZSBlbmQuCisgICAgICovCisgICAgaWYgKChwb3MgPCBsZW4pICYmIChzcGFjZSA+IDApICYmIChsYXN0X3Vuc2VudC0+bGVuID4gMCkpIHsKKyAgICAgIHUxNl90IHNlZ2xlbiA9IHNwYWNlIDwgbGVuIC0gcG9zID8gc3BhY2UgOiBsZW4gLSBwb3M7CisgICAgICBzZWcgPSBsYXN0X3Vuc2VudDsKKworICAgICAgLyogQ3JlYXRlIGEgcGJ1ZiB3aXRoIGEgY29weSBvciByZWZlcmVuY2UgdG8gc2VnbGVuIGJ5dGVzLiBXZQorICAgICAgICogY2FuIHVzZSBQQlVGX1JBVyBoZXJlIHNpbmNlIHRoZSBkYXRhIGFwcGVhcnMgaW4gdGhlIG1pZGRsZSBvZgorICAgICAgICogYSBzZWdtZW50LiBBIGhlYWRlciB3aWxsIG5ldmVyIGJlIHByZXBlbmRlZC4gKi8KKyAgICAgIGlmIChhcGlmbGFncyAmIFRDUF9XUklURV9GTEFHX0NPUFkpIHsKKyAgICAgICAgLyogRGF0YSBpcyBjb3BpZWQgKi8KKyAgICAgICAgaWYgKChjb25jYXRfcCA9IHRjcF9wYnVmX3ByZWFsbG9jKFBCVUZfUkFXLCBzZWdsZW4sIHNwYWNlLCAmb3ZlcnNpemUsIHBjYiwgYXBpZmxhZ3MsIDEpKSA9PSBOVUxMKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoVENQX09VVFBVVF9ERUJVRyB8IDIsCisgICAgICAgICAgICAgICAgICAgICAgKCJ0Y3Bfd3JpdGUgOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwYnVmIGNvcHkgc2l6ZSAlIlUxNl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VnbGVuKSk7CisgICAgICAgICAgZ290byBtZW1lcnI7CisgICAgICAgIH0KKyNpZiBUQ1BfT1ZFUlNJWkVfREJHQ0hFQ0sKKyAgICAgICAgbGFzdF91bnNlbnQtPm92ZXJzaXplX2xlZnQgPSBvdmVyc2l6ZTsKKyNlbmRpZiAvKiBUQ1BfT1ZFUlNJWkVfREJHQ0hFQ0sgKi8KKyAgICAgICAgVENQX0RBVEFfQ09QWTIoY29uY2F0X3AtPnBheWxvYWQsICh1OF90KilhcmcgKyBwb3MsIHNlZ2xlbiwgJmNvbmNhdF9jaGtzdW0sICZjb25jYXRfY2hrc3VtX3N3YXBwZWQpOworI2lmIFRDUF9DSEVDS1NVTV9PTl9DT1BZCisgICAgICAgIGNvbmNhdF9jaGtzdW1tZWQgKz0gc2VnbGVuOworI2VuZGlmIC8qIFRDUF9DSEVDS1NVTV9PTl9DT1BZICovCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBEYXRhIGlzIG5vdCBjb3BpZWQgKi8KKyAgICAgICAgaWYgKChjb25jYXRfcCA9IHBidWZfYWxsb2MoUEJVRl9SQVcsIHNlZ2xlbiwgUEJVRl9ST00pKSA9PSBOVUxMKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoVENQX09VVFBVVF9ERUJVRyB8IDIsCisgICAgICAgICAgICAgICAgICAgICAgKCJ0Y3Bfd3JpdGU6IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHplcm8tY29weSBwYnVmXG4iKSk7CisgICAgICAgICAgZ290byBtZW1lcnI7CisgICAgICAgIH0KKyNpZiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWQorICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtIG9mIG5vY29weS1kYXRhICovCisgICAgICAgIHRjcF9zZWdfYWRkX2Noa3N1bSh+aW5ldF9jaGtzdW0oKHU4X3QqKWFyZyArIHBvcywgc2VnbGVuKSwgc2VnbGVuLAorICAgICAgICAgICZjb25jYXRfY2hrc3VtLCAmY29uY2F0X2Noa3N1bV9zd2FwcGVkKTsKKyAgICAgICAgY29uY2F0X2Noa3N1bW1lZCArPSBzZWdsZW47CisjZW5kaWYgLyogVENQX0NIRUNLU1VNX09OX0NPUFkgKi8KKyAgICAgICAgLyogcmVmZXJlbmNlIHRoZSBub24tdm9sYXRpbGUgcGF5bG9hZCBkYXRhICovCisgICAgICAgIGNvbmNhdF9wLT5wYXlsb2FkID0gKHU4X3QqKWFyZyArIHBvczsKKyAgICAgIH0KKworICAgICAgcG9zICs9IHNlZ2xlbjsKKyAgICAgIHF1ZXVlbGVuICs9IHBidWZfY2xlbihjb25jYXRfcCk7CisgICAgfQorICB9IGVsc2UgeworI2lmIFRDUF9PVkVSU0laRQorICAgIExXSVBfQVNTRVJUKCJ1bnNlbnRfb3ZlcnNpemUgbWlzbWF0Y2ggKHBjYi0+dW5zZW50IGlzIE5VTEwpIiwKKyAgICAgICAgICAgICAgICBwY2ItPnVuc2VudF9vdmVyc2l6ZSA9PSAwKTsKKyNlbmRpZiAvKiBUQ1BfT1ZFUlNJWkUgKi8KKyAgfQorCisgIC8qCisgICAqIFBoYXNlIDM6IENyZWF0ZSBuZXcgc2VnbWVudHMuCisgICAqCisgICAqIFRoZSBuZXcgc2VnbWVudHMgYXJlIGNoYWluZWQgdG9nZXRoZXIgaW4gdGhlIGxvY2FsICdxdWV1ZScKKyAgICogdmFyaWFibGUsIHJlYWR5IHRvIGJlIGFwcGVuZGVkIHRvIHBjYi0+dW5zZW50LgorICAgKi8KKyAgd2hpbGUgKHBvcyA8IGxlbikgeworICAgIHN0cnVjdCBwYnVmICpwOworICAgIHUxNl90IGxlZnQgPSBsZW4gLSBwb3M7CisgICAgdTE2X3QgbWF4X2xlbiA9IHBjYi0+bXNzIC0gb3B0bGVuOworICAgIHUxNl90IHNlZ2xlbiA9IGxlZnQgPiBtYXhfbGVuID8gbWF4X2xlbiA6IGxlZnQ7CisjaWYgVENQX0NIRUNLU1VNX09OX0NPUFkKKyAgICB1MTZfdCBjaGtzdW0gPSAwOworICAgIHU4X3QgY2hrc3VtX3N3YXBwZWQgPSAwOworI2VuZGlmIC8qIFRDUF9DSEVDS1NVTV9PTl9DT1BZICovCisKKyAgICBpZiAoYXBpZmxhZ3MgJiBUQ1BfV1JJVEVfRkxBR19DT1BZKSB7CisgICAgICAvKiBJZiBjb3B5IGlzIHNldCwgbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQgYW5kIGRhdGEgY29waWVkCisgICAgICAgKiBpbnRvIHBidWYgKi8KKyAgICAgIGlmICgocCA9IHRjcF9wYnVmX3ByZWFsbG9jKFBCVUZfVFJBTlNQT1JULCBzZWdsZW4gKyBvcHRsZW4sIHBjYi0+bXNzLCAmb3ZlcnNpemUsIHBjYiwgYXBpZmxhZ3MsIHF1ZXVlID09IE5VTEwpKSA9PSBOVUxMKSB7CisgICAgICAgIExXSVBfREVCVUdGKFRDUF9PVVRQVVRfREVCVUcgfCAyLCAoInRjcF93cml0ZSA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBidWYgY29weSBzaXplICUiVTE2X0YiXG4iLCBzZWdsZW4pKTsKKyAgICAgICAgZ290byBtZW1lcnI7CisgICAgICB9CisgICAgICBMV0lQX0FTU0VSVCgidGNwX3dyaXRlOiBjaGVjayB0aGF0IGZpcnN0IHBidWYgY2FuIGhvbGQgdGhlIGNvbXBsZXRlIHNlZ2xlbiIsCisgICAgICAgICAgICAgICAgICAocC0+bGVuID49IHNlZ2xlbikpOworICAgICAgVENQX0RBVEFfQ09QWTIoKGNoYXIgKilwLT5wYXlsb2FkICsgb3B0bGVuLCAodThfdCopYXJnICsgcG9zLCBzZWdsZW4sICZjaGtzdW0sICZjaGtzdW1fc3dhcHBlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENvcHkgaXMgbm90IHNldDogRmlyc3QgYWxsb2NhdGUgYSBwYnVmIGZvciBob2xkaW5nIHRoZSBkYXRhLgorICAgICAgICogU2luY2UgdGhlIHJlZmVyZW5jZWQgZGF0YSBpcyBhdmFpbGFibGUgYXQgbGVhc3QgdW50aWwgaXQgaXMKKyAgICAgICAqIHNlbnQgb3V0IG9uIHRoZSBsaW5rIChhcyBpdCBoYXMgdG8gYmUgQUNLZWQgYnkgdGhlIHJlbW90ZQorICAgICAgICogcGFydHkpIHdlIGNhbiBzYWZlbHkgdXNlIFBCVUZfUk9NIGluc3RlYWQgb2YgUEJVRl9SRUYgaGVyZS4KKyAgICAgICAqLworICAgICAgc3RydWN0IHBidWYgKnAyOworI2lmIFRDUF9PVkVSU0laRQorICAgICAgTFdJUF9BU1NFUlQoIm92ZXJzaXplID09IDAiLCBvdmVyc2l6ZSA9PSAwKTsKKyNlbmRpZiAvKiBUQ1BfT1ZFUlNJWkUgKi8KKyAgICAgIGlmICgocDIgPSBwYnVmX2FsbG9jKFBCVUZfVFJBTlNQT1JULCBzZWdsZW4sIFBCVUZfUk9NKSkgPT0gTlVMTCkgeworICAgICAgICBMV0lQX0RFQlVHRihUQ1BfT1VUUFVUX0RFQlVHIHwgMiwgKCJ0Y3Bfd3JpdGU6IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHplcm8tY29weSBwYnVmXG4iKSk7CisgICAgICAgIGdvdG8gbWVtZXJyOworICAgICAgfQorI2lmIFRDUF9DSEVDS1NVTV9PTl9DT1BZCisgICAgICAvKiBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtIG9mIG5vY29weS1kYXRhICovCisgICAgICBjaGtzdW0gPSB+aW5ldF9jaGtzdW0oKHU4X3QqKWFyZyArIHBvcywgc2VnbGVuKTsKKyNlbmRpZiAvKiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWSAqLworICAgICAgLyogcmVmZXJlbmNlIHRoZSBub24tdm9sYXRpbGUgcGF5bG9hZCBkYXRhICovCisgICAgICBwMi0+cGF5bG9hZCA9ICh1OF90KilhcmcgKyBwb3M7CisKKyAgICAgIC8qIFNlY29uZCwgYWxsb2NhdGUgYSBwYnVmIGZvciB0aGUgaGVhZGVycy4gKi8KKyAgICAgIGlmICgocCA9IHBidWZfYWxsb2MoUEJVRl9UUkFOU1BPUlQsIG9wdGxlbiwgUEJVRl9SQU0pKSA9PSBOVUxMKSB7CisgICAgICAgIC8qIElmIGFsbG9jYXRpb24gZmFpbHMsIHdlIGhhdmUgdG8gZGVhbGxvY2F0ZSB0aGUgZGF0YSBwYnVmIGFzCisgICAgICAgICAqIHdlbGwuICovCisgICAgICAgIHBidWZfZnJlZShwMik7CisgICAgICAgIExXSVBfREVCVUdGKFRDUF9PVVRQVVRfREVCVUcgfCAyLCAoInRjcF93cml0ZTogY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgaGVhZGVyIHBidWZcbiIpKTsKKyAgICAgICAgZ290byBtZW1lcnI7CisgICAgICB9CisgICAgICAvKiBDb25jYXRlbmF0ZSB0aGUgaGVhZGVycyBhbmQgZGF0YSBwYnVmcyB0b2dldGhlci4gKi8KKyAgICAgIHBidWZfY2F0KHAvKmhlYWRlciovLCBwMi8qZGF0YSovKTsKKyAgICB9CisKKyAgICBxdWV1ZWxlbiArPSBwYnVmX2NsZW4ocCk7CisKKyAgICAvKiBOb3cgdGhhdCB0aGVyZSBhcmUgbW9yZSBzZWdtZW50cyBxdWV1ZWQsIHdlIGNoZWNrIGFnYWluIGlmIHRoZQorICAgICAqIGxlbmd0aCBvZiB0aGUgcXVldWUgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBtYXhpbXVtIG9yCisgICAgICogb3ZlcmZsb3dzLiAqLworICAgIGlmICgocXVldWVsZW4gPiBUQ1BfU05EX1FVRVVFTEVOKSB8fCAocXVldWVsZW4gPiBUQ1BfU05EUVVFVUVMRU5fT1ZFUkZMT1cpKSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfT1VUUFVUX0RFQlVHIHwgMiwgKCJ0Y3Bfd3JpdGU6IHF1ZXVlIHRvbyBsb25nICUiVTE2X0YiICglIlUxNl9GIilcbiIsIHF1ZXVlbGVuLCBUQ1BfU05EX1FVRVVFTEVOKSk7CisgICAgICBwYnVmX2ZyZWUocCk7CisgICAgICBnb3RvIG1lbWVycjsKKyAgICB9CisKKyAgICBpZiAoKHNlZyA9IHRjcF9jcmVhdGVfc2VnbWVudChwY2IsIHAsIDAsIHBjYi0+c25kX2xiYiArIHBvcywgb3B0ZmxhZ3MpKSA9PSBOVUxMKSB7CisgICAgICBnb3RvIG1lbWVycjsKKyAgICB9CisjaWYgVENQX09WRVJTSVpFX0RCR0NIRUNLCisgICAgc2VnLT5vdmVyc2l6ZV9sZWZ0ID0gb3ZlcnNpemU7CisjZW5kaWYgLyogVENQX09WRVJTSVpFX0RCR0NIRUNLICovCisjaWYgVENQX0NIRUNLU1VNX09OX0NPUFkKKyAgICBzZWctPmNoa3N1bSA9IGNoa3N1bTsKKyAgICBzZWctPmNoa3N1bV9zd2FwcGVkID0gY2hrc3VtX3N3YXBwZWQ7CisgICAgc2VnLT5mbGFncyB8PSBURl9TRUdfREFUQV9DSEVDS1NVTU1FRDsKKyNlbmRpZiAvKiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWSAqLworCisgICAgLyogZmlyc3Qgc2VnbWVudCBvZiB0by1iZS1xdWV1ZWQgZGF0YT8gKi8KKyAgICBpZiAocXVldWUgPT0gTlVMTCkgeworICAgICAgcXVldWUgPSBzZWc7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEF0dGFjaCB0aGUgc2VnbWVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZWQgc2VnbWVudHMgKi8KKyAgICAgIExXSVBfQVNTRVJUKCJwcmV2X3NlZyAhPSBOVUxMIiwgcHJldl9zZWcgIT0gTlVMTCk7CisgICAgICBwcmV2X3NlZy0+bmV4dCA9IHNlZzsKKyAgICB9CisgICAgLyogcmVtZW1iZXIgbGFzdCBzZWdtZW50IG9mIHRvLWJlLXF1ZXVlZCBkYXRhIGZvciBuZXh0IGl0ZXJhdGlvbiAqLworICAgIHByZXZfc2VnID0gc2VnOworCisgICAgTFdJUF9ERUJVR0YoVENQX09VVFBVVF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInRjcF93cml0ZTogcXVldWVpbmcgJSJVMzJfRiI6JSJVMzJfRiJcbiIsCisgICAgICBudG9obChzZWctPnRjcGhkci0+c2Vxbm8pLAorICAgICAgbnRvaGwoc2VnLT50Y3BoZHItPnNlcW5vKSArIFRDUF9UQ1BMRU4oc2VnKSkpOworCisgICAgcG9zICs9IHNlZ2xlbjsKKyAgfQorCisgIC8qCisgICAqIEFsbCB0aHJlZSBzZWdtZW50YXRpb24gcGhhc2VzIHdlcmUgc3VjY2Vzc2Z1bC4gV2UgY2FuIGNvbW1pdCB0aGUKKyAgICogdHJhbnNhY3Rpb24uCisgICAqLworCisgIC8qCisgICAqIFBoYXNlIDE6IElmIGRhdGEgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHByZWFsbG9jYXRlZCB0YWlsIG9mCisgICAqIGxhc3RfdW5zZW50LCB3ZSB1cGRhdGUgdGhlIGxlbmd0aCBmaWVsZHMgb2YgdGhlIHBidWYgY2hhaW4uCisgICAqLworI2lmIFRDUF9PVkVSU0laRQorICBpZiAob3ZlcnNpemVfdXNlZCA+IDApIHsKKyAgICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgICAvKiBCdW1wIHRvdF9sZW4gb2Ygd2hvbGUgY2hhaW4sIGxlbiBvZiB0YWlsICovCisgICAgZm9yIChwID0gbGFzdF91bnNlbnQtPnA7IHA7IHAgPSBwLT5uZXh0KSB7CisgICAgICBwLT50b3RfbGVuICs9IG92ZXJzaXplX3VzZWQ7CisgICAgICBpZiAocC0+bmV4dCA9PSBOVUxMKSB7CisgICAgICAgIFRDUF9EQVRBX0NPUFkoKGNoYXIgKilwLT5wYXlsb2FkICsgcC0+bGVuLCBhcmcsIG92ZXJzaXplX3VzZWQsIGxhc3RfdW5zZW50KTsKKyAgICAgICAgcC0+bGVuICs9IG92ZXJzaXplX3VzZWQ7CisgICAgICB9CisgICAgfQorICAgIGxhc3RfdW5zZW50LT5sZW4gKz0gb3ZlcnNpemVfdXNlZDsKKyNpZiBUQ1BfT1ZFUlNJWkVfREJHQ0hFQ0sKKyAgICBsYXN0X3Vuc2VudC0+b3ZlcnNpemVfbGVmdCAtPSBvdmVyc2l6ZV91c2VkOworI2VuZGlmIC8qIFRDUF9PVkVSU0laRV9EQkdDSEVDSyAqLworICB9CisgIHBjYi0+dW5zZW50X292ZXJzaXplID0gb3ZlcnNpemU7CisjZW5kaWYgLyogVENQX09WRVJTSVpFICovCisKKyAgLyoKKyAgICogUGhhc2UgMjogY29uY2F0X3AgY2FuIGJlIGNvbmNhdGVuYXRlZCBvbnRvIGxhc3RfdW5zZW50LT5wCisgICAqLworICBpZiAoY29uY2F0X3AgIT0gTlVMTCkgeworICAgIExXSVBfQVNTRVJUKCJ0Y3Bfd3JpdGU6IGNhbm5vdCBjb25jYXRlbmF0ZSB3aGVuIHBjYi0+dW5zZW50IGlzIGVtcHR5IiwKKyAgICAgIChsYXN0X3Vuc2VudCAhPSBOVUxMKSk7CisgICAgcGJ1Zl9jYXQobGFzdF91bnNlbnQtPnAsIGNvbmNhdF9wKTsKKyAgICBsYXN0X3Vuc2VudC0+bGVuICs9IGNvbmNhdF9wLT50b3RfbGVuOworI2lmIFRDUF9DSEVDS1NVTV9PTl9DT1BZCisgICAgaWYgKGNvbmNhdF9jaGtzdW1tZWQpIHsKKyAgICAgIHRjcF9zZWdfYWRkX2Noa3N1bShjb25jYXRfY2hrc3VtLCBjb25jYXRfY2hrc3VtbWVkLCAmbGFzdF91bnNlbnQtPmNoa3N1bSwKKyAgICAgICAgJmxhc3RfdW5zZW50LT5jaGtzdW1fc3dhcHBlZCk7CisgICAgICBsYXN0X3Vuc2VudC0+ZmxhZ3MgfD0gVEZfU0VHX0RBVEFfQ0hFQ0tTVU1NRUQ7CisgICAgfQorI2VuZGlmIC8qIFRDUF9DSEVDS1NVTV9PTl9DT1BZICovCisgIH0KKworICAvKgorICAgKiBQaGFzZSAzOiBBcHBlbmQgcXVldWUgdG8gcGNiLT51bnNlbnQuIFF1ZXVlIG1heSBiZSBOVUxMLCBidXQgdGhhdAorICAgKiBpcyBoYXJtbGVzcworICAgKi8KKyAgaWYgKGxhc3RfdW5zZW50ID09IE5VTEwpIHsKKyAgICBwY2ItPnVuc2VudCA9IHF1ZXVlOworICB9IGVsc2UgeworICAgIGxhc3RfdW5zZW50LT5uZXh0ID0gcXVldWU7CisgIH0KKworICAvKgorICAgKiBGaW5hbGx5IHVwZGF0ZSB0aGUgcGNiIHN0YXRlLgorICAgKi8KKyAgcGNiLT5zbmRfbGJiICs9IGxlbjsKKyAgcGNiLT5zbmRfYnVmIC09IGxlbjsKKyAgcGNiLT5zbmRfcXVldWVsZW4gPSBxdWV1ZWxlbjsKKworICBMV0lQX0RFQlVHRihUQ1BfUUxFTl9ERUJVRywgKCJ0Y3Bfd3JpdGU6ICUiUzE2X0YiIChhZnRlciBlbnF1ZXVlZClcbiIsCisgICAgcGNiLT5zbmRfcXVldWVsZW4pKTsKKyAgaWYgKHBjYi0+c25kX3F1ZXVlbGVuICE9IDApIHsKKyAgICBMV0lQX0FTU0VSVCgidGNwX3dyaXRlOiB2YWxpZCBxdWV1ZSBsZW5ndGgiLAorICAgICAgICAgICAgICAgIHBjYi0+dW5hY2tlZCAhPSBOVUxMIHx8IHBjYi0+dW5zZW50ICE9IE5VTEwpOworICB9CisKKyAgLyogU2V0IHRoZSBQU0ggZmxhZyBpbiB0aGUgbGFzdCBzZWdtZW50IHRoYXQgd2UgZW5xdWV1ZWQuICovCisgIGlmIChzZWcgIT0gTlVMTCAmJiBzZWctPnRjcGhkciAhPSBOVUxMICYmICgoYXBpZmxhZ3MgJiBUQ1BfV1JJVEVfRkxBR19NT1JFKT09MCkpIHsKKyAgICBUQ1BIX1NFVF9GTEFHKHNlZy0+dGNwaGRyLCBUQ1BfUFNIKTsKKyAgfQorCisgIHJldHVybiBFUlJfT0s7CittZW1lcnI6CisgIHBjYi0+ZmxhZ3MgfD0gVEZfTkFHTEVNRU1FUlI7CisgIFRDUF9TVEFUU19JTkModGNwLm1lbWVycik7CisKKyAgaWYgKGNvbmNhdF9wICE9IE5VTEwpIHsKKyAgICBwYnVmX2ZyZWUoY29uY2F0X3ApOworICB9CisgIGlmIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgdGNwX3NlZ3NfZnJlZShxdWV1ZSk7CisgIH0KKyAgaWYgKHBjYi0+c25kX3F1ZXVlbGVuICE9IDApIHsKKyAgICBMV0lQX0FTU0VSVCgidGNwX3dyaXRlOiB2YWxpZCBxdWV1ZSBsZW5ndGgiLCBwY2ItPnVuYWNrZWQgIT0gTlVMTCB8fAorICAgICAgcGNiLT51bnNlbnQgIT0gTlVMTCk7CisgIH0KKyAgTFdJUF9ERUJVR0YoVENQX1FMRU5fREVCVUcgfCBMV0lQX0RCR19TVEFURSwgKCJ0Y3Bfd3JpdGU6ICUiUzE2X0YiICh3aXRoIG1lbSBlcnIpXG4iLCBwY2ItPnNuZF9xdWV1ZWxlbikpOworICByZXR1cm4gRVJSX01FTTsKK30KKworLyoqCisgKiBFbnF1ZXVlIFRDUCBvcHRpb25zIGZvciB0cmFuc21pc3Npb24uCisgKgorICogQ2FsbGVkIGJ5IHRjcF9jb25uZWN0KCksIHRjcF9saXN0ZW5faW5wdXQoKSwgYW5kIHRjcF9zZW5kX2N0cmwoKS4KKyAqCisgKiBAcGFyYW0gcGNiIFByb3RvY29sIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBUQ1AgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBmbGFncyBUQ1AgaGVhZGVyIGZsYWdzIHRvIHNldCBpbiB0aGUgb3V0Z29pbmcgc2VnbWVudC4KKyAqIEBwYXJhbSBvcHRkYXRhIHBvaW50ZXIgdG8gVENQIG9wdGlvbnMsIG9yIE5VTEwuCisgKiBAcGFyYW0gb3B0bGVuIGxlbmd0aCBvZiBUQ1Agb3B0aW9ucyBpbiBieXRlcy4KKyAqLworZXJyX3QKK3RjcF9lbnF1ZXVlX2ZsYWdzKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHU4X3QgZmxhZ3MpCit7CisgIHN0cnVjdCBwYnVmICpwOworICBzdHJ1Y3QgdGNwX3NlZyAqc2VnOworICB1OF90IG9wdGZsYWdzID0gMDsKKyAgdThfdCBvcHRsZW4gPSAwOworCisgIExXSVBfREVCVUdGKFRDUF9RTEVOX0RFQlVHLCAoInRjcF9lbnF1ZXVlX2ZsYWdzOiBxdWV1ZWxlbjogJSJVMTZfRiJcbiIsICh1MTZfdClwY2ItPnNuZF9xdWV1ZWxlbikpOworCisgIExXSVBfQVNTRVJUKCJ0Y3BfZW5xdWV1ZV9mbGFnczogbmVlZCBlaXRoZXIgVENQX1NZTiBvciBUQ1BfRklOIGluIGZsYWdzIChwcm9ncmFtbWVyIHZpb2xhdGVzIEFQSSkiLAorICAgICAgICAgICAgICAoZmxhZ3MgJiAoVENQX1NZTiB8IFRDUF9GSU4pKSAhPSAwKTsKKworICAvKiBjaGVjayBmb3IgY29uZmlndXJlZCBtYXggcXVldWVsZW4gYW5kIHBvc3NpYmxlIG92ZXJmbG93ICovCisgIGlmICgocGNiLT5zbmRfcXVldWVsZW4gPj0gVENQX1NORF9RVUVVRUxFTikgfHwgKHBjYi0+c25kX3F1ZXVlbGVuID4gVENQX1NORFFVRVVFTEVOX09WRVJGTE9XKSkgeworICAgIExXSVBfREVCVUdGKFRDUF9PVVRQVVRfREVCVUcgfCAzLCAoInRjcF9lbnF1ZXVlX2ZsYWdzOiB0b28gbG9uZyBxdWV1ZSAlIlUxNl9GIiAobWF4ICUiVTE2X0YiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjYi0+c25kX3F1ZXVlbGVuLCBUQ1BfU05EX1FVRVVFTEVOKSk7CisgICAgVENQX1NUQVRTX0lOQyh0Y3AubWVtZXJyKTsKKyAgICBwY2ItPmZsYWdzIHw9IFRGX05BR0xFTUVNRVJSOworICAgIHJldHVybiBFUlJfTUVNOworICB9CisKKyAgaWYgKGZsYWdzICYgVENQX1NZTikgeworICAgIG9wdGZsYWdzID0gVEZfU0VHX09QVFNfTVNTOworICB9CisjaWYgTFdJUF9UQ1BfVElNRVNUQU1QUworICBpZiAoKHBjYi0+ZmxhZ3MgJiBURl9USU1FU1RBTVApKSB7CisgICAgb3B0ZmxhZ3MgfD0gVEZfU0VHX09QVFNfVFM7CisgIH0KKyNlbmRpZiAvKiBMV0lQX1RDUF9USU1FU1RBTVBTICovCisgIG9wdGxlbiA9IExXSVBfVENQX09QVF9MRU5HVEgob3B0ZmxhZ3MpOworCisgIC8qIHRjcF9lbnF1ZXVlX2ZsYWdzIGlzIGFsd2F5cyBjYWxsZWQgd2l0aCBlaXRoZXIgU1lOIG9yIEZJTiBpbiBmbGFncy4KKyAgICogV2UgbmVlZCBvbmUgYXZhaWxhYmxlIHNuZF9idWYgYnl0ZSB0byBkbyB0aGF0LgorICAgKiBUaGlzIG1lYW5zIHdlIGNhbid0IHNlbmQgRklOIHdoaWxlIHNuZF9idWY9PTAuIEEgYmV0dGVyIGZpeCB3b3VsZCBiZSB0bworICAgKiBub3QgaW5jbHVkZSBTWU4gYW5kIEZJTiBzZXF1ZW5jZSBudW1iZXJzIGluIHRoZSBzbmRfYnVmIGNvdW50LiAqLworICBpZiAocGNiLT5zbmRfYnVmID09IDApIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfT1VUUFVUX0RFQlVHIHwgMywgKCJ0Y3BfZW5xdWV1ZV9mbGFnczogbm8gc2VuZCBidWZmZXIgYXZhaWxhYmxlXG4iKSk7CisgICAgVENQX1NUQVRTX0lOQyh0Y3AubWVtZXJyKTsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorCisgIC8qIEFsbG9jYXRlIHBidWYgd2l0aCByb29tIGZvciBUQ1AgaGVhZGVyICsgb3B0aW9ucyAqLworICBpZiAoKHAgPSBwYnVmX2FsbG9jKFBCVUZfVFJBTlNQT1JULCBvcHRsZW4sIFBCVUZfUkFNKSkgPT0gTlVMTCkgeworICAgIHBjYi0+ZmxhZ3MgfD0gVEZfTkFHTEVNRU1FUlI7CisgICAgVENQX1NUQVRTX0lOQyh0Y3AubWVtZXJyKTsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorICBMV0lQX0FTU0VSVCgidGNwX2VucXVldWVfZmxhZ3M6IGNoZWNrIHRoYXQgZmlyc3QgcGJ1ZiBjYW4gaG9sZCBvcHRsZW4iLAorICAgICAgICAgICAgICAocC0+bGVuID49IG9wdGxlbikpOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGNwX3NlZywgYW5kIGZpbGwgaW4gZmllbGRzLiAqLworICBpZiAoKHNlZyA9IHRjcF9jcmVhdGVfc2VnbWVudChwY2IsIHAsIGZsYWdzLCBwY2ItPnNuZF9sYmIsIG9wdGZsYWdzKSkgPT0gTlVMTCkgeworICAgIHBjYi0+ZmxhZ3MgfD0gVEZfTkFHTEVNRU1FUlI7CisgICAgVENQX1NUQVRTX0lOQyh0Y3AubWVtZXJyKTsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorICBMV0lQX0FTU0VSVCgic2VnLT50Y3BoZHIgbm90IGFsaWduZWQiLCAoKG1lbV9wdHJfdClzZWctPnRjcGhkciAlIE1FTV9BTElHTk1FTlQpID09IDApOworICBMV0lQX0FTU0VSVCgidGNwX2VucXVldWVfZmxhZ3M6IGludmFsaWQgc2VnbWVudCBsZW5ndGgiLCBzZWctPmxlbiA9PSAwKTsKKworICBMV0lQX0RFQlVHRihUQ1BfT1VUUFVUX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsCisgICAgICAgICAgICAgICgidGNwX2VucXVldWVfZmxhZ3M6IHF1ZXVlaW5nICUiVTMyX0YiOiUiVTMyX0YiICgweCUiWDE2X0YiKVxuIiwKKyAgICAgICAgICAgICAgIG50b2hsKHNlZy0+dGNwaGRyLT5zZXFubyksCisgICAgICAgICAgICAgICBudG9obChzZWctPnRjcGhkci0+c2Vxbm8pICsgVENQX1RDUExFTihzZWcpLAorICAgICAgICAgICAgICAgKHUxNl90KWZsYWdzKSk7CisKKyAgLyogTm93IGFwcGVuZCBzZWcgdG8gcGNiLT51bnNlbnQgcXVldWUgKi8KKyAgaWYgKHBjYi0+dW5zZW50ID09IE5VTEwpIHsKKyAgICBwY2ItPnVuc2VudCA9IHNlZzsKKyAgfSBlbHNlIHsKKyAgICBzdHJ1Y3QgdGNwX3NlZyAqdXNlZzsKKyAgICBmb3IgKHVzZWcgPSBwY2ItPnVuc2VudDsgdXNlZy0+bmV4dCAhPSBOVUxMOyB1c2VnID0gdXNlZy0+bmV4dCk7CisgICAgdXNlZy0+bmV4dCA9IHNlZzsKKyAgfQorI2lmIFRDUF9PVkVSU0laRQorICAvKiBUaGUgbmV3IHVuc2VudCB0YWlsIGhhcyBubyBzcGFjZSAqLworICBwY2ItPnVuc2VudF9vdmVyc2l6ZSA9IDA7CisjZW5kaWYgLyogVENQX09WRVJTSVpFICovCisKKyAgLyogU1lOIGFuZCBGSU4gYnVtcCB0aGUgc2VxdWVuY2UgbnVtYmVyICovCisgIGlmICgoZmxhZ3MgJiBUQ1BfU1lOKSB8fCAoZmxhZ3MgJiBUQ1BfRklOKSkgeworICAgIHBjYi0+c25kX2xiYisrOworICAgIC8qIG9wdGxlbiBkb2VzIG5vdCBpbmZsdWVuY2Ugc25kX2J1ZiAqLworICAgIHBjYi0+c25kX2J1Zi0tOworICB9CisgIGlmIChmbGFncyAmIFRDUF9GSU4pIHsKKyAgICBwY2ItPmZsYWdzIHw9IFRGX0ZJTjsKKyAgfQorCisgIC8qIHVwZGF0ZSBudW1iZXIgb2Ygc2VnbWVudHMgb24gdGhlIHF1ZXVlcyAqLworICBwY2ItPnNuZF9xdWV1ZWxlbiArPSBwYnVmX2NsZW4oc2VnLT5wKTsKKyAgTFdJUF9ERUJVR0YoVENQX1FMRU5fREVCVUcsICgidGNwX2VucXVldWVfZmxhZ3M6ICUiUzE2X0YiIChhZnRlciBlbnF1ZXVlZClcbiIsIHBjYi0+c25kX3F1ZXVlbGVuKSk7CisgIGlmIChwY2ItPnNuZF9xdWV1ZWxlbiAhPSAwKSB7CisgICAgTFdJUF9BU1NFUlQoInRjcF9lbnF1ZXVlX2ZsYWdzOiBpbnZhbGlkIHF1ZXVlIGxlbmd0aCIsCisgICAgICBwY2ItPnVuYWNrZWQgIT0gTlVMTCB8fCBwY2ItPnVuc2VudCAhPSBOVUxMKTsKKyAgfQorCisgIHJldHVybiBFUlJfT0s7Cit9CisgCisKKyNpZiBMV0lQX1RDUF9USU1FU1RBTVBTCisvKiBCdWlsZCBhIHRpbWVzdGFtcCBvcHRpb24gKDEyIGJ5dGVzIGxvbmcpIGF0IHRoZSBzcGVjaWZpZWQgb3B0aW9ucyBwb2ludGVyKQorICoKKyAqIEBwYXJhbSBwY2IgdGNwX3BjYgorICogQHBhcmFtIG9wdHMgb3B0aW9uIHBvaW50ZXIgd2hlcmUgdG8gc3RvcmUgdGhlIHRpbWVzdGFtcCBvcHRpb24KKyAqLworc3RhdGljIHZvaWQKK3RjcF9idWlsZF90aW1lc3RhbXBfb3B0aW9uKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHUzMl90ICpvcHRzKQoreworICAvKiBQYWQgd2l0aCB0d28gTk9QIG9wdGlvbnMgdG8gbWFrZSBldmVyeXRoaW5nIG5pY2VseSBhbGlnbmVkICovCisgIG9wdHNbMF0gPSBQUF9IVE9OTCgweDAxMDEwODBBKTsKKyAgb3B0c1sxXSA9IGh0b25sKHN5c19ub3coKSk7CisgIG9wdHNbMl0gPSBodG9ubChwY2ItPnRzX3JlY2VudCk7Cit9CisjZW5kaWYKKworLyoqIFNlbmQgYW4gQUNLIHdpdGhvdXQgZGF0YS4KKyAqCisgKiBAcGFyYW0gcGNiIFByb3RvY29sIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBUQ1AgY29ubmVjdGlvbiB0byBzZW5kIHRoZSBBQ0sKKyAqLworZXJyX3QKK3RjcF9zZW5kX2VtcHR5X2FjayhzdHJ1Y3QgdGNwX3BjYiAqcGNiKQoreworICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgc3RydWN0IHRjcF9oZHIgKnRjcGhkcjsKKyAgdThfdCBvcHRsZW4gPSAwOworCisjaWYgTFdJUF9UQ1BfVElNRVNUQU1QUworICBpZiAocGNiLT5mbGFncyAmIFRGX1RJTUVTVEFNUCkgeworICAgIG9wdGxlbiA9IExXSVBfVENQX09QVF9MRU5HVEgoVEZfU0VHX09QVFNfVFMpOworICB9CisjZW5kaWYKKworICBwID0gdGNwX291dHB1dF9hbGxvY19oZWFkZXIocGNiLCBvcHRsZW4sIDAsIGh0b25sKHBjYi0+c25kX254dCkpOworICBpZiAocCA9PSBOVUxMKSB7CisgICAgTFdJUF9ERUJVR0YoVENQX09VVFBVVF9ERUJVRywgKCJ0Y3Bfb3V0cHV0OiAoQUNLKSBjb3VsZCBub3QgYWxsb2NhdGUgcGJ1ZlxuIikpOworICAgIHJldHVybiBFUlJfQlVGOworICB9CisgIHRjcGhkciA9IChzdHJ1Y3QgdGNwX2hkciAqKXAtPnBheWxvYWQ7CisgIExXSVBfREVCVUdGKFRDUF9PVVRQVVRfREVCVUcsIAorICAgICAgICAgICAgICAoInRjcF9vdXRwdXQ6IHNlbmRpbmcgQUNLIGZvciAlIlUzMl9GIlxuIiwgcGNiLT5yY3Zfbnh0KSk7CisgIC8qIHJlbW92ZSBBQ0sgZmxhZ3MgZnJvbSB0aGUgUENCLCBhcyB3ZSBzZW5kIGFuIGVtcHR5IEFDSyBub3cgKi8KKyAgcGNiLT5mbGFncyAmPSB+KFRGX0FDS19ERUxBWSB8IFRGX0FDS19OT1cpOworCisgIC8qIE5CLiBNU1Mgb3B0aW9uIGlzIG9ubHkgc2VudCBvbiBTWU5zLCBzbyBpZ25vcmUgaXQgaGVyZSAqLworI2lmIExXSVBfVENQX1RJTUVTVEFNUFMKKyAgcGNiLT50c19sYXN0YWNrc2VudCA9IHBjYi0+cmN2X254dDsKKworICBpZiAocGNiLT5mbGFncyAmIFRGX1RJTUVTVEFNUCkgeworICAgIHRjcF9idWlsZF90aW1lc3RhbXBfb3B0aW9uKHBjYiwgKHUzMl90ICopKHRjcGhkciArIDEpKTsKKyAgfQorI2VuZGlmIAorCisjaWYgQ0hFQ0tTVU1fR0VOX1RDUAorICB0Y3BoZHItPmNoa3N1bSA9IGluZXRfY2hrc3VtX3BzZXVkbyhwLCAmKHBjYi0+bG9jYWxfaXApLCAmKHBjYi0+cmVtb3RlX2lwKSwKKyAgICAgICAgSVBfUFJPVE9fVENQLCBwLT50b3RfbGVuKTsKKyNlbmRpZgorI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICBpcF9vdXRwdXRfaGludGVkKHAsICYocGNiLT5sb2NhbF9pcCksICYocGNiLT5yZW1vdGVfaXApLCBwY2ItPnR0bCwgcGNiLT50b3MsCisgICAgICBJUF9QUk9UT19UQ1AsICYocGNiLT5hZGRyX2hpbnQpKTsKKyNlbHNlIC8qIExXSVBfTkVUSUZfSFdBRERSSElOVCovCisgIGlwX291dHB1dChwLCAmKHBjYi0+bG9jYWxfaXApLCAmKHBjYi0+cmVtb3RlX2lwKSwgcGNiLT50dGwsIHBjYi0+dG9zLAorICAgICAgSVBfUFJPVE9fVENQKTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQqLworICBwYnVmX2ZyZWUocCk7CisKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBGaW5kIG91dCB3aGF0IHdlIGNhbiBzZW5kIGFuZCBzZW5kIGl0CisgKgorICogQHBhcmFtIHBjYiBQcm90b2NvbCBjb250cm9sIGJsb2NrIGZvciB0aGUgVENQIGNvbm5lY3Rpb24gdG8gc2VuZCBkYXRhCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBkYXRhIGhhcyBiZWVuIHNlbnQgb3Igbm90aGluZyB0byBzZW5kCisgKiAgICAgICAgIGFub3RoZXIgZXJyX3Qgb24gZXJyb3IKKyAqLworZXJyX3QKK3RjcF9vdXRwdXQoc3RydWN0IHRjcF9wY2IgKnBjYikKK3sKKyAgc3RydWN0IHRjcF9zZWcgKnNlZywgKnVzZWc7CisgIHUzMl90IHduZCwgc25kX254dDsKKyNpZiBUQ1BfQ1dORF9ERUJVRworICBzMTZfdCBpID0gMDsKKyNlbmRpZiAvKiBUQ1BfQ1dORF9ERUJVRyAqLworCisgIC8qIEZpcnN0LCBjaGVjayBpZiB3ZSBhcmUgaW52b2tlZCBieSB0aGUgVENQIGlucHV0IHByb2Nlc3NpbmcKKyAgICAgY29kZS4gSWYgc28sIHdlIGRvIG5vdCBvdXRwdXQgYW55dGhpbmcuIEluc3RlYWQsIHdlIHJlbHkgb24gdGhlCisgICAgIGlucHV0IHByb2Nlc3NpbmcgY29kZSB0byBjYWxsIHVzIHdoZW4gaW5wdXQgcHJvY2Vzc2luZyBpcyBkb25lCisgICAgIHdpdGguICovCisgIGlmICh0Y3BfaW5wdXRfcGNiID09IHBjYikgeworICAgIHJldHVybiBFUlJfT0s7CisgIH0KKworICB3bmQgPSBMV0lQX01JTihwY2ItPnNuZF93bmQsIHBjYi0+Y3duZCk7CisKKyAgc2VnID0gcGNiLT51bnNlbnQ7CisKKyAgLyogSWYgdGhlIFRGX0FDS19OT1cgZmxhZyBpcyBzZXQgYW5kIG5vIGRhdGEgd2lsbCBiZSBzZW50IChlaXRoZXIKKyAgICogYmVjYXVzZSB0aGUgLT51bnNlbnQgcXVldWUgaXMgZW1wdHkgb3IgYmVjYXVzZSB0aGUgd2luZG93IGRvZXMKKyAgICogbm90IGFsbG93IGl0KSwgY29uc3RydWN0IGFuIGVtcHR5IEFDSyBzZWdtZW50IGFuZCBzZW5kIGl0LgorICAgKgorICAgKiBJZiBkYXRhIGlzIHRvIGJlIHNlbnQsIHdlIHdpbGwganVzdCBwaWdneWJhY2sgdGhlIEFDSyAoc2VlIGJlbG93KS4KKyAgICovCisgIGlmIChwY2ItPmZsYWdzICYgVEZfQUNLX05PVyAmJgorICAgICAoc2VnID09IE5VTEwgfHwKKyAgICAgIG50b2hsKHNlZy0+dGNwaGRyLT5zZXFubykgLSBwY2ItPmxhc3RhY2sgKyBzZWctPmxlbiA+IHduZCkpIHsKKyAgICAgcmV0dXJuIHRjcF9zZW5kX2VtcHR5X2FjayhwY2IpOworICB9CisKKyAgLyogdXNlZyBzaG91bGQgcG9pbnQgdG8gbGFzdCBzZWdtZW50IG9uIHVuYWNrZWQgcXVldWUgKi8KKyAgdXNlZyA9IHBjYi0+dW5hY2tlZDsKKyAgaWYgKHVzZWcgIT0gTlVMTCkgeworICAgIGZvciAoOyB1c2VnLT5uZXh0ICE9IE5VTEw7IHVzZWcgPSB1c2VnLT5uZXh0KTsKKyAgfQorCisjaWYgVENQX09VVFBVVF9ERUJVRworICBpZiAoc2VnID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfT1VUUFVUX0RFQlVHLCAoInRjcF9vdXRwdXQ6IG5vdGhpbmcgdG8gc2VuZCAoJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopcGNiLT51bnNlbnQpKTsKKyAgfQorI2VuZGlmIC8qIFRDUF9PVVRQVVRfREVCVUcgKi8KKyNpZiBUQ1BfQ1dORF9ERUJVRworICBpZiAoc2VnID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfQ1dORF9ERUJVRywgKCJ0Y3Bfb3V0cHV0OiBzbmRfd25kICUiVTE2X0YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGN3bmQgJSJVMTZfRiIsIHduZCAlIlUzMl9GCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBzZWcgPT0gTlVMTCwgYWNrICUiVTMyX0YiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNiLT5zbmRfd25kLCBwY2ItPmN3bmQsIHduZCwgcGNiLT5sYXN0YWNrKSk7CisgIH0gZWxzZSB7CisgICAgTFdJUF9ERUJVR0YoVENQX0NXTkRfREVCVUcsIAorICAgICAgICAgICAgICAgICgidGNwX291dHB1dDogc25kX3duZCAlIlUxNl9GIiwgY3duZCAlIlUxNl9GIiwgd25kICUiVTMyX0YKKyAgICAgICAgICAgICAgICAgIiwgZWZmd25kICUiVTMyX0YiLCBzZXEgJSJVMzJfRiIsIGFjayAlIlUzMl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgcGNiLT5zbmRfd25kLCBwY2ItPmN3bmQsIHduZCwKKyAgICAgICAgICAgICAgICAgbnRvaGwoc2VnLT50Y3BoZHItPnNlcW5vKSAtIHBjYi0+bGFzdGFjayArIHNlZy0+bGVuLAorICAgICAgICAgICAgICAgICBudG9obChzZWctPnRjcGhkci0+c2Vxbm8pLCBwY2ItPmxhc3RhY2spKTsKKyAgfQorI2VuZGlmIC8qIFRDUF9DV05EX0RFQlVHICovCisgIC8qIGRhdGEgYXZhaWxhYmxlIGFuZCB3aW5kb3cgYWxsb3dzIGl0IHRvIGJlIHNlbnQ/ICovCisgIHdoaWxlIChzZWcgIT0gTlVMTCAmJgorICAgICAgICAgbnRvaGwoc2VnLT50Y3BoZHItPnNlcW5vKSAtIHBjYi0+bGFzdGFjayArIHNlZy0+bGVuIDw9IHduZCkgeworICAgIExXSVBfQVNTRVJUKCJSU1Qgbm90IGV4cGVjdGVkIGhlcmUhIiwgCisgICAgICAgICAgICAgICAgKFRDUEhfRkxBR1Moc2VnLT50Y3BoZHIpICYgVENQX1JTVCkgPT0gMCk7CisgICAgLyogU3RvcCBzZW5kaW5nIGlmIHRoZSBuYWdsZSBhbGdvcml0aG0gd291bGQgcHJldmVudCBpdAorICAgICAqIERvbid0IHN0b3A6CisgICAgICogLSBpZiB0Y3Bfd3JpdGUgaGFkIGEgbWVtb3J5IGVycm9yIGJlZm9yZSAocHJldmVudCBkZWxheWVkIEFDSyB0aW1lb3V0KSBvcgorICAgICAqIC0gaWYgRklOIHdhcyBhbHJlYWR5IGVucXVldWVkIGZvciB0aGlzIFBDQiAoU1lOIGlzIGFsd2F5cyBhbG9uZSBpbiBhIHNlZ21lbnQgLQorICAgICAqICAgZWl0aGVyIHNlZy0+bmV4dCAhPSBOVUxMIG9yIHBjYi0+dW5hY2tlZCA9PSBOVUxMOworICAgICAqICAgUlNUIGlzIG5vIHNlbnQgdXNpbmcgdGNwX3dyaXRlL3RjcF9vdXRwdXQuCisgICAgICovCisgICAgaWYoKHRjcF9kb19vdXRwdXRfbmFnbGUocGNiKSA9PSAwKSAmJgorICAgICAgKChwY2ItPmZsYWdzICYgKFRGX05BR0xFTUVNRVJSIHwgVEZfRklOKSkgPT0gMCkpeworICAgICAgYnJlYWs7CisgICAgfQorI2lmIFRDUF9DV05EX0RFQlVHCisgICAgTFdJUF9ERUJVR0YoVENQX0NXTkRfREVCVUcsICgidGNwX291dHB1dDogc25kX3duZCAlIlUxNl9GIiwgY3duZCAlIlUxNl9GIiwgd25kICUiVTMyX0YiLCBlZmZ3bmQgJSJVMzJfRiIsIHNlcSAlIlUzMl9GIiwgYWNrICUiVTMyX0YiLCBpICUiUzE2X0YiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjYi0+c25kX3duZCwgcGNiLT5jd25kLCB3bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaGwoc2VnLT50Y3BoZHItPnNlcW5vKSArIHNlZy0+bGVuIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2ItPmxhc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaGwoc2VnLT50Y3BoZHItPnNlcW5vKSwgcGNiLT5sYXN0YWNrLCBpKSk7CisgICAgKytpOworI2VuZGlmIC8qIFRDUF9DV05EX0RFQlVHICovCisKKyAgICBwY2ItPnVuc2VudCA9IHNlZy0+bmV4dDsKKworICAgIGlmIChwY2ItPnN0YXRlICE9IFNZTl9TRU5UKSB7CisgICAgICBUQ1BIX1NFVF9GTEFHKHNlZy0+dGNwaGRyLCBUQ1BfQUNLKTsKKyAgICAgIHBjYi0+ZmxhZ3MgJj0gfihURl9BQ0tfREVMQVkgfCBURl9BQ0tfTk9XKTsKKyAgICB9CisKKyAgICB0Y3Bfb3V0cHV0X3NlZ21lbnQoc2VnLCBwY2IpOworICAgIHNuZF9ueHQgPSBudG9obChzZWctPnRjcGhkci0+c2Vxbm8pICsgVENQX1RDUExFTihzZWcpOworICAgIGlmIChUQ1BfU0VRX0xUKHBjYi0+c25kX254dCwgc25kX254dCkpIHsKKyAgICAgIHBjYi0+c25kX254dCA9IHNuZF9ueHQ7CisgICAgfQorICAgIC8qIHB1dCBzZWdtZW50IG9uIHVuYWNrbm93bGVkZ2VkIGxpc3QgaWYgbGVuZ3RoID4gMCAqLworICAgIGlmIChUQ1BfVENQTEVOKHNlZykgPiAwKSB7CisgICAgICBzZWctPm5leHQgPSBOVUxMOworICAgICAgLyogdW5hY2tlZCBsaXN0IGlzIGVtcHR5PyAqLworICAgICAgaWYgKHBjYi0+dW5hY2tlZCA9PSBOVUxMKSB7CisgICAgICAgIHBjYi0+dW5hY2tlZCA9IHNlZzsKKyAgICAgICAgdXNlZyA9IHNlZzsKKyAgICAgIC8qIHVuYWNrZWQgbGlzdCBpcyBub3QgZW1wdHk/ICovCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJbiB0aGUgY2FzZSBvZiBmYXN0IHJldHJhbnNtaXQsIHRoZSBwYWNrZXQgc2hvdWxkIG5vdCBnbyB0byB0aGUgdGFpbAorICAgICAgICAgKiBvZiB0aGUgdW5hY2tlZCBxdWV1ZSwgYnV0IHJhdGhlciBzb21ld2hlcmUgYmVmb3JlIGl0LiBXZSBuZWVkIHRvIGNoZWNrIGZvcgorICAgICAgICAgKiB0aGlzIGNhc2UuIC1TVEogSnVsIDI3LCAyMDA0ICovCisgICAgICAgIGlmIChUQ1BfU0VRX0xUKG50b2hsKHNlZy0+dGNwaGRyLT5zZXFubyksIG50b2hsKHVzZWctPnRjcGhkci0+c2Vxbm8pKSkgeworICAgICAgICAgIC8qIGFkZCBzZWdtZW50IHRvIGJlZm9yZSB0YWlsIG9mIHVuYWNrZWQgbGlzdCwga2VlcGluZyB0aGUgbGlzdCBzb3J0ZWQgKi8KKyAgICAgICAgICBzdHJ1Y3QgdGNwX3NlZyAqKmN1cl9zZWcgPSAmKHBjYi0+dW5hY2tlZCk7CisgICAgICAgICAgd2hpbGUgKCpjdXJfc2VnICYmCisgICAgICAgICAgICBUQ1BfU0VRX0xUKG50b2hsKCgqY3VyX3NlZyktPnRjcGhkci0+c2Vxbm8pLCBudG9obChzZWctPnRjcGhkci0+c2Vxbm8pKSkgeworICAgICAgICAgICAgICBjdXJfc2VnID0gJigoKmN1cl9zZWcpLT5uZXh0ICk7CisgICAgICAgICAgfQorICAgICAgICAgIHNlZy0+bmV4dCA9ICgqY3VyX3NlZyk7CisgICAgICAgICAgKCpjdXJfc2VnKSA9IHNlZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBhZGQgc2VnbWVudCB0byB0YWlsIG9mIHVuYWNrZWQgbGlzdCAqLworICAgICAgICAgIHVzZWctPm5leHQgPSBzZWc7CisgICAgICAgICAgdXNlZyA9IHVzZWctPm5leHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAvKiBkbyBub3QgcXVldWUgZW1wdHkgc2VnbWVudHMgb24gdGhlIHVuYWNrZWQgbGlzdCAqLworICAgIH0gZWxzZSB7CisgICAgICB0Y3Bfc2VnX2ZyZWUoc2VnKTsKKyAgICB9CisgICAgc2VnID0gcGNiLT51bnNlbnQ7CisgIH0KKyNpZiBUQ1BfT1ZFUlNJWkUKKyAgaWYgKHBjYi0+dW5zZW50ID09IE5VTEwpIHsKKyAgICAvKiBsYXN0IHVuc2VudCBoYXMgYmVlbiByZW1vdmVkLCByZXNldCB1bnNlbnRfb3ZlcnNpemUgKi8KKyAgICBwY2ItPnVuc2VudF9vdmVyc2l6ZSA9IDA7CisgIH0KKyNlbmRpZiAvKiBUQ1BfT1ZFUlNJWkUgKi8KKworICBpZiAoc2VnICE9IE5VTEwgJiYgcGNiLT5wZXJzaXN0X2JhY2tvZmYgPT0gMCAmJiAKKyAgICAgIG50b2hsKHNlZy0+dGNwaGRyLT5zZXFubykgLSBwY2ItPmxhc3RhY2sgKyBzZWctPmxlbiA+IHBjYi0+c25kX3duZCkgeworICAgIC8qIHByZXBhcmUgZm9yIHBlcnNpc3QgdGltZXIgKi8KKyAgICBwY2ItPnBlcnNpc3RfY250ID0gMDsKKyAgICBwY2ItPnBlcnNpc3RfYmFja29mZiA9IDE7CisgIH0KKworICBwY2ItPmZsYWdzICY9IH5URl9OQUdMRU1FTUVSUjsKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgdGNwX291dHB1dCgpIHRvIGFjdHVhbGx5IHNlbmQgYSBUQ1Agc2VnbWVudCBvdmVyIElQLgorICoKKyAqIEBwYXJhbSBzZWcgdGhlIHRjcF9zZWcgdG8gc2VuZAorICogQHBhcmFtIHBjYiB0aGUgdGNwX3BjYiBmb3IgdGhlIFRDUCBjb25uZWN0aW9uIHVzZWQgdG8gc2VuZCB0aGUgc2VnbWVudAorICovCitzdGF0aWMgdm9pZAordGNwX291dHB1dF9zZWdtZW50KHN0cnVjdCB0Y3Bfc2VnICpzZWcsIHN0cnVjdCB0Y3BfcGNiICpwY2IpCit7CisgIHUxNl90IGxlbjsKKyAgc3RydWN0IG5ldGlmICpuZXRpZjsKKyAgdTMyX3QgKm9wdHM7CisKKyAgLyoqIEBidWcgRXhjbHVkZSByZXRyYW5zbWl0dGVkIHNlZ21lbnRzIGZyb20gdGhpcyBjb3VudC4gKi8KKyAgc25tcF9pbmNfdGNwb3V0c2VncygpOworCisgIC8qIFRoZSBUQ1AgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gY29uc3RydWN0ZWQsIGJ1dCB0aGUgYWNrbm8gYW5kCisgICB3bmQgZmllbGRzIHJlbWFpbi4gKi8KKyAgc2VnLT50Y3BoZHItPmFja25vID0gaHRvbmwocGNiLT5yY3Zfbnh0KTsKKworICAvKiBhZHZlcnRpc2Ugb3VyIHJlY2VpdmUgd2luZG93IHNpemUgaW4gdGhpcyBUQ1Agc2VnbWVudCAqLworICBzZWctPnRjcGhkci0+d25kID0gaHRvbnMocGNiLT5yY3ZfYW5uX3duZCk7CisKKyAgcGNiLT5yY3ZfYW5uX3JpZ2h0X2VkZ2UgPSBwY2ItPnJjdl9ueHQgKyBwY2ItPnJjdl9hbm5fd25kOworCisgIC8qIEFkZCBhbnkgcmVxdWVzdGVkIG9wdGlvbnMuICBOQiBNU1Mgb3B0aW9uIGlzIG9ubHkgc2V0IG9uIFNZTgorICAgICBwYWNrZXRzLCBzbyBpZ25vcmUgaXQgaGVyZSAqLworICBMV0lQX0FTU0VSVCgic2VnLT50Y3BoZHIgbm90IGFsaWduZWQiLCAoKG1lbV9wdHJfdClzZWctPnRjcGhkciAlIE1FTV9BTElHTk1FTlQpID09IDApOworICBvcHRzID0gKHUzMl90ICopKHZvaWQgKikoc2VnLT50Y3BoZHIgKyAxKTsKKyAgaWYgKHNlZy0+ZmxhZ3MgJiBURl9TRUdfT1BUU19NU1MpIHsKKyAgICBUQ1BfQlVJTERfTVNTX09QVElPTigqb3B0cyk7CisgICAgb3B0cyArPSAxOworICB9CisjaWYgTFdJUF9UQ1BfVElNRVNUQU1QUworICBwY2ItPnRzX2xhc3RhY2tzZW50ID0gcGNiLT5yY3Zfbnh0OworCisgIGlmIChzZWctPmZsYWdzICYgVEZfU0VHX09QVFNfVFMpIHsKKyAgICB0Y3BfYnVpbGRfdGltZXN0YW1wX29wdGlvbihwY2IsIG9wdHMpOworICAgIG9wdHMgKz0gMzsKKyAgfQorI2VuZGlmCisKKyAgLyogU2V0IHJldHJhbnNtaXNzaW9uIHRpbWVyIHJ1bm5pbmcgaWYgaXQgaXMgbm90IGN1cnJlbnRseSBlbmFibGVkIAorICAgICBUaGlzIG11c3QgYmUgc2V0IGJlZm9yZSBjaGVja2luZyB0aGUgcm91dGUuICovCisgIGlmIChwY2ItPnJ0aW1lID09IC0xKSB7CisgICAgcGNiLT5ydGltZSA9IDA7CisgIH0KKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgbG9jYWwgSVAgYWRkcmVzcywgd2UgZ2V0IG9uZSBieQorICAgICBjYWxsaW5nIGlwX3JvdXRlKCkuICovCisgIGlmIChpcF9hZGRyX2lzYW55KCYocGNiLT5sb2NhbF9pcCkpKSB7CisgICAgbmV0aWYgPSBpcF9yb3V0ZSgmKHBjYi0+cmVtb3RlX2lwKSk7CisgICAgaWYgKG5ldGlmID09IE5VTEwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaXBfYWRkcl9jb3B5KHBjYi0+bG9jYWxfaXAsIG5ldGlmLT5pcF9hZGRyKTsKKyAgfQorCisgIGlmIChwY2ItPnJ0dGVzdCA9PSAwKSB7CisgICAgcGNiLT5ydHRlc3QgPSB0Y3BfdGlja3M7CisgICAgcGNiLT5ydHNlcSA9IG50b2hsKHNlZy0+dGNwaGRyLT5zZXFubyk7CisKKyAgICBMV0lQX0RFQlVHRihUQ1BfUlRPX0RFQlVHLCAoInRjcF9vdXRwdXRfc2VnbWVudDogcnRzZXEgJSJVMzJfRiJcbiIsIHBjYi0+cnRzZXEpKTsKKyAgfQorICBMV0lQX0RFQlVHRihUQ1BfT1VUUFVUX0RFQlVHLCAoInRjcF9vdXRwdXRfc2VnbWVudDogJSJVMzJfRiI6JSJVMzJfRiJcbiIsCisgICAgICAgICAgaHRvbmwoc2VnLT50Y3BoZHItPnNlcW5vKSwgaHRvbmwoc2VnLT50Y3BoZHItPnNlcW5vKSArCisgICAgICAgICAgc2VnLT5sZW4pKTsKKworICBsZW4gPSAodTE2X3QpKCh1OF90ICopc2VnLT50Y3BoZHIgLSAodThfdCAqKXNlZy0+cC0+cGF5bG9hZCk7CisKKyAgc2VnLT5wLT5sZW4gLT0gbGVuOworICBzZWctPnAtPnRvdF9sZW4gLT0gbGVuOworCisgIHNlZy0+cC0+cGF5bG9hZCA9IHNlZy0+dGNwaGRyOworCisgIHNlZy0+dGNwaGRyLT5jaGtzdW0gPSAwOworI2lmIENIRUNLU1VNX0dFTl9UQ1AKKyNpZiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWQorICB7CisgICAgdTMyX3QgYWNjOworI2lmIFRDUF9DSEVDS1NVTV9PTl9DT1BZX1NBTklUWV9DSEVDSworICAgIHUxNl90IGNoa3N1bV9zbG93ID0gaW5ldF9jaGtzdW1fcHNldWRvKHNlZy0+cCwgJihwY2ItPmxvY2FsX2lwKSwKKyAgICAgICAgICAgJihwY2ItPnJlbW90ZV9pcCksCisgICAgICAgICAgIElQX1BST1RPX1RDUCwgc2VnLT5wLT50b3RfbGVuKTsKKyNlbmRpZiAvKiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWV9TQU5JVFlfQ0hFQ0sgKi8KKyAgICBpZiAoKHNlZy0+ZmxhZ3MgJiBURl9TRUdfREFUQV9DSEVDS1NVTU1FRCkgPT0gMCkgeworICAgICAgTFdJUF9BU1NFUlQoImRhdGEgaW5jbHVkZWQgYnV0IG5vdCBjaGVja3N1bW1lZCIsCisgICAgICAgIHNlZy0+cC0+dG90X2xlbiA9PSAoVENQSF9IRFJMRU4oc2VnLT50Y3BoZHIpICogNCkpOworICAgIH0KKworICAgIC8qIHJlYnVpbGQgVENQIGhlYWRlciBjaGVja3N1bSAoVENQIGhlYWRlciBjaGFuZ2VzIGZvciByZXRyYW5zbWlzc2lvbnMhKSAqLworICAgIGFjYyA9IGluZXRfY2hrc3VtX3BzZXVkb19wYXJ0aWFsKHNlZy0+cCwgJihwY2ItPmxvY2FsX2lwKSwKKyAgICAgICAgICAgICAmKHBjYi0+cmVtb3RlX2lwKSwKKyAgICAgICAgICAgICBJUF9QUk9UT19UQ1AsIHNlZy0+cC0+dG90X2xlbiwgVENQSF9IRFJMRU4oc2VnLT50Y3BoZHIpICogNCk7CisgICAgLyogYWRkIHBheWxvYWQgY2hlY2tzdW0gKi8KKyAgICBpZiAoc2VnLT5jaGtzdW1fc3dhcHBlZCkgeworICAgICAgc2VnLT5jaGtzdW0gPSBTV0FQX0JZVEVTX0lOX1dPUkQoc2VnLT5jaGtzdW0pOworICAgICAgc2VnLT5jaGtzdW1fc3dhcHBlZCA9IDA7CisgICAgfQorICAgIGFjYyArPSAodTE2X3QpfihzZWctPmNoa3N1bSk7CisgICAgc2VnLT50Y3BoZHItPmNoa3N1bSA9IEZPTERfVTMyVChhY2MpOworI2lmIFRDUF9DSEVDS1NVTV9PTl9DT1BZX1NBTklUWV9DSEVDSworICAgIGlmIChjaGtzdW1fc2xvdyAhPSBzZWctPnRjcGhkci0+Y2hrc3VtKSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgKCJ0Y3Bfb3V0cHV0X3NlZ21lbnQ6IGNhbGN1bGF0ZWQgY2hlY2tzdW0gaXMgJSJYMTZfRiIgaW5zdGVhZCBvZiAlIlgxNl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgIHNlZy0+dGNwaGRyLT5jaGtzdW0sIGNoa3N1bV9zbG93KSk7CisgICAgICBzZWctPnRjcGhkci0+Y2hrc3VtID0gY2hrc3VtX3Nsb3c7CisgICAgfQorI2VuZGlmIC8qIFRDUF9DSEVDS1NVTV9PTl9DT1BZX1NBTklUWV9DSEVDSyAqLworICB9CisjZWxzZSAvKiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWSAqLworICBzZWctPnRjcGhkci0+Y2hrc3VtID0gaW5ldF9jaGtzdW1fcHNldWRvKHNlZy0+cCwgJihwY2ItPmxvY2FsX2lwKSwKKyAgICAgICAgICYocGNiLT5yZW1vdGVfaXApLAorICAgICAgICAgSVBfUFJPVE9fVENQLCBzZWctPnAtPnRvdF9sZW4pOworI2VuZGlmIC8qIFRDUF9DSEVDS1NVTV9PTl9DT1BZICovCisjZW5kaWYgLyogQ0hFQ0tTVU1fR0VOX1RDUCAqLworICBUQ1BfU1RBVFNfSU5DKHRjcC54bWl0KTsKKworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICBpcF9vdXRwdXRfaGludGVkKHNlZy0+cCwgJihwY2ItPmxvY2FsX2lwKSwgJihwY2ItPnJlbW90ZV9pcCksIHBjYi0+dHRsLCBwY2ItPnRvcywKKyAgICAgIElQX1BST1RPX1RDUCwgJihwY2ItPmFkZHJfaGludCkpOworI2Vsc2UgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UKi8KKyAgaXBfb3V0cHV0KHNlZy0+cCwgJihwY2ItPmxvY2FsX2lwKSwgJihwY2ItPnJlbW90ZV9pcCksIHBjYi0+dHRsLCBwY2ItPnRvcywKKyAgICAgIElQX1BST1RPX1RDUCk7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UKi8KK30KKworLyoqCisgKiBTZW5kIGEgVENQIFJFU0VUIHBhY2tldCAoZW1wdHkgc2VnbWVudCB3aXRoIFJTVCBmbGFnIHNldCkgZWl0aGVyIHRvCisgKiBhYm9ydCBhIGNvbm5lY3Rpb24gb3IgdG8gc2hvdyB0aGF0IHRoZXJlIGlzIG5vIG1hdGNoaW5nIGxvY2FsIGNvbm5lY3Rpb24KKyAqIGZvciBhIHJlY2VpdmVkIHNlZ21lbnQuCisgKgorICogQ2FsbGVkIGJ5IHRjcF9hYm9ydCgpICh0byBhYm9ydCBhIGxvY2FsIGNvbm5lY3Rpb24pLCB0Y3BfaW5wdXQoKSAoaWYgbm8KKyAqIG1hdGNoaW5nIGxvY2FsIHBjYiB3YXMgZm91bmQpLCB0Y3BfbGlzdGVuX2lucHV0KCkgKGlmIGluY29taW5nIHNlZ21lbnQKKyAqIGhhcyBBQ0sgZmxhZyBzZXQpIGFuZCB0Y3BfcHJvY2VzcygpIChyZWNlaXZlZCBzZWdtZW50IGluIHRoZSB3cm9uZyBzdGF0ZSkKKyAqCisgKiBTaW5jZSBhIFJTVCBzZWdtZW50IGlzIGluIG1vc3QgY2FzZXMgbm90IHNlbnQgZm9yIGFuIGFjdGl2ZSBjb25uZWN0aW9uLAorICogdGNwX3JzdCgpIGhhcyBhIG51bWJlciBvZiBhcmd1bWVudHMgdGhhdCBhcmUgdGFrZW4gZnJvbSBhIHRjcF9wY2IgZm9yCisgKiBtb3N0IG90aGVyIHNlZ21lbnQgb3V0cHV0IGZ1bmN0aW9ucy4KKyAqCisgKiBAcGFyYW0gc2Vxbm8gdGhlIHNlcXVlbmNlIG51bWJlciB0byB1c2UgZm9yIHRoZSBvdXRnb2luZyBzZWdtZW50CisgKiBAcGFyYW0gYWNrbm8gdGhlIGFja25vd2xlZGdlIG51bWJlciB0byB1c2UgZm9yIHRoZSBvdXRnb2luZyBzZWdtZW50CisgKiBAcGFyYW0gbG9jYWxfaXAgdGhlIGxvY2FsIElQIGFkZHJlc3MgdG8gc2VuZCB0aGUgc2VnbWVudCBmcm9tCisgKiBAcGFyYW0gcmVtb3RlX2lwIHRoZSByZW1vdGUgSVAgYWRkcmVzcyB0byBzZW5kIHRoZSBzZWdtZW50IHRvCisgKiBAcGFyYW0gbG9jYWxfcG9ydCB0aGUgbG9jYWwgVENQIHBvcnQgdG8gc2VuZCB0aGUgc2VnbWVudCBmcm9tCisgKiBAcGFyYW0gcmVtb3RlX3BvcnQgdGhlIHJlbW90ZSBUQ1AgcG9ydCB0byBzZW5kIHRoZSBzZWdtZW50IHRvCisgKi8KK3ZvaWQKK3RjcF9yc3QodTMyX3Qgc2Vxbm8sIHUzMl90IGFja25vLAorICBpcF9hZGRyX3QgKmxvY2FsX2lwLCBpcF9hZGRyX3QgKnJlbW90ZV9pcCwKKyAgdTE2X3QgbG9jYWxfcG9ydCwgdTE2X3QgcmVtb3RlX3BvcnQpCit7CisgIHN0cnVjdCBwYnVmICpwOworICBzdHJ1Y3QgdGNwX2hkciAqdGNwaGRyOworICBwID0gcGJ1Zl9hbGxvYyhQQlVGX0lQLCBUQ1BfSExFTiwgUEJVRl9SQU0pOworICBpZiAocCA9PSBOVUxMKSB7CisgICAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX3JzdDogY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcGJ1ZlxuIikpOworICAgICAgcmV0dXJuOworICB9CisgIExXSVBfQVNTRVJUKCJjaGVjayB0aGF0IGZpcnN0IHBidWYgY2FuIGhvbGQgc3RydWN0IHRjcF9oZHIiLAorICAgICAgICAgICAgICAocC0+bGVuID49IHNpemVvZihzdHJ1Y3QgdGNwX2hkcikpKTsKKworICB0Y3BoZHIgPSAoc3RydWN0IHRjcF9oZHIgKilwLT5wYXlsb2FkOworICB0Y3BoZHItPnNyYyA9IGh0b25zKGxvY2FsX3BvcnQpOworICB0Y3BoZHItPmRlc3QgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisgIHRjcGhkci0+c2Vxbm8gPSBodG9ubChzZXFubyk7CisgIHRjcGhkci0+YWNrbm8gPSBodG9ubChhY2tubyk7CisgIFRDUEhfSERSTEVOX0ZMQUdTX1NFVCh0Y3BoZHIsIFRDUF9ITEVOLzQsIFRDUF9SU1QgfCBUQ1BfQUNLKTsKKyAgdGNwaGRyLT53bmQgPSBQUF9IVE9OUyhUQ1BfV05EKTsKKyAgdGNwaGRyLT5jaGtzdW0gPSAwOworICB0Y3BoZHItPnVyZ3AgPSAwOworCisjaWYgQ0hFQ0tTVU1fR0VOX1RDUAorICB0Y3BoZHItPmNoa3N1bSA9IGluZXRfY2hrc3VtX3BzZXVkbyhwLCBsb2NhbF9pcCwgcmVtb3RlX2lwLAorICAgICAgICAgICAgICBJUF9QUk9UT19UQ1AsIHAtPnRvdF9sZW4pOworI2VuZGlmCisgIFRDUF9TVEFUU19JTkModGNwLnhtaXQpOworICBzbm1wX2luY190Y3BvdXRyc3RzKCk7CisgICAvKiBTZW5kIG91dHB1dCB3aXRoIGhhcmRjb2RlZCBUVEwgc2luY2Ugd2UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhlIHBjYiAqLworICBpcF9vdXRwdXQocCwgbG9jYWxfaXAsIHJlbW90ZV9pcCwgVENQX1RUTCwgMCwgSVBfUFJPVE9fVENQKTsKKyAgcGJ1Zl9mcmVlKHApOworICBMV0lQX0RFQlVHRihUQ1BfUlNUX0RFQlVHLCAoInRjcF9yc3Q6IHNlcW5vICUiVTMyX0YiIGFja25vICUiVTMyX0YiLlxuIiwgc2Vxbm8sIGFja25vKSk7Cit9CisKKy8qKgorICogUmVxdWV1ZSBhbGwgdW5hY2tlZCBzZWdtZW50cyBmb3IgcmV0cmFuc21pc3Npb24KKyAqCisgKiBDYWxsZWQgYnkgdGNwX3Nsb3d0bXIoKSBmb3Igc2xvdyByZXRyYW5zbWlzc2lvbi4KKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB0Y3BfcGNiIGZvciB3aGljaCB0byByZS1lbnF1ZXVlIGFsbCB1bmFja2VkIHNlZ21lbnRzCisgKi8KK3ZvaWQKK3RjcF9yZXhtaXRfcnRvKHN0cnVjdCB0Y3BfcGNiICpwY2IpCit7CisgIHN0cnVjdCB0Y3Bfc2VnICpzZWc7CisKKyAgaWYgKHBjYi0+dW5hY2tlZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogTW92ZSBhbGwgdW5hY2tlZCBzZWdtZW50cyB0byB0aGUgaGVhZCBvZiB0aGUgdW5zZW50IHF1ZXVlICovCisgIGZvciAoc2VnID0gcGNiLT51bmFja2VkOyBzZWctPm5leHQgIT0gTlVMTDsgc2VnID0gc2VnLT5uZXh0KTsKKyAgLyogY29uY2F0ZW5hdGUgdW5zZW50IHF1ZXVlIGFmdGVyIHVuYWNrZWQgcXVldWUgKi8KKyAgc2VnLT5uZXh0ID0gcGNiLT51bnNlbnQ7CisgIC8qIHVuc2VudCBxdWV1ZSBpcyB0aGUgY29uY2F0ZW5hdGVkIHF1ZXVlIChvZiB1bmFja2VkLCB1bnNlbnQpICovCisgIHBjYi0+dW5zZW50ID0gcGNiLT51bmFja2VkOworICAvKiB1bmFja2VkIHF1ZXVlIGlzIG5vdyBlbXB0eSAqLworICBwY2ItPnVuYWNrZWQgPSBOVUxMOworCisgIC8qIGluY3JlbWVudCBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zICovCisgICsrcGNiLT5ucnR4OworCisgIC8qIERvbid0IHRha2UgYW55IFJUVCBtZWFzdXJlbWVudHMgYWZ0ZXIgcmV0cmFuc21pdHRpbmcuICovCisgIHBjYi0+cnR0ZXN0ID0gMDsKKworICAvKiBEbyB0aGUgYWN0dWFsIHJldHJhbnNtaXNzaW9uICovCisgIHRjcF9vdXRwdXQocGNiKTsKK30KKworLyoqCisgKiBSZXF1ZXVlIHRoZSBmaXJzdCB1bmFja2VkIHNlZ21lbnQgZm9yIHJldHJhbnNtaXNzaW9uCisgKgorICogQ2FsbGVkIGJ5IHRjcF9yZWNlaXZlKCkgZm9yIGZhc3QgcmV0cmFtc21pdC4KKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB0Y3BfcGNiIGZvciB3aGljaCB0byByZXRyYW5zbWl0IHRoZSBmaXJzdCB1bmFja2VkIHNlZ21lbnQKKyAqLwordm9pZAordGNwX3JleG1pdChzdHJ1Y3QgdGNwX3BjYiAqcGNiKQoreworICBzdHJ1Y3QgdGNwX3NlZyAqc2VnOworICBzdHJ1Y3QgdGNwX3NlZyAqKmN1cl9zZWc7CisKKyAgaWYgKHBjYi0+dW5hY2tlZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogTW92ZSB0aGUgZmlyc3QgdW5hY2tlZCBzZWdtZW50IHRvIHRoZSB1bnNlbnQgcXVldWUgKi8KKyAgLyogS2VlcCB0aGUgdW5zZW50IHF1ZXVlIHNvcnRlZC4gKi8KKyAgc2VnID0gcGNiLT51bmFja2VkOworICBwY2ItPnVuYWNrZWQgPSBzZWctPm5leHQ7CisKKyAgY3VyX3NlZyA9ICYocGNiLT51bnNlbnQpOworICB3aGlsZSAoKmN1cl9zZWcgJiYKKyAgICBUQ1BfU0VRX0xUKG50b2hsKCgqY3VyX3NlZyktPnRjcGhkci0+c2Vxbm8pLCBudG9obChzZWctPnRjcGhkci0+c2Vxbm8pKSkgeworICAgICAgY3VyX3NlZyA9ICYoKCpjdXJfc2VnKS0+bmV4dCApOworICB9CisgIHNlZy0+bmV4dCA9ICpjdXJfc2VnOworICAqY3VyX3NlZyA9IHNlZzsKKworICArK3BjYi0+bnJ0eDsKKworICAvKiBEb24ndCB0YWtlIGFueSBydHQgbWVhc3VyZW1lbnRzIGFmdGVyIHJldHJhbnNtaXR0aW5nLiAqLworICBwY2ItPnJ0dGVzdCA9IDA7CisKKyAgLyogRG8gdGhlIGFjdHVhbCByZXRyYW5zbWlzc2lvbi4gKi8KKyAgc25tcF9pbmNfdGNwcmV0cmFuc3NlZ3MoKTsKKyAgLyogTm8gbmVlZCB0byBjYWxsIHRjcF9vdXRwdXQ6IHdlIGFyZSBhbHdheXMgY2FsbGVkIGZyb20gdGNwX2lucHV0KCkKKyAgICAgYW5kIHRodXMgdGNwX291dHB1dCBkaXJlY3RseSByZXR1cm5zLiAqLworfQorCisKKy8qKgorICogSGFuZGxlIHJldHJhbnNtaXNzaW9uIGFmdGVyIHRocmVlIGR1cGFja3MgcmVjZWl2ZWQKKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB0Y3BfcGNiIGZvciB3aGljaCB0byByZXRyYW5zbWl0IHRoZSBmaXJzdCB1bmFja2VkIHNlZ21lbnQKKyAqLwordm9pZCAKK3RjcF9yZXhtaXRfZmFzdChzdHJ1Y3QgdGNwX3BjYiAqcGNiKQoreworICBpZiAocGNiLT51bmFja2VkICE9IE5VTEwgJiYgIShwY2ItPmZsYWdzICYgVEZfSU5GUikpIHsKKyAgICAvKiBUaGlzIGlzIGZhc3QgcmV0cmFuc21pdC4gUmV0cmFuc21pdCB0aGUgZmlyc3QgdW5hY2tlZCBzZWdtZW50LiAqLworICAgIExXSVBfREVCVUdGKFRDUF9GUl9ERUJVRywgCisgICAgICAgICAgICAgICAgKCJ0Y3BfcmVjZWl2ZTogZHVwYWNrcyAlIlUxNl9GIiAoJSJVMzJfRgorICAgICAgICAgICAgICAgICAiKSwgZmFzdCByZXRyYW5zbWl0ICUiVTMyX0YiXG4iLAorICAgICAgICAgICAgICAgICAodTE2X3QpcGNiLT5kdXBhY2tzLCBwY2ItPmxhc3RhY2ssCisgICAgICAgICAgICAgICAgIG50b2hsKHBjYi0+dW5hY2tlZC0+dGNwaGRyLT5zZXFubykpKTsKKyAgICB0Y3BfcmV4bWl0KHBjYik7CisKKyAgICAvKiBTZXQgc3N0aHJlc2ggdG8gaGFsZiBvZiB0aGUgbWluaW11bSBvZiB0aGUgY3VycmVudAorICAgICAqIGN3bmQgYW5kIHRoZSBhZHZlcnRpc2VkIHdpbmRvdyAqLworICAgIGlmIChwY2ItPmN3bmQgPiBwY2ItPnNuZF93bmQpIHsKKyAgICAgIHBjYi0+c3N0aHJlc2ggPSBwY2ItPnNuZF93bmQgLyAyOworICAgIH0gZWxzZSB7CisgICAgICBwY2ItPnNzdGhyZXNoID0gcGNiLT5jd25kIC8gMjsKKyAgICB9CisgICAgCisgICAgLyogVGhlIG1pbmltdW0gdmFsdWUgZm9yIHNzdGhyZXNoIHNob3VsZCBiZSAyIE1TUyAqLworICAgIGlmIChwY2ItPnNzdGhyZXNoIDwgMipwY2ItPm1zcykgeworICAgICAgTFdJUF9ERUJVR0YoVENQX0ZSX0RFQlVHLCAKKyAgICAgICAgICAgICAgICAgICgidGNwX3JlY2VpdmU6IFRoZSBtaW5pbXVtIHZhbHVlIGZvciBzc3RocmVzaCAlIlUxNl9GCisgICAgICAgICAgICAgICAgICAgIiBzaG91bGQgYmUgbWluIDIgbXNzICUiVTE2X0YiLi4uXG4iLAorICAgICAgICAgICAgICAgICAgIHBjYi0+c3N0aHJlc2gsIDIqcGNiLT5tc3MpKTsKKyAgICAgIHBjYi0+c3N0aHJlc2ggPSAyKnBjYi0+bXNzOworICAgIH0KKyAgICAKKyAgICBwY2ItPmN3bmQgPSBwY2ItPnNzdGhyZXNoICsgMyAqIHBjYi0+bXNzOworICAgIHBjYi0+ZmxhZ3MgfD0gVEZfSU5GUjsKKyAgfSAKK30KKworCisvKioKKyAqIFNlbmQga2VlcGFsaXZlIHBhY2tldHMgdG8ga2VlcCBhIGNvbm5lY3Rpb24gYWN0aXZlIGFsdGhvdWdoCisgKiBubyBkYXRhIGlzIHNlbnQgb3ZlciBpdC4KKyAqCisgKiBDYWxsZWQgYnkgdGNwX3Nsb3d0bXIoKQorICoKKyAqIEBwYXJhbSBwY2IgdGhlIHRjcF9wY2IgZm9yIHdoaWNoIHRvIHNlbmQgYSBrZWVwYWxpdmUgcGFja2V0CisgKi8KK3ZvaWQKK3RjcF9rZWVwYWxpdmUoc3RydWN0IHRjcF9wY2IgKnBjYikKK3sKKyAgc3RydWN0IHBidWYgKnA7CisgIHN0cnVjdCB0Y3BfaGRyICp0Y3BoZHI7CisKKyAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF9rZWVwYWxpdmU6IHNlbmRpbmcgS0VFUEFMSVZFIHByb2JlIHRvICUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpcDRfYWRkcjFfMTYoJnBjYi0+cmVtb3RlX2lwKSwgaXA0X2FkZHIyXzE2KCZwY2ItPnJlbW90ZV9pcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNF9hZGRyM18xNigmcGNiLT5yZW1vdGVfaXApLCBpcDRfYWRkcjRfMTYoJnBjYi0+cmVtb3RlX2lwKSkpOworCisgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJ0Y3Bfa2VlcGFsaXZlOiB0Y3BfdGlja3MgJSJVMzJfRiIgICBwY2ItPnRtciAlIlUzMl9GIiBwY2ItPmtlZXBfY250X3NlbnQgJSJVMTZfRiJcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BfdGlja3MsIHBjYi0+dG1yLCBwY2ItPmtlZXBfY250X3NlbnQpKTsKKyAgIAorICBwID0gdGNwX291dHB1dF9hbGxvY19oZWFkZXIocGNiLCAwLCAwLCBodG9ubChwY2ItPnNuZF9ueHQgLSAxKSk7CisgIGlmKHAgPT0gTlVMTCkgeworICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgCisgICAgICAgICAgICAgICAgKCJ0Y3Bfa2VlcGFsaXZlOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwYnVmXG4iKSk7CisgICAgcmV0dXJuOworICB9CisgIHRjcGhkciA9IChzdHJ1Y3QgdGNwX2hkciAqKXAtPnBheWxvYWQ7CisKKyNpZiBDSEVDS1NVTV9HRU5fVENQCisgIHRjcGhkci0+Y2hrc3VtID0gaW5ldF9jaGtzdW1fcHNldWRvKHAsICZwY2ItPmxvY2FsX2lwLCAmcGNiLT5yZW1vdGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQX1BST1RPX1RDUCwgcC0+dG90X2xlbik7CisjZW5kaWYKKyAgVENQX1NUQVRTX0lOQyh0Y3AueG1pdCk7CisKKyAgLyogU2VuZCBvdXRwdXQgdG8gSVAgKi8KKyNpZiBMV0lQX05FVElGX0hXQUREUkhJTlQKKyAgaXBfb3V0cHV0X2hpbnRlZChwLCAmcGNiLT5sb2NhbF9pcCwgJnBjYi0+cmVtb3RlX2lwLCBwY2ItPnR0bCwgMCwgSVBfUFJPVE9fVENQLAorICAgICYocGNiLT5hZGRyX2hpbnQpKTsKKyNlbHNlIC8qIExXSVBfTkVUSUZfSFdBRERSSElOVCovCisgIGlwX291dHB1dChwLCAmcGNiLT5sb2NhbF9pcCwgJnBjYi0+cmVtb3RlX2lwLCBwY2ItPnR0bCwgMCwgSVBfUFJPVE9fVENQKTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQqLworCisgIHBidWZfZnJlZShwKTsKKworICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX2tlZXBhbGl2ZTogc2Vxbm8gJSJVMzJfRiIgYWNrbm8gJSJVMzJfRiIuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwY2ItPnNuZF9ueHQgLSAxLCBwY2ItPnJjdl9ueHQpKTsKK30KKworCisvKioKKyAqIFNlbmQgcGVyc2lzdCB0aW1lciB6ZXJvLXdpbmRvdyBwcm9iZXMgdG8ga2VlcCBhIGNvbm5lY3Rpb24gYWN0aXZlCisgKiB3aGVuIGEgd2luZG93IHVwZGF0ZSBpcyBsb3N0LgorICoKKyAqIENhbGxlZCBieSB0Y3Bfc2xvd3RtcigpCisgKgorICogQHBhcmFtIHBjYiB0aGUgdGNwX3BjYiBmb3Igd2hpY2ggdG8gc2VuZCBhIHplcm8td2luZG93IHByb2JlIHBhY2tldAorICovCit2b2lkCit0Y3BfemVyb193aW5kb3dfcHJvYmUoc3RydWN0IHRjcF9wY2IgKnBjYikKK3sKKyAgc3RydWN0IHBidWYgKnA7CisgIHN0cnVjdCB0Y3BfaGRyICp0Y3BoZHI7CisgIHN0cnVjdCB0Y3Bfc2VnICpzZWc7CisgIHUxNl90IGxlbjsKKyAgdThfdCBpc19maW47CisKKyAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAKKyAgICAgICAgICAgICAgKCJ0Y3BfemVyb193aW5kb3dfcHJvYmU6IHNlbmRpbmcgWkVSTyBXSU5ET1cgcHJvYmUgdG8gJSIKKyAgICAgICAgICAgICAgIFUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICAgICAgICAgICAgIGlwNF9hZGRyMV8xNigmcGNiLT5yZW1vdGVfaXApLCBpcDRfYWRkcjJfMTYoJnBjYi0+cmVtb3RlX2lwKSwKKyAgICAgICAgICAgICAgIGlwNF9hZGRyM18xNigmcGNiLT5yZW1vdGVfaXApLCBpcDRfYWRkcjRfMTYoJnBjYi0+cmVtb3RlX2lwKSkpOworCisgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgCisgICAgICAgICAgICAgICgidGNwX3plcm9fd2luZG93X3Byb2JlOiB0Y3BfdGlja3MgJSJVMzJfRgorICAgICAgICAgICAgICAgIiAgIHBjYi0+dG1yICUiVTMyX0YiIHBjYi0+a2VlcF9jbnRfc2VudCAlIlUxNl9GIlxuIiwgCisgICAgICAgICAgICAgICB0Y3BfdGlja3MsIHBjYi0+dG1yLCBwY2ItPmtlZXBfY250X3NlbnQpKTsKKworICBzZWcgPSBwY2ItPnVuYWNrZWQ7CisKKyAgaWYoc2VnID09IE5VTEwpIHsKKyAgICBzZWcgPSBwY2ItPnVuc2VudDsKKyAgfQorICBpZihzZWcgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlzX2ZpbiA9ICgoVENQSF9GTEFHUyhzZWctPnRjcGhkcikgJiBUQ1BfRklOKSAhPSAwKSAmJiAoc2VnLT5sZW4gPT0gMCk7CisgIC8qIHdlIHdhbnQgdG8gc2VuZCBvbmUgc2Vxbm86IGVpdGhlciBGSU4gb3IgZGF0YSAobm8gb3B0aW9ucykgKi8KKyAgbGVuID0gaXNfZmluID8gMCA6IDE7CisKKyAgcCA9IHRjcF9vdXRwdXRfYWxsb2NfaGVhZGVyKHBjYiwgMCwgbGVuLCBzZWctPnRjcGhkci0+c2Vxbm8pOworICBpZihwID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgidGNwX3plcm9fd2luZG93X3Byb2JlOiBubyBtZW1vcnkgZm9yIHBidWZcbiIpKTsKKyAgICByZXR1cm47CisgIH0KKyAgdGNwaGRyID0gKHN0cnVjdCB0Y3BfaGRyICopcC0+cGF5bG9hZDsKKworICBpZiAoaXNfZmluKSB7CisgICAgLyogRklOIHNlZ21lbnQsIG5vIGRhdGEgKi8KKyAgICBUQ1BIX0ZMQUdTX1NFVCh0Y3BoZHIsIFRDUF9BQ0sgfCBUQ1BfRklOKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBEYXRhIHNlZ21lbnQsIGNvcHkgaW4gb25lIGJ5dGUgZnJvbSB0aGUgaGVhZCBvZiB0aGUgdW5hY2tlZCBxdWV1ZSAqLworICAgIHN0cnVjdCB0Y3BfaGRyICp0aGRyID0gKHN0cnVjdCB0Y3BfaGRyICopc2VnLT5wLT5wYXlsb2FkOworICAgIGNoYXIgKmQgPSAoKGNoYXIgKilwLT5wYXlsb2FkICsgVENQX0hMRU4pOworICAgIHBidWZfY29weV9wYXJ0aWFsKHNlZy0+cCwgZCwgMSwgVENQSF9IRFJMRU4odGhkcikgKiA0KTsKKyAgfQorCisjaWYgQ0hFQ0tTVU1fR0VOX1RDUAorICB0Y3BoZHItPmNoa3N1bSA9IGluZXRfY2hrc3VtX3BzZXVkbyhwLCAmcGNiLT5sb2NhbF9pcCwgJnBjYi0+cmVtb3RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUF9QUk9UT19UQ1AsIHAtPnRvdF9sZW4pOworI2VuZGlmCisgIFRDUF9TVEFUU19JTkModGNwLnhtaXQpOworCisgIC8qIFNlbmQgb3V0cHV0IHRvIElQICovCisjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UCisgIGlwX291dHB1dF9oaW50ZWQocCwgJnBjYi0+bG9jYWxfaXAsICZwY2ItPnJlbW90ZV9pcCwgcGNiLT50dGwsIDAsIElQX1BST1RPX1RDUCwKKyAgICAmKHBjYi0+YWRkcl9oaW50KSk7CisjZWxzZSAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQqLworICBpcF9vdXRwdXQocCwgJnBjYi0+bG9jYWxfaXAsICZwY2ItPnJlbW90ZV9pcCwgcGNiLT50dGwsIDAsIElQX1BST1RPX1RDUCk7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UKi8KKworICBwYnVmX2ZyZWUocCk7CisKKyAgTFdJUF9ERUJVR0YoVENQX0RFQlVHLCAoInRjcF96ZXJvX3dpbmRvd19wcm9iZTogc2Vxbm8gJSJVMzJfRgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFja25vICUiVTMyX0YiLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGNiLT5zbmRfbnh0IC0gMSwgcGNiLT5yY3Zfbnh0KSk7Cit9CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvY29yZS90aW1lcnMuYyBiL2NvcmUvbHdpcC9zcmMvY29yZS90aW1lcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTk0ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9jb3JlL3RpbWVycy5jCkBAIC0wLDAgKzEsNDgzIEBACisvKioKKyAqIEBmaWxlCisgKiBTdGFjay1pbnRlcm5hbCB0aW1lcnMgaW1wbGVtZW50YXRpb24uCisgKiBUaGlzIGZpbGUgaW5jbHVkZXMgdGltZXIgY2FsbGJhY2tzIGZvciBzdGFjay1pbnRlcm5hbCB0aW1lcnMgYXMgd2VsbCBhcworICogZnVuY3Rpb25zIHRvIHNldCB1cCBvciBzdG9wIHRpbWVycyBhbmQgY2hlY2sgZm9yIGV4cGlyZWQgdGltZXJzLgorICoKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKgorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqICAgICAgICAgU2ltb24gR29sZHNjaG1pZHQKKyAqCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpbmNsdWRlICJsd2lwL3RpbWVycy5oIgorI2luY2x1ZGUgImx3aXAvdGNwX2ltcGwuaCIKKworI2lmIExXSVBfVElNRVJTCisKKyNpbmNsdWRlICJsd2lwL2RlZi5oIgorI2luY2x1ZGUgImx3aXAvbWVtcC5oIgorI2luY2x1ZGUgImx3aXAvdGNwaXAuaCIKKworI2luY2x1ZGUgImx3aXAvaXBfZnJhZy5oIgorI2luY2x1ZGUgIm5ldGlmL2V0aGFycC5oIgorI2luY2x1ZGUgImx3aXAvZGhjcC5oIgorI2luY2x1ZGUgImx3aXAvYXV0b2lwLmgiCisjaW5jbHVkZSAibHdpcC9pZ21wLmgiCisjaW5jbHVkZSAibHdpcC9kbnMuaCIKKworCisvKiogVGhlIG9uZSBhbmQgb25seSB0aW1lb3V0IGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVvICpuZXh0X3RpbWVvdXQ7CisjaWYgTk9fU1lTCitzdGF0aWMgdTMyX3QgdGltZW91dHNfbGFzdF90aW1lOworI2VuZGlmIC8qIE5PX1NZUyAqLworCisjaWYgTFdJUF9UQ1AKKy8qKiBnbG9iYWwgdmFyaWFibGUgdGhhdCBzaG93cyBpZiB0aGUgdGNwIHRpbWVyIGlzIGN1cnJlbnRseSBzY2hlZHVsZWQgb3Igbm90ICovCitzdGF0aWMgaW50IHRjcGlwX3RjcF90aW1lcl9hY3RpdmU7CisKKy8qKgorICogVGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBjYWxscyB0Y3BfdG1yKCkgYW5kIHJlc2NoZWR1bGVzIGl0c2VsZi4KKyAqCisgKiBAcGFyYW0gYXJnIHVudXNlZCBhcmd1bWVudAorICovCitzdGF0aWMgdm9pZAordGNwaXBfdGNwX3RpbWVyKHZvaWQgKmFyZykKK3sKKyAgTFdJUF9VTlVTRURfQVJHKGFyZyk7CisKKyAgLyogY2FsbCBUQ1AgdGltZXIgaGFuZGxlciAqLworICB0Y3BfdG1yKCk7CisgIC8qIHRpbWVyIHN0aWxsIG5lZWRlZD8gKi8KKyAgaWYgKHRjcF9hY3RpdmVfcGNicyB8fCB0Y3BfdHdfcGNicykgeworICAgIC8qIHJlc3RhcnQgdGltZXIgKi8KKyAgICBzeXNfdGltZW91dChUQ1BfVE1SX0lOVEVSVkFMLCB0Y3BpcF90Y3BfdGltZXIsIE5VTEwpOworICB9IGVsc2UgeworICAgIC8qIGRpc2FibGUgdGltZXIgKi8KKyAgICB0Y3BpcF90Y3BfdGltZXJfYWN0aXZlID0gMDsKKyAgfQorfQorCisvKioKKyAqIENhbGxlZCBmcm9tIFRDUF9SRUcgd2hlbiByZWdpc3RlcmluZyBhIG5ldyBQQ0I6CisgKiB0aGUgcmVhc29uIGlzIHRvIGhhdmUgdGhlIFRDUCB0aW1lciBvbmx5IHJ1bm5pbmcgd2hlbgorICogdGhlcmUgYXJlIGFjdGl2ZSAob3IgdGltZS13YWl0KSBQQ0JzLgorICovCit2b2lkCit0Y3BfdGltZXJfbmVlZGVkKHZvaWQpCit7CisgIC8qIHRpbWVyIGlzIG9mZiBidXQgbmVlZGVkIGFnYWluPyAqLworICBpZiAoIXRjcGlwX3RjcF90aW1lcl9hY3RpdmUgJiYgKHRjcF9hY3RpdmVfcGNicyB8fCB0Y3BfdHdfcGNicykpIHsKKyAgICAvKiBlbmFibGUgYW5kIHN0YXJ0IHRpbWVyICovCisgICAgdGNwaXBfdGNwX3RpbWVyX2FjdGl2ZSA9IDE7CisgICAgc3lzX3RpbWVvdXQoVENQX1RNUl9JTlRFUlZBTCwgdGNwaXBfdGNwX3RpbWVyLCBOVUxMKTsKKyAgfQorfQorI2VuZGlmIC8qIExXSVBfVENQICovCisKKyNpZiBJUF9SRUFTU0VNQkxZCisvKioKKyAqIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FsbHMgaXBfcmVhc3NfdG1yKCkgYW5kIHJlc2NoZWR1bGVzIGl0c2VsZi4KKyAqCisgKiBAcGFyYW0gYXJnIHVudXNlZCBhcmd1bWVudAorICovCitzdGF0aWMgdm9pZAoraXBfcmVhc3NfdGltZXIodm9pZCAqYXJnKQoreworICBMV0lQX1VOVVNFRF9BUkcoYXJnKTsKKyAgTFdJUF9ERUJVR0YoVElNRVJTX0RFQlVHLCAoInRjcGlwOiBpcF9yZWFzc190bXIoKVxuIikpOworICBpcF9yZWFzc190bXIoKTsKKyAgc3lzX3RpbWVvdXQoSVBfVE1SX0lOVEVSVkFMLCBpcF9yZWFzc190aW1lciwgTlVMTCk7Cit9CisjZW5kaWYgLyogSVBfUkVBU1NFTUJMWSAqLworCisjaWYgTFdJUF9BUlAKKy8qKgorICogVGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBjYWxscyBldGhhcnBfdG1yKCkgYW5kIHJlc2NoZWR1bGVzIGl0c2VsZi4KKyAqCisgKiBAcGFyYW0gYXJnIHVudXNlZCBhcmd1bWVudAorICovCitzdGF0aWMgdm9pZAorYXJwX3RpbWVyKHZvaWQgKmFyZykKK3sKKyAgTFdJUF9VTlVTRURfQVJHKGFyZyk7CisgIExXSVBfREVCVUdGKFRJTUVSU19ERUJVRywgKCJ0Y3BpcDogZXRoYXJwX3RtcigpXG4iKSk7CisgIGV0aGFycF90bXIoKTsKKyAgdW5kaWFycF90bXIoKTsKKyAgc3lzX3RpbWVvdXQoQVJQX1RNUl9JTlRFUlZBTCwgYXJwX3RpbWVyLCBOVUxMKTsKK30KKyNlbmRpZiAvKiBMV0lQX0FSUCAqLworCisjaWYgTFdJUF9ESENQCisvKioKKyAqIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FsbHMgZGhjcF9jb2Fyc2VfdG1yKCkgYW5kIHJlc2NoZWR1bGVzIGl0c2VsZi4KKyAqCisgKiBAcGFyYW0gYXJnIHVudXNlZCBhcmd1bWVudAorICovCitzdGF0aWMgdm9pZAorZGhjcF90aW1lcl9jb2Fyc2Uodm9pZCAqYXJnKQoreworICBMV0lQX1VOVVNFRF9BUkcoYXJnKTsKKyAgTFdJUF9ERUJVR0YoVElNRVJTX0RFQlVHLCAoInRjcGlwOiBkaGNwX2NvYXJzZV90bXIoKVxuIikpOworICBkaGNwX2NvYXJzZV90bXIoKTsKKyAgc3lzX3RpbWVvdXQoREhDUF9DT0FSU0VfVElNRVJfTVNFQ1MsIGRoY3BfdGltZXJfY29hcnNlLCBOVUxMKTsKK30KKworLyoqCisgKiBUaW1lciBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGNhbGxzIGRoY3BfZmluZV90bXIoKSBhbmQgcmVzY2hlZHVsZXMgaXRzZWxmLgorICoKKyAqIEBwYXJhbSBhcmcgdW51c2VkIGFyZ3VtZW50CisgKi8KK3N0YXRpYyB2b2lkCitkaGNwX3RpbWVyX2ZpbmUodm9pZCAqYXJnKQoreworICBMV0lQX1VOVVNFRF9BUkcoYXJnKTsKKyAgTFdJUF9ERUJVR0YoVElNRVJTX0RFQlVHLCAoInRjcGlwOiBkaGNwX2ZpbmVfdG1yKClcbiIpKTsKKyAgZGhjcF9maW5lX3RtcigpOworICBzeXNfdGltZW91dChESENQX0ZJTkVfVElNRVJfTVNFQ1MsIGRoY3BfdGltZXJfZmluZSwgTlVMTCk7Cit9CisjZW5kaWYgLyogTFdJUF9ESENQICovCisKKyNpZiBMV0lQX0FVVE9JUAorLyoqCisgKiBUaW1lciBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGNhbGxzIGF1dG9pcF90bXIoKSBhbmQgcmVzY2hlZHVsZXMgaXRzZWxmLgorICoKKyAqIEBwYXJhbSBhcmcgdW51c2VkIGFyZ3VtZW50CisgKi8KK3N0YXRpYyB2b2lkCithdXRvaXBfdGltZXIodm9pZCAqYXJnKQoreworICBMV0lQX1VOVVNFRF9BUkcoYXJnKTsKKyAgTFdJUF9ERUJVR0YoVElNRVJTX0RFQlVHLCAoInRjcGlwOiBhdXRvaXBfdG1yKClcbiIpKTsKKyAgYXV0b2lwX3RtcigpOworICBzeXNfdGltZW91dChBVVRPSVBfVE1SX0lOVEVSVkFMLCBhdXRvaXBfdGltZXIsIE5VTEwpOworfQorI2VuZGlmIC8qIExXSVBfQVVUT0lQICovCisKKyNpZiBMV0lQX0lHTVAKKy8qKgorICogVGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBjYWxscyBpZ21wX3RtcigpIGFuZCByZXNjaGVkdWxlcyBpdHNlbGYuCisgKgorICogQHBhcmFtIGFyZyB1bnVzZWQgYXJndW1lbnQKKyAqLworc3RhdGljIHZvaWQKK2lnbXBfdGltZXIodm9pZCAqYXJnKQoreworICBMV0lQX1VOVVNFRF9BUkcoYXJnKTsKKyAgTFdJUF9ERUJVR0YoVElNRVJTX0RFQlVHLCAoInRjcGlwOiBpZ21wX3RtcigpXG4iKSk7CisgIGlnbXBfdG1yKCk7CisgIHN5c190aW1lb3V0KElHTVBfVE1SX0lOVEVSVkFMLCBpZ21wX3RpbWVyLCBOVUxMKTsKK30KKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKworI2lmIExXSVBfRE5TCisvKioKKyAqIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FsbHMgZG5zX3RtcigpIGFuZCByZXNjaGVkdWxlcyBpdHNlbGYuCisgKgorICogQHBhcmFtIGFyZyB1bnVzZWQgYXJndW1lbnQKKyAqLworc3RhdGljIHZvaWQKK2Ruc190aW1lcih2b2lkICphcmcpCit7CisgIExXSVBfVU5VU0VEX0FSRyhhcmcpOworICBMV0lQX0RFQlVHRihUSU1FUlNfREVCVUcsICgidGNwaXA6IGRuc190bXIoKVxuIikpOworICBkbnNfdG1yKCk7CisgIHN5c190aW1lb3V0KEROU19UTVJfSU5URVJWQUwsIGRuc190aW1lciwgTlVMTCk7Cit9CisjZW5kaWYgLyogTFdJUF9ETlMgKi8KKworLyoqIEluaXRpYWxpemUgdGhpcyBtb2R1bGUgKi8KK3ZvaWQgc3lzX3RpbWVvdXRzX2luaXQodm9pZCkKK3sKKyNpZiBJUF9SRUFTU0VNQkxZCisgIHN5c190aW1lb3V0KElQX1RNUl9JTlRFUlZBTCwgaXBfcmVhc3NfdGltZXIsIE5VTEwpOworI2VuZGlmIC8qIElQX1JFQVNTRU1CTFkgKi8KKyNpZiBMV0lQX0FSUAorICBzeXNfdGltZW91dChBUlBfVE1SX0lOVEVSVkFMLCBhcnBfdGltZXIsIE5VTEwpOworI2VuZGlmIC8qIExXSVBfQVJQICovCisjaWYgTFdJUF9ESENQCisgIHN5c190aW1lb3V0KERIQ1BfQ09BUlNFX1RJTUVSX01TRUNTLCBkaGNwX3RpbWVyX2NvYXJzZSwgTlVMTCk7CisgIHN5c190aW1lb3V0KERIQ1BfRklORV9USU1FUl9NU0VDUywgZGhjcF90aW1lcl9maW5lLCBOVUxMKTsKKyNlbmRpZiAvKiBMV0lQX0RIQ1AgKi8KKyNpZiBMV0lQX0FVVE9JUAorICBzeXNfdGltZW91dChBVVRPSVBfVE1SX0lOVEVSVkFMLCBhdXRvaXBfdGltZXIsIE5VTEwpOworI2VuZGlmIC8qIExXSVBfQVVUT0lQICovCisjaWYgTFdJUF9JR01QCisgIHN5c190aW1lb3V0KElHTVBfVE1SX0lOVEVSVkFMLCBpZ21wX3RpbWVyLCBOVUxMKTsKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKyNpZiBMV0lQX0ROUworICBzeXNfdGltZW91dChETlNfVE1SX0lOVEVSVkFMLCBkbnNfdGltZXIsIE5VTEwpOworI2VuZGlmIC8qIExXSVBfRE5TICovCisKKyNpZiBOT19TWVMKKyAgLyogSW5pdGlhbGlzZSB0aW1lc3RhbXAgZm9yIHN5c19jaGVja190aW1lb3V0cyAqLworICB0aW1lb3V0c19sYXN0X3RpbWUgPSBzeXNfbm93KCk7CisjZW5kaWYKK30KKworLyoqCisgKiBDcmVhdGUgYSBvbmUtc2hvdCB0aW1lciAoYWthIHRpbWVvdXQpLiBUaW1lb3V0cyBhcmUgcHJvY2Vzc2VkIGluIHRoZQorICogZm9sbG93aW5nIGNhc2VzOgorICogLSB3aGlsZSB3YWl0aW5nIGZvciBhIG1lc3NhZ2UgdXNpbmcgc3lzX3RpbWVvdXRzX21ib3hfZmV0Y2goKQorICogLSBieSBjYWxsaW5nIHN5c19jaGVja190aW1lb3V0cygpIChOT19TWVM9PTEgb25seSkKKyAqCisgKiBAcGFyYW0gbXNlY3MgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhhdCB0aGUgdGltZXIgc2hvdWxkIGV4cGlyZQorICogQHBhcmFtIGhhbmRsZXIgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIG1zZWNzIGhhdmUgZWxhcHNlZAorICogQHBhcmFtIGFyZyBhcmd1bWVudCB0byBwYXNzIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICovCisjaWYgTFdJUF9ERUJVR19USU1FUk5BTUVTCit2b2lkCitzeXNfdGltZW91dF9kZWJ1Zyh1MzJfdCBtc2Vjcywgc3lzX3RpbWVvdXRfaGFuZGxlciBoYW5kbGVyLCB2b2lkICphcmcsIGNvbnN0IGNoYXIqIGhhbmRsZXJfbmFtZSkKKyNlbHNlIC8qIExXSVBfREVCVUdfVElNRVJOQU1FUyAqLwordm9pZAorc3lzX3RpbWVvdXQodTMyX3QgbXNlY3MsIHN5c190aW1lb3V0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqYXJnKQorI2VuZGlmIC8qIExXSVBfREVCVUdfVElNRVJOQU1FUyAqLworeworICBzdHJ1Y3Qgc3lzX3RpbWVvICp0aW1lb3V0LCAqdDsKKworICB0aW1lb3V0ID0gKHN0cnVjdCBzeXNfdGltZW8gKiltZW1wX21hbGxvYyhNRU1QX1NZU19USU1FT1VUKTsKKyAgaWYgKHRpbWVvdXQgPT0gTlVMTCkgeworICAgIExXSVBfQVNTRVJUKCJzeXNfdGltZW91dDogdGltZW91dCAhPSBOVUxMLCBwb29sIE1FTVBfU1lTX1RJTUVPVVQgaXMgZW1wdHkiLCB0aW1lb3V0ICE9IE5VTEwpOworICAgIHJldHVybjsKKyAgfQorICB0aW1lb3V0LT5uZXh0ID0gTlVMTDsKKyAgdGltZW91dC0+aCA9IGhhbmRsZXI7CisgIHRpbWVvdXQtPmFyZyA9IGFyZzsKKyAgdGltZW91dC0+dGltZSA9IG1zZWNzOworI2lmIExXSVBfREVCVUdfVElNRVJOQU1FUworICB0aW1lb3V0LT5oYW5kbGVyX25hbWUgPSBoYW5kbGVyX25hbWU7CisgIExXSVBfREVCVUdGKFRJTUVSU19ERUJVRywgKCJzeXNfdGltZW91dDogJXAgbXNlY3M9JSJVMzJfRiIgaGFuZGxlcj0lcyBhcmc9JXBcbiIsCisgICAgKHZvaWQgKil0aW1lb3V0LCBtc2VjcywgaGFuZGxlcl9uYW1lLCAodm9pZCAqKWFyZykpOworI2VuZGlmIC8qIExXSVBfREVCVUdfVElNRVJOQU1FUyAqLworCisgIGlmIChuZXh0X3RpbWVvdXQgPT0gTlVMTCkgeworICAgIG5leHRfdGltZW91dCA9IHRpbWVvdXQ7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG5leHRfdGltZW91dC0+dGltZSA+IG1zZWNzKSB7CisgICAgbmV4dF90aW1lb3V0LT50aW1lIC09IG1zZWNzOworICAgIHRpbWVvdXQtPm5leHQgPSBuZXh0X3RpbWVvdXQ7CisgICAgbmV4dF90aW1lb3V0ID0gdGltZW91dDsKKyAgfSBlbHNlIHsKKyAgICBmb3IodCA9IG5leHRfdGltZW91dDsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkgeworICAgICAgdGltZW91dC0+dGltZSAtPSB0LT50aW1lOworICAgICAgaWYgKHQtPm5leHQgPT0gTlVMTCB8fCB0LT5uZXh0LT50aW1lID4gdGltZW91dC0+dGltZSkgeworICAgICAgICBpZiAodC0+bmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgdC0+bmV4dC0+dGltZSAtPSB0aW1lb3V0LT50aW1lOworICAgICAgICB9CisgICAgICAgIHRpbWVvdXQtPm5leHQgPSB0LT5uZXh0OworICAgICAgICB0LT5uZXh0ID0gdGltZW91dDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICogR28gdGhyb3VnaCB0aW1lb3V0IGxpc3QgKGZvciB0aGlzIHRhc2sgb25seSkgYW5kIHJlbW92ZSB0aGUgZmlyc3QgbWF0Y2hpbmcKKyAqIGVudHJ5LCBldmVuIHRob3VnaCB0aGUgdGltZW91dCBoYXMgbm90IHRyaWdnZXJlZCB5ZXQuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIGFzIGV4cGVjdGVkIGlmIHRoZXJlIGlzIG9ubHkgb25lIHRpbWVvdXQKKyAqIGNhbGxpbmcgJ2hhbmRsZXInIGluIHRoZSBsaXN0IG9mIHRpbWVvdXRzLgorICoKKyAqIEBwYXJhbSBoYW5kbGVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd291bGQgYmUgY2FsbGVkIGJ5IHRoZSB0aW1lb3V0CisgKiBAcGFyYW0gYXJnIGNhbGxiYWNrIGFyZ3VtZW50IHRoYXQgd291bGQgYmUgcGFzc2VkIHRvIGhhbmRsZXIKKyovCit2b2lkCitzeXNfdW50aW1lb3V0KHN5c190aW1lb3V0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqYXJnKQoreworICBzdHJ1Y3Qgc3lzX3RpbWVvICpwcmV2X3QsICp0OworCisgIGlmIChuZXh0X3RpbWVvdXQgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZvciAodCA9IG5leHRfdGltZW91dCwgcHJldl90ID0gTlVMTDsgdCAhPSBOVUxMOyBwcmV2X3QgPSB0LCB0ID0gdC0+bmV4dCkgeworICAgIGlmICgodC0+aCA9PSBoYW5kbGVyKSAmJiAodC0+YXJnID09IGFyZykpIHsKKyAgICAgIC8qIFdlIGhhdmUgYSBtYXRjaCAqLworICAgICAgLyogVW5saW5rIGZyb20gcHJldmlvdXMgaW4gbGlzdCAqLworICAgICAgaWYgKHByZXZfdCA9PSBOVUxMKSB7CisgICAgICAgIG5leHRfdGltZW91dCA9IHQtPm5leHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmV2X3QtPm5leHQgPSB0LT5uZXh0OworICAgICAgfQorICAgICAgLyogSWYgbm90IHRoZSBsYXN0IG9uZSwgYWRkIHRpbWUgb2YgdGhpcyBvbmUgYmFjayB0byBuZXh0ICovCisgICAgICBpZiAodC0+bmV4dCAhPSBOVUxMKSB7CisgICAgICAgIHQtPm5leHQtPnRpbWUgKz0gdC0+dGltZTsKKyAgICAgIH0KKyAgICAgIG1lbXBfZnJlZShNRU1QX1NZU19USU1FT1VULCB0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgcmV0dXJuOworfQorCisjaWYgTk9fU1lTCisKKy8qKiBIYW5kbGUgdGltZW91dHMgZm9yIE5PX1NZUz09MSAoaS5lLiB3aXRob3V0IHVzaW5nCisgKiB0Y3BpcF90aHJlYWQvc3lzX3RpbWVvdXRzX21ib3hfZmV0Y2goKS4gVXNlcyBzeXNfbm93KCkgdG8gY2FsbCB0aW1lb3V0CisgKiBoYW5kbGVyIGZ1bmN0aW9ucyB3aGVuIHRpbWVvdXRzIGV4cGlyZS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkgZnJvbSB5b3VyIG1haW4gbG9vcC4KKyAqLwordm9pZAorc3lzX2NoZWNrX3RpbWVvdXRzKHZvaWQpCit7CisgIHN0cnVjdCBzeXNfdGltZW8gKnRtcHRpbWVvdXQ7CisgIHUzMl90IGRpZmY7CisgIHN5c190aW1lb3V0X2hhbmRsZXIgaGFuZGxlcjsKKyAgdm9pZCAqYXJnOworICBpbnQgaGFkX29uZTsKKyAgdTMyX3Qgbm93OworCisgIG5vdyA9IHN5c19ub3coKTsKKyAgaWYgKG5leHRfdGltZW91dCkgeworICAgIC8qIHRoaXMgY2FyZXMgZm9yIHdyYXBhcm91bmRzICovCisgICAgZGlmZiA9IExXSVBfVTMyX0RJRkYobm93LCB0aW1lb3V0c19sYXN0X3RpbWUpOworICAgIGRvCisgICAgeworICAgICAgaGFkX29uZSA9IDA7CisgICAgICB0bXB0aW1lb3V0ID0gbmV4dF90aW1lb3V0OworICAgICAgaWYgKHRtcHRpbWVvdXQtPnRpbWUgPD0gZGlmZikgeworICAgICAgICAvKiB0aW1lb3V0IGhhcyBleHBpcmVkICovCisgICAgICAgIGhhZF9vbmUgPSAxOworICAgICAgICB0aW1lb3V0c19sYXN0X3RpbWUgPSBub3c7CisgICAgICAgIGRpZmYgLT0gdG1wdGltZW91dC0+dGltZTsKKyAgICAgICAgbmV4dF90aW1lb3V0ID0gdG1wdGltZW91dC0+bmV4dDsKKyAgICAgICAgaGFuZGxlciA9IHRtcHRpbWVvdXQtPmg7CisgICAgICAgIGFyZyA9IHRtcHRpbWVvdXQtPmFyZzsKKyNpZiBMV0lQX0RFQlVHX1RJTUVSTkFNRVMKKyAgICAgICAgaWYgKGhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICAgIExXSVBfREVCVUdGKFRJTUVSU19ERUJVRywgKCJzY3QgY2FsbGluZyBoPSVzIGFyZz0lcFxuIiwKKyAgICAgICAgICAgIHRtcHRpbWVvdXQtPmhhbmRsZXJfbmFtZSwgYXJnKSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBMV0lQX0RFQlVHX1RJTUVSTkFNRVMgKi8KKyAgICAgICAgbWVtcF9mcmVlKE1FTVBfU1lTX1RJTUVPVVQsIHRtcHRpbWVvdXQpOworICAgICAgICBpZiAoaGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgaGFuZGxlcihhcmcpOworICAgICAgICB9CisgICAgICB9CisgICAgLyogcmVwZWF0IHVudGlsIGFsbCBleHBpcmVkIHRpbWVycyBoYXZlIGJlZW4gY2FsbGVkICovCisgICAgfXdoaWxlKGhhZF9vbmUpOworICB9Cit9CisKKy8qKiBTZXQgYmFjayB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGNhbGwgdG8gc3lzX2NoZWNrX3RpbWVvdXRzKCkKKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIHN5c19jaGVja190aW1lb3V0cygpIGhhc24ndCBiZWVuIGNhbGxlZCBmb3IgYSBsb25nCisgKiB0aW1lIChlLmcuIHdoaWxlIHNhdmluZyBlbmVyZ3kpIHRvIHByZXZlbnQgYWxsIHRpbWVyIGZ1bmN0aW9ucyBvZiB0aGF0CisgKiBwZXJpb2QgYmVpbmcgY2FsbGVkLgorICovCit2b2lkCitzeXNfcmVzdGFydF90aW1lb3V0cyh2b2lkKQoreworICB0aW1lb3V0c19sYXN0X3RpbWUgPSBzeXNfbm93KCk7Cit9CisKKyNlbHNlIC8qIE5PX1NZUyAqLworCisvKioKKyAqIFdhaXQgKGZvcmV2ZXIpIGZvciBhIG1lc3NhZ2UgdG8gYXJyaXZlIGluIGFuIG1ib3guCisgKiBXaGlsZSB3YWl0aW5nLCB0aW1lb3V0cyBhcmUgcHJvY2Vzc2VkLgorICoKKyAqIEBwYXJhbSBtYm94IHRoZSBtYm94IHRvIGZldGNoIHRoZSBtZXNzYWdlIGZyb20KKyAqIEBwYXJhbSBtc2cgdGhlIHBsYWNlIHRvIHN0b3JlIHRoZSBtZXNzYWdlCisgKi8KK3ZvaWQKK3N5c190aW1lb3V0c19tYm94X2ZldGNoKHN5c19tYm94X3QgKm1ib3gsIHZvaWQgKiptc2cpCit7CisgIHUzMl90IHRpbWVfbmVlZGVkOworICBzdHJ1Y3Qgc3lzX3RpbWVvICp0bXB0aW1lb3V0OworICBzeXNfdGltZW91dF9oYW5kbGVyIGhhbmRsZXI7CisgIHZvaWQgKmFyZzsKKworIGFnYWluOgorICBpZiAoIW5leHRfdGltZW91dCkgeworICAgIHRpbWVfbmVlZGVkID0gc3lzX2FyY2hfbWJveF9mZXRjaChtYm94LCBtc2csIDApOworICB9IGVsc2UgeworICAgIGlmIChuZXh0X3RpbWVvdXQtPnRpbWUgPiAwKSB7CisgICAgICB0aW1lX25lZWRlZCA9IHN5c19hcmNoX21ib3hfZmV0Y2gobWJveCwgbXNnLCBuZXh0X3RpbWVvdXQtPnRpbWUpOworICAgIH0gZWxzZSB7CisgICAgICB0aW1lX25lZWRlZCA9IFNZU19BUkNIX1RJTUVPVVQ7CisgICAgfQorCisgICAgaWYgKHRpbWVfbmVlZGVkID09IFNZU19BUkNIX1RJTUVPVVQpIHsKKyAgICAgIC8qIElmIHRpbWUgPT0gU1lTX0FSQ0hfVElNRU9VVCwgYSB0aW1lb3V0IG9jY3VyZWQgYmVmb3JlIGEgbWVzc2FnZQorICAgICAgICAgY291bGQgYmUgZmV0Y2hlZC4gV2Ugc2hvdWxkIG5vdyBjYWxsIHRoZSB0aW1lb3V0IGhhbmRsZXIgYW5kCisgICAgICAgICBkZWFsbG9jYXRlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgdGltZW91dC4gKi8KKyAgICAgIHRtcHRpbWVvdXQgPSBuZXh0X3RpbWVvdXQ7CisgICAgICBuZXh0X3RpbWVvdXQgPSB0bXB0aW1lb3V0LT5uZXh0OworICAgICAgaGFuZGxlciA9IHRtcHRpbWVvdXQtPmg7CisgICAgICBhcmcgPSB0bXB0aW1lb3V0LT5hcmc7CisjaWYgTFdJUF9ERUJVR19USU1FUk5BTUVTCisgICAgICBpZiAoaGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgIExXSVBfREVCVUdGKFRJTUVSU19ERUJVRywgKCJzdG1mIGNhbGxpbmcgaD0lcyBhcmc9JXBcbiIsCisgICAgICAgICAgdG1wdGltZW91dC0+aGFuZGxlcl9uYW1lLCBhcmcpKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBMV0lQX0RFQlVHX1RJTUVSTkFNRVMgKi8KKyAgICAgIG1lbXBfZnJlZShNRU1QX1NZU19USU1FT1VULCB0bXB0aW1lb3V0KTsKKyAgICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgLyogRm9yIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HLCBsb2NrIHRoZSBjb3JlIGJlZm9yZSBjYWxsaW5nIHRoZQorICAgICAgICAgICB0aW1lb3V0IGhhbmRsZXIgZnVuY3Rpb24uICovCisgICAgICAgIExPQ0tfVENQSVBfQ09SRSgpOworICAgICAgICBoYW5kbGVyKGFyZyk7CisgICAgICAgIFVOTE9DS19UQ1BJUF9DT1JFKCk7CisgICAgICB9CisgICAgICBMV0lQX1RDUElQX1RIUkVBRF9BTElWRSgpOworCisgICAgICAvKiBXZSB0cnkgYWdhaW4gdG8gZmV0Y2ggYSBtZXNzYWdlIGZyb20gdGhlIG1ib3guICovCisgICAgICBnb3RvIGFnYWluOworICAgIH0gZWxzZSB7CisgICAgICAvKiBJZiB0aW1lICE9IFNZU19BUkNIX1RJTUVPVVQsIGEgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgYmVmb3JlIHRoZSB0aW1lb3V0CisgICAgICAgICBvY2N1cmVkLiBUaGUgdGltZSB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIG51bWJlciBvZgorICAgICAgICAgbWlsbGlzZWNvbmRzIHdlIHdhaXRlZCBmb3IgdGhlIG1lc3NhZ2UuICovCisgICAgICBpZiAodGltZV9uZWVkZWQgPCBuZXh0X3RpbWVvdXQtPnRpbWUpIHsKKyAgICAgICAgbmV4dF90aW1lb3V0LT50aW1lIC09IHRpbWVfbmVlZGVkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dF90aW1lb3V0LT50aW1lID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworI2VuZGlmIC8qIE5PX1NZUyAqLworCisjZWxzZSAvKiBMV0lQX1RJTUVSUyAqLworLyogU2F0aXNmeSB0aGUgVENQIGNvZGUgd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbiAqLwordm9pZAordGNwX3RpbWVyX25lZWRlZCh2b2lkKQoreworfQorI2VuZGlmIC8qIExXSVBfVElNRVJTICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2NvcmUvdWRwLmMgYi9jb3JlL2x3aXAvc3JjL2NvcmUvdWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5NmJhMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvY29yZS91ZHAuYwpAQCAtMCwwICsxLDk2NiBAQAorLyoqCisgKiBAZmlsZQorICogVXNlciBEYXRhZ3JhbSBQcm90b2NvbCBtb2R1bGUKKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICoKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKworLyogdWRwLmMKKyAqCisgKiBUaGUgY29kZSBmb3IgdGhlIFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wgVURQICYgVURQTGl0ZSAoUkZDIDM4MjgpLgorICoKKyAqLworCisvKiBAdG9kbyBDaGVjayB0aGUgdXNlIG9mICcoc3RydWN0IHVkcF9wY2IpLmNoa3N1bV9sZW5fcngnIQorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9VRFAgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL3VkcC5oIgorI2luY2x1ZGUgImx3aXAvZGVmLmgiCisjaW5jbHVkZSAibHdpcC9tZW1wLmgiCisjaW5jbHVkZSAibHdpcC9pbmV0X2Noa3N1bS5oIgorI2luY2x1ZGUgImx3aXAvaXBfYWRkci5oIgorI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKyNpbmNsdWRlICJsd2lwL2ljbXAuaCIKKyNpbmNsdWRlICJsd2lwL3N0YXRzLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wLmgiCisjaW5jbHVkZSAiYXJjaC9wZXJmLmgiCisjaW5jbHVkZSAibHdpcC9kaGNwLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogVGhlIGxpc3Qgb2YgVURQIFBDQnMgKi8KKy8qIGV4cG9ydGVkIGluIHVkcC5oICh3YXMgc3RhdGljKSAqLworc3RydWN0IHVkcF9wY2IgKnVkcF9wY2JzOworCisvKioKKyAqIFByb2Nlc3MgYW4gaW5jb21pbmcgVURQIGRhdGFncmFtLgorICoKKyAqIEdpdmVuIGFuIGluY29taW5nIFVEUCBkYXRhZ3JhbSAoYXMgYSBjaGFpbiBvZiBwYnVmcykgdGhpcyBmdW5jdGlvbgorICogZmluZHMgYSBjb3JyZXNwb25kaW5nIFVEUCBQQ0IgYW5kIGhhbmRzIG92ZXIgdGhlIHBidWYgdG8gdGhlIHBjYnMKKyAqIHJlY3YgZnVuY3Rpb24uIElmIG5vIHBjYiBpcyBmb3VuZCBvciB0aGUgZGF0YWdyYW0gaXMgaW5jb3JyZWN0LCB0aGUKKyAqIHBidWYgaXMgZnJlZWQuCisgKgorICogQHBhcmFtIHAgcGJ1ZiB0byBiZSBkZW11bHRpcGxleGVkIHRvIGEgVURQIFBDQi4KKyAqIEBwYXJhbSBpbnAgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGRhdGFncmFtIHdhcyByZWNlaXZlZC4KKyAqCisgKi8KK3ZvaWQKK3VkcF9pbnB1dChzdHJ1Y3QgcGJ1ZiAqcCwgc3RydWN0IG5ldGlmICppbnApCit7CisgIHN0cnVjdCB1ZHBfaGRyICp1ZHBoZHI7CisgIHN0cnVjdCB1ZHBfcGNiICpwY2IsICpwcmV2OworICBzdHJ1Y3QgdWRwX3BjYiAqdW5jb25fcGNiOworICBzdHJ1Y3QgaXBfaGRyICppcGhkcjsKKyAgdTE2X3Qgc3JjLCBkZXN0OworICB1OF90IGxvY2FsX21hdGNoOworICB1OF90IGJyb2FkY2FzdDsKKworICBQRVJGX1NUQVJUOworCisgIFVEUF9TVEFUU19JTkModWRwLnJlY3YpOworCisgIGlwaGRyID0gKHN0cnVjdCBpcF9oZHIgKilwLT5wYXlsb2FkOworCisgIC8qIENoZWNrIG1pbmltdW0gbGVuZ3RoIChJUCBoZWFkZXIgKyBVRFAgaGVhZGVyKQorICAgKiBhbmQgbW92ZSBwYXlsb2FkIHBvaW50ZXIgdG8gVURQIGhlYWRlciAqLworICBpZiAocC0+dG90X2xlbiA8IChJUEhfSEwoaXBoZHIpICogNCArIFVEUF9ITEVOKSB8fCBwYnVmX2hlYWRlcihwLCAtKHMxNl90KShJUEhfSEwoaXBoZHIpICogNCkpKSB7CisgICAgLyogZHJvcCBzaG9ydCBwYWNrZXRzICovCisgICAgTFdJUF9ERUJVR0YoVURQX0RFQlVHLAorICAgICAgICAgICAgICAgICgidWRwX2lucHV0OiBzaG9ydCBVRFAgZGF0YWdyYW0gKCUiVTE2X0YiIGJ5dGVzKSBkaXNjYXJkZWRcbiIsIHAtPnRvdF9sZW4pKTsKKyAgICBVRFBfU1RBVFNfSU5DKHVkcC5sZW5lcnIpOworICAgIFVEUF9TVEFUU19JTkModWRwLmRyb3ApOworICAgIHNubXBfaW5jX3VkcGluZXJyb3JzKCk7CisgICAgcGJ1Zl9mcmVlKHApOworICAgIGdvdG8gZW5kOworICB9CisKKyAgdWRwaGRyID0gKHN0cnVjdCB1ZHBfaGRyICopcC0+cGF5bG9hZDsKKworICAvKiBpcyBicm9hZGNhc3QgcGFja2V0ID8gKi8KKyAgYnJvYWRjYXN0ID0gaXBfYWRkcl9pc2Jyb2FkY2FzdCgmY3VycmVudF9pcGhkcl9kZXN0LCBpbnApOworCisgIExXSVBfREVCVUdGKFVEUF9ERUJVRywgKCJ1ZHBfaW5wdXQ6IHJlY2VpdmVkIGRhdGFncmFtIG9mIGxlbmd0aCAlIlUxNl9GIlxuIiwgcC0+dG90X2xlbikpOworCisgIC8qIGNvbnZlcnQgc3JjIGFuZCBkZXN0IHBvcnRzIHRvIGhvc3QgYnl0ZSBvcmRlciAqLworICBzcmMgPSBudG9ocyh1ZHBoZHItPnNyYyk7CisgIGRlc3QgPSBudG9ocyh1ZHBoZHItPmRlc3QpOworCisgIHVkcF9kZWJ1Z19wcmludCh1ZHBoZHIpOworCisgIC8qIHByaW50IHRoZSBVRFAgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAqLworICBMV0lQX0RFQlVHRihVRFBfREVCVUcsCisgICAgICAgICAgICAgICgidWRwICglIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIiwgJSJVMTZfRiIpIDwtLSAiCisgICAgICAgICAgICAgICAiKCUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLCAlIlUxNl9GIilcbiIsCisgICAgICAgICAgICAgICBpcDRfYWRkcjFfMTYoJmlwaGRyLT5kZXN0KSwgaXA0X2FkZHIyXzE2KCZpcGhkci0+ZGVzdCksCisgICAgICAgICAgICAgICBpcDRfYWRkcjNfMTYoJmlwaGRyLT5kZXN0KSwgaXA0X2FkZHI0XzE2KCZpcGhkci0+ZGVzdCksIG50b2hzKHVkcGhkci0+ZGVzdCksCisgICAgICAgICAgICAgICBpcDRfYWRkcjFfMTYoJmlwaGRyLT5zcmMpLCBpcDRfYWRkcjJfMTYoJmlwaGRyLT5zcmMpLAorICAgICAgICAgICAgICAgaXA0X2FkZHIzXzE2KCZpcGhkci0+c3JjKSwgaXA0X2FkZHI0XzE2KCZpcGhkci0+c3JjKSwgbnRvaHModWRwaGRyLT5zcmMpKSk7CisKKyNpZiBMV0lQX0RIQ1AKKyAgcGNiID0gTlVMTDsKKyAgLyogd2hlbiBMV0lQX0RIQ1AgaXMgYWN0aXZlLCBwYWNrZXRzIHRvIERIQ1BfQ0xJRU5UX1BPUlQgbWF5IG9ubHkgYmUgcHJvY2Vzc2VkIGJ5CisgICAgIHRoZSBkaGNwIG1vZHVsZSwgbm8gb3RoZXIgVURQIHBjYiBtYXkgdXNlIHRoZSBsb2NhbCBVRFAgcG9ydCBESENQX0NMSUVOVF9QT1JUICovCisgIGlmIChkZXN0ID09IERIQ1BfQ0xJRU5UX1BPUlQpIHsKKyAgICAvKiBhbGwgcGFja2V0cyBmb3IgREhDUF9DTElFTlRfUE9SVCBub3QgY29taW5nIGZyb20gREhDUF9TRVJWRVJfUE9SVCBhcmUgZHJvcHBlZCEgKi8KKyAgICBpZiAoc3JjID09IERIQ1BfU0VSVkVSX1BPUlQpIHsKKyAgICAgIGlmICgoaW5wLT5kaGNwICE9IE5VTEwpICYmIChpbnAtPmRoY3AtPnBjYiAhPSBOVUxMKSkgeworICAgICAgICAvKiBhY2NlcHQgdGhlIHBhY2tlIGlmIAorICAgICAgICAgICAoLSBicm9hZGNhc3Qgb3IgZGlyZWN0ZWQgdG8gdXMpIC0+IERIQ1AgaXMgbGluay1sYXllci1hZGRyZXNzZWQsIGxvY2FsIGlwIGlzIGFsd2F5cyBBTlkhCisgICAgICAgICAgIC0gaW5wLT5kaGNwLT5wY2ItPnJlbW90ZSA9PSBBTlkgb3IgaXBoZHItPnNyYyAqLworICAgICAgICBpZiAoKGlwX2FkZHJfaXNhbnkoJmlucC0+ZGhjcC0+cGNiLT5yZW1vdGVfaXApIHx8CisgICAgICAgICAgIGlwX2FkZHJfY21wKCYoaW5wLT5kaGNwLT5wY2ItPnJlbW90ZV9pcCksICZjdXJyZW50X2lwaGRyX3NyYykpKSB7CisgICAgICAgICAgcGNiID0gaW5wLT5kaGNwLT5wY2I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZQorI2VuZGlmIC8qIExXSVBfREhDUCAqLworICB7CisgICAgcHJldiA9IE5VTEw7CisgICAgbG9jYWxfbWF0Y2ggPSAwOworICAgIHVuY29uX3BjYiA9IE5VTEw7CisgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBVRFAgcGNiIGxpc3QgZm9yIGEgbWF0Y2hpbmcgcGNiLgorICAgICAqICdQZXJmZWN0IG1hdGNoJyBwY2JzIChjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBwb3J0ICYgaXAgYWRkcmVzcykgYXJlCisgICAgICogcHJlZmVycmVkLiBJZiBubyBwZXJmZWN0IG1hdGNoIGlzIGZvdW5kLCB0aGUgZmlyc3QgdW5jb25uZWN0ZWQgcGNiIHRoYXQKKyAgICAgKiBtYXRjaGVzIHRoZSBsb2NhbCBwb3J0IGFuZCBpcCBhZGRyZXNzIGdldHMgdGhlIGRhdGFncmFtLiAqLworICAgIGZvciAocGNiID0gdWRwX3BjYnM7IHBjYiAhPSBOVUxMOyBwY2IgPSBwY2ItPm5leHQpIHsKKyAgICAgIGxvY2FsX21hdGNoID0gMDsKKyAgICAgIC8qIHByaW50IHRoZSBQQ0IgbG9jYWwgYW5kIHJlbW90ZSBhZGRyZXNzICovCisgICAgICBMV0lQX0RFQlVHRihVRFBfREVCVUcsCisgICAgICAgICAgICAgICAgICAoInBjYiAoJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIsICUiVTE2X0YiKSAtLS0gIgorICAgICAgICAgICAgICAgICAgICIoJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIsICUiVTE2X0YiKVxuIiwKKyAgICAgICAgICAgICAgICAgICBpcDRfYWRkcjFfMTYoJnBjYi0+bG9jYWxfaXApLCBpcDRfYWRkcjJfMTYoJnBjYi0+bG9jYWxfaXApLAorICAgICAgICAgICAgICAgICAgIGlwNF9hZGRyM18xNigmcGNiLT5sb2NhbF9pcCksIGlwNF9hZGRyNF8xNigmcGNiLT5sb2NhbF9pcCksIHBjYi0+bG9jYWxfcG9ydCwKKyAgICAgICAgICAgICAgICAgICBpcDRfYWRkcjFfMTYoJnBjYi0+cmVtb3RlX2lwKSwgaXA0X2FkZHIyXzE2KCZwY2ItPnJlbW90ZV9pcCksCisgICAgICAgICAgICAgICAgICAgaXA0X2FkZHIzXzE2KCZwY2ItPnJlbW90ZV9pcCksIGlwNF9hZGRyNF8xNigmcGNiLT5yZW1vdGVfaXApLCBwY2ItPnJlbW90ZV9wb3J0KSk7CisKKyAgICAgIC8qIGNvbXBhcmUgUENCIGxvY2FsIGFkZHIrcG9ydCB0byBVRFAgZGVzdGluYXRpb24gYWRkcitwb3J0ICovCisgICAgICBpZiAoKHBjYi0+bG9jYWxfcG9ydCA9PSBkZXN0KSAmJgorICAgICAgICAgICgoIWJyb2FkY2FzdCAmJiBpcF9hZGRyX2lzYW55KCZwY2ItPmxvY2FsX2lwKSkgfHwKKyAgICAgICAgICAgaXBfYWRkcl9jbXAoJihwY2ItPmxvY2FsX2lwKSwgJmN1cnJlbnRfaXBoZHJfZGVzdCkgfHwKKyNpZiBMV0lQX0lHTVAKKyAgICAgICAgICAgaXBfYWRkcl9pc211bHRpY2FzdCgmY3VycmVudF9pcGhkcl9kZXN0KSB8fAorI2VuZGlmIC8qIExXSVBfSUdNUCAqLworI2lmIElQX1NPRl9CUk9BRENBU1RfUkVDVgorICAgICAgICAgICAoYnJvYWRjYXN0ICYmIChwY2ItPnNvX29wdGlvbnMgJiBTT0ZfQlJPQURDQVNUKSkpKSB7CisjZWxzZSAgLyogSVBfU09GX0JST0FEQ0FTVF9SRUNWICovCisgICAgICAgICAgIChicm9hZGNhc3QpKSkgeworI2VuZGlmIC8qIElQX1NPRl9CUk9BRENBU1RfUkVDViAqLworICAgICAgICBsb2NhbF9tYXRjaCA9IDE7CisgICAgICAgIGlmICgodW5jb25fcGNiID09IE5VTEwpICYmIAorICAgICAgICAgICAgKChwY2ItPmZsYWdzICYgVURQX0ZMQUdTX0NPTk5FQ1RFRCkgPT0gMCkpIHsKKyAgICAgICAgICAvKiB0aGUgZmlyc3QgdW5jb25uZWN0ZWQgbWF0Y2hpbmcgUENCICovCisgICAgICAgICAgdW5jb25fcGNiID0gcGNiOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBjb21wYXJlIFBDQiByZW1vdGUgYWRkcitwb3J0IHRvIFVEUCBzb3VyY2UgYWRkcitwb3J0ICovCisgICAgICBpZiAoKGxvY2FsX21hdGNoICE9IDApICYmCisgICAgICAgICAgKHBjYi0+cmVtb3RlX3BvcnQgPT0gc3JjKSAmJgorICAgICAgICAgIChpcF9hZGRyX2lzYW55KCZwY2ItPnJlbW90ZV9pcCkgfHwKKyAgICAgICAgICAgaXBfYWRkcl9jbXAoJihwY2ItPnJlbW90ZV9pcCksICZjdXJyZW50X2lwaGRyX3NyYykpKSB7CisgICAgICAgIC8qIHRoZSBmaXJzdCBmdWxseSBtYXRjaGluZyBQQ0IgKi8KKyAgICAgICAgaWYgKHByZXYgIT0gTlVMTCkgeworICAgICAgICAgIC8qIG1vdmUgdGhlIHBjYiB0byB0aGUgZnJvbnQgb2YgdWRwX3BjYnMgc28gdGhhdCBpcworICAgICAgICAgICAgIGZvdW5kIGZhc3RlciBuZXh0IHRpbWUgKi8KKyAgICAgICAgICBwcmV2LT5uZXh0ID0gcGNiLT5uZXh0OworICAgICAgICAgIHBjYi0+bmV4dCA9IHVkcF9wY2JzOworICAgICAgICAgIHVkcF9wY2JzID0gcGNiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFVEUF9TVEFUU19JTkModWRwLmNhY2hlaGl0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHByZXYgPSBwY2I7CisgICAgfQorICAgIC8qIG5vIGZ1bGx5IG1hdGNoaW5nIHBjYiBmb3VuZD8gdGhlbiBsb29rIGZvciBhbiB1bmNvbm5lY3RlZCBwY2IgKi8KKyAgICBpZiAocGNiID09IE5VTEwpIHsKKyAgICAgIHBjYiA9IHVuY29uX3BjYjsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBjaGVja3N1bSBpZiB0aGlzIGlzIGEgbWF0Y2ggb3IgaWYgaXQgd2FzIGRpcmVjdGVkIGF0IHVzLiAqLworICBpZiAocGNiICE9IE5VTEwgfHwgaXBfYWRkcl9jbXAoJmlucC0+aXBfYWRkciwgJmN1cnJlbnRfaXBoZHJfZGVzdCkpIHsKKyAgICBMV0lQX0RFQlVHRihVRFBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJ1ZHBfaW5wdXQ6IGNhbGN1bGF0aW5nIGNoZWNrc3VtXG4iKSk7CisjaWYgTFdJUF9VRFBMSVRFCisgICAgaWYgKElQSF9QUk9UTyhpcGhkcikgPT0gSVBfUFJPVE9fVURQTElURSkgeworICAgICAgLyogRG8gdGhlIFVEUCBMaXRlIGNoZWNrc3VtICovCisjaWYgQ0hFQ0tTVU1fQ0hFQ0tfVURQCisgICAgICB1MTZfdCBjaGtsZW4gPSBudG9ocyh1ZHBoZHItPmxlbik7CisgICAgICBpZiAoY2hrbGVuIDwgc2l6ZW9mKHN0cnVjdCB1ZHBfaGRyKSkgeworICAgICAgICBpZiAoY2hrbGVuID09IDApIHsKKyAgICAgICAgICAvKiBGb3IgVURQLUxpdGUsIGNoZWNrc3VtIGxlbmd0aCBvZiAwIG1lYW5zIGNoZWNrc3VtCisgICAgICAgICAgICAgb3ZlciB0aGUgY29tcGxldGUgcGFja2V0IChTZWUgUkZDIDM4MjggY2hhcC4gMy4xKSAqLworICAgICAgICAgIGNoa2xlbiA9IHAtPnRvdF9sZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogQXQgbGVhc3QgdGhlIFVEUC1MaXRlIGhlYWRlciBtdXN0IGJlIGNvdmVyZWQgYnkgdGhlCisgICAgICAgICAgICAgY2hlY2tzdW0hIChBZ2Fpbiwgc2VlIFJGQyAzODI4IGNoYXAuIDMuMSkgKi8KKyAgICAgICAgICBVRFBfU1RBVFNfSU5DKHVkcC5jaGtlcnIpOworICAgICAgICAgIFVEUF9TVEFUU19JTkModWRwLmRyb3ApOworICAgICAgICAgIHNubXBfaW5jX3VkcGluZXJyb3JzKCk7CisgICAgICAgICAgcGJ1Zl9mcmVlKHApOworICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaW5ldF9jaGtzdW1fcHNldWRvX3BhcnRpYWwocCwgJmN1cnJlbnRfaXBoZHJfc3JjLCAmY3VycmVudF9pcGhkcl9kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUF9QUk9UT19VRFBMSVRFLCBwLT50b3RfbGVuLCBjaGtsZW4pICE9IDApIHsKKyAgICAgICBMV0lQX0RFQlVHRihVRFBfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgICAgICAgICAgICAgICgidWRwX2lucHV0OiBVRFAgTGl0ZSBkYXRhZ3JhbSBkaXNjYXJkZWQgZHVlIHRvIGZhaWxpbmcgY2hlY2tzdW1cbiIpKTsKKyAgICAgICAgVURQX1NUQVRTX0lOQyh1ZHAuY2hrZXJyKTsKKyAgICAgICAgVURQX1NUQVRTX0lOQyh1ZHAuZHJvcCk7CisgICAgICAgIHNubXBfaW5jX3VkcGluZXJyb3JzKCk7CisgICAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICB9CisjZW5kaWYgLyogQ0hFQ0tTVU1fQ0hFQ0tfVURQICovCisgICAgfSBlbHNlCisjZW5kaWYgLyogTFdJUF9VRFBMSVRFICovCisgICAgeworI2lmIENIRUNLU1VNX0NIRUNLX1VEUAorICAgICAgaWYgKHVkcGhkci0+Y2hrc3VtICE9IDApIHsKKyAgICAgICAgaWYgKGluZXRfY2hrc3VtX3BzZXVkbyhwLCBpcF9jdXJyZW50X3NyY19hZGRyKCksIGlwX2N1cnJlbnRfZGVzdF9hZGRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBfUFJPVE9fVURQLCBwLT50b3RfbGVuKSAhPSAwKSB7CisgICAgICAgICAgTFdJUF9ERUJVR0YoVURQX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfU0VSSU9VUywKKyAgICAgICAgICAgICAgICAgICAgICAoInVkcF9pbnB1dDogVURQIGRhdGFncmFtIGRpc2NhcmRlZCBkdWUgdG8gZmFpbGluZyBjaGVja3N1bVxuIikpOworICAgICAgICAgIFVEUF9TVEFUU19JTkModWRwLmNoa2Vycik7CisgICAgICAgICAgVURQX1NUQVRTX0lOQyh1ZHAuZHJvcCk7CisgICAgICAgICAgc25tcF9pbmNfdWRwaW5lcnJvcnMoKTsKKyAgICAgICAgICBwYnVmX2ZyZWUocCk7CisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZiAvKiBDSEVDS1NVTV9DSEVDS19VRFAgKi8KKyAgICB9CisgICAgaWYocGJ1Zl9oZWFkZXIocCwgLVVEUF9ITEVOKSkgeworICAgICAgLyogQ2FuIHdlIGNvcGUgd2l0aCB0aGlzIGZhaWxpbmc/IEp1c3QgYXNzZXJ0IGZvciBub3cgKi8KKyAgICAgIExXSVBfQVNTRVJUKCJwYnVmX2hlYWRlciBmYWlsZWRcbiIsIDApOworICAgICAgVURQX1NUQVRTX0lOQyh1ZHAuZHJvcCk7CisgICAgICBzbm1wX2luY191ZHBpbmVycm9ycygpOworICAgICAgcGJ1Zl9mcmVlKHApOworICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmIChwY2IgIT0gTlVMTCkgeworICAgICAgc25tcF9pbmNfdWRwaW5kYXRhZ3JhbXMoKTsKKyNpZiBTT19SRVVTRSAmJiBTT19SRVVTRV9SWFRPQUxMCisgICAgICBpZiAoKGJyb2FkY2FzdCB8fCBpcF9hZGRyX2lzbXVsdGljYXN0KCZjdXJyZW50X2lwaGRyX2Rlc3QpKSAmJgorICAgICAgICAgICgocGNiLT5zb19vcHRpb25zICYgU09GX1JFVVNFQUREUikgIT0gMCkpIHsKKyAgICAgICAgLyogcGFzcyBicm9hZGNhc3QtIG9yIG11bHRpY2FzdCBwYWNrZXRzIHRvIGFsbCBtdWx0aWNhc3QgcGNicworICAgICAgICAgICBpZiBTT0ZfUkVVU0VBRERSIGlzIHNldCBvbiB0aGUgZmlyc3QgbWF0Y2ggKi8KKyAgICAgICAgc3RydWN0IHVkcF9wY2IgKm1wY2I7CisgICAgICAgIHU4X3QgcF9oZWFkZXJfY2hhbmdlZCA9IDA7CisgICAgICAgIGZvciAobXBjYiA9IHVkcF9wY2JzOyBtcGNiICE9IE5VTEw7IG1wY2IgPSBtcGNiLT5uZXh0KSB7CisgICAgICAgICAgaWYgKG1wY2IgIT0gcGNiKSB7CisgICAgICAgICAgICAvKiBjb21wYXJlIFBDQiBsb2NhbCBhZGRyK3BvcnQgdG8gVURQIGRlc3RpbmF0aW9uIGFkZHIrcG9ydCAqLworICAgICAgICAgICAgaWYgKChtcGNiLT5sb2NhbF9wb3J0ID09IGRlc3QpICYmCisgICAgICAgICAgICAgICAgKCghYnJvYWRjYXN0ICYmIGlwX2FkZHJfaXNhbnkoJm1wY2ItPmxvY2FsX2lwKSkgfHwKKyAgICAgICAgICAgICAgICAgaXBfYWRkcl9jbXAoJihtcGNiLT5sb2NhbF9pcCksICZjdXJyZW50X2lwaGRyX2Rlc3QpIHx8CisjaWYgTFdJUF9JR01QCisgICAgICAgICAgICAgICAgIGlwX2FkZHJfaXNtdWx0aWNhc3QoJmN1cnJlbnRfaXBoZHJfZGVzdCkgfHwKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKyNpZiBJUF9TT0ZfQlJPQURDQVNUX1JFQ1YKKyAgICAgICAgICAgICAgICAgKGJyb2FkY2FzdCAmJiAobXBjYi0+c29fb3B0aW9ucyAmIFNPRl9CUk9BRENBU1QpKSkpIHsKKyNlbHNlICAvKiBJUF9TT0ZfQlJPQURDQVNUX1JFQ1YgKi8KKyAgICAgICAgICAgICAgICAgKGJyb2FkY2FzdCkpKSB7CisjZW5kaWYgLyogSVBfU09GX0JST0FEQ0FTVF9SRUNWICovCisgICAgICAgICAgICAgIC8qIHBhc3MgYSBjb3B5IG9mIHRoZSBwYWNrZXQgdG8gYWxsIGxvY2FsIG1hdGNoZXMgKi8KKyAgICAgICAgICAgICAgaWYgKG1wY2ItPnJlY3YgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBwYnVmICpxOworICAgICAgICAgICAgICAgIC8qIGZvciB0aGF0LCBtb3ZlIHBheWxvYWQgdG8gSVAgaGVhZGVyIGFnYWluICovCisgICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX2NoYW5nZWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgcGJ1Zl9oZWFkZXIocCwgKHMxNl90KSgoSVBIX0hMKGlwaGRyKSAqIDQpICsgVURQX0hMRU4pKTsKKyAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBxID0gcGJ1Zl9hbGxvYyhQQlVGX1JBVywgcC0+dG90X2xlbiwgUEJVRl9SQU0pOworICAgICAgICAgICAgICAgIGlmIChxICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgIGVycl90IGVyciA9IHBidWZfY29weShxLCBwKTsKKyAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJSX09LKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgcGF5bG9hZCB0byBVRFAgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICBwYnVmX2hlYWRlcihxLCAtKHMxNl90KSgoSVBIX0hMKGlwaGRyKSAqIDQpICsgVURQX0hMRU4pKTsKKyAgICAgICAgICAgICAgICAgICAgbXBjYi0+cmVjdihtcGNiLT5yZWN2X2FyZywgbXBjYiwgcSwgaXBfY3VycmVudF9zcmNfYWRkcigpLCBzcmMpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocF9oZWFkZXJfY2hhbmdlZCkgeworICAgICAgICAgIC8qIGFuZCBtb3ZlIHBheWxvYWQgdG8gVURQIGRhdGEgYWdhaW4gKi8KKyAgICAgICAgICBwYnVmX2hlYWRlcihwLCAtKHMxNl90KSgoSVBIX0hMKGlwaGRyKSAqIDQpICsgVURQX0hMRU4pKTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIFNPX1JFVVNFICYmIFNPX1JFVVNFX1JYVE9BTEwgKi8KKyAgICAgIC8qIGNhbGxiYWNrICovCisgICAgICBpZiAocGNiLT5yZWN2ICE9IE5VTEwpIHsKKyAgICAgICAgLyogbm93IHRoZSByZWN2IGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHAgKi8KKyAgICAgICAgcGNiLT5yZWN2KHBjYi0+cmVjdl9hcmcsIHBjYiwgcCwgaXBfY3VycmVudF9zcmNfYWRkcigpLCBzcmMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbm8gcmVjdiBmdW5jdGlvbiByZWdpc3RlcmVkPyB0aGVuIHdlIGhhdmUgdG8gZnJlZSB0aGUgcGJ1ZiEgKi8KKyAgICAgICAgcGJ1Zl9mcmVlKHApOworICAgICAgICBnb3RvIGVuZDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgTFdJUF9ERUJVR0YoVURQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidWRwX2lucHV0OiBub3QgZm9yIHVzLlxuIikpOworCisjaWYgTFdJUF9JQ01QCisgICAgICAvKiBObyBtYXRjaCB3YXMgZm91bmQsIHNlbmQgSUNNUCBkZXN0aW5hdGlvbiBwb3J0IHVucmVhY2hhYmxlIHVubGVzcworICAgICAgICAgZGVzdGluYXRpb24gYWRkcmVzcyB3YXMgYnJvYWRjYXN0L211bHRpY2FzdC4gKi8KKyAgICAgIGlmICghYnJvYWRjYXN0ICYmCisgICAgICAgICAgIWlwX2FkZHJfaXNtdWx0aWNhc3QoJmN1cnJlbnRfaXBoZHJfZGVzdCkpIHsKKyAgICAgICAgLyogbW92ZSBwYXlsb2FkIHBvaW50ZXIgYmFjayB0byBpcCBoZWFkZXIgKi8KKyAgICAgICAgcGJ1Zl9oZWFkZXIocCwgKElQSF9ITChpcGhkcikgKiA0KSArIFVEUF9ITEVOKTsKKyAgICAgICAgTFdJUF9BU1NFUlQoInAtPnBheWxvYWQgPT0gaXBoZHIiLCAocC0+cGF5bG9hZCA9PSBpcGhkcikpOworICAgICAgICBpY21wX2Rlc3RfdW5yZWFjaChwLCBJQ01QX0RVUl9QT1JUKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBMV0lQX0lDTVAgKi8KKyAgICAgIFVEUF9TVEFUU19JTkModWRwLnByb3RlcnIpOworICAgICAgVURQX1NUQVRTX0lOQyh1ZHAuZHJvcCk7CisgICAgICBzbm1wX2luY191ZHBub3BvcnRzKCk7CisgICAgICBwYnVmX2ZyZWUocCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHBidWZfZnJlZShwKTsKKyAgfQorZW5kOgorICBQRVJGX1NUT1AoInVkcF9pbnB1dCIpOworfQorCisvKioKKyAqIFNlbmQgZGF0YSB1c2luZyBVRFAuCisgKgorICogQHBhcmFtIHBjYiBVRFAgUENCIHVzZWQgdG8gc2VuZCB0aGUgZGF0YS4KKyAqIEBwYXJhbSBwIGNoYWluIG9mIHBidWYncyB0byBiZSBzZW50LgorICoKKyAqIFRoZSBkYXRhZ3JhbSB3aWxsIGJlIHNlbnQgdG8gdGhlIGN1cnJlbnQgcmVtb3RlX2lwICYgcmVtb3RlX3BvcnQKKyAqIHN0b3JlZCBpbiBwY2IuIElmIHRoZSBwY2IgaXMgbm90IGJvdW5kIHRvIGEgcG9ydCwgaXQgd2lsbAorICogYXV0b21hdGljYWxseSBiZSBib3VuZCB0byBhIHJhbmRvbSBwb3J0LgorICoKKyAqIEByZXR1cm4gbHdJUCBlcnJvciBjb2RlLgorICogLSBFUlJfT0suIFN1Y2Nlc3NmdWwuIE5vIGVycm9yIG9jY3VyZWQuCisgKiAtIEVSUl9NRU0uIE91dCBvZiBtZW1vcnkuCisgKiAtIEVSUl9SVEUuIENvdWxkIG5vdCBmaW5kIHJvdXRlIHRvIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKiAtIE1vcmUgZXJyb3JzIGNvdWxkIGJlIHJldHVybmVkIGJ5IGxvd2VyIHByb3RvY29sIGxheWVycy4KKyAqCisgKiBAc2VlIHVkcF9kaXNjb25uZWN0KCkgdWRwX3NlbmR0bygpCisgKi8KK2Vycl90Cit1ZHBfc2VuZChzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCkKK3sKKyAgLyogc2VuZCB0byB0aGUgcGFja2V0IHVzaW5nIHJlbW90ZSBpcCBhbmQgcG9ydCBzdG9yZWQgaW4gdGhlIHBjYiAqLworICByZXR1cm4gdWRwX3NlbmR0byhwY2IsIHAsICZwY2ItPnJlbW90ZV9pcCwgcGNiLT5yZW1vdGVfcG9ydCk7Cit9CisKKyNpZiBMV0lQX0NIRUNLU1VNX09OX0NPUFkKKy8qKiBTYW1lIGFzIHVkcF9zZW5kKCkgYnV0IHdpdGggY2hlY2tzdW0KKyAqLworZXJyX3QKK3VkcF9zZW5kX2Noa3N1bShzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwKKyAgICAgICAgICAgICAgICB1OF90IGhhdmVfY2hrc3VtLCB1MTZfdCBjaGtzdW0pCit7CisgIC8qIHNlbmQgdG8gdGhlIHBhY2tldCB1c2luZyByZW1vdGUgaXAgYW5kIHBvcnQgc3RvcmVkIGluIHRoZSBwY2IgKi8KKyAgcmV0dXJuIHVkcF9zZW5kdG9fY2hrc3VtKHBjYiwgcCwgJnBjYi0+cmVtb3RlX2lwLCBwY2ItPnJlbW90ZV9wb3J0LAorICAgIGhhdmVfY2hrc3VtLCBjaGtzdW0pOworfQorI2VuZGlmIC8qIExXSVBfQ0hFQ0tTVU1fT05fQ09QWSAqLworCisvKioKKyAqIFNlbmQgZGF0YSB0byBhIHNwZWNpZmllZCBhZGRyZXNzIHVzaW5nIFVEUC4KKyAqCisgKiBAcGFyYW0gcGNiIFVEUCBQQ0IgdXNlZCB0byBzZW5kIHRoZSBkYXRhLgorICogQHBhcmFtIHAgY2hhaW4gb2YgcGJ1ZidzIHRvIGJlIHNlbnQuCisgKiBAcGFyYW0gZHN0X2lwIERlc3RpbmF0aW9uIElQIGFkZHJlc3MuCisgKiBAcGFyYW0gZHN0X3BvcnQgRGVzdGluYXRpb24gVURQIHBvcnQuCisgKgorICogZHN0X2lwICYgZHN0X3BvcnQgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBzYW1lIGJ5dGUgb3JkZXIgYXMgaW4gdGhlIHBjYi4KKyAqCisgKiBJZiB0aGUgUENCIGFscmVhZHkgaGFzIGEgcmVtb3RlIGFkZHJlc3MgYXNzb2NpYXRpb24sIGl0IHdpbGwKKyAqIGJlIHJlc3RvcmVkIGFmdGVyIHRoZSBkYXRhIGlzIHNlbnQuCisgKiAKKyAqIEByZXR1cm4gbHdJUCBlcnJvciBjb2RlIChAc2VlIHVkcF9zZW5kIGZvciBwb3NzaWJsZSBlcnJvciBjb2RlcykKKyAqCisgKiBAc2VlIHVkcF9kaXNjb25uZWN0KCkgdWRwX3NlbmQoKQorICovCitlcnJfdAordWRwX3NlbmR0byhzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwKKyAgaXBfYWRkcl90ICpkc3RfaXAsIHUxNl90IGRzdF9wb3J0KQoreworI2lmIExXSVBfQ0hFQ0tTVU1fT05fQ09QWQorICByZXR1cm4gdWRwX3NlbmR0b19jaGtzdW0ocGNiLCBwLCBkc3RfaXAsIGRzdF9wb3J0LCAwLCAwKTsKK30KKworLyoqIFNhbWUgYXMgdWRwX3NlbmR0bygpLCBidXQgd2l0aCBjaGVja3N1bSAqLworZXJyX3QKK3VkcF9zZW5kdG9fY2hrc3VtKHN0cnVjdCB1ZHBfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKmRzdF9pcCwKKyAgICAgICAgICAgICAgICAgIHUxNl90IGRzdF9wb3J0LCB1OF90IGhhdmVfY2hrc3VtLCB1MTZfdCBjaGtzdW0pCit7CisjZW5kaWYgLyogTFdJUF9DSEVDS1NVTV9PTl9DT1BZICovCisgIHN0cnVjdCBuZXRpZiAqbmV0aWY7CisKKyAgTFdJUF9ERUJVR0YoVURQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidWRwX3NlbmRcbiIpKTsKKworICAvKiBmaW5kIHRoZSBvdXRnb2luZyBuZXR3b3JrIGludGVyZmFjZSBmb3IgdGhpcyBwYWNrZXQgKi8KKyNpZiBMV0lQX0lHTVAKKyAgbmV0aWYgPSBpcF9yb3V0ZSgoaXBfYWRkcl9pc211bHRpY2FzdChkc3RfaXApKT8oJihwY2ItPm11bHRpY2FzdF9pcCkpOihkc3RfaXApKTsKKyNlbHNlCisgIG5ldGlmID0gaXBfcm91dGUoZHN0X2lwKTsKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKworICAvKiBubyBvdXRnb2luZyBuZXR3b3JrIGludGVyZmFjZSBjb3VsZCBiZSBmb3VuZD8gKi8KKyAgaWYgKG5ldGlmID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihVRFBfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLCAoInVkcF9zZW5kOiBObyByb3V0ZSB0byAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICAgIGlwNF9hZGRyMV8xNihkc3RfaXApLCBpcDRfYWRkcjJfMTYoZHN0X2lwKSwgaXA0X2FkZHIzXzE2KGRzdF9pcCksIGlwNF9hZGRyNF8xNihkc3RfaXApKSk7CisgICAgVURQX1NUQVRTX0lOQyh1ZHAucnRlcnIpOworICAgIHJldHVybiBFUlJfUlRFOworICB9CisjaWYgTFdJUF9DSEVDS1NVTV9PTl9DT1BZCisgIHJldHVybiB1ZHBfc2VuZHRvX2lmX2Noa3N1bShwY2IsIHAsIGRzdF9pcCwgZHN0X3BvcnQsIG5ldGlmLCBoYXZlX2Noa3N1bSwgY2hrc3VtKTsKKyNlbHNlIC8qIExXSVBfQ0hFQ0tTVU1fT05fQ09QWSAqLworICByZXR1cm4gdWRwX3NlbmR0b19pZihwY2IsIHAsIGRzdF9pcCwgZHN0X3BvcnQsIG5ldGlmKTsKKyNlbmRpZiAvKiBMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KK30KKworLyoqCisgKiBTZW5kIGRhdGEgdG8gYSBzcGVjaWZpZWQgYWRkcmVzcyB1c2luZyBVRFAuCisgKiBUaGUgbmV0aWYgdXNlZCBmb3Igc2VuZGluZyBjYW4gYmUgc3BlY2lmaWVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZXhpc3RzIG1haW5seSBmb3IgREhDUCwgdG8gYmUgYWJsZSB0byBzZW5kIFVEUCBwYWNrZXRzCisgKiBvbiBhIG5ldGlmIHRoYXQgaXMgc3RpbGwgZG93bi4KKyAqCisgKiBAcGFyYW0gcGNiIFVEUCBQQ0IgdXNlZCB0byBzZW5kIHRoZSBkYXRhLgorICogQHBhcmFtIHAgY2hhaW4gb2YgcGJ1ZidzIHRvIGJlIHNlbnQuCisgKiBAcGFyYW0gZHN0X2lwIERlc3RpbmF0aW9uIElQIGFkZHJlc3MuCisgKiBAcGFyYW0gZHN0X3BvcnQgRGVzdGluYXRpb24gVURQIHBvcnQuCisgKiBAcGFyYW0gbmV0aWYgdGhlIG5ldGlmIHVzZWQgZm9yIHNlbmRpbmcuCisgKgorICogZHN0X2lwICYgZHN0X3BvcnQgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBzYW1lIGJ5dGUgb3JkZXIgYXMgaW4gdGhlIHBjYi4KKyAqCisgKiBAcmV0dXJuIGx3SVAgZXJyb3IgY29kZSAoQHNlZSB1ZHBfc2VuZCBmb3IgcG9zc2libGUgZXJyb3IgY29kZXMpCisgKgorICogQHNlZSB1ZHBfZGlzY29ubmVjdCgpIHVkcF9zZW5kKCkKKyAqLworZXJyX3QKK3VkcF9zZW5kdG9faWYoc3RydWN0IHVkcF9wY2IgKnBjYiwgc3RydWN0IHBidWYgKnAsCisgIGlwX2FkZHJfdCAqZHN0X2lwLCB1MTZfdCBkc3RfcG9ydCwgc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyNpZiBMV0lQX0NIRUNLU1VNX09OX0NPUFkKKyAgcmV0dXJuIHVkcF9zZW5kdG9faWZfY2hrc3VtKHBjYiwgcCwgZHN0X2lwLCBkc3RfcG9ydCwgbmV0aWYsIDAsIDApOworfQorCisvKiogU2FtZSBhcyB1ZHBfc2VuZHRvX2lmKCksIGJ1dCB3aXRoIGNoZWNrc3VtICovCitlcnJfdAordWRwX3NlbmR0b19pZl9jaGtzdW0oc3RydWN0IHVkcF9wY2IgKnBjYiwgc3RydWN0IHBidWYgKnAsIGlwX2FkZHJfdCAqZHN0X2lwLAorICAgICAgICAgICAgICAgICAgICAgdTE2X3QgZHN0X3BvcnQsIHN0cnVjdCBuZXRpZiAqbmV0aWYsIHU4X3QgaGF2ZV9jaGtzdW0sCisgICAgICAgICAgICAgICAgICAgICB1MTZfdCBjaGtzdW0pCit7CisjZW5kaWYgLyogTFdJUF9DSEVDS1NVTV9PTl9DT1BZICovCisgIHN0cnVjdCB1ZHBfaGRyICp1ZHBoZHI7CisgIGlwX2FkZHJfdCAqc3JjX2lwOworICBlcnJfdCBlcnI7CisgIHN0cnVjdCBwYnVmICpxOyAvKiBxIHdpbGwgYmUgc2VudCBkb3duIHRoZSBzdGFjayAqLworCisjaWYgSVBfU09GX0JST0FEQ0FTVAorICAvKiBicm9hZGNhc3QgZmlsdGVyPyAqLworICBpZiAoICgocGNiLT5zb19vcHRpb25zICYgU09GX0JST0FEQ0FTVCkgPT0gMCkgJiYgaXBfYWRkcl9pc2Jyb2FkY2FzdChkc3RfaXAsIG5ldGlmKSApIHsKKyAgICBMV0lQX0RFQlVHRihVRFBfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgKCJ1ZHBfc2VuZHRvX2lmOiBTT0ZfQlJPQURDQVNUIG5vdCBlbmFibGVkIG9uIHBjYiAlcFxuIiwgKHZvaWQgKilwY2IpKTsKKyAgICByZXR1cm4gRVJSX1ZBTDsKKyAgfQorI2VuZGlmIC8qIElQX1NPRl9CUk9BRENBU1QgKi8KKworICAvKiBpZiB0aGUgUENCIGlzIG5vdCB5ZXQgYm91bmQgdG8gYSBwb3J0LCBiaW5kIGl0IGhlcmUgKi8KKyAgaWYgKHBjYi0+bG9jYWxfcG9ydCA9PSAwKSB7CisgICAgTFdJUF9ERUJVR0YoVURQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidWRwX3NlbmQ6IG5vdCB5ZXQgYm91bmQgdG8gYSBwb3J0LCBiaW5kaW5nIG5vd1xuIikpOworICAgIGVyciA9IHVkcF9iaW5kKHBjYiwgJnBjYi0+bG9jYWxfaXAsIHBjYi0+bG9jYWxfcG9ydCk7CisgICAgaWYgKGVyciAhPSBFUlJfT0spIHsKKyAgICAgIExXSVBfREVCVUdGKFVEUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfU0VSSU9VUywgKCJ1ZHBfc2VuZDogZm9yY2VkIHBvcnQgYmluZCBmYWlsZWRcbiIpKTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICB9CisKKyAgLyogbm90IGVub3VnaCBzcGFjZSB0byBhZGQgYW4gVURQIGhlYWRlciB0byBmaXJzdCBwYnVmIGluIGdpdmVuIHAgY2hhaW4/ICovCisgIGlmIChwYnVmX2hlYWRlcihwLCBVRFBfSExFTikpIHsKKyAgICAvKiBhbGxvY2F0ZSBoZWFkZXIgaW4gYSBzZXBhcmF0ZSBuZXcgcGJ1ZiAqLworICAgIHEgPSBwYnVmX2FsbG9jKFBCVUZfSVAsIFVEUF9ITEVOLCBQQlVGX1JBTSk7CisgICAgLyogbmV3IGhlYWRlciBwYnVmIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQ/ICovCisgICAgaWYgKHEgPT0gTlVMTCkgeworICAgICAgTFdJUF9ERUJVR0YoVURQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLCAoInVkcF9zZW5kOiBjb3VsZCBub3QgYWxsb2NhdGUgaGVhZGVyXG4iKSk7CisgICAgICByZXR1cm4gRVJSX01FTTsKKyAgICB9CisgICAgaWYgKHAtPnRvdF9sZW4gIT0gMCkgeworICAgICAgLyogY2hhaW4gaGVhZGVyIHEgaW4gZnJvbnQgb2YgZ2l2ZW4gcGJ1ZiBwIChvbmx5IGlmIHAgY29udGFpbnMgZGF0YSkgKi8KKyAgICAgIHBidWZfY2hhaW4ocSwgcCk7CisgICAgfQorICAgIC8qIGZpcnN0IHBidWYgcSBwb2ludHMgdG8gaGVhZGVyIHBidWYgKi8KKyAgICBMV0lQX0RFQlVHRihVRFBfREVCVUcsCisgICAgICAgICAgICAgICAgKCJ1ZHBfc2VuZDogYWRkZWQgaGVhZGVyIHBidWYgJXAgYmVmb3JlIGdpdmVuIHBidWYgJXBcbiIsICh2b2lkICopcSwgKHZvaWQgKilwKSk7CisgIH0gZWxzZSB7CisgICAgLyogYWRkaW5nIHNwYWNlIGZvciBoZWFkZXIgd2l0aGluIHAgc3VjY2VlZGVkICovCisgICAgLyogZmlyc3QgcGJ1ZiBxIGVxdWFscyBnaXZlbiBwYnVmICovCisgICAgcSA9IHA7CisgICAgTFdJUF9ERUJVR0YoVURQX0RFQlVHLCAoInVkcF9zZW5kOiBhZGRlZCBoZWFkZXIgaW4gZ2l2ZW4gcGJ1ZiAlcFxuIiwgKHZvaWQgKilwKSk7CisgIH0KKyAgTFdJUF9BU1NFUlQoImNoZWNrIHRoYXQgZmlyc3QgcGJ1ZiBjYW4gaG9sZCBzdHJ1Y3QgdWRwX2hkciIsCisgICAgICAgICAgICAgIChxLT5sZW4gPj0gc2l6ZW9mKHN0cnVjdCB1ZHBfaGRyKSkpOworICAvKiBxIG5vdyByZXByZXNlbnRzIHRoZSBwYWNrZXQgdG8gYmUgc2VudCAqLworICB1ZHBoZHIgPSAoc3RydWN0IHVkcF9oZHIgKilxLT5wYXlsb2FkOworICB1ZHBoZHItPnNyYyA9IGh0b25zKHBjYi0+bG9jYWxfcG9ydCk7CisgIHVkcGhkci0+ZGVzdCA9IGh0b25zKGRzdF9wb3J0KTsKKyAgLyogaW4gVURQLCAwIGNoZWNrc3VtIG1lYW5zICdubyBjaGVja3N1bScgKi8KKyAgdWRwaGRyLT5jaGtzdW0gPSAweDAwMDA7IAorCisgIC8qIE11bHRpY2FzdCBMb29wPyAqLworI2lmIExXSVBfSUdNUAorICBpZiAoaXBfYWRkcl9pc211bHRpY2FzdChkc3RfaXApICYmICgocGNiLT5mbGFncyAmIFVEUF9GTEFHU19NVUxUSUNBU1RfTE9PUCkgIT0gMCkpIHsKKyAgICBxLT5mbGFncyB8PSBQQlVGX0ZMQUdfTUNBU1RMT09QOworICB9CisjZW5kaWYgLyogTFdJUF9JR01QICovCisKKworICAvKiBQQ0IgbG9jYWwgYWRkcmVzcyBpcyBJUF9BTllfQUREUj8gKi8KKyAgaWYgKGlwX2FkZHJfaXNhbnkoJnBjYi0+bG9jYWxfaXApKSB7CisgICAgLyogdXNlIG91dGdvaW5nIG5ldHdvcmsgaW50ZXJmYWNlIElQIGFkZHJlc3MgYXMgc291cmNlIGFkZHJlc3MgKi8KKyAgICBzcmNfaXAgPSAmKG5ldGlmLT5pcF9hZGRyKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBjaGVjayBpZiBVRFAgUENCIGxvY2FsIElQIGFkZHJlc3MgaXMgY29ycmVjdAorICAgICAqIHRoaXMgY291bGQgYmUgYW4gb2xkIGFkZHJlc3MgaWYgbmV0aWYtPmlwX2FkZHIgaGFzIGNoYW5nZWQgKi8KKyAgICBpZiAoIWlwX2FkZHJfY21wKCYocGNiLT5sb2NhbF9pcCksICYobmV0aWYtPmlwX2FkZHIpKSkgeworICAgICAgLyogbG9jYWxfaXAgZG9lc24ndCBtYXRjaCwgZHJvcCB0aGUgcGFja2V0ICovCisgICAgICBpZiAocSAhPSBwKSB7CisgICAgICAgIC8qIGZyZWUgdGhlIGhlYWRlciBwYnVmICovCisgICAgICAgIHBidWZfZnJlZShxKTsKKyAgICAgICAgcSA9IE5VTEw7CisgICAgICAgIC8qIHAgaXMgc3RpbGwgcmVmZXJlbmNlZCBieSB0aGUgY2FsbGVyLCBhbmQgd2lsbCBsaXZlIG9uICovCisgICAgICB9CisgICAgICByZXR1cm4gRVJSX1ZBTDsKKyAgICB9CisgICAgLyogdXNlIFVEUCBQQ0IgbG9jYWwgSVAgYWRkcmVzcyBhcyBzb3VyY2UgYWRkcmVzcyAqLworICAgIHNyY19pcCA9ICYocGNiLT5sb2NhbF9pcCk7CisgIH0KKworICBMV0lQX0RFQlVHRihVRFBfREVCVUcsICgidWRwX3NlbmQ6IHNlbmRpbmcgZGF0YWdyYW0gb2YgbGVuZ3RoICUiVTE2X0YiXG4iLCBxLT50b3RfbGVuKSk7CisKKyNpZiBMV0lQX1VEUExJVEUKKyAgLyogVURQIExpdGUgcHJvdG9jb2w/ICovCisgIGlmIChwY2ItPmZsYWdzICYgVURQX0ZMQUdTX1VEUExJVEUpIHsKKyAgICB1MTZfdCBjaGtsZW4sIGNoa2xlbl9oZHI7CisgICAgTFdJUF9ERUJVR0YoVURQX0RFQlVHLCAoInVkcF9zZW5kOiBVRFAgTElURSBwYWNrZXQgbGVuZ3RoICUiVTE2X0YiXG4iLCBxLT50b3RfbGVuKSk7CisgICAgLyogc2V0IFVEUCBtZXNzYWdlIGxlbmd0aCBpbiBVRFAgaGVhZGVyICovCisgICAgY2hrbGVuX2hkciA9IGNoa2xlbiA9IHBjYi0+Y2hrc3VtX2xlbl90eDsKKyAgICBpZiAoKGNoa2xlbiA8IHNpemVvZihzdHJ1Y3QgdWRwX2hkcikpIHx8IChjaGtsZW4gPiBxLT50b3RfbGVuKSkgeworICAgICAgaWYgKGNoa2xlbiAhPSAwKSB7CisgICAgICAgIExXSVBfREVCVUdGKFVEUF9ERUJVRywgKCJ1ZHBfc2VuZDogVURQIExJVEUgcGNiLT5jaGtzdW1fbGVuIGlzIGlsbGVnYWw6ICUiVTE2X0YiXG4iLCBjaGtsZW4pKTsKKyAgICAgIH0KKyAgICAgIC8qIEZvciBVRFAtTGl0ZSwgY2hlY2tzdW0gbGVuZ3RoIG9mIDAgbWVhbnMgY2hlY2tzdW0KKyAgICAgICAgIG92ZXIgdGhlIGNvbXBsZXRlIHBhY2tldC4gKFNlZSBSRkMgMzgyOCBjaGFwLiAzLjEpCisgICAgICAgICBBdCBsZWFzdCB0aGUgVURQLUxpdGUgaGVhZGVyIG11c3QgYmUgY292ZXJlZCBieSB0aGUKKyAgICAgICAgIGNoZWNrc3VtLCB0aGVyZWZvcmUsIGlmIGNoa3N1bV9sZW4gaGFzIGFuIGlsbGVnYWwKKyAgICAgICAgIHZhbHVlLCB3ZSBnZW5lcmF0ZSB0aGUgY2hlY2tzdW0gb3ZlciB0aGUgY29tcGxldGUKKyAgICAgICAgIHBhY2tldCB0byBiZSBzYWZlLiAqLworICAgICAgY2hrbGVuX2hkciA9IDA7CisgICAgICBjaGtsZW4gPSBxLT50b3RfbGVuOworICAgIH0KKyAgICB1ZHBoZHItPmxlbiA9IGh0b25zKGNoa2xlbl9oZHIpOworICAgIC8qIGNhbGN1bGF0ZSBjaGVja3N1bSAqLworI2lmIENIRUNLU1VNX0dFTl9VRFAKKyAgICB1ZHBoZHItPmNoa3N1bSA9IGluZXRfY2hrc3VtX3BzZXVkb19wYXJ0aWFsKHEsIHNyY19pcCwgZHN0X2lwLAorICAgICAgSVBfUFJPVE9fVURQTElURSwgcS0+dG90X2xlbiwKKyNpZiAhTFdJUF9DSEVDS1NVTV9PTl9DT1BZCisgICAgICBjaGtsZW4pOworI2Vsc2UgLyogIUxXSVBfQ0hFQ0tTVU1fT05fQ09QWSAqLworICAgICAgKGhhdmVfY2hrc3VtID8gVURQX0hMRU4gOiBjaGtsZW4pKTsKKyAgICBpZiAoaGF2ZV9jaGtzdW0pIHsKKyAgICAgIHUzMl90IGFjYzsKKyAgICAgIGFjYyA9IHVkcGhkci0+Y2hrc3VtICsgKHUxNl90KX4oY2hrc3VtKTsKKyAgICAgIHVkcGhkci0+Y2hrc3VtID0gRk9MRF9VMzJUKGFjYyk7CisgICAgfQorI2VuZGlmIC8qICFMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KKworICAgIC8qIGNoa3N1bSB6ZXJvIG11c3QgYmVjb21lIDB4ZmZmZiwgYXMgemVybyBtZWFucyAnbm8gY2hlY2tzdW0nICovCisgICAgaWYgKHVkcGhkci0+Y2hrc3VtID09IDB4MDAwMCkgeworICAgICAgdWRwaGRyLT5jaGtzdW0gPSAweGZmZmY7CisgICAgfQorI2VuZGlmIC8qIENIRUNLU1VNX0dFTl9VRFAgKi8KKyAgICAvKiBvdXRwdXQgdG8gSVAgKi8KKyAgICBMV0lQX0RFQlVHRihVRFBfREVCVUcsICgidWRwX3NlbmQ6IGlwX291dHB1dF9pZiAoLCwsLElQX1BST1RPX1VEUExJVEUsKVxuIikpOworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICAgIG5ldGlmLT5hZGRyX2hpbnQgPSAmKHBjYi0+YWRkcl9oaW50KTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQqLworICAgIGVyciA9IGlwX291dHB1dF9pZihxLCBzcmNfaXAsIGRzdF9pcCwgcGNiLT50dGwsIHBjYi0+dG9zLCBJUF9QUk9UT19VRFBMSVRFLCBuZXRpZik7CisjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UCisgICAgbmV0aWYtPmFkZHJfaGludCA9IE5VTEw7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UKi8KKyAgfSBlbHNlCisjZW5kaWYgLyogTFdJUF9VRFBMSVRFICovCisgIHsgICAgICAvKiBVRFAgKi8KKyAgICBMV0lQX0RFQlVHRihVRFBfREVCVUcsICgidWRwX3NlbmQ6IFVEUCBwYWNrZXQgbGVuZ3RoICUiVTE2X0YiXG4iLCBxLT50b3RfbGVuKSk7CisgICAgdWRwaGRyLT5sZW4gPSBodG9ucyhxLT50b3RfbGVuKTsKKyAgICAvKiBjYWxjdWxhdGUgY2hlY2tzdW0gKi8KKyNpZiBDSEVDS1NVTV9HRU5fVURQCisgICAgaWYgKChwY2ItPmZsYWdzICYgVURQX0ZMQUdTX05PQ0hLU1VNKSA9PSAwKSB7CisgICAgICB1MTZfdCB1ZHBjaGtzdW07CisjaWYgTFdJUF9DSEVDS1NVTV9PTl9DT1BZCisgICAgICBpZiAoaGF2ZV9jaGtzdW0pIHsKKyAgICAgICAgdTMyX3QgYWNjOworICAgICAgICB1ZHBjaGtzdW0gPSBpbmV0X2Noa3N1bV9wc2V1ZG9fcGFydGlhbChxLCBzcmNfaXAsIGRzdF9pcCwgSVBfUFJPVE9fVURQLAorICAgICAgICAgIHEtPnRvdF9sZW4sIFVEUF9ITEVOKTsKKyAgICAgICAgYWNjID0gdWRwY2hrc3VtICsgKHUxNl90KX4oY2hrc3VtKTsKKyAgICAgICAgdWRwY2hrc3VtID0gRk9MRF9VMzJUKGFjYyk7CisgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KKyAgICAgIHsKKyAgICAgICAgdWRwY2hrc3VtID0gaW5ldF9jaGtzdW1fcHNldWRvKHEsIHNyY19pcCwgZHN0X2lwLCBJUF9QUk9UT19VRFAsIHEtPnRvdF9sZW4pOworICAgICAgfQorCisgICAgICAvKiBjaGtzdW0gemVybyBtdXN0IGJlY29tZSAweGZmZmYsIGFzIHplcm8gbWVhbnMgJ25vIGNoZWNrc3VtJyAqLworICAgICAgaWYgKHVkcGNoa3N1bSA9PSAweDAwMDApIHsKKyAgICAgICAgdWRwY2hrc3VtID0gMHhmZmZmOworICAgICAgfQorICAgICAgdWRwaGRyLT5jaGtzdW0gPSB1ZHBjaGtzdW07CisgICAgfQorI2VuZGlmIC8qIENIRUNLU1VNX0dFTl9VRFAgKi8KKyAgICBMV0lQX0RFQlVHRihVRFBfREVCVUcsICgidWRwX3NlbmQ6IFVEUCBjaGVja3N1bSAweCUwNCJYMTZfRiJcbiIsIHVkcGhkci0+Y2hrc3VtKSk7CisgICAgTFdJUF9ERUJVR0YoVURQX0RFQlVHLCAoInVkcF9zZW5kOiBpcF9vdXRwdXRfaWYgKCwsLCxJUF9QUk9UT19VRFAsKVxuIikpOworICAgIC8qIG91dHB1dCB0byBJUCAqLworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICAgIG5ldGlmLT5hZGRyX2hpbnQgPSAmKHBjYi0+YWRkcl9oaW50KTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQqLworICAgIGVyciA9IGlwX291dHB1dF9pZihxLCBzcmNfaXAsIGRzdF9pcCwgcGNiLT50dGwsIHBjYi0+dG9zLCBJUF9QUk9UT19VRFAsIG5ldGlmKTsKKyNpZiBMV0lQX05FVElGX0hXQUREUkhJTlQKKyAgICBuZXRpZi0+YWRkcl9oaW50ID0gTlVMTDsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQqLworICB9CisgIC8qIFRPRE86IG11c3QgdGhpcyBiZSBpbmNyZWFzZWQgZXZlbiBpZiBlcnJvciBvY2N1cmVkPyAqLworICBzbm1wX2luY191ZHBvdXRkYXRhZ3JhbXMoKTsKKworICAvKiBkaWQgd2UgY2hhaW4gYSBzZXBhcmF0ZSBoZWFkZXIgcGJ1ZiBlYXJsaWVyPyAqLworICBpZiAocSAhPSBwKSB7CisgICAgLyogZnJlZSB0aGUgaGVhZGVyIHBidWYgKi8KKyAgICBwYnVmX2ZyZWUocSk7CisgICAgcSA9IE5VTEw7CisgICAgLyogcCBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoZSBjYWxsZXIsIGFuZCB3aWxsIGxpdmUgb24gKi8KKyAgfQorCisgIFVEUF9TVEFUU19JTkModWRwLnhtaXQpOworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIEJpbmQgYW4gVURQIFBDQi4KKyAqCisgKiBAcGFyYW0gcGNiIFVEUCBQQ0IgdG8gYmUgYm91bmQgd2l0aCBhIGxvY2FsIGFkZHJlc3MgaXBhZGRyIGFuZCBwb3J0LgorICogQHBhcmFtIGlwYWRkciBsb2NhbCBJUCBhZGRyZXNzIHRvIGJpbmQgd2l0aC4gVXNlIElQX0FERFJfQU5ZIHRvCisgKiBiaW5kIHRvIGFsbCBsb2NhbCBpbnRlcmZhY2VzLgorICogQHBhcmFtIHBvcnQgbG9jYWwgVURQIHBvcnQgdG8gYmluZCB3aXRoLiBVc2UgMCB0byBhdXRvbWF0aWNhbGx5IGJpbmQKKyAqIHRvIGEgcmFuZG9tIHBvcnQgYmV0d2VlbiBVRFBfTE9DQUxfUE9SVF9SQU5HRV9TVEFSVCBhbmQKKyAqIFVEUF9MT0NBTF9QT1JUX1JBTkdFX0VORC4KKyAqCisgKiBpcGFkZHIgJiBwb3J0IGFyZSBleHBlY3RlZCB0byBiZSBpbiB0aGUgc2FtZSBieXRlIG9yZGVyIGFzIGluIHRoZSBwY2IuCisgKgorICogQHJldHVybiBsd0lQIGVycm9yIGNvZGUuCisgKiAtIEVSUl9PSy4gU3VjY2Vzc2Z1bC4gTm8gZXJyb3Igb2NjdXJlZC4KKyAqIC0gRVJSX1VTRS4gVGhlIHNwZWNpZmllZCBpcGFkZHIgYW5kIHBvcnQgYXJlIGFscmVhZHkgYm91bmQgdG8gYnkKKyAqIGFub3RoZXIgVURQIFBDQi4KKyAqCisgKiBAc2VlIHVkcF9kaXNjb25uZWN0KCkKKyAqLworZXJyX3QKK3VkcF9iaW5kKHN0cnVjdCB1ZHBfcGNiICpwY2IsIGlwX2FkZHJfdCAqaXBhZGRyLCB1MTZfdCBwb3J0KQoreworICBzdHJ1Y3QgdWRwX3BjYiAqaXBjYjsKKyAgdThfdCByZWJpbmQ7CisKKyAgTFdJUF9ERUJVR0YoVURQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidWRwX2JpbmQoaXBhZGRyID0gIikpOworICBpcF9hZGRyX2RlYnVnX3ByaW50KFVEUF9ERUJVRywgaXBhZGRyKTsKKyAgTFdJUF9ERUJVR0YoVURQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiLCBwb3J0ID0gJSJVMTZfRiIpXG4iLCBwb3J0KSk7CisKKyAgcmViaW5kID0gMDsKKyAgLyogQ2hlY2sgZm9yIGRvdWJsZSBiaW5kIGFuZCByZWJpbmQgb2YgdGhlIHNhbWUgcGNiICovCisgIGZvciAoaXBjYiA9IHVkcF9wY2JzOyBpcGNiICE9IE5VTEw7IGlwY2IgPSBpcGNiLT5uZXh0KSB7CisgICAgLyogaXMgdGhpcyBVRFAgUENCIGFscmVhZHkgb24gYWN0aXZlIGxpc3Q/ICovCisgICAgaWYgKHBjYiA9PSBpcGNiKSB7CisgICAgICAvKiBwY2IgbWF5IG9jY3VyIGF0IG1vc3Qgb25jZSBpbiBhY3RpdmUgbGlzdCAqLworICAgICAgTFdJUF9BU1NFUlQoInJlYmluZCA9PSAwIiwgcmViaW5kID09IDApOworICAgICAgLyogcGNiIGFscmVhZHkgaW4gbGlzdCwganVzdCByZWJpbmQgKi8KKyAgICAgIHJlYmluZCA9IDE7CisgICAgfQorCisgICAgLyogQnkgZGVmYXVsdCwgd2UgZG9uJ3QgYWxsb3cgdG8gYmluZCB0byBhIHBvcnQgdGhhdCBhbnkgb3RoZXIgdWRwCisgICAgICAgUENCIGlzIGFscmVhZCBib3VuZCB0bywgdW5sZXNzICphbGwqIFBDQnMgd2l0aCB0aGF0IHBvcnQgaGF2ZSB0aGEKKyAgICAgICBSRVVTRUFERFIgZmxhZyBzZXQuICovCisjaWYgU09fUkVVU0UKKyAgICBlbHNlIGlmICgoKHBjYi0+c29fb3B0aW9ucyAmIFNPRl9SRVVTRUFERFIpID09IDApICYmCisgICAgICAgICAgICAgKChpcGNiLT5zb19vcHRpb25zICYgU09GX1JFVVNFQUREUikgPT0gMCkpIHsKKyNlbHNlIC8qIFNPX1JFVVNFICovCisgICAgLyogcG9ydCBtYXRjaGVzIHRoYXQgb2YgUENCIGluIGxpc3QgYW5kIFJFVVNFQUREUiBub3Qgc2V0IC0+IHJlamVjdCAqLworICAgIGVsc2UgeworI2VuZGlmIC8qIFNPX1JFVVNFICovCisgICAgICBpZiAoKGlwY2ItPmxvY2FsX3BvcnQgPT0gcG9ydCkgJiYKKyAgICAgICAgICAvKiBJUCBhZGRyZXNzIG1hdGNoZXMsIG9yIG9uZSBpcyBJUF9BRERSX0FOWT8gKi8KKyAgICAgICAgICAoaXBfYWRkcl9pc2FueSgmKGlwY2ItPmxvY2FsX2lwKSkgfHwKKyAgICAgICAgICAgaXBfYWRkcl9pc2FueShpcGFkZHIpIHx8CisgICAgICAgICAgIGlwX2FkZHJfY21wKCYoaXBjYi0+bG9jYWxfaXApLCBpcGFkZHIpKSkgeworICAgICAgICAvKiBvdGhlciBQQ0IgYWxyZWFkeSBiaW5kcyB0byB0aGlzIGxvY2FsIElQIGFuZCBwb3J0ICovCisgICAgICAgIExXSVBfREVCVUdGKFVEUF9ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgKCJ1ZHBfYmluZDogbG9jYWwgcG9ydCAlIlUxNl9GIiBhbHJlYWR5IGJvdW5kIGJ5IGFub3RoZXIgcGNiXG4iLCBwb3J0KSk7CisgICAgICAgIHJldHVybiBFUlJfVVNFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlwX2FkZHJfc2V0KCZwY2ItPmxvY2FsX2lwLCBpcGFkZHIpOworCisgIC8qIG5vIHBvcnQgc3BlY2lmaWVkPyAqLworICBpZiAocG9ydCA9PSAwKSB7CisjaWZuZGVmIFVEUF9MT0NBTF9QT1JUX1JBTkdFX1NUQVJUCisvKiBGcm9tIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvcG9ydC1udW1iZXJzOgorICAgIlRoZSBEeW5hbWljIGFuZC9vciBQcml2YXRlIFBvcnRzIGFyZSB0aG9zZSBmcm9tIDQ5MTUyIHRocm91Z2ggNjU1MzUiICovCisjZGVmaW5lIFVEUF9MT0NBTF9QT1JUX1JBTkdFX1NUQVJUICAweGMwMDAKKyNkZWZpbmUgVURQX0xPQ0FMX1BPUlRfUkFOR0VfRU5EICAgIDB4ZmZmZgorI2VuZGlmCisgICAgcG9ydCA9IFVEUF9MT0NBTF9QT1JUX1JBTkdFX1NUQVJUOworICAgIGlwY2IgPSB1ZHBfcGNiczsKKyAgICB3aGlsZSAoKGlwY2IgIT0gTlVMTCkgJiYgKHBvcnQgIT0gVURQX0xPQ0FMX1BPUlRfUkFOR0VfRU5EKSkgeworICAgICAgaWYgKGlwY2ItPmxvY2FsX3BvcnQgPT0gcG9ydCkgeworICAgICAgICAvKiBwb3J0IGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIHVkcF9wY2IgKi8KKyAgICAgICAgcG9ydCsrOworICAgICAgICAvKiByZXN0YXJ0IHNjYW5uaW5nIGFsbCB1ZHAgcGNicyAqLworICAgICAgICBpcGNiID0gdWRwX3BjYnM7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBnbyBvbiB3aXRoIG5leHQgdWRwIHBjYiAqLworICAgICAgICBpcGNiID0gaXBjYi0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGlwY2IgIT0gTlVMTCkgeworICAgICAgLyogbm8gbW9yZSBwb3J0cyBhdmFpbGFibGUgaW4gbG9jYWwgcmFuZ2UgKi8KKyAgICAgIExXSVBfREVCVUdGKFVEUF9ERUJVRywgKCJ1ZHBfYmluZDogb3V0IG9mIGZyZWUgVURQIHBvcnRzXG4iKSk7CisgICAgICByZXR1cm4gRVJSX1VTRTsKKyAgICB9CisgIH0KKyAgcGNiLT5sb2NhbF9wb3J0ID0gcG9ydDsKKyAgc25tcF9pbnNlcnRfdWRwaWR4X3RyZWUocGNiKTsKKyAgLyogcGNiIG5vdCBhY3RpdmUgeWV0PyAqLworICBpZiAocmViaW5kID09IDApIHsKKyAgICAvKiBwbGFjZSB0aGUgUENCIG9uIHRoZSBhY3RpdmUgbGlzdCBpZiBub3QgYWxyZWFkeSB0aGVyZSAqLworICAgIHBjYi0+bmV4dCA9IHVkcF9wY2JzOworICAgIHVkcF9wY2JzID0gcGNiOworICB9CisgIExXSVBfREVCVUdGKFVEUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfU1RBVEUsCisgICAgICAgICAgICAgICgidWRwX2JpbmQ6IGJvdW5kIHRvICUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLCBwb3J0ICUiVTE2X0YiXG4iLAorICAgICAgICAgICAgICAgaXA0X2FkZHIxXzE2KCZwY2ItPmxvY2FsX2lwKSwgaXA0X2FkZHIyXzE2KCZwY2ItPmxvY2FsX2lwKSwKKyAgICAgICAgICAgICAgIGlwNF9hZGRyM18xNigmcGNiLT5sb2NhbF9pcCksIGlwNF9hZGRyNF8xNigmcGNiLT5sb2NhbF9pcCksCisgICAgICAgICAgICAgICBwY2ItPmxvY2FsX3BvcnQpKTsKKyAgcmV0dXJuIEVSUl9PSzsKK30KKy8qKgorICogQ29ubmVjdCBhbiBVRFAgUENCLgorICoKKyAqIFRoaXMgd2lsbCBhc3NvY2lhdGUgdGhlIFVEUCBQQ0Igd2l0aCB0aGUgcmVtb3RlIGFkZHJlc3MuCisgKgorICogQHBhcmFtIHBjYiBVRFAgUENCIHRvIGJlIGNvbm5lY3RlZCB3aXRoIHJlbW90ZSBhZGRyZXNzIGlwYWRkciBhbmQgcG9ydC4KKyAqIEBwYXJhbSBpcGFkZHIgcmVtb3RlIElQIGFkZHJlc3MgdG8gY29ubmVjdCB3aXRoLgorICogQHBhcmFtIHBvcnQgcmVtb3RlIFVEUCBwb3J0IHRvIGNvbm5lY3Qgd2l0aC4KKyAqCisgKiBAcmV0dXJuIGx3SVAgZXJyb3IgY29kZQorICoKKyAqIGlwYWRkciAmIHBvcnQgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBzYW1lIGJ5dGUgb3JkZXIgYXMgaW4gdGhlIHBjYi4KKyAqCisgKiBUaGUgdWRwIHBjYiBpcyBib3VuZCB0byBhIHJhbmRvbSBsb2NhbCBwb3J0IGlmIG5vdCBhbHJlYWR5IGJvdW5kLgorICoKKyAqIEBzZWUgdWRwX2Rpc2Nvbm5lY3QoKQorICovCitlcnJfdAordWRwX2Nvbm5lY3Qoc3RydWN0IHVkcF9wY2IgKnBjYiwgaXBfYWRkcl90ICppcGFkZHIsIHUxNl90IHBvcnQpCit7CisgIHN0cnVjdCB1ZHBfcGNiICppcGNiOworCisgIGlmIChwY2ItPmxvY2FsX3BvcnQgPT0gMCkgeworICAgIGVycl90IGVyciA9IHVkcF9iaW5kKHBjYiwgJnBjYi0+bG9jYWxfaXAsIHBjYi0+bG9jYWxfcG9ydCk7CisgICAgaWYgKGVyciAhPSBFUlJfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICB9CisKKyAgaXBfYWRkcl9zZXQoJnBjYi0+cmVtb3RlX2lwLCBpcGFkZHIpOworICBwY2ItPnJlbW90ZV9wb3J0ID0gcG9ydDsKKyAgcGNiLT5mbGFncyB8PSBVRFBfRkxBR1NfQ09OTkVDVEVEOworLyoqIFRPRE86IHRoaXMgZnVuY3Rpb25hbGl0eSBiZWxvbmdzIGluIHVwcGVyIGxheWVycyAqLworI2lmZGVmIExXSVBfVURQX1RPRE8KKyAgLyogTmFpbCBkb3duIGxvY2FsIElQIGZvciBuZXRjb25uX2FkZHIoKS9nZXRzb2NrbmFtZSgpICovCisgIGlmIChpcF9hZGRyX2lzYW55KCZwY2ItPmxvY2FsX2lwKSAmJiAhaXBfYWRkcl9pc2FueSgmcGNiLT5yZW1vdGVfaXApKSB7CisgICAgc3RydWN0IG5ldGlmICpuZXRpZjsKKworICAgIGlmICgobmV0aWYgPSBpcF9yb3V0ZSgmKHBjYi0+cmVtb3RlX2lwKSkpID09IE5VTEwpIHsKKyAgICAgIExXSVBfREVCVUdGKFVEUF9ERUJVRywgKCJ1ZHBfY29ubmVjdDogTm8gcm91dGUgdG8gMHglbHhcbiIsIHBjYi0+cmVtb3RlX2lwLmFkZHIpKTsKKyAgICAgIFVEUF9TVEFUU19JTkModWRwLnJ0ZXJyKTsKKyAgICAgIHJldHVybiBFUlJfUlRFOworICAgIH0KKyAgICAvKiogVE9ETzogdGhpcyB3aWxsIGJpbmQgdGhlIHVkcCBwY2IgbG9jYWxseSwgdG8gdGhlIGludGVyZmFjZSB3aGljaAorICAgICAgICBpcyB1c2VkIHRvIHJvdXRlIG91dHB1dCBwYWNrZXRzIHRvIHRoZSByZW1vdGUgYWRkcmVzcy4gSG93ZXZlciwgd2UKKyAgICAgICAgbWlnaHQgd2FudCB0byBhY2NlcHQgaW5jb21pbmcgcGFja2V0cyBvbiBhbnkgaW50ZXJmYWNlISAqLworICAgIHBjYi0+bG9jYWxfaXAgPSBuZXRpZi0+aXBfYWRkcjsKKyAgfSBlbHNlIGlmIChpcF9hZGRyX2lzYW55KCZwY2ItPnJlbW90ZV9pcCkpIHsKKyAgICBwY2ItPmxvY2FsX2lwLmFkZHIgPSAwOworICB9CisjZW5kaWYKKyAgTFdJUF9ERUJVR0YoVURQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19TVEFURSwKKyAgICAgICAgICAgICAgKCJ1ZHBfY29ubmVjdDogY29ubmVjdGVkIHRvICUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLHBvcnQgJSJVMTZfRiJcbiIsCisgICAgICAgICAgICAgICBpcDRfYWRkcjFfMTYoJnBjYi0+bG9jYWxfaXApLCBpcDRfYWRkcjJfMTYoJnBjYi0+bG9jYWxfaXApLAorICAgICAgICAgICAgICAgaXA0X2FkZHIzXzE2KCZwY2ItPmxvY2FsX2lwKSwgaXA0X2FkZHI0XzE2KCZwY2ItPmxvY2FsX2lwKSwKKyAgICAgICAgICAgICAgIHBjYi0+bG9jYWxfcG9ydCkpOworCisgIC8qIEluc2VydCBVRFAgUENCIGludG8gdGhlIGxpc3Qgb2YgYWN0aXZlIFVEUCBQQ0JzLiAqLworICBmb3IgKGlwY2IgPSB1ZHBfcGNiczsgaXBjYiAhPSBOVUxMOyBpcGNiID0gaXBjYi0+bmV4dCkgeworICAgIGlmIChwY2IgPT0gaXBjYikgeworICAgICAgLyogYWxyZWFkeSBvbiB0aGUgbGlzdCwganVzdCByZXR1cm4gKi8KKyAgICAgIHJldHVybiBFUlJfT0s7CisgICAgfQorICB9CisgIC8qIFBDQiBub3QgeWV0IG9uIHRoZSBsaXN0LCBhZGQgUENCIG5vdyAqLworICBwY2ItPm5leHQgPSB1ZHBfcGNiczsKKyAgdWRwX3BjYnMgPSBwY2I7CisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogRGlzY29ubmVjdCBhIFVEUCBQQ0IKKyAqCisgKiBAcGFyYW0gcGNiIHRoZSB1ZHAgcGNiIHRvIGRpc2Nvbm5lY3QuCisgKi8KK3ZvaWQKK3VkcF9kaXNjb25uZWN0KHN0cnVjdCB1ZHBfcGNiICpwY2IpCit7CisgIC8qIHJlc2V0IHJlbW90ZSBhZGRyZXNzIGFzc29jaWF0aW9uICovCisgIGlwX2FkZHJfc2V0X2FueSgmcGNiLT5yZW1vdGVfaXApOworICBwY2ItPnJlbW90ZV9wb3J0ID0gMDsKKyAgLyogbWFyayBQQ0IgYXMgdW5jb25uZWN0ZWQgKi8KKyAgcGNiLT5mbGFncyAmPSB+VURQX0ZMQUdTX0NPTk5FQ1RFRDsKK30KKworLyoqCisgKiBTZXQgYSByZWNlaXZlIGNhbGxiYWNrIGZvciBhIFVEUCBQQ0IKKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gcmVjZWl2aW5nIGEgZGF0YWdyYW0gZm9yIHRoZSBwY2IuCisgKgorICogQHBhcmFtIHBjYiB0aGUgcGNiIGZvciB3aWNoIHRvIHNldCB0aGUgcmVjdiBjYWxsYmFjaworICogQHBhcmFtIHJlY3YgZnVuY3Rpb24gcG9pbnRlciBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBwYXJhbSByZWN2X2FyZyBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKi8KK3ZvaWQKK3VkcF9yZWN2KHN0cnVjdCB1ZHBfcGNiICpwY2IsIHVkcF9yZWN2X2ZuIHJlY3YsIHZvaWQgKnJlY3ZfYXJnKQoreworICAvKiByZW1lbWJlciByZWN2KCkgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YSAqLworICBwY2ItPnJlY3YgPSByZWN2OworICBwY2ItPnJlY3ZfYXJnID0gcmVjdl9hcmc7Cit9CisKKy8qKgorICogUmVtb3ZlIGFuIFVEUCBQQ0IuCisgKgorICogQHBhcmFtIHBjYiBVRFAgUENCIHRvIGJlIHJlbW92ZWQuIFRoZSBQQ0IgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mCisgKiBVRFAgUENCJ3MgYW5kIHRoZSBkYXRhIHN0cnVjdHVyZSBpcyBmcmVlZCBmcm9tIG1lbW9yeS4KKyAqCisgKiBAc2VlIHVkcF9uZXcoKQorICovCit2b2lkCit1ZHBfcmVtb3ZlKHN0cnVjdCB1ZHBfcGNiICpwY2IpCit7CisgIHN0cnVjdCB1ZHBfcGNiICpwY2IyOworCisgIHNubXBfZGVsZXRlX3VkcGlkeF90cmVlKHBjYik7CisgIC8qIHBjYiB0byBiZSByZW1vdmVkIGlzIGZpcnN0IGluIGxpc3Q/ICovCisgIGlmICh1ZHBfcGNicyA9PSBwY2IpIHsKKyAgICAvKiBtYWtlIGxpc3Qgc3RhcnQgYXQgMm5kIHBjYiAqLworICAgIHVkcF9wY2JzID0gdWRwX3BjYnMtPm5leHQ7CisgICAgLyogcGNiIG5vdCAxc3QgaW4gbGlzdCAqLworICB9IGVsc2UgeworICAgIGZvciAocGNiMiA9IHVkcF9wY2JzOyBwY2IyICE9IE5VTEw7IHBjYjIgPSBwY2IyLT5uZXh0KSB7CisgICAgICAvKiBmaW5kIHBjYiBpbiB1ZHBfcGNicyBsaXN0ICovCisgICAgICBpZiAocGNiMi0+bmV4dCAhPSBOVUxMICYmIHBjYjItPm5leHQgPT0gcGNiKSB7CisgICAgICAgIC8qIHJlbW92ZSBwY2IgZnJvbSBsaXN0ICovCisgICAgICAgIHBjYjItPm5leHQgPSBwY2ItPm5leHQ7CisgICAgICB9CisgICAgfQorICB9CisgIG1lbXBfZnJlZShNRU1QX1VEUF9QQ0IsIHBjYik7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgVURQIFBDQi4KKyAqCisgKiBAcmV0dXJuIFRoZSBVRFAgUENCIHdoaWNoIHdhcyBjcmVhdGVkLiBOVUxMIGlmIHRoZSBQQ0IgZGF0YSBzdHJ1Y3R1cmUKKyAqIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgKgorICogQHNlZSB1ZHBfcmVtb3ZlKCkKKyAqLworc3RydWN0IHVkcF9wY2IgKgordWRwX25ldyh2b2lkKQoreworICBzdHJ1Y3QgdWRwX3BjYiAqcGNiOworICBwY2IgPSAoc3RydWN0IHVkcF9wY2IgKiltZW1wX21hbGxvYyhNRU1QX1VEUF9QQ0IpOworICAvKiBjb3VsZCBhbGxvY2F0ZSBVRFAgUENCPyAqLworICBpZiAocGNiICE9IE5VTEwpIHsKKyAgICAvKiBVRFAgTGl0ZTogYnkgaW5pdGlhbGl6aW5nIHRvIGFsbCB6ZXJvZXMsIGNoa3N1bV9sZW4gaXMgc2V0IHRvIDAKKyAgICAgKiB3aGljaCBtZWFucyBjaGVja3N1bSBpcyBnZW5lcmF0ZWQgb3ZlciB0aGUgd2hvbGUgZGF0YWdyYW0gcGVyIGRlZmF1bHQKKyAgICAgKiAocmVjb21tZW5kZWQgYXMgZGVmYXVsdCBieSBSRkMgMzgyOCkuICovCisgICAgLyogaW5pdGlhbGl6ZSBQQ0IgdG8gYWxsIHplcm9lcyAqLworICAgIG1lbXNldChwY2IsIDAsIHNpemVvZihzdHJ1Y3QgdWRwX3BjYikpOworICAgIHBjYi0+dHRsID0gVURQX1RUTDsKKyAgfQorICByZXR1cm4gcGNiOworfQorCisjaWYgVURQX0RFQlVHCisvKioKKyAqIFByaW50IFVEUCBoZWFkZXIgaW5mb3JtYXRpb24gZm9yIGRlYnVnIHB1cnBvc2VzLgorICoKKyAqIEBwYXJhbSB1ZHBoZHIgcG9pbnRlciB0byB0aGUgdWRwIGhlYWRlciBpbiBtZW1vcnkuCisgKi8KK3ZvaWQKK3VkcF9kZWJ1Z19wcmludChzdHJ1Y3QgdWRwX2hkciAqdWRwaGRyKQoreworICBMV0lQX0RFQlVHRihVRFBfREVCVUcsICgiVURQIGhlYWRlcjpcbiIpKTsKKyAgTFdJUF9ERUJVR0YoVURQX0RFQlVHLCAoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIikpOworICBMV0lQX0RFQlVHRihVRFBfREVCVUcsICgifCAgICAgJTUiVTE2X0YiICAgICB8ICAgICAlNSJVMTZfRiIgICAgIHwgKHNyYyBwb3J0LCBkZXN0IHBvcnQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyh1ZHBoZHItPnNyYyksIG50b2hzKHVkcGhkci0+ZGVzdCkpKTsKKyAgTFdJUF9ERUJVR0YoVURQX0RFQlVHLCAoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIikpOworICBMV0lQX0RFQlVHRihVRFBfREVCVUcsICgifCAgICAgJTUiVTE2X0YiICAgICB8ICAgICAweCUwNCJYMTZfRiIgICAgfCAobGVuLCBjaGtzdW0pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyh1ZHBoZHItPmxlbiksIG50b2hzKHVkcGhkci0+Y2hrc3VtKSkpOworICBMV0lQX0RFQlVHRihVRFBfREVCVUcsICgiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKSk7Cit9CisjZW5kaWYgLyogVURQX0RFQlVHICovCisKKyNlbmRpZiAvKiBMV0lQX1VEUCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2FyY2gvY2MuaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9hcmNoL2NjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiMTNkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9hcmNoL2NjLmgKQEAgLTAsMCArMSw1MCBAQAorI2lmbmRlZiBfX0xXSVBfQVJDSF9DQ19IX18KKyNkZWZpbmUgX19MV0lQX0FSQ0hfQ0NfSF9fCisKKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxrYWJvb20uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorCit0eXBlZGVmIHVpbnQ4X3QgIHU4X3Q7Cit0eXBlZGVmIGludDhfdCAgIHM4X3Q7Cit0eXBlZGVmIHVpbnQxNl90IHUxNl90OwordHlwZWRlZiBpbnQxNl90ICBzMTZfdDsKK3R5cGVkZWYgdWludDMyX3QgdTMyX3Q7Cit0eXBlZGVmIGludDMyX3QgIHMzMl90OworCit0eXBlZGVmIHVpbnRwdHJfdCBtZW1fcHRyX3Q7CisKKyNkZWZpbmUgUEFDS19TVFJVQ1RfU1RSVUNUCV9fcGFja2VkCisKKyNkZWZpbmUgTFdJUF9QTEFURk9STV9VU0VfRFBSSU5URgorCisjaWZkZWYgTFdJUF9QTEFURk9STV9VU0VfRFBSSU5URgorIyAgaW5jbHVkZSA8ZHByaW50Zi5oPgorIyAgZGVmaW5lIExXSVBfUExBVEZPUk1fUFJJTlRGIGRwcmludGYKKyNlbHNlCisjICBkZWZpbmUgTFdJUF9QTEFURk9STV9QUklOVEYgcHJpbnRmCisjZW5kaWYKKworCisjaWYgMQorI2RlZmluZSBMV0lQX1BMQVRGT1JNX0RJQUcoeCkJZG8geyBMV0lQX1BMQVRGT1JNX1BSSU5URiB4OyB9IHdoaWxlKDApCisjZGVmaW5lIExXSVBfUExBVEZPUk1fQVNTRVJUKHgpCWRvIHsgTFdJUF9QTEFURk9STV9QUklOVEYoIkxXSVAoJXMsJWQsJXApOiAlcyIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCAoeCkpOyBrYWJvb20oKTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgTFdJUF9QTEFURk9STV9ESUFHKHgpCSgodm9pZCkwKSAvKiBGb3Igbm93Li4uICovCisjZGVmaW5lIExXSVBfUExBVEZPUk1fQVNTRVJUKHgpCWthYm9vbSgpCisjZW5kaWYKKworI2RlZmluZSBVMTZfRglQUkl1MTYKKyNkZWZpbmUgUzE2X0YJUFJJZDE2CisjZGVmaW5lIFgxNl9GCVBSSXgxNgorI2RlZmluZSBVMzJfRglQUkl1MTYKKyNkZWZpbmUgUzMyX0YJUFJJZDE2CisjZGVmaW5lIFgzMl9GCVBSSXgxNgorI2RlZmluZSBTWlRfRgkienUiCisKKyNlbmRpZiAvKiBfX0xXSVBfQVJDSF9DQ19IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9hcmNoL3BlcmYuaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9hcmNoL3BlcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2ViODUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2FyY2gvcGVyZi5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX0xXSVBfQVJDSF9QRVJGX0hfXworI2RlZmluZSBfX0xXSVBfQVJDSF9QRVJGX0hfXworCisjZGVmaW5lIFBFUkZfU1RBUlQKKyNkZWZpbmUgUEVSRl9TVE9QKHgpCisKKyNlbmRpZiAvKiBfX0xXSVBfQVJDSF9QRVJGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2FyY2gvc3lzX2FyY2guaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9hcmNoL3N5c19hcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyYTE5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9hcmNoL3N5c19hcmNoLmgKQEAgLTAsMCArMSw4NSBAQAorI2lmbmRlZiBfX0xXSVBfQVJDSF9TWVNfQVJDSF9IX18KKyNkZWZpbmUgX19MV0lQX0FSQ0hfU1lTX0FSQ0hfSF9fCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJhcmNoL2NjLmgiCisjaW5jbHVkZSA8dGhyZWFkLmg+CisjaW5jbHVkZSA8bWJveC5oPgorCit0eXBlZGVmIHN0cnVjdCBzZW1hcGhvcmUgKnN5c19zZW1fdDsKK3R5cGVkZWYgc3RydWN0IG1haWxib3ggICAqc3lzX21ib3hfdDsKK3R5cGVkZWYgc3RydWN0IHRocmVhZCAgICAqc3lzX3RocmVhZF90OworCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzX3NlbV9zaWduYWwoc3lzX3NlbV90ICpzZW0pCit7CisgICAgaWYgKCEhc2VtKQorCXNlbV91cCgqc2VtKTsKK30KKworI2RlZmluZSBzeXNfbm93IG1zX3RpbWVyCisKKyNkZWZpbmUgU1lTX01CT1hfTlVMTAlOVUxMCisjZGVmaW5lIFNZU19TRU1fTlVMTAlOVUxMCisKK2V4dGVybiB2b2lkIF9fY29tcGlsZV90aW1lX2Vycm9yKHZvaWQpOworCisjZGVmaW5lIFNZU19BUkNIX09QKHZhciwgdmFsLCBpbmMsIGFkZCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHZhbCkgJiYgKHZhbCkgPT0gMSkgewkJCVwKKwlzd2l0Y2ggKHNpemVvZih2YXIpKSB7CQkJCQkJXAorCWNhc2UgMToJCQkJCQkJCVwKKwkgICAgYXNtIHZvbGF0aWxlKGluYyAiYiAlMCIgOiAiK20iICh2YXIpKTsJCQlcCisJICAgIGJyZWFrOwkJCQkJCQlcCisJY2FzZSAyOgkJCQkJCQkJXAorCSAgICBhc20gdm9sYXRpbGUoaW5jICJ3ICUwIiA6ICIrbSIgKHZhcikpOwkJCVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKwljYXNlIDQ6CQkJCQkJCQlcCisJICAgIGFzbSB2b2xhdGlsZShpbmMgImwgJTAiIDogIittIiAodmFyKSk7CQkJXAorCSAgICBicmVhazsJCQkJCQkJXAorCWRlZmF1bHQ6CQkJCQkJCVwKKwkgICAgX19jb21waWxlX3RpbWVfZXJyb3IoKTsJCQkJCVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfSBlbHNlIHsJCQkJCQkJCVwKKwlzd2l0Y2ggKHNpemVvZih2YXIpKSB7CQkJCQkJXAorCWNhc2UgMToJCQkJCQkJCVwKKwkgICAgYXNtIHZvbGF0aWxlKGFkZCAiYiAlMSwlMCIgOiAiK20iICh2YXIpIDogInJpIiAodmFsKSk7CVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKwljYXNlIDI6CQkJCQkJCQlcCisJICAgIGFzbSB2b2xhdGlsZShhZGQgIncgJTEsJTAiIDogIittIiAodmFyKSA6ICJyaSIgKHZhbCkpOwlcCisJICAgIGJyZWFrOwkJCQkJCQlcCisJY2FzZSA0OgkJCQkJCQkJXAorCSAgICBhc20gdm9sYXRpbGUoYWRkICJsICUxLCUwIiA6ICIrbSIgKHZhcikgOiAicmkiICh2YWwpKTsJXAorCSAgICBicmVhazsJCQkJCQkJXAorCWRlZmF1bHQ6CQkJCQkJCVwKKwkgICAgX19jb21waWxlX3RpbWVfZXJyb3IoKTsJCQkJCVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN5c190aW1lb3V0cyAqc3lzX2FyY2hfdGltZW91dHModm9pZCkKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBzeXNfdGltZW91dHMgKikmY3VycmVudCgpLT5wdnQ7Cit9CisKKyNkZWZpbmUgU1lTX0FSQ0hfSU5DKHZhciwgdmFsKSBTWVNfQVJDSF9PUCh2YXIsIHZhbCwgImluYyIsICJhZGQiKQorI2RlZmluZSBTWVNfQVJDSF9ERUModmFyLCB2YWwpIFNZU19BUkNIX09QKHZhciwgdmFsLCAiZGVjIiwgInN1YiIpCisKKyNkZWZpbmUgU1lTX0FSQ0hfR0VUKHZhciwgcmV0KQkJCQkJXAorICAgIGRvIHsJCQkJCQkgCVwKKyAgICAgICAgdm9sYXRpbGUgX190eXBlb2ZfXyh2YXIpICogY29uc3QgX192YXJwID0gJih2YXIpOwlcCisgICAgCXJldCA9ICpfX3ZhcnA7CQkJCQkJXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgU1lTX0FSQ0hfU0VUKHZhciwgdmFsKQkJCQkJXAorICAgIGRvIHsJCQkJCQkgCVwKKyAgICAgICAgdm9sYXRpbGUgX190eXBlb2ZfXyh2YXIpICogY29uc3QgX192YXJwID0gJih2YXIpOwlcCisgICAgCSpfX3ZhcnAgPSB2YWw7CQkJCQkJXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgU1lTX0FSQ0hfREVDTF9QUk9URUNUKFZBUikgaXJxX3N0YXRlX3QgVkFSCisjZGVmaW5lIFNZU19BUkNIX1BST1RFQ1QoVkFSKSBWQVIgPSBpcnFfc2F2ZSgpCisjZGVmaW5lIFNZU19BUkNIX1VOUFJPVEVDVChWQVIpIGlycV9yZXN0b3JlKFZBUikKKworI2VuZGlmIC8qIF9fTFdJUF9BUkNIX1NZU19BUkNIX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9hdXRvaXAuaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9pcHY0L2x3aXAvYXV0b2lwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjMjY0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9pcHY0L2x3aXAvYXV0b2lwLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qKgorICogQGZpbGUKKyAqCisgKiBBdXRvSVAgQXV0b21hdGljIExpbmtMb2NhbCBJUCBDb25maWd1cmF0aW9uCisgKi8KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRG9taW5payBTcGllcyA8a29udGFrdEBkc3BpZXMuZGU+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yOiBEb21pbmlrIFNwaWVzIDxrb250YWt0QGRzcGllcy5kZT4KKyAqCisgKiBUaGlzIGlzIGEgQXV0b0lQIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suIEl0IGFpbXMgdG8gY29uZm9ybQorICogd2l0aCBSRkMgMzkyNy4KKyAqCisgKgorICogUGxlYXNlIGNvb3JkaW5hdGUgY2hhbmdlcyBhbmQgcmVxdWVzdHMgd2l0aCBEb21pbmlrIFNwaWVzCisgKiA8a29udGFrdEBkc3BpZXMuZGU+CisgKi8KKyAKKyNpZm5kZWYgX19MV0lQX0FVVE9JUF9IX18KKyNkZWZpbmUgX19MV0lQX0FVVE9JUF9IX18KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX0FVVE9JUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKyNpbmNsdWRlICJsd2lwL3VkcC5oIgorI2luY2x1ZGUgIm5ldGlmL2V0aGFycC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEF1dG9JUCBUaW1pbmcgKi8KKyNkZWZpbmUgQVVUT0lQX1RNUl9JTlRFUlZBTCAgICAgIDEwMAorI2RlZmluZSBBVVRPSVBfVElDS1NfUEVSX1NFQ09ORCAoMTAwMCAvIEFVVE9JUF9UTVJfSU5URVJWQUwpCisKKy8qIFJGQyAzOTI3IENvbnN0YW50cyAqLworI2RlZmluZSBQUk9CRV9XQUlUICAgICAgICAgICAgICAgMSAgIC8qIHNlY29uZCAgIChpbml0aWFsIHJhbmRvbSBkZWxheSkgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBST0JFX01JTiAgICAgICAgICAgICAgICAxICAgLyogc2Vjb25kICAgKG1pbmltdW0gZGVsYXkgdGlsbCByZXBlYXRlZCBwcm9iZSkgICAgKi8KKyNkZWZpbmUgUFJPQkVfTUFYICAgICAgICAgICAgICAgIDIgICAvKiBzZWNvbmRzICAobWF4aW11bSBkZWxheSB0aWxsIHJlcGVhdGVkIHByb2JlKSAgICAqLworI2RlZmluZSBQUk9CRV9OVU0gICAgICAgICAgICAgICAgMyAgIC8qICAgICAgICAgIChudW1iZXIgb2YgcHJvYmUgcGFja2V0cykgICAgICAgICAgICAgICovCisjZGVmaW5lIEFOTk9VTkNFX05VTSAgICAgICAgICAgICAyICAgLyogICAgICAgICAgKG51bWJlciBvZiBhbm5vdW5jZW1lbnQgcGFja2V0cykgICAgICAgKi8KKyNkZWZpbmUgQU5OT1VOQ0VfSU5URVJWQUwgICAgICAgIDIgICAvKiBzZWNvbmRzICAodGltZSBiZXR3ZWVuIGFubm91bmNlbWVudCBwYWNrZXRzKSAgICAqLworI2RlZmluZSBBTk5PVU5DRV9XQUlUICAgICAgICAgICAgMiAgIC8qIHNlY29uZHMgIChkZWxheSBiZWZvcmUgYW5ub3VuY2luZykgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWF9DT05GTElDVFMgICAgICAgICAgICAxMCAgLyogICAgICAgICAgKG1heCBjb25mbGljdHMgYmVmb3JlIHJhdGUgbGltaXRpbmcpICAgKi8KKyNkZWZpbmUgUkFURV9MSU1JVF9JTlRFUlZBTCAgICAgIDYwICAvKiBzZWNvbmRzICAoZGVsYXkgYmV0d2VlbiBzdWNjZXNzaXZlIGF0dGVtcHRzKSAgICAqLworI2RlZmluZSBERUZFTkRfSU5URVJWQUwgICAgICAgICAgMTAgIC8qIHNlY29uZHMgIChtaW4uIHdhaXQgYmV0d2VlbiBkZWZlbnNpdmUgQVJQcykgICAgICovCisKKy8qIEF1dG9JUCBjbGllbnQgc3RhdGVzICovCisjZGVmaW5lIEFVVE9JUF9TVEFURV9PRkYgICAgICAgICAwCisjZGVmaW5lIEFVVE9JUF9TVEFURV9QUk9CSU5HICAgICAxCisjZGVmaW5lIEFVVE9JUF9TVEFURV9BTk5PVU5DSU5HICAyCisjZGVmaW5lIEFVVE9JUF9TVEFURV9CT1VORCAgICAgICAzCisKK3N0cnVjdCBhdXRvaXAKK3sKKyAgaXBfYWRkcl90IGxsaXBhZGRyOyAgICAgICAvKiB0aGUgY3VycmVudGx5IHNlbGVjdGVkLCBwcm9iZWQsIGFubm91bmNlZCBvciB1c2VkIExMIElQLUFkZHJlc3MgKi8KKyAgdThfdCBzdGF0ZTsgICAgICAgICAgICAgICAvKiBjdXJyZW50IEF1dG9JUCBzdGF0ZSBtYWNoaW5lIHN0YXRlICovCisgIHU4X3Qgc2VudF9udW07ICAgICAgICAgICAgLyogc2VudCBudW1iZXIgb2YgcHJvYmVzIG9yIGFubm91bmNlcywgZGVwZW5kZW50IG9uIHN0YXRlICovCisgIHUxNl90IHR0dzsgICAgICAgICAgICAgICAgLyogdGlja3MgdG8gd2FpdCwgdGljayBpcyBBVVRPSVBfVE1SX0lOVEVSVkFMIGxvbmcgKi8KKyAgdThfdCBsYXN0Y29uZmxpY3Q7ICAgICAgICAvKiB0aWNrcyB1bnRpbCBhIGNvbmZsaWN0IGNhbiBiZSBzb2x2ZWQgYnkgZGVmZW5kaW5nICovCisgIHU4X3QgdHJpZWRfbGxpcGFkZHI7ICAgICAgLyogdG90YWwgbnVtYmVyIG9mIHByb2JlZC91c2VkIExpbmsgTG9jYWwgSVAtQWRkcmVzc2VzICovCit9OworCisKKy8qKiBJbml0IHNyYW5kLCBoYXMgdG8gYmUgY2FsbGVkIGJlZm9yZSBlbnRlcmluZyBtYWlubG9vcCAqLwordm9pZCBhdXRvaXBfaW5pdCh2b2lkKTsKKworLyoqIFNldCBhIHN0cnVjdCBhdXRvaXAgYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byB3b3JrIHdpdGggKi8KK3ZvaWQgYXV0b2lwX3NldF9zdHJ1Y3Qoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IGF1dG9pcCAqYXV0b2lwKTsKKworLyoqIFN0YXJ0IEF1dG9JUCBjbGllbnQgKi8KK2Vycl90IGF1dG9pcF9zdGFydChzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKKworLyoqIFN0b3AgQXV0b0lQIGNsaWVudCAqLworZXJyX3QgYXV0b2lwX3N0b3Aoc3RydWN0IG5ldGlmICpuZXRpZik7CisKKy8qKiBIYW5kbGVzIGV2ZXJ5IGluY29taW5nIEFSUCBQYWNrZXQsIGNhbGxlZCBieSBldGhhcnBfYXJwX2lucHV0ICovCit2b2lkIGF1dG9pcF9hcnBfcmVwbHkoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IGV0aGFycF9oZHIgKmhkcik7CisKKy8qKiBIYXMgdG8gYmUgY2FsbGVkIGluIGxvb3AgZXZlcnkgQVVUT0lQX1RNUl9JTlRFUlZBTCBtaWxsaXNlY29uZHMgKi8KK3ZvaWQgYXV0b2lwX3Rtcih2b2lkKTsKKworLyoqIEhhbmRsZSBhIHBvc3NpYmxlIGNoYW5nZSBpbiB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uICovCit2b2lkIGF1dG9pcF9uZXR3b3JrX2NoYW5nZWQoc3RydWN0IG5ldGlmICpuZXRpZik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBMV0lQX0FVVE9JUCAqLworCisjZW5kaWYgLyogX19MV0lQX0FVVE9JUF9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9pcHY0L2x3aXAvaWNtcC5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pY21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3YTdkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9pcHY0L2x3aXAvaWNtcC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfSUNNUF9IX18KKyNkZWZpbmUgX19MV0lQX0lDTVBfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorI2luY2x1ZGUgImx3aXAvcGJ1Zi5oIgorI2luY2x1ZGUgImx3aXAvaXBfYWRkci5oIgorI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIElDTVBfRVIgICAwICAgIC8qIGVjaG8gcmVwbHkgKi8KKyNkZWZpbmUgSUNNUF9EVVIgIDMgICAgLyogZGVzdGluYXRpb24gdW5yZWFjaGFibGUgKi8KKyNkZWZpbmUgSUNNUF9TUSAgIDQgICAgLyogc291cmNlIHF1ZW5jaCAqLworI2RlZmluZSBJQ01QX1JEICAgNSAgICAvKiByZWRpcmVjdCAqLworI2RlZmluZSBJQ01QX0VDSE8gOCAgICAvKiBlY2hvICovCisjZGVmaW5lIElDTVBfVEUgIDExICAgIC8qIHRpbWUgZXhjZWVkZWQgKi8KKyNkZWZpbmUgSUNNUF9QUCAgMTIgICAgLyogcGFyYW1ldGVyIHByb2JsZW0gKi8KKyNkZWZpbmUgSUNNUF9UUyAgMTMgICAgLyogdGltZXN0YW1wICovCisjZGVmaW5lIElDTVBfVFNSIDE0ICAgIC8qIHRpbWVzdGFtcCByZXBseSAqLworI2RlZmluZSBJQ01QX0lSUSAxNSAgICAvKiBpbmZvcm1hdGlvbiByZXF1ZXN0ICovCisjZGVmaW5lIElDTVBfSVIgIDE2ICAgIC8qIGluZm9ybWF0aW9uIHJlcGx5ICovCisKK2VudW0gaWNtcF9kdXJfdHlwZSB7CisgIElDTVBfRFVSX05FVCAgID0gMCwgIC8qIG5ldCB1bnJlYWNoYWJsZSAqLworICBJQ01QX0RVUl9IT1NUICA9IDEsICAvKiBob3N0IHVucmVhY2hhYmxlICovCisgIElDTVBfRFVSX1BST1RPID0gMiwgIC8qIHByb3RvY29sIHVucmVhY2hhYmxlICovCisgIElDTVBfRFVSX1BPUlQgID0gMywgIC8qIHBvcnQgdW5yZWFjaGFibGUgKi8KKyAgSUNNUF9EVVJfRlJBRyAgPSA0LCAgLyogZnJhZ21lbnRhdGlvbiBuZWVkZWQgYW5kIERGIHNldCAqLworICBJQ01QX0RVUl9TUiAgICA9IDUgICAvKiBzb3VyY2Ugcm91dGUgZmFpbGVkICovCit9OworCitlbnVtIGljbXBfdGVfdHlwZSB7CisgIElDTVBfVEVfVFRMICA9IDAsICAgIC8qIHRpbWUgdG8gbGl2ZSBleGNlZWRlZCBpbiB0cmFuc2l0ICovCisgIElDTVBfVEVfRlJBRyA9IDEgICAgIC8qIGZyYWdtZW50IHJlYXNzZW1ibHkgdGltZSBleGNlZWRlZCAqLworfTsKKworI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9icHN0cnVjdC5oIgorI2VuZGlmCisvKiogVGhpcyBpcyB0aGUgc3RhbmRhcmQgSUNNUCBoZWFkZXIgb25seSB0aGF0IHRoZSB1MzJfdCBkYXRhCisgKiAgaXMgc3BsaXR0ZWQgdG8gdHdvIHUxNl90IGxpa2UgSUNNUCBlY2hvIG5lZWRzIGl0LgorICogIFRoaXMgaGVhZGVyIGlzIGFsc28gdXNlZCBmb3Igb3RoZXIgSUNNUCB0eXBlcyB0aGF0IGRvIG5vdAorICogIHVzZSB0aGUgZGF0YSBwYXJ0LgorICovCitQQUNLX1NUUlVDVF9CRUdJTgorc3RydWN0IGljbXBfZWNob19oZHIgeworICBQQUNLX1NUUlVDVF9GSUVMRCh1OF90IHR5cGUpOworICBQQUNLX1NUUlVDVF9GSUVMRCh1OF90IGNvZGUpOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBjaGtzdW0pOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBpZCk7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IHNlcW5vKTsKK30gUEFDS19TVFJVQ1RfU1RSVUNUOworUEFDS19TVFJVQ1RfRU5ECisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Vwc3RydWN0LmgiCisjZW5kaWYKKworI2RlZmluZSBJQ01QSF9UWVBFKGhkcikgKChoZHIpLT50eXBlKQorI2RlZmluZSBJQ01QSF9DT0RFKGhkcikgKChoZHIpLT5jb2RlKQorCisvKiogQ29tYmluZXMgdHlwZSBhbmQgY29kZSB0byBhbiB1MTZfdCAqLworI2RlZmluZSBJQ01QSF9UWVBFX1NFVChoZHIsIHQpICgoaGRyKS0+dHlwZSA9ICh0KSkKKyNkZWZpbmUgSUNNUEhfQ09ERV9TRVQoaGRyLCBjKSAoKGhkciktPmNvZGUgPSAoYykpCisKKworI2lmIExXSVBfSUNNUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKwordm9pZCBpY21wX2lucHV0KHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKmlucCk7Cit2b2lkIGljbXBfZGVzdF91bnJlYWNoKHN0cnVjdCBwYnVmICpwLCBlbnVtIGljbXBfZHVyX3R5cGUgdCk7Cit2b2lkIGljbXBfdGltZV9leGNlZWRlZChzdHJ1Y3QgcGJ1ZiAqcCwgZW51bSBpY21wX3RlX3R5cGUgdCk7CisKKyNlbmRpZiAvKiBMV0lQX0lDTVAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTFdJUF9JQ01QX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pZ21wLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvaXB2NC9sd2lwL2lnbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWFiYWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pZ21wLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgQ0lURUwgVGVjaG5vbG9naWVzIEx0ZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAorICogYXJlIG1ldDogCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgQ0lURUwgVGVjaG5vbG9naWVzIEx0ZCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBDSVRFTCBURUNITk9MT0dJRVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQ0lURUwgVEVDSE5PTE9HSUVTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIAorICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIAorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiAKKyAqIFNVQ0ggREFNQUdFLiAKKyAqCisgKiBUaGlzIGZpbGUgaXMgYSBjb250cmlidXRpb24gdG8gdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogVGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UgYW5kIEFkYW0gRHVua2VscworICogYXJlIHNwZWNpZmljYWxseSBncmFudGVkIHBlcm1pc3Npb24gdG8gcmVkaXN0cmlidXRlIHRoaXMKKyAqIHNvdXJjZSBjb2RlLgorKi8KKworI2lmbmRlZiBfX0xXSVBfSUdNUF9IX18KKyNkZWZpbmUgX19MV0lQX0lHTVBfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorI2luY2x1ZGUgImx3aXAvaXBfYWRkci5oIgorI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKworI2lmIExXSVBfSUdNUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIElHTVAgdGltZXIgKi8KKyNkZWZpbmUgSUdNUF9UTVJfSU5URVJWQUwgICAgICAgICAgICAgIDEwMCAvKiBNaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgSUdNUF9WMV9ERUxBWUlOR19NRU1CRVJfVE1SICAgKDEwMDAvSUdNUF9UTVJfSU5URVJWQUwpCisjZGVmaW5lIElHTVBfSk9JTl9ERUxBWUlOR19NRU1CRVJfVE1SICg1MDAgL0lHTVBfVE1SX0lOVEVSVkFMKQorCisvKiBNQUMgRmlsdGVyIEFjdGlvbnMsIHRoZXNlIGFyZSBwYXNzZWQgdG8gYSBuZXRpZidzCisgKiBpZ21wX21hY19maWx0ZXIgY2FsbGJhY2sgZnVuY3Rpb24uICovCisjZGVmaW5lIElHTVBfREVMX01BQ19GSUxURVIgICAgICAgICAgICAwCisjZGVmaW5lIElHTVBfQUREX01BQ19GSUxURVIgICAgICAgICAgICAxCisKKworLyoqCisgKiBpZ21wIGdyb3VwIHN0cnVjdHVyZSAtIHRoZXJlIGlzCisgKiBhIGxpc3Qgb2YgZ3JvdXBzIGZvciBlYWNoIGludGVyZmFjZQorICogdGhlc2Ugc2hvdWxkIHJlYWxseSBiZSBsaW5rZWQgZnJvbSB0aGUgaW50ZXJmYWNlLCBidXQKKyAqIGlmIHdlIGtlZXAgdGhlbSBzZXBhcmF0ZSB3ZSB3aWxsIG5vdCBhZmZlY3QgdGhlIGx3aXAgb3JpZ2luYWwgY29kZQorICogdG9vIG11Y2gKKyAqIAorICogVGhlcmUgd2lsbCBiZSBhIGdyb3VwIGZvciB0aGUgYWxsIHN5c3RlbXMgZ3JvdXAgYWRkcmVzcyBidXQgdGhpcyAKKyAqIHdpbGwgbm90IHJ1biB0aGUgc3RhdGUgbWFjaGluZSBhcyBpdCBpcyB1c2VkIHRvIGtpY2sgb2ZmIHJlcG9ydHMKKyAqIGZyb20gYWxsIHRoZSBvdGhlciBncm91cHMKKyAqLworc3RydWN0IGlnbXBfZ3JvdXAgeworICAvKiogbmV4dCBsaW5rICovCisgIHN0cnVjdCBpZ21wX2dyb3VwICpuZXh0OworICAvKiogaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBncm91cCBpcyBhY3RpdmUgKi8KKyAgc3RydWN0IG5ldGlmICAgICAgKm5ldGlmOworICAvKiogbXVsdGljYXN0IGFkZHJlc3MgKi8KKyAgaXBfYWRkcl90ICAgICAgICAgIGdyb3VwX2FkZHJlc3M7CisgIC8qKiBzaWduaWZpZXMgd2Ugd2VyZSB0aGUgbGFzdCBwZXJzb24gdG8gcmVwb3J0ICovCisgIHU4X3QgICAgICAgICAgICAgICBsYXN0X3JlcG9ydGVyX2ZsYWc7CisgIC8qKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBncm91cCAqLworICB1OF90ICAgICAgICAgICAgICAgZ3JvdXBfc3RhdGU7CisgIC8qKiB0aW1lciBmb3IgcmVwb3J0aW5nLCBuZWdhdGl2ZSBpcyBPRkYgKi8KKyAgdTE2X3QgICAgICAgICAgICAgIHRpbWVyOworICAvKiogY291bnRlciBvZiBzaW11bHRhbmVvdXMgdXNlcyAqLworICB1OF90ICAgICAgICAgICAgICAgdXNlOworfTsKKworLyogIFByb3RvdHlwZXMgKi8KK3ZvaWQgICBpZ21wX2luaXQodm9pZCk7CitlcnJfdCAgaWdtcF9zdGFydChzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKK2Vycl90ICBpZ21wX3N0b3Aoc3RydWN0IG5ldGlmICpuZXRpZik7Cit2b2lkICAgaWdtcF9yZXBvcnRfZ3JvdXBzKHN0cnVjdCBuZXRpZiAqbmV0aWYpOworc3RydWN0IGlnbXBfZ3JvdXAgKmlnbXBfbG9va2Zvcl9ncm91cChzdHJ1Y3QgbmV0aWYgKmlmcCwgaXBfYWRkcl90ICphZGRyKTsKK3ZvaWQgICBpZ21wX2lucHV0KHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKmlucCwgaXBfYWRkcl90ICpkZXN0KTsKK2Vycl90ICBpZ21wX2pvaW5ncm91cChpcF9hZGRyX3QgKmlmYWRkciwgaXBfYWRkcl90ICpncm91cGFkZHIpOworZXJyX3QgIGlnbXBfbGVhdmVncm91cChpcF9hZGRyX3QgKmlmYWRkciwgaXBfYWRkcl90ICpncm91cGFkZHIpOwordm9pZCAgIGlnbXBfdG1yKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTFdJUF9JR01QICovCisKKyNlbmRpZiAvKiBfX0xXSVBfSUdNUF9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9pcHY0L2x3aXAvaW5ldC5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxM2M3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9pcHY0L2x3aXAvaW5ldC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfSU5FVF9IX18KKyNkZWZpbmUgX19MV0lQX0lORVRfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorI2luY2x1ZGUgImx3aXAvZGVmLmgiCisjaW5jbHVkZSAibHdpcC9pcF9hZGRyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggQlNEIGNvZGUgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKy8qKiAyNTUuMjU1LjI1NS4yNTUgKi8KKyNkZWZpbmUgSU5BRERSX05PTkUgICAgICAgICBJUEFERFJfTk9ORQorLyoqIDEyNy4wLjAuMSAqLworI2RlZmluZSBJTkFERFJfTE9PUEJBQ0sgICAgIElQQUREUl9MT09QQkFDSworLyoqIDAuMC4wLjAgKi8KKyNkZWZpbmUgSU5BRERSX0FOWSAgICAgICAgICBJUEFERFJfQU5ZCisvKiogMjU1LjI1NS4yNTUuMjU1ICovCisjZGVmaW5lIElOQUREUl9CUk9BRENBU1QgICAgSVBBRERSX0JST0FEQ0FTVAorCisvKiBEZWZpbml0aW9ucyBvZiB0aGUgYml0cyBpbiBhbiBJbnRlcm5ldCBhZGRyZXNzIGludGVnZXIuCisKKyAgIE9uIHN1Ym5ldHMsIGhvc3QgYW5kIG5ldHdvcmsgcGFydHMgYXJlIGZvdW5kIGFjY29yZGluZyB0bworICAgdGhlIHN1Ym5ldCBtYXNrLCBub3QgdGhlc2UgbWFza3MuICAqLworI2RlZmluZSBJTl9DTEFTU0EoYSkgICAgICAgIElQX0NMQVNTQShhKQorI2RlZmluZSBJTl9DTEFTU0FfTkVUICAgICAgIElQX0NMQVNTQV9ORVQKKyNkZWZpbmUgSU5fQ0xBU1NBX05TSElGVCAgICBJUF9DTEFTU0FfTlNISUZUCisjZGVmaW5lIElOX0NMQVNTQV9IT1NUICAgICAgSVBfQ0xBU1NBX0hPU1QKKyNkZWZpbmUgSU5fQ0xBU1NBX01BWCAgICAgICBJUF9DTEFTU0FfTUFYCisKKyNkZWZpbmUgSU5fQ0xBU1NCKGIpICAgICAgICBJUF9DTEFTU0IoYikKKyNkZWZpbmUgSU5fQ0xBU1NCX05FVCAgICAgICBJUF9DTEFTU0JfTkVUCisjZGVmaW5lIElOX0NMQVNTQl9OU0hJRlQgICAgSVBfQ0xBU1NCX05TSElGVAorI2RlZmluZSBJTl9DTEFTU0JfSE9TVCAgICAgIElQX0NMQVNTQl9IT1NUCisjZGVmaW5lIElOX0NMQVNTQl9NQVggICAgICAgSVBfQ0xBU1NCX01BWAorCisjZGVmaW5lIElOX0NMQVNTQyhjKSAgICAgICAgSVBfQ0xBU1NDKGMpCisjZGVmaW5lIElOX0NMQVNTQ19ORVQgICAgICAgSVBfQ0xBU1NDX05FVAorI2RlZmluZSBJTl9DTEFTU0NfTlNISUZUICAgIElQX0NMQVNTQ19OU0hJRlQKKyNkZWZpbmUgSU5fQ0xBU1NDX0hPU1QgICAgICBJUF9DTEFTU0NfSE9TVAorI2RlZmluZSBJTl9DTEFTU0NfTUFYICAgICAgIElQX0NMQVNTQ19NQVgKKworI2RlZmluZSBJTl9DTEFTU0QoZCkgICAgICAgIElQX0NMQVNTRChkKQorI2RlZmluZSBJTl9DTEFTU0RfTkVUICAgICAgIElQX0NMQVNTRF9ORVQgICAgIC8qIFRoZXNlIG9uZXMgYXJlbid0IHJlYWxseSAqLworI2RlZmluZSBJTl9DTEFTU0RfTlNISUZUICAgIElQX0NMQVNTRF9OU0hJRlQgIC8qICAgbmV0IGFuZCBob3N0IGZpZWxkcywgYnV0ICovCisjZGVmaW5lIElOX0NMQVNTRF9IT1NUICAgICAgSVBfQ0xBU1NEX0hPU1QgICAgLyogICByb3V0aW5nIG5lZWRuJ3Qga25vdy4gKi8KKyNkZWZpbmUgSU5fQ0xBU1NEX01BWCAgICAgICBJUF9DTEFTU0RfTUFYCisKKyNkZWZpbmUgSU5fTVVMVElDQVNUKGEpICAgICBJUF9NVUxUSUNBU1QoYSkKKworI2RlZmluZSBJTl9FWFBFUklNRU5UQUwoYSkgIElQX0VYUEVSSU1FTlRBTChhKQorI2RlZmluZSBJTl9CQURDTEFTUyhhKSAgICAgIElQX0JBRENMQVNTKGEpCisKKyNkZWZpbmUgSU5fTE9PUEJBQ0tORVQgICAgICBJUF9MT09QQkFDS05FVAorCisjZGVmaW5lIGluZXRfYWRkcl9mcm9tX2lwYWRkcih0YXJnZXRfaW5hZGRyLCBzb3VyY2VfaXBhZGRyKSAoKHRhcmdldF9pbmFkZHIpLT5zX2FkZHIgPSBpcDRfYWRkcl9nZXRfdTMyKHNvdXJjZV9pcGFkZHIpKQorI2RlZmluZSBpbmV0X2FkZHJfdG9faXBhZGRyKHRhcmdldF9pcGFkZHIsIHNvdXJjZV9pbmFkZHIpICAgKGlwNF9hZGRyX3NldF91MzIodGFyZ2V0X2lwYWRkciwgKHNvdXJjZV9pbmFkZHIpLT5zX2FkZHIpKQorLyogQVRURU5USU9OOiB0aGUgbmV4dCBkZWZpbmUgb25seSB3b3JrcyBiZWNhdXNlIGJvdGggc19hZGRyIGFuZCBpcF9hZGRyX3QgYXJlIGFuIHUzMl90IGVmZmVjdGl2ZWx5ISAqLworI2RlZmluZSBpbmV0X2FkZHJfdG9faXBhZGRyX3AodGFyZ2V0X2lwYWRkcl9wLCBzb3VyY2VfaW5hZGRyKSAgICgodGFyZ2V0X2lwYWRkcl9wKSA9IChpcF9hZGRyX3QqKSYoKHNvdXJjZV9pbmFkZHIpLT5zX2FkZHIpKQorCisvKiBkaXJlY3RseSBtYXAgdGhpcyB0byB0aGUgbHdpcCBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgaW5ldF9hZGRyKGNwKSAgICAgICAgIGlwYWRkcl9hZGRyKGNwKQorI2RlZmluZSBpbmV0X2F0b24oY3AsIGFkZHIpICAgaXBhZGRyX2F0b24oY3AsIChpcF9hZGRyX3QqKWFkZHIpCisjZGVmaW5lIGluZXRfbnRvYShhZGRyKSAgICAgICBpcGFkZHJfbnRvYSgoaXBfYWRkcl90KikmKGFkZHIpKQorI2RlZmluZSBpbmV0X250b2FfcihhZGRyLCBidWYsIGJ1ZmxlbikgaXBhZGRyX250b2FfcigoaXBfYWRkcl90KikmKGFkZHIpLCBidWYsIGJ1ZmxlbikKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTFdJUF9JTkVUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pbmV0X2Noa3N1bS5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pbmV0X2Noa3N1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YTJkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvaXB2NC9sd2lwL2luZXRfY2hrc3VtLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKyNpZm5kZWYgX19MV0lQX0lORVRfQ0hLU1VNX0hfXworI2RlZmluZSBfX0xXSVBfSU5FVF9DSEtTVU1fSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaW5jbHVkZSAibHdpcC9wYnVmLmgiCisjaW5jbHVkZSAibHdpcC9pcF9hZGRyLmgiCisKKy8qKiBTd2FwIHRoZSBieXRlcyBpbiBhbiB1MTZfdDogbXVjaCBsaWtlIGh0b25zKCkgZm9yIGxpdHRsZS1lbmRpYW4gKi8KKyNpZm5kZWYgU1dBUF9CWVRFU19JTl9XT1JECisjaWYgTFdJUF9QTEFURk9STV9CWVRFU1dBUCAmJiAoQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKQorLyogbGl0dGxlIGVuZGlhbiBhbmQgUExBVEZPUk1fQllURVNXQVAgZGVmaW5lZCAqLworI2RlZmluZSBTV0FQX0JZVEVTX0lOX1dPUkQodykgTFdJUF9QTEFURk9STV9IVE9OUyh3KQorI2Vsc2UgLyogTFdJUF9QTEFURk9STV9CWVRFU1dBUCAmJiAoQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSAqLworLyogY2FuJ3QgdXNlIGh0b25zIG9uIGJpZyBlbmRpYW4gKG9yIFBMQVRGT1JNX0JZVEVTV0FQIG5vdCBkZWZpbmVkKS4uLiAqLworI2RlZmluZSBTV0FQX0JZVEVTX0lOX1dPUkQodykgKCgodykgJiAweGZmKSA8PCA4KSB8ICgoKHcpICYgMHhmZjAwKSA+PiA4KQorI2VuZGlmIC8qIExXSVBfUExBVEZPUk1fQllURVNXQVAgJiYgKEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikqLworI2VuZGlmIC8qIFNXQVBfQllURVNfSU5fV09SRCAqLworCisvKiogU3BsaXQgYW4gdTMyX3QgaW4gdHdvIHUxNl90cyBhbmQgYWRkIHRoZW0gdXAgKi8KKyNpZm5kZWYgRk9MRF9VMzJUCisjZGVmaW5lIEZPTERfVTMyVCh1KSAgICAgICAgICAoKCh1KSA+PiAxNikgKyAoKHUpICYgMHgwMDAwZmZmZlVMKSkKKyNlbmRpZgorCisjaWYgTFdJUF9DSEVDS1NVTV9PTl9DT1BZCisvKiogRnVuY3Rpb24tbGlrZSBtYWNybzogc2FtZSBhcyBNRU1DUFkgYnV0IHJldHVybnMgdGhlIGNoZWNrc3VtIG9mIGNvcGllZCBkYXRhCisgICAgYXMgdTE2X3QgKi8KKyNpZm5kZWYgTFdJUF9DSEtTVU1fQ09QWQorI2RlZmluZSBMV0lQX0NIS1NVTV9DT1BZKGRzdCwgc3JjLCBsZW4pIGx3aXBfY2hrc3VtX2NvcHkoZHN0LCBzcmMsIGxlbikKKyNpZm5kZWYgTFdJUF9DSEtTVU1fQ09QWV9BTEdPUklUSE0KKyNkZWZpbmUgTFdJUF9DSEtTVU1fQ09QWV9BTEdPUklUSE0gMQorI2VuZGlmIC8qIExXSVBfQ0hLU1VNX0NPUFlfQUxHT1JJVEhNICovCisjZW5kaWYgLyogTFdJUF9DSEtTVU1fQ09QWSAqLworI2Vsc2UgLyogTFdJUF9DSEVDS1NVTV9PTl9DT1BZICovCisjZGVmaW5lIExXSVBfQ0hLU1VNX0NPUFlfQUxHT1JJVEhNIDAKKyNlbmRpZiAvKiBMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit1MTZfdCBpbmV0X2Noa3N1bSh2b2lkICpkYXRhcHRyLCB1MTZfdCBsZW4pOwordTE2X3QgaW5ldF9jaGtzdW1fcGJ1ZihzdHJ1Y3QgcGJ1ZiAqcCk7Cit1MTZfdCBpbmV0X2Noa3N1bV9wc2V1ZG8oc3RydWN0IHBidWYgKnAsCisgICAgICAgaXBfYWRkcl90ICpzcmMsIGlwX2FkZHJfdCAqZGVzdCwKKyAgICAgICB1OF90IHByb3RvLCB1MTZfdCBwcm90b19sZW4pOwordTE2X3QgaW5ldF9jaGtzdW1fcHNldWRvX3BhcnRpYWwoc3RydWN0IHBidWYgKnAsCisgICAgICAgaXBfYWRkcl90ICpzcmMsIGlwX2FkZHJfdCAqZGVzdCwKKyAgICAgICB1OF90IHByb3RvLCB1MTZfdCBwcm90b19sZW4sIHUxNl90IGNoa3N1bV9sZW4pOworI2lmIExXSVBfQ0hLU1VNX0NPUFlfQUxHT1JJVEhNCit1MTZfdCBsd2lwX2Noa3N1bV9jb3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCB1MTZfdCBsZW4pOworI2VuZGlmIC8qIExXSVBfQ0hLU1VNX0NPUFlfQUxHT1JJVEhNICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXSVBfSU5FVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pcC5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZjUwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvaXB2NC9sd2lwL2lwLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisjaWZuZGVmIF9fTFdJUF9JUF9IX18KKyNkZWZpbmUgX19MV0lQX0lQX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2luY2x1ZGUgImx3aXAvZGVmLmgiCisjaW5jbHVkZSAibHdpcC9wYnVmLmgiCisjaW5jbHVkZSAibHdpcC9pcF9hZGRyLmgiCisjaW5jbHVkZSAibHdpcC9lcnIuaCIKKyNpbmNsdWRlICJsd2lwL25ldGlmLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEN1cnJlbnRseSwgdGhlIGZ1bmN0aW9uIGlwX291dHB1dF9pZl9vcHQoKSBpcyBvbmx5IHVzZWQgd2l0aCBJR01QICovCisjZGVmaW5lIElQX09QVElPTlNfU0VORCAgIExXSVBfSUdNUAorCisjZGVmaW5lIElQX0hMRU4gMjAKKworI2RlZmluZSBJUF9QUk9UT19JQ01QICAgIDEKKyNkZWZpbmUgSVBfUFJPVE9fSUdNUCAgICAyCisjZGVmaW5lIElQX1BST1RPX1VEUCAgICAgMTcKKyNkZWZpbmUgSVBfUFJPVE9fVURQTElURSAxMzYKKyNkZWZpbmUgSVBfUFJPVE9fVENQICAgICA2CisKKy8qIFRoaXMgaXMgcGFzc2VkIGFzIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHRvIGlwX291dHB1dF9pZiAobm90CisgICB0byBpcF9vdXRwdXQpLCBtZWFuaW5nIHRoYXQgYW4gSVAgaGVhZGVyIGFscmVhZHkgaXMgY29uc3RydWN0ZWQKKyAgIGluIHRoZSBwYnVmLiBUaGlzIGlzIHVzZWQgd2hlbiBUQ1AgcmV0cmFuc21pdHMuICovCisjaWZkZWYgSVBfSERSSU5DTAorI3VuZGVmIElQX0hEUklOQ0wKKyNlbmRpZiAvKiBJUF9IRFJJTkNMICovCisjZGVmaW5lIElQX0hEUklOQ0wgIE5VTEwKKworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorI2RlZmluZSBJUF9QQ0JfQUREUkhJTlQgO3U4X3QgYWRkcl9oaW50CisjZWxzZQorI2RlZmluZSBJUF9QQ0JfQUREUkhJTlQKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKworLyogVGhpcyBpcyB0aGUgY29tbW9uIHBhcnQgb2YgYWxsIFBDQiB0eXBlcy4gSXQgbmVlZHMgdG8gYmUgYXQgdGhlCisgICBiZWdpbm5pbmcgb2YgYSBQQ0IgdHlwZSBkZWZpbml0aW9uLiBJdCBpcyBsb2NhdGVkIGhlcmUgc28gdGhhdAorICAgY2hhbmdlcyB0byB0aGlzIGNvbW1vbiBwYXJ0IGFyZSBtYWRlIGluIG9uZSBsb2NhdGlvbiBpbnN0ZWFkIG9mCisgICBoYXZpbmcgdG8gY2hhbmdlIGFsbCBQQ0Igc3RydWN0cy4gKi8KKyNkZWZpbmUgSVBfUENCIFwKKyAgLyogaXAgYWRkcmVzc2VzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLyBcCisgIGlwX2FkZHJfdCBsb2NhbF9pcDsgXAorICBpcF9hZGRyX3QgcmVtb3RlX2lwOyBcCisgICAvKiBTb2NrZXQgb3B0aW9ucyAqLyAgXAorICB1OF90IHNvX29wdGlvbnM7ICAgICAgXAorICAgLyogVHlwZSBPZiBTZXJ2aWNlICovIFwKKyAgdThfdCB0b3M7ICAgICAgICAgICAgICBcCisgIC8qIFRpbWUgVG8gTGl2ZSAqLyAgICAgXAorICB1OF90IHR0bCAgICAgICAgICAgICAgIFwKKyAgLyogbGluayBsYXllciBhZGRyZXNzIHJlc29sdXRpb24gaGludCAqLyBcCisgIElQX1BDQl9BRERSSElOVAorCitzdHJ1Y3QgaXBfcGNiIHsKKy8qIENvbW1vbiBtZW1iZXJzIG9mIGFsbCBQQ0IgdHlwZXMgKi8KKyAgSVBfUENCOworfTsKKworLyoKKyAqIE9wdGlvbiBmbGFncyBwZXItc29ja2V0LiBUaGVzZSBhcmUgdGhlIHNhbWUgbGlrZSBTT19YWFguCisgKi8KKy8qI2RlZmluZSBTT0ZfREVCVUcgICAgICAgKHU4X3QpMHgwMVUgICAgIFVuaW1wbGVtZW50ZWQ6IHR1cm4gb24gZGVidWdnaW5nIGluZm8gcmVjb3JkaW5nICovCisjZGVmaW5lIFNPRl9BQ0NFUFRDT05OICAgICh1OF90KTB4MDJVICAvKiBzb2NrZXQgaGFzIGhhZCBsaXN0ZW4oKSAqLworI2RlZmluZSBTT0ZfUkVVU0VBRERSICAgICAodThfdCkweDA0VSAgLyogYWxsb3cgbG9jYWwgYWRkcmVzcyByZXVzZSAqLworI2RlZmluZSBTT0ZfS0VFUEFMSVZFICAgICAodThfdCkweDA4VSAgLyoga2VlcCBjb25uZWN0aW9ucyBhbGl2ZSAqLworLyojZGVmaW5lIFNPRl9ET05UUk9VVEUgICAodThfdCkweDEwVSAgICAgVW5pbXBsZW1lbnRlZDoganVzdCB1c2UgaW50ZXJmYWNlIGFkZHJlc3NlcyAqLworI2RlZmluZSBTT0ZfQlJPQURDQVNUICAgICAodThfdCkweDIwVSAgLyogcGVybWl0IHRvIHNlbmQgYW5kIHRvIHJlY2VpdmUgYnJvYWRjYXN0IG1lc3NhZ2VzIChzZWUgSVBfU09GX0JST0FEQ0FTVCBvcHRpb24pICovCisvKiNkZWZpbmUgU09GX1VTRUxPT1BCQUNLICh1OF90KTB4NDBVICAgICBVbmltcGxlbWVudGVkOiBieXBhc3MgaGFyZHdhcmUgd2hlbiBwb3NzaWJsZSAqLworI2RlZmluZSBTT0ZfTElOR0VSICAgICAgICAodThfdCkweDgwVSAgLyogbGluZ2VyIG9uIGNsb3NlIGlmIGRhdGEgcHJlc2VudCAqLworLyojZGVmaW5lIFNPRl9PT0JJTkxJTkUgICAodTE2X3QpMHgwMTAwVSAgICAgVW5pbXBsZW1lbnRlZDogbGVhdmUgcmVjZWl2ZWQgT09CIGRhdGEgaW4gbGluZSAqLworLyojZGVmaW5lIFNPRl9SRVVTRVBPUlQgICAodTE2X3QpMHgwMjAwVSAgICAgVW5pbXBsZW1lbnRlZDogYWxsb3cgbG9jYWwgYWRkcmVzcyAmIHBvcnQgcmV1c2UgKi8KKworLyogVGhlc2UgZmxhZ3MgYXJlIGluaGVyaXRlZCAoZS5nLiBmcm9tIGEgbGlzdGVuLXBjYiB0byBhIGNvbm5lY3Rpb24tcGNiKTogKi8KKyNkZWZpbmUgU09GX0lOSEVSSVRFRCAgIChTT0ZfUkVVU0VBRERSfFNPRl9LRUVQQUxJVkV8U09GX0xJTkdFUi8qfFNPRl9ERUJVR3xTT0ZfRE9OVFJPVVRFfFNPRl9PT0JJTkxJTkUqLykKKworCisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Jwc3RydWN0LmgiCisjZW5kaWYKK1BBQ0tfU1RSVUNUX0JFR0lOCitzdHJ1Y3QgaXBfaGRyIHsKKyAgLyogdmVyc2lvbiAvIGhlYWRlciBsZW5ndGggLyB0eXBlIG9mIHNlcnZpY2UgKi8KKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3QgX3ZfaGxfdG9zKTsKKyAgLyogdG90YWwgbGVuZ3RoICovCisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IF9sZW4pOworICAvKiBpZGVudGlmaWNhdGlvbiAqLworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBfaWQpOworICAvKiBmcmFnbWVudCBvZmZzZXQgZmllbGQgKi8KKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3QgX29mZnNldCk7CisjZGVmaW5lIElQX1JGIDB4ODAwMFUgICAgICAgIC8qIHJlc2VydmVkIGZyYWdtZW50IGZsYWcgKi8KKyNkZWZpbmUgSVBfREYgMHg0MDAwVSAgICAgICAgLyogZG9udCBmcmFnbWVudCBmbGFnICovCisjZGVmaW5lIElQX01GIDB4MjAwMFUgICAgICAgIC8qIG1vcmUgZnJhZ21lbnRzIGZsYWcgKi8KKyNkZWZpbmUgSVBfT0ZGTUFTSyAweDFmZmZVICAgLyogbWFzayBmb3IgZnJhZ21lbnRpbmcgYml0cyAqLworICAvKiB0aW1lIHRvIGxpdmUgKi8KKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCBfdHRsKTsKKyAgLyogcHJvdG9jb2wqLworICBQQUNLX1NUUlVDVF9GSUVMRCh1OF90IF9wcm90byk7CisgIC8qIGNoZWNrc3VtICovCisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IF9jaGtzdW0pOworICAvKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIElQIGFkZHJlc3NlcyAqLworICBQQUNLX1NUUlVDVF9GSUVMRChpcF9hZGRyX3BfdCBzcmMpOworICBQQUNLX1NUUlVDVF9GSUVMRChpcF9hZGRyX3BfdCBkZXN0KTsgCit9IFBBQ0tfU1RSVUNUX1NUUlVDVDsKK1BBQ0tfU1RSVUNUX0VORAorI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9lcHN0cnVjdC5oIgorI2VuZGlmCisKKyNkZWZpbmUgSVBIX1YoaGRyKSAgKG50b2hzKChoZHIpLT5fdl9obF90b3MpID4+IDEyKQorI2RlZmluZSBJUEhfSEwoaGRyKSAoKG50b2hzKChoZHIpLT5fdl9obF90b3MpID4+IDgpICYgMHgwZikKKyNkZWZpbmUgSVBIX1RPUyhoZHIpIChudG9ocygoaGRyKS0+X3ZfaGxfdG9zKSAmIDB4ZmYpCisjZGVmaW5lIElQSF9MRU4oaGRyKSAoKGhkciktPl9sZW4pCisjZGVmaW5lIElQSF9JRChoZHIpICgoaGRyKS0+X2lkKQorI2RlZmluZSBJUEhfT0ZGU0VUKGhkcikgKChoZHIpLT5fb2Zmc2V0KQorI2RlZmluZSBJUEhfVFRMKGhkcikgKChoZHIpLT5fdHRsKQorI2RlZmluZSBJUEhfUFJPVE8oaGRyKSAoKGhkciktPl9wcm90bykKKyNkZWZpbmUgSVBIX0NIS1NVTShoZHIpICgoaGRyKS0+X2Noa3N1bSkKKworI2RlZmluZSBJUEhfVkhMVE9TX1NFVChoZHIsIHYsIGhsLCB0b3MpIChoZHIpLT5fdl9obF90b3MgPSAoaHRvbnMoKCh2KSA8PCAxMikgfCAoKGhsKSA8PCA4KSB8ICh0b3MpKSkKKyNkZWZpbmUgSVBIX0xFTl9TRVQoaGRyLCBsZW4pIChoZHIpLT5fbGVuID0gKGxlbikKKyNkZWZpbmUgSVBIX0lEX1NFVChoZHIsIGlkKSAoaGRyKS0+X2lkID0gKGlkKQorI2RlZmluZSBJUEhfT0ZGU0VUX1NFVChoZHIsIG9mZikgKGhkciktPl9vZmZzZXQgPSAob2ZmKQorI2RlZmluZSBJUEhfVFRMX1NFVChoZHIsIHR0bCkgKGhkciktPl90dGwgPSAodThfdCkodHRsKQorI2RlZmluZSBJUEhfUFJPVE9fU0VUKGhkciwgcHJvdG8pIChoZHIpLT5fcHJvdG8gPSAodThfdCkocHJvdG8pCisjZGVmaW5lIElQSF9DSEtTVU1fU0VUKGhkciwgY2hrc3VtKSAoaGRyKS0+X2Noa3N1bSA9IChjaGtzdW0pCisKKy8qKiBUaGUgaW50ZXJmYWNlIHRoYXQgcHJvdmlkZWQgdGhlIHBhY2tldCBmb3IgdGhlIGN1cnJlbnQgY2FsbGJhY2sgaW52b2NhdGlvbi4gKi8KK2V4dGVybiBzdHJ1Y3QgbmV0aWYgKmN1cnJlbnRfbmV0aWY7CisvKiogSGVhZGVyIG9mIHRoZSBpbnB1dCBwYWNrZXQgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXBfaGRyICpjdXJyZW50X2hlYWRlcjsKKy8qKiBTb3VyY2UgSVAgYWRkcmVzcyBvZiBjdXJyZW50X2hlYWRlciAqLworZXh0ZXJuIGlwX2FkZHJfdCBjdXJyZW50X2lwaGRyX3NyYzsKKy8qKiBEZXN0aW5hdGlvbiBJUCBhZGRyZXNzIG9mIGN1cnJlbnRfaGVhZGVyICovCitleHRlcm4gaXBfYWRkcl90IGN1cnJlbnRfaXBoZHJfZGVzdDsKKworI2RlZmluZSBpcF9pbml0KCkgLyogQ29tcGF0aWJpbGl0eSBkZWZpbmUsIG5vdCBpbml0IG5lZWRlZC4gKi8KK3N0cnVjdCBuZXRpZiAqaXBfcm91dGUoaXBfYWRkcl90ICpkZXN0KTsKK2Vycl90IGlwX2lucHV0KHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKmlucCk7CitlcnJfdCBpcF9vdXRwdXQoc3RydWN0IHBidWYgKnAsIGlwX2FkZHJfdCAqc3JjLCBpcF9hZGRyX3QgKmRlc3QsCisgICAgICAgdThfdCB0dGwsIHU4X3QgdG9zLCB1OF90IHByb3RvKTsKK2Vycl90IGlwX291dHB1dF9pZihzdHJ1Y3QgcGJ1ZiAqcCwgaXBfYWRkcl90ICpzcmMsIGlwX2FkZHJfdCAqZGVzdCwKKyAgICAgICB1OF90IHR0bCwgdThfdCB0b3MsIHU4X3QgcHJvdG8sCisgICAgICAgc3RydWN0IG5ldGlmICpuZXRpZik7CisjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UCitlcnJfdCBpcF9vdXRwdXRfaGludGVkKHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKnNyYywgaXBfYWRkcl90ICpkZXN0LAorICAgICAgIHU4X3QgdHRsLCB1OF90IHRvcywgdThfdCBwcm90bywgdThfdCAqYWRkcl9oaW50KTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKyNpZiBJUF9PUFRJT05TX1NFTkQKK2Vycl90IGlwX291dHB1dF9pZl9vcHQoc3RydWN0IHBidWYgKnAsIGlwX2FkZHJfdCAqc3JjLCBpcF9hZGRyX3QgKmRlc3QsCisgICAgICAgdThfdCB0dGwsIHU4X3QgdG9zLCB1OF90IHByb3RvLCBzdHJ1Y3QgbmV0aWYgKm5ldGlmLCB2b2lkICppcF9vcHRpb25zLAorICAgICAgIHUxNl90IG9wdGxlbik7CisjZW5kaWYgLyogSVBfT1BUSU9OU19TRU5EICovCisvKiogR2V0IHRoZSBpbnRlcmZhY2UgdGhhdCByZWNlaXZlZCB0aGUgY3VycmVudCBwYWNrZXQuCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSBjYWxsZWQgZnJvbSBhIHJlY2VpdmUgY2FsbGJhY2sgKHVkcF9yZWN2LAorICogcmF3X3JlY3YsIHRjcF9hY2NlcHQpLiBJdCB3aWxsIHJldHVybiBOVUxMIG90aGVyd2lzZS4gKi8KKyNkZWZpbmUgaXBfY3VycmVudF9uZXRpZigpICAoY3VycmVudF9uZXRpZikKKy8qKiBHZXQgdGhlIElQIGhlYWRlciBvZiB0aGUgY3VycmVudCBwYWNrZXQuCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSBjYWxsZWQgZnJvbSBhIHJlY2VpdmUgY2FsbGJhY2sgKHVkcF9yZWN2LAorICogcmF3X3JlY3YsIHRjcF9hY2NlcHQpLiBJdCB3aWxsIHJldHVybiBOVUxMIG90aGVyd2lzZS4gKi8KKyNkZWZpbmUgaXBfY3VycmVudF9oZWFkZXIoKSAoY3VycmVudF9oZWFkZXIpCisvKiogU291cmNlIElQIGFkZHJlc3Mgb2YgY3VycmVudF9oZWFkZXIgKi8KKyNkZWZpbmUgaXBfY3VycmVudF9zcmNfYWRkcigpICAoJmN1cnJlbnRfaXBoZHJfc3JjKQorLyoqIERlc3RpbmF0aW9uIElQIGFkZHJlc3Mgb2YgY3VycmVudF9oZWFkZXIgKi8KKyNkZWZpbmUgaXBfY3VycmVudF9kZXN0X2FkZHIoKSAoJmN1cnJlbnRfaXBoZHJfZGVzdCkKKworI2lmIElQX0RFQlVHCit2b2lkIGlwX2RlYnVnX3ByaW50KHN0cnVjdCBwYnVmICpwKTsKKyNlbHNlCisjZGVmaW5lIGlwX2RlYnVnX3ByaW50KHApCisjZW5kaWYgLyogSVBfREVCVUcgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTFdJUF9JUF9IX18gKi8KKworCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvaXB2NC9sd2lwL2lwX2FkZHIuaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9pcHY0L2x3aXAvaXBfYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Zjg0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvaXB2NC9sd2lwL2lwX2FkZHIuaApAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICoKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisjaWZuZGVmIF9fTFdJUF9JUF9BRERSX0hfXworI2RlZmluZSBfX0xXSVBfSVBfQUREUl9IX18KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGlzIGlzIHRoZSBhbGlnbmVkIHZlcnNpb24gb2YgaXBfYWRkcl90LAorICAgdXNlZCBhcyBsb2NhbCB2YXJpYWJsZSwgb24gdGhlIHN0YWNrLCBldGMuICovCitzdHJ1Y3QgaXBfYWRkciB7CisgIHUzMl90IGFkZHI7Cit9OworCisvKiBUaGlzIGlzIHRoZSBwYWNrZWQgdmVyc2lvbiBvZiBpcF9hZGRyX3QsCisgICB1c2VkIGluIG5ldHdvcmsgaGVhZGVycyB0aGF0IGFyZSBpdHNlbGYgcGFja2VkICovCisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Jwc3RydWN0LmgiCisjZW5kaWYKK1BBQ0tfU1RSVUNUX0JFR0lOCitzdHJ1Y3QgaXBfYWRkcl9wYWNrZWQgeworICBQQUNLX1NUUlVDVF9GSUVMRCh1MzJfdCBhZGRyKTsKK30gUEFDS19TVFJVQ1RfU1RSVUNUOworUEFDS19TVFJVQ1RfRU5ECisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Vwc3RydWN0LmgiCisjZW5kaWYKKworLyoqIGlwX2FkZHJfdCB1c2VzIGEgc3RydWN0IGZvciBjb252ZW5pZW5jZSBvbmx5LCBzbyB0aGF0IHRoZSBzYW1lIGRlZmluZXMgY2FuCisgKiBvcGVyYXRlIGJvdGggb24gaXBfYWRkcl90IGFzIHdlbGwgYXMgb24gaXBfYWRkcl9wX3QuICovCit0eXBlZGVmIHN0cnVjdCBpcF9hZGRyIGlwX2FkZHJfdDsKK3R5cGVkZWYgc3RydWN0IGlwX2FkZHJfcGFja2VkIGlwX2FkZHJfcF90OworCisvKgorICogc3RydWN0IGlwYWRkcjIgaXMgdXNlZCBpbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgQVJQIHBhY2tldCBmb3JtYXQgaW4KKyAqIG9yZGVyIHRvIHN1cHBvcnQgY29tcGlsZXJzIHRoYXQgZG9uJ3QgaGF2ZSBzdHJ1Y3R1cmUgcGFja2luZy4KKyAqLworI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9icHN0cnVjdC5oIgorI2VuZGlmCitQQUNLX1NUUlVDVF9CRUdJTgorc3RydWN0IGlwX2FkZHIyIHsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3QgYWRkcndbMl0pOworfSBQQUNLX1NUUlVDVF9TVFJVQ1Q7CitQQUNLX1NUUlVDVF9FTkQKKyNpZmRlZiBQQUNLX1NUUlVDVF9VU0VfSU5DTFVERVMKKyMgIGluY2x1ZGUgImFyY2gvZXBzdHJ1Y3QuaCIKKyNlbmRpZgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIG5vdCBpbmNsdWRlIG5ldGlmLmggKi8KK3N0cnVjdCBuZXRpZjsKKworZXh0ZXJuIGNvbnN0IGlwX2FkZHJfdCBpcF9hZGRyX2FueTsKK2V4dGVybiBjb25zdCBpcF9hZGRyX3QgaXBfYWRkcl9icm9hZGNhc3Q7CisKKy8qKiBJUF9BRERSXyBjYW4gYmUgdXNlZCBhcyBhIGZpeGVkIElQIGFkZHJlc3MKKyAqICBmb3IgdGhlIHdpbGRjYXJkIGFuZCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MKKyAqLworI2RlZmluZSBJUF9BRERSX0FOWSAgICAgICAgICgoaXBfYWRkcl90ICopJmlwX2FkZHJfYW55KQorI2RlZmluZSBJUF9BRERSX0JST0FEQ0FTVCAgICgoaXBfYWRkcl90ICopJmlwX2FkZHJfYnJvYWRjYXN0KQorCisvKiogMjU1LjI1NS4yNTUuMjU1ICovCisjZGVmaW5lIElQQUREUl9OT05FICAgICAgICAgKCh1MzJfdCkweGZmZmZmZmZmVUwpCisvKiogMTI3LjAuMC4xICovCisjZGVmaW5lIElQQUREUl9MT09QQkFDSyAgICAgKCh1MzJfdCkweDdmMDAwMDAxVUwpCisvKiogMC4wLjAuMCAqLworI2RlZmluZSBJUEFERFJfQU5ZICAgICAgICAgICgodTMyX3QpMHgwMDAwMDAwMFVMKQorLyoqIDI1NS4yNTUuMjU1LjI1NSAqLworI2RlZmluZSBJUEFERFJfQlJPQURDQVNUICAgICgodTMyX3QpMHhmZmZmZmZmZlVMKQorCisvKiBEZWZpbml0aW9ucyBvZiB0aGUgYml0cyBpbiBhbiBJbnRlcm5ldCBhZGRyZXNzIGludGVnZXIuCisKKyAgIE9uIHN1Ym5ldHMsIGhvc3QgYW5kIG5ldHdvcmsgcGFydHMgYXJlIGZvdW5kIGFjY29yZGluZyB0bworICAgdGhlIHN1Ym5ldCBtYXNrLCBub3QgdGhlc2UgbWFza3MuICAqLworI2RlZmluZSBJUF9DTEFTU0EoYSkgICAgICAgICgoKCh1MzJfdCkoYSkpICYgMHg4MDAwMDAwMFVMKSA9PSAwKQorI2RlZmluZSBJUF9DTEFTU0FfTkVUICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgSVBfQ0xBU1NBX05TSElGVCAgICAyNAorI2RlZmluZSBJUF9DTEFTU0FfSE9TVCAgICAgICgweGZmZmZmZmZmICYgfklQX0NMQVNTQV9ORVQpCisjZGVmaW5lIElQX0NMQVNTQV9NQVggICAgICAgMTI4CisKKyNkZWZpbmUgSVBfQ0xBU1NCKGEpICAgICAgICAoKCgodTMyX3QpKGEpKSAmIDB4YzAwMDAwMDBVTCkgPT0gMHg4MDAwMDAwMFVMKQorI2RlZmluZSBJUF9DTEFTU0JfTkVUICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSVBfQ0xBU1NCX05TSElGVCAgICAxNgorI2RlZmluZSBJUF9DTEFTU0JfSE9TVCAgICAgICgweGZmZmZmZmZmICYgfklQX0NMQVNTQl9ORVQpCisjZGVmaW5lIElQX0NMQVNTQl9NQVggICAgICAgNjU1MzYKKworI2RlZmluZSBJUF9DTEFTU0MoYSkgICAgICAgICgoKCh1MzJfdCkoYSkpICYgMHhlMDAwMDAwMFVMKSA9PSAweGMwMDAwMDAwVUwpCisjZGVmaW5lIElQX0NMQVNTQ19ORVQgICAgICAgMHhmZmZmZmYwMAorI2RlZmluZSBJUF9DTEFTU0NfTlNISUZUICAgIDgKKyNkZWZpbmUgSVBfQ0xBU1NDX0hPU1QgICAgICAoMHhmZmZmZmZmZiAmIH5JUF9DTEFTU0NfTkVUKQorCisjZGVmaW5lIElQX0NMQVNTRChhKSAgICAgICAgKCgodTMyX3QpKGEpICYgMHhmMDAwMDAwMFVMKSA9PSAweGUwMDAwMDAwVUwpCisjZGVmaW5lIElQX0NMQVNTRF9ORVQgICAgICAgMHhmMDAwMDAwMCAgICAgICAgICAvKiBUaGVzZSBvbmVzIGFyZW4ndCByZWFsbHkgKi8KKyNkZWZpbmUgSVBfQ0xBU1NEX05TSElGVCAgICAyOCAgICAgICAgICAgICAgICAgIC8qICAgbmV0IGFuZCBob3N0IGZpZWxkcywgYnV0ICovCisjZGVmaW5lIElQX0NMQVNTRF9IT1NUICAgICAgMHgwZmZmZmZmZiAgICAgICAgICAvKiAgIHJvdXRpbmcgbmVlZG4ndCBrbm93LiAqLworI2RlZmluZSBJUF9NVUxUSUNBU1QoYSkgICAgIElQX0NMQVNTRChhKQorCisjZGVmaW5lIElQX0VYUEVSSU1FTlRBTChhKSAgKCgodTMyX3QpKGEpICYgMHhmMDAwMDAwMFVMKSA9PSAweGYwMDAwMDAwVUwpCisjZGVmaW5lIElQX0JBRENMQVNTKGEpICAgICAgKCgodTMyX3QpKGEpICYgMHhmMDAwMDAwMFVMKSA9PSAweGYwMDAwMDAwVUwpCisKKyNkZWZpbmUgSVBfTE9PUEJBQ0tORVQgICAgICAxMjcgICAgICAgICAgICAgICAgIC8qIG9mZmljaWFsISAqLworCisKKyNpZiBCWVRFX09SREVSID09IEJJR19FTkRJQU4KKy8qKiBTZXQgYW4gSVAgYWRkcmVzcyBnaXZlbiBieSB0aGUgZm91ciBieXRlLXBhcnRzICovCisjZGVmaW5lIElQNF9BRERSKGlwYWRkciwgYSxiLGMsZCkgXAorICAgICAgICAoaXBhZGRyKS0+YWRkciA9ICgodTMyX3QpKChhKSAmIDB4ZmYpIDw8IDI0KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMl90KSgoYikgJiAweGZmKSA8PCAxNikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzJfdCkoKGMpICYgMHhmZikgPDwgOCkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3QpKChkKSAmIDB4ZmYpCisjZWxzZQorLyoqIFNldCBhbiBJUCBhZGRyZXNzIGdpdmVuIGJ5IHRoZSBmb3VyIGJ5dGUtcGFydHMuCisgICAgTGl0dGxlLWVuZGlhbiB2ZXJzaW9uIHRoYXQgcHJldmVudHMgdGhlIHVzZSBvZiBodG9ubC4gKi8KKyNkZWZpbmUgSVA0X0FERFIoaXBhZGRyLCBhLGIsYyxkKSBcCisgICAgICAgIChpcGFkZHIpLT5hZGRyID0gKCh1MzJfdCkoKGQpICYgMHhmZikgPDwgMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyX3QpKChjKSAmIDB4ZmYpIDw8IDE2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMl90KSgoYikgJiAweGZmKSA8PCA4KSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCkoKGEpICYgMHhmZikKKyNlbmRpZgorCisvKiogTUVNQ1BZLWxpa2UgY29weWluZyBvZiBJUCBhZGRyZXNzZXMgd2hlcmUgYWRkcmVzc2VzIGFyZSBrbm93biB0byBiZQorICogMTYtYml0LWFsaWduZWQgaWYgdGhlIHBvcnQgaXMgY29ycmVjdGx5IGNvbmZpZ3VyZWQgKHNvIGEgcG9ydCBjb3VsZCBkZWZpbmUKKyAqIHRoaXMgdG8gY29weWluZyAyIHUxNl90J3MpIC0gbm8gTlVMTC1wb2ludGVyLWNoZWNraW5nIG5lZWRlZC4gKi8KKyNpZm5kZWYgSVBBRERSMl9DT1BZCisjZGVmaW5lIElQQUREUjJfQ09QWShkZXN0LCBzcmMpIFNNRU1DUFkoZGVzdCwgc3JjLCBzaXplb2YoaXBfYWRkcl90KSkKKyNlbmRpZgorCisvKiogQ29weSBJUCBhZGRyZXNzIC0gZmFzdGVyIHRoYW4gaXBfYWRkcl9zZXQ6IG5vIE5VTEwgY2hlY2sgKi8KKyNkZWZpbmUgaXBfYWRkcl9jb3B5KGRlc3QsIHNyYykgKChkZXN0KS5hZGRyID0gKHNyYykuYWRkcikKKy8qKiBTYWZlbHkgY29weSBvbmUgSVAgYWRkcmVzcyB0byBhbm90aGVyIChzcmMgbWF5IGJlIE5VTEwpICovCisjZGVmaW5lIGlwX2FkZHJfc2V0KGRlc3QsIHNyYykgKChkZXN0KS0+YWRkciA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjKSA9PSBOVUxMID8gMCA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmMpLT5hZGRyKSkKKy8qKiBTZXQgY29tcGxldGUgYWRkcmVzcyB0byB6ZXJvICovCisjZGVmaW5lIGlwX2FkZHJfc2V0X3plcm8oaXBhZGRyKSAgICAgICgoaXBhZGRyKS0+YWRkciA9IDApCisvKiogU2V0IGFkZHJlc3MgdG8gSVBBRERSX0FOWSAobm8gbmVlZCBmb3IgaHRvbmwoKSkgKi8KKyNkZWZpbmUgaXBfYWRkcl9zZXRfYW55KGlwYWRkcikgICAgICAgKChpcGFkZHIpLT5hZGRyID0gSVBBRERSX0FOWSkKKy8qKiBTZXQgYWRkcmVzcyB0byBsb29wYmFjayBhZGRyZXNzICovCisjZGVmaW5lIGlwX2FkZHJfc2V0X2xvb3BiYWNrKGlwYWRkcikgICgoaXBhZGRyKS0+YWRkciA9IFBQX0hUT05MKElQQUREUl9MT09QQkFDSykpCisvKiogU2FmZWx5IGNvcHkgb25lIElQIGFkZHJlc3MgdG8gYW5vdGhlciBhbmQgY2hhbmdlIGJ5dGUgb3JkZXIKKyAqIGZyb20gaG9zdC0gdG8gbmV0d29yay1vcmRlci4gKi8KKyNkZWZpbmUgaXBfYWRkcl9zZXRfaHRvbihkZXN0LCBzcmMpICgoZGVzdCktPmFkZHIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmMpID09IE5VTEwgPyAwOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG9ubCgoc3JjKS0+YWRkcikpKQorLyoqIElQdjQgb25seTogc2V0IHRoZSBJUCBhZGRyZXNzIGdpdmVuIGFzIGFuIHUzMl90ICovCisjZGVmaW5lIGlwNF9hZGRyX3NldF91MzIoZGVzdF9pcGFkZHIsIHNyY191MzIpICgoZGVzdF9pcGFkZHIpLT5hZGRyID0gKHNyY191MzIpKQorLyoqIElQdjQgb25seTogZ2V0IHRoZSBJUCBhZGRyZXNzIGFzIGFuIHUzMl90ICovCisjZGVmaW5lIGlwNF9hZGRyX2dldF91MzIoc3JjX2lwYWRkcikgKChzcmNfaXBhZGRyKS0+YWRkcikKKworLyoqIEdldCB0aGUgbmV0d29yayBhZGRyZXNzIGJ5IGNvbWJpbmluZyBob3N0IGFkZHJlc3Mgd2l0aCBuZXRtYXNrICovCisjZGVmaW5lIGlwX2FkZHJfZ2V0X25ldHdvcmsodGFyZ2V0LCBob3N0LCBuZXRtYXNrKSAoKHRhcmdldCktPmFkZHIgPSAoKGhvc3QpLT5hZGRyKSAmICgobmV0bWFzayktPmFkZHIpKQorCisvKioKKyAqIERldGVybWluZSBpZiB0d28gYWRkcmVzcyBhcmUgb24gdGhlIHNhbWUgbmV0d29yay4KKyAqCisgKiBAYXJnIGFkZHIxIElQIGFkZHJlc3MgMQorICogQGFyZyBhZGRyMiBJUCBhZGRyZXNzIDIKKyAqIEBhcmcgbWFzayBuZXR3b3JrIGlkZW50aWZpZXIgbWFzaworICogQHJldHVybiAhMCBpZiB0aGUgbmV0d29yayBpZGVudGlmaWVycyBvZiBib3RoIGFkZHJlc3MgbWF0Y2gKKyAqLworI2RlZmluZSBpcF9hZGRyX25ldGNtcChhZGRyMSwgYWRkcjIsIG1hc2spICgoKGFkZHIxKS0+YWRkciAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFzayktPmFkZHIpID09IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYWRkcjIpLT5hZGRyICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXNrKS0+YWRkcikpCisjZGVmaW5lIGlwX2FkZHJfY21wKGFkZHIxLCBhZGRyMikgKChhZGRyMSktPmFkZHIgPT0gKGFkZHIyKS0+YWRkcikKKworI2RlZmluZSBpcF9hZGRyX2lzYW55KGFkZHIxKSAoKGFkZHIxKSA9PSBOVUxMIHx8IChhZGRyMSktPmFkZHIgPT0gSVBBRERSX0FOWSkKKworI2RlZmluZSBpcF9hZGRyX2lzYnJvYWRjYXN0KGlwYWRkciwgbmV0aWYpIGlwNF9hZGRyX2lzYnJvYWRjYXN0KChpcGFkZHIpLT5hZGRyLCAobmV0aWYpKQordThfdCBpcDRfYWRkcl9pc2Jyb2FkY2FzdCh1MzJfdCBhZGRyLCBjb25zdCBzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKKworI2RlZmluZSBpcF9hZGRyX25ldG1hc2tfdmFsaWQobmV0bWFzaykgaXA0X2FkZHJfbmV0bWFza192YWxpZCgobmV0bWFzayktPmFkZHIpCit1OF90IGlwNF9hZGRyX25ldG1hc2tfdmFsaWQodTMyX3QgbmV0bWFzayk7CisKKyNkZWZpbmUgaXBfYWRkcl9pc211bHRpY2FzdChhZGRyMSkgKCgoYWRkcjEpLT5hZGRyICYgUFBfSFRPTkwoMHhmMDAwMDAwMFVMKSkgPT0gUFBfSFRPTkwoMHhlMDAwMDAwMFVMKSkKKworI2RlZmluZSBpcF9hZGRyX2lzbGlua2xvY2FsKGFkZHIxKSAoKChhZGRyMSktPmFkZHIgJiBQUF9IVE9OTCgweGZmZmYwMDAwVUwpKSA9PSBQUF9IVE9OTCgweGE5ZmUwMDAwVUwpKQorCisjZGVmaW5lIGlwX2FkZHJfZGVidWdfcHJpbnQoZGVidWcsIGlwYWRkcikgXAorICBMV0lQX0RFQlVHRihkZWJ1ZywgKCIlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyICE9IE5VTEwgPyBpcDRfYWRkcjFfMTYoaXBhZGRyKSA6IDAsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBpcGFkZHIgIT0gTlVMTCA/IGlwNF9hZGRyMl8xNihpcGFkZHIpIDogMCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGlwYWRkciAhPSBOVUxMID8gaXA0X2FkZHIzXzE2KGlwYWRkcikgOiAwLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyICE9IE5VTEwgPyBpcDRfYWRkcjRfMTYoaXBhZGRyKSA6IDApKQorCisvKiBHZXQgb25lIGJ5dGUgZnJvbSB0aGUgNC1ieXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgaXA0X2FkZHIxKGlwYWRkcikgKCgodThfdCopKGlwYWRkcikpWzBdKQorI2RlZmluZSBpcDRfYWRkcjIoaXBhZGRyKSAoKCh1OF90KikoaXBhZGRyKSlbMV0pCisjZGVmaW5lIGlwNF9hZGRyMyhpcGFkZHIpICgoKHU4X3QqKShpcGFkZHIpKVsyXSkKKyNkZWZpbmUgaXA0X2FkZHI0KGlwYWRkcikgKCgodThfdCopKGlwYWRkcikpWzNdKQorLyogVGhlc2UgYXJlIGNhc3QgdG8gdTE2X3QsIHdpdGggdGhlIGludGVudCB0aGF0IHRoZXkgYXJlIG9mdGVuIGFyZ3VtZW50cworICogdG8gcHJpbnRmIHVzaW5nIHRoZSBVMTZfRiBmb3JtYXQgZnJvbSBjYy5oLiAqLworI2RlZmluZSBpcDRfYWRkcjFfMTYoaXBhZGRyKSAoKHUxNl90KWlwNF9hZGRyMShpcGFkZHIpKQorI2RlZmluZSBpcDRfYWRkcjJfMTYoaXBhZGRyKSAoKHUxNl90KWlwNF9hZGRyMihpcGFkZHIpKQorI2RlZmluZSBpcDRfYWRkcjNfMTYoaXBhZGRyKSAoKHUxNl90KWlwNF9hZGRyMyhpcGFkZHIpKQorI2RlZmluZSBpcDRfYWRkcjRfMTYoaXBhZGRyKSAoKHUxNl90KWlwNF9hZGRyNChpcGFkZHIpKQorCisvKiogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIGlwX250b2EoaXBhZGRyKSAgaXBhZGRyX250b2EoaXBhZGRyKQorCit1MzJfdCBpcGFkZHJfYWRkcihjb25zdCBjaGFyICpjcCk7CitpbnQgaXBhZGRyX2F0b24oY29uc3QgY2hhciAqY3AsIGlwX2FkZHJfdCAqYWRkcik7CisvKiogcmV0dXJucyBwdHIgdG8gc3RhdGljIGJ1ZmZlcjsgbm90IHJlZW50cmFudCEgKi8KK2NoYXIgKmlwYWRkcl9udG9hKGNvbnN0IGlwX2FkZHJfdCAqYWRkcik7CitjaGFyICppcGFkZHJfbnRvYV9yKGNvbnN0IGlwX2FkZHJfdCAqYWRkciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTFdJUF9JUF9BRERSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pcF9mcmFnLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvaXB2NC9sd2lwL2lwX2ZyYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2I1ZWIxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2lwdjQvbHdpcC9pcF9mcmFnLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBKYW5pIE1vbm9zZXMgPGphbmlAaXYucm8+CisgKgorICovCisKKyNpZm5kZWYgX19MV0lQX0lQX0ZSQUdfSF9fCisjZGVmaW5lIF9fTFdJUF9JUF9GUkFHX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKyNpbmNsdWRlICJsd2lwL2Vyci5oIgorI2luY2x1ZGUgImx3aXAvcGJ1Zi5oIgorI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKyNpbmNsdWRlICJsd2lwL2lwLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIElQX1JFQVNTRU1CTFkKKy8qIFRoZSBJUCByZWFzc2VtYmx5IHRpbWVyIGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4gKi8KKyNkZWZpbmUgSVBfVE1SX0lOVEVSVkFMIDEwMDAKKworLyogSVAgcmVhc3NlbWJseSBoZWxwZXIgc3RydWN0LgorICogVGhpcyBpcyBleHBvcnRlZCBiZWNhdXNlIG1lbXAgbmVlZHMgdG8ga25vdyB0aGUgc2l6ZS4KKyAqLworc3RydWN0IGlwX3JlYXNzZGF0YSB7CisgIHN0cnVjdCBpcF9yZWFzc2RhdGEgKm5leHQ7CisgIHN0cnVjdCBwYnVmICpwOworICBzdHJ1Y3QgaXBfaGRyIGlwaGRyOworICB1MTZfdCBkYXRhZ3JhbV9sZW47CisgIHU4X3QgZmxhZ3M7CisgIHU4X3QgdGltZXI7Cit9OworCit2b2lkIGlwX3JlYXNzX2luaXQodm9pZCk7Cit2b2lkIGlwX3JlYXNzX3Rtcih2b2lkKTsKK3N0cnVjdCBwYnVmICogaXBfcmVhc3Moc3RydWN0IHBidWYgKnApOworI2VuZGlmIC8qIElQX1JFQVNTRU1CTFkgKi8KKworI2lmIElQX0ZSQUcKKyNpZiAhSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgJiYgIUxXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYKKy8qKiBBIGN1c3RvbSBwYnVmIHRoYXQgaG9sZHMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBwYnVmLCB3aGljaCBpcyBmcmVlZAorICogd2hlbiB0aGlzIGN1c3RvbSBwYnVmIGlzIGZyZWVkLiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGEgY3VzdG9tIFBCVUZfUkVGCisgKiB0aGF0IHBvaW50cyBpbnRvIHRoZSBvcmlnaW5hbCBwYnVmLiAqLworc3RydWN0IHBidWZfY3VzdG9tX3JlZiB7CisgIC8qKiAnYmFzZSBjbGFzcycgKi8KKyAgc3RydWN0IHBidWZfY3VzdG9tIHBjOworICAvKiogcG9pbnRlciB0byB0aGUgb3JpZ2luYWwgcGJ1ZiB0aGF0IGlzIHJlZmVyZW5jZWQgKi8KKyAgc3RydWN0IHBidWYgKm9yaWdpbmFsOworfTsKKyNlbmRpZiAvKiAhSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgJiYgIUxXSVBfTkVUSUZfVFhfU0lOR0xFX1BCVUYgKi8KKworZXJyX3QgaXBfZnJhZyhzdHJ1Y3QgcGJ1ZiAqcCwgc3RydWN0IG5ldGlmICpuZXRpZiwgaXBfYWRkcl90ICpkZXN0KTsKKyNlbmRpZiAvKiBJUF9GUkFHICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXSVBfSVBfRlJBR19IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2FwaS5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiOWU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2FwaS5oCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfQVBJX0hfXworI2RlZmluZSBfX0xXSVBfQVBJX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfTkVUQ09OTiAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAvKiBmb3Igc2l6ZV90ICovCisKKyNpbmNsdWRlICJsd2lwL25ldGJ1Zi5oIgorI2luY2x1ZGUgImx3aXAvc3lzLmgiCisjaW5jbHVkZSAibHdpcC9pcF9hZGRyLmgiCisjaW5jbHVkZSAibHdpcC9lcnIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaHJvdWdob3V0IHRoaXMgZmlsZSwgSVAgYWRkcmVzc2VzIGFuZCBwb3J0IG51bWJlcnMgYXJlIGV4cGVjdGVkIHRvIGJlIGluCisgKiB0aGUgc2FtZSBieXRlIG9yZGVyIGFzIGluIHRoZSBjb3JyZXNwb25kaW5nIHBjYi4KKyAqLworCisvKiBGbGFncyBmb3IgbmV0Y29ubl93cml0ZSAodThfdCkgKi8KKyNkZWZpbmUgTkVUQ09OTl9OT0ZMQUcgICAgMHgwMAorI2RlZmluZSBORVRDT05OX05PQ09QWSAgICAweDAwIC8qIE9ubHkgZm9yIHNvdXJjZSBjb2RlIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgTkVUQ09OTl9DT1BZICAgICAgMHgwMQorI2RlZmluZSBORVRDT05OX01PUkUgICAgICAweDAyCisjZGVmaW5lIE5FVENPTk5fRE9OVEJMT0NLIDB4MDQKKworLyogRmxhZ3MgZm9yIHN0cnVjdCBuZXRjb25uLmZsYWdzICh1OF90KSAqLworLyoqIFRDUDogd2hlbiBkYXRhIHBhc3NlZCB0byBuZXRjb25uX3dyaXRlIGRvZXNuJ3QgZml0IGludG8gdGhlIHNlbmQgYnVmZmVyLAorICAgIHRoaXMgdGVtcG9yYXJpbHkgc3RvcmVzIHdoZXRoZXIgdG8gd2FrZSB1cCB0aGUgb3JpZ2luYWwgYXBwbGljYXRpb24gdGFzaworICAgIGlmIGRhdGEgY291bGRuJ3QgYmUgc2VudCBpbiB0aGUgZmlyc3QgdHJ5LiAqLworI2RlZmluZSBORVRDT05OX0ZMQUdfV1JJVEVfREVMQVlFRCAgICAgICAgICAgIDB4MDEKKy8qKiBTaG91bGQgdGhpcyBuZXRjb25uIGF2b2lkIGJsb2NraW5nPyAqLworI2RlZmluZSBORVRDT05OX0ZMQUdfTk9OX0JMT0NLSU5HICAgICAgICAgICAgIDB4MDIKKy8qKiBXYXMgdGhlIGxhc3QgY29ubmVjdCBhY3Rpb24gYSBub24tYmxvY2tpbmcgb25lPyAqLworI2RlZmluZSBORVRDT05OX0ZMQUdfSU5fTk9OQkxPQ0tJTkdfQ09OTkVDVCAgIDB4MDQKKy8qKiBJZiB0aGlzIGlzIHNldCwgYSBUQ1AgbmV0Y29ubiBtdXN0IGNhbGwgbmV0Y29ubl9yZWN2ZWQoKSB0byB1cGRhdGUKKyAgICB0aGUgVENQIHJlY2VpdmUgd2luZG93IChkb25lIGF1dG9tYXRpY2FsbHkgaWYgbm90IHNldCkuICovCisjZGVmaW5lIE5FVENPTk5fRkxBR19OT19BVVRPX1JFQ1ZFRCAgICAgICAgICAgMHgwOAorLyoqIElmIGEgbm9uYmxvY2tpbmcgd3JpdGUgaGFzIGJlZW4gcmVqZWN0ZWQgYmVmb3JlLCBwb2xsX3RjcCBuZWVkcyB0bworICAgIGNoZWNrIGlmIHRoZSBuZXRjb25uIGlzIHdyaXRhYmxlIGFnYWluICovCisjZGVmaW5lIE5FVENPTk5fRkxBR19DSEVDS19XUklURVNQQUNFICAgICAgICAgMHgxMAorCisKKy8qIEhlbHBlcnMgdG8gcHJvY2VzcyBzZXZlcmFsIG5ldGNvbm5fdHlwZXMgYnkgdGhlIHNhbWUgY29kZSAqLworI2RlZmluZSBORVRDT05OVFlQRV9HUk9VUCh0KSAgICAodCYweEYwKQorI2RlZmluZSBORVRDT05OVFlQRV9EQVRBR1JBTSh0KSAodCYweEUwKQorCisvKiogUHJvdG9jb2wgZmFtaWx5IGFuZCB0eXBlIG9mIHRoZSBuZXRjb25uICovCitlbnVtIG5ldGNvbm5fdHlwZSB7CisgIE5FVENPTk5fSU5WQUxJRCAgICA9IDAsCisgIC8qIE5FVENPTk5fVENQIEdyb3VwICovCisgIE5FVENPTk5fVENQICAgICAgICA9IDB4MTAsCisgIC8qIE5FVENPTk5fVURQIEdyb3VwICovCisgIE5FVENPTk5fVURQICAgICAgICA9IDB4MjAsCisgIE5FVENPTk5fVURQTElURSAgICA9IDB4MjEsCisgIE5FVENPTk5fVURQTk9DSEtTVU09IDB4MjIsCisgIC8qIE5FVENPTk5fUkFXIEdyb3VwICovCisgIE5FVENPTk5fUkFXICAgICAgICA9IDB4NDAKK307CisKKy8qKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBuZXRjb25uLiBOb24tVENQIG5ldGNvbm5zIGFyZSBhbHdheXMKKyAqIGluIHN0YXRlIE5FVENPTk5fTk9ORSEgKi8KK2VudW0gbmV0Y29ubl9zdGF0ZSB7CisgIE5FVENPTk5fTk9ORSwKKyAgTkVUQ09OTl9XUklURSwKKyAgTkVUQ09OTl9MSVNURU4sCisgIE5FVENPTk5fQ09OTkVDVCwKKyAgTkVUQ09OTl9DTE9TRQorfTsKKworLyoqIFVzZSB0byBpbmZvcm0gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFib3V0IGNoYW5nZXMgKi8KK2VudW0gbmV0Y29ubl9ldnQgeworICBORVRDT05OX0VWVF9SQ1ZQTFVTLAorICBORVRDT05OX0VWVF9SQ1ZNSU5VUywKKyAgTkVUQ09OTl9FVlRfU0VORFBMVVMsCisgIE5FVENPTk5fRVZUX1NFTkRNSU5VUywKKyAgTkVUQ09OTl9FVlRfRVJST1IKK307CisKKyNpZiBMV0lQX0lHTVAKKy8qKiBVc2VkIGZvciBuZXRjb25uX2pvaW5fbGVhdmVfZ3JvdXAoKSAqLworZW51bSBuZXRjb25uX2lnbXAgeworICBORVRDT05OX0pPSU4sCisgIE5FVENPTk5fTEVBVkUKK307CisjZW5kaWYgLyogTFdJUF9JR01QICovCisKKy8qIGZvcndhcmQtZGVjbGFyZSBzb21lIHN0cnVjdHMgdG8gYXZvaWQgdG8gaW5jbHVkZSB0aGVpciBoZWFkZXJzICovCitzdHJ1Y3QgaXBfcGNiOworc3RydWN0IHRjcF9wY2I7CitzdHJ1Y3QgdWRwX3BjYjsKK3N0cnVjdCByYXdfcGNiOworc3RydWN0IG5ldGNvbm47CitzdHJ1Y3QgYXBpX21zZ19tc2c7CisKKy8qKiBBIGNhbGxiYWNrIHByb3RvdHlwZSB0byBpbmZvcm0gYWJvdXQgZXZlbnRzIGZvciBhIG5ldGNvbm4gKi8KK3R5cGVkZWYgdm9pZCAoKiBuZXRjb25uX2NhbGxiYWNrKShzdHJ1Y3QgbmV0Y29ubiAqLCBlbnVtIG5ldGNvbm5fZXZ0LCB1MTZfdCBsZW4pOworCisvKiogQSBuZXRjb25uIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBuZXRjb25uIHsKKyAgLyoqIHR5cGUgb2YgdGhlIG5ldGNvbm4gKFRDUCwgVURQIG9yIFJBVykgKi8KKyAgZW51bSBuZXRjb25uX3R5cGUgdHlwZTsKKyAgLyoqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG5ldGNvbm4gKi8KKyAgZW51bSBuZXRjb25uX3N0YXRlIHN0YXRlOworICAvKiogdGhlIGx3SVAgaW50ZXJuYWwgcHJvdG9jb2wgY29udHJvbCBibG9jayAqLworICB1bmlvbiB7CisgICAgc3RydWN0IGlwX3BjYiAgKmlwOworICAgIHN0cnVjdCB0Y3BfcGNiICp0Y3A7CisgICAgc3RydWN0IHVkcF9wY2IgKnVkcDsKKyAgICBzdHJ1Y3QgcmF3X3BjYiAqcmF3OworICB9IHBjYjsKKyAgLyoqIHRoZSBsYXN0IGVycm9yIHRoaXMgbmV0Y29ubiBoYWQgKi8KKyAgZXJyX3QgbGFzdF9lcnI7CisgIC8qKiBzZW0gdGhhdCBpcyB1c2VkIHRvIHN5bmNocm9uZW91c2x5IGV4ZWN1dGUgZnVuY3Rpb25zIGluIHRoZSBjb3JlIGNvbnRleHQgKi8KKyAgc3lzX3NlbV90IG9wX2NvbXBsZXRlZDsKKyAgLyoqIG1ib3ggd2hlcmUgcmVjZWl2ZWQgcGFja2V0cyBhcmUgc3RvcmVkIHVudGlsIHRoZXkgYXJlIGZldGNoZWQKKyAgICAgIGJ5IHRoZSBuZXRjb25uIGFwcGxpY2F0aW9uIHRocmVhZCAoY2FuIGdyb3cgcXVpdGUgYmlnKSAqLworICBzeXNfbWJveF90IHJlY3ZtYm94OworI2lmIExXSVBfVENQCisgIC8qKiBtYm94IHdoZXJlIG5ldyBjb25uZWN0aW9ucyBhcmUgc3RvcmVkIHVudGlsIHByb2Nlc3NlZAorICAgICAgYnkgdGhlIGFwcGxpY2F0aW9uIHRocmVhZCAqLworICBzeXNfbWJveF90IGFjY2VwdG1ib3g7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKyAgLyoqIG9ubHkgdXNlZCBmb3Igc29ja2V0IGxheWVyICovCisjaWYgTFdJUF9TT0NLRVQKKyAgaW50IHNvY2tldDsKKyNlbmRpZiAvKiBMV0lQX1NPQ0tFVCAqLworI2lmIExXSVBfU09fUkNWVElNRU8KKyAgLyoqIHRpbWVvdXQgdG8gd2FpdCBmb3IgbmV3IGRhdGEgdG8gYmUgcmVjZWl2ZWQKKyAgICAgIChvciBjb25uZWN0aW9ucyB0byBhcnJpdmUgZm9yIGxpc3RlbmluZyBuZXRjb25ucykgKi8KKyAgaW50IHJlY3ZfdGltZW91dDsKKyNlbmRpZiAvKiBMV0lQX1NPX1JDVlRJTUVPICovCisjaWYgTFdJUF9TT19SQ1ZCVUYKKyAgLyoqIG1heGltdW0gYW1vdW50IG9mIGJ5dGVzIHF1ZXVlZCBpbiByZWN2bWJveAorICAgICAgbm90IHVzZWQgZm9yIFRDUDogYWRqdXN0IFRDUF9XTkQgaW5zdGVhZCEgKi8KKyAgaW50IHJlY3ZfYnVmc2l6ZTsKKyAgLyoqIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgaW4gcmVjdm1ib3ggdG8gYmUgcmVjZWl2ZWQsCisgICAgICB0ZXN0ZWQgYWdhaW5zdCByZWN2X2J1ZnNpemUgdG8gbGltaXQgYnl0ZXMgb24gcmVjdm1ib3gKKyAgICAgIGZvciBVRFAgYW5kIFJBVywgdXNlZCBmb3IgRklPTlJFQUQgKi8KKyAgczE2X3QgcmVjdl9hdmFpbDsKKyNlbmRpZiAvKiBMV0lQX1NPX1JDVkJVRiAqLworICAvKiogZmxhZ3MgaG9sZGluZyBtb3JlIG5ldGNvbm4taW50ZXJuYWwgc3RhdGUsIHNlZSBORVRDT05OX0ZMQUdfKiBkZWZpbmVzICovCisgIHU4X3QgZmxhZ3M7CisjaWYgTFdJUF9UQ1AKKyAgLyoqIFRDUDogd2hlbiBkYXRhIHBhc3NlZCB0byBuZXRjb25uX3dyaXRlIGRvZXNuJ3QgZml0IGludG8gdGhlIHNlbmQgYnVmZmVyLAorICAgICAgdGhpcyB0ZW1wb3JhcmlseSBzdG9yZXMgaG93IG11Y2ggaXMgYWxyZWFkeSBzZW50LiAqLworICBzaXplX3Qgd3JpdGVfb2Zmc2V0OworICAvKiogVENQOiB3aGVuIGRhdGEgcGFzc2VkIHRvIG5ldGNvbm5fd3JpdGUgZG9lc24ndCBmaXQgaW50byB0aGUgc2VuZCBidWZmZXIsCisgICAgICB0aGlzIHRlbXBvcmFyaWx5IHN0b3JlcyB0aGUgbWVzc2FnZS4KKyAgICAgIEFsc28gdXNlZCBkdXJpbmcgY29ubmVjdCBhbmQgY2xvc2UuICovCisgIHN0cnVjdCBhcGlfbXNnX21zZyAqY3VycmVudF9tc2c7CisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKyAgLyoqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbmZvcm1lZCBhYm91dCBldmVudHMgZm9yIHRoaXMgbmV0Y29ubiAqLworICBuZXRjb25uX2NhbGxiYWNrIGNhbGxiYWNrOworfTsKKworLyoqIFJlZ2lzdGVyIGFuIE5ldHdvcmsgY29ubmVjdGlvbiBldmVudCAqLworI2RlZmluZSBBUElfRVZFTlQoYyxlLGwpIGlmIChjLT5jYWxsYmFjaykgeyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgqYy0+Y2FsbGJhY2spKGMsIGUsIGwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisvKiogU2V0IGNvbm4tPmxhc3RfZXJyIHRvIGVyciBidXQgZG9uJ3Qgb3ZlcndyaXRlIGZhdGFsIGVycm9ycyAqLworI2RlZmluZSBORVRDT05OX1NFVF9TQUZFX0VSUihjb25uLCBlcnIpIGRvIHsgXAorICBTWVNfQVJDSF9ERUNMX1BST1RFQ1QobGV2KTsgXAorICBTWVNfQVJDSF9QUk9URUNUKGxldik7IFwKKyAgaWYgKCFFUlJfSVNfRkFUQUwoKGNvbm4pLT5sYXN0X2VycikpIHsgXAorICAgIChjb25uKS0+bGFzdF9lcnIgPSBlcnI7IFwKKyAgfSBcCisgIFNZU19BUkNIX1VOUFJPVEVDVChsZXYpOyBcCit9IHdoaWxlKDApOworCisvKiBOZXR3b3JrIGNvbm5lY3Rpb24gZnVuY3Rpb25zOiAqLworI2RlZmluZSBuZXRjb25uX25ldyh0KSAgICAgICAgICAgICAgICAgIG5ldGNvbm5fbmV3X3dpdGhfcHJvdG9fYW5kX2NhbGxiYWNrKHQsIDAsIE5VTEwpCisjZGVmaW5lIG5ldGNvbm5fbmV3X3dpdGhfY2FsbGJhY2sodCwgYykgbmV0Y29ubl9uZXdfd2l0aF9wcm90b19hbmRfY2FsbGJhY2sodCwgMCwgYykKK3N0cnVjdAorbmV0Y29ubiAqbmV0Y29ubl9uZXdfd2l0aF9wcm90b19hbmRfY2FsbGJhY2soZW51bSBuZXRjb25uX3R5cGUgdCwgdThfdCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGNvbm5fY2FsbGJhY2sgY2FsbGJhY2spOworZXJyX3QgICBuZXRjb25uX2RlbGV0ZShzdHJ1Y3QgbmV0Y29ubiAqY29ubik7CisvKiogR2V0IHRoZSB0eXBlIG9mIGEgbmV0Y29ubiAoYXMgZW51bSBuZXRjb25uX3R5cGUpLiAqLworI2RlZmluZSBuZXRjb25uX3R5cGUoY29ubikgKGNvbm4tPnR5cGUpCisKK2Vycl90ICAgbmV0Y29ubl9nZXRhZGRyKHN0cnVjdCBuZXRjb25uICpjb25uLCBpcF9hZGRyX3QgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCAqcG9ydCwgdThfdCBsb2NhbCk7CisjZGVmaW5lIG5ldGNvbm5fcGVlcihjLGkscCkgbmV0Y29ubl9nZXRhZGRyKGMsaSxwLDApCisjZGVmaW5lIG5ldGNvbm5fYWRkcihjLGkscCkgbmV0Y29ubl9nZXRhZGRyKGMsaSxwLDEpCisKK2Vycl90ICAgbmV0Y29ubl9iaW5kKHN0cnVjdCBuZXRjb25uICpjb25uLCBpcF9hZGRyX3QgKmFkZHIsIHUxNl90IHBvcnQpOworZXJyX3QgICBuZXRjb25uX2Nvbm5lY3Qoc3RydWN0IG5ldGNvbm4gKmNvbm4sIGlwX2FkZHJfdCAqYWRkciwgdTE2X3QgcG9ydCk7CitlcnJfdCAgIG5ldGNvbm5fZGlzY29ubmVjdCAoc3RydWN0IG5ldGNvbm4gKmNvbm4pOworZXJyX3QgICBuZXRjb25uX2xpc3Rlbl93aXRoX2JhY2tsb2coc3RydWN0IG5ldGNvbm4gKmNvbm4sIHU4X3QgYmFja2xvZyk7CisjZGVmaW5lIG5ldGNvbm5fbGlzdGVuKGNvbm4pIG5ldGNvbm5fbGlzdGVuX3dpdGhfYmFja2xvZyhjb25uLCBUQ1BfREVGQVVMVF9MSVNURU5fQkFDS0xPRykKK2Vycl90ICAgbmV0Y29ubl9hY2NlcHQoc3RydWN0IG5ldGNvbm4gKmNvbm4sIHN0cnVjdCBuZXRjb25uICoqbmV3X2Nvbm4pOworZXJyX3QgICBuZXRjb25uX3JlY3Yoc3RydWN0IG5ldGNvbm4gKmNvbm4sIHN0cnVjdCBuZXRidWYgKipuZXdfYnVmKTsKK2Vycl90ICAgbmV0Y29ubl9yZWN2X3RjcF9wYnVmKHN0cnVjdCBuZXRjb25uICpjb25uLCBzdHJ1Y3QgcGJ1ZiAqKm5ld19idWYpOwordm9pZCAgICBuZXRjb25uX3JlY3ZlZChzdHJ1Y3QgbmV0Y29ubiAqY29ubiwgdTMyX3QgbGVuZ3RoKTsKK2Vycl90ICAgbmV0Y29ubl9zZW5kdG8oc3RydWN0IG5ldGNvbm4gKmNvbm4sIHN0cnVjdCBuZXRidWYgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBfYWRkcl90ICphZGRyLCB1MTZfdCBwb3J0KTsKK2Vycl90ICAgbmV0Y29ubl9zZW5kKHN0cnVjdCBuZXRjb25uICpjb25uLCBzdHJ1Y3QgbmV0YnVmICpidWYpOworZXJyX3QgICBuZXRjb25uX3dyaXRlKHN0cnVjdCBuZXRjb25uICpjb25uLCBjb25zdCB2b2lkICpkYXRhcHRyLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB1OF90IGFwaWZsYWdzKTsKK2Vycl90ICAgbmV0Y29ubl9jbG9zZShzdHJ1Y3QgbmV0Y29ubiAqY29ubik7CitlcnJfdCAgIG5ldGNvbm5fc2h1dGRvd24oc3RydWN0IG5ldGNvbm4gKmNvbm4sIHU4X3Qgc2h1dF9yeCwgdThfdCBzaHV0X3R4KTsKKworI2lmIExXSVBfSUdNUAorZXJyX3QgICBuZXRjb25uX2pvaW5fbGVhdmVfZ3JvdXAoc3RydWN0IG5ldGNvbm4gKmNvbm4sIGlwX2FkZHJfdCAqbXVsdGlhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBfYWRkcl90ICpuZXRpZl9hZGRyLCBlbnVtIG5ldGNvbm5faWdtcCBqb2luX29yX2xlYXZlKTsKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKyNpZiBMV0lQX0ROUworZXJyX3QgICBuZXRjb25uX2dldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSwgaXBfYWRkcl90ICphZGRyKTsKKyNlbmRpZiAvKiBMV0lQX0ROUyAqLworCisjZGVmaW5lIG5ldGNvbm5fZXJyKGNvbm4pICAgICAgICAgICAgICAgKChjb25uKS0+bGFzdF9lcnIpCisjZGVmaW5lIG5ldGNvbm5fcmVjdl9idWZzaXplKGNvbm4pICAgICAgKChjb25uKS0+cmVjdl9idWZzaXplKQorCisvKiogU2V0IHRoZSBibG9ja2luZyBzdGF0dXMgb2YgbmV0Y29ubiBjYWxscyAoQHRvZG86IHdyaXRlL3NlbmQgaXMgbWlzc2luZykgKi8KKyNkZWZpbmUgbmV0Y29ubl9zZXRfbm9uYmxvY2tpbmcoY29ubiwgdmFsKSAgZG8geyBpZih2YWwpIHsgXAorICAoY29ubiktPmZsYWdzIHw9IE5FVENPTk5fRkxBR19OT05fQkxPQ0tJTkc7IFwKK30gZWxzZSB7IFwKKyAgKGNvbm4pLT5mbGFncyAmPSB+IE5FVENPTk5fRkxBR19OT05fQkxPQ0tJTkc7IH19IHdoaWxlKDApCisvKiogR2V0IHRoZSBibG9ja2luZyBzdGF0dXMgb2YgbmV0Y29ubiBjYWxscyAoQHRvZG86IHdyaXRlL3NlbmQgaXMgbWlzc2luZykgKi8KKyNkZWZpbmUgbmV0Y29ubl9pc19ub25ibG9ja2luZyhjb25uKSAgICAgICAgKCgoY29ubiktPmZsYWdzICYgTkVUQ09OTl9GTEFHX05PTl9CTE9DS0lORykgIT0gMCkKKworLyoqIFRDUDogU2V0IHRoZSBuby1hdXRvLXJlY3ZlZCBzdGF0dXMgb2YgbmV0Y29ubiBjYWxscyAoc2VlIE5FVENPTk5fRkxBR19OT19BVVRPX1JFQ1ZFRCkgKi8KKyNkZWZpbmUgbmV0Y29ubl9zZXRfbm9hdXRvcmVjdmVkKGNvbm4sIHZhbCkgIGRvIHsgaWYodmFsKSB7IFwKKyAgKGNvbm4pLT5mbGFncyB8PSBORVRDT05OX0ZMQUdfTk9fQVVUT19SRUNWRUQ7IFwKK30gZWxzZSB7IFwKKyAgKGNvbm4pLT5mbGFncyAmPSB+IE5FVENPTk5fRkxBR19OT19BVVRPX1JFQ1ZFRDsgfX0gd2hpbGUoMCkKKy8qKiBUQ1A6IEdldCB0aGUgbm8tYXV0by1yZWN2ZWQgc3RhdHVzIG9mIG5ldGNvbm4gY2FsbHMgKHNlZSBORVRDT05OX0ZMQUdfTk9fQVVUT19SRUNWRUQpICovCisjZGVmaW5lIG5ldGNvbm5fZ2V0X25vYXV0b3JlY3ZlZChjb25uKSAgICAgICAgKCgoY29ubiktPmZsYWdzICYgTkVUQ09OTl9GTEFHX05PX0FVVE9fUkVDVkVEKSAhPSAwKQorCisjaWYgTFdJUF9TT19SQ1ZUSU1FTworLyoqIFNldCB0aGUgcmVjZWl2ZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBuZXRjb25uX3NldF9yZWN2dGltZW91dChjb25uLCB0aW1lb3V0KSAgICAgICgoY29ubiktPnJlY3ZfdGltZW91dCA9ICh0aW1lb3V0KSkKKy8qKiBHZXQgdGhlIHJlY2VpdmUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgbmV0Y29ubl9nZXRfcmVjdnRpbWVvdXQoY29ubikgICAgICAgICAgICAgICAoKGNvbm4pLT5yZWN2X3RpbWVvdXQpCisjZW5kaWYgLyogTFdJUF9TT19SQ1ZUSU1FTyAqLworI2lmIExXSVBfU09fUkNWQlVGCisvKiogU2V0IHRoZSByZWNlaXZlIGJ1ZmZlciBpbiBieXRlcyAqLworI2RlZmluZSBuZXRjb25uX3NldF9yZWN2YnVmc2l6ZShjb25uLCByZWN2YnVmc2l6ZSkgICgoY29ubiktPnJlY3ZfYnVmc2l6ZSA9IChyZWN2YnVmc2l6ZSkpCisvKiogR2V0IHRoZSByZWNlaXZlIGJ1ZmZlciBpbiBieXRlcyAqLworI2RlZmluZSBuZXRjb25uX2dldF9yZWN2YnVmc2l6ZShjb25uKSAgICAgICAgICAgICAgICgoY29ubiktPnJlY3ZfYnVmc2l6ZSkKKyNlbmRpZiAvKiBMV0lQX1NPX1JDVkJVRiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBMV0lQX05FVENPTk4gKi8KKworI2VuZGlmIC8qIF9fTFdJUF9BUElfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9hcGlfbXNnLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9hcGlfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5ZDhjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2FwaV9tc2cuaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKyNpZm5kZWYgX19MV0lQX0FQSV9NU0dfSF9fCisjZGVmaW5lIF9fTFdJUF9BUElfTVNHX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfTkVUQ09OTiAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAvKiBmb3Igc2l6ZV90ICovCisKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKyNpbmNsdWRlICJsd2lwL2Vyci5oIgorI2luY2x1ZGUgImx3aXAvc3lzLmgiCisjaW5jbHVkZSAibHdpcC9pZ21wLmgiCisjaW5jbHVkZSAibHdpcC9hcGkuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBGb3IgdGhlIG5ldGNvbm4gQVBJLCB0aGVzZSB2YWx1ZXMgYXJlIHVzZSBhcyBhIGJpdG1hc2shICovCisjZGVmaW5lIE5FVENPTk5fU0hVVF9SRCAgIDEKKyNkZWZpbmUgTkVUQ09OTl9TSFVUX1dSICAgMgorI2RlZmluZSBORVRDT05OX1NIVVRfUkRXUiAoTkVUQ09OTl9TSFVUX1JEIHwgTkVUQ09OTl9TSFVUX1dSKQorCisvKiBJUCBhZGRyZXNzZXMgYW5kIHBvcnQgbnVtYmVycyBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4KKyAqIHRoZSBzYW1lIGJ5dGUgb3JkZXIgYXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGNiLgorICovCisvKiogVGhpcyBzdHJ1Y3QgaW5jbHVkZXMgZXZlcnl0aGluZyB0aGF0IGlzIG5lY2Vzc2FyeSB0byBleGVjdXRlIGEgZnVuY3Rpb24KKyAgICBmb3IgYSBuZXRjb25uIGluIGFub3RoZXIgdGhyZWFkIGNvbnRleHQgKG1haW5seSB1c2VkIHRvIHByb2Nlc3MgbmV0Y29ubnMKKyAgICBpbiB0aGUgdGNwaXBfdGhyZWFkIGNvbnRleHQgdG8gYmUgdGhyZWFkIHNhZmUpLiAqLworc3RydWN0IGFwaV9tc2dfbXNnIHsKKyAgLyoqIFRoZSBuZXRjb25uIHdoaWNoIHRvIHByb2Nlc3MgLSBhbHdheXMgbmVlZGVkOiBpdCBpbmNsdWRlcyB0aGUgc2VtYXBob3JlCisgICAgICB3aGljaCBpcyB1c2VkIHRvIGJsb2NrIHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQgdW50aWwgdGhlIGZ1bmN0aW9uIGZpbmlzaGVkLiAqLworICBzdHJ1Y3QgbmV0Y29ubiAqY29ubjsKKyAgLyoqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGV4ZWN1dGVkIGluIHRjcGlwX3RocmVhZC4gKi8KKyAgZXJyX3QgZXJyOworICAvKiogRGVwZW5kaW5nIG9uIHRoZSBleGVjdXRlZCBmdW5jdGlvbiwgb25lIG9mIHRoZXNlIHVuaW9uIG1lbWJlcnMgaXMgdXNlZCAqLworICB1bmlvbiB7CisgICAgLyoqIHVzZWQgZm9yIGRvX3NlbmQgKi8KKyAgICBzdHJ1Y3QgbmV0YnVmICpiOworICAgIC8qKiB1c2VkIGZvciBkb19uZXdjb25uICovCisgICAgc3RydWN0IHsKKyAgICAgIHU4X3QgcHJvdG87CisgICAgfSBuOworICAgIC8qKiB1c2VkIGZvciBkb19iaW5kIGFuZCBkb19jb25uZWN0ICovCisgICAgc3RydWN0IHsKKyAgICAgIGlwX2FkZHJfdCAqaXBhZGRyOworICAgICAgdTE2X3QgcG9ydDsKKyAgICB9IGJjOworICAgIC8qKiB1c2VkIGZvciBkb19nZXRhZGRyICovCisgICAgc3RydWN0IHsKKyAgICAgIGlwX2FkZHJfdCAqaXBhZGRyOworICAgICAgdTE2X3QgKnBvcnQ7CisgICAgICB1OF90IGxvY2FsOworICAgIH0gYWQ7CisgICAgLyoqIHVzZWQgZm9yIGRvX3dyaXRlICovCisgICAgc3RydWN0IHsKKyAgICAgIGNvbnN0IHZvaWQgKmRhdGFwdHI7CisgICAgICBzaXplX3QgbGVuOworICAgICAgdThfdCBhcGlmbGFnczsKKyAgICB9IHc7CisgICAgLyoqIHVzZWQgZm9yIGRvX3JlY3YgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgdTMyX3QgbGVuOworICAgIH0gcjsKKyAgICAvKiogdXNlZCBmb3IgZG9fY2xvc2UgKC9zaHV0ZG93bikgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgdThfdCBzaHV0OworICAgIH0gc2Q7CisjaWYgTFdJUF9JR01QCisgICAgLyoqIHVzZWQgZm9yIGRvX2pvaW5fbGVhdmVfZ3JvdXAgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgaXBfYWRkcl90ICptdWx0aWFkZHI7CisgICAgICBpcF9hZGRyX3QgKm5ldGlmX2FkZHI7CisgICAgICBlbnVtIG5ldGNvbm5faWdtcCBqb2luX29yX2xlYXZlOworICAgIH0gamw7CisjZW5kaWYgLyogTFdJUF9JR01QICovCisjaWYgVENQX0xJU1RFTl9CQUNLTE9HCisgICAgc3RydWN0IHsKKyAgICAgIHU4X3QgYmFja2xvZzsKKyAgICB9IGxiOworI2VuZGlmIC8qIFRDUF9MSVNURU5fQkFDS0xPRyAqLworICB9IG1zZzsKK307CisKKy8qKiBUaGlzIHN0cnVjdCBjb250YWlucyBhIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgaW4gYW5vdGhlciB0aHJlYWQgY29udGV4dCBhbmQKKyAgICBhIHN0cnVjdCBhcGlfbXNnX21zZyB0aGF0IHNlcnZlcyBhcyBhbiBhcmd1bWVudCBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgICBUaGlzIGlzIHBhc3NlZCB0byB0Y3BpcF9hcGltc2cgdG8gZXhlY3V0ZSBmdW5jdGlvbnMgaW4gdGNwaXBfdGhyZWFkIGNvbnRleHQuICovCitzdHJ1Y3QgYXBpX21zZyB7CisgIC8qKiBmdW5jdGlvbiB0byBleGVjdXRlIGluIHRjcGlwX3RocmVhZCBjb250ZXh0ICovCisgIHZvaWQgKCogZnVuY3Rpb24pKHN0cnVjdCBhcGlfbXNnX21zZyAqbXNnKTsKKyAgLyoqIGFyZ3VtZW50cyBmb3IgdGhpcyBmdW5jdGlvbiAqLworICBzdHJ1Y3QgYXBpX21zZ19tc2cgbXNnOworfTsKKworI2lmIExXSVBfRE5TCisvKiogQXMgZG9fZ2V0aG9zdGJ5bmFtZSByZXF1aXJlcyBtb3JlIGFyZ3VtZW50cyBidXQgZG9lc24ndCByZXF1aXJlIGEgbmV0Y29ubiwKKyAgICBpdCBoYXMgaXRzIG93biBzdHJ1Y3QgKHRvIGF2b2lkIHN0cnVjdCBhcGlfbXNnIGdldHRpbmcgYmlnZ2VyIHRoYW4gbmVjZXNzYXJ5KS4KKyAgICBkb19nZXRob3N0YnluYW1lIG11c3QgYmUgY2FsbGVkIHVzaW5nIHRjcGlwX2NhbGxiYWNrIGluc3RlYWQgb2YgdGNwaXBfYXBpbXNnCisgICAgKHNlZSBuZXRjb25uX2dldGhvc3RieW5hbWUpLiAqLworc3RydWN0IGRuc19hcGlfbXNnIHsKKyAgLyoqIEhvc3RuYW1lIHRvIHF1ZXJ5IG9yIGRvdHRlZCBJUCBhZGRyZXNzIHN0cmluZyAqLworICBjb25zdCBjaGFyICpuYW1lOworICAvKiogUmhlIHJlc29sdmVkIGFkZHJlc3MgaXMgc3RvcmVkIGhlcmUgKi8KKyAgaXBfYWRkcl90ICphZGRyOworICAvKiogVGhpcyBzZW1hcGhvcmUgaXMgcG9zdGVkIHdoZW4gdGhlIG5hbWUgaXMgcmVzb2x2ZWQsIHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQKKyAgICAgIHNob3VsZCB3YWl0IG9uIGl0LiAqLworICBzeXNfc2VtX3QgKnNlbTsKKyAgLyoqIEVycm9ycyBhcmUgZ2l2ZW4gYmFjayBoZXJlICovCisgIGVycl90ICplcnI7Cit9OworI2VuZGlmIC8qIExXSVBfRE5TICovCisKK3ZvaWQgZG9fbmV3Y29ubiAgICAgICAgICggc3RydWN0IGFwaV9tc2dfbXNnICptc2cpOwordm9pZCBkb19kZWxjb25uICAgICAgICAgKCBzdHJ1Y3QgYXBpX21zZ19tc2cgKm1zZyk7Cit2b2lkIGRvX2JpbmQgICAgICAgICAgICAoIHN0cnVjdCBhcGlfbXNnX21zZyAqbXNnKTsKK3ZvaWQgZG9fY29ubmVjdCAgICAgICAgICggc3RydWN0IGFwaV9tc2dfbXNnICptc2cpOwordm9pZCBkb19kaXNjb25uZWN0ICAgICAgKCBzdHJ1Y3QgYXBpX21zZ19tc2cgKm1zZyk7Cit2b2lkIGRvX2xpc3RlbiAgICAgICAgICAoIHN0cnVjdCBhcGlfbXNnX21zZyAqbXNnKTsKK3ZvaWQgZG9fc2VuZCAgICAgICAgICAgICggc3RydWN0IGFwaV9tc2dfbXNnICptc2cpOwordm9pZCBkb19yZWN2ICAgICAgICAgICAgKCBzdHJ1Y3QgYXBpX21zZ19tc2cgKm1zZyk7Cit2b2lkIGRvX3dyaXRlICAgICAgICAgICAoIHN0cnVjdCBhcGlfbXNnX21zZyAqbXNnKTsKK3ZvaWQgZG9fZ2V0YWRkciAgICAgICAgICggc3RydWN0IGFwaV9tc2dfbXNnICptc2cpOwordm9pZCBkb19jbG9zZSAgICAgICAgICAgKCBzdHJ1Y3QgYXBpX21zZ19tc2cgKm1zZyk7Cit2b2lkIGRvX3NodXRkb3duICAgICAgICAoIHN0cnVjdCBhcGlfbXNnX21zZyAqbXNnKTsKKyNpZiBMV0lQX0lHTVAKK3ZvaWQgZG9fam9pbl9sZWF2ZV9ncm91cCggc3RydWN0IGFwaV9tc2dfbXNnICptc2cpOworI2VuZGlmIC8qIExXSVBfSUdNUCAqLworCisjaWYgTFdJUF9ETlMKK3ZvaWQgZG9fZ2V0aG9zdGJ5bmFtZSh2b2lkICphcmcpOworI2VuZGlmIC8qIExXSVBfRE5TICovCisKK3N0cnVjdCBuZXRjb25uKiBuZXRjb25uX2FsbG9jKGVudW0gbmV0Y29ubl90eXBlIHQsIG5ldGNvbm5fY2FsbGJhY2sgY2FsbGJhY2spOwordm9pZCBuZXRjb25uX2ZyZWUoc3RydWN0IG5ldGNvbm4gKmNvbm4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTFdJUF9ORVRDT05OICovCisKKyNlbmRpZiAvKiBfX0xXSVBfQVBJX01TR19IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2FyY2guaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2FyY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjRhZjZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvYXJjaC5oCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfQVJDSF9IX18KKyNkZWZpbmUgX19MV0lQX0FSQ0hfSF9fCisKKyNpZm5kZWYgTElUVExFX0VORElBTgorI2RlZmluZSBMSVRUTEVfRU5ESUFOIDEyMzQKKyNlbmRpZgorCisjaWZuZGVmIEJJR19FTkRJQU4KKyNkZWZpbmUgQklHX0VORElBTiA0MzIxCisjZW5kaWYKKworI2luY2x1ZGUgImFyY2gvY2MuaCIKKworLyoqIFRlbXBvcmFyeTogZGVmaW5lIGZvcm1hdCBzdHJpbmcgZm9yIHNpemVfdCBpZiBub3QgZGVmaW5lZCBpbiBjYy5oICovCisjaWZuZGVmIFNaVF9GCisjZGVmaW5lIFNaVF9GIFUzMl9GCisjZW5kaWYgLyogU1pUX0YgKi8KKy8qKiBUZW1wb3JhcnkgdXBncmFkZSBoZWxwZXI6IGRlZmluZSBmb3JtYXQgc3RyaW5nIGZvciB1OF90IGFzIGhleCBpZiBub3QKKyAgICBkZWZpbmVkIGluIGNjLmggKi8KKyNpZm5kZWYgWDhfRgorI2RlZmluZSBYOF9GICAiMDJ4IgorI2VuZGlmIC8qIFg4X0YgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIFBBQ0tfU1RSVUNUX0JFR0lOCisjZGVmaW5lIFBBQ0tfU1RSVUNUX0JFR0lOCisjZW5kaWYgLyogUEFDS19TVFJVQ1RfQkVHSU4gKi8KKworI2lmbmRlZiBQQUNLX1NUUlVDVF9FTkQKKyNkZWZpbmUgUEFDS19TVFJVQ1RfRU5ECisjZW5kaWYgLyogUEFDS19TVFJVQ1RfRU5EICovCisKKyNpZm5kZWYgUEFDS19TVFJVQ1RfRklFTEQKKyNkZWZpbmUgUEFDS19TVFJVQ1RfRklFTEQoeCkgeAorI2VuZGlmIC8qIFBBQ0tfU1RSVUNUX0ZJRUxEICovCisKKworI2lmbmRlZiBMV0lQX1VOVVNFRF9BUkcKKyNkZWZpbmUgTFdJUF9VTlVTRURfQVJHKHgpICh2b2lkKXgKKyNlbmRpZiAvKiBMV0lQX1VOVVNFRF9BUkcgKi8gCisKKworI2lmZGVmIExXSVBfUFJPVklERV9FUlJOTworCisjZGVmaW5lICBFUEVSTSAgICAgICAgIDEgIC8qIE9wZXJhdGlvbiBub3QgcGVybWl0dGVkICovCisjZGVmaW5lICBFTk9FTlQgICAgICAgIDIgIC8qIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgIEVTUkNIICAgICAgICAgMyAgLyogTm8gc3VjaCBwcm9jZXNzICovCisjZGVmaW5lICBFSU5UUiAgICAgICAgIDQgIC8qIEludGVycnVwdGVkIHN5c3RlbSBjYWxsICovCisjZGVmaW5lICBFSU8gICAgICAgICAgIDUgIC8qIEkvTyBlcnJvciAqLworI2RlZmluZSAgRU5YSU8gICAgICAgICA2ICAvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzICovCisjZGVmaW5lICBFMkJJRyAgICAgICAgIDcgIC8qIEFyZyBsaXN0IHRvbyBsb25nICovCisjZGVmaW5lICBFTk9FWEVDICAgICAgIDggIC8qIEV4ZWMgZm9ybWF0IGVycm9yICovCisjZGVmaW5lICBFQkFERiAgICAgICAgIDkgIC8qIEJhZCBmaWxlIG51bWJlciAqLworI2RlZmluZSAgRUNISUxEICAgICAgIDEwICAvKiBObyBjaGlsZCBwcm9jZXNzZXMgKi8KKyNkZWZpbmUgIEVBR0FJTiAgICAgICAxMSAgLyogVHJ5IGFnYWluICovCisjZGVmaW5lICBFTk9NRU0gICAgICAgMTIgIC8qIE91dCBvZiBtZW1vcnkgKi8KKyNkZWZpbmUgIEVBQ0NFUyAgICAgICAxMyAgLyogUGVybWlzc2lvbiBkZW5pZWQgKi8KKyNkZWZpbmUgIEVGQVVMVCAgICAgICAxNCAgLyogQmFkIGFkZHJlc3MgKi8KKyNkZWZpbmUgIEVOT1RCTEsgICAgICAxNSAgLyogQmxvY2sgZGV2aWNlIHJlcXVpcmVkICovCisjZGVmaW5lICBFQlVTWSAgICAgICAgMTYgIC8qIERldmljZSBvciByZXNvdXJjZSBidXN5ICovCisjZGVmaW5lICBFRVhJU1QgICAgICAgMTcgIC8qIEZpbGUgZXhpc3RzICovCisjZGVmaW5lICBFWERFViAgICAgICAgMTggIC8qIENyb3NzLWRldmljZSBsaW5rICovCisjZGVmaW5lICBFTk9ERVYgICAgICAgMTkgIC8qIE5vIHN1Y2ggZGV2aWNlICovCisjZGVmaW5lICBFTk9URElSICAgICAgMjAgIC8qIE5vdCBhIGRpcmVjdG9yeSAqLworI2RlZmluZSAgRUlTRElSICAgICAgIDIxICAvKiBJcyBhIGRpcmVjdG9yeSAqLworI2RlZmluZSAgRUlOVkFMICAgICAgIDIyICAvKiBJbnZhbGlkIGFyZ3VtZW50ICovCisjZGVmaW5lICBFTkZJTEUgICAgICAgMjMgIC8qIEZpbGUgdGFibGUgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgIEVNRklMRSAgICAgICAyNCAgLyogVG9vIG1hbnkgb3BlbiBmaWxlcyAqLworI2RlZmluZSAgRU5PVFRZICAgICAgIDI1ICAvKiBOb3QgYSB0eXBld3JpdGVyICovCisjZGVmaW5lICBFVFhUQlNZICAgICAgMjYgIC8qIFRleHQgZmlsZSBidXN5ICovCisjZGVmaW5lICBFRkJJRyAgICAgICAgMjcgIC8qIEZpbGUgdG9vIGxhcmdlICovCisjZGVmaW5lICBFTk9TUEMgICAgICAgMjggIC8qIE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlICovCisjZGVmaW5lICBFU1BJUEUgICAgICAgMjkgIC8qIElsbGVnYWwgc2VlayAqLworI2RlZmluZSAgRVJPRlMgICAgICAgIDMwICAvKiBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUgIEVNTElOSyAgICAgICAzMSAgLyogVG9vIG1hbnkgbGlua3MgKi8KKyNkZWZpbmUgIEVQSVBFICAgICAgICAzMiAgLyogQnJva2VuIHBpcGUgKi8KKyNkZWZpbmUgIEVET00gICAgICAgICAzMyAgLyogTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmMgKi8KKyNkZWZpbmUgIEVSQU5HRSAgICAgICAzNCAgLyogTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUgKi8KKyNkZWZpbmUgIEVERUFETEsgICAgICAzNSAgLyogUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIgKi8KKyNkZWZpbmUgIEVOQU1FVE9PTE9ORyAzNiAgLyogRmlsZSBuYW1lIHRvbyBsb25nICovCisjZGVmaW5lICBFTk9MQ0sgICAgICAgMzcgIC8qIE5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgIEVOT1NZUyAgICAgICAzOCAgLyogRnVuY3Rpb24gbm90IGltcGxlbWVudGVkICovCisjZGVmaW5lICBFTk9URU1QVFkgICAgMzkgIC8qIERpcmVjdG9yeSBub3QgZW1wdHkgKi8KKyNkZWZpbmUgIEVMT09QICAgICAgICA0MCAgLyogVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQgKi8KKyNkZWZpbmUgIEVXT1VMREJMT0NLICBFQUdBSU4gIC8qIE9wZXJhdGlvbiB3b3VsZCBibG9jayAqLworI2RlZmluZSAgRU5PTVNHICAgICAgIDQyICAvKiBObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSAqLworI2RlZmluZSAgRUlEUk0gICAgICAgIDQzICAvKiBJZGVudGlmaWVyIHJlbW92ZWQgKi8KKyNkZWZpbmUgIEVDSFJORyAgICAgICA0NCAgLyogQ2hhbm5lbCBudW1iZXIgb3V0IG9mIHJhbmdlICovCisjZGVmaW5lICBFTDJOU1lOQyAgICAgNDUgIC8qIExldmVsIDIgbm90IHN5bmNocm9uaXplZCAqLworI2RlZmluZSAgRUwzSExUICAgICAgIDQ2ICAvKiBMZXZlbCAzIGhhbHRlZCAqLworI2RlZmluZSAgRUwzUlNUICAgICAgIDQ3ICAvKiBMZXZlbCAzIHJlc2V0ICovCisjZGVmaW5lICBFTE5STkcgICAgICAgNDggIC8qIExpbmsgbnVtYmVyIG91dCBvZiByYW5nZSAqLworI2RlZmluZSAgRVVOQVRDSCAgICAgIDQ5ICAvKiBQcm90b2NvbCBkcml2ZXIgbm90IGF0dGFjaGVkICovCisjZGVmaW5lICBFTk9DU0kgICAgICAgNTAgIC8qIE5vIENTSSBzdHJ1Y3R1cmUgYXZhaWxhYmxlICovCisjZGVmaW5lICBFTDJITFQgICAgICAgNTEgIC8qIExldmVsIDIgaGFsdGVkICovCisjZGVmaW5lICBFQkFERSAgICAgICAgNTIgIC8qIEludmFsaWQgZXhjaGFuZ2UgKi8KKyNkZWZpbmUgIEVCQURSICAgICAgICA1MyAgLyogSW52YWxpZCByZXF1ZXN0IGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgIEVYRlVMTCAgICAgICA1NCAgLyogRXhjaGFuZ2UgZnVsbCAqLworI2RlZmluZSAgRU5PQU5PICAgICAgIDU1ICAvKiBObyBhbm9kZSAqLworI2RlZmluZSAgRUJBRFJRQyAgICAgIDU2ICAvKiBJbnZhbGlkIHJlcXVlc3QgY29kZSAqLworI2RlZmluZSAgRUJBRFNMVCAgICAgIDU3ICAvKiBJbnZhbGlkIHNsb3QgKi8KKworI2RlZmluZSAgRURFQURMT0NLICAgIEVERUFETEsKKworI2RlZmluZSAgRUJGT05UICAgICAgIDU5ICAvKiBCYWQgZm9udCBmaWxlIGZvcm1hdCAqLworI2RlZmluZSAgRU5PU1RSICAgICAgIDYwICAvKiBEZXZpY2Ugbm90IGEgc3RyZWFtICovCisjZGVmaW5lICBFTk9EQVRBICAgICAgNjEgIC8qIE5vIGRhdGEgYXZhaWxhYmxlICovCisjZGVmaW5lICBFVElNRSAgICAgICAgNjIgIC8qIFRpbWVyIGV4cGlyZWQgKi8KKyNkZWZpbmUgIEVOT1NSICAgICAgICA2MyAgLyogT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzICovCisjZGVmaW5lICBFTk9ORVQgICAgICAgNjQgIC8qIE1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrICovCisjZGVmaW5lICBFTk9QS0cgICAgICAgNjUgIC8qIFBhY2thZ2Ugbm90IGluc3RhbGxlZCAqLworI2RlZmluZSAgRVJFTU9URSAgICAgIDY2ICAvKiBPYmplY3QgaXMgcmVtb3RlICovCisjZGVmaW5lICBFTk9MSU5LICAgICAgNjcgIC8qIExpbmsgaGFzIGJlZW4gc2V2ZXJlZCAqLworI2RlZmluZSAgRUFEViAgICAgICAgIDY4ICAvKiBBZHZlcnRpc2UgZXJyb3IgKi8KKyNkZWZpbmUgIEVTUk1OVCAgICAgICA2OSAgLyogU3Jtb3VudCBlcnJvciAqLworI2RlZmluZSAgRUNPTU0gICAgICAgIDcwICAvKiBDb21tdW5pY2F0aW9uIGVycm9yIG9uIHNlbmQgKi8KKyNkZWZpbmUgIEVQUk9UTyAgICAgICA3MSAgLyogUHJvdG9jb2wgZXJyb3IgKi8KKyNkZWZpbmUgIEVNVUxUSUhPUCAgICA3MiAgLyogTXVsdGlob3AgYXR0ZW1wdGVkICovCisjZGVmaW5lICBFRE9URE9UICAgICAgNzMgIC8qIFJGUyBzcGVjaWZpYyBlcnJvciAqLworI2RlZmluZSAgRUJBRE1TRyAgICAgIDc0ICAvKiBOb3QgYSBkYXRhIG1lc3NhZ2UgKi8KKyNkZWZpbmUgIEVPVkVSRkxPVyAgICA3NSAgLyogVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSAqLworI2RlZmluZSAgRU5PVFVOSVEgICAgIDc2ICAvKiBOYW1lIG5vdCB1bmlxdWUgb24gbmV0d29yayAqLworI2RlZmluZSAgRUJBREZEICAgICAgIDc3ICAvKiBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlICovCisjZGVmaW5lICBFUkVNQ0hHICAgICAgNzggIC8qIFJlbW90ZSBhZGRyZXNzIGNoYW5nZWQgKi8KKyNkZWZpbmUgIEVMSUJBQ0MgICAgICA3OSAgLyogQ2FuIG5vdCBhY2Nlc3MgYSBuZWVkZWQgc2hhcmVkIGxpYnJhcnkgKi8KKyNkZWZpbmUgIEVMSUJCQUQgICAgICA4MCAgLyogQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5ICovCisjZGVmaW5lICBFTElCU0NOICAgICAgODEgIC8qIC5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWQgKi8KKyNkZWZpbmUgIEVMSUJNQVggICAgICA4MiAgLyogQXR0ZW1wdGluZyB0byBsaW5rIGluIHRvbyBtYW55IHNoYXJlZCBsaWJyYXJpZXMgKi8KKyNkZWZpbmUgIEVMSUJFWEVDICAgICA4MyAgLyogQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSAqLworI2RlZmluZSAgRUlMU0VRICAgICAgIDg0ICAvKiBJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgIEVSRVNUQVJUICAgICA4NSAgLyogSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgc2hvdWxkIGJlIHJlc3RhcnRlZCAqLworI2RlZmluZSAgRVNUUlBJUEUgICAgIDg2ICAvKiBTdHJlYW1zIHBpcGUgZXJyb3IgKi8KKyNkZWZpbmUgIEVVU0VSUyAgICAgICA4NyAgLyogVG9vIG1hbnkgdXNlcnMgKi8KKyNkZWZpbmUgIEVOT1RTT0NLICAgICA4OCAgLyogU29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0ICovCisjZGVmaW5lICBFREVTVEFERFJSRVEgODkgIC8qIERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQgKi8KKyNkZWZpbmUgIEVNU0dTSVpFICAgICA5MCAgLyogTWVzc2FnZSB0b28gbG9uZyAqLworI2RlZmluZSAgRVBST1RPVFlQRSAgIDkxICAvKiBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQgKi8KKyNkZWZpbmUgIEVOT1BST1RPT1BUICA5MiAgLyogUHJvdG9jb2wgbm90IGF2YWlsYWJsZSAqLworI2RlZmluZSAgRVBST1RPTk9TVVBQT1JUIDkzICAvKiBQcm90b2NvbCBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lICBFU09DS1ROT1NVUFBPUlQgOTQgIC8qIFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIEVPUE5PVFNVUFAgICAgICA5NSAgLyogT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50ICovCisjZGVmaW5lICBFUEZOT1NVUFBPUlQgICAgOTYgIC8qIFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lICBFQUZOT1NVUFBPUlQgICAgOTcgIC8qIEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wgKi8KKyNkZWZpbmUgIEVBRERSSU5VU0UgICAgICA5OCAgLyogQWRkcmVzcyBhbHJlYWR5IGluIHVzZSAqLworI2RlZmluZSAgRUFERFJOT1RBVkFJTCAgIDk5ICAvKiBDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzICovCisjZGVmaW5lICBFTkVURE9XTiAgICAgICAxMDAgIC8qIE5ldHdvcmsgaXMgZG93biAqLworI2RlZmluZSAgRU5FVFVOUkVBQ0ggICAgMTAxICAvKiBOZXR3b3JrIGlzIHVucmVhY2hhYmxlICovCisjZGVmaW5lICBFTkVUUkVTRVQgICAgICAxMDIgIC8qIE5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgcmVzZXQgKi8KKyNkZWZpbmUgIEVDT05OQUJPUlRFRCAgIDEwMyAgLyogU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQgKi8KKyNkZWZpbmUgIEVDT05OUkVTRVQgICAgIDEwNCAgLyogQ29ubmVjdGlvbiByZXNldCBieSBwZWVyICovCisjZGVmaW5lICBFTk9CVUZTICAgICAgICAxMDUgIC8qIE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgIEVJU0NPTk4gICAgICAgIDEwNiAgLyogVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkICovCisjZGVmaW5lICBFTk9UQ09OTiAgICAgICAxMDcgIC8qIFRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkICovCisjZGVmaW5lICBFU0hVVERPV04gICAgICAxMDggIC8qIENhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biAqLworI2RlZmluZSAgRVRPT01BTllSRUZTICAgMTA5ICAvKiBUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlICovCisjZGVmaW5lICBFVElNRURPVVQgICAgICAxMTAgIC8qIENvbm5lY3Rpb24gdGltZWQgb3V0ICovCisjZGVmaW5lICBFQ09OTlJFRlVTRUQgICAxMTEgIC8qIENvbm5lY3Rpb24gcmVmdXNlZCAqLworI2RlZmluZSAgRUhPU1RET1dOICAgICAgMTEyICAvKiBIb3N0IGlzIGRvd24gKi8KKyNkZWZpbmUgIEVIT1NUVU5SRUFDSCAgIDExMyAgLyogTm8gcm91dGUgdG8gaG9zdCAqLworI2RlZmluZSAgRUFMUkVBRFkgICAgICAgMTE0ICAvKiBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyAqLworI2RlZmluZSAgRUlOUFJPR1JFU1MgICAgMTE1ICAvKiBPcGVyYXRpb24gbm93IGluIHByb2dyZXNzICovCisjZGVmaW5lICBFU1RBTEUgICAgICAgICAxMTYgIC8qIFN0YWxlIE5GUyBmaWxlIGhhbmRsZSAqLworI2RlZmluZSAgRVVDTEVBTiAgICAgICAgMTE3ICAvKiBTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmcgKi8KKyNkZWZpbmUgIEVOT1ROQU0gICAgICAgIDExOCAgLyogTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlICovCisjZGVmaW5lICBFTkFWQUlMICAgICAgICAxMTkgIC8qIE5vIFhFTklYIHNlbWFwaG9yZXMgYXZhaWxhYmxlICovCisjZGVmaW5lICBFSVNOQU0gICAgICAgICAxMjAgIC8qIElzIGEgbmFtZWQgdHlwZSBmaWxlICovCisjZGVmaW5lICBFUkVNT1RFSU8gICAgICAxMjEgIC8qIFJlbW90ZSBJL08gZXJyb3IgKi8KKyNkZWZpbmUgIEVEUVVPVCAgICAgICAgIDEyMiAgLyogUXVvdGEgZXhjZWVkZWQgKi8KKworI2RlZmluZSAgRU5PTUVESVVNICAgICAgMTIzICAvKiBObyBtZWRpdW0gZm91bmQgKi8KKyNkZWZpbmUgIEVNRURJVU1UWVBFICAgIDEyNCAgLyogV3JvbmcgbWVkaXVtIHR5cGUgKi8KKworCisjZGVmaW5lIEVOU1JPSyAgICAgICAgICAgICAgICAgICAgMCAvKiBETlMgc2VydmVyIHJldHVybmVkIGFuc3dlciB3aXRoIG5vIGRhdGEgKi8KKyNkZWZpbmUgRU5TUk5PREFUQSAgICAgICAgICAgICAgMTYwIC8qIEROUyBzZXJ2ZXIgcmV0dXJuZWQgYW5zd2VyIHdpdGggbm8gZGF0YSAqLworI2RlZmluZSBFTlNSRk9STUVSUiAgICAgICAgICAgICAxNjEgLyogRE5TIHNlcnZlciBjbGFpbXMgcXVlcnkgd2FzIG1pc2Zvcm1hdHRlZCAqLworI2RlZmluZSBFTlNSU0VSVkZBSUwgICAgICAgICAgICAxNjIgLyogRE5TIHNlcnZlciByZXR1cm5lZCBnZW5lcmFsIGZhaWx1cmUgKi8KKyNkZWZpbmUgRU5TUk5PVEZPVU5EICAgICAgICAgICAgMTYzIC8qIERvbWFpbiBuYW1lIG5vdCBmb3VuZCAqLworI2RlZmluZSBFTlNSTk9USU1QICAgICAgICAgICAgICAxNjQgLyogRE5TIHNlcnZlciBkb2VzIG5vdCBpbXBsZW1lbnQgcmVxdWVzdGVkIG9wZXJhdGlvbiAqLworI2RlZmluZSBFTlNSUkVGVVNFRCAgICAgICAgICAgICAxNjUgLyogRE5TIHNlcnZlciByZWZ1c2VkIHF1ZXJ5ICovCisjZGVmaW5lIEVOU1JCQURRVUVSWSAgICAgICAgICAgIDE2NiAvKiBNaXNmb3JtYXR0ZWQgRE5TIHF1ZXJ5ICovCisjZGVmaW5lIEVOU1JCQUROQU1FICAgICAgICAgICAgIDE2NyAvKiBNaXNmb3JtYXR0ZWQgZG9tYWluIG5hbWUgKi8KKyNkZWZpbmUgRU5TUkJBREZBTUlMWSAgICAgICAgICAgMTY4IC8qIFVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5ICovCisjZGVmaW5lIEVOU1JCQURSRVNQICAgICAgICAgICAgIDE2OSAvKiBNaXNmb3JtYXR0ZWQgRE5TIHJlcGx5ICovCisjZGVmaW5lIEVOU1JDT05OUkVGVVNFRCAgICAgICAgIDE3MCAvKiBDb3VsZCBub3QgY29udGFjdCBETlMgc2VydmVycyAqLworI2RlZmluZSBFTlNSVElNRU9VVCAgICAgICAgICAgICAxNzEgLyogVGltZW91dCB3aGlsZSBjb250YWN0aW5nIEROUyBzZXJ2ZXJzICovCisjZGVmaW5lIEVOU1JPRiAgICAgICAgICAgICAgICAgIDE3MiAvKiBFbmQgb2YgZmlsZSAqLworI2RlZmluZSBFTlNSRklMRSAgICAgICAgICAgICAgICAxNzMgLyogRXJyb3IgcmVhZGluZyBmaWxlICovCisjZGVmaW5lIEVOU1JOT01FTSAgICAgICAgICAgICAgIDE3NCAvKiBPdXQgb2YgbWVtb3J5ICovCisjZGVmaW5lIEVOU1JERVNUUlVDVElPTiAgICAgICAgIDE3NSAvKiBBcHBsaWNhdGlvbiB0ZXJtaW5hdGVkIGxvb2t1cCAqLworI2RlZmluZSBFTlNSUVVFUllET01BSU5UT09MT05HICAxNzYgLyogRG9tYWluIG5hbWUgaXMgdG9vIGxvbmcgKi8KKyNkZWZpbmUgRU5TUkNOQU1FTE9PUCAgICAgICAgICAgMTc3IC8qIERvbWFpbiBuYW1lIGlzIHRvbyBsb25nICovCisKKyNpZm5kZWYgZXJybm8KK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKworI2VuZGlmIC8qIExXSVBfUFJPVklERV9FUlJOTyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19MV0lQX0FSQ0hfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9kZWJ1Zy5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODM1OWVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvZGVidWcuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfREVCVUdfSF9fCisjZGVmaW5lIF9fTFdJUF9ERUJVR19IX18KKworI2luY2x1ZGUgImx3aXAvYXJjaC5oIgorCisvKiogbG93ZXIgdHdvIGJpdHMgaW5kaWNhdGUgZGVidWcgbGV2ZWwKKyAqIC0gMCBhbGwKKyAqIC0gMSB3YXJuaW5nCisgKiAtIDIgc2VyaW91cworICogLSAzIHNldmVyZQorICovCisjZGVmaW5lIExXSVBfREJHX0xFVkVMX0FMTCAgICAgMHgwMAorI2RlZmluZSBMV0lQX0RCR19MRVZFTF9PRkYgICAgIExXSVBfREJHX0xFVkVMX0FMTCAvKiBjb21wYXRpYmlsaXR5IGRlZmluZSBvbmx5ICovCisjZGVmaW5lIExXSVBfREJHX0xFVkVMX1dBUk5JTkcgMHgwMSAvKiBiYWQgY2hlY2tzdW1zLCBkcm9wcGVkIHBhY2tldHMsIC4uLiAqLworI2RlZmluZSBMV0lQX0RCR19MRVZFTF9TRVJJT1VTIDB4MDIgLyogbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMsIC4uLiAqLworI2RlZmluZSBMV0lQX0RCR19MRVZFTF9TRVZFUkUgIDB4MDMKKyNkZWZpbmUgTFdJUF9EQkdfTUFTS19MRVZFTCAgICAweDAzCisKKy8qKiBmbGFnIGZvciBMV0lQX0RFQlVHRiB0byBlbmFibGUgdGhhdCBkZWJ1ZyBtZXNzYWdlICovCisjZGVmaW5lIExXSVBfREJHX09OICAgICAgICAgICAgMHg4MFUKKy8qKiBmbGFnIGZvciBMV0lQX0RFQlVHRiB0byBkaXNhYmxlIHRoYXQgZGVidWcgbWVzc2FnZSAqLworI2RlZmluZSBMV0lQX0RCR19PRkYgICAgICAgICAgIDB4MDBVCisKKy8qKiBmbGFnIGZvciBMV0lQX0RFQlVHRiBpbmRpY2F0aW5nIGEgdHJhY2luZyBtZXNzYWdlICh0byBmb2xsb3cgcHJvZ3JhbSBmbG93KSAqLworI2RlZmluZSBMV0lQX0RCR19UUkFDRSAgICAgICAgIDB4NDBVCisvKiogZmxhZyBmb3IgTFdJUF9ERUJVR0YgaW5kaWNhdGluZyBhIHN0YXRlIGRlYnVnIG1lc3NhZ2UgKHRvIGZvbGxvdyBtb2R1bGUgc3RhdGVzKSAqLworI2RlZmluZSBMV0lQX0RCR19TVEFURSAgICAgICAgIDB4MjBVCisvKiogZmxhZyBmb3IgTFdJUF9ERUJVR0YgaW5kaWNhdGluZyBuZXdseSBhZGRlZCBjb2RlLCBub3QgdGhvcm91Z2hseSB0ZXN0ZWQgeWV0ICovCisjZGVmaW5lIExXSVBfREJHX0ZSRVNIICAgICAgICAgMHgxMFUKKy8qKiBmbGFnIGZvciBMV0lQX0RFQlVHRiB0byBoYWx0IGFmdGVyIHByaW50aW5nIHRoaXMgZGVidWcgbWVzc2FnZSAqLworI2RlZmluZSBMV0lQX0RCR19IQUxUICAgICAgICAgIDB4MDhVCisKKyNpZm5kZWYgTFdJUF9OT0FTU0VSVAorI2RlZmluZSBMV0lQX0FTU0VSVChtZXNzYWdlLCBhc3NlcnRpb24pIGRvIHsgaWYoIShhc3NlcnRpb24pKSBcCisgIExXSVBfUExBVEZPUk1fQVNTRVJUKG1lc3NhZ2UpOyB9IHdoaWxlKDApCisjZWxzZSAgLyogTFdJUF9OT0FTU0VSVCAqLworI2RlZmluZSBMV0lQX0FTU0VSVChtZXNzYWdlLCBhc3NlcnRpb24pIAorI2VuZGlmIC8qIExXSVBfTk9BU1NFUlQgKi8KKworLyoqIGlmICJleHByZXNzaW9uIiBpc24ndCB0cnVlLCB0aGVuIHByaW50ICJtZXNzYWdlIiBhbmQgZXhlY3V0ZSAiaGFuZGxlciIgZXhwcmVzc2lvbiAqLworI2lmbmRlZiBMV0lQX0VSUk9SCisjZGVmaW5lIExXSVBfRVJST1IobWVzc2FnZSwgZXhwcmVzc2lvbiwgaGFuZGxlcikgZG8geyBpZiAoIShleHByZXNzaW9uKSkgeyBcCisgIExXSVBfUExBVEZPUk1fQVNTRVJUKG1lc3NhZ2UpOyBoYW5kbGVyO319IHdoaWxlKDApCisjZW5kaWYgLyogTFdJUF9FUlJPUiAqLworCisjaWZkZWYgTFdJUF9ERUJVRworLyoqIHByaW50IGRlYnVnIG1lc3NhZ2Ugb25seSBpZiBkZWJ1ZyBtZXNzYWdlIHR5cGUgaXMgZW5hYmxlZC4uLgorICogIEFORCBpcyBvZiBjb3JyZWN0IHR5cGUgQU5EIGlzIGF0IGxlYXN0IExXSVBfREJHX0xFVkVMCisgKi8KKyNkZWZpbmUgTFdJUF9ERUJVR0YoZGVidWcsIG1lc3NhZ2UpIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRlYnVnKSAmIExXSVBfREJHX09OKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZGVidWcpICYgTFdJUF9EQkdfVFlQRVNfT04pICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzMTZfdCkoKGRlYnVnKSAmIExXSVBfREJHX01BU0tfTEVWRUwpID49IExXSVBfREJHX01JTl9MRVZFTCkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFdJUF9QTEFURk9STV9ESUFHKG1lc3NhZ2UpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRlYnVnKSAmIExXSVBfREJHX0hBTFQpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSgxKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworI2Vsc2UgIC8qIExXSVBfREVCVUcgKi8KKyNkZWZpbmUgTFdJUF9ERUJVR0YoZGVidWcsIG1lc3NhZ2UpIAorI2VuZGlmIC8qIExXSVBfREVCVUcgKi8KKworI2VuZGlmIC8qIF9fTFdJUF9ERUJVR19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvZGVmLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjZkZTZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvZGVmLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisjaWZuZGVmIF9fTFdJUF9ERUZfSF9fCisjZGVmaW5lIF9fTFdJUF9ERUZfSF9fCisKKy8qIGFyY2guaCBtaWdodCBkZWZpbmUgTlVMTCBhbHJlYWR5ICovCisjaW5jbHVkZSAibHdpcC9hcmNoLmgiCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIExXSVBfTUFYKHggLCB5KSAgKCgoeCkgPiAoeSkpID8gKHgpIDogKHkpKQorI2RlZmluZSBMV0lQX01JTih4ICwgeSkgICgoKHgpIDwgKHkpKSA/ICh4KSA6ICh5KSkKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKyNlbmRpZgorCisvKiogR2V0IHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gMiB1MzJfdCB2YWx1ZXMgKGNvcnJlY3Rpbmcgb3ZlcmZsb3dzKQorICogJ2EnIGlzIGV4cGVjdGVkIHRvIGJlICdoaWdoZXInICh3aXRob3V0IG92ZXJmbG93KSB0aGFuICdiJy4gKi8KKyNkZWZpbmUgTFdJUF9VMzJfRElGRihhLCBiKSAoKChhKSA+PSAoYikpID8gKChhKSAtIChiKSkgOiAoKChhKSArICgoYikgXiAweEZGRkZGRkZGKSArIDEpKSkgCisKKy8qIEVuZGlhbmVzcy1vcHRpbWl6ZWQgc2hpZnRpbmcgb2YgdHdvIHU4X3QgdG8gY3JlYXRlIG9uZSB1MTZfdCAqLworI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorI2RlZmluZSBMV0lQX01BS0VfVTE2KGEsIGIpICgoYSA8PCA4KSB8IGIpCisjZWxzZQorI2RlZmluZSBMV0lQX01BS0VfVTE2KGEsIGIpICgoYiA8PCA4KSB8IGEpCisjZW5kaWYgCisKKyNpZm5kZWYgTFdJUF9QTEFURk9STV9CWVRFU1dBUAorI2RlZmluZSBMV0lQX1BMQVRGT1JNX0JZVEVTV0FQIDAKKyNlbmRpZgorCisjaWZuZGVmIExXSVBfUFJFRklYX0JZVEVPUkRFUl9GVU5DUworLyogd29ya2Fyb3VuZCBmb3IgbmFtaW5nIGNvbGxpc2lvbnMgb24gc29tZSBwbGF0Zm9ybXMgKi8KKworI2lmZGVmIGh0b25zCisjdW5kZWYgaHRvbnMKKyNlbmRpZiAvKiBodG9ucyAqLworI2lmZGVmIGh0b25sCisjdW5kZWYgaHRvbmwKKyNlbmRpZiAvKiBodG9ubCAqLworI2lmZGVmIG50b2hzCisjdW5kZWYgbnRvaHMKKyNlbmRpZiAvKiBudG9ocyAqLworI2lmZGVmIG50b2hsCisjdW5kZWYgbnRvaGwKKyNlbmRpZiAvKiBudG9obCAqLworCisjZGVmaW5lIGh0b25zKHgpIGx3aXBfaHRvbnMoeCkKKyNkZWZpbmUgbnRvaHMoeCkgbHdpcF9udG9ocyh4KQorI2RlZmluZSBodG9ubCh4KSBsd2lwX2h0b25sKHgpCisjZGVmaW5lIG50b2hsKHgpIGx3aXBfbnRvaGwoeCkKKyNlbmRpZiAvKiBMV0lQX1BSRUZJWF9CWVRFT1JERVJfRlVOQ1MgKi8KKworI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorI2RlZmluZSBsd2lwX2h0b25zKHgpICh4KQorI2RlZmluZSBsd2lwX250b2hzKHgpICh4KQorI2RlZmluZSBsd2lwX2h0b25sKHgpICh4KQorI2RlZmluZSBsd2lwX250b2hsKHgpICh4KQorI2RlZmluZSBQUF9IVE9OUyh4KSAoeCkKKyNkZWZpbmUgUFBfTlRPSFMoeCkgKHgpCisjZGVmaW5lIFBQX0hUT05MKHgpICh4KQorI2RlZmluZSBQUF9OVE9ITCh4KSAoeCkKKyNlbHNlIC8qIEJZVEVfT1JERVIgIT0gQklHX0VORElBTiAqLworI2lmIExXSVBfUExBVEZPUk1fQllURVNXQVAKKyNkZWZpbmUgbHdpcF9odG9ucyh4KSBMV0lQX1BMQVRGT1JNX0hUT05TKHgpCisjZGVmaW5lIGx3aXBfbnRvaHMoeCkgTFdJUF9QTEFURk9STV9IVE9OUyh4KQorI2RlZmluZSBsd2lwX2h0b25sKHgpIExXSVBfUExBVEZPUk1fSFRPTkwoeCkKKyNkZWZpbmUgbHdpcF9udG9obCh4KSBMV0lQX1BMQVRGT1JNX0hUT05MKHgpCisjZWxzZSAvKiBMV0lQX1BMQVRGT1JNX0JZVEVTV0FQICovCit1MTZfdCBsd2lwX2h0b25zKHUxNl90IHgpOwordTE2X3QgbHdpcF9udG9ocyh1MTZfdCB4KTsKK3UzMl90IGx3aXBfaHRvbmwodTMyX3QgeCk7Cit1MzJfdCBsd2lwX250b2hsKHUzMl90IHgpOworI2VuZGlmIC8qIExXSVBfUExBVEZPUk1fQllURVNXQVAgKi8KKworLyogVGhlc2UgbWFjcm9zIHNob3VsZCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IgYW5kIGFyZSB1c2VkCisgICB3aXRoIGNvbXBpbGUtdGltZSBjb25zdGFudHMgb25seSAoc28gdGhhdCB0aGVyZSBpcyBubyBsaXR0bGUtZW5kaWFuCisgICBvdmVyaGVhZCBhdCBydW50aW1lKS4gKi8KKyNkZWZpbmUgUFBfSFRPTlMoeCkgKCgoKHgpICYgMHhmZikgPDwgOCkgfCAoKCh4KSAmIDB4ZmYwMCkgPj4gOCkpCisjZGVmaW5lIFBQX05UT0hTKHgpIFBQX0hUT05TKHgpCisjZGVmaW5lIFBQX0hUT05MKHgpICgoKCh4KSAmIDB4ZmYpIDw8IDI0KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhmZjAwKSA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhmZjAwMDBVTCkgPj4gOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4ZmYwMDAwMDBVTCkgPj4gMjQpKQorI2RlZmluZSBQUF9OVE9ITCh4KSBQUF9IVE9OTCh4KQorCisjZW5kaWYgLyogQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXSVBfREVGX0hfXyAqLworCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9kaGNwLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9kaGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkOTMzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2RoY3AuaApAQCAtMCwwICsxLDI0MiBAQAorLyoqIEBmaWxlCisgKi8KKworI2lmbmRlZiBfX0xXSVBfREhDUF9IX18KKyNkZWZpbmUgX19MV0lQX0RIQ1BfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9ESENQIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9uZXRpZi5oIgorI2luY2x1ZGUgImx3aXAvdWRwLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIHBlcmlvZCAoaW4gc2Vjb25kcykgb2YgdGhlIGFwcGxpY2F0aW9uIGNhbGxpbmcgZGhjcF9jb2Fyc2VfdG1yKCkgKi8KKyNkZWZpbmUgREhDUF9DT0FSU0VfVElNRVJfU0VDUyA2MCAKKy8qKiBwZXJpb2QgKGluIG1pbGxpc2Vjb25kcykgb2YgdGhlIGFwcGxpY2F0aW9uIGNhbGxpbmcgZGhjcF9jb2Fyc2VfdG1yKCkgKi8KKyNkZWZpbmUgREhDUF9DT0FSU0VfVElNRVJfTVNFQ1MgKERIQ1BfQ09BUlNFX1RJTUVSX1NFQ1MgKiAxMDAwVUwpCisvKiogcGVyaW9kIChpbiBtaWxsaXNlY29uZHMpIG9mIHRoZSBhcHBsaWNhdGlvbiBjYWxsaW5nIGRoY3BfZmluZV90bXIoKSAqLworI2RlZmluZSBESENQX0ZJTkVfVElNRVJfTVNFQ1MgNTAwIAorCisjZGVmaW5lIERIQ1BfQ0hBRERSX0xFTiAxNlUKKyNkZWZpbmUgREhDUF9TTkFNRV9MRU4gIDY0VQorI2RlZmluZSBESENQX0ZJTEVfTEVOICAgMTI4VQorCitzdHJ1Y3QgZGhjcAoreworICAvKiogdHJhbnNhY3Rpb24gaWRlbnRpZmllciBvZiBsYXN0IHNlbnQgcmVxdWVzdCAqLyAKKyAgdTMyX3QgeGlkOworICAvKiogb3VyIGNvbm5lY3Rpb24gdG8gdGhlIERIQ1Agc2VydmVyICovIAorICBzdHJ1Y3QgdWRwX3BjYiAqcGNiOworICAvKiogaW5jb21pbmcgbXNnICovCisgIHN0cnVjdCBkaGNwX21zZyAqbXNnX2luOworICAvKiogY3VycmVudCBESENQIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KKyAgdThfdCBzdGF0ZTsKKyAgLyoqIHJldHJpZXMgb2YgY3VycmVudCByZXF1ZXN0ICovCisgIHU4X3QgdHJpZXM7CisjaWYgTFdJUF9ESENQX0FVVE9JUF9DT09QCisgIHU4X3QgYXV0b2lwX2Nvb3Bfc3RhdGU7CisjZW5kaWYKKyAgdThfdCBzdWJuZXRfbWFza19naXZlbjsKKworICBzdHJ1Y3QgcGJ1ZiAqcF9vdXQ7IC8qIHBidWYgb2Ygb3V0Y29taW5nIG1zZyAqLworICBzdHJ1Y3QgZGhjcF9tc2cgKm1zZ19vdXQ7IC8qIG91dGdvaW5nIG1zZyAqLworICB1MTZfdCBvcHRpb25zX291dF9sZW47IC8qIG91dGdvaW5nIG1zZyBvcHRpb25zIGxlbmd0aCAqLworICB1MTZfdCByZXF1ZXN0X3RpbWVvdXQ7IC8qICN0aWNrcyB3aXRoIHBlcmlvZCBESENQX0ZJTkVfVElNRVJfU0VDUyBmb3IgcmVxdWVzdCB0aW1lb3V0ICovCisgIHUxNl90IHQxX3RpbWVvdXQ7ICAvKiAjdGlja3Mgd2l0aCBwZXJpb2QgREhDUF9DT0FSU0VfVElNRVJfU0VDUyBmb3IgcmVuZXdhbCB0aW1lICovCisgIHUxNl90IHQyX3RpbWVvdXQ7ICAvKiAjdGlja3Mgd2l0aCBwZXJpb2QgREhDUF9DT0FSU0VfVElNRVJfU0VDUyBmb3IgcmViaW5kIHRpbWUgKi8KKyAgaXBfYWRkcl90IHNlcnZlcl9pcF9hZGRyOyAvKiBkaGNwIHNlcnZlciBhZGRyZXNzIHRoYXQgb2ZmZXJlZCB0aGlzIGxlYXNlICovCisgIGlwX2FkZHJfdCBvZmZlcmVkX2lwX2FkZHI7CisgIGlwX2FkZHJfdCBvZmZlcmVkX3NuX21hc2s7CisgIGlwX2FkZHJfdCBvZmZlcmVkX2d3X2FkZHI7CisgCisgIHUzMl90IG9mZmVyZWRfdDBfbGVhc2U7IC8qIGxlYXNlIHBlcmlvZCAoaW4gc2Vjb25kcykgKi8KKyAgdTMyX3Qgb2ZmZXJlZF90MV9yZW5ldzsgLyogcmVjb21tZW5kZWQgcmVuZXcgdGltZSAodXN1YWxseSA1MCUgb2YgbGVhc2UgcGVyaW9kKSAqLworICB1MzJfdCBvZmZlcmVkX3QyX3JlYmluZDsgLyogcmVjb21tZW5kZWQgcmViaW5kIHRpbWUgKHVzdWFsbHkgNjYlIG9mIGxlYXNlIHBlcmlvZCkgICovCisgIC8qIEB0b2RvOiBMV0lQX0RIQ1BfQk9PVFBfRklMRSBjb25maWd1cmF0aW9uIG9wdGlvbj8KKyAgICAgaW50ZWdyYXRlIHdpdGggcG9zc2libGUgVEZUUC1jbGllbnQgZm9yIGJvb3Rpbmc/ICovCisjaWYgTFdJUF9ESENQX0JPT1RQX0ZJTEUKKyAgaXBfYWRkcl90IG9mZmVyZWRfc2lfYWRkcjsKKyAgY2hhciBib290X2ZpbGVfbmFtZVtESENQX0ZJTEVfTEVOXTsKKyNlbmRpZiAvKiBMV0lQX0RIQ1BfQk9PVFBGSUxFICovCit9OworCisvKiBNVVNUIGJlIGNvbXBpbGVkIHdpdGggInBhY2sgc3RydWN0cyIgb3IgZXF1aXZhbGVudCEgKi8KKyNpZmRlZiBQQUNLX1NUUlVDVF9VU0VfSU5DTFVERVMKKyMgIGluY2x1ZGUgImFyY2gvYnBzdHJ1Y3QuaCIKKyNlbmRpZgorUEFDS19TVFJVQ1RfQkVHSU4KKy8qKiBtaW5pbXVtIHNldCBvZiBmaWVsZHMgb2YgYW55IERIQ1AgbWVzc2FnZSAqLworc3RydWN0IGRoY3BfbXNnCit7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHU4X3Qgb3ApOworICBQQUNLX1NUUlVDVF9GSUVMRCh1OF90IGh0eXBlKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCBobGVuKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCBob3BzKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTMyX3QgeGlkKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3Qgc2Vjcyk7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IGZsYWdzKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQoaXBfYWRkcl9wX3QgY2lhZGRyKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQoaXBfYWRkcl9wX3QgeWlhZGRyKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQoaXBfYWRkcl9wX3Qgc2lhZGRyKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQoaXBfYWRkcl9wX3QgZ2lhZGRyKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCBjaGFkZHJbREhDUF9DSEFERFJfTEVOXSk7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHU4X3Qgc25hbWVbREhDUF9TTkFNRV9MRU5dKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCBmaWxlW0RIQ1BfRklMRV9MRU5dKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTMyX3QgY29va2llKTsKKyNkZWZpbmUgREhDUF9NSU5fT1BUSU9OU19MRU4gNjhVCisvKiogbWFrZSBzdXJlIHVzZXIgZG9lcyBub3QgY29uZmlndXJlIHRoaXMgdG9vIHNtYWxsICovCisjaWYgKChkZWZpbmVkKERIQ1BfT1BUSU9OU19MRU4pKSAmJiAoREhDUF9PUFRJT05TX0xFTiA8IERIQ1BfTUlOX09QVElPTlNfTEVOKSkKKyMgIHVuZGVmIERIQ1BfT1BUSU9OU19MRU4KKyNlbmRpZgorLyoqIGFsbG93IHRoaXMgdG8gYmUgY29uZmlndXJlZCBpbiBsd2lwb3B0cy5oLCBidXQgbm90IHRvbyBzbWFsbCAqLworI2lmICghZGVmaW5lZChESENQX09QVElPTlNfTEVOKSkKKy8qKiBzZXQgdGhpcyB0byBiZSBzdWZmaWNpZW50IGZvciB5b3VyIG9wdGlvbnMgaW4gb3V0Z29pbmcgREhDUCBtc2dzICovCisjICBkZWZpbmUgREhDUF9PUFRJT05TX0xFTiBESENQX01JTl9PUFRJT05TX0xFTgorI2VuZGlmCisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHU4X3Qgb3B0aW9uc1tESENQX09QVElPTlNfTEVOXSk7Cit9IFBBQ0tfU1RSVUNUX1NUUlVDVDsKK1BBQ0tfU1RSVUNUX0VORAorI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9lcHN0cnVjdC5oIgorI2VuZGlmCisKK3ZvaWQgZGhjcF9zZXRfc3RydWN0KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBkaGNwICpkaGNwKTsKKy8qKiBSZW1vdmUgYSBzdHJ1Y3QgZGhjcCBwcmV2aW91c2x5IHNldCB0byB0aGUgbmV0aWYgdXNpbmcgZGhjcF9zZXRfc3RydWN0KCkgKi8KKyNkZWZpbmUgZGhjcF9yZW1vdmVfc3RydWN0KG5ldGlmKSBkbyB7IChuZXRpZiktPmRoY3AgPSBOVUxMOyB9IHdoaWxlKDApCit2b2lkIGRoY3BfY2xlYW51cChzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKKy8qKiBzdGFydCBESENQIGNvbmZpZ3VyYXRpb24gKi8KK2Vycl90IGRoY3Bfc3RhcnQoc3RydWN0IG5ldGlmICpuZXRpZik7CisvKiogZW5mb3JjZSBlYXJseSBsZWFzZSByZW5ld2FsIChub3QgbmVlZGVkIG5vcm1hbGx5KSovCitlcnJfdCBkaGNwX3JlbmV3KHN0cnVjdCBuZXRpZiAqbmV0aWYpOworLyoqIHJlbGVhc2UgdGhlIERIQ1AgbGVhc2UsIHVzdWFsbHkgY2FsbGVkIGJlZm9yZSBkaGNwX3N0b3AoKSovCitlcnJfdCBkaGNwX3JlbGVhc2Uoc3RydWN0IG5ldGlmICpuZXRpZik7CisvKiogc3RvcCBESENQIGNvbmZpZ3VyYXRpb24gKi8KK3ZvaWQgZGhjcF9zdG9wKHN0cnVjdCBuZXRpZiAqbmV0aWYpOworLyoqIGluZm9ybSBzZXJ2ZXIgb2Ygb3VyIG1hbnVhbCBJUCBhZGRyZXNzICovCit2b2lkIGRoY3BfaW5mb3JtKHN0cnVjdCBuZXRpZiAqbmV0aWYpOworLyoqIEhhbmRsZSBhIHBvc3NpYmxlIGNoYW5nZSBpbiB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uICovCit2b2lkIGRoY3BfbmV0d29ya19jaGFuZ2VkKHN0cnVjdCBuZXRpZiAqbmV0aWYpOworCisvKiogaWYgZW5hYmxlZCwgY2hlY2sgd2hldGhlciB0aGUgb2ZmZXJlZCBJUCBhZGRyZXNzIGlzIG5vdCBpbiB1c2UsIHVzaW5nIEFSUCAqLworI2lmIERIQ1BfRE9FU19BUlBfQ0hFQ0sKK3ZvaWQgZGhjcF9hcnBfcmVwbHkoc3RydWN0IG5ldGlmICpuZXRpZiwgaXBfYWRkcl90ICphZGRyKTsKKyNlbmRpZgorCisvKiogdG8gYmUgY2FsbGVkIGV2ZXJ5IG1pbnV0ZSAqLwordm9pZCBkaGNwX2NvYXJzZV90bXIodm9pZCk7CisvKiogdG8gYmUgY2FsbGVkIGV2ZXJ5IGhhbGYgc2Vjb25kICovCit2b2lkIGRoY3BfZmluZV90bXIodm9pZCk7CisgCisvKiogREhDUCBtZXNzYWdlIGl0ZW0gb2Zmc2V0cyBhbmQgbGVuZ3RoICovCisjZGVmaW5lIERIQ1BfT1BfT0ZTICAgICAgIDAKKyNkZWZpbmUgREhDUF9IVFlQRV9PRlMgICAgMQorI2RlZmluZSBESENQX0hMRU5fT0ZTICAgICAyCisjZGVmaW5lIERIQ1BfSE9QU19PRlMgICAgIDMKKyNkZWZpbmUgREhDUF9YSURfT0ZTICAgICAgNAorI2RlZmluZSBESENQX1NFQ1NfT0ZTICAgICA4CisjZGVmaW5lIERIQ1BfRkxBR1NfT0ZTICAgIDEwCisjZGVmaW5lIERIQ1BfQ0lBRERSX09GUyAgIDEyCisjZGVmaW5lIERIQ1BfWUlBRERSX09GUyAgIDE2CisjZGVmaW5lIERIQ1BfU0lBRERSX09GUyAgIDIwCisjZGVmaW5lIERIQ1BfR0lBRERSX09GUyAgIDI0CisjZGVmaW5lIERIQ1BfQ0hBRERSX09GUyAgIDI4CisjZGVmaW5lIERIQ1BfU05BTUVfT0ZTICAgIDQ0CisjZGVmaW5lIERIQ1BfRklMRV9PRlMgICAgIDEwOAorI2RlZmluZSBESENQX01TR19MRU4gICAgICAyMzYKKworI2RlZmluZSBESENQX0NPT0tJRV9PRlMgICBESENQX01TR19MRU4KKyNkZWZpbmUgREhDUF9PUFRJT05TX09GUyAgKERIQ1BfTVNHX0xFTiArIDQpCisKKyNkZWZpbmUgREhDUF9DTElFTlRfUE9SVCAgNjggIAorI2RlZmluZSBESENQX1NFUlZFUl9QT1JUICA2NworCisvKiogREhDUCBjbGllbnQgc3RhdGVzICovCisjZGVmaW5lIERIQ1BfT0ZGICAgICAgICAgIDAKKyNkZWZpbmUgREhDUF9SRVFVRVNUSU5HICAgMQorI2RlZmluZSBESENQX0lOSVQgICAgICAgICAyCisjZGVmaW5lIERIQ1BfUkVCT09USU5HICAgIDMKKyNkZWZpbmUgREhDUF9SRUJJTkRJTkcgICAgNAorI2RlZmluZSBESENQX1JFTkVXSU5HICAgICA1CisjZGVmaW5lIERIQ1BfU0VMRUNUSU5HICAgIDYKKyNkZWZpbmUgREhDUF9JTkZPUk1JTkcgICAgNworI2RlZmluZSBESENQX0NIRUNLSU5HICAgICA4CisjZGVmaW5lIERIQ1BfUEVSTUFORU5UICAgIDkKKyNkZWZpbmUgREhDUF9CT1VORCAgICAgICAgMTAKKy8qKiBub3QgeWV0IGltcGxlbWVudGVkICNkZWZpbmUgREhDUF9SRUxFQVNJTkcgMTEgKi8KKyNkZWZpbmUgREhDUF9CQUNLSU5HX09GRiAgMTIKKworLyoqIEFVVE9JUCBjb29wZXJhdGF0aW9uIGZsYWdzICovCisjZGVmaW5lIERIQ1BfQVVUT0lQX0NPT1BfU1RBVEVfT0ZGICAwCisjZGVmaW5lIERIQ1BfQVVUT0lQX0NPT1BfU1RBVEVfT04gICAxCisgCisjZGVmaW5lIERIQ1BfQk9PVFJFUVVFU1QgIDEKKyNkZWZpbmUgREhDUF9CT09UUkVQTFkgICAgMgorCisvKiogREhDUCBtZXNzYWdlIHR5cGVzICovCisjZGVmaW5lIERIQ1BfRElTQ09WRVIgMQorI2RlZmluZSBESENQX09GRkVSICAgIDIKKyNkZWZpbmUgREhDUF9SRVFVRVNUICAzCisjZGVmaW5lIERIQ1BfREVDTElORSAgNAorI2RlZmluZSBESENQX0FDSyAgICAgIDUKKyNkZWZpbmUgREhDUF9OQUsgICAgICA2CisjZGVmaW5lIERIQ1BfUkVMRUFTRSAgNworI2RlZmluZSBESENQX0lORk9STSAgIDgKKworLyoqIERIQ1AgaGFyZHdhcmUgdHlwZSwgY3VycmVudGx5IG9ubHkgZXRoZXJuZXQgaXMgc3VwcG9ydGVkICovCisjZGVmaW5lIERIQ1BfSFRZUEVfRVRIIDEKKworI2RlZmluZSBESENQX01BR0lDX0NPT0tJRSAweDYzODI1MzYzVUwKKworLyogVGhpcyBpcyBhIGxpc3Qgb2Ygb3B0aW9ucyBmb3IgQk9PVFAgYW5kIERIQ1AsIHNlZSBSRkMgMjEzMiBmb3IgZGVzY3JpcHRpb25zICovCisKKy8qKiBCb290UCBvcHRpb25zICovCisjZGVmaW5lIERIQ1BfT1BUSU9OX1BBRCAwCisjZGVmaW5lIERIQ1BfT1BUSU9OX1NVQk5FVF9NQVNLIDEgLyogUkZDIDIxMzIgMy4zICovCisjZGVmaW5lIERIQ1BfT1BUSU9OX1JPVVRFUiAzCisjZGVmaW5lIERIQ1BfT1BUSU9OX0ROU19TRVJWRVIgNiAKKyNkZWZpbmUgREhDUF9PUFRJT05fSE9TVE5BTUUgMTIKKyNkZWZpbmUgREhDUF9PUFRJT05fSVBfVFRMIDIzCisjZGVmaW5lIERIQ1BfT1BUSU9OX01UVSAyNgorI2RlZmluZSBESENQX09QVElPTl9CUk9BRENBU1QgMjgKKyNkZWZpbmUgREhDUF9PUFRJT05fVENQX1RUTCAzNworI2RlZmluZSBESENQX09QVElPTl9FTkQgMjU1CisKKy8qKiBESENQIG9wdGlvbnMgKi8KKyNkZWZpbmUgREhDUF9PUFRJT05fUkVRVUVTVEVEX0lQIDUwIC8qIFJGQyAyMTMyIDkuMSwgcmVxdWVzdGVkIElQIGFkZHJlc3MgKi8KKyNkZWZpbmUgREhDUF9PUFRJT05fTEVBU0VfVElNRSA1MSAvKiBSRkMgMjEzMiA5LjIsIHRpbWUgaW4gc2Vjb25kcywgaW4gNCBieXRlcyAqLworI2RlZmluZSBESENQX09QVElPTl9PVkVSTE9BRCA1MiAvKiBSRkMyMTMyIDkuMywgdXNlIGZpbGUgYW5kL29yIHNuYW1lIGZpZWxkIGZvciBvcHRpb25zICovCisKKyNkZWZpbmUgREhDUF9PUFRJT05fTUVTU0FHRV9UWVBFIDUzIC8qIFJGQyAyMTMyIDkuNiwgaW1wb3J0YW50IGZvciBESENQICovCisjZGVmaW5lIERIQ1BfT1BUSU9OX01FU1NBR0VfVFlQRV9MRU4gMQorCisjZGVmaW5lIERIQ1BfT1BUSU9OX1NFUlZFUl9JRCA1NCAvKiBSRkMgMjEzMiA5LjcsIHNlcnZlciBJUCBhZGRyZXNzICovCisjZGVmaW5lIERIQ1BfT1BUSU9OX1BBUkFNRVRFUl9SRVFVRVNUX0xJU1QgNTUgLyogUkZDIDIxMzIgOS44LCByZXF1ZXN0ZWQgb3B0aW9uIHR5cGVzICovCisKKyNkZWZpbmUgREhDUF9PUFRJT05fTUFYX01TR19TSVpFIDU3IC8qIFJGQyAyMTMyIDkuMTAsIG1lc3NhZ2Ugc2l6ZSBhY2NlcHRlZCA+PSA1NzYgKi8KKyNkZWZpbmUgREhDUF9PUFRJT05fTUFYX01TR19TSVpFX0xFTiAyCisKKyNkZWZpbmUgREhDUF9PUFRJT05fVDEgNTggLyogVDEgcmVuZXdhbCB0aW1lICovCisjZGVmaW5lIERIQ1BfT1BUSU9OX1QyIDU5IC8qIFQyIHJlYmluZGluZyB0aW1lICovCisjZGVmaW5lIERIQ1BfT1BUSU9OX1VTIDYwCisjZGVmaW5lIERIQ1BfT1BUSU9OX0NMSUVOVF9JRCA2MQorI2RlZmluZSBESENQX09QVElPTl9URlRQX1NFUlZFUk5BTUUgNjYKKyNkZWZpbmUgREhDUF9PUFRJT05fQk9PVEZJTEUgNjcKKworLyoqIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBvdmVybG9hZGluZyB0aGUgZmlsZSBhbmQgc25hbWUgZmllbGRzIHdpdGggb3B0aW9ucyAqLworI2RlZmluZSBESENQX09WRVJMT0FEX05PTkUgMAorI2RlZmluZSBESENQX09WRVJMT0FEX0ZJTEUgMQorI2RlZmluZSBESENQX09WRVJMT0FEX1NOQU1FICAyCisjZGVmaW5lIERIQ1BfT1ZFUkxPQURfU05BTUVfRklMRSAzCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBMV0lQX0RIQ1AgKi8KKworI2VuZGlmIC8qX19MV0lQX0RIQ1BfSF9fKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2Rucy5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvZG5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3ZDliMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2Rucy5oCkBAIC0wLDAgKzEsMTI0IEBACisvKioKKyAqIGx3aXAgRE5TIHJlc29sdmVyIGhlYWRlciBmaWxlLgorCisgKiBBdXRob3I6IEppbSBQZXR0aW5hdG8gCisgKiAgIEFwcmlsIDIwMDcKKworICogcG9ydGVkIGZyb20gdUlQIHJlc29sdi5jIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBBZGFtIER1bmtlbHMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUworICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fTFdJUF9ETlNfSF9fCisjZGVmaW5lIF9fTFdJUF9ETlNfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9ETlMgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEROUyB0aW1lciBwZXJpb2QgKi8KKyNkZWZpbmUgRE5TX1RNUl9JTlRFUlZBTCAgICAgICAgICAxMDAwCisKKy8qKiBETlMgZmllbGQgVFlQRSB1c2VkIGZvciAiUmVzb3VyY2UgUmVjb3JkcyIgKi8KKyNkZWZpbmUgRE5TX1JSVFlQRV9BICAgICAgICAgICAgICAxICAgICAvKiBhIGhvc3QgYWRkcmVzcyAqLworI2RlZmluZSBETlNfUlJUWVBFX05TICAgICAgICAgICAgIDIgICAgIC8qIGFuIGF1dGhvcml0YXRpdmUgbmFtZSBzZXJ2ZXIgKi8KKyNkZWZpbmUgRE5TX1JSVFlQRV9NRCAgICAgICAgICAgICAzICAgICAvKiBhIG1haWwgZGVzdGluYXRpb24gKE9ic29sZXRlIC0gdXNlIE1YKSAqLworI2RlZmluZSBETlNfUlJUWVBFX01GICAgICAgICAgICAgIDQgICAgIC8qIGEgbWFpbCBmb3J3YXJkZXIgKE9ic29sZXRlIC0gdXNlIE1YKSAqLworI2RlZmluZSBETlNfUlJUWVBFX0NOQU1FICAgICAgICAgIDUgICAgIC8qIHRoZSBjYW5vbmljYWwgbmFtZSBmb3IgYW4gYWxpYXMgKi8KKyNkZWZpbmUgRE5TX1JSVFlQRV9TT0EgICAgICAgICAgICA2ICAgICAvKiBtYXJrcyB0aGUgc3RhcnQgb2YgYSB6b25lIG9mIGF1dGhvcml0eSAqLworI2RlZmluZSBETlNfUlJUWVBFX01CICAgICAgICAgICAgIDcgICAgIC8qIGEgbWFpbGJveCBkb21haW4gbmFtZSAoRVhQRVJJTUVOVEFMKSAqLworI2RlZmluZSBETlNfUlJUWVBFX01HICAgICAgICAgICAgIDggICAgIC8qIGEgbWFpbCBncm91cCBtZW1iZXIgKEVYUEVSSU1FTlRBTCkgKi8KKyNkZWZpbmUgRE5TX1JSVFlQRV9NUiAgICAgICAgICAgICA5ICAgICAvKiBhIG1haWwgcmVuYW1lIGRvbWFpbiBuYW1lIChFWFBFUklNRU5UQUwpICovCisjZGVmaW5lIEROU19SUlRZUEVfTlVMTCAgICAgICAgICAgMTAgICAgLyogYSBudWxsIFJSIChFWFBFUklNRU5UQUwpICovCisjZGVmaW5lIEROU19SUlRZUEVfV0tTICAgICAgICAgICAgMTEgICAgLyogYSB3ZWxsIGtub3duIHNlcnZpY2UgZGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgRE5TX1JSVFlQRV9QVFIgICAgICAgICAgICAxMiAgICAvKiBhIGRvbWFpbiBuYW1lIHBvaW50ZXIgKi8KKyNkZWZpbmUgRE5TX1JSVFlQRV9ISU5GTyAgICAgICAgICAxMyAgICAvKiBob3N0IGluZm9ybWF0aW9uICovCisjZGVmaW5lIEROU19SUlRZUEVfTUlORk8gICAgICAgICAgMTQgICAgLyogbWFpbGJveCBvciBtYWlsIGxpc3QgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRE5TX1JSVFlQRV9NWCAgICAgICAgICAgICAxNSAgICAvKiBtYWlsIGV4Y2hhbmdlICovCisjZGVmaW5lIEROU19SUlRZUEVfVFhUICAgICAgICAgICAgMTYgICAgLyogdGV4dCBzdHJpbmdzICovCisKKy8qKiBETlMgZmllbGQgQ0xBU1MgdXNlZCBmb3IgIlJlc291cmNlIFJlY29yZHMiICovCisjZGVmaW5lIEROU19SUkNMQVNTX0lOICAgICAgICAgICAgMSAgICAgLyogdGhlIEludGVybmV0ICovCisjZGVmaW5lIEROU19SUkNMQVNTX0NTICAgICAgICAgICAgMiAgICAgLyogdGhlIENTTkVUIGNsYXNzIChPYnNvbGV0ZSAtIHVzZWQgb25seSBmb3IgZXhhbXBsZXMgaW4gc29tZSBvYnNvbGV0ZSBSRkNzKSAqLworI2RlZmluZSBETlNfUlJDTEFTU19DSCAgICAgICAgICAgIDMgICAgIC8qIHRoZSBDSEFPUyBjbGFzcyAqLworI2RlZmluZSBETlNfUlJDTEFTU19IUyAgICAgICAgICAgIDQgICAgIC8qIEhlc2lvZCBbRHllciA4N10gKi8KKyNkZWZpbmUgRE5TX1JSQ0xBU1NfRkxVU0ggICAgICAgICAweDgwMCAvKiBGbHVzaCBiaXQgKi8KKworLyogVGhlIHNpemUgdXNlZCBmb3IgdGhlIG5leHQgbGluZSBpcyByYXRoZXIgYSBoYWNrLCBidXQgaXQgcHJldmVudHMgaW5jbHVkaW5nIHNvY2tldC5oIGluIGFsbCBmaWxlcworICAgdGhhdCBpbmNsdWRlIG1lbXAuaCwgYW5kIHRoYXQgd291bGQgcG9zc2libHkgYnJlYWsgcG9ydGFiaWxpdHkgKHNpbmNlIHNvY2tldC5oIGRlZmluZXMgc29tZSB0eXBlcworICAgYW5kIGNvbnN0YW50cyBwb3NzaWJseSBhbHJlYWR5IGRlZmluZSBieSB0aGUgT1MpLgorICAgQ2FsY3VsYXRpb24gcnVsZToKKyAgIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgKyBETlNfTUFYX05BTUVfTEVOR1RIICsgMSBieXRlIHplcm8tdGVybWluYXRpb24gKi8KKyNkZWZpbmUgTkVUREJfRUxFTV9TSVpFICAgICAgICAgICAoMzIgKyAxNiArIEROU19NQVhfTkFNRV9MRU5HVEggKyAxKQorCisjaWYgRE5TX0xPQ0FMX0hPU1RMSVNUCisvKiogc3RydWN0IHVzZWQgZm9yIGxvY2FsIGhvc3QtbGlzdCAqLworc3RydWN0IGxvY2FsX2hvc3RsaXN0X2VudHJ5IHsKKyAgLyoqIHN0YXRpYyBob3N0bmFtZSAqLworICBjb25zdCBjaGFyICpuYW1lOworICAvKiogc3RhdGljIGhvc3QgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGVvcmRlciAqLworICBpcF9hZGRyX3QgYWRkcjsKKyAgc3RydWN0IGxvY2FsX2hvc3RsaXN0X2VudHJ5ICpuZXh0OworfTsKKyNpZiBETlNfTE9DQUxfSE9TVExJU1RfSVNfRFlOQU1JQworI2lmbmRlZiBETlNfTE9DQUxfSE9TVExJU1RfTUFYX05BTUVMRU4KKyNkZWZpbmUgRE5TX0xPQ0FMX0hPU1RMSVNUX01BWF9OQU1FTEVOICBETlNfTUFYX05BTUVfTEVOR1RICisjZW5kaWYKKyNkZWZpbmUgTE9DQUxIT1NUTElTVF9FTEVNX1NJWkUgKChzaXplb2Yoc3RydWN0IGxvY2FsX2hvc3RsaXN0X2VudHJ5KSArIEROU19MT0NBTF9IT1NUTElTVF9NQVhfTkFNRUxFTiArIDEpKQorI2VuZGlmIC8qIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDICovCisjZW5kaWYgLyogRE5TX0xPQ0FMX0hPU1RMSVNUICovCisKKy8qKiBDYWxsYmFjayB3aGljaCBpcyBpbnZva2VkIHdoZW4gYSBob3N0bmFtZSBpcyBmb3VuZC4KKyAqIEEgZnVuY3Rpb24gb2YgdGhpcyB0eXBlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBETlMgcmVzb2x2ZXIuCisgKiBAcGFyYW0gbmFtZSBwb2ludGVyIHRvIHRoZSBuYW1lIHRoYXQgd2FzIGxvb2tlZCB1cC4KKyAqIEBwYXJhbSBpcGFkZHIgcG9pbnRlciB0byBhbiBpcF9hZGRyX3QgY29udGFpbmluZyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdG5hbWUsCisgKiAgICAgICAgb3IgTlVMTCBpZiB0aGUgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQgKG9yIG9uIGFueSBvdGhlciBlcnJvcikuCisgKiBAcGFyYW0gY2FsbGJhY2tfYXJnIGEgdXNlci1zcGVjaWZpZWQgY2FsbGJhY2sgYXJndW1lbnQgcGFzc2VkIHRvIGRuc19nZXRob3N0YnluYW1lCisqLwordHlwZWRlZiB2b2lkICgqZG5zX2ZvdW5kX2NhbGxiYWNrKShjb25zdCBjaGFyICpuYW1lLCBpcF9hZGRyX3QgKmlwYWRkciwgdm9pZCAqY2FsbGJhY2tfYXJnKTsKKwordm9pZCAgICAgICAgICAgZG5zX2luaXQodm9pZCk7Cit2b2lkICAgICAgICAgICBkbnNfdG1yKHZvaWQpOwordm9pZCAgICAgICAgICAgZG5zX3NldHNlcnZlcih1OF90IG51bWRucywgaXBfYWRkcl90ICpkbnNzZXJ2ZXIpOworaXBfYWRkcl90ICAgICAgZG5zX2dldHNlcnZlcih1OF90IG51bWRucyk7CitlcnJfdCAgICAgICAgICBkbnNfZ2V0aG9zdGJ5bmFtZShjb25zdCBjaGFyICpob3N0bmFtZSwgaXBfYWRkcl90ICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5zX2ZvdW5kX2NhbGxiYWNrIGZvdW5kLCB2b2lkICpjYWxsYmFja19hcmcpOworCisjaWYgRE5TX0xPQ0FMX0hPU1RMSVNUICYmIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDCitpbnQgICAgICAgICAgICBkbnNfbG9jYWxfcmVtb3ZlaG9zdChjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgaXBfYWRkcl90ICphZGRyKTsKK2Vycl90ICAgICAgICAgIGRuc19sb2NhbF9hZGRob3N0KGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBpcF9hZGRyX3QgKmFkZHIpOworI2VuZGlmIC8qIEROU19MT0NBTF9IT1NUTElTVCAmJiBETlNfTE9DQUxfSE9TVExJU1RfSVNfRFlOQU1JQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTFdJUF9ETlMgKi8KKworI2VuZGlmIC8qIF9fTFdJUF9ETlNfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9lcnIuaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2Vyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTA3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9lcnIuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfRVJSX0hfXworI2RlZmluZSBfX0xXSVBfRVJSX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKyNpbmNsdWRlICJsd2lwL2FyY2guaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogRGVmaW5lIExXSVBfRVJSX1QgaW4gY2MuaCBpZiB5b3Ugd2FudCB0byB1c2UKKyAqICBhIGRpZmZlcmVudCB0eXBlIGZvciB5b3VyIHBsYXRmb3JtIChtdXN0IGJlIHNpZ25lZCkuICovCisjaWZkZWYgTFdJUF9FUlJfVAordHlwZWRlZiBMV0lQX0VSUl9UIGVycl90OworI2Vsc2UgLyogTFdJUF9FUlJfVCAqLwordHlwZWRlZiBzOF90IGVycl90OworI2VuZGlmIC8qIExXSVBfRVJSX1QqLworCisvKiBEZWZpbml0aW9ucyBmb3IgZXJyb3IgY29uc3RhbnRzLiAqLworCisjZGVmaW5lIEVSUl9PSyAgICAgICAgICAwICAgIC8qIE5vIGVycm9yLCBldmVyeXRoaW5nIE9LLiAqLworI2RlZmluZSBFUlJfTUVNICAgICAgICAtMSAgICAvKiBPdXQgb2YgbWVtb3J5IGVycm9yLiAgICAgKi8KKyNkZWZpbmUgRVJSX0JVRiAgICAgICAgLTIgICAgLyogQnVmZmVyIGVycm9yLiAgICAgICAgICAgICovCisjZGVmaW5lIEVSUl9USU1FT1VUICAgIC0zICAgIC8qIFRpbWVvdXQuICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFUlJfUlRFICAgICAgICAtNCAgICAvKiBSb3V0aW5nIHByb2JsZW0uICAgICAgICAgKi8KKyNkZWZpbmUgRVJSX0lOUFJPR1JFU1MgLTUgICAgLyogT3BlcmF0aW9uIGluIHByb2dyZXNzICAgICovCisjZGVmaW5lIEVSUl9WQUwgICAgICAgIC02ICAgIC8qIElsbGVnYWwgdmFsdWUuICAgICAgICAgICAqLworI2RlZmluZSBFUlJfV09VTERCTE9DSyAtNyAgICAvKiBPcGVyYXRpb24gd291bGQgYmxvY2suICAgKi8KKyNkZWZpbmUgRVJSX1VTRSAgICAgICAgLTggICAgLyogQWRkcmVzcyBpbiB1c2UuICAgICAgICAgICovCisjZGVmaW5lIEVSUl9JU0NPTk4gICAgIC05ICAgIC8qIEFscmVhZHkgY29ubmVjdGVkLiAgICAgICAqLworCisjZGVmaW5lIEVSUl9JU19GQVRBTChlKSAoKGUpIDwgRVJSX0lTQ09OTikKKworI2RlZmluZSBFUlJfQUJSVCAgICAgICAtMTAgICAvKiBDb25uZWN0aW9uIGFib3J0ZWQuICAgICAgKi8KKyNkZWZpbmUgRVJSX1JTVCAgICAgICAgLTExICAgLyogQ29ubmVjdGlvbiByZXNldC4gICAgICAgICovCisjZGVmaW5lIEVSUl9DTFNEICAgICAgIC0xMiAgIC8qIENvbm5lY3Rpb24gY2xvc2VkLiAgICAgICAqLworI2RlZmluZSBFUlJfQ09OTiAgICAgICAtMTMgICAvKiBOb3QgY29ubmVjdGVkLiAgICAgICAgICAgKi8KKworI2RlZmluZSBFUlJfQVJHICAgICAgICAtMTQgICAvKiBJbGxlZ2FsIGFyZ3VtZW50LiAgICAgICAgKi8KKworI2RlZmluZSBFUlJfSUYgICAgICAgICAtMTUgICAvKiBMb3ctbGV2ZWwgbmV0aWYgZXJyb3IgICAgKi8KKworCisjaWZkZWYgTFdJUF9ERUJVRworZXh0ZXJuIGNvbnN0IGNoYXIgKmx3aXBfc3RyZXJyKGVycl90IGVycik7CisjZWxzZQorI2RlZmluZSBsd2lwX3N0cmVycih4KSAiIgorI2VuZGlmIC8qIExXSVBfREVCVUcgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTFdJUF9FUlJfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9pbml0LmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9pbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkY2RmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL2luaXQuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfSU5JVF9IX18KKyNkZWZpbmUgX19MV0lQX0lOSVRfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBYLngueDogTWFqb3IgdmVyc2lvbiBvZiB0aGUgc3RhY2sgKi8KKyNkZWZpbmUgTFdJUF9WRVJTSU9OX01BSk9SICAgICAgMVUKKy8qKiB4LlgueDogTWlub3IgdmVyc2lvbiBvZiB0aGUgc3RhY2sgKi8KKyNkZWZpbmUgTFdJUF9WRVJTSU9OX01JTk9SICAgICAgNFUKKy8qKiB4LnguWDogUmV2aXNpb24gb2YgdGhlIHN0YWNrICovCisjZGVmaW5lIExXSVBfVkVSU0lPTl9SRVZJU0lPTiAgIDBVCisvKiogRm9yIHJlbGVhc2UgY2FuZGlkYXRlcywgdGhpcyBpcyBzZXQgdG8gMS4uMjU0CisgICogRm9yIG9mZmljaWFsIHJlbGVhc2VzLCB0aGlzIGlzIHNldCB0byAyNTUgKExXSVBfUkNfUkVMRUFTRSkKKyAgKiBGb3IgZGV2ZWxvcG1lbnQgdmVyc2lvbnMgKENWUyksIHRoaXMgaXMgc2V0IHRvIDAgKExXSVBfUkNfREVWRUxPUE1FTlQpICovCisjZGVmaW5lIExXSVBfVkVSU0lPTl9SQyAgICAgICAgIDI1NVUKKworLyoqIExXSVBfVkVSU0lPTl9SQyBpcyBzZXQgdG8gTFdJUF9SQ19SRUxFQVNFIGZvciBvZmZpY2lhbCByZWxlYXNlcyAqLworI2RlZmluZSBMV0lQX1JDX1JFTEVBU0UgICAgICAgICAyNTVVCisvKiogTFdJUF9WRVJTSU9OX1JDIGlzIHNldCB0byBMV0lQX1JDX0RFVkVMT1BNRU5UIGZvciBDVlMgdmVyc2lvbnMgKi8KKyNkZWZpbmUgTFdJUF9SQ19ERVZFTE9QTUVOVCAgICAgMFUKKworI2RlZmluZSBMV0lQX1ZFUlNJT05fSVNfUkVMRUFTRSAgICAgKExXSVBfVkVSU0lPTl9SQyA9PSBMV0lQX1JDX1JFTEVBU0UpCisjZGVmaW5lIExXSVBfVkVSU0lPTl9JU19ERVZFTE9QTUVOVCAoTFdJUF9WRVJTSU9OX1JDID09IExXSVBfUkNfREVWRUxPUE1FTlQpCisjZGVmaW5lIExXSVBfVkVSU0lPTl9JU19SQyAgICAgICAgICAoKExXSVBfVkVSU0lPTl9SQyAhPSBMV0lQX1JDX1JFTEVBU0UpICYmIChMV0lQX1ZFUlNJT05fUkMgIT0gTFdJUF9SQ19ERVZFTE9QTUVOVCkpCisKKy8qKiBQcm92aWRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgc3RhY2sgKi8KKyNkZWZpbmUgTFdJUF9WRVJTSU9OICAgKExXSVBfVkVSU0lPTl9NQUpPUiA8PCAyNCAgIHwgTFdJUF9WRVJTSU9OX01JTk9SIDw8IDE2IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgTFdJUF9WRVJTSU9OX1JFVklTSU9OIDw8IDggfCBMV0lQX1ZFUlNJT05fUkMpCisKKy8qIE1vZHVsZXMgaW5pdGlhbGl6YXRpb24gKi8KK3ZvaWQgbHdpcF9pbml0KHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19MV0lQX0lOSVRfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9tZW0uaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYmYyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9tZW0uaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKyNpZm5kZWYgX19MV0lQX01FTV9IX18KKyNkZWZpbmUgX19MV0lQX01FTV9IX18KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIE1FTV9MSUJDX01BTExPQworCisjaW5jbHVkZSA8c3RkZGVmLmg+IC8qIGZvciBzaXplX3QgKi8KKwordHlwZWRlZiBzaXplX3QgbWVtX3NpemVfdDsKKworLyogYWxpYXNlcyBmb3IgQyBsaWJyYXJ5IG1hbGxvYygpICovCisjZGVmaW5lIGx3aXBfbWVtX2luaXQoKQorLyogaW4gY2FzZSBDIGxpYnJhcnkgbWFsbG9jKCkgbmVlZHMgZXh0cmEgcHJvdGVjdGlvbiwKKyAqIGFsbG93IHRoZXNlIGRlZmluZXMgdG8gYmUgb3ZlcnJpZGRlbi4KKyAqLworI2lmbmRlZiBtZW1fZnJlZQorI2RlZmluZSBtZW1fZnJlZSBmcmVlCisjZW5kaWYKKyNpZm5kZWYgbWVtX21hbGxvYworI2RlZmluZSBtZW1fbWFsbG9jIG1hbGxvYworI2VuZGlmCisjaWZuZGVmIG1lbV9jYWxsb2MKKyNkZWZpbmUgbWVtX2NhbGxvYyBjYWxsb2MKKyNlbmRpZgorLyogU2luY2UgdGhlcmUgaXMgbm8gQyBsaWJyYXJ5IGFsbG9jYXRpb24gZnVuY3Rpb24gdG8gc2hyaW5rIG1lbW9yeSB3aXRob3V0CisgICBtb3ZpbmcgaXQsIGRlZmluZSB0aGlzIHRvIG5vdGhpbmcuICovCisjaWZuZGVmIG1lbV90cmltCisjZGVmaW5lIG1lbV90cmltKG1lbSwgc2l6ZSkgKG1lbSkKKyNlbmRpZgorI2Vsc2UgLyogTUVNX0xJQkNfTUFMTE9DICovCisKKy8qIE1FTV9TSVpFIHdvdWxkIGhhdmUgdG8gYmUgYWxpZ25lZCwgYnV0IHVzaW5nIDY0MDAwIGhlcmUgaW5zdGVhZCBvZgorICogNjU1MzUgbGVhdmVzIHNvbWUgcm9vbSBmb3IgYWxpZ25tZW50Li4uCisgKi8KKyNpZiBNRU1fU0laRSA+IDY0MDAwTAordHlwZWRlZiB1MzJfdCBtZW1fc2l6ZV90OworI2RlZmluZSBNRU1fU0laRV9GIFUzMl9GCisjZWxzZQordHlwZWRlZiB1MTZfdCBtZW1fc2l6ZV90OworI2RlZmluZSBNRU1fU0laRV9GIFUxNl9GCisjZW5kaWYgLyogTUVNX1NJWkUgPiA2NDAwMCAqLworCisjaWYgTUVNX1VTRV9QT09MUworLyoqIGx3aXBfbWVtX2luaXQgaXMgbm90IHVzZWQgd2hlbiB1c2luZyBwb29scyBpbnN0ZWFkIG9mIGEgaGVhcCAqLworI2RlZmluZSBsd2lwX21lbV9pbml0KCkKKy8qKiBtZW1fdHJpbSBpcyBub3QgdXNlZCB3aGVuIHVzaW5nIHBvb2xzIGluc3RlYWQgb2YgYSBoZWFwOgorICAgIHdlIGNhbid0IGZyZWUgcGFydCBvZiBhIHBvb2wgZWxlbWVudCBhbmQgZG9uJ3Qgd2FudCB0byBjb3B5IHRoZSByZXN0ICovCisjZGVmaW5lIG1lbV90cmltKG1lbSwgc2l6ZSkgKG1lbSkKKyNlbHNlIC8qIE1FTV9VU0VfUE9PTFMgKi8KKy8qIGx3SVAgYWx0ZXJuYXRpdmUgbWFsbG9jICovCit2b2lkICBsd2lwX21lbV9pbml0KHZvaWQpOwordm9pZCAqbWVtX3RyaW0odm9pZCAqbWVtLCBtZW1fc2l6ZV90IHNpemUpOworI2VuZGlmIC8qIE1FTV9VU0VfUE9PTFMgKi8KK3ZvaWQgKm1lbV9tYWxsb2MobWVtX3NpemVfdCBzaXplKTsKK3ZvaWQgKm1lbV9jYWxsb2MobWVtX3NpemVfdCBjb3VudCwgbWVtX3NpemVfdCBzaXplKTsKK3ZvaWQgIG1lbV9mcmVlKHZvaWQgKm1lbSk7CisjZW5kaWYgLyogTUVNX0xJQkNfTUFMTE9DICovCisKKy8qKiBDYWxjdWxhdGUgbWVtb3J5IHNpemUgZm9yIGFuIGFsaWduZWQgYnVmZmVyIC0gcmV0dXJucyB0aGUgbmV4dCBoaWdoZXN0CisgKiBtdWx0aXBsZSBvZiBNRU1fQUxJR05NRU5UIChlLmcuIExXSVBfTUVNX0FMSUdOX1NJWkUoMykgYW5kCisgKiBMV0lQX01FTV9BTElHTl9TSVpFKDQpIHdpbGwgYm90aCB5aWVsZCA0IGZvciBNRU1fQUxJR05NRU5UID09IDQpLgorICovCisjaWZuZGVmIExXSVBfTUVNX0FMSUdOX1NJWkUKKyNkZWZpbmUgTFdJUF9NRU1fQUxJR05fU0laRShzaXplKSAoKChzaXplKSArIE1FTV9BTElHTk1FTlQgLSAxKSAmIH4oTUVNX0FMSUdOTUVOVC0xKSkKKyNlbmRpZgorCisvKiogQ2FsY3VsYXRlIHNhZmUgbWVtb3J5IHNpemUgZm9yIGFuIGFsaWduZWQgYnVmZmVyIHdoZW4gdXNpbmcgYW4gdW5hbGlnbmVkCisgKiB0eXBlIGFzIHN0b3JhZ2UuIFRoaXMgaW5jbHVkZXMgYSBzYWZldHktbWFyZ2luIG9uIChNRU1fQUxJR05NRU5UIC0gMSkgYXQgdGhlCisgKiBzdGFydCAoZS5nLiBpZiBidWZmZXIgaXMgdThfdFtdIGFuZCBhY3R1YWwgZGF0YSB3aWxsIGJlIHUzMl90KikKKyAqLworI2lmbmRlZiBMV0lQX01FTV9BTElHTl9CVUZGRVIKKyNkZWZpbmUgTFdJUF9NRU1fQUxJR05fQlVGRkVSKHNpemUpICgoKHNpemUpICsgTUVNX0FMSUdOTUVOVCAtIDEpKQorI2VuZGlmCisKKy8qKiBBbGlnbiBhIG1lbW9yeSBwb2ludGVyIHRvIHRoZSBhbGlnbm1lbnQgZGVmaW5lZCBieSBNRU1fQUxJR05NRU5UCisgKiBzbyB0aGF0IEFERFIgJSBNRU1fQUxJR05NRU5UID09IDAKKyAqLworI2lmbmRlZiBMV0lQX01FTV9BTElHTgorI2RlZmluZSBMV0lQX01FTV9BTElHTihhZGRyKSAoKHZvaWQgKikoKChtZW1fcHRyX3QpKGFkZHIpICsgTUVNX0FMSUdOTUVOVCAtIDEpICYgfihtZW1fcHRyX3QpKE1FTV9BTElHTk1FTlQtMSkpKQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXSVBfTUVNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvbWVtcC5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvbWVtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZDA3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9tZW1wLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpZm5kZWYgX19MV0lQX01FTVBfSF9fCisjZGVmaW5lIF9fTFdJUF9NRU1QX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBDcmVhdGUgdGhlIGxpc3Qgb2YgYWxsIG1lbW9yeSBwb29scyBtYW5hZ2VkIGJ5IG1lbXAuIE1FTVBfTUFYIHJlcHJlc2VudHMgYSBOVUxMIHBvb2wgYXQgdGhlIGVuZCAqLwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgTFdJUF9NRU1QT09MKG5hbWUsbnVtLHNpemUsZGVzYykgIE1FTVBfIyNuYW1lLAorI2luY2x1ZGUgImx3aXAvbWVtcF9zdGQuaCIKKyAgTUVNUF9NQVgKK30gbWVtcF90OworCisjaWYgTUVNX1VTRV9QT09MUworLyogVXNlIGEgaGVscGVyIHR5cGUgdG8gZ2V0IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSB1c2VyICJtZW1vcnkgcG9vbHMiIGZvciBtZW1fbWFsbG9jICovCit0eXBlZGVmIGVudW0geworICAgIC8qIEdldCB0aGUgZmlyc3QgKHZpYToKKyAgICAgICBNRU1QX1BPT0xfSEVMUEVSX1NUQVJUID0gKCh1OF90KSAxKk1FTVBfUE9PTF9BICsgMCpNRU1QX1BPT0xfQiArIDAqTUVNUF9QT09MX0MgKyAwKSovCisgICAgTUVNUF9QT09MX0hFTFBFUl9GSVJTVCA9ICgodThfdCkKKyNkZWZpbmUgTFdJUF9NRU1QT09MKG5hbWUsbnVtLHNpemUsZGVzYykKKyNkZWZpbmUgTFdJUF9NQUxMT0NfTUVNUE9PTF9TVEFSVCAxCisjZGVmaW5lIExXSVBfTUFMTE9DX01FTVBPT0wobnVtLCBzaXplKSAqIE1FTVBfUE9PTF8jI3NpemUgKyAwCisjZGVmaW5lIExXSVBfTUFMTE9DX01FTVBPT0xfRU5ECisjaW5jbHVkZSAibHdpcC9tZW1wX3N0ZC5oIgorICAgICkgLAorICAgIC8qIEdldCB0aGUgbGFzdCAodmlhOgorICAgICAgIE1FTVBfUE9PTF9IRUxQRVJfRU5EID0gKCh1OF90KSAwICsgTUVNUF9QT09MX0EqMCArIE1FTVBfUE9PTF9CKjAgKyBNRU1QX1BPT0xfQyoxKSAqLworICAgIE1FTVBfUE9PTF9IRUxQRVJfTEFTVCA9ICgodThfdCkKKyNkZWZpbmUgTFdJUF9NRU1QT09MKG5hbWUsbnVtLHNpemUsZGVzYykKKyNkZWZpbmUgTFdJUF9NQUxMT0NfTUVNUE9PTF9TVEFSVAorI2RlZmluZSBMV0lQX01BTExPQ19NRU1QT09MKG51bSwgc2l6ZSkgMCArIE1FTVBfUE9PTF8jI3NpemUgKgorI2RlZmluZSBMV0lQX01BTExPQ19NRU1QT09MX0VORCAxCisjaW5jbHVkZSAibHdpcC9tZW1wX3N0ZC5oIgorICAgICkKK30gbWVtcF9wb29sX2hlbHBlcl90OworCisvKiBUaGUgYWN0dWFsIHN0YXJ0IGFuZCBzdG9wIHZhbHVlcyBhcmUgaGVyZSAoY2FzdCB0aGVtIG92ZXIpCisgICBXZSB1c2UgdGhpcyBoZWxwZXIgdHlwZSBhbmQgdGhlc2UgZGVmaW5lcyBzbyB3ZSBjYW4gYXZvaWQgdXNpbmcgY29uc3QgbWVtcF90IHZhbHVlcyAqLworI2RlZmluZSBNRU1QX1BPT0xfRklSU1QgKChtZW1wX3QpIE1FTVBfUE9PTF9IRUxQRVJfRklSU1QpCisjZGVmaW5lIE1FTVBfUE9PTF9MQVNUICAgKChtZW1wX3QpIE1FTVBfUE9PTF9IRUxQRVJfTEFTVCkKKyNlbmRpZiAvKiBNRU1fVVNFX1BPT0xTICovCisKKyNpZiBNRU1QX01FTV9NQUxMT0MgfHwgTUVNX1VTRV9QT09MUworZXh0ZXJuIGNvbnN0IHUxNl90IG1lbXBfc2l6ZXNbTUVNUF9NQVhdOworI2VuZGlmIC8qIE1FTVBfTUVNX01BTExPQyB8fCBNRU1fVVNFX1BPT0xTICovCisKKyNpZiBNRU1QX01FTV9NQUxMT0MKKworI2luY2x1ZGUgIm1lbS5oIgorCisjZGVmaW5lIG1lbXBfaW5pdCgpCisjZGVmaW5lIG1lbXBfbWFsbG9jKHR5cGUpICAgICBtZW1fbWFsbG9jKG1lbXBfc2l6ZXNbdHlwZV0pCisjZGVmaW5lIG1lbXBfZnJlZSh0eXBlLCBtZW0pICBtZW1fZnJlZShtZW0pCisKKyNlbHNlIC8qIE1FTVBfTUVNX01BTExPQyAqLworCisjaWYgTUVNX1VTRV9QT09MUworLyoqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2F2ZSB0aGUgcG9vbCBvbmUgZWxlbWVudCBjYW1lIGZyb20uICovCitzdHJ1Y3QgbWVtcF9tYWxsb2NfaGVscGVyCit7CisgICBtZW1wX3QgcG9vbG5yOworfTsKKyNlbmRpZiAvKiBNRU1fVVNFX1BPT0xTICovCisKK3ZvaWQgIG1lbXBfaW5pdCh2b2lkKTsKKworI2lmIE1FTVBfT1ZFUkZMT1dfQ0hFQ0sKK3ZvaWQgKm1lbXBfbWFsbG9jX2ZuKG1lbXBfdCB0eXBlLCBjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBpbnQgbGluZSk7CisjZGVmaW5lIG1lbXBfbWFsbG9jKHQpIG1lbXBfbWFsbG9jX2ZuKCh0KSwgX19GSUxFX18sIF9fTElORV9fKQorI2Vsc2UKK3ZvaWQgKm1lbXBfbWFsbG9jKG1lbXBfdCB0eXBlKTsKKyNlbmRpZgordm9pZCAgbWVtcF9mcmVlKG1lbXBfdCB0eXBlLCB2b2lkICptZW0pOworCisjZW5kaWYgLyogTUVNUF9NRU1fTUFMTE9DICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXSVBfTUVNUF9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL21lbXBfc3RkLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9tZW1wX3N0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTQwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9tZW1wX3N0ZC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogU0VUVVA6IE1ha2Ugc3VyZSB3ZSBkZWZpbmUgZXZlcnl0aGluZyB3ZSB3aWxsIG5lZWQuCisgKgorICogV2UgaGF2ZSBjcmVhdGUgdGhyZWUgdHlwZXMgb2YgcG9vbHM6CisgKiAgIDEpIE1FTVBPT0wgLSBzdGFuZGFyZCBwb29scworICogICAyKSBNQUxMT0NfTUVNUE9PTCAtIHRvIGJlIHVzZWQgYnkgbWVtX21hbGxvYyBpbiBtZW0uYworICogICAzKSBQQlVGX01FTVBPT0wgLSBhIG1lbXBvb2wgb2YgcGJ1ZidzLCBzbyBpbmNsdWRlIHNwYWNlIGZvciB0aGUgcGJ1ZiBzdHJ1Y3QKKyAqCisgKiBJZiB0aGUgaW5jbHVkZSdyIGRvZXNuJ3QgcmVxdWlyZSBhbnkgc3BlY2lhbCB0cmVhdG1lbnQgb2YgZWFjaCBvZiB0aGUgdHlwZXMKKyAqIGFib3ZlLCB0aGVuIHdpbGwgZGVjbGFyZSAjMiAmICMzIHRvIGJlIGp1c3Qgc3RhbmRhcmQgbWVtcG9vbHMuCisgKi8KKyNpZm5kZWYgTFdJUF9NQUxMT0NfTUVNUE9PTAorLyogVGhpcyB0cmVhdHMgIm1hbGxvYyBwb29scyIganVzdCBsaWtlIGFueSBvdGhlciBwb29sLgorICAgVGhlIHBvb2xzIGFyZSBhIGxpdHRsZSBiaWdnZXIgdG8gcHJvdmlkZSAnc2l6ZScgYXMgdGhlIGFtb3VudCBvZiB1c2VyIGRhdGEuICovCisjZGVmaW5lIExXSVBfTUFMTE9DX01FTVBPT0wobnVtLCBzaXplKSBMV0lQX01FTVBPT0woUE9PTF8jI3NpemUsIG51bSwgKHNpemUgKyBzaXplb2Yoc3RydWN0IG1lbXBfbWFsbG9jX2hlbHBlcikpLCAiTUFMTE9DXyIjc2l6ZSkKKyNkZWZpbmUgTFdJUF9NQUxMT0NfTUVNUE9PTF9TVEFSVAorI2RlZmluZSBMV0lQX01BTExPQ19NRU1QT09MX0VORAorI2VuZGlmIC8qIExXSVBfTUFMTE9DX01FTVBPT0wgKi8gCisKKyNpZm5kZWYgTFdJUF9QQlVGX01FTVBPT0wKKy8qIFRoaXMgdHJlYXRzICJwYnVmIHBvb2xzIiBqdXN0IGxpa2UgYW55IG90aGVyIHBvb2wuCisgKiBBbGxvY2F0ZXMgYnVmZmVycyBmb3IgYSBwYnVmIHN0cnVjdCBBTkQgYSBwYXlsb2FkIHNpemUgKi8KKyNkZWZpbmUgTFdJUF9QQlVGX01FTVBPT0wobmFtZSwgbnVtLCBwYXlsb2FkLCBkZXNjKSBMV0lQX01FTVBPT0wobmFtZSwgbnVtLCAoTUVNUF9BTElHTl9TSVpFKHNpemVvZihzdHJ1Y3QgcGJ1ZikpICsgTUVNUF9BTElHTl9TSVpFKHBheWxvYWQpKSwgZGVzYykKKyNlbmRpZiAvKiBMV0lQX1BCVUZfTUVNUE9PTCAqLworCisKKy8qCisgKiBBIGxpc3Qgb2YgaW50ZXJuYWwgcG9vbHMgdXNlZCBieSBMV0lQLgorICoKKyAqIExXSVBfTUVNUE9PTChwb29sX25hbWUsIG51bWJlcl9lbGVtZW50cywgZWxlbWVudF9zaXplLCBwb29sX2Rlc2NyaXB0aW9uKQorICogICAgIGNyZWF0ZXMgYSBwb29sIG5hbWUgTUVNUF9wb29sX25hbWUuIGRlc2NyaXB0aW9uIGlzIHVzZWQgaW4gc3RhdHMuYworICovCisjaWYgTFdJUF9SQVcKK0xXSVBfTUVNUE9PTChSQVdfUENCLCAgICAgICAgTUVNUF9OVU1fUkFXX1BDQiwgICAgICAgICBzaXplb2Yoc3RydWN0IHJhd19wY2IpLCAgICAgICAgIlJBV19QQ0IiKQorI2VuZGlmIC8qIExXSVBfUkFXICovCisKKyNpZiBMV0lQX1VEUAorTFdJUF9NRU1QT09MKFVEUF9QQ0IsICAgICAgICBNRU1QX05VTV9VRFBfUENCLCAgICAgICAgIHNpemVvZihzdHJ1Y3QgdWRwX3BjYiksICAgICAgICAiVURQX1BDQiIpCisjZW5kaWYgLyogTFdJUF9VRFAgKi8KKworI2lmIExXSVBfVENQCitMV0lQX01FTVBPT0woVENQX1BDQiwgICAgICAgIE1FTVBfTlVNX1RDUF9QQ0IsICAgICAgICAgc2l6ZW9mKHN0cnVjdCB0Y3BfcGNiKSwgICAgICAgICJUQ1BfUENCIikKK0xXSVBfTUVNUE9PTChUQ1BfUENCX0xJU1RFTiwgTUVNUF9OVU1fVENQX1BDQl9MSVNURU4sICBzaXplb2Yoc3RydWN0IHRjcF9wY2JfbGlzdGVuKSwgIlRDUF9QQ0JfTElTVEVOIikKK0xXSVBfTUVNUE9PTChUQ1BfU0VHLCAgICAgICAgTUVNUF9OVU1fVENQX1NFRywgICAgICAgICBzaXplb2Yoc3RydWN0IHRjcF9zZWcpLCAgICAgICAgIlRDUF9TRUciKQorI2VuZGlmIC8qIExXSVBfVENQICovCisKKyNpZiBJUF9SRUFTU0VNQkxZCitMV0lQX01FTVBPT0woUkVBU1NEQVRBLCAgICAgIE1FTVBfTlVNX1JFQVNTREFUQSwgICAgICAgc2l6ZW9mKHN0cnVjdCBpcF9yZWFzc2RhdGEpLCAgICJSRUFTU0RBVEEiKQorI2VuZGlmIC8qIElQX1JFQVNTRU1CTFkgKi8KKyNpZiBJUF9GUkFHICYmICFJUF9GUkFHX1VTRVNfU1RBVElDX0JVRiAmJiAhTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRgorTFdJUF9NRU1QT09MKEZSQUdfUEJVRiwgICAgICBNRU1QX05VTV9GUkFHX1BCVUYsICAgICAgIHNpemVvZihzdHJ1Y3QgcGJ1Zl9jdXN0b21fcmVmKSwiRlJBR19QQlVGIikKKyNlbmRpZiAvKiBJUF9GUkFHICYmICFJUF9GUkFHX1VTRVNfU1RBVElDX0JVRiAmJiAhTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRiAqLworCisjaWYgTFdJUF9ORVRDT05OCitMV0lQX01FTVBPT0woTkVUQlVGLCAgICAgICAgIE1FTVBfTlVNX05FVEJVRiwgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBuZXRidWYpLCAgICAgICAgICJORVRCVUYiKQorTFdJUF9NRU1QT09MKE5FVENPTk4sICAgICAgICBNRU1QX05VTV9ORVRDT05OLCAgICAgICAgIHNpemVvZihzdHJ1Y3QgbmV0Y29ubiksICAgICAgICAiTkVUQ09OTiIpCisjZW5kaWYgLyogTFdJUF9ORVRDT05OICovCisKKyNpZiBOT19TWVM9PTAKK0xXSVBfTUVNUE9PTChUQ1BJUF9NU0dfQVBJLCAgTUVNUF9OVU1fVENQSVBfTVNHX0FQSSwgICBzaXplb2Yoc3RydWN0IHRjcGlwX21zZyksICAgICAgIlRDUElQX01TR19BUEkiKQorI2lmICFMV0lQX1RDUElQX0NPUkVfTE9DS0lOR19JTlBVVAorTFdJUF9NRU1QT09MKFRDUElQX01TR19JTlBLVCxNRU1QX05VTV9UQ1BJUF9NU0dfSU5QS1QsIHNpemVvZihzdHJ1Y3QgdGNwaXBfbXNnKSwgICAgICAiVENQSVBfTVNHX0lOUEtUIikKKyNlbmRpZiAvKiAhTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkdfSU5QVVQgKi8KKyNlbmRpZiAvKiBOT19TWVM9PTAgKi8KKworI2lmIEFSUF9RVUVVRUlORworTFdJUF9NRU1QT09MKEFSUF9RVUVVRSwgICAgICBNRU1QX05VTV9BUlBfUVVFVUUsICAgICAgIHNpemVvZihzdHJ1Y3QgZXRoYXJwX3FfZW50cnkpLCAiQVJQX1FVRVVFIikKKyNlbmRpZiAvKiBBUlBfUVVFVUVJTkcgKi8KKworI2lmIExXSVBfSUdNUAorTFdJUF9NRU1QT09MKElHTVBfR1JPVVAsICAgICBNRU1QX05VTV9JR01QX0dST1VQLCAgICAgIHNpemVvZihzdHJ1Y3QgaWdtcF9ncm91cCksICAgICAiSUdNUF9HUk9VUCIpCisjZW5kaWYgLyogTFdJUF9JR01QICovCisKKyNpZiAoIU5PX1NZUyB8fCAoTk9fU1lTICYmICFOT19TWVNfTk9fVElNRVJTKSkgLyogTFdJUF9USU1FUlMgKi8KK0xXSVBfTUVNUE9PTChTWVNfVElNRU9VVCwgICAgTUVNUF9OVU1fU1lTX1RJTUVPVVQsICAgICBzaXplb2Yoc3RydWN0IHN5c190aW1lbyksICAgICAgIlNZU19USU1FT1VUIikKKyNlbmRpZiAvKiBMV0lQX1RJTUVSUyAqLworCisjaWYgTFdJUF9TTk1QCitMV0lQX01FTVBPT0woU05NUF9ST09UTk9ERSwgIE1FTVBfTlVNX1NOTVBfUk9PVE5PREUsICAgc2l6ZW9mKHN0cnVjdCBtaWJfbGlzdF9yb290bm9kZSksICJTTk1QX1JPT1ROT0RFIikKK0xXSVBfTUVNUE9PTChTTk1QX05PREUsICAgICAgTUVNUF9OVU1fU05NUF9OT0RFLCAgICAgICBzaXplb2Yoc3RydWN0IG1pYl9saXN0X25vZGUpLCAgICAgIlNOTVBfTk9ERSIpCitMV0lQX01FTVBPT0woU05NUF9WQVJCSU5ELCAgIE1FTVBfTlVNX1NOTVBfVkFSQklORCwgICAgc2l6ZW9mKHN0cnVjdCBzbm1wX3ZhcmJpbmQpLCAgICAgICJTTk1QX1ZBUkJJTkQiKQorTFdJUF9NRU1QT09MKFNOTVBfVkFMVUUsICAgICBNRU1QX05VTV9TTk1QX1ZBTFVFLCAgICAgIFNOTVBfTUFYX1ZBTFVFX1NJWkUsICAgICAgICAgICAgICAiU05NUF9WQUxVRSIpCisjZW5kaWYgLyogTFdJUF9TTk1QICovCisjaWYgTFdJUF9ETlMgJiYgTFdJUF9TT0NLRVQKK0xXSVBfTUVNUE9PTChORVREQiwgICAgICAgICAgTUVNUF9OVU1fTkVUREIsICAgICAgICAgICBORVREQl9FTEVNX1NJWkUsICAgICAgICAgICAgICAgIk5FVERCIikKKyNlbmRpZiAvKiBMV0lQX0ROUyAmJiBMV0lQX1NPQ0tFVCAqLworI2lmIExXSVBfRE5TICYmIEROU19MT0NBTF9IT1NUTElTVCAmJiBETlNfTE9DQUxfSE9TVExJU1RfSVNfRFlOQU1JQworTFdJUF9NRU1QT09MKExPQ0FMSE9TVExJU1QsICBNRU1QX05VTV9MT0NBTEhPU1RMSVNULCAgIExPQ0FMSE9TVExJU1RfRUxFTV9TSVpFLCAgICAgICAiTE9DQUxIT1NUTElTVCIpCisjZW5kaWYgLyogTFdJUF9ETlMgJiYgRE5TX0xPQ0FMX0hPU1RMSVNUICYmIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDICovCisjaWYgUFBQX1NVUFBPUlQgJiYgUFBQT0VfU1VQUE9SVAorTFdJUF9NRU1QT09MKFBQUE9FX0lGLCAgICAgIE1FTVBfTlVNX1BQUE9FX0lOVEVSRkFDRVMsIHNpemVvZihzdHJ1Y3QgcHBwb2Vfc29mdGMpLCAgICAiUFBQT0VfSUYiKQorI2VuZGlmIC8qIFBQUF9TVVBQT1JUICYmIFBQUE9FX1NVUFBPUlQgKi8KKworLyoKKyAqIEEgbGlzdCBvZiBwb29scyBvZiBwYnVmJ3MgdXNlZCBieSBMV0lQLgorICoKKyAqIExXSVBfUEJVRl9NRU1QT09MKHBvb2xfbmFtZSwgbnVtYmVyX2VsZW1lbnRzLCBwYnVmX3BheWxvYWRfc2l6ZSwgcG9vbF9kZXNjcmlwdGlvbikKKyAqICAgICBjcmVhdGVzIGEgcG9vbCBuYW1lIE1FTVBfcG9vbF9uYW1lLiBkZXNjcmlwdGlvbiBpcyB1c2VkIGluIHN0YXRzLmMKKyAqICAgICBUaGlzIGFsbG9jYXRlcyBlbm91Z2ggc3BhY2UgZm9yIHRoZSBwYnVmIHN0cnVjdCBhbmQgYSBwYXlsb2FkLgorICogICAgIChFeGFtcGxlOiBwYnVmX3BheWxvYWRfc2l6ZT0wIGFsbG9jYXRlcyBvbmx5IHNpemUgZm9yIHRoZSBzdHJ1Y3QpCisgKi8KK0xXSVBfUEJVRl9NRU1QT09MKFBCVUYsICAgICAgTUVNUF9OVU1fUEJVRiwgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBCVUZfUkVGL1JPTSIpCitMV0lQX1BCVUZfTUVNUE9PTChQQlVGX1BPT0wsIFBCVUZfUE9PTF9TSVpFLCAgICAgICAgICAgUEJVRl9QT09MX0JVRlNJWkUsICAgICAgICAgICAgICJQQlVGX1BPT0wiKQorCisKKy8qCisgKiBBbGxvdyBmb3IgdXNlci1kZWZpbmVkIHBvb2xzOyB0aGlzIG11c3QgYmUgZXhwbGljaXRseSBzZXQgaW4gbHdpcG9wdHMuaAorICogc2luY2UgdGhlIGRlZmF1bHQgaXMgdG8gTk9UIGxvb2sgZm9yIGx3aXBwb29scy5oCisgKi8KKyNpZiBNRU1QX1VTRV9DVVNUT01fUE9PTFMKKyNpbmNsdWRlICJsd2lwcG9vbHMuaCIKKyNlbmRpZiAvKiBNRU1QX1VTRV9DVVNUT01fUE9PTFMgKi8KKworLyoKKyAqIFJFUVVJUkVEIENMRUFOVVA6IENsZWFyIHVwIHNvIHdlIGRvbid0IGdldCAibXVsdGlwbHkgZGVmaW5lZCIgZXJyb3IgbGF0ZXIKKyAqICgjdW5kZWYgaXMgaWdub3JlZCBmb3Igc29tZXRoaW5nIHRoYXQgaXMgbm90IGRlZmluZWQpCisgKi8KKyN1bmRlZiBMV0lQX01FTVBPT0wKKyN1bmRlZiBMV0lQX01BTExPQ19NRU1QT09MCisjdW5kZWYgTFdJUF9NQUxMT0NfTUVNUE9PTF9TVEFSVAorI3VuZGVmIExXSVBfTUFMTE9DX01FTVBPT0xfRU5ECisjdW5kZWYgTFdJUF9QQlVGX01FTVBPT0wKZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL25ldGJ1Zi5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvbmV0YnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyNDdkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL25ldGJ1Zi5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfTkVUQlVGX0hfXworI2RlZmluZSBfX0xXSVBfTkVUQlVGX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogVGhpcyBuZXRidWYgaGFzIGRlc3QtYWRkci9wb3J0IHNldCAqLworI2RlZmluZSBORVRCVUZfRkxBR19ERVNUQUREUiAgICAweDAxCisvKiogVGhpcyBuZXRidWYgaW5jbHVkZXMgYSBjaGVja3N1bSAqLworI2RlZmluZSBORVRCVUZfRkxBR19DSEtTVU0gICAgICAweDAyCisKK3N0cnVjdCBuZXRidWYgeworICBzdHJ1Y3QgcGJ1ZiAqcCwgKnB0cjsKKyAgaXBfYWRkcl90IGFkZHI7CisgIHUxNl90IHBvcnQ7CisjaWYgTFdJUF9ORVRCVUZfUkVDVklORk8gfHwgTFdJUF9DSEVDS1NVTV9PTl9DT1BZCisjaWYgTFdJUF9DSEVDS1NVTV9PTl9DT1BZCisgIHU4X3QgZmxhZ3M7CisjZW5kaWYgLyogTFdJUF9DSEVDS1NVTV9PTl9DT1BZICovCisgIHUxNl90IHRvcG9ydF9jaGtzdW07CisjaWYgTFdJUF9ORVRCVUZfUkVDVklORk8KKyAgaXBfYWRkcl90IHRvYWRkcjsKKyNlbmRpZiAvKiBMV0lQX05FVEJVRl9SRUNWSU5GTyAqLworI2VuZGlmIC8qIExXSVBfTkVUQlVGX1JFQ1ZJTkZPIHx8IExXSVBfQ0hFQ0tTVU1fT05fQ09QWSAqLworfTsKKworLyogTmV0d29yayBidWZmZXIgZnVuY3Rpb25zOiAqLworc3RydWN0IG5ldGJ1ZiAqICAgbmV0YnVmX25ldyAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIG5ldGJ1Zl9kZWxldGUgICAoc3RydWN0IG5ldGJ1ZiAqYnVmKTsKK3ZvaWQgKiAgICAgICAgICAgIG5ldGJ1Zl9hbGxvYyAgICAoc3RydWN0IG5ldGJ1ZiAqYnVmLCB1MTZfdCBzaXplKTsKK3ZvaWQgICAgICAgICAgICAgIG5ldGJ1Zl9mcmVlICAgICAoc3RydWN0IG5ldGJ1ZiAqYnVmKTsKK2Vycl90ICAgICAgICAgICAgIG5ldGJ1Zl9yZWYgICAgICAoc3RydWN0IG5ldGJ1ZiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhcHRyLCB1MTZfdCBzaXplKTsKK3ZvaWQgICAgICAgICAgICAgIG5ldGJ1Zl9jaGFpbiAgICAoc3RydWN0IG5ldGJ1ZiAqaGVhZCwKKyAgICAgICAgICAgc3RydWN0IG5ldGJ1ZiAqdGFpbCk7CisKK2Vycl90ICAgICAgICAgICAgIG5ldGJ1Zl9kYXRhICAgICAoc3RydWN0IG5ldGJ1ZiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YXB0ciwgdTE2X3QgKmxlbik7CitzOF90ICAgICAgICAgICAgICBuZXRidWZfbmV4dCAgICAgKHN0cnVjdCBuZXRidWYgKmJ1Zik7Cit2b2lkICAgICAgICAgICAgICBuZXRidWZfZmlyc3QgICAgKHN0cnVjdCBuZXRidWYgKmJ1Zik7CisKKworI2RlZmluZSBuZXRidWZfY29weV9wYXJ0aWFsKGJ1ZiwgZGF0YXB0ciwgbGVuLCBvZmZzZXQpIFwKKyAgcGJ1Zl9jb3B5X3BhcnRpYWwoKGJ1ZiktPnAsIChkYXRhcHRyKSwgKGxlbiksIChvZmZzZXQpKQorI2RlZmluZSBuZXRidWZfY29weShidWYsZGF0YXB0cixsZW4pIG5ldGJ1Zl9jb3B5X3BhcnRpYWwoYnVmLCBkYXRhcHRyLCBsZW4sIDApCisjZGVmaW5lIG5ldGJ1Zl90YWtlKGJ1ZiwgZGF0YXB0ciwgbGVuKSBwYnVmX3Rha2UoKGJ1ZiktPnAsIGRhdGFwdHIsIGxlbikKKyNkZWZpbmUgbmV0YnVmX2xlbihidWYpICAgICAgICAgICAgICAoKGJ1ZiktPnAtPnRvdF9sZW4pCisjZGVmaW5lIG5ldGJ1Zl9mcm9tYWRkcihidWYpICAgICAgICAgKCYoKGJ1ZiktPmFkZHIpKQorI2RlZmluZSBuZXRidWZfc2V0X2Zyb21hZGRyKGJ1ZiwgZnJvbWFkZHIpIGlwX2FkZHJfc2V0KCgmKGJ1ZiktPmFkZHIpLCBmcm9tYWRkcikKKyNkZWZpbmUgbmV0YnVmX2Zyb21wb3J0KGJ1ZikgICAgICAgICAoKGJ1ZiktPnBvcnQpCisjaWYgTFdJUF9ORVRCVUZfUkVDVklORk8KKyNkZWZpbmUgbmV0YnVmX2Rlc3RhZGRyKGJ1ZikgICAgICAgICAoJigoYnVmKS0+dG9hZGRyKSkKKyNkZWZpbmUgbmV0YnVmX3NldF9kZXN0YWRkcihidWYsIGRlc3RhZGRyKSBpcF9hZGRyX3NldCgoJihidWYpLT5hZGRyKSwgZGVzdGFkZHIpCisjZGVmaW5lIG5ldGJ1Zl9kZXN0cG9ydChidWYpICAgICAgICAgKCgoYnVmKS0+ZmxhZ3MgJiBORVRCVUZfRkxBR19ERVNUQUREUikgPyAoYnVmKS0+dG9wb3J0X2Noa3N1bSA6IDApCisjZW5kaWYgLyogTFdJUF9ORVRCVUZfUkVDVklORk8gKi8KKyNpZiBMV0lQX0NIRUNLU1VNX09OX0NPUFkKKyNkZWZpbmUgbmV0YnVmX3NldF9jaGtzdW0oYnVmLCBjaGtzdW0pIGRvIHsgKGJ1ZiktPmZsYWdzID0gTkVUQlVGX0ZMQUdfQ0hLU1VNOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWYpLT50b3BvcnRfY2hrc3VtID0gY2hrc3VtOyB9IHdoaWxlKDApCisjZW5kaWYgLyogTFdJUF9DSEVDS1NVTV9PTl9DT1BZICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXSVBfTkVUQlVGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvbmV0ZGIuaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL25ldGRiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4N2UyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL25ldGRiLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IFNpbW9uIEdvbGRzY2htaWR0CisgKgorICovCisjaWZuZGVmIF9fTFdJUF9ORVREQl9IX18KKyNkZWZpbmUgX19MV0lQX05FVERCX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfRE5TICYmIExXSVBfU09DS0VUCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4gLyogZm9yIHNpemVfdCAqLworCisjaW5jbHVkZSAibHdpcC9pbmV0LmgiCisjaW5jbHVkZSAibHdpcC9zb2NrZXRzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogc29tZSByYXJlbHkgdXNlZCBvcHRpb25zICovCisjaWZuZGVmIExXSVBfRE5TX0FQSV9ERUNMQVJFX0hfRVJSTk8KKyNkZWZpbmUgTFdJUF9ETlNfQVBJX0RFQ0xBUkVfSF9FUlJOTyAxCisjZW5kaWYKKworI2lmbmRlZiBMV0lQX0ROU19BUElfREVGSU5FX0VSUk9SUworI2RlZmluZSBMV0lQX0ROU19BUElfREVGSU5FX0VSUk9SUyAxCisjZW5kaWYKKworI2lmbmRlZiBMV0lQX0ROU19BUElfREVDTEFSRV9TVFJVQ1RTCisjZGVmaW5lIExXSVBfRE5TX0FQSV9ERUNMQVJFX1NUUlVDVFMgMQorI2VuZGlmCisKKyNpZiBMV0lQX0ROU19BUElfREVGSU5FX0VSUk9SUworLyoqIEVycm9ycyB1c2VkIGJ5IHRoZSBETlMgQVBJIGZ1bmN0aW9ucywgaF9lcnJubyBjYW4gYmUgb25lIG9mIHRoZW0gKi8KKyNkZWZpbmUgRUFJX05PTkFNRSAgICAgIDIwMAorI2RlZmluZSBFQUlfU0VSVklDRSAgICAgMjAxCisjZGVmaW5lIEVBSV9GQUlMICAgICAgICAyMDIKKyNkZWZpbmUgRUFJX01FTU9SWSAgICAgIDIwMworCisjZGVmaW5lIEhPU1RfTk9UX0ZPVU5EICAyMTAKKyNkZWZpbmUgTk9fREFUQSAgICAgICAgIDIxMQorI2RlZmluZSBOT19SRUNPVkVSWSAgICAgMjEyCisjZGVmaW5lIFRSWV9BR0FJTiAgICAgICAyMTMKKyNlbmRpZiAvKiBMV0lQX0ROU19BUElfREVGSU5FX0VSUk9SUyAqLworCisjaWYgTFdJUF9ETlNfQVBJX0RFQ0xBUkVfU1RSVUNUUworc3RydWN0IGhvc3RlbnQgeworICAgIGNoYXIgICpoX25hbWU7ICAgICAgLyogT2ZmaWNpYWwgbmFtZSBvZiB0aGUgaG9zdC4gKi8KKyAgICBjaGFyICoqaF9hbGlhc2VzOyAgIC8qIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0byBhbHRlcm5hdGl2ZSBob3N0IG5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCBieSBhIG51bGwgcG9pbnRlci4gKi8KKyAgICBpbnQgICAgaF9hZGRydHlwZTsgIC8qIEFkZHJlc3MgdHlwZS4gKi8KKyAgICBpbnQgICAgaF9sZW5ndGg7ICAgIC8qIFRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgYWRkcmVzcy4gKi8KKyAgICBjaGFyICoqaF9hZGRyX2xpc3Q7IC8qIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0byBuZXR3b3JrIGFkZHJlc3NlcyAoaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgYnl0ZSBvcmRlcikgZm9yIHRoZSBob3N0LCB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBwb2ludGVyLiAqLworI2RlZmluZSBoX2FkZHIgaF9hZGRyX2xpc3RbMF0gLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KK307CisKK3N0cnVjdCBhZGRyaW5mbyB7CisgICAgaW50ICAgICAgICAgICAgICAgYWlfZmxhZ3M7ICAgICAgLyogSW5wdXQgZmxhZ3MuICovCisgICAgaW50ICAgICAgICAgICAgICAgYWlfZmFtaWx5OyAgICAgLyogQWRkcmVzcyBmYW1pbHkgb2Ygc29ja2V0LiAqLworICAgIGludCAgICAgICAgICAgICAgIGFpX3NvY2t0eXBlOyAgIC8qIFNvY2tldCB0eXBlLiAqLworICAgIGludCAgICAgICAgICAgICAgIGFpX3Byb3RvY29sOyAgIC8qIFByb3RvY29sIG9mIHNvY2tldC4gKi8KKyAgICBzb2NrbGVuX3QgICAgICAgICBhaV9hZGRybGVuOyAgICAvKiBMZW5ndGggb2Ygc29ja2V0IGFkZHJlc3MuICovCisgICAgc3RydWN0IHNvY2thZGRyICAqYWlfYWRkcjsgICAgICAgLyogU29ja2V0IGFkZHJlc3Mgb2Ygc29ja2V0LiAqLworICAgIGNoYXIgICAgICAgICAgICAgKmFpX2Nhbm9ubmFtZTsgIC8qIENhbm9uaWNhbCBuYW1lIG9mIHNlcnZpY2UgbG9jYXRpb24uICovCisgICAgc3RydWN0IGFkZHJpbmZvICAqYWlfbmV4dDsgICAgICAgLyogUG9pbnRlciB0byBuZXh0IGluIGxpc3QuICovCit9OworI2VuZGlmIC8qIExXSVBfRE5TX0FQSV9ERUNMQVJFX1NUUlVDVFMgKi8KKworI2lmIExXSVBfRE5TX0FQSV9ERUNMQVJFX0hfRVJSTk8KKy8qIGFwcGxpY2F0aW9uIGFjY2Vzc2FibGUgZXJyb3IgY29kZSBzZXQgYnkgdGhlIEROUyBBUEkgZnVuY3Rpb25zICovCitleHRlcm4gaW50IGhfZXJybm87CisjZW5kaWYgLyogTFdJUF9ETlNfQVBJX0RFQ0xBUkVfSF9FUlJOTyovCisKK3N0cnVjdCBob3N0ZW50ICpsd2lwX2dldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgbHdpcF9nZXRob3N0YnluYW1lX3IoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGhvc3RlbnQgKnJldCwgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgIHNpemVfdCBidWZsZW4sIHN0cnVjdCBob3N0ZW50ICoqcmVzdWx0LCBpbnQgKmhfZXJybm9wKTsKK3ZvaWQgbHdpcF9mcmVlYWRkcmluZm8oc3RydWN0IGFkZHJpbmZvICphaSk7CitpbnQgbHdpcF9nZXRhZGRyaW5mbyhjb25zdCBjaGFyICpub2RlbmFtZSwKKyAgICAgICBjb25zdCBjaGFyICpzZXJ2bmFtZSwKKyAgICAgICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmhpbnRzLAorICAgICAgIHN0cnVjdCBhZGRyaW5mbyAqKnJlcyk7CisKKyNpZiBMV0lQX0NPTVBBVF9TT0NLRVRTCisjZGVmaW5lIGdldGhvc3RieW5hbWUobmFtZSkgbHdpcF9nZXRob3N0YnluYW1lKG5hbWUpCisjZGVmaW5lIGdldGhvc3RieW5hbWVfcihuYW1lLCByZXQsIGJ1ZiwgYnVmbGVuLCByZXN1bHQsIGhfZXJybm9wKSBcCisgICAgICAgbHdpcF9nZXRob3N0YnluYW1lX3IobmFtZSwgcmV0LCBidWYsIGJ1ZmxlbiwgcmVzdWx0LCBoX2Vycm5vcCkKKyNkZWZpbmUgZnJlZWFkZHJpbmZvKGFkZHJpbmZvKSBsd2lwX2ZyZWVhZGRyaW5mbyhhZGRyaW5mbykKKyNkZWZpbmUgZ2V0YWRkcmluZm8obm9kbmFtZSwgc2Vydm5hbWUsIGhpbnRzLCByZXMpIFwKKyAgICAgICBsd2lwX2dldGFkZHJpbmZvKG5vZG5hbWUsIHNlcnZuYW1lLCBoaW50cywgcmVzKQorI2VuZGlmIC8qIExXSVBfQ09NUEFUX1NPQ0tFVFMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIExXSVBfRE5TICYmIExXSVBfU09DS0VUICovCisKKyNlbmRpZiAvKiBfX0xXSVBfTkVUREJfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9uZXRpZi5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvbmV0aWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTc5OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvbmV0aWYuaApAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKyNpZm5kZWYgX19MV0lQX05FVElGX0hfXworI2RlZmluZSBfX0xXSVBfTkVUSUZfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjZGVmaW5lIEVOQUJMRV9MT09QQkFDSyAoTFdJUF9ORVRJRl9MT09QQkFDSyB8fCBMV0lQX0hBVkVfTE9PUElGKQorCisjaW5jbHVkZSAibHdpcC9lcnIuaCIKKworI2luY2x1ZGUgImx3aXAvaXBfYWRkci5oIgorCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpZiBMV0lQX0RIQ1AKK3N0cnVjdCBkaGNwOworI2VuZGlmCisjaWYgTFdJUF9BVVRPSVAKK3N0cnVjdCBhdXRvaXA7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaHJvdWdob3V0IHRoaXMgZmlsZSwgSVAgYWRkcmVzc2VzIGFyZSBleHBlY3RlZCB0byBiZSBpbgorICogdGhlIHNhbWUgYnl0ZSBvcmRlciBhcyBpbiBJUF9QQ0IuICovCisKKy8qKiBtdXN0IGJlIHRoZSBtYXhpbXVtIG9mIGFsbCB1c2VkIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RocworICAgIGFjcm9zcyBhbGwgdHlwZXMgb2YgaW50ZXJmYWNlcyBpbiB1c2UgKi8KKyNkZWZpbmUgTkVUSUZfTUFYX0hXQUREUl9MRU4gMzJVCisKKy8qKiBXaGV0aGVyIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpcyAndXAnLiBUaGlzIGlzCisgKiBhIHNvZnR3YXJlIGZsYWcgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgdGhpcyBuZXR3b3JrCisgKiBpbnRlcmZhY2UgaXMgZW5hYmxlZCBhbmQgcHJvY2Vzc2VzIHRyYWZmaWMuCisgKiBJdCBpcyBzZXQgYnkgdGhlIHN0YXJ0dXAgY29kZSAoZm9yIHN0YXRpYyBJUCBjb25maWd1cmF0aW9uKSBvcgorICogYnkgZGhjcC9hdXRvaXAgd2hlbiBhbiBhZGRyZXNzIGhhcyBiZWVuIGFzc2lnbmVkLgorICovCisjZGVmaW5lIE5FVElGX0ZMQUdfVVAgICAgICAgICAgIDB4MDFVCisvKiogSWYgc2V0LCB0aGUgbmV0aWYgaGFzIGJyb2FkY2FzdCBjYXBhYmlsaXR5LgorICogU2V0IGJ5IHRoZSBuZXRpZiBkcml2ZXIgaW4gaXRzIGluaXQgZnVuY3Rpb24uICovCisjZGVmaW5lIE5FVElGX0ZMQUdfQlJPQURDQVNUICAgIDB4MDJVCisvKiogSWYgc2V0LCB0aGUgbmV0aWYgaXMgb25lIGVuZCBvZiBhIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb24uCisgKiBTZXQgYnkgdGhlIG5ldGlmIGRyaXZlciBpbiBpdHMgaW5pdCBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgTkVUSUZfRkxBR19QT0lOVFRPUE9JTlQgMHgwNFUKKy8qKiBJZiBzZXQsIHRoZSBpbnRlcmZhY2UgaXMgY29uZmlndXJlZCB1c2luZyBESENQLgorICogU2V0IGJ5IHRoZSBESENQIGNvZGUgd2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBESENQLiAqLworI2RlZmluZSBORVRJRl9GTEFHX0RIQ1AgICAgICAgICAweDA4VQorLyoqIElmIHNldCwgdGhlIGludGVyZmFjZSBoYXMgYW4gYWN0aXZlIGxpbmsKKyAqICAoc2V0IGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZSBkcml2ZXIpLgorICogRWl0aGVyIHNldCBieSB0aGUgbmV0aWYgZHJpdmVyIGluIGl0cyBpbml0IGZ1bmN0aW9uIChpZiB0aGUgbGluaworICogaXMgdXAgYXQgdGhhdCB0aW1lKSBvciBhdCBhIGxhdGVyIHBvaW50IG9uY2UgdGhlIGxpbmsgY29tZXMgdXAKKyAqIChpZiBsaW5rIGRldGVjdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlKS4gKi8KKyNkZWZpbmUgTkVUSUZfRkxBR19MSU5LX1VQICAgICAgMHgxMFUKKy8qKiBJZiBzZXQsIHRoZSBuZXRpZiBpcyBhbiBldGhlcm5ldCBkZXZpY2UgdXNpbmcgQVJQLgorICogU2V0IGJ5IHRoZSBuZXRpZiBkcml2ZXIgaW4gaXRzIGluaXQgZnVuY3Rpb24uCisgKiBVc2VkIHRvIGNoZWNrIGlucHV0IHBhY2tldCB0eXBlcyBhbmQgdXNlIG9mIERIQ1AuICovCisjZGVmaW5lIE5FVElGX0ZMQUdfRVRIQVJQICAgICAgIDB4MjBVCisvKiogSWYgc2V0LCB0aGUgbmV0aWYgaXMgYW4gZXRoZXJuZXQgZGV2aWNlLiBJdCBtaWdodCBub3QgdXNlCisgKiBBUlAgb3IgVENQL0lQIGlmIGl0IGlzIHVzZWQgZm9yIFBQUG9FIG9ubHkuCisgKi8KKyNkZWZpbmUgTkVUSUZfRkxBR19FVEhFUk5FVCAgICAgMHg0MFUKKy8qKiBJZiBzZXQsIHRoZSBuZXRpZiBoYXMgSUdNUCBjYXBhYmlsaXR5LgorICogU2V0IGJ5IHRoZSBuZXRpZiBkcml2ZXIgaW4gaXRzIGluaXQgZnVuY3Rpb24uICovCisjZGVmaW5lIE5FVElGX0ZMQUdfSUdNUCAgICAgICAgIDB4ODBVCisKKy8qKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIG5ldGlmIGluaXQgZnVuY3Rpb25zLiBTZXQgdXAgZmxhZ3MgYW5kIG91dHB1dC9saW5rb3V0cHV0CisgKiBjYWxsYmFjayBmdW5jdGlvbnMgaW4gdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gbmV0aWYgVGhlIG5ldGlmIHRvIGluaXRpYWxpemUKKyAqLwordHlwZWRlZiBlcnJfdCAoKm5ldGlmX2luaXRfZm4pKHN0cnVjdCBuZXRpZiAqbmV0aWYpOworLyoqIEZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbmV0aWYtPmlucHV0IGZ1bmN0aW9ucy4gVGhpcyBmdW5jdGlvbiBpcyBzYXZlZCBhcyAnaW5wdXQnCisgKiBjYWxsYmFjayBmdW5jdGlvbiBpbiB0aGUgbmV0aWYgc3RydWN0LiBDYWxsIGl0IHdoZW4gYSBwYWNrZXQgaGFzIGJlZW4gcmVjZWl2ZWQuCisgKgorICogQHBhcmFtIHAgVGhlIHJlY2VpdmVkIHBhY2tldCwgY29waWVkIGludG8gYSBwYnVmCisgKiBAcGFyYW0gaW5wIFRoZSBuZXRpZiB3aGljaCByZWNlaXZlZCB0aGUgcGFja2V0CisgKi8KK3R5cGVkZWYgZXJyX3QgKCpuZXRpZl9pbnB1dF9mbikoc3RydWN0IHBidWYgKnAsIHN0cnVjdCBuZXRpZiAqaW5wKTsKKy8qKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIG5ldGlmLT5vdXRwdXQgZnVuY3Rpb25zLiBDYWxsZWQgYnkgbHdJUCB3aGVuIGEgcGFja2V0CisgKiBzaGFsbCBiZSBzZW50LiBGb3IgZXRoZXJuZXQgbmV0aWYsIHNldCB0aGlzIHRvICdldGhhcnBfb3V0cHV0JyBhbmQgc2V0CisgKiAnbGlua291dHB1dCcuCisgKgorICogQHBhcmFtIG5ldGlmIFRoZSBuZXRpZiB3aGljaCBzaGFsbCBzZW5kIGEgcGFja2V0CisgKiBAcGFyYW0gcCBUaGUgcGFja2V0IHRvIHNlbmQgKHAtPnBheWxvYWQgcG9pbnRzIHRvIElQIGhlYWRlcikKKyAqIEBwYXJhbSBpcGFkZHIgVGhlIElQIGFkZHJlc3MgdG8gd2hpY2ggdGhlIHBhY2tldCBzaGFsbCBiZSBzZW50CisgKi8KK3R5cGVkZWYgZXJyX3QgKCpuZXRpZl9vdXRwdXRfZm4pKHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwLAorICAgICAgIGlwX2FkZHJfdCAqaXBhZGRyKTsKKy8qKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIG5ldGlmLT5saW5rb3V0cHV0IGZ1bmN0aW9ucy4gT25seSB1c2VkIGZvciBldGhlcm5ldAorICogbmV0aWZzLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBBUlAgd2hlbiBhIHBhY2tldCBzaGFsbCBiZSBzZW50LgorICoKKyAqIEBwYXJhbSBuZXRpZiBUaGUgbmV0aWYgd2hpY2ggc2hhbGwgc2VuZCBhIHBhY2tldAorICogQHBhcmFtIHAgVGhlIHBhY2tldCB0byBzZW5kIChyYXcgZXRoZXJuZXQgcGFja2V0KQorICovCit0eXBlZGVmIGVycl90ICgqbmV0aWZfbGlua291dHB1dF9mbikoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IHBidWYgKnApOworLyoqIEZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbmV0aWYgc3RhdHVzLSBvciBsaW5rLWNhbGxiYWNrIGZ1bmN0aW9ucy4gKi8KK3R5cGVkZWYgdm9pZCAoKm5ldGlmX3N0YXR1c19jYWxsYmFja19mbikoc3RydWN0IG5ldGlmICpuZXRpZik7CisvKiogRnVuY3Rpb24gcHJvdG90eXBlIGZvciBuZXRpZiBpZ21wX21hY19maWx0ZXIgZnVuY3Rpb25zICovCit0eXBlZGVmIGVycl90ICgqbmV0aWZfaWdtcF9tYWNfZmlsdGVyX2ZuKShzdHJ1Y3QgbmV0aWYgKm5ldGlmLAorICAgICAgIGlwX2FkZHJfdCAqZ3JvdXAsIHU4X3QgYWN0aW9uKTsKKworLyoqIEdlbmVyaWMgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBmb3IgYWxsIGx3SVAgbmV0d29yayBpbnRlcmZhY2VzLgorICogIFRoZSBmb2xsb3dpbmcgZmllbGRzIHNob3VsZCBiZSBmaWxsZWQgaW4gYnkgdGhlIGluaXRpYWxpemF0aW9uCisgKiAgZnVuY3Rpb24gZm9yIHRoZSBkZXZpY2UgZHJpdmVyOiBod2FkZHJfbGVuLCBod2FkZHJbXSwgbXR1LCBmbGFncyAqLworc3RydWN0IG5ldGlmIHsKKyAgLyoqIHBvaW50ZXIgdG8gbmV4dCBpbiBsaW5rZWQgbGlzdCAqLworICBzdHJ1Y3QgbmV0aWYgKm5leHQ7CisKKyAgLyoqIElQIGFkZHJlc3MgY29uZmlndXJhdGlvbiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKyAgaXBfYWRkcl90IGlwX2FkZHI7CisgIGlwX2FkZHJfdCBuZXRtYXNrOworICBpcF9hZGRyX3QgZ3c7CisKKyAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXR3b3JrIGRldmljZSBkcml2ZXIKKyAgICogIHRvIHBhc3MgYSBwYWNrZXQgdXAgdGhlIFRDUC9JUCBzdGFjay4gKi8KKyAgbmV0aWZfaW5wdXRfZm4gaW5wdXQ7CisgIC8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgSVAgbW9kdWxlIHdoZW4gaXQgd2FudHMKKyAgICogIHRvIHNlbmQgYSBwYWNrZXQgb24gdGhlIGludGVyZmFjZS4gVGhpcyBmdW5jdGlvbiB0eXBpY2FsbHkKKyAgICogIGZpcnN0IHJlc29sdmVzIHRoZSBoYXJkd2FyZSBhZGRyZXNzLCB0aGVuIHNlbmRzIHRoZSBwYWNrZXQuICovCisgIG5ldGlmX291dHB1dF9mbiBvdXRwdXQ7CisgIC8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgQVJQIG1vZHVsZSB3aGVuIGl0IHdhbnRzCisgICAqICB0byBzZW5kIGEgcGFja2V0IG9uIHRoZSBpbnRlcmZhY2UuIFRoaXMgZnVuY3Rpb24gb3V0cHV0cworICAgKiAgdGhlIHBidWYgYXMtaXMgb24gdGhlIGxpbmsgbWVkaXVtLiAqLworICBuZXRpZl9saW5rb3V0cHV0X2ZuIGxpbmtvdXRwdXQ7CisjaWYgTFdJUF9ORVRJRl9TVEFUVVNfQ0FMTEJBQ0sKKyAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIG5ldGlmIHN0YXRlIGlzIHNldCB0byB1cCBvciBkb3duCisgICAqLworICBuZXRpZl9zdGF0dXNfY2FsbGJhY2tfZm4gc3RhdHVzX2NhbGxiYWNrOworI2VuZGlmIC8qIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLICovCisjaWYgTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLCisgIC8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBuZXRpZiBsaW5rIGlzIHNldCB0byB1cCBvciBkb3duCisgICAqLworICBuZXRpZl9zdGF0dXNfY2FsbGJhY2tfZm4gbGlua19jYWxsYmFjazsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0xJTktfQ0FMTEJBQ0sgKi8KKyAgLyoqIFRoaXMgZmllbGQgY2FuIGJlIHNldCBieSB0aGUgZGV2aWNlIGRyaXZlciBhbmQgY291bGQgcG9pbnQKKyAgICogIHRvIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgZGV2aWNlLiAqLworICB2b2lkICpzdGF0ZTsKKyNpZiBMV0lQX0RIQ1AKKyAgLyoqIHRoZSBESENQIGNsaWVudCBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBuZXRpZiAqLworICBzdHJ1Y3QgZGhjcCAqZGhjcDsKKyNlbmRpZiAvKiBMV0lQX0RIQ1AgKi8KKyNpZiBMV0lQX0FVVE9JUAorICAvKiogdGhlIEF1dG9JUCBjbGllbnQgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgbmV0aWYgKi8KKyAgc3RydWN0IGF1dG9pcCAqYXV0b2lwOworI2VuZGlmCisjaWYgTFdJUF9ORVRJRl9IT1NUTkFNRQorICAvKiB0aGUgaG9zdG5hbWUgZm9yIHRoaXMgbmV0aWYsIE5VTEwgaXMgYSB2YWxpZCB2YWx1ZSAqLworICBjaGFyKiAgaG9zdG5hbWU7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9IT1NUTkFNRSAqLworICAvKiogbWF4aW11bSB0cmFuc2ZlciB1bml0IChpbiBieXRlcykgKi8KKyAgdTE2X3QgbXR1OworICAvKiogbnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gaHdhZGRyICovCisgIHU4X3QgaHdhZGRyX2xlbjsKKyAgLyoqIGxpbmsgbGV2ZWwgaGFyZHdhcmUgYWRkcmVzcyBvZiB0aGlzIGludGVyZmFjZSAqLworICB1OF90IGh3YWRkcltORVRJRl9NQVhfSFdBRERSX0xFTl07CisgIC8qKiBmbGFncyAoc2VlIE5FVElGX0ZMQUdfIGFib3ZlKSAqLworICB1OF90IGZsYWdzOworICAvKiogZGVzY3JpcHRpdmUgYWJicmV2aWF0aW9uICovCisgIGNoYXIgbmFtZVsyXTsKKyAgLyoqIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLworICB1OF90IG51bTsKKyNpZiBMV0lQX1NOTVAKKyAgLyoqIGxpbmsgdHlwZSAoZnJvbSAic25tcF9pZlR5cGUiIGVudW0gZnJvbSBzbm1wLmgpICovCisgIHU4X3QgbGlua190eXBlOworICAvKiogKGVzdGltYXRlKSBsaW5rIHNwZWVkICovCisgIHUzMl90IGxpbmtfc3BlZWQ7CisgIC8qKiB0aW1lc3RhbXAgYXQgbGFzdCBjaGFuZ2UgbWFkZSAodXAvZG93bikgKi8KKyAgdTMyX3QgdHM7CisgIC8qKiBjb3VudGVycyAqLworICB1MzJfdCBpZmlub2N0ZXRzOworICB1MzJfdCBpZmludWNhc3Rwa3RzOworICB1MzJfdCBpZmlubnVjYXN0cGt0czsKKyAgdTMyX3QgaWZpbmRpc2NhcmRzOworICB1MzJfdCBpZm91dG9jdGV0czsKKyAgdTMyX3QgaWZvdXR1Y2FzdHBrdHM7CisgIHUzMl90IGlmb3V0bnVjYXN0cGt0czsKKyAgdTMyX3QgaWZvdXRkaXNjYXJkczsKKyNlbmRpZiAvKiBMV0lQX1NOTVAgKi8KKyNpZiBMV0lQX0lHTVAKKyAgLyoqIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgY2FsbGVkIHRvIGFkZCBvciBkZWxldGUgYSBlbnRyeSBpbiB0aGUgbXVsdGljYXN0CisgICAgICBmaWx0ZXIgdGFibGUgb2YgdGhlIGV0aGVybmV0IE1BQy4qLworICBuZXRpZl9pZ21wX21hY19maWx0ZXJfZm4gaWdtcF9tYWNfZmlsdGVyOworI2VuZGlmIC8qIExXSVBfSUdNUCAqLworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICB1OF90ICphZGRyX2hpbnQ7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UICovCisjaWYgRU5BQkxFX0xPT1BCQUNLCisgIC8qIExpc3Qgb2YgcGFja2V0cyB0byBiZSBxdWV1ZWQgZm9yIG91cnNlbHZlcy4gKi8KKyAgc3RydWN0IHBidWYgKmxvb3BfZmlyc3Q7CisgIHN0cnVjdCBwYnVmICpsb29wX2xhc3Q7CisjaWYgTFdJUF9MT09QQkFDS19NQVhfUEJVRlMKKyAgdTE2X3QgbG9vcF9jbnRfY3VycmVudDsKKyNlbmRpZiAvKiBMV0lQX0xPT1BCQUNLX01BWF9QQlVGUyAqLworI2VuZGlmIC8qIEVOQUJMRV9MT09QQkFDSyAqLworfTsKKworI2lmIExXSVBfU05NUAorI2RlZmluZSBORVRJRl9JTklUX1NOTVAobmV0aWYsIHR5cGUsIHNwZWVkKSBcCisgIC8qIHVzZSAic25tcF9pZlR5cGUiIGVudW0gZnJvbSBzbm1wLmggZm9yICJ0eXBlIiwgc25tcF9pZlR5cGVfZXRoZXJuZXRfY3NtYWNkIGJ5IGV4YW1wbGUgKi8gXAorICAobmV0aWYpLT5saW5rX3R5cGUgPSAodHlwZSk7ICAgIFwKKyAgLyogeW91ciBsaW5rIHNwZWVkIGhlcmUgKHVuaXRzOiBiaXRzIHBlciBzZWNvbmQpICovICBcCisgIChuZXRpZiktPmxpbmtfc3BlZWQgPSAoc3BlZWQpOyAgXAorICAobmV0aWYpLT50cyA9IDA7ICAgICAgICAgICAgICBcCisgIChuZXRpZiktPmlmaW5vY3RldHMgPSAwOyAgICAgIFwKKyAgKG5ldGlmKS0+aWZpbnVjYXN0cGt0cyA9IDA7ICAgXAorICAobmV0aWYpLT5pZmlubnVjYXN0cGt0cyA9IDA7ICBcCisgIChuZXRpZiktPmlmaW5kaXNjYXJkcyA9IDA7ICAgIFwKKyAgKG5ldGlmKS0+aWZvdXRvY3RldHMgPSAwOyAgICAgXAorICAobmV0aWYpLT5pZm91dHVjYXN0cGt0cyA9IDA7ICBcCisgIChuZXRpZiktPmlmb3V0bnVjYXN0cGt0cyA9IDA7IFwKKyAgKG5ldGlmKS0+aWZvdXRkaXNjYXJkcyA9IDAKKyNlbHNlIC8qIExXSVBfU05NUCAqLworI2RlZmluZSBORVRJRl9JTklUX1NOTVAobmV0aWYsIHR5cGUsIHNwZWVkKQorI2VuZGlmIC8qIExXSVBfU05NUCAqLworCisKKy8qKiBUaGUgbGlzdCBvZiBuZXR3b3JrIGludGVyZmFjZXMuICovCitleHRlcm4gc3RydWN0IG5ldGlmICpuZXRpZl9saXN0OworLyoqIFRoZSBkZWZhdWx0IG5ldHdvcmsgaW50ZXJmYWNlLiAqLworZXh0ZXJuIHN0cnVjdCBuZXRpZiAqbmV0aWZfZGVmYXVsdDsKKwordm9pZCBuZXRpZl9pbml0KHZvaWQpOworCitzdHJ1Y3QgbmV0aWYgKm5ldGlmX2FkZChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKmlwYWRkciwgaXBfYWRkcl90ICpuZXRtYXNrLAorICAgICAgaXBfYWRkcl90ICpndywgdm9pZCAqc3RhdGUsIG5ldGlmX2luaXRfZm4gaW5pdCwgbmV0aWZfaW5wdXRfZm4gaW5wdXQpOworCit2b2lkCituZXRpZl9zZXRfYWRkcihzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKmlwYWRkciwgaXBfYWRkcl90ICpuZXRtYXNrLAorICAgICAgaXBfYWRkcl90ICpndyk7Cit2b2lkIG5ldGlmX3JlbW92ZShzdHJ1Y3QgbmV0aWYgKiBuZXRpZik7CisKKy8qIFJldHVybnMgYSBuZXR3b3JrIGludGVyZmFjZSBnaXZlbiBpdHMgbmFtZS4gVGhlIG5hbWUgaXMgb2YgdGhlIGZvcm0KKyAgICJldDAiLCB3aGVyZSB0aGUgZmlyc3QgdHdvIGxldHRlcnMgYXJlIHRoZSAibmFtZSIgZmllbGQgaW4gdGhlCisgICBuZXRpZiBzdHJ1Y3R1cmUsIGFuZCB0aGUgZGlnaXQgaXMgaW4gdGhlIG51bSBmaWVsZCBpbiB0aGUgc2FtZQorICAgc3RydWN0dXJlLiAqLworc3RydWN0IG5ldGlmICpuZXRpZl9maW5kKGNoYXIgKm5hbWUpOworCit2b2lkIG5ldGlmX3NldF9kZWZhdWx0KHN0cnVjdCBuZXRpZiAqbmV0aWYpOworCit2b2lkIG5ldGlmX3NldF9pcGFkZHIoc3RydWN0IG5ldGlmICpuZXRpZiwgaXBfYWRkcl90ICppcGFkZHIpOwordm9pZCBuZXRpZl9zZXRfbmV0bWFzayhzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKm5ldG1hc2spOwordm9pZCBuZXRpZl9zZXRfZ3coc3RydWN0IG5ldGlmICpuZXRpZiwgaXBfYWRkcl90ICpndyk7CisKK3ZvaWQgbmV0aWZfc2V0X3VwKHN0cnVjdCBuZXRpZiAqbmV0aWYpOwordm9pZCBuZXRpZl9zZXRfZG93bihzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKKy8qKiBBc2sgaWYgYW4gaW50ZXJmYWNlIGlzIHVwICovCisjZGVmaW5lIG5ldGlmX2lzX3VwKG5ldGlmKSAoKChuZXRpZiktPmZsYWdzICYgTkVUSUZfRkxBR19VUCkgPyAodThfdCkxIDogKHU4X3QpMCkKKworI2lmIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLCit2b2lkIG5ldGlmX3NldF9zdGF0dXNfY2FsbGJhY2soc3RydWN0IG5ldGlmICpuZXRpZiwgbmV0aWZfc3RhdHVzX2NhbGxiYWNrX2ZuIHN0YXR1c19jYWxsYmFjayk7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9TVEFUVVNfQ0FMTEJBQ0sgKi8KKwordm9pZCBuZXRpZl9zZXRfbGlua191cChzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKK3ZvaWQgbmV0aWZfc2V0X2xpbmtfZG93bihzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKKy8qKiBBc2sgaWYgYSBsaW5rIGlzIHVwICovIAorI2RlZmluZSBuZXRpZl9pc19saW5rX3VwKG5ldGlmKSAoKChuZXRpZiktPmZsYWdzICYgTkVUSUZfRkxBR19MSU5LX1VQKSA/ICh1OF90KTEgOiAodThfdCkwKQorCisjaWYgTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLCit2b2lkIG5ldGlmX3NldF9saW5rX2NhbGxiYWNrKHN0cnVjdCBuZXRpZiAqbmV0aWYsIG5ldGlmX3N0YXR1c19jYWxsYmFja19mbiBsaW5rX2NhbGxiYWNrKTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0xJTktfQ0FMTEJBQ0sgKi8KKworI2lmIExXSVBfTkVUSUZfSE9TVE5BTUUKKyNkZWZpbmUgbmV0aWZfc2V0X2hvc3RuYW1lKG5ldGlmLCBuYW1lKSBkbyB7IGlmKChuZXRpZikgIT0gTlVMTCkgeyAobmV0aWYpLT5ob3N0bmFtZSA9IG5hbWU7IH19d2hpbGUoMCkKKyNkZWZpbmUgbmV0aWZfZ2V0X2hvc3RuYW1lKG5ldGlmKSAoKChuZXRpZikgIT0gTlVMTCkgPyAoKG5ldGlmKS0+aG9zdG5hbWUpIDogTlVMTCkKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hPU1ROQU1FICovCisKKyNpZiBMV0lQX0lHTVAKKyNkZWZpbmUgbmV0aWZfc2V0X2lnbXBfbWFjX2ZpbHRlcihuZXRpZiwgZnVuY3Rpb24pIGRvIHsgaWYoKG5ldGlmKSAhPSBOVUxMKSB7IChuZXRpZiktPmlnbXBfbWFjX2ZpbHRlciA9IGZ1bmN0aW9uOyB9fXdoaWxlKDApCisjZGVmaW5lIG5ldGlmX2dldF9pZ21wX21hY19maWx0ZXIobmV0aWYpICgoKG5ldGlmKSAhPSBOVUxMKSA/ICgobmV0aWYpLT5pZ21wX21hY19maWx0ZXIpIDogTlVMTCkKKyNlbmRpZiAvKiBMV0lQX0lHTVAgKi8KKworI2lmIEVOQUJMRV9MT09QQkFDSworZXJyX3QgbmV0aWZfbG9vcF9vdXRwdXQoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IHBidWYgKnAsIGlwX2FkZHJfdCAqZGVzdF9pcCk7Cit2b2lkIG5ldGlmX3BvbGwoc3RydWN0IG5ldGlmICpuZXRpZik7CisjaWYgIUxXSVBfTkVUSUZfTE9PUEJBQ0tfTVVMVElUSFJFQURJTkcKK3ZvaWQgbmV0aWZfcG9sbF9hbGwodm9pZCk7CisjZW5kaWYgLyogIUxXSVBfTkVUSUZfTE9PUEJBQ0tfTVVMVElUSFJFQURJTkcgKi8KKyNlbmRpZiAvKiBFTkFCTEVfTE9PUEJBQ0sgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTFdJUF9ORVRJRl9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL25ldGlmYXBpLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9uZXRpZmFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzE4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9uZXRpZmFwaS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICovCisgCisjaWZuZGVmIF9fTFdJUF9ORVRJRkFQSV9IX18KKyNkZWZpbmUgX19MV0lQX05FVElGQVBJX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfTkVUSUZfQVBJIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9zeXMuaCIKKyNpbmNsdWRlICJsd2lwL25ldGlmLmgiCisjaW5jbHVkZSAibHdpcC9kaGNwLmgiCisjaW5jbHVkZSAibHdpcC9hdXRvaXAuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKCpuZXRpZmFwaV92b2lkX2ZuKShzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKK3R5cGVkZWYgZXJyX3QgKCpuZXRpZmFwaV9lcnJ0X2ZuKShzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKKworc3RydWN0IG5ldGlmYXBpX21zZ19tc2cgeworI2lmICFMV0lQX1RDUElQX0NPUkVfTE9DS0lORworICBzeXNfc2VtX3Qgc2VtOworI2VuZGlmIC8qICFMV0lQX1RDUElQX0NPUkVfTE9DS0lORyAqLworICBlcnJfdCBlcnI7CisgIHN0cnVjdCBuZXRpZiAqbmV0aWY7CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgaXBfYWRkcl90ICppcGFkZHI7CisgICAgICBpcF9hZGRyX3QgKm5ldG1hc2s7CisgICAgICBpcF9hZGRyX3QgKmd3OworICAgICAgdm9pZCAqc3RhdGU7CisgICAgICBuZXRpZl9pbml0X2ZuIGluaXQ7CisgICAgICBuZXRpZl9pbnB1dF9mbiBpbnB1dDsKKyAgICB9IGFkZDsKKyAgICBzdHJ1Y3QgeworICAgICAgbmV0aWZhcGlfdm9pZF9mbiB2b2lkZnVuYzsKKyAgICAgIG5ldGlmYXBpX2VycnRfZm4gZXJydGZ1bmM7CisgICAgfSBjb21tb247CisgIH0gbXNnOworfTsKKworc3RydWN0IG5ldGlmYXBpX21zZyB7CisgIHZvaWQgKCogZnVuY3Rpb24pKHN0cnVjdCBuZXRpZmFwaV9tc2dfbXNnICptc2cpOworICBzdHJ1Y3QgbmV0aWZhcGlfbXNnX21zZyBtc2c7Cit9OworCisKKy8qIEFQSSBmb3IgYXBwbGljYXRpb24gKi8KK2Vycl90IG5ldGlmYXBpX25ldGlmX2FkZCAgICAgICAoIHN0cnVjdCBuZXRpZiAqbmV0aWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcF9hZGRyX3QgKmlwYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqbmV0bWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX2luaXRfZm4gaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX2lucHV0X2ZuIGlucHV0KTsKKworZXJyX3QgbmV0aWZhcGlfbmV0aWZfc2V0X2FkZHIgICggc3RydWN0IG5ldGlmICpuZXRpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqaXBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBfYWRkcl90ICpuZXRtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBfYWRkcl90ICpndyApOworCitlcnJfdCBuZXRpZmFwaV9uZXRpZl9jb21tb24gICAgKCBzdHJ1Y3QgbmV0aWYgKm5ldGlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZhcGlfdm9pZF9mbiB2b2lkZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmYXBpX2VycnRfZm4gZXJydGZ1bmMpOworCisjZGVmaW5lIG5ldGlmYXBpX25ldGlmX3JlbW92ZShuKSAgICAgIG5ldGlmYXBpX25ldGlmX2NvbW1vbihuLCBuZXRpZl9yZW1vdmUsIE5VTEwpCisjZGVmaW5lIG5ldGlmYXBpX25ldGlmX3NldF91cChuKSAgICAgIG5ldGlmYXBpX25ldGlmX2NvbW1vbihuLCBuZXRpZl9zZXRfdXAsIE5VTEwpCisjZGVmaW5lIG5ldGlmYXBpX25ldGlmX3NldF9kb3duKG4pICAgIG5ldGlmYXBpX25ldGlmX2NvbW1vbihuLCBuZXRpZl9zZXRfZG93biwgTlVMTCkKKyNkZWZpbmUgbmV0aWZhcGlfbmV0aWZfc2V0X2RlZmF1bHQobikgbmV0aWZhcGlfbmV0aWZfY29tbW9uKG4sIG5ldGlmX3NldF9kZWZhdWx0LCBOVUxMKQorI2RlZmluZSBuZXRpZmFwaV9kaGNwX3N0YXJ0KG4pICAgICAgICBuZXRpZmFwaV9uZXRpZl9jb21tb24obiwgTlVMTCwgZGhjcF9zdGFydCkKKyNkZWZpbmUgbmV0aWZhcGlfZGhjcF9zdG9wKG4pICAgICAgICAgbmV0aWZhcGlfbmV0aWZfY29tbW9uKG4sIGRoY3Bfc3RvcCwgTlVMTCkKKyNkZWZpbmUgbmV0aWZhcGlfYXV0b2lwX3N0YXJ0KG4pICAgICAgbmV0aWZhcGlfbmV0aWZfY29tbW9uKG4sIE5VTEwsIGF1dG9pcF9zdGFydCkKKyNkZWZpbmUgbmV0aWZhcGlfYXV0b2lwX3N0b3AobikgICAgICAgbmV0aWZhcGlfbmV0aWZfY29tbW9uKG4sIE5VTEwsIGF1dG9pcF9zdG9wKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTFdJUF9ORVRJRl9BUEkgKi8KKworI2VuZGlmIC8qIF9fTFdJUF9ORVRJRkFQSV9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL29wdC5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvb3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwYWFiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL29wdC5oCkBAIC0wLDAgKzEsMjA3MSBAQAorLyoqCisgKiBAZmlsZQorICoKKyAqIGx3SVAgT3B0aW9ucyBDb25maWd1cmF0aW9uCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKyNpZm5kZWYgX19MV0lQX09QVF9IX18KKyNkZWZpbmUgX19MV0lQX09QVF9IX18KKworLyoKKyAqIEluY2x1ZGUgdXNlciBkZWZpbmVkIG9wdGlvbnMgZmlyc3QuIEFueXRoaW5nIG5vdCBkZWZpbmVkIGluIHRoZXNlIGZpbGVzCisgKiB3aWxsIGJlIHNldCB0byBzdGFuZGFyZCB2YWx1ZXMuIE92ZXJyaWRlIGFueXRoaW5nIHlvdSBkb250IGxpa2UhCisgKi8KKyNpbmNsdWRlICJsd2lwb3B0cy5oIgorI2luY2x1ZGUgImx3aXAvZGVidWcuaCIKKworLyoKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIFBsYXRmb3JtIHNwZWNpZmljIGxvY2tpbmcgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qKgorICogU1lTX0xJR0hUV0VJR0hUX1BST1Q9PTE6IGlmIHlvdSB3YW50IGludGVyLXRhc2sgcHJvdGVjdGlvbiBmb3IgY2VydGFpbgorICogY3JpdGljYWwgcmVnaW9ucyBkdXJpbmcgYnVmZmVyIGFsbG9jYXRpb24sIGRlYWxsb2NhdGlvbiBhbmQgbWVtb3J5CisgKiBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24uCisgKi8KKyNpZm5kZWYgU1lTX0xJR0hUV0VJR0hUX1BST1QKKyNkZWZpbmUgU1lTX0xJR0hUV0VJR0hUX1BST1QgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqIAorICogTk9fU1lTPT0xOiBQcm92aWRlcyBWRVJZIG1pbmltYWwgZnVuY3Rpb25hbGl0eS4gT3RoZXJ3aXNlLAorICogdXNlIGx3SVAgZmFjaWxpdGllcy4KKyAqLworI2lmbmRlZiBOT19TWVMKKyNkZWZpbmUgTk9fU1lTICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBOT19TWVNfTk9fVElNRVJTPT0xOiBEcm9wIHN1cHBvcnQgZm9yIHN5c190aW1lb3V0IHdoZW4gTk9fU1lTPT0xCisgKiBNYWlubHkgZm9yIGNvbXBhdGliaWxpdHkgdG8gb2xkIHZlcnNpb25zLgorICovCisjaWZuZGVmIE5PX1NZU19OT19USU1FUlMKKyNkZWZpbmUgTk9fU1lTX05PX1RJTUVSUyAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBNRU1DUFk6IG92ZXJyaWRlIHRoaXMgaWYgeW91IGhhdmUgYSBmYXN0ZXIgaW1wbGVtZW50YXRpb24gYXQgaGFuZCB0aGFuIHRoZQorICogb25lIGluY2x1ZGVkIGluIHlvdXIgQyBsaWJyYXJ5CisgKi8KKyNpZm5kZWYgTUVNQ1BZCisjZGVmaW5lIE1FTUNQWShkc3Qsc3JjLGxlbikgICAgICAgICAgICAgbWVtY3B5KGRzdCxzcmMsbGVuKQorI2VuZGlmCisKKy8qKgorICogU01FTUNQWTogb3ZlcnJpZGUgdGhpcyB3aXRoIGNhcmUhIFNvbWUgY29tcGlsZXJzIChlLmcuIGdjYykgY2FuIGlubGluZSBhCisgKiBjYWxsIHRvIG1lbWNweSgpIGlmIHRoZSBsZW5ndGggaXMga25vd24gYXQgY29tcGlsZSB0aW1lIGFuZCBpcyBzbWFsbC4KKyAqLworI2lmbmRlZiBTTUVNQ1BZCisjZGVmaW5lIFNNRU1DUFkoZHN0LHNyYyxsZW4pICAgICAgICAgICAgbWVtY3B5KGRzdCxzcmMsbGVuKQorI2VuZGlmCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0gTWVtb3J5IG9wdGlvbnMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBNRU1fTElCQ19NQUxMT0M9PTE6IFVzZSBtYWxsb2MvZnJlZS9yZWFsbG9jIHByb3ZpZGVkIGJ5IHlvdXIgQy1saWJyYXJ5CisgKiBpbnN0ZWFkIG9mIHRoZSBsd2lwIGludGVybmFsIGFsbG9jYXRvci4gQ2FuIHNhdmUgY29kZSBzaXplIGlmIHlvdQorICogYWxyZWFkeSB1c2UgaXQuCisgKi8KKyNpZm5kZWYgTUVNX0xJQkNfTUFMTE9DCisjZGVmaW5lIE1FTV9MSUJDX01BTExPQyAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorKiBNRU1QX01FTV9NQUxMT0M9PTE6IFVzZSBtZW1fbWFsbG9jL21lbV9mcmVlIGluc3RlYWQgb2YgdGhlIGx3aXAgcG9vbCBhbGxvY2F0b3IuCisqIEVzcGVjaWFsbHkgdXNlZnVsIHdpdGggTUVNX0xJQkNfTUFMTE9DIGJ1dCBoYW5kbGUgd2l0aCBjYXJlIHJlZ2FyZGluZyBleGVjdXRpb24KKyogc3BlZWQgYW5kIHVzYWdlIGZyb20gaW50ZXJydXB0cyEKKyovCisjaWZuZGVmIE1FTVBfTUVNX01BTExPQworI2RlZmluZSBNRU1QX01FTV9NQUxMT0MgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIE1FTV9BTElHTk1FTlQ6IHNob3VsZCBiZSBzZXQgdG8gdGhlIGFsaWdubWVudCBvZiB0aGUgQ1BVCisgKiAgICA0IGJ5dGUgYWxpZ25tZW50IC0+ICNkZWZpbmUgTUVNX0FMSUdOTUVOVCA0CisgKiAgICAyIGJ5dGUgYWxpZ25tZW50IC0+ICNkZWZpbmUgTUVNX0FMSUdOTUVOVCAyCisgKi8KKyNpZm5kZWYgTUVNX0FMSUdOTUVOVAorI2RlZmluZSBNRU1fQUxJR05NRU5UICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIE1FTV9TSVpFOiB0aGUgc2l6ZSBvZiB0aGUgaGVhcCBtZW1vcnkuIElmIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHNlbmQKKyAqIGEgbG90IG9mIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBjb3BpZWQsIHRoaXMgc2hvdWxkIGJlIHNldCBoaWdoLgorICovCisjaWZuZGVmIE1FTV9TSVpFCisjZGVmaW5lIE1FTV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMTYwMAorI2VuZGlmCisKKy8qKgorICogTUVNUF9TRVBBUkFURV9QT09MUzogaWYgZGVmaW5lZCB0byAxLCBlYWNoIHBvb2wgaXMgcGxhY2VkIGluIGl0cyBvd24gYXJyYXkuCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGluZGl2aWR1YWxseSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIGVhY2ggcG9vbC4KKyAqIERlZmF1bHQgaXMgb25lIGJpZyBhcnJheSBmb3IgYWxsIHBvb2xzCisgKi8KKyNpZm5kZWYgTUVNUF9TRVBBUkFURV9QT09MUworI2RlZmluZSBNRU1QX1NFUEFSQVRFX1BPT0xTICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfT1ZFUkZMT1dfQ0hFQ0s6IG1lbXAgb3ZlcmZsb3cgcHJvdGVjdGlvbiByZXNlcnZlcyBhIGNvbmZpZ3VyYWJsZQorICogYW1vdW50IG9mIGJ5dGVzIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBtZW1wIGVsZW1lbnQgaW4gZXZlcnkgcG9vbCBhbmQgZmlsbHMKKyAqIGl0IHdpdGggYSBwcm9taW5lbnQgZGVmYXVsdCB2YWx1ZS4KKyAqICAgIE1FTVBfT1ZFUkZMT1dfQ0hFQ0sgPT0gMCBubyBjaGVja2luZworICogICAgTUVNUF9PVkVSRkxPV19DSEVDSyA9PSAxIGNoZWNrcyBlYWNoIGVsZW1lbnQgd2hlbiBpdCBpcyBmcmVlZAorICogICAgTUVNUF9PVkVSRkxPV19DSEVDSyA+PSAyIGNoZWNrcyBlYWNoIGVsZW1lbnQgaW4gZXZlcnkgcG9vbCBldmVyeSB0aW1lCisgKiAgICAgIG1lbXBfbWFsbG9jKCkgb3IgbWVtcF9mcmVlKCkgaXMgY2FsbGVkICh1c2VmdWwgYnV0IHNsb3chKQorICovCisjaWZuZGVmIE1FTVBfT1ZFUkZMT1dfQ0hFQ0sKKyNkZWZpbmUgTUVNUF9PVkVSRkxPV19DSEVDSyAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBNRU1QX1NBTklUWV9DSEVDSz09MTogcnVuIGEgc2FuaXR5IGNoZWNrIGFmdGVyIGVhY2ggbWVtcF9mcmVlKCkgdG8gbWFrZQorICogc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBjeWNsZXMgaW4gdGhlIGxpbmtlZCBsaXN0cy4KKyAqLworI2lmbmRlZiBNRU1QX1NBTklUWV9DSEVDSworI2RlZmluZSBNRU1QX1NBTklUWV9DSEVDSyAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIE1FTV9VU0VfUE9PTFM9PTE6IFVzZSBhbiBhbHRlcm5hdGl2ZSB0byBtYWxsb2MoKSBieSBhbGxvY2F0aW5nIGZyb20gYSBzZXQKKyAqIG9mIG1lbW9yeSBwb29scyBvZiB2YXJpb3VzIHNpemVzLiBXaGVuIG1lbV9tYWxsb2MgaXMgY2FsbGVkLCBhbiBlbGVtZW50IG9mCisgKiB0aGUgc21hbGxlc3QgcG9vbCB0aGF0IGNhbiBwcm92aWRlIHRoZSBsZW5ndGggbmVlZGVkIGlzIHJldHVybmVkLgorICogVG8gdXNlIHRoaXMsIE1FTVBfVVNFX0NVU1RPTV9QT09MUyBhbHNvIGhhcyB0byBiZSBlbmFibGVkLgorICovCisjaWZuZGVmIE1FTV9VU0VfUE9PTFMKKyNkZWZpbmUgTUVNX1VTRV9QT09MUyAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBNRU1fVVNFX1BPT0xTX1RSWV9CSUdHRVJfUE9PTD09MTogaWYgb25lIG1hbGxvYy1wb29sIGlzIGVtcHR5LCB0cnkgdGhlIG5leHQKKyAqIGJpZ2dlciBwb29sIC0gV0FSTklORzogVEhJUyBNSUdIVCBXQVNURSBNRU1PUlkgYnV0IGl0IGNhbiBtYWtlIGEgc3lzdGVtIG1vcmUKKyAqIHJlbGlhYmxlLiAqLworI2lmbmRlZiBNRU1fVVNFX1BPT0xTX1RSWV9CSUdHRVJfUE9PTAorI2RlZmluZSBNRU1fVVNFX1BPT0xTX1RSWV9CSUdHRVJfUE9PTCAgIDAKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfVVNFX0NVU1RPTV9QT09MUz09MTogd2hldGhlciB0byBpbmNsdWRlIGEgdXNlciBmaWxlIGx3aXBwb29scy5oCisgKiB0aGF0IGRlZmluZXMgYWRkaXRpb25hbCBwb29scyBiZXlvbmQgdGhlICJzdGFuZGFyZCIgb25lcyByZXF1aXJlZAorICogYnkgbHdJUC4gSWYgeW91IHNldCB0aGlzIHRvIDEsIHlvdSBtdXN0IGhhdmUgbHdpcHBvb2xzLmggaW4geW91ciAKKyAqIGlubHVkZSBwYXRoIHNvbWV3aGVyZS4gCisgKi8KKyNpZm5kZWYgTUVNUF9VU0VfQ1VTVE9NX1BPT0xTCisjZGVmaW5lIE1FTVBfVVNFX0NVU1RPTV9QT09MUyAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogU2V0IHRoaXMgdG8gMSBpZiB5b3Ugd2FudCB0byBmcmVlIFBCVUZfUkFNIHBidWZzIChvciBjYWxsIG1lbV9mcmVlKCkpIGZyb20KKyAqIGludGVycnVwdCBjb250ZXh0IChvciBhbm90aGVyIGNvbnRleHQgdGhhdCBkb2Vzbid0IGFsbG93IHdhaXRpbmcgZm9yIGEKKyAqIHNlbWFwaG9yZSkuCisgKiBJZiBzZXQgdG8gMSwgbWVtX21hbGxvYyB3aWxsIGJlIHByb3RlY3RlZCBieSBhIHNlbWFwaG9yZSBhbmQgU1lTX0FSQ0hfUFJPVEVDVCwKKyAqIHdoaWxlIG1lbV9mcmVlIHdpbGwgb25seSB1c2UgU1lTX0FSQ0hfUFJPVEVDVC4gbWVtX21hbGxvYyBTWVNfQVJDSF9VTlBST1RFQ1RzCisgKiB3aXRoIGVhY2ggbG9vcCBzbyB0aGF0IG1lbV9mcmVlIGNhbiBydW4uCisgKgorICogQVRURU5USU9OOiBBcyB5b3UgY2FuIHNlZSBmcm9tIHRoZSBhYm92ZSBkZXNjcmlwdGlvbiwgdGhpcyBsZWFkcyB0byBkaXMtLworICogZW5hYmxpbmcgaW50ZXJydXB0cyBvZnRlbiwgd2hpY2ggY2FuIGJlIHNsb3chIEFsc28sIG9uIGxvdyBtZW1vcnksIG1lbV9tYWxsb2MKKyAqIGNhbiBuZWVkIGxvbmdlci4KKyAqCisgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0aGF0LCBhdCBsZWFzdCBmb3IgTk9fU1lTPTAsIHlvdSBjYW4gc3RpbGwgdXNlIHRoZSBmb2xsb3dpbmcKKyAqIGZ1bmN0aW9ucyB0byBlbnF1ZXVlIGEgZGVhbGxvY2F0aW9uIGNhbGwgd2hpY2ggdGhlbiBydW5zIGluIHRoZSB0Y3BpcF90aHJlYWQKKyAqIGNvbnRleHQ6CisgKiAtIHBidWZfZnJlZV9jYWxsYmFjayhwKTsKKyAqIC0gbWVtX2ZyZWVfY2FsbGJhY2sobSk7CisgKi8KKyNpZm5kZWYgTFdJUF9BTExPV19NRU1fRlJFRV9GUk9NX09USEVSX0NPTlRFWFQKKyNkZWZpbmUgTFdJUF9BTExPV19NRU1fRlJFRV9GUk9NX09USEVSX0NPTlRFWFQgMAorI2VuZGlmCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0gSW50ZXJuYWwgTWVtb3J5IFBvb2wgU2l6ZXMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBNRU1QX05VTV9QQlVGOiB0aGUgbnVtYmVyIG9mIG1lbXAgc3RydWN0IHBidWZzICh1c2VkIGZvciBQQlVGX1JPTSBhbmQgUEJVRl9SRUYpLgorICogSWYgdGhlIGFwcGxpY2F0aW9uIHNlbmRzIGEgbG90IG9mIGRhdGEgb3V0IG9mIFJPTSAob3Igb3RoZXIgc3RhdGljIG1lbW9yeSksCisgKiB0aGlzIHNob3VsZCBiZSBzZXQgaGlnaC4KKyAqLworI2lmbmRlZiBNRU1QX05VTV9QQlVGCisjZGVmaW5lIE1FTVBfTlVNX1BCVUYgICAgICAgICAgICAgICAgICAgMTYKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfTlVNX1JBV19QQ0I6IE51bWJlciBvZiByYXcgY29ubmVjdGlvbiBQQ0JzCisgKiAocmVxdWlyZXMgdGhlIExXSVBfUkFXIG9wdGlvbikKKyAqLworI2lmbmRlZiBNRU1QX05VTV9SQVdfUENCCisjZGVmaW5lIE1FTVBfTlVNX1JBV19QQ0IgICAgICAgICAgICAgICAgNAorI2VuZGlmCisKKy8qKgorICogTUVNUF9OVU1fVURQX1BDQjogdGhlIG51bWJlciBvZiBVRFAgcHJvdG9jb2wgY29udHJvbCBibG9ja3MuIE9uZQorICogcGVyIGFjdGl2ZSBVRFAgImNvbm5lY3Rpb24iLgorICogKHJlcXVpcmVzIHRoZSBMV0lQX1VEUCBvcHRpb24pCisgKi8KKyNpZm5kZWYgTUVNUF9OVU1fVURQX1BDQgorI2RlZmluZSBNRU1QX05VTV9VRFBfUENCICAgICAgICAgICAgICAgIDQKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfTlVNX1RDUF9QQ0I6IHRoZSBudW1iZXIgb2Ygc2ltdWxhdGVub3VzbHkgYWN0aXZlIFRDUCBjb25uZWN0aW9ucy4KKyAqIChyZXF1aXJlcyB0aGUgTFdJUF9UQ1Agb3B0aW9uKQorICovCisjaWZuZGVmIE1FTVBfTlVNX1RDUF9QQ0IKKyNkZWZpbmUgTUVNUF9OVU1fVENQX1BDQiAgICAgICAgICAgICAgICA1CisjZW5kaWYKKworLyoqCisgKiBNRU1QX05VTV9UQ1BfUENCX0xJU1RFTjogdGhlIG51bWJlciBvZiBsaXN0ZW5pbmcgVENQIGNvbm5lY3Rpb25zLgorICogKHJlcXVpcmVzIHRoZSBMV0lQX1RDUCBvcHRpb24pCisgKi8KKyNpZm5kZWYgTUVNUF9OVU1fVENQX1BDQl9MSVNURU4KKyNkZWZpbmUgTUVNUF9OVU1fVENQX1BDQl9MSVNURU4gICAgICAgICA4CisjZW5kaWYKKworLyoqCisgKiBNRU1QX05VTV9UQ1BfU0VHOiB0aGUgbnVtYmVyIG9mIHNpbXVsdGFuZW91c2x5IHF1ZXVlZCBUQ1Agc2VnbWVudHMuCisgKiAocmVxdWlyZXMgdGhlIExXSVBfVENQIG9wdGlvbikKKyAqLworI2lmbmRlZiBNRU1QX05VTV9UQ1BfU0VHCisjZGVmaW5lIE1FTVBfTlVNX1RDUF9TRUcgICAgICAgICAgICAgICAgMTYKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfTlVNX1JFQVNTREFUQTogdGhlIG51bWJlciBvZiBJUCBwYWNrZXRzIHNpbXVsdGFuZW91c2x5IHF1ZXVlZCBmb3IKKyAqIHJlYXNzZW1ibHkgKHdob2xlIHBhY2tldHMsIG5vdCBmcmFnbWVudHMhKQorICovCisjaWZuZGVmIE1FTVBfTlVNX1JFQVNTREFUQQorI2RlZmluZSBNRU1QX05VTV9SRUFTU0RBVEEgICAgICAgICAgICAgIDUKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfTlVNX0ZSQUdfUEJVRjogdGhlIG51bWJlciBvZiBJUCBmcmFnbWVudHMgc2ltdWx0YW5lb3VzbHkgc2VudAorICogKGZyYWdtZW50cywgbm90IHdob2xlIHBhY2tldHMhKS4KKyAqIFRoaXMgaXMgb25seSB1c2VkIHdpdGggSVBfRlJBR19VU0VTX1NUQVRJQ19CVUY9PTAgYW5kCisgKiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGPT0wIGFuZCBvbmx5IGhhcyB0byBiZSA+IDEgd2l0aCBETUEtZW5hYmxlZCBNQUNzCisgKiB3aGVyZSB0aGUgcGFja2V0IGlzIG5vdCB5ZXQgc2VudCB3aGVuIG5ldGlmLT5vdXRwdXQgcmV0dXJucy4KKyAqLworI2lmbmRlZiBNRU1QX05VTV9GUkFHX1BCVUYKKyNkZWZpbmUgTUVNUF9OVU1fRlJBR19QQlVGICAgICAgICAgICAgICAxNQorI2VuZGlmCisKKy8qKgorICogTUVNUF9OVU1fQVJQX1FVRVVFOiB0aGUgbnVtYmVyIG9mIHNpbXVsYXRlb3VzbHkgcXVldWVkIG91dGdvaW5nCisgKiBwYWNrZXRzIChwYnVmcykgdGhhdCBhcmUgd2FpdGluZyBmb3IgYW4gQVJQIHJlcXVlc3QgKHRvIHJlc29sdmUKKyAqIHRoZWlyIGRlc3RpbmF0aW9uIGFkZHJlc3MpIHRvIGZpbmlzaC4KKyAqIChyZXF1aXJlcyB0aGUgQVJQX1FVRVVFSU5HIG9wdGlvbikKKyAqLworI2lmbmRlZiBNRU1QX05VTV9BUlBfUVVFVUUKKyNkZWZpbmUgTUVNUF9OVU1fQVJQX1FVRVVFICAgICAgICAgICAgICAzMAorI2VuZGlmCisKKy8qKgorICogTUVNUF9OVU1fSUdNUF9HUk9VUDogVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZ3JvdXBzIHdob3NlIG5ldHdvcmsgaW50ZXJmYWNlcworICogY2FuIGJlIG1lbWJlcnMgZXQgdGhlIHNhbWUgdGltZSAob25lIHBlciBuZXRpZiAtIGFsbHN5c3RlbXMgZ3JvdXAgLSwgcGx1cyBvbmUKKyAqIHBlciBuZXRpZiBtZW1iZXJzaGlwKS4KKyAqIChyZXF1aXJlcyB0aGUgTFdJUF9JR01QIG9wdGlvbikKKyAqLworI2lmbmRlZiBNRU1QX05VTV9JR01QX0dST1VQCisjZGVmaW5lIE1FTVBfTlVNX0lHTVBfR1JPVVAgICAgICAgICAgICAgOAorI2VuZGlmCisKKy8qKgorICogTUVNUF9OVU1fU1lTX1RJTUVPVVQ6IHRoZSBudW1iZXIgb2Ygc2ltdWxhdGVvdXNseSBhY3RpdmUgdGltZW91dHMuCisgKiAocmVxdWlyZXMgTk9fU1lTPT0wKQorICovCisjaWZuZGVmIE1FTVBfTlVNX1NZU19USU1FT1VUCisjZGVmaW5lIE1FTVBfTlVNX1NZU19USU1FT1VUICAgICAgICAgICAgMworI2VuZGlmCisKKy8qKgorICogTUVNUF9OVU1fTkVUQlVGOiB0aGUgbnVtYmVyIG9mIHN0cnVjdCBuZXRidWZzLgorICogKG9ubHkgbmVlZGVkIGlmIHlvdSB1c2UgdGhlIHNlcXVlbnRpYWwgQVBJLCBsaWtlIGFwaV9saWIuYykKKyAqLworI2lmbmRlZiBNRU1QX05VTV9ORVRCVUYKKyNkZWZpbmUgTUVNUF9OVU1fTkVUQlVGICAgICAgICAgICAgICAgICAyCisjZW5kaWYKKworLyoqCisgKiBNRU1QX05VTV9ORVRDT05OOiB0aGUgbnVtYmVyIG9mIHN0cnVjdCBuZXRjb25ucy4KKyAqIChvbmx5IG5lZWRlZCBpZiB5b3UgdXNlIHRoZSBzZXF1ZW50aWFsIEFQSSwgbGlrZSBhcGlfbGliLmMpCisgKi8KKyNpZm5kZWYgTUVNUF9OVU1fTkVUQ09OTgorI2RlZmluZSBNRU1QX05VTV9ORVRDT05OICAgICAgICAgICAgICAgIDQKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfTlVNX1RDUElQX01TR19BUEk6IHRoZSBudW1iZXIgb2Ygc3RydWN0IHRjcGlwX21zZywgd2hpY2ggYXJlIHVzZWQKKyAqIGZvciBjYWxsYmFjay90aW1lb3V0IEFQSSBjb21tdW5pY2F0aW9uLiAKKyAqIChvbmx5IG5lZWRlZCBpZiB5b3UgdXNlIHRjcGlwLmMpCisgKi8KKyNpZm5kZWYgTUVNUF9OVU1fVENQSVBfTVNHX0FQSQorI2RlZmluZSBNRU1QX05VTV9UQ1BJUF9NU0dfQVBJICAgICAgICAgIDgKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfTlVNX1RDUElQX01TR19JTlBLVDogdGhlIG51bWJlciBvZiBzdHJ1Y3QgdGNwaXBfbXNnLCB3aGljaCBhcmUgdXNlZAorICogZm9yIGluY29taW5nIHBhY2tldHMuIAorICogKG9ubHkgbmVlZGVkIGlmIHlvdSB1c2UgdGNwaXAuYykKKyAqLworI2lmbmRlZiBNRU1QX05VTV9UQ1BJUF9NU0dfSU5QS1QKKyNkZWZpbmUgTUVNUF9OVU1fVENQSVBfTVNHX0lOUEtUICAgICAgICA4CisjZW5kaWYKKworLyoqCisgKiBNRU1QX05VTV9TTk1QX05PREU6IHRoZSBudW1iZXIgb2YgbGVhZnMgaW4gdGhlIFNOTVAgdHJlZS4KKyAqLworI2lmbmRlZiBNRU1QX05VTV9TTk1QX05PREUKKyNkZWZpbmUgTUVNUF9OVU1fU05NUF9OT0RFICAgICAgICAgICAgICA1MAorI2VuZGlmCisKKy8qKgorICogTUVNUF9OVU1fU05NUF9ST09UTk9ERTogdGhlIG51bWJlciBvZiBicmFuY2hlcyBpbiB0aGUgU05NUCB0cmVlLgorICogRXZlcnkgYnJhbmNoIGhhcyBvbmUgbGVhZiAoTUVNUF9OVU1fU05NUF9OT0RFKSBhdCBsZWFzdCEKKyAqLworI2lmbmRlZiBNRU1QX05VTV9TTk1QX1JPT1ROT0RFCisjZGVmaW5lIE1FTVBfTlVNX1NOTVBfUk9PVE5PREUgICAgICAgICAgMzAKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfTlVNX1NOTVBfVkFSQklORDogdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHJlcXVlc3RzIChkb2VzIG5vdCBoYXZlIHRvCisgKiBiZSBjaGFuZ2VkIG5vcm1hbGx5KSAtIDIgb2YgdGhlc2UgYXJlIHVzZWQgcGVyIHJlcXVlc3QgKDEgZm9yIGlucHV0LAorICogMSBmb3Igb3V0cHV0KQorICovCisjaWZuZGVmIE1FTVBfTlVNX1NOTVBfVkFSQklORAorI2RlZmluZSBNRU1QX05VTV9TTk1QX1ZBUkJJTkQgICAgICAgICAgIDIKKyNlbmRpZgorCisvKioKKyAqIE1FTVBfTlVNX1NOTVBfVkFMVUU6IHRoZSBudW1iZXIgb2YgT0lEIG9yIHZhbHVlcyBjb25jdXJyZW50bHkgdXNlZAorICogKGRvZXMgbm90IGhhdmUgdG8gYmUgY2hhbmdlZCBub3JtYWxseSkgLSAzIG9mIHRoZXNlIGFyZSB1c2VkIHBlciByZXF1ZXN0CisgKiAoMSBmb3IgdGhlIHZhbHVlIHJlYWQgYW5kIDIgZm9yIE9JRHMgLSBpbnB1dCBhbmQgb3V0cHV0KQorICovCisjaWZuZGVmIE1FTVBfTlVNX1NOTVBfVkFMVUUKKyNkZWZpbmUgTUVNUF9OVU1fU05NUF9WQUxVRSAgICAgICAgICAgICAzCisjZW5kaWYKKworLyoqCisgKiBNRU1QX05VTV9ORVREQjogdGhlIG51bWJlciBvZiBjb25jdXJyZW50bHkgcnVubmluZyBsd2lwX2FkZHJpbmZvKCkgY2FsbHMKKyAqIChiZWZvcmUgZnJlZWluZyB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgdXNpbmcgbHdpcF9mcmVlYWRkcmluZm8oKSkuCisgKi8KKyNpZm5kZWYgTUVNUF9OVU1fTkVUREIKKyNkZWZpbmUgTUVNUF9OVU1fTkVUREIgICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKworLyoqCisgKiBNRU1QX05VTV9MT0NBTEhPU1RMSVNUOiB0aGUgbnVtYmVyIG9mIGhvc3QgZW50cmllcyBpbiB0aGUgbG9jYWwgaG9zdCBsaXN0CisgKiBpZiBETlNfTE9DQUxfSE9TVExJU1RfSVNfRFlOQU1JQz09MS4KKyAqLworI2lmbmRlZiBNRU1QX05VTV9MT0NBTEhPU1RMSVNUCisjZGVmaW5lIE1FTVBfTlVNX0xPQ0FMSE9TVExJU1QgICAgICAgICAgMQorI2VuZGlmCisKKy8qKgorICogTUVNUF9OVU1fUFBQT0VfSU5URVJGQUNFUzogdGhlIG51bWJlciBvZiBjb25jdXJyZW50bHkgYWN0aXZlIFBQUG9FCisgKiBpbnRlcmZhY2VzIChvbmx5IHVzZWQgd2l0aCBQUFBPRV9TVVBQT1JUPT0xKQorICovCisjaWZuZGVmIE1FTVBfTlVNX1BQUE9FX0lOVEVSRkFDRVMKKyNkZWZpbmUgTUVNUF9OVU1fUFBQT0VfSU5URVJGQUNFUyAgICAgICAxCisjZW5kaWYKKworLyoqCisgKiBQQlVGX1BPT0xfU0laRTogdGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwYnVmIHBvb2wuIAorICovCisjaWZuZGVmIFBCVUZfUE9PTF9TSVpFCisjZGVmaW5lIFBCVUZfUE9PTF9TSVpFICAgICAgICAgICAgICAgICAgMTYKKyNlbmRpZgorCisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIEFSUCBvcHRpb25zIC0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qKgorICogTFdJUF9BUlA9PTE6IEVuYWJsZSBBUlAgZnVuY3Rpb25hbGl0eS4KKyAqLworI2lmbmRlZiBMV0lQX0FSUAorI2RlZmluZSBMV0lQX0FSUCAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIEFSUF9UQUJMRV9TSVpFOiBOdW1iZXIgb2YgYWN0aXZlIE1BQy1JUCBhZGRyZXNzIHBhaXJzIGNhY2hlZC4KKyAqLworI2lmbmRlZiBBUlBfVEFCTEVfU0laRQorI2RlZmluZSBBUlBfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgIDEwCisjZW5kaWYKKworLyoqCisgKiBBUlBfUVVFVUVJTkc9PTE6IE11bHRpcGxlIG91dGdvaW5nIHBhY2tldHMgYXJlIHF1ZXVlZCBkdXJpbmcgaGFyZHdhcmUgYWRkcmVzcworICogcmVzb2x1dGlvbi4gQnkgZGVmYXVsdCwgb25seSB0aGUgbW9zdCByZWNlbnQgcGFja2V0IGlzIHF1ZXVlZCBwZXIgSVAgYWRkcmVzcy4KKyAqIFRoaXMgaXMgc3VmZmljaWVudCBmb3IgbW9zdCBwcm90b2NvbHMgYW5kIG1haW5seSByZWR1Y2VzIFRDUCBjb25uZWN0aW9uCisgKiBzdGFydHVwIHRpbWUuIFNldCB0aGlzIHRvIDEgaWYgeW91IGtub3cgeW91ciBhcHBsaWNhdGlvbiBzZW5kcyBtb3JlIHRoYW4gb25lCisgKiBwYWNrZXQgaW4gYSByb3cgdG8gYW4gSVAgYWRkcmVzcyB0aGF0IGlzIG5vdCBpbiB0aGUgQVJQIGNhY2hlLgorICovCisjaWZuZGVmIEFSUF9RVUVVRUlORworI2RlZmluZSBBUlBfUVVFVUVJTkcgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIEVUSEFSUF9UUlVTVF9JUF9NQUM9PTE6IEluY29taW5nIElQIHBhY2tldHMgY2F1c2UgdGhlIEFSUCB0YWJsZSB0byBiZQorICogdXBkYXRlZCB3aXRoIHRoZSBzb3VyY2UgTUFDIGFuZCBJUCBhZGRyZXNzZXMgc3VwcGxpZWQgaW4gdGhlIHBhY2tldC4KKyAqIFlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoaXMgaWYgeW91IGRvIG5vdCB0cnVzdCBMQU4gcGVlcnMgdG8gaGF2ZSB0aGUKKyAqIGNvcnJlY3QgYWRkcmVzc2VzLCBvciBhcyBhIGxpbWl0ZWQgYXBwcm9hY2ggdG8gYXR0ZW1wdCB0byBoYW5kbGUKKyAqIHNwb29maW5nLiBJZiBkaXNhYmxlZCwgbHdJUCB3aWxsIG5lZWQgdG8gbWFrZSBhIG5ldyBBUlAgcmVxdWVzdCBpZgorICogdGhlIHBlZXIgaXMgbm90IGFscmVhZHkgaW4gdGhlIEFSUCB0YWJsZSwgYWRkaW5nIGEgbGl0dGxlIGxhdGVuY3kuCisgKiBUaGUgcGVlciAqaXMqIGluIHRoZSBBUlAgdGFibGUgaWYgaXQgcmVxdWVzdGVkIG91ciBhZGRyZXNzIGJlZm9yZS4KKyAqIEFsc28gbm90aWNlIHRoYXQgdGhpcyBzbG93cyBkb3duIGlucHV0IHByb2Nlc3Npbmcgb2YgZXZlcnkgSVAgcGFja2V0IQorICovCisjaWZuZGVmIEVUSEFSUF9UUlVTVF9JUF9NQUMKKyNkZWZpbmUgRVRIQVJQX1RSVVNUX0lQX01BQyAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBFVEhBUlBfU1VQUE9SVF9WTEFOPT0xOiBzdXBwb3J0IHJlY2VpdmluZyBldGhlcm5ldCBwYWNrZXRzIHdpdGggVkxBTiBoZWFkZXIuCisgKiBBZGRpdGlvbmFsbHksIHlvdSBjYW4gZGVmaW5lIEVUSEFSUF9WTEFOX0NIRUNLIHRvIGFuIHUxNl90IFZMQU4gSUQgdG8gY2hlY2suCisgKiBJZiBFVEhBUlBfVkxBTl9DSEVDSyBpcyBkZWZpbmVkLCBvbmx5IFZMQU4tdHJhZmZpYyBmb3IgdGhpcyBWTEFOIGlzIGFjY2VwdGVkLgorICogSWYgRVRIQVJQX1ZMQU5fQ0hFQ0sgaXMgbm90IGRlZmluZWQsIGFsbCB0cmFmZmljIGlzIGFjY2VwdGVkLgorICovCisjaWZuZGVmIEVUSEFSUF9TVVBQT1JUX1ZMQU4KKyNkZWZpbmUgRVRIQVJQX1NVUFBPUlRfVkxBTiAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqIExXSVBfRVRIRVJORVQ9PTE6IGVuYWJsZSBldGhlcm5ldCBzdXBwb3J0IGZvciBQUFBvRSBldmVuIHRob3VnaCBBUlAKKyAqIG1pZ2h0IGJlIGRpc2FibGVkCisgKi8KKyNpZm5kZWYgTFdJUF9FVEhFUk5FVAorI2RlZmluZSBMV0lQX0VUSEVSTkVUICAgICAgICAgICAgICAgICAgIChMV0lQX0FSUCB8fCBQUFBPRV9TVVBQT1JUKQorI2VuZGlmCisKKy8qKiBFVEhfUEFEX1NJWkU6IG51bWJlciBvZiBieXRlcyBhZGRlZCBiZWZvcmUgdGhlIGV0aGVybmV0IGhlYWRlciB0byBlbnN1cmUKKyAqIGFsaWdubWVudCBvZiBwYXlsb2FkIGFmdGVyIHRoYXQgaGVhZGVyLiBTaW5jZSB0aGUgaGVhZGVyIGlzIDE0IGJ5dGVzIGxvbmcsCisgKiB3aXRob3V0IHRoaXMgcGFkZGluZyBlLmcuIGFkZHJlc3NlcyBpbiB0aGUgSVAgaGVhZGVyIHdpbGwgbm90IGJlIGFsaWduZWQKKyAqIG9uIGEgMzItYml0IGJvdW5kYXJ5LCBzbyBzZXR0aW5nIHRoaXMgdG8gMiBjYW4gc3BlZWQgdXAgMzItYml0LXBsYXRmb3Jtcy4KKyAqLworI2lmbmRlZiBFVEhfUEFEX1NJWkUKKyNkZWZpbmUgRVRIX1BBRF9TSVpFICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqIEVUSEFSUF9TVVBQT1JUX1NUQVRJQ19FTlRSSUVTPT0xOiBlbmFibGUgY29kZSB0byBzdXBwb3J0IHN0YXRpYyBBUlAgdGFibGUKKyAqIGVudHJpZXMgKHVzaW5nIGV0aGFycF9hZGRfc3RhdGljX2VudHJ5L2V0aGFycF9yZW1vdmVfc3RhdGljX2VudHJ5KS4KKyAqLworI2lmbmRlZiBFVEhBUlBfU1VQUE9SVF9TVEFUSUNfRU5UUklFUworI2RlZmluZSBFVEhBUlBfU1VQUE9SVF9TVEFUSUNfRU5UUklFUyAgIDAKKyNlbmRpZgorCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLSBJUCBvcHRpb25zIC0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBJUF9GT1JXQVJEPT0xOiBFbmFibGVzIHRoZSBhYmlsaXR5IHRvIGZvcndhcmQgSVAgcGFja2V0cyBhY3Jvc3MgbmV0d29yaworICogaW50ZXJmYWNlcy4gSWYgeW91IGFyZSBnb2luZyB0byBydW4gbHdJUCBvbiBhIGRldmljZSB3aXRoIG9ubHkgb25lIG5ldHdvcmsKKyAqIGludGVyZmFjZSwgZGVmaW5lIHRoaXMgdG8gMC4KKyAqLworI2lmbmRlZiBJUF9GT1JXQVJECisjZGVmaW5lIElQX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogSVBfT1BUSU9OU19BTExPV0VEOiBEZWZpbmVzIHRoZSBiZWhhdmlvciBmb3IgSVAgb3B0aW9ucy4KKyAqICAgICAgSVBfT1BUSU9OU19BTExPV0VEPT0wOiBBbGwgcGFja2V0cyB3aXRoIElQIG9wdGlvbnMgYXJlIGRyb3BwZWQuCisgKiAgICAgIElQX09QVElPTlNfQUxMT1dFRD09MTogSVAgb3B0aW9ucyBhcmUgYWxsb3dlZCAoYnV0IG5vdCBwYXJzZWQpLgorICovCisjaWZuZGVmIElQX09QVElPTlNfQUxMT1dFRAorI2RlZmluZSBJUF9PUFRJT05TX0FMTE9XRUQgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIElQX1JFQVNTRU1CTFk9PTE6IFJlYXNzZW1ibGUgaW5jb21pbmcgZnJhZ21lbnRlZCBJUCBwYWNrZXRzLiBOb3RlIHRoYXQKKyAqIHRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCBvdXRnb2luZyBwYWNrZXQgc2l6ZXMsIHdoaWNoIGNhbiBiZSBjb250cm9sbGVkCisgKiB2aWEgSVBfRlJBRy4KKyAqLworI2lmbmRlZiBJUF9SRUFTU0VNQkxZCisjZGVmaW5lIElQX1JFQVNTRU1CTFkgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qKgorICogSVBfRlJBRz09MTogRnJhZ21lbnQgb3V0Z29pbmcgSVAgcGFja2V0cyBpZiB0aGVpciBzaXplIGV4Y2VlZHMgTVRVLiBOb3RlCisgKiB0aGF0IHRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCBpbmNvbWluZyBwYWNrZXQgc2l6ZXMsIHdoaWNoIGNhbiBiZQorICogY29udHJvbGxlZCB2aWEgSVBfUkVBU1NFTUJMWS4KKyAqLworI2lmbmRlZiBJUF9GUkFHCisjZGVmaW5lIElQX0ZSQUcgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qKgorICogSVBfUkVBU1NfTUFYQUdFOiBNYXhpbXVtIHRpbWUgKGluIG11bHRpcGxlcyBvZiBJUF9UTVJfSU5URVJWQUwgLSBzbyBzZWNvbmRzLCBub3JtYWxseSkKKyAqIGEgZnJhZ21lbnRlZCBJUCBwYWNrZXQgd2FpdHMgZm9yIGFsbCBmcmFnbWVudHMgdG8gYXJyaXZlLiBJZiBub3QgYWxsIGZyYWdtZW50cyBhcnJpdmVkCisgKiBpbiB0aGlzIHRpbWUsIHRoZSB3aG9sZSBwYWNrZXQgaXMgZGlzY2FyZGVkLgorICovCisjaWZuZGVmIElQX1JFQVNTX01BWEFHRQorI2RlZmluZSBJUF9SRUFTU19NQVhBR0UgICAgICAgICAgICAgICAgIDMKKyNlbmRpZgorCisvKioKKyAqIElQX1JFQVNTX01BWF9QQlVGUzogVG90YWwgbWF4aW11bSBhbW91bnQgb2YgcGJ1ZnMgd2FpdGluZyB0byBiZSByZWFzc2VtYmxlZC4KKyAqIFNpbmNlIHRoZSByZWNlaXZlZCBwYnVmcyBhcmUgZW5xdWV1ZWQsIGJlIHN1cmUgdG8gY29uZmlndXJlCisgKiBQQlVGX1BPT0xfU0laRSA+IElQX1JFQVNTX01BWF9QQlVGUyBzbyB0aGF0IHRoZSBzdGFjayBpcyBzdGlsbCBhYmxlIHRvIHJlY2VpdmUKKyAqIHBhY2tldHMgZXZlbiBpZiB0aGUgbWF4aW11bSBhbW91bnQgb2YgZnJhZ21lbnRzIGlzIGVucXVldWVkIGZvciByZWFzc2VtYmx5IQorICovCisjaWZuZGVmIElQX1JFQVNTX01BWF9QQlVGUworI2RlZmluZSBJUF9SRUFTU19NQVhfUEJVRlMgICAgICAgICAgICAgIDEwCisjZW5kaWYKKworLyoqCisgKiBJUF9GUkFHX1VTRVNfU1RBVElDX0JVRj09MTogVXNlIGEgc3RhdGljIE1UVS1zaXplZCBidWZmZXIgZm9yIElQCisgKiBmcmFnbWVudGF0aW9uLiBPdGhlcndpc2UgcGJ1ZnMgYXJlIGFsbG9jYXRlZCBhbmQgcmVmZXJlbmNlIHRoZSBvcmlnaW5hbAorICogcGFja2V0IGRhdGEgdG8gYmUgZnJhZ21lbnRlZCAob3Igd2l0aCBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGPT0xLAorICogbmV3IFBCVUZfUkFNIHBidWZzIGFyZSB1c2VkIGZvciBmcmFnbWVudHMpLgorICogQVRURU5USU9OOiBJUF9GUkFHX1VTRVNfU1RBVElDX0JVRj09MSBtYXkgbm90IGJlIHVzZWQgZm9yIERNQS1lbmFibGVkIE1BQ3MhCisgKi8KKyNpZm5kZWYgSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYKKyNkZWZpbmUgSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBJUF9GUkFHX01BWF9NVFU6IEFzc3VtZWQgbWF4IE1UVSBvbiBhbnkgaW50ZXJmYWNlIGZvciBJUCBmcmFnIGJ1ZmZlcgorICogKHJlcXVpcmVzIElQX0ZSQUdfVVNFU19TVEFUSUNfQlVGPT0xKQorICovCisjaWYgSVBfRlJBR19VU0VTX1NUQVRJQ19CVUYgJiYgIWRlZmluZWQoSVBfRlJBR19NQVhfTVRVKQorI2RlZmluZSBJUF9GUkFHX01BWF9NVFUgICAgICAgICAgICAgICAgIDE1MDAKKyNlbmRpZgorCisvKioKKyAqIElQX0RFRkFVTFRfVFRMOiBEZWZhdWx0IHZhbHVlIGZvciBUaW1lLVRvLUxpdmUgdXNlZCBieSB0cmFuc3BvcnQgbGF5ZXJzLgorICovCisjaWZuZGVmIElQX0RFRkFVTFRfVFRMCisjZGVmaW5lIElQX0RFRkFVTFRfVFRMICAgICAgICAgICAgICAgICAgMjU1CisjZW5kaWYKKworLyoqCisgKiBJUF9TT0ZfQlJPQURDQVNUPTE6IFVzZSB0aGUgU09GX0JST0FEQ0FTVCBmaWVsZCB0byBlbmFibGUgYnJvYWRjYXN0CisgKiBmaWx0ZXIgcGVyIHBjYiBvbiB1ZHAgYW5kIHJhdyBzZW5kIG9wZXJhdGlvbnMuIFRvIGVuYWJsZSBicm9hZGNhc3QgZmlsdGVyCisgKiBvbiByZWN2IG9wZXJhdGlvbnMsIHlvdSBhbHNvIGhhdmUgdG8gc2V0IElQX1NPRl9CUk9BRENBU1RfUkVDVj0xLgorICovCisjaWZuZGVmIElQX1NPRl9CUk9BRENBU1QKKyNkZWZpbmUgSVBfU09GX0JST0FEQ0FTVCAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBJUF9TT0ZfQlJPQURDQVNUX1JFQ1YgKHJlcXVpcmVzIElQX1NPRl9CUk9BRENBU1Q9MSkgZW5hYmxlIHRoZSBicm9hZGNhc3QKKyAqIGZpbHRlciBvbiByZWN2IG9wZXJhdGlvbnMuCisgKi8KKyNpZm5kZWYgSVBfU09GX0JST0FEQ0FTVF9SRUNWCisjZGVmaW5lIElQX1NPRl9CUk9BRENBU1RfUkVDViAgICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIElDTVAgb3B0aW9ucyAtLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBMV0lQX0lDTVA9PTE6IEVuYWJsZSBJQ01QIG1vZHVsZSBpbnNpZGUgdGhlIElQIHN0YWNrLgorICogQmUgY2FyZWZ1bCwgZGlzYWJsZSB0aGF0IG1ha2UgeW91ciBwcm9kdWN0IG5vbi1jb21wbGlhbnQgdG8gUkZDMTEyMgorICovCisjaWZuZGVmIExXSVBfSUNNUAorI2RlZmluZSBMV0lQX0lDTVAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIElDTVBfVFRMOiBEZWZhdWx0IHZhbHVlIGZvciBUaW1lLVRvLUxpdmUgdXNlZCBieSBJQ01QIHBhY2tldHMuCisgKi8KKyNpZm5kZWYgSUNNUF9UVEwKKyNkZWZpbmUgSUNNUF9UVEwgICAgICAgICAgICAgICAgICAgICAgIChJUF9ERUZBVUxUX1RUTCkKKyNlbmRpZgorCisvKioKKyAqIExXSVBfQlJPQURDQVNUX1BJTkc9PTE6IHJlc3BvbmQgdG8gYnJvYWRjYXN0IHBpbmdzIChkZWZhdWx0IGlzIHVuaWNhc3Qgb25seSkKKyAqLworI2lmbmRlZiBMV0lQX0JST0FEQ0FTVF9QSU5HCisjZGVmaW5lIExXSVBfQlJPQURDQVNUX1BJTkcgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogTFdJUF9NVUxUSUNBU1RfUElORz09MTogcmVzcG9uZCB0byBtdWx0aWNhc3QgcGluZ3MgKGRlZmF1bHQgaXMgdW5pY2FzdCBvbmx5KQorICovCisjaWZuZGVmIExXSVBfTVVMVElDQVNUX1BJTkcKKyNkZWZpbmUgTFdJUF9NVUxUSUNBU1RfUElORyAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLSBSQVcgb3B0aW9ucyAtLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisvKioKKyAqIExXSVBfUkFXPT0xOiBFbmFibGUgYXBwbGljYXRpb24gbGF5ZXIgdG8gaG9vayBpbnRvIHRoZSBJUCBsYXllciBpdHNlbGYuCisgKi8KKyNpZm5kZWYgTFdJUF9SQVcKKyNkZWZpbmUgTFdJUF9SQVcgICAgICAgICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKworLyoqCisgKiBMV0lQX1JBVz09MTogRW5hYmxlIGFwcGxpY2F0aW9uIGxheWVyIHRvIGhvb2sgaW50byB0aGUgSVAgbGF5ZXIgaXRzZWxmLgorICovCisjaWZuZGVmIFJBV19UVEwKKyNkZWZpbmUgUkFXX1RUTCAgICAgICAgICAgICAgICAgICAgICAgIChJUF9ERUZBVUxUX1RUTCkKKyNlbmRpZgorCisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLSBESENQIG9wdGlvbnMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qKgorICogTFdJUF9ESENQPT0xOiBFbmFibGUgREhDUCBtb2R1bGUuCisgKi8KKyNpZm5kZWYgTFdJUF9ESENQCisjZGVmaW5lIExXSVBfREhDUCAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogREhDUF9ET0VTX0FSUF9DSEVDSz09MTogRG8gYW4gQVJQIGNoZWNrIG9uIHRoZSBvZmZlcmVkIGFkZHJlc3MuCisgKi8KKyNpZm5kZWYgREhDUF9ET0VTX0FSUF9DSEVDSworI2RlZmluZSBESENQX0RPRVNfQVJQX0NIRUNLICAgICAgICAgICAgICgoTFdJUF9ESENQKSAmJiAoTFdJUF9BUlApKQorI2VuZGlmCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0gQVVUT0lQIG9wdGlvbnMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBMV0lQX0FVVE9JUD09MTogRW5hYmxlIEFVVE9JUCBtb2R1bGUuCisgKi8KKyNpZm5kZWYgTFdJUF9BVVRPSVAKKyNkZWZpbmUgTFdJUF9BVVRPSVAgICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBMV0lQX0RIQ1BfQVVUT0lQX0NPT1A9PTE6IEFsbG93IERIQ1AgYW5kIEFVVE9JUCB0byBiZSBib3RoIGVuYWJsZWQgb24KKyAqIHRoZSBzYW1lIGludGVyZmFjZSBhdCB0aGUgc2FtZSB0aW1lLgorICovCisjaWZuZGVmIExXSVBfREhDUF9BVVRPSVBfQ09PUAorI2RlZmluZSBMV0lQX0RIQ1BfQVVUT0lQX0NPT1AgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIExXSVBfREhDUF9BVVRPSVBfQ09PUF9UUklFUzogU2V0IHRvIHRoZSBudW1iZXIgb2YgREhDUCBESVNDT1ZFUiBwcm9iZXMKKyAqIHRoYXQgc2hvdWxkIGJlIHNlbnQgYmVmb3JlIGZhbGxpbmcgYmFjayBvbiBBVVRPSVAuIFRoaXMgY2FuIGJlIHNldAorICogYXMgbG93IGFzIDEgdG8gZ2V0IGFuIEF1dG9JUCBhZGRyZXNzIHZlcnkgcXVpY2tseSwgYnV0IHlvdSBzaG91bGQKKyAqIGJlIHByZXBhcmVkIHRvIGhhbmRsZSBhIGNoYW5naW5nIElQIGFkZHJlc3Mgd2hlbiBESENQIG92ZXJyaWRlcworICogQXV0b0lQLgorICovCisjaWZuZGVmIExXSVBfREhDUF9BVVRPSVBfQ09PUF9UUklFUworI2RlZmluZSBMV0lQX0RIQ1BfQVVUT0lQX0NPT1BfVFJJRVMgICAgIDkKKyNlbmRpZgorCisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLSBTTk1QIG9wdGlvbnMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qKgorICogTFdJUF9TTk1QPT0xOiBUdXJuIG9uIFNOTVAgbW9kdWxlLiBVRFAgbXVzdCBiZSBhdmFpbGFibGUgZm9yIFNOTVAKKyAqIHRyYW5zcG9ydC4KKyAqLworI2lmbmRlZiBMV0lQX1NOTVAKKyNkZWZpbmUgTFdJUF9TTk1QICAgICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBTTk1QX0NPTkNVUlJFTlRfUkVRVUVTVFM6IE51bWJlciBvZiBjb25jdXJyZW50IHJlcXVlc3RzIHRoZSBtb2R1bGUgd2lsbAorICogYWxsb3cuIEF0IGxlYXN0IG9uZSByZXF1ZXN0IGJ1ZmZlciBpcyByZXF1aXJlZC4KKyAqIERvZXMgbm90IGhhdmUgdG8gYmUgY2hhbmdlZCB1bmxlc3MgZXh0ZXJuYWwgTUlCcyBhbnN3ZXIgcmVxdWVzdCBhc3luY2hyb25vdXNseQorICovCisjaWZuZGVmIFNOTVBfQ09OQ1VSUkVOVF9SRVFVRVNUUworI2RlZmluZSBTTk1QX0NPTkNVUlJFTlRfUkVRVUVTVFMgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIFNOTVBfVFJBUF9ERVNUSU5BVElPTlM6IE51bWJlciBvZiB0cmFwIGRlc3RpbmF0aW9ucy4gQXQgbGVhc3Qgb25lIHRyYXAKKyAqIGRlc3RpbmF0aW9uIGlzIHJlcXVpcmVkCisgKi8KKyNpZm5kZWYgU05NUF9UUkFQX0RFU1RJTkFUSU9OUworI2RlZmluZSBTTk1QX1RSQVBfREVTVElOQVRJT05TICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIFNOTVBfUFJJVkFURV9NSUI6IAorICogV2hlbiB1c2luZyBhIHByaXZhdGUgTUlCLCB5b3UgaGF2ZSB0byBjcmVhdGUgYSBmaWxlICdwcml2YXRlX21pYi5oJyB0aGF0IGNvbnRhaW5zCisgKiBhICdzdHJ1Y3QgbWliX2FycmF5X25vZGUgbWliX3ByaXZhdGUnIHdoaWNoIGNvbnRhaW5zIHlvdXIgTUlCLgorICovCisjaWZuZGVmIFNOTVBfUFJJVkFURV9NSUIKKyNkZWZpbmUgU05NUF9QUklWQVRFX01JQiAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBPbmx5IGFsbG93IFNOTVAgd3JpdGUgYWN0aW9ucyB0aGF0IGFyZSAnc2FmZScgKGUuZy4gZGlzYWJlbGluZyBuZXRpZnMgaXMgbm90CisgKiBhIHNhZmUgYWN0aW9uIGFuZCBkaXNhYmxlZCB3aGVuIFNOTVBfU0FGRV9SRVFVRVNUUyA9IDEpLgorICogVW5zYWZlIHJlcXVlc3RzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IQorICovCisjaWZuZGVmIFNOTVBfU0FGRV9SRVFVRVNUUworI2RlZmluZSBTTk1QX1NBRkVfUkVRVUVTVFMgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBzdHJpbmdzIHVzZWQuIFRoaXMgYWZmZWN0cyB0aGUgc2l6ZSBvZgorICogTUVNUF9TTk1QX1ZBTFVFIGVsZW1lbnRzLgorICovCisjaWZuZGVmIFNOTVBfTUFYX09DVEVUX1NUUklOR19MRU4KKyNkZWZpbmUgU05NUF9NQVhfT0NURVRfU1RSSU5HX0xFTiAgICAgICAxMjcKKyNlbmRpZgorCisvKioKKyAqIFRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSBTTk1QIHRyZWUuCisgKiBXaXRoIHByaXZhdGUgTUlCcyBlbmFibGVkLCB0aGlzIGRlcGVuZHMgb24geW91ciBNSUIhCisgKiBUaGlzIGFmZmVjdHMgdGhlIHNpemUgb2YgTUVNUF9TTk1QX1ZBTFVFIGVsZW1lbnRzLgorICovCisjaWZuZGVmIFNOTVBfTUFYX1RSRUVfREVQVEgKKyNkZWZpbmUgU05NUF9NQVhfVFJFRV9ERVBUSCAgICAgICAgICAgICAxNQorI2VuZGlmCisKKy8qKgorICogVGhlIHNpemUgb2YgdGhlIE1FTVBfU05NUF9WQUxVRSBlbGVtZW50cywgbm9ybWFsbHkgY2FsY3VsYXRlZCBmcm9tCisgKiBTTk1QX01BWF9PQ1RFVF9TVFJJTkdfTEVOIGFuZCBTTk1QX01BWF9UUkVFX0RFUFRILgorICovCisjaWZuZGVmIFNOTVBfTUFYX1ZBTFVFX1NJWkUKKyNkZWZpbmUgU05NUF9NQVhfVkFMVUVfU0laRSAgICAgICAgICAgICBMV0lQX01BWCgoU05NUF9NQVhfT0NURVRfU1RSSU5HX0xFTikrMSwgc2l6ZW9mKHMzMl90KSooU05NUF9NQVhfVFJFRV9ERVBUSCkpCisjZW5kaWYKKworLyoKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0gSUdNUCBvcHRpb25zIC0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisvKioKKyAqIExXSVBfSUdNUD09MTogVHVybiBvbiBJR01QIG1vZHVsZS4gCisgKi8KKyNpZm5kZWYgTFdJUF9JR01QCisjZGVmaW5lIExXSVBfSUdNUCAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIEROUyBvcHRpb25zIC0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBMV0lQX0ROUz09MTogVHVybiBvbiBETlMgbW9kdWxlLiBVRFAgbXVzdCBiZSBhdmFpbGFibGUgZm9yIEROUworICogdHJhbnNwb3J0LgorICovCisjaWZuZGVmIExXSVBfRE5TCisjZGVmaW5lIExXSVBfRE5TICAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKiBETlMgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBtYWludGFpbiBsb2NhbGx5LiAqLworI2lmbmRlZiBETlNfVEFCTEVfU0laRQorI2RlZmluZSBETlNfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgIDQKKyNlbmRpZgorCisvKiogRE5TIG1heGltdW0gaG9zdCBuYW1lIGxlbmd0aCBzdXBwb3J0ZWQgaW4gdGhlIG5hbWUgdGFibGUuICovCisjaWZuZGVmIEROU19NQVhfTkFNRV9MRU5HVEgKKyNkZWZpbmUgRE5TX01BWF9OQU1FX0xFTkdUSCAgICAgICAgICAgICAyNTYKKyNlbmRpZgorCisvKiogVGhlIG1heGltdW0gb2YgRE5TIHNlcnZlcnMgKi8KKyNpZm5kZWYgRE5TX01BWF9TRVJWRVJTCisjZGVmaW5lIEROU19NQVhfU0VSVkVSUyAgICAgICAgICAgICAgICAgMgorI2VuZGlmCisKKy8qKiBETlMgZG8gYSBuYW1lIGNoZWNraW5nIGJldHdlZW4gdGhlIHF1ZXJ5IGFuZCB0aGUgcmVzcG9uc2UuICovCisjaWZuZGVmIEROU19ET0VTX05BTUVfQ0hFQ0sKKyNkZWZpbmUgRE5TX0RPRVNfTkFNRV9DSEVDSyAgICAgICAgICAgICAxCisjZW5kaWYKKworLyoqIEROUyBtZXNzYWdlIG1heC4gc2l6ZS4gRGVmYXVsdCB2YWx1ZSBpcyBSRkMgY29tcGxpYW50LiAqLworI2lmbmRlZiBETlNfTVNHX1NJWkUKKyNkZWZpbmUgRE5TX01TR19TSVpFICAgICAgICAgICAgICAgICAgICA1MTIKKyNlbmRpZgorCisvKiogRE5TX0xPQ0FMX0hPU1RMSVNUOiBJbXBsZW1lbnRzIGEgbG9jYWwgaG9zdC10by1hZGRyZXNzIGxpc3QuIElmIGVuYWJsZWQsCisgKiAgeW91IGhhdmUgdG8gZGVmaW5lCisgKiAgICAjZGVmaW5lIEROU19MT0NBTF9IT1NUTElTVF9JTklUIHt7Imhvc3QxIiwgMHgxMjN9LCB7Imhvc3QyIiwgMHgyMzR9fQorICogIChhbiBhcnJheSBvZiBzdHJ1Y3RzIG5hbWUvYWRkcmVzcywgd2hlcmUgYWRkcmVzcyBpcyBhbiB1MzJfdCBpbiBuZXR3b3JrCisgKiAgYnl0ZSBvcmRlcikuCisgKgorICogIEluc3RlYWQsIHlvdSBjYW4gYWxzbyB1c2UgYW4gZXh0ZXJuYWwgZnVuY3Rpb246CisgKiAgI2RlZmluZSBETlNfTE9PS1VQX0xPQ0FMX0VYVEVSTih4KSBleHRlcm4gdTMyX3QgbXlfbG9va3VwX2Z1bmN0aW9uKGNvbnN0IGNoYXIgKm5hbWUpCisgKiAgdGhhdCByZXR1cm5zIHRoZSBJUCBhZGRyZXNzIG9yIElOQUREUl9OT05FIGlmIG5vdCBmb3VuZC4KKyAqLworI2lmbmRlZiBETlNfTE9DQUxfSE9TVExJU1QKKyNkZWZpbmUgRE5TX0xPQ0FMX0hPU1RMSVNUICAgICAgICAgICAgICAwCisjZW5kaWYgLyogRE5TX0xPQ0FMX0hPU1RMSVNUICovCisKKy8qKiBJZiB0aGlzIGlzIHR1cm5lZCBvbiwgdGhlIGxvY2FsIGhvc3QtbGlzdCBjYW4gYmUgZHluYW1pY2FsbHkgY2hhbmdlZAorICogIGF0IHJ1bnRpbWUuICovCisjaWZuZGVmIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDCisjZGVmaW5lIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDICAgMAorI2VuZGlmIC8qIEROU19MT0NBTF9IT1NUTElTVF9JU19EWU5BTUlDICovCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0gVURQIG9wdGlvbnMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBMV0lQX1VEUD09MTogVHVybiBvbiBVRFAuCisgKi8KKyNpZm5kZWYgTFdJUF9VRFAKKyNkZWZpbmUgTFdJUF9VRFAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKworLyoqCisgKiBMV0lQX1VEUExJVEU9PTE6IFR1cm4gb24gVURQLUxpdGUuIChSZXF1aXJlcyBMV0lQX1VEUCkKKyAqLworI2lmbmRlZiBMV0lQX1VEUExJVEUKKyNkZWZpbmUgTFdJUF9VRFBMSVRFICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBVRFBfVFRMOiBEZWZhdWx0IFRpbWUtVG8tTGl2ZSB2YWx1ZS4KKyAqLworI2lmbmRlZiBVRFBfVFRMCisjZGVmaW5lIFVEUF9UVEwgICAgICAgICAgICAgICAgICAgICAgICAgKElQX0RFRkFVTFRfVFRMKQorI2VuZGlmCisKKy8qKgorICogTFdJUF9ORVRCVUZfUkVDVklORk89PTE6IGFwcGVuZCBkZXN0aW5hdGlvbiBhZGRyIGFuZCBwb3J0IHRvIGV2ZXJ5IG5ldGJ1Zi4KKyAqLworI2lmbmRlZiBMV0lQX05FVEJVRl9SRUNWSU5GTworI2RlZmluZSBMV0lQX05FVEJVRl9SRUNWSU5GTyAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIFRDUCBvcHRpb25zIC0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qKgorICogTFdJUF9UQ1A9PTE6IFR1cm4gb24gVENQLgorICovCisjaWZuZGVmIExXSVBfVENQCisjZGVmaW5lIExXSVBfVENQICAgICAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qKgorICogVENQX1RUTDogRGVmYXVsdCBUaW1lLVRvLUxpdmUgdmFsdWUuCisgKi8KKyNpZm5kZWYgVENQX1RUTAorI2RlZmluZSBUQ1BfVFRMICAgICAgICAgICAgICAgICAgICAgICAgIChJUF9ERUZBVUxUX1RUTCkKKyNlbmRpZgorCisvKioKKyAqIFRDUF9XTkQ6IFRoZSBzaXplIG9mIGEgVENQIHdpbmRvdy4gIFRoaXMgbXVzdCBiZSBhdCBsZWFzdCAKKyAqICgyICogVENQX01TUykgZm9yIHRoaW5ncyB0byB3b3JrIHdlbGwKKyAqLworI2lmbmRlZiBUQ1BfV05ECisjZGVmaW5lIFRDUF9XTkQgICAgICAgICAgICAgICAgICAgICAgICAgKDQgKiBUQ1BfTVNTKQorI2VuZGlmIAorCisvKioKKyAqIFRDUF9NQVhSVFg6IE1heGltdW0gbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBvZiBkYXRhIHNlZ21lbnRzLgorICovCisjaWZuZGVmIFRDUF9NQVhSVFgKKyNkZWZpbmUgVENQX01BWFJUWCAgICAgICAgICAgICAgICAgICAgICAxMgorI2VuZGlmCisKKy8qKgorICogVENQX1NZTk1BWFJUWDogTWF4aW11bSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIG9mIFNZTiBzZWdtZW50cy4KKyAqLworI2lmbmRlZiBUQ1BfU1lOTUFYUlRYCisjZGVmaW5lIFRDUF9TWU5NQVhSVFggICAgICAgICAgICAgICAgICAgNgorI2VuZGlmCisKKy8qKgorICogVENQX1FVRVVFX09PU0VRPT0xOiBUQ1Agd2lsbCBxdWV1ZSBzZWdtZW50cyB0aGF0IGFycml2ZSBvdXQgb2Ygb3JkZXIuCisgKiBEZWZpbmUgdG8gMCBpZiB5b3VyIGRldmljZSBpcyBsb3cgb24gbWVtb3J5LgorICovCisjaWZuZGVmIFRDUF9RVUVVRV9PT1NFUQorI2RlZmluZSBUQ1BfUVVFVUVfT09TRVEgICAgICAgICAgICAgICAgIChMV0lQX1RDUCkKKyNlbmRpZgorCisvKioKKyAqIFRDUF9NU1M6IFRDUCBNYXhpbXVtIHNlZ21lbnQgc2l6ZS4gKGRlZmF1bHQgaXMgNTM2LCBhIGNvbnNlcnZhdGl2ZSBkZWZhdWx0LAorICogeW91IG1pZ2h0IHdhbnQgdG8gaW5jcmVhc2UgdGhpcy4pCisgKiBGb3IgdGhlIHJlY2VpdmUgc2lkZSwgdGhpcyBNU1MgaXMgYWR2ZXJ0aXNlZCB0byB0aGUgcmVtb3RlIHNpZGUKKyAqIHdoZW4gb3BlbmluZyBhIGNvbm5lY3Rpb24uIEZvciB0aGUgdHJhbnNtaXQgc2l6ZSwgdGhpcyBNU1Mgc2V0cworICogYW4gdXBwZXIgbGltaXQgb24gdGhlIE1TUyBhZHZlcnRpc2VkIGJ5IHRoZSByZW1vdGUgaG9zdC4KKyAqLworI2lmbmRlZiBUQ1BfTVNTCisjZGVmaW5lIFRDUF9NU1MgICAgICAgICAgICAgICAgICAgICAgICAgNTM2CisjZW5kaWYKKworLyoqCisgKiBUQ1BfQ0FMQ1VMQVRFX0VGRl9TRU5EX01TUzogIlRoZSBtYXhpbXVtIHNpemUgb2YgYSBzZWdtZW50IHRoYXQgVENQIHJlYWxseQorICogc2VuZHMsIHRoZSAnZWZmZWN0aXZlIHNlbmQgTVNTLCcgTVVTVCBiZSB0aGUgc21hbGxlciBvZiB0aGUgc2VuZCBNU1MgKHdoaWNoCisgKiByZWZsZWN0cyB0aGUgYXZhaWxhYmxlIHJlYXNzZW1ibHkgYnVmZmVyIHNpemUgYXQgdGhlIHJlbW90ZSBob3N0KSBhbmQgdGhlCisgKiBsYXJnZXN0IHNpemUgcGVybWl0dGVkIGJ5IHRoZSBJUCBsYXllciIgKFJGQyAxMTIyKQorICogU2V0dGluZyB0aGlzIHRvIDEgZW5hYmxlcyBjb2RlIHRoYXQgY2hlY2tzIFRDUF9NU1MgYWdhaW5zdCB0aGUgTVRVIG9mIHRoZQorICogbmV0aWYgdXNlZCBmb3IgYSBjb25uZWN0aW9uIGFuZCBsaW1pdHMgdGhlIE1TUyBpZiBpdCB3b3VsZCBiZSB0b28gYmlnIG90aGVyd2lzZS4KKyAqLworI2lmbmRlZiBUQ1BfQ0FMQ1VMQVRFX0VGRl9TRU5EX01TUworI2RlZmluZSBUQ1BfQ0FMQ1VMQVRFX0VGRl9TRU5EX01TUyAgICAgIDEKKyNlbmRpZgorCisKKy8qKgorICogVENQX1NORF9CVUY6IFRDUCBzZW5kZXIgYnVmZmVyIHNwYWNlIChieXRlcykuIAorICovCisjaWZuZGVmIFRDUF9TTkRfQlVGCisjZGVmaW5lIFRDUF9TTkRfQlVGICAgICAgICAgICAgICAgICAgICAgMjU2CisjZW5kaWYKKworLyoqCisgKiBUQ1BfU05EX1FVRVVFTEVOOiBUQ1Agc2VuZGVyIGJ1ZmZlciBzcGFjZSAocGJ1ZnMpLiBUaGlzIG11c3QgYmUgYXQgbGVhc3QKKyAqIGFzIG11Y2ggYXMgKDIgKiBUQ1BfU05EX0JVRi9UQ1BfTVNTKSBmb3IgdGhpbmdzIHRvIHdvcmsuCisgKi8KKyNpZm5kZWYgVENQX1NORF9RVUVVRUxFTgorI2RlZmluZSBUQ1BfU05EX1FVRVVFTEVOICAgICAgICAgICAgICAgICgoNCAqIChUQ1BfU05EX0JVRikgKyAoVENQX01TUyAtIDEpKS8oVENQX01TUykpCisjZW5kaWYKKworLyoqCisgKiBUQ1BfU05ETE9XQVQ6IFRDUCB3cml0YWJsZSBzcGFjZSAoYnl0ZXMpLiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuCisgKiBUQ1BfU05EX0JVRi4gSXQgaXMgdGhlIGFtb3VudCBvZiBzcGFjZSB3aGljaCBtdXN0IGJlIGF2YWlsYWJsZSBpbiB0aGUKKyAqIFRDUCBzbmRfYnVmIGZvciBzZWxlY3QgdG8gcmV0dXJuIHdyaXRhYmxlIChjb21iaW5lZCB3aXRoIFRDUF9TTkRRVUVVRUxPV0FUKS4KKyAqLworI2lmbmRlZiBUQ1BfU05ETE9XQVQKKyNkZWZpbmUgVENQX1NORExPV0FUICAgICAgICAgICAgICAgICAgICAoKFRDUF9TTkRfQlVGKS8yKQorI2VuZGlmCisKKy8qKgorICogVENQX1NORFFVRVVFTE9XQVQ6IFRDUCB3cml0YWJsZSBidWZzIChwYnVmIGNvdW50KS4gVGhpcyBtdXN0IGJlIGdyYXRlcgorICogdGhhbiBUQ1BfU05EX1FVRVVFTEVOLiBJZiB0aGUgbnVtYmVyIG9mIHBidWZzIHF1ZXVlZCBvbiBhIHBjYiBkcm9wcyBiZWxvdworICogdGhpcyBudW1iZXIsIHNlbGVjdCByZXR1cm5zIHdyaXRhYmxlIChjb21iaW5lZCB3aXRoIFRDUF9TTkRMT1dBVCkuCisgKi8KKyNpZm5kZWYgVENQX1NORFFVRVVFTE9XQVQKKyNkZWZpbmUgVENQX1NORFFVRVVFTE9XQVQgICAgICAgICAgICAgICAoKFRDUF9TTkRfUVVFVUVMRU4pLzIpCisjZW5kaWYKKworLyoqCisgKiBUQ1BfTElTVEVOX0JBQ0tMT0c6IEVuYWJsZSB0aGUgYmFja2xvZyBvcHRpb24gZm9yIHRjcCBsaXN0ZW4gcGNiLgorICovCisjaWZuZGVmIFRDUF9MSVNURU5fQkFDS0xPRworI2RlZmluZSBUQ1BfTElTVEVOX0JBQ0tMT0cgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIFRoZSBtYXhpbXVtIGFsbG93ZWQgYmFja2xvZyBmb3IgVENQIGxpc3RlbiBuZXRjb25ucy4KKyAqIFRoaXMgYmFja2xvZyBpcyB1c2VkIHVubGVzcyBhbm90aGVyIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICogMHhmZiBpcyB0aGUgbWF4aW11bSAodThfdCkuCisgKi8KKyNpZm5kZWYgVENQX0RFRkFVTFRfTElTVEVOX0JBQ0tMT0cKKyNkZWZpbmUgVENQX0RFRkFVTFRfTElTVEVOX0JBQ0tMT0cgICAgICAweGZmCisjZW5kaWYKKworLyoqCisgKiBUQ1BfT1ZFUlNJWkU6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHRjcF93cml0ZSBtYXkKKyAqIGFsbG9jYXRlIGFoZWFkIG9mIHRpbWUgaW4gYW4gYXR0ZW1wdCB0byBjcmVhdGUgc2hvcnRlciBwYnVmIGNoYWlucworICogZm9yIHRyYW5zbWlzc2lvbi4gVGhlIG1lYW5pbmdmdWwgcmFuZ2UgaXMgMCB0byBUQ1BfTVNTLiBTb21lCisgKiBzdWdnZXN0ZWQgdmFsdWVzIGFyZToKKyAqCisgKiAwOiAgICAgICAgIERpc2FibGUgb3ZlcnNpemVkIGFsbG9jYXRpb24uIEVhY2ggdGNwX3dyaXRlKCkgYWxsb2NhdGVzIGEgbmV3CisgICAgICAgICAgICAgIHBidWYgKG9sZCBiZWhhdmlvdXIpLgorICogMTogICAgICAgICBBbGxvY2F0ZSBzaXplLWFsaWduZWQgcGJ1ZnMgd2l0aCBtaW5pbWFsIGV4Y2Vzcy4gVXNlIHRoaXMgaWYgeW91cgorICogICAgICAgICAgICBzY2F0dGVyLWdhdGhlciBETUEgcmVxdWlyZXMgYWxpZ25lZCBmcmFnbWVudHMuCisgKiAxMjg6ICAgICAgIExpbWl0IHRoZSBwYnVmL21lbW9yeSBvdmVyaGVhZCB0byAyMCUuCisgKiBUQ1BfTVNTOiAgIFRyeSB0byBjcmVhdGUgdW5mcmFnbWVudGVkIFRDUCBwYWNrZXRzLgorICogVENQX01TUy80OiBUcnkgdG8gY3JlYXRlIDQgZnJhZ21lbnRzIG9yIGxlc3MgcGVyIFRDUCBwYWNrZXQuCisgKi8KKyNpZm5kZWYgVENQX09WRVJTSVpFCisjZGVmaW5lIFRDUF9PVkVSU0laRSAgICAgICAgICAgICAgICAgICAgVENQX01TUworI2VuZGlmCisKKy8qKgorICogTFdJUF9UQ1BfVElNRVNUQU1QUz09MTogc3VwcG9ydCB0aGUgVENQIHRpbWVzdGFtcCBvcHRpb24uCisgKi8KKyNpZm5kZWYgTFdJUF9UQ1BfVElNRVNUQU1QUworI2RlZmluZSBMV0lQX1RDUF9USU1FU1RBTVBTICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIFRDUF9XTkRfVVBEQVRFX1RIUkVTSE9MRDogZGlmZmVyZW5jZSBpbiB3aW5kb3cgdG8gdHJpZ2dlciBhbgorICogZXhwbGljaXQgd2luZG93IHVwZGF0ZQorICovCisjaWZuZGVmIFRDUF9XTkRfVVBEQVRFX1RIUkVTSE9MRAorI2RlZmluZSBUQ1BfV05EX1VQREFURV9USFJFU0hPTEQgICAoVENQX1dORCAvIDQpCisjZW5kaWYKKworLyoqCisgKiBMV0lQX0VWRU5UX0FQSSBhbmQgTFdJUF9DQUxMQkFDS19BUEk6IE9ubHkgb25lIG9mIHRoZXNlIHNob3VsZCBiZSBzZXQgdG8gMS4KKyAqICAgICBMV0lQX0VWRU5UX0FQST09MTogVGhlIHVzZXIgZGVmaW5lcyBsd2lwX3RjcF9ldmVudCgpIHRvIHJlY2VpdmUgYWxsCisgKiAgICAgICAgIGV2ZW50cyAoYWNjZXB0LCBzZW50LCBldGMpIHRoYXQgaGFwcGVuIGluIHRoZSBzeXN0ZW0uCisgKiAgICAgTFdJUF9DQUxMQkFDS19BUEk9PTE6IFRoZSBQQ0IgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIGRpcmVjdGx5CisgKiAgICAgICAgIGZvciB0aGUgZXZlbnQuCisgKi8KKyNpZm5kZWYgTFdJUF9FVkVOVF9BUEkKKyNkZWZpbmUgTFdJUF9FVkVOVF9BUEkgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExXSVBfQ0FMTEJBQ0tfQVBJICAgICAgICAgICAgICAgMQorI2Vsc2UgCisjZGVmaW5lIExXSVBfRVZFTlRfQVBJICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMV0lQX0NBTExCQUNLX0FQSSAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIFBidWYgb3B0aW9ucyAtLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBQQlVGX0xJTktfSExFTjogdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yIGEKKyAqIGxpbmsgbGV2ZWwgaGVhZGVyLiBUaGUgZGVmYXVsdCBpcyAxNCwgdGhlIHN0YW5kYXJkIHZhbHVlIGZvcgorICogRXRoZXJuZXQuCisgKi8KKyNpZm5kZWYgUEJVRl9MSU5LX0hMRU4KKyNkZWZpbmUgUEJVRl9MSU5LX0hMRU4gICAgICAgICAgICAgICAgICAoMTQgKyBFVEhfUEFEX1NJWkUpCisjZW5kaWYKKworLyoqCisgKiBQQlVGX1BPT0xfQlVGU0laRTogdGhlIHNpemUgb2YgZWFjaCBwYnVmIGluIHRoZSBwYnVmIHBvb2wuIFRoZSBkZWZhdWx0IGlzCisgKiBkZXNpZ25lZCB0byBhY2NvbW9kYXRlIHNpbmdsZSBmdWxsIHNpemUgVENQIGZyYW1lIGluIG9uZSBwYnVmLCBpbmNsdWRpbmcKKyAqIFRDUF9NU1MsIElQIGhlYWRlciwgYW5kIGxpbmsgaGVhZGVyLgorICovCisjaWZuZGVmIFBCVUZfUE9PTF9CVUZTSVpFCisjZGVmaW5lIFBCVUZfUE9PTF9CVUZTSVpFICAgICAgICAgICAgICAgTFdJUF9NRU1fQUxJR05fU0laRShUQ1BfTVNTKzQwK1BCVUZfTElOS19ITEVOKQorI2VuZGlmCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0gTmV0d29yayBJbnRlcmZhY2VzIG9wdGlvbnMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBMV0lQX05FVElGX0hPU1ROQU1FPT0xOiB1c2UgREhDUF9PUFRJT05fSE9TVE5BTUUgd2l0aCBuZXRpZidzIGhvc3RuYW1lCisgKiBmaWVsZC4KKyAqLworI2lmbmRlZiBMV0lQX05FVElGX0hPU1ROQU1FCisjZGVmaW5lIExXSVBfTkVUSUZfSE9TVE5BTUUgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogTFdJUF9ORVRJRl9BUEk9PTE6IFN1cHBvcnQgbmV0aWYgYXBpIChpbiBuZXRpZmFwaS5jKQorICovCisjaWZuZGVmIExXSVBfTkVUSUZfQVBJCisjZGVmaW5lIExXSVBfTkVUSUZfQVBJICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogTFdJUF9ORVRJRl9TVEFUVVNfQ0FMTEJBQ0s9PTE6IFN1cHBvcnQgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuZXZlciBhbiBpbnRlcmZhY2UKKyAqIGNoYW5nZXMgaXRzIHVwL2Rvd24gc3RhdHVzIChpLmUuLCBkdWUgdG8gREhDUCBJUCBhY3F1aXN0aW9uKQorICovCisjaWZuZGVmIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLCisjZGVmaW5lIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLICAgICAgMAorI2VuZGlmCisKKy8qKgorICogTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLPT0xOiBTdXBwb3J0IGEgY2FsbGJhY2sgZnVuY3Rpb24gZnJvbSBhbiBpbnRlcmZhY2UKKyAqIHdoZW5ldmVyIHRoZSBsaW5rIGNoYW5nZXMgKGkuZS4sIGxpbmsgZG93bikKKyAqLworI2lmbmRlZiBMV0lQX05FVElGX0xJTktfQ0FMTEJBQ0sKKyNkZWZpbmUgTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBMV0lQX05FVElGX0hXQUREUkhJTlQ9PTE6IENhY2hlIGxpbmstbGF5ZXItYWRkcmVzcyBoaW50cyAoZS5nLiB0YWJsZQorICogaW5kaWNlcykgaW4gc3RydWN0IG5ldGlmLiBUQ1AgYW5kIFVEUCBjYW4gbWFrZSB1c2Ugb2YgdGhpcyB0byBwcmV2ZW50CisgKiBzY2FubmluZyB0aGUgQVJQIHRhYmxlIGZvciBldmVyeSBzZW50IHBhY2tldC4gV2hpbGUgdGhpcyBpcyBmYXN0ZXIgZm9yIGJpZworICogQVJQIHRhYmxlcyBvciBtYW55IGNvbmN1cnJlbnQgY29ubmVjdGlvbnMsIGl0IG1pZ2h0IGJlIGNvdW50ZXJwcm9kdWN0aXZlCisgKiBpZiB5b3UgaGF2ZSBhIHRpbnkgQVJQIHRhYmxlIG9yIGlmIHRoZXJlIG5ldmVyIGFyZSBjb25jdXJyZW50IGNvbm5lY3Rpb25zLgorICovCisjaWZuZGVmIExXSVBfTkVUSUZfSFdBRERSSElOVAorI2RlZmluZSBMV0lQX05FVElGX0hXQUREUkhJTlQgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIExXSVBfTkVUSUZfTE9PUEJBQ0s9PTE6IFN1cHBvcnQgc2VuZGluZyBwYWNrZXRzIHdpdGggYSBkZXN0aW5hdGlvbiBJUAorICogYWRkcmVzcyBlcXVhbCB0byB0aGUgbmV0aWYgSVAgYWRkcmVzcywgbG9vcGluZyB0aGVtIGJhY2sgdXAgdGhlIHN0YWNrLgorICovCisjaWZuZGVmIExXSVBfTkVUSUZfTE9PUEJBQ0sKKyNkZWZpbmUgTFdJUF9ORVRJRl9MT09QQkFDSyAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBMV0lQX0xPT1BCQUNLX01BWF9QQlVGUzogTWF4aW11bSBudW1iZXIgb2YgcGJ1ZnMgb24gcXVldWUgZm9yIGxvb3BiYWNrCisgKiBzZW5kaW5nIGZvciBlYWNoIG5ldGlmICgwID0gZGlzYWJsZWQpCisgKi8KKyNpZm5kZWYgTFdJUF9MT09QQkFDS19NQVhfUEJVRlMKKyNkZWZpbmUgTFdJUF9MT09QQkFDS19NQVhfUEJVRlMgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBMV0lQX05FVElGX0xPT1BCQUNLX01VTFRJVEhSRUFESU5HOiBJbmRpY2F0ZXMgd2hldGhlciB0aHJlYWRpbmcgaXMgZW5hYmxlZCBpbgorICogdGhlIHN5c3RlbSwgYXMgbmV0aWZzIG11c3QgY2hhbmdlIGhvdyB0aGV5IGJlaGF2ZSBkZXBlbmRpbmcgb24gdGhpcyBzZXR0aW5nCisgKiBmb3IgdGhlIExXSVBfTkVUSUZfTE9PUEJBQ0sgb3B0aW9uIHRvIHdvcmsuCisgKiBTZXR0aW5nIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHJlZW50ZXJpbmcgbm9uLXJlZW50cmFudCBmdW5jdGlvbnMgbGlrZQorICogdGNwX2lucHV0KCkuCisgKiAgICBMV0lQX05FVElGX0xPT1BCQUNLX01VTFRJVEhSRUFESU5HPT0xOiBJbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBpcyB1c2luZyBhCisgKiAgICAgICBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50IGxpa2UgdGNwaXAuYy4gSW4gdGhpcyBjYXNlLCBuZXRpZi0+aW5wdXQoKQorICogICAgICAgaXMgY2FsbGVkIGRpcmVjdGx5LgorICogICAgTFdJUF9ORVRJRl9MT09QQkFDS19NVUxUSVRIUkVBRElORz09MDogSW5kaWNhdGVzIGEgcG9sbGluZyAob3IgTk9fU1lTKSBzZXR1cC4KKyAqICAgICAgIFRoZSBwYWNrZXRzIGFyZSBwdXQgb24gYSBsaXN0IGFuZCBuZXRpZl9wb2xsKCkgbXVzdCBiZSBjYWxsZWQgaW4KKyAqICAgICAgIHRoZSBtYWluIGFwcGxpY2F0aW9uIGxvb3AuCisgKi8KKyNpZm5kZWYgTFdJUF9ORVRJRl9MT09QQkFDS19NVUxUSVRIUkVBRElORworI2RlZmluZSBMV0lQX05FVElGX0xPT1BCQUNLX01VTFRJVEhSRUFESU5HICAgICghTk9fU1lTKQorI2VuZGlmCisKKy8qKgorICogTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRjogaWYgdGhpcyBpcyBzZXQgdG8gMSwgbHdJUCB0cmllcyB0byBwdXQgYWxsIGRhdGEKKyAqIHRvIGJlIHNlbnQgaW50byBvbmUgc2luZ2xlIHBidWYuIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBETUEtZW5hYmxlZAorICogTUFDcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHNjYXR0ZXItZ2F0aGVyLgorICogQmV3YXJlIHRoYXQgdGhpcyBtaWdodCBpbnZvbHZlIENQVS1tZW1jcHkgYmVmb3JlIHRyYW5zbWl0dGluZyB0aGF0IHdvdWxkIG5vdAorICogYmUgbmVlZGVkIHdpdGhvdXQgdGhpcyBmbGFnISBVc2UgdGhpcyBvbmx5IGlmIHlvdSBuZWVkIHRvIQorICoKKyAqIEB0b2RvOiBUQ1AgYW5kIElQLWZyYWcgZG8gbm90IHdvcmsgd2l0aCB0aGlzLCB5ZXQ6CisgKi8KKyNpZm5kZWYgTFdJUF9ORVRJRl9UWF9TSU5HTEVfUEJVRgorI2RlZmluZSBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGICAgICAgICAgICAgIDAKKyNlbmRpZiAvKiBMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGICovCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0gTE9PUElGIG9wdGlvbnMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBMV0lQX0hBVkVfTE9PUElGPT0xOiBTdXBwb3J0IGxvb3AgaW50ZXJmYWNlICgxMjcuMC4wLjEpIGFuZCBsb29waWYuYworICovCisjaWZuZGVmIExXSVBfSEFWRV9MT09QSUYKKyNkZWZpbmUgTFdJUF9IQVZFX0xPT1BJRiAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLSBTTElQSUYgb3B0aW9ucyAtLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisvKioKKyAqIExXSVBfSEFWRV9TTElQSUY9PTE6IFN1cHBvcnQgc2xpcCBpbnRlcmZhY2UgYW5kIHNsaXBpZi5jCisgKi8KKyNpZm5kZWYgTFdJUF9IQVZFX1NMSVBJRgorI2RlZmluZSBMV0lQX0hBVkVfU0xJUElGICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIFRocmVhZCBvcHRpb25zIC0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qKgorICogVENQSVBfVEhSRUFEX05BTUU6IFRoZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBtYWluIHRjcGlwIHRocmVhZC4KKyAqLworI2lmbmRlZiBUQ1BJUF9USFJFQURfTkFNRQorI2RlZmluZSBUQ1BJUF9USFJFQURfTkFNRSAgICAgICAgICAgICAgInRjcGlwX3RocmVhZCIKKyNlbmRpZgorCisvKioKKyAqIFRDUElQX1RIUkVBRF9TVEFDS1NJWkU6IFRoZSBzdGFjayBzaXplIHVzZWQgYnkgdGhlIG1haW4gdGNwaXAgdGhyZWFkLgorICogVGhlIHN0YWNrIHNpemUgdmFsdWUgaXRzZWxmIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IGlzIHBhc3NlZCB0bworICogc3lzX3RocmVhZF9uZXcoKSB3aGVuIHRoZSB0aHJlYWQgaXMgY3JlYXRlZC4KKyAqLworI2lmbmRlZiBUQ1BJUF9USFJFQURfU1RBQ0tTSVpFCisjZGVmaW5lIFRDUElQX1RIUkVBRF9TVEFDS1NJWkUgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogVENQSVBfVEhSRUFEX1BSSU86IFRoZSBwcmlvcml0eSBhc3NpZ25lZCB0byB0aGUgbWFpbiB0Y3BpcCB0aHJlYWQuCisgKiBUaGUgcHJpb3JpdHkgdmFsdWUgaXRzZWxmIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IGlzIHBhc3NlZCB0bworICogc3lzX3RocmVhZF9uZXcoKSB3aGVuIHRoZSB0aHJlYWQgaXMgY3JlYXRlZC4KKyAqLworI2lmbmRlZiBUQ1BJUF9USFJFQURfUFJJTworI2RlZmluZSBUQ1BJUF9USFJFQURfUFJJTyAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIFRDUElQX01CT1hfU0laRTogVGhlIG1haWxib3ggc2l6ZSBmb3IgdGhlIHRjcGlwIHRocmVhZCBtZXNzYWdlcworICogVGhlIHF1ZXVlIHNpemUgdmFsdWUgaXRzZWxmIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IGlzIHBhc3NlZCB0bworICogc3lzX21ib3hfbmV3KCkgd2hlbiB0Y3BpcF9pbml0IGlzIGNhbGxlZC4KKyAqLworI2lmbmRlZiBUQ1BJUF9NQk9YX1NJWkUKKyNkZWZpbmUgVENQSVBfTUJPWF9TSVpFICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBTTElQSUZfVEhSRUFEX05BTUU6IFRoZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBzbGlwaWZfbG9vcCB0aHJlYWQuCisgKi8KKyNpZm5kZWYgU0xJUElGX1RIUkVBRF9OQU1FCisjZGVmaW5lIFNMSVBJRl9USFJFQURfTkFNRSAgICAgICAgICAgICAic2xpcGlmX2xvb3AiCisjZW5kaWYKKworLyoqCisgKiBTTElQX1RIUkVBRF9TVEFDS1NJWkU6IFRoZSBzdGFjayBzaXplIHVzZWQgYnkgdGhlIHNsaXBpZl9sb29wIHRocmVhZC4KKyAqIFRoZSBzdGFjayBzaXplIHZhbHVlIGl0c2VsZiBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQsIGJ1dCBpcyBwYXNzZWQgdG8KKyAqIHN5c190aHJlYWRfbmV3KCkgd2hlbiB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQuCisgKi8KKyNpZm5kZWYgU0xJUElGX1RIUkVBRF9TVEFDS1NJWkUKKyNkZWZpbmUgU0xJUElGX1RIUkVBRF9TVEFDS1NJWkUgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBTTElQSUZfVEhSRUFEX1BSSU86IFRoZSBwcmlvcml0eSBhc3NpZ25lZCB0byB0aGUgc2xpcGlmX2xvb3AgdGhyZWFkLgorICogVGhlIHByaW9yaXR5IHZhbHVlIGl0c2VsZiBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQsIGJ1dCBpcyBwYXNzZWQgdG8KKyAqIHN5c190aHJlYWRfbmV3KCkgd2hlbiB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQuCisgKi8KKyNpZm5kZWYgU0xJUElGX1RIUkVBRF9QUklPCisjZGVmaW5lIFNMSVBJRl9USFJFQURfUFJJTyAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qKgorICogUFBQX1RIUkVBRF9OQU1FOiBUaGUgbmFtZSBhc3NpZ25lZCB0byB0aGUgcHBwSW5wdXRUaHJlYWQuCisgKi8KKyNpZm5kZWYgUFBQX1RIUkVBRF9OQU1FCisjZGVmaW5lIFBQUF9USFJFQURfTkFNRSAgICAgICAgICAgICAgICAicHBwSW5wdXRUaHJlYWQiCisjZW5kaWYKKworLyoqCisgKiBQUFBfVEhSRUFEX1NUQUNLU0laRTogVGhlIHN0YWNrIHNpemUgdXNlZCBieSB0aGUgcHBwSW5wdXRUaHJlYWQuCisgKiBUaGUgc3RhY2sgc2l6ZSB2YWx1ZSBpdHNlbGYgaXMgcGxhdGZvcm0tZGVwZW5kZW50LCBidXQgaXMgcGFzc2VkIHRvCisgKiBzeXNfdGhyZWFkX25ldygpIHdoZW4gdGhlIHRocmVhZCBpcyBjcmVhdGVkLgorICovCisjaWZuZGVmIFBQUF9USFJFQURfU1RBQ0tTSVpFCisjZGVmaW5lIFBQUF9USFJFQURfU1RBQ0tTSVpFICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogUFBQX1RIUkVBRF9QUklPOiBUaGUgcHJpb3JpdHkgYXNzaWduZWQgdG8gdGhlIHBwcElucHV0VGhyZWFkLgorICogVGhlIHByaW9yaXR5IHZhbHVlIGl0c2VsZiBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQsIGJ1dCBpcyBwYXNzZWQgdG8KKyAqIHN5c190aHJlYWRfbmV3KCkgd2hlbiB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQuCisgKi8KKyNpZm5kZWYgUFBQX1RIUkVBRF9QUklPCisjZGVmaW5lIFBQUF9USFJFQURfUFJJTyAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qKgorICogREVGQVVMVF9USFJFQURfTkFNRTogVGhlIG5hbWUgYXNzaWduZWQgdG8gYW55IG90aGVyIGx3SVAgdGhyZWFkLgorICovCisjaWZuZGVmIERFRkFVTFRfVEhSRUFEX05BTUUKKyNkZWZpbmUgREVGQVVMVF9USFJFQURfTkFNRSAgICAgICAgICAgICJsd0lQIgorI2VuZGlmCisKKy8qKgorICogREVGQVVMVF9USFJFQURfU1RBQ0tTSVpFOiBUaGUgc3RhY2sgc2l6ZSB1c2VkIGJ5IGFueSBvdGhlciBsd0lQIHRocmVhZC4KKyAqIFRoZSBzdGFjayBzaXplIHZhbHVlIGl0c2VsZiBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQsIGJ1dCBpcyBwYXNzZWQgdG8KKyAqIHN5c190aHJlYWRfbmV3KCkgd2hlbiB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQuCisgKi8KKyNpZm5kZWYgREVGQVVMVF9USFJFQURfU1RBQ0tTSVpFCisjZGVmaW5lIERFRkFVTFRfVEhSRUFEX1NUQUNLU0laRSAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogREVGQVVMVF9USFJFQURfUFJJTzogVGhlIHByaW9yaXR5IGFzc2lnbmVkIHRvIGFueSBvdGhlciBsd0lQIHRocmVhZC4KKyAqIFRoZSBwcmlvcml0eSB2YWx1ZSBpdHNlbGYgaXMgcGxhdGZvcm0tZGVwZW5kZW50LCBidXQgaXMgcGFzc2VkIHRvCisgKiBzeXNfdGhyZWFkX25ldygpIHdoZW4gdGhlIHRocmVhZCBpcyBjcmVhdGVkLgorICovCisjaWZuZGVmIERFRkFVTFRfVEhSRUFEX1BSSU8KKyNkZWZpbmUgREVGQVVMVF9USFJFQURfUFJJTyAgICAgICAgICAgICAxCisjZW5kaWYKKworLyoqCisgKiBERUZBVUxUX1JBV19SRUNWTUJPWF9TSVpFOiBUaGUgbWFpbGJveCBzaXplIGZvciB0aGUgaW5jb21pbmcgcGFja2V0cyBvbiBhCisgKiBORVRDT05OX1JBVy4gVGhlIHF1ZXVlIHNpemUgdmFsdWUgaXRzZWxmIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IGlzIHBhc3NlZAorICogdG8gc3lzX21ib3hfbmV3KCkgd2hlbiB0aGUgcmVjdm1ib3ggaXMgY3JlYXRlZC4KKyAqLworI2lmbmRlZiBERUZBVUxUX1JBV19SRUNWTUJPWF9TSVpFCisjZGVmaW5lIERFRkFVTFRfUkFXX1JFQ1ZNQk9YX1NJWkUgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogREVGQVVMVF9VRFBfUkVDVk1CT1hfU0laRTogVGhlIG1haWxib3ggc2l6ZSBmb3IgdGhlIGluY29taW5nIHBhY2tldHMgb24gYQorICogTkVUQ09OTl9VRFAuIFRoZSBxdWV1ZSBzaXplIHZhbHVlIGl0c2VsZiBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQsIGJ1dCBpcyBwYXNzZWQKKyAqIHRvIHN5c19tYm94X25ldygpIHdoZW4gdGhlIHJlY3ZtYm94IGlzIGNyZWF0ZWQuCisgKi8KKyNpZm5kZWYgREVGQVVMVF9VRFBfUkVDVk1CT1hfU0laRQorI2RlZmluZSBERUZBVUxUX1VEUF9SRUNWTUJPWF9TSVpFICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIERFRkFVTFRfVENQX1JFQ1ZNQk9YX1NJWkU6IFRoZSBtYWlsYm94IHNpemUgZm9yIHRoZSBpbmNvbWluZyBwYWNrZXRzIG9uIGEKKyAqIE5FVENPTk5fVENQLiBUaGUgcXVldWUgc2l6ZSB2YWx1ZSBpdHNlbGYgaXMgcGxhdGZvcm0tZGVwZW5kZW50LCBidXQgaXMgcGFzc2VkCisgKiB0byBzeXNfbWJveF9uZXcoKSB3aGVuIHRoZSByZWN2bWJveCBpcyBjcmVhdGVkLgorICovCisjaWZuZGVmIERFRkFVTFRfVENQX1JFQ1ZNQk9YX1NJWkUKKyNkZWZpbmUgREVGQVVMVF9UQ1BfUkVDVk1CT1hfU0laRSAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBERUZBVUxUX0FDQ0VQVE1CT1hfU0laRTogVGhlIG1haWxib3ggc2l6ZSBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb25zLgorICogVGhlIHF1ZXVlIHNpemUgdmFsdWUgaXRzZWxmIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IGlzIHBhc3NlZCB0bworICogc3lzX21ib3hfbmV3KCkgd2hlbiB0aGUgYWNjZXB0bWJveCBpcyBjcmVhdGVkLgorICovCisjaWZuZGVmIERFRkFVTFRfQUNDRVBUTUJPWF9TSVpFCisjZGVmaW5lIERFRkFVTFRfQUNDRVBUTUJPWF9TSVpFICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIFNlcXVlbnRpYWwgbGF5ZXIgb3B0aW9ucyAtLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyoqCisgKiBMV0lQX1RDUElQX0NPUkVfTE9DS0lORzogKEVYUEVSSU1FTlRBTCEpCisgKiBEb24ndCB1c2UgaXQgaWYgeW91J3JlIG5vdCBhbiBhY3RpdmUgbHdJUCBwcm9qZWN0IG1lbWJlcgorICovCisjaWZuZGVmIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HCisjZGVmaW5lIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkdfSU5QVVQ6IChFWFBFUklNRU5UQUwhKQorICogRG9uJ3QgdXNlIGl0IGlmIHlvdSdyZSBub3QgYW4gYWN0aXZlIGx3SVAgcHJvamVjdCBtZW1iZXIKKyAqLworI2lmbmRlZiBMV0lQX1RDUElQX0NPUkVfTE9DS0lOR19JTlBVVAorI2RlZmluZSBMV0lQX1RDUElQX0NPUkVfTE9DS0lOR19JTlBVVCAgIDAKKyNlbmRpZgorCisvKioKKyAqIExXSVBfTkVUQ09OTj09MTogRW5hYmxlIE5ldGNvbm4gQVBJIChyZXF1aXJlIHRvIHVzZSBhcGlfbGliLmMpCisgKi8KKyNpZm5kZWYgTFdJUF9ORVRDT05OCisjZGVmaW5lIExXSVBfTkVUQ09OTiAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qKiBMV0lQX1RDUElQX1RJTUVPVVQ9PTE6IEVuYWJsZSB0Y3BpcF90aW1lb3V0L3RjcGlwX3VudGltZW91dCB0b2QgY3JlYXRlCisgKiB0aW1lcnMgcnVubmluZyBpbiB0Y3BpcF90aHJlYWQgZnJvbSBhbm90aGVyIHRocmVhZC4KKyAqLworI2lmbmRlZiBMV0lQX1RDUElQX1RJTUVPVVQKKyNkZWZpbmUgTFdJUF9UQ1BJUF9USU1FT1VUICAgICAgICAgICAgICAxCisjZW5kaWYKKworLyoKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLSBTb2NrZXQgb3B0aW9ucyAtLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisvKioKKyAqIExXSVBfU09DS0VUPT0xOiBFbmFibGUgU29ja2V0IEFQSSAocmVxdWlyZSB0byB1c2Ugc29ja2V0cy5jKQorICovCisjaWZuZGVmIExXSVBfU09DS0VUCisjZGVmaW5lIExXSVBfU09DS0VUICAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qKgorICogTFdJUF9DT01QQVRfU09DS0VUUz09MTogRW5hYmxlIEJTRC1zdHlsZSBzb2NrZXRzIGZ1bmN0aW9ucyBuYW1lcy4KKyAqIChvbmx5IHVzZWQgaWYgeW91IHVzZSBzb2NrZXRzLmMpCisgKi8KKyNpZm5kZWYgTFdJUF9DT01QQVRfU09DS0VUUworI2RlZmluZSBMV0lQX0NPTVBBVF9TT0NLRVRTICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIExXSVBfUE9TSVhfU09DS0VUU19JT19OQU1FUz09MTogRW5hYmxlIFBPU0lYLXN0eWxlIHNvY2tldHMgZnVuY3Rpb25zIG5hbWVzLgorICogRGlzYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3UgdXNlIGEgUE9TSVggb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHVzZXMgdGhlIHNhbWUKKyAqIG5hbWVzIChyZWFkLCB3cml0ZSAmIGNsb3NlKS4gKG9ubHkgdXNlZCBpZiB5b3UgdXNlIHNvY2tldHMuYykKKyAqLworI2lmbmRlZiBMV0lQX1BPU0lYX1NPQ0tFVFNfSU9fTkFNRVMKKyNkZWZpbmUgTFdJUF9QT1NJWF9TT0NLRVRTX0lPX05BTUVTICAgICAxCisjZW5kaWYKKworLyoqCisgKiBMV0lQX1RDUF9LRUVQQUxJVkU9PTE6IEVuYWJsZSBUQ1BfS0VFUElETEUsIFRDUF9LRUVQSU5UVkwgYW5kIFRDUF9LRUVQQ05UCisgKiBvcHRpb25zIHByb2Nlc3NpbmcuIE5vdGUgdGhhdCBUQ1BfS0VFUElETEUgYW5kIFRDUF9LRUVQSU5UVkwgaGF2ZSB0byBiZSBzZXQKKyAqIGluIHNlY29uZHMuIChkb2VzIG5vdCByZXF1aXJlIHNvY2tldHMuYywgYW5kIHdpbGwgYWZmZWN0IHRjcC5jKQorICovCisjaWZuZGVmIExXSVBfVENQX0tFRVBBTElWRQorI2RlZmluZSBMV0lQX1RDUF9LRUVQQUxJVkUgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIExXSVBfU09fUkNWVElNRU89PTE6IEVuYWJsZSBTT19SQ1ZUSU1FTyBwcm9jZXNzaW5nLgorICovCisjaWZuZGVmIExXSVBfU09fUkNWVElNRU8KKyNkZWZpbmUgTFdJUF9TT19SQ1ZUSU1FTyAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBMV0lQX1NPX1JDVkJVRj09MTogRW5hYmxlIFNPX1JDVkJVRiBwcm9jZXNzaW5nLgorICovCisjaWZuZGVmIExXSVBfU09fUkNWQlVGCisjZGVmaW5lIExXSVBfU09fUkNWQlVGICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogSWYgTFdJUF9TT19SQ1ZCVUYgaXMgdXNlZCwgdGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgcmVjdl9idWZzaXplLgorICovCisjaWZuZGVmIFJFQ1ZfQlVGU0laRV9ERUZBVUxUCisjZGVmaW5lIFJFQ1ZfQlVGU0laRV9ERUZBVUxUICAgICAgICAgICAgSU5UX01BWAorI2VuZGlmCisKKy8qKgorICogU09fUkVVU0U9PTE6IEVuYWJsZSBTT19SRVVTRUFERFIgb3B0aW9uLgorICovCisjaWZuZGVmIFNPX1JFVVNFCisjZGVmaW5lIFNPX1JFVVNFICAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogU09fUkVVU0VfUlhUT0FMTD09MTogUGFzcyBhIGNvcHkgb2YgaW5jb21pbmcgYnJvYWRjYXN0L211bHRpY2FzdCBwYWNrZXRzCisgKiB0byBhbGwgbG9jYWwgbWF0Y2hlcyBpZiBTT19SRVVTRUFERFIgaXMgdHVybmVkIG9uLgorICogV0FSTklORzogQWRkcyBhIG1lbWNweSBmb3IgZXZlcnkgcGFja2V0IGlmIHBhc3NpbmcgdG8gbW9yZSB0aGFuIG9uZSBwY2IhCisgKi8KKyNpZm5kZWYgU09fUkVVU0VfUlhUT0FMTAorI2RlZmluZSBTT19SRVVTRV9SWFRPQUxMICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLSBTdGF0aXN0aWNzIG9wdGlvbnMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qKgorICogTFdJUF9TVEFUUz09MTogRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBpbiBsd2lwX3N0YXRzLgorICovCisjaWZuZGVmIExXSVBfU1RBVFMKKyNkZWZpbmUgTFdJUF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKworI2lmIExXSVBfU1RBVFMKKworLyoqCisgKiBMV0lQX1NUQVRTX0RJU1BMQVk9PTE6IENvbXBpbGUgaW4gdGhlIHN0YXRpc3RpY3Mgb3V0cHV0IGZ1bmN0aW9ucy4KKyAqLworI2lmbmRlZiBMV0lQX1NUQVRTX0RJU1BMQVkKKyNkZWZpbmUgTFdJUF9TVEFUU19ESVNQTEFZICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBMSU5LX1NUQVRTPT0xOiBFbmFibGUgbGluayBzdGF0cy4KKyAqLworI2lmbmRlZiBMSU5LX1NUQVRTCisjZGVmaW5lIExJTktfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qKgorICogRVRIQVJQX1NUQVRTPT0xOiBFbmFibGUgZXRoYXJwIHN0YXRzLgorICovCisjaWZuZGVmIEVUSEFSUF9TVEFUUworI2RlZmluZSBFVEhBUlBfU1RBVFMgICAgICAgICAgICAgICAgICAgIChMV0lQX0FSUCkKKyNlbmRpZgorCisvKioKKyAqIElQX1NUQVRTPT0xOiBFbmFibGUgSVAgc3RhdHMuCisgKi8KKyNpZm5kZWYgSVBfU1RBVFMKKyNkZWZpbmUgSVBfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKworLyoqCisgKiBJUEZSQUdfU1RBVFM9PTE6IEVuYWJsZSBJUCBmcmFnbWVudGF0aW9uIHN0YXRzLiBEZWZhdWx0IGlzCisgKiBvbiBpZiB1c2luZyBlaXRoZXIgZnJhZyBvciByZWFzcy4KKyAqLworI2lmbmRlZiBJUEZSQUdfU1RBVFMKKyNkZWZpbmUgSVBGUkFHX1NUQVRTICAgICAgICAgICAgICAgICAgICAoSVBfUkVBU1NFTUJMWSB8fCBJUF9GUkFHKQorI2VuZGlmCisKKy8qKgorICogSUNNUF9TVEFUUz09MTogRW5hYmxlIElDTVAgc3RhdHMuCisgKi8KKyNpZm5kZWYgSUNNUF9TVEFUUworI2RlZmluZSBJQ01QX1NUQVRTICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIElHTVBfU1RBVFM9PTE6IEVuYWJsZSBJR01QIHN0YXRzLgorICovCisjaWZuZGVmIElHTVBfU1RBVFMKKyNkZWZpbmUgSUdNUF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAoTFdJUF9JR01QKQorI2VuZGlmCisKKy8qKgorICogVURQX1NUQVRTPT0xOiBFbmFibGUgVURQIHN0YXRzLiBEZWZhdWx0IGlzIG9uIGlmCisgKiBVRFAgZW5hYmxlZCwgb3RoZXJ3aXNlIG9mZi4KKyAqLworI2lmbmRlZiBVRFBfU1RBVFMKKyNkZWZpbmUgVURQX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAoTFdJUF9VRFApCisjZW5kaWYKKworLyoqCisgKiBUQ1BfU1RBVFM9PTE6IEVuYWJsZSBUQ1Agc3RhdHMuIERlZmF1bHQgaXMgb24gaWYgVENQCisgKiBlbmFibGVkLCBvdGhlcndpc2Ugb2ZmLgorICovCisjaWZuZGVmIFRDUF9TVEFUUworI2RlZmluZSBUQ1BfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgIChMV0lQX1RDUCkKKyNlbmRpZgorCisvKioKKyAqIE1FTV9TVEFUUz09MTogRW5hYmxlIG1lbS5jIHN0YXRzLgorICovCisjaWZuZGVmIE1FTV9TVEFUUworI2RlZmluZSBNRU1fU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICgoTUVNX0xJQkNfTUFMTE9DID09IDApICYmIChNRU1fVVNFX1BPT0xTID09IDApKQorI2VuZGlmCisKKy8qKgorICogTUVNUF9TVEFUUz09MTogRW5hYmxlIG1lbXAuYyBwb29sIHN0YXRzLgorICovCisjaWZuZGVmIE1FTVBfU1RBVFMKKyNkZWZpbmUgTUVNUF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAoTUVNUF9NRU1fTUFMTE9DID09IDApCisjZW5kaWYKKworLyoqCisgKiBTWVNfU1RBVFM9PTE6IEVuYWJsZSBzeXN0ZW0gc3RhdHMgKHNlbSBhbmQgbWJveCBjb3VudHMsIGV0YykuCisgKi8KKyNpZm5kZWYgU1lTX1NUQVRTCisjZGVmaW5lIFNZU19TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgKE5PX1NZUyA9PSAwKQorI2VuZGlmCisKKyNlbHNlCisKKyNkZWZpbmUgTElOS19TVEFUUyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElQX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJUEZSQUdfU1RBVFMgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSUNNUF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElHTVBfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBVRFBfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVENQX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1FTV9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNRU1QX1NUQVRTICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExXSVBfU1RBVFNfRElTUExBWSAgICAgICAgICAgICAgMAorCisjZW5kaWYgLyogTFdJUF9TVEFUUyAqLworCisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIFBQUCBvcHRpb25zIC0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qKgorICogUFBQX1NVUFBPUlQ9PTE6IEVuYWJsZSBQUFAuCisgKi8KKyNpZm5kZWYgUFBQX1NVUFBPUlQKKyNkZWZpbmUgUFBQX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBQUFBPRV9TVVBQT1JUPT0xOiBFbmFibGUgUFBQIE92ZXIgRXRoZXJuZXQKKyAqLworI2lmbmRlZiBQUFBPRV9TVVBQT1JUCisjZGVmaW5lIFBQUE9FX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogUFBQT1NfU1VQUE9SVD09MTogRW5hYmxlIFBQUCBPdmVyIFNlcmlhbAorICovCisjaWZuZGVmIFBQUE9TX1NVUFBPUlQKKyNkZWZpbmUgUFBQT1NfU1VQUE9SVCAgICAgICAgICAgICAgICAgICBQUFBfU1VQUE9SVAorI2VuZGlmCisKKyNpZiBQUFBfU1VQUE9SVAorCisvKioKKyAqIE5VTV9QUFA6IE1heCBQUFAgc2Vzc2lvbnMuCisgKi8KKyNpZm5kZWYgTlVNX1BQUAorI2RlZmluZSBOVU1fUFBQICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIFBBUF9TVVBQT1JUPT0xOiBTdXBwb3J0IFBBUC4KKyAqLworI2lmbmRlZiBQQVBfU1VQUE9SVAorI2RlZmluZSBQQVBfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIENIQVBfU1VQUE9SVD09MTogU3VwcG9ydCBDSEFQLgorICovCisjaWZuZGVmIENIQVBfU1VQUE9SVAorI2RlZmluZSBDSEFQX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIE1TQ0hBUF9TVVBQT1JUPT0xOiBTdXBwb3J0IE1TQ0hBUC4gQ1VSUkVOVExZIE5PVCBTVVBQT1JURUQhIERPIE5PVCBTRVQhCisgKi8KKyNpZm5kZWYgTVNDSEFQX1NVUFBPUlQKKyNkZWZpbmUgTVNDSEFQX1NVUFBPUlQgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBDQkNQX1NVUFBPUlQ9PTE6IFN1cHBvcnQgQ0JDUC4gQ1VSUkVOVExZIE5PVCBTVVBQT1JURUQhIERPIE5PVCBTRVQhCisgKi8KKyNpZm5kZWYgQ0JDUF9TVVBQT1JUCisjZGVmaW5lIENCQ1BfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qKgorICogQ0NQX1NVUFBPUlQ9PTE6IFN1cHBvcnQgQ0NQLiBDVVJSRU5UTFkgTk9UIFNVUFBPUlRFRCEgRE8gTk9UIFNFVCEKKyAqLworI2lmbmRlZiBDQ1BfU1VQUE9SVAorI2RlZmluZSBDQ1BfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKioKKyAqIFZKX1NVUFBPUlQ9PTE6IFN1cHBvcnQgVkogaGVhZGVyIGNvbXByZXNzaW9uLgorICovCisjaWZuZGVmIFZKX1NVUFBPUlQKKyNkZWZpbmUgVkpfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoqCisgKiBNRDVfU1VQUE9SVD09MTogU3VwcG9ydCBNRDUgKHNlZSBhbHNvIENIQVApLgorICovCisjaWZuZGVmIE1ENV9TVVBQT1JUCisjZGVmaW5lIE1ENV9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgKiBUaW1lb3V0cworICovCisjaWZuZGVmIEZTTV9ERUZUSU1FT1VUCisjZGVmaW5lIEZTTV9ERUZUSU1FT1VUICAgICAgICAgICAgICAgICAgNiAgICAgICAvKiBUaW1lb3V0IHRpbWUgaW4gc2Vjb25kcyAqLworI2VuZGlmCisKKyNpZm5kZWYgRlNNX0RFRk1BWFRFUk1SRVFTCisjZGVmaW5lIEZTTV9ERUZNQVhURVJNUkVRUyAgICAgICAgICAgICAgMiAgICAgICAvKiBNYXhpbXVtIFRlcm1pbmF0ZS1SZXF1ZXN0IHRyYW5zbWlzc2lvbnMgKi8KKyNlbmRpZgorCisjaWZuZGVmIEZTTV9ERUZNQVhDT05GUkVRUworI2RlZmluZSBGU01fREVGTUFYQ09ORlJFUVMgICAgICAgICAgICAgIDEwICAgICAgLyogTWF4aW11bSBDb25maWd1cmUtUmVxdWVzdCB0cmFuc21pc3Npb25zICovCisjZW5kaWYKKworI2lmbmRlZiBGU01fREVGTUFYTkFLTE9PUFMKKyNkZWZpbmUgRlNNX0RFRk1BWE5BS0xPT1BTICAgICAgICAgICAgICA1ICAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIG5hayBsb29wcyAqLworI2VuZGlmCisKKyNpZm5kZWYgVVBBUF9ERUZUSU1FT1VUCisjZGVmaW5lIFVQQVBfREVGVElNRU9VVCAgICAgICAgICAgICAgICAgNiAgICAgICAvKiBUaW1lb3V0IChzZWNvbmRzKSBmb3IgcmV0cmFuc21pdHRpbmcgcmVxICovCisjZW5kaWYKKworI2lmbmRlZiBVUEFQX0RFRlJFUVRJTUUKKyNkZWZpbmUgVVBBUF9ERUZSRVFUSU1FICAgICAgICAgICAgICAgICAzMCAgICAgIC8qIFRpbWUgdG8gd2FpdCBmb3IgYXV0aC1yZXEgZnJvbSBwZWVyICovCisjZW5kaWYKKworI2lmbmRlZiBDSEFQX0RFRlRJTUVPVVQKKyNkZWZpbmUgQ0hBUF9ERUZUSU1FT1VUICAgICAgICAgICAgICAgICA2ICAgICAgIC8qIFRpbWVvdXQgdGltZSBpbiBzZWNvbmRzICovCisjZW5kaWYKKworI2lmbmRlZiBDSEFQX0RFRlRSQU5TTUlUUworI2RlZmluZSBDSEFQX0RFRlRSQU5TTUlUUyAgICAgICAgICAgICAgIDEwICAgICAgLyogbWF4ICMgdGltZXMgdG8gc2VuZCBjaGFsbGVuZ2UgKi8KKyNlbmRpZgorCisvKiBJbnRlcnZhbCBpbiBzZWNvbmRzIGJldHdlZW4ga2VlcGFsaXZlIGVjaG8gcmVxdWVzdHMsIDAgdG8gZGlzYWJsZS4gKi8KKyNpZm5kZWYgTENQX0VDSE9JTlRFUlZBTAorI2RlZmluZSBMQ1BfRUNIT0lOVEVSVkFMICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgdW5hbnN3ZXJlZCBlY2hvIHJlcXVlc3RzIGJlZm9yZSBmYWlsdXJlLiAqLworI2lmbmRlZiBMQ1BfTUFYRUNIT0ZBSUxTCisjZGVmaW5lIExDUF9NQVhFQ0hPRkFJTFMgICAgICAgICAgICAgICAgMworI2VuZGlmCisKKy8qIE1heCBYbWl0IGlkbGUgdGltZSAoaW4gamlmZmllcykgYmVmb3JlIHJlc2VuZCBmbGFnIGNoYXIuICovCisjaWZuZGVmIFBQUF9NQVhJRExFRkxBRworI2RlZmluZSBQUFBfTUFYSURMRUZMQUcgICAgICAgICAgICAgICAgIDEwMAorI2VuZGlmCisKKy8qCisgKiBQYWNrZXQgc2l6ZXMKKyAqCisgKiBOb3RlIC0gbGNwIHNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIG5lZ290aWF0ZSBzdHVmZiBvdXRzaWRlIHRoZXNlCisgKiAgICBsaW1pdHMuICBTZWUgbGNwLmggaW4gdGhlIHBwcGQgZGlyZWN0b3J5LgorICogKFhYWCAtIHRoZXNlIGNvbnN0YW50cyBzaG91bGQgc2ltcGx5IGJlIHNoYXJlZCBieSBsY3AuYyBpbnN0ZWFkCisgKiAgICBvZiBsaXZpbmcgaW4gbGNwLmgpCisgKi8KKyNkZWZpbmUgUFBQX01UVSAgICAgICAgICAgICAgICAgICAgICAgICAxNTAwICAgICAvKiBEZWZhdWx0IE1UVSAoc2l6ZSBvZiBJbmZvIGZpZWxkKSAqLworI2lmbmRlZiBQUFBfTUFYTVRVCisvKiAjZGVmaW5lIFBQUF9NQVhNVFUgIDY1NTM1IC0gKFBQUF9IRFJMRU4gKyBQUFBfRkNTTEVOKSAqLworI2RlZmluZSBQUFBfTUFYTVRVICAgICAgICAgICAgICAgICAgICAgIDE1MDAgLyogTGFyZ2VzdCBNVFUgd2UgYWxsb3cgKi8KKyNlbmRpZgorI2RlZmluZSBQUFBfTUlOTVRVICAgICAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFBQUF9NUlUgICAgICAgICAgICAgICAgICAgICAgICAgMTUwMCAgICAgLyogZGVmYXVsdCBNUlUgPSBtYXggbGVuZ3RoIG9mIGluZm8gZmllbGQgKi8KKyNkZWZpbmUgUFBQX01BWE1SVSAgICAgICAgICAgICAgICAgICAgICAxNTAwICAgICAvKiBMYXJnZXN0IE1SVSB3ZSBhbGxvdyAqLworI2lmbmRlZiBQUFBfREVGTVJVCisjZGVmaW5lIFBQUF9ERUZNUlUgICAgICAgICAgICAgICAgICAgICAgMjk2ICAgICAgICAgICAgIC8qIFRyeSBmb3IgdGhpcyAqLworI2VuZGlmCisjZGVmaW5lIFBQUF9NSU5NUlUgICAgICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgICAgIC8qIE5vIE1SVXMgYmVsb3cgdGhpcyAqLworCisjaWZuZGVmIE1BWE5BTUVMRU4KKyNkZWZpbmUgTUFYTkFNRUxFTiAgICAgICAgICAgICAgICAgICAgICAyNTYgICAgIC8qIG1heCBsZW5ndGggb2YgaG9zdG5hbWUgb3IgbmFtZSBmb3IgYXV0aCAqLworI2VuZGlmCisjaWZuZGVmIE1BWFNFQ1JFVExFTgorI2RlZmluZSBNQVhTRUNSRVRMRU4gICAgICAgICAgICAgICAgICAgIDI1NiAgICAgLyogbWF4IGxlbmd0aCBvZiBwYXNzd29yZCBvciBzZWNyZXQgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogUFBQX1NVUFBPUlQgKi8KKworLyoKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIENoZWNrc3VtIG9wdGlvbnMgLS0tLS0tLS0tLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisvKioKKyAqIENIRUNLU1VNX0dFTl9JUD09MTogR2VuZXJhdGUgY2hlY2tzdW1zIGluIHNvZnR3YXJlIGZvciBvdXRnb2luZyBJUCBwYWNrZXRzLgorICovCisjaWZuZGVmIENIRUNLU1VNX0dFTl9JUAorI2RlZmluZSBDSEVDS1NVTV9HRU5fSVAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorIAorLyoqCisgKiBDSEVDS1NVTV9HRU5fVURQPT0xOiBHZW5lcmF0ZSBjaGVja3N1bXMgaW4gc29mdHdhcmUgZm9yIG91dGdvaW5nIFVEUCBwYWNrZXRzLgorICovCisjaWZuZGVmIENIRUNLU1VNX0dFTl9VRFAKKyNkZWZpbmUgQ0hFQ0tTVU1fR0VOX1VEUCAgICAgICAgICAgICAgICAxCisjZW5kaWYKKyAKKy8qKgorICogQ0hFQ0tTVU1fR0VOX1RDUD09MTogR2VuZXJhdGUgY2hlY2tzdW1zIGluIHNvZnR3YXJlIGZvciBvdXRnb2luZyBUQ1AgcGFja2V0cy4KKyAqLworI2lmbmRlZiBDSEVDS1NVTV9HRU5fVENQCisjZGVmaW5lIENIRUNLU1VNX0dFTl9UQ1AgICAgICAgICAgICAgICAgMQorI2VuZGlmCisgCisvKioKKyAqIENIRUNLU1VNX0NIRUNLX0lQPT0xOiBDaGVjayBjaGVja3N1bXMgaW4gc29mdHdhcmUgZm9yIGluY29taW5nIElQIHBhY2tldHMuCisgKi8KKyNpZm5kZWYgQ0hFQ0tTVU1fQ0hFQ0tfSVAKKyNkZWZpbmUgQ0hFQ0tTVU1fQ0hFQ0tfSVAgICAgICAgICAgICAgICAxCisjZW5kaWYKKyAKKy8qKgorICogQ0hFQ0tTVU1fQ0hFQ0tfVURQPT0xOiBDaGVjayBjaGVja3N1bXMgaW4gc29mdHdhcmUgZm9yIGluY29taW5nIFVEUCBwYWNrZXRzLgorICovCisjaWZuZGVmIENIRUNLU1VNX0NIRUNLX1VEUAorI2RlZmluZSBDSEVDS1NVTV9DSEVDS19VRFAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKioKKyAqIENIRUNLU1VNX0NIRUNLX1RDUD09MTogQ2hlY2sgY2hlY2tzdW1zIGluIHNvZnR3YXJlIGZvciBpbmNvbWluZyBUQ1AgcGFja2V0cy4KKyAqLworI2lmbmRlZiBDSEVDS1NVTV9DSEVDS19UQ1AKKyNkZWZpbmUgQ0hFQ0tTVU1fQ0hFQ0tfVENQICAgICAgICAgICAgICAxCisjZW5kaWYKKworLyoqCisgKiBMV0lQX0NIRUNLU1VNX09OX0NPUFk9PTE6IENhbGN1bGF0ZSBjaGVja3N1bSB3aGVuIGNvcHlpbmcgZGF0YSBmcm9tCisgKiBhcHBsaWNhdGlvbiBidWZmZXJzIHRvIHBidWZzLgorICovCisjaWZuZGVmIExXSVBfQ0hFQ0tTVU1fT05fQ09QWQorI2RlZmluZSBMV0lQX0NIRUNLU1VNX09OX0NPUFkgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLS0tLS0tLS0tIERlYnVnZ2luZyBvcHRpb25zIC0tLS0tLS0tLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qKgorICogTFdJUF9EQkdfTUlOX0xFVkVMOiBBZnRlciBtYXNraW5nLCB0aGUgdmFsdWUgb2YgdGhlIGRlYnVnIGlzCisgKiBjb21wYXJlZCBhZ2FpbnN0IHRoaXMgdmFsdWUuIElmIGl0IGlzIHNtYWxsZXIsIHRoZW4gZGVidWdnaW5nCisgKiBtZXNzYWdlcyBhcmUgd3JpdHRlbi4KKyAqLworI2lmbmRlZiBMV0lQX0RCR19NSU5fTEVWRUwKKyNkZWZpbmUgTFdJUF9EQkdfTUlOX0xFVkVMICAgICAgICAgICAgICBMV0lQX0RCR19MRVZFTF9BTEwKKyNlbmRpZgorCisvKioKKyAqIExXSVBfREJHX1RZUEVTX09OOiBBIG1hc2sgdGhhdCBjYW4gYmUgdXNlZCB0byBnbG9iYWxseSBlbmFibGUvZGlzYWJsZQorICogZGVidWcgbWVzc2FnZXMgb2YgY2VydGFpbiB0eXBlcy4KKyAqLworI2lmbmRlZiBMV0lQX0RCR19UWVBFU19PTgorI2RlZmluZSBMV0lQX0RCR19UWVBFU19PTiAgICAgICAgICAgICAgIExXSVBfREJHX09OCisjZW5kaWYKKworLyoqCisgKiBFVEhBUlBfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gZXRoYXJwLmMuCisgKi8KKyNpZm5kZWYgRVRIQVJQX0RFQlVHCisjZGVmaW5lIEVUSEFSUF9ERUJVRyAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBORVRJRl9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBuZXRpZi5jLgorICovCisjaWZuZGVmIE5FVElGX0RFQlVHCisjZGVmaW5lIE5FVElGX0RFQlVHICAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBVTkRJSUZfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gdW5kaWlmLmMuCisgKi8KKyNpZm5kZWYgVU5ESUlGX0RFQlVHCisjZGVmaW5lIFVORElJRl9ERUJVRyAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogVU5ESUlGX0FSUF9ERUJVRzogRW5hYmxlIEVUSEFSUCBkZWJ1Z2dpbmcgaW4gdW5kaWlmLmMuCisgKi8KKyNpZm5kZWYgVU5ESUlGX0FSUF9ERUJVRworI2RlZmluZSBVTkRJSUZfQVJQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBVTkRJSUZfTkVUX0RFQlVHOiBFbmFibGUgTkVUSUYgZGVidWdnaW5nIGluIHVuZGlpZi5jLgorICovCisjaWZuZGVmIFVORElJRl9ORVRfREVCVUcKKyNkZWZpbmUgVU5ESUlGX05FVF9ERUJVRyAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogVU5ESUlGX0lEX0RFQlVHOiBFbmFibGUgZGVidWdnaW5nIHRvIGlkZW50aWZ5IHBhY2tldHMgaW4gdW5kaWlmLmMuCisgKi8KKyNpZm5kZWYgVU5ESUlGX0lEX0RFQlVHCisjZGVmaW5lIFVORElJRl9JRF9ERUJVRyAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogUEJVRl9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBwYnVmLmMuCisgKi8KKyNpZm5kZWYgUEJVRl9ERUJVRworI2RlZmluZSBQQlVGX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogQVBJX0xJQl9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBhcGlfbGliLmMuCisgKi8KKyNpZm5kZWYgQVBJX0xJQl9ERUJVRworI2RlZmluZSBBUElfTElCX0RFQlVHICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogQVBJX01TR19ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBhcGlfbXNnLmMuCisgKi8KKyNpZm5kZWYgQVBJX01TR19ERUJVRworI2RlZmluZSBBUElfTVNHX0RFQlVHICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogU09DS0VUU19ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBzb2NrZXRzLmMuCisgKi8KKyNpZm5kZWYgU09DS0VUU19ERUJVRworI2RlZmluZSBTT0NLRVRTX0RFQlVHICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogSUNNUF9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBpY21wLmMuCisgKi8KKyNpZm5kZWYgSUNNUF9ERUJVRworI2RlZmluZSBJQ01QX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogSUdNUF9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBpZ21wLmMuCisgKi8KKyNpZm5kZWYgSUdNUF9ERUJVRworI2RlZmluZSBJR01QX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogSU5FVF9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBpbmV0LmMuCisgKi8KKyNpZm5kZWYgSU5FVF9ERUJVRworI2RlZmluZSBJTkVUX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogSVBfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgZm9yIElQLgorICovCisjaWZuZGVmIElQX0RFQlVHCisjZGVmaW5lIElQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBJUF9SRUFTU19ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBpcF9mcmFnLmMgZm9yIGJvdGggZnJhZyAmIHJlYXNzLgorICovCisjaWZuZGVmIElQX1JFQVNTX0RFQlVHCisjZGVmaW5lIElQX1JFQVNTX0RFQlVHICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBSQVdfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gcmF3LmMuCisgKi8KKyNpZm5kZWYgUkFXX0RFQlVHCisjZGVmaW5lIFJBV19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBNRU1fREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gbWVtLmMuCisgKi8KKyNpZm5kZWYgTUVNX0RFQlVHCisjZGVmaW5lIE1FTV9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBNRU1QX0RFQlVHOiBFbmFibGUgZGVidWdnaW5nIGluIG1lbXAuYy4KKyAqLworI2lmbmRlZiBNRU1QX0RFQlVHCisjZGVmaW5lIE1FTVBfREVCVUcgICAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBTWVNfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gc3lzLmMuCisgKi8KKyNpZm5kZWYgU1lTX0RFQlVHCisjZGVmaW5lIFNZU19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBUSU1FUlNfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gdGltZXJzLmMuCisgKi8KKyNpZm5kZWYgVElNRVJTX0RFQlVHCisjZGVmaW5lIFRJTUVSU19ERUJVRyAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBUQ1BfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgZm9yIFRDUC4KKyAqLworI2lmbmRlZiBUQ1BfREVCVUcKKyNkZWZpbmUgVENQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICBMV0lQX0RCR19PRkYKKyNlbmRpZgorCisvKioKKyAqIFRDUF9JTlBVVF9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiB0Y3BfaW4uYyBmb3IgaW5jb21pbmcgZGVidWcuCisgKi8KKyNpZm5kZWYgVENQX0lOUFVUX0RFQlVHCisjZGVmaW5lIFRDUF9JTlBVVF9ERUJVRyAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBUQ1BfRlJfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gdGNwX2luLmMgZm9yIGZhc3QgcmV0cmFuc21pdC4KKyAqLworI2lmbmRlZiBUQ1BfRlJfREVCVUcKKyNkZWZpbmUgVENQX0ZSX0RFQlVHICAgICAgICAgICAgICAgICAgICBMV0lQX0RCR19PRkYKKyNlbmRpZgorCisvKioKKyAqIFRDUF9SVE9fREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gVENQIGZvciByZXRyYW5zbWl0CisgKiB0aW1lb3V0LgorICovCisjaWZuZGVmIFRDUF9SVE9fREVCVUcKKyNkZWZpbmUgVENQX1JUT19ERUJVRyAgICAgICAgICAgICAgICAgICBMV0lQX0RCR19PRkYKKyNlbmRpZgorCisvKioKKyAqIFRDUF9DV05EX0RFQlVHOiBFbmFibGUgZGVidWdnaW5nIGZvciBUQ1AgY29uZ2VzdGlvbiB3aW5kb3cuCisgKi8KKyNpZm5kZWYgVENQX0NXTkRfREVCVUcKKyNkZWZpbmUgVENQX0NXTkRfREVCVUcgICAgICAgICAgICAgICAgICBMV0lQX0RCR19PRkYKKyNlbmRpZgorCisvKioKKyAqIFRDUF9XTkRfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gdGNwX2luLmMgZm9yIHdpbmRvdyB1cGRhdGluZy4KKyAqLworI2lmbmRlZiBUQ1BfV05EX0RFQlVHCisjZGVmaW5lIFRDUF9XTkRfREVCVUcgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBUQ1BfT1VUUFVUX0RFQlVHOiBFbmFibGUgZGVidWdnaW5nIGluIHRjcF9vdXQuYyBvdXRwdXQgZnVuY3Rpb25zLgorICovCisjaWZuZGVmIFRDUF9PVVRQVVRfREVCVUcKKyNkZWZpbmUgVENQX09VVFBVVF9ERUJVRyAgICAgICAgICAgICAgICBMV0lQX0RCR19PRkYKKyNlbmRpZgorCisvKioKKyAqIFRDUF9SU1RfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgZm9yIFRDUCB3aXRoIHRoZSBSU1QgbWVzc2FnZS4KKyAqLworI2lmbmRlZiBUQ1BfUlNUX0RFQlVHCisjZGVmaW5lIFRDUF9SU1RfREVCVUcgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBUQ1BfUUxFTl9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBmb3IgVENQIHF1ZXVlIGxlbmd0aHMuCisgKi8KKyNpZm5kZWYgVENQX1FMRU5fREVCVUcKKyNkZWZpbmUgVENQX1FMRU5fREVCVUcgICAgICAgICAgICAgICAgICBMV0lQX0RCR19PRkYKKyNlbmRpZgorCisvKioKKyAqIFVEUF9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBVRFAuCisgKi8KKyNpZm5kZWYgVURQX0RFQlVHCisjZGVmaW5lIFVEUF9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBUQ1BJUF9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiB0Y3BpcC5jLgorICovCisjaWZuZGVmIFRDUElQX0RFQlVHCisjZGVmaW5lIFRDUElQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgTFdJUF9EQkdfT0ZGCisjZW5kaWYKKworLyoqCisgKiBQUFBfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgZm9yIFBQUC4KKyAqLworI2lmbmRlZiBQUFBfREVCVUcKKyNkZWZpbmUgUFBQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICBMV0lQX0RCR19PRkYKKyNlbmRpZgorCisvKioKKyAqIFNMSVBfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgaW4gc2xpcGlmLmMuCisgKi8KKyNpZm5kZWYgU0xJUF9ERUJVRworI2RlZmluZSBTTElQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogREhDUF9ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBpbiBkaGNwLmMuCisgKi8KKyNpZm5kZWYgREhDUF9ERUJVRworI2RlZmluZSBESENQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogQVVUT0lQX0RFQlVHOiBFbmFibGUgZGVidWdnaW5nIGluIGF1dG9pcC5jLgorICovCisjaWZuZGVmIEFVVE9JUF9ERUJVRworI2RlZmluZSBBVVRPSVBfREVCVUcgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKy8qKgorICogU05NUF9NU0dfREVCVUc6IEVuYWJsZSBkZWJ1Z2dpbmcgZm9yIFNOTVAgbWVzc2FnZXMuCisgKi8KKyNpZm5kZWYgU05NUF9NU0dfREVCVUcKKyNkZWZpbmUgU05NUF9NU0dfREVCVUcgICAgICAgICAgICAgICAgICBMV0lQX0RCR19PRkYKKyNlbmRpZgorCisvKioKKyAqIFNOTVBfTUlCX0RFQlVHOiBFbmFibGUgZGVidWdnaW5nIGZvciBTTk1QIE1JQnMuCisgKi8KKyNpZm5kZWYgU05NUF9NSUJfREVCVUcKKyNkZWZpbmUgU05NUF9NSUJfREVCVUcgICAgICAgICAgICAgICAgICBMV0lQX0RCR19PRkYKKyNlbmRpZgorCisvKioKKyAqIEROU19ERUJVRzogRW5hYmxlIGRlYnVnZ2luZyBmb3IgRE5TLgorICovCisjaWZuZGVmIEROU19ERUJVRworI2RlZmluZSBETlNfREVCVUcgICAgICAgICAgICAgICAgICAgICAgIExXSVBfREJHX09GRgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXSVBfT1BUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvcGJ1Zi5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvcGJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWQ2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9wYnVmLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpZm5kZWYgX19MV0lQX1BCVUZfSF9fCisjZGVmaW5lIF9fTFdJUF9QQlVGX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKyNpbmNsdWRlICJsd2lwL2Vyci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBDdXJyZW50bHksIHRoZSBwYnVmX2N1c3RvbSBjb2RlIGlzIG9ubHkgbmVlZGVkIGZvciBvbmUgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICogb2YgSVBfRlJBRyAqLworI2RlZmluZSBMV0lQX1NVUFBPUlRfQ1VTVE9NX1BCVUYgKElQX0ZSQUcgJiYgIUlQX0ZSQUdfVVNFU19TVEFUSUNfQlVGICYmICFMV0lQX05FVElGX1RYX1NJTkdMRV9QQlVGKQorCisjZGVmaW5lIFBCVUZfVFJBTlNQT1JUX0hMRU4gMjAKKyNkZWZpbmUgUEJVRl9JUF9ITEVOICAgICAgICAyMAorCit0eXBlZGVmIGVudW0geworICBQQlVGX1RSQU5TUE9SVCwKKyAgUEJVRl9JUCwKKyAgUEJVRl9MSU5LLAorICBQQlVGX1JBVworfSBwYnVmX2xheWVyOworCit0eXBlZGVmIGVudW0geworICBQQlVGX1JBTSwgLyogcGJ1ZiBkYXRhIGlzIHN0b3JlZCBpbiBSQU0gKi8KKyAgUEJVRl9ST00sIC8qIHBidWYgZGF0YSBpcyBzdG9yZWQgaW4gUk9NICovCisgIFBCVUZfUkVGLCAvKiBwYnVmIGNvbWVzIGZyb20gdGhlIHBidWYgcG9vbCAqLworICBQQlVGX1BPT0wgLyogcGJ1ZiBwYXlsb2FkIHJlZmVycyB0byBSQU0gKi8KK30gcGJ1Zl90eXBlOworCisKKy8qKiBpbmRpY2F0ZXMgdGhpcyBwYWNrZXQncyBkYXRhIHNob3VsZCBiZSBpbW1lZGlhdGVseSBwYXNzZWQgdG8gdGhlIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIFBCVUZfRkxBR19QVVNIICAgICAgMHgwMVUKKy8qKiBpbmRpY2F0ZXMgdGhpcyBpcyBhIGN1c3RvbSBwYnVmOiBwYnVmX2ZyZWUgYW5kIHBidWZfaGVhZGVyIGhhbmRsZSBzdWNoIGEKKyAgICBhIHBidWYgZGlmZmVyZW50bHkgKi8KKyNkZWZpbmUgUEJVRl9GTEFHX0lTX0NVU1RPTSAweDAyVQorLyoqIGluZGljYXRlcyB0aGlzIHBidWYgaXMgVURQIG11bHRpY2FzdCB0byBiZSBsb29wZWQgYmFjayAqLworI2RlZmluZSBQQlVGX0ZMQUdfTUNBU1RMT09QIDB4MDRVCisKK3N0cnVjdCBwYnVmIHsKKyAgLyoqIG5leHQgcGJ1ZiBpbiBzaW5nbHkgbGlua2VkIHBidWYgY2hhaW4gKi8KKyAgc3RydWN0IHBidWYgKm5leHQ7CisKKyAgLyoqIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBkYXRhIGluIHRoZSBidWZmZXIgKi8KKyAgdm9pZCAqcGF5bG9hZDsKKworICAvKioKKyAgICogdG90YWwgbGVuZ3RoIG9mIHRoaXMgYnVmZmVyIGFuZCBhbGwgbmV4dCBidWZmZXJzIGluIGNoYWluCisgICAqIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBwYWNrZXQuCisgICAqCisgICAqIEZvciBub24tcXVldWUgcGFja2V0IGNoYWlucyB0aGlzIGlzIHRoZSBpbnZhcmlhbnQ6CisgICAqIHAtPnRvdF9sZW4gPT0gcC0+bGVuICsgKHAtPm5leHQ/IHAtPm5leHQtPnRvdF9sZW46IDApCisgICAqLworICB1MTZfdCB0b3RfbGVuOworCisgIC8qKiBsZW5ndGggb2YgdGhpcyBidWZmZXIgKi8KKyAgdTE2X3QgbGVuOworCisgIC8qKiBwYnVmX3R5cGUgYXMgdThfdCBpbnN0ZWFkIG9mIGVudW0gdG8gc2F2ZSBzcGFjZSAqLworICB1OF90IC8qcGJ1Zl90eXBlKi8gdHlwZTsKKworICAvKiogbWlzYyBmbGFncyAqLworICB1OF90IGZsYWdzOworCisgIC8qKgorICAgKiB0aGUgcmVmZXJlbmNlIGNvdW50IGFsd2F5cyBlcXVhbHMgdGhlIG51bWJlciBvZiBwb2ludGVycworICAgKiB0aGF0IHJlZmVyIHRvIHRoaXMgcGJ1Zi4gVGhpcyBjYW4gYmUgcG9pbnRlcnMgZnJvbSBhbiBhcHBsaWNhdGlvbiwKKyAgICogdGhlIHN0YWNrIGl0c2VsZiwgb3IgcGJ1Zi0+bmV4dCBwb2ludGVycyBmcm9tIGEgY2hhaW4uCisgICAqLworICB1MTZfdCByZWY7Cit9OworCisjaWYgTFdJUF9TVVBQT1JUX0NVU1RPTV9QQlVGCisvKiogUHJvdG90eXBlIGZvciBhIGZ1bmN0aW9uIHRvIGZyZWUgYSBjdXN0b20gcGJ1ZiAqLwordHlwZWRlZiB2b2lkICgqcGJ1Zl9mcmVlX2N1c3RvbV9mbikoc3RydWN0IHBidWYgKnApOworCisvKiogQSBjdXN0b20gcGJ1ZjogbGlrZSBhIHBidWYsIGJ1dCBmb2xsb3dpbmcgYSBmdW5jdGlvbiBwb2ludGVyIHRvIGZyZWUgaXQuICovCitzdHJ1Y3QgcGJ1Zl9jdXN0b20geworICAvKiogVGhlIGFjdHVhbCBwYnVmICovCisgIHN0cnVjdCBwYnVmIHBidWY7CisgIC8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHBidWZfZnJlZSBkZWFsbG9jYXRlcyB0aGlzIHBidWYoX2N1c3RvbSkgKi8KKyAgcGJ1Zl9mcmVlX2N1c3RvbV9mbiBjdXN0b21fZnJlZV9mdW5jdGlvbjsKK307CisjZW5kaWYgLyogTFdJUF9TVVBQT1JUX0NVU1RPTV9QQlVGICovCisKKy8qIEluaXRpYWxpemVzIHRoZSBwYnVmIG1vZHVsZS4gVGhpcyBjYWxsIGlzIGVtcHR5IGZvciBub3csIGJ1dCBtYXkgbm90IGJlIGluIGZ1dHVyZS4gKi8KKyNkZWZpbmUgcGJ1Zl9pbml0KCkKKworc3RydWN0IHBidWYgKnBidWZfYWxsb2MocGJ1Zl9sYXllciBsLCB1MTZfdCBsZW5ndGgsIHBidWZfdHlwZSB0eXBlKTsKKyNpZiBMV0lQX1NVUFBPUlRfQ1VTVE9NX1BCVUYKK3N0cnVjdCBwYnVmICpwYnVmX2FsbG9jZWRfY3VzdG9tKHBidWZfbGF5ZXIgbCwgdTE2X3QgbGVuZ3RoLCBwYnVmX3R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYnVmX2N1c3RvbSAqcCwgdm9pZCAqcGF5bG9hZF9tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBwYXlsb2FkX21lbV9sZW4pOworI2VuZGlmIC8qIExXSVBfU1VQUE9SVF9DVVNUT01fUEJVRiAqLwordm9pZCBwYnVmX3JlYWxsb2Moc3RydWN0IHBidWYgKnAsIHUxNl90IHNpemUpOyAKK3U4X3QgcGJ1Zl9oZWFkZXIoc3RydWN0IHBidWYgKnAsIHMxNl90IGhlYWRlcl9zaXplKTsKK3ZvaWQgcGJ1Zl9yZWYoc3RydWN0IHBidWYgKnApOwordThfdCBwYnVmX2ZyZWUoc3RydWN0IHBidWYgKnApOwordThfdCBwYnVmX2NsZW4oc3RydWN0IHBidWYgKnApOyAgCit2b2lkIHBidWZfY2F0KHN0cnVjdCBwYnVmICpoZWFkLCBzdHJ1Y3QgcGJ1ZiAqdGFpbCk7Cit2b2lkIHBidWZfY2hhaW4oc3RydWN0IHBidWYgKmhlYWQsIHN0cnVjdCBwYnVmICp0YWlsKTsKK3N0cnVjdCBwYnVmICpwYnVmX2RlY2hhaW4oc3RydWN0IHBidWYgKnApOworZXJyX3QgcGJ1Zl9jb3B5KHN0cnVjdCBwYnVmICpwX3RvLCBzdHJ1Y3QgcGJ1ZiAqcF9mcm9tKTsKK3UxNl90IHBidWZfY29weV9wYXJ0aWFsKHN0cnVjdCBwYnVmICpwLCB2b2lkICpkYXRhcHRyLCB1MTZfdCBsZW4sIHUxNl90IG9mZnNldCk7CitlcnJfdCBwYnVmX3Rha2Uoc3RydWN0IHBidWYgKmJ1ZiwgY29uc3Qgdm9pZCAqZGF0YXB0ciwgdTE2X3QgbGVuKTsKK3N0cnVjdCBwYnVmICpwYnVmX2NvYWxlc2NlKHN0cnVjdCBwYnVmICpwLCBwYnVmX2xheWVyIGxheWVyKTsKKyNpZiBMV0lQX0NIRUNLU1VNX09OX0NPUFkKK2Vycl90IHBidWZfZmlsbF9jaGtzdW0oc3RydWN0IHBidWYgKnAsIHUxNl90IHN0YXJ0X29mZnNldCwgY29uc3Qgdm9pZCAqZGF0YXB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgbGVuLCB1MTZfdCAqY2hrc3VtKTsKKyNlbmRpZiAvKiBMV0lQX0NIRUNLU1VNX09OX0NPUFkgKi8KKwordThfdCBwYnVmX2dldF9hdChzdHJ1Y3QgcGJ1ZiogcCwgdTE2X3Qgb2Zmc2V0KTsKK3UxNl90IHBidWZfbWVtY21wKHN0cnVjdCBwYnVmKiBwLCB1MTZfdCBvZmZzZXQsIGNvbnN0IHZvaWQqIHMyLCB1MTZfdCBuKTsKK3UxNl90IHBidWZfbWVtZmluZChzdHJ1Y3QgcGJ1ZiogcCwgY29uc3Qgdm9pZCogbWVtLCB1MTZfdCBtZW1fbGVuLCB1MTZfdCBzdGFydF9vZmZzZXQpOwordTE2X3QgcGJ1Zl9zdHJzdHIoc3RydWN0IHBidWYqIHAsIGNvbnN0IGNoYXIqIHN1YnN0cik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXSVBfUEJVRl9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3Jhdy5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvcmF3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkMGExYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3Jhdy5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfUkFXX0hfXworI2RlZmluZSBfX0xXSVBfUkFXX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfUkFXIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9wYnVmLmgiCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL2lwLmgiCisjaW5jbHVkZSAibHdpcC9pcF9hZGRyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IHJhd19wY2I7CisKKy8qKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIHJhdyBwY2IgcmVjZWl2ZSBjYWxsYmFjayBmdW5jdGlvbnMuCisgKiBAcGFyYW0gYXJnIHVzZXIgc3VwcGxpZWQgYXJndW1lbnQgKHJhd19wY2IucmVjdl9hcmcpCisgKiBAcGFyYW0gcGNiIHRoZSByYXdfcGNiIHdoaWNoIHJlY2VpdmVkIGRhdGEKKyAqIEBwYXJhbSBwIHRoZSBwYWNrZXQgYnVmZmVyIHRoYXQgd2FzIHJlY2VpdmVkCisgKiBAcGFyYW0gYWRkciB0aGUgcmVtb3RlIElQIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcGFja2V0IHdhcyByZWNlaXZlZAorICogQHJldHVybiAxIGlmIHRoZSBwYWNrZXQgd2FzICdlYXRlbicgKGFrYS4gZGVsZXRlZCksCisgKiAgICAgICAgIDAgaWYgdGhlIHBhY2tldCBsaXZlcyBvbgorICogSWYgcmV0dXJuaW5nIDEsIHRoZSBjYWxsYmFjayBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgcGJ1ZgorICogaWYgaXQncyBub3QgdXNlZCBhbnkgbW9yZS4KKyAqLwordHlwZWRlZiB1OF90ICgqcmF3X3JlY3ZfZm4pKHZvaWQgKmFyZywgc3RydWN0IHJhd19wY2IgKnBjYiwgc3RydWN0IHBidWYgKnAsCisgICAgaXBfYWRkcl90ICphZGRyKTsKKworc3RydWN0IHJhd19wY2IgeworICAvKiBDb21tb24gbWVtYmVycyBvZiBhbGwgUENCIHR5cGVzICovCisgIElQX1BDQjsKKworICBzdHJ1Y3QgcmF3X3BjYiAqbmV4dDsKKworICB1OF90IHByb3RvY29sOworCisgIC8qKiByZWNlaXZlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgIHJhd19yZWN2X2ZuIHJlY3Y7CisgIC8qIHVzZXItc3VwcGxpZWQgYXJndW1lbnQgZm9yIHRoZSByZWN2IGNhbGxiYWNrICovCisgIHZvaWQgKnJlY3ZfYXJnOworfTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaXMgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSB0byB0aGUKKyAgIFJBVyBjb2RlLiAqLworc3RydWN0IHJhd19wY2IgKiByYXdfbmV3ICAgICAgICAodThfdCBwcm90byk7Cit2b2lkICAgICAgICAgICAgIHJhd19yZW1vdmUgICAgIChzdHJ1Y3QgcmF3X3BjYiAqcGNiKTsKK2Vycl90ICAgICAgICAgICAgcmF3X2JpbmQgICAgICAgKHN0cnVjdCByYXdfcGNiICpwY2IsIGlwX2FkZHJfdCAqaXBhZGRyKTsKK2Vycl90ICAgICAgICAgICAgcmF3X2Nvbm5lY3QgICAgKHN0cnVjdCByYXdfcGNiICpwY2IsIGlwX2FkZHJfdCAqaXBhZGRyKTsKKwordm9pZCAgICAgICAgICAgICByYXdfcmVjdiAgICAgICAoc3RydWN0IHJhd19wY2IgKnBjYiwgcmF3X3JlY3ZfZm4gcmVjdiwgdm9pZCAqcmVjdl9hcmcpOworZXJyX3QgICAgICAgICAgICByYXdfc2VuZHRvICAgICAoc3RydWN0IHJhd19wY2IgKnBjYiwgc3RydWN0IHBidWYgKnAsIGlwX2FkZHJfdCAqaXBhZGRyKTsKK2Vycl90ICAgICAgICAgICAgcmF3X3NlbmQgICAgICAgKHN0cnVjdCByYXdfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwKTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHRoZSBsb3dlciBsYXllciBpbnRlcmZhY2UgdG8gUkFXLiAqLwordThfdCAgICAgICAgICAgICByYXdfaW5wdXQgICAgICAoc3RydWN0IHBidWYgKnAsIHN0cnVjdCBuZXRpZiAqaW5wKTsKKyNkZWZpbmUgcmF3X2luaXQoKSAvKiBDb21wYXRpYmlsaXR5IGRlZmluZSwgbm90IGluaXQgbmVlZGVkLiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTFdJUF9SQVcgKi8KKworI2VuZGlmIC8qIF9fTFdJUF9SQVdfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zaW8uaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3Npby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YWUyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zaW8uaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqLworCisvKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBzZXJpYWwgSU8gbW9kdWxlCisgKiBJdCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBieSB0aG9zZSBwbGF0Zm9ybXMgd2hpY2ggbmVlZCBTTElQIG9yIFBQUAorICovCisKKyNpZm5kZWYgX19TSU9fSF9fCisjZGVmaW5lIF9fU0lPX0hfXworCisjaW5jbHVkZSAibHdpcC9hcmNoLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSWYgeW91IHdhbnQgdG8gZGVmaW5lIHNpb19mZF90IGVsc2V3aGVyZSBvciBkaWZmZXJlbnRseSwKKyAgIGRlZmluZSB0aGlzIGluIHlvdXIgY2MuaCBmaWxlLiAqLworI2lmbmRlZiBfX3Npb19mZF90X2RlZmluZWQKK3R5cGVkZWYgdm9pZCAqIHNpb19mZF90OworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNhbiBiZSBkZWZpbmVkIHRvIHNvbWV0aGluZyBlbHNlIGluIHlvdXIgY2MuaCBmaWxlCisgICBvciBiZSBpbXBsZW1lbnRlZCBpbiB5b3VyIGN1c3RvbSBzaW8uYyBmaWxlLiAqLworCisjaWZuZGVmIHNpb19vcGVuCisvKioKKyAqIE9wZW5zIGEgc2VyaWFsIGRldmljZSBmb3IgY29tbXVuaWNhdGlvbi4KKyAqIAorICogQHBhcmFtIGRldm51bSBkZXZpY2UgbnVtYmVyCisgKiBAcmV0dXJuIGhhbmRsZSB0byBzZXJpYWwgZGV2aWNlIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3Npb19mZF90IHNpb19vcGVuKHU4X3QgZGV2bnVtKTsKKyNlbmRpZgorCisjaWZuZGVmIHNpb19zZW5kCisvKioKKyAqIFNlbmRzIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgc2VyaWFsIGRldmljZS4KKyAqIAorICogQHBhcmFtIGMgY2hhcmFjdGVyIHRvIHNlbmQKKyAqIEBwYXJhbSBmZCBzZXJpYWwgZGV2aWNlIGhhbmRsZQorICogCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwgdGhlIGNoYXJhY3RlciBjYW4gYmUgc2VudC4KKyAqLwordm9pZCBzaW9fc2VuZCh1OF90IGMsIHNpb19mZF90IGZkKTsKKyNlbmRpZgorCisjaWZuZGVmIHNpb19yZWN2CisvKioKKyAqIFJlY2VpdmVzIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSBzZXJpYWwgZGV2aWNlLgorICogCisgKiBAcGFyYW0gZmQgc2VyaWFsIGRldmljZSBoYW5kbGUKKyAqIAorICogQG5vdGUgVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIGEgY2hhcmFjdGVyIGlzIHJlY2VpdmVkLgorICovCit1OF90IHNpb19yZWN2KHNpb19mZF90IGZkKTsKKyNlbmRpZgorCisjaWZuZGVmIHNpb19yZWFkCisvKioKKyAqIFJlYWRzIGZyb20gdGhlIHNlcmlhbCBkZXZpY2UuCisgKiAKKyAqIEBwYXJhbSBmZCBzZXJpYWwgZGV2aWNlIGhhbmRsZQorICogQHBhcmFtIGRhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlciBmb3IgcmVjZWl2aW5nCisgKiBAcGFyYW0gbGVuIG1heGltdW0gbGVuZ3RoIChpbiBieXRlcykgb2YgZGF0YSB0byByZWNlaXZlCisgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWNlaXZlZCAtIG1heSBiZSAwIGlmIGFib3J0ZWQgYnkgc2lvX3JlYWRfYWJvcnQKKyAqIAorICogQG5vdGUgVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIGRhdGEgY2FuIGJlIHJlY2VpdmVkLiBUaGUgYmxvY2tpbmcKKyAqIGNhbiBiZSBjYW5jZWxsZWQgYnkgY2FsbGluZyBzaW9fcmVhZF9hYm9ydCgpLgorICovCit1MzJfdCBzaW9fcmVhZChzaW9fZmRfdCBmZCwgdThfdCAqZGF0YSwgdTMyX3QgbGVuKTsKKyNlbmRpZgorCisjaWZuZGVmIHNpb190cnlyZWFkCisvKioKKyAqIFRyaWVzIHRvIHJlYWQgZnJvbSB0aGUgc2VyaWFsIGRldmljZS4gU2FtZSBhcyBzaW9fcmVhZCBidXQgcmV0dXJucworICogaW1tZWRpYXRlbHkgaWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgYW5kIG5ldmVyIGJsb2Nrcy4KKyAqIAorICogQHBhcmFtIGZkIHNlcmlhbCBkZXZpY2UgaGFuZGxlCisgKiBAcGFyYW0gZGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyIGZvciByZWNlaXZpbmcKKyAqIEBwYXJhbSBsZW4gbWF4aW11bSBsZW5ndGggKGluIGJ5dGVzKSBvZiBkYXRhIHRvIHJlY2VpdmUKKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlY2VpdmVkCisgKi8KK3UzMl90IHNpb190cnlyZWFkKHNpb19mZF90IGZkLCB1OF90ICpkYXRhLCB1MzJfdCBsZW4pOworI2VuZGlmCisKKyNpZm5kZWYgc2lvX3dyaXRlCisvKioKKyAqIFdyaXRlcyB0byB0aGUgc2VyaWFsIGRldmljZS4KKyAqIAorICogQHBhcmFtIGZkIHNlcmlhbCBkZXZpY2UgaGFuZGxlCisgKiBAcGFyYW0gZGF0YSBwb2ludGVyIHRvIGRhdGEgdG8gc2VuZAorICogQHBhcmFtIGxlbiBsZW5ndGggKGluIGJ5dGVzKSBvZiBkYXRhIHRvIHNlbmQKKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHNlbnQKKyAqIAorICogQG5vdGUgVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIGFsbCBkYXRhIGNhbiBiZSBzZW50LgorICovCit1MzJfdCBzaW9fd3JpdGUoc2lvX2ZkX3QgZmQsIHU4X3QgKmRhdGEsIHUzMl90IGxlbik7CisjZW5kaWYKKworI2lmbmRlZiBzaW9fcmVhZF9hYm9ydAorLyoqCisgKiBBYm9ydHMgYSBibG9ja2luZyBzaW9fcmVhZCgpIGNhbGwuCisgKiAKKyAqIEBwYXJhbSBmZCBzZXJpYWwgZGV2aWNlIGhhbmRsZQorICovCit2b2lkIHNpb19yZWFkX2Fib3J0KHNpb19mZF90IGZkKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TSU9fSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zbm1wLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zbm1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkMDQzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3NubXAuaApAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uLndvZXN0ZW5iZXJnQGF4b24udHY+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgQXhvbiBEaWdpdGFsIERlc2lnbiBCLlYuLCBUaGUgTmV0aGVybGFuZHMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IExlb24gV29lc3RlbmJlcmcgPGxlb24ud29lc3RlbmJlcmdAYXhvbi50dj4KKyAqCisgKi8KKyNpZm5kZWYgX19MV0lQX1NOTVBfSF9fCisjZGVmaW5lIF9fTFdJUF9TTk1QX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAibHdpcC9pcF9hZGRyLmgiCisKK3N0cnVjdCB1ZHBfcGNiOworc3RydWN0IG5ldGlmOworCisvKioKKyAqIEBzZWUgUkZDMTIxMywgIk1JQi1JSSwgNi4gRGVmaW5pdGlvbnMiCisgKi8KK2VudW0gc25tcF9pZlR5cGUgeworICBzbm1wX2lmVHlwZV9vdGhlcj0xLCAgICAgICAgICAgICAgICAvKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgKi8KKyAgc25tcF9pZlR5cGVfcmVndWxhcjE4MjIsCisgIHNubXBfaWZUeXBlX2hkaDE4MjIsCisgIHNubXBfaWZUeXBlX2Rkbl94MjUsCisgIHNubXBfaWZUeXBlX3JmYzg3N194MjUsCisgIHNubXBfaWZUeXBlX2V0aGVybmV0X2NzbWFjZCwKKyAgc25tcF9pZlR5cGVfaXNvODgwMjNfY3NtYWNkLAorICBzbm1wX2lmVHlwZV9pc284ODAyNF90b2tlbkJ1cywKKyAgc25tcF9pZlR5cGVfaXNvODgwMjVfdG9rZW5SaW5nLAorICBzbm1wX2lmVHlwZV9pc284ODAyNl9tYW4sCisgIHNubXBfaWZUeXBlX3N0YXJMYW4sCisgIHNubXBfaWZUeXBlX3Byb3Rlb25fMTBNYml0LAorICBzbm1wX2lmVHlwZV9wcm90ZW9uXzgwTWJpdCwKKyAgc25tcF9pZlR5cGVfaHlwZXJjaGFubmVsLAorICBzbm1wX2lmVHlwZV9mZGRpLAorICBzbm1wX2lmVHlwZV9sYXBiLAorICBzbm1wX2lmVHlwZV9zZGxjLAorICBzbm1wX2lmVHlwZV9kczEsICAgICAgICAgICAgICAgICAgICAvKiBULTEgKi8KKyAgc25tcF9pZlR5cGVfZTEsICAgICAgICAgICAgICAgICAgICAgLyogZXVyb3BlYW4gZXF1aXYuIG9mIFQtMSAqLworICBzbm1wX2lmVHlwZV9iYXNpY0lTRE4sCisgIHNubXBfaWZUeXBlX3ByaW1hcnlJU0ROLCAgICAgICAgICAgIC8qIHByb3ByaWV0YXJ5IHNlcmlhbCAqLworICBzbm1wX2lmVHlwZV9wcm9wUG9pbnRUb1BvaW50U2VyaWFsLAorICBzbm1wX2lmVHlwZV9wcHAsCisgIHNubXBfaWZUeXBlX3NvZnR3YXJlTG9vcGJhY2ssCisgIHNubXBfaWZUeXBlX2VvbiwgICAgICAgICAgICAgICAgICAgIC8qIENMTlAgb3ZlciBJUCBbMTFdICovCisgIHNubXBfaWZUeXBlX2V0aGVybmV0XzNNYml0LAorICBzbm1wX2lmVHlwZV9uc2lwLCAgICAgICAgICAgICAgICAgICAvKiBYTlMgb3ZlciBJUCAqLworICBzbm1wX2lmVHlwZV9zbGlwLCAgICAgICAgICAgICAgICAgICAvKiBnZW5lcmljIFNMSVAgKi8KKyAgc25tcF9pZlR5cGVfdWx0cmEsICAgICAgICAgICAgICAgICAgLyogVUxUUkEgdGVjaG5vbG9naWVzICovCisgIHNubXBfaWZUeXBlX2RzMywgICAgICAgICAgICAgICAgICAgIC8qIFQtMyAqLworICBzbm1wX2lmVHlwZV9zaXAsICAgICAgICAgICAgICAgICAgICAvKiBTTURTICovCisgIHNubXBfaWZUeXBlX2ZyYW1lX3JlbGF5Cit9OworCisjaWYgTFdJUF9TTk1QIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisvKiogU05NUCAic3lzdXB0aW1lIiBJbnRlcnZhbCAqLworI2RlZmluZSBTTk1QX1NZU1VQVElNRV9JTlRFUlZBTCAxMAorCisvKiogZml4ZWQgbWF4aW11bSBsZW5ndGggZm9yIG9iamVjdCBpZGVudGlmaWVyIHR5cGUgKi8KKyNkZWZpbmUgTFdJUF9TTk1QX09CSl9JRF9MRU4gMzIKKworLyoqIGludGVybmFsIG9iamVjdCBpZGVudGlmaWVyIHJlcHJlc2VudGF0aW9uICovCitzdHJ1Y3Qgc25tcF9vYmpfaWQKK3sKKyAgdThfdCBsZW47CisgIHMzMl90IGlkW0xXSVBfU05NUF9PQkpfSURfTEVOXTsKK307CisKKy8qIHN5c3RlbSAqLwordm9pZCBzbm1wX3NldF9zeXNkZXNyKHU4X3QqIHN0ciwgdThfdCogbGVuKTsKK3ZvaWQgc25tcF9zZXRfc3lzb2JqaWQoc3RydWN0IHNubXBfb2JqX2lkICpvaWQpOwordm9pZCBzbm1wX2dldF9zeXNvYmppZF9wdHIoc3RydWN0IHNubXBfb2JqX2lkICoqb2lkKTsKK3ZvaWQgc25tcF9pbmNfc3lzdXB0aW1lKHZvaWQpOwordm9pZCBzbm1wX2FkZF9zeXN1cHRpbWUodTMyX3QgdmFsdWUpOwordm9pZCBzbm1wX2dldF9zeXN1cHRpbWUodTMyX3QgKnZhbHVlKTsKK3ZvaWQgc25tcF9zZXRfc3lzY29udGFjdCh1OF90ICpvY3N0ciwgdThfdCAqb2NzdHJsZW4pOwordm9pZCBzbm1wX3NldF9zeXNuYW1lKHU4X3QgKm9jc3RyLCB1OF90ICpvY3N0cmxlbik7Cit2b2lkIHNubXBfc2V0X3N5c2xvY2F0aW9uKHU4X3QgKm9jc3RyLCB1OF90ICpvY3N0cmxlbik7CisKKy8qIG5ldHdvcmsgaW50ZXJmYWNlICovCit2b2lkIHNubXBfYWRkX2lmaW5vY3RldHMoc3RydWN0IG5ldGlmICpuaSwgdTMyX3QgdmFsdWUpOyAKK3ZvaWQgc25tcF9pbmNfaWZpbnVjYXN0cGt0cyhzdHJ1Y3QgbmV0aWYgKm5pKTsKK3ZvaWQgc25tcF9pbmNfaWZpbm51Y2FzdHBrdHMoc3RydWN0IG5ldGlmICpuaSk7Cit2b2lkIHNubXBfaW5jX2lmaW5kaXNjYXJkcyhzdHJ1Y3QgbmV0aWYgKm5pKTsKK3ZvaWQgc25tcF9hZGRfaWZvdXRvY3RldHMoc3RydWN0IG5ldGlmICpuaSwgdTMyX3QgdmFsdWUpOwordm9pZCBzbm1wX2luY19pZm91dHVjYXN0cGt0cyhzdHJ1Y3QgbmV0aWYgKm5pKTsKK3ZvaWQgc25tcF9pbmNfaWZvdXRudWNhc3Rwa3RzKHN0cnVjdCBuZXRpZiAqbmkpOwordm9pZCBzbm1wX2luY19pZm91dGRpc2NhcmRzKHN0cnVjdCBuZXRpZiAqbmkpOwordm9pZCBzbm1wX2luY19pZmxpc3Qodm9pZCk7Cit2b2lkIHNubXBfZGVjX2lmbGlzdCh2b2lkKTsKKworLyogQVJQIChmb3IgYXRUYWJsZSBhbmQgaXBOZXRUb01lZGlhVGFibGUpICovCit2b2lkIHNubXBfaW5zZXJ0X2FycGlkeF90cmVlKHN0cnVjdCBuZXRpZiAqbmksIGlwX2FkZHJfdCAqaXApOwordm9pZCBzbm1wX2RlbGV0ZV9hcnBpZHhfdHJlZShzdHJ1Y3QgbmV0aWYgKm5pLCBpcF9hZGRyX3QgKmlwKTsKKworLyogSVAgKi8KK3ZvaWQgc25tcF9pbmNfaXBpbnJlY2VpdmVzKHZvaWQpOwordm9pZCBzbm1wX2luY19pcGluaGRyZXJyb3JzKHZvaWQpOwordm9pZCBzbm1wX2luY19pcGluYWRkcmVycm9ycyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfaXBmb3J3ZGF0YWdyYW1zKHZvaWQpOwordm9pZCBzbm1wX2luY19pcGludW5rbm93bnByb3Rvcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfaXBpbmRpc2NhcmRzKHZvaWQpOwordm9pZCBzbm1wX2luY19pcGluZGVsaXZlcnModm9pZCk7Cit2b2lkIHNubXBfaW5jX2lwb3V0cmVxdWVzdHModm9pZCk7Cit2b2lkIHNubXBfaW5jX2lwb3V0ZGlzY2FyZHModm9pZCk7Cit2b2lkIHNubXBfaW5jX2lwb3V0bm9yb3V0ZXModm9pZCk7Cit2b2lkIHNubXBfaW5jX2lwcmVhc21yZXFkcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfaXByZWFzbW9rcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfaXByZWFzbWZhaWxzKHZvaWQpOwordm9pZCBzbm1wX2luY19pcGZyYWdva3Modm9pZCk7Cit2b2lkIHNubXBfaW5jX2lwZnJhZ2ZhaWxzKHZvaWQpOwordm9pZCBzbm1wX2luY19pcGZyYWdjcmVhdGVzKHZvaWQpOwordm9pZCBzbm1wX2luY19pcHJvdXRpbmdkaXNjYXJkcyh2b2lkKTsKK3ZvaWQgc25tcF9pbnNlcnRfaXBhZGRyaWR4X3RyZWUoc3RydWN0IG5ldGlmICpuaSk7Cit2b2lkIHNubXBfZGVsZXRlX2lwYWRkcmlkeF90cmVlKHN0cnVjdCBuZXRpZiAqbmkpOwordm9pZCBzbm1wX2luc2VydF9pcHJ0ZWlkeF90cmVlKHU4X3QgZGZsdCwgc3RydWN0IG5ldGlmICpuaSk7Cit2b2lkIHNubXBfZGVsZXRlX2lwcnRlaWR4X3RyZWUodThfdCBkZmx0LCBzdHJ1Y3QgbmV0aWYgKm5pKTsKKworLyogSUNNUCAqLwordm9pZCBzbm1wX2luY19pY21waW5tc2dzKHZvaWQpOwordm9pZCBzbm1wX2luY19pY21waW5lcnJvcnModm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBpbmRlc3R1bnJlYWNocyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfaWNtcGludGltZWV4Y2RzKHZvaWQpOwordm9pZCBzbm1wX2luY19pY21waW5wYXJtcHJvYnModm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBpbnNyY3F1ZW5jaHModm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBpbnJlZGlyZWN0cyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfaWNtcGluZWNob3Modm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBpbmVjaG9yZXBzKHZvaWQpOwordm9pZCBzbm1wX2luY19pY21waW50aW1lc3RhbXBzKHZvaWQpOwordm9pZCBzbm1wX2luY19pY21waW50aW1lc3RhbXByZXBzKHZvaWQpOwordm9pZCBzbm1wX2luY19pY21waW5hZGRybWFza3Modm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBpbmFkZHJtYXNrcmVwcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfaWNtcG91dG1zZ3Modm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBvdXRlcnJvcnModm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBvdXRkZXN0dW5yZWFjaHModm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBvdXR0aW1lZXhjZHModm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBvdXRwYXJtcHJvYnModm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBvdXRzcmNxdWVuY2hzKHZvaWQpOwordm9pZCBzbm1wX2luY19pY21wb3V0cmVkaXJlY3RzKHZvaWQpOyAKK3ZvaWQgc25tcF9pbmNfaWNtcG91dGVjaG9zKHZvaWQpOwordm9pZCBzbm1wX2luY19pY21wb3V0ZWNob3JlcHModm9pZCk7Cit2b2lkIHNubXBfaW5jX2ljbXBvdXR0aW1lc3RhbXBzKHZvaWQpOwordm9pZCBzbm1wX2luY19pY21wb3V0dGltZXN0YW1wcmVwcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfaWNtcG91dGFkZHJtYXNrcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfaWNtcG91dGFkZHJtYXNrcmVwcyh2b2lkKTsKKworLyogVENQICovCit2b2lkIHNubXBfaW5jX3RjcGFjdGl2ZW9wZW5zKHZvaWQpOwordm9pZCBzbm1wX2luY190Y3BwYXNzaXZlb3BlbnModm9pZCk7Cit2b2lkIHNubXBfaW5jX3RjcGF0dGVtcHRmYWlscyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfdGNwZXN0YWJyZXNldHModm9pZCk7Cit2b2lkIHNubXBfaW5jX3RjcGluc2Vncyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfdGNwb3V0c2Vncyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfdGNwcmV0cmFuc3NlZ3Modm9pZCk7Cit2b2lkIHNubXBfaW5jX3RjcGluZXJycyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfdGNwb3V0cnN0cyh2b2lkKTsKKworLyogVURQICovCit2b2lkIHNubXBfaW5jX3VkcGluZGF0YWdyYW1zKHZvaWQpOwordm9pZCBzbm1wX2luY191ZHBub3BvcnRzKHZvaWQpOwordm9pZCBzbm1wX2luY191ZHBpbmVycm9ycyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfdWRwb3V0ZGF0YWdyYW1zKHZvaWQpOwordm9pZCBzbm1wX2luc2VydF91ZHBpZHhfdHJlZShzdHJ1Y3QgdWRwX3BjYiAqcGNiKTsKK3ZvaWQgc25tcF9kZWxldGVfdWRwaWR4X3RyZWUoc3RydWN0IHVkcF9wY2IgKnBjYik7CisKKy8qIFNOTVAgKi8KK3ZvaWQgc25tcF9pbmNfc25tcGlucGt0cyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfc25tcG91dHBrdHModm9pZCk7Cit2b2lkIHNubXBfaW5jX3NubXBpbmJhZHZlcnNpb25zKHZvaWQpOwordm9pZCBzbm1wX2luY19zbm1waW5iYWRjb21tdW5pdHluYW1lcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfc25tcGluYmFkY29tbXVuaXR5dXNlcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfc25tcGluYXNucGFyc2VlcnJzKHZvaWQpOwordm9pZCBzbm1wX2luY19zbm1waW50b29iaWdzKHZvaWQpOwordm9pZCBzbm1wX2luY19zbm1waW5ub3N1Y2huYW1lcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfc25tcGluYmFkdmFsdWVzKHZvaWQpOwordm9pZCBzbm1wX2luY19zbm1waW5yZWFkb25seXModm9pZCk7Cit2b2lkIHNubXBfaW5jX3NubXBpbmdlbmVycnModm9pZCk7Cit2b2lkIHNubXBfYWRkX3NubXBpbnRvdGFscmVxdmFycyh1OF90IHZhbHVlKTsKK3ZvaWQgc25tcF9hZGRfc25tcGludG90YWxzZXR2YXJzKHU4X3QgdmFsdWUpOwordm9pZCBzbm1wX2luY19zbm1waW5nZXRyZXF1ZXN0cyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfc25tcGluZ2V0bmV4dHModm9pZCk7Cit2b2lkIHNubXBfaW5jX3NubXBpbnNldHJlcXVlc3RzKHZvaWQpOwordm9pZCBzbm1wX2luY19zbm1waW5nZXRyZXNwb25zZXModm9pZCk7Cit2b2lkIHNubXBfaW5jX3NubXBpbnRyYXBzKHZvaWQpOwordm9pZCBzbm1wX2luY19zbm1wb3V0dG9vYmlncyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfc25tcG91dG5vc3VjaG5hbWVzKHZvaWQpOwordm9pZCBzbm1wX2luY19zbm1wb3V0YmFkdmFsdWVzKHZvaWQpOwordm9pZCBzbm1wX2luY19zbm1wb3V0Z2VuZXJycyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfc25tcG91dGdldHJlcXVlc3RzKHZvaWQpOwordm9pZCBzbm1wX2luY19zbm1wb3V0Z2V0bmV4dHModm9pZCk7Cit2b2lkIHNubXBfaW5jX3NubXBvdXRzZXRyZXF1ZXN0cyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfc25tcG91dGdldHJlc3BvbnNlcyh2b2lkKTsKK3ZvaWQgc25tcF9pbmNfc25tcG91dHRyYXBzKHZvaWQpOwordm9pZCBzbm1wX2dldF9zbm1wZ3JwaWRfcHRyKHN0cnVjdCBzbm1wX29ial9pZCAqKm9pZCk7Cit2b2lkIHNubXBfc2V0X3NubXBlbmFibGVhdXRoZW50cmFwcyh1OF90ICp2YWx1ZSk7Cit2b2lkIHNubXBfZ2V0X3NubXBlbmFibGVhdXRoZW50cmFwcyh1OF90ICp2YWx1ZSk7CisKKy8qIExXSVBfU05NUCBzdXBwb3J0IG5vdCBhdmFpbGFibGUgKi8KKy8qIGRlZmluZSBldmVyeXRoaW5nIHRvIGJlIGVtcHR5ICovCisjZWxzZQorCisvKiBzeXN0ZW0gKi8KKyNkZWZpbmUgc25tcF9zZXRfc3lzZGVzcihzdHIsIGxlbikKKyNkZWZpbmUgc25tcF9zZXRfc3lzb2JqaWQob2lkKTsKKyNkZWZpbmUgc25tcF9nZXRfc3lzb2JqaWRfcHRyKG9pZCkKKyNkZWZpbmUgc25tcF9pbmNfc3lzdXB0aW1lKCkKKyNkZWZpbmUgc25tcF9hZGRfc3lzdXB0aW1lKHZhbHVlKQorI2RlZmluZSBzbm1wX2dldF9zeXN1cHRpbWUodmFsdWUpCisjZGVmaW5lIHNubXBfc2V0X3N5c2NvbnRhY3Qob2NzdHIsIG9jc3RybGVuKTsKKyNkZWZpbmUgc25tcF9zZXRfc3lzbmFtZShvY3N0ciwgb2NzdHJsZW4pOworI2RlZmluZSBzbm1wX3NldF9zeXNsb2NhdGlvbihvY3N0ciwgb2NzdHJsZW4pOworCisvKiBuZXR3b3JrIGludGVyZmFjZSAqLworI2RlZmluZSBzbm1wX2FkZF9pZmlub2N0ZXRzKG5pLHZhbHVlKSAKKyNkZWZpbmUgc25tcF9pbmNfaWZpbnVjYXN0cGt0cyhuaSkKKyNkZWZpbmUgc25tcF9pbmNfaWZpbm51Y2FzdHBrdHMobmkpCisjZGVmaW5lIHNubXBfaW5jX2lmaW5kaXNjYXJkcyhuaSkKKyNkZWZpbmUgc25tcF9hZGRfaWZvdXRvY3RldHMobmksdmFsdWUpCisjZGVmaW5lIHNubXBfaW5jX2lmb3V0dWNhc3Rwa3RzKG5pKQorI2RlZmluZSBzbm1wX2luY19pZm91dG51Y2FzdHBrdHMobmkpCisjZGVmaW5lIHNubXBfaW5jX2lmb3V0ZGlzY2FyZHMobmkpCisjZGVmaW5lIHNubXBfaW5jX2lmbGlzdCgpCisjZGVmaW5lIHNubXBfZGVjX2lmbGlzdCgpCisKKy8qIEFSUCAqLworI2RlZmluZSBzbm1wX2luc2VydF9hcnBpZHhfdHJlZShuaSxpcCkKKyNkZWZpbmUgc25tcF9kZWxldGVfYXJwaWR4X3RyZWUobmksaXApCisKKy8qIElQICovCisjZGVmaW5lIHNubXBfaW5jX2lwaW5yZWNlaXZlcygpCisjZGVmaW5lIHNubXBfaW5jX2lwaW5oZHJlcnJvcnMoKQorI2RlZmluZSBzbm1wX2luY19pcGluYWRkcmVycm9ycygpCisjZGVmaW5lIHNubXBfaW5jX2lwZm9yd2RhdGFncmFtcygpCisjZGVmaW5lIHNubXBfaW5jX2lwaW51bmtub3ducHJvdG9zKCkKKyNkZWZpbmUgc25tcF9pbmNfaXBpbmRpc2NhcmRzKCkKKyNkZWZpbmUgc25tcF9pbmNfaXBpbmRlbGl2ZXJzKCkKKyNkZWZpbmUgc25tcF9pbmNfaXBvdXRyZXF1ZXN0cygpCisjZGVmaW5lIHNubXBfaW5jX2lwb3V0ZGlzY2FyZHMoKQorI2RlZmluZSBzbm1wX2luY19pcG91dG5vcm91dGVzKCkKKyNkZWZpbmUgc25tcF9pbmNfaXByZWFzbXJlcWRzKCkKKyNkZWZpbmUgc25tcF9pbmNfaXByZWFzbW9rcygpCisjZGVmaW5lIHNubXBfaW5jX2lwcmVhc21mYWlscygpCisjZGVmaW5lIHNubXBfaW5jX2lwZnJhZ29rcygpCisjZGVmaW5lIHNubXBfaW5jX2lwZnJhZ2ZhaWxzKCkKKyNkZWZpbmUgc25tcF9pbmNfaXBmcmFnY3JlYXRlcygpCisjZGVmaW5lIHNubXBfaW5jX2lwcm91dGluZ2Rpc2NhcmRzKCkKKyNkZWZpbmUgc25tcF9pbnNlcnRfaXBhZGRyaWR4X3RyZWUobmkpCisjZGVmaW5lIHNubXBfZGVsZXRlX2lwYWRkcmlkeF90cmVlKG5pKQorI2RlZmluZSBzbm1wX2luc2VydF9pcHJ0ZWlkeF90cmVlKGRmbHQsIG5pKQorI2RlZmluZSBzbm1wX2RlbGV0ZV9pcHJ0ZWlkeF90cmVlKGRmbHQsIG5pKQorCisvKiBJQ01QICovCisjZGVmaW5lIHNubXBfaW5jX2ljbXBpbm1zZ3MoKQorI2RlZmluZSBzbm1wX2luY19pY21waW5lcnJvcnMoKSAKKyNkZWZpbmUgc25tcF9pbmNfaWNtcGluZGVzdHVucmVhY2hzKCkgCisjZGVmaW5lIHNubXBfaW5jX2ljbXBpbnRpbWVleGNkcygpCisjZGVmaW5lIHNubXBfaW5jX2ljbXBpbnBhcm1wcm9icygpIAorI2RlZmluZSBzbm1wX2luY19pY21waW5zcmNxdWVuY2hzKCkgCisjZGVmaW5lIHNubXBfaW5jX2ljbXBpbnJlZGlyZWN0cygpIAorI2RlZmluZSBzbm1wX2luY19pY21waW5lY2hvcygpIAorI2RlZmluZSBzbm1wX2luY19pY21waW5lY2hvcmVwcygpCisjZGVmaW5lIHNubXBfaW5jX2ljbXBpbnRpbWVzdGFtcHMoKSAKKyNkZWZpbmUgc25tcF9pbmNfaWNtcGludGltZXN0YW1wcmVwcygpCisjZGVmaW5lIHNubXBfaW5jX2ljbXBpbmFkZHJtYXNrcygpCisjZGVmaW5lIHNubXBfaW5jX2ljbXBpbmFkZHJtYXNrcmVwcygpCisjZGVmaW5lIHNubXBfaW5jX2ljbXBvdXRtc2dzKCkKKyNkZWZpbmUgc25tcF9pbmNfaWNtcG91dGVycm9ycygpCisjZGVmaW5lIHNubXBfaW5jX2ljbXBvdXRkZXN0dW5yZWFjaHMoKSAKKyNkZWZpbmUgc25tcF9pbmNfaWNtcG91dHRpbWVleGNkcygpIAorI2RlZmluZSBzbm1wX2luY19pY21wb3V0cGFybXByb2JzKCkKKyNkZWZpbmUgc25tcF9pbmNfaWNtcG91dHNyY3F1ZW5jaHMoKQorI2RlZmluZSBzbm1wX2luY19pY21wb3V0cmVkaXJlY3RzKCkgCisjZGVmaW5lIHNubXBfaW5jX2ljbXBvdXRlY2hvcygpIAorI2RlZmluZSBzbm1wX2luY19pY21wb3V0ZWNob3JlcHMoKQorI2RlZmluZSBzbm1wX2luY19pY21wb3V0dGltZXN0YW1wcygpCisjZGVmaW5lIHNubXBfaW5jX2ljbXBvdXR0aW1lc3RhbXByZXBzKCkKKyNkZWZpbmUgc25tcF9pbmNfaWNtcG91dGFkZHJtYXNrcygpCisjZGVmaW5lIHNubXBfaW5jX2ljbXBvdXRhZGRybWFza3JlcHMoKQorLyogVENQICovCisjZGVmaW5lIHNubXBfaW5jX3RjcGFjdGl2ZW9wZW5zKCkKKyNkZWZpbmUgc25tcF9pbmNfdGNwcGFzc2l2ZW9wZW5zKCkKKyNkZWZpbmUgc25tcF9pbmNfdGNwYXR0ZW1wdGZhaWxzKCkKKyNkZWZpbmUgc25tcF9pbmNfdGNwZXN0YWJyZXNldHMoKQorI2RlZmluZSBzbm1wX2luY190Y3BpbnNlZ3MoKQorI2RlZmluZSBzbm1wX2luY190Y3BvdXRzZWdzKCkKKyNkZWZpbmUgc25tcF9pbmNfdGNwcmV0cmFuc3NlZ3MoKQorI2RlZmluZSBzbm1wX2luY190Y3BpbmVycnMoKQorI2RlZmluZSBzbm1wX2luY190Y3BvdXRyc3RzKCkKKworLyogVURQICovCisjZGVmaW5lIHNubXBfaW5jX3VkcGluZGF0YWdyYW1zKCkKKyNkZWZpbmUgc25tcF9pbmNfdWRwbm9wb3J0cygpCisjZGVmaW5lIHNubXBfaW5jX3VkcGluZXJyb3JzKCkKKyNkZWZpbmUgc25tcF9pbmNfdWRwb3V0ZGF0YWdyYW1zKCkKKyNkZWZpbmUgc25tcF9pbnNlcnRfdWRwaWR4X3RyZWUocGNiKQorI2RlZmluZSBzbm1wX2RlbGV0ZV91ZHBpZHhfdHJlZShwY2IpCisKKy8qIFNOTVAgKi8KKyNkZWZpbmUgc25tcF9pbmNfc25tcGlucGt0cygpCisjZGVmaW5lIHNubXBfaW5jX3NubXBvdXRwa3RzKCkKKyNkZWZpbmUgc25tcF9pbmNfc25tcGluYmFkdmVyc2lvbnMoKQorI2RlZmluZSBzbm1wX2luY19zbm1waW5iYWRjb21tdW5pdHluYW1lcygpCisjZGVmaW5lIHNubXBfaW5jX3NubXBpbmJhZGNvbW11bml0eXVzZXMoKQorI2RlZmluZSBzbm1wX2luY19zbm1waW5hc25wYXJzZWVycnMoKQorI2RlZmluZSBzbm1wX2luY19zbm1waW50b29iaWdzKCkKKyNkZWZpbmUgc25tcF9pbmNfc25tcGlubm9zdWNobmFtZXMoKQorI2RlZmluZSBzbm1wX2luY19zbm1waW5iYWR2YWx1ZXMoKQorI2RlZmluZSBzbm1wX2luY19zbm1waW5yZWFkb25seXMoKQorI2RlZmluZSBzbm1wX2luY19zbm1waW5nZW5lcnJzKCkKKyNkZWZpbmUgc25tcF9hZGRfc25tcGludG90YWxyZXF2YXJzKHZhbHVlKQorI2RlZmluZSBzbm1wX2FkZF9zbm1waW50b3RhbHNldHZhcnModmFsdWUpCisjZGVmaW5lIHNubXBfaW5jX3NubXBpbmdldHJlcXVlc3RzKCkKKyNkZWZpbmUgc25tcF9pbmNfc25tcGluZ2V0bmV4dHMoKQorI2RlZmluZSBzbm1wX2luY19zbm1waW5zZXRyZXF1ZXN0cygpCisjZGVmaW5lIHNubXBfaW5jX3NubXBpbmdldHJlc3BvbnNlcygpCisjZGVmaW5lIHNubXBfaW5jX3NubXBpbnRyYXBzKCkKKyNkZWZpbmUgc25tcF9pbmNfc25tcG91dHRvb2JpZ3MoKQorI2RlZmluZSBzbm1wX2luY19zbm1wb3V0bm9zdWNobmFtZXMoKQorI2RlZmluZSBzbm1wX2luY19zbm1wb3V0YmFkdmFsdWVzKCkKKyNkZWZpbmUgc25tcF9pbmNfc25tcG91dGdlbmVycnMoKQorI2RlZmluZSBzbm1wX2luY19zbm1wb3V0Z2V0cmVxdWVzdHMoKQorI2RlZmluZSBzbm1wX2luY19zbm1wb3V0Z2V0bmV4dHMoKQorI2RlZmluZSBzbm1wX2luY19zbm1wb3V0c2V0cmVxdWVzdHMoKQorI2RlZmluZSBzbm1wX2luY19zbm1wb3V0Z2V0cmVzcG9uc2VzKCkKKyNkZWZpbmUgc25tcF9pbmNfc25tcG91dHRyYXBzKCkKKyNkZWZpbmUgc25tcF9nZXRfc25tcGdycGlkX3B0cihvaWQpCisjZGVmaW5lIHNubXBfc2V0X3NubXBlbmFibGVhdXRoZW50cmFwcyh2YWx1ZSkKKyNkZWZpbmUgc25tcF9nZXRfc25tcGVuYWJsZWF1dGhlbnRyYXBzKHZhbHVlKQorCisjZW5kaWYgLyogTFdJUF9TTk1QICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXSVBfU05NUF9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3NubXBfYXNuMS5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvc25tcF9hc24xLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1ZmEzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3NubXBfYXNuMS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKioKKyAqIEBmaWxlCisgKiBBYnN0cmFjdCBTeW50YXggTm90YXRpb24gT25lIChJU08gODgyNCwgODgyNSkgY29kZWMuCisgKi8KKyAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQXhvbiBEaWdpdGFsIERlc2lnbiBCLlYuLCBUaGUgTmV0aGVybGFuZHMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogQXV0aG9yOiBDaHJpc3RpYWFuIFNpbW9ucyA8Y2hyaXN0aWFhbi5zaW1vbnNAYXhvbi50dj4KKyAqLworCisjaWZuZGVmIF9fTFdJUF9TTk1QX0FTTjFfSF9fCisjZGVmaW5lIF9fTFdJUF9TTk1QX0FTTjFfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorI2luY2x1ZGUgImx3aXAvZXJyLmgiCisjaW5jbHVkZSAibHdpcC9wYnVmLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wLmgiCisKKyNpZiBMV0lQX1NOTVAKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFNOTVBfQVNOMV9VTklWICAgKDApICAgIC8qICghMHg4MCB8ICEweDQwKSAqLworI2RlZmluZSBTTk1QX0FTTjFfQVBQTElDICgweDQwKSAvKiAoITB4ODAgfCAgMHg0MCkgKi8KKyNkZWZpbmUgU05NUF9BU04xX0NPTlRYVCAoMHg4MCkgLyogKCAweDgwIHwgITB4NDApICovCisKKyNkZWZpbmUgU05NUF9BU04xX0NPTlNUUiAoMHgyMCkgLyogKCAweDIwKSAqLworI2RlZmluZSBTTk1QX0FTTjFfUFJJTUlUICgwKSAgICAvKiAoITB4MjApICovCisKKy8qIHVuaXZlcnNhbCB0YWdzICovCisjZGVmaW5lIFNOTVBfQVNOMV9JTlRFRyAgMgorI2RlZmluZSBTTk1QX0FTTjFfT0NfU1RSIDQKKyNkZWZpbmUgU05NUF9BU04xX05VTCAgICA1CisjZGVmaW5lIFNOTVBfQVNOMV9PQkpfSUQgNgorI2RlZmluZSBTTk1QX0FTTjFfU0VRICAgIDE2CisKKy8qIGFwcGxpY2F0aW9uIHNwZWNpZmljIChTTk1QKSB0YWdzICovCisjZGVmaW5lIFNOTVBfQVNOMV9JUEFERFIgMCAgICAvKiBvY3RldCBzdHJpbmcgc2l6ZSg0KSAqLworI2RlZmluZSBTTk1QX0FTTjFfQ09VTlRFUiAxICAgLyogdTMyX3QgKi8KKyNkZWZpbmUgU05NUF9BU04xX0dBVUdFIDIgICAgIC8qIHUzMl90ICovCisjZGVmaW5lIFNOTVBfQVNOMV9USU1FVElDS1MgMyAvKiB1MzJfdCAqLworI2RlZmluZSBTTk1QX0FTTjFfT1BBUVVFIDQgICAgLyogb2N0ZXQgc3RyaW5nICovCisKKy8qIGNvbnRleHQgc3BlY2lmaWMgKFNOTVApIHRhZ3MgKi8KKyNkZWZpbmUgU05NUF9BU04xX1BEVV9HRVRfUkVRIDAKKyNkZWZpbmUgU05NUF9BU04xX1BEVV9HRVRfTkVYVF9SRVEgMQorI2RlZmluZSBTTk1QX0FTTjFfUERVX0dFVF9SRVNQIDIKKyNkZWZpbmUgU05NUF9BU04xX1BEVV9TRVRfUkVRIDMKKyNkZWZpbmUgU05NUF9BU04xX1BEVV9UUkFQIDQKKworZXJyX3Qgc25tcF9hc24xX2RlY190eXBlKHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMsIHU4X3QgKnR5cGUpOworZXJyX3Qgc25tcF9hc24xX2RlY19sZW5ndGgoc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcywgdThfdCAqb2N0ZXRzX3VzZWQsIHUxNl90ICpsZW5ndGgpOworZXJyX3Qgc25tcF9hc24xX2RlY191MzJ0KHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMsIHUxNl90IGxlbiwgdTMyX3QgKnZhbHVlKTsKK2Vycl90IHNubXBfYXNuMV9kZWNfczMydChzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1MTZfdCBsZW4sIHMzMl90ICp2YWx1ZSk7CitlcnJfdCBzbm1wX2FzbjFfZGVjX29pZChzdHJ1Y3QgcGJ1ZiAqcCwgdTE2X3Qgb2ZzLCB1MTZfdCBsZW4sIHN0cnVjdCBzbm1wX29ial9pZCAqb2lkKTsKK2Vycl90IHNubXBfYXNuMV9kZWNfcmF3KHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMsIHUxNl90IGxlbiwgdTE2X3QgcmF3X2xlbiwgdThfdCAqcmF3KTsKKwordm9pZCBzbm1wX2FzbjFfZW5jX2xlbmd0aF9jbnQodTE2X3QgbGVuZ3RoLCB1OF90ICpvY3RldHNfbmVlZGVkKTsKK3ZvaWQgc25tcF9hc24xX2VuY191MzJ0X2NudCh1MzJfdCB2YWx1ZSwgdTE2X3QgKm9jdGV0c19uZWVkZWQpOwordm9pZCBzbm1wX2FzbjFfZW5jX3MzMnRfY250KHMzMl90IHZhbHVlLCB1MTZfdCAqb2N0ZXRzX25lZWRlZCk7Cit2b2lkIHNubXBfYXNuMV9lbmNfb2lkX2NudCh1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCB1MTZfdCAqb2N0ZXRzX25lZWRlZCk7CitlcnJfdCBzbm1wX2FzbjFfZW5jX3R5cGUoc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcywgdThfdCB0eXBlKTsKK2Vycl90IHNubXBfYXNuMV9lbmNfbGVuZ3RoKHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMsIHUxNl90IGxlbmd0aCk7CitlcnJfdCBzbm1wX2FzbjFfZW5jX3UzMnQoc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcywgdTE2X3Qgb2N0ZXRzX25lZWRlZCwgdTMyX3QgdmFsdWUpOworZXJyX3Qgc25tcF9hc24xX2VuY19zMzJ0KHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMsIHUxNl90IG9jdGV0c19uZWVkZWQsIHMzMl90IHZhbHVlKTsKK2Vycl90IHNubXBfYXNuMV9lbmNfb2lkKHN0cnVjdCBwYnVmICpwLCB1MTZfdCBvZnMsIHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQpOworZXJyX3Qgc25tcF9hc24xX2VuY19yYXcoc3RydWN0IHBidWYgKnAsIHUxNl90IG9mcywgdTE2X3QgcmF3X2xlbiwgdThfdCAqcmF3KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIExXSVBfU05NUCAqLworCisjZW5kaWYgLyogX19MV0lQX1NOTVBfQVNOMV9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3NubXBfbXNnLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zbm1wX21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODNlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zbm1wX21zZy5oCkBAIC0wLDAgKzEsMzE1IEBACisvKioKKyAqIEBmaWxlCisgKiBTTk1QIEFnZW50IG1lc3NhZ2UgaGFuZGxpbmcgc3RydWN0dXJlcy4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEF4b24gRGlnaXRhbCBEZXNpZ24gQi5WLiwgVGhlIE5ldGhlcmxhbmRzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogQ2hyaXN0aWFhbiBTaW1vbnMgPGNocmlzdGlhYW4uc2ltb25zQGF4b24udHY+CisgKi8KKworI2lmbmRlZiBfX0xXSVBfU05NUF9NU0dfSF9fCisjZGVmaW5lIF9fTFdJUF9TTk1QX01TR19IX18KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisjaW5jbHVkZSAibHdpcC9zbm1wLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wX3N0cnVjdHMuaCIKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKyNpbmNsdWRlICJsd2lwL2Vyci5oIgorCisjaWYgTFdJUF9TTk1QCisKKyNpZiBTTk1QX1BSSVZBVEVfTUlCCisvKiBXaGVuIHVzaW5nIGEgcHJpdmF0ZSBNSUIsIHlvdSBoYXZlIHRvIGNyZWF0ZSBhIGZpbGUgJ3ByaXZhdGVfbWliLmgnIHRoYXQgY29udGFpbnMKKyAqIGEgJ3N0cnVjdCBtaWJfYXJyYXlfbm9kZSBtaWJfcHJpdmF0ZScgd2hpY2ggY29udGFpbnMgeW91ciBNSUIuICovCisjaW5jbHVkZSAicHJpdmF0ZV9taWIuaCIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZSBsaXN0ZW4gcG9ydCBvZiB0aGUgU05NUCBhZ2VudC4gQ2xpZW50cyBoYXZlIHRvIG1ha2UgdGhlaXIgcmVxdWVzdHMgdG8KKyAgIHRoaXMgcG9ydC4gTW9zdCBzdGFuZGFyZCBjbGllbnRzIHdvbid0IHdvcmsgaWYgeW91IGNoYW5nZSB0aGlzISAqLworI2lmbmRlZiBTTk1QX0lOX1BPUlQKKyNkZWZpbmUgU05NUF9JTl9QT1JUIDE2MQorI2VuZGlmCisvKiBUaGUgcmVtb3RlIHBvcnQgdGhlIFNOTVAgYWdlbnQgc2VuZHMgdHJhcHMgdG8uIE1vc3Qgc3RhbmRhcmQgdHJhcCBzaW5rcyB3b24ndAorICAgd29yayBpZiB5b3UgY2hhbmdlIHRoaXMhICovCisjaWZuZGVmIFNOTVBfVFJBUF9QT1JUCisjZGVmaW5lIFNOTVBfVFJBUF9QT1JUIDE2MgorI2VuZGlmCisKKyNkZWZpbmUgU05NUF9FU19OT0VSUk9SIDAKKyNkZWZpbmUgU05NUF9FU19UT09CSUcgMQorI2RlZmluZSBTTk1QX0VTX05PU1VDSE5BTUUgMgorI2RlZmluZSBTTk1QX0VTX0JBRFZBTFVFIDMKKyNkZWZpbmUgU05NUF9FU19SRUFET05MWSA0CisjZGVmaW5lIFNOTVBfRVNfR0VORVJST1IgNQorCisjZGVmaW5lIFNOTVBfR0VOVFJBUF9DT0xEU1RBUlQgMAorI2RlZmluZSBTTk1QX0dFTlRSQVBfV0FSTVNUQVJUIDEKKyNkZWZpbmUgU05NUF9HRU5UUkFQX0FVVEhGQUlMIDQKKyNkZWZpbmUgU05NUF9HRU5UUkFQX0VOVEVSUFJJU0VTUEMgNgorCitzdHJ1Y3Qgc25tcF92YXJiaW5kCit7CisgIC8qIG5leHQgcG9pbnRlciwgTlVMTCBmb3IgbGFzdCBpbiBsaXN0ICovCisgIHN0cnVjdCBzbm1wX3ZhcmJpbmQgKm5leHQ7CisgIC8qIHByZXZpb3VzIHBvaW50ZXIsIE5VTEwgZm9yIGZpcnN0IGluIGxpc3QgKi8KKyAgc3RydWN0IHNubXBfdmFyYmluZCAqcHJldjsKKworICAvKiBvYmplY3QgaWRlbnRpZmllciBsZW5ndGggKGluIHMzMl90KSAqLworICB1OF90IGlkZW50X2xlbjsKKyAgLyogb2JqZWN0IGlkZW50aWZpZXIgYXJyYXkgKi8KKyAgczMyX3QgKmlkZW50OworCisgIC8qIG9iamVjdCB2YWx1ZSBBU04xIHR5cGUgKi8KKyAgdThfdCB2YWx1ZV90eXBlOworICAvKiBvYmplY3QgdmFsdWUgbGVuZ3RoIChpbiB1OF90KSAqLworICB1OF90IHZhbHVlX2xlbjsKKyAgLyogb2JqZWN0IHZhbHVlICovCisgIHZvaWQgKnZhbHVlOworCisgIC8qIGVuY29kaW5nIHZhcmJpbmQgc2VxIGxlbmd0aCBsZW5ndGggKi8KKyAgdThfdCBzZXFsZW5sZW47CisgIC8qIGVuY29kaW5nIG9iamVjdCBpZGVudGlmaWVyIGxlbmd0aCBsZW5ndGggKi8KKyAgdThfdCBvbGVubGVuOworICAvKiBlbmNvZGluZyBvYmplY3QgdmFsdWUgbGVuZ3RoIGxlbmd0aCAqLworICB1OF90IHZsZW5sZW47CisgIC8qIGVuY29kaW5nIHZhcmJpbmQgc2VxIGxlbmd0aCAqLworICB1MTZfdCBzZXFsZW47CisgIC8qIGVuY29kaW5nIG9iamVjdCBpZGVudGlmaWVyIGxlbmd0aCAqLworICB1MTZfdCBvbGVuOworICAvKiBlbmNvZGluZyBvYmplY3QgdmFsdWUgbGVuZ3RoICovCisgIHUxNl90IHZsZW47Cit9OworCitzdHJ1Y3Qgc25tcF92YXJiaW5kX3Jvb3QKK3sKKyAgc3RydWN0IHNubXBfdmFyYmluZCAqaGVhZDsKKyAgc3RydWN0IHNubXBfdmFyYmluZCAqdGFpbDsKKyAgLyogbnVtYmVyIG9mIHZhcmlhYmxlIGJpbmRpbmdzIGluIGxpc3QgKi8KKyAgdThfdCBjb3VudDsKKyAgLyogZW5jb2RpbmcgdmFyYmluZC1saXN0IHNlcSBsZW5ndGggbGVuZ3RoICovCisgIHU4X3Qgc2VxbGVubGVuOworICAvKiBlbmNvZGluZyB2YXJiaW5kLWxpc3Qgc2VxIGxlbmd0aCAqLworICB1MTZfdCBzZXFsZW47Cit9OworCisvKiogb3V0cHV0IHJlc3BvbnNlIG1lc3NhZ2UgaGVhZGVyIGxlbmd0aCBmaWVsZHMgKi8KK3N0cnVjdCBzbm1wX3Jlc3BfaGVhZGVyX2xlbmd0aHMKK3sKKyAgLyogZW5jb2RpbmcgZXJyb3ItaW5kZXggbGVuZ3RoIGxlbmd0aCAqLworICB1OF90IGVycmlkeGxlbmxlbjsKKyAgLyogZW5jb2RpbmcgZXJyb3Itc3RhdHVzIGxlbmd0aCBsZW5ndGggKi8KKyAgdThfdCBlcnJzdGF0bGVubGVuOworICAvKiBlbmNvZGluZyByZXF1ZXN0IGlkIGxlbmd0aCBsZW5ndGggKi8KKyAgdThfdCByaWRsZW5sZW47CisgIC8qIGVuY29kaW5nIHBkdSBsZW5ndGggbGVuZ3RoICovCisgIHU4X3QgcGR1bGVubGVuOworICAvKiBlbmNvZGluZyBjb21tdW5pdHkgbGVuZ3RoIGxlbmd0aCAqLworICB1OF90IGNvbWxlbmxlbjsKKyAgLyogZW5jb2RpbmcgdmVyc2lvbiBsZW5ndGggbGVuZ3RoICovCisgIHU4X3QgdmVybGVubGVuOworICAvKiBlbmNvZGluZyBzZXF1ZW5jZSBsZW5ndGggbGVuZ3RoICovCisgIHU4X3Qgc2VxbGVubGVuOworCisgIC8qIGVuY29kaW5nIGVycm9yLWluZGV4IGxlbmd0aCAqLworICB1MTZfdCBlcnJpZHhsZW47CisgIC8qIGVuY29kaW5nIGVycm9yLXN0YXR1cyBsZW5ndGggKi8KKyAgdTE2X3QgZXJyc3RhdGxlbjsKKyAgLyogZW5jb2RpbmcgcmVxdWVzdCBpZCBsZW5ndGggKi8KKyAgdTE2X3QgcmlkbGVuOworICAvKiBlbmNvZGluZyBwZHUgbGVuZ3RoICovCisgIHUxNl90IHBkdWxlbjsKKyAgLyogZW5jb2RpbmcgY29tbXVuaXR5IGxlbmd0aCAqLworICB1MTZfdCBjb21sZW47CisgIC8qIGVuY29kaW5nIHZlcnNpb24gbGVuZ3RoICovCisgIHUxNl90IHZlcmxlbjsKKyAgLyogZW5jb2Rpbmcgc2VxdWVuY2UgbGVuZ3RoICovCisgIHUxNl90IHNlcWxlbjsKK307CisKKy8qKiBvdXRwdXQgcmVzcG9uc2UgbWVzc2FnZSBoZWFkZXIgbGVuZ3RoIGZpZWxkcyAqLworc3RydWN0IHNubXBfdHJhcF9oZWFkZXJfbGVuZ3RocworeworICAvKiBlbmNvZGluZyB0aW1lc3RhbXAgbGVuZ3RoIGxlbmd0aCAqLworICB1OF90IHRzbGVubGVuOworICAvKiBlbmNvZGluZyBzcGVjaWZpYy10cmFwIGxlbmd0aCBsZW5ndGggKi8KKyAgdThfdCBzdHJwbGVubGVuOworICAvKiBlbmNvZGluZyBnZW5lcmljLXRyYXAgbGVuZ3RoIGxlbmd0aCAqLworICB1OF90IGd0cnBsZW5sZW47CisgIC8qIGVuY29kaW5nIGFnZW50LWFkZHIgbGVuZ3RoIGxlbmd0aCAqLworICB1OF90IGFhZGRybGVubGVuOworICAvKiBlbmNvZGluZyBlbnRlcnByaXNlLWlkIGxlbmd0aCBsZW5ndGggKi8KKyAgdThfdCBlaWRsZW5sZW47CisgIC8qIGVuY29kaW5nIHBkdSBsZW5ndGggbGVuZ3RoICovCisgIHU4X3QgcGR1bGVubGVuOworICAvKiBlbmNvZGluZyBjb21tdW5pdHkgbGVuZ3RoIGxlbmd0aCAqLworICB1OF90IGNvbWxlbmxlbjsKKyAgLyogZW5jb2RpbmcgdmVyc2lvbiBsZW5ndGggbGVuZ3RoICovCisgIHU4X3QgdmVybGVubGVuOworICAvKiBlbmNvZGluZyBzZXF1ZW5jZSBsZW5ndGggbGVuZ3RoICovCisgIHU4X3Qgc2VxbGVubGVuOworCisgIC8qIGVuY29kaW5nIHRpbWVzdGFtcCBsZW5ndGggKi8KKyAgdTE2X3QgdHNsZW47CisgIC8qIGVuY29kaW5nIHNwZWNpZmljLXRyYXAgbGVuZ3RoICovCisgIHUxNl90IHN0cnBsZW47CisgIC8qIGVuY29kaW5nIGdlbmVyaWMtdHJhcCBsZW5ndGggKi8KKyAgdTE2X3QgZ3RycGxlbjsKKyAgLyogZW5jb2RpbmcgYWdlbnQtYWRkciBsZW5ndGggKi8KKyAgdTE2X3QgYWFkZHJsZW47CisgIC8qIGVuY29kaW5nIGVudGVycHJpc2UtaWQgbGVuZ3RoICovCisgIHUxNl90IGVpZGxlbjsKKyAgLyogZW5jb2RpbmcgcGR1IGxlbmd0aCAqLworICB1MTZfdCBwZHVsZW47CisgIC8qIGVuY29kaW5nIGNvbW11bml0eSBsZW5ndGggKi8KKyAgdTE2X3QgY29tbGVuOworICAvKiBlbmNvZGluZyB2ZXJzaW9uIGxlbmd0aCAqLworICB1MTZfdCB2ZXJsZW47CisgIC8qIGVuY29kaW5nIHNlcXVlbmNlIGxlbmd0aCAqLworICB1MTZfdCBzZXFsZW47Cit9OworCisvKiBBY2NlcHRpbmcgbmV3IFNOTVAgbWVzc2FnZXMuICovCisjZGVmaW5lIFNOTVBfTVNHX0VNUFRZICAgICAgICAgICAgICAgICAwCisvKiBTZWFyY2ggZm9yIG1hdGNoaW5nIG9iamVjdCBmb3IgdmFyaWFibGUgYmluZGluZy4gKi8KKyNkZWZpbmUgU05NUF9NU0dfU0VBUkNIX09CSiAgICAgICAgICAgIDEKKy8qIFBlcmZvcm0gU05NUCBvcGVyYXRpb24gb24gaW4tbWVtb3J5IG9iamVjdC4KKyAgIFBhc3MtdGhyb3VnaCBzdGF0ZXMsIGZvciBzeW1tZXRyeSBvbmx5LiAqLworI2RlZmluZSBTTk1QX01TR19JTlRFUk5BTF9HRVRfT0JKREVGICAgMgorI2RlZmluZSBTTk1QX01TR19JTlRFUk5BTF9HRVRfVkFMVUUgICAgMworI2RlZmluZSBTTk1QX01TR19JTlRFUk5BTF9TRVRfVEVTVCAgICAgNAorI2RlZmluZSBTTk1QX01TR19JTlRFUk5BTF9HRVRfT0JKREVGX1MgNQorI2RlZmluZSBTTk1QX01TR19JTlRFUk5BTF9TRVRfVkFMVUUgICAgNgorLyogUGVyZm9ybSBTTk1QIG9wZXJhdGlvbiBvbiBvYmplY3QgbG9jYXRlZCBleHRlcm5hbGx5LgorICAgSW4gdGhlb3J5IHRoaXMgY291bGQgYmUgdXNlZCBmb3IgYnVpbGRpbmcgYSBwcm94eSBhZ2VudC4KKyAgIFByYWN0aWNhbCB1c2UgaXMgZm9yIGFuIGVudGVycHJpc2Ugc3BjLiBhcHAuIGdhdGV3YXkuICovCisjZGVmaW5lIFNOTVBfTVNHX0VYVEVSTkFMX0dFVF9PQkpERUYgICA3CisjZGVmaW5lIFNOTVBfTVNHX0VYVEVSTkFMX0dFVF9WQUxVRSAgICA4CisjZGVmaW5lIFNOTVBfTVNHX0VYVEVSTkFMX1NFVF9URVNUICAgICA5CisjZGVmaW5lIFNOTVBfTVNHX0VYVEVSTkFMX0dFVF9PQkpERUZfUyAxMAorI2RlZmluZSBTTk1QX01TR19FWFRFUk5BTF9TRVRfVkFMVUUgICAgMTEKKworI2RlZmluZSBTTk1QX0NPTU1VTklUWV9TVFJfTEVOIDY0CitzdHJ1Y3Qgc25tcF9tc2dfcHN0YXQKK3sKKyAgLyogbHdJUCBsb2NhbCBwb3J0ICgxNjEpIGJpbmRpbmcgKi8KKyAgc3RydWN0IHVkcF9wY2IgKnBjYjsKKyAgLyogc291cmNlIElQIGFkZHJlc3MgKi8KKyAgaXBfYWRkcl90IHNpcDsKKyAgLyogc291cmNlIFVEUCBwb3J0ICovCisgIHUxNl90IHNwOworICAvKiByZXF1ZXN0IHR5cGUgKi8KKyAgdThfdCBydDsKKyAgLyogcmVxdWVzdCBJRCAqLworICBzMzJfdCByaWQ7CisgIC8qIGVycm9yIHN0YXR1cyAqLworICBzMzJfdCBlcnJvcl9zdGF0dXM7CisgIC8qIGVycm9yIGluZGV4ICovCisgIHMzMl90IGVycm9yX2luZGV4OworICAvKiBjb21tdW5pdHkgbmFtZSAoemVybyB0ZXJtaW5hdGVkKSAqLworICB1OF90IGNvbW11bml0eVtTTk1QX0NPTU1VTklUWV9TVFJfTEVOICsgMV07CisgIC8qIGNvbW11bml0eSBzdHJpbmcgbGVuZ3RoIChleGNsdXNpdmUgemVybyB0ZXJtKSAqLworICB1OF90IGNvbV9zdHJsZW47CisgIC8qIG9uZSBvdXQgb2YgTVNHX0VNUFRZLCBNU0dfREVNVVgsIE1TR19JTlRFUk5BTCwgTVNHX0VYVEVSTkFMX3ggKi8KKyAgdThfdCBzdGF0ZTsKKyAgLyogc2F2ZWQgYXJndW1lbnRzIGZvciBNU0dfRVhURVJOQUxfeCAqLworICBzdHJ1Y3QgbWliX2V4dGVybmFsX25vZGUgKmV4dF9taWJfbm9kZTsKKyAgc3RydWN0IHNubXBfbmFtZV9wdHIgZXh0X25hbWVfcHRyOworICBzdHJ1Y3Qgb2JqX2RlZiBleHRfb2JqZWN0X2RlZjsKKyAgc3RydWN0IHNubXBfb2JqX2lkIGV4dF9vaWQ7CisgIC8qIGluZGV4IGludG8gaW5wdXQgdmFyaWFibGUgYmluZGluZyBsaXN0ICovCisgIHU4X3QgdmJfaWR4OworICAvKiBwdHIgaW50byBpbnB1dCB2YXJpYWJsZSBiaW5kaW5nIGxpc3QgKi8KKyAgc3RydWN0IHNubXBfdmFyYmluZCAqdmJfcHRyOworICAvKiBsaXN0IG9mIHZhcmlhYmxlIGJpbmRpbmdzIGZyb20gaW5wdXQgKi8KKyAgc3RydWN0IHNubXBfdmFyYmluZF9yb290IGludmI7CisgIC8qIGxpc3Qgb2YgdmFyaWFibGUgYmluZGluZ3MgdG8gb3V0cHV0ICovCisgIHN0cnVjdCBzbm1wX3ZhcmJpbmRfcm9vdCBvdXR2YjsKKyAgLyogb3V0cHV0IHJlc3BvbnNlIGxlbmd0aHMgdXNlZCBpbiBBU04gZW5jb2RpbmcgKi8KKyAgc3RydWN0IHNubXBfcmVzcF9oZWFkZXJfbGVuZ3RocyByaGw7Cit9OworCitzdHJ1Y3Qgc25tcF9tc2dfdHJhcAoreworICAvKiBsd0lQIGxvY2FsIHBvcnQgKDE2MSkgYmluZGluZyAqLworICBzdHJ1Y3QgdWRwX3BjYiAqcGNiOworICAvKiBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzIGluIG5ldHdvcmsgb3JkZXIgKi8KKyAgaXBfYWRkcl90IGRpcDsKKworICAvKiBzb3VyY2UgZW50ZXJwcmlzZSBJRCAoc3lzT2JqZWN0SUQpICovCisgIHN0cnVjdCBzbm1wX29ial9pZCAqZW50ZXJwcmlzZTsKKyAgLyogc291cmNlIElQIGFkZHJlc3MsIHJhdyBuZXR3b3JrIG9yZGVyIGZvcm1hdCAqLworICB1OF90IHNpcF9yYXdbNF07CisgIC8qIGdlbmVyaWMgdHJhcCBjb2RlICovCisgIHUzMl90IGdlbl90cmFwOworICAvKiBzcGVjaWZpYyB0cmFwIGNvZGUgKi8KKyAgdTMyX3Qgc3BjX3RyYXA7CisgIC8qIHRpbWVzdGFtcCAqLworICB1MzJfdCB0czsKKyAgLyogbGlzdCBvZiB2YXJpYWJsZSBiaW5kaW5ncyB0byBvdXRwdXQgKi8KKyAgc3RydWN0IHNubXBfdmFyYmluZF9yb290IG91dHZiOworICAvKiBvdXRwdXQgdHJhcCBsZW5ndGhzIHVzZWQgaW4gQVNOIGVuY29kaW5nICovCisgIHN0cnVjdCBzbm1wX3RyYXBfaGVhZGVyX2xlbmd0aHMgdGhsOworfTsKKworLyoqIEFnZW50IFZlcnNpb24gY29uc3RhbnQsIDAgPSB2MSBvZGRpdHkgKi8KK2V4dGVybiBjb25zdCBzMzJfdCBzbm1wX3ZlcnNpb247CisvKiogQWdlbnQgZGVmYXVsdCAicHVibGljIiBjb21tdW5pdHkgc3RyaW5nICovCitleHRlcm4gY29uc3QgY2hhciBzbm1wX3B1YmxpY2NvbW11bml0eVs3XTsKKworZXh0ZXJuIHN0cnVjdCBzbm1wX21zZ190cmFwIHRyYXBfbXNnOworCisvKiogQWdlbnQgc2V0dXAsIHN0YXJ0IGxpc3RlbmluZyB0byBwb3J0IDE2MS4gKi8KK3ZvaWQgc25tcF9pbml0KHZvaWQpOwordm9pZCBzbm1wX3RyYXBfZHN0X2VuYWJsZSh1OF90IGRzdF9pZHgsIHU4X3QgZW5hYmxlKTsKK3ZvaWQgc25tcF90cmFwX2RzdF9pcF9zZXQodThfdCBkc3RfaWR4LCBpcF9hZGRyX3QgKmRzdCk7CisKKy8qKiBWYXJiaW5kLWxpc3QgZnVuY3Rpb25zLiAqLworc3RydWN0IHNubXBfdmFyYmluZCogc25tcF92YXJiaW5kX2FsbG9jKHN0cnVjdCBzbm1wX29ial9pZCAqb2lkLCB1OF90IHR5cGUsIHU4X3QgbGVuKTsKK3ZvaWQgc25tcF92YXJiaW5kX2ZyZWUoc3RydWN0IHNubXBfdmFyYmluZCAqdmIpOwordm9pZCBzbm1wX3ZhcmJpbmRfbGlzdF9mcmVlKHN0cnVjdCBzbm1wX3ZhcmJpbmRfcm9vdCAqcm9vdCk7Cit2b2lkIHNubXBfdmFyYmluZF90YWlsX2FkZChzdHJ1Y3Qgc25tcF92YXJiaW5kX3Jvb3QgKnJvb3QsIHN0cnVjdCBzbm1wX3ZhcmJpbmQgKnZiKTsKK3N0cnVjdCBzbm1wX3ZhcmJpbmQqIHNubXBfdmFyYmluZF90YWlsX3JlbW92ZShzdHJ1Y3Qgc25tcF92YXJiaW5kX3Jvb3QgKnJvb3QpOworCisvKiogSGFuZGxlIGFuIGludGVybmFsIChyZWN2KSBvciBleHRlcm5hbCAocHJpdmF0ZSByZXNwb25zZSkgZXZlbnQuICovCit2b2lkIHNubXBfbXNnX2V2ZW50KHU4X3QgcmVxdWVzdF9pZCk7CitlcnJfdCBzbm1wX3NlbmRfcmVzcG9uc2Uoc3RydWN0IHNubXBfbXNnX3BzdGF0ICptX3N0YXQpOworZXJyX3Qgc25tcF9zZW5kX3RyYXAoczhfdCBnZW5lcmljX3RyYXAsIHN0cnVjdCBzbm1wX29ial9pZCAqZW9pZCwgczMyX3Qgc3BlY2lmaWNfdHJhcCk7Cit2b2lkIHNubXBfY29sZHN0YXJ0X3RyYXAodm9pZCk7Cit2b2lkIHNubXBfYXV0aGZhaWxfdHJhcCh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIExXSVBfU05NUCAqLworCisjZW5kaWYgLyogX19MV0lQX1NOTVBfTVNHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvc25tcF9zdHJ1Y3RzLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zbm1wX3N0cnVjdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDNiNDZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvc25tcF9zdHJ1Y3RzLmgKQEAgLTAsMCArMSwyNjggQEAKKy8qKgorICogQGZpbGUKKyAqIEdlbmVyaWMgTUlCIHRyZWUgc3RydWN0dXJlcy4KKyAqCisgKiBAdG9kbyBuYW1lc3BhY2UgcHJlZml4ZXMKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEF4b24gRGlnaXRhbCBEZXNpZ24gQi5WLiwgVGhlIE5ldGhlcmxhbmRzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEF1dGhvcjogQ2hyaXN0aWFhbiBTaW1vbnMgPGNocmlzdGlhYW4uc2ltb25zQGF4b24udHY+CisgKi8KKworI2lmbmRlZiBfX0xXSVBfU05NUF9TVFJVQ1RTX0hfXworI2RlZmluZSBfX0xXSVBfU05NUF9TVFJVQ1RTX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfU05NUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvc25tcC5oIgorCisjaWYgU05NUF9QUklWQVRFX01JQgorLyogV2hlbiB1c2luZyBhIHByaXZhdGUgTUlCLCB5b3UgaGF2ZSB0byBjcmVhdGUgYSBmaWxlICdwcml2YXRlX21pYi5oJyB0aGF0IGNvbnRhaW5zCisgKiBhICdzdHJ1Y3QgbWliX2FycmF5X25vZGUgbWliX3ByaXZhdGUnIHdoaWNoIGNvbnRhaW5zIHlvdXIgTUlCLiAqLworI2luY2x1ZGUgInByaXZhdGVfbWliLmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBNSUIgb2JqZWN0IGluc3RhbmNlICovCisjZGVmaW5lIE1JQl9PQkpFQ1RfTk9ORSAwIAorI2RlZmluZSBNSUJfT0JKRUNUX1NDQUxBUiAxCisjZGVmaW5lIE1JQl9PQkpFQ1RfVEFCIDIKKworLyogTUlCIGFjY2VzcyB0eXBlcyAqLworI2RlZmluZSBNSUJfQUNDRVNTX1JFQUQgICAxCisjZGVmaW5lIE1JQl9BQ0NFU1NfV1JJVEUgIDIKKworLyogTUlCIG9iamVjdCBhY2Nlc3MgKi8KKyNkZWZpbmUgTUlCX09CSkVDVF9SRUFEX09OTFkgICAgICBNSUJfQUNDRVNTX1JFQUQKKyNkZWZpbmUgTUlCX09CSkVDVF9SRUFEX1dSSVRFICAgICAoTUlCX0FDQ0VTU19SRUFEIHwgTUlCX0FDQ0VTU19XUklURSkKKyNkZWZpbmUgTUlCX09CSkVDVF9XUklURV9PTkxZICAgICBNSUJfQUNDRVNTX1dSSVRFCisjZGVmaW5lIE1JQl9PQkpFQ1RfTk9UX0FDQ0VTU0lCTEUgMAorCisvKiogb2JqZWN0IGRlZmluaXRpb24gcmV0dXJuZWQgYnkgKGdldF9vYmplY3RfZGVmKSgpICovCitzdHJ1Y3Qgb2JqX2RlZgoreworICAvKiBNSUJfT0JKRUNUX05PTkUgKDApLCBNSUJfT0JKRUNUX1NDQUxBUiAoMSksIE1JQl9PQkpFQ1RfVEFCICgyKSAqLworICB1OF90IGluc3RhbmNlOworICAvKiAwIHJlYWQtb25seSwgMSByZWFkLXdyaXRlLCAyIHdyaXRlLW9ubHksIDMgbm90LWFjY2Vzc2libGUgKi8KKyAgdThfdCBhY2Nlc3M7CisgIC8qIEFTTiB0eXBlIGZvciB0aGlzIG9iamVjdCAqLworICB1OF90IGFzbl90eXBlOworICAvKiB2YWx1ZSBsZW5ndGggKGhvc3QgbGVuZ3RoKSAqLworICB1MTZfdCB2X2xlbjsKKyAgLyogbGVuZ3RoIG9mIGluc3RhbmNlIHBhcnQgb2Ygc3VwcGxpZWQgb2JqZWN0IGlkZW50aWZpZXIgKi8KKyAgdThfdCAgaWRfaW5zdF9sZW47CisgIC8qIGluc3RhbmNlIHBhcnQgb2Ygc3VwcGxpZWQgb2JqZWN0IGlkZW50aWZpZXIgKi8KKyAgczMyX3QgKmlkX2luc3RfcHRyOworfTsKKworc3RydWN0IHNubXBfbmFtZV9wdHIKK3sKKyAgdThfdCBpZGVudF9sZW47CisgIHMzMl90ICppZGVudDsKK307CisKKy8qKiBNSUIgY29uc3Qgc2NhbGFyICguMCkgbm9kZSAqLworI2RlZmluZSBNSUJfTk9ERV9TQyAweDAxCisvKiogTUlCIGNvbnN0IGFycmF5IG5vZGUgKi8KKyNkZWZpbmUgTUlCX05PREVfQVIgMHgwMgorLyoqIE1JQiBhcnJheSBub2RlIChtZW1fbWFsbG9jZWQgZnJvbSBSQU0pICovCisjZGVmaW5lIE1JQl9OT0RFX1JBIDB4MDMKKy8qKiBNSUIgbGlzdCByb290IG5vZGUgKG1lbV9tYWxsb2NlZCBmcm9tIFJBTSkgKi8KKyNkZWZpbmUgTUlCX05PREVfTFIgMHgwNAorLyoqIE1JQiBub2RlIGZvciBleHRlcm5hbCBvYmplY3RzICovCisjZGVmaW5lIE1JQl9OT0RFX0VYIDB4MDUKKworLyoqIG5vZGUgImJhc2UgY2xhc3MiIGxheW91dCwgdGhlIG1hbmRhdG9yeSBmaWVsZHMgZm9yIGEgbm9kZSAgKi8KK3N0cnVjdCBtaWJfbm9kZQoreworICAvKiogcmV0dXJucyBzdHJ1Y3Qgb2JqX2RlZiBmb3IgdGhlIGdpdmVuIG9iamVjdCBpZGVudGlmaWVyICovCisgIHZvaWQgKCpnZXRfb2JqZWN0X2RlZikodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKTsKKyAgLyoqIHJldHVybnMgb2JqZWN0IHZhbHVlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGlkZW50aWZpZXIsCisgICAgIEBub3RlIHRoZSBjYWxsZXIgbXVzdCBhbGxvY2F0ZSBhdCBsZWFzdCBsZW4gYnl0ZXMgZm9yIHRoZSB2YWx1ZSAqLworICB2b2lkICgqZ2V0X3ZhbHVlKShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworICAvKiogdGVzdHMgbGVuZ3RoIGFuZC9vciByYW5nZSBCRUZPUkUgc2V0dGluZyAqLworICB1OF90ICgqc2V0X3Rlc3QpKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSk7CisgIC8qKiBzZXRzIG9iamVjdCB2YWx1ZSwgb25seSB0byBiZSBjYWxsZWQgd2hlbiBzZXRfdGVzdCgpICAqLworICB2b2lkICgqc2V0X3ZhbHVlKShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOyAgCisgIC8qKiBPbmUgb3V0IG9mIE1JQl9OT0RFX0FSLCBNSUJfTk9ERV9MUiBvciBNSUJfTk9ERV9FWCAqLworICB1OF90IG5vZGVfdHlwZTsKKyAgLyogYXJyYXkgb3IgbWF4IGxpc3QgbGVuZ3RoICovCisgIHUxNl90IG1heGxlbmd0aDsKK307CisKKy8qKiBkZXJpdmVkIG5vZGUgZm9yIHNjYWxhcnMgLjAgaW5kZXggKi8KK3R5cGVkZWYgc3RydWN0IG1pYl9ub2RlIG1pYl9zY2FsYXJfbm9kZTsKKworLyoqIGRlcml2ZWQgbm9kZSwgcG9pbnRzIHRvIGEgZml4ZWQgc2l6ZSBjb25zdCBhcnJheQorICAgIG9mIHN1Yi1pZGVudGlmaWVycyBwbHVzIGEgJ2NoaWxkJyBwb2ludGVyICovCitzdHJ1Y3QgbWliX2FycmF5X25vZGUKK3sKKyAgLyogaW5oZXJpdGVkICJiYXNlIGNsYXNzIiBtZW1iZXJzICovCisgIHZvaWQgKCpnZXRfb2JqZWN0X2RlZikodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKTsKKyAgdm9pZCAoKmdldF92YWx1ZSkoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKKyAgdThfdCAoKnNldF90ZXN0KShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworICB2b2lkICgqc2V0X3ZhbHVlKShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworCisgIHU4X3Qgbm9kZV90eXBlOworICB1MTZfdCBtYXhsZW5ndGg7CisKKyAgLyogYWRkaXRpb25hbCBzdHJ1Y3QgbWVtYmVycyAqLworICBjb25zdCBzMzJfdCAqb2JqaWQ7CisgIHN0cnVjdCBtaWJfbm9kZSogY29uc3QgKm5wdHI7Cit9OworCisvKiogZGVyaXZlZCBub2RlLCBwb2ludHMgdG8gYSBmaXhlZCBzaXplIG1lbV9tYWxsb2NlZCBhcnJheQorICAgIG9mIHN1Yi1pZGVudGlmaWVycyBwbHVzIGEgJ2NoaWxkJyBwb2ludGVyICovCitzdHJ1Y3QgbWliX3JhbV9hcnJheV9ub2RlCit7CisgIC8qIGluaGVyaXRlZCAiYmFzZSBjbGFzcyIgbWVtYmVycyAqLworICB2b2lkICgqZ2V0X29iamVjdF9kZWYpKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBvYmpfZGVmICpvZCk7CisgIHZvaWQgKCpnZXRfdmFsdWUpKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSk7CisgIHU4X3QgKCpzZXRfdGVzdCkoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKKyAgdm9pZCAoKnNldF92YWx1ZSkoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKKworICB1OF90IG5vZGVfdHlwZTsKKyAgdTE2X3QgbWF4bGVuZ3RoOworCisgIC8qIGFkaXRpb25hbCBzdHJ1Y3QgbWVtYmVycyAqLworICBzMzJfdCAqb2JqaWQ7CisgIHN0cnVjdCBtaWJfbm9kZSAqKm5wdHI7Cit9OworCitzdHJ1Y3QgbWliX2xpc3Rfbm9kZQoreworICBzdHJ1Y3QgbWliX2xpc3Rfbm9kZSAqcHJldjsgIAorICBzdHJ1Y3QgbWliX2xpc3Rfbm9kZSAqbmV4dDsKKyAgczMyX3Qgb2JqaWQ7CisgIHN0cnVjdCBtaWJfbm9kZSAqbnB0cjsKK307CisKKy8qKiBkZXJpdmVkIG5vZGUsIHBvaW50cyB0byBhIGRvdWJseSBsaW5rZWQgbGlzdAorICAgIG9mIHN1Yi1pZGVudGlmaWVycyBwbHVzIGEgJ2NoaWxkJyBwb2ludGVyICovCitzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUKK3sKKyAgLyogaW5oZXJpdGVkICJiYXNlIGNsYXNzIiBtZW1iZXJzICovCisgIHZvaWQgKCpnZXRfb2JqZWN0X2RlZikodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKTsKKyAgdm9pZCAoKmdldF92YWx1ZSkoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKKyAgdThfdCAoKnNldF90ZXN0KShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworICB2b2lkICgqc2V0X3ZhbHVlKShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworCisgIHU4X3Qgbm9kZV90eXBlOworICB1MTZfdCBtYXhsZW5ndGg7CisKKyAgLyogYWRkaXRpb25hbCBzdHJ1Y3QgbWVtYmVycyAqLworICBzdHJ1Y3QgbWliX2xpc3Rfbm9kZSAqaGVhZDsKKyAgc3RydWN0IG1pYl9saXN0X25vZGUgKnRhaWw7CisgIC8qIGNvdW50cyBsaXN0IG5vZGVzIGluIGxpc3QgICovCisgIHUxNl90IGNvdW50OworfTsKKworLyoqIGRlcml2ZWQgbm9kZSwgaGFzIGFjY2VzcyBmdW5jdGlvbnMgZm9yIG1pYiBvYmplY3QgaW4gZXh0ZXJuYWwgbWVtb3J5IG9yIGRldmljZQorICAgIHVzaW5nICd0cmVlX2xldmVsJyBhbmQgJ2lkeCcsIHdpdGggYSByYW5nZSAwIC4uIChsZXZlbF9sZW5ndGgoKSAtIDEpICovCitzdHJ1Y3QgbWliX2V4dGVybmFsX25vZGUKK3sKKyAgLyogaW5oZXJpdGVkICJiYXNlIGNsYXNzIiBtZW1iZXJzICovCisgIHZvaWQgKCpnZXRfb2JqZWN0X2RlZikodThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IG9ial9kZWYgKm9kKTsKKyAgdm9pZCAoKmdldF92YWx1ZSkoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKKyAgdThfdCAoKnNldF90ZXN0KShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworICB2b2lkICgqc2V0X3ZhbHVlKShzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworCisgIHU4X3Qgbm9kZV90eXBlOworICB1MTZfdCBtYXhsZW5ndGg7CisKKyAgLyogYWRkaXRpb25hbCBzdHJ1Y3QgbWVtYmVycyAqLworICAvKiogcG9pbnRzIHRvIGFuIGV4dGVybmFsIChpbiBtZW1vcnkpIHJlY29yZCBvZiBzb21lIHNvcnQgb2YgYWRkcmVzc2luZworICAgICAgaW5mb3JtYXRpb24sIHBhc3NlZCB0byBhbmQgaW50ZXJwcmV0ZWQgYnkgdGhlIGZ1bnRpb25zIGJlbG93ICovCisgIHZvaWQqIGFkZHJfaW5mOworICAvKiogdHJlZSBsZXZlbHMgdW5kZXIgdGhpcyBub2RlICovCisgIHU4X3QgdHJlZV9sZXZlbHM7CisgIC8qKiBudW1iZXIgb2Ygb2JqZWN0cyBhdCB0aGlzIGxldmVsICovCisgIHUxNl90ICgqbGV2ZWxfbGVuZ3RoKSh2b2lkKiBhZGRyX2luZiwgdThfdCBsZXZlbCk7CisgIC8qKiBjb21wYXJlcyBvYmplY3Qgc3ViIGlkZW50aWZpZXIgd2l0aCBleHRlcm5hbCBpZAorICAgICAgcmV0dXJuIHplcm8gd2hlbiBlcXVhbCwgbm9uemVybyB3aGVuIHVuZXF1YWwgKi8KKyAgczMyX3QgKCppZGVudF9jbXApKHZvaWQqIGFkZHJfaW5mLCB1OF90IGxldmVsLCB1MTZfdCBpZHgsIHMzMl90IHN1Yl9pZCk7CisgIHZvaWQgKCpnZXRfb2JqaWQpKHZvaWQqIGFkZHJfaW5mLCB1OF90IGxldmVsLCB1MTZfdCBpZHgsIHMzMl90ICpzdWJfaWQpOworCisgIC8qKiBhc3luYyBRdWVzdGlvbnMgKi8KKyAgdm9pZCAoKmdldF9vYmplY3RfZGVmX3EpKHZvaWQqIGFkZHJfaW5mLCB1OF90IHJpZCwgdThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCk7CisgIHZvaWQgKCpnZXRfdmFsdWVfcSkodThfdCByaWQsIHN0cnVjdCBvYmpfZGVmICpvZCk7CisgIHZvaWQgKCpzZXRfdGVzdF9xKSh1OF90IHJpZCwgc3RydWN0IG9ial9kZWYgKm9kKTsKKyAgdm9pZCAoKnNldF92YWx1ZV9xKSh1OF90IHJpZCwgc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKKyAgLyoqIGFzeW5jIEFuc3dlcnMgKi8KKyAgdm9pZCAoKmdldF9vYmplY3RfZGVmX2EpKHU4X3QgcmlkLCB1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgb2JqX2RlZiAqb2QpOworICB2b2lkICgqZ2V0X3ZhbHVlX2EpKHU4X3QgcmlkLCBzdHJ1Y3Qgb2JqX2RlZiAqb2QsIHUxNl90IGxlbiwgdm9pZCAqdmFsdWUpOworICB1OF90ICgqc2V0X3Rlc3RfYSkodThfdCByaWQsIHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSk7CisgIHZvaWQgKCpzZXRfdmFsdWVfYSkodThfdCByaWQsIHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSk7CisgIC8qKiBhc3luYyBQYW5pYyBDbG9zZSAoYWdlbnQgcmV0dXJucyBlcnJvciByZXBseSwgCisgICAgICBlLmcuIHVzZWQgZm9yIGV4dGVybmFsIHRyYW5zYWN0aW9uIGNsZWFudXApICovCisgIHZvaWQgKCpnZXRfb2JqZWN0X2RlZl9wYykodThfdCByaWQsIHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQpOworICB2b2lkICgqZ2V0X3ZhbHVlX3BjKSh1OF90IHJpZCwgc3RydWN0IG9ial9kZWYgKm9kKTsKKyAgdm9pZCAoKnNldF90ZXN0X3BjKSh1OF90IHJpZCwgc3RydWN0IG9ial9kZWYgKm9kKTsKKyAgdm9pZCAoKnNldF92YWx1ZV9wYykodThfdCByaWQsIHN0cnVjdCBvYmpfZGVmICpvZCk7Cit9OworCisvKiogZXhwb3J0IE1JQiB0cmVlIGZyb20gbWliMi5jICovCitleHRlcm4gY29uc3Qgc3RydWN0IG1pYl9hcnJheV9ub2RlIGludGVybmV0OworCisvKiogZHVtbXkgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIG5vbi1sZWFmIE1JQiBub2RlcyBmcm9tIG1pYjIuYyAqLwordm9pZCBub2xlYWZzX2dldF9vYmplY3RfZGVmKHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBvYmpfZGVmICpvZCk7Cit2b2lkIG5vbGVhZnNfZ2V0X3ZhbHVlKHN0cnVjdCBvYmpfZGVmICpvZCwgdTE2X3QgbGVuLCB2b2lkICp2YWx1ZSk7Cit1OF90IG5vbGVhZnNfc2V0X3Rlc3Qoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKK3ZvaWQgbm9sZWFmc19zZXRfdmFsdWUoc3RydWN0IG9ial9kZWYgKm9kLCB1MTZfdCBsZW4sIHZvaWQgKnZhbHVlKTsKKwordm9pZCBzbm1wX29pZHRvaXAoczMyX3QgKmlkZW50LCBpcF9hZGRyX3QgKmlwKTsKK3ZvaWQgc25tcF9pcHRvb2lkKGlwX2FkZHJfdCAqaXAsIHMzMl90ICppZGVudCk7Cit2b2lkIHNubXBfaWZpbmRleHRvbmV0aWYoczMyX3QgaWZpbmRleCwgc3RydWN0IG5ldGlmICoqbmV0aWYpOwordm9pZCBzbm1wX25ldGlmdG9pZmluZGV4KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHMzMl90ICppZmlkeCk7CisKK3N0cnVjdCBtaWJfbGlzdF9ub2RlKiBzbm1wX21pYl9sbl9hbGxvYyhzMzJfdCBpZCk7Cit2b2lkIHNubXBfbWliX2xuX2ZyZWUoc3RydWN0IG1pYl9saXN0X25vZGUgKmxuKTsKK3N0cnVjdCBtaWJfbGlzdF9yb290bm9kZSogc25tcF9taWJfbHJuX2FsbG9jKHZvaWQpOwordm9pZCBzbm1wX21pYl9scm5fZnJlZShzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKmxybik7CisKK3M4X3Qgc25tcF9taWJfbm9kZV9pbnNlcnQoc3RydWN0IG1pYl9saXN0X3Jvb3Rub2RlICpybiwgczMyX3Qgb2JqaWQsIHN0cnVjdCBtaWJfbGlzdF9ub2RlICoqaW5zbik7CitzOF90IHNubXBfbWliX25vZGVfZmluZChzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKnJuLCBzMzJfdCBvYmppZCwgc3RydWN0IG1pYl9saXN0X25vZGUgKipmbik7CitzdHJ1Y3QgbWliX2xpc3Rfcm9vdG5vZGUgKnNubXBfbWliX25vZGVfZGVsZXRlKHN0cnVjdCBtaWJfbGlzdF9yb290bm9kZSAqcm4sIHN0cnVjdCBtaWJfbGlzdF9ub2RlICpuKTsKKworc3RydWN0IG1pYl9ub2RlKiBzbm1wX3NlYXJjaF90cmVlKHN0cnVjdCBtaWJfbm9kZSAqbm9kZSwgdThfdCBpZGVudF9sZW4sIHMzMl90ICppZGVudCwgc3RydWN0IHNubXBfbmFtZV9wdHIgKm5wKTsKK3N0cnVjdCBtaWJfbm9kZSogc25tcF9leHBhbmRfdHJlZShzdHJ1Y3QgbWliX25vZGUgKm5vZGUsIHU4X3QgaWRlbnRfbGVuLCBzMzJfdCAqaWRlbnQsIHN0cnVjdCBzbm1wX29ial9pZCAqb2lkcmV0KTsKK3U4X3Qgc25tcF9pc29fcHJlZml4X3RzdCh1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50KTsKK3U4X3Qgc25tcF9pc29fcHJlZml4X2V4cGFuZCh1OF90IGlkZW50X2xlbiwgczMyX3QgKmlkZW50LCBzdHJ1Y3Qgc25tcF9vYmpfaWQgKm9pZHJldCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBMV0lQX1NOTVAgKi8KKworI2VuZGlmIC8qIF9fTFdJUF9TTk1QX1NUUlVDVFNfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zb2NrZXRzLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zb2NrZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4ZmVkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3NvY2tldHMuaApAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKworCisjaWZuZGVmIF9fTFdJUF9TT0NLRVRTX0hfXworI2RlZmluZSBfX0xXSVBfU09DS0VUU19IX18KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX1NPQ0tFVCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAvKiBmb3Igc2l6ZV90ICovCisKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKyNpbmNsdWRlICJsd2lwL2luZXQuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBtZW1iZXJzIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KK3N0cnVjdCBzb2NrYWRkcl9pbiB7CisgIHU4X3Qgc2luX2xlbjsKKyAgdThfdCBzaW5fZmFtaWx5OworICB1MTZfdCBzaW5fcG9ydDsKKyAgc3RydWN0IGluX2FkZHIgc2luX2FkZHI7CisgIGNoYXIgc2luX3plcm9bOF07Cit9OworCitzdHJ1Y3Qgc29ja2FkZHIgeworICB1OF90IHNhX2xlbjsKKyAgdThfdCBzYV9mYW1pbHk7CisgIGNoYXIgc2FfZGF0YVsxNF07Cit9OworCisjaWZuZGVmIHNvY2tsZW5fdAorIyAgZGVmaW5lIHNvY2tsZW5fdCB1MzJfdAorI2VuZGlmCisKKy8qIFNvY2tldCBwcm90b2NvbCB0eXBlcyAoVENQL1VEUC9SQVcpICovCisjZGVmaW5lIFNPQ0tfU1RSRUFNICAgICAxCisjZGVmaW5lIFNPQ0tfREdSQU0gICAgICAyCisjZGVmaW5lIFNPQ0tfUkFXICAgICAgICAzCisKKy8qCisgKiBPcHRpb24gZmxhZ3MgcGVyLXNvY2tldC4gVGhlc2UgbXVzdCBtYXRjaCB0aGUgU09GXyBmbGFncyBpbiBpcC5oIChjaGVja2VkIGluIGluaXQuYykKKyAqLworI2RlZmluZSAgU09fREVCVUcgICAgICAgMHgwMDAxIC8qIFVuaW1wbGVtZW50ZWQ6IHR1cm4gb24gZGVidWdnaW5nIGluZm8gcmVjb3JkaW5nICovCisjZGVmaW5lICBTT19BQ0NFUFRDT05OICAweDAwMDIgLyogc29ja2V0IGhhcyBoYWQgbGlzdGVuKCkgKi8KKyNkZWZpbmUgIFNPX1JFVVNFQUREUiAgIDB4MDAwNCAvKiBBbGxvdyBsb2NhbCBhZGRyZXNzIHJldXNlICovCisjZGVmaW5lICBTT19LRUVQQUxJVkUgICAweDAwMDggLyoga2VlcCBjb25uZWN0aW9ucyBhbGl2ZSAqLworI2RlZmluZSAgU09fRE9OVFJPVVRFICAgMHgwMDEwIC8qIFVuaW1wbGVtZW50ZWQ6IGp1c3QgdXNlIGludGVyZmFjZSBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgIFNPX0JST0FEQ0FTVCAgIDB4MDAyMCAvKiBwZXJtaXQgdG8gc2VuZCBhbmQgdG8gcmVjZWl2ZSBicm9hZGNhc3QgbWVzc2FnZXMgKHNlZSBJUF9TT0ZfQlJPQURDQVNUIG9wdGlvbikgKi8KKyNkZWZpbmUgIFNPX1VTRUxPT1BCQUNLIDB4MDA0MCAvKiBVbmltcGxlbWVudGVkOiBieXBhc3MgaGFyZHdhcmUgd2hlbiBwb3NzaWJsZSAqLworI2RlZmluZSAgU09fTElOR0VSICAgICAgMHgwMDgwIC8qIGxpbmdlciBvbiBjbG9zZSBpZiBkYXRhIHByZXNlbnQgKi8KKyNkZWZpbmUgIFNPX09PQklOTElORSAgIDB4MDEwMCAvKiBVbmltcGxlbWVudGVkOiBsZWF2ZSByZWNlaXZlZCBPT0IgZGF0YSBpbiBsaW5lICovCisjZGVmaW5lICBTT19SRVVTRVBPUlQgICAweDAyMDAgLyogVW5pbXBsZW1lbnRlZDogYWxsb3cgbG9jYWwgYWRkcmVzcyAmIHBvcnQgcmV1c2UgKi8KKworI2RlZmluZSBTT19ET05UTElOR0VSICAgKChpbnQpKH5TT19MSU5HRVIpKQorCisvKgorICogQWRkaXRpb25hbCBvcHRpb25zLCBub3Qga2VwdCBpbiBzb19vcHRpb25zLgorICovCisjZGVmaW5lIFNPX1NOREJVRiAgICAweDEwMDEgICAgLyogVW5pbXBsZW1lbnRlZDogc2VuZCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBTT19SQ1ZCVUYgICAgMHgxMDAyICAgIC8qIHJlY2VpdmUgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgU09fU05ETE9XQVQgIDB4MTAwMyAgICAvKiBVbmltcGxlbWVudGVkOiBzZW5kIGxvdy13YXRlciBtYXJrICovCisjZGVmaW5lIFNPX1JDVkxPV0FUICAweDEwMDQgICAgLyogVW5pbXBsZW1lbnRlZDogcmVjZWl2ZSBsb3ctd2F0ZXIgbWFyayAqLworI2RlZmluZSBTT19TTkRUSU1FTyAgMHgxMDA1ICAgIC8qIFVuaW1wbGVtZW50ZWQ6IHNlbmQgdGltZW91dCAqLworI2RlZmluZSBTT19SQ1ZUSU1FTyAgMHgxMDA2ICAgIC8qIHJlY2VpdmUgdGltZW91dCAqLworI2RlZmluZSBTT19FUlJPUiAgICAgMHgxMDA3ICAgIC8qIGdldCBlcnJvciBzdGF0dXMgYW5kIGNsZWFyICovCisjZGVmaW5lIFNPX1RZUEUgICAgICAweDEwMDggICAgLyogZ2V0IHNvY2tldCB0eXBlICovCisjZGVmaW5lIFNPX0NPTlRJTUVPICAweDEwMDkgICAgLyogVW5pbXBsZW1lbnRlZDogY29ubmVjdCB0aW1lb3V0ICovCisjZGVmaW5lIFNPX05PX0NIRUNLICAweDEwMGEgICAgLyogZG9uJ3QgY3JlYXRlIFVEUCBjaGVja3N1bSAqLworCisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgbWFuaXB1bGF0aW5nIGxpbmdlciBvcHRpb24uCisgKi8KK3N0cnVjdCBsaW5nZXIgeworICAgICAgIGludCBsX29ub2ZmOyAgICAgICAgICAgICAgICAvKiBvcHRpb24gb24vb2ZmICovCisgICAgICAgaW50IGxfbGluZ2VyOyAgICAgICAgICAgICAgIC8qIGxpbmdlciB0aW1lICovCit9OworCisvKgorICogTGV2ZWwgbnVtYmVyIGZvciAoZ2V0L3NldClzb2Nrb3B0KCkgdG8gYXBwbHkgdG8gc29ja2V0IGl0c2VsZi4KKyAqLworI2RlZmluZSAgU09MX1NPQ0tFVCAgMHhmZmYgICAgLyogb3B0aW9ucyBmb3Igc29ja2V0IGxldmVsICovCisKKworI2RlZmluZSBBRl9VTlNQRUMgICAgICAgMAorI2RlZmluZSBBRl9JTkVUICAgICAgICAgMgorI2RlZmluZSBQRl9JTkVUICAgICAgICAgQUZfSU5FVAorI2RlZmluZSBQRl9VTlNQRUMgICAgICAgQUZfVU5TUEVDCisKKyNkZWZpbmUgSVBQUk9UT19JUCAgICAgIDAKKyNkZWZpbmUgSVBQUk9UT19UQ1AgICAgIDYKKyNkZWZpbmUgSVBQUk9UT19VRFAgICAgIDE3CisjZGVmaW5lIElQUFJPVE9fVURQTElURSAxMzYKKworLyogRmxhZ3Mgd2UgY2FuIHVzZSB3aXRoIHNlbmQgYW5kIHJlY3YuICovCisjZGVmaW5lIE1TR19QRUVLICAgICAgIDB4MDEgICAgLyogUGVla3MgYXQgYW4gaW5jb21pbmcgbWVzc2FnZSAqLworI2RlZmluZSBNU0dfV0FJVEFMTCAgICAweDAyICAgIC8qIFVuaW1wbGVtZW50ZWQ6IFJlcXVlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGJsb2NrIHVudGlsIHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIHJlcXVlc3RlZCBjYW4gYmUgcmV0dXJuZWQgKi8KKyNkZWZpbmUgTVNHX09PQiAgICAgICAgMHgwNCAgICAvKiBVbmltcGxlbWVudGVkOiBSZXF1ZXN0cyBvdXQtb2YtYmFuZCBkYXRhLiBUaGUgc2lnbmlmaWNhbmNlIGFuZCBzZW1hbnRpY3Mgb2Ygb3V0LW9mLWJhbmQgZGF0YSBhcmUgcHJvdG9jb2wtc3BlY2lmaWMgKi8KKyNkZWZpbmUgTVNHX0RPTlRXQUlUICAgMHgwOCAgICAvKiBOb25ibG9ja2luZyBpL28gZm9yIHRoaXMgb3BlcmF0aW9uIG9ubHkgKi8KKyNkZWZpbmUgTVNHX01PUkUgICAgICAgMHgxMCAgICAvKiBTZW5kZXIgd2lsbCBzZW5kIG1vcmUgKi8KKworCisvKgorICogT3B0aW9ucyBmb3IgbGV2ZWwgSVBQUk9UT19JUAorICovCisjZGVmaW5lIElQX1RPUyAgICAgICAgICAgICAxCisjZGVmaW5lIElQX1RUTCAgICAgICAgICAgICAyCisKKyNpZiBMV0lQX1RDUAorLyoKKyAqIE9wdGlvbnMgZm9yIGxldmVsIElQUFJPVE9fVENQCisgKi8KKyNkZWZpbmUgVENQX05PREVMQVkgICAgMHgwMSAgICAvKiBkb24ndCBkZWxheSBzZW5kIHRvIGNvYWxlc2NlIHBhY2tldHMgKi8KKyNkZWZpbmUgVENQX0tFRVBBTElWRSAgMHgwMiAgICAvKiBzZW5kIEtFRVBBTElWRSBwcm9iZXMgd2hlbiBpZGxlIGZvciBwY2ItPmtlZXBfaWRsZSBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgVENQX0tFRVBJRExFICAgMHgwMyAgICAvKiBzZXQgcGNiLT5rZWVwX2lkbGUgIC0gU2FtZSBhcyBUQ1BfS0VFUEFMSVZFLCBidXQgdXNlIHNlY29uZHMgZm9yIGdldC9zZXRzb2Nrb3B0ICovCisjZGVmaW5lIFRDUF9LRUVQSU5UVkwgIDB4MDQgICAgLyogc2V0IHBjYi0+a2VlcF9pbnR2bCAtIFVzZSBzZWNvbmRzIGZvciBnZXQvc2V0c29ja29wdCAqLworI2RlZmluZSBUQ1BfS0VFUENOVCAgICAweDA1ICAgIC8qIHNldCBwY2ItPmtlZXBfY250ICAgLSBVc2UgbnVtYmVyIG9mIHByb2JlcyBzZW50IGZvciBnZXQvc2V0c29ja29wdCAqLworI2VuZGlmIC8qIExXSVBfVENQICovCisKKyNpZiBMV0lQX1VEUCAmJiBMV0lQX1VEUExJVEUKKy8qCisgKiBPcHRpb25zIGZvciBsZXZlbCBJUFBST1RPX1VEUExJVEUKKyAqLworI2RlZmluZSBVRFBMSVRFX1NFTkRfQ1NDT1YgMHgwMSAvKiBzZW5kZXIgY2hlY2tzdW0gY292ZXJhZ2UgKi8KKyNkZWZpbmUgVURQTElURV9SRUNWX0NTQ09WIDB4MDIgLyogbWluaW1hbCByZWNlaXZlciBjaGVja3N1bSBjb3ZlcmFnZSAqLworI2VuZGlmIC8qIExXSVBfVURQICYmIExXSVBfVURQTElURSovCisKKworI2lmIExXSVBfSUdNUAorLyoKKyAqIE9wdGlvbnMgYW5kIHR5cGVzIGZvciBVRFAgbXVsdGljYXN0IHRyYWZmaWMgaGFuZGxpbmcKKyAqLworI2RlZmluZSBJUF9BRERfTUVNQkVSU0hJUCAgMworI2RlZmluZSBJUF9EUk9QX01FTUJFUlNISVAgNAorI2RlZmluZSBJUF9NVUxUSUNBU1RfVFRMICAgNQorI2RlZmluZSBJUF9NVUxUSUNBU1RfSUYgICAgNgorI2RlZmluZSBJUF9NVUxUSUNBU1RfTE9PUCAgNworCit0eXBlZGVmIHN0cnVjdCBpcF9tcmVxIHsKKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOyAvKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBncm91cCAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9pbnRlcmZhY2U7IC8qIGxvY2FsIElQIGFkZHJlc3Mgb2YgaW50ZXJmYWNlICovCit9IGlwX21yZXE7CisjZW5kaWYgLyogTFdJUF9JR01QICovCisKKy8qCisgKiBUaGUgVHlwZSBvZiBTZXJ2aWNlIHByb3ZpZGVzIGFuIGluZGljYXRpb24gb2YgdGhlIGFic3RyYWN0CisgKiBwYXJhbWV0ZXJzIG9mIHRoZSBxdWFsaXR5IG9mIHNlcnZpY2UgZGVzaXJlZC4gIFRoZXNlIHBhcmFtZXRlcnMgYXJlCisgKiB0byBiZSB1c2VkIHRvIGd1aWRlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGFjdHVhbCBzZXJ2aWNlIHBhcmFtZXRlcnMKKyAqIHdoZW4gdHJhbnNtaXR0aW5nIGEgZGF0YWdyYW0gdGhyb3VnaCBhIHBhcnRpY3VsYXIgbmV0d29yay4gIFNldmVyYWwKKyAqIG5ldHdvcmtzIG9mZmVyIHNlcnZpY2UgcHJlY2VkZW5jZSwgd2hpY2ggc29tZWhvdyB0cmVhdHMgaGlnaAorICogcHJlY2VkZW5jZSB0cmFmZmljIGFzIG1vcmUgaW1wb3J0YW50IHRoYW4gb3RoZXIgdHJhZmZpYyAoZ2VuZXJhbGx5CisgKiBieSBhY2NlcHRpbmcgb25seSB0cmFmZmljIGFib3ZlIGEgY2VydGFpbiBwcmVjZWRlbmNlIGF0IHRpbWUgb2YgaGlnaAorICogbG9hZCkuICBUaGUgbWFqb3IgY2hvaWNlIGlzIGEgdGhyZWUgd2F5IHRyYWRlb2ZmIGJldHdlZW4gbG93LWRlbGF5LAorICogaGlnaC1yZWxpYWJpbGl0eSwgYW5kIGhpZ2gtdGhyb3VnaHB1dC4KKyAqIFRoZSB1c2Ugb2YgdGhlIERlbGF5LCBUaHJvdWdocHV0LCBhbmQgUmVsaWFiaWxpdHkgaW5kaWNhdGlvbnMgbWF5CisgKiBpbmNyZWFzZSB0aGUgY29zdCAoaW4gc29tZSBzZW5zZSkgb2YgdGhlIHNlcnZpY2UuICBJbiBtYW55IG5ldHdvcmtzCisgKiBiZXR0ZXIgcGVyZm9ybWFuY2UgZm9yIG9uZSBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvdXBsZWQgd2l0aCB3b3JzZQorICogcGVyZm9ybWFuY2Ugb24gYW5vdGhlci4gIEV4Y2VwdCBmb3IgdmVyeSB1bnVzdWFsIGNhc2VzIGF0IG1vc3QgdHdvCisgKiBvZiB0aGVzZSB0aHJlZSBpbmRpY2F0aW9ucyBzaG91bGQgYmUgc2V0LgorICovCisjZGVmaW5lIElQVE9TX1RPU19NQVNLICAgICAgICAgIDB4MUUKKyNkZWZpbmUgSVBUT1NfVE9TKHRvcykgICAgICAgICAgKCh0b3MpICYgSVBUT1NfVE9TX01BU0spCisjZGVmaW5lIElQVE9TX0xPV0RFTEFZICAgICAgICAgIDB4MTAKKyNkZWZpbmUgSVBUT1NfVEhST1VHSFBVVCAgICAgICAgMHgwOAorI2RlZmluZSBJUFRPU19SRUxJQUJJTElUWSAgICAgICAweDA0CisjZGVmaW5lIElQVE9TX0xPV0NPU1QgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSVBUT1NfTUlOQ09TVCAgICAgICAgICAgSVBUT1NfTE9XQ09TVAorCisvKgorICogVGhlIE5ldHdvcmsgQ29udHJvbCBwcmVjZWRlbmNlIGRlc2lnbmF0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQKKyAqIHdpdGhpbiBhIG5ldHdvcmsgb25seS4gIFRoZSBhY3R1YWwgdXNlIGFuZCBjb250cm9sIG9mIHRoYXQKKyAqIGRlc2lnbmF0aW9uIGlzIHVwIHRvIGVhY2ggbmV0d29yay4gVGhlIEludGVybmV0d29yayBDb250cm9sCisgKiBkZXNpZ25hdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGdhdGV3YXkgY29udHJvbCBvcmlnaW5hdG9ycyBvbmx5LgorICogSWYgdGhlIGFjdHVhbCB1c2Ugb2YgdGhlc2UgcHJlY2VkZW5jZSBkZXNpZ25hdGlvbnMgaXMgb2YgY29uY2VybiB0bworICogYSBwYXJ0aWN1bGFyIG5ldHdvcmssIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGF0IG5ldHdvcmsgdG8KKyAqIGNvbnRyb2wgdGhlIGFjY2VzcyB0bywgYW5kIHVzZSBvZiwgdGhvc2UgcHJlY2VkZW5jZSBkZXNpZ25hdGlvbnMuCisgKi8KKyNkZWZpbmUgSVBUT1NfUFJFQ19NQVNLICAgICAgICAgICAgICAgICAweGUwCisjZGVmaW5lIElQVE9TX1BSRUModG9zKSAgICAgICAgICAgICAgICAoKHRvcykgJiBJUFRPU19QUkVDX01BU0spCisjZGVmaW5lIElQVE9TX1BSRUNfTkVUQ09OVFJPTCAgICAgICAgICAgMHhlMAorI2RlZmluZSBJUFRPU19QUkVDX0lOVEVSTkVUQ09OVFJPTCAgICAgIDB4YzAKKyNkZWZpbmUgSVBUT1NfUFJFQ19DUklUSUNfRUNQICAgICAgICAgICAweGEwCisjZGVmaW5lIElQVE9TX1BSRUNfRkxBU0hPVkVSUklERSAgICAgICAgMHg4MAorI2RlZmluZSBJUFRPU19QUkVDX0ZMQVNIICAgICAgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgSVBUT1NfUFJFQ19JTU1FRElBVEUgICAgICAgICAgICAweDQwCisjZGVmaW5lIElQVE9TX1BSRUNfUFJJT1JJVFkgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBJUFRPU19QUkVDX1JPVVRJTkUgICAgICAgICAgICAgIDB4MDAKKworCisvKgorICogQ29tbWFuZHMgZm9yIGlvY3Rsc29ja2V0KCksICB0YWtlbiBmcm9tIHRoZSBCU0QgZmlsZSBmY250bC5oLgorICogbHdpcF9pb2N0bCBvbmx5IHN1cHBvcnRzIEZJT05SRUFEIGFuZCBGSU9OQklPLCBmb3Igbm93CisgKgorICogSW9jdGwncyBoYXZlIHRoZSBjb21tYW5kIGVuY29kZWQgaW4gdGhlIGxvd2VyIHdvcmQsCisgKiBhbmQgdGhlIHNpemUgb2YgYW55IGluIG9yIG91dCBwYXJhbWV0ZXJzIGluIHRoZSB1cHBlcgorICogd29yZC4gIFRoZSBoaWdoIDIgYml0cyBvZiB0aGUgdXBwZXIgd29yZCBhcmUgdXNlZAorICogdG8gZW5jb2RlIHRoZSBpbi9vdXQgc3RhdHVzIG9mIHRoZSBwYXJhbWV0ZXI7IGZvciBub3cKKyAqIHdlIHJlc3RyaWN0IHBhcmFtZXRlcnMgdG8gYXQgbW9zdCAxMjggYnl0ZXMuCisgKi8KKyNpZiAhZGVmaW5lZChGSU9OUkVBRCkgfHwgIWRlZmluZWQoRklPTkJJTykKKyNkZWZpbmUgSU9DUEFSTV9NQVNLICAgIDB4N2ZVICAgICAgICAgICAvKiBwYXJhbWV0ZXJzIG11c3QgYmUgPCAxMjggYnl0ZXMgKi8KKyNkZWZpbmUgSU9DX1ZPSUQgICAgICAgIDB4MjAwMDAwMDBVTCAgICAvKiBubyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIElPQ19PVVQgICAgICAgICAweDQwMDAwMDAwVUwgICAgLyogY29weSBvdXQgcGFyYW1ldGVycyAqLworI2RlZmluZSBJT0NfSU4gICAgICAgICAgMHg4MDAwMDAwMFVMICAgIC8qIGNvcHkgaW4gcGFyYW1ldGVycyAqLworI2RlZmluZSBJT0NfSU5PVVQgICAgICAgKElPQ19JTnxJT0NfT1VUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MjAwMDAwMDAgZGlzdGluZ3Vpc2hlcyBuZXcgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZCBpb2N0bCdzICovCisjZGVmaW5lIF9JTyh4LHkpICAgICAgICAoSU9DX1ZPSUR8KCh4KTw8OCl8KHkpKQorCisjZGVmaW5lIF9JT1IoeCx5LHQpICAgICAoSU9DX09VVHwoKChsb25nKXNpemVvZih0KSZJT0NQQVJNX01BU0spPDwxNil8KCh4KTw8OCl8KHkpKQorCisjZGVmaW5lIF9JT1coeCx5LHQpICAgICAoSU9DX0lOfCgoKGxvbmcpc2l6ZW9mKHQpJklPQ1BBUk1fTUFTSyk8PDE2KXwoKHgpPDw4KXwoeSkpCisjZW5kaWYgLyogIWRlZmluZWQoRklPTlJFQUQpIHx8ICFkZWZpbmVkKEZJT05CSU8pICovCisKKyNpZm5kZWYgRklPTlJFQUQKKyNkZWZpbmUgRklPTlJFQUQgICAgX0lPUignZicsIDEyNywgdW5zaWduZWQgbG9uZykgLyogZ2V0ICMgYnl0ZXMgdG8gcmVhZCAqLworI2VuZGlmCisjaWZuZGVmIEZJT05CSU8KKyNkZWZpbmUgRklPTkJJTyAgICAgX0lPVygnZicsIDEyNiwgdW5zaWduZWQgbG9uZykgLyogc2V0L2NsZWFyIG5vbi1ibG9ja2luZyBpL28gKi8KKyNlbmRpZgorCisvKiBTb2NrZXQgSS9PIENvbnRyb2xzOiB1bmltcGxlbWVudGVkICovCisjaWZuZGVmIFNJT0NTSElXQVQKKyNkZWZpbmUgU0lPQ1NISVdBVCAgX0lPVygncycsICAwLCB1bnNpZ25lZCBsb25nKSAgLyogc2V0IGhpZ2ggd2F0ZXJtYXJrICovCisjZGVmaW5lIFNJT0NHSElXQVQgIF9JT1IoJ3MnLCAgMSwgdW5zaWduZWQgbG9uZykgIC8qIGdldCBoaWdoIHdhdGVybWFyayAqLworI2RlZmluZSBTSU9DU0xPV0FUICBfSU9XKCdzJywgIDIsIHVuc2lnbmVkIGxvbmcpICAvKiBzZXQgbG93IHdhdGVybWFyayAqLworI2RlZmluZSBTSU9DR0xPV0FUICBfSU9SKCdzJywgIDMsIHVuc2lnbmVkIGxvbmcpICAvKiBnZXQgbG93IHdhdGVybWFyayAqLworI2RlZmluZSBTSU9DQVRNQVJLICBfSU9SKCdzJywgIDcsIHVuc2lnbmVkIGxvbmcpICAvKiBhdCBvb2IgbWFyaz8gKi8KKyNlbmRpZgorCisvKiBjb21tYW5kcyBmb3IgZm5jdGwgKi8KKyNpZm5kZWYgRl9HRVRGTAorI2RlZmluZSBGX0dFVEZMIDMKKyNlbmRpZgorI2lmbmRlZiBGX1NFVEZMCisjZGVmaW5lIEZfU0VURkwgNAorI2VuZGlmCisKKy8qIEZpbGUgc3RhdHVzIGZsYWdzIGFuZCBmaWxlIGFjY2VzcyBtb2RlcyBmb3IgZm5jdGwsCisgICB0aGVzZSBhcmUgYml0cyBpbiBhbiBpbnQuICovCisjaWZuZGVmIE9fTk9OQkxPQ0sKKyNkZWZpbmUgT19OT05CTE9DSyAgMSAvKiBub25ibG9ja2luZyBJL08gKi8KKyNlbmRpZgorI2lmbmRlZiBPX05ERUxBWQorI2RlZmluZSBPX05ERUxBWSAgICAxIC8qIHNhbWUgYXMgT19OT05CTE9DSywgZm9yIGNvbXBhdGliaWxpdHkgKi8KKyNlbmRpZgorCisjaWZuZGVmIFNIVVRfUkQKKyAgI2RlZmluZSBTSFVUX1JEICAgMAorICAjZGVmaW5lIFNIVVRfV1IgICAxCisgICNkZWZpbmUgU0hVVF9SRFdSIDIKKyNlbmRpZgorCisvKiBGRF9TRVQgdXNlZCBmb3IgbHdpcF9zZWxlY3QgKi8KKyNpZm5kZWYgRkRfU0VUCisgICN1bmRlZiAgRkRfU0VUU0laRQorICAvKiBNYWtlIEZEX1NFVFNJWkUgbWF0Y2ggTlVNX1NPQ0tFVFMgaW4gc29ja2V0LmMgKi8KKyAgI2RlZmluZSBGRF9TRVRTSVpFICAgIE1FTVBfTlVNX05FVENPTk4KKyAgI2RlZmluZSBGRF9TRVQobiwgcCkgICgocCktPmZkX2JpdHNbKG4pLzhdIHw9ICAoMSA8PCAoKG4pICYgNykpKQorICAjZGVmaW5lIEZEX0NMUihuLCBwKSAgKChwKS0+ZmRfYml0c1sobikvOF0gJj0gfigxIDw8ICgobikgJiA3KSkpCisgICNkZWZpbmUgRkRfSVNTRVQobixwKSAoKHApLT5mZF9iaXRzWyhuKS84XSAmICAgKDEgPDwgKChuKSAmIDcpKSkKKyAgI2RlZmluZSBGRF9aRVJPKHApICAgIG1lbXNldCgodm9pZCopKHApLDAsc2l6ZW9mKCoocCkpKQorCisgIHR5cGVkZWYgc3RydWN0IGZkX3NldCB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciBmZF9iaXRzIFsoRkRfU0VUU0laRSs3KS84XTsKKyAgICAgICAgfSBmZF9zZXQ7CisKKyNlbmRpZiAvKiBGRF9TRVQgKi8KKworLyoqIExXSVBfVElNRVZBTF9QUklWQVRFOiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIHN0cnVjdCB0aW1ldmFsIHByb3ZpZGVkCisgKiBieSB5b3VyIHN5c3RlbSwgc2V0IHRoaXMgdG8gMCBhbmQgaW5jbHVkZSA8c3lzL3RpbWUuaD4gaW4gY2MuaCAqLyAKKyNpZm5kZWYgTFdJUF9USU1FVkFMX1BSSVZBVEUKKyNkZWZpbmUgTFdJUF9USU1FVkFMX1BSSVZBVEUgMQorI2VuZGlmCisKKyNpZiBMV0lQX1RJTUVWQUxfUFJJVkFURQorc3RydWN0IHRpbWV2YWwgeworICBsb25nICAgIHR2X3NlYzsgICAgICAgICAvKiBzZWNvbmRzICovCisgIGxvbmcgICAgdHZfdXNlYzsgICAgICAgIC8qIGFuZCBtaWNyb3NlY29uZHMgKi8KK307CisjZW5kaWYgLyogTFdJUF9USU1FVkFMX1BSSVZBVEUgKi8KKwordm9pZCBsd2lwX3NvY2tldF9pbml0KHZvaWQpOworCitpbnQgbHdpcF9hY2NlcHQoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90ICphZGRybGVuKTsKK2ludCBsd2lwX2JpbmQoaW50IHMsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgc29ja2xlbl90IG5hbWVsZW4pOworaW50IGx3aXBfc2h1dGRvd24oaW50IHMsIGludCBob3cpOworaW50IGx3aXBfZ2V0cGVlcm5hbWUgKGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIHNvY2tsZW5fdCAqbmFtZWxlbik7CitpbnQgbHdpcF9nZXRzb2NrbmFtZSAoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgc29ja2xlbl90ICpuYW1lbGVuKTsKK2ludCBsd2lwX2dldHNvY2tvcHQgKGludCBzLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCB2b2lkICpvcHR2YWwsIHNvY2tsZW5fdCAqb3B0bGVuKTsKK2ludCBsd2lwX3NldHNvY2tvcHQgKGludCBzLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjb25zdCB2b2lkICpvcHR2YWwsIHNvY2tsZW5fdCBvcHRsZW4pOworaW50IGx3aXBfY2xvc2UoaW50IHMpOworaW50IGx3aXBfY29ubmVjdChpbnQgcywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpuYW1lLCBzb2NrbGVuX3QgbmFtZWxlbik7CitpbnQgbHdpcF9saXN0ZW4oaW50IHMsIGludCBiYWNrbG9nKTsKK2ludCBsd2lwX3JlY3YoaW50IHMsIHZvaWQgKm1lbSwgc2l6ZV90IGxlbiwgaW50IGZsYWdzKTsKK2ludCBsd2lwX3JlYWQoaW50IHMsIHZvaWQgKm1lbSwgc2l6ZV90IGxlbik7CitpbnQgbHdpcF9yZWN2ZnJvbShpbnQgcywgdm9pZCAqbWVtLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MsCisgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sIHNvY2tsZW5fdCAqZnJvbWxlbik7CitpbnQgbHdpcF9zZW5kKGludCBzLCBjb25zdCB2b2lkICpkYXRhcHRyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKK2ludCBsd2lwX3NlbmR0byhpbnQgcywgY29uc3Qgdm9pZCAqZGF0YXB0ciwgc2l6ZV90IHNpemUsIGludCBmbGFncywKKyAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBzb2NrbGVuX3QgdG9sZW4pOworaW50IGx3aXBfc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpOworaW50IGx3aXBfd3JpdGUoaW50IHMsIGNvbnN0IHZvaWQgKmRhdGFwdHIsIHNpemVfdCBzaXplKTsKK2ludCBsd2lwX3NlbGVjdChpbnQgbWF4ZmRwMSwgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0LCBmZF9zZXQgKmV4Y2VwdHNldCwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCk7CitpbnQgbHdpcF9pb2N0bChpbnQgcywgbG9uZyBjbWQsIHZvaWQgKmFyZ3ApOworaW50IGx3aXBfZmNudGwoaW50IHMsIGludCBjbWQsIGludCB2YWwpOworCisjaWYgTFdJUF9DT01QQVRfU09DS0VUUworI2RlZmluZSBhY2NlcHQoYSxiLGMpICAgICAgICAgbHdpcF9hY2NlcHQoYSxiLGMpCisjZGVmaW5lIGJpbmQoYSxiLGMpICAgICAgICAgICBsd2lwX2JpbmQoYSxiLGMpCisjZGVmaW5lIHNodXRkb3duKGEsYikgICAgICAgICBsd2lwX3NodXRkb3duKGEsYikKKyNkZWZpbmUgY2xvc2Vzb2NrZXQocykgICAgICAgIGx3aXBfY2xvc2UocykKKyNkZWZpbmUgY29ubmVjdChhLGIsYykgICAgICAgIGx3aXBfY29ubmVjdChhLGIsYykKKyNkZWZpbmUgZ2V0c29ja25hbWUoYSxiLGMpICAgIGx3aXBfZ2V0c29ja25hbWUoYSxiLGMpCisjZGVmaW5lIGdldHBlZXJuYW1lKGEsYixjKSAgICBsd2lwX2dldHBlZXJuYW1lKGEsYixjKQorI2RlZmluZSBzZXRzb2Nrb3B0KGEsYixjLGQsZSkgbHdpcF9zZXRzb2Nrb3B0KGEsYixjLGQsZSkKKyNkZWZpbmUgZ2V0c29ja29wdChhLGIsYyxkLGUpIGx3aXBfZ2V0c29ja29wdChhLGIsYyxkLGUpCisjZGVmaW5lIGxpc3RlbihhLGIpICAgICAgICAgICBsd2lwX2xpc3RlbihhLGIpCisjZGVmaW5lIHJlY3YoYSxiLGMsZCkgICAgICAgICBsd2lwX3JlY3YoYSxiLGMsZCkKKyNkZWZpbmUgcmVjdmZyb20oYSxiLGMsZCxlLGYpIGx3aXBfcmVjdmZyb20oYSxiLGMsZCxlLGYpCisjZGVmaW5lIHNlbmQoYSxiLGMsZCkgICAgICAgICBsd2lwX3NlbmQoYSxiLGMsZCkKKyNkZWZpbmUgc2VuZHRvKGEsYixjLGQsZSxmKSAgIGx3aXBfc2VuZHRvKGEsYixjLGQsZSxmKQorI2RlZmluZSBzb2NrZXQoYSxiLGMpICAgICAgICAgbHdpcF9zb2NrZXQoYSxiLGMpCisjZGVmaW5lIHNlbGVjdChhLGIsYyxkLGUpICAgICBsd2lwX3NlbGVjdChhLGIsYyxkLGUpCisjZGVmaW5lIGlvY3Rsc29ja2V0KGEsYixjKSAgICBsd2lwX2lvY3RsKGEsYixjKQorCisjaWYgTFdJUF9QT1NJWF9TT0NLRVRTX0lPX05BTUVTCisjZGVmaW5lIHJlYWQoYSxiLGMpICAgICAgICAgICBsd2lwX3JlYWQoYSxiLGMpCisjZGVmaW5lIHdyaXRlKGEsYixjKSAgICAgICAgICBsd2lwX3dyaXRlKGEsYixjKQorI2RlZmluZSBjbG9zZShzKSAgICAgICAgICAgICAgbHdpcF9jbG9zZShzKQorI2VuZGlmIC8qIExXSVBfUE9TSVhfU09DS0VUU19JT19OQU1FUyAqLworCisjZW5kaWYgLyogTFdJUF9DT01QQVRfU09DS0VUUyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTFdJUF9TT0NLRVQgKi8KKworI2VuZGlmIC8qIF9fTFdJUF9TT0NLRVRTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvc3RhdHMuaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1YjdjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3N0YXRzLmgKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisjaWZuZGVmIF9fTFdJUF9TVEFUU19IX18KKyNkZWZpbmUgX19MV0lQX1NUQVRTX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2luY2x1ZGUgImx3aXAvbWVtLmgiCisjaW5jbHVkZSAibHdpcC9tZW1wLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIExXSVBfU1RBVFMKKworI2lmbmRlZiBMV0lQX1NUQVRTX0xBUkdFCisjZGVmaW5lIExXSVBfU1RBVFNfTEFSR0UgMAorI2VuZGlmCisKKyNpZiBMV0lQX1NUQVRTX0xBUkdFCisjZGVmaW5lIFNUQVRfQ09VTlRFUiAgICAgdTMyX3QKKyNkZWZpbmUgU1RBVF9DT1VOVEVSX0YgICBVMzJfRgorI2Vsc2UKKyNkZWZpbmUgU1RBVF9DT1VOVEVSICAgICB1MTZfdAorI2RlZmluZSBTVEFUX0NPVU5URVJfRiAgIFUxNl9GCisjZW5kaWYgCisKK3N0cnVjdCBzdGF0c19wcm90byB7CisgIFNUQVRfQ09VTlRFUiB4bWl0OyAgICAgICAgICAgICAvKiBUcmFuc21pdHRlZCBwYWNrZXRzLiAqLworICBTVEFUX0NPVU5URVIgcmVjdjsgICAgICAgICAgICAgLyogUmVjZWl2ZWQgcGFja2V0cy4gKi8KKyAgU1RBVF9DT1VOVEVSIGZ3OyAgICAgICAgICAgICAgIC8qIEZvcndhcmRlZCBwYWNrZXRzLiAqLworICBTVEFUX0NPVU5URVIgZHJvcDsgICAgICAgICAgICAgLyogRHJvcHBlZCBwYWNrZXRzLiAqLworICBTVEFUX0NPVU5URVIgY2hrZXJyOyAgICAgICAgICAgLyogQ2hlY2tzdW0gZXJyb3IuICovCisgIFNUQVRfQ09VTlRFUiBsZW5lcnI7ICAgICAgICAgICAvKiBJbnZhbGlkIGxlbmd0aCBlcnJvci4gKi8KKyAgU1RBVF9DT1VOVEVSIG1lbWVycjsgICAgICAgICAgIC8qIE91dCBvZiBtZW1vcnkgZXJyb3IuICovCisgIFNUQVRfQ09VTlRFUiBydGVycjsgICAgICAgICAgICAvKiBSb3V0aW5nIGVycm9yLiAqLworICBTVEFUX0NPVU5URVIgcHJvdGVycjsgICAgICAgICAgLyogUHJvdG9jb2wgZXJyb3IuICovCisgIFNUQVRfQ09VTlRFUiBvcHRlcnI7ICAgICAgICAgICAvKiBFcnJvciBpbiBvcHRpb25zLiAqLworICBTVEFUX0NPVU5URVIgZXJyOyAgICAgICAgICAgICAgLyogTWlzYyBlcnJvci4gKi8KKyAgU1RBVF9DT1VOVEVSIGNhY2hlaGl0OworfTsKKworc3RydWN0IHN0YXRzX2lnbXAgeworICBTVEFUX0NPVU5URVIgeG1pdDsgICAgICAgICAgICAgLyogVHJhbnNtaXR0ZWQgcGFja2V0cy4gKi8KKyAgU1RBVF9DT1VOVEVSIHJlY3Y7ICAgICAgICAgICAgIC8qIFJlY2VpdmVkIHBhY2tldHMuICovCisgIFNUQVRfQ09VTlRFUiBkcm9wOyAgICAgICAgICAgICAvKiBEcm9wcGVkIHBhY2tldHMuICovCisgIFNUQVRfQ09VTlRFUiBjaGtlcnI7ICAgICAgICAgICAvKiBDaGVja3N1bSBlcnJvci4gKi8KKyAgU1RBVF9DT1VOVEVSIGxlbmVycjsgICAgICAgICAgIC8qIEludmFsaWQgbGVuZ3RoIGVycm9yLiAqLworICBTVEFUX0NPVU5URVIgbWVtZXJyOyAgICAgICAgICAgLyogT3V0IG9mIG1lbW9yeSBlcnJvci4gKi8KKyAgU1RBVF9DT1VOVEVSIHByb3RlcnI7ICAgICAgICAgIC8qIFByb3RvY29sIGVycm9yLiAqLworICBTVEFUX0NPVU5URVIgcnhfdjE7ICAgICAgICAgICAgLyogUmVjZWl2ZWQgdjEgZnJhbWVzLiAqLworICBTVEFUX0NPVU5URVIgcnhfZ3JvdXA7ICAgICAgICAgLyogUmVjZWl2ZWQgZ3JvdXAtc3BlY2lmaWMgcXVlcmllcy4gKi8KKyAgU1RBVF9DT1VOVEVSIHJ4X2dlbmVyYWw7ICAgICAgIC8qIFJlY2VpdmVkIGdlbmVyYWwgcXVlcmllcy4gKi8KKyAgU1RBVF9DT1VOVEVSIHJ4X3JlcG9ydDsgICAgICAgIC8qIFJlY2VpdmVkIHJlcG9ydHMuICovCisgIFNUQVRfQ09VTlRFUiB0eF9qb2luOyAgICAgICAgICAvKiBTZW50IGpvaW5zLiAqLworICBTVEFUX0NPVU5URVIgdHhfbGVhdmU7ICAgICAgICAgLyogU2VudCBsZWF2ZXMuICovCisgIFNUQVRfQ09VTlRFUiB0eF9yZXBvcnQ7ICAgICAgICAvKiBTZW50IHJlcG9ydHMuICovCit9OworCitzdHJ1Y3Qgc3RhdHNfbWVtIHsKKyNpZmRlZiBMV0lQX0RFQlVHCisgIGNvbnN0IGNoYXIgKm5hbWU7CisjZW5kaWYgLyogTFdJUF9ERUJVRyAqLworICBtZW1fc2l6ZV90IGF2YWlsOworICBtZW1fc2l6ZV90IHVzZWQ7CisgIG1lbV9zaXplX3QgbWF4OworICBTVEFUX0NPVU5URVIgZXJyOworICBTVEFUX0NPVU5URVIgaWxsZWdhbDsKK307CisKK3N0cnVjdCBzdGF0c19zeXNlbGVtIHsKKyAgU1RBVF9DT1VOVEVSIHVzZWQ7CisgIFNUQVRfQ09VTlRFUiBtYXg7CisgIFNUQVRfQ09VTlRFUiBlcnI7Cit9OworCitzdHJ1Y3Qgc3RhdHNfc3lzIHsKKyAgc3RydWN0IHN0YXRzX3N5c2VsZW0gc2VtOworICBzdHJ1Y3Qgc3RhdHNfc3lzZWxlbSBtdXRleDsKKyAgc3RydWN0IHN0YXRzX3N5c2VsZW0gbWJveDsKK307CisKK3N0cnVjdCBzdGF0c18geworI2lmIExJTktfU1RBVFMKKyAgc3RydWN0IHN0YXRzX3Byb3RvIGxpbms7CisjZW5kaWYKKyNpZiBFVEhBUlBfU1RBVFMKKyAgc3RydWN0IHN0YXRzX3Byb3RvIGV0aGFycDsKKyNlbmRpZgorI2lmIElQRlJBR19TVEFUUworICBzdHJ1Y3Qgc3RhdHNfcHJvdG8gaXBfZnJhZzsKKyNlbmRpZgorI2lmIElQX1NUQVRTCisgIHN0cnVjdCBzdGF0c19wcm90byBpcDsKKyNlbmRpZgorI2lmIElDTVBfU1RBVFMKKyAgc3RydWN0IHN0YXRzX3Byb3RvIGljbXA7CisjZW5kaWYKKyNpZiBJR01QX1NUQVRTCisgIHN0cnVjdCBzdGF0c19pZ21wIGlnbXA7CisjZW5kaWYKKyNpZiBVRFBfU1RBVFMKKyAgc3RydWN0IHN0YXRzX3Byb3RvIHVkcDsKKyNlbmRpZgorI2lmIFRDUF9TVEFUUworICBzdHJ1Y3Qgc3RhdHNfcHJvdG8gdGNwOworI2VuZGlmCisjaWYgTUVNX1NUQVRTCisgIHN0cnVjdCBzdGF0c19tZW0gbWVtOworI2VuZGlmCisjaWYgTUVNUF9TVEFUUworICBzdHJ1Y3Qgc3RhdHNfbWVtIG1lbXBbTUVNUF9NQVhdOworI2VuZGlmCisjaWYgU1lTX1NUQVRTCisgIHN0cnVjdCBzdGF0c19zeXMgc3lzOworI2VuZGlmCit9OworCitleHRlcm4gc3RydWN0IHN0YXRzXyBsd2lwX3N0YXRzOworCit2b2lkIHN0YXRzX2luaXQodm9pZCk7CisKKyNkZWZpbmUgU1RBVFNfSU5DKHgpICsrbHdpcF9zdGF0cy54CisjZGVmaW5lIFNUQVRTX0RFQyh4KSAtLWx3aXBfc3RhdHMueAorI2RlZmluZSBTVEFUU19JTkNfVVNFRCh4LCB5KSBkbyB7IGx3aXBfc3RhdHMueC51c2VkICs9IHk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGx3aXBfc3RhdHMueC5tYXggPCBsd2lwX3N0YXRzLngudXNlZCkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsd2lwX3N0YXRzLngubWF4ID0gbHdpcF9zdGF0cy54LnVzZWQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlIC8qIExXSVBfU1RBVFMgKi8KKyNkZWZpbmUgc3RhdHNfaW5pdCgpCisjZGVmaW5lIFNUQVRTX0lOQyh4KQorI2RlZmluZSBTVEFUU19ERUMoeCkKKyNkZWZpbmUgU1RBVFNfSU5DX1VTRUQoeCkKKyNlbmRpZiAvKiBMV0lQX1NUQVRTICovCisKKyNpZiBUQ1BfU1RBVFMKKyNkZWZpbmUgVENQX1NUQVRTX0lOQyh4KSBTVEFUU19JTkMoeCkKKyNkZWZpbmUgVENQX1NUQVRTX0RJU1BMQVkoKSBzdGF0c19kaXNwbGF5X3Byb3RvKCZsd2lwX3N0YXRzLnRjcCwgIlRDUCIpCisjZWxzZQorI2RlZmluZSBUQ1BfU1RBVFNfSU5DKHgpCisjZGVmaW5lIFRDUF9TVEFUU19ESVNQTEFZKCkKKyNlbmRpZgorCisjaWYgVURQX1NUQVRTCisjZGVmaW5lIFVEUF9TVEFUU19JTkMoeCkgU1RBVFNfSU5DKHgpCisjZGVmaW5lIFVEUF9TVEFUU19ESVNQTEFZKCkgc3RhdHNfZGlzcGxheV9wcm90bygmbHdpcF9zdGF0cy51ZHAsICJVRFAiKQorI2Vsc2UKKyNkZWZpbmUgVURQX1NUQVRTX0lOQyh4KQorI2RlZmluZSBVRFBfU1RBVFNfRElTUExBWSgpCisjZW5kaWYKKworI2lmIElDTVBfU1RBVFMKKyNkZWZpbmUgSUNNUF9TVEFUU19JTkMoeCkgU1RBVFNfSU5DKHgpCisjZGVmaW5lIElDTVBfU1RBVFNfRElTUExBWSgpIHN0YXRzX2Rpc3BsYXlfcHJvdG8oJmx3aXBfc3RhdHMuaWNtcCwgIklDTVAiKQorI2Vsc2UKKyNkZWZpbmUgSUNNUF9TVEFUU19JTkMoeCkKKyNkZWZpbmUgSUNNUF9TVEFUU19ESVNQTEFZKCkKKyNlbmRpZgorCisjaWYgSUdNUF9TVEFUUworI2RlZmluZSBJR01QX1NUQVRTX0lOQyh4KSBTVEFUU19JTkMoeCkKKyNkZWZpbmUgSUdNUF9TVEFUU19ESVNQTEFZKCkgc3RhdHNfZGlzcGxheV9pZ21wKCZsd2lwX3N0YXRzLmlnbXApCisjZWxzZQorI2RlZmluZSBJR01QX1NUQVRTX0lOQyh4KQorI2RlZmluZSBJR01QX1NUQVRTX0RJU1BMQVkoKQorI2VuZGlmCisKKyNpZiBJUF9TVEFUUworI2RlZmluZSBJUF9TVEFUU19JTkMoeCkgU1RBVFNfSU5DKHgpCisjZGVmaW5lIElQX1NUQVRTX0RJU1BMQVkoKSBzdGF0c19kaXNwbGF5X3Byb3RvKCZsd2lwX3N0YXRzLmlwLCAiSVAiKQorI2Vsc2UKKyNkZWZpbmUgSVBfU1RBVFNfSU5DKHgpCisjZGVmaW5lIElQX1NUQVRTX0RJU1BMQVkoKQorI2VuZGlmCisKKyNpZiBJUEZSQUdfU1RBVFMKKyNkZWZpbmUgSVBGUkFHX1NUQVRTX0lOQyh4KSBTVEFUU19JTkMoeCkKKyNkZWZpbmUgSVBGUkFHX1NUQVRTX0RJU1BMQVkoKSBzdGF0c19kaXNwbGF5X3Byb3RvKCZsd2lwX3N0YXRzLmlwX2ZyYWcsICJJUF9GUkFHIikKKyNlbHNlCisjZGVmaW5lIElQRlJBR19TVEFUU19JTkMoeCkKKyNkZWZpbmUgSVBGUkFHX1NUQVRTX0RJU1BMQVkoKQorI2VuZGlmCisKKyNpZiBFVEhBUlBfU1RBVFMKKyNkZWZpbmUgRVRIQVJQX1NUQVRTX0lOQyh4KSBTVEFUU19JTkMoeCkKKyNkZWZpbmUgRVRIQVJQX1NUQVRTX0RJU1BMQVkoKSBzdGF0c19kaXNwbGF5X3Byb3RvKCZsd2lwX3N0YXRzLmV0aGFycCwgIkVUSEFSUCIpCisjZWxzZQorI2RlZmluZSBFVEhBUlBfU1RBVFNfSU5DKHgpCisjZGVmaW5lIEVUSEFSUF9TVEFUU19ESVNQTEFZKCkKKyNlbmRpZgorCisjaWYgTElOS19TVEFUUworI2RlZmluZSBMSU5LX1NUQVRTX0lOQyh4KSBTVEFUU19JTkMoeCkKKyNkZWZpbmUgTElOS19TVEFUU19ESVNQTEFZKCkgc3RhdHNfZGlzcGxheV9wcm90bygmbHdpcF9zdGF0cy5saW5rLCAiTElOSyIpCisjZWxzZQorI2RlZmluZSBMSU5LX1NUQVRTX0lOQyh4KQorI2RlZmluZSBMSU5LX1NUQVRTX0RJU1BMQVkoKQorI2VuZGlmCisKKyNpZiBNRU1fU1RBVFMKKyNkZWZpbmUgTUVNX1NUQVRTX0FWQUlMKHgsIHkpIGx3aXBfc3RhdHMubWVtLnggPSB5CisjZGVmaW5lIE1FTV9TVEFUU19JTkMoeCkgU1RBVFNfSU5DKG1lbS54KQorI2RlZmluZSBNRU1fU1RBVFNfSU5DX1VTRUQoeCwgeSkgU1RBVFNfSU5DX1VTRUQobWVtLCB5KQorI2RlZmluZSBNRU1fU1RBVFNfREVDX1VTRUQoeCwgeSkgbHdpcF9zdGF0cy5tZW0ueCAtPSB5CisjZGVmaW5lIE1FTV9TVEFUU19ESVNQTEFZKCkgc3RhdHNfZGlzcGxheV9tZW0oJmx3aXBfc3RhdHMubWVtLCAiSEVBUCIpCisjZWxzZQorI2RlZmluZSBNRU1fU1RBVFNfQVZBSUwoeCwgeSkKKyNkZWZpbmUgTUVNX1NUQVRTX0lOQyh4KQorI2RlZmluZSBNRU1fU1RBVFNfSU5DX1VTRUQoeCwgeSkKKyNkZWZpbmUgTUVNX1NUQVRTX0RFQ19VU0VEKHgsIHkpCisjZGVmaW5lIE1FTV9TVEFUU19ESVNQTEFZKCkKKyNlbmRpZgorCisjaWYgTUVNUF9TVEFUUworI2RlZmluZSBNRU1QX1NUQVRTX0FWQUlMKHgsIGksIHkpIGx3aXBfc3RhdHMubWVtcFtpXS54ID0geQorI2RlZmluZSBNRU1QX1NUQVRTX0lOQyh4LCBpKSBTVEFUU19JTkMobWVtcFtpXS54KQorI2RlZmluZSBNRU1QX1NUQVRTX0RFQyh4LCBpKSBTVEFUU19ERUMobWVtcFtpXS54KQorI2RlZmluZSBNRU1QX1NUQVRTX0lOQ19VU0VEKHgsIGkpIFNUQVRTX0lOQ19VU0VEKG1lbXBbaV0sIDEpCisjZGVmaW5lIE1FTVBfU1RBVFNfRElTUExBWShpKSBzdGF0c19kaXNwbGF5X21lbXAoJmx3aXBfc3RhdHMubWVtcFtpXSwgaSkKKyNlbHNlCisjZGVmaW5lIE1FTVBfU1RBVFNfQVZBSUwoeCwgaSwgeSkKKyNkZWZpbmUgTUVNUF9TVEFUU19JTkMoeCwgaSkKKyNkZWZpbmUgTUVNUF9TVEFUU19ERUMoeCwgaSkKKyNkZWZpbmUgTUVNUF9TVEFUU19JTkNfVVNFRCh4LCBpKQorI2RlZmluZSBNRU1QX1NUQVRTX0RJU1BMQVkoaSkKKyNlbmRpZgorCisjaWYgU1lTX1NUQVRTCisjZGVmaW5lIFNZU19TVEFUU19JTkMoeCkgU1RBVFNfSU5DKHN5cy54KQorI2RlZmluZSBTWVNfU1RBVFNfREVDKHgpIFNUQVRTX0RFQyhzeXMueCkKKyNkZWZpbmUgU1lTX1NUQVRTX0lOQ19VU0VEKHgpIFNUQVRTX0lOQ19VU0VEKHN5cy54LCAxKQorI2RlZmluZSBTWVNfU1RBVFNfRElTUExBWSgpIHN0YXRzX2Rpc3BsYXlfc3lzKCZsd2lwX3N0YXRzLnN5cykKKyNlbHNlCisjZGVmaW5lIFNZU19TVEFUU19JTkMoeCkKKyNkZWZpbmUgU1lTX1NUQVRTX0RFQyh4KQorI2RlZmluZSBTWVNfU1RBVFNfSU5DX1VTRUQoeCkKKyNkZWZpbmUgU1lTX1NUQVRTX0RJU1BMQVkoKQorI2VuZGlmCisKKy8qIERpc3BsYXkgb2Ygc3RhdGlzdGljcyAqLworI2lmIExXSVBfU1RBVFNfRElTUExBWQordm9pZCBzdGF0c19kaXNwbGF5KHZvaWQpOwordm9pZCBzdGF0c19kaXNwbGF5X3Byb3RvKHN0cnVjdCBzdGF0c19wcm90byAqcHJvdG8sIGNoYXIgKm5hbWUpOwordm9pZCBzdGF0c19kaXNwbGF5X2lnbXAoc3RydWN0IHN0YXRzX2lnbXAgKmlnbXApOwordm9pZCBzdGF0c19kaXNwbGF5X21lbShzdHJ1Y3Qgc3RhdHNfbWVtICptZW0sIGNoYXIgKm5hbWUpOwordm9pZCBzdGF0c19kaXNwbGF5X21lbXAoc3RydWN0IHN0YXRzX21lbSAqbWVtLCBpbnQgaW5kZXgpOwordm9pZCBzdGF0c19kaXNwbGF5X3N5cyhzdHJ1Y3Qgc3RhdHNfc3lzICpzeXMpOworI2Vsc2UgLyogTFdJUF9TVEFUU19ESVNQTEFZICovCisjZGVmaW5lIHN0YXRzX2Rpc3BsYXkoKQorI2RlZmluZSBzdGF0c19kaXNwbGF5X3Byb3RvKHByb3RvLCBuYW1lKQorI2RlZmluZSBzdGF0c19kaXNwbGF5X2lnbXAoaWdtcCkKKyNkZWZpbmUgc3RhdHNfZGlzcGxheV9tZW0obWVtLCBuYW1lKQorI2RlZmluZSBzdGF0c19kaXNwbGF5X21lbXAobWVtLCBpbmRleCkKKyNkZWZpbmUgc3RhdHNfZGlzcGxheV9zeXMoc3lzKQorI2VuZGlmIC8qIExXSVBfU1RBVFNfRElTUExBWSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19MV0lQX1NUQVRTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvc3lzLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC9zeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjYyYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvc3lzLmgKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisjaWZuZGVmIF9fTFdJUF9TWVNfSF9fCisjZGVmaW5lIF9fTFdJUF9TWVNfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBOT19TWVMKKworLyogRm9yIGEgdG90YWxseSBtaW5pbWFsIGFuZCBzdGFuZGFsb25lIHN5c3RlbSwgd2UgcHJvdmlkZSBudWxsCisgICBkZWZpbml0aW9ucyBvZiB0aGUgc3lzXyBmdW5jdGlvbnMuICovCit0eXBlZGVmIHU4X3Qgc3lzX3NlbV90OwordHlwZWRlZiB1OF90IHN5c19tdXRleF90OwordHlwZWRlZiB1OF90IHN5c19tYm94X3Q7CisKKyNkZWZpbmUgc3lzX3NlbV9uZXcocywgYykgRVJSX09LCisjZGVmaW5lIHN5c19zZW1fc2lnbmFsKHMpCisjZGVmaW5lIHN5c19zZW1fd2FpdChzKQorI2RlZmluZSBzeXNfYXJjaF9zZW1fd2FpdChzLHQpCisjZGVmaW5lIHN5c19zZW1fZnJlZShzKQorI2RlZmluZSBzeXNfbXV0ZXhfbmV3KG11KSBFUlJfT0sKKyNkZWZpbmUgc3lzX211dGV4X2xvY2sobXUpCisjZGVmaW5lIHN5c19tdXRleF91bmxvY2sobXUpCisjZGVmaW5lIHN5c19tdXRleF9mcmVlKG11KQorI2RlZmluZSBzeXNfbWJveF9uZXcobSwgcykgRVJSX09LCisjZGVmaW5lIHN5c19tYm94X2ZldGNoKG0sZCkKKyNkZWZpbmUgc3lzX21ib3hfdHJ5ZmV0Y2gobSxkKQorI2RlZmluZSBzeXNfbWJveF9wb3N0KG0sZCkKKyNkZWZpbmUgc3lzX21ib3hfdHJ5cG9zdChtLGQpCisjZGVmaW5lIHN5c19tYm94X2ZyZWUobSkKKworI2RlZmluZSBzeXNfdGhyZWFkX25ldyhuLHQsYSxzLHApCisKKyNkZWZpbmUgc3lzX21zbGVlcCh0KQorCisjZWxzZSAvKiBOT19TWVMgKi8KKworLyoqIFJldHVybiBjb2RlIGZvciB0aW1lb3V0cyBmcm9tIHN5c19hcmNoX21ib3hfZmV0Y2ggYW5kIHN5c19hcmNoX3NlbV93YWl0ICovCisjZGVmaW5lIFNZU19BUkNIX1RJTUVPVVQgMHhmZmZmZmZmZlVMCisKKy8qKiBzeXNfbWJveF90cnlmZXRjaCgpIHJldHVybnMgU1lTX01CT1hfRU1QVFkgaWYgYXBwcm9wcmlhdGUuCisgKiBGb3Igbm93IHdlIHVzZSB0aGUgc2FtZSBtYWdpYyB2YWx1ZSwgYnV0IHdlIGFsbG93IHRoaXMgdG8gY2hhbmdlIGluIGZ1dHVyZS4KKyAqLworI2RlZmluZSBTWVNfTUJPWF9FTVBUWSBTWVNfQVJDSF9USU1FT1VUIAorCisjaW5jbHVkZSAibHdpcC9lcnIuaCIKKyNpbmNsdWRlICJhcmNoL3N5c19hcmNoLmgiCisKKy8qKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIHRocmVhZCBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgdm9pZCAoKmx3aXBfdGhyZWFkX2ZuKSh2b2lkICphcmcpOworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgcGxhdGZvcm0gcG9ydHMKKyAgIChpbiBzeXNfYXJjaC5jKSAqLworCisvKiBNdXRleCBmdW5jdGlvbnM6ICovCisKKy8qKiBEZWZpbmUgTFdJUF9DT01QQVRfTVVURVggaWYgdGhlIHBvcnQgaGFzIG5vIG11dGV4ZXMgYW5kIGJpbmFyeSBzZW1hcGhvcmVzCisgICAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCAqLworI2lmIExXSVBfQ09NUEFUX01VVEVYCisvKiBmb3Igb2xkIHBvcnRzIHRoYXQgZG9uJ3QgaGF2ZSBtdXRleGVzOiBkZWZpbmUgdGhlbSB0byBiaW5hcnkgc2VtYXBob3JlcyAqLworI2RlZmluZSBzeXNfbXV0ZXhfdCAgICAgICAgICAgICAgICAgICBzeXNfc2VtX3QKKyNkZWZpbmUgc3lzX211dGV4X25ldyhtdXRleCkgICAgICAgICAgc3lzX3NlbV9uZXcobXV0ZXgsIDEpCisjZGVmaW5lIHN5c19tdXRleF9sb2NrKG11dGV4KSAgICAgICAgIHN5c19zZW1fd2FpdChtdXRleCkKKyNkZWZpbmUgc3lzX211dGV4X3VubG9jayhtdXRleCkgICAgICAgc3lzX3NlbV9zaWduYWwobXV0ZXgpCisjZGVmaW5lIHN5c19tdXRleF9mcmVlKG11dGV4KSAgICAgICAgIHN5c19zZW1fZnJlZShtdXRleCkKKyNkZWZpbmUgc3lzX211dGV4X3ZhbGlkKG11dGV4KSAgICAgICAgc3lzX3NlbV92YWxpZChtdXRleCkKKyNkZWZpbmUgc3lzX211dGV4X3NldF9pbnZhbGlkKG11dGV4KSAgc3lzX3NlbV9zZXRfaW52YWxpZChtdXRleCkKKworI2Vsc2UgLyogTFdJUF9DT01QQVRfTVVURVggKi8KKworLyoqIENyZWF0ZSBhIG5ldyBtdXRleAorICogQHBhcmFtIG11dGV4IHBvaW50ZXIgdG8gdGhlIG11dGV4IHRvIGNyZWF0ZQorICogQHJldHVybiBhIG5ldyBtdXRleCAqLworZXJyX3Qgc3lzX211dGV4X25ldyhzeXNfbXV0ZXhfdCAqbXV0ZXgpOworLyoqIExvY2sgYSBtdXRleAorICogQHBhcmFtIG11dGV4IHRoZSBtdXRleCB0byBsb2NrICovCit2b2lkIHN5c19tdXRleF9sb2NrKHN5c19tdXRleF90ICptdXRleCk7CisvKiogVW5sb2NrIGEgbXV0ZXgKKyAqIEBwYXJhbSBtdXRleCB0aGUgbXV0ZXggdG8gdW5sb2NrICovCit2b2lkIHN5c19tdXRleF91bmxvY2soc3lzX211dGV4X3QgKm11dGV4KTsKKy8qKiBEZWxldGUgYSBzZW1hcGhvcmUKKyAqIEBwYXJhbSBtdXRleCB0aGUgbXV0ZXggdG8gZGVsZXRlICovCit2b2lkIHN5c19tdXRleF9mcmVlKHN5c19tdXRleF90ICptdXRleCk7IAorI2lmbmRlZiBzeXNfbXV0ZXhfdmFsaWQKKy8qKiBDaGVjayBpZiBhIG11dGV4IGlzIHZhbGlkL2FsbG9jYXRlZDogcmV0dXJuIDEgZm9yIHZhbGlkLCAwIGZvciBpbnZhbGlkICovCitpbnQgc3lzX211dGV4X3ZhbGlkKHN5c19tdXRleF90ICptdXRleCk7CisjZW5kaWYKKyNpZm5kZWYgc3lzX211dGV4X3NldF9pbnZhbGlkCisvKiogU2V0IGEgbXV0ZXggaW52YWxpZCBzbyB0aGF0IHN5c19tdXRleF92YWxpZCByZXR1cm5zIDAgKi8KK3ZvaWQgc3lzX211dGV4X3NldF9pbnZhbGlkKHN5c19tdXRleF90ICptdXRleCk7CisjZW5kaWYKKyNlbmRpZiAvKiBMV0lQX0NPTVBBVF9NVVRFWCAqLworCisvKiBTZW1hcGhvcmUgZnVuY3Rpb25zOiAqLworCisvKiogQ3JlYXRlIGEgbmV3IHNlbWFwaG9yZQorICogQHBhcmFtIHNlbSBwb2ludGVyIHRvIHRoZSBzZW1hcGhvcmUgdG8gY3JlYXRlCisgKiBAcGFyYW0gY291bnQgaW5pdGlhbCBjb3VudCBvZiB0aGUgc2VtYXBob3JlCisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsLCBhbm90aGVyIGVycl90IG90aGVyd2lzZSAqLworZXJyX3Qgc3lzX3NlbV9uZXcoc3lzX3NlbV90ICpzZW0sIHU4X3QgY291bnQpOworLyoqIFNpZ25hbHMgYSBzZW1hcGhvcmUKKyAqIEBwYXJhbSBzZW0gdGhlIHNlbWFwaG9yZSB0byBzaWduYWwgKi8KK3ZvaWQgc3lzX3NlbV9zaWduYWwoc3lzX3NlbV90ICpzZW0pOworLyoqIFdhaXQgZm9yIGEgc2VtYXBob3JlIGZvciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQKKyAqIEBwYXJhbSBzZW0gdGhlIHNlbWFwaG9yZSB0byB3YWl0IGZvcgorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCAoMCA9IHdhaXQgZm9yZXZlcikKKyAqIEByZXR1cm4gdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB3YWl0ZWQgZm9yIHRoZSBzZW1hcGhvcmUKKyAqICAgICAgICAgb3IgU1lTX0FSQ0hfVElNRU9VVCBvbiB0aW1lb3V0ICovCit1MzJfdCBzeXNfYXJjaF9zZW1fd2FpdChzeXNfc2VtX3QgKnNlbSwgdTMyX3QgdGltZW91dCk7CisvKiogRGVsZXRlIGEgc2VtYXBob3JlCisgKiBAcGFyYW0gc2VtIHNlbWFwaG9yZSB0byBkZWxldGUgKi8KK3ZvaWQgc3lzX3NlbV9mcmVlKHN5c19zZW1fdCAqc2VtKTsKKy8qKiBXYWl0IGZvciBhIHNlbWFwaG9yZSAtIGZvcmV2ZXIvbm8gdGltZW91dCAqLworI2RlZmluZSBzeXNfc2VtX3dhaXQoc2VtKSAgICAgICAgICAgICAgICAgIHN5c19hcmNoX3NlbV93YWl0KHNlbSwgMCkKKyNpZm5kZWYgc3lzX3NlbV92YWxpZAorLyoqIENoZWNrIGlmIGEgc2VtcGFob3JlIGlzIHZhbGlkL2FsbG9jYXRlZDogcmV0dXJuIDEgZm9yIHZhbGlkLCAwIGZvciBpbnZhbGlkICovCitpbnQgc3lzX3NlbV92YWxpZChzeXNfc2VtX3QgKnNlbSk7CisjZW5kaWYKKyNpZm5kZWYgc3lzX3NlbV9zZXRfaW52YWxpZAorLyoqIFNldCBhIHNlbWFwaG9yZSBpbnZhbGlkIHNvIHRoYXQgc3lzX3NlbV92YWxpZCByZXR1cm5zIDAgKi8KK3ZvaWQgc3lzX3NlbV9zZXRfaW52YWxpZChzeXNfc2VtX3QgKnNlbSk7CisjZW5kaWYKKworLyogVGltZSBmdW5jdGlvbnMuICovCisjaWZuZGVmIHN5c19tc2xlZXAKK3ZvaWQgc3lzX21zbGVlcCh1MzJfdCBtcyk7IC8qIG9ubHkgaGFzIGEgKGNsb3NlIHRvKSAxIGppZmZ5IHJlc29sdXRpb24uICovCisjZW5kaWYKKworLyogTWFpbGJveCBmdW5jdGlvbnMuICovCisKKy8qKiBDcmVhdGUgYSBuZXcgbWJveCBvZiBzcGVjaWZpZWQgc2l6ZQorICogQHBhcmFtIG1ib3ggcG9pbnRlciB0byB0aGUgbWJveCB0byBjcmVhdGUKKyAqIEBwYXJhbSBzaXplIChtaW1pbnVtKSBudW1iZXIgb2YgbWVzc2FnZXMgaW4gdGhpcyBtYm94CisgKiBAcmV0dXJuIEVSUl9PSyBpZiBzdWNjZXNzZnVsLCBhbm90aGVyIGVycl90IG90aGVyd2lzZSAqLworZXJyX3Qgc3lzX21ib3hfbmV3KHN5c19tYm94X3QgKm1ib3gsIGludCBzaXplKTsKKy8qKiBQb3N0IGEgbWVzc2FnZSB0byBhbiBtYm94IC0gbWF5IG5vdCBmYWlsCisgKiAtPiBibG9ja3MgaWYgZnVsbCwgb25seSB1c2VkIGZyb20gdGFza3Mgbm90IGZyb20gSVNSCisgKiBAcGFyYW0gbWJveCBtYm94IHRvIHBvc3RzIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gbXNnIG1lc3NhZ2UgdG8gcG9zdCAoQVRURU5USU9OOiBjYW4gYmUgTlVMTCkgKi8KK3ZvaWQgc3lzX21ib3hfcG9zdChzeXNfbWJveF90ICptYm94LCB2b2lkICptc2cpOworLyoqIFRyeSB0byBwb3N0IGEgbWVzc2FnZSB0byBhbiBtYm94IC0gbWF5IGZhaWwgaWYgZnVsbCBvciBJU1IKKyAqIEBwYXJhbSBtYm94IG1ib3ggdG8gcG9zdHMgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBtc2cgbWVzc2FnZSB0byBwb3N0IChBVFRFTlRJT046IGNhbiBiZSBOVUxMKSAqLworZXJyX3Qgc3lzX21ib3hfdHJ5cG9zdChzeXNfbWJveF90ICptYm94LCB2b2lkICptc2cpOworLyoqIFdhaXQgZm9yIGEgbmV3IG1lc3NhZ2UgdG8gYXJyaXZlIGluIHRoZSBtYm94CisgKiBAcGFyYW0gbWJveCBtYm94IHRvIGdldCBhIG1lc3NhZ2UgZnJvbQorICogQHBhcmFtIG1zZyBwb2ludGVyIHdoZXJlIHRoZSBtZXNzYWdlIGlzIHN0b3JlZAorICogQHBhcmFtIHRpbWVvdXQgbWF4aW11bSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRvIHdhaXQgZm9yIGEgbWVzc2FnZQorICogQHJldHVybiB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHdhaXRlZCBmb3IgYSBtZXNzYWdlLCBtYXkgYmUgMCBpZiBub3Qgd2FpdGVkCisgICAgICAgICAgIG9yIFNZU19BUkNIX1RJTUVPVVQgb24gdGltZW91dAorICogICAgICAgICBUaGUgcmV0dXJuZWQgdGltZSBoYXMgdG8gYmUgYWNjdXJhdGUgdG8gcHJldmVudCB0aW1lciBqaXR0ZXIhICovCit1MzJfdCBzeXNfYXJjaF9tYm94X2ZldGNoKHN5c19tYm94X3QgKm1ib3gsIHZvaWQgKiptc2csIHUzMl90IHRpbWVvdXQpOworLyogQWxsb3cgcG9ydCB0byBvdmVycmlkZSB3aXRoIGEgbWFjcm8sIGUuZy4gc3BlY2lhbCB0aW1vdXQgZm9yIHN5c19hcmNoX21ib3hfZmV0Y2goKSAqLworI2lmbmRlZiBzeXNfYXJjaF9tYm94X3RyeWZldGNoCisvKiogV2FpdCBmb3IgYSBuZXcgbWVzc2FnZSB0byBhcnJpdmUgaW4gdGhlIG1ib3gKKyAqIEBwYXJhbSBtYm94IG1ib3ggdG8gZ2V0IGEgbWVzc2FnZSBmcm9tCisgKiBAcGFyYW0gbXNnIHBvaW50ZXIgd2hlcmUgdGhlIG1lc3NhZ2UgaXMgc3RvcmVkCisgKiBAcGFyYW0gdGltZW91dCBtYXhpbXVtIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdG8gd2FpdCBmb3IgYSBtZXNzYWdlCisgKiBAcmV0dXJuIDAgKG1pbGxpc2Vjb25kcykgaWYgYSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkCisgKiAgICAgICAgIG9yIFNZU19NQk9YX0VNUFRZIGlmIHRoZSBtYWlsYm94IGlzIGVtcHR5ICovCit1MzJfdCBzeXNfYXJjaF9tYm94X3RyeWZldGNoKHN5c19tYm94X3QgKm1ib3gsIHZvaWQgKiptc2cpOworI2VuZGlmCisvKiogRm9yIG5vdywgd2UgbWFwIHN0cmFpZ2h0IHRvIHN5c19hcmNoIGltcGxlbWVudGF0aW9uLiAqLworI2RlZmluZSBzeXNfbWJveF90cnlmZXRjaChtYm94LCBtc2cpIHN5c19hcmNoX21ib3hfdHJ5ZmV0Y2gobWJveCwgbXNnKQorLyoqIERlbGV0ZSBhbiBtYm94CisgKiBAcGFyYW0gbWJveCBtYm94IHRvIGRlbGV0ZSAqLwordm9pZCBzeXNfbWJveF9mcmVlKHN5c19tYm94X3QgKm1ib3gpOworI2RlZmluZSBzeXNfbWJveF9mZXRjaChtYm94LCBtc2cpIHN5c19hcmNoX21ib3hfZmV0Y2gobWJveCwgbXNnLCAwKQorI2lmbmRlZiBzeXNfbWJveF92YWxpZAorLyoqIENoZWNrIGlmIGFuIG1ib3ggaXMgdmFsaWQvYWxsb2NhdGVkOiByZXR1cm4gMSBmb3IgdmFsaWQsIDAgZm9yIGludmFsaWQgKi8KK2ludCBzeXNfbWJveF92YWxpZChzeXNfbWJveF90ICptYm94KTsKKyNlbmRpZgorI2lmbmRlZiBzeXNfbWJveF9zZXRfaW52YWxpZAorLyoqIFNldCBhbiBtYm94IGludmFsaWQgc28gdGhhdCBzeXNfbWJveF92YWxpZCByZXR1cm5zIDAgKi8KK3ZvaWQgc3lzX21ib3hfc2V0X2ludmFsaWQoc3lzX21ib3hfdCAqbWJveCk7CisjZW5kaWYKKworLyoqIFRoZSBvbmx5IHRocmVhZCBmdW5jdGlvbjoKKyAqIENyZWF0ZXMgYSBuZXcgdGhyZWFkCisgKiBAcGFyYW0gbmFtZSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgdGhyZWFkICh1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMpCisgKiBAcGFyYW0gdGhyZWFkIHRocmVhZC1mdW5jdGlvbgorICogQHBhcmFtIGFyZyBwYXJhbWV0ZXIgcGFzc2VkIHRvICd0aHJlYWQnCisgKiBAcGFyYW0gc3RhY2tzaXplIHN0YWNrIHNpemUgaW4gYnl0ZXMgZm9yIHRoZSBuZXcgdGhyZWFkIChtYXkgYmUgaWdub3JlZCBieSBwb3J0cykKKyAqIEBwYXJhbSBwcmlvIHByaW9yaXR5IG9mIHRoZSBuZXcgdGhyZWFkIChtYXkgYmUgaWdub3JlZCBieSBwb3J0cykgKi8KK3N5c190aHJlYWRfdCBzeXNfdGhyZWFkX25ldyhjb25zdCBjaGFyICpuYW1lLCBsd2lwX3RocmVhZF9mbiB0aHJlYWQsIHZvaWQgKmFyZywgaW50IHN0YWNrc2l6ZSwgaW50IHByaW8pOworCisjZW5kaWYgLyogTk9fU1lTICovCisKKy8qIHN5c19pbml0KCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFudGhpbmcgZWxzZS4gKi8KK3ZvaWQgc3lzX2luaXQodm9pZCk7CisKKyNpZm5kZWYgc3lzX2ppZmZpZXMKKy8qKiBUaWNrcy9qaWZmaWVzIHNpbmNlIHBvd2VyIHVwLiAqLwordTMyX3Qgc3lzX2ppZmZpZXModm9pZCk7CisjZW5kaWYKKworLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMsCisgKiBtYXkgYmUgdGhlIHNhbWUgYXMgc3lzX2ppZmZpZXMgb3IgYXQgbGVhc3QgYmFzZWQgb24gaXQuICovCit1MzJfdCBzeXNfbm93KHZvaWQpOworCisvKiBDcml0aWNhbCBSZWdpb24gUHJvdGVjdGlvbiAqLworLyogVGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHN5c19hcmNoLmMgZmlsZS4KKyAgIEluIHNvbWUgaW1wbGVtZW50YXRpb25zIHRoZXkgY2FuIHByb3ZpZGUgYSBtb3JlIGxpZ2h0LXdlaWdodCBwcm90ZWN0aW9uCisgICBtZWNoYW5pc20gdGhhbiB1c2luZyBzZW1hcGhvcmVzLiBPdGhlcndpc2Ugc2VtYXBob3JlcyBjYW4gYmUgdXNlZCBmb3IKKyAgIGltcGxlbWVudGF0aW9uICovCisjaWZuZGVmIFNZU19BUkNIX1BST1RFQ1QKKy8qKiBTWVNfTElHSFRXRUlHSFRfUFJPVAorICogZGVmaW5lIFNZU19MSUdIVFdFSUdIVF9QUk9UIGluIGx3aXBvcHRzLmggaWYgeW91IHdhbnQgaW50ZXItdGFzayBwcm90ZWN0aW9uCisgKiBmb3IgY2VydGFpbiBjcml0aWNhbCByZWdpb25zIGR1cmluZyBidWZmZXIgYWxsb2NhdGlvbiwgZGVhbGxvY2F0aW9uIGFuZCBtZW1vcnkKKyAqIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbi4KKyAqLworI2lmIFNZU19MSUdIVFdFSUdIVF9QUk9UCisKKy8qKiBTWVNfQVJDSF9ERUNMX1BST1RFQ1QKKyAqIGRlY2xhcmUgYSBwcm90ZWN0aW9uIHZhcmlhYmxlLiBUaGlzIG1hY3JvIHdpbGwgZGVmYXVsdCB0byBkZWZpbmluZyBhIHZhcmlhYmxlIG9mCisgKiB0eXBlIHN5c19wcm90X3QuIElmIGEgcGFydGljdWxhciBwb3J0IG5lZWRzIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLCB0aGVuCisgKiB0aGlzIG1hY3JvIG1heSBiZSBkZWZpbmVkIGluIHN5c19hcmNoLmguCisgKi8KKyNkZWZpbmUgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldikgc3lzX3Byb3RfdCBsZXYKKy8qKiBTWVNfQVJDSF9QUk9URUNUCisgKiBQZXJmb3JtIGEgImZhc3QiIHByb3RlY3QuIFRoaXMgY291bGQgYmUgaW1wbGVtZW50ZWQgYnkKKyAqIGRpc2FibGluZyBpbnRlcnJ1cHRzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0gb3IgYnkgdXNpbmcgYSBzZW1hcGhvcmUgb3IKKyAqIG11dGV4LiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsbG93IGNhbGxpbmcgU1lTX0FSQ0hfUFJPVEVDVCB3aGVuCisgKiBhbHJlYWR5IHByb3RlY3RlZC4gVGhlIG9sZCBwcm90ZWN0aW9uIGxldmVsIGlzIHJldHVybmVkIGluIHRoZSB2YXJpYWJsZQorICogImxldiIuIFRoaXMgbWFjcm8gd2lsbCBkZWZhdWx0IHRvIGNhbGxpbmcgdGhlIHN5c19hcmNoX3Byb3RlY3QoKSBmdW5jdGlvbgorICogd2hpY2ggc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN5c19hcmNoLmMuIElmIGEgcGFydGljdWxhciBwb3J0IG5lZWRzIGEKKyAqIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlbiB0aGlzIG1hY3JvIG1heSBiZSBkZWZpbmVkIGluIHN5c19hcmNoLmgKKyAqLworI2RlZmluZSBTWVNfQVJDSF9QUk9URUNUKGxldikgbGV2ID0gc3lzX2FyY2hfcHJvdGVjdCgpCisvKiogU1lTX0FSQ0hfVU5QUk9URUNUCisgKiBQZXJmb3JtIGEgImZhc3QiIHNldCBvZiB0aGUgcHJvdGVjdGlvbiBsZXZlbCB0byAibGV2Ii4gVGhpcyBjb3VsZCBiZQorICogaW1wbGVtZW50ZWQgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IGxldmVsIHRvICJsZXYiIHdpdGhpbiB0aGUgTUFDUk8gb3IgYnkKKyAqIHVzaW5nIGEgc2VtYXBob3JlIG9yIG11dGV4LiAgVGhpcyBtYWNybyB3aWxsIGRlZmF1bHQgdG8gY2FsbGluZyB0aGUKKyAqIHN5c19hcmNoX3VucHJvdGVjdCgpIGZ1bmN0aW9uIHdoaWNoIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbgorICogc3lzX2FyY2guYy4gSWYgYSBwYXJ0aWN1bGFyIHBvcnQgbmVlZHMgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24sIHRoZW4KKyAqIHRoaXMgbWFjcm8gbWF5IGJlIGRlZmluZWQgaW4gc3lzX2FyY2guaAorICovCisjZGVmaW5lIFNZU19BUkNIX1VOUFJPVEVDVChsZXYpIHN5c19hcmNoX3VucHJvdGVjdChsZXYpCitzeXNfcHJvdF90IHN5c19hcmNoX3Byb3RlY3Qodm9pZCk7Cit2b2lkIHN5c19hcmNoX3VucHJvdGVjdChzeXNfcHJvdF90IHB2YWwpOworCisjZWxzZQorCisjZGVmaW5lIFNZU19BUkNIX0RFQ0xfUFJPVEVDVChsZXYpCisjZGVmaW5lIFNZU19BUkNIX1BST1RFQ1QobGV2KQorI2RlZmluZSBTWVNfQVJDSF9VTlBST1RFQ1QobGV2KQorCisjZW5kaWYgLyogU1lTX0xJR0hUV0VJR0hUX1BST1QgKi8KKworI2VuZGlmIC8qIFNZU19BUkNIX1BST1RFQ1QgKi8KKworLyoKKyAqIE1hY3JvcyB0byBzZXQvZ2V0IGFuZCBpbmNyZWFzZS9kZWNyZWFzZSB2YXJpYWJsZXMgaW4gYSB0aHJlYWQtc2FmZSB3YXkuCisgKiBVc2UgdGhlc2UgZm9yIGFjY2Vzc2luZyB2YXJpYWJsZSB0aGF0IGFyZSB1c2VkIGZyb20gbW9yZSB0aGFuIG9uZSB0aHJlYWQuCisgKi8KKworI2lmbmRlZiBTWVNfQVJDSF9JTkMKKyNkZWZpbmUgU1lTX0FSQ0hfSU5DKHZhciwgdmFsKSBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKG9sZF9sZXZlbCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX0FSQ0hfUFJPVEVDVChvbGRfbGV2ZWwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciArPSB2YWw7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX0FSQ0hfVU5QUk9URUNUKG9sZF9sZXZlbCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbmRpZiAvKiBTWVNfQVJDSF9JTkMgKi8KKworI2lmbmRlZiBTWVNfQVJDSF9ERUMKKyNkZWZpbmUgU1lTX0FSQ0hfREVDKHZhciwgdmFsKSBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKG9sZF9sZXZlbCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX0FSQ0hfUFJPVEVDVChvbGRfbGV2ZWwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAtPSB2YWw7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX0FSQ0hfVU5QUk9URUNUKG9sZF9sZXZlbCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbmRpZiAvKiBTWVNfQVJDSF9ERUMgKi8KKworI2lmbmRlZiBTWVNfQVJDSF9HRVQKKyNkZWZpbmUgU1lTX0FSQ0hfR0VUKHZhciwgcmV0KSBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKG9sZF9sZXZlbCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX0FSQ0hfUFJPVEVDVChvbGRfbGV2ZWwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHZhcjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNfQVJDSF9VTlBST1RFQ1Qob2xkX2xldmVsKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2VuZGlmIC8qIFNZU19BUkNIX0dFVCAqLworCisjaWZuZGVmIFNZU19BUkNIX1NFVAorI2RlZmluZSBTWVNfQVJDSF9TRVQodmFyLCB2YWwpIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNfQVJDSF9ERUNMX1BST1RFQ1Qob2xkX2xldmVsKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNfQVJDSF9QUk9URUNUKG9sZF9sZXZlbCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyID0gdmFsOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU19BUkNIX1VOUFJPVEVDVChvbGRfbGV2ZWwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZW5kaWYgLyogU1lTX0FSQ0hfU0VUICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTFdJUF9TWVNfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC90Y3AuaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGNkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC90Y3AuaApAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKyNpZm5kZWYgX19MV0lQX1RDUF9IX18KKyNkZWZpbmUgX19MV0lQX1RDUF9IX18KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBMV0lQX1RDUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvc3lzLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpbmNsdWRlICJsd2lwL2lwLmgiCisjaW5jbHVkZSAibHdpcC9pY21wLmgiCisjaW5jbHVkZSAibHdpcC9lcnIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgdGNwX3BjYjsKKworLyoqIEZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgdGNwIGFjY2VwdCBjYWxsYmFjayBmdW5jdGlvbnMuIENhbGxlZCB3aGVuIGEgbmV3CisgKiBjb25uZWN0aW9uIGNhbiBiZSBhY2NlcHRlZCBvbiBhIGxpc3RlbmluZyBwY2IuCisgKgorICogQHBhcmFtIGFyZyBBZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIChAc2VlIHRjcF9hcmcoKSkKKyAqIEBwYXJhbSBuZXdwY2IgVGhlIG5ldyBjb25uZWN0aW9uIHBjYgorICogQHBhcmFtIGVyciBBbiBlcnJvciBjb2RlIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGFjY2VwdGluZy4KKyAqICAgICAgICAgICAgT25seSByZXR1cm4gRVJSX0FCUlQgaWYgeW91IGhhdmUgY2FsbGVkIHRjcF9hYm9ydCBmcm9tIHdpdGhpbiB0aGUKKyAqICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24hCisgKi8KK3R5cGVkZWYgZXJyX3QgKCp0Y3BfYWNjZXB0X2ZuKSh2b2lkICphcmcsIHN0cnVjdCB0Y3BfcGNiICpuZXdwY2IsIGVycl90IGVycik7CisKKy8qKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIHRjcCByZWNlaXZlIGNhbGxiYWNrIGZ1bmN0aW9ucy4gQ2FsbGVkIHdoZW4gZGF0YSBoYXMKKyAqIGJlZW4gcmVjZWl2ZWQuCisgKgorICogQHBhcmFtIGFyZyBBZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIChAc2VlIHRjcF9hcmcoKSkKKyAqIEBwYXJhbSB0cGNiIFRoZSBjb25uZWN0aW9uIHBjYiB3aGljaCByZWNlaXZlZCBkYXRhCisgKiBAcGFyYW0gcCBUaGUgcmVjZWl2ZWQgZGF0YSAob3IgTlVMTCB3aGVuIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCEpCisgKiBAcGFyYW0gZXJyIEFuIGVycm9yIGNvZGUgaWYgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgcmVjZWl2aW5nCisgKiAgICAgICAgICAgIE9ubHkgcmV0dXJuIEVSUl9BQlJUIGlmIHlvdSBoYXZlIGNhbGxlZCB0Y3BfYWJvcnQgZnJvbSB3aXRoaW4gdGhlCisgKiAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIQorICovCit0eXBlZGVmIGVycl90ICgqdGNwX3JlY3ZfZm4pKHZvaWQgKmFyZywgc3RydWN0IHRjcF9wY2IgKnRwY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYnVmICpwLCBlcnJfdCBlcnIpOworCisvKiogRnVuY3Rpb24gcHJvdG90eXBlIGZvciB0Y3Agc2VudCBjYWxsYmFjayBmdW5jdGlvbnMuIENhbGxlZCB3aGVuIHNlbnQgZGF0YSBoYXMKKyAqIGJlZW4gYWNrbm93bGVkZ2VkIGJ5IHRoZSByZW1vdGUgc2lkZS4gVXNlIGl0IHRvIGZyZWUgY29ycmVzcG9uZGluZyByZXNvdXJjZXMuCisgKiBUaGlzIGFsc28gbWVhbnMgdGhhdCB0aGUgcGNiIGhhcyBub3cgc3BhY2UgYXZhaWxhYmxlIHRvIHNlbmQgbmV3IGRhdGEuCisgKgorICogQHBhcmFtIGFyZyBBZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIChAc2VlIHRjcF9hcmcoKSkKKyAqIEBwYXJhbSB0cGNiIFRoZSBjb25uZWN0aW9uIHBjYiBmb3Igd2hpY2ggZGF0YSBoYXMgYmVlbiBhY2tub3dsZWRnZWQKKyAqIEBwYXJhbSBsZW4gVGhlIGFtb3VudCBvZiBieXRlcyBhY2tub3dsZWRnZWQKKyAqIEByZXR1cm4gRVJSX09LOiB0cnkgdG8gc2VuZCBzb21lIGRhdGEgYnkgY2FsbGluZyB0Y3Bfb3V0cHV0CisgKiAgICAgICAgICAgIE9ubHkgcmV0dXJuIEVSUl9BQlJUIGlmIHlvdSBoYXZlIGNhbGxlZCB0Y3BfYWJvcnQgZnJvbSB3aXRoaW4gdGhlCisgKiAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIQorICovCit0eXBlZGVmIGVycl90ICgqdGNwX3NlbnRfZm4pKHZvaWQgKmFyZywgc3RydWN0IHRjcF9wY2IgKnRwY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBsZW4pOworCisvKiogRnVuY3Rpb24gcHJvdG90eXBlIGZvciB0Y3AgcG9sbCBjYWxsYmFjayBmdW5jdGlvbnMuIENhbGxlZCBwZXJpb2RpY2FsbHkgYXMKKyAqIHNwZWNpZmllZCBieSBAc2VlIHRjcF9wb2xsLgorICoKKyAqIEBwYXJhbSBhcmcgQWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAoQHNlZSB0Y3BfYXJnKCkpCisgKiBAcGFyYW0gdHBjYiB0Y3AgcGNiCisgKiBAcmV0dXJuIEVSUl9PSzogdHJ5IHRvIHNlbmQgc29tZSBkYXRhIGJ5IGNhbGxpbmcgdGNwX291dHB1dAorICogICAgICAgICAgICBPbmx5IHJldHVybiBFUlJfQUJSVCBpZiB5b3UgaGF2ZSBjYWxsZWQgdGNwX2Fib3J0IGZyb20gd2l0aGluIHRoZQorICogICAgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbiEKKyAqLwordHlwZWRlZiBlcnJfdCAoKnRjcF9wb2xsX2ZuKSh2b2lkICphcmcsIHN0cnVjdCB0Y3BfcGNiICp0cGNiKTsKKworLyoqIEZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgdGNwIGVycm9yIGNhbGxiYWNrIGZ1bmN0aW9ucy4gQ2FsbGVkIHdoZW4gdGhlIHBjYgorICogcmVjZWl2ZXMgYSBSU1Qgb3IgaXMgdW5leHBlY3RlZGx5IGNsb3NlZCBmb3IgYW55IG90aGVyIHJlYXNvbi4KKyAqCisgKiBAbm90ZSBUaGUgY29ycmVzcG9uZGluZyBwY2IgaXMgYWxyZWFkeSBmcmVlZCB3aGVuIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIQorICoKKyAqIEBwYXJhbSBhcmcgQWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAoQHNlZSB0Y3BfYXJnKCkpCisgKiBAcGFyYW0gZXJyIEVycm9yIGNvZGUgdG8gaW5kaWNhdGUgd2h5IHRoZSBwY2IgaGFzIGJlZW4gY2xvc2VkCisgKiAgICAgICAgICAgIEVSUl9BQlJUOiBhYm9ydGVkIHRocm91Z2ggdGNwX2Fib3J0IG9yIGJ5IGEgVENQIHRpbWVyCisgKiAgICAgICAgICAgIEVSUl9SU1Q6IHRoZSBjb25uZWN0aW9uIHdhcyByZXNldCBieSB0aGUgcmVtb3RlIGhvc3QKKyAqLwordHlwZWRlZiB2b2lkICAoKnRjcF9lcnJfZm4pKHZvaWQgKmFyZywgZXJyX3QgZXJyKTsKKworLyoqIEZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgdGNwIGNvbm5lY3RlZCBjYWxsYmFjayBmdW5jdGlvbnMuIENhbGxlZCB3aGVuIGEgcGNiCisgKiBpcyBjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBzaWRlIGFmdGVyIGluaXRpYXRpbmcgYSBjb25uZWN0aW9uIGF0dGVtcHQgYnkKKyAqIGNhbGxpbmcgdGNwX2Nvbm5lY3QoKS4KKyAqCisgKiBAcGFyYW0gYXJnIEFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKEBzZWUgdGNwX2FyZygpKQorICogQHBhcmFtIHRwY2IgVGhlIGNvbm5lY3Rpb24gcGNiIHdoaWNoIGlzIGNvbm5lY3RlZAorICogQHBhcmFtIGVyciBBbiB1bnVzZWQgZXJyb3IgY29kZSwgYWx3YXlzIEVSUl9PSyBjdXJyZW50bHkgOy0pIFRPRE8hCisgKiAgICAgICAgICAgIE9ubHkgcmV0dXJuIEVSUl9BQlJUIGlmIHlvdSBoYXZlIGNhbGxlZCB0Y3BfYWJvcnQgZnJvbSB3aXRoaW4gdGhlCisgKiAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIQorICoKKyAqIEBub3RlIFdoZW4gYSBjb25uZWN0aW9uIGF0dGVtcHQgZmFpbHMsIHRoZSBlcnJvciBjYWxsYmFjayBpcyBjdXJyZW50bHkgY2FsbGVkIQorICovCit0eXBlZGVmIGVycl90ICgqdGNwX2Nvbm5lY3RlZF9mbikodm9pZCAqYXJnLCBzdHJ1Y3QgdGNwX3BjYiAqdHBjYiwgZXJyX3QgZXJyKTsKKworZW51bSB0Y3Bfc3RhdGUgeworICBDTE9TRUQgICAgICA9IDAsCisgIExJU1RFTiAgICAgID0gMSwKKyAgU1lOX1NFTlQgICAgPSAyLAorICBTWU5fUkNWRCAgICA9IDMsCisgIEVTVEFCTElTSEVEID0gNCwKKyAgRklOX1dBSVRfMSAgPSA1LAorICBGSU5fV0FJVF8yICA9IDYsCisgIENMT1NFX1dBSVQgID0gNywKKyAgQ0xPU0lORyAgICAgPSA4LAorICBMQVNUX0FDSyAgICA9IDksCisgIFRJTUVfV0FJVCAgID0gMTAKK307CisKKyNpZiBMV0lQX0NBTExCQUNLX0FQSQorICAvKiBGdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBsaXN0ZW5lciBoYXMgYmVlbiBjb25uZWN0ZWQuCisgICAqIEBwYXJhbSBhcmcgdXNlci1zdXBwbGllZCBhcmd1bWVudCAodGNwX3BjYi5jYWxsYmFja19hcmcpCisgICAqIEBwYXJhbSBwY2IgYSBuZXcgdGNwX3BjYiB0aGF0IG5vdyBpcyBjb25uZWN0ZWQKKyAgICogQHBhcmFtIGVyciBhbiBlcnJvciBhcmd1bWVudCAoVE9ETzogdGhhdCBpcyBjdXJyZW50IGFsd2F5cyBFUlJfT0s/KQorICAgKiBAcmV0dXJuIEVSUl9PSzogYWNjZXB0IHRoZSBuZXcgY29ubmVjdGlvbiwKKyAgICogICAgICAgICAgICAgICAgIGFueSBvdGhlciBlcnJfdCBhYm9ydHN0aGUgbmV3IGNvbm5lY3Rpb24KKyAgICovCisjZGVmaW5lIERFRl9BQ0NFUFRfQ0FMTEJBQ0sgIHRjcF9hY2NlcHRfZm4gYWNjZXB0OworI2Vsc2UgLyogTFdJUF9DQUxMQkFDS19BUEkgKi8KKyNkZWZpbmUgREVGX0FDQ0VQVF9DQUxMQkFDSworI2VuZGlmIC8qIExXSVBfQ0FMTEJBQ0tfQVBJICovCisKKy8qKgorICogbWVtYmVycyBjb21tb24gdG8gc3RydWN0IHRjcF9wY2IgYW5kIHN0cnVjdCB0Y3BfbGlzdGVuX3BjYgorICovCisjZGVmaW5lIFRDUF9QQ0JfQ09NTU9OKHR5cGUpIFwKKyAgdHlwZSAqbmV4dDsgLyogZm9yIHRoZSBsaW5rZWQgbGlzdCAqLyBcCisgIGVudW0gdGNwX3N0YXRlIHN0YXRlOyAvKiBUQ1Agc3RhdGUgKi8gXAorICB1OF90IHByaW87IFwKKyAgdm9pZCAqY2FsbGJhY2tfYXJnOyBcCisgIC8qIHRoZSBhY2NlcHQgY2FsbGJhY2sgZm9yIGxpc3Rlbi0gYW5kIG5vcm1hbCBwY2JzLCBpZiBMV0lQX0NBTExCQUNLX0FQSSAqLyBcCisgIERFRl9BQ0NFUFRfQ0FMTEJBQ0sgXAorICAvKiBwb3J0cyBhcmUgaW4gaG9zdCBieXRlIG9yZGVyICovIFwKKyAgdTE2X3QgbG9jYWxfcG9ydAorCisKKy8qIHRoZSBUQ1AgcHJvdG9jb2wgY29udHJvbCBibG9jayAqLworc3RydWN0IHRjcF9wY2IgeworLyoqIGNvbW1vbiBQQ0IgbWVtYmVycyAqLworICBJUF9QQ0I7CisvKiogcHJvdG9jb2wgc3BlY2lmaWMgUENCIG1lbWJlcnMgKi8KKyAgVENQX1BDQl9DT01NT04oc3RydWN0IHRjcF9wY2IpOworCisgIC8qIHBvcnRzIGFyZSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KKyAgdTE2X3QgcmVtb3RlX3BvcnQ7CisgIAorICB1OF90IGZsYWdzOworI2RlZmluZSBURl9BQ0tfREVMQVkgICAoKHU4X3QpMHgwMVUpICAgLyogRGVsYXllZCBBQ0suICovCisjZGVmaW5lIFRGX0FDS19OT1cgICAgICgodThfdCkweDAyVSkgICAvKiBJbW1lZGlhdGUgQUNLLiAqLworI2RlZmluZSBURl9JTkZSICAgICAgICAoKHU4X3QpMHgwNFUpICAgLyogSW4gZmFzdCByZWNvdmVyeS4gKi8KKyNkZWZpbmUgVEZfVElNRVNUQU1QICAgKCh1OF90KTB4MDhVKSAgIC8qIFRpbWVzdGFtcCBvcHRpb24gZW5hYmxlZCAqLworI2RlZmluZSBURl9SWENMT1NFRCAgICAoKHU4X3QpMHgxMFUpICAgLyogcnggY2xvc2VkIGJ5IHRjcF9zaHV0ZG93biAqLworI2RlZmluZSBURl9GSU4gICAgICAgICAoKHU4X3QpMHgyMFUpICAgLyogQ29ubmVjdGlvbiB3YXMgY2xvc2VkIGxvY2FsbHkgKEZJTiBzZWdtZW50IGVucXVldWVkKS4gKi8KKyNkZWZpbmUgVEZfTk9ERUxBWSAgICAgKCh1OF90KTB4NDBVKSAgIC8qIERpc2FibGUgTmFnbGUgYWxnb3JpdGhtICovCisjZGVmaW5lIFRGX05BR0xFTUVNRVJSICgodThfdCkweDgwVSkgICAvKiBuYWdsZSBlbmFibGVkLCBtZW1lcnIsIHRyeSB0byBvdXRwdXQgdG8gcHJldmVudCBkZWxheWVkIEFDSyB0byBoYXBwZW4gKi8KKworICAvKiB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIGFyZSBpbiBob3N0IGJ5dGUgb3JkZXIKKyAgICAgYXMgd2UgaGF2ZSB0byBkbyBzb21lIG1hdGggd2l0aCB0aGVtICovCisgIC8qIHJlY2VpdmVyIHZhcmlhYmxlcyAqLworICB1MzJfdCByY3Zfbnh0OyAgIC8qIG5leHQgc2Vxbm8gZXhwZWN0ZWQgKi8KKyAgdTE2X3QgcmN2X3duZDsgICAvKiByZWNlaXZlciB3aW5kb3cgYXZhaWxhYmxlICovCisgIHUxNl90IHJjdl9hbm5fd25kOyAvKiByZWNlaXZlciB3aW5kb3cgdG8gYW5ub3VuY2UgKi8KKyAgdTMyX3QgcmN2X2Fubl9yaWdodF9lZGdlOyAvKiBhbm5vdW5jZWQgcmlnaHQgZWRnZSBvZiB3aW5kb3cgKi8KKworICAvKiBUaW1lcnMgKi8KKyAgdTMyX3QgdG1yOworICB1OF90IHBvbGx0bXIsIHBvbGxpbnRlcnZhbDsKKyAgCisgIC8qIFJldHJhbnNtaXNzaW9uIHRpbWVyLiAqLworICBzMTZfdCBydGltZTsKKyAgCisgIHUxNl90IG1zczsgICAvKiBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworICAKKyAgLyogUlRUIChyb3VuZCB0cmlwIHRpbWUpIGVzdGltYXRpb24gdmFyaWFibGVzICovCisgIHUzMl90IHJ0dGVzdDsgLyogUlRUIGVzdGltYXRlIGluIDUwMG1zIHRpY2tzICovCisgIHUzMl90IHJ0c2VxOyAgLyogc2VxdWVuY2UgbnVtYmVyIGJlaW5nIHRpbWVkICovCisgIHMxNl90IHNhLCBzdjsgLyogQHRvZG8gZG9jdW1lbnQgdGhpcyAqLworCisgIHMxNl90IHJ0bzsgICAgLyogcmV0cmFuc21pc3Npb24gdGltZS1vdXQgKi8KKyAgdThfdCBucnR4OyAgICAvKiBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zICovCisKKyAgLyogZmFzdCByZXRyYW5zbWl0L3JlY292ZXJ5ICovCisgIHUzMl90IGxhc3RhY2s7IC8qIEhpZ2hlc3QgYWNrbm93bGVkZ2VkIHNlcW5vLiAqLworICB1OF90IGR1cGFja3M7CisgIAorICAvKiBjb25nZXN0aW9uIGF2b2lkYW5jZS9jb250cm9sIHZhcmlhYmxlcyAqLworICB1MTZfdCBjd25kOyAgCisgIHUxNl90IHNzdGhyZXNoOworCisgIC8qIHNlbmRlciB2YXJpYWJsZXMgKi8KKyAgdTMyX3Qgc25kX254dDsgICAvKiBuZXh0IG5ldyBzZXFubyB0byBiZSBzZW50ICovCisgIHUxNl90IHNuZF93bmQ7ICAgLyogc2VuZGVyIHdpbmRvdyAqLworICB1MzJfdCBzbmRfd2wxLCBzbmRfd2wyOyAvKiBTZXF1ZW5jZSBhbmQgYWNrbm93bGVkZ2VtZW50IG51bWJlcnMgb2YgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgdXBkYXRlLiAqLworICB1MzJfdCBzbmRfbGJiOyAgICAgICAvKiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV4dCBieXRlIHRvIGJlIGJ1ZmZlcmVkLiAqLworCisgIHUxNl90IGFja2VkOworICAKKyAgdTE2X3Qgc25kX2J1ZjsgICAvKiBBdmFpbGFibGUgYnVmZmVyIHNwYWNlIGZvciBzZW5kaW5nIChpbiBieXRlcykuICovCisjZGVmaW5lIFRDUF9TTkRRVUVVRUxFTl9PVkVSRkxPVyAoMHhmZmZmVS0zKQorICB1MTZfdCBzbmRfcXVldWVsZW47IC8qIEF2YWlsYWJsZSBidWZmZXIgc3BhY2UgZm9yIHNlbmRpbmcgKGluIHRjcF9zZWdzKS4gKi8KKworI2lmIFRDUF9PVkVSU0laRQorICAvKiBFeHRyYSBieXRlcyBhdmFpbGFibGUgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBwYnVmIGluIHVuc2VudC4gKi8KKyAgdTE2X3QgdW5zZW50X292ZXJzaXplOworI2VuZGlmIC8qIFRDUF9PVkVSU0laRSAqLyAKKworICAvKiBUaGVzZSBhcmUgb3JkZXJlZCBieSBzZXF1ZW5jZSBudW1iZXI6ICovCisgIHN0cnVjdCB0Y3Bfc2VnICp1bnNlbnQ7ICAgLyogVW5zZW50IChxdWV1ZWQpIHNlZ21lbnRzLiAqLworICBzdHJ1Y3QgdGNwX3NlZyAqdW5hY2tlZDsgIC8qIFNlbnQgYnV0IHVuYWNrbm93bGVkZ2VkIHNlZ21lbnRzLiAqLworI2lmIFRDUF9RVUVVRV9PT1NFUSAgCisgIHN0cnVjdCB0Y3Bfc2VnICpvb3NlcTsgICAgLyogUmVjZWl2ZWQgb3V0IG9mIHNlcXVlbmNlIHNlZ21lbnRzLiAqLworI2VuZGlmIC8qIFRDUF9RVUVVRV9PT1NFUSAqLworCisgIHN0cnVjdCBwYnVmICpyZWZ1c2VkX2RhdGE7IC8qIERhdGEgcHJldmlvdXNseSByZWNlaXZlZCBidXQgbm90IHlldCB0YWtlbiBieSB1cHBlciBsYXllciAqLworCisjaWYgTFdJUF9DQUxMQkFDS19BUEkKKyAgLyogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gbW9yZSBzZW5kIGJ1ZmZlciBzcGFjZSBpcyBhdmFpbGFibGUuICovCisgIHRjcF9zZW50X2ZuIHNlbnQ7CisgIC8qIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIChpbi1zZXF1ZW5jZSkgZGF0YSBoYXMgYXJyaXZlZC4gKi8KKyAgdGNwX3JlY3ZfZm4gcmVjdjsKKyAgLyogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBjb25uZWN0aW9uIGhhcyBiZWVuIHNldCB1cC4gKi8KKyAgdGNwX2Nvbm5lY3RlZF9mbiBjb25uZWN0ZWQ7CisgIC8qIEZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkuICovCisgIHRjcF9wb2xsX2ZuIHBvbGw7CisgIC8qIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuZXZlciBhIGZhdGFsIGVycm9yIG9jY3Vycy4gKi8KKyAgdGNwX2Vycl9mbiBlcnJmOworI2VuZGlmIC8qIExXSVBfQ0FMTEJBQ0tfQVBJICovCisKKyNpZiBMV0lQX1RDUF9USU1FU1RBTVBTCisgIHUzMl90IHRzX2xhc3RhY2tzZW50OworICB1MzJfdCB0c19yZWNlbnQ7CisjZW5kaWYgLyogTFdJUF9UQ1BfVElNRVNUQU1QUyAqLworCisgIC8qIGlkbGUgdGltZSBiZWZvcmUgS0VFUEFMSVZFIGlzIHNlbnQgKi8KKyAgdTMyX3Qga2VlcF9pZGxlOworI2lmIExXSVBfVENQX0tFRVBBTElWRQorICB1MzJfdCBrZWVwX2ludHZsOworICB1MzJfdCBrZWVwX2NudDsKKyNlbmRpZiAvKiBMV0lQX1RDUF9LRUVQQUxJVkUgKi8KKyAgCisgIC8qIFBlcnNpc3QgdGltZXIgY291bnRlciAqLworICB1MzJfdCBwZXJzaXN0X2NudDsKKyAgLyogUGVyc2lzdCB0aW1lciBiYWNrLW9mZiAqLworICB1OF90IHBlcnNpc3RfYmFja29mZjsKKworICAvKiBLRUVQQUxJVkUgY291bnRlciAqLworICB1OF90IGtlZXBfY250X3NlbnQ7Cit9OworCitzdHJ1Y3QgdGNwX3BjYl9saXN0ZW4geyAgCisvKiBDb21tb24gbWVtYmVycyBvZiBhbGwgUENCIHR5cGVzICovCisgIElQX1BDQjsKKy8qIFByb3RvY29sIHNwZWNpZmljIFBDQiBtZW1iZXJzICovCisgIFRDUF9QQ0JfQ09NTU9OKHN0cnVjdCB0Y3BfcGNiX2xpc3Rlbik7CisKKyNpZiBUQ1BfTElTVEVOX0JBQ0tMT0cKKyAgdThfdCBiYWNrbG9nOworICB1OF90IGFjY2VwdHNfcGVuZGluZzsKKyNlbmRpZiAvKiBUQ1BfTElTVEVOX0JBQ0tMT0cgKi8KK307CisKKyNpZiBMV0lQX0VWRU5UX0FQSQorCitlbnVtIGx3aXBfZXZlbnQgeworICBMV0lQX0VWRU5UX0FDQ0VQVCwKKyAgTFdJUF9FVkVOVF9TRU5ULAorICBMV0lQX0VWRU5UX1JFQ1YsCisgIExXSVBfRVZFTlRfQ09OTkVDVEVELAorICBMV0lQX0VWRU5UX1BPTEwsCisgIExXSVBfRVZFTlRfRVJSCit9OworCitlcnJfdCBsd2lwX3RjcF9ldmVudCh2b2lkICphcmcsIHN0cnVjdCB0Y3BfcGNiICpwY2IsCisgICAgICAgICBlbnVtIGx3aXBfZXZlbnQsCisgICAgICAgICBzdHJ1Y3QgcGJ1ZiAqcCwKKyAgICAgICAgIHUxNl90IHNpemUsCisgICAgICAgICBlcnJfdCBlcnIpOworCisjZW5kaWYgLyogTFdJUF9FVkVOVF9BUEkgKi8KKworLyogQXBwbGljYXRpb24gcHJvZ3JhbSdzIGludGVyZmFjZTogKi8KK3N0cnVjdCB0Y3BfcGNiICogdGNwX25ldyAgICAgKHZvaWQpOworCit2b2lkICAgICAgICAgICAgIHRjcF9hcmcgICAgIChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB2b2lkICphcmcpOwordm9pZCAgICAgICAgICAgICB0Y3BfYWNjZXB0ICAoc3RydWN0IHRjcF9wY2IgKnBjYiwgdGNwX2FjY2VwdF9mbiBhY2NlcHQpOwordm9pZCAgICAgICAgICAgICB0Y3BfcmVjdiAgICAoc3RydWN0IHRjcF9wY2IgKnBjYiwgdGNwX3JlY3ZfZm4gcmVjdik7Cit2b2lkICAgICAgICAgICAgIHRjcF9zZW50ICAgIChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB0Y3Bfc2VudF9mbiBzZW50KTsKK3ZvaWQgICAgICAgICAgICAgdGNwX3BvbGwgICAgKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHRjcF9wb2xsX2ZuIHBvbGwsIHU4X3QgaW50ZXJ2YWwpOwordm9pZCAgICAgICAgICAgICB0Y3BfZXJyICAgICAoc3RydWN0IHRjcF9wY2IgKnBjYiwgdGNwX2Vycl9mbiBlcnIpOworCisjZGVmaW5lICAgICAgICAgIHRjcF9tc3MocGNiKSAgICAgICAgICAgICAoKChwY2IpLT5mbGFncyAmIFRGX1RJTUVTVEFNUCkgPyAoKHBjYiktPm1zcyAtIDEyKSAgOiAocGNiKS0+bXNzKQorI2RlZmluZSAgICAgICAgICB0Y3Bfc25kYnVmKHBjYikgICAgICAgICAgKChwY2IpLT5zbmRfYnVmKQorI2RlZmluZSAgICAgICAgICB0Y3Bfc25kcXVldWVsZW4ocGNiKSAgICAgKChwY2IpLT5zbmRfcXVldWVsZW4pCisjZGVmaW5lICAgICAgICAgIHRjcF9uYWdsZV9kaXNhYmxlKHBjYikgICAoKHBjYiktPmZsYWdzIHw9IFRGX05PREVMQVkpCisjZGVmaW5lICAgICAgICAgIHRjcF9uYWdsZV9lbmFibGUocGNiKSAgICAoKHBjYiktPmZsYWdzICY9IH5URl9OT0RFTEFZKQorI2RlZmluZSAgICAgICAgICB0Y3BfbmFnbGVfZGlzYWJsZWQocGNiKSAgKCgocGNiKS0+ZmxhZ3MgJiBURl9OT0RFTEFZKSAhPSAwKQorCisjaWYgVENQX0xJU1RFTl9CQUNLTE9HCisjZGVmaW5lICAgICAgICAgIHRjcF9hY2NlcHRlZChwY2IpIGRvIHsgXAorICBMV0lQX0FTU0VSVCgicGNiLT5zdGF0ZSA9PSBMSVNURU4gKGNhbGxlZCBmb3Igd3JvbmcgcGNiPykiLCBwY2ItPnN0YXRlID09IExJU1RFTik7IFwKKyAgKCgoc3RydWN0IHRjcF9wY2JfbGlzdGVuICopKHBjYikpLT5hY2NlcHRzX3BlbmRpbmctLSk7IH0gd2hpbGUoMCkKKyNlbHNlICAvKiBUQ1BfTElTVEVOX0JBQ0tMT0cgKi8KKyNkZWZpbmUgICAgICAgICAgdGNwX2FjY2VwdGVkKHBjYikgTFdJUF9BU1NFUlQoInBjYi0+c3RhdGUgPT0gTElTVEVOIChjYWxsZWQgZm9yIHdyb25nIHBjYj8pIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2ItPnN0YXRlID09IExJU1RFTikKKyNlbmRpZiAvKiBUQ1BfTElTVEVOX0JBQ0tMT0cgKi8KKwordm9pZCAgICAgICAgICAgICB0Y3BfcmVjdmVkICAoc3RydWN0IHRjcF9wY2IgKnBjYiwgdTE2X3QgbGVuKTsKK2Vycl90ICAgICAgICAgICAgdGNwX2JpbmQgICAgKHN0cnVjdCB0Y3BfcGNiICpwY2IsIGlwX2FkZHJfdCAqaXBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgcG9ydCk7CitlcnJfdCAgICAgICAgICAgIHRjcF9jb25uZWN0IChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCBpcF9hZGRyX3QgKmlwYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IHBvcnQsIHRjcF9jb25uZWN0ZWRfZm4gY29ubmVjdGVkKTsKKworc3RydWN0IHRjcF9wY2IgKiB0Y3BfbGlzdGVuX3dpdGhfYmFja2xvZyhzdHJ1Y3QgdGNwX3BjYiAqcGNiLCB1OF90IGJhY2tsb2cpOworI2RlZmluZSAgICAgICAgICB0Y3BfbGlzdGVuKHBjYikgdGNwX2xpc3Rlbl93aXRoX2JhY2tsb2cocGNiLCBUQ1BfREVGQVVMVF9MSVNURU5fQkFDS0xPRykKKwordm9pZCAgICAgICAgICAgICB0Y3BfYWJvcnQgKHN0cnVjdCB0Y3BfcGNiICpwY2IpOworZXJyX3QgICAgICAgICAgICB0Y3BfY2xvc2UgICAoc3RydWN0IHRjcF9wY2IgKnBjYik7CitlcnJfdCAgICAgICAgICAgIHRjcF9zaHV0ZG93bihzdHJ1Y3QgdGNwX3BjYiAqcGNiLCBpbnQgc2h1dF9yeCwgaW50IHNodXRfdHgpOworCisvKiBGbGFncyBmb3IgImFwaWZsYWdzIiBwYXJhbWV0ZXIgaW4gdGNwX3dyaXRlICovCisjZGVmaW5lIFRDUF9XUklURV9GTEFHX0NPUFkgMHgwMQorI2RlZmluZSBUQ1BfV1JJVEVfRkxBR19NT1JFIDB4MDIKKworZXJyX3QgICAgICAgICAgICB0Y3Bfd3JpdGUgICAoc3RydWN0IHRjcF9wY2IgKnBjYiwgY29uc3Qgdm9pZCAqZGF0YXB0ciwgdTE2X3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBhcGlmbGFncyk7CisKK3ZvaWQgICAgICAgICAgICAgdGNwX3NldHByaW8gKHN0cnVjdCB0Y3BfcGNiICpwY2IsIHU4X3QgcHJpbyk7CisKKyNkZWZpbmUgVENQX1BSSU9fTUlOICAgIDEKKyNkZWZpbmUgVENQX1BSSU9fTk9STUFMIDY0CisjZGVmaW5lIFRDUF9QUklPX01BWCAgICAxMjcKKworZXJyX3QgICAgICAgICAgICB0Y3Bfb3V0cHV0ICAoc3RydWN0IHRjcF9wY2IgKnBjYik7CisKKworY29uc3QgY2hhciogdGNwX2RlYnVnX3N0YXRlX3N0cihlbnVtIHRjcF9zdGF0ZSBzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTFdJUF9UQ1AgKi8KKworI2VuZGlmIC8qIF9fTFdJUF9UQ1BfSF9fICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC90Y3BfaW1wbC5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvdGNwX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZlZWMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvdGNwX2ltcGwuaApAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKyNpZm5kZWYgX19MV0lQX1RDUF9JTVBMX0hfXworI2RlZmluZSBfX0xXSVBfVENQX0lNUExfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9UQ1AgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL3RjcC5oIgorI2luY2x1ZGUgImx3aXAvc3lzLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpbmNsdWRlICJsd2lwL2lwLmgiCisjaW5jbHVkZSAibHdpcC9pY21wLmgiCisjaW5jbHVkZSAibHdpcC9lcnIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMgZm9yIGludGVyZmFjaW5nIHdpdGggVENQOiAqLworCisvKiBMb3dlciBsYXllciBpbnRlcmZhY2UgdG8gVENQOiAqLworI2RlZmluZSB0Y3BfaW5pdCgpIC8qIENvbXBhdGliaWxpdHkgZGVmaW5lLCBubyBpbml0IG5lZWRlZC4gKi8KK3ZvaWQgICAgICAgICAgICAgdGNwX3RtciAgICAgKHZvaWQpOyAgLyogTXVzdCBiZSBjYWxsZWQgZXZlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENQX1RNUl9JTlRFUlZBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy4gKFR5cGljYWxseSAyNTAgbXMpLiAqLworLyogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjYWxsIHRoZXNlIHR3byBmdW5jdGlvbnMgYXQgdGhlIHJpZ2h0CisgICBpbnRlcnZhbHMgKGluc3RlYWQgb2YgY2FsbGluZyB0Y3BfdG1yKCkpLiAqLwordm9pZCAgICAgICAgICAgICB0Y3Bfc2xvd3RtciAodm9pZCk7Cit2b2lkICAgICAgICAgICAgIHRjcF9mYXN0dG1yICh2b2lkKTsKKworCisvKiBPbmx5IHVzZWQgYnkgSVAgdG8gcGFzcyBhIFRDUCBzZWdtZW50IHRvIFRDUDogKi8KK3ZvaWQgICAgICAgICAgICAgdGNwX2lucHV0ICAgKHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKmlucCk7CisvKiBVc2VkIHdpdGhpbiB0aGUgVENQIGNvZGUgb25seTogKi8KK3N0cnVjdCB0Y3BfcGNiICogdGNwX2FsbG9jICAgKHU4X3QgcHJpbyk7Cit2b2lkICAgICAgICAgICAgIHRjcF9hYmFuZG9uIChzdHJ1Y3QgdGNwX3BjYiAqcGNiLCBpbnQgcmVzZXQpOworZXJyX3QgICAgICAgICAgICB0Y3Bfc2VuZF9lbXB0eV9hY2soc3RydWN0IHRjcF9wY2IgKnBjYik7Cit2b2lkICAgICAgICAgICAgIHRjcF9yZXhtaXQgIChzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKK3ZvaWQgICAgICAgICAgICAgdGNwX3JleG1pdF9ydG8gIChzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKK3ZvaWQgICAgICAgICAgICAgdGNwX3JleG1pdF9mYXN0IChzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKK3UzMl90ICAgICAgICAgICAgdGNwX3VwZGF0ZV9yY3ZfYW5uX3duZChzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBOYWdsZSBhbGdvcml0aG06IHRyeSB0byBjb21iaW5lIHVzZXIgZGF0YSB0byBzZW5kIGFzIGZldyBUQ1AKKyAqIHNlZ21lbnRzIGFzIHBvc3NpYmxlLiBPbmx5IHNlbmQgaWYKKyAqIC0gbm8gcHJldmlvdXNseSB0cmFuc21pdHRlZCBkYXRhIG9uIHRoZSBjb25uZWN0aW9uIHJlbWFpbnMgdW5hY2tub3dsZWRnZWQgb3IKKyAqIC0gdGhlIFRGX05PREVMQVkgZmxhZyBpcyBzZXQgKG5hZ2xlIGFsZ29yaXRobSB0dXJuZWQgb2ZmIGZvciB0aGlzIHBjYikgb3IKKyAqIC0gdGhlIG9ubHkgdW5zZW50IHNlZ21lbnQgaXMgYXQgbGVhc3QgcGNiLT5tc3MgYnl0ZXMgbG9uZyAob3IgdGhlcmUgaXMgbW9yZQorICogICB0aGFuIG9uZSB1bnNlbnQgc2VnbWVudCAtIHdpdGggbHdJUCwgdGhpcyBjYW4gaGFwcGVuIGFsdGhvdWdoIHVuc2VudC0+bGVuIDwgbXNzKQorICogLSBvciBpZiB3ZSBhcmUgaW4gZmFzdC1yZXRyYW5zbWl0IChURl9JTkZSKQorICovCisjZGVmaW5lIHRjcF9kb19vdXRwdXRfbmFnbGUodHBjYikgKCgoKHRwY2IpLT51bmFja2VkID09IE5VTEwpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRwY2IpLT5mbGFncyAmIChURl9OT0RFTEFZIHwgVEZfSU5GUikpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh0cGNiKS0+dW5zZW50ICE9IE5VTEwpICYmICgoKHRwY2IpLT51bnNlbnQtPm5leHQgIT0gTlVMTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0cGNiKS0+dW5zZW50LT5sZW4gPj0gKHRwY2IpLT5tc3MpKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPyAxIDogMCkKKyNkZWZpbmUgdGNwX291dHB1dF9uYWdsZSh0cGNiKSAodGNwX2RvX291dHB1dF9uYWdsZSh0cGNiKSA/IHRjcF9vdXRwdXQodHBjYikgOiBFUlJfT0spCisKKworI2RlZmluZSBUQ1BfU0VRX0xUKGEsYikgICAgICgoczMyX3QpKChhKS0oYikpIDwgMCkKKyNkZWZpbmUgVENQX1NFUV9MRVEoYSxiKSAgICAoKHMzMl90KSgoYSktKGIpKSA8PSAwKQorI2RlZmluZSBUQ1BfU0VRX0dUKGEsYikgICAgICgoczMyX3QpKChhKS0oYikpID4gMCkKKyNkZWZpbmUgVENQX1NFUV9HRVEoYSxiKSAgICAoKHMzMl90KSgoYSktKGIpKSA+PSAwKQorLyogaXMgYjw9YTw9Yz8gKi8KKyNpZiAwIC8qIHNlZSBidWcgIzEwNTQ4ICovCisjZGVmaW5lIFRDUF9TRVFfQkVUV0VFTihhLGIsYykgKChjKS0oYikgPj0gKGEpLShiKSkKKyNlbmRpZgorI2RlZmluZSBUQ1BfU0VRX0JFVFdFRU4oYSxiLGMpIChUQ1BfU0VRX0dFUShhLGIpICYmIFRDUF9TRVFfTEVRKGEsYykpCisjZGVmaW5lIFRDUF9GSU4gMHgwMVUKKyNkZWZpbmUgVENQX1NZTiAweDAyVQorI2RlZmluZSBUQ1BfUlNUIDB4MDRVCisjZGVmaW5lIFRDUF9QU0ggMHgwOFUKKyNkZWZpbmUgVENQX0FDSyAweDEwVQorI2RlZmluZSBUQ1BfVVJHIDB4MjBVCisjZGVmaW5lIFRDUF9FQ0UgMHg0MFUKKyNkZWZpbmUgVENQX0NXUiAweDgwVQorCisjZGVmaW5lIFRDUF9GTEFHUyAweDNmVQorCisvKiBMZW5ndGggb2YgdGhlIFRDUCBoZWFkZXIsIGV4Y2x1ZGluZyBvcHRpb25zLiAqLworI2RlZmluZSBUQ1BfSExFTiAyMAorCisjaWZuZGVmIFRDUF9UTVJfSU5URVJWQUwKKyNkZWZpbmUgVENQX1RNUl9JTlRFUlZBTCAgICAgICAyNTAgIC8qIFRoZSBUQ1AgdGltZXIgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLiAqLworI2VuZGlmIC8qIFRDUF9UTVJfSU5URVJWQUwgKi8KKworI2lmbmRlZiBUQ1BfRkFTVF9JTlRFUlZBTAorI2RlZmluZSBUQ1BfRkFTVF9JTlRFUlZBTCAgICAgIFRDUF9UTVJfSU5URVJWQUwgLyogdGhlIGZpbmUgZ3JhaW5lZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLworI2VuZGlmIC8qIFRDUF9GQVNUX0lOVEVSVkFMICovCisKKyNpZm5kZWYgVENQX1NMT1dfSU5URVJWQUwKKyNkZWZpbmUgVENQX1NMT1dfSU5URVJWQUwgICAgICAoMipUQ1BfVE1SX0lOVEVSVkFMKSAgLyogdGhlIGNvYXJzZSBncmFpbmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCisjZW5kaWYgLyogVENQX1NMT1dfSU5URVJWQUwgKi8KKworI2RlZmluZSBUQ1BfRklOX1dBSVRfVElNRU9VVCAyMDAwMCAvKiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgVENQX1NZTl9SQ1ZEX1RJTUVPVVQgMjAwMDAgLyogbWlsbGlzZWNvbmRzICovCisKKyNkZWZpbmUgVENQX09PU0VRX1RJTUVPVVQgICAgICAgIDZVIC8qIHggUlRPICovCisKKyNpZm5kZWYgVENQX01TTAorI2RlZmluZSBUQ1BfTVNMIDYwMDAwVUwgLyogVGhlIG1heGltdW0gc2VnbWVudCBsaWZldGltZSBpbiBtaWxsaXNlY29uZHMgKi8KKyNlbmRpZgorCisvKiBLZWVwYWxpdmUgdmFsdWVzLCBjb21wbGlhbnQgd2l0aCBSRkMgMTEyMi4gRG9uJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nICovCisjaWZuZGVmICBUQ1BfS0VFUElETEVfREVGQVVMVAorI2RlZmluZSAgVENQX0tFRVBJRExFX0RFRkFVTFQgICAgIDcyMDAwMDBVTCAvKiBEZWZhdWx0IEtFRVBBTElWRSB0aW1lciBpbiBtaWxsaXNlY29uZHMgKi8KKyNlbmRpZgorCisjaWZuZGVmICBUQ1BfS0VFUElOVFZMX0RFRkFVTFQKKyNkZWZpbmUgIFRDUF9LRUVQSU5UVkxfREVGQVVMVCAgICA3NTAwMFVMICAgLyogRGVmYXVsdCBUaW1lIGJldHdlZW4gS0VFUEFMSVZFIHByb2JlcyBpbiBtaWxsaXNlY29uZHMgKi8KKyNlbmRpZgorCisjaWZuZGVmICBUQ1BfS0VFUENOVF9ERUZBVUxUCisjZGVmaW5lICBUQ1BfS0VFUENOVF9ERUZBVUxUICAgICAgOVUgICAgICAgIC8qIERlZmF1bHQgQ291bnRlciBmb3IgS0VFUEFMSVZFIHByb2JlcyAqLworI2VuZGlmCisKKyNkZWZpbmUgIFRDUF9NQVhJRExFICAgICAgICAgICAgICBUQ1BfS0VFUENOVF9ERUZBVUxUICogVENQX0tFRVBJTlRWTF9ERUZBVUxUICAvKiBNYXhpbXVtIEtFRVBBTElWRSBwcm9iZSB0aW1lICovCisKKy8qIEZpZWxkcyBhcmUgKG9mIGNvdXJzZSkgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICogU29tZSBmaWVsZHMgYXJlIGNvbnZlcnRlZCB0byBob3N0IGJ5dGUgb3JkZXIgaW4gdGNwX2lucHV0KCkuCisgKi8KKyNpZmRlZiBQQUNLX1NUUlVDVF9VU0VfSU5DTFVERVMKKyMgIGluY2x1ZGUgImFyY2gvYnBzdHJ1Y3QuaCIKKyNlbmRpZgorUEFDS19TVFJVQ1RfQkVHSU4KK3N0cnVjdCB0Y3BfaGRyIHsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3Qgc3JjKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3QgZGVzdCk7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUzMl90IHNlcW5vKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTMyX3QgYWNrbm8pOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBfaGRybGVuX3JzdmRfZmxhZ3MpOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCB3bmQpOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBjaGtzdW0pOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCB1cmdwKTsKK30gUEFDS19TVFJVQ1RfU1RSVUNUOworUEFDS19TVFJVQ1RfRU5ECisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Vwc3RydWN0LmgiCisjZW5kaWYKKworI2RlZmluZSBUQ1BIX09GRlNFVChwaGRyKSAobnRvaHMoKHBoZHIpLT5faGRybGVuX3JzdmRfZmxhZ3MpID4+IDgpCisjZGVmaW5lIFRDUEhfSERSTEVOKHBoZHIpIChudG9ocygocGhkciktPl9oZHJsZW5fcnN2ZF9mbGFncykgPj4gMTIpCisjZGVmaW5lIFRDUEhfRkxBR1MocGhkcikgIChudG9ocygocGhkciktPl9oZHJsZW5fcnN2ZF9mbGFncykgJiBUQ1BfRkxBR1MpCisKKyNkZWZpbmUgVENQSF9PRkZTRVRfU0VUKHBoZHIsIG9mZnNldCkgKHBoZHIpLT5faGRybGVuX3JzdmRfZmxhZ3MgPSBodG9ucygoKG9mZnNldCkgPDwgOCkgfCBUQ1BIX0ZMQUdTKHBoZHIpKQorI2RlZmluZSBUQ1BIX0hEUkxFTl9TRVQocGhkciwgbGVuKSAocGhkciktPl9oZHJsZW5fcnN2ZF9mbGFncyA9IGh0b25zKCgobGVuKSA8PCAxMikgfCBUQ1BIX0ZMQUdTKHBoZHIpKQorI2RlZmluZSBUQ1BIX0ZMQUdTX1NFVChwaGRyLCBmbGFncykgKHBoZHIpLT5faGRybGVuX3JzdmRfZmxhZ3MgPSAoKChwaGRyKS0+X2hkcmxlbl9yc3ZkX2ZsYWdzICYgUFBfSFRPTlMoKHUxNl90KSh+KHUxNl90KShUQ1BfRkxBR1MpKSkpIHwgaHRvbnMoZmxhZ3MpKQorI2RlZmluZSBUQ1BIX0hEUkxFTl9GTEFHU19TRVQocGhkciwgbGVuLCBmbGFncykgKHBoZHIpLT5faGRybGVuX3JzdmRfZmxhZ3MgPSBodG9ucygoKGxlbikgPDwgMTIpIHwgKGZsYWdzKSkKKworI2RlZmluZSBUQ1BIX1NFVF9GTEFHKHBoZHIsIGZsYWdzICkgKHBoZHIpLT5faGRybGVuX3JzdmRfZmxhZ3MgPSAoKHBoZHIpLT5faGRybGVuX3JzdmRfZmxhZ3MgfCBodG9ucyhmbGFncykpCisjZGVmaW5lIFRDUEhfVU5TRVRfRkxBRyhwaGRyLCBmbGFncykgKHBoZHIpLT5faGRybGVuX3JzdmRfZmxhZ3MgPSBodG9ucyhudG9ocygocGhkciktPl9oZHJsZW5fcnN2ZF9mbGFncykgfCAoVENQSF9GTEFHUyhwaGRyKSAmIH4oZmxhZ3MpKSApCisKKyNkZWZpbmUgVENQX1RDUExFTihzZWcpICgoc2VnKS0+bGVuICsgKChUQ1BIX0ZMQUdTKChzZWcpLT50Y3BoZHIpICYgKFRDUF9GSU4gfCBUQ1BfU1lOKSkgIT0gMCkpCisKKy8qKiBGbGFncyB1c2VkIG9uIGlucHV0IHByb2Nlc3NpbmcsIG5vdCBvbiBwY2ItPmZsYWdzCisqLworI2RlZmluZSBURl9SRVNFVCAgICAgKHU4X3QpMHgwOFUgICAvKiBDb25uZWN0aW9uIHdhcyByZXNldC4gKi8KKyNkZWZpbmUgVEZfQ0xPU0VEICAgICh1OF90KTB4MTBVICAgLyogQ29ubmVjdGlvbiB3YXMgc3VjZXNzZnVsbHkgY2xvc2VkLiAqLworI2RlZmluZSBURl9HT1RfRklOICAgKHU4X3QpMHgyMFUgICAvKiBDb25uZWN0aW9uIHdhcyBjbG9zZWQgYnkgdGhlIHJlbW90ZSBlbmQuICovCisKKworI2lmIExXSVBfRVZFTlRfQVBJCisKKyNkZWZpbmUgVENQX0VWRU5UX0FDQ0VQVChwY2IsZXJyLHJldCkgICAgcmV0ID0gbHdpcF90Y3BfZXZlbnQoKHBjYiktPmNhbGxiYWNrX2FyZywgKHBjYiksXAorICAgICAgICAgICAgICAgIExXSVBfRVZFTlRfQUNDRVBULCBOVUxMLCAwLCBlcnIpCisjZGVmaW5lIFRDUF9FVkVOVF9TRU5UKHBjYixzcGFjZSxyZXQpIHJldCA9IGx3aXBfdGNwX2V2ZW50KChwY2IpLT5jYWxsYmFja19hcmcsIChwY2IpLFwKKyAgICAgICAgICAgICAgICAgICBMV0lQX0VWRU5UX1NFTlQsIE5VTEwsIHNwYWNlLCBFUlJfT0spCisjZGVmaW5lIFRDUF9FVkVOVF9SRUNWKHBjYixwLGVycixyZXQpIHJldCA9IGx3aXBfdGNwX2V2ZW50KChwY2IpLT5jYWxsYmFja19hcmcsIChwY2IpLFwKKyAgICAgICAgICAgICAgICBMV0lQX0VWRU5UX1JFQ1YsIChwKSwgMCwgKGVycikpCisjZGVmaW5lIFRDUF9FVkVOVF9DTE9TRUQocGNiLHJldCkgcmV0ID0gbHdpcF90Y3BfZXZlbnQoKHBjYiktPmNhbGxiYWNrX2FyZywgKHBjYiksXAorICAgICAgICAgICAgICAgIExXSVBfRVZFTlRfUkVDViwgTlVMTCwgMCwgRVJSX09LKQorI2RlZmluZSBUQ1BfRVZFTlRfQ09OTkVDVEVEKHBjYixlcnIscmV0KSByZXQgPSBsd2lwX3RjcF9ldmVudCgocGNiKS0+Y2FsbGJhY2tfYXJnLCAocGNiKSxcCisgICAgICAgICAgICAgICAgTFdJUF9FVkVOVF9DT05ORUNURUQsIE5VTEwsIDAsIChlcnIpKQorI2RlZmluZSBUQ1BfRVZFTlRfUE9MTChwY2IscmV0KSAgICAgICByZXQgPSBsd2lwX3RjcF9ldmVudCgocGNiKS0+Y2FsbGJhY2tfYXJnLCAocGNiKSxcCisgICAgICAgICAgICAgICAgTFdJUF9FVkVOVF9QT0xMLCBOVUxMLCAwLCBFUlJfT0spCisjZGVmaW5lIFRDUF9FVkVOVF9FUlIoZXJyZixhcmcsZXJyKSAgbHdpcF90Y3BfZXZlbnQoKGFyZyksIE5VTEwsIFwKKyAgICAgICAgICAgICAgICBMV0lQX0VWRU5UX0VSUiwgTlVMTCwgMCwgKGVycikpCisKKyNlbHNlIC8qIExXSVBfRVZFTlRfQVBJICovCisKKyNkZWZpbmUgVENQX0VWRU5UX0FDQ0VQVChwY2IsZXJyLHJldCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigocGNiKS0+YWNjZXB0ICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChyZXQpID0gKHBjYiktPmFjY2VwdCgocGNiKS0+Y2FsbGJhY2tfYXJnLChwY2IpLChlcnIpKTsgIFwKKyAgICBlbHNlIChyZXQpID0gRVJSX0FSRzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQ1BfRVZFTlRfU0VOVChwY2Isc3BhY2UscmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChwY2IpLT5zZW50ICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHJldCkgPSAocGNiKS0+c2VudCgocGNiKS0+Y2FsbGJhY2tfYXJnLChwY2IpLChzcGFjZSkpOyAgXAorICAgIGVsc2UgKHJldCkgPSBFUlJfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRDUF9FVkVOVF9SRUNWKHBjYixwLGVycixyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKHBjYiktPnJlY3YgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAocmV0KSA9IChwY2IpLT5yZWN2KChwY2IpLT5jYWxsYmFja19hcmcsKHBjYiksKHApLChlcnIpKTtcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAocmV0KSA9IHRjcF9yZWN2X251bGwoTlVMTCwgKHBjYiksIChwKSwgKGVycikpOyAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVENQX0VWRU5UX0NMT1NFRChwY2IscmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKChwY2IpLT5yZWN2ICE9IE5VTEwpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChyZXQpID0gKHBjYiktPnJlY3YoKHBjYiktPmNhbGxiYWNrX2FyZywocGNiKSxOVUxMLEVSUl9PSyk7XAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAocmV0KSA9IEVSUl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRDUF9FVkVOVF9DT05ORUNURUQocGNiLGVycixyZXQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChwY2IpLT5jb25uZWN0ZWQgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAocmV0KSA9IChwY2IpLT5jb25uZWN0ZWQoKHBjYiktPmNhbGxiYWNrX2FyZywocGNiKSwoZXJyKSk7IFwKKyAgICBlbHNlIChyZXQpID0gRVJSX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRDUF9FVkVOVF9QT0xMKHBjYixyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKHBjYiktPnBvbGwgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAocmV0KSA9IChwY2IpLT5wb2xsKChwY2IpLT5jYWxsYmFja19hcmcsKHBjYikpOyAgICAgICAgICBcCisgICAgZWxzZSAocmV0KSA9IEVSUl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVENQX0VWRU5UX0VSUihlcnJmLGFyZyxlcnIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoZXJyZikgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChlcnJmKSgoYXJnKSwoZXJyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIExXSVBfRVZFTlRfQVBJICovCisKKy8qKiBFbmFibGVkIGV4dHJhLWNoZWNrIGZvciBUQ1BfT1ZFUlNJWkUgaWYgTFdJUF9ERUJVRyBpcyBlbmFibGVkICovCisjaWYgVENQX09WRVJTSVpFICYmIGRlZmluZWQoTFdJUF9ERUJVRykKKyNkZWZpbmUgVENQX09WRVJTSVpFX0RCR0NIRUNLIDEKKyNlbHNlCisjZGVmaW5lIFRDUF9PVkVSU0laRV9EQkdDSEVDSyAwCisjZW5kaWYKKworLyoqIERvbid0IGdlbmVyYXRlIGNoZWNrc3VtIG9uIGNvcHkgaWYgQ0hFQ0tTVU1fR0VOX1RDUCBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBUQ1BfQ0hFQ0tTVU1fT05fQ09QWSAgKExXSVBfQ0hFQ0tTVU1fT05fQ09QWSAmJiBDSEVDS1NVTV9HRU5fVENQKQorCisvKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgVENQIHNlZ21lbnQgb24gdGhlIHVuc2VudCwgdW5hY2tlZCBhbmQgb29zZXEgcXVldWVzICovCitzdHJ1Y3QgdGNwX3NlZyB7CisgIHN0cnVjdCB0Y3Bfc2VnICpuZXh0OyAgICAvKiB1c2VkIHdoZW4gcHV0dGluZyBzZWdlbWVudHMgb24gYSBxdWV1ZSAqLworICBzdHJ1Y3QgcGJ1ZiAqcDsgICAgICAgICAgLyogYnVmZmVyIGNvbnRhaW5pbmcgZGF0YSArIFRDUCBoZWFkZXIgKi8KKyAgdTE2X3QgbGVuOyAgICAgICAgICAgICAgIC8qIHRoZSBUQ1AgbGVuZ3RoIG9mIHRoaXMgc2VnbWVudCAqLworI2lmIFRDUF9PVkVSU0laRV9EQkdDSEVDSworICB1MTZfdCBvdmVyc2l6ZV9sZWZ0OyAgICAgLyogRXh0cmEgYnl0ZXMgYXZhaWxhYmxlIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBidWYgaW4gdW5zZW50ICh1c2VkIGZvciBhc3NlcnRpbmcgdnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BfcGNiLnVuc2VudF9vdmVyc2l6ZWQgb25seSkgKi8KKyNlbmRpZiAvKiBUQ1BfT1ZFUlNJWkVfREJHQ0hFQ0sgKi8gCisjaWYgVENQX0NIRUNLU1VNX09OX0NPUFkKKyAgdTE2X3QgY2hrc3VtOworICB1OF90ICBjaGtzdW1fc3dhcHBlZDsKKyNlbmRpZiAvKiBUQ1BfQ0hFQ0tTVU1fT05fQ09QWSAqLworICB1OF90ICBmbGFnczsKKyNkZWZpbmUgVEZfU0VHX09QVFNfTVNTICAgICAgICAgKHU4X3QpMHgwMVUgLyogSW5jbHVkZSBNU1Mgb3B0aW9uLiAqLworI2RlZmluZSBURl9TRUdfT1BUU19UUyAgICAgICAgICAodThfdCkweDAyVSAvKiBJbmNsdWRlIHRpbWVzdGFtcCBvcHRpb24uICovCisjZGVmaW5lIFRGX1NFR19EQVRBX0NIRUNLU1VNTUVEICh1OF90KTB4MDRVIC8qIEFMTCBkYXRhIChub3QgdGhlIGhlYWRlcikgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1tZWQgaW50byAnY2hrc3VtJyAqLworICBzdHJ1Y3QgdGNwX2hkciAqdGNwaGRyOyAgLyogdGhlIFRDUCBoZWFkZXIgKi8KK307CisKKyNkZWZpbmUgTFdJUF9UQ1BfT1BUX0xFTkdUSChmbGFncykgICAgICAgICAgICAgIFwKKyAgKGZsYWdzICYgVEZfU0VHX09QVFNfTVNTID8gNCAgOiAwKSArICAgICAgICAgIFwKKyAgKGZsYWdzICYgVEZfU0VHX09QVFNfVFMgID8gMTIgOiAwKQorCisvKiogVGhpcyByZXR1cm5zIGEgVENQIGhlYWRlciBvcHRpb24gZm9yIE1TUyBpbiBhbiB1MzJfdCAqLworI2RlZmluZSBUQ1BfQlVJTERfTVNTX09QVElPTih4KSAoeCkgPSBQUF9IVE9OTCgoKHUzMl90KTIgPDwgMjQpIHwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMl90KTQgPDwgMTYpIHwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdClUQ1BfTVNTIC8gMjU2KSA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRDUF9NU1MgJiAyNTUpKQorCisvKiBHbG9iYWwgdmFyaWFibGVzOiAqLworZXh0ZXJuIHN0cnVjdCB0Y3BfcGNiICp0Y3BfaW5wdXRfcGNiOworZXh0ZXJuIHUzMl90IHRjcF90aWNrczsKKworLyogVGhlIFRDUCBQQ0IgbGlzdHMuICovCit1bmlvbiB0Y3BfbGlzdGVuX3BjYnNfdCB7IC8qIExpc3Qgb2YgYWxsIFRDUCBQQ0JzIGluIExJU1RFTiBzdGF0ZS4gKi8KKyAgc3RydWN0IHRjcF9wY2JfbGlzdGVuICpsaXN0ZW5fcGNiczsgCisgIHN0cnVjdCB0Y3BfcGNiICpwY2JzOworfTsKK2V4dGVybiBzdHJ1Y3QgdGNwX3BjYiAqdGNwX2JvdW5kX3BjYnM7CitleHRlcm4gdW5pb24gdGNwX2xpc3Rlbl9wY2JzX3QgdGNwX2xpc3Rlbl9wY2JzOworZXh0ZXJuIHN0cnVjdCB0Y3BfcGNiICp0Y3BfYWN0aXZlX3BjYnM7ICAvKiBMaXN0IG9mIGFsbCBUQ1AgUENCcyB0aGF0IGFyZSBpbiBhCisgICAgICAgICAgICAgIHN0YXRlIGluIHdoaWNoIHRoZXkgYWNjZXB0IG9yIHNlbmQKKyAgICAgICAgICAgICAgZGF0YS4gKi8KK2V4dGVybiBzdHJ1Y3QgdGNwX3BjYiAqdGNwX3R3X3BjYnM7ICAgICAgLyogTGlzdCBvZiBhbGwgVENQIFBDQnMgaW4gVElNRS1XQUlULiAqLworCitleHRlcm4gc3RydWN0IHRjcF9wY2IgKnRjcF90bXBfcGNiOyAgICAgIC8qIE9ubHkgdXNlZCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UuICovCisKKy8qIEF4aW9tcyBhYm91dCB0aGUgYWJvdmUgbGlzdHM6ICAgCisgICAxKSBFdmVyeSBUQ1AgUENCIHRoYXQgaXMgbm90IENMT1NFRCBpcyBpbiBvbmUgb2YgdGhlIGxpc3RzLgorICAgMikgQSBQQ0IgaXMgb25seSBpbiBvbmUgb2YgdGhlIGxpc3RzLgorICAgMykgQWxsIFBDQnMgaW4gdGhlIHRjcF9saXN0ZW5fcGNicyBsaXN0IGlzIGluIExJU1RFTiBzdGF0ZS4KKyAgIDQpIEFsbCBQQ0JzIGluIHRoZSB0Y3BfdHdfcGNicyBsaXN0IGlzIGluIFRJTUUtV0FJVCBzdGF0ZS4KKyovCisvKiBEZWZpbmUgdHdvIG1hY3JvcywgVENQX1JFRyBhbmQgVENQX1JNViB0aGF0IHJlZ2lzdGVycyBhIFRDUCBQQ0IKKyAgIHdpdGggYSBQQ0IgbGlzdCBvciByZW1vdmVzIGEgUENCIGZyb20gYSBsaXN0LCByZXNwZWN0aXZlbHkuICovCisjaWZuZGVmIFRDUF9ERUJVR19QQ0JfTElTVFMKKyNkZWZpbmUgVENQX0RFQlVHX1BDQl9MSVNUUyAwCisjZW5kaWYKKyNpZiBUQ1BfREVCVUdfUENCX0xJU1RTCisjZGVmaW5lIFRDUF9SRUcocGNicywgbnBjYikgZG8ge1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiVENQX1JFRyAlcCBsb2NhbCBwb3J0ICVkXG4iLCAobnBjYiksIChucGNiKS0+bG9jYWxfcG9ydCkpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHRjcF90bXBfcGNiID0gKihwY2JzKTsgXAorICAgICAgICAgIHRjcF90bXBfcGNiICE9IE5VTEw7IFwKKyAgICAgICAgdGNwX3RtcF9wY2IgPSB0Y3BfdG1wX3BjYi0+bmV4dCkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExXSVBfQVNTRVJUKCJUQ1BfUkVHOiBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIsIHRjcF90bXBfcGNiICE9IChucGNiKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMV0lQX0FTU0VSVCgiVENQX1JFRzogcGNiLT5zdGF0ZSAhPSBDTE9TRUQiLCAoKHBjYnMpID09ICZ0Y3BfYm91bmRfcGNicykgfHwgKChucGNiKS0+c3RhdGUgIT0gQ0xPU0VEKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnBjYiktPm5leHQgPSAqKHBjYnMpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFdJUF9BU1NFUlQoIlRDUF9SRUc6IG5wY2ItPm5leHQgIT0gbnBjYiIsIChucGNiKS0+bmV4dCAhPSAobnBjYikpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwY2JzKSA9IChucGNiKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExXSVBfQVNTRVJUKCJUQ1BfUk1WOiB0Y3BfcGNicyBzYW5lIiwgdGNwX3BjYnNfc2FuZSgpKTsgXAorICAgICAgICAgICAgICB0Y3BfdGltZXJfbmVlZGVkKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZGVmaW5lIFRDUF9STVYocGNicywgbnBjYikgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFdJUF9BU1NFUlQoIlRDUF9STVY6IHBjYnMgIT0gTlVMTCIsICoocGNicykgIT0gTlVMTCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMV0lQX0RFQlVHRihUQ1BfREVCVUcsICgiVENQX1JNVjogcmVtb3ZpbmcgJXAgZnJvbSAlcFxuIiwgKG5wY2IpLCAqKHBjYnMpKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigqKHBjYnMpID09IChucGNiKSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwY2JzKSA9ICgqcGNicyktPm5leHQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZm9yKHRjcF90bXBfcGNiID0gKihwY2JzKTsgdGNwX3RtcF9wY2IgIT0gTlVMTDsgdGNwX3RtcF9wY2IgPSB0Y3BfdG1wX3BjYi0+bmV4dCkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGNwX3RtcF9wY2ItPm5leHQgPT0gKG5wY2IpKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BfdG1wX3BjYi0+bmV4dCA9IChucGNiKS0+bmV4dDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5wY2IpLT5uZXh0ID0gTlVMTDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExXSVBfQVNTRVJUKCJUQ1BfUk1WOiB0Y3BfcGNicyBzYW5lIiwgdGNwX3BjYnNfc2FuZSgpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExXSVBfREVCVUdGKFRDUF9ERUJVRywgKCJUQ1BfUk1WOiByZW1vdmVkICVwIGZyb20gJXBcbiIsIChucGNiKSwgKihwY2JzKSkpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisjZWxzZSAvKiBMV0lQX0RFQlVHICovCisKKyNkZWZpbmUgVENQX1JFRyhwY2JzLCBucGNiKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobnBjYiktPm5leHQgPSAqcGNiczsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKHBjYnMpID0gKG5wY2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y3BfdGltZXJfbmVlZGVkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQ1BfUk1WKHBjYnMsIG5wY2IpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCoocGNicykgPT0gKG5wY2IpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCoocGNicykpID0gKCpwY2JzKS0+bmV4dDsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yKHRjcF90bXBfcGNiID0gKnBjYnM7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRjcF90bXBfcGNiICE9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRjcF90bXBfcGNiID0gdGNwX3RtcF9wY2ItPm5leHQpIHsgICAgICAgXAorICAgICAgICBpZih0Y3BfdG1wX3BjYi0+bmV4dCA9PSAobnBjYikpIHsgICAgICAgICAgXAorICAgICAgICAgIHRjcF90bXBfcGNiLT5uZXh0ID0gKG5wY2IpLT5uZXh0OyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChucGNiKS0+bmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDApCisKKyNlbmRpZiAvKiBMV0lQX0RFQlVHICovCisKKworLyogSW50ZXJuYWwgZnVuY3Rpb25zOiAqLworc3RydWN0IHRjcF9wY2IgKnRjcF9wY2JfY29weShzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKK3ZvaWQgdGNwX3BjYl9wdXJnZShzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKK3ZvaWQgdGNwX3BjYl9yZW1vdmUoc3RydWN0IHRjcF9wY2IgKipwY2JsaXN0LCBzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKKwordm9pZCB0Y3Bfc2Vnc19mcmVlKHN0cnVjdCB0Y3Bfc2VnICpzZWcpOwordm9pZCB0Y3Bfc2VnX2ZyZWUoc3RydWN0IHRjcF9zZWcgKnNlZyk7CitzdHJ1Y3QgdGNwX3NlZyAqdGNwX3NlZ19jb3B5KHN0cnVjdCB0Y3Bfc2VnICpzZWcpOworCisjZGVmaW5lIHRjcF9hY2socGNiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKHBjYiktPmZsYWdzICYgVEZfQUNLX0RFTEFZKSB7ICAgICAgICAgICAgICBcCisgICAgICAocGNiKS0+ZmxhZ3MgJj0gflRGX0FDS19ERUxBWTsgICAgICAgICAgICAgICBcCisgICAgICAocGNiKS0+ZmxhZ3MgfD0gVEZfQUNLX05PVzsgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAocGNiKS0+ZmxhZ3MgfD0gVEZfQUNLX0RFTEFZOyAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdGNwX2Fja19ub3cocGNiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocGNiKS0+ZmxhZ3MgfD0gVEZfQUNLX05PVzsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworZXJyX3QgdGNwX3NlbmRfZmluKHN0cnVjdCB0Y3BfcGNiICpwY2IpOworZXJyX3QgdGNwX2VucXVldWVfZmxhZ3Moc3RydWN0IHRjcF9wY2IgKnBjYiwgdThfdCBmbGFncyk7CisKK3ZvaWQgdGNwX3JleG1pdF9zZWcoc3RydWN0IHRjcF9wY2IgKnBjYiwgc3RydWN0IHRjcF9zZWcgKnNlZyk7CisKK3ZvaWQgdGNwX3JzdCh1MzJfdCBzZXFubywgdTMyX3QgYWNrbm8sCisgICAgICAgaXBfYWRkcl90ICpsb2NhbF9pcCwgaXBfYWRkcl90ICpyZW1vdGVfaXAsCisgICAgICAgdTE2X3QgbG9jYWxfcG9ydCwgdTE2X3QgcmVtb3RlX3BvcnQpOworCit1MzJfdCB0Y3BfbmV4dF9pc3Modm9pZCk7CisKK3ZvaWQgdGNwX2tlZXBhbGl2ZShzdHJ1Y3QgdGNwX3BjYiAqcGNiKTsKK3ZvaWQgdGNwX3plcm9fd2luZG93X3Byb2JlKHN0cnVjdCB0Y3BfcGNiICpwY2IpOworCisjaWYgVENQX0NBTENVTEFURV9FRkZfU0VORF9NU1MKK3UxNl90IHRjcF9lZmZfc2VuZF9tc3ModTE2X3Qgc2VuZG1zcywgaXBfYWRkcl90ICphZGRyKTsKKyNlbmRpZiAvKiBUQ1BfQ0FMQ1VMQVRFX0VGRl9TRU5EX01TUyAqLworCisjaWYgTFdJUF9DQUxMQkFDS19BUEkKK2Vycl90IHRjcF9yZWN2X251bGwodm9pZCAqYXJnLCBzdHJ1Y3QgdGNwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwgZXJyX3QgZXJyKTsKKyNlbmRpZiAvKiBMV0lQX0NBTExCQUNLX0FQSSAqLworCisjaWYgVENQX0RFQlVHIHx8IFRDUF9JTlBVVF9ERUJVRyB8fCBUQ1BfT1VUUFVUX0RFQlVHCit2b2lkIHRjcF9kZWJ1Z19wcmludChzdHJ1Y3QgdGNwX2hkciAqdGNwaGRyKTsKK3ZvaWQgdGNwX2RlYnVnX3ByaW50X2ZsYWdzKHU4X3QgZmxhZ3MpOwordm9pZCB0Y3BfZGVidWdfcHJpbnRfc3RhdGUoZW51bSB0Y3Bfc3RhdGUgcyk7Cit2b2lkIHRjcF9kZWJ1Z19wcmludF9wY2JzKHZvaWQpOworczE2X3QgdGNwX3BjYnNfc2FuZSh2b2lkKTsKKyNlbHNlCisjICBkZWZpbmUgdGNwX2RlYnVnX3ByaW50KHRjcGhkcikKKyMgIGRlZmluZSB0Y3BfZGVidWdfcHJpbnRfZmxhZ3MoZmxhZ3MpCisjICBkZWZpbmUgdGNwX2RlYnVnX3ByaW50X3N0YXRlKHMpCisjICBkZWZpbmUgdGNwX2RlYnVnX3ByaW50X3BjYnMoKQorIyAgZGVmaW5lIHRjcF9wY2JzX3NhbmUoKSAxCisjZW5kaWYgLyogVENQX0RFQlVHICovCisKKy8qKiBFeHRlcm5hbCBmdW5jdGlvbiAoaW1wbGVtZW50ZWQgaW4gdGltZXJzLmMpLCBjYWxsZWQgd2hlbiBUQ1AgZGV0ZWN0cworICogdGhhdCBhIHRpbWVyIGlzIG5lZWRlZCAoaS5lLiBhY3RpdmUtIG9yIHRpbWUtd2FpdC1wY2IgZm91bmQpLiAqLwordm9pZCB0Y3BfdGltZXJfbmVlZGVkKHZvaWQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBMV0lQX1RDUCAqLworCisjZW5kaWYgLyogX19MV0lQX1RDUF9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3RjcGlwLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC90Y3BpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NWJhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcC90Y3BpcC5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfVENQSVBfSF9fCisjZGVmaW5lIF9fTFdJUF9UQ1BJUF9IX18KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiAhTk9fU1lTIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9hcGlfbXNnLmgiCisjaW5jbHVkZSAibHdpcC9uZXRpZmFwaS5oIgorI2luY2x1ZGUgImx3aXAvcGJ1Zi5oIgorI2luY2x1ZGUgImx3aXAvYXBpLmgiCisjaW5jbHVkZSAibHdpcC9zeXMuaCIKKyNpbmNsdWRlICJsd2lwL3RpbWVycy5oIgorI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogRGVmaW5lIHRoaXMgdG8gc29tZXRoaW5nIHRoYXQgdHJpZ2dlcnMgYSB3YXRjaGRvZy4gVGhpcyBpcyBjYWxsZWQgZnJvbQorICogdGNwaXBfdGhyZWFkIGFmdGVyIHByb2Nlc3NpbmcgYSBtZXNzYWdlLiAqLworI2lmbmRlZiBMV0lQX1RDUElQX1RIUkVBRF9BTElWRQorI2RlZmluZSBMV0lQX1RDUElQX1RIUkVBRF9BTElWRSgpCisjZW5kaWYKKworI2lmIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HCisvKiogVGhlIGdsb2JhbCBzZW1hcGhvcmUgdG8gbG9jayB0aGUgc3RhY2suICovCitleHRlcm4gc3lzX211dGV4X3QgbG9ja190Y3BpcF9jb3JlOworI2RlZmluZSBMT0NLX1RDUElQX0NPUkUoKSAgICAgc3lzX211dGV4X2xvY2soJmxvY2tfdGNwaXBfY29yZSkKKyNkZWZpbmUgVU5MT0NLX1RDUElQX0NPUkUoKSAgIHN5c19tdXRleF91bmxvY2soJmxvY2tfdGNwaXBfY29yZSkKKyNkZWZpbmUgVENQSVBfQVBJTVNHKG0pICAgICAgIHRjcGlwX2FwaW1zZ19sb2NrKG0pCisjZGVmaW5lIFRDUElQX0FQSU1TR19BQ0sobSkKKyNkZWZpbmUgVENQSVBfTkVUSUZBUEkobSkgICAgIHRjcGlwX25ldGlmYXBpX2xvY2sobSkKKyNkZWZpbmUgVENQSVBfTkVUSUZBUElfQUNLKG0pCisjZWxzZSAvKiBMV0lQX1RDUElQX0NPUkVfTE9DS0lORyAqLworI2RlZmluZSBMT0NLX1RDUElQX0NPUkUoKQorI2RlZmluZSBVTkxPQ0tfVENQSVBfQ09SRSgpCisjZGVmaW5lIFRDUElQX0FQSU1TRyhtKSAgICAgICB0Y3BpcF9hcGltc2cobSkKKyNkZWZpbmUgVENQSVBfQVBJTVNHX0FDSyhtKSAgIHN5c19zZW1fc2lnbmFsKCZtLT5jb25uLT5vcF9jb21wbGV0ZWQpCisjZGVmaW5lIFRDUElQX05FVElGQVBJKG0pICAgICB0Y3BpcF9uZXRpZmFwaShtKQorI2RlZmluZSBUQ1BJUF9ORVRJRkFQSV9BQ0sobSkgc3lzX3NlbV9zaWduYWwoJm0tPnNlbSkKKyNlbmRpZiAvKiBMV0lQX1RDUElQX0NPUkVfTE9DS0lORyAqLworCisvKiogRnVuY3Rpb24gcHJvdG90eXBlIGZvciB0aGUgaW5pdF9kb25lIGZ1bmN0aW9uIHBhc3NlZCB0byB0Y3BpcF9pbml0ICovCit0eXBlZGVmIHZvaWQgKCp0Y3BpcF9pbml0X2RvbmVfZm4pKHZvaWQgKmFyZyk7CisvKiogRnVuY3Rpb24gcHJvdG90eXBlIGZvciBmdW5jdGlvbnMgcGFzc2VkIHRvIHRjcGlwX2NhbGxiYWNrKCkgKi8KK3R5cGVkZWYgdm9pZCAoKnRjcGlwX2NhbGxiYWNrX2ZuKSh2b2lkICpjdHgpOworCit2b2lkIHRjcGlwX2luaXQodGNwaXBfaW5pdF9kb25lX2ZuIHRjcGlwX2luaXRfZG9uZSwgdm9pZCAqYXJnKTsKKworI2lmIExXSVBfTkVUQ09OTgorZXJyX3QgdGNwaXBfYXBpbXNnKHN0cnVjdCBhcGlfbXNnICphcGltc2cpOworI2lmIExXSVBfVENQSVBfQ09SRV9MT0NLSU5HCitlcnJfdCB0Y3BpcF9hcGltc2dfbG9jayhzdHJ1Y3QgYXBpX21zZyAqYXBpbXNnKTsKKyNlbmRpZiAvKiBMV0lQX1RDUElQX0NPUkVfTE9DS0lORyAqLworI2VuZGlmIC8qIExXSVBfTkVUQ09OTiAqLworCitlcnJfdCB0Y3BpcF9pbnB1dChzdHJ1Y3QgcGJ1ZiAqcCwgc3RydWN0IG5ldGlmICppbnApOworCisjaWYgTFdJUF9ORVRJRl9BUEkKK2Vycl90IHRjcGlwX25ldGlmYXBpKHN0cnVjdCBuZXRpZmFwaV9tc2cgKm5ldGlmYXBpbXNnKTsKKyNpZiBMV0lQX1RDUElQX0NPUkVfTE9DS0lORworZXJyX3QgdGNwaXBfbmV0aWZhcGlfbG9jayhzdHJ1Y3QgbmV0aWZhcGlfbXNnICpuZXRpZmFwaW1zZyk7CisjZW5kaWYgLyogTFdJUF9UQ1BJUF9DT1JFX0xPQ0tJTkcgKi8KKyNlbmRpZiAvKiBMV0lQX05FVElGX0FQSSAqLworCitlcnJfdCB0Y3BpcF9jYWxsYmFja193aXRoX2Jsb2NrKHRjcGlwX2NhbGxiYWNrX2ZuIGZ1bmN0aW9uLCB2b2lkICpjdHgsIHU4X3QgYmxvY2spOworI2RlZmluZSB0Y3BpcF9jYWxsYmFjayhmLCBjdHgpICAgICAgICAgICAgICB0Y3BpcF9jYWxsYmFja193aXRoX2Jsb2NrKGYsIGN0eCwgMSkKKworLyogZnJlZSBwYnVmcyBvciBoZWFwIG1lbW9yeSBmcm9tIGFub3RoZXIgY29udGV4dCB3aXRob3V0IGJsb2NraW5nICovCitlcnJfdCBwYnVmX2ZyZWVfY2FsbGJhY2soc3RydWN0IHBidWYgKnApOworZXJyX3QgbWVtX2ZyZWVfY2FsbGJhY2sodm9pZCAqbSk7CisKKyNpZiBMV0lQX1RDUElQX1RJTUVPVVQKK2Vycl90IHRjcGlwX3RpbWVvdXQodTMyX3QgbXNlY3MsIHN5c190aW1lb3V0X2hhbmRsZXIgaCwgdm9pZCAqYXJnKTsKK2Vycl90IHRjcGlwX3VudGltZW91dChzeXNfdGltZW91dF9oYW5kbGVyIGgsIHZvaWQgKmFyZyk7CisjZW5kaWYgLyogTFdJUF9UQ1BJUF9USU1FT1VUICovCisKK2VudW0gdGNwaXBfbXNnX3R5cGUgeworI2lmIExXSVBfTkVUQ09OTgorICBUQ1BJUF9NU0dfQVBJLAorI2VuZGlmIC8qIExXSVBfTkVUQ09OTiAqLworICBUQ1BJUF9NU0dfSU5QS1QsCisjaWYgTFdJUF9ORVRJRl9BUEkKKyAgVENQSVBfTVNHX05FVElGQVBJLAorI2VuZGlmIC8qIExXSVBfTkVUSUZfQVBJICovCisjaWYgTFdJUF9UQ1BJUF9USU1FT1VUCisgIFRDUElQX01TR19USU1FT1VULAorICBUQ1BJUF9NU0dfVU5USU1FT1VULAorI2VuZGlmIC8qIExXSVBfVENQSVBfVElNRU9VVCAqLworICBUQ1BJUF9NU0dfQ0FMTEJBQ0sKK307CisKK3N0cnVjdCB0Y3BpcF9tc2cgeworICBlbnVtIHRjcGlwX21zZ190eXBlIHR5cGU7CisgIHN5c19zZW1fdCAqc2VtOworICB1bmlvbiB7CisjaWYgTFdJUF9ORVRDT05OCisgICAgc3RydWN0IGFwaV9tc2cgKmFwaW1zZzsKKyNlbmRpZiAvKiBMV0lQX05FVENPTk4gKi8KKyNpZiBMV0lQX05FVElGX0FQSQorICAgIHN0cnVjdCBuZXRpZmFwaV9tc2cgKm5ldGlmYXBpbXNnOworI2VuZGlmIC8qIExXSVBfTkVUSUZfQVBJICovCisgICAgc3RydWN0IHsKKyAgICAgIHN0cnVjdCBwYnVmICpwOworICAgICAgc3RydWN0IG5ldGlmICpuZXRpZjsKKyAgICB9IGlucDsKKyAgICBzdHJ1Y3QgeworICAgICAgdGNwaXBfY2FsbGJhY2tfZm4gZnVuY3Rpb247CisgICAgICB2b2lkICpjdHg7CisgICAgfSBjYjsKKyNpZiBMV0lQX1RDUElQX1RJTUVPVVQKKyAgICBzdHJ1Y3QgeworICAgICAgdTMyX3QgbXNlY3M7CisgICAgICBzeXNfdGltZW91dF9oYW5kbGVyIGg7CisgICAgICB2b2lkICphcmc7CisgICAgfSB0bW87CisjZW5kaWYgLyogTFdJUF9UQ1BJUF9USU1FT1VUICovCisgIH0gbXNnOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFOT19TWVMgKi8KKworI2VuZGlmIC8qIF9fTFdJUF9UQ1BJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3RpbWVycy5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvdGltZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5MmI0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3RpbWVycy5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKiAgICAgICAgIFNpbW9uIEdvbGRzY2htaWR0CisgKgorICovCisjaWZuZGVmIF9fTFdJUF9USU1FUlNfSF9fCisjZGVmaW5lIF9fTFdJUF9USU1FUlNfSF9fCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisvKiBUaW1lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2hlbiBOT19TWVM9PTEgYW5kIE5PX1NZU19OT19USU1FUlM9PTEgKi8KKyNkZWZpbmUgTFdJUF9USU1FUlMgKCFOT19TWVMgfHwgKE5PX1NZUyAmJiAhTk9fU1lTX05PX1RJTUVSUykpCisKKyNpZiBMV0lQX1RJTUVSUworCisjaW5jbHVkZSAibHdpcC9lcnIuaCIKKyNpbmNsdWRlICJsd2lwL3N5cy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgTFdJUF9ERUJVR19USU1FUk5BTUVTCisjaWZkZWYgTFdJUF9ERUJVRworI2RlZmluZSBMV0lQX0RFQlVHX1RJTUVSTkFNRVMgU1lTX0RFQlVHCisjZWxzZSAvKiBMV0lQX0RFQlVHICovCisjZGVmaW5lIExXSVBfREVCVUdfVElNRVJOQU1FUyAwCisjZW5kaWYgLyogTFdJUF9ERUJVRyovCisjZW5kaWYKKworLyoqIEZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgYSB0aW1lb3V0IGNhbGxiYWNrIGZ1bmN0aW9uLiBSZWdpc3RlciBzdWNoIGEgZnVuY3Rpb24KKyAqIHVzaW5nIHN5c190aW1lb3V0KCkuCisgKgorICogQHBhcmFtIGFyZyBBZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uIC0gc2V0IHVwIGJ5IHN5c190aW1lb3V0KCkKKyAqLwordHlwZWRlZiB2b2lkICgqIHN5c190aW1lb3V0X2hhbmRsZXIpKHZvaWQgKmFyZyk7CisKK3N0cnVjdCBzeXNfdGltZW8geworICBzdHJ1Y3Qgc3lzX3RpbWVvICpuZXh0OworICB1MzJfdCB0aW1lOworICBzeXNfdGltZW91dF9oYW5kbGVyIGg7CisgIHZvaWQgKmFyZzsKKyNpZiBMV0lQX0RFQlVHX1RJTUVSTkFNRVMKKyAgY29uc3QgY2hhciogaGFuZGxlcl9uYW1lOworI2VuZGlmIC8qIExXSVBfREVCVUdfVElNRVJOQU1FUyAqLworfTsKKwordm9pZCBzeXNfdGltZW91dHNfaW5pdCh2b2lkKTsKKworI2lmIExXSVBfREVCVUdfVElNRVJOQU1FUwordm9pZCBzeXNfdGltZW91dF9kZWJ1Zyh1MzJfdCBtc2Vjcywgc3lzX3RpbWVvdXRfaGFuZGxlciBoYW5kbGVyLCB2b2lkICphcmcsIGNvbnN0IGNoYXIqIGhhbmRsZXJfbmFtZSk7CisjZGVmaW5lIHN5c190aW1lb3V0KG1zZWNzLCBoYW5kbGVyLCBhcmcpIHN5c190aW1lb3V0X2RlYnVnKG1zZWNzLCBoYW5kbGVyLCBhcmcsICNoYW5kbGVyKQorI2Vsc2UgLyogTFdJUF9ERUJVR19USU1FUk5BTUVTICovCit2b2lkIHN5c190aW1lb3V0KHUzMl90IG1zZWNzLCBzeXNfdGltZW91dF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmFyZyk7CisjZW5kaWYgLyogTFdJUF9ERUJVR19USU1FUk5BTUVTICovCisKK3ZvaWQgc3lzX3VudGltZW91dChzeXNfdGltZW91dF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmFyZyk7CisjaWYgTk9fU1lTCit2b2lkIHN5c19jaGVja190aW1lb3V0cyh2b2lkKTsKK3ZvaWQgc3lzX3Jlc3RhcnRfdGltZW91dHModm9pZCk7CisjZWxzZSAvKiBOT19TWVMgKi8KK3ZvaWQgc3lzX3RpbWVvdXRzX21ib3hfZmV0Y2goc3lzX21ib3hfdCAqbWJveCwgdm9pZCAqKm1zZyk7CisjZW5kaWYgLyogTk9fU1lTICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIExXSVBfVElNRVJTICovCisjZW5kaWYgLyogX19MV0lQX1RJTUVSU19IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3VkcC5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXAvdWRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4YzFiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9sd2lwL3VkcC5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICogCisgKiBBdXRob3I6IEFkYW0gRHVua2VscyA8YWRhbUBzaWNzLnNlPgorICoKKyAqLworI2lmbmRlZiBfX0xXSVBfVURQX0hfXworI2RlZmluZSBfX0xXSVBfVURQX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfVURQIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibHdpcC9wYnVmLmgiCisjaW5jbHVkZSAibHdpcC9uZXRpZi5oIgorI2luY2x1ZGUgImx3aXAvaXBfYWRkci5oIgorI2luY2x1ZGUgImx3aXAvaXAuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFVEUF9ITEVOIDgKKworLyogRmllbGRzIGFyZSAob2YgY291cnNlKSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Jwc3RydWN0LmgiCisjZW5kaWYKK1BBQ0tfU1RSVUNUX0JFR0lOCitzdHJ1Y3QgdWRwX2hkciB7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IHNyYyk7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IGRlc3QpOyAgLyogc3JjL2Rlc3QgVURQIHBvcnRzICovCisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IGxlbik7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IGNoa3N1bSk7Cit9IFBBQ0tfU1RSVUNUX1NUUlVDVDsKK1BBQ0tfU1RSVUNUX0VORAorI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9lcHN0cnVjdC5oIgorI2VuZGlmCisKKyNkZWZpbmUgVURQX0ZMQUdTX05PQ0hLU1VNICAgICAgIDB4MDFVCisjZGVmaW5lIFVEUF9GTEFHU19VRFBMSVRFICAgICAgICAweDAyVQorI2RlZmluZSBVRFBfRkxBR1NfQ09OTkVDVEVEICAgICAgMHgwNFUKKyNkZWZpbmUgVURQX0ZMQUdTX01VTFRJQ0FTVF9MT09QIDB4MDhVCisKK3N0cnVjdCB1ZHBfcGNiOworCisvKiogRnVuY3Rpb24gcHJvdG90eXBlIGZvciB1ZHAgcGNiIHJlY2VpdmUgY2FsbGJhY2sgZnVuY3Rpb25zCisgKiBhZGRyIGFuZCBwb3J0IGFyZSBpbiBzYW1lIGJ5dGUgb3JkZXIgYXMgaW4gdGhlIHBjYgorICogVGhlIGNhbGxiYWNrIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBwYnVmCisgKiBpZiBpdCdzIG5vdCB1c2VkIGFueSBtb3JlLgorICoKKyAqIEFUVEVOVElPTjogQmUgYXdhcmUgdGhhdCAnYWRkcicgcG9pbnRzIGludG8gdGhlIHBidWYgJ3AnIHNvIGZyZWVpbmcgdGhpcyBwYnVmCisgKiAgICAgICAgICAgIG1ha2VzICdhZGRyJyBpbnZhbGlkLCB0b28uCisgKgorICogQHBhcmFtIGFyZyB1c2VyIHN1cHBsaWVkIGFyZ3VtZW50ICh1ZHBfcGNiLnJlY3ZfYXJnKQorICogQHBhcmFtIHBjYiB0aGUgdWRwX3BjYiB3aGljaCByZWNlaXZlZCBkYXRhCisgKiBAcGFyYW0gcCB0aGUgcGFja2V0IGJ1ZmZlciB0aGF0IHdhcyByZWNlaXZlZAorICogQHBhcmFtIGFkZHIgdGhlIHJlbW90ZSBJUCBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQKKyAqIEBwYXJhbSBwb3J0IHRoZSByZW1vdGUgcG9ydCBmcm9tIHdoaWNoIHRoZSBwYWNrZXQgd2FzIHJlY2VpdmVkCisgKi8KK3R5cGVkZWYgdm9pZCAoKnVkcF9yZWN2X2ZuKSh2b2lkICphcmcsIHN0cnVjdCB1ZHBfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwLAorICAgIGlwX2FkZHJfdCAqYWRkciwgdTE2X3QgcG9ydCk7CisKKworc3RydWN0IHVkcF9wY2IgeworLyogQ29tbW9uIG1lbWJlcnMgb2YgYWxsIFBDQiB0eXBlcyAqLworICBJUF9QQ0I7CisKKy8qIFByb3RvY29sIHNwZWNpZmljIFBDQiBtZW1iZXJzICovCisKKyAgc3RydWN0IHVkcF9wY2IgKm5leHQ7CisKKyAgdThfdCBmbGFnczsKKyAgLyoqIHBvcnRzIGFyZSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KKyAgdTE2X3QgbG9jYWxfcG9ydCwgcmVtb3RlX3BvcnQ7CisKKyNpZiBMV0lQX0lHTVAKKyAgLyoqIG91dGdvaW5nIG5ldHdvcmsgaW50ZXJmYWNlIGZvciBtdWx0aWNhc3QgcGFja2V0cyAqLworICBpcF9hZGRyX3QgbXVsdGljYXN0X2lwOworI2VuZGlmIC8qIExXSVBfSUdNUCAqLworCisjaWYgTFdJUF9VRFBMSVRFCisgIC8qKiB1c2VkIGZvciBVRFBfTElURSBvbmx5ICovCisgIHUxNl90IGNoa3N1bV9sZW5fcngsIGNoa3N1bV9sZW5fdHg7CisjZW5kaWYgLyogTFdJUF9VRFBMSVRFICovCisKKyAgLyoqIHJlY2VpdmUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgdWRwX3JlY3ZfZm4gcmVjdjsKKyAgLyoqIHVzZXItc3VwcGxpZWQgYXJndW1lbnQgZm9yIHRoZSByZWN2IGNhbGxiYWNrICovCisgIHZvaWQgKnJlY3ZfYXJnOyAgCit9OworLyogdWRwX3BjYnMgZXhwb3J0IGZvciBleGVybmFsIHJlZmVyZW5jZSAoZS5nLiBTTk1QIGFnZW50KSAqLworZXh0ZXJuIHN0cnVjdCB1ZHBfcGNiICp1ZHBfcGNiczsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaXMgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSB0byB0aGUKKyAgIFVEUCBjb2RlLiAqLworc3RydWN0IHVkcF9wY2IgKiB1ZHBfbmV3ICAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgICAgIHVkcF9yZW1vdmUgICAgIChzdHJ1Y3QgdWRwX3BjYiAqcGNiKTsKK2Vycl90ICAgICAgICAgICAgdWRwX2JpbmQgICAgICAgKHN0cnVjdCB1ZHBfcGNiICpwY2IsIGlwX2FkZHJfdCAqaXBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgcG9ydCk7CitlcnJfdCAgICAgICAgICAgIHVkcF9jb25uZWN0ICAgIChzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBpcF9hZGRyX3QgKmlwYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IHBvcnQpOwordm9pZCAgICAgICAgICAgICB1ZHBfZGlzY29ubmVjdCAoc3RydWN0IHVkcF9wY2IgKnBjYik7Cit2b2lkICAgICAgICAgICAgIHVkcF9yZWN2ICAgICAgIChzdHJ1Y3QgdWRwX3BjYiAqcGNiLCB1ZHBfcmVjdl9mbiByZWN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVjdl9hcmcpOworZXJyX3QgICAgICAgICAgICB1ZHBfc2VuZHRvX2lmICAoc3RydWN0IHVkcF9wY2IgKnBjYiwgc3RydWN0IHBidWYgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcF9hZGRyX3QgKmRzdF9pcCwgdTE2X3QgZHN0X3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKK2Vycl90ICAgICAgICAgICAgdWRwX3NlbmR0byAgICAgKHN0cnVjdCB1ZHBfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBfYWRkcl90ICpkc3RfaXAsIHUxNl90IGRzdF9wb3J0KTsKK2Vycl90ICAgICAgICAgICAgdWRwX3NlbmQgICAgICAgKHN0cnVjdCB1ZHBfcGNiICpwY2IsIHN0cnVjdCBwYnVmICpwKTsKKworI2lmIExXSVBfQ0hFQ0tTVU1fT05fQ09QWQorZXJyX3QgICAgICAgICAgICB1ZHBfc2VuZHRvX2lmX2Noa3N1bShzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqZHN0X2lwLCB1MTZfdCBkc3RfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRpZiAqbmV0aWYsIHU4X3QgaGF2ZV9jaGtzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBjaGtzdW0pOworZXJyX3QgICAgICAgICAgICB1ZHBfc2VuZHRvX2Noa3N1bShzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwX2FkZHJfdCAqZHN0X2lwLCB1MTZfdCBkc3RfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgaGF2ZV9jaGtzdW0sIHUxNl90IGNoa3N1bSk7CitlcnJfdCAgICAgICAgICAgIHVkcF9zZW5kX2Noa3N1bShzdHJ1Y3QgdWRwX3BjYiAqcGNiLCBzdHJ1Y3QgcGJ1ZiAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgaGF2ZV9jaGtzdW0sIHUxNl90IGNoa3N1bSk7CisjZW5kaWYgLyogTFdJUF9DSEVDS1NVTV9PTl9DT1BZICovCisKKyNkZWZpbmUgICAgICAgICAgdWRwX2ZsYWdzKHBjYikgKChwY2IpLT5mbGFncykKKyNkZWZpbmUgICAgICAgICAgdWRwX3NldGZsYWdzKHBjYiwgZikgICgocGNiKS0+ZmxhZ3MgPSAoZikpCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB0aGUgbG93ZXIgbGF5ZXIgaW50ZXJmYWNlIHRvIFVEUC4gKi8KK3ZvaWQgICAgICAgICAgICAgdWRwX2lucHV0ICAgICAgKHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKmlucCk7CisKKyNkZWZpbmUgdWRwX2luaXQoKSAvKiBDb21wYXRpYmlsaXR5IGRlZmluZSwgbm90IGluaXQgbmVlZGVkLiAqLworCisjaWYgVURQX0RFQlVHCit2b2lkIHVkcF9kZWJ1Z19wcmludChzdHJ1Y3QgdWRwX2hkciAqdWRwaGRyKTsKKyNlbHNlCisjZGVmaW5lIHVkcF9kZWJ1Z19wcmludCh1ZHBoZHIpCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIExXSVBfVURQICovCisKKyNlbmRpZiAvKiBfX0xXSVBfVURQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXBvcHRzLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbHdpcG9wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQzOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL2x3aXBvcHRzLmgKQEAgLTAsMCArMSw3MyBAQAorI2lmbmRlZiBfX0xXSVBPUFRTX0hfXworI2RlZmluZSBfX0xXSVBPUFRTX0hfXworCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNkZWZpbmUgU1lTX0xJR0hUV0VJR0hUX1BST1QJMQorI2RlZmluZSBMV0lQX05FVElGX0FQSQkJMQorI2RlZmluZSBMV0lQX0ROUwkJMQorI2RlZmluZSBMV0lQX1VEUAkJMQorI2RlZmluZSBMV0lQX1RDUAkJMQorI2RlZmluZSBMV0lQX1NPX1JDVlRJTUVPCTEKKyNkZWZpbmUgTFdJUF9JQ01QCQkxCisKKyNkZWZpbmUgVENQSVBfTUJPWF9TSVpFICAgICAgICAgCTUxMgorI2RlZmluZSBUQ1BJUF9USFJFQURfUFJJTwkJLTEwCisjZGVmaW5lIFRDUElQX1RIUkVBRF9TVEFDS1NJWkUJCTMyNzY4CisKKyNkZWZpbmUgREVGQVVMVF9VRFBfUkVDVk1CT1hfU0laRQkxNgorI2RlZmluZSBERUZBVUxUX1RDUF9SRUNWTUJPWF9TSVpFCTEyOAorI2RlZmluZSBERUZBVUxUX0FDQ0VQVE1CT1hfU0laRQkJNAorCisjZGVmaW5lIExXSVBfU09DS0VUCQkJMAorCisjZGVmaW5lIE1FTV9MSUJDX01BTExPQwkJCTAKKyNkZWZpbmUgTUVNUF9NRU1fTUFMTE9DCQkJMAorCisjZGVmaW5lIE1FTVBfTlVNX1RDUF9QQ0IJCTY0CisjZGVmaW5lIE1FTVBfTlVNX1RDUF9TRUcJCTI1NgorI2RlZmluZSBNRU1QX05VTV9SRUFTU0RBVEEJCTMyCisjZGVmaW5lIE1FTVBfTlVNX1NZU19USU1FT1VUCQk4CisjZGVmaW5lIE1FTVBfTlVNX05FVENPTk4JCTY0CisjZGVmaW5lIE1FTVBfTlVNX1RDUElQX01TR19BUEkJCTY0CisjZGVmaW5lIE1FTVBfTlVNX1RDUElQX01TR19JTlBLVAk2NAorI2RlZmluZSBNRU1QX05VTV9ORVRCVUYJCQkxMjgKKyNkZWZpbmUgUEJVRl9QT09MX1NJWkUJCQkyNTYKKyNkZWZpbmUgQVJQX1RBQkxFX1NJWkUJCQkxNgorI2RlZmluZSBJUF9SRUFTU19NQVhfUEJVRlMJCTY0CisjZGVmaW5lIElQX1JFQVNTX01BWEFHRQkJCTEwCisKKyNkZWZpbmUgTFdJUF9ORVRJRl9BUEkJCTEKKworI2RlZmluZSBMV0lQX0ROUwkJMQorI2RlZmluZSBETlNfVEFCTEVfU0laRQkJMTYKKyNkZWZpbmUgRE5TX01BWF9TRVJWRVJTCQk0CisjZGVmaW5lIFRDUF9NU1MJCQkxNDYwCisjZGVmaW5lIFRDUF9XTkQJCQk2NDAwMAorI2RlZmluZSBUQ1BfU05EX0JVRgkJKDQqVENQX01TUykKKyNkZWZpbmUgTFdJUF9UQ1BfVElNRVNUQU1QUwkxCisKKy8qCisgKiBJQU5BIHNheXMgdG8gdXNlIGR5bmFtaWMgcG9ydCBudW1iZXJzIGFib3ZlIDQ5MTUyLCBidXQgc29tZQorICogdmVyeSBoaWdoIG51bWJlcnMgYXJlIGtub3duIHRvIGJlIChhYil1c2VkLCB0b28uCisgKi8KKyNkZWZpbmUgVENQX0xPQ0FMX1BPUlRfUkFOR0VfU1RBUlQgNDkxNTIKKyNkZWZpbmUgVENQX0xPQ0FMX1BPUlRfUkFOR0VfRU5EICAgNTczNDMKKyNkZWZpbmUgVURQX0xPQ0FMX1BPUlRfUkFOR0VfU1RBUlQgNDkxNTIKKyNkZWZpbmUgVURQX0xPQ0FMX1BPUlRfUkFOR0VfRU5EICAgNTczNDMKKworI2RlZmluZSBFVEhBUlBfVFJVU1RfSVBfTUFDCTAKKyAKKyNkZWZpbmUgTFdJUF9TVEFUUwkJMQorI2RlZmluZSBMV0lQX1NUQVRTX0RJU1BMQVkJMQorCisjZGVmaW5lIExXSVBfUExBVEZPUk1fQllURVNXQVAJMQorI2RlZmluZSBMV0lQX1BMQVRGT1JNX0hUT05TKHgpCWJzd2FwXzE2KHgpCisjZGVmaW5lIExXSVBfUExBVEZPUk1fSFRPTkwoeCkJYnN3YXBfMzIoeCkKKworI2RlZmluZSBMV0lQX1BSRUZJWF9CWVRFT1JERVJfRlVOQ1MJMAorI2RlZmluZSBMV0lQX0NPTVBBVF9NVVRFWAkxCisKK3ZvaWQgdW5kaWFycF90bXIodm9pZCk7CisjZW5kaWYgLyogX19MV0lQT1BUU19IX18gKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9uZXRpZi9ldGhhcnAuaCBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9uZXRpZi9ldGhhcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTE1NzVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL25ldGlmL2V0aGFycC5oCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IExlb24gV29lc3RlbmJlcmcgPGxlb24ud29lc3RlbmJlcmdAYXhvbi50dj4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IEF4b24gRGlnaXRhbCBEZXNpZ24gQi5WLiwgVGhlIE5ldGhlcmxhbmRzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisKKyNpZm5kZWYgX19ORVRJRl9FVEhBUlBfSF9fCisjZGVmaW5lIF9fTkVUSUZfRVRIQVJQX0hfXworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfQVJQIHx8IExXSVBfRVRIRVJORVQgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpbmNsdWRlICJsd2lwL2lwX2FkZHIuaCIKKyNpbmNsdWRlICJsd2lwL25ldGlmLmgiCisjaW5jbHVkZSAibHdpcC9pcC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgRVRIQVJQX0hXQUREUl9MRU4KKyNkZWZpbmUgRVRIQVJQX0hXQUREUl9MRU4gICAgIDYKKyNlbmRpZgorCisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Jwc3RydWN0LmgiCisjZW5kaWYKK1BBQ0tfU1RSVUNUX0JFR0lOCitzdHJ1Y3QgZXRoX2FkZHIgeworICBQQUNLX1NUUlVDVF9GSUVMRCh1OF90IGFkZHJbRVRIQVJQX0hXQUREUl9MRU5dKTsKK30gUEFDS19TVFJVQ1RfU1RSVUNUOworUEFDS19TVFJVQ1RfRU5ECisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Vwc3RydWN0LmgiCisjZW5kaWYKKworI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9icHN0cnVjdC5oIgorI2VuZGlmCitQQUNLX1NUUlVDVF9CRUdJTgorLyoqIEV0aGVybmV0IGhlYWRlciAqLworc3RydWN0IGV0aF9oZHIgeworI2lmIEVUSF9QQURfU0laRQorICBQQUNLX1NUUlVDVF9GSUVMRCh1OF90IHBhZGRpbmdbRVRIX1BBRF9TSVpFXSk7CisjZW5kaWYKKyAgUEFDS19TVFJVQ1RfRklFTEQoc3RydWN0IGV0aF9hZGRyIGRlc3QpOworICBQQUNLX1NUUlVDVF9GSUVMRChzdHJ1Y3QgZXRoX2FkZHIgc3JjKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3QgdHlwZSk7Cit9IFBBQ0tfU1RSVUNUX1NUUlVDVDsKK1BBQ0tfU1RSVUNUX0VORAorI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9lcHN0cnVjdC5oIgorI2VuZGlmCisKKyNkZWZpbmUgU0laRU9GX0VUSF9IRFIgKDE0ICsgRVRIX1BBRF9TSVpFKQorCisjaWYgRVRIQVJQX1NVUFBPUlRfVkxBTgorCisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Jwc3RydWN0LmgiCisjZW5kaWYKK1BBQ0tfU1RSVUNUX0JFR0lOCisvKiogVkxBTiBoZWFkZXIgaW5zZXJ0ZWQgYmV0d2VlbiBldGhlcm5ldCBoZWFkZXIgYW5kIHBheWxvYWQKKyAqIGlmICd0eXBlJyBpbiBldGhlcm5ldCBoZWFkZXIgaXMgRVRIVFlQRV9WTEFOLgorICogU2VlIElFRUU4MDIuUSAqLworc3RydWN0IGV0aF92bGFuX2hkciB7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IHByaW9fdmlkKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3QgdHBpZCk7Cit9IFBBQ0tfU1RSVUNUX1NUUlVDVDsKK1BBQ0tfU1RSVUNUX0VORAorI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9lcHN0cnVjdC5oIgorI2VuZGlmCisKKyNkZWZpbmUgU0laRU9GX1ZMQU5fSERSIDQKKyNkZWZpbmUgVkxBTl9JRCh2bGFuX2hkcikgKGh0b25zKCh2bGFuX2hkciktPnByaW9fdmlkKSAmIDB4RkZGKQorCisjZW5kaWYgLyogRVRIQVJQX1NVUFBPUlRfVkxBTiAqLworCisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Jwc3RydWN0LmgiCisjZW5kaWYKK1BBQ0tfU1RSVUNUX0JFR0lOCisvKiogdGhlIEFSUCBtZXNzYWdlLCBzZWUgUkZDIDgyNiAoIlBhY2tldCBmb3JtYXQiKSAqLworc3RydWN0IGV0aGFycF9oZHIgeworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBod3R5cGUpOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBwcm90byk7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHU4X3QgIGh3bGVuKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCAgcHJvdG9sZW4pOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBvcGNvZGUpOworICBQQUNLX1NUUlVDVF9GSUVMRChzdHJ1Y3QgZXRoX2FkZHIgc2h3YWRkcik7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHN0cnVjdCBpcF9hZGRyMiBzaXBhZGRyKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQoc3RydWN0IGV0aF9hZGRyIGRod2FkZHIpOworICBQQUNLX1NUUlVDVF9GSUVMRChzdHJ1Y3QgaXBfYWRkcjIgZGlwYWRkcik7Cit9IFBBQ0tfU1RSVUNUX1NUUlVDVDsKK1BBQ0tfU1RSVUNUX0VORAorI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9lcHN0cnVjdC5oIgorI2VuZGlmCisKKyNkZWZpbmUgU0laRU9GX0VUSEFSUF9IRFIgMjgKKyNkZWZpbmUgU0laRU9GX0VUSEFSUF9QQUNLRVQgKFNJWkVPRl9FVEhfSERSICsgU0laRU9GX0VUSEFSUF9IRFIpCisKKy8qKiA1IHNlY29uZHMgcGVyaW9kICovCisjZGVmaW5lIEFSUF9UTVJfSU5URVJWQUwgNTAwMAorCisjZGVmaW5lIEVUSFRZUEVfQVJQICAgICAgIDB4MDgwNlUKKyNkZWZpbmUgRVRIVFlQRV9JUCAgICAgICAgMHgwODAwVQorI2RlZmluZSBFVEhUWVBFX1ZMQU4gICAgICAweDgxMDBVCisjZGVmaW5lIEVUSFRZUEVfUFBQT0VESVNDIDB4ODg2M1UgIC8qIFBQUCBPdmVyIEV0aGVybmV0IERpc2NvdmVyeSBTdGFnZSAqLworI2RlZmluZSBFVEhUWVBFX1BQUE9FICAgICAweDg4NjRVICAvKiBQUFAgT3ZlciBFdGhlcm5ldCBTZXNzaW9uIFN0YWdlICovCisKKy8qKiBNRU1DUFktbGlrZSBtYWNybyB0byBjb3B5IHRvL2Zyb20gc3RydWN0IGV0aF9hZGRyJ3MgdGhhdCBhcmUgbG9jYWwgdmFyaWFibGVzCisgKiBvciBrbm93biB0byBiZSAzMi1iaXQgYWxpZ25lZCB3aXRoaW4gdGhlIHByb3RvY29sIGhlYWRlci4gKi8KKyNpZm5kZWYgRVRIQUREUjMyX0NPUFkKKyNkZWZpbmUgRVRIQUREUjMyX0NPUFkoc3JjLCBkc3QpICBTTUVNQ1BZKHNyYywgZHN0LCBFVEhBUlBfSFdBRERSX0xFTikKKyNlbmRpZgorCisvKiogTUVNQ1BZLWxpa2UgbWFjcm8gdG8gY29weSB0by9mcm9tIHN0cnVjdCBldGhfYWRkcidzIHRoYXQgYXJlIG5vIGxvY2FsCisgKiB2YXJpYWJsZXMgYW5kIGtub3duIHRvIGJlIDE2LWJpdCBhbGlnbmVkIHdpdGhpbiB0aGUgcHJvdG9jb2wgaGVhZGVyLiAqLworI2lmbmRlZiBFVEhBRERSMTZfQ09QWQorI2RlZmluZSBFVEhBRERSMTZfQ09QWShzcmMsIGRzdCkgIFNNRU1DUFkoc3JjLCBkc3QsIEVUSEFSUF9IV0FERFJfTEVOKQorI2VuZGlmCisKKyNpZiBMV0lQX0FSUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworLyoqIEFSUCBtZXNzYWdlIHR5cGVzIChvcGNvZGVzKSAqLworI2RlZmluZSBBUlBfUkVRVUVTVCAxCisjZGVmaW5lIEFSUF9SRVBMWSAgIDIKKworLyoqIERlZmluZSB0aGlzIHRvIDEgYW5kIGRlZmluZSBMV0lQX0FSUF9GSUxURVJfTkVUSUZfRk4ocGJ1ZiwgbmV0aWYsIHR5cGUpCisgKiB0byBhIGZpbHRlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNvcnJlY3QgbmV0aWYgd2hlbiB1c2luZyBtdWx0aXBsZQorICogbmV0aWZzIG9uIG9uZSBoYXJkd2FyZSBpbnRlcmZhY2Ugd2hlcmUgdGhlIG5ldGlmJ3MgbG93LWxldmVsIHJlY2VpdmUKKyAqIHJvdXRpbmUgY2Fubm90IGRlY2lkZSBmb3IgdGhlIGNvcnJlY3QgbmV0aWYgKGUuZy4gd2hlbiBtYXBwaW5nIG11bHRpcGxlCisgKiBJUCBhZGRyZXNzZXMgdG8gb25lIGhhcmR3YXJlIGludGVyZmFjZSkuCisgKi8KKyNpZm5kZWYgTFdJUF9BUlBfRklMVEVSX05FVElGCisjZGVmaW5lIExXSVBfQVJQX0ZJTFRFUl9ORVRJRiAwCisjZW5kaWYKKworI2lmIEFSUF9RVUVVRUlORworLyoqIHN0cnVjdCBmb3IgcXVldWVpbmcgb3V0Z29pbmcgcGFja2V0cyBmb3IgdW5rbm93biBhZGRyZXNzCisgICogZGVmaW5lZCBoZXJlIHRvIGJlIGFjY2Vzc2VkIGJ5IG1lbXAuaAorICAqLworc3RydWN0IGV0aGFycF9xX2VudHJ5IHsKKyAgc3RydWN0IGV0aGFycF9xX2VudHJ5ICpuZXh0OworICBzdHJ1Y3QgcGJ1ZiAqcDsKK307CisjZW5kaWYgLyogQVJQX1FVRVVFSU5HICovCisKKyNkZWZpbmUgZXRoYXJwX2luaXQoKSAvKiBDb21wYXRpYmlsaXR5IGRlZmluZSwgbm90IGluaXQgbmVlZGVkLiAqLwordm9pZCBldGhhcnBfdG1yKHZvaWQpOworczhfdCBldGhhcnBfZmluZF9hZGRyKHN0cnVjdCBuZXRpZiAqbmV0aWYsIGlwX2FkZHJfdCAqaXBhZGRyLAorICAgICAgICAgc3RydWN0IGV0aF9hZGRyICoqZXRoX3JldCwgaXBfYWRkcl90ICoqaXBfcmV0KTsKK2Vycl90IGV0aGFycF9vdXRwdXQoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IHBidWYgKnEsIGlwX2FkZHJfdCAqaXBhZGRyKTsKK2Vycl90IGV0aGFycF9xdWVyeShzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKmlwYWRkciwgc3RydWN0IHBidWYgKnEpOworZXJyX3QgZXRoYXJwX3JlcXVlc3Qoc3RydWN0IG5ldGlmICpuZXRpZiwgaXBfYWRkcl90ICppcGFkZHIpOworLyoqIEZvciBFdGhlcm5ldCBuZXR3b3JrIGludGVyZmFjZXMsIHdlIG1pZ2h0IHdhbnQgdG8gc2VuZCAiZ3JhdHVpdG91cyBBUlAiOworICogIHRoaXMgaXMgYW4gQVJQIHBhY2tldCBzZW50IGJ5IGEgbm9kZSBpbiBvcmRlciB0byBzcG9udGFuZW91c2x5IGNhdXNlIG90aGVyCisgKiAgbm9kZXMgdG8gdXBkYXRlIGFuIGVudHJ5IGluIHRoZWlyIEFSUCBjYWNoZS4KKyAqICBGcm9tIFJGQyAzMjIwICJJUCBNb2JpbGl0eSBTdXBwb3J0IGZvciBJUHY0IiBzZWN0aW9uIDQuNi4gKi8KKyNkZWZpbmUgZXRoYXJwX2dyYXR1aXRvdXMobmV0aWYpIGV0aGFycF9yZXF1ZXN0KChuZXRpZiksICYobmV0aWYpLT5pcF9hZGRyKQorCisjaWYgRVRIQVJQX1NVUFBPUlRfU1RBVElDX0VOVFJJRVMKK2Vycl90IGV0aGFycF9hZGRfc3RhdGljX2VudHJ5KGlwX2FkZHJfdCAqaXBhZGRyLCBzdHJ1Y3QgZXRoX2FkZHIgKmV0aGFkZHIpOworZXJyX3QgZXRoYXJwX3JlbW92ZV9zdGF0aWNfZW50cnkoaXBfYWRkcl90ICppcGFkZHIpOworI2VuZGlmIC8qIEVUSEFSUF9TVVBQT1JUX1NUQVRJQ19FTlRSSUVTICovCisKKyNpZiBMV0lQX0FVVE9JUAorZXJyX3QgZXRoYXJwX3JhdyhzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBjb25zdCBzdHJ1Y3QgZXRoX2FkZHIgKmV0aHNyY19hZGRyLAorICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZXRoX2FkZHIgKmV0aGRzdF9hZGRyLAorICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZXRoX2FkZHIgKmh3c3JjX2FkZHIsIGNvbnN0IGlwX2FkZHJfdCAqaXBzcmNfYWRkciwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGV0aF9hZGRyICpod2RzdF9hZGRyLCBjb25zdCBpcF9hZGRyX3QgKmlwZHN0X2FkZHIsCisgICAgICAgICAgICAgICAgIGNvbnN0IHUxNl90IG9wY29kZSk7CisjZW5kaWYgLyogTFdJUF9BVVRPSVAgKi8KKworI2VuZGlmIC8qIExXSVBfQVJQICovCisKK2Vycl90IGV0aGVybmV0X2lucHV0KHN0cnVjdCBwYnVmICpwLCBzdHJ1Y3QgbmV0aWYgKm5ldGlmKTsKKworI2RlZmluZSBldGhfYWRkcl9jbXAoYWRkcjEsIGFkZHIyKSAobWVtY21wKChhZGRyMSktPmFkZHIsIChhZGRyMiktPmFkZHIsIEVUSEFSUF9IV0FERFJfTEVOKSA9PSAwKQorCitleHRlcm4gY29uc3Qgc3RydWN0IGV0aF9hZGRyIGV0aGJyb2FkY2FzdCwgZXRoemVybzsKKworI2VuZGlmIC8qIExXSVBfQVJQIHx8IExXSVBfRVRIRVJORVQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTkVUSUZfQVJQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9pbmNsdWRlL25ldGlmL3BwcF9vZS5oIGIvY29yZS9sd2lwL3NyYy9pbmNsdWRlL25ldGlmL3BwcF9vZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxY2RmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbmV0aWYvcHBwX29lLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwcHBfb2UuaCAtIFBQUCBPdmVyIEV0aGVybmV0IGltcGxlbWVudGF0aW9uIGZvciBsd0lQLgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDYgYnkgTWFyYyBCb3VjaGVyLCBTZXJ2aWNlcyBJbmZvcm1hdGlxdWVzIChNQlNJKSBpbmMuCisqCisqIFRoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLAorKiBhbmQgbGljZW5zZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkCisqIHRoYXQgZXhpc3RpbmcgY29weXJpZ2h0IG5vdGljZXMgYXJlIHJldGFpbmVkIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcworKiBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBhcmUgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55IAorKiBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwgbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMgcmVxdWlyZWQKKyogZm9yIGFueSBvZiB0aGUgYXV0aG9yaXplZCB1c2VzLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT05UUklCVVRPUlMgKkFTIElTKiBBTkQgQU5ZIEVYUFJFU1MgT1IKKyogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAKKyogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSRVZJU0lPTiBISVNUT1JZCisqCisqIDA2LTAxLTAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorKiAgIFBvcnRlZCB0byBsd0lQLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKiBiYXNlZCBvbiBOZXRCU0Q6IGlmX3BwcG9lLmMsdiAxLjY0IDIwMDYvMDEvMzEgMjM6NTA6MTUgbWFydGluIEV4cCAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgTmV0QlNEIEZvdW5kYXRpb24sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBUaGUgTmV0QlNEIEZvdW5kYXRpb24KKyAqIGJ5IE1hcnRpbiBIdXNlbWFubiA8bWFydGluQE5ldEJTRC5vcmc+LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgTmV0QlNECisgKiAgICAgICAgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIE5ldEJTRCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBQUFBfT0VfSAorI2RlZmluZSBQUFBfT0VfSAorCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIFBQUE9FX1NVUFBPUlQgPiAwCisKKyNpbmNsdWRlICJuZXRpZi9ldGhhcnAuaCIKKworI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9icHN0cnVjdC5oIgorI2VuZGlmCitQQUNLX1NUUlVDVF9CRUdJTgorc3RydWN0IHBwcG9laGRyIHsKKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCB2ZXJ0eXBlKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCBjb2RlKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodTE2X3Qgc2Vzc2lvbik7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IHBsZW4pOworfSBQQUNLX1NUUlVDVF9TVFJVQ1Q7CitQQUNLX1NUUlVDVF9FTkQKKyNpZmRlZiBQQUNLX1NUUlVDVF9VU0VfSU5DTFVERVMKKyMgIGluY2x1ZGUgImFyY2gvZXBzdHJ1Y3QuaCIKKyNlbmRpZgorCisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Jwc3RydWN0LmgiCisjZW5kaWYKK1BBQ0tfU1RSVUNUX0JFR0lOCitzdHJ1Y3QgcHBwb2V0YWcgeworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCB0YWcpOworICBQQUNLX1NUUlVDVF9GSUVMRCh1MTZfdCBsZW4pOworfSBQQUNLX1NUUlVDVF9TVFJVQ1Q7CitQQUNLX1NUUlVDVF9FTkQKKyNpZmRlZiBQQUNLX1NUUlVDVF9VU0VfSU5DTFVERVMKKyMgIGluY2x1ZGUgImFyY2gvZXBzdHJ1Y3QuaCIKKyNlbmRpZgorCisKKyNkZWZpbmUgUFBQT0VfU1RBVEVfSU5JVElBTCAgIDAKKyNkZWZpbmUgUFBQT0VfU1RBVEVfUEFESV9TRU5UIDEKKyNkZWZpbmUgUFBQT0VfU1RBVEVfUEFEUl9TRU5UIDIKKyNkZWZpbmUgUFBQT0VfU1RBVEVfU0VTU0lPTiAgIDMKKyNkZWZpbmUgUFBQT0VfU1RBVEVfQ0xPU0lORyAgIDQKKy8qIHBhc3NpdmUgKi8KKyNkZWZpbmUgUFBQT0VfU1RBVEVfUEFET19TRU5UIDEKKworI2RlZmluZSBQUFBPRV9IRUFERVJMRU4gICAgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZWhkcikKKyNkZWZpbmUgUFBQT0VfVkVSVFlQRSAgICAgICAgIDB4MTEgICAgLyogVkVSPTEsIFRZUEUgPSAxICovCisKKyNkZWZpbmUgUFBQT0VfVEFHX0VPTCAgICAgICAgIDB4MDAwMCAgLyogZW5kIG9mIGxpc3QgKi8KKyNkZWZpbmUgUFBQT0VfVEFHX1NOQU1FICAgICAgIDB4MDEwMSAgLyogc2VydmljZSBuYW1lICovCisjZGVmaW5lIFBQUE9FX1RBR19BQ05BTUUgICAgICAweDAxMDIgIC8qIGFjY2VzcyBjb25jZW50cmF0b3IgbmFtZSAqLworI2RlZmluZSBQUFBPRV9UQUdfSFVOSVFVRSAgICAgMHgwMTAzICAvKiBob3N0IHVuaXF1ZSAqLworI2RlZmluZSBQUFBPRV9UQUdfQUNDT09LSUUgICAgMHgwMTA0ICAvKiBBQyBjb29raWUgKi8KKyNkZWZpbmUgUFBQT0VfVEFHX1ZFTkRPUiAgICAgIDB4MDEwNSAgLyogdmVuZG9yIHNwZWNpZmljICovCisjZGVmaW5lIFBQUE9FX1RBR19SRUxBWVNJRCAgICAweDAxMTAgIC8qIHJlbGF5IHNlc3Npb24gaWQgKi8KKyNkZWZpbmUgUFBQT0VfVEFHX1NOQU1FX0VSUiAgIDB4MDIwMSAgLyogc2VydmljZSBuYW1lIGVycm9yICovCisjZGVmaW5lIFBQUE9FX1RBR19BQ1NZU19FUlIgICAweDAyMDIgIC8qIEFDIHN5c3RlbSBlcnJvciAqLworI2RlZmluZSBQUFBPRV9UQUdfR0VORVJJQ19FUlIgMHgwMjAzICAvKiBnZXJuZXJpYyBlcnJvciAqLworCisjZGVmaW5lIFBQUE9FX0NPREVfUEFESSAgICAgICAweDA5ICAgIC8qIEFjdGl2ZSBEaXNjb3ZlcnkgSW5pdGlhdGlvbiAqLworI2RlZmluZSBQUFBPRV9DT0RFX1BBRE8gICAgICAgMHgwNyAgICAvKiBBY3RpdmUgRGlzY292ZXJ5IE9mZmVyICovCisjZGVmaW5lIFBQUE9FX0NPREVfUEFEUiAgICAgICAweDE5ICAgIC8qIEFjdGl2ZSBEaXNjb3ZlcnkgUmVxdWVzdCAqLworI2RlZmluZSBQUFBPRV9DT0RFX1BBRFMgICAgICAgMHg2NSAgICAvKiBBY3RpdmUgRGlzY292ZXJ5IFNlc3Npb24gY29uZmlybWF0aW9uICovCisjZGVmaW5lIFBQUE9FX0NPREVfUEFEVCAgICAgICAweEE3ICAgIC8qIEFjdGl2ZSBEaXNjb3ZlcnkgVGVybWluYXRlICovCisKKyNpZm5kZWYgRVRIRVJNVFUKKyNkZWZpbmUgRVRIRVJNVFUgMTUwMAorI2VuZGlmCisKKy8qIHR3byBieXRlIFBQUCBwcm90b2NvbCBkaXNjcmltaW5hdG9yLCB0aGVuIElQIGRhdGEgKi8KKyNkZWZpbmUgUFBQT0VfTUFYTVRVICAgICAgICAgIChFVEhFUk1UVS1QUFBPRV9IRUFERVJMRU4tMikKKworI2lmbmRlZiBQUFBPRV9NQVhfQUNfQ09PS0lFX0xFTgorI2RlZmluZSBQUFBPRV9NQVhfQUNfQ09PS0lFX0xFTiAgIDY0CisjZW5kaWYKKworc3RydWN0IHBwcG9lX3NvZnRjIHsKKyAgc3RydWN0IHBwcG9lX3NvZnRjICpuZXh0OworICBzdHJ1Y3QgbmV0aWYgKnNjX2V0aGlmOyAgICAgIC8qIGV0aGVybmV0IGludGVyZmFjZSB3ZSBhcmUgdXNpbmcgKi8KKyAgaW50IHNjX3BkOyAgICAgICAgICAgICAgICAgICAvKiBwcHAgdW5pdCBudW1iZXIgKi8KKyAgdm9pZCAoKnNjX2xpbmtTdGF0dXNDQikoaW50IHBkLCBpbnQgdXApOworCisgIGludCBzY19zdGF0ZTsgICAgICAgICAgICAgICAgLyogZGlzY292ZXJ5IHBoYXNlIG9yIHNlc3Npb24gY29ubmVjdGVkICovCisgIHN0cnVjdCBldGhfYWRkciBzY19kZXN0OyAgICAgLyogaGFyZHdhcmUgYWRkcmVzcyBvZiBjb25jZW50cmF0b3IgKi8KKyAgdTE2X3Qgc2Nfc2Vzc2lvbjsgICAgICAgICAgICAvKiBQUFBvRSBzZXNzaW9uIGlkICovCisKKyNpZmRlZiBQUFBPRV9UT0RPCisgIGNoYXIgKnNjX3NlcnZpY2VfbmFtZTsgICAgICAgLyogaWYgIT0gTlVMTDogcmVxdWVzdGVkIG5hbWUgb2Ygc2VydmljZSAqLworICBjaGFyICpzY19jb25jZW50cmF0b3JfbmFtZTsgIC8qIGlmICE9IE5VTEw6IHJlcXVlc3RlZCBjb25jZW50cmF0b3IgaWQgKi8KKyNlbmRpZiAvKiBQUFBPRV9UT0RPICovCisgIHU4X3Qgc2NfYWNfY29va2llW1BQUE9FX01BWF9BQ19DT09LSUVfTEVOXTsgLyogY29udGVudCBvZiBBQyBjb29raWUgd2UgbXVzdCBlY2hvIGJhY2sgKi8KKyAgc2l6ZV90IHNjX2FjX2Nvb2tpZV9sZW47ICAgICAvKiBsZW5ndGggb2YgY29va2llIGRhdGEgKi8KKyNpZmRlZiBQUFBPRV9TRVJWRVIKKyAgdThfdCAqc2NfaHVuaXF1ZTsgICAgICAgICAgICAvKiBjb250ZW50IG9mIGhvc3QgdW5pcXVlIHdlIG11c3QgZWNobyBiYWNrICovCisgIHNpemVfdCBzY19odW5pcXVlX2xlbjsgICAgICAgLyogbGVuZ3RoIG9mIGhvc3QgdW5pcXVlICovCisjZW5kaWYKKyAgaW50IHNjX3BhZGlfcmV0cmllZDsgICAgICAgICAvKiBudW1iZXIgb2YgUEFESSByZXRyaWVzIGFscmVhZHkgZG9uZSAqLworICBpbnQgc2NfcGFkcl9yZXRyaWVkOyAgICAgICAgIC8qIG51bWJlciBvZiBQQURSIHJldHJpZXMgYWxyZWFkeSBkb25lICovCit9OworCisKKyNkZWZpbmUgcHBwb2VfaW5pdCgpIC8qIGNvbXBhdGliaWxpdHkgZGVmaW5lLCBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQgKi8KKworZXJyX3QgcHBwb2VfY3JlYXRlKHN0cnVjdCBuZXRpZiAqZXRoaWYsIGludCBwZCwgdm9pZCAoKmxpbmtTdGF0dXNDQikoaW50IHBkLCBpbnQgdXApLCBzdHJ1Y3QgcHBwb2Vfc29mdGMgKipzY3B0cik7CitlcnJfdCBwcHBvZV9kZXN0cm95KHN0cnVjdCBuZXRpZiAqaWZwKTsKKworaW50IHBwcG9lX2Nvbm5lY3Qoc3RydWN0IHBwcG9lX3NvZnRjICpzYyk7Cit2b2lkIHBwcG9lX2Rpc2Nvbm5lY3Qoc3RydWN0IHBwcG9lX3NvZnRjICpzYyk7CisKK3ZvaWQgcHBwb2VfZGlzY19pbnB1dChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBzdHJ1Y3QgcGJ1ZiAqcCk7Cit2b2lkIHBwcG9lX2RhdGFfaW5wdXQoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IHBidWYgKnApOworCitlcnJfdCBwcHBvZV94bWl0KHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2MsIHN0cnVjdCBwYnVmICpwYik7CisKKy8qKiB1c2VkIGluIHBwcC5jICovCisjZGVmaW5lIFBQUE9FX0hEUkxFTiAoc2l6ZW9mKHN0cnVjdCBldGhfaGRyKSArIFBQUE9FX0hFQURFUkxFTikKKworI2VuZGlmIC8qIFBQUE9FX1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIFBQUF9PRV9IICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbmV0aWYvc2xpcGlmLmggYi9jb3JlL2x3aXAvc3JjL2luY2x1ZGUvbmV0aWYvc2xpcGlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkMDNjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvaW5jbHVkZS9uZXRpZi9zbGlwaWYuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLCBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAorICogYXJlIG1ldDogCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCAKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIAorICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIAorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiAKKyAqIFNVQ0ggREFNQUdFLiAKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKiAKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKgorICovCisjaWZuZGVmIF9fTkVUSUZfU0xJUElGX0hfXworI2RlZmluZSBfX05FVElGX1NMSVBJRl9IX18KKworI2luY2x1ZGUgImx3aXAvbmV0aWYuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitlcnJfdCBzbGlwaWZfaW5pdChzdHJ1Y3QgbmV0aWYgKiBuZXRpZik7Cit2b2lkIHNsaXBpZl9wb2xsKHN0cnVjdCBuZXRpZiAqbmV0aWYpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorIAorI2VuZGlmIAorCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL0ZJTEVTIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9GSUxFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTlkYmYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9GSUxFUwpAQCAtMCwwICsxLDI5IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBnZW5lcmljIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBkcml2ZXJzIHRoYXQKK2RvIG5vdCBjb250YWluIGFueSBoYXJkd2FyZSBvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZS4gVGhlIGZpbGVzCithcmU6CisKK2V0aGFycC5jCisgICAgICAgICAgSW1wbGVtZW50cyB0aGUgQVJQIChBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wpIG92ZXIKKyAgICAgICAgICBFdGhlcm5ldC4gVGhlIGNvZGUgaW4gdGhpcyBmaWxlIHNob3VsZCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKKyAgICAgICAgICBFdGhlcm5ldCBkZXZpY2UgZHJpdmVycy4gTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGhhcyBiZWVuCisgICAgICAgICAgbGFyZ2VseSBtYWRlIEV0aGVybmV0IGluZGVwZW5kZW50IHNvIHlvdSBzaG91bGQgYmUgYWJsZSB0bworICAgICAgICAgIGFkYXB0IHRoaXMgZm9yIG90aGVyIGxpbmsgbGF5ZXJzIChzdWNoIGFzIEZpcmV3aXJlKS4KKworZXRoZXJuZXRpZi5jCisgICAgICAgICAgQW4gZXhhbXBsZSBvZiBob3cgYW4gRXRoZXJuZXQgZGV2aWNlIGRyaXZlciBjb3VsZCBsb29rLiBUaGlzCisgICAgICAgICAgZmlsZSBjYW4gYmUgdXNlZCBhcyBhICJza2VsZXRvbiIgZm9yIGRldmVsb3BpbmcgbmV3IEV0aGVybmV0CisgICAgICAgICAgbmV0d29yayBkZXZpY2UgZHJpdmVycy4gSXQgdXNlcyB0aGUgZXRoYXJwLmMgQVJQIGNvZGUuCisKK2xvb3BpZi5jCisgICAgICAgICAgQSAibG9vcGJhY2siIG5ldHdvcmsgaW50ZXJmYWNlIGRyaXZlci4gSXQgcmVxdWlyZXMgY29uZmlndXJhdGlvbgorICAgICAgICAgIHRocm91Z2ggdGhlIGRlZmluZSBMV0lQX0xPT1BJRl9NVUxUSVRIUkVBRElORyAoc2VlIG9wdC5oKS4KKworc2xpcGlmLmMKKyAgICAgICAgICBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNMSVAgKFNlcmlhbCBMaW5lIElQKQorICAgICAgICAgIHByb3RvY29sLiBJdCByZXF1aXJlcyBhIHNpbyAoc2VyaWFsIEkvTykgbW9kdWxlIHRvIHdvcmsuCisKK3BwcC8gICAgICBQb2ludC10by1Qb2ludCBQcm90b2NvbCBzdGFjaworICAgICAgICAgIFRoZSBQUFAgc3RhY2sgaGFzIGJlZW4gcG9ydGVkIGZyb20gdWNpcCAoaHR0cDovL3VjaXAuc291cmNlZm9yZ2UubmV0KS4KKyAgICAgICAgICBJdCBtYXRjaGVzIHF1aXRlIHdlbGwgdG8gcHBwZCAyLjMuMSAoaHR0cDovL3BwcC5zYW1iYS5vcmcpLCBhbHRob3VnaAorICAgICAgICAgIGNvbXBhcmVkIHRvIHRoYXQsIGl0IGhhcyBzb21lIG1vZGlmaWNhdGlvbnMgZm9yIGVtYmVkZGVkIHN5c3RlbXMgYW5kCisgICAgICAgICAgdGhlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIHJlb3JkZXJlZCBhIGJpdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL2V0aGFycC5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9ldGhhcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBkYWRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9ldGhhcnAuYwpAQCAtMCwwICsxLDEzMTggQEAKKy8qKgorICogQGZpbGUKKyAqIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbCBtb2R1bGUgZm9yIElQIG92ZXIgRXRoZXJuZXQKKyAqCisgKiBGdW5jdGlvbmFsbHksIEFSUCBpcyBkaXZpZGVkIGludG8gdHdvIHBhcnRzLiBUaGUgZmlyc3QgbWFwcyBhbiBJUCBhZGRyZXNzCisgKiB0byBhIHBoeXNpY2FsIGFkZHJlc3Mgd2hlbiBzZW5kaW5nIGEgcGFja2V0LCBhbmQgdGhlIHNlY29uZCBwYXJ0IGFuc3dlcnMKKyAqIHJlcXVlc3RzIGZyb20gb3RoZXIgbWFjaGluZXMgZm9yIG91ciBwaHlzaWNhbCBhZGRyZXNzLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBSRkMgODI2IChFdGhlcm5ldCBBUlApLiBJdCBzdXBwb3J0cworICogR3JhdHVpdGlvdXMgQVJQIGZyb20gUkZDMzIyMCAoSVAgTW9iaWxpdHkgU3VwcG9ydCBmb3IgSVB2NCkgc2VjdGlvbiA0LjYKKyAqIGlmIGFuIGludGVyZmFjZSBjYWxscyBldGhhcnBfZ3JhdHVpdG91cyhvdXJfbmV0aWYpIHVwb24gYWRkcmVzcyBjaGFuZ2UuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uLndvZXN0ZW5iZXJnQGF4b24udHY+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBBeG9uIERpZ2l0YWwgRGVzaWduIEIuVi4sIFRoZSBOZXRoZXJsYW5kcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVAorICogU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHdJUCBUQ1AvSVAgc3RhY2suCisgKgorICovCisgCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIExXSVBfQVJQIHx8IExXSVBfRVRIRVJORVQKKworI2luY2x1ZGUgImx3aXAvaXBfYWRkci5oIgorI2luY2x1ZGUgImx3aXAvZGVmLmgiCisjaW5jbHVkZSAibHdpcC9pcC5oIgorI2luY2x1ZGUgImx3aXAvc3RhdHMuaCIKKyNpbmNsdWRlICJsd2lwL3NubXAuaCIKKyNpbmNsdWRlICJsd2lwL2RoY3AuaCIKKyNpbmNsdWRlICJsd2lwL2F1dG9pcC5oIgorI2luY2x1ZGUgIm5ldGlmL2V0aGFycC5oIgorCisjaWYgUFBQT0VfU1VQUE9SVAorI2luY2x1ZGUgIm5ldGlmL3BwcF9vZS5oIgorI2VuZGlmIC8qIFBQUE9FX1NVUFBPUlQgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjb25zdCBzdHJ1Y3QgZXRoX2FkZHIgZXRoYnJvYWRjYXN0ID0ge3sweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn19OworY29uc3Qgc3RydWN0IGV0aF9hZGRyIGV0aHplcm8gPSB7ezAsMCwwLDAsMCwwfX07CisKKyNpZiBMV0lQX0FSUCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworLyoqIHRoZSB0aW1lIGFuIEFSUCBlbnRyeSBzdGF5cyB2YWxpZCBhZnRlciBpdHMgbGFzdCB1cGRhdGUsCisgKiAgZm9yIEFSUF9UTVJfSU5URVJWQUwgPSA1MDAwLCB0aGlzIGlzCisgKiAgKDI0MCAqIDUpIHNlY29uZHMgPSAyMCBtaW51dGVzLgorICovCisjZGVmaW5lIEFSUF9NQVhBR0UgMjQwCisvKiogdGhlIHRpbWUgYW4gQVJQIGVudHJ5IHN0YXlzIHBlbmRpbmcgYWZ0ZXIgZmlyc3QgcmVxdWVzdCwKKyAqICBmb3IgQVJQX1RNUl9JTlRFUlZBTCA9IDUwMDAsIHRoaXMgaXMKKyAqICAoMiAqIDUpIHNlY29uZHMgPSAxMCBzZWNvbmRzLgorICogCisgKiAgQGludGVybmFsIEtlZXAgdGhpcyBudW1iZXIgYXQgbGVhc3QgMiwgb3RoZXJ3aXNlIGl0IG1pZ2h0CisgKiAgcnVuIG91dCBpbnN0YW50bHkgaWYgdGhlIHRpbWVvdXQgb2NjdXJzIGRpcmVjdGx5IGFmdGVyIGEgcmVxdWVzdC4KKyAqLworI2RlZmluZSBBUlBfTUFYUEVORElORyAyCisKKyNkZWZpbmUgSFdUWVBFX0VUSEVSTkVUIDEKKworZW51bSBldGhhcnBfc3RhdGUgeworICBFVEhBUlBfU1RBVEVfRU1QVFkgPSAwLAorICBFVEhBUlBfU1RBVEVfUEVORElORywKKyAgRVRIQVJQX1NUQVRFX1NUQUJMRQorfTsKKworc3RydWN0IGV0aGFycF9lbnRyeSB7CisjaWYgQVJQX1FVRVVFSU5HCisgIC8qKiBQb2ludGVyIHRvIHF1ZXVlIG9mIHBlbmRpbmcgb3V0Z29pbmcgcGFja2V0cyBvbiB0aGlzIEFSUCBlbnRyeS4gKi8KKyAgc3RydWN0IGV0aGFycF9xX2VudHJ5ICpxOworI2Vsc2UgLyogQVJQX1FVRVVFSU5HICovCisgIC8qKiBQb2ludGVyIHRvIGEgc2luZ2xlIHBlbmRpbmcgb3V0Z29pbmcgcGFja2V0IG9uIHRoaXMgQVJQIGVudHJ5LiAqLworICBzdHJ1Y3QgcGJ1ZiAqcTsKKyNlbmRpZiAvKiBBUlBfUVVFVUVJTkcgKi8KKyAgaXBfYWRkcl90IGlwYWRkcjsKKyAgc3RydWN0IGV0aF9hZGRyIGV0aGFkZHI7CisjaWYgTFdJUF9TTk1QCisgIHN0cnVjdCBuZXRpZiAqbmV0aWY7CisjZW5kaWYgLyogTFdJUF9TTk1QICovCisgIHU4X3Qgc3RhdGU7CisgIHU4X3QgY3RpbWU7CisjaWYgRVRIQVJQX1NVUFBPUlRfU1RBVElDX0VOVFJJRVMKKyAgdThfdCBzdGF0aWNfZW50cnk7CisjZW5kaWYgLyogRVRIQVJQX1NVUFBPUlRfU1RBVElDX0VOVFJJRVMgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZXRoYXJwX2VudHJ5IGFycF90YWJsZVtBUlBfVEFCTEVfU0laRV07CisKKyNpZiAhTFdJUF9ORVRJRl9IV0FERFJISU5UCitzdGF0aWMgdThfdCBldGhhcnBfY2FjaGVkX2VudHJ5OworI2VuZGlmIC8qICFMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKworLyoqIFRyeSBoYXJkIHRvIGNyZWF0ZSBhIG5ldyBlbnRyeSAtIHdlIHdhbnQgdGhlIElQIGFkZHJlc3MgdG8gYXBwZWFyIGluCisgICAgdGhlIGNhY2hlIChldmVuIGlmIHRoaXMgbWVhbnMgcmVtb3ZpbmcgYW4gYWN0aXZlIGVudHJ5IG9yIHNvKS4gKi8KKyNkZWZpbmUgRVRIQVJQX0ZMQUdfVFJZX0hBUkQgICAgIDEKKyNkZWZpbmUgRVRIQVJQX0ZMQUdfRklORF9PTkxZICAgIDIKKyNkZWZpbmUgRVRIQVJQX0ZMQUdfU1RBVElDX0VOVFJZIDQKKworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorI2RlZmluZSBFVEhBUlBfU0VUX0hJTlQobmV0aWYsIGhpbnQpICBpZiAoKChuZXRpZikgIT0gTlVMTCkgJiYgKChuZXRpZiktPmFkZHJfaGludCAhPSBOVUxMKSkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigobmV0aWYpLT5hZGRyX2hpbnQpID0gKGhpbnQpOworI2Vsc2UgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UICovCisjZGVmaW5lIEVUSEFSUF9TRVRfSElOVChuZXRpZiwgaGludCkgIChldGhhcnBfY2FjaGVkX2VudHJ5ID0gKGhpbnQpKQorI2VuZGlmIC8qIExXSVBfTkVUSUZfSFdBRERSSElOVCAqLworCitzdGF0aWMgZXJyX3QgdXBkYXRlX2FycF9lbnRyeShzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKmlwYWRkciwgc3RydWN0IGV0aF9hZGRyICpldGhhZGRyLCB1OF90IGZsYWdzKTsKKworCisvKiBTb21lIGNoZWNrcywgaW5zdGVhZCBvZiBldGhhcnBfaW5pdCgpOiAqLworI2lmIChMV0lQX0FSUCAmJiAoQVJQX1RBQkxFX1NJWkUgPiAweDdmKSkKKyAgI2Vycm9yICJBUlBfVEFCTEVfU0laRSBtdXN0IGZpdCBpbiBhbiBzOF90LCB5b3UgaGF2ZSB0byByZWR1Y2UgaXQgaW4geW91ciBsd2lwb3B0cy5oIgorI2VuZGlmCisKKworI2lmIEFSUF9RVUVVRUlORworLyoqCisgKiBGcmVlIGEgY29tcGxldGUgcXVldWUgb2YgZXRoYXJwIGVudHJpZXMKKyAqCisgKiBAcGFyYW0gcSBhIHFldWV1ZSBvZiBldGhhcnBfcV9lbnRyeSdzIHRvIGZyZWUKKyAqLworc3RhdGljIHZvaWQKK2ZyZWVfZXRoYXJwX3Eoc3RydWN0IGV0aGFycF9xX2VudHJ5ICpxKQoreworICBzdHJ1Y3QgZXRoYXJwX3FfZW50cnkgKnI7CisgIExXSVBfQVNTRVJUKCJxICE9IE5VTEwiLCBxICE9IE5VTEwpOworICBMV0lQX0FTU0VSVCgicS0+cCAhPSBOVUxMIiwgcS0+cCAhPSBOVUxMKTsKKyAgd2hpbGUgKHEpIHsKKyAgICByID0gcTsKKyAgICBxID0gcS0+bmV4dDsKKyAgICBMV0lQX0FTU0VSVCgici0+cCAhPSBOVUxMIiwgKHItPnAgIT0gTlVMTCkpOworICAgIHBidWZfZnJlZShyLT5wKTsKKyAgICBtZW1wX2ZyZWUoTUVNUF9BUlBfUVVFVUUsIHIpOworICB9Cit9CisjZWxzZSAvKiBBUlBfUVVFVUVJTkcgKi8KKworLyoqIENvbXBhdGliaWxpdHkgZGVmaW5lOiBmcmVlIHRoZSBxdWV1ZWQgcGJ1ZiAqLworI2RlZmluZSBmcmVlX2V0aGFycF9xKHEpIHBidWZfZnJlZShxKQorCisjZW5kaWYgLyogQVJQX1FVRVVFSU5HICovCisKKy8qKiBDbGVhbiB1cCBBUlAgdGFibGUgZW50cmllcyAqLworc3RhdGljIHZvaWQKK2ZyZWVfZW50cnkoaW50IGkpCit7CisgIC8qIHJlbW92ZSBmcm9tIFNOTVAgQVJQIGluZGV4IHRyZWUgKi8KKyAgc25tcF9kZWxldGVfYXJwaWR4X3RyZWUoYXJwX3RhYmxlW2ldLm5ldGlmLCAmYXJwX3RhYmxlW2ldLmlwYWRkcik7CisgIC8qIGFuZCBlbXB0eSBwYWNrZXQgcXVldWUgKi8KKyAgaWYgKGFycF90YWJsZVtpXS5xICE9IE5VTEwpIHsKKyAgICAvKiByZW1vdmUgYWxsIHF1ZXVlZCBwYWNrZXRzICovCisgICAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHLCAoImV0aGFycF90aW1lcjogZnJlZWluZyBlbnRyeSAlIlUxNl9GIiwgcGFja2V0IHF1ZXVlICVwLlxuIiwgKHUxNl90KWksICh2b2lkICopKGFycF90YWJsZVtpXS5xKSkpOworICAgIGZyZWVfZXRoYXJwX3EoYXJwX3RhYmxlW2ldLnEpOworICAgIGFycF90YWJsZVtpXS5xID0gTlVMTDsKKyAgfQorICAvKiByZWN5Y2xlIGVudHJ5IGZvciByZS11c2UgKi8gICAgICAKKyAgYXJwX3RhYmxlW2ldLnN0YXRlID0gRVRIQVJQX1NUQVRFX0VNUFRZOworI2lmIEVUSEFSUF9TVVBQT1JUX1NUQVRJQ19FTlRSSUVTCisgIGFycF90YWJsZVtpXS5zdGF0aWNfZW50cnkgPSAwOworI2VuZGlmIC8qIEVUSEFSUF9TVVBQT1JUX1NUQVRJQ19FTlRSSUVTICovCisjaWZkZWYgTFdJUF9ERUJVRworICAvKiBmb3IgZGVidWdnaW5nLCBjbGVhbiBvdXQgdGhlIGNvbXBsZXRlIGVudHJ5ICovCisgIGFycF90YWJsZVtpXS5jdGltZSA9IDA7CisjaWYgTFdJUF9TTk1QCisgIGFycF90YWJsZVtpXS5uZXRpZiA9IE5VTEw7CisjZW5kaWYgLyogTFdJUF9TTk1QICovCisgIGlwX2FkZHJfc2V0X3plcm8oJmFycF90YWJsZVtpXS5pcGFkZHIpOworICBhcnBfdGFibGVbaV0uZXRoYWRkciA9IGV0aHplcm87CisjZW5kaWYgLyogTFdJUF9ERUJVRyAqLworfQorCisvKioKKyAqIENsZWFycyBleHBpcmVkIGVudHJpZXMgaW4gdGhlIEFSUCB0YWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgRVRIQVJQX1RNUl9JTlRFUlZBTCBtaWxsaXNlY29uZHMgKDUgc2Vjb25kcyksCisgKiBpbiBvcmRlciB0byBleHBpcmUgZW50cmllcyBpbiB0aGUgQVJQIHRhYmxlLgorICovCit2b2lkCitldGhhcnBfdG1yKHZvaWQpCit7CisgIHU4X3QgaTsKKworICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcsICgiZXRoYXJwX3RpbWVyXG4iKSk7CisgIC8qIHJlbW92ZSBleHBpcmVkIGVudHJpZXMgZnJvbSB0aGUgQVJQIHRhYmxlICovCisgIGZvciAoaSA9IDA7IGkgPCBBUlBfVEFCTEVfU0laRTsgKytpKSB7CisgICAgdThfdCBzdGF0ZSA9IGFycF90YWJsZVtpXS5zdGF0ZTsKKyAgICBpZiAoc3RhdGUgIT0gRVRIQVJQX1NUQVRFX0VNUFRZCisjaWYgRVRIQVJQX1NVUFBPUlRfU1RBVElDX0VOVFJJRVMKKyAgICAgICYmIChhcnBfdGFibGVbaV0uc3RhdGljX2VudHJ5ID09IDApCisjZW5kaWYgLyogRVRIQVJQX1NVUFBPUlRfU1RBVElDX0VOVFJJRVMgKi8KKyAgICAgICkgeworICAgICAgYXJwX3RhYmxlW2ldLmN0aW1lKys7CisgICAgICBpZiAoKGFycF90YWJsZVtpXS5jdGltZSA+PSBBUlBfTUFYQUdFKSB8fAorICAgICAgICAgICgoYXJwX3RhYmxlW2ldLnN0YXRlID09IEVUSEFSUF9TVEFURV9QRU5ESU5HKSAgJiYKKyAgICAgICAgICAgKGFycF90YWJsZVtpXS5jdGltZSA+PSBBUlBfTUFYUEVORElORykpKSB7CisgICAgICAgIC8qIHBlbmRpbmcgb3Igc3RhYmxlIGVudHJ5IGhhcyBiZWNvbWUgb2xkISAqLworICAgICAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcsICgiZXRoYXJwX3RpbWVyOiBleHBpcmVkICVzIGVudHJ5ICUiVTE2X0YiLlxuIiwKKyAgICAgICAgICAgICBhcnBfdGFibGVbaV0uc3RhdGUgPT0gRVRIQVJQX1NUQVRFX1NUQUJMRSA/ICJzdGFibGUiIDogInBlbmRpbmciLCAodTE2X3QpaSkpOworICAgICAgICAvKiBjbGVhbiB1cCBlbnRyaWVzIHRoYXQgaGF2ZSBqdXN0IGJlZW4gZXhwaXJlZCAqLworICAgICAgICBmcmVlX2VudHJ5KGkpOworICAgICAgfQorI2lmIEFSUF9RVUVVRUlORworICAgICAgLyogc3RpbGwgcGVuZGluZyBlbnRyeT8gKG5vdCBleHBpcmVkKSAqLworICAgICAgaWYgKGFycF90YWJsZVtpXS5zdGF0ZSA9PSBFVEhBUlBfU1RBVEVfUEVORElORykgeworICAgICAgICAvKiByZXNlbmQgYW4gQVJQIHF1ZXJ5IGhlcmU/ICovCisgICAgICB9CisjZW5kaWYgLyogQVJQX1FVRVVFSU5HICovCisgICAgfQorICB9Cit9CisKKy8qKgorICogU2VhcmNoIHRoZSBBUlAgdGFibGUgZm9yIGEgbWF0Y2hpbmcgb3IgbmV3IGVudHJ5LgorICogCisgKiBJZiBhbiBJUCBhZGRyZXNzIGlzIGdpdmVuLCByZXR1cm4gYSBwZW5kaW5nIG9yIHN0YWJsZSBBUlAgZW50cnkgdGhhdCBtYXRjaGVzCisgKiB0aGUgYWRkcmVzcy4gSWYgbm8gbWF0Y2ggaXMgZm91bmQsIGNyZWF0ZSBhIG5ldyBlbnRyeSB3aXRoIHRoaXMgYWRkcmVzcyBzZXQsCisgKiBidXQgaW4gc3RhdGUgRVRIQVJQX0VNUFRZLiBUaGUgY2FsbGVyIG11c3QgY2hlY2sgYW5kIHBvc3NpYmx5IGNoYW5nZSB0aGUKKyAqIHN0YXRlIG9mIHRoZSByZXR1cm5lZCBlbnRyeS4KKyAqIAorICogSWYgaXBhZGRyIGlzIE5VTEwsIHJldHVybiBhIGluaXRpYWxpemVkIG5ldyBlbnRyeSBpbiBzdGF0ZSBFVEhBUlBfRU1QVFkuCisgKiAKKyAqIEluIGFsbCBjYXNlcywgYXR0ZW1wdCB0byBjcmVhdGUgbmV3IGVudHJpZXMgZnJvbSBhbiBlbXB0eSBlbnRyeS4gSWYgbm8KKyAqIGVtcHR5IGVudHJpZXMgYXJlIGF2YWlsYWJsZSBhbmQgRVRIQVJQX0ZMQUdfVFJZX0hBUkQgZmxhZyBpcyBzZXQsIHJlY3ljbGUKKyAqIG9sZCBlbnRyaWVzLiBIZXVyaXN0aWMgY2hvb3NlIHRoZSBsZWFzdCBpbXBvcnRhbnQgZW50cnkgZm9yIHJlY3ljbGluZy4KKyAqCisgKiBAcGFyYW0gaXBhZGRyIElQIGFkZHJlc3MgdG8gZmluZCBpbiBBUlAgY2FjaGUsIG9yIHRvIGFkZCBpZiBub3QgZm91bmQuCisgKiBAcGFyYW0gZmxhZ3MgQHNlZSBkZWZpbml0aW9uIG9mIEVUSEFSUF9GTEFHXyoKKyAqIEBwYXJhbSBuZXRpZiBuZXRpZiByZWxhdGVkIHRvIHRoaXMgYWRkcmVzcyAodXNlZCBmb3IgTkVUSUZfSFdBRERSSElOVCkKKyAqICAKKyAqIEByZXR1cm4gVGhlIEFSUCBlbnRyeSBpbmRleCB0aGF0IG1hdGNoZWQgb3IgaXMgY3JlYXRlZCwgRVJSX01FTSBpZiBubworICogZW50cnkgaXMgZm91bmQgb3IgY291bGQgYmUgcmVjeWNsZWQuCisgKi8KK3N0YXRpYyBzOF90CitmaW5kX2VudHJ5KGlwX2FkZHJfdCAqaXBhZGRyLCB1OF90IGZsYWdzKQoreworICBzOF90IG9sZF9wZW5kaW5nID0gQVJQX1RBQkxFX1NJWkUsIG9sZF9zdGFibGUgPSBBUlBfVEFCTEVfU0laRTsKKyAgczhfdCBlbXB0eSA9IEFSUF9UQUJMRV9TSVpFOworICB1OF90IGkgPSAwLCBhZ2VfcGVuZGluZyA9IDAsIGFnZV9zdGFibGUgPSAwOworICAvKiBvbGRlc3QgZW50cnkgd2l0aCBwYWNrZXRzIG9uIHF1ZXVlICovCisgIHM4X3Qgb2xkX3F1ZXVlID0gQVJQX1RBQkxFX1NJWkU7CisgIC8qIGl0cyBhZ2UgKi8KKyAgdThfdCBhZ2VfcXVldWUgPSAwOworCisgIC8qKgorICAgKiBhKSBkbyBhIHNlYXJjaCB0aHJvdWdoIHRoZSBjYWNoZSwgcmVtZW1iZXIgY2FuZGlkYXRlcworICAgKiBiKSBzZWxlY3QgY2FuZGlkYXRlIGVudHJ5CisgICAqIGMpIGNyZWF0ZSBuZXcgZW50cnkKKyAgICovCisKKyAgLyogYSkgaW4gYSBzaW5nbGUgc2VhcmNoIHN3ZWVwLCBkbyBhbGwgb2YgdGhpcworICAgKiAxKSByZW1lbWJlciB0aGUgZmlyc3QgZW1wdHkgZW50cnkgKGlmIGFueSkKKyAgICogMikgcmVtZW1iZXIgdGhlIG9sZGVzdCBzdGFibGUgZW50cnkgKGlmIGFueSkKKyAgICogMykgcmVtZW1iZXIgdGhlIG9sZGVzdCBwZW5kaW5nIGVudHJ5IHdpdGhvdXQgcXVldWVkIHBhY2tldHMgKGlmIGFueSkKKyAgICogNCkgcmVtZW1iZXIgdGhlIG9sZGVzdCBwZW5kaW5nIGVudHJ5IHdpdGggcXVldWVkIHBhY2tldHMgKGlmIGFueSkKKyAgICogNSkgc2VhcmNoIGZvciBhIG1hdGNoaW5nIElQIGVudHJ5LCBlaXRoZXIgcGVuZGluZyBvciBzdGFibGUKKyAgICogICAgdW50aWwgNSBtYXRjaGVzLCBvciBhbGwgZW50cmllcyBhcmUgc2VhcmNoZWQgZm9yLgorICAgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgQVJQX1RBQkxFX1NJWkU7ICsraSkgeworICAgIHU4X3Qgc3RhdGUgPSBhcnBfdGFibGVbaV0uc3RhdGU7CisgICAgLyogbm8gZW1wdHkgZW50cnkgZm91bmQgeWV0IGFuZCBub3cgd2UgZG8gZmluZCBvbmU/ICovCisgICAgaWYgKChlbXB0eSA9PSBBUlBfVEFCTEVfU0laRSkgJiYgKHN0YXRlID09IEVUSEFSUF9TVEFURV9FTVBUWSkpIHsKKyAgICAgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRywgKCJmaW5kX2VudHJ5OiBmb3VuZCBlbXB0eSBlbnRyeSAlIlUxNl9GIlxuIiwgKHUxNl90KWkpKTsKKyAgICAgIC8qIHJlbWVtYmVyIGZpcnN0IGVtcHR5IGVudHJ5ICovCisgICAgICBlbXB0eSA9IGk7CisgICAgfSBlbHNlIGlmIChzdGF0ZSAhPSBFVEhBUlBfU1RBVEVfRU1QVFkpIHsKKyAgICAgIExXSVBfQVNTRVJUKCJzdGF0ZSA9PSBFVEhBUlBfU1RBVEVfUEVORElORyB8fCBzdGF0ZSA9PSBFVEhBUlBfU1RBVEVfU1RBQkxFIiwKKyAgICAgICAgc3RhdGUgPT0gRVRIQVJQX1NUQVRFX1BFTkRJTkcgfHwgc3RhdGUgPT0gRVRIQVJQX1NUQVRFX1NUQUJMRSk7CisgICAgICAvKiBpZiBnaXZlbiwgZG9lcyBJUCBhZGRyZXNzIG1hdGNoIElQIGFkZHJlc3MgaW4gQVJQIGVudHJ5PyAqLworICAgICAgaWYgKGlwYWRkciAmJiBpcF9hZGRyX2NtcChpcGFkZHIsICZhcnBfdGFibGVbaV0uaXBhZGRyKSkgeworICAgICAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJmaW5kX2VudHJ5OiBmb3VuZCBtYXRjaGluZyBlbnRyeSAlIlUxNl9GIlxuIiwgKHUxNl90KWkpKTsKKyAgICAgICAgLyogZm91bmQgZXhhY3QgSVAgYWRkcmVzcyBtYXRjaCwgc2ltcGx5IGJhaWwgb3V0ICovCisgICAgICAgIHJldHVybiBpOworICAgICAgfQorICAgICAgLyogcGVuZGluZyBlbnRyeT8gKi8KKyAgICAgIGlmIChzdGF0ZSA9PSBFVEhBUlBfU1RBVEVfUEVORElORykgeworICAgICAgICAvKiBwZW5kaW5nIHdpdGggcXVldWVkIHBhY2tldHM/ICovCisgICAgICAgIGlmIChhcnBfdGFibGVbaV0ucSAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKGFycF90YWJsZVtpXS5jdGltZSA+PSBhZ2VfcXVldWUpIHsKKyAgICAgICAgICAgIG9sZF9xdWV1ZSA9IGk7CisgICAgICAgICAgICBhZ2VfcXVldWUgPSBhcnBfdGFibGVbaV0uY3RpbWU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgLyogcGVuZGluZyB3aXRob3V0IHF1ZXVlZCBwYWNrZXRzPyAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKGFycF90YWJsZVtpXS5jdGltZSA+PSBhZ2VfcGVuZGluZykgeworICAgICAgICAgICAgb2xkX3BlbmRpbmcgPSBpOworICAgICAgICAgICAgYWdlX3BlbmRpbmcgPSBhcnBfdGFibGVbaV0uY3RpbWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAvKiBzdGFibGUgZW50cnk/ICovCisgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IEVUSEFSUF9TVEFURV9TVEFCTEUpIHsKKyNpZiBFVEhBUlBfU1VQUE9SVF9TVEFUSUNfRU5UUklFUworICAgICAgICAvKiBkb24ndCByZWNvcmQgb2xkX3N0YWJsZSBmb3Igc3RhdGljIGVudHJpZXMgc2luY2UgdGhleSBuZXZlciBleHBpcmUgKi8KKyAgICAgICAgaWYgKGFycF90YWJsZVtpXS5zdGF0aWNfZW50cnkgPT0gMCkKKyNlbmRpZiAvKiBFVEhBUlBfU1VQUE9SVF9TVEFUSUNfRU5UUklFUyAqLworICAgICAgICB7CisgICAgICAgICAgLyogcmVtZW1iZXIgZW50cnkgd2l0aCBvbGRlc3Qgc3RhYmxlIGVudHJ5IGluIG9sZGVzdCwgaXRzIGFnZSBpbiBtYXh0aW1lICovCisgICAgICAgICAgaWYgKGFycF90YWJsZVtpXS5jdGltZSA+PSBhZ2Vfc3RhYmxlKSB7CisgICAgICAgICAgICBvbGRfc3RhYmxlID0gaTsKKyAgICAgICAgICAgIGFnZV9zdGFibGUgPSBhcnBfdGFibGVbaV0uY3RpbWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qIHsgd2UgaGF2ZSBubyBtYXRjaCB9ID0+IHRyeSB0byBjcmVhdGUgYSBuZXcgZW50cnkgKi8KKyAgIAorICAvKiBkb24ndCBjcmVhdGUgbmV3IGVudHJ5LCBvbmx5IHNlYXJjaD8gKi8KKyAgaWYgKCgoZmxhZ3MgJiBFVEhBUlBfRkxBR19GSU5EX09OTFkpICE9IDApIHx8CisgICAgICAvKiBvciBubyBlbXB0eSBlbnRyeSBmb3VuZCBhbmQgbm90IGFsbG93ZWQgdG8gcmVjeWNsZT8gKi8KKyAgICAgICgoZW1wdHkgPT0gQVJQX1RBQkxFX1NJWkUpICYmICgoZmxhZ3MgJiBFVEhBUlBfRkxBR19UUllfSEFSRCkgPT0gMCkpKSB7CisgICAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZmluZF9lbnRyeTogbm8gZW1wdHkgZW50cnkgZm91bmQgYW5kIG5vdCBhbGxvd2VkIHRvIHJlY3ljbGVcbiIpKTsKKyAgICByZXR1cm4gKHM4X3QpRVJSX01FTTsKKyAgfQorICAKKyAgLyogYikgY2hvb3NlIHRoZSBsZWFzdCBkZXN0cnVjdGl2ZSBlbnRyeSB0byByZWN5Y2xlOgorICAgKiAxKSBlbXB0eSBlbnRyeQorICAgKiAyKSBvbGRlc3Qgc3RhYmxlIGVudHJ5CisgICAqIDMpIG9sZGVzdCBwZW5kaW5nIGVudHJ5IHdpdGhvdXQgcXVldWVkIHBhY2tldHMKKyAgICogNCkgb2xkZXN0IHBlbmRpbmcgZW50cnkgd2l0aCBxdWV1ZWQgcGFja2V0cworICAgKiAKKyAgICogeyBFVEhBUlBfRkxBR19UUllfSEFSRCBpcyBzZXQgYXQgdGhpcyBwb2ludCB9CisgICAqLyAKKworICAvKiAxKSBlbXB0eSBlbnRyeSBhdmFpbGFibGU/ICovCisgIGlmIChlbXB0eSA8IEFSUF9UQUJMRV9TSVpFKSB7CisgICAgaSA9IGVtcHR5OworICAgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImZpbmRfZW50cnk6IHNlbGVjdGluZyBlbXB0eSBlbnRyeSAlIlUxNl9GIlxuIiwgKHUxNl90KWkpKTsKKyAgfSBlbHNlIHsKKyAgICAvKiAyKSBmb3VuZCByZWN5Y2xhYmxlIHN0YWJsZSBlbnRyeT8gKi8KKyAgICBpZiAob2xkX3N0YWJsZSA8IEFSUF9UQUJMRV9TSVpFKSB7CisgICAgICAvKiByZWN5Y2xlIG9sZGVzdCBzdGFibGUqLworICAgICAgaSA9IG9sZF9zdGFibGU7CisgICAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJmaW5kX2VudHJ5OiBzZWxlY3Rpbmcgb2xkZXN0IHN0YWJsZSBlbnRyeSAlIlUxNl9GIlxuIiwgKHUxNl90KWkpKTsKKyAgICAgIC8qIG5vIHF1ZXVlZCBwYWNrZXRzIHNob3VsZCBleGlzdCBvbiBzdGFibGUgZW50cmllcyAqLworICAgICAgTFdJUF9BU1NFUlQoImFycF90YWJsZVtpXS5xID09IE5VTEwiLCBhcnBfdGFibGVbaV0ucSA9PSBOVUxMKTsKKyAgICAvKiAzKSBmb3VuZCByZWN5Y2xhYmxlIHBlbmRpbmcgZW50cnkgd2l0aG91dCBxdWV1ZWQgcGFja2V0cz8gKi8KKyAgICB9IGVsc2UgaWYgKG9sZF9wZW5kaW5nIDwgQVJQX1RBQkxFX1NJWkUpIHsKKyAgICAgIC8qIHJlY3ljbGUgb2xkZXN0IHBlbmRpbmcgKi8KKyAgICAgIGkgPSBvbGRfcGVuZGluZzsKKyAgICAgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImZpbmRfZW50cnk6IHNlbGVjdGluZyBvbGRlc3QgcGVuZGluZyBlbnRyeSAlIlUxNl9GIiAod2l0aG91dCBxdWV1ZSlcbiIsICh1MTZfdClpKSk7CisgICAgLyogNCkgZm91bmQgcmVjeWNsYWJsZSBwZW5kaW5nIGVudHJ5IHdpdGggcXVldWVkIHBhY2tldHM/ICovCisgICAgfSBlbHNlIGlmIChvbGRfcXVldWUgPCBBUlBfVEFCTEVfU0laRSkgeworICAgICAgLyogcmVjeWNsZSBvbGRlc3QgcGVuZGluZyAocXVldWVkIHBhY2tldHMgYXJlIGZyZWUgaW4gZnJlZV9lbnRyeSkgKi8KKyAgICAgIGkgPSBvbGRfcXVldWU7CisgICAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJmaW5kX2VudHJ5OiBzZWxlY3Rpbmcgb2xkZXN0IHBlbmRpbmcgZW50cnkgJSJVMTZfRiIsIGZyZWVpbmcgcGFja2V0IHF1ZXVlICVwXG4iLCAodTE2X3QpaSwgKHZvaWQgKikoYXJwX3RhYmxlW2ldLnEpKSk7CisgICAgICAvKiBubyBlbXB0eSBvciByZWN5Y2xhYmxlIGVudHJpZXMgZm91bmQgKi8KKyAgICB9IGVsc2UgeworICAgICAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZmluZF9lbnRyeTogbm8gZW1wdHkgb3IgcmVjeWNsYWJsZSBlbnRyaWVzIGZvdW5kXG4iKSk7CisgICAgICByZXR1cm4gKHM4X3QpRVJSX01FTTsKKyAgICB9CisKKyAgICAvKiB7IGVtcHR5IG9yIHJlY3ljbGFibGUgZW50cnkgZm91bmQgfSAqLworICAgIExXSVBfQVNTRVJUKCJpIDwgQVJQX1RBQkxFX1NJWkUiLCBpIDwgQVJQX1RBQkxFX1NJWkUpOworICAgIGZyZWVfZW50cnkoaSk7CisgIH0KKworICBMV0lQX0FTU0VSVCgiaSA8IEFSUF9UQUJMRV9TSVpFIiwgaSA8IEFSUF9UQUJMRV9TSVpFKTsKKyAgTFdJUF9BU1NFUlQoImFycF90YWJsZVtpXS5zdGF0ZSA9PSBFVEhBUlBfU1RBVEVfRU1QVFkiLAorICAgIGFycF90YWJsZVtpXS5zdGF0ZSA9PSBFVEhBUlBfU1RBVEVfRU1QVFkpOworCisgIC8qIElQIGFkZHJlc3MgZ2l2ZW4/ICovCisgIGlmIChpcGFkZHIgIT0gTlVMTCkgeworICAgIC8qIHNldCBJUCBhZGRyZXNzICovCisgICAgaXBfYWRkcl9jb3B5KGFycF90YWJsZVtpXS5pcGFkZHIsICppcGFkZHIpOworICB9CisgIGFycF90YWJsZVtpXS5jdGltZSA9IDA7CisjaWYgRVRIQVJQX1NVUFBPUlRfU1RBVElDX0VOVFJJRVMKKyAgYXJwX3RhYmxlW2ldLnN0YXRpY19lbnRyeSA9IDA7CisjZW5kaWYgLyogRVRIQVJQX1NVUFBPUlRfU1RBVElDX0VOVFJJRVMgKi8KKyAgcmV0dXJuIChlcnJfdClpOworfQorCisvKioKKyAqIFNlbmQgYW4gSVAgcGFja2V0IG9uIHRoZSBuZXR3b3JrIHVzaW5nIG5ldGlmLT5saW5rb3V0cHV0CisgKiBUaGUgZXRoZXJuZXQgaGVhZGVyIGlzIGZpbGxlZCBpbiBiZWZvcmUgc2VuZGluZy4KKyAqCisgKiBAcGFyYW1zIG5ldGlmIHRoZSBsd0lQIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIHNlbmQgdGhlIHBhY2tldAorICogQHBhcmFtcyBwIHRoZSBwYWNrZXQgdG8gc2VuZCwgcC0+cGF5bG9hZCBwb2ludGluZyB0byB0aGUgKHVuaW5pdGlhbGl6ZWQpIGV0aGVybmV0IGhlYWRlcgorICogQHBhcmFtcyBzcmMgdGhlIHNvdXJjZSBNQUMgYWRkcmVzcyB0byBiZSBjb3BpZWQgaW50byB0aGUgZXRoZXJuZXQgaGVhZGVyCisgKiBAcGFyYW1zIGRzdCB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgdG8gYmUgY29waWVkIGludG8gdGhlIGV0aGVybmV0IGhlYWRlcgorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIHBhY2tldCB3YXMgc2VudCwgYW55IG90aGVyIGVycl90IG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGVycl90CitldGhhcnBfc2VuZF9pcChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBzdHJ1Y3QgcGJ1ZiAqcCwgc3RydWN0IGV0aF9hZGRyICpzcmMsIHN0cnVjdCBldGhfYWRkciAqZHN0KQoreworICBzdHJ1Y3QgZXRoX2hkciAqZXRoaGRyID0gKHN0cnVjdCBldGhfaGRyICopcC0+cGF5bG9hZDsKKworICBMV0lQX0FTU0VSVCgibmV0aWYtPmh3YWRkcl9sZW4gbXVzdCBiZSB0aGUgc2FtZSBhcyBFVEhBUlBfSFdBRERSX0xFTiBmb3IgZXRoYXJwISIsCisgICAgICAgICAgICAgIChuZXRpZi0+aHdhZGRyX2xlbiA9PSBFVEhBUlBfSFdBRERSX0xFTikpOworICBFVEhBRERSMzJfQ09QWSgmZXRoaGRyLT5kZXN0LCBkc3QpOworICBFVEhBRERSMTZfQ09QWSgmZXRoaGRyLT5zcmMsIHNyYyk7CisgIGV0aGhkci0+dHlwZSA9IFBQX0hUT05TKEVUSFRZUEVfSVApOworICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJldGhhcnBfc2VuZF9pcDogc2VuZGluZyBwYWNrZXQgJXBcbiIsICh2b2lkICopcCkpOworICAvKiBzZW5kIHRoZSBwYWNrZXQgKi8KKyAgcmV0dXJuIG5ldGlmLT5saW5rb3V0cHV0KG5ldGlmLCBwKTsKK30KKworLyoqCisgKiBVcGRhdGUgKG9yIGluc2VydCkgYSBJUC9NQUMgYWRkcmVzcyBwYWlyIGluIHRoZSBBUlAgY2FjaGUuCisgKgorICogSWYgYSBwZW5kaW5nIGVudHJ5IGlzIHJlc29sdmVkLCBhbnkgcXVldWVkIHBhY2tldHMgd2lsbCBiZSBzZW50CisgKiBhdCB0aGlzIHBvaW50LgorICogCisgKiBAcGFyYW0gbmV0aWYgbmV0aWYgcmVsYXRlZCB0byB0aGlzIGVudHJ5ICh1c2VkIGZvciBORVRJRl9BRERSSElOVCkKKyAqIEBwYXJhbSBpcGFkZHIgSVAgYWRkcmVzcyBvZiB0aGUgaW5zZXJ0ZWQgQVJQIGVudHJ5LgorICogQHBhcmFtIGV0aGFkZHIgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgaW5zZXJ0ZWQgQVJQIGVudHJ5LgorICogQHBhcmFtIGZsYWdzIEBzZWUgZGVmaW5pdGlvbiBvZiBFVEhBUlBfRkxBR18qCisgKgorICogQHJldHVybgorICogLSBFUlJfT0sgU3VjY2VzZnVsbHkgdXBkYXRlZCBBUlAgY2FjaGUuCisgKiAtIEVSUl9NRU0gSWYgd2UgY291bGQgbm90IGFkZCBhIG5ldyBBUlAgZW50cnkgd2hlbiBFVEhBUlBfRkxBR19UUllfSEFSRCB3YXMgc2V0LgorICogLSBFUlJfQVJHIE5vbi11bmljYXN0IGFkZHJlc3MgZ2l2ZW4sIHRob3NlIHdpbGwgbm90IGFwcGVhciBpbiBBUlAgY2FjaGUuCisgKgorICogQHNlZSBwYnVmX2ZyZWUoKQorICovCitzdGF0aWMgZXJyX3QKK3VwZGF0ZV9hcnBfZW50cnkoc3RydWN0IG5ldGlmICpuZXRpZiwgaXBfYWRkcl90ICppcGFkZHIsIHN0cnVjdCBldGhfYWRkciAqZXRoYWRkciwgdThfdCBmbGFncykKK3sKKyAgczhfdCBpOworICBMV0lQX0FTU0VSVCgibmV0aWYtPmh3YWRkcl9sZW4gPT0gRVRIQVJQX0hXQUREUl9MRU4iLCBuZXRpZi0+aHdhZGRyX2xlbiA9PSBFVEhBUlBfSFdBRERSX0xFTik7CisgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInVwZGF0ZV9hcnBfZW50cnk6ICUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiIC0gJTAyIlgxNl9GIjolMDIiWDE2X0YiOiUwMiJYMTZfRiI6JTAyIlgxNl9GIjolMDIiWDE2X0YiOiUwMiJYMTZfRiJcbiIsCisgICAgaXA0X2FkZHIxXzE2KGlwYWRkciksIGlwNF9hZGRyMl8xNihpcGFkZHIpLCBpcDRfYWRkcjNfMTYoaXBhZGRyKSwgaXA0X2FkZHI0XzE2KGlwYWRkciksCisgICAgZXRoYWRkci0+YWRkclswXSwgZXRoYWRkci0+YWRkclsxXSwgZXRoYWRkci0+YWRkclsyXSwKKyAgICBldGhhZGRyLT5hZGRyWzNdLCBldGhhZGRyLT5hZGRyWzRdLCBldGhhZGRyLT5hZGRyWzVdKSk7CisgIC8qIG5vbi11bmljYXN0IGFkZHJlc3M/ICovCisgIGlmIChpcF9hZGRyX2lzYW55KGlwYWRkcikgfHwKKyAgICAgIGlwX2FkZHJfaXNicm9hZGNhc3QoaXBhZGRyLCBuZXRpZikgfHwKKyAgICAgIGlwX2FkZHJfaXNtdWx0aWNhc3QoaXBhZGRyKSkgeworICAgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInVwZGF0ZV9hcnBfZW50cnk6IHdpbGwgbm90IGFkZCBub24tdW5pY2FzdCBJUCBhZGRyZXNzIHRvIEFSUCBjYWNoZVxuIikpOworICAgIHJldHVybiBFUlJfQVJHOworICB9CisgIC8qIGZpbmQgb3IgY3JlYXRlIEFSUCBlbnRyeSAqLworICBpID0gZmluZF9lbnRyeShpcGFkZHIsIGZsYWdzKTsKKyAgLyogYmFpbCBvdXQgaWYgbm8gZW50cnkgY291bGQgYmUgZm91bmQgKi8KKyAgaWYgKGkgPCAwKSB7CisgICAgcmV0dXJuIChlcnJfdClpOworICB9CisKKyNpZiBFVEhBUlBfU1VQUE9SVF9TVEFUSUNfRU5UUklFUworICBpZiAoZmxhZ3MgJiBFVEhBUlBfRkxBR19TVEFUSUNfRU5UUlkpIHsKKyAgICAvKiByZWNvcmQgc3RhdGljIHR5cGUgKi8KKyAgICBhcnBfdGFibGVbaV0uc3RhdGljX2VudHJ5ID0gMTsKKyAgfQorI2VuZGlmIC8qIEVUSEFSUF9TVVBQT1JUX1NUQVRJQ19FTlRSSUVTICovCisKKyAgLyogbWFyayBpdCBzdGFibGUgKi8KKyAgYXJwX3RhYmxlW2ldLnN0YXRlID0gRVRIQVJQX1NUQVRFX1NUQUJMRTsKKworI2lmIExXSVBfU05NUAorICAvKiByZWNvcmQgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgYXJwX3RhYmxlW2ldLm5ldGlmID0gbmV0aWY7CisjZW5kaWYgLyogTFdJUF9TTk1QICovCisgIC8qIGluc2VydCBpbiBTTk1QIEFSUCBpbmRleCB0cmVlICovCisgIHNubXBfaW5zZXJ0X2FycGlkeF90cmVlKG5ldGlmLCAmYXJwX3RhYmxlW2ldLmlwYWRkcik7CisKKyAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidXBkYXRlX2FycF9lbnRyeTogdXBkYXRpbmcgc3RhYmxlIGVudHJ5ICUiUzE2X0YiXG4iLCAoczE2X3QpaSkpOworICAvKiB1cGRhdGUgYWRkcmVzcyAqLworICBFVEhBRERSMzJfQ09QWSgmYXJwX3RhYmxlW2ldLmV0aGFkZHIsIGV0aGFkZHIpOworICAvKiByZXNldCB0aW1lIHN0YW1wICovCisgIGFycF90YWJsZVtpXS5jdGltZSA9IDA7CisgIC8qIHRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBzZW5kIG91dCBxdWV1ZWQgcGFja2V0cyEgKi8KKyNpZiBBUlBfUVVFVUVJTkcKKyAgd2hpbGUgKGFycF90YWJsZVtpXS5xICE9IE5VTEwpIHsKKyAgICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgICAvKiByZW1lbWJlciByZW1haW5kZXIgb2YgcXVldWUgKi8KKyAgICBzdHJ1Y3QgZXRoYXJwX3FfZW50cnkgKnEgPSBhcnBfdGFibGVbaV0ucTsKKyAgICAvKiBwb3AgZmlyc3QgaXRlbSBvZmYgdGhlIHF1ZXVlICovCisgICAgYXJwX3RhYmxlW2ldLnEgPSBxLT5uZXh0OworICAgIC8qIGdldCB0aGUgcGFja2V0IHBvaW50ZXIgKi8KKyAgICBwID0gcS0+cDsKKyAgICAvKiBub3cgcXVldWUgZW50cnkgY2FuIGJlIGZyZWVkICovCisgICAgbWVtcF9mcmVlKE1FTVBfQVJQX1FVRVVFLCBxKTsKKyNlbHNlIC8qIEFSUF9RVUVVRUlORyAqLworICBpZiAoYXJwX3RhYmxlW2ldLnEgIT0gTlVMTCkgeworICAgIHN0cnVjdCBwYnVmICpwID0gYXJwX3RhYmxlW2ldLnE7CisgICAgYXJwX3RhYmxlW2ldLnEgPSBOVUxMOworI2VuZGlmIC8qIEFSUF9RVUVVRUlORyAqLworICAgIC8qIHNlbmQgdGhlIHF1ZXVlZCBJUCBwYWNrZXQgKi8KKyAgICBldGhhcnBfc2VuZF9pcChuZXRpZiwgcCwgKHN0cnVjdCBldGhfYWRkciopKG5ldGlmLT5od2FkZHIpLCBldGhhZGRyKTsKKyAgICAvKiBmcmVlIHRoZSBxdWV1ZWQgSVAgcGFja2V0ICovCisgICAgcGJ1Zl9mcmVlKHApOworICB9CisgIHJldHVybiBFUlJfT0s7Cit9CisKKyNpZiBFVEhBUlBfU1VQUE9SVF9TVEFUSUNfRU5UUklFUworLyoqIEFkZCBhIG5ldyBzdGF0aWMgZW50cnkgdG8gdGhlIEFSUCB0YWJsZS4gSWYgYW4gZW50cnkgZXhpc3RzIGZvciB0aGUKKyAqIHNwZWNpZmllZCBJUCBhZGRyZXNzLCB0aGlzIGVudHJ5IGlzIG92ZXJ3cml0dGVuLgorICogSWYgcGFja2V0cyBhcmUgcXVldWVkIGZvciB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3MsIHRoZXkgYXJlIHNlbnQgb3V0LgorICoKKyAqIEBwYXJhbSBpcGFkZHIgSVAgYWRkcmVzcyBmb3IgdGhlIG5ldyBzdGF0aWMgZW50cnkKKyAqIEBwYXJhbSBldGhhZGRyIGV0aGVybmV0IGFkZHJlc3MgZm9yIHRoZSBuZXcgc3RhdGljIGVudHJ5CisgKiBAcmV0dXJuIEBzZWUgcmV0dXJuIHZhbHVlcyBvZiBldGhhcnBfYWRkX3N0YXRpY19lbnRyeQorICovCitlcnJfdAorZXRoYXJwX2FkZF9zdGF0aWNfZW50cnkoaXBfYWRkcl90ICppcGFkZHIsIHN0cnVjdCBldGhfYWRkciAqZXRoYWRkcikKK3sKKyAgc3RydWN0IG5ldGlmICpuZXRpZjsKKyAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZXRoYXJwX2FkZF9zdGF0aWNfZW50cnk6ICUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiLiUiVTE2X0YiIC0gJTAyIlgxNl9GIjolMDIiWDE2X0YiOiUwMiJYMTZfRiI6JTAyIlgxNl9GIjolMDIiWDE2X0YiOiUwMiJYMTZfRiJcbiIsCisgICAgaXA0X2FkZHIxXzE2KGlwYWRkciksIGlwNF9hZGRyMl8xNihpcGFkZHIpLCBpcDRfYWRkcjNfMTYoaXBhZGRyKSwgaXA0X2FkZHI0XzE2KGlwYWRkciksCisgICAgZXRoYWRkci0+YWRkclswXSwgZXRoYWRkci0+YWRkclsxXSwgZXRoYWRkci0+YWRkclsyXSwKKyAgICBldGhhZGRyLT5hZGRyWzNdLCBldGhhZGRyLT5hZGRyWzRdLCBldGhhZGRyLT5hZGRyWzVdKSk7CisKKyAgbmV0aWYgPSBpcF9yb3V0ZShpcGFkZHIpOworICBpZiAobmV0aWYgPT0gTlVMTCkgeworICAgIHJldHVybiBFUlJfUlRFOworICB9CisKKyAgcmV0dXJuIHVwZGF0ZV9hcnBfZW50cnkobmV0aWYsIGlwYWRkciwgZXRoYWRkciwgRVRIQVJQX0ZMQUdfVFJZX0hBUkQgfCBFVEhBUlBfRkxBR19TVEFUSUNfRU5UUlkpOworfQorCisvKiogUmVtb3ZlIGEgc3RhdGljIGVudHJ5IGZyb20gdGhlIEFSUCB0YWJsZSBwcmV2aW91c2x5IGFkZGVkIHdpdGggYSBjYWxsIHRvCisgKiBldGhhcnBfYWRkX3N0YXRpY19lbnRyeS4KKyAqCisgKiBAcGFyYW0gaXBhZGRyIElQIGFkZHJlc3Mgb2YgdGhlIHN0YXRpYyBlbnRyeSB0byByZW1vdmUKKyAqIEByZXR1cm4gRVJSX09LOiBlbnRyeSByZW1vdmVkCisgKiAgICAgICAgIEVSUl9NRU06IGVudHJ5IHdhc24ndCBmb3VuZAorICogICAgICAgICBFUlJfQVJHOiBlbnRyeSB3YXNuJ3QgYSBzdGF0aWMgZW50cnkgYnV0IGEgZHluYW1pYyBvbmUKKyAqLworZXJyX3QKK2V0aGFycF9yZW1vdmVfc3RhdGljX2VudHJ5KGlwX2FkZHJfdCAqaXBhZGRyKQoreworICBzOF90IGk7CisgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImV0aGFycF9yZW1vdmVfc3RhdGljX2VudHJ5OiAlIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIi4lIlUxNl9GIlxuIiwKKyAgICBpcDRfYWRkcjFfMTYoaXBhZGRyKSwgaXA0X2FkZHIyXzE2KGlwYWRkciksIGlwNF9hZGRyM18xNihpcGFkZHIpLCBpcDRfYWRkcjRfMTYoaXBhZGRyKSkpOworCisgIC8qIGZpbmQgb3IgY3JlYXRlIEFSUCBlbnRyeSAqLworICBpID0gZmluZF9lbnRyeShpcGFkZHIsIEVUSEFSUF9GTEFHX0ZJTkRfT05MWSk7CisgIC8qIGJhaWwgb3V0IGlmIG5vIGVudHJ5IGNvdWxkIGJlIGZvdW5kICovCisgIGlmIChpIDwgMCkgeworICAgIHJldHVybiAoZXJyX3QpaTsKKyAgfQorCisgIGlmICgoYXJwX3RhYmxlW2ldLnN0YXRlICE9IEVUSEFSUF9TVEFURV9TVEFCTEUpIHx8CisgICAgKGFycF90YWJsZVtpXS5zdGF0aWNfZW50cnkgPT0gMCkpIHsKKyAgICAvKiBlbnRyeSB3YXNuJ3QgYSBzdGF0aWMgZW50cnksIGNhbm5vdCByZW1vdmUgaXQgKi8KKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorICAvKiBlbnRyeSBmb3VuZCwgZnJlZSBpdCAqLworICBmcmVlX2VudHJ5KGkpOworICByZXR1cm4gRVJSX09LOworfQorI2VuZGlmIC8qIEVUSEFSUF9TVVBQT1JUX1NUQVRJQ19FTlRSSUVTICovCisKKy8qKgorICogRmluZHMgKHN0YWJsZSkgZXRoZXJuZXQvSVAgYWRkcmVzcyBwYWlyIGZyb20gQVJQIHRhYmxlCisgKiB1c2luZyBpbnRlcmZhY2UgYW5kIElQIGFkZHJlc3MgaW5kZXguCisgKiBAbm90ZSB0aGUgYWRkcmVzc2VzIGluIHRoZSBBUlAgdGFibGUgYXJlIGluIG5ldHdvcmsgb3JkZXIhCisgKgorICogQHBhcmFtIG5ldGlmIHBvaW50cyB0byBpbnRlcmZhY2UgaW5kZXgKKyAqIEBwYXJhbSBpcGFkZHIgcG9pbnRzIHRvIHRoZSAobmV0d29yayBvcmRlcikgSVAgYWRkcmVzcyBpbmRleAorICogQHBhcmFtIGV0aF9yZXQgcG9pbnRzIHRvIHJldHVybiBwb2ludGVyCisgKiBAcGFyYW0gaXBfcmV0IHBvaW50cyB0byByZXR1cm4gcG9pbnRlcgorICogQHJldHVybiB0YWJsZSBpbmRleCBpZiBmb3VuZCwgLTEgb3RoZXJ3aXNlCisgKi8KK3M4X3QKK2V0aGFycF9maW5kX2FkZHIoc3RydWN0IG5ldGlmICpuZXRpZiwgaXBfYWRkcl90ICppcGFkZHIsCisgICAgICAgICBzdHJ1Y3QgZXRoX2FkZHIgKipldGhfcmV0LCBpcF9hZGRyX3QgKippcF9yZXQpCit7CisgIHM4X3QgaTsKKworICBMV0lQX0FTU0VSVCgiZXRoX3JldCAhPSBOVUxMICYmIGlwX3JldCAhPSBOVUxMIiwKKyAgICBldGhfcmV0ICE9IE5VTEwgJiYgaXBfcmV0ICE9IE5VTEwpOworCisgIExXSVBfVU5VU0VEX0FSRyhuZXRpZik7CisKKyAgaSA9IGZpbmRfZW50cnkoaXBhZGRyLCBFVEhBUlBfRkxBR19GSU5EX09OTFkpOworICBpZigoaSA+PSAwKSAmJiBhcnBfdGFibGVbaV0uc3RhdGUgPT0gRVRIQVJQX1NUQVRFX1NUQUJMRSkgeworICAgICAgKmV0aF9yZXQgPSAmYXJwX3RhYmxlW2ldLmV0aGFkZHI7CisgICAgICAqaXBfcmV0ID0gJmFycF90YWJsZVtpXS5pcGFkZHI7CisgICAgICByZXR1cm4gaTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKKyNpZiBFVEhBUlBfVFJVU1RfSVBfTUFDCisvKioKKyAqIFVwZGF0ZXMgdGhlIEFSUCB0YWJsZSB1c2luZyB0aGUgZ2l2ZW4gSVAgcGFja2V0LgorICoKKyAqIFVzZXMgdGhlIGluY29taW5nIElQIHBhY2tldCdzIHNvdXJjZSBhZGRyZXNzIHRvIHVwZGF0ZSB0aGUKKyAqIEFSUCBjYWNoZSBmb3IgdGhlIGxvY2FsIG5ldHdvcmsuIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBhbHRlcgorICogb3IgZnJlZSB0aGUgcGFja2V0LiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUKKyAqIHBhY2tldCBwIGlzIHBhc3NlZCB0byB0aGUgSVAgbGF5ZXIuCisgKgorICogQHBhcmFtIG5ldGlmIFRoZSBsd0lQIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBJUCBwYWNrZXQgcGJ1ZiBhcnJpdmVkLgorICogQHBhcmFtIHAgVGhlIElQIHBhY2tldCB0aGF0IGFycml2ZWQgb24gbmV0aWYuCisgKgorICogQHJldHVybiBOVUxMCisgKgorICogQHNlZSBwYnVmX2ZyZWUoKQorICovCitzdGF0aWMgdm9pZAorZXRoYXJwX2lwX2lucHV0KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwKQoreworICBzdHJ1Y3QgZXRoX2hkciAqZXRoaGRyOworICBzdHJ1Y3QgaXBfaGRyICppcGhkcjsKKyAgaXBfYWRkcl90IGlwaGRyX3NyYzsKKyAgTFdJUF9FUlJPUigibmV0aWYgIT0gTlVMTCIsIChuZXRpZiAhPSBOVUxMKSwgcmV0dXJuOyk7CisKKyAgLyogT25seSBpbnNlcnQgYW4gZW50cnkgaWYgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIG9mIHRoZQorICAgICBpbmNvbWluZyBJUCBwYWNrZXQgY29tZXMgZnJvbSBhIGhvc3Qgb24gdGhlIGxvY2FsIG5ldHdvcmsuICovCisgIGV0aGhkciA9IChzdHJ1Y3QgZXRoX2hkciAqKXAtPnBheWxvYWQ7CisgIGlwaGRyID0gKHN0cnVjdCBpcF9oZHIgKikoKHU4X3QqKWV0aGhkciArIFNJWkVPRl9FVEhfSERSKTsKKyNpZiBFVEhBUlBfU1VQUE9SVF9WTEFOCisgIGlmIChldGhoZHItPnR5cGUgPT0gUFBfSFRPTlMoRVRIVFlQRV9WTEFOKSkgeworICAgIGlwaGRyID0gKHN0cnVjdCBpcF9oZHIgKikoKHU4X3QqKWV0aGhkciArIFNJWkVPRl9FVEhfSERSICsgU0laRU9GX1ZMQU5fSERSKTsKKyAgfQorI2VuZGlmIC8qIEVUSEFSUF9TVVBQT1JUX1ZMQU4gKi8KKworICBpcF9hZGRyX2NvcHkoaXBoZHJfc3JjLCBpcGhkci0+c3JjKTsKKworICAvKiBzb3VyY2UgaXMgbm90IG9uIHRoZSBsb2NhbCBuZXR3b3JrPyAqLworICBpZiAoIWlwX2FkZHJfbmV0Y21wKCZpcGhkcl9zcmMsICYobmV0aWYtPmlwX2FkZHIpLCAmKG5ldGlmLT5uZXRtYXNrKSkpIHsKKyAgICAvKiBkbyBub3RoaW5nICovCisgICAgcmV0dXJuOworICB9CisKKyAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZXRoYXJwX2lwX2lucHV0OiB1cGRhdGluZyBFVEhBUlAgdGFibGUuXG4iKSk7CisgIC8qIHVwZGF0ZSB0aGUgc291cmNlIElQIGFkZHJlc3MgaW4gdGhlIGNhY2hlLCBpZiBwcmVzZW50ICovCisgIC8qIEB0b2RvIFdlIGNvdWxkIHVzZSBFVEhBUlBfRkxBR19UUllfSEFSRCBpZiB3ZSB0aGluayB3ZSBhcmUgZ29pbmcgdG8gdGFsaworICAgKiBiYWNrIHNvb24gKGZvciBleGFtcGxlLCBpZiB0aGUgZGVzdGluYXRpb24gSVAgYWRkcmVzcyBpcyBvdXJzLiAqLworICB1cGRhdGVfYXJwX2VudHJ5KG5ldGlmLCAmaXBoZHJfc3JjLCAmKGV0aGhkci0+c3JjKSwgRVRIQVJQX0ZMQUdfRklORF9PTkxZKTsKK30KKyNlbmRpZiAvKiBFVEhBUlBfVFJVU1RfSVBfTUFDICovCisKKy8qKgorICogUmVzcG9uZHMgdG8gQVJQIHJlcXVlc3RzIHRvIHVzLiBVcG9uIEFSUCByZXBsaWVzIHRvIHVzLCBhZGQgZW50cnkgdG8gY2FjaGUgIAorICogc2VuZCBvdXQgcXVldWVkIElQIHBhY2tldHMuIFVwZGF0ZXMgY2FjaGUgd2l0aCBzbm9vcGVkIGFkZHJlc3MgcGFpcnMuCisgKgorICogU2hvdWxkIGJlIGNhbGxlZCBmb3IgaW5jb21pbmcgQVJQIHBhY2tldHMuIFRoZSBwYnVmIGluIHRoZSBhcmd1bWVudAorICogaXMgZnJlZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gbmV0aWYgVGhlIGx3SVAgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIEFSUCBwYWNrZXQgcGJ1ZiBhcnJpdmVkLgorICogQHBhcmFtIGV0aGFkZHIgRXRoZXJuZXQgYWRkcmVzcyBvZiBuZXRpZi4KKyAqIEBwYXJhbSBwIFRoZSBBUlAgcGFja2V0IHRoYXQgYXJyaXZlZCBvbiBuZXRpZi4gSXMgZnJlZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcmV0dXJuIE5VTEwKKyAqCisgKiBAc2VlIHBidWZfZnJlZSgpCisgKi8KK3N0YXRpYyB2b2lkCitldGhhcnBfYXJwX2lucHV0KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBldGhfYWRkciAqZXRoYWRkciwgc3RydWN0IHBidWYgKnApCit7CisgIHN0cnVjdCBldGhhcnBfaGRyICpoZHI7CisgIHN0cnVjdCBldGhfaGRyICpldGhoZHI7CisgIC8qIHRoZXNlIGFyZSBhbGlnbmVkIHByb3Blcmx5LCB3aGVyZWFzIHRoZSBBUlAgaGVhZGVyIGZpZWxkcyBtaWdodCBub3QgYmUgKi8KKyAgaXBfYWRkcl90IHNpcGFkZHIsIGRpcGFkZHI7CisgIHU4X3QgZm9yX3VzOworI2lmIExXSVBfQVVUT0lQCisgIGNvbnN0IHU4X3QgKiBldGhkc3RfaHdhZGRyOworI2VuZGlmIC8qIExXSVBfQVVUT0lQICovCisKKyAgTFdJUF9FUlJPUigibmV0aWYgIT0gTlVMTCIsIChuZXRpZiAhPSBOVUxMKSwgcmV0dXJuOyk7CisKKyAgLyogZHJvcCBzaG9ydCBBUlAgcGFja2V0czogd2UgaGF2ZSB0byBjaGVjayBmb3IgcC0+bGVuIGluc3RlYWQgb2YgcC0+dG90X2xlbiBoZXJlCisgICAgIHNpbmNlIGEgc3RydWN0IGV0aGFycF9oZHIgaXMgcG9pbnRlZCB0byBwLT5wYXlsb2FkLCBzbyBpdCBtdXNuJ3QgYmUgY2hhaW5lZCEgKi8KKyAgaWYgKHAtPmxlbiA8IFNJWkVPRl9FVEhBUlBfUEFDS0VUKSB7CisgICAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9XQVJOSU5HLAorICAgICAgKCJldGhhcnBfYXJwX2lucHV0OiBwYWNrZXQgZHJvcHBlZCwgdG9vIHNob3J0ICglIlMxNl9GIi8lIlMxNl9GIilcbiIsIHAtPnRvdF9sZW4sCisgICAgICAoczE2X3QpU0laRU9GX0VUSEFSUF9QQUNLRVQpKTsKKyAgICBFVEhBUlBfU1RBVFNfSU5DKGV0aGFycC5sZW5lcnIpOworICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLmRyb3ApOworICAgIHBidWZfZnJlZShwKTsKKyAgICByZXR1cm47CisgIH0KKworICBldGhoZHIgPSAoc3RydWN0IGV0aF9oZHIgKilwLT5wYXlsb2FkOworICBoZHIgPSAoc3RydWN0IGV0aGFycF9oZHIgKikoKHU4X3QqKWV0aGhkciArIFNJWkVPRl9FVEhfSERSKTsKKyNpZiBFVEhBUlBfU1VQUE9SVF9WTEFOCisgIGlmIChldGhoZHItPnR5cGUgPT0gUFBfSFRPTlMoRVRIVFlQRV9WTEFOKSkgeworICAgIGhkciA9IChzdHJ1Y3QgZXRoYXJwX2hkciAqKSgoKHU4X3QqKWV0aGhkcikgKyBTSVpFT0ZfRVRIX0hEUiArIFNJWkVPRl9WTEFOX0hEUik7CisgIH0KKyNlbmRpZiAvKiBFVEhBUlBfU1VQUE9SVF9WTEFOICovCisKKyAgLyogUkZDIDgyNiAiUGFja2V0IFJlY2VwdGlvbiI6ICovCisgIGlmICgoaGRyLT5od3R5cGUgIT0gUFBfSFRPTlMoSFdUWVBFX0VUSEVSTkVUKSkgfHwKKyAgICAgIChoZHItPmh3bGVuICE9IEVUSEFSUF9IV0FERFJfTEVOKSB8fAorICAgICAgKGhkci0+cHJvdG9sZW4gIT0gc2l6ZW9mKGlwX2FkZHJfdCkpIHx8CisgICAgICAoaGRyLT5wcm90byAhPSBQUF9IVE9OUyhFVEhUWVBFX0lQKSkpICB7CisgICAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9XQVJOSU5HLAorICAgICAgKCJldGhhcnBfYXJwX2lucHV0OiBwYWNrZXQgZHJvcHBlZCwgd3JvbmcgaHcgdHlwZSwgaHdsZW4sIHByb3RvLCBwcm90b2xlbiBvciBldGhlcm5ldCB0eXBlICglIlUxNl9GIi8lIlUxNl9GIi8lIlUxNl9GIi8lIlUxNl9GIilcbiIsCisgICAgICBoZHItPmh3dHlwZSwgaGRyLT5od2xlbiwgaGRyLT5wcm90bywgaGRyLT5wcm90b2xlbikpOworICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLnByb3RlcnIpOworICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLmRyb3ApOworICAgIHBidWZfZnJlZShwKTsKKyAgICByZXR1cm47CisgIH0KKyAgRVRIQVJQX1NUQVRTX0lOQyhldGhhcnAucmVjdik7CisKKyNpZiBMV0lQX0FVVE9JUAorICAvKiBXZSBoYXZlIHRvIGNoZWNrIGlmIGEgaG9zdCBhbHJlYWR5IGhhcyBjb25maWd1cmVkIG91ciByYW5kb20KKyAgICogY3JlYXRlZCBsaW5rIGxvY2FsIGFkZHJlc3MgYW5kIGNvbnRpbm91c2x5IGNoZWNrIGlmIHRoZXJlIGlzCisgICAqIGEgaG9zdCB3aXRoIHRoaXMgSVAtYWRkcmVzcyBzbyB3ZSBjYW4gZGV0ZWN0IGNvbGxpc2lvbnMgKi8KKyAgYXV0b2lwX2FycF9yZXBseShuZXRpZiwgaGRyKTsKKyNlbmRpZiAvKiBMV0lQX0FVVE9JUCAqLworCisgIC8qIENvcHkgc3RydWN0IGlwX2FkZHIyIHRvIGFsaWduZWQgaXBfYWRkciwgdG8gc3VwcG9ydCBjb21waWxlcnMgd2l0aG91dAorICAgKiBzdHJ1Y3R1cmUgcGFja2luZyAobm90IHVzaW5nIHN0cnVjdHVyZSBjb3B5IHdoaWNoIGJyZWFrcyBzdHJpY3QtYWxpYXNpbmcgcnVsZXMpLiAqLworICBJUEFERFIyX0NPUFkoJnNpcGFkZHIsICZoZHItPnNpcGFkZHIpOworICBJUEFERFIyX0NPUFkoJmRpcGFkZHIsICZoZHItPmRpcGFkZHIpOworCisgIC8qIHRoaXMgaW50ZXJmYWNlIGlzIG5vdCBjb25maWd1cmVkPyAqLworICBpZiAoaXBfYWRkcl9pc2FueSgmbmV0aWYtPmlwX2FkZHIpKSB7CisgICAgZm9yX3VzID0gMDsKKyAgfSBlbHNlIHsKKyAgICAvKiBBUlAgcGFja2V0IGRpcmVjdGVkIHRvIHVzPyAqLworICAgIGZvcl91cyA9ICh1OF90KWlwX2FkZHJfY21wKCZkaXBhZGRyLCAmKG5ldGlmLT5pcF9hZGRyKSk7CisgIH0KKworICAvKiBBUlAgbWVzc2FnZSBkaXJlY3RlZCB0byB1cz8KKyAgICAgIC0+IGFkZCBJUCBhZGRyZXNzIGluIEFSUCBjYWNoZTsgYXNzdW1lIHJlcXVlc3RlciB3YW50cyB0byB0YWxrIHRvIHVzLAorICAgICAgICAgY2FuIHJlc3VsdCBpbiBkaXJlY3RseSBzZW5kaW5nIHRoZSBxdWV1ZWQgcGFja2V0cyBmb3IgdGhpcyBob3N0LgorICAgICBBUlAgbWVzc2FnZSBub3QgZGlyZWN0ZWQgdG8gdXM/CisgICAgICAtPiAgdXBkYXRlIHRoZSBzb3VyY2UgSVAgYWRkcmVzcyBpbiB0aGUgY2FjaGUsIGlmIHByZXNlbnQgKi8KKyAgdXBkYXRlX2FycF9lbnRyeShuZXRpZiwgJnNpcGFkZHIsICYoaGRyLT5zaHdhZGRyKSwKKyAgICAgICAgICAgICAgICAgICBmb3JfdXMgPyBFVEhBUlBfRkxBR19UUllfSEFSRCA6IEVUSEFSUF9GTEFHX0ZJTkRfT05MWSk7CisKKyAgLyogbm93IGFjdCBvbiB0aGUgbWVzc2FnZSBpdHNlbGYgKi8KKyAgc3dpdGNoIChoZHItPm9wY29kZSkgeworICAvKiBBUlAgcmVxdWVzdD8gKi8KKyAgY2FzZSBQUF9IVE9OUyhBUlBfUkVRVUVTVCk6CisgICAgLyogQVJQIHJlcXVlc3QuIElmIGl0IGFza2VkIGZvciBvdXIgYWRkcmVzcywgd2Ugc2VuZCBvdXQgYQorICAgICAqIHJlcGx5LiBJbiBhbnkgY2FzZSwgd2UgdGltZS1zdGFtcCBhbnkgZXhpc3RpbmcgQVJQIGVudHJ5LAorICAgICAqIGFuZCBwb3NzaWJ5IHNlbmQgb3V0IGFuIElQIHBhY2tldCB0aGF0IHdhcyBxdWV1ZWQgb24gaXQuICovCisKKyAgICBMV0lQX0RFQlVHRiAoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZXRoYXJwX2FycF9pbnB1dDogaW5jb21pbmcgQVJQIHJlcXVlc3RcbiIpKTsKKyAgICAvKiBBUlAgcmVxdWVzdCBmb3Igb3VyIGFkZHJlc3M/ICovCisgICAgaWYgKGZvcl91cykgeworCisgICAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJldGhhcnBfYXJwX2lucHV0OiByZXBseWluZyB0byBBUlAgcmVxdWVzdCBmb3Igb3VyIElQIGFkZHJlc3NcbiIpKTsKKyAgICAgIC8qIFJlLXVzZSBwYnVmIHRvIHNlbmQgQVJQIHJlcGx5LgorICAgICAgICAgU2luY2Ugd2UgYXJlIHJlLXVzaW5nIGFuIGV4aXN0aW5nIHBidWYsIHdlIGNhbid0IGNhbGwgZXRoYXJwX3JhdyBzaW5jZQorICAgICAgICAgdGhhdCB3b3VsZCBhbGxvY2F0ZSBhIG5ldyBwYnVmLiAqLworICAgICAgaGRyLT5vcGNvZGUgPSBodG9ucyhBUlBfUkVQTFkpOworCisgICAgICBJUEFERFIyX0NPUFkoJmhkci0+ZGlwYWRkciwgJmhkci0+c2lwYWRkcik7CisgICAgICBJUEFERFIyX0NPUFkoJmhkci0+c2lwYWRkciwgJm5ldGlmLT5pcF9hZGRyKTsKKworICAgICAgTFdJUF9BU1NFUlQoIm5ldGlmLT5od2FkZHJfbGVuIG11c3QgYmUgdGhlIHNhbWUgYXMgRVRIQVJQX0hXQUREUl9MRU4gZm9yIGV0aGFycCEiLAorICAgICAgICAgICAgICAgICAgKG5ldGlmLT5od2FkZHJfbGVuID09IEVUSEFSUF9IV0FERFJfTEVOKSk7CisjaWYgTFdJUF9BVVRPSVAKKyAgICAgIC8qIElmIHdlIGFyZSB1c2luZyBMaW5rLUxvY2FsLCBhbGwgQVJQIHBhY2tldHMgdGhhdCBjb250YWluIGEgTGluay1Mb2NhbAorICAgICAgICogJ3NlbmRlciBJUCBhZGRyZXNzJyBNVVNUIGJlIHNlbnQgdXNpbmcgbGluay1sYXllciBicm9hZGNhc3QgaW5zdGVhZCBvZgorICAgICAgICogbGluay1sYXllciB1bmljYXN0LiAoU2VlIFJGQzM5MjcgU2VjdGlvbiAyLjUsIGxhc3QgcGFyYWdyYXBoKSAqLworICAgICAgZXRoZHN0X2h3YWRkciA9IGlwX2FkZHJfaXNsaW5rbG9jYWwoJm5ldGlmLT5pcF9hZGRyKSA/ICh1OF90KikoZXRoYnJvYWRjYXN0LmFkZHIpIDogaGRyLT5zaHdhZGRyLmFkZHI7CisjZW5kaWYgLyogTFdJUF9BVVRPSVAgKi8KKworICAgICAgRVRIQUREUjE2X0NPUFkoJmhkci0+ZGh3YWRkciwgJmhkci0+c2h3YWRkcik7CisjaWYgTFdJUF9BVVRPSVAKKyAgICAgIEVUSEFERFIxNl9DT1BZKCZldGhoZHItPmRlc3QsIGV0aGRzdF9od2FkZHIpOworI2Vsc2UgIC8qIExXSVBfQVVUT0lQICovCisgICAgICBFVEhBRERSMTZfQ09QWSgmZXRoaGRyLT5kZXN0LCAmaGRyLT5zaHdhZGRyKTsKKyNlbmRpZiAvKiBMV0lQX0FVVE9JUCAqLworICAgICAgRVRIQUREUjE2X0NPUFkoJmhkci0+c2h3YWRkciwgZXRoYWRkcik7CisgICAgICBFVEhBRERSMTZfQ09QWSgmZXRoaGRyLT5zcmMsIGV0aGFkZHIpOworCisgICAgICAvKiBod3R5cGUsIGh3YWRkcl9sZW4sIHByb3RvLCBwcm90b2xlbiBhbmQgdGhlIHR5cGUgaW4gdGhlIGV0aGVybmV0IGhlYWRlcgorICAgICAgICAgYXJlIGFscmVhZHkgY29ycmVjdCwgd2UgdGVzdGVkIHRoYXQgYmVmb3JlICovCisKKyAgICAgIC8qIHJldHVybiBBUlAgcmVwbHkgKi8KKyAgICAgIG5ldGlmLT5saW5rb3V0cHV0KG5ldGlmLCBwKTsKKyAgICAvKiB3ZSBhcmUgbm90IGNvbmZpZ3VyZWQ/ICovCisgICAgfSBlbHNlIGlmIChpcF9hZGRyX2lzYW55KCZuZXRpZi0+aXBfYWRkcikpIHsKKyAgICAgIC8qIHsgZm9yX3VzID09IDAgYW5kIG5ldGlmLT5pcF9hZGRyLmFkZHIgPT0gMCB9ICovCisgICAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJldGhhcnBfYXJwX2lucHV0OiB3ZSBhcmUgdW5jb25maWd1cmVkLCBBUlAgcmVxdWVzdCBpZ25vcmVkLlxuIikpOworICAgIC8qIHJlcXVlc3Qgd2FzIG5vdCBkaXJlY3RlZCB0byB1cyAqLworICAgIH0gZWxzZSB7CisgICAgICAvKiB7IGZvcl91cyA9PSAwIGFuZCBuZXRpZi0+aXBfYWRkci5hZGRyICE9IDAgfSAqLworICAgICAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZXRoYXJwX2FycF9pbnB1dDogQVJQIHJlcXVlc3Qgd2FzIG5vdCBmb3IgdXMuXG4iKSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFBQX0hUT05TKEFSUF9SRVBMWSk6CisgICAgLyogQVJQIHJlcGx5LiBXZSBhbHJlYWR5IHVwZGF0ZWQgdGhlIEFSUCBjYWNoZSBlYXJsaWVyLiAqLworICAgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImV0aGFycF9hcnBfaW5wdXQ6IGluY29taW5nIEFSUCByZXBseVxuIikpOworI2lmIChMV0lQX0RIQ1AgJiYgREhDUF9ET0VTX0FSUF9DSEVDSykKKyAgICAvKiBESENQIHdhbnRzIHRvIGtub3cgYWJvdXQgQVJQIHJlcGxpZXMgZnJvbSBhbnkgaG9zdCB3aXRoIGFuCisgICAgICogSVAgYWRkcmVzcyBhbHNvIG9mZmVyZWQgdG8gdXMgYnkgdGhlIERIQ1Agc2VydmVyLiBXZSBkbyBub3QKKyAgICAgKiB3YW50IHRvIHRha2UgYSBkdXBsaWNhdGUgSVAgYWRkcmVzcyBvbiBhIHNpbmdsZSBuZXR3b3JrLgorICAgICAqIEB0b2RvIEhvdyBzaG91bGQgd2UgaGFuZGxlIHJlZHVuZGFudCAoZmFpbC1vdmVyKSBpbnRlcmZhY2VzPyAqLworICAgIGRoY3BfYXJwX3JlcGx5KG5ldGlmLCAmc2lwYWRkcik7CisjZW5kaWYgLyogKExXSVBfREhDUCAmJiBESENQX0RPRVNfQVJQX0NIRUNLKSAqLworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImV0aGFycF9hcnBfaW5wdXQ6IEFSUCB1bmtub3duIG9wY29kZSB0eXBlICUiUzE2X0YiXG4iLCBodG9ucyhoZHItPm9wY29kZSkpKTsKKyAgICBFVEhBUlBfU1RBVFNfSU5DKGV0aGFycC5lcnIpOworICAgIGJyZWFrOworICB9CisgIC8qIGZyZWUgQVJQIHBhY2tldCAqLworICBwYnVmX2ZyZWUocCk7Cit9CisKKy8qKgorICogUmVzb2x2ZSBhbmQgZmlsbC1pbiBFdGhlcm5ldCBhZGRyZXNzIGhlYWRlciBmb3Igb3V0Z29pbmcgSVAgcGFja2V0LgorICoKKyAqIEZvciBJUCBtdWx0aWNhc3QgYW5kIGJyb2FkY2FzdCwgY29ycmVzcG9uZGluZyBFdGhlcm5ldCBhZGRyZXNzZXMKKyAqIGFyZSBzZWxlY3RlZCBhbmQgdGhlIHBhY2tldCBpcyB0cmFuc21pdHRlZCBvbiB0aGUgbGluay4KKyAqCisgKiBGb3IgdW5pY2FzdCBhZGRyZXNzZXMsIHRoZSBwYWNrZXQgaXMgc3VibWl0dGVkIHRvIGV0aGFycF9xdWVyeSgpLiBJbgorICogY2FzZSB0aGUgSVAgYWRkcmVzcyBpcyBvdXRzaWRlIHRoZSBsb2NhbCBuZXR3b3JrLCB0aGUgSVAgYWRkcmVzcyBvZgorICogdGhlIGdhdGV3YXkgaXMgdXNlZC4KKyAqCisgKiBAcGFyYW0gbmV0aWYgVGhlIGx3SVAgbmV0d29yayBpbnRlcmZhY2Ugd2hpY2ggdGhlIElQIHBhY2tldCB3aWxsIGJlIHNlbnQgb24uCisgKiBAcGFyYW0gcSBUaGUgcGJ1ZihzKSBjb250YWluaW5nIHRoZSBJUCBwYWNrZXQgdG8gYmUgc2VudC4KKyAqIEBwYXJhbSBpcGFkZHIgVGhlIElQIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCBkZXN0aW5hdGlvbi4KKyAqCisgKiBAcmV0dXJuCisgKiAtIEVSUl9SVEUgTm8gcm91dGUgdG8gZGVzdGluYXRpb24gKG5vIGdhdGV3YXkgdG8gZXh0ZXJuYWwgbmV0d29ya3MpLAorICogb3IgdGhlIHJldHVybiB0eXBlIG9mIGVpdGhlciBldGhhcnBfcXVlcnkoKSBvciBldGhhcnBfc2VuZF9pcCgpLgorICovCitlcnJfdAorZXRoYXJwX291dHB1dChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBzdHJ1Y3QgcGJ1ZiAqcSwgaXBfYWRkcl90ICppcGFkZHIpCit7CisgIHN0cnVjdCBldGhfYWRkciAqZGVzdCwgbWNhc3RhZGRyOworCisgIC8qIG1ha2Ugcm9vbSBmb3IgRXRoZXJuZXQgaGVhZGVyIC0gc2hvdWxkIG5vdCBmYWlsICovCisgIGlmIChwYnVmX2hlYWRlcihxLCBzaXplb2Yoc3RydWN0IGV0aF9oZHIpKSAhPSAwKSB7CisgICAgLyogYmFpbCBvdXQgKi8KKyAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX0xFVkVMX1NFUklPVVMsCisgICAgICAoImV0aGFycF9vdXRwdXQ6IGNvdWxkIG5vdCBhbGxvY2F0ZSByb29tIGZvciBoZWFkZXIuXG4iKSk7CisgICAgTElOS19TVEFUU19JTkMobGluay5sZW5lcnIpOworICAgIHJldHVybiBFUlJfQlVGOworICB9CisKKyAgLyogYXNzdW1lIHVucmVzb2x2ZWQgRXRoZXJuZXQgYWRkcmVzcyAqLworICBkZXN0ID0gTlVMTDsKKyAgLyogRGV0ZXJtaW5lIG9uIGRlc3RpbmF0aW9uIGhhcmR3YXJlIGFkZHJlc3MuIEJyb2FkY2FzdHMgYW5kIG11bHRpY2FzdHMKKyAgICogYXJlIHNwZWNpYWwsIG90aGVyIElQIGFkZHJlc3NlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBBUlAgdGFibGUuICovCisKKyAgLyogYnJvYWRjYXN0IGRlc3RpbmF0aW9uIElQIGFkZHJlc3M/ICovCisgIGlmIChpcF9hZGRyX2lzYnJvYWRjYXN0KGlwYWRkciwgbmV0aWYpKSB7CisgICAgLyogYnJvYWRjYXN0IG9uIEV0aGVybmV0IGFsc28gKi8KKyAgICBkZXN0ID0gKHN0cnVjdCBldGhfYWRkciAqKSZldGhicm9hZGNhc3Q7CisgIC8qIG11bHRpY2FzdCBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzPyAqLworICB9IGVsc2UgaWYgKGlwX2FkZHJfaXNtdWx0aWNhc3QoaXBhZGRyKSkgeworICAgIC8qIEhhc2ggSVAgbXVsdGljYXN0IGFkZHJlc3MgdG8gTUFDIGFkZHJlc3MuKi8KKyAgICBtY2FzdGFkZHIuYWRkclswXSA9IDB4MDE7CisgICAgbWNhc3RhZGRyLmFkZHJbMV0gPSAweDAwOworICAgIG1jYXN0YWRkci5hZGRyWzJdID0gMHg1ZTsKKyAgICBtY2FzdGFkZHIuYWRkclszXSA9IGlwNF9hZGRyMihpcGFkZHIpICYgMHg3ZjsKKyAgICBtY2FzdGFkZHIuYWRkcls0XSA9IGlwNF9hZGRyMyhpcGFkZHIpOworICAgIG1jYXN0YWRkci5hZGRyWzVdID0gaXA0X2FkZHI0KGlwYWRkcik7CisgICAgLyogZGVzdGluYXRpb24gRXRoZXJuZXQgYWRkcmVzcyBpcyBtdWx0aWNhc3QgKi8KKyAgICBkZXN0ID0gJm1jYXN0YWRkcjsKKyAgLyogdW5pY2FzdCBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzPyAqLworICB9IGVsc2UgeworICAgIC8qIG91dHNpZGUgbG9jYWwgbmV0d29yaz8gKi8KKyAgICBpZiAoIWlwX2FkZHJfbmV0Y21wKGlwYWRkciwgJihuZXRpZi0+aXBfYWRkciksICYobmV0aWYtPm5ldG1hc2spKSAmJgorICAgICAgICAhaXBfYWRkcl9pc2xpbmtsb2NhbChpcGFkZHIpKSB7CisjaWYgTFdJUF9BVVRPSVAKKyAgICAgIHN0cnVjdCBpcF9oZHIgKmlwaGRyID0gKHN0cnVjdCBpcF9oZHIqKSgodThfdCopcS0+cGF5bG9hZCArCisgICAgICAgIHNpemVvZihzdHJ1Y3QgZXRoX2hkcikpOworICAgICAgLyogQWNjb3JkaW5nIHRvIFJGQyAzMjk3LCBjaGFwdGVyIDIuNi4yIChGb3J3YXJkaW5nIFJ1bGVzKSwgYSBwYWNrZXQgd2l0aAorICAgICAgICAgYSBsaW5rLWxvY2FsIHNvdXJjZSBhZGRyZXNzIG11c3QgYWx3YXlzIGJlICJkaXJlY3RseSB0byBpdHMgZGVzdGluYXRpb24KKyAgICAgICAgIG9uIHRoZSBzYW1lIHBoeXNpY2FsIGxpbmsuIFRoZSBob3N0IE1VU1QgTk9UIHNlbmQgdGhlIHBhY2tldCB0byBhbnkKKyAgICAgICAgIHJvdXRlciBmb3IgZm9yd2FyZGluZyIuICovCisgICAgICBpZiAoIWlwX2FkZHJfaXNsaW5rbG9jYWwoJmlwaGRyLT5zcmMpKQorI2VuZGlmIC8qIExXSVBfQVVUT0lQICovCisgICAgICB7CisgICAgICAgIC8qIGludGVyZmFjZSBoYXMgZGVmYXVsdCBnYXRld2F5PyAqLworICAgICAgICBpZiAoIWlwX2FkZHJfaXNhbnkoJm5ldGlmLT5ndykpIHsKKyAgICAgICAgICAvKiBzZW5kIHRvIGhhcmR3YXJlIGFkZHJlc3Mgb2YgZGVmYXVsdCBnYXRld2F5IElQIGFkZHJlc3MgKi8KKyAgICAgICAgICBpcGFkZHIgPSAmKG5ldGlmLT5ndyk7CisgICAgICAgIC8qIG5vIGRlZmF1bHQgZ2F0ZXdheSBhdmFpbGFibGUgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBubyByb3V0ZSB0byBkZXN0aW5hdGlvbiBlcnJvciAoZGVmYXVsdCBnYXRld2F5IG1pc3NpbmcpICovCisgICAgICAgICAgcmV0dXJuIEVSUl9SVEU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UCisgICAgaWYgKG5ldGlmLT5hZGRyX2hpbnQgIT0gTlVMTCkgeworICAgICAgLyogcGVyLXBjYiBjYWNoZWQgZW50cnkgd2FzIGdpdmVuICovCisgICAgICB1OF90IGV0aGFycF9jYWNoZWRfZW50cnkgPSAqKG5ldGlmLT5hZGRyX2hpbnQpOworICAgICAgaWYgKGV0aGFycF9jYWNoZWRfZW50cnkgPCBBUlBfVEFCTEVfU0laRSkgeworI2VuZGlmIC8qIExXSVBfTkVUSUZfSFdBRERSSElOVCAqLworICAgICAgICBpZiAoKGFycF90YWJsZVtldGhhcnBfY2FjaGVkX2VudHJ5XS5zdGF0ZSA9PSBFVEhBUlBfU1RBVEVfU1RBQkxFKSAmJgorICAgICAgICAgICAgKGlwX2FkZHJfY21wKGlwYWRkciwgJmFycF90YWJsZVtldGhhcnBfY2FjaGVkX2VudHJ5XS5pcGFkZHIpKSkgeworICAgICAgICAgIC8qIHRoZSBwZXItcGNiLWNhY2hlZCBlbnRyeSBpcyBzdGFibGUgYW5kIHRoZSByaWdodCBvbmUhICovCisgICAgICAgICAgRVRIQVJQX1NUQVRTX0lOQyhldGhhcnAuY2FjaGVoaXQpOworICAgICAgICAgIHJldHVybiBldGhhcnBfc2VuZF9pcChuZXRpZiwgcSwgKHN0cnVjdCBldGhfYWRkciopKG5ldGlmLT5od2FkZHIpLAorICAgICAgICAgICAgJmFycF90YWJsZVtldGhhcnBfY2FjaGVkX2VudHJ5XS5ldGhhZGRyKTsKKyAgICAgICAgfQorI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKyAgICAvKiBxdWV1ZSBvbiBkZXN0aW5hdGlvbiBFdGhlcm5ldCBhZGRyZXNzIGJlbG9uZ2luZyB0byBpcGFkZHIgKi8KKyAgICByZXR1cm4gZXRoYXJwX3F1ZXJ5KG5ldGlmLCBpcGFkZHIsIHEpOworICB9CisKKyAgLyogY29udGludWF0aW9uIGZvciBtdWx0aWNhc3QvYnJvYWRjYXN0IGRlc3RpbmF0aW9ucyAqLworICAvKiBvYnRhaW4gc291cmNlIEV0aGVybmV0IGFkZHJlc3Mgb2YgdGhlIGdpdmVuIGludGVyZmFjZSAqLworICAvKiBzZW5kIHBhY2tldCBkaXJlY3RseSBvbiB0aGUgbGluayAqLworICByZXR1cm4gZXRoYXJwX3NlbmRfaXAobmV0aWYsIHEsIChzdHJ1Y3QgZXRoX2FkZHIqKShuZXRpZi0+aHdhZGRyKSwgZGVzdCk7Cit9CisKKy8qKgorICogU2VuZCBhbiBBUlAgcmVxdWVzdCBmb3IgdGhlIGdpdmVuIElQIGFkZHJlc3MgYW5kL29yIHF1ZXVlIGEgcGFja2V0LgorICoKKyAqIElmIHRoZSBJUCBhZGRyZXNzIHdhcyBub3QgeWV0IGluIHRoZSBjYWNoZSwgYSBwZW5kaW5nIEFSUCBjYWNoZSBlbnRyeQorICogaXMgYWRkZWQgYW5kIGFuIEFSUCByZXF1ZXN0IGlzIHNlbnQgZm9yIHRoZSBnaXZlbiBhZGRyZXNzLiBUaGUgcGFja2V0CisgKiBpcyBxdWV1ZWQgb24gdGhpcyBlbnRyeS4KKyAqCisgKiBJZiB0aGUgSVAgYWRkcmVzcyB3YXMgYWxyZWFkeSBwZW5kaW5nIGluIHRoZSBjYWNoZSwgYSBuZXcgQVJQIHJlcXVlc3QKKyAqIGlzIHNlbnQgZm9yIHRoZSBnaXZlbiBhZGRyZXNzLiBUaGUgcGFja2V0IGlzIHF1ZXVlZCBvbiB0aGlzIGVudHJ5LgorICoKKyAqIElmIHRoZSBJUCBhZGRyZXNzIHdhcyBhbHJlYWR5IHN0YWJsZSBpbiB0aGUgY2FjaGUsIGFuZCBhIHBhY2tldCBpcworICogZ2l2ZW4sIGl0IGlzIGRpcmVjdGx5IHNlbnQgYW5kIG5vIEFSUCByZXF1ZXN0IGlzIHNlbnQgb3V0LiAKKyAqIAorICogSWYgdGhlIElQIGFkZHJlc3Mgd2FzIGFscmVhZHkgc3RhYmxlIGluIHRoZSBjYWNoZSwgYW5kIG5vIHBhY2tldCBpcworICogZ2l2ZW4sIGFuIEFSUCByZXF1ZXN0IGlzIHNlbnQgb3V0LgorICogCisgKiBAcGFyYW0gbmV0aWYgVGhlIGx3SVAgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggaXBhZGRyCisgKiBtdXN0IGJlIHF1ZXJpZWQgZm9yLgorICogQHBhcmFtIGlwYWRkciBUaGUgSVAgYWRkcmVzcyB0byBiZSByZXNvbHZlZC4KKyAqIEBwYXJhbSBxIElmIG5vbi1OVUxMLCBhIHBidWYgdGhhdCBtdXN0IGJlIGRlbGl2ZXJlZCB0byB0aGUgSVAgYWRkcmVzcy4KKyAqIHEgaXMgbm90IGZyZWVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICogQG5vdGUgcSBtdXN0IG9ubHkgYmUgT05FIHBhY2tldCwgbm90IGEgcGFja2V0IHF1ZXVlIQorICoKKyAqIEByZXR1cm4KKyAqIC0gRVJSX0JVRiBDb3VsZCBub3QgbWFrZSByb29tIGZvciBFdGhlcm5ldCBoZWFkZXIuCisgKiAtIEVSUl9NRU0gSGFyZHdhcmUgYWRkcmVzcyB1bmtub3duLCBhbmQgbm8gbW9yZSBBUlAgZW50cmllcyBhdmFpbGFibGUKKyAqICAgdG8gcXVlcnkgZm9yIGFkZHJlc3Mgb3IgcXVldWUgdGhlIHBhY2tldC4KKyAqIC0gRVJSX01FTSBDb3VsZCBub3QgcXVldWUgcGFja2V0IGR1ZSB0byBtZW1vcnkgc2hvcnRhZ2UuCisgKiAtIEVSUl9SVEUgTm8gcm91dGUgdG8gZGVzdGluYXRpb24gKG5vIGdhdGV3YXkgdG8gZXh0ZXJuYWwgbmV0d29ya3MpLgorICogLSBFUlJfQVJHIE5vbi11bmljYXN0IGFkZHJlc3MgZ2l2ZW4sIHRob3NlIHdpbGwgbm90IGFwcGVhciBpbiBBUlAgY2FjaGUuCisgKgorICovCitlcnJfdAorZXRoYXJwX3F1ZXJ5KHN0cnVjdCBuZXRpZiAqbmV0aWYsIGlwX2FkZHJfdCAqaXBhZGRyLCBzdHJ1Y3QgcGJ1ZiAqcSkKK3sKKyAgc3RydWN0IGV0aF9hZGRyICogc3JjYWRkciA9IChzdHJ1Y3QgZXRoX2FkZHIgKiluZXRpZi0+aHdhZGRyOworICBlcnJfdCByZXN1bHQgPSBFUlJfTUVNOworICBzOF90IGk7IC8qIEFSUCBlbnRyeSBpbmRleCAqLworCisgIC8qIG5vbi11bmljYXN0IGFkZHJlc3M/ICovCisgIGlmIChpcF9hZGRyX2lzYnJvYWRjYXN0KGlwYWRkciwgbmV0aWYpIHx8CisgICAgICBpcF9hZGRyX2lzbXVsdGljYXN0KGlwYWRkcikgfHwKKyAgICAgIGlwX2FkZHJfaXNhbnkoaXBhZGRyKSkgeworICAgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImV0aGFycF9xdWVyeTogd2lsbCBub3QgYWRkIG5vbi11bmljYXN0IElQIGFkZHJlc3MgdG8gQVJQIGNhY2hlXG4iKSk7CisgICAgcmV0dXJuIEVSUl9BUkc7CisgIH0KKworICAvKiBmaW5kIGVudHJ5IGluIEFSUCBjYWNoZSwgYXNrIHRvIGNyZWF0ZSBlbnRyeSBpZiBxdWV1ZWluZyBwYWNrZXQgKi8KKyAgaSA9IGZpbmRfZW50cnkoaXBhZGRyLCBFVEhBUlBfRkxBR19UUllfSEFSRCk7CisKKyAgLyogY291bGQgbm90IGZpbmQgb3IgY3JlYXRlIGVudHJ5PyAqLworICBpZiAoaSA8IDApIHsKKyAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJldGhhcnBfcXVlcnk6IGNvdWxkIG5vdCBjcmVhdGUgQVJQIGVudHJ5XG4iKSk7CisgICAgaWYgKHEpIHsKKyAgICAgIExXSVBfREVCVUdGKEVUSEFSUF9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImV0aGFycF9xdWVyeTogcGFja2V0IGRyb3BwZWRcbiIpKTsKKyAgICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLm1lbWVycik7CisgICAgfQorICAgIHJldHVybiAoZXJyX3QpaTsKKyAgfQorCisgIC8qIG1hcmsgYSBmcmVzaCBlbnRyeSBhcyBwZW5kaW5nICh3ZSBqdXN0IHNlbnQgYSByZXF1ZXN0KSAqLworICBpZiAoYXJwX3RhYmxlW2ldLnN0YXRlID09IEVUSEFSUF9TVEFURV9FTVBUWSkgeworICAgIGFycF90YWJsZVtpXS5zdGF0ZSA9IEVUSEFSUF9TVEFURV9QRU5ESU5HOworICB9CisKKyAgLyogeyBpIGlzIGVpdGhlciBhIFNUQUJMRSBvciAobmV3IG9yIGV4aXN0aW5nKSBQRU5ESU5HIGVudHJ5IH0gKi8KKyAgTFdJUF9BU1NFUlQoImFycF90YWJsZVtpXS5zdGF0ZSA9PSBQRU5ESU5HIG9yIFNUQUJMRSIsCisgICgoYXJwX3RhYmxlW2ldLnN0YXRlID09IEVUSEFSUF9TVEFURV9QRU5ESU5HKSB8fAorICAgKGFycF90YWJsZVtpXS5zdGF0ZSA9PSBFVEhBUlBfU1RBVEVfU1RBQkxFKSkpOworCisgIC8qIGRvIHdlIGhhdmUgYSBwZW5kaW5nIGVudHJ5PyBvciBhbiBpbXBsaWNpdCBxdWVyeSByZXF1ZXN0PyAqLworICBpZiAoKGFycF90YWJsZVtpXS5zdGF0ZSA9PSBFVEhBUlBfU1RBVEVfUEVORElORykgfHwgKHEgPT0gTlVMTCkpIHsKKyAgICAvKiB0cnkgdG8gcmVzb2x2ZSBpdDsgc2VuZCBvdXQgQVJQIHJlcXVlc3QgKi8KKyAgICByZXN1bHQgPSBldGhhcnBfcmVxdWVzdChuZXRpZiwgaXBhZGRyKTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUl9PSykgeworICAgICAgLyogQVJQIHJlcXVlc3QgY291bGRuJ3QgYmUgc2VudCAqLworICAgICAgLyogV2UgZG9uJ3QgcmUtc2VuZCBhcnAgcmVxdWVzdCBpbiBldGhhcnBfdG1yLCBidXQgd2Ugc3RpbGwgcXVldWUgcGFja2V0cywKKyAgICAgICAgIHNpbmNlIHRoaXMgZmFpbHVyZSBjb3VsZCBiZSB0ZW1wb3JhcnksIGFuZCB0aGUgbmV4dCBwYWNrZXQgY2FsbGluZworICAgICAgICAgZXRoYXJwX3F1ZXJ5IGFnYWluIGNvdWxkIGxlYWQgdG8gc2VuZGluZyB0aGUgcXVldWVkIHBhY2tldHMuICovCisgICAgfQorICAgIGlmIChxID09IE5VTEwpIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisKKyAgLyogcGFja2V0IGdpdmVuPyAqLworICBMV0lQX0FTU0VSVCgicSAhPSBOVUxMIiwgcSAhPSBOVUxMKTsKKyAgLyogc3RhYmxlIGVudHJ5PyAqLworICBpZiAoYXJwX3RhYmxlW2ldLnN0YXRlID09IEVUSEFSUF9TVEFURV9TVEFCTEUpIHsKKyAgICAvKiB3ZSBoYXZlIGEgdmFsaWQgSVAtPkV0aGVybmV0IGFkZHJlc3MgbWFwcGluZyAqLworICAgIEVUSEFSUF9TRVRfSElOVChuZXRpZiwgaSk7CisgICAgLyogc2VuZCB0aGUgcGFja2V0ICovCisgICAgcmVzdWx0ID0gZXRoYXJwX3NlbmRfaXAobmV0aWYsIHEsIHNyY2FkZHIsICYoYXJwX3RhYmxlW2ldLmV0aGFkZHIpKTsKKyAgLyogcGVuZGluZyBlbnRyeT8gKGVpdGhlciBqdXN0IGNyZWF0ZWQgb3IgYWxyZWFkeSBwZW5kaW5nICovCisgIH0gZWxzZSBpZiAoYXJwX3RhYmxlW2ldLnN0YXRlID09IEVUSEFSUF9TVEFURV9QRU5ESU5HKSB7CisgICAgLyogZW50cnkgaXMgc3RpbGwgcGVuZGluZywgcXVldWUgdGhlIGdpdmVuIHBhY2tldCAncScgKi8KKyAgICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgICBpbnQgY29weV9uZWVkZWQgPSAwOworICAgIC8qIElGIHEgaW5jbHVkZXMgYSBQQlVGX1JFRiwgUEJVRl9QT09MIG9yIFBCVUZfUkFNLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQKKyAgICAgKiB0byBjb3B5IHRoZSB3aG9sZSBxdWV1ZSBpbnRvIGEgbmV3IFBCVUZfUkFNIChzZWUgYnVnICMxMTQwMCkgCisgICAgICogUEJVRl9ST01zIGNhbiBiZSBsZWZ0IGFzIHRoZXkgYXJlLCBzaW5jZSBST00gbXVzdCBub3QgZ2V0IGNoYW5nZWQuICovCisgICAgcCA9IHE7CisgICAgd2hpbGUgKHApIHsKKyAgICAgIExXSVBfQVNTRVJUKCJubyBwYWNrZXQgcXVldWVzIGFsbG93ZWQhIiwgKHAtPmxlbiAhPSBwLT50b3RfbGVuKSB8fCAocC0+bmV4dCA9PSAwKSk7CisgICAgICBpZihwLT50eXBlICE9IFBCVUZfUk9NKSB7CisgICAgICAgIGNvcHlfbmVlZGVkID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwID0gcC0+bmV4dDsKKyAgICB9CisgICAgaWYoY29weV9uZWVkZWQpIHsKKyAgICAgIC8qIGNvcHkgdGhlIHdob2xlIHBhY2tldCBpbnRvIG5ldyBwYnVmcyAqLworICAgICAgcCA9IHBidWZfYWxsb2MoUEJVRl9SQVcsIHAtPnRvdF9sZW4sIFBCVUZfUkFNKTsKKyAgICAgIGlmKHAgIT0gTlVMTCkgeworICAgICAgICBpZiAocGJ1Zl9jb3B5KHAsIHEpICE9IEVSUl9PSykgeworICAgICAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiByZWZlcmVuY2luZyB0aGUgb2xkIHBidWYgaXMgZW5vdWdoICovCisgICAgICBwID0gcTsKKyAgICAgIHBidWZfcmVmKHApOworICAgIH0KKyAgICAvKiBwYWNrZXQgY291bGQgYmUgdGFrZW4gb3Zlcj8gKi8KKyAgICBpZiAocCAhPSBOVUxMKSB7CisgICAgICAvKiBxdWV1ZSBwYWNrZXQgLi4uICovCisjaWYgQVJQX1FVRVVFSU5HCisgICAgICBzdHJ1Y3QgZXRoYXJwX3FfZW50cnkgKm5ld19lbnRyeTsKKyAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IGFycCBxdWV1ZSBlbnRyeSAqLworICAgICAgbmV3X2VudHJ5ID0gKHN0cnVjdCBldGhhcnBfcV9lbnRyeSAqKW1lbXBfbWFsbG9jKE1FTVBfQVJQX1FVRVVFKTsKKyAgICAgIGlmIChuZXdfZW50cnkgIT0gTlVMTCkgeworICAgICAgICBuZXdfZW50cnktPm5leHQgPSAwOworICAgICAgICBuZXdfZW50cnktPnAgPSBwOworICAgICAgICBpZihhcnBfdGFibGVbaV0ucSAhPSBOVUxMKSB7CisgICAgICAgICAgLyogcXVldWUgd2FzIGFscmVhZHkgZXhpc3RlbnQsIGFwcGVuZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSBlbmQgKi8KKyAgICAgICAgICBzdHJ1Y3QgZXRoYXJwX3FfZW50cnkgKnI7CisgICAgICAgICAgciA9IGFycF90YWJsZVtpXS5xOworICAgICAgICAgIHdoaWxlIChyLT5uZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHIgPSByLT5uZXh0OworICAgICAgICAgIH0KKyAgICAgICAgICByLT5uZXh0ID0gbmV3X2VudHJ5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIHF1ZXVlIGRpZCBub3QgZXhpc3QsIGZpcnN0IGl0ZW0gaW4gcXVldWUgKi8KKyAgICAgICAgICBhcnBfdGFibGVbaV0ucSA9IG5ld19lbnRyeTsKKyAgICAgICAgfQorICAgICAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJldGhhcnBfcXVlcnk6IHF1ZXVlZCBwYWNrZXQgJXAgb24gQVJQIGVudHJ5ICUiUzE2X0YiXG4iLCAodm9pZCAqKXEsIChzMTZfdClpKSk7CisgICAgICAgIHJlc3VsdCA9IEVSUl9PSzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRoZSBwb29sIE1FTVBfQVJQX1FVRVVFIGlzIGVtcHR5ICovCisgICAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgICAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZXRoYXJwX3F1ZXJ5OiBjb3VsZCBub3QgcXVldWUgYSBjb3B5IG9mIFBCVUZfUkVGIHBhY2tldCAlcCAob3V0IG9mIG1lbW9yeSlcbiIsICh2b2lkICopcSkpOworICAgICAgICByZXN1bHQgPSBFUlJfTUVNOworICAgICAgfQorI2Vsc2UgLyogQVJQX1FVRVVFSU5HICovCisgICAgICAvKiBhbHdheXMgcXVldWUgb25lIHBhY2tldCBwZXIgQVJQIHJlcXVlc3Qgb25seSwgZnJlZWluZyBhIHByZXZpb3VzbHkgcXVldWVkIHBhY2tldCAqLworICAgICAgaWYgKGFycF90YWJsZVtpXS5xICE9IE5VTEwpIHsKKyAgICAgICAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZXRoYXJwX3F1ZXJ5OiBkcm9wcGVkIHByZXZpb3VzbHkgcXVldWVkIHBhY2tldCAlcCBmb3IgQVJQIGVudHJ5ICUiUzE2X0YiXG4iLCAodm9pZCAqKXEsIChzMTZfdClpKSk7CisgICAgICAgIHBidWZfZnJlZShhcnBfdGFibGVbaV0ucSk7CisgICAgICB9CisgICAgICBhcnBfdGFibGVbaV0ucSA9IHA7CisgICAgICByZXN1bHQgPSBFUlJfT0s7CisgICAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJldGhhcnBfcXVlcnk6IHF1ZXVlZCBwYWNrZXQgJXAgb24gQVJQIGVudHJ5ICUiUzE2X0YiXG4iLCAodm9pZCAqKXEsIChzMTZfdClpKSk7CisjZW5kaWYgLyogQVJQX1FVRVVFSU5HICovCisgICAgfSBlbHNlIHsKKyAgICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLm1lbWVycik7CisgICAgICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJldGhhcnBfcXVlcnk6IGNvdWxkIG5vdCBxdWV1ZSBhIGNvcHkgb2YgUEJVRl9SRUYgcGFja2V0ICVwIChvdXQgb2YgbWVtb3J5KVxuIiwgKHZvaWQgKilxKSk7CisgICAgICByZXN1bHQgPSBFUlJfTUVNOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFNlbmQgYSByYXcgQVJQIHBhY2tldCAob3Bjb2RlIGFuZCBhbGwgYWRkcmVzc2VzIGNhbiBiZSBtb2RpZmllZCkKKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIGx3aXAgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdG8gc2VuZCB0aGUgQVJQIHBhY2tldAorICogQHBhcmFtIGV0aHNyY19hZGRyIHRoZSBzb3VyY2UgTUFDIGFkZHJlc3MgZm9yIHRoZSBldGhlcm5ldCBoZWFkZXIKKyAqIEBwYXJhbSBldGhkc3RfYWRkciB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgZm9yIHRoZSBldGhlcm5ldCBoZWFkZXIKKyAqIEBwYXJhbSBod3NyY19hZGRyIHRoZSBzb3VyY2UgTUFDIGFkZHJlc3MgZm9yIHRoZSBBUlAgcHJvdG9jb2wgaGVhZGVyCisgKiBAcGFyYW0gaXBzcmNfYWRkciB0aGUgc291cmNlIElQIGFkZHJlc3MgZm9yIHRoZSBBUlAgcHJvdG9jb2wgaGVhZGVyCisgKiBAcGFyYW0gaHdkc3RfYWRkciB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgZm9yIHRoZSBBUlAgcHJvdG9jb2wgaGVhZGVyCisgKiBAcGFyYW0gaXBkc3RfYWRkciB0aGUgZGVzdGluYXRpb24gSVAgYWRkcmVzcyBmb3IgdGhlIEFSUCBwcm90b2NvbCBoZWFkZXIKKyAqIEBwYXJhbSBvcGNvZGUgdGhlIHR5cGUgb2YgdGhlIEFSUCBwYWNrZXQKKyAqIEByZXR1cm4gRVJSX09LIGlmIHRoZSBBUlAgcGFja2V0IGhhcyBiZWVuIHNlbnQKKyAqICAgICAgICAgRVJSX01FTSBpZiB0aGUgQVJQIHBhY2tldCBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQKKyAqICAgICAgICAgYW55IG90aGVyIGVycl90IG9uIGZhaWx1cmUKKyAqLworI2lmICFMV0lQX0FVVE9JUAorc3RhdGljCisjZW5kaWYgLyogTFdJUF9BVVRPSVAgKi8KK2Vycl90CitldGhhcnBfcmF3KHN0cnVjdCBuZXRpZiAqbmV0aWYsIGNvbnN0IHN0cnVjdCBldGhfYWRkciAqZXRoc3JjX2FkZHIsCisgICAgICAgICAgIGNvbnN0IHN0cnVjdCBldGhfYWRkciAqZXRoZHN0X2FkZHIsCisgICAgICAgICAgIGNvbnN0IHN0cnVjdCBldGhfYWRkciAqaHdzcmNfYWRkciwgY29uc3QgaXBfYWRkcl90ICppcHNyY19hZGRyLAorICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZXRoX2FkZHIgKmh3ZHN0X2FkZHIsIGNvbnN0IGlwX2FkZHJfdCAqaXBkc3RfYWRkciwKKyAgICAgICAgICAgY29uc3QgdTE2X3Qgb3Bjb2RlKQoreworICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgZXJyX3QgcmVzdWx0ID0gRVJSX09LOworICBzdHJ1Y3QgZXRoX2hkciAqZXRoaGRyOworICBzdHJ1Y3QgZXRoYXJwX2hkciAqaGRyOworI2lmIExXSVBfQVVUT0lQCisgIGNvbnN0IHU4X3QgKiBldGhkc3RfaHdhZGRyOworI2VuZGlmIC8qIExXSVBfQVVUT0lQICovCisKKyAgLyogYWxsb2NhdGUgYSBwYnVmIGZvciB0aGUgb3V0Z29pbmcgQVJQIHJlcXVlc3QgcGFja2V0ICovCisgIHAgPSBwYnVmX2FsbG9jKFBCVUZfUkFXLCBTSVpFT0ZfRVRIQVJQX1BBQ0tFVCwgUEJVRl9SQU0pOworICAvKiBjb3VsZCBhbGxvY2F0ZSBhIHBidWYgZm9yIGFuIEFSUCByZXF1ZXN0PyAqLworICBpZiAocCA9PSBOVUxMKSB7CisgICAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgKCJldGhhcnBfcmF3OiBjb3VsZCBub3QgYWxsb2NhdGUgcGJ1ZiBmb3IgQVJQIHJlcXVlc3QuXG4iKSk7CisgICAgRVRIQVJQX1NUQVRTX0lOQyhldGhhcnAubWVtZXJyKTsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorICBMV0lQX0FTU0VSVCgiY2hlY2sgdGhhdCBmaXJzdCBwYnVmIGNhbiBob2xkIHN0cnVjdCBldGhhcnBfaGRyIiwKKyAgICAgICAgICAgICAgKHAtPmxlbiA+PSBTSVpFT0ZfRVRIQVJQX1BBQ0tFVCkpOworCisgIGV0aGhkciA9IChzdHJ1Y3QgZXRoX2hkciAqKXAtPnBheWxvYWQ7CisgIGhkciA9IChzdHJ1Y3QgZXRoYXJwX2hkciAqKSgodThfdCopZXRoaGRyICsgU0laRU9GX0VUSF9IRFIpOworICBMV0lQX0RFQlVHRihFVEhBUlBfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJldGhhcnBfcmF3OiBzZW5kaW5nIHJhdyBBUlAgcGFja2V0LlxuIikpOworICBoZHItPm9wY29kZSA9IGh0b25zKG9wY29kZSk7CisKKyAgTFdJUF9BU1NFUlQoIm5ldGlmLT5od2FkZHJfbGVuIG11c3QgYmUgdGhlIHNhbWUgYXMgRVRIQVJQX0hXQUREUl9MRU4gZm9yIGV0aGFycCEiLAorICAgICAgICAgICAgICAobmV0aWYtPmh3YWRkcl9sZW4gPT0gRVRIQVJQX0hXQUREUl9MRU4pKTsKKyNpZiBMV0lQX0FVVE9JUAorICAvKiBJZiB3ZSBhcmUgdXNpbmcgTGluay1Mb2NhbCwgYWxsIEFSUCBwYWNrZXRzIHRoYXQgY29udGFpbiBhIExpbmstTG9jYWwKKyAgICogJ3NlbmRlciBJUCBhZGRyZXNzJyBNVVNUIGJlIHNlbnQgdXNpbmcgbGluay1sYXllciBicm9hZGNhc3QgaW5zdGVhZCBvZgorICAgKiBsaW5rLWxheWVyIHVuaWNhc3QuIChTZWUgUkZDMzkyNyBTZWN0aW9uIDIuNSwgbGFzdCBwYXJhZ3JhcGgpICovCisgIGV0aGRzdF9od2FkZHIgPSBpcF9hZGRyX2lzbGlua2xvY2FsKGlwc3JjX2FkZHIpID8gKHU4X3QqKShldGhicm9hZGNhc3QuYWRkcikgOiBldGhkc3RfYWRkci0+YWRkcjsKKyNlbmRpZiAvKiBMV0lQX0FVVE9JUCAqLworICAvKiBXcml0ZSB0aGUgQVJQIE1BQy1BZGRyZXNzZXMgKi8KKyAgRVRIQUREUjE2X0NPUFkoJmhkci0+c2h3YWRkciwgaHdzcmNfYWRkcik7CisgIEVUSEFERFIxNl9DT1BZKCZoZHItPmRod2FkZHIsIGh3ZHN0X2FkZHIpOworICAvKiBXcml0ZSB0aGUgRXRoZXJuZXQgTUFDLUFkZHJlc3NlcyAqLworI2lmIExXSVBfQVVUT0lQCisgIEVUSEFERFIxNl9DT1BZKCZldGhoZHItPmRlc3QsIGV0aGRzdF9od2FkZHIpOworI2Vsc2UgIC8qIExXSVBfQVVUT0lQICovCisgIEVUSEFERFIxNl9DT1BZKCZldGhoZHItPmRlc3QsIGV0aGRzdF9hZGRyKTsKKyNlbmRpZiAvKiBMV0lQX0FVVE9JUCAqLworICBFVEhBRERSMTZfQ09QWSgmZXRoaGRyLT5zcmMsIGV0aHNyY19hZGRyKTsKKyAgLyogQ29weSBzdHJ1Y3QgaXBfYWRkcjIgdG8gYWxpZ25lZCBpcF9hZGRyLCB0byBzdXBwb3J0IGNvbXBpbGVycyB3aXRob3V0CisgICAqIHN0cnVjdHVyZSBwYWNraW5nLiAqLyAKKyAgSVBBRERSMl9DT1BZKCZoZHItPnNpcGFkZHIsIGlwc3JjX2FkZHIpOworICBJUEFERFIyX0NPUFkoJmhkci0+ZGlwYWRkciwgaXBkc3RfYWRkcik7CisKKyAgaGRyLT5od3R5cGUgPSBQUF9IVE9OUyhIV1RZUEVfRVRIRVJORVQpOworICBoZHItPnByb3RvID0gUFBfSFRPTlMoRVRIVFlQRV9JUCk7CisgIC8qIHNldCBod2xlbiBhbmQgcHJvdG9sZW4gKi8KKyAgaGRyLT5od2xlbiA9IEVUSEFSUF9IV0FERFJfTEVOOworICBoZHItPnByb3RvbGVuID0gc2l6ZW9mKGlwX2FkZHJfdCk7CisKKyAgZXRoaGRyLT50eXBlID0gUFBfSFRPTlMoRVRIVFlQRV9BUlApOworICAvKiBzZW5kIEFSUCBxdWVyeSAqLworICByZXN1bHQgPSBuZXRpZi0+bGlua291dHB1dChuZXRpZiwgcCk7CisgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLnhtaXQpOworICAvKiBmcmVlIEFSUCBxdWVyeSBwYWNrZXQgKi8KKyAgcGJ1Zl9mcmVlKHApOworICBwID0gTlVMTDsKKyAgLyogY291bGQgbm90IGFsbG9jYXRlIHBidWYgZm9yIEFSUCByZXF1ZXN0ICovCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBTZW5kIGFuIEFSUCByZXF1ZXN0IHBhY2tldCBhc2tpbmcgZm9yIGlwYWRkci4KKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIGx3aXAgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdG8gc2VuZCB0aGUgcmVxdWVzdAorICogQHBhcmFtIGlwYWRkciB0aGUgSVAgYWRkcmVzcyBmb3Igd2hpY2ggdG8gYXNrCisgKiBAcmV0dXJuIEVSUl9PSyBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50CisgKiAgICAgICAgIEVSUl9NRU0gaWYgdGhlIEFSUCBwYWNrZXQgY291bGRuJ3QgYmUgYWxsb2NhdGVkCisgKiAgICAgICAgIGFueSBvdGhlciBlcnJfdCBvbiBmYWlsdXJlCisgKi8KK2Vycl90CitldGhhcnBfcmVxdWVzdChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBpcF9hZGRyX3QgKmlwYWRkcikKK3sKKyAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZXRoYXJwX3JlcXVlc3Q6IHNlbmRpbmcgQVJQIHJlcXVlc3QuXG4iKSk7CisgIHJldHVybiBldGhhcnBfcmF3KG5ldGlmLCAoc3RydWN0IGV0aF9hZGRyICopbmV0aWYtPmh3YWRkciwgJmV0aGJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBldGhfYWRkciAqKW5ldGlmLT5od2FkZHIsICZuZXRpZi0+aXBfYWRkciwgJmV0aHplcm8sCisgICAgICAgICAgICAgICAgICAgIGlwYWRkciwgQVJQX1JFUVVFU1QpOworfQorI2VuZGlmIC8qIExXSVBfQVJQICovCisKKy8qKgorICogUHJvY2VzcyByZWNlaXZlZCBldGhlcm5ldCBmcmFtZXMuIFVzaW5nIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBkaXJlY3RseQorICogY2FsbGluZyBpcF9pbnB1dCBhbmQgcGFzc2luZyBBUlAgZnJhbWVzIHRocm91Z2ggZXRoYXJwIGluIGV0aGVybmV0aWZfaW5wdXQsCisgKiB0aGUgQVJQIGNhY2hlIGlzIHByb3RlY3RlZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEBwYXJhbSBwIHRoZSByZWNldmllZCBwYWNrZXQsIHAtPnBheWxvYWQgcG9pbnRpbmcgdG8gdGhlIGV0aGVybmV0IGhlYWRlcgorICogQHBhcmFtIG5ldGlmIHRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCB0aGUgcGFja2V0IHdhcyByZWNlaXZlZAorICovCitlcnJfdAorZXRoZXJuZXRfaW5wdXQoc3RydWN0IHBidWYgKnAsIHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBldGhfaGRyKiBldGhoZHI7CisgIHUxNl90IHR5cGU7CisgIHMxNl90IGlwX2hkcl9vZmZzZXQgPSBTSVpFT0ZfRVRIX0hEUjsKKworICBpZiAocC0+bGVuIDw9IFNJWkVPRl9FVEhfSERSKSB7CisgICAgLyogYSBwYWNrZXQgd2l0aCBvbmx5IGFuIGV0aGVybmV0IGhlYWRlciAob3IgbGVzcykgaXMgbm90IHZhbGlkIGZvciB1cyAqLworICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLnByb3RlcnIpOworICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLmRyb3ApOworICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICB9CisKKyAgLyogcG9pbnRzIHRvIHBhY2tldCBwYXlsb2FkLCB3aGljaCBzdGFydHMgd2l0aCBhbiBFdGhlcm5ldCBoZWFkZXIgKi8KKyAgZXRoaGRyID0gKHN0cnVjdCBldGhfaGRyICopcC0+cGF5bG9hZDsKKyAgTFdJUF9ERUJVR0YoRVRIQVJQX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsCisgICAgKCJldGhlcm5ldF9pbnB1dDogZGVzdDolIlg4X0YiOiUiWDhfRiI6JSJYOF9GIjolIlg4X0YiOiUiWDhfRiI6JSJYOF9GIiwgc3JjOiUiWDhfRiI6JSJYOF9GIjolIlg4X0YiOiUiWDhfRiI6JSJYOF9GIjolIlg4X0YiLCB0eXBlOiUiWDE2X0YiXG4iLAorICAgICAodW5zaWduZWQpZXRoaGRyLT5kZXN0LmFkZHJbMF0sICh1bnNpZ25lZClldGhoZHItPmRlc3QuYWRkclsxXSwgKHVuc2lnbmVkKWV0aGhkci0+ZGVzdC5hZGRyWzJdLAorICAgICAodW5zaWduZWQpZXRoaGRyLT5kZXN0LmFkZHJbM10sICh1bnNpZ25lZClldGhoZHItPmRlc3QuYWRkcls0XSwgKHVuc2lnbmVkKWV0aGhkci0+ZGVzdC5hZGRyWzVdLAorICAgICAodW5zaWduZWQpZXRoaGRyLT5zcmMuYWRkclswXSwgKHVuc2lnbmVkKWV0aGhkci0+c3JjLmFkZHJbMV0sICh1bnNpZ25lZClldGhoZHItPnNyYy5hZGRyWzJdLAorICAgICAodW5zaWduZWQpZXRoaGRyLT5zcmMuYWRkclszXSwgKHVuc2lnbmVkKWV0aGhkci0+c3JjLmFkZHJbNF0sICh1bnNpZ25lZClldGhoZHItPnNyYy5hZGRyWzVdLAorICAgICAodW5zaWduZWQpaHRvbnMoZXRoaGRyLT50eXBlKSkpOworCisgIHR5cGUgPSBldGhoZHItPnR5cGU7CisjaWYgRVRIQVJQX1NVUFBPUlRfVkxBTgorICBpZiAodHlwZSA9PSBQUF9IVE9OUyhFVEhUWVBFX1ZMQU4pKSB7CisgICAgc3RydWN0IGV0aF92bGFuX2hkciAqdmxhbiA9IChzdHJ1Y3QgZXRoX3ZsYW5faGRyKikoKChjaGFyKilldGhoZHIpICsgU0laRU9GX0VUSF9IRFIpOworICAgIGlmIChwLT5sZW4gPD0gU0laRU9GX0VUSF9IRFIgKyBTSVpFT0ZfVkxBTl9IRFIpIHsKKyAgICAgIC8qIGEgcGFja2V0IHdpdGggb25seSBhbiBldGhlcm5ldC92bGFuIGhlYWRlciAob3IgbGVzcykgaXMgbm90IHZhbGlkIGZvciB1cyAqLworICAgICAgRVRIQVJQX1NUQVRTX0lOQyhldGhhcnAucHJvdGVycik7CisgICAgICBFVEhBUlBfU1RBVFNfSU5DKGV0aGFycC5kcm9wKTsKKyAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICAgIH0KKyNpZmRlZiBFVEhBUlBfVkxBTl9DSEVDSyAvKiBpZiBub3QsIGFsbG93IGFsbCBWTEFOcyAqLworICAgIGlmIChWTEFOX0lEKHZsYW4pICE9IEVUSEFSUF9WTEFOX0NIRUNLKSB7CisgICAgICAvKiBzaWxlbnRseSBpZ25vcmUgdGhpcyBwYWNrZXQ6IG5vdCBmb3Igb3VyIFZMQU4gKi8KKyAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgIHJldHVybiBFUlJfT0s7CisgICAgfQorI2VuZGlmIC8qIEVUSEFSUF9WTEFOX0NIRUNLICovCisgICAgdHlwZSA9IHZsYW4tPnRwaWQ7CisgICAgaXBfaGRyX29mZnNldCA9IFNJWkVPRl9FVEhfSERSICsgU0laRU9GX1ZMQU5fSERSOworICB9CisjZW5kaWYgLyogRVRIQVJQX1NVUFBPUlRfVkxBTiAqLworCisjaWYgTFdJUF9BUlBfRklMVEVSX05FVElGCisgIG5ldGlmID0gTFdJUF9BUlBfRklMVEVSX05FVElGX0ZOKHAsIG5ldGlmLCBodG9ucyh0eXBlKSk7CisjZW5kaWYgLyogTFdJUF9BUlBfRklMVEVSX05FVElGKi8KKworICBzd2l0Y2ggKHR5cGUpIHsKKyNpZiBMV0lQX0FSUAorICAgIC8qIElQIHBhY2tldD8gKi8KKyAgICBjYXNlIFBQX0hUT05TKEVUSFRZUEVfSVApOgorICAgICAgaWYgKCEobmV0aWYtPmZsYWdzICYgTkVUSUZfRkxBR19FVEhBUlApKSB7CisgICAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICAgICAgfQorI2lmIEVUSEFSUF9UUlVTVF9JUF9NQUMKKyAgICAgIC8qIHVwZGF0ZSBBUlAgdGFibGUgKi8KKyAgICAgIGV0aGFycF9pcF9pbnB1dChuZXRpZiwgcCk7CisjZW5kaWYgLyogRVRIQVJQX1RSVVNUX0lQX01BQyAqLworICAgICAgLyogc2tpcCBFdGhlcm5ldCBoZWFkZXIgKi8KKyAgICAgIGlmKHBidWZfaGVhZGVyKHAsIC1pcF9oZHJfb2Zmc2V0KSkgeworICAgICAgICBMV0lQX0FTU0VSVCgiQ2FuJ3QgbW92ZSBvdmVyIGhlYWRlciBpbiBwYWNrZXQiLCAwKTsKKyAgICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBwYXNzIHRvIElQIGxheWVyICovCisgICAgICAgIGlwX2lucHV0KHAsIG5ldGlmKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBQUF9IVE9OUyhFVEhUWVBFX0FSUCk6CisgICAgICBpZiAoIShuZXRpZi0+ZmxhZ3MgJiBORVRJRl9GTEFHX0VUSEFSUCkpIHsKKyAgICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgICB9CisgICAgICAvKiBwYXNzIHAgdG8gQVJQIG1vZHVsZSAqLworICAgICAgZXRoYXJwX2FycF9pbnB1dChuZXRpZiwgKHN0cnVjdCBldGhfYWRkciopKG5ldGlmLT5od2FkZHIpLCBwKTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIExXSVBfQVJQICovCisjaWYgUFBQT0VfU1VQUE9SVAorICAgIGNhc2UgUFBfSFRPTlMoRVRIVFlQRV9QUFBPRURJU0MpOiAvKiBQUFAgT3ZlciBFdGhlcm5ldCBEaXNjb3ZlcnkgU3RhZ2UgKi8KKyAgICAgIHBwcG9lX2Rpc2NfaW5wdXQobmV0aWYsIHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBQX0hUT05TKEVUSFRZUEVfUFBQT0UpOiAvKiBQUFAgT3ZlciBFdGhlcm5ldCBTZXNzaW9uIFN0YWdlICovCisgICAgICBwcHBvZV9kYXRhX2lucHV0KG5ldGlmLCBwKTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFBQUE9FX1NVUFBPUlQgKi8KKworICAgIGRlZmF1bHQ6CisgICAgICBFVEhBUlBfU1RBVFNfSU5DKGV0aGFycC5wcm90ZXJyKTsKKyAgICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLmRyb3ApOworICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgIH0KKworICAvKiBUaGlzIG1lYW5zIHRoZSBwYnVmIGlzIGZyZWVkIG9yIGNvbnN1bWVkLAorICAgICBzbyB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSB0byBmcmVlIGl0IGFnYWluICovCisgIHJldHVybiBFUlJfT0s7CisKK2ZyZWVfYW5kX3JldHVybjoKKyAgcGJ1Zl9mcmVlKHApOworICByZXR1cm4gRVJSX09LOworfQorI2VuZGlmIC8qIExXSVBfQVJQIHx8IExXSVBfRVRIRVJORVQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvZXRoZXJuZXRpZi5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9ldGhlcm5ldGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViN2Q5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvZXRoZXJuZXRpZi5jCkBAIC0wLDAgKzEsMzE4IEBACisvKioKKyAqIEBmaWxlCisgKiBFdGhlcm5ldCBJbnRlcmZhY2UgU2tlbGV0b24KKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgCisgKiBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyAKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSAKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsd0lQIFRDUC9JUCBzdGFjay4KKyAqIAorICogQXV0aG9yOiBBZGFtIER1bmtlbHMgPGFkYW1Ac2ljcy5zZT4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhIHNrZWxldG9uIGZvciBkZXZlbG9waW5nIEV0aGVybmV0IG5ldHdvcmsgaW50ZXJmYWNlCisgKiBkcml2ZXJzIGZvciBsd0lQLiBBZGQgY29kZSB0byB0aGUgbG93X2xldmVsIGZ1bmN0aW9ucyBhbmQgZG8gYQorICogc2VhcmNoLWFuZC1yZXBsYWNlIGZvciB0aGUgd29yZCAiZXRoZXJuZXRpZiIgdG8gcmVwbGFjZSBpdCB3aXRoCisgKiBzb21ldGhpbmcgdGhhdCBiZXR0ZXIgZGVzY3JpYmVzIHlvdXIgbmV0d29yayBpbnRlcmZhY2UuCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiAwIC8qIGRvbid0IGJ1aWxkLCB0aGlzIGlzIG9ubHkgYSBza2VsZXRvbiwgc2VlIHByZXZpb3VzIGNvbW1lbnQgKi8KKworI2luY2x1ZGUgImx3aXAvZGVmLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpbmNsdWRlICJsd2lwL3N5cy5oIgorI2luY2x1ZGUgPGx3aXAvc3RhdHMuaD4KKyNpbmNsdWRlIDxsd2lwL3NubXAuaD4KKyNpbmNsdWRlICJuZXRpZi9ldGhhcnAuaCIKKyNpbmNsdWRlICJuZXRpZi9wcHBfb2UuaCIKKworLyogRGVmaW5lIHRob3NlIHRvIGJldHRlciBkZXNjcmliZSB5b3VyIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworI2RlZmluZSBJRk5BTUUwICdlJworI2RlZmluZSBJRk5BTUUxICduJworCisvKioKKyAqIEhlbHBlciBzdHJ1Y3QgdG8gaG9sZCBwcml2YXRlIGRhdGEgdXNlZCB0byBvcGVyYXRlIHlvdXIgZXRoZXJuZXQgaW50ZXJmYWNlLgorICogS2VlcGluZyB0aGUgZXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgTUFDIGluIHRoaXMgc3RydWN0IGlzIG5vdCBuZWNlc3NhcnkKKyAqIGFzIGl0IGlzIGFscmVhZHkga2VwdCBpbiB0aGUgc3RydWN0IG5ldGlmLgorICogQnV0IHRoaXMgaXMgb25seSBhbiBleGFtcGxlLCBhbnl3YXkuLi4KKyAqLworc3RydWN0IGV0aGVybmV0aWYgeworICBzdHJ1Y3QgZXRoX2FkZHIgKmV0aGFkZHI7CisgIC8qIEFkZCB3aGF0ZXZlciBwZXItaW50ZXJmYWNlIHN0YXRlIHRoYXQgaXMgbmVlZGVkIGhlcmUuICovCit9OworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gKi8KK3N0YXRpYyB2b2lkICBldGhlcm5ldGlmX2lucHV0KHN0cnVjdCBuZXRpZiAqbmV0aWYpOworCisvKioKKyAqIEluIHRoaXMgZnVuY3Rpb24sIHRoZSBoYXJkd2FyZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQuCisgKiBDYWxsZWQgZnJvbSBldGhlcm5ldGlmX2luaXQoKS4KKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIGFscmVhZHkgaW5pdGlhbGl6ZWQgbHdpcCBuZXR3b3JrIGludGVyZmFjZSBzdHJ1Y3R1cmUKKyAqICAgICAgICBmb3IgdGhpcyBldGhlcm5ldGlmCisgKi8KK3N0YXRpYyB2b2lkCitsb3dfbGV2ZWxfaW5pdChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZXRoZXJuZXRpZiAqZXRoZXJuZXRpZiA9IG5ldGlmLT5zdGF0ZTsKKyAgCisgIC8qIHNldCBNQUMgaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KKyAgbmV0aWYtPmh3YWRkcl9sZW4gPSBFVEhBUlBfSFdBRERSX0xFTjsKKworICAvKiBzZXQgTUFDIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyAgbmV0aWYtPmh3YWRkclswXSA9IDsKKyAgLi4uCisgIG5ldGlmLT5od2FkZHJbNV0gPSA7CisKKyAgLyogbWF4aW11bSB0cmFuc2ZlciB1bml0ICovCisgIG5ldGlmLT5tdHUgPSAxNTAwOworICAKKyAgLyogZGV2aWNlIGNhcGFiaWxpdGllcyAqLworICAvKiBkb24ndCBzZXQgTkVUSUZfRkxBR19FVEhBUlAgaWYgdGhpcyBkZXZpY2UgaXMgbm90IGFuIGV0aGVybmV0IG9uZSAqLworICBuZXRpZi0+ZmxhZ3MgPSBORVRJRl9GTEFHX0JST0FEQ0FTVCB8IE5FVElGX0ZMQUdfRVRIQVJQIHwgTkVUSUZfRkxBR19MSU5LX1VQOworIAorICAvKiBEbyB3aGF0ZXZlciBlbHNlIGlzIG5lZWRlZCB0byBpbml0aWFsaXplIGludGVyZmFjZS4gKi8gIAorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGRvIHRoZSBhY3R1YWwgdHJhbnNtaXNzaW9uIG9mIHRoZSBwYWNrZXQuIFRoZSBwYWNrZXQgaXMKKyAqIGNvbnRhaW5lZCBpbiB0aGUgcGJ1ZiB0aGF0IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uIFRoaXMgcGJ1ZgorICogbWlnaHQgYmUgY2hhaW5lZC4KKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIGx3aXAgbmV0d29yayBpbnRlcmZhY2Ugc3RydWN0dXJlIGZvciB0aGlzIGV0aGVybmV0aWYKKyAqIEBwYXJhbSBwIHRoZSBNQUMgcGFja2V0IHRvIHNlbmQgKGUuZy4gSVAgcGFja2V0IGluY2x1ZGluZyBNQUMgYWRkcmVzc2VzIGFuZCB0eXBlKQorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIHBhY2tldCBjb3VsZCBiZSBzZW50CisgKiAgICAgICAgIGFuIGVycl90IHZhbHVlIGlmIHRoZSBwYWNrZXQgY291bGRuJ3QgYmUgc2VudAorICoKKyAqIEBub3RlIFJldHVybmluZyBFUlJfTUVNIGhlcmUgaWYgYSBETUEgcXVldWUgb2YgeW91ciBNQUMgaXMgZnVsbCBjYW4gbGVhZCB0bworICogICAgICAgc3RyYW5nZSByZXN1bHRzLiBZb3UgbWlnaHQgY29uc2lkZXIgd2FpdGluZyBmb3Igc3BhY2UgaW4gdGhlIERNQSBxdWV1ZQorICogICAgICAgdG8gYmVjb21lIGF2YWlsYWxlIHNpbmNlIHRoZSBzdGFjayBkb2Vzbid0IHJldHJ5IHRvIHNlbmQgYSBwYWNrZXQKKyAqICAgICAgIGRyb3BwZWQgYmVjYXVzZSBvZiBtZW1vcnkgZmFpbHVyZSAoZXhjZXB0IGZvciB0aGUgVENQIHRpbWVycykuCisgKi8KKworc3RhdGljIGVycl90Citsb3dfbGV2ZWxfb3V0cHV0KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwKQoreworICBzdHJ1Y3QgZXRoZXJuZXRpZiAqZXRoZXJuZXRpZiA9IG5ldGlmLT5zdGF0ZTsKKyAgc3RydWN0IHBidWYgKnE7CisKKyAgaW5pdGlhdGUgdHJhbnNmZXIoKTsKKyAgCisjaWYgRVRIX1BBRF9TSVpFCisgIHBidWZfaGVhZGVyKHAsIC1FVEhfUEFEX1NJWkUpOyAvKiBkcm9wIHRoZSBwYWRkaW5nIHdvcmQgKi8KKyNlbmRpZgorCisgIGZvcihxID0gcDsgcSAhPSBOVUxMOyBxID0gcS0+bmV4dCkgeworICAgIC8qIFNlbmQgdGhlIGRhdGEgZnJvbSB0aGUgcGJ1ZiB0byB0aGUgaW50ZXJmYWNlLCBvbmUgcGJ1ZiBhdCBhCisgICAgICAgdGltZS4gVGhlIHNpemUgb2YgdGhlIGRhdGEgaW4gZWFjaCBwYnVmIGlzIGtlcHQgaW4gdGhlIC0+bGVuCisgICAgICAgdmFyaWFibGUuICovCisgICAgc2VuZCBkYXRhIGZyb20ocS0+cGF5bG9hZCwgcS0+bGVuKTsKKyAgfQorCisgIHNpZ25hbCB0aGF0IHBhY2tldCBzaG91bGQgYmUgc2VudCgpOworCisjaWYgRVRIX1BBRF9TSVpFCisgIHBidWZfaGVhZGVyKHAsIEVUSF9QQURfU0laRSk7IC8qIHJlY2xhaW0gdGhlIHBhZGRpbmcgd29yZCAqLworI2VuZGlmCisgIAorICBMSU5LX1NUQVRTX0lOQyhsaW5rLnhtaXQpOworCisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogU2hvdWxkIGFsbG9jYXRlIGEgcGJ1ZiBhbmQgdHJhbnNmZXIgdGhlIGJ5dGVzIG9mIHRoZSBpbmNvbWluZworICogcGFja2V0IGZyb20gdGhlIGludGVyZmFjZSBpbnRvIHRoZSBwYnVmLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbHdpcCBuZXR3b3JrIGludGVyZmFjZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgZXRoZXJuZXRpZgorICogQHJldHVybiBhIHBidWYgZmlsbGVkIHdpdGggdGhlIHJlY2VpdmVkIHBhY2tldCAoaW5jbHVkaW5nIE1BQyBoZWFkZXIpCisgKiAgICAgICAgIE5VTEwgb24gbWVtb3J5IGVycm9yCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGJ1ZiAqCitsb3dfbGV2ZWxfaW5wdXQoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgc3RydWN0IGV0aGVybmV0aWYgKmV0aGVybmV0aWYgPSBuZXRpZi0+c3RhdGU7CisgIHN0cnVjdCBwYnVmICpwLCAqcTsKKyAgdTE2X3QgbGVuOworCisgIC8qIE9idGFpbiB0aGUgc2l6ZSBvZiB0aGUgcGFja2V0IGFuZCBwdXQgaXQgaW50byB0aGUgImxlbiIKKyAgICAgdmFyaWFibGUuICovCisgIGxlbiA9IDsKKworI2lmIEVUSF9QQURfU0laRQorICBsZW4gKz0gRVRIX1BBRF9TSVpFOyAvKiBhbGxvdyByb29tIGZvciBFdGhlcm5ldCBwYWRkaW5nICovCisjZW5kaWYKKworICAvKiBXZSBhbGxvY2F0ZSBhIHBidWYgY2hhaW4gb2YgcGJ1ZnMgZnJvbSB0aGUgcG9vbC4gKi8KKyAgcCA9IHBidWZfYWxsb2MoUEJVRl9SQVcsIGxlbiwgUEJVRl9QT09MKTsKKyAgCisgIGlmIChwICE9IE5VTEwpIHsKKworI2lmIEVUSF9QQURfU0laRQorICAgIHBidWZfaGVhZGVyKHAsIC1FVEhfUEFEX1NJWkUpOyAvKiBkcm9wIHRoZSBwYWRkaW5nIHdvcmQgKi8KKyNlbmRpZgorCisgICAgLyogV2UgaXRlcmF0ZSBvdmVyIHRoZSBwYnVmIGNoYWluIHVudGlsIHdlIGhhdmUgcmVhZCB0aGUgZW50aXJlCisgICAgICogcGFja2V0IGludG8gdGhlIHBidWYuICovCisgICAgZm9yKHEgPSBwOyBxICE9IE5VTEw7IHEgPSBxLT5uZXh0KSB7CisgICAgICAvKiBSZWFkIGVub3VnaCBieXRlcyB0byBmaWxsIHRoaXMgcGJ1ZiBpbiB0aGUgY2hhaW4uIFRoZQorICAgICAgICogYXZhaWxhYmxlIGRhdGEgaW4gdGhlIHBidWYgaXMgZ2l2ZW4gYnkgdGhlIHEtPmxlbgorICAgICAgICogdmFyaWFibGUuCisgICAgICAgKiBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gYmUgYSBtZW1jcHksIHlvdSBjYW4gYWxzbyBwcmVhbGxvY2F0ZQorICAgICAgICogcGJ1ZnMgZm9yIGEgRE1BLWVuYWJsZWQgTUFDIGFuZCBhZnRlciByZWNlaXZpbmcgdHJ1bmNhdGUgaXQgdG8gdGhlCisgICAgICAgKiBhY3R1YWxseSByZWNlaXZlZCBzaXplLiBJbiB0aGlzIGNhc2UsIGVuc3VyZSB0aGUgdG90X2xlbiBtZW1iZXIgb2YgdGhlCisgICAgICAgKiBwYnVmIGlzIHRoZSBzdW0gb2YgdGhlIGNoYWluZWQgcGJ1ZiBsZW4gbWVtYmVycy4KKyAgICAgICAqLworICAgICAgcmVhZCBkYXRhIGludG8ocS0+cGF5bG9hZCwgcS0+bGVuKTsKKyAgICB9CisgICAgYWNrbm93bGVkZ2UgdGhhdCBwYWNrZXQgaGFzIGJlZW4gcmVhZCgpOworCisjaWYgRVRIX1BBRF9TSVpFCisgICAgcGJ1Zl9oZWFkZXIocCwgRVRIX1BBRF9TSVpFKTsgLyogcmVjbGFpbSB0aGUgcGFkZGluZyB3b3JkICovCisjZW5kaWYKKworICAgIExJTktfU1RBVFNfSU5DKGxpbmsucmVjdik7CisgIH0gZWxzZSB7CisgICAgZHJvcCBwYWNrZXQoKTsKKyAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLm1lbWVycik7CisgICAgTElOS19TVEFUU19JTkMobGluay5kcm9wKTsKKyAgfQorCisgIHJldHVybiBwOyAgCit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBwYWNrZXQgaXMgcmVhZHkgdG8gYmUgcmVhZAorICogZnJvbSB0aGUgaW50ZXJmYWNlLiBJdCB1c2VzIHRoZSBmdW5jdGlvbiBsb3dfbGV2ZWxfaW5wdXQoKSB0aGF0CisgKiBzaG91bGQgaGFuZGxlIHRoZSBhY3R1YWwgcmVjZXB0aW9uIG9mIGJ5dGVzIGZyb20gdGhlIG5ldHdvcmsKKyAqIGludGVyZmFjZS4gVGhlbiB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0IGlzIGRldGVybWluZWQgYW5kCisgKiB0aGUgYXBwcm9wcmlhdGUgaW5wdXQgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbHdpcCBuZXR3b3JrIGludGVyZmFjZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgZXRoZXJuZXRpZgorICovCitzdGF0aWMgdm9pZAorZXRoZXJuZXRpZl9pbnB1dChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgZXRoZXJuZXRpZiAqZXRoZXJuZXRpZjsKKyAgc3RydWN0IGV0aF9oZHIgKmV0aGhkcjsKKyAgc3RydWN0IHBidWYgKnA7CisKKyAgZXRoZXJuZXRpZiA9IG5ldGlmLT5zdGF0ZTsKKworICAvKiBtb3ZlIHJlY2VpdmVkIHBhY2tldCBpbnRvIGEgbmV3IHBidWYgKi8KKyAgcCA9IGxvd19sZXZlbF9pbnB1dChuZXRpZik7CisgIC8qIG5vIHBhY2tldCBjb3VsZCBiZSByZWFkLCBzaWxlbnRseSBpZ25vcmUgdGhpcyAqLworICBpZiAocCA9PSBOVUxMKSByZXR1cm47CisgIC8qIHBvaW50cyB0byBwYWNrZXQgcGF5bG9hZCwgd2hpY2ggc3RhcnRzIHdpdGggYW4gRXRoZXJuZXQgaGVhZGVyICovCisgIGV0aGhkciA9IHAtPnBheWxvYWQ7CisKKyAgc3dpdGNoIChodG9ucyhldGhoZHItPnR5cGUpKSB7CisgIC8qIElQIG9yIEFSUCBwYWNrZXQ/ICovCisgIGNhc2UgRVRIVFlQRV9JUDoKKyAgY2FzZSBFVEhUWVBFX0FSUDoKKyNpZiBQUFBPRV9TVVBQT1JUCisgIC8qIFBQUG9FIHBhY2tldD8gKi8KKyAgY2FzZSBFVEhUWVBFX1BQUE9FRElTQzoKKyAgY2FzZSBFVEhUWVBFX1BQUE9FOgorI2VuZGlmIC8qIFBQUE9FX1NVUFBPUlQgKi8KKyAgICAvKiBmdWxsIHBhY2tldCBzZW5kIHRvIHRjcGlwX3RocmVhZCB0byBwcm9jZXNzICovCisgICAgaWYgKG5ldGlmLT5pbnB1dChwLCBuZXRpZikhPUVSUl9PSykKKyAgICAgeyBMV0lQX0RFQlVHRihORVRJRl9ERUJVRywgKCJldGhlcm5ldGlmX2lucHV0OiBJUCBpbnB1dCBlcnJvclxuIikpOworICAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgICBwID0gTlVMTDsKKyAgICAgfQorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgcGJ1Zl9mcmVlKHApOworICAgIHAgPSBOVUxMOworICAgIGJyZWFrOworICB9Cit9CisKKy8qKgorICogU2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9ncmFtIHRvIHNldCB1cCB0aGUKKyAqIG5ldHdvcmsgaW50ZXJmYWNlLiBJdCBjYWxscyB0aGUgZnVuY3Rpb24gbG93X2xldmVsX2luaXQoKSB0byBkbyB0aGUKKyAqIGFjdHVhbCBzZXR1cCBvZiB0aGUgaGFyZHdhcmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIG5ldGlmX2FkZCgpLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbHdpcCBuZXR3b3JrIGludGVyZmFjZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgZXRoZXJuZXRpZgorICogQHJldHVybiBFUlJfT0sgaWYgdGhlIGxvb3BpZiBpcyBpbml0aWFsaXplZAorICogICAgICAgICBFUlJfTUVNIGlmIHByaXZhdGUgZGF0YSBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQKKyAqICAgICAgICAgYW55IG90aGVyIGVycl90IG9uIGVycm9yCisgKi8KK2Vycl90CitldGhlcm5ldGlmX2luaXQoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgc3RydWN0IGV0aGVybmV0aWYgKmV0aGVybmV0aWY7CisKKyAgTFdJUF9BU1NFUlQoIm5ldGlmICE9IE5VTEwiLCAobmV0aWYgIT0gTlVMTCkpOworICAgIAorICBldGhlcm5ldGlmID0gbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IGV0aGVybmV0aWYpKTsKKyAgaWYgKGV0aGVybmV0aWYgPT0gTlVMTCkgeworICAgIExXSVBfREVCVUdGKE5FVElGX0RFQlVHLCAoImV0aGVybmV0aWZfaW5pdDogb3V0IG9mIG1lbW9yeVxuIikpOworICAgIHJldHVybiBFUlJfTUVNOworICB9CisKKyNpZiBMV0lQX05FVElGX0hPU1ROQU1FCisgIC8qIEluaXRpYWxpemUgaW50ZXJmYWNlIGhvc3RuYW1lICovCisgIG5ldGlmLT5ob3N0bmFtZSA9ICJsd2lwIjsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hPU1ROQU1FICovCisKKyAgLyoKKyAgICogSW5pdGlhbGl6ZSB0aGUgc25tcCB2YXJpYWJsZXMgYW5kIGNvdW50ZXJzIGluc2lkZSB0aGUgc3RydWN0IG5ldGlmLgorICAgKiBUaGUgbGFzdCBhcmd1bWVudCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB5b3VyIGxpbmsgc3BlZWQsIGluIHVuaXRzCisgICAqIG9mIGJpdHMgcGVyIHNlY29uZC4KKyAgICovCisgIE5FVElGX0lOSVRfU05NUChuZXRpZiwgc25tcF9pZlR5cGVfZXRoZXJuZXRfY3NtYWNkLCBMSU5LX1NQRUVEX09GX1lPVVJfTkVUSUZfSU5fQlBTKTsKKworICBuZXRpZi0+c3RhdGUgPSBldGhlcm5ldGlmOworICBuZXRpZi0+bmFtZVswXSA9IElGTkFNRTA7CisgIG5ldGlmLT5uYW1lWzFdID0gSUZOQU1FMTsKKyAgLyogV2UgZGlyZWN0bHkgdXNlIGV0aGFycF9vdXRwdXQoKSBoZXJlIHRvIHNhdmUgYSBmdW5jdGlvbiBjYWxsLgorICAgKiBZb3UgY2FuIGluc3RlYWQgZGVjbGFyZSB5b3VyIG93biBmdW5jdGlvbiBhbiBjYWxsIGV0aGFycF9vdXRwdXQoKQorICAgKiBmcm9tIGl0IGlmIHlvdSBoYXZlIHRvIGRvIHNvbWUgY2hlY2tzIGJlZm9yZSBzZW5kaW5nIChlLmcuIGlmIGxpbmsKKyAgICogaXMgYXZhaWxhYmxlLi4uKSAqLworICBuZXRpZi0+b3V0cHV0ID0gZXRoYXJwX291dHB1dDsKKyAgbmV0aWYtPmxpbmtvdXRwdXQgPSBsb3dfbGV2ZWxfb3V0cHV0OworICAKKyAgZXRoZXJuZXRpZi0+ZXRoYWRkciA9IChzdHJ1Y3QgZXRoX2FkZHIgKikmKG5ldGlmLT5od2FkZHJbMF0pOworICAKKyAgLyogaW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgKi8KKyAgbG93X2xldmVsX2luaXQobmV0aWYpOworCisgIHJldHVybiBFUlJfT0s7Cit9CisKKyNlbmRpZiAvKiAwICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9hdXRoLmMgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9hdXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjNDlkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2F1dGguYwpAQCAtMCwwICsxLDEzMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBhdXRoLmMgLSBOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIGFuZCBQaGFzZSBDb250cm9sIHByb2dyYW0gZmlsZS4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IE1hcmMgQm91Y2hlciwgU2VydmljZXMgSW5mb3JtYXRpcXVlcyAoTUJTSSkgaW5jLgorKiBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhlIGF1dGhvcnMgaGVyZWJ5IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsCisqIGFuZCBsaWNlbnNlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQKKyogdGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCB0aGlzCisqIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGFyZSBpbmNsdWRlZCB2ZXJiYXRpbSBpbiBhbnkgCisqIGRpc3RyaWJ1dGlvbnMuIE5vIHdyaXR0ZW4gYWdyZWVtZW50LCBsaWNlbnNlLCBvciByb3lhbHR5IGZlZSBpcyByZXF1aXJlZAorKiBmb3IgYW55IG9mIHRoZSBhdXRob3JpemVkIHVzZXMuCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPTlRSSUJVVE9SUyAqQVMgSVMqIEFORCBBTlkgRVhQUkVTUyBPUgorKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIAorKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJFVklTSU9OIEhJU1RPUlkKKyoKKyogMDMtMDEtMDEgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisqICAgUG9ydGVkIHRvIGx3SVAuCisqIDk3LTEyLTA4IEd1eSBMYW5jYXN0ZXIgPGxhbmNhc3RlcmdAYWNtLm9yZz4sIEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyogICBQb3J0ZWQgZnJvbSBwdWJsaWMgcHBwZCBjb2RlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYXV0aC5jIC0gUFBQIGF1dGhlbnRpY2F0aW9uIGFuZCBwaGFzZSBjb250cm9sLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MyBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IHRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkuICBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQorICogbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIFBQUF9TVVBQT1JUIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAicHBwLmgiCisjaW5jbHVkZSAicHBwZGVidWcuaCIKKworI2luY2x1ZGUgImZzbS5oIgorI2luY2x1ZGUgImxjcC5oIgorI2luY2x1ZGUgInBhcC5oIgorI2luY2x1ZGUgImNoYXAuaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAiaXBjcC5oIgorCisjaWYgQ0JDUF9TVVBQT1JUCisjaW5jbHVkZSAiY2JjcC5oIgorI2VuZGlmIC8qIENCQ1BfU1VQUE9SVCAqLworCisjaW5jbHVkZSAibHdpcC9pbmV0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIDAgLyogVU5VU0VEICovCisvKiBCaXRzIGluIHNjYW5fYXV0aGZpbGUgcmV0dXJuIHZhbHVlICovCisjZGVmaW5lIE5PTldJTERfU0VSVkVSICAxCisjZGVmaW5lIE5PTldJTERfQ0xJRU5UICAyCisKKyNkZWZpbmUgSVNXSUxEKHdvcmQpICAod29yZFswXSA9PSAnKicgJiYgd29yZFsxXSA9PSAwKQorI2VuZGlmIC8qIFVOVVNFRCAqLworCisjaWYgUEFQX1NVUFBPUlQgfHwgQ0hBUF9TVVBQT1JUCisvKiBUaGUgbmFtZSBieSB3aGljaCB0aGUgcGVlciBhdXRoZW50aWNhdGVkIGl0c2VsZiB0byB1cy4gKi8KK3N0YXRpYyBjaGFyIHBlZXJfYXV0aG5hbWVbTUFYTkFNRUxFTl07CisjZW5kaWYgLyogUEFQX1NVUFBPUlQgfHwgQ0hBUF9TVVBQT1JUICovCisKKy8qIFJlY29yZHMgd2hpY2ggYXV0aGVudGljYXRpb24gb3BlcmF0aW9ucyBoYXZlbid0IGNvbXBsZXRlZCB5ZXQuICovCitzdGF0aWMgaW50IGF1dGhfcGVuZGluZ1tOVU1fUFBQXTsKKworLyogU2V0IGlmIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCBwbG9naW4oKSAqLworc3RhdGljIGludCBsb2dnZWRfaW47CisKKy8qIFNldCBpZiB3ZSBoYXZlIHJ1biB0aGUgL2V0Yy9wcHAvYXV0aC11cCBzY3JpcHQuICovCitzdGF0aWMgaW50IGRpZF9hdXRodXA7IC8qIEB0b2RvLCB3ZSBkb24ndCBuZWVkIHRoaXMgaW4gbHdpcCovCisKKy8qIExpc3Qgb2YgYWRkcmVzc2VzIHdoaWNoIHRoZSBwZWVyIG1heSB1c2UuICovCitzdGF0aWMgc3RydWN0IHdvcmRsaXN0ICphZGRyZXNzZXNbTlVNX1BQUF07CisKKyNpZiAwIC8qIFVOVVNFRCAqLworLyogV29yZGxpc3QgZ2l2aW5nIGFkZHJlc3NlcyB3aGljaCB0aGUgcGVlciBtYXkgdXNlCisgICB3aXRob3V0IGF1dGhlbnRpY2F0aW5nIGl0c2VsZi4gKi8KK3N0YXRpYyBzdHJ1Y3Qgd29yZGxpc3QgKm5vYXV0aF9hZGRyczsKKworLyogRXh0cmEgb3B0aW9ucyB0byBhcHBseSwgZnJvbSB0aGUgc2VjcmV0cyBmaWxlIGVudHJ5IGZvciB0aGUgcGVlci4gKi8KK3N0YXRpYyBzdHJ1Y3Qgd29yZGxpc3QgKmV4dHJhX29wdGlvbnM7CisjZW5kaWYgLyogVU5VU0VEICovCisKKy8qIE51bWJlciBvZiBuZXR3b3JrIHByb3RvY29scyB3aGljaCB3ZSBoYXZlIG9wZW5lZC4gKi8KK3N0YXRpYyBpbnQgbnVtX25wX29wZW47CisKKy8qIE51bWJlciBvZiBuZXR3b3JrIHByb3RvY29scyB3aGljaCBoYXZlIGNvbWUgdXAuICovCitzdGF0aWMgaW50IG51bV9ucF91cDsKKworI2lmIFBBUF9TVVBQT1JUIHx8IENIQVBfU1VQUE9SVAorLyogU2V0IGlmIHdlIGdvdCB0aGUgY29udGVudHMgb2YgcGFzc3dkW10gZnJvbSB0aGUgcGFwLXNlY3JldHMgZmlsZS4gKi8KK3N0YXRpYyBpbnQgcGFzc3dkX2Zyb21fZmlsZTsKKyNlbmRpZiAvKiBQQVBfU1VQUE9SVCB8fCBDSEFQX1NVUFBPUlQgKi8KKworI2lmIDAgLyogVU5VU0VEICovCisvKiBTZXQgaWYgd2UgcmVxdWlyZSBhdXRoZW50aWNhdGlvbiBvbmx5IGJlY2F1c2Ugd2UgaGF2ZSBhIGRlZmF1bHQgcm91dGUuICovCitzdGF0aWMgYm9vbCBkZWZhdWx0X2F1dGg7CisKKy8qIEhvb2sgdG8gZW5hYmxlIGEgcGx1Z2luIHRvIGNvbnRyb2wgdGhlIGlkbGUgdGltZSBsaW1pdCAqLworaW50ICgqaWRsZV90aW1lX2hvb2spIF9fUCgoc3RydWN0IHBwcF9pZGxlICopKSA9IE5VTEw7CisKKy8qIEhvb2sgZm9yIGEgcGx1Z2luIHRvIHNheSB3aGV0aGVyIHdlIGNhbiBwb3NzaWJseSBhdXRoZW50aWNhdGUgYW55IHBlZXIgKi8KK2ludCAoKnBhcF9jaGVja19ob29rKSBfX1AoKHZvaWQpKSA9IE5VTEw7CisKKy8qIEhvb2sgZm9yIGEgcGx1Z2luIHRvIGNoZWNrIHRoZSBQQVAgdXNlciBhbmQgcGFzc3dvcmQgKi8KK2ludCAoKnBhcF9hdXRoX2hvb2spIF9fUCgoY2hhciAqdXNlciwgY2hhciAqcGFzc3dkLCBjaGFyICoqbXNncCwKKyAgICAgICAgc3RydWN0IHdvcmRsaXN0ICoqcGFkZHJzLAorICAgICAgICBzdHJ1Y3Qgd29yZGxpc3QgKipwb3B0cykpID0gTlVMTDsKKworLyogSG9vayBmb3IgYSBwbHVnaW4gdG8ga25vdyBhYm91dCB0aGUgUEFQIHVzZXIgbG9nb3V0ICovCit2b2lkICgqcGFwX2xvZ291dF9ob29rKSBfX1AoKHZvaWQpKSA9IE5VTEw7CisKKy8qIEhvb2sgZm9yIGEgcGx1Z2luIHRvIGdldCB0aGUgUEFQIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGluZyB1cyAqLworaW50ICgqcGFwX3Bhc3N3ZF9ob29rKSBfX1AoKGNoYXIgKnVzZXIsIGNoYXIgKnBhc3N3ZCkpID0gTlVMTDsKKworLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBzdGFydCBhbiBhdXRoLXVwL2Rvd24KKyAqIHNjcmlwdCB3aGlsZSBvbmUgaXMgYWxyZWFkeSBydW5uaW5nLgorICovCitlbnVtIHNjcmlwdF9zdGF0ZSB7CisgICAgc19kb3duLAorICAgIHNfdXAKK307CisKK3N0YXRpYyBlbnVtIHNjcmlwdF9zdGF0ZSBhdXRoX3N0YXRlID0gc19kb3duOworc3RhdGljIGVudW0gc2NyaXB0X3N0YXRlIGF1dGhfc2NyaXB0X3N0YXRlID0gc19kb3duOworc3RhdGljIHBpZF90IGF1dGhfc2NyaXB0X3BpZCA9IDA7CisKKy8qCisgKiBPcHRpb24gdmFyaWFibGVzLgorICogbHdpcDogc29tZSBvZiB0aGVzZSBhcmUgcHJlc2VudCBpbiB0aGUgcHBwX3NldHRpbmdzIHN0cnVjdHVyZQorICovCitib29sIHVzZWxvZ2luID0gMDsgICAgICAgICAgICAvKiBVc2UgL2V0Yy9wYXNzd2QgZm9yIGNoZWNraW5nIFBBUCAqLworYm9vbCBjcnlwdHBhcCA9IDA7ICAgICAgICAgICAgLyogUGFzc3dvcmRzIGluIHBhcC1zZWNyZXRzIGFyZSBlbmNyeXB0ZWQgKi8KK2Jvb2wgcmVmdXNlX3BhcCA9IDA7ICAgICAgICAgIC8qIERvbid0IHdhbm5hIGF1dGguIG91cnNlbHZlcyB3aXRoIFBBUCAqLworYm9vbCByZWZ1c2VfY2hhcCA9IDA7ICAgICAgICAgLyogRG9uJ3Qgd2FubmEgYXV0aC4gb3Vyc2VsdmVzIHdpdGggQ0hBUCAqLworYm9vbCB1c2Vob3N0bmFtZSA9IDA7ICAgICAgICAgLyogVXNlIGhvc3RuYW1lIGZvciBvdXJfbmFtZSAqLworYm9vbCBhdXRoX3JlcXVpcmVkID0gMDsgICAgICAgLyogQWx3YXlzIHJlcXVpcmUgYXV0aGVudGljYXRpb24gZnJvbSBwZWVyICovCitib29sIGFsbG93X2FueV9pcCA9IDA7ICAgICAgICAvKiBBbGxvdyBwZWVyIHRvIHVzZSBhbnkgSVAgYWRkcmVzcyAqLworYm9vbCBleHBsaWNpdF9yZW1vdGUgPSAwOyAgICAgLyogVXNlciBzcGVjaWZpZWQgZXhwbGljaXQgcmVtb3RlIG5hbWUgKi8KK2NoYXIgcmVtb3RlX25hbWVbTUFYTkFNRUxFTl07IC8qIFBlZXIncyBuYW1lIGZvciBhdXRoZW50aWNhdGlvbiAqLworCisjZW5kaWYgLyogVU5VU0VEICovCisKKy8qIEJpdHMgaW4gYXV0aF9wZW5kaW5nW10gKi8KKyNkZWZpbmUgUEFQX1dJVEhQRUVSICAgIDEKKyNkZWZpbmUgUEFQX1BFRVIgICAgICAgIDIKKyNkZWZpbmUgQ0hBUF9XSVRIUEVFUiAgIDQKKyNkZWZpbmUgQ0hBUF9QRUVSICAgICAgIDgKKworLyogQHRvZG8sIG1vdmUgdGhpcyBzb21ld2hlcmUgKi8KKy8qIFVzZWQgZm9yIHN0b3JpbmcgYSBzZXF1ZW5jZSBvZiB3b3Jkcy4gIFVzdWFsbHkgbWFsbG9jZWQuICovCitzdHJ1Y3Qgd29yZGxpc3QgeworICBzdHJ1Y3Qgd29yZGxpc3QgKm5leHQ7CisgIGNoYXIgICAgICAgIHdvcmRbMV07Cit9OworCisKK2V4dGVybiBjaGFyICpjcnlwdCAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisvKiBQcm90b3R5cGVzIGZvciBwcm9jZWR1cmVzIGxvY2FsIHRvIHRoaXMgZmlsZS4gKi8KKworc3RhdGljIHZvaWQgbmV0d29ya19waGFzZSAoaW50KTsKK3N0YXRpYyB2b2lkIGNoZWNrX2lkbGUgKHZvaWQgKik7CitzdGF0aWMgdm9pZCBjb25uZWN0X3RpbWVfZXhwaXJlZCAodm9pZCAqKTsKKyNpZiAwCitzdGF0aWMgaW50ICBwbG9naW4gKGNoYXIgKiwgY2hhciAqLCBjaGFyICoqLCBpbnQgKik7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHBsb2dvdXQgKHZvaWQpOworc3RhdGljIGludCAgbnVsbF9sb2dpbiAoaW50KTsKK3N0YXRpYyBpbnQgIGdldF9wYXBfcGFzc3dkIChpbnQsIGNoYXIgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgIGhhdmVfcGFwX3NlY3JldCAodm9pZCk7CitzdGF0aWMgaW50ICBoYXZlX2NoYXBfc2VjcmV0IChjaGFyICosIGNoYXIgKiwgdTMyX3QpOworc3RhdGljIGludCAgaXBfYWRkcl9jaGVjayAodTMyX3QsIHN0cnVjdCB3b3JkbGlzdCAqKTsKKworI2lmIDAgLyogUEFQX1NVUFBPUlQgfHwgQ0hBUF9TVVBQT1JUICovCitzdGF0aWMgaW50ICBzY2FuX2F1dGhmaWxlIChGSUxFICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosCisgICAgICAgICAgICAgc3RydWN0IHdvcmRsaXN0ICoqLCBzdHJ1Y3Qgd29yZGxpc3QgKiosCisgICAgICAgICAgICAgY2hhciAqKTsKK3N0YXRpYyB2b2lkIGZyZWVfd29yZGxpc3QgKHN0cnVjdCB3b3JkbGlzdCAqKTsKK3N0YXRpYyB2b2lkIGF1dGhfc2NyaXB0IChjaGFyICopOworc3RhdGljIHZvaWQgYXV0aF9zY3JpcHRfZG9uZSAodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHNldF9hbGxvd2VkX2FkZHJzIChpbnQgdW5pdCwgc3RydWN0IHdvcmRsaXN0ICphZGRycyk7CitzdGF0aWMgaW50ICBzb21lX2lwX29rIChzdHJ1Y3Qgd29yZGxpc3QgKik7CitzdGF0aWMgaW50ICBzZXR1cGFwZmlsZSAoY2hhciAqKik7CitzdGF0aWMgaW50ICBwcml2Z3JvdXAgKGNoYXIgKiopOworc3RhdGljIGludCAgc2V0X25vYXV0aF9hZGRyIChjaGFyICoqKTsKK3N0YXRpYyB2b2lkIGNoZWNrX2FjY2VzcyAoRklMRSAqLCBjaGFyICopOworI2VuZGlmIC8qIDAgKi8gLyogUEFQX1NVUFBPUlQgfHwgQ0hBUF9TVVBQT1JUICovCisKKyNpZiAwIC8qIFVOVVNFRCAqLworLyoKKyAqIEF1dGhlbnRpY2F0aW9uLXJlbGF0ZWQgb3B0aW9ucy4KKyAqLworb3B0aW9uX3QgYXV0aF9vcHRpb25zW10gPSB7CisgICAgeyAicmVxdWlyZS1wYXAiLCBvX2Jvb2wsICZsY3Bfd2FudG9wdGlvbnNbMF0ubmVnX3VwYXAsCisgICAgICAiUmVxdWlyZSBQQVAgYXV0aGVudGljYXRpb24gZnJvbSBwZWVyIiwgMSwgJmF1dGhfcmVxdWlyZWQgfSwKKyAgICB7ICIrcGFwIiwgb19ib29sLCAmbGNwX3dhbnRvcHRpb25zWzBdLm5lZ191cGFwLAorICAgICAgIlJlcXVpcmUgUEFQIGF1dGhlbnRpY2F0aW9uIGZyb20gcGVlciIsIDEsICZhdXRoX3JlcXVpcmVkIH0sCisgICAgeyAicmVmdXNlLXBhcCIsIG9fYm9vbCwgJnJlZnVzZV9wYXAsCisgICAgICAiRG9uJ3QgYWdyZWUgdG8gYXV0aCB0byBwZWVyIHdpdGggUEFQIiwgMSB9LAorICAgIHsgIi1wYXAiLCBvX2Jvb2wsICZyZWZ1c2VfcGFwLAorICAgICAgIkRvbid0IGFsbG93IFBBUCBhdXRoZW50aWNhdGlvbiB3aXRoIHBlZXIiLCAxIH0sCisgICAgeyAicmVxdWlyZS1jaGFwIiwgb19ib29sLCAmbGNwX3dhbnRvcHRpb25zWzBdLm5lZ19jaGFwLAorICAgICAgIlJlcXVpcmUgQ0hBUCBhdXRoZW50aWNhdGlvbiBmcm9tIHBlZXIiLCAxLCAmYXV0aF9yZXF1aXJlZCB9LAorICAgIHsgIitjaGFwIiwgb19ib29sLCAmbGNwX3dhbnRvcHRpb25zWzBdLm5lZ19jaGFwLAorICAgICAgIlJlcXVpcmUgQ0hBUCBhdXRoZW50aWNhdGlvbiBmcm9tIHBlZXIiLCAxLCAmYXV0aF9yZXF1aXJlZCB9LAorICAgIHsgInJlZnVzZS1jaGFwIiwgb19ib29sLCAmcmVmdXNlX2NoYXAsCisgICAgICAiRG9uJ3QgYWdyZWUgdG8gYXV0aCB0byBwZWVyIHdpdGggQ0hBUCIsIDEgfSwKKyAgICB7ICItY2hhcCIsIG9fYm9vbCwgJnJlZnVzZV9jaGFwLAorICAgICAgIkRvbid0IGFsbG93IENIQVAgYXV0aGVudGljYXRpb24gd2l0aCBwZWVyIiwgMSB9LAorICAgIHsgIm5hbWUiLCBvX3N0cmluZywgb3VyX25hbWUsCisgICAgICAiU2V0IGxvY2FsIG5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uIiwKKyAgICAgIE9QVF9QUklWfE9QVF9TVEFUSUMsIE5VTEwsIE1BWE5BTUVMRU4gfSwKKyAgICB7ICJ1c2VyIiwgb19zdHJpbmcsIHVzZXIsCisgICAgICAiU2V0IG5hbWUgZm9yIGF1dGggd2l0aCBwZWVyIiwgT1BUX1NUQVRJQywgTlVMTCwgTUFYTkFNRUxFTiB9LAorICAgIHsgInVzZWhvc3RuYW1lIiwgb19ib29sLCAmdXNlaG9zdG5hbWUsCisgICAgICAiTXVzdCB1c2UgaG9zdG5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uIiwgMSB9LAorICAgIHsgInJlbW90ZW5hbWUiLCBvX3N0cmluZywgcmVtb3RlX25hbWUsCisgICAgICAiU2V0IHJlbW90ZSBuYW1lIGZvciBhdXRoZW50aWNhdGlvbiIsIE9QVF9TVEFUSUMsCisgICAgICAmZXhwbGljaXRfcmVtb3RlLCBNQVhOQU1FTEVOIH0sCisgICAgeyAiYXV0aCIsIG9fYm9vbCwgJmF1dGhfcmVxdWlyZWQsCisgICAgICAiUmVxdWlyZSBhdXRoZW50aWNhdGlvbiBmcm9tIHBlZXIiLCAxIH0sCisgICAgeyAibm9hdXRoIiwgb19ib29sLCAmYXV0aF9yZXF1aXJlZCwKKyAgICAgICJEb24ndCByZXF1aXJlIHBlZXIgdG8gYXV0aGVudGljYXRlIiwgT1BUX1BSSVYsICZhbGxvd19hbnlfaXAgfSwKKyAgICB7ICAibG9naW4iLCBvX2Jvb2wsICZ1c2Vsb2dpbiwKKyAgICAgICJVc2Ugc3lzdGVtIHBhc3N3b3JkIGRhdGFiYXNlIGZvciBQQVAiLCAxIH0sCisgICAgeyAicGFwY3J5cHQiLCBvX2Jvb2wsICZjcnlwdHBhcCwKKyAgICAgICJQQVAgcGFzc3dvcmRzIGFyZSBlbmNyeXB0ZWQiLCAxIH0sCisgICAgeyAiK3VhIiwgb19zcGVjaWFsLCAodm9pZCAqKXNldHVwYXBmaWxlLAorICAgICAgIkdldCBQQVAgdXNlciBhbmQgcGFzc3dvcmQgZnJvbSBmaWxlIiB9LAorICAgIHsgInBhc3N3b3JkIiwgb19zdHJpbmcsIHBhc3N3ZCwKKyAgICAgICJQYXNzd29yZCBmb3IgYXV0aGVudGljYXRpbmcgdXMgdG8gdGhlIHBlZXIiLCBPUFRfU1RBVElDLAorICAgICAgTlVMTCwgTUFYU0VDUkVUTEVOIH0sCisgICAgeyAicHJpdmdyb3VwIiwgb19zcGVjaWFsLCAodm9pZCAqKXByaXZncm91cCwKKyAgICAgICJBbGxvdyBncm91cCBtZW1iZXJzIHRvIHVzZSBwcml2aWxlZ2VkIG9wdGlvbnMiLCBPUFRfUFJJViB9LAorICAgIHsgImFsbG93LWlwIiwgb19zcGVjaWFsLCAodm9pZCAqKXNldF9ub2F1dGhfYWRkciwKKyAgICAgICJTZXQgSVAgYWRkcmVzcyhlcykgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aG91dCBhdXRoZW50aWNhdGlvbiIsCisgICAgICBPUFRfUFJJViB9LAorICAgIHsgTlVMTCB9Cit9OworI2VuZGlmIC8qIFVOVVNFRCAqLworI2lmIDAgLyogVU5VU0VEICovCisvKgorICogc2V0dXBhcGZpbGUgLSBzcGVjaWZpZXMgVVBBUCBpbmZvIGZvciBhdXRoZW50aWNhdGluZyB3aXRoIHBlZXIuCisgKi8KK3N0YXRpYyBpbnQKK3NldHVwYXBmaWxlKGNoYXIgKiphcmd2KQoreworICAgIEZJTEUgKiB1ZmlsZTsKKyAgICBpbnQgbDsKKworICAgIGxjcF9hbGxvd29wdGlvbnNbMF0ubmVnX3VwYXAgPSAxOworCisgICAgLyogb3BlbiB1c2VyIGluZm8gZmlsZSAqLworICAgIHNldGV1aWQoZ2V0dWlkKCkpOworICAgIHVmaWxlID0gZm9wZW4oKmFyZ3YsICJyIik7CisgICAgc2V0ZXVpZCgwKTsKKyAgICBpZiAodWZpbGUgPT0gTlVMTCkgeworICAgICAgb3B0aW9uX2Vycm9yKCJ1bmFibGUgdG8gb3BlbiB1c2VyIGxvZ2luIGRhdGEgZmlsZSAlcyIsICphcmd2KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjaGVja19hY2Nlc3ModWZpbGUsICphcmd2KTsKKworICAgIC8qIGdldCB1c2VybmFtZSAqLworICAgIGlmIChmZ2V0cyh1c2VyLCBNQVhOQU1FTEVOIC0gMSwgdWZpbGUpID09IE5VTEwKKyAgICAgICAgfHwgZmdldHMocGFzc3dkLCBNQVhTRUNSRVRMRU4gLSAxLCB1ZmlsZSkgPT0gTlVMTCl7CisgICAgICBvcHRpb25fZXJyb3IoInVuYWJsZSB0byByZWFkIHVzZXIgbG9naW4gZGF0YSBmaWxlICVzIiwgKmFyZ3YpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZjbG9zZSh1ZmlsZSk7CisKKyAgICAvKiBnZXQgcmlkIG9mIG5ld2xpbmVzICovCisgICAgbCA9IHN0cmxlbih1c2VyKTsKKyAgICBpZiAobCA+IDAgJiYgdXNlcltsLTFdID09ICdcbicpCisgICAgICB1c2VyW2wtMV0gPSAwOworICAgIGwgPSBzdHJsZW4ocGFzc3dkKTsKKyAgICBpZiAobCA+IDAgJiYgcGFzc3dkW2wtMV0gPT0gJ1xuJykKKyAgICAgIHBhc3N3ZFtsLTFdID0gMDsKKworICAgIHJldHVybiAoMSk7Cit9CisjZW5kaWYgLyogVU5VU0VEICovCisKKyNpZiAwIC8qIFVOVVNFRCAqLworLyoKKyAqIHByaXZncm91cCAtIGFsbG93IG1lbWJlcnMgb2YgdGhlIGdyb3VwIHRvIGhhdmUgcHJpdmlsZWdlZCBhY2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3ByaXZncm91cChjaGFyICoqYXJndikKK3sKKyAgICBzdHJ1Y3QgZ3JvdXAgKmc7CisgICAgaW50IGk7CisKKyAgICBnID0gZ2V0Z3JuYW0oKmFyZ3YpOworICAgIGlmIChnID09IDApIHsKKyAgICAgIG9wdGlvbl9lcnJvcigiZ3JvdXAgJXMgaXMgdW5rbm93biIsICphcmd2KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgKytpKSB7CisgICAgICBpZiAoZ3JvdXBzW2ldID09IGctPmdyX2dpZCkgeworICAgICAgICBwcml2aWxlZ2VkID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQorI2VuZGlmCisKKyNpZiAwIC8qIFVOVVNFRCAqLworLyoKKyAqIHNldF9ub2F1dGhfYWRkciAtIHNldCBhZGRyZXNzKGVzKSB0aGF0IGNhbiBiZSB1c2VkIHdpdGhvdXQgYXV0aGVudGljYXRpb24uCisgKiBFcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgYW4gZW50cnkgbGlrZSBgIiIgKiAiIiBhZGRyJyBpbiBwYXAtc2VjcmV0cy4KKyAqLworc3RhdGljIGludAorc2V0X25vYXV0aF9hZGRyKGNoYXIgKiphcmd2KQoreworICAgIGNoYXIgKmFkZHIgPSAqYXJndjsKKyAgICBpbnQgbCA9IHN0cmxlbihhZGRyKTsKKyAgICBzdHJ1Y3Qgd29yZGxpc3QgKndwOworCisgICAgd3AgPSAoc3RydWN0IHdvcmRsaXN0ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHdvcmRsaXN0KSArIGwgKyAxKTsKKyAgICBpZiAod3AgPT0gTlVMTCkKKyAgICAgIG5vdm0oImFsbG93LWlwIGFyZ3VtZW50Iik7CisgICAgd3AtPndvcmQgPSAoY2hhciAqKSAod3AgKyAxKTsKKyAgICB3cC0+bmV4dCA9IG5vYXV0aF9hZGRyczsKKyAgICBCQ09QWShhZGRyLCB3cC0+d29yZCwgbCk7CisgICAgbm9hdXRoX2FkZHJzID0gd3A7CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogVU5VU0VEICovCisKKy8qCisgKiBBbiBPcGVuIG9uIExDUCBoYXMgcmVxdWVzdGVkIGEgY2hhbmdlIGZyb20gRGVhZCB0byBFc3RhYmxpc2ggcGhhc2UuCisgKiBEbyB3aGF0J3MgbmVjZXNzYXJ5IHRvIGJyaW5nIHRoZSBwaHlzaWNhbCBsYXllciB1cC4KKyAqLwordm9pZAorbGlua19yZXF1aXJlZChpbnQgdW5pdCkKK3sKKyAgTFdJUF9VTlVTRURfQVJHKHVuaXQpOworCisgIEFVVEhERUJVRyhMT0dfSU5GTywgKCJsaW5rX3JlcXVpcmVkOiAlZFxuIiwgdW5pdCkpOworfQorCisvKgorICogTENQIGhhcyB0ZXJtaW5hdGVkIHRoZSBsaW5rOyBnbyB0byB0aGUgRGVhZCBwaGFzZSBhbmQgdGFrZSB0aGUKKyAqIHBoeXNpY2FsIGxheWVyIGRvd24uCisgKi8KK3ZvaWQKK2xpbmtfdGVybWluYXRlZChpbnQgdW5pdCkKK3sKKyAgQVVUSERFQlVHKExPR19JTkZPLCAoImxpbmtfdGVybWluYXRlZDogJWRcbiIsIHVuaXQpKTsKKyAgaWYgKGxjcF9waGFzZVt1bml0XSA9PSBQSEFTRV9ERUFEKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChsb2dnZWRfaW4pIHsKKyAgICBwbG9nb3V0KCk7CisgIH0KKyAgbGNwX3BoYXNlW3VuaXRdID0gUEhBU0VfREVBRDsKKyAgQVVUSERFQlVHKExPR19OT1RJQ0UsICgiQ29ubmVjdGlvbiB0ZXJtaW5hdGVkLlxuIikpOworICBwcHBMaW5rVGVybWluYXRlZCh1bml0KTsKK30KKworLyoKKyAqIExDUCBoYXMgZ29uZSBkb3duOyBpdCB3aWxsIGVpdGhlciBkaWUgb3IgdHJ5IHRvIHJlLWVzdGFibGlzaC4KKyAqLwordm9pZAorbGlua19kb3duKGludCB1bml0KQoreworICBpbnQgaTsKKyAgc3RydWN0IHByb3RlbnQgKnByb3RwOworCisgIEFVVEhERUJVRyhMT0dfSU5GTywgKCJsaW5rX2Rvd246ICVkXG4iLCB1bml0KSk7CisKKyAgaWYgKGRpZF9hdXRodXApIHsKKyAgICAvKiBYWFggRG8gbGluayBkb3duIHByb2Nlc3NpbmcuICovCisgICAgZGlkX2F1dGh1cCA9IDA7CisgIH0KKyAgZm9yIChpID0gMDsgKHByb3RwID0gcHBwX3Byb3RvY29sc1tpXSkgIT0gTlVMTDsgKytpKSB7CisgICAgaWYgKCFwcm90cC0+ZW5hYmxlZF9mbGFnKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHByb3RwLT5wcm90b2NvbCAhPSBQUFBfTENQICYmIHByb3RwLT5sb3dlcmRvd24gIT0gTlVMTCkgeworICAgICAgKCpwcm90cC0+bG93ZXJkb3duKSh1bml0KTsKKyAgICB9CisgICAgaWYgKHByb3RwLT5wcm90b2NvbCA8IDB4QzAwMCAmJiBwcm90cC0+Y2xvc2UgIT0gTlVMTCkgeworICAgICAgKCpwcm90cC0+Y2xvc2UpKHVuaXQsICJMQ1AgZG93biIpOworICAgIH0KKyAgfQorICBudW1fbnBfb3BlbiA9IDA7ICAvKiBudW1iZXIgb2YgbmV0d29yayBwcm90b2NvbHMgd2UgaGF2ZSBvcGVuZWQgKi8KKyAgbnVtX25wX3VwID0gMDsgICAgLyogTnVtYmVyIG9mIG5ldHdvcmsgcHJvdG9jb2xzIHdoaWNoIGhhdmUgY29tZSB1cCAqLworCisgIGlmIChsY3BfcGhhc2VbdW5pdF0gIT0gUEhBU0VfREVBRCkgeworICAgIGxjcF9waGFzZVt1bml0XSA9IFBIQVNFX1RFUk1JTkFURTsKKyAgfQorICBwcHBMaW5rRG93bih1bml0KTsKK30KKworLyoKKyAqIFRoZSBsaW5rIGlzIGVzdGFibGlzaGVkLgorICogUHJvY2VlZCB0byB0aGUgRGVhZCwgQXV0aGVudGljYXRlIG9yIE5ldHdvcmsgcGhhc2UgYXMgYXBwcm9wcmlhdGUuCisgKi8KK3ZvaWQKK2xpbmtfZXN0YWJsaXNoZWQoaW50IHVuaXQpCit7CisgIGludCBhdXRoOworICBpbnQgaTsKKyAgc3RydWN0IHByb3RlbnQgKnByb3RwOworICBsY3Bfb3B0aW9ucyAqd28gPSAmbGNwX3dhbnRvcHRpb25zW3VuaXRdOworICBsY3Bfb3B0aW9ucyAqZ28gPSAmbGNwX2dvdG9wdGlvbnNbdW5pdF07CisjaWYgUEFQX1NVUFBPUlQgfHwgQ0hBUF9TVVBQT1JUCisgIGxjcF9vcHRpb25zICpobyA9ICZsY3BfaGlzb3B0aW9uc1t1bml0XTsKKyNlbmRpZiAvKiBQQVBfU1VQUE9SVCB8fCBDSEFQX1NVUFBPUlQgKi8KKworICBBVVRIREVCVUcoTE9HX0lORk8sICgibGlua19lc3RhYmxpc2hlZDogdW5pdCAlZDsgTG93ZXJpbmcgdXAgYWxsIHByb3RvY29scy4uLlxuIiwgdW5pdCkpOworICAvKgorICAgKiBUZWxsIGhpZ2hlci1sZXZlbCBwcm90b2NvbHMgdGhhdCBMQ1AgaXMgdXAuCisgICAqLworICBmb3IgKGkgPSAwOyAocHJvdHAgPSBwcHBfcHJvdG9jb2xzW2ldKSAhPSBOVUxMOyArK2kpIHsKKyAgICBpZiAocHJvdHAtPnByb3RvY29sICE9IFBQUF9MQ1AgJiYgcHJvdHAtPmVuYWJsZWRfZmxhZyAmJiBwcm90cC0+bG93ZXJ1cCAhPSBOVUxMKSB7CisgICAgICAoKnByb3RwLT5sb3dlcnVwKSh1bml0KTsKKyAgICB9CisgIH0KKyAgaWYgKHBwcF9zZXR0aW5ncy5hdXRoX3JlcXVpcmVkICYmICEoZ28tPm5lZ19jaGFwIHx8IGdvLT5uZWdfdXBhcCkpIHsKKyAgICAvKgorICAgICAqIFdlIHdhbnRlZCB0aGUgcGVlciB0byBhdXRoZW50aWNhdGUgaXRzZWxmLCBhbmQgaXQgcmVmdXNlZDoKKyAgICAgKiB0cmVhdCBpdCBhcyB0aG91Z2ggaXQgYXV0aGVudGljYXRlZCB3aXRoIFBBUCB1c2luZyBhIHVzZXJuYW1lCisgICAgICogb2YgIiIgYW5kIGEgcGFzc3dvcmQgb2YgIiIuICBJZiB0aGF0J3Mgbm90IE9LLCBib290IGl0IG91dC4KKyAgICAgKi8KKyAgICBpZiAoIXdvLT5uZWdfdXBhcCB8fCAhbnVsbF9sb2dpbih1bml0KSkgeworICAgICAgQVVUSERFQlVHKExPR19XQVJOSU5HLCAoInBlZXIgcmVmdXNlZCB0byBhdXRoZW50aWNhdGVcbiIpKTsKKyAgICAgIGxjcF9jbG9zZSh1bml0LCAicGVlciByZWZ1c2VkIHRvIGF1dGhlbnRpY2F0ZSIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGxjcF9waGFzZVt1bml0XSA9IFBIQVNFX0FVVEhFTlRJQ0FURTsKKyAgYXV0aCA9IDA7CisjaWYgQ0hBUF9TVVBQT1JUCisgIGlmIChnby0+bmVnX2NoYXApIHsKKyAgICBDaGFwQXV0aFBlZXIodW5pdCwgcHBwX3NldHRpbmdzLm91cl9uYW1lLCBnby0+Y2hhcF9tZHR5cGUpOworICAgIGF1dGggfD0gQ0hBUF9QRUVSOworICB9IAorI2VuZGlmIC8qIENIQVBfU1VQUE9SVCAqLworI2lmIFBBUF9TVVBQT1JUICYmIENIQVBfU1VQUE9SVAorICBlbHNlCisjZW5kaWYgLyogUEFQX1NVUFBPUlQgJiYgQ0hBUF9TVVBQT1JUICovCisjaWYgUEFQX1NVUFBPUlQKKyAgaWYgKGdvLT5uZWdfdXBhcCkgeworICAgIHVwYXBfYXV0aHBlZXIodW5pdCk7CisgICAgYXV0aCB8PSBQQVBfUEVFUjsKKyAgfQorI2VuZGlmIC8qIFBBUF9TVVBQT1JUICovCisjaWYgQ0hBUF9TVVBQT1JUCisgIGlmIChoby0+bmVnX2NoYXApIHsKKyAgICBDaGFwQXV0aFdpdGhQZWVyKHVuaXQsIHBwcF9zZXR0aW5ncy51c2VyLCBoby0+Y2hhcF9tZHR5cGUpOworICAgIGF1dGggfD0gQ0hBUF9XSVRIUEVFUjsKKyAgfQorI2VuZGlmIC8qIENIQVBfU1VQUE9SVCAqLworI2lmIFBBUF9TVVBQT1JUICYmIENIQVBfU1VQUE9SVAorICBlbHNlCisjZW5kaWYgLyogUEFQX1NVUFBPUlQgJiYgQ0hBUF9TVVBQT1JUICovCisjaWYgUEFQX1NVUFBPUlQKKyAgaWYgKGhvLT5uZWdfdXBhcCkgeworICAgIGlmIChwcHBfc2V0dGluZ3MucGFzc3dkWzBdID09IDApIHsKKyAgICAgIHBhc3N3ZF9mcm9tX2ZpbGUgPSAxOworICAgICAgaWYgKCFnZXRfcGFwX3Bhc3N3ZCh1bml0LCBwcHBfc2V0dGluZ3MudXNlciwgcHBwX3NldHRpbmdzLnBhc3N3ZCkpIHsKKyAgICAgICAgQVVUSERFQlVHKExPR19FUlIsICgiTm8gc2VjcmV0IGZvdW5kIGZvciBQQVAgbG9naW5cbiIpKTsKKyAgICAgIH0KKyAgICB9CisgICAgdXBhcF9hdXRod2l0aHBlZXIodW5pdCwgcHBwX3NldHRpbmdzLnVzZXIsIHBwcF9zZXR0aW5ncy5wYXNzd2QpOworICAgIGF1dGggfD0gUEFQX1dJVEhQRUVSOworICB9CisjZW5kaWYgLyogUEFQX1NVUFBPUlQgKi8KKyAgYXV0aF9wZW5kaW5nW3VuaXRdID0gYXV0aDsKKworICBpZiAoIWF1dGgpIHsKKyAgICBuZXR3b3JrX3BoYXNlKHVuaXQpOworICB9Cit9CisKKy8qCisgKiBQcm9jZWVkIHRvIHRoZSBuZXR3b3JrIHBoYXNlLgorICovCitzdGF0aWMgdm9pZAorbmV0d29ya19waGFzZShpbnQgdW5pdCkKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBwcm90ZW50ICpwcm90cDsKKyAgbGNwX29wdGlvbnMgKmdvID0gJmxjcF9nb3RvcHRpb25zW3VuaXRdOworCisgIC8qCisgICAqIElmIHRoZSBwZWVyIGhhZCB0byBhdXRoZW50aWNhdGUsIHJ1biB0aGUgYXV0aC11cCBzY3JpcHQgbm93LgorICAgKi8KKyAgaWYgKChnby0+bmVnX2NoYXAgfHwgZ28tPm5lZ191cGFwKSAmJiAhZGlkX2F1dGh1cCkgeworICAgIC8qIFhYWCBEbyBzZXR1cCBmb3IgcGVlciBhdXRoZW50aWNhdGlvbi4gKi8KKyAgICBkaWRfYXV0aHVwID0gMTsKKyAgfQorCisjaWYgQ0JDUF9TVVBQT1JUCisgIC8qCisgICAqIElmIHdlIG5lZ290aWF0ZWQgY2FsbGJhY2ssIGRvIGl0IG5vdy4KKyAgICovCisgIGlmIChnby0+bmVnX2NiY3ApIHsKKyAgICBsY3BfcGhhc2VbdW5pdF0gPSBQSEFTRV9DQUxMQkFDSzsKKyAgICAoKmNiY3BfcHJvdGVudC5vcGVuKSh1bml0KTsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZiAvKiBDQkNQX1NVUFBPUlQgKi8KKworICBsY3BfcGhhc2VbdW5pdF0gPSBQSEFTRV9ORVRXT1JLOworICBmb3IgKGkgPSAwOyAocHJvdHAgPSBwcHBfcHJvdG9jb2xzW2ldKSAhPSBOVUxMOyArK2kpIHsKKyAgICBpZiAocHJvdHAtPnByb3RvY29sIDwgMHhDMDAwICYmIHByb3RwLT5lbmFibGVkX2ZsYWcgJiYgcHJvdHAtPm9wZW4gIT0gTlVMTCkgeworICAgICAgKCpwcm90cC0+b3BlbikodW5pdCk7CisgICAgICBpZiAocHJvdHAtPnByb3RvY29sICE9IFBQUF9DQ1ApIHsKKyAgICAgICAgKytudW1fbnBfb3BlbjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAobnVtX25wX29wZW4gPT0gMCkgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICBsY3BfY2xvc2UoMCwgIk5vIG5ldHdvcmsgcHJvdG9jb2xzIHJ1bm5pbmciKTsKKyAgfQorfQorLyogQHRvZG86IGFkZCB2b2lkIHN0YXJ0X25ldHdvcmtzKHZvaWQpIGhlcmUgKHBwcGQgMi4zLjExKSAqLworCisvKgorICogVGhlIHBlZXIgaGFzIGZhaWxlZCB0byBhdXRoZW50aWNhdGUgaGltc2VsZiB1c2luZyBgcHJvdG9jb2wnLgorICovCit2b2lkCithdXRoX3BlZXJfZmFpbChpbnQgdW5pdCwgdTE2X3QgcHJvdG9jb2wpCit7CisgIExXSVBfVU5VU0VEX0FSRyhwcm90b2NvbCk7CisKKyAgQVVUSERFQlVHKExPR19JTkZPLCAoImF1dGhfcGVlcl9mYWlsOiAlZCBwcm90bz0lWFxuIiwgdW5pdCwgcHJvdG9jb2wpKTsKKyAgLyoKKyAgICogQXV0aGVudGljYXRpb24gZmFpbHVyZTogdGFrZSB0aGUgbGluayBkb3duCisgICAqLworICBsY3BfY2xvc2UodW5pdCwgIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCIpOworfQorCisKKyNpZiBQQVBfU1VQUE9SVCB8fCBDSEFQX1NVUFBPUlQKKy8qCisgKiBUaGUgcGVlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZCB1c2luZyBgcHJvdG9jb2wnLgorICovCit2b2lkCithdXRoX3BlZXJfc3VjY2VzcyhpbnQgdW5pdCwgdTE2X3QgcHJvdG9jb2wsIGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworICBpbnQgcGJpdDsKKworICBBVVRIREVCVUcoTE9HX0lORk8sICgiYXV0aF9wZWVyX3N1Y2Nlc3M6ICVkIHByb3RvPSVYXG4iLCB1bml0LCBwcm90b2NvbCkpOworICBzd2l0Y2ggKHByb3RvY29sKSB7CisgICAgY2FzZSBQUFBfQ0hBUDoKKyAgICAgIHBiaXQgPSBDSEFQX1BFRVI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUF9QQVA6CisgICAgICBwYml0ID0gUEFQX1BFRVI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgQVVUSERFQlVHKExPR19XQVJOSU5HLCAoImF1dGhfcGVlcl9zdWNjZXNzOiB1bmtub3duIHByb3RvY29sICV4XG4iLCBwcm90b2NvbCkpOworICAgICAgcmV0dXJuOworICB9CisKKyAgLyoKKyAgICogU2F2ZSB0aGUgYXV0aGVudGljYXRlZCBuYW1lIG9mIHRoZSBwZWVyIGZvciBsYXRlci4KKyAgICovCisgIGlmIChuYW1lbGVuID4gKGludClzaXplb2YocGVlcl9hdXRobmFtZSkgLSAxKSB7CisgICAgbmFtZWxlbiA9IHNpemVvZihwZWVyX2F1dGhuYW1lKSAtIDE7CisgIH0KKyAgQkNPUFkobmFtZSwgcGVlcl9hdXRobmFtZSwgbmFtZWxlbik7CisgIHBlZXJfYXV0aG5hbWVbbmFtZWxlbl0gPSAwOworICAKKyAgLyoKKyAgICogSWYgdGhlcmUgaXMgbm8gbW9yZSBhdXRoZW50aWNhdGlvbiBzdGlsbCB0byBiZSBkb25lLAorICAgKiBwcm9jZWVkIHRvIHRoZSBuZXR3b3JrIChvciBjYWxsYmFjaykgcGhhc2UuCisgICAqLworICBpZiAoKGF1dGhfcGVuZGluZ1t1bml0XSAmPSB+cGJpdCkgPT0gMCkgeworICAgIG5ldHdvcmtfcGhhc2UodW5pdCk7CisgIH0KK30KKworLyoKKyAqIFdlIGhhdmUgZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgdG8gdGhlIHBlZXIgdXNpbmcgYHByb3RvY29sJy4KKyAqLwordm9pZAorYXV0aF93aXRocGVlcl9mYWlsKGludCB1bml0LCB1MTZfdCBwcm90b2NvbCkKK3sKKyAgaW50IGVyckNvZGUgPSBQUFBFUlJfQVVUSEZBSUw7CisKKyAgTFdJUF9VTlVTRURfQVJHKHByb3RvY29sKTsKKworICBBVVRIREVCVUcoTE9HX0lORk8sICgiYXV0aF93aXRocGVlcl9mYWlsOiAlZCBwcm90bz0lWFxuIiwgdW5pdCwgcHJvdG9jb2wpKTsKKyAgaWYgKHBhc3N3ZF9mcm9tX2ZpbGUpIHsKKyAgICBCWkVSTyhwcHBfc2V0dGluZ3MucGFzc3dkLCBNQVhTRUNSRVRMRU4pOworICB9CisKKyAgLyoKKyAgICogV2UndmUgZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgdG8gb3VyIHBlZXIuCisgICAqIEhlJ2xsIHByb2JhYmx5IHRha2UgdGhlIGxpbmsgZG93biwgYW5kIHRoZXJlJ3Mgbm90IG11Y2gKKyAgICogd2UgY2FuIGRvIGV4Y2VwdCB3YWl0IGZvciB0aGF0LgorICAgKi8KKyAgcHBwSU9DdGwodW5pdCwgUFBQQ1RMU19FUlJDT0RFLCAmZXJyQ29kZSk7CisgIGxjcF9jbG9zZSh1bml0LCAiRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgdG8gcGVlciIpOworfQorCisvKgorICogV2UgaGF2ZSBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZCBvdXJzZWx2ZXMgd2l0aCB0aGUgcGVlciB1c2luZyBgcHJvdG9jb2wnLgorICovCit2b2lkCithdXRoX3dpdGhwZWVyX3N1Y2Nlc3MoaW50IHVuaXQsIHUxNl90IHByb3RvY29sKQoreworICBpbnQgcGJpdDsKKworICBBVVRIREVCVUcoTE9HX0lORk8sICgiYXV0aF93aXRocGVlcl9zdWNjZXNzOiAlZCBwcm90bz0lWFxuIiwgdW5pdCwgcHJvdG9jb2wpKTsKKyAgc3dpdGNoIChwcm90b2NvbCkgeworICAgIGNhc2UgUFBQX0NIQVA6CisgICAgICBwYml0ID0gQ0hBUF9XSVRIUEVFUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBQX1BBUDoKKyAgICAgIGlmIChwYXNzd2RfZnJvbV9maWxlKSB7CisgICAgICAgIEJaRVJPKHBwcF9zZXR0aW5ncy5wYXNzd2QsIE1BWFNFQ1JFVExFTik7CisgICAgICB9CisgICAgICBwYml0ID0gUEFQX1dJVEhQRUVSOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEFVVEhERUJVRyhMT0dfV0FSTklORywgKCJhdXRoX3BlZXJfc3VjY2VzczogdW5rbm93biBwcm90b2NvbCAleFxuIiwgcHJvdG9jb2wpKTsKKyAgICAgIHBiaXQgPSAwOworICB9CisKKyAgLyoKKyAgICogSWYgdGhlcmUgaXMgbm8gbW9yZSBhdXRoZW50aWNhdGlvbiBzdGlsbCBiZWluZyBkb25lLAorICAgKiBwcm9jZWVkIHRvIHRoZSBuZXR3b3JrIChvciBjYWxsYmFjaykgcGhhc2UuCisgICAqLworICBpZiAoKGF1dGhfcGVuZGluZ1t1bml0XSAmPSB+cGJpdCkgPT0gMCkgeworICAgIG5ldHdvcmtfcGhhc2UodW5pdCk7CisgIH0KK30KKyNlbmRpZiAvKiBQQVBfU1VQUE9SVCB8fCBDSEFQX1NVUFBPUlQgKi8KKworCisvKgorICogbnBfdXAgLSBhIG5ldHdvcmsgcHJvdG9jb2wgaGFzIGNvbWUgdXAuCisgKi8KK3ZvaWQKK25wX3VwKGludCB1bml0LCB1MTZfdCBwcm90bykKK3sKKyAgTFdJUF9VTlVTRURfQVJHKHVuaXQpOworICBMV0lQX1VOVVNFRF9BUkcocHJvdG8pOworCisgIEFVVEhERUJVRyhMT0dfSU5GTywgKCJucF91cDogJWQgcHJvdG89JVhcbiIsIHVuaXQsIHByb3RvKSk7CisgIGlmIChudW1fbnBfdXAgPT0gMCkgeworICAgIEFVVEhERUJVRyhMT0dfSU5GTywgKCJucF91cDogbWF4Y29ubmVjdD0lZCBpZGxlX3RpbWVfbGltaXQ9JWRcbiIscHBwX3NldHRpbmdzLm1heGNvbm5lY3QscHBwX3NldHRpbmdzLmlkbGVfdGltZV9saW1pdCkpOworICAgIC8qCisgICAgICogQXQgdGhpcyBwb2ludCB3ZSBjb25zaWRlciB0aGF0IHRoZSBsaW5rIGhhcyBjb21lIHVwIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICBpZiAocHBwX3NldHRpbmdzLmlkbGVfdGltZV9saW1pdCA+IDApIHsKKyAgICAgIFRJTUVPVVQoY2hlY2tfaWRsZSwgTlVMTCwgcHBwX3NldHRpbmdzLmlkbGVfdGltZV9saW1pdCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgYSB0aW1lb3V0IHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIG9uY2UgdGhlIG1heGltdW0KKyAgICAgKiBjb25uZWN0IHRpbWUgaGFzIGV4cGlyZWQuCisgICAgICovCisgICAgaWYgKHBwcF9zZXR0aW5ncy5tYXhjb25uZWN0ID4gMCkgeworICAgICAgVElNRU9VVChjb25uZWN0X3RpbWVfZXhwaXJlZCwgMCwgcHBwX3NldHRpbmdzLm1heGNvbm5lY3QpOworICAgIH0KKyAgfQorICArK251bV9ucF91cDsKK30KKworLyoKKyAqIG5wX2Rvd24gLSBhIG5ldHdvcmsgcHJvdG9jb2wgaGFzIGdvbmUgZG93bi4KKyAqLwordm9pZAorbnBfZG93bihpbnQgdW5pdCwgdTE2X3QgcHJvdG8pCit7CisgIExXSVBfVU5VU0VEX0FSRyh1bml0KTsKKyAgTFdJUF9VTlVTRURfQVJHKHByb3RvKTsKKworICBBVVRIREVCVUcoTE9HX0lORk8sICgibnBfZG93bjogJWQgcHJvdG89JVhcbiIsIHVuaXQsIHByb3RvKSk7CisgIGlmICgtLW51bV9ucF91cCA9PSAwICYmIHBwcF9zZXR0aW5ncy5pZGxlX3RpbWVfbGltaXQgPiAwKSB7CisgICAgVU5USU1FT1VUKGNoZWNrX2lkbGUsIE5VTEwpOworICB9Cit9CisKKy8qCisgKiBucF9maW5pc2hlZCAtIGEgbmV0d29yayBwcm90b2NvbCBoYXMgZmluaXNoZWQgdXNpbmcgdGhlIGxpbmsuCisgKi8KK3ZvaWQKK25wX2ZpbmlzaGVkKGludCB1bml0LCB1MTZfdCBwcm90bykKK3sKKyAgTFdJUF9VTlVTRURfQVJHKHVuaXQpOworICBMV0lQX1VOVVNFRF9BUkcocHJvdG8pOworCisgIEFVVEhERUJVRyhMT0dfSU5GTywgKCJucF9maW5pc2hlZDogJWQgcHJvdG89JVhcbiIsIHVuaXQsIHByb3RvKSk7CisgIGlmICgtLW51bV9ucF9vcGVuIDw9IDApIHsKKyAgICAvKiBubyBmdXJ0aGVyIHVzZSBmb3IgdGhlIGxpbms6IHNodXQgdXAgc2hvcC4gKi8KKyAgICBsY3BfY2xvc2UoMCwgIk5vIG5ldHdvcmsgcHJvdG9jb2xzIHJ1bm5pbmciKTsKKyAgfQorfQorCisvKgorICogY2hlY2tfaWRsZSAtIGNoZWNrIHdoZXRoZXIgdGhlIGxpbmsgaGFzIGJlZW4gaWRsZSBmb3IgbG9uZworICogZW5vdWdoIHRoYXQgd2UgY2FuIHNodXQgaXQgZG93bi4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX2lkbGUodm9pZCAqYXJnKQoreworICBzdHJ1Y3QgcHBwX2lkbGUgaWRsZTsKKyAgdV9zaG9ydCBpdGltZTsKKyAgCisgIExXSVBfVU5VU0VEX0FSRyhhcmcpOworICBpZiAoIWdldF9pZGxlX3RpbWUoMCwgJmlkbGUpKSB7CisgICAgcmV0dXJuOworICB9CisgIGl0aW1lID0gTFdJUF9NSU4oaWRsZS54bWl0X2lkbGUsIGlkbGUucmVjdl9pZGxlKTsKKyAgaWYgKGl0aW1lID49IHBwcF9zZXR0aW5ncy5pZGxlX3RpbWVfbGltaXQpIHsKKyAgICAvKiBsaW5rIGlzIGlkbGU6IHNodXQgaXQgZG93bi4gKi8KKyAgICBBVVRIREVCVUcoTE9HX0lORk8sICgiVGVybWluYXRpbmcgY29ubmVjdGlvbiBkdWUgdG8gbGFjayBvZiBhY3Rpdml0eS5cbiIpKTsKKyAgICBsY3BfY2xvc2UoMCwgIkxpbmsgaW5hY3RpdmUiKTsKKyAgfSBlbHNlIHsKKyAgICBUSU1FT1VUKGNoZWNrX2lkbGUsIE5VTEwsIHBwcF9zZXR0aW5ncy5pZGxlX3RpbWVfbGltaXQgLSBpdGltZSk7CisgIH0KK30KKworLyoKKyAqIGNvbm5lY3RfdGltZV9leHBpcmVkIC0gbG9nIGEgbWVzc2FnZSBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitjb25uZWN0X3RpbWVfZXhwaXJlZCh2b2lkICphcmcpCit7CisgIExXSVBfVU5VU0VEX0FSRyhhcmcpOworCisgIEFVVEhERUJVRyhMT0dfSU5GTywgKCJDb25uZWN0IHRpbWUgZXhwaXJlZFxuIikpOworICBsY3BfY2xvc2UoMCwgIkNvbm5lY3QgdGltZSBleHBpcmVkIik7ICAgLyogQ2xvc2UgY29ubmVjdGlvbiAqLworfQorCisjaWYgMCAvKiBVTlVTRUQgKi8KKy8qCisgKiBhdXRoX2NoZWNrX29wdGlvbnMgLSBjYWxsZWQgdG8gY2hlY2sgYXV0aGVudGljYXRpb24gb3B0aW9ucy4KKyAqLwordm9pZAorYXV0aF9jaGVja19vcHRpb25zKHZvaWQpCit7CisgIGxjcF9vcHRpb25zICp3byA9ICZsY3Bfd2FudG9wdGlvbnNbMF07CisgIGludCBjYW5fYXV0aDsKKyAgaXBjcF9vcHRpb25zICppcHdvID0gJmlwY3Bfd2FudG9wdGlvbnNbMF07CisgIHUzMl90IHJlbW90ZTsKKworICAvKiBEZWZhdWx0IG91cl9uYW1lIHRvIGhvc3RuYW1lLCBhbmQgdXNlciB0byBvdXJfbmFtZSAqLworICBpZiAocHBwX3NldHRpbmdzLm91cl9uYW1lWzBdID09IDAgfHwgcHBwX3NldHRpbmdzLnVzZWhvc3RuYW1lKSB7CisgICAgICBzdHJjcHkocHBwX3NldHRpbmdzLm91cl9uYW1lLCBwcHBfc2V0dGluZ3MuaG9zdG5hbWUpOworICB9CisKKyAgaWYgKHBwcF9zZXR0aW5ncy51c2VyWzBdID09IDApIHsKKyAgICBzdHJjcHkocHBwX3NldHRpbmdzLnVzZXIsIHBwcF9zZXR0aW5ncy5vdXJfbmFtZSk7CisgIH0KKworICAvKiBJZiBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCwgYXNrIHBlZXIgZm9yIENIQVAgb3IgUEFQLiAqLworICBpZiAocHBwX3NldHRpbmdzLmF1dGhfcmVxdWlyZWQgJiYgIXdvLT5uZWdfY2hhcCAmJiAhd28tPm5lZ191cGFwKSB7CisgICAgd28tPm5lZ19jaGFwID0gMTsKKyAgICB3by0+bmVnX3VwYXAgPSAxOworICB9CisgIAorICAvKgorICAgKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYXBwcm9wcmlhdGUgc2VjcmV0cyB0byB1c2UKKyAgICogdG8gYXV0aGVudGljYXRlIHRoZSBwZWVyLgorICAgKi8KKyAgY2FuX2F1dGggPSB3by0+bmVnX3VwYXAgJiYgaGF2ZV9wYXBfc2VjcmV0KCk7CisgIGlmICghY2FuX2F1dGggJiYgd28tPm5lZ19jaGFwKSB7CisgICAgcmVtb3RlID0gaXB3by0+YWNjZXB0X3JlbW90ZT8gMDogaXB3by0+aGlzYWRkcjsKKyAgICBjYW5fYXV0aCA9IGhhdmVfY2hhcF9zZWNyZXQocHBwX3NldHRpbmdzLnJlbW90ZV9uYW1lLCBwcHBfc2V0dGluZ3Mub3VyX25hbWUsIHJlbW90ZSk7CisgIH0KKworICBpZiAocHBwX3NldHRpbmdzLmF1dGhfcmVxdWlyZWQgJiYgIWNhbl9hdXRoKSB7CisgICAgcHBwX3BhbmljKCJObyBhdXRoIHNlY3JldCIpOworICB9Cit9CisjZW5kaWYgLyogVU5VU0VEICovCisKKy8qCisgKiBhdXRoX3Jlc2V0IC0gY2FsbGVkIHdoZW4gTENQIGlzIHN0YXJ0aW5nIG5lZ290aWF0aW9ucyB0byByZWNoZWNrCisgKiBhdXRoZW50aWNhdGlvbiBvcHRpb25zLCBpLmUuIHdoZXRoZXIgd2UgaGF2ZSBhcHByb3ByaWF0ZSBzZWNyZXRzCisgKiB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW5nIG91cnNlbHZlcyBhbmQvb3IgdGhlIHBlZXIuCisgKi8KK3ZvaWQKK2F1dGhfcmVzZXQoaW50IHVuaXQpCit7CisgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1t1bml0XTsKKyAgbGNwX29wdGlvbnMgKmFvID0gJmxjcF9hbGxvd29wdGlvbnNbMF07CisgIGlwY3Bfb3B0aW9ucyAqaXB3byA9ICZpcGNwX3dhbnRvcHRpb25zWzBdOworICB1MzJfdCByZW1vdGU7CisKKyAgQVVUSERFQlVHKExPR19JTkZPLCAoImF1dGhfcmVzZXQ6ICVkXG4iLCB1bml0KSk7CisgIGFvLT5uZWdfdXBhcCA9ICFwcHBfc2V0dGluZ3MucmVmdXNlX3BhcCAmJiAocHBwX3NldHRpbmdzLnBhc3N3ZFswXSAhPSAwIHx8IGdldF9wYXBfcGFzc3dkKHVuaXQsIE5VTEwsIE5VTEwpKTsKKyAgYW8tPm5lZ19jaGFwID0gIXBwcF9zZXR0aW5ncy5yZWZ1c2VfY2hhcCAmJiBwcHBfc2V0dGluZ3MucGFzc3dkWzBdICE9IDAgLypoYXZlX2NoYXBfc2VjcmV0KHBwcF9zZXR0aW5ncy51c2VyLCBwcHBfc2V0dGluZ3MucmVtb3RlX25hbWUsICh1MzJfdCkwKSovOworCisgIGlmIChnby0+bmVnX3VwYXAgJiYgIWhhdmVfcGFwX3NlY3JldCgpKSB7CisgICAgZ28tPm5lZ191cGFwID0gMDsKKyAgfQorICBpZiAoZ28tPm5lZ19jaGFwKSB7CisgICAgcmVtb3RlID0gaXB3by0+YWNjZXB0X3JlbW90ZT8gMDogaXB3by0+aGlzYWRkcjsKKyAgICBpZiAoIWhhdmVfY2hhcF9zZWNyZXQocHBwX3NldHRpbmdzLnJlbW90ZV9uYW1lLCBwcHBfc2V0dGluZ3Mub3VyX25hbWUsIHJlbW90ZSkpIHsKKyAgICAgIGdvLT5uZWdfY2hhcCA9IDA7CisgICAgfQorICB9Cit9CisKKyNpZiBQQVBfU1VQUE9SVAorLyoKKyAqIGNoZWNrX3Bhc3N3ZCAtIENoZWNrIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3ZCBhZ2FpbnN0IHRoZSBQQVAgc2VjcmV0cworICogZmlsZS4gIElmIHJlcXVlc3RlZCwgYWxzbyBjaGVjayBhZ2FpbnN0IHRoZSBzeXN0ZW0gcGFzc3dvcmQgZGF0YWJhc2UsCisgKiBhbmQgbG9naW4gdGhlIHVzZXIgaWYgT0suCisgKgorICogcmV0dXJuczoKKyAqICBVUEFQX0FVVEhOQUs6IEF1dGhlbnRpY2F0aW9uIGZhaWxlZC4KKyAqICBVUEFQX0FVVEhBQ0s6IEF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZC4KKyAqIEluIGVpdGhlciBjYXNlLCBtc2cgcG9pbnRzIHRvIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UuCisgKi8KK3VfY2hhcgorY2hlY2tfcGFzc3dkKCBpbnQgdW5pdCwgY2hhciAqYXVzZXIsIGludCB1c2VybGVuLCBjaGFyICphcGFzc3dkLCBpbnQgcGFzc3dkbGVuLCBjaGFyICoqbXNnLCBpbnQgKm1zZ2xlbikKK3sKKyNpZiAxIC8qIFhYWCBBc3N1bWUgYWxsIGVudHJpZXMgT0suICovCisgIExXSVBfVU5VU0VEX0FSRyh1bml0KTsKKyAgTFdJUF9VTlVTRURfQVJHKGF1c2VyKTsKKyAgTFdJUF9VTlVTRURfQVJHKHVzZXJsZW4pOworICBMV0lQX1VOVVNFRF9BUkcoYXBhc3N3ZCk7CisgIExXSVBfVU5VU0VEX0FSRyhwYXNzd2RsZW4pOworICBMV0lQX1VOVVNFRF9BUkcobXNnbGVuKTsKKyAgKm1zZyA9IChjaGFyICopIDA7CisgIHJldHVybiBVUEFQX0FVVEhBQ0s7ICAgICAvKiBYWFggQXNzdW1lIGFsbCBlbnRyaWVzIE9LLiAqLworI2Vsc2UKKyAgdV9jaGFyIHJldCA9IDA7CisgIHN0cnVjdCB3b3JkbGlzdCAqYWRkcnMgPSBOVUxMOworICBjaGFyIHBhc3N3ZFsyNTZdLCB1c2VyWzI1Nl07CisgIGNoYXIgc2VjcmV0W01BWFdPUkRMRU5dOworICBzdGF0aWMgdV9zaG9ydCBhdHRlbXB0cyA9IDA7CisgIAorICAvKgorICAgKiBNYWtlIGNvcGllcyBvZiBhcGFzc3dkIGFuZCBhdXNlciwgdGhlbiBudWxsLXRlcm1pbmF0ZSB0aGVtLgorICAgKi8KKyAgQkNPUFkoYXBhc3N3ZCwgcGFzc3dkLCBwYXNzd2RsZW4pOworICBwYXNzd2RbcGFzc3dkbGVuXSA9ICdcMCc7CisgIEJDT1BZKGF1c2VyLCB1c2VyLCB1c2VybGVuKTsKKyAgdXNlclt1c2VybGVuXSA9ICdcMCc7CisgICptc2cgPSAoY2hhciAqKSAwOworCisgIC8qIFhYWCBWYWxpZGF0ZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLiAqLworICByZXQgPSBVUEFQX0FVVEhBQ0s7ICAgICAvKiBYWFggQXNzdW1lIGFsbCBlbnRyaWVzIE9LLiAqLworICAgICAgCisgIGlmIChyZXQgPT0gVVBBUF9BVVRITkFLKSB7CisgICAgaWYgKCptc2cgPT0gKGNoYXIgKikgMCkgeworICAgICAgKm1zZyA9ICJMb2dpbiBpbmNvcnJlY3QiOworICAgIH0KKyAgICAqbXNnbGVuID0gc3RybGVuKCptc2cpOworICAgIC8qCisgICAgICogRnJ1c3RyYXRlIHBhc3N3ZCBzdGVhbGVyIHByb2dyYW1zLgorICAgICAqIEFsbG93IDEwIHRyaWVzLCBidXQgc3RhcnQgYmFja2luZyBvZmYgYWZ0ZXIgMyAoc3RvbGVuIGZyb20gbG9naW4pLgorICAgICAqIE9uIDEwJ3RoLCBkcm9wIHRoZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIGlmIChhdHRlbXB0cysrID49IDEwKSB7CisgICAgICBBVVRIREVCVUcoTE9HX1dBUk5JTkcsICgiJWQgTE9HSU4gRkFJTFVSRVMgQlkgJXNcbiIsIGF0dGVtcHRzLCB1c2VyKSk7CisgICAgICAvKnBwcF9wYW5pYygiRXhjZXNzIEJhZCBMb2dpbnMiKTsqLworICAgIH0KKyAgICBpZiAoYXR0ZW1wdHMgPiAzKSB7CisgICAgICAvKiBAdG9kbzogdGhpcyB3YXMgc2xlZXAoKSwgaS5lLiBzZWNvbmRzLCBub3QgbWlsbGlzZWNvbmRzCisgICAgICAgKiBJIGRvbid0IHRoaW5rIHdlIHJlYWxseSBuZWVkIHRoaXMgaW4gbHdJUCAtIHdlIHdvdWxkIGJsb2NrIHRjcGlwX3RocmVhZCEKKyAgICAgICAqLworICAgICAgLypzeXNfbXNsZWVwKChhdHRlbXB0cyAtIDMpICogNSk7Ki8KKyAgICB9CisgICAgaWYgKGFkZHJzICE9IE5VTEwpIHsKKyAgICAgIGZyZWVfd29yZGxpc3QoYWRkcnMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhdHRlbXB0cyA9IDA7IC8qIFJlc2V0IGNvdW50ICovCisgICAgaWYgKCptc2cgPT0gKGNoYXIgKikgMCkgeworICAgICAgKm1zZyA9ICJMb2dpbiBvayI7CisgICAgfQorICAgICptc2dsZW4gPSBzdHJsZW4oKm1zZyk7CisgICAgc2V0X2FsbG93ZWRfYWRkcnModW5pdCwgYWRkcnMpOworICB9CisKKyAgQlpFUk8ocGFzc3dkLCBzaXplb2YocGFzc3dkKSk7CisgIEJaRVJPKHNlY3JldCwgc2l6ZW9mKHNlY3JldCkpOworCisgIHJldHVybiByZXQ7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBQQVBfU1VQUE9SVCAqLworCisjaWYgMCAvKiBVTlVTRUQgKi8KKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBmb3IgUEFNLgorICovCisKKyNpZmRlZiBVU0VfUEFNCisKKy8qIGx3aXAgZG9lcyBub3Qgc3VwcG9ydCBQQU0qLworCisjZW5kaWYgIC8qIFVTRV9QQU0gKi8KKworI2VuZGlmIC8qIFVOVVNFRCAqLworCisKKyNpZiAwIC8qIFVOVVNFRCAqLworLyoKKyAqIHBsb2dpbiAtIENoZWNrIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGFnYWluc3QgdGhlIHN5c3RlbQorICogcGFzc3dvcmQgZGF0YWJhc2UsIGFuZCBsb2dpbiB0aGUgdXNlciBpZiBPSy4KKyAqCisgKiByZXR1cm5zOgorICogIFVQQVBfQVVUSE5BSzogTG9naW4gZmFpbGVkLgorICogIFVQQVBfQVVUSEFDSzogTG9naW4gc3VjY2VlZGVkLgorICogSW4gZWl0aGVyIGNhc2UsIG1zZyBwb2ludHMgdG8gYW4gYXBwcm9wcmlhdGUgbWVzc2FnZS4KKyAqLworc3RhdGljIGludAorcGxvZ2luKGNoYXIgKnVzZXIsIGNoYXIgKnBhc3N3ZCwgY2hhciAqKm1zZywgaW50ICptc2dsZW4pCit7CisKKyAgTFdJUF9VTlVTRURfQVJHKHVzZXIpOworICBMV0lQX1VOVVNFRF9BUkcocGFzc3dkKTsKKyAgTFdJUF9VTlVTRURfQVJHKG1zZyk7CisgIExXSVBfVU5VU0VEX0FSRyhtc2dsZW4pOworCisKKyAvKiBUaGUgbmV3IGxpbmVzIGFyZSBoZXJlIGFsaWduIHRoZSBmaWxlIHdoZW4gCisgICogY29tcGFyZWQgYWdhaW5zdCB0aGUgcHBwZCAyLjMuMTEgY29kZSAqLworCisKKworCisKKworCisKKworCisKKworCisKKworCisgIC8qIFhYWCBGYWlsIHVudGlsIHdlIGRlY2lkZSB0aGF0IHdlIHdhbnQgdG8gc3VwcG9ydCBsb2dpbnMuICovCisgIHJldHVybiAoVVBBUF9BVVRITkFLKTsKK30KKyNlbmRpZgorCisKKworLyoKKyAqIHBsb2dvdXQgLSBMb2dvdXQgdGhlIHVzZXIuCisgKi8KK3N0YXRpYyB2b2lkCitwbG9nb3V0KHZvaWQpCit7CisgIGxvZ2dlZF9pbiA9IDA7Cit9CisKKy8qCisgKiBudWxsX2xvZ2luIC0gQ2hlY2sgaWYgYSB1c2VybmFtZSBvZiAiIiBhbmQgYSBwYXNzd29yZCBvZiAiIiBhcmUKKyAqIGFjY2VwdGFibGUsIGFuZCBpZmYgc28sIHNldCB0aGUgbGlzdCBvZiBhY2NlcHRhYmxlIElQIGFkZHJlc3NlcworICogYW5kIHJldHVybiAxLgorICovCitzdGF0aWMgaW50CitudWxsX2xvZ2luKGludCB1bml0KQoreworICBMV0lQX1VOVVNFRF9BUkcodW5pdCk7CisgIC8qIFhYWCBGYWlsIHVudGlsIHdlIGRlY2lkZSB0aGF0IHdlIHdhbnQgdG8gc3VwcG9ydCBsb2dpbnMuICovCisgIHJldHVybiAwOworfQorCisKKy8qCisgKiBnZXRfcGFwX3Bhc3N3ZCAtIGdldCBhIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGluZyBvdXJzZWx2ZXMgd2l0aAorICogb3VyIHBlZXIgdXNpbmcgUEFQLiAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgaWYgbm8gc3VpdGFibGUgcGFzc3dvcmQKKyAqIGNvdWxkIGJlIGZvdW5kLgorICovCitzdGF0aWMgaW50CitnZXRfcGFwX3Bhc3N3ZChpbnQgdW5pdCwgY2hhciAqdXNlciwgY2hhciAqcGFzc3dkKQoreworICBMV0lQX1VOVVNFRF9BUkcodW5pdCk7CisvKiBub3JtYWxseSB3ZSB3b3VsZCByZWplY3QgUEFQIGlmIG5vIHBhc3N3b3JkIGlzIHByb3ZpZGVkLAorICAgYnV0IHRoaXMgY2F1c2VzIHByb2JsZW1zIHdpdGggc29tZSBwcm92aWRlcnMgKGxpa2UgQ0hUIGluIFRhaXdhbikKKyAgIHdobyBpbmNvcnJlY3RseSByZXF1ZXN0IFBBUCBhbmQgZXhwZWN0IGEgYm9ndXMvZW1wdHkgcGFzc3dvcmQsIHNvCisgICBhbHdheXMgcHJvdmlkZSBhIGRlZmF1bHQgdXNlci9wYXNzd2Qgb2YgIm5vbmUiLyJub25lIgorCisgICBAdG9kbzogVGhpcyBzaG91bGQgYmUgY29uZmlndXJlZCBieSB0aGUgdXNlciwgaW5zdGVhZCBvZiBiZWluZyBoYXJkY29kZWQgaGVyZSEKKyovCisgIGlmKHVzZXIpIHsKKyAgICBzdHJjcHkodXNlciwgIm5vbmUiKTsKKyAgfQorICBpZihwYXNzd2QpIHsKKyAgICBzdHJjcHkocGFzc3dkLCAibm9uZSIpOworICB9CisgIHJldHVybiAxOworfQorCisvKgorICogaGF2ZV9wYXBfc2VjcmV0IC0gY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgUEFQIGZpbGUgd2l0aCBhbnkKKyAqIHNlY3JldHMgdGhhdCB3ZSBjb3VsZCBwb3NzaWJseSB1c2UgZm9yIGF1dGhlbnRpY2F0aW5nIHRoZSBwZWVyLgorICovCitzdGF0aWMgaW50CitoYXZlX3BhcF9zZWNyZXQodm9pZCkKK3sKKyAgLyogWFhYIEZhaWwgdW50aWwgd2Ugc2V0IHVwIG91ciBwYXNzd29yZHMuICovCisgIHJldHVybiAwOworfQorCisvKgorICogaGF2ZV9jaGFwX3NlY3JldCAtIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIENIQVAgZmlsZSB3aXRoIGEKKyAqIHNlY3JldCB0aGF0IHdlIGNvdWxkIHBvc3NpYmx5IHVzZSBmb3IgYXV0aGVudGljYXRpbmcgYGNsaWVudCcKKyAqIG9uIGBzZXJ2ZXInLiAgRWl0aGVyIGNhbiBiZSB0aGUgbnVsbCBzdHJpbmcsIG1lYW5pbmcgd2UgZG9uJ3QKKyAqIGtub3cgdGhlIGlkZW50aXR5IHlldC4KKyAqLworc3RhdGljIGludAoraGF2ZV9jaGFwX3NlY3JldChjaGFyICpjbGllbnQsIGNoYXIgKnNlcnZlciwgdTMyX3QgcmVtb3RlKQoreworICBMV0lQX1VOVVNFRF9BUkcoY2xpZW50KTsKKyAgTFdJUF9VTlVTRURfQVJHKHNlcnZlcik7CisgIExXSVBfVU5VU0VEX0FSRyhyZW1vdGUpOworCisgIC8qIFhYWCBGYWlsIHVudGlsIHdlIHNldCB1cCBvdXIgcGFzc3dvcmRzLiAqLworICByZXR1cm4gMDsKK30KKyNpZiBDSEFQX1NVUFBPUlQKKworLyoKKyAqIGdldF9zZWNyZXQgLSBvcGVuIHRoZSBDSEFQIHNlY3JldCBmaWxlIGFuZCByZXR1cm4gdGhlIHNlY3JldAorICogZm9yIGF1dGhlbnRpY2F0aW5nIHRoZSBnaXZlbiBjbGllbnQgb24gdGhlIGdpdmVuIHNlcnZlci4KKyAqIChXZSBjb3VsZCBiZSBlaXRoZXIgY2xpZW50IG9yIHNlcnZlcikuCisgKi8KK2ludAorZ2V0X3NlY3JldChpbnQgdW5pdCwgY2hhciAqY2xpZW50LCBjaGFyICpzZXJ2ZXIsIGNoYXIgKnNlY3JldCwgaW50ICpzZWNyZXRfbGVuLCBpbnQgc2F2ZV9hZGRycykKK3sKKyNpZiAxCisgIGludCBsZW47CisgIHN0cnVjdCB3b3JkbGlzdCAqYWRkcnM7CisKKyAgTFdJUF9VTlVTRURfQVJHKHVuaXQpOworICBMV0lQX1VOVVNFRF9BUkcoc2VydmVyKTsKKyAgTFdJUF9VTlVTRURfQVJHKHNhdmVfYWRkcnMpOworCisgIGFkZHJzID0gTlVMTDsKKworICBpZighY2xpZW50IHx8ICFjbGllbnRbMF0gfHwgc3RyY21wKGNsaWVudCwgcHBwX3NldHRpbmdzLnVzZXIpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBsZW4gPSAoaW50KXN0cmxlbihwcHBfc2V0dGluZ3MucGFzc3dkKTsKKyAgaWYgKGxlbiA+IE1BWFNFQ1JFVExFTikgeworICAgIEFVVEhERUJVRyhMT0dfRVJSLCAoIlNlY3JldCBmb3IgJXMgb24gJXMgaXMgdG9vIGxvbmdcbiIsIGNsaWVudCwgc2VydmVyKSk7CisgICAgbGVuID0gTUFYU0VDUkVUTEVOOworICB9CisKKyAgQkNPUFkocHBwX3NldHRpbmdzLnBhc3N3ZCwgc2VjcmV0LCBsZW4pOworICAqc2VjcmV0X2xlbiA9IGxlbjsKKworICByZXR1cm4gMTsKKyNlbHNlCisgIGludCByZXQgPSAwLCBsZW47CisgIHN0cnVjdCB3b3JkbGlzdCAqYWRkcnM7CisgIGNoYXIgc2VjYnVmW01BWFdPUkRMRU5dOworICAKKyAgYWRkcnMgPSBOVUxMOworICBzZWNidWZbMF0gPSAwOworCisgIC8qIFhYWCBGaW5kIHNlY3JldC4gKi8KKyAgaWYgKHJldCA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChzYXZlX2FkZHJzKSB7CisgICAgc2V0X2FsbG93ZWRfYWRkcnModW5pdCwgYWRkcnMpOworICB9CisKKyAgbGVuID0gc3RybGVuKHNlY2J1Zik7CisgIGlmIChsZW4gPiBNQVhTRUNSRVRMRU4pIHsKKyAgICBBVVRIREVCVUcoTE9HX0VSUiwgKCJTZWNyZXQgZm9yICVzIG9uICVzIGlzIHRvbyBsb25nXG4iLCBjbGllbnQsIHNlcnZlcikpOworICAgIGxlbiA9IE1BWFNFQ1JFVExFTjsKKyAgfQorCisgIEJDT1BZKHNlY2J1Ziwgc2VjcmV0LCBsZW4pOworICBCWkVSTyhzZWNidWYsIHNpemVvZihzZWNidWYpKTsKKyAgKnNlY3JldF9sZW4gPSBsZW47CisKKyAgcmV0dXJuIDE7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBDSEFQX1NVUFBPUlQgKi8KKworCisjaWYgMCAvKiBQQVBfU1VQUE9SVCB8fCBDSEFQX1NVUFBPUlQgKi8KKy8qCisgKiBzZXRfYWxsb3dlZF9hZGRycygpIC0gc2V0IHRoZSBsaXN0IG9mIGFsbG93ZWQgYWRkcmVzc2VzLgorICovCitzdGF0aWMgdm9pZAorc2V0X2FsbG93ZWRfYWRkcnMoaW50IHVuaXQsIHN0cnVjdCB3b3JkbGlzdCAqYWRkcnMpCit7CisgIGlmIChhZGRyZXNzZXNbdW5pdF0gIT0gTlVMTCkgeworICAgIGZyZWVfd29yZGxpc3QoYWRkcmVzc2VzW3VuaXRdKTsKKyAgfQorICBhZGRyZXNzZXNbdW5pdF0gPSBhZGRyczsKKworI2lmIDAKKyAgLyoKKyAgICogSWYgdGhlcmUncyBvbmx5IG9uZSBhdXRob3JpemVkIGFkZHJlc3Mgd2UgbWlnaHQgYXMgd2VsbAorICAgKiBhc2sgb3VyIHBlZXIgZm9yIHRoYXQgb25lIHJpZ2h0IGF3YXkKKyAgICovCisgIGlmIChhZGRycyAhPSBOVUxMICYmIGFkZHJzLT5uZXh0ID09IE5VTEwpIHsKKyAgICBjaGFyICpwID0gYWRkcnMtPndvcmQ7CisgICAgc3RydWN0IGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1t1bml0XTsKKyAgICB1MzJfdCBhOworICAgIHN0cnVjdCBob3N0ZW50ICpocDsKKyAgICAKKyAgICBpZiAod28tPmhpc2FkZHIgPT0gMCAmJiAqcCAhPSAnIScgJiYgKnAgIT0gJy0nICYmIHN0cmNocihwLCAnLycpID09IE5VTEwpIHsKKyAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShwKTsKKyAgICAgIGlmIChocCAhPSBOVUxMICYmIGhwLT5oX2FkZHJ0eXBlID09IEFGX0lORVQpIHsKKyAgICAgICAgYSA9ICoodTMyX3QgKilocC0+aF9hZGRyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYSA9IGluZXRfYWRkcihwKTsKKyAgICAgIH0KKyAgICAgIGlmIChhICE9ICh1MzJfdCkgLTEpIHsKKyAgICAgICAgd28tPmhpc2FkZHIgPSBhOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYgLyogMCAqLyAvKiBQQVBfU1VQUE9SVCB8fCBDSEFQX1NVUFBPUlQgKi8KKworLyoKKyAqIGF1dGhfaXBfYWRkciAtIGNoZWNrIHdoZXRoZXIgdGhlIHBlZXIgaXMgYXV0aG9yaXplZCB0byB1c2UKKyAqIGEgZ2l2ZW4gSVAgYWRkcmVzcy4gIFJldHVybnMgMSBpZiBhdXRob3JpemVkLCAwIG90aGVyd2lzZS4KKyAqLworaW50CithdXRoX2lwX2FkZHIoaW50IHVuaXQsIHUzMl90IGFkZHIpCit7CisgIHJldHVybiBpcF9hZGRyX2NoZWNrKGFkZHIsIGFkZHJlc3Nlc1t1bml0XSk7Cit9CisKK3N0YXRpYyBpbnQgLyogQHRvZG86IGludGVncmF0ZSB0aGlzIGZ1bnRpb24gaW50byBhdXRoX2lwX2FkZHIoKSovCitpcF9hZGRyX2NoZWNrKHUzMl90IGFkZHIsIHN0cnVjdCB3b3JkbGlzdCAqYWRkcnMpCit7CisgIC8qIGRvbid0IGFsbG93IGxvb3BiYWNrIG9yIG11bHRpY2FzdCBhZGRyZXNzICovCisgIGlmIChiYWRfaXBfYWRycyhhZGRyKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGFkZHJzID09IE5VTEwpIHsKKyAgICByZXR1cm4gIXBwcF9zZXR0aW5ncy5hdXRoX3JlcXVpcmVkOyAvKiBubyBhZGRyZXNzZXMgYXV0aG9yaXplZCAqLworICB9CisKKyAgLyogWFhYIEFsbCBvdGhlciBhZGRyZXNzZXMgYWxsb3dlZC4gKi8KKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBiYWRfaXBfYWRycyAtIHJldHVybiAxIGlmIHRoZSBJUCBhZGRyZXNzIGlzIG9uZSB3ZSBkb24ndCB3YW50CisgKiB0byB1c2UsIHN1Y2ggYXMgYW4gYWRkcmVzcyBpbiB0aGUgbG9vcGJhY2sgbmV0IG9yIGEgbXVsdGljYXN0IGFkZHJlc3MuCisgKiBhZGRyIGlzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworaW50CitiYWRfaXBfYWRycyh1MzJfdCBhZGRyKQoreworICBhZGRyID0gbnRvaGwoYWRkcik7CisgIHJldHVybiAoYWRkciA+PiBJTl9DTEFTU0FfTlNISUZUKSA9PSBJTl9MT09QQkFDS05FVAorICAgICAgfHwgSU5fTVVMVElDQVNUKGFkZHIpIHx8IElOX0JBRENMQVNTKGFkZHIpOworfQorCisjaWYgMCAvKiBVTlVTRUQgKi8gLyogUEFQX1NVUFBPUlQgfHwgQ0hBUF9TVVBQT1JUICovCisvKgorICogc29tZV9pcF9vayAtIGNoZWNrIGEgd29yZGxpc3QgdG8gc2VlIGlmIGl0IGF1dGhvcml6ZXMgYW55CisgKiBJUCBhZGRyZXNzKGVzKS4KKyAqLworc3RhdGljIGludAorc29tZV9pcF9vayhzdHJ1Y3Qgd29yZGxpc3QgKmFkZHJzKQoreworICAgIGZvciAoOyBhZGRycyAhPSAwOyBhZGRycyA9IGFkZHJzLT5uZXh0KSB7CisgICAgICBpZiAoYWRkcnMtPndvcmRbMF0gPT0gJy0nKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChhZGRycy0+d29yZFswXSAhPSAnIScpCisgICAgICAgIHJldHVybiAxOyAvKiBzb21lIElQIGFkZHJlc3MgaXMgYWxsb3dlZCAqLworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIGNoZWNrX2FjY2VzcyAtIGNvbXBsYWluIGlmIGEgc2VjcmV0IGZpbGUgaGFzIHRvby1saWJlcmFsIHBlcm1pc3Npb25zLgorICovCitzdGF0aWMgdm9pZAorY2hlY2tfYWNjZXNzKEZJTEUgKmYsIGNoYXIgKmZpbGVuYW1lKQoreworICAgIHN0cnVjdCBzdGF0IHNidWY7CisKKyAgICBpZiAoZnN0YXQoZmlsZW5vKGYpLCAmc2J1ZikgPCAwKSB7CisgICAgICB3YXJuKCJjYW5ub3Qgc3RhdCBzZWNyZXQgZmlsZSAlczogJW0iLCBmaWxlbmFtZSk7CisgICAgfSBlbHNlIGlmICgoc2J1Zi5zdF9tb2RlICYgKFNfSVJXWEcgfCBTX0lSV1hPKSkgIT0gMCkgeworICAgICAgd2FybigiV2FybmluZyAtIHNlY3JldCBmaWxlICVzIGhhcyB3b3JsZCBhbmQvb3IgZ3JvdXAgYWNjZXNzIiwKKyAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICB9Cit9CisKKworLyoKKyAqIHNjYW5fYXV0aGZpbGUgLSBTY2FuIGFuIGF1dGhvcml6YXRpb24gZmlsZSBmb3IgYSBzZWNyZXQgc3VpdGFibGUKKyAqIGZvciBhdXRoZW50aWNhdGluZyBgY2xpZW50JyBvbiBgc2VydmVyJy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgLTEKKyAqIGlmIG5vIHNlY3JldCBpcyBmb3VuZCwgb3RoZXJ3aXNlID49IDAuICBUaGUgcmV0dXJuIHZhbHVlIGhhcworICogTk9OV0lMRF9DTElFTlQgc2V0IGlmIHRoZSBzZWNyZXQgZGlkbid0IGhhdmUgIioiIGZvciB0aGUgY2xpZW50LCBhbmQKKyAqIE5PTldJTERfU0VSVkVSIHNldCBpZiB0aGUgc2VjcmV0IGRpZG4ndCBoYXZlICIqIiBmb3IgdGhlIHNlcnZlci4KKyAqIEFueSBmb2xsb3dpbmcgd29yZHMgb24gdGhlIGxpbmUgdXAgdG8gYSAiLS0iIChpLmUuIGFkZHJlc3MgYXV0aG9yaXphdGlvbgorICogaW5mbykgYXJlIHBsYWNlZCBpbiBhIHdvcmRsaXN0IGFuZCByZXR1cm5lZCBpbiAqYWRkcnMuICBBbnkKKyAqIGZvbGxvd2luZyB3b3JkcyAoZXh0cmEgb3B0aW9ucykgYXJlIHBsYWNlZCBpbiBhIHdvcmRsaXN0IGFuZAorICogcmV0dXJuZWQgaW4gKm9wdHMuCisgKiBXZSBhc3N1bWUgc2VjcmV0IGlzIE5VTEwgb3IgcG9pbnRzIHRvIE1BWFdPUkRMRU4gYnl0ZXMgb2Ygc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQKK3NjYW5fYXV0aGZpbGUoRklMRSAqZiwgY2hhciAqY2xpZW50LCBjaGFyICpzZXJ2ZXIsIGNoYXIgKnNlY3JldCwgc3RydWN0IHdvcmRsaXN0ICoqYWRkcnMsIHN0cnVjdCB3b3JkbGlzdCAqKm9wdHMsIGNoYXIgKmZpbGVuYW1lKQoreworICAvKiBXZSBkbyBub3QgKGN1cnJlbnRseSkgbmVlZCB0aGlzIGluIGx3aXAgICovCisgIHJldHVybiAwOyAvKiBkdW1teSAqLworfQorLyoKKyAqIGZyZWVfd29yZGxpc3QgLSByZWxlYXNlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGEgd29yZGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3dvcmRsaXN0KHN0cnVjdCB3b3JkbGlzdCAqd3ApCit7CisgIHN0cnVjdCB3b3JkbGlzdCAqbmV4dDsKKworICB3aGlsZSAod3AgIT0gTlVMTCkgeworICAgIG5leHQgPSB3cC0+bmV4dDsKKyAgICBmcmVlKHdwKTsKKyAgICB3cCA9IG5leHQ7CisgIH0KK30KKworLyoKKyAqIGF1dGhfc2NyaXB0X2RvbmUgLSBjYWxsZWQgd2hlbiB0aGUgYXV0aC11cCBvciBhdXRoLWRvd24gc2NyaXB0CisgKiBoYXMgZmluaXNoZWQuCisgKi8KK3N0YXRpYyB2b2lkCithdXRoX3NjcmlwdF9kb25lKHZvaWQgKmFyZykKK3sKKyAgICBhdXRoX3NjcmlwdF9waWQgPSAwOworICAgIHN3aXRjaCAoYXV0aF9zY3JpcHRfc3RhdGUpIHsKKyAgICBjYXNlIHNfdXA6CisgICAgICBpZiAoYXV0aF9zdGF0ZSA9PSBzX2Rvd24pIHsKKyAgICAgICAgYXV0aF9zY3JpcHRfc3RhdGUgPSBzX2Rvd247CisgICAgICAgIGF1dGhfc2NyaXB0KF9QQVRIX0FVVEhET1dOKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc19kb3duOgorICAgICAgaWYgKGF1dGhfc3RhdGUgPT0gc191cCkgeworICAgICAgICBhdXRoX3NjcmlwdF9zdGF0ZSA9IHNfdXA7CisgICAgICAgIGF1dGhfc2NyaXB0KF9QQVRIX0FVVEhVUCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qCisgKiBhdXRoX3NjcmlwdCAtIGV4ZWN1dGUgYSBzY3JpcHQgd2l0aCBhcmd1bWVudHMKKyAqIGludGVyZmFjZS1uYW1lIHBlZXItbmFtZSByZWFsLXVzZXIgdHR5IHNwZWVkCisgKi8KK3N0YXRpYyB2b2lkCithdXRoX3NjcmlwdChjaGFyICpzY3JpcHQpCit7CisgICAgY2hhciBzdHJzcGVlZFszMl07CisgICAgc3RydWN0IHBhc3N3ZCAqcHc7CisgICAgY2hhciBzdHJ1aWRbMzJdOworICAgIGNoYXIgKnVzZXJfbmFtZTsKKyAgICBjaGFyICphcmd2WzhdOworCisgICAgaWYgKChwdyA9IGdldHB3dWlkKGdldHVpZCgpKSkgIT0gTlVMTCAmJiBwdy0+cHdfbmFtZSAhPSBOVUxMKQorICAgICAgdXNlcl9uYW1lID0gcHctPnB3X25hbWU7CisgICAgZWxzZSB7CisgICAgICBzbHByaW50ZihzdHJ1aWQsIHNpemVvZihzdHJ1aWQpLCAiJWQiLCBnZXR1aWQoKSk7CisgICAgICB1c2VyX25hbWUgPSBzdHJ1aWQ7CisgICAgfQorICAgIHNscHJpbnRmKHN0cnNwZWVkLCBzaXplb2Yoc3Ryc3BlZWQpLCAiJWQiLCBiYXVkX3JhdGUpOworCisgICAgYXJndlswXSA9IHNjcmlwdDsKKyAgICBhcmd2WzFdID0gaWZuYW1lOworICAgIGFyZ3ZbMl0gPSBwZWVyX2F1dGhuYW1lOworICAgIGFyZ3ZbM10gPSB1c2VyX25hbWU7CisgICAgYXJndls0XSA9IGRldm5hbTsKKyAgICBhcmd2WzVdID0gc3Ryc3BlZWQ7CisgICAgYXJndls2XSA9IE5VTEw7CisKKyAgICBhdXRoX3NjcmlwdF9waWQgPSBydW5fcHJvZ3JhbShzY3JpcHQsIGFyZ3YsIDAsIGF1dGhfc2NyaXB0X2RvbmUsIE5VTEwpOworfQorI2VuZGlmICAvKiAwICovIC8qIFBBUF9TVVBQT1JUIHx8IENIQVBfU1VQUE9SVCAqLworI2VuZGlmIC8qIFBQUF9TVVBQT1JUICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9hdXRoLmggYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9hdXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwNjllYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2F1dGguaApAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGF1dGguaCAtICBQUFAgQXV0aGVudGljYXRpb24gYW5kIHBoYXNlIGNvbnRyb2wgaGVhZGVyIGZpbGUuCisqCisqIENvcHlyaWdodCAoYykgMjAwMyBieSBNYXJjIEJvdWNoZXIsIFNlcnZpY2VzIEluZm9ybWF0aXF1ZXMgKE1CU0kpIGluYy4KKyogcG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk4IEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyoKKyogVGhlIGF1dGhvcnMgaGVyZWJ5IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsCisqIGFuZCBsaWNlbnNlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQKKyogdGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCB0aGlzCisqIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGFyZSBpbmNsdWRlZCB2ZXJiYXRpbSBpbiBhbnkgCisqIGRpc3RyaWJ1dGlvbnMuIE5vIHdyaXR0ZW4gYWdyZWVtZW50LCBsaWNlbnNlLCBvciByb3lhbHR5IGZlZSBpcyByZXF1aXJlZAorKiBmb3IgYW55IG9mIHRoZSBhdXRob3JpemVkIHVzZXMuCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPTlRSSUJVVE9SUyAqQVMgSVMqIEFORCBBTlkgRVhQUkVTUyBPUgorKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIAorKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJFVklTSU9OIEhJU1RPUlkKKyoKKyogMDMtMDEtMDEgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisqICAgUG9ydGVkIHRvIGx3SVAuCisqIDk3LTEyLTA0IEd1eSBMYW5jYXN0ZXIgPGxhbmNhc3RlcmdAYWNtLm9yZz4sIEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyogICBPcmlnaW5hbCBkZXJpdmVkIGZyb20gQlNEIHBwcGQuaC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHBwcGQuaCAtIFBQUCBkYWVtb24gZ2xvYmFsIGRlY2xhcmF0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKi8KKworI2lmbmRlZiBBVVRIX0gKKyNkZWZpbmUgQVVUSF9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKgorKioqIFBVQkxJQyBGVU5DVElPTlMgKioqCisqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogd2UgYXJlIHN0YXJ0aW5nIHRvIHVzZSB0aGUgbGluayAqLwordm9pZCBsaW5rX3JlcXVpcmVkIChpbnQpOworCisvKiB3ZSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgbGluayAqLwordm9pZCBsaW5rX3Rlcm1pbmF0ZWQgKGludCk7CisKKy8qIHRoZSBMQ1AgbGF5ZXIgaGFzIGxlZnQgdGhlIE9wZW5lZCBzdGF0ZSAqLwordm9pZCBsaW5rX2Rvd24gKGludCk7CisKKy8qIHRoZSBsaW5rIGlzIHVwOyBhdXRoZW50aWNhdGUgbm93ICovCit2b2lkIGxpbmtfZXN0YWJsaXNoZWQgKGludCk7CisKKy8qIGEgbmV0d29yayBwcm90b2NvbCBoYXMgY29tZSB1cCAqLwordm9pZCBucF91cCAoaW50LCB1MTZfdCk7CisKKy8qIGEgbmV0d29yayBwcm90b2NvbCBoYXMgZ29uZSBkb3duICovCit2b2lkIG5wX2Rvd24gKGludCwgdTE2X3QpOworCisvKiBhIG5ldHdvcmsgcHJvdG9jb2wgbm8gbG9uZ2VyIG5lZWRzIGxpbmsgKi8KK3ZvaWQgbnBfZmluaXNoZWQgKGludCwgdTE2X3QpOworCisvKiBwZWVyIGZhaWxlZCB0byBhdXRoZW50aWNhdGUgaXRzZWxmICovCit2b2lkIGF1dGhfcGVlcl9mYWlsIChpbnQsIHUxNl90KTsKKworLyogcGVlciBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZCBpdHNlbGYgKi8KK3ZvaWQgYXV0aF9wZWVyX3N1Y2Nlc3MgKGludCwgdTE2X3QsIGNoYXIgKiwgaW50KTsKKworLyogd2UgZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgKi8KK3ZvaWQgYXV0aF93aXRocGVlcl9mYWlsIChpbnQsIHUxNl90KTsKKworLyogd2Ugc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgb3Vyc2VsdmVzICovCit2b2lkIGF1dGhfd2l0aHBlZXJfc3VjY2VzcyAoaW50LCB1MTZfdCk7CisKKy8qIGNoZWNrIGF1dGhlbnRpY2F0aW9uIG9wdGlvbnMgc3VwcGxpZWQgKi8KK3ZvaWQgYXV0aF9jaGVja19vcHRpb25zICh2b2lkKTsKKworLyogY2hlY2sgd2hhdCBzZWNyZXRzIHdlIGhhdmUgKi8KK3ZvaWQgYXV0aF9yZXNldCAoaW50KTsKKworLyogQ2hlY2sgcGVlci1zdXBwbGllZCB1c2VybmFtZS9wYXNzd29yZCAqLwordV9jaGFyIGNoZWNrX3Bhc3N3ZCAoaW50LCBjaGFyICosIGludCwgY2hhciAqLCBpbnQsIGNoYXIgKiosIGludCAqKTsKKworLyogZ2V0ICJzZWNyZXQiIGZvciBjaGFwICovCitpbnQgIGdldF9zZWNyZXQgKGludCwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCk7CisKKy8qIGNoZWNrIGlmIElQIGFkZHJlc3MgaXMgYXV0aG9yaXplZCAqLworaW50ICBhdXRoX2lwX2FkZHIgKGludCwgdTMyX3QpOworCisvKiBjaGVjayBpZiBJUCBhZGRyZXNzIGlzIHVucmVhc29uYWJsZSAqLworaW50ICBiYWRfaXBfYWRycyAodTMyX3QpOworCisjZW5kaWYgLyogQVVUSF9IICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9jaGFwLmMgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9jaGFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0OWZmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2NoYXAuYwpAQCAtMCwwICsxLDkwOCBAQAorLyoqKiBXQVJOSU5HIC0gVEhJUyBIQVMgTkVWRVIgQkVFTiBGSU5JU0hFRCAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2hhcC5jIC0gTmV0d29yayBDaGFsbGVuZ2UgSGFuZHNoYWtlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIHByb2dyYW0gZmlsZS4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IE1hcmMgQm91Y2hlciwgU2VydmljZXMgSW5mb3JtYXRpcXVlcyAoTUJTSSkgaW5jLgorKiBwb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKgorKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKKyogYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAorKiB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMKKyogbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXJlIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSAKKyogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkCisqIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTICpBUyBJUyogQU5EIEFOWSBFWFBSRVNTIE9SCisqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUkVWSVNJT04gSElTVE9SWQorKgorKiAwMy0wMS0wMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyogICBQb3J0ZWQgdG8gbHdJUC4KKyogOTctMTItMDQgR3V5IExhbmNhc3RlciA8bGFuY2FzdGVyZ0BhY20ub3JnPiwgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKiAgIE9yaWdpbmFsIGJhc2VkIG9uIEJTRCBjaGFwLmMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjaGFwLmMgLSBDaGFsbGVuZ2UgSGFuZHNoYWtlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MyBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IHRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkuICBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQorICogbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEgR3JlZ29yeSBNLiBDaHJpc3R5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IEdyZWdvcnkgTS4gQ2hyaXN0eS4gIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvCisgKiBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgUFBQX1NVUFBPUlQgIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaWYgQ0hBUF9TVVBQT1JUIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAicHBwLmgiCisjaW5jbHVkZSAicHBwZGVidWcuaCIKKworI2luY2x1ZGUgIm1hZ2ljLmgiCisjaW5jbHVkZSAicmFuZG0uaCIKKyNpbmNsdWRlICJhdXRoLmgiCisjaW5jbHVkZSAibWQ1LmgiCisjaW5jbHVkZSAiY2hhcC5oIgorI2luY2x1ZGUgImNocG1zLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIDAgLyogVU5VU0VEICovCisvKgorICogQ29tbWFuZC1saW5lIG9wdGlvbnMuCisgKi8KK3N0YXRpYyBvcHRpb25fdCBjaGFwX29wdGlvbl9saXN0W10gPSB7CisgICAgeyAiY2hhcC1yZXN0YXJ0Iiwgb19pbnQsICZjaGFwWzBdLnRpbWVvdXR0aW1lLAorICAgICAgIlNldCB0aW1lb3V0IGZvciBDSEFQIiB9LAorICAgIHsgImNoYXAtbWF4LWNoYWxsZW5nZSIsIG9faW50LCAmY2hhcFswXS5tYXhfdHJhbnNtaXRzLAorICAgICAgIlNldCBtYXggI3htaXRzIGZvciBjaGFsbGVuZ2UiIH0sCisgICAgeyAiY2hhcC1pbnRlcnZhbCIsIG9faW50LCAmY2hhcFswXS5jaGFsX2ludGVydmFsLAorICAgICAgIlNldCBpbnRlcnZhbCBmb3IgcmVjaGFsbGVuZ2UiIH0sCisjaWZkZWYgTVNMQU5NQU4KKyAgICB7ICJtcy1sYW5tYW4iLCBvX2Jvb2wsICZtc19sYW5tYW4sCisgICAgICAiVXNlIExhbk1hbiBwYXNzd2Qgd2hlbiB1c2luZyBNUy1DSEFQIiwgMSB9LAorI2VuZGlmCisgICAgeyBOVUxMIH0KK307CisjZW5kaWYgLyogVU5VU0VEICovCisKKy8qCisgKiBQcm90b2NvbCBlbnRyeSBwb2ludHMuCisgKi8KK3N0YXRpYyB2b2lkIENoYXBJbml0IChpbnQpOworc3RhdGljIHZvaWQgQ2hhcExvd2VyVXAgKGludCk7CitzdGF0aWMgdm9pZCBDaGFwTG93ZXJEb3duIChpbnQpOworc3RhdGljIHZvaWQgQ2hhcElucHV0IChpbnQsIHVfY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgQ2hhcFByb3RvY29sUmVqZWN0IChpbnQpOworI2lmIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUworc3RhdGljIGludCAgQ2hhcFByaW50UGt0ICh1X2NoYXIgKiwgaW50LCB2b2lkICgqKSAodm9pZCAqLCBjaGFyICosIC4uLiksIHZvaWQgKik7CisjZW5kaWYKKworc3RydWN0IHByb3RlbnQgY2hhcF9wcm90ZW50ID0geworICBQUFBfQ0hBUCwKKyAgQ2hhcEluaXQsCisgIENoYXBJbnB1dCwKKyAgQ2hhcFByb3RvY29sUmVqZWN0LAorICBDaGFwTG93ZXJVcCwKKyAgQ2hhcExvd2VyRG93biwKKyAgTlVMTCwKKyAgTlVMTCwKKyNpZiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MKKyAgQ2hhcFByaW50UGt0LAorICBOVUxMLAorI2VuZGlmIC8qIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUyAqLworICAxLAorICAiQ0hBUCIsCisjaWYgUFBQX0FERElUSU9OQUxfQ0FMTEJBQ0tTCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKKyNlbmRpZiAvKiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MgKi8KK307CisKK2NoYXBfc3RhdGUgY2hhcFtOVU1fUFBQXTsgLyogQ0hBUCBzdGF0ZTsgb25lIGZvciBlYWNoIHVuaXQgKi8KKworc3RhdGljIHZvaWQgQ2hhcENoYWxsZW5nZVRpbWVvdXQgKHZvaWQgKik7CitzdGF0aWMgdm9pZCBDaGFwUmVzcG9uc2VUaW1lb3V0ICh2b2lkICopOworc3RhdGljIHZvaWQgQ2hhcFJlY2VpdmVDaGFsbGVuZ2UgKGNoYXBfc3RhdGUgKiwgdV9jaGFyICosIHVfY2hhciwgaW50KTsKK3N0YXRpYyB2b2lkIENoYXBSZWNoYWxsZW5nZSAodm9pZCAqKTsKK3N0YXRpYyB2b2lkIENoYXBSZWNlaXZlUmVzcG9uc2UgKGNoYXBfc3RhdGUgKiwgdV9jaGFyICosIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIENoYXBSZWNlaXZlU3VjY2VzcyhjaGFwX3N0YXRlICpjc3RhdGUsIHVfY2hhciAqaW5wLCB1X2NoYXIgaWQsIGludCBsZW4pOworc3RhdGljIHZvaWQgQ2hhcFJlY2VpdmVGYWlsdXJlKGNoYXBfc3RhdGUgKmNzdGF0ZSwgdV9jaGFyICppbnAsIHVfY2hhciBpZCwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBDaGFwU2VuZFN0YXR1cyAoY2hhcF9zdGF0ZSAqLCBpbnQpOworc3RhdGljIHZvaWQgQ2hhcFNlbmRDaGFsbGVuZ2UgKGNoYXBfc3RhdGUgKik7CitzdGF0aWMgdm9pZCBDaGFwU2VuZFJlc3BvbnNlIChjaGFwX3N0YXRlICopOworc3RhdGljIHZvaWQgQ2hhcEdlbkNoYWxsZW5nZSAoY2hhcF9zdGF0ZSAqKTsKKworLyoKKyAqIENoYXBJbml0IC0gSW5pdGlhbGl6ZSBhIENIQVAgdW5pdC4KKyAqLworc3RhdGljIHZvaWQKK0NoYXBJbml0KGludCB1bml0KQoreworICBjaGFwX3N0YXRlICpjc3RhdGUgPSAmY2hhcFt1bml0XTsKKworICBCWkVSTyhjc3RhdGUsIHNpemVvZigqY3N0YXRlKSk7CisgIGNzdGF0ZS0+dW5pdCA9IHVuaXQ7CisgIGNzdGF0ZS0+Y2xpZW50c3RhdGUgPSBDSEFQQ1NfSU5JVElBTDsKKyAgY3N0YXRlLT5zZXJ2ZXJzdGF0ZSA9IENIQVBTU19JTklUSUFMOworICBjc3RhdGUtPnRpbWVvdXR0aW1lID0gQ0hBUF9ERUZUSU1FT1VUOworICBjc3RhdGUtPm1heF90cmFuc21pdHMgPSBDSEFQX0RFRlRSQU5TTUlUUzsKKyAgLyogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgaW5pdGlhbGl6ZWQgaW4gbWFnaWNfaW5pdCAqLworfQorCisKKy8qCisgKiBDaGFwQXV0aFdpdGhQZWVyIC0gQXV0aGVudGljYXRlIHVzIHdpdGggb3VyIHBlZXIgKHN0YXJ0IGNsaWVudCkuCisgKgorICovCit2b2lkCitDaGFwQXV0aFdpdGhQZWVyKGludCB1bml0LCBjaGFyICpvdXJfbmFtZSwgdV9jaGFyIGRpZ2VzdCkKK3sKKyAgY2hhcF9zdGF0ZSAqY3N0YXRlID0gJmNoYXBbdW5pdF07CisKKyAgY3N0YXRlLT5yZXNwX25hbWUgPSBvdXJfbmFtZTsKKyAgY3N0YXRlLT5yZXNwX3R5cGUgPSBkaWdlc3Q7CisKKyAgaWYgKGNzdGF0ZS0+Y2xpZW50c3RhdGUgPT0gQ0hBUENTX0lOSVRJQUwgfHwKKyAgICAgIGNzdGF0ZS0+Y2xpZW50c3RhdGUgPT0gQ0hBUENTX1BFTkRJTkcpIHsKKyAgICAvKiBsb3dlciBsYXllciBpc24ndCB1cCAtIHdhaXQgdW50aWwgbGF0ZXIgKi8KKyAgICBjc3RhdGUtPmNsaWVudHN0YXRlID0gQ0hBUENTX1BFTkRJTkc7CisgICAgcmV0dXJuOworICB9CisKKyAgLyoKKyAgICogV2UgZ2V0IGhlcmUgYXMgYSByZXN1bHQgb2YgTENQIGNvbWluZyB1cC4KKyAgICogU28gZXZlbiBpZiBDSEFQIHdhcyBvcGVuIGJlZm9yZSwgd2Ugd2lsbCAKKyAgICogaGF2ZSB0byByZS1hdXRoZW50aWNhdGUgb3Vyc2VsdmVzLgorICAgKi8KKyAgY3N0YXRlLT5jbGllbnRzdGF0ZSA9IENIQVBDU19MSVNURU47Cit9CisKKworLyoKKyAqIENoYXBBdXRoUGVlciAtIEF1dGhlbnRpY2F0ZSBvdXIgcGVlciAoc3RhcnQgc2VydmVyKS4KKyAqLwordm9pZAorQ2hhcEF1dGhQZWVyKGludCB1bml0LCBjaGFyICpvdXJfbmFtZSwgdV9jaGFyIGRpZ2VzdCkKK3sKKyAgY2hhcF9zdGF0ZSAqY3N0YXRlID0gJmNoYXBbdW5pdF07CisKKyAgY3N0YXRlLT5jaGFsX25hbWUgPSBvdXJfbmFtZTsKKyAgY3N0YXRlLT5jaGFsX3R5cGUgPSBkaWdlc3Q7CisgIAorICBpZiAoY3N0YXRlLT5zZXJ2ZXJzdGF0ZSA9PSBDSEFQU1NfSU5JVElBTCB8fAorICAgICAgY3N0YXRlLT5zZXJ2ZXJzdGF0ZSA9PSBDSEFQU1NfUEVORElORykgeworICAgIC8qIGxvd2VyIGxheWVyIGlzbid0IHVwIC0gd2FpdCB1bnRpbCBsYXRlciAqLworICAgIGNzdGF0ZS0+c2VydmVyc3RhdGUgPSBDSEFQU1NfUEVORElORzsKKyAgICByZXR1cm47CisgIH0KKworICBDaGFwR2VuQ2hhbGxlbmdlKGNzdGF0ZSk7CisgIENoYXBTZW5kQ2hhbGxlbmdlKGNzdGF0ZSk7ICAgIC8qIGNyYW5rIGl0IHVwIGR1ZGUhICovCisgIGNzdGF0ZS0+c2VydmVyc3RhdGUgPSBDSEFQU1NfSU5JVElBTF9DSEFMOworfQorCisKKy8qCisgKiBDaGFwQ2hhbGxlbmdlVGltZW91dCAtIFRpbWVvdXQgZXhwaXJlZCBvbiBzZW5kaW5nIGNoYWxsZW5nZS4KKyAqLworc3RhdGljIHZvaWQKK0NoYXBDaGFsbGVuZ2VUaW1lb3V0KHZvaWQgKmFyZykKK3sKKyAgY2hhcF9zdGF0ZSAqY3N0YXRlID0gKGNoYXBfc3RhdGUgKikgYXJnOworCisgIC8qIGlmIHdlIGFyZW4ndCBzZW5kaW5nIGNoYWxsZW5nZXMsIGRvbid0IHdvcnJ5LiAgdGhlbiBhZ2FpbiB3ZSAqLworICAvKiBwcm9iYWJseSBzaG91bGRuJ3QgYmUgaGVyZSBlaXRoZXIgKi8KKyAgaWYgKGNzdGF0ZS0+c2VydmVyc3RhdGUgIT0gQ0hBUFNTX0lOSVRJQUxfQ0hBTCAmJgorICAgICAgY3N0YXRlLT5zZXJ2ZXJzdGF0ZSAhPSBDSEFQU1NfUkVDSEFMTEVOR0UpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY3N0YXRlLT5jaGFsX3RyYW5zbWl0cyA+PSBjc3RhdGUtPm1heF90cmFuc21pdHMpIHsKKyAgICAvKiBnaXZlIHVwIG9uIHBlZXIgKi8KKyAgICBDSEFQREVCVUcoTE9HX0VSUiwgKCJQZWVyIGZhaWxlZCB0byByZXNwb25kIHRvIENIQVAgY2hhbGxlbmdlXG4iKSk7CisgICAgY3N0YXRlLT5zZXJ2ZXJzdGF0ZSA9IENIQVBTU19CQURBVVRIOworICAgIGF1dGhfcGVlcl9mYWlsKGNzdGF0ZS0+dW5pdCwgUFBQX0NIQVApOworICAgIHJldHVybjsKKyAgfQorCisgIENoYXBTZW5kQ2hhbGxlbmdlKGNzdGF0ZSk7IC8qIFJlLXNlbmQgY2hhbGxlbmdlICovCit9CisKKworLyoKKyAqIENoYXBSZXNwb25zZVRpbWVvdXQgLSBUaW1lb3V0IGV4cGlyZWQgb24gc2VuZGluZyByZXNwb25zZS4KKyAqLworc3RhdGljIHZvaWQKK0NoYXBSZXNwb25zZVRpbWVvdXQodm9pZCAqYXJnKQoreworICBjaGFwX3N0YXRlICpjc3RhdGUgPSAoY2hhcF9zdGF0ZSAqKSBhcmc7CisKKyAgLyogaWYgd2UgYXJlbid0IHNlbmRpbmcgYSByZXNwb25zZSwgZG9uJ3Qgd29ycnkuICovCisgIGlmIChjc3RhdGUtPmNsaWVudHN0YXRlICE9IENIQVBDU19SRVNQT05TRSkgeworICAgIHJldHVybjsKKyAgfQorCisgIENoYXBTZW5kUmVzcG9uc2UoY3N0YXRlKTsgICAgLyogcmUtc2VuZCByZXNwb25zZSAqLworfQorCisKKy8qCisgKiBDaGFwUmVjaGFsbGVuZ2UgLSBUaW1lIHRvIGNoYWxsZW5nZSB0aGUgcGVlciBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQKK0NoYXBSZWNoYWxsZW5nZSh2b2lkICphcmcpCit7CisgIGNoYXBfc3RhdGUgKmNzdGF0ZSA9IChjaGFwX3N0YXRlICopIGFyZzsKKyAgCisgIC8qIGlmIHdlIGFyZW4ndCBzZW5kaW5nIGEgcmVzcG9uc2UsIGRvbid0IHdvcnJ5LiAqLworICBpZiAoY3N0YXRlLT5zZXJ2ZXJzdGF0ZSAhPSBDSEFQU1NfT1BFTikgeworICAgIHJldHVybjsKKyAgfQorCisgIENoYXBHZW5DaGFsbGVuZ2UoY3N0YXRlKTsKKyAgQ2hhcFNlbmRDaGFsbGVuZ2UoY3N0YXRlKTsKKyAgY3N0YXRlLT5zZXJ2ZXJzdGF0ZSA9IENIQVBTU19SRUNIQUxMRU5HRTsKK30KKworCisvKgorICogQ2hhcExvd2VyVXAgLSBUaGUgbG93ZXIgbGF5ZXIgaXMgdXAuCisgKgorICogU3RhcnQgdXAgaWYgd2UgaGF2ZSBwZW5kaW5nIHJlcXVlc3RzLgorICovCitzdGF0aWMgdm9pZAorQ2hhcExvd2VyVXAoaW50IHVuaXQpCit7CisgIGNoYXBfc3RhdGUgKmNzdGF0ZSA9ICZjaGFwW3VuaXRdOworCisgIGlmIChjc3RhdGUtPmNsaWVudHN0YXRlID09IENIQVBDU19JTklUSUFMKSB7CisgICAgY3N0YXRlLT5jbGllbnRzdGF0ZSA9IENIQVBDU19DTE9TRUQ7CisgIH0gZWxzZSBpZiAoY3N0YXRlLT5jbGllbnRzdGF0ZSA9PSBDSEFQQ1NfUEVORElORykgeworICAgIGNzdGF0ZS0+Y2xpZW50c3RhdGUgPSBDSEFQQ1NfTElTVEVOOworICB9CisKKyAgaWYgKGNzdGF0ZS0+c2VydmVyc3RhdGUgPT0gQ0hBUFNTX0lOSVRJQUwpIHsKKyAgICBjc3RhdGUtPnNlcnZlcnN0YXRlID0gQ0hBUFNTX0NMT1NFRDsKKyAgfSBlbHNlIGlmIChjc3RhdGUtPnNlcnZlcnN0YXRlID09IENIQVBTU19QRU5ESU5HKSB7CisgICAgQ2hhcEdlbkNoYWxsZW5nZShjc3RhdGUpOworICAgIENoYXBTZW5kQ2hhbGxlbmdlKGNzdGF0ZSk7CisgICAgY3N0YXRlLT5zZXJ2ZXJzdGF0ZSA9IENIQVBTU19JTklUSUFMX0NIQUw7CisgIH0KK30KKworCisvKgorICogQ2hhcExvd2VyRG93biAtIFRoZSBsb3dlciBsYXllciBpcyBkb3duLgorICoKKyAqIENhbmNlbCBhbGwgdGltZW91dHMuCisgKi8KK3N0YXRpYyB2b2lkCitDaGFwTG93ZXJEb3duKGludCB1bml0KQoreworICBjaGFwX3N0YXRlICpjc3RhdGUgPSAmY2hhcFt1bml0XTsKKworICAvKiBUaW1lb3V0KHMpIHBlbmRpbmc/ICBDYW5jZWwgaWYgc28uICovCisgIGlmIChjc3RhdGUtPnNlcnZlcnN0YXRlID09IENIQVBTU19JTklUSUFMX0NIQUwgfHwKKyAgICAgIGNzdGF0ZS0+c2VydmVyc3RhdGUgPT0gQ0hBUFNTX1JFQ0hBTExFTkdFKSB7CisgICAgVU5USU1FT1VUKENoYXBDaGFsbGVuZ2VUaW1lb3V0LCBjc3RhdGUpOworICB9IGVsc2UgaWYgKGNzdGF0ZS0+c2VydmVyc3RhdGUgPT0gQ0hBUFNTX09QRU4KKyAgICAgICYmIGNzdGF0ZS0+Y2hhbF9pbnRlcnZhbCAhPSAwKSB7CisgICAgVU5USU1FT1VUKENoYXBSZWNoYWxsZW5nZSwgY3N0YXRlKTsKKyAgfQorICBpZiAoY3N0YXRlLT5jbGllbnRzdGF0ZSA9PSBDSEFQQ1NfUkVTUE9OU0UpIHsKKyAgICBVTlRJTUVPVVQoQ2hhcFJlc3BvbnNlVGltZW91dCwgY3N0YXRlKTsKKyAgfQorICBjc3RhdGUtPmNsaWVudHN0YXRlID0gQ0hBUENTX0lOSVRJQUw7CisgIGNzdGF0ZS0+c2VydmVyc3RhdGUgPSBDSEFQU1NfSU5JVElBTDsKK30KKworCisvKgorICogQ2hhcFByb3RvY29sUmVqZWN0IC0gUGVlciBkb2Vzbid0IGdyb2sgQ0hBUC4KKyAqLworc3RhdGljIHZvaWQKK0NoYXBQcm90b2NvbFJlamVjdChpbnQgdW5pdCkKK3sKKyAgY2hhcF9zdGF0ZSAqY3N0YXRlID0gJmNoYXBbdW5pdF07CisgIAorICBpZiAoY3N0YXRlLT5zZXJ2ZXJzdGF0ZSAhPSBDSEFQU1NfSU5JVElBTCAmJgorICAgICAgY3N0YXRlLT5zZXJ2ZXJzdGF0ZSAhPSBDSEFQU1NfQ0xPU0VEKSB7CisgICAgYXV0aF9wZWVyX2ZhaWwodW5pdCwgUFBQX0NIQVApOworICB9CisgIGlmIChjc3RhdGUtPmNsaWVudHN0YXRlICE9IENIQVBDU19JTklUSUFMICYmCisgICAgICBjc3RhdGUtPmNsaWVudHN0YXRlICE9IENIQVBDU19DTE9TRUQpIHsKKyAgICBhdXRoX3dpdGhwZWVyX2ZhaWwodW5pdCwgUFBQX0NIQVApOyAvKiBsd2lwOiBqdXN0IHNldHMgdGhlIFBQUCBlcnJvciBjb2RlIG9uIHRoaXMgdW5pdCB0byBQUFBFUlJfQVVUSEZBSUwgKi8KKyAgfQorICBDaGFwTG93ZXJEb3duKHVuaXQpOyAvKiBzaHV0ZG93biBjaGFwICovCit9CisKKworLyoKKyAqIENoYXBJbnB1dCAtIElucHV0IENIQVAgcGFja2V0LgorICovCitzdGF0aWMgdm9pZAorQ2hhcElucHV0KGludCB1bml0LCB1X2NoYXIgKmlucGFja2V0LCBpbnQgcGFja2V0X2xlbikKK3sKKyAgY2hhcF9zdGF0ZSAqY3N0YXRlID0gJmNoYXBbdW5pdF07CisgIHVfY2hhciAqaW5wOworICB1X2NoYXIgY29kZSwgaWQ7CisgIGludCBsZW47CisgIAorICAvKgorICAgKiBQYXJzZSBoZWFkZXIgKGNvZGUsIGlkIGFuZCBsZW5ndGgpLgorICAgKiBJZiBwYWNrZXQgdG9vIHNob3J0LCBkcm9wIGl0LgorICAgKi8KKyAgaW5wID0gaW5wYWNrZXQ7CisgIGlmIChwYWNrZXRfbGVuIDwgQ0hBUF9IRUFERVJMRU4pIHsKKyAgICBDSEFQREVCVUcoTE9HX0lORk8sICgiQ2hhcElucHV0OiByY3ZkIHNob3J0IGhlYWRlci5cbiIpKTsKKyAgICByZXR1cm47CisgIH0KKyAgR0VUQ0hBUihjb2RlLCBpbnApOworICBHRVRDSEFSKGlkLCBpbnApOworICBHRVRTSE9SVChsZW4sIGlucCk7CisgIGlmIChsZW4gPCBDSEFQX0hFQURFUkxFTikgeworICAgIENIQVBERUJVRyhMT0dfSU5GTywgKCJDaGFwSW5wdXQ6IHJjdmQgaWxsZWdhbCBsZW5ndGguXG4iKSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChsZW4gPiBwYWNrZXRfbGVuKSB7CisgICAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBJbnB1dDogcmN2ZCBzaG9ydCBwYWNrZXQuXG4iKSk7CisgICAgcmV0dXJuOworICB9CisgIGxlbiAtPSBDSEFQX0hFQURFUkxFTjsKKyAgCisgIC8qCisgICAqIEFjdGlvbiBkZXBlbmRzIG9uIGNvZGUgKGFzIGluIGZhY3QgaXQgdXN1YWxseSBkb2VzIDotKS4KKyAgICovCisgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgQ0hBUF9DSEFMTEVOR0U6CisgICAgICBDaGFwUmVjZWl2ZUNoYWxsZW5nZShjc3RhdGUsIGlucCwgaWQsIGxlbik7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIENIQVBfUkVTUE9OU0U6CisgICAgICBDaGFwUmVjZWl2ZVJlc3BvbnNlKGNzdGF0ZSwgaW5wLCBpZCwgbGVuKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgQ0hBUF9GQUlMVVJFOgorICAgICAgQ2hhcFJlY2VpdmVGYWlsdXJlKGNzdGF0ZSwgaW5wLCBpZCwgbGVuKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgQ0hBUF9TVUNDRVNTOgorICAgICAgQ2hhcFJlY2VpdmVTdWNjZXNzKGNzdGF0ZSwgaW5wLCBpZCwgbGVuKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6ICAgICAgICAvKiBOZWVkIGNvZGUgcmVqZWN0PyAqLworICAgICAgQ0hBUERFQlVHKExPR19XQVJOSU5HLCAoIlVua25vd24gQ0hBUCBjb2RlICglZCkgcmVjZWl2ZWQuXG4iLCBjb2RlKSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBDaGFwUmVjZWl2ZUNoYWxsZW5nZSAtIFJlY2VpdmUgQ2hhbGxlbmdlIGFuZCBzZW5kIFJlc3BvbnNlLgorICovCitzdGF0aWMgdm9pZAorQ2hhcFJlY2VpdmVDaGFsbGVuZ2UoY2hhcF9zdGF0ZSAqY3N0YXRlLCB1X2NoYXIgKmlucCwgdV9jaGFyIGlkLCBpbnQgbGVuKQoreworICBpbnQgcmNoYWxsZW5nZV9sZW47CisgIHVfY2hhciAqcmNoYWxsZW5nZTsKKyAgaW50IHNlY3JldF9sZW47CisgIGNoYXIgc2VjcmV0W01BWFNFQ1JFVExFTl07CisgIGNoYXIgcmhvc3RuYW1lWzI1Nl07CisgIE1ENV9DVFggbWRDb250ZXh0OworICB1X2NoYXIgaGFzaFtNRDVfU0lHTkFUVVJFX1NJWkVdOworCisgIENIQVBERUJVRyhMT0dfSU5GTywgKCJDaGFwUmVjZWl2ZUNoYWxsZW5nZTogUmN2ZCBpZCAlZC5cbiIsIGlkKSk7CisgIGlmIChjc3RhdGUtPmNsaWVudHN0YXRlID09IENIQVBDU19DTE9TRUQgfHwKKyAgICBjc3RhdGUtPmNsaWVudHN0YXRlID09IENIQVBDU19QRU5ESU5HKSB7CisgICAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBSZWNlaXZlQ2hhbGxlbmdlOiBpbiBzdGF0ZSAlZFxuIiwKKyAgICAgICAgIGNzdGF0ZS0+Y2xpZW50c3RhdGUpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAobGVuIDwgMikgeworICAgIENIQVBERUJVRyhMT0dfSU5GTywgKCJDaGFwUmVjZWl2ZUNoYWxsZW5nZTogcmN2ZCBzaG9ydCBwYWNrZXQuXG4iKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgR0VUQ0hBUihyY2hhbGxlbmdlX2xlbiwgaW5wKTsKKyAgbGVuIC09IHNpemVvZiAodV9jaGFyKSArIHJjaGFsbGVuZ2VfbGVuOyAgLyogbm93IG5hbWUgZmllbGQgbGVuZ3RoICovCisgIGlmIChsZW4gPCAwKSB7CisgICAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBSZWNlaXZlQ2hhbGxlbmdlOiByY3ZkIHNob3J0IHBhY2tldC5cbiIpKTsKKyAgICByZXR1cm47CisgIH0KKyAgcmNoYWxsZW5nZSA9IGlucDsKKyAgSU5DUFRSKHJjaGFsbGVuZ2VfbGVuLCBpbnApOworCisgIGlmIChsZW4gPj0gKGludClzaXplb2Yocmhvc3RuYW1lKSkgeworICAgIGxlbiA9IHNpemVvZihyaG9zdG5hbWUpIC0gMTsKKyAgfQorICBCQ09QWShpbnAsIHJob3N0bmFtZSwgbGVuKTsKKyAgcmhvc3RuYW1lW2xlbl0gPSAnXDAwMCc7CisKKyAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBSZWNlaXZlQ2hhbGxlbmdlOiByZWNlaXZlZCBuYW1lIGZpZWxkICclcydcbiIsCisgICAgICAgICAgICAgcmhvc3RuYW1lKSk7CisKKyAgLyogTWljcm9zb2Z0IGRvZXNuJ3Qgc2VuZCB0aGVpciBuYW1lIGJhY2sgaW4gdGhlIFBQUCBwYWNrZXQgKi8KKyAgaWYgKHBwcF9zZXR0aW5ncy5yZW1vdGVfbmFtZVswXSAhPSAwICYmIChwcHBfc2V0dGluZ3MuZXhwbGljaXRfcmVtb3RlIHx8IHJob3N0bmFtZVswXSA9PSAwKSkgeworICAgIHN0cm5jcHkocmhvc3RuYW1lLCBwcHBfc2V0dGluZ3MucmVtb3RlX25hbWUsIHNpemVvZihyaG9zdG5hbWUpKTsKKyAgICByaG9zdG5hbWVbc2l6ZW9mKHJob3N0bmFtZSkgLSAxXSA9IDA7CisgICAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBSZWNlaXZlQ2hhbGxlbmdlOiB1c2luZyAnJXMnIGFzIHJlbW90ZSBuYW1lXG4iLAorICAgICAgICAgICAgICAgcmhvc3RuYW1lKSk7CisgIH0KKworICAvKiBnZXQgc2VjcmV0IGZvciBhdXRoZW50aWNhdGluZyBvdXJzZWx2ZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGhvc3QgKi8KKyAgaWYgKCFnZXRfc2VjcmV0KGNzdGF0ZS0+dW5pdCwgY3N0YXRlLT5yZXNwX25hbWUsIHJob3N0bmFtZSwKKyAgICAgICAgICAgICAgICAgIHNlY3JldCwgJnNlY3JldF9sZW4sIDApKSB7CisgICAgc2VjcmV0X2xlbiA9IDA7ICAgIC8qIGFzc3VtZSBudWxsIHNlY3JldCBpZiBjYW4ndCBmaW5kIG9uZSAqLworICAgIENIQVBERUJVRyhMT0dfV0FSTklORywgKCJObyBDSEFQIHNlY3JldCBmb3VuZCBmb3IgYXV0aGVudGljYXRpbmcgdXMgdG8gJXNcbiIsCisgICAgICAgICAgICAgICByaG9zdG5hbWUpKTsKKyAgfQorCisgIC8qIGNhbmNlbCByZXNwb25zZSBzZW5kIHRpbWVvdXQgaWYgbmVjZXNzYXJ5ICovCisgIGlmIChjc3RhdGUtPmNsaWVudHN0YXRlID09IENIQVBDU19SRVNQT05TRSkgeworICAgIFVOVElNRU9VVChDaGFwUmVzcG9uc2VUaW1lb3V0LCBjc3RhdGUpOworICB9CisKKyAgY3N0YXRlLT5yZXNwX2lkID0gaWQ7CisgIGNzdGF0ZS0+cmVzcF90cmFuc21pdHMgPSAwOworCisgIC8qICBnZW5lcmF0ZSBNRCBiYXNlZCBvbiBuZWdvdGlhdGVkIHR5cGUgKi8KKyAgc3dpdGNoIChjc3RhdGUtPnJlc3BfdHlwZSkgeyAKKworICBjYXNlIENIQVBfRElHRVNUX01ENToKKyAgICBNRDVJbml0KCZtZENvbnRleHQpOworICAgIE1ENVVwZGF0ZSgmbWRDb250ZXh0LCAmY3N0YXRlLT5yZXNwX2lkLCAxKTsKKyAgICBNRDVVcGRhdGUoJm1kQ29udGV4dCwgKHVfY2hhciopc2VjcmV0LCBzZWNyZXRfbGVuKTsKKyAgICBNRDVVcGRhdGUoJm1kQ29udGV4dCwgcmNoYWxsZW5nZSwgcmNoYWxsZW5nZV9sZW4pOworICAgIE1ENUZpbmFsKGhhc2gsICZtZENvbnRleHQpOworICAgIEJDT1BZKGhhc2gsIGNzdGF0ZS0+cmVzcG9uc2UsIE1ENV9TSUdOQVRVUkVfU0laRSk7CisgICAgY3N0YXRlLT5yZXNwX2xlbmd0aCA9IE1ENV9TSUdOQVRVUkVfU0laRTsKKyAgICBicmVhazsKKyAgCisjaWYgTVNDSEFQX1NVUFBPUlQKKyAgY2FzZSBDSEFQX01JQ1JPU09GVDoKKyAgICBDaGFwTVMoY3N0YXRlLCByY2hhbGxlbmdlLCByY2hhbGxlbmdlX2xlbiwgc2VjcmV0LCBzZWNyZXRfbGVuKTsKKyAgICBicmVhazsKKyNlbmRpZgorCisgIGRlZmF1bHQ6CisgICAgQ0hBUERFQlVHKExPR19JTkZPLCAoInVua25vd24gZGlnZXN0IHR5cGUgJWRcbiIsIGNzdGF0ZS0+cmVzcF90eXBlKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgQlpFUk8oc2VjcmV0LCBzaXplb2Yoc2VjcmV0KSk7CisgIENoYXBTZW5kUmVzcG9uc2UoY3N0YXRlKTsKK30KKworCisvKgorICogQ2hhcFJlY2VpdmVSZXNwb25zZSAtIFJlY2VpdmUgYW5kIHByb2Nlc3MgcmVzcG9uc2UuCisgKi8KK3N0YXRpYyB2b2lkCitDaGFwUmVjZWl2ZVJlc3BvbnNlKGNoYXBfc3RhdGUgKmNzdGF0ZSwgdV9jaGFyICppbnAsIGludCBpZCwgaW50IGxlbikKK3sKKyAgdV9jaGFyICpyZW1tZCwgcmVtbWRfbGVuOworICBpbnQgc2VjcmV0X2xlbiwgb2xkX3N0YXRlOworICBpbnQgY29kZTsKKyAgY2hhciByaG9zdG5hbWVbMjU2XTsKKyAgTUQ1X0NUWCBtZENvbnRleHQ7CisgIGNoYXIgc2VjcmV0W01BWFNFQ1JFVExFTl07CisgIHVfY2hhciBoYXNoW01ENV9TSUdOQVRVUkVfU0laRV07CisKKyAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBSZWNlaXZlUmVzcG9uc2U6IFJjdmQgaWQgJWQuXG4iLCBpZCkpOworICAKKyAgaWYgKGNzdGF0ZS0+c2VydmVyc3RhdGUgPT0gQ0hBUFNTX0NMT1NFRCB8fAorICAgICAgY3N0YXRlLT5zZXJ2ZXJzdGF0ZSA9PSBDSEFQU1NfUEVORElORykgeworICAgIENIQVBERUJVRyhMT0dfSU5GTywgKCJDaGFwUmVjZWl2ZVJlc3BvbnNlOiBpbiBzdGF0ZSAlZFxuIiwKKyAgICBjc3RhdGUtPnNlcnZlcnN0YXRlKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGlkICE9IGNzdGF0ZS0+Y2hhbF9pZCkgeworICAgIHJldHVybjsgICAgICAvKiBkb2Vzbid0IG1hdGNoIElEIG9mIGxhc3QgY2hhbGxlbmdlICovCisgIH0KKworICAvKgorICAqIElmIHdlIGhhdmUgcmVjZWl2ZWQgYSBkdXBsaWNhdGUgb3IgYm9ndXMgUmVzcG9uc2UsCisgICogd2UgaGF2ZSB0byBzZW5kIHRoZSBzYW1lIGFuc3dlciAoU3VjY2Vzcy9GYWlsdXJlKQorICAqIGFzIHdlIGRpZCBmb3IgdGhlIGZpcnN0IFJlc3BvbnNlIHdlIHNhdy4KKyAgKi8KKyAgaWYgKGNzdGF0ZS0+c2VydmVyc3RhdGUgPT0gQ0hBUFNTX09QRU4pIHsKKyAgICBDaGFwU2VuZFN0YXR1cyhjc3RhdGUsIENIQVBfU1VDQ0VTUyk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChjc3RhdGUtPnNlcnZlcnN0YXRlID09IENIQVBTU19CQURBVVRIKSB7CisgICAgQ2hhcFNlbmRTdGF0dXMoY3N0YXRlLCBDSEFQX0ZBSUxVUkUpOworICAgIHJldHVybjsKKyAgfQorICAKKyAgaWYgKGxlbiA8IDIpIHsKKyAgICBDSEFQREVCVUcoTE9HX0lORk8sICgiQ2hhcFJlY2VpdmVSZXNwb25zZTogcmN2ZCBzaG9ydCBwYWNrZXQuXG4iKSk7CisgICAgcmV0dXJuOworICB9CisgIEdFVENIQVIocmVtbWRfbGVuLCBpbnApOyAvKiBnZXQgbGVuZ3RoIG9mIE1EICovCisgIHJlbW1kID0gaW5wOyAgICAgICAgICAgICAvKiBnZXQgcG9pbnRlciB0byBNRCAqLworICBJTkNQVFIocmVtbWRfbGVuLCBpbnApOworICAKKyAgbGVuIC09IHNpemVvZiAodV9jaGFyKSArIHJlbW1kX2xlbjsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBDSEFQREVCVUcoTE9HX0lORk8sICgiQ2hhcFJlY2VpdmVSZXNwb25zZTogcmN2ZCBzaG9ydCBwYWNrZXQuXG4iKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgVU5USU1FT1VUKENoYXBDaGFsbGVuZ2VUaW1lb3V0LCBjc3RhdGUpOworICAKKyAgaWYgKGxlbiA+PSAoaW50KXNpemVvZihyaG9zdG5hbWUpKSB7CisgICAgbGVuID0gc2l6ZW9mKHJob3N0bmFtZSkgLSAxOworICB9CisgIEJDT1BZKGlucCwgcmhvc3RuYW1lLCBsZW4pOworICByaG9zdG5hbWVbbGVuXSA9ICdcMDAwJzsKKworICBDSEFQREVCVUcoTE9HX0lORk8sICgiQ2hhcFJlY2VpdmVSZXNwb25zZTogcmVjZWl2ZWQgbmFtZSBmaWVsZDogJXNcbiIsCisgICAgICAgICAgICAgcmhvc3RuYW1lKSk7CisKKyAgLyoKKyAgKiBHZXQgc2VjcmV0IGZvciBhdXRoZW50aWNhdGluZyB0aGVtIHdpdGggdXMsCisgICogZG8gdGhlIGhhc2ggb3Vyc2VsdmVzLCBhbmQgY29tcGFyZSB0aGUgcmVzdWx0LgorICAqLworICBjb2RlID0gQ0hBUF9GQUlMVVJFOworICBpZiAoIWdldF9zZWNyZXQoY3N0YXRlLT51bml0LCByaG9zdG5hbWUsIGNzdGF0ZS0+Y2hhbF9uYW1lLAorICAgICAgICAgICAgICAgICAgc2VjcmV0LCAmc2VjcmV0X2xlbiwgMSkpIHsKKyAgICBDSEFQREVCVUcoTE9HX1dBUk5JTkcsICgiTm8gQ0hBUCBzZWNyZXQgZm91bmQgZm9yIGF1dGhlbnRpY2F0aW5nICVzXG4iLAorICAgICAgICAgICAgICAgcmhvc3RuYW1lKSk7CisgIH0gZWxzZSB7CisgICAgLyogIGdlbmVyYXRlIE1EIGJhc2VkIG9uIG5lZ290aWF0ZWQgdHlwZSAqLworICAgIHN3aXRjaCAoY3N0YXRlLT5jaGFsX3R5cGUpIHsKKworICAgICAgY2FzZSBDSEFQX0RJR0VTVF9NRDU6ICAgIC8qIG9ubHkgTUQ1IGlzIGRlZmluZWQgZm9yIG5vdyAqLworICAgICAgICBpZiAocmVtbWRfbGVuICE9IE1ENV9TSUdOQVRVUkVfU0laRSkgeworICAgICAgICAgIGJyZWFrOyAgICAgIC8qIGl0J3Mgbm90IGV2ZW4gdGhlIHJpZ2h0IGxlbmd0aCAqLworICAgICAgICB9CisgICAgICAgIE1ENUluaXQoJm1kQ29udGV4dCk7CisgICAgICAgIE1ENVVwZGF0ZSgmbWRDb250ZXh0LCAmY3N0YXRlLT5jaGFsX2lkLCAxKTsKKyAgICAgICAgTUQ1VXBkYXRlKCZtZENvbnRleHQsICh1X2NoYXIqKXNlY3JldCwgc2VjcmV0X2xlbik7CisgICAgICAgIE1ENVVwZGF0ZSgmbWRDb250ZXh0LCBjc3RhdGUtPmNoYWxsZW5nZSwgY3N0YXRlLT5jaGFsX2xlbik7CisgICAgICAgIE1ENUZpbmFsKGhhc2gsICZtZENvbnRleHQpOyAKKyAgICAgICAgCisgICAgICAgIC8qIGNvbXBhcmUgbG9jYWwgYW5kIHJlbW90ZSBNRHMgYW5kIHNlbmQgdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyAqLworICAgICAgICBpZiAobWVtY21wIChoYXNoLCByZW1tZCwgTUQ1X1NJR05BVFVSRV9TSVpFKSA9PSAwKSB7CisgICAgICAgICAgY29kZSA9IENIQVBfU1VDQ0VTUzsgIC8qIHRoZXkgYXJlIHRoZSBzYW1lISAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0OgorICAgICAgICBDSEFQREVCVUcoTE9HX0lORk8sICgidW5rbm93biBkaWdlc3QgdHlwZSAlZFxuIiwgY3N0YXRlLT5jaGFsX3R5cGUpKTsKKyAgICB9CisgIH0KKyAgCisgIEJaRVJPKHNlY3JldCwgc2l6ZW9mKHNlY3JldCkpOworICBDaGFwU2VuZFN0YXR1cyhjc3RhdGUsIGNvZGUpOworCisgIGlmIChjb2RlID09IENIQVBfU1VDQ0VTUykgeworICAgIG9sZF9zdGF0ZSA9IGNzdGF0ZS0+c2VydmVyc3RhdGU7CisgICAgY3N0YXRlLT5zZXJ2ZXJzdGF0ZSA9IENIQVBTU19PUEVOOworICAgIGlmIChvbGRfc3RhdGUgPT0gQ0hBUFNTX0lOSVRJQUxfQ0hBTCkgeworICAgICAgYXV0aF9wZWVyX3N1Y2Nlc3MoY3N0YXRlLT51bml0LCBQUFBfQ0hBUCwgcmhvc3RuYW1lLCBsZW4pOworICAgIH0KKyAgICBpZiAoY3N0YXRlLT5jaGFsX2ludGVydmFsICE9IDApIHsKKyAgICAgIFRJTUVPVVQoQ2hhcFJlY2hhbGxlbmdlLCBjc3RhdGUsIGNzdGF0ZS0+Y2hhbF9pbnRlcnZhbCk7CisgICAgfQorICB9IGVsc2UgeworICAgIENIQVBERUJVRyhMT0dfRVJSLCAoIkNIQVAgcGVlciBhdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIpKTsKKyAgICBjc3RhdGUtPnNlcnZlcnN0YXRlID0gQ0hBUFNTX0JBREFVVEg7CisgICAgYXV0aF9wZWVyX2ZhaWwoY3N0YXRlLT51bml0LCBQUFBfQ0hBUCk7CisgIH0KK30KKworLyoKKyAqIENoYXBSZWNlaXZlU3VjY2VzcyAtIFJlY2VpdmUgU3VjY2VzcworICovCitzdGF0aWMgdm9pZAorQ2hhcFJlY2VpdmVTdWNjZXNzKGNoYXBfc3RhdGUgKmNzdGF0ZSwgdV9jaGFyICppbnAsIHVfY2hhciBpZCwgaW50IGxlbikKK3sKKyAgTFdJUF9VTlVTRURfQVJHKGlkKTsKKyAgTFdJUF9VTlVTRURfQVJHKGlucCk7CisKKyAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBSZWNlaXZlU3VjY2VzczogUmN2ZCBpZCAlZC5cbiIsIGlkKSk7CisKKyAgaWYgKGNzdGF0ZS0+Y2xpZW50c3RhdGUgPT0gQ0hBUENTX09QRU4pIHsKKyAgICAvKiBwcmVzdW1hYmx5IGFuIGFuc3dlciB0byBhIGR1cGxpY2F0ZSByZXNwb25zZSAqLworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChjc3RhdGUtPmNsaWVudHN0YXRlICE9IENIQVBDU19SRVNQT05TRSkgeworICAgIC8qIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzICovCisgICAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBSZWNlaXZlU3VjY2VzczogaW4gc3RhdGUgJWRcbiIsCisgICAgICAgICAgICAgICBjc3RhdGUtPmNsaWVudHN0YXRlKSk7CisgICAgcmV0dXJuOworICB9CisgIAorICBVTlRJTUVPVVQoQ2hhcFJlc3BvbnNlVGltZW91dCwgY3N0YXRlKTsKKyAgCisgIC8qCisgICAqIFByaW50IG1lc3NhZ2UuCisgICAqLworICBpZiAobGVuID4gMCkgeworICAgIFBSSU5UTVNHKGlucCwgbGVuKTsKKyAgfQorCisgIGNzdGF0ZS0+Y2xpZW50c3RhdGUgPSBDSEFQQ1NfT1BFTjsKKworICBhdXRoX3dpdGhwZWVyX3N1Y2Nlc3MoY3N0YXRlLT51bml0LCBQUFBfQ0hBUCk7Cit9CisKKworLyoKKyAqIENoYXBSZWNlaXZlRmFpbHVyZSAtIFJlY2VpdmUgZmFpbHVyZS4KKyAqLworc3RhdGljIHZvaWQKK0NoYXBSZWNlaXZlRmFpbHVyZShjaGFwX3N0YXRlICpjc3RhdGUsIHVfY2hhciAqaW5wLCB1X2NoYXIgaWQsIGludCBsZW4pCit7CisgIExXSVBfVU5VU0VEX0FSRyhpZCk7CisgIExXSVBfVU5VU0VEX0FSRyhpbnApOworCisgIENIQVBERUJVRyhMT0dfSU5GTywgKCJDaGFwUmVjZWl2ZUZhaWx1cmU6IFJjdmQgaWQgJWQuXG4iLCBpZCkpOworCisgIGlmIChjc3RhdGUtPmNsaWVudHN0YXRlICE9IENIQVBDU19SRVNQT05TRSkgeworICAgIC8qIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzICovCisgICAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBSZWNlaXZlRmFpbHVyZTogaW4gc3RhdGUgJWRcbiIsCisgICAgICAgICAgICAgICBjc3RhdGUtPmNsaWVudHN0YXRlKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgVU5USU1FT1VUKENoYXBSZXNwb25zZVRpbWVvdXQsIGNzdGF0ZSk7CisKKyAgLyoKKyAgICogUHJpbnQgbWVzc2FnZS4KKyAgICovCisgIGlmIChsZW4gPiAwKSB7CisgICAgUFJJTlRNU0coaW5wLCBsZW4pOworICB9CisKKyAgQ0hBUERFQlVHKExPR19FUlIsICgiQ0hBUCBhdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIpKTsKKyAgYXV0aF93aXRocGVlcl9mYWlsKGNzdGF0ZS0+dW5pdCwgUFBQX0NIQVApOyAvKiBsd2lwOiBqdXN0IHNldHMgdGhlIFBQUCBlcnJvciBjb2RlIG9uIHRoaXMgdW5pdCB0byBQUFBFUlJfQVVUSEZBSUwgKi8KK30KKworCisvKgorICogQ2hhcFNlbmRDaGFsbGVuZ2UgLSBTZW5kIGFuIEF1dGhlbnRpY2F0ZSBjaGFsbGVuZ2UuCisgKi8KK3N0YXRpYyB2b2lkCitDaGFwU2VuZENoYWxsZW5nZShjaGFwX3N0YXRlICpjc3RhdGUpCit7CisgIHVfY2hhciAqb3V0cDsKKyAgaW50IGNoYWxfbGVuLCBuYW1lX2xlbjsKKyAgaW50IG91dGxlbjsKKyAgCisgIGNoYWxfbGVuID0gY3N0YXRlLT5jaGFsX2xlbjsKKyAgbmFtZV9sZW4gPSAoaW50KXN0cmxlbihjc3RhdGUtPmNoYWxfbmFtZSk7CisgIG91dGxlbiA9IENIQVBfSEVBREVSTEVOICsgc2l6ZW9mICh1X2NoYXIpICsgY2hhbF9sZW4gKyBuYW1lX2xlbjsKKyAgb3V0cCA9IG91dHBhY2tldF9idWZbY3N0YXRlLT51bml0XTsKKworICBNQUtFSEVBREVSKG91dHAsIFBQUF9DSEFQKTsgICAgLyogcGFzdGUgaW4gYSBDSEFQIGhlYWRlciAqLworCisgIFBVVENIQVIoQ0hBUF9DSEFMTEVOR0UsIG91dHApOworICBQVVRDSEFSKGNzdGF0ZS0+Y2hhbF9pZCwgb3V0cCk7CisgIFBVVFNIT1JUKG91dGxlbiwgb3V0cCk7CisKKyAgUFVUQ0hBUihjaGFsX2xlbiwgb3V0cCk7ICAgIC8qIHB1dCBsZW5ndGggb2YgY2hhbGxlbmdlICovCisgIEJDT1BZKGNzdGF0ZS0+Y2hhbGxlbmdlLCBvdXRwLCBjaGFsX2xlbik7CisgIElOQ1BUUihjaGFsX2xlbiwgb3V0cCk7CisKKyAgQkNPUFkoY3N0YXRlLT5jaGFsX25hbWUsIG91dHAsIG5hbWVfbGVuKTsgIC8qIGFwcGVuZCBob3N0bmFtZSAqLworICAKKyAgcHBwV3JpdGUoY3N0YXRlLT51bml0LCBvdXRwYWNrZXRfYnVmW2NzdGF0ZS0+dW5pdF0sIG91dGxlbiArIFBQUF9IRFJMRU4pOworCisgIENIQVBERUJVRyhMT0dfSU5GTywgKCJDaGFwU2VuZENoYWxsZW5nZTogU2VudCBpZCAlZC5cbiIsIGNzdGF0ZS0+Y2hhbF9pZCkpOworICAKKyAgVElNRU9VVChDaGFwQ2hhbGxlbmdlVGltZW91dCwgY3N0YXRlLCBjc3RhdGUtPnRpbWVvdXR0aW1lKTsKKyAgKytjc3RhdGUtPmNoYWxfdHJhbnNtaXRzOworfQorCisKKy8qCisgKiBDaGFwU2VuZFN0YXR1cyAtIFNlbmQgYSBzdGF0dXMgcmVzcG9uc2UgKGFjayBvciBuYWspLgorICovCitzdGF0aWMgdm9pZAorQ2hhcFNlbmRTdGF0dXMoY2hhcF9zdGF0ZSAqY3N0YXRlLCBpbnQgY29kZSkKK3sKKyAgdV9jaGFyICpvdXRwOworICBpbnQgb3V0bGVuLCBtc2dsZW47CisgIGNoYXIgbXNnWzI1Nl07IC8qIEB0b2RvOiB0aGlzIGNhbiBiZSBhIGNoYXIqLCBubyBzdHJjcHkgbmVlZGVkICovCisKKyAgaWYgKGNvZGUgPT0gQ0hBUF9TVUNDRVNTKSB7CisgICAgc3RyY3B5KG1zZywgIldlbGNvbWUhIik7CisgIH0gZWxzZSB7CisgICAgc3RyY3B5KG1zZywgIkkgZG9uJ3QgbGlrZSB5b3UuICBHbyAnd2F5LiIpOworICB9CisgIG1zZ2xlbiA9IChpbnQpc3RybGVuKG1zZyk7CisKKyAgb3V0bGVuID0gQ0hBUF9IRUFERVJMRU4gKyBtc2dsZW47CisgIG91dHAgPSBvdXRwYWNrZXRfYnVmW2NzdGF0ZS0+dW5pdF07CisKKyAgTUFLRUhFQURFUihvdXRwLCBQUFBfQ0hBUCk7ICAgIC8qIHBhc3RlIGluIGEgaGVhZGVyICovCisgIAorICBQVVRDSEFSKGNvZGUsIG91dHApOworICBQVVRDSEFSKGNzdGF0ZS0+Y2hhbF9pZCwgb3V0cCk7CisgIFBVVFNIT1JUKG91dGxlbiwgb3V0cCk7CisgIEJDT1BZKG1zZywgb3V0cCwgbXNnbGVuKTsKKyAgcHBwV3JpdGUoY3N0YXRlLT51bml0LCBvdXRwYWNrZXRfYnVmW2NzdGF0ZS0+dW5pdF0sIG91dGxlbiArIFBQUF9IRFJMRU4pOworCisgIENIQVBERUJVRyhMT0dfSU5GTywgKCJDaGFwU2VuZFN0YXR1czogU2VudCBjb2RlICVkLCBpZCAlZC5cbiIsIGNvZGUsCisgICAgICAgICAgICAgY3N0YXRlLT5jaGFsX2lkKSk7Cit9CisKKy8qCisgKiBDaGFwR2VuQ2hhbGxlbmdlIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSBwc2V1ZG8tcmFuZG9tIGNoYWxsZW5nZSBzdHJpbmcgb2YKKyAqIGEgcHNldWRvLXJhbmRvbSBsZW5ndGggYmV0d2VlbiBtaW5fbGVuIGFuZCBtYXhfbGVuLiAgVGhlIGNoYWxsZW5nZQorICogc3RyaW5nIGFuZCBpdHMgbGVuZ3RoIGFyZSBzdG9yZWQgaW4gKmNzdGF0ZSwgYW5kIHZhcmlvdXMgb3RoZXIgZmllbGRzIG9mCisgKiAqY3N0YXRlIGFyZSBpbml0aWFsaXplZC4KKyAqLworCitzdGF0aWMgdm9pZAorQ2hhcEdlbkNoYWxsZW5nZShjaGFwX3N0YXRlICpjc3RhdGUpCit7CisgIGludCBjaGFsX2xlbjsKKyAgdV9jaGFyICpwdHIgPSBjc3RhdGUtPmNoYWxsZW5nZTsKKyAgaW50IGk7CisKKyAgLyogcGljayBhIHJhbmRvbSBjaGFsbGVuZ2UgbGVuZ3RoIGJldHdlZW4gTUlOX0NIQUxMRU5HRV9MRU5HVEggYW5kIAorICAgICBNQVhfQ0hBTExFTkdFX0xFTkdUSCAqLyAgCisgIGNoYWxfbGVuID0gKHVuc2lnbmVkKQorICAgICAgICAoKCgobWFnaWMoKSA+PiAxNikgKgorICAgICAgICAgICAgICAoTUFYX0NIQUxMRU5HRV9MRU5HVEggLSBNSU5fQ0hBTExFTkdFX0xFTkdUSCkpID4+IDE2KQorICAgICAgICAgICArIE1JTl9DSEFMTEVOR0VfTEVOR1RIKTsKKyAgTFdJUF9BU1NFUlQoImNoYWxfbGVuIDw9IDB4ZmYiLCBjaGFsX2xlbiA8PSAweGZmZmYpOworICBjc3RhdGUtPmNoYWxfbGVuID0gKHVfY2hhciljaGFsX2xlbjsKKyAgY3N0YXRlLT5jaGFsX2lkID0gKytjc3RhdGUtPmlkOworICBjc3RhdGUtPmNoYWxfdHJhbnNtaXRzID0gMDsKKworICAvKiBnZW5lcmF0ZSBhIHJhbmRvbSBzdHJpbmcgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNoYWxfbGVuOyBpKysgKSB7CisgICAgKnB0cisrID0gKGNoYXIpIChtYWdpYygpICYgMHhmZik7CisgIH0KK30KKworLyoKKyAqIENoYXBTZW5kUmVzcG9uc2UgLSBzZW5kIGEgcmVzcG9uc2UgcGFja2V0IHdpdGggdmFsdWVzIGFzIHNwZWNpZmllZAorICogaW4gKmNzdGF0ZS4KKyAqLworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitDaGFwU2VuZFJlc3BvbnNlKGNoYXBfc3RhdGUgKmNzdGF0ZSkKK3sKKyAgdV9jaGFyICpvdXRwOworICBpbnQgb3V0bGVuLCBtZF9sZW4sIG5hbWVfbGVuOworCisgIG1kX2xlbiA9IGNzdGF0ZS0+cmVzcF9sZW5ndGg7CisgIG5hbWVfbGVuID0gKGludClzdHJsZW4oY3N0YXRlLT5yZXNwX25hbWUpOworICBvdXRsZW4gPSBDSEFQX0hFQURFUkxFTiArIHNpemVvZiAodV9jaGFyKSArIG1kX2xlbiArIG5hbWVfbGVuOworICBvdXRwID0gb3V0cGFja2V0X2J1Zltjc3RhdGUtPnVuaXRdOworCisgIE1BS0VIRUFERVIob3V0cCwgUFBQX0NIQVApOworICAKKyAgUFVUQ0hBUihDSEFQX1JFU1BPTlNFLCBvdXRwKTsgIC8qIHdlIGFyZSBhIHJlc3BvbnNlICovCisgIFBVVENIQVIoY3N0YXRlLT5yZXNwX2lkLCBvdXRwKTsgIC8qIGNvcHkgaWQgZnJvbSBjaGFsbGVuZ2UgcGFja2V0ICovCisgIFBVVFNIT1JUKG91dGxlbiwgb3V0cCk7ICAgICAgLyogcGFja2V0IGxlbmd0aCAqLworICAKKyAgUFVUQ0hBUihtZF9sZW4sIG91dHApOyAgICAgIC8qIGxlbmd0aCBvZiBNRCAqLworICBCQ09QWShjc3RhdGUtPnJlc3BvbnNlLCBvdXRwLCBtZF9sZW4pOyAgICAvKiBjb3B5IE1EIHRvIGJ1ZmZlciAqLworICBJTkNQVFIobWRfbGVuLCBvdXRwKTsKKworICBCQ09QWShjc3RhdGUtPnJlc3BfbmFtZSwgb3V0cCwgbmFtZV9sZW4pOyAgLyogYXBwZW5kIG91ciBuYW1lICovCisKKyAgLyogc2VuZCB0aGUgcGFja2V0ICovCisgIHBwcFdyaXRlKGNzdGF0ZS0+dW5pdCwgb3V0cGFja2V0X2J1Zltjc3RhdGUtPnVuaXRdLCBvdXRsZW4gKyBQUFBfSERSTEVOKTsKKworICBjc3RhdGUtPmNsaWVudHN0YXRlID0gQ0hBUENTX1JFU1BPTlNFOworICBUSU1FT1VUKENoYXBSZXNwb25zZVRpbWVvdXQsIGNzdGF0ZSwgY3N0YXRlLT50aW1lb3V0dGltZSk7CisgICsrY3N0YXRlLT5yZXNwX3RyYW5zbWl0czsKK30KKworI2lmIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUworc3RhdGljIGNoYXIgKkNoYXBDb2RlbmFtZXNbXSA9IHsKKyAgIkNoYWxsZW5nZSIsICJSZXNwb25zZSIsICJTdWNjZXNzIiwgIkZhaWx1cmUiCit9OworLyoKKyAqIENoYXBQcmludFBrdCAtIHByaW50IHRoZSBjb250ZW50cyBvZiBhIENIQVAgcGFja2V0LgorICovCitzdGF0aWMgaW50CitDaGFwUHJpbnRQa3QoIHVfY2hhciAqcCwgaW50IHBsZW4sIHZvaWQgKCpwcmludGVyKSAodm9pZCAqLCBjaGFyICosIC4uLiksIHZvaWQgKmFyZykKK3sKKyAgaW50IGNvZGUsIGlkLCBsZW47CisgIGludCBjbGVuLCBubGVuOworICB1X2NoYXIgeDsKKworICBpZiAocGxlbiA8IENIQVBfSEVBREVSTEVOKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgR0VUQ0hBUihjb2RlLCBwKTsKKyAgR0VUQ0hBUihpZCwgcCk7CisgIEdFVFNIT1JUKGxlbiwgcCk7CisgIGlmIChsZW4gPCBDSEFQX0hFQURFUkxFTiB8fCBsZW4gPiBwbGVuKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoY29kZSA+PSAxICYmIGNvZGUgPD0gc2l6ZW9mKENoYXBDb2RlbmFtZXMpIC8gc2l6ZW9mKGNoYXIgKikpIHsKKyAgICBwcmludGVyKGFyZywgIiAlcyIsIENoYXBDb2RlbmFtZXNbY29kZS0xXSk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlcihhcmcsICIgY29kZT0weCV4IiwgY29kZSk7CisgIH0KKyAgcHJpbnRlcihhcmcsICIgaWQ9MHgleCIsIGlkKTsKKyAgbGVuIC09IENIQVBfSEVBREVSTEVOOworICBzd2l0Y2ggKGNvZGUpIHsKKyAgICBjYXNlIENIQVBfQ0hBTExFTkdFOgorICAgIGNhc2UgQ0hBUF9SRVNQT05TRToKKyAgICAgIGlmIChsZW4gPCAxKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2xlbiA9IHBbMF07CisgICAgICBpZiAobGVuIDwgY2xlbiArIDEpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK3A7CisgICAgICBubGVuID0gbGVuIC0gY2xlbiAtIDE7CisgICAgICBwcmludGVyKGFyZywgIiA8Iik7CisgICAgICBmb3IgKDsgY2xlbiA+IDA7IC0tY2xlbikgeworICAgICAgICBHRVRDSEFSKHgsIHApOworICAgICAgICBwcmludGVyKGFyZywgIiUuMngiLCB4KTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXIoYXJnLCAiPiwgbmFtZSA9ICUuKloiLCBubGVuLCBwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hBUF9GQUlMVVJFOgorICAgIGNhc2UgQ0hBUF9TVUNDRVNTOgorICAgICAgcHJpbnRlcihhcmcsICIgJS4qWiIsIGxlbiwgcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZm9yIChjbGVuID0gbGVuOyBjbGVuID4gMDsgLS1jbGVuKSB7CisgICAgICAgIEdFVENIQVIoeCwgcCk7CisgICAgICAgIHByaW50ZXIoYXJnLCAiICUuMngiLCB4KTsKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBsZW4gKyBDSEFQX0hFQURFUkxFTjsKK30KKyNlbmRpZiAvKiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MgKi8KKworI2VuZGlmIC8qIENIQVBfU1VQUE9SVCAqLworCisjZW5kaWYgLyogUFBQX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2NoYXAuaCBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2NoYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWRjYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvY2hhcC5oCkBAIC0wLDAgKzEsMTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2hhcC5oIC0gTmV0d29yayBDaGFsbGVuZ2UgSGFuZHNoYWtlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIGhlYWRlciBmaWxlLgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgTWFyYyBCb3VjaGVyLCBTZXJ2aWNlcyBJbmZvcm1hdGlxdWVzIChNQlNJKSBpbmMuCisqIHBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5OCBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqCisqIFRoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLAorKiBhbmQgbGljZW5zZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkCisqIHRoYXQgZXhpc3RpbmcgY29weXJpZ2h0IG5vdGljZXMgYXJlIHJldGFpbmVkIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcworKiBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBhcmUgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55IAorKiBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwgbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMgcmVxdWlyZWQKKyogZm9yIGFueSBvZiB0aGUgYXV0aG9yaXplZCB1c2VzLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT05UUklCVVRPUlMgKkFTIElTKiBBTkQgQU5ZIEVYUFJFU1MgT1IKKyogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAKKyogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSRVZJU0lPTiBISVNUT1JZCisqCisqIDAzLTAxLTAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorKiAgIFBvcnRlZCB0byBsd0lQLgorKiA5Ny0xMi0wMyBHdXkgTGFuY2FzdGVyIDxsYW5jYXN0ZXJnQGFjbS5vcmc+LCBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqICAgT3JpZ2luYWwgYnVpbHQgZnJvbSBCU0QgbmV0d29yayBjb2RlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNoYXAuaCAtIENoYWxsZW5nZSBIYW5kc2hha2UgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTkzIFRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgdGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eS4gIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5CisgKiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MSBHcmVnb3J5IE0uIENocmlzdHkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgYXV0aG9yLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqICRJZDogY2hhcC5oLHYgMS42IDIwMTAvMDEvMjQgMTM6MTk6MzQgZ29sZHNpbW9uIEV4cCAkCisgKi8KKworI2lmbmRlZiBDSEFQX0gKKyNkZWZpbmUgQ0hBUF9ICisKKy8qIENvZGUgKyBJRCArIGxlbmd0aCAqLworI2RlZmluZSBDSEFQX0hFQURFUkxFTiA0CisKKy8qCisgKiBDSEFQIGNvZGVzLgorICovCisKKyNkZWZpbmUgQ0hBUF9ESUdFU1RfTUQ1ICAgICAgNSAgICAvKiB1c2UgTUQ1IGFsZ29yaXRobSAqLworI2RlZmluZSBNRDVfU0lHTkFUVVJFX1NJWkUgICAxNiAgIC8qIDE2IGJ5dGVzIGluIGEgTUQ1IG1lc3NhZ2UgZGlnZXN0ICovCisjZGVmaW5lIENIQVBfTUlDUk9TT0ZUICAgICAgIDB4ODAgLyogdXNlIE1pY3Jvc29mdC1jb21wYXRpYmxlIGFsZy4gKi8KKyNkZWZpbmUgTVNfQ0hBUF9SRVNQT05TRV9MRU4gNDkgICAvKiBSZXNwb25zZSBsZW5ndGggZm9yIE1TLUNIQVAgKi8KKworI2RlZmluZSBDSEFQX0NIQUxMRU5HRSAgICAgICAxCisjZGVmaW5lIENIQVBfUkVTUE9OU0UgICAgICAgIDIKKyNkZWZpbmUgQ0hBUF9TVUNDRVNTICAgICAgICAgMworI2RlZmluZSBDSEFQX0ZBSUxVUkUgICAgICAgICA0CisKKy8qCisgKiAgQ2hhbGxlbmdlIGxlbmd0aHMgKGZvciBjaGFsbGVuZ2VzIHdlIHNlbmQpIGFuZCBvdGhlciBsaW1pdHMuCisgKi8KKyNkZWZpbmUgTUlOX0NIQUxMRU5HRV9MRU5HVEggMzIKKyNkZWZpbmUgTUFYX0NIQUxMRU5HRV9MRU5HVEggNjQKKyNkZWZpbmUgTUFYX1JFU1BPTlNFX0xFTkdUSCAgNjQgLyogc3VmZmljaWVudCBmb3IgTUQ1IG9yIE1TLUNIQVAgKi8KKworLyoKKyAqIEVhY2ggaW50ZXJmYWNlIGlzIGRlc2NyaWJlZCBieSBhIGNoYXAgc3RydWN0dXJlLgorICovCisKK3R5cGVkZWYgc3RydWN0IGNoYXBfc3RhdGUgeworICBpbnQgdW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJmYWNlIHVuaXQgbnVtYmVyICovCisgIGludCBjbGllbnRzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGllbnQgc3RhdGUgKi8KKyAgaW50IHNlcnZlcnN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZlciBzdGF0ZSAqLworICB1X2NoYXIgY2hhbGxlbmdlW01BWF9DSEFMTEVOR0VfTEVOR1RIXTsgLyogbGFzdCBjaGFsbGVuZ2Ugc3RyaW5nIHNlbnQgKi8KKyAgdV9jaGFyIGNoYWxfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoYWxsZW5nZSBsZW5ndGggKi8KKyAgdV9jaGFyIGNoYWxfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElEIG9mIGxhc3QgY2hhbGxlbmdlICovCisgIHVfY2hhciBjaGFsX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXNoIGFsZ29yaXRobSBmb3IgY2hhbGxlbmdlcyAqLworICB1X2NoYXIgaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBpZCAqLworICBjaGFyICpjaGFsX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT3VyIG5hbWUgdG8gdXNlIHdpdGggY2hhbGxlbmdlICovCisgIGludCBjaGFsX2ludGVydmFsOyAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIHVudGlsIHdlIGNoYWxsZW5nZSBwZWVyIGFnYWluICovCisgIGludCB0aW1lb3V0dGltZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lb3V0IHRpbWUgaW4gc2Vjb25kcyAqLworICBpbnQgbWF4X3RyYW5zbWl0czsgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSAjIG9mIGNoYWxsZW5nZSB0cmFuc21pc3Npb25zICovCisgIGludCBjaGFsX3RyYW5zbWl0czsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdHJhbnNtaXNzaW9ucyBvZiBjaGFsbGVuZ2UgKi8KKyAgaW50IHJlc3BfdHJhbnNtaXRzOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB0cmFuc21pc3Npb25zIG9mIHJlc3BvbnNlICovCisgIHVfY2hhciByZXNwb25zZVtNQVhfUkVTUE9OU0VfTEVOR1RIXTsgICAvKiBSZXNwb25zZSB0byBzZW5kICovCisgIHVfY2hhciByZXNwX2xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgcmVzcG9uc2UgKi8KKyAgdV9jaGFyIHJlc3BfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElEIGZvciByZXNwb25zZSBtZXNzYWdlcyAqLworICB1X2NoYXIgcmVzcF90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgLyogaGFzaCBhbGdvcml0aG0gZm9yIHJlc3BvbnNlcyAqLworICBjaGFyICpyZXNwX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT3VyIG5hbWUgdG8gc2VuZCB3aXRoIHJlc3BvbnNlICovCit9IGNoYXBfc3RhdGU7CisKKworLyoKKyAqIENsaWVudCAocGVlcikgc3RhdGVzLgorICovCisjZGVmaW5lIENIQVBDU19JTklUSUFMICAgICAgIDAgLyogTG93ZXIgbGF5ZXIgZG93biwgbm90IG9wZW5lZCAqLworI2RlZmluZSBDSEFQQ1NfQ0xPU0VEICAgICAgICAxIC8qIExvd2VyIGxheWVyIHVwLCBub3Qgb3BlbmVkICovCisjZGVmaW5lIENIQVBDU19QRU5ESU5HICAgICAgIDIgLyogQXV0aCB1cyB0byBwZWVyIHdoZW4gbG93ZXIgdXAgKi8KKyNkZWZpbmUgQ0hBUENTX0xJU1RFTiAgICAgICAgMyAvKiBMaXN0ZW5pbmcgZm9yIGEgY2hhbGxlbmdlICovCisjZGVmaW5lIENIQVBDU19SRVNQT05TRSAgICAgIDQgLyogU2VudCByZXNwb25zZSwgd2FpdGluZyBmb3Igc3RhdHVzICovCisjZGVmaW5lIENIQVBDU19PUEVOICAgICAgICAgIDUgLyogV2UndmUgcmVjZWl2ZWQgU3VjY2VzcyAqLworCisvKgorICogU2VydmVyIChhdXRoZW50aWNhdG9yKSBzdGF0ZXMuCisgKi8KKyNkZWZpbmUgQ0hBUFNTX0lOSVRJQUwgICAgICAgMCAvKiBMb3dlciBsYXllciBkb3duLCBub3Qgb3BlbmVkICovCisjZGVmaW5lIENIQVBTU19DTE9TRUQgICAgICAgIDEgLyogTG93ZXIgbGF5ZXIgdXAsIG5vdCBvcGVuZWQgKi8KKyNkZWZpbmUgQ0hBUFNTX1BFTkRJTkcgICAgICAgMiAvKiBBdXRoIHBlZXIgd2hlbiBsb3dlciB1cCAqLworI2RlZmluZSBDSEFQU1NfSU5JVElBTF9DSEFMICAzIC8qIFdlJ3ZlIHNlbnQgdGhlIGZpcnN0IGNoYWxsZW5nZSAqLworI2RlZmluZSBDSEFQU1NfT1BFTiAgICAgICAgICA0IC8qIFdlJ3ZlIHNlbnQgYSBTdWNjZXNzIG1zZyAqLworI2RlZmluZSBDSEFQU1NfUkVDSEFMTEVOR0UgICA1IC8qIFdlJ3ZlIHNlbnQgYW5vdGhlciBjaGFsbGVuZ2UgKi8KKyNkZWZpbmUgQ0hBUFNTX0JBREFVVEggICAgICAgNiAvKiBXZSd2ZSBzZW50IGEgRmFpbHVyZSBtc2cgKi8KKworZXh0ZXJuIGNoYXBfc3RhdGUgY2hhcFtdOworCit2b2lkIENoYXBBdXRoV2l0aFBlZXIgKGludCwgY2hhciAqLCB1X2NoYXIpOwordm9pZCBDaGFwQXV0aFBlZXIgKGludCwgY2hhciAqLCB1X2NoYXIpOworCitleHRlcm4gc3RydWN0IHByb3RlbnQgY2hhcF9wcm90ZW50OworCisjZW5kaWYgLyogQ0hBUF9IICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9jaHBtcy5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvY2hwbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2FjZWZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvY2hwbXMuYwpAQCAtMCwwICsxLDM5NiBAQAorLyoqKiBXQVJOSU5HIC0gVEhJUyBDT0RFIEhBUyBOT1QgQkVFTiBGSU5JU0hFRCEgKioqLworLyoqKiBUaGUgb3JpZ2luYWwgUFBQRCBjb2RlIGlzIHdyaXR0ZW4gaW4gYSB3YXkgdG8gcmVxdWlyZSBlaXRoZXIgdGhlIFVOSVggREVTCisgICAgIGVuY3J5cHRpb24gZnVuY3Rpb25zIGVuY3J5cHQoMykgYW5kIHNldGtleSgzKSBvciB0aGUgREVTIGxpYnJhcnkgbGliZGVzLgorICAgICBTaW5jZSBib3RoIGlzIG5vdCBpbmNsdWRlZCBpbiBsd0lQLCBNU0NIQVAgY3VycmVudGx5IGRvZXMgbm90IHdvcmshICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2hwbXMuYyAtIE5ldHdvcmsgTWljcm9Tb2Z0IENoYWxsZW5nZSBIYW5kc2hha2UgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgcHJvZ3JhbSBmaWxlLgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgTWFyYyBCb3VjaGVyLCBTZXJ2aWNlcyBJbmZvcm1hdGlxdWVzIChNQlNJKSBpbmMuCisqIENvcHlyaWdodCAoYykgMTk5NyBieSBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKKyogYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAorKiB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMKKyogbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXJlIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSAKKyogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkCisqIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTICpBUyBJUyogQU5EIEFOWSBFWFBSRVNTIE9SCisqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUkVWSVNJT04gSElTVE9SWQorKgorKiAwMy0wMS0wMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyogICBQb3J0ZWQgdG8gbHdJUC4KKyogOTctMTItMDggR3V5IExhbmNhc3RlciA8bGFuY2FzdGVyZ0BhY20ub3JnPiwgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKiAgIE9yaWdpbmFsIGJhc2VkIG9uIEJTRCBjaGFwX21zLmMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjaGFwX21zLmMgLSBNaWNyb3NvZnQgTVMtQ0hBUCBjb21wYXRpYmxlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBFcmljIFJvc2VucXVpc3QsIFN0cmF0YSBTb2Z0d2FyZSBMaW1pdGVkLgorICogaHR0cDovL3d3dy5zdHJhdGF3YXJlLmNvbS8KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgRXJpYyBSb3NlbnF1aXN0LiAgVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8KKyAqIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworLyoKKyAqIE1vZGlmaWNhdGlvbnMgYnkgTGF1cmkgUGVzb25lbiAvIGxwZXNvbmVuQGNsaW5ldC5maSwgYXByaWwgMTk5NworICoKKyAqICAgSW1wbGVtZW50ZWQgTEFOTWFuYWdlciB0eXBlIHBhc3N3b3JkIHJlc3BvbnNlIHRvIE1TLUNIQVAgY2hhbGxlbmdlcy4KKyAqICAgTm93IHBwcGQgcHJvdmlkZXMgYm90aCBOVCBzdHlsZSBhbmQgTEFOTWFuIHN0eWxlIGJsb2NrcywgYW5kIHRoZQorICogICBwcmVmZXJlZCBpcyBzZXQgYnkgb3B0aW9uICJtcy1sYW5tYW4iLiBEZWZhdWx0IGlzIHRvIHVzZSBOVC4KKyAqICAgVGhlIGhhc2ggdGV4dCAoU3RkVGV4dCkgd2FzIHRha2VuIGZyb20gV2luOTUgUkFTQVBJMzIuRExMLgorICoKKyAqICAgWW91IHNob3VsZCBhbHNvIHVzZSBET01BSU5cXFVTRVJOQU1FIGFzIGRlc2NyaWJlZCBpbiBSRUFETUUuTVNDSEFQODAKKyAqLworCisjZGVmaW5lIFVTRV9DUllQVAorCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIFBQUF9TVVBQT1JUIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaWYgTVNDSEFQX1NVUFBPUlQgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJwcHAuaCIKKyNpbmNsdWRlICJwcHBkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWQ0LmgiCisjaWZuZGVmIFVTRV9DUllQVAorI2luY2x1ZGUgImRlcy5oIgorI2VuZGlmCisjaW5jbHVkZSAiY2hhcC5oIgorI2luY2x1ZGUgImNocG1zLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogTE9DQUwgREVGSU5JVElPTlMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogTE9DQUwgREFUQSBUWVBFUyAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVfY2hhciBMQU5NYW5SZXNwWzI0XTsKKyAgICB1X2NoYXIgTlRSZXNwWzI0XTsKKyAgICB1X2NoYXIgVXNlTlQ7IC8qIElmIDEsIGlnbm9yZSB0aGUgTEFOTWFuIHJlc3BvbnNlIGZpZWxkICovCit9IE1TX0NoYXBSZXNwb25zZTsKKy8qIFdlIHVzZSBNU19DSEFQX1JFU1BPTlNFX0xFTiwgcmF0aGVyIHRoYW4gc2l6ZW9mKE1TX0NoYXBSZXNwb25zZSksCisgICBpbiBjYXNlIHRoaXMgc3RydWN0IGdldHMgcGFkZGVkLiAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiBMT0NBTCBGVU5DVElPTiBERUNMQVJBVElPTlMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBYWFggRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhlc2UuICovCitleHRlcm4gdm9pZCBzZXRrZXkoY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIGVuY3J5cHQoY2hhciAqLCBpbnQpOworCitzdGF0aWMgdm9pZCBEZXNFbmNyeXB0ICh1X2NoYXIgKiwgdV9jaGFyICosIHVfY2hhciAqKTsKK3N0YXRpYyB2b2lkIE1ha2VLZXkgKHVfY2hhciAqLCB1X2NoYXIgKik7CisKKyNpZmRlZiBVU0VfQ1JZUFQKK3N0YXRpYyB2b2lkIEV4cGFuZCAodV9jaGFyICosIHVfY2hhciAqKTsKK3N0YXRpYyB2b2lkIENvbGxhcHNlICh1X2NoYXIgKiwgdV9jaGFyICopOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIENoYWxsZW5nZVJlc3BvbnNlKAorICB1X2NoYXIgKmNoYWxsZW5nZSwgLyogSU4gICA4IG9jdGV0cyAqLworICB1X2NoYXIgKnB3SGFzaCwgICAgLyogSU4gIDE2IG9jdGV0cyAqLworICB1X2NoYXIgKnJlc3BvbnNlICAgLyogT1VUIDI0IG9jdGV0cyAqLworKTsKK3N0YXRpYyB2b2lkIENoYXBNU19OVCgKKyAgY2hhciAqcmNoYWxsZW5nZSwKKyAgaW50IHJjaGFsbGVuZ2VfbGVuLAorICBjaGFyICpzZWNyZXQsCisgIGludCBzZWNyZXRfbGVuLAorICBNU19DaGFwUmVzcG9uc2UgKnJlc3BvbnNlCispOworc3RhdGljIHVfY2hhciBHZXQ3Qml0cygKKyAgdV9jaGFyICppbnB1dCwKKyAgaW50IHN0YXJ0Qml0CispOworCitzdGF0aWMgdm9pZAorQ2hhbGxlbmdlUmVzcG9uc2UoIHVfY2hhciAqY2hhbGxlbmdlLCAvKiBJTiAgIDggb2N0ZXRzICovCisgICAgICAgICAgICAgICAgICAgdV9jaGFyICpwd0hhc2gsICAgIC8qIElOICAxNiBvY3RldHMgKi8KKyAgICAgICAgICAgICAgICAgICB1X2NoYXIgKnJlc3BvbnNlICAgLyogT1VUIDI0IG9jdGV0cyAqLykKK3sKKyAgdV9jaGFyICAgIFpQYXNzd29yZEhhc2hbMjFdOworCisgIEJaRVJPKFpQYXNzd29yZEhhc2gsIHNpemVvZihaUGFzc3dvcmRIYXNoKSk7CisgIEJDT1BZKHB3SGFzaCwgWlBhc3N3b3JkSGFzaCwgMTYpOworCisjaWYgMAorICBsb2dfcGFja2V0KFpQYXNzd29yZEhhc2gsIHNpemVvZihaUGFzc3dvcmRIYXNoKSwgIkNoYWxsZW5nZVJlc3BvbnNlIC0gWlBhc3N3b3JkSGFzaCIsIExPR19ERUJVRyk7CisjZW5kaWYKKworICBEZXNFbmNyeXB0KGNoYWxsZW5nZSwgWlBhc3N3b3JkSGFzaCArICAwLCByZXNwb25zZSArIDApOworICBEZXNFbmNyeXB0KGNoYWxsZW5nZSwgWlBhc3N3b3JkSGFzaCArICA3LCByZXNwb25zZSArIDgpOworICBEZXNFbmNyeXB0KGNoYWxsZW5nZSwgWlBhc3N3b3JkSGFzaCArIDE0LCByZXNwb25zZSArIDE2KTsKKworI2lmIDAKKyAgbG9nX3BhY2tldChyZXNwb25zZSwgMjQsICJDaGFsbGVuZ2VSZXNwb25zZSAtIHJlc3BvbnNlIiwgTE9HX0RFQlVHKTsKKyNlbmRpZgorfQorCisKKyNpZmRlZiBVU0VfQ1JZUFQKK3N0YXRpYyB2b2lkCitEZXNFbmNyeXB0KCB1X2NoYXIgKmNsZWFyLCAvKiBJTiAgOCBvY3RldHMgKi8KKyAgICAgICAgICAgIHVfY2hhciAqa2V5LCAgIC8qIElOICA3IG9jdGV0cyAqLworICAgICAgICAgICAgdV9jaGFyICpjaXBoZXIgLyogT1VUIDggb2N0ZXRzICovKQoreworICB1X2NoYXIgZGVzX2tleVs4XTsKKyAgdV9jaGFyIGNyeXB0X2tleVs2Nl07CisgIHVfY2hhciBkZXNfaW5wdXRbNjZdOworCisgIE1ha2VLZXkoa2V5LCBkZXNfa2V5KTsKKworICBFeHBhbmQoZGVzX2tleSwgY3J5cHRfa2V5KTsKKyAgc2V0a2V5KChjaGFyKiljcnlwdF9rZXkpOworCisjaWYgMAorICBDSEFQREVCVUcoTE9HX0lORk8sICgiRGVzRW5jcnlwdDogOCBvY3RldCBpbnB1dCA6ICUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICAgIGNsZWFyWzBdLCBjbGVhclsxXSwgY2xlYXJbMl0sIGNsZWFyWzNdLCBjbGVhcls0XSwgY2xlYXJbNV0sIGNsZWFyWzZdLCBjbGVhcls3XSkpOworI2VuZGlmCisKKyAgRXhwYW5kKGNsZWFyLCBkZXNfaW5wdXQpOworICBlbmNyeXB0KChjaGFyKilkZXNfaW5wdXQsIDApOworICBDb2xsYXBzZShkZXNfaW5wdXQsIGNpcGhlcik7CisKKyNpZiAwCisgIENIQVBERUJVRyhMT0dfSU5GTywgKCJEZXNFbmNyeXB0OiA4IG9jdGV0IG91dHB1dDogJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCUwMlhcbiIsCisgICAgICAgICAgICAgY2lwaGVyWzBdLCBjaXBoZXJbMV0sIGNpcGhlclsyXSwgY2lwaGVyWzNdLCBjaXBoZXJbNF0sIGNpcGhlcls1XSwgY2lwaGVyWzZdLCBjaXBoZXJbN10pKTsKKyNlbmRpZgorfQorCisjZWxzZSAvKiBVU0VfQ1JZUFQgKi8KKworc3RhdGljIHZvaWQKK0Rlc0VuY3J5cHQoIHVfY2hhciAqY2xlYXIsIC8qIElOICA4IG9jdGV0cyAqLworICAgICAgICAgICAgdV9jaGFyICprZXksICAgLyogSU4gIDcgb2N0ZXRzICovCisgICAgICAgICAgICB1X2NoYXIgKmNpcGhlciAvKiBPVVQgOCBvY3RldHMgKi8pCit7CisgIGRlc19jYmxvY2sgICAgZGVzX2tleTsKKyAgZGVzX2tleV9zY2hlZHVsZSAga2V5X3NjaGVkdWxlOworCisgIE1ha2VLZXkoa2V5LCBkZXNfa2V5KTsKKworICBkZXNfc2V0X2tleSgmZGVzX2tleSwga2V5X3NjaGVkdWxlKTsKKworI2lmIDAKKyAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkRlc0VuY3J5cHQ6IDggb2N0ZXQgaW5wdXQgOiAlMDJYJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKKyAgICAgICAgICAgICBjbGVhclswXSwgY2xlYXJbMV0sIGNsZWFyWzJdLCBjbGVhclszXSwgY2xlYXJbNF0sIGNsZWFyWzVdLCBjbGVhcls2XSwgY2xlYXJbN10pKTsKKyNlbmRpZgorCisgIGRlc19lY2JfZW5jcnlwdCgoZGVzX2NibG9jayAqKWNsZWFyLCAoZGVzX2NibG9jayAqKWNpcGhlciwga2V5X3NjaGVkdWxlLCAxKTsKKworI2lmIDAKKyAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkRlc0VuY3J5cHQ6IDggb2N0ZXQgb3V0cHV0OiAlMDJYJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKKyAgICAgICAgICAgICBjaXBoZXJbMF0sIGNpcGhlclsxXSwgY2lwaGVyWzJdLCBjaXBoZXJbM10sIGNpcGhlcls0XSwgY2lwaGVyWzVdLCBjaXBoZXJbNl0sIGNpcGhlcls3XSkpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBVU0VfQ1JZUFQgKi8KKworCitzdGF0aWMgdV9jaGFyCitHZXQ3Qml0cyggdV9jaGFyICppbnB1dCwgaW50IHN0YXJ0Qml0KQoreworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgIHdvcmQ7CisKKyAgd29yZCAgPSAodW5zaWduZWQpaW5wdXRbc3RhcnRCaXQgLyA4XSA8PCA4OworICB3b3JkIHw9ICh1bnNpZ25lZClpbnB1dFtzdGFydEJpdCAvIDggKyAxXTsKKworICB3b3JkID4+PSAxNSAtIChzdGFydEJpdCAlIDggKyA3KTsKKworICByZXR1cm4gd29yZCAmIDB4RkU7Cit9CisKKyNpZmRlZiBVU0VfQ1JZUFQKKworLyogaW4gPT0gOC1ieXRlIHN0cmluZyAoZXhwYW5kZWQgdmVyc2lvbiBvZiB0aGUgNTYtYml0IGtleSkKKyAqIG91dCA9PSA2NC1ieXRlIHN0cmluZyB3aGVyZSBlYWNoIGJ5dGUgaXMgZWl0aGVyIDEgb3IgMAorICogTm90ZSB0aGF0IHRoZSBsb3ctb3JkZXIgImJpdCIgaXMgYWx3YXlzIGlnbm9yZWQgYnkgYnkgc2V0a2V5KCkKKyAqLworc3RhdGljIHZvaWQKK0V4cGFuZCh1X2NoYXIgKmluLCB1X2NoYXIgKm91dCkKK3sKKyAgaW50IGosIGM7CisgIGludCBpOworCisgIGZvcihpID0gMDsgaSA8IDY0OyBpbisrKXsKKyAgICBjID0gKmluOworICAgIGZvcihqID0gNzsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICpvdXQrKyA9IChjID4+IGopICYgMDE7CisgICAgfQorICAgIGkgKz0gODsKKyAgfQorfQorCisvKiBUaGUgaW52ZXJzZSBvZiBFeHBhbmQKKyAqLworc3RhdGljIHZvaWQKK0NvbGxhcHNlKHVfY2hhciAqaW4sIHVfY2hhciAqb3V0KQoreworICBpbnQgajsKKyAgaW50IGk7CisgIHVuc2lnbmVkIGludCBjOworCisgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSArPSA4LCBvdXQrKykgeworICAgIGMgPSAwOworICAgIGZvciAoaiA9IDc7IGogPj0gMDsgai0tLCBpbisrKSB7CisgICAgICBjIHw9ICppbiA8PCBqOworICAgIH0KKyAgICAqb3V0ID0gYyAmIDB4ZmY7CisgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorTWFrZUtleSggdV9jaGFyICprZXksICAgIC8qIElOICA1NiBiaXQgREVTIGtleSBtaXNzaW5nIHBhcml0eSBiaXRzICovCisgICAgICAgICB1X2NoYXIgKmRlc19rZXkgLyogT1VUIDY0IGJpdCBERVMga2V5IHdpdGggcGFyaXR5IGJpdHMgYWRkZWQgKi8pCit7CisgIGRlc19rZXlbMF0gPSBHZXQ3Qml0cyhrZXksICAwKTsKKyAgZGVzX2tleVsxXSA9IEdldDdCaXRzKGtleSwgIDcpOworICBkZXNfa2V5WzJdID0gR2V0N0JpdHMoa2V5LCAxNCk7CisgIGRlc19rZXlbM10gPSBHZXQ3Qml0cyhrZXksIDIxKTsKKyAgZGVzX2tleVs0XSA9IEdldDdCaXRzKGtleSwgMjgpOworICBkZXNfa2V5WzVdID0gR2V0N0JpdHMoa2V5LCAzNSk7CisgIGRlc19rZXlbNl0gPSBHZXQ3Qml0cyhrZXksIDQyKTsKKyAgZGVzX2tleVs3XSA9IEdldDdCaXRzKGtleSwgNDkpOworICAKKyNpZm5kZWYgVVNFX0NSWVBUCisgIGRlc19zZXRfb2RkX3Bhcml0eSgoZGVzX2NibG9jayAqKWRlc19rZXkpOworI2VuZGlmCisgIAorI2lmIDAKKyAgQ0hBUERFQlVHKExPR19JTkZPLCAoIk1ha2VLZXk6IDU2LWJpdCBpbnB1dCA6ICUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCUwMlhcbiIsCisgICAgICAgICAgICAga2V5WzBdLCBrZXlbMV0sIGtleVsyXSwga2V5WzNdLCBrZXlbNF0sIGtleVs1XSwga2V5WzZdKSk7CisgIENIQVBERUJVRyhMT0dfSU5GTywgKCJNYWtlS2V5OiA2NC1iaXQgb3V0cHV0OiAlMDJYJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKKyAgICAgICAgICAgICBkZXNfa2V5WzBdLCBkZXNfa2V5WzFdLCBkZXNfa2V5WzJdLCBkZXNfa2V5WzNdLCBkZXNfa2V5WzRdLCBkZXNfa2V5WzVdLCBkZXNfa2V5WzZdLCBkZXNfa2V5WzddKSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK0NoYXBNU19OVCggY2hhciAqcmNoYWxsZW5nZSwKKyAgICAgICAgICAgaW50IHJjaGFsbGVuZ2VfbGVuLAorICAgICAgICAgICBjaGFyICpzZWNyZXQsCisgICAgICAgICAgIGludCBzZWNyZXRfbGVuLAorICAgICAgICAgICBNU19DaGFwUmVzcG9uc2UgKnJlc3BvbnNlKQoreworICBpbnQgICAgICBpOworICBNRHN0cnVjdCAgbWQ0Q29udGV4dDsKKyAgdV9jaGFyICAgIHVuaWNvZGVQYXNzd29yZFtNQVhfTlRfUEFTU1dPUkQgKiAyXTsKKyAgc3RhdGljIGludCAgbG93X2J5dGVfZmlyc3QgPSAtMTsKKworICBMV0lQX1VOVVNFRF9BUkcocmNoYWxsZW5nZV9sZW4pOworCisgIC8qIEluaXRpYWxpemUgdGhlIFVuaWNvZGUgdmVyc2lvbiBvZiB0aGUgc2VjcmV0ICg9PSBwYXNzd29yZCkuICovCisgIC8qIFRoaXMgaW1wbGljaXRseSBzdXBwb3J0cyA4LWJpdCBJU084ODU5LzEgY2hhcmFjdGVycy4gKi8KKyAgQlpFUk8odW5pY29kZVBhc3N3b3JkLCBzaXplb2YodW5pY29kZVBhc3N3b3JkKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzZWNyZXRfbGVuOyBpKyspIHsKKyAgICB1bmljb2RlUGFzc3dvcmRbaSAqIDJdID0gKHVfY2hhcilzZWNyZXRbaV07CisgIH0KKyAgTURiZWdpbigmbWQ0Q29udGV4dCk7CisgIE1EdXBkYXRlKCZtZDRDb250ZXh0LCB1bmljb2RlUGFzc3dvcmQsIHNlY3JldF9sZW4gKiAyICogOCk7ICAvKiBVbmljb2RlIGlzIDIgYnl0ZXMvY2hhciwgKjggZm9yIGJpdCBjb3VudCAqLworCisgIGlmIChsb3dfYnl0ZV9maXJzdCA9PSAtMSkgeworICAgIGxvd19ieXRlX2ZpcnN0ID0gKFBQX0hUT05TKCh1bnNpZ25lZCBzaG9ydCBpbnQpMSkgIT0gMSk7CisgIH0KKyAgaWYgKGxvd19ieXRlX2ZpcnN0ID09IDApIHsKKyAgICAvKiBAdG9kbzogYXJnIHR5cGUgLSB1X2xvbmcqIG9yIHVfaW50KiA/ICovCisgICAgTURyZXZlcnNlKCh1bnNpZ25lZCBpbnQqKSZtZDRDb250ZXh0KTsgIC8qICBzZmIgOTYxMTA1ICovCisgIH0KKworICBNRHVwZGF0ZSgmbWQ0Q29udGV4dCwgTlVMTCwgMCk7ICAvKiBUZWxsIE1ENCB3ZSdyZSBkb25lICovCisKKyAgQ2hhbGxlbmdlUmVzcG9uc2UoKHVfY2hhciopcmNoYWxsZW5nZSwgKHVfY2hhciopbWQ0Q29udGV4dC5idWZmZXIsIHJlc3BvbnNlLT5OVFJlc3ApOworfQorCisjaWZkZWYgTVNMQU5NQU4KK3N0YXRpYyB1X2NoYXIgKlN0ZFRleHQgPSAodV9jaGFyICopIktHUyFAIyQlIjsgLyoga2V5IGZyb20gcmFzYXBpMzIuZGxsICovCisKK3N0YXRpYyB2b2lkCitDaGFwTVNfTEFOTWFuKCBjaGFyICpyY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgaW50IHJjaGFsbGVuZ2VfbGVuLAorICAgICAgICAgICAgICAgY2hhciAqc2VjcmV0LAorICAgICAgICAgICAgICAgaW50IHNlY3JldF9sZW4sCisgICAgICAgICAgICAgICBNU19DaGFwUmVzcG9uc2UgICpyZXNwb25zZSkKK3sKKyAgaW50ICAgICAgaTsKKyAgdV9jaGFyICAgIFVjYXNlUGFzc3dvcmRbTUFYX05UX1BBU1NXT1JEXTsgLyogbWF4IGlzIGFjdHVhbGx5IDE0ICovCisgIHVfY2hhciAgICBQYXNzd29yZEhhc2hbMTZdOworICAKKyAgLyogTEFOTWFuIHBhc3N3b3JkIGlzIGNhc2UgaW5zZW5zaXRpdmUgKi8KKyAgQlpFUk8oVWNhc2VQYXNzd29yZCwgc2l6ZW9mKFVjYXNlUGFzc3dvcmQpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNlY3JldF9sZW47IGkrKykgeworICAgIFVjYXNlUGFzc3dvcmRbaV0gPSAodV9jaGFyKXRvdXBwZXIoc2VjcmV0W2ldKTsKKyAgfQorICBEZXNFbmNyeXB0KCBTdGRUZXh0LCBVY2FzZVBhc3N3b3JkICsgMCwgUGFzc3dvcmRIYXNoICsgMCApOworICBEZXNFbmNyeXB0KCBTdGRUZXh0LCBVY2FzZVBhc3N3b3JkICsgNywgUGFzc3dvcmRIYXNoICsgOCApOworICBDaGFsbGVuZ2VSZXNwb25zZShyY2hhbGxlbmdlLCBQYXNzd29yZEhhc2gsIHJlc3BvbnNlLT5MQU5NYW5SZXNwKTsKK30KKyNlbmRpZgorCit2b2lkCitDaGFwTVMoIGNoYXBfc3RhdGUgKmNzdGF0ZSwgY2hhciAqcmNoYWxsZW5nZSwgaW50IHJjaGFsbGVuZ2VfbGVuLCBjaGFyICpzZWNyZXQsIGludCBzZWNyZXRfbGVuKQoreworICBNU19DaGFwUmVzcG9uc2UgcmVzcG9uc2U7CisjaWZkZWYgTVNMQU5NQU4KKyAgZXh0ZXJuIGludCBtc19sYW5tYW47CisjZW5kaWYKKworI2lmIDAKKyAgQ0hBUERFQlVHKExPR19JTkZPLCAoIkNoYXBNUzogc2VjcmV0IGlzICclLipzJ1xuIiwgc2VjcmV0X2xlbiwgc2VjcmV0KSk7CisjZW5kaWYKKyAgQlpFUk8oJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKworICAvKiBDYWxjdWxhdGUgYm90aCBhbHdheXMgKi8KKyAgQ2hhcE1TX05UKHJjaGFsbGVuZ2UsIHJjaGFsbGVuZ2VfbGVuLCBzZWNyZXQsIHNlY3JldF9sZW4sICZyZXNwb25zZSk7CisKKyNpZmRlZiBNU0xBTk1BTgorICBDaGFwTVNfTEFOTWFuKHJjaGFsbGVuZ2UsIHJjaGFsbGVuZ2VfbGVuLCBzZWNyZXQsIHNlY3JldF9sZW4sICZyZXNwb25zZSk7CisKKyAgLyogcHJlZmVyZWQgbWV0aG9kIGlzIHNldCBieSBvcHRpb24gICovCisgIHJlc3BvbnNlLlVzZU5UID0gIW1zX2xhbm1hbjsKKyNlbHNlCisgIHJlc3BvbnNlLlVzZU5UID0gMTsKKyNlbmRpZgorCisgIEJDT1BZKCZyZXNwb25zZSwgY3N0YXRlLT5yZXNwb25zZSwgTVNfQ0hBUF9SRVNQT05TRV9MRU4pOworICBjc3RhdGUtPnJlc3BfbGVuZ3RoID0gTVNfQ0hBUF9SRVNQT05TRV9MRU47Cit9CisKKyNlbmRpZiAvKiBNU0NIQVBfU1VQUE9SVCAqLworCisjZW5kaWYgLyogUFBQX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2NocG1zLmggYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9jaHBtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDcwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9jaHBtcy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjaHBtcy5oIC0gTmV0d29yayBNaWNyb3NvZnQgQ2hhbGxlbmdlIEhhbmRzaGFrZSBQcm90b2NvbCBoZWFkZXIgZmlsZS4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IE1hcmMgQm91Y2hlciwgU2VydmljZXMgSW5mb3JtYXRpcXVlcyAoTUJTSSkgaW5jLgorKiBwb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTggR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKgorKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKKyogYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAorKiB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMKKyogbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXJlIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSAKKyogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkCisqIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTICpBUyBJUyogQU5EIEFOWSBFWFBSRVNTIE9SCisqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUkVWSVNJT04gSElTVE9SWQorKgorKiAwMy0wMS0wMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyogICBQb3J0ZWQgdG8gbHdJUC4KKyogOTgtMDEtMzAgR3V5IExhbmNhc3RlciA8bGFuY2FzdGVyZ0BhY20ub3JnPiwgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKiAgIE9yaWdpbmFsIGJ1aWx0IGZyb20gQlNEIG5ldHdvcmsgY29kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjaGFwLmggLSBDaGFsbGVuZ2UgSGFuZHNoYWtlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBFcmljIFJvc2VucXVpc3QsIFN0cmF0YSBTb2Z0d2FyZSBMaW1pdGVkLgorICogaHR0cDovL3d3dy5zdHJhdGF3YXJlLmNvbS8KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgRXJpYyBSb3NlbnF1aXN0LiAgVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8KKyAqIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogJElkOiBjaHBtcy5oLHYgMS41IDIwMDcvMTIvMTkgMjA6NDc6MjMgZmJlcm5vbiBFeHAgJAorICovCisKKyNpZm5kZWYgQ0hQTVNfSAorI2RlZmluZSBDSFBNU19ICisKKyNkZWZpbmUgTUFYX05UX1BBU1NXT1JEIDI1NiAvKiBNYXhpbXVtIG51bWJlciBvZiAoVW5pY29kZSkgY2hhcnMgaW4gYW4gTlQgcGFzc3dvcmQgKi8KKwordm9pZCBDaGFwTVMgKGNoYXBfc3RhdGUgKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKKworI2VuZGlmIC8qIENIUE1TX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2ZzbS5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvZnNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3M2M1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2ZzbS5jCkBAIC0wLDAgKzEsODkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZnNtLmMgLSBOZXR3b3JrIENvbnRyb2wgUHJvdG9jb2wgRmluaXRlIFN0YXRlIE1hY2hpbmUgcHJvZ3JhbSBmaWxlLgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgTWFyYyBCb3VjaGVyLCBTZXJ2aWNlcyBJbmZvcm1hdGlxdWVzIChNQlNJKSBpbmMuCisqIHBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NyBieSBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqCisqIFRoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLAorKiBhbmQgbGljZW5zZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkCisqIHRoYXQgZXhpc3RpbmcgY29weXJpZ2h0IG5vdGljZXMgYXJlIHJldGFpbmVkIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcworKiBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBhcmUgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55IAorKiBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwgbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMgcmVxdWlyZWQKKyogZm9yIGFueSBvZiB0aGUgYXV0aG9yaXplZCB1c2VzLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT05UUklCVVRPUlMgKkFTIElTKiBBTkQgQU5ZIEVYUFJFU1MgT1IKKyogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAKKyogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSRVZJU0lPTiBISVNUT1JZCisqCisqIDAzLTAxLTAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorKiAgIFBvcnRlZCB0byBsd0lQLgorKiA5Ny0xMi0wMSBHdXkgTGFuY2FzdGVyIDxsYW5jYXN0ZXJnQGFjbS5vcmc+LCBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqICAgT3JpZ2luYWwgYmFzZWQgb24gQlNEIGZzbS5jLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZnNtLmMgLSB7TGluaywgSVB9IENvbnRyb2wgUHJvdG9jb2wgRmluaXRlIFN0YXRlIE1hY2hpbmUuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworLyoKKyAqIFRPRE86CisgKiBSYW5kb21pemUgZnNtIGlkIG9uIGxpbmsvaW5pdC4KKyAqIERlYWwgd2l0aCB2YXJpYWJsZSBvdXRnb2luZyBNVFUuCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBQUFBfU1VQUE9SVCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgInBwcC5oIgorI2luY2x1ZGUgInBwcGRlYnVnLmgiCisKKyNpbmNsdWRlICJmc20uaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgUFBQX0RFQlVHCitzdGF0aWMgY29uc3QgY2hhciAqcHBwZXJyX3N0cmVycltdID0geworICAgICAgICAgICAiTFNfSU5JVElBTCIsICAvKiBMU19JTklUSUFMICAwICovCisgICAgICAgICAgICJMU19TVEFSVElORyIsIC8qIExTX1NUQVJUSU5HIDEgKi8KKyAgICAgICAgICAgIkxTX0NMT1NFRCIsICAgLyogTFNfQ0xPU0VEICAgMiAqLworICAgICAgICAgICAiTFNfU1RPUFBFRCIsICAvKiBMU19TVE9QUEVEICAzICovCisgICAgICAgICAgICJMU19DTE9TSU5HIiwgIC8qIExTX0NMT1NJTkcgIDQgKi8KKyAgICAgICAgICAgIkxTX1NUT1BQSU5HIiwgLyogTFNfU1RPUFBJTkcgNSAqLworICAgICAgICAgICAiTFNfUkVRU0VOVCIsICAvKiBMU19SRVFTRU5UICA2ICovCisgICAgICAgICAgICJMU19BQ0tSQ1ZEIiwgIC8qIExTX0FDS1JDVkQgIDcgKi8KKyAgICAgICAgICAgIkxTX0FDS1NFTlQiLCAgLyogTFNfQUNLU0VOVCAgOCAqLworICAgICAgICAgICAiTFNfT1BFTkVEIiAgICAvKiBMU19PUEVORUQgICA5ICovCit9OworI2VuZGlmIC8qIFBQUF9ERUJVRyAqLworCitzdGF0aWMgdm9pZCBmc21fdGltZW91dCAodm9pZCAqKTsKK3N0YXRpYyB2b2lkIGZzbV9yY29uZnJlcSAoZnNtICosIHVfY2hhciwgdV9jaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBmc21fcmNvbmZhY2sgKGZzbSAqLCBpbnQsIHVfY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgZnNtX3Jjb25mbmFrcmVqIChmc20gKiwgaW50LCBpbnQsIHVfY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgZnNtX3J0ZXJtcmVxIChmc20gKiwgaW50LCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGZzbV9ydGVybWFjayAoZnNtICopOworc3RhdGljIHZvaWQgZnNtX3Jjb2RlcmVqIChmc20gKiwgdV9jaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBmc21fc2NvbmZyZXEgKGZzbSAqLCBpbnQpOworCisjZGVmaW5lIFBST1RPX05BTUUoZikgKChmKS0+Y2FsbGJhY2tzLT5wcm90b19uYW1lKQorCitpbnQgcGVlcl9tcnVbTlVNX1BQUF07CisKKworLyoKKyAqIGZzbV9pbml0IC0gSW5pdGlhbGl6ZSBmc20uCisgKgorICogSW5pdGlhbGl6ZSBmc20gc3RhdGUuCisgKi8KK3ZvaWQKK2ZzbV9pbml0KGZzbSAqZikKK3sKKyAgZi0+c3RhdGUgPSBMU19JTklUSUFMOworICBmLT5mbGFncyA9IDA7CisgIGYtPmlkID0gMDsgICAgICAgIC8qIFhYWCBTdGFydCB3aXRoIHJhbmRvbSBpZD8gKi8KKyAgZi0+dGltZW91dHRpbWUgPSBGU01fREVGVElNRU9VVDsKKyAgZi0+bWF4Y29uZnJlcXRyYW5zbWl0cyA9IEZTTV9ERUZNQVhDT05GUkVRUzsKKyAgZi0+bWF4dGVybXRyYW5zbWl0cyA9IEZTTV9ERUZNQVhURVJNUkVRUzsKKyAgZi0+bWF4bmFrbG9vcHMgPSBGU01fREVGTUFYTkFLTE9PUFM7CisgIGYtPnRlcm1fcmVhc29uX2xlbiA9IDA7Cit9CisKKworLyoKKyAqIGZzbV9sb3dlcnVwIC0gVGhlIGxvd2VyIGxheWVyIGlzIHVwLgorICovCit2b2lkCitmc21fbG93ZXJ1cChmc20gKmYpCit7CisgIGludCBvbGRTdGF0ZSA9IGYtPnN0YXRlOworCisgIExXSVBfVU5VU0VEX0FSRyhvbGRTdGF0ZSk7CisKKyAgc3dpdGNoKCBmLT5zdGF0ZSApIHsKKyAgICBjYXNlIExTX0lOSVRJQUw6CisgICAgICBmLT5zdGF0ZSA9IExTX0NMT1NFRDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMU19TVEFSVElORzoKKyAgICAgIGlmKCBmLT5mbGFncyAmIE9QVF9TSUxFTlQgKSB7CisgICAgICAgIGYtPnN0YXRlID0gTFNfU1RPUFBFRDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNlbmQgYW4gaW5pdGlhbCBjb25maWd1cmUtcmVxdWVzdCAqLworICAgICAgICBmc21fc2NvbmZyZXEoZiwgMCk7CisgICAgICAgIGYtPnN0YXRlID0gTFNfUkVRU0VOVDsKKyAgICAgIH0KKyAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBGU01ERUJVRyhMT0dfSU5GTywgKCIlczogVXAgZXZlbnQgaW4gc3RhdGUgJWQgKCVzKSFcbiIsCisgICAgICAgICAgUFJPVE9fTkFNRShmKSwgZi0+c3RhdGUsIHBwcGVycl9zdHJlcnJbZi0+c3RhdGVdKSk7CisgIH0KKworICBGU01ERUJVRyhMT0dfSU5GTywgKCIlczogbG93ZXJ1cCBzdGF0ZSAlZCAoJXMpIC0+ICVkICglcylcbiIsCisgICAgICBQUk9UT19OQU1FKGYpLCBvbGRTdGF0ZSwgcHBwZXJyX3N0cmVycltvbGRTdGF0ZV0sIGYtPnN0YXRlLCBwcHBlcnJfc3RyZXJyW2YtPnN0YXRlXSkpOworfQorCisKKy8qCisgKiBmc21fbG93ZXJkb3duIC0gVGhlIGxvd2VyIGxheWVyIGlzIGRvd24uCisgKgorICogQ2FuY2VsIGFsbCB0aW1lb3V0cyBhbmQgaW5mb3JtIHVwcGVyIGxheWVycy4KKyAqLwordm9pZAorZnNtX2xvd2VyZG93bihmc20gKmYpCit7CisgIGludCBvbGRTdGF0ZSA9IGYtPnN0YXRlOworCisgIExXSVBfVU5VU0VEX0FSRyhvbGRTdGF0ZSk7CisKKyAgc3dpdGNoKCBmLT5zdGF0ZSApIHsKKyAgICBjYXNlIExTX0NMT1NFRDoKKyAgICAgIGYtPnN0YXRlID0gTFNfSU5JVElBTDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMU19TVE9QUEVEOgorICAgICAgZi0+c3RhdGUgPSBMU19TVEFSVElORzsKKyAgICAgIGlmKCBmLT5jYWxsYmFja3MtPnN0YXJ0aW5nICkgeworICAgICAgICAoKmYtPmNhbGxiYWNrcy0+c3RhcnRpbmcpKGYpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExTX0NMT1NJTkc6CisgICAgICBmLT5zdGF0ZSA9IExTX0lOSVRJQUw7CisgICAgICBVTlRJTUVPVVQoZnNtX3RpbWVvdXQsIGYpOyAgLyogQ2FuY2VsIHRpbWVvdXQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMU19TVE9QUElORzoKKyAgICBjYXNlIExTX1JFUVNFTlQ6CisgICAgY2FzZSBMU19BQ0tSQ1ZEOgorICAgIGNhc2UgTFNfQUNLU0VOVDoKKyAgICAgIGYtPnN0YXRlID0gTFNfU1RBUlRJTkc7CisgICAgICBVTlRJTUVPVVQoZnNtX3RpbWVvdXQsIGYpOyAgLyogQ2FuY2VsIHRpbWVvdXQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMU19PUEVORUQ6CisgICAgICBpZiggZi0+Y2FsbGJhY2tzLT5kb3duICkgeworICAgICAgICAoKmYtPmNhbGxiYWNrcy0+ZG93bikoZik7CisgICAgICB9CisgICAgICBmLT5zdGF0ZSA9IExTX1NUQVJUSU5HOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgRlNNREVCVUcoTE9HX0lORk8sICgiJXM6IERvd24gZXZlbnQgaW4gc3RhdGUgJWQgKCVzKSFcbiIsCisgICAgICAgICAgUFJPVE9fTkFNRShmKSwgZi0+c3RhdGUsIHBwcGVycl9zdHJlcnJbZi0+c3RhdGVdKSk7CisgIH0KKworICBGU01ERUJVRyhMT0dfSU5GTywgKCIlczogbG93ZXJkb3duIHN0YXRlICVkICglcykgLT4gJWQgKCVzKVxuIiwKKyAgICAgIFBST1RPX05BTUUoZiksIG9sZFN0YXRlLCBwcHBlcnJfc3RyZXJyW29sZFN0YXRlXSwgZi0+c3RhdGUsIHBwcGVycl9zdHJlcnJbZi0+c3RhdGVdKSk7Cit9CisKKworLyoKKyAqIGZzbV9vcGVuIC0gTGluayBpcyBhbGxvd2VkIHRvIGNvbWUgdXAuCisgKi8KK3ZvaWQKK2ZzbV9vcGVuKGZzbSAqZikKK3sKKyAgaW50IG9sZFN0YXRlID0gZi0+c3RhdGU7CisKKyAgTFdJUF9VTlVTRURfQVJHKG9sZFN0YXRlKTsKKworICBzd2l0Y2goIGYtPnN0YXRlICkgeworICAgIGNhc2UgTFNfSU5JVElBTDoKKyAgICAgIGYtPnN0YXRlID0gTFNfU1RBUlRJTkc7CisgICAgICBpZiggZi0+Y2FsbGJhY2tzLT5zdGFydGluZyApIHsKKyAgICAgICAgKCpmLT5jYWxsYmFja3MtPnN0YXJ0aW5nKShmKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMU19DTE9TRUQ6CisgICAgICBpZiggZi0+ZmxhZ3MgJiBPUFRfU0lMRU5UICkgeworICAgICAgICBmLT5zdGF0ZSA9IExTX1NUT1BQRUQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBTZW5kIGFuIGluaXRpYWwgY29uZmlndXJlLXJlcXVlc3QgKi8KKyAgICAgICAgZnNtX3Njb25mcmVxKGYsIDApOworICAgICAgICBmLT5zdGF0ZSA9IExTX1JFUVNFTlQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgCisgICAgY2FzZSBMU19DTE9TSU5HOgorICAgICAgZi0+c3RhdGUgPSBMU19TVE9QUElORzsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgTFNfU1RPUFBFRDoKKyAgICBjYXNlIExTX09QRU5FRDoKKyAgICAgIGlmKCBmLT5mbGFncyAmIE9QVF9SRVNUQVJUICkgeworICAgICAgICBmc21fbG93ZXJkb3duKGYpOworICAgICAgICBmc21fbG93ZXJ1cChmKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKKyAgRlNNREVCVUcoTE9HX0lORk8sICgiJXM6IG9wZW4gc3RhdGUgJWQgKCVzKSAtPiAlZCAoJXMpXG4iLAorICAgICAgUFJPVE9fTkFNRShmKSwgb2xkU3RhdGUsIHBwcGVycl9zdHJlcnJbb2xkU3RhdGVdLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKK30KKworI2lmIDAgLyogYmFja3BvcnQgcHBwZCAyLjQuNGIxOyAqLworLyoKKyAqIHRlcm1pbmF0ZV9sYXllciAtIFN0YXJ0IHByb2Nlc3Mgb2Ygc2h1dHRpbmcgZG93biB0aGUgRlNNCisgKgorICogQ2FuY2VsIGFueSB0aW1lb3V0IHJ1bm5pbmcsIG5vdGlmeSB1cHBlciBsYXllcnMgd2UncmUgZG9uZSwgYW5kCisgKiBzZW5kIGEgdGVybWluYXRlLXJlcXVlc3QgbWVzc2FnZSBhcyBjb25maWd1cmVkLgorICovCitzdGF0aWMgdm9pZAordGVybWluYXRlX2xheWVyKGZzbSAqZiwgaW50IG5leHRzdGF0ZSkKK3sKKyAgLyogQHRvZG8gKi8KK30KKyNlbmRpZgorCisvKgorICogZnNtX2Nsb3NlIC0gU3RhcnQgY2xvc2luZyBjb25uZWN0aW9uLgorICoKKyAqIENhbmNlbCB0aW1lb3V0cyBhbmQgZWl0aGVyIGluaXRpYXRlIGNsb3NlIG9yIHBvc3NpYmx5IGdvIGRpcmVjdGx5IHRvCisgKiB0aGUgTFNfQ0xPU0VEIHN0YXRlLgorICovCit2b2lkCitmc21fY2xvc2UoZnNtICpmLCBjaGFyICpyZWFzb24pCit7CisgIGludCBvbGRTdGF0ZSA9IGYtPnN0YXRlOworCisgIExXSVBfVU5VU0VEX0FSRyhvbGRTdGF0ZSk7CisKKyAgZi0+dGVybV9yZWFzb24gPSByZWFzb247CisgIGYtPnRlcm1fcmVhc29uX2xlbiA9IChyZWFzb24gPT0gTlVMTCA/IDAgOiAoaW50KXN0cmxlbihyZWFzb24pKTsKKyAgc3dpdGNoKCBmLT5zdGF0ZSApIHsKKyAgICBjYXNlIExTX1NUQVJUSU5HOgorICAgICAgZi0+c3RhdGUgPSBMU19JTklUSUFMOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMU19TVE9QUEVEOgorICAgICAgZi0+c3RhdGUgPSBMU19DTE9TRUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIExTX1NUT1BQSU5HOgorICAgICAgZi0+c3RhdGUgPSBMU19DTE9TSU5HOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExTX1JFUVNFTlQ6CisgICAgY2FzZSBMU19BQ0tSQ1ZEOgorICAgIGNhc2UgTFNfQUNLU0VOVDoKKyAgICBjYXNlIExTX09QRU5FRDoKKyAgICAgIGlmKCBmLT5zdGF0ZSAhPSBMU19PUEVORUQgKSB7CisgICAgICAgIFVOVElNRU9VVChmc21fdGltZW91dCwgZik7ICAvKiBDYW5jZWwgdGltZW91dCAqLworICAgICAgfSBlbHNlIGlmKCBmLT5jYWxsYmFja3MtPmRvd24gKSB7CisgICAgICAgICgqZi0+Y2FsbGJhY2tzLT5kb3duKShmKTsgIC8qIEluZm9ybSB1cHBlciBsYXllcnMgd2UncmUgZG93biAqLworICAgICAgfQorICAgICAgLyogSW5pdCByZXN0YXJ0IGNvdW50ZXIsIHNlbmQgVGVybWluYXRlLVJlcXVlc3QgKi8KKyAgICAgIGYtPnJldHJhbnNtaXRzID0gZi0+bWF4dGVybXRyYW5zbWl0czsKKyAgICAgIGZzbV9zZGF0YShmLCBURVJNUkVRLCBmLT5yZXFpZCA9ICsrZi0+aWQsCisgICAgICAgICAgICAodV9jaGFyICopIGYtPnRlcm1fcmVhc29uLCBmLT50ZXJtX3JlYXNvbl9sZW4pOworICAgICAgVElNRU9VVChmc21fdGltZW91dCwgZiwgZi0+dGltZW91dHRpbWUpOworICAgICAgLS1mLT5yZXRyYW5zbWl0czsKKworICAgICAgZi0+c3RhdGUgPSBMU19DTE9TSU5HOworICAgICAgYnJlYWs7CisgIH0KKworICBGU01ERUJVRyhMT0dfSU5GTywgKCIlczogY2xvc2UgcmVhc29uPSVzIHN0YXRlICVkICglcykgLT4gJWQgKCVzKVxuIiwKKyAgICAgIFBST1RPX05BTUUoZiksIHJlYXNvbiwgb2xkU3RhdGUsIHBwcGVycl9zdHJlcnJbb2xkU3RhdGVdLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKK30KKworCisvKgorICogZnNtX3RpbWVvdXQgLSBUaW1lb3V0IGV4cGlyZWQuCisgKi8KK3N0YXRpYyB2b2lkCitmc21fdGltZW91dCh2b2lkICphcmcpCit7CisgIGZzbSAqZiA9IChmc20gKikgYXJnOworCisgIHN3aXRjaCAoZi0+c3RhdGUpIHsKKyAgICBjYXNlIExTX0NMT1NJTkc6CisgICAgY2FzZSBMU19TVE9QUElORzoKKyAgICAgIGlmKCBmLT5yZXRyYW5zbWl0cyA8PSAwICkgeworICAgICAgICBGU01ERUJVRyhMT0dfV0FSTklORywgKCIlczogdGltZW91dCBzZW5kaW5nIFRlcm1pbmF0ZS1SZXF1ZXN0IHN0YXRlPSVkICglcylcbiIsCisgICAgICAgICAgICAgUFJPVE9fTkFNRShmKSwgZi0+c3RhdGUsIHBwcGVycl9zdHJlcnJbZi0+c3RhdGVdKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFdlJ3ZlIHdhaXRlZCBmb3IgYW4gYWNrIGxvbmcgZW5vdWdoLiAgUGVlciBwcm9iYWJseSBoZWFyZCB1cy4KKyAgICAgICAgICovCisgICAgICAgIGYtPnN0YXRlID0gKGYtPnN0YXRlID09IExTX0NMT1NJTkcpPyBMU19DTE9TRUQ6IExTX1NUT1BQRUQ7CisgICAgICAgIGlmKCBmLT5jYWxsYmFja3MtPmZpbmlzaGVkICkgeworICAgICAgICAgICgqZi0+Y2FsbGJhY2tzLT5maW5pc2hlZCkoZik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZTTURFQlVHKExPR19XQVJOSU5HLCAoIiVzOiB0aW1lb3V0IHJlc2VuZGluZyBUZXJtaW5hdGUtUmVxdWVzdHMgc3RhdGU9JWQgKCVzKVxuIiwKKyAgICAgICAgICAgICBQUk9UT19OQU1FKGYpLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKKyAgICAgICAgLyogU2VuZCBUZXJtaW5hdGUtUmVxdWVzdCAqLworICAgICAgICBmc21fc2RhdGEoZiwgVEVSTVJFUSwgZi0+cmVxaWQgPSArK2YtPmlkLAorICAgICAgICAgICAgKHVfY2hhciAqKSBmLT50ZXJtX3JlYXNvbiwgZi0+dGVybV9yZWFzb25fbGVuKTsKKyAgICAgICAgVElNRU9VVChmc21fdGltZW91dCwgZiwgZi0+dGltZW91dHRpbWUpOworICAgICAgICAtLWYtPnJldHJhbnNtaXRzOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExTX1JFUVNFTlQ6CisgICAgY2FzZSBMU19BQ0tSQ1ZEOgorICAgIGNhc2UgTFNfQUNLU0VOVDoKKyAgICAgIGlmIChmLT5yZXRyYW5zbWl0cyA8PSAwKSB7CisgICAgICAgIEZTTURFQlVHKExPR19XQVJOSU5HLCAoIiVzOiB0aW1lb3V0IHNlbmRpbmcgQ29uZmlnLVJlcXVlc3RzIHN0YXRlPSVkICglcylcbiIsCisgICAgICAgICBQUk9UT19OQU1FKGYpLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKKyAgICAgICAgZi0+c3RhdGUgPSBMU19TVE9QUEVEOworICAgICAgICBpZiggKGYtPmZsYWdzICYgT1BUX1BBU1NJVkUpID09IDAgJiYgZi0+Y2FsbGJhY2tzLT5maW5pc2hlZCApIHsKKyAgICAgICAgICAoKmYtPmNhbGxiYWNrcy0+ZmluaXNoZWQpKGYpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBGU01ERUJVRyhMT0dfV0FSTklORywgKCIlczogdGltZW91dCByZXNlbmRpbmcgQ29uZmlnLVJlcXVlc3Qgc3RhdGU9JWQgKCVzKVxuIiwKKyAgICAgICAgIFBST1RPX05BTUUoZiksIGYtPnN0YXRlLCBwcHBlcnJfc3RyZXJyW2YtPnN0YXRlXSkpOworICAgICAgICAvKiBSZXRyYW5zbWl0IHRoZSBjb25maWd1cmUtcmVxdWVzdCAqLworICAgICAgICBpZiAoZi0+Y2FsbGJhY2tzLT5yZXRyYW5zbWl0KSB7CisgICAgICAgICAgKCpmLT5jYWxsYmFja3MtPnJldHJhbnNtaXQpKGYpOworICAgICAgICB9CisgICAgICAgIGZzbV9zY29uZnJlcShmLCAxKTsgICAgLyogUmUtc2VuZCBDb25maWd1cmUtUmVxdWVzdCAqLworICAgICAgICBpZiggZi0+c3RhdGUgPT0gTFNfQUNLUkNWRCApIHsKKyAgICAgICAgICBmLT5zdGF0ZSA9IExTX1JFUVNFTlQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEZTTURFQlVHKExPR19JTkZPLCAoIiVzOiBVTkhBTkRMRUQgdGltZW91dCBldmVudCBpbiBzdGF0ZSAlZCAoJXMpIVxuIiwKKyAgICAgICAgICBQUk9UT19OQU1FKGYpLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKKyAgfQorfQorCisKKy8qCisgKiBmc21faW5wdXQgLSBJbnB1dCBwYWNrZXQuCisgKi8KK3ZvaWQKK2ZzbV9pbnB1dChmc20gKmYsIHVfY2hhciAqaW5wYWNrZXQsIGludCBsKQoreworICB1X2NoYXIgKmlucCA9IGlucGFja2V0OworICB1X2NoYXIgY29kZSwgaWQ7CisgIGludCBsZW47CisKKyAgLyoKKyAgKiBQYXJzZSBoZWFkZXIgKGNvZGUsIGlkIGFuZCBsZW5ndGgpLgorICAqIElmIHBhY2tldCB0b28gc2hvcnQsIGRyb3AgaXQuCisgICovCisgIGlmIChsIDwgSEVBREVSTEVOKSB7CisgICAgRlNNREVCVUcoTE9HX1dBUk5JTkcsICgiZnNtX2lucHV0KCV4KTogUmN2ZCBzaG9ydCBoZWFkZXIuXG4iLAorICAgICAgICAgIGYtPnByb3RvY29sKSk7CisgICAgcmV0dXJuOworICB9CisgIEdFVENIQVIoY29kZSwgaW5wKTsKKyAgR0VUQ0hBUihpZCwgaW5wKTsKKyAgR0VUU0hPUlQobGVuLCBpbnApOworICBpZiAobGVuIDwgSEVBREVSTEVOKSB7CisgICAgRlNNREVCVUcoTE9HX0lORk8sICgiZnNtX2lucHV0KCV4KTogUmN2ZCBpbGxlZ2FsIGxlbmd0aC5cbiIsCisgICAgICAgIGYtPnByb3RvY29sKSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChsZW4gPiBsKSB7CisgICAgRlNNREVCVUcoTE9HX0lORk8sICgiZnNtX2lucHV0KCV4KTogUmN2ZCBzaG9ydCBwYWNrZXQuXG4iLAorICAgICAgICBmLT5wcm90b2NvbCkpOworICAgIHJldHVybjsKKyAgfQorICBsZW4gLT0gSEVBREVSTEVOOyAgICAvKiBzdWJ0cmFjdCBoZWFkZXIgbGVuZ3RoICovCisKKyAgaWYoIGYtPnN0YXRlID09IExTX0lOSVRJQUwgfHwgZi0+c3RhdGUgPT0gTFNfU1RBUlRJTkcgKSB7CisgICAgRlNNREVCVUcoTE9HX0lORk8sICgiZnNtX2lucHV0KCV4KTogUmN2ZCBwYWNrZXQgaW4gc3RhdGUgJWQgKCVzKS5cbiIsCisgICAgICAgIGYtPnByb3RvY29sLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKKyAgICByZXR1cm47CisgIH0KKyAgRlNNREVCVUcoTE9HX0lORk8sICgiZnNtX2lucHV0KCVzKTolZCwlZCwlZFxuIiwgUFJPVE9fTkFNRShmKSwgY29kZSwgaWQsIGwpKTsKKyAgLyoKKyAgICogQWN0aW9uIGRlcGVuZHMgb24gY29kZS4KKyAgICovCisgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgQ09ORlJFUToKKyAgICAgIGZzbV9yY29uZnJlcShmLCBpZCwgaW5wLCBsZW4pOworICAgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBDT05GQUNLOgorICAgICAgZnNtX3Jjb25mYWNrKGYsIGlkLCBpbnAsIGxlbik7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIENPTkZOQUs6CisgICAgY2FzZSBDT05GUkVKOgorICAgICAgZnNtX3Jjb25mbmFrcmVqKGYsIGNvZGUsIGlkLCBpbnAsIGxlbik7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIFRFUk1SRVE6CisgICAgICBmc21fcnRlcm1yZXEoZiwgaWQsIGlucCwgbGVuKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgVEVSTUFDSzoKKyAgICAgIGZzbV9ydGVybWFjayhmKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgQ09ERVJFSjoKKyAgICAgIGZzbV9yY29kZXJlaihmLCBpbnAsIGxlbik7CisgICAgICBicmVhazsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgICAgRlNNREVCVUcoTE9HX0lORk8sICgiZnNtX2lucHV0KCVzKTogZGVmYXVsdDogXG4iLCBQUk9UT19OQU1FKGYpKSk7CisgICAgICBpZiggIWYtPmNhbGxiYWNrcy0+ZXh0Y29kZSB8fAorICAgICAgICAgICEoKmYtPmNhbGxiYWNrcy0+ZXh0Y29kZSkoZiwgY29kZSwgaWQsIGlucCwgbGVuKSApIHsKKyAgICAgICAgZnNtX3NkYXRhKGYsIENPREVSRUosICsrZi0+aWQsIGlucGFja2V0LCBsZW4gKyBIRUFERVJMRU4pOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogZnNtX3Jjb25mcmVxIC0gUmVjZWl2ZSBDb25maWd1cmUtUmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQKK2ZzbV9yY29uZnJlcShmc20gKmYsIHVfY2hhciBpZCwgdV9jaGFyICppbnAsIGludCBsZW4pCit7CisgIGludCBjb2RlLCByZWplY3RfaWZfZGlzYWdyZWU7CisKKyAgRlNNREVCVUcoTE9HX0lORk8sICgiZnNtX3Jjb25mcmVxKCVzKTogUmN2ZCBpZCAlZCBzdGF0ZT0lZCAoJXMpXG4iLCAKKyAgICAgICAgUFJPVE9fTkFNRShmKSwgaWQsIGYtPnN0YXRlLCBwcHBlcnJfc3RyZXJyW2YtPnN0YXRlXSkpOworICBzd2l0Y2goIGYtPnN0YXRlICkgeworICAgIGNhc2UgTFNfQ0xPU0VEOgorICAgICAgLyogR28gYXdheSwgd2UncmUgY2xvc2VkICovCisgICAgICBmc21fc2RhdGEoZiwgVEVSTUFDSywgaWQsIE5VTEwsIDApOworICAgICAgcmV0dXJuOworICAgIGNhc2UgTFNfQ0xPU0lORzoKKyAgICBjYXNlIExTX1NUT1BQSU5HOgorICAgICAgcmV0dXJuOworCisgICAgY2FzZSBMU19PUEVORUQ6CisgICAgICAvKiBHbyBkb3duIGFuZCByZXN0YXJ0IG5lZ290aWF0aW9uICovCisgICAgICBpZiggZi0+Y2FsbGJhY2tzLT5kb3duICkgeworICAgICAgICAoKmYtPmNhbGxiYWNrcy0+ZG93bikoZik7ICAvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzICovCisgICAgICB9CisgICAgICBmc21fc2NvbmZyZXEoZiwgMCk7ICAgIC8qIFNlbmQgaW5pdGlhbCBDb25maWd1cmUtUmVxdWVzdCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExTX1NUT1BQRUQ6CisgICAgICAvKiBOZWdvdGlhdGlvbiBzdGFydGVkIGJ5IG91ciBwZWVyICovCisgICAgICBmc21fc2NvbmZyZXEoZiwgMCk7ICAgIC8qIFNlbmQgaW5pdGlhbCBDb25maWd1cmUtUmVxdWVzdCAqLworICAgICAgZi0+c3RhdGUgPSBMU19SRVFTRU5UOworICAgICAgYnJlYWs7CisgIH0KKyAgCisgIC8qCisgICogUGFzcyB0aGUgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICAqIHRvIHByb3RvY29sLXNwZWNpZmljIGNvZGUgZm9yIGNoZWNraW5nLgorICAqLworICBpZiAoZi0+Y2FsbGJhY2tzLT5yZXFjaSkgeyAgICAvKiBDaGVjayBDSSAqLworICAgIHJlamVjdF9pZl9kaXNhZ3JlZSA9IChmLT5uYWtsb29wcyA+PSBmLT5tYXhuYWtsb29wcyk7CisgICAgY29kZSA9ICgqZi0+Y2FsbGJhY2tzLT5yZXFjaSkoZiwgaW5wLCAmbGVuLCByZWplY3RfaWZfZGlzYWdyZWUpOworICB9IGVsc2UgaWYgKGxlbikgeworICAgIGNvZGUgPSBDT05GUkVKOyAgICAgIC8qIFJlamVjdCBhbGwgQ0kgKi8KKyAgfSBlbHNlIHsKKyAgICBjb2RlID0gQ09ORkFDSzsKKyAgfQorICAKKyAgLyogc2VuZCB0aGUgQWNrLCBOYWsgb3IgUmVqIHRvIHRoZSBwZWVyICovCisgIGZzbV9zZGF0YShmLCAodV9jaGFyKWNvZGUsIGlkLCBpbnAsIGxlbik7CisgIAorICBpZiAoY29kZSA9PSBDT05GQUNLKSB7CisgICAgaWYgKGYtPnN0YXRlID09IExTX0FDS1JDVkQpIHsKKyAgICAgIFVOVElNRU9VVChmc21fdGltZW91dCwgZik7ICAvKiBDYW5jZWwgdGltZW91dCAqLworICAgICAgZi0+c3RhdGUgPSBMU19PUEVORUQ7CisgICAgICBpZiAoZi0+Y2FsbGJhY2tzLT51cCkgeworICAgICAgICAoKmYtPmNhbGxiYWNrcy0+dXApKGYpOyAgLyogSW5mb3JtIHVwcGVyIGxheWVycyAqLworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmLT5zdGF0ZSA9IExTX0FDS1NFTlQ7CisgICAgfQorICAgIGYtPm5ha2xvb3BzID0gMDsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBzZW50IENPTkZBQ0sgb3IgQ09ORlJFSiAqLworICAgIGlmIChmLT5zdGF0ZSAhPSBMU19BQ0tSQ1ZEKSB7CisgICAgICBmLT5zdGF0ZSA9IExTX1JFUVNFTlQ7CisgICAgfQorICAgIGlmKCBjb2RlID09IENPTkZOQUsgKSB7CisgICAgICArK2YtPm5ha2xvb3BzOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBmc21fcmNvbmZhY2sgLSBSZWNlaXZlIENvbmZpZ3VyZS1BY2suCisgKi8KK3N0YXRpYyB2b2lkCitmc21fcmNvbmZhY2soZnNtICpmLCBpbnQgaWQsIHVfY2hhciAqaW5wLCBpbnQgbGVuKQoreworICBGU01ERUJVRyhMT0dfSU5GTywgKCJmc21fcmNvbmZhY2soJXMpOiBSY3ZkIGlkICVkIHN0YXRlPSVkICglcylcbiIsCisgICAgICAgIFBST1RPX05BTUUoZiksIGlkLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKKyAgCisgIGlmIChpZCAhPSBmLT5yZXFpZCB8fCBmLT5zZWVuX2FjaykgeyAgIC8qIEV4cGVjdGVkIGlkPyAqLworICAgIHJldHVybjsgLyogTm9wZSwgdG9zcy4uLiAqLworICB9CisgIGlmKCAhKGYtPmNhbGxiYWNrcy0+YWNrY2k/ICgqZi0+Y2FsbGJhY2tzLT5hY2tjaSkoZiwgaW5wLCBsZW4pOiAobGVuID09IDApKSApIHsKKyAgICAvKiBBY2sgaXMgYmFkIC0gaWdub3JlIGl0ICovCisgICAgRlNNREVCVUcoTE9HX0lORk8sICgiJXM6IHJlY2VpdmVkIGJhZCBBY2sgKGxlbmd0aCAlZClcbiIsCisgICAgICAgICAgUFJPVE9fTkFNRShmKSwgbGVuKSk7CisgICAgcmV0dXJuOworICB9CisgIGYtPnNlZW5fYWNrID0gMTsKKyAgCisgIHN3aXRjaCAoZi0+c3RhdGUpIHsKKyAgICBjYXNlIExTX0NMT1NFRDoKKyAgICBjYXNlIExTX1NUT1BQRUQ6CisgICAgICBmc21fc2RhdGEoZiwgVEVSTUFDSywgKHVfY2hhcilpZCwgTlVMTCwgMCk7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIExTX1JFUVNFTlQ6CisgICAgICBmLT5zdGF0ZSA9IExTX0FDS1JDVkQ7CisgICAgICBmLT5yZXRyYW5zbWl0cyA9IGYtPm1heGNvbmZyZXF0cmFuc21pdHM7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIExTX0FDS1JDVkQ6CisgICAgICAvKiBIdWg/IGFuIGV4dHJhIHZhbGlkIEFjaz8gb2ggd2VsbC4uLiAqLworICAgICAgVU5USU1FT1VUKGZzbV90aW1lb3V0LCBmKTsgIC8qIENhbmNlbCB0aW1lb3V0ICovCisgICAgICBmc21fc2NvbmZyZXEoZiwgMCk7CisgICAgICBmLT5zdGF0ZSA9IExTX1JFUVNFTlQ7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIExTX0FDS1NFTlQ6CisgICAgICBVTlRJTUVPVVQoZnNtX3RpbWVvdXQsIGYpOyAgLyogQ2FuY2VsIHRpbWVvdXQgKi8KKyAgICAgIGYtPnN0YXRlID0gTFNfT1BFTkVEOworICAgICAgZi0+cmV0cmFuc21pdHMgPSBmLT5tYXhjb25mcmVxdHJhbnNtaXRzOworICAgICAgaWYgKGYtPmNhbGxiYWNrcy0+dXApIHsKKyAgICAgICAgKCpmLT5jYWxsYmFja3MtPnVwKShmKTsgIC8qIEluZm9ybSB1cHBlciBsYXllcnMgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgTFNfT1BFTkVEOgorICAgICAgLyogR28gZG93biBhbmQgcmVzdGFydCBuZWdvdGlhdGlvbiAqLworICAgICAgaWYgKGYtPmNhbGxiYWNrcy0+ZG93bikgeworICAgICAgICAoKmYtPmNhbGxiYWNrcy0+ZG93bikoZik7ICAvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzICovCisgICAgICB9CisgICAgICBmc21fc2NvbmZyZXEoZiwgMCk7ICAgIC8qIFNlbmQgaW5pdGlhbCBDb25maWd1cmUtUmVxdWVzdCAqLworICAgICAgZi0+c3RhdGUgPSBMU19SRVFTRU5UOworICAgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogZnNtX3Jjb25mbmFrcmVqIC0gUmVjZWl2ZSBDb25maWd1cmUtTmFrIG9yIENvbmZpZ3VyZS1SZWplY3QuCisgKi8KK3N0YXRpYyB2b2lkCitmc21fcmNvbmZuYWtyZWooZnNtICpmLCBpbnQgY29kZSwgaW50IGlkLCB1X2NoYXIgKmlucCwgaW50IGxlbikKK3sKKyAgaW50ICgqcHJvYykgKGZzbSAqLCB1X2NoYXIgKiwgaW50KTsKKyAgaW50IHJldDsKKworICBGU01ERUJVRyhMT0dfSU5GTywgKCJmc21fcmNvbmZuYWtyZWooJXMpOiBSY3ZkIGlkICVkIHN0YXRlPSVkICglcylcbiIsCisgICAgICAgIFBST1RPX05BTUUoZiksIGlkLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKKworICBpZiAoaWQgIT0gZi0+cmVxaWQgfHwgZi0+c2Vlbl9hY2spIHsgLyogRXhwZWN0ZWQgaWQ/ICovCisgICAgcmV0dXJuOyAgICAgICAgLyogTm9wZSwgdG9zcy4uLiAqLworICB9CisgIHByb2MgPSAoY29kZSA9PSBDT05GTkFLKT8gZi0+Y2FsbGJhY2tzLT5uYWtjaTogZi0+Y2FsbGJhY2tzLT5yZWpjaTsKKyAgaWYgKCFwcm9jIHx8ICEoKHJldCA9IHByb2MoZiwgaW5wLCBsZW4pKSkpIHsKKyAgICAvKiBOYWsvcmVqZWN0IGlzIGJhZCAtIGlnbm9yZSBpdCAqLworICAgIEZTTURFQlVHKExPR19JTkZPLCAoIiVzOiByZWNlaXZlZCBiYWQgJXMgKGxlbmd0aCAlZClcbiIsCisgICAgICAgICAgUFJPVE9fTkFNRShmKSwgKGNvZGU9PUNPTkZOQUs/ICJOYWsiOiAicmVqZWN0IiksIGxlbikpOworICAgIHJldHVybjsKKyAgfQorICBmLT5zZWVuX2FjayA9IDE7CisKKyAgc3dpdGNoIChmLT5zdGF0ZSkgeworICAgIGNhc2UgTFNfQ0xPU0VEOgorICAgIGNhc2UgTFNfU1RPUFBFRDoKKyAgICAgIGZzbV9zZGF0YShmLCBURVJNQUNLLCAodV9jaGFyKWlkLCBOVUxMLCAwKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgTFNfUkVRU0VOVDoKKyAgICBjYXNlIExTX0FDS1NFTlQ6CisgICAgICAvKiBUaGV5IGRpZG4ndCBhZ3JlZSB0byB3aGF0IHdlIHdhbnRlZCAtIHRyeSBhbm90aGVyIHJlcXVlc3QgKi8KKyAgICAgIFVOVElNRU9VVChmc21fdGltZW91dCwgZik7ICAvKiBDYW5jZWwgdGltZW91dCAqLworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZi0+c3RhdGUgPSBMU19TVE9QUEVEOyAgICAvKiBrbHVkZ2UgZm9yIHN0b3BwaW5nIENDUCAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnNtX3Njb25mcmVxKGYsIDApOyAgICAvKiBTZW5kIENvbmZpZ3VyZS1SZXF1ZXN0ICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIExTX0FDS1JDVkQ6CisgICAgICAvKiBHb3QgYSBOYWsvcmVqZWN0IHdoZW4gd2UgaGFkIGFscmVhZHkgaGFkIGFuIEFjaz8/IG9oIHdlbGwuLi4gKi8KKyAgICAgIFVOVElNRU9VVChmc21fdGltZW91dCwgZik7ICAvKiBDYW5jZWwgdGltZW91dCAqLworICAgICAgZnNtX3Njb25mcmVxKGYsIDApOworICAgICAgZi0+c3RhdGUgPSBMU19SRVFTRU5UOworICAgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBMU19PUEVORUQ6CisgICAgICAvKiBHbyBkb3duIGFuZCByZXN0YXJ0IG5lZ290aWF0aW9uICovCisgICAgICBpZiAoZi0+Y2FsbGJhY2tzLT5kb3duKSB7CisgICAgICAgICgqZi0+Y2FsbGJhY2tzLT5kb3duKShmKTsgIC8qIEluZm9ybSB1cHBlciBsYXllcnMgKi8KKyAgICAgIH0KKyAgICAgIGZzbV9zY29uZnJlcShmLCAwKTsgICAgLyogU2VuZCBpbml0aWFsIENvbmZpZ3VyZS1SZXF1ZXN0ICovCisgICAgICBmLT5zdGF0ZSA9IExTX1JFUVNFTlQ7CisgICAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBmc21fcnRlcm1yZXEgLSBSZWNlaXZlIFRlcm1pbmF0ZS1SZXEuCisgKi8KK3N0YXRpYyB2b2lkCitmc21fcnRlcm1yZXEoZnNtICpmLCBpbnQgaWQsIHVfY2hhciAqcCwgaW50IGxlbikKK3sKKyAgTFdJUF9VTlVTRURfQVJHKHApOworCisgIEZTTURFQlVHKExPR19JTkZPLCAoImZzbV9ydGVybXJlcSglcyk6IFJjdmQgaWQgJWQgc3RhdGU9JWQgKCVzKVxuIiwKKyAgICAgICAgUFJPVE9fTkFNRShmKSwgaWQsIGYtPnN0YXRlLCBwcHBlcnJfc3RyZXJyW2YtPnN0YXRlXSkpOworCisgIHN3aXRjaCAoZi0+c3RhdGUpIHsKKyAgICBjYXNlIExTX0FDS1JDVkQ6CisgICAgY2FzZSBMU19BQ0tTRU5UOgorICAgICAgZi0+c3RhdGUgPSBMU19SRVFTRU5UOyAgICAvKiBTdGFydCBvdmVyIGJ1dCBrZWVwIHRyeWluZyAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExTX09QRU5FRDoKKyAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIEZTTURFQlVHKExPR19JTkZPLCAoIiVzIHRlcm1pbmF0ZWQgYnkgcGVlciAoJXApXG4iLCBQUk9UT19OQU1FKGYpLCBwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGU01ERUJVRyhMT0dfSU5GTywgKCIlcyB0ZXJtaW5hdGVkIGJ5IHBlZXJcbiIsIFBST1RPX05BTUUoZikpKTsKKyAgICAgIH0KKyAgICAgIGlmIChmLT5jYWxsYmFja3MtPmRvd24pIHsKKyAgICAgICAgKCpmLT5jYWxsYmFja3MtPmRvd24pKGYpOyAgLyogSW5mb3JtIHVwcGVyIGxheWVycyAqLworICAgICAgfQorICAgICAgZi0+cmV0cmFuc21pdHMgPSAwOworICAgICAgZi0+c3RhdGUgPSBMU19TVE9QUElORzsKKyAgICAgIFRJTUVPVVQoZnNtX3RpbWVvdXQsIGYsIGYtPnRpbWVvdXR0aW1lKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZnNtX3NkYXRhKGYsIFRFUk1BQ0ssICh1X2NoYXIpaWQsIE5VTEwsIDApOworfQorCisKKy8qCisgKiBmc21fcnRlcm1hY2sgLSBSZWNlaXZlIFRlcm1pbmF0ZS1BY2suCisgKi8KK3N0YXRpYyB2b2lkCitmc21fcnRlcm1hY2soZnNtICpmKQoreworICBGU01ERUJVRyhMT0dfSU5GTywgKCJmc21fcnRlcm1hY2soJXMpOiBzdGF0ZT0lZCAoJXMpXG4iLCAKKyAgICAgICAgUFJPVE9fTkFNRShmKSwgZi0+c3RhdGUsIHBwcGVycl9zdHJlcnJbZi0+c3RhdGVdKSk7CisgIAorICBzd2l0Y2ggKGYtPnN0YXRlKSB7CisgICAgY2FzZSBMU19DTE9TSU5HOgorICAgICAgVU5USU1FT1VUKGZzbV90aW1lb3V0LCBmKTsKKyAgICAgIGYtPnN0YXRlID0gTFNfQ0xPU0VEOworICAgICAgaWYoIGYtPmNhbGxiYWNrcy0+ZmluaXNoZWQgKSB7CisgICAgICAgICgqZi0+Y2FsbGJhY2tzLT5maW5pc2hlZCkoZik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTFNfU1RPUFBJTkc6CisgICAgICBVTlRJTUVPVVQoZnNtX3RpbWVvdXQsIGYpOworICAgICAgZi0+c3RhdGUgPSBMU19TVE9QUEVEOworICAgICAgaWYoIGYtPmNhbGxiYWNrcy0+ZmluaXNoZWQgKSB7CisgICAgICAgICgqZi0+Y2FsbGJhY2tzLT5maW5pc2hlZCkoZik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIExTX0FDS1JDVkQ6CisgICAgICBmLT5zdGF0ZSA9IExTX1JFUVNFTlQ7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIExTX09QRU5FRDoKKyAgICAgIGlmIChmLT5jYWxsYmFja3MtPmRvd24pIHsKKyAgICAgICAgKCpmLT5jYWxsYmFja3MtPmRvd24pKGYpOyAgLyogSW5mb3JtIHVwcGVyIGxheWVycyAqLworICAgICAgfQorICAgICAgZnNtX3Njb25mcmVxKGYsIDApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZTTURFQlVHKExPR19JTkZPLCAoImZzbV9ydGVybWFjayglcyk6IFVOSEFORExFRCBzdGF0ZT0lZCAoJXMpISEhXG4iLCAKKyAgICAgICAgICAgICAgICBQUk9UT19OQU1FKGYpLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKKyAgfQorfQorCisKKy8qCisgKiBmc21fcmNvZGVyZWogLSBSZWNlaXZlIGFuIENvZGUtUmVqZWN0LgorICovCitzdGF0aWMgdm9pZAorZnNtX3Jjb2RlcmVqKGZzbSAqZiwgdV9jaGFyICppbnAsIGludCBsZW4pCit7CisgIHVfY2hhciBjb2RlLCBpZDsKKyAgCisgIEZTTURFQlVHKExPR19JTkZPLCAoImZzbV9yY29kZXJlaiglcyk6IHN0YXRlPSVkICglcylcbiIsIAorICAgICAgICBQUk9UT19OQU1FKGYpLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKKyAgCisgIGlmIChsZW4gPCBIRUFERVJMRU4pIHsKKyAgICBGU01ERUJVRyhMT0dfSU5GTywgKCJmc21fcmNvZGVyZWo6IFJjdmQgc2hvcnQgQ29kZS1SZWplY3QgcGFja2V0IVxuIikpOworICAgIHJldHVybjsKKyAgfQorICBHRVRDSEFSKGNvZGUsIGlucCk7CisgIEdFVENIQVIoaWQsIGlucCk7CisgIEZTTURFQlVHKExPR19XQVJOSU5HLCAoIiVzOiBSY3ZkIENvZGUtUmVqZWN0IGZvciBjb2RlICVkLCBpZCAlZFxuIiwKKyAgICAgICAgUFJPVE9fTkFNRShmKSwgY29kZSwgaWQpKTsKKyAgCisgIGlmKCBmLT5zdGF0ZSA9PSBMU19BQ0tSQ1ZEICkgeworICAgIGYtPnN0YXRlID0gTFNfUkVRU0VOVDsKKyAgfQorfQorCisKKy8qCisgKiBmc21fcHJvdHJlamVjdCAtIFBlZXIgZG9lc24ndCBzcGVhayB0aGlzIHByb3RvY29sLgorICoKKyAqIFRyZWF0IHRoaXMgYXMgYSBjYXRhc3Ryb3BoaWMgZXJyb3IgKFJYSi0pLgorICovCit2b2lkCitmc21fcHJvdHJlamVjdChmc20gKmYpCit7CisgIHN3aXRjaCggZi0+c3RhdGUgKSB7CisgICAgY2FzZSBMU19DTE9TSU5HOgorICAgICAgVU5USU1FT1VUKGZzbV90aW1lb3V0LCBmKTsgIC8qIENhbmNlbCB0aW1lb3V0ICovCisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIExTX0NMT1NFRDoKKyAgICAgIGYtPnN0YXRlID0gTFNfQ0xPU0VEOworICAgICAgaWYoIGYtPmNhbGxiYWNrcy0+ZmluaXNoZWQgKSB7CisgICAgICAgICgqZi0+Y2FsbGJhY2tzLT5maW5pc2hlZCkoZik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTFNfU1RPUFBJTkc6CisgICAgY2FzZSBMU19SRVFTRU5UOgorICAgIGNhc2UgTFNfQUNLUkNWRDoKKyAgICBjYXNlIExTX0FDS1NFTlQ6CisgICAgICBVTlRJTUVPVVQoZnNtX3RpbWVvdXQsIGYpOyAgLyogQ2FuY2VsIHRpbWVvdXQgKi8KKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgTFNfU1RPUFBFRDoKKyAgICAgIGYtPnN0YXRlID0gTFNfU1RPUFBFRDsKKyAgICAgIGlmKCBmLT5jYWxsYmFja3MtPmZpbmlzaGVkICkgeworICAgICAgICAoKmYtPmNhbGxiYWNrcy0+ZmluaXNoZWQpKGYpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBMU19PUEVORUQ6CisgICAgICBpZiggZi0+Y2FsbGJhY2tzLT5kb3duICkgeworICAgICAgICAoKmYtPmNhbGxiYWNrcy0+ZG93bikoZik7CisgICAgICB9CisgICAgICAvKiBJbml0IHJlc3RhcnQgY291bnRlciwgc2VuZCBUZXJtaW5hdGUtUmVxdWVzdCAqLworICAgICAgZi0+cmV0cmFuc21pdHMgPSBmLT5tYXh0ZXJtdHJhbnNtaXRzOworICAgICAgZnNtX3NkYXRhKGYsIFRFUk1SRVEsIGYtPnJlcWlkID0gKytmLT5pZCwKKyAgICAgICAgICAgICh1X2NoYXIgKikgZi0+dGVybV9yZWFzb24sIGYtPnRlcm1fcmVhc29uX2xlbik7CisgICAgICBUSU1FT1VUKGZzbV90aW1lb3V0LCBmLCBmLT50aW1lb3V0dGltZSk7CisgICAgICAtLWYtPnJldHJhbnNtaXRzOworCisgICAgICBmLT5zdGF0ZSA9IExTX1NUT1BQSU5HOworICAgICAgYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIEZTTURFQlVHKExPR19JTkZPLCAoIiVzOiBQcm90b2NvbC1yZWplY3QgZXZlbnQgaW4gc3RhdGUgJWQgKCVzKSFcbiIsCisgICAgICAgICAgICBQUk9UT19OQU1FKGYpLCBmLT5zdGF0ZSwgcHBwZXJyX3N0cmVycltmLT5zdGF0ZV0pKTsKKyAgICB9Cit9CisKKworLyoKKyAqIGZzbV9zY29uZnJlcSAtIFNlbmQgYSBDb25maWd1cmUtUmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQKK2ZzbV9zY29uZnJlcShmc20gKmYsIGludCByZXRyYW5zbWl0KQoreworICB1X2NoYXIgKm91dHA7CisgIGludCBjaWxlbjsKKyAgCisgIGlmKCBmLT5zdGF0ZSAhPSBMU19SRVFTRU5UICYmIGYtPnN0YXRlICE9IExTX0FDS1JDVkQgJiYgZi0+c3RhdGUgIT0gTFNfQUNLU0VOVCApIHsKKyAgICAvKiBOb3QgY3VycmVudGx5IG5lZ290aWF0aW5nIC0gcmVzZXQgb3B0aW9ucyAqLworICAgIGlmKCBmLT5jYWxsYmFja3MtPnJlc2V0Y2kgKSB7CisgICAgICAoKmYtPmNhbGxiYWNrcy0+cmVzZXRjaSkoZik7CisgICAgfQorICAgIGYtPm5ha2xvb3BzID0gMDsKKyAgfQorICAKKyAgaWYoICFyZXRyYW5zbWl0ICkgeworICAgIC8qIE5ldyByZXF1ZXN0IC0gcmVzZXQgcmV0cmFuc21pc3Npb24gY291bnRlciwgdXNlIG5ldyBJRCAqLworICAgIGYtPnJldHJhbnNtaXRzID0gZi0+bWF4Y29uZnJlcXRyYW5zbWl0czsKKyAgICBmLT5yZXFpZCA9ICsrZi0+aWQ7CisgIH0KKyAgCisgIGYtPnNlZW5fYWNrID0gMDsKKyAgCisgIC8qCisgICAqIE1ha2UgdXAgdGhlIHJlcXVlc3QgcGFja2V0CisgICAqLworICBvdXRwID0gb3V0cGFja2V0X2J1ZltmLT51bml0XSArIFBQUF9IRFJMRU4gKyBIRUFERVJMRU47CisgIGlmKCBmLT5jYWxsYmFja3MtPmNpbGVuICYmIGYtPmNhbGxiYWNrcy0+YWRkY2kgKSB7CisgICAgY2lsZW4gPSAoKmYtPmNhbGxiYWNrcy0+Y2lsZW4pKGYpOworICAgIGlmKCBjaWxlbiA+IHBlZXJfbXJ1W2YtPnVuaXRdIC0gKGludClIRUFERVJMRU4gKSB7CisgICAgICBjaWxlbiA9IHBlZXJfbXJ1W2YtPnVuaXRdIC0gSEVBREVSTEVOOworICAgIH0KKyAgICBpZiAoZi0+Y2FsbGJhY2tzLT5hZGRjaSkgeworICAgICAgKCpmLT5jYWxsYmFja3MtPmFkZGNpKShmLCBvdXRwLCAmY2lsZW4pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjaWxlbiA9IDA7CisgIH0KKworICAvKiBzZW5kIHRoZSByZXF1ZXN0IHRvIG91ciBwZWVyICovCisgIGZzbV9zZGF0YShmLCBDT05GUkVRLCBmLT5yZXFpZCwgb3V0cCwgY2lsZW4pOworICAKKyAgLyogc3RhcnQgdGhlIHJldHJhbnNtaXQgdGltZXIgKi8KKyAgLS1mLT5yZXRyYW5zbWl0czsKKyAgVElNRU9VVChmc21fdGltZW91dCwgZiwgZi0+dGltZW91dHRpbWUpOworICAKKyAgRlNNREVCVUcoTE9HX0lORk8sICgiJXM6IHNlbmRpbmcgQ29uZmlndXJlLVJlcXVlc3QsIGlkICVkXG4iLAorICAgICAgICBQUk9UT19OQU1FKGYpLCBmLT5yZXFpZCkpOworfQorCisKKy8qCisgKiBmc21fc2RhdGEgLSBTZW5kIHNvbWUgZGF0YS4KKyAqCisgKiBVc2VkIGZvciBhbGwgcGFja2V0cyBzZW50IHRvIG91ciBwZWVyIGJ5IHRoaXMgbW9kdWxlLgorICovCit2b2lkCitmc21fc2RhdGEoIGZzbSAqZiwgdV9jaGFyIGNvZGUsIHVfY2hhciBpZCwgdV9jaGFyICpkYXRhLCBpbnQgZGF0YWxlbikKK3sKKyAgdV9jaGFyICpvdXRwOworICBpbnQgb3V0bGVuOworCisgIC8qIEFkanVzdCBsZW5ndGggdG8gYmUgc21hbGxlciB0aGFuIE1UVSAqLworICBvdXRwID0gb3V0cGFja2V0X2J1ZltmLT51bml0XTsKKyAgaWYgKGRhdGFsZW4gPiBwZWVyX21ydVtmLT51bml0XSAtIChpbnQpSEVBREVSTEVOKSB7CisgICAgZGF0YWxlbiA9IHBlZXJfbXJ1W2YtPnVuaXRdIC0gSEVBREVSTEVOOworICB9CisgIGlmIChkYXRhbGVuICYmIGRhdGEgIT0gb3V0cCArIFBQUF9IRFJMRU4gKyBIRUFERVJMRU4pIHsKKyAgICBCQ09QWShkYXRhLCBvdXRwICsgUFBQX0hEUkxFTiArIEhFQURFUkxFTiwgZGF0YWxlbik7CisgIH0KKyAgb3V0bGVuID0gZGF0YWxlbiArIEhFQURFUkxFTjsKKyAgTUFLRUhFQURFUihvdXRwLCBmLT5wcm90b2NvbCk7CisgIFBVVENIQVIoY29kZSwgb3V0cCk7CisgIFBVVENIQVIoaWQsIG91dHApOworICBQVVRTSE9SVChvdXRsZW4sIG91dHApOworICBwcHBXcml0ZShmLT51bml0LCBvdXRwYWNrZXRfYnVmW2YtPnVuaXRdLCBvdXRsZW4gKyBQUFBfSERSTEVOKTsKKyAgRlNNREVCVUcoTE9HX0lORk8sICgiZnNtX3NkYXRhKCVzKTogU2VudCBjb2RlICVkLCVkLCVkLlxuIiwKKyAgICAgICAgUFJPVE9fTkFNRShmKSwgY29kZSwgaWQsIG91dGxlbikpOworfQorCisjZW5kaWYgLyogUFBQX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2ZzbS5oIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvZnNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0MWI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2ZzbS5oCkBAIC0wLDAgKzEsMTU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZnNtLmggLSBOZXR3b3JrIENvbnRyb2wgUHJvdG9jb2wgRmluaXRlIFN0YXRlIE1hY2hpbmUgaGVhZGVyIGZpbGUuCisqCisqIENvcHlyaWdodCAoYykgMjAwMyBieSBNYXJjIEJvdWNoZXIsIFNlcnZpY2VzIEluZm9ybWF0aXF1ZXMgKE1CU0kpIGluYy4KKyogQ29weXJpZ2h0IChjKSAxOTk3IEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyoKKyogVGhlIGF1dGhvcnMgaGVyZWJ5IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsCisqIGFuZCBsaWNlbnNlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQKKyogdGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCB0aGlzCisqIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGFyZSBpbmNsdWRlZCB2ZXJiYXRpbSBpbiBhbnkgCisqIGRpc3RyaWJ1dGlvbnMuIE5vIHdyaXR0ZW4gYWdyZWVtZW50LCBsaWNlbnNlLCBvciByb3lhbHR5IGZlZSBpcyByZXF1aXJlZAorKiBmb3IgYW55IG9mIHRoZSBhdXRob3JpemVkIHVzZXMuCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPTlRSSUJVVE9SUyAqQVMgSVMqIEFORCBBTlkgRVhQUkVTUyBPUgorKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIAorKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJFVklTSU9OIEhJU1RPUlkKKyoKKyogMDMtMDEtMDEgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisqICAgUG9ydGVkIHRvIGx3SVAuCisqIDk3LTExLTA1IEd1eSBMYW5jYXN0ZXIgPGdsYW5jYUBnZXNuLmNvbT4sIEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyogICBPcmlnaW5hbCBiYXNlZCBvbiBCU0QgY29kZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZzbS5oIC0ge0xpbmssIElQfSBDb250cm9sIFByb3RvY29sIEZpbml0ZSBTdGF0ZSBNYWNoaW5lIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqICRJZDogZnNtLmgsdiAxLjUgMjAwOS8xMi8zMSAxNzowODowOCBnb2xkc2ltb24gRXhwICQKKyAqLworCisjaWZuZGVmIEZTTV9ICisjZGVmaW5lIEZTTV9ICisKKy8qCisgKiBMQ1AgUGFja2V0IGhlYWRlciA9IENvZGUsIGlkLCBsZW5ndGguCisgKi8KKyNkZWZpbmUgSEVBREVSTEVOIChzaXplb2YgKHVfY2hhcikgKyBzaXplb2YgKHVfY2hhcikgKyBzaXplb2YgKHVfc2hvcnQpKQorCisKKy8qCisgKiAgQ1AgKExDUCwgSVBDUCwgZXRjLikgY29kZXMuCisgKi8KKyNkZWZpbmUgQ09ORlJFUSAgICAgMSAvKiBDb25maWd1cmF0aW9uIFJlcXVlc3QgKi8KKyNkZWZpbmUgQ09ORkFDSyAgICAgMiAvKiBDb25maWd1cmF0aW9uIEFjayAqLworI2RlZmluZSBDT05GTkFLICAgICAzIC8qIENvbmZpZ3VyYXRpb24gTmFrICovCisjZGVmaW5lIENPTkZSRUogICAgIDQgLyogQ29uZmlndXJhdGlvbiBSZWplY3QgKi8KKyNkZWZpbmUgVEVSTVJFUSAgICAgNSAvKiBUZXJtaW5hdGlvbiBSZXF1ZXN0ICovCisjZGVmaW5lIFRFUk1BQ0sgICAgIDYgLyogVGVybWluYXRpb24gQWNrICovCisjZGVmaW5lIENPREVSRUogICAgIDcgLyogQ29kZSBSZWplY3QgKi8KKworCisvKgorICogRWFjaCBGU00gaXMgZGVzY3JpYmVkIGJ5IGFuIGZzbSBzdHJ1Y3R1cmUgYW5kIGZzbSBjYWxsYmFja3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IGZzbSB7CisgIGludCB1bml0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVyZmFjZSB1bml0IG51bWJlciAqLworICB1X3Nob3J0IHByb3RvY29sOyAgICAgICAgICAgICAgICAvKiBEYXRhIExpbmsgTGF5ZXIgUHJvdG9jb2wgZmllbGQgdmFsdWUgKi8KKyAgaW50IHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhdGUgKi8KKyAgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udGFpbnMgb3B0aW9uIGJpdHMgKi8KKyAgdV9jaGFyIGlkOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBpZCAqLworICB1X2NoYXIgcmVxaWQ7ICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHJlcXVlc3QgaWQgKi8KKyAgdV9jaGFyIHNlZW5fYWNrOyAgICAgICAgICAgICAgICAgLyogSGF2ZSByZWNlaXZlZCB2YWxpZCBBY2svTmFrL1JlaiB0byBSZXEgKi8KKyAgaW50IHRpbWVvdXR0aW1lOyAgICAgICAgICAgICAgICAgLyogVGltZW91dCB0aW1lIGluIG1pbGxpc2Vjb25kcyAqLworICBpbnQgbWF4Y29uZnJlcXRyYW5zbWl0czsgICAgICAgICAvKiBNYXhpbXVtIENvbmZpZ3VyZS1SZXF1ZXN0IHRyYW5zbWlzc2lvbnMgKi8KKyAgaW50IHJldHJhbnNtaXRzOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBsZWZ0ICovCisgIGludCBtYXh0ZXJtdHJhbnNtaXRzOyAgICAgICAgICAgIC8qIE1heGltdW0gVGVybWluYXRlLVJlcXVlc3QgdHJhbnNtaXNzaW9ucyAqLworICBpbnQgbmFrbG9vcHM7ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgbmFrIGxvb3BzIHNpbmNlIGxhc3QgYWNrICovCisgIGludCBtYXhuYWtsb29wczsgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIG5hayBsb29wcyB0b2xlcmF0ZWQgKi8KKyAgc3RydWN0IGZzbV9jYWxsYmFja3MqIGNhbGxiYWNrczsgLyogQ2FsbGJhY2sgcm91dGluZXMgKi8KKyAgY2hhciogdGVybV9yZWFzb247ICAgICAgICAgICAgICAgLyogUmVhc29uIGZvciBjbG9zaW5nIHByb3RvY29sICovCisgIGludCB0ZXJtX3JlYXNvbl9sZW47ICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0ZXJtX3JlYXNvbiAqLworfSBmc207CisKKwordHlwZWRlZiBzdHJ1Y3QgZnNtX2NhbGxiYWNrcyB7CisgIHZvaWQgKCpyZXNldGNpKShmc20qKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgaW50ICAoKmNpbGVuKShmc20qKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2Ygb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgdm9pZCAoKmFkZGNpKShmc20qLCB1X2NoYXIqLCBpbnQqKTsgICAgICAgICAgICAgICAvKiBBZGQgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgaW50ICAoKmFja2NpKShmc20qLCB1X2NoYXIqLCBpbnQpOyAgICAgICAgICAgICAgICAvKiBBQ0sgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgaW50ICAoKm5ha2NpKShmc20qLCB1X2NoYXIqLCBpbnQpOyAgICAgICAgICAgICAgICAvKiBOQUsgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgaW50ICAoKnJlamNpKShmc20qLCB1X2NoYXIqLCBpbnQpOyAgICAgICAgICAgICAgICAvKiBSZWplY3Qgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgaW50ICAoKnJlcWNpKShmc20qLCB1X2NoYXIqLCBpbnQqLCBpbnQpOyAgICAgICAgICAvKiBSZXF1ZXN0IHBlZXIncyBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCisgIHZvaWQgKCp1cCkoZnNtKik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGVkIHdoZW4gZnNtIHJlYWNoZXMgTFNfT1BFTkVEIHN0YXRlICovCisgIHZvaWQgKCpkb3duKShmc20qKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGVkIHdoZW4gZnNtIGxlYXZlcyBMU19PUEVORUQgc3RhdGUgKi8KKyAgdm9pZCAoKnN0YXJ0aW5nKShmc20qKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsZWQgd2hlbiB3ZSB3YW50IHRoZSBsb3dlciBsYXllciAqLworICB2b2lkICgqZmluaXNoZWQpKGZzbSopOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxlZCB3aGVuIHdlIGRvbid0IHdhbnQgdGhlIGxvd2VyIGxheWVyICovCisgIHZvaWQgKCpwcm90cmVqZWN0KShpbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGVkIHdoZW4gUHJvdG9jb2wtUmVqZWN0IHJlY2VpdmVkICovCisgIHZvaWQgKCpyZXRyYW5zbWl0KShmc20qKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0cmFuc21pc3Npb24gaXMgbmVjZXNzYXJ5ICovCisgIGludCAgKCpleHRjb2RlKShmc20qLCBpbnQsIHVfY2hhciwgdV9jaGFyKiwgaW50KTsgLyogQ2FsbGVkIHdoZW4gdW5rbm93biBjb2RlIHJlY2VpdmVkICovCisgIGNoYXIgKnByb3RvX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RyaW5nIG5hbWUgZm9yIHByb3RvY29sIChmb3IgbWVzc2FnZXMpICovCit9IGZzbV9jYWxsYmFja3M7CisKKworLyoKKyAqIExpbmsgc3RhdGVzLgorICovCisjZGVmaW5lIExTX0lOSVRJQUwgIDAgLyogRG93biwgaGFzbid0IGJlZW4gb3BlbmVkICovCisjZGVmaW5lIExTX1NUQVJUSU5HIDEgLyogRG93biwgYmVlbiBvcGVuZWQgKi8KKyNkZWZpbmUgTFNfQ0xPU0VEICAgMiAvKiBVcCwgaGFzbid0IGJlZW4gb3BlbmVkICovCisjZGVmaW5lIExTX1NUT1BQRUQgIDMgLyogT3Blbiwgd2FpdGluZyBmb3IgZG93biBldmVudCAqLworI2RlZmluZSBMU19DTE9TSU5HICA0IC8qIFRlcm1pbmF0aW5nIHRoZSBjb25uZWN0aW9uLCBub3Qgb3BlbiAqLworI2RlZmluZSBMU19TVE9QUElORyA1IC8qIFRlcm1pbmF0aW5nLCBidXQgb3BlbiAqLworI2RlZmluZSBMU19SRVFTRU5UICA2IC8qIFdlJ3ZlIHNlbnQgYSBDb25maWcgUmVxdWVzdCAqLworI2RlZmluZSBMU19BQ0tSQ1ZEICA3IC8qIFdlJ3ZlIHJlY2VpdmVkIGEgQ29uZmlnIEFjayAqLworI2RlZmluZSBMU19BQ0tTRU5UICA4IC8qIFdlJ3ZlIHNlbnQgYSBDb25maWcgQWNrICovCisjZGVmaW5lIExTX09QRU5FRCAgIDkgLyogQ29ubmVjdGlvbiBhdmFpbGFibGUgKi8KKworLyoKKyAqIEZsYWdzIC0gaW5kaWNhdGUgb3B0aW9ucyBjb250cm9sbGluZyBGU00gb3BlcmF0aW9uCisgKi8KKyNkZWZpbmUgT1BUX1BBU1NJVkUgMSAvKiBEb24ndCBkaWUgaWYgd2UgZG9uJ3QgZ2V0IGEgcmVzcG9uc2UgKi8KKyNkZWZpbmUgT1BUX1JFU1RBUlQgMiAvKiBUcmVhdCAybmQgT1BFTiBhcyBET1dOLCBVUCAqLworI2RlZmluZSBPUFRfU0lMRU5UICA0IC8qIFdhaXQgZm9yIHBlZXIgdG8gc3BlYWsgZmlyc3QgKi8KKworCisvKgorICogUHJvdG90eXBlcworICovCit2b2lkIGZzbV9pbml0IChmc20qKTsKK3ZvaWQgZnNtX2xvd2VydXAgKGZzbSopOwordm9pZCBmc21fbG93ZXJkb3duIChmc20qKTsKK3ZvaWQgZnNtX29wZW4gKGZzbSopOwordm9pZCBmc21fY2xvc2UgKGZzbSosIGNoYXIqKTsKK3ZvaWQgZnNtX2lucHV0IChmc20qLCB1X2NoYXIqLCBpbnQpOwordm9pZCBmc21fcHJvdHJlamVjdCAoZnNtKik7Cit2b2lkIGZzbV9zZGF0YSAoZnNtKiwgdV9jaGFyLCB1X2NoYXIsIHVfY2hhciosIGludCk7CisKKworLyoKKyAqIFZhcmlhYmxlcworICovCitleHRlcm4gaW50IHBlZXJfbXJ1W107IC8qIGN1cnJlbnRseSBuZWdvdGlhdGVkIHBlZXIgTVJVIChwZXIgdW5pdCkgKi8KKworI2VuZGlmIC8qIEZTTV9IICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9pcGNwLmMgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9pcGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxYTYwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2lwY3AuYwpAQCAtMCwwICsxLDE0MTEgQEAKKy8qKiBJbiBjb250cmFzdCB0byBwcHBkIDIuMy4xLCBETlMgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZCwgcHJveHktQVJQIGFuZAorICAgIGRpYWwtb24tZGVtYW5kIGhhcyBiZWVuIHN0cmlwcGVkLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGlwY3AuYyAtIE5ldHdvcmsgUFBQIElQIENvbnRyb2wgUHJvdG9jb2wgcHJvZ3JhbSBmaWxlLgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgTWFyYyBCb3VjaGVyLCBTZXJ2aWNlcyBJbmZvcm1hdGlxdWVzIChNQlNJKSBpbmMuCisqIHBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NyBieSBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqCisqIFRoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLAorKiBhbmQgbGljZW5zZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkCisqIHRoYXQgZXhpc3RpbmcgY29weXJpZ2h0IG5vdGljZXMgYXJlIHJldGFpbmVkIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcworKiBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBhcmUgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55IAorKiBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwgbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMgcmVxdWlyZWQKKyogZm9yIGFueSBvZiB0aGUgYXV0aG9yaXplZCB1c2VzLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT05UUklCVVRPUlMgKkFTIElTKiBBTkQgQU5ZIEVYUFJFU1MgT1IKKyogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAKKyogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSRVZJU0lPTiBISVNUT1JZCisqCisqIDAzLTAxLTAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorKiAgIFBvcnRlZCB0byBsd0lQLgorKiA5Ny0xMi0wOCBHdXkgTGFuY2FzdGVyIDxsYW5jYXN0ZXJnQGFjbS5vcmc+LCBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqICAgT3JpZ2luYWwuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpcGNwLmMgLSBQUFAgSVAgQ29udHJvbCBQcm90b2NvbC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIFBQUF9TVVBQT1JUIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAicHBwLmgiCisjaW5jbHVkZSAicHBwZGVidWcuaCIKKworI2luY2x1ZGUgImF1dGguaCIKKyNpbmNsdWRlICJmc20uaCIKKyNpbmNsdWRlICJ2ai5oIgorI2luY2x1ZGUgImlwY3AuaCIKKworI2luY2x1ZGUgImx3aXAvaW5ldC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qICNkZWZpbmUgT0xEX0NJX0FERFJTIDEgKi8gLyogU3VwcG9ydCBkZXByZWNhdGVkIGFkZHJlc3MgbmVnb3RpYXRpb24uICovCisKKy8qIGdsb2JhbCB2YXJzICovCitpcGNwX29wdGlvbnMgaXBjcF93YW50b3B0aW9uc1tOVU1fUFBQXTsgIC8qIE9wdGlvbnMgdGhhdCB3ZSB3YW50IHRvIHJlcXVlc3QgKi8KK2lwY3Bfb3B0aW9ucyBpcGNwX2dvdG9wdGlvbnNbTlVNX1BQUF07ICAgLyogT3B0aW9ucyB0aGF0IHBlZXIgYWNrJ2QgKi8KK2lwY3Bfb3B0aW9ucyBpcGNwX2FsbG93b3B0aW9uc1tOVU1fUFBQXTsgLyogT3B0aW9ucyB3ZSBhbGxvdyBwZWVyIHRvIHJlcXVlc3QgKi8KK2lwY3Bfb3B0aW9ucyBpcGNwX2hpc29wdGlvbnNbTlVNX1BQUF07ICAgLyogT3B0aW9ucyB0aGF0IHdlIGFjaydkICovCisKKy8qIGxvY2FsIHZhcnMgKi8KK3N0YXRpYyBpbnQgZGVmYXVsdF9yb3V0ZV9zZXRbTlVNX1BQUF07IC8qIEhhdmUgc2V0IHVwIGEgZGVmYXVsdCByb3V0ZSAqLworc3RhdGljIGludCBjaXNfcmVjZWl2ZWRbTlVNX1BQUF07ICAgICAgLyogIyBDb25mLVJlcXMgcmVjZWl2ZWQgKi8KKworCisvKgorICogQ2FsbGJhY2tzIGZvciBmc20gY29kZS4gIChDSSA9IENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24pCisgKi8KK3N0YXRpYyB2b2lkIGlwY3BfcmVzZXRjaSAoZnNtICopOyAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IG91ciBDSSAqLworc3RhdGljIGludCAgaXBjcF9jaWxlbiAoZnNtICopOyAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGxlbmd0aCBvZiBvdXIgQ0kgKi8KK3N0YXRpYyB2b2lkIGlwY3BfYWRkY2kgKGZzbSAqLCB1X2NoYXIgKiwgaW50ICopOyAgICAgIC8qIEFkZCBvdXIgQ0kgKi8KK3N0YXRpYyBpbnQgIGlwY3BfYWNrY2kgKGZzbSAqLCB1X2NoYXIgKiwgaW50KTsgICAgICAgIC8qIFBlZXIgYWNrJ2Qgb3VyIENJICovCitzdGF0aWMgaW50ICBpcGNwX25ha2NpIChmc20gKiwgdV9jaGFyICosIGludCk7ICAgICAgICAvKiBQZWVyIG5haydkIG91ciBDSSAqLworc3RhdGljIGludCAgaXBjcF9yZWpjaSAoZnNtICosIHVfY2hhciAqLCBpbnQpOyAgICAgICAgLyogUGVlciByZWonZCBvdXIgQ0kgKi8KK3N0YXRpYyBpbnQgIGlwY3BfcmVxY2kgKGZzbSAqLCB1X2NoYXIgKiwgaW50ICosIGludCk7IC8qIFJjdiBDSSAqLworc3RhdGljIHZvaWQgaXBjcF91cCAoZnNtICopOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgVVAgKi8KK3N0YXRpYyB2b2lkIGlwY3BfZG93biAoZnNtICopOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlJ3JlIERPV04gKi8KKyNpZiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MKK3N0YXRpYyB2b2lkIGlwY3Bfc2NyaXB0IChmc20gKiwgY2hhciAqKTsgLyogUnVuIGFuIHVwL2Rvd24gc2NyaXB0ICovCisjZW5kaWYKK3N0YXRpYyB2b2lkIGlwY3BfZmluaXNoZWQgKGZzbSAqKTsgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IG5lZWQgbG93ZXIgbGF5ZXIgKi8KKworCitmc20gaXBjcF9mc21bTlVNX1BQUF07IC8qIElQQ1AgZnNtIHN0cnVjdHVyZSAqLworCisKK3N0YXRpYyBmc21fY2FsbGJhY2tzIGlwY3BfY2FsbGJhY2tzID0geyAvKiBJUENQIGNhbGxiYWNrIHJvdXRpbmVzICovCisgIGlwY3BfcmVzZXRjaSwgIC8qIFJlc2V0IG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCisgIGlwY3BfY2lsZW4sICAgIC8qIExlbmd0aCBvZiBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLworICBpcGNwX2FkZGNpLCAgICAvKiBBZGQgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgaXBjcF9hY2tjaSwgICAgLyogQUNLIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCisgIGlwY3BfbmFrY2ksICAgIC8qIE5BSyBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLworICBpcGNwX3JlamNpLCAgICAvKiBSZWplY3Qgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgaXBjcF9yZXFjaSwgICAgLyogUmVxdWVzdCBwZWVyJ3MgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLworICBpcGNwX3VwLCAgICAgICAvKiBDYWxsZWQgd2hlbiBmc20gcmVhY2hlcyBMU19PUEVORUQgc3RhdGUgKi8KKyAgaXBjcF9kb3duLCAgICAgLyogQ2FsbGVkIHdoZW4gZnNtIGxlYXZlcyBMU19PUEVORUQgc3RhdGUgKi8KKyAgTlVMTCwgICAgICAgICAgLyogQ2FsbGVkIHdoZW4gd2Ugd2FudCB0aGUgbG93ZXIgbGF5ZXIgdXAgKi8KKyAgaXBjcF9maW5pc2hlZCwgLyogQ2FsbGVkIHdoZW4gd2Ugd2FudCB0aGUgbG93ZXIgbGF5ZXIgZG93biAqLworICBOVUxMLCAgICAgICAgICAvKiBDYWxsZWQgd2hlbiBQcm90b2NvbC1SZWplY3QgcmVjZWl2ZWQgKi8KKyAgTlVMTCwgICAgICAgICAgLyogUmV0cmFuc21pc3Npb24gaXMgbmVjZXNzYXJ5ICovCisgIE5VTEwsICAgICAgICAgIC8qIENhbGxlZCB0byBoYW5kbGUgcHJvdG9jb2wtc3BlY2lmaWMgY29kZXMgKi8KKyAgIklQQ1AiICAgICAgICAgLyogU3RyaW5nIG5hbWUgb2YgcHJvdG9jb2wgKi8KK307CisKKy8qCisgKiBQcm90b2NvbCBlbnRyeSBwb2ludHMgZnJvbSBtYWluIGNvZGUuCisgKi8KK3N0YXRpYyB2b2lkIGlwY3BfaW5pdCAoaW50KTsKK3N0YXRpYyB2b2lkIGlwY3Bfb3BlbiAoaW50KTsKK3N0YXRpYyB2b2lkIGlwY3BfY2xvc2UgKGludCwgY2hhciAqKTsKK3N0YXRpYyB2b2lkIGlwY3BfbG93ZXJ1cCAoaW50KTsKK3N0YXRpYyB2b2lkIGlwY3BfbG93ZXJkb3duIChpbnQpOworc3RhdGljIHZvaWQgaXBjcF9pbnB1dCAoaW50LCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGlwY3BfcHJvdHJlaiAoaW50KTsKKworCitzdHJ1Y3QgcHJvdGVudCBpcGNwX3Byb3RlbnQgPSB7CisgIFBQUF9JUENQLAorICBpcGNwX2luaXQsCisgIGlwY3BfaW5wdXQsCisgIGlwY3BfcHJvdHJlaiwKKyAgaXBjcF9sb3dlcnVwLAorICBpcGNwX2xvd2VyZG93biwKKyAgaXBjcF9vcGVuLAorICBpcGNwX2Nsb3NlLAorI2lmIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUworICBpcGNwX3ByaW50cGt0LAorICBOVUxMLAorI2VuZGlmIC8qIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUyAqLworICAxLAorICAiSVBDUCIsCisjaWYgUFBQX0FERElUSU9OQUxfQ0FMTEJBQ0tTCisgIGlwX2NoZWNrX29wdGlvbnMsCisgIE5VTEwsCisgIGlwX2FjdGl2ZV9wa3QKKyNlbmRpZiAvKiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MgKi8KK307CisKK3N0YXRpYyB2b2lkIGlwY3BfY2xlYXJfYWRkcnMgKGludCk7CisKKy8qCisgKiBMZW5ndGhzIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAqLworI2RlZmluZSBDSUxFTl9WT0lEICAgICAyCisjZGVmaW5lIENJTEVOX0NPTVBSRVNTIDQgIC8qIG1pbiBsZW5ndGggZm9yIGNvbXByZXNzaW9uIHByb3RvY29sIG9wdC4gKi8KKyNkZWZpbmUgQ0lMRU5fVkogICAgICAgNiAgLyogbGVuZ3RoIGZvciBSRkMxMzMyIFZhbi1KYWNvYnNvbiBvcHQuICovCisjZGVmaW5lIENJTEVOX0FERFIgICAgIDYgIC8qIG5ldy1zdHlsZSBzaW5nbGUgYWRkcmVzcyBvcHRpb24gKi8KKyNkZWZpbmUgQ0lMRU5fQUREUlMgICAgMTAgLyogb2xkLXN0eWxlIGR1YWwgYWRkcmVzcyBvcHRpb24gKi8KKworCisjZGVmaW5lIENPREVOQU1FKHgpICgoeCkgPT0gQ09ORkFDSyA/ICJBQ0siIDogXAorICAgICAgICAgICAgICAgICAgICAgKHgpID09IENPTkZOQUsgPyAiTkFLIiA6ICJSRUoiKQorCisKKy8qCisgKiBpcGNwX2luaXQgLSBJbml0aWFsaXplIElQQ1AuCisgKi8KK3N0YXRpYyB2b2lkCitpcGNwX2luaXQoaW50IHVuaXQpCit7CisgIGZzbSAgICAgICAgICAgKmYgPSAmaXBjcF9mc21bdW5pdF07CisgIGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1t1bml0XTsKKyAgaXBjcF9vcHRpb25zICphbyA9ICZpcGNwX2FsbG93b3B0aW9uc1t1bml0XTsKKworICBmLT51bml0ICAgICAgPSB1bml0OworICBmLT5wcm90b2NvbCAgPSBQUFBfSVBDUDsKKyAgZi0+Y2FsbGJhY2tzID0gJmlwY3BfY2FsbGJhY2tzOworICBmc21faW5pdCgmaXBjcF9mc21bdW5pdF0pOworCisgIG1lbXNldCh3bywgMCwgc2l6ZW9mKCp3bykpOworICBtZW1zZXQoYW8sIDAsIHNpemVvZigqYW8pKTsKKworICB3by0+bmVnX2FkZHIgICAgICA9IDE7CisgIHdvLT5vdXJhZGRyICAgICAgID0gMDsKKyNpZiBWSl9TVVBQT1JUCisgIHdvLT5uZWdfdmogICAgICAgID0gMTsKKyNlbHNlICAvKiBWSl9TVVBQT1JUICovCisgIHdvLT5uZWdfdmogICAgICAgID0gMDsKKyNlbmRpZiAvKiBWSl9TVVBQT1JUICovCisgIHdvLT52al9wcm90b2NvbCAgID0gSVBDUF9WSl9DT01QOworICB3by0+bWF4c2xvdGluZGV4ICA9IE1BWF9TTE9UUyAtIDE7CisgIHdvLT5jZmxhZyAgICAgICAgID0gMDsKKyAgd28tPmRlZmF1bHRfcm91dGUgPSAxOworCisgIGFvLT5uZWdfYWRkciAgICAgID0gMTsKKyNpZiBWSl9TVVBQT1JUCisgIGFvLT5uZWdfdmogICAgICAgID0gMTsKKyNlbHNlICAvKiBWSl9TVVBQT1JUICovCisgIGFvLT5uZWdfdmogICAgICAgID0gMDsKKyNlbmRpZiAvKiBWSl9TVVBQT1JUICovCisgIGFvLT5tYXhzbG90aW5kZXggID0gTUFYX1NMT1RTIC0gMTsKKyAgYW8tPmNmbGFnICAgICAgICAgPSAxOworICBhby0+ZGVmYXVsdF9yb3V0ZSA9IDE7Cit9CisKKworLyoKKyAqIGlwY3Bfb3BlbiAtIElQQ1AgaXMgYWxsb3dlZCB0byBjb21lIHVwLgorICovCitzdGF0aWMgdm9pZAoraXBjcF9vcGVuKGludCB1bml0KQoreworICBmc21fb3BlbigmaXBjcF9mc21bdW5pdF0pOworfQorCisKKy8qCisgKiBpcGNwX2Nsb3NlIC0gVGFrZSBJUENQIGRvd24uCisgKi8KK3N0YXRpYyB2b2lkCitpcGNwX2Nsb3NlKGludCB1bml0LCBjaGFyICpyZWFzb24pCit7CisgIGZzbV9jbG9zZSgmaXBjcF9mc21bdW5pdF0sIHJlYXNvbik7Cit9CisKKworLyoKKyAqIGlwY3BfbG93ZXJ1cCAtIFRoZSBsb3dlciBsYXllciBpcyB1cC4KKyAqLworc3RhdGljIHZvaWQKK2lwY3BfbG93ZXJ1cChpbnQgdW5pdCkKK3sKKyAgZnNtX2xvd2VydXAoJmlwY3BfZnNtW3VuaXRdKTsKK30KKworCisvKgorICogaXBjcF9sb3dlcmRvd24gLSBUaGUgbG93ZXIgbGF5ZXIgaXMgZG93bi4KKyAqLworc3RhdGljIHZvaWQKK2lwY3BfbG93ZXJkb3duKGludCB1bml0KQoreworICBmc21fbG93ZXJkb3duKCZpcGNwX2ZzbVt1bml0XSk7Cit9CisKKworLyoKKyAqIGlwY3BfaW5wdXQgLSBJbnB1dCBJUENQIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQKK2lwY3BfaW5wdXQoaW50IHVuaXQsIHVfY2hhciAqcCwgaW50IGxlbikKK3sKKyAgZnNtX2lucHV0KCZpcGNwX2ZzbVt1bml0XSwgcCwgbGVuKTsKK30KKworCisvKgorICogaXBjcF9wcm90cmVqIC0gQSBQcm90b2NvbC1SZWplY3Qgd2FzIHJlY2VpdmVkIGZvciBJUENQLgorICoKKyAqIFByZXRlbmQgdGhlIGxvd2VyIGxheWVyIHdlbnQgZG93biwgc28gd2Ugc2h1dCB1cC4KKyAqLworc3RhdGljIHZvaWQKK2lwY3BfcHJvdHJlaihpbnQgdW5pdCkKK3sKKyAgZnNtX2xvd2VyZG93bigmaXBjcF9mc21bdW5pdF0pOworfQorCisKKy8qCisgKiBpcGNwX3Jlc2V0Y2kgLSBSZXNldCBvdXIgQ0kuCisgKi8KK3N0YXRpYyB2b2lkCitpcGNwX3Jlc2V0Y2koZnNtICpmKQoreworICBpcGNwX29wdGlvbnMgKndvID0gJmlwY3Bfd2FudG9wdGlvbnNbZi0+dW5pdF07CisgIAorICB3by0+cmVxX2FkZHIgPSB3by0+bmVnX2FkZHIgJiYgaXBjcF9hbGxvd29wdGlvbnNbZi0+dW5pdF0ubmVnX2FkZHI7CisgIGlmICh3by0+b3VyYWRkciA9PSAwKSB7CisgICAgd28tPmFjY2VwdF9sb2NhbCA9IDE7CisgIH0KKyAgaWYgKHdvLT5oaXNhZGRyID09IDApIHsKKyAgICB3by0+YWNjZXB0X3JlbW90ZSA9IDE7CisgIH0KKyAgLyogUmVxdWVzdCBETlMgYWRkcmVzc2VzIGZyb20gdGhlIHBlZXIgKi8KKyAgd28tPnJlcV9kbnMxID0gcHBwX3NldHRpbmdzLnVzZXBlZXJkbnM7CisgIHdvLT5yZXFfZG5zMiA9IHBwcF9zZXR0aW5ncy51c2VwZWVyZG5zOworICBpcGNwX2dvdG9wdGlvbnNbZi0+dW5pdF0gPSAqd287CisgIGNpc19yZWNlaXZlZFtmLT51bml0XSA9IDA7Cit9CisKKworLyoKKyAqIGlwY3BfY2lsZW4gLSBSZXR1cm4gbGVuZ3RoIG9mIG91ciBDSS4KKyAqLworc3RhdGljIGludAoraXBjcF9jaWxlbihmc20gKmYpCit7CisgIGlwY3Bfb3B0aW9ucyAqZ28gPSAmaXBjcF9nb3RvcHRpb25zW2YtPnVuaXRdOworICBpcGNwX29wdGlvbnMgKndvID0gJmlwY3Bfd2FudG9wdGlvbnNbZi0+dW5pdF07CisgIGlwY3Bfb3B0aW9ucyAqaG8gPSAmaXBjcF9oaXNvcHRpb25zW2YtPnVuaXRdOworCisjZGVmaW5lIExFTkNJVkoobmVnLCBvbGQpICAgKG5lZyA/IChvbGQ/IENJTEVOX0NPTVBSRVNTIDogQ0lMRU5fVkopIDogMCkKKyNkZWZpbmUgTEVOQ0lBRERSKG5lZywgb2xkKSAobmVnID8gKG9sZD8gQ0lMRU5fQUREUlMgOiBDSUxFTl9BRERSKSA6IDApCisjZGVmaW5lIExFTkNJRE5TKG5lZykgICAgICAgKG5lZyA/IChDSUxFTl9BRERSKSA6IDApCisKKyAgLyoKKyAgICogRmlyc3Qgc2VlIGlmIHdlIHdhbnQgdG8gY2hhbmdlIG91ciBvcHRpb25zIHRvIHRoZSBvbGQKKyAgICogZm9ybXMgYmVjYXVzZSB3ZSBoYXZlIHJlY2VpdmVkIG9sZCBmb3JtcyBmcm9tIHRoZSBwZWVyLgorICAgKi8KKyAgaWYgKHdvLT5uZWdfYWRkciAmJiAhZ28tPm5lZ19hZGRyICYmICFnby0+b2xkX2FkZHJzKSB7CisgICAgLyogdXNlIHRoZSBvbGQgc3R5bGUgb2YgYWRkcmVzcyBuZWdvdGlhdGlvbiAqLworICAgIGdvLT5uZWdfYWRkciA9IDE7CisgICAgZ28tPm9sZF9hZGRycyA9IDE7CisgIH0KKyAgaWYgKHdvLT5uZWdfdmogJiYgIWdvLT5uZWdfdmogJiYgIWdvLT5vbGRfdmopIHsKKyAgICAvKiB0cnkgYW4gb2xkZXIgc3R5bGUgb2YgVkogbmVnb3RpYXRpb24gKi8KKyAgICBpZiAoY2lzX3JlY2VpdmVkW2YtPnVuaXRdID09IDApIHsKKyAgICAgIC8qIGtlZXAgdHJ5aW5nIHRoZSBuZXcgc3R5bGUgdW50aWwgd2Ugc2VlIHNvbWUgQ0kgZnJvbSB0aGUgcGVlciAqLworICAgICAgZ28tPm5lZ192aiA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHVzZSB0aGUgb2xkIHN0eWxlIG9ubHkgaWYgdGhlIHBlZXIgZGlkICovCisgICAgICBpZiAoaG8tPm5lZ192aiAmJiBoby0+b2xkX3ZqKSB7CisgICAgICAgIGdvLT5uZWdfdmogPSAxOworICAgICAgICBnby0+b2xkX3ZqID0gMTsKKyAgICAgICAgZ28tPnZqX3Byb3RvY29sID0gaG8tPnZqX3Byb3RvY29sOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAoTEVOQ0lBRERSKGdvLT5uZWdfYWRkciwgZ28tPm9sZF9hZGRycykgKworICAgICAgICAgIExFTkNJVkooZ28tPm5lZ192aiwgZ28tPm9sZF92aikgKworICAgICAgICAgIExFTkNJRE5TKGdvLT5yZXFfZG5zMSkgKworICAgICAgICAgIExFTkNJRE5TKGdvLT5yZXFfZG5zMikpOworfQorCisKKy8qCisgKiBpcGNwX2FkZGNpIC0gQWRkIG91ciBkZXNpcmVkIENJcyB0byBhIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQKK2lwY3BfYWRkY2koZnNtICpmLCB1X2NoYXIgKnVjcCwgaW50ICpsZW5wKQoreworICBpcGNwX29wdGlvbnMgKmdvID0gJmlwY3BfZ290b3B0aW9uc1tmLT51bml0XTsKKyAgaW50IGxlbiA9ICpsZW5wOworCisjZGVmaW5lIEFERENJVkoob3B0LCBuZWcsIHZhbCwgb2xkLCBtYXhzbG90aW5kZXgsIGNmbGFnKSBcCisgIGlmIChuZWcpIHsgXAorICAgIGludCB2amxlbiA9IG9sZD8gQ0lMRU5fQ09NUFJFU1MgOiBDSUxFTl9WSjsgXAorICAgIGlmIChsZW4gPj0gdmpsZW4pIHsgXAorICAgICAgUFVUQ0hBUihvcHQsIHVjcCk7IFwKKyAgICAgIFBVVENIQVIodmpsZW4sIHVjcCk7IFwKKyAgICAgIFBVVFNIT1JUKHZhbCwgdWNwKTsgXAorICAgICAgaWYgKCFvbGQpIHsgXAorICAgICAgICBQVVRDSEFSKG1heHNsb3RpbmRleCwgdWNwKTsgXAorICAgICAgICBQVVRDSEFSKGNmbGFnLCB1Y3ApOyBcCisgICAgICB9IFwKKyAgICAgIGxlbiAtPSB2amxlbjsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgIG5lZyA9IDA7IFwKKyAgICB9IFwKKyAgfQorCisjZGVmaW5lIEFERENJQUREUihvcHQsIG5lZywgb2xkLCB2YWwxLCB2YWwyKSBcCisgIGlmIChuZWcpIHsgXAorICAgIGludCBhZGRybGVuID0gKG9sZD8gQ0lMRU5fQUREUlM6IENJTEVOX0FERFIpOyBcCisgICAgaWYgKGxlbiA+PSBhZGRybGVuKSB7IFwKKyAgICAgIHUzMl90IGw7IFwKKyAgICAgIFBVVENIQVIob3B0LCB1Y3ApOyBcCisgICAgICBQVVRDSEFSKGFkZHJsZW4sIHVjcCk7IFwKKyAgICAgIGwgPSBudG9obCh2YWwxKTsgXAorICAgICAgUFVUTE9ORyhsLCB1Y3ApOyBcCisgICAgICBpZiAob2xkKSB7IFwKKyAgICAgICAgbCA9IG50b2hsKHZhbDIpOyBcCisgICAgICAgIFBVVExPTkcobCwgdWNwKTsgXAorICAgICAgfSBcCisgICAgICBsZW4gLT0gYWRkcmxlbjsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgIG5lZyA9IDA7IFwKKyAgICB9IFwKKyAgfQorCisjZGVmaW5lIEFERENJRE5TKG9wdCwgbmVnLCBhZGRyKSBcCisgIGlmIChuZWcpIHsgXAorICAgIGlmIChsZW4gPj0gQ0lMRU5fQUREUikgeyBcCisgICAgICB1MzJfdCBsOyBcCisgICAgICBQVVRDSEFSKG9wdCwgdWNwKTsgXAorICAgICAgUFVUQ0hBUihDSUxFTl9BRERSLCB1Y3ApOyBcCisgICAgICBsID0gbnRvaGwoYWRkcik7IFwKKyAgICAgIFBVVExPTkcobCwgdWNwKTsgXAorICAgICAgbGVuIC09IENJTEVOX0FERFI7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICBuZWcgPSAwOyBcCisgICAgfSBcCisgIH0KKworICBBRERDSUFERFIoKGdvLT5vbGRfYWRkcnM/IENJX0FERFJTOiBDSV9BRERSKSwgZ28tPm5lZ19hZGRyLAorICAgICAgZ28tPm9sZF9hZGRycywgZ28tPm91cmFkZHIsIGdvLT5oaXNhZGRyKTsKKworICBBRERDSVZKKENJX0NPTVBSRVNTVFlQRSwgZ28tPm5lZ192aiwgZ28tPnZqX3Byb3RvY29sLCBnby0+b2xkX3ZqLAorICAgICAgZ28tPm1heHNsb3RpbmRleCwgZ28tPmNmbGFnKTsKKworICBBRERDSUROUyhDSV9NU19ETlMxLCBnby0+cmVxX2RuczEsIGdvLT5kbnNhZGRyWzBdKTsKKworICBBRERDSUROUyhDSV9NU19ETlMyLCBnby0+cmVxX2RuczIsIGdvLT5kbnNhZGRyWzFdKTsKKworICAqbGVucCAtPSBsZW47Cit9CisKKworLyoKKyAqIGlwY3BfYWNrY2kgLSBBY2sgb3VyIENJcy4KKyAqCisgKiBSZXR1cm5zOgorICogIDAgLSBBY2sgd2FzIGJhZC4KKyAqICAxIC0gQWNrIHdhcyBnb29kLgorICovCitzdGF0aWMgaW50CitpcGNwX2Fja2NpKGZzbSAqZiwgdV9jaGFyICpwLCBpbnQgbGVuKQoreworICBpcGNwX29wdGlvbnMgKmdvID0gJmlwY3BfZ290b3B0aW9uc1tmLT51bml0XTsKKyAgdV9zaG9ydCBjaWxlbiwgY2l0eXBlLCBjaXNob3J0OworICB1MzJfdCBjaWxvbmc7CisgIHVfY2hhciBjaW1heHNsb3RpbmRleCwgY2ljZmxhZzsKKworICAvKgorICAgKiBDSXMgbXVzdCBiZSBpbiBleGFjdGx5IHRoZSBzYW1lIG9yZGVyIHRoYXQgd2Ugc2VudC4uLgorICAgKiBDaGVjayBwYWNrZXQgbGVuZ3RoIGFuZCBDSSBsZW5ndGggYXQgZWFjaCBzdGVwLgorICAgKiBJZiB3ZSBmaW5kIGFueSBkZXZpYXRpb25zLCB0aGVuIHRoaXMgcGFja2V0IGlzIGJhZC4KKyAgICovCisKKyNkZWZpbmUgQUNLQ0lWSihvcHQsIG5lZywgdmFsLCBvbGQsIG1heHNsb3RpbmRleCwgY2ZsYWcpIFwKKyAgaWYgKG5lZykgeyBcCisgICAgaW50IHZqbGVuID0gb2xkPyBDSUxFTl9DT01QUkVTUyA6IENJTEVOX1ZKOyBcCisgICAgaWYgKChsZW4gLT0gdmpsZW4pIDwgMCkgeyBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIH0gXAorICAgIEdFVENIQVIoY2l0eXBlLCBwKTsgXAorICAgIEdFVENIQVIoY2lsZW4sIHApOyBcCisgICAgaWYgKGNpbGVuICE9IHZqbGVuIHx8IFwKKyAgICAgICAgY2l0eXBlICE9IG9wdCkgeyBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIH0gXAorICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCisgICAgaWYgKGNpc2hvcnQgIT0gdmFsKSB7IFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgfSBcCisgICAgaWYgKCFvbGQpIHsgXAorICAgICAgR0VUQ0hBUihjaW1heHNsb3RpbmRleCwgcCk7IFwKKyAgICAgIGlmIChjaW1heHNsb3RpbmRleCAhPSBtYXhzbG90aW5kZXgpIHsgXAorICAgICAgICBnb3RvIGJhZDsgXAorICAgICAgfSBcCisgICAgICBHRVRDSEFSKGNpY2ZsYWcsIHApOyBcCisgICAgICBpZiAoY2ljZmxhZyAhPSBjZmxhZykgeyBcCisgICAgICAgIGdvdG8gYmFkOyBcCisgICAgICB9IFwKKyAgICB9IFwKKyAgfQorICAKKyNkZWZpbmUgQUNLQ0lBRERSKG9wdCwgbmVnLCBvbGQsIHZhbDEsIHZhbDIpIFwKKyAgaWYgKG5lZykgeyBcCisgICAgaW50IGFkZHJsZW4gPSAob2xkPyBDSUxFTl9BRERSUzogQ0lMRU5fQUREUik7IFwKKyAgICB1MzJfdCBsOyBcCisgICAgaWYgKChsZW4gLT0gYWRkcmxlbikgPCAwKSB7IFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgfSBcCisgICAgR0VUQ0hBUihjaXR5cGUsIHApOyBcCisgICAgR0VUQ0hBUihjaWxlbiwgcCk7IFwKKyAgICBpZiAoY2lsZW4gIT0gYWRkcmxlbiB8fCBcCisgICAgICAgIGNpdHlwZSAhPSBvcHQpIHsgXAorICAgICAgZ290byBiYWQ7IFwKKyAgICB9IFwKKyAgICBHRVRMT05HKGwsIHApOyBcCisgICAgY2lsb25nID0gaHRvbmwobCk7IFwKKyAgICBpZiAodmFsMSAhPSBjaWxvbmcpIHsgXAorICAgICAgZ290byBiYWQ7IFwKKyAgICB9IFwKKyAgICBpZiAob2xkKSB7IFwKKyAgICAgIEdFVExPTkcobCwgcCk7IFwKKyAgICAgIGNpbG9uZyA9IGh0b25sKGwpOyBcCisgICAgICBpZiAodmFsMiAhPSBjaWxvbmcpIHsgXAorICAgICAgICBnb3RvIGJhZDsgXAorICAgICAgfSBcCisgICAgfSBcCisgIH0KKworI2RlZmluZSBBQ0tDSUROUyhvcHQsIG5lZywgYWRkcikgXAorICBpZiAobmVnKSB7IFwKKyAgICB1MzJfdCBsOyBcCisgICAgaWYgKChsZW4gLT0gQ0lMRU5fQUREUikgPCAwKSB7IFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgfSBcCisgICAgR0VUQ0hBUihjaXR5cGUsIHApOyBcCisgICAgR0VUQ0hBUihjaWxlbiwgcCk7IFwKKyAgICBpZiAoY2lsZW4gIT0gQ0lMRU5fQUREUiB8fCBcCisgICAgICAgIGNpdHlwZSAhPSBvcHQpIHsgXAorICAgICAgZ290byBiYWQ7IFwKKyAgICB9IFwKKyAgICBHRVRMT05HKGwsIHApOyBcCisgICAgY2lsb25nID0gaHRvbmwobCk7IFwKKyAgICBpZiAoYWRkciAhPSBjaWxvbmcpIHsgXAorICAgICAgZ290byBiYWQ7IFwKKyAgICB9IFwKKyAgfQorCisgIEFDS0NJQUREUigoZ28tPm9sZF9hZGRycz8gQ0lfQUREUlM6IENJX0FERFIpLCBnby0+bmVnX2FkZHIsCisgICAgICAgIGdvLT5vbGRfYWRkcnMsIGdvLT5vdXJhZGRyLCBnby0+aGlzYWRkcik7CisKKyAgQUNLQ0lWSihDSV9DT01QUkVTU1RZUEUsIGdvLT5uZWdfdmosIGdvLT52al9wcm90b2NvbCwgZ28tPm9sZF92aiwKKyAgICAgIGdvLT5tYXhzbG90aW5kZXgsIGdvLT5jZmxhZyk7CisKKyAgQUNLQ0lETlMoQ0lfTVNfRE5TMSwgZ28tPnJlcV9kbnMxLCBnby0+ZG5zYWRkclswXSk7CisKKyAgQUNLQ0lETlMoQ0lfTVNfRE5TMiwgZ28tPnJlcV9kbnMyLCBnby0+ZG5zYWRkclsxXSk7CisKKyAgLyoKKyAgICogSWYgdGhlcmUgYXJlIGFueSByZW1haW5pbmcgQ0lzLCB0aGVuIHRoaXMgcGFja2V0IGlzIGJhZC4KKyAgICovCisgIGlmIChsZW4gIT0gMCkgeworICAgIGdvdG8gYmFkOworICB9CisgIHJldHVybiAoMSk7CisKK2JhZDoKKyAgSVBDUERFQlVHKExPR19JTkZPLCAoImlwY3BfYWNrY2k6IHJlY2VpdmVkIGJhZCBBY2shXG4iKSk7CisgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBpcGNwX25ha2NpIC0gUGVlciBoYXMgc2VudCBhIE5BSyBmb3Igc29tZSBvZiBvdXIgQ0lzLgorICogVGhpcyBzaG91bGQgbm90IG1vZGlmeSBhbnkgc3RhdGUgaWYgdGhlIE5hayBpcyBiYWQKKyAqIG9yIGlmIElQQ1AgaXMgaW4gdGhlIExTX09QRU5FRCBzdGF0ZS4KKyAqCisgKiBSZXR1cm5zOgorICogIDAgLSBOYWsgd2FzIGJhZC4KKyAqICAxIC0gTmFrIHdhcyBnb29kLgorICovCitzdGF0aWMgaW50CitpcGNwX25ha2NpKGZzbSAqZiwgdV9jaGFyICpwLCBpbnQgbGVuKQoreworICBpcGNwX29wdGlvbnMgKmdvID0gJmlwY3BfZ290b3B0aW9uc1tmLT51bml0XTsKKyAgdV9jaGFyIGNpbWF4c2xvdGluZGV4LCBjaWNmbGFnOworICB1X2NoYXIgY2l0eXBlLCBjaWxlbiwgKm5leHQ7CisgIHVfc2hvcnQgY2lzaG9ydDsKKyAgdTMyX3QgY2lhZGRyMSwgY2lhZGRyMiwgbCwgY2lkbnNhZGRyOworICBpcGNwX29wdGlvbnMgbm87ICAgIC8qIG9wdGlvbnMgd2UndmUgc2VlbiBOYWtzIGZvciAqLworICBpcGNwX29wdGlvbnMgdHJ5OyAgICAvKiBvcHRpb25zIHRvIHJlcXVlc3QgbmV4dCB0aW1lICovCisKKyAgQlpFUk8oJm5vLCBzaXplb2Yobm8pKTsKKyAgdHJ5ID0gKmdvOworCisgIC8qCisgICAqIEFueSBOYWsnZCBDSXMgbXVzdCBiZSBpbiBleGFjdGx5IHRoZSBzYW1lIG9yZGVyIHRoYXQgd2Ugc2VudC4KKyAgICogQ2hlY2sgcGFja2V0IGxlbmd0aCBhbmQgQ0kgbGVuZ3RoIGF0IGVhY2ggc3RlcC4KKyAgICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCisgICAqLworI2RlZmluZSBOQUtDSUFERFIob3B0LCBuZWcsIG9sZCwgY29kZSkgXAorICBpZiAoZ28tPm5lZyAmJiBcCisgICAgICBsZW4gPj0gKGNpbGVuID0gKG9sZD8gQ0lMRU5fQUREUlM6IENJTEVOX0FERFIpKSAmJiBcCisgICAgICBwWzFdID09IGNpbGVuICYmIFwKKyAgICAgIHBbMF0gPT0gb3B0KSB7IFwKKyAgICBsZW4gLT0gY2lsZW47IFwKKyAgICBJTkNQVFIoMiwgcCk7IFwKKyAgICBHRVRMT05HKGwsIHApOyBcCisgICAgY2lhZGRyMSA9IGh0b25sKGwpOyBcCisgICAgaWYgKG9sZCkgeyBcCisgICAgICBHRVRMT05HKGwsIHApOyBcCisgICAgICBjaWFkZHIyID0gaHRvbmwobCk7IFwKKyAgICAgIG5vLm9sZF9hZGRycyA9IDE7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICBjaWFkZHIyID0gMDsgXAorICAgIH0gXAorICAgIG5vLm5lZyA9IDE7IFwKKyAgICBjb2RlIFwKKyAgfQorCisjZGVmaW5lIE5BS0NJVkoob3B0LCBuZWcsIGNvZGUpIFwKKyAgaWYgKGdvLT5uZWcgJiYgXAorICAgICAgKChjaWxlbiA9IHBbMV0pID09IENJTEVOX0NPTVBSRVNTIHx8IGNpbGVuID09IENJTEVOX1ZKKSAmJiBcCisgICAgICBsZW4gPj0gY2lsZW4gJiYgXAorICAgICAgcFswXSA9PSBvcHQpIHsgXAorICAgIGxlbiAtPSBjaWxlbjsgXAorICAgIElOQ1BUUigyLCBwKTsgXAorICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCisgICAgbm8ubmVnID0gMTsgXAorICAgIGNvZGUgXAorICB9CisgIAorI2RlZmluZSBOQUtDSUROUyhvcHQsIG5lZywgY29kZSkgXAorICBpZiAoZ28tPm5lZyAmJiBcCisgICAgICAoKGNpbGVuID0gcFsxXSkgPT0gQ0lMRU5fQUREUikgJiYgXAorICAgICAgbGVuID49IGNpbGVuICYmIFwKKyAgICAgIHBbMF0gPT0gb3B0KSB7IFwKKyAgICBsZW4gLT0gY2lsZW47IFwKKyAgICBJTkNQVFIoMiwgcCk7IFwKKyAgICBHRVRMT05HKGwsIHApOyBcCisgICAgY2lkbnNhZGRyID0gaHRvbmwobCk7IFwKKyAgICBuby5uZWcgPSAxOyBcCisgICAgY29kZSBcCisgIH0KKworICAvKgorICAgKiBBY2NlcHQgdGhlIHBlZXIncyBpZGVhIG9mIHtvdXIsaGlzfSBhZGRyZXNzLCBpZiBkaWZmZXJlbnQKKyAgICogZnJvbSBvdXIgaWRlYSwgb25seSBpZiB0aGUgYWNjZXB0X3tsb2NhbCxyZW1vdGV9IGZsYWcgaXMgc2V0LgorICAgKi8KKyAgTkFLQ0lBRERSKChnby0+b2xkX2FkZHJzPyBDSV9BRERSUzogQ0lfQUREUiksIG5lZ19hZGRyLCBnby0+b2xkX2FkZHJzLAorICAgIGlmIChnby0+YWNjZXB0X2xvY2FsICYmIGNpYWRkcjEpIHsgLyogRG8gd2Uga25vdyBvdXIgYWRkcmVzcz8gKi8KKyAgICAgIHRyeS5vdXJhZGRyID0gY2lhZGRyMTsKKyAgICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJsb2NhbCBJUCBhZGRyZXNzICVzXG4iLAorICAgICAgICAgICBpbmV0X250b2EoY2lhZGRyMSkpKTsKKyAgICB9CisgICAgaWYgKGdvLT5hY2NlcHRfcmVtb3RlICYmIGNpYWRkcjIpIHsgLyogRG9lcyBoZSBrbm93IGhpcz8gKi8KKyAgICAgIHRyeS5oaXNhZGRyID0gY2lhZGRyMjsKKyAgICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJyZW1vdGUgSVAgYWRkcmVzcyAlc1xuIiwKKyAgICAgICAgICAgaW5ldF9udG9hKGNpYWRkcjIpKSk7CisgICAgfQorICApOworCisgIC8qCisgICAqIEFjY2VwdCB0aGUgcGVlcidzIHZhbHVlIG9mIG1heHNsb3RpbmRleCBwcm92aWRlZCB0aGF0IGl0CisgICAqIGlzIGxlc3MgdGhhbiB3aGF0IHdlIGFza2VkIGZvci4gIFR1cm4gb2ZmIHNsb3QtSUQgY29tcHJlc3Npb24KKyAgICogaWYgdGhlIHBlZXIgd2FudHMuICBTZW5kIG9sZC1zdHlsZSBjb21wcmVzcy10eXBlIG9wdGlvbiBpZgorICAgKiB0aGUgcGVlciB3YW50cy4KKyAgICovCisgIE5BS0NJVkooQ0lfQ09NUFJFU1NUWVBFLCBuZWdfdmosCisgICAgaWYgKGNpbGVuID09IENJTEVOX1ZKKSB7CisgICAgICBHRVRDSEFSKGNpbWF4c2xvdGluZGV4LCBwKTsKKyAgICAgIEdFVENIQVIoY2ljZmxhZywgcCk7CisgICAgICBpZiAoY2lzaG9ydCA9PSBJUENQX1ZKX0NPTVApIHsKKyAgICAgICAgdHJ5Lm9sZF92aiA9IDA7CisgICAgICAgIGlmIChjaW1heHNsb3RpbmRleCA8IGdvLT5tYXhzbG90aW5kZXgpIHsKKyAgICAgICAgICB0cnkubWF4c2xvdGluZGV4ID0gY2ltYXhzbG90aW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaWNmbGFnKSB7CisgICAgICAgICAgdHJ5LmNmbGFnID0gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJ5Lm5lZ192aiA9IDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChjaXNob3J0ID09IElQQ1BfVkpfQ09NUCB8fCBjaXNob3J0ID09IElQQ1BfVkpfQ09NUF9PTEQpIHsKKyAgICAgICAgdHJ5Lm9sZF92aiA9IDE7CisgICAgICAgIHRyeS52al9wcm90b2NvbCA9IGNpc2hvcnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cnkubmVnX3ZqID0gMDsKKyAgICAgIH0KKyAgICB9CisgICk7CisKKyAgTkFLQ0lETlMoQ0lfTVNfRE5TMSwgcmVxX2RuczEsCisgICAgICB0cnkuZG5zYWRkclswXSA9IGNpZG5zYWRkcjsKKyAgICAgICAgSVBDUERFQlVHKExPR19JTkZPLCAoInByaW1hcnkgRE5TIGFkZHJlc3MgJXNcbiIsIGluZXRfbnRvYShjaWRuc2FkZHIpKSk7CisgICAgICApOworCisgIE5BS0NJRE5TKENJX01TX0ROUzIsIHJlcV9kbnMyLAorICAgICAgdHJ5LmRuc2FkZHJbMV0gPSBjaWRuc2FkZHI7CisgICAgICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJzZWNvbmRhcnkgRE5TIGFkZHJlc3MgJXNcbiIsIGluZXRfbnRvYShjaWRuc2FkZHIpKSk7CisgICAgICApOworCisgIC8qCisgICogVGhlcmUgbWF5IGJlIHJlbWFpbmluZyBDSXMsIGlmIHRoZSBwZWVyIGlzIHJlcXVlc3RpbmcgbmVnb3RpYXRpb24KKyAgKiBvbiBhbiBvcHRpb24gdGhhdCB3ZSBkaWRuJ3QgaW5jbHVkZSBpbiBvdXIgcmVxdWVzdCBwYWNrZXQuCisgICogSWYgdGhleSB3YW50IHRvIG5lZ290aWF0ZSBhYm91dCBJUCBhZGRyZXNzZXMsIHdlIGNvbXBseS4KKyAgKiBJZiB0aGV5IHdhbnQgdXMgdG8gYXNrIGZvciBjb21wcmVzc2lvbiwgd2UgcmVmdXNlLgorICAqLworICB3aGlsZSAobGVuID4gQ0lMRU5fVk9JRCkgeworICAgIEdFVENIQVIoY2l0eXBlLCBwKTsKKyAgICBHRVRDSEFSKGNpbGVuLCBwKTsKKyAgICBpZiggKGxlbiAtPSBjaWxlbikgPCAwICkgeworICAgICAgZ290byBiYWQ7CisgICAgfQorICAgIG5leHQgPSBwICsgY2lsZW4gLSAyOworCisgICAgc3dpdGNoIChjaXR5cGUpIHsKKyAgICAgIGNhc2UgQ0lfQ09NUFJFU1NUWVBFOgorICAgICAgICBpZiAoZ28tPm5lZ192aiB8fCBuby5uZWdfdmogfHwKKyAgICAgICAgICAgIChjaWxlbiAhPSBDSUxFTl9WSiAmJiBjaWxlbiAhPSBDSUxFTl9DT01QUkVTUykpIHsKKyAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICBuby5uZWdfdmogPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0lfQUREUlM6CisgICAgICAgIGlmICgoZ28tPm5lZ19hZGRyICYmIGdvLT5vbGRfYWRkcnMpIHx8IG5vLm9sZF9hZGRycworICAgICAgICAgICAgfHwgY2lsZW4gIT0gQ0lMRU5fQUREUlMpIHsKKyAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICB0cnkubmVnX2FkZHIgPSAxOworICAgICAgICB0cnkub2xkX2FkZHJzID0gMTsKKyAgICAgICAgR0VUTE9ORyhsLCBwKTsKKyAgICAgICAgY2lhZGRyMSA9IGh0b25sKGwpOworICAgICAgICBpZiAoY2lhZGRyMSAmJiBnby0+YWNjZXB0X2xvY2FsKSB7CisgICAgICAgICAgdHJ5Lm91cmFkZHIgPSBjaWFkZHIxOworICAgICAgICB9CisgICAgICAgIEdFVExPTkcobCwgcCk7CisgICAgICAgIGNpYWRkcjIgPSBodG9ubChsKTsKKyAgICAgICAgaWYgKGNpYWRkcjIgJiYgZ28tPmFjY2VwdF9yZW1vdGUpIHsKKyAgICAgICAgICB0cnkuaGlzYWRkciA9IGNpYWRkcjI7CisgICAgICAgIH0KKyAgICAgICAgbm8ub2xkX2FkZHJzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENJX0FERFI6CisgICAgICAgIGlmIChnby0+bmVnX2FkZHIgfHwgbm8ubmVnX2FkZHIgfHwgY2lsZW4gIT0gQ0lMRU5fQUREUikgeworICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgICAgIHRyeS5vbGRfYWRkcnMgPSAwOworICAgICAgICBHRVRMT05HKGwsIHApOworICAgICAgICBjaWFkZHIxID0gaHRvbmwobCk7CisgICAgICAgIGlmIChjaWFkZHIxICYmIGdvLT5hY2NlcHRfbG9jYWwpIHsKKyAgICAgICAgICB0cnkub3VyYWRkciA9IGNpYWRkcjE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyeS5vdXJhZGRyICE9IDApIHsKKyAgICAgICAgICB0cnkubmVnX2FkZHIgPSAxOworICAgICAgICB9CisgICAgICAgIG5vLm5lZ19hZGRyID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHAgPSBuZXh0OworICB9CisKKyAgLyogSWYgdGhlcmUgaXMgc3RpbGwgYW55dGhpbmcgbGVmdCwgdGhpcyBwYWNrZXQgaXMgYmFkLiAqLworICBpZiAobGVuICE9IDApIHsKKyAgICBnb3RvIGJhZDsKKyAgfQorCisgIC8qCisgICAqIE9LLCB0aGUgTmFrIGlzIGdvb2QuICBOb3cgd2UgY2FuIHVwZGF0ZSBzdGF0ZS4KKyAgICovCisgIGlmIChmLT5zdGF0ZSAhPSBMU19PUEVORUQpIHsKKyAgICAqZ28gPSB0cnk7CisgIH0KKworICByZXR1cm4gMTsKKworYmFkOgorICBJUENQREVCVUcoTE9HX0lORk8sICgiaXBjcF9uYWtjaTogcmVjZWl2ZWQgYmFkIE5hayFcbiIpKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGlwY3BfcmVqY2kgLSBSZWplY3Qgc29tZSBvZiBvdXIgQ0lzLgorICovCitzdGF0aWMgaW50CitpcGNwX3JlamNpKGZzbSAqZiwgdV9jaGFyICpwLCBpbnQgbGVuKQoreworICBpcGNwX29wdGlvbnMgKmdvID0gJmlwY3BfZ290b3B0aW9uc1tmLT51bml0XTsKKyAgdV9jaGFyIGNpbWF4c2xvdGluZGV4LCBjaWZsYWcsIGNpbGVuOworICB1X3Nob3J0IGNpc2hvcnQ7CisgIHUzMl90IGNpbG9uZzsKKyAgaXBjcF9vcHRpb25zIHRyeTsgICAgLyogb3B0aW9ucyB0byByZXF1ZXN0IG5leHQgdGltZSAqLworCisgIHRyeSA9ICpnbzsKKyAgLyoKKyAgICogQW55IFJlamVjdGVkIENJcyBtdXN0IGJlIGluIGV4YWN0bHkgdGhlIHNhbWUgb3JkZXIgdGhhdCB3ZSBzZW50LgorICAgKiBDaGVjayBwYWNrZXQgbGVuZ3RoIGFuZCBDSSBsZW5ndGggYXQgZWFjaCBzdGVwLgorICAgKiBJZiB3ZSBmaW5kIGFueSBkZXZpYXRpb25zLCB0aGVuIHRoaXMgcGFja2V0IGlzIGJhZC4KKyAgICovCisjZGVmaW5lIFJFSkNJQUREUihvcHQsIG5lZywgb2xkLCB2YWwxLCB2YWwyKSBcCisgIGlmIChnby0+bmVnICYmIFwKKyAgICAgIGxlbiA+PSAoY2lsZW4gPSBvbGQ/IENJTEVOX0FERFJTOiBDSUxFTl9BRERSKSAmJiBcCisgICAgICBwWzFdID09IGNpbGVuICYmIFwKKyAgICAgIHBbMF0gPT0gb3B0KSB7IFwKKyAgICB1MzJfdCBsOyBcCisgICAgbGVuIC09IGNpbGVuOyBcCisgICAgSU5DUFRSKDIsIHApOyBcCisgICAgR0VUTE9ORyhsLCBwKTsgXAorICAgIGNpbG9uZyA9IGh0b25sKGwpOyBcCisgICAgLyogQ2hlY2sgcmVqZWN0ZWQgdmFsdWUuICovIFwKKyAgICBpZiAoY2lsb25nICE9IHZhbDEpIHsgXAorICAgICAgZ290byBiYWQ7IFwKKyAgICB9IFwKKyAgICBpZiAob2xkKSB7IFwKKyAgICAgIEdFVExPTkcobCwgcCk7IFwKKyAgICAgIGNpbG9uZyA9IGh0b25sKGwpOyBcCisgICAgICAvKiBDaGVjayByZWplY3RlZCB2YWx1ZS4gKi8gXAorICAgICAgaWYgKGNpbG9uZyAhPSB2YWwyKSB7IFwKKyAgICAgICAgZ290byBiYWQ7IFwKKyAgICAgIH0gXAorICAgIH0gXAorICAgIHRyeS5uZWcgPSAwOyBcCisgIH0KKworI2RlZmluZSBSRUpDSVZKKG9wdCwgbmVnLCB2YWwsIG9sZCwgbWF4c2xvdCwgY2ZsYWcpIFwKKyAgaWYgKGdvLT5uZWcgJiYgXAorICAgICAgcFsxXSA9PSAob2xkPyBDSUxFTl9DT01QUkVTUyA6IENJTEVOX1ZKKSAmJiBcCisgICAgICBsZW4gPj0gcFsxXSAmJiBcCisgICAgICBwWzBdID09IG9wdCkgeyBcCisgICAgbGVuIC09IHBbMV07IFwKKyAgICBJTkNQVFIoMiwgcCk7IFwKKyAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsgXAorICAgIC8qIENoZWNrIHJlamVjdGVkIHZhbHVlLiAqLyAgXAorICAgIGlmIChjaXNob3J0ICE9IHZhbCkgeyBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIH0gXAorICAgIGlmICghb2xkKSB7IFwKKyAgICAgIEdFVENIQVIoY2ltYXhzbG90aW5kZXgsIHApOyBcCisgICAgICBpZiAoY2ltYXhzbG90aW5kZXggIT0gbWF4c2xvdCkgeyBcCisgICAgICAgIGdvdG8gYmFkOyBcCisgICAgICB9IFwKKyAgICAgIEdFVENIQVIoY2lmbGFnLCBwKTsgXAorICAgICAgaWYgKGNpZmxhZyAhPSBjZmxhZykgeyBcCisgICAgICAgIGdvdG8gYmFkOyBcCisgICAgICB9IFwKKyAgICB9IFwKKyAgICB0cnkubmVnID0gMDsgXAorICB9CisKKyNkZWZpbmUgUkVKQ0lETlMob3B0LCBuZWcsIGRuc2FkZHIpIFwKKyAgaWYgKGdvLT5uZWcgJiYgXAorICAgICAgKChjaWxlbiA9IHBbMV0pID09IENJTEVOX0FERFIpICYmIFwKKyAgICAgIGxlbiA+PSBjaWxlbiAmJiBcCisgICAgICBwWzBdID09IG9wdCkgeyBcCisgICAgdTMyX3QgbDsgXAorICAgIGxlbiAtPSBjaWxlbjsgXAorICAgIElOQ1BUUigyLCBwKTsgXAorICAgIEdFVExPTkcobCwgcCk7IFwKKyAgICBjaWxvbmcgPSBodG9ubChsKTsgXAorICAgIC8qIENoZWNrIHJlamVjdGVkIHZhbHVlLiAqLyBcCisgICAgaWYgKGNpbG9uZyAhPSBkbnNhZGRyKSB7IFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgfSBcCisgICAgdHJ5Lm5lZyA9IDA7IFwKKyAgfQorCisgIFJFSkNJQUREUigoZ28tPm9sZF9hZGRycz8gQ0lfQUREUlM6IENJX0FERFIpLCBuZWdfYWRkciwKKyAgICAgICAgZ28tPm9sZF9hZGRycywgZ28tPm91cmFkZHIsIGdvLT5oaXNhZGRyKTsKKworICBSRUpDSVZKKENJX0NPTVBSRVNTVFlQRSwgbmVnX3ZqLCBnby0+dmpfcHJvdG9jb2wsIGdvLT5vbGRfdmosCisgICAgICBnby0+bWF4c2xvdGluZGV4LCBnby0+Y2ZsYWcpOworCisgIFJFSkNJRE5TKENJX01TX0ROUzEsIHJlcV9kbnMxLCBnby0+ZG5zYWRkclswXSk7CisKKyAgUkVKQ0lETlMoQ0lfTVNfRE5TMiwgcmVxX2RuczIsIGdvLT5kbnNhZGRyWzFdKTsKKworICAvKgorICAgKiBJZiB0aGVyZSBhcmUgYW55IHJlbWFpbmluZyBDSXMsIHRoZW4gdGhpcyBwYWNrZXQgaXMgYmFkLgorICAgKi8KKyAgaWYgKGxlbiAhPSAwKSB7CisgICAgZ290byBiYWQ7CisgIH0KKyAgLyoKKyAgICogTm93IHdlIGNhbiB1cGRhdGUgc3RhdGUuCisgICAqLworICBpZiAoZi0+c3RhdGUgIT0gTFNfT1BFTkVEKSB7CisgICAgKmdvID0gdHJ5OworICB9CisgIHJldHVybiAxOworCitiYWQ6CisgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJpcGNwX3JlamNpOiByZWNlaXZlZCBiYWQgUmVqZWN0IVxuIikpOworICByZXR1cm4gMDsKK30KKworCisvKgorICogaXBjcF9yZXFjaSAtIENoZWNrIHRoZSBwZWVyJ3MgcmVxdWVzdGVkIENJcyBhbmQgc2VuZCBhcHByb3ByaWF0ZSByZXNwb25zZS4KKyAqCisgKiBSZXR1cm5zOiBDT05GQUNLLCBDT05GTkFLIG9yIENPTkZSRUogYW5kIGlucHV0IHBhY2tldCBtb2RpZmllZAorICogYXBwcm9wcmlhdGVseS4gIElmIHJlamVjdF9pZl9kaXNhZ3JlZSBpcyBub24temVybywgZG9lc24ndCByZXR1cm4KKyAqIENPTkZOQUs7IHJldHVybnMgQ09ORlJFSiBpZiBpdCBjYW4ndCByZXR1cm4gQ09ORkFDSy4KKyAqLworc3RhdGljIGludAoraXBjcF9yZXFjaShmc20gKmYsIHVfY2hhciAqaW5wLyogUmVxdWVzdGVkIENJcyAqLyxpbnQgKmxlbi8qIExlbmd0aCBvZiByZXF1ZXN0ZWQgQ0lzICovLGludCByZWplY3RfaWZfZGlzYWdyZWUpCit7CisgIGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1tmLT51bml0XTsKKyAgaXBjcF9vcHRpb25zICpobyA9ICZpcGNwX2hpc29wdGlvbnNbZi0+dW5pdF07CisgIGlwY3Bfb3B0aW9ucyAqYW8gPSAmaXBjcF9hbGxvd29wdGlvbnNbZi0+dW5pdF07CisjaWZkZWYgT0xEX0NJX0FERFJTCisgIGlwY3Bfb3B0aW9ucyAqZ28gPSAmaXBjcF9nb3RvcHRpb25zW2YtPnVuaXRdOworI2VuZGlmCisgIHVfY2hhciAqY2lwLCAqbmV4dDsgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBhbmQgbmV4dCBDSXMgKi8KKyAgdV9zaG9ydCBjaWxlbiwgY2l0eXBlOyAgLyogUGFyc2VkIGxlbiwgdHlwZSAqLworICB1X3Nob3J0IGNpc2hvcnQ7ICAgICAgICAvKiBQYXJzZWQgc2hvcnQgdmFsdWUgKi8KKyAgdTMyX3QgdGwsIGNpYWRkcjE7ICAgICAgLyogUGFyc2VkIGFkZHJlc3MgdmFsdWVzICovCisjaWZkZWYgT0xEX0NJX0FERFJTCisgIHUzMl90IGNpYWRkcjI7ICAgICAgICAgIC8qIFBhcnNlZCBhZGRyZXNzIHZhbHVlcyAqLworI2VuZGlmCisgIGludCByYyA9IENPTkZBQ0s7ICAgICAgIC8qIEZpbmFsIHBhY2tldCByZXR1cm4gY29kZSAqLworICBpbnQgb3JjOyAgICAgICAgICAgICAgICAvKiBJbmRpdmlkdWFsIG9wdGlvbiByZXR1cm4gY29kZSAqLworICB1X2NoYXIgKnA7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgY2hhciB0byBwYXJzZSAqLworICB1X2NoYXIgKnVjcCA9IGlucDsgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgb3V0cHV0IGNoYXIgKi8KKyAgaW50IGwgPSAqbGVuOyAgICAgICAgICAgLyogTGVuZ3RoIGxlZnQgKi8KKyAgdV9jaGFyIG1heHNsb3RpbmRleCwgY2ZsYWc7CisgIGludCBkOworCisgIGNpc19yZWNlaXZlZFtmLT51bml0XSA9IDE7CisKKyAgLyoKKyAgICogUmVzZXQgYWxsIGhpcyBvcHRpb25zLgorICAgKi8KKyAgQlpFUk8oaG8sIHNpemVvZigqaG8pKTsKKworICAvKgorICAgKiBQcm9jZXNzIGFsbCBoaXMgb3B0aW9ucy4KKyAgICovCisgIG5leHQgPSBpbnA7CisgIHdoaWxlIChsKSB7CisgICAgb3JjID0gQ09ORkFDSzsgICAgICAgLyogQXNzdW1lIHN1Y2Nlc3MgKi8KKyAgICBjaXAgPSBwID0gbmV4dDsgICAgICAvKiBSZW1lbWJlciBiZWdpbmluZyBvZiBDSSAqLworICAgIGlmIChsIDwgMiB8fCAgICAgICAgIC8qIE5vdCBlbm91Z2ggZGF0YSBmb3IgQ0kgaGVhZGVyIG9yICovCisgICAgICAgIHBbMV0gPCAyIHx8ICAgICAgLyogIENJIGxlbmd0aCB0b28gc21hbGwgb3IgKi8KKyAgICAgICAgcFsxXSA+IGwpIHsgICAgICAvKiAgQ0kgbGVuZ3RoIHRvbyBiaWc/ICovCisgICAgICBJUENQREVCVUcoTE9HX0lORk8sICgiaXBjcF9yZXFjaTogYmFkIENJIGxlbmd0aCFcbiIpKTsKKyAgICAgIG9yYyA9IENPTkZSRUo7ICAgICAvKiBSZWplY3QgYmFkIENJICovCisgICAgICBjaWxlbiA9ICh1X3Nob3J0KWw7LyogUmVqZWN0IHRpbGwgZW5kIG9mIHBhY2tldCAqLworICAgICAgbCA9IDA7ICAgICAgICAgICAgIC8qIERvbid0IGxvb3AgYWdhaW4gKi8KKyAgICAgIGdvdG8gZW5kc3dpdGNoOworICAgIH0KKyAgICBHRVRDSEFSKGNpdHlwZSwgcCk7ICAvKiBQYXJzZSBDSSB0eXBlICovCisgICAgR0VUQ0hBUihjaWxlbiwgcCk7ICAgLyogUGFyc2UgQ0kgbGVuZ3RoICovCisgICAgbCAtPSBjaWxlbjsgICAgICAgICAgLyogQWRqdXN0IHJlbWFpbmluZyBsZW5ndGggKi8KKyAgICBuZXh0ICs9IGNpbGVuOyAgICAgICAvKiBTdGVwIHRvIG5leHQgQ0kgKi8KKworICAgIHN3aXRjaCAoY2l0eXBlKSB7ICAgICAgLyogQ2hlY2sgQ0kgdHlwZSAqLworI2lmZGVmIE9MRF9DSV9BRERSUyAvKiBOZWVkIHRvIHNhdmUgc3BhY2UuLi4gKi8KKyAgICAgIGNhc2UgQ0lfQUREUlM6CisgICAgICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJpcGNwX3JlcWNpOiByZWNlaXZlZCBBRERSU1xuIikpOworICAgICAgICBpZiAoIWFvLT5uZWdfYWRkciB8fAorICAgICAgICAgICAgY2lsZW4gIT0gQ0lMRU5fQUREUlMpIHsgIC8qIENoZWNrIENJIGxlbmd0aCAqLworICAgICAgICAgIG9yYyA9IENPTkZSRUo7ICAgIC8qIFJlamVjdCBDSSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgaGUgaGFzIG5vIGFkZHJlc3MsIG9yIGlmIHdlIGJvdGggaGF2ZSBoaXMgYWRkcmVzcyBidXQKKyAgICAgICAgICogZGlzYWdyZWUgYWJvdXQgaXQsIHRoZW4gTkFLIGl0IHdpdGggb3VyIGlkZWEuCisgICAgICAgICAqIEluIHBhcnRpY3VsYXIsIGlmIHdlIGRvbid0IGtub3cgaGlzIGFkZHJlc3MsIGJ1dCBoZSBkb2VzLAorICAgICAgICAgKiB0aGVuIGFjY2VwdCBpdC4KKyAgICAgICAgICovCisgICAgICAgIEdFVExPTkcodGwsIHApOyAgICAvKiBQYXJzZSBzb3VyY2UgYWRkcmVzcyAoaGlzKSAqLworICAgICAgICBjaWFkZHIxID0gaHRvbmwodGwpOworICAgICAgICBJUENQREVCVUcoTE9HX0lORk8sICgiaGlzIGFkZHIgJXNcbiIsIGluZXRfbnRvYShjaWFkZHIxKSkpOworICAgICAgICBpZiAoY2lhZGRyMSAhPSB3by0+aGlzYWRkcgorICAgICAgICAgICAgJiYgKGNpYWRkcjEgPT0gMCB8fCAhd28tPmFjY2VwdF9yZW1vdGUpKSB7CisgICAgICAgICAgb3JjID0gQ09ORk5BSzsKKyAgICAgICAgICBpZiAoIXJlamVjdF9pZl9kaXNhZ3JlZSkgeworICAgICAgICAgICAgREVDUFRSKHNpemVvZih1MzJfdCksIHApOworICAgICAgICAgICAgdGwgPSBudG9obCh3by0+aGlzYWRkcik7CisgICAgICAgICAgICBQVVRMT05HKHRsLCBwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2lhZGRyMSA9PSAwICYmIHdvLT5oaXNhZGRyID09IDApIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIElmIG5laXRoZXIgd2Ugbm9yIGhlIGtub3dzIGhpcyBhZGRyZXNzLCByZWplY3QgdGhlIG9wdGlvbi4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICAgIHdvLT5yZXFfYWRkciA9IDA7ICAvKiBkb24ndCBOQUsgd2l0aCAwLjAuMC4wIGxhdGVyICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiBoZSBkb2Vzbid0IGtub3cgb3VyIGFkZHJlc3MsIG9yIGlmIHdlIGJvdGggaGF2ZSBvdXIgYWRkcmVzcworICAgICAgICAgKiBidXQgZGlzYWdyZWUgYWJvdXQgaXQsIHRoZW4gTkFLIGl0IHdpdGggb3VyIGlkZWEuCisgICAgICAgICAqLworICAgICAgICBHRVRMT05HKHRsLCBwKTsgICAgLyogUGFyc2UgZGVzaW5hdGlvbiBhZGRyZXNzIChvdXJzKSAqLworICAgICAgICBjaWFkZHIyID0gaHRvbmwodGwpOworICAgICAgICBJUENQREVCVUcoTE9HX0lORk8sICgib3VyIGFkZHIgJXNcbiIsIGluZXRfbnRvYShjaWFkZHIyKSkpOworICAgICAgICBpZiAoY2lhZGRyMiAhPSB3by0+b3VyYWRkcikgeworICAgICAgICAgIGlmIChjaWFkZHIyID09IDAgfHwgIXdvLT5hY2NlcHRfbG9jYWwpIHsKKyAgICAgICAgICAgIG9yYyA9IENPTkZOQUs7CisgICAgICAgICAgICBpZiAoIXJlamVjdF9pZl9kaXNhZ3JlZSkgeworICAgICAgICAgICAgICBERUNQVFIoc2l6ZW9mKHUzMl90KSwgcCk7CisgICAgICAgICAgICAgIHRsID0gbnRvaGwod28tPm91cmFkZHIpOworICAgICAgICAgICAgICBQVVRMT05HKHRsLCBwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ28tPm91cmFkZHIgPSBjaWFkZHIyOyAgLyogYWNjZXB0IHBlZXIncyBpZGVhICovCisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaG8tPm5lZ19hZGRyID0gMTsKKyAgICAgICAgaG8tPm9sZF9hZGRycyA9IDE7CisgICAgICAgIGhvLT5oaXNhZGRyID0gY2lhZGRyMTsKKyAgICAgICAgaG8tPm91cmFkZHIgPSBjaWFkZHIyOworICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICBjYXNlIENJX0FERFI6CisgICAgICAgIGlmICghYW8tPm5lZ19hZGRyKSB7CisgICAgICAgICAgSVBDUERFQlVHKExPR19JTkZPLCAoImlwY3BfcmVxY2k6IFJlamVjdCBBRERSIG5vdCBhbGxvd2VkXG4iKSk7CisgICAgICAgICAgb3JjID0gQ09ORlJFSjsgICAgICAgIC8qIFJlamVjdCBDSSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGNpbGVuICE9IENJTEVOX0FERFIpIHsgIC8qIENoZWNrIENJIGxlbmd0aCAqLworICAgICAgICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJpcGNwX3JlcWNpOiBSZWplY3QgQUREUiBiYWQgbGVuXG4iKSk7CisgICAgICAgICAgb3JjID0gQ09ORlJFSjsgICAgICAgIC8qIFJlamVjdCBDSSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgaGUgaGFzIG5vIGFkZHJlc3MsIG9yIGlmIHdlIGJvdGggaGF2ZSBoaXMgYWRkcmVzcyBidXQKKyAgICAgICAgICogZGlzYWdyZWUgYWJvdXQgaXQsIHRoZW4gTkFLIGl0IHdpdGggb3VyIGlkZWEuCisgICAgICAgICAqIEluIHBhcnRpY3VsYXIsIGlmIHdlIGRvbid0IGtub3cgaGlzIGFkZHJlc3MsIGJ1dCBoZSBkb2VzLAorICAgICAgICAgKiB0aGVuIGFjY2VwdCBpdC4KKyAgICAgICAgICovCisgICAgICAgIEdFVExPTkcodGwsIHApOyAgLyogUGFyc2Ugc291cmNlIGFkZHJlc3MgKGhpcykgKi8KKyAgICAgICAgY2lhZGRyMSA9IGh0b25sKHRsKTsKKyAgICAgICAgaWYgKGNpYWRkcjEgIT0gd28tPmhpc2FkZHIKKyAgICAgICAgICAgICYmIChjaWFkZHIxID09IDAgfHwgIXdvLT5hY2NlcHRfcmVtb3RlKSkgeworICAgICAgICAgIG9yYyA9IENPTkZOQUs7CisgICAgICAgICAgaWYgKCFyZWplY3RfaWZfZGlzYWdyZWUpIHsKKyAgICAgICAgICAgIERFQ1BUUihzaXplb2YodTMyX3QpLCBwKTsKKyAgICAgICAgICAgIHRsID0gbnRvaGwod28tPmhpc2FkZHIpOworICAgICAgICAgICAgUFVUTE9ORyh0bCwgcCk7CisgICAgICAgICAgfQorICAgICAgICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJpcGNwX3JlcWNpOiBOYWsgQUREUiAlc1xuIiwgaW5ldF9udG9hKGNpYWRkcjEpKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2lhZGRyMSA9PSAwICYmIHdvLT5oaXNhZGRyID09IDApIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIERvbid0IEFDSyBhbiBhZGRyZXNzIG9mIDAuMC4wLjAgLSByZWplY3QgaXQgaW5zdGVhZC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBJUENQREVCVUcoTE9HX0lORk8sICgiaXBjcF9yZXFjaTogUmVqZWN0IEFERFIgJXNcbiIsIGluZXRfbnRvYShjaWFkZHIxKSkpOworICAgICAgICAgIG9yYyA9IENPTkZSRUo7CisgICAgICAgICAgd28tPnJlcV9hZGRyID0gMDsgIC8qIGRvbid0IE5BSyB3aXRoIDAuMC4wLjAgbGF0ZXIgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGhvLT5uZWdfYWRkciA9IDE7CisgICAgICAgIGhvLT5oaXNhZGRyID0gY2lhZGRyMTsKKyAgICAgICAgSVBDUERFQlVHKExPR19JTkZPLCAoImlwY3BfcmVxY2k6IEFERFIgJXNcbiIsIGluZXRfbnRvYShjaWFkZHIxKSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDSV9NU19ETlMxOgorICAgICAgY2FzZSBDSV9NU19ETlMyOgorICAgICAgICAvKiBNaWNyb3NvZnQgcHJpbWFyeSBvciBzZWNvbmRhcnkgRE5TIHJlcXVlc3QgKi8KKyAgICAgICAgZCA9IGNpdHlwZSA9PSBDSV9NU19ETlMyOworCisgICAgICAgIC8qIElmIHdlIGRvIG5vdCBoYXZlIGEgRE5TIGFkZHJlc3MgdGhlbiB3ZSBjYW5ub3Qgc2VuZCBpdCAqLworICAgICAgICBpZiAoYW8tPmRuc2FkZHJbZF0gPT0gMCB8fAorICAgICAgICAgICAgY2lsZW4gIT0gQ0lMRU5fQUREUikgeyAgLyogQ2hlY2sgQ0kgbGVuZ3RoICovCisgICAgICAgICAgSVBDUERFQlVHKExPR19JTkZPLCAoImlwY3BfcmVxY2k6IFJlamVjdGluZyBETlMlZCBSZXF1ZXN0XG4iLCBkKzEpKTsKKyAgICAgICAgICBvcmMgPSBDT05GUkVKOyAgICAgICAgLyogUmVqZWN0IENJICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgR0VUTE9ORyh0bCwgcCk7CisgICAgICAgIGlmIChodG9ubCh0bCkgIT0gYW8tPmRuc2FkZHJbZF0pIHsKKyAgICAgICAgICBJUENQREVCVUcoTE9HX0lORk8sICgiaXBjcF9yZXFjaTogTmFraW5nIEROUyVkIFJlcXVlc3QgJXNcbiIsCisgICAgICAgICAgICAgICAgZCsxLCBpbmV0X250b2EodGwpKSk7CisgICAgICAgICAgREVDUFRSKHNpemVvZih1MzJfdCksIHApOworICAgICAgICAgIHRsID0gbnRvaGwoYW8tPmRuc2FkZHJbZF0pOworICAgICAgICAgIFBVVExPTkcodGwsIHApOworICAgICAgICAgIG9yYyA9IENPTkZOQUs7CisgICAgICAgIH0KKyAgICAgICAgSVBDUERFQlVHKExPR19JTkZPLCAoImlwY3BfcmVxY2k6IHJlY2VpdmVkIEROUyVkIFJlcXVlc3RcbiIsIGQrMSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDSV9NU19XSU5TMToKKyAgICAgIGNhc2UgQ0lfTVNfV0lOUzI6CisgICAgICAgIC8qIE1pY3Jvc29mdCBwcmltYXJ5IG9yIHNlY29uZGFyeSBXSU5TIHJlcXVlc3QgKi8KKyAgICAgICAgZCA9IGNpdHlwZSA9PSBDSV9NU19XSU5TMjsKKyAgICAgICAgSVBDUERFQlVHKExPR19JTkZPLCAoImlwY3BfcmVxY2k6IHJlY2VpdmVkIFdJTlMlZCBSZXF1ZXN0XG4iLCBkKzEpKTsKKworICAgICAgICAvKiBJZiB3ZSBkbyBub3QgaGF2ZSBhIEROUyBhZGRyZXNzIHRoZW4gd2UgY2Fubm90IHNlbmQgaXQgKi8KKyAgICAgICAgaWYgKGFvLT53aW5zYWRkcltkXSA9PSAwIHx8CisgICAgICAgICAgY2lsZW4gIT0gQ0lMRU5fQUREUikgeyAgLyogQ2hlY2sgQ0kgbGVuZ3RoICovCisgICAgICAgICAgb3JjID0gQ09ORlJFSjsgICAgICAvKiBSZWplY3QgQ0kgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBHRVRMT05HKHRsLCBwKTsKKyAgICAgICAgaWYgKGh0b25sKHRsKSAhPSBhby0+d2luc2FkZHJbZF0pIHsKKyAgICAgICAgICBERUNQVFIoc2l6ZW9mKHUzMl90KSwgcCk7CisgICAgICAgICAgdGwgPSBudG9obChhby0+d2luc2FkZHJbZF0pOworICAgICAgICAgIFBVVExPTkcodGwsIHApOworICAgICAgICAgIG9yYyA9IENPTkZOQUs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ0lfQ09NUFJFU1NUWVBFOgorICAgICAgICBpZiAoIWFvLT5uZWdfdmopIHsKKyAgICAgICAgICBJUENQREVCVUcoTE9HX0lORk8sICgiaXBjcF9yZXFjaTogUmVqZWN0aW5nIENPTVBSRVNTVFlQRSBub3QgYWxsb3dlZFxuIikpOworICAgICAgICAgIG9yYyA9IENPTkZSRUo7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoY2lsZW4gIT0gQ0lMRU5fVkogJiYgY2lsZW4gIT0gQ0lMRU5fQ09NUFJFU1MpIHsKKyAgICAgICAgICBJUENQREVCVUcoTE9HX0lORk8sICgiaXBjcF9yZXFjaTogUmVqZWN0aW5nIENPTVBSRVNTVFlQRSBsZW49JWRcbiIsIGNpbGVuKSk7CisgICAgICAgICAgb3JjID0gQ09ORlJFSjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKKworICAgICAgICBpZiAoIShjaXNob3J0ID09IElQQ1BfVkpfQ09NUCB8fAorICAgICAgICAgICAgKGNpc2hvcnQgPT0gSVBDUF9WSl9DT01QX09MRCAmJiBjaWxlbiA9PSBDSUxFTl9DT01QUkVTUykpKSB7CisgICAgICAgICAgSVBDUERFQlVHKExPR19JTkZPLCAoImlwY3BfcmVxY2k6IFJlamVjdGluZyBDT01QUkVTU1RZUEUgJWRcbiIsIGNpc2hvcnQpKTsKKyAgICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaG8tPm5lZ192aiA9IDE7CisgICAgICAgIGhvLT52al9wcm90b2NvbCA9IGNpc2hvcnQ7CisgICAgICAgIGlmIChjaWxlbiA9PSBDSUxFTl9WSikgeworICAgICAgICAgIEdFVENIQVIobWF4c2xvdGluZGV4LCBwKTsKKyAgICAgICAgICBpZiAobWF4c2xvdGluZGV4ID4gYW8tPm1heHNsb3RpbmRleCkgeyAKKyAgICAgICAgICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJpcGNwX3JlcWNpOiBOYWtpbmcgVkogbWF4IHNsb3QgJWRcbiIsIG1heHNsb3RpbmRleCkpOworICAgICAgICAgICAgb3JjID0gQ09ORk5BSzsKKyAgICAgICAgICAgIGlmICghcmVqZWN0X2lmX2Rpc2FncmVlKSB7CisgICAgICAgICAgICAgIERFQ1BUUigxLCBwKTsKKyAgICAgICAgICAgICAgUFVUQ0hBUihhby0+bWF4c2xvdGluZGV4LCBwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgR0VUQ0hBUihjZmxhZywgcCk7CisgICAgICAgICAgaWYgKGNmbGFnICYmICFhby0+Y2ZsYWcpIHsKKyAgICAgICAgICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJpcGNwX3JlcWNpOiBOYWtpbmcgVkogY2ZsYWcgJWRcbiIsIGNmbGFnKSk7CisgICAgICAgICAgICBvcmMgPSBDT05GTkFLOworICAgICAgICAgICAgaWYgKCFyZWplY3RfaWZfZGlzYWdyZWUpIHsKKyAgICAgICAgICAgICAgREVDUFRSKDEsIHApOworICAgICAgICAgICAgICBQVVRDSEFSKHdvLT5jZmxhZywgcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGhvLT5tYXhzbG90aW5kZXggPSBtYXhzbG90aW5kZXg7CisgICAgICAgICAgaG8tPmNmbGFnID0gY2ZsYWc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaG8tPm9sZF92aiA9IDE7CisgICAgICAgICAgaG8tPm1heHNsb3RpbmRleCA9IE1BWF9TTE9UUyAtIDE7CisgICAgICAgICAgaG8tPmNmbGFnID0gMTsKKyAgICAgICAgfQorICAgICAgICBJUENQREVCVUcoTE9HX0lORk8sICgKKyAgICAgICAgICAgICAgImlwY3BfcmVxY2k6IHJlY2VpdmVkIENPTVBSRVNTVFlQRSBwPSVkIG9sZD0lZCBtYXhzbG90PSVkIGNmbGFnPSVkXG4iLAorICAgICAgICAgICAgICBoby0+dmpfcHJvdG9jb2wsIGhvLT5vbGRfdmosIGhvLT5tYXhzbG90aW5kZXgsIGhvLT5jZmxhZykpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgSVBDUERFQlVHKExPR19JTkZPLCAoImlwY3BfcmVxY2k6IFJlamVjdGluZyB1bmtub3duIENJIHR5cGUgJWRcbiIsIGNpdHlwZSkpOworICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICBicmVhazsKKyAgICB9CisKK2VuZHN3aXRjaDoKKyAgICBpZiAob3JjID09IENPTkZBQ0sgJiYgICAgLyogR29vZCBDSSAqLworICAgICAgICByYyAhPSBDT05GQUNLKSB7ICAgICAvKiAgYnV0IHByaW9yIENJIHdhc250PyAqLworICAgICAgY29udGludWU7ICAgICAgICAgICAgICAvKiBEb24ndCBzZW5kIHRoaXMgb25lICovCisgICAgfQorCisgICAgaWYgKG9yYyA9PSBDT05GTkFLKSB7ICAgIC8qIE5hayB0aGlzIENJPyAqLworICAgICAgaWYgKHJlamVjdF9pZl9kaXNhZ3JlZSkgeyAgLyogR2V0dGluZyBmZWQgdXAgd2l0aCBzZW5kaW5nIE5BS3M/ICovCisgICAgICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJpcGNwX3JlcWNpOiBSZWplY3RpbmcgdG9vIG1hbnkgbmFrc1xuIikpOworICAgICAgICBvcmMgPSBDT05GUkVKOyAgICAgICAvKiBHZXQgdG91Z2ggaWYgc28gKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyYyA9PSBDT05GUkVKKSB7IC8qIFJlamVjdGluZyBwcmlvciBDST8gKi8KKyAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgLyogRG9uJ3Qgc2VuZCB0aGlzIG9uZSAqLworICAgICAgICB9CisgICAgICAgIGlmIChyYyA9PSBDT05GQUNLKSB7IC8qIEFjaydkIGFsbCBwcmlvciBDSXM/ICovCisgICAgICAgICAgcmMgPSBDT05GTkFLOyAgICAgIC8qIE5vdCBhbnltb3JlLi4uICovCisgICAgICAgICAgdWNwID0gaW5wOyAgICAgICAgIC8qIEJhY2t1cCAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9yYyA9PSBDT05GUkVKICYmICAgIC8qIFJlamVjdCB0aGlzIENJICovCisgICAgICAgIHJjICE9IENPTkZSRUopIHsgIC8qICBidXQgbm8gcHJpb3Igb25lcz8gKi8KKyAgICAgIHJjID0gQ09ORlJFSjsKKyAgICAgIHVjcCA9IGlucDsgICAgICAgIC8qIEJhY2t1cCAqLworICAgIH0KKyAgICAKKyAgICAvKiBOZWVkIHRvIG1vdmUgQ0k/ICovCisgICAgaWYgKHVjcCAhPSBjaXApIHsKKyAgICAgIEJDT1BZKGNpcCwgdWNwLCBjaWxlbik7ICAvKiBNb3ZlIGl0ICovCisgICAgfQorCisgICAgLyogVXBkYXRlIG91dHB1dCBwb2ludGVyICovCisgICAgSU5DUFRSKGNpbGVuLCB1Y3ApOworICB9CisKKyAgLyoKKyAgICogSWYgd2UgYXJlbid0IHJlamVjdGluZyB0aGlzIHBhY2tldCwgYW5kIHdlIHdhbnQgdG8gbmVnb3RpYXRlCisgICAqIHRoZWlyIGFkZHJlc3MsIGFuZCB0aGV5IGRpZG4ndCBzZW5kIHRoZWlyIGFkZHJlc3MsIHRoZW4gd2UKKyAgICogc2VuZCBhIE5BSyB3aXRoIGEgQ0lfQUREUiBvcHRpb24gYXBwZW5kZWQuICBXZSBhc3N1bWUgdGhlCisgICAqIGlucHV0IGJ1ZmZlciBpcyBsb25nIGVub3VnaCB0aGF0IHdlIGNhbiBhcHBlbmQgdGhlIGV4dHJhCisgICAqIG9wdGlvbiBzYWZlbHkuCisgICAqLworICBpZiAocmMgIT0gQ09ORlJFSiAmJiAhaG8tPm5lZ19hZGRyICYmCisgICAgICB3by0+cmVxX2FkZHIgJiYgIXJlamVjdF9pZl9kaXNhZ3JlZSkgeworICAgIElQQ1BERUJVRyhMT0dfSU5GTywgKCJpcGNwX3JlcWNpOiBSZXF1ZXN0aW5nIHBlZXIgYWRkcmVzc1xuIikpOworICAgIGlmIChyYyA9PSBDT05GQUNLKSB7CisgICAgICByYyA9IENPTkZOQUs7CisgICAgICB1Y3AgPSBpbnA7ICAgICAgICAvKiByZXNldCBwb2ludGVyICovCisgICAgICB3by0+cmVxX2FkZHIgPSAwOyAgICAvKiBkb24ndCBhc2sgYWdhaW4gKi8KKyAgICB9CisgICAgUFVUQ0hBUihDSV9BRERSLCB1Y3ApOworICAgIFBVVENIQVIoQ0lMRU5fQUREUiwgdWNwKTsKKyAgICB0bCA9IG50b2hsKHdvLT5oaXNhZGRyKTsKKyAgICBQVVRMT05HKHRsLCB1Y3ApOworICB9CisKKyAgKmxlbiA9IChpbnQpKHVjcCAtIGlucCk7ICAgIC8qIENvbXB1dGUgb3V0cHV0IGxlbmd0aCAqLworICBJUENQREVCVUcoTE9HX0lORk8sICgiaXBjcF9yZXFjaTogcmV0dXJuaW5nIENvbmZpZ3VyZS0lc1xuIiwgQ09ERU5BTUUocmMpKSk7CisgIHJldHVybiAocmMpOyAgICAgIC8qIFJldHVybiBmaW5hbCBjb2RlICovCit9CisKKworI2lmIDAKKy8qCisgKiBpcF9jaGVja19vcHRpb25zIC0gY2hlY2sgdGhhdCBhbnkgSVAtcmVsYXRlZCBvcHRpb25zIGFyZSBPSywKKyAqIGFuZCBhc3NpZ24gYXBwcm9wcmlhdGUgZGVmYXVsdHMuCisgKi8KK3N0YXRpYyB2b2lkCitpcF9jaGVja19vcHRpb25zKHVfbG9uZyBsb2NhbEFkZHIpCit7CisgIGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1swXTsKKworICAvKgorICAgKiBMb2FkIG91ciBkZWZhdWx0IElQIGFkZHJlc3MgYnV0IGFsbG93IHRoZSByZW1vdGUgaG9zdCB0byBnaXZlIHVzCisgICAqIGEgbmV3IGFkZHJlc3MuCisgICAqLworICBpZiAod28tPm91cmFkZHIgPT0gMCAmJiAhcHBwX3NldHRpbmdzLmRpc2FibGVfZGVmYXVsdGlwKSB7CisgICAgd28tPmFjY2VwdF9sb2NhbCA9IDE7ICAvKiBkb24ndCBpbnNpc3Qgb24gdGhpcyBkZWZhdWx0IHZhbHVlICovCisgICAgd28tPm91cmFkZHIgPSBodG9ubChsb2NhbEFkZHIpOworICB9Cit9CisjZW5kaWYKKworCisvKgorICogaXBjcF91cCAtIElQQ1AgaGFzIGNvbWUgVVAuCisgKgorICogQ29uZmlndXJlIHRoZSBJUCBuZXR3b3JrIGludGVyZmFjZSBhcHByb3ByaWF0ZWx5IGFuZCBicmluZyBpdCB1cC4KKyAqLworc3RhdGljIHZvaWQKK2lwY3BfdXAoZnNtICpmKQoreworICB1MzJfdCBtYXNrOworICBpcGNwX29wdGlvbnMgKmhvID0gJmlwY3BfaGlzb3B0aW9uc1tmLT51bml0XTsKKyAgaXBjcF9vcHRpb25zICpnbyA9ICZpcGNwX2dvdG9wdGlvbnNbZi0+dW5pdF07CisgIGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1tmLT51bml0XTsKKworICBucF91cChmLT51bml0LCBQUFBfSVApOworICBJUENQREVCVUcoTE9HX0lORk8sICgiaXBjcDogdXBcbiIpKTsKKworICAvKgorICAgKiBXZSBtdXN0IGhhdmUgYSBub24temVybyBJUCBhZGRyZXNzIGZvciBib3RoIGVuZHMgb2YgdGhlIGxpbmsuCisgICAqLworICBpZiAoIWhvLT5uZWdfYWRkcikgeworICAgIGhvLT5oaXNhZGRyID0gd28tPmhpc2FkZHI7CisgIH0KKworICBpZiAoaG8tPmhpc2FkZHIgPT0gMCkgeworICAgIElQQ1BERUJVRyhMT0dfRVJSLCAoIkNvdWxkIG5vdCBkZXRlcm1pbmUgcmVtb3RlIElQIGFkZHJlc3NcbiIpKTsKKyAgICBpcGNwX2Nsb3NlKGYtPnVuaXQsICJDb3VsZCBub3QgZGV0ZXJtaW5lIHJlbW90ZSBJUCBhZGRyZXNzIik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChnby0+b3VyYWRkciA9PSAwKSB7CisgICAgSVBDUERFQlVHKExPR19FUlIsICgiQ291bGQgbm90IGRldGVybWluZSBsb2NhbCBJUCBhZGRyZXNzXG4iKSk7CisgICAgaXBjcF9jbG9zZShmLT51bml0LCAiQ291bGQgbm90IGRldGVybWluZSBsb2NhbCBJUCBhZGRyZXNzIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHBwcF9zZXR0aW5ncy51c2VwZWVyZG5zICYmIChnby0+ZG5zYWRkclswXSB8fCBnby0+ZG5zYWRkclsxXSkpIHsKKyAgICAvKnBwcEdvdEROU0FkZHJzKGdvLT5kbnNhZGRyWzBdLCBnby0+ZG5zYWRkclsxXSk7Ki8KKyAgfQorCisgIC8qCisgICAqIENoZWNrIHRoYXQgdGhlIHBlZXIgaXMgYWxsb3dlZCB0byB1c2UgdGhlIElQIGFkZHJlc3MgaXQgd2FudHMuCisgICAqLworICBpZiAoIWF1dGhfaXBfYWRkcihmLT51bml0LCBoby0+aGlzYWRkcikpIHsKKyAgICBJUENQREVCVUcoTE9HX0VSUiwgKCJQZWVyIGlzIG5vdCBhdXRob3JpemVkIHRvIHVzZSByZW1vdGUgYWRkcmVzcyAlc1xuIiwKKyAgICAgICAgaW5ldF9udG9hKGhvLT5oaXNhZGRyKSkpOworICAgIGlwY3BfY2xvc2UoZi0+dW5pdCwgIlVuYXV0aG9yaXplZCByZW1vdGUgSVAgYWRkcmVzcyIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIHNldCB0Y3AgY29tcHJlc3Npb24gKi8KKyAgc2lmdmpjb21wKGYtPnVuaXQsIGhvLT5uZWdfdmosIGhvLT5jZmxhZywgaG8tPm1heHNsb3RpbmRleCk7CisKKyAgLyoKKyAgICogU2V0IElQIGFkZHJlc3NlcyBhbmQgKGlmIHNwZWNpZmllZCkgbmV0bWFzay4KKyAgICovCisgIG1hc2sgPSBHZXRNYXNrKGdvLT5vdXJhZGRyKTsKKworICBpZiAoIXNpZmFkZHIoZi0+dW5pdCwgZ28tPm91cmFkZHIsIGhvLT5oaXNhZGRyLCBtYXNrLCBnby0+ZG5zYWRkclswXSwgZ28tPmRuc2FkZHJbMV0pKSB7CisgICAgSVBDUERFQlVHKExPR19XQVJOSU5HLCAoInNpZmFkZHIgZmFpbGVkXG4iKSk7CisgICAgaXBjcF9jbG9zZShmLT51bml0LCAiSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogYnJpbmcgdGhlIGludGVyZmFjZSB1cCBmb3IgSVAgKi8KKyAgaWYgKCFzaWZ1cChmLT51bml0KSkgeworICAgIElQQ1BERUJVRyhMT0dfV0FSTklORywgKCJzaWZ1cCBmYWlsZWRcbiIpKTsKKyAgICBpcGNwX2Nsb3NlKGYtPnVuaXQsICJJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzaWZucG1vZGUoZi0+dW5pdCwgUFBQX0lQLCBOUE1PREVfUEFTUyk7CisKKyAgLyogYXNzaWduIGEgZGVmYXVsdCByb3V0ZSB0aHJvdWdoIHRoZSBpbnRlcmZhY2UgaWYgcmVxdWlyZWQgKi8KKyAgaWYgKGlwY3Bfd2FudG9wdGlvbnNbZi0+dW5pdF0uZGVmYXVsdF9yb3V0ZSkgeworICAgIGlmIChzaWZkZWZhdWx0cm91dGUoZi0+dW5pdCwgZ28tPm91cmFkZHIsIGhvLT5oaXNhZGRyKSkgeworICAgICAgZGVmYXVsdF9yb3V0ZV9zZXRbZi0+dW5pdF0gPSAxOworICAgIH0KKyAgfQorCisgIElQQ1BERUJVRyhMT0dfTk9USUNFLCAoImxvY2FsICBJUCBhZGRyZXNzICVzXG4iLCBpbmV0X250b2EoZ28tPm91cmFkZHIpKSk7CisgIElQQ1BERUJVRyhMT0dfTk9USUNFLCAoInJlbW90ZSBJUCBhZGRyZXNzICVzXG4iLCBpbmV0X250b2EoaG8tPmhpc2FkZHIpKSk7CisgIGlmIChnby0+ZG5zYWRkclswXSkgeworICAgIElQQ1BERUJVRyhMT0dfTk9USUNFLCAoInByaW1hcnkgICBETlMgYWRkcmVzcyAlc1xuIiwgaW5ldF9udG9hKGdvLT5kbnNhZGRyWzBdKSkpOworICB9CisgIGlmIChnby0+ZG5zYWRkclsxXSkgeworICAgIElQQ1BERUJVRyhMT0dfTk9USUNFLCAoInNlY29uZGFyeSBETlMgYWRkcmVzcyAlc1xuIiwgaW5ldF9udG9hKGdvLT5kbnNhZGRyWzFdKSkpOworICB9Cit9CisKKworLyoKKyAqIGlwY3BfZG93biAtIElQQ1AgaGFzIGdvbmUgRE9XTi4KKyAqCisgKiBUYWtlIHRoZSBJUCBuZXR3b3JrIGludGVyZmFjZSBkb3duLCBjbGVhciBpdHMgYWRkcmVzc2VzCisgKiBhbmQgZGVsZXRlIHJvdXRlcyB0aHJvdWdoIGl0LgorICovCitzdGF0aWMgdm9pZAoraXBjcF9kb3duKGZzbSAqZikKK3sKKyAgSVBDUERFQlVHKExPR19JTkZPLCAoImlwY3A6IGRvd25cbiIpKTsKKyAgbnBfZG93bihmLT51bml0LCBQUFBfSVApOworICBzaWZ2amNvbXAoZi0+dW5pdCwgMCwgMCwgMCk7CisKKyAgc2lmZG93bihmLT51bml0KTsKKyAgaXBjcF9jbGVhcl9hZGRycyhmLT51bml0KTsKK30KKworCisvKgorICogaXBjcF9jbGVhcl9hZGRycygpIC0gY2xlYXIgdGhlIGludGVyZmFjZSBhZGRyZXNzZXMsIHJvdXRlcywgZXRjLgorICovCitzdGF0aWMgdm9pZAoraXBjcF9jbGVhcl9hZGRycyhpbnQgdW5pdCkKK3sKKyAgdTMyX3Qgb3VyYWRkciwgaGlzYWRkcjsKKworICBvdXJhZGRyID0gaXBjcF9nb3RvcHRpb25zW3VuaXRdLm91cmFkZHI7CisgIGhpc2FkZHIgPSBpcGNwX2hpc29wdGlvbnNbdW5pdF0uaGlzYWRkcjsKKyAgaWYgKGRlZmF1bHRfcm91dGVfc2V0W3VuaXRdKSB7CisgICAgY2lmZGVmYXVsdHJvdXRlKHVuaXQsIG91cmFkZHIsIGhpc2FkZHIpOworICAgIGRlZmF1bHRfcm91dGVfc2V0W3VuaXRdID0gMDsKKyAgfQorICBjaWZhZGRyKHVuaXQsIG91cmFkZHIsIGhpc2FkZHIpOworfQorCisKKy8qCisgKiBpcGNwX2ZpbmlzaGVkIC0gcG9zc2libHkgc2h1dCBkb3duIHRoZSBsb3dlciBsYXllcnMuCisgKi8KK3N0YXRpYyB2b2lkCitpcGNwX2ZpbmlzaGVkKGZzbSAqZikKK3sKKyAgbnBfZmluaXNoZWQoZi0+dW5pdCwgUFBQX0lQKTsKK30KKworI2lmIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUworc3RhdGljIGludAoraXBjcF9wcmludHBrdCh1X2NoYXIgKnAsIGludCBwbGVuLCB2b2lkICgqcHJpbnRlcikgKHZvaWQgKiwgY2hhciAqLCAuLi4pLCB2b2lkICphcmcpCit7CisgIExXSVBfVU5VU0VEX0FSRyhwKTsKKyAgTFdJUF9VTlVTRURfQVJHKHBsZW4pOworICBMV0lQX1VOVVNFRF9BUkcocHJpbnRlcik7CisgIExXSVBfVU5VU0VEX0FSRyhhcmcpOworICByZXR1cm4gMDsKK30KKworLyoKKyAqIGlwX2FjdGl2ZV9wa3QgLSBzZWUgaWYgdGhpcyBJUCBwYWNrZXQgaXMgd29ydGggYnJpbmdpbmcgdGhlIGxpbmsgdXAgZm9yLgorICogV2UgZG9uJ3QgYnJpbmcgdGhlIGxpbmsgdXAgZm9yIElQIGZyYWdtZW50cyBvciBmb3IgVENQIEZJTiBwYWNrZXRzCisgKiB3aXRoIG5vIGRhdGEuCisgKi8KKyNkZWZpbmUgSVBfSERSTEVOICAgMjAgIC8qIGJ5dGVzICovCisjZGVmaW5lIElQX09GRk1BU0sgIDB4MWZmZgorI2RlZmluZSBJUFBST1RPX1RDUCA2CisjZGVmaW5lIFRDUF9IRFJMRU4gIDIwCisjZGVmaW5lIFRIX0ZJTiAgICAgIDB4MDEKKworLyoKKyAqIFdlIHVzZSB0aGVzZSBtYWNyb3MgYmVjYXVzZSB0aGUgSVAgaGVhZGVyIG1heSBiZSBhdCBhbiBvZGQgYWRkcmVzcywKKyAqIGFuZCBzb21lIGNvbXBpbGVycyBtaWdodCB1c2Ugd29yZCBsb2FkcyB0byBnZXQgdGhfb2ZmIG9yIGlwX2hsLgorICovCisKKyNkZWZpbmUgbmV0X3Nob3J0KHgpICAgICgoKHgpWzBdIDw8IDgpICsgKHgpWzFdKQorI2RlZmluZSBnZXRfaXBobCh4KSAgICAgKCgodW5zaWduZWQgY2hhciAqKSh4KSlbMF0gJiAweEYpCisjZGVmaW5lIGdldF9pcG9mZih4KSAgICBuZXRfc2hvcnQoKHVuc2lnbmVkIGNoYXIgKikoeCkgKyA2KQorI2RlZmluZSBnZXRfaXBwcm90byh4KSAgKCgodW5zaWduZWQgY2hhciAqKSh4KSlbOV0pCisjZGVmaW5lIGdldF90Y3BvZmYoeCkgICAoKCh1bnNpZ25lZCBjaGFyICopKHgpKVsxMl0gPj4gNCkKKyNkZWZpbmUgZ2V0X3RjcGZsYWdzKHgpICgoKHVuc2lnbmVkIGNoYXIgKikoeCkpWzEzXSkKKworc3RhdGljIGludAoraXBfYWN0aXZlX3BrdCh1X2NoYXIgKnBrdCwgaW50IGxlbikKK3sKKyAgdV9jaGFyICp0Y3A7CisgIGludCBobGVuOworCisgIGxlbiAtPSBQUFBfSERSTEVOOworICBwa3QgKz0gUFBQX0hEUkxFTjsKKyAgaWYgKGxlbiA8IElQX0hEUkxFTikgeworICAgIHJldHVybiAwOworICB9CisgIGlmICgoZ2V0X2lwb2ZmKHBrdCkgJiBJUF9PRkZNQVNLKSAhPSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGdldF9pcHByb3RvKHBrdCkgIT0gSVBQUk9UT19UQ1ApIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBobGVuID0gZ2V0X2lwaGwocGt0KSAqIDQ7CisgIGlmIChsZW4gPCBobGVuICsgVENQX0hEUkxFTikgeworICAgIHJldHVybiAwOworICB9CisgIHRjcCA9IHBrdCArIGhsZW47CisgIGlmICgoZ2V0X3RjcGZsYWdzKHRjcCkgJiBUSF9GSU4pICE9IDAgJiYgbGVuID09IGhsZW4gKyBnZXRfdGNwb2ZmKHRjcCkgKiA0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogUFBQX0FERElUSU9OQUxfQ0FMTEJBQ0tTICovCisKKyNlbmRpZiAvKiBQUFBfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvaXBjcC5oIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvaXBjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMDNmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9pcGNwLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBpcGNwLmggLSAgUFBQIElQIE5DUDogSW50ZXJuZXQgUHJvdG9jb2wgTmV0d29yayBDb250cm9sIFByb3RvY29sIGhlYWRlciBmaWxlLgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgTWFyYyBCb3VjaGVyLCBTZXJ2aWNlcyBJbmZvcm1hdGlxdWVzIChNQlNJKSBpbmMuCisqIHBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NyBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqCisqIFRoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLAorKiBhbmQgbGljZW5zZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkCisqIHRoYXQgZXhpc3RpbmcgY29weXJpZ2h0IG5vdGljZXMgYXJlIHJldGFpbmVkIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcworKiBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBhcmUgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55IAorKiBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwgbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMgcmVxdWlyZWQKKyogZm9yIGFueSBvZiB0aGUgYXV0aG9yaXplZCB1c2VzLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT05UUklCVVRPUlMgKkFTIElTKiBBTkQgQU5ZIEVYUFJFU1MgT1IKKyogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAKKyogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSRVZJU0lPTiBISVNUT1JZCisqCisqIDAzLTAxLTAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorKiAgIFBvcnRlZCB0byBsd0lQLgorKiA5Ny0xMi0wNCBHdXkgTGFuY2FzdGVyIDxnbGFuY2FAZ2Vzbi5jb20+LCBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqICAgT3JpZ2luYWwgZGVyaXZlZCBmcm9tIEJTRCBjb2Rlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGlwY3AuaCAtIElQIENvbnRyb2wgUHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogJElkOiBpcGNwLmgsdiAxLjQgMjAxMC8wMS8xOCAyMDo0OTo0MyBnb2xkc2ltb24gRXhwICQKKyAqLworCisjaWZuZGVmIElQQ1BfSAorI2RlZmluZSBJUENQX0gKKworLyoKKyAqIE9wdGlvbnMuCisgKi8KKyNkZWZpbmUgQ0lfQUREUlMgICAgICAgICAgICAxICAgICAgLyogSVAgQWRkcmVzc2VzICovCisjZGVmaW5lIENJX0NPTVBSRVNTVFlQRSAgICAgMiAgICAgIC8qIENvbXByZXNzaW9uIFR5cGUgKi8KKyNkZWZpbmUgQ0lfQUREUiAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQ0lfTVNfRE5TMSAgICAgICAgICAxMjkgICAgLyogUHJpbWFyeSBETlMgdmFsdWUgKi8KKyNkZWZpbmUgQ0lfTVNfV0lOUzEgICAgICAgICAxMjggICAgLyogUHJpbWFyeSBXSU5TIHZhbHVlICovCisjZGVmaW5lIENJX01TX0ROUzIgICAgICAgICAgMTMxICAgIC8qIFNlY29uZGFyeSBETlMgdmFsdWUgKi8KKyNkZWZpbmUgQ0lfTVNfV0lOUzIgICAgICAgICAxMzAgICAgLyogU2Vjb25kYXJ5IFdJTlMgdmFsdWUgKi8KKworI2RlZmluZSBJUENQX1ZKTU9ERV9PTEQgICAgIDEgICAgICAvKiAib2xkIiBtb2RlIChvcHRpb24gIyA9IDB4MDAzNykgKi8KKyNkZWZpbmUgSVBDUF9WSk1PREVfUkZDMTE3MiAyICAgICAgLyogIm9sZC1yZmMibW9kZSAob3B0aW9uICMgPSAweDAwMmQpICovCisjZGVmaW5lIElQQ1BfVkpNT0RFX1JGQzEzMzIgMyAgICAgIC8qICJuZXctcmZjIm1vZGUgKG9wdGlvbiAjID0gMHgwMDJkLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgbWF4c2xvdCBhbmQgc2xvdCBudW1iZXIgY29tcHJlc3Npb24pICovCisKKyNkZWZpbmUgSVBDUF9WSl9DT01QICAgICAgICAweDAwMmQgLyogY3VycmVudCB2YWx1ZSBmb3IgVkogY29tcHJlc3Npb24gb3B0aW9uICovCisjZGVmaW5lIElQQ1BfVkpfQ09NUF9PTEQgICAgMHgwMDM3IC8qICJvbGQiIChpLmUsIGJyb2tlbikgdmFsdWUgZm9yIFZKICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIG9wdGlvbiAqLyAKKwordHlwZWRlZiBzdHJ1Y3QgaXBjcF9vcHRpb25zIHsKKyAgdV9pbnQgICBuZWdfYWRkciAgICAgIDogMTsgLyogTmVnb3RpYXRlIElQIEFkZHJlc3M/ICovCisgIHVfaW50ICAgb2xkX2FkZHJzICAgICA6IDE7IC8qIFVzZSBvbGQgKElQLUFkZHJlc3Nlcykgb3B0aW9uPyAqLworICB1X2ludCAgIHJlcV9hZGRyICAgICAgOiAxOyAvKiBBc2sgcGVlciB0byBzZW5kIElQIGFkZHJlc3M/ICovCisgIHVfaW50ICAgZGVmYXVsdF9yb3V0ZSA6IDE7IC8qIEFzc2lnbiBkZWZhdWx0IHJvdXRlIHRocm91Z2ggaW50ZXJmYWNlPyAqLworICB1X2ludCAgIHByb3h5X2FycCAgICAgOiAxOyAvKiBNYWtlIHByb3h5IEFSUCBlbnRyeSBmb3IgcGVlcj8gKi8KKyAgdV9pbnQgICBuZWdfdmogICAgICAgIDogMTsgLyogVmFuIEphY29ic29uIENvbXByZXNzaW9uPyAqLworICB1X2ludCAgIG9sZF92aiAgICAgICAgOiAxOyAvKiB1c2Ugb2xkIChzaG9ydCkgZm9ybSBvZiBWSiBvcHRpb24/ICovCisgIHVfaW50ICAgYWNjZXB0X2xvY2FsICA6IDE7IC8qIGFjY2VwdCBwZWVyJ3MgdmFsdWUgZm9yIG91cmFkZHIgKi8KKyAgdV9pbnQgICBhY2NlcHRfcmVtb3RlIDogMTsgLyogYWNjZXB0IHBlZXIncyB2YWx1ZSBmb3IgaGlzYWRkciAqLworICB1X2ludCAgIHJlcV9kbnMxICAgICAgOiAxOyAvKiBBc2sgcGVlciB0byBzZW5kIHByaW1hcnkgRE5TIGFkZHJlc3M/ICovCisgIHVfaW50ICAgcmVxX2RuczIgICAgICA6IDE7IC8qIEFzayBwZWVyIHRvIHNlbmQgc2Vjb25kYXJ5IEROUyBhZGRyZXNzPyAqLworICB1X3Nob3J0IHZqX3Byb3RvY29sOyAgICAgICAvKiBwcm90b2NvbCB2YWx1ZSB0byB1c2UgaW4gVkogb3B0aW9uICovCisgIHVfY2hhciAgbWF4c2xvdGluZGV4OyAgICAgIC8qIFZKIHNsb3RzIC0gMS4gKi8KKyAgdV9jaGFyICBjZmxhZzsgICAgICAgICAgICAgLyogVkogc2xvdCBjb21wcmVzc2lvbiBmbGFnLiAqLworICB1MzJfdCAgIG91cmFkZHIsIGhpc2FkZHI7ICAvKiBBZGRyZXNzZXMgaW4gTkVUV09SSyBCWVRFIE9SREVSICovCisgIHUzMl90ICAgZG5zYWRkclsyXTsgICAgICAgIC8qIFByaW1hcnkgYW5kIHNlY29uZGFyeSBNUyBETlMgZW50cmllcyAqLworICB1MzJfdCAgIHdpbnNhZGRyWzJdOyAgICAgICAvKiBQcmltYXJ5IGFuZCBzZWNvbmRhcnkgTVMgV0lOUyBlbnRyaWVzICovCit9IGlwY3Bfb3B0aW9uczsKKworZXh0ZXJuIGZzbSBpcGNwX2ZzbVtdOworZXh0ZXJuIGlwY3Bfb3B0aW9ucyBpcGNwX3dhbnRvcHRpb25zW107CitleHRlcm4gaXBjcF9vcHRpb25zIGlwY3BfZ290b3B0aW9uc1tdOworZXh0ZXJuIGlwY3Bfb3B0aW9ucyBpcGNwX2FsbG93b3B0aW9uc1tdOworZXh0ZXJuIGlwY3Bfb3B0aW9ucyBpcGNwX2hpc29wdGlvbnNbXTsKKworZXh0ZXJuIHN0cnVjdCBwcm90ZW50IGlwY3BfcHJvdGVudDsKKworI2VuZGlmIC8qIElQQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvbGNwLmMgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9sY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWM4M2FjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvbGNwLmMKQEAgLTAsMCArMSwyMDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbGNwLmMgLSBOZXR3b3JrIExpbmsgQ29udHJvbCBQcm90b2NvbCBwcm9ncmFtIGZpbGUuCisqCisqIENvcHlyaWdodCAoYykgMjAwMyBieSBNYXJjIEJvdWNoZXIsIFNlcnZpY2VzIEluZm9ybWF0aXF1ZXMgKE1CU0kpIGluYy4KKyogcG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk3IGJ5IEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyoKKyogVGhlIGF1dGhvcnMgaGVyZWJ5IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsCisqIGFuZCBsaWNlbnNlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQKKyogdGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCB0aGlzCisqIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGFyZSBpbmNsdWRlZCB2ZXJiYXRpbSBpbiBhbnkgCisqIGRpc3RyaWJ1dGlvbnMuIE5vIHdyaXR0ZW4gYWdyZWVtZW50LCBsaWNlbnNlLCBvciByb3lhbHR5IGZlZSBpcyByZXF1aXJlZAorKiBmb3IgYW55IG9mIHRoZSBhdXRob3JpemVkIHVzZXMuCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPTlRSSUJVVE9SUyAqQVMgSVMqIEFORCBBTlkgRVhQUkVTUyBPUgorKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIAorKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJFVklTSU9OIEhJU1RPUlkKKyoKKyogMDMtMDEtMDEgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisqICAgUG9ydGVkIHRvIGx3SVAuCisqIDk3LTEyLTAxIEd1eSBMYW5jYXN0ZXIgPGxhbmNhc3RlcmdAYWNtLm9yZz4sIEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyogICBPcmlnaW5hbC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogbGNwLmMgLSBQUFAgTGluayBDb250cm9sIFByb3RvY29sLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisgCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgUFBQX1NVUFBPUlQgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJwcHAuaCIKKyNpbmNsdWRlICJwcHBkZWJ1Zy5oIgorCisjaW5jbHVkZSAiZnNtLmgiCisjaW5jbHVkZSAiY2hhcC5oIgorI2luY2x1ZGUgIm1hZ2ljLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgImxjcC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBQUFBPRV9TVVBQT1JUCisjaW5jbHVkZSAibmV0aWYvcHBwX29lLmgiCisjZWxzZQorI2RlZmluZSBQUFBPRV9NQVhNVFUgUFBQX01BWE1SVQorI2VuZGlmCisKKyNpZiAwIC8qIFVOVVNFRCAqLworLyoKKyAqIExDUC1yZWxhdGVkIGNvbW1hbmQtbGluZSBvcHRpb25zLgorICovCitpbnQgbGNwX2VjaG9faW50ZXJ2YWwgPSAwOyAgLyogSW50ZXJ2YWwgYmV0d2VlbiBMQ1AgZWNoby1yZXF1ZXN0cyAqLworaW50IGxjcF9lY2hvX2ZhaWxzID0gMDsgICAgIC8qIFRvbGVyYW5jZSB0byB1bmFuc3dlcmVkIGVjaG8tcmVxdWVzdHMgKi8KK2Jvb2wgIGxheF9yZWN2ID0gMDsgICAgICAgICAvKiBhY2NlcHQgY29udHJvbCBjaGFycyBpbiBhc3luY21hcCAqLworCitzdGF0aWMgaW50IHNldGVzY2FwZSAoY2hhciAqKik7CisKK3N0YXRpYyBvcHRpb25fdCBsY3Bfb3B0aW9uX2xpc3RbXSA9IHsKKyAgICAvKiBMQ1Agb3B0aW9ucyAqLworICAgIC8qIGxpc3Qgc3RyaXBwZWQgZm9yIHNpbXBsaWNpdHkgKi8KKyAgICB7TlVMTH0KK307CisjZW5kaWYgLyogVU5VU0VEICovCisKKy8qIG9wdGlvbnMgKi8KK0xpbmtQaGFzZSBsY3BfcGhhc2VbTlVNX1BQUF07ICAgICAgICAgIC8qIFBoYXNlIG9mIGxpbmsgc2Vzc2lvbiAoUkZDIDE2NjEpICovCitzdGF0aWMgdV9pbnQgbGNwX2VjaG9faW50ZXJ2YWwgICAgICA9IExDUF9FQ0hPSU5URVJWQUw7IC8qIEludGVydmFsIGJldHdlZW4gTENQIGVjaG8tcmVxdWVzdHMgKi8KK3N0YXRpYyB1X2ludCBsY3BfZWNob19mYWlscyAgICAgICAgID0gTENQX01BWEVDSE9GQUlMUzsgLyogVG9sZXJhbmNlIHRvIHVuYW5zd2VyZWQgZWNoby1yZXF1ZXN0cyAqLworCisvKiBnbG9iYWwgdmFycyAqLworc3RhdGljIGZzbSBsY3BfZnNtW05VTV9QUFBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMQ1AgZnNtIHN0cnVjdHVyZSAoZ2xvYmFsKSovCitsY3Bfb3B0aW9ucyBsY3Bfd2FudG9wdGlvbnNbTlVNX1BQUF07ICAvKiBPcHRpb25zIHRoYXQgd2Ugd2FudCB0byByZXF1ZXN0ICovCitsY3Bfb3B0aW9ucyBsY3BfZ290b3B0aW9uc1tOVU1fUFBQXTsgICAvKiBPcHRpb25zIHRoYXQgcGVlciBhY2snZCAqLworbGNwX29wdGlvbnMgbGNwX2FsbG93b3B0aW9uc1tOVU1fUFBQXTsgLyogT3B0aW9ucyB3ZSBhbGxvdyBwZWVyIHRvIHJlcXVlc3QgKi8KK2xjcF9vcHRpb25zIGxjcF9oaXNvcHRpb25zW05VTV9QUFBdOyAgIC8qIE9wdGlvbnMgdGhhdCB3ZSBhY2snZCAqLworZXh0X2FjY20geG1pdF9hY2NtW05VTV9QUFBdOyAgICAgICAgICAgLyogZXh0ZW5kZWQgdHJhbnNtaXQgQUNDTSAqLworCitzdGF0aWMgdTMyX3QgbGNwX2VjaG9zX3BlbmRpbmcgICAgICA9IDA7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBvdXRzdGFuZGluZyBlY2hvIG1zZ3MgKi8KK3N0YXRpYyB1MzJfdCBsY3BfZWNob19udW1iZXIgICAgICAgID0gMDsgICAgICAgICAgICAgICAgLyogSUQgbnVtYmVyIG9mIG5leHQgZWNobyBmcmFtZSAqLworc3RhdGljIHUzMl90IGxjcF9lY2hvX3RpbWVyX3J1bm5pbmcgPSAwOyAgICAgICAgICAgICAgICAvKiBUUlVFIGlmIGEgdGltZXIgaXMgcnVubmluZyAqLworCisvKiBAdG9kbzogZG8gd2UgcmVhbGx5IG5lZWQgc3VjaCBhIGxhcmdlIGJ1ZmZlcj8gVGhlIHR5cGljYWwgMTUwMCBieXRlcyBzZWVtIHRvbyBtdWNoLiAqLworc3RhdGljIHVfY2hhciBuYWtfYnVmZmVyW1BQUF9NUlVdOyAvKiB3aGVyZSB3ZSBjb25zdHJ1Y3QgYSBuYWsgcGFja2V0ICovIAorCisvKgorICogQ2FsbGJhY2tzIGZvciBmc20gY29kZS4gIChDSSA9IENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24pCisgKi8KK3N0YXRpYyB2b2lkIGxjcF9yZXNldGNpIChmc20qKTsgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgb3VyIENJICovCitzdGF0aWMgaW50ICBsY3BfY2lsZW4gKGZzbSopOyAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBsZW5ndGggb2Ygb3VyIENJICovCitzdGF0aWMgdm9pZCBsY3BfYWRkY2kgKGZzbSosIHVfY2hhciosIGludCopOyAgICAgIC8qIEFkZCBvdXIgQ0kgdG8gcGt0ICovCitzdGF0aWMgaW50ICBsY3BfYWNrY2kgKGZzbSosIHVfY2hhciosIGludCk7ICAgICAgIC8qIFBlZXIgYWNrJ2Qgb3VyIENJICovCitzdGF0aWMgaW50ICBsY3BfbmFrY2kgKGZzbSosIHVfY2hhciosIGludCk7ICAgICAgIC8qIFBlZXIgbmFrJ2Qgb3VyIENJICovCitzdGF0aWMgaW50ICBsY3BfcmVqY2kgKGZzbSosIHVfY2hhciosIGludCk7ICAgICAgIC8qIFBlZXIgcmVqJ2Qgb3VyIENJICovCitzdGF0aWMgaW50ICBsY3BfcmVxY2kgKGZzbSosIHVfY2hhciosIGludCosIGludCk7IC8qIFJjdiBwZWVyIENJICovCitzdGF0aWMgdm9pZCBsY3BfdXAgKGZzbSopOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlJ3JlIFVQICovCitzdGF0aWMgdm9pZCBsY3BfZG93biAoZnNtKik7ICAgICAgICAgICAgICAgICAgICAgIC8qIFdlJ3JlIERPV04gKi8KK3N0YXRpYyB2b2lkIGxjcF9zdGFydGluZyAoZnNtKik7ICAgICAgICAgICAgICAgICAgLyogV2UgbmVlZCBsb3dlciBsYXllciB1cCAqLworc3RhdGljIHZvaWQgbGNwX2ZpbmlzaGVkIChmc20qKTsgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIGxvd2VyIGxheWVyIGRvd24gKi8KK3N0YXRpYyBpbnQgIGxjcF9leHRjb2RlIChmc20qLCBpbnQsIHVfY2hhciwgdV9jaGFyKiwgaW50KTsKK3N0YXRpYyB2b2lkIGxjcF9ycHJvdHJlaiAoZnNtKiwgdV9jaGFyKiwgaW50KTsKKworLyoKKyAqIHJvdXRpbmVzIHRvIHNlbmQgTENQIGVjaG9zIHRvIHBlZXIKKyAqLworCitzdGF0aWMgdm9pZCBsY3BfZWNob19sb3dlcnVwIChpbnQpOworc3RhdGljIHZvaWQgbGNwX2VjaG9fbG93ZXJkb3duIChpbnQpOworc3RhdGljIHZvaWQgTGNwRWNob1RpbWVvdXQgKHZvaWQqKTsKK3N0YXRpYyB2b2lkIGxjcF9yZWNlaXZlZF9lY2hvX3JlcGx5IChmc20qLCBpbnQsIHVfY2hhciosIGludCk7CitzdGF0aWMgdm9pZCBMY3BTZW5kRWNob1JlcXVlc3QgKGZzbSopOworc3RhdGljIHZvaWQgTGNwTGlua0ZhaWx1cmUgKGZzbSopOworc3RhdGljIHZvaWQgTGNwRWNob0NoZWNrIChmc20qKTsKKworc3RhdGljIGZzbV9jYWxsYmFja3MgbGNwX2NhbGxiYWNrcyA9IHsgLyogTENQIGNhbGxiYWNrIHJvdXRpbmVzICovCisgIGxjcF9yZXNldGNpLCAgLyogUmVzZXQgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgbGNwX2NpbGVuLCAgICAvKiBMZW5ndGggb2Ygb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgbGNwX2FkZGNpLCAgICAvKiBBZGQgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgbGNwX2Fja2NpLCAgICAvKiBBQ0sgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgbGNwX25ha2NpLCAgICAvKiBOQUsgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgbGNwX3JlamNpLCAgICAvKiBSZWplY3Qgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KKyAgbGNwX3JlcWNpLCAgICAvKiBSZXF1ZXN0IHBlZXIncyBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCisgIGxjcF91cCwgICAgICAgLyogQ2FsbGVkIHdoZW4gZnNtIHJlYWNoZXMgTFNfT1BFTkVEIHN0YXRlICovCisgIGxjcF9kb3duLCAgICAgLyogQ2FsbGVkIHdoZW4gZnNtIGxlYXZlcyBMU19PUEVORUQgc3RhdGUgKi8KKyAgbGNwX3N0YXJ0aW5nLCAvKiBDYWxsZWQgd2hlbiB3ZSB3YW50IHRoZSBsb3dlciBsYXllciB1cCAqLworICBsY3BfZmluaXNoZWQsIC8qIENhbGxlZCB3aGVuIHdlIHdhbnQgdGhlIGxvd2VyIGxheWVyIGRvd24gKi8KKyAgTlVMTCwgICAgICAgICAvKiBDYWxsZWQgd2hlbiBQcm90b2NvbC1SZWplY3QgcmVjZWl2ZWQgKi8KKyAgTlVMTCwgICAgICAgICAvKiBSZXRyYW5zbWlzc2lvbiBpcyBuZWNlc3NhcnkgKi8KKyAgbGNwX2V4dGNvZGUsICAvKiBDYWxsZWQgdG8gaGFuZGxlIExDUC1zcGVjaWZpYyBjb2RlcyAqLworICAiTENQIiAgICAgICAgIC8qIFN0cmluZyBuYW1lIG9mIHByb3RvY29sICovCit9OworCisvKgorICogUHJvdG9jb2wgZW50cnkgcG9pbnRzLgorICogU29tZSBvZiB0aGVzZSBhcmUgY2FsbGVkIGRpcmVjdGx5LgorICovCisKK3N0YXRpYyB2b2lkIGxjcF9pbnB1dCAoaW50LCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGxjcF9wcm90cmVqIChpbnQpOworCitzdHJ1Y3QgcHJvdGVudCBsY3BfcHJvdGVudCA9IHsKKyAgICBQUFBfTENQLAorICAgIGxjcF9pbml0LAorICAgIGxjcF9pbnB1dCwKKyAgICBsY3BfcHJvdHJlaiwKKyAgICBsY3BfbG93ZXJ1cCwKKyAgICBsY3BfbG93ZXJkb3duLAorICAgIGxjcF9vcGVuLAorICAgIGxjcF9jbG9zZSwKKyNpZiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MKKyAgICBsY3BfcHJpbnRwa3QsCisgICAgTlVMTCwKKyNlbmRpZiAvKiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MgKi8KKyAgICAxLAorICAgICJMQ1AiLAorI2lmIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUworICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMCisjZW5kaWYgLyogUFBQX0FERElUSU9OQUxfQ0FMTEJBQ0tTICovCit9OworCitpbnQgbGNwX2xvb3BiYWNrZmFpbCA9IERFRkxPT1BCQUNLRkFJTDsKKworLyoKKyAqIExlbmd0aCBvZiBlYWNoIHR5cGUgb2YgY29uZmlndXJhdGlvbiBvcHRpb24gKGluIG9jdGV0cykKKyAqLworI2RlZmluZSBDSUxFTl9WT0lEICAyCisjZGVmaW5lIENJTEVOX0NIQVIgIDMKKyNkZWZpbmUgQ0lMRU5fU0hPUlQgNCAvKiBDSUxFTl9WT0lEICsgc2l6ZW9mKHNob3J0KSAqLworI2RlZmluZSBDSUxFTl9DSEFQICA1IC8qIENJTEVOX1ZPSUQgKyBzaXplb2Yoc2hvcnQpICsgMSAqLworI2RlZmluZSBDSUxFTl9MT05HICA2IC8qIENJTEVOX1ZPSUQgKyBzaXplb2YobG9uZykgKi8KKyNkZWZpbmUgQ0lMRU5fTFFSICAgOCAvKiBDSUxFTl9WT0lEICsgc2l6ZW9mKHNob3J0KSArIHNpemVvZihsb25nKSAqLworI2RlZmluZSBDSUxFTl9DQkNQICAzCisKKyNkZWZpbmUgQ09ERU5BTUUoeCkgICgoeCkgPT0gQ09ORkFDSyA/ICJBQ0siIDogKHgpID09IENPTkZOQUsgPyAiTkFLIiA6ICJSRUoiKQorCisjaWYgMCAvKiBVTlVTRUQgKi8KKy8qCisgKiBzZXRlc2NhcGUgLSBhZGQgY2hhcnMgdG8gdGhlIHNldCB3ZSBlc2NhcGUgb24gdHJhbnNtaXNzaW9uLgorICovCitzdGF0aWMgaW50CitzZXRlc2NhcGUoYXJndikKKyAgICBjaGFyICoqYXJndjsKK3sKKyAgICBpbnQgbiwgcmV0OworICAgIGNoYXIgKnAsICplbmRwOworCisgICAgcCA9ICphcmd2OworICAgIHJldCA9IDE7CisgICAgd2hpbGUgKCpwKSB7CisgICAgICBuID0gc3RydG9sKHAsICZlbmRwLCAxNik7CisgICAgICBpZiAocCA9PSBlbmRwKSB7CisgICAgICAgIG9wdGlvbl9lcnJvcigiZXNjYXBlIHBhcmFtZXRlciBjb250YWlucyBpbnZhbGlkIGhleCBudW1iZXIgJyVzJyIsIHApOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHAgPSBlbmRwOworICAgICAgaWYgKG4gPCAwIHx8IG4gPT0gMHg1RSB8fCBuID4gMHhGRikgeworICAgICAgICBvcHRpb25fZXJyb3IoImNhbid0IGVzY2FwZSBjaGFyYWN0ZXIgMHgleCIsIG4pOworICAgICAgICByZXQgPSAwOworICAgICAgfSBlbHNlCisgICAgICAgIHhtaXRfYWNjbVswXVtuID4+IDVdIHw9IDEgPDwgKG4gJiAweDFGKTsKKyAgICAgIHdoaWxlICgqcCA9PSAnLCcgfHwgKnAgPT0gJyAnKQorICAgICAgICArK3A7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogVU5VU0VEICovCisKKy8qCisgKiBsY3BfaW5pdCAtIEluaXRpYWxpemUgTENQLgorICovCit2b2lkCitsY3BfaW5pdChpbnQgdW5pdCkKK3sKKyAgZnNtICAgICAgICAgKmYgID0gJmxjcF9mc21bdW5pdF07CisgIGxjcF9vcHRpb25zICp3byA9ICZsY3Bfd2FudG9wdGlvbnNbdW5pdF07CisgIGxjcF9vcHRpb25zICphbyA9ICZsY3BfYWxsb3dvcHRpb25zW3VuaXRdOworCisgIGYtPnVuaXQgICAgICA9IHVuaXQ7CisgIGYtPnByb3RvY29sICA9IFBQUF9MQ1A7CisgIGYtPmNhbGxiYWNrcyA9ICZsY3BfY2FsbGJhY2tzOworCisgIGZzbV9pbml0KGYpOworCisgIHdvLT5wYXNzaXZlICAgICAgICAgICA9IDA7CisgIHdvLT5zaWxlbnQgICAgICAgICAgICA9IDA7CisgIHdvLT5yZXN0YXJ0ICAgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgLyogU2V0IHRvIDEgaW4ga2VybmVscyBvciBtdWx0aS1saW5lIGltcGxlbWVudGF0aW9ucyAqLworICB3by0+bmVnX21ydSAgICAgICAgICAgPSAxOworICB3by0+bXJ1ICAgICAgICAgICAgICAgPSBQUFBfREVGTVJVOworICB3by0+bmVnX2FzeW5jbWFwICAgICAgPSAxOworICB3by0+YXN5bmNtYXAgICAgICAgICAgPSAweDAwMDAwMDAwbDsgICAgIC8qIEFzc3VtZSBkb24ndCBuZWVkIHRvIGVzY2FwZSBhbnkgY3RsIGNoYXJzLiAqLworICB3by0+bmVnX2NoYXAgICAgICAgICAgPSAwOyAgICAgICAgICAgICAgIC8qIFNldCB0byAxIG9uIHNlcnZlciAqLworICB3by0+bmVnX3VwYXAgICAgICAgICAgPSAwOyAgICAgICAgICAgICAgIC8qIFNldCB0byAxIG9uIHNlcnZlciAqLworICB3by0+Y2hhcF9tZHR5cGUgICAgICAgPSBDSEFQX0RJR0VTVF9NRDU7CisgIHdvLT5uZWdfbWFnaWNudW1iZXIgICA9IDE7CisgIHdvLT5uZWdfcGNvbXByZXNzaW9uICA9IDE7CisgIHdvLT5uZWdfYWNjb21wcmVzc2lvbiA9IDE7CisgIHdvLT5uZWdfbHFyICAgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgLyogbm8gTFFSIGltcGxlbWVudGF0aW9uIHlldCAqLworICB3by0+bmVnX2NiY3AgICAgICAgICAgPSAwOworCisgIGFvLT5uZWdfbXJ1ICAgICAgICAgICA9IDE7CisgIGFvLT5tcnUgICAgICAgICAgICAgICA9IFBQUF9NQVhNUlU7CisgIGFvLT5uZWdfYXN5bmNtYXAgICAgICA9IDE7CisgIGFvLT5hc3luY21hcCAgICAgICAgICA9IDB4MDAwMDAwMDBsOyAgICAgLyogQXNzdW1lIGRvbid0IG5lZWQgdG8gZXNjYXBlIGFueSBjdGwgY2hhcnMuICovCisgIGFvLT5uZWdfY2hhcCAgICAgICAgICA9IChDSEFQX1NVUFBPUlQgIT0gMCk7CisgIGFvLT5jaGFwX21kdHlwZSAgICAgICA9IENIQVBfRElHRVNUX01ENTsKKyAgYW8tPm5lZ191cGFwICAgICAgICAgID0gKFBBUF9TVVBQT1JUICE9IDApOworICBhby0+bmVnX21hZ2ljbnVtYmVyICAgPSAxOworICBhby0+bmVnX3Bjb21wcmVzc2lvbiAgPSAxOworICBhby0+bmVnX2FjY29tcHJlc3Npb24gPSAxOworICBhby0+bmVnX2xxciAgICAgICAgICAgPSAwOyAgICAgICAgICAgICAgIC8qIG5vIExRUiBpbXBsZW1lbnRhdGlvbiB5ZXQgKi8KKyAgYW8tPm5lZ19jYmNwICAgICAgICAgID0gKENCQ1BfU1VQUE9SVCAhPSAwKTsKKworICAvKiAKKyAgICogU2V0IHRyYW5zbWl0IGVzY2FwZSBmb3IgdGhlIGZsYWcgYW5kIGVzY2FwZSBjaGFyYWN0ZXJzIHBsdXMgYW55dGhpbmcKKyAgICogc2V0IGZvciB0aGUgYWxsb3dhYmxlIG9wdGlvbnMuCisgICAqLworICBtZW1zZXQoeG1pdF9hY2NtW3VuaXRdLCAwLCBzaXplb2YoeG1pdF9hY2NtWzBdKSk7CisgIHhtaXRfYWNjbVt1bml0XVsxNV0gPSAweDYwOworICB4bWl0X2FjY21bdW5pdF1bMF0gID0gKHVfY2hhcikoKGFvLT5hc3luY21hcCAgICAgICAgJiAweEZGKSk7CisgIHhtaXRfYWNjbVt1bml0XVsxXSAgPSAodV9jaGFyKSgoYW8tPmFzeW5jbWFwID4+IDgpICAmIDB4RkYpOworICB4bWl0X2FjY21bdW5pdF1bMl0gID0gKHVfY2hhcikoKGFvLT5hc3luY21hcCA+PiAxNikgJiAweEZGKTsKKyAgeG1pdF9hY2NtW3VuaXRdWzNdICA9ICh1X2NoYXIpKChhby0+YXN5bmNtYXAgPj4gMjQpICYgMHhGRik7CisgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9pbml0OiB4bWl0X2FjY209JVggJVggJVggJVhcbiIsCisgICAgICAgIHhtaXRfYWNjbVt1bml0XVswXSwKKyAgICAgICAgeG1pdF9hY2NtW3VuaXRdWzFdLAorICAgICAgICB4bWl0X2FjY21bdW5pdF1bMl0sCisgICAgICAgIHhtaXRfYWNjbVt1bml0XVszXSkpOworICAKKyAgbGNwX3BoYXNlW3VuaXRdID0gUEhBU0VfSU5JVElBTElaRTsKK30KKworCisvKgorICogbGNwX29wZW4gLSBMQ1AgaXMgYWxsb3dlZCB0byBjb21lIHVwLgorICovCit2b2lkCitsY3Bfb3BlbihpbnQgdW5pdCkKK3sKKyAgZnNtICAgICAgICAgKmYgID0gJmxjcF9mc21bdW5pdF07CisgIGxjcF9vcHRpb25zICp3byA9ICZsY3Bfd2FudG9wdGlvbnNbdW5pdF07CisKKyAgZi0+ZmxhZ3MgPSAwOworICBpZiAod28tPnBhc3NpdmUpIHsKKyAgICBmLT5mbGFncyB8PSBPUFRfUEFTU0lWRTsKKyAgfQorICBpZiAod28tPnNpbGVudCkgeworICAgIGYtPmZsYWdzIHw9IE9QVF9TSUxFTlQ7CisgIH0KKyAgZnNtX29wZW4oZik7CisKKyAgbGNwX3BoYXNlW3VuaXRdID0gUEhBU0VfRVNUQUJMSVNIOworfQorCisKKy8qCisgKiBsY3BfY2xvc2UgLSBUYWtlIExDUCBkb3duLgorICovCit2b2lkCitsY3BfY2xvc2UoaW50IHVuaXQsIGNoYXIgKnJlYXNvbikKK3sKKyAgZnNtICpmID0gJmxjcF9mc21bdW5pdF07CisKKyAgaWYgKGxjcF9waGFzZVt1bml0XSAhPSBQSEFTRV9ERUFEKSB7CisgICAgbGNwX3BoYXNlW3VuaXRdID0gUEhBU0VfVEVSTUlOQVRFOworICB9CisgIGlmIChmLT5zdGF0ZSA9PSBMU19TVE9QUEVEICYmIGYtPmZsYWdzICYgKE9QVF9QQVNTSVZFfE9QVF9TSUxFTlQpKSB7CisgICAgLyoKKyAgICAgKiBUaGlzIGFjdGlvbiBpcyBub3Qgc3RyaWN0bHkgYWNjb3JkaW5nIHRvIHRoZSBGU00gaW4gUkZDMTU0OCwKKyAgICAgKiBidXQgaXQgZG9lcyBtZWFuIHRoYXQgdGhlIHByb2dyYW0gdGVybWluYXRlcyBpZiB5b3UgZG8gYW4KKyAgICAgKiBsY3BfY2xvc2UoKSBpbiBwYXNzaXZlL3NpbGVudCBtb2RlIHdoZW4gYSBjb25uZWN0aW9uIGhhc24ndAorICAgICAqIGJlZW4gZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgZi0+c3RhdGUgPSBMU19DTE9TRUQ7CisgICAgbGNwX2ZpbmlzaGVkKGYpOworICB9IGVsc2UgeworICAgIGZzbV9jbG9zZShmLCByZWFzb24pOworICB9Cit9CisKKworLyoKKyAqIGxjcF9sb3dlcnVwIC0gVGhlIGxvd2VyIGxheWVyIGlzIHVwLgorICovCit2b2lkCitsY3BfbG93ZXJ1cChpbnQgdW5pdCkKK3sKKyAgbGNwX29wdGlvbnMgKndvID0gJmxjcF93YW50b3B0aW9uc1t1bml0XTsKKworICAvKgorICAgKiBEb24ndCB1c2UgQS9DIG9yIHByb3RvY29sIGNvbXByZXNzaW9uIG9uIHRyYW5zbWlzc2lvbiwKKyAgICogYnV0IGFjY2VwdCBBL0MgYW5kIHByb3RvY29sIGNvbXByZXNzZWQgcGFja2V0cworICAgKiBpZiB3ZSBhcmUgZ29pbmcgdG8gYXNrIGZvciBBL0MgYW5kIHByb3RvY29sIGNvbXByZXNzaW9uLgorICAgKi8KKyAgcHBwX3NldF94YWNjbSh1bml0LCAmeG1pdF9hY2NtW3VuaXRdKTsKKyAgcHBwX3NlbmRfY29uZmlnKHVuaXQsIFBQUF9NUlUsIDB4ZmZmZmZmZmZsLCAwLCAwKTsKKyAgcHBwX3JlY3ZfY29uZmlnKHVuaXQsIFBQUF9NUlUsIDB4MDAwMDAwMDBsLAorICB3by0+bmVnX3Bjb21wcmVzc2lvbiwgd28tPm5lZ19hY2NvbXByZXNzaW9uKTsKKyAgcGVlcl9tcnVbdW5pdF0gPSBQUFBfTVJVOworICBsY3BfYWxsb3dvcHRpb25zW3VuaXRdLmFzeW5jbWFwID0gKHVfbG9uZyl4bWl0X2FjY21bdW5pdF1bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCh1X2xvbmcpeG1pdF9hY2NtW3VuaXRdWzFdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodV9sb25nKXhtaXRfYWNjbVt1bml0XVsyXSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCh1X2xvbmcpeG1pdF9hY2NtW3VuaXRdWzNdIDw8IDI0KTsKKyAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX2xvd2VydXA6IGFzeW5jbWFwPSVYICVYICVYICVYXG4iLAorICAgICAgICAgICAgeG1pdF9hY2NtW3VuaXRdWzNdLAorICAgICAgICAgICAgeG1pdF9hY2NtW3VuaXRdWzJdLAorICAgICAgICAgICAgeG1pdF9hY2NtW3VuaXRdWzFdLAorICAgICAgICAgICAgeG1pdF9hY2NtW3VuaXRdWzBdKSk7CisKKyAgZnNtX2xvd2VydXAoJmxjcF9mc21bdW5pdF0pOworfQorCisKKy8qCisgKiBsY3BfbG93ZXJkb3duIC0gVGhlIGxvd2VyIGxheWVyIGlzIGRvd24uCisgKi8KK3ZvaWQKK2xjcF9sb3dlcmRvd24oaW50IHVuaXQpCit7CisgIGZzbV9sb3dlcmRvd24oJmxjcF9mc21bdW5pdF0pOworfQorCisKKy8qCisgKiBsY3BfaW5wdXQgLSBJbnB1dCBMQ1AgcGFja2V0LgorICovCitzdGF0aWMgdm9pZAorbGNwX2lucHV0KGludCB1bml0LCB1X2NoYXIgKnAsIGludCBsZW4pCit7CisgIGZzbSAqZiA9ICZsY3BfZnNtW3VuaXRdOworCisgIGZzbV9pbnB1dChmLCBwLCBsZW4pOworfQorCisKKy8qCisgKiBsY3BfZXh0Y29kZSAtIEhhbmRsZSBhIExDUC1zcGVjaWZpYyBjb2RlLgorICovCitzdGF0aWMgaW50CitsY3BfZXh0Y29kZShmc20gKmYsIGludCBjb2RlLCB1X2NoYXIgaWQsIHVfY2hhciAqaW5wLCBpbnQgbGVuKQoreworICB1X2NoYXIgKm1hZ3A7CisKKyAgc3dpdGNoKCBjb2RlICl7CisgICAgY2FzZSBQUk9UUkVKOgorICAgICAgbGNwX3Jwcm90cmVqKGYsIGlucCwgbGVuKTsKKyAgICAgIGJyZWFrOworICAKKyAgICBjYXNlIEVDSE9SRVE6CisgICAgICBpZiAoZi0+c3RhdGUgIT0gTFNfT1BFTkVEKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgTENQREVCVUcoTE9HX0lORk8sICgibGNwOiBFY2hvLVJlcXVlc3QsIFJjdmQgaWQgJWRcbiIsIGlkKSk7CisgICAgICBtYWdwID0gaW5wOworICAgICAgUFVUTE9ORyhsY3BfZ290b3B0aW9uc1tmLT51bml0XS5tYWdpY251bWJlciwgbWFncCk7CisgICAgICBmc21fc2RhdGEoZiwgRUNIT1JFUCwgaWQsIGlucCwgbGVuKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFQ0hPUkVQOgorICAgICAgbGNwX3JlY2VpdmVkX2VjaG9fcmVwbHkoZiwgaWQsIGlucCwgbGVuKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBESVNDUkVROgorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIGxjcF9ycHJvdHJlaiAtIFJlY2VpdmUgYW4gUHJvdG9jb2wtUmVqZWN0LgorICoKKyAqIEZpZ3VyZSBvdXQgd2hpY2ggcHJvdG9jb2wgaXMgcmVqZWN0ZWQgYW5kIGluZm9ybSBpdC4KKyAqLworc3RhdGljIHZvaWQKK2xjcF9ycHJvdHJlaihmc20gKmYsIHVfY2hhciAqaW5wLCBpbnQgbGVuKQoreworICBpbnQgaTsKKyAgc3RydWN0IHByb3RlbnQgKnByb3RwOworICB1X3Nob3J0IHByb3Q7CisKKyAgaWYgKGxlbiA8IChpbnQpc2l6ZW9mICh1X3Nob3J0KSkgeworICAgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9ycHJvdHJlajogUmN2ZCBzaG9ydCBQcm90b2NvbC1SZWplY3QgcGFja2V0IVxuIikpOworICAgIHJldHVybjsKKyAgfQorCisgIEdFVFNIT1JUKHByb3QsIGlucCk7CisKKyAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX3Jwcm90cmVqOiBSY3ZkIFByb3RvY29sLVJlamVjdCBwYWNrZXQgZm9yICV4IVxuIiwgcHJvdCkpOworCisgIC8qCisgICAqIFByb3RvY29sLVJlamVjdCBwYWNrZXRzIHJlY2VpdmVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBMQ1AKKyAgICogTFNfT1BFTkVEIHN0YXRlIFNIT1VMRCBiZSBzaWxlbnRseSBkaXNjYXJkZWQuCisgICAqLworICBpZiggZi0+c3RhdGUgIT0gTFNfT1BFTkVEICkgeworICAgIExDUERFQlVHKExPR19JTkZPLCAoIlByb3RvY29sLVJlamVjdCBkaXNjYXJkZWQ6IExDUCBpbiBzdGF0ZSAlZFxuIiwgZi0+c3RhdGUpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKgorICAgKiBVcGNhbGwgdGhlIHByb3BlciBQcm90b2NvbC1SZWplY3Qgcm91dGluZS4KKyAgICovCisgIGZvciAoaSA9IDA7IChwcm90cCA9IHBwcF9wcm90b2NvbHNbaV0pICE9IE5VTEw7ICsraSkgeworICAgIGlmIChwcm90cC0+cHJvdG9jb2wgPT0gcHJvdCAmJiBwcm90cC0+ZW5hYmxlZF9mbGFnKSB7CisgICAgICAoKnByb3RwLT5wcm90cmVqKShmLT51bml0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBMQ1BERUJVRyhMT0dfV0FSTklORywgKCJQcm90b2NvbC1SZWplY3QgZm9yIHVuc3VwcG9ydGVkIHByb3RvY29sIDB4JXhcbiIsIHByb3QpKTsKK30KKworCisvKgorICogbGNwX3Byb3RyZWogLSBBIFByb3RvY29sLVJlamVjdCB3YXMgcmVjZWl2ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitsY3BfcHJvdHJlaihpbnQgdW5pdCkKK3sKKyAgTFdJUF9VTlVTRURfQVJHKHVuaXQpOworICAvKgorICAgKiBDYW4ndCByZWplY3QgTENQIQorICAgKi8KKyAgTENQREVCVUcoTE9HX1dBUk5JTkcsICgibGNwX3Byb3RyZWo6IFJlY2VpdmVkIFByb3RvY29sLVJlamVjdCBmb3IgTENQIVxuIikpOworICBmc21fcHJvdHJlamVjdCgmbGNwX2ZzbVt1bml0XSk7Cit9CisKKworLyoKKyAqIGxjcF9zcHJvdHJlaiAtIFNlbmQgYSBQcm90b2NvbC1SZWplY3QgZm9yIHNvbWUgcHJvdG9jb2wuCisgKi8KK3ZvaWQKK2xjcF9zcHJvdHJlaihpbnQgdW5pdCwgdV9jaGFyICpwLCBpbnQgbGVuKQoreworICAvKgorICAgKiBTZW5kIGJhY2sgdGhlIHByb3RvY29sIGFuZCB0aGUgaW5mb3JtYXRpb24gZmllbGQgb2YgdGhlCisgICAqIHJlamVjdGVkIHBhY2tldC4gIFdlIG9ubHkgZ2V0IGhlcmUgaWYgTENQIGlzIGluIHRoZSBMU19PUEVORUQgc3RhdGUuCisgICAqLworCisgIGZzbV9zZGF0YSgmbGNwX2ZzbVt1bml0XSwgUFJPVFJFSiwgKytsY3BfZnNtW3VuaXRdLmlkLCBwLCBsZW4pOworfQorCisKKy8qCisgKiBsY3BfcmVzZXRjaSAtIFJlc2V0IG91ciBDSS4KKyAqLworc3RhdGljIHZvaWQKK2xjcF9yZXNldGNpKGZzbSAqZikKK3sKKyAgbGNwX3dhbnRvcHRpb25zW2YtPnVuaXRdLm1hZ2ljbnVtYmVyID0gbWFnaWMoKTsKKyAgbGNwX3dhbnRvcHRpb25zW2YtPnVuaXRdLm51bWxvb3BzID0gMDsKKyAgbGNwX2dvdG9wdGlvbnNbZi0+dW5pdF0gPSBsY3Bfd2FudG9wdGlvbnNbZi0+dW5pdF07CisgIHBlZXJfbXJ1W2YtPnVuaXRdID0gUFBQX01SVTsKKyAgYXV0aF9yZXNldChmLT51bml0KTsKK30KKworCisvKgorICogbGNwX2NpbGVuIC0gUmV0dXJuIGxlbmd0aCBvZiBvdXIgQ0kuCisgKi8KK3N0YXRpYyBpbnQKK2xjcF9jaWxlbihmc20gKmYpCit7CisgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1tmLT51bml0XTsKKworI2RlZmluZSBMRU5DSVZPSUQobmVnKSAgKChuZWcpID8gQ0lMRU5fVk9JRCA6IDApCisjZGVmaW5lIExFTkNJQ0hBUChuZWcpICAoKG5lZykgPyBDSUxFTl9DSEFQIDogMCkKKyNkZWZpbmUgTEVOQ0lTSE9SVChuZWcpICgobmVnKSA/IENJTEVOX1NIT1JUIDogMCkKKyNkZWZpbmUgTEVOQ0lMT05HKG5lZykgICgobmVnKSA/IENJTEVOX0xPTkcgOiAwKQorI2RlZmluZSBMRU5DSUxRUihuZWcpICAgKChuZWcpID8gQ0lMRU5fTFFSOiAwKQorI2RlZmluZSBMRU5DSUNCQ1AobmVnKSAgKChuZWcpID8gQ0lMRU5fQ0JDUDogMCkKKyAgLyoKKyAgICogTkI6IHdlIG9ubHkgYXNrIGZvciBvbmUgb2YgQ0hBUCBhbmQgVVBBUCwgZXZlbiBpZiB3ZSB3aWxsCisgICAqIGFjY2VwdCBlaXRoZXIuCisgICAqLworICByZXR1cm4gKExFTkNJU0hPUlQoZ28tPm5lZ19tcnUgJiYgZ28tPm1ydSAhPSBQUFBfREVGTVJVKSArCisgICAgICAgICAgTEVOQ0lMT05HKGdvLT5uZWdfYXN5bmNtYXAgJiYgZ28tPmFzeW5jbWFwICE9IDB4RkZGRkZGRkZsKSArCisgICAgICAgICAgTEVOQ0lDSEFQKGdvLT5uZWdfY2hhcCkgKworICAgICAgICAgIExFTkNJU0hPUlQoIWdvLT5uZWdfY2hhcCAmJiBnby0+bmVnX3VwYXApICsKKyAgICAgICAgICBMRU5DSUxRUihnby0+bmVnX2xxcikgKworICAgICAgICAgIExFTkNJQ0JDUChnby0+bmVnX2NiY3ApICsKKyAgICAgICAgICBMRU5DSUxPTkcoZ28tPm5lZ19tYWdpY251bWJlcikgKworICAgICAgICAgIExFTkNJVk9JRChnby0+bmVnX3Bjb21wcmVzc2lvbikgKworICAgICAgICAgIExFTkNJVk9JRChnby0+bmVnX2FjY29tcHJlc3Npb24pKTsKK30KKworCisvKgorICogbGNwX2FkZGNpIC0gQWRkIG91ciBkZXNpcmVkIENJcyB0byBhIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQKK2xjcF9hZGRjaShmc20gKmYsIHVfY2hhciAqdWNwLCBpbnQgKmxlbnApCit7CisgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1tmLT51bml0XTsKKyAgdV9jaGFyICpzdGFydF91Y3AgPSB1Y3A7CisKKyNkZWZpbmUgQUREQ0lWT0lEKG9wdCwgbmVnKSBcCisgIGlmIChuZWcpIHsgXAorICAgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9hZGRjaTogb3B0PSVkXG4iLCBvcHQpKTsgXAorICAgIFBVVENIQVIob3B0LCB1Y3ApOyBcCisgICAgUFVUQ0hBUihDSUxFTl9WT0lELCB1Y3ApOyBcCisgIH0KKyNkZWZpbmUgQUREQ0lTSE9SVChvcHQsIG5lZywgdmFsKSBcCisgIGlmIChuZWcpIHsgXAorICAgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9hZGRjaTogSU5UIG9wdD0lZCAlWFxuIiwgb3B0LCB2YWwpKTsgXAorICAgIFBVVENIQVIob3B0LCB1Y3ApOyBcCisgICAgUFVUQ0hBUihDSUxFTl9TSE9SVCwgdWNwKTsgXAorICAgIFBVVFNIT1JUKHZhbCwgdWNwKTsgXAorICB9CisjZGVmaW5lIEFERENJQ0hBUChvcHQsIG5lZywgdmFsLCBkaWdlc3QpIFwKKyAgaWYgKG5lZykgeyBcCisgICAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX2FkZGNpOiBDSEFQIG9wdD0lZCAlWFxuIiwgb3B0LCB2YWwpKTsgXAorICAgIFBVVENIQVIob3B0LCB1Y3ApOyBcCisgICAgUFVUQ0hBUihDSUxFTl9DSEFQLCB1Y3ApOyBcCisgICAgUFVUU0hPUlQodmFsLCB1Y3ApOyBcCisgICAgUFVUQ0hBUihkaWdlc3QsIHVjcCk7IFwKKyAgfQorI2RlZmluZSBBRERDSUxPTkcob3B0LCBuZWcsIHZhbCkgXAorICBpZiAobmVnKSB7IFwKKyAgICBMQ1BERUJVRyhMT0dfSU5GTywgKCJsY3BfYWRkY2k6IEwgb3B0PSVkICVsWFxuIiwgb3B0LCB2YWwpKTsgXAorICAgIFBVVENIQVIob3B0LCB1Y3ApOyBcCisgICAgUFVUQ0hBUihDSUxFTl9MT05HLCB1Y3ApOyBcCisgICAgUFVUTE9ORyh2YWwsIHVjcCk7IFwKKyAgfQorI2RlZmluZSBBRERDSUxRUihvcHQsIG5lZywgdmFsKSBcCisgIGlmIChuZWcpIHsgXAorICAgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9hZGRjaTogTFFSIG9wdD0lZCAlbFhcbiIsIG9wdCwgdmFsKSk7IFwKKyAgICBQVVRDSEFSKG9wdCwgdWNwKTsgXAorICAgIFBVVENIQVIoQ0lMRU5fTFFSLCB1Y3ApOyBcCisgICAgUFVUU0hPUlQoUFBQX0xRUiwgdWNwKTsgXAorICAgIFBVVExPTkcodmFsLCB1Y3ApOyBcCisgIH0KKyNkZWZpbmUgQUREQ0lDSEFSKG9wdCwgbmVnLCB2YWwpIFwKKyAgaWYgKG5lZykgeyBcCisgICAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX2FkZGNpOiBDSEFSIG9wdD0lZCAlWCAnJXonXG4iLCBvcHQsIHZhbCwgdmFsKSk7IFwKKyAgICBQVVRDSEFSKG9wdCwgdWNwKTsgXAorICAgIFBVVENIQVIoQ0lMRU5fQ0hBUiwgdWNwKTsgXAorICAgIFBVVENIQVIodmFsLCB1Y3ApOyBcCisgIH0KKworICBBRERDSVNIT1JUKENJX01SVSwgZ28tPm5lZ19tcnUgJiYgZ28tPm1ydSAhPSBQUFBfREVGTVJVLCBnby0+bXJ1KTsKKyAgQUREQ0lMT05HKENJX0FTWU5DTUFQLCBnby0+bmVnX2FzeW5jbWFwICYmIGdvLT5hc3luY21hcCAhPSAweEZGRkZGRkZGbCwgZ28tPmFzeW5jbWFwKTsKKyAgQUREQ0lDSEFQKENJX0FVVEhUWVBFLCBnby0+bmVnX2NoYXAsIFBQUF9DSEFQLCBnby0+Y2hhcF9tZHR5cGUpOworICBBRERDSVNIT1JUKENJX0FVVEhUWVBFLCAhZ28tPm5lZ19jaGFwICYmIGdvLT5uZWdfdXBhcCwgUFBQX1BBUCk7CisgIEFERENJTFFSKENJX1FVQUxJVFksIGdvLT5uZWdfbHFyLCBnby0+bHFyX3BlcmlvZCk7CisgIEFERENJQ0hBUihDSV9DQUxMQkFDSywgZ28tPm5lZ19jYmNwLCBDQkNQX09QVCk7CisgIEFERENJTE9ORyhDSV9NQUdJQ05VTUJFUiwgZ28tPm5lZ19tYWdpY251bWJlciwgZ28tPm1hZ2ljbnVtYmVyKTsKKyAgQUREQ0lWT0lEKENJX1BDT01QUkVTU0lPTiwgZ28tPm5lZ19wY29tcHJlc3Npb24pOworICBBRERDSVZPSUQoQ0lfQUNDT01QUkVTU0lPTiwgZ28tPm5lZ19hY2NvbXByZXNzaW9uKTsKKworICBpZiAodWNwIC0gc3RhcnRfdWNwICE9ICpsZW5wKSB7CisgICAgLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBiZWNhdXNlIHBlZXJfbXR1IHNob3VsZCBiZSAxNTAwICovCisgICAgTENQREVCVUcoTE9HX0VSUiwgKCJCdWcgaW4gbGNwX2FkZGNpOiB3cm9uZyBsZW5ndGhcbiIpKTsKKyAgfQorfQorCisKKy8qCisgKiBsY3BfYWNrY2kgLSBBY2sgb3VyIENJcy4KKyAqIFRoaXMgc2hvdWxkIG5vdCBtb2RpZnkgYW55IHN0YXRlIGlmIHRoZSBBY2sgaXMgYmFkLgorICoKKyAqIFJldHVybnM6CisgKiAgMCAtIEFjayB3YXMgYmFkLgorICogIDEgLSBBY2sgd2FzIGdvb2QuCisgKi8KK3N0YXRpYyBpbnQKK2xjcF9hY2tjaShmc20gKmYsIHVfY2hhciAqcCwgaW50IGxlbikKK3sKKyAgbGNwX29wdGlvbnMgKmdvID0gJmxjcF9nb3RvcHRpb25zW2YtPnVuaXRdOworICB1X2NoYXIgY2lsZW4sIGNpdHlwZSwgY2ljaGFyOworICB1X3Nob3J0IGNpc2hvcnQ7CisgIHUzMl90IGNpbG9uZzsKKworICAvKgorICAgKiBDSXMgbXVzdCBiZSBpbiBleGFjdGx5IHRoZSBzYW1lIG9yZGVyIHRoYXQgd2Ugc2VudC4KKyAgICogQ2hlY2sgcGFja2V0IGxlbmd0aCBhbmQgQ0kgbGVuZ3RoIGF0IGVhY2ggc3RlcC4KKyAgICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCisgICAqLworI2RlZmluZSBBQ0tDSVZPSUQob3B0LCBuZWcpIFwKKyAgaWYgKG5lZykgeyBcCisgICAgaWYgKChsZW4gLT0gQ0lMRU5fVk9JRCkgPCAwKSBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIEdFVENIQVIoY2l0eXBlLCBwKTsgXAorICAgIEdFVENIQVIoY2lsZW4sIHApOyBcCisgICAgaWYgKGNpbGVuICE9IENJTEVOX1ZPSUQgfHwgY2l0eXBlICE9IG9wdCkgXAorICAgICAgZ290byBiYWQ7IFwKKyAgfQorI2RlZmluZSBBQ0tDSVNIT1JUKG9wdCwgbmVnLCB2YWwpIFwKKyAgaWYgKG5lZykgeyBcCisgICAgaWYgKChsZW4gLT0gQ0lMRU5fU0hPUlQpIDwgMCkgXAorICAgICAgZ290byBiYWQ7IFwKKyAgICBHRVRDSEFSKGNpdHlwZSwgcCk7IFwKKyAgICBHRVRDSEFSKGNpbGVuLCBwKTsgXAorICAgIGlmIChjaWxlbiAhPSBDSUxFTl9TSE9SVCB8fCBjaXR5cGUgIT0gb3B0KSBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCisgICAgaWYgKGNpc2hvcnQgIT0gdmFsKSBcCisgICAgICBnb3RvIGJhZDsgXAorICB9CisjZGVmaW5lIEFDS0NJQ0hBUihvcHQsIG5lZywgdmFsKSBcCisgIGlmIChuZWcpIHsgXAorICAgIGlmICgobGVuIC09IENJTEVOX0NIQVIpIDwgMCkgXAorICAgICAgZ290byBiYWQ7IFwKKyAgICBHRVRDSEFSKGNpdHlwZSwgcCk7IFwKKyAgICBHRVRDSEFSKGNpbGVuLCBwKTsgXAorICAgIGlmIChjaWxlbiAhPSBDSUxFTl9DSEFSIHx8IGNpdHlwZSAhPSBvcHQpIFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgR0VUQ0hBUihjaWNoYXIsIHApOyBcCisgICAgaWYgKGNpY2hhciAhPSB2YWwpIFwKKyAgICAgIGdvdG8gYmFkOyBcCisgIH0KKyNkZWZpbmUgQUNLQ0lDSEFQKG9wdCwgbmVnLCB2YWwsIGRpZ2VzdCkgXAorICBpZiAobmVnKSB7IFwKKyAgICBpZiAoKGxlbiAtPSBDSUxFTl9DSEFQKSA8IDApIFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgR0VUQ0hBUihjaXR5cGUsIHApOyBcCisgICAgR0VUQ0hBUihjaWxlbiwgcCk7IFwKKyAgICBpZiAoY2lsZW4gIT0gQ0lMRU5fQ0hBUCB8fCBjaXR5cGUgIT0gb3B0KSBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCisgICAgaWYgKGNpc2hvcnQgIT0gdmFsKSBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIEdFVENIQVIoY2ljaGFyLCBwKTsgXAorICAgIGlmIChjaWNoYXIgIT0gZGlnZXN0KSBcCisgICAgICBnb3RvIGJhZDsgXAorICB9CisjZGVmaW5lIEFDS0NJTE9ORyhvcHQsIG5lZywgdmFsKSBcCisgIGlmIChuZWcpIHsgXAorICAgIGlmICgobGVuIC09IENJTEVOX0xPTkcpIDwgMCkgXAorICAgICAgZ290byBiYWQ7IFwKKyAgICBHRVRDSEFSKGNpdHlwZSwgcCk7IFwKKyAgICBHRVRDSEFSKGNpbGVuLCBwKTsgXAorICAgIGlmIChjaWxlbiAhPSBDSUxFTl9MT05HIHx8ICBjaXR5cGUgIT0gb3B0KSBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIEdFVExPTkcoY2lsb25nLCBwKTsgXAorICAgIGlmIChjaWxvbmcgIT0gdmFsKSBcCisgICAgICBnb3RvIGJhZDsgXAorICB9CisjZGVmaW5lIEFDS0NJTFFSKG9wdCwgbmVnLCB2YWwpIFwKKyAgaWYgKG5lZykgeyBcCisgICAgaWYgKChsZW4gLT0gQ0lMRU5fTFFSKSA8IDApIFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgR0VUQ0hBUihjaXR5cGUsIHApOyBcCisgICAgR0VUQ0hBUihjaWxlbiwgcCk7IFwKKyAgICBpZiAoY2lsZW4gIT0gQ0lMRU5fTFFSIHx8IGNpdHlwZSAhPSBvcHQpIFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgR0VUU0hPUlQoY2lzaG9ydCwgcCk7IFwKKyAgICBpZiAoY2lzaG9ydCAhPSBQUFBfTFFSKSBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIEdFVExPTkcoY2lsb25nLCBwKTsgXAorICAgIGlmIChjaWxvbmcgIT0gdmFsKSBcCisgICAgICBnb3RvIGJhZDsgXAorICB9CisKKyAgQUNLQ0lTSE9SVChDSV9NUlUsIGdvLT5uZWdfbXJ1ICYmIGdvLT5tcnUgIT0gUFBQX0RFRk1SVSwgZ28tPm1ydSk7CisgIEFDS0NJTE9ORyhDSV9BU1lOQ01BUCwgZ28tPm5lZ19hc3luY21hcCAmJiBnby0+YXN5bmNtYXAgIT0gMHhGRkZGRkZGRmwsIGdvLT5hc3luY21hcCk7CisgIEFDS0NJQ0hBUChDSV9BVVRIVFlQRSwgZ28tPm5lZ19jaGFwLCBQUFBfQ0hBUCwgZ28tPmNoYXBfbWR0eXBlKTsKKyAgQUNLQ0lTSE9SVChDSV9BVVRIVFlQRSwgIWdvLT5uZWdfY2hhcCAmJiBnby0+bmVnX3VwYXAsIFBQUF9QQVApOworICBBQ0tDSUxRUihDSV9RVUFMSVRZLCBnby0+bmVnX2xxciwgZ28tPmxxcl9wZXJpb2QpOworICBBQ0tDSUNIQVIoQ0lfQ0FMTEJBQ0ssIGdvLT5uZWdfY2JjcCwgQ0JDUF9PUFQpOworICBBQ0tDSUxPTkcoQ0lfTUFHSUNOVU1CRVIsIGdvLT5uZWdfbWFnaWNudW1iZXIsIGdvLT5tYWdpY251bWJlcik7CisgIEFDS0NJVk9JRChDSV9QQ09NUFJFU1NJT04sIGdvLT5uZWdfcGNvbXByZXNzaW9uKTsKKyAgQUNLQ0lWT0lEKENJX0FDQ09NUFJFU1NJT04sIGdvLT5uZWdfYWNjb21wcmVzc2lvbik7CisKKyAgLyoKKyAgICogSWYgdGhlcmUgYXJlIGFueSByZW1haW5pbmcgQ0lzLCB0aGVuIHRoaXMgcGFja2V0IGlzIGJhZC4KKyAgICovCisgIGlmIChsZW4gIT0gMCkgeworICAgIGdvdG8gYmFkOworICB9CisgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9hY2tpOiBBY2tcbiIpKTsKKyAgcmV0dXJuICgxKTsKK2JhZDoKKyAgTENQREVCVUcoTE9HX1dBUk5JTkcsICgibGNwX2Fja2k6IHJlY2VpdmVkIGJhZCBBY2shXG4iKSk7CisgIHJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIGxjcF9uYWtjaSAtIFBlZXIgaGFzIHNlbnQgYSBOQUsgZm9yIHNvbWUgb2Ygb3VyIENJcy4KKyAqIFRoaXMgc2hvdWxkIG5vdCBtb2RpZnkgYW55IHN0YXRlIGlmIHRoZSBOYWsgaXMgYmFkCisgKiBvciBpZiBMQ1AgaXMgaW4gdGhlIExTX09QRU5FRCBzdGF0ZS4KKyAqCisgKiBSZXR1cm5zOgorICogIDAgLSBOYWsgd2FzIGJhZC4KKyAqICAxIC0gTmFrIHdhcyBnb29kLgorICovCitzdGF0aWMgaW50CitsY3BfbmFrY2koZnNtICpmLCB1X2NoYXIgKnAsIGludCBsZW4pCit7CisgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1tmLT51bml0XTsKKyAgbGNwX29wdGlvbnMgKndvID0gJmxjcF93YW50b3B0aW9uc1tmLT51bml0XTsKKyAgdV9jaGFyIGNpdHlwZSwgY2ljaGFyLCAqbmV4dDsKKyAgdV9zaG9ydCBjaXNob3J0OworICB1MzJfdCBjaWxvbmc7CisgIGxjcF9vcHRpb25zIG5vOyAgICAgLyogb3B0aW9ucyB3ZSd2ZSBzZWVuIE5ha3MgZm9yICovCisgIGxjcF9vcHRpb25zIHRyeTsgICAgLyogb3B0aW9ucyB0byByZXF1ZXN0IG5leHQgdGltZSAqLworICBpbnQgbG9vcGVkX2JhY2sgPSAwOworICBpbnQgY2lsZW47CisKKyAgQlpFUk8oJm5vLCBzaXplb2Yobm8pKTsKKyAgdHJ5ID0gKmdvOworCisgIC8qCisgICAqIEFueSBOYWsnZCBDSXMgbXVzdCBiZSBpbiBleGFjdGx5IHRoZSBzYW1lIG9yZGVyIHRoYXQgd2Ugc2VudC4KKyAgICogQ2hlY2sgcGFja2V0IGxlbmd0aCBhbmQgQ0kgbGVuZ3RoIGF0IGVhY2ggc3RlcC4KKyAgICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCisgICAqLworI2RlZmluZSBOQUtDSVZPSUQob3B0LCBuZWcsIGNvZGUpIFwKKyAgaWYgKGdvLT5uZWcgJiYgXAorICAgICAgbGVuID49IENJTEVOX1ZPSUQgJiYgXAorICAgICAgcFsxXSA9PSBDSUxFTl9WT0lEICYmIFwKKyAgICAgIHBbMF0gPT0gb3B0KSB7IFwKKyAgICBsZW4gLT0gQ0lMRU5fVk9JRDsgXAorICAgIElOQ1BUUihDSUxFTl9WT0lELCBwKTsgXAorICAgIG5vLm5lZyA9IDE7IFwKKyAgICBjb2RlIFwKKyAgfQorI2RlZmluZSBOQUtDSUNIQVAob3B0LCBuZWcsIGNvZGUpIFwKKyAgaWYgKGdvLT5uZWcgJiYgXAorICAgICAgbGVuID49IENJTEVOX0NIQVAgJiYgXAorICAgICAgcFsxXSA9PSBDSUxFTl9DSEFQICYmIFwKKyAgICAgIHBbMF0gPT0gb3B0KSB7IFwKKyAgICBsZW4gLT0gQ0lMRU5fQ0hBUDsgXAorICAgIElOQ1BUUigyLCBwKTsgXAorICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCisgICAgR0VUQ0hBUihjaWNoYXIsIHApOyBcCisgICAgbm8ubmVnID0gMTsgXAorICAgIGNvZGUgXAorICB9CisjZGVmaW5lIE5BS0NJQ0hBUihvcHQsIG5lZywgY29kZSkgXAorICBpZiAoZ28tPm5lZyAmJiBcCisgICAgICBsZW4gPj0gQ0lMRU5fQ0hBUiAmJiBcCisgICAgICBwWzFdID09IENJTEVOX0NIQVIgJiYgXAorICAgICAgcFswXSA9PSBvcHQpIHsgXAorICAgIGxlbiAtPSBDSUxFTl9DSEFSOyBcCisgICAgSU5DUFRSKDIsIHApOyBcCisgICAgR0VUQ0hBUihjaWNoYXIsIHApOyBcCisgICAgbm8ubmVnID0gMTsgXAorICAgIGNvZGUgXAorICB9CisjZGVmaW5lIE5BS0NJU0hPUlQob3B0LCBuZWcsIGNvZGUpIFwKKyAgaWYgKGdvLT5uZWcgJiYgXAorICAgICAgbGVuID49IENJTEVOX1NIT1JUICYmIFwKKyAgICAgIHBbMV0gPT0gQ0lMRU5fU0hPUlQgJiYgXAorICAgICAgcFswXSA9PSBvcHQpIHsgXAorICAgIGxlbiAtPSBDSUxFTl9TSE9SVDsgXAorICAgIElOQ1BUUigyLCBwKTsgXAorICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCisgICAgbm8ubmVnID0gMTsgXAorICAgIGNvZGUgXAorICB9CisjZGVmaW5lIE5BS0NJTE9ORyhvcHQsIG5lZywgY29kZSkgXAorICBpZiAoZ28tPm5lZyAmJiBcCisgICAgICBsZW4gPj0gQ0lMRU5fTE9ORyAmJiBcCisgICAgICBwWzFdID09IENJTEVOX0xPTkcgJiYgXAorICAgICAgcFswXSA9PSBvcHQpIHsgXAorICAgIGxlbiAtPSBDSUxFTl9MT05HOyBcCisgICAgSU5DUFRSKDIsIHApOyBcCisgICAgR0VUTE9ORyhjaWxvbmcsIHApOyBcCisgICAgbm8ubmVnID0gMTsgXAorICAgIGNvZGUgXAorICB9CisjZGVmaW5lIE5BS0NJTFFSKG9wdCwgbmVnLCBjb2RlKSBcCisgIGlmIChnby0+bmVnICYmIFwKKyAgICAgIGxlbiA+PSBDSUxFTl9MUVIgJiYgXAorICAgICAgcFsxXSA9PSBDSUxFTl9MUVIgJiYgXAorICAgICAgcFswXSA9PSBvcHQpIHsgXAorICAgIGxlbiAtPSBDSUxFTl9MUVI7IFwKKyAgICBJTkNQVFIoMiwgcCk7IFwKKyAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsgXAorICAgIEdFVExPTkcoY2lsb25nLCBwKTsgXAorICAgIG5vLm5lZyA9IDE7IFwKKyAgICBjb2RlIFwKKyAgfQorCisgIC8qCisgICAqIFdlIGRvbid0IGNhcmUgaWYgdGhleSB3YW50IHRvIHNlbmQgdXMgc21hbGxlciBwYWNrZXRzIHRoYW4KKyAgICogd2Ugd2FudC4gIFRoZXJlZm9yZSwgYWNjZXB0IGFueSBNUlUgbGVzcyB0aGFuIHdoYXQgd2UgYXNrZWQgZm9yLAorICAgKiBidXQgdGhlbiBpZ25vcmUgdGhlIG5ldyB2YWx1ZSB3aGVuIHNldHRpbmcgdGhlIE1SVSBpbiB0aGUga2VybmVsLgorICAgKiBJZiB0aGV5IHNlbmQgdXMgYSBiaWdnZXIgTVJVIHRoYW4gd2hhdCB3ZSBhc2tlZCwgYWNjZXB0IGl0LCB1cCB0bworICAgKiB0aGUgbGltaXQgb2YgdGhlIGRlZmF1bHQgTVJVIHdlJ2QgZ2V0IGlmIHdlIGRpZG4ndCBuZWdvdGlhdGUuCisgICAqLworICBpZiAoZ28tPm5lZ19tcnUgJiYgZ28tPm1ydSAhPSBQUFBfREVGTVJVKSB7CisgICAgTkFLQ0lTSE9SVChDSV9NUlUsIG5lZ19tcnUsCisgICAgICBpZiAoY2lzaG9ydCA8PSB3by0+bXJ1IHx8IGNpc2hvcnQgPCBQUFBfREVGTVJVKSB7CisgICAgICAgIHRyeS5tcnUgPSBjaXNob3J0OworICAgICAgfQorICAgICk7CisgIH0KKworICAvKgorICAgKiBBZGQgYW55IGNoYXJhY3RlcnMgdGhleSB3YW50IHRvIG91ciAocmVjZWl2ZS1zaWRlKSBhc3luY21hcC4KKyAgICovCisgIGlmIChnby0+bmVnX2FzeW5jbWFwICYmIGdvLT5hc3luY21hcCAhPSAweEZGRkZGRkZGbCkgeworICAgIE5BS0NJTE9ORyhDSV9BU1lOQ01BUCwgbmVnX2FzeW5jbWFwLAorICAgICAgdHJ5LmFzeW5jbWFwID0gZ28tPmFzeW5jbWFwIHwgY2lsb25nOworICAgICk7CisgIH0KKworICAvKgorICAgKiBJZiB0aGV5J3ZlIG5haydkIG91ciBhdXRoZW50aWNhdGlvbi1wcm90b2NvbCwgY2hlY2sgd2hldGhlcgorICAgKiB0aGV5IGFyZSBwcm9wb3NpbmcgYSBkaWZmZXJlbnQgcHJvdG9jb2wsIG9yIGEgZGlmZmVyZW50CisgICAqIGhhc2ggYWxnb3JpdGhtIGZvciBDSEFQLgorICAgKi8KKyAgaWYgKChnby0+bmVnX2NoYXAgfHwgZ28tPm5lZ191cGFwKQorICAgICAgJiYgbGVuID49IENJTEVOX1NIT1JUCisgICAgICAmJiBwWzBdID09IENJX0FVVEhUWVBFICYmIHBbMV0gPj0gQ0lMRU5fU0hPUlQgJiYgcFsxXSA8PSBsZW4pIHsKKyAgICBjaWxlbiA9IHBbMV07CisgICAgbGVuIC09IGNpbGVuOworICAgIG5vLm5lZ19jaGFwID0gZ28tPm5lZ19jaGFwOworICAgIG5vLm5lZ191cGFwID0gZ28tPm5lZ191cGFwOworICAgIElOQ1BUUigyLCBwKTsKKyAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKKyAgICBpZiAoY2lzaG9ydCA9PSBQUFBfUEFQICYmIGNpbGVuID09IENJTEVOX1NIT1JUKSB7CisgICAgICAvKgorICAgICAgICogSWYgd2Ugd2VyZSBhc2tpbmcgZm9yIENIQVAsIHRoZXkgb2J2aW91c2x5IGRvbid0IHdhbnQgdG8gZG8gaXQuCisgICAgICAgKiBJZiB3ZSB3ZXJlbid0IGFza2luZyBmb3IgQ0hBUCwgdGhlbiB3ZSB3ZXJlIGFza2luZyBmb3IgUEFQLAorICAgICAgICogaW4gd2hpY2ggY2FzZSB0aGlzIE5hayBpcyBiYWQuCisgICAgICAgKi8KKyAgICAgIGlmICghZ28tPm5lZ19jaGFwKSB7CisgICAgICAgIGdvdG8gYmFkOworICAgICAgfQorICAgICAgdHJ5Lm5lZ19jaGFwID0gMDsKKyAgICAKKyAgICB9IGVsc2UgaWYgKGNpc2hvcnQgPT0gUFBQX0NIQVAgJiYgY2lsZW4gPT0gQ0lMRU5fQ0hBUCkgeworICAgICAgR0VUQ0hBUihjaWNoYXIsIHApOworICAgICAgaWYgKGdvLT5uZWdfY2hhcCkgeworICAgICAgICAvKgorICAgICAgICAgKiBXZSB3ZXJlIGFza2luZyBmb3IgQ0hBUC9NRDU7IHRoZXkgbXVzdCB3YW50IGEgZGlmZmVyZW50CisgICAgICAgICAqIGFsZ29yaXRobS4gIElmIHRoZXkgY2FuJ3QgZG8gTUQ1LCB3ZSdsbCBoYXZlIHRvIHN0b3AKKyAgICAgICAgICogYXNraW5nIGZvciBDSEFQLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNpY2hhciAhPSBnby0+Y2hhcF9tZHR5cGUpIHsKKyAgICAgICAgICB0cnkubmVnX2NoYXAgPSAwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBTdG9wIGFza2luZyBmb3IgUEFQIGlmIHdlIHdlcmUgYXNraW5nIGZvciBpdC4KKyAgICAgICAgICovCisgICAgICAgIHRyeS5uZWdfdXBhcCA9IDA7CisgICAgICB9CisgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIC8qCisgICAgICAgKiBXZSBkb24ndCByZWNvZ25pemUgd2hhdCB0aGV5J3JlIHN1Z2dlc3RpbmcuCisgICAgICAgKiBTdG9wIGFza2luZyBmb3Igd2hhdCB3ZSB3ZXJlIGFza2luZyBmb3IuCisgICAgICAgKi8KKyAgICAgIGlmIChnby0+bmVnX2NoYXApIHsKKyAgICAgICAgdHJ5Lm5lZ19jaGFwID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyeS5uZWdfdXBhcCA9IDA7CisgICAgICB9CisgICAgICBwICs9IGNpbGVuIC0gQ0lMRU5fU0hPUlQ7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogSWYgdGhleSBjYW4ndCBjb3BlIHdpdGggb3VyIGxpbmsgcXVhbGl0eSBwcm90b2NvbCwgd2UnbGwgaGF2ZQorICAgKiB0byBzdG9wIGFza2luZyBmb3IgTFFSLiAgV2UgaGF2ZW4ndCBnb3QgYW55IG90aGVyIHByb3RvY29sLgorICAgKiBJZiB0aGV5IE5hayB0aGUgcmVwb3J0aW5nIHBlcmlvZCwgdGFrZSB0aGVpciB2YWx1ZSBYWFggPworICAgKi8KKyAgTkFLQ0lMUVIoQ0lfUVVBTElUWSwgbmVnX2xxciwKKyAgICBpZiAoY2lzaG9ydCAhPSBQUFBfTFFSKSB7CisgICAgICB0cnkubmVnX2xxciA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHRyeS5scXJfcGVyaW9kID0gY2lsb25nOworICAgIH0KKyAgKTsKKworICAvKgorICAgKiBPbmx5IGltcGxlbWVudGluZyBDQkNQLi4ubm90IHRoZSByZXN0IG9mIHRoZSBjYWxsYmFjayBvcHRpb25zCisgICAqLworICBOQUtDSUNIQVIoQ0lfQ0FMTEJBQ0ssIG5lZ19jYmNwLAorICAgIHRyeS5uZWdfY2JjcCA9IDA7CisgICk7CisKKyAgLyoKKyAgICogQ2hlY2sgZm9yIGEgbG9vcGVkLWJhY2sgbGluZS4KKyAgICovCisgIE5BS0NJTE9ORyhDSV9NQUdJQ05VTUJFUiwgbmVnX21hZ2ljbnVtYmVyLAorICAgIHRyeS5tYWdpY251bWJlciA9IG1hZ2ljKCk7CisgICAgbG9vcGVkX2JhY2sgPSAxOworICApOworCisgIC8qCisgICAqIFBlZXIgc2hvdWxkbid0IHNlbmQgTmFrIGZvciBwcm90b2NvbCBjb21wcmVzc2lvbiBvcgorICAgKiBhZGRyZXNzL2NvbnRyb2wgY29tcHJlc3Npb24gcmVxdWVzdHM7IHRoZXkgc2hvdWxkIHNlbmQKKyAgICogYSBSZWplY3QgaW5zdGVhZC4gIElmIHRoZXkgc2VuZCBhIE5haywgdHJlYXQgaXQgYXMgYSBSZWplY3QuCisgICAqLworICBOQUtDSVZPSUQoQ0lfUENPTVBSRVNTSU9OLCBuZWdfcGNvbXByZXNzaW9uLAorICAgIHRyeS5uZWdfcGNvbXByZXNzaW9uID0gMDsKKyAgKTsKKyAgTkFLQ0lWT0lEKENJX0FDQ09NUFJFU1NJT04sIG5lZ19hY2NvbXByZXNzaW9uLAorICAgIHRyeS5uZWdfYWNjb21wcmVzc2lvbiA9IDA7CisgICk7CisKKyAgLyoKKyAgICogVGhlcmUgbWF5IGJlIHJlbWFpbmluZyBDSXMsIGlmIHRoZSBwZWVyIGlzIHJlcXVlc3RpbmcgbmVnb3RpYXRpb24KKyAgICogb24gYW4gb3B0aW9uIHRoYXQgd2UgZGlkbid0IGluY2x1ZGUgaW4gb3VyIHJlcXVlc3QgcGFja2V0LgorICAgKiBJZiB3ZSBzZWUgYW4gb3B0aW9uIHRoYXQgd2UgcmVxdWVzdGVkLCBvciBvbmUgd2UndmUgYWxyZWFkeSBzZWVuCisgICAqIGluIHRoaXMgcGFja2V0LCB0aGVuIHRoaXMgcGFja2V0IGlzIGJhZC4KKyAgICogSWYgd2Ugd2FudGVkIHRvIHJlc3BvbmQgYnkgc3RhcnRpbmcgdG8gbmVnb3RpYXRlIG9uIHRoZSByZXF1ZXN0ZWQKKyAgICogb3B0aW9uKHMpLCB3ZSBjb3VsZCwgYnV0IHdlIGRvbid0LCBiZWNhdXNlIGV4Y2VwdCBmb3IgdGhlCisgICAqIGF1dGhlbnRpY2F0aW9uIHR5cGUgYW5kIHF1YWxpdHkgcHJvdG9jb2wsIGlmIHdlIGFyZSBub3QgbmVnb3RpYXRpbmcKKyAgICogYW4gb3B0aW9uLCBpdCBpcyBiZWNhdXNlIHdlIHdlcmUgdG9sZCBub3QgdG8uCisgICAqIEZvciB0aGUgYXV0aGVudGljYXRpb24gdHlwZSwgdGhlIE5hayBmcm9tIHRoZSBwZWVyIG1lYW5zCisgICAqIGBsZXQgbWUgYXV0aGVudGljYXRlIG15c2VsZiB3aXRoIHlvdScgd2hpY2ggaXMgYSBiaXQgcG9pbnRsZXNzLgorICAgKiBGb3IgdGhlIHF1YWxpdHkgcHJvdG9jb2wsIHRoZSBOYWsgbWVhbnMgYGFzayBtZSB0byBzZW5kIHlvdSBxdWFsaXR5CisgICAqIHJlcG9ydHMnLCBidXQgaWYgd2UgZGlkbid0IGFzayBmb3IgdGhlbSwgd2UgZG9uJ3Qgd2FudCB0aGVtLgorICAgKiBBbiBvcHRpb24gd2UgZG9uJ3QgcmVjb2duaXplIHJlcHJlc2VudHMgdGhlIHBlZXIgYXNraW5nIHRvCisgICAqIG5lZ290aWF0ZSBzb21lIG9wdGlvbiB3ZSBkb24ndCBzdXBwb3J0LCBzbyBpZ25vcmUgaXQuCisgICAqLworICB3aGlsZSAobGVuID4gQ0lMRU5fVk9JRCkgeworICAgIEdFVENIQVIoY2l0eXBlLCBwKTsKKyAgICBHRVRDSEFSKGNpbGVuLCBwKTsKKyAgICBpZiAoY2lsZW4gPCBDSUxFTl9WT0lEIHx8IChsZW4gLT0gY2lsZW4pIDwgMCkgeworICAgICAgZ290byBiYWQ7CisgICAgfQorICAgIG5leHQgPSBwICsgY2lsZW4gLSAyOworCisgICAgc3dpdGNoIChjaXR5cGUpIHsKKyAgICAgIGNhc2UgQ0lfTVJVOgorICAgICAgICBpZiAoKGdvLT5uZWdfbXJ1ICYmIGdvLT5tcnUgIT0gUFBQX0RFRk1SVSkKKyAgICAgICAgICAgIHx8IG5vLm5lZ19tcnUgfHwgY2lsZW4gIT0gQ0lMRU5fU0hPUlQpIHsKKyAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKKyAgICAgICAgaWYgKGNpc2hvcnQgPCBQUFBfREVGTVJVKSB7CisgICAgICAgICAgdHJ5Lm1ydSA9IGNpc2hvcnQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENJX0FTWU5DTUFQOgorICAgICAgICBpZiAoKGdvLT5uZWdfYXN5bmNtYXAgJiYgZ28tPmFzeW5jbWFwICE9IDB4RkZGRkZGRkZsKQorICAgICAgICAgICAgfHwgbm8ubmVnX2FzeW5jbWFwIHx8IGNpbGVuICE9IENJTEVOX0xPTkcpIHsKKyAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0lfQVVUSFRZUEU6CisgICAgICAgIGlmIChnby0+bmVnX2NoYXAgfHwgbm8ubmVnX2NoYXAgfHwgZ28tPm5lZ191cGFwIHx8IG5vLm5lZ191cGFwKSB7CisgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENJX01BR0lDTlVNQkVSOgorICAgICAgICBpZiAoZ28tPm5lZ19tYWdpY251bWJlciB8fCBuby5uZWdfbWFnaWNudW1iZXIgfHwKKyAgICAgICAgICAgIGNpbGVuICE9IENJTEVOX0xPTkcpIHsKKyAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0lfUENPTVBSRVNTSU9OOgorICAgICAgICBpZiAoZ28tPm5lZ19wY29tcHJlc3Npb24gfHwgbm8ubmVnX3Bjb21wcmVzc2lvbgorICAgICAgICAgICAgfHwgY2lsZW4gIT0gQ0lMRU5fVk9JRCkgeworICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDSV9BQ0NPTVBSRVNTSU9OOgorICAgICAgICBpZiAoZ28tPm5lZ19hY2NvbXByZXNzaW9uIHx8IG5vLm5lZ19hY2NvbXByZXNzaW9uCisgICAgICAgICAgICB8fCBjaWxlbiAhPSBDSUxFTl9WT0lEKSB7CisgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENJX1FVQUxJVFk6CisgICAgICAgIGlmIChnby0+bmVnX2xxciB8fCBuby5uZWdfbHFyIHx8IGNpbGVuICE9IENJTEVOX0xRUikgeworICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwID0gbmV4dDsKKyAgfQorCisgIC8qIElmIHRoZXJlIGlzIHN0aWxsIGFueXRoaW5nIGxlZnQsIHRoaXMgcGFja2V0IGlzIGJhZC4gKi8KKyAgaWYgKGxlbiAhPSAwKSB7CisgICAgZ290byBiYWQ7CisgIH0KKworICAvKgorICAqIE9LLCB0aGUgTmFrIGlzIGdvb2QuICBOb3cgd2UgY2FuIHVwZGF0ZSBzdGF0ZS4KKyAgKi8KKyAgaWYgKGYtPnN0YXRlICE9IExTX09QRU5FRCkgeworICAgIGlmIChsb29wZWRfYmFjaykgeworICAgICAgaWYgKCsrdHJ5Lm51bWxvb3BzID49IGxjcF9sb29wYmFja2ZhaWwpIHsKKyAgICAgICAgTENQREVCVUcoTE9HX05PVElDRSwgKCJTZXJpYWwgbGluZSBpcyBsb29wZWQgYmFjay5cbiIpKTsKKyAgICAgICAgbGNwX2Nsb3NlKGYtPnVuaXQsICJMb29wYmFjayBkZXRlY3RlZCIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0cnkubnVtbG9vcHMgPSAwOworICAgIH0KKyAgICAqZ28gPSB0cnk7CisgIH0KKworICByZXR1cm4gMTsKKworYmFkOgorICBMQ1BERUJVRyhMT0dfV0FSTklORywgKCJsY3BfbmFrY2k6IHJlY2VpdmVkIGJhZCBOYWshXG4iKSk7CisgIHJldHVybiAwOworfQorCisKKy8qCisgKiBsY3BfcmVqY2kgLSBQZWVyIGhhcyBSZWplY3RlZCBzb21lIG9mIG91ciBDSXMuCisgKiBUaGlzIHNob3VsZCBub3QgbW9kaWZ5IGFueSBzdGF0ZSBpZiB0aGUgUmVqZWN0IGlzIGJhZAorICogb3IgaWYgTENQIGlzIGluIHRoZSBMU19PUEVORUQgc3RhdGUuCisgKgorICogUmV0dXJuczoKKyAqICAwIC0gUmVqZWN0IHdhcyBiYWQuCisgKiAgMSAtIFJlamVjdCB3YXMgZ29vZC4KKyAqLworc3RhdGljIGludAorbGNwX3JlamNpKGZzbSAqZiwgdV9jaGFyICpwLCBpbnQgbGVuKQoreworICBsY3Bfb3B0aW9ucyAqZ28gPSAmbGNwX2dvdG9wdGlvbnNbZi0+dW5pdF07CisgIHVfY2hhciBjaWNoYXI7CisgIHVfc2hvcnQgY2lzaG9ydDsKKyAgdTMyX3QgY2lsb25nOworICBsY3Bfb3B0aW9ucyB0cnk7IC8qIG9wdGlvbnMgdG8gcmVxdWVzdCBuZXh0IHRpbWUgKi8KKworICB0cnkgPSAqZ287CisKKyAgLyoKKyAgICogQW55IFJlamVjdGVkIENJcyBtdXN0IGJlIGluIGV4YWN0bHkgdGhlIHNhbWUgb3JkZXIgdGhhdCB3ZSBzZW50LgorICAgKiBDaGVjayBwYWNrZXQgbGVuZ3RoIGFuZCBDSSBsZW5ndGggYXQgZWFjaCBzdGVwLgorICAgKiBJZiB3ZSBmaW5kIGFueSBkZXZpYXRpb25zLCB0aGVuIHRoaXMgcGFja2V0IGlzIGJhZC4KKyAgICovCisjZGVmaW5lIFJFSkNJVk9JRChvcHQsIG5lZykgXAorICBpZiAoZ28tPm5lZyAmJiBcCisgICAgICBsZW4gPj0gQ0lMRU5fVk9JRCAmJiBcCisgICAgICBwWzFdID09IENJTEVOX1ZPSUQgJiYgXAorICAgICAgcFswXSA9PSBvcHQpIHsgXAorICAgIGxlbiAtPSBDSUxFTl9WT0lEOyBcCisgICAgSU5DUFRSKENJTEVOX1ZPSUQsIHApOyBcCisgICAgdHJ5Lm5lZyA9IDA7IFwKKyAgICBMQ1BERUJVRyhMT0dfSU5GTywgKCJsY3BfcmVqY2k6IHZvaWQgb3B0ICVkIHJlamVjdGVkXG4iLCBvcHQpKTsgXAorICB9CisjZGVmaW5lIFJFSkNJU0hPUlQob3B0LCBuZWcsIHZhbCkgXAorICBpZiAoZ28tPm5lZyAmJiBcCisgICAgICBsZW4gPj0gQ0lMRU5fU0hPUlQgJiYgXAorICAgICAgcFsxXSA9PSBDSUxFTl9TSE9SVCAmJiBcCisgICAgICBwWzBdID09IG9wdCkgeyBcCisgICAgbGVuIC09IENJTEVOX1NIT1JUOyBcCisgICAgSU5DUFRSKDIsIHApOyBcCisgICAgR0VUU0hPUlQoY2lzaG9ydCwgcCk7IFwKKyAgICAvKiBDaGVjayByZWplY3RlZCB2YWx1ZS4gKi8gXAorICAgIGlmIChjaXNob3J0ICE9IHZhbCkgeyBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIH0gXAorICAgIHRyeS5uZWcgPSAwOyBcCisgICAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX3JlamNpOiBzaG9ydCBvcHQgJWQgcmVqZWN0ZWRcbiIsIG9wdCkpOyBcCisgIH0KKyNkZWZpbmUgUkVKQ0lDSEFQKG9wdCwgbmVnLCB2YWwsIGRpZ2VzdCkgXAorICBpZiAoZ28tPm5lZyAmJiBcCisgICAgICBsZW4gPj0gQ0lMRU5fQ0hBUCAmJiBcCisgICAgICBwWzFdID09IENJTEVOX0NIQVAgJiYgXAorICAgICAgcFswXSA9PSBvcHQpIHsgXAorICAgIGxlbiAtPSBDSUxFTl9DSEFQOyBcCisgICAgSU5DUFRSKDIsIHApOyBcCisgICAgR0VUU0hPUlQoY2lzaG9ydCwgcCk7IFwKKyAgICBHRVRDSEFSKGNpY2hhciwgcCk7IFwKKyAgICAvKiBDaGVjayByZWplY3RlZCB2YWx1ZS4gKi8gXAorICAgIGlmIChjaXNob3J0ICE9IHZhbCB8fCBjaWNoYXIgIT0gZGlnZXN0KSB7IFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgfSBcCisgICAgdHJ5Lm5lZyA9IDA7IFwKKyAgICB0cnkubmVnX3VwYXAgPSAwOyBcCisgICAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX3JlamNpOiBjaGFwIG9wdCAlZCByZWplY3RlZFxuIiwgb3B0KSk7IFwKKyAgfQorI2RlZmluZSBSRUpDSUxPTkcob3B0LCBuZWcsIHZhbCkgXAorICBpZiAoZ28tPm5lZyAmJiBcCisgICAgICBsZW4gPj0gQ0lMRU5fTE9ORyAmJiBcCisgICAgICBwWzFdID09IENJTEVOX0xPTkcgJiYgXAorICAgICAgcFswXSA9PSBvcHQpIHsgXAorICAgIGxlbiAtPSBDSUxFTl9MT05HOyBcCisgICAgSU5DUFRSKDIsIHApOyBcCisgICAgR0VUTE9ORyhjaWxvbmcsIHApOyBcCisgICAgLyogQ2hlY2sgcmVqZWN0ZWQgdmFsdWUuICovIFwKKyAgICBpZiAoY2lsb25nICE9IHZhbCkgeyBcCisgICAgICBnb3RvIGJhZDsgXAorICAgIH0gXAorICAgIHRyeS5uZWcgPSAwOyBcCisgICAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX3JlamNpOiBsb25nIG9wdCAlZCByZWplY3RlZFxuIiwgb3B0KSk7IFwKKyAgfQorI2RlZmluZSBSRUpDSUxRUihvcHQsIG5lZywgdmFsKSBcCisgIGlmIChnby0+bmVnICYmIFwKKyAgICAgIGxlbiA+PSBDSUxFTl9MUVIgJiYgXAorICAgICAgcFsxXSA9PSBDSUxFTl9MUVIgJiYgXAorICAgICAgcFswXSA9PSBvcHQpIHsgXAorICAgIGxlbiAtPSBDSUxFTl9MUVI7IFwKKyAgICBJTkNQVFIoMiwgcCk7IFwKKyAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsgXAorICAgIEdFVExPTkcoY2lsb25nLCBwKTsgXAorICAgIC8qIENoZWNrIHJlamVjdGVkIHZhbHVlLiAqLyBcCisgICAgaWYgKGNpc2hvcnQgIT0gUFBQX0xRUiB8fCBjaWxvbmcgIT0gdmFsKSB7IFwKKyAgICAgIGdvdG8gYmFkOyBcCisgICAgfSBcCisgICAgdHJ5Lm5lZyA9IDA7IFwKKyAgICBMQ1BERUJVRyhMT0dfSU5GTywgKCJsY3BfcmVqY2k6IExRUiBvcHQgJWQgcmVqZWN0ZWRcbiIsIG9wdCkpOyBcCisgIH0KKyNkZWZpbmUgUkVKQ0lDQkNQKG9wdCwgbmVnLCB2YWwpIFwKKyAgaWYgKGdvLT5uZWcgJiYgXAorICAgICAgbGVuID49IENJTEVOX0NCQ1AgJiYgXAorICAgICAgcFsxXSA9PSBDSUxFTl9DQkNQICYmIFwKKyAgICAgIHBbMF0gPT0gb3B0KSB7IFwKKyAgICBsZW4gLT0gQ0lMRU5fQ0JDUDsgXAorICAgIElOQ1BUUigyLCBwKTsgXAorICAgIEdFVENIQVIoY2ljaGFyLCBwKTsgXAorICAgIC8qIENoZWNrIHJlamVjdGVkIHZhbHVlLiAqLyBcCisgICAgaWYgKGNpY2hhciAhPSB2YWwpIHsgXAorICAgICAgZ290byBiYWQ7IFwKKyAgICB9IFwKKyAgICB0cnkubmVnID0gMDsgXAorICAgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9yZWpjaTogQ2FsbGJhY2sgb3B0ICVkIHJlamVjdGVkXG4iLCBvcHQpKTsgXAorICB9CisgIAorICBSRUpDSVNIT1JUKENJX01SVSwgbmVnX21ydSwgZ28tPm1ydSk7CisgIFJFSkNJTE9ORyhDSV9BU1lOQ01BUCwgbmVnX2FzeW5jbWFwLCBnby0+YXN5bmNtYXApOworICBSRUpDSUNIQVAoQ0lfQVVUSFRZUEUsIG5lZ19jaGFwLCBQUFBfQ0hBUCwgZ28tPmNoYXBfbWR0eXBlKTsKKyAgaWYgKCFnby0+bmVnX2NoYXApIHsKKyAgICBSRUpDSVNIT1JUKENJX0FVVEhUWVBFLCBuZWdfdXBhcCwgUFBQX1BBUCk7CisgIH0KKyAgUkVKQ0lMUVIoQ0lfUVVBTElUWSwgbmVnX2xxciwgZ28tPmxxcl9wZXJpb2QpOworICBSRUpDSUNCQ1AoQ0lfQ0FMTEJBQ0ssIG5lZ19jYmNwLCBDQkNQX09QVCk7CisgIFJFSkNJTE9ORyhDSV9NQUdJQ05VTUJFUiwgbmVnX21hZ2ljbnVtYmVyLCBnby0+bWFnaWNudW1iZXIpOworICBSRUpDSVZPSUQoQ0lfUENPTVBSRVNTSU9OLCBuZWdfcGNvbXByZXNzaW9uKTsKKyAgUkVKQ0lWT0lEKENJX0FDQ09NUFJFU1NJT04sIG5lZ19hY2NvbXByZXNzaW9uKTsKKyAgCisgIC8qCisgICAqIElmIHRoZXJlIGFyZSBhbnkgcmVtYWluaW5nIENJcywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCisgICAqLworICBpZiAobGVuICE9IDApIHsKKyAgICBnb3RvIGJhZDsKKyAgfQorICAvKgorICAgKiBOb3cgd2UgY2FuIHVwZGF0ZSBzdGF0ZS4KKyAgICovCisgIGlmIChmLT5zdGF0ZSAhPSBMU19PUEVORUQpIHsKKyAgICAqZ28gPSB0cnk7CisgIH0KKyAgcmV0dXJuIDE7CisgIAorYmFkOgorICBMQ1BERUJVRyhMT0dfV0FSTklORywgKCJsY3BfcmVqY2k6IHJlY2VpdmVkIGJhZCBSZWplY3QhXG4iKSk7CisgIHJldHVybiAwOworfQorCisKKy8qCisgKiBsY3BfcmVxY2kgLSBDaGVjayB0aGUgcGVlcidzIHJlcXVlc3RlZCBDSXMgYW5kIHNlbmQgYXBwcm9wcmlhdGUgcmVzcG9uc2UuCisgKgorICogUmV0dXJuczogQ09ORkFDSywgQ09ORk5BSyBvciBDT05GUkVKIGFuZCBpbnB1dCBwYWNrZXQgbW9kaWZpZWQKKyAqIGFwcHJvcHJpYXRlbHkuICBJZiByZWplY3RfaWZfZGlzYWdyZWUgaXMgbm9uLXplcm8sIGRvZXNuJ3QgcmV0dXJuCisgKiBDT05GTkFLOyByZXR1cm5zIENPTkZSRUogaWYgaXQgY2FuJ3QgcmV0dXJuIENPTkZBQ0suCisgKi8KK3N0YXRpYyBpbnQKK2xjcF9yZXFjaShmc20gKmYsIAorICAgICAgICAgIHVfY2hhciAqaW5wLCAgICAvKiBSZXF1ZXN0ZWQgQ0lzICovCisgICAgICAgICAgaW50ICpsZW5wLCAgICAgIC8qIExlbmd0aCBvZiByZXF1ZXN0ZWQgQ0lzICovCisgICAgICAgICAgaW50IHJlamVjdF9pZl9kaXNhZ3JlZSkKK3sKKyAgbGNwX29wdGlvbnMgKmdvID0gJmxjcF9nb3RvcHRpb25zW2YtPnVuaXRdOworICBsY3Bfb3B0aW9ucyAqaG8gPSAmbGNwX2hpc29wdGlvbnNbZi0+dW5pdF07CisgIGxjcF9vcHRpb25zICphbyA9ICZsY3BfYWxsb3dvcHRpb25zW2YtPnVuaXRdOworICB1X2NoYXIgKmNpcCwgKm5leHQ7ICAgICAgICAgLyogUG9pbnRlciB0byBjdXJyZW50IGFuZCBuZXh0IENJcyAqLworICBpbnQgY2lsZW4sIGNpdHlwZTsgICAgICAgICAgLyogUGFyc2VkIGxlbiwgdHlwZSAqLworICB1X2NoYXIgY2ljaGFyOyAgICAgICAgICAgICAgLyogUGFyc2VkIGNoYXIgdmFsdWUgKi8KKyAgdV9zaG9ydCBjaXNob3J0OyAgICAgICAgICAgIC8qIFBhcnNlZCBzaG9ydCB2YWx1ZSAqLworICB1MzJfdCBjaWxvbmc7ICAgICAgICAgICAgICAgLyogUGFyc2UgbG9uZyB2YWx1ZSAqLworICBpbnQgcmMgPSBDT05GQUNLOyAgICAgICAgICAgLyogRmluYWwgcGFja2V0IHJldHVybiBjb2RlICovCisgIGludCBvcmM7ICAgICAgICAgICAgICAgICAgICAvKiBJbmRpdmlkdWFsIG9wdGlvbiByZXR1cm4gY29kZSAqLworICB1X2NoYXIgKnA7ICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IGNoYXIgdG8gcGFyc2UgKi8KKyAgdV9jaGFyICpyZWpwOyAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBjaGFyIGluIHJlamVjdCBmcmFtZSAqLworICB1X2NoYXIgKm5ha3A7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IGNoYXIgaW4gTmFrIGZyYW1lICovCisgIGludCBsID0gKmxlbnA7ICAgICAgICAgICAgICAvKiBMZW5ndGggbGVmdCAqLworI2lmIFRSQUNFTENQID4gMAorICBjaGFyIHRyYWNlQnVmWzgwXTsKKyAgc2l6ZV90IHRyYWNlTmR4ID0gMDsKKyNlbmRpZgorCisgIC8qCisgICAqIFJlc2V0IGFsbCBoaXMgb3B0aW9ucy4KKyAgICovCisgIEJaRVJPKGhvLCBzaXplb2YoKmhvKSk7CisKKyAgLyoKKyAgICogUHJvY2VzcyBhbGwgaGlzIG9wdGlvbnMuCisgICAqLworICBuZXh0ID0gaW5wOworICBuYWtwID0gbmFrX2J1ZmZlcjsKKyAgcmVqcCA9IGlucDsKKyAgd2hpbGUgKGwpIHsKKyAgICBvcmMgPSBDT05GQUNLOyAgICAgIC8qIEFzc3VtZSBzdWNjZXNzICovCisgICAgY2lwID0gcCA9IG5leHQ7ICAgICAvKiBSZW1lbWJlciBiZWdpbmluZyBvZiBDSSAqLworICAgIGlmIChsIDwgMiB8fCAgICAgICAgLyogTm90IGVub3VnaCBkYXRhIGZvciBDSSBoZWFkZXIgb3IgKi8KKyAgICAgICAgcFsxXSA8IDIgfHwgICAgIC8qICBDSSBsZW5ndGggdG9vIHNtYWxsIG9yICovCisgICAgICAgIHBbMV0gPiBsKSB7ICAgICAvKiAgQ0kgbGVuZ3RoIHRvbyBiaWc/ICovCisgICAgICBMQ1BERUJVRyhMT0dfV0FSTklORywgKCJsY3BfcmVxY2k6IGJhZCBDSSBsZW5ndGghXG4iKSk7CisgICAgICBvcmMgPSBDT05GUkVKOyAgICAvKiBSZWplY3QgYmFkIENJICovCisgICAgICBjaWxlbiA9IGw7ICAgICAgICAvKiBSZWplY3QgdGlsbCBlbmQgb2YgcGFja2V0ICovCisgICAgICBsID0gMDsgICAgICAgICAgICAvKiBEb24ndCBsb29wIGFnYWluICovCisgICAgICBjaXR5cGUgPSAwOworICAgICAgZ290byBlbmRzd2l0Y2g7CisgICAgfQorICAgIEdFVENIQVIoY2l0eXBlLCBwKTsgLyogUGFyc2UgQ0kgdHlwZSAqLworICAgIEdFVENIQVIoY2lsZW4sIHApOyAgLyogUGFyc2UgQ0kgbGVuZ3RoICovCisgICAgbCAtPSBjaWxlbjsgICAgICAgICAvKiBBZGp1c3QgcmVtYWluaW5nIGxlbmd0aCAqLworICAgIG5leHQgKz0gY2lsZW47ICAgICAgLyogU3RlcCB0byBuZXh0IENJICovCisKKyAgICBzd2l0Y2ggKGNpdHlwZSkgeyAgIC8qIENoZWNrIENJIHR5cGUgKi8KKyAgICAgIGNhc2UgQ0lfTVJVOgorICAgICAgICBpZiAoIWFvLT5uZWdfbXJ1KSB7ICAgIC8qIEFsbG93IG9wdGlvbj8gKi8KKyAgICAgICAgICBMQ1BERUJVRyhMT0dfSU5GTywgKCJsY3BfcmVxY2k6IFJlamVjdCBNUlUgLSBub3QgYWxsb3dlZFxuIikpOworICAgICAgICAgIG9yYyA9IENPTkZSRUo7ICAgIC8qIFJlamVjdCBDSSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGNpbGVuICE9IENJTEVOX1NIT1JUKSB7ICAvKiBDaGVjayBDSSBsZW5ndGggKi8KKyAgICAgICAgICBMQ1BERUJVRyhMT0dfSU5GTywgKCJsY3BfcmVxY2k6IFJlamVjdCBNUlUgLSBiYWQgbGVuZ3RoXG4iKSk7CisgICAgICAgICAgb3JjID0gQ09ORlJFSjsgICAgLyogUmVqZWN0IENJICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgR0VUU0hPUlQoY2lzaG9ydCwgcCk7ICAvKiBQYXJzZSBNUlUgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBIZSBtdXN0IGJlIGFibGUgdG8gcmVjZWl2ZSBhdCBsZWFzdCBvdXIgbWluaW11bS4KKyAgICAgICAgICogTm8gbmVlZCB0byBjaGVjayBhIG1heGltdW0uICBJZiBoZSBzZW5kcyBhIGxhcmdlIG51bWJlciwKKyAgICAgICAgICogd2UnbGwganVzdCBpZ25vcmUgaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoY2lzaG9ydCA8IFBQUF9NSU5NUlUpIHsKKyAgICAgICAgICBMQ1BERUJVRyhMT0dfSU5GTywgKCJsY3BfcmVxY2k6IE5hayAtIE1SVSB0b28gc21hbGxcbiIpKTsKKyAgICAgICAgICBvcmMgPSBDT05GTkFLOyAgICAvKiBOYWsgQ0kgKi8KKyAgICAgICAgICBQVVRDSEFSKENJX01SVSwgbmFrcCk7CisgICAgICAgICAgUFVUQ0hBUihDSUxFTl9TSE9SVCwgbmFrcCk7CisgICAgICAgICAgUFVUU0hPUlQoUFBQX01JTk1SVSwgbmFrcCk7ICAvKiBHaXZlIGhpbSBhIGhpbnQgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBoby0+bmVnX21ydSA9IDE7ICAgIC8qIFJlbWVtYmVyIGhlIHNlbnQgTVJVICovCisgICAgICAgIGhvLT5tcnUgPSBjaXNob3J0OyAgICAvKiBBbmQgcmVtZW1iZXIgdmFsdWUgKi8KKyNpZiBUUkFDRUxDUCA+IDAKKyAgICAgICAgc25wcmludGYoJnRyYWNlQnVmW3RyYWNlTmR4XSwgc2l6ZW9mKHRyYWNlQnVmKSwgIiBNUlUgJWQiLCBjaXNob3J0KTsKKyAgICAgICAgdHJhY2VOZHggPSBzdHJsZW4odHJhY2VCdWYpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENJX0FTWU5DTUFQOgorICAgICAgICBpZiAoIWFvLT5uZWdfYXN5bmNtYXApIHsKKyAgICAgICAgICBMQ1BERUJVRyhMT0dfSU5GTywgKCJsY3BfcmVxY2k6IFJlamVjdCBBU1lOQ01BUCBub3QgYWxsb3dlZFxuIikpOworICAgICAgICAgIG9yYyA9IENPTkZSRUo7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoY2lsZW4gIT0gQ0lMRU5fTE9ORykgeworICAgICAgICAgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9yZXFjaTogUmVqZWN0IEFTWU5DTUFQIGJhZCBsZW5ndGhcbiIpKTsKKyAgICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEdFVExPTkcoY2lsb25nLCBwKTsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIEFzeW5jbWFwIG11c3QgaGF2ZSBzZXQgYXQgbGVhc3QgdGhlIGJpdHMKKyAgICAgICAgICogd2hpY2ggYXJlIHNldCBpbiBsY3BfYWxsb3dvcHRpb25zW3VuaXRdLmFzeW5jbWFwLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChhby0+YXN5bmNtYXAgJiB+Y2lsb25nKSAhPSAwKSB7CisgICAgICAgICAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX3JlcWNpOiBOYWsgQVNZTkNNQVAgJWxYIG1pc3NpbmcgJWxYXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgY2lsb25nLCBhby0+YXN5bmNtYXApKTsKKyAgICAgICAgICBvcmMgPSBDT05GTkFLOworICAgICAgICAgIFBVVENIQVIoQ0lfQVNZTkNNQVAsIG5ha3ApOworICAgICAgICAgIFBVVENIQVIoQ0lMRU5fTE9ORywgbmFrcCk7CisgICAgICAgICAgUFVUTE9ORyhhby0+YXN5bmNtYXAgfCBjaWxvbmcsIG5ha3ApOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGhvLT5uZWdfYXN5bmNtYXAgPSAxOworICAgICAgICBoby0+YXN5bmNtYXAgPSBjaWxvbmc7CisjaWYgVFJBQ0VMQ1AgPiAwCisgICAgICAgIHNucHJpbnRmKCZ0cmFjZUJ1Zlt0cmFjZU5keF0sIHNpemVvZih0cmFjZUJ1ZiksICIgQVNZTkNNQVA9JWxYIiwgY2lsb25nKTsKKyAgICAgICAgdHJhY2VOZHggPSBzdHJsZW4odHJhY2VCdWYpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENJX0FVVEhUWVBFOgorICAgICAgICBpZiAoY2lsZW4gPCBDSUxFTl9TSE9SVCkgeworICAgICAgICAgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9yZXFjaTogUmVqZWN0IEFVVEhUWVBFIG1pc3NpbmcgYXJnXG4iKSk7CisgICAgICAgICAgb3JjID0gQ09ORlJFSjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICghKGFvLT5uZWdfdXBhcCB8fCBhby0+bmVnX2NoYXApKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBSZWplY3QgdGhlIG9wdGlvbiBpZiB3ZSdyZSBub3Qgd2lsbGluZyB0byBhdXRoZW50aWNhdGUuCisgICAgICAgICAgICovCisgICAgICAgICAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX3JlcWNpOiBSZWplY3QgQVVUSFRZUEUgbm90IGFsbG93ZWRcbiIpKTsKKyAgICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOworICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogQXV0aHR5cGUgbXVzdCBiZSBVUEFQIG9yIENIQVAuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IGlmIGJvdGggYW8tPm5lZ191cGFwIGFuZCBhby0+bmVnX2NoYXAgYXJlIHNldCwKKyAgICAgICAgICogYW5kIHRoZSBwZWVyIHNlbmRzIGEgQ29uZmlndXJlLVJlcXVlc3Qgd2l0aCB0d28KKyAgICAgICAgICogYXV0aGVudGljYXRlLXByb3RvY29sIHJlcXVlc3RzLCBvbmUgZm9yIENIQVAgYW5kIG9uZQorICAgICAgICAgKiBmb3IgVVBBUCwgdGhlbiB3ZSB3aWxsIHJlamVjdCB0aGUgc2Vjb25kIHJlcXVlc3QuCisgICAgICAgICAqIFdoZXRoZXIgd2UgZW5kIHVwIGRvaW5nIENIQVAgb3IgVVBBUCBkZXBlbmRzIHRoZW4gb24KKyAgICAgICAgICogdGhlIG9yZGVyaW5nIG9mIHRoZSBDSXMgaW4gdGhlIHBlZXIncyBDb25maWd1cmUtUmVxdWVzdC4KKyAgICAgICAgICovCisgICAgICAgIAorICAgICAgICBpZiAoY2lzaG9ydCA9PSBQUFBfUEFQKSB7CisgICAgICAgICAgaWYgKGhvLT5uZWdfY2hhcCkgeyAgLyogd2UndmUgYWxyZWFkeSBhY2NlcHRlZCBDSEFQICovCisgICAgICAgICAgICBMQ1BERUJVRyhMT0dfV0FSTklORywgKCJsY3BfcmVxY2k6IFJlamVjdCBBVVRIVFlQRSBQQVAgYWxyZWFkeSBhY2NlcHRlZFxuIikpOworICAgICAgICAgICAgb3JjID0gQ09ORlJFSjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSBpZiAoY2lsZW4gIT0gQ0lMRU5fU0hPUlQpIHsKKyAgICAgICAgICAgIExDUERFQlVHKExPR19XQVJOSU5HLCAoImxjcF9yZXFjaTogUmVqZWN0IEFVVEhUWVBFIFBBUCBiYWQgbGVuXG4iKSk7CisgICAgICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghYW8tPm5lZ191cGFwKSB7ICAvKiB3ZSBkb24ndCB3YW50IHRvIGRvIFBBUCAqLworICAgICAgICAgICAgTENQREVCVUcoTE9HX1dBUk5JTkcsICgibGNwX3JlcWNpOiBOYWsgQVVUSFRZUEUgUEFQIG5vdCBhbGxvd2VkXG4iKSk7CisgICAgICAgICAgICBvcmMgPSBDT05GTkFLOyAgLyogTkFLIGl0IGFuZCBzdWdnZXN0IENIQVAgKi8KKyAgICAgICAgICAgIFBVVENIQVIoQ0lfQVVUSFRZUEUsIG5ha3ApOworICAgICAgICAgICAgUFVUQ0hBUihDSUxFTl9DSEFQLCBuYWtwKTsKKyAgICAgICAgICAgIFBVVFNIT1JUKFBQUF9DSEFQLCBuYWtwKTsKKyAgICAgICAgICAgIFBVVENIQVIoYW8tPmNoYXBfbWR0eXBlLCBuYWtwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBoby0+bmVnX3VwYXAgPSAxOworI2lmIFRSQUNFTENQID4gMAorICAgICAgICAgIHNucHJpbnRmKCZ0cmFjZUJ1Zlt0cmFjZU5keF0sIHNpemVvZih0cmFjZUJ1ZiksICIgUEFQICglWCkiLCBjaXNob3J0KTsKKyAgICAgICAgICB0cmFjZU5keCA9IHN0cmxlbih0cmFjZUJ1Zik7CisjZW5kaWYKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2lzaG9ydCA9PSBQUFBfQ0hBUCkgeworICAgICAgICAgIGlmIChoby0+bmVnX3VwYXApIHsgIC8qIHdlJ3ZlIGFscmVhZHkgYWNjZXB0ZWQgUEFQICovCisgICAgICAgICAgICBMQ1BERUJVRyhMT0dfV0FSTklORywgKCJsY3BfcmVxY2k6IFJlamVjdCBBVVRIVFlQRSBDSEFQIGFjY2VwdGVkIFBBUFxuIikpOworICAgICAgICAgICAgb3JjID0gQ09ORlJFSjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSBpZiAoY2lsZW4gIT0gQ0lMRU5fQ0hBUCkgeworICAgICAgICAgICAgTENQREVCVUcoTE9HX1dBUk5JTkcsICgibGNwX3JlcWNpOiBSZWplY3QgQVVUSFRZUEUgQ0hBUCBiYWQgbGVuXG4iKSk7CisgICAgICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghYW8tPm5lZ19jaGFwKSB7ICAvKiB3ZSBkb24ndCB3YW50IHRvIGRvIENIQVAgKi8KKyAgICAgICAgICAgIExDUERFQlVHKExPR19XQVJOSU5HLCAoImxjcF9yZXFjaTogTmFrIEFVVEhUWVBFIENIQVAgbm90IGFsbG93ZWRcbiIpKTsKKyAgICAgICAgICAgIG9yYyA9IENPTkZOQUs7ICAvKiBOQUsgaXQgYW5kIHN1Z2dlc3QgUEFQICovCisgICAgICAgICAgICBQVVRDSEFSKENJX0FVVEhUWVBFLCBuYWtwKTsKKyAgICAgICAgICAgIFBVVENIQVIoQ0lMRU5fU0hPUlQsIG5ha3ApOworICAgICAgICAgICAgUFVUU0hPUlQoUFBQX1BBUCwgbmFrcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgR0VUQ0hBUihjaWNoYXIsIHApOyAgLyogZ2V0IGRpZ2VzdCB0eXBlKi8KKyAgICAgICAgICBpZiAoY2ljaGFyICE9IENIQVBfRElHRVNUX01ENQorI2lmIE1TQ0hBUF9TVVBQT1JUCisgICAgICAgICAgICAgICYmIGNpY2hhciAhPSBDSEFQX01JQ1JPU09GVAorI2VuZGlmCisgICAgICAgICAgKSB7CisgICAgICAgICAgICBMQ1BERUJVRyhMT0dfV0FSTklORywgKCJsY3BfcmVxY2k6IE5hayBBVVRIVFlQRSBDSEFQIGRpZ2VzdD0lZFxuIiwgKGludCljaWNoYXIpKTsKKyAgICAgICAgICAgIG9yYyA9IENPTkZOQUs7CisgICAgICAgICAgICBQVVRDSEFSKENJX0FVVEhUWVBFLCBuYWtwKTsKKyAgICAgICAgICAgIFBVVENIQVIoQ0lMRU5fQ0hBUCwgbmFrcCk7CisgICAgICAgICAgICBQVVRTSE9SVChQUFBfQ0hBUCwgbmFrcCk7CisgICAgICAgICAgICBQVVRDSEFSKGFvLT5jaGFwX21kdHlwZSwgbmFrcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisjaWYgVFJBQ0VMQ1AgPiAwCisgICAgICAgICAgc25wcmludGYoJnRyYWNlQnVmW3RyYWNlTmR4XSwgc2l6ZW9mKHRyYWNlQnVmKSwgIiBDSEFQICVYLCVkIiwgY2lzaG9ydCwgKGludCljaWNoYXIpOworICAgICAgICAgIHRyYWNlTmR4ID0gc3RybGVuKHRyYWNlQnVmKTsKKyNlbmRpZgorICAgICAgICAgIGhvLT5jaGFwX21kdHlwZSA9IGNpY2hhcjsgLyogc2F2ZSBtZCB0eXBlICovCisgICAgICAgICAgaG8tPm5lZ19jaGFwID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgZG9uJ3QgcmVjb2duaXplIHRoZSBwcm90b2NvbCB0aGV5J3JlIGFza2luZyBmb3IuCisgICAgICAgICAqIE5hayBpdCB3aXRoIHNvbWV0aGluZyB3ZSdyZSB3aWxsaW5nIHRvIGRvLgorICAgICAgICAgKiAoQXQgdGhpcyBwb2ludCB3ZSBrbm93IGFvLT5uZWdfdXBhcCB8fCBhby0+bmVnX2NoYXAuKQorICAgICAgICAgKi8KKyAgICAgICAgb3JjID0gQ09ORk5BSzsKKyAgICAgICAgUFVUQ0hBUihDSV9BVVRIVFlQRSwgbmFrcCk7CisgICAgICAgIGlmIChhby0+bmVnX2NoYXApIHsKKyAgICAgICAgICBMQ1BERUJVRyhMT0dfV0FSTklORywgKCJsY3BfcmVxY2k6IE5hayBBVVRIVFlQRSAlZCByZXEgQ0hBUFxuIiwgY2lzaG9ydCkpOworICAgICAgICAgIFBVVENIQVIoQ0lMRU5fQ0hBUCwgbmFrcCk7CisgICAgICAgICAgUFVUU0hPUlQoUFBQX0NIQVAsIG5ha3ApOworICAgICAgICAgIFBVVENIQVIoYW8tPmNoYXBfbWR0eXBlLCBuYWtwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBMQ1BERUJVRyhMT0dfV0FSTklORywgKCJsY3BfcmVxY2k6IE5hayBBVVRIVFlQRSAlZCByZXEgUEFQXG4iLCBjaXNob3J0KSk7CisgICAgICAgICAgUFVUQ0hBUihDSUxFTl9TSE9SVCwgbmFrcCk7CisgICAgICAgICAgUFVUU0hPUlQoUFBQX1BBUCwgbmFrcCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgQ0lfUVVBTElUWToKKyAgICAgICAgR0VUU0hPUlQoY2lzaG9ydCwgcCk7CisgICAgICAgIEdFVExPTkcoY2lsb25nLCBwKTsKKyNpZiBUUkFDRUxDUCA+IDAKKyAgICAgICAgc25wcmludGYoJnRyYWNlQnVmW3RyYWNlTmR4XSwgc2l6ZW9mKHRyYWNlQnVmKSwgIiBRVUFMSVRZICgleCAleCkiLCBjaXNob3J0LCAodW5zaWduZWQgaW50KSBjaWxvbmcpOworICAgICAgICB0cmFjZU5keCA9IHN0cmxlbih0cmFjZUJ1Zik7CisjZW5kaWYKKworICAgICAgICBpZiAoIWFvLT5uZWdfbHFyIHx8CisgICAgICAgICAgICBjaWxlbiAhPSBDSUxFTl9MUVIpIHsKKyAgICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayB0aGUgcHJvdG9jb2wgYW5kIHRoZSByZXBvcnRpbmcgcGVyaW9kLgorICAgICAgICAgKiBYWFggV2hlbiBzaG91bGQgd2UgTmFrIHRoaXMsIGFuZCB3aGF0IHdpdGg/CisgICAgICAgICAqLworICAgICAgICBpZiAoY2lzaG9ydCAhPSBQUFBfTFFSKSB7CisgICAgICAgICAgb3JjID0gQ09ORk5BSzsKKyAgICAgICAgICBQVVRDSEFSKENJX1FVQUxJVFksIG5ha3ApOworICAgICAgICAgIFBVVENIQVIoQ0lMRU5fTFFSLCBuYWtwKTsKKyAgICAgICAgICBQVVRTSE9SVChQUFBfTFFSLCBuYWtwKTsKKyAgICAgICAgICBQVVRMT05HKGFvLT5scXJfcGVyaW9kLCBuYWtwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBDSV9NQUdJQ05VTUJFUjoKKyAgICAgICAgaWYgKCEoYW8tPm5lZ19tYWdpY251bWJlciB8fCBnby0+bmVnX21hZ2ljbnVtYmVyKSB8fAorICAgICAgICAgICAgY2lsZW4gIT0gQ0lMRU5fTE9ORykgeworICAgICAgICAgIG9yYyA9IENPTkZSRUo7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgR0VUTE9ORyhjaWxvbmcsIHApOworI2lmIFRSQUNFTENQID4gMAorICAgICAgICBzbnByaW50ZigmdHJhY2VCdWZbdHJhY2VOZHhdLCBzaXplb2YodHJhY2VCdWYpLCAiIE1BR0lDTlVNQkVSICglbFgpIiwgY2lsb25nKTsKKyAgICAgICAgdHJhY2VOZHggPSBzdHJsZW4odHJhY2VCdWYpOworI2VuZGlmCisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGUgbXVzdCBoYXZlIGEgZGlmZmVyZW50IG1hZ2ljIG51bWJlci4KKyAgICAgICAgICovCisgICAgICAgIGlmIChnby0+bmVnX21hZ2ljbnVtYmVyICYmCisgICAgICAgICAgICBjaWxvbmcgPT0gZ28tPm1hZ2ljbnVtYmVyKSB7CisgICAgICAgICAgY2lsb25nID0gbWFnaWMoKTsgIC8qIERvbid0IHB1dCBtYWdpYygpIGluc2lkZSBtYWNybyEgKi8KKyAgICAgICAgICBvcmMgPSBDT05GTkFLOworICAgICAgICAgIFBVVENIQVIoQ0lfTUFHSUNOVU1CRVIsIG5ha3ApOworICAgICAgICAgIFBVVENIQVIoQ0lMRU5fTE9ORywgbmFrcCk7CisgICAgICAgICAgUFVUTE9ORyhjaWxvbmcsIG5ha3ApOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGhvLT5uZWdfbWFnaWNudW1iZXIgPSAxOworICAgICAgICBoby0+bWFnaWNudW1iZXIgPSBjaWxvbmc7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAKKyAgICAgIGNhc2UgQ0lfUENPTVBSRVNTSU9OOgorI2lmIFRSQUNFTENQID4gMAorICAgICAgICBzbnByaW50ZigmdHJhY2VCdWZbdHJhY2VOZHhdLCBzaXplb2YodHJhY2VCdWYpLCAiIFBDT01QUkVTU0lPTiIpOworICAgICAgICB0cmFjZU5keCA9IHN0cmxlbih0cmFjZUJ1Zik7CisjZW5kaWYKKyAgICAgICAgaWYgKCFhby0+bmVnX3Bjb21wcmVzc2lvbiB8fAorICAgICAgICAgICAgY2lsZW4gIT0gQ0lMRU5fVk9JRCkgeworICAgICAgICAgIG9yYyA9IENPTkZSRUo7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaG8tPm5lZ19wY29tcHJlc3Npb24gPSAxOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBDSV9BQ0NPTVBSRVNTSU9OOgorI2lmIFRSQUNFTENQID4gMAorICAgICAgICBzbnByaW50ZigmdHJhY2VCdWZbdHJhY2VOZHhdLCBzaXplb2YodHJhY2VCdWYpLCAiIEFDQ09NUFJFU1NJT04iKTsKKyAgICAgICAgdHJhY2VOZHggPSBzdHJsZW4odHJhY2VCdWYpOworI2VuZGlmCisgICAgICAgIGlmICghYW8tPm5lZ19hY2NvbXByZXNzaW9uIHx8CisgICAgICAgICAgICBjaWxlbiAhPSBDSUxFTl9WT0lEKSB7CisgICAgICAgICAgb3JjID0gQ09ORlJFSjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBoby0+bmVnX2FjY29tcHJlc3Npb24gPSAxOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBDSV9NUlJVOgorI2lmIFRSQUNFTENQID4gMAorICAgICAgICBzbnByaW50ZigmdHJhY2VCdWZbdHJhY2VOZHhdLCBzaXplb2YodHJhY2VCdWYpLCAiIENJX01SUlUiKTsKKyAgICAgICAgdHJhY2VOZHggPSBzdHJsZW4odHJhY2VCdWYpOworI2VuZGlmCisgICAgICAgIG9yYyA9IENPTkZSRUo7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIENJX1NTTkhGOgorI2lmIFRSQUNFTENQID4gMAorICAgICAgICBzbnByaW50ZigmdHJhY2VCdWZbdHJhY2VOZHhdLCBzaXplb2YodHJhY2VCdWYpLCAiIENJX1NTTkhGIik7CisgICAgICAgIHRyYWNlTmR4ID0gc3RybGVuKHRyYWNlQnVmKTsKKyNlbmRpZgorICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBDSV9FUERJU0M6CisjaWYgVFJBQ0VMQ1AgPiAwCisgICAgICAgIHNucHJpbnRmKCZ0cmFjZUJ1Zlt0cmFjZU5keF0sIHNpemVvZih0cmFjZUJ1ZiksICIgQ0lfRVBESVNDIik7CisgICAgICAgIHRyYWNlTmR4ID0gc3RybGVuKHRyYWNlQnVmKTsKKyNlbmRpZgorICAgICAgICBvcmMgPSBDT05GUkVKOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgZGVmYXVsdDoKKyNpZiBUUkFDRUxDUAorICAgICAgICBzbnByaW50ZigmdHJhY2VCdWZbdHJhY2VOZHhdLCBzaXplb2YodHJhY2VCdWYpLCAiIHVua25vd24gJWQiLCBjaXR5cGUpOworICAgICAgICB0cmFjZU5keCA9IHN0cmxlbih0cmFjZUJ1Zik7CisjZW5kaWYKKyAgICAgICAgb3JjID0gQ09ORlJFSjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGVuZHN3aXRjaDoKKyNpZiBUUkFDRUxDUAorICAgIGlmICh0cmFjZU5keCA+PSA4MCAtIDMyKSB7CisgICAgICBMQ1BERUJVRyhMT0dfSU5GTywgKCJsY3BfcmVxY2k6IHJjdmQlc1xuIiwgdHJhY2VCdWYpKTsKKyAgICAgIHRyYWNlTmR4ID0gMDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAob3JjID09IENPTkZBQ0sgJiYgLyogR29vZCBDSSAqLworICAgICAgICByYyAhPSBDT05GQUNLKSB7ICAvKiAgYnV0IHByaW9yIENJIHdhc250PyAqLworICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBEb24ndCBzZW5kIHRoaXMgb25lICovCisgICAgfQorCisgICAgaWYgKG9yYyA9PSBDT05GTkFLKSB7ICAgICAvKiBOYWsgdGhpcyBDST8gKi8KKyAgICAgIGlmIChyZWplY3RfaWZfZGlzYWdyZWUgIC8qIEdldHRpbmcgZmVkIHVwIHdpdGggc2VuZGluZyBOQUtzPyAqLworICAgICAgICAgICYmIGNpdHlwZSAhPSBDSV9NQUdJQ05VTUJFUikgeworICAgICAgICBvcmMgPSBDT05GUkVKOyAgICAgICAgLyogR2V0IHRvdWdoIGlmIHNvICovCisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocmMgPT0gQ09ORlJFSikgeyAgLyogUmVqZWN0aW5nIHByaW9yIENJPyAqLworICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogRG9uJ3Qgc2VuZCB0aGlzIG9uZSAqLworICAgICAgICB9CisgICAgICAgIHJjID0gQ09ORk5BSzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG9yYyA9PSBDT05GUkVKKSB7ICAgICAgICAvKiBSZWplY3QgdGhpcyBDSSAqLworICAgICAgcmMgPSBDT05GUkVKOworICAgICAgaWYgKGNpcCAhPSByZWpwKSB7ICAgICAgICAgLyogTmVlZCB0byBtb3ZlIHJlamVjdGVkIENJPyAqLworICAgICAgICBCQ09QWShjaXAsIHJlanAsIGNpbGVuKTsgLyogTW92ZSBpdCAqLworICAgICAgfQorICAgICAgSU5DUFRSKGNpbGVuLCByZWpwKTsgICAgICAgLyogVXBkYXRlIG91dHB1dCBwb2ludGVyICovCisgICAgfQorICB9CisKKyAgLyoKKyAgICogSWYgd2Ugd2FudGVkIHRvIHNlbmQgYWRkaXRpb25hbCBOQUtzIChmb3IgdW5zZW50IENJcyksIHRoZQorICAgKiBjb2RlIHdvdWxkIGdvIGhlcmUuICBUaGUgZXh0cmEgTkFLcyB3b3VsZCBnbyBhdCAqbmFrcC4KKyAgICogQXQgcHJlc2VudCB0aGVyZSBhcmUgbm8gY2FzZXMgd2hlcmUgd2Ugd2FudCB0byBhc2sgdGhlCisgICAqIHBlZXIgdG8gbmVnb3RpYXRlIGFuIG9wdGlvbi4KKyAgICovCisKKyAgc3dpdGNoIChyYykgeworICAgIGNhc2UgQ09ORkFDSzoKKyAgICAgICpsZW5wID0gKGludCkobmV4dCAtIGlucCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTkZOQUs6CisgICAgICAvKgorICAgICAgICogQ29weSB0aGUgTmFrJ2Qgb3B0aW9ucyBmcm9tIHRoZSBuYWtfYnVmZmVyIHRvIHRoZSBjYWxsZXIncyBidWZmZXIuCisgICAgICAgKi8KKyAgICAgICpsZW5wID0gKGludCkobmFrcCAtIG5ha19idWZmZXIpOworICAgICAgQkNPUFkobmFrX2J1ZmZlciwgaW5wLCAqbGVucCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTkZSRUo6CisgICAgICAqbGVucCA9IChpbnQpKHJlanAgLSBpbnApOworICAgICAgYnJlYWs7CisgIH0KKworI2lmIFRSQUNFTENQID4gMAorICBpZiAodHJhY2VOZHggPiAwKSB7CisgICAgTENQREVCVUcoTE9HX0lORk8sICgibGNwX3JlcWNpOiAlc1xuIiwgdHJhY2VCdWYpKTsKKyAgfQorI2VuZGlmCisgIExDUERFQlVHKExPR19JTkZPLCAoImxjcF9yZXFjaTogcmV0dXJuaW5nIENPTkYlcy5cbiIsIENPREVOQU1FKHJjKSkpOworICByZXR1cm4gKHJjKTsgICAgICAvKiBSZXR1cm4gZmluYWwgY29kZSAqLworfQorCisKKy8qCisgKiBsY3BfdXAgLSBMQ1AgaGFzIGNvbWUgVVAuCisgKi8KK3N0YXRpYyB2b2lkCitsY3BfdXAoZnNtICpmKQoreworICBsY3Bfb3B0aW9ucyAqd28gPSAmbGNwX3dhbnRvcHRpb25zW2YtPnVuaXRdOworICBsY3Bfb3B0aW9ucyAqaG8gPSAmbGNwX2hpc29wdGlvbnNbZi0+dW5pdF07CisgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1tmLT51bml0XTsKKyAgbGNwX29wdGlvbnMgKmFvID0gJmxjcF9hbGxvd29wdGlvbnNbZi0+dW5pdF07CisKKyAgaWYgKCFnby0+bmVnX21hZ2ljbnVtYmVyKSB7CisgICAgZ28tPm1hZ2ljbnVtYmVyID0gMDsKKyAgfQorICBpZiAoIWhvLT5uZWdfbWFnaWNudW1iZXIpIHsKKyAgICBoby0+bWFnaWNudW1iZXIgPSAwOworICB9CisKKyAgLyoKKyAgICogU2V0IG91ciBNVFUgdG8gdGhlIHNtYWxsZXIgb2YgdGhlIE1UVSB3ZSB3YW50ZWQgYW5kCisgICAqIHRoZSBNUlUgb3VyIHBlZXIgd2FudGVkLiAgSWYgd2UgbmVnb3RpYXRlZCBhbiBNUlUsCisgICAqIHNldCBvdXIgTVJVIHRvIHRoZSBsYXJnZXIgb2YgdmFsdWUgd2Ugd2FudGVkIGFuZAorICAgKiB0aGUgdmFsdWUgd2UgZ290IGluIHRoZSBuZWdvdGlhdGlvbi4KKyAgICovCisgIHBwcF9zZW5kX2NvbmZpZyhmLT51bml0LCBMV0lQX01JTihhby0+bXJ1LCAoaG8tPm5lZ19tcnU/IGhvLT5tcnU6IFBQUF9NUlUpKSwKKyAgICAgICAgICAgICAgICAgKGhvLT5uZWdfYXN5bmNtYXA/IGhvLT5hc3luY21hcDogMHhmZmZmZmZmZmwpLAorICAgICAgICAgICAgICAgICAgaG8tPm5lZ19wY29tcHJlc3Npb24sIGhvLT5uZWdfYWNjb21wcmVzc2lvbik7CisgIC8qCisgICAqIElmIHRoZSBhc3luY21hcCBoYXNuJ3QgYmVlbiBuZWdvdGlhdGVkLCB3ZSByZWFsbHkgc2hvdWxkCisgICAqIHNldCB0aGUgcmVjZWl2ZSBhc3luY21hcCB0byBmZmZmZmZmZiwgYnV0IHdlIHNldCBpdCB0byAwCisgICAqIGZvciBiYWNrd2FyZHMgY29udGVtcHRpYmlsaXR5LgorICAgKi8KKyAgcHBwX3JlY3ZfY29uZmlnKGYtPnVuaXQsIChnby0+bmVnX21ydT8gTFdJUF9NQVgod28tPm1ydSwgZ28tPm1ydSk6IFBQUF9NUlUpLAorICAgICAgICAgICAgICAgICAoZ28tPm5lZ19hc3luY21hcD8gZ28tPmFzeW5jbWFwOiAweDAwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgIGdvLT5uZWdfcGNvbXByZXNzaW9uLCBnby0+bmVnX2FjY29tcHJlc3Npb24pOworCisgIGlmIChoby0+bmVnX21ydSkgeworICAgIHBlZXJfbXJ1W2YtPnVuaXRdID0gaG8tPm1ydTsKKyAgfQorCisgIGxjcF9lY2hvX2xvd2VydXAoZi0+dW5pdCk7IC8qIEVuYWJsZSBlY2hvIG1lc3NhZ2VzICovCisKKyAgbGlua19lc3RhYmxpc2hlZChmLT51bml0KTsgLyogVGhlIGxpbmsgaXMgdXA7IGF1dGhlbnRpY2F0ZSBub3cgKi8KK30KKworCisvKgorICogbGNwX2Rvd24gLSBMQ1AgaGFzIGdvbmUgRE9XTi4KKyAqCisgKiBBbGVydCBvdGhlciBwcm90b2NvbHMuCisgKi8KK3N0YXRpYyB2b2lkCitsY3BfZG93bihmc20gKmYpCit7CisgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1tmLT51bml0XTsKKworICBsY3BfZWNob19sb3dlcmRvd24oZi0+dW5pdCk7CisKKyAgbGlua19kb3duKGYtPnVuaXQpOworCisgIHBwcF9zZW5kX2NvbmZpZyhmLT51bml0LCBQUFBfTVJVLCAweGZmZmZmZmZmbCwgMCwgMCk7CisgIHBwcF9yZWN2X2NvbmZpZyhmLT51bml0LCBQUFBfTVJVLAorICAgICAgICAgICAgICAgICAgKGdvLT5uZWdfYXN5bmNtYXA/IGdvLT5hc3luY21hcDogMHgwMDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgZ28tPm5lZ19wY29tcHJlc3Npb24sIGdvLT5uZWdfYWNjb21wcmVzc2lvbik7CisgIHBlZXJfbXJ1W2YtPnVuaXRdID0gUFBQX01SVTsKK30KKworCisvKgorICogbGNwX3N0YXJ0aW5nIC0gTENQIG5lZWRzIHRoZSBsb3dlciBsYXllciB1cC4KKyAqLworc3RhdGljIHZvaWQKK2xjcF9zdGFydGluZyhmc20gKmYpCit7CisgIGxpbmtfcmVxdWlyZWQoZi0+dW5pdCk7IC8qIGx3aXA6IGN1cnJlbnRseSBkb2VzIG5vdGhpbmcgKi8KK30KKworCisvKgorICogbGNwX2ZpbmlzaGVkIC0gTENQIGhhcyBmaW5pc2hlZCB3aXRoIHRoZSBsb3dlciBsYXllci4KKyAqLworc3RhdGljIHZvaWQKK2xjcF9maW5pc2hlZChmc20gKmYpCit7CisgIGxpbmtfdGVybWluYXRlZChmLT51bml0KTsgLyogd2UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGxpbmsgKi8KK30KKworCisjaWYgUFBQX0FERElUSU9OQUxfQ0FMTEJBQ0tTCisvKgorICogcHJpbnRfc3RyaW5nIC0gcHJpbnQgYSByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIHN0cmluZyB1c2luZworICogcHJpbnRlci4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X3N0cmluZyggY2hhciAqcCwgaW50IGxlbiwgdm9pZCAoKnByaW50ZXIpICh2b2lkICosIGNoYXIgKiwgLi4uKSwgdm9pZCAqYXJnKQoreworICBpbnQgYzsKKyAgCisgIHByaW50ZXIoYXJnLCAiXCIiKTsKKyAgZm9yICg7IGxlbiA+IDA7IC0tbGVuKSB7CisgICAgYyA9ICpwKys7CisgICAgaWYgKCcgJyA8PSBjICYmIGMgPD0gJ34nKSB7CisgICAgICAgIGlmIChjID09ICdcXCcgfHwgYyA9PSAnIicpIHsKKyAgICAgICAgICBwcmludGVyKGFyZywgIlxcIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlcihhcmcsICIlYyIsIGMpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgIHByaW50ZXIoYXJnLCAiXFxuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICBwcmludGVyKGFyZywgIlxcciIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgcHJpbnRlcihhcmcsICJcXHQiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBwcmludGVyKGFyZywgIlxcJS4zbyIsIGMpOworICAgICAgICB9CisgICAgfQorICB9CisgIHByaW50ZXIoYXJnLCAiXCIiKTsKK30KKworCisvKgorICogbGNwX3ByaW50cGt0IC0gcHJpbnQgdGhlIGNvbnRlbnRzIG9mIGFuIExDUCBwYWNrZXQuCisgKi8KK3N0YXRpYyBjaGFyICpsY3BfY29kZW5hbWVzW10gPSB7CisgICJDb25mUmVxIiwgIkNvbmZBY2siLCAiQ29uZk5hayIsICJDb25mUmVqIiwKKyAgIlRlcm1SZXEiLCAiVGVybUFjayIsICJDb2RlUmVqIiwgIlByb3RSZWoiLAorICAiRWNob1JlcSIsICJFY2hvUmVwIiwgIkRpc2NSZXEiCit9OworCitzdGF0aWMgaW50CitsY3BfcHJpbnRwa3QoIHVfY2hhciAqcCwgaW50IHBsZW4sIHZvaWQgKCpwcmludGVyKSAodm9pZCAqLCBjaGFyICosIC4uLiksIHZvaWQgKmFyZykKK3sKKyAgaW50IGNvZGUsIGlkLCBsZW4sIG9sZW47CisgIHVfY2hhciAqcHN0YXJ0LCAqb3B0ZW5kOworICB1X3Nob3J0IGNpc2hvcnQ7CisgIHUzMl90IGNpbG9uZzsKKworICBpZiAocGxlbiA8IEhFQURFUkxFTikgeworICAgIHJldHVybiAwOworICB9CisgIHBzdGFydCA9IHA7CisgIEdFVENIQVIoY29kZSwgcCk7CisgIEdFVENIQVIoaWQsIHApOworICBHRVRTSE9SVChsZW4sIHApOworICBpZiAobGVuIDwgSEVBREVSTEVOIHx8IGxlbiA+IHBsZW4pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChjb2RlID49IDEgJiYgY29kZSA8PSBzaXplb2YobGNwX2NvZGVuYW1lcykgLyBzaXplb2YoY2hhciAqKSkgeworICAgIHByaW50ZXIoYXJnLCAiICVzIiwgbGNwX2NvZGVuYW1lc1tjb2RlLTFdKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyKGFyZywgIiBjb2RlPTB4JXgiLCBjb2RlKTsKKyAgfQorICBwcmludGVyKGFyZywgIiBpZD0weCV4IiwgaWQpOworICBsZW4gLT0gSEVBREVSTEVOOworICBzd2l0Y2ggKGNvZGUpIHsKKyAgICBjYXNlIENPTkZSRVE6CisgICAgY2FzZSBDT05GQUNLOgorICAgIGNhc2UgQ09ORk5BSzoKKyAgICBjYXNlIENPTkZSRUo6CisgICAgICAvKiBwcmludCBvcHRpb24gbGlzdCAqLworICAgICAgd2hpbGUgKGxlbiA+PSAyKSB7CisgICAgICAgIEdFVENIQVIoY29kZSwgcCk7CisgICAgICAgIEdFVENIQVIob2xlbiwgcCk7CisgICAgICAgIHAgLT0gMjsKKyAgICAgICAgaWYgKG9sZW4gPCAyIHx8IG9sZW4gPiBsZW4pIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyKGFyZywgIiA8Iik7CisgICAgICAgIGxlbiAtPSBvbGVuOworICAgICAgICBvcHRlbmQgPSBwICsgb2xlbjsKKyAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgICAgY2FzZSBDSV9NUlU6CisgICAgICAgICAgICBpZiAob2xlbiA9PSBDSUxFTl9TSE9SVCkgeworICAgICAgICAgICAgICBwICs9IDI7CisgICAgICAgICAgICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOworICAgICAgICAgICAgICBwcmludGVyKGFyZywgIm1ydSAlZCIsIGNpc2hvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDSV9BU1lOQ01BUDoKKyAgICAgICAgICAgIGlmIChvbGVuID09IENJTEVOX0xPTkcpIHsKKyAgICAgICAgICAgICAgcCArPSAyOworICAgICAgICAgICAgICBHRVRMT05HKGNpbG9uZywgcCk7CisgICAgICAgICAgICAgIHByaW50ZXIoYXJnLCAiYXN5bmNtYXAgMHglbHgiLCBjaWxvbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDSV9BVVRIVFlQRToKKyAgICAgICAgICAgIGlmIChvbGVuID49IENJTEVOX1NIT1JUKSB7CisgICAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgICAgcHJpbnRlcihhcmcsICJhdXRoICIpOworICAgICAgICAgICAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKKyAgICAgICAgICAgICAgc3dpdGNoIChjaXNob3J0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBQUFBfUEFQOgorICAgICAgICAgICAgICAgICAgcHJpbnRlcihhcmcsICJwYXAiKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFBQX0NIQVA6CisgICAgICAgICAgICAgICAgICBwcmludGVyKGFyZywgImNoYXAiKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBwcmludGVyKGFyZywgIjB4JXgiLCBjaXNob3J0KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDSV9RVUFMSVRZOgorICAgICAgICAgICAgaWYgKG9sZW4gPj0gQ0lMRU5fU0hPUlQpIHsKKyAgICAgICAgICAgICAgcCArPSAyOworICAgICAgICAgICAgICBwcmludGVyKGFyZywgInF1YWxpdHkgIik7CisgICAgICAgICAgICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOworICAgICAgICAgICAgICBzd2l0Y2ggKGNpc2hvcnQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBQUF9MUVI6CisgICAgICAgICAgICAgICAgICBwcmludGVyKGFyZywgImxxciIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIHByaW50ZXIoYXJnLCAiMHgleCIsIGNpc2hvcnQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENJX0NBTExCQUNLOgorICAgICAgICAgICAgaWYgKG9sZW4gPj0gQ0lMRU5fQ0hBUikgeworICAgICAgICAgICAgICBwICs9IDI7CisgICAgICAgICAgICAgIHByaW50ZXIoYXJnLCAiY2FsbGJhY2sgIik7CisgICAgICAgICAgICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOworICAgICAgICAgICAgICBzd2l0Y2ggKGNpc2hvcnQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENCQ1BfT1BUOgorICAgICAgICAgICAgICAgICAgcHJpbnRlcihhcmcsICJDQkNQIik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgcHJpbnRlcihhcmcsICIweCV4IiwgY2lzaG9ydCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0lfTUFHSUNOVU1CRVI6CisgICAgICAgICAgICBpZiAob2xlbiA9PSBDSUxFTl9MT05HKSB7CisgICAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgICAgR0VUTE9ORyhjaWxvbmcsIHApOworICAgICAgICAgICAgICBwcmludGVyKGFyZywgIm1hZ2ljIDB4JXgiLCBjaWxvbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDSV9QQ09NUFJFU1NJT046CisgICAgICAgICAgICBpZiAob2xlbiA9PSBDSUxFTl9WT0lEKSB7CisgICAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgICAgcHJpbnRlcihhcmcsICJwY29tcCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDSV9BQ0NPTVBSRVNTSU9OOgorICAgICAgICAgICAgaWYgKG9sZW4gPT0gQ0lMRU5fVk9JRCkgeworICAgICAgICAgICAgICBwICs9IDI7CisgICAgICAgICAgICAgIHByaW50ZXIoYXJnLCAiYWNjb21wIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAocCA8IG9wdGVuZCkgeworICAgICAgICAgIEdFVENIQVIoY29kZSwgcCk7CisgICAgICAgICAgcHJpbnRlcihhcmcsICIgJS4yeCIsIGNvZGUpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIoYXJnLCAiPiIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBURVJNQUNLOgorICAgIGNhc2UgVEVSTVJFUToKKyAgICAgIGlmIChsZW4gPiAwICYmICpwID49ICcgJyAmJiAqcCA8IDB4N2YpIHsKKyAgICAgICAgcHJpbnRlcihhcmcsICIgIik7CisgICAgICAgIHByaW50X3N0cmluZygoY2hhciopcCwgbGVuLCBwcmludGVyLCBhcmcpOworICAgICAgICBwICs9IGxlbjsKKyAgICAgICAgbGVuID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRUNIT1JFUToKKyAgICBjYXNlIEVDSE9SRVA6CisgICAgY2FzZSBESVNDUkVROgorICAgICAgaWYgKGxlbiA+PSA0KSB7CisgICAgICAgIEdFVExPTkcoY2lsb25nLCBwKTsKKyAgICAgICAgcHJpbnRlcihhcmcsICIgbWFnaWM9MHgleCIsIGNpbG9uZyk7CisgICAgICAgIHAgKz0gNDsKKyAgICAgICAgbGVuIC09IDQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIHByaW50IHRoZSByZXN0IG9mIHRoZSBieXRlcyBpbiB0aGUgcGFja2V0ICovCisgIGZvciAoOyBsZW4gPiAwOyAtLWxlbikgeworICAgIEdFVENIQVIoY29kZSwgcCk7CisgICAgcHJpbnRlcihhcmcsICIgJS4yeCIsIGNvZGUpOworICB9CisKKyAgcmV0dXJuIChpbnQpKHAgLSBwc3RhcnQpOworfQorI2VuZGlmIC8qIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUyAqLworCisvKgorICogVGltZSB0byBzaHV0IGRvd24gdGhlIGxpbmsgYmVjYXVzZSB0aGVyZSBpcyBub3RoaW5nIG91dCB0aGVyZS4KKyAqLworc3RhdGljIHZvaWQKK0xjcExpbmtGYWlsdXJlIChmc20gKmYpCit7CisgIGlmIChmLT5zdGF0ZSA9PSBMU19PUEVORUQpIHsKKyAgICBMQ1BERUJVRyhMT0dfSU5GTywgKCJObyByZXNwb25zZSB0byAlZCBlY2hvLXJlcXVlc3RzXG4iLCBsY3BfZWNob3NfcGVuZGluZykpOworICAgIExDUERFQlVHKExPR19OT1RJQ0UsICgiU2VyaWFsIGxpbmsgYXBwZWFycyB0byBiZSBkaXNjb25uZWN0ZWQuXG4iKSk7CisgICAgbGNwX2Nsb3NlKGYtPnVuaXQsICJQZWVyIG5vdCByZXNwb25kaW5nIik7CisgIH0KK30KKworLyoKKyAqIFRpbWVyIGV4cGlyZWQgZm9yIHRoZSBMQ1AgZWNobyByZXF1ZXN0cyBmcm9tIHRoaXMgcHJvY2Vzcy4KKyAqLworc3RhdGljIHZvaWQKK0xjcEVjaG9DaGVjayAoZnNtICpmKQoreworICBMY3BTZW5kRWNob1JlcXVlc3QgKGYpOworCisgIC8qCisgICAqIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIG5leHQgaW50ZXJ2YWwuCisgICAqLworICBMV0lQX0FTU0VSVCgibGNwX2VjaG9fdGltZXJfcnVubmluZyA9PSAwIiwgbGNwX2VjaG9fdGltZXJfcnVubmluZyA9PSAwKTsKKworICBUSU1FT1VUIChMY3BFY2hvVGltZW91dCwgZiwgbGNwX2VjaG9faW50ZXJ2YWwpOworICBsY3BfZWNob190aW1lcl9ydW5uaW5nID0gMTsKK30KKworLyoKKyAqIExjcEVjaG9UaW1lb3V0IC0gVGltZXIgZXhwaXJlZCBvbiB0aGUgTENQIGVjaG8KKyAqLworc3RhdGljIHZvaWQKK0xjcEVjaG9UaW1lb3V0ICh2b2lkICphcmcpCit7CisgIGlmIChsY3BfZWNob190aW1lcl9ydW5uaW5nICE9IDApIHsKKyAgICBsY3BfZWNob190aW1lcl9ydW5uaW5nID0gMDsKKyAgICBMY3BFY2hvQ2hlY2sgKChmc20gKikgYXJnKTsKKyAgfQorfQorCisvKgorICogTGNwRWNob1JlcGx5IC0gTENQIGhhcyByZWNlaXZlZCBhIHJlcGx5IHRvIHRoZSBlY2hvCisgKi8KK3N0YXRpYyB2b2lkCitsY3BfcmVjZWl2ZWRfZWNob19yZXBseSAoZnNtICpmLCBpbnQgaWQsIHVfY2hhciAqaW5wLCBpbnQgbGVuKQoreworICB1MzJfdCBtYWdpYzsKKworICBMV0lQX1VOVVNFRF9BUkcoaWQpOworCisgIC8qIENoZWNrIHRoZSBtYWdpYyBudW1iZXIgLSBkb24ndCBjb3VudCByZXBsaWVzIGZyb20gb3Vyc2VsdmVzLiAqLworICBpZiAobGVuIDwgNCkgeworICAgIExDUERFQlVHKExPR19XQVJOSU5HLCAoImxjcDogcmVjZWl2ZWQgc2hvcnQgRWNoby1SZXBseSwgbGVuZ3RoICVkXG4iLCBsZW4pKTsKKyAgICByZXR1cm47CisgIH0KKyAgR0VUTE9ORyhtYWdpYywgaW5wKTsKKyAgaWYgKGxjcF9nb3RvcHRpb25zW2YtPnVuaXRdLm5lZ19tYWdpY251bWJlciAmJiBtYWdpYyA9PSBsY3BfZ290b3B0aW9uc1tmLT51bml0XS5tYWdpY251bWJlcikgeworICAgIExDUERFQlVHKExPR19XQVJOSU5HLCAoImFwcGVhciB0byBoYXZlIHJlY2VpdmVkIG91ciBvd24gZWNoby1yZXBseSFcbiIpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBSZXNldCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGVjaG8gZnJhbWVzICovCisgIGxjcF9lY2hvc19wZW5kaW5nID0gMDsKK30KKworLyoKKyAqIExjcFNlbmRFY2hvUmVxdWVzdCAtIFNlbmQgYW4gZWNobyByZXF1ZXN0IGZyYW1lIHRvIHRoZSBwZWVyCisgKi8KK3N0YXRpYyB2b2lkCitMY3BTZW5kRWNob1JlcXVlc3QgKGZzbSAqZikKK3sKKyAgdTMyX3QgbGNwX21hZ2ljOworICB1X2NoYXIgcGt0WzRdLCAqcGt0cDsKKworICAvKgorICAgKiBEZXRlY3QgdGhlIGZhaWx1cmUgb2YgdGhlIHBlZXIgYXQgdGhpcyBwb2ludC4KKyAgICovCisgIGlmIChsY3BfZWNob19mYWlscyAhPSAwKSB7CisgICAgaWYgKGxjcF9lY2hvc19wZW5kaW5nID49IGxjcF9lY2hvX2ZhaWxzKSB7CisgICAgICBMY3BMaW5rRmFpbHVyZShmKTsKKyAgICAgIGxjcF9lY2hvc19wZW5kaW5nID0gMDsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBNYWtlIGFuZCBzZW5kIHRoZSBlY2hvIHJlcXVlc3QgZnJhbWUuCisgICAqLworICBpZiAoZi0+c3RhdGUgPT0gTFNfT1BFTkVEKSB7CisgICAgbGNwX21hZ2ljID0gbGNwX2dvdG9wdGlvbnNbZi0+dW5pdF0ubWFnaWNudW1iZXI7CisgICAgcGt0cCA9IHBrdDsKKyAgICBQVVRMT05HKGxjcF9tYWdpYywgcGt0cCk7CisgICAgZnNtX3NkYXRhKGYsIEVDSE9SRVEsICh1X2NoYXIpKGxjcF9lY2hvX251bWJlcisrICYgMHhGRiksIHBrdCwgKGludCkocGt0cCAtIHBrdCkpOworICAgICsrbGNwX2VjaG9zX3BlbmRpbmc7CisgIH0KK30KKworLyoKKyAqIGxjcF9lY2hvX2xvd2VydXAgLSBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSBMQ1AgZnJhbWUKKyAqLworCitzdGF0aWMgdm9pZAorbGNwX2VjaG9fbG93ZXJ1cCAoaW50IHVuaXQpCit7CisgIGZzbSAqZiA9ICZsY3BfZnNtW3VuaXRdOworCisgIC8qIENsZWFyIHRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIGVjaG8gZnJhbWVzICovCisgIGxjcF9lY2hvc19wZW5kaW5nICAgICAgPSAwOworICBsY3BfZWNob19udW1iZXIgICAgICAgID0gMDsKKyAgbGNwX2VjaG9fdGltZXJfcnVubmluZyA9IDA7CisKKyAgLyogSWYgYSB0aW1lb3V0IGludGVydmFsIGlzIHNwZWNpZmllZCB0aGVuIHN0YXJ0IHRoZSB0aW1lciAqLworICBpZiAobGNwX2VjaG9faW50ZXJ2YWwgIT0gMCkgeworICAgIExjcEVjaG9DaGVjayAoZik7CisgIH0KK30KKworLyoKKyAqIGxjcF9lY2hvX2xvd2VyZG93biAtIFN0b3AgdGhlIHRpbWVyIGZvciB0aGUgTENQIGZyYW1lCisgKi8KKworc3RhdGljIHZvaWQKK2xjcF9lY2hvX2xvd2VyZG93biAoaW50IHVuaXQpCit7CisgIGZzbSAqZiA9ICZsY3BfZnNtW3VuaXRdOworCisgIGlmIChsY3BfZWNob190aW1lcl9ydW5uaW5nICE9IDApIHsKKyAgICBVTlRJTUVPVVQgKExjcEVjaG9UaW1lb3V0LCBmKTsKKyAgICBsY3BfZWNob190aW1lcl9ydW5uaW5nID0gMDsKKyAgfQorfQorCisjZW5kaWYgLyogUFBQX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2xjcC5oIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvbGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyMDFlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL2xjcC5oCkBAIC0wLDAgKzEsMTUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbGNwLmggLSBOZXR3b3JrIExpbmsgQ29udHJvbCBQcm90b2NvbCBoZWFkZXIgZmlsZS4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IE1hcmMgQm91Y2hlciwgU2VydmljZXMgSW5mb3JtYXRpcXVlcyAoTUJTSSkgaW5jLgorKiBwb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTcgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKgorKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKKyogYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAorKiB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMKKyogbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXJlIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSAKKyogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkCisqIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTICpBUyBJUyogQU5EIEFOWSBFWFBSRVNTIE9SCisqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUkVWSVNJT04gSElTVE9SWQorKgorKiAwMy0wMS0wMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyogICBQb3J0ZWQgdG8gbHdJUC4KKyogOTctMTEtMDUgR3V5IExhbmNhc3RlciA8Z2xhbmNhQGdlc24uY29tPiwgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKiAgIE9yaWdpbmFsIGRlcml2ZWQgZnJvbSBCU0QgY29kZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsY3AuaCAtIExpbmsgQ29udHJvbCBQcm90b2NvbCBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiAkSWQ6IGxjcC5oLHYgMS40IDIwMTAvMDEvMTggMjA6NDk6NDMgZ29sZHNpbW9uIEV4cCAkCisgKi8KKworI2lmbmRlZiBMQ1BfSAorI2RlZmluZSBMQ1BfSAorLyoKKyAqIE9wdGlvbnMuCisgKi8KKyNkZWZpbmUgQ0lfTVJVICAgICAgICAgICAxICAvKiBNYXhpbXVtIFJlY2VpdmUgVW5pdCAqLworI2RlZmluZSBDSV9BU1lOQ01BUCAgICAgIDIgIC8qIEFzeW5jIENvbnRyb2wgQ2hhcmFjdGVyIE1hcCAqLworI2RlZmluZSBDSV9BVVRIVFlQRSAgICAgIDMgIC8qIEF1dGhlbnRpY2F0aW9uIFR5cGUgKi8KKyNkZWZpbmUgQ0lfUVVBTElUWSAgICAgICA0ICAvKiBRdWFsaXR5IFByb3RvY29sICovCisjZGVmaW5lIENJX01BR0lDTlVNQkVSICAgNSAgLyogTWFnaWMgTnVtYmVyICovCisjZGVmaW5lIENJX1BDT01QUkVTU0lPTiAgNyAgLyogUHJvdG9jb2wgRmllbGQgQ29tcHJlc3Npb24gKi8KKyNkZWZpbmUgQ0lfQUNDT01QUkVTU0lPTiA4ICAvKiBBZGRyZXNzL0NvbnRyb2wgRmllbGQgQ29tcHJlc3Npb24gKi8KKyNkZWZpbmUgQ0lfQ0FMTEJBQ0sgICAgICAxMyAvKiBjYWxsYmFjayAqLworI2RlZmluZSBDSV9NUlJVICAgICAgICAgIDE3IC8qIG1heCByZWNvbnN0cnVjdGVkIHJlY2VpdmUgdW5pdDsgbXVsdGlsaW5rICovCisjZGVmaW5lIENJX1NTTkhGICAgICAgICAgMTggLyogc2hvcnQgc2VxdWVuY2UgbnVtYmVycyBmb3IgbXVsdGlsaW5rICovCisjZGVmaW5lIENJX0VQRElTQyAgICAgICAgMTkgLyogZW5kcG9pbnQgZGlzY3JpbWluYXRvciAqLworCisvKgorICogTENQLXNwZWNpZmljIHBhY2tldCB0eXBlcyAoY29kZSBudW1iZXJzKS4KKyAqLworI2RlZmluZSBQUk9UUkVKICAgICAgICAgIDggIC8qIFByb3RvY29sIFJlamVjdCAqLworI2RlZmluZSBFQ0hPUkVRICAgICAgICAgIDkgIC8qIEVjaG8gUmVxdWVzdCAqLworI2RlZmluZSBFQ0hPUkVQICAgICAgICAgIDEwIC8qIEVjaG8gUmVwbHkgKi8KKyNkZWZpbmUgRElTQ1JFUSAgICAgICAgICAxMSAvKiBEaXNjYXJkIFJlcXVlc3QgKi8KKyNkZWZpbmUgQ0JDUF9PUFQgICAgICAgICA2ICAvKiBVc2UgY2FsbGJhY2sgY29udHJvbCBwcm90b2NvbCAqLworCisvKgorICogVGhlIHN0YXRlIG9mIG9wdGlvbnMgaXMgZGVzY3JpYmVkIGJ5IGFuIGxjcF9vcHRpb25zIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbGNwX29wdGlvbnMgeworICAgIHVfaW50IHBhc3NpdmUgICAgICAgICAgIDogMTsgLyogRG9uJ3QgZGllIGlmIHdlIGRvbid0IGdldCBhIHJlc3BvbnNlICovCisgICAgdV9pbnQgc2lsZW50ICAgICAgICAgICAgOiAxOyAvKiBXYWl0IGZvciB0aGUgb3RoZXIgZW5kIHRvIHN0YXJ0IGZpcnN0ICovCisgICAgdV9pbnQgcmVzdGFydCAgICAgICAgICAgOiAxOyAvKiBSZXN0YXJ0IHZzLiBleGl0IGFmdGVyIGNsb3NlICovCisgICAgdV9pbnQgbmVnX21ydSAgICAgICAgICAgOiAxOyAvKiBOZWdvdGlhdGUgdGhlIE1SVT8gKi8KKyAgICB1X2ludCBuZWdfYXN5bmNtYXAgICAgICA6IDE7IC8qIE5lZ290aWF0ZSB0aGUgYXN5bmMgbWFwPyAqLworICAgIHVfaW50IG5lZ191cGFwICAgICAgICAgIDogMTsgLyogQXNrIGZvciBVUEFQIGF1dGhlbnRpY2F0aW9uPyAqLworICAgIHVfaW50IG5lZ19jaGFwICAgICAgICAgIDogMTsgLyogQXNrIGZvciBDSEFQIGF1dGhlbnRpY2F0aW9uPyAqLworICAgIHVfaW50IG5lZ19tYWdpY251bWJlciAgIDogMTsgLyogQXNrIGZvciBtYWdpYyBudW1iZXI/ICovCisgICAgdV9pbnQgbmVnX3Bjb21wcmVzc2lvbiAgOiAxOyAvKiBIRExDIFByb3RvY29sIEZpZWxkIENvbXByZXNzaW9uPyAqLworICAgIHVfaW50IG5lZ19hY2NvbXByZXNzaW9uIDogMTsgLyogSERMQyBBZGRyZXNzL0NvbnRyb2wgRmllbGQgQ29tcHJlc3Npb24/ICovCisgICAgdV9pbnQgbmVnX2xxciAgICAgICAgICAgOiAxOyAvKiBOZWdvdGlhdGUgdXNlIG9mIExpbmsgUXVhbGl0eSBSZXBvcnRzICovCisgICAgdV9pbnQgbmVnX2NiY3AgICAgICAgICAgOiAxOyAvKiBOZWdvdGlhdGUgdXNlIG9mIENCQ1AgKi8KKyNpZmRlZiBQUFBfTVVMVElMSU5LCisgICAgdV9pbnQgbmVnX21ycnUgICAgICAgICAgOiAxOyAvKiBOZWdvdGlhdGUgbXVsdGlsaW5rIE1SUlUgKi8KKyAgICB1X2ludCBuZWdfc3NuaGYgICAgICAgICA6IDE7IC8qIE5lZ290aWF0ZSBzaG9ydCBzZXF1ZW5jZSBudW1iZXJzICovCisgICAgdV9pbnQgbmVnX2VuZHBvaW50ICAgICAgOiAxOyAvKiBOZWdvdGlhdGUgZW5kcG9pbnQgZGlzY3JpbWluYXRvciAqLworI2VuZGlmCisgICAgdV9zaG9ydCBtcnU7ICAgICAgICAgICAgICAgICAvKiBWYWx1ZSBvZiBNUlUgKi8KKyNpZmRlZiBQUFBfTVVMVElMSU5LCisgICAgdV9zaG9ydCBtcnJ1OyAgICAgICAgICAgICAgICAvKiBWYWx1ZSBvZiBNUlJVLCBhbmQgbXVsdGlsaW5rIGVuYWJsZSAqLworI2VuZGlmCisgICAgdV9jaGFyIGNoYXBfbWR0eXBlOyAgICAgICAgICAvKiB3aGljaCBNRCB0eXBlIChoYXNoaW5nIGFsZ29yaXRobSkgKi8KKyAgICB1MzJfdCBhc3luY21hcDsgICAgICAgICAgICAgIC8qIFZhbHVlIG9mIGFzeW5jIG1hcCAqLworICAgIHUzMl90IG1hZ2ljbnVtYmVyOworICAgIGludCBudW1sb29wczsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGxvb3BzIGR1cmluZyBtYWdpYyBudW1iZXIgbmVnLiAqLworICAgIHUzMl90IGxxcl9wZXJpb2Q7ICAgICAgICAgICAgLyogUmVwb3J0aW5nIHBlcmlvZCBmb3IgTFFSIDEvMTAwdGhzIHNlY29uZCAqLworI2lmZGVmIFBQUF9NVUxUSUxJTksKKyAgICBzdHJ1Y3QgZXBkaXNjIGVuZHBvaW50OyAgICAgIC8qIGVuZHBvaW50IGRpc2NyaW1pbmF0b3IgKi8KKyNlbmRpZgorfSBsY3Bfb3B0aW9uczsKKworLyoKKyAqIFZhbHVlcyBmb3IgcGhhc2UgZnJvbSBCU0QgcHBwZC5oIGJhc2VkIG9uIFJGQyAxNjYxLgorICovCit0eXBlZGVmIGVudW0geworICBQSEFTRV9ERUFEID0gMCwKKyAgUEhBU0VfSU5JVElBTElaRSwKKyAgUEhBU0VfRVNUQUJMSVNILAorICBQSEFTRV9BVVRIRU5USUNBVEUsCisgIFBIQVNFX0NBTExCQUNLLAorICBQSEFTRV9ORVRXT1JLLAorICBQSEFTRV9URVJNSU5BVEUKK30gTGlua1BoYXNlOworCisKKworZXh0ZXJuIExpbmtQaGFzZSBsY3BfcGhhc2VbTlVNX1BQUF07IC8qIFBoYXNlIG9mIGxpbmsgc2Vzc2lvbiAoUkZDIDE2NjEpICovCitleHRlcm4gbGNwX29wdGlvbnMgbGNwX3dhbnRvcHRpb25zW107CitleHRlcm4gbGNwX29wdGlvbnMgbGNwX2dvdG9wdGlvbnNbXTsKK2V4dGVybiBsY3Bfb3B0aW9ucyBsY3BfYWxsb3dvcHRpb25zW107CitleHRlcm4gbGNwX29wdGlvbnMgbGNwX2hpc29wdGlvbnNbXTsKK2V4dGVybiBleHRfYWNjbSB4bWl0X2FjY21bXTsKKworCit2b2lkIGxjcF9pbml0ICAgICAoaW50KTsKK3ZvaWQgbGNwX29wZW4gICAgIChpbnQpOwordm9pZCBsY3BfY2xvc2UgICAgKGludCwgY2hhciAqKTsKK3ZvaWQgbGNwX2xvd2VydXAgIChpbnQpOwordm9pZCBsY3BfbG93ZXJkb3duKGludCk7Cit2b2lkIGxjcF9zcHJvdHJlaiAoaW50LCB1X2NoYXIgKiwgaW50KTsgLyogc2VuZCBwcm90b2NvbCByZWplY3QgKi8KKworZXh0ZXJuIHN0cnVjdCBwcm90ZW50IGxjcF9wcm90ZW50OworCisvKiBEZWZhdWx0IG51bWJlciBvZiB0aW1lcyB3ZSByZWNlaXZlIG91ciBtYWdpYyBudW1iZXIgZnJvbSB0aGUgcGVlcgorICAgYmVmb3JlIGRlY2lkaW5nIHRoZSBsaW5rIGlzIGxvb3BlZC1iYWNrLiAqLworI2RlZmluZSBERUZMT09QQkFDS0ZBSUwgMTAKKworI2VuZGlmIC8qIExDUF9IICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9tYWdpYy5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvbWFnaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTAxMzMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvbWFnaWMuYwpAQCAtMCwwICsxLDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWFnaWMuYyAtIE5ldHdvcmsgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgcHJvZ3JhbSBmaWxlLgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgTWFyYyBCb3VjaGVyLCBTZXJ2aWNlcyBJbmZvcm1hdGlxdWVzIChNQlNJKSBpbmMuCisqIHBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NyBieSBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqCisqIFRoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLAorKiBhbmQgbGljZW5zZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkCisqIHRoYXQgZXhpc3RpbmcgY29weXJpZ2h0IG5vdGljZXMgYXJlIHJldGFpbmVkIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcworKiBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBhcmUgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55IAorKiBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwgbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMgcmVxdWlyZWQKKyogZm9yIGFueSBvZiB0aGUgYXV0aG9yaXplZCB1c2VzLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT05UUklCVVRPUlMgKkFTIElTKiBBTkQgQU5ZIEVYUFJFU1MgT1IKKyogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAKKyogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSRVZJU0lPTiBISVNUT1JZCisqCisqIDAzLTAxLTAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorKiAgIFBvcnRlZCB0byBsd0lQLgorKiA5Ny0xMi0wNCBHdXkgTGFuY2FzdGVyIDxsYW5jYXN0ZXJnQGFjbS5vcmc+LCBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqICAgT3JpZ2luYWwgYmFzZWQgb24gQlNEIG1hZ2ljLmMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtYWdpYy5jIC0gUFBQIE1hZ2ljIE51bWJlciByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIFBQUF9TVVBQT1JUCisKKyNpbmNsdWRlICJwcHAuaCIKKyNpbmNsdWRlICJyYW5kbS5oIgorI2luY2x1ZGUgIm1hZ2ljLmgiCisKKworLyoKKyAqIG1hZ2ljSW5pdCAtIEluaXRpYWxpemUgdGhlIG1hZ2ljIG51bWJlciBnZW5lcmF0b3IuCisgKgorICogU2luY2Ugd2UgdXNlIGFub3RoZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhhdCBoYXMgaXRzIG93bgorICogaW5pdGlhbGl6YXRpb24sIHdlIGRvIG5vdGhpbmcgaGVyZS4KKyAqLwordm9pZCBtYWdpY0luaXQoKQoreworICByZXR1cm47Cit9CisKKy8qCisgKiBtYWdpYyAtIFJldHVybnMgdGhlIG5leHQgbWFnaWMgbnVtYmVyLgorICovCit1MzJfdCBtYWdpYygpCit7CisgIHJldHVybiBhdlJhbmRvbSgpOworfQorCisjZW5kaWYgLyogUFBQX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL21hZ2ljLmggYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9tYWdpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTcwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9tYWdpYy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtYWdpYy5oIC0gTmV0d29yayBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBoZWFkZXIgZmlsZS4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IE1hcmMgQm91Y2hlciwgU2VydmljZXMgSW5mb3JtYXRpcXVlcyAoTUJTSSkgaW5jLgorKiBwb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTcgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKgorKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKKyogYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAorKiB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMKKyogbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXJlIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSAKKyogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkCisqIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTICpBUyBJUyogQU5EIEFOWSBFWFBSRVNTIE9SCisqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUkVWSVNJT04gSElTVE9SWQorKgorKiAwMy0wMS0wMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyogICBQb3J0ZWQgdG8gbHdJUC4KKyogOTctMTItMDQgR3V5IExhbmNhc3RlciA8Z2xhbmNhQGdlc24uY29tPiwgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKiAgIE9yaWdpbmFsIGRlcml2ZWQgZnJvbSBCU0QgY29kZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtYWdpYy5oIC0gUFBQIE1hZ2ljIE51bWJlciBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiAkSWQ6IG1hZ2ljLmgsdiAxLjMgMjAxMC8wMS8xOCAyMDo0OTo0MyBnb2xkc2ltb24gRXhwICQKKyAqLworCisjaWZuZGVmIE1BR0lDX0gKKyNkZWZpbmUgTUFHSUNfSAorCisvKiBJbml0aWFsaXplIHRoZSBtYWdpYyBudW1iZXIgZ2VuZXJhdG9yICovCit2b2lkICBtYWdpY0luaXQodm9pZCk7CisKKy8qIFJldHVybnMgdGhlIG5leHQgbWFnaWMgbnVtYmVyICovCit1MzJfdCBtYWdpYyh2b2lkKTsKKworI2VuZGlmIC8qIE1BR0lDX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL21kNS5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiNjllMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL21kNS5jCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiogbWQ1LmMgLS0gdGhlIHNvdXJjZSBjb2RlIGZvciBNRDUgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAqKiBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtICAgICAgICAgICAgICAqKgorICoqIENyZWF0ZWQ6IDIvMTcvOTAgUkxSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKiogUmV2aXNlZDogMS85MSBTUkQsQUosQlNLLEpUIFJlZmVyZW5jZSBDIHZlci4sIDcvMTAgY29uc3RhbnQgY29yci4gKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKiBDb3B5cmlnaHQgKEMpIDE5OTAsIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAqKgorICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKiogTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgICAgKioKKyAqKiBpdCBpcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtICAgICAqKgorICoqIERpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgICoqCisgKiogc29mdHdhcmUgb3IgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICoqIExpY2Vuc2UgaXMgYWxzbyBncmFudGVkIHRvIG1ha2UgYW5kIHVzZSBkZXJpdmF0aXZlIHdvcmtzICAgICAgICAgICoqCisgKiogcHJvdmlkZWQgdGhhdCBzdWNoIHdvcmtzIGFyZSBpZGVudGlmaWVkIGFzICJkZXJpdmVkIGZyb20gdGhlIFJTQSAgKioKKyAqKiBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCAgICAgICAgICAqKgorICoqIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhlIGRlcml2ZWQgd29yay4gICAgICAgICAgICAgICoqCisgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAqKiBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyAgICAgICAqKgorICoqIGVpdGhlciB0aGUgbWVyY2hhbnRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgb3IgdGhlIHN1aXRhYmlsaXR5ICAgICoqCisgKiogb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyAgKioKKyAqKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgb2YgYW55IGtpbmQuICAgICAgICAgICAgICAqKgorICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKiogVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHJldGFpbmVkIGluIGFueSBjb3BpZXMgb2YgYW55IHBhcnQgb2YgdGhpcyAgKioKKyAqKiBkb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBQUFBfU1VQUE9SVCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2lmIENIQVBfU1VQUE9SVCB8fCBNRDVfU1VQUE9SVAorCisjaW5jbHVkZSAicHBwLmgiCisjaW5jbHVkZSAicHBwZGVidWcuaCIKKworI2luY2x1ZGUgIm1kNS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKiAgTWVzc2FnZS1kaWdlc3Qgcm91dGluZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICoqICBUbyBmb3JtIHRoZSBtZXNzYWdlIGRpZ2VzdCBmb3IgYSBtZXNzYWdlIE0gICAgICAgICAgICAgICAgICAgICAgICoqCisgKiogICAgKDEpIEluaXRpYWxpemUgYSBjb250ZXh0IGJ1ZmZlciBtZENvbnRleHQgdXNpbmcgTUQ1SW5pdCAgICAgICAgKioKKyAqKiAgICAoMikgQ2FsbCBNRDVVcGRhdGUgb24gbWRDb250ZXh0IGFuZCBNICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICoqICAgICgzKSBDYWxsIE1ENUZpbmFsIG9uIG1kQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKiogIFRoZSBtZXNzYWdlIGRpZ2VzdCBpcyBub3cgaW4gbWRDb250ZXh0LT5kaWdlc3RbMC4uLjE1XSAgICAgICAgICAgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyB2b2lkIFRyYW5zZm9ybSAodTMyX3QgKmJ1ZiwgdTMyX3QgKmluKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgUEFERElOR1s2NF0gPSB7CisgIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKKy8qIEYsIEcsIEggYW5kIEkgYXJlIGJhc2ljIE1ENSBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAoKH54KSAmICh6KSkpCisjZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQorI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCisjZGVmaW5lIEkoeCwgeSwgeikgKCh5KSBeICgoeCkgfCAofnopKSkKKworLyogUk9UQVRFX0xFRlQgcm90YXRlcyB4IGxlZnQgbiBiaXRzICovCisjZGVmaW5lIFJPVEFURV9MRUZUKHgsIG4pICgoKHgpIDw8IChuKSkgfCAoKHgpID4+ICgzMi0obikpKSkKKworLyogRkYsIEdHLCBISCwgYW5kIElJIHRyYW5zZm9ybWF0aW9ucyBmb3Igcm91bmRzIDEsIDIsIDMsIGFuZCA0ICovCisvKiBSb3RhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGFkZGl0aW9uIHRvIHByZXZlbnQgcmVjb21wdXRhdGlvbiAqLworI2RlZmluZSBGRihhLCBiLCBjLCBkLCB4LCBzLCBhYykgXAorICB7KGEpICs9IEYgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKHUzMl90KShhYyk7IFwKKyAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKKyAgIChhKSArPSAoYik7IFwKKyAgfQorI2RlZmluZSBHRyhhLCBiLCBjLCBkLCB4LCBzLCBhYykgXAorICB7KGEpICs9IEcgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKHUzMl90KShhYyk7IFwKKyAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKKyAgIChhKSArPSAoYik7IFwKKyAgfQorI2RlZmluZSBISChhLCBiLCBjLCBkLCB4LCBzLCBhYykgXAorICB7KGEpICs9IEggKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKHUzMl90KShhYyk7IFwKKyAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKKyAgIChhKSArPSAoYik7IFwKKyAgfQorI2RlZmluZSBJSShhLCBiLCBjLCBkLCB4LCBzLCBhYykgXAorICB7KGEpICs9IEkgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKHUzMl90KShhYyk7IFwKKyAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKKyAgIChhKSArPSAoYik7IFwKKyAgfQorCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUgVUwoeCkgeCMjVUwKKyNlbHNlCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgVUwoeCkgeCMjVUwKKyNlbHNlCisjZGVmaW5lIFVMKHgpIHgKKyNlbmRpZgorI2VuZGlmCisKKy8qIFRoZSByb3V0aW5lIE1ENUluaXQgaW5pdGlhbGl6ZXMgdGhlIG1lc3NhZ2UtZGlnZXN0IGNvbnRleHQKKyAgIG1kQ29udGV4dC4gQWxsIGZpZWxkcyBhcmUgc2V0IHRvIHplcm8uCisgKi8KK3ZvaWQKK01ENUluaXQgKE1ENV9DVFggKm1kQ29udGV4dCkKK3sKKyAgbWRDb250ZXh0LT5pWzBdID0gbWRDb250ZXh0LT5pWzFdID0gKHUzMl90KTA7CisKKyAgLyogTG9hZCBtYWdpYyBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuICovCisgIG1kQ29udGV4dC0+YnVmWzBdID0gKHUzMl90KTB4Njc0NTIzMDFVTDsKKyAgbWRDb250ZXh0LT5idWZbMV0gPSAodTMyX3QpMHhlZmNkYWI4OVVMOworICBtZENvbnRleHQtPmJ1ZlsyXSA9ICh1MzJfdCkweDk4YmFkY2ZlVUw7CisgIG1kQ29udGV4dC0+YnVmWzNdID0gKHUzMl90KTB4MTAzMjU0NzZVTDsKK30KKworLyogVGhlIHJvdXRpbmUgTUQ1VXBkYXRlIHVwZGF0ZXMgdGhlIG1lc3NhZ2UtZGlnZXN0IGNvbnRleHQgdG8KKyAgIGFjY291bnQgZm9yIHRoZSBwcmVzZW5jZSBvZiBlYWNoIG9mIHRoZSBjaGFyYWN0ZXJzIGluQnVmWzAuLmluTGVuLTFdCisgICBpbiB0aGUgbWVzc2FnZSB3aG9zZSBkaWdlc3QgaXMgYmVpbmcgY29tcHV0ZWQuCisgKi8KK3ZvaWQKK01ENVVwZGF0ZShNRDVfQ1RYICptZENvbnRleHQsIHVuc2lnbmVkIGNoYXIgKmluQnVmLCB1bnNpZ25lZCBpbnQgaW5MZW4pCit7CisgIHUzMl90IGluWzE2XTsKKyAgaW50IG1kaTsKKyAgdW5zaWduZWQgaW50IGksIGlpOworCisjaWYgMAorICBQUFBERUJVRyhMT0dfSU5GTywgKCJNRDVVcGRhdGU6ICV1OiUuKkhcbiIsIGluTGVuLCBMV0lQX01JTihpbkxlbiwgMjApICogMiwgaW5CdWYpKTsKKyAgUFBQREVCVUcoTE9HX0lORk8sICgiTUQ1VXBkYXRlOiAldTolc1xuIiwgaW5MZW4sIGluQnVmKSk7CisjZW5kaWYKKyAgCisgIC8qIGNvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLworICBtZGkgPSAoaW50KSgobWRDb250ZXh0LT5pWzBdID4+IDMpICYgMHgzRik7CisKKyAgLyogdXBkYXRlIG51bWJlciBvZiBiaXRzICovCisgIGlmICgobWRDb250ZXh0LT5pWzBdICsgKCh1MzJfdClpbkxlbiA8PCAzKSkgPCBtZENvbnRleHQtPmlbMF0pIHsKKyAgICBtZENvbnRleHQtPmlbMV0rKzsKKyAgfQorICBtZENvbnRleHQtPmlbMF0gKz0gKCh1MzJfdClpbkxlbiA8PCAzKTsKKyAgbWRDb250ZXh0LT5pWzFdICs9ICgodTMyX3QpaW5MZW4gPj4gMjkpOworCisgIHdoaWxlIChpbkxlbi0tKSB7CisgICAgLyogYWRkIG5ldyBjaGFyYWN0ZXIgdG8gYnVmZmVyLCBpbmNyZW1lbnQgbWRpICovCisgICAgbWRDb250ZXh0LT5pblttZGkrK10gPSAqaW5CdWYrKzsKKworICAgIC8qIHRyYW5zZm9ybSBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAobWRpID09IDB4NDApIHsKKyAgICAgIGZvciAoaSA9IDAsIGlpID0gMDsgaSA8IDE2OyBpKyssIGlpICs9IDQpIHsKKyAgICAgICAgaW5baV0gPSAoKCh1MzJfdCltZENvbnRleHQtPmluW2lpKzNdKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoKHUzMl90KW1kQ29udGV4dC0+aW5baWkrMl0pIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKCgodTMyX3QpbWRDb250ZXh0LT5pbltpaSsxXSkgPDwgOCkgIHwKKyAgICAgICAgICAgICAgICAoKHUzMl90KW1kQ29udGV4dC0+aW5baWldKTsKKyAgICAgIH0KKyAgICAgIFRyYW5zZm9ybSAobWRDb250ZXh0LT5idWYsIGluKTsKKyAgICAgIG1kaSA9IDA7CisgICAgfQorICB9Cit9CisKKy8qIFRoZSByb3V0aW5lIE1ENUZpbmFsIHRlcm1pbmF0ZXMgdGhlIG1lc3NhZ2UtZGlnZXN0IGNvbXB1dGF0aW9uIGFuZAorICAgZW5kcyB3aXRoIHRoZSBkZXNpcmVkIG1lc3NhZ2UgZGlnZXN0IGluIG1kQ29udGV4dC0+ZGlnZXN0WzAuLi4xNV0uCisgKi8KK3ZvaWQKK01ENUZpbmFsICh1bnNpZ25lZCBjaGFyIGhhc2hbXSwgTUQ1X0NUWCAqbWRDb250ZXh0KQoreworICB1MzJfdCBpblsxNl07CisgIGludCBtZGk7CisgIHVuc2lnbmVkIGludCBpLCBpaTsKKyAgdW5zaWduZWQgaW50IHBhZExlbjsKKworICAvKiBzYXZlIG51bWJlciBvZiBiaXRzICovCisgIGluWzE0XSA9IG1kQ29udGV4dC0+aVswXTsKKyAgaW5bMTVdID0gbWRDb250ZXh0LT5pWzFdOworCisgIC8qIGNvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLworICBtZGkgPSAoaW50KSgobWRDb250ZXh0LT5pWzBdID4+IDMpICYgMHgzRik7CisKKyAgLyogcGFkIG91dCB0byA1NiBtb2QgNjQgKi8KKyAgcGFkTGVuID0gKG1kaSA8IDU2KSA/ICg1NiAtIG1kaSkgOiAoMTIwIC0gbWRpKTsKKyAgTUQ1VXBkYXRlIChtZENvbnRleHQsIFBBRERJTkcsIHBhZExlbik7CisKKyAgLyogYXBwZW5kIGxlbmd0aCBpbiBiaXRzIGFuZCB0cmFuc2Zvcm0gKi8KKyAgZm9yIChpID0gMCwgaWkgPSAwOyBpIDwgMTQ7IGkrKywgaWkgKz0gNCkgeworICAgIGluW2ldID0gKCgodTMyX3QpbWRDb250ZXh0LT5pbltpaSszXSkgPDwgMjQpIHwKKyAgICAgICAgICAgICgoKHUzMl90KW1kQ29udGV4dC0+aW5baWkrMl0pIDw8IDE2KSB8CisgICAgICAgICAgICAoKCh1MzJfdCltZENvbnRleHQtPmluW2lpKzFdKSA8PCA4KSAgfAorICAgICAgICAgICAgKCh1MzJfdCltZENvbnRleHQtPmluW2lpXSk7CisgIH0KKyAgVHJhbnNmb3JtIChtZENvbnRleHQtPmJ1ZiwgaW4pOworCisgIC8qIHN0b3JlIGJ1ZmZlciBpbiBkaWdlc3QgKi8KKyAgZm9yIChpID0gMCwgaWkgPSAwOyBpIDwgNDsgaSsrLCBpaSArPSA0KSB7CisgICAgbWRDb250ZXh0LT5kaWdlc3RbaWldICAgPSAodW5zaWduZWQgY2hhcikobWRDb250ZXh0LT5idWZbaV0gJiAweEZGKTsKKyAgICBtZENvbnRleHQtPmRpZ2VzdFtpaSsxXSA9CisgICAgICAodW5zaWduZWQgY2hhcikoKG1kQ29udGV4dC0+YnVmW2ldID4+IDgpICAmIDB4RkYpOworICAgIG1kQ29udGV4dC0+ZGlnZXN0W2lpKzJdID0KKyAgICAgICh1bnNpZ25lZCBjaGFyKSgobWRDb250ZXh0LT5idWZbaV0gPj4gMTYpICYgMHhGRik7CisgICAgbWRDb250ZXh0LT5kaWdlc3RbaWkrM10gPQorICAgICAgKHVuc2lnbmVkIGNoYXIpKChtZENvbnRleHQtPmJ1ZltpXSA+PiAyNCkgJiAweEZGKTsKKyAgfQorICBTTUVNQ1BZKGhhc2gsIG1kQ29udGV4dC0+ZGlnZXN0LCAxNik7Cit9CisKKy8qIEJhc2ljIE1ENSBzdGVwLiBUcmFuc2Zvcm1zIGJ1ZiBiYXNlZCBvbiBpbi4KKyAqLworc3RhdGljIHZvaWQKK1RyYW5zZm9ybSAodTMyX3QgKmJ1ZiwgdTMyX3QgKmluKQoreworICB1MzJfdCBhID0gYnVmWzBdLCBiID0gYnVmWzFdLCBjID0gYnVmWzJdLCBkID0gYnVmWzNdOworCisgIC8qIFJvdW5kIDEgKi8KKyNkZWZpbmUgUzExIDcKKyNkZWZpbmUgUzEyIDEyCisjZGVmaW5lIFMxMyAxNworI2RlZmluZSBTMTQgMjIKKyAgRkYgKCBhLCBiLCBjLCBkLCBpblsgMF0sIFMxMSwgVUwoMzYxNDA5MDM2MCkpOyAvKiAxICovCisgIEZGICggZCwgYSwgYiwgYywgaW5bIDFdLCBTMTIsIFVMKDM5MDU0MDI3MTApKTsgLyogMiAqLworICBGRiAoIGMsIGQsIGEsIGIsIGluWyAyXSwgUzEzLCBVTCggNjA2MTA1ODE5KSk7IC8qIDMgKi8KKyAgRkYgKCBiLCBjLCBkLCBhLCBpblsgM10sIFMxNCwgVUwoMzI1MDQ0MTk2NikpOyAvKiA0ICovCisgIEZGICggYSwgYiwgYywgZCwgaW5bIDRdLCBTMTEsIFVMKDQxMTg1NDgzOTkpKTsgLyogNSAqLworICBGRiAoIGQsIGEsIGIsIGMsIGluWyA1XSwgUzEyLCBVTCgxMjAwMDgwNDI2KSk7IC8qIDYgKi8KKyAgRkYgKCBjLCBkLCBhLCBiLCBpblsgNl0sIFMxMywgVUwoMjgyMTczNTk1NSkpOyAvKiA3ICovCisgIEZGICggYiwgYywgZCwgYSwgaW5bIDddLCBTMTQsIFVMKDQyNDkyNjEzMTMpKTsgLyogOCAqLworICBGRiAoIGEsIGIsIGMsIGQsIGluWyA4XSwgUzExLCBVTCgxNzcwMDM1NDE2KSk7IC8qIDkgKi8KKyAgRkYgKCBkLCBhLCBiLCBjLCBpblsgOV0sIFMxMiwgVUwoMjMzNjU1Mjg3OSkpOyAvKiAxMCAqLworICBGRiAoIGMsIGQsIGEsIGIsIGluWzEwXSwgUzEzLCBVTCg0Mjk0OTI1MjMzKSk7IC8qIDExICovCisgIEZGICggYiwgYywgZCwgYSwgaW5bMTFdLCBTMTQsIFVMKDIzMDQ1NjMxMzQpKTsgLyogMTIgKi8KKyAgRkYgKCBhLCBiLCBjLCBkLCBpblsxMl0sIFMxMSwgVUwoMTgwNDYwMzY4MikpOyAvKiAxMyAqLworICBGRiAoIGQsIGEsIGIsIGMsIGluWzEzXSwgUzEyLCBVTCg0MjU0NjI2MTk1KSk7IC8qIDE0ICovCisgIEZGICggYywgZCwgYSwgYiwgaW5bMTRdLCBTMTMsIFVMKDI3OTI5NjUwMDYpKTsgLyogMTUgKi8KKyAgRkYgKCBiLCBjLCBkLCBhLCBpblsxNV0sIFMxNCwgVUwoMTIzNjUzNTMyOSkpOyAvKiAxNiAqLworCisgIC8qIFJvdW5kIDIgKi8KKyNkZWZpbmUgUzIxIDUKKyNkZWZpbmUgUzIyIDkKKyNkZWZpbmUgUzIzIDE0CisjZGVmaW5lIFMyNCAyMAorICBHRyAoIGEsIGIsIGMsIGQsIGluWyAxXSwgUzIxLCBVTCg0MTI5MTcwNzg2KSk7IC8qIDE3ICovCisgIEdHICggZCwgYSwgYiwgYywgaW5bIDZdLCBTMjIsIFVMKDMyMjU0NjU2NjQpKTsgLyogMTggKi8KKyAgR0cgKCBjLCBkLCBhLCBiLCBpblsxMV0sIFMyMywgVUwoIDY0MzcxNzcxMykpOyAvKiAxOSAqLworICBHRyAoIGIsIGMsIGQsIGEsIGluWyAwXSwgUzI0LCBVTCgzOTIxMDY5OTk0KSk7IC8qIDIwICovCisgIEdHICggYSwgYiwgYywgZCwgaW5bIDVdLCBTMjEsIFVMKDM1OTM0MDg2MDUpKTsgLyogMjEgKi8KKyAgR0cgKCBkLCBhLCBiLCBjLCBpblsxMF0sIFMyMiwgVUwoICAzODAxNjA4MykpOyAvKiAyMiAqLworICBHRyAoIGMsIGQsIGEsIGIsIGluWzE1XSwgUzIzLCBVTCgzNjM0NDg4OTYxKSk7IC8qIDIzICovCisgIEdHICggYiwgYywgZCwgYSwgaW5bIDRdLCBTMjQsIFVMKDM4ODk0Mjk0NDgpKTsgLyogMjQgKi8KKyAgR0cgKCBhLCBiLCBjLCBkLCBpblsgOV0sIFMyMSwgVUwoIDU2ODQ0NjQzOCkpOyAvKiAyNSAqLworICBHRyAoIGQsIGEsIGIsIGMsIGluWzE0XSwgUzIyLCBVTCgzMjc1MTYzNjA2KSk7IC8qIDI2ICovCisgIEdHICggYywgZCwgYSwgYiwgaW5bIDNdLCBTMjMsIFVMKDQxMDc2MDMzMzUpKTsgLyogMjcgKi8KKyAgR0cgKCBiLCBjLCBkLCBhLCBpblsgOF0sIFMyNCwgVUwoMTE2MzUzMTUwMSkpOyAvKiAyOCAqLworICBHRyAoIGEsIGIsIGMsIGQsIGluWzEzXSwgUzIxLCBVTCgyODUwMjg1ODI5KSk7IC8qIDI5ICovCisgIEdHICggZCwgYSwgYiwgYywgaW5bIDJdLCBTMjIsIFVMKDQyNDM1NjM1MTIpKTsgLyogMzAgKi8KKyAgR0cgKCBjLCBkLCBhLCBiLCBpblsgN10sIFMyMywgVUwoMTczNTMyODQ3MykpOyAvKiAzMSAqLworICBHRyAoIGIsIGMsIGQsIGEsIGluWzEyXSwgUzI0LCBVTCgyMzY4MzU5NTYyKSk7IC8qIDMyICovCisKKyAgLyogUm91bmQgMyAqLworI2RlZmluZSBTMzEgNAorI2RlZmluZSBTMzIgMTEKKyNkZWZpbmUgUzMzIDE2CisjZGVmaW5lIFMzNCAyMworICBISCAoIGEsIGIsIGMsIGQsIGluWyA1XSwgUzMxLCBVTCg0Mjk0NTg4NzM4KSk7IC8qIDMzICovCisgIEhIICggZCwgYSwgYiwgYywgaW5bIDhdLCBTMzIsIFVMKDIyNzIzOTI4MzMpKTsgLyogMzQgKi8KKyAgSEggKCBjLCBkLCBhLCBiLCBpblsxMV0sIFMzMywgVUwoMTgzOTAzMDU2MikpOyAvKiAzNSAqLworICBISCAoIGIsIGMsIGQsIGEsIGluWzE0XSwgUzM0LCBVTCg0MjU5NjU3NzQwKSk7IC8qIDM2ICovCisgIEhIICggYSwgYiwgYywgZCwgaW5bIDFdLCBTMzEsIFVMKDI3NjM5NzUyMzYpKTsgLyogMzcgKi8KKyAgSEggKCBkLCBhLCBiLCBjLCBpblsgNF0sIFMzMiwgVUwoMTI3Mjg5MzM1MykpOyAvKiAzOCAqLworICBISCAoIGMsIGQsIGEsIGIsIGluWyA3XSwgUzMzLCBVTCg0MTM5NDY5NjY0KSk7IC8qIDM5ICovCisgIEhIICggYiwgYywgZCwgYSwgaW5bMTBdLCBTMzQsIFVMKDMyMDAyMzY2NTYpKTsgLyogNDAgKi8KKyAgSEggKCBhLCBiLCBjLCBkLCBpblsxM10sIFMzMSwgVUwoIDY4MTI3OTE3NCkpOyAvKiA0MSAqLworICBISCAoIGQsIGEsIGIsIGMsIGluWyAwXSwgUzMyLCBVTCgzOTM2NDMwMDc0KSk7IC8qIDQyICovCisgIEhIICggYywgZCwgYSwgYiwgaW5bIDNdLCBTMzMsIFVMKDM1NzI0NDUzMTcpKTsgLyogNDMgKi8KKyAgSEggKCBiLCBjLCBkLCBhLCBpblsgNl0sIFMzNCwgVUwoICA3NjAyOTE4OSkpOyAvKiA0NCAqLworICBISCAoIGEsIGIsIGMsIGQsIGluWyA5XSwgUzMxLCBVTCgzNjU0NjAyODA5KSk7IC8qIDQ1ICovCisgIEhIICggZCwgYSwgYiwgYywgaW5bMTJdLCBTMzIsIFVMKDM4NzMxNTE0NjEpKTsgLyogNDYgKi8KKyAgSEggKCBjLCBkLCBhLCBiLCBpblsxNV0sIFMzMywgVUwoIDUzMDc0MjUyMCkpOyAvKiA0NyAqLworICBISCAoIGIsIGMsIGQsIGEsIGluWyAyXSwgUzM0LCBVTCgzMjk5NjI4NjQ1KSk7IC8qIDQ4ICovCisKKyAgLyogUm91bmQgNCAqLworI2RlZmluZSBTNDEgNgorI2RlZmluZSBTNDIgMTAKKyNkZWZpbmUgUzQzIDE1CisjZGVmaW5lIFM0NCAyMQorICBJSSAoIGEsIGIsIGMsIGQsIGluWyAwXSwgUzQxLCBVTCg0MDk2MzM2NDUyKSk7IC8qIDQ5ICovCisgIElJICggZCwgYSwgYiwgYywgaW5bIDddLCBTNDIsIFVMKDExMjY4OTE0MTUpKTsgLyogNTAgKi8KKyAgSUkgKCBjLCBkLCBhLCBiLCBpblsxNF0sIFM0MywgVUwoMjg3ODYxMjM5MSkpOyAvKiA1MSAqLworICBJSSAoIGIsIGMsIGQsIGEsIGluWyA1XSwgUzQ0LCBVTCg0MjM3NTMzMjQxKSk7IC8qIDUyICovCisgIElJICggYSwgYiwgYywgZCwgaW5bMTJdLCBTNDEsIFVMKDE3MDA0ODU1NzEpKTsgLyogNTMgKi8KKyAgSUkgKCBkLCBhLCBiLCBjLCBpblsgM10sIFM0MiwgVUwoMjM5OTk4MDY5MCkpOyAvKiA1NCAqLworICBJSSAoIGMsIGQsIGEsIGIsIGluWzEwXSwgUzQzLCBVTCg0MjkzOTE1NzczKSk7IC8qIDU1ICovCisgIElJICggYiwgYywgZCwgYSwgaW5bIDFdLCBTNDQsIFVMKDIyNDAwNDQ0OTcpKTsgLyogNTYgKi8KKyAgSUkgKCBhLCBiLCBjLCBkLCBpblsgOF0sIFM0MSwgVUwoMTg3MzMxMzM1OSkpOyAvKiA1NyAqLworICBJSSAoIGQsIGEsIGIsIGMsIGluWzE1XSwgUzQyLCBVTCg0MjY0MzU1NTUyKSk7IC8qIDU4ICovCisgIElJICggYywgZCwgYSwgYiwgaW5bIDZdLCBTNDMsIFVMKDI3MzQ3Njg5MTYpKTsgLyogNTkgKi8KKyAgSUkgKCBiLCBjLCBkLCBhLCBpblsxM10sIFM0NCwgVUwoMTMwOTE1MTY0OSkpOyAvKiA2MCAqLworICBJSSAoIGEsIGIsIGMsIGQsIGluWyA0XSwgUzQxLCBVTCg0MTQ5NDQ0MjI2KSk7IC8qIDYxICovCisgIElJICggZCwgYSwgYiwgYywgaW5bMTFdLCBTNDIsIFVMKDMxNzQ3NTY5MTcpKTsgLyogNjIgKi8KKyAgSUkgKCBjLCBkLCBhLCBiLCBpblsgMl0sIFM0MywgVUwoIDcxODc4NzI1OSkpOyAvKiA2MyAqLworICBJSSAoIGIsIGMsIGQsIGEsIGluWyA5XSwgUzQ0LCBVTCgzOTUxNDgxNzQ1KSk7IC8qIDY0ICovCisKKyAgYnVmWzBdICs9IGE7CisgIGJ1ZlsxXSArPSBiOworICBidWZbMl0gKz0gYzsKKyAgYnVmWzNdICs9IGQ7Cit9CisKKyNlbmRpZiAvKiBDSEFQX1NVUFBPUlQgfHwgTUQ1X1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIFBQUF9TVVBQT1JUICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9tZDUuaCBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjk1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9tZDUuaApAQCAtMCwwICsxLDU1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiogbWQ1LmggLS0gaGVhZGVyIGZpbGUgZm9yIGltcGxlbWVudGF0aW9uIG9mIE1ENSAgICAgICAgICAgICAgICAgICAgKioKKyAqKiBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtICAgICAgICAgICAgICAqKgorICoqIENyZWF0ZWQ6IDIvMTcvOTAgUkxSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKiogUmV2aXNlZDogMTIvMjcvOTAgU1JELEFKLEJTSyxKVCBSZWZlcmVuY2UgQyB2ZXJzaW9uICAgICAgICAgICAgICAgKioKKyAqKiBSZXZpc2VkIChmb3IgTUQ1KTogUkxSIDQvMjcvOTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICoqICAgLS0gRyBtb2RpZmllZCB0byBoYXZlIHkmfnogaW5zdGVhZCBvZiB5JnogICAgICAgICAgICAgICAgICAgICAgICoqCisgKiogICAtLSBGRiwgR0csIEhIIG1vZGlmaWVkIHRvIGFkZCBpbiBsYXN0IHJlZ2lzdGVyIGRvbmUgICAgICAgICAgICAgKioKKyAqKiAgIC0tIEFjY2VzcyBwYXR0ZXJuOiByb3VuZCAyIHdvcmtzIG1vZCA1LCByb3VuZCAzIHdvcmtzIG1vZCAzICAgICAqKgorICoqICAgLS0gZGlzdGluY3QgYWRkaXRpdmUgY29uc3RhbnQgZm9yIGVhY2ggc3RlcCAgICAgICAgICAgICAgICAgICAgICoqCisgKiogICAtLSByb3VuZCA0IGFkZGVkLCB3b3JraW5nIG1vZCA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKiBDb3B5cmlnaHQgKEMpIDE5OTAsIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAqKgorICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKiogTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgICAgKioKKyAqKiBpdCBpcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtICAgICAqKgorICoqIERpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgICoqCisgKiogc29mdHdhcmUgb3IgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICoqIExpY2Vuc2UgaXMgYWxzbyBncmFudGVkIHRvIG1ha2UgYW5kIHVzZSBkZXJpdmF0aXZlIHdvcmtzICAgICAgICAgICoqCisgKiogcHJvdmlkZWQgdGhhdCBzdWNoIHdvcmtzIGFyZSBpZGVudGlmaWVkIGFzICJkZXJpdmVkIGZyb20gdGhlIFJTQSAgKioKKyAqKiBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCAgICAgICAgICAqKgorICoqIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhlIGRlcml2ZWQgd29yay4gICAgICAgICAgICAgICoqCisgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAqKiBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyAgICAgICAqKgorICoqIGVpdGhlciB0aGUgbWVyY2hhbnRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgb3IgdGhlIHN1aXRhYmlsaXR5ICAgICoqCisgKiogb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyAgKioKKyAqKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgb2YgYW55IGtpbmQuICAgICAgICAgICAgICAqKgorICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKiogVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHJldGFpbmVkIGluIGFueSBjb3BpZXMgb2YgYW55IHBhcnQgb2YgdGhpcyAgKioKKyAqKiBkb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBNRDVfSAorI2RlZmluZSBNRDVfSAorCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgTUQ1IChNZXNzYWdlLURpZ2VzdCkgY29tcHV0YXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdTMyX3QgaVsyXTsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgX2JpdHNfIGhhbmRsZWQgbW9kIDJeNjQgKi8KKyAgdTMyX3QgYnVmWzRdOyAgICAgICAgICAgICAvKiBzY3JhdGNoIGJ1ZmZlciAqLworICB1bnNpZ25lZCBjaGFyIGluWzY0XTsgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFsxNl07IC8qIGFjdHVhbCBkaWdlc3QgYWZ0ZXIgTUQ1RmluYWwgY2FsbCAqLworfSBNRDVfQ1RYOworCit2b2lkIE1ENUluaXQgICggTUQ1X0NUWCAqbWRDb250ZXh0KTsKK3ZvaWQgTUQ1VXBkYXRlKCBNRDVfQ1RYICptZENvbnRleHQsIHVuc2lnbmVkIGNoYXIgKmluQnVmLCB1bnNpZ25lZCBpbnQgaW5MZW4pOwordm9pZCBNRDVGaW5hbCAoIHVuc2lnbmVkIGNoYXIgaGFzaFtdLCBNRDVfQ1RYICptZENvbnRleHQpOworCisjZW5kaWYgLyogTUQ1X0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL3BhcC5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvcGFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0NGU2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL3BhcC5jCkBAIC0wLDAgKzEsNjI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGFwLmMgLSBOZXR3b3JrIFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIHByb2dyYW0gZmlsZS4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IE1hcmMgQm91Y2hlciwgU2VydmljZXMgSW5mb3JtYXRpcXVlcyAoTUJTSSkgaW5jLgorKiBwb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKgorKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKKyogYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAorKiB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMKKyogbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXJlIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSAKKyogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkCisqIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTICpBUyBJUyogQU5EIEFOWSBFWFBSRVNTIE9SCisqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUkVWSVNJT04gSElTVE9SWQorKgorKiAwMy0wMS0wMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyogICBQb3J0ZWQgdG8gbHdJUC4KKyogOTctMTItMTIgR3V5IExhbmNhc3RlciA8bGFuY2FzdGVyZ0BhY20ub3JnPiwgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKiAgIE9yaWdpbmFsLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdXBhcC5jIC0gVXNlci9QYXNzd29yZCBBdXRoZW50aWNhdGlvbiBQcm90b2NvbC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSAibHdpcC9vcHQuaCIKKworI2lmIFBQUF9TVVBQT1JUIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaWYgUEFQX1NVUFBPUlQgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJwcHAuaCIKKyNpbmNsdWRlICJwcHBkZWJ1Zy5oIgorCisjaW5jbHVkZSAiYXV0aC5oIgorI2luY2x1ZGUgInBhcC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiAwIC8qIFVOVVNFRCAqLworc3RhdGljIGJvb2wgaGlkZV9wYXNzd29yZCA9IDE7CisKKy8qCisgKiBDb21tYW5kLWxpbmUgb3B0aW9ucy4KKyAqLworc3RhdGljIG9wdGlvbl90IHBhcF9vcHRpb25fbGlzdFtdID0geworICAgIHsgImhpZGUtcGFzc3dvcmQiLCBvX2Jvb2wsICZoaWRlX3Bhc3N3b3JkLAorICAgICAgIkRvbid0IG91dHB1dCBwYXNzd29yZHMgdG8gbG9nIiwgMSB9LAorICAgIHsgInNob3ctcGFzc3dvcmQiLCBvX2Jvb2wsICZoaWRlX3Bhc3N3b3JkLAorICAgICAgIlNob3cgcGFzc3dvcmQgc3RyaW5nIGluIGRlYnVnIGxvZyBtZXNzYWdlcyIsIDAgfSwKKyAgICB7ICJwYXAtcmVzdGFydCIsIG9faW50LCAmdXBhcFswXS51c190aW1lb3V0dGltZSwKKyAgICAgICJTZXQgcmV0cmFuc21pdCB0aW1lb3V0IGZvciBQQVAiIH0sCisgICAgeyAicGFwLW1heC1hdXRocmVxIiwgb19pbnQsICZ1cGFwWzBdLnVzX21heHRyYW5zbWl0cywKKyAgICAgICJTZXQgbWF4IG51bWJlciBvZiB0cmFuc21pc3Npb25zIGZvciBhdXRoLXJlcXMiIH0sCisgICAgeyAicGFwLXRpbWVvdXQiLCBvX2ludCwgJnVwYXBbMF0udXNfcmVxdGltZW91dCwKKyAgICAgICJTZXQgdGltZSBsaW1pdCBmb3IgcGVlciBQQVAgYXV0aGVudGljYXRpb24iIH0sCisgICAgeyBOVUxMIH0KK307CisjZW5kaWYKKworLyoKKyAqIFByb3RvY29sIGVudHJ5IHBvaW50cy4KKyAqLworc3RhdGljIHZvaWQgdXBhcF9pbml0ICAgICAgKGludCk7CitzdGF0aWMgdm9pZCB1cGFwX2xvd2VydXAgICAoaW50KTsKK3N0YXRpYyB2b2lkIHVwYXBfbG93ZXJkb3duIChpbnQpOworc3RhdGljIHZvaWQgdXBhcF9pbnB1dCAgICAgKGludCwgdV9jaGFyICosIGludCk7CitzdGF0aWMgdm9pZCB1cGFwX3Byb3RyZWogICAoaW50KTsKKyNpZiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MKK3N0YXRpYyBpbnQgIHVwYXBfcHJpbnRwa3QgKHVfY2hhciAqLCBpbnQsIHZvaWQgKCopKHZvaWQgKiwgY2hhciAqLCAuLi4pLCB2b2lkICopOworI2VuZGlmIC8qIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUyAqLworCitzdHJ1Y3QgcHJvdGVudCBwYXBfcHJvdGVudCA9IHsKKyAgUFBQX1BBUCwKKyAgdXBhcF9pbml0LAorICB1cGFwX2lucHV0LAorICB1cGFwX3Byb3RyZWosCisgIHVwYXBfbG93ZXJ1cCwKKyAgdXBhcF9sb3dlcmRvd24sCisgIE5VTEwsCisgIE5VTEwsCisjaWYgUFBQX0FERElUSU9OQUxfQ0FMTEJBQ0tTCisgIHVwYXBfcHJpbnRwa3QsCisgIE5VTEwsCisjZW5kaWYgLyogUFBQX0FERElUSU9OQUxfQ0FMTEJBQ0tTICovCisgIDEsCisgICJQQVAiLAorI2lmIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUworICBOVUxMLAorICBOVUxMLAorICBOVUxMCisjZW5kaWYgLyogUFBQX0FERElUSU9OQUxfQ0FMTEJBQ0tTICovCit9OworCit1cGFwX3N0YXRlIHVwYXBbTlVNX1BQUF07IC8qIFVQQVAgc3RhdGU7IG9uZSBmb3IgZWFjaCB1bml0ICovCisKK3N0YXRpYyB2b2lkIHVwYXBfdGltZW91dCAgICh2b2lkICopOworc3RhdGljIHZvaWQgdXBhcF9yZXF0aW1lb3V0KHZvaWQgKik7CitzdGF0aWMgdm9pZCB1cGFwX3JhdXRocmVxICAodXBhcF9zdGF0ZSAqLCB1X2NoYXIgKiwgdV9jaGFyLCBpbnQpOworc3RhdGljIHZvaWQgdXBhcF9yYXV0aGFjayAgKHVwYXBfc3RhdGUgKiwgdV9jaGFyICosIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIHVwYXBfcmF1dGhuYWsgICh1cGFwX3N0YXRlICosIHVfY2hhciAqLCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCB1cGFwX3NhdXRocmVxICAodXBhcF9zdGF0ZSAqKTsKK3N0YXRpYyB2b2lkIHVwYXBfc3Jlc3AgICAgICh1cGFwX3N0YXRlICosIHVfY2hhciwgdV9jaGFyLCBjaGFyICosIGludCk7CisKKworLyoKKyAqIHVwYXBfaW5pdCAtIEluaXRpYWxpemUgYSBVUEFQIHVuaXQuCisgKi8KK3N0YXRpYyB2b2lkCit1cGFwX2luaXQoaW50IHVuaXQpCit7CisgIHVwYXBfc3RhdGUgKnUgPSAmdXBhcFt1bml0XTsKKworICBVUEFQREVCVUcoTE9HX0lORk8sICgidXBhcF9pbml0OiAlZFxuIiwgdW5pdCkpOworICB1LT51c191bml0ICAgICAgICAgPSB1bml0OworICB1LT51c191c2VyICAgICAgICAgPSBOVUxMOworICB1LT51c191c2VybGVuICAgICAgPSAwOworICB1LT51c19wYXNzd2QgICAgICAgPSBOVUxMOworICB1LT51c19wYXNzd2RsZW4gICAgPSAwOworICB1LT51c19jbGllbnRzdGF0ZSAgPSBVUEFQQ1NfSU5JVElBTDsKKyAgdS0+dXNfc2VydmVyc3RhdGUgID0gVVBBUFNTX0lOSVRJQUw7CisgIHUtPnVzX2lkICAgICAgICAgICA9IDA7CisgIHUtPnVzX3RpbWVvdXR0aW1lICA9IFVQQVBfREVGVElNRU9VVDsKKyAgdS0+dXNfbWF4dHJhbnNtaXRzID0gMTA7CisgIHUtPnVzX3JlcXRpbWVvdXQgICA9IFVQQVBfREVGUkVRVElNRTsKK30KKworLyoKKyAqIHVwYXBfYXV0aHdpdGhwZWVyIC0gQXV0aGVudGljYXRlIHVzIHdpdGggb3VyIHBlZXIgKHN0YXJ0IGNsaWVudCkuCisgKgorICogU2V0IG5ldyBzdGF0ZSBhbmQgc2VuZCBhdXRoZW50aWNhdGUncy4KKyAqLwordm9pZAordXBhcF9hdXRod2l0aHBlZXIoaW50IHVuaXQsIGNoYXIgKnVzZXIsIGNoYXIgKnBhc3N3b3JkKQoreworICB1cGFwX3N0YXRlICp1ID0gJnVwYXBbdW5pdF07CisKKyAgVVBBUERFQlVHKExPR19JTkZPLCAoInVwYXBfYXV0aHdpdGhwZWVyOiAlZCB1c2VyPSVzIHBhc3N3b3JkPSVzIHM9JWRcbiIsCisgICAgICAgICAgICAgdW5pdCwgdXNlciwgcGFzc3dvcmQsIHUtPnVzX2NsaWVudHN0YXRlKSk7CisKKyAgLyogU2F2ZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHdlJ3JlIGdpdmVuICovCisgIHUtPnVzX3VzZXIgPSB1c2VyOworICB1LT51c191c2VybGVuID0gKGludClzdHJsZW4odXNlcik7CisgIHUtPnVzX3Bhc3N3ZCA9IHBhc3N3b3JkOworICB1LT51c19wYXNzd2RsZW4gPSAoaW50KXN0cmxlbihwYXNzd29yZCk7CisKKyAgdS0+dXNfdHJhbnNtaXRzID0gMDsKKworICAvKiBMb3dlciBsYXllciB1cCB5ZXQ/ICovCisgIGlmICh1LT51c19jbGllbnRzdGF0ZSA9PSBVUEFQQ1NfSU5JVElBTCB8fAorICAgICAgdS0+dXNfY2xpZW50c3RhdGUgPT0gVVBBUENTX1BFTkRJTkcpIHsKKyAgICB1LT51c19jbGllbnRzdGF0ZSA9IFVQQVBDU19QRU5ESU5HOworICAgIHJldHVybjsKKyAgfQorCisgIHVwYXBfc2F1dGhyZXEodSk7ICAgICAgLyogU3RhcnQgcHJvdG9jb2wgKi8KK30KKworCisvKgorICogdXBhcF9hdXRocGVlciAtIEF1dGhlbnRpY2F0ZSBvdXIgcGVlciAoc3RhcnQgc2VydmVyKS4KKyAqCisgKiBTZXQgbmV3IHN0YXRlLgorICovCit2b2lkCit1cGFwX2F1dGhwZWVyKGludCB1bml0KQoreworICB1cGFwX3N0YXRlICp1ID0gJnVwYXBbdW5pdF07CisKKyAgLyogTG93ZXIgbGF5ZXIgdXAgeWV0PyAqLworICBpZiAodS0+dXNfc2VydmVyc3RhdGUgPT0gVVBBUFNTX0lOSVRJQUwgfHwKKyAgICAgIHUtPnVzX3NlcnZlcnN0YXRlID09IFVQQVBTU19QRU5ESU5HKSB7CisgICAgdS0+dXNfc2VydmVyc3RhdGUgPSBVUEFQU1NfUEVORElORzsKKyAgICByZXR1cm47CisgIH0KKworICB1LT51c19zZXJ2ZXJzdGF0ZSA9IFVQQVBTU19MSVNURU47CisgIGlmICh1LT51c19yZXF0aW1lb3V0ID4gMCkgeworICAgIFRJTUVPVVQodXBhcF9yZXF0aW1lb3V0LCB1LCB1LT51c19yZXF0aW1lb3V0KTsKKyAgfQorfQorCisvKgorICogdXBhcF90aW1lb3V0IC0gUmV0cmFuc21pc3Npb24gdGltZXIgZm9yIHNlbmRpbmcgYXV0aC1yZXFzIGV4cGlyZWQuCisgKi8KK3N0YXRpYyB2b2lkCit1cGFwX3RpbWVvdXQodm9pZCAqYXJnKQoreworICB1cGFwX3N0YXRlICp1ID0gKHVwYXBfc3RhdGUgKikgYXJnOworCisgIFVQQVBERUJVRyhMT0dfSU5GTywgKCJ1cGFwX3RpbWVvdXQ6ICVkIHRpbWVvdXQgJWQgZXhwaXJlZCBzPSVkXG4iLCAKKyAgICAgICAgdS0+dXNfdW5pdCwgdS0+dXNfdGltZW91dHRpbWUsIHUtPnVzX2NsaWVudHN0YXRlKSk7CisKKyAgaWYgKHUtPnVzX2NsaWVudHN0YXRlICE9IFVQQVBDU19BVVRIUkVRKSB7CisJVVBBUERFQlVHKExPR19JTkZPLCAoInVwYXBfdGltZW91dDogbm90IGluIEFVVEhSRVEgc3RhdGUhXG4iKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHUtPnVzX3RyYW5zbWl0cyA+PSB1LT51c19tYXh0cmFuc21pdHMpIHsKKyAgICAvKiBnaXZlIHVwIGluIGRpc2d1c3QgKi8KKyAgICBVUEFQREVCVUcoTE9HX0VSUiwgKCJObyByZXNwb25zZSB0byBQQVAgYXV0aGVudGljYXRlLXJlcXVlc3RzXG4iKSk7CisgICAgdS0+dXNfY2xpZW50c3RhdGUgPSBVUEFQQ1NfQkFEQVVUSDsKKyAgICBhdXRoX3dpdGhwZWVyX2ZhaWwodS0+dXNfdW5pdCwgUFBQX1BBUCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdXBhcF9zYXV0aHJlcSh1KTsgICAgLyogU2VuZCBBdXRoZW50aWNhdGUtUmVxdWVzdCBhbmQgc2V0IHVwYXAgdGltZW91dCovCit9CisKKworLyoKKyAqIHVwYXBfcmVxdGltZW91dCAtIEdpdmUgdXAgd2FpdGluZyBmb3IgdGhlIHBlZXIgdG8gc2VuZCBhbiBhdXRoLXJlcS4KKyAqLworc3RhdGljIHZvaWQKK3VwYXBfcmVxdGltZW91dCh2b2lkICphcmcpCit7CisgIHVwYXBfc3RhdGUgKnUgPSAodXBhcF9zdGF0ZSAqKSBhcmc7CisKKyAgaWYgKHUtPnVzX3NlcnZlcnN0YXRlICE9IFVQQVBTU19MSVNURU4pIHsKKyAgICByZXR1cm47IC8qIGh1aD8/ICovCisgIH0KKworICBhdXRoX3BlZXJfZmFpbCh1LT51c191bml0LCBQUFBfUEFQKTsKKyAgdS0+dXNfc2VydmVyc3RhdGUgPSBVUEFQU1NfQkFEQVVUSDsKK30KKworCisvKgorICogdXBhcF9sb3dlcnVwIC0gVGhlIGxvd2VyIGxheWVyIGlzIHVwLgorICoKKyAqIFN0YXJ0IGF1dGhlbnRpY2F0aW5nIGlmIHBlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkCit1cGFwX2xvd2VydXAoaW50IHVuaXQpCit7CisgIHVwYXBfc3RhdGUgKnUgPSAmdXBhcFt1bml0XTsKKworICBVUEFQREVCVUcoTE9HX0lORk8sICgidXBhcF9sb3dlcnVwOiBpbml0ICVkIGNsaWVudHN0YXRlIHM9JWRcbiIsIHVuaXQsIHUtPnVzX2NsaWVudHN0YXRlKSk7CisKKyAgaWYgKHUtPnVzX2NsaWVudHN0YXRlID09IFVQQVBDU19JTklUSUFMKSB7CisgICAgdS0+dXNfY2xpZW50c3RhdGUgPSBVUEFQQ1NfQ0xPU0VEOworICB9IGVsc2UgaWYgKHUtPnVzX2NsaWVudHN0YXRlID09IFVQQVBDU19QRU5ESU5HKSB7CisgICAgdXBhcF9zYXV0aHJlcSh1KTsgIC8qIHNlbmQgYW4gYXV0aC1yZXF1ZXN0ICovCisgICAgLyogbm93IGNsaWVudCBzdGF0ZSBpcyBVUEFQQ1NfX0FVVEhSRVEgKi8KKyAgfQorCisgIGlmICh1LT51c19zZXJ2ZXJzdGF0ZSA9PSBVUEFQU1NfSU5JVElBTCkgeworICAgIHUtPnVzX3NlcnZlcnN0YXRlID0gVVBBUFNTX0NMT1NFRDsKKyAgfSBlbHNlIGlmICh1LT51c19zZXJ2ZXJzdGF0ZSA9PSBVUEFQU1NfUEVORElORykgeworICAgIHUtPnVzX3NlcnZlcnN0YXRlID0gVVBBUFNTX0xJU1RFTjsKKyAgICBpZiAodS0+dXNfcmVxdGltZW91dCA+IDApIHsKKyAgICAgIFRJTUVPVVQodXBhcF9yZXF0aW1lb3V0LCB1LCB1LT51c19yZXF0aW1lb3V0KTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogdXBhcF9sb3dlcmRvd24gLSBUaGUgbG93ZXIgbGF5ZXIgaXMgZG93bi4KKyAqCisgKiBDYW5jZWwgYWxsIHRpbWVvdXRzLgorICovCitzdGF0aWMgdm9pZAordXBhcF9sb3dlcmRvd24oaW50IHVuaXQpCit7CisgIHVwYXBfc3RhdGUgKnUgPSAmdXBhcFt1bml0XTsKKworICBVUEFQREVCVUcoTE9HX0lORk8sICgidXBhcF9sb3dlcmRvd246ICVkIHM9JWRcbiIsIHVuaXQsIHUtPnVzX2NsaWVudHN0YXRlKSk7CisKKyAgaWYgKHUtPnVzX2NsaWVudHN0YXRlID09IFVQQVBDU19BVVRIUkVRKSB7IC8qIFRpbWVvdXQgcGVuZGluZz8gKi8KKyAgICBVTlRJTUVPVVQodXBhcF90aW1lb3V0LCB1KTsgICAgLyogQ2FuY2VsIHRpbWVvdXQgKi8KKyAgfQorICBpZiAodS0+dXNfc2VydmVyc3RhdGUgPT0gVVBBUFNTX0xJU1RFTiAmJiB1LT51c19yZXF0aW1lb3V0ID4gMCkgeworICAgIFVOVElNRU9VVCh1cGFwX3JlcXRpbWVvdXQsIHUpOworICB9CisKKyAgdS0+dXNfY2xpZW50c3RhdGUgPSBVUEFQQ1NfSU5JVElBTDsKKyAgdS0+dXNfc2VydmVyc3RhdGUgPSBVUEFQU1NfSU5JVElBTDsKK30KKworCisvKgorICogdXBhcF9wcm90cmVqIC0gUGVlciBkb2Vzbid0IHNwZWFrIHRoaXMgcHJvdG9jb2wuCisgKgorICogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiAgSW4gYW55IGNhc2UsIHByZXRlbmQgbG93ZXIgbGF5ZXIgd2VudCBkb3duLgorICovCitzdGF0aWMgdm9pZAordXBhcF9wcm90cmVqKGludCB1bml0KQoreworICB1cGFwX3N0YXRlICp1ID0gJnVwYXBbdW5pdF07CisKKyAgaWYgKHUtPnVzX2NsaWVudHN0YXRlID09IFVQQVBDU19BVVRIUkVRKSB7CisgICAgVVBBUERFQlVHKExPR19FUlIsICgiUEFQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBkdWUgdG8gcHJvdG9jb2wtcmVqZWN0XG4iKSk7CisgICAgYXV0aF93aXRocGVlcl9mYWlsKHVuaXQsIFBQUF9QQVApOworICB9CisgIGlmICh1LT51c19zZXJ2ZXJzdGF0ZSA9PSBVUEFQU1NfTElTVEVOKSB7CisgICAgVVBBUERFQlVHKExPR19FUlIsICgiUEFQIGF1dGhlbnRpY2F0aW9uIG9mIHBlZXIgZmFpbGVkIChwcm90b2NvbC1yZWplY3QpXG4iKSk7CisgICAgYXV0aF9wZWVyX2ZhaWwodW5pdCwgUFBQX1BBUCk7CisgIH0KKyAgdXBhcF9sb3dlcmRvd24odW5pdCk7Cit9CisKKworLyoKKyAqIHVwYXBfaW5wdXQgLSBJbnB1dCBVUEFQIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQKK3VwYXBfaW5wdXQoaW50IHVuaXQsIHVfY2hhciAqaW5wYWNrZXQsIGludCBsKQoreworICB1cGFwX3N0YXRlICp1ID0gJnVwYXBbdW5pdF07CisgIHVfY2hhciAqaW5wOworICB1X2NoYXIgY29kZSwgaWQ7CisgIGludCBsZW47CisKKyAgLyoKKyAgICogUGFyc2UgaGVhZGVyIChjb2RlLCBpZCBhbmQgbGVuZ3RoKS4KKyAgICogSWYgcGFja2V0IHRvbyBzaG9ydCwgZHJvcCBpdC4KKyAgICovCisgIGlucCA9IGlucGFja2V0OworICBpZiAobCA8IChpbnQpVVBBUF9IRUFERVJMRU4pIHsKKyAgICBVUEFQREVCVUcoTE9HX0lORk8sICgicGFwX2lucHV0OiByY3ZkIHNob3J0IGhlYWRlci5cbiIpKTsKKyAgICByZXR1cm47CisgIH0KKyAgR0VUQ0hBUihjb2RlLCBpbnApOworICBHRVRDSEFSKGlkLCBpbnApOworICBHRVRTSE9SVChsZW4sIGlucCk7CisgIGlmIChsZW4gPCAoaW50KVVQQVBfSEVBREVSTEVOKSB7CisgICAgVVBBUERFQlVHKExPR19JTkZPLCAoInBhcF9pbnB1dDogcmN2ZCBpbGxlZ2FsIGxlbmd0aC5cbiIpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGxlbiA+IGwpIHsKKyAgICBVUEFQREVCVUcoTE9HX0lORk8sICgicGFwX2lucHV0OiByY3ZkIHNob3J0IHBhY2tldC5cbiIpKTsKKyAgICByZXR1cm47CisgIH0KKyAgbGVuIC09IFVQQVBfSEVBREVSTEVOOworCisgIC8qCisgICAqIEFjdGlvbiBkZXBlbmRzIG9uIGNvZGUuCisgICAqLworICBzd2l0Y2ggKGNvZGUpIHsKKyAgICBjYXNlIFVQQVBfQVVUSFJFUToKKyAgICAgIHVwYXBfcmF1dGhyZXEodSwgaW5wLCBpZCwgbGVuKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBVUEFQX0FVVEhBQ0s6CisgICAgICB1cGFwX3JhdXRoYWNrKHUsIGlucCwgaWQsIGxlbik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVVBBUF9BVVRITkFLOgorICAgICAgdXBhcF9yYXV0aG5hayh1LCBpbnAsIGlkLCBsZW4pOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiAgICAgICAgLyogWFhYIE5lZWQgY29kZSByZWplY3QgKi8KKyAgICAgIFVQQVBERUJVRyhMT0dfSU5GTywgKCJwYXBfaW5wdXQ6IFVOSEFORExFRCBkZWZhdWx0OiBjb2RlOiAlZCwgaWQ6ICVkLCBsZW46ICVkLlxuIiwgY29kZSwgaWQsIGxlbikpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogdXBhcF9yYXV0aCAtIFJlY2VpdmUgQXV0aGVudGljYXRlLgorICovCitzdGF0aWMgdm9pZAordXBhcF9yYXV0aHJlcSh1cGFwX3N0YXRlICp1LCB1X2NoYXIgKmlucCwgdV9jaGFyIGlkLCBpbnQgbGVuKQoreworICB1X2NoYXIgcnVzZXJsZW4sIHJwYXNzd2RsZW47CisgIGNoYXIgKnJ1c2VyLCAqcnBhc3N3ZDsKKyAgdV9jaGFyIHJldGNvZGU7CisgIGNoYXIgKm1zZzsKKyAgaW50IG1zZ2xlbjsKKworICBVUEFQREVCVUcoTE9HX0lORk8sICgicGFwX3JhdXRoOiBSY3ZkIGlkICVkLlxuIiwgaWQpKTsKKworICBpZiAodS0+dXNfc2VydmVyc3RhdGUgPCBVUEFQU1NfTElTVEVOKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyoKKyAgICogSWYgd2UgcmVjZWl2ZSBhIGR1cGxpY2F0ZSBhdXRoZW50aWNhdGUtcmVxdWVzdCwgd2UgYXJlCisgICAqIHN1cHBvc2VkIHRvIHJldHVybiB0aGUgc2FtZSBzdGF0dXMgYXMgZm9yIHRoZSBmaXJzdCByZXF1ZXN0LgorICAgKi8KKyAgaWYgKHUtPnVzX3NlcnZlcnN0YXRlID09IFVQQVBTU19PUEVOKSB7CisgICAgdXBhcF9zcmVzcCh1LCBVUEFQX0FVVEhBQ0ssIGlkLCAiIiwgMCk7ICAvKiByZXR1cm4gYXV0aC1hY2sgKi8KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHUtPnVzX3NlcnZlcnN0YXRlID09IFVQQVBTU19CQURBVVRIKSB7CisgICAgdXBhcF9zcmVzcCh1LCBVUEFQX0FVVEhOQUssIGlkLCAiIiwgMCk7ICAvKiByZXR1cm4gYXV0aC1uYWsgKi8KKyAgICByZXR1cm47CisgIH0KKworICAvKgorICAgKiBQYXJzZSB1c2VyL3Bhc3N3ZC4KKyAgICovCisgIGlmIChsZW4gPCAoaW50KXNpemVvZiAodV9jaGFyKSkgeworICAgIFVQQVBERUJVRyhMT0dfSU5GTywgKCJwYXBfcmF1dGg6IHJjdmQgc2hvcnQgcGFja2V0LlxuIikpOworICAgIHJldHVybjsKKyAgfQorICBHRVRDSEFSKHJ1c2VybGVuLCBpbnApOworICBsZW4gLT0gc2l6ZW9mICh1X2NoYXIpICsgcnVzZXJsZW4gKyBzaXplb2YgKHVfY2hhcik7CisgIGlmIChsZW4gPCAwKSB7CisgICAgVVBBUERFQlVHKExPR19JTkZPLCAoInBhcF9yYXV0aDogcmN2ZCBzaG9ydCBwYWNrZXQuXG4iKSk7CisgICAgcmV0dXJuOworICB9CisgIHJ1c2VyID0gKGNoYXIgKikgaW5wOworICBJTkNQVFIocnVzZXJsZW4sIGlucCk7CisgIEdFVENIQVIocnBhc3N3ZGxlbiwgaW5wKTsKKyAgaWYgKGxlbiA8IHJwYXNzd2RsZW4pIHsKKyAgICBVUEFQREVCVUcoTE9HX0lORk8sICgicGFwX3JhdXRoOiByY3ZkIHNob3J0IHBhY2tldC5cbiIpKTsKKyAgICByZXR1cm47CisgIH0KKyAgcnBhc3N3ZCA9IChjaGFyICopIGlucDsKKworICAvKgorICAgKiBDaGVjayB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGdpdmVuLgorICAgKi8KKyAgcmV0Y29kZSA9IGNoZWNrX3Bhc3N3ZCh1LT51c191bml0LCBydXNlciwgcnVzZXJsZW4sIHJwYXNzd2QsIHJwYXNzd2RsZW4sICZtc2csICZtc2dsZW4pOworICAvKiBsd2lwOiBjdXJyZW50bHkgcmV0Y29kZSBpcyBhbHdheXMgVVBBUF9BVVRIQUNLICovCisgIEJaRVJPKHJwYXNzd2QsIHJwYXNzd2RsZW4pOworCisgIHVwYXBfc3Jlc3AodSwgcmV0Y29kZSwgaWQsIG1zZywgbXNnbGVuKTsKKworICBpZiAocmV0Y29kZSA9PSBVUEFQX0FVVEhBQ0spIHsKKyAgICB1LT51c19zZXJ2ZXJzdGF0ZSA9IFVQQVBTU19PUEVOOworICAgIGF1dGhfcGVlcl9zdWNjZXNzKHUtPnVzX3VuaXQsIFBQUF9QQVAsIHJ1c2VyLCBydXNlcmxlbik7CisgIH0gZWxzZSB7CisgICAgdS0+dXNfc2VydmVyc3RhdGUgPSBVUEFQU1NfQkFEQVVUSDsKKyAgICBhdXRoX3BlZXJfZmFpbCh1LT51c191bml0LCBQUFBfUEFQKTsKKyAgfQorCisgIGlmICh1LT51c19yZXF0aW1lb3V0ID4gMCkgeworICAgIFVOVElNRU9VVCh1cGFwX3JlcXRpbWVvdXQsIHUpOworICB9Cit9CisKKworLyoKKyAqIHVwYXBfcmF1dGhhY2sgLSBSZWNlaXZlIEF1dGhlbnRpY2F0ZS1BY2suCisgKi8KK3N0YXRpYyB2b2lkCit1cGFwX3JhdXRoYWNrKHVwYXBfc3RhdGUgKnUsIHVfY2hhciAqaW5wLCBpbnQgaWQsIGludCBsZW4pCit7CisgIHVfY2hhciBtc2dsZW47CisgIGNoYXIgKm1zZzsKKworICBMV0lQX1VOVVNFRF9BUkcoaWQpOworCisgIFVQQVBERUJVRyhMT0dfSU5GTywgKCJwYXBfcmF1dGhhY2s6IFJjdmQgaWQgJWQgcz0lZFxuIiwgaWQsIHUtPnVzX2NsaWVudHN0YXRlKSk7CisKKyAgaWYgKHUtPnVzX2NsaWVudHN0YXRlICE9IFVQQVBDU19BVVRIUkVRKSB7IC8qIFhYWCAqLworICAgIFVQQVBERUJVRyhMT0dfSU5GTywgKCJwYXBfcmF1dGhhY2s6IHVzX2NsaWVudHN0YXRlICE9IFVQQVBDU19BVVRIUkVRXG4iKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyoKKyAgICogUGFyc2UgbWVzc2FnZS4KKyAgICovCisgIGlmIChsZW4gPCAoaW50KXNpemVvZiAodV9jaGFyKSkgeworICAgIFVQQVBERUJVRyhMT0dfSU5GTywgKCJwYXBfcmF1dGhhY2s6IGlnbm9yaW5nIG1pc3NpbmcgbXNnLWxlbmd0aC5cbiIpKTsKKyAgfSBlbHNlIHsKKyAgICBHRVRDSEFSKG1zZ2xlbiwgaW5wKTsKKyAgICBpZiAobXNnbGVuID4gMCkgeworICAgICAgbGVuIC09IHNpemVvZiAodV9jaGFyKTsKKyAgICAgIGlmIChsZW4gPCBtc2dsZW4pIHsKKyAgICAgICAgVVBBUERFQlVHKExPR19JTkZPLCAoInBhcF9yYXV0aGFjazogcmN2ZCBzaG9ydCBwYWNrZXQuXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG1zZyA9IChjaGFyICopIGlucDsKKyAgICAgIFBSSU5UTVNHKG1zZywgbXNnbGVuKTsKKyAgICB9CisgIH0KKyAgVU5USU1FT1VUKHVwYXBfdGltZW91dCwgdSk7ICAgIC8qIENhbmNlbCB0aW1lb3V0ICovCisgIHUtPnVzX2NsaWVudHN0YXRlID0gVVBBUENTX09QRU47CisKKyAgYXV0aF93aXRocGVlcl9zdWNjZXNzKHUtPnVzX3VuaXQsIFBQUF9QQVApOworfQorCisKKy8qCisgKiB1cGFwX3JhdXRobmFrIC0gUmVjZWl2ZSBBdXRoZW50aWNhdGUtTmFrLgorICovCitzdGF0aWMgdm9pZAordXBhcF9yYXV0aG5hayh1cGFwX3N0YXRlICp1LCB1X2NoYXIgKmlucCwgaW50IGlkLCBpbnQgbGVuKQoreworICB1X2NoYXIgbXNnbGVuOworICBjaGFyICptc2c7CisKKyAgTFdJUF9VTlVTRURfQVJHKGlkKTsKKworICBVUEFQREVCVUcoTE9HX0lORk8sICgicGFwX3JhdXRobmFrOiBSY3ZkIGlkICVkIHM9JWRcbiIsIGlkLCB1LT51c19jbGllbnRzdGF0ZSkpOworCisgIGlmICh1LT51c19jbGllbnRzdGF0ZSAhPSBVUEFQQ1NfQVVUSFJFUSkgeyAvKiBYWFggKi8KKyAgICByZXR1cm47CisgIH0KKworICAvKgorICAgKiBQYXJzZSBtZXNzYWdlLgorICAgKi8KKyAgaWYgKGxlbiA8IHNpemVvZiAodV9jaGFyKSkgeworICAgIFVQQVBERUJVRyhMT0dfSU5GTywgKCJwYXBfcmF1dGhuYWs6IGlnbm9yaW5nIG1pc3NpbmcgbXNnLWxlbmd0aC5cbiIpKTsKKyAgfSBlbHNlIHsKKyAgICBHRVRDSEFSKG1zZ2xlbiwgaW5wKTsKKyAgICBpZihtc2dsZW4gPiAwKSB7CisgICAgICBsZW4gLT0gc2l6ZW9mICh1X2NoYXIpOworICAgICAgaWYgKGxlbiA8IG1zZ2xlbikgeworICAgICAgICBVUEFQREVCVUcoTE9HX0lORk8sICgicGFwX3JhdXRobmFrOiByY3ZkIHNob3J0IHBhY2tldC5cbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbXNnID0gKGNoYXIgKikgaW5wOworICAgICAgUFJJTlRNU0cobXNnLCBtc2dsZW4pOworICAgIH0KKyAgfQorCisgIHUtPnVzX2NsaWVudHN0YXRlID0gVVBBUENTX0JBREFVVEg7CisKKyAgVVBBUERFQlVHKExPR19FUlIsICgiUEFQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZFxuIikpOworICBhdXRoX3dpdGhwZWVyX2ZhaWwodS0+dXNfdW5pdCwgUFBQX1BBUCk7Cit9CisKKworLyoKKyAqIHVwYXBfc2F1dGhyZXEgLSBTZW5kIGFuIEF1dGhlbnRpY2F0ZS1SZXF1ZXN0LgorICovCitzdGF0aWMgdm9pZAordXBhcF9zYXV0aHJlcSh1cGFwX3N0YXRlICp1KQoreworICB1X2NoYXIgKm91dHA7CisgIGludCBvdXRsZW47CisKKyAgb3V0bGVuID0gVVBBUF9IRUFERVJMRU4gKyAyICogc2l6ZW9mICh1X2NoYXIpIAorICAgICAgICAgKyB1LT51c191c2VybGVuICsgdS0+dXNfcGFzc3dkbGVuOworICBvdXRwID0gb3V0cGFja2V0X2J1Zlt1LT51c191bml0XTsKKworICBNQUtFSEVBREVSKG91dHAsIFBQUF9QQVApOworCisgIFBVVENIQVIoVVBBUF9BVVRIUkVRLCBvdXRwKTsKKyAgUFVUQ0hBUigrK3UtPnVzX2lkLCBvdXRwKTsKKyAgUFVUU0hPUlQob3V0bGVuLCBvdXRwKTsKKyAgUFVUQ0hBUih1LT51c191c2VybGVuLCBvdXRwKTsKKyAgQkNPUFkodS0+dXNfdXNlciwgb3V0cCwgdS0+dXNfdXNlcmxlbik7CisgIElOQ1BUUih1LT51c191c2VybGVuLCBvdXRwKTsKKyAgUFVUQ0hBUih1LT51c19wYXNzd2RsZW4sIG91dHApOworICBCQ09QWSh1LT51c19wYXNzd2QsIG91dHAsIHUtPnVzX3Bhc3N3ZGxlbik7CisKKyAgcHBwV3JpdGUodS0+dXNfdW5pdCwgb3V0cGFja2V0X2J1Zlt1LT51c191bml0XSwgb3V0bGVuICsgUFBQX0hEUkxFTik7CisKKyAgVVBBUERFQlVHKExPR19JTkZPLCAoInBhcF9zYXV0aDogU2VudCBpZCAlZFxuIiwgdS0+dXNfaWQpKTsKKworICBUSU1FT1VUKHVwYXBfdGltZW91dCwgdSwgdS0+dXNfdGltZW91dHRpbWUpOworICArK3UtPnVzX3RyYW5zbWl0czsKKyAgdS0+dXNfY2xpZW50c3RhdGUgPSBVUEFQQ1NfQVVUSFJFUTsKK30KKworCisvKgorICogdXBhcF9zcmVzcCAtIFNlbmQgYSByZXNwb25zZSAoYWNrIG9yIG5haykuCisgKi8KK3N0YXRpYyB2b2lkCit1cGFwX3NyZXNwKHVwYXBfc3RhdGUgKnUsIHVfY2hhciBjb2RlLCB1X2NoYXIgaWQsIGNoYXIgKm1zZywgaW50IG1zZ2xlbikKK3sKKyAgdV9jaGFyICpvdXRwOworICBpbnQgb3V0bGVuOworCisgIG91dGxlbiA9IFVQQVBfSEVBREVSTEVOICsgc2l6ZW9mICh1X2NoYXIpICsgbXNnbGVuOworICBvdXRwID0gb3V0cGFja2V0X2J1Zlt1LT51c191bml0XTsKKyAgTUFLRUhFQURFUihvdXRwLCBQUFBfUEFQKTsKKworICBQVVRDSEFSKGNvZGUsIG91dHApOworICBQVVRDSEFSKGlkLCBvdXRwKTsKKyAgUFVUU0hPUlQob3V0bGVuLCBvdXRwKTsKKyAgUFVUQ0hBUihtc2dsZW4sIG91dHApOworICBCQ09QWShtc2csIG91dHAsIG1zZ2xlbik7CisgIHBwcFdyaXRlKHUtPnVzX3VuaXQsIG91dHBhY2tldF9idWZbdS0+dXNfdW5pdF0sIG91dGxlbiArIFBQUF9IRFJMRU4pOworCisgIFVQQVBERUJVRyhMT0dfSU5GTywgKCJwYXBfc3Jlc3A6IFNlbnQgY29kZSAlZCwgaWQgJWQgcz0lZFxuIiwgY29kZSwgaWQsIHUtPnVzX2NsaWVudHN0YXRlKSk7Cit9CisKKyNpZiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MKK3N0YXRpYyBjaGFyICp1cGFwX2NvZGVuYW1lc1tdID0geworICAgICJBdXRoUmVxIiwgIkF1dGhBY2siLCAiQXV0aE5hayIKK307CisKKy8qCisgKiB1cGFwX3ByaW50cGt0IC0gcHJpbnQgdGhlIGNvbnRlbnRzIG9mIGEgUEFQIHBhY2tldC4KKyAqLworc3RhdGljIGludCB1cGFwX3ByaW50cGt0KAorICB1X2NoYXIgKnAsCisgIGludCBwbGVuLAorICB2b2lkICgqcHJpbnRlcikgKHZvaWQgKiwgY2hhciAqLCAuLi4pLAorICB2b2lkICphcmcKKykKK3sKKyAgTFdJUF9VTlVTRURfQVJHKHApOworICBMV0lQX1VOVVNFRF9BUkcocGxlbik7CisgIExXSVBfVU5VU0VEX0FSRyhwcmludGVyKTsKKyAgTFdJUF9VTlVTRURfQVJHKGFyZyk7CisgIHJldHVybiAwOworfQorI2VuZGlmIC8qIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUyAqLworCisjZW5kaWYgLyogUEFQX1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIFBQUF9TVVBQT1JUICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9wYXAuaCBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL3BhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWEyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9wYXAuaApAQCAtMCwwICsxLDExOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBhcC5oIC0gIFBQUCBQYXNzd29yZCBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCBoZWFkZXIgZmlsZS4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IE1hcmMgQm91Y2hlciwgU2VydmljZXMgSW5mb3JtYXRpcXVlcyAoTUJTSSkgaW5jLgorKiBwb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTcgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKgorKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKKyogYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAorKiB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMKKyogbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXJlIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSAKKyogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkCisqIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTICpBUyBJUyogQU5EIEFOWSBFWFBSRVNTIE9SCisqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUkVWSVNJT04gSElTVE9SWQorKgorKiAwMy0wMS0wMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyogICBQb3J0ZWQgdG8gbHdJUC4KKyogOTctMTItMDQgR3V5IExhbmNhc3RlciA8Z2xhbmNhQGdlc24uY29tPiwgR2xvYmFsIEVsZWN0aW9uIFN5c3RlbXMgSW5jLgorKiAgIE9yaWdpbmFsIGRlcml2ZWQgZnJvbSBCU0QgY29kZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB1cGFwLmggLSBVc2VyL1Bhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgUEFQX0gKKyNkZWZpbmUgUEFQX0gKKworI2lmIFBBUF9TVVBQT1JUIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisvKgorICogUGFja2V0IGhlYWRlciA9IENvZGUsIGlkLCBsZW5ndGguCisgKi8KKyNkZWZpbmUgVVBBUF9IRUFERVJMRU4gKHNpemVvZiAodV9jaGFyKSArIHNpemVvZiAodV9jaGFyKSArIHNpemVvZiAodV9zaG9ydCkpCisKKworLyoKKyAqIFVQQVAgY29kZXMuCisgKi8KKyNkZWZpbmUgVVBBUF9BVVRIUkVRIDEgLyogQXV0aGVudGljYXRlLVJlcXVlc3QgKi8KKyNkZWZpbmUgVVBBUF9BVVRIQUNLIDIgLyogQXV0aGVudGljYXRlLUFjayAqLworI2RlZmluZSBVUEFQX0FVVEhOQUsgMyAvKiBBdXRoZW50aWNhdGUtTmFrICovCisKKy8qCisgKiBFYWNoIGludGVyZmFjZSBpcyBkZXNjcmliZWQgYnkgdXBhcCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHVwYXBfc3RhdGUgeworICBpbnQgdXNfdW5pdDsgICAgICAgICAgIC8qIEludGVyZmFjZSB1bml0IG51bWJlciAqLworICBjb25zdCBjaGFyICp1c191c2VyOyAgIC8qIFVzZXIgKi8KKyAgaW50IHVzX3VzZXJsZW47ICAgICAgICAvKiBVc2VyIGxlbmd0aCAqLworICBjb25zdCBjaGFyICp1c19wYXNzd2Q7IC8qIFBhc3N3b3JkICovCisgIGludCB1c19wYXNzd2RsZW47ICAgICAgLyogUGFzc3dvcmQgbGVuZ3RoICovCisgIGludCB1c19jbGllbnRzdGF0ZTsgICAgLyogQ2xpZW50IHN0YXRlICovCisgIGludCB1c19zZXJ2ZXJzdGF0ZTsgICAgLyogU2VydmVyIHN0YXRlICovCisgIHVfY2hhciB1c19pZDsgICAgICAgICAgLyogQ3VycmVudCBpZCAqLworICBpbnQgdXNfdGltZW91dHRpbWU7ICAgIC8qIFRpbWVvdXQgKHNlY29uZHMpIGZvciBhdXRoLXJlcSByZXRyYW5zLiAqLworICBpbnQgdXNfdHJhbnNtaXRzOyAgICAgIC8qIE51bWJlciBvZiBhdXRoLXJlcXMgc2VudCAqLworICBpbnQgdXNfbWF4dHJhbnNtaXRzOyAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGF1dGgtcmVxcyB0byBzZW5kICovCisgIGludCB1c19yZXF0aW1lb3V0OyAgICAgLyogVGltZSB0byB3YWl0IGZvciBhdXRoLXJlcSBmcm9tIHBlZXIgKi8KK30gdXBhcF9zdGF0ZTsKKworLyoKKyAqIENsaWVudCBzdGF0ZXMuCisgKi8KKyNkZWZpbmUgVVBBUENTX0lOSVRJQUwgMCAvKiBDb25uZWN0aW9uIGRvd24gKi8KKyNkZWZpbmUgVVBBUENTX0NMT1NFRCAgMSAvKiBDb25uZWN0aW9uIHVwLCBoYXZlbid0IHJlcXVlc3RlZCBhdXRoICovCisjZGVmaW5lIFVQQVBDU19QRU5ESU5HIDIgLyogQ29ubmVjdGlvbiBkb3duLCBoYXZlIHJlcXVlc3RlZCBhdXRoICovCisjZGVmaW5lIFVQQVBDU19BVVRIUkVRIDMgLyogV2UndmUgc2VudCBhbiBBdXRoZW50aWNhdGUtUmVxdWVzdCAqLworI2RlZmluZSBVUEFQQ1NfT1BFTiAgICA0IC8qIFdlJ3ZlIHJlY2VpdmVkIGFuIEFjayAqLworI2RlZmluZSBVUEFQQ1NfQkFEQVVUSCA1IC8qIFdlJ3ZlIHJlY2VpdmVkIGEgTmFrICovCisKKy8qCisgKiBTZXJ2ZXIgc3RhdGVzLgorICovCisjZGVmaW5lIFVQQVBTU19JTklUSUFMIDAgLyogQ29ubmVjdGlvbiBkb3duICovCisjZGVmaW5lIFVQQVBTU19DTE9TRUQgIDEgLyogQ29ubmVjdGlvbiB1cCwgaGF2ZW4ndCByZXF1ZXN0ZWQgYXV0aCAqLworI2RlZmluZSBVUEFQU1NfUEVORElORyAyIC8qIENvbm5lY3Rpb24gZG93biwgaGF2ZSByZXF1ZXN0ZWQgYXV0aCAqLworI2RlZmluZSBVUEFQU1NfTElTVEVOICAzIC8qIExpc3RlbmluZyBmb3IgYW4gQXV0aGVudGljYXRlICovCisjZGVmaW5lIFVQQVBTU19PUEVOICAgIDQgLyogV2UndmUgc2VudCBhbiBBY2sgKi8KKyNkZWZpbmUgVVBBUFNTX0JBREFVVEggNSAvKiBXZSd2ZSBzZW50IGEgTmFrICovCisKKworZXh0ZXJuIHVwYXBfc3RhdGUgdXBhcFtdOworCit2b2lkIHVwYXBfYXV0aHdpdGhwZWVyICAoaW50LCBjaGFyICosIGNoYXIgKik7Cit2b2lkIHVwYXBfYXV0aHBlZXIgICAgICAoaW50KTsKKworZXh0ZXJuIHN0cnVjdCBwcm90ZW50IHBhcF9wcm90ZW50OworCisjZW5kaWYgLyogUEFQX1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIFBBUF9IICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9wcHAuYyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL3BwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjQzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9wcHAuYwpAQCAtMCwwICsxLDIwMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwcHAuYyAtIE5ldHdvcmsgUG9pbnQgdG8gUG9pbnQgUHJvdG9jb2wgcHJvZ3JhbSBmaWxlLgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgTWFyYyBCb3VjaGVyLCBTZXJ2aWNlcyBJbmZvcm1hdGlxdWVzIChNQlNJKSBpbmMuCisqIHBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NyBieSBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqCisqIFRoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLAorKiBhbmQgbGljZW5zZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkCisqIHRoYXQgZXhpc3RpbmcgY29weXJpZ2h0IG5vdGljZXMgYXJlIHJldGFpbmVkIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcworKiBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBhcmUgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55IAorKiBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwgbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMgcmVxdWlyZWQKKyogZm9yIGFueSBvZiB0aGUgYXV0aG9yaXplZCB1c2VzLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT05UUklCVVRPUlMgKkFTIElTKiBBTkQgQU5ZIEVYUFJFU1MgT1IKKyogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAKKyogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSRVZJU0lPTiBISVNUT1JZCisqCisqIDAzLTAxLTAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorKiAgIFBvcnRlZCB0byBsd0lQLgorKiA5Ny0xMS0wNSBHdXkgTGFuY2FzdGVyIDxsYW5jYXN0ZXJnQGFjbS5vcmc+LCBHbG9iYWwgRWxlY3Rpb24gU3lzdGVtcyBJbmMuCisqICAgT3JpZ2luYWwuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIHBwcF9kZWZzLmggLSBQUFAgZGVmaW5pdGlvbnMuCisgKgorICogaWZfcHBwdmFyLmggLSBwcml2YXRlIHN0cnVjdHVyZXMgYW5kIGRlY2xhcmF0aW9ucyBmb3IgUFBQLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5LCBleHByZXNzIG9yIGltcGxpZWQuIFRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkKKyAqIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgQkUgTElBQkxFIFRPIEFOWQorICogUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwgRVZFTiBJRgorICogVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBIQVZFIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUworICogT04gQU4gIkFTIElTIiBCQVNJUywgQU5EIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgSEFTIE5PCisgKiBPQkxJR0FUSU9OIFRPIFBST1ZJREUgTUFJTlRFTkFOQ0UsIFNVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywKKyAqIE9SIE1PRElGSUNBVElPTlMuCisgKi8KKworLyoKKyAqIGlmX3BwcC5oIC0gUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBQUFBfU1VQUE9SVCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvaXAuaCIgLyogZm9yIGlwX2lucHV0KCkgKi8KKworI2luY2x1ZGUgInBwcC5oIgorI2luY2x1ZGUgInBwcGRlYnVnLmgiCisKKyNpbmNsdWRlICJyYW5kbS5oIgorI2luY2x1ZGUgImZzbS5oIgorI2lmIFBBUF9TVVBQT1JUCisjaW5jbHVkZSAicGFwLmgiCisjZW5kaWYgLyogUEFQX1NVUFBPUlQgKi8KKyNpZiBDSEFQX1NVUFBPUlQKKyNpbmNsdWRlICJjaGFwLmgiCisjZW5kaWYgLyogQ0hBUF9TVVBQT1JUICovCisjaW5jbHVkZSAiaXBjcC5oIgorI2luY2x1ZGUgImxjcC5oIgorI2luY2x1ZGUgIm1hZ2ljLmgiCisjaW5jbHVkZSAiYXV0aC5oIgorI2lmIFZKX1NVUFBPUlQKKyNpbmNsdWRlICJ2ai5oIgorI2VuZGlmIC8qIFZKX1NVUFBPUlQgKi8KKyNpZiBQUFBPRV9TVVBQT1JUCisjaW5jbHVkZSAibmV0aWYvcHBwX29lLmgiCisjZW5kaWYgLyogUFBQT0VfU1VQUE9SVCAqLworCisjaW5jbHVkZSAibHdpcC90Y3BpcC5oIgorI2luY2x1ZGUgImx3aXAvYXBpLmgiCisjaW5jbHVkZSAibHdpcC9zbm1wLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqIExPQ0FMIERFRklOSVRJT05TICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogUFBQX0lOUFJPQ19NVUxUSVRIUkVBREVEPT0xIGNhbGwgcHBwSW5wdXQgdXNpbmcgdGNwaXBfY2FsbGJhY2soKS4KKyAqIFNldCB0aGlzIHRvIDAgaWYgcHBwSW5Qcm9jIGlzIGNhbGxlZCBpbnNpZGUgdGNwaXBfdGhyZWFkIG9yIHdpdGggTk9fU1lTPT0xLgorICogRGVmYXVsdCBpcyAxIGZvciBOT19TWVM9PTAgKG11bHRpdGhyZWFkZWQpIGFuZCAwIGZvciBOT19TWVM9PTEgKHNpbmdsZS10aHJlYWRlZCkuCisgKi8KKyNpZm5kZWYgUFBQX0lOUFJPQ19NVUxUSVRIUkVBREVECisjZGVmaW5lIFBQUF9JTlBST0NfTVVMVElUSFJFQURFRCAoTk9fU1lTPT0wKQorI2VuZGlmCisKKy8qKiBQUFBfSU5QUk9DX09XTlRIUkVBRD09MTogc3RhcnQgYSBkZWRpY2F0ZWQgUlggdGhyZWFkIHBlciBQUFAgc2Vzc2lvbi4KKyAqIERlZmF1bHQgaXMgMDogY2FsbCBwcHBvc19pbnB1dCgpIGZvciByZWNlaXZlZCByYXcgY2hhcmFjdGVycywgY2hhcmNhdGVyCisgKiByZWNlcHRpb24gaXMgdXAgdG8gdGhlIHBvcnQgKi8KKyNpZm5kZWYgUFBQX0lOUFJPQ19PV05USFJFQUQKKyNkZWZpbmUgUFBQX0lOUFJPQ19PV05USFJFQUQgICAgICBQUFBfSU5QUk9DX01VTFRJVEhSRUFERUQKKyNlbmRpZgorCisjaWYgUFBQX0lOUFJPQ19PV05USFJFQUQgJiYgIVBQUF9JTlBST0NfTVVMVElUSFJFQURFRAorICAjZXJyb3IgIlBQUF9JTlBST0NfT1dOVEhSRUFEIG5lZWRzIFBQUF9JTlBST0NfTVVMVElUSFJFQURFRD09MSIKKyNlbmRpZgorCisvKgorICogVGhlIGJhc2ljIFBQUCBmcmFtZS4KKyAqLworI2RlZmluZSBQUFBfQUREUkVTUyhwKSAgKCgodV9jaGFyICopKHApKVswXSkKKyNkZWZpbmUgUFBQX0NPTlRST0wocCkgICgoKHVfY2hhciAqKShwKSlbMV0pCisjZGVmaW5lIFBQUF9QUk9UT0NPTChwKSAoKCgodV9jaGFyICopKHApKVsyXSA8PCA4KSArICgodV9jaGFyICopKHApKVszXSkKKworLyogUFBQIHBhY2tldCBwYXJzZXIgc3RhdGVzLiAgQ3VycmVudCBzdGF0ZSBpbmRpY2F0ZXMgb3BlcmF0aW9uIHlldCB0byBiZQorICogY29tcGxldGVkLiAqLwordHlwZWRlZiBlbnVtIHsKKyAgUERJRExFID0gMCwgIC8qIElkbGUgc3RhdGUgLSB3YWl0aW5nLiAqLworICBQRFNUQVJULCAgICAgLyogUHJvY2VzcyBzdGFydCBmbGFnLiAqLworICBQREFERFJFU1MsICAgLyogUHJvY2VzcyBhZGRyZXNzIGZpZWxkLiAqLworICBQRENPTlRST0wsICAgLyogUHJvY2VzcyBjb250cm9sIGZpZWxkLiAqLworICBQRFBST1RPQ09MMSwgLyogUHJvY2VzcyBwcm90b2NvbCBmaWVsZCAxLiAqLworICBQRFBST1RPQ09MMiwgLyogUHJvY2VzcyBwcm90b2NvbCBmaWVsZCAyLiAqLworICBQRERBVEEgICAgICAgLyogUHJvY2VzcyBkYXRhIGJ5dGUuICovCit9IFBQUERldlN0YXRlczsKKworI2RlZmluZSBFU0NBUEVfUChhY2NtLCBjKSAoKGFjY20pWyhjKSA+PiAzXSAmIHBwcEFDQ01NYXNrW2MgJiAweDA3XSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogTE9DQUwgREFUQSBUWVBFUyAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogUlggYnVmZmVyIHNpemU6IHRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgc21hbGxlciEgKi8KKyNpZm5kZWYgUFBQT1NfUlhfQlVGU0laRQorI2RlZmluZSBQUFBPU19SWF9CVUZTSVpFICAgIChQUFBfTVJVICsgUFBQX0hEUkxFTikKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBQUFBDb250cm9sUnhfcyB7CisgIC8qKiB1bml0IG51bWJlciAvIHBwcCBkZXNjcmlwdG9yICovCisgIGludCBwZDsKKyAgLyoqIHRoZSByeCBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgc2lvX2ZkX3QgZmQ7CisgIC8qKiByZWNlaXZlIGJ1ZmZlciAtIGVuY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZSAqLworICB1X2NoYXIgcnhidWZbUFBQT1NfUlhfQlVGU0laRV07CisKKyAgLyogVGhlIGlucHV0IHBhY2tldC4gKi8KKyAgc3RydWN0IHBidWYgKmluSGVhZCwgKmluVGFpbDsKKworI2lmIFBQUE9TX1NVUFBPUlQKKyAgdTE2X3QgaW5Qcm90b2NvbDsgICAgICAgICAgICAgLyogVGhlIGlucHV0IHByb3RvY29sIGNvZGUuICovCisgIHUxNl90IGluRkNTOyAgICAgICAgICAgICAgICAgIC8qIElucHV0IEZyYW1lIENoZWNrIFNlcXVlbmNlIHZhbHVlLiAqLworI2VuZGlmIC8qIFBQUE9TX1NVUFBPUlQgKi8KKyAgUFBQRGV2U3RhdGVzIGluU3RhdGU7ICAgICAgICAgLyogVGhlIGlucHV0IHByb2Nlc3Mgc3RhdGUuICovCisgIGNoYXIgaW5Fc2NhcGVkOyAgICAgICAgICAgICAgIC8qIEVzY2FwZSBuZXh0IGNoYXJhY3Rlci4gKi8KKyAgZXh0X2FjY20gaW5BQ0NNOyAgICAgICAgICAgICAgLyogQXN5bmMtQ3RsLUNoYXItTWFwIGZvciBpbnB1dC4gKi8KK30gUFBQQ29udHJvbFJ4OworCisvKgorICogUFBQIGludGVyZmFjZSBjb250cm9sIGJsb2NrLgorICovCit0eXBlZGVmIHN0cnVjdCBQUFBDb250cm9sX3MgeworICBQUFBDb250cm9sUnggcng7CisgIGNoYXIgb3BlbkZsYWc7ICAgICAgICAgICAgICAgIC8qIFRydWUgd2hlbiBpbiB1c2UuICovCisjaWYgUFBQT0VfU1VQUE9SVAorICBzdHJ1Y3QgbmV0aWYgKmV0aGlmOworICBzdHJ1Y3QgcHBwb2Vfc29mdGMgKnBwcG9lX3NjOworI2VuZGlmIC8qIFBQUE9FX1NVUFBPUlQgKi8KKyAgaW50ICBpZl91cDsgICAgICAgICAgICAgICAgICAgLyogVHJ1ZSB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgdXAuICovCisgIGludCAgZXJyQ29kZTsgICAgICAgICAgICAgICAgIC8qIENvZGUgaW5kaWNhdGluZyB3aHkgaW50ZXJmYWNlIGlzIGRvd24uICovCisjaWYgUFBQT1NfU1VQUE9SVAorICBzaW9fZmRfdCBmZDsgICAgICAgICAgICAgICAgICAvKiBGaWxlIGRldmljZSBJRCBvZiBwb3J0LiAqLworI2VuZGlmIC8qIFBQUE9TX1NVUFBPUlQgKi8KKyAgdTE2X3QgbXR1OyAgICAgICAgICAgICAgICAgICAgLyogUGVlcidzIG1ydSAqLworICBpbnQgIHBjb21wOyAgICAgICAgICAgICAgICAgICAvKiBEb2VzIHBlZXIgYWNjZXB0IHByb3RvY29sIGNvbXByZXNzaW9uPyAqLworICBpbnQgIGFjY29tcDsgICAgICAgICAgICAgICAgICAvKiBEb2VzIHBlZXIgYWNjZXB0IGFkZHIvY3RsIGNvbXByZXNzaW9uPyAqLworICB1X2xvbmcgbGFzdFhNaXQ7ICAgICAgICAgICAgICAvKiBUaW1lIG9mIGxhc3QgdHJhbnNtaXNzaW9uLiAqLworICBleHRfYWNjbSBvdXRBQ0NNOyAgICAgICAgICAgICAvKiBBc3luYy1DdGwtQ2hhci1NYXAgZm9yIG91dHB1dC4gKi8KKyNpZiBQUFBPU19TVVBQT1JUICYmIFZKX1NVUFBPUlQKKyAgaW50ICB2akVuYWJsZWQ7ICAgICAgICAgICAgICAgLyogRmxhZyBpbmRpY2F0aW5nIFZKIGNvbXByZXNzaW9uIGVuYWJsZWQuICovCisgIHN0cnVjdCB2amNvbXByZXNzIHZqQ29tcDsgICAgIC8qIFZhbiBKYWNvYnNvbiBjb21wcmVzc2lvbiBoZWFkZXIuICovCisjZW5kaWYgLyogUFBQT1NfU1VQUE9SVCAmJiBWSl9TVVBQT1JUICovCisKKyAgc3RydWN0IG5ldGlmIG5ldGlmOworCisgIHN0cnVjdCBwcHBfYWRkcnMgYWRkcnM7CisKKyAgdm9pZCAoKmxpbmtTdGF0dXNDQikodm9pZCAqY3R4LCBpbnQgZXJyQ29kZSwgdm9pZCAqYXJnKTsKKyAgdm9pZCAqbGlua1N0YXR1c0N0eDsKKworfSBQUFBDb250cm9sOworCisKKy8qCisgKiBJb2N0bCBkZWZpbml0aW9ucy4KKyAqLworCitzdHJ1Y3QgbnBpb2N0bCB7CisgIGludCAgICAgICAgIHByb3RvY29sOyAvKiBQUFAgcHJvY290b2wsIGUuZy4gUFBQX0lQICovCisgIGVudW0gTlBtb2RlIG1vZGU7Cit9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiBMT0NBTCBGVU5DVElPTiBERUNMQVJBVElPTlMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIFBQUE9TX1NVUFBPUlQKKyNpZiBQUFBfSU5QUk9DX09XTlRIUkVBRAorc3RhdGljIHZvaWQgcHBwSW5wdXRUaHJlYWQodm9pZCAqYXJnKTsKKyNlbmRpZiAvKiBQUFBfSU5QUk9DX09XTlRIUkVBRCAqLworc3RhdGljIHZvaWQgcHBwRHJvcChQUFBDb250cm9sUnggKnBjcngpOworc3RhdGljIHZvaWQgcHBwSW5Qcm9jKFBQUENvbnRyb2xSeCAqcGNyeCwgdV9jaGFyICpzLCBpbnQgbCk7CisjZW5kaWYgLyogUFBQT1NfU1VQUE9SVCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqIFBVQkxJQyBEQVRBIFNUUlVDVFVSRVMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VfbG9uZyBzdWJuZXRNYXNrOworCitzdGF0aWMgUFBQQ29udHJvbCBwcHBDb250cm9sW05VTV9QUFBdOyAvKiBUaGUgUFBQIGludGVyZmFjZSBjb250cm9sIGJsb2Nrcy4gKi8KKworLyoKKyAqIFBQUCBEYXRhIExpbmsgTGF5ZXIgInByb3RvY29sIiB0YWJsZS4KKyAqIE9uZSBlbnRyeSBwZXIgc3VwcG9ydGVkIHByb3RvY29sLgorICogVGhlIGxhc3QgZW50cnkgbXVzdCBiZSBOVUxMLgorICovCitzdHJ1Y3QgcHJvdGVudCAqcHBwX3Byb3RvY29sc1tdID0geworICAmbGNwX3Byb3RlbnQsCisjaWYgUEFQX1NVUFBPUlQKKyAgJnBhcF9wcm90ZW50LAorI2VuZGlmIC8qIFBBUF9TVVBQT1JUICovCisjaWYgQ0hBUF9TVVBQT1JUCisgICZjaGFwX3Byb3RlbnQsCisjZW5kaWYgLyogQ0hBUF9TVVBQT1JUICovCisjaWYgQ0JDUF9TVVBQT1JUCisgICZjYmNwX3Byb3RlbnQsCisjZW5kaWYgLyogQ0JDUF9TVVBQT1JUICovCisgICZpcGNwX3Byb3RlbnQsCisjaWYgQ0NQX1NVUFBPUlQKKyAgJmNjcF9wcm90ZW50LAorI2VuZGlmIC8qIENDUF9TVVBQT1JUICovCisgIE5VTEwKK307CisKKworLyoKKyAqIEJ1ZmZlcnMgZm9yIG91dGdvaW5nIHBhY2tldHMuICBUaGlzIG11c3QgYmUgYWNjZXNzZWQgb25seSBmcm9tIHRoZSBhcHByb3ByaWF0ZQorICogUFBQIHRhc2sgc28gdGhhdCBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgcHJvdGVjdGVkIHRvIGF2b2lkIGNvbGxpc2lvbnMuCisgKi8KK3VfY2hhciBvdXRwYWNrZXRfYnVmW05VTV9QUFBdW1BQUF9NUlUrUFBQX0hEUkxFTl07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiBMT0NBTCBEQVRBIFNUUlVDVFVSRVMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgUFBQT1NfU1VQUE9SVAorLyoKKyAqIEZDUyBsb29rdXAgdGFibGUgYXMgY2FsY3VsYXRlZCBieSBnZW5mY3N0YWIuCisgKiBAdG9kbzogc21hbGxlciwgc2xvd2VyIGltcGxlbWVudGF0aW9uIGZvciBsb3dlciBtZW1vcnkgZm9vdHByaW50PworICovCitzdGF0aWMgY29uc3QgdV9zaG9ydCBmY3N0YWJbMjU2XSA9IHsKKyAgMHgwMDAwLCAweDExODksIDB4MjMxMiwgMHgzMjliLCAweDQ2MjQsIDB4NTdhZCwgMHg2NTM2LCAweDc0YmYsCisgIDB4OGM0OCwgMHg5ZGMxLCAweGFmNWEsIDB4YmVkMywgMHhjYTZjLCAweGRiZTUsIDB4ZTk3ZSwgMHhmOGY3LAorICAweDEwODEsIDB4MDEwOCwgMHgzMzkzLCAweDIyMWEsIDB4NTZhNSwgMHg0NzJjLCAweDc1YjcsIDB4NjQzZSwKKyAgMHg5Y2M5LCAweDhkNDAsIDB4YmZkYiwgMHhhZTUyLCAweGRhZWQsIDB4Y2I2NCwgMHhmOWZmLCAweGU4NzYsCisgIDB4MjEwMiwgMHgzMDhiLCAweDAyMTAsIDB4MTM5OSwgMHg2NzI2LCAweDc2YWYsIDB4NDQzNCwgMHg1NWJkLAorICAweGFkNGEsIDB4YmNjMywgMHg4ZTU4LCAweDlmZDEsIDB4ZWI2ZSwgMHhmYWU3LCAweGM4N2MsIDB4ZDlmNSwKKyAgMHgzMTgzLCAweDIwMGEsIDB4MTI5MSwgMHgwMzE4LCAweDc3YTcsIDB4NjYyZSwgMHg1NGI1LCAweDQ1M2MsCisgIDB4YmRjYiwgMHhhYzQyLCAweDllZDksIDB4OGY1MCwgMHhmYmVmLCAweGVhNjYsIDB4ZDhmZCwgMHhjOTc0LAorICAweDQyMDQsIDB4NTM4ZCwgMHg2MTE2LCAweDcwOWYsIDB4MDQyMCwgMHgxNWE5LCAweDI3MzIsIDB4MzZiYiwKKyAgMHhjZTRjLCAweGRmYzUsIDB4ZWQ1ZSwgMHhmY2Q3LCAweDg4NjgsIDB4OTllMSwgMHhhYjdhLCAweGJhZjMsCisgIDB4NTI4NSwgMHg0MzBjLCAweDcxOTcsIDB4NjAxZSwgMHgxNGExLCAweDA1MjgsIDB4MzdiMywgMHgyNjNhLAorICAweGRlY2QsIDB4Y2Y0NCwgMHhmZGRmLCAweGVjNTYsIDB4OThlOSwgMHg4OTYwLCAweGJiZmIsIDB4YWE3MiwKKyAgMHg2MzA2LCAweDcyOGYsIDB4NDAxNCwgMHg1MTlkLCAweDI1MjIsIDB4MzRhYiwgMHgwNjMwLCAweDE3YjksCisgIDB4ZWY0ZSwgMHhmZWM3LCAweGNjNWMsIDB4ZGRkNSwgMHhhOTZhLCAweGI4ZTMsIDB4OGE3OCwgMHg5YmYxLAorICAweDczODcsIDB4NjIwZSwgMHg1MDk1LCAweDQxMWMsIDB4MzVhMywgMHgyNDJhLCAweDE2YjEsIDB4MDczOCwKKyAgMHhmZmNmLCAweGVlNDYsIDB4ZGNkZCwgMHhjZDU0LCAweGI5ZWIsIDB4YTg2MiwgMHg5YWY5LCAweDhiNzAsCisgIDB4ODQwOCwgMHg5NTgxLCAweGE3MWEsIDB4YjY5MywgMHhjMjJjLCAweGQzYTUsIDB4ZTEzZSwgMHhmMGI3LAorICAweDA4NDAsIDB4MTljOSwgMHgyYjUyLCAweDNhZGIsIDB4NGU2NCwgMHg1ZmVkLCAweDZkNzYsIDB4N2NmZiwKKyAgMHg5NDg5LCAweDg1MDAsIDB4Yjc5YiwgMHhhNjEyLCAweGQyYWQsIDB4YzMyNCwgMHhmMWJmLCAweGUwMzYsCisgIDB4MThjMSwgMHgwOTQ4LCAweDNiZDMsIDB4MmE1YSwgMHg1ZWU1LCAweDRmNmMsIDB4N2RmNywgMHg2YzdlLAorICAweGE1MGEsIDB4YjQ4MywgMHg4NjE4LCAweDk3OTEsIDB4ZTMyZSwgMHhmMmE3LCAweGMwM2MsIDB4ZDFiNSwKKyAgMHgyOTQyLCAweDM4Y2IsIDB4MGE1MCwgMHgxYmQ5LCAweDZmNjYsIDB4N2VlZiwgMHg0Yzc0LCAweDVkZmQsCisgIDB4YjU4YiwgMHhhNDAyLCAweDk2OTksIDB4ODcxMCwgMHhmM2FmLCAweGUyMjYsIDB4ZDBiZCwgMHhjMTM0LAorICAweDM5YzMsIDB4Mjg0YSwgMHgxYWQxLCAweDBiNTgsIDB4N2ZlNywgMHg2ZTZlLCAweDVjZjUsIDB4NGQ3YywKKyAgMHhjNjBjLCAweGQ3ODUsIDB4ZTUxZSwgMHhmNDk3LCAweDgwMjgsIDB4OTFhMSwgMHhhMzNhLCAweGIyYjMsCisgIDB4NGE0NCwgMHg1YmNkLCAweDY5NTYsIDB4NzhkZiwgMHgwYzYwLCAweDFkZTksIDB4MmY3MiwgMHgzZWZiLAorICAweGQ2OGQsIDB4YzcwNCwgMHhmNTlmLCAweGU0MTYsIDB4OTBhOSwgMHg4MTIwLCAweGIzYmIsIDB4YTIzMiwKKyAgMHg1YWM1LCAweDRiNGMsIDB4NzlkNywgMHg2ODVlLCAweDFjZTEsIDB4MGQ2OCwgMHgzZmYzLCAweDJlN2EsCisgIDB4ZTcwZSwgMHhmNjg3LCAweGM0MWMsIDB4ZDU5NSwgMHhhMTJhLCAweGIwYTMsIDB4ODIzOCwgMHg5M2IxLAorICAweDZiNDYsIDB4N2FjZiwgMHg0ODU0LCAweDU5ZGQsIDB4MmQ2MiwgMHgzY2ViLCAweDBlNzAsIDB4MWZmOSwKKyAgMHhmNzhmLCAweGU2MDYsIDB4ZDQ5ZCwgMHhjNTE0LCAweGIxYWIsIDB4YTAyMiwgMHg5MmI5LCAweDgzMzAsCisgIDB4N2JjNywgMHg2YTRlLCAweDU4ZDUsIDB4NDk1YywgMHgzZGUzLCAweDJjNmEsIDB4MWVmMSwgMHgwZjc4Cit9OworCisvKiBQUFAncyBBc3luY2hyb25vdXMtQ29udHJvbC1DaGFyYWN0ZXItTWFwLiAgVGhlIG1hc2sgYXJyYXkgaXMgdXNlZAorICogdG8gc2VsZWN0IHRoZSBzcGVjaWZpYyBiaXQgZm9yIGEgY2hhcmFjdGVyLiAqLworc3RhdGljIHVfY2hhciBwcHBBQ0NNTWFza1tdID0geworICAweDAxLAorICAweDAyLAorICAweDA0LAorICAweDA4LAorICAweDEwLAorICAweDIwLAorICAweDQwLAorICAweDgwCit9OworCisvKiogV2FrZSB1cCB0aGUgdGFzayBibG9ja2VkIGluIHJlYWRpbmcgZnJvbSBzZXJpYWwgbGluZSAoaWYgYW55KSAqLworc3RhdGljIHZvaWQKK3BwcFJlY3ZXYWtldXAoaW50IHBkKQoreworICBQUFBERUJVRyhMT0dfREVCVUcsICgicHBwUmVjdldha2V1cDogdW5pdCAlZFxuIiwgcGQpKTsKKyAgaWYgKHBwcENvbnRyb2xbcGRdLm9wZW5GbGFnICE9IDApIHsKKyAgICBzaW9fcmVhZF9hYm9ydChwcHBDb250cm9sW3BkXS5mZCk7CisgIH0KK30KKyNlbmRpZiAvKiBQUFBPU19TVVBQT1JUICovCisKK3ZvaWQKK3BwcExpbmtUZXJtaW5hdGVkKGludCBwZCkKK3sKKyAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInBwcExpbmtUZXJtaW5hdGVkOiB1bml0ICVkXG4iLCBwZCkpOworCisjaWYgUFBQT0VfU1VQUE9SVAorICBpZiAocHBwQ29udHJvbFtwZF0uZXRoaWYpIHsKKyAgICBwcHBvZV9kaXNjb25uZWN0KHBwcENvbnRyb2xbcGRdLnBwcG9lX3NjKTsKKyAgfSBlbHNlCisjZW5kaWYgLyogUFBQT0VfU1VQUE9SVCAqLworICB7CisjaWYgUFBQT1NfU1VQUE9SVAorICAgIFBQUENvbnRyb2wqIHBjOworICAgIHBwcFJlY3ZXYWtldXAocGQpOworICAgIHBjID0gJnBwcENvbnRyb2xbcGRdOworCisgICAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInBwcExpbmtUZXJtaW5hdGVkOiB1bml0ICVkOiBsaW5rU3RhdHVzQ0I9JXAgZXJyQ29kZT0lZFxuIiwgcGQsIHBjLT5saW5rU3RhdHVzQ0IsIHBjLT5lcnJDb2RlKSk7CisgICAgaWYgKHBjLT5saW5rU3RhdHVzQ0IpIHsKKyAgICAgIHBjLT5saW5rU3RhdHVzQ0IocGMtPmxpbmtTdGF0dXNDdHgsIHBjLT5lcnJDb2RlID8gcGMtPmVyckNvZGUgOiBQUFBFUlJfUFJPVE9DT0wsIE5VTEwpOworICAgIH0KKworICAgIHBjLT5vcGVuRmxhZyA9IDA7LyoqLworI2VuZGlmIC8qIFBQUE9TX1NVUFBPUlQgKi8KKyAgfQorICBQUFBERUJVRyhMT0dfREVCVUcsICgicHBwTGlua1Rlcm1pbmF0ZWQ6IGZpbmlzaGVkLlxuIikpOworfQorCit2b2lkCitwcHBMaW5rRG93bihpbnQgcGQpCit7CisgIFBQUERFQlVHKExPR19ERUJVRywgKCJwcHBMaW5rRG93bjogdW5pdCAlZFxuIiwgcGQpKTsKKworI2lmIFBQUE9FX1NVUFBPUlQKKyAgaWYgKHBwcENvbnRyb2xbcGRdLmV0aGlmKSB7CisgICAgcHBwb2VfZGlzY29ubmVjdChwcHBDb250cm9sW3BkXS5wcHBvZV9zYyk7CisgIH0gZWxzZQorI2VuZGlmIC8qIFBQUE9FX1NVUFBPUlQgKi8KKyAgeworI2lmIFBQUE9TX1NVUFBPUlQKKyAgICBwcHBSZWN2V2FrZXVwKHBkKTsKKyNlbmRpZiAvKiBQUFBPU19TVVBQT1JUICovCisgIH0KK30KKworLyoqIEluaXRpYXRlIExDUCBvcGVuIHJlcXVlc3QgKi8KK3N0YXRpYyB2b2lkCitwcHBTdGFydChpbnQgcGQpCit7CisgIFBQUERFQlVHKExPR19ERUJVRywgKCJwcHBTdGFydDogdW5pdCAlZFxuIiwgcGQpKTsKKyAgbGNwX2xvd2VydXAocGQpOworICBsY3Bfb3BlbihwZCk7IC8qIFN0YXJ0IHByb3RvY29sICovCisgIFBQUERFQlVHKExPR19ERUJVRywgKCJwcHBTdGFydDogZmluaXNoZWRcbiIpKTsKK30KKworLyoqIExDUCBjbG9zZSByZXF1ZXN0ICovCitzdGF0aWMgdm9pZAorcHBwU3RvcChpbnQgcGQpCit7CisgIFBQUERFQlVHKExPR19ERUJVRywgKCJwcHBTdG9wOiB1bml0ICVkXG4iLCBwZCkpOworICBsY3BfY2xvc2UocGQsICJVc2VyIHJlcXVlc3QiKTsKK30KKworLyoqIENhbGxlZCB3aGVuIGNhcnJpZXIvbGluayBpcyBsb3N0ICovCitzdGF0aWMgdm9pZAorcHBwSHVwKGludCBwZCkKK3sKKyAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInBwcEh1cENCOiB1bml0ICVkXG4iLCBwZCkpOworICBsY3BfbG93ZXJkb3duKHBkKTsKKyAgbGlua190ZXJtaW5hdGVkKHBkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiBQVUJMSUMgRlVOQ1RJT04gREVGSU5JVElPTlMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW5pdGlhbGl6ZSB0aGUgUFBQIHN1YnN5c3RlbS4gKi8KKworc3RydWN0IHBwcF9zZXR0aW5ncyBwcHBfc2V0dGluZ3M7CisKK3ZvaWQKK3BwcEluaXQodm9pZCkKK3sKKyAgc3RydWN0IHByb3RlbnQgKnByb3RwOworICBpbnQgaSwgajsKKworICBtZW1zZXQoJnBwcF9zZXR0aW5ncywgMCwgc2l6ZW9mKHBwcF9zZXR0aW5ncykpOworICBwcHBfc2V0dGluZ3MudXNlcGVlcmRucyA9IDE7CisgIHBwcFNldEF1dGgoUFBQQVVUSFRZUEVfTk9ORSwgTlVMTCwgTlVMTCk7CisKKyAgbWFnaWNJbml0KCk7CisKKyAgc3VibmV0TWFzayA9IFBQX0hUT05MKDB4ZmZmZmZmMDBVTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9QUFA7IGkrKykgeworICAgIC8qIEluaXRpYWxpemUgZWFjaCBwcm90b2NvbCB0byB0aGUgc3RhbmRhcmQgb3B0aW9uIHNldC4gKi8KKyAgICBmb3IgKGogPSAwOyAocHJvdHAgPSBwcHBfcHJvdG9jb2xzW2pdKSAhPSBOVUxMOyArK2opIHsKKyAgICAgICgqcHJvdHAtPmluaXQpKGkpOworICAgIH0KKyAgfQorfQorCit2b2lkCitwcHBTZXRBdXRoKGVudW0gcHBwQXV0aFR5cGUgYXV0aFR5cGUsIGNvbnN0IGNoYXIgKnVzZXIsIGNvbnN0IGNoYXIgKnBhc3N3ZCkKK3sKKyAgc3dpdGNoKGF1dGhUeXBlKSB7CisgICAgY2FzZSBQUFBBVVRIVFlQRV9OT05FOgorICAgIGRlZmF1bHQ6CisjaWZkZWYgTFdJUF9QUFBfU1RSSUNUX1BBUF9SRUpFQ1QKKyAgICAgIHBwcF9zZXR0aW5ncy5yZWZ1c2VfcGFwID0gMTsKKyNlbHNlICAvKiBMV0lQX1BQUF9TVFJJQ1RfUEFQX1JFSkVDVCAqLworICAgICAgLyogc29tZSBwcm92aWRlcnMgcmVxdWVzdCBwYXAgYW5kIGFjY2VwdCBhbiBlbXB0eSBsb2dpbi9wdyAqLworICAgICAgcHBwX3NldHRpbmdzLnJlZnVzZV9wYXAgPSAwOworI2VuZGlmIC8qIExXSVBfUFBQX1NUUklDVF9QQVBfUkVKRUNUICovCisgICAgICBwcHBfc2V0dGluZ3MucmVmdXNlX2NoYXAgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBQUEFVVEhUWVBFX0FOWToKKyAgICAgIC8qIFdhcm5pbmc6IFVzaW5nIFBQUEFVVEhUWVBFX0FOWSBtaWdodCBoYXZlIHNlY3VyaXR5IGNvbnNlcXVlbmNlcy4KKyAgICAgICAqIFJGQyAxOTk0IHNheXM6CisgICAgICAgKgorICAgICAgICogSW4gcHJhY3RpY2UsIHdpdGhpbiBvciBhc3NvY2lhdGVkIHdpdGggZWFjaCBQUFAgc2VydmVyLCB0aGVyZSBpcyBhCisgICAgICAgKiBkYXRhYmFzZSB3aGljaCBhc3NvY2lhdGVzICJ1c2VyIiBuYW1lcyB3aXRoIGF1dGhlbnRpY2F0aW9uCisgICAgICAgKiBpbmZvcm1hdGlvbiAoInNlY3JldHMiKS4gIEl0IGlzIG5vdCBhbnRpY2lwYXRlZCB0aGF0IGEgcGFydGljdWxhcgorICAgICAgICogbmFtZWQgdXNlciB3b3VsZCBiZSBhdXRoZW50aWNhdGVkIGJ5IG11bHRpcGxlIG1ldGhvZHMuICBUaGlzIHdvdWxkCisgICAgICAgKiBtYWtlIHRoZSB1c2VyIHZ1bG5lcmFibGUgdG8gYXR0YWNrcyB3aGljaCBuZWdvdGlhdGUgdGhlIGxlYXN0IHNlY3VyZQorICAgICAgICogbWV0aG9kIGZyb20gYW1vbmcgYSBzZXQgKHN1Y2ggYXMgUEFQIHJhdGhlciB0aGFuIENIQVApLiAgSWYgdGhlIHNhbWUKKyAgICAgICAqIHNlY3JldCB3YXMgdXNlZCwgUEFQIHdvdWxkIHJldmVhbCB0aGUgc2VjcmV0IHRvIGJlIHVzZWQgbGF0ZXIgd2l0aAorICAgICAgICogQ0hBUC4KKyAgICAgICAqCisgICAgICAgKiBJbnN0ZWFkLCBmb3IgZWFjaCB1c2VyIG5hbWUgdGhlcmUgc2hvdWxkIGJlIGFuIGluZGljYXRpb24gb2YgZXhhY3RseQorICAgICAgICogb25lIG1ldGhvZCB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGF0IHVzZXIgbmFtZS4gIElmIGEgdXNlciBuZWVkcyB0bworICAgICAgICogbWFrZSB1c2Ugb2YgZGlmZmVyZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgdW5kZXIgZGlmZmVyZW50CisgICAgICAgKiBjaXJjdW1zdGFuY2VzLCB0aGVuIGRpc3RpbmN0IHVzZXIgbmFtZXMgU0hPVUxEIGJlIGVtcGxveWVkLCBlYWNoIG9mCisgICAgICAgKiB3aGljaCBpZGVudGlmaWVzIGV4YWN0bHkgb25lIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4KKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgIHBwcF9zZXR0aW5ncy5yZWZ1c2VfcGFwID0gMDsKKyAgICAgIHBwcF9zZXR0aW5ncy5yZWZ1c2VfY2hhcCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUFBQQVVUSFRZUEVfUEFQOgorICAgICAgcHBwX3NldHRpbmdzLnJlZnVzZV9wYXAgPSAwOworICAgICAgcHBwX3NldHRpbmdzLnJlZnVzZV9jaGFwID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQUFBBVVRIVFlQRV9DSEFQOgorICAgICAgcHBwX3NldHRpbmdzLnJlZnVzZV9wYXAgPSAxOworICAgICAgcHBwX3NldHRpbmdzLnJlZnVzZV9jaGFwID0gMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYodXNlcikgeworICAgIHN0cm5jcHkocHBwX3NldHRpbmdzLnVzZXIsIHVzZXIsIHNpemVvZihwcHBfc2V0dGluZ3MudXNlciktMSk7CisgICAgcHBwX3NldHRpbmdzLnVzZXJbc2l6ZW9mKHBwcF9zZXR0aW5ncy51c2VyKS0xXSA9ICdcMCc7CisgIH0gZWxzZSB7CisgICAgcHBwX3NldHRpbmdzLnVzZXJbMF0gPSAnXDAnOworICB9CisKKyAgaWYocGFzc3dkKSB7CisgICAgc3RybmNweShwcHBfc2V0dGluZ3MucGFzc3dkLCBwYXNzd2QsIHNpemVvZihwcHBfc2V0dGluZ3MucGFzc3dkKS0xKTsKKyAgICBwcHBfc2V0dGluZ3MucGFzc3dkW3NpemVvZihwcHBfc2V0dGluZ3MucGFzc3dkKS0xXSA9ICdcMCc7CisgIH0gZWxzZSB7CisgICAgcHBwX3NldHRpbmdzLnBhc3N3ZFswXSA9ICdcMCc7CisgIH0KK30KKworI2lmIFBQUE9TX1NVUFBPUlQKKy8qKiBPcGVuIGEgbmV3IFBQUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBnaXZlbiBJL08gZGV2aWNlLgorICogVGhpcyBpbml0aWFsaXplcyB0aGUgUFBQIGNvbnRyb2wgYmxvY2sgYnV0IGRvZXMgbm90CisgKiBhdHRlbXB0IHRvIG5lZ290aWF0ZSB0aGUgTENQIHNlc3Npb24uICBJZiB0aGlzIHBvcnQKKyAqIGNvbm5lY3RzIHRvIGEgbW9kZW0sIHRoZSBtb2RlbSBjb25uZWN0aW9uIG11c3QgYmUKKyAqIGVzdGFibGlzaGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKiBSZXR1cm4gYSBuZXcgUFBQIGNvbm5lY3Rpb24gZGVzY3JpcHRvciBvbiBzdWNjZXNzIG9yCisgKiBhbiBlcnJvciBjb2RlIChuZWdhdGl2ZSkgb24gZmFpbHVyZS4KKyAqCisgKiBwcHBPcGVuKCkgaXMgZGlyZWN0bHkgZGVmaW5lZCB0byB0aGlzIGZ1bmN0aW9uLgorICovCitpbnQKK3BwcE92ZXJTZXJpYWxPcGVuKHNpb19mZF90IGZkLCB2b2lkICgqbGlua1N0YXR1c0NCKSh2b2lkICpjdHgsIGludCBlcnJDb2RlLCB2b2lkICphcmcpLCB2b2lkICpsaW5rU3RhdHVzQ3R4KQoreworICBQUFBDb250cm9sICpwYzsKKyAgaW50IHBkOworCisgIGlmIChsaW5rU3RhdHVzQ0IgPT0gTlVMTCkgeworICAgIC8qIFBQUCBpcyBzaW5nbGUtdGhyZWFkZWQ6IHdpdGhvdXQgYSBjYWxsYmFjaywKKyAgICAgKiB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGVuIHRoZSBsaW5rIGlzIHVwLiAqLworICAgIHJldHVybiBQUFBFUlJfUEFSQU07CisgIH0KKworICAvKiBGaW5kIGEgZnJlZSBQUFAgc2Vzc2lvbiBkZXNjcmlwdG9yLiAqLworICBmb3IgKHBkID0gMDsgcGQgPCBOVU1fUFBQICYmIHBwcENvbnRyb2xbcGRdLm9wZW5GbGFnICE9IDA7IHBkKyspOworCisgIGlmIChwZCA+PSBOVU1fUFBQKSB7CisgICAgcGQgPSBQUFBFUlJfT1BFTjsKKyAgfSBlbHNlIHsKKyAgICBwYyA9ICZwcHBDb250cm9sW3BkXTsKKyAgICAvKiBAdG9kbzogaXMgdGhpcyBjb3JyZWN0IG9yIGRvIEkgb3ZlcndyaXRlIHNvbWV0aGluZz8gKi8KKyAgICBtZW1zZXQocGMsIDAsIHNpemVvZihQUFBDb250cm9sKSk7CisgICAgcGMtPnJ4LnBkID0gcGQ7CisgICAgcGMtPnJ4LmZkID0gZmQ7CisKKyAgICBwYy0+b3BlbkZsYWcgPSAxOworICAgIHBjLT5mZCA9IGZkOworCisjaWYgVkpfU1VQUE9SVAorICAgIHZqX2NvbXByZXNzX2luaXQoJnBjLT52akNvbXApOworI2VuZGlmIC8qIFZKX1NVUFBPUlQgKi8KKworICAgIC8qIAorICAgICAqIERlZmF1bHQgdGhlIGluIGFuZCBvdXQgYWNjbSBzbyB0aGF0IGVzY2FwZSBhbmQgZmxhZyBjaGFyYWN0ZXJzCisgICAgICogYXJlIGFsd2F5cyBlc2NhcGVkLiAKKyAgICAgKi8KKyAgICBwYy0+cnguaW5BQ0NNWzE1XSA9IDB4NjA7IC8qIG5vIG5lZWQgdG8gcHJvdGVjdCBzaW5jZSBSWCBpcyBub3QgcnVubmluZyAqLworICAgIHBjLT5vdXRBQ0NNWzE1XSA9IDB4NjA7CisKKyAgICBwYy0+bGlua1N0YXR1c0NCID0gbGlua1N0YXR1c0NCOworICAgIHBjLT5saW5rU3RhdHVzQ3R4ID0gbGlua1N0YXR1c0N0eDsKKworICAgIC8qCisgICAgICogU3RhcnQgdGhlIGNvbm5lY3Rpb24gYW5kIGhhbmRsZSBpbmNvbWluZyBldmVudHMgKHBhY2tldCBvciB0aW1lb3V0KS4KKyAgICAgKi8KKyAgICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBPdmVyU2VyaWFsT3BlbjogdW5pdCAlZDogQ29ubmVjdGluZ1xuIiwgcGQpKTsKKyAgICBwcHBTdGFydChwZCk7CisjaWYgUFBQX0lOUFJPQ19PV05USFJFQUQKKyAgICBzeXNfdGhyZWFkX25ldyhQUFBfVEhSRUFEX05BTUUsIHBwcElucHV0VGhyZWFkLCAodm9pZCopJnBjLT5yeCwgUFBQX1RIUkVBRF9TVEFDS1NJWkUsIFBQUF9USFJFQURfUFJJTyk7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiBwZDsKK30KKyNlbmRpZiAvKiBQUFBPU19TVVBQT1JUICovCisKKyNpZiBQUFBPRV9TVVBQT1JUCitzdGF0aWMgdm9pZCBwcHBPdmVyRXRoZXJuZXRMaW5rU3RhdHVzQ0IoaW50IHBkLCBpbnQgdXApOworCit2b2lkCitwcHBPdmVyRXRoZXJuZXRDbG9zZShpbnQgcGQpCit7CisgIFBQUENvbnRyb2wqIHBjID0gJnBwcENvbnRyb2xbcGRdOworCisgIC8qICpUSkwqIFRoZXJlJ3Mgbm8gbGNwX2RlaW5pdCAqLworICBsY3BfY2xvc2UocGQsIE5VTEwpOworCisgIHBwcG9lX2Rlc3Ryb3koJnBjLT5uZXRpZik7Cit9CisKK2ludCBwcHBPdmVyRXRoZXJuZXRPcGVuKHN0cnVjdCBuZXRpZiAqZXRoaWYsIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgY29uc3QgY2hhciAqY29uY2VudHJhdG9yX25hbWUsIHZvaWQgKCpsaW5rU3RhdHVzQ0IpKHZvaWQgKmN0eCwgaW50IGVyckNvZGUsIHZvaWQgKmFyZyksIHZvaWQgKmxpbmtTdGF0dXNDdHgpCit7CisgIFBQUENvbnRyb2wgKnBjOworICBpbnQgcGQ7CisKKyAgTFdJUF9VTlVTRURfQVJHKHNlcnZpY2VfbmFtZSk7CisgIExXSVBfVU5VU0VEX0FSRyhjb25jZW50cmF0b3JfbmFtZSk7CisKKyAgaWYgKGxpbmtTdGF0dXNDQiA9PSBOVUxMKSB7CisgICAgLyogUFBQIGlzIHNpbmdsZS10aHJlYWRlZDogd2l0aG91dCBhIGNhbGxiYWNrLAorICAgICAqIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoZW4gdGhlIGxpbmsgaXMgdXAuICovCisgICAgcmV0dXJuIFBQUEVSUl9QQVJBTTsKKyAgfQorCisgIC8qIEZpbmQgYSBmcmVlIFBQUCBzZXNzaW9uIGRlc2NyaXB0b3IuIENyaXRpY2FsIHJlZ2lvbj8gKi8KKyAgZm9yIChwZCA9IDA7IHBkIDwgTlVNX1BQUCAmJiBwcHBDb250cm9sW3BkXS5vcGVuRmxhZyAhPSAwOyBwZCsrKTsKKyAgaWYgKHBkID49IE5VTV9QUFApIHsKKyAgICBwZCA9IFBQUEVSUl9PUEVOOworICB9IGVsc2UgeworICAgIHBjID0gJnBwcENvbnRyb2xbcGRdOworICAgIG1lbXNldChwYywgMCwgc2l6ZW9mKFBQUENvbnRyb2wpKTsKKyAgICBwYy0+b3BlbkZsYWcgPSAxOworICAgIHBjLT5ldGhpZiA9IGV0aGlmOworCisgICAgcGMtPmxpbmtTdGF0dXNDQiAgPSBsaW5rU3RhdHVzQ0I7CisgICAgcGMtPmxpbmtTdGF0dXNDdHggPSBsaW5rU3RhdHVzQ3R4OworCisgICAgbGNwX3dhbnRvcHRpb25zW3BkXS5tcnUgPSBQUFBPRV9NQVhNVFU7CisgICAgbGNwX3dhbnRvcHRpb25zW3BkXS5uZWdfYXN5bmNtYXAgPSAwOworICAgIGxjcF93YW50b3B0aW9uc1twZF0ubmVnX3Bjb21wcmVzc2lvbiA9IDA7CisgICAgbGNwX3dhbnRvcHRpb25zW3BkXS5uZWdfYWNjb21wcmVzc2lvbiA9IDA7CisKKyAgICBsY3BfYWxsb3dvcHRpb25zW3BkXS5tcnUgPSBQUFBPRV9NQVhNVFU7CisgICAgbGNwX2FsbG93b3B0aW9uc1twZF0ubmVnX2FzeW5jbWFwID0gMDsKKyAgICBsY3BfYWxsb3dvcHRpb25zW3BkXS5uZWdfcGNvbXByZXNzaW9uID0gMDsKKyAgICBsY3BfYWxsb3dvcHRpb25zW3BkXS5uZWdfYWNjb21wcmVzc2lvbiA9IDA7CisKKyAgICBpZihwcHBvZV9jcmVhdGUoZXRoaWYsIHBkLCBwcHBPdmVyRXRoZXJuZXRMaW5rU3RhdHVzQ0IsICZwYy0+cHBwb2Vfc2MpICE9IEVSUl9PSykgeworICAgICAgcGMtPm9wZW5GbGFnID0gMDsKKyAgICAgIHJldHVybiBQUFBFUlJfT1BFTjsKKyAgICB9CisKKyAgICBwcHBvZV9jb25uZWN0KHBjLT5wcHBvZV9zYyk7CisgIH0KKworICByZXR1cm4gcGQ7Cit9CisjZW5kaWYgLyogUFBQT0VfU1VQUE9SVCAqLworCisKKy8qIENsb3NlIGEgUFBQIGNvbm5lY3Rpb24gYW5kIHJlbGVhc2UgdGhlIGRlc2NyaXB0b3IuIAorICogQW55IG91dHN0YW5kaW5nIHBhY2tldHMgaW4gdGhlIHF1ZXVlcyBhcmUgZHJvcHBlZC4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gKi8KK2ludAorcHBwQ2xvc2UoaW50IHBkKQoreworICBQUFBDb250cm9sICpwYyA9ICZwcHBDb250cm9sW3BkXTsKKyAgaW50IHN0ID0gMDsKKworICBQUFBERUJVRyhMT0dfREVCVUcsICgicHBwQ2xvc2UoKSBjYWxsZWRcbiIpKTsKKworICAvKiBEaXNjb25uZWN0ICovCisjaWYgUFBQT0VfU1VQUE9SVAorICBpZihwYy0+ZXRoaWYpIHsKKyAgICBQUFBERUJVRyhMT0dfREVCVUcsICgicHBwQ2xvc2U6IHVuaXQgJWQga2lsbF9saW5rIC0+IHBwcFN0b3BcbiIsIHBkKSk7CisgICAgcGMtPmVyckNvZGUgPSBQUFBFUlJfVVNFUjsKKyAgICAvKiBUaGlzIHdpbGwgbGVhdmUgdXMgYXQgUEhBU0VfREVBRC4gKi8KKyAgICBwcHBTdG9wKHBkKTsKKyAgfSBlbHNlCisjZW5kaWYgLyogUFBQT0VfU1VQUE9SVCAqLworICB7CisjaWYgUFBQT1NfU1VQUE9SVAorICAgIFBQUERFQlVHKExPR19ERUJVRywgKCJwcHBDbG9zZTogdW5pdCAlZCBraWxsX2xpbmsgLT4gcHBwU3RvcFxuIiwgcGQpKTsKKyAgICBwYy0+ZXJyQ29kZSA9IFBQUEVSUl9VU0VSOworICAgIC8qIFRoaXMgd2lsbCBsZWF2ZSB1cyBhdCBQSEFTRV9ERUFELiAqLworICAgIHBwcFN0b3AocGQpOworICAgIHBwcFJlY3ZXYWtldXAocGQpOworI2VuZGlmIC8qIFBQUE9TX1NVUFBPUlQgKi8KKyAgfQorCisgIHJldHVybiBzdDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBjYXJyaWVyIGlzIGxvc3Qgb24gdGhlIFBQUCBjaGFubmVsLiAqLwordm9pZAorcHBwU2lnSFVQKGludCBwZCkKK3sKKyAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInBwcFNpZ0hVUDogdW5pdCAlZCBzaWdfaHVwIC0+IHBwcEh1cENCXG4iLCBwZCkpOworICBwcHBIdXAocGQpOworfQorCisjaWYgUFBQT1NfU1VQUE9SVAorc3RhdGljIHZvaWQKK25QdXQoUFBQQ29udHJvbCAqcGMsIHN0cnVjdCBwYnVmICpuYikKK3sKKyAgc3RydWN0IHBidWYgKmI7CisgIGludCBjOworCisgIGZvcihiID0gbmI7IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpIHsKKyAgICBpZigoYyA9IHNpb193cml0ZShwYy0+ZmQsIGItPnBheWxvYWQsIGItPmxlbikpICE9IGItPmxlbikgeworICAgICAgUFBQREVCVUcoTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAoIlBQUCBuUHV0OiBpbmNvbXBsZXRlIHNpb193cml0ZShmZDolIlNaVF9GIiwgbGVuOiVkLCBjOiAweCUiWDhfRiIpIGMgPSAlZFxuIiwgKHNpemVfdClwYy0+ZmQsIGItPmxlbiwgYywgYykpOworICAgICAgTElOS19TVEFUU19JTkMobGluay5lcnIpOworICAgICAgcGMtPmxhc3RYTWl0ID0gMDsgLyogcHJlcGVuZCBQUFBfRkxBRyB0byBuZXh0IHBhY2tldCAqLworICAgICAgc25tcF9pbmNfaWZvdXRkaXNjYXJkcygmcGMtPm5ldGlmKTsKKyAgICAgIHBidWZfZnJlZShuYik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgc25tcF9hZGRfaWZvdXRvY3RldHMoJnBjLT5uZXRpZiwgbmItPnRvdF9sZW4pOworICBzbm1wX2luY19pZm91dHVjYXN0cGt0cygmcGMtPm5ldGlmKTsKKyAgcGJ1Zl9mcmVlKG5iKTsKKyAgTElOS19TVEFUU19JTkMobGluay54bWl0KTsKK30KKworLyogCisgKiBwcHBBcHBlbmQgLSBhcHBlbmQgZ2l2ZW4gY2hhcmFjdGVyIHRvIGVuZCBvZiBnaXZlbiBwYnVmLiAgSWYgb3V0QUNDTQorICogaXMgbm90IE5VTEwgYW5kIHRoZSBjaGFyYWN0ZXIgbmVlZHMgdG8gYmUgZXNjYXBlZCwgZG8gc28uCisgKiBJZiBwYnVmIGlzIGZ1bGwsIGFwcGVuZCBhbm90aGVyLgorICogUmV0dXJuIHRoZSBjdXJyZW50IHBidWYuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGJ1ZiAqCitwcHBBcHBlbmQodV9jaGFyIGMsIHN0cnVjdCBwYnVmICpuYiwgZXh0X2FjY20gKm91dEFDQ00pCit7CisgIHN0cnVjdCBwYnVmICp0YiA9IG5iOworICAKKyAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIHJvb20gZm9yIHRoZSBjaGFyYWN0ZXIgYW5kIGFuIGVzY2FwZSBjb2RlLgorICAgKiBTdXJlIHdlIGRvbid0IHF1aXRlIGZpbGwgdGhlIGJ1ZmZlciBpZiB0aGUgY2hhcmFjdGVyIGRvZXNuJ3QKKyAgICogZ2V0IGVzY2FwZWQgYnV0IGlzIG9uZSBjaGFyYWN0ZXIgd29ydGggY29tcGxpY2F0aW5nIHRoaXM/ICovCisgIC8qIE5vdGU6IFdlIGFzc3VtZSBubyBwYWNrZXQgaGVhZGVyLiAqLworICBpZiAobmIgJiYgKFBCVUZfUE9PTF9CVUZTSVpFIC0gbmItPmxlbikgPCAyKSB7CisgICAgdGIgPSBwYnVmX2FsbG9jKFBCVUZfUkFXLCAwLCBQQlVGX1BPT0wpOworICAgIGlmICh0YikgeworICAgICAgbmItPm5leHQgPSB0YjsKKyAgICB9IGVsc2UgeworICAgICAgTElOS19TVEFUU19JTkMobGluay5tZW1lcnIpOworICAgIH0KKyAgICBuYiA9IHRiOworICB9CisKKyAgaWYgKG5iKSB7CisgICAgaWYgKG91dEFDQ00gJiYgRVNDQVBFX1AoKm91dEFDQ00sIGMpKSB7CisgICAgICAqKCh1X2NoYXIqKW5iLT5wYXlsb2FkICsgbmItPmxlbisrKSA9IFBQUF9FU0NBUEU7CisgICAgICAqKCh1X2NoYXIqKW5iLT5wYXlsb2FkICsgbmItPmxlbisrKSA9IGMgXiBQUFBfVFJBTlM7CisgICAgfSBlbHNlIHsKKyAgICAgICooKHVfY2hhciopbmItPnBheWxvYWQgKyBuYi0+bGVuKyspID0gYzsKKyAgICB9CisgIH0KKworICByZXR1cm4gdGI7Cit9CisjZW5kaWYgLyogUFBQT1NfU1VQUE9SVCAqLworCisjaWYgUFBQT0VfU1VQUE9SVAorc3RhdGljIGVycl90CitwcHBpZk91dHB1dE92ZXJFdGhlcm5ldChpbnQgcGQsIHN0cnVjdCBwYnVmICpwKQoreworICBQUFBDb250cm9sICpwYyA9ICZwcHBDb250cm9sW3BkXTsKKyAgc3RydWN0IHBidWYgKnBiOworICB1X3Nob3J0IHByb3RvY29sID0gUFBQX0lQOworICBpbnQgaT0wOworICB1MTZfdCB0b3RfbGVuOworCisgIC8qIEB0b2RvOiB0cnkgdG8gdXNlIHBidWZfaGVhZGVyKCkgaGVyZSEgKi8KKyAgcGIgPSBwYnVmX2FsbG9jKFBCVUZfTElOSywgUFBQT0VfSERSTEVOICsgc2l6ZW9mKHByb3RvY29sKSwgUEJVRl9SQU0pOworICBpZighcGIpIHsKKyAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLm1lbWVycik7CisgICAgTElOS19TVEFUU19JTkMobGluay5wcm90ZXJyKTsKKyAgICBzbm1wX2luY19pZm91dGRpc2NhcmRzKCZwYy0+bmV0aWYpOworICAgIHJldHVybiBFUlJfTUVNOworICB9CisKKyAgcGJ1Zl9oZWFkZXIocGIsIC0oczE2X3QpUFBQT0VfSERSTEVOKTsKKworICBwYy0+bGFzdFhNaXQgPSBzeXNfamlmZmllcygpOworCisgIGlmICghcGMtPnBjb21wIHx8IHByb3RvY29sID4gMHhGRikgeworICAgICooKHVfY2hhciopcGItPnBheWxvYWQgKyBpKyspID0gKHByb3RvY29sID4+IDgpICYgMHhGRjsKKyAgfQorICAqKCh1X2NoYXIqKXBiLT5wYXlsb2FkICsgaSkgPSBwcm90b2NvbCAmIDB4RkY7CisKKyAgcGJ1Zl9jaGFpbihwYiwgcCk7CisgIHRvdF9sZW4gPSBwYi0+dG90X2xlbjsKKworICBpZihwcHBvZV94bWl0KHBjLT5wcHBvZV9zYywgcGIpICE9IEVSUl9PSykgeworICAgIExJTktfU1RBVFNfSU5DKGxpbmsuZXJyKTsKKyAgICBzbm1wX2luY19pZm91dGRpc2NhcmRzKCZwYy0+bmV0aWYpOworICAgIHJldHVybiBQUFBFUlJfREVWSUNFOworICB9CisKKyAgc25tcF9hZGRfaWZvdXRvY3RldHMoJnBjLT5uZXRpZiwgdG90X2xlbik7CisgIHNubXBfaW5jX2lmb3V0dWNhc3Rwa3RzKCZwYy0+bmV0aWYpOworICBMSU5LX1NUQVRTX0lOQyhsaW5rLnhtaXQpOworICByZXR1cm4gRVJSX09LOworfQorI2VuZGlmIC8qIFBQUE9FX1NVUFBPUlQgKi8KKworLyogU2VuZCBhIHBhY2tldCBvbiB0aGUgZ2l2ZW4gY29ubmVjdGlvbi4gKi8KK3N0YXRpYyBlcnJfdAorcHBwaWZPdXRwdXQoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IHBidWYgKnBiLCBpcF9hZGRyX3QgKmlwYWRkcikKK3sKKyAgaW50IHBkID0gKGludCkoc2l6ZV90KW5ldGlmLT5zdGF0ZTsKKyAgUFBQQ29udHJvbCAqcGMgPSAmcHBwQ29udHJvbFtwZF07CisjaWYgUFBQT1NfU1VQUE9SVAorICB1X3Nob3J0IHByb3RvY29sID0gUFBQX0lQOworICB1X2ludCBmY3NPdXQgPSBQUFBfSU5JVEZDUzsKKyAgc3RydWN0IHBidWYgKmhlYWRNQiA9IE5VTEwsICp0YWlsTUIgPSBOVUxMLCAqcDsKKyAgdV9jaGFyIGM7CisjZW5kaWYgLyogUFBQT1NfU1VQUE9SVCAqLworCisgIExXSVBfVU5VU0VEX0FSRyhpcGFkZHIpOworCisgIC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMuICovCisgIC8qIFdlIGxldCBhbnkgcHJvdG9jb2wgdmFsdWUgZ28gdGhyb3VnaCAtIGl0IGNhbid0IGh1cnQgdXMKKyAgICogYW5kIHRoZSBwZWVyIHdpbGwganVzdCBkcm9wIGl0IGlmIGl0J3Mgbm90IGFjY2VwdGluZyBpdC4gKi8KKyAgaWYgKHBkIDwgMCB8fCBwZCA+PSBOVU1fUFBQIHx8ICFwYy0+b3BlbkZsYWcgfHwgIXBiKSB7CisgICAgUFBQREVCVUcoTE9HX1dBUk5JTkcsICgicHBwaWZPdXRwdXRbJWRdOiBiYWQgcGFybXMgcHJvdD0lZCBwYj0lcFxuIiwKKyAgICAgICAgICAgICAgcGQsIFBQUF9JUCwgcGIpKTsKKyAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLm9wdGVycik7CisgICAgTElOS19TVEFUU19JTkMobGluay5kcm9wKTsKKyAgICBzbm1wX2luY19pZm91dGRpc2NhcmRzKG5ldGlmKTsKKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorCisgIC8qIENoZWNrIHRoYXQgdGhlIGxpbmsgaXMgdXAuICovCisgIGlmIChsY3BfcGhhc2VbcGRdID09IFBIQVNFX0RFQUQpIHsKKyAgICBQUFBERUJVRyhMT0dfRVJSLCAoInBwcGlmT3V0cHV0WyVkXTogbGluayBub3QgdXBcbiIsIHBkKSk7CisgICAgTElOS19TVEFUU19JTkMobGluay5ydGVycik7CisgICAgTElOS19TVEFUU19JTkMobGluay5kcm9wKTsKKyAgICBzbm1wX2luY19pZm91dGRpc2NhcmRzKG5ldGlmKTsKKyAgICByZXR1cm4gRVJSX1JURTsKKyAgfQorCisjaWYgUFBQT0VfU1VQUE9SVAorICBpZihwYy0+ZXRoaWYpIHsKKyAgICByZXR1cm4gcHBwaWZPdXRwdXRPdmVyRXRoZXJuZXQocGQsIHBiKTsKKyAgfQorI2VuZGlmIC8qIFBQUE9FX1NVUFBPUlQgKi8KKworI2lmIFBQUE9TX1NVUFBPUlQKKyAgLyogR3JhYiBhbiBvdXRwdXQgYnVmZmVyLiAqLworICBoZWFkTUIgPSBwYnVmX2FsbG9jKFBCVUZfUkFXLCAwLCBQQlVGX1BPT0wpOworICBpZiAoaGVhZE1CID09IE5VTEwpIHsKKyAgICBQUFBERUJVRyhMT0dfV0FSTklORywgKCJwcHBpZk91dHB1dFslZF06IGZpcnN0IGFsbG9jIGZhaWxcbiIsIHBkKSk7CisgICAgTElOS19TVEFUU19JTkMobGluay5tZW1lcnIpOworICAgIExJTktfU1RBVFNfSU5DKGxpbmsuZHJvcCk7CisgICAgc25tcF9pbmNfaWZvdXRkaXNjYXJkcyhuZXRpZik7CisgICAgcmV0dXJuIEVSUl9NRU07CisgIH0KKworI2lmIFZKX1NVUFBPUlQKKyAgLyogCisgICAqIEF0dGVtcHQgVmFuIEphY29ic29uIGhlYWRlciBjb21wcmVzc2lvbiBpZiBWSiBpcyBjb25maWd1cmVkIGFuZAorICAgKiB0aGlzIGlzIGFuIElQIHBhY2tldC4gCisgICAqLworICBpZiAocHJvdG9jb2wgPT0gUFBQX0lQICYmIHBjLT52akVuYWJsZWQpIHsKKyAgICBzd2l0Y2ggKHZqX2NvbXByZXNzX3RjcCgmcGMtPnZqQ29tcCwgcGIpKSB7CisgICAgICBjYXNlIFRZUEVfSVA6CisgICAgICAgIC8qIE5vIGNoYW5nZS4uLgorICAgICAgICAgICBwcm90b2NvbCA9IFBQUF9JUF9QUk9UT0NPTDsgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09NUFJFU1NFRF9UQ1A6CisgICAgICAgIHByb3RvY29sID0gUFBQX1ZKQ19DT01QOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVFlQRV9VTkNPTVBSRVNTRURfVENQOgorICAgICAgICBwcm90b2NvbCA9IFBQUF9WSkNfVU5DT01QOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIFBQUERFQlVHKExPR19XQVJOSU5HLCAoInBwcGlmT3V0cHV0WyVkXTogYmFkIElQIHBhY2tldFxuIiwgcGQpKTsKKyAgICAgICAgTElOS19TVEFUU19JTkMobGluay5wcm90ZXJyKTsKKyAgICAgICAgTElOS19TVEFUU19JTkMobGluay5kcm9wKTsKKyAgICAgICAgc25tcF9pbmNfaWZvdXRkaXNjYXJkcyhuZXRpZik7CisgICAgICAgIHBidWZfZnJlZShoZWFkTUIpOworICAgICAgICByZXR1cm4gRVJSX1ZBTDsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBWSl9TVVBQT1JUICovCisKKyAgdGFpbE1CID0gaGVhZE1COworCisgIC8qIEJ1aWxkIHRoZSBQUFAgaGVhZGVyLiAqLworICBpZiAoKHN5c19qaWZmaWVzKCkgLSBwYy0+bGFzdFhNaXQpID49IFBQUF9NQVhJRExFRkxBRykgeworICAgIHRhaWxNQiA9IHBwcEFwcGVuZChQUFBfRkxBRywgdGFpbE1CLCBOVUxMKTsKKyAgfQorCisgIHBjLT5sYXN0WE1pdCA9IHN5c19qaWZmaWVzKCk7CisgIGlmICghcGMtPmFjY29tcCkgeworICAgIGZjc091dCA9IFBQUF9GQ1MoZmNzT3V0LCBQUFBfQUxMU1RBVElPTlMpOworICAgIHRhaWxNQiA9IHBwcEFwcGVuZChQUFBfQUxMU1RBVElPTlMsIHRhaWxNQiwgJnBjLT5vdXRBQ0NNKTsKKyAgICBmY3NPdXQgPSBQUFBfRkNTKGZjc091dCwgUFBQX1VJKTsKKyAgICB0YWlsTUIgPSBwcHBBcHBlbmQoUFBQX1VJLCB0YWlsTUIsICZwYy0+b3V0QUNDTSk7CisgIH0KKyAgaWYgKCFwYy0+cGNvbXAgfHwgcHJvdG9jb2wgPiAweEZGKSB7CisgICAgYyA9IChwcm90b2NvbCA+PiA4KSAmIDB4RkY7CisgICAgZmNzT3V0ID0gUFBQX0ZDUyhmY3NPdXQsIGMpOworICAgIHRhaWxNQiA9IHBwcEFwcGVuZChjLCB0YWlsTUIsICZwYy0+b3V0QUNDTSk7CisgIH0KKyAgYyA9IHByb3RvY29sICYgMHhGRjsKKyAgZmNzT3V0ID0gUFBQX0ZDUyhmY3NPdXQsIGMpOworICB0YWlsTUIgPSBwcHBBcHBlbmQoYywgdGFpbE1CLCAmcGMtPm91dEFDQ00pOworCisgIC8qIExvYWQgcGFja2V0LiAqLworICBmb3IocCA9IHBiOyBwOyBwID0gcC0+bmV4dCkgeworICAgIGludCBuOworICAgIHVfY2hhciAqc1B0cjsKKworICAgIHNQdHIgPSAodV9jaGFyKilwLT5wYXlsb2FkOworICAgIG4gPSBwLT5sZW47CisgICAgd2hpbGUgKG4tLSA+IDApIHsKKyAgICAgIGMgPSAqc1B0cisrOworCisgICAgICAvKiBVcGRhdGUgRkNTIGJlZm9yZSBjaGVja2luZyBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzLiAqLworICAgICAgZmNzT3V0ID0gUFBQX0ZDUyhmY3NPdXQsIGMpOworICAgICAgCisgICAgICAvKiBDb3B5IHRvIG91dHB1dCBidWZmZXIgZXNjYXBpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzLiAqLworICAgICAgdGFpbE1CID0gcHBwQXBwZW5kKGMsIHRhaWxNQiwgJnBjLT5vdXRBQ0NNKTsKKyAgICB9CisgIH0KKworICAvKiBBZGQgRkNTIGFuZCB0cmFpbGluZyBmbGFnLiAqLworICBjID0gfmZjc091dCAmIDB4RkY7CisgIHRhaWxNQiA9IHBwcEFwcGVuZChjLCB0YWlsTUIsICZwYy0+b3V0QUNDTSk7CisgIGMgPSAofmZjc091dCA+PiA4KSAmIDB4RkY7CisgIHRhaWxNQiA9IHBwcEFwcGVuZChjLCB0YWlsTUIsICZwYy0+b3V0QUNDTSk7CisgIHRhaWxNQiA9IHBwcEFwcGVuZChQUFBfRkxBRywgdGFpbE1CLCBOVUxMKTsKKworICAvKiBJZiB3ZSBmYWlsZWQgdG8gY29tcGxldGUgdGhlIHBhY2tldCwgdGhyb3cgaXQgYXdheS4gKi8KKyAgaWYgKCF0YWlsTUIpIHsKKyAgICBQUFBERUJVRyhMT0dfV0FSTklORywKKyAgICAgICAgICAgICAoInBwcGlmT3V0cHV0WyVkXTogQWxsb2MgZXJyIC0gZHJvcHBpbmcgcHJvdG89JWRcbiIsIAorICAgICAgICAgICAgICBwZCwgcHJvdG9jb2wpKTsKKyAgICBwYnVmX2ZyZWUoaGVhZE1CKTsKKyAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLm1lbWVycik7CisgICAgTElOS19TVEFUU19JTkMobGluay5kcm9wKTsKKyAgICBzbm1wX2luY19pZm91dGRpc2NhcmRzKG5ldGlmKTsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorCisgIC8qIFNlbmQgaXQuICovCisgIFBQUERFQlVHKExPR19JTkZPLCAoInBwcGlmT3V0cHV0WyVkXTogcHJvdG89MHglIlgxNl9GIlxuIiwgcGQsIHByb3RvY29sKSk7CisKKyAgblB1dChwYywgaGVhZE1CKTsKKyNlbmRpZiAvKiBQUFBPU19TVVBQT1JUICovCisKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyogR2V0IGFuZCBzZXQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIGNvbm5lY3Rpb24uCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG9uIGZhaWx1cmUuICovCitpbnQKK3BwcElPQ3RsKGludCBwZCwgaW50IGNtZCwgdm9pZCAqYXJnKQoreworICBQUFBDb250cm9sICpwYyA9ICZwcHBDb250cm9sW3BkXTsKKyAgaW50IHN0ID0gMDsKKworICBpZiAocGQgPCAwIHx8IHBkID49IE5VTV9QUFApIHsKKyAgICBzdCA9IFBQUEVSUl9QQVJBTTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBQUFBDVExHX1VQU1RBVFVTOiAgICAgIC8qIEdldCB0aGUgUFBQIHVwIHN0YXR1cy4gKi8KKyAgICAgIGlmIChhcmcpIHsKKyAgICAgICAgKihpbnQgKilhcmcgPSAoaW50KShwYy0+aWZfdXApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3QgPSBQUFBFUlJfUEFSQU07CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUENUTFNfRVJSQ09ERTogICAgICAgLyogU2V0IHRoZSBQUFAgZXJyb3IgY29kZS4gKi8KKyAgICAgIGlmIChhcmcpIHsKKyAgICAgICAgcGMtPmVyckNvZGUgPSAqKGludCAqKWFyZzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ID0gUFBQRVJSX1BBUkFNOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUFBDVExHX0VSUkNPREU6ICAgICAgIC8qIEdldCB0aGUgUFBQIGVycm9yIGNvZGUuICovCisgICAgICBpZiAoYXJnKSB7CisgICAgICAgICooaW50ICopYXJnID0gKGludCkocGMtPmVyckNvZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3QgPSBQUFBFUlJfUEFSQU07CisgICAgICB9CisgICAgICBicmVhazsKKyNpZiBQUFBPU19TVVBQT1JUCisgICAgY2FzZSBQUFBDVExHX0ZEOiAgICAgICAgICAgIC8qIEdldCB0aGUgZmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcHAgKi8KKyAgICAgIGlmIChhcmcpIHsKKyAgICAgICAgKihzaW9fZmRfdCAqKWFyZyA9IHBjLT5mZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ID0gUFBQRVJSX1BBUkFNOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYgLyogUFBQT1NfU1VQUE9SVCAqLworICAgIGRlZmF1bHQ6CisgICAgICBzdCA9IFBQUEVSUl9QQVJBTTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgTWF4aW11bSBUcmFuc21pc3Npb24gVW5pdCBmb3IgdGhlIGdpdmVuIFBQUCBjb25uZWN0aW9uLgorICovCit1X3Nob3J0CitwcHBNVFUoaW50IHBkKQoreworICBQUFBDb250cm9sICpwYyA9ICZwcHBDb250cm9sW3BkXTsKKyAgdV9zaG9ydCBzdDsKKworICAvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzLiAqLworICBpZiAocGQgPCAwIHx8IHBkID49IE5VTV9QUFAgfHwgIXBjLT5vcGVuRmxhZykgeworICAgIHN0ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBzdCA9IHBjLT5tdHU7CisgIH0KKworICByZXR1cm4gc3Q7Cit9CisKKyNpZiBQUFBPRV9TVVBQT1JUCitpbnQKK3BwcFdyaXRlT3ZlckV0aGVybmV0KGludCBwZCwgY29uc3QgdV9jaGFyICpzLCBpbnQgbikKK3sKKyAgUFBQQ29udHJvbCAqcGMgPSAmcHBwQ29udHJvbFtwZF07CisgIHN0cnVjdCBwYnVmICpwYjsKKworICAvKiBza2lwIGFkZHJlc3MgJiBmbGFncyAqLworICBzICs9IDI7CisgIG4gLT0gMjsKKworICBMV0lQX0FTU0VSVCgiUFBQT0VfSERSTEVOICsgbiA8PSAweGZmZmYiLCBQUFBPRV9IRFJMRU4gKyBuIDw9IDB4ZmZmZik7CisgIHBiID0gcGJ1Zl9hbGxvYyhQQlVGX0xJTkssICh1MTZfdCkoUFBQT0VfSERSTEVOICsgbiksIFBCVUZfUkFNKTsKKyAgaWYoIXBiKSB7CisgICAgTElOS19TVEFUU19JTkMobGluay5tZW1lcnIpOworICAgIExJTktfU1RBVFNfSU5DKGxpbmsucHJvdGVycik7CisgICAgc25tcF9pbmNfaWZvdXRkaXNjYXJkcygmcGMtPm5ldGlmKTsKKyAgICByZXR1cm4gUFBQRVJSX0FMTE9DOworICB9CisKKyAgcGJ1Zl9oZWFkZXIocGIsIC0oczE2X3QpUFBQT0VfSERSTEVOKTsKKworICBwYy0+bGFzdFhNaXQgPSBzeXNfamlmZmllcygpOworCisgIE1FTUNQWShwYi0+cGF5bG9hZCwgcywgbik7CisKKyAgaWYocHBwb2VfeG1pdChwYy0+cHBwb2Vfc2MsIHBiKSAhPSBFUlJfT0spIHsKKyAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLmVycik7CisgICAgc25tcF9pbmNfaWZvdXRkaXNjYXJkcygmcGMtPm5ldGlmKTsKKyAgICByZXR1cm4gUFBQRVJSX0RFVklDRTsKKyAgfQorCisgIHNubXBfYWRkX2lmb3V0b2N0ZXRzKCZwYy0+bmV0aWYsICh1MTZfdCluKTsKKyAgc25tcF9pbmNfaWZvdXR1Y2FzdHBrdHMoJnBjLT5uZXRpZik7CisgIExJTktfU1RBVFNfSU5DKGxpbmsueG1pdCk7CisgIHJldHVybiBQUFBFUlJfTk9ORTsKK30KKyNlbmRpZiAvKiBQUFBPRV9TVVBQT1JUICovCisKKy8qCisgKiBXcml0ZSBuIGNoYXJhY3RlcnMgdG8gYSBwcHAgbGluay4KKyAqICBSRVRVUk46ID49IDAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbgorICogICAgICAgICAgIC0xIEZhaWxlZCB0byB3cml0ZSB0byBkZXZpY2UKKyAqLworaW50CitwcHBXcml0ZShpbnQgcGQsIGNvbnN0IHVfY2hhciAqcywgaW50IG4pCit7CisgIFBQUENvbnRyb2wgKnBjID0gJnBwcENvbnRyb2xbcGRdOworI2lmIFBQUE9TX1NVUFBPUlQKKyAgdV9jaGFyIGM7CisgIHVfaW50IGZjc091dDsKKyAgc3RydWN0IHBidWYgKmhlYWRNQiwgKnRhaWxNQjsKKyNlbmRpZiAvKiBQUFBPU19TVVBQT1JUICovCisKKyNpZiBQUFBPRV9TVVBQT1JUCisgIGlmKHBjLT5ldGhpZikgeworICAgIHJldHVybiBwcHBXcml0ZU92ZXJFdGhlcm5ldChwZCwgcywgbik7CisgIH0KKyNlbmRpZiAvKiBQUFBPRV9TVVBQT1JUICovCisKKyNpZiBQUFBPU19TVVBQT1JUCisgIGhlYWRNQiA9IHBidWZfYWxsb2MoUEJVRl9SQVcsIDAsIFBCVUZfUE9PTCk7CisgIGlmIChoZWFkTUIgPT0gTlVMTCkgeworICAgIExJTktfU1RBVFNfSU5DKGxpbmsubWVtZXJyKTsKKyAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLnByb3RlcnIpOworICAgIHNubXBfaW5jX2lmb3V0ZGlzY2FyZHMoJnBjLT5uZXRpZik7CisgICAgcmV0dXJuIFBQUEVSUl9BTExPQzsKKyAgfQorCisgIHRhaWxNQiA9IGhlYWRNQjsKKworICAvKiBJZiB0aGUgbGluayBoYXMgYmVlbiBpZGxlLCB3ZSdsbCBzZW5kIGEgZnJlc2ggZmxhZyBjaGFyYWN0ZXIgdG8KKyAgICogZmx1c2ggYW55IG5vaXNlLiAqLworICBpZiAoKHN5c19qaWZmaWVzKCkgLSBwYy0+bGFzdFhNaXQpID49IFBQUF9NQVhJRExFRkxBRykgeworICAgIHRhaWxNQiA9IHBwcEFwcGVuZChQUFBfRkxBRywgdGFpbE1CLCBOVUxMKTsKKyAgfQorICBwYy0+bGFzdFhNaXQgPSBzeXNfamlmZmllcygpOworCisgIGZjc091dCA9IFBQUF9JTklURkNTOworICAvKiBMb2FkIG91dHB1dCBidWZmZXIuICovCisgIHdoaWxlIChuLS0gPiAwKSB7CisgICAgYyA9ICpzKys7CisKKyAgICAvKiBVcGRhdGUgRkNTIGJlZm9yZSBjaGVja2luZyBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzLiAqLworICAgIGZjc091dCA9IFBQUF9GQ1MoZmNzT3V0LCBjKTsKKworICAgIC8qIENvcHkgdG8gb3V0cHV0IGJ1ZmZlciBlc2NhcGluZyBzcGVjaWFsIGNoYXJhY3RlcnMuICovCisgICAgdGFpbE1CID0gcHBwQXBwZW5kKGMsIHRhaWxNQiwgJnBjLT5vdXRBQ0NNKTsKKyAgfQorICAgIAorICAvKiBBZGQgRkNTIGFuZCB0cmFpbGluZyBmbGFnLiAqLworICBjID0gfmZjc091dCAmIDB4RkY7CisgIHRhaWxNQiA9IHBwcEFwcGVuZChjLCB0YWlsTUIsICZwYy0+b3V0QUNDTSk7CisgIGMgPSAofmZjc091dCA+PiA4KSAmIDB4RkY7CisgIHRhaWxNQiA9IHBwcEFwcGVuZChjLCB0YWlsTUIsICZwYy0+b3V0QUNDTSk7CisgIHRhaWxNQiA9IHBwcEFwcGVuZChQUFBfRkxBRywgdGFpbE1CLCBOVUxMKTsKKworICAvKiBJZiB3ZSBmYWlsZWQgdG8gY29tcGxldGUgdGhlIHBhY2tldCwgdGhyb3cgaXQgYXdheS4KKyAgICogT3RoZXJ3aXNlIHNlbmQgaXQuICovCisgIGlmICghdGFpbE1CKSB7CisgICAgUFBQREVCVUcoTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgKCJwcHBXcml0ZVslZF06IEFsbG9jIGVyciAtIGRyb3BwaW5nIHBidWYgbGVuPSVkXG4iLCBwZCwgaGVhZE1CLT5sZW4pKTsKKyAgICAgICAgICAgLyoicHBwV3JpdGVbJWRdOiBBbGxvYyBlcnIgLSBkcm9wcGluZyAlZDolLipIIiwgcGQsIGhlYWRNQi0+bGVuLCBMV0lQX01JTihoZWFkTUItPmxlbiAqIDIsIDQwKSwgaGVhZE1CLT5wYXlsb2FkKSk7ICovCisgICAgcGJ1Zl9mcmVlKGhlYWRNQik7CisgICAgTElOS19TVEFUU19JTkMobGluay5tZW1lcnIpOworICAgIExJTktfU1RBVFNfSU5DKGxpbmsucHJvdGVycik7CisgICAgc25tcF9pbmNfaWZvdXRkaXNjYXJkcygmcGMtPm5ldGlmKTsKKyAgICByZXR1cm4gUFBQRVJSX0FMTE9DOworICB9CisKKyAgUFBQREVCVUcoTE9HX0lORk8sICgicHBwV3JpdGVbJWRdOiBsZW49JWRcbiIsIHBkLCBoZWFkTUItPmxlbikpOworICAgICAgICAgICAgICAgICAgIC8qICJwcHBXcml0ZVslZF06ICVkOiUuKkgiLCBwZCwgaGVhZE1CLT5sZW4sIExXSVBfTUlOKGhlYWRNQi0+bGVuICogMiwgNDApLCBoZWFkTUItPnBheWxvYWQpKTsgKi8KKyAgblB1dChwYywgaGVhZE1CKTsKKyNlbmRpZiAvKiBQUFBPU19TVVBQT1JUICovCisKKyAgcmV0dXJuIFBQUEVSUl9OT05FOworfQorCisvKgorICogcHBwX3NlbmRfY29uZmlnIC0gY29uZmlndXJlIHRoZSB0cmFuc21pdCBjaGFyYWN0ZXJpc3RpY3Mgb2YKKyAqIHRoZSBwcHAgaW50ZXJmYWNlLgorICovCit2b2lkCitwcHBfc2VuZF9jb25maWcoIGludCB1bml0LCB1MTZfdCBtdHUsIHUzMl90IGFzeW5jbWFwLCBpbnQgcGNvbXAsIGludCBhY2NvbXApCit7CisgIFBQUENvbnRyb2wgKnBjID0gJnBwcENvbnRyb2xbdW5pdF07CisgIGludCBpOworICAKKyAgcGMtPm10dSA9IG10dTsKKyAgcGMtPnBjb21wID0gcGNvbXA7CisgIHBjLT5hY2NvbXAgPSBhY2NvbXA7CisgIAorICAvKiBMb2FkIHRoZSBBQ0NNIGJpdHMgZm9yIHRoZSAzMiBjb250cm9sIGNvZGVzLiAqLworICBmb3IgKGkgPSAwOyBpIDwgMzIvODsgaSsrKSB7CisgICAgcGMtPm91dEFDQ01baV0gPSAodV9jaGFyKSgoYXN5bmNtYXAgPj4gKDggKiBpKSkgJiAweEZGKTsKKyAgfQorICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBfc2VuZF9jb25maWdbJWRdOiBvdXRBQ0NNPSVYICVYICVYICVYXG4iLAorICAgICAgICAgICAgdW5pdCwKKyAgICAgICAgICAgIHBjLT5vdXRBQ0NNWzBdLCBwYy0+b3V0QUNDTVsxXSwgcGMtPm91dEFDQ01bMl0sIHBjLT5vdXRBQ0NNWzNdKSk7Cit9CisKKworLyoKKyAqIHBwcF9zZXRfeGFjY20gLSBzZXQgdGhlIGV4dGVuZGVkIHRyYW5zbWl0IEFDQ00gZm9yIHRoZSBpbnRlcmZhY2UuCisgKi8KK3ZvaWQKK3BwcF9zZXRfeGFjY20oaW50IHVuaXQsIGV4dF9hY2NtICphY2NtKQoreworICBTTUVNQ1BZKHBwcENvbnRyb2xbdW5pdF0ub3V0QUNDTSwgYWNjbSwgc2l6ZW9mKGV4dF9hY2NtKSk7CisgIFBQUERFQlVHKExPR19JTkZPLCAoInBwcF9zZXRfeGFjY21bJWRdOiBvdXRBQ0NNPSVYICVYICVYICVYXG4iLAorICAgICAgICAgICAgdW5pdCwKKyAgICAgICAgICAgIHBwcENvbnRyb2xbdW5pdF0ub3V0QUNDTVswXSwKKyAgICAgICAgICAgIHBwcENvbnRyb2xbdW5pdF0ub3V0QUNDTVsxXSwKKyAgICAgICAgICAgIHBwcENvbnRyb2xbdW5pdF0ub3V0QUNDTVsyXSwKKyAgICAgICAgICAgIHBwcENvbnRyb2xbdW5pdF0ub3V0QUNDTVszXSkpOworfQorCisKKy8qCisgKiBwcHBfcmVjdl9jb25maWcgLSBjb25maWd1cmUgdGhlIHJlY2VpdmUtc2lkZSBjaGFyYWN0ZXJpc3RpY3Mgb2YKKyAqIHRoZSBwcHAgaW50ZXJmYWNlLgorICovCit2b2lkCitwcHBfcmVjdl9jb25maWcoIGludCB1bml0LCBpbnQgbXJ1LCB1MzJfdCBhc3luY21hcCwgaW50IHBjb21wLCBpbnQgYWNjb21wKQoreworICBQUFBDb250cm9sICpwYyA9ICZwcHBDb250cm9sW3VuaXRdOworICBpbnQgaTsKKyAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldik7CisKKyAgTFdJUF9VTlVTRURfQVJHKGFjY29tcCk7CisgIExXSVBfVU5VU0VEX0FSRyhwY29tcCk7CisgIExXSVBfVU5VU0VEX0FSRyhtcnUpOworCisgIC8qIExvYWQgdGhlIEFDQ00gYml0cyBmb3IgdGhlIDMyIGNvbnRyb2wgY29kZXMuICovCisgIFNZU19BUkNIX1BST1RFQ1QobGV2KTsKKyAgZm9yIChpID0gMDsgaSA8IDMyIC8gODsgaSsrKSB7CisgICAgLyogQHRvZG86IGRvZXMgdGhpcyB3b3JrPyBleHRfYWNjbSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIHBwcGQhICovCisgICAgcGMtPnJ4LmluQUNDTVtpXSA9ICh1X2NoYXIpKGFzeW5jbWFwID4+IChpICogOCkpOworICB9CisgIFNZU19BUkNIX1VOUFJPVEVDVChsZXYpOworICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBfcmVjdl9jb25maWdbJWRdOiBpbkFDQ009JVggJVggJVggJVhcbiIsCisgICAgICAgICAgICB1bml0LAorICAgICAgICAgICAgcGMtPnJ4LmluQUNDTVswXSwgcGMtPnJ4LmluQUNDTVsxXSwgcGMtPnJ4LmluQUNDTVsyXSwgcGMtPnJ4LmluQUNDTVszXSkpOworfQorCisjaWYgMAorLyoKKyAqIGNjcF90ZXN0IC0gYXNrIGtlcm5lbCB3aGV0aGVyIGEgZ2l2ZW4gY29tcHJlc3Npb24gbWV0aG9kCisgKiBpcyBhY2NlcHRhYmxlIGZvciB1c2UuICBSZXR1cm5zIDEgaWYgdGhlIG1ldGhvZCBhbmQgcGFyYW1ldGVycworICogYXJlIE9LLCAwIGlmIHRoZSBtZXRob2QgaXMga25vd24gYnV0IHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgT0sKKyAqIChlLmcuIGNvZGUgc2l6ZSBzaG91bGQgYmUgcmVkdWNlZCksIG9yIC0xIGlmIHRoZSBtZXRob2QgaXMgdW5rbm93bi4KKyAqLworaW50CitjY3BfdGVzdCggaW50IHVuaXQsIGludCBvcHRfbGVuLCAgaW50IGZvcl90cmFuc21pdCwgdV9jaGFyICpvcHRfcHRyKQoreworICByZXR1cm4gMDsgLyogWFhYIEN1cnJlbnRseSBubyBjb21wcmVzc2lvbi4gKi8KK30KKworLyoKKyAqIGNjcF9mbGFnc19zZXQgLSBpbmZvcm0ga2VybmVsIGFib3V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIENDUC4KKyAqLwordm9pZAorY2NwX2ZsYWdzX3NldChpbnQgdW5pdCwgaW50IGlzb3BlbiwgaW50IGlzdXApCit7CisgIC8qIFhYWCAqLworfQorCisvKgorICogY2NwX2ZhdGFsX2Vycm9yIC0gcmV0dXJucyAxIGlmIGRlY29tcHJlc3Npb24gd2FzIGRpc2FibGVkIGFzIGEKKyAqIHJlc3VsdCBvZiBhbiBlcnJvciBkZXRlY3RlZCBhZnRlciBkZWNvbXByZXNzaW9uIG9mIGEgcGFja2V0LAorICogMCBvdGhlcndpc2UuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHBhdGVudCBub25zZW5zZS4KKyAqLworaW50CitjY3BfZmF0YWxfZXJyb3IoaW50IHVuaXQpCit7CisgIC8qIFhYWCAqLworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogZ2V0X2lkbGVfdGltZSAtIHJldHVybiBob3cgbG9uZyB0aGUgbGluayBoYXMgYmVlbiBpZGxlLgorICovCitpbnQKK2dldF9pZGxlX3RpbWUoaW50IHUsIHN0cnVjdCBwcHBfaWRsZSAqaXApCit7CisgIC8qIFhYWCAqLworICBMV0lQX1VOVVNFRF9BUkcodSk7CisgIExXSVBfVU5VU0VEX0FSRyhpcCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFJldHVybiB1c2VyIHNwZWNpZmllZCBuZXRtYXNrLCBtb2RpZmllZCBieSBhbnkgbWFzayB3ZSBtaWdodCBkZXRlcm1pbmUKKyAqIGZvciBhZGRyZXNzIGBhZGRyJyAoaW4gbmV0d29yayBieXRlIG9yZGVyKS4KKyAqIEhlcmUgd2Ugc2NhbiB0aHJvdWdoIHRoZSBzeXN0ZW0ncyBsaXN0IG9mIGludGVyZmFjZXMsIGxvb2tpbmcgZm9yCisgKiBhbnkgbm9uLXBvaW50LXRvLXBvaW50IGludGVyZmFjZXMgd2hpY2ggbWlnaHQgYXBwZWFyIHRvIGJlIG9uIHRoZSBzYW1lCisgKiBuZXR3b3JrIGFzIGBhZGRyJy4gIElmIHdlIGZpbmQgYW55LCB3ZSBPUiBpbiB0aGVpciBuZXRtYXNrIHRvIHRoZQorICogdXNlci1zcGVjaWZpZWQgbmV0bWFzay4KKyAqLwordTMyX3QKK0dldE1hc2sodTMyX3QgYWRkcikKK3sKKyAgdTMyX3QgbWFzaywgbm1hc2s7CisKKyAgaHRvbmwoYWRkcik7CisgIGlmIChJUF9DTEFTU0EoYWRkcikpIHsgLyogZGV0ZXJtaW5lIG5ldHdvcmsgbWFzayBmb3IgYWRkcmVzcyBjbGFzcyAqLworICAgIG5tYXNrID0gSVBfQ0xBU1NBX05FVDsKKyAgfSBlbHNlIGlmIChJUF9DTEFTU0IoYWRkcikpIHsKKyAgICBubWFzayA9IElQX0NMQVNTQl9ORVQ7CisgIH0gZWxzZSB7IAorICAgIG5tYXNrID0gSVBfQ0xBU1NDX05FVDsKKyAgfQorCisgIC8qIGNsYXNzIEQgbmV0cyBhcmUgZGlzYWxsb3dlZCBieSBiYWRfaXBfYWRycyAqLworICBtYXNrID0gc3VibmV0TWFzayB8IGh0b25sKG5tYXNrKTsKKyAgCisgIC8qIFhYWAorICAgKiBTY2FuIHRocm91Z2ggdGhlIHN5c3RlbSdzIG5ldHdvcmsgaW50ZXJmYWNlcy4KKyAgICogR2V0IGVhY2ggbmV0bWFzayBhbmQgT1IgdGhlbSBpbnRvIG91ciBtYXNrLgorICAgKi8KKworICByZXR1cm4gbWFzazsKK30KKworLyoKKyAqIHNpZnZqY29tcCAtIGNvbmZpZyB0Y3AgaGVhZGVyIGNvbXByZXNzaW9uCisgKi8KK2ludAorc2lmdmpjb21wKGludCBwZCwgaW50IHZqY29tcCwgdThfdCBjaWRjb21wLCB1OF90IG1heGNpZCkKK3sKKyNpZiBQUFBPU19TVVBQT1JUICYmIFZKX1NVUFBPUlQKKyAgUFBQQ29udHJvbCAqcGMgPSAmcHBwQ29udHJvbFtwZF07CisgIAorICBwYy0+dmpFbmFibGVkID0gdmpjb21wOworICBwYy0+dmpDb21wLmNvbXByZXNzU2xvdCA9IGNpZGNvbXA7CisgIHBjLT52akNvbXAubWF4U2xvdEluZGV4ID0gbWF4Y2lkOworICBQUFBERUJVRyhMT0dfSU5GTywgKCJzaWZ2amNvbXA6IFZKIGNvbXByZXNzIGVuYWJsZT0lZCBzbG90PSVkIG1heCBzbG90PSVkXG4iLAorICAgICAgICAgICAgdmpjb21wLCBjaWRjb21wLCBtYXhjaWQpKTsKKyNlbHNlIC8qIFBQUE9TX1NVUFBPUlQgJiYgVkpfU1VQUE9SVCAqLworICBMV0lQX1VOVVNFRF9BUkcocGQpOworICBMV0lQX1VOVVNFRF9BUkcodmpjb21wKTsKKyAgTFdJUF9VTlVTRURfQVJHKGNpZGNvbXApOworICBMV0lQX1VOVVNFRF9BUkcobWF4Y2lkKTsKKyNlbmRpZiAvKiBQUFBPU19TVVBQT1JUICYmIFZKX1NVUFBPUlQgKi8KKworICByZXR1cm4gMDsKK30KKworLyoKKyAqIHBwcGlmTmV0aWZJbml0IC0gbmV0aWYgaW5pdCBjYWxsYmFjaworICovCitzdGF0aWMgZXJyX3QKK3BwcGlmTmV0aWZJbml0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIG5ldGlmLT5uYW1lWzBdID0gJ3AnOworICBuZXRpZi0+bmFtZVsxXSA9ICdwJzsKKyAgbmV0aWYtPm91dHB1dCA9IHBwcGlmT3V0cHV0OworICBuZXRpZi0+bXR1ID0gcHBwTVRVKChpbnQpKHNpemVfdCluZXRpZi0+c3RhdGUpOworICBuZXRpZi0+ZmxhZ3MgPSBORVRJRl9GTEFHX1BPSU5UVE9QT0lOVCB8IE5FVElGX0ZMQUdfTElOS19VUDsKKyNpZiBMV0lQX05FVElGX0hPU1ROQU1FCisgIC8qIEB0b2RvOiBJbml0aWFsaXplIGludGVyZmFjZSBob3N0bmFtZSAqLworICAvKiBuZXRpZl9zZXRfaG9zdG5hbWUobmV0aWYsICJsd2lwIik7ICovCisjZW5kaWYgLyogTFdJUF9ORVRJRl9IT1NUTkFNRSAqLworICByZXR1cm4gRVJSX09LOworfQorCisKKy8qCisgKiBzaWZ1cCAtIENvbmZpZyB0aGUgaW50ZXJmYWNlIHVwIGFuZCBlbmFibGUgSVAgcGFja2V0cyB0byBwYXNzLgorICovCitpbnQKK3NpZnVwKGludCBwZCkKK3sKKyAgUFBQQ29udHJvbCAqcGMgPSAmcHBwQ29udHJvbFtwZF07CisgIGludCBzdCA9IDE7CisgIAorICBpZiAocGQgPCAwIHx8IHBkID49IE5VTV9QUFAgfHwgIXBjLT5vcGVuRmxhZykgeworICAgIHN0ID0gMDsKKyAgICBQUFBERUJVRyhMT0dfV0FSTklORywgKCJzaWZ1cFslZF06IGJhZCBwYXJtc1xuIiwgcGQpKTsKKyAgfSBlbHNlIHsKKyAgICBuZXRpZl9yZW1vdmUoJnBjLT5uZXRpZik7CisgICAgaWYgKG5ldGlmX2FkZCgmcGMtPm5ldGlmLCAmcGMtPmFkZHJzLm91cl9pcGFkZHIsICZwYy0+YWRkcnMubmV0bWFzaywKKyAgICAgICAgICAgICAgICAgICZwYy0+YWRkcnMuaGlzX2lwYWRkciwgKHZvaWQgKikoc2l6ZV90KXBkLCBwcHBpZk5ldGlmSW5pdCwgaXBfaW5wdXQpKSB7CisgICAgICBuZXRpZl9zZXRfdXAoJnBjLT5uZXRpZik7CisgICAgICBwYy0+aWZfdXAgPSAxOworICAgICAgcGMtPmVyckNvZGUgPSBQUFBFUlJfTk9ORTsKKworICAgICAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInNpZnVwOiB1bml0ICVkOiBsaW5rU3RhdHVzQ0I9JXAgZXJyQ29kZT0lZFxuIiwgcGQsIHBjLT5saW5rU3RhdHVzQ0IsIHBjLT5lcnJDb2RlKSk7CisgICAgICBpZiAocGMtPmxpbmtTdGF0dXNDQikgeworICAgICAgICBwYy0+bGlua1N0YXR1c0NCKHBjLT5saW5rU3RhdHVzQ3R4LCBwYy0+ZXJyQ29kZSwgJnBjLT5hZGRycyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ID0gMDsKKyAgICAgIFBQUERFQlVHKExPR19FUlIsICgic2lmdXBbJWRdOiBuZXRpZl9hZGQgZmFpbGVkXG4iLCBwZCkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdDsKK30KKworLyoKKyAqIHNpZm5wbW9kZSAtIFNldCB0aGUgbW9kZSBmb3IgaGFuZGxpbmcgcGFja2V0cyBmb3IgYSBnaXZlbiBOUC4KKyAqLworaW50CitzaWZucG1vZGUoaW50IHUsIGludCBwcm90bywgZW51bSBOUG1vZGUgbW9kZSkKK3sKKyAgTFdJUF9VTlVTRURfQVJHKHUpOworICBMV0lQX1VOVVNFRF9BUkcocHJvdG8pOworICBMV0lQX1VOVVNFRF9BUkcobW9kZSk7CisgIHJldHVybiAwOworfQorCisvKgorICogc2lmZG93biAtIENvbmZpZyB0aGUgaW50ZXJmYWNlIGRvd24gYW5kIGRpc2FibGUgSVAuCisgKi8KK2ludAorc2lmZG93bihpbnQgcGQpCit7CisgIFBQUENvbnRyb2wgKnBjID0gJnBwcENvbnRyb2xbcGRdOworICBpbnQgc3QgPSAxOworICAKKyAgaWYgKHBkIDwgMCB8fCBwZCA+PSBOVU1fUFBQIHx8ICFwYy0+b3BlbkZsYWcpIHsKKyAgICBzdCA9IDA7CisgICAgUFBQREVCVUcoTE9HX1dBUk5JTkcsICgic2lmZG93blslZF06IGJhZCBwYXJtc1xuIiwgcGQpKTsKKyAgfSBlbHNlIHsKKyAgICBwYy0+aWZfdXAgPSAwOworICAgIC8qIG1ha2Ugc3VyZSB0aGUgbmV0aWYgc3RhdHVzIGNhbGxiYWNrIGlzIGNhbGxlZCAqLworICAgIG5ldGlmX3NldF9kb3duKCZwYy0+bmV0aWYpOworICAgIG5ldGlmX3JlbW92ZSgmcGMtPm5ldGlmKTsKKyAgICBQUFBERUJVRyhMT0dfREVCVUcsICgic2lmZG93bjogdW5pdCAlZDogbGlua1N0YXR1c0NCPSVwIGVyckNvZGU9JWRcbiIsIHBkLCBwYy0+bGlua1N0YXR1c0NCLCBwYy0+ZXJyQ29kZSkpOworICAgIGlmIChwYy0+bGlua1N0YXR1c0NCKSB7CisgICAgICBwYy0+bGlua1N0YXR1c0NCKHBjLT5saW5rU3RhdHVzQ3R4LCBQUFBFUlJfQ09OTkVDVCwgTlVMTCk7CisgICAgfQorICB9CisgIHJldHVybiBzdDsKK30KKworLyoqCisgKiBzaWZhZGRyIC0gQ29uZmlnIHRoZSBpbnRlcmZhY2UgSVAgYWRkcmVzc2VzIGFuZCBuZXRtYXNrLgorICogQHBhcmFtIHBkIEludGVyZmFjZSB1bml0ID8/PworICogQHBhcmFtIG8gT3VyIElQIGFkZHJlc3MgPz8/CisgKiBAcGFyYW0gaCBIaXMgSVAgYWRkcmVzcyA/Pz8KKyAqIEBwYXJhbSBtIElQIHN1Ym5ldCBtYXNrID8/PworICogQHBhcmFtIG5zMSBQcmltYXJ5IEROUworICogQHBhcmFtIG5zMiBTZWNvbmRhcnkgRE5TCisgKi8KK2ludAorc2lmYWRkciggaW50IHBkLCB1MzJfdCBvLCB1MzJfdCBoLCB1MzJfdCBtLCB1MzJfdCBuczEsIHUzMl90IG5zMikKK3sKKyAgUFBQQ29udHJvbCAqcGMgPSAmcHBwQ29udHJvbFtwZF07CisgIGludCBzdCA9IDE7CisgIAorICBpZiAocGQgPCAwIHx8IHBkID49IE5VTV9QUFAgfHwgIXBjLT5vcGVuRmxhZykgeworICAgIHN0ID0gMDsKKyAgICBQUFBERUJVRyhMT0dfV0FSTklORywgKCJzaWZ1cFslZF06IGJhZCBwYXJtc1xuIiwgcGQpKTsKKyAgfSBlbHNlIHsKKyAgICBTTUVNQ1BZKCZwYy0+YWRkcnMub3VyX2lwYWRkciwgJm8sIHNpemVvZihvKSk7CisgICAgU01FTUNQWSgmcGMtPmFkZHJzLmhpc19pcGFkZHIsICZoLCBzaXplb2YoaCkpOworICAgIFNNRU1DUFkoJnBjLT5hZGRycy5uZXRtYXNrLCAmbSwgc2l6ZW9mKG0pKTsKKyAgICBTTUVNQ1BZKCZwYy0+YWRkcnMuZG5zMSwgJm5zMSwgc2l6ZW9mKG5zMSkpOworICAgIFNNRU1DUFkoJnBjLT5hZGRycy5kbnMyLCAmbnMyLCBzaXplb2YobnMyKSk7CisgIH0KKyAgcmV0dXJuIHN0OworfQorCisvKioKKyAqIGNpZmFkZHIgLSBDbGVhciB0aGUgaW50ZXJmYWNlIElQIGFkZHJlc3NlcywgYW5kIGRlbGV0ZSByb3V0ZXMKKyAqIHRocm91Z2ggdGhlIGludGVyZmFjZSBpZiBwb3NzaWJsZS4KKyAqIEBwYXJhbSBwZCBJbnRlcmZhY2UgdW5pdCA/Pz8KKyAqIEBwYXJhbSBvIE91ciBJUCBhZGRyZXNzID8/PworICogQHBhcmFtIGggSVAgYnJvYWRjYXN0IGFkZHJlc3MgPz8/CisgKi8KK2ludAorY2lmYWRkciggaW50IHBkLCB1MzJfdCBvLCB1MzJfdCBoKQoreworICBQUFBDb250cm9sICpwYyA9ICZwcHBDb250cm9sW3BkXTsKKyAgaW50IHN0ID0gMTsKKyAgCisgIExXSVBfVU5VU0VEX0FSRyhvKTsKKyAgTFdJUF9VTlVTRURfQVJHKGgpOworICBpZiAocGQgPCAwIHx8IHBkID49IE5VTV9QUFAgfHwgIXBjLT5vcGVuRmxhZykgeworICAgIHN0ID0gMDsKKyAgICBQUFBERUJVRyhMT0dfV0FSTklORywgKCJzaWZ1cFslZF06IGJhZCBwYXJtc1xuIiwgcGQpKTsKKyAgfSBlbHNlIHsKKyAgICBJUDRfQUREUigmcGMtPmFkZHJzLm91cl9pcGFkZHIsIDAsMCwwLDApOworICAgIElQNF9BRERSKCZwYy0+YWRkcnMuaGlzX2lwYWRkciwgMCwwLDAsMCk7CisgICAgSVA0X0FERFIoJnBjLT5hZGRycy5uZXRtYXNrLCAyNTUsMjU1LDI1NSwwKTsKKyAgICBJUDRfQUREUigmcGMtPmFkZHJzLmRuczEsIDAsMCwwLDApOworICAgIElQNF9BRERSKCZwYy0+YWRkcnMuZG5zMiwgMCwwLDAsMCk7CisgIH0KKyAgcmV0dXJuIHN0OworfQorCisvKgorICogc2lmZGVmYXVsdHJvdXRlIC0gYXNzaWduIGEgZGVmYXVsdCByb3V0ZSB0aHJvdWdoIHRoZSBhZGRyZXNzIGdpdmVuLgorICovCitpbnQKK3NpZmRlZmF1bHRyb3V0ZShpbnQgcGQsIHUzMl90IGwsIHUzMl90IGcpCit7CisgIFBQUENvbnRyb2wgKnBjID0gJnBwcENvbnRyb2xbcGRdOworICBpbnQgc3QgPSAxOworCisgIExXSVBfVU5VU0VEX0FSRyhsKTsKKyAgTFdJUF9VTlVTRURfQVJHKGcpOworCisgIGlmIChwZCA8IDAgfHwgcGQgPj0gTlVNX1BQUCB8fCAhcGMtPm9wZW5GbGFnKSB7CisgICAgc3QgPSAwOworICAgIFBQUERFQlVHKExPR19XQVJOSU5HLCAoInNpZnVwWyVkXTogYmFkIHBhcm1zXG4iLCBwZCkpOworICB9IGVsc2UgeworICAgIG5ldGlmX3NldF9kZWZhdWx0KCZwYy0+bmV0aWYpOworICB9CisKKyAgLyogVE9ETzogY2hlY2sgaG93IFBQUCBoYW5kbGVkIHRoZSBuZXRNYXNrLCBwcmV2aW91c2x5IG5vdCBzZXQgYnkgaXBTZXREZWZhdWx0ICovCisKKyAgcmV0dXJuIHN0OworfQorCisvKgorICogY2lmZGVmYXVsdHJvdXRlIC0gZGVsZXRlIGEgZGVmYXVsdCByb3V0ZSB0aHJvdWdoIHRoZSBhZGRyZXNzIGdpdmVuLgorICovCitpbnQKK2NpZmRlZmF1bHRyb3V0ZShpbnQgcGQsIHUzMl90IGwsIHUzMl90IGcpCit7CisgIFBQUENvbnRyb2wgKnBjID0gJnBwcENvbnRyb2xbcGRdOworICBpbnQgc3QgPSAxOworCisgIExXSVBfVU5VU0VEX0FSRyhsKTsKKyAgTFdJUF9VTlVTRURfQVJHKGcpOworCisgIGlmIChwZCA8IDAgfHwgcGQgPj0gTlVNX1BQUCB8fCAhcGMtPm9wZW5GbGFnKSB7CisgICAgc3QgPSAwOworICAgIFBQUERFQlVHKExPR19XQVJOSU5HLCAoInNpZnVwWyVkXTogYmFkIHBhcm1zXG4iLCBwZCkpOworICB9IGVsc2UgeworICAgIG5ldGlmX3NldF9kZWZhdWx0KE5VTEwpOworICB9CisKKyAgcmV0dXJuIHN0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBQUFBPU19TVVBQT1JUICYmIFBQUF9JTlBST0NfT1dOVEhSRUFECisvKiBUaGUgbWFpbiBQUFAgcHJvY2VzcyBmdW5jdGlvbi4gIFRoaXMgaW1wbGVtZW50cyB0aGUgc3RhdGUgbWFjaGluZSBhY2NvcmRpbmcKKyAqIHRvIHNlY3Rpb24gNCBvZiBSRkMgMTY2MTogVGhlIFBvaW50LVRvLVBvaW50IFByb3RvY29sLiAqLworc3RhdGljIHZvaWQKK3BwcElucHV0VGhyZWFkKHZvaWQgKmFyZykKK3sKKyAgaW50IGNvdW50OworICBQUFBDb250cm9sUnggKnBjcnggPSBhcmc7CisKKyAgd2hpbGUgKGxjcF9waGFzZVtwY3J4LT5wZF0gIT0gUEhBU0VfREVBRCkgeworICAgIGNvdW50ID0gc2lvX3JlYWQocGNyeC0+ZmQsIHBjcngtPnJ4YnVmLCBQUFBPU19SWF9CVUZTSVpFKTsKKyAgICBpZihjb3VudCA+IDApIHsKKyAgICAgIHBwcEluUHJvYyhwY3J4LCBwY3J4LT5yeGJ1ZiwgY291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBub3RoaW5nIHJlY2VpdmVkLCBnaXZlIG90aGVyIHRhc2tzIGEgY2hhbmNlIHRvIHJ1biAqLworICAgICAgc3lzX21zbGVlcCgxKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZiAvKiBQUFBPU19TVVBQT1JUICYmIFBQUF9JTlBST0NfT1dOVEhSRUFEICovCisKKyNpZiBQUFBPRV9TVVBQT1JUCisKK3ZvaWQKK3BwcE92ZXJFdGhlcm5ldEluaXRGYWlsZWQoaW50IHBkKQoreworICBQUFBDb250cm9sKiBwYzsKKworICBwcHBIdXAocGQpOworICBwcHBTdG9wKHBkKTsKKworICBwYyA9ICZwcHBDb250cm9sW3BkXTsKKyAgcHBwb2VfZGVzdHJveSgmcGMtPm5ldGlmKTsKKyAgcGMtPm9wZW5GbGFnID0gMDsKKworICBpZihwYy0+bGlua1N0YXR1c0NCKSB7CisgICAgcGMtPmxpbmtTdGF0dXNDQihwYy0+bGlua1N0YXR1c0N0eCwgcGMtPmVyckNvZGUgPyBwYy0+ZXJyQ29kZSA6IFBQUEVSUl9QUk9UT0NPTCwgTlVMTCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3BwcE92ZXJFdGhlcm5ldExpbmtTdGF0dXNDQihpbnQgcGQsIGludCB1cCkKK3sKKyAgaWYodXApIHsKKyAgICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBPdmVyRXRoZXJuZXRMaW5rU3RhdHVzQ0I6IHVuaXQgJWQ6IENvbm5lY3RpbmdcbiIsIHBkKSk7CisgICAgcHBwU3RhcnQocGQpOworICB9IGVsc2UgeworICAgIHBwcE92ZXJFdGhlcm5ldEluaXRGYWlsZWQocGQpOworICB9Cit9CisjZW5kaWYgLyogUFBQT0VfU1VQUE9SVCAqLworCitzdHJ1Y3QgcGJ1ZiAqCitwcHBTaW5nbGVCdWYoc3RydWN0IHBidWYgKnApCit7CisgIHN0cnVjdCBwYnVmICpxLCAqYjsKKyAgdV9jaGFyICpwbDsKKworICBpZihwLT50b3RfbGVuID09IHAtPmxlbikgeworICAgIHJldHVybiBwOworICB9CisKKyAgcSA9IHBidWZfYWxsb2MoUEJVRl9SQVcsIHAtPnRvdF9sZW4sIFBCVUZfUkFNKTsKKyAgaWYoIXEpIHsKKyAgICBQUFBERUJVRyhMT0dfRVJSLAorICAgICAgICAgICAgICgicHBwU2luZ2xlQnVmOiB1bmFibGUgdG8gYWxsb2MgbmV3IGJ1ZiAoJWQpXG4iLCBwLT50b3RfbGVuKSk7CisgICAgcmV0dXJuIHA7IC8qIGxpdmUgZGFuZ2Vyb3VzbHkgKi8KKyAgfQorCisgIGZvcihiID0gcCwgcGwgPSBxLT5wYXlsb2FkOyBiICE9IE5VTEw7IGIgPSBiLT5uZXh0KSB7CisgICAgTUVNQ1BZKHBsLCBiLT5wYXlsb2FkLCBiLT5sZW4pOworICAgIHBsICs9IGItPmxlbjsKKyAgfQorCisgIHBidWZfZnJlZShwKTsKKworICByZXR1cm4gcTsKK30KKworc3RydWN0IHBwcElucHV0SGVhZGVyIHsKKyAgaW50IHVuaXQ7CisgIHUxNl90IHByb3RvOworfTsKKworLyoKKyAqIFBhc3MgdGhlIHByb2Nlc3NlZCBpbnB1dCBwYWNrZXQgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIuCisgKiBUaGlzIGZ1bmN0aW9uIGFuZCBhbGwgaGFuZGxlcnMgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0Y3BpcF90aHJlYWQKKyAqLworc3RhdGljIHZvaWQKK3BwcElucHV0KHZvaWQgKmFyZykKK3sKKyAgc3RydWN0IHBidWYgKm5iID0gKHN0cnVjdCBwYnVmICopYXJnOworICB1MTZfdCBwcm90b2NvbDsKKyAgaW50IHBkOworCisgIHBkID0gKChzdHJ1Y3QgcHBwSW5wdXRIZWFkZXIgKiluYi0+cGF5bG9hZCktPnVuaXQ7CisgIHByb3RvY29sID0gKChzdHJ1Y3QgcHBwSW5wdXRIZWFkZXIgKiluYi0+cGF5bG9hZCktPnByb3RvOworICAgIAorICBpZihwYnVmX2hlYWRlcihuYiwgLShpbnQpc2l6ZW9mKHN0cnVjdCBwcHBJbnB1dEhlYWRlcikpKSB7CisgICAgTFdJUF9BU1NFUlQoInBidWZfaGVhZGVyIGZhaWxlZFxuIiwgMCk7CisgICAgZ290byBkcm9wOworICB9CisKKyAgTElOS19TVEFUU19JTkMobGluay5yZWN2KTsKKyAgc25tcF9pbmNfaWZpbnVjYXN0cGt0cygmcHBwQ29udHJvbFtwZF0ubmV0aWYpOworICBzbm1wX2FkZF9pZmlub2N0ZXRzKCZwcHBDb250cm9sW3BkXS5uZXRpZiwgbmItPnRvdF9sZW4pOworCisgIC8qCisgICAqIFRvc3MgYWxsIG5vbi1MQ1AgcGFja2V0cyB1bmxlc3MgTENQIGlzIE9QRU4uCisgICAqIFVudGlsIHdlIGdldCBwYXN0IHRoZSBhdXRoZW50aWNhdGlvbiBwaGFzZSwgdG9zcyBhbGwgcGFja2V0cworICAgKiBleGNlcHQgTENQLCBMUVIgYW5kIGF1dGhlbnRpY2F0aW9uIHBhY2tldHMuCisgICAqLworICBpZigobGNwX3BoYXNlW3BkXSA8PSBQSEFTRV9BVVRIRU5USUNBVEUpICYmIChwcm90b2NvbCAhPSBQUFBfTENQKSkgeworICAgIGlmKCEoKHByb3RvY29sID09IFBQUF9MUVIpIHx8IChwcm90b2NvbCA9PSBQUFBfUEFQKSB8fCAocHJvdG9jb2wgPT0gUFBQX0NIQVApKSB8fAorICAgICAgICAobGNwX3BoYXNlW3BkXSAhPSBQSEFTRV9BVVRIRU5USUNBVEUpKSB7CisgICAgICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBJbnB1dDogZGlzY2FyZGluZyBwcm90byAweCUiWDE2X0YiIGluIHBoYXNlICVkXG4iLCBwcm90b2NvbCwgbGNwX3BoYXNlW3BkXSkpOworICAgICAgZ290byBkcm9wOworICAgIH0KKyAgfQorCisgIHN3aXRjaChwcm90b2NvbCkgeworICAgIGNhc2UgUFBQX1ZKQ19DT01QOiAgICAgIC8qIFZKIGNvbXByZXNzZWQgVENQICovCisjaWYgUFBQT1NfU1VQUE9SVCAmJiBWSl9TVVBQT1JUCisgICAgICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBJbnB1dFslZF06IHZqX2NvbXAgaW4gcGJ1ZiBsZW49JWRcbiIsIHBkLCBuYi0+bGVuKSk7CisgICAgICAvKgorICAgICAgICogQ2xpcCBvZmYgdGhlIFZKIGhlYWRlciBhbmQgcHJlcGVuZCB0aGUgcmVidWlsdCBUQ1AvSVAgaGVhZGVyIGFuZAorICAgICAgICogcGFzcyB0aGUgcmVzdWx0IHRvIElQLgorICAgICAgICovCisgICAgICBpZiAoKHZqX3VuY29tcHJlc3NfdGNwKCZuYiwgJnBwcENvbnRyb2xbcGRdLnZqQ29tcCkgPj0gMCkgJiYgKHBwcENvbnRyb2xbcGRdLm5ldGlmLmlucHV0KSkgeworICAgICAgICBwcHBDb250cm9sW3BkXS5uZXRpZi5pbnB1dChuYiwgJnBwcENvbnRyb2xbcGRdLm5ldGlmKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogU29tZXRoaW5nJ3Mgd3Jvbmcgc28gZHJvcCBpdC4gKi8KKyAgICAgIFBQUERFQlVHKExPR19XQVJOSU5HLCAoInBwcElucHV0WyVkXTogRHJvcHBpbmcgVkogY29tcHJlc3NlZFxuIiwgcGQpKTsKKyNlbHNlICAvKiBQUFBPU19TVVBQT1JUICYmIFZKX1NVUFBPUlQgKi8KKyAgICAgIC8qIE5vIGhhbmRsZXIgZm9yIHRoaXMgcHJvdG9jb2wgc28gZHJvcCB0aGUgcGFja2V0LiAqLworICAgICAgUFBQREVCVUcoTE9HX0lORk8sICgicHBwSW5wdXRbJWRdOiBkcm9wIFZKIENvbXAgaW4gJWQ6JXNcbiIsIHBkLCBuYi0+bGVuLCBuYi0+cGF5bG9hZCkpOworI2VuZGlmIC8qIFBQUE9TX1NVUFBPUlQgJiYgVkpfU1VQUE9SVCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBQUF9WSkNfVU5DT01QOiAgICAvKiBWSiB1bmNvbXByZXNzZWQgVENQICovCisjaWYgUFBQT1NfU1VQUE9SVCAmJiBWSl9TVVBQT1JUCisgICAgICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBJbnB1dFslZF06IHZqX3VuIGluIHBidWYgbGVuPSVkXG4iLCBwZCwgbmItPmxlbikpOworICAgICAgLyoKKyAgICAgICAqIFByb2Nlc3MgdGhlIFRDUC9JUCBoZWFkZXIgZm9yIFZKIGhlYWRlciBjb21wcmVzc2lvbiBhbmQgdGhlbiBwYXNzCisgICAgICAgKiB0aGUgcGFja2V0IHRvIElQLgorICAgICAgICovCisgICAgICBpZiAoKHZqX3VuY29tcHJlc3NfdW5jb21wKG5iLCAmcHBwQ29udHJvbFtwZF0udmpDb21wKSA+PSAwKSAmJiBwcHBDb250cm9sW3BkXS5uZXRpZi5pbnB1dCkgeworICAgICAgICBwcHBDb250cm9sW3BkXS5uZXRpZi5pbnB1dChuYiwgJnBwcENvbnRyb2xbcGRdLm5ldGlmKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogU29tZXRoaW5nJ3Mgd3Jvbmcgc28gZHJvcCBpdC4gKi8KKyAgICAgIFBQUERFQlVHKExPR19XQVJOSU5HLCAoInBwcElucHV0WyVkXTogRHJvcHBpbmcgVkogdW5jb21wcmVzc2VkXG4iLCBwZCkpOworI2Vsc2UgIC8qIFBQUE9TX1NVUFBPUlQgJiYgVkpfU1VQUE9SVCAqLworICAgICAgLyogTm8gaGFuZGxlciBmb3IgdGhpcyBwcm90b2NvbCBzbyBkcm9wIHRoZSBwYWNrZXQuICovCisgICAgICBQUFBERUJVRyhMT0dfSU5GTywKKyAgICAgICAgICAgICAgICgicHBwSW5wdXRbJWRdOiBkcm9wIFZKIFVuQ29tcCBpbiAlZDouKkhcbiIsIAorICAgICAgICAgICAgICAgIHBkLCBuYi0+bGVuLCBMV0lQX01JTihuYi0+bGVuICogMiwgNDApLCBuYi0+cGF5bG9hZCkpOworI2VuZGlmIC8qIFBQUE9TX1NVUFBPUlQgJiYgVkpfU1VQUE9SVCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBQUF9JUDogICAgICAgICAgICAvKiBJbnRlcm5ldCBQcm90b2NvbCAqLworICAgICAgUFBQREVCVUcoTE9HX0lORk8sICgicHBwSW5wdXRbJWRdOiBpcCBpbiBwYnVmIGxlbj0lZFxuIiwgcGQsIG5iLT5sZW4pKTsKKyAgICAgIGlmIChwcHBDb250cm9sW3BkXS5uZXRpZi5pbnB1dCkgeworICAgICAgICBwcHBDb250cm9sW3BkXS5uZXRpZi5pbnB1dChuYiwgJnBwcENvbnRyb2xbcGRdLm5ldGlmKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiB7CisgICAgICBzdHJ1Y3QgcHJvdGVudCAqcHJvdHA7CisgICAgICBpbnQgaTsKKworICAgICAgLyoKKyAgICAgICAqIFVwY2FsbCB0aGUgcHJvcGVyIHByb3RvY29sIGlucHV0IHJvdXRpbmUuCisgICAgICAgKi8KKyAgICAgIGZvciAoaSA9IDA7IChwcm90cCA9IHBwcF9wcm90b2NvbHNbaV0pICE9IE5VTEw7ICsraSkgeworICAgICAgICBpZiAocHJvdHAtPnByb3RvY29sID09IHByb3RvY29sICYmIHByb3RwLT5lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBJbnB1dFslZF06ICVzIGxlbj0lZFxuIiwgcGQsIHByb3RwLT5uYW1lLCBuYi0+bGVuKSk7CisgICAgICAgICAgbmIgPSBwcHBTaW5nbGVCdWYobmIpOworICAgICAgICAgICgqcHJvdHAtPmlucHV0KShwZCwgbmItPnBheWxvYWQsIG5iLT5sZW4pOworICAgICAgICAgIFBQUERFQlVHKExPR19ERVRBSUwsICgicHBwSW5wdXRbJWRdOiBwYWNrZXQgcHJvY2Vzc2VkXG4iLCBwZCkpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIE5vIGhhbmRsZXIgZm9yIHRoaXMgcHJvdG9jb2wgc28gcmVqZWN0IHRoZSBwYWNrZXQuICovCisgICAgICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBJbnB1dFslZF06IHJlamVjdGluZyB1bnN1cHBvcnRlZCBwcm90byAweCUiWDE2X0YiIGxlbj0lZFxuIiwgcGQsIHByb3RvY29sLCBuYi0+bGVuKSk7CisgICAgICBpZiAocGJ1Zl9oZWFkZXIobmIsIHNpemVvZihwcm90b2NvbCkpKSB7CisgICAgICAgIExXSVBfQVNTRVJUKCJwYnVmX2hlYWRlciBmYWlsZWRcbiIsIDApOworICAgICAgICBnb3RvIGRyb3A7CisgICAgICB9CisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCisgICAgICBwcm90b2NvbCA9IGh0b25zKHByb3RvY29sKTsKKyNlbmRpZiAvKiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4gKi8KKyAgICAgIFNNRU1DUFkobmItPnBheWxvYWQsICZwcm90b2NvbCwgc2l6ZW9mKHByb3RvY29sKSk7CisgICAgICBsY3Bfc3Byb3RyZWoocGQsIG5iLT5wYXlsb2FkLCBuYi0+bGVuKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworZHJvcDoKKyAgTElOS19TVEFUU19JTkMobGluay5kcm9wKTsKKyAgc25tcF9pbmNfaWZpbmRpc2NhcmRzKCZwcHBDb250cm9sW3BkXS5uZXRpZik7CisKK291dDoKKyAgcGJ1Zl9mcmVlKG5iKTsKKyAgcmV0dXJuOworfQorCisjaWYgUFBQT1NfU1VQUE9SVAorLyoKKyAqIERyb3AgdGhlIGlucHV0IHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQKK3BwcERyb3AoUFBQQ29udHJvbFJ4ICpwY3J4KQoreworICBpZiAocGNyeC0+aW5IZWFkICE9IE5VTEwpIHsKKyNpZiAwCisgICAgUFBQREVCVUcoTE9HX0lORk8sICgicHBwRHJvcDogJWQ6JS4qSFxuIiwgcGNyeC0+aW5IZWFkLT5sZW4sIG1pbig2MCwgcGNyeC0+aW5IZWFkLT5sZW4gKiAyKSwgcGNyeC0+aW5IZWFkLT5wYXlsb2FkKSk7CisjZW5kaWYKKyAgICBQUFBERUJVRyhMT0dfSU5GTywgKCJwcHBEcm9wOiBwYnVmIGxlbj0lZCwgYWRkciAlcFxuIiwgcGNyeC0+aW5IZWFkLT5sZW4sICh2b2lkKilwY3J4LT5pbkhlYWQpKTsKKyAgICBpZiAocGNyeC0+aW5UYWlsICYmIChwY3J4LT5pblRhaWwgIT0gcGNyeC0+aW5IZWFkKSkgeworICAgICAgcGJ1Zl9mcmVlKHBjcngtPmluVGFpbCk7CisgICAgfQorICAgIHBidWZfZnJlZShwY3J4LT5pbkhlYWQpOworICAgIHBjcngtPmluSGVhZCA9IE5VTEw7CisgICAgcGNyeC0+aW5UYWlsID0gTlVMTDsKKyAgfQorI2lmIFZKX1NVUFBPUlQKKyAgdmpfdW5jb21wcmVzc19lcnIoJnBwcENvbnRyb2xbcGNyeC0+cGRdLnZqQ29tcCk7CisjZW5kaWYgLyogVkpfU1VQUE9SVCAqLworCisgIExJTktfU1RBVFNfSU5DKGxpbmsuZHJvcCk7CisgIHNubXBfaW5jX2lmaW5kaXNjYXJkcygmcHBwQ29udHJvbFtwY3J4LT5wZF0ubmV0aWYpOworfQorCisvKiogUGFzcyByZWNlaXZlZCByYXcgY2hhcmFjdGVycyB0byBQUFBvUyB0byBiZSBkZWNvZGVkLiBUaGlzIGZ1bmN0aW9uIGlzCisgKiB0aHJlYWQtc2FmZSBhbmQgY2FuIGJlIGNhbGxlZCBmcm9tIGEgZGVkaWNhdGVkIFJYLXRocmVhZCBvciBmcm9tIGEgbWFpbi1sb29wLgorICoKKyAqIEBwYXJhbSBwZCBQUFAgZGVzY3JpcHRvciBpbmRleCwgcmV0dXJuZWQgYnkgcHBwT3BlbigpCisgKiBAcGFyYW0gZGF0YSByZWNlaXZlZCBkYXRhCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiByZWNlaXZlZCBkYXRhCisgKi8KK3ZvaWQKK3BwcG9zX2lucHV0KGludCBwZCwgdV9jaGFyKiBkYXRhLCBpbnQgbGVuKQoreworICBwcHBJblByb2MoJnBwcENvbnRyb2xbcGRdLnJ4LCBkYXRhLCBsZW4pOworfQorCisvKioKKyAqIFByb2Nlc3MgYSByZWNlaXZlZCBvY3RldCBzdHJpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBJblByb2MoUFBQQ29udHJvbFJ4ICpwY3J4LCB1X2NoYXIgKnMsIGludCBsKQoreworICBzdHJ1Y3QgcGJ1ZiAqbmV4dE5CdWY7CisgIHVfY2hhciBjdXJDaGFyOworICB1X2NoYXIgZXNjYXBlZDsKKyAgU1lTX0FSQ0hfREVDTF9QUk9URUNUKGxldik7CisKKyAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInBwcEluUHJvY1slZF06IGdvdCAlZCBieXRlc1xuIiwgcGNyeC0+cGQsIGwpKTsKKyAgd2hpbGUgKGwtLSA+IDApIHsKKyAgICBjdXJDaGFyID0gKnMrKzsKKworICAgIFNZU19BUkNIX1BST1RFQ1QobGV2KTsKKyAgICBlc2NhcGVkID0gRVNDQVBFX1AocGNyeC0+aW5BQ0NNLCBjdXJDaGFyKTsKKyAgICBTWVNfQVJDSF9VTlBST1RFQ1QobGV2KTsKKyAgICAvKiBIYW5kbGUgc3BlY2lhbCBjaGFyYWN0ZXJzLiAqLworICAgIGlmIChlc2NhcGVkKSB7CisgICAgICAvKiBDaGVjayBmb3IgZXNjYXBlIHNlcXVlbmNlcy4gKi8KKyAgICAgIC8qIFhYWCBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBoYW5kbGUgYW4gZXNjYXBlZCAweDVkIGNoYXJhY3RlciB3aGljaAorICAgICAgICogd291bGQgYXBwZWFyIGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXIuICBTaW5jZSB0aGlzIGlzIGFuIEFTQ0lJICddJworICAgICAgICogYW5kIHRoZXJlIGlzIG5vIHJlYXNvbiB0aGF0IEkga25vdyBvZiB0byBlc2NhcGUgaXQsIEkgd29uJ3QgY29tcGxpY2F0ZQorICAgICAgICogdGhlIGNvZGUgdG8gaGFuZGxlIHRoaXMgY2FzZS4gR0xMICovCisgICAgICBpZiAoY3VyQ2hhciA9PSBQUFBfRVNDQVBFKSB7CisgICAgICAgIHBjcngtPmluRXNjYXBlZCA9IDE7CisgICAgICAvKiBDaGVjayBmb3IgdGhlIGZsYWcgY2hhcmFjdGVyLiAqLworICAgICAgfSBlbHNlIGlmIChjdXJDaGFyID09IFBQUF9GTEFHKSB7CisgICAgICAgIC8qIElmIHRoaXMgaXMganVzdCBhbiBleHRyYSBmbGFnIGNoYXJhY3RlciwgaWdub3JlIGl0LiAqLworICAgICAgICBpZiAocGNyeC0+aW5TdGF0ZSA8PSBQREFERFJFU1MpIHsKKyAgICAgICAgICAvKiBpZ25vcmUgaXQgKi87CisgICAgICAgIC8qIElmIHdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIHBhY2tldCBoZWFkZXIsIGRyb3Agd2hhdCBoYXMgY29tZSBpbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChwY3J4LT5pblN0YXRlIDwgUEREQVRBKSB7CisgICAgICAgICAgUFBQREVCVUcoTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgKCJwcHBJblByb2NbJWRdOiBEcm9wcGluZyBpbmNvbXBsZXRlIHBhY2tldCAlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgIHBjcngtPnBkLCBwY3J4LT5pblN0YXRlKSk7CisgICAgICAgICAgTElOS19TVEFUU19JTkMobGluay5sZW5lcnIpOworICAgICAgICAgIHBwcERyb3AocGNyeCk7CisgICAgICAgIC8qIElmIHRoZSBmY3MgaXMgaW52YWxpZCwgZHJvcCB0aGUgcGFja2V0LiAqLworICAgICAgICB9IGVsc2UgaWYgKHBjcngtPmluRkNTICE9IFBQUF9HT09ERkNTKSB7CisgICAgICAgICAgUFBQREVCVUcoTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgKCJwcHBJblByb2NbJWRdOiBEcm9wcGluZyBiYWQgZmNzIDB4JSJYMTZfRiIgcHJvdG89MHglIlgxNl9GIlxuIiwgCisgICAgICAgICAgICAgICAgICAgIHBjcngtPnBkLCBwY3J4LT5pbkZDUywgcGNyeC0+aW5Qcm90b2NvbCkpOworICAgICAgICAgIC8qIE5vdGU6IElmIHlvdSBnZXQgbG90cyBvZiB0aGVzZSwgY2hlY2sgZm9yIFVBUlQgZnJhbWUgZXJyb3JzIG9yIHRyeSBkaWZmZXJlbnQgYmF1ZCByYXRlICovCisgICAgICAgICAgTElOS19TVEFUU19JTkMobGluay5jaGtlcnIpOworICAgICAgICAgIHBwcERyb3AocGNyeCk7CisgICAgICAgIC8qIE90aGVyd2lzZSBpdCdzIGEgZ29vZCBwYWNrZXQgc28gcGFzcyBpdCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdHJ1Y3QgcGJ1ZiAqaW5wOworICAgICAgICAgIC8qIFRyaW0gb2ZmIHRoZSBjaGVja3N1bS4gKi8KKyAgICAgICAgICBpZihwY3J4LT5pblRhaWwtPmxlbiA+PSAyKSB7CisgICAgICAgICAgICBwY3J4LT5pblRhaWwtPmxlbiAtPSAyOworCisgICAgICAgICAgICBwY3J4LT5pblRhaWwtPnRvdF9sZW4gPSBwY3J4LT5pblRhaWwtPmxlbjsKKyAgICAgICAgICAgIGlmIChwY3J4LT5pblRhaWwgIT0gcGNyeC0+aW5IZWFkKSB7CisgICAgICAgICAgICAgIHBidWZfY2F0KHBjcngtPmluSGVhZCwgcGNyeC0+aW5UYWlsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGNyeC0+aW5UYWlsLT50b3RfbGVuID0gcGNyeC0+aW5UYWlsLT5sZW47CisgICAgICAgICAgICBpZiAocGNyeC0+aW5UYWlsICE9IHBjcngtPmluSGVhZCkgeworICAgICAgICAgICAgICBwYnVmX2NhdChwY3J4LT5pbkhlYWQsIHBjcngtPmluVGFpbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBidWZfcmVhbGxvYyhwY3J4LT5pbkhlYWQsIHBjcngtPmluSGVhZC0+dG90X2xlbiAtIDIpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIERpc3BhdGNoIHRoZSBwYWNrZXQgdGhlcmVieSBjb25zdW1pbmcgaXQuICovCisgICAgICAgICAgaW5wID0gcGNyeC0+aW5IZWFkOworICAgICAgICAgIC8qIFBhY2tldCBjb25zdW1lZCwgcmVsZWFzZSBvdXIgcmVmZXJlbmNlcy4gKi8KKyAgICAgICAgICBwY3J4LT5pbkhlYWQgPSBOVUxMOworICAgICAgICAgIHBjcngtPmluVGFpbCA9IE5VTEw7CisjaWYgUFBQX0lOUFJPQ19NVUxUSVRIUkVBREVECisgICAgICAgICAgaWYodGNwaXBfY2FsbGJhY2tfd2l0aF9ibG9jayhwcHBJbnB1dCwgaW5wLCAwKSAhPSBFUlJfT0spIHsKKyAgICAgICAgICAgIFBQUERFQlVHKExPR19FUlIsICgicHBwSW5Qcm9jWyVkXTogdGNwaXBfY2FsbGJhY2soKSBmYWlsZWQsIGRyb3BwaW5nIHBhY2tldFxuIiwgcGNyeC0+cGQpKTsKKyAgICAgICAgICAgIHBidWZfZnJlZShpbnApOworICAgICAgICAgICAgTElOS19TVEFUU19JTkMobGluay5kcm9wKTsKKyAgICAgICAgICAgIHNubXBfaW5jX2lmaW5kaXNjYXJkcygmcHBwQ29udHJvbFtwY3J4LT5wZF0ubmV0aWYpOworICAgICAgICAgIH0KKyNlbHNlIC8qIFBQUF9JTlBST0NfTVVMVElUSFJFQURFRCAqLworICAgICAgICAgIHBwcElucHV0KGlucCk7CisjZW5kaWYgLyogUFBQX0lOUFJPQ19NVUxUSVRIUkVBREVEICovCisgICAgICAgIH0KKworICAgICAgICAvKiBQcmVwYXJlIGZvciBhIG5ldyBwYWNrZXQuICovCisgICAgICAgIHBjcngtPmluRkNTID0gUFBQX0lOSVRGQ1M7CisgICAgICAgIHBjcngtPmluU3RhdGUgPSBQREFERFJFU1M7CisgICAgICAgIHBjcngtPmluRXNjYXBlZCA9IDA7CisgICAgICAvKiBPdGhlciBjaGFyYWN0ZXJzIGFyZSB1c3VhbGx5IGNvbnRyb2wgY2hhcmFjdGVycyB0aGF0IG1heSBoYXZlCisgICAgICAgKiBiZWVuIGluc2VydGVkIGJ5IHRoZSBwaHlzaWNhbCBsYXllciBzbyBoZXJlIHdlIGp1c3QgZHJvcCB0aGVtLiAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUFBQREVCVUcoTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICgicHBwSW5Qcm9jWyVkXTogRHJvcHBpbmcgQUNDTSBjaGFyIDwlZD5cbiIsIHBjcngtPnBkLCBjdXJDaGFyKSk7CisgICAgICB9CisgICAgLyogUHJvY2VzcyBvdGhlciBjaGFyYWN0ZXJzLiAqLworICAgIH0gZWxzZSB7CisgICAgICAvKiBVbmVuY29kZSBlc2NhcGVkIGNoYXJhY3RlcnMuICovCisgICAgICBpZiAocGNyeC0+aW5Fc2NhcGVkKSB7CisgICAgICAgIHBjcngtPmluRXNjYXBlZCA9IDA7CisgICAgICAgIGN1ckNoYXIgXj0gUFBQX1RSQU5TOworICAgICAgfQorCisgICAgICAvKiBQcm9jZXNzIGNoYXJhY3RlciByZWxhdGl2ZSB0byBjdXJyZW50IHN0YXRlLiAqLworICAgICAgc3dpdGNoKHBjcngtPmluU3RhdGUpIHsKKyAgICAgICAgY2FzZSBQRElETEU6ICAgICAgICAgICAgICAgICAgICAvKiBJZGxlIHN0YXRlIC0gd2FpdGluZy4gKi8KKyAgICAgICAgICAvKiBEcm9wIHRoZSBjaGFyYWN0ZXIgaWYgaXQncyBub3QgMHhmZgorICAgICAgICAgICAqIHdlIHdvdWxkIGhhdmUgcHJvY2Vzc2VkIGEgZmxhZyBjaGFyYWN0ZXIgYWJvdmUuICovCisgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gUFBQX0FMTFNUQVRJT05TKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgUERTVEFSVDogICAgICAgICAgICAgICAgICAgLyogUHJvY2VzcyBzdGFydCBmbGFnLiAqLworICAgICAgICAgIC8qIFByZXBhcmUgZm9yIGEgbmV3IHBhY2tldC4gKi8KKyAgICAgICAgICBwY3J4LT5pbkZDUyA9IFBQUF9JTklURkNTOworCisgICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIFBEQUREUkVTUzogICAgICAgICAgICAgICAgIC8qIFByb2Nlc3MgYWRkcmVzcyBmaWVsZC4gKi8KKyAgICAgICAgICBpZiAoY3VyQ2hhciA9PSBQUFBfQUxMU1RBVElPTlMpIHsKKyAgICAgICAgICAgIHBjcngtPmluU3RhdGUgPSBQRENPTlRST0w7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogRWxzZSBhc3N1bWUgY29tcHJlc3NlZCBhZGRyZXNzIGFuZCBjb250cm9sIGZpZWxkcyBzbworICAgICAgICAgICAqIGZhbGwgdGhyb3VnaCB0byBnZXQgdGhlIHByb3RvY29sLi4uICovCisgICAgICAgIGNhc2UgUERDT05UUk9MOiAgICAgICAgICAgICAgICAgLyogUHJvY2VzcyBjb250cm9sIGZpZWxkLiAqLworICAgICAgICAgIC8qIElmIHdlIGRvbid0IGdldCBhIHZhbGlkIGNvbnRyb2wgY29kZSwgcmVzdGFydC4gKi8KKyAgICAgICAgICBpZiAoY3VyQ2hhciA9PSBQUFBfVUkpIHsKKyAgICAgICAgICAgIHBjcngtPmluU3RhdGUgPSBQRFBST1RPQ09MMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyNpZiAwCisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQUFBERUJVRyhMT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICgicHBwSW5Qcm9jWyVkXTogSW52YWxpZCBjb250cm9sIDwlZD5cbiIsIHBjcngtPnBkLCBjdXJDaGFyKSk7CisgICAgICAgICAgICBwY3J4LT5pblN0YXRlID0gUERTVEFSVDsKKyAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgY2FzZSBQRFBST1RPQ09MMTogICAgICAgICAgICAgICAvKiBQcm9jZXNzIHByb3RvY29sIGZpZWxkIDEuICovCisgICAgICAgICAgLyogSWYgdGhlIGxvd2VyIGJpdCBpcyBzZXQsIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgcHJvdG9jb2wKKyAgICAgICAgICAgKiBmaWVsZC4gKi8KKyAgICAgICAgICBpZiAoY3VyQ2hhciAmIDEpIHsKKyAgICAgICAgICAgIHBjcngtPmluUHJvdG9jb2wgPSBjdXJDaGFyOworICAgICAgICAgICAgcGNyeC0+aW5TdGF0ZSA9IFBEREFUQTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGNyeC0+aW5Qcm90b2NvbCA9ICh1X2ludCljdXJDaGFyIDw8IDg7CisgICAgICAgICAgICBwY3J4LT5pblN0YXRlID0gUERQUk9UT0NPTDI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBEUFJPVE9DT0wyOiAgICAgICAgICAgICAgIC8qIFByb2Nlc3MgcHJvdG9jb2wgZmllbGQgMi4gKi8KKyAgICAgICAgICBwY3J4LT5pblByb3RvY29sIHw9IGN1ckNoYXI7CisgICAgICAgICAgcGNyeC0+aW5TdGF0ZSA9IFBEREFUQTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQRERBVEE6ICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGRhdGEgYnl0ZS4gKi8KKyAgICAgICAgICAvKiBNYWtlIHNwYWNlIHRvIHJlY2VpdmUgcHJvY2Vzc2VkIGRhdGEuICovCisgICAgICAgICAgaWYgKHBjcngtPmluVGFpbCA9PSBOVUxMIHx8IHBjcngtPmluVGFpbC0+bGVuID09IFBCVUZfUE9PTF9CVUZTSVpFKSB7CisgICAgICAgICAgICBpZiAocGNyeC0+aW5UYWlsICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgcGNyeC0+aW5UYWlsLT50b3RfbGVuID0gcGNyeC0+aW5UYWlsLT5sZW47CisgICAgICAgICAgICAgIGlmIChwY3J4LT5pblRhaWwgIT0gcGNyeC0+aW5IZWFkKSB7CisgICAgICAgICAgICAgICAgcGJ1Zl9jYXQocGNyeC0+aW5IZWFkLCBwY3J4LT5pblRhaWwpOworICAgICAgICAgICAgICAgIC8qIGdpdmUgdXAgdGhlIGluVGFpbCByZWZlcmVuY2Ugbm93ICovCisgICAgICAgICAgICAgICAgcGNyeC0+aW5UYWlsID0gTlVMTDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgd2UgaGF2ZW4ndCBzdGFydGVkIGEgcGFja2V0LCB3ZSBuZWVkIGEgcGFja2V0IGhlYWRlci4gKi8KKyAgICAgICAgICAgIG5leHROQnVmID0gcGJ1Zl9hbGxvYyhQQlVGX1JBVywgMCwgUEJVRl9QT09MKTsKKyAgICAgICAgICAgIGlmIChuZXh0TkJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIC8qIE5vIGZyZWUgYnVmZmVycy4gIERyb3AgdGhlIGlucHV0IHBhY2tldCBhbmQgbGV0IHRoZQorICAgICAgICAgICAgICAgKiBoaWdoZXIgbGF5ZXJzIGRlYWwgd2l0aCBpdC4gIENvbnRpbnVlIHByb2Nlc3NpbmcKKyAgICAgICAgICAgICAgICogdGhlIHJlY2VpdmVkIHBidWYgY2hhaW4gaW4gY2FzZSBhIG5ldyBwYWNrZXQgc3RhcnRzLiAqLworICAgICAgICAgICAgICBQUFBERUJVRyhMT0dfRVJSLCAoInBwcEluUHJvY1slZF06IE5PIEZSRUUgTUJVRlMhXG4iLCBwY3J4LT5wZCkpOworICAgICAgICAgICAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLm1lbWVycik7CisgICAgICAgICAgICAgIHBwcERyb3AocGNyeCk7CisgICAgICAgICAgICAgIHBjcngtPmluU3RhdGUgPSBQRFNUQVJUOyAgLyogV2FpdCBmb3IgZmxhZyBzZXF1ZW5jZS4gKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGNyeC0+aW5IZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgc3RydWN0IHBwcElucHV0SGVhZGVyICpwaWggPSBuZXh0TkJ1Zi0+cGF5bG9hZDsKKworICAgICAgICAgICAgICBwaWgtPnVuaXQgPSBwY3J4LT5wZDsKKyAgICAgICAgICAgICAgcGloLT5wcm90byA9IHBjcngtPmluUHJvdG9jb2w7CisKKyAgICAgICAgICAgICAgbmV4dE5CdWYtPmxlbiArPSBzaXplb2YoKnBpaCk7CisKKyAgICAgICAgICAgICAgcGNyeC0+aW5IZWFkID0gbmV4dE5CdWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwY3J4LT5pblRhaWwgPSBuZXh0TkJ1ZjsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogTG9hZCBjaGFyYWN0ZXIgaW50byBidWZmZXIuICovCisgICAgICAgICAgKCh1X2NoYXIqKXBjcngtPmluVGFpbC0+cGF5bG9hZClbcGNyeC0+aW5UYWlsLT5sZW4rK10gPSBjdXJDaGFyOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiB1cGRhdGUgdGhlIGZyYW1lIGNoZWNrIHNlcXVlbmNlIG51bWJlci4gKi8KKyAgICAgIHBjcngtPmluRkNTID0gUFBQX0ZDUyhwY3J4LT5pbkZDUywgY3VyQ2hhcik7CisgICAgfQorICB9IC8qIHdoaWxlIChsLS0gPiAwKSwgYWxsIGJ5dGVzIHByb2Nlc3NlZCAqLworCisgIGF2UmFuZG9taXplKCk7Cit9CisjZW5kaWYgLyogUFBQT1NfU1VQUE9SVCAqLworCisjaWYgUFBQT0VfU1VQUE9SVAordm9pZAorcHBwSW5Qcm9jT3ZlckV0aGVybmV0KGludCBwZCwgc3RydWN0IHBidWYgKnBiKQoreworICBzdHJ1Y3QgcHBwSW5wdXRIZWFkZXIgKnBpaDsKKyAgdTE2X3QgaW5Qcm90b2NvbDsKKworICBpZihwYi0+bGVuIDwgc2l6ZW9mKGluUHJvdG9jb2wpKSB7CisgICAgUFBQREVCVUcoTE9HX0VSUiwgKCJwcHBJblByb2NPdmVyRXRoZXJuZXQ6IHRvbyBzbWFsbCBmb3IgcHJvdG9jb2wgZmllbGRcbiIpKTsKKyAgICBnb3RvIGRyb3A7CisgIH0KKworICBpblByb3RvY29sID0gKCgodThfdCAqKXBiLT5wYXlsb2FkKVswXSA8PCA4KSB8ICgodThfdCopcGItPnBheWxvYWQpWzFdOworCisgIC8qIG1ha2Ugcm9vbSBmb3IgcHBwSW5wdXRIZWFkZXIgLSBzaG91bGQgbm90IGZhaWwgKi8KKyAgaWYgKHBidWZfaGVhZGVyKHBiLCBzaXplb2YoKnBpaCkgLSBzaXplb2YoaW5Qcm90b2NvbCkpICE9IDApIHsKKyAgICBQUFBERUJVRyhMT0dfRVJSLCAoInBwcEluUHJvY092ZXJFdGhlcm5ldDogY291bGQgbm90IGFsbG9jYXRlIHJvb20gZm9yIGhlYWRlclxuIikpOworICAgIGdvdG8gZHJvcDsKKyAgfQorCisgIHBpaCA9IHBiLT5wYXlsb2FkOworCisgIHBpaC0+dW5pdCA9IHBkOworICBwaWgtPnByb3RvID0gaW5Qcm90b2NvbDsKKworICAvKiBEaXNwYXRjaCB0aGUgcGFja2V0IHRoZXJlYnkgY29uc3VtaW5nIGl0LiAqLworICBwcHBJbnB1dChwYik7CisgIHJldHVybjsKKworZHJvcDoKKyAgTElOS19TVEFUU19JTkMobGluay5kcm9wKTsKKyAgc25tcF9pbmNfaWZpbmRpc2NhcmRzKCZwcHBDb250cm9sW3BkXS5uZXRpZik7CisgIHBidWZfZnJlZShwYik7CisgIHJldHVybjsKK30KKyNlbmRpZiAvKiBQUFBPRV9TVVBQT1JUICovCisKKyNpZiBMV0lQX05FVElGX1NUQVRVU19DQUxMQkFDSworLyoqIFNldCB0aGUgc3RhdHVzIGNhbGxiYWNrIG9mIGEgUFBQJ3MgbmV0aWYKKyAqCisgKiBAcGFyYW0gcGQgVGhlIFBQUCBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IHBwcE9wZW4oKQorICogQHBhcmFtIHN0YXR1c19jYWxsYmFjayBwb2ludGVyIHRvIHRoZSBzdGF0dXMgY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBAc2VlIG5ldGlmX3NldF9zdGF0dXNfY2FsbGJhY2sKKyAqLwordm9pZAorcHBwX3NldF9uZXRpZl9zdGF0dXNjYWxsYmFjayhpbnQgcGQsIG5ldGlmX3N0YXR1c19jYWxsYmFja19mbiBzdGF0dXNfY2FsbGJhY2spCit7CisgIG5ldGlmX3NldF9zdGF0dXNfY2FsbGJhY2soJnBwcENvbnRyb2xbcGRdLm5ldGlmLCBzdGF0dXNfY2FsbGJhY2spOyAKK30KKyNlbmRpZiAvKiBMV0lQX05FVElGX1NUQVRVU19DQUxMQkFDSyAqLworCisjaWYgTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLCisvKiogU2V0IHRoZSBsaW5rIGNhbGxiYWNrIG9mIGEgUFBQJ3MgbmV0aWYKKyAqCisgKiBAcGFyYW0gcGQgVGhlIFBQUCBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IHBwcE9wZW4oKQorICogQHBhcmFtIGxpbmtfY2FsbGJhY2sgcG9pbnRlciB0byB0aGUgbGluayBjYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIEBzZWUgbmV0aWZfc2V0X2xpbmtfY2FsbGJhY2sKKyAqLwordm9pZAorcHBwX3NldF9uZXRpZl9saW5rY2FsbGJhY2soaW50IHBkLCBuZXRpZl9zdGF0dXNfY2FsbGJhY2tfZm4gbGlua19jYWxsYmFjaykKK3sKKyAgbmV0aWZfc2V0X2xpbmtfY2FsbGJhY2soJnBwcENvbnRyb2xbcGRdLm5ldGlmLCBsaW5rX2NhbGxiYWNrKTsgCit9CisjZW5kaWYgLyogTFdJUF9ORVRJRl9MSU5LX0NBTExCQUNLICovCisKKyNlbmRpZiAvKiBQUFBfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvcHBwLmggYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9wcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJhYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvcHBwLmgKQEAgLTAsMCArMSw0ODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwcHAuaCAtIE5ldHdvcmsgUG9pbnQgdG8gUG9pbnQgUHJvdG9jb2wgaGVhZGVyIGZpbGUuCisqCisqIENvcHlyaWdodCAoYykgMjAwMyBieSBNYXJjIEJvdWNoZXIsIFNlcnZpY2VzIEluZm9ybWF0aXF1ZXMgKE1CU0kpIGluYy4KKyogcG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk3IEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyoKKyogVGhlIGF1dGhvcnMgaGVyZWJ5IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsCisqIGFuZCBsaWNlbnNlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQKKyogdGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCB0aGlzCisqIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGFyZSBpbmNsdWRlZCB2ZXJiYXRpbSBpbiBhbnkgCisqIGRpc3RyaWJ1dGlvbnMuIE5vIHdyaXR0ZW4gYWdyZWVtZW50LCBsaWNlbnNlLCBvciByb3lhbHR5IGZlZSBpcyByZXF1aXJlZAorKiBmb3IgYW55IG9mIHRoZSBhdXRob3JpemVkIHVzZXMuCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPTlRSSUJVVE9SUyAqQVMgSVMqIEFORCBBTlkgRVhQUkVTUyBPUgorKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIAorKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJFVklTSU9OIEhJU1RPUlkKKyoKKyogMDMtMDEtMDEgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisqICAgUG9ydGVkIHRvIGx3SVAuCisqIDk3LTExLTA1IEd1eSBMYW5jYXN0ZXIgPGdsYW5jYUBnZXNuLmNvbT4sIEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyogICBPcmlnaW5hbCBkZXJpdmVkIGZyb20gQlNEIGNvZGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUFBQX0gKKyNkZWZpbmUgUFBQX0gKKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBQUFBfU1VQUE9SVCAvKiBkb24ndCBidWlsZCBpZiBub3QgY29uZmlndXJlZCBmb3IgdXNlIGluIGx3aXBvcHRzLmggKi8KKworI2luY2x1ZGUgImx3aXAvZGVmLmgiCisjaW5jbHVkZSAibHdpcC9zaW8uaCIKKyNpbmNsdWRlICJsd2lwL3N0YXRzLmgiCisjaW5jbHVkZSAibHdpcC9tZW0uaCIKKyNpbmNsdWRlICJsd2lwL25ldGlmLmgiCisjaW5jbHVkZSAibHdpcC9zeXMuaCIKKyNpbmNsdWRlICJsd2lwL3RpbWVycy5oIgorCisvKiogU29tZSBkZWZpbmVzIGZvciBjb2RlIHdlIHNraXAgY29tcGFyZWQgdG8gdGhlIG9yaWdpbmFsIHBwcGQuCisgKiAgVGhlc2UgYXJlIGp1c3QgaGVyZSB0byBtaW5pbWlzZSB0aGUgdXNlIG9mIHRoZSB1Z2x5ICIjaWYgMCIuICovCisjZGVmaW5lIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUyAgMAorCisvKiogU29tZSBlcnJvciBjaGVja3MgdG8gdGVzdCBmb3IgdW5zdXBwb3J0ZWQgY29kZSAqLworI2lmIENCQ1BfU1VQUE9SVAorI2Vycm9yICJDQkNQIGlzIG5vdCBzdXBwb3J0ZWQgaW4gbHdJUCBQUFAiCisjZW5kaWYKKyNpZiBDQ1BfU1VQUE9SVAorI2Vycm9yICJDQ1AgaXMgbm90IHN1cHBvcnRlZCBpbiBsd0lQIFBQUCIKKyNlbmRpZgorCisvKgorICogcHBwZC5oIC0gUFBQIGRhZW1vbiBnbG9iYWwgZGVjbGFyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqLworLyoKKyAqIHBwcF9kZWZzLmggLSBQUFAgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IFRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCB3aXRob3V0IGFueQorICogd2FycmFudHksIGV4cHJlc3Mgb3IgaW1wbGllZC4gVGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eQorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBCRSBMSUFCTEUgVE8gQU5ZCisgKiBQQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLCBFVkVOIElGCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBVkUgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTCisgKiBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBIQVMgTk8KKyAqIE9CTElHQVRJT04gVE8gUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLAorICogT1IgTU9ESUZJQ0FUSU9OUy4KKyAqLworCisjZGVmaW5lIFRJTUVPVVQoZiwgYSwgdCkgICAgZG8geyBzeXNfdW50aW1lb3V0KChmKSwgKGEpKTsgc3lzX3RpbWVvdXQoKHQpKjEwMDAsIChmKSwgKGEpKTsgfSB3aGlsZSgwKQorI2RlZmluZSBVTlRJTUVPVVQoZiwgYSkgICAgIHN5c191bnRpbWVvdXQoKGYpLCAoYSkpCisKKworI2lmbmRlZiBfX3VfY2hhcl9kZWZpbmVkCisKKy8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIEJTRCBjb2RlLiAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1X2xvbmc7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVfaW50OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X3Nob3J0OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1X2NoYXI7CisKKyNlbmRpZgorCisvKgorICogQ29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIGRlZmluZWQgYnkgdGhlIGludGVybmV0IHN5c3RlbSwKKyAqIFBlciBSRkMgNzkwLCBTZXB0ZW1iZXIgMTk4MSwgYW5kIG51bWVyb3VzIGFkZGl0aW9ucy4KKyAqLworCisvKgorICogVGhlIGJhc2ljIFBQUCBmcmFtZS4KKyAqLworI2RlZmluZSBQUFBfSERSTEVOICAgICAgNCAgICAgICAvKiBvY3RldHMgZm9yIHN0YW5kYXJkIHBwcCBoZWFkZXIgKi8KKyNkZWZpbmUgUFBQX0ZDU0xFTiAgICAgIDIgICAgICAgLyogb2N0ZXRzIGZvciBGQ1MgKi8KKworCisvKgorICogU2lnbmlmaWNhbnQgb2N0ZXQgdmFsdWVzLgorICovCisjZGVmaW5lIFBQUF9BTExTVEFUSU9OUyAweGZmICAgIC8qIEFsbC1TdGF0aW9ucyBicm9hZGNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBQUFBfVUkgICAgICAgICAgMHgwMyAgICAvKiBVbm51bWJlcmVkIEluZm9ybWF0aW9uICovCisjZGVmaW5lIFBQUF9GTEFHICAgICAgICAweDdlICAgIC8qIEZsYWcgU2VxdWVuY2UgKi8KKyNkZWZpbmUgUFBQX0VTQ0FQRSAgICAgIDB4N2QgICAgLyogQXN5bmNocm9ub3VzIENvbnRyb2wgRXNjYXBlICovCisjZGVmaW5lIFBQUF9UUkFOUyAgICAgICAweDIwICAgIC8qIEFzeW5jaHJvbm91cyB0cmFuc3BhcmVuY3kgbW9kaWZpZXIgKi8KKworLyoKKyAqIFByb3RvY29sIGZpZWxkIHZhbHVlcy4KKyAqLworI2RlZmluZSBQUFBfSVAgICAgICAgICAgMHgyMSAgICAvKiBJbnRlcm5ldCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfQVQgICAgICAgICAgMHgyOSAgICAvKiBBcHBsZVRhbGsgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX1ZKQ19DT01QICAgIDB4MmQgICAgLyogVkogY29tcHJlc3NlZCBUQ1AgKi8KKyNkZWZpbmUgUFBQX1ZKQ19VTkNPTVAgIDB4MmYgICAgLyogVkogdW5jb21wcmVzc2VkIFRDUCAqLworI2RlZmluZSBQUFBfQ09NUCAgICAgICAgMHhmZCAgICAvKiBjb21wcmVzc2VkIHBhY2tldCAqLworI2RlZmluZSBQUFBfSVBDUCAgICAgICAgMHg4MDIxICAvKiBJUCBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9BVENQICAgICAgICAweDgwMjkgIC8qIEFwcGxlVGFsayBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9DQ1AgICAgICAgICAweDgwZmQgIC8qIENvbXByZXNzaW9uIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0xDUCAgICAgICAgIDB4YzAyMSAgLyogTGluayBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9QQVAgICAgICAgICAweGMwMjMgIC8qIFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9MUVIgICAgICAgICAweGMwMjUgIC8qIExpbmsgUXVhbGl0eSBSZXBvcnQgcHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0NIQVAgICAgICAgIDB4YzIyMyAgLyogQ3J5cHRvZ3JhcGhpYyBIYW5kc2hha2UgQXV0aC4gUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0NCQ1AgICAgICAgIDB4YzAyOSAgLyogQ2FsbGJhY2sgQ29udHJvbCBQcm90b2NvbCAqLworCisvKgorICogVmFsdWVzIGZvciBGQ1MgY2FsY3VsYXRpb25zLgorICovCisjZGVmaW5lIFBQUF9JTklURkNTICAgICAweGZmZmYgIC8qIEluaXRpYWwgRkNTIHZhbHVlICovCisjZGVmaW5lIFBQUF9HT09ERkNTICAgICAweGYwYjggIC8qIEdvb2QgZmluYWwgRkNTIHZhbHVlICovCisjZGVmaW5lIFBQUF9GQ1MoZmNzLCBjKSAoKChmY3MpID4+IDgpIF4gZmNzdGFiWygoZmNzKSBeIChjKSkgJiAweGZmXSkKKworLyoKKyAqIEV4dGVuZGVkIGFzeW5jbWFwIC0gYWxsb3dzIGFueSBjaGFyYWN0ZXIgdG8gYmUgZXNjYXBlZC4KKyAqLwordHlwZWRlZiB1X2NoYXIgIGV4dF9hY2NtWzMyXTsKKworLyoKKyAqIFdoYXQgdG8gZG8gd2l0aCBuZXR3b3JrIHByb3RvY29sIChOUCkgcGFja2V0cy4KKyAqLworZW51bSBOUG1vZGUgeworICBOUE1PREVfUEFTUywgICAgICAgIC8qIHBhc3MgdGhlIHBhY2tldCB0aHJvdWdoICovCisgIE5QTU9ERV9EUk9QLCAgICAgICAgLyogc2lsZW50bHkgZHJvcCB0aGUgcGFja2V0ICovCisgIE5QTU9ERV9FUlJPUiwgICAgICAgLyogcmV0dXJuIGFuIGVycm9yICovCisgIE5QTU9ERV9RVUVVRSAgICAgICAgLyogc2F2ZSBpdCB1cCBmb3IgbGF0ZXIuICovCit9OworCisvKgorICogSW5saW5lIHZlcnNpb25zIG9mIGdldC9wdXQgY2hhci9zaG9ydC9sb25nLgorICogUG9pbnRlciBpcyBhZHZhbmNlZDsgd2UgYXNzdW1lIHRoYXQgYm90aCBhcmd1bWVudHMKKyAqIGFyZSBsdmFsdWVzIGFuZCB3aWxsIGFscmVhZHkgYmUgaW4gcmVnaXN0ZXJzLgorICogY3AgTVVTVCBiZSB1X2NoYXIgKi4KKyAqLworI2RlZmluZSBHRVRDSEFSKGMsIGNwKSB7IFwKKyAgICAoYykgPSAqKGNwKSsrOyBcCit9CisjZGVmaW5lIFBVVENIQVIoYywgY3ApIHsgXAorICAgICooY3ApKysgPSAodV9jaGFyKSAoYyk7IFwKK30KKworCisjZGVmaW5lIEdFVFNIT1JUKHMsIGNwKSB7IFwKKyAgICAocykgPSAqKGNwKTsgKGNwKSsrOyAocykgPDw9IDg7IFwKKyAgICAocykgfD0gKihjcCk7IChjcCkrKzsgXAorfQorI2RlZmluZSBQVVRTSE9SVChzLCBjcCkgeyBcCisgICAgKihjcCkrKyA9ICh1X2NoYXIpICgocykgPj4gOCk7IFwKKyAgICAqKGNwKSsrID0gKHVfY2hhcikgKHMgJiAweGZmKTsgXAorfQorCisjZGVmaW5lIEdFVExPTkcobCwgY3ApIHsgXAorICAgIChsKSA9ICooY3ApOyAoY3ApKys7IChsKSA8PD0gODsgXAorICAgIChsKSB8PSAqKGNwKTsgKGNwKSsrOyAobCkgPDw9IDg7IFwKKyAgICAobCkgfD0gKihjcCk7IChjcCkrKzsgKGwpIDw8PSA4OyBcCisgICAgKGwpIHw9ICooY3ApOyAoY3ApKys7IFwKK30KKyNkZWZpbmUgUFVUTE9ORyhsLCBjcCkgeyBcCisgICAgKihjcCkrKyA9ICh1X2NoYXIpICgobCkgPj4gMjQpOyBcCisgICAgKihjcCkrKyA9ICh1X2NoYXIpICgobCkgPj4gMTYpOyBcCisgICAgKihjcCkrKyA9ICh1X2NoYXIpICgobCkgPj4gOCk7IFwKKyAgICAqKGNwKSsrID0gKHVfY2hhcikgKGwpOyBcCit9CisKKworI2RlZmluZSBJTkNQVFIobiwgY3ApICAgKChjcCkgKz0gKG4pKQorI2RlZmluZSBERUNQVFIobiwgY3ApICAgKChjcCkgLT0gKG4pKQorCisjZGVmaW5lIEJDTVAoczAsIHMxLCBsKSAgICAgbWVtY21wKCh1X2NoYXIgKikoczApLCAodV9jaGFyICopKHMxKSwgKGwpKQorI2RlZmluZSBCQ09QWShzLCBkLCBsKSAgICAgIE1FTUNQWSgoZCksIChzKSwgKGwpKQorI2RlZmluZSBCWkVSTyhzLCBuKSAgICAgICAgIG1lbXNldChzLCAwLCBuKQorCisjaWYgUFBQX0RFQlVHCisjZGVmaW5lIFBSSU5UTVNHKG0sIGwpICB7IG1bbF0gPSAnXDAnOyBMV0lQX0RFQlVHRihMT0dfSU5GTywgKCJSZW1vdGUgbWVzc2FnZTogJXNcbiIsIG0pKTsgfQorI2Vsc2UgIC8qIFBQUF9ERUJVRyAqLworI2RlZmluZSBQUklOVE1TRyhtLCBsKQorI2VuZGlmIC8qIFBQUF9ERUJVRyAqLworCisvKgorICogTUFLRUhFQURFUiAtIEFkZCBQUFAgSGVhZGVyIGZpZWxkcyB0byBhIHBhY2tldC4KKyAqLworI2RlZmluZSBNQUtFSEVBREVSKHAsIHQpIHsgXAorICAgIFBVVENIQVIoUFBQX0FMTFNUQVRJT05TLCBwKTsgXAorICAgIFBVVENIQVIoUFBQX1VJLCBwKTsgXAorICAgIFBVVFNIT1JUKHQsIHApOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogUFVCTElDIERFRklOSVRJT05TICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXJyb3IgY29kZXMuICovCisjZGVmaW5lIFBQUEVSUl9OT05FICAgICAgMCAvKiBObyBlcnJvci4gKi8KKyNkZWZpbmUgUFBQRVJSX1BBUkFNICAgIC0xIC8qIEludmFsaWQgcGFyYW1ldGVyLiAqLworI2RlZmluZSBQUFBFUlJfT1BFTiAgICAgLTIgLyogVW5hYmxlIHRvIG9wZW4gUFBQIHNlc3Npb24uICovCisjZGVmaW5lIFBQUEVSUl9ERVZJQ0UgICAtMyAvKiBJbnZhbGlkIEkvTyBkZXZpY2UgZm9yIFBQUC4gKi8KKyNkZWZpbmUgUFBQRVJSX0FMTE9DICAgIC00IC8qIFVuYWJsZSB0byBhbGxvY2F0ZSByZXNvdXJjZXMuICovCisjZGVmaW5lIFBQUEVSUl9VU0VSICAgICAtNSAvKiBVc2VyIGludGVycnVwdC4gKi8KKyNkZWZpbmUgUFBQRVJSX0NPTk5FQ1QgIC02IC8qIENvbm5lY3Rpb24gbG9zdC4gKi8KKyNkZWZpbmUgUFBQRVJSX0FVVEhGQUlMIC03IC8qIEZhaWxlZCBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UuICovCisjZGVmaW5lIFBQUEVSUl9QUk9UT0NPTCAtOCAvKiBGYWlsZWQgdG8gbWVldCBwcm90b2NvbC4gKi8KKworLyoKKyAqIFBQUCBJT0NUTCBjb21tYW5kcy4KKyAqLworLyoKKyAqIEdldCB0aGUgdXAgc3RhdHVzIC0gMCBmb3IgZG93biwgbm9uLXplcm8gZm9yIHVwLiAgVGhlIGFyZ3VtZW50IG11c3QKKyAqIHBvaW50IHRvIGFuIGludC4KKyAqLworI2RlZmluZSBQUFBDVExHX1VQU1RBVFVTIDEwMCAvKiBHZXQgdGhlIHVwIHN0YXR1cyAtIDAgZG93biBlbHNlIHVwICovCisjZGVmaW5lIFBQUENUTFNfRVJSQ09ERSAgMTAxIC8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworI2RlZmluZSBQUFBDVExHX0VSUkNPREUgIDEwMiAvKiBHZXQgdGhlIGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgUFBQQ1RMR19GRCAgICAgICAxMDMgLyogR2V0IHRoZSBmZCBhc3NvY2lhdGVkIHdpdGggdGhlIHBwcCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogUFVCTElDIERBVEEgVFlQRVMgKioqCisqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdCBnaXZlcyB0aGUgYWRkcmVzc2VzIG9mIHByb2NlZHVyZXMgdG8gY2FsbAorICogZm9yIGEgcGFydGljdWxhciBwcm90b2NvbC4KKyAqLworc3RydWN0IHByb3RlbnQgeworICAgIHVfc2hvcnQgcHJvdG9jb2w7ICAgICAgIC8qIFBQUCBwcm90b2NvbCBudW1iZXIgKi8KKyAgICAvKiBJbml0aWFsaXphdGlvbiBwcm9jZWR1cmUgKi8KKyAgICB2b2lkICgqaW5pdCkgKGludCB1bml0KTsKKyAgICAvKiBQcm9jZXNzIGEgcmVjZWl2ZWQgcGFja2V0ICovCisgICAgdm9pZCAoKmlucHV0KSAoaW50IHVuaXQsIHVfY2hhciAqcGt0LCBpbnQgbGVuKTsKKyAgICAvKiBQcm9jZXNzIGEgcmVjZWl2ZWQgcHJvdG9jb2wtcmVqZWN0ICovCisgICAgdm9pZCAoKnByb3RyZWopIChpbnQgdW5pdCk7CisgICAgLyogTG93ZXIgbGF5ZXIgaGFzIGNvbWUgdXAgKi8KKyAgICB2b2lkICgqbG93ZXJ1cCkgKGludCB1bml0KTsKKyAgICAvKiBMb3dlciBsYXllciBoYXMgZ29uZSBkb3duICovCisgICAgdm9pZCAoKmxvd2VyZG93bikgKGludCB1bml0KTsKKyAgICAvKiBPcGVuIHRoZSBwcm90b2NvbCAqLworICAgIHZvaWQgKCpvcGVuKSAoaW50IHVuaXQpOworICAgIC8qIENsb3NlIHRoZSBwcm90b2NvbCAqLworICAgIHZvaWQgKCpjbG9zZSkgKGludCB1bml0LCBjaGFyICpyZWFzb24pOworI2lmIFBQUF9BRERJVElPTkFMX0NBTExCQUNLUworICAgIC8qIFByaW50IGEgcGFja2V0IGluIHJlYWRhYmxlIGZvcm0gKi8KKyAgICBpbnQgICgqcHJpbnRwa3QpICh1X2NoYXIgKnBrdCwgaW50IGxlbiwKKyAgICAgICAgICAgICAgdm9pZCAoKnByaW50ZXIpICh2b2lkICosIGNoYXIgKiwgLi4uKSwKKyAgICAgICAgICAgICAgdm9pZCAqYXJnKTsKKyAgICAvKiBQcm9jZXNzIGEgcmVjZWl2ZWQgZGF0YSBwYWNrZXQgKi8KKyAgICB2b2lkICgqZGF0YWlucHV0KSAoaW50IHVuaXQsIHVfY2hhciAqcGt0LCBpbnQgbGVuKTsKKyNlbmRpZiAvKiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MgKi8KKyAgICBpbnQgIGVuYWJsZWRfZmxhZzsgICAgICAvKiAwIGlmIHByb3RvY29sIGlzIGRpc2FibGVkICovCisgICAgY2hhciAqbmFtZTsgICAgICAgICAvKiBUZXh0IG5hbWUgb2YgcHJvdG9jb2wgKi8KKyNpZiBQUFBfQURESVRJT05BTF9DQUxMQkFDS1MKKyAgICAvKiBDaGVjayByZXF1ZXN0ZWQgb3B0aW9ucywgYXNzaWduIGRlZmF1bHRzICovCisgICAgdm9pZCAoKmNoZWNrX29wdGlvbnMpICh1X2xvbmcpOworICAgIC8qIENvbmZpZ3VyZSBpbnRlcmZhY2UgZm9yIGRlbWFuZC1kaWFsICovCisgICAgaW50ICAoKmRlbWFuZF9jb25mKSAoaW50IHVuaXQpOworICAgIC8qIFNheSB3aGV0aGVyIHRvIGJyaW5nIHVwIGxpbmsgZm9yIHRoaXMgcGt0ICovCisgICAgaW50ICAoKmFjdGl2ZV9wa3QpICh1X2NoYXIgKnBrdCwgaW50IGxlbik7CisjZW5kaWYgLyogUFBQX0FERElUSU9OQUxfQ0FMTEJBQ0tTICovCit9OworCisvKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgcmVjb3JkcyB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlCisgKiB0aGUgbGFzdCBOUCBwYWNrZXQgd2FzIHNlbnQgb3IgcmVjZWl2ZWQuCisgKi8KK3N0cnVjdCBwcHBfaWRsZSB7CisgIHVfc2hvcnQgeG1pdF9pZGxlOyAgICAgIC8qIHNlY29uZHMgc2luY2UgbGFzdCBOUCBwYWNrZXQgc2VudCAqLworICB1X3Nob3J0IHJlY3ZfaWRsZTsgICAgICAvKiBzZWNvbmRzIHNpbmNlIGxhc3QgTlAgcGFja2V0IHJlY2VpdmVkICovCit9OworCitzdHJ1Y3QgcHBwX3NldHRpbmdzIHsKKworICB1X2ludCAgZGlzYWJsZV9kZWZhdWx0aXAgOiAxOyAgICAgICAvKiBEb24ndCB1c2UgaG9zdG5hbWUgZm9yIGRlZmF1bHQgSVAgYWRkcnMgKi8KKyAgdV9pbnQgIGF1dGhfcmVxdWlyZWQgICAgIDogMTsgICAgICAgLyogUGVlciBpcyByZXF1aXJlZCB0byBhdXRoZW50aWNhdGUgKi8KKyAgdV9pbnQgIGV4cGxpY2l0X3JlbW90ZSAgIDogMTsgICAgICAgLyogcmVtb3RlX25hbWUgc3BlY2lmaWVkIHdpdGggcmVtb3RlbmFtZSBvcHQgKi8KKyAgdV9pbnQgIHJlZnVzZV9wYXAgICAgICAgIDogMTsgICAgICAgLyogRG9uJ3Qgd2FubmEgYXV0aC4gb3Vyc2VsdmVzIHdpdGggUEFQICovCisgIHVfaW50ICByZWZ1c2VfY2hhcCAgICAgICA6IDE7ICAgICAgIC8qIERvbid0IHdhbm5hIGF1dGguIG91cnNlbHZlcyB3aXRoIENIQVAgKi8KKyAgdV9pbnQgIHVzZWhvc3RuYW1lICAgICAgIDogMTsgICAgICAgLyogVXNlIGhvc3RuYW1lIGZvciBvdXJfbmFtZSAqLworICB1X2ludCAgdXNlcGVlcmRucyAgICAgICAgOiAxOyAgICAgICAvKiBBc2sgcGVlciBmb3IgRE5TIGFkZHMgKi8KKworICB1X3Nob3J0IGlkbGVfdGltZV9saW1pdDsgICAgICAgICAgICAvKiBTaHV0IGRvd24gbGluayBpZiBpZGxlIGZvciB0aGlzIGxvbmcgKi8KKyAgaW50ICBtYXhjb25uZWN0OyAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBjb25uZWN0IHRpbWUgKHNlY29uZHMpICovCisKKyAgY2hhciB1c2VyICAgICAgIFtNQVhOQU1FTEVOICAgKyAxXTsgLyogVXNlcm5hbWUgZm9yIFBBUCAqLworICBjaGFyIHBhc3N3ZCAgICAgW01BWFNFQ1JFVExFTiArIDFdOyAvKiBQYXNzd29yZCBmb3IgUEFQLCBzZWNyZXQgZm9yIENIQVAgKi8KKyAgY2hhciBvdXJfbmFtZSAgIFtNQVhOQU1FTEVOICAgKyAxXTsgLyogT3VyIG5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uIHB1cnBvc2VzICovCisgIGNoYXIgcmVtb3RlX25hbWVbTUFYTkFNRUxFTiAgICsgMV07IC8qIFBlZXIncyBuYW1lIGZvciBhdXRoZW50aWNhdGlvbiAqLworfTsKKworc3RydWN0IHBwcF9hZGRycyB7CisgIGlwX2FkZHJfdCBvdXJfaXBhZGRyLCBoaXNfaXBhZGRyLCBuZXRtYXNrLCBkbnMxLCBkbnMyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogUFVCTElDIERBVEEgU1RSVUNUVVJFUyAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCdWZmZXJzIGZvciBvdXRnb2luZyBwYWNrZXRzLiAqLworZXh0ZXJuIHVfY2hhciBvdXRwYWNrZXRfYnVmW05VTV9QUFBdW1BQUF9NUlUrUFBQX0hEUkxFTl07CisKK2V4dGVybiBzdHJ1Y3QgcHBwX3NldHRpbmdzIHBwcF9zZXR0aW5nczsKKworZXh0ZXJuIHN0cnVjdCBwcm90ZW50ICpwcHBfcHJvdG9jb2xzW107IC8qIFRhYmxlIG9mIHBvaW50ZXJzIHRvIHN1cHBvcnRlZCBwcm90b2NvbHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBQVUJMSUMgRlVOQ1RJT05TICoqKgorKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemUgdGhlIFBQUCBzdWJzeXN0ZW0uICovCit2b2lkIHBwcEluaXQodm9pZCk7CisKKy8qIFdhcm5pbmc6IFVzaW5nIFBQUEFVVEhUWVBFX0FOWSBtaWdodCBoYXZlIHNlY3VyaXR5IGNvbnNlcXVlbmNlcy4KKyAqIFJGQyAxOTk0IHNheXM6CisgKgorICogSW4gcHJhY3RpY2UsIHdpdGhpbiBvciBhc3NvY2lhdGVkIHdpdGggZWFjaCBQUFAgc2VydmVyLCB0aGVyZSBpcyBhCisgKiBkYXRhYmFzZSB3aGljaCBhc3NvY2lhdGVzICJ1c2VyIiBuYW1lcyB3aXRoIGF1dGhlbnRpY2F0aW9uCisgKiBpbmZvcm1hdGlvbiAoInNlY3JldHMiKS4gIEl0IGlzIG5vdCBhbnRpY2lwYXRlZCB0aGF0IGEgcGFydGljdWxhcgorICogbmFtZWQgdXNlciB3b3VsZCBiZSBhdXRoZW50aWNhdGVkIGJ5IG11bHRpcGxlIG1ldGhvZHMuICBUaGlzIHdvdWxkCisgKiBtYWtlIHRoZSB1c2VyIHZ1bG5lcmFibGUgdG8gYXR0YWNrcyB3aGljaCBuZWdvdGlhdGUgdGhlIGxlYXN0IHNlY3VyZQorICogbWV0aG9kIGZyb20gYW1vbmcgYSBzZXQgKHN1Y2ggYXMgUEFQIHJhdGhlciB0aGFuIENIQVApLiAgSWYgdGhlIHNhbWUKKyAqIHNlY3JldCB3YXMgdXNlZCwgUEFQIHdvdWxkIHJldmVhbCB0aGUgc2VjcmV0IHRvIGJlIHVzZWQgbGF0ZXIgd2l0aAorICogQ0hBUC4KKyAqCisgKiBJbnN0ZWFkLCBmb3IgZWFjaCB1c2VyIG5hbWUgdGhlcmUgc2hvdWxkIGJlIGFuIGluZGljYXRpb24gb2YgZXhhY3RseQorICogb25lIG1ldGhvZCB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGF0IHVzZXIgbmFtZS4gIElmIGEgdXNlciBuZWVkcyB0bworICogbWFrZSB1c2Ugb2YgZGlmZmVyZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgdW5kZXIgZGlmZmVyZW50CisgKiBjaXJjdW1zdGFuY2VzLCB0aGVuIGRpc3RpbmN0IHVzZXIgbmFtZXMgU0hPVUxEIGJlIGVtcGxveWVkLCBlYWNoIG9mCisgKiB3aGljaCBpZGVudGlmaWVzIGV4YWN0bHkgb25lIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4KKyAqCisgKi8KK2VudW0gcHBwQXV0aFR5cGUgeworICAgIFBQUEFVVEhUWVBFX05PTkUsCisgICAgUFBQQVVUSFRZUEVfQU5ZLAorICAgIFBQUEFVVEhUWVBFX1BBUCwKKyAgICBQUFBBVVRIVFlQRV9DSEFQCit9OworCit2b2lkIHBwcFNldEF1dGgoZW51bSBwcHBBdXRoVHlwZSBhdXRoVHlwZSwgY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAqcGFzc3dkKTsKKworLyoKKyAqIE9wZW4gYSBuZXcgUFBQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIGdpdmVuIHNlcmlhbCBJL08gZGV2aWNlLgorICogVGhpcyBpbml0aWFsaXplcyB0aGUgUFBQIGNvbnRyb2wgYmxvY2sgYnV0IGRvZXMgbm90CisgKiBhdHRlbXB0IHRvIG5lZ290aWF0ZSB0aGUgTENQIHNlc3Npb24uCisgKiBSZXR1cm4gYSBuZXcgUFBQIGNvbm5lY3Rpb24gZGVzY3JpcHRvciBvbiBzdWNjZXNzIG9yCisgKiBhbiBlcnJvciBjb2RlIChuZWdhdGl2ZSkgb24gZmFpbHVyZS4gCisgKi8KK2ludCBwcHBPdmVyU2VyaWFsT3BlbihzaW9fZmRfdCBmZCwgdm9pZCAoKmxpbmtTdGF0dXNDQikodm9pZCAqY3R4LCBpbnQgZXJyQ29kZSwgdm9pZCAqYXJnKSwgdm9pZCAqbGlua1N0YXR1c0N0eCk7CisKKy8qCisgKiBPcGVuIGEgbmV3IFBQUCBPdmVyIEV0aGVybmV0IChQUFBPRSkgY29ubmVjdGlvbi4KKyAqLworaW50IHBwcE92ZXJFdGhlcm5ldE9wZW4oc3RydWN0IG5ldGlmICpldGhpZiwgY29uc3QgY2hhciAqc2VydmljZV9uYW1lLCBjb25zdCBjaGFyICpjb25jZW50cmF0b3JfbmFtZSwgdm9pZCAoKmxpbmtTdGF0dXNDQikodm9pZCAqY3R4LCBpbnQgZXJyQ29kZSwgdm9pZCAqYXJnKSwgdm9pZCAqbGlua1N0YXR1c0N0eCk7CisKKy8qIGZvciBzb3VyY2UgY29kZSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIHBwcE9wZW4oZmQsY2IsbHMpIHBwcE92ZXJTZXJpYWxPcGVuKGZkLGNiLGxzKQorCisvKgorICogQ2xvc2UgYSBQUFAgY29ubmVjdGlvbiBhbmQgcmVsZWFzZSB0aGUgZGVzY3JpcHRvci4gCisgKiBBbnkgb3V0c3RhbmRpbmcgcGFja2V0cyBpbiB0aGUgcXVldWVzIGFyZSBkcm9wcGVkLgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvbiBmYWlsdXJlLiAKKyAqLworaW50IHBwcENsb3NlKGludCBwZCk7CisKKy8qCisgKiBJbmRpY2F0ZSB0byB0aGUgUFBQIHByb2Nlc3MgdGhhdCB0aGUgbGluZSBoYXMgZGlzY29ubmVjdGVkLgorICovCit2b2lkIHBwcFNpZ0hVUChpbnQgcGQpOworCisvKgorICogR2V0IGFuZCBzZXQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIGNvbm5lY3Rpb24uCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG9uIGZhaWx1cmUuIAorICovCitpbnQgIHBwcElPQ3RsKGludCBwZCwgaW50IGNtZCwgdm9pZCAqYXJnKTsKKworLyoKKyAqIFJldHVybiB0aGUgTWF4aW11bSBUcmFuc21pc3Npb24gVW5pdCBmb3IgdGhlIGdpdmVuIFBQUCBjb25uZWN0aW9uLgorICovCit1X3Nob3J0IHBwcE1UVShpbnQgcGQpOworCisvKgorICogV3JpdGUgbiBjaGFyYWN0ZXJzIHRvIGEgcHBwIGxpbmsuCisgKiBSRVRVUk46ID49IDAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgLTEgRmFpbGVkIHRvIHdyaXRlIHRvIGRldmljZS4KKyAqLworaW50IHBwcFdyaXRlKGludCBwZCwgY29uc3QgdV9jaGFyICpzLCBpbnQgbik7CisKK3ZvaWQgcHBwSW5Qcm9jT3ZlckV0aGVybmV0KGludCBwZCwgc3RydWN0IHBidWYgKnBiKTsKKworc3RydWN0IHBidWYgKnBwcFNpbmdsZUJ1ZihzdHJ1Y3QgcGJ1ZiAqcCk7CisKK3ZvaWQgcHBwTGlua1Rlcm1pbmF0ZWQoaW50IHBkKTsKKwordm9pZCBwcHBMaW5rRG93bihpbnQgcGQpOworCit2b2lkIHBwcG9zX2lucHV0KGludCBwZCwgdV9jaGFyKiBkYXRhLCBpbnQgbGVuKTsKKworLyogQ29uZmlndXJlIGkvZiB0cmFuc21pdCBwYXJhbWV0ZXJzICovCit2b2lkIHBwcF9zZW5kX2NvbmZpZyAoaW50LCB1MTZfdCwgdTMyX3QsIGludCwgaW50KTsKKy8qIFNldCBleHRlbmRlZCB0cmFuc21pdCBBQ0NNICovCit2b2lkIHBwcF9zZXRfeGFjY20gKGludCwgZXh0X2FjY20gKik7CisvKiBDb25maWd1cmUgaS9mIHJlY2VpdmUgcGFyYW1ldGVycyAqLwordm9pZCBwcHBfcmVjdl9jb25maWcgKGludCwgaW50LCB1MzJfdCwgaW50LCBpbnQpOworLyogRmluZCBvdXQgaG93IGxvbmcgbGluayBoYXMgYmVlbiBpZGxlICovCitpbnQgIGdldF9pZGxlX3RpbWUgKGludCwgc3RydWN0IHBwcF9pZGxlICopOworCisvKiBDb25maWd1cmUgVkogVENQIGhlYWRlciBjb21wcmVzc2lvbiAqLworaW50ICBzaWZ2amNvbXAgKGludCwgaW50LCB1OF90LCB1OF90KTsKKy8qIENvbmZpZ3VyZSBpL2YgZG93biAoZm9yIElQKSAqLworaW50ICBzaWZ1cCAoaW50KTsKKy8qIFNldCBtb2RlIGZvciBoYW5kbGluZyBwYWNrZXRzIGZvciBwcm90byAqLworaW50ICBzaWZucG1vZGUgKGludCB1LCBpbnQgcHJvdG8sIGVudW0gTlBtb2RlIG1vZGUpOworLyogQ29uZmlndXJlIGkvZiBkb3duIChmb3IgSVApICovCitpbnQgIHNpZmRvd24gKGludCk7CisvKiBDb25maWd1cmUgSVAgYWRkcmVzc2VzIGZvciBpL2YgKi8KK2ludCAgc2lmYWRkciAoaW50LCB1MzJfdCwgdTMyX3QsIHUzMl90LCB1MzJfdCwgdTMyX3QpOworLyogUmVzZXQgaS9mIElQIGFkZHJlc3NlcyAqLworaW50ICBjaWZhZGRyIChpbnQsIHUzMl90LCB1MzJfdCk7CisvKiBDcmVhdGUgZGVmYXVsdCByb3V0ZSB0aHJvdWdoIGkvZiAqLworaW50ICBzaWZkZWZhdWx0cm91dGUgKGludCwgdTMyX3QsIHUzMl90KTsKKy8qIERlbGV0ZSBkZWZhdWx0IHJvdXRlIHRocm91Z2ggaS9mICovCitpbnQgIGNpZmRlZmF1bHRyb3V0ZSAoaW50LCB1MzJfdCwgdTMyX3QpOworCisvKiBHZXQgYXBwcm9wcmlhdGUgbmV0bWFzayBmb3IgYWRkcmVzcyAqLwordTMyX3QgR2V0TWFzayAodTMyX3QpOyAKKworI2lmIExXSVBfTkVUSUZfU1RBVFVTX0NBTExCQUNLCit2b2lkIHBwcF9zZXRfbmV0aWZfc3RhdHVzY2FsbGJhY2soaW50IHBkLCBuZXRpZl9zdGF0dXNfY2FsbGJhY2tfZm4gc3RhdHVzX2NhbGxiYWNrKTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX1NUQVRVU19DQUxMQkFDSyAqLworI2lmIExXSVBfTkVUSUZfTElOS19DQUxMQkFDSwordm9pZCBwcHBfc2V0X25ldGlmX2xpbmtjYWxsYmFjayhpbnQgcGQsIG5ldGlmX3N0YXR1c19jYWxsYmFja19mbiBsaW5rX2NhbGxiYWNrKTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0xJTktfQ0FMTEJBQ0sgKi8KKworI2VuZGlmIC8qIFBQUF9TVVBQT1JUICovCisKKyNlbmRpZiAvKiBQUFBfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvcHBwX29lLmMgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9wcHBfb2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDBhMGJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvcHBwX29lLmMKQEAgLTAsMCArMSwxMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcHBwX29lLmMgLSBQUFAgT3ZlciBFdGhlcm5ldCBpbXBsZW1lbnRhdGlvbiBmb3IgbHdJUC4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDA2IGJ5IE1hcmMgQm91Y2hlciwgU2VydmljZXMgSW5mb3JtYXRpcXVlcyAoTUJTSSkgaW5jLgorKgorKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKKyogYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAorKiB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMKKyogbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXJlIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSAKKyogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkCisqIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTICpBUyBJUyogQU5EIEFOWSBFWFBSRVNTIE9SCisqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUkVWSVNJT04gSElTVE9SWQorKgorKiAwNi0wMS0wMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyogICBQb3J0ZWQgdG8gbHdJUC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyogYmFzZWQgb24gTmV0QlNEOiBpZl9wcHBvZS5jLHYgMS42NCAyMDA2LzAxLzMxIDIzOjUwOjE1IG1hcnRpbiBFeHAgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBGb3VuZGF0aW9uCisgKiBieSBNYXJ0aW4gSHVzZW1hbm4gPG1hcnRpbkBOZXRCU0Qub3JnPi4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE5ldEJTRAorICogICAgICAgIEZvdW5kYXRpb24sIEluYy4gYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBOZXRCU0QgRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImx3aXAvb3B0LmgiCisKKyNpZiBQUFBPRV9TVVBQT1JUIC8qIGRvbid0IGJ1aWxkIGlmIG5vdCBjb25maWd1cmVkIGZvciB1c2UgaW4gbHdpcG9wdHMuaCAqLworCisjaW5jbHVkZSAibmV0aWYvcHBwX29lLmgiCisKKyNpbmNsdWRlICJwcHAuaCIKKyNpbmNsdWRlICJwcHBkZWJ1Zy5oIgorCisjaW5jbHVkZSAibHdpcC90aW1lcnMuaCIKKyNpbmNsdWRlICJsd2lwL21lbXAuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKworLyogQWRkIGEgMTYgYml0IHVuc2lnbmVkIHZhbHVlIHRvIGEgYnVmZmVyIHBvaW50ZWQgdG8gYnkgUFRSICovCisjZGVmaW5lIFBQUE9FX0FERF8xNihQVFIsIFZBTCkgXAorICAgICooUFRSKSsrID0gKHU4X3QpKChWQUwpIC8gMjU2KTsgICAgXAorICAgICooUFRSKSsrID0gKHU4X3QpKChWQUwpICUgMjU2KQorCisvKiBBZGQgYSBjb21wbGV0ZSBQUFBvRSBoZWFkZXIgdG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IFBUUiAqLworI2RlZmluZSBQUFBPRV9BRERfSEVBREVSKFBUUiwgQ09ERSwgU0VTUywgTEVOKSAgXAorICAgICooUFRSKSsrID0gUFBQT0VfVkVSVFlQRTsgIFwKKyAgICAqKFBUUikrKyA9IChDT0RFKTsgICAgICAgICBcCisgICAgUFBQT0VfQUREXzE2KFBUUiwgU0VTUyk7ICAgXAorICAgIFBQUE9FX0FERF8xNihQVFIsIExFTikKKworI2RlZmluZSBQUFBPRV9ESVNDX1RJTUVPVVQgKDUqMTAwMCkgIC8qIGJhc2UgZm9yIHF1aWNrIHRpbWVvdXQgY2FsY3VsYXRpb24gKi8KKyNkZWZpbmUgUFBQT0VfU0xPV19SRVRSWSAgICg2MCoxMDAwKSAvKiBwZXJzaXN0ZW50IHJldHJ5IGludGVydmFsICovCisjZGVmaW5lIFBQUE9FX0RJU0NfTUFYUEFESSAgNCAgICAgICAgLyogcmV0cnkgUEFESSBmb3VyIHRpbWVzIChxdWlja2x5KSAqLworI2RlZmluZSBQUFBPRV9ESVNDX01BWFBBRFIgIDIgICAgICAgIC8qIHJldHJ5IFBBRFIgdHdpY2UgKi8KKworI2lmZGVmIFBQUE9FX1NFUlZFUgorI2Vycm9yICJQUFBPRV9TRVJWRVIgaXMgbm90IHlldCBzdXBwb3J0ZWQgdW5kZXIgbHdJUCEiCisvKiBmcm9tIGlmX3NwcHBzdWJyLmMgKi8KKyNkZWZpbmUgSUZGX1BBU1NJVkUgSUZGX0xJTkswIC8qIHdhaXQgcGFzc2l2ZWx5IGZvciBjb25uZWN0aW9uICovCisjZW5kaWYKKworI2lmbmRlZiBQUFBPRV9FUlJPUlNUUklOR19MRU4KKyNkZWZpbmUgUFBQT0VfRVJST1JTVFJJTkdfTEVOICAgICA2NAorI2VuZGlmCitzdGF0aWMgY2hhciBwcHBvZV9lcnJvcl90bXBbUFBQT0VfRVJST1JTVFJJTkdfTEVOXTsKKworCisvKiBpbnB1dCByb3V0aW5lcyAqLworc3RhdGljIHZvaWQgcHBwb2VfZGlzcGF0Y2hfZGlzY19wa3Qoc3RydWN0IG5ldGlmICosIHN0cnVjdCBwYnVmICopOworCisvKiBtYW5hZ2VtZW50IHJvdXRpbmVzICovCitzdGF0aWMgaW50IHBwcG9lX2RvX2Rpc2Nvbm5lY3Qoc3RydWN0IHBwcG9lX3NvZnRjICopOworc3RhdGljIHZvaWQgcHBwb2VfYWJvcnRfY29ubmVjdChzdHJ1Y3QgcHBwb2Vfc29mdGMgKik7CitzdGF0aWMgdm9pZCBwcHBvZV9jbGVhcl9zb2Z0YyhzdHJ1Y3QgcHBwb2Vfc29mdGMgKiwgY29uc3QgY2hhciAqKTsKKworLyogaW50ZXJuYWwgdGltZW91dCBoYW5kbGluZyAqLworc3RhdGljIHZvaWQgcHBwb2VfdGltZW91dCh2b2lkICopOworCisvKiBzZW5kaW5nIGFjdHVhbCBwcm90b2NvbCBjb250cm9sbCBwYWNrZXRzICovCitzdGF0aWMgZXJyX3QgcHBwb2Vfc2VuZF9wYWRpKHN0cnVjdCBwcHBvZV9zb2Z0YyAqKTsKK3N0YXRpYyBlcnJfdCBwcHBvZV9zZW5kX3BhZHIoc3RydWN0IHBwcG9lX3NvZnRjICopOworI2lmZGVmIFBQUE9FX1NFUlZFUgorc3RhdGljIGVycl90IHBwcG9lX3NlbmRfcGFkbyhzdHJ1Y3QgcHBwb2Vfc29mdGMgKik7CitzdGF0aWMgZXJyX3QgcHBwb2Vfc2VuZF9wYWRzKHN0cnVjdCBwcHBvZV9zb2Z0YyAqKTsKKyNlbmRpZgorc3RhdGljIGVycl90IHBwcG9lX3NlbmRfcGFkdChzdHJ1Y3QgbmV0aWYgKiwgdV9pbnQsIGNvbnN0IHU4X3QgKik7CisKKy8qIGludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgcHBwb2Vfc29mdGMgKiBwcHBvZV9maW5kX3NvZnRjX2J5X3Nlc3Npb24odV9pbnQsIHN0cnVjdCBuZXRpZiAqKTsKK3N0YXRpYyBzdHJ1Y3QgcHBwb2Vfc29mdGMgKiBwcHBvZV9maW5kX3NvZnRjX2J5X2h1bmlxdWUodThfdCAqLCBzaXplX3QsIHN0cnVjdCBuZXRpZiAqKTsKKworLyoqIGxpbmtlZCBsaXN0IG9mIGNyZWF0ZWQgcHBwb2UgaW50ZXJmYWNlcyAqLworc3RhdGljIHN0cnVjdCBwcHBvZV9zb2Z0YyAqcHBwb2Vfc29mdGNfbGlzdDsKKworZXJyX3QKK3BwcG9lX2NyZWF0ZShzdHJ1Y3QgbmV0aWYgKmV0aGlmLCBpbnQgcGQsIHZvaWQgKCpsaW5rU3RhdHVzQ0IpKGludCBwZCwgaW50IHVwKSwgc3RydWN0IHBwcG9lX3NvZnRjICoqc2NwdHIpCit7CisgIHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2M7CisKKyAgc2MgPSAoc3RydWN0IHBwcG9lX3NvZnRjICopbWVtcF9tYWxsb2MoTUVNUF9QUFBPRV9JRik7CisgIGlmIChzYyA9PSBOVUxMKSB7CisgICAgKnNjcHRyID0gTlVMTDsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorICBtZW1zZXQoc2MsIDAsIHNpemVvZihzdHJ1Y3QgcHBwb2Vfc29mdGMpKTsKKworICAvKiBjaGFuZ2VkIHRvIHJlYWwgYWRkcmVzcyBsYXRlciAqLworICBNRU1DUFkoJnNjLT5zY19kZXN0LCBldGhicm9hZGNhc3QuYWRkciwgc2l6ZW9mKHNjLT5zY19kZXN0KSk7CisKKyAgc2MtPnNjX3BkID0gcGQ7CisgIHNjLT5zY19saW5rU3RhdHVzQ0IgPSBsaW5rU3RhdHVzQ0I7CisgIHNjLT5zY19ldGhpZiA9IGV0aGlmOworCisgIC8qIHB1dCB0aGUgbmV3IGludGVyZmFjZSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworICBzYy0+bmV4dCA9IHBwcG9lX3NvZnRjX2xpc3Q7CisgIHBwcG9lX3NvZnRjX2xpc3QgPSBzYzsKKworICAqc2NwdHIgPSBzYzsKKworICByZXR1cm4gRVJSX09LOworfQorCitlcnJfdAorcHBwb2VfZGVzdHJveShzdHJ1Y3QgbmV0aWYgKmlmcCkKK3sKKyAgc3RydWN0IHBwcG9lX3NvZnRjICpzYywgKnByZXYgPSBOVUxMOworCisgIGZvciAoc2MgPSBwcHBvZV9zb2Z0Y19saXN0OyBzYyAhPSBOVUxMOyBwcmV2ID0gc2MsIHNjID0gc2MtPm5leHQpIHsKKyAgICBpZiAoc2MtPnNjX2V0aGlmID09IGlmcCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYoIShzYyAmJiAoc2MtPnNjX2V0aGlmID09IGlmcCkpKSB7CisgICAgcmV0dXJuIEVSUl9JRjsKKyAgfQorCisgIHN5c191bnRpbWVvdXQocHBwb2VfdGltZW91dCwgc2MpOworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgLyogcmVtb3ZlIHNjIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KKyAgICBwcHBvZV9zb2Z0Y19saXN0ID0gc2MtPm5leHQ7CisgIH0gZWxzZSB7CisgICAgLyogcmVtb3ZlIHNjIGZyb20gdGhlIGxpc3QgKi8KKyAgICBwcmV2LT5uZXh0ID0gc2MtPm5leHQ7CisgIH0KKworI2lmZGVmIFBQUE9FX1RPRE8KKyAgaWYgKHNjLT5zY19jb25jZW50cmF0b3JfbmFtZSkgeworICAgIG1lbV9mcmVlKHNjLT5zY19jb25jZW50cmF0b3JfbmFtZSk7CisgIH0KKyAgaWYgKHNjLT5zY19zZXJ2aWNlX25hbWUpIHsKKyAgICBtZW1fZnJlZShzYy0+c2Nfc2VydmljZV9uYW1lKTsKKyAgfQorI2VuZGlmIC8qIFBQUE9FX1RPRE8gKi8KKyAgbWVtcF9mcmVlKE1FTVBfUFBQT0VfSUYsIHNjKTsKKworICByZXR1cm4gRVJSX09LOworfQorCisvKgorICogRmluZCB0aGUgaW50ZXJmYWNlIGhhbmRsaW5nIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbi4KKyAqIE5vdGU6IE8obnVtYmVyIG9mIHNlc3Npb25zIG9wZW4pLCB0aGlzIGlzIGEgY2xpZW50LXNpZGUgb25seSwgbWVhbgorICogYW5kIGxlYW4gaW1wbGVtZW50YXRpb24sIHNvIG51bWJlciBvZiBvcGVuIHNlc3Npb25zIHR5cGljYWxseSBzaG91bGQKKyAqIGJlIDEuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHBwb2Vfc29mdGMgKgorcHBwb2VfZmluZF9zb2Z0Y19ieV9zZXNzaW9uKHVfaW50IHNlc3Npb24sIHN0cnVjdCBuZXRpZiAqcmN2aWYpCit7CisgIHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2M7CisKKyAgaWYgKHNlc3Npb24gPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZm9yIChzYyA9IHBwcG9lX3NvZnRjX2xpc3Q7IHNjICE9IE5VTEw7IHNjID0gc2MtPm5leHQpIHsKKyAgICBpZiAoc2MtPnNjX3N0YXRlID09IFBQUE9FX1NUQVRFX1NFU1NJT04KKyAgICAgICAgJiYgc2MtPnNjX3Nlc3Npb24gPT0gc2Vzc2lvbikgeworICAgICAgaWYgKHNjLT5zY19ldGhpZiA9PSByY3ZpZikgeworICAgICAgICByZXR1cm4gc2M7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIGhvc3QgdW5pcXVlIHRva2VuIHBhc3NlZCBhbmQgcmV0dXJuIGFwcHJvcHJpYXRlIHNvZnRjIHBvaW50ZXIsCisgKiBvciBOVUxMIGlmIHRva2VuIGlzIGJvZ3VzLiAqLworc3RhdGljIHN0cnVjdCBwcHBvZV9zb2Z0YyAqCitwcHBvZV9maW5kX3NvZnRjX2J5X2h1bmlxdWUodThfdCAqdG9rZW4sIHNpemVfdCBsZW4sIHN0cnVjdCBuZXRpZiAqcmN2aWYpCit7CisgIHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2MsICp0OworCisgIGlmIChwcHBvZV9zb2Z0Y19saXN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChsZW4gIT0gc2l6ZW9mIHNjKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgTUVNQ1BZKCZ0LCB0b2tlbiwgbGVuKTsKKworICBmb3IgKHNjID0gcHBwb2Vfc29mdGNfbGlzdDsgc2MgIT0gTlVMTDsgc2MgPSBzYy0+bmV4dCkgeworICAgIGlmIChzYyA9PSB0KSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoc2MgPT0gTlVMTCkgeworICAgIFBQUERFQlVHKExPR19ERUJVRywgKCJwcHBvZTogYWxpZW4gaG9zdCB1bmlxdWUgdGFnLCBubyBzZXNzaW9uIGZvdW5kXG4iKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBzaG91bGQgYmUgc2FmZSB0byBhY2Nlc3MgKnNjIG5vdyAqLworICBpZiAoc2MtPnNjX3N0YXRlIDwgUFBQT0VfU1RBVEVfUEFESV9TRU5UIHx8IHNjLT5zY19zdGF0ZSA+PSBQUFBPRV9TVEFURV9TRVNTSU9OKSB7CisgICAgcHJpbnRmKCIlYyVjJSJVMTZfRiI6IGhvc3QgdW5pcXVlIHRhZyBmb3VuZCwgYnV0IGl0IGJlbG9uZ3MgdG8gYSBjb25uZWN0aW9uIGluIHN0YXRlICVkXG4iLAorICAgICAgc2MtPnNjX2V0aGlmLT5uYW1lWzBdLCBzYy0+c2NfZXRoaWYtPm5hbWVbMV0sIHNjLT5zY19ldGhpZi0+bnVtLCBzYy0+c2Nfc3RhdGUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzYy0+c2NfZXRoaWYgIT0gcmN2aWYpIHsKKyAgICBwcmludGYoIiVjJWMlIlUxNl9GIjogd3JvbmcgaW50ZXJmYWNlLCBub3QgYWNjZXB0aW5nIGhvc3QgdW5pcXVlXG4iLAorICAgICAgc2MtPnNjX2V0aGlmLT5uYW1lWzBdLCBzYy0+c2NfZXRoaWYtPm5hbWVbMV0sIHNjLT5zY19ldGhpZi0+bnVtKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gc2M7Cit9CisKK3N0YXRpYyB2b2lkCitwcHBvZV9saW5rc3RhdHVzX3VwKHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2MpCit7CisgIHNjLT5zY19saW5rU3RhdHVzQ0Ioc2MtPnNjX3BkLCAxKTsKK30KKworLyogYW5hbHl6ZSBhbmQgaGFuZGxlIGEgc2luZ2xlIHJlY2VpdmVkIHBhY2tldCB3aGlsZSBub3QgaW4gc2Vzc2lvbiBzdGF0ZSAqLworc3RhdGljIHZvaWQKK3BwcG9lX2Rpc3BhdGNoX2Rpc2NfcGt0KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwYikKK3sKKyAgdTE2X3QgdGFnLCBsZW47CisgIHUxNl90IHNlc3Npb24sIHBsZW47CisgIHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2M7CisgIGNvbnN0IGNoYXIgKmVycl9tc2c7CisgIGNoYXIgZGV2bmFtZVs2XTsKKyAgdThfdCAqYWNfY29va2llOworICB1MTZfdCBhY19jb29raWVfbGVuOworI2lmZGVmIFBQUE9FX1NFUlZFUgorICB1OF90ICpodW5pcXVlOworICBzaXplX3QgaHVuaXF1ZV9sZW47CisjZW5kaWYKKyAgc3RydWN0IHBwcG9laGRyICpwaDsKKyAgc3RydWN0IHBwcG9ldGFnIHB0OworICBpbnQgb2ZmLCBlcnIsIGVycm9ydGFnOworICBzdHJ1Y3QgZXRoX2hkciAqZXRoaGRyOworCisgIHBiID0gcHBwU2luZ2xlQnVmKHBiKTsKKworICBzdHJjcHkoZGV2bmFtZSwgInBwcG9lIik7ICAvKiBhcyBsb25nIGFzIHdlIGRvbid0IGtub3cgd2hpY2ggaW5zdGFuY2UgKi8KKyAgZXJyX21zZyA9IE5VTEw7CisgIGVycm9ydGFnID0gMDsKKyAgaWYgKHBiLT5sZW4gPCBzaXplb2YoKmV0aGhkcikpIHsKKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgZXRoaGRyID0gKHN0cnVjdCBldGhfaGRyICopcGItPnBheWxvYWQ7CisgIG9mZiA9IHNpemVvZigqZXRoaGRyKTsKKworICBhY19jb29raWUgPSBOVUxMOworICBhY19jb29raWVfbGVuID0gMDsKKyNpZmRlZiBQUFBPRV9TRVJWRVIKKyAgaHVuaXF1ZSA9IE5VTEw7CisgIGh1bmlxdWVfbGVuID0gMDsKKyNlbmRpZgorICBzZXNzaW9uID0gMDsKKyAgaWYgKHBiLT5sZW4gLSBvZmYgPCBQUFBPRV9IRUFERVJMRU4pIHsKKyAgICBwcmludGYoInBwcG9lOiBwYWNrZXQgdG9vIHNob3J0OiAlZFxuIiwgcGItPmxlbik7CisgICAgZ290byBkb25lOworICB9CisKKyAgcGggPSAoc3RydWN0IHBwcG9laGRyICopIChldGhoZHIgKyAxKTsKKyAgaWYgKHBoLT52ZXJ0eXBlICE9IFBQUE9FX1ZFUlRZUEUpIHsKKyAgICBwcmludGYoInBwcG9lOiB1bmtub3duIHZlcnNpb24vdHlwZSBwYWNrZXQ6IDB4JXhcbiIsIHBoLT52ZXJ0eXBlKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgc2Vzc2lvbiA9IG50b2hzKHBoLT5zZXNzaW9uKTsKKyAgcGxlbiA9IG50b2hzKHBoLT5wbGVuKTsKKyAgb2ZmICs9IHNpemVvZigqcGgpOworCisgIGlmIChwbGVuICsgb2ZmID4gcGItPmxlbikgeworICAgIHByaW50ZigicHBwb2U6IHBhY2tldCBjb250ZW50IGRvZXMgbm90IGZpdDogZGF0YSBhdmFpbGFibGUgPSAlZCwgcGFja2V0IHNpemUgPSAldVxuIiwKKyAgICAgICAgcGItPmxlbiAtIG9mZiwgcGxlbik7CisgICAgZ290byBkb25lOworICB9CisgIGlmKHBiLT50b3RfbGVuID09IHBiLT5sZW4pIHsKKyAgICBwYi0+dG90X2xlbiA9IHBiLT5sZW4gPSAodTE2X3Qpb2ZmICsgcGxlbjsgLyogaWdub3JlIHRyYWlsaW5nIGdhcmJhZ2UgKi8KKyAgfQorICB0YWcgPSAwOworICBsZW4gPSAwOworICBzYyA9IE5VTEw7CisgIHdoaWxlIChvZmYgKyBzaXplb2YocHQpIDw9IHBiLT5sZW4pIHsKKyAgICBNRU1DUFkoJnB0LCAodThfdCopcGItPnBheWxvYWQgKyBvZmYsIHNpemVvZihwdCkpOworICAgIHRhZyA9IG50b2hzKHB0LnRhZyk7CisgICAgbGVuID0gbnRvaHMocHQubGVuKTsKKyAgICBpZiAob2ZmICsgc2l6ZW9mKHB0KSArIGxlbiA+IHBiLT5sZW4pIHsKKyAgICAgIHByaW50ZigicHBwb2U6IHRhZyAweCV4IGxlbiAweCV4IGlzIHRvbyBsb25nXG4iLCB0YWcsIGxlbik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIFBQUE9FX1RBR19FT0w6CisgICAgICAgIGdvdG8gYnJlYWticmVhazsKKyAgICAgIGNhc2UgUFBQT0VfVEFHX1NOQU1FOgorICAgICAgICBicmVhazsgIC8qIGlnbm9yZWQgKi8KKyAgICAgIGNhc2UgUFBQT0VfVEFHX0FDTkFNRToKKyAgICAgICAgYnJlYWs7ICAvKiBpZ25vcmVkICovCisgICAgICBjYXNlIFBQUE9FX1RBR19IVU5JUVVFOgorICAgICAgICBpZiAoc2MgIT0gTlVMTCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjaWZkZWYgUFBQT0VfU0VSVkVSCisgICAgICAgIGh1bmlxdWUgPSAodThfdCopcGItPnBheWxvYWQgKyBvZmYgKyBzaXplb2YocHQpOworICAgICAgICBodW5pcXVlX2xlbiA9IGxlbjsKKyNlbmRpZgorICAgICAgICBzYyA9IHBwcG9lX2ZpbmRfc29mdGNfYnlfaHVuaXF1ZSgodThfdCopcGItPnBheWxvYWQgKyBvZmYgKyBzaXplb2YocHQpLCBsZW4sIG5ldGlmKTsKKyAgICAgICAgaWYgKHNjICE9IE5VTEwpIHsKKyAgICAgICAgICBzbnByaW50ZihkZXZuYW1lLCBzaXplb2YoZGV2bmFtZSksICIlYyVjJSJVMTZfRiwgc2MtPnNjX2V0aGlmLT5uYW1lWzBdLCBzYy0+c2NfZXRoaWYtPm5hbWVbMV0sIHNjLT5zY19ldGhpZi0+bnVtKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFBQT0VfVEFHX0FDQ09PS0lFOgorICAgICAgICBpZiAoYWNfY29va2llID09IE5VTEwpIHsKKyAgICAgICAgICBhY19jb29raWUgPSAodThfdCopcGItPnBheWxvYWQgKyBvZmYgKyBzaXplb2YocHQpOworICAgICAgICAgIGFjX2Nvb2tpZV9sZW4gPSBsZW47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBQUE9FX1RBR19TTkFNRV9FUlI6CisgICAgICAgIGVycl9tc2cgPSAiU0VSVklDRSBOQU1FIEVSUk9SIjsKKyAgICAgICAgZXJyb3J0YWcgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFBQT0VfVEFHX0FDU1lTX0VSUjoKKyAgICAgICAgZXJyX21zZyA9ICJBQyBTWVNURU0gRVJST1IiOworICAgICAgICBlcnJvcnRhZyA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUFBPRV9UQUdfR0VORVJJQ19FUlI6CisgICAgICAgIGVycl9tc2cgPSAiR0VORVJJQyBFUlJPUiI7CisgICAgICAgIGVycm9ydGFnID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChlcnJfbXNnKSB7CisgICAgICBpZiAoZXJyb3J0YWcgJiYgbGVuKSB7CisgICAgICAgIHUxNl90IGVycm9yX2xlbiA9IExXSVBfTUlOKGxlbiwgc2l6ZW9mKHBwcG9lX2Vycm9yX3RtcCktMSk7CisgICAgICAgIHN0cm5jcHkocHBwb2VfZXJyb3JfdG1wLCAoY2hhciopcGItPnBheWxvYWQgKyBvZmYgKyBzaXplb2YocHQpLCBlcnJvcl9sZW4pOworICAgICAgICBwcHBvZV9lcnJvcl90bXBbZXJyb3JfbGVuLTFdID0gJ1wwJzsKKyAgICAgICAgcHJpbnRmKCIlczogJXM6ICVzXG4iLCBkZXZuYW1lLCBlcnJfbXNnLCBwcHBvZV9lcnJvcl90bXApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlczogJXNcbiIsIGRldm5hbWUsIGVycl9tc2cpOworICAgICAgfQorICAgICAgaWYgKGVycm9ydGFnKSB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICB9CisgICAgb2ZmICs9IHNpemVvZihwdCkgKyBsZW47CisgIH0KKworYnJlYWticmVhazo7CisgIHN3aXRjaCAocGgtPmNvZGUpIHsKKyAgICBjYXNlIFBQUE9FX0NPREVfUEFESToKKyNpZmRlZiBQUFBPRV9TRVJWRVIKKyAgICAgIC8qCisgICAgICAgKiBnb3Qgc2VydmljZSBuYW1lLCBjb25jZW50cmF0b3IgbmFtZSwgYW5kL29yIGhvc3QgdW5pcXVlLgorICAgICAgICogaWdub3JlIGlmIHdlIGhhdmUgbm8gaW50ZXJmYWNlcyB3aXRoIElGRl9QQVNTSVZFfElGRl9VUC4KKyAgICAgICAqLworICAgICAgaWYgKExJU1RfRU1QVFkoJnBwcG9lX3NvZnRjX2xpc3QpKSB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIExJU1RfRk9SRUFDSChzYywgJnBwcG9lX3NvZnRjX2xpc3QsIHNjX2xpc3QpIHsKKyAgICAgICAgaWYgKCEoc2MtPnNjX3NwcHAucHBfaWYuaWZfZmxhZ3MgJiBJRkZfVVApKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoc2MtPnNjX3NwcHAucHBfaWYuaWZfZmxhZ3MgJiBJRkZfUEFTU0lWRSkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2MtPnNjX3N0YXRlID09IFBQUE9FX1NUQVRFX0lOSVRJQUwpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHNjID09IE5VTEwpIHsKKyAgICAgICAgLyogcHJpbnRmKCJwcHBvZTogZnJlZSBwYXNzaXZlIGludGVyZmFjZSBpcyBub3QgZm91bmRcbiIpOyAqLworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBpZiAoaHVuaXF1ZSkgeworICAgICAgICBpZiAoc2MtPnNjX2h1bmlxdWUpIHsKKyAgICAgICAgICBtZW1fZnJlZShzYy0+c2NfaHVuaXF1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc2MtPnNjX2h1bmlxdWUgPSBtZW1fbWFsbG9jKGh1bmlxdWVfbGVuKTsKKyAgICAgICAgaWYgKHNjLT5zY19odW5pcXVlID09IE5VTEwpIHsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgICAgc2MtPnNjX2h1bmlxdWVfbGVuID0gaHVuaXF1ZV9sZW47CisgICAgICAgIE1FTUNQWShzYy0+c2NfaHVuaXF1ZSwgaHVuaXF1ZSwgaHVuaXF1ZV9sZW4pOworICAgICAgfQorICAgICAgTUVNQ1BZKCZzYy0+c2NfZGVzdCwgZWgtPmV0aGVyX3Nob3N0LCBzaXplb2Ygc2MtPnNjX2Rlc3QpOworICAgICAgc2MtPnNjX3N0YXRlID0gUFBQT0VfU1RBVEVfUEFET19TRU5UOworICAgICAgcHBwb2Vfc2VuZF9wYWRvKHNjKTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFBQUE9FX1NFUlZFUiAqLworICAgIGNhc2UgUFBQT0VfQ09ERV9QQURSOgorI2lmZGVmIFBQUE9FX1NFUlZFUgorICAgICAgLyoKKyAgICAgICAqIGdldCBzYyBmcm9tIGFjX2Nvb2tpZSBpZiBJRkZfUEFTU0lWRQorICAgICAgICovCisgICAgICBpZiAoYWNfY29va2llID09IE5VTEwpIHsKKyAgICAgICAgLyogYmUgcXVpZXQgaWYgdGhlcmUgaXMgbm90IGEgc2luZ2xlIHBwcG9lIGluc3RhbmNlICovCisgICAgICAgIHByaW50ZigicHBwb2U6IHJlY2VpdmVkIFBBRFIgYnV0IG5vdCBpbmNsdWRlcyBhY19jb29raWVcbiIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBzYyA9IHBwcG9lX2ZpbmRfc29mdGNfYnlfaHVuaXF1ZShhY19jb29raWUsIGFjX2Nvb2tpZV9sZW4sIG5ldGlmKTsKKyAgICAgIGlmIChzYyA9PSBOVUxMKSB7CisgICAgICAgIC8qIGJlIHF1aWV0IGlmIHRoZXJlIGlzIG5vdCBhIHNpbmdsZSBwcHBvZSBpbnN0YW5jZSAqLworICAgICAgICBpZiAoIUxJU1RfRU1QVFkoJnBwcG9lX3NvZnRjX2xpc3QpKSB7CisgICAgICAgICAgcHJpbnRmKCJwcHBvZTogcmVjZWl2ZWQgUEFEUiBidXQgY291bGQgbm90IGZpbmQgcmVxdWVzdCBmb3IgaXRcbiIpOworICAgICAgICB9CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGlmIChzYy0+c2Nfc3RhdGUgIT0gUFBQT0VfU1RBVEVfUEFET19TRU5UKSB7CisgICAgICAgIHByaW50ZigiJWMlYyUiVTE2X0YiOiByZWNlaXZlZCB1bmV4cGVjdGVkIFBBRFJcbiIsIHNjLT5zY19ldGhpZi0+bmFtZVswXSwgc2MtPnNjX2V0aGlmLT5uYW1lWzFdLCBzYy0+c2NfZXRoaWYtPm51bSk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGlmIChodW5pcXVlKSB7CisgICAgICAgIGlmIChzYy0+c2NfaHVuaXF1ZSkgeworICAgICAgICAgIG1lbV9mcmVlKHNjLT5zY19odW5pcXVlKTsKKyAgICAgICAgfQorICAgICAgICBzYy0+c2NfaHVuaXF1ZSA9IG1lbV9tYWxsb2MoaHVuaXF1ZV9sZW4pOworICAgICAgICBpZiAoc2MtPnNjX2h1bmlxdWUgPT0gTlVMTCkgeworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgICBzYy0+c2NfaHVuaXF1ZV9sZW4gPSBodW5pcXVlX2xlbjsKKyAgICAgICAgTUVNQ1BZKHNjLT5zY19odW5pcXVlLCBodW5pcXVlLCBodW5pcXVlX2xlbik7CisgICAgICB9CisgICAgICBwcHBvZV9zZW5kX3BhZHMoc2MpOworICAgICAgc2MtPnNjX3N0YXRlID0gUFBQT0VfU1RBVEVfU0VTU0lPTjsKKyAgICAgIHBwcG9lX2xpbmtzdGF0dXNfdXAoc2MpOyAvKiBub3RpZnkgdXBwZXIgbGF5ZXJzICovCisgICAgICBicmVhazsKKyNlbHNlCisgICAgICAvKiBpZ25vcmUsIHdlIGFyZSBubyBhY2Nlc3MgY29uY2VudHJhdG9yICovCisgICAgICBnb3RvIGRvbmU7CisjZW5kaWYgLyogUFBQT0VfU0VSVkVSICovCisgICAgY2FzZSBQUFBPRV9DT0RFX1BBRE86CisgICAgICBpZiAoc2MgPT0gTlVMTCkgeworICAgICAgICAvKiBiZSBxdWlldCBpZiB0aGVyZSBpcyBub3QgYSBzaW5nbGUgcHBwb2UgaW5zdGFuY2UgKi8KKyAgICAgICAgaWYgKHBwcG9lX3NvZnRjX2xpc3QgIT0gTlVMTCkgeworICAgICAgICAgIHByaW50ZigicHBwb2U6IHJlY2VpdmVkIFBBRE8gYnV0IGNvdWxkIG5vdCBmaW5kIHJlcXVlc3QgZm9yIGl0XG4iKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBpZiAoc2MtPnNjX3N0YXRlICE9IFBQUE9FX1NUQVRFX1BBRElfU0VOVCkgeworICAgICAgICBwcmludGYoIiVjJWMlIlUxNl9GIjogcmVjZWl2ZWQgdW5leHBlY3RlZCBQQURPXG4iLCBzYy0+c2NfZXRoaWYtPm5hbWVbMF0sIHNjLT5zY19ldGhpZi0+bmFtZVsxXSwgc2MtPnNjX2V0aGlmLT5udW0pOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBpZiAoYWNfY29va2llKSB7CisgICAgICAgIHNjLT5zY19hY19jb29raWVfbGVuID0gYWNfY29va2llX2xlbjsKKyAgICAgICAgTUVNQ1BZKHNjLT5zY19hY19jb29raWUsIGFjX2Nvb2tpZSwgYWNfY29va2llX2xlbik7CisgICAgICB9CisgICAgICBNRU1DUFkoJnNjLT5zY19kZXN0LCBldGhoZHItPnNyYy5hZGRyLCBzaXplb2Yoc2MtPnNjX2Rlc3QuYWRkcikpOworICAgICAgc3lzX3VudGltZW91dChwcHBvZV90aW1lb3V0LCBzYyk7CisgICAgICBzYy0+c2NfcGFkcl9yZXRyaWVkID0gMDsKKyAgICAgIHNjLT5zY19zdGF0ZSA9IFBQUE9FX1NUQVRFX1BBRFJfU0VOVDsKKyAgICAgIGlmICgoZXJyID0gcHBwb2Vfc2VuZF9wYWRyKHNjKSkgIT0gMCkgeworICAgICAgICBQUFBERUJVRyhMT0dfREVCVUcsICgicHBwb2U6ICVjJWMlIlUxNl9GIjogZmFpbGVkIHRvIHNlbmQgUEFEUiwgZXJyb3I9JWRcbiIsIHNjLT5zY19ldGhpZi0+bmFtZVswXSwgc2MtPnNjX2V0aGlmLT5uYW1lWzFdLCBzYy0+c2NfZXRoaWYtPm51bSwgZXJyKSk7CisgICAgICB9CisgICAgICBzeXNfdGltZW91dChQUFBPRV9ESVNDX1RJTUVPVVQgKiAoMSArIHNjLT5zY19wYWRyX3JldHJpZWQpLCBwcHBvZV90aW1lb3V0LCBzYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUE9FX0NPREVfUEFEUzoKKyAgICAgIGlmIChzYyA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIHNjLT5zY19zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgIHN5c191bnRpbWVvdXQocHBwb2VfdGltZW91dCwgc2MpOworICAgICAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInBwcG9lOiAlYyVjJSJVMTZfRiI6IHNlc3Npb24gMHgleCBjb25uZWN0ZWRcbiIsIHNjLT5zY19ldGhpZi0+bmFtZVswXSwgc2MtPnNjX2V0aGlmLT5uYW1lWzFdLCBzYy0+c2NfZXRoaWYtPm51bSwgc2Vzc2lvbikpOworICAgICAgc2MtPnNjX3N0YXRlID0gUFBQT0VfU1RBVEVfU0VTU0lPTjsKKyAgICAgIHBwcG9lX2xpbmtzdGF0dXNfdXAoc2MpOyAvKiBub3RpZnkgdXBwZXIgbGF5ZXJzICovCisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUE9FX0NPREVfUEFEVDoKKyAgICAgIGlmIChzYyA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIHBwcG9lX2NsZWFyX3NvZnRjKHNjLCAicmVjZWl2ZWQgUEFEVCIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmKHNjKSB7CisgICAgICAgIHByaW50ZigiJWMlYyUiVTE2X0YiOiB1bmtub3duIGNvZGUgKDB4JSJYMTZfRiIpIHNlc3Npb24gPSAweCUiWDE2X0YiXG4iLAorICAgICAgICAgICAgc2MtPnNjX2V0aGlmLT5uYW1lWzBdLCBzYy0+c2NfZXRoaWYtPm5hbWVbMV0sIHNjLT5zY19ldGhpZi0+bnVtLAorICAgICAgICAgICAgKHUxNl90KXBoLT5jb2RlLCBzZXNzaW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigicHBwb2U6IHVua25vd24gY29kZSAoMHglIlgxNl9GIikgc2Vzc2lvbiA9IDB4JSJYMTZfRiJcbiIsICh1MTZfdClwaC0+Y29kZSwgc2Vzc2lvbik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCitkb25lOgorICBwYnVmX2ZyZWUocGIpOworICByZXR1cm47Cit9CisKK3ZvaWQKK3BwcG9lX2Rpc2NfaW5wdXQoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IHBidWYgKnApCit7CisgIC8qIGF2b2lkIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGlzIG5vdCBhIHNpbmdsZSBwcHBvZSBpbnN0YW5jZSAqLworICBpZiAocHBwb2Vfc29mdGNfbGlzdCAhPSBOVUxMKSB7CisgICAgcHBwb2VfZGlzcGF0Y2hfZGlzY19wa3QobmV0aWYsIHApOworICB9IGVsc2UgeworICAgIHBidWZfZnJlZShwKTsKKyAgfQorfQorCit2b2lkCitwcHBvZV9kYXRhX2lucHV0KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwYikKK3sKKyAgdTE2X3Qgc2Vzc2lvbiwgcGxlbjsKKyAgc3RydWN0IHBwcG9lX3NvZnRjICpzYzsKKyAgc3RydWN0IHBwcG9laGRyICpwaDsKKyNpZmRlZiBQUFBPRV9URVJNX1VOS05PV05fU0VTU0lPTlMKKyAgdThfdCBzaG9zdFtFVEhFUl9BRERSX0xFTl07CisjZW5kaWYKKworI2lmZGVmIFBQUE9FX1RFUk1fVU5LTk9XTl9TRVNTSU9OUworICBNRU1DUFkoc2hvc3QsICgoc3RydWN0IGV0aF9oZHIgKilwYi0+cGF5bG9hZCktPnNyYy5hZGRyLCBzaXplb2Yoc2hvc3QpKTsKKyNlbmRpZgorICBpZiAocGJ1Zl9oZWFkZXIocGIsIC0oaW50KXNpemVvZihzdHJ1Y3QgZXRoX2hkcikpICE9IDApIHsKKyAgICAvKiBiYWlsIG91dCAqLworICAgIFBQUERFQlVHKExPR19FUlIsICgicHBwb2VfZGF0YV9pbnB1dDogcGJ1Zl9oZWFkZXIgZmFpbGVkXG4iKSk7CisgICAgTElOS19TVEFUU19JTkMobGluay5sZW5lcnIpOworICAgIGdvdG8gZHJvcDsKKyAgfSAKKworICBwYiA9IHBwcFNpbmdsZUJ1ZiAocGIpOworCisgIGlmIChwYi0+bGVuIDw9IFBQUE9FX0hFQURFUkxFTikgeworICAgIHByaW50ZigicHBwb2UgKGRhdGEpOiBkcm9wcGluZyB0b28gc2hvcnQgcGFja2V0OiAlZCBieXRlc1xuIiwgcGItPmxlbik7CisgICAgZ290byBkcm9wOworICB9CisKKyAgaWYgKHBiLT5sZW4gPCBzaXplb2YoKnBoKSkgeworICAgIHByaW50ZigicHBwb2VfZGF0YV9pbnB1dDogY291bGQgbm90IGdldCBQUFBvRSBoZWFkZXJcbiIpOworICAgIGdvdG8gZHJvcDsKKyAgfQorICBwaCA9IChzdHJ1Y3QgcHBwb2VoZHIgKilwYi0+cGF5bG9hZDsKKworICBpZiAocGgtPnZlcnR5cGUgIT0gUFBQT0VfVkVSVFlQRSkgeworICAgIHByaW50ZigicHBwb2UgKGRhdGEpOiB1bmtub3duIHZlcnNpb24vdHlwZSBwYWNrZXQ6IDB4JXhcbiIsIHBoLT52ZXJ0eXBlKTsKKyAgICBnb3RvIGRyb3A7CisgIH0KKyAgaWYgKHBoLT5jb2RlICE9IDApIHsKKyAgICBnb3RvIGRyb3A7CisgIH0KKworICBzZXNzaW9uID0gbnRvaHMocGgtPnNlc3Npb24pOworICBzYyA9IHBwcG9lX2ZpbmRfc29mdGNfYnlfc2Vzc2lvbihzZXNzaW9uLCBuZXRpZik7CisgIGlmIChzYyA9PSBOVUxMKSB7CisjaWZkZWYgUFBQT0VfVEVSTV9VTktOT1dOX1NFU1NJT05TCisgICAgcHJpbnRmKCJwcHBvZTogaW5wdXQgZm9yIHVua25vd24gc2Vzc2lvbiAweCV4LCBzZW5kaW5nIFBBRFRcbiIsIHNlc3Npb24pOworICAgIHBwcG9lX3NlbmRfcGFkdChuZXRpZiwgc2Vzc2lvbiwgc2hvc3QpOworI2VuZGlmCisgICAgZ290byBkcm9wOworICB9CisKKyAgcGxlbiA9IG50b2hzKHBoLT5wbGVuKTsKKworICBpZiAocGJ1Zl9oZWFkZXIocGIsIC0oaW50KShQUFBPRV9IRUFERVJMRU4pKSAhPSAwKSB7CisgICAgLyogYmFpbCBvdXQgKi8KKyAgICBQUFBERUJVRyhMT0dfRVJSLCAoInBwcG9lX2RhdGFfaW5wdXQ6IHBidWZfaGVhZGVyIFBQUE9FX0hFQURFUkxFTiBmYWlsZWRcbiIpKTsKKyAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLmxlbmVycik7CisgICAgZ290byBkcm9wOworICB9IAorCisgIFBQUERFQlVHKExPR19ERUJVRywgKCJwcHBvZV9kYXRhX2lucHV0OiAlYyVjJSJVMTZfRiI6IHBrdGhkci5sZW49JWQsIHBwcG9lLmxlbj0lZFxuIiwKKyAgICAgICAgc2MtPnNjX2V0aGlmLT5uYW1lWzBdLCBzYy0+c2NfZXRoaWYtPm5hbWVbMV0sIHNjLT5zY19ldGhpZi0+bnVtLAorICAgICAgICBwYi0+bGVuLCBwbGVuKSk7CisKKyAgaWYgKHBiLT5sZW4gPCBwbGVuKSB7CisgICAgZ290byBkcm9wOworICB9CisKKyAgcHBwSW5Qcm9jT3ZlckV0aGVybmV0KHNjLT5zY19wZCwgcGIpOworCisgIHJldHVybjsKKworZHJvcDoKKyAgcGJ1Zl9mcmVlKHBiKTsKK30KKworc3RhdGljIGVycl90CitwcHBvZV9vdXRwdXQoc3RydWN0IHBwcG9lX3NvZnRjICpzYywgc3RydWN0IHBidWYgKnBiKQoreworICBzdHJ1Y3QgZXRoX2hkciAqZXRoaGRyOworICB1MTZfdCBldHlwZTsKKyAgZXJyX3QgcmVzOworCisgIGlmICghc2MtPnNjX2V0aGlmKSB7CisgICAgcGJ1Zl9mcmVlKHBiKTsKKyAgICByZXR1cm4gRVJSX0lGOworICB9CisKKyAgZXRoaGRyID0gKHN0cnVjdCBldGhfaGRyICopcGItPnBheWxvYWQ7CisgIGV0eXBlID0gc2MtPnNjX3N0YXRlID09IFBQUE9FX1NUQVRFX1NFU1NJT04gPyBFVEhUWVBFX1BQUE9FIDogRVRIVFlQRV9QUFBPRURJU0M7CisgIGV0aGhkci0+dHlwZSA9IGh0b25zKGV0eXBlKTsKKyAgTUVNQ1BZKGV0aGhkci0+ZGVzdC5hZGRyLCBzYy0+c2NfZGVzdC5hZGRyLCBzaXplb2YoZXRoaGRyLT5kZXN0LmFkZHIpKTsKKyAgTUVNQ1BZKGV0aGhkci0+c3JjLmFkZHIsICgoc3RydWN0IGV0aF9hZGRyICopc2MtPnNjX2V0aGlmLT5od2FkZHIpLT5hZGRyLCBzaXplb2YoZXRoaGRyLT5zcmMuYWRkcikpOworCisgIFBQUERFQlVHKExPR19ERUJVRywgKCJwcHBvZTogJWMlYyUiVTE2X0YiICgleCkgc3RhdGU9JWQsIHNlc3Npb249MHgleCBvdXRwdXQgLT4gJTAyIlgxNl9GIjolMDIiWDE2X0YiOiUwMiJYMTZfRiI6JTAyIlgxNl9GIjolMDIiWDE2X0YiOiUwMiJYMTZfRiIsIGxlbj0lZFxuIiwKKyAgICAgIHNjLT5zY19ldGhpZi0+bmFtZVswXSwgc2MtPnNjX2V0aGlmLT5uYW1lWzFdLCBzYy0+c2NfZXRoaWYtPm51bSwgZXR5cGUsCisgICAgICBzYy0+c2Nfc3RhdGUsIHNjLT5zY19zZXNzaW9uLAorICAgICAgc2MtPnNjX2Rlc3QuYWRkclswXSwgc2MtPnNjX2Rlc3QuYWRkclsxXSwgc2MtPnNjX2Rlc3QuYWRkclsyXSwgc2MtPnNjX2Rlc3QuYWRkclszXSwgc2MtPnNjX2Rlc3QuYWRkcls0XSwgc2MtPnNjX2Rlc3QuYWRkcls1XSwKKyAgICAgIHBiLT50b3RfbGVuKSk7CisKKyAgcmVzID0gc2MtPnNjX2V0aGlmLT5saW5rb3V0cHV0KHNjLT5zY19ldGhpZiwgcGIpOworCisgIHBidWZfZnJlZShwYik7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGVycl90CitwcHBvZV9zZW5kX3BhZGkoc3RydWN0IHBwcG9lX3NvZnRjICpzYykKK3sKKyAgc3RydWN0IHBidWYgKnBiOworICB1OF90ICpwOworICBpbnQgbGVuOworI2lmZGVmIFBQUE9FX1RPRE8KKyAgaW50IGwxID0gMCwgbDIgPSAwOyAvKiBYWFg6IGdjYyAqLworI2VuZGlmIC8qIFBQUE9FX1RPRE8gKi8KKworICBpZiAoc2MtPnNjX3N0YXRlID5QUFBPRV9TVEFURV9QQURJX1NFTlQpIHsKKyAgICBQUFBERUJVRyhMT0dfRVJSLCAoIkVSUk9SOiBwcHBvZV9zZW5kX3BhZGkgaW4gc3RhdGUgJWQiLCBzYy0+c2Nfc3RhdGUpKTsKKyAgfQorCisgIC8qIGNhbGN1bGF0ZSBsZW5ndGggb2YgZnJhbWUgKGV4Y2x1ZGluZyBldGhlcm5ldCBoZWFkZXIgKyBwcHBvZSBoZWFkZXIpICovCisgIGxlbiA9IDIgKyAyICsgMiArIDIgKyBzaXplb2Ygc2M7ICAvKiBzZXJ2aWNlIG5hbWUgdGFnIGlzIHJlcXVpcmVkLCBob3N0IHVuaXF1ZSBpcyBzZW5kIHRvbyAqLworI2lmZGVmIFBQUE9FX1RPRE8KKyAgaWYgKHNjLT5zY19zZXJ2aWNlX25hbWUgIT0gTlVMTCkgeworICAgIGwxID0gKGludClzdHJsZW4oc2MtPnNjX3NlcnZpY2VfbmFtZSk7CisgICAgbGVuICs9IGwxOworICB9CisgIGlmIChzYy0+c2NfY29uY2VudHJhdG9yX25hbWUgIT0gTlVMTCkgeworICAgIGwyID0gKGludClzdHJsZW4oc2MtPnNjX2NvbmNlbnRyYXRvcl9uYW1lKTsKKyAgICBsZW4gKz0gMiArIDIgKyBsMjsKKyAgfQorI2VuZGlmIC8qIFBQUE9FX1RPRE8gKi8KKyAgTFdJUF9BU1NFUlQoInNpemVvZihzdHJ1Y3QgZXRoX2hkcikgKyBQUFBPRV9IRUFERVJMRU4gKyBsZW4gPD0gMHhmZmZmIiwKKyAgICBzaXplb2Yoc3RydWN0IGV0aF9oZHIpICsgUFBQT0VfSEVBREVSTEVOICsgbGVuIDw9IDB4ZmZmZik7CisKKyAgLyogYWxsb2NhdGUgYSBidWZmZXIgKi8KKyAgcGIgPSBwYnVmX2FsbG9jKFBCVUZfTElOSywgKHUxNl90KShzaXplb2Yoc3RydWN0IGV0aF9oZHIpICsgUFBQT0VfSEVBREVSTEVOICsgbGVuKSwgUEJVRl9SQU0pOworICBpZiAoIXBiKSB7CisgICAgcmV0dXJuIEVSUl9NRU07CisgIH0KKyAgTFdJUF9BU1NFUlQoInBiLT50b3RfbGVuID09IHBiLT5sZW4iLCBwYi0+dG90X2xlbiA9PSBwYi0+bGVuKTsKKworICBwID0gKHU4X3QqKXBiLT5wYXlsb2FkICsgc2l6ZW9mIChzdHJ1Y3QgZXRoX2hkcik7CisgIC8qIGZpbGwgaW4gcGt0ICovCisgIFBQUE9FX0FERF9IRUFERVIocCwgUFBQT0VfQ09ERV9QQURJLCAwLCAodTE2X3QpbGVuKTsKKyAgUFBQT0VfQUREXzE2KHAsIFBQUE9FX1RBR19TTkFNRSk7CisjaWZkZWYgUFBQT0VfVE9ETworICBpZiAoc2MtPnNjX3NlcnZpY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgUFBQT0VfQUREXzE2KHAsIGwxKTsKKyAgICBNRU1DUFkocCwgc2MtPnNjX3NlcnZpY2VfbmFtZSwgbDEpOworICAgIHAgKz0gbDE7CisgIH0gZWxzZQorI2VuZGlmIC8qIFBQUE9FX1RPRE8gKi8KKyAgeworICAgIFBQUE9FX0FERF8xNihwLCAwKTsKKyAgfQorI2lmZGVmIFBQUE9FX1RPRE8KKyAgaWYgKHNjLT5zY19jb25jZW50cmF0b3JfbmFtZSAhPSBOVUxMKSB7CisgICAgUFBQT0VfQUREXzE2KHAsIFBQUE9FX1RBR19BQ05BTUUpOworICAgIFBQUE9FX0FERF8xNihwLCBsMik7CisgICAgTUVNQ1BZKHAsIHNjLT5zY19jb25jZW50cmF0b3JfbmFtZSwgbDIpOworICAgIHAgKz0gbDI7CisgIH0KKyNlbmRpZiAvKiBQUFBPRV9UT0RPICovCisgIFBQUE9FX0FERF8xNihwLCBQUFBPRV9UQUdfSFVOSVFVRSk7CisgIFBQUE9FX0FERF8xNihwLCBzaXplb2Yoc2MpKTsKKyAgTUVNQ1BZKHAsICZzYywgc2l6ZW9mIHNjKTsKKworICAvKiBzZW5kIHBrdCAqLworICByZXR1cm4gcHBwb2Vfb3V0cHV0KHNjLCBwYik7Cit9CisKK3N0YXRpYyB2b2lkCitwcHBvZV90aW1lb3V0KHZvaWQgKmFyZykKK3sKKyAgaW50IHJldHJ5X3dhaXQsIGVycjsKKyAgc3RydWN0IHBwcG9lX3NvZnRjICpzYyA9IChzdHJ1Y3QgcHBwb2Vfc29mdGMqKWFyZzsKKworICBQUFBERUJVRyhMT0dfREVCVUcsICgicHBwb2U6ICVjJWMlIlUxNl9GIjogdGltZW91dFxuIiwgc2MtPnNjX2V0aGlmLT5uYW1lWzBdLCBzYy0+c2NfZXRoaWYtPm5hbWVbMV0sIHNjLT5zY19ldGhpZi0+bnVtKSk7CisKKyAgc3dpdGNoIChzYy0+c2Nfc3RhdGUpIHsKKyAgICBjYXNlIFBQUE9FX1NUQVRFX1BBRElfU0VOVDoKKyAgICAgIC8qCisgICAgICAgKiBXZSBoYXZlIHR3byBiYXNpYyB3YXlzIG9mIHJldHJ5aW5nOgorICAgICAgICogIC0gUXVpY2sgcmV0cnkgbW9kZTogdHJ5IGEgZmV3IHRpbWVzIGluIHNob3J0IHNlcXVlbmNlCisgICAgICAgKiAgLSBTbG93IHJldHJ5IG1vZGU6IHdlIGFscmVhZHkgaGFkIGEgY29ubmVjdGlvbiBzdWNjZXNzZnVsbHkKKyAgICAgICAqICAgIGVzdGFibGlzaGVkIGFuZCB3aWxsIHRyeSBpbmZpbml0ZWx5ICh3aXRob3V0IHVzZXIKKyAgICAgICAqICAgIGludGVydmVudGlvbikKKyAgICAgICAqIFdlIG9ubHkgZW50ZXIgc2xvdyByZXRyeSBtb2RlIGlmIElGRl9MSU5LMSAoYWthIGF1dG9kaWFsKQorICAgICAgICogaXMgbm90IHNldC4KKyAgICAgICAqLworCisgICAgICAvKiBpbml0aWFsaXplIGZvciBxdWljayByZXRyeSBtb2RlICovCisgICAgICByZXRyeV93YWl0ID0gUFBQT0VfRElTQ19USU1FT1VUICogKDEgKyBzYy0+c2NfcGFkaV9yZXRyaWVkKTsKKworICAgICAgc2MtPnNjX3BhZGlfcmV0cmllZCsrOworICAgICAgaWYgKHNjLT5zY19wYWRpX3JldHJpZWQgPj0gUFBQT0VfRElTQ19NQVhQQURJKSB7CisjaWYgMAorICAgICAgICBpZiAoKHNjLT5zY19zcHBwLnBwX2lmLmlmX2ZsYWdzICYgSUZGX0xJTksxKSA9PSAwKSB7CisgICAgICAgICAgLyogc2xvdyByZXRyeSBtb2RlICovCisgICAgICAgICAgcmV0cnlfd2FpdCA9IFBQUE9FX1NMT1dfUkVUUlk7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBwcHBvZV9hYm9ydF9jb25uZWN0KHNjKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICgoZXJyID0gcHBwb2Vfc2VuZF9wYWRpKHNjKSkgIT0gMCkgeworICAgICAgICBzYy0+c2NfcGFkaV9yZXRyaWVkLS07CisgICAgICAgIFBQUERFQlVHKExPR19ERUJVRywgKCJwcHBvZTogJWMlYyUiVTE2X0YiOiBmYWlsZWQgdG8gdHJhbnNtaXQgUEFESSwgZXJyb3I9JWRcbiIsIHNjLT5zY19ldGhpZi0+bmFtZVswXSwgc2MtPnNjX2V0aGlmLT5uYW1lWzFdLCBzYy0+c2NfZXRoaWYtPm51bSwgZXJyKSk7CisgICAgICB9CisgICAgICBzeXNfdGltZW91dChyZXRyeV93YWl0LCBwcHBvZV90aW1lb3V0LCBzYyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUFBQT0VfU1RBVEVfUEFEUl9TRU5UOgorICAgICAgc2MtPnNjX3BhZHJfcmV0cmllZCsrOworICAgICAgaWYgKHNjLT5zY19wYWRyX3JldHJpZWQgPj0gUFBQT0VfRElTQ19NQVhQQURSKSB7CisgICAgICAgIE1FTUNQWSgmc2MtPnNjX2Rlc3QsIGV0aGJyb2FkY2FzdC5hZGRyLCBzaXplb2Yoc2MtPnNjX2Rlc3QpKTsKKyAgICAgICAgc2MtPnNjX3N0YXRlID0gUFBQT0VfU1RBVEVfUEFESV9TRU5UOworICAgICAgICBzYy0+c2NfcGFkcl9yZXRyaWVkID0gMDsKKyAgICAgICAgaWYgKChlcnIgPSBwcHBvZV9zZW5kX3BhZGkoc2MpKSAhPSAwKSB7CisgICAgICAgICAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInBwcG9lOiAlYyVjJSJVMTZfRiI6IGZhaWxlZCB0byBzZW5kIFBBREksIGVycm9yPSVkXG4iLCBzYy0+c2NfZXRoaWYtPm5hbWVbMF0sIHNjLT5zY19ldGhpZi0+bmFtZVsxXSwgc2MtPnNjX2V0aGlmLT5udW0sIGVycikpOworICAgICAgICB9CisgICAgICAgIHN5c190aW1lb3V0KFBQUE9FX0RJU0NfVElNRU9VVCAqICgxICsgc2MtPnNjX3BhZGlfcmV0cmllZCksIHBwcG9lX3RpbWVvdXQsIHNjKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKChlcnIgPSBwcHBvZV9zZW5kX3BhZHIoc2MpKSAhPSAwKSB7CisgICAgICAgIHNjLT5zY19wYWRyX3JldHJpZWQtLTsKKyAgICAgICAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInBwcG9lOiAlYyVjJSJVMTZfRiI6IGZhaWxlZCB0byBzZW5kIFBBRFIsIGVycm9yPSVkXG4iLCBzYy0+c2NfZXRoaWYtPm5hbWVbMF0sIHNjLT5zY19ldGhpZi0+bmFtZVsxXSwgc2MtPnNjX2V0aGlmLT5udW0sIGVycikpOworICAgICAgfQorICAgICAgc3lzX3RpbWVvdXQoUFBQT0VfRElTQ19USU1FT1VUICogKDEgKyBzYy0+c2NfcGFkcl9yZXRyaWVkKSwgcHBwb2VfdGltZW91dCwgc2MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUFBPRV9TVEFURV9DTE9TSU5HOgorICAgICAgcHBwb2VfZG9fZGlzY29ubmVjdChzYyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuOyAgLyogYWxsIGRvbmUsIHdvcmsgaW4gcGVhY2UgKi8KKyAgfQorfQorCisvKiBTdGFydCBhIGNvbm5lY3Rpb24gKGkuZS4gaW5pdGlhdGUgZGlzY292ZXJ5IHBoYXNlKSAqLworaW50CitwcHBvZV9jb25uZWN0KHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2MpCit7CisgIGludCBlcnI7CisKKyAgaWYgKHNjLT5zY19zdGF0ZSAhPSBQUFBPRV9TVEFURV9JTklUSUFMKSB7CisgICAgcmV0dXJuIEVCVVNZOworICB9CisKKyNpZmRlZiBQUFBPRV9TRVJWRVIKKyAgLyogd2FpdCBQQURJIGlmIElGRl9QQVNTSVZFICovCisgIGlmICgoc2MtPnNjX3NwcHAucHBfaWYuaWZfZmxhZ3MgJiBJRkZfUEFTU0lWRSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmCisgIC8qIHNhdmUgc3RhdGUsIGluIGNhc2Ugd2UgZmFpbCB0byBzZW5kIFBBREkgKi8KKyAgc2MtPnNjX3N0YXRlID0gUFBQT0VfU1RBVEVfUEFESV9TRU5UOworICBzYy0+c2NfcGFkcl9yZXRyaWVkID0gMDsKKyAgZXJyID0gcHBwb2Vfc2VuZF9wYWRpKHNjKTsKKyAgUFBQREVCVUcoTE9HX0RFQlVHLCAoInBwcG9lOiAlYyVjJSJVMTZfRiI6IGZhaWxlZCB0byBzZW5kIFBBREksIGVycm9yPSVkXG4iLCBzYy0+c2NfZXRoaWYtPm5hbWVbMF0sIHNjLT5zY19ldGhpZi0+bmFtZVsxXSwgc2MtPnNjX2V0aGlmLT5udW0sIGVycikpOworICBzeXNfdGltZW91dChQUFBPRV9ESVNDX1RJTUVPVVQsIHBwcG9lX3RpbWVvdXQsIHNjKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyogZGlzY29ubmVjdCAqLwordm9pZAorcHBwb2VfZGlzY29ubmVjdChzdHJ1Y3QgcHBwb2Vfc29mdGMgKnNjKQoreworICBpZiAoc2MtPnNjX3N0YXRlIDwgUFBQT0VfU1RBVEVfU0VTU0lPTikgeworICAgIHJldHVybjsKKyAgfQorICAvKgorICAgKiBEbyBub3QgY2FsbCBwcHBvZV9kaXNjb25uZWN0IGhlcmUsIHRoZSB1cHBlciBsYXllciBzdGF0ZQorICAgKiBtYWNoaW5lIGdldHMgY29uZnVzZWQgYnkgdGhpcy4gV2UgbXVzdCByZXR1cm4gZnJvbSB0aGlzCisgICAqIGZ1bmN0aW9uIGFuZCBkZWZlciBkaXNjb25uZWN0aW5nIHRvIHRoZSB0aW1lb3V0IGhhbmRsZXIuCisgICAqLworICBzYy0+c2Nfc3RhdGUgPSBQUFBPRV9TVEFURV9DTE9TSU5HOworICBzeXNfdGltZW91dCgyMCwgcHBwb2VfdGltZW91dCwgc2MpOworfQorCitzdGF0aWMgaW50CitwcHBvZV9kb19kaXNjb25uZWN0KHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2MpCit7CisgIGludCBlcnI7CisKKyAgaWYgKHNjLT5zY19zdGF0ZSA8IFBQUE9FX1NUQVRFX1NFU1NJT04pIHsKKyAgICBlcnIgPSBFQlVTWTsKKyAgfSBlbHNlIHsKKyAgICBQUFBERUJVRyhMT0dfREVCVUcsICgicHBwb2U6ICVjJWMlIlUxNl9GIjogZGlzY29ubmVjdGluZ1xuIiwgc2MtPnNjX2V0aGlmLT5uYW1lWzBdLCBzYy0+c2NfZXRoaWYtPm5hbWVbMV0sIHNjLT5zY19ldGhpZi0+bnVtKSk7CisgICAgZXJyID0gcHBwb2Vfc2VuZF9wYWR0KHNjLT5zY19ldGhpZiwgc2MtPnNjX3Nlc3Npb24sIChjb25zdCB1OF90ICopJnNjLT5zY19kZXN0KTsKKyAgfQorCisgIC8qIGNsZWFudXAgc29mdGMgKi8KKyAgc2MtPnNjX3N0YXRlID0gUFBQT0VfU1RBVEVfSU5JVElBTDsKKyAgTUVNQ1BZKCZzYy0+c2NfZGVzdCwgZXRoYnJvYWRjYXN0LmFkZHIsIHNpemVvZihzYy0+c2NfZGVzdCkpOworICBzYy0+c2NfYWNfY29va2llX2xlbiA9IDA7CisjaWZkZWYgUFBQT0VfU0VSVkVSCisgIGlmIChzYy0+c2NfaHVuaXF1ZSkgeworICAgIG1lbV9mcmVlKHNjLT5zY19odW5pcXVlKTsKKyAgICBzYy0+c2NfaHVuaXF1ZSA9IE5VTEw7CisgIH0KKyAgc2MtPnNjX2h1bmlxdWVfbGVuID0gMDsKKyNlbmRpZgorICBzYy0+c2Nfc2Vzc2lvbiA9IDA7CisKKyAgc2MtPnNjX2xpbmtTdGF0dXNDQihzYy0+c2NfcGQsIDApOyAvKiBub3RpZnkgdXBwZXIgbGF5ZXJzICovCisKKyAgcmV0dXJuIGVycjsKK30KKworLyogQ29ubmVjdGlvbiBhdHRlbXB0IGFib3J0ZWQgKi8KK3N0YXRpYyB2b2lkCitwcHBvZV9hYm9ydF9jb25uZWN0KHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2MpCit7CisgIHByaW50ZigiJWMlYyUiVTE2X0YiOiBjb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb25cbiIsIHNjLT5zY19ldGhpZi0+bmFtZVswXSwgc2MtPnNjX2V0aGlmLT5uYW1lWzFdLCBzYy0+c2NfZXRoaWYtPm51bSk7CisgIHNjLT5zY19zdGF0ZSA9IFBQUE9FX1NUQVRFX0NMT1NJTkc7CisKKyAgc2MtPnNjX2xpbmtTdGF0dXNDQihzYy0+c2NfcGQsIDApOyAvKiBub3RpZnkgdXBwZXIgbGF5ZXJzICovCisKKyAgLyogY2xlYXIgY29ubmVjdGlvbiBzdGF0ZSAqLworICBNRU1DUFkoJnNjLT5zY19kZXN0LCBldGhicm9hZGNhc3QuYWRkciwgc2l6ZW9mKHNjLT5zY19kZXN0KSk7CisgIHNjLT5zY19zdGF0ZSA9IFBQUE9FX1NUQVRFX0lOSVRJQUw7Cit9CisKKy8qIFNlbmQgYSBQQURSIHBhY2tldCAqLworc3RhdGljIGVycl90CitwcHBvZV9zZW5kX3BhZHIoc3RydWN0IHBwcG9lX3NvZnRjICpzYykKK3sKKyAgc3RydWN0IHBidWYgKnBiOworICB1OF90ICpwOworICBzaXplX3QgbGVuOworI2lmZGVmIFBQUE9FX1RPRE8KKyAgc2l6ZV90IGwxID0gMDsgLyogWFhYOiBnY2MgKi8KKyNlbmRpZiAvKiBQUFBPRV9UT0RPICovCisKKyAgaWYgKHNjLT5zY19zdGF0ZSAhPSBQUFBPRV9TVEFURV9QQURSX1NFTlQpIHsKKyAgICByZXR1cm4gRVJSX0NPTk47CisgIH0KKworICBsZW4gPSAyICsgMiArIDIgKyAyICsgc2l6ZW9mKHNjKTsgICAgLyogc2VydmljZSBuYW1lLCBob3N0IHVuaXF1ZSAqLworI2lmZGVmIFBQUE9FX1RPRE8KKyAgaWYgKHNjLT5zY19zZXJ2aWNlX25hbWUgIT0gTlVMTCkgeyAgICAvKiBzZXJ2aWNlIG5hbWUgdGFnIG1heWJlIGVtcHR5ICovCisgICAgbDEgPSBzdHJsZW4oc2MtPnNjX3NlcnZpY2VfbmFtZSk7CisgICAgbGVuICs9IGwxOworICB9CisjZW5kaWYgLyogUFBQT0VfVE9ETyAqLworICBpZiAoc2MtPnNjX2FjX2Nvb2tpZV9sZW4gPiAwKSB7CisgICAgbGVuICs9IDIgKyAyICsgc2MtPnNjX2FjX2Nvb2tpZV9sZW47ICAvKiBBQyBjb29raWUgKi8KKyAgfQorICBMV0lQX0FTU0VSVCgic2l6ZW9mKHN0cnVjdCBldGhfaGRyKSArIFBQUE9FX0hFQURFUkxFTiArIGxlbiA8PSAweGZmZmYiLAorICAgIHNpemVvZihzdHJ1Y3QgZXRoX2hkcikgKyBQUFBPRV9IRUFERVJMRU4gKyBsZW4gPD0gMHhmZmZmKTsKKyAgcGIgPSBwYnVmX2FsbG9jKFBCVUZfTElOSywgKHUxNl90KShzaXplb2Yoc3RydWN0IGV0aF9oZHIpICsgUFBQT0VfSEVBREVSTEVOICsgbGVuKSwgUEJVRl9SQU0pOworICBpZiAoIXBiKSB7CisgICAgcmV0dXJuIEVSUl9NRU07CisgIH0KKyAgTFdJUF9BU1NFUlQoInBiLT50b3RfbGVuID09IHBiLT5sZW4iLCBwYi0+dG90X2xlbiA9PSBwYi0+bGVuKTsKKyAgcCA9ICh1OF90KilwYi0+cGF5bG9hZCArIHNpemVvZiAoc3RydWN0IGV0aF9oZHIpOworICBQUFBPRV9BRERfSEVBREVSKHAsIFBQUE9FX0NPREVfUEFEUiwgMCwgbGVuKTsKKyAgUFBQT0VfQUREXzE2KHAsIFBQUE9FX1RBR19TTkFNRSk7CisjaWZkZWYgUFBQT0VfVE9ETworICBpZiAoc2MtPnNjX3NlcnZpY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgUFBQT0VfQUREXzE2KHAsIGwxKTsKKyAgICBNRU1DUFkocCwgc2MtPnNjX3NlcnZpY2VfbmFtZSwgbDEpOworICAgIHAgKz0gbDE7CisgIH0gZWxzZQorI2VuZGlmIC8qIFBQUE9FX1RPRE8gKi8KKyAgeworICAgIFBQUE9FX0FERF8xNihwLCAwKTsKKyAgfQorICBpZiAoc2MtPnNjX2FjX2Nvb2tpZV9sZW4gPiAwKSB7CisgICAgUFBQT0VfQUREXzE2KHAsIFBQUE9FX1RBR19BQ0NPT0tJRSk7CisgICAgUFBQT0VfQUREXzE2KHAsIHNjLT5zY19hY19jb29raWVfbGVuKTsKKyAgICBNRU1DUFkocCwgc2MtPnNjX2FjX2Nvb2tpZSwgc2MtPnNjX2FjX2Nvb2tpZV9sZW4pOworICAgIHAgKz0gc2MtPnNjX2FjX2Nvb2tpZV9sZW47CisgIH0KKyAgUFBQT0VfQUREXzE2KHAsIFBQUE9FX1RBR19IVU5JUVVFKTsKKyAgUFBQT0VfQUREXzE2KHAsIHNpemVvZihzYykpOworICBNRU1DUFkocCwgJnNjLCBzaXplb2Ygc2MpOworCisgIHJldHVybiBwcHBvZV9vdXRwdXQoc2MsIHBiKTsKK30KKworLyogc2VuZCBhIFBBRFQgcGFja2V0ICovCitzdGF0aWMgZXJyX3QKK3BwcG9lX3NlbmRfcGFkdChzdHJ1Y3QgbmV0aWYgKm91dGdvaW5nX2lmLCB1X2ludCBzZXNzaW9uLCBjb25zdCB1OF90ICpkZXN0KQoreworICBzdHJ1Y3QgcGJ1ZiAqcGI7CisgIHN0cnVjdCBldGhfaGRyICpldGhoZHI7CisgIGVycl90IHJlczsKKyAgdThfdCAqcDsKKworICBwYiA9IHBidWZfYWxsb2MoUEJVRl9MSU5LLCBzaXplb2Yoc3RydWN0IGV0aF9oZHIpICsgUFBQT0VfSEVBREVSTEVOLCBQQlVGX1JBTSk7CisgIGlmICghcGIpIHsKKyAgICByZXR1cm4gRVJSX01FTTsKKyAgfQorICBMV0lQX0FTU0VSVCgicGItPnRvdF9sZW4gPT0gcGItPmxlbiIsIHBiLT50b3RfbGVuID09IHBiLT5sZW4pOworCisgIGV0aGhkciA9IChzdHJ1Y3QgZXRoX2hkciAqKXBiLT5wYXlsb2FkOworICBldGhoZHItPnR5cGUgPSBQUF9IVE9OUyhFVEhUWVBFX1BQUE9FRElTQyk7CisgIE1FTUNQWShldGhoZHItPmRlc3QuYWRkciwgZGVzdCwgc2l6ZW9mKGV0aGhkci0+ZGVzdC5hZGRyKSk7CisgIE1FTUNQWShldGhoZHItPnNyYy5hZGRyLCAoKHN0cnVjdCBldGhfYWRkciAqKW91dGdvaW5nX2lmLT5od2FkZHIpLT5hZGRyLCBzaXplb2YoZXRoaGRyLT5zcmMuYWRkcikpOworCisgIHAgPSAodThfdCopKGV0aGhkciArIDEpOworICBQUFBPRV9BRERfSEVBREVSKHAsIFBQUE9FX0NPREVfUEFEVCwgc2Vzc2lvbiwgMCk7CisKKyAgcmVzID0gb3V0Z29pbmdfaWYtPmxpbmtvdXRwdXQob3V0Z29pbmdfaWYsIHBiKTsKKworICBwYnVmX2ZyZWUocGIpOworCisgIHJldHVybiByZXM7Cit9CisKKyNpZmRlZiBQUFBPRV9TRVJWRVIKK3N0YXRpYyBlcnJfdAorcHBwb2Vfc2VuZF9wYWRvKHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2MpCit7CisgIHN0cnVjdCBwYnVmICpwYjsKKyAgdThfdCAqcDsKKyAgc2l6ZV90IGxlbjsKKworICBpZiAoc2MtPnNjX3N0YXRlICE9IFBQUE9FX1NUQVRFX1BBRE9fU0VOVCkgeworICAgIHJldHVybiBFUlJfQ09OTjsKKyAgfQorCisgIC8qIGNhbGMgbGVuZ3RoICovCisgIGxlbiA9IDA7CisgIC8qIGluY2x1ZGUgYWNfY29va2llICovCisgIGxlbiArPSAyICsgMiArIHNpemVvZihzYyk7CisgIC8qIGluY2x1ZGUgaHVuaXF1ZSAqLworICBsZW4gKz0gMiArIDIgKyBzYy0+c2NfaHVuaXF1ZV9sZW47CisgIHBiID0gcGJ1Zl9hbGxvYyhQQlVGX0xJTkssIHNpemVvZihzdHJ1Y3QgZXRoX2hkcikgKyBQUFBPRV9IRUFERVJMRU4gKyBsZW4sIFBCVUZfUkFNKTsKKyAgaWYgKCFwYikgeworICAgIHJldHVybiBFUlJfTUVNOworICB9CisgIExXSVBfQVNTRVJUKCJwYi0+dG90X2xlbiA9PSBwYi0+bGVuIiwgcGItPnRvdF9sZW4gPT0gcGItPmxlbik7CisgIHAgPSAodThfdCopcGItPnBheWxvYWQgKyBzaXplb2YgKHN0cnVjdCBldGhfaGRyKTsKKyAgUFBQT0VfQUREX0hFQURFUihwLCBQUFBPRV9DT0RFX1BBRE8sIDAsIGxlbik7CisgIFBQUE9FX0FERF8xNihwLCBQUFBPRV9UQUdfQUNDT09LSUUpOworICBQUFBPRV9BRERfMTYocCwgc2l6ZW9mKHNjKSk7CisgIE1FTUNQWShwLCAmc2MsIHNpemVvZihzYykpOworICBwICs9IHNpemVvZihzYyk7CisgIFBQUE9FX0FERF8xNihwLCBQUFBPRV9UQUdfSFVOSVFVRSk7CisgIFBQUE9FX0FERF8xNihwLCBzYy0+c2NfaHVuaXF1ZV9sZW4pOworICBNRU1DUFkocCwgc2MtPnNjX2h1bmlxdWUsIHNjLT5zY19odW5pcXVlX2xlbik7CisgIHJldHVybiBwcHBvZV9vdXRwdXQoc2MsIHBiKTsKK30KKworc3RhdGljIGVycl90CitwcHBvZV9zZW5kX3BhZHMoc3RydWN0IHBwcG9lX3NvZnRjICpzYykKK3sKKyAgc3RydWN0IHBidWYgKnBiOworICB1OF90ICpwOworICBzaXplX3QgbGVuLCBsMSA9IDA7ICAvKiBYWFg6IGdjYyAqLworCisgIGlmIChzYy0+c2Nfc3RhdGUgIT0gUFBQT0VfU1RBVEVfUEFET19TRU5UKSB7CisgICAgcmV0dXJuIEVSUl9DT05OOworICB9CisKKyAgc2MtPnNjX3Nlc3Npb24gPSBtb25vX3RpbWUudHZfc2VjICUgMHhmZiArIDE7CisgIC8qIGNhbGMgbGVuZ3RoICovCisgIGxlbiA9IDA7CisgIC8qIGluY2x1ZGUgaHVuaXF1ZSAqLworICBsZW4gKz0gMiArIDIgKyAyICsgMiArIHNjLT5zY19odW5pcXVlX2xlbjsgIC8qIHNlcnZpY2UgbmFtZSwgaG9zdCB1bmlxdWUqLworICBpZiAoc2MtPnNjX3NlcnZpY2VfbmFtZSAhPSBOVUxMKSB7ICAgIC8qIHNlcnZpY2UgbmFtZSB0YWcgbWF5YmUgZW1wdHkgKi8KKyAgICBsMSA9IHN0cmxlbihzYy0+c2Nfc2VydmljZV9uYW1lKTsKKyAgICBsZW4gKz0gbDE7CisgIH0KKyAgcGIgPSBwYnVmX2FsbG9jKFBCVUZfTElOSywgc2l6ZW9mKHN0cnVjdCBldGhfaGRyKSArIFBQUE9FX0hFQURFUkxFTiArIGxlbiwgUEJVRl9SQU0pOworICBpZiAoIXBiKSB7CisgICAgcmV0dXJuIEVSUl9NRU07CisgIH0KKyAgTFdJUF9BU1NFUlQoInBiLT50b3RfbGVuID09IHBiLT5sZW4iLCBwYi0+dG90X2xlbiA9PSBwYi0+bGVuKTsKKyAgcCA9ICh1OF90KilwYi0+cGF5bG9hZCArIHNpemVvZiAoc3RydWN0IGV0aF9oZHIpOworICBQUFBPRV9BRERfSEVBREVSKHAsIFBQUE9FX0NPREVfUEFEUywgc2MtPnNjX3Nlc3Npb24sIGxlbik7CisgIFBQUE9FX0FERF8xNihwLCBQUFBPRV9UQUdfU05BTUUpOworICBpZiAoc2MtPnNjX3NlcnZpY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgUFBQT0VfQUREXzE2KHAsIGwxKTsKKyAgICBNRU1DUFkocCwgc2MtPnNjX3NlcnZpY2VfbmFtZSwgbDEpOworICAgIHAgKz0gbDE7CisgIH0gZWxzZSB7CisgICAgUFBQT0VfQUREXzE2KHAsIDApOworICB9CisgIFBQUE9FX0FERF8xNihwLCBQUFBPRV9UQUdfSFVOSVFVRSk7CisgIFBQUE9FX0FERF8xNihwLCBzYy0+c2NfaHVuaXF1ZV9sZW4pOworICBNRU1DUFkocCwgc2MtPnNjX2h1bmlxdWUsIHNjLT5zY19odW5pcXVlX2xlbik7CisgIHJldHVybiBwcHBvZV9vdXRwdXQoc2MsIHBiKTsKK30KKyNlbmRpZgorCitlcnJfdAorcHBwb2VfeG1pdChzdHJ1Y3QgcHBwb2Vfc29mdGMgKnNjLCBzdHJ1Y3QgcGJ1ZiAqcGIpCit7CisgIHU4X3QgKnA7CisgIHNpemVfdCBsZW47CisKKyAgLyogYXJlIHdlIHJlYWR5IHRvIHByb2Nlc3MgZGF0YSB5ZXQ/ICovCisgIGlmIChzYy0+c2Nfc3RhdGUgPCBQUFBPRV9TVEFURV9TRVNTSU9OKSB7CisgICAgLypzcHBwX2ZsdXNoKCZzYy0+c2Nfc3BwcC5wcF9pZik7Ki8KKyAgICBwYnVmX2ZyZWUocGIpOworICAgIHJldHVybiBFUlJfQ09OTjsKKyAgfQorCisgIGxlbiA9IHBiLT50b3RfbGVuOworCisgIC8qIG1ha2Ugcm9vbSBmb3IgRXRoZXJuZXQgaGVhZGVyIC0gc2hvdWxkIG5vdCBmYWlsICovCisgIGlmIChwYnVmX2hlYWRlcihwYiwgc2l6ZW9mKHN0cnVjdCBldGhfaGRyKSArIFBQUE9FX0hFQURFUkxFTikgIT0gMCkgeworICAgIC8qIGJhaWwgb3V0ICovCisgICAgUFBQREVCVUcoTE9HX0VSUiwgKCJwcHBvZTogJWMlYyUiVTE2X0YiOiBwcHBvZV94bWl0OiBjb3VsZCBub3QgYWxsb2NhdGUgcm9vbSBmb3IgaGVhZGVyXG4iLCBzYy0+c2NfZXRoaWYtPm5hbWVbMF0sIHNjLT5zY19ldGhpZi0+bmFtZVsxXSwgc2MtPnNjX2V0aGlmLT5udW0pKTsKKyAgICBMSU5LX1NUQVRTX0lOQyhsaW5rLmxlbmVycik7CisgICAgcGJ1Zl9mcmVlKHBiKTsKKyAgICByZXR1cm4gRVJSX0JVRjsKKyAgfSAKKworICBwID0gKHU4X3QqKXBiLT5wYXlsb2FkICsgc2l6ZW9mKHN0cnVjdCBldGhfaGRyKTsKKyAgUFBQT0VfQUREX0hFQURFUihwLCAwLCBzYy0+c2Nfc2Vzc2lvbiwgbGVuKTsKKworICByZXR1cm4gcHBwb2Vfb3V0cHV0KHNjLCBwYik7Cit9CisKKyNpZiAwIC8qZGVmIFBGSUxfSE9PS1MqLworc3RhdGljIGludAorcHBwb2VfaWZhdHRhY2hfaG9vayh2b2lkICphcmcsIHN0cnVjdCBwYnVmICoqbXAsIHN0cnVjdCBuZXRpZiAqaWZwLCBpbnQgZGlyKQoreworICBzdHJ1Y3QgcHBwb2Vfc29mdGMgKnNjOworICBpbnQgczsKKworICBpZiAobXAgIT0gKHN0cnVjdCBwYnVmICoqKVBGSUxfSUZORVRfREVUQUNIKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBMSVNUX0ZPUkVBQ0goc2MsICZwcHBvZV9zb2Z0Y19saXN0LCBzY19saXN0KSB7CisgICAgaWYgKHNjLT5zY19ldGhpZiAhPSBpZnApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc2MtPnNjX3NwcHAucHBfaWYuaWZfZmxhZ3MgJiBJRkZfVVApIHsKKyAgICAgIHNjLT5zY19zcHBwLnBwX2lmLmlmX2ZsYWdzICY9IH4oSUZGX1VQfElGRl9SVU5OSU5HKTsKKyAgICAgIHByaW50ZigiJWMlYyUiVTE2X0YiOiBldGhlcm5ldCBpbnRlcmZhY2UgZGV0YWNoZWQsIGdvaW5nIGRvd25cbiIsCisgICAgICAgICAgc2MtPnNjX2V0aGlmLT5uYW1lWzBdLCBzYy0+c2NfZXRoaWYtPm5hbWVbMV0sIHNjLT5zY19ldGhpZi0+bnVtKTsKKyAgICB9CisgICAgc2MtPnNjX2V0aGlmID0gTlVMTDsKKyAgICBwcHBvZV9jbGVhcl9zb2Z0YyhzYywgImV0aGVybmV0IGludGVyZmFjZSBkZXRhY2hlZCIpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3BwcG9lX2NsZWFyX3NvZnRjKHN0cnVjdCBwcHBvZV9zb2Z0YyAqc2MsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIExXSVBfVU5VU0VEX0FSRyhtZXNzYWdlKTsKKworICAvKiBzdG9wIHRpbWVyICovCisgIHN5c191bnRpbWVvdXQocHBwb2VfdGltZW91dCwgc2MpOworICBQUFBERUJVRyhMT0dfREVCVUcsICgicHBwb2U6ICVjJWMlIlUxNl9GIjogc2Vzc2lvbiAweCV4IHRlcm1pbmF0ZWQsICVzXG4iLCBzYy0+c2NfZXRoaWYtPm5hbWVbMF0sIHNjLT5zY19ldGhpZi0+bmFtZVsxXSwgc2MtPnNjX2V0aGlmLT5udW0sIHNjLT5zY19zZXNzaW9uLCBtZXNzYWdlKSk7CisKKyAgLyogZml4IG91ciBzdGF0ZSAqLworICBzYy0+c2Nfc3RhdGUgPSBQUFBPRV9TVEFURV9JTklUSUFMOworCisgIC8qIG5vdGlmeSB1cHBlciBsYXllcnMgKi8KKyAgc2MtPnNjX2xpbmtTdGF0dXNDQihzYy0+c2NfcGQsIDApOworCisgIC8qIGNsZWFuIHVwIHNvZnRjICovCisgIE1FTUNQWSgmc2MtPnNjX2Rlc3QsIGV0aGJyb2FkY2FzdC5hZGRyLCBzaXplb2Yoc2MtPnNjX2Rlc3QpKTsKKyAgc2MtPnNjX2FjX2Nvb2tpZV9sZW4gPSAwOworICBzYy0+c2Nfc2Vzc2lvbiA9IDA7Cit9CisKKyNlbmRpZiAvKiBQUFBPRV9TVVBQT1JUICovCisKZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL3BwcGRlYnVnLmggYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9wcHBkZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzQ5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9wcHBkZWJ1Zy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwcHBkZWJ1Zy5oIC0gU3lzdGVtIGRlYnVnZ2luZyB1dGlsaXRpZXMuCisqCisqIENvcHlyaWdodCAoYykgMjAwMyBieSBNYXJjIEJvdWNoZXIsIFNlcnZpY2VzIEluZm9ybWF0aXF1ZXMgKE1CU0kpIGluYy4KKyogcG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk4IEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyogcG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IENvZ25pemFudCBQdHkgTHRkLgorKgorKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwKKyogYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZAorKiB0aGF0IGV4aXN0aW5nIGNvcHlyaWdodCBub3RpY2VzIGFyZSByZXRhaW5lZCBpbiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMKKyogbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXJlIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueSAKKyogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzIHJlcXVpcmVkCisqIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTICpBUyBJUyogQU5EIEFOWSBFWFBSRVNTIE9SCisqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gCisqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUkVWSVNJT04gSElTVE9SWSAocGxlYXNlIGRvbid0IHVzZSB0YWJzISkKKyoKKyogMDMtMDEtMDEgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisqICAgUG9ydGVkIHRvIGx3SVAuCisqIDk4LTA3LTI5IEd1eSBMYW5jYXN0ZXIgPGxhbmNhc3RlcmdAYWNtLm9yZz4sIEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyogICBPcmlnaW5hbC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworI2lmbmRlZiBQUFBERUJVR19ICisjZGVmaW5lIFBQUERFQlVHX0gKKworLyogVHJhY2UgbGV2ZWxzLiAqLworI2RlZmluZSBMT0dfQ1JJVElDQUwgIChQUFBfREVCVUcgfCBMV0lQX0RCR19MRVZFTF9TRVZFUkUpCisjZGVmaW5lIExPR19FUlIgICAgICAgKFBQUF9ERUJVRyB8IExXSVBfREJHX0xFVkVMX1NFVkVSRSkKKyNkZWZpbmUgTE9HX05PVElDRSAgICAoUFBQX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORykKKyNkZWZpbmUgTE9HX1dBUk5JTkcgICAoUFBQX0RFQlVHIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORykKKyNkZWZpbmUgTE9HX0lORk8gICAgICAoUFBQX0RFQlVHKQorI2RlZmluZSBMT0dfREVUQUlMICAgIChQUFBfREVCVUcpCisjZGVmaW5lIExPR19ERUJVRyAgICAgKFBQUF9ERUJVRykKKworCisjZGVmaW5lIFRSQUNFTENQIFBQUF9ERUJVRworCisjaWYgUFBQX0RFQlVHCisKKyNkZWZpbmUgQVVUSERFQlVHKGEsIGIpIExXSVBfREVCVUdGKGEsIGIpCisjZGVmaW5lIElQQ1BERUJVRyhhLCBiKSBMV0lQX0RFQlVHRihhLCBiKQorI2RlZmluZSBVUEFQREVCVUcoYSwgYikgTFdJUF9ERUJVR0YoYSwgYikKKyNkZWZpbmUgTENQREVCVUcoYSwgYikgIExXSVBfREVCVUdGKGEsIGIpCisjZGVmaW5lIEZTTURFQlVHKGEsIGIpICBMV0lQX0RFQlVHRihhLCBiKQorI2RlZmluZSBDSEFQREVCVUcoYSwgYikgTFdJUF9ERUJVR0YoYSwgYikKKyNkZWZpbmUgUFBQREVCVUcoYSwgYikgIExXSVBfREVCVUdGKGEsIGIpCisKKyNlbHNlIC8qIFBQUF9ERUJVRyAqLworCisjZGVmaW5lIEFVVEhERUJVRyhhLCBiKQorI2RlZmluZSBJUENQREVCVUcoYSwgYikKKyNkZWZpbmUgVVBBUERFQlVHKGEsIGIpCisjZGVmaW5lIExDUERFQlVHKGEsIGIpCisjZGVmaW5lIEZTTURFQlVHKGEsIGIpCisjZGVmaW5lIENIQVBERUJVRyhhLCBiKQorI2RlZmluZSBQUFBERUJVRyhhLCBiKQorCisjZW5kaWYgLyogUFBQX0RFQlVHICovCisKKyNlbmRpZiAvKiBQUFBERUJVR19IICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9yYW5kbS5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvcmFuZG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjM1Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvcmFuZG0uYwpAQCAtMCwwICsxLDI0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHJhbmRtLmMgLSBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBwcm9ncmFtIGZpbGUuCisqCisqIENvcHlyaWdodCAoYykgMjAwMyBieSBNYXJjIEJvdWNoZXIsIFNlcnZpY2VzIEluZm9ybWF0aXF1ZXMgKE1CU0kpIGluYy4KKyogQ29weXJpZ2h0IChjKSAxOTk4IGJ5IEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyoKKyogVGhlIGF1dGhvcnMgaGVyZWJ5IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsCisqIGFuZCBsaWNlbnNlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQKKyogdGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCB0aGlzCisqIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGFyZSBpbmNsdWRlZCB2ZXJiYXRpbSBpbiBhbnkgCisqIGRpc3RyaWJ1dGlvbnMuIE5vIHdyaXR0ZW4gYWdyZWVtZW50LCBsaWNlbnNlLCBvciByb3lhbHR5IGZlZSBpcyByZXF1aXJlZAorKiBmb3IgYW55IG9mIHRoZSBhdXRob3JpemVkIHVzZXMuCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPTlRSSUJVVE9SUyAqQVMgSVMqIEFORCBBTlkgRVhQUkVTUyBPUgorKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIAorKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJFVklTSU9OIEhJU1RPUlkKKyoKKyogMDMtMDEtMDEgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisqICAgUG9ydGVkIHRvIGx3SVAuCisqIDk4LTA2LTAzIEd1eSBMYW5jYXN0ZXIgPGxhbmNhc3RlcmdAYWNtLm9yZz4sIEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyogICBFeHRyYWN0ZWQgZnJvbSBhdm9zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgUFBQX1NVUFBPUlQgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJtZDUuaCIKKyNpbmNsdWRlICJyYW5kbS5oIgorCisjaW5jbHVkZSAicHBwLmgiCisjaW5jbHVkZSAicHBwZGVidWcuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgTUQ1X1NVUFBPUlQgLyogdGhpcyBtb2R1bGUgZGVwZW5kcyBvbiBNRDUgKi8KKyNkZWZpbmUgUkFORFBPT0xTWiAxNiAgIC8qIEJ5dGVzIHN0b3JlZCBpbiB0aGUgcG9vbCBvZiByYW5kb21uZXNzLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqIExPQ0FMIERBVEEgU1RSVUNUVVJFUyAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY2hhciByYW5kUG9vbFtSQU5EUE9PTFNaXTsgICAvKiBQb29sIG9mIHJhbmRvbW5lc3MuICovCitzdGF0aWMgbG9uZyByYW5kQ291bnQgPSAwOyAgICAgIC8qIFBzZXVkby1yYW5kb20gaW5jcmVtZW50ZXIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqIFBVQkxJQyBGVU5DVElPTiBERUZJTklUSU9OUyAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgKgorICogU2luY2UgdGhpcyBpcyB0byBiZSBjYWxsZWQgb24gcG93ZXIgdXAsIHdlIGRvbid0IGhhdmUgbXVjaAorICogIHN5c3RlbSByYW5kb21lc3MgdG8gd29yayB3aXRoLiAgSGVyZSBhbGwgd2UgdXNlIGlzIHRoZQorICogIHJlYWwtdGltZSBjbG9jay4gIFdlJ2xsIGFjY3VtdWxhdGUgbW9yZSByYW5kb21uZXNzIGFzIHNvb24KKyAqICBhcyB0aGluZ3Mgc3RhcnQgaGFwcGVuaW5nLgorICovCit2b2lkCithdlJhbmRvbUluaXQoKQoreworICBhdkNodXJuUmFuZChOVUxMLCAwKTsKK30KKworLyoKKyAqIENodXJuIHRoZSByYW5kb21uZXNzIHBvb2wgb24gYSByYW5kb20gZXZlbnQuICBDYWxsIHRoaXMgZWFybHkgYW5kIG9mdGVuCisgKiAgb24gcmFuZG9tIGFuZCBzZW1pLXJhbmRvbSBzeXN0ZW0gZXZlbnRzIHRvIGJ1aWxkIHJhbmRvbW5lc3MgaW4gdGltZSBmb3IKKyAqICB1c2FnZS4gIEZvciByYW5kb21seSB0aW1lZCBldmVudHMsIHBhc3MgYSBudWxsIHBvaW50ZXIgYW5kIGEgemVybyBsZW5ndGgKKyAqICBhbmQgdGhpcyB3aWxsIHVzZSB0aGUgc3lzdGVtIHRpbWVyIGFuZCBvdGhlciBzb3VyY2VzIHRvIGFkZCByYW5kb21uZXNzLgorICogIElmIG5ldyByYW5kb20gZGF0YSBpcyBhdmFpbGFibGUsIHBhc3MgYSBwb2ludGVyIHRvIHRoYXQgYW5kIGl0IHdpbGwgYmUKKyAqICBpbmNsdWRlZC4KKyAqCisgKiBSZWY6IEFwcGxpZWQgQ3J5cHRvZ3JhcGh5IDJuZCBFZC4gYnkgQnJ1Y2UgU2NobmVpZXIgcC4gNDI3CisgKi8KK3ZvaWQKK2F2Q2h1cm5SYW5kKGNoYXIgKnJhbmREYXRhLCB1MzJfdCByYW5kTGVuKQoreworICBNRDVfQ1RYIG1kNTsKKworICAvKiBMV0lQX0RFQlVHRihMT0dfSU5GTywgKCJjaHVyblJhbmQ6ICV1QCVQXG4iLCByYW5kTGVuLCByYW5kRGF0YSkpOyAqLworICBNRDVJbml0KCZtZDUpOworICBNRDVVcGRhdGUoJm1kNSwgKHVfY2hhciAqKXJhbmRQb29sLCBzaXplb2YocmFuZFBvb2wpKTsKKyAgaWYgKHJhbmREYXRhKSB7CisgICAgTUQ1VXBkYXRlKCZtZDUsICh1X2NoYXIgKilyYW5kRGF0YSwgcmFuZExlbik7CisgIH0gZWxzZSB7CisgICAgc3RydWN0IHsKKyAgICAgIC8qIElOQ0xVREUgZmllbGRzIGZvciBhbnkgc3lzdGVtIHNvdXJjZXMgb2YgcmFuZG9tbmVzcyAqLworICAgICAgY2hhciBmb29iYXI7CisgICAgfSBzeXNEYXRhOworCisgICAgLyogTG9hZCBzeXNEYXRhIGZpZWxkcyBoZXJlLiAqLworICAgIE1ENVVwZGF0ZSgmbWQ1LCAodV9jaGFyICopJnN5c0RhdGEsIHNpemVvZihzeXNEYXRhKSk7CisgIH0KKyAgTUQ1RmluYWwoKHVfY2hhciAqKXJhbmRQb29sLCAmbWQ1KTsKKy8qICBMV0lQX0RFQlVHRihMT0dfSU5GTywgKCJjaHVyblJhbmQ6IC0+IDBcbiIpKTsgKi8KK30KKworLyoKKyAqIFVzZSB0aGUgcmFuZG9tIHBvb2wgdG8gZ2VuZXJhdGUgcmFuZG9tIGRhdGEuICBUaGlzIGRlZ3JhZGVzIHRvIHBzZXVkbworICogIHJhbmRvbSB3aGVuIHVzZWQgZmFzdGVyIHRoYW4gcmFuZG9tbmVzcyBpcyBzdXBwbGllZCB1c2luZyBjaHVyblJhbmQoKS4KKyAqIE5vdGU6IEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlcmUgYmUgc3VmZmljaWVudCByYW5kb21uZXNzIGluIHJhbmRQb29sCisgKiAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIGZvciBvdGhlcndpc2UgdGhlIHJhbmdlIG9mIHRoZSByZXN1bHQgbWF5IGJlCisgKiAgbmFycm93IGVub3VnaCB0byBtYWtlIGEgc2VhcmNoIGZlYXNpYmxlLgorICoKKyAqIFJlZjogQXBwbGllZCBDcnlwdG9ncmFwaHkgMm5kIEVkLiBieSBCcnVjZSBTY2huZWllciBwLiA0MjcKKyAqCisgKiBYWFggV2h5IGRvZXMgaGUgbm90IGp1c3QgY2FsbCBjaHVyblJhbmQoKSBmb3IgZWFjaCBibG9jaz8gIFByb2JhYmx5CisgKiAgc28gdGhhdCB5b3UgZG9uJ3QgZXZlciBwdWJsaXNoIHRoZSBzZWVkIHdoaWNoIGNvdWxkIHBvc3NpYmx5IGhlbHAKKyAqICBwcmVkaWN0IGZ1dHVyZSB2YWx1ZXMuCisgKiBYWFggV2h5IGRvbid0IHdlIHByZXNlcnZlIG1kNSBiZXR3ZWVuIGJsb2NrcyBhbmQganVzdCB1cGRhdGUgaXQgd2l0aAorICogIHJhbmRDb3VudCBlYWNoIHRpbWU/ICBQcm9iYWJseSB0aGVyZSBpcyBhIHdlYWtuZXNzIGJ1dCBJIHdpc2ggdGhhdAorICogIGl0IHdhcyBkb2N1bWVudGVkLgorICovCit2b2lkCithdkdlblJhbmQoY2hhciAqYnVmLCB1MzJfdCBidWZMZW4pCit7CisgIE1ENV9DVFggbWQ1OworICB1X2NoYXIgdG1wWzE2XTsKKyAgdTMyX3QgbjsKKworICB3aGlsZSAoYnVmTGVuID4gMCkgeworICAgIG4gPSBMV0lQX01JTihidWZMZW4sIFJBTkRQT09MU1opOworICAgIE1ENUluaXQoJm1kNSk7CisgICAgTUQ1VXBkYXRlKCZtZDUsICh1X2NoYXIgKilyYW5kUG9vbCwgc2l6ZW9mKHJhbmRQb29sKSk7CisgICAgTUQ1VXBkYXRlKCZtZDUsICh1X2NoYXIgKikmcmFuZENvdW50LCBzaXplb2YocmFuZENvdW50KSk7CisgICAgTUQ1RmluYWwodG1wLCAmbWQ1KTsKKyAgICByYW5kQ291bnQrKzsKKyAgICBNRU1DUFkoYnVmLCB0bXAsIG4pOworICAgIGJ1ZiArPSBuOworICAgIGJ1ZkxlbiAtPSBuOworICB9Cit9CisKKy8qCisgKiBSZXR1cm4gYSBuZXcgcmFuZG9tIG51bWJlci4KKyAqLwordTMyX3QKK2F2UmFuZG9tKCkKK3sKKyAgdTMyX3QgbmV3UmFuZDsKKworICBhdkdlblJhbmQoKGNoYXIgKikmbmV3UmFuZCwgc2l6ZW9mKG5ld1JhbmQpKTsKKworICByZXR1cm4gbmV3UmFuZDsKK30KKworI2Vsc2UgLyogTUQ1X1NVUFBPUlQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiBMT0NBTCBEQVRBIFNUUlVDVFVSRVMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCAgYXZSYW5kb21pemVkID0gMDsgICAgICAgLyogU2V0IHdoZW4gdHJ1ZWx5IHJhbmRvbWl6ZWQuICovCitzdGF0aWMgdTMyX3QgYXZSYW5kb21TZWVkID0gMDsgICAgICAvKiBTZWVkIHVzZWQgZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbi4gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqIFBVQkxJQyBGVU5DVElPTiBERUZJTklUSU9OUyAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgKgorICogSGVyZSB3ZSBhdHRlbXB0IHRvIGNvbXB1dGUgYSByYW5kb20gbnVtYmVyIHNlZWQgYnV0IGV2ZW4gaWYKKyAqIGl0IGlzbid0IHJhbmRvbSwgd2UnbGwgcmFuZG9taXplIGl0IGxhdGVyLgorICoKKyAqIFRoZSBjdXJyZW50IG1ldGhvZCB1c2VzIHRoZSBmaWVsZHMgZnJvbSB0aGUgcmVhbCB0aW1lIGNsb2NrLAorICogdGhlIGlkbGUgcHJvY2VzcyBjb3VudGVyLCB0aGUgbWlsbGlzZWNvbmQgY291bnRlciwgYW5kIHRoZQorICogaGFyZHdhcmUgdGltZXIgdGljayBjb3VudGVyLiAgV2hlbiB0aGlzIGlzIGludm9rZWQKKyAqIGluIHN0YXJ0dXAoKSwgdGhlbiB0aGUgaWRsZSBjb3VudGVyIGFuZCB0aW1lciB2YWx1ZXMgbWF5CisgKiByZXBlYXQgYWZ0ZXIgZWFjaCBib290IGFuZCB0aGUgcmVhbCB0aW1lIGNsb2NrIG1heSBub3QgYmUKKyAqIG9wZXJhdGlvbmFsLiAgVGh1cyB3ZSBjYWxsIGl0IGFnYWluIG9uIHRoZSBmaXJzdCByYW5kb20KKyAqIGV2ZW50LgorICovCit2b2lkCithdlJhbmRvbUluaXQoKQoreworI2lmIDAKKyAgLyogR2V0IGEgcG9pbnRlciBpbnRvIHRoZSBsYXN0IDQgYnl0ZXMgb2YgY2xvY2tCdWYuICovCisgIHUzMl90ICpscHRyMSA9ICh1MzJfdCAqKSgoY2hhciAqKSZjbG9ja0J1ZlszXSk7CisKKyAgLyoKKyAgICogSW5pdGlhbGl6ZSBvdXIgc2VlZCB1c2luZyB0aGUgcmVhbC10aW1lIGNsb2NrLCB0aGUgaWRsZQorICAgKiBjb3VudGVyLCB0aGUgbWlsbGlzZWNvbmQgdGltZXIsIGFuZCB0aGUgaGFyZHdhcmUgdGltZXIKKyAgICogdGljayBjb3VudGVyLiAgVGhlIHJlYWwtdGltZSBjbG9jayBhbmQgdGhlIGhhcmR3YXJlCisgICAqIHRpY2sgY291bnRlciBhcmUgdGhlIGJlc3Qgc291cmNlcyBvZiByYW5kb21uZXNzIGJ1dAorICAgKiBzaW5jZSB0aGUgdGljayBjb3VudGVyIGlzIG9ubHkgMTYgYml0IChhbmQgdHJ1bmNhdGVkCisgICAqIGF0IHRoYXQpLCB0aGUgaWRsZSBjb3VudGVyIGFuZCBtaWxsaXNlY29uZCB0aW1lcgorICAgKiAod2hpY2ggbWF5IGJlIHNtYWxsIHZhbHVlcykgYXJlIGFkZGVkIHRvIGhlbHAKKyAgICogcmFuZG9taXplIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoZSBzZWVkLgorICAgKi8KKyAgcmVhZENsaygpOworICBhdlJhbmRvbVNlZWQgKz0gKih1MzJfdCAqKWNsb2NrQnVmICsgKmxwdHIxICsgT1NJZGxlQ3RyCisgICAgICAgICAgICsgcHBwX210aW1lKCkgKyAoKHUzMl90KVRNMSA8PCAxNikgKyBUTTE7CisjZWxzZQorICBhdlJhbmRvbVNlZWQgKz0gc3lzX2ppZmZpZXMoKTsgLyogWFhYICovCisjZW5kaWYKKworICAvKiBJbml0aWFsaXplIHRoZSBCb3JsYW5kIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAqLworICBzcmFuZCgodW5zaWduZWQpYXZSYW5kb21TZWVkKTsKK30KKworLyoKKyAqIFJhbmRvbWl6ZSBvdXIgcmFuZG9tIHNlZWQgdmFsdWUuICBIZXJlIHdlIHVzZSB0aGUgZmFjdCB0aGF0CisgKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCAqdHJ1ZWx5IHJhbmRvbSogdGltZXMgYnkgdGhlIHBvbGxpbmcKKyAqIGFuZCBuZXR3b3JrIGZ1bmN0aW9ucy4gIEhlcmUgd2Ugb25seSBnZXQgMTYgYml0cyBvZiBuZXcgcmFuZG9tCisgKiB2YWx1ZSBidXQgd2UgdXNlIHRoZSBwcmV2aW91cyB2YWx1ZSB0byByYW5kb21pemUgdGhlIG90aGVyIDE2CisgKiBiaXRzLgorICovCit2b2lkCithdlJhbmRvbWl6ZSh2b2lkKQoreworICBzdGF0aWMgdTMyX3QgbGFzdF9qaWZmaWVzOworCisgIGlmICghYXZSYW5kb21pemVkKSB7CisgICAgYXZSYW5kb21pemVkID0gITA7CisgICAgYXZSYW5kb21Jbml0KCk7CisgICAgLyogVGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGFsc28gdXBkYXRlcyB0aGUgc2VlZC4gKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBhdlJhbmRvbVNlZWQgKz0gKGF2UmFuZG9tU2VlZCA8PCAxNikgKyBUTTE7ICovCisgICAgYXZSYW5kb21TZWVkICs9IChzeXNfamlmZmllcygpIC0gbGFzdF9qaWZmaWVzKTsgLyogWFhYICovCisgIH0KKyAgbGFzdF9qaWZmaWVzID0gc3lzX2ppZmZpZXMoKTsKK30KKworLyoKKyAqIFJldHVybiBhIG5ldyByYW5kb20gbnVtYmVyLgorICogSGVyZSB3ZSB1c2UgdGhlIEJvcmxhbmQgcmFuZCgpIGZ1bmN0aW9uIHRvIHN1cHBseSBhIHBzZXVkbyByYW5kb20KKyAqIG51bWJlciB3aGljaCB3ZSBtYWtlIHRydWVseSByYW5kb20gYnkgY29tYmluaW5nIGl0IHdpdGggb3VyIG93bgorICogc2VlZCB3aGljaCBpcyByYW5kb21pemVkIGJ5IHRydWVseSByYW5kb20gZXZlbnRzLiAKKyAqIFRodXMgdGhlIG51bWJlcnMgd2lsbCBiZSB0cnVlbHkgcmFuZG9tIHVubGVzcyB0aGVyZSBoYXZlIGJlZW4gbm8KKyAqIG9wZXJhdG9yIG9yIG5ldHdvcmsgZXZlbnRzIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBwc2V1ZG8gcmFuZG9tCisgKiBzZWVkZWQgYnkgdGhlIHJlYWwgdGltZSBjbG9jay4KKyAqLwordTMyX3QKK2F2UmFuZG9tKCkKK3sKKyAgcmV0dXJuICgoKCh1MzJfdClyYW5kKCkgPDwgMTYpICsgcmFuZCgpKSArIGF2UmFuZG9tU2VlZCk7Cit9CisKKyNlbmRpZiAvKiBNRDVfU1VQUE9SVCAqLworCisjZW5kaWYgLyogUFBQX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvbHdpcC9zcmMvbmV0aWYvcHBwL3JhbmRtLmggYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9yYW5kbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTg0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC9yYW5kbS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiByYW5kbS5oIC0gUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaGVhZGVyIGZpbGUuCisqCisqIENvcHlyaWdodCAoYykgMjAwMyBieSBNYXJjIEJvdWNoZXIsIFNlcnZpY2VzIEluZm9ybWF0aXF1ZXMgKE1CU0kpIGluYy4KKyogQ29weXJpZ2h0IChjKSAxOTk4IEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyoKKyogVGhlIGF1dGhvcnMgaGVyZWJ5IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsCisqIGFuZCBsaWNlbnNlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQKKyogdGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCB0aGlzCisqIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGFyZSBpbmNsdWRlZCB2ZXJiYXRpbSBpbiBhbnkgCisqIGRpc3RyaWJ1dGlvbnMuIE5vIHdyaXR0ZW4gYWdyZWVtZW50LCBsaWNlbnNlLCBvciByb3lhbHR5IGZlZSBpcyByZXF1aXJlZAorKiBmb3IgYW55IG9mIHRoZSBhdXRob3JpemVkIHVzZXMuCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPTlRSSUJVVE9SUyAqQVMgSVMqIEFORCBBTlkgRVhQUkVTUyBPUgorKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIAorKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJFVklTSU9OIEhJU1RPUlkKKyoKKyogMDMtMDEtMDEgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisqICAgUG9ydGVkIHRvIGx3SVAuCisqIDk4LTA1LTI5IEd1eSBMYW5jYXN0ZXIgPGdsYW5jYUBnZXNuLmNvbT4sIEdsb2JhbCBFbGVjdGlvbiBTeXN0ZW1zIEluYy4KKyogICBFeHRyYWN0ZWQgZnJvbSBhdm9zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUkFORE1fSAorI2RlZmluZSBSQU5ETV9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKgorKioqIFBVQkxJQyBGVU5DVElPTlMgKioqCisqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBJbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAqLwordm9pZCBhdlJhbmRvbUluaXQodm9pZCk7CisKKy8qCisgKiBDaHVybiB0aGUgcmFuZG9tbmVzcyBwb29sIG9uIGEgcmFuZG9tIGV2ZW50LiAgQ2FsbCB0aGlzIGVhcmx5IGFuZCBvZnRlbgorICogb24gcmFuZG9tIGFuZCBzZW1pLXJhbmRvbSBzeXN0ZW0gZXZlbnRzIHRvIGJ1aWxkIHJhbmRvbW5lc3MgaW4gdGltZSBmb3IKKyAqIHVzYWdlLiAgRm9yIHJhbmRvbWx5IHRpbWVkIGV2ZW50cywgcGFzcyBhIG51bGwgcG9pbnRlciBhbmQgYSB6ZXJvIGxlbmd0aAorICogYW5kIHRoaXMgd2lsbCB1c2UgdGhlIHN5c3RlbSB0aW1lciBhbmQgb3RoZXIgc291cmNlcyB0byBhZGQgcmFuZG9tbmVzcy4KKyAqIElmIG5ldyByYW5kb20gZGF0YSBpcyBhdmFpbGFibGUsIHBhc3MgYSBwb2ludGVyIHRvIHRoYXQgYW5kIGl0IHdpbGwgYmUKKyAqIGluY2x1ZGVkLgorICovCit2b2lkIGF2Q2h1cm5SYW5kKGNoYXIgKnJhbmREYXRhLCB1MzJfdCByYW5kTGVuKTsKKworLyoKKyAqIFJhbmRvbWl6ZSBvdXIgcmFuZG9tIHNlZWQgdmFsdWUuICBUbyBiZSBjYWxsZWQgZm9yIHRydWVseSByYW5kb20gZXZlbnRzCisgKiBzdWNoIGFzIHVzZXIgb3BlcmF0aW9ucyBhbmQgbmV0d29yayB0cmFmZmljLgorICovCisjaWYgTUQ1X1NVUFBPUlQKKyNkZWZpbmUgYXZSYW5kb21pemUoKSBhdkNodXJuUmFuZChOVUxMLCAwKQorI2Vsc2UgIC8qIE1ENV9TVVBQT1JUICovCit2b2lkIGF2UmFuZG9taXplKHZvaWQpOworI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCisKKy8qCisgKiBVc2UgdGhlIHJhbmRvbSBwb29sIHRvIGdlbmVyYXRlIHJhbmRvbSBkYXRhLiAgVGhpcyBkZWdyYWRlcyB0byBwc2V1ZG8KKyAqIHJhbmRvbSB3aGVuIHVzZWQgZmFzdGVyIHRoYW4gcmFuZG9tbmVzcyBpcyBzdXBwbGllZCB1c2luZyBjaHVyblJhbmQoKS4KKyAqIFRodXMgaXQncyBpbXBvcnRhbnQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdHMgb2YgdGhpcyBhcmUgbm90CisgKiBwdWJsaXNoZWQgZGlyZWN0bHkgYmVjYXVzZSBvbmUgY291bGQgcHJlZGljdCB0aGUgbmV4dCByZXN1bHQgdG8gYXQKKyAqIGxlYXN0IHNvbWUgZGVncmVlLiAgQWxzbywgaXQncyBpbXBvcnRhbnQgdG8gZ2V0IGEgZ29vZCBzZWVkIGJlZm9yZQorICogdGhlIGZpcnN0IHVzZS4KKyAqLwordm9pZCBhdkdlblJhbmQoY2hhciAqYnVmLCB1MzJfdCBidWZMZW4pOworCisvKgorICogUmV0dXJuIGEgbmV3IHJhbmRvbSBudW1iZXIuCisgKi8KK3UzMl90IGF2UmFuZG9tKHZvaWQpOworCisKKyNlbmRpZiAvKiBSQU5ETV9IICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC92ai5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvdmouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2YyZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvdmouYwpAQCAtMCwwICsxLDY1MiBAQAorLyoKKyAqIFJvdXRpbmVzIHRvIGNvbXByZXNzIGFuZCB1bmNvbXBlc3MgdGNwIHBhY2tldHMgKGZvciB0cmFuc21pc3Npb24KKyAqIG92ZXIgbG93IHNwZWVkIHNlcmlhbCBsaW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogVmFuIEphY29ic29uICh2YW5AaGVsaW9zLmVlLmxibC5nb3YpLCBEZWMgMzEsIDE5ODk6CisgKiAgIEluaXRpYWwgZGlzdHJpYnV0aW9uLgorICoKKyAqIE1vZGlmaWVkIEp1bmUgMTk5MyBieSBQYXVsIE1hY2tlcnJhcywgcGF1bHVzQGNzLmFudS5lZHUuYXUsCisgKiBzbyB0aGF0IHRoZSBlbnRpcmUgcGFja2V0IGJlaW5nIGRlY29tcHJlc3NlZCBkb2Vzbid0IGhhdmUKKyAqIHRvIGJlIGluIGNvbnRpZ3VvdXMgbWVtb3J5IChqdXN0IHRoZSBjb21wcmVzc2VkIGhlYWRlcikuCisgKgorICogTW9kaWZpZWQgTWFyY2ggMTk5OCBieSBHdXkgTGFuY2FzdGVyLCBnbGFuY2FAZ2Vzbi5jb20sCisgKiBmb3IgYSAxNiBiaXQgcHJvY2Vzc29yLgorICovCisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgUFBQX1NVUFBPUlQgLyogZG9uJ3QgYnVpbGQgaWYgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBsd2lwb3B0cy5oICovCisKKyNpbmNsdWRlICJwcHAuaCIKKyNpbmNsdWRlICJwcHBkZWJ1Zy5oIgorCisjaW5jbHVkZSAidmouaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgVkpfU1VQUE9SVAorCisjaWYgTElOS19TVEFUUworI2RlZmluZSBJTkNSKGNvdW50ZXIpICsrY29tcC0+c3RhdHMuY291bnRlcgorI2Vsc2UKKyNkZWZpbmUgSU5DUihjb3VudGVyKQorI2VuZGlmCisKK3ZvaWQKK3ZqX2NvbXByZXNzX2luaXQoc3RydWN0IHZqY29tcHJlc3MgKmNvbXApCit7CisgIHJlZ2lzdGVyIHVfY2hhciBpOworICByZWdpc3RlciBzdHJ1Y3QgY3N0YXRlICp0c3RhdGUgPSBjb21wLT50c3RhdGU7CisgIAorI2lmIE1BWF9TTE9UUyA9PSAwCisgIG1lbXNldCgoY2hhciAqKWNvbXAsIDAsIHNpemVvZigqY29tcCkpOworI2VuZGlmCisgIGNvbXAtPm1heFNsb3RJbmRleCA9IE1BWF9TTE9UUyAtIDE7CisgIGNvbXAtPmNvbXByZXNzU2xvdCA9IDA7ICAgIC8qIERpc2FibGUgc2xvdCBJRCBjb21wcmVzc2lvbiBieSBkZWZhdWx0LiAqLworICBmb3IgKGkgPSBNQVhfU0xPVFMgLSAxOyBpID4gMDsgLS1pKSB7CisgICAgdHN0YXRlW2ldLmNzX2lkID0gaTsKKyAgICB0c3RhdGVbaV0uY3NfbmV4dCA9ICZ0c3RhdGVbaSAtIDFdOworICB9CisgIHRzdGF0ZVswXS5jc19uZXh0ID0gJnRzdGF0ZVtNQVhfU0xPVFMgLSAxXTsKKyAgdHN0YXRlWzBdLmNzX2lkID0gMDsKKyAgY29tcC0+bGFzdF9jcyA9ICZ0c3RhdGVbMF07CisgIGNvbXAtPmxhc3RfcmVjdiA9IDI1NTsKKyAgY29tcC0+bGFzdF94bWl0ID0gMjU1OworICBjb21wLT5mbGFncyA9IFZKRl9UT1NTOworfQorCisKKy8qIEVOQ09ERSBlbmNvZGVzIGEgbnVtYmVyIHRoYXQgaXMga25vd24gdG8gYmUgbm9uLXplcm8uICBFTkNPREVaCisgKiBjaGVja3MgZm9yIHplcm8gKHNpbmNlIHplcm8gaGFzIHRvIGJlIGVuY29kZWQgaW4gdGhlIGxvbmcsIDMgYnl0ZQorICogZm9ybSkuCisgKi8KKyNkZWZpbmUgRU5DT0RFKG4pIHsgXAorICBpZiAoKHVfc2hvcnQpKG4pID49IDI1NikgeyBcCisgICAgKmNwKysgPSAwOyBcCisgICAgY3BbMV0gPSAodV9jaGFyKShuKTsgXAorICAgIGNwWzBdID0gKHVfY2hhcikoKG4pID4+IDgpOyBcCisgICAgY3AgKz0gMjsgXAorICB9IGVsc2UgeyBcCisgICAgKmNwKysgPSAodV9jaGFyKShuKTsgXAorICB9IFwKK30KKyNkZWZpbmUgRU5DT0RFWihuKSB7IFwKKyAgaWYgKCh1X3Nob3J0KShuKSA+PSAyNTYgfHwgKHVfc2hvcnQpKG4pID09IDApIHsgXAorICAgICpjcCsrID0gMDsgXAorICAgIGNwWzFdID0gKHVfY2hhcikobik7IFwKKyAgICBjcFswXSA9ICh1X2NoYXIpKChuKSA+PiA4KTsgXAorICAgIGNwICs9IDI7IFwKKyAgfSBlbHNlIHsgXAorICAgICpjcCsrID0gKHVfY2hhcikobik7IFwKKyAgfSBcCit9CisKKyNkZWZpbmUgREVDT0RFTChmKSB7IFwKKyAgaWYgKCpjcCA9PSAwKSB7XAorICAgIHUzMl90IHRtcCA9IG50b2hsKGYpICsgKChjcFsxXSA8PCA4KSB8IGNwWzJdKTsgXAorICAgIChmKSA9IGh0b25sKHRtcCk7IFwKKyAgICBjcCArPSAzOyBcCisgIH0gZWxzZSB7IFwKKyAgICB1MzJfdCB0bXAgPSBudG9obChmKSArICh1MzJfdCkqY3ArKzsgXAorICAgIChmKSA9IGh0b25sKHRtcCk7IFwKKyAgfSBcCit9CisKKyNkZWZpbmUgREVDT0RFUyhmKSB7IFwKKyAgaWYgKCpjcCA9PSAwKSB7XAorICAgIHVfc2hvcnQgdG1wID0gbnRvaHMoZikgKyAoKCh1X3Nob3J0KWNwWzFdIDw8IDgpIHwgY3BbMl0pOyBcCisgICAgKGYpID0gaHRvbnModG1wKTsgXAorICAgIGNwICs9IDM7IFwKKyAgfSBlbHNlIHsgXAorICAgIHVfc2hvcnQgdG1wID0gbnRvaHMoZikgKyAodV9zaG9ydCkqY3ArKzsgXAorICAgIChmKSA9IGh0b25zKHRtcCk7IFwKKyAgfSBcCit9CisKKyNkZWZpbmUgREVDT0RFVShmKSB7IFwKKyAgaWYgKCpjcCA9PSAwKSB7XAorICAgIChmKSA9IGh0b25zKCgodV9zaG9ydCljcFsxXSA8PCA4KSB8IGNwWzJdKTsgXAorICAgIGNwICs9IDM7IFwKKyAgfSBlbHNlIHsgXAorICAgIChmKSA9IGh0b25zKCh1X3Nob3J0KSpjcCsrKTsgXAorICB9IFwKK30KKworLyoKKyAqIHZqX2NvbXByZXNzX3RjcCAtIEF0dGVtcHQgdG8gZG8gVmFuIEphY29ic29uIGhlYWRlciBjb21wcmVzc2lvbiBvbiBhCisgKiBwYWNrZXQuICBUaGlzIGFzc3VtZXMgdGhhdCBuYiBhbmQgY29tcCBhcmUgbm90IG51bGwgYW5kIHRoYXQgdGhlIGZpcnN0CisgKiBidWZmZXIgb2YgdGhlIGNoYWluIGNvbnRhaW5zIGEgdmFsaWQgSVAgaGVhZGVyLgorICogUmV0dXJuIHRoZSBWSiB0eXBlIGNvZGUgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgcGFja2V0IHdhcworICogY29tcHJlc3NlZC4KKyAqLwordV9pbnQKK3ZqX2NvbXByZXNzX3RjcChzdHJ1Y3Qgdmpjb21wcmVzcyAqY29tcCwgc3RydWN0IHBidWYgKnBiKQoreworICByZWdpc3RlciBzdHJ1Y3QgaXBfaGRyICppcCA9IChzdHJ1Y3QgaXBfaGRyICopcGItPnBheWxvYWQ7CisgIHJlZ2lzdGVyIHN0cnVjdCBjc3RhdGUgKmNzID0gY29tcC0+bGFzdF9jcy0+Y3NfbmV4dDsKKyAgcmVnaXN0ZXIgdV9zaG9ydCBobGVuID0gSVBIX0hMKGlwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHRjcF9oZHIgKm90aDsKKyAgcmVnaXN0ZXIgc3RydWN0IHRjcF9oZHIgKnRoOworICByZWdpc3RlciB1X3Nob3J0IGRlbHRhUywgZGVsdGFBOworICByZWdpc3RlciB1X2xvbmcgZGVsdGFMOworICByZWdpc3RlciB1X2ludCBjaGFuZ2VzID0gMDsKKyAgdV9jaGFyIG5ld19zZXFbMTZdOworICByZWdpc3RlciB1X2NoYXIgKmNwID0gbmV3X3NlcTsKKworICAvKiAgCisgICAqIENoZWNrIHRoYXQgdGhlIHBhY2tldCBpcyBJUCBwcm90byBUQ1AuCisgICAqLworICBpZiAoSVBIX1BST1RPKGlwKSAhPSBJUF9QUk9UT19UQ1ApIHsKKyAgICByZXR1cm4gKFRZUEVfSVApOworICB9CisKKyAgLyoKKyAgICogQmFpbCBpZiB0aGlzIGlzIGFuIElQIGZyYWdtZW50IG9yIGlmIHRoZSBUQ1AgcGFja2V0IGlzbid0CisgICAqIGBjb21wcmVzc2libGUnIChpLmUuLCBBQ0sgaXNuJ3Qgc2V0IG9yIHNvbWUgb3RoZXIgY29udHJvbCBiaXQgaXMKKyAgICogc2V0KS4gIAorICAgKi8KKyAgaWYgKChJUEhfT0ZGU0VUKGlwKSAmIFBQX0hUT05TKDB4M2ZmZikpIHx8IHBiLT50b3RfbGVuIDwgNDApIHsKKyAgICByZXR1cm4gKFRZUEVfSVApOworICB9CisgIHRoID0gKHN0cnVjdCB0Y3BfaGRyICopJigobG9uZyAqKWlwKVtobGVuXTsKKyAgaWYgKChUQ1BIX0ZMQUdTKHRoKSAmIChUQ1BfU1lOfFRDUF9GSU58VENQX1JTVHxUQ1BfQUNLKSkgIT0gVENQX0FDSykgeworICAgIHJldHVybiAoVFlQRV9JUCk7CisgIH0KKyAgLyoKKyAgICogUGFja2V0IGlzIGNvbXByZXNzaWJsZSAtLSB3ZSdyZSBnb2luZyB0byBzZW5kIGVpdGhlciBhCisgICAqIENPTVBSRVNTRURfVENQIG9yIFVOQ09NUFJFU1NFRF9UQ1AgcGFja2V0LiAgRWl0aGVyIHdheSB3ZSBuZWVkCisgICAqIHRvIGxvY2F0ZSAob3IgY3JlYXRlKSB0aGUgY29ubmVjdGlvbiBzdGF0ZS4gIFNwZWNpYWwgY2FzZSB0aGUKKyAgICogbW9zdCByZWNlbnRseSB1c2VkIGNvbm5lY3Rpb24gc2luY2UgaXQncyBtb3N0IGxpa2VseSB0byBiZSB1c2VkCisgICAqIGFnYWluICYgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnkgcmVvcmRlcmluZyBpZiBpdCdzIHVzZWQuCisgICAqLworICBJTkNSKHZqc19wYWNrZXRzKTsKKyAgaWYgKCFpcF9hZGRyX2NtcCgmaXAtPnNyYywgJmNzLT5jc19pcC5zcmMpCisgICAgICB8fCAhaXBfYWRkcl9jbXAoJmlwLT5kZXN0LCAmY3MtPmNzX2lwLmRlc3QpCisgICAgICB8fCAqKGxvbmcgKil0aCAhPSAoKGxvbmcgKikmY3MtPmNzX2lwKVtJUEhfSEwoJmNzLT5jc19pcCldKSB7CisgICAgLyoKKyAgICAgKiBXYXNuJ3QgdGhlIGZpcnN0IC0tIHNlYXJjaCBmb3IgaXQuCisgICAgICoKKyAgICAgKiBTdGF0ZXMgYXJlIGtlcHQgaW4gYSBjaXJjdWxhcmx5IGxpbmtlZCBsaXN0IHdpdGgKKyAgICAgKiBsYXN0X2NzIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBUaGUKKyAgICAgKiBsaXN0IGlzIGtlcHQgaW4gbHJ1IG9yZGVyIGJ5IG1vdmluZyBhIHN0YXRlIHRvIHRoZQorICAgICAqIGhlYWQgb2YgdGhlIGxpc3Qgd2hlbmV2ZXIgaXQgaXMgcmVmZXJlbmNlZC4gIFNpbmNlCisgICAgICogdGhlIGxpc3QgaXMgc2hvcnQgYW5kLCBlbXBpcmljYWxseSwgdGhlIGNvbm5lY3Rpb24KKyAgICAgKiB3ZSB3YW50IGlzIGFsbW9zdCBhbHdheXMgbmVhciB0aGUgZnJvbnQsIHdlIGxvY2F0ZQorICAgICAqIHN0YXRlcyB2aWEgbGluZWFyIHNlYXJjaC4gIElmIHdlIGRvbid0IGZpbmQgYSBzdGF0ZQorICAgICAqIGZvciB0aGUgZGF0YWdyYW0sIHRoZSBvbGRlc3Qgc3RhdGUgaXMgKHJlLSl1c2VkLgorICAgICAqLworICAgIHJlZ2lzdGVyIHN0cnVjdCBjc3RhdGUgKmxjczsKKyAgICByZWdpc3RlciBzdHJ1Y3QgY3N0YXRlICpsYXN0Y3MgPSBjb21wLT5sYXN0X2NzOworICAgIAorICAgIGRvIHsKKyAgICAgIGxjcyA9IGNzOyBjcyA9IGNzLT5jc19uZXh0OworICAgICAgSU5DUih2anNfc2VhcmNoZXMpOworICAgICAgaWYgKGlwX2FkZHJfY21wKCZpcC0+c3JjLCAmY3MtPmNzX2lwLnNyYykKKyAgICAgICAgICAmJiBpcF9hZGRyX2NtcCgmaXAtPmRlc3QsICZjcy0+Y3NfaXAuZGVzdCkKKyAgICAgICAgICAmJiAqKGxvbmcgKil0aCA9PSAoKGxvbmcgKikmY3MtPmNzX2lwKVtJUEhfSEwoJmNzLT5jc19pcCldKSB7CisgICAgICAgIGdvdG8gZm91bmQ7CisgICAgICB9CisgICAgfSB3aGlsZSAoY3MgIT0gbGFzdGNzKTsKKworICAgIC8qCisgICAgICogRGlkbid0IGZpbmQgaXQgLS0gcmUtdXNlIG9sZGVzdCBjc3RhdGUuICBTZW5kIGFuCisgICAgICogdW5jb21wcmVzc2VkIHBhY2tldCB0aGF0IHRlbGxzIHRoZSBvdGhlciBzaWRlIHdoYXQKKyAgICAgKiBjb25uZWN0aW9uIG51bWJlciB3ZSdyZSB1c2luZyBmb3IgdGhpcyBjb252ZXJzYXRpb24uCisgICAgICogTm90ZSB0aGF0IHNpbmNlIHRoZSBzdGF0ZSBsaXN0IGlzIGNpcmN1bGFyLCB0aGUgb2xkZXN0CisgICAgICogc3RhdGUgcG9pbnRzIHRvIHRoZSBuZXdlc3QgYW5kIHdlIG9ubHkgbmVlZCB0byBzZXQKKyAgICAgKiBsYXN0X2NzIHRvIHVwZGF0ZSB0aGUgbHJ1IGxpbmthZ2UuCisgICAgICovCisgICAgSU5DUih2anNfbWlzc2VzKTsKKyAgICBjb21wLT5sYXN0X2NzID0gbGNzOworICAgIGhsZW4gKz0gVENQSF9PRkZTRVQodGgpOworICAgIGhsZW4gPDw9IDI7CisgICAgLyogQ2hlY2sgdGhhdCB0aGUgSVAvVENQIGhlYWRlcnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZmlyc3QgYnVmZmVyLiAqLworICAgIGlmIChobGVuID4gcGItPmxlbikgeworICAgICAgcmV0dXJuIChUWVBFX0lQKTsKKyAgICB9CisgICAgZ290byB1bmNvbXByZXNzZWQ7CisKKyAgICBmb3VuZDoKKyAgICAvKgorICAgICAqIEZvdW5kIGl0IC0tIG1vdmUgdG8gdGhlIGZyb250IG9uIHRoZSBjb25uZWN0aW9uIGxpc3QuCisgICAgICovCisgICAgaWYgKGNzID09IGxhc3RjcykgeworICAgICAgY29tcC0+bGFzdF9jcyA9IGxjczsKKyAgICB9IGVsc2UgeworICAgICAgbGNzLT5jc19uZXh0ID0gY3MtPmNzX25leHQ7CisgICAgICBjcy0+Y3NfbmV4dCA9IGxhc3Rjcy0+Y3NfbmV4dDsKKyAgICAgIGxhc3Rjcy0+Y3NfbmV4dCA9IGNzOworICAgIH0KKyAgfQorCisgIG90aCA9IChzdHJ1Y3QgdGNwX2hkciAqKSYoKGxvbmcgKikmY3MtPmNzX2lwKVtobGVuXTsKKyAgZGVsdGFTID0gaGxlbjsKKyAgaGxlbiArPSBUQ1BIX09GRlNFVCh0aCk7CisgIGhsZW4gPDw9IDI7CisgIC8qIENoZWNrIHRoYXQgdGhlIElQL1RDUCBoZWFkZXJzIGFyZSBjb250YWluZWQgaW4gdGhlIGZpcnN0IGJ1ZmZlci4gKi8KKyAgaWYgKGhsZW4gPiBwYi0+bGVuKSB7CisgICAgUFBQREVCVUcoTE9HX0lORk8sICgidmpfY29tcHJlc3NfdGNwOiBoZWFkZXIgbGVuICVkIHNwYW5zIGJ1ZmZlcnNcbiIsIGhsZW4pKTsKKyAgICByZXR1cm4gKFRZUEVfSVApOworICB9CisKKyAgLyoKKyAgICogTWFrZSBzdXJlIHRoYXQgb25seSB3aGF0IHdlIGV4cGVjdCB0byBjaGFuZ2UgY2hhbmdlZC4gVGhlIGZpcnN0CisgICAqIGxpbmUgb2YgdGhlIGBpZicgY2hlY2tzIHRoZSBJUCBwcm90b2NvbCB2ZXJzaW9uLCBoZWFkZXIgbGVuZ3RoICYKKyAgICogdHlwZSBvZiBzZXJ2aWNlLiAgVGhlIDJuZCBsaW5lIGNoZWNrcyB0aGUgIkRvbid0IGZyYWdtZW50IiBiaXQuCisgICAqIFRoZSAzcmQgbGluZSBjaGVja3MgdGhlIHRpbWUtdG8tbGl2ZSBhbmQgcHJvdG9jb2wgKHRoZSBwcm90b2NvbAorICAgKiBjaGVjayBpcyB1bm5lY2Vzc2FyeSBidXQgY29zdGxlc3MpLiAgVGhlIDR0aCBsaW5lIGNoZWNrcyB0aGUgVENQCisgICAqIGhlYWRlciBsZW5ndGguICBUaGUgNXRoIGxpbmUgY2hlY2tzIElQIG9wdGlvbnMsIGlmIGFueS4gIFRoZSA2dGgKKyAgICogbGluZSBjaGVja3MgVENQIG9wdGlvbnMsIGlmIGFueS4gIElmIGFueSBvZiB0aGVzZSB0aGluZ3MgYXJlCisgICAqIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBwcmV2aW91cyAmIGN1cnJlbnQgZGF0YWdyYW0sIHdlIHNlbmQgdGhlCisgICAqIGN1cnJlbnQgZGF0YWdyYW0gYHVuY29tcHJlc3NlZCcuCisgICAqLworICBpZiAoKCh1X3Nob3J0ICopaXApWzBdICE9ICgodV9zaG9ydCAqKSZjcy0+Y3NfaXApWzBdIAorICAgICAgfHwgKCh1X3Nob3J0ICopaXApWzNdICE9ICgodV9zaG9ydCAqKSZjcy0+Y3NfaXApWzNdIAorICAgICAgfHwgKCh1X3Nob3J0ICopaXApWzRdICE9ICgodV9zaG9ydCAqKSZjcy0+Y3NfaXApWzRdIAorICAgICAgfHwgVENQSF9PRkZTRVQodGgpICE9IFRDUEhfT0ZGU0VUKG90aCkgCisgICAgICB8fCAoZGVsdGFTID4gNSAmJiBCQ01QKGlwICsgMSwgJmNzLT5jc19pcCArIDEsIChkZWx0YVMgLSA1KSA8PCAyKSkgCisgICAgICB8fCAoVENQSF9PRkZTRVQodGgpID4gNSAmJiBCQ01QKHRoICsgMSwgb3RoICsgMSwgKFRDUEhfT0ZGU0VUKHRoKSAtIDUpIDw8IDIpKSkgeworICAgIGdvdG8gdW5jb21wcmVzc2VkOworICB9CisKKyAgLyoKKyAgICogRmlndXJlIG91dCB3aGljaCBvZiB0aGUgY2hhbmdpbmcgZmllbGRzIGNoYW5nZWQuICBUaGUKKyAgICogcmVjZWl2ZXIgZXhwZWN0cyBjaGFuZ2VzIGluIHRoZSBvcmRlcjogdXJnZW50LCB3aW5kb3csCisgICAqIGFjaywgc2VxICh0aGUgb3JkZXIgbWluaW1pemVzIHRoZSBudW1iZXIgb2YgdGVtcG9yYXJpZXMKKyAgICogbmVlZGVkIGluIHRoaXMgc2VjdGlvbiBvZiBjb2RlKS4KKyAgICovCisgIGlmIChUQ1BIX0ZMQUdTKHRoKSAmIFRDUF9VUkcpIHsKKyAgICBkZWx0YVMgPSBudG9ocyh0aC0+dXJncCk7CisgICAgRU5DT0RFWihkZWx0YVMpOworICAgIGNoYW5nZXMgfD0gTkVXX1U7CisgIH0gZWxzZSBpZiAodGgtPnVyZ3AgIT0gb3RoLT51cmdwKSB7CisgICAgLyogYXJnaCEgVVJHIG5vdCBzZXQgYnV0IHVycCBjaGFuZ2VkIC0tIGEgc2Vuc2libGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbmV2ZXIgZG8gdGhpcyBidXQgUkZDNzkzCisgICAgICogZG9lc24ndCBwcm9oaWJpdCB0aGUgY2hhbmdlIHNvIHdlIGhhdmUgdG8gZGVhbAorICAgICAqIHdpdGggaXQuICovCisgICAgZ290byB1bmNvbXByZXNzZWQ7CisgIH0KKworICBpZiAoKGRlbHRhUyA9ICh1X3Nob3J0KShudG9ocyh0aC0+d25kKSAtIG50b2hzKG90aC0+d25kKSkpICE9IDApIHsKKyAgICBFTkNPREUoZGVsdGFTKTsKKyAgICBjaGFuZ2VzIHw9IE5FV19XOworICB9CisKKyAgaWYgKChkZWx0YUwgPSBudG9obCh0aC0+YWNrbm8pIC0gbnRvaGwob3RoLT5hY2tubykpICE9IDApIHsKKyAgICBpZiAoZGVsdGFMID4gMHhmZmZmKSB7CisgICAgICBnb3RvIHVuY29tcHJlc3NlZDsKKyAgICB9CisgICAgZGVsdGFBID0gKHVfc2hvcnQpZGVsdGFMOworICAgIEVOQ09ERShkZWx0YUEpOworICAgIGNoYW5nZXMgfD0gTkVXX0E7CisgIH0KKworICBpZiAoKGRlbHRhTCA9IG50b2hsKHRoLT5zZXFubykgLSBudG9obChvdGgtPnNlcW5vKSkgIT0gMCkgeworICAgIGlmIChkZWx0YUwgPiAweGZmZmYpIHsKKyAgICAgIGdvdG8gdW5jb21wcmVzc2VkOworICAgIH0KKyAgICBkZWx0YVMgPSAodV9zaG9ydClkZWx0YUw7CisgICAgRU5DT0RFKGRlbHRhUyk7CisgICAgY2hhbmdlcyB8PSBORVdfUzsKKyAgfQorCisgIHN3aXRjaChjaGFuZ2VzKSB7CisgIGNhc2UgMDoKKyAgICAvKgorICAgICAqIE5vdGhpbmcgY2hhbmdlZC4gSWYgdGhpcyBwYWNrZXQgY29udGFpbnMgZGF0YSBhbmQgdGhlCisgICAgICogbGFzdCBvbmUgZGlkbid0LCB0aGlzIGlzIHByb2JhYmx5IGEgZGF0YSBwYWNrZXQgZm9sbG93aW5nCisgICAgICogYW4gYWNrIChub3JtYWwgb24gYW4gaW50ZXJhY3RpdmUgY29ubmVjdGlvbikgYW5kIHdlIHNlbmQKKyAgICAgKiBpdCBjb21wcmVzc2VkLiAgT3RoZXJ3aXNlIGl0J3MgcHJvYmFibHkgYSByZXRyYW5zbWl0LAorICAgICAqIHJldHJhbnNtaXR0ZWQgYWNrIG9yIHdpbmRvdyBwcm9iZS4gIFNlbmQgaXQgdW5jb21wcmVzc2VkCisgICAgICogaW4gY2FzZSB0aGUgb3RoZXIgc2lkZSBtaXNzZWQgdGhlIGNvbXByZXNzZWQgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBpZiAoSVBIX0xFTihpcCkgIT0gSVBIX0xFTigmY3MtPmNzX2lwKSAmJgorICAgICAgbnRvaHMoSVBIX0xFTigmY3MtPmNzX2lwKSkgPT0gaGxlbikgeworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIChmYWxsIHRocm91Z2gpICovCisKKyAgY2FzZSBTUEVDSUFMX0k6CisgIGNhc2UgU1BFQ0lBTF9EOgorICAgIC8qCisgICAgICogYWN0dWFsIGNoYW5nZXMgbWF0Y2ggb25lIG9mIG91ciBzcGVjaWFsIGNhc2UgZW5jb2RpbmdzIC0tCisgICAgICogc2VuZCBwYWNrZXQgdW5jb21wcmVzc2VkLgorICAgICAqLworICAgIGdvdG8gdW5jb21wcmVzc2VkOworCisgIGNhc2UgTkVXX1N8TkVXX0E6CisgICAgaWYgKGRlbHRhUyA9PSBkZWx0YUEgJiYgZGVsdGFTID09IG50b2hzKElQSF9MRU4oJmNzLT5jc19pcCkpIC0gaGxlbikgeworICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBlY2hvZWQgdGVybWluYWwgdHJhZmZpYyAqLworICAgICAgY2hhbmdlcyA9IFNQRUNJQUxfSTsKKyAgICAgIGNwID0gbmV3X3NlcTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBORVdfUzoKKyAgICBpZiAoZGVsdGFTID09IG50b2hzKElQSF9MRU4oJmNzLT5jc19pcCkpIC0gaGxlbikgeworICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBkYXRhIHhmZXIgKi8KKyAgICAgIGNoYW5nZXMgPSBTUEVDSUFMX0Q7CisgICAgICBjcCA9IG5ld19zZXE7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgZGVsdGFTID0gKHVfc2hvcnQpKG50b2hzKElQSF9JRChpcCkpIC0gbnRvaHMoSVBIX0lEKCZjcy0+Y3NfaXApKSk7CisgIGlmIChkZWx0YVMgIT0gMSkgeworICAgIEVOQ09ERVooZGVsdGFTKTsKKyAgICBjaGFuZ2VzIHw9IE5FV19JOworICB9CisgIGlmIChUQ1BIX0ZMQUdTKHRoKSAmIFRDUF9QU0gpIHsKKyAgICBjaGFuZ2VzIHw9IFRDUF9QVVNIX0JJVDsKKyAgfQorICAvKgorICAgKiBHcmFiIHRoZSBja3N1bSBiZWZvcmUgd2Ugb3ZlcndyaXRlIGl0IGJlbG93LiAgVGhlbiB1cGRhdGUgb3VyCisgICAqIHN0YXRlIHdpdGggdGhpcyBwYWNrZXQncyBoZWFkZXIuCisgICAqLworICBkZWx0YUEgPSBudG9ocyh0aC0+Y2hrc3VtKTsKKyAgQkNPUFkoaXAsICZjcy0+Y3NfaXAsIGhsZW4pOworCisgIC8qCisgICAqIFdlIHdhbnQgdG8gdXNlIHRoZSBvcmlnaW5hbCBwYWNrZXQgYXMgb3VyIGNvbXByZXNzZWQgcGFja2V0LgorICAgKiAoY3AgLSBuZXdfc2VxKSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIG5lZWQgZm9yIGNvbXByZXNzZWQKKyAgICogc2VxdWVuY2UgbnVtYmVycy4gIEluIGFkZGl0aW9uIHdlIG5lZWQgb25lIGJ5dGUgZm9yIHRoZSBjaGFuZ2UKKyAgICogbWFzaywgb25lIGZvciB0aGUgY29ubmVjdGlvbiBpZCBhbmQgdHdvIGZvciB0aGUgdGNwIGNoZWNrc3VtLgorICAgKiBTbywgKGNwIC0gbmV3X3NlcSkgKyA0IGJ5dGVzIG9mIGhlYWRlciBhcmUgbmVlZGVkLiAgaGxlbiBpcyBob3cKKyAgICogbWFueSBieXRlcyBvZiB0aGUgb3JpZ2luYWwgcGFja2V0IHRvIHRvc3Mgc28gc3VidHJhY3QgdGhlIHR3byB0bworICAgKiBnZXQgdGhlIG5ldyBwYWNrZXQgc2l6ZS4KKyAgICovCisgIGRlbHRhUyA9ICh1X3Nob3J0KShjcCAtIG5ld19zZXEpOworICBpZiAoIWNvbXAtPmNvbXByZXNzU2xvdCB8fCBjb21wLT5sYXN0X3htaXQgIT0gY3MtPmNzX2lkKSB7CisgICAgY29tcC0+bGFzdF94bWl0ID0gY3MtPmNzX2lkOworICAgIGhsZW4gLT0gZGVsdGFTICsgNDsKKyAgICBpZihwYnVmX2hlYWRlcihwYiwgLWhsZW4pKXsKKyAgICAgIC8qIENhbiB3ZSBjb3BlIHdpdGggdGhpcyBmYWlsaW5nPyAgSnVzdCBhc3NlcnQgZm9yIG5vdyAqLworICAgICAgTFdJUF9BU1NFUlQoInBidWZfaGVhZGVyIGZhaWxlZFxuIiwgMCk7CisgICAgfQorICAgIGNwID0gKHVfY2hhciAqKXBiLT5wYXlsb2FkOworICAgICpjcCsrID0gKHVfY2hhcikoY2hhbmdlcyB8IE5FV19DKTsKKyAgICAqY3ArKyA9IGNzLT5jc19pZDsKKyAgfSBlbHNlIHsKKyAgICBobGVuIC09IGRlbHRhUyArIDM7CisgICAgaWYocGJ1Zl9oZWFkZXIocGIsIC1obGVuKSkgeworICAgICAgLyogQ2FuIHdlIGNvcGUgd2l0aCB0aGlzIGZhaWxpbmc/ICBKdXN0IGFzc2VydCBmb3Igbm93ICovCisgICAgICBMV0lQX0FTU0VSVCgicGJ1Zl9oZWFkZXIgZmFpbGVkXG4iLCAwKTsKKyAgICB9CisgICAgY3AgPSAodV9jaGFyICopcGItPnBheWxvYWQ7CisgICAgKmNwKysgPSAodV9jaGFyKWNoYW5nZXM7CisgIH0KKyAgKmNwKysgPSAodV9jaGFyKShkZWx0YUEgPj4gOCk7CisgICpjcCsrID0gKHVfY2hhcilkZWx0YUE7CisgIEJDT1BZKG5ld19zZXEsIGNwLCBkZWx0YVMpOworICBJTkNSKHZqc19jb21wcmVzc2VkKTsKKyAgcmV0dXJuIChUWVBFX0NPTVBSRVNTRURfVENQKTsKKworICAvKgorICAgKiBVcGRhdGUgY29ubmVjdGlvbiBzdGF0ZSBjcyAmIHNlbmQgdW5jb21wcmVzc2VkIHBhY2tldCAodGhhdCBpcywKKyAgICogYSByZWd1bGFyIGlwL3RjcCBwYWNrZXQgYnV0IHdpdGggdGhlICdjb252ZXJzYXRpb24gaWQnIHdlIGhvcGUKKyAgICogdG8gdXNlIG9uIGZ1dHVyZSBjb21wcmVzc2VkIHBhY2tldHMgaW4gdGhlIHByb3RvY29sIGZpZWxkKS4KKyAgICovCit1bmNvbXByZXNzZWQ6CisgIEJDT1BZKGlwLCAmY3MtPmNzX2lwLCBobGVuKTsKKyAgSVBIX1BST1RPX1NFVChpcCwgY3MtPmNzX2lkKTsKKyAgY29tcC0+bGFzdF94bWl0ID0gY3MtPmNzX2lkOworICByZXR1cm4gKFRZUEVfVU5DT01QUkVTU0VEX1RDUCk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB3ZSBtYXkgaGF2ZSBtaXNzZWQgYSBwYWNrZXQuCisgKi8KK3ZvaWQKK3ZqX3VuY29tcHJlc3NfZXJyKHN0cnVjdCB2amNvbXByZXNzICpjb21wKQoreworICBjb21wLT5mbGFncyB8PSBWSkZfVE9TUzsKKyAgSU5DUih2anNfZXJyb3Jpbik7Cit9CisKKy8qCisgKiAiVW5jb21wcmVzcyIgYSBwYWNrZXQgb2YgdHlwZSBUWVBFX1VOQ09NUFJFU1NFRF9UQ1AuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCitpbnQKK3ZqX3VuY29tcHJlc3NfdW5jb21wKHN0cnVjdCBwYnVmICpuYiwgc3RydWN0IHZqY29tcHJlc3MgKmNvbXApCit7CisgIHJlZ2lzdGVyIHVfaW50IGhsZW47CisgIHJlZ2lzdGVyIHN0cnVjdCBjc3RhdGUgKmNzOworICByZWdpc3RlciBzdHJ1Y3QgaXBfaGRyICppcDsKKyAgCisgIGlwID0gKHN0cnVjdCBpcF9oZHIgKiluYi0+cGF5bG9hZDsKKyAgaGxlbiA9IElQSF9ITChpcCkgPDwgMjsKKyAgaWYgKElQSF9QUk9UTyhpcCkgPj0gTUFYX1NMT1RTCisgICAgICB8fCBobGVuICsgc2l6ZW9mKHN0cnVjdCB0Y3BfaGRyKSA+IG5iLT5sZW4KKyAgICAgIHx8IChobGVuICs9IFRDUEhfT0ZGU0VUKCgoc3RydWN0IHRjcF9oZHIgKikmKChjaGFyICopaXApW2hsZW5dKSkgPDwgMikKKyAgICAgICAgICA+IG5iLT5sZW4KKyAgICAgIHx8IGhsZW4gPiBNQVhfSERSKSB7CisgICAgUFBQREVCVUcoTE9HX0lORk8sICgidmpfdW5jb21wcmVzc191bmNvbXA6IGJhZCBjaWQ9JWQsIGhsZW49JWQgYnVmbGVuPSVkXG4iLCAKKyAgICAgIElQSF9QUk9UTyhpcCksIGhsZW4sIG5iLT5sZW4pKTsKKyAgICBjb21wLT5mbGFncyB8PSBWSkZfVE9TUzsKKyAgICBJTkNSKHZqc19lcnJvcmluKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgY3MgPSAmY29tcC0+cnN0YXRlW2NvbXAtPmxhc3RfcmVjdiA9IElQSF9QUk9UTyhpcCldOworICBjb21wLT5mbGFncyAmPX4gVkpGX1RPU1M7CisgIElQSF9QUk9UT19TRVQoaXAsIElQX1BST1RPX1RDUCk7CisgIEJDT1BZKGlwLCAmY3MtPmNzX2lwLCBobGVuKTsKKyAgY3MtPmNzX2hsZW4gPSAodV9zaG9ydClobGVuOworICBJTkNSKHZqc191bmNvbXByZXNzZWRpbik7CisgIHJldHVybiAwOworfQorCisvKgorICogVW5jb21wcmVzcyBhIHBhY2tldCBvZiB0eXBlIFRZUEVfQ09NUFJFU1NFRF9UQ1AuCisgKiBUaGUgcGFja2V0IGlzIGNvbXBvc2VkIG9mIGEgYnVmZmVyIGNoYWluIGFuZCB0aGUgZmlyc3QgYnVmZmVyCisgKiBtdXN0IGNvbnRhaW4gYW4gYWNjdXJhdGUgY2hhaW4gbGVuZ3RoLgorICogVGhlIGZpcnN0IGJ1ZmZlciBtdXN0IGluY2x1ZGUgdGhlIGVudGlyZSBjb21wcmVzc2VkIFRDUC9JUCBoZWFkZXIuIAorICogVGhpcyBwcm9jZWR1cmUgcmVwbGFjZXMgdGhlIGNvbXByZXNzZWQgaGVhZGVyIHdpdGggdGhlIHVuY29tcHJlc3NlZAorICogaGVhZGVyIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFZKIGhlYWRlci4KKyAqLworaW50Cit2al91bmNvbXByZXNzX3RjcChzdHJ1Y3QgcGJ1ZiAqKm5iLCBzdHJ1Y3Qgdmpjb21wcmVzcyAqY29tcCkKK3sKKyAgdV9jaGFyICpjcDsKKyAgc3RydWN0IHRjcF9oZHIgKnRoOworICBzdHJ1Y3QgY3N0YXRlICpjczsKKyAgdV9zaG9ydCAqYnA7CisgIHN0cnVjdCBwYnVmICpuMCA9ICpuYjsKKyAgdTMyX3QgdG1wOworICB1X2ludCB2amxlbiwgaGxlbiwgY2hhbmdlczsKKworICBJTkNSKHZqc19jb21wcmVzc2VkaW4pOworICBjcCA9ICh1X2NoYXIgKiluMC0+cGF5bG9hZDsKKyAgY2hhbmdlcyA9ICpjcCsrOworICBpZiAoY2hhbmdlcyAmIE5FV19DKSB7CisgICAgLyogCisgICAgICogTWFrZSBzdXJlIHRoZSBzdGF0ZSBpbmRleCBpcyBpbiByYW5nZSwgdGhlbiBncmFiIHRoZSBzdGF0ZS4KKyAgICAgKiBJZiB3ZSBoYXZlIGEgZ29vZCBzdGF0ZSBpbmRleCwgY2xlYXIgdGhlICdkaXNjYXJkJyBmbGFnLiAKKyAgICAgKi8KKyAgICBpZiAoKmNwID49IE1BWF9TTE9UUykgeworICAgICAgUFBQREVCVUcoTE9HX0lORk8sICgidmpfdW5jb21wcmVzc190Y3A6IGJhZCBjaWQ9JWRcbiIsICpjcCkpOworICAgICAgZ290byBiYWQ7CisgICAgfQorCisgICAgY29tcC0+ZmxhZ3MgJj1+IFZKRl9UT1NTOworICAgIGNvbXAtPmxhc3RfcmVjdiA9ICpjcCsrOworICB9IGVsc2UgeworICAgIC8qIAorICAgICAqIHRoaXMgcGFja2V0IGhhcyBhbiBpbXBsaWNpdCBzdGF0ZSBpbmRleC4gIElmIHdlJ3ZlCisgICAgICogaGFkIGEgbGluZSBlcnJvciBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGdvdCBhbgorICAgICAqIGV4cGxpY2l0IHN0YXRlIGluZGV4LCB3ZSBoYXZlIHRvIHRvc3MgdGhlIHBhY2tldC4gCisgICAgICovCisgICAgaWYgKGNvbXAtPmZsYWdzICYgVkpGX1RPU1MpIHsKKyAgICAgIFBQUERFQlVHKExPR19JTkZPLCAoInZqX3VuY29tcHJlc3NfdGNwOiB0b3NzaW5nXG4iKSk7CisgICAgICBJTkNSKHZqc190b3NzZWQpOworICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICB9CisgIGNzID0gJmNvbXAtPnJzdGF0ZVtjb21wLT5sYXN0X3JlY3ZdOworICBobGVuID0gSVBIX0hMKCZjcy0+Y3NfaXApIDw8IDI7CisgIHRoID0gKHN0cnVjdCB0Y3BfaGRyICopJigodV9jaGFyICopJmNzLT5jc19pcClbaGxlbl07CisgIHRoLT5jaGtzdW0gPSBodG9ucygoKmNwIDw8IDgpIHwgY3BbMV0pOworICBjcCArPSAyOworICBpZiAoY2hhbmdlcyAmIFRDUF9QVVNIX0JJVCkgeworICAgIFRDUEhfU0VUX0ZMQUcodGgsIFRDUF9QU0gpOworICB9IGVsc2UgeworICAgIFRDUEhfVU5TRVRfRkxBRyh0aCwgVENQX1BTSCk7CisgIH0KKworICBzd2l0Y2ggKGNoYW5nZXMgJiBTUEVDSUFMU19NQVNLKSB7CisgIGNhc2UgU1BFQ0lBTF9JOgorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHUzMl90IGkgPSBudG9ocyhJUEhfTEVOKCZjcy0+Y3NfaXApKSAtIGNzLT5jc19obGVuOworICAgICAgLyogc29tZSBjb21waWxlcnMgY2FuJ3QgbmVzdCBpbmxpbmUgYXNzZW1ibGVyLi4gKi8KKyAgICAgIHRtcCA9IG50b2hsKHRoLT5hY2tubykgKyBpOworICAgICAgdGgtPmFja25vID0gaHRvbmwodG1wKTsKKyAgICAgIHRtcCA9IG50b2hsKHRoLT5zZXFubykgKyBpOworICAgICAgdGgtPnNlcW5vID0gaHRvbmwodG1wKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBTUEVDSUFMX0Q6CisgICAgLyogc29tZSBjb21waWxlcnMgY2FuJ3QgbmVzdCBpbmxpbmUgYXNzZW1ibGVyLi4gKi8KKyAgICB0bXAgPSBudG9obCh0aC0+c2Vxbm8pICsgbnRvaHMoSVBIX0xFTigmY3MtPmNzX2lwKSkgLSBjcy0+Y3NfaGxlbjsKKyAgICB0aC0+c2Vxbm8gPSBodG9ubCh0bXApOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgaWYgKGNoYW5nZXMgJiBORVdfVSkgeworICAgICAgVENQSF9TRVRfRkxBRyh0aCwgVENQX1VSRyk7CisgICAgICBERUNPREVVKHRoLT51cmdwKTsKKyAgICB9IGVsc2UgeworICAgICAgVENQSF9VTlNFVF9GTEFHKHRoLCBUQ1BfVVJHKTsKKyAgICB9CisgICAgaWYgKGNoYW5nZXMgJiBORVdfVykgeworICAgICAgREVDT0RFUyh0aC0+d25kKTsKKyAgICB9CisgICAgaWYgKGNoYW5nZXMgJiBORVdfQSkgeworICAgICAgREVDT0RFTCh0aC0+YWNrbm8pOworICAgIH0KKyAgICBpZiAoY2hhbmdlcyAmIE5FV19TKSB7CisgICAgICBERUNPREVMKHRoLT5zZXFubyk7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGlmIChjaGFuZ2VzICYgTkVXX0kpIHsKKyAgICBERUNPREVTKGNzLT5jc19pcC5faWQpOworICB9IGVsc2UgeworICAgIElQSF9JRF9TRVQoJmNzLT5jc19pcCwgbnRvaHMoSVBIX0lEKCZjcy0+Y3NfaXApKSArIDEpOworICAgIElQSF9JRF9TRVQoJmNzLT5jc19pcCwgaHRvbnMoSVBIX0lEKCZjcy0+Y3NfaXApKSk7CisgIH0KKworICAvKgorICAgKiBBdCB0aGlzIHBvaW50LCBjcCBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBpbiB0aGUKKyAgICogcGFja2V0LiAgRmlsbCBpbiB0aGUgSVAgdG90YWwgbGVuZ3RoIGFuZCB1cGRhdGUgdGhlIElQCisgICAqIGhlYWRlciBjaGVja3N1bS4KKyAgICovCisgIHZqbGVuID0gKHVfc2hvcnQpKGNwIC0gKHVfY2hhciopbjAtPnBheWxvYWQpOworICBpZiAobjAtPmxlbiA8IHZqbGVuKSB7CisgICAgLyogCisgICAgICogV2UgbXVzdCBoYXZlIGRyb3BwZWQgc29tZSBjaGFyYWN0ZXJzIChjcmMgc2hvdWxkIGRldGVjdAorICAgICAqIHRoaXMgYnV0IHRoZSBvbGQgc2xpcCBmcmFtaW5nIHdvbid0KSAKKyAgICAgKi8KKyAgICBQUFBERUJVRyhMT0dfSU5GTywgKCJ2al91bmNvbXByZXNzX3RjcDogaGVhZCBidWZmZXIgJWQgdG9vIHNob3J0ICVkXG4iLCAKKyAgICAgICAgICBuMC0+bGVuLCB2amxlbikpOworICAgIGdvdG8gYmFkOworICB9CisKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyAgdG1wID0gbjAtPnRvdF9sZW4gLSB2amxlbiArIGNzLT5jc19obGVuOworICBJUEhfTEVOX1NFVCgmY3MtPmNzX2lwLCBodG9ucygodV9zaG9ydCl0bXApKTsKKyNlbHNlCisgIElQSF9MRU5fU0VUKCZjcy0+Y3NfaXAsIGh0b25zKG4wLT50b3RfbGVuIC0gdmpsZW4gKyBjcy0+Y3NfaGxlbikpOworI2VuZGlmCisKKyAgLyogcmVjb21wdXRlIHRoZSBpcCBoZWFkZXIgY2hlY2tzdW0gKi8KKyAgYnAgPSAodV9zaG9ydCAqKSAmY3MtPmNzX2lwOworICBJUEhfQ0hLU1VNX1NFVCgmY3MtPmNzX2lwLCAwKTsKKyAgZm9yICh0bXAgPSAwOyBobGVuID4gMDsgaGxlbiAtPSAyKSB7CisgICAgdG1wICs9ICpicCsrOworICB9CisgIHRtcCA9ICh0bXAgJiAweGZmZmYpICsgKHRtcCA+PiAxNik7CisgIHRtcCA9ICh0bXAgJiAweGZmZmYpICsgKHRtcCA+PiAxNik7CisgIElQSF9DSEtTVU1fU0VUKCZjcy0+Y3NfaXAsICAodV9zaG9ydCkofnRtcCkpOworICAKKyAgLyogUmVtb3ZlIHRoZSBjb21wcmVzc2VkIGhlYWRlciBhbmQgcHJlcGVuZCB0aGUgdW5jb21wcmVzc2VkIGhlYWRlci4gKi8KKyAgaWYocGJ1Zl9oZWFkZXIobjAsIC0oKHMxNl90KSh2amxlbikpKSkgeworICAgIC8qIENhbiB3ZSBjb3BlIHdpdGggdGhpcyBmYWlsaW5nPyAgSnVzdCBhc3NlcnQgZm9yIG5vdyAqLworICAgIExXSVBfQVNTRVJUKCJwYnVmX2hlYWRlciBmYWlsZWRcbiIsIDApOworICAgIGdvdG8gYmFkOworICB9CisKKyAgaWYoTFdJUF9NRU1fQUxJR04objAtPnBheWxvYWQpICE9IG4wLT5wYXlsb2FkKSB7CisgICAgc3RydWN0IHBidWYgKm5wLCAqcTsKKyAgICB1OF90ICpidWZwdHI7CisKKyAgICBucCA9IHBidWZfYWxsb2MoUEJVRl9SQVcsIG4wLT5sZW4gKyBjcy0+Y3NfaGxlbiwgUEJVRl9QT09MKTsKKyAgICBpZighbnApIHsKKyAgICAgIFBQUERFQlVHKExPR19XQVJOSU5HLCAoInZqX3VuY29tcHJlc3NfdGNwOiByZWFsaWduIGZhaWxlZFxuIikpOworICAgICAgZ290byBiYWQ7CisgICAgfQorCisgICAgaWYocGJ1Zl9oZWFkZXIobnAsIC1jcy0+Y3NfaGxlbikpIHsKKyAgICAgIC8qIENhbiB3ZSBjb3BlIHdpdGggdGhpcyBmYWlsaW5nPyAgSnVzdCBhc3NlcnQgZm9yIG5vdyAqLworICAgICAgTFdJUF9BU1NFUlQoInBidWZfaGVhZGVyIGZhaWxlZFxuIiwgMCk7CisgICAgICBnb3RvIGJhZDsKKyAgICB9CisKKyAgICBidWZwdHIgPSBuMC0+cGF5bG9hZDsKKyAgICBmb3IocSA9IG5wOyBxICE9IE5VTEw7IHEgPSBxLT5uZXh0KSB7CisgICAgICBNRU1DUFkocS0+cGF5bG9hZCwgYnVmcHRyLCBxLT5sZW4pOworICAgICAgYnVmcHRyICs9IHEtPmxlbjsKKyAgICB9CisKKyAgICBpZihuMC0+bmV4dCkgeworICAgICAgcGJ1Zl9jaGFpbihucCwgbjAtPm5leHQpOworICAgICAgcGJ1Zl9kZWNoYWluKG4wKTsKKyAgICB9CisgICAgcGJ1Zl9mcmVlKG4wKTsKKyAgICBuMCA9IG5wOworICB9CisKKyAgaWYocGJ1Zl9oZWFkZXIobjAsIGNzLT5jc19obGVuKSkgeworICAgIHN0cnVjdCBwYnVmICpucDsKKworICAgIExXSVBfQVNTRVJUKCJ2al91bmNvbXByZXNzX3RjcDogY3MtPmNzX2hsZW4gPD0gUEJVRl9QT09MX0JVRlNJWkUiLCBjcy0+Y3NfaGxlbiA8PSBQQlVGX1BPT0xfQlVGU0laRSk7CisgICAgbnAgPSBwYnVmX2FsbG9jKFBCVUZfUkFXLCBjcy0+Y3NfaGxlbiwgUEJVRl9QT09MKTsKKyAgICBpZighbnApIHsKKyAgICAgIFBQUERFQlVHKExPR19XQVJOSU5HLCAoInZqX3VuY29tcHJlc3NfdGNwOiBwcmVwZW5kIGZhaWxlZFxuIikpOworICAgICAgZ290byBiYWQ7CisgICAgfQorICAgIHBidWZfY2F0KG5wLCBuMCk7CisgICAgbjAgPSBucDsKKyAgfQorICBMV0lQX0FTU0VSVCgibjAtPmxlbiA+PSBjcy0+Y3NfaGxlbiIsIG4wLT5sZW4gPj0gY3MtPmNzX2hsZW4pOworICBNRU1DUFkobjAtPnBheWxvYWQsICZjcy0+Y3NfaXAsIGNzLT5jc19obGVuKTsKKworICAqbmIgPSBuMDsKKworICByZXR1cm4gdmpsZW47CisKK2JhZDoKKyAgY29tcC0+ZmxhZ3MgfD0gVkpGX1RPU1M7CisgIElOQ1IodmpzX2Vycm9yaW4pOworICByZXR1cm4gKC0xKTsKK30KKworI2VuZGlmIC8qIFZKX1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIFBQUF9TVVBQT1JUICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3BwcC92ai5oIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvdmouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQxMjEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9wcHAvdmouaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciB0Y3AgY29tcHJlc3Npb24gcm91dGluZXMuCisgKgorICogJElkOiB2ai5oLHYgMS43IDIwMTAvMDIvMjIgMTc6NTI6MDkgZ29sZHNpbW9uIEV4cCAkCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIFZhbiBKYWNvYnNvbiAodmFuQGhlbGlvcy5lZS5sYmwuZ292KSwgRGVjIDMxLCAxOTg5OgorICogLSBJbml0aWFsIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFZKX0gKKyNkZWZpbmUgVkpfSAorCisjaW5jbHVkZSAibHdpcC9pcC5oIgorI2luY2x1ZGUgImx3aXAvdGNwX2ltcGwuaCIKKworI2RlZmluZSBNQVhfU0xPVFMgMTYgLyogbXVzdCBiZSA+IDIgYW5kIDwgMjU2ICovCisjZGVmaW5lIE1BWF9IRFIgICAxMjgKKworLyoKKyAqIENvbXByZXNzZWQgcGFja2V0IGZvcm1hdDoKKyAqCisgKiBUaGUgZmlyc3Qgb2N0ZXQgY29udGFpbnMgdGhlIHBhY2tldCB0eXBlICh0b3AgMyBiaXRzKSwgVENQCisgKiAncHVzaCcgYml0LCBhbmQgZmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGljaCBvZiB0aGUgNCBUQ1Agc2VxdWVuY2UKKyAqIG51bWJlcnMgaGF2ZSBjaGFuZ2VkIChib3R0b20gNSBiaXRzKS4gIFRoZSBuZXh0IG9jdGV0IGlzIGEKKyAqIGNvbnZlcnNhdGlvbiBudW1iZXIgdGhhdCBhc3NvY2lhdGVzIGEgc2F2ZWQgSVAvVENQIGhlYWRlciB3aXRoCisgKiB0aGUgY29tcHJlc3NlZCBwYWNrZXQuICBUaGUgbmV4dCB0d28gb2N0ZXRzIGFyZSB0aGUgVENQIGNoZWNrc3VtCisgKiBmcm9tIHRoZSBvcmlnaW5hbCBkYXRhZ3JhbS4gIFRoZSBuZXh0IDAgdG8gMTUgb2N0ZXRzIGFyZQorICogc2VxdWVuY2UgbnVtYmVyIGNoYW5nZXMsIG9uZSBjaGFuZ2UgcGVyIGJpdCBzZXQgaW4gdGhlIGhlYWRlcgorICogKHRoZXJlIG1heSBiZSBubyBjaGFuZ2VzIGFuZCB0aGVyZSBhcmUgdHdvIHNwZWNpYWwgY2FzZXMgd2hlcmUKKyAqIHRoZSByZWNlaXZlciBpbXBsaWNpdGx5IGtub3dzIHdoYXQgY2hhbmdlZCAtLSBzZWUgYmVsb3cpLgorICogCisgKiBUaGVyZSBhcmUgNSBudW1iZXJzIHdoaWNoIGNhbiBjaGFuZ2UgKHRoZXkgYXJlIGFsd2F5cyBpbnNlcnRlZAorICogaW4gdGhlIGZvbGxvd2luZyBvcmRlcik6IFRDUCB1cmdlbnQgcG9pbnRlciwgd2luZG93LAorICogYWNrbm93bGVnZW1lbnQsIHNlcXVlbmNlIG51bWJlciBhbmQgSVAgSUQuICAoVGhlIHVyZ2VudCBwb2ludGVyCisgKiBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXJzIGluIHRoYXQgaXRzIHZhbHVlIGlzIHNlbnQsIG5vdCB0aGUKKyAqIGNoYW5nZSBpbiB2YWx1ZS4pICBTaW5jZSB0eXBpY2FsIHVzZSBvZiBTTElQIGxpbmtzIGlzIGJpYXNlZAorICogdG93YXJkIHNtYWxsIHBhY2tldHMgKHNlZSBjb21tZW50cyBvbiBNVFUvTVNTIGJlbG93KSwgY2hhbmdlcworICogdXNlIGEgdmFyaWFibGUgbGVuZ3RoIGNvZGluZyB3aXRoIG9uZSBvY3RldCBmb3IgbnVtYmVycyBpbiB0aGUKKyAqIHJhbmdlIDEgLSAyNTUgYW5kIDMgb2N0ZXRzICgwLCBNU0IsIExTQikgZm9yIG51bWJlcnMgaW4gdGhlCisgKiByYW5nZSAyNTYgLSA2NTUzNSBvciAwLiAgKElmIHRoZSBjaGFuZ2UgaW4gc2VxdWVuY2UgbnVtYmVyIG9yCisgKiBhY2sgaXMgbW9yZSB0aGFuIDY1NTM1LCBhbiB1bmNvbXByZXNzZWQgcGFja2V0IGlzIHNlbnQuKQorICovCisKKy8qCisgKiBQYWNrZXQgdHlwZXMgKG11c3Qgbm90IGNvbmZsaWN0IHdpdGggSVAgcHJvdG9jb2wgdmVyc2lvbikKKyAqCisgKiBUaGUgdG9wIG5pYmJsZSBvZiB0aGUgZmlyc3Qgb2N0ZXQgaXMgdGhlIHBhY2tldCB0eXBlLiAgVGhlcmUgYXJlCisgKiB0aHJlZSBwb3NzaWJsZSB0eXBlczogSVAgKG5vdCBwcm90byBUQ1Agb3IgdGNwIHdpdGggb25lIG9mIHRoZQorICogY29udHJvbCBmbGFncyBzZXQpOyB1bmNvbXByZXNzZWQgVENQIChhIG5vcm1hbCBJUC9UQ1AgcGFja2V0IGJ1dAorICogd2l0aCB0aGUgOC1iaXQgcHJvdG9jb2wgZmllbGQgcmVwbGFjZWQgYnkgYW4gOC1iaXQgY29ubmVjdGlvbiBpZCAtLQorICogdGhpcyB0eXBlIG9mIHBhY2tldCBzeW5jcyB0aGUgc2VuZGVyICYgcmVjZWl2ZXIpOyBhbmQgY29tcHJlc3NlZAorICogVENQIChkZXNjcmliZWQgYWJvdmUpLgorICoKKyAqIExTQiBvZiA0LWJpdCBmaWVsZCBpcyBUQ1AgIlBVU0giIGJpdCAoYSB3b3J0aGxlc3MgYW5hY2hyb25pc20pIGFuZAorICogaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIDQtYml0ICJjaGFuZ2VzIiBmaWVsZCB0aGF0IGZvbGxvd3MuICBUb3AKKyAqIHRocmVlIGJpdHMgYXJlIGFjdHVhbCBwYWNrZXQgdHlwZS4gIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgKiBhbmQgaW4gdGhlIGludGVyZXN0IG9mIGNvbnNlcnZpbmcgYml0cywgbnVtYmVycyBhcmUgY2hvc2VuIHNvIHRoZQorICogSVAgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgKDQpIHdoaWNoIG5vcm1hbGx5IGFwcGVhcnMgaW4gdGhpcyBuaWJibGUKKyAqIG1lYW5zICJJUCBwYWNrZXQiLgorICovCisKKy8qIHBhY2tldCB0eXBlcyAqLworI2RlZmluZSBUWVBFX0lQICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBUWVBFX1VOQ09NUFJFU1NFRF9UQ1AgMHg3MAorI2RlZmluZSBUWVBFX0NPTVBSRVNTRURfVENQICAgMHg4MAorI2RlZmluZSBUWVBFX0VSUk9SICAgICAgICAgICAgMHgwMAorCisvKiBCaXRzIGluIGZpcnN0IG9jdGV0IG9mIGNvbXByZXNzZWQgcGFja2V0ICovCisjZGVmaW5lIE5FV19DIDB4NDAgLyogZmxhZyBiaXRzIGZvciB3aGF0IGNoYW5nZWQgaW4gYSBwYWNrZXQgKi8KKyNkZWZpbmUgTkVXX0kgMHgyMAorI2RlZmluZSBORVdfUyAweDA4CisjZGVmaW5lIE5FV19BIDB4MDQKKyNkZWZpbmUgTkVXX1cgMHgwMgorI2RlZmluZSBORVdfVSAweDAxCisKKy8qIHJlc2VydmVkLCBzcGVjaWFsLWNhc2UgdmFsdWVzIG9mIGFib3ZlICovCisjZGVmaW5lIFNQRUNJQUxfSSAoTkVXX1N8TkVXX1d8TkVXX1UpIC8qIGVjaG9lZCBpbnRlcmFjdGl2ZSB0cmFmZmljICovCisjZGVmaW5lIFNQRUNJQUxfRCAoTkVXX1N8TkVXX0F8TkVXX1d8TkVXX1UpIC8qIHVuaWRpcmVjdGlvbmFsIGRhdGEgKi8KKyNkZWZpbmUgU1BFQ0lBTFNfTUFTSyAoTkVXX1N8TkVXX0F8TkVXX1d8TkVXX1UpCisKKyNkZWZpbmUgVENQX1BVU0hfQklUIDB4MTAKKworCisvKgorICogInN0YXRlIiBkYXRhIGZvciBlYWNoIGFjdGl2ZSB0Y3AgY29udmVyc2F0aW9uIG9uIHRoZSB3aXJlLiAgVGhpcyBpcworICogYmFzaWNhbGx5IGEgY29weSBvZiB0aGUgZW50aXJlIElQL1RDUCBoZWFkZXIgZnJvbSB0aGUgbGFzdCBwYWNrZXQKKyAqIHdlIHNhdyBmcm9tIHRoZSBjb252ZXJzYXRpb24gdG9nZXRoZXIgd2l0aCBhIHNtYWxsIGlkZW50aWZpZXIKKyAqIHRoZSB0cmFuc21pdCAmIHJlY2VpdmUgZW5kcyBvZiB0aGUgbGluZSB1c2UgdG8gbG9jYXRlIHNhdmVkIGhlYWRlci4KKyAqLworc3RydWN0IGNzdGF0ZSB7CisgIHN0cnVjdCBjc3RhdGUgKmNzX25leHQ7IC8qIG5leHQgbW9zdCByZWNlbnRseSB1c2VkIHN0YXRlICh4bWl0IG9ubHkpICovCisgIHVfc2hvcnQgY3NfaGxlbjsgICAgICAgIC8qIHNpemUgb2YgaGRyIChyZWNlaXZlIG9ubHkpICovCisgIHVfY2hhciBjc19pZDsgICAgICAgICAgIC8qIGNvbm5lY3Rpb24gIyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZSAqLworICB1X2NoYXIgY3NfZmlsbGVyOworICB1bmlvbiB7CisgICAgY2hhciBjc3VfaGRyW01BWF9IRFJdOworICAgIHN0cnVjdCBpcF9oZHIgY3N1X2lwOyAgICAgLyogaXAvdGNwIGhkciBmcm9tIG1vc3QgcmVjZW50IHBhY2tldCAqLworICB9IHZqY3NfdTsKK307CisjZGVmaW5lIGNzX2lwIHZqY3NfdS5jc3VfaXAKKyNkZWZpbmUgY3NfaGRyIHZqY3NfdS5jc3VfaGRyCisKKworc3RydWN0IHZqc3RhdCB7CisgIHVuc2lnbmVkIGxvbmcgdmpzX3BhY2tldHM7ICAgICAgICAvKiBvdXRib3VuZCBwYWNrZXRzICovCisgIHVuc2lnbmVkIGxvbmcgdmpzX2NvbXByZXNzZWQ7ICAgICAvKiBvdXRib3VuZCBjb21wcmVzc2VkIHBhY2tldHMgKi8KKyAgdW5zaWduZWQgbG9uZyB2anNfc2VhcmNoZXM7ICAgICAgIC8qIHNlYXJjaGVzIGZvciBjb25uZWN0aW9uIHN0YXRlICovCisgIHVuc2lnbmVkIGxvbmcgdmpzX21pc3NlczsgICAgICAgICAvKiB0aW1lcyBjb3VsZG4ndCBmaW5kIGNvbm4uIHN0YXRlICovCisgIHVuc2lnbmVkIGxvbmcgdmpzX3VuY29tcHJlc3NlZGluOyAvKiBpbmJvdW5kIHVuY29tcHJlc3NlZCBwYWNrZXRzICovCisgIHVuc2lnbmVkIGxvbmcgdmpzX2NvbXByZXNzZWRpbjsgICAvKiBpbmJvdW5kIGNvbXByZXNzZWQgcGFja2V0cyAqLworICB1bnNpZ25lZCBsb25nIHZqc19lcnJvcmluOyAgICAgICAgLyogaW5ib3VuZCB1bmtub3duIHR5cGUgcGFja2V0cyAqLworICB1bnNpZ25lZCBsb25nIHZqc190b3NzZWQ7ICAgICAgICAgLyogaW5ib3VuZCBwYWNrZXRzIHRvc3NlZCBiZWNhdXNlIG9mIGVycm9yICovCit9OworCisvKgorICogYWxsIHRoZSBzdGF0ZSBkYXRhIGZvciBvbmUgc2VyaWFsIGxpbmUgKHdlIG5lZWQgb25lIG9mIHRoZXNlIHBlciBsaW5lKS4KKyAqLworc3RydWN0IHZqY29tcHJlc3MgeworICBzdHJ1Y3QgY3N0YXRlICpsYXN0X2NzOyAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHVzZWQgdHN0YXRlICovCisgIHVfY2hhciBsYXN0X3JlY3Y7ICAgICAgICAgICAgICAgIC8qIGxhc3QgcmN2ZCBjb25uLiBpZCAqLworICB1X2NoYXIgbGFzdF94bWl0OyAgICAgICAgICAgICAgICAvKiBsYXN0IHNlbnQgY29ubi4gaWQgKi8KKyAgdV9zaG9ydCBmbGFnczsKKyAgdV9jaGFyIG1heFNsb3RJbmRleDsKKyAgdV9jaGFyIGNvbXByZXNzU2xvdDsgICAgICAgICAgICAgLyogRmxhZyBpbmRpY2F0aW5nIE9LIHRvIGNvbXByZXNzIHNsb3QgSUQuICovCisjaWYgTElOS19TVEFUUworICBzdHJ1Y3QgdmpzdGF0IHN0YXRzOworI2VuZGlmCisgIHN0cnVjdCBjc3RhdGUgdHN0YXRlW01BWF9TTE9UU107IC8qIHhtaXQgY29ubmVjdGlvbiBzdGF0ZXMgKi8KKyAgc3RydWN0IGNzdGF0ZSByc3RhdGVbTUFYX1NMT1RTXTsgLyogcmVjZWl2ZSBjb25uZWN0aW9uIHN0YXRlcyAqLworfTsKKworLyogZmxhZyB2YWx1ZXMgKi8KKyNkZWZpbmUgVkpGX1RPU1MgMVUgLyogdG9zc2luZyByY3ZkIGZyYW1lcyBiZWNhdXNlIG9mIGlucHV0IGVyciAqLworCitleHRlcm4gdm9pZCAgdmpfY29tcHJlc3NfaW5pdCAgICAoc3RydWN0IHZqY29tcHJlc3MgKmNvbXApOworZXh0ZXJuIHVfaW50IHZqX2NvbXByZXNzX3RjcCAgICAgKHN0cnVjdCB2amNvbXByZXNzICpjb21wLCBzdHJ1Y3QgcGJ1ZiAqcGIpOworZXh0ZXJuIHZvaWQgIHZqX3VuY29tcHJlc3NfZXJyICAgKHN0cnVjdCB2amNvbXByZXNzICpjb21wKTsKK2V4dGVybiBpbnQgICB2al91bmNvbXByZXNzX3VuY29tcChzdHJ1Y3QgcGJ1ZiAqbmIsIHN0cnVjdCB2amNvbXByZXNzICpjb21wKTsKK2V4dGVybiBpbnQgICB2al91bmNvbXByZXNzX3RjcCAgIChzdHJ1Y3QgcGJ1ZiAqKm5iLCBzdHJ1Y3Qgdmpjb21wcmVzcyAqY29tcCk7CisKKyNlbmRpZiAvKiBWSl9IICovCmRpZmYgLS1naXQgYS9jb3JlL2x3aXAvc3JjL25ldGlmL3NsaXBpZi5jIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9zbGlwaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTkzMzNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sd2lwL3NyYy9uZXRpZi9zbGlwaWYuYwpAQCAtMCwwICsxLDM2NyBAQAorLyoqCisgKiBAZmlsZQorICogU0xJUCBJbnRlcmZhY2UKKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCisgKiBhcmUgbWV0OiAKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSAKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyAKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSAKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSAKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCAKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIAorICogU1VDSCBEQU1BR0UuIAorICoKKyAqIFRoaXMgZmlsZSBpcyBidWlsdCB1cG9uIHRoZSBmaWxlOiBzcmMvYXJjaC9ydHhjL25ldGlmL3Npb3NsaXAuYworICoKKyAqIEF1dGhvcjogTWFnbnVzIEl2YXJzc29uIDxtYWdudXMuaXZhcnNzb24oYXQpdm9sdm8uY29tPiAKKyAqLworCisvKiAKKyAqIFRoaXMgaXMgYW4gYXJjaCBpbmRlcGVuZGVudCBTTElQIG5ldGlmLiBUaGUgc3BlY2lmaWMgc2VyaWFsIGhvb2tzIG11c3QgYmUKKyAqIHByb3ZpZGVkIGJ5IGFub3RoZXIgZmlsZS4gVGhleSBhcmUgc2lvX29wZW4sIHNpb19yZWFkL3Npb190cnlyZWFkIGFuZCBzaW9fc2VuZAorICovCisKKyNpbmNsdWRlICJuZXRpZi9zbGlwaWYuaCIKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjaWYgTFdJUF9IQVZFX1NMSVBJRgorCisjaW5jbHVkZSAibHdpcC9kZWYuaCIKKyNpbmNsdWRlICJsd2lwL3BidWYuaCIKKyNpbmNsdWRlICJsd2lwL3N5cy5oIgorI2luY2x1ZGUgImx3aXAvc3RhdHMuaCIKKyNpbmNsdWRlICJsd2lwL3NubXAuaCIKKyNpbmNsdWRlICJsd2lwL3Npby5oIgorCisjZGVmaW5lIFNMSVBfQkxPQ0sgICAgIDEKKyNkZWZpbmUgU0xJUF9ET05UQkxPQ0sgMAorCisjZGVmaW5lIFNMSVBfRU5EICAgICAwMzAwIC8qIDB4QzAgKi8KKyNkZWZpbmUgU0xJUF9FU0MgICAgIDAzMzMgLyogMHhEQiAqLworI2RlZmluZSBTTElQX0VTQ19FTkQgMDMzNCAvKiAweERDICovCisjZGVmaW5lIFNMSVBfRVNDX0VTQyAwMzM1IC8qIDB4REQgKi8KKworI2RlZmluZSBTTElQX01BWF9TSVpFIDE1MDAKKworZW51bSBzbGlwaWZfcmVjdl9zdGF0ZSB7CisgICAgU0xJUF9SRUNWX05PUk1BTCwKKyAgICBTTElQX1JFQ1ZfRVNDQVBFLAorfTsKKworc3RydWN0IHNsaXBpZl9wcml2IHsKKyAgc2lvX2ZkX3Qgc2Q7CisgIC8qIHEgaXMgdGhlIHdob2xlIHBidWYgY2hhaW4gZm9yIGEgcGFja2V0LCBwIGlzIHRoZSBjdXJyZW50IHBidWYgaW4gdGhlIGNoYWluICovCisgIHN0cnVjdCBwYnVmICpwLCAqcTsKKyAgZW51bSBzbGlwaWZfcmVjdl9zdGF0ZSBzdGF0ZTsKKyAgdTE2X3QgaSwgcmVjdmVkOworfTsKKworLyoqCisgKiBTZW5kIGEgcGJ1ZiBkb2luZyB0aGUgbmVjZXNzYXJ5IFNMSVAgZW5jYXBzdWxhdGlvbgorICoKKyAqIFVzZXMgdGhlIHNlcmlhbCBsYXllcidzIHNpb19zZW5kKCkKKyAqCisgKiBAcGFyYW0gbmV0aWYgdGhlIGx3aXAgbmV0d29yayBpbnRlcmZhY2Ugc3RydWN0dXJlIGZvciB0aGlzIHNsaXBpZgorICogQHBhcmFtIHAgdGhlIHBidWYgY2hhaW5nIHBhY2tldCB0byBzZW5kCisgKiBAcGFyYW0gaXBhZGRyIHRoZSBpcCBhZGRyZXNzIHRvIHNlbmQgdGhlIHBhY2tldCB0byAobm90IHVzZWQgZm9yIHNsaXBpZikKKyAqIEByZXR1cm4gYWx3YXlzIHJldHVybnMgRVJSX09LIHNpbmNlIHRoZSBzZXJpYWwgbGF5ZXIgZG9lcyBub3QgcHJvdmlkZSByZXR1cm4gdmFsdWVzCisgKi8KK2Vycl90CitzbGlwaWZfb3V0cHV0KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwLCBpcF9hZGRyX3QgKmlwYWRkcikKK3sKKyAgc3RydWN0IHNsaXBpZl9wcml2ICpwcml2OworICBzdHJ1Y3QgcGJ1ZiAqcTsKKyAgdTE2X3QgaTsKKyAgdThfdCBjOworCisgIExXSVBfQVNTRVJUKCJuZXRpZiAhPSBOVUxMIiwgKG5ldGlmICE9IE5VTEwpKTsKKyAgTFdJUF9BU1NFUlQoIm5ldGlmLT5zdGF0ZSAhPSBOVUxMIiwgKG5ldGlmLT5zdGF0ZSAhPSBOVUxMKSk7CisgIExXSVBfQVNTRVJUKCJwICE9IE5VTEwiLCAocCAhPSBOVUxMKSk7CisKKyAgTFdJUF9VTlVTRURfQVJHKGlwYWRkcik7CisKKyAgcHJpdiA9IG5ldGlmLT5zdGF0ZTsKKworICAvKiBTZW5kIHBidWYgb3V0IG9uIHRoZSBzZXJpYWwgSS9PIGRldmljZS4gKi8KKyAgc2lvX3NlbmQoU0xJUF9FTkQsIHByaXYtPnNkKTsKKworICBmb3IgKHEgPSBwOyBxICE9IE5VTEw7IHEgPSBxLT5uZXh0KSB7CisgICAgZm9yIChpID0gMDsgaSA8IHEtPmxlbjsgaSsrKSB7CisgICAgICBjID0gKCh1OF90ICopcS0+cGF5bG9hZClbaV07CisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgU0xJUF9FTkQ6CisgICAgICAgIHNpb19zZW5kKFNMSVBfRVNDLCBwcml2LT5zZCk7CisgICAgICAgIHNpb19zZW5kKFNMSVBfRVNDX0VORCwgcHJpdi0+c2QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0xJUF9FU0M6CisgICAgICAgIHNpb19zZW5kKFNMSVBfRVNDLCBwcml2LT5zZCk7CisgICAgICAgIHNpb19zZW5kKFNMSVBfRVNDX0VTQywgcHJpdi0+c2QpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHNpb19zZW5kKGMsIHByaXYtPnNkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHNpb19zZW5kKFNMSVBfRU5ELCBwcml2LT5zZCk7CisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogU3RhdGljIGZ1bmN0aW9uIGZvciBlYXN5IHVzZSBvZiBibG9ja2lnIG9yIG5vbi1ibG9ja2luZworICogc2lvX3JlYWQKKyAqCisgKiBAcGFyYW0gZmQgc2VyaWFsIGRldmljZSBoYW5kbGUKKyAqIEBwYXJhbSBkYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIgZm9yIHJlY2VpdmluZworICogQHBhcmFtIGxlbiBtYXhpbXVtIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIGRhdGEgdG8gcmVjZWl2ZQorICogQHBhcmFtIGJsb2NrIGlmIDEsIGNhbGwgc2lvX3JlYWQ7IGlmIDAsIGNhbGwgc2lvX3RyeXJlYWQKKyAqIEByZXR1cm4gcmV0dXJuIHZhbHVlIG9mIHNpb19yZWFkIG9mIHNpb190cnlyZWFkCisgKi8KK3N0YXRpYyB1MzJfdAorc2xpcF9zaW9fcmVhZChzaW9fZmRfdCBmZCwgdThfdCogZGF0YSwgdTMyX3QgbGVuLCB1OF90IGJsb2NrKQoreworICBpZiAoYmxvY2spIHsKKyAgICByZXR1cm4gc2lvX3JlYWQoZmQsIGRhdGEsIGxlbik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHNpb190cnlyZWFkKGZkLCBkYXRhLCBsZW4pOworICB9Cit9CisKKy8qKgorICogSGFuZGxlIHRoZSBpbmNvbWluZyBTTElQIHN0cmVhbSBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyCisgKgorICogUG9sbCB0aGUgc2VyaWFsIGxheWVyIGJ5IGNhbGxpbmcgc2lvX3JlYWQoKSBvciBzaW9fdHJ5cmVhZCgpLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbHdpcCBuZXR3b3JrIGludGVyZmFjZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgc2xpcGlmCisgKiBAcGFyYW0gYmxvY2sgaWYgMSwgYmxvY2sgdW50aWwgZGF0YSBpcyByZWNlaXZlZDsgaWYgMCwgcmV0dXJuIHdoZW4gYWxsIGRhdGEKKyAqICAgICAgICBmcm9tIHRoZSBidWZmZXIgaXMgcmVjZWl2ZWQgKG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gd2lsbAorICogICAgICAgIHJldHVybiBhIGNvbXBsZXRlIHBhY2tldCwgTlVMTCBpcyByZXR1cm5lZCBiZWZvcmUgLSB1c2VkIGZvciBwb2xsaW5nKQorICogQHJldHVybiBUaGUgSVAgcGFja2V0IHdoZW4gU0xJUF9FTkQgaXMgcmVjZWl2ZWQKKyAqLworc3RhdGljIHN0cnVjdCBwYnVmICoKK3NsaXBpZl9pbnB1dChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCB1OF90IGJsb2NrKQoreworICBzdHJ1Y3Qgc2xpcGlmX3ByaXYgKnByaXY7CisgIHU4X3QgYzsKKyAgc3RydWN0IHBidWYgKnQ7CisKKyAgTFdJUF9BU1NFUlQoIm5ldGlmICE9IE5VTEwiLCAobmV0aWYgIT0gTlVMTCkpOworICBMV0lQX0FTU0VSVCgibmV0aWYtPnN0YXRlICE9IE5VTEwiLCAobmV0aWYtPnN0YXRlICE9IE5VTEwpKTsKKworICBwcml2ID0gbmV0aWYtPnN0YXRlOworCisgIHdoaWxlIChzbGlwX3Npb19yZWFkKHByaXYtPnNkLCAmYywgMSwgYmxvY2spID4gMCkgeworICAgIHN3aXRjaCAocHJpdi0+c3RhdGUpIHsKKyAgICBjYXNlIFNMSVBfUkVDVl9OT1JNQUw6CisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgU0xJUF9FTkQ6CisgICAgICAgIGlmIChwcml2LT5yZWN2ZWQgPiAwKSB7CisgICAgICAgICAgLyogUmVjZWl2ZWQgd2hvbGUgcGFja2V0LiAqLworICAgICAgICAgIC8qIFRyaW0gdGhlIHBidWYgdG8gdGhlIHNpemUgb2YgdGhlIHJlY2VpdmVkIHBhY2tldC4gKi8KKyAgICAgICAgICBwYnVmX3JlYWxsb2MocHJpdi0+cSwgcHJpdi0+cmVjdmVkKTsKKworICAgICAgICAgIExJTktfU1RBVFNfSU5DKGxpbmsucmVjdik7CisKKyAgICAgICAgICBMV0lQX0RFQlVHRihTTElQX0RFQlVHLCAoInNsaXBpZjogR290IHBhY2tldFxuIikpOworICAgICAgICAgIHQgPSBwcml2LT5xOworICAgICAgICAgIHByaXYtPnAgPSBwcml2LT5xID0gTlVMTDsKKyAgICAgICAgICBwcml2LT5pID0gcHJpdi0+cmVjdmVkID0gMDsKKyAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgU0xJUF9FU0M6CisgICAgICAgIHByaXYtPnN0YXRlID0gU0xJUF9SRUNWX0VTQ0FQRTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNMSVBfUkVDVl9FU0NBUEU6CisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgU0xJUF9FU0NfRU5EOgorICAgICAgICBjID0gU0xJUF9FTkQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTElQX0VTQ19FU0M6CisgICAgICAgIGMgPSBTTElQX0VTQzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwcml2LT5zdGF0ZSA9IFNMSVBfUkVDVl9OT1JNQUw7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIH0KKworICAgIC8qIGJ5dGUgcmVjZWl2ZWQsIHBhY2tldCBub3QgeWV0IGNvbXBsZXRlbHkgcmVjZWl2ZWQgKi8KKyAgICBpZiAocHJpdi0+cCA9PSBOVUxMKSB7CisgICAgICAvKiBhbGxvY2F0ZSBhIG5ldyBwYnVmICovCisgICAgICBMV0lQX0RFQlVHRihTTElQX0RFQlVHLCAoInNsaXBpZl9pbnB1dDogYWxsb2NcbiIpKTsKKyAgICAgIHByaXYtPnAgPSBwYnVmX2FsbG9jKFBCVUZfTElOSywgKFBCVUZfUE9PTF9CVUZTSVpFIC0gUEJVRl9MSU5LX0hMRU4pLCBQQlVGX1BPT0wpOworCisgICAgICBpZiAocHJpdi0+cCA9PSBOVUxMKSB7CisgICAgICAgIExJTktfU1RBVFNfSU5DKGxpbmsuZHJvcCk7CisgICAgICAgIExXSVBfREVCVUdGKFNMSVBfREVCVUcsICgic2xpcGlmX2lucHV0OiBubyBuZXcgcGJ1ZiEgKERST1ApXG4iKSk7CisgICAgICAgIC8qIGRvbid0IHByb2Nlc3MgYW55IGZ1cnRoZXIgc2luY2Ugd2UgZ290IG5vIHBidWYgdG8gcmVjZWl2ZSB0byAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHByaXYtPnEgIT0gTlVMTCkgeworICAgICAgICAvKiAnY2hhaW4nIHRoZSBwYnVmIHRvIHRoZSBleGlzdGluZyBjaGFpbiAqLworICAgICAgICBwYnVmX2NhdChwcml2LT5xLCBwcml2LT5wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHAgaXMgdGhlIGZpcnN0IHBidWYgaW4gdGhlIGNoYWluICovCisgICAgICAgIHByaXYtPnEgPSBwcml2LT5wOworICAgICAgfQorICAgIH0KKworICAgIC8qIHRoaXMgYXV0b21hdGljYWxseSBkcm9wcyBieXRlcyBpZiA+IFNMSVBfTUFYX1NJWkUgKi8KKyAgICBpZiAoKHByaXYtPnAgIT0gTlVMTCkgJiYgKHByaXYtPnJlY3ZlZCA8PSBTTElQX01BWF9TSVpFKSkgeworICAgICAgKCh1OF90ICopcHJpdi0+cC0+cGF5bG9hZClbcHJpdi0+aV0gPSBjOworICAgICAgcHJpdi0+cmVjdmVkKys7CisgICAgICBwcml2LT5pKys7CisgICAgICBpZiAocHJpdi0+aSA+PSBwcml2LT5wLT5sZW4pIHsKKyAgICAgICAgLyogb24gdG8gdGhlIG5leHQgcGJ1ZiAqLworICAgICAgICBwcml2LT5pID0gMDsKKyAgICAgICAgaWYgKHByaXYtPnAtPm5leHQgIT0gTlVMTCAmJiBwcml2LT5wLT5uZXh0LT5sZW4gPiAwKSB7CisgICAgICAgICAgLyogcCBpcyBhIGNoYWluLCBvbiB0byB0aGUgbmV4dCBpbiB0aGUgY2hhaW4gKi8KKyAgICAgICAgICAgIHByaXYtPnAgPSBwcml2LT5wLT5uZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIHAgaXMgYSBzaW5nbGUgcGJ1Ziwgc2V0IGl0IHRvIE5VTEwgc28gbmV4dCB0aW1lIGEgbmV3CisgICAgICAgICAgICogcGJ1ZiBpcyBhbGxvY2F0ZWQgKi8KKyAgICAgICAgICAgIHByaXYtPnAgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZiAhTk9fU1lTCisvKioKKyAqIFRoZSBTTElQIGlucHV0IHRocmVhZC4KKyAqCisgKiBGZWVkIHRoZSBJUCBsYXllciB3aXRoIGluY29taW5nIHBhY2tldHMKKyAqCisgKiBAcGFyYW0gbmYgdGhlIGx3aXAgbmV0d29yayBpbnRlcmZhY2Ugc3RydWN0dXJlIGZvciB0aGlzIHNsaXBpZgorICovCitzdGF0aWMgdm9pZAorc2xpcGlmX2xvb3BfdGhyZWFkKHZvaWQgKm5mKQoreworICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgc3RydWN0IG5ldGlmICpuZXRpZiA9IChzdHJ1Y3QgbmV0aWYgKiluZjsKKworICB3aGlsZSAoMSkgeworICAgIHAgPSBzbGlwaWZfaW5wdXQobmV0aWYsIFNMSVBfQkxPQ0spOworICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgIGlmIChuZXRpZi0+aW5wdXQocCwgbmV0aWYpICE9IEVSUl9PSykgeworICAgICAgICBwYnVmX2ZyZWUocCk7CisgICAgICAgIHAgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmIC8qICFOT19TWVMgKi8KKworLyoqCisgKiBTTElQIG5ldGlmIGluaXRpYWxpemF0aW9uCisgKgorICogQ2FsbCB0aGUgYXJjaCBzcGVjaWZpYyBzaW9fb3BlbiBhbmQgcmVtZW1iZXIKKyAqIHRoZSBvcGVuZWQgZGV2aWNlIGluIHRoZSBzdGF0ZSBmaWVsZCBvZiB0aGUgbmV0aWYuCisgKgorICogQHBhcmFtIG5ldGlmIHRoZSBsd2lwIG5ldHdvcmsgaW50ZXJmYWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBzbGlwaWYKKyAqIEByZXR1cm4gRVJSX09LIGlmIHNlcmlhbCBsaW5lIGNvdWxkIGJlIG9wZW5lZCwKKyAqICAgICAgICAgRVJSX01FTSBpZiBubyBtZW1vcnkgY291bGQgYmUgYWxsb2NhdGVkLAorICogICAgICAgICBFUlJfSUYgaXMgc2VyaWFsIGxpbmUgY291bGRuJ3QgYmUgb3BlbmVkCisgKgorICogQG5vdGUgbmV0aWYtPm51bSBtdXN0IGNvbnRhaW4gdGhlIG51bWJlciBvZiB0aGUgc2VyaWFsIHBvcnQgdG8gb3BlbgorICogICAgICAgKDAgYnkgZGVmYXVsdCkKKyAqLworZXJyX3QKK3NsaXBpZl9pbml0KHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHN0cnVjdCBzbGlwaWZfcHJpdiAqcHJpdjsKKworICBMV0lQX0RFQlVHRihTTElQX0RFQlVHLCAoInNsaXBpZl9pbml0OiBuZXRpZi0+bnVtPSUiVTE2X0YiXG4iLCAodTE2X3QpbmV0aWYtPm51bSkpOworCisgIC8qIEFsbG9jYXRlIHByaXZhdGUgZGF0YSAqLworICBwcml2ID0gbWVtX21hbGxvYyhzaXplb2Yoc3RydWN0IHNsaXBpZl9wcml2KSk7CisgIGlmICghcHJpdikgeworICAgIHJldHVybiBFUlJfTUVNOworICB9CisKKyAgbmV0aWYtPm5hbWVbMF0gPSAncyc7CisgIG5ldGlmLT5uYW1lWzFdID0gJ2wnOworICBuZXRpZi0+b3V0cHV0ID0gc2xpcGlmX291dHB1dDsKKyAgbmV0aWYtPm10dSA9IFNMSVBfTUFYX1NJWkU7CisgIG5ldGlmLT5mbGFncyB8PSBORVRJRl9GTEFHX1BPSU5UVE9QT0lOVDsKKworICAvKiBUcnkgdG8gb3BlbiB0aGUgc2VyaWFsIHBvcnQgKG5ldGlmLT5udW0gY29udGFpbnMgdGhlIHBvcnQgbnVtYmVyKS4gKi8KKyAgcHJpdi0+c2QgPSBzaW9fb3BlbihuZXRpZi0+bnVtKTsKKyAgaWYgKCFwcml2LT5zZCkgeworICAgIC8qIE9wZW5pbmcgdGhlIHNlcmlhbCBwb3J0IGZhaWxlZC4gKi8KKyAgICBtZW1fZnJlZShwcml2KTsKKyAgICByZXR1cm4gRVJSX0lGOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KKyAgcHJpdi0+cCA9IE5VTEw7CisgIHByaXYtPnEgPSBOVUxMOworICBwcml2LT5zdGF0ZSA9IFNMSVBfUkVDVl9OT1JNQUw7CisgIHByaXYtPmkgPSAwOworICBwcml2LT5yZWN2ZWQgPSAwOworCisgIG5ldGlmLT5zdGF0ZSA9IHByaXY7CisKKyAgLyogaW5pdGlhbGl6ZSB0aGUgc25tcCB2YXJpYWJsZXMgYW5kIGNvdW50ZXJzIGluc2lkZSB0aGUgc3RydWN0IG5ldGlmCisgICAqIGlmU3BlZWQ6IG5vIGFzc3VtcHRpb24gY2FuIGJlIG1hZGUgd2l0aG91dCBrbm93aW5nIG1vcmUgYWJvdXQgdGhlCisgICAqIHNlcmlhbCBsaW5lIQorICAgKi8KKyAgTkVUSUZfSU5JVF9TTk1QKG5ldGlmLCBzbm1wX2lmVHlwZV9zbGlwLCAwKTsKKworICAvKiBDcmVhdGUgYSB0aHJlYWQgdG8gcG9sbCB0aGUgc2VyaWFsIGxpbmUuICovCisgIHN5c190aHJlYWRfbmV3KFNMSVBJRl9USFJFQURfTkFNRSwgc2xpcGlmX2xvb3BfdGhyZWFkLCBuZXRpZiwKKyAgICBTTElQSUZfVEhSRUFEX1NUQUNLU0laRSwgU0xJUElGX1RIUkVBRF9QUklPKTsKKyAgcmV0dXJuIEVSUl9PSzsKK30KKworLyoqCisgKiBQb2xscyB0aGUgc2VyaWFsIGRldmljZSBhbmQgZmVlZHMgdGhlIElQIGxheWVyIHdpdGggaW5jb21pbmcgcGFja2V0cy4KKyAqCisgKiBAcGFyYW0gbmV0aWYgVGhlIGx3aXAgbmV0d29yayBpbnRlcmZhY2Ugc3RydWN0dXJlIGZvciB0aGlzIHNsaXBpZgorICovCit2b2lkCitzbGlwaWZfcG9sbChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgc3RydWN0IHNsaXBpZl9wcml2ICpwcml2OworCisgIExXSVBfQVNTRVJUKCJuZXRpZiAhPSBOVUxMIiwgKG5ldGlmICE9IE5VTEwpKTsKKyAgTFdJUF9BU1NFUlQoIm5ldGlmLT5zdGF0ZSAhPSBOVUxMIiwgKG5ldGlmLT5zdGF0ZSAhPSBOVUxMKSk7CisKKyAgcHJpdiA9IG5ldGlmLT5zdGF0ZTsKKworICB3aGlsZSAoKHAgPSBzbGlwaWZfaW5wdXQobmV0aWYsIFNMSVBfRE9OVEJMT0NLKSkgIT0gTlVMTCkgeworICAgIGlmIChuZXRpZi0+aW5wdXQocCwgbmV0aWYpICE9IEVSUl9PSykgeworICAgICAgcGJ1Zl9mcmVlKHApOworICAgIH0KKyAgfQorfQorCisjZW5kaWYgLyogTFdJUF9IQVZFX1NMSVBJRiAqLwpkaWZmIC0tZ2l0IGEvY29yZS9sd2lwL3NyYy9uZXRpZi91bmRpaWYuYyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvdW5kaWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyYTk4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHdpcC9zcmMvbmV0aWYvdW5kaWlmLmMKQEAgLTAsMCArMSwxNjA3IEBACisvKioKKyAqIEBmaWxlCisgKiBFdGhlcm5ldCBJbnRlcmZhY2UgU2tlbGV0b24KKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx3SVAgVENQL0lQIHN0YWNrLgorICoKKyAqIEF1dGhvcjogQWRhbSBEdW5rZWxzIDxhZGFtQHNpY3Muc2U+CisgKiBBdXRob3I6IEguIFBldGVyIEFudmluIDxocGFAQHp5dG9yLmNvbT4KKyAqIEF1dGhvcjogRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhIHNrZWxldG9uIGZvciBkZXZlbG9waW5nIEV0aGVybmV0IG5ldHdvcmsgaW50ZXJmYWNlCisgKiBkcml2ZXJzIGZvciBsd0lQLiBBZGQgY29kZSB0byB0aGUgbG93X2xldmVsIGZ1bmN0aW9ucyBhbmQgZG8gYQorICogc2VhcmNoLWFuZC1yZXBsYWNlIGZvciB0aGUgd29yZCAiZXRoZXJuZXRpZiIgdG8gcmVwbGFjZSBpdCB3aXRoCisgKiBzb21ldGhpbmcgdGhhdCBiZXR0ZXIgZGVzY3JpYmVzIHlvdXIgbmV0d29yayBpbnRlcmZhY2UuCisgKi8KKworLyogb3RoZXIgaGVhZGVycyBpbmNsdWRlIGRlcHJpbnRmLmggdG9vIGVhcmx5ICovCisjZGVmaW5lIFVORElJRl9JRF9GVUxMX0RFQlVHIChVTkRJSUZfSURfREVCVUcgfCBVTkRJSUZfREVCVUcpCisKKyNpZiBVTkRJSUZfSURfRlVMTF9ERUJVRworIyBpZm5kZWYgREVCVUcKKyMgIGRlZmluZSBERUJVRyAxCisjIGVuZGlmCisjIGlmbmRlZiBERUJVR19QT1JUCisjICBkZWZpbmUgREVCVUdfUE9SVCAweDNmOAorIyBlbmRpZgorI2VuZGlmIC8qIFVORElJRl9JRF9GVUxMX0RFQlVHICovCisKKyNpbmNsdWRlIDxjb3JlLmg+CisKKyNpbmNsdWRlICJsd2lwL29wdC5oIgorCisjZGVmaW5lIExXSVBfVU5ESUlGX0RCRyhkZWJ1ZykgXAorICAgICggKChkZWJ1ZykgJiBMV0lQX0RCR19PTikgJiYgXAorICAgICAgKChkZWJ1ZykgJiBMV0lQX0RCR19UWVBFU19PTikgJiYgXAorICAgICAgKCgoZGVidWcpICYgTFdJUF9EQkdfTUFTS19MRVZFTCkgPj0gTFdJUF9EQkdfTUlOX0xFVkVMKSApCisKKyNpbmNsdWRlICJsd2lwL2RlZi5oIgorI2luY2x1ZGUgImx3aXAvbWVtLmgiCisjaW5jbHVkZSAibHdpcC9wYnVmLmgiCisjaW5jbHVkZSAibHdpcC9zeXMuaCIKKyNpbmNsdWRlIDxsd2lwL3N0YXRzLmg+CisjaW5jbHVkZSA8bHdpcC9zbm1wLmg+CisjaW5jbHVkZSAibmV0aWYvZXRoYXJwLmgiCisjaW5jbHVkZSAibmV0aWYvcHBwX29lLmgiCisjaW5jbHVkZSAibHdpcC9uZXRpZmFwaS5oIgorI2luY2x1ZGUgImx3aXAvdGNwaXAuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9mcy9weGUvcHhlLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZV9hcGkuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisKKy8qIGRlYnVnIGV4dHJhcyAqLworI2luY2x1ZGUgImlwdjQvbHdpcC9pY21wLmgiCisjaW5jbHVkZSAibHdpcC90Y3BfaW1wbC5oIgorI2luY2x1ZGUgImx3aXAvdWRwLmgiCisKKyNpZiBMV0lQX0FVVE9JUAorI2Vycm9yICJBVVRPSVAgbm90IHN1cHBvcnRlZCIKKyNlbmRpZgorI2lmIEVUSF9QQURfU0laRQorI2Vycm9yICJFVEhfUEFEX1NJWkUgbm90IHN1cHBvcnRlZCIKKyNlbmRpZgorI2lmIE5FVElGX01BWF9IV0FERFJfTEVOICE9IE1BQ19NQVgKKyNlcnJvciAiaHdhZGRyX2xlbiBtaXNtYXRjaCIKKyNlbmRpZgorCisvKiogdGhlIHRpbWUgYW4gQVJQIGVudHJ5IHN0YXlzIHZhbGlkIGFmdGVyIGl0cyBsYXN0IHVwZGF0ZSwKKyAqICBmb3IgQVJQX1RNUl9JTlRFUlZBTCA9IDUwMDAsIHRoaXMgaXMKKyAqICAoMjQwICogNSkgc2Vjb25kcyA9IDIwIG1pbnV0ZXMuCisgKi8KKyNkZWZpbmUgVU5ESUFSUF9NQVhBR0UgMjQwCisvKiogdGhlIHRpbWUgYW4gQVJQIGVudHJ5IHN0YXlzIHBlbmRpbmcgYWZ0ZXIgZmlyc3QgcmVxdWVzdCwKKyAqICBmb3IgQVJQX1RNUl9JTlRFUlZBTCA9IDUwMDAsIHRoaXMgaXMKKyAqICAoMiAqIDUpIHNlY29uZHMgPSAxMCBzZWNvbmRzLgorICogCisgKiAgQGludGVybmFsIEtlZXAgdGhpcyBudW1iZXIgYXQgbGVhc3QgMiwgb3RoZXJ3aXNlIGl0IG1pZ2h0CisgKiAgcnVuIG91dCBpbnN0YW50bHkgaWYgdGhlIHRpbWVvdXQgb2NjdXJzIGRpcmVjdGx5IGFmdGVyIGEgcmVxdWVzdC4KKyAqLworI2RlZmluZSBVTkRJQVJQX01BWFBFTkRJTkcgMgorCit0eXBlZGVmIHU4X3QgaHdhZGRyX3RbTkVUSUZfTUFYX0hXQUREUl9MRU5dOworCisjaWZkZWYgUEFDS19TVFJVQ1RfVVNFX0lOQ0xVREVTCisjICBpbmNsdWRlICJhcmNoL2Jwc3RydWN0LmgiCisjZW5kaWYKK1BBQ0tfU1RSVUNUX0JFR0lOCisvKiogdGhlIEFSUCBtZXNzYWdlICovCitzdHJ1Y3QgYXJwX2hkciB7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IGh3dHlwZSk7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IHByb3RvKTsKKyAgUEFDS19TVFJVQ1RfRklFTEQodThfdCAgaHdsZW4pOworICBQQUNLX1NUUlVDVF9GSUVMRCh1OF90ICBwcm90b2xlbik7CisgIFBBQ0tfU1RSVUNUX0ZJRUxEKHUxNl90IG9wY29kZSk7Cit9IFBBQ0tfU1RSVUNUX1NUUlVDVDsKK1BBQ0tfU1RSVUNUX0VORAorI2lmZGVmIFBBQ0tfU1RSVUNUX1VTRV9JTkNMVURFUworIyAgaW5jbHVkZSAiYXJjaC9lcHN0cnVjdC5oIgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IGFycF9oZHJfbGVuKHN0cnVjdCBuZXRpZiAqbmV0aWYpCit7CisgIHJldHVybiBzaXplb2Yoc3RydWN0IGFycF9oZHIpICsgKG5ldGlmLT5od2FkZHJfbGVuICsgc2l6ZW9mKHVpbnQzMl90KSkqMjsKK30KKworZW51bSB1bmRpYXJwX3N0YXRlIHsKKyAgVU5ESUFSUF9TVEFURV9FTVBUWSA9IDAsCisgIFVORElBUlBfU1RBVEVfUEVORElORywKKyAgVU5ESUFSUF9TVEFURV9TVEFCTEUKK307CisKK3N0cnVjdCB1bmRpYXJwX2VudHJ5IHsKKyNpZiBBUlBfUVVFVUVJTkcKKyAgLyoqIAorICAgKiBQb2ludGVyIHRvIHF1ZXVlIG9mIHBlbmRpbmcgb3V0Z29pbmcgcGFja2V0cyBvbiB0aGlzIEFSUCBlbnRyeS4KKyAgICovCisgIHN0cnVjdCBldGhhcnBfcV9lbnRyeSAqcTsKKyNlbmRpZgorICBzdHJ1Y3QgaXBfYWRkciBpcGFkZHI7CisgIHU4X3QgaHdhZGRyW05FVElGX01BWF9IV0FERFJfTEVOXTsKKyAgZW51bSB1bmRpYXJwX3N0YXRlIHN0YXRlOworICB1OF90IGN0aW1lOworICBzdHJ1Y3QgbmV0aWYgKm5ldGlmOworfTsKKworI2RlZmluZSBQS1RCVUZfU0laRQkyMDQ4CisKKy8qIERlZmluZSB0aG9zZSB0byBiZXR0ZXIgZGVzY3JpYmUgeW91ciBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgSUZOQU1FMCAndScKKyNkZWZpbmUgSUZOQU1FMSAnbicKKworc3RhdGljIHN0cnVjdCBuZXRpZiB1bmRpX25ldGlmOworc3RhdGljIHN0cnVjdCB1bmRpYXJwX2VudHJ5IGFycF90YWJsZVtBUlBfVEFCTEVfU0laRV07CisjaWYgIUxXSVBfTkVUSUZfSFdBRERSSElOVAorc3RhdGljIHU4X3QgdW5kaWFycF9jYWNoZWRfZW50cnk7CisjZW5kaWYKKworLyoqCisgKiBUcnkgaGFyZCB0byBjcmVhdGUgYSBuZXcgZW50cnkgLSB3ZSB3YW50IHRoZSBJUCBhZGRyZXNzIHRvIGFwcGVhciBpbgorICogdGhlIGNhY2hlIChldmVuIGlmIHRoaXMgbWVhbnMgcmVtb3ZpbmcgYW4gYWN0aXZlIGVudHJ5IG9yIHNvKS4gKi8KKyNkZWZpbmUgVU5ESUFSUF9UUllfSEFSRCAxCisjZGVmaW5lIFVORElBUlBfRklORF9PTkxZICAyCisKKyNkZWZpbmUgVU5JRElGX0lEX1NUUkxFTiAzMDAKKworCitzdGF0aWMgaW5saW5lIGJvb2wgdW5kaV9pc19ldGhlcm5ldChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICAgKHZvaWQpbmV0aWY7CisgICByZXR1cm4gTUFDX3R5cGUgPT0gRVRIRVJfVFlQRTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHByaW50X3BidWYoc3RydWN0IHBidWYgKnApCit7CisgICBzdHJ1Y3QgcGJ1ZiAqcTsKKyAgIGludCBvZmY7CisKKyAgIGZvciggb2ZmID0gMCwgcSA9IHA7IHEgIT0gTlVMTDsgcSA9IHEtPm5leHQpIHsKKyAgICAgICB1bnNpZ25lZCBjaGFyICpieXRlLCAqZW5kOworICAgICAgIGJ5dGUgPSBxLT5wYXlsb2FkOworICAgICAgIGVuZCA9IGJ5dGUgKyBxLT5sZW47CisgICAgICAgZm9yICg7IGJ5dGUgPCBlbmQ7IGJ5dGUrKywgb2ZmKysgKSB7CisJICAgaWYgKChvZmYgJiAweGYpID09IDApIHsKKwkgICAgICAgcHJpbnRmKCIlMDR4OiAiLCBvZmYpOworCSAgIH0KKwkgICBwcmludGYoIiUwMnggIiwgKmJ5dGUpOworCSAgIGlmICgob2ZmICYgMHhmKSA9PSAweGYpIHsKKwkgICAgICAgcHJpbnRmKCJcbiIpOworCSAgIH0KKyAgICAgICB9CisgICB9CisgICBwcmludGYoIlxuIik7Cit9CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyB2b2lkIHByaW50X2FycF9wYnVmKHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwKQoreworICBzdHJ1Y3QgYXJwX2hkciAqaGRyOworICB1OF90ICpoZHJfcHRyOworICBpbnQgaTsKKworICBoZHIgPSBwLT5wYXlsb2FkOworICBoZHJfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikoaGRyICsgMSk7CisgIC8qIEZpeGVkIGZpZWxkcyAqLworICBwcmludGYoImFycDogJTA0eCAlMDR4ICUwNHggJTA0eCAiLAorCSAgaGRyLT5od3R5cGUsCisJICBoZHItPnByb3RvLAorCSAgaGRyLT5faHdsZW5fcHJvdG9sZW4pOworICAvKiBTb3VyY2UgaGFyZHdhcmUgYWRkcmVzcyAqLworICBmb3IoaSA9IDA7IGkgPCBuZXRpZi0+aHdhZGRyX2xlbjsgaSsrLCBoZHJfcHRyKyspIHsKKyAgICBwcmludGYoIiUwMnglYyIsICpoZHJfcHRyLChpICsxKSA9PSBuZXRpZi0+aHdhZGRyX2xlbj8nICc6JzonKTsKKyAgfQorICAvKiBTb3VyY2UgaXAgYWRkcmVzcyAqLworICBwcmludGYoIiVkLiVkLiVkLiVkICIsIGhkcl9wdHJbMF0sIGhkcl9wdHJbMV0sIGhkcl9wdHJbMl0sIGhkcl9wdHJbM10pOworICBoZHJfcHRyICs9IDQ7CisgIC8qIERlc3RpbmF0aW9uIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyAgZm9yKGkgPSAwOyBpIDwgbmV0aWYtPmh3YWRkcl9sZW47IGkrKywgaGRyX3B0cisrKSB7CisgICAgcHJpbnRmKCIlMDJ4JWMiLCAqaGRyX3B0ciwgKGkgKzEpID09IG5ldGlmLT5od2FkZHJfbGVuPycgJzonOicpOworICB9CisgIC8qIERlc3RpbmF0aW9uIGlwIGFkZHJlc3MgKi8KKyAgcHJpbnRmKCIlZC4lZC4lZC4lZCAiLCBoZHJfcHRyWzBdLCBoZHJfcHRyWzFdLCBoZHJfcHRyWzJdLCBoZHJfcHRyWzNdKTsKKyAgaGRyX3B0ciArPSA0OworfQorI2VuZGlmCisKKyNpZiBMV0lQX1VORElJRl9EQkcoVU5ESUlGX0lEX0ZVTExfREVCVUcpCitpbnQgc25wcmludGZfZXRoX2hkcihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjaGFyIGhlYWRbXSwKKwkJICAgICBzdHJ1Y3QgZXRoX2hkciAqZXRoaGRyLCBjaGFyIGRpciwgY2hhciBzdGF0dXMsCisJCSAgICAgY2hhciB0YWlsW10pCit7CisgIHU4X3QgKmQgPSBldGhoZHItPmRlc3QuYWRkcjsKKyAgdThfdCAqcyA9IGV0aGhkci0+c3JjLmFkZHI7CisgIHJldHVybiBzbnByaW50ZihzdHIsIHNpemUsCisJCSIlczogZDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKwkJIiBzOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorCQkiIHQ6JTRoeCAlYyVjJXNcbiIsIGhlYWQsCisJCWRbMF0sIGRbMV0sIGRbMl0sIGRbM10sIGRbNF0sIGRbNV0sCisJCXNbMF0sIHNbMV0sIHNbMl0sIHNbM10sIHNbNF0sIHNbNV0sCisJCSh1bnNpZ25lZClodG9ucyhldGhoZHItPnR5cGUpLAorCQlkaXIsIHN0YXR1cywgdGFpbCk7Cit9CisKK2ludCBzbnByaW50Zl9hcnBfaGRyKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNoYXIgaGVhZFtdLAorCQkgICAgICBzdHJ1Y3QgZXRoX2hkciAqZXRoaGRyLCBjaGFyIGRpciwKKwkJICAgICAgY2hhciBzdGF0dXMsIGNoYXIgdGFpbFtdKQoreworICBzdHJ1Y3QgZXRoYXJwX2hkciAqYXJwaGRyOworICB1OF90ICpkLCAqczsKKyAgc3RydWN0IGlwX2FkZHIgKnNpcCwgKmRpcDsKKyAgaWYgKG50b2hzKGV0aGhkci0+dHlwZSkgPT0gRVRIVFlQRV9BUlApIHsKKyAgICBhcnBoZHIgPSAoc3RydWN0IGV0aGFycF9oZHIgKikoKHZvaWQgKilldGhoZHIgKyAxNCk7CisgICAgZCA9IGFycGhkci0+ZGh3YWRkci5hZGRyOworICAgIHMgPSBhcnBoZHItPnNod2FkZHIuYWRkcjsKKyAgICBzaXAgPSAoc3RydWN0IGlwX2FkZHIgKikgJihhcnBoZHItPnNpcGFkZHIpOworICAgIGRpcCA9IChzdHJ1Y3QgaXBfYWRkciAqKSAmKGFycGhkci0+ZGlwYWRkcik7CisgICAgcmV0dXJuIHNucHJpbnRmKHN0ciwgc2l6ZSwKKwkJIiVzOiBzOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorCQkiICUzZC4lM2QuJTNkLiUzZCIKKwkJIiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKwkJIiAlM2QuJTNkLiUzZC4lM2QiCisJCSIgJWMlYyVzXG4iLCBoZWFkLAorCQlzWzBdLCBzWzFdLCBzWzJdLCBzWzNdLCBzWzRdLCBzWzVdLAorCQlpcDRfYWRkcjEoc2lwKSwgaXA0X2FkZHIyKHNpcCksCisJCWlwNF9hZGRyMyhzaXApLCBpcDRfYWRkcjQoc2lwKSwKKwkJZFswXSwgZFsxXSwgZFsyXSwgZFszXSwgZFs0XSwgZFs1XSwKKwkJaXA0X2FkZHIxKGRpcCksIGlwNF9hZGRyMihkaXApLAorCQlpcDRfYWRkcjMoZGlwKSwgaXA0X2FkZHI0KGRpcCksCisJCWRpciwgc3RhdHVzLCB0YWlsKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorIAoraW50IHNucHJpbnRmX2lwX2hkcihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjaGFyIGhlYWRbXSwKKwkJICAgICBzdHJ1Y3QgZXRoX2hkciAqZXRoaGRyLCBjaGFyIGRpciwKKwkJICAgICBjaGFyIHN0YXR1cywgY2hhciB0YWlsW10pCit7CisgIHN0cnVjdCBpcF9oZHIgKmlwaGRyOworICBpZiAobnRvaHMoZXRoaGRyLT50eXBlKSA9PSBFVEhUWVBFX0lQKSB7CisgICAgaXBoZHIgPSAoc3RydWN0IGlwX2hkciAqKSgodm9pZCAqKWV0aGhkciArIDE0KTsKKyAgICByZXR1cm4gc25wcmludGYoc3RyLCBzaXplLAorCQkgIiVzOiBzOiUzZC4lM2QuJTNkLiUzZCAlM2QuJTNkLiUzZC4lM2QgbDolNWQiCisJCSAiIGk6JTA0eCBwOiUwNHggYzolMDR4IGhsOiUzZCIKKwkJICIgJWMlYyVzXG4iLCBoZWFkLAorCQkgIGlwNF9hZGRyMSgmaXBoZHItPnNyYyksIGlwNF9hZGRyMigmaXBoZHItPnNyYyksCisJCSAgaXA0X2FkZHIzKCZpcGhkci0+c3JjKSwgaXA0X2FkZHI0KCZpcGhkci0+c3JjKSwKKwkJICBpcDRfYWRkcjEoJmlwaGRyLT5kZXN0KSwgaXA0X2FkZHIyKCZpcGhkci0+ZGVzdCksCisJCSAgaXA0X2FkZHIzKCZpcGhkci0+ZGVzdCksIGlwNF9hZGRyNCgmaXBoZHItPmRlc3QpLAorCQkgIG50b2hzKElQSF9MRU4oaXBoZHIpKSwgbnRvaHMoSVBIX0lEKGlwaGRyKSksCisJCSAgSVBIX1BST1RPKGlwaGRyKSwgbnRvaHMoSVBIX0NIS1NVTShpcGhkcikpLAorCQkgIChJUEhfSEwoaXBoZHIpIDw8IDIpLAorCQkgIGRpciwgc3RhdHVzLCB0YWlsKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitpbnQgc25wcmludGZfaWNtcF9oZHIoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY2hhciBoZWFkW10sCisJCSAgICAgICBzdHJ1Y3QgZXRoX2hkciAqZXRoaGRyLCBjaGFyIGRpciwKKwkJICAgICAgIGNoYXIgc3RhdHVzLCBjaGFyIHRhaWxbXSkKK3sKKyAgc3RydWN0IGlwX2hkciAqaXBoZHI7CisgIHN0cnVjdCBpY21wX2VjaG9faGRyICppY21waGRyOworICBpZiAobnRvaHMoZXRoaGRyLT50eXBlKSA9PSBFVEhUWVBFX0lQKSB7CisgICAgaXBoZHIgPSAoc3RydWN0IGlwX2hkciAqKSgodm9pZCAqKWV0aGhkciArIDE0KTsKKyAgICBpZiAoSVBIX1BST1RPKGlwaGRyKSA9PSBJUF9QUk9UT19JQ01QKSB7CisgICAgICBpY21waGRyID0gKHN0cnVjdCBpY21wX2VjaG9faGRyICopKCh2b2lkICopaXBoZHIgKyAoSVBIX0hMKGlwaGRyKSA8PCAyKSk7CisgICAgICByZXR1cm4gc25wcmludGYoc3RyLCBzaXplLAorCQkgIiVzOiB0OiUwMnggYzolMDJ4IGs6JTA0eCIKKwkJICAgIiBpOiUwNHggczolMDR4ICIKKwkJICAgIiAlYyVjJXNcbiIsIGhlYWQsCisJCSAgIGljbXBoZHItPnR5cGUsIGljbXBoZHItPmNvZGUsIG50b2hzKGljbXBoZHItPmNoa3N1bSksCisJCSAgIG50b2hzKGljbXBoZHItPmlkKSwgbnRvaHMoaWNtcGhkci0+c2Vxbm8pLAorCQkgICAgZGlyLCBzdGF0dXMsIHRhaWwpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKyAKK2ludCBzbnByaW50Zl90Y3BfaGRyKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNoYXIgaGVhZFtdLAorCQkgICAgIHN0cnVjdCBldGhfaGRyICpldGhoZHIsIGNoYXIgZGlyLAorCQkgICAgIGNoYXIgc3RhdHVzLCBjaGFyIHRhaWxbXSkKK3sKKyAgc3RydWN0IGlwX2hkciAqaXBoZHI7CisgIHN0cnVjdCB0Y3BfaGRyICp0Y3BoZHI7CisgIGlmIChudG9ocyhldGhoZHItPnR5cGUpID09IEVUSFRZUEVfSVApIHsKKyAgICBpcGhkciA9IChzdHJ1Y3QgaXBfaGRyICopKCh2b2lkICopZXRoaGRyICsgMTQpOworICAgIGlmIChJUEhfUFJPVE8oaXBoZHIpID09IElQX1BST1RPX1RDUCkgeworICAgICAgdGNwaGRyID0gKHN0cnVjdCB0Y3BfaGRyICopKCh2b2lkICopaXBoZHIgKyAoSVBIX0hMKGlwaGRyKSA8PCAyKSk7CisgICAgICB1MTZfdCBsZW5mbCA9IG50b2hzKHRjcGhkci0+X2hkcmxlbl9yc3ZkX2ZsYWdzKTsKKyAgICAgIHJldHVybiBzbnByaW50ZihzdHIsIHNpemUsCisJCSAiJXM6IHM6JTVkICU1ZCBxOiUwOHggYTolMDh4IGxmOiUwNHggazolMDR4IgorCQkgICAiICVjJWMlc1xuIiwgaGVhZCwKKwkJICAgIG50b2hzKHRjcGhkci0+c3JjKSwgbnRvaHModGNwaGRyLT5kZXN0KSwKKwkJICAgIG50b2hsKHRjcGhkci0+c2Vxbm8pLCBudG9obCh0Y3BoZHItPmFja25vKSwKKwkJICAgIGxlbmZsLCBudG9ocyh0Y3BoZHItPmNoa3N1bSksCisJCSAgICBkaXIsIHN0YXR1cywgdGFpbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorIAoraW50IHNucHJpbnRmX3VkcF9oZHIoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY2hhciBoZWFkW10sCisJCSAgICAgIHN0cnVjdCBldGhfaGRyICpldGhoZHIsIGNoYXIgZGlyLAorCQkgICAgICBjaGFyIHN0YXR1cywgY2hhciB0YWlsW10pCit7CisgIHN0cnVjdCBpcF9oZHIgKmlwaGRyOworICBzdHJ1Y3QgdWRwX2hkciAqdWRwaGRyOworICBpZiAobnRvaHMoZXRoaGRyLT50eXBlKSA9PSBFVEhUWVBFX0lQKSB7CisgICAgaXBoZHIgPSAoc3RydWN0IGlwX2hkciAqKSgodm9pZCAqKWV0aGhkciArIDE0KTsKKyAgICBpZiAoSVBIX1BST1RPKGlwaGRyKSA9PSBJUF9QUk9UT19VRFApIHsKKyAgICAgIHVkcGhkciA9IChzdHJ1Y3QgdWRwX2hkciAqKSgodm9pZCAqKWlwaGRyICsgKElQSF9ITChpcGhkcikgPDwgMikpOworICAgICAgcmV0dXJuIHNucHJpbnRmKHN0ciwgc2l6ZSwKKwkJICIlczogczolNWQgJTVkIGw6JWQgYzolMDR4IgorCQkgICAiICVjJWMlc1xuIiwgaGVhZCwKKwkJICAgIG50b2hzKHVkcGhkci0+c3JjKSwgbnRvaHModWRwaGRyLT5kZXN0KSwKKwkJICAgIG50b2hzKHVkcGhkci0+bGVuKSwgbnRvaHModWRwaGRyLT5jaGtzdW0pLAorCQkgICAgZGlyLCBzdGF0dXMsIHRhaWwpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKyNlbmRpZiAvKiBVTkRJSUZfSURfRlVMTF9ERUJVRyAqLworCisvKioKKyAqIEluIHRoaXMgZnVuY3Rpb24sIHRoZSBoYXJkd2FyZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQuCisgKiBDYWxsZWQgZnJvbSB1bmRpaWZfaW5pdCgpLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgYWxyZWFkeSBpbml0aWFsaXplZCBsd2lwIG5ldHdvcmsgaW50ZXJmYWNlIHN0cnVjdHVyZQorICogICAgICAgIGZvciB0aGlzIHVuZGlpZgorICovCitzdGF0aWMgdm9pZAorbG93X2xldmVsX2luaXQoc3RydWN0IG5ldGlmICpuZXRpZikKK3sKKyAgc3RhdGljIF9fbG93bWVtIHRfUFhFTlZfVU5ESV9PUEVOIHVuZGlfb3BlbjsKKyAgaW50IGk7CisKKyAgLyogTUFDX3R5cGUgYW5kIE1BQ19sZW4gc2hvdWxkIGFsd2F5cyBtYXRjaCB3aGF0IGlzIHJldHVybmVkIGJ5CisgICAqIFBYRU5WX1VORElfR0VUX0lORk9STUFUSU9OLiAgQXQgdGhlIG1vbWVudCB0aGUgYm90aCBzZWVtIHRvIGJlCisgICAqIHJlbGlhYmxlIGJ1dCBpZiB0aGV5IGRpc2FncmVlIHRoYXQgaXMgYSBzaWduIG9mIGEgbmFzdHkgYnVnCisgICAqIHNvbWV3aGVyZSBzbyBhYm9ydC4KKyAgICovCisgIC8qIElmIHdlIGFyZSBpbiBjb25mbGljdCBhYm9ydCAqLworICBpZiAoTUFDX3R5cGUgIT0gcHhlX3VuZGlfaW5mby5Id1R5cGUpIHsKKyAgICBwcmludGYoIkh3VHlwZSBjb25mbGljaXQ6ICV1ICE9ICV1XG4iLAorCSAgICBNQUNfdHlwZSwgcHhlX3VuZGlfaW5mby5Id1R5cGUpOworICAgIGthYm9vbSgpOworICB9CisgIGlmIChNQUNfbGVuICE9IHB4ZV91bmRpX2luZm8uSHdBZGRyTGVuKSB7CisgICAgIHByaW50ZigiSHdBZGRyTGVuIGNvbmZsaWN0OiAldSAhPSAldVxuIiwKKwkgICAgIE1BQ19sZW4sIHB4ZV91bmRpX2luZm8uSHdBZGRyTGVuKTsKKyAgICAga2Fib29tKCk7CisgIH0KKworICAvKiBzZXQgTUFDIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisgIG5ldGlmLT5od2FkZHJfbGVuID0gTUFDX2xlbjsKKworICAvKiBzZXQgTUFDIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyAgbWVtY3B5KG5ldGlmLT5od2FkZHIsIE1BQywgTUFDX2xlbik7CisKKyAgLyogbWF4aW11bSB0cmFuc2ZlciB1bml0ICovCisgIG5ldGlmLT5tdHUgPSBweGVfdW5kaV9pbmZvLk1heFRyYW5Vbml0OworCisgIGRwcmludGYoIlVOREk6IGh3IGFkZHJlc3MiKTsKKyAgZm9yIChpID0gMDsgaSA8IG5ldGlmLT5od2FkZHJfbGVuOyBpKyspCisgICAgICBkcHJpbnRmKCIlYyUwMngiLCBpID8gJzonIDogJyAnLCAodWludDhfdCluZXRpZi0+aHdhZGRyW2ldKTsKKyAgZHByaW50ZigiXG4iKTsKKworICAvKiBkZXZpY2UgY2FwYWJpbGl0aWVzICovCisgIG5ldGlmLT5mbGFncyA9IE5FVElGX0ZMQUdfQlJPQURDQVNUIHwgTkVUSUZfRkxBR19MSU5LX1VQOworICAvKiBkb24ndCBzZXQgTkVUSUZfRkxBR19FVEhBUlAgaWYgdGhpcyBkZXZpY2UgaXMgbm90IGFuIGV0aGVybmV0IG9uZSAqLworICBpZiAodW5kaV9pc19ldGhlcm5ldChuZXRpZikpCisgICAgbmV0aWYtPmZsYWdzIHw9IE5FVElGX0ZMQUdfRVRIQVJQOworCisgIC8qIEluc3RhbGwgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KKyAgcHhlX3N0YXJ0X2lzcigpOworCisgIC8qIE9wZW4gdGhlIFVOREkgc3RhY2sgLSB5b3UnZCB0aGluayB0aGUgQkMgd291bGQgaGF2ZSBkb25lIHRoaXMuLi4gKi8KKyAgdW5kaV9vcGVuLlBrdEZpbHRlciA9IDB4MDAwMzsJLyogRkxUUl9ESVJFQ1RFRCB8IEZMVFJfQlJEQ1NUICovCisgIHB4ZV9jYWxsKFBYRU5WX1VORElfT1BFTiwgJnVuZGlfb3Blbik7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgZG8gdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gb2YgdGhlIHBhY2tldC4gVGhlIHBhY2tldCBpcworICogY29udGFpbmVkIGluIHRoZSBwYnVmIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gVGhpcyBwYnVmCisgKiBtaWdodCBiZSBjaGFpbmVkLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbHdpcCBuZXR3b3JrIGludGVyZmFjZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgdW5kaWlmCisgKiBAcGFyYW0gcCB0aGUgTUFDIHBhY2tldCB0byBzZW5kIChlLmcuIElQIHBhY2tldCBpbmNsdWRpbmcgTUFDIGFkZHJlc3NlcyBhbmQgdHlwZSkKKyAqIEByZXR1cm4gRVJSX09LIGlmIHRoZSBwYWNrZXQgY291bGQgYmUgc2VudAorICogICAgICAgICBhbiBlcnJfdCB2YWx1ZSBpZiB0aGUgcGFja2V0IGNvdWxkbid0IGJlIHNlbnQKKyAqCisgKiBAbm90ZSBSZXR1cm5pbmcgRVJSX01FTSBoZXJlIGlmIGEgRE1BIHF1ZXVlIG9mIHlvdXIgTUFDIGlzIGZ1bGwgY2FuIGxlYWQgdG8KKyAqICAgICAgIHN0cmFuZ2UgcmVzdWx0cy4gWW91IG1pZ2h0IGNvbnNpZGVyIHdhaXRpbmcgZm9yIHNwYWNlIGluIHRoZSBETUEgcXVldWUKKyAqICAgICAgIHRvIGJlY29tZSBhdmFpbGFsZSBzaW5jZSB0aGUgc3RhY2sgZG9lc24ndCByZXRyeSB0byBzZW5kIGEgcGFja2V0CisgKiAgICAgICBkcm9wcGVkIGJlY2F1c2Ugb2YgbWVtb3J5IGZhaWx1cmUgKGV4Y2VwdCBmb3IgdGhlIFRDUCB0aW1lcnMpLgorICovCitleHRlcm4gdm9sYXRpbGUgdWludDMyX3QgcHhlX2lycV9jb3VudDsKK2V4dGVybiB2b2xhdGlsZSB1aW50OF90ICBweGVfbmVlZF9wb2xsOworCitzdGF0aWMgZXJyX3QKK3VuZGlfdHJhbnNtaXQoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IHBidWYgKnBidWYsCisgIGh3YWRkcl90ICpkZXN0LCB1aW50MTZfdCB1bmRpX3Byb3RvY29sKQoreworICBzdHJ1Y3QgcHhlX3htaXQgeworICAgIHRfUFhFTlZfVU5ESV9UUkFOU01JVCB4bWl0OworICAgIHRfUFhFTlZfVU5ESV9UQkQgdGJkOworICB9OworICBzdGF0aWMgX19sb3dtZW0gc3RydWN0IHB4ZV94bWl0IHB4ZTsKKyAgc3RhdGljIF9fbG93bWVtIGh3YWRkcl90IGxvd19kZXN0OworICBzdGF0aWMgX19sb3dtZW0gY2hhciBwa3RfYnVmW1BLVEJVRl9TSVpFXTsKKyAgdWludDMyX3Qgbm93OworICBzdGF0aWMgdWludDMyX3QgZmlyc3RfeG1pdDsKKyNpZiBMV0lQX1VORElJRl9EQkcoVU5ESUlGX0lEX0ZVTExfREVCVUcpCisgIGNoYXIgKnN0ciA9IG1hbGxvYyhVTklESUZfSURfU1RSTEVOKTsKKyAgaW50IHN0cnBvcyA9IDA7CisgIHN0cnVjdCBldGhfaGRyICpldGhoZHIgPSBwYnVmLT5wYXlsb2FkOworCisKKyAgc3RycG9zICs9IHNucHJpbnRmKHN0ciArIHN0cnBvcywgVU5JRElGX0lEX1NUUkxFTiAtIHN0cnBvcywKKwkJICAgICAidW5kaSB4bWl0IHRoZCAnJXMnXG4iLCBjdXJyZW50KCktPm5hbWUpOworICBzdHJwb3MgKz0gc25wcmludGZfZXRoX2hkcihzdHIgKyBzdHJwb3MsIFVOSURJRl9JRF9TVFJMRU4gLSBzdHJwb3MsCisJCQkgICAgICAidW5kaSIsIGV0aGhkciwgJ3gnLCAnMCcsICIiKTsKKyAgc3RycG9zICs9IHNucHJpbnRmX2FycF9oZHIoc3RyICsgc3RycG9zLCBVTklESUZfSURfU1RSTEVOIC0gc3RycG9zLAorCQkJICAgICAgIiAgYXJwIiwgZXRoaGRyLCAneCcsICcwJywgIiIpOworICBzdHJwb3MgKz0gc25wcmludGZfaXBfaGRyKHN0ciArIHN0cnBvcywgVU5JRElGX0lEX1NUUkxFTiAtIHN0cnBvcywKKwkJCSAgICAgICIgIGlwIiwgZXRoaGRyLCAneCcsICcwJywgIiIpOworICBzdHJwb3MgKz0gc25wcmludGZfaWNtcF9oZHIoc3RyICsgc3RycG9zLCBVTklESUZfSURfU1RSTEVOIC0gc3RycG9zLAorCQkJICAgICAgIiAgICBpY21wIiwgZXRoaGRyLCAneCcsICcwJywgIiIpOworICBzdHJwb3MgKz0gc25wcmludGZfdGNwX2hkcihzdHIgKyBzdHJwb3MsIFVOSURJRl9JRF9TVFJMRU4gLSBzdHJwb3MsCisJCQkgICAgICAiICAgIHRjcCIsIGV0aGhkciwgJ3gnLCAnMCcsICIiKTsKKyAgc3RycG9zICs9IHNucHJpbnRmX3VkcF9oZHIoc3RyICsgc3RycG9zLCBVTklESUZfSURfU1RSTEVOIC0gc3RycG9zLAorCQkJICAgICAgIiAgICB1ZHAiLCBldGhoZHIsICd4JywgJzAnLCAiIik7CisgIExXSVBfREVCVUdGKFVORElJRl9JRF9GVUxMX0RFQlVHLCAoIiVzIiwgc3RyKSk7CisgIGZyZWUoc3RyKTsKKyNlbmRpZiAvKiBVTkRJSUZfSURfRlVMTF9ERUJVRyAqLworCisgIC8qIERyb3AganVtYm8gZnJhbWVzICovCisgIGlmICgocGJ1Zi0+dG90X2xlbiA+IHNpemVvZihwa3RfYnVmKSkgfHwgKHBidWYtPnRvdF9sZW4gPiBuZXRpZi0+bXR1KSkKKyAgICByZXR1cm4gRVJSX0FSRzsKKworICBpZiAoX191bmxpa2VseSghcHhlX2lycV9jb3VudCkpIHsKKyAgICAgIG5vdyA9IG1zX3RpbWVyKCk7CisgICAgICBpZiAoIWZpcnN0X3htaXQpIHsKKwkgIGZpcnN0X3htaXQgPSBub3c7CisgICAgICB9IGVsc2UgaWYgKG5vdyAtIGZpcnN0X3htaXQgPiAzMDAwKSB7CisJICAvKiAzIHNlY29uZHMgYWZ0ZXIgZmlyc3QgdHJhbnNtaXQsIGFuZCBubyBpbnRlcnJ1cHRzICovCisJICBMV0lQX1BMQVRGT1JNX0RJQUcoKCJ1bmRpaWY6IGZvcmNpbmcgcG9sbGluZ1xuIikpOworCSAgYXNtIHZvbGF0aWxlKCJvcmIgJDEsJTAiIDogIittIiAocHhlX25lZWRfcG9sbCkpOworCSAgYXNtIHZvbGF0aWxlKCJpbmNsICUwIiA6ICIrbSIgKHB4ZV9pcnFfY291bnQpKTsKKyAgICAgIH0KKyAgfQorCisgIHBidWZfY29weV9wYXJ0aWFsKCBwYnVmLCBwa3RfYnVmLCBwYnVmLT50b3RfbGVuLCAwKTsKKyAgaWYgKGRlc3QpCisgICAgbWVtY3B5KGxvd19kZXN0LCBkZXN0LCBuZXRpZi0+aHdhZGRyX2xlbik7CisKKyAgZG8geworICAgIG1lbXNldCgmcHhlLCAwLCBzaXplb2YgcHhlKTsKKworICAgIHB4ZS54bWl0LlByb3RvY29sID0gdW5kaV9wcm90b2NvbDsKKyAgICBweGUueG1pdC5YbWl0RmxhZyA9IGRlc3Q/IFhNVF9ERVNUQUREUiA6IFhNVF9CUk9BRENBU1Q7CisgICAgcHhlLnhtaXQuRGVzdEFkZHIgPSBGQVJfUFRSKCZsb3dfZGVzdCk7CisgICAgcHhlLnhtaXQuVEJEID0gRkFSX1BUUigmcHhlLnRiZCk7CisgICAgcHhlLnRiZC5JbW1lZExlbmd0aCA9IHBidWYtPnRvdF9sZW47CisgICAgcHhlLnRiZC5YbWl0ID0gRkFSX1BUUihwa3RfYnVmKTsKKworICAgIHB4ZV9jYWxsKFBYRU5WX1VORElfVFJBTlNNSVQsICZweGUueG1pdCk7CisgIH0gd2hpbGUgKHB4ZS54bWl0LlN0YXR1cyA9PSBQWEVOVl9TVEFUVVNfT1VUX09GX1JFU09VUkNFUyk7CisKKyAgTElOS19TVEFUU19JTkMobGluay54bWl0KTsKKworICByZXR1cm4gRVJSX09LOworfQorCitzdGF0aWMgZXJyX3QKK3VuZGlfc2VuZF91bmtub3duKHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwYnVmKQoreworICByZXR1cm4gdW5kaV90cmFuc21pdChuZXRpZiwgcGJ1ZiwgTlVMTCwgUF9VTktOT1dOKTsKK30KKworc3RhdGljIGVycl90Cit1bmRpX3NlbmRfaXAoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IHBidWYgKnBidWYsIGh3YWRkcl90ICAqZHN0KQoreworICByZXR1cm4gdW5kaV90cmFuc21pdChuZXRpZiwgcGJ1ZiwgZHN0LCBQX0lQKTsKK30KKworc3RhdGljIGVycl90Cit1bmRpX3NlbmRfYXJwKHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwYnVmLCBod2FkZHJfdCAgKmRzdCkKK3sKKyAgcmV0dXJuIHVuZGlfdHJhbnNtaXQobmV0aWYsIHBidWYsIGRzdCwgUF9BUlApOworfQorCisvKioKKyAqIFNlbmQgYW4gQVJQIHJlcXVlc3QgcGFja2V0IGFza2luZyBmb3IgaXBhZGRyLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbHdpcCBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCB0byBzZW5kIHRoZSByZXF1ZXN0CisgKiBAcGFyYW0gaXBhZGRyIHRoZSBJUCBhZGRyZXNzIGZvciB3aGljaCB0byBhc2sKKyAqIEByZXR1cm4gRVJSX09LIGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQKKyAqICAgICAgICAgRVJSX01FTSBpZiB0aGUgQVJQIHBhY2tldCBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQKKyAqICAgICAgICAgYW55IG90aGVyIGVycl90IG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGVycl90Cit1bmRpYXJwX3JlcXVlc3Qoc3RydWN0IG5ldGlmICpuZXRpZiwgc3RydWN0IGlwX2FkZHIgKmlwYWRkcikKK3sKKyAgc3RydWN0IHBidWYgKnA7CisgIGVycl90IHJlc3VsdCA9IEVSUl9PSzsKKyAgc3RydWN0IGFycF9oZHIgKmhkcjsKKyAgdThfdCAqaGRyX3B0cjsKKworICBMV0lQX0RFQlVHRihVTkRJSUZfQVJQX0RFQlVHIHwgVU5ESUlGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidW5kaWFycF9yZXF1ZXN0OiBzZW5kaW5nIEFSUCByZXF1ZXN0LlxuIikpOworCisgIC8qIGFsbG9jYXRlIGEgcGJ1ZiBmb3IgdGhlIG91dGdvaW5nIEFSUCByZXF1ZXN0IHBhY2tldCAqLworICBwID0gcGJ1Zl9hbGxvYyhQQlVGX1JBVywgYXJwX2hkcl9sZW4obmV0aWYpLCBQQlVGX1JBTSk7CisgIC8qIGNvdWxkIGFsbG9jYXRlIGEgcGJ1ZiBmb3IgYW4gQVJQIHJlcXVlc3Q/ICovCisgIGlmIChwID09IE5VTEwpIHsKKyAgICBMV0lQX0RFQlVHRihVTkRJSUZfQVJQX0RFQlVHIHwgVU5ESUlGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UgfCBMV0lQX0RCR19MRVZFTF9TRVJJT1VTLAorICAgICAgKCJ1bmRpYXJwX3JhdzogY291bGQgbm90IGFsbG9jYXRlIHBidWYgZm9yIEFSUCByZXF1ZXN0LlxuIikpOworICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLm1lbWVycik7CisgICAgcmV0dXJuIEVSUl9NRU07CisgIH0KKyAgTFdJUF9BU1NFUlQoImNoZWNrIHRoYXQgZmlyc3QgcGJ1ZiBjYW4gaG9sZCBhcnBfaGRyX2xlbiBieXRlc3IiLAorICAgICAgICAgICAgICAocC0+bGVuID49IGFycF9oZHJfbGVuKG5ldGlmKSkpOworCisgIGhkciA9IHAtPnBheWxvYWQ7CisgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJ1bmRpYXJwX3JlcXVlc3Q6IHNlbmRpbmcgcmF3IEFSUCBwYWNrZXQuXG4iKSk7CisgIGhkci0+b3Bjb2RlID0gaHRvbnMoQVJQX1JFUVVFU1QpOworICBoZHItPmh3dHlwZSA9IGh0b25zKE1BQ190eXBlKTsKKyAgaGRyLT5wcm90byA9IGh0b25zKEVUSFRZUEVfSVApOworICBoZHItPmh3bGVuID0gbmV0aWYtPmh3YWRkcl9sZW47CisgIGhkci0+cHJvdG9sZW4gPSBzaXplb2Yoc3RydWN0IGlwX2FkZHIpOworCisgIGhkcl9wdHIgPSAodW5zaWduZWQgY2hhciAqKShoZHIgKyAxKTsKKyAgbWVtY3B5KGhkcl9wdHIsIG5ldGlmLT5od2FkZHIsIG5ldGlmLT5od2FkZHJfbGVuKTsKKyAgaGRyX3B0ciArPSBuZXRpZi0+aHdhZGRyX2xlbjsKKyAgbWVtY3B5KGhkcl9wdHIsICZuZXRpZi0+aXBfYWRkciwgNCk7CisgIGhkcl9wdHIgKz0gNDsKKyAgICBtZW1zZXQoaGRyX3B0ciwgMCwgbmV0aWYtPmh3YWRkcl9sZW4pOworICBoZHJfcHRyICs9IG5ldGlmLT5od2FkZHJfbGVuOworICBtZW1jcHkoaGRyX3B0ciwgaXBhZGRyLCA0KTsKKyAgCisgIC8qIHNlbmQgQVJQIHF1ZXJ5ICovCisgIHJlc3VsdCA9IHVuZGlfc2VuZF9hcnAobmV0aWYsIHAsIE5VTEwpOworICBFVEhBUlBfU1RBVFNfSU5DKGV0aGFycC54bWl0KTsKKyAgLyogZnJlZSBBUlAgcXVlcnkgcGFja2V0ICovCisgIHBidWZfZnJlZShwKTsKKyAgcCA9IE5VTEw7CisgIC8qIGNvdWxkIG5vdCBhbGxvY2F0ZSBwYnVmIGZvciBBUlAgcmVxdWVzdCAqLworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZiBBUlBfUVVFVUVJTkcKKy8qKgorICogRnJlZSBhIGNvbXBsZXRlIHF1ZXVlIG9mIGV0aGFycCBlbnRyaWVzCisgKgorICogQHBhcmFtIHEgYSBxZXVldWUgb2YgZXRoYXJwX3FfZW50cnkncyB0byBmcmVlCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3VuZGlhcnBfcShzdHJ1Y3QgZXRoYXJwX3FfZW50cnkgKnEpCit7CisgIHN0cnVjdCBldGhhcnBfcV9lbnRyeSAqcjsKKyAgTFdJUF9BU1NFUlQoInEgIT0gTlVMTCIsIHEgIT0gTlVMTCk7CisgIExXSVBfQVNTRVJUKCJxLT5wICE9IE5VTEwiLCBxLT5wICE9IE5VTEwpOworICB3aGlsZSAocSkgeworICAgIHIgPSBxOworICAgIHEgPSBxLT5uZXh0OworICAgIExXSVBfQVNTRVJUKCJyLT5wICE9IE5VTEwiLCAoci0+cCAhPSBOVUxMKSk7CisgICAgcGJ1Zl9mcmVlKHItPnApOworICAgIG1lbXBfZnJlZShNRU1QX0FSUF9RVUVVRSwgcik7CisgIH0KK30KKyNlbmRpZgorCisvKioKKyAqIENsZWFycyBleHBpcmVkIGVudHJpZXMgaW4gdGhlIEFSUCB0YWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgRVRIQVJQX1RNUl9JTlRFUlZBTCBtaWNyb3NlY29uZHMgKDUgc2Vjb25kcyksCisgKiBpbiBvcmRlciB0byBleHBpcmUgZW50cmllcyBpbiB0aGUgQVJQIHRhYmxlLgorICovCit2b2lkCit1bmRpYXJwX3Rtcih2b2lkKQoreworICB1OF90IGk7CisKKyAgTFdJUF9ERUJVR0YoVU5ESUlGX0FSUF9ERUJVRyB8IFVORElJRl9ERUJVRywgKCJ1bmRpYXJwX3RpbWVyXG4iKSk7CisgIC8qIHJlbW92ZSBleHBpcmVkIGVudHJpZXMgZnJvbSB0aGUgQVJQIHRhYmxlICovCisgIGZvciAoaSA9IDA7IGkgPCBBUlBfVEFCTEVfU0laRTsgKytpKSB7CisgICAgYXJwX3RhYmxlW2ldLmN0aW1lKys7CisgICAgaWYgKCgoYXJwX3RhYmxlW2ldLnN0YXRlID09IFVORElBUlBfU1RBVEVfU1RBQkxFKSAmJgorICAgICAgICAgKGFycF90YWJsZVtpXS5jdGltZSA+PSBVTkRJQVJQX01BWEFHRSkpIHx8CisgICAgICAgICgoYXJwX3RhYmxlW2ldLnN0YXRlID09IFVORElBUlBfU1RBVEVfUEVORElORykgICYmCisgICAgICAgICAoYXJwX3RhYmxlW2ldLmN0aW1lID49IFVORElBUlBfTUFYUEVORElORykpKSB7CisgICAgICAgICAvKiBwZW5kaW5nIG9yIHN0YWJsZSBlbnRyeSBoYXMgYmVjb21lIG9sZCEgKi8KKyAgICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgLCAoInVuZGlhcnBfdGltZXI6IGV4cGlyZWQgJXMgZW50cnkgJSJVMTZfRiIuXG4iLAorICAgICAgICAgICBhcnBfdGFibGVbaV0uc3RhdGUgPT0gVU5ESUFSUF9TVEFURV9TVEFCTEUgPyAic3RhYmxlIiA6ICJwZW5kaW5nIiwgKHUxNl90KWkpKTsKKyAgICAgIC8qIGNsZWFuIHVwIGVudHJpZXMgdGhhdCBoYXZlIGp1c3QgYmVlbiBleHBpcmVkICovCisgICAgICAvKiByZW1vdmUgZnJvbSBTTk1QIEFSUCBpbmRleCB0cmVlICovCisgICAgICBzbm1wX2RlbGV0ZV9hcnBpZHhfdHJlZShhcnBfdGFibGVbaV0ubmV0aWYsICZhcnBfdGFibGVbaV0uaXBhZGRyKTsKKyNpZiBBUlBfUVVFVUVJTkcKKyAgICAgIC8qIGFuZCBlbXB0eSBwYWNrZXQgcXVldWUgKi8KKyAgICAgIGlmIChhcnBfdGFibGVbaV0ucSAhPSBOVUxMKSB7CisgICAgICAgIC8qIHJlbW92ZSBhbGwgcXVldWVkIHBhY2tldHMgKi8KKyAgICAgICAgTFdJUF9ERUJVR0YoVU5ESUlGX0FSUF9ERUJVRyB8IFVORElJRl9ERUJVRyAsICgidW5kaWFycF90aW1lcjogZnJlZWluZyBlbnRyeSAlIlUxNl9GIiwgcGFja2V0IHF1ZXVlICVwLlxuIiwgKHUxNl90KWksICh2b2lkICopKGFycF90YWJsZVtpXS5xKSkpOworICAgICAgICBmcmVlX3VuZGlhcnBfcShhcnBfdGFibGVbaV0ucSk7CisgICAgICAgIGFycF90YWJsZVtpXS5xID0gTlVMTDsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgLyogcmVjeWNsZSBlbnRyeSBmb3IgcmUtdXNlICovICAgICAgCisgICAgICBhcnBfdGFibGVbaV0uc3RhdGUgPSBVTkRJQVJQX1NUQVRFX0VNUFRZOworICAgIH0KKyNpZiBBUlBfUVVFVUVJTkcKKyAgICAvKiBzdGlsbCBwZW5kaW5nIGVudHJ5PyAobm90IGV4cGlyZWQpICovCisgICAgaWYgKGFycF90YWJsZVtpXS5zdGF0ZSA9PSBVTkRJQVJQX1NUQVRFX1BFTkRJTkcpIHsKKyAgICAgICAgLyogcmVzZW5kIGFuIEFSUCBxdWVyeSBoZXJlPyAqLworICAgIH0KKyNlbmRpZgorICB9Cit9CisKKy8qKgorICogU2VhcmNoIHRoZSBBUlAgdGFibGUgZm9yIGEgbWF0Y2hpbmcgb3IgbmV3IGVudHJ5LgorICogCisgKiBJZiBhbiBJUCBhZGRyZXNzIGlzIGdpdmVuLCByZXR1cm4gYSBwZW5kaW5nIG9yIHN0YWJsZSBBUlAgZW50cnkgdGhhdCBtYXRjaGVzCisgKiB0aGUgYWRkcmVzcy4gSWYgbm8gbWF0Y2ggaXMgZm91bmQsIGNyZWF0ZSBhIG5ldyBlbnRyeSB3aXRoIHRoaXMgYWRkcmVzcyBzZXQsCisgKiBidXQgaW4gc3RhdGUgRVRIQVJQX0VNUFRZLiBUaGUgY2FsbGVyIG11c3QgY2hlY2sgYW5kIHBvc3NpYmx5IGNoYW5nZSB0aGUKKyAqIHN0YXRlIG9mIHRoZSByZXR1cm5lZCBlbnRyeS4KKyAqIAorICogSWYgaXBhZGRyIGlzIE5VTEwsIHJldHVybiBhIGluaXRpYWxpemVkIG5ldyBlbnRyeSBpbiBzdGF0ZSBFVEhBUlBfRU1QVFkuCisgKiAKKyAqIEluIGFsbCBjYXNlcywgYXR0ZW1wdCB0byBjcmVhdGUgbmV3IGVudHJpZXMgZnJvbSBhbiBlbXB0eSBlbnRyeS4gSWYgbm8KKyAqIGVtcHR5IGVudHJpZXMgYXJlIGF2YWlsYWJsZSBhbmQgVU5ESUFSUF9UUllfSEFSRCBmbGFnIGlzIHNldCwgcmVjeWNsZQorICogb2xkIGVudHJpZXMuIEhldXJpc3RpYyBjaG9vc2UgdGhlIGxlYXN0IGltcG9ydGFudCBlbnRyeSBmb3IgcmVjeWNsaW5nLgorICoKKyAqIEBwYXJhbSBpcGFkZHIgSVAgYWRkcmVzcyB0byBmaW5kIGluIEFSUCBjYWNoZSwgb3IgdG8gYWRkIGlmIG5vdCBmb3VuZC4KKyAqIEBwYXJhbSBmbGFncworICogLSBVTkRJQVJQX1RSWV9IQVJEOiBUcnkgaGFyZCB0byBjcmVhdGUgYSBlbnRyeSBieSBhbGxvd2luZyByZWN5Y2xpbmcgb2YKKyAqIGFjdGl2ZSAoc3RhYmxlIG9yIHBlbmRpbmcpIGVudHJpZXMuCisgKiAgCisgKiBAcmV0dXJuIFRoZSBBUlAgZW50cnkgaW5kZXggdGhhdCBtYXRjaGVkIG9yIGlzIGNyZWF0ZWQsIEVSUl9NRU0gaWYgbm8KKyAqIGVudHJ5IGlzIGZvdW5kIG9yIGNvdWxkIGJlIHJlY3ljbGVkLgorICovCitzdGF0aWMgczhfdAorI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorZmluZF9lbnRyeShzdHJ1Y3QgaXBfYWRkciAqaXBhZGRyLCB1OF90IGZsYWdzLCBzdHJ1Y3QgbmV0aWYgKm5ldGlmKQorI2Vsc2UgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UICovCitmaW5kX2VudHJ5KHN0cnVjdCBpcF9hZGRyICppcGFkZHIsIHU4X3QgZmxhZ3MpCisjZW5kaWYgLyogTFdJUF9ORVRJRl9IV0FERFJISU5UICovCit7CisgIHM4X3Qgb2xkX3BlbmRpbmcgPSBBUlBfVEFCTEVfU0laRSwgb2xkX3N0YWJsZSA9IEFSUF9UQUJMRV9TSVpFOworICBzOF90IGVtcHR5ID0gQVJQX1RBQkxFX1NJWkU7CisgIHU4X3QgaSA9IDAsIGFnZV9wZW5kaW5nID0gMCwgYWdlX3N0YWJsZSA9IDA7CisjaWYgQVJQX1FVRVVFSU5HCisgIC8qIG9sZGVzdCBlbnRyeSB3aXRoIHBhY2tldHMgb24gcXVldWUgKi8KKyAgczhfdCBvbGRfcXVldWUgPSBBUlBfVEFCTEVfU0laRTsKKyAgLyogaXRzIGFnZSAqLworICB1OF90IGFnZV9xdWV1ZSA9IDA7CisjZW5kaWYKKworICAvKiBGaXJzdCwgdGVzdCBpZiB0aGUgbGFzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gYXNrZWQgZm9yIHRoZQorICAgKiBzYW1lIGFkZHJlc3MuIElmIHNvLCB3ZSdyZSByZWFsbHkgZmFzdCEgKi8KKyAgaWYgKGlwYWRkcikgeworICAgIC8qIGlwYWRkciB0byBzZWFyY2ggZm9yIHdhcyBnaXZlbiAqLworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICAgIGlmICgobmV0aWYgIT0gTlVMTCkgJiYgKG5ldGlmLT5hZGRyX2hpbnQgIT0gTlVMTCkpIHsKKyAgICAgIC8qIHBlci1wY2IgY2FjaGVkIGVudHJ5IHdhcyBnaXZlbiAqLworICAgICAgdThfdCBwZXJfcGNiX2NhY2hlID0gKihuZXRpZi0+YWRkcl9oaW50KTsKKyAgICAgIGlmICgocGVyX3BjYl9jYWNoZSA8IEFSUF9UQUJMRV9TSVpFKSAmJiBhcnBfdGFibGVbcGVyX3BjYl9jYWNoZV0uc3RhdGUgPT0gVU5ESUFSUF9TVEFURV9TVEFCTEUpIHsKKyAgICAgICAgLyogdGhlIHBlci1wY2ItY2FjaGVkIGVudHJ5IGlzIHN0YWJsZSAqLworICAgICAgICBpZiAoaXBfYWRkcl9jbXAoaXBhZGRyLCAmYXJwX3RhYmxlW3Blcl9wY2JfY2FjaGVdLmlwYWRkcikpIHsKKyAgICAgICAgICAvKiBwZXItcGNiIGNhY2hlZCBlbnRyeSB3YXMgdGhlIHJpZ2h0IG9uZSEgKi8KKyAgICAgICAgICBFVEhBUlBfU1RBVFNfSU5DKGV0aGFycC5jYWNoZWhpdCk7CisgICAgICAgICAgcmV0dXJuIHBlcl9wY2JfY2FjaGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZWxzZSAvKiAjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UICovCisgICAgaWYgKGFycF90YWJsZVt1bmRpYXJwX2NhY2hlZF9lbnRyeV0uc3RhdGUgPT0gVU5ESUFSUF9TVEFURV9TVEFCTEUpIHsKKyAgICAgIC8qIHRoZSBjYWNoZWQgZW50cnkgaXMgc3RhYmxlICovCisgICAgICBpZiAoaXBfYWRkcl9jbXAoaXBhZGRyLCAmYXJwX3RhYmxlW3VuZGlhcnBfY2FjaGVkX2VudHJ5XS5pcGFkZHIpKSB7CisgICAgICAgIC8qIGNhY2hlZCBlbnRyeSB3YXMgdGhlIHJpZ2h0IG9uZSEgKi8KKyAgICAgICAgRVRIQVJQX1NUQVRTX0lOQyhldGhhcnAuY2FjaGVoaXQpOworICAgICAgICByZXR1cm4gdW5kaWFycF9jYWNoZWRfZW50cnk7CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qICNpZiBMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKyAgfQorCisgIC8qKgorICAgKiBhKSBkbyBhIHNlYXJjaCB0aHJvdWdoIHRoZSBjYWNoZSwgcmVtZW1iZXIgY2FuZGlkYXRlcworICAgKiBiKSBzZWxlY3QgY2FuZGlkYXRlIGVudHJ5CisgICAqIGMpIGNyZWF0ZSBuZXcgZW50cnkKKyAgICovCisKKyAgLyogYSkgaW4gYSBzaW5nbGUgc2VhcmNoIHN3ZWVwLCBkbyBhbGwgb2YgdGhpcworICAgKiAxKSByZW1lbWJlciB0aGUgZmlyc3QgZW1wdHkgZW50cnkgKGlmIGFueSkKKyAgICogMikgcmVtZW1iZXIgdGhlIG9sZGVzdCBzdGFibGUgZW50cnkgKGlmIGFueSkKKyAgICogMykgcmVtZW1iZXIgdGhlIG9sZGVzdCBwZW5kaW5nIGVudHJ5IHdpdGhvdXQgcXVldWVkIHBhY2tldHMgKGlmIGFueSkKKyAgICogNCkgcmVtZW1iZXIgdGhlIG9sZGVzdCBwZW5kaW5nIGVudHJ5IHdpdGggcXVldWVkIHBhY2tldHMgKGlmIGFueSkKKyAgICogNSkgc2VhcmNoIGZvciBhIG1hdGNoaW5nIElQIGVudHJ5LCBlaXRoZXIgcGVuZGluZyBvciBzdGFibGUKKyAgICogICAgdW50aWwgNSBtYXRjaGVzLCBvciBhbGwgZW50cmllcyBhcmUgc2VhcmNoZWQgZm9yLgorICAgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgQVJQX1RBQkxFX1NJWkU7ICsraSkgeworICAgIC8qIG5vIGVtcHR5IGVudHJ5IGZvdW5kIHlldCBhbmQgbm93IHdlIGRvIGZpbmQgb25lPyAqLworICAgIGlmICgoZW1wdHkgPT0gQVJQX1RBQkxFX1NJWkUpICYmIChhcnBfdGFibGVbaV0uc3RhdGUgPT0gVU5ESUFSUF9TVEFURV9FTVBUWSkpIHsKKyAgICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgLCAoImZpbmRfZW50cnk6IGZvdW5kIGVtcHR5IGVudHJ5ICUiVTE2X0YiXG4iLCAodTE2X3QpaSkpOworICAgICAgLyogcmVtZW1iZXIgZmlyc3QgZW1wdHkgZW50cnkgKi8KKyAgICAgIGVtcHR5ID0gaTsKKyAgICB9CisgICAgLyogcGVuZGluZyBlbnRyeT8gKi8KKyAgICBlbHNlIGlmIChhcnBfdGFibGVbaV0uc3RhdGUgPT0gVU5ESUFSUF9TVEFURV9QRU5ESU5HKSB7CisgICAgICAvKiBpZiBnaXZlbiwgZG9lcyBJUCBhZGRyZXNzIG1hdGNoIElQIGFkZHJlc3MgaW4gQVJQIGVudHJ5PyAqLworICAgICAgaWYgKGlwYWRkciAmJiBpcF9hZGRyX2NtcChpcGFkZHIsICZhcnBfdGFibGVbaV0uaXBhZGRyKSkgeworICAgICAgICBMV0lQX0RFQlVHRihVTkRJSUZfQVJQX0RFQlVHIHwgVU5ESUlGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZmluZF9lbnRyeTogZm91bmQgbWF0Y2hpbmcgcGVuZGluZyBlbnRyeSAlIlUxNl9GIlxuIiwgKHUxNl90KWkpKTsKKyAgICAgICAgLyogZm91bmQgZXhhY3QgSVAgYWRkcmVzcyBtYXRjaCwgc2ltcGx5IGJhaWwgb3V0ICovCisjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UCisgICAgICAgIE5FVElGX1NFVF9ISU5UKG5ldGlmLCBpKTsKKyNlbHNlIC8qICNpZiBMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKyAgICAgICAgdW5kaWFycF9jYWNoZWRfZW50cnkgPSBpOworI2VuZGlmIC8qICNpZiBMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKyAgICAgICAgcmV0dXJuIGk7CisjaWYgQVJQX1FVRVVFSU5HCisgICAgICAvKiBwZW5kaW5nIHdpdGggcXVldWVkIHBhY2tldHM/ICovCisgICAgICB9IGVsc2UgaWYgKGFycF90YWJsZVtpXS5xICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGFycF90YWJsZVtpXS5jdGltZSA+PSBhZ2VfcXVldWUpIHsKKyAgICAgICAgICBvbGRfcXVldWUgPSBpOworICAgICAgICAgIGFnZV9xdWV1ZSA9IGFycF90YWJsZVtpXS5jdGltZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAvKiBwZW5kaW5nIHdpdGhvdXQgcXVldWVkIHBhY2tldHM/ICovCisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXJwX3RhYmxlW2ldLmN0aW1lID49IGFnZV9wZW5kaW5nKSB7CisgICAgICAgICAgb2xkX3BlbmRpbmcgPSBpOworICAgICAgICAgIGFnZV9wZW5kaW5nID0gYXJwX3RhYmxlW2ldLmN0aW1lOworICAgICAgICB9CisgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgLyogc3RhYmxlIGVudHJ5PyAqLworICAgIGVsc2UgaWYgKGFycF90YWJsZVtpXS5zdGF0ZSA9PSBVTkRJQVJQX1NUQVRFX1NUQUJMRSkgeworICAgICAgLyogaWYgZ2l2ZW4sIGRvZXMgSVAgYWRkcmVzcyBtYXRjaCBJUCBhZGRyZXNzIGluIEFSUCBlbnRyeT8gKi8KKyAgICAgIGlmIChpcGFkZHIgJiYgaXBfYWRkcl9jbXAoaXBhZGRyLCAmYXJwX3RhYmxlW2ldLmlwYWRkcikpIHsKKyAgICAgICAgTFdJUF9ERUJVR0YoVU5ESUlGX0FSUF9ERUJVRyB8IFVORElJRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoImZpbmRfZW50cnk6IGZvdW5kIG1hdGNoaW5nIHN0YWJsZSBlbnRyeSAlIlUxNl9GIlxuIiwgKHUxNl90KWkpKTsKKyAgICAgICAgLyogZm91bmQgZXhhY3QgSVAgYWRkcmVzcyBtYXRjaCwgc2ltcGx5IGJhaWwgb3V0ICovCisjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UCisgICAgICAgIE5FVElGX1NFVF9ISU5UKG5ldGlmLCBpKTsKKyNlbHNlIC8qICNpZiBMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKyAgICAgICAgdW5kaWFycF9jYWNoZWRfZW50cnkgPSBpOworI2VuZGlmIC8qICNpZiBMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKyAgICAgICAgcmV0dXJuIGk7CisgICAgICAvKiByZW1lbWJlciBlbnRyeSB3aXRoIG9sZGVzdCBzdGFibGUgZW50cnkgaW4gb2xkZXN0LCBpdHMgYWdlIGluIG1heHRpbWUgKi8KKyAgICAgIH0gZWxzZSBpZiAoYXJwX3RhYmxlW2ldLmN0aW1lID49IGFnZV9zdGFibGUpIHsKKyAgICAgICAgb2xkX3N0YWJsZSA9IGk7CisgICAgICAgIGFnZV9zdGFibGUgPSBhcnBfdGFibGVbaV0uY3RpbWU7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIHsgd2UgaGF2ZSBubyBtYXRjaCB9ID0+IHRyeSB0byBjcmVhdGUgYSBuZXcgZW50cnkgKi8KKyAgIAorICAvKiBubyBlbXB0eSBlbnRyeSBmb3VuZCBhbmQgbm90IGFsbG93ZWQgdG8gcmVjeWNsZT8gKi8KKyAgaWYgKCgoZW1wdHkgPT0gQVJQX1RBQkxFX1NJWkUpICYmICgoZmxhZ3MgJiBVTkRJQVJQX1RSWV9IQVJEKSA9PSAwKSkKKyAgICAgIC8qIG9yIGRvbid0IGNyZWF0ZSBuZXcgZW50cnksIG9ubHkgc2VhcmNoPyAqLworICAgICAgfHwgKChmbGFncyAmIFVORElBUlBfRklORF9PTkxZKSAhPSAwKSkgeworICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJmaW5kX2VudHJ5OiBubyBlbXB0eSBlbnRyeSBmb3VuZCBhbmQgbm90IGFsbG93ZWQgdG8gcmVjeWNsZVxuIikpOworICAgIHJldHVybiAoczhfdClFUlJfTUVNOworICB9CisgIAorICAvKiBiKSBjaG9vc2UgdGhlIGxlYXN0IGRlc3RydWN0aXZlIGVudHJ5IHRvIHJlY3ljbGU6CisgICAqIDEpIGVtcHR5IGVudHJ5CisgICAqIDIpIG9sZGVzdCBzdGFibGUgZW50cnkKKyAgICogMykgb2xkZXN0IHBlbmRpbmcgZW50cnkgd2l0aG91dCBxdWV1ZWQgcGFja2V0cworICAgKiA0KSBvbGRlc3QgcGVuZGluZyBlbnRyeSB3aXRoIHF1ZXVlZCBwYWNrZXRzCisgICAqIAorICAgKiB7IFVORElBUlBfVFJZX0hBUkQgaXMgc2V0IGF0IHRoaXMgcG9pbnQgfQorICAgKi8gCisKKyAgLyogMSkgZW1wdHkgZW50cnkgYXZhaWxhYmxlPyAqLworICBpZiAoZW1wdHkgPCBBUlBfVEFCTEVfU0laRSkgeworICAgIGkgPSBlbXB0eTsKKyAgICBMV0lQX0RFQlVHRihVTkRJSUZfQVJQX0RFQlVHIHwgVU5ESUlGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgiZmluZF9lbnRyeTogc2VsZWN0aW5nIGVtcHR5IGVudHJ5ICUiVTE2X0YiXG4iLCAodTE2X3QpaSkpOworICB9CisgIC8qIDIpIGZvdW5kIHJlY3ljbGFibGUgc3RhYmxlIGVudHJ5PyAqLworICBlbHNlIGlmIChvbGRfc3RhYmxlIDwgQVJQX1RBQkxFX1NJWkUpIHsKKyAgICAvKiByZWN5Y2xlIG9sZGVzdCBzdGFibGUqLworICAgIGkgPSBvbGRfc3RhYmxlOworICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJmaW5kX2VudHJ5OiBzZWxlY3Rpbmcgb2xkZXN0IHN0YWJsZSBlbnRyeSAlIlUxNl9GIlxuIiwgKHUxNl90KWkpKTsKKyNpZiBBUlBfUVVFVUVJTkcKKyAgICAvKiBubyBxdWV1ZWQgcGFja2V0cyBzaG91bGQgZXhpc3Qgb24gc3RhYmxlIGVudHJpZXMgKi8KKyAgICBMV0lQX0FTU0VSVCgiYXJwX3RhYmxlW2ldLnEgPT0gTlVMTCIsIGFycF90YWJsZVtpXS5xID09IE5VTEwpOworI2VuZGlmCisgIC8qIDMpIGZvdW5kIHJlY3ljbGFibGUgcGVuZGluZyBlbnRyeSB3aXRob3V0IHF1ZXVlZCBwYWNrZXRzPyAqLworICB9IGVsc2UgaWYgKG9sZF9wZW5kaW5nIDwgQVJQX1RBQkxFX1NJWkUpIHsKKyAgICAvKiByZWN5Y2xlIG9sZGVzdCBwZW5kaW5nICovCisgICAgaSA9IG9sZF9wZW5kaW5nOworICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJmaW5kX2VudHJ5OiBzZWxlY3Rpbmcgb2xkZXN0IHBlbmRpbmcgZW50cnkgJSJVMTZfRiIgKHdpdGhvdXQgcXVldWUpXG4iLCAodTE2X3QpaSkpOworI2lmIEFSUF9RVUVVRUlORworICAvKiA0KSBmb3VuZCByZWN5Y2xhYmxlIHBlbmRpbmcgZW50cnkgd2l0aCBxdWV1ZWQgcGFja2V0cz8gKi8KKyAgfSBlbHNlIGlmIChvbGRfcXVldWUgPCBBUlBfVEFCTEVfU0laRSkgeworICAgIC8qIHJlY3ljbGUgb2xkZXN0IHBlbmRpbmcgKi8KKyAgICBpID0gb2xkX3F1ZXVlOworICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJmaW5kX2VudHJ5OiBzZWxlY3Rpbmcgb2xkZXN0IHBlbmRpbmcgZW50cnkgJSJVMTZfRiIsIGZyZWVpbmcgcGFja2V0IHF1ZXVlICVwXG4iLCAodTE2X3QpaSwgKHZvaWQgKikoYXJwX3RhYmxlW2ldLnEpKSk7CisgICAgZnJlZV91bmRpYXJwX3EoYXJwX3RhYmxlW2ldLnEpOworICAgIGFycF90YWJsZVtpXS5xID0gTlVMTDsKKyNlbmRpZgorICAgIC8qIG5vIGVtcHR5IG9yIHJlY3ljbGFibGUgZW50cmllcyBmb3VuZCAqLworICB9IGVsc2UgeworICAgIHJldHVybiAoczhfdClFUlJfTUVNOworICB9CisKKyAgLyogeyBlbXB0eSBvciByZWN5Y2xhYmxlIGVudHJ5IGZvdW5kIH0gKi8KKyAgTFdJUF9BU1NFUlQoImkgPCBBUlBfVEFCTEVfU0laRSIsIGkgPCBBUlBfVEFCTEVfU0laRSk7CisKKyAgaWYgKGFycF90YWJsZVtpXS5zdGF0ZSAhPSBVTkRJQVJQX1NUQVRFX0VNUFRZKQorICB7CisgICAgc25tcF9kZWxldGVfYXJwaWR4X3RyZWUoYXJwX3RhYmxlW2ldLm5ldGlmLCAmYXJwX3RhYmxlW2ldLmlwYWRkcik7CisgIH0KKyAgLyogcmVjeWNsZSBlbnRyeSAobm8tb3AgZm9yIGFuIGFscmVhZHkgZW1wdHkgZW50cnkpICovCisgIGFycF90YWJsZVtpXS5zdGF0ZSA9IFVORElBUlBfU1RBVEVfRU1QVFk7CisKKyAgLyogSVAgYWRkcmVzcyBnaXZlbj8gKi8KKyAgaWYgKGlwYWRkciAhPSBOVUxMKSB7CisgICAgLyogc2V0IElQIGFkZHJlc3MgKi8KKyAgICBpcF9hZGRyX3NldCgmYXJwX3RhYmxlW2ldLmlwYWRkciwgaXBhZGRyKTsKKyAgfQorICBhcnBfdGFibGVbaV0uY3RpbWUgPSAwOworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICBORVRJRl9TRVRfSElOVChuZXRpZiwgaSk7CisjZWxzZSAvKiAjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UICovCisgIHVuZGlhcnBfY2FjaGVkX2VudHJ5ID0gaTsKKyNlbmRpZiAvKiAjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UICovCisgIHJldHVybiAoZXJyX3QpaTsKK30KKworCisvKioKKyAqIFNlbmQgYW4gQVJQIHJlcXVlc3QgZm9yIHRoZSBnaXZlbiBJUCBhZGRyZXNzIGFuZC9vciBxdWV1ZSBhIHBhY2tldC4KKyAqCisgKiBJZiB0aGUgSVAgYWRkcmVzcyB3YXMgbm90IHlldCBpbiB0aGUgY2FjaGUsIGEgcGVuZGluZyBBUlAgY2FjaGUgZW50cnkKKyAqIGlzIGFkZGVkIGFuZCBhbiBBUlAgcmVxdWVzdCBpcyBzZW50IGZvciB0aGUgZ2l2ZW4gYWRkcmVzcy4gVGhlIHBhY2tldAorICogaXMgcXVldWVkIG9uIHRoaXMgZW50cnkuCisgKgorICogSWYgdGhlIElQIGFkZHJlc3Mgd2FzIGFscmVhZHkgcGVuZGluZyBpbiB0aGUgY2FjaGUsIGEgbmV3IEFSUCByZXF1ZXN0CisgKiBpcyBzZW50IGZvciB0aGUgZ2l2ZW4gYWRkcmVzcy4gVGhlIHBhY2tldCBpcyBxdWV1ZWQgb24gdGhpcyBlbnRyeS4KKyAqCisgKiBJZiB0aGUgSVAgYWRkcmVzcyB3YXMgYWxyZWFkeSBzdGFibGUgaW4gdGhlIGNhY2hlLCBhbmQgYSBwYWNrZXQgaXMKKyAqIGdpdmVuLCBpdCBpcyBkaXJlY3RseSBzZW50IGFuZCBubyBBUlAgcmVxdWVzdCBpcyBzZW50IG91dC4gCisgKiAKKyAqIElmIHRoZSBJUCBhZGRyZXNzIHdhcyBhbHJlYWR5IHN0YWJsZSBpbiB0aGUgY2FjaGUsIGFuZCBubyBwYWNrZXQgaXMKKyAqIGdpdmVuLCBhbiBBUlAgcmVxdWVzdCBpcyBzZW50IG91dC4KKyAqIAorICogQHBhcmFtIG5ldGlmIFRoZSBsd0lQIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIGlwYWRkcgorICogbXVzdCBiZSBxdWVyaWVkIGZvci4KKyAqIEBwYXJhbSBpcGFkZHIgVGhlIElQIGFkZHJlc3MgdG8gYmUgcmVzb2x2ZWQuCisgKiBAcGFyYW0gcSBJZiBub24tTlVMTCwgYSBwYnVmIHRoYXQgbXVzdCBiZSBkZWxpdmVyZWQgdG8gdGhlIElQIGFkZHJlc3MuCisgKiBxIGlzIG5vdCBmcmVlZCBieSB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEBub3RlIHEgbXVzdCBvbmx5IGJlIE9ORSBwYWNrZXQsIG5vdCBhIHBhY2tldCBxdWV1ZSEKKyAqCisgKiBAcmV0dXJuCisgKiAtIEVSUl9CVUYgQ291bGQgbm90IG1ha2Ugcm9vbSBmb3IgRXRoZXJuZXQgaGVhZGVyLgorICogLSBFUlJfTUVNIEhhcmR3YXJlIGFkZHJlc3MgdW5rbm93biwgYW5kIG5vIG1vcmUgQVJQIGVudHJpZXMgYXZhaWxhYmxlCisgKiAgIHRvIHF1ZXJ5IGZvciBhZGRyZXNzIG9yIHF1ZXVlIHRoZSBwYWNrZXQuCisgKiAtIEVSUl9NRU0gQ291bGQgbm90IHF1ZXVlIHBhY2tldCBkdWUgdG8gbWVtb3J5IHNob3J0YWdlLgorICogLSBFUlJfUlRFIE5vIHJvdXRlIHRvIGRlc3RpbmF0aW9uIChubyBnYXRld2F5IHRvIGV4dGVybmFsIG5ldHdvcmtzKS4KKyAqIC0gRVJSX0FSRyBOb24tdW5pY2FzdCBhZGRyZXNzIGdpdmVuLCB0aG9zZSB3aWxsIG5vdCBhcHBlYXIgaW4gQVJQIGNhY2hlLgorICoKKyAqLworc3RhdGljIGVycl90Cit1bmRpYXJwX3F1ZXJ5KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBpcF9hZGRyICppcGFkZHIsIHN0cnVjdCBwYnVmICpxKQoreworICBlcnJfdCByZXN1bHQgPSBFUlJfTUVNOworICBzOF90IGk7IC8qIEFSUCBlbnRyeSBpbmRleCAqLworCisgIC8qIG5vbi11bmljYXN0IGFkZHJlc3M/ICovCisgIGlmIChpcF9hZGRyX2lzYnJvYWRjYXN0KGlwYWRkciwgbmV0aWYpIHx8CisgICAgICBpcF9hZGRyX2lzbXVsdGljYXN0KGlwYWRkcikgfHwKKyAgICAgIGlwX2FkZHJfaXNhbnkoaXBhZGRyKSkgeworICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJ1bmRpYXJwX3F1ZXJ5OiB3aWxsIG5vdCBhZGQgbm9uLXVuaWNhc3QgSVAgYWRkcmVzcyB0byBBUlAgY2FjaGVcbiIpKTsKKyAgICByZXR1cm4gRVJSX0FSRzsKKyAgfQorCisgIC8qIGZpbmQgZW50cnkgaW4gQVJQIGNhY2hlLCBhc2sgdG8gY3JlYXRlIGVudHJ5IGlmIHF1ZXVlaW5nIHBhY2tldCAqLworI2lmIExXSVBfTkVUSUZfSFdBRERSSElOVAorICBpID0gZmluZF9lbnRyeShpcGFkZHIsIFVORElBUlBfVFJZX0hBUkQsIG5ldGlmKTsKKyNlbHNlIC8qIExXSVBfTkVUSUZfSFdBRERSSElOVCAqLworICBpID0gZmluZF9lbnRyeShpcGFkZHIsIFVORElBUlBfVFJZX0hBUkQpOworI2VuZGlmIC8qIExXSVBfTkVUSUZfSFdBRERSSElOVCAqLworCisgIC8qIGNvdWxkIG5vdCBmaW5kIG9yIGNyZWF0ZSBlbnRyeT8gKi8KKyAgaWYgKGkgPCAwKSB7CisgICAgTFdJUF9ERUJVR0YoVU5ESUlGX0FSUF9ERUJVRyB8IFVORElJRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInVuZGlhcnBfcXVlcnk6IGNvdWxkIG5vdCBjcmVhdGUgQVJQIGVudHJ5XG4iKSk7CisgICAgaWYgKHEpIHsKKyAgICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJ1bmRpYXJwX3F1ZXJ5OiBwYWNrZXQgZHJvcHBlZFxuIikpOworICAgICAgRVRIQVJQX1NUQVRTX0lOQyhldGhhcnAubWVtZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIChlcnJfdClpOworICB9CisKKyAgLyogbWFyayBhIGZyZXNoIGVudHJ5IGFzIHBlbmRpbmcgKHdlIGp1c3Qgc2VudCBhIHJlcXVlc3QpICovCisgIGlmIChhcnBfdGFibGVbaV0uc3RhdGUgPT0gVU5ESUFSUF9TVEFURV9FTVBUWSkgeworICAgIGFycF90YWJsZVtpXS5zdGF0ZSA9IFVORElBUlBfU1RBVEVfUEVORElORzsKKyAgfQorCisgIC8qIHsgaSBpcyBlaXRoZXIgYSBTVEFCTEUgb3IgKG5ldyBvciBleGlzdGluZykgUEVORElORyBlbnRyeSB9ICovCisgIExXSVBfQVNTRVJUKCJhcnBfdGFibGVbaV0uc3RhdGUgPT0gUEVORElORyBvciBTVEFCTEUiLAorICAoKGFycF90YWJsZVtpXS5zdGF0ZSA9PSBVTkRJQVJQX1NUQVRFX1BFTkRJTkcpIHx8CisgICAoYXJwX3RhYmxlW2ldLnN0YXRlID09IFVORElBUlBfU1RBVEVfU1RBQkxFKSkpOworCisgIC8qIGRvIHdlIGhhdmUgYSBwZW5kaW5nIGVudHJ5PyBvciBhbiBpbXBsaWNpdCBxdWVyeSByZXF1ZXN0PyAqLworICBpZiAoKGFycF90YWJsZVtpXS5zdGF0ZSA9PSBVTkRJQVJQX1NUQVRFX1BFTkRJTkcpIHx8IChxID09IE5VTEwpKSB7CisgICAgLyogdHJ5IHRvIHJlc29sdmUgaXQ7IHNlbmQgb3V0IEFSUCByZXF1ZXN0ICovCisgICAgcmVzdWx0ID0gdW5kaWFycF9yZXF1ZXN0KG5ldGlmLCBpcGFkZHIpOworICAgIGlmIChyZXN1bHQgIT0gRVJSX09LKSB7CisgICAgICAvKiBBUlAgcmVxdWVzdCBjb3VsZG4ndCBiZSBzZW50ICovCisgICAgICAvKiBXZSBkb24ndCByZS1zZW5kIGFycCByZXF1ZXN0IGluIHVuZGlhcnBfdG1yLCBidXQgd2Ugc3RpbGwgcXVldWUgcGFja2V0cywKKyAgICAgICAgIHNpbmNlIHRoaXMgZmFpbHVyZSBjb3VsZCBiZSB0ZW1wb3JhcnksIGFuZCB0aGUgbmV4dCBwYWNrZXQgY2FsbGluZworICAgICAgICAgZXRoYXJwX3F1ZXJ5IGFnYWluIGNvdWxkIGxlYWQgdG8gc2VuZGluZyB0aGUgcXVldWVkIHBhY2tldHMuICovCisgICAgfQorICB9CisgIAorICAvKiBwYWNrZXQgZ2l2ZW4/ICovCisgIGlmIChxICE9IE5VTEwpIHsKKyAgICAvKiBzdGFibGUgZW50cnk/ICovCisgICAgaWYgKGFycF90YWJsZVtpXS5zdGF0ZSA9PSBVTkRJQVJQX1NUQVRFX1NUQUJMRSkgeworICAgICAgLyogd2UgaGF2ZSBhIHZhbGlkIElQLT5oYXJkd2FyZSBhZGRyZXNzIG1hcHBpbmcgKi8KKyAgICAgIC8qIHNlbmQgdGhlIHBhY2tldCAqLworICAgICAgcmVzdWx0ID0gdW5kaV9zZW5kX2lwKG5ldGlmLCBxLCAmKGFycF90YWJsZVtpXS5od2FkZHIpKTsKKyAgICAvKiBwZW5kaW5nIGVudHJ5PyAoZWl0aGVyIGp1c3QgY3JlYXRlZCBvciBhbHJlYWR5IHBlbmRpbmcgKi8KKyAgICB9IGVsc2UgaWYgKGFycF90YWJsZVtpXS5zdGF0ZSA9PSBVTkRJQVJQX1NUQVRFX1BFTkRJTkcpIHsKKyNpZiBBUlBfUVVFVUVJTkcgLyogcXVldWUgdGhlIGdpdmVuIHEgcGFja2V0ICovCisgICAgICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgICAgIGludCBjb3B5X25lZWRlZCA9IDA7CisgICAgICAvKiBJRiBxIGluY2x1ZGVzIGEgUEJVRl9SRUYsIFBCVUZfUE9PTCBvciBQQlVGX1JBTSwgd2UgaGF2ZSBubyBjaG9pY2UgYnV0CisgICAgICAgKiB0byBjb3B5IHRoZSB3aG9sZSBxdWV1ZSBpbnRvIGEgbmV3IFBCVUZfUkFNIChzZWUgYnVnICMxMTQwMCkgCisgICAgICAgKiBQQlVGX1JPTXMgY2FuIGJlIGxlZnQgYXMgdGhleSBhcmUsIHNpbmNlIFJPTSBtdXN0IG5vdCBnZXQgY2hhbmdlZC4gKi8KKyAgICAgIHAgPSBxOworICAgICAgd2hpbGUgKHApIHsKKyAgICAgICAgTFdJUF9BU1NFUlQoIm5vIHBhY2tldCBxdWV1ZXMgYWxsb3dlZCEiLCAocC0+bGVuICE9IHAtPnRvdF9sZW4pIHx8IChwLT5uZXh0ID09IDApKTsKKyAgICAgICAgaWYocC0+dHlwZSAhPSBQQlVGX1JPTSkgeworICAgICAgICAgIGNvcHlfbmVlZGVkID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgIH0KKyAgICAgIGlmKGNvcHlfbmVlZGVkKSB7CisgICAgICAgIC8qIGNvcHkgdGhlIHdob2xlIHBhY2tldCBpbnRvIG5ldyBwYnVmcyAqLworICAgICAgICBwID0gcGJ1Zl9hbGxvYyhQQlVGX1JBVywgcC0+dG90X2xlbiwgUEJVRl9SQU0pOworICAgICAgICBpZihwICE9IE5VTEwpIHsKKyAgICAgICAgICBpZiAocGJ1Zl9jb3B5KHAsIHEpICE9IEVSUl9PSykgeworICAgICAgICAgICAgcGJ1Zl9mcmVlKHApOworICAgICAgICAgICAgcCA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiByZWZlcmVuY2luZyB0aGUgb2xkIHBidWYgaXMgZW5vdWdoICovCisgICAgICAgIHAgPSBxOworICAgICAgICBwYnVmX3JlZihwKTsKKyAgICAgIH0KKyAgICAgIC8qIHBhY2tldCBjb3VsZCBiZSB0YWtlbiBvdmVyPyAqLworICAgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICAvKiBxdWV1ZSBwYWNrZXQgLi4uICovCisgICAgICAgIHN0cnVjdCBldGhhcnBfcV9lbnRyeSAqbmV3X2VudHJ5OworICAgICAgICAvKiBhbGxvY2F0ZSBhIG5ldyBhcnAgcXVldWUgZW50cnkgKi8KKyAgICAgICAgbmV3X2VudHJ5ID0gbWVtcF9tYWxsb2MoTUVNUF9BUlBfUVVFVUUpOworICAgICAgICBpZiAobmV3X2VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICBuZXdfZW50cnktPm5leHQgPSAwOworICAgICAgICAgIG5ld19lbnRyeS0+cCA9IHA7CisgICAgICAgICAgaWYoYXJwX3RhYmxlW2ldLnEgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogcXVldWUgd2FzIGFscmVhZHkgZXhpc3RlbnQsIGFwcGVuZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSBlbmQgKi8KKyAgICAgICAgICAgIHN0cnVjdCBldGhhcnBfcV9lbnRyeSAqcjsKKyAgICAgICAgICAgIHIgPSBhcnBfdGFibGVbaV0ucTsKKyAgICAgICAgICAgIHdoaWxlIChyLT5uZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgciA9IHItPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByLT5uZXh0ID0gbmV3X2VudHJ5OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBxdWV1ZSBkaWQgbm90IGV4aXN0LCBmaXJzdCBpdGVtIGluIHF1ZXVlICovCisgICAgICAgICAgICBhcnBfdGFibGVbaV0ucSA9IG5ld19lbnRyeTsKKyAgICAgICAgICB9CisgICAgICAgICAgTFdJUF9ERUJVR0YoVU5ESUlGX0FSUF9ERUJVRyB8IFVORElJRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInVuZGlhcnBfcXVlcnk6IHF1ZXVlZCBwYWNrZXQgJXAgb24gQVJQIGVudHJ5ICUiUzE2X0YiXG4iLCAodm9pZCAqKXEsIChzMTZfdClpKSk7CisgICAgICAgICAgcmVzdWx0ID0gRVJSX09LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIHRoZSBwb29sIE1FTVBfQVJQX1FVRVVFIGlzIGVtcHR5ICovCisgICAgICAgICAgcGJ1Zl9mcmVlKHApOworICAgICAgICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJ1bmRpYXJwX3F1ZXJ5OiBjb3VsZCBub3QgcXVldWUgYSBjb3B5IG9mIFBCVUZfUkVGIHBhY2tldCAlcCAob3V0IG9mIG1lbW9yeSlcbiIsICh2b2lkICopcSkpOworICAgICAgICAgIC8qIHsgcmVzdWx0ID09IEVSUl9NRU0gfSB0aHJvdWdoIGluaXRpYWxpemF0aW9uICovCisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLm1lbWVycik7CisgICAgICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJ1bmRpYXJwX3F1ZXJ5OiBjb3VsZCBub3QgcXVldWUgYSBjb3B5IG9mIFBCVUZfUkVGIHBhY2tldCAlcCAob3V0IG9mIG1lbW9yeSlcbiIsICh2b2lkICopcSkpOworICAgICAgICAvKiB7IHJlc3VsdCA9PSBFUlJfTUVNIH0gdGhyb3VnaCBpbml0aWFsaXphdGlvbiAqLworICAgICAgfQorI2Vsc2UgLyogQVJQX1FVRVVFSU5HID09IDAgKi8KKyAgICAgIC8qIHEgJiYgc3RhdGUgPT0gUEVORElORyAmJiBBUlBfUVVFVUVJTkcgPT0gMCA9PiByZXN1bHQgPSBFUlJfTUVNICovCisgICAgICAvKiB7IHJlc3VsdCA9PSBFUlJfTUVNIH0gdGhyb3VnaCBpbml0aWFsaXphdGlvbiAqLworICAgICAgTFdJUF9ERUJVR0YoVU5ESUlGX0FSUF9ERUJVRyB8IFVORElJRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInVuZGlhcnBfcXVlcnk6IEV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MgdW5rbm93biwgcXVldWVpbmcgZGlzYWJsZWQsIHBhY2tldCAlcCBkcm9wcGVkXG4iLCAodm9pZCAqKXEpKTsKKyNlbmRpZgorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlc29sdmUgYW5kIGZpbGwtaW4gYWRkcmVzcyBoZWFkZXIgZm9yIG91dGdvaW5nIElQIHBhY2tldC4KKyAqCisgKiBGb3IgSVAgbXVsdGljYXN0IGFuZCBicm9hZGNhc3QsIGNvcnJlc3BvbmRpbmcgRXRoZXJuZXQgYWRkcmVzc2VzCisgKiBhcmUgc2VsZWN0ZWQgYW5kIHRoZSBwYWNrZXQgaXMgdHJhbnNtaXR0ZWQgb24gdGhlIGxpbmsuCisgKgorICogRm9yIHVuaWNhc3QgYWRkcmVzc2VzLCB0aGUgcGFja2V0IGlzIHN1Ym1pdHRlZCB0byBldGhhcnBfcXVlcnkoKS4gSW4KKyAqIGNhc2UgdGhlIElQIGFkZHJlc3MgaXMgb3V0c2lkZSB0aGUgbG9jYWwgbmV0d29yaywgdGhlIElQIGFkZHJlc3Mgb2YKKyAqIHRoZSBnYXRld2F5IGlzIHVzZWQuCisgKgorICogQHBhcmFtIG5ldGlmIFRoZSBsd0lQIG5ldHdvcmsgaW50ZXJmYWNlIHdoaWNoIHRoZSBJUCBwYWNrZXQgd2lsbCBiZSBzZW50IG9uLgorICogQHBhcmFtIHEgVGhlIHBidWYocykgY29udGFpbmluZyB0aGUgSVAgcGFja2V0IHRvIGJlIHNlbnQuCisgKiBAcGFyYW0gaXBhZGRyIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgZGVzdGluYXRpb24uCisgKgorICogQHJldHVybgorICogLSBFUlJfUlRFIE5vIHJvdXRlIHRvIGRlc3RpbmF0aW9uIChubyBnYXRld2F5IHRvIGV4dGVybmFsIG5ldHdvcmtzKSwKKyAqIG9yIHRoZSByZXR1cm4gdHlwZSBvZiBlaXRoZXIgZXRoYXJwX3F1ZXJ5KCkgb3IgZXRoYXJwX3NlbmRfaXAoKS4KKyAqLworc3RhdGljIGVycl90Cit1bmRpYXJwX291dHB1dChzdHJ1Y3QgbmV0aWYgKm5ldGlmLCBzdHJ1Y3QgcGJ1ZiAqcSwgc3RydWN0IGlwX2FkZHIgKmlwYWRkcikKK3sKKyAgc3RhdGljIF9fbG93bWVtIHRfUFhFTlZfVU5ESV9HRVRfTUNBU1RfQUREUiBnZXRfbWNhc3Q7CisgIGh3YWRkcl90ICpkZXN0OworCisgIGlmICh1bmRpX2lzX2V0aGVybmV0KG5ldGlmKSkKKyAgICByZXR1cm4gZXRoYXJwX291dHB1dChuZXRpZiwgcSwgaXBhZGRyKTsKKworICAvKiBBc3N1bWUgdW5yZXNvbHZlZCBoYXJkd2FyZSBhZGRyZXNzICovCisgIGRlc3QgPSBOVUxMOworCisgIC8qIERldGVybWluZSBvbiBkZXN0aW5hdGlvbiBoYXJkd2FyZSBhZGRyZXNzLiBCcm9hZGNhc3RzIGFuZCBtdWx0aWNhc3RzCisgICAqIGFyZSBzcGVjaWFsLCBvdGhlciBJUCBhZGRyZXNzZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgQVJQIHRhYmxlLgorICAgKi8KKyAgaWYgKGlwX2FkZHJfaXNicm9hZGNhc3QoaXBhZGRyLCBuZXRpZikpIHsKKyAgICBkZXN0ID0gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcF9hZGRyX2lzbXVsdGljYXN0KGlwYWRkcikpIHsKKyAgICBtZW1zZXQoJmdldF9tY2FzdCwgMCwgc2l6ZW9mIGdldF9tY2FzdCk7CisgICAgbWVtY3B5KCZnZXRfbWNhc3QuSW5ldEFkZHIsIGlwYWRkciwgc2l6ZW9mKGdldF9tY2FzdC5JbmV0QWRkcikpOworICAgIHB4ZV9jYWxsKFBYRU5WX1VORElfR0VUX01DQVNUX0FERFIsICZnZXRfbWNhc3QpOworICAgIGRlc3QgPSAoaHdhZGRyX3QgKikmZ2V0X21jYXN0Lk1lZGlhQWRkcjsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBvdXRzaWRlIGxvY2FsIG5ldHdvcms/ICovCisgICAgaWYgKCFpcF9hZGRyX25ldGNtcChpcGFkZHIsICZuZXRpZi0+aXBfYWRkciwgJm5ldGlmLT5uZXRtYXNrKSkgeworICAgICAgLyogaW50ZXJmYWNlIGhhcyBkZWZhdWx0IGdhdGV3YXk/ICovCisgICAgICBpZiAobmV0aWYtPmd3LmFkZHIgIT0gMCkgeworICAgICAgICAvKiBzZW5kIHRvIGhhcmR3YXJlIGFkZHJlc3Mgb2YgZGVmYXVsdCBnYXRld2F5IElQIGFkZHJlc3MgKi8KKyAgICAgICAgaXBhZGRyID0gJihuZXRpZi0+Z3cpOworICAgICAgLyogbm8gZGVmYXVsdCBnYXRld2F5IGF2YWlsYWJsZSAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbm8gcm91dGUgdG8gZGVzdGluYXRpb24gZXJyb3IgKGRlZmF1bHQgZ2F0ZXdheSBtaXNzaW5nKSAqLworICAgICAgICByZXR1cm4gRVJSX1JURTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogcXVldWUgb24gZGVzdGluYXRpb24gRXRoZXJuZXQgYWRkcmVzcyBiZWxvbmdpbmcgdG8gaXBhZGRyICovCisgICAgcmV0dXJuIHVuZGlhcnBfcXVlcnkobmV0aWYsIGlwYWRkciwgcSk7CisgIH0KKyAgCisgIC8qIGNvbnRpbnVhdGlvbiBmb3IgbXVsdGljYXN0L2Jyb2FkY2FzdCBkZXN0aW5hdGlvbnMgKi8KKyAgLyogb2J0YWluIHNvdXJjZSBFdGhlcm5ldCBhZGRyZXNzIG9mIHRoZSBnaXZlbiBpbnRlcmZhY2UgKi8KKyAgLyogc2VuZCBwYWNrZXQgZGlyZWN0bHkgb24gdGhlIGxpbmsgKi8KKyAgcmV0dXJuIHVuZGlfc2VuZF9pcChuZXRpZiwgcSwgZGVzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9wYWNrZXRfZnJhZ21lbnQodF9QWEVOVl9VTkRJX0lTUiAqaXNyKQoreworICBkbyB7CisgICAgaXNyLT5GdW5jRmxhZyA9IFBYRU5WX1VORElfSVNSX0lOX0dFVF9ORVhUOworICAgIHB4ZV9jYWxsKFBYRU5WX1VORElfSVNSLCAmaXNyKTsKKyAgfSB3aGlsZSAoaXNyLT5GdW5jRmxhZyAhPSBQWEVOVl9VTkRJX0lTUl9PVVRfUkVDRUlWRSk7Cit9CisKKy8qKgorICogU2hvdWxkIGFsbG9jYXRlIGEgcGJ1ZiBhbmQgdHJhbnNmZXIgdGhlIGJ5dGVzIG9mIHRoZSBpbmNvbWluZworICogcGFja2V0IGZyb20gdGhlIGludGVyZmFjZSBpbnRvIHRoZSBwYnVmLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbHdpcCBuZXR3b3JrIGludGVyZmFjZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgdW5kaWlmCisgKiBAcmV0dXJuIGEgcGJ1ZiBmaWxsZWQgd2l0aCB0aGUgcmVjZWl2ZWQgcGFja2V0IChpbmNsdWRpbmcgTUFDIGhlYWRlcikKKyAqICAgICAgICAgTlVMTCBvbiBtZW1vcnkgZXJyb3IKKyAqLworc3RhdGljIHN0cnVjdCBwYnVmICoKK2xvd19sZXZlbF9pbnB1dCh0X1BYRU5WX1VORElfSVNSICppc3IpCit7CisgIHN0cnVjdCBwYnVmICpwLCAqcTsKKyAgY29uc3QgY2hhciAqcjsKKyAgaW50IGxlbjsKKworICAvKiBPYnRhaW4gdGhlIHNpemUgb2YgdGhlIHBhY2tldCBhbmQgcHV0IGl0IGludG8gdGhlICJsZW4iCisgICAgIHZhcmlhYmxlLiAqLworICBsZW4gPSBpc3ItPkZyYW1lTGVuZ3RoOworCisgIC8vcHJpbnRmKCJ1bmRpaWZfaW5wdXQsIGxlbiA9ICVkXG4iLCBsZW4pOworCisgIC8qIFdlIGFsbG9jYXRlIGEgcGJ1ZiBjaGFpbiBvZiBwYnVmcyBmcm9tIHRoZSBwb29sLiAqLworICBwID0gcGJ1Zl9hbGxvYyhQQlVGX1JBVywgbGVuLCBQQlVGX1BPT0wpOworCisgIGlmIChwICE9IE5VTEwpIHsKKyAgICAvKgorICAgICAqIFdlIGl0ZXJhdGUgb3ZlciB0aGUgcGJ1ZiBjaGFpbiB1bnRpbCB3ZSBoYXZlIHJlYWQgdGhlIGVudGlyZQorICAgICAqIHBhY2tldCBpbnRvIHRoZSBwYnVmLgorICAgICAqLworICAgIHIgPSBHRVRfUFRSKGlzci0+RnJhbWUpOworICAgIGZvciAocSA9IHA7IHEgIT0gTlVMTDsgcSA9IHEtPm5leHQpIHsKKyAgICAgIC8qCisgICAgICAgKiBSZWFkIGVub3VnaCBieXRlcyB0byBmaWxsIHRoaXMgcGJ1ZiBpbiB0aGUgY2hhaW4uIFRoZQorICAgICAgICogYXZhaWxhYmxlIGRhdGEgaW4gdGhlIHBidWYgaXMgZ2l2ZW4gYnkgdGhlIHEtPmxlbgorICAgICAgICogdmFyaWFibGUuCisgICAgICAgKi8KKyAgICAgIGNoYXIgKnMgPSBxLT5wYXlsb2FkOworICAgICAgaW50IHFsID0gcS0+bGVuOworCisgICAgICB3aGlsZSAocWwpIHsKKwlpbnQgcWIgPSBpc3ItPkJ1ZmZlckxlbmd0aCA8IHFsID8gaXNyLT5CdWZmZXJMZW5ndGggOiBxbDsKKworCWlmICghcWIpIHsKKwkgIC8qCisJICAgKiBPbmx5IHJlY2VpdmVkIGEgcGFydGlhbCBmcmFtZSwgbXVzdCBnZXQgdGhlIG5leHQgb25lLi4uCisJICAgKi8KKwkgIGdldF9wYWNrZXRfZnJhZ21lbnQoaXNyKTsKKwkgIHIgPSBHRVRfUFRSKGlzci0+RnJhbWUpOworCX0gZWxzZSB7CisJICBtZW1jcHkocywgciwgcWIpOworCSAgcyArPSBxYjsKKwkgIHIgKz0gcWI7CisJICBxbCAtPSBxYjsKKwl9CisgICAgICB9CisgICAgfQorCisgICAgTElOS19TVEFUU19JTkMobGluay5yZWN2KTsKKyAgfSBlbHNlIHsKKyAgICAvKgorICAgICAqIERyb3BwZWQgcGFja2V0OiB3ZSByZWFsbHkgc2hvdWxkIG1ha2Ugc3VyZSB3ZSBkcmFpbiBhbnkgcGFydGlhbAorICAgICAqIGZyYW1lIGhlcmUuLi4KKyAgICAgKi8KKyAgICB3aGlsZSAoKGxlbiAtPSBpc3ItPkJ1ZmZlckxlbmd0aCkgPiAwKQorICAgICAgZ2V0X3BhY2tldF9mcmFnbWVudChpc3IpOworCisgICAgTElOS19TVEFUU19JTkMobGluay5tZW1lcnIpOworICAgIExJTktfU1RBVFNfSU5DKGxpbmsuZHJvcCk7CisgIH0KKworICByZXR1cm4gcDsKK30KKworCisvKioKKyAqIFVwZGF0ZSAob3IgaW5zZXJ0KSBhIElQL01BQyBhZGRyZXNzIHBhaXIgaW4gdGhlIEFSUCBjYWNoZS4KKyAqCisgKiBJZiBhIHBlbmRpbmcgZW50cnkgaXMgcmVzb2x2ZWQsIGFueSBxdWV1ZWQgcGFja2V0cyB3aWxsIGJlIHNlbnQKKyAqIGF0IHRoaXMgcG9pbnQuCisgKiAKKyAqIEBwYXJhbSBpcGFkZHIgSVAgYWRkcmVzcyBvZiB0aGUgaW5zZXJ0ZWQgQVJQIGVudHJ5LgorICogQHBhcmFtIGV0aGFkZHIgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgaW5zZXJ0ZWQgQVJQIGVudHJ5LgorICogQHBhcmFtIGZsYWdzIERlZmluZXMgYmVoYXZpb3VyOgorICogLSBFVEhBUlBfVFJZX0hBUkQgQWxsb3dzIEFSUCB0byBpbnNlcnQgdGhpcyBhcyBhIG5ldyBpdGVtLiBJZiBub3Qgc3BlY2lmaWVkLAorICogb25seSBleGlzdGluZyBBUlAgZW50cmllcyB3aWxsIGJlIHVwZGF0ZWQuCisgKgorICogQHJldHVybgorICogLSBFUlJfT0sgU3VjY2VzZnVsbHkgdXBkYXRlZCBBUlAgY2FjaGUuCisgKiAtIEVSUl9NRU0gSWYgd2UgY291bGQgbm90IGFkZCBhIG5ldyBBUlAgZW50cnkgd2hlbiBFVEhBUlBfVFJZX0hBUkQgd2FzIHNldC4KKyAqIC0gRVJSX0FSRyBOb24tdW5pY2FzdCBhZGRyZXNzIGdpdmVuLCB0aG9zZSB3aWxsIG5vdCBhcHBlYXIgaW4gQVJQIGNhY2hlLgorICoKKyAqIEBzZWUgcGJ1Zl9mcmVlKCkKKyAqLworc3RhdGljIGVycl90Cit1cGRhdGVfYXJwX2VudHJ5KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBpcF9hZGRyICppcGFkZHIsCisJCSBod2FkZHJfdCAqbGxhZGRyLCB1OF90IGZsYWdzKQoreworICBzOF90IGk7CisgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJ1bmRpaWY6dXBkYXRlX2FycF9lbnRyeSgpXG4iKSk7CisgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJ1bmRpaWY6dXBkYXRlX2FycF9lbnRyeTogJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIuJSJVMTZfRiIgLSAlMDIiWDE2X0YiOiUwMiJYMTZfRiI6JTAyIlgxNl9GIjolMDIiWDE2X0YiOiUwMiJYMTZfRiI6JTAyIlgxNl9GIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcDRfYWRkcjEoaXBhZGRyKSwgaXA0X2FkZHIyKGlwYWRkciksIGlwNF9hZGRyMyhpcGFkZHIpLCBpcDRfYWRkcjQoaXBhZGRyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpsbGFkZHIpWzBdLCAoKmxsYWRkcilbMV0sICgqbGxhZGRyKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmxsYWRkcilbM10sICgqbGxhZGRyKVs0XSwgKCpsbGFkZHIpWzVdKSk7CisgIC8qIG5vbi11bmljYXN0IGFkZHJlc3M/ICovCisgIGlmIChpcF9hZGRyX2lzYW55KGlwYWRkcikgfHwKKyAgICAgIGlwX2FkZHJfaXNicm9hZGNhc3QoaXBhZGRyLCBuZXRpZikgfHwKKyAgICAgIGlwX2FkZHJfaXNtdWx0aWNhc3QoaXBhZGRyKSkgeworICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSwgKCJ1bmRpaWY6dXBkYXRlX2FycF9lbnRyeTogd2lsbCBub3QgYWRkIG5vbi11bmljYXN0IElQIGFkZHJlc3MgdG8gQVJQIGNhY2hlXG4iKSk7CisgICAgcmV0dXJuIEVSUl9BUkc7CisgIH0KKyAgLyogZmluZCBvciBjcmVhdGUgQVJQIGVudHJ5ICovCisjaWYgTFdJUF9ORVRJRl9IV0FERFJISU5UCisgIGkgPSBmaW5kX2VudHJ5KGlwYWRkciwgZmxhZ3MsIG5ldGlmKTsKKyNlbHNlIC8qIExXSVBfTkVUSUZfSFdBRERSSElOVCAqLworICBpID0gZmluZF9lbnRyeShpcGFkZHIsIGZsYWdzKTsKKyNlbmRpZiAvKiBMV0lQX05FVElGX0hXQUREUkhJTlQgKi8KKyAgLyogYmFpbCBvdXQgaWYgbm8gZW50cnkgY291bGQgYmUgZm91bmQgKi8KKyAgaWYgKGkgPCAwKQorICAgIHJldHVybiAoZXJyX3QpaTsKKyAgCisgIC8qIG1hcmsgaXQgc3RhYmxlICovCisgIGFycF90YWJsZVtpXS5zdGF0ZSA9IFVORElBUlBfU1RBVEVfU1RBQkxFOworICAvKiByZWNvcmQgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgYXJwX3RhYmxlW2ldLm5ldGlmID0gbmV0aWY7CisKKyAgLyogaW5zZXJ0IGluIFNOTVAgQVJQIGluZGV4IHRyZWUgKi8KKyAgc25tcF9pbnNlcnRfYXJwaWR4X3RyZWUobmV0aWYsICZhcnBfdGFibGVbaV0uaXBhZGRyKTsKKworICBMV0lQX0RFQlVHRihVTkRJSUZfQVJQX0RFQlVHIHwgVU5ESUlGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidW5kaWlmOnVwZGF0ZV9hcnBfZW50cnk6IHVwZGF0aW5nIHN0YWJsZSBlbnRyeSAlIlMxNl9GIlxuIiwgKHMxNl90KWkpKTsKKyAgLyogdXBkYXRlIGFkZHJlc3MgKi8KKyAgbWVtY3B5KGFycF90YWJsZVtpXS5od2FkZHIsIGxsYWRkciwgbmV0aWYtPmh3YWRkcl9sZW4pOworCisgIC8qIHJlc2V0IHRpbWUgc3RhbXAgKi8KKyAgYXJwX3RhYmxlW2ldLmN0aW1lID0gMDsKKyNpZiBBUlBfUVVFVUVJTkcKKyAgLyogdGhpcyBpcyB3aGVyZSB3ZSB3aWxsIHNlbmQgb3V0IHF1ZXVlZCBwYWNrZXRzISAqLworICB3aGlsZSAoYXJwX3RhYmxlW2ldLnEgIT0gTlVMTCkgeworICAgIHN0cnVjdCBwYnVmICpwOworICAgIC8qIHJlbWVtYmVyIHJlbWFpbmRlciBvZiBxdWV1ZSAqLworICAgIHN0cnVjdCBldGhhcnBfcV9lbnRyeSAqcSA9IGFycF90YWJsZVtpXS5xOworICAgIC8qIHBvcCBmaXJzdCBpdGVtIG9mZiB0aGUgcXVldWUgKi8KKyAgICBhcnBfdGFibGVbaV0ucSA9IHEtPm5leHQ7CisgICAgLyogZ2V0IHRoZSBwYWNrZXQgcG9pbnRlciAqLworICAgIHAgPSBxLT5wOworICAgIC8qIG5vdyBxdWV1ZSBlbnRyeSBjYW4gYmUgZnJlZWQgKi8KKyAgICBtZW1wX2ZyZWUoTUVNUF9BUlBfUVVFVUUsIHEpOworICAgIC8qIHNlbmQgdGhlIHF1ZXVlZCBJUCBwYWNrZXQgKi8KKyAgICB1bmRpX3NlbmRfaXAobmV0aWYsIHAsIGxsYWRkcik7CisgICAgLyogZnJlZSB0aGUgcXVldWVkIElQIHBhY2tldCAqLworICAgIHBidWZfZnJlZShwKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBFUlJfT0s7Cit9CisKKy8qKgorICogUmVzcG9uZHMgdG8gQVJQIHJlcXVlc3RzIHRvIHVzLiBVcG9uIEFSUCByZXBsaWVzIHRvIHVzLCBhZGQgZW50cnkgdG8gY2FjaGUgIAorICogc2VuZCBvdXQgcXVldWVkIElQIHBhY2tldHMuIFVwZGF0ZXMgY2FjaGUgd2l0aCBzbm9vcGVkIGFkZHJlc3MgcGFpcnMuCisgKgorICogU2hvdWxkIGJlIGNhbGxlZCBmb3IgaW5jb21pbmcgQVJQIHBhY2tldHMuIFRoZSBwYnVmIGluIHRoZSBhcmd1bWVudAorICogaXMgZnJlZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gbmV0aWYgVGhlIGx3SVAgbmV0d29yayBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIEFSUCBwYWNrZXQgcGJ1ZiBhcnJpdmVkLgorICogQHBhcmFtIGV0aGFkZHIgRXRoZXJuZXQgYWRkcmVzcyBvZiBuZXRpZi4KKyAqIEBwYXJhbSBwIFRoZSBBUlAgcGFja2V0IHRoYXQgYXJyaXZlZCBvbiBuZXRpZi4gSXMgZnJlZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcmV0dXJuIE5VTEwKKyAqCisgKiBAc2VlIHBidWZfZnJlZSgpCisgKi8KK3N0YXRpYyB2b2lkCit1bmRpYXJwX2lucHV0KHN0cnVjdCBuZXRpZiAqbmV0aWYsIHN0cnVjdCBwYnVmICpwKQoreworICBzdHJ1Y3QgYXJwX2hkciAqaGRyOworICAvKiB0aGVzZSBhcmUgYWxpZ25lZCBwcm9wZXJseSwgd2hlcmVhcyB0aGUgQVJQIGhlYWRlciBmaWVsZHMgbWlnaHQgbm90IGJlICovCisgIHN0cnVjdCBpcF9hZGRyIHNpcGFkZHIsIGRpcGFkZHI7CisgIGh3YWRkcl90IGh3YWRkcl9yZW1vdGU7CisgIHU4X3QgKmhkcl9wdHI7CisgIHU4X3QgZm9yX3VzOworCisgIExXSVBfRVJST1IoIm5ldGlmICE9IE5VTEwiLCAobmV0aWYgIT0gTlVMTCksIHJldHVybjspOworICAKKyAgLyogZHJvcCBzaG9ydCBBUlAgcGFja2V0czogd2UgaGF2ZSB0byBjaGVjayBmb3IgcC0+bGVuIGluc3RlYWQgb2YgcC0+dG90X2xlbiBoZXJlCisgICAgIHNpbmNlIGEgc3RydWN0IGFycF9oZHIgaXMgcG9pbnRlZCB0byBwLT5wYXlsb2FkLCBzbyBpdCBtdXNuJ3QgYmUgY2hhaW5lZCEgKi8KKyAgaWYgKHAtPmxlbiA8IGFycF9oZHJfbGVuKG5ldGlmKSkgeworICAgIExXSVBfREVCVUdGKFVORElJRl9BUlBfREVCVUcgfCBVTkRJSUZfREVCVUcgfCBMV0lQX0RCR19UUkFDRSB8IExXSVBfREJHX0xFVkVMX1dBUk5JTkcsCisgICAgICAoInVuZGlhcnBfaW5wdXQ6IHBhY2tldCBkcm9wcGVkLCB0b28gc2hvcnQgKCUiUzE2X0YiLyUiUzE2X0YiKVxuIiwgcC0+dG90X2xlbiwKKyAgICAgIChzMTZfdClTSVpFT0ZfRVRIQVJQX1BBQ0tFVCkpOworICAgIHByaW50Zigic2hvcnQgYXJwIHBhY2tldFxuIik7CisgICAgRVRIQVJQX1NUQVRTX0lOQyhldGhhcnAubGVuZXJyKTsKKyAgICBFVEhBUlBfU1RBVFNfSU5DKGV0aGFycC5kcm9wKTsKKyAgICBwYnVmX2ZyZWUocCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaGRyID0gcC0+cGF5bG9hZDsKKyAgLyogUkZDIDgyNiAiUGFja2V0IFJlY2VwdGlvbiI6ICovCisgIGlmICgoaGRyLT5od3R5cGUgIT0gaHRvbnMoTUFDX3R5cGUpKSB8fAorICAgICAgKGhkci0+aHdsZW4gIT0gbmV0aWYtPmh3YWRkcl9sZW4pIHx8CisgICAgICAoaGRyLT5wcm90b2xlbiAhPSBzaXplb2Yoc3RydWN0IGlwX2FkZHIpKSB8fAorICAgICAgKGhkci0+cHJvdG8gIT0gaHRvbnMoRVRIVFlQRV9JUCkpKSB7CisgICAgTFdJUF9ERUJVR0YoVU5ESUlGX0FSUF9ERUJVRyB8IFVORElJRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFIHwgTFdJUF9EQkdfTEVWRUxfV0FSTklORywKKyAgICAgICgidW5kaWFycF9pbnB1dDogcGFja2V0IGRyb3BwZWQsIHdyb25nIGh3IHR5cGUsIGh3bGVuLCBwcm90bywgb3IgcHJvdG9sZW4gKCUiVTE2X0YiLyUiVTE2X0YiLyUiVTE2X0YiLyUiVTE2X0YiLyUiVTE2X0YiKVxuIiwKKyAgICAgIGhkci0+aHd0eXBlLCBoZHItPmh3bGVuLCBoZHItPnByb3RvLCBoZHItPnByb3RvbGVuKSk7CisgICAgRVRIQVJQX1NUQVRTX0lOQyhldGhhcnAucHJvdGVycik7CisgICAgRVRIQVJQX1NUQVRTX0lOQyhldGhhcnAuZHJvcCk7CisgICAgcHJpbnRmKCJtYWxmb3JtZWQgYXJwIHBhY2tldFxuIik7CisgICAgcGJ1Zl9mcmVlKHApOworICAgIHJldHVybjsKKyAgfQorICBFVEhBUlBfU1RBVFNfSU5DKGV0aGFycC5yZWN2KTsKKworICAvKiBDb3B5IHN0cnVjdCBpcF9hZGRyMiB0byBhbGlnbmVkIGlwX2FkZHIsIHRvIHN1cHBvcnQgY29tcGlsZXJzIHdpdGhvdXQKKyAgICogc3RydWN0dXJlIHBhY2tpbmcgKG5vdCB1c2luZyBzdHJ1Y3R1cmUgY29weSB3aGljaCBicmVha3Mgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzKS4gKi8KKyAgaGRyX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopKGhkciArIDEpOworICBtZW1jcHkoaHdhZGRyX3JlbW90ZSwgaGRyX3B0ciwgbmV0aWYtPmh3YWRkcl9sZW4pOworICBoZHJfcHRyICs9IG5ldGlmLT5od2FkZHJfbGVuOworICBtZW1jcHkoJnNpcGFkZHIsIGhkcl9wdHIsIHNpemVvZihzaXBhZGRyKSk7CisgIGhkcl9wdHIgKz0gc2l6ZW9mKHNpcGFkZHIpOworICBoZHJfcHRyICs9IG5ldGlmLT5od2FkZHJfbGVuOworICBtZW1jcHkoJmRpcGFkZHIsIGhkcl9wdHIsIHNpemVvZihkaXBhZGRyKSk7CisKKyAgLyogdGhpcyBpbnRlcmZhY2UgaXMgbm90IGNvbmZpZ3VyZWQ/ICovCisgIGlmIChuZXRpZi0+aXBfYWRkci5hZGRyID09IDApIHsKKyAgICBmb3JfdXMgPSAwOworICB9IGVsc2UgeworICAgIC8qIEFSUCBwYWNrZXQgZGlyZWN0ZWQgdG8gdXM/ICovCisgICAgZm9yX3VzID0gaXBfYWRkcl9jbXAoJmRpcGFkZHIsICYobmV0aWYtPmlwX2FkZHIpKTsKKyAgfQorCisgIC8qIEFSUCBtZXNzYWdlIGRpcmVjdGVkIHRvIHVzPyAqLworICBpZiAoZm9yX3VzKSB7CisgICAgLyogYWRkIElQIGFkZHJlc3MgaW4gQVJQIGNhY2hlOyBhc3N1bWUgcmVxdWVzdGVyIHdhbnRzIHRvIHRhbGsgdG8gdXMuCisgICAgICogY2FuIHJlc3VsdCBpbiBkaXJlY3RseSBzZW5kaW5nIHRoZSBxdWV1ZWQgcGFja2V0cyBmb3IgdGhpcyBob3N0LiAqLworICAgIHVwZGF0ZV9hcnBfZW50cnkobmV0aWYsICZzaXBhZGRyLCAmaHdhZGRyX3JlbW90ZSwgVU5ESUFSUF9UUllfSEFSRCk7CisgIC8qIEFSUCBtZXNzYWdlIG5vdCBkaXJlY3RlZCB0byB1cz8gKi8KKyAgfSBlbHNlIHsKKyAgICAvKiB1cGRhdGUgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIGluIHRoZSBjYWNoZSwgaWYgcHJlc2VudCAqLworICAgIHVwZGF0ZV9hcnBfZW50cnkobmV0aWYsICZzaXBhZGRyLCAmaHdhZGRyX3JlbW90ZSwgMCk7CisgIH0KKworICAvKiBub3cgYWN0IG9uIHRoZSBtZXNzYWdlIGl0c2VsZiAqLworICBzd2l0Y2ggKGh0b25zKGhkci0+b3Bjb2RlKSkgeworICAvKiBBUlAgcmVxdWVzdD8gKi8KKyAgY2FzZSBBUlBfUkVRVUVTVDoKKyAgICAvKiBBUlAgcmVxdWVzdC4gSWYgaXQgYXNrZWQgZm9yIG91ciBhZGRyZXNzLCB3ZSBzZW5kIG91dCBhCisgICAgICogcmVwbHkuIEluIGFueSBjYXNlLCB3ZSB0aW1lLXN0YW1wIGFueSBleGlzdGluZyBBUlAgZW50cnksCisgICAgICogYW5kIHBvc3NpYnkgc2VuZCBvdXQgYW4gSVAgcGFja2V0IHRoYXQgd2FzIHF1ZXVlZCBvbiBpdC4gKi8KKworICAgIExXSVBfREVCVUdGIChVTkRJSUZfQVJQX0RFQlVHIHwgVU5ESUlGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidW5kaWFycF9pbnB1dDogaW5jb21pbmcgQVJQIHJlcXVlc3RcbiIpKTsKKyAgICAvKiBBUlAgcmVxdWVzdCBmb3Igb3VyIGFkZHJlc3M/ICovCisgICAgaWYgKGZvcl91cykgeworCisgICAgICBMV0lQX0RFQlVHRihVTkRJSUZfQVJQX0RFQlVHIHwgVU5ESUlGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidW5kaWFycF9pbnB1dDogcmVwbHlpbmcgdG8gQVJQIHJlcXVlc3QgZm9yIG91ciBJUCBhZGRyZXNzXG4iKSk7CisgICAgICAvKiBSZS11c2UgcGJ1ZiB0byBzZW5kIEFSUCByZXBseS4KKyAgICAgICAgIFNpbmNlIHdlIGFyZSByZS11c2luZyBhbiBleGlzdGluZyBwYnVmLCB3ZSBjYW4ndCBjYWxsIGV0aGFycF9yYXcgc2luY2UKKyAgICAgICAgIHRoYXQgd291bGQgYWxsb2NhdGUgYSBuZXcgcGJ1Zi4gKi8KKyAgICAgIGhkci0+b3Bjb2RlID0gaHRvbnMoQVJQX1JFUExZKTsKKyAgICAgIGhkcl9wdHIgPSAodW5zaWduZWQgY2hhciAqKShoZHIgKyAxKTsKKyAgICAgIG1lbWNweShoZHJfcHRyLCAmbmV0aWYtPmh3YWRkciwgbmV0aWYtPmh3YWRkcl9sZW4pOworICAgICAgaGRyX3B0ciArPSBuZXRpZi0+aHdhZGRyX2xlbjsKKyAgICAgIG1lbWNweShoZHJfcHRyLCAmZGlwYWRkciwgc2l6ZW9mKGRpcGFkZHIpKTsKKyAgICAgIGhkcl9wdHIgKz0gc2l6ZW9mKGRpcGFkZHIpOworICAgICAgbWVtY3B5KGhkcl9wdHIsICZod2FkZHJfcmVtb3RlLCBuZXRpZi0+aHdhZGRyX2xlbik7CisgICAgICBoZHJfcHRyICs9IG5ldGlmLT5od2FkZHJfbGVuOworICAgICAgbWVtY3B5KGhkcl9wdHIsICZzaXBhZGRyLCBzaXplb2Yoc2lwYWRkcikpOworCisgICAgICAvKiByZXR1cm4gQVJQIHJlcGx5ICovCisgICAgICB1bmRpX3NlbmRfYXJwKG5ldGlmLCBwLCAmaHdhZGRyX3JlbW90ZSk7CisgICAgLyogd2UgYXJlIG5vdCBjb25maWd1cmVkPyAqLworICAgIH0gZWxzZSBpZiAobmV0aWYtPmlwX2FkZHIuYWRkciA9PSAwKSB7CisgICAgICAvKiB7IGZvcl91cyA9PSAwIGFuZCBuZXRpZi0+aXBfYWRkci5hZGRyID09IDAgfSAqLworICAgICAgTFdJUF9ERUJVR0YoVU5ESUlGX0FSUF9ERUJVRyB8IFVORElJRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInVuZGlhcnBfaW5wdXQ6IHdlIGFyZSB1bmNvbmZpZ3VyZWQsIEFSUCByZXF1ZXN0IGlnbm9yZWQuXG4iKSk7CisgICAgLyogcmVxdWVzdCB3YXMgbm90IGRpcmVjdGVkIHRvIHVzICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHsgZm9yX3VzID09IDAgYW5kIG5ldGlmLT5pcF9hZGRyLmFkZHIgIT0gMCB9ICovCisgICAgICBMV0lQX0RFQlVHRihVTkRJSUZfQVJQX0RFQlVHIHwgVU5ESUlGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidW5kaWFycF9pbnB1dDogQVJQIHJlcXVlc3Qgd2FzIG5vdCBmb3IgdXMuXG4iKSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEFSUF9SRVBMWToKKyAgICAvKiBBUlAgcmVwbHkuIFdlIGFscmVhZHkgdXBkYXRlZCB0aGUgQVJQIGNhY2hlIGVhcmxpZXIuICovCisgICAgTFdJUF9ERUJVR0YoVU5ESUlGX0FSUF9ERUJVRyB8IFVORElJRl9ERUJVRyB8IExXSVBfREJHX1RSQUNFLCAoInVuZGlhcnBfaW5wdXQ6IGluY29taW5nIEFSUCByZXBseVxuIikpOworI2lmIChMV0lQX0RIQ1AgJiYgREhDUF9ET0VTX0FSUF9DSEVDSykKKyAgICAvKiBESENQIHdhbnRzIHRvIGtub3cgYWJvdXQgQVJQIHJlcGxpZXMgZnJvbSBhbnkgaG9zdCB3aXRoIGFuCisgICAgICogSVAgYWRkcmVzcyBhbHNvIG9mZmVyZWQgdG8gdXMgYnkgdGhlIERIQ1Agc2VydmVyLiBXZSBkbyBub3QKKyAgICAgKiB3YW50IHRvIHRha2UgYSBkdXBsaWNhdGUgSVAgYWRkcmVzcyBvbiBhIHNpbmdsZSBuZXR3b3JrLgorICAgICAqIEB0b2RvIEhvdyBzaG91bGQgd2UgaGFuZGxlIHJlZHVuZGFudCAoZmFpbC1vdmVyKSBpbnRlcmZhY2VzPyAqLworICAgIGRoY3BfYXJwX3JlcGx5KG5ldGlmLCAmc2lwYWRkcik7CisjZW5kaWYKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBMV0lQX0RFQlVHRihVTkRJSUZfQVJQX0RFQlVHIHwgVU5ESUlGX0RFQlVHIHwgTFdJUF9EQkdfVFJBQ0UsICgidW5kaWFycF9pbnB1dDogQVJQIHVua25vd24gb3Bjb2RlIHR5cGUgJSJTMTZfRiJcbiIsIGh0b25zKGhkci0+b3Bjb2RlKSkpOworICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLmVycik7CisgICAgYnJlYWs7CisgIH0KKyAgLyogZnJlZSBBUlAgcGFja2V0ICovCisgIHBidWZfZnJlZShwKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIHBhY2tldCBpcyByZWFkeSB0byBiZSByZWFkCisgKiBmcm9tIHRoZSBpbnRlcmZhY2UuIEl0IHVzZXMgdGhlIGZ1bmN0aW9uIGxvd19sZXZlbF9pbnB1dCgpIHRoYXQKKyAqIHNob3VsZCBoYW5kbGUgdGhlIGFjdHVhbCByZWNlcHRpb24gb2YgYnl0ZXMgZnJvbSB0aGUgbmV0d29yaworICogaW50ZXJmYWNlLiBUaGVuIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlZCBwYWNrZXQgaXMgZGV0ZXJtaW5lZCBhbmQKKyAqIHRoZSBhcHByb3ByaWF0ZSBpbnB1dCBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKgorICogQHBhcmFtIG5ldGlmIHRoZSBsd2lwIG5ldHdvcmsgaW50ZXJmYWNlIHN0cnVjdHVyZSBmb3IgdGhpcyB1bmRpaWYKKyAqLwordm9pZCB1bmRpaWZfaW5wdXQodF9QWEVOVl9VTkRJX0lTUiAqaXNyKQoreworICBzdHJ1Y3QgcGJ1ZiAqcDsKKyAgdThfdCB1bmRpX3Byb3Q7CisgIHUxNl90IGxsaGRyX2xlbjsKKworICAvKiBGcm9tIHRoZSBmaXJzdCBpc3IgY2FwdHVyZSB0aGUgZXNzZW50aWFsIGluZm9ybWF0aW9uICovCisgIHVuZGlfcHJvdCA9IGlzci0+UHJvdFR5cGU7CisgIGxsaGRyX2xlbiA9IGlzci0+RnJhbWVIZWFkZXJMZW5ndGg7CisKKyAgLyogbW92ZSByZWNlaXZlZCBwYWNrZXQgaW50byBhIG5ldyBwYnVmICovCisgIHAgPSBsb3dfbGV2ZWxfaW5wdXQoaXNyKTsKKyAgLyogbm8gcGFja2V0IGNvdWxkIGJlIHJlYWQsIHNpbGVudGx5IGlnbm9yZSB0aGlzICovCisgIGlmIChwID09IE5VTEwpIHJldHVybjsKKworICBpZiAodW5kaV9pc19ldGhlcm5ldCgmdW5kaV9uZXRpZikpIHsKKyAgICAvKiBwb2ludHMgdG8gcGFja2V0IHBheWxvYWQsIHdoaWNoIHN0YXJ0cyB3aXRoIGFuIEV0aGVybmV0IGhlYWRlciAqLworICAgIHN0cnVjdCBldGhfaGRyICpldGhoZHIgPSBwLT5wYXlsb2FkOworI2lmIExXSVBfVU5ESUlGX0RCRyhVTkRJSUZfSURfRlVMTF9ERUJVRykKKyAgICBjaGFyICpzdHIgPSBtYWxsb2MoVU5JRElGX0lEX1NUUkxFTik7CisgICAgaW50IHN0cnBvcyA9IDA7CisKKyAgICBzdHJwb3MgKz0gc25wcmludGYoc3RyICsgc3RycG9zLCBVTklESUZfSURfU1RSTEVOIC0gc3RycG9zLAorCQkgICAgICAgInVuZGkgcmVjdiB0aGQgJyVzJ1xuIiwgY3VycmVudCgpLT5uYW1lKTsKKyAgICBzdHJwb3MgKz0gc25wcmludGZfZXRoX2hkcihzdHIgKyBzdHJwb3MsIFVOSURJRl9JRF9TVFJMRU4gLSBzdHJwb3MsCisJCQkgICAgICAgICJ1bmRpIiwgZXRoaGRyLCAncicsICcwJywgIiIpOworICAgIHN0cnBvcyArPSBzbnByaW50Zl9hcnBfaGRyKHN0ciArIHN0cnBvcywgVU5JRElGX0lEX1NUUkxFTiAtIHN0cnBvcywKKwkJCSAgICAgICAgIiAgYXJwIiwgZXRoaGRyLCAncicsICcwJywgIiIpOworICAgIHN0cnBvcyArPSBzbnByaW50Zl9pcF9oZHIoc3RyICsgc3RycG9zLCBVTklESUZfSURfU1RSTEVOIC0gc3RycG9zLAorCQkJICAgICAgICAiICBpcCIsIGV0aGhkciwgJ3InLCAnMCcsICIiKTsKKyAgICBzdHJwb3MgKz0gc25wcmludGZfaWNtcF9oZHIoc3RyICsgc3RycG9zLCBVTklESUZfSURfU1RSTEVOIC0gc3RycG9zLAorCQkJCSIgICAgaWNtcCIsIGV0aGhkciwgJ3InLCAnMCcsICIiKTsKKyAgICBzdHJwb3MgKz0gc25wcmludGZfdGNwX2hkcihzdHIgKyBzdHJwb3MsIFVOSURJRl9JRF9TVFJMRU4gLSBzdHJwb3MsCisJCQkgICAgICAgICIgICAgdGNwIiwgZXRoaGRyLCAncicsICcwJywgIiIpOworICAgIHN0cnBvcyArPSBzbnByaW50Zl91ZHBfaGRyKHN0ciArIHN0cnBvcywgVU5JRElGX0lEX1NUUkxFTiAtIHN0cnBvcywKKwkJCSAgICAgICAgIiAgICB1ZHAiLCBldGhoZHIsICdyJywgJzAnLCAiIik7CisgICAgTFdJUF9ERUJVR0YoVU5ESUlGX0lEX0ZVTExfREVCVUcsICgiJXMiLCBzdHIpKTsKKyAgICBmcmVlKHN0cik7CisjZW5kaWYgLyogVU5ESUlGX0lEX0ZVTExfREVCVUcgKi8KKworICAgIHN3aXRjaCAoaHRvbnMoZXRoaGRyLT50eXBlKSkgeworICAgIC8qIElQIG9yIEFSUCBwYWNrZXQ/ICovCisgICAgY2FzZSBFVEhUWVBFX0lQOgorICAgIGNhc2UgRVRIVFlQRV9BUlA6CisjaWYgUFBQT0VfU1VQUE9SVAorICAgIC8qIFBQUG9FIHBhY2tldD8gKi8KKyAgICBjYXNlIEVUSFRZUEVfUFBQT0VESVNDOgorICAgIGNhc2UgRVRIVFlQRV9QUFBPRToKKyNlbmRpZiAvKiBQUFBPRV9TVVBQT1JUICovCisgICAgICAvKiBmdWxsIHBhY2tldCBzZW5kIHRvIHRjcGlwX3RocmVhZCB0byBwcm9jZXNzICovCisgICAgICBpZiAodGNwaXBfaW5wdXQocCwgJnVuZGlfbmV0aWYpIT1FUlJfT0spCisgICAgICAgeyBMV0lQX0RFQlVHRihVTkRJSUZfTkVUX0RFQlVHIHwgVU5ESUlGX0RFQlVHLCAoInVuZGlpZl9pbnB1dDogSVAgaW5wdXQgZXJyb3JcbiIpKTsKKyAgICAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgICAgIHAgPSBOVUxMOworICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHBidWZfZnJlZShwKTsKKyAgICAgIHAgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwYnVmX2hlYWRlcihwLCAtKHMxNl90KWxsaGRyX2xlbikpIHsKKyAgICAgIExXSVBfQVNTRVJUKCJDYW4ndCBtb3ZlIGxpbmsgbGV2ZWwgaGVhZGVyIGluIHBhY2tldCIsIDApOworICAgICAgcGJ1Zl9mcmVlKHApOworICAgICAgcCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCh1bmRpX3Byb3QpIHsKKyAgICAgIGNhc2UgUF9JUDoKKyAgICAgICAgLyogcGFzcyB0byBJUCBsYXllciAqLworICAgICAgICB0Y3BpcF9pbnB1dChwLCAmdW5kaV9uZXRpZik7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIFBfQVJQOgorICAgICAgICAvKiBwYXNzIHAgdG8gQVJQIG1vZHVsZSAqLworICAgICAgICB1bmRpYXJwX2lucHV0KCZ1bmRpX25ldGlmLCBwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEVUSEFSUF9TVEFUU19JTkMoZXRoYXJwLnByb3RlcnIpOworICAgICAgICBFVEhBUlBfU1RBVFNfSU5DKGV0aGFycC5kcm9wKTsKKyAgICAgICAgcGJ1Zl9mcmVlKHApOworICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICogU2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9ncmFtIHRvIHNldCB1cCB0aGUKKyAqIG5ldHdvcmsgaW50ZXJmYWNlLiBJdCBjYWxscyB0aGUgZnVuY3Rpb24gbG93X2xldmVsX2luaXQoKSB0byBkbyB0aGUKKyAqIGFjdHVhbCBzZXR1cCBvZiB0aGUgaGFyZHdhcmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIG5ldGlmX2FkZCgpLgorICoKKyAqIEBwYXJhbSBuZXRpZiB0aGUgbHdpcCBuZXR3b3JrIGludGVyZmFjZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgdW5kaWlmCisgKiBAcmV0dXJuIEVSUl9PSyBpZiB0aGUgbG9vcGlmIGlzIGluaXRpYWxpemVkCisgKiAgICAgICAgIEVSUl9NRU0gaWYgcHJpdmF0ZSBkYXRhIGNvdWxkbid0IGJlIGFsbG9jYXRlZAorICogICAgICAgICBhbnkgb3RoZXIgZXJyX3Qgb24gZXJyb3IKKyAqLworc3RhdGljIGVycl90Cit1bmRpaWZfaW5pdChzdHJ1Y3QgbmV0aWYgKm5ldGlmKQoreworICBMV0lQX0FTU0VSVCgibmV0aWYgIT0gTlVMTCIsIChuZXRpZiAhPSBOVUxMKSk7CisjaWYgTFdJUF9ORVRJRl9IT1NUTkFNRQorICAvKiBJbml0aWFsaXplIGludGVyZmFjZSBob3N0bmFtZSAqLworICBuZXRpZi0+aG9zdG5hbWUgPSAidW5kaSI7CisjZW5kaWYgLyogTFdJUF9ORVRJRl9IT1NUTkFNRSAqLworCisgIC8qCisgICAqIEluaXRpYWxpemUgdGhlIHNubXAgdmFyaWFibGVzIGFuZCBjb3VudGVycyBpbnNpZGUgdGhlIHN0cnVjdCBuZXRpZi4KKyAgICogVGhlIGxhc3QgYXJndW1lbnQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggeW91ciBsaW5rIHNwZWVkLCBpbiB1bml0cworICAgKiBvZiBiaXRzIHBlciBzZWNvbmQuCisgICAqLworICBORVRJRl9JTklUX1NOTVAobmV0aWYsIHNubXBfaWZUeXBlX2V0aGVybmV0X2NzbWFjZCwgTElOS19TUEVFRF9PRl9ZT1VSX05FVElGX0lOX0JQUyk7CisKKyAgbmV0aWYtPnN0YXRlICAgPSBOVUxMOwkvKiBQcml2YXRlIHBvaW50ZXIgaWYgd2UgbmVlZCBpdCAqLworICBuZXRpZi0+bmFtZVswXSA9IElGTkFNRTA7CisgIG5ldGlmLT5uYW1lWzFdID0gSUZOQU1FMTsKKyAgbmV0aWYtPm91dHB1dCA9IHVuZGlhcnBfb3V0cHV0OworICBuZXRpZi0+bGlua291dHB1dCA9IHVuZGlfc2VuZF91bmtub3duOworCisgIC8qIGluaXRpYWxpemUgdGhlIGhhcmR3YXJlICovCisgIGxvd19sZXZlbF9pbml0KG5ldGlmKTsKKworICByZXR1cm4gRVJSX09LOworfQorCitpbnQgdW5kaWlmX3N0YXJ0KHVpbnQzMl90IGlwLCB1aW50MzJfdCBuZXRtYXNrLCB1aW50MzJfdCBndykKK3sKKyAgZXJyX3QgZXJyOworCisgIC8vIFRoaXMgc2hvdWxkIGJlIGRvbmUgKmFmdGVyKiB0aGUgdGhyZWFkaW5nIHN5c3RlbSBhbmQgcmVjZWl2ZSB0aHJlYWQKKyAgLy8gaGF2ZSBib3RoIGJlZW4gc3RhcnRlZC4KKyAgZHByaW50ZigidW5kaV9uZXRpZjogaXAgJWQuJWQuJWQuJWQgbmV0bWFzayAlZC4lZC4lZC4lZCBndyAlZC4lZC4lZC4lZFxuIiwKKwkgKCh1aW50OF90ICopJmlwKVswXSwKKwkgKCh1aW50OF90ICopJmlwKVsxXSwKKwkgKCh1aW50OF90ICopJmlwKVsyXSwKKwkgKCh1aW50OF90ICopJmlwKVszXSwKKwkgKCh1aW50OF90ICopJm5ldG1hc2spWzBdLAorCSAoKHVpbnQ4X3QgKikmbmV0bWFzaylbMV0sCisJICgodWludDhfdCAqKSZuZXRtYXNrKVsyXSwKKwkgKCh1aW50OF90ICopJm5ldG1hc2spWzNdLAorCSAoKHVpbnQ4X3QgKikmZ3cpWzBdLAorCSAoKHVpbnQ4X3QgKikmZ3cpWzFdLAorCSAoKHVpbnQ4X3QgKikmZ3cpWzJdLAorCSAoKHVpbnQ4X3QgKikmZ3cpWzNdKTsKKyAgZXJyID0gbmV0aWZhcGlfbmV0aWZfYWRkKCZ1bmRpX25ldGlmLAorICAgIChzdHJ1Y3QgaXBfYWRkciAqKSZpcCwgKHN0cnVjdCBpcF9hZGRyICopJm5ldG1hc2ssIChzdHJ1Y3QgaXBfYWRkciAqKSZndywKKyAgICBOVUxMLCB1bmRpaWZfaW5pdCwgdGNwaXBfaW5wdXQpOworICBpZiAoZXJyKQorICAgIHJldHVybiBlcnI7CisKKyAgbmV0aWZfc2V0X3VwKCZ1bmRpX25ldGlmKTsKKyAgbmV0aWZfc2V0X2RlZmF1bHQoJnVuZGlfbmV0aWYpOyAvKiBNYWtlIHRoaXMgaW50ZXJmYWNlIHRoZSBkZWZhdWx0IHJvdXRlICovCisKKyAgcmV0dXJuIEVSUl9PSzsKK30KZGlmZiAtLWdpdCBhL2NvcmUvbHpvL2VudGVyLmFzaCBiL2NvcmUvbHpvL2VudGVyLmFzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTIxYzU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sem8vZW50ZXIuYXNoCkBAIC0wLDAgKzEsNzcgQEAKKy8qIGVudGVyLmFzaCAtLSBMWk8gYXNzZW1ibGVyIHN0dWZmCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIHB1c2hsICAgJWVicAorICAgICAgICBwdXNobCAgICVlZGkKKyAgICAgICAgcHVzaGwgICAlZXNpCisgICAgICAgIHB1c2hsICAgJWVieAorICAgICAgICBwdXNobCAgICVlY3gKKyAgICAgICAgcHVzaGwgICAlZWR4CisgICAgICAgIHN1YmwgICAgJDEyLCVlc3AKKworICAgICAgICBjbGQKKworICAgICAgICBtb3ZsICAgIElOUCwlZXNpCisgICAgICAgIG1vdmwgICAgT1VUUCwlZWRpCisjaWYgZGVmaW5lZChOXzNfRUJQKQorICAgICAgICBtb3ZsICAgICQzLCVlYnAKKyNlbmRpZgorI2lmIGRlZmluZWQoTl8yNTVfRUJQKQorICAgICAgICBtb3ZsICAgICQyNTUsJWVicAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExaT19URVNUX0RFQ09NUFJFU1NfT1ZFUlJVTl9JTlBVVCkKKyNpZiBkZWZpbmVkKElOSVRfT1ZFUlJVTikKKyAgICAgICAgSU5JVF9PVkVSUlVOCisjIHVuZGVmIElOSVRfT1ZFUlJVTgorI2VuZGlmCisgICAgICAgIGxlYWwgICAgLTMoJWVzaSksJWVheCAgICAgICAvKiAzID09IGxlbmd0aCBvZiBFT0YgY29kZSAqLworICAgICAgICBhZGRsICAgIElOUywlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCxJTkVORAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExaT19URVNUX0RFQ09NUFJFU1NfT1ZFUlJVTl9PVVRQVVQpCisjaWYgZGVmaW5lZChJTklUX09WRVJSVU4pCisgICAgICAgIElOSVRfT1ZFUlJVTgorIyB1bmRlZiBJTklUX09WRVJSVU4KKyNlbmRpZgorICAgICAgICBtb3ZsICAgICVlZGksJWVheAorICAgICAgICBtb3ZsICAgIE9VVFMsJWVkeAorICAgICAgICBhZGRsICAgICglZWR4KSwlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCxPVVRFTkQKKyNlbmRpZgorCisKKy8qCit2aTp0cz00CisqLworCmRpZmYgLS1naXQgYS9jb3JlL2x6by9sZWF2ZS5hc2ggYi9jb3JlL2x6by9sZWF2ZS5hc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhMDI4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbHpvL2xlYXZlLmFzaApAQCAtMCwwICsxLDEwMiBAQAorLyogbGVhdmUuYXNoIC0tIExaTyBhc3NlbWJsZXIgc3R1ZmYKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNoZWNrIHVuY29tcHJlc3NlZCBzaXplICovCisjaWYgZGVmaW5lZChMWk9fVEVTVF9ERUNPTVBSRVNTX09WRVJSVU5fT1VUUFVUKQorICAgICAgICBjbXBsICAgIE9VVEVORCwlZWRpCisgICAgICAgIGphICAgICAgLkxfb3V0cHV0X292ZXJydW4KKyNlbmRpZgorCisvKiBjaGVjayBjb21wcmVzc2VkIHNpemUgKi8KKyAgICAgICAgbW92bCAgICBJTlAsJWVkeAorICAgICAgICBhZGRsICAgIElOUywlZWR4CisgICAgICAgIGNtcGwgICAgJWVkeCwlZXNpICAgICAgIC8qIGNoZWNrIGNvbXByZXNzZWQgc2l6ZSAqLworICAgICAgICBqYSAgICAgIC5MX2lucHV0X292ZXJydW4KKyAgICAgICAgamIgICAgICAuTF9pbnB1dF9ub3RfY29uc3VtZWQKKworLkxfbGVhdmU6CisgICAgICAgIHN1YmwgICAgT1VUUCwlZWRpICAgICAgIC8qIHdyaXRlIGJhY2sgdGhlIHVuY29tcHJlc3NlZCBzaXplICovCisgICAgICAgIG1vdmwgICAgT1VUUywlZWR4CisgICAgICAgIG1vdmwgICAgJWVkaSwoJWVkeCkKKworICAgICAgICBuZWdsICAgICVlYXgKKyAgICAgICAgYWRkbCAgICAkMTIsJWVzcAorICAgICAgICBwb3BsICAgICVlZHgKKyAgICAgICAgcG9wbCAgICAlZWN4CisgICAgICAgIHBvcGwgICAgJWVieAorICAgICAgICBwb3BsICAgICVlc2kKKyAgICAgICAgcG9wbCAgICAlZWRpCisgICAgICAgIHBvcGwgICAgJWVicAorI2lmIDEKKyAgICAgICAgcmV0CisjZWxzZQorICAgICAgICBqbXAgICAgIC5MX2VuZAorI2VuZGlmCisKKworLkxfZXJyb3I6CisgICAgICAgIG1vdmwgICAgJDEsJWVheCAgICAgICAgIC8qIExaT19FX0VSUk9SICovCisgICAgICAgIGptcCAgICAgLkxfbGVhdmUKKworLkxfaW5wdXRfbm90X2NvbnN1bWVkOgorICAgICAgICBtb3ZsICAgICQ4LCVlYXggICAgICAgICAvKiBMWk9fRV9JTlBVVF9OT1RfQ09OU1VNRUQgKi8KKyAgICAgICAgam1wICAgICAuTF9sZWF2ZQorCisuTF9pbnB1dF9vdmVycnVuOgorICAgICAgICBtb3ZsICAgICQ0LCVlYXggICAgICAgICAvKiBMWk9fRV9JTlBVVF9PVkVSUlVOICovCisgICAgICAgIGptcCAgICAgLkxfbGVhdmUKKworI2lmIGRlZmluZWQoTFpPX1RFU1RfREVDT01QUkVTU19PVkVSUlVOX09VVFBVVCkKKy5MX291dHB1dF9vdmVycnVuOgorICAgICAgICBtb3ZsICAgICQ1LCVlYXggICAgICAgICAvKiBMWk9fRV9PVVRQVVRfT1ZFUlJVTiAqLworICAgICAgICBqbXAgICAgIC5MX2xlYXZlCisjZW5kaWYKKworI2lmIGRlZmluZWQoTFpPX1RFU1RfREVDT01QUkVTU19PVkVSUlVOX0xPT0tCRUhJTkQpCisuTF9sb29rYmVoaW5kX292ZXJydW46CisgICAgICAgIG1vdmwgICAgJDYsJWVheCAgICAgICAgIC8qIExaT19FX0xPT0tCRUhJTkRfT1ZFUlJVTiAqLworICAgICAgICBqbXAgICAgIC5MX2xlYXZlCisjZW5kaWYKKworI2lmIGRlZmluZWQoTFpPX0RFQlVHKQorLkxfYXNzZXJ0X2ZhaWw6CisgICAgICAgIG1vdmwgICAgJDk5LCVlYXgKKyAgICAgICAgam1wICAgICAuTF9sZWF2ZQorI2VuZGlmCisKKy5MX2VuZDoKKworCisvKgordmk6dHM9NAorKi8KKwpkaWZmIC0tZ2l0IGEvY29yZS9sem8vbHpvMWNfZC5hc2ggYi9jb3JlL2x6by9sem8xY19kLmFzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYwNDUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sem8vbHpvMWNfZC5hc2gKQEAgLTAsMCArMSwxNzIgQEAKKy8qIGx6bzFjX2QuYXNoIC0tIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTFpPMUMgZGVjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgQUxJR04zCisuTDE6CisgICAgICAgIHhvcmwgICAgJWVheCwlZWF4CisgICAgICAgIG1vdmIgICAgKCVlc2kpLCVhbAorICAgICAgICBpbmNsICAgICVlc2kKKyAgICAgICAgY21wYiAgICAkMzIsJWFsCisgICAgICAgIGpuYiAgICAgLkxNQVRDSAorCisgICAgICAgIG9yYiAgICAgJWFsLCVhbAorICAgICAgICBqeiAgICAgIC5MMTIKKyAgICAgICAgbW92bCAgICAlZWF4LCVlY3gKKy5MSVQ6CisgICAgICAgIFRFU1RfT1AoKCVlZGksJWVjeCksJWVieCkKKyAgICAgICAgVEVTVF9JUCgoJWVzaSwlZWN4KSwlZWJ4KQorICAgICAgICByZXAKKyAgICAgICAgbW92c2IKKy5MTTE6CisgICAgICAgIG1vdmIgICAgKCVlc2kpLCVhbAorICAgICAgICBpbmNsICAgICVlc2kKKworICAgICAgICBjbXBiICAgICQzMiwlYWwKKyAgICAgICAgamIgICAgICAuTE0yCisuTE1BVENIOgorICAgICAgICBjbXBiICAgICQ2NCwlYWwKKyAgICAgICAgamIgICAgICAuTE4zCisKKyAgICAgICAgbW92bCAgICAlZWF4LCVlY3gKKyAgICAgICAgYW5kYiAgICAkMzEsJWFsCisgICAgICAgIGxlYWwgICAgLTEoJWVkaSksJWVkeAorICAgICAgICBzaHJsICAgICQ1LCVlY3gKKyAgICAgICAgc3VibCAgICAlZWF4LCVlZHgKKyAgICAgICAgbW92YiAgICAoJWVzaSksJWFsCisgICAgICAgIGluY2wgICAgJWVzaQorCisgICAgICAgIHNobGwgICAgJDUsJWVheAorICAgICAgICBzdWJsICAgICVlYXgsJWVkeAorICAgICAgICBpbmNsICAgICVlY3gKKyAgICAgICAgeGNoZ2wgICAlZXNpLCVlZHgKKyAgICAgICAgVEVTVF9MT09LQkVISU5EKCVlc2kpCisgICAgICAgIFRFU1RfT1AoKCVlZGksJWVjeCksJWVieCkKKyAgICAgICAgcmVwCisgICAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgJWVkeCwlZXNpCisgICAgICAgIGptcCAgICAgLkwxCisKKyAgICAgICAgQUxJR04zCisuTDEyOgorICAgICAgICBMT0RTQgorICAgICAgICBsZWFsICAgIDMyKCVlYXgpLCVlY3gKKyAgICAgICAgY21wYiAgICAkMjQ4LCVhbAorICAgICAgICBqYiAgICAgIC5MSVQKKworICAgICAgICBtb3ZsICAgICQyODAsJWVjeAorICAgICAgICBzdWJiICAgICQyNDgsJWFsCisgICAgICAgIGp6ICAgICAgLkwxMQorICAgICAgICB4Y2hnbCAgICVlYXgsJWVjeAorICAgICAgICB4b3JiICAgICVhbCwlYWwKKyAgICAgICAgc2hsbCAgICAlY2wsJWVheAorICAgICAgICB4Y2hnbCAgICVlYXgsJWVjeAorLkwxMToKKyAgICAgICAgVEVTVF9PUCgoJWVkaSwlZWN4KSwlZWJ4KQorICAgICAgICBURVNUX0lQKCglZXNpLCVlY3gpLCVlYngpCisgICAgICAgIHJlcAorICAgICAgICBtb3ZzYgorICAgICAgICBqbXAgICAgIC5MMQorCisgICAgICAgIEFMSUdOMworLkxNMjoKKyAgICAgICAgbGVhbCAgICAtMSglZWRpKSwlZWR4CisgICAgICAgIHN1YmwgICAgJWVheCwlZWR4CisgICAgICAgIExPRFNCCisgICAgICAgIHNobGwgICAgJDUsJWVheAorICAgICAgICBzdWJsICAgICVlYXgsJWVkeAorICAgICAgICB4Y2hnbCAgICVlc2ksJWVkeAorICAgICAgICBURVNUX0xPT0tCRUhJTkQoJWVzaSkKKyAgICAgICAgVEVTVF9PUCg0KCVlZGkpLCVlYngpCisgICAgICAgIG1vdnNiCisgICAgICAgIG1vdnNiCisgICAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgJWVkeCwlZXNpCisgICAgICAgIG1vdnNiCisgICAgICAgIHhvcmwgICAgJWVheCwlZWF4CisgICAgICAgIGptcCAgICAgLkxNMQorLkxOMzoKKyAgICAgICAgYW5kYiAgICAkMzEsJWFsCisgICAgICAgIG1vdmwgICAgJWVheCwlZWN4CisgICAgICAgIGpueiAgICAgLkxONgorICAgICAgICBtb3ZiICAgICQzMSwlY2wKKy5MTjQ6CisgICAgICAgIExPRFNCCisgICAgICAgIG9yYiAgICAgJWFsLCVhbAorICAgICAgICBqbnogICAgIC5MTjUKKyAgICAgICAgYWRkbCAgICBOXzI1NSwlZWN4CisgICAgICAgIGptcCAgICAgLkxONAorCisgICAgICAgIEFMSUdOMworLkxONToKKyAgICAgICAgYWRkbCAgICAlZWF4LCVlY3gKKy5MTjY6CisgICAgICAgIG1vdmIgICAgKCVlc2kpLCVhbAorICAgICAgICBpbmNsICAgICVlc2kKKworICAgICAgICBtb3ZsICAgICVlYXgsJWVieAorICAgICAgICBhbmRiICAgICQ2MywlYWwKKyAgICAgICAgbW92bCAgICAlZWRpLCVlZHgKKyAgICAgICAgc3VibCAgICAlZWF4LCVlZHgKKworICAgICAgICBtb3ZiICAgICglZXNpKSwlYWwKKyAgICAgICAgaW5jbCAgICAlZXNpCisKKyAgICAgICAgc2hsbCAgICAkNiwlZWF4CisgICAgICAgIHN1YmwgICAgJWVheCwlZWR4CisgICAgICAgIGNtcGwgICAgJWVkaSwlZWR4CisgICAgICAgIGp6ICAgICAgLkxFT0YKKworICAgICAgICB4Y2hnbCAgICVlZHgsJWVzaQorICAgICAgICBsZWFsICAgIDMoJWVjeCksJWVjeAorICAgICAgICBURVNUX0xPT0tCRUhJTkQoJWVzaSkKKyAgICAgICAgVEVTVF9PUCgoJWVkaSwlZWN4KSwlZWF4KQorICAgICAgICByZXAKKyAgICAgICAgbW92c2IKKworICAgICAgICBtb3ZsICAgICVlZHgsJWVzaQorICAgICAgICB4b3JsICAgICVlYXgsJWVheAorICAgICAgICBzaHJsICAgICQ2LCVlYngKKyAgICAgICAgbW92bCAgICAlZWJ4LCVlY3gKKyAgICAgICAgam56ICAgICAuTElUCisgICAgICAgIGptcCAgICAgLkwxCisKKy5MRU9GOgorLyoqKiogICB4b3JsICAgICVlYXgsJWVheCAgICAgICAgICBlYXg9MCBmcm9tIGFib3ZlICovCisKKyAgICAgICAgY21wbCAgICAkMSwlZWN4ICAgICAgICAgLyogZWN4IG11c3QgYmUgMSAqLworICAgICAgICBzZXRueiAgICVhbAorCisKKy8qCit2aTp0cz00CisqLworCmRpZmYgLS1naXQgYS9jb3JlL2x6by9sem8xZl9kLmFzaCBiL2NvcmUvbHpvL2x6bzFmX2QuYXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMjQ4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x6by9sem8xZl9kLmFzaApAQCAtMCwwICsxLDE2NCBAQAorLyogbHpvMWZfZC5hc2ggLS0gYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMWk8xRiBkZWNvbXByZXNzaW9uIGFsZ29yaXRobQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICBBTElHTjMKKy5MMDoKKyAgICAgICAgeG9ybCAgICAlZWF4LCVlYXgKKyAgICAgICAgbW92YiAgICAoJWVzaSksJWFsCisgICAgICAgIGluY2wgICAgJWVzaQorICAgICAgICBjbXBiICAgICQzMSwlYWwKKyAgICAgICAgamEgICAgICAuTE0yCisKKyAgICAgICAgb3JiICAgICAlYWwsJWFsCisgICAgICAgIG1vdmwgICAgJWVheCwlZWN4CisgICAgICAgIGpueiAgICAgLkwyCisxOgorICAgICAgICBMT0RTQgorICAgICAgICBvcmIgICAgICVhbCwlYWwKKyAgICAgICAgam56ICAgICAyZgorICAgICAgICBhZGRsICAgIE5fMjU1LCVlY3gKKyAgICAgICAgam1wICAgICAxYgorMjoKKyAgICAgICAgbGVhICAgICAzMSglZWF4LCVlY3gpLCVlY3gKKy5MMjoKKyAgICAgICAgVEVTVF9PUCgoJWVkaSwlZWN4KSwlZWJ4KQorICAgICAgICBURVNUX0lQKCglZXNpLCVlY3gpLCVlYngpCisgICAgICAgIG1vdmIgICAgJWNsLCVhbAorICAgICAgICBzaHJsICAgICQyLCVlY3gKKyAgICAgICAgcmVwCisgICAgICAgIG1vdnNsCisgICAgICAgIGFuZGIgICAgJDMsJWFsCisgICAgICAgIGp6ICAgICAgMWYKKyAgICAgICAgbW92bCAgICAoJWVzaSksJWVieAorICAgICAgICBhZGRsICAgICVlYXgsJWVzaQorICAgICAgICBtb3ZsICAgICVlYngsKCVlZGkpCisgICAgICAgIGFkZGwgICAgJWVheCwlZWRpCisxOgorICAgICAgICBtb3ZiICAgICglZXNpKSwlYWwKKyAgICAgICAgaW5jbCAgICAlZXNpCisuTE0xOgorICAgICAgICBjbXBiICAgICQzMSwlYWwKKyAgICAgICAgamJlICAgICAuTE0yMQorCisuTE0yOgorICAgICAgICBjbXBiICAgICQyMjMsJWFsCisgICAgICAgIGphICAgICAgLkxNMworCisgICAgICAgIG1vdmwgICAgJWVheCwlZWN4CisgICAgICAgIHNocmwgICAgJDIsJWVheAorICAgICAgICBsZWEgICAgIC0xKCVlZGkpLCVlZHgKKyAgICAgICAgYW5kYiAgICAkNywlYWwKKyAgICAgICAgc2hybCAgICAkNSwlZWN4CisgICAgICAgIG1vdmwgICAgJWVheCwlZWJ4CisKKyAgICAgICAgbW92YiAgICAoJWVzaSksJWFsCisgICAgICAgIGxlYWwgICAgKCVlYngsJWVheCw4KSwlZWF4CisgICAgICAgIGluY2wgICAgJWVzaQorLkxNNToKKyAgICAgICAgc3VibCAgICAlZWF4LCVlZHgKKyAgICAgICAgYWRkbCAgICAkMiwlZWN4CisgICAgICAgIHhjaGdsICAgJWVkeCwlZXNpCisgICAgICAgIFRFU1RfTE9PS0JFSElORCglZXNpKQorICAgICAgICBURVNUX09QKCglZWRpLCVlY3gpLCVlYngpCisgICAgICAgIGNtcGwgICAgJDYsJWVjeAorICAgICAgICBqYiAgICAgIDFmCisgICAgICAgIGNtcGwgICAgJDQsJWVheAorICAgICAgICBqYiAgICAgIDFmCisgICAgICAgIG1vdmIgICAgJWNsLCVhbAorICAgICAgICBzaHJsICAgICQyLCVlY3gKKyAgICAgICAgcmVwCisgICAgICAgIG1vdnNsCisgICAgICAgIGFuZGIgICAgJDMsJWFsCisgICAgICAgIG1vdmIgICAgJWFsLCVjbAorMToKKyAgICAgICAgcmVwCisgICAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgJWVkeCwlZXNpCisuTE4xOgorICAgICAgICBtb3ZiICAgIC0yKCVlc2kpLCVjbAorICAgICAgICBhbmRsICAgICQzLCVlY3gKKyAgICAgICAganogICAgICAuTDAKKyAgICAgICAgbW92bCAgICAoJWVzaSksJWVheAorICAgICAgICBhZGRsICAgICVlY3gsJWVzaQorICAgICAgICBtb3ZsICAgICVlYXgsKCVlZGkpCisgICAgICAgIGFkZGwgICAgJWVjeCwlZWRpCisgICAgICAgIHhvcmwgICAgJWVheCwlZWF4CisgICAgICAgIG1vdmIgICAgKCVlc2kpLCVhbAorICAgICAgICBpbmNsICAgICVlc2kKKyAgICAgICAgam1wICAgICAuTE0xCisuTE0yMToKKyAgICAgICAgVEVTVF9PUCgzKCVlZGkpLCVlZHgpCisgICAgICAgIHNocmwgICAgJDIsJWVheAorICAgICAgICBsZWFsICAgIC0weDgwMSglZWRpKSwlZWR4CisgICAgICAgIG1vdmwgICAgJWVheCwlZWN4CisgICAgICAgIG1vdmIgICAgKCVlc2kpLCVhbAorICAgICAgICBpbmNsICAgICVlc2kKKyAgICAgICAgbGVhbCAgICAoJWVjeCwlZWF4LDgpLCVlYXgKKyAgICAgICAgc3VibCAgICAlZWF4LCVlZHgKKyAgICAgICAgVEVTVF9MT09LQkVISU5EKCVlZHgpCisgICAgICAgIG1vdmwgICAgKCVlZHgpLCVlYXgKKyAgICAgICAgbW92bCAgICAlZWF4LCglZWRpKQorICAgICAgICBhZGRsICAgICQzLCVlZGkKKyAgICAgICAgam1wICAgICAuTE4xCisxOgorICAgICAgICBMT0RTQgorICAgICAgICBvcmIgICAgICVhbCwlYWwKKyAgICAgICAgam56ICAgICAyZgorICAgICAgICBhZGRsICAgIE5fMjU1LCVlY3gKKyAgICAgICAgam1wICAgICAxYgorMjoKKyAgICAgICAgbGVhICAgICAzMSglZWF4LCVlY3gpLCVlY3gKKyAgICAgICAgam1wICAgICAuTE00CisKKyAgICAgICAgQUxJR04zCisuTE0zOgorICAgICAgICBhbmRiICAgICQzMSwlYWwKKyAgICAgICAgbW92bCAgICAlZWF4LCVlY3gKKyAgICAgICAganogICAgICAxYgorLkxNNDoKKyAgICAgICAgbW92bCAgICAlZWRpLCVlZHgKKyAgICAgICAgbW92dyAgICAoJWVzaSksJWF4CisgICAgICAgIGFkZGwgICAgJDIsJWVzaQorICAgICAgICBzaHJsICAgICQyLCVlYXgKKyAgICAgICAgam56ICAgICAuTE01CisKKy5MRU9GOgorLyoqKiogICB4b3JsICAgICVlYXgsJWVheCAgICAgICAgICBlYXg9MCBmcm9tIGFib3ZlICovCisKKyAgICAgICAgY21wbCAgICAkMSwlZWN4ICAgICAgICAgLyogZWN4IG11c3QgYmUgMSAqLworICAgICAgICBzZXRueiAgICVhbAorCisKKy8qCit2aTp0cz00CisqLworCmRpZmYgLS1naXQgYS9jb3JlL2x6by9sem8xeF9kLmFzaCBiL2NvcmUvbHpvL2x6bzF4X2QuYXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWYxNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x6by9sem8xeF9kLmFzaApAQCAtMCwwICsxLDM4OSBAQAorLyogbHpvMXhfZC5hc2ggLS0gYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMWk8xWCBkZWNvbXByZXNzaW9uIGFsZ29yaXRobQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKyNpZiAhZGVmaW5lZChMWk8xWCkgJiYgIWRlZmluZWQoTFpPMVkpCisjICBkZWZpbmUgTFpPMVgKKyNlbmRpZgorCisjaWYgZGVmaW5lZChMWk9fRkFTVCkKKyMgIGRlZmluZSBOTiAgICAzCisjZWxzZQorIyAgZGVmaW5lIE5OICAgIDAKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gaW5pdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIHhvcmwgICAgJWVheCwlZWF4CisgICAgICAgIHhvcmwgICAgJWVieCwlZWJ4ICAgICAgIC8qIGhpZ2ggYml0cyA5LTMyIHN0YXkgMCAqLworICAgICAgICBsb2RzYgorICAgICAgICBjbXBiICAgICQxNywlYWwKKyAgICAgICAgamJlICAgICAuTDAxCisgICAgICAgIHN1YmIgICAgJDE3LU5OLCVhbAorI2lmIGRlZmluZWQoTFpPX0ZBU1QpCisgICAgICAgIGptcCAgICAgLkxGTFIKKyNlbHNlCisgICAgICAgIGNtcGIgICAgJDQsJWFsCisgICAgICAgIGphZSAgICAgLkxGTFIKKyNpZiAxCisgICAgICAgIFRFU1RfT1AoKCVlZGksJWVheCksJWVkeCkKKyAgICAgICAgVEVTVF9JUCgoJWVzaSwlZWF4KSwlZWR4KQorICAgICAgICBtb3ZsICAgICVlYXgsJWVjeAorICAgICAgICBqbXAgICAgIC5MRkxSMgorI2Vsc2UKKyAgICAgICAgam1wICAgICAuTEZMUjMKKyNlbmRpZgorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBsaXRlcmFsIHJ1bgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiswOiAgICAgIGFkZGwgICAgTl8yNTUsJWVheAorICAgICAgICBURVNUX0lQKDE4KCVlc2ksJWVheCksJWVkeCkgICAgIC8qIG1pbmltdW0gKi8KKzE6ICAgICAgbW92YiAgICAoJWVzaSksJWJsCisgICAgICAgIGluY2wgICAgJWVzaQorICAgICAgICBvcmIgICAgICVibCwlYmwKKyAgICAgICAganogICAgICAwYgorICAgICAgICBsZWFsICAgIDE4K05OKCVlYXgsJWVieCksJWVheAorICAgICAgICBqbXAgICAgIDNmCisKKworICAgICAgICBBTElHTjMKKy5MMDA6CisjaWZkZWYgTFpPX0RFQlVHCisgICAgYW5kbCAkMHhmZmZmZmYwMCwlZWF4IDsgam56IC5MX2Fzc2VydF9mYWlsCisgICAgYW5kbCAkMHhmZmZmZmYwMCwlZWJ4IDsgam56IC5MX2Fzc2VydF9mYWlsCisgICAgeG9ybCAlZWF4LCVlYXggOyB4b3JsICVlYngsJWVieAorICAgIHhvcmwgJWVjeCwlZWN4IDsgeG9ybCAlZWR4LCVlZHgKKyNlbmRpZgorICAgICAgICBURVNUX0lQX1IoJWVzaSkKKyAgICAgICAgTE9EU0IKKy5MMDE6CisgICAgICAgIGNtcGIgICAgJDE2LCVhbAorICAgICAgICBqYWUgICAgIC5MTUFUQ0gKKworLyogYSBsaXRlcmFsIHJ1biAqLworICAgICAgICBvcmIgICAgICVhbCwlYWwKKyAgICAgICAganogICAgICAxYgorICAgICAgICBhZGRsICAgICQzK05OLCVlYXgKKzM6CisuTEZMUjoKKyAgICAgICAgVEVTVF9PUCgtTk4oJWVkaSwlZWF4KSwlZWR4KQorICAgICAgICBURVNUX0lQKC1OTiglZXNpLCVlYXgpLCVlZHgpCisjaWYgZGVmaW5lZChMWk9fRkFTVCkKKyAgICAgICAgbW92bCAgICAlZWF4LCVlY3gKKyAgICAgICAgTk9UTF8zKCVlYXgpCisgICAgICAgIHNocmwgICAgJDIsJWVjeAorICAgICAgICBhbmRsICAgIE5fMywlZWF4CisgICAgICAgIENPUFlMKCVlc2ksJWVkaSwlZWR4KQorICAgICAgICBzdWJsICAgICVlYXgsJWVzaQorICAgICAgICBzdWJsICAgICVlYXgsJWVkaQorI2Vsc2UKKyAgICAgICAgbW92bCAgICAlZWF4LCVlY3gKKyAgICAgICAgc2hybCAgICAkMiwlZWF4CisgICAgICAgIGFuZGwgICAgTl8zLCVlY3gKKyAgICAgICAgQ09QWUxfQyglZXNpLCVlZGksJWVkeCwlZWF4KQorLkxGTFIyOgorICAgICAgICByZXAKKyAgICAgICAgbW92c2IKKyNlbmRpZgorCisjaWZkZWYgTFpPX0RFQlVHCisgICAgYW5kbCAkMHhmZmZmZmYwMCwlZWF4IDsgam56IC5MX2Fzc2VydF9mYWlsCisgICAgYW5kbCAkMHhmZmZmZmYwMCwlZWJ4IDsgam56IC5MX2Fzc2VydF9mYWlsCisgICAgeG9ybCAlZWF4LCVlYXggOyB4b3JsICVlYngsJWVieAorICAgIHhvcmwgJWVjeCwlZWN4IDsgeG9ybCAlZWR4LCVlZHgKKyNlbmRpZgorICAgICAgICBMT0RTQgorICAgICAgICBjbXBiICAgICQxNiwlYWwKKyAgICAgICAgamFlICAgICAuTE1BVENICisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBSMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIFRFU1RfT1AoMyglZWRpKSwlZWR4KQorICAgICAgICBzaHJsICAgICQyLCVlYXgKKyAgICAgICAgbW92YiAgICAoJWVzaSksJWJsCisjaWYgZGVmaW5lZChMWk8xWCkKKyAgICAgICAgbGVhbCAgICAtMHg4MDEoJWVkaSksJWVkeAorI2VsaWYgZGVmaW5lZChMWk8xWSkKKyAgICAgICAgbGVhbCAgICAtMHg0MDEoJWVkaSksJWVkeAorI2VuZGlmCisgICAgICAgIGxlYWwgICAgKCVlYXgsJWVieCw0KSwlZWF4CisgICAgICAgIGluY2wgICAgJWVzaQorICAgICAgICBzdWJsICAgICVlYXgsJWVkeAorICAgICAgICBURVNUX0xPT0tCRUhJTkQoJWVkeCkKKyNpZiBkZWZpbmVkKExaT19GQVNUKQorICAgICAgICBtb3ZsICAgICglZWR4KSwlZWN4CisgICAgICAgIG1vdmwgICAgJWVjeCwoJWVkaSkKKyNlbHNlCisgICAgICAgIG1vdmIgICAgKCVlZHgpLCVhbAorICAgICAgICBtb3ZiICAgICVhbCwoJWVkaSkKKyAgICAgICAgbW92YiAgICAxKCVlZHgpLCVhbAorICAgICAgICBtb3ZiICAgICVhbCwxKCVlZGkpCisgICAgICAgIG1vdmIgICAgMiglZWR4KSwlYWwKKyAgICAgICAgbW92YiAgICAlYWwsMiglZWRpKQorI2VuZGlmCisgICAgICAgIGFkZGwgICAgTl8zLCVlZGkKKyAgICAgICAgam1wICAgICAuTE1ET05FCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBNMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIEFMSUdOMworLkxNQVRDSDoKKyAgICAgICAgY21wYiAgICAkNjQsJWFsCisgICAgICAgIGpiICAgICAgLkxNM01BVENICisKKy8qIGEgTTIgbWF0Y2ggKi8KKyAgICAgICAgbW92bCAgICAlZWF4LCVlY3gKKyAgICAgICAgc2hybCAgICAkMiwlZWF4CisgICAgICAgIGxlYWwgICAgLTEoJWVkaSksJWVkeAorI2lmIGRlZmluZWQoTFpPMVgpCisgICAgICAgIGFuZGwgICAgJDcsJWVheAorICAgICAgICBtb3ZiICAgICglZXNpKSwlYmwKKyAgICAgICAgc2hybCAgICAkNSwlZWN4CisgICAgICAgIGxlYWwgICAgKCVlYXgsJWVieCw4KSwlZWF4CisjZWxpZiBkZWZpbmVkKExaTzFZKQorICAgICAgICBhbmRsICAgIE5fMywlZWF4CisgICAgICAgIG1vdmIgICAgKCVlc2kpLCVibAorICAgICAgICBzaHJsICAgICQ0LCVlY3gKKyAgICAgICAgbGVhbCAgICAoJWVheCwlZWJ4LDQpLCVlYXgKKyNlbmRpZgorICAgICAgICBpbmNsICAgICVlc2kKKyAgICAgICAgc3VibCAgICAlZWF4LCVlZHgKKworI2lmIGRlZmluZWQoTFpPX0ZBU1QpCisjaWYgZGVmaW5lZChMWk8xWCkKKyAgICAgICAgYWRkbCAgICAkMSszLCVlY3gKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisgICAgICAgIGFkZGwgICAgJDIsJWVjeAorI2VuZGlmCisjZWxzZQorI2lmIGRlZmluZWQoTFpPMVgpCisgICAgICAgIGluY2wgICAgJWVjeAorI2VsaWYgZGVmaW5lZChMWk8xWSkKKyAgICAgICAgZGVjbCAgICAlZWN4CisjZW5kaWYKKyNlbmRpZgorCisgICAgICAgIGNtcGwgICAgTl8zLCVlYXgKKyAgICAgICAgamFlICAgICAuTENPUFlMT05HCisgICAgICAgIGptcCAgICAgLkxDT1BZQllURQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gTTMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworMDogICAgICBhZGRsICAgIE5fMjU1LCVlYXgKKyAgICAgICAgVEVTVF9JUCgzKCVlc2kpLCVlZHgpICAgICAgIC8qIG1pbmltdW0gKi8KKzE6ICAgICAgbW92YiAgICAoJWVzaSksJWJsCisgICAgICAgIGluY2wgICAgJWVzaQorICAgICAgICBvcmIgICAgICVibCwlYmwKKyAgICAgICAganogICAgICAwYgorICAgICAgICBsZWFsICAgIDMzK05OKCVlYXgsJWVieCksJWVjeAorICAgICAgICB4b3JsICAgICVlYXgsJWVheAorICAgICAgICBqbXAgICAgIDNmCisKKworICAgICAgICBBTElHTjMKKy5MTTNNQVRDSDoKKyAgICAgICAgY21wYiAgICAkMzIsJWFsCisgICAgICAgIGpiICAgICAgLkxNNE1BVENICisKKy8qIGEgTTMgbWF0Y2ggKi8KKyAgICAgICAgYW5kbCAgICAkMzEsJWVheAorICAgICAgICBqeiAgICAgIDFiCisgICAgICAgIGxlYSAgICAgMitOTiglZWF4KSwlZWN4CiszOgorI2lmZGVmIExaT19ERUJVRworICAgIGFuZGwgJDB4ZmZmZjAwMDAsJWVheCA7IGpueiAuTF9hc3NlcnRfZmFpbAorI2VuZGlmCisgICAgICAgIG1vdncgICAgKCVlc2kpLCVheAorICAgICAgICBsZWFsICAgIC0xKCVlZGkpLCVlZHgKKyAgICAgICAgc2hybCAgICAkMiwlZWF4CisgICAgICAgIGFkZGwgICAgJDIsJWVzaQorICAgICAgICBzdWJsICAgICVlYXgsJWVkeAorCisgICAgICAgIGNtcGwgICAgTl8zLCVlYXgKKyAgICAgICAgamIgICAgICAuTENPUFlCWVRFCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBjb3B5IG1hdGNoCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgQUxJR04xCisuTENPUFlMT05HOiAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IG1hdGNoIHVzaW5nIGxvbmd3b3JkcyAqLworICAgICAgICBURVNUX0xPT0tCRUhJTkQoJWVkeCkKKyNpZiBkZWZpbmVkKExaT19GQVNUKQorICAgICAgICBsZWFsICAgIC0zKCVlZGksJWVjeCksJWVheAorICAgICAgICBzaHJsICAgICQyLCVlY3gKKyAgICAgICAgVEVTVF9PUF9SKCVlYXgpCisgICAgICAgIENPUFlMKCVlZHgsJWVkaSwlZWJ4KQorICAgICAgICBtb3ZsICAgICVlYXgsJWVkaQorICAgICAgICB4b3JsICAgICVlYngsJWVieAorI2Vsc2UKKyAgICAgICAgVEVTVF9PUCgoJWVkaSwlZWN4KSwlZWF4KQorICAgICAgICBtb3ZsICAgICVlY3gsJWVieAorICAgICAgICBzaHJsICAgICQyLCVlYngKKyAgICAgICAganogICAgICAyZgorICAgICAgICBDT1BZTF9DKCVlZHgsJWVkaSwlZWF4LCVlYngpCisgICAgICAgIGFuZGwgICAgTl8zLCVlY3gKKyAgICAgICAganogICAgICAxZgorMjogICAgICBDT1BZQl9DKCVlZHgsJWVkaSwlYWwsJWVjeCkKKzE6CisjZW5kaWYKKworLkxNRE9ORToKKyAgICAgICAgbW92YiAgICAtMiglZXNpKSwlYWwKKyAgICAgICAgYW5kbCAgICBOXzMsJWVheAorICAgICAgICBqeiAgICAgIC5MMDAKKy5MRkxSMzoKKyAgICAgICAgVEVTVF9PUCgoJWVkaSwlZWF4KSwlZWR4KQorICAgICAgICBURVNUX0lQKCglZXNpLCVlYXgpLCVlZHgpCisjaWYgZGVmaW5lZChMWk9fRkFTVCkKKyAgICAgICAgbW92bCAgICAoJWVzaSksJWVkeAorICAgICAgICBhZGRsICAgICVlYXgsJWVzaQorICAgICAgICBtb3ZsICAgICVlZHgsKCVlZGkpCisgICAgICAgIGFkZGwgICAgJWVheCwlZWRpCisjZWxzZQorICAgICAgICBDT1BZQl9DKCVlc2ksJWVkaSwlY2wsJWVheCkKKyNlbmRpZgorCisjaWZkZWYgTFpPX0RFQlVHCisgICAgYW5kbCAkMHhmZmZmZmYwMCwlZWF4IDsgam56IC5MX2Fzc2VydF9mYWlsCisgICAgYW5kbCAkMHhmZmZmZmYwMCwlZWJ4IDsgam56IC5MX2Fzc2VydF9mYWlsCisgICAgeG9ybCAlZWF4LCVlYXggOyB4b3JsICVlYngsJWVieAorICAgIHhvcmwgJWVjeCwlZWN4IDsgeG9ybCAlZWR4LCVlZHgKKyNlbmRpZgorICAgICAgICBMT0RTQgorICAgICAgICBqbXAgICAgIC5MTUFUQ0gKKworCisgICAgICAgIEFMSUdOMworLkxDT1BZQllURTogICAgICAgICAgICAgICAgICAgICAgLyogY29weSBtYXRjaCB1c2luZyBieXRlcyAqLworICAgICAgICBURVNUX0xPT0tCRUhJTkQoJWVkeCkKKyAgICAgICAgVEVTVF9PUCgtTk4oJWVkaSwlZWN4KSwlZWF4KQorICAgICAgICB4Y2hnbCAgICVlZHgsJWVzaQorI2lmIGRlZmluZWQoTFpPX0ZBU1QpCisgICAgICAgIHN1YmwgICAgTl8zLCVlY3gKKyNlbmRpZgorICAgICAgICByZXAKKyAgICAgICAgbW92c2IKKyAgICAgICAgbW92bCAgICAlZWR4LCVlc2kKKyAgICAgICAgam1wICAgICAuTE1ET05FCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBNNAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiswOiAgICAgIGFkZGwgICAgTl8yNTUsJWVjeAorICAgICAgICBURVNUX0lQKDMoJWVzaSksJWVkeCkgICAgICAgLyogbWluaW11bSAqLworMTogICAgICBtb3ZiICAgICglZXNpKSwlYmwKKyAgICAgICAgaW5jbCAgICAlZXNpCisgICAgICAgIG9yYiAgICAgJWJsLCVibAorICAgICAgICBqeiAgICAgIDBiCisgICAgICAgIGxlYWwgICAgOStOTiglZWJ4LCVlY3gpLCVlY3gKKyAgICAgICAgam1wICAgICAzZgorCisKKyAgICAgICAgQUxJR04zCisuTE00TUFUQ0g6CisgICAgICAgIGNtcGIgICAgJDE2LCVhbAorICAgICAgICBqYiAgICAgIC5MTTFNQVRDSAorCisvKiBhIE00IG1hdGNoICovCisgICAgICAgIG1vdmwgICAgJWVheCwlZWN4CisgICAgICAgIGFuZGwgICAgJDgsJWVheAorICAgICAgICBzaGxsICAgICQxMywlZWF4ICAgICAgICAvKiBzYXZlIGluIGJpdCAxNiAqLworICAgICAgICBhbmRsICAgICQ3LCVlY3gKKyAgICAgICAganogICAgICAxYgorICAgICAgICBhZGRsICAgICQyK05OLCVlY3gKKzM6CisjaWZkZWYgTFpPX0RFQlVHCisgICAgbW92bCAlZWF4LCVlZHggOyBhbmRsICQweGZmZmUwMDAwLCVlZHggOyBqbnogLkxfYXNzZXJ0X2ZhaWwKKyNlbmRpZgorICAgICAgICBtb3Z3ICAgICglZXNpKSwlYXgKKyAgICAgICAgYWRkbCAgICAkMiwlZXNpCisgICAgICAgIGxlYWwgICAgLTB4NDAwMCglZWRpKSwlZWR4CisgICAgICAgIHNocmwgICAgJDIsJWVheAorICAgICAgICBqeiAgICAgIC5MRU9GCisgICAgICAgIHN1YmwgICAgJWVheCwlZWR4CisgICAgICAgIGptcCAgICAgLkxDT1BZTE9ORworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gTTEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICBBTElHTjMKKy5MTTFNQVRDSDoKKy8qIGEgTTEgbWF0Y2ggKi8KKyAgICAgICAgVEVTVF9PUCgyKCVlZGkpLCVlZHgpCisgICAgICAgIHNocmwgICAgJDIsJWVheAorICAgICAgICBtb3ZiICAgICglZXNpKSwlYmwKKyAgICAgICAgbGVhbCAgICAtMSglZWRpKSwlZWR4CisgICAgICAgIGxlYWwgICAgKCVlYXgsJWVieCw0KSwlZWF4CisgICAgICAgIGluY2wgICAgJWVzaQorICAgICAgICBzdWJsICAgICVlYXgsJWVkeAorICAgICAgICBURVNUX0xPT0tCRUhJTkQoJWVkeCkKKworICAgICAgICBtb3ZiICAgICglZWR4KSwlYWwgICAgICAvKiB3ZSBtdXN0IHVzZSB0aGlzIGJlY2F1c2UgZWR4IGNhbiBiZSBlZGktMSAqLworICAgICAgICBtb3ZiICAgICVhbCwoJWVkaSkKKyAgICAgICAgbW92YiAgICAxKCVlZHgpLCVibAorICAgICAgICBtb3ZiICAgICVibCwxKCVlZGkpCisgICAgICAgIGFkZGwgICAgJDIsJWVkaQorICAgICAgICBqbXAgICAgIC5MTURPTkUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy5MRU9GOgorLyoqKiogICB4b3JsICAgICVlYXgsJWVheCAgICAgICAgICBlYXg9MCBmcm9tIGFib3ZlICovCisKKyAgICAgICAgY21wbCAgICAkMytOTiwlZWN4ICAgICAgLyogZWN4IG11c3QgYmUgMy82ICovCisgICAgICAgIHNldG56ICAgJWFsCisKKworLyoKK3ZpOnRzPTQKKyovCisKZGlmZiAtLWdpdCBhL2NvcmUvbHpvL2x6bzF4X2YyLlMgYi9jb3JlL2x6by9sem8xeF9mMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzI2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2x6by9sem8xeF9mMi5TCkBAIC0wLDAgKzEsNzAgQEAKKy8qIGx6bzF4X2YyLlMgLS0gZmFzdCBMWk8xWCBkZWNvbXByZXNzaW9uIGluIGFzc2VtYmxlciAoaTM4NiArIGdjYykKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDIwMTEgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDEwIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwOSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA3IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwNiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDAxIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTkgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAxOTk4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTYgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExaT19GQVNUCisKKyNkZWZpbmUgTFpPX1RFU1RfREVDT01QUkVTU19PVkVSUlVOX0lOUFVUCisjZGVmaW5lIExaT19URVNUX0RFQ09NUFJFU1NfT1ZFUlJVTl9PVVRQVVQKKyNkZWZpbmUgTFpPX1RFU1RfREVDT01QUkVTU19PVkVSUlVOX0xPT0tCRUhJTkQKKworI2luY2x1ZGUgImx6b19hc20uaCIKKworICAgIC5zZWN0aW9uICIudGV4dG5yIiwiYXgiCisKKyAgICBMWk9fUFVCTElDKGx6bzF4X2RlY29tcHJlc3NfYXNtX2Zhc3Rfc2FmZSkKKworI2luY2x1ZGUgImVudGVyLmFzaCIKKyNpbmNsdWRlICJsem8xeF9kLmFzaCIKKyNpbmNsdWRlICJsZWF2ZS5hc2giCisKKyAgICBMWk9fUFVCTElDX0VORChsem8xeF9kZWNvbXByZXNzX2FzbV9mYXN0X3NhZmUpCisKKworLyoKK3ZpOnRzPTQKKyovCisKZGlmZiAtLWdpdCBhL2NvcmUvbHpvL2x6b19hc20uaCBiL2NvcmUvbHpvL2x6b19hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTU4NTE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sem8vbHpvX2FzbS5oCkBAIC0wLDAgKzEsMjc1IEBACisvKiBsem9fYXNtLmggLS0gTFpPIGFzc2VtYmxlciBzdHVmZgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gPGFzbWNvbmZpZy5oPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoX19pMzg2X18pCisjICBlcnJvcgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChJTl9DT05GSUdVUkUpCisjaWYgZGVmaW5lZChMWk9fSEFWRV9DT05GSUdfSCkKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2Vsc2UKKyAgIC8qIG1hbnVhbCBjb25maWd1cmF0aW9uIC0gc2VlIGRlZmF1bHRzIGJlbG93ICovCisjICBpZiBkZWZpbmVkKF9fRUxGX18pCisjICAgIGRlZmluZSBNRlhfQVNNX0hBVkVfVFlQRSAxCisjICAgIGRlZmluZSBNRlhfQVNNX05BTUVfTk9fVU5ERVJTQ09SRVMgMQorIyAgZWxpZiBkZWZpbmVkKF9fbGludXhfXykgICAgICAgICAgICAgIC8qIExpbnV4IGEub3V0ICovCisjICAgIGRlZmluZSBNRlhfQVNNX0FMSUdOX1BUV08gMQorIyAgZWxpZiBkZWZpbmVkKF9fREpHUFBfXykKKyMgICAgZGVmaW5lIE1GWF9BU01fQUxJR05fUFRXTyAxCisjICBlbGlmIGRlZmluZWQoX19HTzMyX18pICAgICAgICAgICAgICAgLyogZGpncHAgdjEgKi8KKyMgICAgZGVmaW5lIE1GWF9BU01fQ0FOTk9UX1VTRV9FQlAgMQorIyAgZWxpZiBkZWZpbmVkKF9fRU1YX18pCisjICAgIGRlZmluZSBNRlhfQVNNX0FMSUdOX1BUV08gMQorIyAgICBkZWZpbmUgTUZYX0FTTV9DQU5OT1RfVVNFX0VCUCAxCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIDEgJiYgZGVmaW5lZChfX0VMRl9fKQorLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworI2VuZGlmCisjaWYgMCAmJiBkZWZpbmVkKF9fRUxGX18pCisjdW5kZWYgaTM4NgorLmFyY2ggaTM4NgorLmNvZGUzMgorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBuYW1lIGFsd2F5cyB1c2VzIHVuZGVyc2NvcmVzCisvLyBbIE9MRDogbmFtZSAoZGVmYXVsdDogd2l0aCB1bmRlcnNjb3JlcykgXQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoTFpPX0FTTV9OQU1FKQorIyAgZGVmaW5lIExaT19BU01fTkFNRShuKSAgICAgICBfICMjIG4KKyNpZiAwCisjICBpZiBkZWZpbmVkKE1GWF9BU01fTkFNRV9OT19VTkRFUlNDT1JFUykKKyMgICAgZGVmaW5lIExaT19BU01fTkFNRShuKSAgICAgbgorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0FTTV9OQU1FKG4pICAgICBfICMjIG4KKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gLnR5cGUgKGRlZmF1bHQ6IGRvIG5vdCB1c2UpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChMWk9fUFVCTElDKQorI2lmIGRlZmluZWQoX19MWk9fREJfXykKKyMgIGRlZmluZSBMWk9fUFVCTElDKGZ1bmMpIFwKKyAgICAgICAgLnAyYWxpZ24gNCA7IC5ieXRlIDAsMCwwLDAsMCwwLDAgOyAuYXNjaWkgIkxaT19TVEFSVCIKKyMgIGRlZmluZSBMWk9fUFVCTElDX0VORChmdW5jKSBcCisgICAgICAgIC5wMmFsaWduIDQsMHg5MCA7IC5hc2NpaSAiTFpPX0VORCIKKyNlbGlmIGRlZmluZWQoTUZYX0FTTV9IQVZFX1RZUEUpCisjICBkZWZpbmUgTFpPX1BVQkxJQyhmdW5jKSBcCisgICAgICAgIEFMSUdOMyA7IC50eXBlIExaT19BU01fTkFNRShmdW5jKSxAZnVuY3Rpb24gOyBcCisgICAgICAgIC5nbG9ibCBMWk9fQVNNX05BTUUoZnVuYykgOyBMWk9fQVNNX05BTUUoZnVuYyk6CisjICBkZWZpbmUgTFpPX1BVQkxJQ19FTkQoZnVuYykgXAorICAgICAgICAuc2l6ZSBMWk9fQVNNX05BTUUoZnVuYyksLi1MWk9fQVNNX05BTUUoZnVuYykKKyNlbHNlCisjICBkZWZpbmUgTFpPX1BVQkxJQyhmdW5jKSBcCisgICAgICAgIEFMSUdOMyA7IC5nbG9ibCBMWk9fQVNNX05BTUUoZnVuYykgOyBMWk9fQVNNX05BTUUoZnVuYyk6CisjICBkZWZpbmUgTFpPX1BVQkxJQ19FTkQoZnVuYykKKyNlbmRpZgorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAuYWxpZ24gKGRlZmF1bHQ6IGJ5dGVzKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoTUZYX0FTTV9BTElHTl9CWVRFUykgJiYgIWRlZmluZWQoTUZYX0FTTV9BTElHTl9QVFdPKQorIyAgZGVmaW5lIE1GWF9BU01fQUxJR05fQllURVMgMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChMWk9fQVNNX0FMSUdOKQorIyAgaWYgZGVmaW5lZChNRlhfQVNNX0FMSUdOX1BUV08pCisjICAgIGRlZmluZSBMWk9fQVNNX0FMSUdOKHgpICAgIC5hbGlnbiB4CisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQVNNX0FMSUdOKHgpICAgIC5hbGlnbiAoMSA8PCAoeCkpCisjICBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQUxJR04xICAgICAgICAgICAgICBMWk9fQVNNX0FMSUdOKDEpCisjZGVmaW5lIEFMSUdOMiAgICAgICAgICAgICAgTFpPX0FTTV9BTElHTigyKQorI2RlZmluZSBBTElHTjMgICAgICAgICAgICAgIExaT19BU01fQUxJR04oMykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGVicCB1c2FnZSAoZGVmYXVsdDogY2FuIHVzZSkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKE1GWF9BU01fQ0FOTk9UX1VTRV9FQlApCisjICBpZiAxICYmICFkZWZpbmVkKE5fM19FQlApICYmICFkZWZpbmVkKE5fMjU1X0VCUCkKKyMgICAgZGVmaW5lIE5fM19FQlAgMQorIyAgZW5kaWYKKyMgIGlmIDAgJiYgIWRlZmluZWQoTl8zX0VCUCkgJiYgIWRlZmluZWQoTl8yNTVfRUJQKQorIyAgICBkZWZpbmUgTl8yNTVfRUJQIDEKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTl8zX0VCUCkgJiYgZGVmaW5lZChOXzI1NV9FQlApCisjICBlcnJvcgorI2VuZGlmCisjaWYgZGVmaW5lZChNRlhfQVNNX0NBTk5PVF9VU0VfRUJQKQorIyAgaWYgZGVmaW5lZChOXzNfRUJQKSB8fCBkZWZpbmVkKE5fMjU1X0VCUCkKKyMgICAgZXJyb3IKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKE5fMykKKyMgIGlmIGRlZmluZWQoTl8zX0VCUCkKKyMgICAgZGVmaW5lIE5fMyAgICAgICAgICVlYnAKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE5fMyAgICAgICAgICQzCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChOXzI1NSkKKyMgIGlmIGRlZmluZWQoTl8yNTVfRUJQKQorIyAgICBkZWZpbmUgTl8yNTUgICAgICAgJWVicAorIyAgICBkZWZpbmUgTk9UTF8zKHIpICAgeG9ybCAlZWJwLHIKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE5fMjU1ICAgICAgICQyNTUKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKE5PVExfMykKKyMgIGRlZmluZSBOT1RMXzMocikgICAgIHhvcmwgTl8zLHIKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJTlAKKyNkZWZpbmUgSU5QICAgICAgNCszNiglZXNwKQorI2RlZmluZSBJTlMgICAgICA4KzM2KCVlc3ApCisjZGVmaW5lIE9VVFAgICAgMTIrMzYoJWVzcCkKKyNkZWZpbmUgT1VUUyAgICAxNiszNiglZXNwKQorI2VuZGlmCisKKyNkZWZpbmUgSU5FTkQgICAgICAgICA0KCVlc3ApCisjZGVmaW5lIE9VVEVORCAgICAgICAgKCVlc3ApCisKKworI2lmIGRlZmluZWQoTFpPX1RFU1RfREVDT01QUkVTU19PVkVSUlVOX0lOUFVUKQorIyAgZGVmaW5lIFRFU1RfSVBfUihyKSAgICAgIGNtcGwgcixJTkVORCA7IGpiIC5MX2lucHV0X292ZXJydW4KKyMgIGRlZmluZSBURVNUX0lQKGFkZHIscikgICBsZWFsIGFkZHIsciA7IFRFU1RfSVBfUihyKQorI2Vsc2UKKyMgIGRlZmluZSBURVNUX0lQX1IocikKKyMgIGRlZmluZSBURVNUX0lQKGFkZHIscikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChMWk9fVEVTVF9ERUNPTVBSRVNTX09WRVJSVU5fT1VUUFVUKQorIyAgZGVmaW5lIFRFU1RfT1BfUihyKSAgICAgIGNtcGwgcixPVVRFTkQgOyBqYiAuTF9vdXRwdXRfb3ZlcnJ1bgorIyAgZGVmaW5lIFRFU1RfT1AoYWRkcixyKSAgIGxlYWwgYWRkcixyIDsgVEVTVF9PUF9SKHIpCisjZWxzZQorIyAgZGVmaW5lIFRFU1RfT1BfUihyKQorIyAgZGVmaW5lIFRFU1RfT1AoYWRkcixyKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExaT19URVNUX0RFQ09NUFJFU1NfT1ZFUlJVTl9MT09LQkVISU5EKQorIyAgZGVmaW5lIFRFU1RfTE9PS0JFSElORChyKSAgICBjbXBsIE9VVFAsciA7IGpiIC5MX2xvb2tiZWhpbmRfb3ZlcnJ1bgorI2Vsc2UKKyMgIGRlZmluZSBURVNUX0xPT0tCRUhJTkQocikKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMT0RTQiAgICAgICAgICAgbW92YiAoJWVzaSksJWFsIDsgaW5jbCAlZXNpCisKKyNkZWZpbmUgTU9WU0IocjEscjIseCkgIG1vdmIgKHIxKSx4IDsgaW5jbCByMSA7IG1vdmIgeCwocjIpIDsgaW5jbCByMgorI2RlZmluZSBNT1ZTVyhyMSxyMix4KSAgbW92YiAocjEpLHggOyBtb3ZiIHgsKHIyKSA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmIgMShyMSkseCA7IGFkZGwgJDIscjEgOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZiIHgsMShyMikgOyBhZGRsICQyLHIyCisjZGVmaW5lIE1PVlNMKHIxLHIyLHgpICBtb3ZsIChyMSkseCA7IGFkZGwgJDQscjEgOyBtb3ZsIHgsKHIyKSA7IGFkZGwgJDQscjIKKworI2lmIGRlZmluZWQoTFpPX0RFQlVHKQorI2RlZmluZSBDT1BZQl9DKHIxLHIyLHgscmMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtcGwgJDAscmMgOyBqeiAuTF9hc3NlcnRfZmFpbDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgOTogTU9WU0IocjEscjIseCkgOyBkZWNsIHJjIDsgam56IDliCisjZGVmaW5lIENPUFlMX0MocjEscjIseCxyYykgXAorICAgICAgICAgICAgICAgICAgICAgICAgY21wbCAkMCxyYyA7IGp6IC5MX2Fzc2VydF9mYWlsOyBcCisgICAgICAgICAgICAgICAgICAgICAgICA5OiBNT1ZTTChyMSxyMix4KSA7IGRlY2wgcmMgOyBqbnogOWIKKyNlbHNlCisjZGVmaW5lIENPUFlCX0MocjEscjIseCxyYykgXAorICAgICAgICAgICAgICAgICAgICAgICAgOTogTU9WU0IocjEscjIseCkgOyBkZWNsIHJjIDsgam56IDliCisjZGVmaW5lIENPUFlMX0MocjEscjIseCxyYykgXAorICAgICAgICAgICAgICAgICAgICAgICAgOTogTU9WU0wocjEscjIseCkgOyBkZWNsIHJjIDsgam56IDliCisjZW5kaWYKKworI2RlZmluZSBDT1BZQihyMSxyMix4KSAgQ09QWUJfQyhyMSxyMix4LCVlY3gpCisjZGVmaW5lIENPUFlMKHIxLHIyLHgpICBDT1BZTF9DKHIxLHIyLHgsJWVjeCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIG5vdCB1c2VkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwCisKKyNpZiAwCisjZGVmaW5lIFJFUF9NT1ZTQih4KSAgICByZXAgOyBtb3ZzYgorI2RlZmluZSBSRVBfTU9WU0woeCkgICAgc2hybCAkMiwlZWN4IDsgcmVwIDsgbW92c2wKKyNlbGlmIDEKKyNkZWZpbmUgUkVQX01PVlNCKHgpICAgIENPUFlCKCVlc2ksJWVkaSx4KQorI2RlZmluZSBSRVBfTU9WU0woeCkgICAgc2hybCAkMiwlZWN4IDsgQ09QWUwoJWVzaSwlZWRpLHgpCisjZWxzZQorI2RlZmluZSBSRVBfTU9WU0IoeCkgICAgcmVwIDsgbW92c2IKKyNkZWZpbmUgUkVQX01PVlNMKHgpICAgIGptcCA5ZiA7IDg6IG1vdnNiIDsgZGVjbCAlZWN4IDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgOTogdGVzdGwgJDMsJWVkaSA7IGpueiA4YiA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmwgJWVjeCx4IDsgc2hybCAkMiwlZWN4IDsgYW5kbCAkMyx4IDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwIDsgbW92c2wgOyBtb3ZsIHgsJWVjeCA7IHJlcCA7IG1vdnNiCisjZW5kaWYKKworI2lmIDEKKyNkZWZpbmUgTkVHTCh4KSAgICAgICAgIG5lZ2wgeAorI2Vsc2UKKyNkZWZpbmUgTkVHTCh4KSAgICAgICAgIHhvcmwgJC0xLHggOyBpbmNsIHgKKyNlbmRpZgorCisjZW5kaWYKKworCisKKy8qCit2aTp0cz00CisqLworCmRpZmYgLS1naXQgYS9jb3JlL21hY3Jvcy5pbmMgYi9jb3JlL21hY3Jvcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmYmU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWFjcm9zLmluYwpAQCAtMCwwICsxLDEyMSBAQAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7OyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKzs7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IG1hY3Jvcy5pbmMKKzs7Cis7OyBDb252ZW5pZW50IG1hY3JvcworOzsKKworJWlmbmRlZiBfTUFDUk9TX0lOQworJWRlZmluZSBfTUFDUk9TX0lOQworCis7Cis7IElkZW50aWZ5IHRoZSBtb2R1bGUgd2UncmUgY29tcGlsaW5nOyB0aGUgImNvcnJlY3QiIHNob3VsZCBiZSBkZWZpbmVkCis7IGluIHRoZSBtb2R1bGUgaXRzZWxmIHRvIDEKKzsKKyVpZmRlZiBJU19TWVNMSU5VWAorICVkZWZpbmUgTVlfTkFNRSAnU1lTTElOVVgnCislZWxzZQorICVkZWZpbmUgSVNfU1lTTElOVVggMAorJWVuZGlmCislaWZkZWYgSVNfUFhFTElOVVgKKyAlZGVmaW5lIE1ZX05BTUUgJ1BYRUxJTlVYJworICVpZiBJU19MUFhFTElOVVggPiAwCisgICVkZWZpbmUgTVlfVFlQRSAnbHdJUCcKKyAlZWxzZQorICAlZGVmaW5lIE1ZX1RZUEUgJ1BYRScKKyAlZW5kaWYKKyVlbHNlCisgJWRlZmluZSBJU19QWEVMSU5VWCAwCislZW5kaWYKKyVpZmRlZiBJU19JU09MSU5VWAorICVkZWZpbmUgTVlfTkFNRSAnSVNPTElOVVgnCislZWxzZQorICVkZWZpbmUgSVNfSVNPTElOVVggMAorJWVuZGlmCislaWZkZWYgSVNfRVhUTElOVVgKKyAlZGVmaW5lIE1ZX05BTUUgJ0VYVExJTlVYJworJWVsc2UKKyAlZGVmaW5lIElTX0VYVExJTlVYIDAKKyVlbmRpZgorCis7Cis7IE1hY3JvcyBzaW1pbGFyIHRvIHJlc1tid2RdLCBidXQgd2hpY2ggd29ya3MgaW4gdGhlIGNvZGUgc2VnbWVudCAoYWZ0ZXIKKzsgc2VjdGlvbiAudGV4dDE2KSBvciB0aGUgZGF0YSBzZWdtZW50IChzZWN0aW9uIC5kYXRhMTYpCis7CislbWFjcm8JemIJMS5ub2xpc3QKKwl0aW1lcyAlMSBkYiAwCislZW5kbWFjcm8KKworJW1hY3JvCXp3CTEubm9saXN0CisJdGltZXMgJTEgZHcgMAorJWVuZG1hY3JvCisKKyVtYWNybwl6ZAkxLm5vbGlzdAorCXRpbWVzICUxIGRkIDAKKyVlbmRtYWNybworCis7Cis7IEFsaWduIHdpdGggemVybyBieXRlcyBpbiBhIHByb2diaXRzIHNlZ21lbnQKKzsKKyVtYWNybwlhbGlnbnoJMS5ub2xpc3QKKwl0aW1lcyAoKCglMSkgLSAoKCQtJCQpICUgKCUxKSkpICUgKCUxKSkgZGIgMAorJWVuZG1hY3JvCisKKzsKKzsgTWFjcm8gdG8gZW1pdCBhbiB1bnNpZ25lZCBkZWNpbWFsIG51bWJlciBhcyBhIHN0cmluZworOworJW1hY3JvIGFzY2lpZGVjCTEubm9saXN0CisgICVpZm5kZWYgREVQRU5ECTsgTm90IHNhZmUgZm9yICJkZXBlbmQiCisgICAgJXB1c2ggYXNjaWlkZWMKKyAgICAgICVhc3NpZ24gJSR2ICUxCisgICAgICAlaWYgJSR2ID09IDAKKyAgICAgICAgZGIgJzAnCisgICAgICAlZWxzZQorICAgICAgICAlYXNzaWduICUkZGNvdW50IDAKKyAgICAgICAgJWFzc2lnbiAlJG4gJSR2CisgICAgICAgICVhc3NpZ24gJSRkIDEKKyAgICAgICAgJXJlcCAyMAorICAgICAgICAgICVpZiAlJG4gIT0gMAorICAgICAgICAgICAgJWFzc2lnbiAlJGRjb3VudCAlJGRjb3VudCArIDEKKyAgICAgICAgICAgICVhc3NpZ24gJSRuICUkbiAvIDEwCisgICAgICAgICAgICAlYXNzaWduICUkZCAlJGQgKiAxMAorICAgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kcmVwCisgICAgICAgICVyZXAgJSRkY291bnQKKwkgICVhc3NpZ24gJSRkICUkZCAvIDEwCisgICAgICAgICAgZGIgKCglJHYgLyAlJGQpICUgMTApICsgJzAnCisgICAgICAgICVlbmRyZXAKKyAgICAgICVlbmRpZgorICAgICVwb3AKKyAgJWVuZGlmCislZW5kbWFjcm8KKworOworOyBNYWNyb3MgZm9yIG5ldHdvcmsgYnl0ZSBvcmRlciBvZiBjb25zdGFudHMKKzsKKyVkZWZpbmUgaHRvbnMoeCkgICggKCAoKHgpICYgMEZGaCkgPDwgOCApICsgKCAoKHgpICYgMEZGMDBoKSA+PiA4ICkgKQorJWRlZmluZSBudG9ocyh4KSBodG9ucyh4KQorJWRlZmluZSBodG9ubCh4KSAgKCAoICgoeCkgJiAwRkZoKSA8PCAyNCkgKyAoICgoeCkgJiAwRkYwMGgpIDw8IDggKSArICggKCh4KSAmIDBGRjAwMDBoKSA+PiA4ICkgKyAoICgoeCkgJiAwRkYwMDAwMDBoKSA+PiAyNCkgKQorJWRlZmluZSBudG9obCh4KSBodG9ubCh4KQorCis7Cis7IEFTQ0lJCis7CitDUgkJZXF1IDEzCQk7IENhcnJpYWdlIFJldHVybgorTEYJCWVxdSAxMAkJOyBMaW5lIEZlZWQKK0ZGCQllcXUgMTIJCTsgRm9ybSBGZWVkCitCUwkJZXF1ICA4CQk7IEJhY2tzcGFjZQorCislZW5kaWYgOyBfTUFDUk9TX0lOQwpkaWZmIC0tZ2l0IGEvY29yZS9tZW0vZnJlZS5jIGIvY29yZS9tZW0vZnJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMTZjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21lbS9mcmVlLmMKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBmcmVlLmMKKyAqCisgKiBWZXJ5IHNpbXBsZSBsaW5rZWQtbGlzdCBiYXNlZCBtYWxsb2MoKS9mcmVlKCkuCisgKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgIm1hbGxvYy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqCitfX2ZyZWVfYmxvY2soc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaCkKK3sKKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKnBhaCwgKm5haDsKKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmhlYWQgPQorCSZfX2NvcmVfbWFsbG9jX2hlYWRbQVJFTkFfSEVBUF9HRVQoYWgtPmEuYXR0cnMpXTsKKworICAgIHBhaCA9IGFoLT5hLnByZXY7CisgICAgbmFoID0gYWgtPmEubmV4dDsKKyAgICBpZiAoIEFSRU5BX1RZUEVfR0VUKHBhaC0+YS5hdHRycykgPT0gQVJFTkFfVFlQRV9GUkVFICYmCisgICAgICAgICAgIChjaGFyICopcGFoK0FSRU5BX1NJWkVfR0VUKHBhaC0+YS5hdHRycykgPT0gKGNoYXIgKilhaCApIHsKKyAgICAgICAgLyogQ29hbGVzY2UgaW50byB0aGUgcHJldmlvdXMgYmxvY2sgKi8KKyAgICAgICAgQVJFTkFfU0laRV9TRVQocGFoLT5hLmF0dHJzLCBBUkVOQV9TSVpFX0dFVChwYWgtPmEuYXR0cnMpICsKKwkJQVJFTkFfU0laRV9HRVQoYWgtPmEuYXR0cnMpKTsKKyAgICAgICAgcGFoLT5hLm5leHQgPSBuYWg7CisgICAgICAgIG5haC0+YS5wcmV2ID0gcGFoOworCisjaWZkZWYgREVCVUdfTUFMTE9DCisgICAgICAgIEFSRU5BX1RZUEVfU0VUKGFoLT5hLmF0dHJzLCBBUkVOQV9UWVBFX0RFQUQpOworI2VuZGlmCisKKyAgICAgICAgYWggPSBwYWg7CisgICAgICAgIHBhaCA9IGFoLT5hLnByZXY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTmVlZCB0byBhZGQgdGhpcyBibG9jayB0byB0aGUgZnJlZSBjaGFpbiAqLworICAgICAgICBBUkVOQV9UWVBFX1NFVChhaC0+YS5hdHRycywgQVJFTkFfVFlQRV9GUkVFKTsKKyAgICAgICAgYWgtPmEudGFnID0gTUFMTE9DX0ZSRUU7CisKKyAgICAgICAgYWgtPm5leHRfZnJlZSA9IGhlYWQtPm5leHRfZnJlZTsKKyAgICAgICAgYWgtPnByZXZfZnJlZSA9IGhlYWQ7CisgICAgICAgIGhlYWQtPm5leHRfZnJlZSA9IGFoOworICAgICAgICBhaC0+bmV4dF9mcmVlLT5wcmV2X2ZyZWUgPSBhaDsKKyAgICB9CisKKyAgICAvKiBJbiBlaXRoZXIgb2YgdGhlIHByZXZpb3VzIGNhc2VzLCB3ZSBtaWdodCBiZSBhYmxlIHRvIG1lcmdlCisgICAgICAgd2l0aCB0aGUgc3Vic2VxdWVudCBibG9jay4uLiAqLworICAgIGlmICggQVJFTkFfVFlQRV9HRVQobmFoLT5hLmF0dHJzKSA9PSBBUkVOQV9UWVBFX0ZSRUUgJiYKKyAgICAgICAgICAgKGNoYXIgKilhaCtBUkVOQV9TSVpFX0dFVChhaC0+YS5hdHRycykgPT0gKGNoYXIgKiluYWggKSB7CisgICAgICAgIEFSRU5BX1NJWkVfU0VUKGFoLT5hLmF0dHJzLCBBUkVOQV9TSVpFX0dFVChhaC0+YS5hdHRycykgKworCQlBUkVOQV9TSVpFX0dFVChuYWgtPmEuYXR0cnMpKTsKKworICAgICAgICAvKiBSZW1vdmUgdGhlIG9sZCBibG9jayBmcm9tIHRoZSBjaGFpbnMgKi8KKyAgICAgICAgbmFoLT5uZXh0X2ZyZWUtPnByZXZfZnJlZSA9IG5haC0+cHJldl9mcmVlOworICAgICAgICBuYWgtPnByZXZfZnJlZS0+bmV4dF9mcmVlID0gbmFoLT5uZXh0X2ZyZWU7CisgICAgICAgIGFoLT5hLm5leHQgPSBuYWgtPmEubmV4dDsKKyAgICAgICAgbmFoLT5hLm5leHQtPmEucHJldiA9IGFoOworCisjaWZkZWYgREVCVUdfTUFMTE9DCisgICAgICAgIEFSRU5BX1RZUEVfU0VUKG5haC0+YS5hdHRycywgQVJFTkFfVFlQRV9ERUFEKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIFJldHVybiB0aGUgYmxvY2sgdGhhdCBjb250YWlucyB0aGUgY2FsbGVkIGJsb2NrICovCisgICAgcmV0dXJuIGFoOworfQorCit2b2lkIGJpb3NfZnJlZSh2b2lkICpwdHIpCit7CisgICAgc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaDsKKworICAgIGFoID0gKHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqKQorICAgICAgICAoKHN0cnVjdCBhcmVuYV9oZWFkZXIgKilwdHIgLSAxKTsKKworI2lmZGVmIERFQlVHX01BTExPQworICAgIGlmIChhaC0+YS5tYWdpYyAhPSBBUkVOQV9NQUdJQykKKwlkcHJpbnRmKCJmYWlsZWQgZnJlZSgpIG1hZ2ljIGNoZWNrOiAlcFxuIiwgcHRyKTsKKworICAgIGlmIChBUkVOQV9UWVBFX0dFVChhaC0+YS5hdHRycykgIT0gQVJFTkFfVFlQRV9VU0VEKQorCWRwcmludGYoImludmFsaWQgYXJlbmEgdHlwZTogJWRcbiIsIEFSRU5BX1RZUEVfR0VUKGFoLT5hLmF0dHJzKSk7CisjZW5kaWYKKworICAgIF9fZnJlZV9ibG9jayhhaCk7Cit9CisKK19fZXhwb3J0IHZvaWQgZnJlZSh2b2lkICpwdHIpCit7CisgICAgZHByaW50ZigiZnJlZSglcCkgQCAlcFxuIiwgcHRyLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCisgICAgaWYgKCAhcHRyICkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2VtX2Rvd24oJl9fbWFsbG9jX3NlbWFwaG9yZSwgMCk7CisgICAgZmlybXdhcmUtPm1lbS0+ZnJlZShwdHIpOworICAgIHNlbV91cCgmX19tYWxsb2Nfc2VtYXBob3JlKTsKKworICAvKiBIZXJlIHdlIGNvdWxkIGluc2VydCBjb2RlIHRvIHJldHVybiBtZW1vcnkgdG8gdGhlIHN5c3RlbS4gKi8KK30KKworLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBpbnNlcnQgYSBibG9jayB3aGljaCBpcyBub3QgcHJldmlvdXNseSBvbiB0aGUKKyAqIGZyZWUgbGlzdC4gIE9ubHkgdGhlIGEuc2l6ZSBmaWVsZCBvZiB0aGUgYXJlbmEgaGVhZGVyIGlzIGFzc3VtZWQKKyAqIHRvIGJlIHZhbGlkLgorICovCit2b2lkIF9faW5qZWN0X2ZyZWVfYmxvY2soc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaCkKK3sKKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmhlYWQgPQorCSZfX2NvcmVfbWFsbG9jX2hlYWRbQVJFTkFfSEVBUF9HRVQoYWgtPmEuYXR0cnMpXTsKKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKm5haDsKKyAgICBzaXplX3QgYV9lbmQgPSAoc2l6ZV90KSBhaCArIEFSRU5BX1NJWkVfR0VUKGFoLT5hLmF0dHJzKTsKKyAgICBzaXplX3Qgbl9lbmQ7CisKKyAgICBkcHJpbnRmKCJpbmplY3Q6ICUjenggYnl0ZXMgQCAlcCwgaGVhcCAldSAoJXApXG4iLAorCSAgICBBUkVOQV9TSVpFX0dFVChhaC0+YS5hdHRycyksIGFoLAorCSAgICBBUkVOQV9IRUFQX0dFVChhaC0+YS5hdHRycyksIGhlYWQpOworCisgICAgc2VtX2Rvd24oJl9fbWFsbG9jX3NlbWFwaG9yZSwgMCk7CisKKyAgICBmb3IgKG5haCA9IGhlYWQtPmEubmV4dCA7IG5haCAhPSBoZWFkIDsgbmFoID0gbmFoLT5hLm5leHQpIHsKKyAgICAgICAgbl9lbmQgPSAoc2l6ZV90KSBuYWggKyBBUkVOQV9TSVpFX0dFVChuYWgtPmEuYXR0cnMpOworCisgICAgICAgIC8qIElzIG5haCBlbnRpcmVseSBiZXlvbmQgdGhpcyBibG9jaz8gKi8KKyAgICAgICAgaWYgKChzaXplX3QpIG5haCA+PSBhX2VuZCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIElzIHRoaXMgYmxvY2sgZW50aXJlbHkgYmV5b25kIG5haD8gKi8KKyAgICAgICAgaWYgKChzaXplX3QpIGFoID49IG5fZW5kKQorICAgICAgICAgICAgY29udGludWU7CisKKwlwcmludGYoImNvbmZsaWN0OmFoOiAlcCwgYV9lbmQ6ICVwLCBuYWg6ICVwLCBuX2VuZDogJXBcbiIsIGFoLCBhX2VuZCwgbmFoLCBuX2VuZCk7CisKKyAgICAgICAgLyogT3RoZXJ3aXNlIHdlIGhhdmUgc29tZSBzb3J0IG9mIG92ZXJsYXAgLSByZWplY3QgdGhpcyBibG9jayAqLworCXNlbV91cCgmX19tYWxsb2Nfc2VtYXBob3JlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIE5vdywgbmFoIHNob3VsZCBwb2ludCB0byB0aGUgc3VjY2Vzc29yIGJsb2NrICovCisgICAgYWgtPmEubmV4dCA9IG5haDsKKyAgICBhaC0+YS5wcmV2ID0gbmFoLT5hLnByZXY7CisgICAgbmFoLT5hLnByZXYgPSBhaDsKKyAgICBhaC0+YS5wcmV2LT5hLm5leHQgPSBhaDsKKworICAgIF9fZnJlZV9ibG9jayhhaCk7CisKKyAgICBzZW1fdXAoJl9fbWFsbG9jX3NlbWFwaG9yZSk7Cit9CisKKy8qCisgKiBGcmVlIGFsbCBtZW1vcnkgd2hpY2ggaXMgdGFnZ2VkIHdpdGggYSBzcGVjaWZpYyB0YWcuCisgKi8KK3N0YXRpYyB2b2lkIF9fZnJlZV90YWdnZWQobWFsbG9jX3RhZ190IHRhZykgeworICAgIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqZnAsICpoZWFkOworICAgIGludCBpOworCisgICAgc2VtX2Rvd24oJl9fbWFsbG9jX3NlbWFwaG9yZSwgMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkhFQVA7IGkrKykgeworCWRwcmludGYoIl9fZnJlZV90YWdnZWQoJXUpIGhlYXAgJWRcbiIsIHRhZywgaSk7CisJaGVhZCA9ICZfX2NvcmVfbWFsbG9jX2hlYWRbaV07CisJZm9yIChmcCA9IGhlYWQtPmEubmV4dCA7IGZwICE9IGhlYWQgOyBmcCA9IGZwLT5hLm5leHQpIHsKKwkgICAgaWYgKEFSRU5BX1RZUEVfR0VUKGZwLT5hLmF0dHJzKSA9PSBBUkVOQV9UWVBFX1VTRUQgJiYKKwkJZnAtPmEudGFnID09IHRhZykKKwkJZnAgPSBfX2ZyZWVfYmxvY2soZnApOworCX0KKyAgICB9CisKKyAgICBzZW1fdXAoJl9fbWFsbG9jX3NlbWFwaG9yZSk7CisgICAgZHByaW50ZigiX19mcmVlX3RhZ2dlZCgldSkgZG9uZVxuIiwgdGFnKTsKK30KKwordm9pZCBjb21ib290X2NsZWFudXBfbG93bWVtKGNvbTMyc3lzX3QgKnJlZ3MpCit7CisgICAgKHZvaWQpcmVnczsKKworICAgIF9fZnJlZV90YWdnZWQoTUFMTE9DX01PRFVMRSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL21lbS9pbml0LmMgYi9jb3JlL21lbS9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2ZDJlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvbWVtL2luaXQuYwpAQCAtMCwwICsxLDEwNCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibWFsbG9jLmgiCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgPHN5c2xpbnV4L21lbXNjYW4uaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisKK3N0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciBfX2NvcmVfbWFsbG9jX2hlYWRbTkhFQVBdOworCisvL3N0YXRpYyBfX2h1Z2Vic3MgY2hhciBtYWluX2hlYXBbMTI4IDw8IDEwXTsKK2V4dGVybiBjaGFyIF9fbG93bWVtX2hlYXBbXTsKK2V4dGVybiBjaGFyIGZyZWVfaGlnaF9tZW1vcnlbXTsKKworI2RlZmluZSBFODIwX01FTV9NQVggMHhmZmYwMDAwMAkvKiA0IEdCIC0gMSBNQiAqLworaW50IHNjYW5faGlnaG1lbV9hcmVhKHZvaWQgKmRhdGEsIGFkZHJfdCBzdGFydCwgYWRkcl90IGxlbiwKKwkJICAgICAgZW51bSBzeXNsaW51eF9tZW1tYXBfdHlwZXMgdHlwZSkKK3sKKwlzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmZwOworCisJKHZvaWQpZGF0YTsKKworCWRwcmludGYoInN0YXJ0ID0gJXgsIGxlbiA9ICV4LCB0eXBlID0gJWQiLCBzdGFydCwgbGVuLCB0eXBlKTsKKworCWlmIChzdGFydCA8IDB4MTAwMDAwIHx8IHN0YXJ0ID4gRTgyMF9NRU1fTUFYCisJCQkgICAgIHx8IHR5cGUgIT0gU01UX0ZSRUUpCisJCXJldHVybiAwOworCisJaWYgKHN0YXJ0IDwgX19jb20zMi5jc19tZW1zaXplKSB7CisJCWxlbiAtPSBfX2NvbTMyLmNzX21lbXNpemUgLSBzdGFydDsKKwkJc3RhcnQgPSBfX2NvbTMyLmNzX21lbXNpemU7CisJfQorCWlmIChsZW4gPiBFODIwX01FTV9NQVggLSBzdGFydCkKKwkJbGVuID0gRTgyMF9NRU1fTUFYIC0gc3RhcnQ7CisKKwlpZiAobGVuID49IDIgKiBzaXplb2Yoc3RydWN0IGFyZW5hX2hlYWRlcikpIHsKKwkJZnAgPSAoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICopc3RhcnQ7CisJCWZwLT5hLmF0dHJzID0gQVJFTkFfVFlQRV9VU0VEIHwgKEhFQVBfTUFJTiA8PCBBUkVOQV9IRUFQX1BPUyk7CisjaWZkZWYgREVCVUdfTUFMTE9DCisJCWZwLT5hLm1hZ2ljID0gQVJFTkFfTUFHSUM7CisjZW5kaWYKKwkJQVJFTkFfU0laRV9TRVQoZnAtPmEuYXR0cnMsIGxlbik7CisJCWRwcmludGYoIndpbGwgaW5qZWN0IGEgYmxvY2sgc3RhcnQ6MHgleCBzaXplIDB4JXgiLCBzdGFydCwgbGVuKTsKKwkJX19pbmplY3RfZnJlZV9ibG9jayhmcCk7CisJfQorCisJX19jb20zMi5jc19tZW1zaXplID0gc3RhcnQgKyBsZW47IC8qIHVwZGF0ZSB0aGUgSGlnaE1lbVNpemUgKi8KKwlyZXR1cm4gMDsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIG1wb29sX2R1bXAoZW51bSBoZWFwIGhlYXApCit7CisJc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpoZWFkID0gJl9fY29yZV9tYWxsb2NfaGVhZFtoZWFwXTsKKwlzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmZwOworCWludCBzaXplLCB0eXBlLCBpID0gMDsKKwlhZGRyX3Qgc3RhcnQsIGVuZDsKKworCWZwID0gaGVhZC0+bmV4dF9mcmVlOworCXdoaWxlIChmcCAhPSBoZWFkKSB7CisJCXNpemUgPSBBUkVOQV9TSVpFX0dFVChmcC0+YS5hdHRycyk7CisJCXR5cGUgPSBBUkVOQV9UWVBFX0dFVChmcC0+YS5hdHRycyk7CisJCXN0YXJ0ID0gKGFkZHJfdClmcDsKKwkJZW5kID0gc3RhcnQgKyBzaXplOworCQlwcmludGYoImFyZWFbJWRdOiBzdGFydCA9IDB4JTA4eCwgZW5kID0gMHglMDh4LCB0eXBlID0gJWRcbiIsCisJCQlpKyssIHN0YXJ0LCBlbmQsIHR5cGUpOworCQlmcCA9IGZwLT5uZXh0X2ZyZWU7CisJfQorfQorI2VuZGlmCisKK3VpbnQxNl90ICpiaW9zX2ZyZWVfbWVtOwordm9pZCBtZW1faW5pdCh2b2lkKQoreworCXN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqZnA7CisJaW50IGk7CisKKwkvL2RwcmludGYoImVudGVyIik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBoZWFkIG5vZGVzICovCisJZnAgPSAmX19jb3JlX21hbGxvY19oZWFkWzBdOworCWZvciAoaSA9IDAgOyBpIDwgTkhFQVAgOyBpKyspIHsKKwlmcC0+YS5uZXh0ID0gZnAtPmEucHJldiA9IGZwLT5uZXh0X2ZyZWUgPSBmcC0+cHJldl9mcmVlID0gZnA7CisJZnAtPmEuYXR0cnMgPSBBUkVOQV9UWVBFX0hFQUQgfCAoaSA8PCBBUkVOQV9IRUFQX1BPUyk7CisJZnAtPmEudGFnID0gTUFMTE9DX0hFQUQ7CisJZnArKzsKKwl9CisJCisJLy9kcHJpbnRmKCJfX2xvd21lbV9oZWFwID0gMHglcCBiaW9zX2ZyZWUgPSAweCVwIiwKKwkvLwlfX2xvd21lbV9oZWFwLCAqYmlvc19mcmVlX21lbSk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgbG93bWVtIGhlYXAgKi8KKwlmcCA9IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKilfX2xvd21lbV9oZWFwOworCWZwLT5hLmF0dHJzID0gQVJFTkFfVFlQRV9VU0VEIHwgKEhFQVBfTE9XTUVNIDw8IEFSRU5BX0hFQVBfUE9TKTsKKwlBUkVOQV9TSVpFX1NFVChmcC0+YS5hdHRycywgKCpiaW9zX2ZyZWVfbWVtIDw8IDEwKSAtICh1aW50cHRyX3QpZnApOworI2lmZGVmIERFQlVHX01BTExPQworCWZwLT5hLm1hZ2ljID0gQVJFTkFfTUFHSUM7CisjZW5kaWYKKwlfX2luamVjdF9mcmVlX2Jsb2NrKGZwKTsKKworCS8qIEluaXRpYWxpemUgdGhlIG1haW4gaGVhcCAqLworCV9fY29tMzIuY3NfbWVtc2l6ZSA9IChzaXplX3QpZnJlZV9oaWdoX21lbW9yeTsKKwlzeXNsaW51eF9zY2FuX21lbW9yeShzY2FuX2hpZ2htZW1fYXJlYSwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL21lbS9tYWxsb2MuYyBiL2NvcmUvbWVtL21hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MGMyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21lbS9tYWxsb2MuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIG1hbGxvYy5jCisgKgorICogVmVyeSBzaW1wbGUgbGlua2VkLWxpc3QgYmFzZWQgbWFsbG9jKCkvZnJlZSgpLgorICovCisKKyNpbmNsdWRlIDxzeXNsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSA8bWlubWF4Lmg+CisKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKworREVDTEFSRV9JTklUX1NFTUFQSE9SRShfX21hbGxvY19zZW1hcGhvcmUsIDEpOworCitzdGF0aWMgdm9pZCAqX19tYWxsb2NfZnJvbV9ibG9jayhzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmZwLAorCQkJCSBzaXplX3Qgc2l6ZSwgbWFsbG9jX3RhZ190IHRhZykKK3sKKyAgICBzaXplX3QgZnNpemU7CisgICAgc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpuZnAsICpuYTsKKyAgICB1bnNpZ25lZCBpbnQgaGVhcCA9IEFSRU5BX0hFQVBfR0VUKGZwLT5hLmF0dHJzKTsKKworICAgIGZzaXplID0gQVJFTkFfU0laRV9HRVQoZnAtPmEuYXR0cnMpOworCisgICAgLyogV2UgbmVlZCB0aGUgMiogdG8gYWNjb3VudCBmb3IgdGhlIGxhcmdlciByZXF1aXJlbWVudHMgb2YgYSBmcmVlIGJsb2NrICovCisgICAgaWYgKCBmc2l6ZSA+PSBzaXplKzIqc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpICkgeworICAgICAgICAvKiBCaWdnZXIgYmxvY2sgdGhhbiByZXF1aXJlZCAtLSBzcGxpdCBibG9jayAqLworICAgICAgICBuZnAgPSAoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICopKChjaGFyICopZnAgKyBzaXplKTsKKyAgICAgICAgbmEgPSBmcC0+YS5uZXh0OworCisgICAgICAgIEFSRU5BX1RZUEVfU0VUKG5mcC0+YS5hdHRycywgQVJFTkFfVFlQRV9GUkVFKTsKKwlBUkVOQV9IRUFQX1NFVChuZnAtPmEuYXR0cnMsIGhlYXApOworICAgICAgICBBUkVOQV9TSVpFX1NFVChuZnAtPmEuYXR0cnMsIGZzaXplLXNpemUpOworICAgICAgICBuZnAtPmEudGFnID0gTUFMTE9DX0ZSRUU7CisjaWZkZWYgREVCVUdfTUFMTE9DCisJbmZwLT5hLm1hZ2ljID0gQVJFTkFfTUFHSUM7CisjZW5kaWYKKyAgICAgICAgQVJFTkFfVFlQRV9TRVQoZnAtPmEuYXR0cnMsIEFSRU5BX1RZUEVfVVNFRCk7CisgICAgICAgIEFSRU5BX1NJWkVfU0VUKGZwLT5hLmF0dHJzLCBzaXplKTsKKyAgICAgICAgZnAtPmEudGFnID0gdGFnOworCisgICAgICAgIC8qIEluc2VydCBpbnRvIGFsbC1ibG9jayBjaGFpbiAqLworICAgICAgICBuZnAtPmEucHJldiA9IGZwOworICAgICAgICBuZnAtPmEubmV4dCA9IG5hOworICAgICAgICBuYS0+YS5wcmV2ID0gbmZwOworICAgICAgICBmcC0+YS5uZXh0ID0gbmZwOworCisgICAgICAgIC8qIFJlcGxhY2UgY3VycmVudCBibG9jayBvbiBmcmVlIGNoYWluICovCisgICAgICAgIG5mcC0+bmV4dF9mcmVlID0gZnAtPm5leHRfZnJlZTsKKyAgICAgICAgbmZwLT5wcmV2X2ZyZWUgPSBmcC0+cHJldl9mcmVlOworICAgICAgICBmcC0+bmV4dF9mcmVlLT5wcmV2X2ZyZWUgPSBuZnA7CisgICAgICAgIGZwLT5wcmV2X2ZyZWUtPm5leHRfZnJlZSA9IG5mcDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgd2hvbGUgYmxvY2sgKi8KKyAgICAgICAgQVJFTkFfVFlQRV9TRVQoZnAtPmEuYXR0cnMsIEFSRU5BX1RZUEVfVVNFRCk7CisgICAgICAgIGZwLT5hLnRhZyA9IHRhZzsKKworICAgICAgICAvKiBSZW1vdmUgZnJvbSBmcmVlIGNoYWluICovCisgICAgICAgIGZwLT5uZXh0X2ZyZWUtPnByZXZfZnJlZSA9IGZwLT5wcmV2X2ZyZWU7CisgICAgICAgIGZwLT5wcmV2X2ZyZWUtPm5leHRfZnJlZSA9IGZwLT5uZXh0X2ZyZWU7CisgICAgfQorCisgICAgcmV0dXJuICh2b2lkICopKCZmcC0+YSArIDEpOworfQorCit2b2lkICpiaW9zX21hbGxvYyhzaXplX3Qgc2l6ZSwgZW51bSBoZWFwIGhlYXAsIG1hbGxvY190YWdfdCB0YWcpCit7CisgICAgc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpmcDsKKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmhlYWQgPSAmX19jb3JlX21hbGxvY19oZWFkW2hlYXBdOworICAgIHZvaWQgKnAgPSBOVUxMOworCisgICAgaWYgKHNpemUpIHsKKwkvKiBBZGQgdGhlIG9ibGlnYXRvcnkgYXJlbmEgaGVhZGVyLCBhbmQgcm91bmQgdXAgKi8KKwlzaXplID0gKHNpemUgKyAyICogc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpIC0gMSkgJiBBUkVOQV9TSVpFX01BU0s7CisKKwlmb3IgKCBmcCA9IGhlYWQtPm5leHRfZnJlZSA7IGZwICE9IGhlYWQgOyBmcCA9IGZwLT5uZXh0X2ZyZWUgKSB7CisJICAgIGlmICggQVJFTkFfU0laRV9HRVQoZnAtPmEuYXR0cnMpID49IHNpemUgKSB7CisJCS8qIEZvdW5kIGZpdCAtLSBhbGxvY2F0ZSBvdXQgb2YgdGhpcyBibG9jayAqLworCQlwID0gX19tYWxsb2NfZnJvbV9ibG9jayhmcCwgc2l6ZSwgdGFnKTsKKwkJYnJlYWs7CisJICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCAqX21hbGxvYyhzaXplX3Qgc2l6ZSwgZW51bSBoZWFwIGhlYXAsIG1hbGxvY190YWdfdCB0YWcpCit7CisgICAgdm9pZCAqcDsKKworICAgIGRwcmludGYoIl9tYWxsb2MoJXp1LCAldSwgJXUpIEAgJXAgPSAiLAorCXNpemUsIGhlYXAsIHRhZywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKworICAgIHNlbV9kb3duKCZfX21hbGxvY19zZW1hcGhvcmUsIDApOworICAgIHAgPSBmaXJtd2FyZS0+bWVtLT5tYWxsb2Moc2l6ZSwgaGVhcCwgdGFnKTsKKyAgICBzZW1fdXAoJl9fbWFsbG9jX3NlbWFwaG9yZSk7CisKKyAgICBkcHJpbnRmKCIlcFxuIiwgcCk7CisgICAgcmV0dXJuIHA7Cit9CisKK19fZXhwb3J0IHZvaWQgKm1hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gX21hbGxvYyhzaXplLCBIRUFQX01BSU4sIE1BTExPQ19DT1JFKTsKK30KKworX19leHBvcnQgdm9pZCAqbG1hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICpwOworCisgICAgcCA9IF9tYWxsb2Moc2l6ZSwgSEVBUF9MT1dNRU0sIE1BTExPQ19DT1JFKTsKKyAgICBpZiAoIXApCisJZXJybm8gPSBFTk9NRU07CisgICAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgKnBtYXBpX2xtYWxsb2Moc2l6ZV90IHNpemUpCit7CisgICAgcmV0dXJuIF9tYWxsb2Moc2l6ZSwgSEVBUF9MT1dNRU0sIE1BTExPQ19NT0RVTEUpOworfQorCit2b2lkICpiaW9zX3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFoLCAqbmFoOworICAgIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqaGVhZDsKKworICAgIHZvaWQgKm5ld3B0cjsKKyAgICBzaXplX3QgbmV3c2l6ZSwgb2xkc2l6ZSwgeHNpemU7CisKKyAgICBpZiAoIXB0cikKKwlyZXR1cm4gbWFsbG9jKHNpemUpOworCisgICAgaWYgKHNpemUgPT0gMCkgeworCWZyZWUocHRyKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBhaCA9IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKikKKwkoKHN0cnVjdCBhcmVuYV9oZWFkZXIgKilwdHIgLSAxKTsKKworCWhlYWQgPSAmX19jb3JlX21hbGxvY19oZWFkW0FSRU5BX0hFQVBfR0VUKGFoLT5hLmF0dHJzKV07CisKKyNpZmRlZiBERUJVR19NQUxMT0MKKyAgICBpZiAoYWgtPmEubWFnaWMgIT0gQVJFTkFfTUFHSUMpCisJZHByaW50ZigiZmFpbGVkIHJlYWxsb2MoKSBtYWdpYyBjaGVjazogJXBcbiIsIHB0cik7CisjZW5kaWYKKworICAgIC8qIEFjdHVhbCBzaXplIG9mIHRoZSBvbGQgYmxvY2sgKi8KKyAgICAvL29sZHNpemUgPSBhaC0+YS5zaXplOworICAgIG9sZHNpemUgPSBBUkVOQV9TSVpFX0dFVChhaC0+YS5hdHRycyk7CisKKyAgICAvKiBBZGQgdGhlIG9ibGlnYXRvcnkgYXJlbmEgaGVhZGVyLCBhbmQgcm91bmQgdXAgKi8KKyAgICBuZXdzaXplID0gKHNpemUgKyAyICogc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpIC0gMSkgJiBBUkVOQV9TSVpFX01BU0s7CisKKyAgICBpZiAob2xkc2l6ZSA+PSBuZXdzaXplICYmIG5ld3NpemUgPj0gKG9sZHNpemUgPj4gMikgJiYKKwlvbGRzaXplIC0gbmV3c2l6ZSA8IDQwOTYpIHsKKwkvKiBUaGlzIGFsbG9jYXRpb24gaXMgY2xvc2UgZW5vdWdoIGFscmVhZHkuICovCisJcmV0dXJuIHB0cjsKKyAgICB9IGVsc2UgeworCXhzaXplID0gb2xkc2l6ZTsKKworCW5haCA9IGFoLT5hLm5leHQ7CisJaWYgKChjaGFyICopbmFoID09IChjaGFyICopYWggKyBBUkVOQV9TSVpFX0dFVChhaC0+YS5hdHRycykgJiYKKwkJQVJFTkFfVFlQRV9HRVQobmFoLT5hLmF0dHJzKSA9PSBBUkVOQV9UWVBFX0ZSRUUgJiYKKwkJQVJFTkFfU0laRV9HRVQobmFoLT5hLmF0dHJzKSArIG9sZHNpemUgPj0gbmV3c2l6ZSkgeworCSAgICAvL25haC0+YS50eXBlID09IEFSRU5BX1RZUEVfRlJFRSAmJgorCSAgICAvL29sZHNpemUgKyBuYWgtPmEuc2l6ZSA+PSBuZXdzaXplKSB7CisJICAgIC8qIE1lcmdlIGluIHN1YnNlcXVlbnQgZnJlZSBibG9jayAqLworCSAgICBhaC0+YS5uZXh0ID0gbmFoLT5hLm5leHQ7CisJICAgIGFoLT5hLm5leHQtPmEucHJldiA9IGFoOworCSAgICBuYWgtPm5leHRfZnJlZS0+cHJldl9mcmVlID0gbmFoLT5wcmV2X2ZyZWU7CisJICAgIG5haC0+cHJldl9mcmVlLT5uZXh0X2ZyZWUgPSBuYWgtPm5leHRfZnJlZTsKKwkgICAgQVJFTkFfU0laRV9TRVQoYWgtPmEuYXR0cnMsIEFSRU5BX1NJWkVfR0VUKGFoLT5hLmF0dHJzKSArCisJCQkgICBBUkVOQV9TSVpFX0dFVChuYWgtPmEuYXR0cnMpKTsKKwkgICAgeHNpemUgPSBBUkVOQV9TSVpFX0dFVChhaC0+YS5hdHRycyk7CisJfQorCisJaWYgKHhzaXplID49IG5ld3NpemUpIHsKKwkgICAgLyogV2UgY2FuIHJlYWxsb2NhdGUgaW4gcGxhY2UgKi8KKwkgICAgaWYgKHhzaXplID49IG5ld3NpemUgKyAyICogc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpKSB7CisJCS8qIFJlc2lkdWFsIGZyZWUgYmxvY2sgYXQgZW5kICovCisJCW5haCA9IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKikoKGNoYXIgKilhaCArIG5ld3NpemUpOworCQlBUkVOQV9UWVBFX1NFVChuYWgtPmEuYXR0cnMsIEFSRU5BX1RZUEVfRlJFRSk7CisJCUFSRU5BX1NJWkVfU0VUKG5haC0+YS5hdHRycywgeHNpemUgLSBuZXdzaXplKTsKKwkJQVJFTkFfU0laRV9TRVQoYWgtPmEuYXR0cnMsIG5ld3NpemUpOworCQlBUkVOQV9IRUFQX1NFVChuYWgtPmEuYXR0cnMsIEFSRU5BX0hFQVBfR0VUKGFoLT5hLmF0dHJzKSk7CisKKyNpZmRlZiBERUJVR19NQUxMT0MKKwkJbmFoLT5hLm1hZ2ljID0gQVJFTkFfTUFHSUM7CisjZW5kaWYKKworCQkvL25haC0+YS50eXBlID0gQVJFTkFfVFlQRV9GUkVFOworCQkvL25haC0+YS5zaXplID0geHNpemUgLSBuZXdzaXplOworCQkvL2FoLT5hLnNpemUgPSBuZXdzaXplOworCisJCS8qIEluc2VydCBpbnRvIGJsb2NrIGxpc3QgKi8KKwkJbmFoLT5hLm5leHQgPSBhaC0+YS5uZXh0OworCQlhaC0+YS5uZXh0ID0gbmFoOworCQluYWgtPmEubmV4dC0+YS5wcmV2ID0gbmFoOworCQluYWgtPmEucHJldiA9IGFoOworCisJCS8qIEluc2VydCBpbnRvIGZyZWUgbGlzdCAqLworCQlpZiAobmV3c2l6ZSA+IG9sZHNpemUpIHsKKwkJICAgIC8qIEhhY2s6IHRoaXMgZnJlZSBibG9jayBpcyBpbiB0aGUgcGF0aCBvZiBhIG1lbW9yeSBvYmplY3QKKwkJICAgICAgIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gZ3Jvd24gYXQgbGVhc3Qgb25jZS4gIEFzIHN1Y2gsIHB1dAorCQkgICAgICAgaXQgYXQgdGhlICplbmQqIG9mIHRoZSBmcmVlbGlzdCBpbnN0ZWFkIG9mIHRoZSBiZWdpbm5pbmc7CisJCSAgICAgICB0cnlpbmcgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlYWxsb2MoKXMgb2YgdGhlIHNhbWUgYmxvY2suICovCisJCSAgICBuYWgtPnByZXZfZnJlZSA9IGhlYWQtPnByZXZfZnJlZTsKKwkJICAgIG5haC0+bmV4dF9mcmVlID0gaGVhZDsKKwkJICAgIGhlYWQtPnByZXZfZnJlZSA9IG5haDsKKwkJICAgIG5haC0+cHJldl9mcmVlLT5uZXh0X2ZyZWUgPSBuYWg7CisJCX0gZWxzZSB7CisJCSAgICBuYWgtPm5leHRfZnJlZSA9IGhlYWQtPm5leHRfZnJlZTsKKwkJICAgIG5haC0+cHJldl9mcmVlID0gaGVhZDsKKwkJICAgIGhlYWQtPm5leHRfZnJlZSA9IG5haDsKKwkJICAgIG5haC0+bmV4dF9mcmVlLT5wcmV2X2ZyZWUgPSBuYWg7CisJCX0KKyAgIAkgICAgfQorCSAgICAvKiBvdGhlcndpc2UsIHVzZSB1cCB0aGUgd2hvbGUgYmxvY2sgKi8KKwkgICAgcmV0dXJuIHB0cjsKKwl9IGVsc2UgeworCSAgICAvKiBMYXN0IHJlc29ydDogbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayBhbmQgY29weSAqLworCSAgICBvbGRzaXplIC09IHNpemVvZihzdHJ1Y3QgYXJlbmFfaGVhZGVyKTsKKwkgICAgbmV3cHRyID0gbWFsbG9jKHNpemUpOworCSAgICBpZiAobmV3cHRyKSB7CisJCW1lbWNweShuZXdwdHIsIHB0ciwgbWluKHNpemUsIG9sZHNpemUpKTsKKwkJZnJlZShwdHIpOworCSAgICB9CisJICAgIHJldHVybiBuZXdwdHI7CisJfQorICAgIH0KK30KKworX19leHBvcnQgdm9pZCAqcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworICAgIHJldHVybiBmaXJtd2FyZS0+bWVtLT5yZWFsbG9jKHB0ciwgc2l6ZSk7Cit9CisKK19fZXhwb3J0IHZvaWQgKnphbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICpwdHI7CisKKyAgICBwdHIgPSBtYWxsb2Moc2l6ZSk7CisgICAgaWYgKHB0cikKKwltZW1zZXQocHRyLCAwLCBzaXplKTsKKworICAgIHJldHVybiBwdHI7Cit9CmRpZmYgLS1naXQgYS9jb3JlL21lbS9tYWxsb2MuaCBiL2NvcmUvbWVtL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTFhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL21lbS9tYWxsb2MuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogbWFsbG9jLmgKKyAqCisgKiBJbnRlcm5hbHMgZm9yIHRoZSBtZW1vcnkgYWxsb2NhdG9yCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKworZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmUgX19tYWxsb2Nfc2VtYXBob3JlOworCisvKgorICogVGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrLiAgSW4gU3lzbGludXggNSB0aGlzIHdpbGwgYmUgYSBwb2ludGVyIHRvCisgKiB0aGUgb3duZXIgbW9kdWxlLgorICovCit0eXBlZGVmIHNpemVfdCBtYWxsb2NfdGFnX3Q7CitlbnVtIG1hbGxvY19vd25lciB7CisgICAgTUFMTE9DX0ZSRUUsCisgICAgTUFMTE9DX0hFQUQsCisgICAgTUFMTE9DX0NPUkUsCisgICAgTUFMTE9DX01PRFVMRSwKK307CisKK2VudW0gYXJlbmFfdHlwZSB7CisgICAgQVJFTkFfVFlQRV9VU0VEID0gMCwKKyAgICBBUkVOQV9UWVBFX0ZSRUUgPSAxLAorICAgIEFSRU5BX1RZUEVfSEVBRCA9IDIsCisgICAgQVJFTkFfVFlQRV9ERUFEID0gMywKK307CitlbnVtIGhlYXAgeworICAgIEhFQVBfTUFJTiwKKyAgICBIRUFQX0xPV01FTSwKKyAgICBOSEVBUAorfTsKKworI2RlZmluZSBBUkVOQV9NQUdJQyAweDIwMTMwMTE3CisKK3N0cnVjdCBmcmVlX2FyZW5hX2hlYWRlcjsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3by4gIFRoaXMgYmVjb21lcyB0aGUKKyAqIGFsaWdubWVudCB1bml0LgorICovCitzdHJ1Y3QgYXJlbmFfaGVhZGVyIHsKKyAgICBtYWxsb2NfdGFnX3QgdGFnOworICAgIHNpemVfdCBhdHRyczsJCQkvKiBCaXRzIDAuLjE6ICBUeXBlCisJCQkJCSAgICAgICAgMi4uMzogIEhlYXAsCisJCQkJCQk0Li4zMTogTVNCIG9mIHRoZSBzaXplICAqLworICAgIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqbmV4dCwgKnByZXY7CisKKyNpZmRlZiBERUJVR19NQUxMT0MKKyAgICB1bnNpZ25lZCBsb25nIF9wYWRbM107CisgICAgdW5zaWduZWQgaW50IG1hZ2ljOworI2VuZGlmCit9OworCisvKiBQYWQgdG8gMipzaXplb2Yoc3RydWN0IGFyZW5hX2hlYWRlcikgKi8KKyNkZWZpbmUgQVJFTkFfUEFERElORyAoKDIgKiBzaXplb2Yoc3RydWN0IGFyZW5hX2hlYWRlcikpIC0gXAorCQkgICAgICAgKHNpemVvZihzdHJ1Y3QgYXJlbmFfaGVhZGVyKSArIFwKKwkJCXNpemVvZihzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKikgKwlcCisJCQlzaXplb2Yoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICopKSkKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBubyBtb3JlIHRoYW4gdHdpY2UgdGhlIHNpemUgb2YgdGhlCisgKiBwcmV2aW91cyBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciB7CisgICAgc3RydWN0IGFyZW5hX2hlYWRlciBhOworICAgIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqbmV4dF9mcmVlLCAqcHJldl9mcmVlOworICAgIHNpemVfdCBfcGFkW0FSRU5BX1BBRERJTkddOworfTsKKworI2RlZmluZSBBUkVOQV9TSVpFX01BU0sgKH4odWludHB0cl90KShzaXplb2Yoc3RydWN0IGFyZW5hX2hlYWRlciktMSkpCisjZGVmaW5lIEFSRU5BX0hFQVBfTUFTSyAoKHNpemVfdCkweGMpCisjZGVmaW5lIEFSRU5BX0hFQVBfUE9TCTIKKyNkZWZpbmUgQVJFTkFfVFlQRV9NQVNLCSgoc2l6ZV90KTB4MykKKworI2RlZmluZSBBUkVOQV9BTElHTl9VUChwKQkoKGNoYXIgKikoKCh1aW50cHRyX3QpKHApICsgfkFSRU5BX1NJWkVfTUFTSykgXAorCQkJCQkgICYgQVJFTkFfU0laRV9NQVNLKSkKKyNkZWZpbmUgQVJFTkFfQUxJR05fRE9XTihwKQkoKGNoYXIgKikoKHVpbnRwdHJfdCkocCkgJiBBUkVOQV9TSVpFX01BU0spKQorCisjZGVmaW5lIEFSRU5BX1NJWkVfR0VUKGF0dHJzKQkoKGF0dHJzKSAmIEFSRU5BX1NJWkVfTUFTSykKKyNkZWZpbmUgQVJFTkFfSEVBUF9HRVQoYXR0cnMpCSgoKGF0dHJzKSAmIEFSRU5BX0hFQVBfTUFTSykgPj4gQVJFTkFfSEVBUF9QT1MpCisjZGVmaW5lIEFSRU5BX1RZUEVfR0VUKGF0dHJzKQkoKGF0dHJzKSAmIEFSRU5BX1RZUEVfTUFTSykKKworI2RlZmluZSBBUkVOQV9TSVpFX1NFVChhdHRycywgc2l6ZSkJXAorCSgoYXR0cnMpID0gKChzaXplKSAmIEFSRU5BX1NJWkVfTUFTSykgfCAoKGF0dHJzKSAmIH5BUkVOQV9TSVpFX01BU0spKQorI2RlZmluZSBBUkVOQV9IRUFQX1NFVChhdHRycywgaGVhcCkJXAorCSgoYXR0cnMpID0gKCgoaGVhcCkgPDwgQVJFTkFfSEVBUF9QT1MpICYgQVJFTkFfSEVBUF9NQVNLKSB8IFwKKwkgKChhdHRycykgJiB+QVJFTkFfSEVBUF9NQVNLKSkKKyNkZWZpbmUgQVJFTkFfVFlQRV9TRVQoYXR0cnMsIHR5cGUpIFwKKwkoKGF0dHJzKSA9ICgoYXR0cnMpICYgfkFSRU5BX1RZUEVfTUFTSykgfCBcCisJICgodHlwZSkgJiBBUkVOQV9UWVBFX01BU0spKQorCitleHRlcm4gc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyIF9fY29yZV9tYWxsb2NfaGVhZFtOSEVBUF07Cit2b2lkIF9faW5qZWN0X2ZyZWVfYmxvY2soc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaCk7CmRpZmYgLS1naXQgYS9jb3JlL3BhdGguYyBiL2NvcmUvcGF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNTE3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3BhdGguYwpAQCAtMCwwICsxLDQyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBNYXR0IEZsZW1pbmcKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK19fZXhwb3J0IExJU1RfSEVBRChQQVRIKTsKKworX19leHBvcnQgc3RydWN0IHBhdGhfZW50cnkgKnBhdGhfYWRkKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBzdHJ1Y3QgcGF0aF9lbnRyeSAqZW50cnk7CisKKyAgICBpZiAoIXN0cmxlbihzdHIpKQorCXJldHVybiBOVUxMOworCisgICAgZW50cnkgPSBtYWxsb2Moc2l6ZW9mKCplbnRyeSkpOworICAgIGlmICghZW50cnkpCisJcmV0dXJuIE5VTEw7CisKKyAgICBlbnRyeS0+c3RyID0gc3RyZHVwKHN0cik7CisgICAgaWYgKCFlbnRyeS0+c3RyKQorCWdvdG8gYmFpbDsKKworICAgIGxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJlBBVEgpOworCisgICAgcmV0dXJuIGVudHJ5OworCitiYWlsOgorICAgIGZyZWUoZW50cnkpOworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvY29yZS9wbGFpbmNvbi5jIGIvY29yZS9wbGFpbmNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzI1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3BsYWluY29uLmMKQEAgLTAsMCArMSwzNyBAQAorI2luY2x1ZGUgPHN5cy9pby5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKworI2luY2x1ZGUgImJpb3MuaCIKKyNpbmNsdWRlICJncmFwaGljcy5oIgorI2luY2x1ZGUgPHN5c2xpbnV4L3ZpZGVvLmg+CisKKy8qCisgKiBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIgaW4gQUwgdG8gdGhlIGNvbnNvbGUgd2l0aG91dAorICogbWFuZ2xpbmcgYW55IHJlZ2lzdGVyczsgaGFuZGxlIHZpZGVvIHBhZ2VzIGNvcnJlY3RseS4KKyAqLworX19leHBvcnQgdm9pZCB3cml0ZWNocihjaGFyIGRhdGEpCit7CisJY29tMzJzeXNfdCBpcmVnLCBvcmVnOworCisgICAgICAgIG1lbXNldCgmaXJlZywgMCwgc2l6ZW9mIGlyZWcpOworICAgICAgICBtZW1zZXQoJm9yZWcsIDAsIHNpemVvZiBvcmVnKTsKKwl3cml0ZV9zZXJpYWwoZGF0YSk7CS8qIHdyaXRlIHRvIHNlcmlhbCBwb3J0IGlmIG5lZWRlZCAqLworCisJaWYgKFVzaW5nVkdBICYgMHg4KQorCQlzeXNsaW51eF9mb3JjZV90ZXh0X21vZGUoKTsKKworCWlmICghKERpc3BsYXlDb24gJiAweDEpKQorCQlyZXR1cm47CisKKwlpcmVnLmVheC5iWzBdID0gZGF0YTsKKwlpcmVnLmVheC5iWzFdID0gMHhFOworCWlyZWcuZWJ4LmJbMF0gPSAweDA3OwkvKiBhdHRyaWJ1dGUgKi8KKwlpcmVnLmVieC5iWzFdID0gKih1aW50OF90ICopQklPU19wYWdlOyAvKiBjdXJyZW50IHBhZ2UgKi8KKwlfX2ludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKK30KKwordm9pZCBwbV93cml0ZWNocihjb20zMnN5c190ICpyZWdzKQoreworCXdyaXRlY2hyKHJlZ3MtPmVheC5iWzBdKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvcG0uaW5jIGIvY29yZS9wbS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ODk0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcG0uaW5jCkBAIC0wLDAgKzEsNDcxIEBACis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsKKzs7ICAgQ29weXJpZ2h0IDE5OTQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzs7ICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKzs7Cis7OyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7OyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7OyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorOzsgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOzsgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKzs7Cis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7OworOzsgcG0uaW5jCis7OworOzsgRnVuY3Rpb25zIHRvIGVudGVyIGFuZCBleGl0IDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSwgaGFuZGxlIGludGVycnVwdHMKKzs7IGFuZCBjcm9zcy1tb2RlIGNhbGxzLgorOzsKKzs7IFBNIHJlZmVycyB0byAzMi1iaXQgZmxhdCBwcm90ZWN0ZWQgbW9kZTsgUk0gdG8gMTYtYml0IHJlYWwgbW9kZS4KKzs7CisKKwkJYml0cyAxNgorCQlzZWN0aW9uIC50ZXh0MTYKKzsKKzsgX3BtX2NhbGw6IGNhbGwgUE0gcm91dGluZSBpbiBsb3cgbWVtb3J5IGZyb20gUk0KKzsKKzsJb24gc3RhY2sJPSBQTSByb3V0aW5lIHRvIGNhbGwgKGEgMzItYml0IGFkZHJlc3MpCis7Cis7CUVDWCwgRVNJLCBFREkgcGFzc2VkIHRvIHRoZSBjYWxsZWQgZnVuY3Rpb247Cis7CUVBWCA9IEVCUCBpbiB0aGUgY2FsbGVkIGZ1bmN0aW9uIHBvaW50cyB0byB0aGUgc3RhY2sgZnJhbWUKKzsJd2hpY2ggaW5jbHVkZXMgYWxsIHJlZ2lzdGVycyAod2hpY2ggY2FuIGJlIGNoYW5nZWQgaWYgZGVzaXJlZC4pCis7Cis7CUFsbCByZWdpc3RlcnMgYW5kIHRoZSBmbGFncyBzYXZlZC9yZXN0b3JlZAorOworOwlUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCBieSB0aGUgcG1fY2FsbCBtYWNyby4KKzsKK19wbV9jYWxsOgorCQlwdXNoZmQKKwkJcHVzaGFkCisJCXB1c2ggZHMKKwkJcHVzaCBlcworCQlwdXNoIGZzCisJCXB1c2ggZ3MKKwkJbW92IGJwLHNwCisJCW1vdiBheCxjcworCQltb3YgZWJ4LC5wbQorCQltb3YgZHMsYXgKKwkJam1wIGVudGVyX3BtCisKKwkJYml0cyAzMgorCQlzZWN0aW9uIC50ZXh0bnIKKy5wbToKKwkJOyBFQVggcG9pbnRzIHRvIHRoZSB0b3Agb2YgdGhlIFJNIHN0YWNrLCB3aGljaCBpcyBFRkxBR1MKKwkJdGVzdCBSTV9GTEFHU0gsMDJoCQk7IFJNIEVGTEFHUy5JRgorCQlqeiAubm9fc3RpCisJCXN0aQorLm5vX3N0aToKKwkJY2FsbCBbZWJwKzQqMis5KjQrMl0JCTsgRW50cnlwb2ludCBvbiBSTSBzdGFjaworCQltb3YgYngsLnJtCisJCWptcCBlbnRlcl9ybQorCisJCWJpdHMgMTYKKwkJc2VjdGlvbiAudGV4dDE2Cisucm06CisJCXBvcCBncworCQlwb3AgZnMKKwkJcG9wIGVzCisJCXBvcCBkcworCQlwb3BhZAorCQlwb3BmZAorCQlyZXQgNAkJOyBEcm9wIGVudHJ5cG9pbnQKKworOworOyBlbnRlcl9wbTogR28gdG8gUE0gd2l0aCBpbnRlcnJ1cHQgc2VydmljZSBjb25maWd1cmVkCis7CUVCWAkgID0gUE0gZW50cnkgcG9pbnQKKzsJRUFYID0gRUJQID0gb24gZXhpdCwgcG9pbnRzIHRvIHRoZSBSTSBzdGFjayBhcyBhIDMyLWJpdCB2YWx1ZQorOwlFQ1gsIEVEWCwgRVNJLCBFREkgcHJlc2VydmVkIGFjcm9zcyB0aGlzIHJvdXRpbmUKKzsKKzsJQXNzdW1lcyBDUyA9PSBEUworOworOyBUaGlzIHJvdXRpbmUgZG9lc24ndCBlbmFibGUgaW50ZXJydXB0cywgYnV0IHRoZSB0YXJnZXQgcm91dGluZQorOyBjYW4gZW5hYmxlIGludGVycnVwdHMgYnkgZXhlY3V0aW5nIFNUSS4KKzsKKwkJYml0cyAxNgorCQlzZWN0aW9uIC50ZXh0MTYKK2VudGVyX3BtOgorCQljbGkKKwkJeG9yIGVheCxlYXgKKwkJbW92IGRzLGF4CisJCW1vdiBheCxzcworCQltb3YgW1JlYWxNb2RlU1NTUF0sc3AKKwkJbW92IFtSZWFsTW9kZVNTU1ArMl0sYXgKKwkJbW92enggZWJwLHNwCisJCXNobCBlYXgsNAorCQlhZGQgZWJwLGVheAkJOyBFQlAgLT4gdG9wIG9mIHJlYWwtbW9kZSBzdGFjaworCQljbGQKKwkJY2FsbCBlbmFibGVfYTIwCisKKy5hMjBvazoKKwkJbW92IGJ5dGUgW2Jjb3B5X2dkdC5UU1MrNV0sODloCTsgTWFyayBUU1MgdW5idXN5CisKKwkJbGdkdCBbYmNvcHlfZ2R0XQk7IFdlIGNhbiB1c2UgdGhlIHNhbWUgR0RUIGp1c3QgZmluZQorCQlsaWR0IFtQTV9JRFRfcHRyXQk7IFNldCB1cCB0aGUgSURUCisJCW1vdiBlYXgsY3IwCisJCW9yIGFsLDEKKwkJbW92IGNyMCxlYXgJCTsgRW50ZXIgcHJvdGVjdGVkIG1vZGUKKwkJam1wIFBNX0NTMzI6LmluX3BtCisKKwkJYml0cyAzMgorCQlzZWN0aW9uIC50ZXh0bnIKKy5pbl9wbToKKwkJeG9yIGVheCxlYXgJCTsgQXZhaWxhYmxlIGZvciBmdXR1cmUgdXNlLi4uCisJCW1vdiBmcyxlYXgKKwkJbW92IGdzLGVheAorCQlsbGR0IGF4CisKKwkJbW92IGFsLFBNX0RTMzIJCTsgU2V0IHVwIGRhdGEgc2VnbWVudHMKKwkJbW92IGVzLGVheAorCQltb3YgZHMsZWF4CisJCW1vdiBzcyxlYXgKKworCQltb3YgYWwsUE1fVFNTCQk7IEJlIG5pY2UgdG8gSW50ZWwncyBWVCBieQorCQlsdHIgYXgJCQk7IGdpdmluZyBpdCBhIHZhbGlkIFRSCisKKwkJbW92IGVzcCxbUE1FU1BdCQk7IExvYWQgcHJvdG1vZGUgJWVzcAorCQltb3YgZWF4LGVicAkJOyBFQVggLT4gdG9wIG9mIHJlYWwtbW9kZSBzdGFjaworCQlqbXAgZWJ4CQkJOyBHbyB0byB3aGVyZSB3ZSBuZWVkIHRvIGdvCisKKzsKKzsgZW50ZXJfcm06IFJldHVybiB0byBSTSBmcm9tIFBNCis7Cis7CUJYCT0gUk0gZW50cnkgcG9pbnQgKENTID0gMCkKKzsJRUNYLCBFRFgsIEVTSSwgRURJIHByZXNlcnZlZCBhY3Jvc3MgdGhpcyByb3V0aW5lCis7CUVBWAljbG9iYmVyZWQKKzsJRUJQCXJlc2VydmVkCis7Cis7IFRoaXMgcm91dGluZSBkb2Vzbid0IGVuYWJsZSBpbnRlcnJ1cHRzLCBidXQgdGhlIHRhcmdldCByb3V0aW5lCis7IGNhbiBlbmFibGUgaW50ZXJydXB0cyBieSBleGVjdXRpbmcgU1RJLgorOworCQliaXRzIDMyCisJCXNlY3Rpb24gLnRleHRucgorZW50ZXJfcm06CisJCWNsaQorCQljbGQKKwkJbW92IFtQTUVTUF0sZXNwCQk7IFNhdmUgZXhpdCAlZXNwCisJCWptcCBQTV9DUzE2Oi5pbl9wbTE2CTsgUmV0dXJuIHRvIDE2LWJpdCBtb2RlIGZpcnN0CisKKwkJYml0cyAxNgorCQlzZWN0aW9uIC50ZXh0MTYKKy5pbl9wbTE2OgorCQltb3YgYXgsUE1fRFMxNgkJOyBSZWFsLW1vZGUtbGlrZSBzZWdtZW50CisJCW1vdiBlcyxheAorCQltb3YgZHMsYXgKKwkJbW92IHNzLGF4CisJCW1vdiBmcyxheAorCQltb3YgZ3MsYXgKKworCQlsaWR0IFtSTV9JRFRfcHRyXQk7IFJlYWwtbW9kZSBJRFQgKHJtIG5lZWRzIG5vIEdEVCkKKwkJeG9yIGR4LGR4CisJCW1vdiBlYXgsY3IwCisJCWFuZCBhbCx+MQorCQltb3YgY3IwLGVheAorCQlqbXAgMDouaW5fcm0KKworLmluX3JtOgkJCQkJOyBCYWNrIGluIHJlYWwgbW9kZQorCQlsc3Mgc3AsW2NzOlJlYWxNb2RlU1NTUF0JOyBSZXN0b3JlIHN0YWNrCisJCW1vdnp4IGVzcCxzcAkJOyBNYWtlIHN1cmUgdGhlIGhpZ2ggYml0cyBhcmUgemVybworCQltb3YgZHMsZHgJCTsgU2V0IHVwIHNhbmUgc2VnbWVudHMKKwkJbW92IGVzLGR4CisJCW1vdiBmcyxkeAorCQltb3YgZ3MsZHgKKwkJam1wIGJ4CQkJOyBHbyB0byB3aGVyZWV2ZXIgd2UgbmVlZCB0byBnby4uLgorCisJCXNlY3Rpb24gLmRhdGExNgorCQlhbGlnbnogNAorCisJCWV4dGVybiBfX3N0YWNrX2VuZAorUE1FU1AJCWRkIF9fc3RhY2tfZW5kCQk7IFByb3RlY3RlZC1tb2RlIEVTUAorCitQTV9JRFRfcHRyOglkdyA4KjI1Ni0xCQk7IExlbmd0aAorCQlkZCBJRFQJCQk7IE9mZnNldAorCis7Cis7IFRoaXMgaXMgaW52b2tlZCBvbiBnZXR0aW5nIGFuIGludGVycnVwdCBpbiBwcm90ZWN0ZWQgbW9kZS4gIEF0Cis7IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gY29udGV4dC1zd2l0Y2ggdG8gcmVhbCBtb2RlIGFuZCBpbnZva2UKKzsgdGhlIGludGVycnVwdCByb3V0aW5lLgorOworOyBXaGVuIHRoaXMgZ2V0cyBpbnZva2VkLCB0aGUgcmVnaXN0ZXJzIGFyZSBzYXZlZCBvbiB0aGUgc3RhY2sgYW5kCis7IEFMIGNvbnRhaW5zIHRoZSByZWdpc3RlciBudW1iZXIuCis7CisJCWJpdHMgMzIKKwkJc2VjdGlvbiAudGV4dG5yCitwbV9pcnE6CisJCXB1c2hhZAorCQltb3Z6eCBlc2ksYnl0ZSBbZXNwKzgqNF0gOyBJbnRlcnJ1cHQgbnVtYmVyCisJCWluYyBkd29yZCBbQ2FsbGJhY2tDdHJdCisJCW1vdiBlYngsLnJtCisJCWptcCBlbnRlcl9ybQkJOyBHbyB0byByZWFsIG1vZGUKKworCQliaXRzIDE2CisJCXNlY3Rpb24gLnRleHQxNgorLnJtOgorCQlwdXNoZgkJCTsgRmxhZ3Mgb24gc3RhY2sKKwkJY2FsbCBmYXIgW2NzOmVzaSo0XQk7IENhbGwgSVZUIGVudHJ5CisJCW1vdiBlYngsLnBtCisJCWptcCBlbnRlcl9wbQkJOyBHbyBiYWNrIHRvIFBNCisKKwkJYml0cyAzMgorCQlzZWN0aW9uIC50ZXh0bnIKKy5wbToKKwkJZGVjIGR3b3JkIFtDYWxsYmFja0N0cl0KKwkJam56IC5za2lwCisJCWNhbGwgW2NvcmVfcG1faG9va10KKy5za2lwOgorCQlwb3BhZAorCQlhZGQgZXNwLDQJCTsgRHJvcCBpbnRlcnJ1cHQgbnVtYmVyCisJCWlyZXRkCisKKzsKKzsgSW5pdGlhbGx5LCB0aGUgY29yZV9wbV9ob29rIGRvZXMgbm90aGluZzsgaXQgaXMgYXZhaWxhYmxlIGZvciB0aGUKKzsgdGhyZWFkZWQgZGVyaXZhdGl2ZXMgdG8gcnVuIHRoZSBzY2hlZHVsZXIsIG9yIGV4YW1pbmUgdGhlIHJlc3VsdCBmcm9tCis7IGludGVycnVwdCByb3V0aW5lcy4KKzsKKwkJZ2xvYmFsIGNvcmVfcG1fbnVsbF9ob29rCitjb3JlX3BtX251bGxfaG9vazoKKwkJcmV0CisKKwkJc2VjdGlvbiAuZGF0YTE2CisJCWFsaWdueiA0CisJCWdsb2JhbCBjb3JlX3BtX2hvb2sKK2NvcmVfcG1faG9vazoJZGQgY29yZV9wbV9udWxsX2hvb2sKKworCQliaXRzIDE2CisJCXNlY3Rpb24gLnRleHQxNgorOworOyBSb3V0aW5lcyB0byBlbmFibGUgYW5kIGRpc2FibGUgKHl1Y2spIEEyMC4gIFRoZXNlIHJvdXRpbmVzIGFyZSBnYXRoZXJlZAorOyBmcm9tIHRpcHMgZnJvbSBhIGNvdXBsZSBvZiBzb3VyY2VzLCBpbmNsdWRpbmcgdGhlIExpbnV4IGtlcm5lbCBhbmQKKzsgaHR0cDovL3d3dy54ODYub3JnLy4gIFRoZSBuZWVkIGZvciB0aGUgZGVsYXkgdG8gYmUgYXMgbGFyZ2UgYXMgZ2l2ZW4gaGVyZQorOyBpcyBpbmRpY2F0ZWQgYnkgRG9ubmllIEJhcm5lcyBvZiBSZWRIYXQsIHRoZSBwcm9ibGVtYXRpYyBzeXN0ZW0gYmVpbmcgYW4KKzsgSUJNIFRoaW5rUGFkIDc2MEVMLgorOworCisJCXNlY3Rpb24gLmRhdGExNgorCQlhbGlnbnogMgorQTIwUHRyCQlkdyBhMjBfZHVubm8KKworCQlzZWN0aW9uIC5ic3MxNgorCQlhbGlnbmIgNAorQTIwVGVzdAkJcmVzZCAxCQkJOyBDb3VudGVyIGZvciB0ZXN0aW5nIEEyMCBzdGF0dXMKK0EyMFRyaWVzCXJlc2IgMQkJCTsgVGltZXMgdW50aWwgZ2l2aW5nIHVwIG9uIEEyMAorCisJCXNlY3Rpb24gLnRleHQxNgorZW5hYmxlX2EyMDoKKwkJcHVzaGFkCisJCW1vdiBieXRlIFtjczpBMjBUcmllc10sMjU1IDsgVGltZXMgdG8gdHJ5IHRvIG1ha2UgdGhpcyB3b3JrCisKK3RyeV9lbmFibGVfYTIwOgorCis7Cis7IEZpcnN0LCBzZWUgaWYgd2UgYXJlIG9uIGEgc3lzdGVtIHdpdGggbm8gQTIwIGdhdGUsIG9yIHRoZSBBMjAgZ2F0ZQorOyBpcyBhbHJlYWR5IGVuYWJsZWQgZm9yIHVzLi4uCis7CithMjBfbm9uZToKKwkJY2FsbCBhMjBfdGVzdAorCQlqbnogYTIwX2RvbmUKKwkJOyBPdGhlcndpc2UsIHNlZSBpZiB3ZSBoYWQgc29tZXRoaW5nIG1lbW9yaXplZC4uLgorCQlqbXAgd29yZCBbY3M6QTIwUHRyXQorCis7Cis7IE5leHQsIHRyeSB0aGUgQklPUyAoSU5UIDE1aCBBWD0yNDAxaCkKKzsKK2EyMF9kdW5ubzoKK2EyMF9iaW9zOgorCQltb3Ygd29yZCBbY3M6QTIwUHRyXSwgYTIwX2Jpb3MKKwkJbW92IGF4LDI0MDFoCisJCXB1c2hmCQkJCTsgU29tZSBCSU9TZXMgbXVjayB3aXRoIElGCisJCWludCAxNWgKKwkJcG9wZgorCisJCWNhbGwgYTIwX3Rlc3QKKwkJam56IGEyMF9kb25lCisKKzsKKzsgRW5hYmxlIHRoZSBrZXlib2FyZCBjb250cm9sbGVyIEEyMCBnYXRlCis7CithMjBfa2JjOgorCQltb3YgZGwsIDEJCQk7IEFsbG93IGVhcmx5IGV4aXQKKwkJY2FsbCBlbXB0eV84MDQyCisJCWpueiBhMjBfZG9uZQkJCTsgQTIwIGxpdmUsIG5vIG5lZWQgdG8gdXNlIEtCQworCisJCW1vdiB3b3JkIFtjczpBMjBQdHJdLCBhMjBfa2JjCTsgU3RhcnRpbmcgS0JDIGNvbW1hbmQgc2VxdWVuY2UKKworCQltb3YgYWwsMEQxaAkJCTsgV3JpdGUgb3V0cHV0IHBvcnQKKwkJb3V0IDA2NGgsIGFsCisJCWNhbGwgZW1wdHlfODA0Ml91bmNvbmQKKworCQltb3YgYWwsMERGaAkJCTsgQTIwIG9uCisJCW91dCAwNjBoLCBhbAorCQljYWxsIGVtcHR5XzgwNDJfdW5jb25kCisKKwkJOyBBcHBhcmVudGx5IHRoZSBVSENJIHNwZWMgYXNzdW1lcyB0aGF0IEEyMCB0b2dnbGUKKwkJOyBlbmRzIHdpdGggYSBudWxsIGNvbW1hbmQgKGFzc3VtZWQgdG8gYmUgZm9yIHN5Y2hyb25pemF0aW9uPykKKwkJOyBQdXQgaXQgaGVyZSB0byBzZWUgaWYgaXQgaGVscHMgYW55dGhpbmcuLi4KKwkJbW92IGFsLDBGRmgJCQk7IE51bGwgY29tbWFuZAorCQlvdXQgMDY0aCwgYWwKKwkJY2FsbCBlbXB0eV84MDQyX3VuY29uZAorCisJCTsgVmVyaWZ5IHRoYXQgQTIwIGFjdHVhbGx5IGlzIGVuYWJsZWQuICBEbyB0aGF0IGJ5CisJCTsgb2JzZXJ2aW5nIGEgd29yZCBpbiBsb3cgbWVtb3J5IGFuZCB0aGUgc2FtZSB3b3JkIGluCisJCTsgdGhlIEhNQSB1bnRpbCB0aGV5IGFyZSBubyBsb25nZXIgY29oZXJlbnQuICBOb3RlIHRoYXQKKwkJOyB3ZSBkb24ndCBkbyB0aGUgc2FtZSBjaGVjayBpbiB0aGUgZGlzYWJsZSBjYXNlLCBiZWNhdXNlCisJCTsgd2UgZG9uJ3Qgd2FudCB0byAqcmVxdWlyZSogQTIwIG1hc2tpbmcgKFNZU0xJTlVYIHNob3VsZAorCQk7IHdvcmsgZmluZSB3aXRob3V0IGl0LCBpZiB0aGUgQklPUyBkb2VzLikKKy5rYmNfd2FpdDoJcHVzaCBjeAorCQl4b3IgY3gsY3gKKy5rYmNfd2FpdF9sb29wOgorCQljYWxsIGEyMF90ZXN0CisJCWpueiBhMjBfZG9uZV9wb3AKKwkJbG9vcCAua2JjX3dhaXRfbG9vcAorCisJCXBvcCBjeAorOworOyBSdW5uaW5nIG91dCBvZiBvcHRpb25zIGhlcmUuICBGaW5hbCBhdHRlbXB0OiBlbmFibGUgdGhlICJmYXN0IEEyMCBnYXRlIgorOworYTIwX2Zhc3Q6CisJCW1vdiB3b3JkIFtjczpBMjBQdHJdLCBhMjBfZmFzdAorCQlpbiBhbCwgMDkyaAorCQlvciBhbCwwMmgKKwkJYW5kIGFsLH4wMWgJCQk7IERvbid0IGFjY2lkZW50YWxseSByZXNldCB0aGUgbWFjaGluZSEKKwkJb3V0IDA5MmgsIGFsCisKKy5mYXN0X3dhaXQ6CXB1c2ggY3gKKwkJeG9yIGN4LGN4CisuZmFzdF93YWl0X2xvb3A6CisJCWNhbGwgYTIwX3Rlc3QKKwkJam56IGEyMF9kb25lX3BvcAorCQlsb29wIC5mYXN0X3dhaXRfbG9vcAorCisJCXBvcCBjeAorCis7Cis7IE9oIGJ1Z2dlci4gIEEyMCBpcyBub3QgcmVzcG9uZGluZy4gIFRyeSBmcm9iYmluZyBpdCBhZ2FpbjsgZXZlbnR1YWxseSBnaXZlIHVwCis7IGFuZCByZXBvcnQgZmFpbHVyZSB0byB0aGUgdXNlci4KKzsKKwkJZGVjIGJ5dGUgW2NzOkEyMFRyaWVzXQorCQlqbnogYTIwX2R1bm5vCQk7IERpZCB3ZSBnZXQgdGhlIHdyb25nIHR5cGU/CisKKwkJbW92IHNpLCBlcnJfYTIwCisJCXBtX2NhbGwgcG1fd3JpdGVzdHIKKwkJam1wIGthYm9vbQorCisJCXNlY3Rpb24gLmRhdGExNgorZXJyX2EyMAkJZGIgQ1IsIExGLCAnQTIwIGdhdGUgbm90IHJlc3BvbmRpbmchJywgQ1IsIExGLCAwCisJCXNlY3Rpb24gLnRleHQxNgorCis7Cis7IEEyMCB1bm1hc2tlZCwgcHJvY2VlZC4uLgorOworYTIwX2RvbmVfcG9wOglwb3AgY3gKK2EyMF9kb25lOglwb3BhZAorCQlyZXQKKworOworOyBUaGlzIHJvdXRpbmUgdGVzdHMgaWYgQTIwIGlzIGVuYWJsZWQgKFpGID0gMCkuICBUaGlzIHJvdXRpbmUKKzsgbXVzdCBub3QgZGVzdHJveSBhbnkgcmVnaXN0ZXIgY29udGVudHMuCis7Cis7IFRoZSBuby13cml0ZSBlYXJseSBvdXQgYXZvaWRzIHRoZSBpb19kZWxheSBpbiB0aGUgKHByZXN1bWFibHkgY29tbW9uKQorOyBjYXNlIG9mIEEyMCBhbHJlYWR5IGVuYWJsZWQgKGUuZy4gZnJvbSBhIHByZXZpb3VzIGNhbGwuKQorOworYTIwX3Rlc3Q6CisJCXB1c2ggZXMKKwkJcHVzaCBjeAorCQlwdXNoIGVheAorCQltb3YgY3gsMEZGRkZoCQkJOyBITUEgPSBzZWdtZW50IDBGRkZGaAorCQltb3YgZXMsY3gKKwkJbW92IGVheCxbY3M6QTIwVGVzdF0KKwkJbW92IGN4LDMyCQkJOyBMb29wIGNvdW50CisJCWptcCAudGVzdAkJCTsgRmlyc3QgaXRlcmF0aW9uID0gZWFybHkgb3V0Cisud2FpdDoJCWFkZCBlYXgsMHg0MzBhZWE0MQkJOyBBIGxhcmdlIHByaW1lIG51bWJlcgorCQltb3YgW2NzOkEyMFRlc3RdLGVheAorCQlpb19kZWxheQkJCTsgU2VyaWFsaXplLCBhbmQgZml4IGRlbGF5CisudGVzdDoJCWNtcCBlYXgsW2VzOkEyMFRlc3QrMTBoXQorCQlsb29weiAud2FpdAorLmRvbmU6CQlwb3AgZWF4CisJCXBvcCBjeAorCQlwb3AgZXMKKwkJcmV0CisKKzsKKzsgUm91dGluZSB0byBlbXB0eSB0aGUgODA0MiBLQkMgY29udHJvbGxlci4gIElmIGRsICE9IDAKKzsgdGhlbiB3ZSB3aWxsIHRlc3QgQTIwIGluIHRoZSBsb29wIGFuZCBleGl0IGlmIEEyMCBpcworOyBzdWRkZW5seSBlbmFibGVkLgorOworZW1wdHlfODA0Ml91bmNvbmQ6CisJCXhvciBkbCxkbAorZW1wdHlfODA0MjoKKwkJY2FsbCBhMjBfdGVzdAorCQlqeiAuYTIwX29uCisJCWFuZCBkbCxkbAorCQlqbnogLmRvbmUKKy5hMjBfb246CWlvX2RlbGF5CisJCWluIGFsLCAwNjRoCQk7IFN0YXR1cyBwb3J0CisJCXRlc3QgYWwsMQorCQlqeiAubm9fb3V0cHV0CisJCWlvX2RlbGF5CisJCWluIGFsLCAwNjBoCQk7IFJlYWQgaW5wdXQKKwkJam1wIHNob3J0IGVtcHR5XzgwNDIKKy5ub19vdXRwdXQ6CisJCXRlc3QgYWwsMgorCQlqbnogZW1wdHlfODA0MgorCQlpb19kZWxheQorLmRvbmU6CQlyZXQKKworOworOyBUaGlzIGluaXRpYWxpemVzIHRoZSBwcm90ZWN0ZWQtbW9kZSBpbnRlcnJ1cHQgdGh1bmsgc2V0Cis7CisJCXNlY3Rpb24gLnRleHQxNgorcG1faW5pdDoKKwkJeG9yIGVkaSxlZGkKKwkJbW92IGJ4LElEVAorCQltb3YgZGksSVJRU3R1YnMKKworCQltb3YgZWF4LDdhZWIwMDZhaAk7IHB1c2ggYnl0ZSAuLiBqbXAgc2hvcnQgLi4KKworCQltb3YgY3gsOAkJOyA4IGdyb3VwcyBvZiAzMiBJUlFzCisuZ2xvb3A6CisJCXB1c2ggY3gKKwkJbW92IGN4LDMyCQk7IDMyIGVudHJpZXMgcGVyIGdyb3VwCisuZWxvb3A6CisJCW1vdiBbYnhdLGRpCQk7IElEVCBvZmZzZXQgWzE1OjBdCisJCW1vdiB3b3JkIFtieCsyXSxQTV9DUzMyCTsgSURUIHNlZ21lbnQKKwkJbW92IGR3b3JkIFtieCs0XSwwOGUwMGgJOyBJRFQgb2Zmc2V0IFszMToxNl0sIDMyLWJpdCBpbnRlcnJ1cHQKKwkJCQkJOyBnYXRlLCBDUEwgMCAod2UgZG9uJ3QgaGF2ZSBhIFRTUworCQkJCQk7IHNldCB1cC4uLikKKwkJYWRkIGJ4LDgKKworCQlzdG9zZAorCQk7IEluY3JlbWVudCBJUlEsIGRlY3JlbWVudCBqbXAgc2hvcnQgb2Zmc2V0CisJCWFkZCBlYXgsKC00IDw8IDI0KSsoMSA8PCA4KQorCisJCWxvb3AgLmVsb29wCisKKwkJOyBBdCB0aGUgZW5kIG9mIGVhY2ggZ3JvdXAsIHJlcGxhY2UgdGhlIEVCeHggd2l0aAorCQk7IHRoZSBmaW5hbCBFOXh4eHh4eHh4CisJCWFkZCBkaSwzCisJCW1vdiBieXRlIFtkaS01XSwwRTloCTsgSk1QIE5FQVIKKwkJbW92IGVkeCxwbV9pcnEKKwkJc3ViIGVkeCxlZGkKKwkJbW92IFtkaS00XSxlZHgKKworCQlhZGQgZWF4LCgweDgwIDw8IDI0KQk7IFByb3BlciBvZmZzZXQgZm9yIHRoZSBuZXh0IG9uZQorCQlwb3AgY3gKKwkJbG9vcCAuZ2xvb3AKKworCQlyZXQKKworCQk7IHBtX2luaXQgaXMgY2FsbGVkIGJlZm9yZSBic3MgY2xlYXJpbmcsIHNvIHB1dCB0aGVzZQorCQk7IGluIC5lYXJseWJzcyEKKwkJc2VjdGlvbiAuZWFybHlic3MKKwkJYWxpZ25iIDgKK0lEVDoJCXJlc3EgMjU2CisJCWdsb2JhbCBSZWFsTW9kZVNTU1AKK1JlYWxNb2RlU1NTUAlyZXNkIDEJCQk7IFJlYWwtbW9kZSBTUzpTUAorCisJCXNlY3Rpb24gLmdlbnRleHRucgk7IEF1dG9nZW5lcmF0ZWQgMzItYml0IGNvZGUKK0lSUVN0dWJzOglyZXNiIDQqMjU2KzMqOAorCisJCXNlY3Rpb24gLnRleHQxNgorCislaW5jbHVkZSAiY2FsbGJhY2suaW5jIgkJCTsgUmVhbC1tb2RlIGNhbGxiYWNrcwpkaWZmIC0tZ2l0IGEvY29yZS9wbWFwaS5jIGIvY29yZS9wbWFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZGZmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3BtYXBpLmMKQEAgLTAsMCArMSw0NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAxOTk0LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3BtYXBpLmg+CisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImZzLmgiCisKK2NvbnN0IHN0cnVjdCBjb20zMl9wbWFwaSBwbV9hcGlfdmVjdG9yID0KK3sKKyAgICAuX19wbWFwaV9zaXplID0gc2l6ZW9mKHN0cnVjdCBjb20zMl9wbWFwaSksCisKKyAgICAubG1hbGxvYwk9IHBtYXBpX2xtYWxsb2MsIC8qIEFsbG9jYXRlIGxvdyBtZW1vcnkgKi8KKyAgICAubGZyZWUJPSBmcmVlLAkJIC8qIEZyZWUgbG93IG1lbW9yeSAqLworCisgICAgLm9wZW5fZmlsZQk9IG9wZW5fZmlsZSwKKyAgICAucmVhZF9maWxlCT0gcG1hcGlfcmVhZF9maWxlLAorICAgIC5jbG9zZV9maWxlCT0gY2xvc2VfZmlsZSwKKworICAgIC5vcGVuZGlyCT0gb3BlbmRpciwKKyAgICAucmVhZGRpcgk9IHJlYWRkaXIsCisgICAgLmNsb3NlZGlyCT0gY2xvc2VkaXIsCisKKyAgICAuaWRsZQk9IF9faWRsZSwKKyAgICAucmVzZXRfaWRsZQk9IHJlc2V0X2lkbGUsCisKKyAgICAuY2hkaXIJPSBjaGRpciwKKyAgICAuZ2V0Y3dkCT0gY29yZV9nZXRjd2QsCisKKyAgICAuamlmZmllcwk9ICZfX2ppZmZpZXMsCisgICAgLm1zX3RpbWVyCT0gJl9fbXNfdGltZXIsCisKKyAgICAuc3lzYXBwZW5kX2NvdW50CT0gU1lTQVBQRU5EX01BWCwKKyAgICAuc3lzYXBwZW5kX3N0cmluZ3MJPSBzeXNhcHBlbmRfc3RyaW5ncywKK307CmRpZmYgLS1naXQgYS9jb3JlL3BtY2FsbC5pbmMgYi9jb3JlL3BtY2FsbC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1ODAxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcG1jYWxsLmluYwpAQCAtMCwwICsxLDcwIEBACis7OworOzsgcG1jYWxsLmluYworOzsKKzs7IE1hY3JvcyBmb3IgdGhlIHN0YWNrIGZyYW1lIHNldCB1cCBieSBwbV9jYWxsLCBhc3N1bWluZyBlYnAgaXMgbGVmdAorOzsgYXMgdGhlIFJNIGZyYW1lIHBvaW50ZXIuCis7OworCislaWZuZGVmIFBNQ0FMTF9JTkMKKyVkZWZpbmUgUE1DQUxMX0lOQworCislZGVmaW5lIFJNX0dTCQl3b3JkIFtlYnBdCislZGVmaW5lIFJNX0ZTCQl3b3JkIFtlYnArMl0KKyVkZWZpbmUgUk1fRVMJCXdvcmQgW2VicCs0XQorJWRlZmluZSBSTV9EUwkJd29yZCBbZWJwKzZdCisKKyVkZWZpbmUgUk1fRURJCQlkd29yZCBbZWJwKzhdCislZGVmaW5lIFJNX0RJCQl3b3JkIFtlYnArOF0KKyVkZWZpbmUgUk1fSERJCQl3b3JkIFtlYnArMTBdCislZGVmaW5lIFJNX0RJTAkJYnl0ZSBbZWJwKzhdCislZGVmaW5lIFJNX0RJSAkJYnl0ZSBbZWJwKzldCisKKyVkZWZpbmUgUk1fRVNJCQlkd29yZCBbZWJwKzEyXQorJWRlZmluZSBSTV9TSQkJd29yZCBbZWJwKzEyXQorJWRlZmluZSBSTV9IU0kJCXdvcmQgW2VicCsxNF0KKyVkZWZpbmUgUk1fU0lMCQlieXRlIFtlYnArMTJdCislZGVmaW5lIFJNX1NJSAkJYnl0ZSBbZWJwKzEzXQorCislZGVmaW5lIFJNX0VCUAkJZHdvcmQgW2VicCsxNl0KKyVkZWZpbmUgUk1fQlAJCXdvcmQgW2VicCsxNl0KKyVkZWZpbmUgUk1fSEJQCQl3b3JkIFtlYnArMThdCislZGVmaW5lIFJNX0JQTAkJYnl0ZSBbZWJwKzE2XQorJWRlZmluZSBSTV9CUEgJCWJ5dGUgW2VicCsxN10KKworJWRlZmluZSBSTV9FQlgJCWR3b3JkIFtlYnArMjRdCislZGVmaW5lIFJNX0JYCQl3b3JkIFtlYnArMjRdCislZGVmaW5lIFJNX0hCWAkJd29yZCBbZWJwKzI2XQorJWRlZmluZSBSTV9CTAkJYnl0ZSBbZWJwKzI0XQorJWRlZmluZSBSTV9CSAkJYnl0ZSBbZWJwKzI1XQorCislZGVmaW5lIFJNX0VEWAkJZHdvcmQgW2VicCsyOF0KKyVkZWZpbmUgUk1fRFgJCXdvcmQgW2VicCsyOF0KKyVkZWZpbmUgUk1fSERYCQl3b3JkIFtlYnArMzBdCislZGVmaW5lIFJNX0RMCQlieXRlIFtlYnArMjhdCislZGVmaW5lIFJNX0RICQlieXRlIFtlYnArMjldCisKKyVkZWZpbmUgUk1fRUNYCQlkd29yZCBbZWJwKzMyXQorJWRlZmluZSBSTV9DWAkJd29yZCBbZWJwKzMyXQorJWRlZmluZSBSTV9IQ1gJCXdvcmQgW2VicCszNF0KKyVkZWZpbmUgUk1fQ0wJCWJ5dGUgW2VicCszMl0KKyVkZWZpbmUgUk1fQ0gJCWJ5dGUgW2VicCszM10KKworJWRlZmluZSBSTV9FQVgJCWR3b3JkIFtlYnArMzZdCislZGVmaW5lIFJNX0FYCQl3b3JkIFtlYnArMzZdCislZGVmaW5lIFJNX0hBWAkJd29yZCBbZWJwKzM4XQorJWRlZmluZSBSTV9BTAkJYnl0ZSBbZWJwKzM2XQorJWRlZmluZSBSTV9BSAkJYnl0ZSBbZWJwKzM3XQorCislZGVmaW5lIFJNX0VGTEFHUwlkd29yZCBbZWJwKzQwXQorJWRlZmluZSBSTV9GTEFHUwl3b3JkIFtlYnArNDBdCislZGVmaW5lIFJNX0hGTEFHUwl3b3JkIFtlYnArNDJdCislZGVmaW5lIFJNX0ZMQUdTTAlieXRlIFtlYnArNDBdCislZGVmaW5lIFJNX0ZMQUdTSAlieXRlIFtlYnArNDFdCisKKzsgQ29udmVuaWVuY2UgbWFjcm8gdG8gY2FsbCBhIFBNIGZ1bmN0aW9uCislbWFjcm8JcG1fY2FsbAkxCisJcHVzaCBkd29yZCAlMQorCWNhbGwgX3BtX2NhbGwKKyVlbmRtYWNybworCislZW5kaWYgOyBQTUNBTExfSU5DCmRpZmYgLS1naXQgYS9jb3JlL3ByZWZpeC5pbmMgYi9jb3JlL3ByZWZpeC5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4NzI0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcHJlZml4LmluYwpAQCAtMCwwICsxLDE3IEBACis7Cis7IFRoZSBwcmVmaXggaXMgYSBzbWFsbCBzdHJ1Y3R1cmUgdGhhdCBwcmVmYWNlcyB0aGUgYWN0dWFsIGNvZGU7Cis7IGl0IGdpdmVzIHRoZSBjb21wcmVzc2lvbiBwcm9ncmFtIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi4KKzsKKworCQlzZWN0aW9uIC5wcmVmaXgJCW5vd3JpdGUgcHJvZ2JpdHMgYWxpZ249MTYKK3BmeF9zdGFydAlkZCBfc3RhcnQJCTsgU3RhcnQgb2YgcmF3IGNodW5rCitwZnhfY29tcHJlc3NlZAlkZCBfX3BtX2NvZGVfbG1hCTsgU3RhcnQgb2YgY29tcHJlc3NlZCBjaHVuaworcGZ4X2NkYXRhbGVuCWRkIGx6b19kYXRhX3NpemUJOyBQb2ludGVyIHRvIGNvbXByZXNzZWQgc2l6ZSBmaWVsZAorJWlmIElTX0lTT0xJTlVYCitwZnhfY2hlY2tzdW0JZGQgYmlfbGVuZ3RoCQk7IEZpbGUgbGVuZ3RoIGFuZCBjaGVja3N1bSBmaWVsZHMKKyVlbHNlCitwZnhfY2hlY2tzdW0JZGQgMAkJCTsgTm8gY2hlY2tzdW0KKyVlbmRpZgorcGZ4X21heGxtYQlkZCBNYXhMTUEJCTsgTWF4aW11bSBzaXplCisKKwkJc2VjdGlvbiAudGV4dDE2CmRpZmYgLS1naXQgYS9jb3JlL3B4ZS5pbmMgYi9jb3JlL3B4ZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0NmJiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcHhlLmluYwpAQCAtMCwwICsxLDE2MyBAQAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyAgIENvcHlyaWdodCAxOTk5LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKzs7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IHB4ZS5pbmMKKzs7Cis7OyBQWEUgb3Bjb2RlcworOzsKKworJWlmbmRlZiBfUFhFX0lOQworJWRlZmluZSBfUFhFX0lOQyAxCisKKyVkZWZpbmUgUFhFTlZfVEZUUF9PUEVOCQkJCQkgMHgwMDIwCislZGVmaW5lIFBYRU5WX1RGVFBfQ0xPU0UJCQkJIDB4MDAyMQorJWRlZmluZSBQWEVOVl9URlRQX1JFQUQJCQkJCSAweDAwMjIKKyVkZWZpbmUgUFhFTlZfVEZUUF9SRUFEX0ZJTEUJCQkJIDB4MDAyMworJWRlZmluZSBQWEVOVl9URlRQX1JFQURfRklMRV9QTU9ERQkJCSAweDAwMjQKKyVkZWZpbmUgUFhFTlZfVEZUUF9HRVRfRlNJWkUJCQkJIDB4MDAyNQorCislZGVmaW5lIFBYRU5WX1VEUF9PUEVOCQkJCQkgMHgwMDMwCislZGVmaW5lIFBYRU5WX1VEUF9DTE9TRQkJCQkJIDB4MDAzMQorJWRlZmluZSBQWEVOVl9VRFBfUkVBRAkJCQkJIDB4MDAzMgorJWRlZmluZSBQWEVOVl9VRFBfV1JJVEUJCQkJCSAweDAwMzMKKworJWRlZmluZSBQWEVOVl9TVEFSVF9VTkRJCQkJCSAweDAwMDAKKyVkZWZpbmUgUFhFTlZfVU5ESV9TVEFSVFVQCQkJCSAweDAwMDEKKyVkZWZpbmUgUFhFTlZfVU5ESV9DTEVBTlVQCQkJCSAweDAwMDIKKyVkZWZpbmUgUFhFTlZfVU5ESV9JTklUSUFMSVpFCQkJCSAweDAwMDMKKyVkZWZpbmUgUFhFTlZfVU5ESV9SRVNFVF9OSUMJCQkJIDB4MDAwNAorJWRlZmluZSBQWEVOVl9VTkRJX1NIVVRET1dOCQkJCSAweDAwMDUKKyVkZWZpbmUgUFhFTlZfVU5ESV9PUEVOCQkJCQkgMHgwMDA2CislZGVmaW5lIFBYRU5WX1VORElfQ0xPU0UJCQkJIDB4MDAwNworJWRlZmluZSBQWEVOVl9VTkRJX1RSQU5TTUlUCQkJCSAweDAwMDgKKyVkZWZpbmUgUFhFTlZfVU5ESV9TRVRfTUNBU1RfQUREUgkJCSAweDAwMDkKKyVkZWZpbmUgUFhFTlZfVU5ESV9TRVRfU1RBVElPTl9BRERSCQkJIDB4MDAwQQorJWRlZmluZSBQWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSCQkJIDB4MDAwQgorJWRlZmluZSBQWEVOVl9VTkRJX0dFVF9JTkZPUk1BVElPTgkJCSAweDAwMEMKKyVkZWZpbmUgUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUwkJCSAweDAwMEQKKyVkZWZpbmUgUFhFTlZfVU5ESV9DTEVBUl9TVEFUSVNUSUNTCQkJIDB4MDAwRQorJWRlZmluZSBQWEVOVl9VTkRJX0lOSVRJQVRFX0RJQUdTCQkJIDB4MDAwRgorJWRlZmluZSBQWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVAkJCSAweDAwMTAKKyVkZWZpbmUgUFhFTlZfVU5ESV9HRVRfTUNBU1RfQUREUgkJCSAweDAwMTEKKyVkZWZpbmUgUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUJCQkJIDB4MDAxMgorJWRlZmluZSBQWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPCQkJIDB4MDAxMworJWRlZmluZSBQWEVOVl9VTkRJX0lTUgkJCQkJIDB4MDAxNAorJWRlZmluZSBQWEVOVl9TVE9QX1VOREkJCQkJCSAweDAwMTUJOyBPdmVybGFwLi4uPworJWRlZmluZSBQWEVOVl9VTkRJX0dFVF9TVEFURQkJCQkgMHgwMDE1CTsgT3ZlcmxhcC4uLj8KKworJWRlZmluZSBQWEVOVl9VTkxPQURfU1RBQ0sJCQkJIDB4MDA3MAorJWRlZmluZSBQWEVOVl9HRVRfQ0FDSEVEX0lORk8JCQkJIDB4MDA3MQorJWRlZmluZSBQWEVOVl9SRVNUQVJUX0RIQ1AJCQkJIDB4MDA3MgorJWRlZmluZSBQWEVOVl9SRVNUQVJUX1RGVFAJCQkJIDB4MDA3MworJWRlZmluZSBQWEVOVl9NT0RFX1NXSVRDSAkJCQkgMHgwMDc0CislZGVmaW5lIFBYRU5WX1NUQVJUX0JBU0UJCQkJIDB4MDA3NQorJWRlZmluZSBQWEVOVl9TVE9QX0JBU0UJCQkJCSAweDAwNzYKKworOyBnUFhFIGV4dGVuc2lvbnMuLi4KKyVkZWZpbmUgUFhFTlZfRklMRV9PUEVOCQkJCQkgMHgwMGUwCislZGVmaW5lIFBYRU5WX0ZJTEVfQ0xPU0UJCQkJIDB4MDBlMQorJWRlZmluZSBQWEVOVl9GSUxFX1NFTEVDVAkJCQkgMHgwMGUyCislZGVmaW5lIFBYRU5WX0ZJTEVfUkVBRAkJCQkJIDB4MDBlMworJWRlZmluZSBQWEVOVl9HRVRfRklMRV9TSVpFCQkJCSAweDAwZTQKKyVkZWZpbmUgUFhFTlZfRklMRV9FWEVDCQkJCQkgMHgwMGU1CislZGVmaW5lIFBYRU5WX0ZJTEVfQVBJX0NIRUNLCQkJCSAweDAwZTYKKyVkZWZpbmUgUFhFTlZfRklMRV9FWElUX0hPT0sJCQkJIDB4MDBlNworCis7IEV4aXQgY29kZXMKKyVkZWZpbmUgUFhFTlZfRVhJVF9TVUNDRVNTCQkJCSAweDAwMDAKKyVkZWZpbmUgUFhFTlZfRVhJVF9GQUlMVVJFCQkJCSAweDAwMDEKKworOyBTdGF0dXMgY29kZXMKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1NVQ0NFU1MJCQkJIDB4MDAKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0ZBSUxVUkUJCQkJIDB4MDEKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0JBRF9GVU5DCQkJCSAweDAyCislZGVmaW5lIFBYRU5WX1NUQVRVU19VTlNVUFBPUlRFRAkJCSAweDAzCislZGVmaW5lIFBYRU5WX1NUQVRVU19LRUVQX1VOREkJCQkJIDB4MDQKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0tFRVBfQUxMCQkJCSAweDA1CislZGVmaW5lIFBYRU5WX1NUQVRVU19PVVRfT0ZfUkVTT1VSQ0VTCQkJIDB4MDYKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0FSUF9USU1FT1VUCQkJIDB4MTEKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1VEUF9DTE9TRUQJCQkJIDB4MTgKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1VEUF9PUEVOCQkJCSAweDE5CislZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX0NMT1NFRAkJCSAweDFhCislZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX09QRU4JCQkJIDB4MWIKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX01DT1BZX1BST0JMRU0JCQkgMHgyMAorJWRlZmluZSBQWEVOVl9TVEFUVVNfQklTX0lOVEVHUklUWV9GQUlMVVJFCQkgMHgyMQorJWRlZmluZSBQWEVOVl9TVEFUVVNfQklTX1ZBTElEQVRFX0ZBSUxVUkUJCSAweDIyCislZGVmaW5lIFBYRU5WX1NUQVRVU19CSVNfSU5JVF9GQUlMVVJFCQkJIDB4MjMKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0JJU19TSFVURE9XTl9GQUlMVVJFCQkgMHgyNAorJWRlZmluZSBQWEVOVl9TVEFUVVNfQklTX0dCT0FfRkFJTFVSRQkJCSAweDI1CislZGVmaW5lIFBYRU5WX1NUQVRVU19CSVNfRlJFRV9GQUlMVVJFCQkJIDB4MjYKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0JJU19HU0lfRkFJTFVSRQkJCSAweDI3CislZGVmaW5lIFBYRU5WX1NUQVRVU19CSVNfQkFEX0NLU1VNCQkJIDB4MjgKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1RGVFBfQ0FOTk9UX0FSUF9BRERSRVNTCQkgMHgzMAorJWRlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9PUEVOX1RJTUVPVVQJCQkgMHgzMgorCislZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX1VOS05PV05fT1BDT0RFCQkgMHgzMworJWRlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9SRUFEX1RJTUVPVVQJCQkgMHgzNQorJWRlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9FUlJPUl9PUENPREUJCQkgMHgzNgorJWRlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9DQU5OT1RfT1BFTl9DT05ORUNUSU9OCSAweDM4CislZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX0NBTk5PVF9SRUFEX0ZST01fQ09OTkVDVElPTgkgMHgzOQorJWRlZmluZSBQWEVOVl9TVEFUVVNfVEZUUF9UT09fTUFOWV9QQUNLQUdFUwkJIDB4M2EKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1RGVFBfRklMRV9OT1RfRk9VTkQJCSAweDNiCislZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX0FDQ0VTU19WSU9MQVRJT04JCSAweDNjCislZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX05PX01DQVNUX0FERFJFU1MJCSAweDNkCislZGVmaW5lIFBYRU5WX1NUQVRVU19URlRQX05PX0ZJTEVTSVpFCQkJIDB4M2UKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1RGVFBfSU5WQUxJRF9QQUNLRVRfU0laRQkJIDB4M2YKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0RIQ1BfVElNRU9VVAkJCSAweDUxCislZGVmaW5lIFBYRU5WX1NUQVRVU19ESENQX05PX0lQX0FERFJFU1MJCQkgMHg1MgorJWRlZmluZSBQWEVOVl9TVEFUVVNfREhDUF9OT19CT09URklMRV9OQU1FCQkgMHg1MworJWRlZmluZSBQWEVOVl9TVEFUVVNfREhDUF9CQURfSVBfQUREUkVTUwkJIDB4NTQKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1VORElfSU5WQUxJRF9GVU5DVElPTgkJIDB4NjAKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1VORElfTUVESUFURVNUX0ZBSUxFRAkJIDB4NjEKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1VORElfQ0FOTk9UX0lOSVRfTklDX0ZPUl9NQ0FTVAkgMHg2MgorJWRlZmluZSBQWEVOVl9TVEFUVVNfVU5ESV9DQU5OT1RfSU5JVElBTElaRV9OSUMJCSAweDYzCislZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9JTklUSUFMSVpFX1BIWQkJIDB4NjQKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1VORElfQ0FOTk9UX1JFQURfQ09ORklHX0RBVEEJIDB4NjUKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1VORElfQ0FOTk9UX1JFQURfSU5JVF9EQVRBCQkgMHg2NgorJWRlZmluZSBQWEVOVl9TVEFUVVNfVU5ESV9CQURfTUFDX0FERFJFU1MJCSAweDY3CislZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX0JBRF9FRVBST01fQ0hFQ0tTVU0JCSAweDY4CislZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX0VSUk9SX1NFVFRJTkdfSVNSCQkgMHg2OQorJWRlZmluZSBQWEVOVl9TVEFUVVNfVU5ESV9JTlZBTElEX1NUQVRFCQkJIDB4NmEKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX1VORElfVFJBTlNNSVRfRVJST1IJCSAweDZiCislZGVmaW5lIFBYRU5WX1NUQVRVU19VTkRJX0lOVkFMSURfUEFSQU1FVEVSCQkgMHg2YworJWRlZmluZSBQWEVOVl9TVEFUVVNfQlNUUkFQX1BST01QVF9NRU5VCQkJIDB4NzQKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0JTVFJBUF9NQ0FTVF9BRERSCQkJIDB4NzYKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0JTVFJBUF9NSVNTSU5HX0xJU1QJCSAweDc3CislZGVmaW5lIFBYRU5WX1NUQVRVU19CU1RSQVBfTk9fUkVTUE9OU0UJCQkgMHg3OAorJWRlZmluZSBQWEVOVl9TVEFUVVNfQlNUUkFQX0ZJTEVfVE9PX0JJRwkJIDB4NzkKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0JJTkxfQ0FOQ0VMRURfQllfS0VZU1RST0tFCQkgMHhhMAorJWRlZmluZSBQWEVOVl9TVEFUVVNfQklOTF9OT19QWEVfU0VSVkVSCQkJIDB4YTEKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX05PVF9BVkFJTEFCTEVfSU5fUE1PREUJCSAweGEyCislZGVmaW5lIFBYRU5WX1NUQVRVU19OT1RfQVZBSUxBQkxFX0lOX1JNT0RFCQkgMHhhMworJWRlZmluZSBQWEVOVl9TVEFUVVNfQlVTRF9ERVZJQ0VfTk9UX1NVUFBPUlRFRAkJIDB4YjAKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0xPQURFUl9OT19GUkVFX0JBU0VfTUVNT1JZCQkgMHhjMAorJWRlZmluZSBQWEVOVl9TVEFUVVNfTE9BREVSX05PX0JDX1JPTUlECQkJIDB4YzEKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0xPQURFUl9CQURfQkNfUk9NSUQJCSAweGMyCislZGVmaW5lIFBYRU5WX1NUQVRVU19MT0FERVJfQkFEX0JDX1JVTlRJTUVfSU1BR0UJIDB4YzMKKyVkZWZpbmUgUFhFTlZfU1RBVFVTX0xPQURFUl9OT19VTkRJX1JPTUlECQkgMHhjNAorJWRlZmluZSBQWEVOVl9TVEFUVVNfTE9BREVSX0JBRF9VTkRJX1JPTUlECQkgMHhjNQorJWRlZmluZSBQWEVOVl9TVEFUVVNfTE9BREVSX0JBRF9VTkRJX0RSSVZFUl9JTUFHRQkgMHhjNgorJWRlZmluZSBQWEVOVl9TVEFUVVNfTE9BREVSX05PX1BYRV9TVFJVQ1QJCSAweGM4CislZGVmaW5lIFBYRU5WX1NUQVRVU19MT0FERVJfTk9fUFhFTlZfU1RSVUNUCQkgMHhjOQorJWRlZmluZSBQWEVOVl9TVEFUVVNfTE9BREVSX1VORElfU1RBUlQJCQkgMHhjYQorJWRlZmluZSBQWEVOVl9TVEFUVVNfTE9BREVSX0JDX1NUQVJUCQkJIDB4Y2IKKworOyBVTkRJIElTUiBjb2RlcworJWRlZmluZSBQWEVOVl9VTkRJX0lTUl9JTl9TVEFSVAkJCQkgMQorJWRlZmluZSBQWEVOVl9VTkRJX0lTUl9JTl9QUk9DRVNTCQkJIDIKKyVkZWZpbmUgUFhFTlZfVU5ESV9JU1JfSU5fR0VUX05FWFQJCQkgMworCislZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9PVVJTCQkJICAgICAgICAgMAorJWRlZmluZSBQWEVOVl9VTkRJX0lTUl9PVVRfTk9UX09VUlMJCQkgMQorCislZW5kaWYgOyBfUFhFX0lOQwpkaWZmIC0tZ2l0IGEvY29yZS9weGVib290LmMgYi9jb3JlL3B4ZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk2MGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9weGVib290LmMKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqICAgQ29weXJpZ2h0IDE5OTQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKi8KKworI2luY2x1ZGUgPHN5c2xpbnV4L3ZpZGVvLmg+CisjaW5jbHVkZSAicHhlLmgiCisjaW5jbHVkZSA8Y29tMzIuaD4KKworI2RlZmluZSBMT0NBTEJPT1RfTVNHCSJCb290aW5nIGZyb20gbG9jYWwgZGlzay4uLiIKKworZXh0ZXJuIHZvaWQgbG9jYWxfYm9vdDE2KHZvaWQpOworCisvKgorICogQm9vdCB0byB0aGUgbG9jYWwgZGlzayBieSByZXR1cm5pbmcgdGhlIGFwcHJvcHJpYXRlIFBYRSBtYWdpYy4KKyAqIEFYIGNvbnRhaW5zIHRoZSBhcHByb3ByaWF0ZSByZXR1cm4gY29kZS4KKyAqLworX19leHBvcnQgdm9pZCBsb2NhbF9ib290KHVpbnQxNl90IGF4KQoreworICAgIGNvbTMyc3lzX3QgaXJlZzsKKyAgICBtZW1zZXQoJmlyZWcsIDAsIHNpemVvZiBpcmVnKTsKKworICAgIHN5c2xpbnV4X2ZvcmNlX3RleHRfbW9kZSgpOworCisgICAgd3JpdGVzdHIoTE9DQUxCT09UX01TRyk7CisgICAgY3JsZigpOworCisgICAgLyogUmVzdG9yZSB0aGUgZW52aXJvbm1lbnQgd2Ugd2VyZSBjYWxsZWQgd2l0aCAqLworICAgIHJlc2V0X3B4ZSgpOworCisgICAgY2xlYW51cF9oYXJkd2FyZSgpOworCisgICAgaXJlZy5lYXgud1swXSA9IGF4OworICAgIGNhbGwxNihsb2NhbF9ib290MTYsICZpcmVnLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvcHhlaXNyLmluYyBiL2NvcmUvcHhlaXNyLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2M3M2VkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9weGVpc3IuaW5jCkBAIC0wLDAgKzEsMTcyIEBACis7Cis7IFByb2Nlc3MgYSBQWEUgaW50ZXJydXB0Cis7CisJCXNlY3Rpb24gLnRleHQxNgorCitQWEVJUlFfTUFYCWVxdSAxMDAJCTsgTWF4IHNwdXJpb3VzIGludGVycnVwdHMgaW4gYSB0aW1lciB0aWNrCisKKwkJZ2xvYmFsIHB4ZV9pc3IKK3B4ZV9pc3I6CisJCWNsZAorCQlwdXNoYQorCQlwdXNoIGRzCisJCXB1c2ggZXMKKwkJcHVzaCBmcworCQlwdXNoIGdzCisKKwkJeG9yIGF4LGF4CisJCW1vdiBkcyxheAkKKwkJbW92IGVzLGF4CisKKwkJbW92IGJ4LFBYRU5WX1VORElfSVNSCisJCW1vdiBkaSxweGVudl91bmRpX2lzcl9idWYKKworCQltb3YgY3gscHhlbnZfdW5kaV9pc3JfYnVmLnNpemUvMgorCQlwdXNoIGRpCisJCXJlcCBzdG9zdworCQlwb3AgZGkKKwkJCisJCW1vdiBieXRlIFtweGVudl91bmRpX2lzcl9idWYuZnVuY2ZsYWddLFBYRU5WX1VORElfSVNSX0lOX1NUQVJUCisKKwkJY2FsbCBweGVudgorCQltb3YgYXgsW19famlmZmllc10KKwkJamMgLm5vdHVzCisKKwkJY21wIHdvcmQgW3B4ZW52X3VuZGlfaXNyX2J1Zi5mdW5jZmxhZ10sUFhFTlZfVU5ESV9JU1JfT1VUX09VUlMKKwkJam5lIC5ub3R1cworCisJCTsgSXRzIG91cnMgLSBzZXQgdGhlIGZsYWcgZm9yIHRoZSByZXR1cm4gdG8gUE0uCisJCTsgV2UgbmVlZCB0byBFT0kgdGhpcyBvdXJzZWx2ZXMsIHNvIHRoYXQgdGhlCisJCTsgbGVmdG92ZXIgQkMgZG9lc24ndCBnZXQgY29udHJvbC4KKwkJbW92IGJ5dGUgW3B4ZV9pcnFfcGVuZGluZ10sMQorCQlpbmMgZHdvcmQgW3B4ZV9pcnFfY291bnRdCisKKwkJY21wIGJ5dGUgW3B4ZV9pcnFfdmVjdG9yXSwgOAorCQltb3YgYWwsMHgyMAkJOyBOb24tc3BlY2lmaWMgRU9JCisJCWpiIC5wcmlfcGljCisKKwkJb3V0IDB4QTAsIGFsCQk7IFNlY29uZGFyeSBQSUMKKy5wcmlfcGljOgorCQlvdXQgMHgyMCxhbAkJOyBQcmltYXJ5IFBJQworCisJCW1vdiBbcHhlaXJxX2xhc3RdLGF4CisJCW1vdiB3b3JkIFtweGVpcnFfZGVhZG1hbl0sUFhFSVJRX01BWAorCisuZXhpdDoKKwkJcG9wIGdzCisJCXBvcCBmcworCQlwb3AgZXMKKwkJcG9wIGRzCisJCXBvcGEKKwkJaXJldAorCisubm90dXM6CisJCWNtcCBheCxbcHhlaXJxX2xhc3RdCisJCWpuZSAucmVzZXRfdGltZW91dAorCQlkZWMgd29yZCBbcHhlaXJxX2RlYWRtYW5dCisJCWp6IC50aW1lb3V0CisKKy5jaGFpbjoKKwkJcG9wIGdzCisJCXBvcCBmcworCQlwb3AgZXMKKwkJcG9wIGRzCisJCXBvcGEKKwkJam1wIDA6MAorCQlnbG9iYWwgcHhlX2lycV9jaGFpbgorcHhlX2lycV9jaGFpbgllcXUgJC00CisKKy5yZXNldF90aW1lb3V0OgorCQltb3YgW3B4ZWlycV9sYXN0XSxheAorCQltb3Ygd29yZCBbcHhlaXJxX2RlYWRtYW5dLFBYRUlSUV9NQVgKKwkJam1wIC5jaGFpbgorCisJCTsgVG9vIG1hbnkgc3B1cmlvdXMgaW50ZXJydXB0cywgc2h1dCBvZmYgdGhlIGludGVycnVwdHMKKwkJOyBhbmQgZ28gdG8gcG9sbGluZyBtb2RlCisudGltZW91dDoKKwkJbW92IGFsLFtweGVfaXJxX3ZlY3Rvcl0KKwkJbW92IGR4LDIxaAorCQltb3Z6eCBjeCxhbAorCQlzaGwgY3gsNy0zCisJCWFkZCBkeCxjeAorCQlhbmQgYWwsNworCQl4Y2hnIGF4LGN4CisJCW1vdiBjaCwxCisJCXNobCBjaCxjbAorCQlpbiBhbCxkeAorCQlvciBhbCxjaAorCQlvdXQgZHgsYWwKKwkJb3IgYnl0ZSBbcHhlX25lZWRfcG9sbF0sMQorCQlqbXAgLmV4aXQKKworCis7IEVtdWxhdGUgYSBQWEUgaW50ZXJydXB0IGZyb20gdGhlIHBvbGxpbmcgdGhyZWFkCisJCWdsb2JhbCBweGVfcG9sbAorcHhlX3BvbGw6CisJCXB1c2hmCisJCWNsaQorCQljbGQKKwkJcHVzaGEKKwkJcHVzaCBkcworCQlwdXNoIGVzCisJCXB1c2ggZnMKKwkJcHVzaCBncworCisJCW1vdiBieCxQWEVOVl9VTkRJX0lTUgorCQltb3YgZGkscHhlbnZfdW5kaV9pc3JfYnVmCisKKwkJbW92IGN4LHB4ZW52X3VuZGlfaXNyX2J1Zi5zaXplLzIKKwkJcHVzaCBkaQorCQlyZXAgc3Rvc3cKKwkJcG9wIGRpCisJCQorCQltb3YgYnl0ZSBbcHhlbnZfdW5kaV9pc3JfYnVmLmZ1bmNmbGFnXSxQWEVOVl9VTkRJX0lTUl9JTl9TVEFSVAorCisJCWNhbGwgcHhlbnYKKwkJamMgLm5vdHVzCisKKwkJY21wIHdvcmQgW3B4ZW52X3VuZGlfaXNyX2J1Zi5mdW5jZmxhZ10sUFhFTlZfVU5ESV9JU1JfT1VUX09VUlMKKwkJam5lIC5ub3R1cworCisJCTsgSXRzIG91cnMgLSBzZXQgdGhlIGZsYWcgZm9yIHRoZSByZXR1cm4gdG8gUE0uCisJCTsgV2UgbmVlZCB0byBFT0kgdGhpcyBvdXJzZWx2ZXMsIHNvIHRoYXQgdGhlCisJCTsgbGVmdG92ZXIgQkMgZG9lc24ndCBnZXQgY29udHJvbC4KKwkJbW92IGJ5dGUgW3B4ZV9pcnFfcGVuZGluZ10sMQorCisubm90dXM6CisJCXBvcCBncworCQlwb3AgZnMKKwkJcG9wIGVzCisJCXBvcCBkcworCQlwb3BhCisJCXBvcGYKKwkJcmV0CisKKwkJc2VjdGlvbiAuYnNzMTYKKwkJYWxpZ25iIDQKK3B4ZW52X3VuZGlfaXNyX2J1ZjoKKy5zdGF0dXM6CXJlc3cgMQorLmZ1bmNmbGFnOglyZXN3IDEKKy5idWZmZXJsZW5ndGg6CXJlc3cgMQorLmZyYW1lbGVuOglyZXN3IDEKKy5mcmFtZWhkcmxlbjoJcmVzdyAxCisuZnJhbWU6CQlyZXN3IDIKKy5wcm90dHlwZToJcmVzYiAxCisucGt0dHlwZToJcmVzYiAxCisuc2l6ZQkJZXF1ICQtcHhlbnZfdW5kaV9pc3JfYnVmCisKKwkJYWxpZ25iIDQKK3B4ZWlycV9sYXN0CXJlc3cgMQorcHhlaXJxX2RlYWRtYW4JcmVzdyAxCisKKwkJZ2xvYmFsIHB4ZV9pcnFfY291bnQKK3B4ZV9pcnFfY291bnQJcmVzZCAxCQkJOyBQWEUgSVJRIGNvdW50ZXIKKwkJZ2xvYmFsIHB4ZV9pcnFfdmVjdG9yCitweGVfaXJxX3ZlY3RvcglyZXNiIDEJCQk7IFBYRSBJUlEgdmVjdG9yCisJCWdsb2JhbCBweGVfaXJxX3BlbmRpbmcKK3B4ZV9pcnFfcGVuZGluZwlyZXNiIDEJCQk7IElSUSBwZW5kaW5nIGZsYWcKKwkJZ2xvYmFsIHB4ZV9uZWVkX3BvbGwKK3B4ZV9uZWVkX3BvbGwJcmVzYiAxCQkJOyBCaXQgMCA9IG5lZWQgcG9sbGluZworCQkJCQk7IEJpdCAxID0gcG9sbGluZyBhY3RpdmUKKworCQlzZWN0aW9uIC50ZXh0MTYKZGlmZiAtLWdpdCBhL2NvcmUvcHhlbGludXgtYy5jIGIvY29yZS9weGVsaW51eC1jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyM2Q4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcHhlbGludXgtYy5jCkBAIC0wLDAgKzEsMjUgQEAKKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxjb20zMi5oPgorCitleHRlcm4gZmFyX3B0cl90IEluaXRTdGFjaywgU3RydWNQdHI7CisKKy8qCisgKiBJUCBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCB0aGUgZmllbGQgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZQorICogTGludXgga2VybmVsIGV4cGVjdHMgaW4gdGhlIGlwPSBvcHRpb24uCisgKi8KK3N0cnVjdCBzeXNsaW51eF9pcGluZm8gSVBJbmZvOwordWludDE2X3QgQVBJVmVyOwkJLyogUFhFIEFQSSB2ZXJzaW9uIGZvdW5kICovCisKK19fZXhwb3J0IHZvaWQgZ2V0X2Rlcml2YXRpdmVfaW5mbyh1bmlvbiBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8gKmRpKQoreworCWRpLT5weGUuZmlsZXN5c3RlbSA9IFNZU0xJTlVYX0ZTX1BYRUxJTlVYOworCWRpLT5weGUuYXBpdmVyID0gQVBJVmVyOworCWRpLT5weGUucHhlbnZwdHIgPSBHRVRfUFRSKFN0cnVjUHRyKTsKKwlkaS0+cHhlLnB4ZW52X29mZnMgPSBTdHJ1Y1B0ci5vZmZzOworCWRpLT5weGUucHhlbnZfc2VnID0gU3RydWNQdHIuc2VnOworCWRpLT5weGUuc3RhY2sgPSBHRVRfUFRSKEluaXRTdGFjayk7CisJZGktPnB4ZS5zdGFja19vZmZzID0gSW5pdFN0YWNrLm9mZnM7CisJZGktPnB4ZS5zdGFja19zZWcgPSBJbml0U3RhY2suc2VnOworCWRpLT5weGUuaXBpbmZvID0gJklQSW5mbzsKKwlkaS0+cHhlLm15aXAgPSBJUEluZm8ubXlpcDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvcHhlbGludXguYXNtIGIvY29yZS9weGVsaW51eC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1NDNkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcHhlbGludXguYXNtCkBAIC0wLDAgKzEsNTczIEBACis7IC0qLSBmdW5kYW1lbnRhbCAtKi0gKGFzbS1tb2RlIHN1Y2tzKQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Cis7ICBweGVsaW51eC5hc20KKzsKKzsgIEEgcHJvZ3JhbSB0byBib290IExpbnV4IGtlcm5lbHMgb2ZmIGEgVEZUUCBzZXJ2ZXIgdXNpbmcgdGhlIEludGVsIFBYRQorOyAgbmV0d29yayBib290aW5nIEFQSS4gIEl0IGlzIGJhc2VkIG9uIHRoZSBTWVNMSU5VWCBib290IGxvYWRlciBmb3IKKzsgIE1TLURPUyBmbG9wcGllcy4KKzsKKzsgICBDb3B5cmlnaHQgMTk5NC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7Cis7ICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzsgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorOyAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzsgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOworOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVkZWZpbmUgSVNfUFhFTElOVVggMQorJWluY2x1ZGUgImhlYWQuaW5jIgorJWluY2x1ZGUgInB4ZS5pbmMiCisKKzsgZ1BYRSBleHRlbnNpb25zIHN1cHBvcnQKKyVkZWZpbmUgR1BYRQkxCisKKzsKKzsgU29tZSBzZW1pLWNvbmZpZ3VyYWJsZSBjb25zdGFudHMuLi4gY2hhbmdlIG9uIHlvdXIgb3duIHJpc2suCis7CitteV9pZAkJZXF1IHB4ZWxpbnV4X2lkCitOVUxMRklMRQllcXUgMAkJCTsgWmVybyBieXRlID09IG51bGwgZmlsZSBuYW1lCitOVUxMT0ZGU0VUCWVxdSAwCQkJOyBQb3NpdGlvbiBpbiB3aGljaCB0byBsb29rCitSRUJPT1RfVElNRQllcXUgNSo2MAkJOyBJZiBmYWlsdXJlLCB0aW1lIHVudGlsIGZ1bGwgcmVzZXQKKyVhc3NpZ24gSElHSE1FTV9TTE9QIDEyOCoxMDI0CQk7IEF2b2lkIHRoaXMgbXVjaCBtZW1vcnkgbmVhciB0aGUgdG9wCitURlRQX0JMT0NLU0laRV9MRzIgZXF1IDkJCTsgbG9nMihieXRlcy9ibG9jaykKK1RGVFBfQkxPQ0tTSVpFCWVxdSAoMSA8PCBURlRQX0JMT0NLU0laRV9MRzIpCisKK1NFQ1RPUl9TSElGVAllcXUgVEZUUF9CTE9DS1NJWkVfTEcyCitTRUNUT1JfU0laRQllcXUgVEZUUF9CTE9DS1NJWkUKKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgICBCRUdJTiBDT0RFCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Cis7IE1lbW9yeSBiZWxvdyB0aGlzIHBvaW50IGlzIHJlc2VydmVkIGZvciB0aGUgQklPUyBhbmQgdGhlIE1CUgorOworCQlzZWN0aW9uIC5lYXJseWJzcworICAgICAgICAgICAgICAgIGdsb2JhbCB0cmFja2J1ZgordHJhY2tidWZzaXplCWVxdSA4MTkyCit0cmFja2J1ZglyZXNiIHRyYWNrYnVmc2l6ZQk7IFRyYWNrIGJ1ZmZlciBnb2VzIGhlcmUKKwkJOyBlbmRzIGF0IDI4MDBoCisKKwkJOyBUaGVzZSBmaWVsZHMgc2F2ZSBpbmZvcm1hdGlvbiBmcm9tIGJlZm9yZSB0aGUgdGltZQorCQk7IC5ic3MgaXMgemVyb2VkLi4uIG11c3QgYmUgaW4gLmVhcmx5YnNzCisJCWdsb2JhbCBJbml0U3RhY2sKK0luaXRTdGFjawlyZXNkIDEKKworCQlzZWN0aW9uIC5ic3MxNgorCQlhbGlnbmIgRklMRU5BTUVfTUFYCitQWEVTdGFjawlyZXNkIDEJCQk7IFNhdmVkIHN0YWNrIGR1cmluZyBQWEUgY2FsbAorCisJCWFsaWduYiA0CisgICAgICAgICAgICAgICAgZ2xvYmFsIERIQ1BNYWdpYywgUmVib290VGltZSwgQklPU05hbWUKK1JlYm9vdFRpbWUJcmVzZCAxCQkJOyBSZWJvb3QgdGltZW91dCwgaWYgc2V0IGJ5IG9wdGlvbgorTG9jYWxCb290VHlwZQlyZXN3IDEJCQk7IExvY2FsIGJvb3QgcmV0dXJuIGNvZGUKK0RIQ1BNYWdpYwlyZXNiIDEJCQk7IFBYRUxJTlVYIG1hZ2ljIGZsYWdzCitCSU9TTmFtZQlyZXN3IDEJCQk7IER1bW15IHZhcmlhYmxlIC0gYWx3YXlzIDAKKworCQlzZWN0aW9uIC50ZXh0MTYKKwkJZ2xvYmFsIFN0YWNrQnVmCitTdGFja0J1ZgllcXUgU1RBQ0tfVE9QLTQ0CTsgQmFzZSBvZiBzdGFjayBpZiB3ZSB1c2Ugb3VyIG93bgorU3RhY2tIb21lCWVxdSBTdGFja0J1ZgorCisJCTsgUFhFIGxvYWRzIHRoZSB3aG9sZSBmaWxlLCBidXQgYXNzdW1lIGl0IGNhbid0IGJlIG1vcmUKKwkJOyB0aGFuICgzODQtMzEpSyBpbiBzaXplLgorTWF4TE1BCQllcXUgMzg0KjEwMjQKKworOworOyBQcmltYXJ5IGVudHJ5IHBvaW50LgorOworYm9vdHNlYwkJZXF1ICQKK19zdGFydDoKKwkJam1wIDA6X3N0YXJ0MQkJOyBDYW5vbmljYWxpemUgdGhlIGFkZHJlc3MgYW5kIHNraXAKKwkJCQkJOyB0aGUgcGF0Y2ggaGVhZGVyCisKKzsKKzsgUGF0Y2ggYXJlYSBmb3IgYWRkaW5nIGhhcmR3aXJlZCBESENQIG9wdGlvbnMKKzsKKwkJYWxpZ24gNAorCitoY2RoY3BfbWFnaWMJZGQgMHgyOTgzYzhhYwkJOyBNYWdpYyBudW1iZXIKK2hjZGhjcF9sZW4JZGQgNyo0CQkJOyBTaXplIG9mIHRoaXMgc3RydWN0dXJlCitoY2RoY3BfZmxhZ3MJZGQgMAkJCTsgUmVzZXJ2ZWQgZm9yIHRoZSBmdXR1cmUKKwkJZ2xvYmFsIGJkaGNwX2xlbiwgYWRoY3BfbGVuCisJCTsgUGFyYW1ldGVycyB0byBiZSBwYXJzZWQgYmVmb3JlIHRoZSBvbmVzIGZyb20gUFhFCitiZGhjcF9vZmZzZXQJZGQgMAkJCTsgT2Zmc2V0IChlbnRlcmVkIGJ5IHBhdGNoZXIpCitiZGhjcF9sZW4JZGQgMAkJCTsgTGVuZ3RoIChlbnRlcmVkIGJ5IHBhdGNoZXIpCisJCTsgUGFyYW1ldGVycyB0byBiZSBwYXJzZWQgKmFmdGVyKiB0aGUgb25lcyBmcm9tIFBYRQorYWRoY3Bfb2Zmc2V0CWRkIDAJCQk7IE9mZnNldCAoZW50ZXJlZCBieSBwYXRjaGVyKQorYWRoY3BfbGVuCWRkIDAJCQk7IExlbmd0aCAoZW50ZXJlZCBieSBwYXRjaGVyKQorCitfc3RhcnQxOgorCQlwdXNoZmQJCQk7IFBhcmFub2lhLi4uIGluIGNhc2Ugb2YgcmV0dXJuIHRvIFBYRQorCQlwdXNoYWQJCQk7IC4uLiBzYXZlIGFzIG11Y2ggc3RhdGUgYXMgcG9zc2libGUKKwkJcHVzaCBkcworCQlwdXNoIGVzCisJCXB1c2ggZnMKKwkJcHVzaCBncworCisJCWNsZAkJCTsgQ29weSB1cHdhcmRzCisJCXhvciBheCxheAorCQltb3YgZHMsYXgKKwkJbW92IGVzLGF4CisKKyVpZiAwIDsgZGVidWdnaW5nIGNvZGUgb25seS4uLiBub3QgaW50ZW5kZWQgZm9yIHByb2R1Y3Rpb24gdXNlCisJCTsgQ2xvYmJlciB0aGUgc3RhY2sgc2VnbWVudCwgdG8gdGVzdCBmb3Igc3BlY2lmaWMgcGF0aG9sb2dpZXMKKwkJbW92IGRpLFNUQUNLX0JBU0UKKwkJbW92IGN4LFNUQUNLX0xFTiA+PiAxCisJCW1vdiBheCwweGY0ZjQKKwkJcmVwIHN0b3N3CisKKwkJOyBDbG9iYmVyIHRoZSB0YWlsIG9mIHRoZSA2NEsgc2VnbWVudCwgdG9vCisJCWV4dGVybiBfX2JzczFfZW5kCisJCW1vdiBkaSxfX2JzczFfZW5kCisJCXN1YiBjeCxkaQkJOyBDWCA9IDAgcHJldmlvdXNseQorCQlzaHIgY3gsMQorCQlyZXAgc3Rvc3cKKyVlbmRpZgorCisJCTsgVGhhdCBpcyBhbGwgcHVzaGVkIG9udG8gdGhlIFBYRSBzdGFjay4gIFNhdmUgdGhlIHBvaW50ZXIKKwkJOyB0byBpdCBhbmQgc3dpdGNoIHRvIGFuIGludGVybmFsIHN0YWNrLgorCQltb3YgW0luaXRTdGFja10sc3AKKwkJbW92IFtJbml0U3RhY2srMl0sc3MKKworCQlsc3MgZXNwLFtCYXNlU3RhY2tdCisJCXN0aQkJCTsgU3RhY2sgc2V0IHVwIGFuZCByZWFkeQorCis7Cis7IEluaXRpYWxpemUgc2NyZWVuIChpZiB3ZSdyZSB1c2luZyBvbmUpCis7CislaW5jbHVkZSAiaW5pdC5pbmMiCisKKzsKKzsgVGVsbCB0aGUgdXNlciB3ZSBnb3QgdGhpcyBmYXIKKzsKKwkJbW92IHNpLHN5c2xpbnV4X2Jhbm5lcgorCQljYWxsIHdyaXRlc3RyX2Vhcmx5CisKKwkJbW92IHNpLGNvcHlyaWdodF9zdHIKKwkJY2FsbCB3cml0ZXN0cl9lYXJseQorCis7Cis7IGRvIGZzIGluaXRpYWxpemUKKzsKKwkgICAgICAgIG1vdiBlYXgsUk9PVF9GU19PUFMKKwkJeG9yIGVicCxlYnAKKyAgICAgICAgICAgICAgICBwbV9jYWxsIHBtX2ZzX2luaXQKKworCQlzZWN0aW9uIC5yb2RhdGEKKwkJYWxpZ256IDQKK1JPT1RfRlNfT1BTOgorICAgICAgICAgICAgICAgIGV4dGVybiBweGVfZnNfb3BzCisJCWRkIHB4ZV9mc19vcHMKKwkJZGQgMAorCisKKwkJc2VjdGlvbiAudGV4dDE2Cis7Cis7IEluaXRpYWxpemUgdGhlIGlkbGUgbWVjaGFuaXNtCis7CisJCWV4dGVybiByZXNldF9pZGxlCisJCXBtX2NhbGwgcmVzZXRfaWRsZQorCis7Cis7IE5vdyB3ZSdyZSBhbGwgc2V0IHRvIHN0YXJ0IHdpdGggb3VyICpyZWFsKiBidXNpbmVzcy4KKzsKKzsgSW4gcHJldmlvdXMgdmVyc2lvbnMgSSBhdm9pZGVkIHVzaW5nIDMyLWJpdCByZWdpc3RlcnMgYmVjYXVzZSBvZiBhCis7IHJ1bW91ciBzb21lIEJJT1NlcyBjbG9iYmVyZWQgdGhlIHVwcGVyIGhhbGYgb2YgMzItYml0IHJlZ2lzdGVycyBhdAorOyByYW5kb20uICBJIGZpZ3VyZSwgdGhvdWdoLCB0aGF0IGlmIHRoZXJlIGFyZSBhbnkgb2YgdGhvc2Ugc3RpbGwgbGVmdAorOyB0aGV5IHByb2JhYmx5IHdvbid0IGJlIHRyeWluZyB0byBpbnN0YWxsIExpbnV4IG9uIHRoZW0uLi4KKzsKKzsgVGhlIGNvZGUgaXMgc3RpbGwgcmlwZSB3aXRoIDE2LWJpdGlzbXMsIHRob3VnaC4gIE5vdCB3b3J0aCB0aGUgaGFzc2xlCis7IHRvIHRha2UnbSBvdXQuICBJbiBmYWN0LCB3ZSBtYXkgd2FudCB0byBwdXQgdGhlbSBiYWNrIGlmIHdlJ3JlIGdvaW5nCis7IHRvIGJvb3QgRUxLUyBhdCBzb21lIHBvaW50LgorOworCis7Cis7IExpbnV4IGtlcm5lbCBsb2FkaW5nIGNvZGUgaXMgY29tbW9uLiAgSG93ZXZlciwgd2UgbmVlZCB0byBkZWZpbmUKKzsgYSBjb3VwbGUgb2YgaGVscGVyIG1hY3Jvcy4uLgorOworCis7IFVubG9hZCBQWEUgc3RhY2sKKyVkZWZpbmUgSEFWRV9VTkxPQURfUFJFUAorJW1hY3JvCVVOTE9BRF9QUkVQIDAKKwkJcG1fY2FsbCB1bmxvYWRfcHhlCislZW5kbWFjcm8KKworOworOyBKdW1wIHRvIDMyLWJpdCBFTEYgc3BhY2UKKzsKKwkJcG1fY2FsbCBsb2FkX2VudjMyCisJCWptcCBrYWJvb20JCTsgbG9hZF9lbnYzMigpIHNob3VsZG4ndCByZXR1cm4uIElmIGl0IGRvZXMsIHRoZW4ga2Fib29tIQorCitwcmludF9oZWxsbzoKK2VudGVyX2NvbW1hbmQ6CithdXRvX2Jvb3Q6CisJCXBtX2NhbGwgaGVsbG8KKworOworOyBTYXZlIGhhcmR3aXJlZCBESENQIG9wdGlvbnMuICBUaGlzIGlzIGRvbmUgYmVmb3JlIHRoZSBDIGVudmlyb25tZW50Cis7IGlzIGluaXRpYWxpemVkLCBzbyBpdCBoYXMgdG8gYmUgZG9uZSBpbiBhc3NlbWJseS4KKzsKKyVkZWZpbmUgTUFYX0RIQ1BfT1BUUwk0MDk2CisJCWJpdHMgMzIKKworCQlzZWN0aW9uIC5zYXZlZGF0YQorCQlnbG9iYWwgYmRoY3BfZGF0YSwgYWRoY3BfZGF0YQorYmRoY3BfZGF0YToJcmVzYiBNQVhfREhDUF9PUFRTCithZGhjcF9kYXRhOglyZXNiIE1BWF9ESENQX09QVFMKKworCQlzZWN0aW9uIC50ZXh0bnIKK3BtX3NhdmVfZGF0YToKKwkJbW92IGVheCxNQVhfREhDUF9PUFRTCisJCW1vdnp4IGVjeCx3b3JkIFtiZGhjcF9sZW5dCisJCWNtcCBlY3gsZWF4CisJCWpuYSAub2tzaXplCisJCW1vdiBlY3gsZWF4CisJCW1vdiBbYmRoY3BfbGVuXSxheAorLm9rc2l6ZToKKwkJbW92IGVzaSxbYmRoY3Bfb2Zmc2V0XQorCQlhZGQgZXNpLF9zdGFydAorCQltb3YgZWRpLGJkaGNwX2RhdGEKKwkJYWRkIGVjeCwzCisJCXNociBlY3gsMgorCQlyZXAgbW92c2QKKworYWRoY3BfY29weToKKwkJbW92enggZWN4LHdvcmQgW2FkaGNwX2xlbl0KKwkJY21wIGVjeCxlYXgKKwkJam5hIC5va3NpemUKKwkJbW92IGVjeCxlYXgKKwkJbW92IFthZGhjcF9sZW5dLGF4Cisub2tzaXplOgorCQltb3YgZXNpLFthZGhjcF9vZmZzZXRdCisJCWFkZCBlc2ksX3N0YXJ0CisJCW1vdiBlZGksYWRoY3BfZGF0YQorCQlhZGQgZWN4LDMKKwkJc2hyIGVjeCwyCisJCXJlcCBtb3ZzZAorCQlyZXQKKworCQliaXRzIDE2CisKKzsgQXMgY29yZS91aS5pbmMgdXNlZCB0byBiZSBpbmNsdWRlZCBoZXJlIGluIGNvcmUvcHhlbGludXguYXNtLCBhbmQgaXQncyBubworOyBsb25nZXIgdXNlZCwgaXRzIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgdXNlZCBieQorOyBjb3JlL3B4ZWxpbnV4LmFzbSBhcmUgbm93IGRlY2xhcmVkIGhlcmUuCisJCXNlY3Rpb24gLmJzczE2CisJCWFsaWduYiA0CitLZXJuZWxfRUFYCXJlc2QgMQorS2VybmVsX1NJCXJlc3cgMQorCisJCXNlY3Rpb24gLmJzczE2CisJCWFsaWduYiA0CitUaGlzS2JkVG8JcmVzZCAxCQkJOyBUZW1wb3JhcnkgaG9sZGVyIGZvciBLYmRUaW1lb3V0CitUaGlzVG90YWxUbwlyZXNkIDEJCQk7IFRlbXBvcmFyeSBob2xkZXIgZm9yIFRvdGFsVGltZW91dAorS2VybmVsRXh0UHRyCXJlc3cgMQkJCTsgRHVyaW5nIHNlYXJjaCwgZmluYWwgbnVsbCBwb2ludGVyCitGdW5jRmxhZwlyZXNiIDEJCQk7IEVzY2FwZSBzZXF1ZW5jZXMgcmVjZWl2ZWQgZnJvbSBrZXlib2FyZAorS2VybmVsVHlwZQlyZXNiIDEJCQk7IEtlcm5lbCB0eXBlLCBmcm9tIHZrZXJuZWwsIGlmIGtub3duCisJCWdsb2JhbCBLZXJuZWxOYW1lCitLZXJuZWxOYW1lCXJlc2IgRklMRU5BTUVfTUFYCTsgTWFuZ2xlZCBuYW1lIGZvciBrZXJuZWwKKworCQlzZWN0aW9uIC50ZXh0MTYKKzsKKzsgQ09NMzIgdmVzdGlnaWFsIGRhdGEgc3RydWN0dXJlCis7CislaW5jbHVkZSAiY29tMzIuaW5jIgorCisJCXNlY3Rpb24gLnRleHQxNgorCQlnbG9iYWwgbG9jYWxfYm9vdDE2OmZ1bmN0aW9uIGhpZGRlbgorbG9jYWxfYm9vdDE2OgorCQltb3YgW0xvY2FsQm9vdFR5cGVdLGF4CisJCWxzcyBzcCxbSW5pdFN0YWNrXQorCQlwb3AgZ3MKKwkJcG9wIGZzCisJCXBvcCBlcworCQlwb3AgZHMKKwkJcG9wYWQKKwkJbW92IGF4LFtjczpMb2NhbEJvb3RUeXBlXQorCQljbXAgYXgsLTEJCQk7IGxvY2FsYm9vdCAtMSA9PSBJTlQgMThoCisJCWplIC5pbnQxOAorCQlwb3BmZAorCQlyZXRmCQkJCTsgUmV0dXJuIHRvIFBYRQorLmludDE4OgorCQlwb3BmZAorCQlpbnQgMThoCisJCWptcCAwRjAwMGg6MEZGRjBoCisJCWhsdAorCis7Cis7IGthYm9vbTogd3JpdGUgYSBtZXNzYWdlIGFuZCBiYWlsIG91dC4gIFdhaXQgZm9yIHF1aXRlIGEgd2hpbGUsCis7CSAgb3IgYSB1c2VyIGtleXByZXNzLCB0aGVuIGRvIGEgaGFyZCByZWJvb3QuCis7Cis7ICAgICAgICAgTm90ZTogdXNlIEJJT1NfdGltZXIgaGVyZTsgd2UgbWF5IG5vdCBoYXZlIGppZmZpZXMgc2V0IHVwLgorOworICAgICAgICAgICAgICAgIGdsb2JhbCBrYWJvb20KK2thYm9vbToKKwkJUkVTRVRfU1RBQ0tfQU5EX1NFR1MgQVgKKy5wYXRjaDoJCW1vdiBzaSxiYWlsbXNnCisJCWNhbGwgd3JpdGVzdHJfZWFybHkJCTsgUmV0dXJucyB3aXRoIEFMID0gMAorLmRyYWluOgkJY2FsbCBwb2xsY2hhcgorCQlqeiAuZHJhaW5lZAorCQljYWxsIGdldGNoYXIKKwkJam1wIHNob3J0IC5kcmFpbgorLmRyYWluZWQ6CisJCW1vdiBlZGksW1JlYm9vdFRpbWVdCisJCW1vdiBhbCxbREhDUE1hZ2ljXQorCQlhbmQgYWwsMDloCQk7IE1hZ2ljK1RpbWVvdXQKKwkJY21wIGFsLDA5aAorCQlqZSAudGltZV9zZXQKKwkJbW92IGVkaSxSRUJPT1RfVElNRQorLnRpbWVfc2V0OgorCQltb3YgY3gsMTgKKy53YWl0MToJCXB1c2ggY3gKKwkJbW92IGVjeCxlZGkKKy53YWl0MjoJCW1vdiBkeCxbQklPU190aW1lcl0KKy53YWl0MzoJCWNhbGwgcG9sbGNoYXIKKwkJam56IC5rZXlwcmVzcworCQlwbV9jYWxsIF9faWRsZQorCQljbXAgZHgsW0JJT1NfdGltZXJdCisJCWplIC53YWl0MworCQlsb29wIC53YWl0MixlY3gKKwkJbW92IGFsLCcuJworCQlwbV9jYWxsIHBtX3dyaXRlY2hyCisJCXBvcCBjeAorCQlsb29wIC53YWl0MQorLmtleXByZXNzOgorCQlwbV9jYWxsIGNybGYKKwkJbW92IHdvcmQgW0JJT1NfbWFnaWNdLDAJOyBDb2xkIHJlYm9vdAorCQlqbXAgMEYwMDBoOjBGRkYwaAk7IFJlc2V0IHZlY3RvciBhZGRyZXNzCisKKzsKKzsgcHhlbnYKKzsKKzsgVGhpcyBpcyB0aGUgbWFpbiBQWEVOVisvIVBYRSBlbnRyeSBwb2ludCwgdXNpbmcgdGhlIFBYRU5WKworOyBjYWxsaW5nIGNvbnZlbnRpb24uICBUaGlzIGlzIGEgc2VwYXJhdGUgbG9jYWwgcm91dGluZSBzbworOyB3ZSBjYW4gaG9vayBzcGVjaWFsIHRoaW5ncyBmcm9tIGl0IGlmIG5lY2Vzc2FyeS4gIEluIHBhcnRpY3VsYXIsCis7IHNvbWUgUFhFIHN0YWNrcyBzZWVtIHRvIG5vdCBsaWtlIGJlaW5nIGludm9rZWQgZnJvbSBhbnl0aGluZyBidXQKKzsgdGhlIGluaXRpYWwgc3RhY2ssIHNvIGh1bW91ciBpdC4KKzsKKzsgV2hpbGUgd2UncmUgYXQgaXQsIHNhdmUgYW5kIHJlc3RvcmUgYWxsIHJlZ2lzdGVycy4KKzsKKyAgICAgICAgICAgICAgICBnbG9iYWwgcHhlbnYKK3B4ZW52OgorCQlwdXNoZmQKKwkJcHVzaGFkCisKKwkJOyBXZSBtYXkgYmUgcmVtb3Zpbmcgb3Vyc2VsdmVzIGZyb20gbWVtb3J5CisJCWNtcCBieCxQWEVOVl9SRVNUQVJUX1RGVFAKKwkJanogLmRpc2FibGVfdGltZXIKKwkJY21wIGJ4LFBYRU5WX0ZJTEVfRVhFQworCQlqbnogLnN0b3JlX3N0YWNrCisKKy5kaXNhYmxlX3RpbWVyOgorCQljYWxsIGJpb3NfdGltZXJfY2xlYW51cAorCisuc3RvcmVfc3RhY2s6CisJCXB1c2hmCisJCWNsaQorCQlpbmMgd29yZCBbY3M6UFhFU3RhY2tMb2NrXQorCQlqbnogLnNraXAxCisJCXBvcCBicAorCQltb3YgW2NzOlBYRVN0YWNrXSxzcAorCQltb3YgW2NzOlBYRVN0YWNrKzJdLHNzCisJCWxzcyBzcCxbY3M6SW5pdFN0YWNrXQorCQlwdXNoIGJwCisuc2tpcDE6CisJCXBvcGYKKworCQk7IFByZS1jbGVhciB0aGUgU3RhdHVzIGZpZWxkCisJCW1vdiB3b3JkIFtlczpkaV0sY3MKKworCQk7IFRoaXMgd29ya3MgZWl0aGVyIGZvciB0aGUgUFhFTlYrIG9yIHRoZSAhUFhFIGNhbGxpbmcKKwkJOyBjb252ZW50aW9uLCBhcyBsb25nIGFzIHdlIGlnbm9yZSBDRiAod2hpY2ggaXMgcmVkdW5kYW50CisJCTsgd2l0aCBBWCBhbnl3YXkuKQorCQlwdXNoIGVzCisJCXB1c2ggZGkKKwkJcHVzaCBieAorLmp1bXA6CQljYWxsIDA6MAorCQlhZGQgc3AsNgorCQltb3YgW2NzOlBYRVN0YXR1c10sYXgKKworCQlwdXNoZgorCQljbGkKKwkJZGVjIHdvcmQgW2NzOlBYRVN0YWNrTG9ja10KKwkJam5zIC5za2lwMgorCQlwb3AgYnAKKwkJbHNzIHNwLFtjczpQWEVTdGFja10KKwkJcHVzaCBicAorLnNraXAyOgorCQlwb3BmCisKKwkJbW92IGJwLHNwCisJCWFuZCBheCxheAorCQlzZXRueiBbYnArMzJdCQkJOyBJZiBBWCAhPSAwIHNldCBDRiBvbiByZXR1cm4KKworCQk7IFRoaXMgY2xvYmJlcnMgdGhlIEFYIHJldHVybiwgYnV0IHdlIGFscmVhZHkgc2F2ZWQgaXQgaW50bworCQk7IHRoZSBQWEVTdGF0dXMgdmFyaWFibGUuCisJCXBvcGFkCisKKwkJOyBJZiB0aGUgY2FsbCBmYWlsZWQsIGl0IGNvdWxkIHJldHVybi4KKwkJY21wIGJ4LFBYRU5WX1JFU1RBUlRfVEZUUAorCQlqeiAuZW5hYmxlX3RpbWVyCisJCWNtcCBieCxQWEVOVl9GSUxFX0VYRUMKKwkJam56IC5wb3BfZmxhZ3MKKworLmVuYWJsZV90aW1lcjoKKwkJY2FsbCB0aW1lcl9pbml0CisKKy5wb3BfZmxhZ3M6CisJCXBvcGZkCQkJCTsgUmVzdG9yZSBmbGFncyAoaW5jbC4gSUYsIERGKQorCQlyZXQKKworOyBNdXN0IGJlIGFmdGVyIGZ1bmN0aW9uIGRlZiBkdWUgdG8gTkFTTSBidWcKKyAgICAgICAgICAgICAgICBnbG9iYWwgUFhFRW50cnkKK1BYRUVudHJ5CWVxdSBweGVudi5qdW1wKzEKKworOworOyBUaGUgUFhFU3RhY2tMb2NrIGtlZXBzIHVzIGZyb20gc3dpdGNoaW5nIHN0YWNrcyBpZiB3ZSB0YWtlIGFuIGludGVycnVwdAorOyAod2hpY2ggZW5kcyB1cCBjYWxsaW5nIHB4ZW52KSB3aGlsZSB3ZSBhcmUgYWxyZWFkeSBvbiB0aGUgUFhFIHN0YWNrLgorOyBJdCB3aWxsIGJlIC0xIG5vcm1hbGx5LCAwIGluc2lkZSBhIFBYRSBjYWxsLCBhbmQgYSBwb3NpdGl2ZSB2YWx1ZQorOyBpbnNpZGUgYSAqbmVzdGVkKiBQWEUgY2FsbC4KKzsKKwkJc2VjdGlvbiAuZGF0YTE2CisJCWFsaWduYiAyCitQWEVTdGFja0xvY2sJZHcgLTEKKworCQlzZWN0aW9uIC5ic3MxNgorCQlhbGlnbmIgMgorUFhFU3RhdHVzCXJlc2IgMgorCisJCXNlY3Rpb24gLnRleHQxNgorOworOyBJbnZva2UgSU5UIDFBaCBvbiB0aGUgUFhFIHN0YWNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSAiUGxhbiBDIiBtZXRob2QKKzsgZm9yIGZpbmRpbmcgdGhlIFBYRSBlbnRyeSBwb2ludC4KKzsKKyAgICAgICAgICAgICAgICBnbG9iYWwgcHhlX2ludDFhCitweGVfaW50MWE6CisJCW1vdiBbY3M6UFhFU3RhY2tdLHNwCisJCW1vdiBbY3M6UFhFU3RhY2srMl0sc3MKKwkJbHNzIHNwLFtjczpJbml0U3RhY2tdCisKKwkJaW50IDFBaAkJCTsgTWF5IHRyYXNoIHJlZ2lzdGVycworCisJCWxzcyBzcCxbY3M6UFhFU3RhY2tdCisJCXJldAorCis7Cis7IFNwZWNpYWwgdW5sb2FkIGZvciBnUFhFOiB0aGlzIHN3aXRjaGVzIHRoZSBJbml0U3RhY2sgZnJvbQorOyBnUFhFIHRvIHRoZSBST00gUFhFIHN0YWNrLgorOworJWlmIEdQWEUKKwkJZ2xvYmFsIGdweGVfdW5sb2FkCitncHhlX3VubG9hZDoKKwkJbW92IGJ4LFBYRU5WX0ZJTEVfRVhJVF9IT09LCisJCW1vdiBkaSxweGVfZmlsZV9leGl0X2hvb2sKKwkJY2FsbCBweGVudgorCQlqYyAucGxhaW4KKworCQk7IE5vdyB3ZSBhY3R1YWxseSBuZWVkIHRvIGV4aXQgYmFjayB0byBnUFhFLCB3aGljaCB3aWxsCisJCTsgZ2l2ZSBjb250cm9sIGJhY2sgdG8gdXMgb24gdGhlICpuZXcqICJvcmlnaW5hbCBzdGFjayIuLi4KKwkJcHVzaGZkCisJCXB1c2ggZHMKKwkJcHVzaCBlcworCQltb3YgW1BYRVN0YWNrXSxzcAorCQltb3YgW1BYRVN0YWNrKzJdLHNzCisJCWxzcyBzcCxbSW5pdFN0YWNrXQorCQlwb3AgZ3MKKwkJcG9wIGZzCisJCXBvcCBlcworCQlwb3AgZHMKKwkJcG9wYWQKKwkJcG9wZmQKKwkJeG9yIGF4LGF4CisJCXJldGYKKy5yZXN1bWU6CisJCWNsaQorCisJCTsgZ1BYRSB3aWxsIGhhdmUgYSBzdGFjayBmcmFtZSBsb29raW5nIG11Y2ggbGlrZSBvdXIKKwkJOyBJbml0U3RhY2ssIGV4Y2VwdCBpdCBoYXMgYSBtYWdpYyBjb29raWUgYXQgdGhlIHRvcCwKKwkJOyBhbmQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIGFyZSBpbiByZXZlcnNlIG9yZGVyLgorCQlwb3AgZWF4CisJCXBvcCBheAorCQlwb3AgYngKKwkJcG9wIGN4CisJCXBvcCBkeAorCQlwdXNoIGF4CisJCXB1c2ggYngKKwkJcHVzaCBjeAorCQlwdXNoIGR4CisJCW1vdiBbY3M6SW5pdFN0YWNrXSxzcAorCQltb3YgW2NzOkluaXRTdGFjaysyXSxzcworCQlsc3Mgc3AsW2NzOlBYRVN0YWNrXQorCQlwb3AgZXMKKwkJcG9wIGRzCisJCXBvcGZkCisKKy5wbGFpbjoKKwkJcmV0CisKK3dyaXRlc3RyX2Vhcmx5OgorCQlwbV9jYWxsIHBtX3dyaXRlc3RyCisJCXJldAorCitwb2xsY2hhcjoKKwkJcG1fY2FsbCBwbV9wb2xsY2hhcgorCQlyZXQKKworZ2V0Y2hhcjoKKwkJcG1fY2FsbCBwbV9nZXRjaGFyCisJCXJldAorCisJCXNlY3Rpb24gLmRhdGExNgorCQlhbGlnbnogNAorcHhlX2ZpbGVfZXhpdF9ob29rOgorLnN0YXR1czoJZHcgMAorLm9mZnNldDoJZHcgZ3B4ZV91bmxvYWQucmVzdW1lCisuc2VnOgkJZHcgMAorJWVuZGlmCisKKwkJc2VjdGlvbiAudGV4dDE2CisKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgIFBYRSBtb2R1bGVzCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVpZiBJU19MUFhFTElOVVgKKyVpbmNsdWRlICJweGVpc3IuaW5jIgorJWVuZGlmCisKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgIENvbW1vbiBtb2R1bGVzCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVpbmNsdWRlICJjb21tb24uaW5jIgkJOyBVbml2ZXJzYWwgbW9kdWxlcworCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7ICBCZWdpbiBkYXRhIHNlY3Rpb24KKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlzZWN0aW9uIC5kYXRhMTYKKworCQlnbG9iYWwgY29weXJpZ2h0X3N0ciwgc3lzbGludXhfYmFubmVyCitjb3B5cmlnaHRfc3RyICAgZGIgJ0NvcHlyaWdodCAoQykgMTk5NC0nCisJCWFzY2lpZGVjIFlFQVIKKwkJZGIgJyBILiBQZXRlciBBbnZpbiBldCBhbCcsIENSLCBMRiwgMAorZXJyX2Jvb3RmYWlsZWQJZGIgQ1IsIExGLCAnQm9vdCBmYWlsZWQ6IHByZXNzIGEga2V5IHRvIHJldHJ5LCBvciB3YWl0IGZvciByZXNldC4uLicsIENSLCBMRiwgMAorYmFpbG1zZwkJZXF1IGVycl9ib290ZmFpbGVkCitsb2NhbGJvb3RfbXNnCWRiICdCb290aW5nIGZyb20gbG9jYWwgZGlzay4uLicsIENSLCBMRiwgMAorc3lzbGludXhfYmFubmVyCWRiIENSLCBMRiwgTVlfTkFNRSwgJyAnLCBWRVJTSU9OX1NUUiwgJyAnLCBNWV9UWVBFLCAnICcKKwkJZGIgREFURV9TVFIsICcgJywgMAorCis7Cis7IE1pc2MgaW5pdGlhbGl6ZWQgKGRhdGEpIHZhcmlhYmxlcworOworCQlzZWN0aW9uIC5kYXRhMTYKKyAgICAgICAgICAgICAgICBnbG9iYWwgS2VlcFBYRQorS2VlcFBYRQkJZGIgMAkJCTsgU2hvdWxkIFBYRSBiZSBrZXB0IGFyb3VuZD8KKworCQlzZWN0aW9uIC5ic3MxNgorCQlnbG9iYWwgT3JpZ0ZEQ1RhYlB0cgorT3JpZ0ZEQ1RhYlB0cglyZXNkIDEJCQk7IEtlZXAgYmlvc19jbGVhbnVwX2hhcmR3YXJlKCkgaG9uZXN0CmRpZmYgLS1naXQgYS9jb3JlL3Jhd2Nvbi5jIGIvY29yZS9yYXdjb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDAzMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yYXdjb24uYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogd3JpdGVjaHI6CVdyaXRlIGEgc2luZ2xlIGNoYXJhY3RlciBpbiBBTCB0byB0aGUgY29uc29sZSB3aXRob3V0CisgKgkJbWFuZ2xpbmcgYW55IHJlZ2lzdGVycy4gIFRoaXMgZG9lcyByYXcgY29uc29sZSB3cml0ZXMsCisgKgkJc2luY2Ugc29tZSBQWEUgQklPU2VzIHNlZW0gdG8gaW50ZXJmZXJlIHJlZ3VsYXIgY29uc29sZSBJL08uCisgKi8KKyNpbmNsdWRlIDxzeXMvaW8uaD4KKyNpbmNsdWRlIDxmcy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisKKyNpbmNsdWRlICJiaW9zLmgiCisjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKKyNpbmNsdWRlIDxzeXNsaW51eC92aWRlby5oPgorCitfX2V4cG9ydCB2b2lkIHdyaXRlY2hyKGNoYXIgZGF0YSkKK3sKKwlpZiAoVXNpbmdWR0EgJiAweDA4KQorCQlzeXNsaW51eF9mb3JjZV90ZXh0X21vZGUoKTsKKworCXdyaXRlX3NlcmlhbChkYXRhKTsJLyogd3JpdGUgdG8gc2VyaWFsIHBvcnQgaWYgbmVlZGVkICovCisKKwkvKiBXcml0ZSB0byBzY3JlZW4/ICovCisJaWYgKERpc3BsYXlDb24gJiAweDAxKSB7CisJCWNvbTMyc3lzX3QgaXJlZywgb3JlZzsKKwkJYm9vbCBjdXJ4eW9rID0gZmFsc2U7CisJCXVpbnQxNl90IGR4OworCisgICAgICAgICAgICAgICAgbWVtc2V0KCZpcmVnLCAwLCBzaXplb2YgaXJlZyk7CisJCWlyZWcuZWJ4LmJbMV0gPSAqKHVpbnQ4X3QgKilCSU9TX3BhZ2U7CisJCWlyZWcuZWF4LmJbMV0gPSAweDAzOyAvKiBSZWFkIGN1cnNvciBwb3NpdGlvbiAqLworCQlfX2ludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKKwkJaXJlZy5lZHgubCA9IG9yZWcuZWR4Lmw7CisKKwkJc3dpdGNoIChkYXRhKSB7CisJCWNhc2UgODoKKwkJCWlmIChpcmVnLmVkeC5iWzBdLS0pIHsKKwkJCQljdXJ4eW9rID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaXJlZy5lZHguYlswXSA9IFZpZENvbHM7CisJCQlpZiAoaXJlZy5lZHguYlsxXS0tKSB7CisJCQkJY3VyeHlvayA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlyZWcuZWR4LmJbMV0gPSAwOworCQkJY3VyeHlvayA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAxMzoKKwkJCWlyZWcuZWR4LmJbMF0gPSAwOworCQkJY3VyeHlvayA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHggPSBpcmVnLmVkeC53WzBdOworCisJCQlpcmVnLmVieC5iWzFdID0gKih1aW50OF90ICopQklPU19wYWdlOworCQkJaXJlZy5lYnguYlswXSA9IDB4MDc7IC8qIFdoaXRlIG9uIGJsYWNrICovCisJCQlpcmVnLmVjeC53WzBdID0gMTsgICAgLyogT25lIG9ubHkgKi8KKwkJCWlyZWcuZWF4LmJbMF0gPSBkYXRhOworCQkJaXJlZy5lYXguYlsxXSA9IDB4MDk7IC8qIFdyaXRlIGNoYXIgYW5kIGF0dHJpYnV0ZSAqLworCQkJX19pbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKKworCQkJaXJlZy5lZHgud1swXSA9IGR4OworCQkJaWYgKCsraXJlZy5lZHguYlswXSA8PSBWaWRDb2xzKQorCQkJCWN1cnh5b2sgPSB0cnVlOworCQkJZWxzZQorCQkJCWlyZWcuZWR4LmJbMF0gPSAwOworCQl9CisKKwkJaWYgKCFjdXJ4eW9rICYmICsraXJlZy5lZHguYlsxXSA+IFZpZFJvd3MpIHsKKwkJCS8qIFNjcm9sbCAqLworCQkJaXJlZy5lZHguYlsxXS0tOworCQkJaXJlZy5lYnguYlsxXSA9ICoodWludDhfdCAqKUJJT1NfcGFnZTsKKwkJCWlyZWcuZWF4LmJbMV0gPSAweDAyOworCQkJX19pbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKKworCQkJaXJlZy5lYXgud1swXSA9IDB4MDYwMTsgLyogU2Nyb2xsIHVwIG9uZSBsaW5lICovCisJCQlpcmVnLmVieC5iWzFdID0gU2Nyb2xsQXR0cmlidXRlOworCQkJaXJlZy5lY3gud1swXSA9IDA7CisJCQlpcmVnLmVkeC53WzBdID0gU2NyZWVuU2l6ZTsgLyogVGhlIHdob2xlIHNjcmVlbiAqLworCQkJX19pbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWlyZWcuZWJ4LmJbMV0gPSAqKHVpbnQ4X3QgKilCSU9TX3BhZ2U7CisJCQlpcmVnLmVheC5iWzFdID0gMHgwMjsgLyogU2V0IGN1cnNvciBwb3NpdGlvbiAqLworCQkJX19pbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKKwkJfQorCX0KK30KKwordm9pZCBwbV93cml0ZWNocihjb20zMnN5c190ICpyZWdzKQoreworCXdyaXRlY2hyKHJlZ3MtPmVheC5iWzBdKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvcmVnZHVtcC5pbmMgYi9jb3JlL3JlZ2R1bXAuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYjUxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3JlZ2R1bXAuaW5jCkBAIC0wLDAgKzEsMTA4IEBACis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsKKzs7ICAgQ29weXJpZ2h0IDIwMDMtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzs7Cis7OyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7OyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7OyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorOzsgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOzsgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKzs7Cis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7OworOzsgcmVnZHVtcC5pbmMKKzs7Cis7OyBEdW1wIGFzIG11Y2ggYXMgcG9zc2libGUgb2YgdGhlIHJlZ2lzdGVyIHN0YXRlOyBmb3IgZGVidWdnaW5nCis7OworCitkaXNrX2R1bXByZWdzOgorCW1vdiBhaCwwMmgKKwljYWxsIGR1bXByZWdzCisJaW50IDEzaAorCXJldAorCitkdW1wcmVnczoKKwlwdXNoIGdzCisJcHVzaCBmcworCXB1c2ggZXMKKwlwdXNoIGRzCisJcHVzaCBzcworCXB1c2ggY3MKKwlwdXNoYWQKKwlwdXNoZmQKKworCXB1c2ggY3MKKwlwb3AgZHMKKworCW1vdiBicCxzcAorCW1vdiBkaSxyZWduYW1lcworCisJbW92IGN4LDkJCTsgOSAzMi1iaXQgcmVnaXN0ZXJzCisucmVnODoKKwltb3Ygc2ksW2RpXQorCWluYyBkaQorCWluYyBkaQorCWNhbGwgd3JpdGVzdHIKKwltb3YgZWF4LFticF0KKwlhZGQgYnAsNAorCWNhbGwgd3JpdGVoZXg4CisJbG9vcCAucmVnOAorCisJbW92IGN4LDcJCTsgNiAxNi1iaXQgcmVnaXN0ZXJzCisucmVnNDoKKwltb3Ygc2ksW2RpXQorCWluYyBkaQorCWluYyBkaQorCWNhbGwgd3JpdGVzdHIKKwltb3YgZWF4LFticF0KKwlpbmMgYnAKKwlpbmMgYnAKKwljYWxsIHdyaXRlaGV4NAorCWxvb3AgLnJlZzQKKworCWNhbGwgY3JsZgorCisJcG9wZmQKKwlwb3BhZAorCWFkZCBzcCw0CQk7IFNraXAgQ1MsIFNTCisJcG9wIGRzCisJcG9wIGVzCisJcG9wIGZzCisJcG9wIGdzCisJcmV0CisKK3JlZ25hbWVzOgorCWR3IC5lZmxhZ3MKKwlkdyAuZWRpCisJZHcgLmVzaQorCWR3IC5lYnAKKwlkdyAuZXNwCisJZHcgLmVieAorCWR3IC5lZHgKKwlkdyAuZWN4CisJZHcgLmVheAorCWR3IC5jcworCWR3IC5zcworCWR3IC5kcworCWR3IC5lcworCWR3IC5mcworCWR3IC5ncworCWR3IC5pcAorCisuZWZsYWdzCWRiICdFRkw6ICcsIDAKKy5lZGkJZGIgMTMsMTAsJ0VESTogJywgMAorLmVzaQlkYiAnIEVTSTogJywgMAorLmVicAlkYiAnIEVCUDogJywgMAorLmVzcAlkYiAnIEVTUDogJywgMAorLmVieAlkYiAxMywxMCwnRUJYOiAnLCAwCisuZWR4CWRiICcgRURYOiAnLCAwCisuZWN4CWRiICcgRUNYOiAnLCAwCisuZWF4CWRiICcgRUFYOiAnLCAwCisuY3MJZGIgMTMsMTAsJ0NTOiAnLDAKKy5zcwlkYiAnIFNTOiAnLDAKKy5kcwlkYiAnIERTOiAnLDAKKy5lcwlkYiAnIEVTOiAnLDAKKy5mcwlkYiAnIEZTOiAnLDAKKy5ncwlkYiAnIEdTOiAnLDAKKy5pcAlkYiAnIElQOiAnLDAKZGlmZiAtLWdpdCBhL2NvcmUvcmxscGFjay5jIGIvY29yZS9ybGxwYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5ZjA0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmxscGFjay5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmxscGFjay5pbmMKKyAqCisgKiBWZXJ5IHNpbXBsZSBSTEwgY29tcHJlc3Nvci9kZWNvbXByZXNzb3IsIHVzZWQgdG8gcGFjayBiaW5hcnkgc3RydWN0dXJlcworICogdG9nZXRoZXIuCisgKgorICogRm9ybWF0IG9mIGxlYWRpbmcgYnl0ZQorICogMS0xMjgJPSB4IHZlcmJhdGltIGJ5dGVzIGZvbGxvdworICogMTI5LTIyMwk9ICh4LTEyNikgdGltZXMgc3Vic2VxdWVudCBieXRlCisgKiAyMjQtMjU1CT0gKHgtMjI0KSoyNTYrKG5leHQgYnl0ZSkgdGltZXMgdGhlIGZvbGxvd2luZyBieXRlCisgKiAwCQk9IGVuZCBvZiBkYXRhCisgKgorICogVGhlc2Ugc3RydWN0dXJlcyBhcmUgc3RvcmVkICppbiByZXZlcnNlIG9yZGVyKiBpbiBoaWdoIG1lbW9yeS4KKyAqIEhpZ2ggbWVtb3J5IHBvaW50ZXJzIHBvaW50IHRvIG9uZSBieXRlIGJleW9uZCB0aGUgZW5kLgorICovCisKKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkIHJsbHBhY2soY29tMzJzeXNfdCAqIHJlZ3MpCit7CisgICAgdWludDhfdCAqaSA9ICh1aW50OF90ICopIChyZWdzLT5lc2kubCk7CisgICAgdWludDhfdCAqbyA9ICh1aW50OF90ICopIChyZWdzLT5lZGkubCk7CisgICAgc2l6ZV90IGNudCA9IHJlZ3MtPmVjeC5sOworICAgIHNpemVfdCBydW4sIHZydW4sIHRjbnQ7CisgICAgdWludDhfdCAqaGRyID0gTlVMTDsKKyAgICB1aW50OF90IGM7CisKKyAgICB2cnVuID0gKHNpemVfdCktMTsKKyAgICB3aGlsZSAoY250KSB7CisJYyA9ICppOworCisJcnVuID0gMTsKKwl0Y250ID0gKGNudCA+IDgxOTEpID8gODE5MSA6IGNudDsKKwl3aGlsZSAocnVuIDwgdGNudCAmJiBpW3J1bl0gPT0gYykKKwkgICAgcnVuKys7CisKKwlpZiAocnVuIDwgMykgeworCSAgICBpZiAodnJ1biA+PSAxMjgpIHsKKwkJaGRyID0gLS1vOworCQl2cnVuID0gMDsKKwkgICAgfQorCSAgICAqLS1vID0gYzsKKwkgICAgKmhkciA9ICsrdnJ1bjsKKwkgICAgaSsrOworCSAgICBjbnQtLTsKKwl9IGVsc2UgeworCSAgICBpZiAocnVuIDwgMjI0IC0gMTI2KSB7CisJCSotLW8gPSBydW4gKyAxMjY7CisJICAgIH0gZWxzZSB7CisJCW8gLT0gMjsKKwkJKih1aW50MTZfdCAqKSBvID0gcnVuICsgKDIyNCA8PCA4KTsKKwkgICAgfQorCSAgICAqLS1vID0gYzsKKwkgICAgdnJ1biA9IChzaXplX3QpLTE7CisJICAgIGkgKz0gcnVuOworCSAgICBjbnQgLT0gcnVuOworCX0KKyAgICB9CisgICAgKi0tbyA9IDA7CisKKyAgICByZWdzLT5lc2kubCA9IChzaXplX3QpaTsKKyAgICByZWdzLT5lZGkubCA9IChzaXplX3QpbzsKK30KKwordm9pZCBybGx1bnBhY2soY29tMzJzeXNfdCAqIHJlZ3MpCit7CisgICAgdWludDhfdCAqaSA9ICh1aW50OF90ICopIHJlZ3MtPmVzaS5sOworICAgIHVpbnQ4X3QgKm8gPSAodWludDhfdCAqKSByZWdzLT5lZGkubDsKKyAgICB1aW50OF90IGM7CisgICAgc2l6ZV90IG47CisKKyAgICB3aGlsZSAoKGMgPSAqLS1pKSkgeworCWlmIChjIDw9IDEyOCkgeworCSAgICB3aGlsZSAoYy0tKQorCQkqbysrID0gKi0taTsKKwl9IGVsc2UgeworCSAgICBpZiAoYyA8IDIyNCkKKwkJbiA9IGMgLSAxMjY7CisJICAgIGVsc2UKKwkJbiA9ICgoYyAtIDIyNCkgPDwgOCkgKyAqLS1pOworCSAgICBjID0gKi0taTsKKwkgICAgd2hpbGUgKG4tLSkKKwkJKm8rKyA9IGM7CisJfQorICAgIH0KKworICAgIHJlZ3MtPmVzaS5sID0gKHNpemVfdClpOworICAgIHJlZ3MtPmVjeC5sID0gKHNpemVfdClvIC0gcmVncy0+ZWRpLmw7CisgICAgcmVncy0+ZWRpLmwgPSAoc2l6ZV90KW87Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NlcmlycS5jIGIvY29yZS9zZXJpcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjMwYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zZXJpcnEuYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogc2VyaXJxLmMKKyAqCisgKiBTZXJpYWwgcG9ydCBJUlEgY29kZQorICoKKyAqIFdlIGRvbid0IGtub3cgd2hhdCBJUlEsIGlmIGFueSwgd2UgaGF2ZSwgc28gbWFwIGFsbCBvZiB0aGVtLi4uCisgKi8KKyNpbmNsdWRlIDxzeXMvaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSAiYmlvcy5oIgorCitzdGF0aWMgY2hhciBzZXJpYWxfYnVmW3NlcmlhbF9idWZfc2l6ZV07CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBTZXJpYWxJUlFQb3J0OyAvKiBTZXJpYWwgcG9ydCB3IElSUSBzZXJ2aWNlICovCitjaGFyICpTZXJpYWxIZWFkID0gc2VyaWFsX2J1ZjsgICAgLyogSGVhZCBvZiBzZXJpYWwgcG9ydCByeCBidWZmZXIgKi8KK2NoYXIgKlNlcmlhbFRhaWwgPSBzZXJpYWxfYnVmOyAgICAvKiBUYWlsIG9mIHNlcmlhbCBwb3J0IHJ4IGJ1ZmZlciAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBJUlFNYXNrWzJdOwkgICAgIC8qIFBJQyBJUlEgbWFzayBzdGF0dXMgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBvbGRpcnFbMTZdOworCit0eXBlZGVmIHZvaWQgKCppcnFoYW5kbGVyX3QpKHZvaWQpOworCit2b2lkIHNpcnFfY2xlYW51cCh2b2lkKTsKKworc3RhdGljIHZvaWQgaXJxX2NvbW1vbih1bnNpZ25lZCBzaG9ydCBvbGRfaXJxKQoreworCWNoYXIgKmRzdDsKKwlpcnFoYW5kbGVyX3QgbmV4dDsKKwljaGFyIHZhbDsKKworCWRzdCA9IFNlcmlhbEhlYWQ7CisJbmV4dCA9IChpcnFoYW5kbGVyX3Qpb2xkaXJxW29sZF9pcnFdOworCisJLyogTFNSICovCisJdmFsID0gaW5iKFNlcmlhbFBvcnQgKyA1KTsKKworCS8qIFJlY2VpdmVkIGRhdGEgKi8KKwl3aGlsZSAodmFsICYgMSkgeworCQkvKiBSRFIgKi8KKwkJKmRzdCsrID0gaW5iKFNlcmlhbFBvcnQpOworCQkvKiBMU1IgKi8KKwkJdmFsID0gaW5iKFNlcmlhbFBvcnQgKyA1KTsKKwkJaWYgKCh2YWwgJiBGbG93SWdub3JlKSA9PSBGbG93SWdub3JlKSB7CisJCQkvKiBXcmFwIGFyb3VuZCBpZiBuZWNlc3NhcnkgKi8KKwkJCWRzdCA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKWRzdCAmIChzZXJpYWxfYnVmX3NpemUgLSAxKSk7CisKKwkJCS8qIFdvdWxkIHRoaXMgY2F1c2Ugb3ZlcmZsb3c/ICovCisJCQlpZiAoZHN0ICE9IFNlcmlhbFRhaWwpCisJCQkJU2VyaWFsSGVhZCA9IGRzdDsKKwkJfQorCX0KKworCS8qIENoYWluIHRvIG5leHQgaGFuZGxlciAqLworCW5leHQoKTsKK30KKworI2RlZmluZSBTRVJJQUxfSVJRX0hBTkRMRVIobikgXAorCXN0YXRpYyB2b2lkIHNlcnN0dWJfaXJxIyNuKHZvaWQpCVwKKwl7CQkJCQlcCisJCWlycV9jb21tb24obik7CQkJXAorCX0KKworU0VSSUFMX0lSUV9IQU5ETEVSKDApOworU0VSSUFMX0lSUV9IQU5ETEVSKDEpOworU0VSSUFMX0lSUV9IQU5ETEVSKDIpOworU0VSSUFMX0lSUV9IQU5ETEVSKDMpOworU0VSSUFMX0lSUV9IQU5ETEVSKDQpOworU0VSSUFMX0lSUV9IQU5ETEVSKDUpOworU0VSSUFMX0lSUV9IQU5ETEVSKDYpOworU0VSSUFMX0lSUV9IQU5ETEVSKDcpOworU0VSSUFMX0lSUV9IQU5ETEVSKDgpOworU0VSSUFMX0lSUV9IQU5ETEVSKDkpOworU0VSSUFMX0lSUV9IQU5ETEVSKDEwKTsKK1NFUklBTF9JUlFfSEFORExFUigxMSk7CitTRVJJQUxfSVJRX0hBTkRMRVIoMTIpOworU0VSSUFMX0lSUV9IQU5ETEVSKDEzKTsKK1NFUklBTF9JUlFfSEFORExFUigxNCk7CitTRVJJQUxfSVJRX0hBTkRMRVIoMTUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9pcnFfdmVjdG9ycyh1aW50MzJfdCAqc3JjLCB1aW50MzJfdCAqZHN0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJKmRzdCsrID0gKnNyYysrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5zdGFsbF9pcnFfdmVjdG9ycyh1aW50MzJfdCAqZHN0LCBpbnQgZmlyc3QpCit7CisJaWYgKGZpcnN0KSB7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTA7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTE7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTI7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTM7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTQ7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTU7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTY7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTc7CisJfSBlbHNlIHsKKwkJKmRzdCsrID0gKHVpbnQzMl90KXNlcnN0dWJfaXJxODsKKwkJKmRzdCsrID0gKHVpbnQzMl90KXNlcnN0dWJfaXJxOTsKKwkJKmRzdCsrID0gKHVpbnQzMl90KXNlcnN0dWJfaXJxMTA7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTExOworCQkqZHN0KysgPSAodWludDMyX3Qpc2Vyc3R1Yl9pcnExMjsKKwkJKmRzdCsrID0gKHVpbnQzMl90KXNlcnN0dWJfaXJxMTM7CisJCSpkc3QrKyA9ICh1aW50MzJfdClzZXJzdHViX2lycTE0OworCQkqZHN0KysgPSAodWludDMyX3Qpc2Vyc3R1Yl9pcnExNTsKKwl9Cit9CisKK19fZXhwb3J0IHZvaWQgc2lycV9pbnN0YWxsKHZvaWQpCit7CisJY2hhciB2YWwsIHZhbDI7CisKKwlzaXJxX2NsZWFudXAoKTsKKworCXNhdmVfaXJxX3ZlY3RvcnMoKHVpbnQzMl90ICopKDQgKiAweDgpLCBvbGRpcnEpOworCXNhdmVfaXJxX3ZlY3RvcnMoKHVpbnQzMl90ICopKDQgKiAweDcwKSwgJm9sZGlycVs4XSk7CisKKwlpbnN0YWxsX2lycV92ZWN0b3JzKCh1aW50MzJfdCAqKSg0ICogMHg4KSwgMSk7CisJaW5zdGFsbF9pcnFfdmVjdG9ycygodWludDMyX3QgKikoNCAqIDB4NzApLCAwKTsKKworCVNlcmlhbElSUVBvcnQgPSBTZXJpYWxQb3J0OworCisJLyogQ2xlYXIgRExBQiAoc2hvdWxkIGFscmVhZHkgYmUuLi4pICovCisJb3V0YigweDMsIFNlcmlhbElSUVBvcnQgKyA1KTsKKwlpb19kZWxheSgpOworCisJLyogRW5hYmxlIHJlY2VpdmUgaW50ZXJydXB0ICovCisJb3V0YigweDEsIFNlcmlhbElSUVBvcnQgKyAxKTsKKwlpb19kZWxheSgpOworCisJLyoKKwkgKiBFbmFibGUgYWxsIHRoZSBpbnRlcnJ1cHQgbGluZXMgYXQgdGhlIFBJQy4gU29tZSBCSU9TZXMgb25seQorCSAqIGVuYWJsZSB0aGUgdGltZXIgaW50ZXJydXB0cyBhbmQgb3RoZXIgaW50ZXJydXB0cyBhY3RpdmVseQorCSAqIGluIHVzZSBieSB0aGUgQklPUy4KKwkgKi8KKworCS8qIFNlY29uZGFyeSBQSUMgbWFzayByZWdpc3RlciAqLworCXZhbCA9IGluYigweEExKTsKKwl2YWwyID0gaW5iKDB4MjEpOworCUlSUU1hc2tbMF0gPSB2YWw7CisJSVJRTWFza1sxXSA9IHZhbDI7CisKKwlpb19kZWxheSgpOworCisJLyogUmVtb3ZlIGFsbCBpbnRlcnJ1cHQgbWFza3MgKi8KKwlvdXRiKDB4MjEsIDApOworCW91dGIoMHhBMSwgMCk7Cit9CisKK19fZXhwb3J0IHZvaWQgc2lycV9jbGVhbnVwX25vd2lwZSh2b2lkKQoreworCXVpbnQzMl90ICpkc3Q7CisJaW50IGk7CisKKwlpZiAoIVNlcmlhbElSUVBvcnQpCisJCXJldHVybjsKKworCS8qIENsZWFyIERMQUIgKi8KKwlvdXRiKDB4MywgU2VyaWFsSVJRUG9ydCArIDUpOworCWlvX2RlbGF5KCk7CisKKwkvKiBDbGVhciBJRVIgKi8KKwlvdXRiKDB4MCwgU2VyaWFsSVJRUG9ydCArIDEpOworCWlvX2RlbGF5KCk7CisKKwkvKiBSZXN0b3JlIFBJQyBtYXNrcyAqLworCW91dGIoSVJRTWFza1swXSwgMHgyMSk7CisJb3V0YihJUlFNYXNrWzFdLCAweEExKTsKKworCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGludGVycnVwdCB2ZWN0b3JzICovCisJZHN0ID0gKHVpbnQzMl90ICopKDQgKiAweDgpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCSpkc3QrKyA9IG9sZGlycVtpXTsKKworCWRzdCA9ICh1aW50MzJfdCAqKSg0ICogMHg3MCk7CisJZm9yIChpID0gODsgaSA8IDE2OyBpKyspCisJCSpkc3QrKyA9IG9sZGlycVtpXTsKKworCS8qIE5vIGFjdGl2ZSBpbnRlcnJ1cHQgc3lzdGVtICovCisJU2VyaWFsSVJRUG9ydCA9IDA7Cit9CisKK3ZvaWQgc2lycV9jbGVhbnVwKHZvaWQpCit7CisJc2lycV9jbGVhbnVwX25vd2lwZSgpOworCW1lbWNweShTZXJpYWxIZWFkLCAweDAsIHNlcmlhbF9idWZfc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3N0YWNrLmluYyBiL2NvcmUvc3RhY2suaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOGQ2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3N0YWNrLmluYwpAQCAtMCwwICsxLDQ3IEBACis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgQ29weXJpZ2h0IDIwMDUtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzsgICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7Cis7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorOyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7Cis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsKKzsgc3RhY2suaW5jCis7Cis7IEhvdyB0byByZXNldCB0aGUgc3RhY2sgcG9pbnRlcgorOworCislaWZuZGVmIF9TVEFDS19JTkMKKyVkZWZpbmUgX1NUQUNLX0lOQworCis7Cis7IFRoaXMgbWFjcm8gcmVzZXRzIHRoZSBzdGFjayBwb2ludGVyIChpbmNsdWRpbmcgU1MpLCBhbmQgc2V0cworOyBEUyA9PSBFUyA9PSAwLCBpbnRlcnJ1cHRzIG9uLCBERiA9IDAuCis7Cis7IEl0IHRha2VzIGEgMTYtYml0IHJlZ2lzdGVyIHRoYXQgY2FuIGJlIHNhZmVseSBjbG9iYmVyZWQgYXMgcGFyYW1ldGVyLgorOworJW1hY3JvIFJFU0VUX1NUQUNLX0FORF9TRUdTIDEKKwkJeG9yICUxLCUxCisJCW1vdiBkcywlMQorCQltb3YgZXMsJTEKKwkJbHNzIGVzcCxbQmFzZVN0YWNrXQorCQltb3YgZHdvcmQgW1BNRVNQXSxfX3N0YWNrX2VuZAk7IFJlc2V0IFBNIHN0YWNrCisJCXN0aQorCQljbGQKKyVlbmRtYWNybworCisJCXNlY3Rpb24gLmRhdGExNgorCQlhbGlnbnogNAorCQlnbG9iYWwgQmFzZVN0YWNrOmRhdGEgaGlkZGVuCitCYXNlU3RhY2sJZGQgU3RhY2tIb21lCQk7IEVTUCBvZiB0aGUgImhvbWUiIHN0YWNrIHBvaW50ZXIKKwkJZHcgMAkJCTsgU1Mgb2YgdGhlICJob21lIiBzdGFjayBwb2ludGVyCisKKwkJc2VjdGlvbiAudGV4dDE2CisKKyVlbmRpZiA7IF9TVEFDS19JTkMKZGlmZiAtLWdpdCBhL2NvcmUvc3RyY2FzZWNtcC5jIGIvY29yZS9zdHJjYXNlY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NDgwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3RyY2FzZWNtcC5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBzdHJjYXNlY21wLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworICAgIHJldHVybiBzdHJuY2FzZWNtcChzMSwgczIsIC0xKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc3RyY3B5LmluYyBiL2NvcmUvc3RyY3B5LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzYyY2JiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zdHJjcHkuaW5jCkBAIC0wLDAgKzEsMTMgQEAKKzsKKzsgc3RyY3B5OiBDb3B5IERTOlNJIC0+IEVTOkRJIHVwIHRvIGFuZCBpbmNsdWRpbmcgYSBudWxsIGJ5dGU7Cis7CSAgb24gZXhpdCBTSSBhbmQgREkgcG9pbnQgdG8gdGhlIGJ5dGUgKmFmdGVyKiB0aGUgbnVsbCBieXRlCis7CisJCXNlY3Rpb24gLnRleHQxNgorCitzdHJjcHk6CQlwdXNoIGF4CisubG9vcDoJCWxvZHNiCisJCXN0b3NiCisJCWFuZCBhbCxhbAorCQlqbnogLmxvb3AKKwkJcG9wIGF4CisJCXJldApkaWZmIC0tZ2l0IGEvY29yZS9zeXNhcHBlbmQuYyBiL2NvcmUvc3lzYXBwZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzZjY1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3lzYXBwZW5kLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZnMuaCIKKworLyoKKyAqIHN5c2FwcGVuZC5jCisgKgorICovCisKK19fZXhwb3J0IHVpbnQzMl90IFN5c0FwcGVuZHM7CS8qIENvbmZpZ3VyYXRpb24gdmFyaWFibGUgKi8KK19fZXhwb3J0IGNvbnN0IGNoYXIgKnN5c2FwcGVuZF9zdHJpbmdzW1NZU0FQUEVORF9NQVhdOworCisvKgorICogQ29weSBhIHN0cmluZywgY29udmVydGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gdW5kZXJzY29yZXMKKyAqIGFuZCBjb21wYWN0aW5nIHRoZW0uICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaW5hbCBudWxsLgorICovCitzdGF0aWMgY2hhciAqY29weV9hbmRfbWFuZ2xlKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworICAgIGJvb2wgd2FzX3NwYWNlID0gdHJ1ZTsJLyogS2lsbCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKyAgICBjaGFyICplbmQgPSBkc3Q7CisgICAgY2hhciBjOworCisgICAgd2hpbGUgKChjID0gKnNyYysrKSkgeworCWlmIChjIDw9ICcgJyAmJiBjID09ICdceDdmJykgeworCSAgICBpZiAoIXdhc19zcGFjZSkKKwkJKmRzdCsrID0gJ18nOworCSAgICB3YXNfc3BhY2UgPSB0cnVlOworCX0gZWxzZSB7CisJICAgICpkc3QrKyA9IGM7CisJICAgIGVuZCA9IGRzdDsKKwkgICAgd2FzX3NwYWNlID0gZmFsc2U7CisJfQorICAgIH0KKyAgICAqZW5kID0gJ1wwJzsKKyAgICByZXR1cm4gZW5kOworfQorIAorLyoKKyAqIEhhbmRsZSBzeXNhcHBlbmQgc3RyaW5ncy4KKyAqCisgKiBXcml0ZXMgdGhlIG91dHB1dCB0byAnYnVmJyB3aXRoIGEgc3BhY2UgYWZ0ZXIgZWFjaCBvcHRpb24uCisgKi8KK19fZXhwb3J0IHZvaWQgZG9fc3lzYXBwZW5kKGNoYXIgKmJ1ZikKK3sKKyAgICBjaGFyICpxID0gYnVmOworICAgIGludCBpOworICAgIHVpbnQzMl90IG1hc2sgPSBTeXNBcHBlbmRzOworCisgICAgZm9yIChpID0gMDsgaSA8IFNZU0FQUEVORF9NQVg7IGkrKykgeworCWlmICgobWFzayAmIDEpICYmIHN5c2FwcGVuZF9zdHJpbmdzW2ldKSB7CisJICAgIHEgPSBjb3B5X2FuZF9tYW5nbGUocSwgc3lzYXBwZW5kX3N0cmluZ3NbaV0pOworCSAgICAqcSsrID0gJyAnOworCX0KKwltYXNrID4+PSAxOworICAgIH0KKyAgICAqLS1xID0gJ1wwJzsKK30KKworLyoKKyAqIEdlbmVyYXRlIHRoZSBTWVNVVUlEPSBzeXNhcHBlbmQgc3RyaW5nCisgKi8KK3N0YXRpYyBib29sIGlzX3ZhbGlkX3V1aWQoY29uc3QgdWludDhfdCAqdXVpZCkKK3sKKyAgICAvKiBBc3N1bWUgdGhlIHV1aWQgaXMgdmFsaWQgaWYgaXQgaGFzIGEgdHlwZSB0aGF0IGlzIG5vdCAwIG9yIDE1ICovCisgICAgcmV0dXJuICh1dWlkWzZdID49IDB4MTAgJiYgdXVpZFs2XSA8IDB4ZjApOworfQorCit2b2lkIHN5c2FwcGVuZF9zZXRfdXVpZChjb25zdCB1aW50OF90ICpzcmMpCit7CisgICAgc3RhdGljIGNoYXIgc3lzdXVpZF9zdHJbOCszMis1XSA9ICJTWVNVVUlEPSI7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdXVpZF9kYXNoZXNbXSA9IHs0LCAyLCAyLCAyLCA2LCAwfTsKKyAgICBjb25zdCB1aW50OF90ICp1dWlkX3B0ciA9IHV1aWRfZGFzaGVzOworICAgIGNoYXIgKmRzdDsKKworICAgIGlmICghc3JjIHx8ICFpc192YWxpZF91dWlkKHNyYykpCisJcmV0dXJuOworCisgICAgZHN0ID0gc3lzdXVpZF9zdHIrODsKKworICAgIHdoaWxlICgqdXVpZF9wdHIpIHsKKwlpbnQgbGVuID0gKnV1aWRfcHRyOworCQorCXdoaWxlIChsZW4pIHsKKwkgICAgZHN0ICs9IHNwcmludGYoZHN0LCAiJTAyeCIsICpzcmMrKyk7CisJICAgIGxlbi0tOworCX0KKwl1dWlkX3B0cisrOworCSpkc3QrKyA9ICctJzsKKyAgICB9CisgICAgLyogUmVtb3ZlIGxhc3QgZGFzaCBhbmQgemVyby10ZXJtaW5hdGUgKi8KKyAgICAqLS1kc3QgPSAnXDAnOworICAgIAorICAgIHN5c2FwcGVuZF9zdHJpbmdzW1NZU0FQUEVORF9TWVNVVUlEXSA9IHN5c3V1aWRfc3RyOworfQorCit2b2lkIHN5c2FwcGVuZF9zZXRfZnNfdXVpZCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIGZzdXVpZF9zdHJbNyszMis3KzFdID0gIkZTVVVJRD0iOworICAgIGNoYXIgKnV1aWQ7CisKKyAgICB1dWlkID0gZnNfdXVpZCgpOworICAgIGlmICghdXVpZCkKKwlyZXR1cm47CisKKyAgICBzbnByaW50Zihmc3V1aWRfc3RyICsgNywgc2l6ZW9mKGZzdXVpZF9zdHIpIC0gNywgIiVzIiwgdXVpZCk7CisgICAgZnN1dWlkX3N0cltzaXplb2YoZnN1dWlkX3N0cikgLSAxXSA9ICdcMCc7CisgICAgZnJlZSh1dWlkKTsKKworICAgIHN5c2FwcGVuZF9zdHJpbmdzW1NZU0FQUEVORF9GU1VVSURdID0gZnN1dWlkX3N0cjsKK30KKworLyoKKyAqIFByaW50IHRoZSBzeXNhcHBlbmQgc3RyaW5ncywgaW4gb3JkZXIKKyAqLwordm9pZCBwcmludF9zeXNhcHBlbmQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBTWVNBUFBFTkRfTUFYOyBpKyspIHsKKwlpZiAoc3lzYXBwZW5kX3N0cmluZ3NbaV0pCisJICAgIHByaW50ZigiJXNcbiIsIHN5c2FwcGVuZF9zdHJpbmdzW2ldKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3N5c2xpbnV4LmxkIGIvY29yZS9zeXNsaW51eC5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYThjOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zeXNsaW51eC5sZApAQCAtMCwwICsxLDQxNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDA4LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciB0aGUgU1lTTElOVVggY29yZQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFWFRFUk4oX3N0YXJ0KQorRU5UUlkoX3N0YXJ0KQorCitTVEFDSzMyX0xFTiA9IDY1NTM2OworCitTRUNUSU9OUworeworCS8qIFByZWZpeCBzdHJ1Y3R1cmUgZm9yIHRoZSBjb21wcmVzc2lvbiBwcm9ncmFtICovCisJLiA9IDA7CisJSElEREVOKF9fbW9kdWxlX3N0YXJ0ID0gLik7CisJLnByZWZpeCA6IHsKKwkJKigucHJlZml4KQorCX0KKworCS8qICJFYXJseSIgc2VjdGlvbnMgKGJlZm9yZSB0aGUgbG9hZCkgKi8KKwkuID0gMHgxMDAwOworCisJLmVhcmx5YnNzIChOT0xPQUQpIDogeworCQlISURERU4oX19lYXJseWJzc19zdGFydCA9IC4pOworCQkqKC5lYXJseWJzcykKKwkJSElEREVOKF9fZWFybHlic3NfZW5kID0gLik7CisJfQorCUhJRERFTihfX2Vhcmx5YnNzX2xlbiA9IEFCU09MVVRFKF9fZWFybHlic3NfZW5kKSAtIEFCU09MVVRFKF9fZWFybHlic3Nfc3RhcnQpKTsKKwlISURERU4oX19lYXJseWJzc19kd29yZHMgPSAoX19lYXJseWJzc19sZW4gKyAzKSA+PiAyKTsKKworCS4gPSBBTElHTig0KTsKKwkuYnNzMTYgKE5PTE9BRCkgOiB7CisJCUhJRERFTihfX2JzczE2X3N0YXJ0ID0gLik7CisJCSooLmJzczE2KQorCQlISURERU4oX19ic3MxNl9lbmQgPSAuKTsKKwl9CisJSElEREVOKF9fYnNzMTZfbGVuID0gQUJTT0xVVEUoX19ic3MxNl9lbmQpIC0gQUJTT0xVVEUoX19ic3MxNl9zdGFydCkpOworCUhJRERFTihfX2JzczE2X2R3b3JkcyA9IChfX2JzczE2X2xlbiArIDMpID4+IDIpOworCisJLiA9IEFMSUdOKDQpOworIAkuY29uZmlnIDogQVQgKF9fY29uZmlnX2xtYSkgeworCQlISURERU4oX19jb25maWdfc3RhcnQgPSAuKTsKKwkJKiguY29uZmlnKQorCQlISURERU4oX19jb25maWdfZW5kID0gLik7CisJfQorCUhJRERFTihfX2NvbmZpZ19sZW4gPSBBQlNPTFVURShfX2NvbmZpZ19lbmQpIC0gQUJTT0xVVEUoX19jb25maWdfc3RhcnQpKTsKKwlISURERU4oX19jb25maWdfZHdvcmRzID0gKF9fY29uZmlnX2xlbiArIDMpID4+IDIpOworCisJLyogR2VuZXJhdGVkIGFuZC9vciBjb3BpZWQgY29kZSAqLworCisJLiA9IEFMSUdOKDEyOCk7CQkvKiBNaW5pbXVtIHNlcGFyYXRpb24gZnJvbSBtdXRhYmxlIGRhdGEgKi8KKyAJLnJlcGxhY2VzdHViIDogQVQgKF9fcmVwbGFjZXN0dWJfbG1hKSB7CisJCUhJRERFTihfX3JlcGxhY2VzdHViX3N0YXJ0ID0gLik7CisJCSooLnJlcGxhY2VzdHViKQorCQlISURERU4oX19yZXBsYWNlc3R1Yl9lbmQgPSAuKTsKKwl9CisJSElEREVOKF9fcmVwbGFjZXN0dWJfbGVuID0gQUJTT0xVVEUoX19yZXBsYWNlc3R1Yl9lbmQpIC0gQUJTT0xVVEUoX19yZXBsYWNlc3R1Yl9zdGFydCkpOworCUhJRERFTihfX3JlcGxhY2VzdHViX2R3b3JkcyA9IChfX3JlcGxhY2VzdHViX2xlbiArIDMpID4+IDIpOworCisJLiA9IEFMSUdOKDE2KTsKKwlISURERU4oX19nZW50ZXh0bnJfbG1hID0gLik7CisJLmdlbnRleHRuciA6IEFUKF9fZ2VudGV4dG5yX2xtYSkgeworCQlISURERU4oX19nZW50ZXh0bnJfc3RhcnQgPSAuKTsKKwkJKiguZ2VudGV4dG5yKQorCQlISURERU4oX19nZW50ZXh0bnJfZW5kID0gLik7CisJfQorCUhJRERFTihfX2dlbnRleHRucl9sZW4gPSBBQlNPTFVURShfX2dlbnRleHRucl9lbmQpIC0gQUJTT0xVVEUoX19nZW50ZXh0bnJfc3RhcnQpKTsKKwlISURERU4oX19nZW50ZXh0bnJfZHdvcmRzID0gKF9fZ2VudGV4dG5yX2xlbiArIDMpID4+IDIpOworCisJLiA9IFNUQUNLX0JBU0U7CisJLnN0YWNrMTYgOiBBVChTVEFDS19CQVNFKSB7CisJCUhJRERFTihfX3N0YWNrMTZfc3RhcnQgPSAuKTsKKwkJLiArPSBTVEFDS19MRU47CisJCUhJRERFTihfX3N0YWNrMTZfZW5kID0gLik7CisJfQorCUhJRERFTihfX3N0YWNrMTZfbGVuID0gQUJTT0xVVEUoX19zdGFjazE2X2VuZCkgLSBBQlNPTFVURShfX3N0YWNrMTZfc3RhcnQpKTsKKwlISURERU4oX19zdGFjazE2X2R3b3JkcyA9IChfX3N0YWNrMTZfbGVuICsgMykgPj4gMik7CisKKwkvKiBJbml0aWFsaXplZCBzZWN0aW9ucyAqLworCisJLiA9IDB4N2MwMDsKKwkuaW5pdCA6IHsKKwkJRklMTCgweDkwOTA5MDkwKQorCQlISURERU4oX19pbml0X3N0YXJ0ID0gLik7CisJCSooLmluaXQpCisJCUhJRERFTihfX2luaXRfZW5kID0gLik7CisJfQorCUhJRERFTihfX2luaXRfbGVuID0gQUJTT0xVVEUoX19pbml0X2VuZCkgLSBBQlNPTFVURShfX2luaXRfc3RhcnQpKTsKKwlISURERU4oX19pbml0X2R3b3JkcyA9IChfX2luaXRfbGVuICsgMykgPj4gMik7CisKKwkudGV4dDE2IDogeworCQlGSUxMKDB4OTA5MDkwOTApCisJCUhJRERFTihfX3RleHQxNl9zdGFydCA9IC4pOworCQkqKC50ZXh0MTYpCisJCUhJRERFTihfX3RleHQxNl9lbmQgPSAuKTsKKwl9CisJSElEREVOKF9fdGV4dDE2X2xlbiA9IEFCU09MVVRFKF9fdGV4dDE2X2VuZCkgLSBBQlNPTFVURShfX3RleHQxNl9zdGFydCkpOworCUhJRERFTihfX3RleHQxNl9kd29yZHMgPSAoX190ZXh0MTZfbGVuICsgMykgPj4gMik7CisKKwkvKgorCSAqIC50ZXh0bnIgaXMgdXNlZCBmb3IgMzItYml0IGNvZGUgdGhhdCBpcyB1c2VkIG9uIHRoZSBjb2RlCisJICogcGF0aCB0byBpbml0aWFsaXplIHRoZSAudGV4dCBzZWdtZW50CisJICovCisJLiA9IEFMSUdOKDE2KTsKKwkudGV4dG5yIDogeworCQlGSUxMKDB4OTA5MDkwOTApCisJCUhJRERFTihfX3RleHRucl9zdGFydCA9IC4pOworCQkqKC50ZXh0bnIpCisJCUhJRERFTihfX3RleHRucl9lbmQgPSAuKTsKKwl9CisJSElEREVOKF9fdGV4dG5yX2xlbiA9IEFCU09MVVRFKF9fdGV4dG5yX2VuZCkgLSBBQlNPTFVURShfX3RleHRucl9zdGFydCkpOworCUhJRERFTihfX3RleHRucl9kd29yZHMgPSAoX190ZXh0bnJfbGVuICsgMykgPj4gMik7CisKKwkuID0gQUxJR04oMTYpOworCUhJRERFTihfX2Jjb3B5eHhfc3RhcnQgPSAuKTsKKworCS5iY29weXh4LnRleHQgOiB7CisJCUZJTEwoMHg5MDkwOTA5MCkKKwkJSElEREVOKF9fYmNvcHl4eF90ZXh0X3N0YXJ0ID0gLik7CisJCSooLmJjb3B5eHgudGV4dCkKKwkJSElEREVOKF9fYmNvcHl4eF90ZXh0X2VuZCA9IC4pOworCX0KKwlISURERU4oX19iY29weXh4X3RleHRfbGVuID0gQUJTT0xVVEUoX19iY29weXh4X3RleHRfZW5kKSAtIEFCU09MVVRFKF9fYmNvcHl4eF90ZXh0X3N0YXJ0KSk7CisJSElEREVOKF9fYmNvcHl4eF90ZXh0X2R3b3JkcyA9IChfX2Jjb3B5eHhfdGV4dF9sZW4gKyAzKSA+PiAyKTsKKworCS5iY29weXh4LmRhdGEgOiB7CisJCUhJRERFTihfX2Jjb3B5eHhfZGF0YV9zdGFydCA9IC4pOworCQkqKC5iY29weXh4LnRleHQpCisJCUhJRERFTihfX2Jjb3B5eHhfZGF0YV9lbmQgPSAuKTsKKwl9CisJSElEREVOKF9fYmNvcHl4eF9kYXRhX2xlbiA9IEFCU09MVVRFKF9fYmNvcHl4eF9kYXRhX2VuZCkgLSBBQlNPTFVURShfX2Jjb3B5eHhfZGF0YV9zdGFydCkpOworCUhJRERFTihfX2Jjb3B5eHhfZGF0YV9kd29yZHMgPSAoX19iY29weXh4X2RhdGFfbGVuICsgMykgPj4gMik7CisKKwlISURERU4oX19iY29weXh4X2VuZCA9IC4pOworCUhJRERFTihfX2Jjb3B5eHhfbGVuID0gQUJTT0xVVEUoX19iY29weXh4X2VuZCkgLSBBQlNPTFVURShfX2Jjb3B5eHhfc3RhcnQpKTsKKwlISURERU4oX19iY29weXh4X2R3b3JkcyA9IChfX2Jjb3B5eHhfbGVuICsgMykgPj4gMik7CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGExNiA6IHsKKwkJSElEREVOKF9fZGF0YTE2X3N0YXJ0ID0gLik7CisJCSooLmRhdGExNikKKwkJSElEREVOKF9fZGF0YTE2X2VuZCA9IC4pOworCX0KKwlISURERU4oX19kYXRhMTZfbGVuID0gQUJTT0xVVEUoX19kYXRhMTZfZW5kKSAtIEFCU09MVVRFKF9fZGF0YTE2X3N0YXJ0KSk7CisJSElEREVOKF9fZGF0YTE2X2R3b3JkcyA9IChfX2RhdGExNl9sZW4gKyAzKSA+PiAyKTsKKworCS4gPSBBTElHTig0KTsKKwlISURERU4oX19jb25maWdfbG1hID0gLik7CisJLiArPSBTSVpFT0YoLmNvbmZpZyk7CisKKwkuID0gQUxJR04oNCk7CisJSElEREVOKF9fcmVwbGFjZXN0dWJfbG1hID0gLik7CisJLiArPSBTSVpFT0YoLnJlcGxhY2VzdHViKTsKKworCS8qIFRoZSAzMi1iaXQgY29kZSBsb2FkcyBhYm92ZSB0aGUgbm9uLXByb2diaXRzIHNlY3Rpb25zICovCisKKwkuID0gQUxJR04oMTYpOworCUhJRERFTihfX3BtX2NvZGVfbG1hID0gLik7CisKKwlISURERU4oX19oaWdoX2NsZWFyX3N0YXJ0ID0gLik7CisKKwkuID0gQUxJR04oNTEyKTsKKwkuYWR2IChOT0xPQUQpIDogeworCQlISURERU4oX19hZHZfc3RhcnQgPSAuKTsKKwkJKiguYWR2KQorCQlISURERU4oX19hZHZfZW5kID0gLik7CisJfQorCUhJRERFTihfX2Fkdl9sZW4gPSBBQlNPTFVURShfX2Fkdl9lbmQpIC0gQUJTT0xVVEUoX19hZHZfc3RhcnQpKTsKKwlISURERU4oX19hZHZfZHdvcmRzID0gKF9fYWR2X2xlbiArIDMpID4+IDIpOworCisJLyogTGF0ZSB1bmluaXRpYWxpemVkIHNlY3Rpb25zICovCisKKwkuID0gQUxJR04oNCk7CisJLnVpYnNzIChOT0xPQUQpIDogeworCQlISURERU4oX191aWJzc19zdGFydCA9IC4pOworCQkqKC51aWJzcykKKwkJSElEREVOKF9fdWlic3NfZW5kID0gLik7CisJfQorCUhJRERFTihfX3VpYnNzX2xlbiA9IEFCU09MVVRFKF9fdWlic3NfZW5kKSAtIEFCU09MVVRFKF9fdWlic3Nfc3RhcnQpKTsKKwlISURERU4oX191aWJzc19kd29yZHMgPSAoX191aWJzc19sZW4gKyAzKSA+PiAyKTsKKworCUhJRERFTihfZW5kMTYgPSAuKTsKKwlISURERU4oX19hc3NlcnRfZW5kMTYgPSBBU1NFUlQoX2VuZDE2IDw9IDB4MTAwMDAsICI2NEsgb3ZlcmZsb3ciKSk7CisKKwkvKgorCSAqIFNwZWNpYWwgMTYtYml0IHNlZ21lbnRzCisJICovCisKKwkuID0gQUxJR04oNjU1MzYpOworCS5yZWFsX21vZGUgKE5PTE9BRCkgOiB7CisJCSooLnJlYWxfbW9kZSkKKwl9CisJSElEREVOKHJlYWxfbW9kZV9zZWcgPSBjb3JlX3JlYWxfbW9kZSA+PiA0KTsKKworCS4gPSBBTElHTig2NTUzNik7CisJLnhmZXJfYnVmIChOT0xPQUQpIDogeworCQkqKC54ZmVyX2J1ZikKKwl9CisJSElEREVOKHhmZXJfYnVmX3NlZyA9IGNvcmVfeGZlcl9idWYgPj4gNCk7CisKKwkvKgorCSAqIFVzZWQgdG8gYWxsb2NhdGUgbG93bWVtIGJ1ZmZlcnMgZnJvbSAzMi1iaXQgY29kZQorCSAqLworCS5sb3dtZW0gKE5PTE9BRCkgOiB7CisJCUhJRERFTihfX2xvd21lbV9zdGFydCA9IC4pOworCQkqKC5sb3dtZW0pCisJCUhJRERFTihfX2xvd21lbV9lbmQgPSAuKTsKKwl9CisJSElEREVOKF9fbG93bWVtX2xlbiA9IEFCU09MVVRFKF9fbG93bWVtX2VuZCkgLSBBQlNPTFVURShfX2xvd21lbV9zdGFydCkpOworCUhJRERFTihfX2xvd21lbV9kd29yZHMgPSAoX19sb3dtZW1fbGVuICsgMykgPj4gMik7CisKKwlISURERU4oX19oaWdoX2NsZWFyX2VuZCA9IC4pOworCisJSElEREVOKF9faGlnaF9jbGVhcl9sZW4gPSBBQlNPTFVURShfX2hpZ2hfY2xlYXJfZW5kKSAtIEFCU09MVVRFKF9faGlnaF9jbGVhcl9zdGFydCkpOworCUhJRERFTihfX2hpZ2hfY2xlYXJfZHdvcmRzID0gKF9faGlnaF9jbGVhcl9sZW4gKyAzKSA+PiAyKTsKKworCS8qIFN0YXJ0IG9mIHRoZSBsb3dtZW0gaGVhcCAqLworCS4gPSBBTElHTigxNik7CisJSElEREVOKF9fbG93bWVtX2hlYXAgPSAuKTsKKworCS8qCisJICogMzItYml0IGNvZGUuICBUaGlzIGlzIGEgaGFjayBmb3IgdGhlIG1vbWVudCBkdWUgdG8gdGhlCisJICogcmVhbC1tb2RlIHNlZ21lbnRzIGFsc28gYWxsb2NhdGVkLgorCSAqLworCisJLiA9IDB4MTAwMDAwOworCisJSElEREVOKF9fcG1fY29kZV9zdGFydCA9IC4pOworCisJSElEREVOKF9fdGV4dF92bWEgPSAuKTsKKwlISURERU4oX190ZXh0X2xtYSA9IF9fcG1fY29kZV9sbWEpOworCS50ZXh0IDogQVQoX190ZXh0X2xtYSkgeworCQlGSUxMKDB4OTA5MDkwOTApCisJCUhJRERFTihfX3RleHRfc3RhcnQgPSAuKTsKKwkJKigudGV4dCkKKwkJKigudGV4dC4qKQorCQlISURERU4oX190ZXh0X2VuZCA9IC4pOworCX0KKworCS4gPSBBTElHTigxNik7CisKKwlISURERU4oX19yb2RhdGFfdm1hID0gLik7CisJSElEREVOKF9fcm9kYXRhX2xtYSA9IF9fcm9kYXRhX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hKTsKKwkucm9kYXRhIDogQVQoX19yb2RhdGFfbG1hKSB7CisJCUhJRERFTihfX3JvZGF0YV9zdGFydCA9IC4pOworCQkqKC5yb2RhdGEpCisJCSooLnJvZGF0YS4qKQorCQlISURERU4oX19yb2RhdGFfZW5kID0gLik7CisJfQorCisJLiA9IEFMSUdOKDQpOworCisJSElEREVOKF9fY3RvcnNfdm1hID0gLik7CisJSElEREVOKF9fY3RvcnNfbG1hID0gX19jdG9yc192bWEgKyBfX3RleHRfbG1hIC0gX190ZXh0X3ZtYSk7CisJLmN0b3JzIDogQVQoX19jdG9yc19sbWEpIHsKKwkJSElEREVOKF9fY3RvcnNfc3RhcnQgPSAuKTsKKwkJS0VFUCAoKihTT1JUKC5wcmVpbml0X2FycmF5KikpKQorCQlLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkqKSkpCisJCUtFRVAgKCooU09SVCguY3RvcnMqKSkpCisJCUhJRERFTihfX2N0b3JzX2VuZCA9IC4pOworCX0KKworCUhJRERFTihfX2R0b3JzX3ZtYSA9IC4pOworCUhJRERFTihfX2R0b3JzX2xtYSA9IF9fZHRvcnNfdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWEpOworCS5kdG9ycyA6IEFUKF9fZHRvcnNfbG1hKSB7CisJCUhJRERFTihfX2R0b3JzX3N0YXJ0ID0gLik7CisJCUtFRVAgKCooU09SVCguZmluaV9hcnJheSopKSkKKwkJS0VFUCAoKihTT1JUKC5kdG9ycyopKSkKKwkJSElEREVOKF9fZHRvcnNfZW5kID0gLik7CisJfQorCisJLiA9IEFMSUdOKDQpOworCisJSElEREVOKF9fZHluc3ltX3ZtYSA9IC4pOworCUhJRERFTihfX2R5bnN5bV9sbWEgPSBfX2R5bnN5bV92bWEgKyBfX3RleHRfbG1hIC0gX190ZXh0X3ZtYSk7CisJLmR5bnN5bSA6IEFUKF9fZHluc3ltX2xtYSkgeworCQlISURERU4oX19keW5zeW1fc3RhcnQgPSAuKTsKKwkJKiguZHluc3ltKQorCQlISURERU4oX19keW5zeW1fZW5kID0gLik7CisJfQorCUhJRERFTihfX2R5bnN5bV9sZW4gPSBfX2R5bnN5bV9lbmQgLSBfX2R5bnN5bV9zdGFydCk7CisKKwkuID0gQUxJR04oNCk7CisKKwlISURERU4oX19keW5zdHJfdm1hID0gLik7CisJSElEREVOKF9fZHluc3RyX2xtYSA9IF9fZHluc3RyX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hKTsKKwkuZHluc3RyIDogQVQoX19keW5zdHJfbG1hKSB7CisJCUhJRERFTihfX2R5bnN0cl9zdGFydCA9IC4pOworCQkqKC5keW5zdHIpCisJCUhJRERFTihfX2R5bnN0cl9lbmQgPSAuKTsKKwl9CisJSElEREVOKF9fZHluc3RyX2xlbiA9IF9fZHluc3RyX2VuZCAtIF9fZHluc3RyX3N0YXJ0KTsKKworCS4gPSBBTElHTig0KTsKKworCUhJRERFTihfX2dudV9oYXNoX3ZtYSA9IC4pOworCUhJRERFTihfX2dudV9oYXNoX2xtYSA9IF9fZ251X2hhc2hfdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWEpOworCS5nbnUuaGFzaCA6IEFUKF9fZ251X2hhc2hfbG1hKSB7CisJCUhJRERFTihfX2dudV9oYXNoX3N0YXJ0ID0gLik7CisJCSooLmdudS5oYXNoKQorCQlISURERU4oX19nbnVfaGFzaF9lbmQgPSAuKTsKKwl9CisKKworCS4gPSBBTElHTig0KTsKKworCUhJRERFTihfX2R5bmxpbmtfdm1hID0gLik7CisJSElEREVOKF9fZHlubGlua19sbWEgPSBfX2R5bmxpbmtfdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWEpOworCS5keW5saW5rIDogQVQoX19keW5saW5rX2xtYSkgeworCQlISURERU4oX19keW5saW5rX3N0YXJ0ID0gLik7CisJCSooLmR5bmxpbmspCisJCUhJRERFTihfX2R5bmxpbmtfZW5kID0gLik7CisJfQorCisJLiA9IEFMSUdOKDQpOworCisJSElEREVOKF9fZ290X3ZtYSA9IC4pOworCUhJRERFTihfX2dvdF9sbWEgPSBfX2dvdF92bWEgKyBfX3RleHRfbG1hIC0gX190ZXh0X3ZtYSk7CisJLmdvdCA6IEFUKF9fZ290X2xtYSkgeworCQlISURERU4oX19nb3Rfc3RhcnQgPSAuKTsKKwkJS0VFUCAoKiguZ290LnBsdCkpCisJCUtFRVAgKCooLmdvdCkpCisJCUhJRERFTihfX2dvdF9lbmQgPSAuKTsKKwl9CisKKwkuID0gQUxJR04oNCk7CisKKwlISURERU4oX19keW5hbWljX3ZtYSA9IC4pOworCUhJRERFTihfX2R5bmFtaWNfbG1hID0gX19keW5hbWljX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hKTsKKwkuZHluYW1pYyA6IEFUKF9fZHluYW1pY19sbWEpIHsKKwkJSElEREVOKF9fZHluYW1pY19zdGFydCA9IC4pOworCQkqKC5keW5hbWljKQorCQlISURERU4oX19keW5hbWljX2VuZCA9IC4pOworCX0KKworCS4gPSBBTElHTigxNik7CisKKwlISURERU4oX19kYXRhX3ZtYSA9IC4pOworCUhJRERFTihfX2RhdGFfbG1hID0gX19kYXRhX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hKTsKKwkuZGF0YSA6IEFUKF9fZGF0YV9sbWEpIHsKKwkJSElEREVOKF9fZGF0YV9zdGFydCA9IC4pOworCQkqKC5kYXRhKQorCQkqKC5kYXRhLiopCisJCUhJRERFTihfX2RhdGFfZW5kID0gLik7CisJfQorCisJSElEREVOKF9fcG1fY29kZV9lbmQgPSAuKTsKKwlISURERU4oX19wbV9jb2RlX2xlbiA9IEFCU09MVVRFKF9fcG1fY29kZV9lbmQpIC0gQUJTT0xVVEUoX19wbV9jb2RlX3N0YXJ0KSk7CisJSElEREVOKF9fcG1fY29kZV9kd29yZHMgPSAoX19wbV9jb2RlX2xlbiArIDMpID4+IDIpOworCisJLiA9IEFMSUdOKDEyOCk7CisJCisJSElEREVOKF9fYnNzX3ZtYSA9IC4pOworCUhJRERFTihfX2Jzc19sbWEgPSAuKTsJCS8qIER1bW15ICovCisJLmJzcyAoTk9MT0FEKSA6IEFUIChfX2Jzc19sbWEpIHsKKwkJSElEREVOKF9fYnNzX3N0YXJ0ID0gLik7CisJCSooLmJzcykKKwkJKiguYnNzLiopCisJCSooQ09NTU9OKQorCQlISURERU4oX19ic3NfZW5kID0gLik7CisJfQorCUhJRERFTihfX2Jzc19sZW4gPSBBQlNPTFVURShfX2Jzc19lbmQpIC0gQUJTT0xVVEUoX19ic3Nfc3RhcnQpKTsKKwlISURERU4oX19ic3NfZHdvcmRzID0gKF9fYnNzX2xlbiArIDMpID4+IDIpOworCisJLyogRGF0YSBzYXZlZCBhd2F5IGJlZm9yZSBic3MgaW5pdGlhbGl6YXRpb24gKi8KKwkuID0gQUxJR04oMTI4KTsKKworCUhJRERFTihfX3NhdmVkYXRhX3ZtYSA9IC4pOworCUhJRERFTihfX3NhdmVkYXRhX2xtYSA9IC4pOwkJLyogRHVtbXkgKi8KKwkuc2F2ZWRhdGEgKE5PTE9BRCkgOiBBVCAoX19zYXZlZGF0YV9sbWEpIHsKKwkJSElEREVOKF9fc2F2ZWRhdGFfc3RhcnQgPSAuKTsKKwkJKiguc2F2ZWRhdGEpCisJCSooLnNhdmVkYXRhLiopCisJCUhJRERFTihfX3NhdmVkYXRhX2VuZCA9IC4pOworCX0KKwlISURERU4oX19zYXZlZGF0YV9sZW4gPSBBQlNPTFVURShfX3NhdmVkYXRhX2VuZCkgLSBBQlNPTFVURShfX3NhdmVkYXRhX3N0YXJ0KSk7CisJSElEREVOKF9fc2F2ZWRhdGFfZHdvcmRzID0gKF9fc2F2ZWRhdGFfbGVuICsgMykgPj4gMik7CisKKwkvKiBYWFg6IFRoaXMgc3RhY2sgc2hvdWxkIGJlIHVuaWZpZWQgd2l0aCB0aGUgQ09NMzIgc3RhY2sgKi8KKwlISURERU4oX19zdGFja192bWEgPSAuKTsKKwlfX3N0YWNrX2xtYSA9IC47CS8qIER1bW15ICovCisJLnN0YWNrIChOT0xPQUQpIDogQVQoX19zdGFja19sbWEpIHsKKwkJSElEREVOKF9fc3RhY2tfc3RhcnQgPSAuKTsKKwkJKiguc3RhY2spCisJCUhJRERFTihfX3N0YWNrX2VuZCA9IC4pOworCX0KKwlISURERU4oX19zdGFja19sZW4gPSBBQlNPTFVURShfX3N0YWNrX2VuZCkgLSBBQlNPTFVURShfX3N0YWNrX3N0YXJ0KSk7CisJSElEREVOKF9fc3RhY2tfZHdvcmRzID0gKF9fc3RhY2tfbGVuICsgMykgPj4gMik7CisKKwlISURERU4oX2VuZCA9IC4pOworCisJLyogSGVhcCBmb2xsb3dzIGFmdGVyIG91ciBvd24gUE0gY29kZSAqLworCS4gPSBBTElHTig2NTUzNik7CisJSElEREVOKGZyZWVfaGlnaF9tZW1vcnkgPSAuKTsKKworCS8qIFN0dWZmIHdlIGRvbid0IG5lZWQuLi4gKi8KKwkvRElTQ0FSRC8gOiB7CisJCSooLmVoX2ZyYW1lKQorCX0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGhyZWFkL2V4aXRfdGhyZWFkLmMgYi9jb3JlL3RocmVhZC9leGl0X3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmQ4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3RocmVhZC9leGl0X3RocmVhZC5jCkBAIC0wLDAgKzEsMzAgQEAKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgImNvcmUuaCIKKworX19ub3JldHVybiBfX2V4aXRfdGhyZWFkKHZvaWQpCit7CisgICAgc3RydWN0IHRocmVhZCAqY3VyciA9IGN1cnJlbnQoKTsKKworICAgIGNsaSgpOworCisgICAgLyogUmVtb3ZlIGZyb20gdGhlIGxpbmtlZCBsaXN0ICovCisgICAgY3Vyci0+bGlzdC5wcmV2LT5uZXh0ID0gY3Vyci0+bGlzdC5uZXh0OworICAgIGN1cnItPmxpc3QubmV4dC0+cHJldiA9IGN1cnItPmxpc3QucHJldjsKKworICAgIC8qIEZyZWUgYWxsb2NhdGVkIHN0YWNrcyAobm90ZTogZnJlZShOVUxMKSBpcyBwZXJtaXR0ZWQgYW5kIHNhZmUpLiAqLworICAgIGZyZWUoY3Vyci0+c3RhY2spOworICAgIGZyZWUoY3Vyci0+cm1zdGFjayk7CisKKyAgICAvKgorICAgICAqIE5vdGU6IF9fc2NoZWR1bGUoKSBjYW4gZXhwbGljdGx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZQorICAgICAqIGN1cnIgaXNuJ3QgcGFydCBvZiB0aGUgbGlua2VkIGxpc3QgYW55bW9yZSwgYXMgbG9uZyBhcworICAgICAqIGN1cnItPmxpc3QubmV4dCBpcyBzdGlsbCB2YWxpZC4KKyAgICAgKi8KKyAgICBfX3NjaGVkdWxlKCk7CisKKyAgICAvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKyAgICBrYWJvb20oKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvdGhyZWFkL2lkbGVfdGhyZWFkLmMgYi9jb3JlL3RocmVhZC9pZGxlX3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWEwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3RocmVhZC9pZGxlX3RocmVhZC5jCkBAIC0wLDAgKzEsMjcgQEAKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfaWRsZV90aHJlYWRfaG9vayh2b2lkKQoreworfQorCit2b2lkICgqaWRsZV90aHJlYWRfaG9vaykodm9pZCkgPSBkZWZhdWx0X2lkbGVfdGhyZWFkX2hvb2s7CisKK3N0YXRpYyB2b2lkIGlkbGVfdGhyZWFkX2Z1bmModm9pZCAqZHVtbXkpCit7CisgICAgKHZvaWQpZHVtbXk7CisKKyAgICBmb3IgKDs7KSB7CisJY2xpKCk7CisJaWRsZV90aHJlYWRfaG9vaygpOworCV9fc2NoZWR1bGUoKTsKKwlhc20gdm9sYXRpbGUoInN0aSA7IGhsdCIgOiA6IDogIm1lbW9yeSIpOworICAgIH0KK30KKwordm9pZCBzdGFydF9pZGxlX3RocmVhZCh2b2lkKQoreworICAgIHN0YXJ0X3RocmVhZCgiaWRsZSIsIDQwOTYsIElETEVfVEhSRUFEX1BSSU9SSVRZLCBpZGxlX3RocmVhZF9mdW5jLCBOVUxMKTsKK30KKwpkaWZmIC0tZ2l0IGEvY29yZS90aHJlYWQva2lsbF90aHJlYWQuYyBiL2NvcmUvdGhyZWFkL2tpbGxfdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyNTE3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGhyZWFkL2tpbGxfdGhyZWFkLmMKQEAgLTAsMCArMSw0MiBAQAorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCitleHRlcm4gdm9pZCBfX2V4aXRfdGhyZWFkKHZvaWQpOwordHlwZWRlZiB2b2lkICgqZnVuY19wdHIpKHZvaWQpOworCit2b2lkIGtpbGxfdGhyZWFkKHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKK3sKKyAgICBpcnFfc3RhdGVfdCBpcnE7CisgICAgc3RydWN0IHRocmVhZF9ibG9jayAqYmxvY2s7CisKKyAgICBpZiAodGhyZWFkID09IGN1cnJlbnQoKSkKKwlfX2V4aXRfdGhyZWFkKCk7CisKKyAgICBpcnEgPSBpcnFfc2F2ZSgpOworCisgICAgLyoKKyAgICAgKiBNdWNrIHdpdGggdGhlIHN0YWNrIHNvIHRoYXQgdGhlIG5leHQgdGltZSB0aGUgdGhyZWFkIGlzIHJ1biB0aGVuCisgICAgICogd2UgZW5kIHVwIGdvaW5nIHRvIF9fZXhpdF90aHJlYWQuCisgICAgICovCisgICAgdGhyZWFkLT5lc3AtPmVpcCA9IF9fZXhpdF90aHJlYWQ7CisgICAgdGhyZWFkLT5wcmlvID0gSU5UX01JTjsKKworICAgIGJsb2NrID0gdGhyZWFkLT5ibG9ja2VkOworICAgIGlmIChibG9jaykgeworCXN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IGJsb2NrLT5zZW1hcGhvcmU7CisJLyogUmVtb3ZlIHVzIGZyb20gdGhlIHF1ZXVlIGFuZCBpbmNyZWFzZSB0aGUgY291bnQgKi8KKwlibG9jay0+bGlzdC5uZXh0LT5wcmV2ID0gYmxvY2stPmxpc3QucHJldjsKKwlibG9jay0+bGlzdC5wcmV2LT5uZXh0ID0gYmxvY2stPmxpc3QubmV4dDsKKwlzZW0tPmNvdW50Kys7CisKKwl0aHJlYWQtPmJsb2NrZWQgPSBOVUxMOworCWJsb2NrLT50aW1lZF9vdXQgPSB0cnVlOyAvKiBGYWtlIGFuIGltbWVkaWF0ZSB0aW1lb3V0ICovCisgICAgfQorCisgICAgX19zY2hlZHVsZSgpOworCisgICAgaXJxX3Jlc3RvcmUoaXJxKTsKK30KKworCisKZGlmZiAtLWdpdCBhL2NvcmUvdGhyZWFkL21ib3guYyBiL2NvcmUvdGhyZWFkL21ib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWM2NDBhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90aHJlYWQvbWJveC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBtYm94LmMKKyAqCisgKiBTaW1wbGUgdGhyZWFkIG1haWxib3ggaW50ZXJmYWNlCisgKi8KKworI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgIm1ib3guaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorCit2b2lkIG1ib3hfaW5pdChzdHJ1Y3QgbWFpbGJveCAqbWJveCwgc2l6ZV90IHNpemUpCit7CisgICAgaWYgKCEhbWJveCkgeworCXNlbV9pbml0KCZtYm94LT5wcm9kX3NlbSwgc2l6ZSk7IC8qIEFsbCBzbG90cyBlbXB0eSAqLworCXNlbV9pbml0KCZtYm94LT5jb25zX3NlbSwgMCk7ICAgIC8qIE5vIHNsb3RzIGZ1bGwgKi8KKwlzZW1faW5pdCgmbWJveC0+aGVhZF9zZW0sIDEpOyAgICAvKiBIZWFkIG11dGV4ICovCisJc2VtX2luaXQoJm1ib3gtPnRhaWxfc2VtLCAxKTsgICAgLyogVGFpbCBtdXRleCAqLworCisJbWJveC0+d3JhcCA9ICZtYm94LT5kYXRhW3NpemVdOworCW1ib3gtPmhlYWQgPSAmbWJveC0+ZGF0YVswXTsKKwltYm94LT50YWlsID0gJm1ib3gtPmRhdGFbMF07CisgICAgfQorfTsKKworaW50IG1ib3hfcG9zdChzdHJ1Y3QgbWFpbGJveCAqbWJveCwgdm9pZCAqbXNnLCBtc3RpbWVfdCB0aW1lb3V0KQoreworICAgIGlmICghbWJveF9pc192YWxpZChtYm94KSkKKwlyZXR1cm4gRU5PTUVNOworICAgIGlmIChzZW1fZG93bigmbWJveC0+cHJvZF9zZW0sIHRpbWVvdXQpID09IChtc3RpbWVfdCktMSkKKwlyZXR1cm4gRU5PTUVNOworICAgIHNlbV9kb3duKCZtYm94LT5oZWFkX3NlbSwgMCk7CisKKyAgICAqbWJveC0+aGVhZCA9IG1zZzsKKyAgICBtYm94LT5oZWFkKys7CisgICAgaWYgKG1ib3gtPmhlYWQgPT0gbWJveC0+d3JhcCkKKwltYm94LT5oZWFkID0gJm1ib3gtPmRhdGFbMF07CisKKyAgICBzZW1fdXAoJm1ib3gtPmhlYWRfc2VtKTsKKyAgICBzZW1fdXAoJm1ib3gtPmNvbnNfc2VtKTsKKyAgICByZXR1cm4gMDsKK30KKworbXN0aW1lX3QgbWJveF9mZXRjaChzdHJ1Y3QgbWFpbGJveCAqbWJveCwgdm9pZCAqKm1zZywgbXN0aW1lX3QgdGltZW91dCkKK3sKKyAgICBtc3RpbWVfdCB0OworCisgICAgaWYgKCFtYm94KQorCXJldHVybiAtMTsKKyAgICB0ID0gc2VtX2Rvd24oJm1ib3gtPmNvbnNfc2VtLCB0aW1lb3V0KTsKKyAgICBpZiAodCA9PSAobXN0aW1lX3QpLTEpCisJcmV0dXJuIC0xOworICAgIHQgKz0gc2VtX2Rvd24oJm1ib3gtPnRhaWxfc2VtLCAwKTsKKworICAgIGlmIChtc2cpCisJKm1zZyA9ICptYm94LT50YWlsOworICAgIG1ib3gtPnRhaWwrKzsKKyAgICBpZiAobWJveC0+dGFpbCA9PSBtYm94LT53cmFwKQorCW1ib3gtPnRhaWwgPSAmbWJveC0+ZGF0YVswXTsKKworICAgIHNlbV91cCgmbWJveC0+dGFpbF9zZW0pOworICAgIHNlbV91cCgmbWJveC0+cHJvZF9zZW0pOworICAgIHJldHVybiB0OworfQpkaWZmIC0tZ2l0IGEvY29yZS90aHJlYWQvcm9vdF90aHJlYWQuYyBiL2NvcmUvdGhyZWFkL3Jvb3RfdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiYTdjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGhyZWFkL3Jvb3RfdGhyZWFkLmMKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgInRocmVhZC5oIgorCitzdHJ1Y3QgdGhyZWFkIF9fcm9vdF90aHJlYWQgPSB7CisgICAgLnRocmVhZF9tYWdpYyA9IFRIUkVBRF9NQUdJQywKKyAgICAubmFtZSA9ICJyb290IiwKKyAgICAubGlzdCA9IHsgLm5leHQgPSAmX19yb290X3RocmVhZC5saXN0LCAucHJldiA9ICZfX3Jvb3RfdGhyZWFkLmxpc3QgfSwKKyAgICAuYmxvY2tlZCA9IE5VTEwsCisgICAgLnByaW8gPSAwLAorfTsKKworc3RydWN0IHRocmVhZCAqX19jdXJyZW50ID0gJl9fcm9vdF90aHJlYWQ7CmRpZmYgLS1naXQgYS9jb3JlL3RocmVhZC9zY2hlZHVsZS5jIGIvY29yZS90aHJlYWQvc2NoZWR1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQyNmYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90aHJlYWQvc2NoZWR1bGUuYwpAQCAtMCwwICsxLDkxIEBACisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzeXMvY3B1Lmg+CisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgPGRwcmludGYuaD4KKwordm9pZCAoKnNjaGVkX2hvb2tfZnVuYykodm9pZCk7CisKKy8qCisgKiBfX3NjaGVkdWxlKCkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBsb2NrZWQgb3V0IQorICovCit2b2lkIF9fc2NoZWR1bGUodm9pZCkKK3sKKyAgICBzdGF0aWMgYm9vbCBpbl9zY2hlZF9ob29rOworICAgIHN0cnVjdCB0aHJlYWQgKmN1cnIgPSBjdXJyZW50KCk7CisgICAgc3RydWN0IHRocmVhZCAqc3QsICpudCwgKmJlc3Q7CisKKyNpZiBERUJVRworICAgIGlmIChfX3VubGlrZWx5KGlycV9zdGF0ZSgpICYgMHgyMDApKSB7CisJZHByaW50ZigiSW4gX19zY2hlZHVsZSB3aXRoIGludGVycnVwdHMgb24hXG4iKTsKKwlrYWJvb20oKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogQXJlIHdlIGNhbGxlZCBmcm9tIGluc2lkZSBzY2hlZF9ob29rX2Z1bmMoKT8gIElmIHNvIHdlJ2xsCisgICAgICogc2NoZWR1bGUgYW55d2F5IG9uIHRoZSB3YXkgb3V0LgorICAgICAqLworICAgIGlmIChpbl9zY2hlZF9ob29rKQorCXJldHVybjsKKworICAgIGRwcmludGYoIlNjaGVkdWxlICIpOworCisgICAgLyogUG9zc2libHkgdXBkYXRlIHRoZSBpbmZvcm1hdGlvbiBvbiB3aGljaCB3ZSBtYWtlCisgICAgICogc2NoZWR1bGluZyBkZWNpc2lvbnMuCisgICAgICovCisgICAgaWYgKHNjaGVkX2hvb2tfZnVuYykgeworCWluX3NjaGVkX2hvb2sgPSB0cnVlOworCXNjaGVkX2hvb2tfZnVuYygpOworCWluX3NjaGVkX2hvb2sgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSB1bnVzdWFsIGZvcm0gb2YgdGhpcyB3YWxrIGlzIGJlY2F1c2Ugd2UgaGF2ZSB0byBzdGFydCB3aXRoCisgICAgICogdGhlIHRocmVhZCAqZm9sbG93aW5nKiBjdXJyLCBhbmQgY3VyciBtYXkgbm90IGFjdHVhbGx5IGJlIHBhcnQKKyAgICAgKiBvZiB0aGUgbGlzdCBhbnltb3JlIChpbiB0aGUgY2FzZSBvZiBfX2V4aXRfdGhyZWFkKS4KKyAgICAgKi8KKyAgICBiZXN0ID0gTlVMTDsKKyAgICBudCA9IHN0ID0gY29udGFpbmVyX29mKGN1cnItPmxpc3QubmV4dCwgc3RydWN0IHRocmVhZCwgbGlzdCk7CisgICAgZG8geworCWlmIChfX3VubGlrZWx5KG50LT50aHJlYWRfbWFnaWMgIT0gVEhSRUFEX01BR0lDKSkgeworCSAgICBkcHJpbnRmKCJJbnZhbGlkIHRocmVhZCBvbiB0aHJlYWQgbGlzdCAlcCBtYWdpYyA9IDB4JTA4eFxuIiwKKwkJICAgIG50LCBudC0+dGhyZWFkX21hZ2ljKTsKKwkgICAga2Fib29tKCk7CisJfQorCisJZHByaW50ZigiVGhyZWFkICVwICglcykgIiwgbnQsIG50LT5uYW1lKTsKKwlpZiAoIW50LT5ibG9ja2VkKSB7CisJICAgIGRwcmludGYoInJ1bm5hYmxlIHByaW9yaXR5ICVkXG4iLCBudC0+cHJpbyk7CisJICAgIGlmICghYmVzdCB8fCBudC0+cHJpbyA8IGJlc3QtPnByaW8pCisJCWJlc3QgPSBudDsKKwl9IGVsc2UgeworCSAgICBkcHJpbnRmKCJibG9ja2VkXG4iKTsKKwl9CisJbnQgPSBjb250YWluZXJfb2YobnQtPmxpc3QubmV4dCwgc3RydWN0IHRocmVhZCwgbGlzdCk7CisgICAgfSB3aGlsZSAobnQgIT0gc3QpOworCisgICAgaWYgKCFiZXN0KQorCWthYm9vbSgpOwkJLyogTm8gcnVubmFibGUgdGhyZWFkICovCisKKyAgICBpZiAoYmVzdCAhPSBjdXJyKSB7CisJdWludDY0X3QgdHNjOworCQorCWFzbSB2b2xhdGlsZSgicmR0c2MiIDogIj1BIiAodHNjKSk7CisJCisJZHByaW50ZigiQCAlbGx1IC0+ICVwICglcylcbiIsIHRzYywgYmVzdCwgYmVzdC0+bmFtZSk7CisJX19zd2l0Y2hfdG8oYmVzdCk7CisgICAgfSBlbHNlIHsKKwlkcHJpbnRmKCJubyBjaGFuZ2VcbiIpOworICAgIH0KK30KKworLyoKKyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tICJub3JtYWwiIGNvZGUuLi4KKyAqLwordm9pZCB0aHJlYWRfeWllbGQodm9pZCkKK3sKKyAgICBpcnFfc3RhdGVfdCBpcnEgPSBpcnFfc2F2ZSgpOworICAgIF9fc2NoZWR1bGUoKTsKKyAgICBpcnFfcmVzdG9yZShpcnEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS90aHJlYWQvc2VtX2FzbS5TIGIvY29yZS90aHJlYWQvc2VtX2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjc0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3RocmVhZC9zZW1fYXNtLlMKQEAgLTAsMCArMSwxNiBAQAorCS5nbG9ibAlzZW1fZG93bgorCS50eXBlCXNlbV9kb3duLCBAZnVuY3Rpb24KK3NlbV9kb3duOgorCWRlY2wJKCVlYXgpCisJanMJX19zZW1fZG93bl9zbG93CisJeG9ybAklZWF4LCAlZWF4CisJcmV0CisJLnNpemUJc2VtX2Rvd24sIC4tc2VtX2Rvd24KKworCS5nbG9ibAlzZW1fdXAKKwkudHlwZQlzZW1fdXAsIEBmdW5jdGlvbgorc2VtX3VwOgorCWluY2wJKCVlYXgpCisJamxlCV9fc2VtX3VwX3Nsb3cKKwlyZXQKKwkuc2l6ZQlzZW1fdXAsIC4tc2VtX3VwCmRpZmYgLS1naXQgYS9jb3JlL3RocmVhZC9zZW1hcGhvcmUuYyBiL2NvcmUvdGhyZWFkL3NlbWFwaG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWFmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3RocmVhZC9zZW1hcGhvcmUuYwpAQCAtMCwwICsxLDg3IEBACisjaW5jbHVkZSA8c3lzL2NwdS5oPgorI2luY2x1ZGUgInRocmVhZC5oIgorCit2b2lkIHNlbV9pbml0KHN0cnVjdCBzZW1hcGhvcmUgKnNlbSwgaW50IGNvdW50KQoreworICAgIGlmICghIXNlbSkgeworCXNlbS0+bGlzdC5uZXh0ID0gc2VtLT5saXN0LnByZXYgPSAmc2VtLT5saXN0OworCXNlbS0+Y291bnQgPSBjb3VudDsKKyAgICB9Cit9CisKK21zdGltZV90IF9fc2VtX2Rvd25fc2xvdyhzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sIG1zdGltZV90IHRpbWVvdXQpCit7CisgICAgaXJxX3N0YXRlX3QgaXJxOworICAgIG1zdGltZV90IHJ2OworCisgICAgaXJxID0gaXJxX3NhdmUoKTsKKworICAgIGlmICghc2VtX2lzX3ZhbGlkKHNlbSkpIHsKKwlydiA9IC0xOworICAgIH0gZWxzZSBpZiAoc2VtLT5jb3VudCA+PSAwKSB7CisJLyogU29tZXRoaW5nIGFscmVhZHkgZnJlZWQgdGhlIHNlbWFwaG9yZSBvbiB1cyAqLworCXJ2ID0gMDsKKyAgICB9IGVsc2UgaWYgKHRpbWVvdXQgPT0gLTEpIHsKKwkvKiBJbW1lZGlhdGUgdGltZW91dCAqLworCXNlbS0+Y291bnQrKzsKKwlydiA9IC0xOworICAgIH0gZWxzZSB7CisJLyogUHV0IHRoZSB0aHJlYWQgdG8gc2xlZXAuLi4gKi8KKworCXN0cnVjdCB0aHJlYWRfYmxvY2sgYmxvY2s7CisJc3RydWN0IHRocmVhZCAqY3VyciA9IGN1cnJlbnQoKTsKKwltc3RpbWVfdCBub3cgPSBtc190aW1lcigpOworCisJYmxvY2sudGhyZWFkICAgICA9IGN1cnI7CisJYmxvY2suc2VtYXBob3JlICA9IHNlbTsKKwlibG9jay5ibG9ja190aW1lID0gbm93OworCWJsb2NrLnRpbWVvdXQgICAgPSB0aW1lb3V0ID8gbm93K3RpbWVvdXQgOiAwOworCWJsb2NrLnRpbWVkX291dCAgPSBmYWxzZTsKKworCWN1cnItPmJsb2NrZWQgICAgPSAmYmxvY2s7CisKKwkvKiBBZGQgdG8gdGhlIGVuZCBvZiB0aGUgd2FrZXVwIGxpc3QgKi8KKwlibG9jay5saXN0LnByZXYgICAgICAgPSBzZW0tPmxpc3QucHJldjsKKwlibG9jay5saXN0Lm5leHQgICAgICAgPSAmc2VtLT5saXN0OworCXNlbS0+bGlzdC5wcmV2ICAgICAgICA9ICZibG9jay5saXN0OworCWJsb2NrLmxpc3QucHJldi0+bmV4dCA9ICZibG9jay5saXN0OworCisJX19zY2hlZHVsZSgpOworCisJcnYgPSBibG9jay50aW1lZF9vdXQgPyAtMSA6IG1zX3RpbWVyKCkgLSBibG9jay5ibG9ja190aW1lOworICAgIH0KKworICAgIGlycV9yZXN0b3JlKGlycSk7CisgICAgcmV0dXJuIHJ2OworfQorCit2b2lkIF9fc2VtX3VwX3Nsb3coc3RydWN0IHNlbWFwaG9yZSAqc2VtKQoreworICAgIGlycV9zdGF0ZV90IGlycTsKKyAgICBzdHJ1Y3QgdGhyZWFkX2xpc3QgKmw7CisKKyAgICBpcnEgPSBpcnFfc2F2ZSgpOworCisgICAgLyoKKyAgICAgKiBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZXRoaW5nIGRpZCBhIGRvd24gb24gdGhlIHNlbWFwaG9yZSwgYnV0CisgICAgICogZGlkbid0IGdldCB0byBhZGQgdGhlbXNlbHZlcyB0byB0aGUgcXVldWUganVzdCB5ZXQuICBJbiB0aGF0IGNhc2UKKyAgICAgKiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nLCBzaW5jZSB0aGUgYmFpbG91dCBjbGF1c2UgaW4KKyAgICAgKiBfX3NlbV9kb3duX3Nsb3cgd2lsbCB0YWtlIGNhcmUgb2YgaXQuCisgICAgICovCisgICAgaWYgKCEhc2VtKSB7CisJbCA9IHNlbS0+bGlzdC5uZXh0OworCWlmIChsICE9ICZzZW0tPmxpc3QpIHsKKwkgICAgc3RydWN0IHRocmVhZF9ibG9jayAqYmxvY2s7CisJICAgIGJsb2NrID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCB0aHJlYWRfYmxvY2ssIGxpc3QpOworCisJICAgIHNlbS0+bGlzdC5uZXh0ID0gYmxvY2stPmxpc3QubmV4dDsKKwkgICAgYmxvY2stPmxpc3QubmV4dC0+cHJldiA9ICZzZW0tPmxpc3Q7CisKKwkgICAgYmxvY2stPnRocmVhZC0+YmxvY2tlZCA9IE5VTEw7CisKKwkgICAgX19zY2hlZHVsZSgpOworCX0KKyAgICB9CisKKyAgICBpcnFfcmVzdG9yZShpcnEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS90aHJlYWQvc3RhcnRfdGhyZWFkLmMgYi9jb3JlL3RocmVhZC9zdGFydF90aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTQzMjBhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90aHJlYWQvc3RhcnRfdGhyZWFkLmMKQEAgLTAsMCArMSw2OSBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCisjZGVmaW5lIFJFQUxfTU9ERV9TVEFDS19TSVpFCTQwOTYKKyNkZWZpbmUgTUlOX1NUQUNLX1NJWkUJCTE2Mzg0CisjZGVmaW5lIFRIUkVBRF9BTElHTgkJNjQgCS8qIFRocmVhZCBhbGlnbm1lbnQgKi8KKworZXh0ZXJuIHZvaWQgX19zdGFydF90aHJlYWQodm9pZCk7CisKK3N0cnVjdCB0aHJlYWQgKnN0YXJ0X3RocmVhZChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc3RhY2tfc2l6ZSwgaW50IHByaW8sCisJCQkgICAgdm9pZCAoKnN0YXJ0X2Z1bmMpKHZvaWQgKiksIHZvaWQgKmZ1bmNfYXJnKQoreworICAgIGlycV9zdGF0ZV90IGlycTsKKyAgICBzdHJ1Y3QgdGhyZWFkICpjdXJyLCAqdDsKKyAgICBjaGFyICpzdGFjaywgKnJtc3RhY2s7CisgICAgY29uc3Qgc2l6ZV90IHRocmVhZF9tYXNrID0gVEhSRUFEX0FMSUdOIC0gMTsKKyAgICBzdHJ1Y3QgdGhyZWFkX3N0YWNrICpzcDsKKworICAgIGlmIChzdGFja19zaXplIDwgTUlOX1NUQUNLX1NJWkUpCisJc3RhY2tfc2l6ZSA9IE1JTl9TVEFDS19TSVpFOworCisgICAgc3RhY2tfc2l6ZSA9IChzdGFja19zaXplICsgdGhyZWFkX21hc2spICYgfnRocmVhZF9tYXNrOworICAgIHN0YWNrID0gbWFsbG9jKHN0YWNrX3NpemUgKyBzaXplb2Yoc3RydWN0IHRocmVhZCkpOworICAgIGlmICghc3RhY2spCisJcmV0dXJuIE5VTEw7CisgICAgcm1zdGFjayA9IGxtYWxsb2MoUkVBTF9NT0RFX1NUQUNLX1NJWkUpOworICAgIGlmICghcm1zdGFjaykgeworCWZyZWUoc3RhY2spOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHQgPSAoc3RydWN0IHRocmVhZCAqKXN0YWNrOworICAgIG1lbXNldCh0LCAwLCBzaXplb2YgKnQpOworICAgIHQtPnN0YWNrICAgPSBzdGFjazsKKyAgICB0LT5ybXN0YWNrID0gcm1zdGFjazsKKyAgICBzdGFjayArPSBzaXplb2Yoc3RydWN0IHRocmVhZCk7CisKKyAgICAvKiBzcCBhbGxvY2F0ZWQgZnJvbSB0aGUgZW5kIG9mIHRoZSBzdGFjayAqLworICAgIHNwID0gKHN0cnVjdCB0aHJlYWRfc3RhY2sgKikoc3RhY2sgKyBzdGFja19zaXplKSAtIDE7CisgICAgdC0+ZXNwID0gc3A7CisKKyAgICBzcC0+ZXJybm8gPSAwOworICAgIHNwLT5ybXNzID0gU0VHKHJtc3RhY2spOworICAgIHNwLT5ybXNwID0gUkVBTF9NT0RFX1NUQUNLX1NJWkU7CisgICAgc3AtPmVzaSA9IChzaXplX3Qpc3RhcnRfZnVuYzsKKyAgICBzcC0+ZWRpID0gKHNpemVfdClmdW5jX2FyZzsKKyAgICBzcC0+ZWJ4ID0gaXJxX3N0YXRlKCk7CS8qIEluaGVyaXQgdGhlIElSUSBzdGF0ZSBmcm9tIHRoZSBzcGF3bmVyICovCisgICAgc3AtPmVpcCA9IF9fc3RhcnRfdGhyZWFkOworICAgIHQtPnByaW8gPSBwcmlvOworICAgIHQtPm5hbWUgPSBuYW1lOworCisgICAgaXJxID0gaXJxX3NhdmUoKTsKKyAgICBjdXJyID0gY3VycmVudCgpOworCisgICAgdC0+dGhyZWFkX21hZ2ljICAgID0gVEhSRUFEX01BR0lDOworCisgICAgdC0+bGlzdC5wcmV2ICAgICAgID0gJmN1cnItPmxpc3Q7CisgICAgdC0+bGlzdC5uZXh0ICAgICAgID0gY3Vyci0+bGlzdC5uZXh0OworICAgIGN1cnItPmxpc3QubmV4dCAgICA9ICZ0LT5saXN0OworICAgIHQtPmxpc3QubmV4dC0+cHJldiA9ICZ0LT5saXN0OworCisgICAgX19zY2hlZHVsZSgpOworCisgICAgaXJxX3Jlc3RvcmUoaXJxKTsKKyAgICByZXR1cm4gdDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvdGhyZWFkL3RocmVhZF9hc20uUyBiL2NvcmUvdGhyZWFkL3RocmVhZF9hc20uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNlMGFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90aHJlYWQvdGhyZWFkX2FzbS5TCkBAIC0wLDAgKzEsMzcgQEAKKwkuZ2xvYmwJX19zd2l0Y2hfdG8KKwkudHlwZQlfX3N3aXRjaF90bywgQGZ1bmN0aW9uCitfX3N3aXRjaF90bzoKKwltb3ZsCV9fY3VycmVudCwgJWVkeAorCXB1c2hsCSVlYngKKwlwdXNobAklZWJwCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlwdXNobAlSZWFsTW9kZVNTU1AKKwlwdXNobAllcnJubwkJCS8qIEhhY2shICovCisJbW92bAklZXNwLCAoJWVkeCkKKworCW1vdmwJJWVheCwgX19jdXJyZW50CisJbW92bAkoJWVheCksICVlc3AKKwlwb3BsCWVycm5vCisJcG9wbAlSZWFsTW9kZVNTU1AKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYnAKKwlwb3BsCSVlYngKKwlyZXQKKwkuc2l6ZQlfX3N3aXRjaF90bywgLi1fX3N3aXRjaF90bworCisJLmdsb2JsCV9fc3RhcnRfdGhyZWFkCisJLnR5cGUJX19zdGFydF90aHJlYWQsIEBmdW5jdGlvbgorX19zdGFydF90aHJlYWQ6CisJbW92bAklZWRpLCAlZWF4CQkvKiBUaHJlYWQgZnVuY3Rpb24gYXJndW1lbnQgKi8KKworCXB1c2hsCSQwCQkJLyogRm9yIGdkYidzIGJlbmVmaXQgKi8KKwltb3ZsCSVlc3AsICVlYnAJCS8qIEZvciBnZGIncyBiZW5lZml0ICovCisKKwlwdXNobAklZWJ4CQkJLyogU2V0IHVwIHRoZSBmbGFncy9pbnRlcnJ1cHQgc3RhdGUgKi8KKwlwb3BmbAorCisJY2FsbAkqJWVzaQkJCS8qIFJ1biB0aGUgZGVzaXJlZCBmdW5jdGlvbiAqLworCWptcAlfX2V4aXRfdGhyZWFkCQkvKiBJZiB3ZSBnZXQgaGVyZSwga2lsbCB0aGUgdGhyZWFkICovCisJLnNpemUJX19zdGFydF90aHJlYWQsIC4tX19zdGFydF90aHJlYWQKZGlmZiAtLWdpdCBhL2NvcmUvdGhyZWFkL3RpbWVvdXQuYyBiL2NvcmUvdGhyZWFkL3RpbWVvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDlhZDZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90aHJlYWQvdGltZW91dC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiB0aW1lb3V0LmMKKyAqCisgKi8KKworI2luY2x1ZGUgInRocmVhZC5oIgorCisvKgorICogX190aHJlYWRfcHJvY2Vzc190aW1lb3V0cygpCisgKgorICogTG9vayBmb3IgdGhyZWFkcyB0aGF0IGhhdmUgdGltZWQgb3V0LiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkCisgKiB1bmRlciBpbnRlcnJ1cHQgbG9jaywgYmVmb3JlIGNhbGxpbmcgX19zY2hlZHVsZSgpLgorICovCit2b2lkIF9fdGhyZWFkX3Byb2Nlc3NfdGltZW91dHModm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGhyZWFkICpjdXJyID0gY3VycmVudCgpOworICAgIHN0cnVjdCB0aHJlYWRfbGlzdCAqdHA7CisgICAgc3RydWN0IHRocmVhZCAqdDsKKyAgICBtc3RpbWVfdCBub3cgPSBtc190aW1lcigpOworICAgIHN0cnVjdCB0aHJlYWRfYmxvY2sgKmJsb2NrOworICAgIG1zdGltZV90IHRpbWVvdXQ7CisKKyAgICAvKiBUaGUgY3VycmVudCB0aHJlYWQgaXMgb2J2aW91c2x5IHJ1bm5pbmcsIHNvIG5vIG5lZWQgdG8gY2hlY2suLi4gKi8KKyAgICBmb3IgKHRwID0gY3Vyci0+bGlzdC5uZXh0OyB0cCAhPSAmY3Vyci0+bGlzdDsgdHAgPSB0cC0+bmV4dCkgeworCXQgPSBjb250YWluZXJfb2YodHAsIHN0cnVjdCB0aHJlYWQsIGxpc3QpOworCWlmICgoYmxvY2sgPSB0LT5ibG9ja2VkKSAmJiAodGltZW91dCA9IGJsb2NrLT50aW1lb3V0KSkgeworCSAgICBpZiAoKG1zdGltZWRpZmZfdCkodGltZW91dCAtIG5vdykgPD0gMCkgeworCQlzdHJ1Y3Qgc2VtYXBob3JlICpzZW0gPSBibG9jay0+c2VtYXBob3JlOworCQkvKiBSZW1vdmUgdXMgZnJvbSB0aGUgcXVldWUgYW5kIGluY3JlYXNlIHRoZSBjb3VudCAqLworCQlibG9jay0+bGlzdC5uZXh0LT5wcmV2ID0gYmxvY2stPmxpc3QucHJldjsKKwkJYmxvY2stPmxpc3QucHJldi0+bmV4dCA9IGJsb2NrLT5saXN0Lm5leHQ7CisJCXNlbS0+Y291bnQrKzsKKworCQl0LT5ibG9ja2VkID0gTlVMTDsKKwkJYmxvY2stPnRpbWVkX291dCA9IHRydWU7CisKKwkJX19zY2hlZHVsZSgpOwkvKiBOb3JtYWxseSBzZXRzIGp1c3QgX19uZWVkX3NjaGVkdWxlICovCisJICAgIH0KKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90aW1lci5pbmMgYi9jb3JlL3RpbWVyLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDY0Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90aW1lci5pbmMKQEAgLTAsMCArMSw2MCBAQAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCis7OyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOzsKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzs7Cis7OyB0aW1lci5pbmMKKzs7Cis7OyBWZXJ5IHNpbXBsZSBjb3VudGluZyB0aW1lcgorOzsKKzs7IFRoaXMgbGV0cyB1cyBoYXZlIGEgc2ltcGxlIGluY3JlbWVudGluZyB2YXJpYWJsZSB3aXRob3V0IHdvcnJ5aW5nCis7OyBhYm91dCB0aGUgQklPU190aW1lciB2YXJpYWJsZSB3cmFwcGluZyBhcm91bmQgYXQgIm1pZG5pZ2h0IiBhbmQgb3RoZXIKKzs7IHdlaXJkIHRoaW5ncy4KKzs7Cis7OyBUaGlzIGFsc28gbWFpbnRhaW5zIGEgdGltZXIgdmFyaWFibGUgY2FsaWJyYXRlZCBpbiBtaWxsaXNlY29uZHMKKzs7ICh3cmFwYXJvdW5kIHRpbWUgPSA0OS43IGRheXMhKQorOzsKKworCQlzZWN0aW9uIC50ZXh0MTYKKwordGltZXJfaW5pdDoKKwkJOyBIb29rIElOVCAxQ2gKKwkJbW92IGVheCxbQklPU190aW1lcl9ob29rXQorCQltb3YgW0JJT1NfdGltZXJfbmV4dF0sZWF4CisJCW1vdiBkd29yZCBbQklPU190aW1lcl9ob29rXSx0aW1lcl9pcnEKKwkJcmV0CisKKwkJZ2xvYmFsIGJpb3NfdGltZXJfY2xlYW51cDpmdW5jdGlvbiBoaWRkZW4KK2Jpb3NfdGltZXJfY2xlYW51cDoKKwkJOyBVbmhvb2sgSU5UIDFDaAorCQltb3YgZWF4LFtCSU9TX3RpbWVyX25leHRdCisJCW1vdiBbQklPU190aW1lcl9ob29rXSxlYXgKKwkJcmV0CisKKzsKKzsgVGhlIHNwZWNpZmllZCBmcmVxdWVuY3kgaXMgMTQuMzE4MTggTUh6LzEyLzY1NTM2OyB0aGlzIHR1cm5zIG91dAorOyB0byBiZSBhIHBlcmlvZCBvZiA1NC45MjU0MiBtcywgb3IgMHgzNi5lY2U4KDE4N2MpIGhleGFkZWNpbWFsLgorOworCQlnbG9iYWwgdGltZXJfaXJxOmZ1bmN0aW9uIGhpZGRlbgordGltZXJfaXJxOgorCQlpbmMgZHdvcmQgW2NzOl9famlmZmllc10KKwkJYWRkIHdvcmQgIFtjczpfX21zX3RpbWVyX2Fkal0sMHhlY2U4CisJCWFkYyBkd29yZCBbY3M6X19tc190aW1lcl0sMHgzNgorCQlqbXAgMDowCisJCWdsb2JhbCBCSU9TX3RpbWVyX25leHQ6ZGF0YSBoaWRkZW4KK0JJT1NfdGltZXJfbmV4dAllcXUgJC00CisKKwkJc2VjdGlvbiAuZGF0YTE2CisJCWFsaWdueiA0CisJCWdsb2JhbCBfX2ppZmZpZXM6ZGF0YSBoaWRkZW4sIF9fbXNfdGltZXIKK19famlmZmllcwlkZCAwCQkJOyBDbG9jayB0aWNrIHRpbWVyCitfX21zX3RpbWVyCWRkIDAJCQk7IE1pbGxpc2Vjb25kIHRpbWVyCitfX21zX3RpbWVyX2FkaglkdyAwCQkJOyBNaWxsaXNlY29uZCB0aW1lciBjb3JyZWN0aW9uIGZhY3RvcgpkaWZmIC0tZ2l0IGEvY29yZS90cmFjZXJzLmluYyBiL2NvcmUvdHJhY2Vycy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxMjA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdHJhY2Vycy5pbmMKQEAgLTAsMCArMSw0MCBAQAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKzs7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IHRyYWNlcnMuaW5jCis7OworOzsgRGVidWdnaW5nIHRyYWNlcnMKKzs7CisKKyVpZm5kZWYgX1RSQUNFUlNfSU5DCislZGVmaW5lIF9UUkFDRVJTX0lOQworCis7IE5vdGU6IFRoZSBNYWtlZmlsZSBidWlsZHMgb25lIHZlcnNpb24gd2l0aCBERUJVR19NRVNTQUdFUyBhdXRvbWF0aWNhbGx5LgorOyAlZGVmaW5lIERFQlVHX1RSQUNFUlMgMQkJOyBVbmNvbW1lbnQgdG8gZ2V0IGRlYnVnZ2luZyB0cmFjZXJzCis7ICVkZWZpbmUgREVCVUdfTUVTU0FHRVMJCTsgVW5jb21tZW50IHRvIGdldCBkZWJ1Z2dpbmcgbWVzc2FnZXMKKworJWlmZGVmIERFQlVHX1RSQUNFUlMKKworJW1hY3JvIFRSQUNFUgkxCisJY2FsbCBkZWJ1Z190cmFjZXIKKwlkYiAlMQorJWVuZG1hY3JvCisKKyVlbHNlCTsgREVCVUdfVFJBQ0VSUworCislbWFjcm8JVFJBQ0VSCTEKKyVlbmRtYWNybworCislZW5kaWYJOyBERUJVR19UUkFDRVJTCisKKyVlbmRpZiA7IF9UUkFDRVJTX0lOQwpkaWZmIC0tZ2l0IGEvY29yZS93cml0ZWRlYy5pbmMgYi9jb3JlL3dyaXRlZGVjLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU0Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS93cml0ZWRlYy5pbmMKQEAgLTAsMCArMSw1OCBAQAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKzs7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IHdyaXRlZGVjLmluYworOzsKKzs7IFdyaXRlIGRlY2ltYWwgbnVtYmVycyB0byB0aGUgY29uc29sZQorOzsKKworCQlzZWN0aW9uIC50ZXh0MTYKKzsKKzsgd3JpdGVkZWNbYndsXTogV3JpdGUgYW4gdW5zaWduZWQgZGVjaW1hbCBudW1iZXIgaW4gKEFMLCBBWCwgRUFYKQorOyAgICAgICAgICAgICAgICB0byB0aGUgY29uc29sZQorOword3JpdGVkZWNiOgorCQlwdXNoYWQKKwkJbW92enggZWF4LGFsCisJCWptcCBzaG9ydCB3cml0ZWRlY19jb21tb24KK3dyaXRlZGVjdzoKKwkJcHVzaGFkCisJCW1vdnp4IGVheCxheAorCQlqbXAgc2hvcnQgd3JpdGVkZWNfY29tbW9uCit3cml0ZWRlY2w6CisJCXB1c2hhZAord3JpdGVkZWNfY29tbW9uOgorCQlwdXNoZmQKKwkJbW92IGVieCwxMAkJOyBDb252ZXJzaW9uIGJhc2UKKwkJeG9yIGN4LGN4CQk7IE51bWJlciBvZiBkaWdpdHMKKworLmNsb29wOgorCQltb3YgZWR4LDAKKwkJZGl2IGVieAorCQlpbmMgY3gKKwkJcHVzaCBkeAorCQlhbmQgZWF4LGVheAorCQlqbnogLmNsb29wCisKKy5kbG9vcDoKKwkJcG9wIGF4CisJCWFkZCBhbCwnMCcKKwkJY2FsbCB3cml0ZWNocgorCQlsb29wIC5kbG9vcAorCisJCXBvcGZkCisJCXBvcGFkCisJCXJldAorCis7IHdyaXRlY2hyOgorOyAJCXJldApkaWZmIC0tZ2l0IGEvY29yZS93cml0ZWhleC5jIGIvY29yZS93cml0ZWhleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTI3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3dyaXRlaGV4LmMKQEAgLTAsMCArMSw3MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgPGNvcmUuaD4KKworLyoKKyAqIHdyaXRlaGV4LmMKKyAqCisgKiBXcml0ZSBoZXhhZGVjaW1hbCBudW1iZXJzIHRvIHRoZSBjb25zb2xlCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3dyaXRlaGV4KHVpbnQzMl90IGgsIGludCBkaWdpdHMpCit7CisJd2hpbGUgKGRpZ2l0cykgeworCQl1aW50OF90IHNoaWZ0OworCQl1aW50OF90IGFsOworCisJCXNoaWZ0ID0gLS1kaWdpdHM7CisJCWFsID0gKChoICYgMHgwZiA8PCBzaGlmdCkgPj4gc2hpZnQpOworCQlpZiAoYWwgPCAxMCkKKwkJCWFsICs9ICcwJzsKKwkJZWxzZQorCQkJYWwgKz0gJ0EnIC0gMTA7CisKKwkJd3JpdGVjaHIoYWwpOworCX0KK30KKworLyoKKyAqIHdyaXRlaGV4WzI0OF06IFdyaXRlIGEgaGV4IG51bWJlciBpbiAoQUwsIEFYLCBFQVgpIHRvIHRoZSBjb25zb2xlCisgKi8KK3ZvaWQgd3JpdGVoZXgyKHVpbnQzMl90IGgpCit7CisJX193cml0ZWhleChoLCAyKTsKK30KKwordm9pZCB3cml0ZWhleDQodWludDhfdCBoKQoreworCV9fd3JpdGVoZXgoaCwgNCk7Cit9CisKK3ZvaWQgd3JpdGVoZXg4KHVpbnQ4X3QgaCkKK3sKKwlfX3dyaXRlaGV4KGgsIDgpOworfQorCit2b2lkIHBtX3dyaXRlaGV4Mihjb20zMnN5c190ICpyZWdzKQoreworCXdyaXRlaGV4MihyZWdzLT5lYXguYlswXSk7Cit9CisKK3ZvaWQgcG1fd3JpdGVoZXg0KGNvbTMyc3lzX3QgKnJlZ3MpCit7CisJd3JpdGVoZXg0KHJlZ3MtPmVheC53WzBdKTsKK30KKwordm9pZCBwbV93cml0ZWhleDgoY29tMzJzeXNfdCAqcmVncykKK3sKKwl3cml0ZWhleDgocmVncy0+ZWF4LmwpOworfQpkaWZmIC0tZ2l0IGEvY29yZS93cml0ZWhleC5pbmMgYi9jb3JlL3dyaXRlaGV4LmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJmODZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS93cml0ZWhleC5pbmMKQEAgLTAsMCArMSw1MiBAQAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7OworOzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKzs7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzs7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7OworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOzsKKzs7IHdyaXRlaGV4LmluYworOzsKKzs7IFdyaXRlIGhleGFkZWNpbWFsIG51bWJlcnMgdG8gdGhlIGNvbnNvbGUKKzs7CisKKzsKKzsgd3JpdGVoZXhbMjQ4XTogV3JpdGUgYSBoZXggbnVtYmVyIGluIChBTCwgQVgsIEVBWCkgdG8gdGhlIGNvbnNvbGUKKzsKK3dyaXRlaGV4MjoKKwkJcHVzaGZkCisJCXB1c2hhZAorCQlyb2wgZWF4LDI0CisJCW1vdiBjeCwyCisJCWptcCBzaG9ydCB3cml0ZWhleF9jb21tb24KK3dyaXRlaGV4NDoKKwkJcHVzaGZkCisJCXB1c2hhZAorCQlyb2wgZWF4LDE2CisJCW1vdiBjeCw0CisJCWptcCBzaG9ydCB3cml0ZWhleF9jb21tb24KK3dyaXRlaGV4ODoKKwkJcHVzaGZkCisJCXB1c2hhZAorCQltb3YgY3gsOAord3JpdGVoZXhfY29tbW9uOgorLmxvb3A6CQlyb2wgZWF4LDQKKwkJcHVzaCBlYXgKKwkJYW5kIGFsLDBGaAorCQljbXAgYWwsMTAKKwkJamFlIC5oaWdoCisubG93OgkJYWRkIGFsLCcwJworCQlqbXAgc2hvcnQgLmlzY2hhcgorLmhpZ2g6CQlhZGQgYWwsJ0EnLTEwCisuaXNjaGFyOgljYWxsIHdyaXRlY2hyCisJCXBvcCBlYXgKKwkJbG9vcCAubG9vcAorCQlwb3BhZAorCQlwb3BmZAorCQlyZXQKZGlmZiAtLWdpdCBhL2NvcmUvd3JpdGVzdHIuYyBiL2NvcmUvd3JpdGVzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjlkZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS93cml0ZXN0ci5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgQ29weXJpZ2h0IDE5OTQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiB3cml0ZXN0ci5jCisgKgorICogQ29kZSB0byB3cml0ZSBhIHNpbXBsZSBzdHJpbmcuCisgKi8KKyNpbmNsdWRlIDxjb20zMi5oPgorI2luY2x1ZGUgPGNvcmUuaD4KKworLyoKKyAqIGNybGY6IFByaW50IGEgbmV3bGluZQorICovCit2b2lkIGNybGYodm9pZCkKK3sKKwl3cml0ZWNocignXHInKTsKKwl3cml0ZWNocignXG4nKTsKK30KKworLyoKKyAqIHdyaXRlc3RyOiB3cml0ZSBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbnNvbGUsIHNhdmluZworICogICAgICAgICAgICByZWdpc3RlcnMgb24gZW50cnkuCisgKgorICogTm90ZTogd3JpdGVzdHJfZWFybHkgYW5kIHdyaXRlc3RyIGFyZSBkaXN0aW5jdCBpbgorICogU1lTTElOVVggYW5kIEVYVExJTlVYLCBidXQgbm90IFBYRUxJTlVYIGFuZCBJU09MSU5VWAorICovCit2b2lkIHdyaXRlc3RyKGNoYXIgKnN0cikKK3sKKwl3aGlsZSAoKnN0cikKKwkJd3JpdGVjaHIoKnN0cisrKTsKK30KKwordm9pZCBwbV93cml0ZXN0cihjb20zMnN5c190ICpyZWdzKQoreworCXdyaXRlc3RyKE1LX1BUUihyZWdzLT5kcywgcmVncy0+ZXNpLndbMF0pKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUveDg2XzY0L3N5c2xpbnV4LmxkIGIvY29yZS94ODZfNjQvc3lzbGludXgubGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1NzExMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUveDg2XzY0L3N5c2xpbnV4LmxkCkBAIC0wLDAgKzEsNDI4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAKKyAqICAgQ29weXJpZ2h0IDIwMDgtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIExpbmtlciBzY3JpcHQgZm9yIHRoZSBTWVNMSU5VWCBjb3JlCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFWFRFUk4oX3N0YXJ0KQorRU5UUlkoX3N0YXJ0KQorCitTVEFDSzMyX0xFTiA9IDY1NTM2OworCitTRUNUSU9OUworeworCS8qIFByZWZpeCBzdHJ1Y3R1cmUgZm9yIHRoZSBjb21wcmVzc2lvbiBwcm9ncmFtICovCisJLiA9IDA7CisJX19tb2R1bGVfc3RhcnQgPSAuOworCS5wcmVmaXggOiB7CisJCSooLnByZWZpeCkKKwl9CisKKwkvKiAiRWFybHkiIHNlY3Rpb25zIChiZWZvcmUgdGhlIGxvYWQpICovCisJLiA9IDB4MTAwMDsKKworCS5lYXJseWJzcyAoTk9MT0FEKSA6IHsKKwkJX19lYXJseWJzc19zdGFydCA9IC47CisJCSooLmVhcmx5YnNzKQorCQlfX2Vhcmx5YnNzX2VuZCA9IC47CisJfQorCV9fZWFybHlic3NfbGVuID0gQUJTT0xVVEUoX19lYXJseWJzc19lbmQpIC0gQUJTT0xVVEUoX19lYXJseWJzc19zdGFydCk7CisJX19lYXJseWJzc19kd29yZHMgPSAoX19lYXJseWJzc19sZW4gKyAzKSA+PiAyOworCisJLiA9IEFMSUdOKDQpOworCS5ic3MxNiAoTk9MT0FEKSA6IHsKKwkJX19ic3MxNl9zdGFydCA9IC47CisJCSooLmJzczE2KQorCQlfX2JzczE2X2VuZCA9IC47CisJfQorCV9fYnNzMTZfbGVuID0gQUJTT0xVVEUoX19ic3MxNl9lbmQpIC0gQUJTT0xVVEUoX19ic3MxNl9zdGFydCk7CisJX19ic3MxNl9kd29yZHMgPSAoX19ic3MxNl9sZW4gKyAzKSA+PiAyOworCisJLiA9IEFMSUdOKDQpOworIAkuY29uZmlnIDogQVQgKF9fY29uZmlnX2xtYSkgeworCQlfX2NvbmZpZ19zdGFydCA9IC47CisJCSooLmNvbmZpZykKKwkJX19jb25maWdfZW5kID0gLjsKKwl9CisJX19jb25maWdfbGVuID0gQUJTT0xVVEUoX19jb25maWdfZW5kKSAtIEFCU09MVVRFKF9fY29uZmlnX3N0YXJ0KTsKKwlfX2NvbmZpZ19kd29yZHMgPSAoX19jb25maWdfbGVuICsgMykgPj4gMjsKKworCS8qIEdlbmVyYXRlZCBhbmQvb3IgY29waWVkIGNvZGUgKi8KKworCS4gPSBBTElHTigxMjgpOwkJLyogTWluaW11bSBzZXBhcmF0aW9uIGZyb20gbXV0YWJsZSBkYXRhICovCisgCS5yZXBsYWNlc3R1YiA6IEFUIChfX3JlcGxhY2VzdHViX2xtYSkgeworCQlfX3JlcGxhY2VzdHViX3N0YXJ0ID0gLjsKKwkJKigucmVwbGFjZXN0dWIpCisJCV9fcmVwbGFjZXN0dWJfZW5kID0gLjsKKwl9CisJX19yZXBsYWNlc3R1Yl9sZW4gPSBBQlNPTFVURShfX3JlcGxhY2VzdHViX2VuZCkgLSBBQlNPTFVURShfX3JlcGxhY2VzdHViX3N0YXJ0KTsKKwlfX3JlcGxhY2VzdHViX2R3b3JkcyA9IChfX3JlcGxhY2VzdHViX2xlbiArIDMpID4+IDI7CisKKwkuID0gQUxJR04oMTYpOworCV9fZ2VudGV4dG5yX2xtYSA9IC47CisJLmdlbnRleHRuciA6IEFUKF9fZ2VudGV4dG5yX2xtYSkgeworCQlfX2dlbnRleHRucl9zdGFydCA9IC47CisJCSooLmdlbnRleHRucikKKwkJX19nZW50ZXh0bnJfZW5kID0gLjsKKwl9CisJX19nZW50ZXh0bnJfbGVuID0gQUJTT0xVVEUoX19nZW50ZXh0bnJfZW5kKSAtIEFCU09MVVRFKF9fZ2VudGV4dG5yX3N0YXJ0KTsKKwlfX2dlbnRleHRucl9kd29yZHMgPSAoX19nZW50ZXh0bnJfbGVuICsgMykgPj4gMjsKKworCS4gPSBTVEFDS19CQVNFOworCS5zdGFjazE2IDogQVQoU1RBQ0tfQkFTRSkgeworCQlfX3N0YWNrMTZfc3RhcnQgPSAuOworCQkuICs9IFNUQUNLX0xFTjsKKwkJX19zdGFjazE2X2VuZCA9IC47CisJfQorCV9fc3RhY2sxNl9sZW4gPSBBQlNPTFVURShfX3N0YWNrMTZfZW5kKSAtIEFCU09MVVRFKF9fc3RhY2sxNl9zdGFydCk7CisJX19zdGFjazE2X2R3b3JkcyA9IChfX3N0YWNrMTZfbGVuICsgMykgPj4gMjsKKworCS8qIEluaXRpYWxpemVkIHNlY3Rpb25zICovCisKKwkuID0gMHg3YzAwOworCS5pbml0IDogeworCQlGSUxMKDB4OTA5MDkwOTApCisJCV9faW5pdF9zdGFydCA9IC47CisJCSooLmluaXQpCisJCV9faW5pdF9lbmQgPSAuOworCX0KKwlfX2luaXRfbGVuID0gQUJTT0xVVEUoX19pbml0X2VuZCkgLSBBQlNPTFVURShfX2luaXRfc3RhcnQpOworCV9faW5pdF9kd29yZHMgPSAoX19pbml0X2xlbiArIDMpID4+IDI7CisKKwkudGV4dDE2IDogeworCQlGSUxMKDB4OTA5MDkwOTApCisJCV9fdGV4dDE2X3N0YXJ0ID0gLjsKKwkJKigudGV4dDE2KQorCQlfX3RleHQxNl9lbmQgPSAuOworCX0KKwlfX3RleHQxNl9sZW4gPSBBQlNPTFVURShfX3RleHQxNl9lbmQpIC0gQUJTT0xVVEUoX190ZXh0MTZfc3RhcnQpOworCV9fdGV4dDE2X2R3b3JkcyA9IChfX3RleHQxNl9sZW4gKyAzKSA+PiAyOworCisJLyoKKwkgKiAudGV4dG5yIGlzIHVzZWQgZm9yIDMyLWJpdCBjb2RlIHRoYXQgaXMgdXNlZCBvbiB0aGUgY29kZQorCSAqIHBhdGggdG8gaW5pdGlhbGl6ZSB0aGUgLnRleHQgc2VnbWVudAorCSAqLworCS4gPSBBTElHTigxNik7CisJLnRleHRuciA6IHsKKwkJRklMTCgweDkwOTA5MDkwKQorCQlfX3RleHRucl9zdGFydCA9IC47CisJCSooLnRleHRucikKKwkJX190ZXh0bnJfZW5kID0gLjsKKwl9CisJX190ZXh0bnJfbGVuID0gQUJTT0xVVEUoX190ZXh0bnJfZW5kKSAtIEFCU09MVVRFKF9fdGV4dG5yX3N0YXJ0KTsKKwlfX3RleHRucl9kd29yZHMgPSAoX190ZXh0bnJfbGVuICsgMykgPj4gMjsKKworCS4gPSBBTElHTigxNik7CisJX19iY29weXh4X3N0YXJ0ID0gLjsKKworCS5iY29weXh4LnRleHQgOiB7CisJCUZJTEwoMHg5MDkwOTA5MCkKKwkJX19iY29weXh4X3RleHRfc3RhcnQgPSAuOworCQkqKC5iY29weXh4LnRleHQpCisJCV9fYmNvcHl4eF90ZXh0X2VuZCA9IC47CisJfQorCV9fYmNvcHl4eF90ZXh0X2xlbiA9IEFCU09MVVRFKF9fYmNvcHl4eF90ZXh0X2VuZCkgLSBBQlNPTFVURShfX2Jjb3B5eHhfdGV4dF9zdGFydCk7CisJX19iY29weXh4X3RleHRfZHdvcmRzID0gKF9fYmNvcHl4eF90ZXh0X2xlbiArIDMpID4+IDI7CisKKwkuYmNvcHl4eC5kYXRhIDogeworCQlfX2Jjb3B5eHhfZGF0YV9zdGFydCA9IC47CisJCSooLmJjb3B5eHgudGV4dCkKKwkJX19iY29weXh4X2RhdGFfZW5kID0gLjsKKwl9CisJX19iY29weXh4X2RhdGFfbGVuID0gQUJTT0xVVEUoX19iY29weXh4X2RhdGFfZW5kKSAtIEFCU09MVVRFKF9fYmNvcHl4eF9kYXRhX3N0YXJ0KTsKKwlfX2Jjb3B5eHhfZGF0YV9kd29yZHMgPSAoX19iY29weXh4X2RhdGFfbGVuICsgMykgPj4gMjsKKworCV9fYmNvcHl4eF9lbmQgPSAuOworCV9fYmNvcHl4eF9sZW4gPSBBQlNPTFVURShfX2Jjb3B5eHhfZW5kKSAtIEFCU09MVVRFKF9fYmNvcHl4eF9zdGFydCk7CisJX19iY29weXh4X2R3b3JkcyA9IChfX2Jjb3B5eHhfbGVuICsgMykgPj4gMjsKKworCS4gPSBBTElHTig0KTsKKwkuZGF0YTE2IDogeworCSAgICAgIF9fZGF0YTE2X3N0YXJ0ID0gLjsKKwkgICAgICAqKC5kYXRhMTYpCisJICAgICAgX19kYXRhMTZfZW5kID0gLjsKKwl9CisJX19kYXRhMTZfbGVuID0gQUJTT0xVVEUoX19kYXRhMTZfZW5kKSAtIEFCU09MVVRFKF9fZGF0YTE2X3N0YXJ0KTsKKwlfX2RhdGExNl9kd29yZHMgPSAoX19kYXRhMTZfbGVuICsgMykgPj4gMjsKKworCS4gPSBBTElHTig0KTsKKwlfX2NvbmZpZ19sbWEgPSAuOworCS4gKz0gU0laRU9GKC5jb25maWcpOworCisJLiA9IEFMSUdOKDQpOworCV9fcmVwbGFjZXN0dWJfbG1hID0gLjsKKwkuICs9IFNJWkVPRigucmVwbGFjZXN0dWIpOworCisJLyogVGhlIDMyLWJpdCBjb2RlIGxvYWRzIGFib3ZlIHRoZSBub24tcHJvZ2JpdHMgc2VjdGlvbnMgKi8KKworCS4gPSBBTElHTigxNik7CisJX19wbV9jb2RlX2xtYSA9IC47CisKKwlfX2hpZ2hfY2xlYXJfc3RhcnQgPSAuOworCisJLiA9IEFMSUdOKDUxMik7CisJLmFkdiAoTk9MT0FEKSA6IHsKKwkJX19hZHZfc3RhcnQgPSAuOworCQkqKC5hZHYpCisJCV9fYWR2X2VuZCA9IC47CisJfQorCV9fYWR2X2xlbiA9IEFCU09MVVRFKF9fYWR2X2VuZCkgLSBBQlNPTFVURShfX2Fkdl9zdGFydCk7CisJX19hZHZfZHdvcmRzID0gKF9fYWR2X2xlbiArIDMpID4+IDI7CisKKwkvKiBMYXRlIHVuaW5pdGlhbGl6ZWQgc2VjdGlvbnMgKi8KKworCS4gPSBBTElHTig0KTsKKwkudWlic3MgKE5PTE9BRCkgOiB7CisJCV9fdWlic3Nfc3RhcnQgPSAuOworCQkqKC51aWJzcykKKwkJX191aWJzc19lbmQgPSAuOworCX0KKwlfX3VpYnNzX2xlbiA9IEFCU09MVVRFKF9fdWlic3NfZW5kKSAtIEFCU09MVVRFKF9fdWlic3Nfc3RhcnQpOworCV9fdWlic3NfZHdvcmRzID0gKF9fdWlic3NfbGVuICsgMykgPj4gMjsKKworCV9lbmQxNiA9IC47CisJX19hc3NlcnRfZW5kMTYgPSBBU1NFUlQoX2VuZDE2IDw9IDB4MTAwMDAsICI2NEsgb3ZlcmZsb3ciKTsKKworCS8qCisJICogU3BlY2lhbCAxNi1iaXQgc2VnbWVudHMKKwkgKi8KKworCS4gPSBBTElHTig2NTUzNik7CisJLnJlYWxfbW9kZSAoTk9MT0FEKSA6IHsKKwkJKigucmVhbF9tb2RlKQorCX0KKwlyZWFsX21vZGVfc2VnID0gY29yZV9yZWFsX21vZGUgPj4gNDsKKworCS4gPSBBTElHTig2NTUzNik7CisJLnhmZXJfYnVmIChOT0xPQUQpIDogeworCQkqKC54ZmVyX2J1ZikKKwl9CisJeGZlcl9idWZfc2VnID0gY29yZV94ZmVyX2J1ZiA+PiA0OworCisJLyoKKwkgKiBUaGUgYXV4aWxsaWFyeSBkYXRhIHNlZ21lbnQgaXMgdXNlZCBieSB0aGUgMTYtYml0IGNvZGUKKwkgKiBmb3IgaXRlbXMgdGhhdCBkb24ndCBuZWVkIHRvIGxpdmUgaW4gdGhlIGJvdHRvbSA2NEsuCisJICovCisKKwkuID0gQUxJR04oMTYpOworCS5hdXhzZWcgKE5PTE9BRCkgOiB7CisJCV9fYXV4c2VnX3N0YXJ0ID0gLjsKKwkJKiguYXV4c2VnKQorCQlfX2F1eHNlZ19lbmQgPSAuOworCX0KKwlfX2F1eHNlZ19sZW4gPSBBQlNPTFVURShfX2F1eHNlZ19lbmQpIC0gQUJTT0xVVEUoX19hdXhzZWdfc3RhcnQpOworCV9fYXV4c2VnX2R3b3JkcyA9IChfX2F1eHNlZ19sZW4gKyAzKSA+PiAyOworCWF1eF9zZWcgPSBfX2F1eHNlZ19zdGFydCA+PiA0OworCisJLyoKKwkgKiBVc2VkIHRvIGFsbG9jYXRlIGxvd21lbSBidWZmZXJzIGZyb20gMzItYml0IGNvZGUKKwkgKi8KKwkubG93bWVtIChOT0xPQUQpIDogeworCQlfX2xvd21lbV9zdGFydCA9IC47CisJCSooLmxvd21lbSkKKwkJX19sb3dtZW1fZW5kID0gLjsKKwl9CisJX19sb3dtZW1fbGVuID0gQUJTT0xVVEUoX19sb3dtZW1fZW5kKSAtIEFCU09MVVRFKF9fbG93bWVtX3N0YXJ0KTsKKwlfX2xvd21lbV9kd29yZHMgPSAoX19sb3dtZW1fbGVuICsgMykgPj4gMjsKKworCV9faGlnaF9jbGVhcl9lbmQgPSAuOworCisJX19oaWdoX2NsZWFyX2xlbiA9IEFCU09MVVRFKF9faGlnaF9jbGVhcl9lbmQpIC0gQUJTT0xVVEUoX19oaWdoX2NsZWFyX3N0YXJ0KTsKKwlfX2hpZ2hfY2xlYXJfZHdvcmRzID0gKF9faGlnaF9jbGVhcl9sZW4gKyAzKSA+PiAyOworCisJLyogU3RhcnQgb2YgdGhlIGxvd21lbSBoZWFwICovCisJLiA9IEFMSUdOKDE2KTsKKwlfX2xvd21lbV9oZWFwID0gLjsKKworCS8qCisJICogMzItYml0IGNvZGUuICBUaGlzIGlzIGEgaGFjayBmb3IgdGhlIG1vbWVudCBkdWUgdG8gdGhlCisJICogcmVhbC1tb2RlIHNlZ21lbnRzIGFsc28gYWxsb2NhdGVkLgorCSAqLworCisJLiA9IDB4MTAwMDAwOworCisJX19wbV9jb2RlX3N0YXJ0ID0gLjsKKworCV9fdGV4dF92bWEgPSAuOworCV9fdGV4dF9sbWEgPSBfX3BtX2NvZGVfbG1hOworCS50ZXh0IDogQVQoX190ZXh0X2xtYSkgeworCQlGSUxMKDB4OTA5MDkwOTApCisJCV9fdGV4dF9zdGFydCA9IC47CisJCSooLnRleHQpCisJCSooLnRleHQuKikKKwkJX190ZXh0X2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDE2KTsKKworCV9fcm9kYXRhX3ZtYSA9IC47CisJX19yb2RhdGFfbG1hID0gX19yb2RhdGFfdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWE7CisJLnJvZGF0YSA6IEFUKF9fcm9kYXRhX2xtYSkgeworCQlfX3JvZGF0YV9zdGFydCA9IC47CisJCSooLnJvZGF0YSkKKwkJKigucm9kYXRhLiopCisJCV9fcm9kYXRhX2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDQpOworCisJX19jdG9yc192bWEgPSAuOworCV9fY3RvcnNfbG1hID0gX19jdG9yc192bWEgKyBfX3RleHRfbG1hIC0gX190ZXh0X3ZtYTsKKwkuY3RvcnMgOiBBVChfX2N0b3JzX2xtYSkgeworCQlfX2N0b3JzX3N0YXJ0ID0gLjsKKwkJS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisJCUtFRVAgKCooLmN0b3JzKSkKKwkJX19jdG9yc19lbmQgPSAuOworCX0KKworCV9fZHRvcnNfdm1hID0gLjsKKwlfX2R0b3JzX2xtYSA9IF9fZHRvcnNfdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWE7CisJLmR0b3JzIDogQVQoX19kdG9yc19sbWEpIHsKKwkJX19kdG9yc19zdGFydCA9IC47CisJCUtFRVAgKCooU09SVCguZHRvcnMuKikpKQorCQlLRUVQICgqKC5kdG9ycykpCisJCV9fZHRvcnNfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oNCk7CisKKwlfX2R5bnN5bV92bWEgPSAuOworCV9fZHluc3ltX2xtYSA9IF9fZHluc3ltX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hOworCS5keW5zeW0gOiBBVChfX2R5bnN5bV9sbWEpIHsKKwkJX19keW5zeW1fc3RhcnQgPSAuOworCQkqKC5keW5zeW0pCisJCV9fZHluc3ltX2VuZCA9IC47CisJfQorCV9fZHluc3ltX2xlbiA9IF9fZHluc3ltX2VuZCAtIF9fZHluc3ltX3N0YXJ0OworCisJLiA9IEFMSUdOKDQpOworCisJX19keW5zdHJfdm1hID0gLjsKKwlfX2R5bnN0cl9sbWEgPSBfX2R5bnN0cl92bWEgKyBfX3RleHRfbG1hIC0gX190ZXh0X3ZtYTsKKwkuZHluc3RyIDogQVQoX19keW5zdHJfbG1hKSB7CisJCV9fZHluc3RyX3N0YXJ0ID0gLjsKKwkJKiguZHluc3RyKQorCQlfX2R5bnN0cl9lbmQgPSAuOworCX0KKwlfX2R5bnN0cl9sZW4gPSBfX2R5bnN0cl9lbmQgLSBfX2R5bnN0cl9zdGFydDsKKworCS4gPSBBTElHTig0KTsKKworCV9fZ251X2hhc2hfdm1hID0gLjsKKwlfX2dudV9oYXNoX2xtYSA9IF9fZ251X2hhc2hfdm1hICsgX190ZXh0X2xtYSAtIF9fdGV4dF92bWE7CisJLmdudS5oYXNoIDogQVQoX19nbnVfaGFzaF9sbWEpIHsKKwkJX19nbnVfaGFzaF9zdGFydCA9IC47CisJCSooLmdudS5oYXNoKQorCQlfX2dudV9oYXNoX2VuZCA9IC47CisJfQorCisKKwkuID0gQUxJR04oNCk7CisKKwlfX2R5bmxpbmtfdm1hID0gLjsKKwlfX2R5bmxpbmtfbG1hID0gX19keW5saW5rX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hOworCS5keW5saW5rIDogQVQoX19keW5saW5rX2xtYSkgeworCQlfX2R5bmxpbmtfc3RhcnQgPSAuOworCQkqKC5keW5saW5rKQorCQlfX2R5bmxpbmtfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oNCk7CisKKwlfX2dvdF92bWEgPSAuOworCV9fZ290X2xtYSA9IF9fZ290X3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hOworCS5nb3QgOiBBVChfX2dvdF9sbWEpIHsKKwkJX19nb3Rfc3RhcnQgPSAuOworCQlLRUVQICgqKC5nb3QucGx0KSkKKwkJS0VFUCAoKiguZ290KSkKKwkJX19nb3RfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oNCk7CisKKwlfX2R5bmFtaWNfdm1hID0gLjsKKwlfX2R5bmFtaWNfbG1hID0gX19keW5hbWljX3ZtYSArIF9fdGV4dF9sbWEgLSBfX3RleHRfdm1hOworCS5keW5hbWljIDogQVQoX19keW5hbWljX2xtYSkgeworCQlfX2R5bmFtaWNfc3RhcnQgPSAuOworCQkqKC5keW5hbWljKQorCQlfX2R5bmFtaWNfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMTYpOworCisJX19kYXRhX3ZtYSA9IC47CisJX19kYXRhX2xtYSA9IF9fZGF0YV92bWEgKyBfX3RleHRfbG1hIC0gX190ZXh0X3ZtYTsKKwkuZGF0YSA6IEFUKF9fZGF0YV9sbWEpIHsKKwkJX19kYXRhX3N0YXJ0ID0gLjsKKwkJKiguZGF0YSkKKwkJKiguZGF0YS4qKQorCQlfX2RhdGFfZW5kID0gLjsKKwl9CisKKwlfX3BtX2NvZGVfZW5kID0gLjsKKwlfX3BtX2NvZGVfbGVuID0gQUJTT0xVVEUoX19wbV9jb2RlX2VuZCkgLSBBQlNPTFVURShfX3BtX2NvZGVfc3RhcnQpOworCV9fcG1fY29kZV9kd29yZHMgPSAoX19wbV9jb2RlX2xlbiArIDMpID4+IDI7CisKKwkuID0gQUxJR04oMTI4KTsKKwkKKwlfX2Jzc192bWEgPSAuOworCV9fYnNzX2xtYSA9IC47CQkvKiBEdW1teSAqLworCS5ic3MgKE5PTE9BRCkgOiBBVCAoX19ic3NfbG1hKSB7CisJCV9fYnNzX3N0YXJ0ID0gLjsKKwkJKiguYnNzKQorCQkqKC5ic3MuKikKKwkJKihDT01NT04pCisJCV9fYnNzX2VuZCA9IC47CisJfQorCV9fYnNzX2xlbiA9IEFCU09MVVRFKF9fYnNzX2VuZCkgLSBBQlNPTFVURShfX2Jzc19zdGFydCk7CisJX19ic3NfZHdvcmRzID0gKF9fYnNzX2xlbiArIDMpID4+IDI7CisKKwkvKiBWZXJ5IGxhcmdlIG9iamVjdHMgd2hpY2ggZG9uJ3QgbmVlZCB0byBiZSB6ZXJvZWQgKi8KKworCV9faHVnZWJzc192bWEgPSAuOworCV9faHVnZWJzc19sbWEgPSAuOwkJLyogRHVtbXkgKi8KKwkuaHVnZWJzcyAoTk9MT0FEKSA6IEFUIChfX2h1Z2Vic3NfbG1hKSB7CisJCV9faHVnZWJzc19zdGFydCA9IC47CisJCSooLmh1Z2Vic3MpCisJCSooLmh1Z2Vic3MuKikKKwkJX19odWdlYnNzX2VuZCA9IC47CisJfQorCV9faHVnZWJzc19sZW4gPSBBQlNPTFVURShfX2h1Z2Vic3NfZW5kKSAtIEFCU09MVVRFKF9faHVnZWJzc19zdGFydCk7CisJX19odWdlYnNzX2R3b3JkcyA9IChfX2h1Z2Vic3NfbGVuICsgMykgPj4gMjsKKworCisJLyogWFhYOiBUaGlzIHN0YWNrIHNob3VsZCBiZSB1bmlmaWVkIHdpdGggdGhlIENPTTMyIHN0YWNrICovCisJX19zdGFja192bWEgPSAuOworCV9fc3RhY2tfbG1hID0gLjsJLyogRHVtbXkgKi8KKwkuc3RhY2sgKE5PTE9BRCkgOiBBVChfX3N0YWNrX2xtYSkgeworCQlfX3N0YWNrX3N0YXJ0ID0gLjsKKwkJKiguc3RhY2spCisJCV9fc3RhY2tfZW5kID0gLjsKKwl9CisJX19zdGFja19sZW4gPSBBQlNPTFVURShfX3N0YWNrX2VuZCkgLSBBQlNPTFVURShfX3N0YWNrX3N0YXJ0KTsKKwlfX3N0YWNrX2R3b3JkcyA9IChfX3N0YWNrX2xlbiArIDMpID4+IDI7CisKKwlfZW5kID0gLjsKKworCS8qIENPTTMyUiBhbmQga2VybmVscyBhcmUgbG9hZGVkIGFmdGVyIG91ciBvd24gUE0gY29kZSAqLworCS4gPSBBTElHTig2NTUzNik7CisJZnJlZV9oaWdoX21lbW9yeSA9IC47CisKKwkvKiBTdHVmZiB3ZSBkb24ndCBuZWVkLi4uICovCisJL0RJU0NBUkQvIDogeworCQkqKC5laF9mcmFtZSkKKwl9Cit9CmRpZmYgLS1naXQgYS9kZXZlbC9OaW5kZW50IGIvZGV2ZWwvTmluZGVudApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZjhlY2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZGV2ZWwvTmluZGVudApAQCAtMCwwICsxLDE4IEBACisjIS9iaW4vc2gKK1BBUkFNPSItbnBybyAta3IgLWk0IC10czggLXNvYiAtbDgwIC1zcyAtbmNzIC1jcDEiCitSRVM9YGluZGVudCAtLXZlcnNpb25gCitWMT1gZWNobyAkUkVTIHwgY3V0IC1kJyAnIC1mMyB8IGN1dCAtZCcuJyAtZjFgCitWMj1gZWNobyAkUkVTIHwgY3V0IC1kJyAnIC1mMyB8IGN1dCAtZCcuJyAtZjJgCitWMz1gZWNobyAkUkVTIHwgY3V0IC1kJyAnIC1mMyB8IGN1dCAtZCcuJyAtZjNgCitpZiBbICRWMSAtZ3QgMiBdOyB0aGVuCisgIFBBUkFNPSIkUEFSQU0gLWlsMCIKK2VsaWYgWyAkVjEgLWVxIDIgXTsgdGhlbgorICBpZiBbICRWMiAtZ3QgMiBdOyB0aGVuCisgICAgUEFSQU09IiRQQVJBTSAtaWwwIjsKKyAgZWxpZiBbICRWMiAtZXEgMiBdOyB0aGVuCisgICAgaWYgWyAkVjMgLWdlIDEwIF07IHRoZW4KKyAgICAgIFBBUkFNPSIkUEFSQU0gLWlsMCIKKyAgICBmaQorICBmaQorZmkKK2V4ZWMgaW5kZW50ICRQQVJBTSAiJEAiCmRpZmYgLS1naXQgYS9kaWFnL01ha2VmaWxlIGIvZGlhZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzM1Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlhZy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKK1NVQkRJUlMgPSBtYnIgZ2VvZHNwCisKK2FsbCB0aWR5IGRpc3QgY2xlYW4gc3BvdGxlc3MgaW5zdGFsbDoKKwlAbWtkaXIgLXAgJChhZGRwcmVmaXggJChPQkopLywkKFNVQkRJUlMpKQorCXNldCAtZTsgZm9yIGQgaW4gJChTVUJESVJTKTsgXAorCQlkbyAkKE1BS0UpIC1DICQoT0JKKS8kJGQgLWYgJChTUkMpLyQkZC9NYWtlZmlsZSBcCisJCVNSQz0iJChTUkMpIi8kJGQgT0JKPSIkKE9CSikiLyQkZCAkQDsgZG9uZQpkaWZmIC0tZ2l0IGEvZGlhZy9SRUFETUUgYi9kaWFnL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRkMWUwCi0tLSAvZGV2L251bGwKKysrIGIvZGlhZy9SRUFETUUKQEAgLTAsMCArMSw0IEBACitEaWFnbm9zdGljIHRvb2xzIGFuZCBpbWFnZXMgdG8gYXNzaXN0IHdpdGggdHJvdWJsZXNob290aW5nIFN5c2xpbnV4LXJlbGF0ZWQgaXNzdWVzLiAgU2VlIFJFQURNRSBpbiBlYWNoIGRpcmVjdG9yeSBmb3IgbW9yZSBkZXRhaWxzLgorCitnZW9kc3AvCQlEaXNwbGF5IGdlb21ldHJ5L0xCQSB0cmFuc2xhdGlvbiBhcyB0aGUgQklPUyBkZXRlY3RzIGl0LgorbWJyLwkJRGlhZ25vc3RpYyBNQlJzCmRpZmYgLS1naXQgYS9kaWFnL2dlb2RzcC9NYWtlZmlsZSBiL2RpYWcvZ2VvZHNwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZWU3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kaWFnL2dlb2RzcC9NYWtlZmlsZQpAQCAtMCwwICsxLDU4IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMTAtMjAxMSBHZW5lIEN1bW0KKyMjCisjIyAgIFBvcnRpb25zIGZyb20gY29yZS9NYWtlZmlsZToKKyMjICAgQ29weXJpZ2h0IDE5OTgtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBTWVNMSU5VWCBnZW9tZXRyeSBkaXNwbGF5IGZvciBkaWFnbm9zdGljcworIworCitpbmNsdWRlICQoTUFLRURJUikvZW1iZWRkZWQubWsKK2NvcmVkaXIgPSAkKHRvcGRpcikvY29yZQorVlBBVEggPSAkKFNSQykKKworQlRBUkdFVCA9IGdlb2RzcDFzLmJpbiBnZW9kc3Btcy5iaW4gXAorCWdlb2RzcDFzLmltZy54eiBnZW9kc3Btcy5pbWcueHoKKworTkFTTU9QVCA9IC1pICQoY29yZWRpcikvIC1pICQoU1JDKS8gLU94IC1mIGJpbiAtZEJJTkZNVAorTkFTTU9QVCArPSAtdytvcnBoYW4tbGFiZWxzCitDRkxBR1MgPSAtZyAtTworCithbGw6ICQoQlRBUkdFVCkKKworIyBIaWdoZXIgY29tcHJlc3Npb24gbGV2ZWxzIHJlc3VsdCBpbiBsYXJnZXIgZmlsZXMKKyUuaW1nLnh6OiAlLmJpbiBtay1sYmEtaW1nLnBsCisJJChQRVJMKSAkKFNSQykvbWstbGJhLWltZy5wbCAkPCB8ICQoWFopIC0wID4gJEAgfHwgKCBybSAtZiAkQCA7IGZhbHNlICkKKworJS5pbWcuZ3o6ICUuYmluIG1rLWxiYS1pbWcucGwKKwkkKFBFUkwpICQoU1JDKS9tay1sYmEtaW1nLnBsICQ8IHwgJChHWklQUFJPRykgLTkgPiAkQCB8fCAoIHJtIC1mICRAIDsgZmFsc2UgKQorCisjIGluIGNhc2Ugc29tZW9uZSByZWFsbHkgd2FudHMgdGhlc2Ugd2l0aG91dCBuZWVkaW5nIGEgZGVjb21wcmVzc29yCislLmltZzogJS5iaW4gbWstbGJhLWltZy5wbAorCSQoUEVSTCkgJChTUkMpL21rLWxiYS1pbWcucGwgJDwgPiAkQCB8fCAoIHJtIC1mICRAIDsgZmFsc2UgKQorCislLmJpbjogJS5hc20gJChjb3JlZGlyKS93cml0ZWhleC5pbmMgJChjb3JlZGlyKS9tYWNyb3MuaW5jICQoY29yZWRpcikvZGlza2Jvb3QuaW5jCisJJChOQVNNKSAkKE5BU01PUFQpIC1vICRAIC1sICQoQDouYmluPS5sc3QpICQ8CisKK21rLWxiYS1pbWc6IG1rLWxiYS1pbWcuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAkPAorCit0aWR5IGRpc3Q6CisJcm0gLVJmICoubHN0ICouaW1nCisJcm0gLWYgbWstbGJhLWltZworCitjbGVhbjogdGlkeQorCitzcG90bGVzczogY2xlYW4KKwlybSAtZiAkKEJUQVJHRVQpCmRpZmYgLS1naXQgYS9kaWFnL2dlb2RzcC9SRUFETUUgYi9kaWFnL2dlb2RzcC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyOWI2OQotLS0gL2Rldi9udWxsCisrKyBiL2RpYWcvZ2VvZHNwL1JFQURNRQpAQCAtMCwwICsxLDI5IEBACitHZW9Ec3A6IEltYWdlcyB0byBkaXNwbGF5IHRoZSBnZW9tZXRyeSBhcyB0aGUgQklPUyBoYXMgY2hvb3NlbiB0bworaW50ZXJwcmV0IGl0LiAgQm90aCBpbWFnZXMgYXJlIGludGVuZGVkIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpcnN0IH44TWlCCitvZiBhIHJhdyBkZXZpY2UgKGllIC9kZXYvaGRhLCAvZGV2L3NkYSkgYW5kIGJlIG92ZXIgb25lIGxhcmdlIGN5bGluZGVyCitvZiAyNTUqNjMgNTEyLWJ5dGUgc2VjdG9ycyBpbiBzaXplLgorCitUbyBzYXZlIHRoZSBleGlzdGluZyBkYXRhIGZvciByZXN0b3JlIGxhdGVyOgorCisJZGQgYnM9MU0gaWZsYWc9ZnVsbGJsb2NrIGNvdW50PTggaWY9L2Rldi9zZGEgb2Y9c2RhLmltZworCitHZW9Ec3AxUyBpcyBhIG9uZS1zZWN0b3IgdmFyaWFudCBjb250YWluaW5nIGFsbCBjb2RlIGluIG9uZSBzZWN0b3IgdGhhdAoraXMgaW50ZW5kZWQgdG8gdGVzdCBiZWhhdmlvciB3aXRoIGEgdHlwaWNhbCBNQlIvcGFydGl0aW9uIHRhYmxlIGxheW91dC4gCitBIHBhcnRpdGlvbiB0YWJsZSBzaG91bGQgYmUgd3JpdHRlbiBhZnRlciB3cml0dGluZyBhbiBpbWFnZS4KKworR2VvRHNwTVMgaXMgYSBtdWx0aSBzZWN0b3IgdmFyaWFudCBpbnRlbmRlZCB0byBsb29rIGxpa2UgU3lzbGludXgKK2luc3RhbGxlZCBvbiBhIGZpbGUgc3lzdGVtIG9uIHRoZSByYXcgZGV2aWNlIChhcyBvcHBvc2VkIHRvIGEgZmlsZQorc3lzdGVtIHdpdGhpbiBhIHBhcnRpdGlvbikuCisKK0dlb0RzcE1TIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXR0ZW1wdCB0byBtYWtlIHRoZSBib290IHNlY3RvciBsb29rIGxpa2UgYQorbm9ybWFsIGZpbGUgc3lzdGVtJ3MgYm9vdCBzZWN0b3IgKGllIEZBVDEyL0ZBVDE2L0ZBVDMyKS4gIEluIG9yZGVyIHRvIGRvCit0aGlzLCB5b3UgbXVzdCBmaXJzdCBzYXZlIGEgcG9ydGlvbiB0aGUgZXhpc3RpbmcgYm9vdCBzZWN0b3IgKHRoZQorbWFqb3JpdHkgb2YgdGhlIEJJT1MgcGFyYW1ldGVyIGJsb2NrKS4KKworCWRkIGJzPTEgc2tpcD0zIGNvdW50PTg3IGlmPS9kZXYvc2RhMSBvZj1zZGExLmJwYgorCWRkIGNvbnY9bm90cnVuYyBpZj1nZW9kc3Btcy5pbWcgb2Y9L2Rldi9zZGExCisJZGQgY29udj1ub3RydW5jIGJzPTEgc2Vlaz0zIGNvdW50PTg3IGlmPXNkYTEuYnBiIG9mPS9kZXYvc2RhMQorCisJZGQgYnM9MSBza2lwPTMgY291bnQ9ODcgaWY9L2Rldi9mZDAgb2Y9ZmQwLmJwYgorCWRkIGNvbnY9bm90cnVuYyBpZj1nZW9kc3Btcy5pbWcgb2Y9L2Rldi9mZDAKKwlkZCBjb252PW5vdHJ1bmMgYnM9MSBzZWVrPTMgY291bnQ9ODcgaWY9ZmQwLmJwYiBvZj0vZGV2L2ZkMApkaWZmIC0tZ2l0IGEvZGlhZy9nZW9kc3AvZ2VvZHNwMXMuYXNtIGIvZGlhZy9nZW9kc3AvZ2VvZHNwMXMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTg0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9kaWFnL2dlb2RzcC9nZW9kc3Axcy5hc20KQEAgLTAsMCArMSwyNjkgQEAKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgICBDb3B5cmlnaHQgMjAxMCBHZW5lIEN1bW0KKzsKKzsgICBQb3J0aW9ucyBmcm9tIGRpc2tzdGFydC5pbmM6Cis7ICAgQ29weXJpZ2h0IDE5OTQtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzsgICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7Cis7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzsgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKzsgICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Cis7IGdlb2RzcDFzLmFzbQorOworOyBEaXNwbGF5IGdlb21ldHJ5IHRyYW5zbGF0aW9uIGluZm8gZm9yIGRpYWdub3NpbmcgbWlzY29uY2VwdGlvbnMKKzsgMSBzZWN0b3IgdmFyaWFudAorOworOwluYXNtIC1PeCAtZiBiaW4gLW8gZ2VvZHNwLmJpbiAtbCBnZW9kc3AubHN0IGdlb2RzcC5hc20KKzsKKzsJbmFzbSAtT3ggLWYgZWxmIC1vIGdlb2RzcC5vIC1sIGdlb2RzcC5sc3QgZ2VvZHNwLmFzbQorOwlsZCAtbSBlbGZfaTM4NiAgLVQgc3lzbGludXgubGQgLU0gLW8gZ2VvZHNwLmVsZiBnZW9kc3AubyA+IGdlb2RzcC5tYXAKKzsJb2JqY29weSAtTyBiaW5hcnkgZ2VvZHNwLmVsZiBnZW9kc3AucmF3Cis7Cis7CSMgT0Y9L2Rldi9zZGIKKzsJIyBkZCBpZj1jb3JlL2dlb2RzcC5iaW4gb2Y9JE9GCis7CSMgZGQgc2tpcD0xIHNlZWs9MSBpZj0uLi9kYmcvbGJhLWltZy9sYmEtaW1nLmJpbiBvZj0kT0YKKzsJIyBlamVjdCAkT0YKKzsJIyBkZCBjb3VudD0kKCkgaWY9L2Rldi96ZXJvIG9mPSRPRgorOworOwkjIE9GPWdlby0yLjI1NS42My5pCis7CSMgKGRkIGlmPWNvcmUvZ2VvZHNwLmJpbjsgZGQgc2tpcD0xIGlmPS4uL2RiZy9sYmEtaW1nL2xiYS1pbWcuYmluOyBkZCBjb3VudD0kKCgyKjI1NSo2MyAtIDI1Nio2MyAtIDEpKSBpZj0vZGV2L3plcm8gKXxkZCBvZj0kT0YKKzsJIyBPRj1nZW8tMjAuMTYuNjMuaQorOwkjIChkZCBpZj1jb3JlL2dlb2RzcC5iaW47IGRkIHNraXA9MSBpZj0uLi9kYmcvbGJhLWltZy9sYmEtaW1nLmJpbjsgZGQgY291bnQ9JCgoNDAqMTYqNjMgLSAyNTYqNjMgLSAxKSkgaWY9L2Rldi96ZXJvICl8ZGQgb2Y9JE9GCis7CisKKyVpbmNsdWRlICJtYWNyb3MuaW5jIgorOyAlaW5jbHVkZSAibGF5b3V0LmluYyIKKworOyAJCWdsb2JhbCBTVEFDS19MRU4sIFNUQUNLX1RPUCwgU1RBQ0tfQkFTRQorOyBTVEFDS19MRU4JZXF1IDQwOTYKK1NUQUNLX1RPUAllcXUgN2MwMGgKKzsgU1RBQ0tfQkFTRQllcXUgU1RBQ0tfVE9QIC0gU1RBQ0tfTEVOCisKK1N0YWNrQnVmCWVxdSBTVEFDS19UT1AtNDQtOTIJOyBTdGFydCB0aGUgc3RhY2sgaGVyZSAoZ3JvdyBkb3duIC0gNEspCitEcml2ZU51bWJlcgllcXUgU3RhY2tCdWYtNAkJOyBEcml2ZSBudW1iZXIKK21fQ0hTMAkJZXF1IDAwNTM0ODQzaAkJOydDSFMnLDAKK21fRUREMAkJZXF1IDAwNDQ0NDQ1aAkJOydFREQnLDAKK21fRUREX1NQCWVxdSAyMDQ0NDQ0NWgJCTsnRUREICcKK3JldHJ5X2NvdW50CWVxdSAxNgorZGJ1ZgkJZXF1IDgwMDBoCitpbnQxM19yZXQJZXF1IDdlMDBoCisKKworCis7IAkJZXh0ZXJuCXJlYWxfbW9kZV9zZWcKKzsgCQlzZWN0aW9uIC5yZWFsX21vZGUJd3JpdGUgbm9iaXRzIGFsaWduPTY1NTM2Cis7IAkJZ2xvYmFsCWNvcmVfcmVhbF9tb2RlCis7IGNvcmVfcmVhbF9tb2RlCXJlc2IgNjU1MzYKKzsgCQlleHRlcm4JeGZlcl9idWZfc2VnCis7IAkJc2VjdGlvbiAueGZlcl9idWYJd3JpdGUgbm9iaXRzIGFsaWduPTY1NTM2Cis7IAkJZ2xvYmFsCWNvcmVfeGZlcl9idWYKKzsgY29yZV94ZmVyX2J1ZglyZXNiIDY1NTM2CisKKwkJc2VjdGlvbiAudGV4dAorCQlvcmcgU1RBQ0tfVE9QCisKKworCQlnbG9iYWwgX3N0YXJ0Citib290c2VjCQllcXUgJAorX3N0YXJ0OgorCQkJOyBJbiBjYXNlIHdlIHdhbnQgdG8gcHVsbCBtb3JlIG9mIHRoZSBzdGFuZGFyZCBkaXNrc3RhcnQgc3R1ZmYgaW4KKzsgCQlqbXAgc2hvcnQgc3RhcnQJCTsgMiBieXRlcworOyAJCW5vcAkJCTsgMSBieXRlCitzdGFydDoKKwkJY2xpCisJCWNsZAorCQl4b3IgY3gsY3gKKwkJbW92IHNzLGN4CisJCW1vdiBzcCxTdGFja0J1Zi0yCTsgSnVzdCBiZWxvdyBCU1MgKC0yIGZvciBhbGlnbm1lbnQpCisJCXB1c2ggZHgJCQk7IFNhdmUgZHJpdmUgbnVtYmVyIChpbiBETCkKKwkJCTsgS2lsbCBldmVyeXRoaW5nIGVsc2UgYW5kIGxldCB0aGUgQklPUyBzb3J0IGl0IG91dCBsYXRlcgorCQltb3YgZXMsY3gKKwkJbW92IGRzLGN4CisJCXN0aQorCitnZXRfZ2VvOgkJOyBETCBhbmQgRVMgcmVhZHkKKwkJbW92IGFoLDA4aAorCQltb3YgZGksMAorCQlpbnQgMTNoCit3cml0ZV9nZW86CisJCWpjIC5iYWRfZ2VvCisJCW1vdiBzaSxzX2NocworCQljYWxsIHdyaXRlc3RyX2Vhcmx5CisJCWNhbGwgd3JpdGVfY2hzCisJCWNhbGwgY3JsZgorCQlqbXAgc2hvcnQgLmRvbmUKKy5iYWRfZ2VvOgorLmRvbmU6CisKKwkJbW92IGJ4LGRidWYKK2dldF9oMWM6CQk7IDAsMSwxCisJCW1vdiBjeCwwMDAxaAorCQltb3YgZGgsMDFoCisJCWNhbGwgZ2V0b25lc2VjX2NocworCQljYWxsIHdyaXRlX2Noc19sYmEKK2dldF9jMWM6CQk7IDEsMCwxCisJCW1vdiBjeCwwMTAxaAorCQltb3YgZGgsMDBoCisJCWNhbGwgZ2V0b25lc2VjX2NocworCQljYWxsIHdyaXRlX2Noc19sYmEKKworOworOyBEbyB3ZSBoYXZlIEVCSU9TIChFREQpPworOworZWRkOgorLmNoZWNrOgorCQltb3YgYngsNTVBQWgKKwkJbW92IGFoLDQxaAkJOyBFREQgZXhpc3RlbmNlIHF1ZXJ5CisJCW1vdiBkbCxbRHJpdmVOdW1iZXJdCisJCWludCAxM2gKKwkJamMgLm5vZWRkCisJCWNtcCBieCwwQUE1NWgKKwkJam5lIC5ub2VkZAorCQl0ZXN0IGNsLDEJCTsgRXh0ZW5kZWQgZGlzayBhY2Nlc3MgZnVuY3Rpb25hbGl0eSBzZXQKKwkJanogLm5vZWRkCisJCTsKKwkJOyBXZSBoYXZlIEVERCBzdXBwb3J0Li4uCisJCTsKKwkJbW92IGJ4LGRidWYKKwkJeG9yIGVkeCxlZHgKKwkJbW92IGR3b3JkIFtzX2Noc10sbV9FRERfU1AKKy5nZXRfbGJhNjM6CisJCW1vdiBlYXgsNjMJOyBTYW1lIGxlbmd0aCBhcyBtb3YgYWwsNjQ7IG1vdnp4IGVheCxhbAorCQljYWxsIGdldG9uZXNlY19lYmlvcworCQlqYyAuYmFkX2VkZAk7cmVhZCBlcnJvcgorCQljYWxsIHdyaXRlX2VkZF9sYmEKKy5nZXRfbGJhMTYwNjU6CisJCW1vdiBlYXgsMTYwNjUKKwkJY2FsbCBnZXRvbmVzZWNfZWJpb3MKKwkJamMgLmJhZF9lZGQJO3JlYWQgZXJyb3IKKwkJY2FsbCB3cml0ZV9lZGRfbGJhCisuZ29vZF9lZGQ6CisJCW1vdiBkd29yZCBbc190eXBlXSxtX0VERDAKKy5iYWRfZWRkOgorLm5vZWRkOgorLmVuZDoKKword3JpdGVfZmluYWxfdHlwZToKKwkJbW92IHNpLHNfdHlwZXNwZWMKKwkJY2FsbCB3cml0ZXN0cl9lYXJseQorCisJCWptcCBzaG9ydCBrYWJvb20KKworOworOyBnZXRvbmVzZWNfZWJpb3M6Cis7Cis7IGdldG9uZXNlYyBpbXBsZW1lbnRhdGlvbiBmb3IgRUJJT1MgKEVERCkKKzsKK2dldG9uZXNlY19lYmlvczoKKwkJbW92IGN4LHJldHJ5X2NvdW50CisucmV0cnk6CisJCTsgRm9ybSBEQVBBIG9uIHN0YWNrCisJCXB1c2ggZWR4CisJCXB1c2ggZWF4CisJCXB1c2ggZXMKKwkJcHVzaCBieAorCQlwdXNoIHdvcmQgMQorCQlwdXNoIHdvcmQgMTYKKwkJbW92IHNpLHNwCisJCXB1c2hhZAorICAgICAgICAgICAgICAgIG1vdiBhaCw0MmggICAgICAgICAgICAgICAgICAgICAgOyBFeHRlbmRlZCBSZWFkCisJCWNhbGwgeGludDEzCisJCXBvcGFkCisJCWxlYSBzcCxbc2krMTZdCQkJOyBSZW1vdmUgREFQQQorCQlqYyAuZXJyb3IKKyAgICAgICAgICAgICAgICByZXQKKworLmVycm9yOgorCQk7IFNvbWUgc3lzdGVtcyBzZWVtIHRvIGdldCAic3R1Y2siIGluIGFuIGVycm9yIHN0YXRlIHdoZW4KKwkJOyB1c2luZyBFQklPUy4gIERvZXNuJ3QgaGFwcGVuIHdoZW4gdXNpbmcgQ0JJT1MsIHdoaWNoIGlzCisJCTsgZ29vZCwgc2luY2Ugc29tZSBvdGhlciBzeXN0ZW1zIGdldCB0aW1lb3V0IGZhaWx1cmVzCisJCTsgd2FpdGluZyBmb3IgdGhlIGZsb3BweSBkaXNrIHRvIHNwaW4gdXAuCisKKwkJcHVzaGFkCQkJCTsgVHJ5IHJlc2V0dGluZyB0aGUgZGV2aWNlCisJCXhvciBheCxheAorCQljYWxsIHhpbnQxMworCQlwb3BhZAorCQlsb29wIC5yZXRyeQkJCTsgQ1gtLSBhbmQganVtcCBpZiBub3QgemVybworCisJCTsgVG90YWwgZmFpbHVyZS4KKwkJc3RjCisJCXJldAorCis7Cis7IGdldG9uZXNlY19jaHM6Cis7Cis7IENYLERIIHNwZWNpZmllcyBDSFMgYWRkcmVzcworOworZ2V0b25lc2VjX2NoczoJOyBXZSBjb3VsZCB1c2UgYW4geGNoZyBhbmQgZ2V0IGEgbG9vcAorOyAJCW1vdiBjeCxyZXRyeV9jb3VudAorLnJldHJ5OgorCQlwdXNoYWQKKwkJbW92IGF4LDAyMDFoCQk7IFJlYWQgb25lIHNlY3RvcgorCQljYWxsIHhpbnQxMworCQlwb3BhZAorCQlqYyAuZXJyb3IKKwkJcmV0CisKKy5lcnJvcjoKKzsgCQlsb29wIC5yZXRyeQorCQk7IEZhbGwgdGhyb3VnaCB0byBkaXNrX2Vycm9yCis7Cis7IGthYm9vbTogd3JpdGUgYSBtZXNzYWdlIGFuZCBiYWlsIG91dC4KKzsKKwkJZ2xvYmFsIGthYm9vbQorZGlza19lcnJvcjoKK2thYm9vbToKKy5wYXRjaDoKKwkJbW92IHNpLGJhaWxtc2cKKwkJY2FsbCB3cml0ZXN0cl9lYXJseQorCQl4b3IgZWF4LGVheAorLmFnYWluOgkJaW50IDE2aAkJCTsgV2FpdCBmb3Iga2V5cHJlc3MKKwkJCQkJOyBOQjogcmVwbGFjZWQgYnkgaW50IDE4aCBpZgorCQkJCQk7IGNob3NlbiBhdCBpbnN0YWxsIHRpbWUuLgorCQlpbnQgMTloCQkJOyBBbmQgdHJ5IG9uY2UgbW9yZSB0byBib290Li4uCisubm9yZ2U6CQlobHQJCQk7IElmIGludCAxOWggcmV0dXJuZWQ7IHRoaXMgaXMgdGhlIGVuZAorCQlqbXAgc2hvcnQgLm5vcmdlCisKKzsKKzsgSU5UIDEzaCB3cmFwcGVyIGZ1bmN0aW9uCis7Cit4aW50MTM6CisgICAgICAgICAgICAgICAgbW92IGRsLFtEcml2ZU51bWJlcl0KKwkJaW50IDEzaAorCQltb3YgW2ludDEzX3JldF0sYXgKKwkJcmV0CisKKzsKKzsKKzsgd3JpdGVzdHJfZWFybHk6IHdyaXRlIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29uc29sZQorOwkgICAgVGhpcyBhc3N1bWVzIHdlJ3JlIG9uIHBhZ2UgMC4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBlYXJseQorOyAgICAgICAgICAgbWVzc2FnZXMsIHNvIGl0IHNob3VsZCBiZSBPSy4KKzsKK3dyaXRlc3RyX2Vhcmx5OgorCQlwdXNoYWQKKy5sb29wOgkJbG9kc2IKKwkJYW5kIGFsLGFsCisgICAgICAgICAgICAgICAganogLnJldHVybgorCQljYWxsIHdyaXRlY2hyCisJCWptcCBzaG9ydCAubG9vcAorLnJldHVybjoJcG9wYWQKKwkJcmV0CisKKyVpbmNsdWRlICJnZW9kc3BsaWIuaW5jIgorYmFpbG1zZwkJZXF1IHNfZW5kCisKKwkJOyBUaGlzIGZhaWxzIGlmIHRoZSBib290IHNlY3RvciBvdmVyZmxvd3NnCisJCXpiIDFCRWgtKCQtJCQpCisKK3B0YWJsZQkJemIgNDBoCQk7IFBhcnRpdGlvbiB0YWJsZQorCitib290c2lnbmF0dXJlCWR3IDB4QUE1NQorCitzZWN0b3JfMjoKZGlmZiAtLWdpdCBhL2RpYWcvZ2VvZHNwL2dlb2RzcGxpYi5pbmMgYi9kaWFnL2dlb2RzcC9nZW9kc3BsaWIuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNmY3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kaWFnL2dlb2RzcC9nZW9kc3BsaWIuaW5jCkBAIC0wLDAgKzEsMTAwIEBACis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgQ29weXJpZ2h0IDIwMTAgR2VuZSBDdW1tCis7Cis7ICAgUG9ydGlvbnMgZnJvbSBkaXNrc3RhcnQuaW5jOgorOyAgIENvcHlyaWdodCAxOTk0LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7ICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorOworOyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7ICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzsgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCis7ICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzsgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKzsKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOworOyBnZW9kc3BsaWIuaW5jCis7Cis7IExpYnJhcnkgZmlsZSBmb3IgZ2VvZHNwKi5hc20KKzsKKworCQk7IEVTOkJYIHBvaW50cyB0byB0aGUgYnVmZmVyIHdpdGggYWRkcmVzcworCQk7IERYLENYIGFzIHRoZXkgc2hvdWxkIGJlIGZvciBJTlQxM2gsQUg9MDIKKwkJOyBGb3Igbm93IGFzc3VtZSBDPDI1Ngord3JpdGVfY2hzX2xiYToKKwkJcHVzaGFkCisJCW1vdiBzaSxzX2F0Y2hzCisJCWNhbGwgd3JpdGVzdHJfZWFybHkKKwkJY2FsbCB3cml0ZV9jaHMKKwkJbW92IGFsLCc6JworCQljYWxsIHdyaXRlY2hyCisJCW1vdiBlYXgsW2VzOmJ4XQorCQljYWxsIHdyaXRlaGV4OAorCQljYWxsIGNybGYKKwkJcG9wYWQKKwkJcmV0CisKKwkJOyBEWCxDWCBhcyB0aGV5IHNob3VsZCBiZSBmb3IgSU5UMTNoLEFIPTAyCisJCTsgRm9yIG5vdyBhc3N1bWUgQzwyNTYKK3dyaXRlX2NoczoKKwkJcHVzaGFkCisJCW1vdiBhbCxjaAorCQltb3YgYWgsY2wKKwkJc2hyIGFoLDYKKwkJY2FsbCB3cml0ZWhleDQKKwkJbW92IGFsLCcsJworCQljYWxsIHdyaXRlY2hyCisJCW1vdiBhbCxkaAorCQljYWxsIHdyaXRlaGV4MgorCQltb3YgYWwsJywnCisJCWNhbGwgd3JpdGVjaHIKKwkJbW92IGFsLGNsCisJCWFuZCBhbCwzRmgKKwkJY2FsbCB3cml0ZWhleDIKKwkJcG9wYWQKKwkJcmV0CisKK3dyaXRlX2VkZF9sYmE6CisJCXB1c2hhZAorCQltb3Ygc2ksc19hdGNocworCQljYWxsIHdyaXRlc3RyX2Vhcmx5CisJCWNhbGwgd3JpdGVoZXg4CisJCW1vdiBhbCwnOicKKwkJY2FsbCB3cml0ZWNocgorCQltb3YgZWF4LFtlczpieF0KKwkJY2FsbCB3cml0ZWhleDgKKwkJY2FsbCBjcmxmCisJCXBvcGFkCisJCXJldAorCisKK2NybGY6CisJCXB1c2ggc2kKKwkJbW92IHNpLHNfY3JsZgorCQljYWxsIHdyaXRlc3RyX2Vhcmx5CisJCXBvcCBzaQorCQlyZXQKKword3JpdGVjaHI6Cit3cml0ZWNocl9lYXJseToKKwkJcHVzaGFkCisJCW1vdiBhaCwwRWgJCTsgV3JpdGUgdG8gc2NyZWVuIGFzIFRUWQorCQltb3YgYngsMDAwN2gJCTsgQXR0cmlidXRlCisJCWludCAxMGgKKwkJcG9wYWQKKwkJcmV0CisKKyVpbmNsdWRlICJ3cml0ZWhleC5pbmMiCisKK3NfYXRjaHM6CWRiICdAJworc19jaHM6CQlkYiAnQ0hTJworc19zcGFjZToJZGIgJyAnLCAwCitzX3R5cGVzcGVjOglkYiAnRD0nCitzX3R5cGU6CQlkYiAnQ0hTJywgMAorc19lbmQ6CQlkYiAwRGgsIDBBaCwgJ2VuZCcKK3NfY3JsZjoJCWRiIDBEaCwgMEFoLCAwCisKKzsgVGhpcyBpbmRpY2F0ZXMgdGhlIGdlbmVyYWwgZm9ybWF0IG9mIHRoZSBsYXN0IGZldyBieXRlcyBpbiB0aGUgYm9vdCBzZWN0b3IKK0JTX01BR0lDX1ZFUgllcXUgMHgxYiA8PCA5CmRpZmYgLS1naXQgYS9kaWFnL2dlb2RzcC9nZW9kc3Btcy5hc20gYi9kaWFnL2dlb2RzcC9nZW9kc3Btcy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0MTFlYgotLS0gL2Rldi9udWxsCisrKyBiL2RpYWcvZ2VvZHNwL2dlb2RzcG1zLmFzbQpAQCAtMCwwICsxLDE5NiBAQAorOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgIENvcHlyaWdodCAyMDEwIEdlbmUgQ3VtbQorOworOyAgIFBvcnRpb25zIGZyb20gZGlza3N0YXJ0LmluYzoKKzsgICBDb3B5cmlnaHQgMTk5NC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOyAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKzsKKzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorOyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7ICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCis7Cis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsKKzsgZ2VvZHNwbXMuYXNtCis7Cis7IERpc3BsYXkgZ2VvbWV0cnkgdHJhbnNsYXRpb24gaW5mbyBmb3IgZGlhZ25vc2luZyBtaXNjb25jZXB0aW9ucworOyBtdWx0aS1zZWN0b3IgdmFyaWFudAorOworOwluYXNtIC1PeCAtZiBiaW4gLW8gZ2VvZHNwLmJpbiAtbCBnZW9kc3AubHN0IGdlb2RzcC5hc20KKzsKKzsJbmFzbSAtT3ggLWYgZWxmIC1vIGdlb2RzcC5vIC1sIGdlb2RzcC5sc3QgZ2VvZHNwLmFzbQorOwlsZCAtbSBlbGZfaTM4NiAgLVQgc3lzbGludXgubGQgLU0gLW8gZ2VvZHNwLmVsZiBnZW9kc3AubyA+IGdlb2RzcC5tYXAKKzsJb2JqY29weSAtTyBiaW5hcnkgZ2VvZHNwLmVsZiBnZW9kc3AucmF3Cis7Cis7CSMgT0Y9L2Rldi9zZGIKKzsJIyBkZCBpZj1jb3JlL2dlb2RzcC5iaW4gb2Y9JE9GCis7CSMgZGQgc2tpcD0xIHNlZWs9MSBpZj0uLi9kYmcvbGJhLWltZy9sYmEtaW1nLmJpbiBvZj0kT0YKKzsJIyBlamVjdCAkT0YKKzsJIyBkZCBjb3VudD0kKCkgaWY9L2Rldi96ZXJvIG9mPSRPRgorOworOwkjIE9GPWdlby0yLjI1NS42My5pCis7CSMgKGRkIGlmPWNvcmUvZ2VvZHNwLmJpbjsgZGQgc2tpcD0xIGlmPS4uL2RiZy9sYmEtaW1nL2xiYS1pbWcuYmluOyBkZCBjb3VudD0kKCgyKjI1NSo2MyAtIDI1Nio2MyAtIDEpKSBpZj0vZGV2L3plcm8gKXxkZCBvZj0kT0YKKzsJIyBPRj1nZW8tMjAuMTYuNjMuaQorOwkjIChkZCBpZj1jb3JlL2dlb2RzcC5iaW47IGRkIHNraXA9MSBpZj0uLi9kYmcvbGJhLWltZy9sYmEtaW1nLmJpbjsgZGQgY291bnQ9JCgoNDAqMTYqNjMgLSAyNTYqNjMgLSAxKSkgaWY9L2Rldi96ZXJvICl8ZGQgb2Y9JE9GCis7CisKKzsgSnVzdCB0byBkZWZpbmUgaXQgdG8gbG9vayBsaWtlIFNZU0xJTlVYCislZGVmaW5lIElTX1NZU0xJTlVYIDEKKworJWluY2x1ZGUgIm1hY3Jvcy5pbmMiCis7ICVpbmNsdWRlICJsYXlvdXQuaW5jIgorCittX0NIUzAJCWVxdSAwMDUzNDg0M2gJCTsnQ0hTJywwCittX0VERDAJCWVxdSAwMDQ0NDQ0NWgJCTsnRUREJywwCittX0VERF9TUAllcXUgMjA0NDQ0NDVoCQk7J0VERCAnCityZXRyeV9jb3VudAllcXUgMTYKK2RidWYJCWVxdSA4MDAwaAorOyBpbnQxM19yZXQJZXF1IDdlMDBoCitMRExJTlVYX01BR0lDCWVxdSAweDNlYjIwMmZlCQk7IEEgcmFuZG9tIG51bWJlciB0byBpZGVudGlmeSBvdXJzZWx2ZXMgd2l0aAorCitTZWN0MVB0cjBfVkFMCWVxdSAxCitTZWN0MVB0cjFfVkFMCWVxdSAwCisKKzsgCQlnbG9iYWwgU1RBQ0tfTEVOLCBTVEFDS19UT1AsIFNUQUNLX0JBU0UKKzsgU1RBQ0tfTEVOCWVxdSA0MDk2CitTVEFDS19UT1AJZXF1IDdjMDBoCis7IFNUQUNLX0JBU0UJZXF1IFNUQUNLX1RPUCAtIFNUQUNLX0xFTgorCQlzZWN0aW9uIC5pbml0CisJCW9yZyBTVEFDS19UT1AKK2dlb2RzcF9zdGFydDoKKworJWluY2x1ZGUgImRpc2tib290LmluYyIKKworSEVYREFURQkJZXF1IDEKKworCQlzZWN0aW9uIC5pbml0CitzZWN0b3JfMToKK2xkbGludXhfc3lzOgorCQlhbGlnbnogOAorbGRsaW51eF9tYWdpYwlkZCBMRExJTlVYX01BR0lDCisJCWRkIExETElOVVhfTUFHSUNeSEVYREFURQorCisKK2xkbGludXhfZW50OgorCitnZXRfZ2VvOgkJOyBETCBhbmQgRVMgcmVhZHkKKwkJbW92IGFoLDA4aAorCQltb3YgZGksMAorCQljYWxsIHhpbnQxMword3JpdGVfZ2VvOgorCQlqYyAuYmFkX2dlbworCQltb3Ygc2ksc19jaHMKKwkJY2FsbCB3cml0ZXN0cl9lYXJseQorCQljYWxsIHdyaXRlX2NocworCQljYWxsIGNybGYKKwkJam1wIHNob3J0IC5kb25lCisuYmFkX2dlbzoKKy5kb25lOgorCisJCW1vdiBieCxkYnVmCitnZXRfaDFjOgkJOyAwLDEsMQorCQltb3YgY3gsMDAwMWgKKwkJbW92IGRoLDAxaAorCQljYWxsIGdldG9uZXNlY19jaHMKKwkJY2FsbCB3cml0ZV9jaHNfbGJhCitnZXRfYzFjOgkJOyAxLDAsMQorCQltb3YgY3gsMDEwMWgKKwkJbW92IGRoLDAwaAorCQljYWxsIGdldG9uZXNlY19jaHMKKwkJY2FsbCB3cml0ZV9jaHNfbGJhCisKKworCis7IERvIHdlIGhhdmUgRUJJT1MgKEVERCk/Cis7CitlZGQ6CisuY2hlY2s6CisJCW1vdiBieCw1NUFBaAorCQltb3YgYWgsNDFoCQk7IEVERCBleGlzdGVuY2UgcXVlcnkKKwkJY2FsbCB4aW50MTMKKwkJamMgLm5vZWRkCisJCWNtcCBieCwwQUE1NWgKKwkJam5lIC5ub2VkZAorCQl0ZXN0IGNsLDEJCTsgRXh0ZW5kZWQgZGlzayBhY2Nlc3MgZnVuY3Rpb25hbGl0eSBzZXQKKwkJanogLm5vZWRkCisJCTsKKwkJOyBXZSBoYXZlIEVERCBzdXBwb3J0Li4uCisJCTsKKwkJbW92IGJ4LGRidWYJOyBFUyBzaG91bGQgc3RpbGwgYmUgc2FmZS4KKwkJeG9yIGVkeCxlZHgKKwkJbW92IGR3b3JkIFtzX2Noc10sbV9FRERfU1AKKy5nZXRfbGJhNjM6CisJCW1vdiBlYXgsNjMJOyBTYW1lIGxlbmd0aCBhcyBtb3YgYWwsNjQ7IG1vdnp4IGVheCxhbAorCQljYWxsIGdldG9uZXNlY19lYmlvcworCQlqYyAuYmFkX2VkZAk7cmVhZCBlcnJvcgorCQljYWxsIHdyaXRlX2VkZF9sYmEKKy5nZXRfbGJhMTYwNjU6CisJCW1vdiBlYXgsMTYwNjUKKwkJY2FsbCBnZXRvbmVzZWNfZWJpb3MKKwkJamMgLmJhZF9lZGQJO3JlYWQgZXJyb3IKKwkJY2FsbCB3cml0ZV9lZGRfbGJhCisuZ29vZF9lZGQ6CisJCW1vdiBkd29yZCBbc190eXBlXSxtX0VERDAKKy5iYWRfZWRkOgorLm5vZWRkOgorLmVuZDoKKword3JpdGVfZmluYWxfdHlwZToKKwkJbW92IHNpLHNfdHlwZXNwZWMKKwkJY2FsbCB3cml0ZXN0cl9lYXJseQorCQlqbXAga2Fib29tCisKKzsKKzsgZ2V0b25lc2VjX2NoczoKKzsKKzsgQ1gsREggc3BlY2lmaWVzIENIUyBhZGRyZXNzCis7CitnZXRvbmVzZWNfY2hzOgk7IFdlIGNvdWxkIHVzZSBhbiB4Y2hnIGFuZCBnZXQgYSBsb29wCis7IAkJbW92IGN4LHJldHJ5X2NvdW50CisucmV0cnk6CisJCXB1c2hhZAorCQltb3YgYXgsMDIwMWgJCTsgUmVhZCBvbmUgc2VjdG9yCisJCWNhbGwgeGludDEzCisJCXBvcGFkCisJCWpjIC5lcnJvcgorCQlyZXQKKworLmVycm9yOgorOyAJCWxvb3AgLnJldHJ5CisJCTsgRmFsbCB0aHJvdWdoIHRvIGRpc2tfZXJyb3IKKwkJam1wIGRpc2tfZXJyb3IKKworJWluY2x1ZGUgImdlb2RzcGxpYi5pbmMiCisKKzsKKzsKKzsgd3JpdGVzdHJfZWFybHk6IHdyaXRlIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29uc29sZQorOwkgICAgVGhpcyBhc3N1bWVzIHdlJ3JlIG9uIHBhZ2UgMC4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBlYXJseQorOyAgICAgICAgICAgbWVzc2FnZXMsIHNvIGl0IHNob3VsZCBiZSBPSy4KKzsKK3dyaXRlc3RyX2Vhcmx5OgorCQlwdXNoYWQKKy5sb29wOgkJbG9kc2IKKwkJYW5kIGFsLGFsCisgICAgICAgICAgICAgICAganogLnJldHVybgorCQltb3YgYWgsMEVoCQk7IFdyaXRlIHRvIHNjcmVlbiBhcyBUVFkKKwkJbW92IGJ4LDAwMDdoCQk7IEF0dHJpYnV0ZQorCQlpbnQgMTBoCisJCWptcCBzaG9ydCAubG9vcAorLnJldHVybjoJcG9wYWQKKwkJcmV0CisKK1N1cGVySW5mbzoJemQgMzIJCQk7IFRoZSBmaXJzdCAxNiBieXRlcyBleHBhbmRlZCA4IHRpbWVzCisKKwkJOyBUaGlzIGZhaWxzIGlmIHRoZSBzZWN0b3Igb3ZlcmZsb3dzZworCQl6YiA0MDBoLSgkLSQkKQorZW5kOgorCisJCWFic29sdXRlIDQqMUVoCitmZGN0YWIJCWVxdSAkCitmZGN0YWIxCQlyZXN3IDEKK2ZkY3RhYjIJCXJlc3cgMQpkaWZmIC0tZ2l0IGEvZGlhZy9nZW9kc3AvbWstbGJhLWltZy5jIGIvZGlhZy9nZW9kc3AvbWstbGJhLWltZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWMzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kaWFnL2dlb2RzcC9tay1sYmEtaW1nLmMKQEAgLTAsMCArMSw5NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTAgR2VuZSBDdW1tCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1rLWxiYS1pbWcuYworICoKKyAqIE1ha2VzIGFuIGltYWdlIHRoYXQgY29udGFpbnMgdGhlIExCQSBpbiBldmVyeSAqd29yZCBvZiBldmVyeSBzZWN0b3IKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIE5VTV9TRUNUICgyNTYqNjMrMSkKKyNkZWZpbmUgQlBTICg1MTIpCisjZGVmaW5lIFNFQ1RfSU5UIChCUFMgLyBzaXplb2YodW5zaWduZWQgaW50KSkKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKKworY29uc3QgY2hhciBERUZfRk5bXSA9ICItIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaSwgcnYgPSAwLCBvbmUgPSAwOworCXVuc2lnbmVkIGludCBsYmEsIGJbU0VDVF9JTlRdOworCWludCBsZW47CisJRklMRSAqZjsKKwl1aW50OF90IHR0ID0gMDsKKwljb25zdCBjaGFyICpmbjsKKworCWlmIChhcmdjID49IDIpIHsKKwkJaWYgKGFyZ2MgPj0gMykgeworCQkJaWYgKHN0cmNhc2VjbXAoIi0xIiwgYXJndlsxXSkgPT0gMCkgeworCQkJCWZuID0gYXJndlsyXTsKKwkJCQlvbmUgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlmbiA9IGFyZ3ZbMV07CisJCQl9CisJCX0gZWxzZSB7CisJCQlmbiA9IGFyZ3ZbMV07CisJCX0KKwl9IGVsc2UgeworCQlmbiA9IERFRl9GTjsKKwl9CisKKwlpZiAoIXN0cmNtcChmbiwgIi0iKSkKKwkJZiA9IHN0ZG91dDsKKwllbHNlCisJCWYgPSBmb3BlbihmbiwgInciKTsKKworCWlmICghZikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlczogdW5hYmxlIHRvIG9wZW4gZm9yIHdyaXRpbmc6ICVzXG4iLAorCQkJYXJndlswXSwgZm4sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAxOworCX0KKworCWxiYSA9IDA7CisJd2hpbGUgKChsZW4gPSBmcmVhZChiLCAxLCBCUFMsIHN0ZGluKSkpIHsKKwkJaWYgKGxlbiA8IEJQUykKKwkJCW1lbXNldCgoY2hhciAqKWIgKyBsZW4sIDAsIEJQUyAtIGxlbik7CisJCWZ3cml0ZShiLCAxLCBCUFMsIGYpOworCQlsYmErKzsKKwl9CisKKwltZW1zZXQoYiwgMCwgc2l6ZW9mIGIpOworCisJd2hpbGUgKGxiYSA8IE5VTV9TRUNUKSB7CisJCWlmIChvbmUpIHsKKwkJCWJbMF0gPSBsYmE7CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgU0VDVF9JTlQ7IGkrKykKKwkJCQliW2ldID0gbGJhOworCQl9CisJCWZ3cml0ZShiLCAxLCBCUFMsIGYpOworCQlsYmErKzsKKwl9CisKKwlpZiAoZiAhPSBzdGRvdXQpCisJCWZjbG9zZShmKTsKKworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL2RpYWcvZ2VvZHNwL21rLWxiYS1pbWcucGwgYi9kaWFnL2dlb2RzcC9tay1sYmEtaW1nLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5ZWY0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaWFnL2dlb2RzcC9tay1sYmEtaW1nLnBsCkBAIC0wLDAgKzEsOTQgQEAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMjAxMSBHZW5lIEN1bW0KKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyMgbWstbGJhLWltZy5wbAorIyMKKyMjIE1ha2UgYW4gaW1hZ2Ugd2hlcmUgZWFjaCBzZWN0b3IgY29udGFpbnMgdGhlIExCQSBvZiB0aGUgc2VjdG9yIHdpdGgKKyMjIGEgaGVhZCBvZiBhbiBpbnB1dCBmaWxlLgorIyMKKworIyB1c2UgYnl0ZXM7CisKK3VzZSBjb25zdGFudCBTRUNUT1JfU0laRSA9PiA1MTI7Cit1c2UgY29uc3RhbnQgTEJBX1NJWkUgPT4gODsKK3VzZSBjb25zdGFudCBMT05HX1NJWkUgPT4gNDsKK3VzZSBjb25zdGFudCBOVU1fU0VDVE9SUyA9PiAoMjU2KjYzKzEpOworIyB1c2UgY29uc3RhbnQgTlVNX1NFQ1RPUlMgPT4gNTsKK3VzZSBjb25zdGFudCBERUJVRyA9PiAxOworCisjIHN1YiBkcHJpbnQKKyMgeworIyAgICAgaWYgKERFQlVHKSB7CisjIAlwcmludCgkXyk7CisjICAgICB9CisjIH0KKworKCRpZmlsZW4sICRvZmlsZW4pID0gQEFSR1Y7CisKK2lmICgoIWRlZmluZWQoJGlmaWxlbikpIHx8ICgkaWZpbGVuIGVxICItIikpIHsJIyAKKyAgICBwcmludChTVERFUlIgIlVzaW5nIHN0ZGluXG4iKTsKKyAgICAkSUZJTEUgPSBTVERJTjsKK30gZWxzZSB7CisgICAgb3BlbigkSUZJTEUsICc8JywgJGlmaWxlbikgb3IgZGllICJvcGVuOiQhIjsKKyAgICBwcmludChTVERFUlIgIlVzaW5nICRpZmlsZW5cbiIpOworfQorCitiaW5tb2RlKCRpZmlsZSk7CisKK2lmICghZGVmaW5lZCgkb2ZpbGVuKSkgeworICAgICRPRklMRSA9IFNURE9VVDsKK30gZWxzZSB7CisgICAgb3BlbigkT0ZJTEUsICc+JywgJG9maWxlbikgb3IgZGllICJvcGVuOiQhIjsKKyAgICBwcmludChTVERFUlIgIlVzaW5nICRvZmlsZW5cbiIpOworfQorCitiaW5tb2RlKCRPRklMRSk7CisKKyMgJHBrMCA9IHBhY2soJ0wnLCAwKTsKKyRuX2xvbmcgPSAoU0VDVE9SX1NJWkUvTE9OR19TSVpFKTsKKyRuX2xiYSA9IChTRUNUT1JfU0laRS9MQkFfU0laRSk7CisKKyRsZW49MDsKK3doaWxlICggcmVhZCgkSUZJTEUsICRjaCwgMSkgKSB7CisgICAgcHJpbnQoJE9GSUxFICRjaCk7CisgICAgJGxlbisrOworfQorJHRhaWwgPSAoU0VDVE9SX1NJWkUgLSAoJGxlbiAlIFNFQ1RPUl9TSVpFKSkgJSBTRUNUT1JfU0laRTsKKyRjaCA9IHBhY2soIkMiLCAwKTsKK3ByaW50KCJMZW46ICRsZW5cdHRhaWw6ICR0YWlsXG4iKTsKK2ZvciAoJGk9MDsgJGk8JHRhaWw7ICRpKyspIHsKKyAgICBwcmludCgkT0ZJTEUgJGNoKTsKK30KKworJHN0ID0gKCRsZW4gKyAkdGFpbCkgLyBTRUNUT1JfU0laRTsKKworZm9yICgkaT0kc3Q7ICRpPChOVU1fU0VDVE9SUyk7ICRpKyspIHsKKyAgICBAaWEgPSAoKTsKKyAgICBmb3IgKCRqPTA7ICRqPCAkbl9sYmE7ICRqKyspIHsKKwlwdXNoKEBpYSwgJGksIDApOworICAgIH0KKyAgICBAaXBrID0gcGFjaygiTFskbl9sb25nXSIsIEBpYSk7CisJIyBUaGVyZSBpcyBhIDY0LWJpdCBJTlQgY29udmVyc2lvbiBidXQgaXQgbm9ybWFsbHkgaXNuJ3QgdXNhYmxlCisJIyBvbiBhIDMyLWJpdCBwbGF0Zm9ybQorICAgIHByaW50KCRPRklMRSBAaXBrKTsJIyBHZW50bHkgc2ltdWxhdGUgYSA2NC1iaXQgTEJBCit9CisKK2lmIChkZWZpbmVkKCRpZmlsZW4pICYmICghKCRpZmlsZW4gZXEgIi0iKSkpIHsKKyAgICBjbG9zZSgkSUZJTEUpOworfQorCitpZiAoZGVmaW5lZCgkb2ZpbGVuKSkgeworICAgIGNsb3NlKCRPRklMRSk7Cit9CisKK2V4aXQgMDsKZGlmZiAtLWdpdCBhL2RpYWcvbWJyL01ha2VmaWxlIGIvZGlhZy9tYnIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3MTUzYwotLS0gL2Rldi9udWxsCisrKyBiL2RpYWcvbWJyL01ha2VmaWxlCkBAIC0wLDAgKzEsNTEgQEAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMjAwNy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMgICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyMgTWFrZWZpbGUgZm9yIE1CUgorIworCittYnJkaXIgPSAkKHRvcGRpcikvbWJyCitpbmNsdWRlICQoTUFLRURJUikvZW1iZWRkZWQubWsKK1ZQQVRIID0gJChTUkMpCisKK2FsbDoJaGFuZG9mZi5iaW4KKworJS5vOiAlLlMKKwkkKENDKSAkKE1BS0VERVBTKSAkKFNGTEFHUykgLVdhLC1hPSQqLmxzdCAtYyAtbyAkQCAkPAorCisuUFJFQ0lPVVM6ICUuZWxmCislLmVsZjogJS5vICQobWJyZGlyKS9tYnIubGQKKwkkKExEKSAkKExERkxBR1MpIC1UICQobWJyZGlyKS8kKEFSQ0gpL21ici5sZCAtZSBfc3RhcnQgLW8gJEAgJDwKKworJS5iaW46ICUuZWxmICQobWJyZGlyKS9jaGVja3NpemUucGwKKwkkKE9CSkNPUFkpIC1PIGJpbmFyeSAkPCAkQAorCSQoUEVSTCkgY2hlY2tzaXplLnBsICRACisJJChDSE1PRCkgLXggJEAKKworaGFuZG9mZi5iaW46IGhhbmRvZmYuZWxmICQobWJyZGlyKS9jaGVja3NpemUucGwKKwkkKE9CSkNPUFkpIC1PIGJpbmFyeSAkPCAkQAorCSQoUEVSTCkgJChtYnJkaXIpL2NoZWNrc2l6ZS5wbCAkQCA0MjAKKwkkKENITU9EKSAteCAkQAorCittYnJfYmluLmM6IG1ici5iaW4KKwordGlkeSBkaXN0OgorCXJtIC1mICoubyAqLmVsZiAqLmxzdCAuKi5kCisKK2NsZWFuOiB0aWR5CisKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICouYmluCisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL2RpYWcvbWJyL1JFQURNRSBiL2RpYWcvbWJyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODY4MTZjCi0tLSAvZGV2L251bGwKKysrIGIvZGlhZy9tYnIvUkVBRE1FCkBAIC0wLDAgKzEsMTcgQEAKK0RpYWdub3N0aWMgTUJSL1ZCUiBmaWxlcworCitoYW5kb2ZmLmJpbglTaG93IHRoZSBkYXRhIHRoYXQgdGhlIEJJT1MvTUJSIGhhbmRzIG9mZiB0byBhbiBNQlIvVkJSLgorCisKKyAgKysrIFVTQUdFICsrKworCitOT1RFOiBpbiB0aGUgZXhhbXBsZXMsIG1ici5iaW4sIC9kZXYvaGRhIGFuZCAvZGV2L2hkYTEgYXJlIHVzZWQgYXMgZ2VuZXJpYyByZXByZXNlbnRhdGlvbnMuCisKK1dyaXRpbmcgb3V0IGFuIE1CUiBpcyBzdHJhaWdodCBmb3J3YXJkIChpdCBpcyBhc3N1bWVkIGJlbG93IHRoYXQgL2Rldi9oZGEgaXMgdGhlIHRhcmdldCByYXcgZGV2aWNlIGFuZCAvZGV2L2hkYTEgaXMgdGhlIHRhcmdldCBwYXJ0aXRpb24pOgorCisgIGRkIGNvbnY9bm90cnVuYyBicz00NDAgY291bnQ9MSBpZj1tYnIuYmluIG9mPS9kZXYvaGRhCisKK1dyaXRpbmcgYSBWQlIgdG8gbWF0Y2ggU3lzbGludXggcmVxdWlyZXMgbW9yZSB3b3JrIGFzIGl0IG11c3QgaGF2ZSBhIGp1bXAgYW5kIGJlIG9mZnNldCBpbnRvIHRoZSBwYXJ0aXRpb24gKGFuZCBhcyBhIHJlc3VsdCB0aGUgY29kZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIG9mZnNldCk6CisKKyAgZWNobyAtZW4gIlwwMzUzXDAxMzBcMDIyMCIgfGRkIGNvbnY9bm90cnVuYyBicz0xIGNvdW50PTMgb2Y9L2Rldi9oZGExCisgIGRkIGNvbnY9bm90cnVuYyBicz0yIGNvdW50PTIxMCBzZWVrPTQ1IGlmPW1ici5iaW4gb2Y9L2Rldi9oZGExCmRpZmYgLS1naXQgYS9kaWFnL21ici9oYW5kb2ZmLlMgYi9kaWFnL21ici9oYW5kb2ZmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4NTgyYgotLS0gL2Rldi9udWxsCisrKyBiL2RpYWcvbWJyL2hhbmRvZmYuUwpAQCAtMCwwICsxLDM2NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAyMDEwLTIwMTEgR2VuZSBDdW1tCisgKgorICogICBQb3J0aW9ucyBmcm9tIG1ici5TOgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogaGFuZG9mZi5TOiBNQlIvVkJSLWxpa2UgY29kZWJsb2NrIHRvIGRpc3BsYXkgaGFuZG9mZiBkYXRhCisgKgorICogRGlzcGxheXMgdGhlIHZhbHVlcyBvZiBETCwgRFMsIFNJLCB0aGUgY29udGVudHMgb2YgW0RTOlNJXSAoMTYgYnl0ZXMpLAorICogdGhlIHZhbHVlcyBvZiBFUywgREksIHRoZSBjb250ZW50cyBvZiBbRVM6REldICg0IGJ5dGVzKSwgc2NhbnMgbWVtb3J5IGZvcgorICogJFBuUCB0aGVuIHJlcG9ydHMgYSBib290IGZhaWx1cmUuCisgKgorICogVGhpcyBzaG91bGQgKGhvcGVmdWxseSkgYmUgb25seSA4MDg2IGNvZGUKKyAqLworCisvKgorICogSW5zdGFsbCBpbnN0cnVjdGlvbnMgKGFzc3VtaW5nIHlvdXIgdGFyZ2V0IGlzIC9kZXYvZGV2OyBmaWxlIG9yIGJsb2NrIGRldmljZSk6CisgKgorICogTUJSOgorICogZGQgY29udj1ub3RydW5jIGJzPTQ0MCBjb3VudD0xIGlmPWhhbmRvZmYuYmluIG9mPS9kZXYvZGV2CisgKgorICogVkJSL1BCUiAoc2hvdWxkIHdvcmsgZm9yIEZBVDEyLzE2LzMyLCBleHRbMjM0XWZzLCBidHJmcyk6CisgKiBlY2hvIC1lbiAiXDAzNTNcMDEzMFwwMjIwIiB8ZGQgY29udj1ub3RydW5jIGJzPTEgY291bnQ9MyBvZj0vZGV2L2RldgorICogZGQgY29udj1ub3RydW5jIGJzPTIgY291bnQ9MjEwIHNlZWs9NDUgaWY9aGFuZG9mZi5iaW4gb2Y9L2Rldi9kZXYKKyAqLworCisvLyAjZGVmaW5lIERFQlVHX01BUktFUjEJLyogSW5zZXJ0IG1hcmtlcnMgaW4gYmluYXJ5ICovCisvLyAjZGVmaW5lIERFQlVHX1NUQVJUCS8qIFByaW50IGVudHJ5IGFkZHJlc3NlcyBhdCBzdGFydCAqLworLy8gI2RlZmluZSBERUJVR19MT0FERQkvKiBtb3Z3IHZlcnN1cyBwb3AgKi8KKyNkZWZpbmUgREVCVUdfUE5QCS8qIFNjYW4gZm9yICRQblAgYW5kIHNob3cgYWRkcmVzcyAqLworI2RlZmluZSBERUJVR19QQUsJLyogUHJlc3MgQW55IEtleSBiZWZvcmUgYm9vdCBmYWlsICovCisvLyAjZGVmaW5lIERFQlVHX0VOVFJZX1JFRwkvKiBTdG9yZSAobWFudWFsbHkgYXMgcHVzaGEgaXMgODAxODYpIHJlZ2lzdGVycyAqLworLy8gI2RlZmluZSBERUJVR19GRFQJLyogUHJpbnQgdGhlIGZsb3BweSBkZXNjcmlwdG9yIHRhYmxlOyBJTlQgMUVoKi8KKworI2lmZGVmIERFQlVHX01BUktFUjEKKwkubWFjcm8gQVNDSUlfTUFSS0VSMSBzOnZhcmFyZworCS5hc2NpaQlccworCS5lbmRtCisjZWxzZQkvKiBERUJVR19NQVJLRVIxICovCisJLm1hY3JvIEFTQ0lJX01BUktFUjEgczp2YXJhcmcKKwkuZW5kbQorI2VuZGlmCS8qIERFQlVHX01BUktFUjEgKi8KKworI2lmZGVmIERFQlVHX0xPQURFCisJLm1hY3JvIExPQURFIHI6cmVxLCB0OnJlcQorCW1vdncJKGVzX1xyKSwgJVx0CisJLmVuZG0KKyNlbHNlCS8qIERFQlVHX0xPQURFICovCisJLm1hY3JvIExPQURFIHI6cmVxLCB0OnJlcQorCXBvcHcgJVx0CisJLmVuZG0KKyNlbmRpZgkvKiBERUJVR19MT0FERSAqLworCisJLmNvZGUxNgorCS50ZXh0CisKK2VudHJ5CQk9IDB4N2MwMAorc3RhY2sJCT0gKGVudHJ5KQorZV9zdGFydAkJPSAoc3RhY2spCitlX2F4CQk9IChlX3N0YXJ0LTIpCitlX3NzCQk9IChlX2F4LTIpCitlX3NwCQk9IChlX3NzLTIpCitlX2JvdAkJPSAoZV9zcykKKy8qIERvdWJ0ZnVsIHRoaXMgd2lsbCBiZSB1c2VkICovCitlMF9iZWcJCT0gKGVfYm90KQorZTBfYXgJCT0gKGUwX2JlZy0yKQorZTBfY3gJCT0gKGUwX2F4LTIpCitlMF9keAkJPSAoZTBfY3gtMikKK2UwX2J4CQk9IChlMF9keC0yKQorZTBfc3AJCT0gKGUwX2J4LTIpCitlMF9icAkJPSAoZTBfc3AtMikKK2UwX3NpCQk9IChlMF9icC0yKQorZTBfZGkJCT0gKGUwX3NpLTIpCitlMF9kcwkJPSAoZTBfZGktMikKK2UwX2VzCQk9IChlMF9kcy0yKQorZTBfYm90CQk9IChlMF9lcykKK2VzX2JlZwkJPSAoZTBfYm90KQkvKiBPcmlnaW5hbCByZWdpc3RlciB2YWx1ZXMgZnJvbSBlbnRyeSBwb2ludCAqLworZXNfZGkJCT0gKGVzX2JlZy0yKQorZXNfZXMJCT0gKGVzX2RpLTIpCitlc19zaQkJPSAoZXNfZXMtMikKK2VzX2RzCQk9IChlc19zaS0yKQorZXNfYm90CQk9IChlc19kcykKKworQklPU19wYWdlCT0gMHg0NjIKKworaW50XzFlCQk9ICg0KjB4MWUpCitpbnRfMWVfc2VnCT0gKGludF8xZSkKK2ludF8xZV9vZmYJPSAoaW50XzFlKzIpCisKKwkuZ2xvYmwJX3N0YXJ0Citfc3RhcnQ6CisJY2xpCisjaWZkZWYgREVCVUdfRU5UUllfUkVHCisJbW92dwklYXgsIGVfYXgKKwltb3Z3CSVzcywgZV9zcworCW1vdncJJXNwLCBlX3NwCisjZW5kaWYgLyogREVCVUdfRU5UUllfUkVHICovCisJeG9ydwklYXgsICVheAorCW1vdncJJWF4LCAlc3MKKyNpZmRlZiBERUJVR19FTlRSWV9SRUcKKwltb3Z3CSRlMF9iZWcsICVzcAorCS8qIHB1c2hhdyAqLwkJLyogODAxODYgKi8KKwlwdXNodwklYXgKKwlwdXNodwklY3gKKwlwdXNodwklZHgKKwlwdXNodwklYngKKwlwdXNodwklc3AKKwlwdXNodwklYnAKKwlwdXNodwklc2kKKwlwdXNodwklZGkKKwlwdXNodwklZHMKKwlwdXNodwklZXMKKyNlbHNlIC8qIERFQlVHX0VOVFJZX1JFRyAqLworCW1vdncJJGVzX2JlZywgJXNwCisjZW5kaWYgLyogREVCVUdfRU5UUllfUkVHICovCisJcHVzaHcJJWRpCQkvKiBlczpkaSAtPiAkUG5QIGhlYWRlciAqLworCXB1c2h3CSVlcworCXB1c2h3CSVzaQorCXB1c2h3CSVkcworCXN0aQorCWNsZAorCXB1c2h3CSVjcworCXBvcHcJJWRzCisKKyNpZmRlZiBERUJVR19TVEFSVAorCXB1c2h3CSVkeAorCWNhbGwJY3JsZgorCW1vdncJJChfc3RhcnQpLCVkeAkvKiAweDA2MDAgbWJyLmxkIC50ZXh0IGFkZHJlc3MgKi8KKwljYWxsCXdyaGV4dworCWNhbGwJY3JsZgorCWNhbGwJY2FkZHIKK2NhZGRyOgorCXBvcHcJJWR4CisJc3VidwkkKGNhZGRyIC0gX3N0YXJ0KSwgJWR4CisJY2FsbAl3cmhleHcKKwljYWxsCWNybGYKKwlwb3B3CSVkeAorI2VuZGlmCS8qIERFQlVHX1NUQVJUICovCisKKwkvKiB3cml0ZSBETCAqLworcHJfZGw6CWNhbGwJd3JzdHIKKwkuYXNjaWkJIkRMOiBcMCIKKwljYWxsCXdyaGV4YgorCS8qIERTICovCitwcl9kczoJY2FsbAl3cnN0cgorCS5hc2NpaQkiICBEUzogXDAiCisJTE9BREUJZHMsIGR4CisJcHVzaHcJJWR4CisJcG9wdwklZXMKKwljYWxsCXdyaGV4dworCS8qIFNJICovCitwcl9zaToJY2FsbAl3cnN0cgorCS5hc2NpaQkiICBTSTogXDAiCisJTE9BREUJc2ksIGR4CisJcHVzaHcJJWR4CisJcG9wdwklZGkKKwljYWxsCXdyaGV4dworCWNhbGwJY3JsZgorCS8qIERTOlNJICovCisJbW92dwkkMTYsICVjeAorCWNhbGwJd3JoZXhic2VzCisJY2FsbAljcmxmCisKKwkvKiBFUyAqLworcHJfZXM6CWNhbGwJd3JzdHIKKwkuYXNjaWkJIkVTOiBcMCIKKwlMT0FERQllcywgZHgKKwlwdXNodwklZHgKKwlwb3B3CSVlcworCWNhbGwJd3JoZXh3Citwcl9kaToJY2FsbAl3cnN0cgorCS5hc2NpaQkiICBESTogXDAiCisJTE9BREUJZGksIGR4CisJcHVzaHcJJWR4CisJcG9wdwklZGkKKwljYWxsCXdyaGV4dworCWNhbGwJY3JsZgorCS8qIEVTOkRJICovCS8qICVlczowKCVkaSkgKi8KKwltb3Z3CSQ0LCAlY3gKKwljYWxsCXdyaGV4YnNlcworCisjaWZkZWYgREVCVUdfUE5QCisJc3VidwkkNCwgJXNpCisJZXMgbG9kc3cKKwljbXB3CSQweDUwMjQsICVheAorCWpuZQlzY25fcG5wCisJZXMgbG9kc3cKKwljbXB3CSQweDUwNkUsICVheAorCWpuZQlzY25fcG5wCisJY2FsbAl3cnN0cgorCS5hc2NpaQkiID0kUG5QXDAiCitzY25fcG5wOgorCWNhbGwJY3JsZgorCS8qICRQblAgU2NhbiAqLworCW1vdncJJDB4ZjAwMCwgJWR4CisJcHVzaHcJJWR4CisJcG9wdwklZXMKKwltb3Z3CSQwLCAlc2kKKwltb3Z3CSQweDEwMDAsICVjeAorCS8qIDB4NTA2RTUwMjQgKi8KKwltb3Z3CSQweDUwMjQsICVkeAorCW1vdncJJDB4NTA2RSwgJWJ4CitjaF9wbnA6CWVzIGxvZHN3CS8qIENoZWNrIGZvciAkUG5QICovCisJY21wdwklZHgsICVheAorCWpuZQljaF9wbnBfbAorCWVzIGxvZHN3CisJY21wdwklYngsICVheAorCWplCXByX3BucAorY2hfcG5wX2w6CQkvKiBDaGVjayAkUG5QIGZhaWxlZDsgbG9vcCB0byBuZXh0IGFkZHJlc3MgKi8KKwlhZGR3CSQxNCwgJXNpCisJYW5kdwkkMHhGRkYwLCAlc2kKKwlsb29wdwljaF9wbnAKKwlqbXAJcG5wX2VuZAorcHJfcG5wOgorCXB1c2h3CSVzaQorCWNhbGwJd3JzdHIKKwkuYXNjaWkJIiRQblAtXDAiCisJbW92dwklZXMsICVkeAorCWNhbGwJd3JoZXh3CisJbW92YgkkJzosICVhbAorCWNhbGwJd3JjaHIKKwlwb3B3CSVkeAorCWFuZHcJJDB4RkZGMCwgJWR4CisJY2FsbAl3cmhleHcKKyNlbmRpZgkvKiBERUJVR19QTlAgKi8KKwljYWxsCWNybGYKK3BucF9lbmQ6CisKKyNpZmRlZiBERUJVR19GRFQKKwkvKiBJTlQgMUVoOiBGbG9wcHkgUGFyYW1ldGVyIFRhYmxlIFBvaW50ZXIgKi8KK3ByXzFlOgljYWxsCXdyc3RyCisJLmFzY2lpCSJJTlQgMUVoOiBcMCIKKwltb3YJJGludF8xZSwlYngKKwlsZXMJKCVieCksJWRpCisJcHVzaHcJJWVzCisJcG9wdwklZHgKKwljYWxsCXdyaGV4dworCW1vdmIJJCc6LCAlYWwKKwljYWxsCXdyY2hyCisJcHVzaHcJJWRpCisJcG9wdwklZHgKKwljYWxsCXdyaGV4dworCWNhbGwJY3JsZgorCS8qIFtJTlQgMUVoXSAqLworCW1vdncJJDE0LCAlY3gKKwljYWxsCXdyaGV4YnNlcworCWNhbGwJY3JsZgorI2VuZGlmCS8qIERFQlVHX0ZEVCAqLworCitlbmQ6CisJam1wCWJvb3RmYWlsCisKKwlBU0NJSV9NQVJLRVIxCSJ3YyIKK3dyY2hyOgorCW1vdmIJJDB4MGUsICVhaAorCW1vdmIJKEJJT1NfcGFnZSksICViaAorCW1vdmIJJDB4MDcsICVibAorCWludAkkMHgxMAkJLyogTWF5IGRlc3Ryb3kgJWJwICovCisJcmV0CisKKwlBU0NJSV9NQVJLRVIxCSJ3cyIKK3dyc3RyOgorCXBvcAklc2kKK3dyc3RyX2w6CisJbG9kc2IKKwljbXBiCSQwLCAlYWwKKwlqZQl3cnN0cl9kCisJY2FsbAl3cmNocgorCWptcAl3cnN0cl9sCit3cnN0cl9kOgorCXB1c2gJJXNpCisJcmV0CisKK2NybGY6CisJY2FsbAl3cnN0cgorCS5hc2NpaQkiXHJcblwwIgorCXJldAorCisJQVNDSUlfTUFSS0VSMQkiaHgiCit3cmhleG46CisJYW5kCSQweDBGLCAlYWwKKwljbXBiCSQxMCwgJWFsCisJamFlCS5hbHBoCisJYWRkYgkkJzAsICVhbAorCWptcAkud2MKKy5hbHBoOgorCWFkZGIJJCgnQSAtIDEwKSwgJWFsCisud2M6CisJY2FsbCB3cmNocgorCXJldAorCit3cmhleGI6CisJcHVzaHcJJWN4CisJbW92YgklZGwsICVhbAorCXB1c2h3CSVheAorCW1vdmIJJDQsICVjbAorCXJvcncJJWNsLCAlYXgKKwljYWxsCXdyaGV4bgorCXBvcHcJJWF4CisJY2FsbAl3cmhleG4KKwlwb3B3CSVjeAorCXJldAorCit3cmhleHc6CisJcHVzaHcJJWN4CisJbW92YgkkOCwgJWNsCisJcm9ydwklY2wsICVkeAorCWNhbGwgd3JoZXhiCisJcm9ydwklY2wsICVkeAorCWNhbGwgd3JoZXhiCisJcG9wdwklY3gKKwlyZXQKKworCUFTQ0lJX01BUktFUjEJIkhFIgord3JoZXhic2VzOgorCXB1c2h3CSVkaQorCXBvcHcJJXNpCit3cmhleGJzZXNfbDoKKwltb3ZiCSQnICwgJWFsCisJY2FsbAl3cmNocgorCWVzIGxvZHNiCisJbW92dwklYXgsICVkeAorCWNhbGwJd3JoZXhiCisJbG9vcAl3cmhleGJzZXNfbAorCXJldAorCitkYXRhOgorCUFTQ0lJX01BUktFUjEJImJmIgorYm9vdGZhaWw6CisjaWZkZWYgREVCVUdfUEFLCisJY2FsbCB3cnN0cgorCS5hc2NpaQkiXHJcblxyXG5QcmVzcyBhbnkga2V5XHJcblwwIgorCXhvcgklYXgsICVheAorCWludAkkMHgxNgorI2VuZGlmCisJaW50CSQweDE4CQkvKiBCb290IGZhaWx1cmUgKi8KK2RpZToKKwlobHQKKwlqbXAJZGllCmRpZmYgLS1naXQgYS9kb2MvQ29kaW5nU3R5bGUudHh0IGIvZG9jL0NvZGluZ1N0eWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzllNjVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0NvZGluZ1N0eWxlLnR4dApAQCAtMCwwICsxLDgzMSBAQAorU3lzbGludXggdXNlcyBMaW51eCBrZXJuZWwgY29kaW5nIHN0eWxlLCBleGNlcHQgdGhhdCB3ZSBhcmUgImhlcmV0aWMiCitpbiB0aGUgc2Vuc2Ugb2YgdXNpbmcgNCBzcGFjZXMgaW5zdGVhZCBvZiA4IGZvciBpbmRlbnRhdGlvbi4KKworVGhpcyBjb2Rpbmcgc3R5bGUgd2lsbCBiZSBhcHBsaWVkIGFmdGVyIHRoZSAzLjgxIHJlbGVhc2UuCisKKworCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCUxpbnV4IGtlcm5lbCBjb2Rpbmcgc3R5bGUKKworVGhpcyBpcyBhIHNob3J0IGRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIHByZWZlcnJlZCBjb2Rpbmcgc3R5bGUgZm9yIHRoZQorbGludXgga2VybmVsLiAgQ29kaW5nIHN0eWxlIGlzIHZlcnkgcGVyc29uYWwsIGFuZCBJIHdvbid0IF9mb3JjZV8gbXkKK3ZpZXdzIG9uIGFueWJvZHksIGJ1dCB0aGlzIGlzIHdoYXQgZ29lcyBmb3IgYW55dGhpbmcgdGhhdCBJIGhhdmUgdG8gYmUKK2FibGUgdG8gbWFpbnRhaW4sIGFuZCBJJ2QgcHJlZmVyIGl0IGZvciBtb3N0IG90aGVyIHRoaW5ncyB0b28uICBQbGVhc2UKK2F0IGxlYXN0IGNvbnNpZGVyIHRoZSBwb2ludHMgbWFkZSBoZXJlLgorCitGaXJzdCBvZmYsIEknZCBzdWdnZXN0IHByaW50aW5nIG91dCBhIGNvcHkgb2YgdGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLAorYW5kIE5PVCByZWFkIGl0LiAgQnVybiB0aGVtLCBpdCdzIGEgZ3JlYXQgc3ltYm9saWMgZ2VzdHVyZS4KKworQW55d2F5LCBoZXJlIGdvZXM6CisKKworCSAJQ2hhcHRlciAxOiBJbmRlbnRhdGlvbgorCitUYWJzIGFyZSA4IGNoYXJhY3RlcnMsIGFuZCB0aHVzIGluZGVudGF0aW9ucyBhcmUgYWxzbyA4IGNoYXJhY3RlcnMuCitUaGVyZSBhcmUgaGVyZXRpYyBtb3ZlbWVudHMgdGhhdCB0cnkgdG8gbWFrZSBpbmRlbnRhdGlvbnMgNCAob3IgZXZlbiAyISkKK2NoYXJhY3RlcnMgZGVlcCwgYW5kIHRoYXQgaXMgYWtpbiB0byB0cnlpbmcgdG8gZGVmaW5lIHRoZSB2YWx1ZSBvZiBQSSB0bworYmUgMy4KKworUmF0aW9uYWxlOiBUaGUgd2hvbGUgaWRlYSBiZWhpbmQgaW5kZW50YXRpb24gaXMgdG8gY2xlYXJseSBkZWZpbmUgd2hlcmUKK2EgYmxvY2sgb2YgY29udHJvbCBzdGFydHMgYW5kIGVuZHMuICBFc3BlY2lhbGx5IHdoZW4geW91J3ZlIGJlZW4gbG9va2luZworYXQgeW91ciBzY3JlZW4gZm9yIDIwIHN0cmFpZ2h0IGhvdXJzLCB5b3UnbGwgZmluZCBpdCBhIGxvdCBlYXNpZXIgdG8gc2VlCitob3cgdGhlIGluZGVudGF0aW9uIHdvcmtzIGlmIHlvdSBoYXZlIGxhcmdlIGluZGVudGF0aW9ucy4KKworTm93LCBzb21lIHBlb3BsZSB3aWxsIGNsYWltIHRoYXQgaGF2aW5nIDgtY2hhcmFjdGVyIGluZGVudGF0aW9ucyBtYWtlcwordGhlIGNvZGUgbW92ZSB0b28gZmFyIHRvIHRoZSByaWdodCwgYW5kIG1ha2VzIGl0IGhhcmQgdG8gcmVhZCBvbiBhCis4MC1jaGFyYWN0ZXIgdGVybWluYWwgc2NyZWVuLiAgVGhlIGFuc3dlciB0byB0aGF0IGlzIHRoYXQgaWYgeW91IG5lZWQKK21vcmUgdGhhbiAzIGxldmVscyBvZiBpbmRlbnRhdGlvbiwgeW91J3JlIHNjcmV3ZWQgYW55d2F5LCBhbmQgc2hvdWxkIGZpeAoreW91ciBwcm9ncmFtLgorCitJbiBzaG9ydCwgOC1jaGFyIGluZGVudHMgbWFrZSB0aGluZ3MgZWFzaWVyIHRvIHJlYWQsIGFuZCBoYXZlIHRoZSBhZGRlZAorYmVuZWZpdCBvZiB3YXJuaW5nIHlvdSB3aGVuIHlvdSdyZSBuZXN0aW5nIHlvdXIgZnVuY3Rpb25zIHRvbyBkZWVwLgorSGVlZCB0aGF0IHdhcm5pbmcuCisKK1RoZSBwcmVmZXJyZWQgd2F5IHRvIGVhc2UgbXVsdGlwbGUgaW5kZW50YXRpb24gbGV2ZWxzIGluIGEgc3dpdGNoIHN0YXRlbWVudCBpcwordG8gYWxpZ24gdGhlICJzd2l0Y2giIGFuZCBpdHMgc3Vib3JkaW5hdGUgImNhc2UiIGxhYmVscyBpbiB0aGUgc2FtZSBjb2x1bW4KK2luc3RlYWQgb2YgImRvdWJsZS1pbmRlbnRpbmciIHRoZSAiY2FzZSIgbGFiZWxzLiAgRS5nLjoKKworCXN3aXRjaCAoc3VmZml4KSB7CisJY2FzZSAnRyc6CisJY2FzZSAnZyc6CisJCW1lbSA8PD0gMzA7CisJCWJyZWFrOworCWNhc2UgJ00nOgorCWNhc2UgJ20nOgorCQltZW0gPDw9IDIwOworCQlicmVhazsKKwljYXNlICdLJzoKKwljYXNlICdrJzoKKwkJbWVtIDw8PSAxMDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisKK0Rvbid0IHB1dCBtdWx0aXBsZSBzdGF0ZW1lbnRzIG9uIGEgc2luZ2xlIGxpbmUgdW5sZXNzIHlvdSBoYXZlCitzb21ldGhpbmcgdG8gaGlkZToKKworCWlmIChjb25kaXRpb24pIGRvX3RoaXM7CisJICBkb19zb21ldGhpbmdfZXZlcnl0aW1lOworCitEb24ndCBwdXQgbXVsdGlwbGUgYXNzaWdubWVudHMgb24gYSBzaW5nbGUgbGluZSBlaXRoZXIuICBLZXJuZWwgY29kaW5nIHN0eWxlCitpcyBzdXBlciBzaW1wbGUuICBBdm9pZCB0cmlja3kgZXhwcmVzc2lvbnMuCisKK091dHNpZGUgb2YgY29tbWVudHMsIGRvY3VtZW50YXRpb24gYW5kIGV4Y2VwdCBpbiBLY29uZmlnLCBzcGFjZXMgYXJlIG5ldmVyCit1c2VkIGZvciBpbmRlbnRhdGlvbiwgYW5kIHRoZSBhYm92ZSBleGFtcGxlIGlzIGRlbGliZXJhdGVseSBicm9rZW4uCisKK0dldCBhIGRlY2VudCBlZGl0b3IgYW5kIGRvbid0IGxlYXZlIHdoaXRlc3BhY2UgYXQgdGhlIGVuZCBvZiBsaW5lcy4KKworCisJCUNoYXB0ZXIgMjogQnJlYWtpbmcgbG9uZyBsaW5lcyBhbmQgc3RyaW5ncworCitDb2Rpbmcgc3R5bGUgaXMgYWxsIGFib3V0IHJlYWRhYmlsaXR5IGFuZCBtYWludGFpbmFiaWxpdHkgdXNpbmcgY29tbW9ubHkKK2F2YWlsYWJsZSB0b29scy4KKworVGhlIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgbGluZXMgaXMgODAgY29sdW1ucyBhbmQgdGhpcyBpcyBhIHN0cm9uZ2x5CitwcmVmZXJyZWQgbGltaXQuCisKK1N0YXRlbWVudHMgbG9uZ2VyIHRoYW4gODAgY29sdW1ucyB3aWxsIGJlIGJyb2tlbiBpbnRvIHNlbnNpYmxlIGNodW5rcy4KK0Rlc2NlbmRhbnRzIGFyZSBhbHdheXMgc3Vic3RhbnRpYWxseSBzaG9ydGVyIHRoYW4gdGhlIHBhcmVudCBhbmQgYXJlIHBsYWNlZAorc3Vic3RhbnRpYWxseSB0byB0aGUgcmlnaHQuIFRoZSBzYW1lIGFwcGxpZXMgdG8gZnVuY3Rpb24gaGVhZGVycyB3aXRoIGEgbG9uZworYXJndW1lbnQgbGlzdC4gTG9uZyBzdHJpbmdzIGFyZSBhcyB3ZWxsIGJyb2tlbiBpbnRvIHNob3J0ZXIgc3RyaW5ncy4gVGhlCitvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIHdoZXJlIGV4Y2VlZGluZyA4MCBjb2x1bW5zIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzCityZWFkYWJpbGl0eSBhbmQgZG9lcyBub3QgaGlkZSBpbmZvcm1hdGlvbi4KKwordm9pZCBmdW4oaW50IGEsIGludCBiLCBpbnQgYykKK3sKKwlpZiAoY29uZGl0aW9uKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nIHRoaXMgaXMgYSBsb25nIHByaW50ayB3aXRoICIKKwkJCQkJCSIzIHBhcmFtZXRlcnMgYTogJXUgYjogJXUgIgorCQkJCQkJImM6ICV1IFxuIiwgYSwgYiwgYyk7CisJZWxzZQorCQluZXh0X3N0YXRlbWVudDsKK30KKworCQlDaGFwdGVyIDM6IFBsYWNpbmcgQnJhY2VzIGFuZCBTcGFjZXMKKworVGhlIG90aGVyIGlzc3VlIHRoYXQgYWx3YXlzIGNvbWVzIHVwIGluIEMgc3R5bGluZyBpcyB0aGUgcGxhY2VtZW50IG9mCiticmFjZXMuICBVbmxpa2UgdGhlIGluZGVudCBzaXplLCB0aGVyZSBhcmUgZmV3IHRlY2huaWNhbCByZWFzb25zIHRvCitjaG9vc2Ugb25lIHBsYWNlbWVudCBzdHJhdGVneSBvdmVyIHRoZSBvdGhlciwgYnV0IHRoZSBwcmVmZXJyZWQgd2F5LCBhcworc2hvd24gdG8gdXMgYnkgdGhlIHByb3BoZXRzIEtlcm5pZ2hhbiBhbmQgUml0Y2hpZSwgaXMgdG8gcHV0IHRoZSBvcGVuaW5nCiticmFjZSBsYXN0IG9uIHRoZSBsaW5lLCBhbmQgcHV0IHRoZSBjbG9zaW5nIGJyYWNlIGZpcnN0LCB0aHVzbHk6CisKKwlpZiAoeCBpcyB0cnVlKSB7CisJCXdlIGRvIHkKKwl9CisKK1RoaXMgYXBwbGllcyB0byBhbGwgbm9uLWZ1bmN0aW9uIHN0YXRlbWVudCBibG9ja3MgKGlmLCBzd2l0Y2gsIGZvciwKK3doaWxlLCBkbykuICBFLmcuOgorCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIEtPQkpfQUREOgorCQlyZXR1cm4gImFkZCI7CisJY2FzZSBLT0JKX1JFTU9WRToKKwkJcmV0dXJuICJyZW1vdmUiOworCWNhc2UgS09CSl9DSEFOR0U6CisJCXJldHVybiAiY2hhbmdlIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisKK0hvd2V2ZXIsIHRoZXJlIGlzIG9uZSBzcGVjaWFsIGNhc2UsIG5hbWVseSBmdW5jdGlvbnM6IHRoZXkgaGF2ZSB0aGUKK29wZW5pbmcgYnJhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBsaW5lLCB0aHVzOgorCisJaW50IGZ1bmN0aW9uKGludCB4KQorCXsKKwkJYm9keSBvZiBmdW5jdGlvbgorCX0KKworSGVyZXRpYyBwZW9wbGUgYWxsIG92ZXIgdGhlIHdvcmxkIGhhdmUgY2xhaW1lZCB0aGF0IHRoaXMgaW5jb25zaXN0ZW5jeQoraXMgLi4uICB3ZWxsIC4uLiAgaW5jb25zaXN0ZW50LCBidXQgYWxsIHJpZ2h0LXRoaW5raW5nIHBlb3BsZSBrbm93IHRoYXQKKyhhKSBLJlIgYXJlIF9yaWdodF8gYW5kIChiKSBLJlIgYXJlIHJpZ2h0LiAgQmVzaWRlcywgZnVuY3Rpb25zIGFyZQorc3BlY2lhbCBhbnl3YXkgKHlvdSBjYW4ndCBuZXN0IHRoZW0gaW4gQykuCisKK05vdGUgdGhhdCB0aGUgY2xvc2luZyBicmFjZSBpcyBlbXB0eSBvbiBhIGxpbmUgb2YgaXRzIG93biwgX2V4Y2VwdF8gaW4KK3RoZSBjYXNlcyB3aGVyZSBpdCBpcyBmb2xsb3dlZCBieSBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgc2FtZSBzdGF0ZW1lbnQsCitpZSBhICJ3aGlsZSIgaW4gYSBkby1zdGF0ZW1lbnQgb3IgYW4gImVsc2UiIGluIGFuIGlmLXN0YXRlbWVudCwgbGlrZQordGhpczoKKworCWRvIHsKKwkJYm9keSBvZiBkby1sb29wCisJfSB3aGlsZSAoY29uZGl0aW9uKTsKKworYW5kCisKKwlpZiAoeCA9PSB5KSB7CisJCS4uCisJfSBlbHNlIGlmICh4ID4geSkgeworCQkuLi4KKwl9IGVsc2UgeworCQkuLi4uCisJfQorCitSYXRpb25hbGU6IEsmUi4KKworQWxzbywgbm90ZSB0aGF0IHRoaXMgYnJhY2UtcGxhY2VtZW50IGFsc28gbWluaW1pemVzIHRoZSBudW1iZXIgb2YgZW1wdHkKKyhvciBhbG1vc3QgZW1wdHkpIGxpbmVzLCB3aXRob3V0IGFueSBsb3NzIG9mIHJlYWRhYmlsaXR5LiAgVGh1cywgYXMgdGhlCitzdXBwbHkgb2YgbmV3LWxpbmVzIG9uIHlvdXIgc2NyZWVuIGlzIG5vdCBhIHJlbmV3YWJsZSByZXNvdXJjZSAodGhpbmsKKzI1LWxpbmUgdGVybWluYWwgc2NyZWVucyBoZXJlKSwgeW91IGhhdmUgbW9yZSBlbXB0eSBsaW5lcyB0byBwdXQKK2NvbW1lbnRzIG9uLgorCitEbyBub3QgdW5uZWNlc3NhcmlseSB1c2UgYnJhY2VzIHdoZXJlIGEgc2luZ2xlIHN0YXRlbWVudCB3aWxsIGRvLgorCitpZiAoY29uZGl0aW9uKQorCWFjdGlvbigpOworCitUaGlzIGRvZXMgbm90IGFwcGx5IGlmIG9uZSBicmFuY2ggb2YgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgaXMgYSBzaW5nbGUKK3N0YXRlbWVudC4gVXNlIGJyYWNlcyBpbiBib3RoIGJyYW5jaGVzLgorCitpZiAoY29uZGl0aW9uKSB7CisJZG9fdGhpcygpOworCWRvX3RoYXQoKTsKK30gZWxzZSB7CisJb3RoZXJ3aXNlKCk7Cit9CisKKwkJMy4xOiAgU3BhY2VzCisKK0xpbnV4IGtlcm5lbCBzdHlsZSBmb3IgdXNlIG9mIHNwYWNlcyBkZXBlbmRzIChtb3N0bHkpIG9uCitmdW5jdGlvbi12ZXJzdXMta2V5d29yZCB1c2FnZS4gIFVzZSBhIHNwYWNlIGFmdGVyIChtb3N0KSBrZXl3b3Jkcy4gIFRoZQorbm90YWJsZSBleGNlcHRpb25zIGFyZSBzaXplb2YsIHR5cGVvZiwgYWxpZ25vZiwgYW5kIF9fYXR0cmlidXRlX18sIHdoaWNoIGxvb2sKK3NvbWV3aGF0IGxpa2UgZnVuY3Rpb25zIChhbmQgYXJlIHVzdWFsbHkgdXNlZCB3aXRoIHBhcmVudGhlc2VzIGluIExpbnV4LAorYWx0aG91Z2ggdGhleSBhcmUgbm90IHJlcXVpcmVkIGluIHRoZSBsYW5ndWFnZSwgYXMgaW46ICJzaXplb2YgaW5mbyIgYWZ0ZXIKKyJzdHJ1Y3QgZmlsZWluZm8gaW5mbzsiIGlzIGRlY2xhcmVkKS4KKworU28gdXNlIGEgc3BhY2UgYWZ0ZXIgdGhlc2Uga2V5d29yZHM6CisJaWYsIHN3aXRjaCwgY2FzZSwgZm9yLCBkbywgd2hpbGUKK2J1dCBub3Qgd2l0aCBzaXplb2YsIHR5cGVvZiwgYWxpZ25vZiwgb3IgX19hdHRyaWJ1dGVfXy4gIEUuZy4sCisJcyA9IHNpemVvZihzdHJ1Y3QgZmlsZSk7CisKK0RvIG5vdCBhZGQgc3BhY2VzIGFyb3VuZCAoaW5zaWRlKSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25zLiAgVGhpcyBleGFtcGxlIGlzCisqYmFkKjoKKworCXMgPSBzaXplb2YoIHN0cnVjdCBmaWxlICk7CisKK1doZW4gZGVjbGFyaW5nIHBvaW50ZXIgZGF0YSBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHBvaW50ZXIgdHlwZSwgdGhlCitwcmVmZXJyZWQgdXNlIG9mICcqJyBpcyBhZGphY2VudCB0byB0aGUgZGF0YSBuYW1lIG9yIGZ1bmN0aW9uIG5hbWUgYW5kIG5vdAorYWRqYWNlbnQgdG8gdGhlIHR5cGUgbmFtZS4gIEV4YW1wbGVzOgorCisJY2hhciAqbGludXhfYmFubmVyOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtZW1wYXJzZShjaGFyICpwdHIsIGNoYXIgKipyZXRwdHIpOworCWNoYXIgKm1hdGNoX3N0cmR1cChzdWJzdHJpbmdfdCAqcyk7CisKK1VzZSBvbmUgc3BhY2UgYXJvdW5kIChvbiBlYWNoIHNpZGUgb2YpIG1vc3QgYmluYXJ5IGFuZCB0ZXJuYXJ5IG9wZXJhdG9ycywKK3N1Y2ggYXMgYW55IG9mIHRoZXNlOgorCisJPSAgKyAgLSAgPCAgPiAgKiAgLyAgJSAgfCAgJiAgXiAgPD0gID49ICA9PSAgIT0gID8gIDoKKworYnV0IG5vIHNwYWNlIGFmdGVyIHVuYXJ5IG9wZXJhdG9yczoKKwkmICAqICArICAtICB+ICAhICBzaXplb2YgIHR5cGVvZiAgYWxpZ25vZiAgX19hdHRyaWJ1dGVfXyAgZGVmaW5lZAorCitubyBzcGFjZSBiZWZvcmUgdGhlIHBvc3RmaXggaW5jcmVtZW50ICYgZGVjcmVtZW50IHVuYXJ5IG9wZXJhdG9yczoKKwkrKyAgLS0KKworbm8gc3BhY2UgYWZ0ZXIgdGhlIHByZWZpeCBpbmNyZW1lbnQgJiBkZWNyZW1lbnQgdW5hcnkgb3BlcmF0b3JzOgorCSsrICAtLQorCithbmQgbm8gc3BhY2UgYXJvdW5kIHRoZSAnLicgYW5kICItPiIgc3RydWN0dXJlIG1lbWJlciBvcGVyYXRvcnMuCisKK0RvIG5vdCBsZWF2ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGF0IHRoZSBlbmRzIG9mIGxpbmVzLiAgU29tZSBlZGl0b3JzIHdpdGgKKyJzbWFydCIgaW5kZW50YXRpb24gd2lsbCBpbnNlcnQgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIG5ldyBsaW5lcyBhcworYXBwcm9wcmlhdGUsIHNvIHlvdSBjYW4gc3RhcnQgdHlwaW5nIHRoZSBuZXh0IGxpbmUgb2YgY29kZSByaWdodCBhd2F5LgorSG93ZXZlciwgc29tZSBzdWNoIGVkaXRvcnMgZG8gbm90IHJlbW92ZSB0aGUgd2hpdGVzcGFjZSBpZiB5b3UgZW5kIHVwIG5vdAorcHV0dGluZyBhIGxpbmUgb2YgY29kZSB0aGVyZSwgc3VjaCBhcyBpZiB5b3UgbGVhdmUgYSBibGFuayBsaW5lLiAgQXMgYSByZXN1bHQsCit5b3UgZW5kIHVwIHdpdGggbGluZXMgY29udGFpbmluZyB0cmFpbGluZyB3aGl0ZXNwYWNlLgorCitHaXQgd2lsbCB3YXJuIHlvdSBhYm91dCBwYXRjaGVzIHRoYXQgaW50cm9kdWNlIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGFuZCBjYW4KK29wdGlvbmFsbHkgc3RyaXAgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZm9yIHlvdTsgaG93ZXZlciwgaWYgYXBwbHlpbmcgYSBzZXJpZXMKK29mIHBhdGNoZXMsIHRoaXMgbWF5IG1ha2UgbGF0ZXIgcGF0Y2hlcyBpbiB0aGUgc2VyaWVzIGZhaWwgYnkgY2hhbmdpbmcgdGhlaXIKK2NvbnRleHQgbGluZXMuCisKKworCQlDaGFwdGVyIDQ6IE5hbWluZworCitDIGlzIGEgU3BhcnRhbiBsYW5ndWFnZSwgYW5kIHNvIHNob3VsZCB5b3VyIG5hbWluZyBiZS4gIFVubGlrZSBNb2R1bGEtMgorYW5kIFBhc2NhbCBwcm9ncmFtbWVycywgQyBwcm9ncmFtbWVycyBkbyBub3QgdXNlIGN1dGUgbmFtZXMgbGlrZQorVGhpc1ZhcmlhYmxlSXNBVGVtcG9yYXJ5Q291bnRlci4gIEEgQyBwcm9ncmFtbWVyIHdvdWxkIGNhbGwgdGhhdAordmFyaWFibGUgInRtcCIsIHdoaWNoIGlzIG11Y2ggZWFzaWVyIHRvIHdyaXRlLCBhbmQgbm90IHRoZSBsZWFzdCBtb3JlCitkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZC4KKworSE9XRVZFUiwgd2hpbGUgbWl4ZWQtY2FzZSBuYW1lcyBhcmUgZnJvd25lZCB1cG9uLCBkZXNjcmlwdGl2ZSBuYW1lcyBmb3IKK2dsb2JhbCB2YXJpYWJsZXMgYXJlIGEgbXVzdC4gIFRvIGNhbGwgYSBnbG9iYWwgZnVuY3Rpb24gImZvbyIgaXMgYQorc2hvb3Rpbmcgb2ZmZW5zZS4KKworR0xPQkFMIHZhcmlhYmxlcyAodG8gYmUgdXNlZCBvbmx5IGlmIHlvdSBfcmVhbGx5XyBuZWVkIHRoZW0pIG5lZWQgdG8KK2hhdmUgZGVzY3JpcHRpdmUgbmFtZXMsIGFzIGRvIGdsb2JhbCBmdW5jdGlvbnMuICBJZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uCit0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB1c2VycywgeW91IHNob3VsZCBjYWxsIHRoYXQKKyJjb3VudF9hY3RpdmVfdXNlcnMoKSIgb3Igc2ltaWxhciwgeW91IHNob3VsZCBfbm90XyBjYWxsIGl0ICJjbnR1c3IoKSIuCisKK0VuY29kaW5nIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gaW50byB0aGUgbmFtZSAoc28tY2FsbGVkIEh1bmdhcmlhbgorbm90YXRpb24pIGlzIGJyYWluIGRhbWFnZWQgLSB0aGUgY29tcGlsZXIga25vd3MgdGhlIHR5cGVzIGFueXdheSBhbmQgY2FuCitjaGVjayB0aG9zZSwgYW5kIGl0IG9ubHkgY29uZnVzZXMgdGhlIHByb2dyYW1tZXIuICBObyB3b25kZXIgTWljcm9Tb2Z0CittYWtlcyBidWdneSBwcm9ncmFtcy4KKworTE9DQUwgdmFyaWFibGUgbmFtZXMgc2hvdWxkIGJlIHNob3J0LCBhbmQgdG8gdGhlIHBvaW50LiAgSWYgeW91IGhhdmUKK3NvbWUgcmFuZG9tIGludGVnZXIgbG9vcCBjb3VudGVyLCBpdCBzaG91bGQgcHJvYmFibHkgYmUgY2FsbGVkICJpIi4KK0NhbGxpbmcgaXQgImxvb3BfY291bnRlciIgaXMgbm9uLXByb2R1Y3RpdmUsIGlmIHRoZXJlIGlzIG5vIGNoYW5jZSBvZiBpdAorYmVpbmcgbWlzLXVuZGVyc3Rvb2QuICBTaW1pbGFybHksICJ0bXAiIGNhbiBiZSBqdXN0IGFib3V0IGFueSB0eXBlIG9mCit2YXJpYWJsZSB0aGF0IGlzIHVzZWQgdG8gaG9sZCBhIHRlbXBvcmFyeSB2YWx1ZS4KKworSWYgeW91IGFyZSBhZnJhaWQgdG8gbWl4IHVwIHlvdXIgbG9jYWwgdmFyaWFibGUgbmFtZXMsIHlvdSBoYXZlIGFub3RoZXIKK3Byb2JsZW0sIHdoaWNoIGlzIGNhbGxlZCB0aGUgZnVuY3Rpb24tZ3Jvd3RoLWhvcm1vbmUtaW1iYWxhbmNlIHN5bmRyb21lLgorU2VlIGNoYXB0ZXIgNiAoRnVuY3Rpb25zKS4KKworCisJCUNoYXB0ZXIgNTogVHlwZWRlZnMKKworUGxlYXNlIGRvbid0IHVzZSB0aGluZ3MgbGlrZSAidnBzX3QiLgorCitJdCdzIGEgX21pc3Rha2VfIHRvIHVzZSB0eXBlZGVmIGZvciBzdHJ1Y3R1cmVzIGFuZCBwb2ludGVycy4gV2hlbiB5b3Ugc2VlIGEKKworCXZwc190IGE7CisKK2luIHRoZSBzb3VyY2UsIHdoYXQgZG9lcyBpdCBtZWFuPworCitJbiBjb250cmFzdCwgaWYgaXQgc2F5cworCisJc3RydWN0IHZpcnR1YWxfY29udGFpbmVyICphOworCit5b3UgY2FuIGFjdHVhbGx5IHRlbGwgd2hhdCAiYSIgaXMuCisKK0xvdHMgb2YgcGVvcGxlIHRoaW5rIHRoYXQgdHlwZWRlZnMgImhlbHAgcmVhZGFiaWxpdHkiLiBOb3Qgc28uIFRoZXkgYXJlCit1c2VmdWwgb25seSBmb3I6CisKKyAoYSkgdG90YWxseSBvcGFxdWUgb2JqZWN0cyAod2hlcmUgdGhlIHR5cGVkZWYgaXMgYWN0aXZlbHkgdXNlZCB0byBfaGlkZV8KKyAgICAgd2hhdCB0aGUgb2JqZWN0IGlzKS4KKworICAgICBFeGFtcGxlOiAicHRlX3QiIGV0Yy4gb3BhcXVlIG9iamVjdHMgdGhhdCB5b3UgY2FuIG9ubHkgYWNjZXNzIHVzaW5nCisgICAgIHRoZSBwcm9wZXIgYWNjZXNzb3IgZnVuY3Rpb25zLgorCisgICAgIE5PVEUhIE9wYXF1ZW5lc3MgYW5kICJhY2Nlc3NvciBmdW5jdGlvbnMiIGFyZSBub3QgZ29vZCBpbiB0aGVtc2VsdmVzLgorICAgICBUaGUgcmVhc29uIHdlIGhhdmUgdGhlbSBmb3IgdGhpbmdzIGxpa2UgcHRlX3QgZXRjLiBpcyB0aGF0IHRoZXJlCisgICAgIHJlYWxseSBpcyBhYnNvbHV0ZWx5IF96ZXJvXyBwb3J0YWJseSBhY2Nlc3NpYmxlIGluZm9ybWF0aW9uIHRoZXJlLgorCisgKGIpIENsZWFyIGludGVnZXIgdHlwZXMsIHdoZXJlIHRoZSBhYnN0cmFjdGlvbiBfaGVscHNfIGF2b2lkIGNvbmZ1c2lvbgorICAgICB3aGV0aGVyIGl0IGlzICJpbnQiIG9yICJsb25nIi4KKworICAgICB1OC91MTYvdTMyIGFyZSBwZXJmZWN0bHkgZmluZSB0eXBlZGVmcywgYWx0aG91Z2ggdGhleSBmaXQgaW50bworICAgICBjYXRlZ29yeSAoZCkgYmV0dGVyIHRoYW4gaGVyZS4KKworICAgICBOT1RFISBBZ2FpbiAtIHRoZXJlIG5lZWRzIHRvIGJlIGEgX3JlYXNvbl8gZm9yIHRoaXMuIElmIHNvbWV0aGluZyBpcworICAgICAidW5zaWduZWQgbG9uZyIsIHRoZW4gdGhlcmUncyBubyByZWFzb24gdG8gZG8KKworCXR5cGVkZWYgdW5zaWduZWQgbG9uZyBteWZsYWdzX3Q7CisKKyAgICAgYnV0IGlmIHRoZXJlIGlzIGEgY2xlYXIgcmVhc29uIGZvciB3aHkgaXQgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzCisgICAgIG1pZ2h0IGJlIGFuICJ1bnNpZ25lZCBpbnQiIGFuZCB1bmRlciBvdGhlciBjb25maWd1cmF0aW9ucyBtaWdodCBiZQorICAgICAidW5zaWduZWQgbG9uZyIsIHRoZW4gYnkgYWxsIG1lYW5zIGdvIGFoZWFkIGFuZCB1c2UgYSB0eXBlZGVmLgorCisgKGMpIHdoZW4geW91IHVzZSBzcGFyc2UgdG8gbGl0ZXJhbGx5IGNyZWF0ZSBhIF9uZXdfIHR5cGUgZm9yCisgICAgIHR5cGUtY2hlY2tpbmcuCisKKyAoZCkgTmV3IHR5cGVzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gc3RhbmRhcmQgQzk5IHR5cGVzLCBpbiBjZXJ0YWluCisgICAgIGV4Y2VwdGlvbmFsIGNpcmN1bXN0YW5jZXMuCisKKyAgICAgQWx0aG91Z2ggaXQgd291bGQgb25seSB0YWtlIGEgc2hvcnQgYW1vdW50IG9mIHRpbWUgZm9yIHRoZSBleWVzIGFuZAorICAgICBicmFpbiB0byBiZWNvbWUgYWNjdXN0b21lZCB0byB0aGUgc3RhbmRhcmQgdHlwZXMgbGlrZSAndWludDMyX3QnLAorICAgICBzb21lIHBlb3BsZSBvYmplY3QgdG8gdGhlaXIgdXNlIGFueXdheS4KKworICAgICBUaGVyZWZvcmUsIHRoZSBMaW51eC1zcGVjaWZpYyAndTgvdTE2L3UzMi91NjQnIHR5cGVzIGFuZCB0aGVpcgorICAgICBzaWduZWQgZXF1aXZhbGVudHMgd2hpY2ggYXJlIGlkZW50aWNhbCB0byBzdGFuZGFyZCB0eXBlcyBhcmUKKyAgICAgcGVybWl0dGVkIC0tIGFsdGhvdWdoIHRoZXkgYXJlIG5vdCBtYW5kYXRvcnkgaW4gbmV3IGNvZGUgb2YgeW91cgorICAgICBvd24uCisKKyAgICAgV2hlbiBlZGl0aW5nIGV4aXN0aW5nIGNvZGUgd2hpY2ggYWxyZWFkeSB1c2VzIG9uZSBvciB0aGUgb3RoZXIgc2V0CisgICAgIG9mIHR5cGVzLCB5b3Ugc2hvdWxkIGNvbmZvcm0gdG8gdGhlIGV4aXN0aW5nIGNob2ljZXMgaW4gdGhhdCBjb2RlLgorCisgKGUpIFR5cGVzIHNhZmUgZm9yIHVzZSBpbiB1c2Vyc3BhY2UuCisKKyAgICAgSW4gY2VydGFpbiBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSB2aXNpYmxlIHRvIHVzZXJzcGFjZSwgd2UgY2Fubm90CisgICAgIHJlcXVpcmUgQzk5IHR5cGVzIGFuZCBjYW5ub3QgdXNlIHRoZSAndTMyJyBmb3JtIGFib3ZlLiBUaHVzLCB3ZQorICAgICB1c2UgX191MzIgYW5kIHNpbWlsYXIgdHlwZXMgaW4gYWxsIHN0cnVjdHVyZXMgd2hpY2ggYXJlIHNoYXJlZAorICAgICB3aXRoIHVzZXJzcGFjZS4KKworTWF5YmUgdGhlcmUgYXJlIG90aGVyIGNhc2VzIHRvbywgYnV0IHRoZSBydWxlIHNob3VsZCBiYXNpY2FsbHkgYmUgdG8gTkVWRVIKK0VWRVIgdXNlIGEgdHlwZWRlZiB1bmxlc3MgeW91IGNhbiBjbGVhcmx5IG1hdGNoIG9uZSBvZiB0aG9zZSBydWxlcy4KKworSW4gZ2VuZXJhbCwgYSBwb2ludGVyLCBvciBhIHN0cnVjdCB0aGF0IGhhcyBlbGVtZW50cyB0aGF0IGNhbiByZWFzb25hYmx5CitiZSBkaXJlY3RseSBhY2Nlc3NlZCBzaG91bGQgX25ldmVyXyBiZSBhIHR5cGVkZWYuCisKKworCQlDaGFwdGVyIDY6IEZ1bmN0aW9ucworCitGdW5jdGlvbnMgc2hvdWxkIGJlIHNob3J0IGFuZCBzd2VldCwgYW5kIGRvIGp1c3Qgb25lIHRoaW5nLiAgVGhleSBzaG91bGQKK2ZpdCBvbiBvbmUgb3IgdHdvIHNjcmVlbmZ1bHMgb2YgdGV4dCAodGhlIElTTy9BTlNJIHNjcmVlbiBzaXplIGlzIDgweDI0LAorYXMgd2UgYWxsIGtub3cpLCBhbmQgZG8gb25lIHRoaW5nIGFuZCBkbyB0aGF0IHdlbGwuCisKK1RoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGZ1bmN0aW9uIGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlCitjb21wbGV4aXR5IGFuZCBpbmRlbnRhdGlvbiBsZXZlbCBvZiB0aGF0IGZ1bmN0aW9uLiAgU28sIGlmIHlvdSBoYXZlIGEKK2NvbmNlcHR1YWxseSBzaW1wbGUgZnVuY3Rpb24gdGhhdCBpcyBqdXN0IG9uZSBsb25nIChidXQgc2ltcGxlKQorY2FzZS1zdGF0ZW1lbnQsIHdoZXJlIHlvdSBoYXZlIHRvIGRvIGxvdHMgb2Ygc21hbGwgdGhpbmdzIGZvciBhIGxvdCBvZgorZGlmZmVyZW50IGNhc2VzLCBpdCdzIE9LIHRvIGhhdmUgYSBsb25nZXIgZnVuY3Rpb24uCisKK0hvd2V2ZXIsIGlmIHlvdSBoYXZlIGEgY29tcGxleCBmdW5jdGlvbiwgYW5kIHlvdSBzdXNwZWN0IHRoYXQgYQorbGVzcy10aGFuLWdpZnRlZCBmaXJzdC15ZWFyIGhpZ2gtc2Nob29sIHN0dWRlbnQgbWlnaHQgbm90IGV2ZW4KK3VuZGVyc3RhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgYWxsIGFib3V0LCB5b3Ugc2hvdWxkIGFkaGVyZSB0byB0aGUKK21heGltdW0gbGltaXRzIGFsbCB0aGUgbW9yZSBjbG9zZWx5LiAgVXNlIGhlbHBlciBmdW5jdGlvbnMgd2l0aAorZGVzY3JpcHRpdmUgbmFtZXMgKHlvdSBjYW4gYXNrIHRoZSBjb21waWxlciB0byBpbi1saW5lIHRoZW0gaWYgeW91IHRoaW5rCitpdCdzIHBlcmZvcm1hbmNlLWNyaXRpY2FsLCBhbmQgaXQgd2lsbCBwcm9iYWJseSBkbyBhIGJldHRlciBqb2Igb2YgaXQKK3RoYW4geW91IHdvdWxkIGhhdmUgZG9uZSkuCisKK0Fub3RoZXIgbWVhc3VyZSBvZiB0aGUgZnVuY3Rpb24gaXMgdGhlIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMuICBUaGV5CitzaG91bGRuJ3QgZXhjZWVkIDUtMTAsIG9yIHlvdSdyZSBkb2luZyBzb21ldGhpbmcgd3JvbmcuICBSZS10aGluayB0aGUKK2Z1bmN0aW9uLCBhbmQgc3BsaXQgaXQgaW50byBzbWFsbGVyIHBpZWNlcy4gIEEgaHVtYW4gYnJhaW4gY2FuCitnZW5lcmFsbHkgZWFzaWx5IGtlZXAgdHJhY2sgb2YgYWJvdXQgNyBkaWZmZXJlbnQgdGhpbmdzLCBhbnl0aGluZyBtb3JlCithbmQgaXQgZ2V0cyBjb25mdXNlZC4gIFlvdSBrbm93IHlvdSdyZSBicmlsbGlhbnQsIGJ1dCBtYXliZSB5b3UnZCBsaWtlCit0byB1bmRlcnN0YW5kIHdoYXQgeW91IGRpZCAyIHdlZWtzIGZyb20gbm93LgorCitJbiBzb3VyY2UgZmlsZXMsIHNlcGFyYXRlIGZ1bmN0aW9ucyB3aXRoIG9uZSBibGFuayBsaW5lLiAgSWYgdGhlIGZ1bmN0aW9uIGlzCitleHBvcnRlZCwgdGhlIEVYUE9SVCogbWFjcm8gZm9yIGl0IHNob3VsZCBmb2xsb3cgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNsb3NpbmcKK2Z1bmN0aW9uIGJyYWNlIGxpbmUuICBFLmcuOgorCitpbnQgc3lzdGVtX2lzX3VwKHZvaWQpCit7CisJcmV0dXJuIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORzsKK30KK0VYUE9SVF9TWU1CT0woc3lzdGVtX2lzX3VwKTsKKworSW4gZnVuY3Rpb24gcHJvdG90eXBlcywgaW5jbHVkZSBwYXJhbWV0ZXIgbmFtZXMgd2l0aCB0aGVpciBkYXRhIHR5cGVzLgorQWx0aG91Z2ggdGhpcyBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIEMgbGFuZ3VhZ2UsIGl0IGlzIHByZWZlcnJlZCBpbiBMaW51eAorYmVjYXVzZSBpdCBpcyBhIHNpbXBsZSB3YXkgdG8gYWRkIHZhbHVhYmxlIGluZm9ybWF0aW9uIGZvciB0aGUgcmVhZGVyLgorCisKKwkJQ2hhcHRlciA3OiBDZW50cmFsaXplZCBleGl0aW5nIG9mIGZ1bmN0aW9ucworCitBbGJlaXQgZGVwcmVjYXRlZCBieSBzb21lIHBlb3BsZSwgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGdvdG8gc3RhdGVtZW50IGlzCit1c2VkIGZyZXF1ZW50bHkgYnkgY29tcGlsZXJzIGluIGZvcm0gb2YgdGhlIHVuY29uZGl0aW9uYWwganVtcCBpbnN0cnVjdGlvbi4KKworVGhlIGdvdG8gc3RhdGVtZW50IGNvbWVzIGluIGhhbmR5IHdoZW4gYSBmdW5jdGlvbiBleGl0cyBmcm9tIG11bHRpcGxlCitsb2NhdGlvbnMgYW5kIHNvbWUgY29tbW9uIHdvcmsgc3VjaCBhcyBjbGVhbnVwIGhhcyB0byBiZSBkb25lLgorCitUaGUgcmF0aW9uYWxlIGlzOgorCistIHVuY29uZGl0aW9uYWwgc3RhdGVtZW50cyBhcmUgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYW5kIGZvbGxvdworLSBuZXN0aW5nIGlzIHJlZHVjZWQKKy0gZXJyb3JzIGJ5IG5vdCB1cGRhdGluZyBpbmRpdmlkdWFsIGV4aXQgcG9pbnRzIHdoZW4gbWFraW5nCisgICAgbW9kaWZpY2F0aW9ucyBhcmUgcHJldmVudGVkCistIHNhdmVzIHRoZSBjb21waWxlciB3b3JrIHRvIG9wdGltaXplIHJlZHVuZGFudCBjb2RlIGF3YXkgOykKKworaW50IGZ1bihpbnQgYSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwljaGFyICpidWZmZXIgPSBrbWFsbG9jKFNJWkUpOworCisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb25kaXRpb24xKSB7CisJCXdoaWxlIChsb29wMSkgeworCQkJLi4uCisJCX0KKwkJcmVzdWx0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCS4uLgorb3V0OgorCWtmcmVlKGJ1ZmZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCQlDaGFwdGVyIDg6IENvbW1lbnRpbmcKKworQ29tbWVudHMgYXJlIGdvb2QsIGJ1dCB0aGVyZSBpcyBhbHNvIGEgZGFuZ2VyIG9mIG92ZXItY29tbWVudGluZy4gIE5FVkVSCit0cnkgdG8gZXhwbGFpbiBIT1cgeW91ciBjb2RlIHdvcmtzIGluIGEgY29tbWVudDogaXQncyBtdWNoIGJldHRlciB0bword3JpdGUgdGhlIGNvZGUgc28gdGhhdCB0aGUgX3dvcmtpbmdfIGlzIG9idmlvdXMsIGFuZCBpdCdzIGEgd2FzdGUgb2YKK3RpbWUgdG8gZXhwbGFpbiBiYWRseSB3cml0dGVuIGNvZGUuCisKK0dlbmVyYWxseSwgeW91IHdhbnQgeW91ciBjb21tZW50cyB0byB0ZWxsIFdIQVQgeW91ciBjb2RlIGRvZXMsIG5vdCBIT1cuCitBbHNvLCB0cnkgdG8gYXZvaWQgcHV0dGluZyBjb21tZW50cyBpbnNpZGUgYSBmdW5jdGlvbiBib2R5OiBpZiB0aGUKK2Z1bmN0aW9uIGlzIHNvIGNvbXBsZXggdGhhdCB5b3UgbmVlZCB0byBzZXBhcmF0ZWx5IGNvbW1lbnQgcGFydHMgb2YgaXQsCit5b3Ugc2hvdWxkIHByb2JhYmx5IGdvIGJhY2sgdG8gY2hhcHRlciA2IGZvciBhIHdoaWxlLiAgWW91IGNhbiBtYWtlCitzbWFsbCBjb21tZW50cyB0byBub3RlIG9yIHdhcm4gYWJvdXQgc29tZXRoaW5nIHBhcnRpY3VsYXJseSBjbGV2ZXIgKG9yCit1Z2x5KSwgYnV0IHRyeSB0byBhdm9pZCBleGNlc3MuICBJbnN0ZWFkLCBwdXQgdGhlIGNvbW1lbnRzIGF0IHRoZSBoZWFkCitvZiB0aGUgZnVuY3Rpb24sIHRlbGxpbmcgcGVvcGxlIHdoYXQgaXQgZG9lcywgYW5kIHBvc3NpYmx5IFdIWSBpdCBkb2VzCitpdC4KKworV2hlbiBjb21tZW50aW5nIHRoZSBrZXJuZWwgQVBJIGZ1bmN0aW9ucywgcGxlYXNlIHVzZSB0aGUga2VybmVsLWRvYyBmb3JtYXQuCitTZWUgdGhlIGZpbGVzIERvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dCBhbmQgc2NyaXB0cy9rZXJuZWwtZG9jCitmb3IgZGV0YWlscy4KKworTGludXggc3R5bGUgZm9yIGNvbW1lbnRzIGlzIHRoZSBDODkgIi8qIC4uLiAqLyIgc3R5bGUuCitEb24ndCB1c2UgQzk5LXN0eWxlICIvLyAuLi4iIGNvbW1lbnRzLgorCitUaGUgcHJlZmVycmVkIHN0eWxlIGZvciBsb25nIChtdWx0aS1saW5lKSBjb21tZW50cyBpczoKKworCS8qCisJICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIHN0eWxlIGZvciBtdWx0aS1saW5lCisJICogY29tbWVudHMgaW4gdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UgY29kZS4KKwkgKiBQbGVhc2UgdXNlIGl0IGNvbnNpc3RlbnRseS4KKwkgKgorCSAqIERlc2NyaXB0aW9uOiAgQSBjb2x1bW4gb2YgYXN0ZXJpc2tzIG9uIHRoZSBsZWZ0IHNpZGUsCisJICogd2l0aCBiZWdpbm5pbmcgYW5kIGVuZGluZyBhbG1vc3QtYmxhbmsgbGluZXMuCisJICovCisKK0l0J3MgYWxzbyBpbXBvcnRhbnQgdG8gY29tbWVudCBkYXRhLCB3aGV0aGVyIHRoZXkgYXJlIGJhc2ljIHR5cGVzIG9yIGRlcml2ZWQKK3R5cGVzLiAgVG8gdGhpcyBlbmQsIHVzZSBqdXN0IG9uZSBkYXRhIGRlY2xhcmF0aW9uIHBlciBsaW5lIChubyBjb21tYXMgZm9yCittdWx0aXBsZSBkYXRhIGRlY2xhcmF0aW9ucykuICBUaGlzIGxlYXZlcyB5b3Ugcm9vbSBmb3IgYSBzbWFsbCBjb21tZW50IG9uIGVhY2gKK2l0ZW0sIGV4cGxhaW5pbmcgaXRzIHVzZS4KKworCisJCUNoYXB0ZXIgOTogWW91J3ZlIG1hZGUgYSBtZXNzIG9mIGl0CisKK1RoYXQncyBPSywgd2UgYWxsIGRvLiAgWW91J3ZlIHByb2JhYmx5IGJlZW4gdG9sZCBieSB5b3VyIGxvbmctdGltZSBVbml4Cit1c2VyIGhlbHBlciB0aGF0ICJHTlUgZW1hY3MiIGF1dG9tYXRpY2FsbHkgZm9ybWF0cyB0aGUgQyBzb3VyY2VzIGZvcgoreW91LCBhbmQgeW91J3ZlIG5vdGljZWQgdGhhdCB5ZXMsIGl0IGRvZXMgZG8gdGhhdCwgYnV0IHRoZSBkZWZhdWx0cyBpdAordXNlcyBhcmUgbGVzcyB0aGFuIGRlc2lyYWJsZSAoaW4gZmFjdCwgdGhleSBhcmUgd29yc2UgdGhhbiByYW5kb20KK3R5cGluZyAtIGFuIGluZmluaXRlIG51bWJlciBvZiBtb25rZXlzIHR5cGluZyBpbnRvIEdOVSBlbWFjcyB3b3VsZCBuZXZlcgorbWFrZSBhIGdvb2QgcHJvZ3JhbSkuCisKK1NvLCB5b3UgY2FuIGVpdGhlciBnZXQgcmlkIG9mIEdOVSBlbWFjcywgb3IgY2hhbmdlIGl0IHRvIHVzZSBzYW5lcgordmFsdWVzLiAgVG8gZG8gdGhlIGxhdHRlciwgeW91IGNhbiBzdGljayB0aGUgZm9sbG93aW5nIGluIHlvdXIgLmVtYWNzIGZpbGU6CisKKyhkZWZ1biBjLWxpbmV1cC1hcmdsaXN0LXRhYnMtb25seSAoaWdub3JlZCkKKyAgIkxpbmUgdXAgYXJndW1lbnQgbGlzdHMgYnkgdGFicywgbm90IHNwYWNlcyIKKyAgKGxldCogKChhbmNob3IgKGMtbGFuZ2VsZW0tcG9zIGMtc3ludGFjdGljLWVsZW1lbnQpKQorCSAoY29sdW1uIChjLWxhbmdlbGVtLTJuZC1wb3MgYy1zeW50YWN0aWMtZWxlbWVudCkpCisJIChvZmZzZXQgKC0gKDErIGNvbHVtbikgYW5jaG9yKSkKKwkgKHN0ZXBzIChmbG9vciBvZmZzZXQgYy1iYXNpYy1vZmZzZXQpKSkKKyAgICAoKiAobWF4IHN0ZXBzIDEpCisgICAgICAgYy1iYXNpYy1vZmZzZXQpKSkKKworKGFkZC1ob29rICdjLW1vZGUtY29tbW9uLWhvb2sKKyAgICAgICAgICAobGFtYmRhICgpCisgICAgICAgICAgICA7OyBBZGQga2VybmVsIHN0eWxlCisgICAgICAgICAgICAoYy1hZGQtc3R5bGUKKyAgICAgICAgICAgICAibGludXgtdGFicy1vbmx5IgorICAgICAgICAgICAgICcoImxpbnV4IiAoYy1vZmZzZXRzLWFsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAoYXJnbGlzdC1jb250LW5vbmVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgYy1saW5ldXAtZ2NjLWFzbS1yZWcKKyAgICAgICAgICAgICAgICAgICAgICAgICBjLWxpbmV1cC1hcmdsaXN0LXRhYnMtb25seSkpKSkpKQorCisoYWRkLWhvb2sgJ2MtbW9kZS1ob29rCisgICAgICAgICAgKGxhbWJkYSAoKQorICAgICAgICAgICAgKGxldCAoKGZpbGVuYW1lIChidWZmZXItZmlsZS1uYW1lKSkpCisgICAgICAgICAgICAgIDs7IEVuYWJsZSBrZXJuZWwgbW9kZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGZpbGVzCisgICAgICAgICAgICAgICh3aGVuIChhbmQgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoIChleHBhbmQtZmlsZS1uYW1lICJ+L3NyYy9saW51eC10cmVlcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgKHNldHEgaW5kZW50LXRhYnMtbW9kZSB0KQorICAgICAgICAgICAgICAgIChjLXNldC1zdHlsZSAibGludXgtdGFicy1vbmx5IikpKSkpCisKK1RoaXMgd2lsbCBtYWtlIGVtYWNzIGdvIGJldHRlciB3aXRoIHRoZSBrZXJuZWwgY29kaW5nIHN0eWxlIGZvciBDCitmaWxlcyBiZWxvdyB+L3NyYy9saW51eC10cmVlcy4KKworQnV0IGV2ZW4gaWYgeW91IGZhaWwgaW4gZ2V0dGluZyBlbWFjcyB0byBkbyBzYW5lIGZvcm1hdHRpbmcsIG5vdAorZXZlcnl0aGluZyBpcyBsb3N0OiB1c2UgImluZGVudCIuCisKK05vdywgYWdhaW4sIEdOVSBpbmRlbnQgaGFzIHRoZSBzYW1lIGJyYWluLWRlYWQgc2V0dGluZ3MgdGhhdCBHTlUgZW1hY3MKK2hhcywgd2hpY2ggaXMgd2h5IHlvdSBuZWVkIHRvIGdpdmUgaXQgYSBmZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMuCitIb3dldmVyLCB0aGF0J3Mgbm90IHRvbyBiYWQsIGJlY2F1c2UgZXZlbiB0aGUgbWFrZXJzIG9mIEdOVSBpbmRlbnQKK3JlY29nbml6ZSB0aGUgYXV0aG9yaXR5IG9mIEsmUiAodGhlIEdOVSBwZW9wbGUgYXJlbid0IGV2aWwsIHRoZXkgYXJlCitqdXN0IHNldmVyZWx5IG1pc2d1aWRlZCBpbiB0aGlzIG1hdHRlciksIHNvIHlvdSBqdXN0IGdpdmUgaW5kZW50IHRoZQorb3B0aW9ucyAiLWtyIC1pOCIgKHN0YW5kcyBmb3IgIksmUiwgOCBjaGFyYWN0ZXIgaW5kZW50cyIpLCBvciB1c2UKKyJzY3JpcHRzL0xpbmRlbnQiLCB3aGljaCBpbmRlbnRzIGluIHRoZSBsYXRlc3Qgc3R5bGUuCisKKyJpbmRlbnQiIGhhcyBhIGxvdCBvZiBvcHRpb25zLCBhbmQgZXNwZWNpYWxseSB3aGVuIGl0IGNvbWVzIHRvIGNvbW1lbnQKK3JlLWZvcm1hdHRpbmcgeW91IG1heSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZSBtYW4gcGFnZS4gIEJ1dAorcmVtZW1iZXI6ICJpbmRlbnQiIGlzIG5vdCBhIGZpeCBmb3IgYmFkIHByb2dyYW1taW5nLgorCisKKwkJQ2hhcHRlciAxMDogS2NvbmZpZyBjb25maWd1cmF0aW9uIGZpbGVzCisKK0ZvciBhbGwgb2YgdGhlIEtjb25maWcqIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhyb3VnaG91dCB0aGUgc291cmNlIHRyZWUsCit0aGUgaW5kZW50YXRpb24gaXMgc29tZXdoYXQgZGlmZmVyZW50LiAgTGluZXMgdW5kZXIgYSAiY29uZmlnIiBkZWZpbml0aW9uCithcmUgaW5kZW50ZWQgd2l0aCBvbmUgdGFiLCB3aGlsZSBoZWxwIHRleHQgaXMgaW5kZW50ZWQgYW4gYWRkaXRpb25hbCB0d28KK3NwYWNlcy4gIEV4YW1wbGU6CisKK2NvbmZpZyBBVURJVAorCWJvb2wgIkF1ZGl0aW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVQKKwloZWxwCisJICBFbmFibGUgYXVkaXRpbmcgaW5mcmFzdHJ1Y3R1cmUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGFub3RoZXIKKwkgIGtlcm5lbCBzdWJzeXN0ZW0sIHN1Y2ggYXMgU0VMaW51eCAod2hpY2ggcmVxdWlyZXMgdGhpcyBmb3IKKwkgIGxvZ2dpbmcgb2YgYXZjIG1lc3NhZ2VzIG91dHB1dCkuICBEb2VzIG5vdCBkbyBzeXN0ZW0tY2FsbAorCSAgYXVkaXRpbmcgd2l0aG91dCBDT05GSUdfQVVESVRTWVNDQUxMLgorCitGZWF0dXJlcyB0aGF0IG1pZ2h0IHN0aWxsIGJlIGNvbnNpZGVyZWQgdW5zdGFibGUgc2hvdWxkIGJlIGRlZmluZWQgYXMKK2RlcGVuZGVudCBvbiAiRVhQRVJJTUVOVEFMIjoKKworY29uZmlnIFNMVUIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAhQVJDSF9VU0VTX1NMQUJfUEFHRV9TVFJVQ1QKKwlib29sICJTTFVCIChVbnF1ZXVlZCBBbGxvY2F0b3IpIgorCS4uLgorCit3aGlsZSBzZXJpb3VzbHkgZGFuZ2Vyb3VzIGZlYXR1cmVzIChzdWNoIGFzIHdyaXRlIHN1cHBvcnQgZm9yIGNlcnRhaW4KK2ZpbGVzeXN0ZW1zKSBzaG91bGQgYWR2ZXJ0aXNlIHRoaXMgcHJvbWluZW50bHkgaW4gdGhlaXIgcHJvbXB0IHN0cmluZzoKKworY29uZmlnIEFERlNfRlNfUlcKKwlib29sICJBREZTIHdyaXRlIHN1cHBvcnQgKERBTkdFUk9VUykiCisJZGVwZW5kcyBvbiBBREZTX0ZTCisJLi4uCisKK0ZvciBmdWxsIGRvY3VtZW50YXRpb24gb24gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMsIHNlZSB0aGUgZmlsZQorRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQuCisKKworCQlDaGFwdGVyIDExOiBEYXRhIHN0cnVjdHVyZXMKKworRGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaGF2ZSB2aXNpYmlsaXR5IG91dHNpZGUgdGhlIHNpbmdsZS10aHJlYWRlZAorZW52aXJvbm1lbnQgdGhleSBhcmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIGluIHNob3VsZCBhbHdheXMgaGF2ZQorcmVmZXJlbmNlIGNvdW50cy4gIEluIHRoZSBrZXJuZWwsIGdhcmJhZ2UgY29sbGVjdGlvbiBkb2Vzbid0IGV4aXN0IChhbmQKK291dHNpZGUgdGhlIGtlcm5lbCBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgc2xvdyBhbmQgaW5lZmZpY2llbnQpLCB3aGljaAorbWVhbnMgdGhhdCB5b3UgYWJzb2x1dGVseSBfaGF2ZV8gdG8gcmVmZXJlbmNlIGNvdW50IGFsbCB5b3VyIHVzZXMuCisKK1JlZmVyZW5jZSBjb3VudGluZyBtZWFucyB0aGF0IHlvdSBjYW4gYXZvaWQgbG9ja2luZywgYW5kIGFsbG93cyBtdWx0aXBsZQordXNlcnMgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGRhdGEgc3RydWN0dXJlIGluIHBhcmFsbGVsIC0gYW5kIG5vdCBoYXZpbmcKK3RvIHdvcnJ5IGFib3V0IHRoZSBzdHJ1Y3R1cmUgc3VkZGVubHkgZ29pbmcgYXdheSBmcm9tIHVuZGVyIHRoZW0ganVzdAorYmVjYXVzZSB0aGV5IHNsZXB0IG9yIGRpZCBzb21ldGhpbmcgZWxzZSBmb3IgYSB3aGlsZS4KKworTm90ZSB0aGF0IGxvY2tpbmcgaXMgX25vdF8gYSByZXBsYWNlbWVudCBmb3IgcmVmZXJlbmNlIGNvdW50aW5nLgorTG9ja2luZyBpcyB1c2VkIHRvIGtlZXAgZGF0YSBzdHJ1Y3R1cmVzIGNvaGVyZW50LCB3aGlsZSByZWZlcmVuY2UKK2NvdW50aW5nIGlzIGEgbWVtb3J5IG1hbmFnZW1lbnQgdGVjaG5pcXVlLiAgVXN1YWxseSBib3RoIGFyZSBuZWVkZWQsIGFuZAordGhleSBhcmUgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggZWFjaCBvdGhlci4KKworTWFueSBkYXRhIHN0cnVjdHVyZXMgY2FuIGluZGVlZCBoYXZlIHR3byBsZXZlbHMgb2YgcmVmZXJlbmNlIGNvdW50aW5nLAord2hlbiB0aGVyZSBhcmUgdXNlcnMgb2YgZGlmZmVyZW50ICJjbGFzc2VzIi4gIFRoZSBzdWJjbGFzcyBjb3VudCBjb3VudHMKK3RoZSBudW1iZXIgb2Ygc3ViY2xhc3MgdXNlcnMsIGFuZCBkZWNyZW1lbnRzIHRoZSBnbG9iYWwgY291bnQganVzdCBvbmNlCit3aGVuIHRoZSBzdWJjbGFzcyBjb3VudCBnb2VzIHRvIHplcm8uCisKK0V4YW1wbGVzIG9mIHRoaXMga2luZCBvZiAibXVsdGktbGV2ZWwtcmVmZXJlbmNlLWNvdW50aW5nIiBjYW4gYmUgZm91bmQgaW4KK21lbW9yeSBtYW5hZ2VtZW50ICgic3RydWN0IG1tX3N0cnVjdCI6IG1tX3VzZXJzIGFuZCBtbV9jb3VudCksIGFuZCBpbgorZmlsZXN5c3RlbSBjb2RlICgic3RydWN0IHN1cGVyX2Jsb2NrIjogc19jb3VudCBhbmQgc19hY3RpdmUpLgorCitSZW1lbWJlcjogaWYgYW5vdGhlciB0aHJlYWQgY2FuIGZpbmQgeW91ciBkYXRhIHN0cnVjdHVyZSwgYW5kIHlvdSBkb24ndAoraGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvbiBpdCwgeW91IGFsbW9zdCBjZXJ0YWlubHkgaGF2ZSBhIGJ1Zy4KKworCisJCUNoYXB0ZXIgMTI6IE1hY3JvcywgRW51bXMgYW5kIFJUTAorCitOYW1lcyBvZiBtYWNyb3MgZGVmaW5pbmcgY29uc3RhbnRzIGFuZCBsYWJlbHMgaW4gZW51bXMgYXJlIGNhcGl0YWxpemVkLgorCisjZGVmaW5lIENPTlNUQU5UIDB4MTIzNDUKKworRW51bXMgYXJlIHByZWZlcnJlZCB3aGVuIGRlZmluaW5nIHNldmVyYWwgcmVsYXRlZCBjb25zdGFudHMuCisKK0NBUElUQUxJWkVEIG1hY3JvIG5hbWVzIGFyZSBhcHByZWNpYXRlZCBidXQgbWFjcm9zIHJlc2VtYmxpbmcgZnVuY3Rpb25zCittYXkgYmUgbmFtZWQgaW4gbG93ZXIgY2FzZS4KKworR2VuZXJhbGx5LCBpbmxpbmUgZnVuY3Rpb25zIGFyZSBwcmVmZXJhYmxlIHRvIG1hY3JvcyByZXNlbWJsaW5nIGZ1bmN0aW9ucy4KKworTWFjcm9zIHdpdGggbXVsdGlwbGUgc3RhdGVtZW50cyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gYSBkbyAtIHdoaWxlIGJsb2NrOgorCisjZGVmaW5lIG1hY3JvZnVuKGEsIGIsIGMpIAkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChhID09IDUpCQkJXAorCQkJZG9fdGhpcyhiLCBjKTsJCVwKKwl9IHdoaWxlICgwKQorCitUaGluZ3MgdG8gYXZvaWQgd2hlbiB1c2luZyBtYWNyb3M6CisKKzEpIG1hY3JvcyB0aGF0IGFmZmVjdCBjb250cm9sIGZsb3c6CisKKyNkZWZpbmUgRk9PKHgpCQkJCQlcCisJZG8gewkJCQkJXAorCQlpZiAoYmxhaCh4KSA8IDApCQlcCisJCQlyZXR1cm4gLUVCVUdHRVJFRDsJXAorCX0gd2hpbGUoMCkKKworaXMgYSBfdmVyeV8gYmFkIGlkZWEuICBJdCBsb29rcyBsaWtlIGEgZnVuY3Rpb24gY2FsbCBidXQgZXhpdHMgdGhlICJjYWxsaW5nIgorZnVuY3Rpb247IGRvbid0IGJyZWFrIHRoZSBpbnRlcm5hbCBwYXJzZXJzIG9mIHRob3NlIHdobyB3aWxsIHJlYWQgdGhlIGNvZGUuCisKKzIpIG1hY3JvcyB0aGF0IGRlcGVuZCBvbiBoYXZpbmcgYSBsb2NhbCB2YXJpYWJsZSB3aXRoIGEgbWFnaWMgbmFtZToKKworI2RlZmluZSBGT08odmFsKSBiYXIoaW5kZXgsIHZhbCkKKworbWlnaHQgbG9vayBsaWtlIGEgZ29vZCB0aGluZywgYnV0IGl0J3MgY29uZnVzaW5nIGFzIGhlbGwgd2hlbiBvbmUgcmVhZHMgdGhlCitjb2RlIGFuZCBpdCdzIHByb25lIHRvIGJyZWFrYWdlIGZyb20gc2VlbWluZ2x5IGlubm9jZW50IGNoYW5nZXMuCisKKzMpIG1hY3JvcyB3aXRoIGFyZ3VtZW50cyB0aGF0IGFyZSB1c2VkIGFzIGwtdmFsdWVzOiBGT08oeCkgPSB5OyB3aWxsCitiaXRlIHlvdSBpZiBzb21lYm9keSBlLmcuIHR1cm5zIEZPTyBpbnRvIGFuIGlubGluZSBmdW5jdGlvbi4KKworNCkgZm9yZ2V0dGluZyBhYm91dCBwcmVjZWRlbmNlOiBtYWNyb3MgZGVmaW5pbmcgY29uc3RhbnRzIHVzaW5nIGV4cHJlc3Npb25zCittdXN0IGVuY2xvc2UgdGhlIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMuIEJld2FyZSBvZiBzaW1pbGFyIGlzc3VlcyB3aXRoCittYWNyb3MgdXNpbmcgcGFyYW1ldGVycy4KKworI2RlZmluZSBDT05TVEFOVCAweDQwMDAKKyNkZWZpbmUgQ09OU1RFWFAgKENPTlNUQU5UIHwgMykKKworVGhlIGNwcCBtYW51YWwgZGVhbHMgd2l0aCBtYWNyb3MgZXhoYXVzdGl2ZWx5LiBUaGUgZ2NjIGludGVybmFscyBtYW51YWwgYWxzbworY292ZXJzIFJUTCB3aGljaCBpcyB1c2VkIGZyZXF1ZW50bHkgd2l0aCBhc3NlbWJseSBsYW5ndWFnZSBpbiB0aGUga2VybmVsLgorCisKKwkJQ2hhcHRlciAxMzogUHJpbnRpbmcga2VybmVsIG1lc3NhZ2VzCisKK0tlcm5lbCBkZXZlbG9wZXJzIGxpa2UgdG8gYmUgc2VlbiBhcyBsaXRlcmF0ZS4gRG8gbWluZCB0aGUgc3BlbGxpbmcKK29mIGtlcm5lbCBtZXNzYWdlcyB0byBtYWtlIGEgZ29vZCBpbXByZXNzaW9uLiBEbyBub3QgdXNlIGNyaXBwbGVkCit3b3JkcyBsaWtlICJkb250IjsgdXNlICJkbyBub3QiIG9yICJkb24ndCIgaW5zdGVhZC4gIE1ha2UgdGhlIG1lc3NhZ2VzCitjb25jaXNlLCBjbGVhciwgYW5kIHVuYW1iaWd1b3VzLgorCitLZXJuZWwgbWVzc2FnZXMgZG8gbm90IGhhdmUgdG8gYmUgdGVybWluYXRlZCB3aXRoIGEgcGVyaW9kLgorCitQcmludGluZyBudW1iZXJzIGluIHBhcmVudGhlc2VzICglZCkgYWRkcyBubyB2YWx1ZSBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuCisKK1RoZXJlIGFyZSBhIG51bWJlciBvZiBkcml2ZXIgbW9kZWwgZGlhZ25vc3RpYyBtYWNyb3MgaW4gPGxpbnV4L2RldmljZS5oPgord2hpY2ggeW91IHNob3VsZCB1c2UgdG8gbWFrZSBzdXJlIG1lc3NhZ2VzIGFyZSBtYXRjaGVkIHRvIHRoZSByaWdodCBkZXZpY2UKK2FuZCBkcml2ZXIsIGFuZCBhcmUgdGFnZ2VkIHdpdGggdGhlIHJpZ2h0IGxldmVsOiAgZGV2X2VycigpLCBkZXZfd2FybigpLAorZGV2X2luZm8oKSwgYW5kIHNvIGZvcnRoLiAgRm9yIG1lc3NhZ2VzIHRoYXQgYXJlbid0IGFzc29jaWF0ZWQgd2l0aCBhCitwYXJ0aWN1bGFyIGRldmljZSwgPGxpbnV4L2tlcm5lbC5oPiBkZWZpbmVzIHByX2RlYnVnKCkgYW5kIHByX2luZm8oKS4KKworQ29taW5nIHVwIHdpdGggZ29vZCBkZWJ1Z2dpbmcgbWVzc2FnZXMgY2FuIGJlIHF1aXRlIGEgY2hhbGxlbmdlOyBhbmQgb25jZQoreW91IGhhdmUgdGhlbSwgdGhleSBjYW4gYmUgYSBodWdlIGhlbHAgZm9yIHJlbW90ZSB0cm91Ymxlc2hvb3RpbmcuICBTdWNoCittZXNzYWdlcyBzaG91bGQgYmUgY29tcGlsZWQgb3V0IHdoZW4gdGhlIERFQlVHIHN5bWJvbCBpcyBub3QgZGVmaW5lZCAodGhhdAoraXMsIGJ5IGRlZmF1bHQgdGhleSBhcmUgbm90IGluY2x1ZGVkKS4gIFdoZW4geW91IHVzZSBkZXZfZGJnKCkgb3IgcHJfZGVidWcoKSwKK3RoYXQncyBhdXRvbWF0aWMuICBNYW55IHN1YnN5c3RlbXMgaGF2ZSBLY29uZmlnIG9wdGlvbnMgdG8gdHVybiBvbiAtRERFQlVHLgorQSByZWxhdGVkIGNvbnZlbnRpb24gdXNlcyBWRVJCT1NFX0RFQlVHIHRvIGFkZCBkZXZfdmRiZygpIG1lc3NhZ2VzIHRvIHRoZQorb25lcyBhbHJlYWR5IGVuYWJsZWQgYnkgREVCVUcuCisKKworCQlDaGFwdGVyIDE0OiBBbGxvY2F0aW5nIG1lbW9yeQorCitUaGUga2VybmVsIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbCBwdXJwb3NlIG1lbW9yeSBhbGxvY2F0b3JzOgora21hbGxvYygpLCBremFsbG9jKCksIGtjYWxsb2MoKSwgYW5kIHZtYWxsb2MoKS4gIFBsZWFzZSByZWZlciB0byB0aGUgQVBJCitkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZW0uCisKK1RoZSBwcmVmZXJyZWQgZm9ybSBmb3IgcGFzc2luZyBhIHNpemUgb2YgYSBzdHJ1Y3QgaXMgdGhlIGZvbGxvd2luZzoKKworCXAgPSBrbWFsbG9jKHNpemVvZigqcCksIC4uLik7CisKK1RoZSBhbHRlcm5hdGl2ZSBmb3JtIHdoZXJlIHN0cnVjdCBuYW1lIGlzIHNwZWxsZWQgb3V0IGh1cnRzIHJlYWRhYmlsaXR5IGFuZAoraW50cm9kdWNlcyBhbiBvcHBvcnR1bml0eSBmb3IgYSBidWcgd2hlbiB0aGUgcG9pbnRlciB2YXJpYWJsZSB0eXBlIGlzIGNoYW5nZWQKK2J1dCB0aGUgY29ycmVzcG9uZGluZyBzaXplb2YgdGhhdCBpcyBwYXNzZWQgdG8gYSBtZW1vcnkgYWxsb2NhdG9yIGlzIG5vdC4KKworQ2FzdGluZyB0aGUgcmV0dXJuIHZhbHVlIHdoaWNoIGlzIGEgdm9pZCBwb2ludGVyIGlzIHJlZHVuZGFudC4gVGhlIGNvbnZlcnNpb24KK2Zyb20gdm9pZCBwb2ludGVyIHRvIGFueSBvdGhlciBwb2ludGVyIHR5cGUgaXMgZ3VhcmFudGVlZCBieSB0aGUgQyBwcm9ncmFtbWluZworbGFuZ3VhZ2UuCisKKworCQlDaGFwdGVyIDE1OiBUaGUgaW5saW5lIGRpc2Vhc2UKKworVGhlcmUgYXBwZWFycyB0byBiZSBhIGNvbW1vbiBtaXNwZXJjZXB0aW9uIHRoYXQgZ2NjIGhhcyBhIG1hZ2ljICJtYWtlIG1lCitmYXN0ZXIiIHNwZWVkdXAgb3B0aW9uIGNhbGxlZCAiaW5saW5lIi4gV2hpbGUgdGhlIHVzZSBvZiBpbmxpbmVzIGNhbiBiZQorYXBwcm9wcmlhdGUgKGZvciBleGFtcGxlIGFzIGEgbWVhbnMgb2YgcmVwbGFjaW5nIG1hY3Jvcywgc2VlIENoYXB0ZXIgMTIpLCBpdAordmVyeSBvZnRlbiBpcyBub3QuIEFidW5kYW50IHVzZSBvZiB0aGUgaW5saW5lIGtleXdvcmQgbGVhZHMgdG8gYSBtdWNoIGJpZ2dlcgora2VybmVsLCB3aGljaCBpbiB0dXJuIHNsb3dzIHRoZSBzeXN0ZW0gYXMgYSB3aG9sZSBkb3duLCBkdWUgdG8gYSBiaWdnZXIKK2ljYWNoZSBmb290cHJpbnQgZm9yIHRoZSBDUFUgYW5kIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIGxlc3MgbWVtb3J5CithdmFpbGFibGUgZm9yIHRoZSBwYWdlY2FjaGUuIEp1c3QgdGhpbmsgYWJvdXQgaXQ7IGEgcGFnZWNhY2hlIG1pc3MgY2F1c2VzIGEKK2Rpc2sgc2Vlaywgd2hpY2ggZWFzaWx5IHRha2VzIDUgbWlsaXNlY29uZHMuIFRoZXJlIGFyZSBhIExPVCBvZiBjcHUgY3ljbGVzCit0aGF0IGNhbiBnbyBpbnRvIHRoZXNlIDUgbWlsaXNlY29uZHMuCisKK0EgcmVhc29uYWJsZSBydWxlIG9mIHRodW1iIGlzIHRvIG5vdCBwdXQgaW5saW5lIGF0IGZ1bmN0aW9ucyB0aGF0IGhhdmUgbW9yZQordGhhbiAzIGxpbmVzIG9mIGNvZGUgaW4gdGhlbS4gQW4gZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBhcmUgdGhlIGNhc2VzIHdoZXJlCithIHBhcmFtZXRlciBpcyBrbm93biB0byBiZSBhIGNvbXBpbGV0aW1lIGNvbnN0YW50LCBhbmQgYXMgYSByZXN1bHQgb2YgdGhpcworY29uc3RhbnRuZXNzIHlvdSAqa25vdyogdGhlIGNvbXBpbGVyIHdpbGwgYmUgYWJsZSB0byBvcHRpbWl6ZSBtb3N0IG9mIHlvdXIKK2Z1bmN0aW9uIGF3YXkgYXQgY29tcGlsZSB0aW1lLiBGb3IgYSBnb29kIGV4YW1wbGUgb2YgdGhpcyBsYXRlciBjYXNlLCBzZWUKK3RoZSBrbWFsbG9jKCkgaW5saW5lIGZ1bmN0aW9uLgorCitPZnRlbiBwZW9wbGUgYXJndWUgdGhhdCBhZGRpbmcgaW5saW5lIHRvIGZ1bmN0aW9ucyB0aGF0IGFyZSBzdGF0aWMgYW5kIHVzZWQKK29ubHkgb25jZSBpcyBhbHdheXMgYSB3aW4gc2luY2UgdGhlcmUgaXMgbm8gc3BhY2UgdHJhZGVvZmYuIFdoaWxlIHRoaXMgaXMKK3RlY2huaWNhbGx5IGNvcnJlY3QsIGdjYyBpcyBjYXBhYmxlIG9mIGlubGluaW5nIHRoZXNlIGF1dG9tYXRpY2FsbHkgd2l0aG91dAoraGVscCwgYW5kIHRoZSBtYWludGVuYW5jZSBpc3N1ZSBvZiByZW1vdmluZyB0aGUgaW5saW5lIHdoZW4gYSBzZWNvbmQgdXNlcgorYXBwZWFycyBvdXR3ZWlnaHMgdGhlIHBvdGVudGlhbCB2YWx1ZSBvZiB0aGUgaGludCB0aGF0IHRlbGxzIGdjYyB0byBkbworc29tZXRoaW5nIGl0IHdvdWxkIGhhdmUgZG9uZSBhbnl3YXkuCisKKworCQlDaGFwdGVyIDE2OiBGdW5jdGlvbiByZXR1cm4gdmFsdWVzIGFuZCBuYW1lcworCitGdW5jdGlvbnMgY2FuIHJldHVybiB2YWx1ZXMgb2YgbWFueSBkaWZmZXJlbnQga2luZHMsIGFuZCBvbmUgb2YgdGhlCittb3N0IGNvbW1vbiBpcyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZnVuY3Rpb24gc3VjY2VlZGVkIG9yCitmYWlsZWQuICBTdWNoIGEgdmFsdWUgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGFuIGVycm9yLWNvZGUgaW50ZWdlcgorKC1FeHh4ID0gZmFpbHVyZSwgMCA9IHN1Y2Nlc3MpIG9yIGEgInN1Y2NlZWRlZCIgYm9vbGVhbiAoMCA9IGZhaWx1cmUsCitub24temVybyA9IHN1Y2Nlc3MpLgorCitNaXhpbmcgdXAgdGhlc2UgdHdvIHNvcnRzIG9mIHJlcHJlc2VudGF0aW9ucyBpcyBhIGZlcnRpbGUgc291cmNlIG9mCitkaWZmaWN1bHQtdG8tZmluZCBidWdzLiAgSWYgdGhlIEMgbGFuZ3VhZ2UgaW5jbHVkZWQgYSBzdHJvbmcgZGlzdGluY3Rpb24KK2JldHdlZW4gaW50ZWdlcnMgYW5kIGJvb2xlYW5zIHRoZW4gdGhlIGNvbXBpbGVyIHdvdWxkIGZpbmQgdGhlc2UgbWlzdGFrZXMKK2ZvciB1cy4uLiBidXQgaXQgZG9lc24ndC4gIFRvIGhlbHAgcHJldmVudCBzdWNoIGJ1Z3MsIGFsd2F5cyBmb2xsb3cgdGhpcworY29udmVudGlvbjoKKworCUlmIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gaXMgYW4gYWN0aW9uIG9yIGFuIGltcGVyYXRpdmUgY29tbWFuZCwKKwl0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBlcnJvci1jb2RlIGludGVnZXIuICBJZiB0aGUgbmFtZQorCWlzIGEgcHJlZGljYXRlLCB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhICJzdWNjZWVkZWQiIGJvb2xlYW4uCisKK0ZvciBleGFtcGxlLCAiYWRkIHdvcmsiIGlzIGEgY29tbWFuZCwgYW5kIHRoZSBhZGRfd29yaygpIGZ1bmN0aW9uIHJldHVybnMgMAorZm9yIHN1Y2Nlc3Mgb3IgLUVCVVNZIGZvciBmYWlsdXJlLiAgSW4gdGhlIHNhbWUgd2F5LCAiUENJIGRldmljZSBwcmVzZW50IiBpcworYSBwcmVkaWNhdGUsIGFuZCB0aGUgcGNpX2Rldl9wcmVzZW50KCkgZnVuY3Rpb24gcmV0dXJucyAxIGlmIGl0IHN1Y2NlZWRzIGluCitmaW5kaW5nIGEgbWF0Y2hpbmcgZGV2aWNlIG9yIDAgaWYgaXQgZG9lc24ndC4KKworQWxsIEVYUE9SVGVkIGZ1bmN0aW9ucyBtdXN0IHJlc3BlY3QgdGhpcyBjb252ZW50aW9uLCBhbmQgc28gc2hvdWxkIGFsbAorcHVibGljIGZ1bmN0aW9ucy4gIFByaXZhdGUgKHN0YXRpYykgZnVuY3Rpb25zIG5lZWQgbm90LCBidXQgaXQgaXMKK3JlY29tbWVuZGVkIHRoYXQgdGhleSBkby4KKworRnVuY3Rpb25zIHdob3NlIHJldHVybiB2YWx1ZSBpcyB0aGUgYWN0dWFsIHJlc3VsdCBvZiBhIGNvbXB1dGF0aW9uLCByYXRoZXIKK3RoYW4gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBjb21wdXRhdGlvbiBzdWNjZWVkZWQsIGFyZSBub3Qgc3ViamVjdCB0bwordGhpcyBydWxlLiAgR2VuZXJhbGx5IHRoZXkgaW5kaWNhdGUgZmFpbHVyZSBieSByZXR1cm5pbmcgc29tZSBvdXQtb2YtcmFuZ2UKK3Jlc3VsdC4gIFR5cGljYWwgZXhhbXBsZXMgd291bGQgYmUgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHBvaW50ZXJzOyB0aGV5IHVzZQorTlVMTCBvciB0aGUgRVJSX1BUUiBtZWNoYW5pc20gdG8gcmVwb3J0IGZhaWx1cmUuCisKKworCQlDaGFwdGVyIDE3OiAgRG9uJ3QgcmUtaW52ZW50IHRoZSBrZXJuZWwgbWFjcm9zCisKK1RoZSBoZWFkZXIgZmlsZSBpbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1hY3JvcyB0aGF0Cit5b3Ugc2hvdWxkIHVzZSwgcmF0aGVyIHRoYW4gZXhwbGljaXRseSBjb2Rpbmcgc29tZSB2YXJpYW50IG9mIHRoZW0geW91cnNlbGYuCitGb3IgZXhhbXBsZSwgaWYgeW91IG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgYW4gYXJyYXksIHRha2UgYWR2YW50YWdlCitvZiB0aGUgbWFjcm8KKworICAjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQorCitTaW1pbGFybHksIGlmIHlvdSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBzb21lIHN0cnVjdHVyZSBtZW1iZXIsIHVzZQorCisgICNkZWZpbmUgRklFTERfU0laRU9GKHQsIGYpIChzaXplb2YoKCh0KikwKS0+ZikpCisKK1RoZXJlIGFyZSBhbHNvIG1pbigpIGFuZCBtYXgoKSBtYWNyb3MgdGhhdCBkbyBzdHJpY3QgdHlwZSBjaGVja2luZyBpZiB5b3UKK25lZWQgdGhlbS4gIEZlZWwgZnJlZSB0byBwZXJ1c2UgdGhhdCBoZWFkZXIgZmlsZSB0byBzZWUgd2hhdCBlbHNlIGlzIGFscmVhZHkKK2RlZmluZWQgdGhhdCB5b3Ugc2hvdWxkbid0IHJlcHJvZHVjZSBpbiB5b3VyIGNvZGUuCisKKworCQlDaGFwdGVyIDE4OiAgRWRpdG9yIG1vZGVsaW5lcyBhbmQgb3RoZXIgY3J1ZnQKKworU29tZSBlZGl0b3JzIGNhbiBpbnRlcnByZXQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBlbWJlZGRlZCBpbiBzb3VyY2UgZmlsZXMsCitpbmRpY2F0ZWQgd2l0aCBzcGVjaWFsIG1hcmtlcnMuICBGb3IgZXhhbXBsZSwgZW1hY3MgaW50ZXJwcmV0cyBsaW5lcyBtYXJrZWQKK2xpa2UgdGhpczoKKworLSotIG1vZGU6IGMgLSotCisKK09yIGxpa2UgdGhpczoKKworLyoKK0xvY2FsIFZhcmlhYmxlczoKK2NvbXBpbGUtY29tbWFuZDogImdjYyAtRE1BR0lDX0RFQlVHX0ZMQUcgZm9vLmMiCitFbmQ6CisqLworCitWaW0gaW50ZXJwcmV0cyBtYXJrZXJzIHRoYXQgbG9vayBsaWtlIHRoaXM6CisKKy8qIHZpbTpzZXQgc3c9OCBub2V0ICovCisKK0RvIG5vdCBpbmNsdWRlIGFueSBvZiB0aGVzZSBpbiBzb3VyY2UgZmlsZXMuICBQZW9wbGUgaGF2ZSB0aGVpciBvd24gcGVyc29uYWwKK2VkaXRvciBjb25maWd1cmF0aW9ucywgYW5kIHlvdXIgc291cmNlIGZpbGVzIHNob3VsZCBub3Qgb3ZlcnJpZGUgdGhlbS4gIFRoaXMKK2luY2x1ZGVzIG1hcmtlcnMgZm9yIGluZGVudGF0aW9uIGFuZCBtb2RlIGNvbmZpZ3VyYXRpb24uICBQZW9wbGUgbWF5IHVzZSB0aGVpcgorb3duIGN1c3RvbSBtb2RlLCBvciBtYXkgaGF2ZSBzb21lIG90aGVyIG1hZ2ljIG1ldGhvZCBmb3IgbWFraW5nIGluZGVudGF0aW9uCit3b3JrIGNvcnJlY3RseS4KKworCisKKwkJQXBwZW5kaXggSTogUmVmZXJlbmNlcworCitUaGUgQyBQcm9ncmFtbWluZyBMYW5ndWFnZSwgU2Vjb25kIEVkaXRpb24KK2J5IEJyaWFuIFcuIEtlcm5pZ2hhbiBhbmQgRGVubmlzIE0uIFJpdGNoaWUuCitQcmVudGljZSBIYWxsLCBJbmMuLCAxOTg4LgorSVNCTiAwLTEzLTExMDM2Mi04IChwYXBlcmJhY2spLCAwLTEzLTExMDM3MC05IChoYXJkYmFjaykuCitVUkw6IGh0dHA6Ly9jbS5iZWxsLWxhYnMuY29tL2NtL2NzL2Nib29rLworCitUaGUgUHJhY3RpY2Ugb2YgUHJvZ3JhbW1pbmcKK2J5IEJyaWFuIFcuIEtlcm5pZ2hhbiBhbmQgUm9iIFBpa2UuCitBZGRpc29uLVdlc2xleSwgSW5jLiwgMTk5OS4KK0lTQk4gMC0yMDEtNjE1ODYtWC4KK1VSTDogaHR0cDovL2NtLmJlbGwtbGFicy5jb20vY20vY3MvdHBvcC8KKworR05VIG1hbnVhbHMgLSB3aGVyZSBpbiBjb21wbGlhbmNlIHdpdGggSyZSIGFuZCB0aGlzIHRleHQgLSBmb3IgY3BwLCBnY2MsCitnY2MgaW50ZXJuYWxzIGFuZCBpbmRlbnQsIGFsbCBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcvbWFudWFsLworCitXRzE0IGlzIHRoZSBpbnRlcm5hdGlvbmFsIHN0YW5kYXJkaXphdGlvbiB3b3JraW5nIGdyb3VwIGZvciB0aGUgcHJvZ3JhbW1pbmcKK2xhbmd1YWdlIEMsIFVSTDogaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvSlRDMS9TQzIyL1dHMTQvCisKK0tlcm5lbCBDb2RpbmdTdHlsZSwgYnkgZ3JlZ0Brcm9haC5jb20gYXQgT0xTIDIwMDI6CitodHRwOi8vd3d3Lmtyb2FoLmNvbS9saW51eC90YWxrcy9vbHNfMjAwMl9rZXJuZWxfY29kaW5nc3R5bGVfdGFsay9odG1sLworCistLQorTGFzdCB1cGRhdGVkIG9uIDIwMDctSnVseS0xMy4KKwpkaWZmIC0tZ2l0IGEvZG9jL1N1Ym1pdHRpbmdQYXRjaGVzLnR4dCBiL2RvYy9TdWJtaXR0aW5nUGF0Y2hlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3NjRhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9TdWJtaXR0aW5nUGF0Y2hlcy50eHQKQEAgLTAsMCArMSw1NjggQEAKK0kgZG9uJ3QgaGF2ZSBzcGVjaWZpYyBzdWJtaXNzaW9uIGd1aWRlbGluZXMgZm9yIFN5c2xpbnV4LCBidXQgdGhlIG9uZXMKK3RoYXQgYXBwcm9wcmlhdGUgdG8gdGhlIExpbnV4IGtlcm5lbCBhcmUgY2VydGFpbmx5IGdvb2QgZW5vdWdoIGZvcgorU3lzbGludXguCisKK0luIHBhcnRpY3VsYXIsIGhvd2V2ZXIsIEkgYXBwcmVjaWF0ZSBpZiBwYXRjaGVzIHNlbnQgZm9sbG93IHRoZQorc3RhbmRhcmQgTGludXggc3VibWlzc2lvbiBmb3JtYXQsIGFzIEkgY2FuIGF1dG9tYXRpY2FsbHkgaW1wb3J0IHRoZW0KK2ludG8gZ2l0LCByZXRhaW5pbmcgZGVzY3JpcHRpb24gYW5kIGF1dGhvciBpbmZvcm1hdGlvbi4gIFRodXMsIHRoaXMKK2ZpbGUgZnJvbSB0aGUgTGludXgga2VybmVsIG1pZ2h0IGJlIHVzZWZ1bC4KKworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKwlIb3cgdG8gR2V0IFlvdXIgQ2hhbmdlIEludG8gdGhlIExpbnV4IEtlcm5lbAorCQlvcgorCUNhcmUgQW5kIE9wZXJhdGlvbiBPZiBZb3VyIExpbnVzIFRvcnZhbGRzCisKKworCitGb3IgYSBwZXJzb24gb3IgY29tcGFueSB3aG8gd2lzaGVzIHRvIHN1Ym1pdCBhIGNoYW5nZSB0byB0aGUgTGludXgKK2tlcm5lbCwgdGhlIHByb2Nlc3MgY2FuIHNvbWV0aW1lcyBiZSBkYXVudGluZyBpZiB5b3UncmUgbm90IGZhbWlsaWFyCit3aXRoICJ0aGUgc3lzdGVtLiIgIFRoaXMgdGV4dCBpcyBhIGNvbGxlY3Rpb24gb2Ygc3VnZ2VzdGlvbnMgd2hpY2gKK2NhbiBncmVhdGx5IGluY3JlYXNlIHRoZSBjaGFuY2VzIG9mIHlvdXIgY2hhbmdlIGJlaW5nIGFjY2VwdGVkLgorCitSZWFkIERvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0IGZvciBhIGxpc3Qgb2YgaXRlbXMgdG8gY2hlY2sKK2JlZm9yZSBzdWJtaXR0aW5nIGNvZGUuICBJZiB5b3UgYXJlIHN1Ym1pdHRpbmcgYSBkcml2ZXIsIGFsc28gcmVhZAorRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycy4KKworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTRUNUSU9OIDEgLSBDUkVBVElORyBBTkQgU0VORElORyBZT1VSIENIQU5HRQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKzEpICJkaWZmIC11cCIKKy0tLS0tLS0tLS0tLQorCitVc2UgImRpZmYgLXVwIiBvciAiZGlmZiAtdXByTiIgdG8gY3JlYXRlIHBhdGNoZXMuCisKK0FsbCBjaGFuZ2VzIHRvIHRoZSBMaW51eCBrZXJuZWwgb2NjdXIgaW4gdGhlIGZvcm0gb2YgcGF0Y2hlcywgYXMKK2dlbmVyYXRlZCBieSBkaWZmKDEpLiAgV2hlbiBjcmVhdGluZyB5b3VyIHBhdGNoLCBtYWtlIHN1cmUgdG8gY3JlYXRlIGl0CitpbiAidW5pZmllZCBkaWZmIiBmb3JtYXQsIGFzIHN1cHBsaWVkIGJ5IHRoZSAnLXUnIGFyZ3VtZW50IHRvIGRpZmYoMSkuCitBbHNvLCBwbGVhc2UgdXNlIHRoZSAnLXAnIGFyZ3VtZW50IHdoaWNoIHNob3dzIHdoaWNoIEMgZnVuY3Rpb24gZWFjaAorY2hhbmdlIGlzIGluIC0gdGhhdCBtYWtlcyB0aGUgcmVzdWx0YW50IGRpZmYgYSBsb3QgZWFzaWVyIHRvIHJlYWQuCitQYXRjaGVzIHNob3VsZCBiZSBiYXNlZCBpbiB0aGUgcm9vdCBrZXJuZWwgc291cmNlIGRpcmVjdG9yeSwKK25vdCBpbiBhbnkgbG93ZXIgc3ViZGlyZWN0b3J5LgorCitUbyBjcmVhdGUgYSBwYXRjaCBmb3IgYSBzaW5nbGUgZmlsZSwgaXQgaXMgb2Z0ZW4gc3VmZmljaWVudCB0byBkbzoKKworCVNSQ1RSRUU9IGxpbnV4LTIuNgorCU1ZRklMRT0gIGRyaXZlcnMvbmV0L215ZHJpdmVyLmMKKworCWNkICRTUkNUUkVFCisJY3AgJE1ZRklMRSAkTVlGSUxFLm9yaWcKKwl2aSAkTVlGSUxFCSMgbWFrZSB5b3VyIGNoYW5nZQorCWNkIC4uCisJZGlmZiAtdXAgJFNSQ1RSRUUvJE1ZRklMRXsub3JpZyx9ID4gL3RtcC9wYXRjaAorCitUbyBjcmVhdGUgYSBwYXRjaCBmb3IgbXVsdGlwbGUgZmlsZXMsIHlvdSBzaG91bGQgdW5wYWNrIGEgInZhbmlsbGEiLAorb3IgdW5tb2RpZmllZCBrZXJuZWwgc291cmNlIHRyZWUsIGFuZCBnZW5lcmF0ZSBhIGRpZmYgYWdhaW5zdCB5b3VyCitvd24gc291cmNlIHRyZWUuICBGb3IgZXhhbXBsZToKKworCU1ZU1JDPSAvZGV2ZWwvbGludXgtMi42CisKKwl0YXIgeHZmeiBsaW51eC0yLjYuMTIudGFyLmd6CisJbXYgbGludXgtMi42LjEyIGxpbnV4LTIuNi4xMi12YW5pbGxhCisJZGlmZiAtdXByTiAtWCBsaW51eC0yLjYuMTItdmFuaWxsYS9Eb2N1bWVudGF0aW9uL2RvbnRkaWZmIFwKKwkJbGludXgtMi42LjEyLXZhbmlsbGEgJE1ZU1JDID4gL3RtcC9wYXRjaAorCisiZG9udGRpZmYiIGlzIGEgbGlzdCBvZiBmaWxlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBrZXJuZWwgZHVyaW5nCit0aGUgYnVpbGQgcHJvY2VzcywgYW5kIHNob3VsZCBiZSBpZ25vcmVkIGluIGFueSBkaWZmKDEpLWdlbmVyYXRlZAorcGF0Y2guICBUaGUgImRvbnRkaWZmIiBmaWxlIGlzIGluY2x1ZGVkIGluIHRoZSBrZXJuZWwgdHJlZSBpbgorMi42LjEyIGFuZCBsYXRlci4gIEZvciBlYXJsaWVyIGtlcm5lbCB2ZXJzaW9ucywgeW91IGNhbiBnZXQgaXQKK2Zyb20gPGh0dHA6Ly93d3cueGVub3RpbWUubmV0L2xpbnV4L2RvYy9kb250ZGlmZj4uCisKK01ha2Ugc3VyZSB5b3VyIHBhdGNoIGRvZXMgbm90IGluY2x1ZGUgYW55IGV4dHJhIGZpbGVzIHdoaWNoIGRvIG5vdAorYmVsb25nIGluIGEgcGF0Y2ggc3VibWlzc2lvbi4gIE1ha2Ugc3VyZSB0byByZXZpZXcgeW91ciBwYXRjaCAtYWZ0ZXItCitnZW5lcmF0ZWQgaXQgd2l0aCBkaWZmKDEpLCB0byBlbnN1cmUgYWNjdXJhY3kuCisKK0lmIHlvdXIgY2hhbmdlcyBwcm9kdWNlIGEgbG90IG9mIGRlbHRhcywgeW91IG1heSB3YW50IHRvIGxvb2sgaW50bworc3BsaXR0aW5nIHRoZW0gaW50byBpbmRpdmlkdWFsIHBhdGNoZXMgd2hpY2ggbW9kaWZ5IHRoaW5ncyBpbgorbG9naWNhbCBzdGFnZXMuICBUaGlzIHdpbGwgZmFjaWxpdGF0ZSBlYXNpZXIgcmV2aWV3aW5nIGJ5IG90aGVyCitrZXJuZWwgZGV2ZWxvcGVycywgdmVyeSBpbXBvcnRhbnQgaWYgeW91IHdhbnQgeW91ciBwYXRjaCBhY2NlcHRlZC4KK1RoZXJlIGFyZSBhIG51bWJlciBvZiBzY3JpcHRzIHdoaWNoIGNhbiBhaWQgaW4gdGhpczoKKworUXVpbHQ6CitodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wcm9qZWN0cy9xdWlsdAorCitBbmRyZXcgTW9ydG9uJ3MgcGF0Y2ggc2NyaXB0czoKK2h0dHA6Ly93d3cuemlwLmNvbS5hdS9+YWtwbS9saW51eC9wYXRjaGVzLworSW5zdGVhZCBvZiB0aGVzZSBzY3JpcHRzLCBxdWlsdCBpcyB0aGUgcmVjb21tZW5kZWQgcGF0Y2ggbWFuYWdlbWVudAordG9vbCAoc2VlIGFib3ZlKS4KKworCisKKzIpIERlc2NyaWJlIHlvdXIgY2hhbmdlcy4KKworRGVzY3JpYmUgdGhlIHRlY2huaWNhbCBkZXRhaWwgb2YgdGhlIGNoYW5nZShzKSB5b3VyIHBhdGNoIGluY2x1ZGVzLgorCitCZSBhcyBzcGVjaWZpYyBhcyBwb3NzaWJsZS4gIFRoZSBXT1JTVCBkZXNjcmlwdGlvbnMgcG9zc2libGUgaW5jbHVkZQordGhpbmdzIGxpa2UgInVwZGF0ZSBkcml2ZXIgWCIsICJidWcgZml4IGZvciBkcml2ZXIgWCIsIG9yICJ0aGlzIHBhdGNoCitpbmNsdWRlcyB1cGRhdGVzIGZvciBzdWJzeXN0ZW0gWC4gIFBsZWFzZSBhcHBseS4iCisKK0lmIHlvdXIgZGVzY3JpcHRpb24gc3RhcnRzIHRvIGdldCBsb25nLCB0aGF0J3MgYSBzaWduIHRoYXQgeW91IHByb2JhYmx5CituZWVkIHRvIHNwbGl0IHVwIHlvdXIgcGF0Y2guICBTZWUgIzMsIG5leHQuCisKKworCiszKSBTZXBhcmF0ZSB5b3VyIGNoYW5nZXMuCisKK1NlcGFyYXRlIF9sb2dpY2FsIGNoYW5nZXNfIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4KKworRm9yIGV4YW1wbGUsIGlmIHlvdXIgY2hhbmdlcyBpbmNsdWRlIGJvdGggYnVnIGZpeGVzIGFuZCBwZXJmb3JtYW5jZQorZW5oYW5jZW1lbnRzIGZvciBhIHNpbmdsZSBkcml2ZXIsIHNlcGFyYXRlIHRob3NlIGNoYW5nZXMgaW50byB0d28KK29yIG1vcmUgcGF0Y2hlcy4gIElmIHlvdXIgY2hhbmdlcyBpbmNsdWRlIGFuIEFQSSB1cGRhdGUsIGFuZCBhIG5ldworZHJpdmVyIHdoaWNoIHVzZXMgdGhhdCBuZXcgQVBJLCBzZXBhcmF0ZSB0aG9zZSBpbnRvIHR3byBwYXRjaGVzLgorCitPbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IG1ha2UgYSBzaW5nbGUgY2hhbmdlIHRvIG51bWVyb3VzIGZpbGVzLAorZ3JvdXAgdGhvc2UgY2hhbmdlcyBpbnRvIGEgc2luZ2xlIHBhdGNoLiAgVGh1cyBhIHNpbmdsZSBsb2dpY2FsIGNoYW5nZQoraXMgY29udGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBwYXRjaC4KKworSWYgb25lIHBhdGNoIGRlcGVuZHMgb24gYW5vdGhlciBwYXRjaCBpbiBvcmRlciBmb3IgYSBjaGFuZ2UgdG8gYmUKK2NvbXBsZXRlLCB0aGF0IGlzIE9LLiAgU2ltcGx5IG5vdGUgInRoaXMgcGF0Y2ggZGVwZW5kcyBvbiBwYXRjaCBYIgoraW4geW91ciBwYXRjaCBkZXNjcmlwdGlvbi4KKworSWYgeW91IGNhbm5vdCBjb25kZW5zZSB5b3VyIHBhdGNoIHNldCBpbnRvIGEgc21hbGxlciBzZXQgb2YgcGF0Y2hlcywKK3RoZW4gb25seSBwb3N0IHNheSAxNSBvciBzbyBhdCBhIHRpbWUgYW5kIHdhaXQgZm9yIHJldmlldyBhbmQgaW50ZWdyYXRpb24uCisKKworCis0KSBTdHlsZSBjaGVjayB5b3VyIGNoYW5nZXMuCisKK0NoZWNrIHlvdXIgcGF0Y2ggZm9yIGJhc2ljIHN0eWxlIHZpb2xhdGlvbnMsIGRldGFpbHMgb2Ygd2hpY2ggY2FuIGJlCitmb3VuZCBpbiBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlLiAgRmFpbHVyZSB0byBkbyBzbyBzaW1wbHkgd2FzdGVzCit0aGUgcmV2aWV3ZXJzIHRpbWUgYW5kIHdpbGwgZ2V0IHlvdXIgcGF0Y2ggcmVqZWN0ZWQsIHByb2JhYmx5Cit3aXRob3V0IGV2ZW4gYmVpbmcgcmVhZC4KKworQXQgYSBtaW5pbXVtIHlvdSBzaG91bGQgY2hlY2sgeW91ciBwYXRjaGVzIHdpdGggdGhlIHBhdGNoIHN0eWxlCitjaGVja2VyIHByaW9yIHRvIHN1Ym1pc3Npb24gKHNjcmlwdHMvY2hlY2twYXRjaC5wbCkuICBZb3Ugc2hvdWxkCitiZSBhYmxlIHRvIGp1c3RpZnkgYWxsIHZpb2xhdGlvbnMgdGhhdCByZW1haW4gaW4geW91ciBwYXRjaC4KKworCisKKzUpIFNlbGVjdCBlLW1haWwgZGVzdGluYXRpb24uCisKK0xvb2sgdGhyb3VnaCB0aGUgTUFJTlRBSU5FUlMgZmlsZSBhbmQgdGhlIHNvdXJjZSBjb2RlLCBhbmQgZGV0ZXJtaW5lCitpZiB5b3VyIGNoYW5nZSBhcHBsaWVzIHRvIGEgc3BlY2lmaWMgc3Vic3lzdGVtIG9mIHRoZSBrZXJuZWwsIHdpdGgKK2FuIGFzc2lnbmVkIG1haW50YWluZXIuICBJZiBzbywgZS1tYWlsIHRoYXQgcGVyc29uLgorCitJZiBubyBtYWludGFpbmVyIGlzIGxpc3RlZCwgb3IgdGhlIG1haW50YWluZXIgZG9lcyBub3QgcmVzcG9uZCwgc2VuZAoreW91ciBwYXRjaCB0byB0aGUgcHJpbWFyeSBMaW51eCBrZXJuZWwgZGV2ZWxvcGVyJ3MgbWFpbGluZyBsaXN0LAorbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZy4gIE1vc3Qga2VybmVsIGRldmVsb3BlcnMgbW9uaXRvciB0aGlzCitlLW1haWwgbGlzdCwgYW5kIGNhbiBjb21tZW50IG9uIHlvdXIgY2hhbmdlcy4KKworCitEbyBub3Qgc2VuZCBtb3JlIHRoYW4gMTUgcGF0Y2hlcyBhdCBvbmNlIHRvIHRoZSB2Z2VyIG1haWxpbmcgbGlzdHMhISEKKworCitMaW51cyBUb3J2YWxkcyBpcyB0aGUgZmluYWwgYXJiaXRlciBvZiBhbGwgY2hhbmdlcyBhY2NlcHRlZCBpbnRvIHRoZQorTGludXgga2VybmVsLiAgSGlzIGUtbWFpbCBhZGRyZXNzIGlzIDx0b3J2YWxkc0BsaW51eC1mb3VuZGF0aW9uLm9yZz4uCitIZSBnZXRzIGEgbG90IG9mIGUtbWFpbCwgc28gdHlwaWNhbGx5IHlvdSBzaG91bGQgZG8geW91ciBiZXN0IHRvIC1hdm9pZC0KK3NlbmRpbmcgaGltIGUtbWFpbC4KKworUGF0Y2hlcyB3aGljaCBhcmUgYnVnIGZpeGVzLCBhcmUgIm9idmlvdXMiIGNoYW5nZXMsIG9yIHNpbWlsYXJseQorcmVxdWlyZSBsaXR0bGUgZGlzY3Vzc2lvbiBzaG91bGQgYmUgc2VudCBvciBDQydkIHRvIExpbnVzLiAgUGF0Y2hlcword2hpY2ggcmVxdWlyZSBkaXNjdXNzaW9uIG9yIGRvIG5vdCBoYXZlIGEgY2xlYXIgYWR2YW50YWdlIHNob3VsZAordXN1YWxseSBiZSBzZW50IGZpcnN0IHRvIGxpbnV4LWtlcm5lbC4gIE9ubHkgYWZ0ZXIgdGhlIHBhdGNoIGlzCitkaXNjdXNzZWQgc2hvdWxkIHRoZSBwYXRjaCB0aGVuIGJlIHN1Ym1pdHRlZCB0byBMaW51cy4KKworCisKKzYpIFNlbGVjdCB5b3VyIENDIChlLW1haWwgY2FyYm9uIGNvcHkpIGxpc3QuCisKK1VubGVzcyB5b3UgaGF2ZSBhIHJlYXNvbiBOT1QgdG8gZG8gc28sIENDIGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcuCisKK090aGVyIGtlcm5lbCBkZXZlbG9wZXJzIGJlc2lkZXMgTGludXMgbmVlZCB0byBiZSBhd2FyZSBvZiB5b3VyIGNoYW5nZSwKK3NvIHRoYXQgdGhleSBtYXkgY29tbWVudCBvbiBpdCBhbmQgb2ZmZXIgY29kZSByZXZpZXcgYW5kIHN1Z2dlc3Rpb25zLgorbGludXgta2VybmVsIGlzIHRoZSBwcmltYXJ5IExpbnV4IGtlcm5lbCBkZXZlbG9wZXIgbWFpbGluZyBsaXN0LgorT3RoZXIgbWFpbGluZyBsaXN0cyBhcmUgYXZhaWxhYmxlIGZvciBzcGVjaWZpYyBzdWJzeXN0ZW1zLCBzdWNoIGFzCitVU0IsIGZyYW1lYnVmZmVyIGRldmljZXMsIHRoZSBWRlMsIHRoZSBTQ1NJIHN1YnN5c3RlbSwgZXRjLiAgU2VlIHRoZQorTUFJTlRBSU5FUlMgZmlsZSBmb3IgYSBtYWlsaW5nIGxpc3QgdGhhdCByZWxhdGVzIHNwZWNpZmljYWxseSB0bworeW91ciBjaGFuZ2UuCisKK01ham9yZG9tbyBsaXN0cyBvZiBWR0VSLktFUk5FTC5PUkcgYXQ6CisJPGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sPgorCitJZiBjaGFuZ2VzIGFmZmVjdCB1c2VybGFuZC1rZXJuZWwgaW50ZXJmYWNlcywgcGxlYXNlIHNlbmQKK3RoZSBNQU4tUEFHRVMgbWFpbnRhaW5lciAoYXMgbGlzdGVkIGluIHRoZSBNQUlOVEFJTkVSUyBmaWxlKQorYSBtYW4tcGFnZXMgcGF0Y2gsIG9yIGF0IGxlYXN0IGEgbm90aWZpY2F0aW9uIG9mIHRoZSBjaGFuZ2UsCitzbyB0aGF0IHNvbWUgaW5mb3JtYXRpb24gbWFrZXMgaXRzIHdheSBpbnRvIHRoZSBtYW51YWwgcGFnZXMuCisKK0V2ZW4gaWYgdGhlIG1haW50YWluZXIgZGlkIG5vdCByZXNwb25kIGluIHN0ZXAgIzQsIG1ha2Ugc3VyZSB0byBBTFdBWVMKK2NvcHkgdGhlIG1haW50YWluZXIgd2hlbiB5b3UgY2hhbmdlIHRoZWlyIGNvZGUuCisKK0ZvciBzbWFsbCBwYXRjaGVzIHlvdSBtYXkgd2FudCB0byBDQyB0aGUgVHJpdmlhbCBQYXRjaCBNb25rZXkKK3RyaXZpYWxAa2VybmVsLm9yZyBtYW5hZ2VkIGJ5IEFkcmlhbiBCdW5rOyB3aGljaCBjb2xsZWN0cyAidHJpdmlhbCIKK3BhdGNoZXMuIFRyaXZpYWwgcGF0Y2hlcyBtdXN0IHF1YWxpZnkgZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJ1bGVzOgorIFNwZWxsaW5nIGZpeGVzIGluIGRvY3VtZW50YXRpb24KKyBTcGVsbGluZyBmaXhlcyB3aGljaCBjb3VsZCBicmVhayBncmVwKDEpCisgV2FybmluZyBmaXhlcyAoY2x1dHRlcmluZyB3aXRoIHVzZWxlc3Mgd2FybmluZ3MgaXMgYmFkKQorIENvbXBpbGF0aW9uIGZpeGVzIChvbmx5IGlmIHRoZXkgYXJlIGFjdHVhbGx5IGNvcnJlY3QpCisgUnVudGltZSBmaXhlcyAob25seSBpZiB0aGV5IGFjdHVhbGx5IGZpeCB0aGluZ3MpCisgUmVtb3ZpbmcgdXNlIG9mIGRlcHJlY2F0ZWQgZnVuY3Rpb25zL21hY3JvcyAoZWcuIGNoZWNrX3JlZ2lvbikKKyBDb250YWN0IGRldGFpbCBhbmQgZG9jdW1lbnRhdGlvbiBmaXhlcworIE5vbi1wb3J0YWJsZSBjb2RlIHJlcGxhY2VkIGJ5IHBvcnRhYmxlIGNvZGUgKGV2ZW4gaW4gYXJjaC1zcGVjaWZpYywKKyBzaW5jZSBwZW9wbGUgY29weSwgYXMgbG9uZyBhcyBpdCdzIHRyaXZpYWwpCisgQW55IGZpeCBieSB0aGUgYXV0aG9yL21haW50YWluZXIgb2YgdGhlIGZpbGUgKGllLiBwYXRjaCBtb25rZXkKKyBpbiByZS10cmFuc21pc3Npb24gbW9kZSkKK1VSTDogPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9idW5rL3RyaXZpYWwvPgorCisKKworNykgTm8gTUlNRSwgbm8gbGlua3MsIG5vIGNvbXByZXNzaW9uLCBubyBhdHRhY2htZW50cy4gIEp1c3QgcGxhaW4gdGV4dC4KKworTGludXMgYW5kIG90aGVyIGtlcm5lbCBkZXZlbG9wZXJzIG5lZWQgdG8gYmUgYWJsZSB0byByZWFkIGFuZCBjb21tZW50CitvbiB0aGUgY2hhbmdlcyB5b3UgYXJlIHN1Ym1pdHRpbmcuICBJdCBpcyBpbXBvcnRhbnQgZm9yIGEga2VybmVsCitkZXZlbG9wZXIgdG8gYmUgYWJsZSB0byAicXVvdGUiIHlvdXIgY2hhbmdlcywgdXNpbmcgc3RhbmRhcmQgZS1tYWlsCit0b29scywgc28gdGhhdCB0aGV5IG1heSBjb21tZW50IG9uIHNwZWNpZmljIHBvcnRpb25zIG9mIHlvdXIgY29kZS4KKworRm9yIHRoaXMgcmVhc29uLCBhbGwgcGF0Y2hlcyBzaG91bGQgYmUgc3VibWl0dGluZyBlLW1haWwgImlubGluZSIuCitXQVJOSU5HOiAgQmUgd2FyeSBvZiB5b3VyIGVkaXRvcidzIHdvcmQtd3JhcCBjb3JydXB0aW5nIHlvdXIgcGF0Y2gsCitpZiB5b3UgY2hvb3NlIHRvIGN1dC1uLXBhc3RlIHlvdXIgcGF0Y2guCisKK0RvIG5vdCBhdHRhY2ggdGhlIHBhdGNoIGFzIGEgTUlNRSBhdHRhY2htZW50LCBjb21wcmVzc2VkIG9yIG5vdC4KK01hbnkgcG9wdWxhciBlLW1haWwgYXBwbGljYXRpb25zIHdpbGwgbm90IGFsd2F5cyB0cmFuc21pdCBhIE1JTUUKK2F0dGFjaG1lbnQgYXMgcGxhaW4gdGV4dCwgbWFraW5nIGl0IGltcG9zc2libGUgdG8gY29tbWVudCBvbiB5b3VyCitjb2RlLiAgQSBNSU1FIGF0dGFjaG1lbnQgYWxzbyB0YWtlcyBMaW51cyBhIGJpdCBtb3JlIHRpbWUgdG8gcHJvY2VzcywKK2RlY3JlYXNpbmcgdGhlIGxpa2VsaWhvb2Qgb2YgeW91ciBNSU1FLWF0dGFjaGVkIGNoYW5nZSBiZWluZyBhY2NlcHRlZC4KKworRXhjZXB0aW9uOiAgSWYgeW91ciBtYWlsZXIgaXMgbWFuZ2xpbmcgcGF0Y2hlcyB0aGVuIHNvbWVvbmUgbWF5IGFzaworeW91IHRvIHJlLXNlbmQgdGhlbSB1c2luZyBNSU1FLgorCitTZWUgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBmb3IgaGludHMgYWJvdXQgY29uZmlndXJpbmcKK3lvdXIgZS1tYWlsIGNsaWVudCBzbyB0aGF0IGl0IHNlbmRzIHlvdXIgcGF0Y2hlcyB1bnRvdWNoZWQuCisKKzgpIEUtbWFpbCBzaXplLgorCitXaGVuIHNlbmRpbmcgcGF0Y2hlcyB0byBMaW51cywgYWx3YXlzIGZvbGxvdyBzdGVwICM3LgorCitMYXJnZSBjaGFuZ2VzIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIG1haWxpbmcgbGlzdHMsIGFuZCBzb21lCittYWludGFpbmVycy4gIElmIHlvdXIgcGF0Y2gsIHVuY29tcHJlc3NlZCwgZXhjZWVkcyA0MCBrQiBpbiBzaXplLAoraXQgaXMgcHJlZmVycmVkIHRoYXQgeW91IHN0b3JlIHlvdXIgcGF0Y2ggb24gYW4gSW50ZXJuZXQtYWNjZXNzaWJsZQorc2VydmVyLCBhbmQgcHJvdmlkZSBpbnN0ZWFkIGEgVVJMIChsaW5rKSBwb2ludGluZyB0byB5b3VyIHBhdGNoLgorCisKKworOSkgTmFtZSB5b3VyIGtlcm5lbCB2ZXJzaW9uLgorCitJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSwgZWl0aGVyIGluIHRoZSBzdWJqZWN0IGxpbmUgb3IgaW4gdGhlIHBhdGNoCitkZXNjcmlwdGlvbiwgdGhlIGtlcm5lbCB2ZXJzaW9uIHRvIHdoaWNoIHRoaXMgcGF0Y2ggYXBwbGllcy4KKworSWYgdGhlIHBhdGNoIGRvZXMgbm90IGFwcGx5IGNsZWFubHkgdG8gdGhlIGxhdGVzdCBrZXJuZWwgdmVyc2lvbiwKK0xpbnVzIHdpbGwgbm90IGFwcGx5IGl0LgorCisKKworMTApIERvbid0IGdldCBkaXNjb3VyYWdlZC4gIFJlLXN1Ym1pdC4KKworQWZ0ZXIgeW91IGhhdmUgc3VibWl0dGVkIHlvdXIgY2hhbmdlLCBiZSBwYXRpZW50IGFuZCB3YWl0LiAgSWYgTGludXMKK2xpa2VzIHlvdXIgY2hhbmdlIGFuZCBhcHBsaWVzIGl0LCBpdCB3aWxsIGFwcGVhciBpbiB0aGUgbmV4dCB2ZXJzaW9uCitvZiB0aGUga2VybmVsIHRoYXQgaGUgcmVsZWFzZXMuCisKK0hvd2V2ZXIsIGlmIHlvdXIgY2hhbmdlIGRvZXNuJ3QgYXBwZWFyIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlCitrZXJuZWwsIHRoZXJlIGNvdWxkIGJlIGFueSBudW1iZXIgb2YgcmVhc29ucy4gIEl0J3MgWU9VUiBqb2IgdG8KK25hcnJvdyBkb3duIHRob3NlIHJlYXNvbnMsIGNvcnJlY3Qgd2hhdCB3YXMgd3JvbmcsIGFuZCBzdWJtaXQgeW91cgordXBkYXRlZCBjaGFuZ2UuCisKK0l0IGlzIHF1aXRlIGNvbW1vbiBmb3IgTGludXMgdG8gImRyb3AiIHlvdXIgcGF0Y2ggd2l0aG91dCBjb21tZW50LgorVGhhdCdzIHRoZSBuYXR1cmUgb2YgdGhlIHN5c3RlbS4gIElmIGhlIGRyb3BzIHlvdXIgcGF0Y2gsIGl0IGNvdWxkIGJlCitkdWUgdG8KKyogWW91ciBwYXRjaCBkaWQgbm90IGFwcGx5IGNsZWFubHkgdG8gdGhlIGxhdGVzdCBrZXJuZWwgdmVyc2lvbi4KKyogWW91ciBwYXRjaCB3YXMgbm90IHN1ZmZpY2llbnRseSBkaXNjdXNzZWQgb24gbGludXgta2VybmVsLgorKiBBIHN0eWxlIGlzc3VlIChzZWUgc2VjdGlvbiAyKS4KKyogQW4gZS1tYWlsIGZvcm1hdHRpbmcgaXNzdWUgKHJlLXJlYWQgdGhpcyBzZWN0aW9uKS4KKyogQSB0ZWNobmljYWwgcHJvYmxlbSB3aXRoIHlvdXIgY2hhbmdlLgorKiBIZSBnZXRzIHRvbnMgb2YgZS1tYWlsLCBhbmQgeW91cnMgZ290IGxvc3QgaW4gdGhlIHNodWZmbGUuCisqIFlvdSBhcmUgYmVpbmcgYW5ub3lpbmcuCisKK1doZW4gaW4gZG91YnQsIHNvbGljaXQgY29tbWVudHMgb24gbGludXgta2VybmVsIG1haWxpbmcgbGlzdC4KKworCisKKzExKSBJbmNsdWRlIFBBVENIIGluIHRoZSBzdWJqZWN0CisKK0R1ZSB0byBoaWdoIGUtbWFpbCB0cmFmZmljIHRvIExpbnVzLCBhbmQgdG8gbGludXgta2VybmVsLCBpdCBpcyBjb21tb24KK2NvbnZlbnRpb24gdG8gcHJlZml4IHlvdXIgc3ViamVjdCBsaW5lIHdpdGggW1BBVENIXS4gIFRoaXMgbGV0cyBMaW51cworYW5kIG90aGVyIGtlcm5lbCBkZXZlbG9wZXJzIG1vcmUgZWFzaWx5IGRpc3Rpbmd1aXNoIHBhdGNoZXMgZnJvbSBvdGhlcgorZS1tYWlsIGRpc2N1c3Npb25zLgorCisKKworMTIpIFNpZ24geW91ciB3b3JrCisKK1RvIGltcHJvdmUgdHJhY2tpbmcgb2Ygd2hvIGRpZCB3aGF0LCBlc3BlY2lhbGx5IHdpdGggcGF0Y2hlcyB0aGF0IGNhbgorcGVyY29sYXRlIHRvIHRoZWlyIGZpbmFsIHJlc3RpbmcgcGxhY2UgaW4gdGhlIGtlcm5lbCB0aHJvdWdoIHNldmVyYWwKK2xheWVycyBvZiBtYWludGFpbmVycywgd2UndmUgaW50cm9kdWNlZCBhICJzaWduLW9mZiIgcHJvY2VkdXJlIG9uCitwYXRjaGVzIHRoYXQgYXJlIGJlaW5nIGVtYWlsZWQgYXJvdW5kLgorCitUaGUgc2lnbi1vZmYgaXMgYSBzaW1wbGUgbGluZSBhdCB0aGUgZW5kIG9mIHRoZSBleHBsYW5hdGlvbiBmb3IgdGhlCitwYXRjaCwgd2hpY2ggY2VydGlmaWVzIHRoYXQgeW91IHdyb3RlIGl0IG9yIG90aGVyd2lzZSBoYXZlIHRoZSByaWdodCB0bworcGFzcyBpdCBvbiBhcyBhIG9wZW4tc291cmNlIHBhdGNoLiAgVGhlIHJ1bGVzIGFyZSBwcmV0dHkgc2ltcGxlOiBpZiB5b3UKK2NhbiBjZXJ0aWZ5IHRoZSBiZWxvdzoKKworICAgICAgICBEZXZlbG9wZXIncyBDZXJ0aWZpY2F0ZSBvZiBPcmlnaW4gMS4xCisKKyAgICAgICAgQnkgbWFraW5nIGEgY29udHJpYnV0aW9uIHRvIHRoaXMgcHJvamVjdCwgSSBjZXJ0aWZ5IHRoYXQ6CisKKyAgICAgICAgKGEpIFRoZSBjb250cmlidXRpb24gd2FzIGNyZWF0ZWQgaW4gd2hvbGUgb3IgaW4gcGFydCBieSBtZSBhbmQgSQorICAgICAgICAgICAgaGF2ZSB0aGUgcmlnaHQgdG8gc3VibWl0IGl0IHVuZGVyIHRoZSBvcGVuIHNvdXJjZSBsaWNlbnNlCisgICAgICAgICAgICBpbmRpY2F0ZWQgaW4gdGhlIGZpbGU7IG9yCisKKyAgICAgICAgKGIpIFRoZSBjb250cmlidXRpb24gaXMgYmFzZWQgdXBvbiBwcmV2aW91cyB3b3JrIHRoYXQsIHRvIHRoZSBiZXN0CisgICAgICAgICAgICBvZiBteSBrbm93bGVkZ2UsIGlzIGNvdmVyZWQgdW5kZXIgYW4gYXBwcm9wcmlhdGUgb3BlbiBzb3VyY2UKKyAgICAgICAgICAgIGxpY2Vuc2UgYW5kIEkgaGF2ZSB0aGUgcmlnaHQgdW5kZXIgdGhhdCBsaWNlbnNlIHRvIHN1Ym1pdCB0aGF0CisgICAgICAgICAgICB3b3JrIHdpdGggbW9kaWZpY2F0aW9ucywgd2hldGhlciBjcmVhdGVkIGluIHdob2xlIG9yIGluIHBhcnQKKyAgICAgICAgICAgIGJ5IG1lLCB1bmRlciB0aGUgc2FtZSBvcGVuIHNvdXJjZSBsaWNlbnNlICh1bmxlc3MgSSBhbQorICAgICAgICAgICAgcGVybWl0dGVkIHRvIHN1Ym1pdCB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlKSwgYXMgaW5kaWNhdGVkCisgICAgICAgICAgICBpbiB0aGUgZmlsZTsgb3IKKworICAgICAgICAoYykgVGhlIGNvbnRyaWJ1dGlvbiB3YXMgcHJvdmlkZWQgZGlyZWN0bHkgdG8gbWUgYnkgc29tZSBvdGhlcgorICAgICAgICAgICAgcGVyc29uIHdobyBjZXJ0aWZpZWQgKGEpLCAoYikgb3IgKGMpIGFuZCBJIGhhdmUgbm90IG1vZGlmaWVkCisgICAgICAgICAgICBpdC4KKworCShkKSBJIHVuZGVyc3RhbmQgYW5kIGFncmVlIHRoYXQgdGhpcyBwcm9qZWN0IGFuZCB0aGUgY29udHJpYnV0aW9uCisJICAgIGFyZSBwdWJsaWMgYW5kIHRoYXQgYSByZWNvcmQgb2YgdGhlIGNvbnRyaWJ1dGlvbiAoaW5jbHVkaW5nIGFsbAorCSAgICBwZXJzb25hbCBpbmZvcm1hdGlvbiBJIHN1Ym1pdCB3aXRoIGl0LCBpbmNsdWRpbmcgbXkgc2lnbi1vZmYpIGlzCisJICAgIG1haW50YWluZWQgaW5kZWZpbml0ZWx5IGFuZCBtYXkgYmUgcmVkaXN0cmlidXRlZCBjb25zaXN0ZW50IHdpdGgKKwkgICAgdGhpcyBwcm9qZWN0IG9yIHRoZSBvcGVuIHNvdXJjZSBsaWNlbnNlKHMpIGludm9sdmVkLgorCit0aGVuIHlvdSBqdXN0IGFkZCBhIGxpbmUgc2F5aW5nCisKKwlTaWduZWQtb2ZmLWJ5OiBSYW5kb20gSiBEZXZlbG9wZXIgPHJhbmRvbUBkZXZlbG9wZXIuZXhhbXBsZS5vcmc+CisKK3VzaW5nIHlvdXIgcmVhbCBuYW1lIChzb3JyeSwgbm8gcHNldWRvbnltcyBvciBhbm9ueW1vdXMgY29udHJpYnV0aW9ucy4pCisKK1NvbWUgcGVvcGxlIGFsc28gcHV0IGV4dHJhIHRhZ3MgYXQgdGhlIGVuZC4gIFRoZXknbGwganVzdCBiZSBpZ25vcmVkIGZvcgorbm93LCBidXQgeW91IGNhbiBkbyB0aGlzIHRvIG1hcmsgaW50ZXJuYWwgY29tcGFueSBwcm9jZWR1cmVzIG9yIGp1c3QKK3BvaW50IG91dCBzb21lIHNwZWNpYWwgZGV0YWlsIGFib3V0IHRoZSBzaWduLW9mZi4KKworCisxMykgV2hlbiB0byB1c2UgQWNrZWQtYnk6CisKK1RoZSBTaWduZWQtb2ZmLWJ5OiB0YWcgaW5kaWNhdGVzIHRoYXQgdGhlIHNpZ25lciB3YXMgaW52b2x2ZWQgaW4gdGhlCitkZXZlbG9wbWVudCBvZiB0aGUgcGF0Y2gsIG9yIHRoYXQgaGUvc2hlIHdhcyBpbiB0aGUgcGF0Y2gncyBkZWxpdmVyeSBwYXRoLgorCitJZiBhIHBlcnNvbiB3YXMgbm90IGRpcmVjdGx5IGludm9sdmVkIGluIHRoZSBwcmVwYXJhdGlvbiBvciBoYW5kbGluZyBvZiBhCitwYXRjaCBidXQgd2lzaGVzIHRvIHNpZ25pZnkgYW5kIHJlY29yZCB0aGVpciBhcHByb3ZhbCBvZiBpdCB0aGVuIHRoZXkgY2FuCithcnJhbmdlIHRvIGhhdmUgYW4gQWNrZWQtYnk6IGxpbmUgYWRkZWQgdG8gdGhlIHBhdGNoJ3MgY2hhbmdlbG9nLgorCitBY2tlZC1ieTogaXMgb2Z0ZW4gdXNlZCBieSB0aGUgbWFpbnRhaW5lciBvZiB0aGUgYWZmZWN0ZWQgY29kZSB3aGVuIHRoYXQKK21haW50YWluZXIgbmVpdGhlciBjb250cmlidXRlZCB0byBub3IgZm9yd2FyZGVkIHRoZSBwYXRjaC4KKworQWNrZWQtYnk6IGlzIG5vdCBhcyBmb3JtYWwgYXMgU2lnbmVkLW9mZi1ieTouICBJdCBpcyBhIHJlY29yZCB0aGF0IHRoZSBhY2tlcgoraGFzIGF0IGxlYXN0IHJldmlld2VkIHRoZSBwYXRjaCBhbmQgaGFzIGluZGljYXRlZCBhY2NlcHRhbmNlLiAgSGVuY2UgcGF0Y2gKK21lcmdlcnMgd2lsbCBzb21ldGltZXMgbWFudWFsbHkgY29udmVydCBhbiBhY2tlcidzICJ5ZXAsIGxvb2tzIGdvb2QgdG8gbWUiCitpbnRvIGFuIEFja2VkLWJ5Oi4KKworQWNrZWQtYnk6IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGluZGljYXRlIGFja25vd2xlZGdlbWVudCBvZiB0aGUgZW50aXJlIHBhdGNoLgorRm9yIGV4YW1wbGUsIGlmIGEgcGF0Y2ggYWZmZWN0cyBtdWx0aXBsZSBzdWJzeXN0ZW1zIGFuZCBoYXMgYW4gQWNrZWQtYnk6IGZyb20KK29uZSBzdWJzeXN0ZW0gbWFpbnRhaW5lciB0aGVuIHRoaXMgdXN1YWxseSBpbmRpY2F0ZXMgYWNrbm93bGVkZ2VtZW50IG9mIGp1c3QKK3RoZSBwYXJ0IHdoaWNoIGFmZmVjdHMgdGhhdCBtYWludGFpbmVyJ3MgY29kZS4gIEp1ZGdlbWVudCBzaG91bGQgYmUgdXNlZCBoZXJlLgorIFdoZW4gaW4gZG91YnQgcGVvcGxlIHNob3VsZCByZWZlciB0byB0aGUgb3JpZ2luYWwgZGlzY3Vzc2lvbiBpbiB0aGUgbWFpbGluZworbGlzdCBhcmNoaXZlcy4KKworCisxNCkgVGhlIGNhbm9uaWNhbCBwYXRjaCBmb3JtYXQKKworVGhlIGNhbm9uaWNhbCBwYXRjaCBzdWJqZWN0IGxpbmUgaXM6CisKKyAgICBTdWJqZWN0OiBbUEFUQ0ggMDAxLzEyM10gc3Vic3lzdGVtOiBzdW1tYXJ5IHBocmFzZQorCitUaGUgY2Fub25pY2FsIHBhdGNoIG1lc3NhZ2UgYm9keSBjb250YWlucyB0aGUgZm9sbG93aW5nOgorCisgIC0gQSAiZnJvbSIgbGluZSBzcGVjaWZ5aW5nIHRoZSBwYXRjaCBhdXRob3IuCisKKyAgLSBBbiBlbXB0eSBsaW5lLgorCisgIC0gVGhlIGJvZHkgb2YgdGhlIGV4cGxhbmF0aW9uLCB3aGljaCB3aWxsIGJlIGNvcGllZCB0byB0aGUKKyAgICBwZXJtYW5lbnQgY2hhbmdlbG9nIHRvIGRlc2NyaWJlIHRoaXMgcGF0Y2guCisKKyAgLSBUaGUgIlNpZ25lZC1vZmYtYnk6IiBsaW5lcywgZGVzY3JpYmVkIGFib3ZlLCB3aGljaCB3aWxsCisgICAgYWxzbyBnbyBpbiB0aGUgY2hhbmdlbG9nLgorCisgIC0gQSBtYXJrZXIgbGluZSBjb250YWluaW5nIHNpbXBseSAiLS0tIi4KKworICAtIEFueSBhZGRpdGlvbmFsIGNvbW1lbnRzIG5vdCBzdWl0YWJsZSBmb3IgdGhlIGNoYW5nZWxvZy4KKworICAtIFRoZSBhY3R1YWwgcGF0Y2ggKGRpZmYgb3V0cHV0KS4KKworVGhlIFN1YmplY3QgbGluZSBmb3JtYXQgbWFrZXMgaXQgdmVyeSBlYXN5IHRvIHNvcnQgdGhlIGVtYWlscworYWxwaGFiZXRpY2FsbHkgYnkgc3ViamVjdCBsaW5lIC0gcHJldHR5IG11Y2ggYW55IGVtYWlsIHJlYWRlciB3aWxsCitzdXBwb3J0IHRoYXQgLSBzaW5jZSBiZWNhdXNlIHRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgemVyby1wYWRkZWQsCit0aGUgbnVtZXJpY2FsIGFuZCBhbHBoYWJldGljIHNvcnQgaXMgdGhlIHNhbWUuCisKK1RoZSAic3Vic3lzdGVtIiBpbiB0aGUgZW1haWwncyBTdWJqZWN0IHNob3VsZCBpZGVudGlmeSB3aGljaAorYXJlYSBvciBzdWJzeXN0ZW0gb2YgdGhlIGtlcm5lbCBpcyBiZWluZyBwYXRjaGVkLgorCitUaGUgInN1bW1hcnkgcGhyYXNlIiBpbiB0aGUgZW1haWwncyBTdWJqZWN0IHNob3VsZCBjb25jaXNlbHkKK2Rlc2NyaWJlIHRoZSBwYXRjaCB3aGljaCB0aGF0IGVtYWlsIGNvbnRhaW5zLiAgVGhlICJzdW1tYXJ5CitwaHJhc2UiIHNob3VsZCBub3QgYmUgYSBmaWxlbmFtZS4gIERvIG5vdCB1c2UgdGhlIHNhbWUgInN1bW1hcnkKK3BocmFzZSIgZm9yIGV2ZXJ5IHBhdGNoIGluIGEgd2hvbGUgcGF0Y2ggc2VyaWVzICh3aGVyZSBhICJwYXRjaAorc2VyaWVzIiBpcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIG11bHRpcGxlLCByZWxhdGVkIHBhdGNoZXMpLgorCitCZWFyIGluIG1pbmQgdGhhdCB0aGUgInN1bW1hcnkgcGhyYXNlIiBvZiB5b3VyIGVtYWlsIGJlY29tZXMKK2EgZ2xvYmFsbHktdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoYXQgcGF0Y2guICBJdCBwcm9wYWdhdGVzCithbGwgdGhlIHdheSBpbnRvIHRoZSBnaXQgY2hhbmdlbG9nLiAgVGhlICJzdW1tYXJ5IHBocmFzZSIgbWF5CitsYXRlciBiZSB1c2VkIGluIGRldmVsb3BlciBkaXNjdXNzaW9ucyB3aGljaCByZWZlciB0byB0aGUgcGF0Y2guCitQZW9wbGUgd2lsbCB3YW50IHRvIGdvb2dsZSBmb3IgdGhlICJzdW1tYXJ5IHBocmFzZSIgdG8gcmVhZAorZGlzY3Vzc2lvbiByZWdhcmRpbmcgdGhhdCBwYXRjaC4KKworQSBjb3VwbGUgb2YgZXhhbXBsZSBTdWJqZWN0czoKKworICAgIFN1YmplY3Q6IFtwYXRjaCAyLzVdIGV4dDI6IGltcHJvdmUgc2NhbGFiaWxpdHkgb2YgYml0bWFwIHNlYXJjaGluZworICAgIFN1YmplY3Q6IFtQQVRDSHYyIDAwMS8yMDddIHg4NjogZml4IGVmbGFncyB0cmFja2luZworCitUaGUgImZyb20iIGxpbmUgbXVzdCBiZSB0aGUgdmVyeSBmaXJzdCBsaW5lIGluIHRoZSBtZXNzYWdlIGJvZHksCithbmQgaGFzIHRoZSBmb3JtOgorCisgICAgICAgIEZyb206IE9yaWdpbmFsIEF1dGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorCitUaGUgImZyb20iIGxpbmUgc3BlY2lmaWVzIHdobyB3aWxsIGJlIGNyZWRpdGVkIGFzIHRoZSBhdXRob3Igb2YgdGhlCitwYXRjaCBpbiB0aGUgcGVybWFuZW50IGNoYW5nZWxvZy4gIElmIHRoZSAiZnJvbSIgbGluZSBpcyBtaXNzaW5nLAordGhlbiB0aGUgIkZyb206IiBsaW5lIGZyb20gdGhlIGVtYWlsIGhlYWRlciB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lCit0aGUgcGF0Y2ggYXV0aG9yIGluIHRoZSBjaGFuZ2Vsb2cuCisKK1RoZSBleHBsYW5hdGlvbiBib2R5IHdpbGwgYmUgY29tbWl0dGVkIHRvIHRoZSBwZXJtYW5lbnQgc291cmNlCitjaGFuZ2Vsb2csIHNvIHNob3VsZCBtYWtlIHNlbnNlIHRvIGEgY29tcGV0ZW50IHJlYWRlciB3aG8gaGFzIGxvbmcKK3NpbmNlIGZvcmdvdHRlbiB0aGUgaW1tZWRpYXRlIGRldGFpbHMgb2YgdGhlIGRpc2N1c3Npb24gdGhhdCBtaWdodAoraGF2ZSBsZWQgdG8gdGhpcyBwYXRjaC4KKworVGhlICItLS0iIG1hcmtlciBsaW5lIHNlcnZlcyB0aGUgZXNzZW50aWFsIHB1cnBvc2Ugb2YgbWFya2luZyBmb3IgcGF0Y2gKK2hhbmRsaW5nIHRvb2xzIHdoZXJlIHRoZSBjaGFuZ2Vsb2cgbWVzc2FnZSBlbmRzLgorCitPbmUgZ29vZCB1c2UgZm9yIHRoZSBhZGRpdGlvbmFsIGNvbW1lbnRzIGFmdGVyIHRoZSAiLS0tIiBtYXJrZXIgaXMgZm9yCithIGRpZmZzdGF0LCB0byBzaG93IHdoYXQgZmlsZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIG51bWJlciBvZiBpbnNlcnRlZAorYW5kIGRlbGV0ZWQgbGluZXMgcGVyIGZpbGUuICBBIGRpZmZzdGF0IGlzIGVzcGVjaWFsbHkgdXNlZnVsIG9uIGJpZ2dlcgorcGF0Y2hlcy4gIE90aGVyIGNvbW1lbnRzIHJlbGV2YW50IG9ubHkgdG8gdGhlIG1vbWVudCBvciB0aGUgbWFpbnRhaW5lciwKK25vdCBzdWl0YWJsZSBmb3IgdGhlIHBlcm1hbmVudCBjaGFuZ2Vsb2csIHNob3VsZCBhbHNvIGdvIGhlcmUuCitVc2UgZGlmZnN0YXQgb3B0aW9ucyAiLXAgMSAtdyA3MCIgc28gdGhhdCBmaWxlbmFtZXMgYXJlIGxpc3RlZCBmcm9tIHRoZQordG9wIG9mIHRoZSBrZXJuZWwgc291cmNlIHRyZWUgYW5kIGRvbid0IHVzZSB0b28gbXVjaCBob3Jpem9udGFsIHNwYWNlCisoZWFzaWx5IGZpdCBpbiA4MCBjb2x1bW5zLCBtYXliZSB3aXRoIHNvbWUgaW5kZW50YXRpb24pLgorCitTZWUgbW9yZSBkZXRhaWxzIG9uIHRoZSBwcm9wZXIgcGF0Y2ggZm9ybWF0IGluIHRoZSBmb2xsb3dpbmcKK3JlZmVyZW5jZXMuCisKKworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTRUNUSU9OIDIgLSBISU5UUywgVElQUywgQU5EIFRSSUNLUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIGxpc3RzIG1hbnkgb2YgdGhlIGNvbW1vbiAicnVsZXMiIGFzc29jaWF0ZWQgd2l0aCBjb2RlCitzdWJtaXR0ZWQgdG8gdGhlIGtlcm5lbC4gIFRoZXJlIGFyZSBhbHdheXMgZXhjZXB0aW9ucy4uLiBidXQgeW91IG11c3QKK2hhdmUgYSByZWFsbHkgZ29vZCByZWFzb24gZm9yIGRvaW5nIHNvLiAgWW91IGNvdWxkIHByb2JhYmx5IGNhbGwgdGhpcworc2VjdGlvbiBMaW51cyBDb21wdXRlciBTY2llbmNlIDEwMS4KKworCisKKzEpIFJlYWQgRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQorCitOdWZmIHNhaWQuICBJZiB5b3VyIGNvZGUgZGV2aWF0ZXMgdG9vIG11Y2ggZnJvbSB0aGlzLCBpdCBpcyBsaWtlbHkKK3RvIGJlIHJlamVjdGVkIHdpdGhvdXQgZnVydGhlciByZXZpZXcsIGFuZCB3aXRob3V0IGNvbW1lbnQuCisKK09uZSBzaWduaWZpY2FudCBleGNlcHRpb24gaXMgd2hlbiBtb3ZpbmcgY29kZSBmcm9tIG9uZSBmaWxlIHRvCithbm90aGVyIC0tIGluIHRoaXMgY2FzZSB5b3Ugc2hvdWxkIG5vdCBtb2RpZnkgdGhlIG1vdmVkIGNvZGUgYXQgYWxsIGluCit0aGUgc2FtZSBwYXRjaCB3aGljaCBtb3ZlcyBpdC4gIFRoaXMgY2xlYXJseSBkZWxpbmVhdGVzIHRoZSBhY3Qgb2YKK21vdmluZyB0aGUgY29kZSBhbmQgeW91ciBjaGFuZ2VzLiAgVGhpcyBncmVhdGx5IGFpZHMgcmV2aWV3IG9mIHRoZQorYWN0dWFsIGRpZmZlcmVuY2VzIGFuZCBhbGxvd3MgdG9vbHMgdG8gYmV0dGVyIHRyYWNrIHRoZSBoaXN0b3J5IG9mCit0aGUgY29kZSBpdHNlbGYuCisKK0NoZWNrIHlvdXIgcGF0Y2hlcyB3aXRoIHRoZSBwYXRjaCBzdHlsZSBjaGVja2VyIHByaW9yIHRvIHN1Ym1pc3Npb24KKyhzY3JpcHRzL2NoZWNrcGF0Y2gucGwpLiAgVGhlIHN0eWxlIGNoZWNrZXIgc2hvdWxkIGJlIHZpZXdlZCBhcworYSBndWlkZSBub3QgYXMgdGhlIGZpbmFsIHdvcmQuICBJZiB5b3VyIGNvZGUgbG9va3MgYmV0dGVyIHdpdGgKK2EgdmlvbGF0aW9uIHRoZW4gaXRzIHByb2JhYmx5IGJlc3QgbGVmdCBhbG9uZS4KKworVGhlIGNoZWNrZXIgcmVwb3J0cyBhdCB0aHJlZSBsZXZlbHM6CisgLSBFUlJPUjogdGhpbmdzIHRoYXQgYXJlIHZlcnkgbGlrZWx5IHRvIGJlIHdyb25nCisgLSBXQVJOSU5HOiB0aGluZ3MgcmVxdWlyaW5nIGNhcmVmdWwgcmV2aWV3CisgLSBDSEVDSzogdGhpbmdzIHJlcXVpcmluZyB0aG91Z2h0CisKK1lvdSBzaG91bGQgYmUgYWJsZSB0byBqdXN0aWZ5IGFsbCB2aW9sYXRpb25zIHRoYXQgcmVtYWluIGluIHlvdXIKK3BhdGNoLgorCisKKworMikgI2lmZGVmcyBhcmUgdWdseQorCitDb2RlIGNsdXR0ZXJlZCB3aXRoIGlmZGVmcyBpcyBkaWZmaWN1bHQgdG8gcmVhZCBhbmQgbWFpbnRhaW4uICBEb24ndCBkbworaXQuICBJbnN0ZWFkLCBwdXQgeW91ciBpZmRlZnMgaW4gYSBoZWFkZXIsIGFuZCBjb25kaXRpb25hbGx5IGRlZmluZQorJ3N0YXRpYyBpbmxpbmUnIGZ1bmN0aW9ucywgb3IgbWFjcm9zLCB3aGljaCBhcmUgdXNlZCBpbiB0aGUgY29kZS4KK0xldCB0aGUgY29tcGlsZXIgb3B0aW1pemUgYXdheSB0aGUgIm5vLW9wIiBjYXNlLgorCitTaW1wbGUgZXhhbXBsZSwgb2YgcG9vciBjb2RlOgorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYgKHNpemVvZihzdHJ1Y3QgZnVua3lfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwkjaWZkZWYgQ09ORklHX05FVF9GVU5LSU5FU1MKKwlpbml0X2Z1bmt5X25ldChkZXYpOworCSNlbmRpZgorCitDbGVhbmVkLXVwIGV4YW1wbGU6CisKKyhpbiBoZWFkZXIpCisJI2lmbmRlZiBDT05GSUdfTkVUX0ZVTktJTkVTUworCXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2Z1bmt5X25ldCAoc3RydWN0IG5ldF9kZXZpY2UgKmQpIHt9CisJI2VuZGlmCisKKyhpbiB0aGUgY29kZSBpdHNlbGYpCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYgKHNpemVvZihzdHJ1Y3QgZnVua3lfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpbml0X2Z1bmt5X25ldChkZXYpOworCisKKworMykgJ3N0YXRpYyBpbmxpbmUnIGlzIGJldHRlciB0aGFuIGEgbWFjcm8KKworU3RhdGljIGlubGluZSBmdW5jdGlvbnMgYXJlIGdyZWF0bHkgcHJlZmVycmVkIG92ZXIgbWFjcm9zLgorVGhleSBwcm92aWRlIHR5cGUgc2FmZXR5LCBoYXZlIG5vIGxlbmd0aCBsaW1pdGF0aW9ucywgbm8gZm9ybWF0dGluZworbGltaXRhdGlvbnMsIGFuZCB1bmRlciBnY2MgdGhleSBhcmUgYXMgY2hlYXAgYXMgbWFjcm9zLgorCitNYWNyb3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY2FzZXMgd2hlcmUgYSBzdGF0aWMgaW5saW5lIGlzIGNsZWFybHkKK3N1Ym9wdGltYWwgW3RoZXJlIGEgZmV3LCBpc29sYXRlZCBjYXNlcyBvZiB0aGlzIGluIGZhc3QgcGF0aHNdLAorb3Igd2hlcmUgaXQgaXMgaW1wb3NzaWJsZSB0byB1c2UgYSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9uIFtzdWNoIGFzCitzdHJpbmctaXppbmddLgorCisnc3RhdGljIGlubGluZScgaXMgcHJlZmVycmVkIG92ZXIgJ3N0YXRpYyBfX2lubGluZV9fJywgJ2V4dGVybiBpbmxpbmUnLAorYW5kICdleHRlcm4gX19pbmxpbmVfXycuCisKKworCis0KSBEb24ndCBvdmVyLWRlc2lnbi4KKworRG9uJ3QgdHJ5IHRvIGFudGljaXBhdGUgbmVidWxvdXMgZnV0dXJlIGNhc2VzIHdoaWNoIG1heSBvciBtYXkgbm90CitiZSB1c2VmdWw6ICAiTWFrZSBpdCBhcyBzaW1wbGUgYXMgeW91IGNhbiwgYW5kIG5vIHNpbXBsZXIuIgorCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU0VDVElPTiAzIC0gUkVGRVJFTkNFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbmRyZXcgTW9ydG9uLCAiVGhlIHBlcmZlY3QgcGF0Y2giICh0cHApLgorICA8aHR0cDovL3d3dy56aXAuY29tLmF1L35ha3BtL2xpbnV4L3BhdGNoZXMvc3R1ZmYvdHBwLnR4dD4KKworSmVmZiBHYXJ6aWssICJMaW51eCBrZXJuZWwgcGF0Y2ggc3VibWlzc2lvbiBmb3JtYXQiLgorICA8aHR0cDovL2xpbnV4Lnl5ei51cy9wYXRjaC1mb3JtYXQuaHRtbD4KKworR3JlZyBLcm9haC1IYXJ0bWFuLCAiSG93IHRvIHBpc3Mgb2ZmIGEga2VybmVsIHN1YnN5c3RlbSBtYWludGFpbmVyIi4KKyAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA1LzAzLzMxLz4KKyAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA1LzA3LzA4Lz4KKyAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA1LzEwLzE5Lz4KKyAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy8yMDA2LzAxLzExLz4KKworTk8hISEhIE5vIG1vcmUgaHVnZSBwYXRjaCBib21icyB0byBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIHBlb3BsZSEKKyAgPGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9bGludXgta2VybmVsJm09MTEyMTEyNzQ5OTEyOTQ0Jnc9Mj4KKworS2VybmVsIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGU6CisgIDxodHRwOi8vdXNlcnMuc29zZGcub3JnL35xaXlvbmcvbHhyL3NvdXJjZS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlPgorCitMaW51cyBUb3J2YWxkcydzIG1haWwgb24gdGhlIGNhbm9uaWNhbCBwYXRjaCBmb3JtYXQ6CisgIDxodHRwOi8vbGttbC5vcmcvbGttbC8yMDA1LzQvNy8xODM+CistLQpkaWZmIC0tZ2l0IGEvZG9jL2J1aWxkaW5nLnR4dCBiL2RvYy9idWlsZGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmNTA2OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9idWlsZGluZy50eHQKQEAgLTAsMCArMSw0MCBAQAorCQkJQnVpbGRpbmcgU3lzbGludXgKKworRnJvbSBTeXNsaW51eCA2LjAgb253YXJkcyB0aGVyZSBpcyBzdXBwb3J0IGZvciB0aHJlZSBkaWZmZXJlbnQKK2Zpcm13YXJlIGJhY2tlbmRzLCBCSU9TLCAzMi1iaXQgRUZJIGFuZCA2NC1iaXQgRUZJLiBUbyBhbGxvdyB1c2VycyB0aGUKK2ZsZXhpYmlsaXR5IHRvIGJ1aWxkIG9ubHkgdGhlIGZpcm13YXJlIHRoZXkgbmVlZCB0aGUgU3lzbGludXggbWFrZQoraW5mcmFzdHJ1Y3R1cmUgaGFzIGJlY29tZSBtb3JlIGNvbXBsZXguCisKK1RoZSBTeXNsaW51eCBtYWtlIGluZnJhc3RydWN0dXJlIHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgc3ludGF4LAorCisJbWFrZSBbZmlybXdhcmVbLGZpcndtd2FyZV1dIFt0YXJnZXRbLHRhcmdldF1dCisKK0lmIG5vIGZpcm13YXJlIGlzIHNwZWNpZmllZCB0aGVuIGFueSB0YXJnZXRzIHdpbGwgYmUgYXBwbGllZCB0byBhbGwKK3RocmVlIGZpcm13YXJlIGJhY2tlbmRzLiBJZiBubyB0YXJnZXQgaXMgc3BlY2lmaWVkIHRoZW4gdGhlICdhbGwnCit0YXJnZXQgaXMgaW1wbGljaXRseSBidWlsdC4KKworRm9yIGV4YW1wbGUsIHRvIGJ1aWxkIHRoZSBpbnN0YWxsZXJzIGZvciBCSU9TLCAzMi1iaXQgRUZJIGFuZCA2NC1iaXQKK0VGSSB0eXBlLAorCisJbWFrZSBpbnN0YWxsZXIKKworVE8gYnVpbGQgdGhlIEJJT1MgYW5kIDY0LWJpdCBFRkkgaW5zdGFsbGVycyB0eXBlLAorCisJbWFrZSBiaW9zIGVmaTY0IGluc3RhbGxlcgorCitUbyBkZWxldGUgYWxsIG9iamVjdCBmaWxlcyBhbmQgYnVpbGQgdGhlIGluc3RhbGxlciBmb3IgMzItYml0IEVGSQordHlwZSwKKworCW1ha2UgZWZpMzIgc3BvdGxlc3MgaW5zdGFsbGVyCisKKworICAgICAgKysrKyBUSEUgT0JKRUNUIERJUkVDVE9SWSArKysrCisKK0EgY3VzdG9tIHRvcC1sZXZlbCBvYmplY3QgZGlyZWN0b3J5IGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIG1ha2UKK2NvbW1hbmQtbGluZSBieSB1c2luZyB0aGUgTz0gdmFyaWFibGUsIGUuZy4KKworCW1ha2UgTz0vdG1wL3N5c2xpbnV4LW9iaiBlZmkzMgorCit3aWxsIGJ1aWxkIHRoZSAzMi1iaXQgb2JqZWN0IGZpbGVzIHVuZGVyIC90bXAvc3lzbGludXgtb2JqL2VmaTMyLiBJZgorbm8gb2JqZWN0IGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQgdGhlbiBvYmplY3QgZmlsZXMgd2lsbCBiZSB3cml0dGVuIHRvCithbiAnb2JqJyBkaXJlY3RvcnkgaW4gdGhlIHRvcC1sZXZlbCBvZiB0aGUgU3lzbGludXggc291cmNlLgpkaWZmIC0tZ2l0IGEvZG9jL2NoYWluLnR4dCBiL2RvYy9jaGFpbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmZDUwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jaGFpbi50eHQKQEAgLTAsMCArMSwzNTEgQEAKKwkJCSAgICBjaGFpbi5jMzIgZG9jdW1lbnRhdGlvbgorCitBbHRob3VnaCBzeXNsaW51eCBpcyBjYXBhYmxlIG9mICh2ZXJ5IHNpbXBsZSkgbmF0aXZlIGNoYWlubG9hZGluZyAodGhyb3VnaCAuYnNzCithbmQgLmJzIG9wdGlvbnMgLSBzZWUgZG9jL3N5c2xpbnV4LnR4dCksIGl0IGFsc28gZmVhdHVyZXMgYSB2ZXJ5IHJvYm91c3QgYW5kCityaWNoIGNvbTMyIG1vZHVsZSBkZXNpZ25lZCBmb3Igc3VjaCBwdXJwb3NlLgorCitDaGFpbiBtb2R1bGUgY2FuIHBlcmZvcm0gZmV3IGJhc2ljIHRhc2tzOgorCistIGxvYWQgYW5kIGp1bXAgdG8gYSBzZWN0b3IKKy0gbG9hZCBhbmQganVtcCB0byBhIGZpbGUgKGFsc28gbG9hZGluZyBhIHNlY3RvciBmb3Igb3RoZXIgcHVycG9zZXMpCistIHByZXBhcmUgaGFuZG92ZXIgZGF0YSB0byB1c2UgYnkgYSBmaWxlIC8gYm9vdCBzZWN0b3IKKy0gZml4IGRpZmZlcmVudCBvcHRpb25zIGluIGEgZmlsZSAvIHNlY3RvciAvIHBhcnRpdGlvbiBlbnRyaWVzCistIHBlcmZvcm0gYSAic2VydmljZS1vbmx5IiBydW4KKworSXQgY2FuIGNoYWlubG9hZCBkYXRhIGZyb20gYm90aCBHUFQgYW5kIERPUyBwYXJ0aXRpb25zLCBhcyB3ZWxsIGFzIGJvb3QgdGhlCitmaXJzdCBzZWN0b3IgZnJvbSBhIHJhdyBkaXNrLgorCitJbiBtb3JlIGRldGFpbHMsIHRoZSByb3VnaCBvdmVydmlldyBvZiBjb2RlIGlzIGFzIGZvbGxvd3M6CisKKzEuICBQYXJzZSBhcmd1bWVudHMuCisyLiAgRmluZCBkcml2ZSBhbmQvb3IgcGFydGl0aW9uIHRvIGJvb3QgZnJvbS4KKzMuICBQZXJmb3JtIHBhcnRpdGlvbi1sZXZlbCBwYXRjaGluZyAtIGZvciBleGFtcGxlIGhpZGluZywgdW5oaWRpbmcsIGZpeGluZyBjaHMgdmFsdWVzLCBldGMuCis0LiAgTG9hZCBhIGZpbGUgdG8gYm9vdCBmcm9tLgorNS4gIExvYWQgYSBzZWN0b3IgdG8gYm9vdCBmcm9tLCBpZiBpdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggIzUuCis2LiAgUHJlcGFyZSBoYW5kb3ZlciBhcmVhLCBpZiBpdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggIzUgJiAjNi4KKzcuICBQcmVwYXJlIHJlZ2lzdGVycy4KKzguICBQYXRjaCBsb2FkZWQgZmlsZSBpZiBuZWNlc3NhcnkuCis5LiAgUGF0Y2ggbG9hZGVkIHNlY3RvciBpZiBuZWNlc3NhcnkuCisxMC4gQ2hhaW5sb2FkLgorCitJbiBtb3N0IGJhc2ljIGZvcm0sIHN5c2xpbnV4IGxvYWRzIHNwZWNpZmllZCBib290IHNlY3RvciAob3IgbWJyLCBpZiBub3QKK3NwZWNpZmllZCkgYXQgMDoweDdjMDAsIHByZXBhcmVzIGhhbmRvdmVyIGFyZWEgYXMgYSBzdGFuZGFyZCBtYnIgd291bGQgZG8sIGFuZAoranVtcHMgdG8gMDoweDdjMDAuCisKK0EgInNlcnZpY2Utb25seSIgcnVuIGlzIHBvc3NpYmxlIHdoZW4gZWl0aGVyOgorCistICdicmVhaycgaXMgaW4gZWZmZWN0CisKK29yCisKKy0gJ25vZmlsZScgYW5kICdub21hcHMnIChvciAnbm9zZWN0JykgYXJlIGluIGVmZmVjdAorCitUaGlzIGlzIHVzZWZ1bCBmb3IgaW52b2NhdGlvbnMgc3VjaCBhczoKKworY2hhaW4uYzMyIGhkTiBNIHNldGJwYiBzYXZlIGJyZWFrCitjaGFpbi5jMzIgaGROIGZpeGNocyBicmVhaworY2hhaW4uYzMyIGhkTiB1bmhpZGVhbGwgYnJlYWsKKworUGxlYXNlIHNlZSByZXNwZWN0aXZlIG9wdGlvbnMgZm9yIG1vcmUgZGV0YWlscy4KKworCitNb2R1bGUgaW52b2NhdGlvbjoKKworY2hhaW4gW2RyaXZlL3BhcnRpdGlvbl0gW29wdGlvbnNdCisKK0luIGNhc2Ugb2YgcmVwZWF0ZWQgYXJndW1lbnRzLCByaWdodG1vc3Qgb25lcyB0YWtlIHByZWNlZGVuY2UuCisKKworCQkJRFJJVkUgLyBQQVJUSVRJT04gU1BFQ0lGSUNBVElPTgorCitEcml2ZSBjYW4gYmUgc3BlY2lmaWVkIGFzICdoZCMnLCAnZmQjJywgJ2Jvb3QnLCAnbWJyJywgb3IgJ2d1aWQnLgorCistICdtYnInIHdpbGwgc2VsZWN0IGEgZHJpdmUgYnkgaXRzIHNpZ25hdHVyZS4KKy0gJ2d1aWQnIHdpbGwgc2VsZWN0IGEgZHJpdmUgYnkgaXRzIGd1aWQgKEdQVCBvbmx5KS4KKy0gJ2Jvb3QnIGlzIHRoZSBkcml2ZSBzeXNsaW51eCB3YXMgYm9vdGVkIGZyb20uIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUsIGlmCisgIG5vdGhpbmcgZWxzZSBpcyBzcGVjaWZpZWQuCistICdoZCMnIGFuZCAnZmQjJyBhcmUgc3RhbmRhcmQgd2F5cyB0byBzcGVjaWZ5IGRyaXZlIG51bWJlciBhcyBzZWVuIGJ5IGJpb3MsCisgIHN0YXJ0aW5nIGZyb20gMC4KKworT3B0aW9uICdndWlkJyBpcyBzaGFyZWQgd2l0aCBwYXJ0aXRpb24gc2VsZWN0aW9uIChzZWUgYmVsb3cpLiBJZiB5b3UgaGFwcGVuCit0byBoYXZlIG5vbi11bmlxdWUgZ3VpZHMsIHRoZXkgYXJlIHNlYXJjaGVkIGluIGRpc2swLCBwYXJ0aXRpb25zIG9mIGRpc2swLAorZGlzazEgLi4uICBvcmRlci4KKworJ21icicgYW5kICdndWlkJyB0YWtlIGV4dHJhIHBhcmFtZXRlciAtIHlvdSBzaG91bGQgdXNlICc6JyBvciAnPScgYXMgYQorZGVsaW1pdGVyLgorCitQYXJ0aXRpb24gY2FuIGJlIHNwZWNpZmllZCBhcyAnIycsICdndWlkJywgJ2xhYmVsJyBvciAnZnMnLgorCistICdndWlkJyBvcHRpb24gd2lsbCBzZWxlY3QgYSBwYXJ0aXRpb24gYnkgYSBndWlkIChub3QgYSB0eXBlIGd1aWQgISkKKy0gJ2xhYmVsJyB3aWxsIHNlbGVjdCBhIHBhcnRpdGlvbiBieSBhIGxhYmVsIChzZWFyY2hpbmcgaXMgZG9uZSBpbgorICBkaXNrIG9yZGVyKQorLSAnZnMnIHdpbGwgc2VsZWN0IGEgcGFydGl0aW9uIGZyb20gd2hpY2ggc3lzbGludXggd2FzIGV4ZWN1dGVkCistICcjJyBpcyB0aGUgc3RhbmRhcmQgbWV0aG9kLiBQYXJ0aXRpb25zIDEtNCBhcmUgcHJpbWFyeSwgNSsgbG9naWNhbCwgMCA9IGJvb3QKKyAgTUJSIChkZWZhdWx0KS4KKworSWYgeW91IHVzZSBhIG51bWJlciB0byBzZWxlY3QgYSBwYXJ0aXRpb24gaXQgc2hvdWxkIGJlIHNwZWNpZmllZCBhZnRlciBhIGRyaXZlCit1c2luZyBzcGFjZSBvciBjb21tYSBhcyBkZWxpbWl0ZXJzIChhZnRlciAnaGQjJywgJ2ZkIycsICdtYnInLCAnZ3VpZCcgb3IgJ2Jvb3QnKS4KKworCisJCQkJICAgIE9QVElPTlMKKwlmaWxlPTxmaWxlPgorICAgICAgICpub2ZpbGUKKworSXQncyBvZnRlbiBjb252ZW5pZW50IHRvIGxvYWQgYSBmaWxlIGRpcmVjdGx5IGFuZCB0cmFuc2ZlciBjb250cm9sIHRvIGl0LAoraW5zdGVhZCBvZiB0aGUgc2VjdG9yIGZyb20gdGhlIGRpc2suIE5vdGUsIHRoYXQgdGhlIDxmaWxlPiBtdXN0IHJlc2lkZSBvbgorc3lzbGludXggcGFydGl0aW9uLgorCitJZiB5b3UgY2hvb3NlIHRoaXMgb3B0aW9uIHdpdGhvdXQgc3BlY2lmeWluZyBhbnkgYWRkcmVzc2VzIGV4cGxpY2l0bHkgKHNlZQorb3B0aW9ucyAnc2VjdD0nIGFuZCAnc2VnPScpLCB0aGUgZmlsZSB3aWxsIGNhdXNlIHNlY3RvciB0byBub3QgYmUgbG9hZGVkIGF0IGFsbAorKGFzIHRoZWlyIG1lbW9yeSBwbGFjZW1lbnQgd291bGQgb3ZlcmxhcCkuCisKKwlzZWc9PHNlZ21lbnQ+OjxvZmZzZXQ+OjxpcD4KKwkqc2VnPTA6MHg3YzAwOjB4N2MwMAorCitUaGlzIHRyaXBsZXQgbGV0cyB5b3UgYWx0ZXIgdGhlIGFkZHJlc3NlcyBhIGZpbGUgd2lsbCB1c2UuIEl0J3MgbG9hZGVkIGF0Cis8c2VnbWVudDpvZmZzZXQ+LCB0aGUgZW50cnkgcG9pbnQgaXMgYXQgPHNlZ21lbnQ6aXA+LiBXaGVuIHlvdSBjaGFpbmxvYWQgc29tZQorb3RoZXIgYm9vdGxvYWRlciBvciBrZXJuZWwsIGl0J3MgYWxtb3N0IGFsd2F5cyBtYW5kYXRvcnkuCisKK1RoZSBkZWZhdWx0cywgaWYgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIGFyZSAwOjB4N2MwMDoweDdjMDAKK0lmIGFueSBvZiB0aGUgZmllbGRzIGFyZSBvbWl0dGVkIChlLmcuIDB4MjAwMDo6KSwgdGhleSBkZWZhdWx0IHRvIDAuCisKKwlzZWN0PTxzZWdtZW50Pjo8b2Zmc2V0Pjo8aXA+CisJKnNlY3Q9MDoweDdjMDA6MHg3YzAwCisJbm9zZWN0CisJbm9zZWN0IHNldHM6IG5vbWFwcworCitUaGlzIHRyaXBsZXQgbGV0cyB5b3UgYWx0ZXIgdGhlIGFkZHJlc3NlcyBhIHNlY3RvciB3aWxsIHVzZS4gSXQncyBsb2FkZWQgYXQKKzxzZWdtZW50Om9mZnNldD4sIHRoZSBlbnRyeSBwb2ludCBpcyBhdCA8c2VnbWVudDppcD4uIFRoaXMgb3B0aW9uIGlzIG1vc3RseQordXNlZCBpbiB0YW5kZW0gd2l0aCAnZmlsZT0nIGFuZCAnc2VnPScgb3B0aW9ucywgYXMgc29tZSBsb2FkZXJzL2tlcm5lbHMgd2lsbAorZXhwZWN0IHJlbG9jYXRlZCBzZWN0b3IgYXQgc29tZSBwYXJ0aWN1bGFyIGFkZHJlc3MgKGUuZy4gRFJLTSkuCisKKydub3NlY3QnIHdpbGwgY2F1c2Ugc2VjdG9yIHRvIG5vdCBiZSBsb2FkZWQgYXQgYWxsLiBJbiBwbGVudHkgY2FzZXMsIHdoZW4gYSBmaWxlCitpcyBiZWluZyBjaGFpbmxvYWRlZCwgc2VjdG9yIGlzIG5vdCBuZWNlc3NhcnkuCisKK1RoZSBkZWZhdWx0cyBpZiBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgYXJlIDA6MHg3YzAwOjB4N2MwMC4KK0lmIHNvbWUgb2YgdGhlIGZpZWxkcyBhcmUgb21pdHRlZCAoZS5nLiAweDIwMDA6OiksIHRoZXkgZGVmYXVsdCB0byAwLgorCisJKm1hcHMKKwlub21hcHMKKworSW4gc29tZSBjYXNlcywgaXQncyB1c2VmdWwgdG8gZml4IEJQQiB2YWx1ZXMgaW4gTlRGUy9GQVR4eCBib290c2VjdG9ycyBhbmQKK2V2bnR1YWxseSB3cml0ZSB0aGVtIGJhY2ssIGJ1dCBvdGhlcndpc2UgYm9vdCBzZWN0b3IgaXRzZWxmIGlzIG5vdCBuZWNlc3NhcnkgdG8KK2NvbnRpbnVlIGJvb3RpbmcuICdub21hcHMnIGFsbG93cyB0aGF0IC0gYSBzZWN0b3Igd2lsbCBiZSBsb2FkZWQsIGJ1dCB3b24ndCBiZQorbW1hcHBlZCBpbnRvIHJlYWwgbWVtb3J5LiBBbnkgb3ZlcmxhcCB0ZXN0cyAodnMuIGhhbmRvdmVyIG9yIGZpbGUgYXJlYXMpIGFyZQorbm90IHBlcmZvcm1lZCwgYmVpbmcgbWVhbmluZ2xlc3MgaW4gc3VjaCBjYXNlLgorCisJc2V0YnBiCisJKm5vc2V0YnBiCisKK01pY3Jvc29mdCBzaWRlIG9mIHRoZSB3b3JsZCBpcyBwYXJpdGN1bGFyeSBzZW5zaXRpdmUgdG8gY2VydGFpbiBCUEIgdmFsdWVzLgorRGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0gYW5kIGNoYWlubG9hZGluZyBtZXRob2QgKHNlY3RvciBvciBmaWxlKSwgc29tZSBvciBhbGwKK29mIHRob3NlIGZpZWxkcyBtdXN0IG1hdGNoIHJlYWxpdHkgLSBhbmQgYWZ0ZXIgZS5nLiBkcml2ZSBjbG9ubmluZyBvcgord2hlbiB1c2luZyB1c2Igc3RpY2sgaW4gZGlmZmVyZW50IGNvbXB1dGVycyAtIHRoYXQgaXMgb2Z0ZW4gbm90IHRoZSBjYXNlLgorCitUaGUgInJlYWxpdHkiIG1lYW5zOgorCisiaGlkZGVuIHNlY3RvcnMiIC0gdmFsaWQgb2Zmc2V0IG9mIHRoZSBwYXJ0aXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkaXNrCisiZ2VvbWV0cnkiIC0gdmFsaWQgZGlzayBnZW9tZXRyeSBhcyByZXBvcnRlZCBieSBCSU9TCisiZHJpdmUiIC0gdmFsaWQgZHJpdmUgbnVtYmVyCisKK1RoaXMgb3B0aW9uIHdpbGwgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgQlBCIGFuZCBmaXggd2hhdCBpcyBwb3NzaWJsZQordG8gZml4LCByZWxhdGl2ZWx5IHRvIGRldGVjdGVkIEJQQi4gSWYgaXQncyBpbXBvc3NpYmxlIHRvIGRldGVjdCBCUEIsIGZ1bmN0aW9uCit3aWxsIGRvIG5vdGhpbmcuCisKKwlmaWxlYnBiCisJKm5vZmlsZWJwYgorCitDaGFpbmxvYWRlZCBmaWxlIGNhbiBzaW1wbHkgYmUgYW4gaW1hZ2Ugb2YgYSBzZWN0b3IuIEluIHN1Y2ggY2FzZSwgaXQgY291bGQgYmUKK3VzZWZ1bCB0byBhbHNvIGZpeCBpdHMgQlBCIHZhbHVlcy4KKworCXNhdmUKKwkqbm9zYXZlCisJc2F2ZSBzZXRzOiBzdHJpY3Q9MgorCitGaXhpbmcgQlBCIHZhbHVlcyBvbmx5IGluIG1lbW9yeSBtaWdodCBub3QgYmUgZW5vdWdoLiBUaGlzIG9wdGlvbiBhbGxvd3MKK3dyaXRpbmcgb2YgdGhlIGNvcnJlY3RlZCBzZWN0b3IuIFlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gdXNlIHRoaXMgb3B0aW9uCit0b2dldGhlciB3aXRoICdzZXRicGInLgorCistIHRoaXMgb3B0aW9uIG5ldmVyIGFwcGxpZXMgdG8gYSBsb2FkZWQgZmlsZQorLSBjaGFpbiBtb2R1bGUgd2lsbCBub3Qgc2F2ZSBhbnl0aGluZyB0byBkaXNrIGJ5IGRlZmF1bHQgKGJlc2lkZXMgb3B0aW9ucyBzdWNoCisgIGFzIGhpZGUgb3IgZml4Y2hzIC0gc28gb3B0aW9ucyByZWxhdGVkIGRpcmVjdGx5IHRvIHBhcnRpdGlvbiBlbnRyaWVzKQorLSB3cml0aW5nIGlzIG9ubHkgcGVyZm9ybWVkLCBpZiB0aGUgdmFsdWVzIGFjdHVhbGx5IGNoYW5nZWQKKworCSpoYW5kCisJbm9oYW5kCisKK0J5IGRlZmF1bHQsIGEgaGFuZG92ZXIgYXJlYSBpcyBhbHdheXMgcHJlcGFyZWQgaWYgcG9zc2libGUgLSBtZWFuaW5nIGl0IGRvZXNuJ3QKK292ZXJsYXAgd2l0aCBvdGhlciBhcmVhcy4gSXQncyBvZnRlbiBub3QgbmVjZXNzYXJ5IHRob3VnaCAtIHVzdWFsbHksIGEKK2NoYWlubG9hZGVkIGZpbGUgb3Iga2VybmVsIGRvbid0IGNhcmUgYWJvdXQgaXQgYW55bW9yZSwgc28gYSB1c2VyIGNhbiBkaXNhYmxlCitpdCBleHBsaWNpdGx5IHdpdGggdGhpcyBvcHRpb24uCisKKwlocHRyCisJKm5vaHB0cgorCitJbiBjYXNlIHdoZW4gYm90aCBmaWxlIGFuZCBzZWN0b3IgYXJlIGxvYWRlZCwgZHM6c2kgYW5kIGRzOmJwIHdpbGwgcG9pbnQgdG8KK3NlY3RvciBhZGRyZXNzIGJlZm9yZSB0aGUgY2hhaW5sb2FkaW5nLiBUaGlzIG9wdGlvbiBsZXRzIHVzZXIgZm9yY2UgdGhvc2UKK3JlZ2lzdGVycyB0byBwb2ludCB0byBoYW5kb3ZlciBhcmVhLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJvdGggdGhlIGZpbGUgYW5kIHRoZQorc2VjdG9yIGFyZSBhY3R1YWxseSBhIHNlY3RvcidzIGltYWdlIGFuZCB0aGUgc2VjdG9yIGlzIG1tYXBwZWQuCisKKwlzd2FwCisJKm5vc3dhcAorCitUaGlzIG9wdGlvbiB3aWxsIGluc3RhbGwgYSB0aW55IHN0dWIgY29kZSB1c2VkIHRvIHN3YXAgZHJpdmUgbnVtYmVycywgaWYgdGhlCitkcml2ZSB3ZSB1c2UgZHVyaW5nIGNoYWlubG9hZGluZyBpcyBub3QgZmQwIG9yIGhkMC4KKworCWhpZGVbYWxsXQorCXVuaGlkZVthbGxdCisJKm5vaGlkZQorCVt1bl1oaWRlW2FsbF0gc2V0czogc3RyaWN0PTIKKworSW4gY2VydGFpbiBzaXR1YXRpb25zIGl0J3MgdXNlZnVsIHRvIGhpZGUgcGFydGl0aW9ucyAtIGZvciBleGFtcGxlIHRvIG1ha2Ugc3VyZQorRE9TIGdldHMgQzouICdoaWRlJyB3aWxsIGhpZGUgaGlkYWJsZSBwcmltYXJ5IHBhcnRpdGlvbnMsIGV4Y2VwdCB0aGUgb25lIHdlJ3JlCitib290aW5nIGZyb20uIFNpbWlsYXJ5LCAnaGlkZWFsbCcgd2lsbCBoaWRlIGFsbCBoaWRhYmxlIHBhcnRpdGlvbnMsIGV4Y2VwdCB0aGUKK29uZSB3ZSdyZSBib290aW5nIGZyb20uIEhpZGluZyBpcyBwZXJmb3JtZWQgb25seSBvbiB0aGUgc2VsZWN0ZWQgZHJpdmUuIE9wdGlvbnMKK3N0YXJ0aW5nIHdpdGggJ3VuJyB3aWxsIHNpbXBseSB1bmhpZGUgZXZlcnkgcGFydGl0aW9uIChwcmltYXJ5IG9uZXMgb3IgYWxsKS4KK1dyaXRpbmcgaXMgb25seSBwZXJmb3JtZWQsIGlmIHRoZSBvcyB0eXBlIHZhbHVlcyBhY3R1YWxseSBjaGFuZ2VkLgorCisJZml4Y2hzCisJKm5vZml4Y2hzCisJZml4Y2hzIHNldHM6IHN0cmljdD0yCisKK0lmIHlvdSB3YW50IHRvIG1ha2UgYSBkcml2ZSB5b3UncmUgYm9vdGluZyBmcm9tIHRvdGFsbHkgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQKK0JJT1MsIHlvdSBjYW4gdXNlIHRoaXMgdG8gZml4IGFsbCBwYXJ0aXRpb25zJyBDSFMgbnVtYmVycy4gR29vZCB0byBzaWxlbmNlIGUuZy4KK0ZyZWVET1MgY29tcGxhaW5pZyBhYm91dCAnbG9naWNhbCBDSFMgZGlmZmVycyBmcm9tIHBoeXNpY2FsJyBvZiBzZmRpc2sgYWJvdXQKKydmb3VuZCAoLi4uKSBleHBlY3RlZCAoLi4uKS4gIEZ1bmN0aW9uYWxseSBzZWVtcyB0byBiZSBtb3N0bHkgY29zbWV0aWMsIGFzCitNaWNyb3NvZnQgd29ybGQgLSBpbiBjYXNlcyBpdCBjYXJlcyBhYm91dCBnZW9tZXRyeSAtIGdlbmVyYWxseSBzdGlja3MgdG8gdmFsdWVzCit3cml0dGVuIGluIGJvb3RzZWN0b3JzLiBBbmQgdGhlIHJlc3Qgb2YgdGhlIHdvcmxkIGdlbmVyYWxseSBkb2Vzbid0IGNhcmUgYWJvdXQKK3RoZW0gYXQgYWxsLiBXcml0aW5nIGlzIG9ubHkgcGVyZm9ybWVkLCBpZiB0aGUgdmFsdWVzIGFjdHVhbGx5IGdvdCBjaGFuZ2VkLgorCisJa2VlcGV4ZQorCSpub2tlZXBleGUKKworSWYgeW91J3JlIGJvb3Rpbmcgb3ZlciBhIG5ldHdvcmsgdXNpbmcgcHhlbGludXggLSB0aGlzIGxldHMgeW91IGtlZXAgVU5ESQorc3RhY2tzIGluIG1lbW9yeSAocHhlbGludXggb25seSkuCisKKwl3YXJuCisJKm5vd2FybgorCitUaGlzIG9wdGlvbiB3aWxsIHdhaXQgZm9yIGEga2V5cHJlc3MgcmlnaHQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlIGNoYWlubG9hZGluZy4KK1VzZWZ1bCB0byBzZWUgd2FybmluZ3MgZW1pdGVkIGJ5IHRoZSBjaGFpbiBtb2R1bGUuCisKKwlwcmVmbWJyCisJKm5vcHJlZm1icgorCitJbiB0aGUgY2FzZSBvZiBwcmVzZW5jZSBvZiBub24tc3RhbmRhcmQgaHlicmlkIE1CUi9HUFQgbGF5b3V0LCB0aGlzIGZsYWcgbWFrZXMKK2NoYWluIG1vZHVsZSBwcmVmZXIgTUJSIGxheW91dCBvdmVyIEdQVC4KKworCXN0cmljdFs9PDB8MXwyPl0KKwkqc3RyaWN0PTEKKwlyZWxheAorCitUaG9zZSBvcHRpb25zIGNvbnRyb2wgdGhlIGxldmVsIG9mIHNhbml0eSBjaGVja3MgdXNlZCBkdXJpbmcgdGhlIHRyYXZlcnNhbCBvZgorcGFydGl0aW9uIHRhYmxlKHMpLiBUaGlzIGlzIHVzZWZ1bCBpbiBidWdneSBjb3JuZXIgY2FzZXMsIHdoZW4gdGhlIGRpc2sgc2l6ZSBpcworcmVwb3J0ZWQgZGlmZmVyZW50bHkgYWNyb3NzIGRpZmZlcmVudCBjb21wdXRlcnMgb3IgdmlydHVhbCBtYWNoaW5lcyAoaWYgaXQKK2hhcHBlbnMgYXQgYWxsLCB0aGUgc2l6ZSB1c3VhbGx5IGRpZmZlcnMgYnkgMSBzZWN0b3IpLiBOb3JtYWxseSB0aGUgcGFydGl0aW9uCitpdGVyYXRvciB3b3VsZCByZXBvcnQgYW4gZXJyb3IgYW5kIGFib3J0IGluIHN1Y2ggY2FzZS4gQW5vdGhlciBjYXNlIHNjZW5hcmlvIGlzCitkaXNrIGNvcnJ1cHRpb24gaW4gc29tZSBsYXRlciBFTUJSIHBhcnRpdGlvbi4KKworLSBzdHJpY3Q9MCBpbmhpYml0cyBhbnkgY2hlY2tzCistIHN0cmljdD0xIGVuYWJsZXMgY2hlY2tzLCBidXQgaWdub3JlcyB0aG9zZSB0aGF0IGludm9sdmUgZGlzayBzaXplCistIHN0cmljdD0yIGVuYWJsZXMgYWxsIGNoZWNrcworLSByZWxheCBhbmQgbm9zdHJpY3QgYXJlIGVxdWl2YWxlbnQgdG8gc3RyaWN0PTAKKy0gbm9yZWxheCBhbmQgc3RyaWN0IGFyZSBlcXVpdmFsZW50IHRvIHN0cmljdD0yCisKKworCWJyZWFrCisJKm5vYnJlYWsKKwlicmVhayBzZXRzOiBub2ZpbGUgbm9tYXBzIG5vaGFuZAorCitJdCBpcyBwb3NzaWJsZSB0byB0cmlnZ2VyIGEgInNlcnZpY2Utb25seSIgcnVuIC0gVGhlIGNoYWluIG1vZHVsZSB3aWxsIGRvCitldmVyeXRoaW5nIHJlcXVlc3RlZCBhcyB1c3VhbCwgYnV0IGl0IHdpbGwgbm90IHBlcmZvcm0gdGhlIGFjdHVhbCBjaGFpbmxvYWRpbmcuCisnYnJlYWsnIG9wdGlvbiBkaXNhYmxlcyBoYW5kb3ZlciwgZmlsZSBsb2FkaW5nIGFuZCBzZWN0b3IgbWFwcGluZywgYXMgdGhlc2UKK2FyZSBwb2ludGxlc3MgaW4gc3VjaCBzY2VuYXJpbyAoYWx0aG91Z2ggZmlsZSBtaWdodCBiZSByZWVuYWJsZWQgaW4gc29tZSBmdXR1cmUKK3ZlcnNpb24sIGlmIHdyaXRpbmcgdG8gYWN0dWFsIGZpbGVzIGJlY29tZXMgcG9zc2libGUpLiBNYWlubHkgdXNlZnVsIGZvcgorb3B0aW9ucyAnZml4Y2hzJywgJ1t1bl1oaWRlW2FsbF0nIGFuZCBzZXRicGIuCisKKwlpc29saW51eD08ZmlsZT4KKwlzZXRzOiBmaWxlPTxmaWxlPiBub2hhbmQgbm9zZWN0IGlzb2xpbnV4CisKK0NoYWlubG9hZCBhbm90aGVyIHZlcnNpb24vYnVpbGQgb2YgdGhlIElTT0xJTlVYIGJvb3Rsb2FkZXIgYW5kIHBhdGNoIHRoZSBsb2FkZXIKK3dpdGggYXBwcm9wcmlhdGUgcGFyYW1ldGVycyBpbiBtZW1vcnkuIFRoaXMgYXZvaWRzIHRoZSBuZWVkIGZvciB0aGUKKy1lbHRvcml0by1hbHQtYm9vdCBwYXJhbWV0ZXIgb2YgbWtpc29mcywgd2hlbiB5b3Ugd2FudCBtb3JlIHRoYW4gb25lIElTT0xJTlVYCitwZXIgQ0QvRFZELgorCisJbnRsZHI9PGZpbGU+CisJc2V0czogZmlsZT08ZmlsZT4gc2VnPTB4MjAwMCBzZXRicGIgbm9oYW5kCisKK1ByZXBhcmVzIHRvIGxvYWQgbnRsZHIgZGlyZWN0bHkuIFlvdSBtaWdodCB3YW50IHRvIGFkZCAnc2F2ZScgb3B0aW9uIHRvIHN0b3JlCitjb3JyZWN0ZWQgQlBCIHZhbHVlcy4KKworCWNtbGRyPTxmaWxlPgorCXNldHM6IGZpbGU9PGZpbGU+IHNlZz0weDIwMDAgc2V0YnBiIG5vaGFuZCBjbWxkcgorCitQcmVwYXJlcyB0byBsb2FkIHJlY292ZXJ5IGNvbnNvbGUgZGlyZWN0bHkuIEluLW1lbW9yeSBjb3B5IG9mIGJvb3RzZWN0b3IgaXMKK3BhdGNoZWQgd2l0aCAiY21kY29uc1wwIi4gUmVtYXJrcyB0aGUgc2FtZSBhcyBpbiAnbnRsZHI9Jy4KKworCXJlYWN0b3M9PGZpbGU+CisJc2V0czogZmlsZT08ZmlsZT4gc2VnPTA6MHg4MDAwOjB4ODEwMCBzZXRicGIgbm9oYW5kCisKK1ByZXBhcmVzIHRvIGxvYWQgUmVhY3RPUydzIGZyZWVsZHIgZGlyZWN0bHkuIFlvdSBtaWdodCB3YW50IHRvIGFkZCAnc2F2ZScKK29wdGlvbiB0byBzdG9yZSBjb3JyZWN0ZWQgQlBCIHZhbHVlcy4KKworCWZyZWVkb3M9PGZpbGU+CisJc2V0czogZmlsZT08ZmlsZT4gc2VnPTB4NjAgc2VjdD0weDFGRTAgc2V0YnBiIG5vaGFuZAorCitQcmVwYXJlcyB0byBsb2FkIGZyZWVkb3Mga2VybmVsIGRpcmVjdGx5LiBZb3Ugd2lsbCBsaWtlbHkgd2FudCB0byBhZGQgJ3NhdmUnCitvcHRpb24sIGFzIHRob3NlIGtlcm5lbHMgc2VlbSB0byByZXF1aXJlIHByb3BlciBnZW9tZXRyeSB3cml0dGVuIGJhY2sgdG8gZGlzay4KK1NlY3RvciBhZGRyZXNzIGlzIGNob3NlbiBiYXNlZCBvbiB3aGVyZSBmcmVlZG9zJyBib290c2VjdG9ycyByZWxvY2F0ZSB0aGVtc2VsdmVzLAorYWx0aG91Z2ggaXQgc2VlbXMgdGhlIGtlcm5lbCBkb2Vzbid0IHJlbHkgb24gaXQuCisKK1lvdSBtaWdodCBhbHNvIHdhbnQgdG8gZW1wbG95ICdoaWRlJyBvcHRpb24sIGlmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggcHJvcGVybHkKK2Fzc2lnbmVkIEM6IGRyaXZlLgorCisJcGNkb3M9PGZpbGU+CisJbXNkb3M9PGZpbGU+CisJc2V0czogZmlsZT08ZmlsZT4gc2VnPTB4NzAgc2VjdD0weDgwMDAgc2V0YnBiIG5vaGFuZAorCitTaW1pbGFyeSB0byAnZnJlZWRvcz0nLCBUaGlzIHByZXBhcmVzIHRvIGxvYWQgTVNET1MgMi4wMCAtIDYueHggb3IgZGVyaXZhdGl2ZXMuCitTZWN0b3IgYWRkcmVzcyBpcyBjaG9zZW4gYXJiaXRyYXJpbHkuIE90aGVyd2lzZSBjb21tZW50cyBhcyBhYm92ZS4KKworCW1zZG9zNz08ZmlsZT4KKwlzZXRzOiBmaWxlPTxmaWxlPiBzZWc9MHg3MDo6MHgyMDAgc2VjdD0weDgwMDAgc2V0YnBiIG5vaGFuZAorCitPbmx5IGZvciBNU0RPUyA3KyB2ZXJzaW9ucyAoOThzZSB+IDcueHgsIE1lIH4gOC54eCkuIENvbW1lbnRzIGFzIGFib3ZlLgorVE9ETy9URVNUCisKKwlkcm1rPTxmaWxlPgorCXNldHM6IGZpbGU9PGZpbGU+IHNlZz0weDcwIHNlY3Q9MHgyMDAwOjA6MCBzZXRicGIgbm9oYW5kCisKK1RoaXMgaXMgdXNlZCBmb3IgbG9hZGluZyBvZiAqb25seSogRGVsbCdzIERPUyBkZXJpdmF0aXZlcy4gSXQgZG9lcyByZXF1aXJlIGJvb3QKK3NlY3RvciBhdCAweDIwMDAgYW5kIG92ZXJhbGwgdmFsaWQgQlBCIHZhbHVlcy4gQXMgaW4gb3RoZXIgRE9TLWlzaCBjYXNlcywKK2xpa2VseSBjYW5kaWRhdGVzIGZvciB1c2UgYXJlICdzYXZlJyBhbmQgJ2hpZGUnLgorCisJZ3J1Yj08ZmlsZT4gW2dydWJjZmc9PGNvbmZpZz5dCisJc2V0czogZmlsZT08ZmlsZT4gc2VnPTB4ODAwOjoweDIwMCBub2hhbmQgbm9zZWN0IGdydWIKKworQ2hhaW5sb2FkcyBncnViIGxlZ2FjeSdzIHN0YWdlMiwgcGVyZm9ybWluZyBhZGRpdGlvbmFsIGNvcnJlY3Rpb25zIG9uIHRoZSBmaWxlCitpbiBtZW1vcnkuIEFkZGl0aW9uYWxseSwgYWx0ZXJuYXRlIGNvbmZpZyBmaWxlIGNhbiBiZSBzcGVjaWZpZWQgdGhyb3VnaAorJ2dydWJjZmc9JyBvcHRpb24KKworCWdybGRyPTxmaWxlPgorCXNldHM6IGZpbGU9PGZpbGU+IG5vaGFuZCBub3NlY3QgZ3JsZHIKKworQ2hhaW5sb2FkcyBHUlVCNERPUyBncmxkciwgcGVyZm9ybWluZyBhZGRpdGlvbmFsIGNvcnJlY3Rpb25zIG9uIHRoZSBmaWxlCitpbiBtZW1vcnkuCisKKwlic3M9PGZpbGU+CisJc2V0czogZmlsZT08ZmlsZT4gbm9tYXBzIHNldGJwYiBic3MKKworVGhpcyBlbXVsYXRlcyBzeXNsaW51eCdzIG5hdGl2ZSBCU1Mgb3B0aW9uLiBUaGlzIGxvYWRzIGJvdGggdGhlIGZpbGUgYW5kIHRoZQorc2VjdG9yLCBhZGp1c3RzIEJQQiB2YWx1ZXMgaW4gdGhlIGxvYWRlZCBzZWN0b3IsIHRoZW4gY29waWVzIGFsbCBwb3NzaWJsZSBCUEIKK2ZpZWxkcyB0byB0aGUgbG9hZGVkIGZpbGUuIEV2ZXJ5dGhpbmcgaXMgbWFkZSB3aXRoIHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0ZWQKK2Rpc2svcGFydGl0aW9uLgorCisJYnM9PGZpbGU+CisJc2V0czogZmlsZT08ZmlsZT4gbm9zZWN0IGZpbGVicGIKKworVGhpcyBlbXVsYXRlcyBzeXNsaW51eCdzIG5hdGl2ZSBCUyBvcHRpb24uIFRoaXMgbG9hZHMgdGhlIGZpbGUgYW5kIGlmIHBvc3NpYmxlCistIGFkanVzdHMgaXRzIEJQQiB2YWx1ZXMuIEV2ZXJ5dGhpbmcgaXMgbWFkZSB3aXRoIHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0ZWQKK2Rpc2svcGFydGl0aW9uLgorCmRpZmYgLS1naXQgYS9kb2MvY3B0aW1lLnR4dCBiL2RvYy9jcHRpbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MmRiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY3B0aW1lLnR4dApAQCAtMCwwICsxLDUwIEBACis9IGNwdGltZS5jMzIoMSkgPQorOmRvY3R5cGU6IG1hbnBhZ2UKKzphdXRob3I6ICBHZW5lIEN1bW0KKzplbWFpbDogICBnZW5lLmN1bW1AZ21haWwuY29tCis6cmV2ZGF0ZTogMjAxMS0xMi0xNworCisKKz09IE5BTUUgPT0KK2NwdGltZS5jMzIgLSB0aW1lcyB0aGUgY29weSBvZmYgKHJlYWQpIG9mIGEgZmlsZQorCisKKz09IFNZTk9QU0lTID09CisqY3B0aW1lLmMzMiogWydPUFRJT05TJ10gJ0ZJTEUnLi4uCisKKworPT0gREVTQ1JJUFRJT04gPT0KK1RpbWVzIHRoZSBjb3B5IG9mZiAocmVhZCkgb2YgYSBmaWxlLCBvcHRpb25hbGx5IGNvbXB1dGVzL2Rpc3BsYXlzCit0cmFuc2ZlciByYXRlcyhvbiBieSBkZWZhdWx0KSB3aXRoIGFuIGFkanVzdGFibGUgdHJhbnNmZXIgc2l6ZSBhbmQKK21heGltdW0gdHJhbnNmZXIgbGVuZ3RoLgorCisKKz09IE9QVElPTlMgPT0KKyotYiogJ1NJWkUnOjoKKyAgICB1c2UgJ1NJWkUnIGZvciB0cmFuc2ZlciBzaXplOyBkZWZhdWx0cyB0byAyMDQ4IGZvciBDT00zMgorCisqLWwqOjoKKyAgICBsb25nIG91dHB1dCBtb2RlOyBkZWZhdWx0OyByZXZlcnNlcyAqLXMqCisKKyotbiogJ0xFTic6OgorICAgIG1heGltdW0gbGVuZ3RoIHRvIGZldGNoOyBkZWZhdWx0cyB0byB3aG9sZSBmaWxlCisKKyotcSo6OgorICAgIHF1aWV0IChub3JtYWwvbm9uLXZlcmJvc2UpIG1vZGU7IGRlZmF1bHQ7IHJldmVyc2VzICotdioKKworKi1zKjo6CisgICAgc2ltcGxlIG91dHB1dCBtb2RlCisKKyotdio6OgorICAgIHZlcmJvc2UgbW9kZQorCitUaGUgc2FtZSBtb2RlIGlzIHVzZWQgZm9yIGFsbCBmaWxlcy4KKworCis9PSBBVVRIT1IgPT0KK3thdXRob3J9IDx7ZW1haWx9PgorCis9PSBDT1BZUklHSFQgPT0KK0NvcHlyaWdodCBcKEMpIDIwMTEge2F1dGhvcn0uIEZyZWUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKS4KKwpkaWZmIC0tZ2l0IGEvZG9jL2Rpc3RyaWIudHh0IGIvZG9jL2Rpc3RyaWIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTBhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGlzdHJpYi50eHQKQEAgLTAsMCArMSwyOSBAQAorRm9yIGNyZWF0b3JzIG9mIExpbnV4IGRpc3RyaWJ1dGlvbnM6CisKK1N5c2xpbnV4IGlzIGEgbm90b3Jpb3VzbHkgaGFyZCBwcm9ncmFtIHRvIGRlYnVnLCBzaW5jZSBpdCBydW5zIG91dHNpZGUKK29mIGFueSBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaGFzIGEgdGVuZGVuY3kgdG8gZXhwb3NlIEJJT1MgYW5kCitoYXJkd2FyZSBidWdzIG9uIHZhcmlvdXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgSSB3b3VsZCBhcHByZWNpYXRlIGlmCit5b3Ugd291bGQgcmVzaXN0IHRoZSB0ZW1wdGF0aW9uIG9mIHJlY29tcGlsaW5nIHRoZSBTeXNsaW51eCBib290bG9hZGVyCitpdHNlbGYgKGxkbGludXguYXNtKSBpZiBhdCBhbGwgcG9zc2libGUuICBJZiB5b3UgZG8gdGhhdCwgSSB3aWxsIGhhdmUKK3RvIHJlZmVyIGFueSBidWcgcmVwb3J0cyBJIHJlY2VpdmUgYmFjayB0byB0aGUgcmVzcGVjdGl2ZSBkaXN0cmlidXRvci4KKworSG93ZXZlciwgSSBoYXZlIG5vIHN1Y2ggY29uY2VybnMgYWJvdXQgcmVjb21waWxpbmcgdGhlIGluc3RhbGxlcgorcHJvZ3JhbXMsIGFuZCBpbiBmYWN0LCB3aXRoIGJvdGggbGliYyA1IGFuZCBsaWJjIDYgaW4gY29tbW9uIHVzZSBpbgordGhlIExpbnV4IHdvcmxkIHRvZGF5IEkgdW5kZXJzdGFuZCBpZiB5b3Ugd2lzaCB0byByZWxpbmsgdGhlCitMaW51eC1iYXNlZCBpbnN0YWxsZXIgYWdhaW5zdCB5b3VyIHN5c3RlbSB2ZXJzaW9uIG9mIGxpYmMuICBUaGVyZWZvcmUKK2Egc3BlY2lhbCBtYWtlZmlsZSB0YXJnZXRzICJtYWtlIGluc3RhbGxlciIgaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGUKK1N5c2xpbnV4IGRpc3RyaWJ1dGlvbiwgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNDIuCisKK1RvIHJlYnVpbGQgdGhlIGluc3RhbGxlciBwcm9ncmFtcyAqb25seSosIHN0YXJ0aW5nIGZyb20gYSBmcmVzaGx5Cit1bnRhcnJlZCBkaXN0cmlidXRpb24gY29weSBvZiBTeXNsaW51eCwgZG86CisKKwltYWtlIGNsZWFuCisJbWFrZSBpbnN0YWxsZXIKKworSWYgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBpbnRlcm1lZGlhdGUgZmlsZXMsIGluY2x1ZGluZyB0aGUgb25lcworb2J0YWluZWQgZnJvbSBhc3NlbWJsaW5nIGxkbGludXguYXNtIGFuZCB3aGljaCBhcmUgaW5jbHVkZWQgaW4gdGhlCitkaXN0cmlidXRpb24sIGRvICJtYWtlIHNwb3RsZXNzIi4KKworSSBhcHByZWNpYXRlIHlvdXIgYXNzaXN0YW5jZSBpbiB0aGlzIG1hdHRlci4KKworCUguIFBldGVyIEFudmluCmRpZmYgLS1naXQgYS9kb2MvZXh0bGludXgudHh0IGIvZG9jL2V4dGxpbnV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGNiYjVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4dGxpbnV4LnR4dApAQCAtMCwwICsxLDEzNCBAQAorRVhUTElOVVggaXMgYSBuZXcgU3lzbGludXggZGVyaXZhdGl2ZSwgd2hpY2ggYm9vdHMgZnJvbSBhIExpbnV4CitleHQyL2V4dDMgZmlsZXN5c3RlbS4KKworSXQgd29ya3MgdGhlIHNhbWUgd2F5IGFzIFNZU0xJTlVYIChzZWUgZG9jL3N5c2xpbnV4LnR4dCksIHdpdGggYSBmZXcKK3NsaWdodCBtb2RpZmljYXRpb25zLgorCisxLiBUaGUgaW5zdGFsbGVyIGlzIHJ1biBvbiBhICptb3VudGVkKiBmaWxlc3lzdGVtLiAgUnVuIHRoZSBleHRsaW51eAorICAgaW5zdGFsbGVyIG9uIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggeW91IHdhbnQgZXh0bGludXggaW5zdGFsbGVkOgorCisJZXh0bGludXggLS1pbnN0YWxsIC9ib290CisKKyAgIFNwZWNpZnkgLS1pbnN0YWxsICgtaSkgdG8gaW5zdGFsbCBmb3IgdGhlIGZpcnN0IHRpbWUsIG9yCisgICAtLXVwZGF0ZSAoLVUpIHRvIHVwZ3JhZGUgYSBwcmV2aW91cyBpbnN0YWxsYXRpb24uCisKKyAgIE5PVEU6IHRoaXMgZG9lc24ndCBoYXZlIHRvIGJlIHRoZSByb290IGRpcmVjdG9yeSBvZiBhIGZpbGVzeXN0ZW0uCisgICBJZiAvYm9vdCBpcyBhIGZpbGVzeXN0ZW0sIHlvdSBjYW4gZG86CisKKwlta2RpciAtcCAvYm9vdC9leHRsaW51eAorCWV4dGxpbnV4IC0taW5zdGFsbCAvYm9vdC9leHRsaW51eAorCisgICAuLi4gdG8gY3JlYXRlIGEgc3ViZGlyZWN0b3J5IGFuZCBpbnN0YWxsIGV4dGxpbnV4IGluIGl0LgorICAgL2Jvb3QvZXh0bGludXggaXMgdGhlIHJlY29tbWVuZGVkIGxvY2F0aW9uIGZvciBleHRsaW51eC4KKworCisyLiBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGNhbGxlZCAiZXh0bGludXguY29uZiIsIGFuZCBpcyBleHBlY3RlZAorICAgdG8gYmUgZm91bmQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGV4dGxpbnV4IGlzIGluc3RhbGxlZCBpbi4KKyAgIFNpbmNlIDQuMDAgInN5c2xpbnV4LmNmZyIgaXMgYWxzbyB0cmllZCBpZiAiZXh0bGludXguY29uZiIgaXMgbm90CisgICBmb3VuZC4KKworCiszLiBQYXRobmFtZXMgY2FuIGJlIGFic29sdXRlIG9yIHJlbGF0aXZlOyBpZiBhYnNvbHV0ZSAod2l0aCBhIGxlYWRpbmcKKyAgIHNsYXNoKSwgdGhleSBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGVzeXN0ZW0gb24gd2hpY2gKKyAgIGV4dGxpbnV4IGlzIGluc3RhbGxlZCAoL2Jvb3QgaW4gdGhlIGV4YW1wbGUgYWJvdmUpLCBpZiByZWxhdGl2ZSwKKyAgIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBleHRsaW51eCBkaXJlY3RvcnkuCisKKyAgIGV4dGxpbnV4IHN1cHBvcnRzIHN1YmRpcmVjdG9yaWVzLCBidXQgdGhlIHRvdGFsIHBhdGggbGVuZ3RoIGlzCisgICBsaW1pdGVkIHRvIDUxMSBjaGFyYWN0ZXJzLgorCisKKzQuIEVYVExJTlVYIG5vdyBzdXBwb3J0cyBzeW1ib2xpYyBsaW5rcy4gIEhvd2V2ZXIsIGV4dHJlbWVseSBsb25nCisgICBzeW1ib2xpYyBsaW5rcyBtaWdodCBoaXQgdGhlIHBhdGhuYW1lIGxpbWl0LiAgQWxzbywgcGxlYXNlIG5vdGUKKyAgIHRoYXQgYWJzb2x1dGUgc3ltYm9saWMgbGlua3MgYXJlIGludGVycHJldGVkIGZyb20gdGhlIHJvb3QgKm9mIHRoZQorICAgZmlsZXN5c3RlbSosIHdoaWNoIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIGhvdyB0aGUgcnVubmluZyBzeXN0ZW0KKyAgIHdvdWxkIGludGVycHJldCBpdCAoZS5nLiBpbiB0aGUgY2FzZSBvZiBhIHNlcGFyYXRlIC9ib290CisgICBwYXJ0aXRpb24uKSAgVGhlcmVmb3JlLCB1c2UgcmVsYXRpdmUgc3ltYm9saWMgbGlua3MgaWYgYXQgYWxsCisgICBwb3NzaWJsZS4KKworCis1LiBFWFRMSU5VWCBub3cgaGFzICJib290LW9uY2UiIHN1cHBvcnQuICBUaGUgYm9vdC1vbmNlIGluZm9ybWF0aW9uIGlzCisgICBzdG9yZWQgaW4gYW4gb24tZGlzayBkYXRhc3RydWN0dXJlLCBwYXJ0IG9mIGV4dGxpbnV4LnN5cywgY2FsbGVkCisgICB0aGUgIkF1eGlsbGFyeSBEYXRhIFZlY3RvciIuICBUaGUgQXV4aWxsaWFyeSBEYXRhIFZlY3RvciBpcyBhbHNvCisgICBhdmFpbGFibGUgdG8gQ09NMzIgbW9kdWxlcyB0aGF0IHdhbnQgdG8gc3RvcmUgc21hbGwgYW1vdW50cyBvZgorICAgaW5mb3JtYXRpb24uCisKKyAgIFRvIHNldCB0aGUgYm9vdC1vbmNlIGluZm9ybWF0aW9uLCBkbzoKKworCWV4dGxpbnV4IC0tb25jZSAnY29tbWFuZCcgL2Jvb3QvZXh0bGludXgKKworICAgd2hlcmUgJ2NvbW1hbmQnIGlzIGFueSBjb21tYW5kIHlvdSBjb3VsZCBlbnRlciBhdCB0aGUgU3lzbGludXgKKyAgIGNvbW1hbmQgbGluZS4gIEl0IHdpbGwgYmUgZXhlY3V0ZWQgb24gdGhlIG5leHQgYm9vdCBhbmQgdGhlbgorICAgZXJhc2VkLgorCisgICBUbyBjbGVhciB0aGUgYm9vdC1vbmNlIGluZm9ybWF0aW9uLCBkbzoKKworCWV4dGxpbnV4IC0tY2xlYXItb25jZSAvYm9vdC9leHRsaW51eAorCisgICBJZiBFWFRMSU5VWCBpcyB1c2VkIG9uIGEgUkFJRC0xLCB0aGlzIGlzIHJlY29tbWVuZGVkLCBzaW5jZSB1bmRlcgorICAgY2VydGFpbiBjaXJjdW1zdGFuY2VzIGEgUkFJRC0xIHJlYnVpbGQgY2FuICJyZXN1cnJlY3QiIHRoZQorICAgYm9vdC1vbmNlIGluZm9ybWF0aW9uIG90aGVyd2lzZS4KKworICAgVG8gY2xlYXIgdGhlIGVudGlyZSBBdXhpbGxhcnkgRGF0YSBWZWN0b3IsIGRvOgorCisJZXh0bGludXggLS1yZXNldC1hZHYgL2Jvb3QvZXh0bGludXgKKworICAgVGhpcyB3aWxsIGVyYXNlIGFsbCBkYXRhIHN0b3JlZCBpbiB0aGUgQURWLCBpbmNsdWRpbmcgYm9vdC1vbmNlLgorCisgICBUaGUgLS1vbmNlLCAtLWNsZWFyLW9uY2UsIGFuZCAtLXJlc2V0LWFkdiBjb21tYW5kcyBjYW4gYmUgY29tYmluZWQKKyAgIHdpdGggLS1pbnN0YWxsIG9yIC0tdXBkYXRlLCBpZiBkZXNpcmVkLiAgVGhlIEFEViBpcyBwcmVzZXJ2ZWQKKyAgIGFjcm9zcyB1cGRhdGVzLCB1bmxlc3MgLS1yZXNldC1hZHYgaXMgc3BlY2lmaWVkLgorCisKK05vdGUgdGhhdCBFWFRMSU5VWCBpbnN0YWxscyBpbiB0aGUgZmlsZXN5c3RlbSBwYXJ0aXRpb24gbGlrZSBhCit3ZWxsLWJlaGF2ZWQgYm9vdGxvYWRlciA6KSAgVGh1cywgaXQgbmVlZHMgYSBtYXN0ZXIgYm9vdCByZWNvcmQgaW4gdGhlCitwYXJ0aXRpb24gdGFibGU7IHRoZSBtYnIuYmluIHNoaXBwZWQgd2l0aCBTeXNsaW51eCBzaG91bGQgd29yayB3ZWxsLgorVG8gaW5zdGFsbCBpdCBqdXN0IGRvOgorCisJY2F0IG1ici5iaW4gPiAvZGV2L1hYWAorCisuLi4gd2hlcmUgL2Rldi9YWFggaXMgdGhlIGFwcHJvcHJpYXRlIG1hc3RlciBkZXZpY2UsIGUuZy4gL2Rldi9oZGEsCithbmQgbWFrZSBzdXJlIHRoZSBjb3JyZWN0IHBhcnRpdGlvbiBpbiBzZXQgYWN0aXZlLgorCisKK0lmIHlvdSBoYXZlIG11bHRpcGxlIGRpc2tzIGluIGEgc29mdHdhcmUgUkFJRCBjb25maWd1cmF0aW9uLCB0aGUKK3ByZWZlcnJlZCB3YXkgdG8gYm9vdCBpczoKKworLSBDcmVhdGUgYSBzZXBhcmF0ZSBSQUlELTEgcGFydGl0aW9uIGZvciAvYm9vdC4gIE5vdGUgdGhhdCB0aGUgTGludXgKKyAgUkFJRC0xIGRyaXZlciBjYW4gc3BhbiBhcyBtYW55IGRpc2tzIGFzIHlvdSB3aXNoLgorCistIEluc3RhbGwgdGhlIE1CUiBvbiAqZWFjaCBkaXNrKiwgYW5kIG1hcmsgdGhlIFJBSUQtMSBwYXJ0aXRpb24KKyAgYWN0aXZlLgorCistIFJ1biAiZXh0bGludXggLS1yYWlkIC0taW5zdGFsbCAvYm9vdCIgdG8gaW5zdGFsbCBleHRsaW51eC4gIFRoaXMKKyAgd2lsbCBpbnN0YWxsIGl0IG9uIGFsbCB0aGUgZHJpdmVzIGluIHRoZSBSQUlELTEgc2V0LCB3aGljaCBtZWFucworICB5b3UgY2FuIGJvb3QgYW55IGNvbWJpbmF0aW9uIG9mIGRyaXZlcyBpbiBhbnkgb3JkZXIuCisKKworCitJdCBpcyBub3QgcmVxdWlyZWQgdG8gcmUtcnVuIHRoZSBleHRsaW51eCBpbnN0YWxsZXIgYWZ0ZXIgaW5zdGFsbGluZworbmV3IGtlcm5lbHMuICBJZiB5b3UgYXJlIHVzaW5nIGV4dDMgam91cm5hbGxpbmcsIGhvd2V2ZXIsIGl0IG1pZ2h0IGJlCitkZXNpcmFibGUgdG8gZG8gc28sIHNpbmNlIHJ1bm5pbmcgdGhlIGV4dGxpbnV4IGluc3RhbGxlciB3aWxsIGZsdXNoCit0aGUgbG9nLiAgT3RoZXJ3aXNlIGEgZGlydHkgc2h1dGRvd24gY291bGQgY2F1c2Ugc29tZSBvZiB0aGUgbmV3CitrZXJuZWwgaW1hZ2UgdG8gc3RpbGwgYmUgaW4gdGhlIGxvZy4gIFRoaXMgaXMgYSBnZW5lcmFsIHByb2JsZW0gZm9yCitib290IGxvYWRlcnMgb24gam91cm5hbGxpbmcgZmlsZXN5c3RlbXM7IGl0IGlzIG5vdCBzcGVjaWZpYyB0bworZXh0bGludXguICBUaGUgInN5bmMiIGNvbW1hbmQgZG9lcyBub3QgZmx1c2ggdGhlIGxvZyBvbiB0aGUgZXh0MworZmlsZXN5c3RlbS4KKworCitUaGUgU3lzbGludXggUHJvamVjdCBib290IGxvYWRlcnMgc3VwcG9ydCBjaGFpbiBsb2FkaW5nIG90aGVyCitvcGVyYXRpbmcgc3lzdGVtcyB2aWEgYSBzZXBhcmF0ZSBtb2R1bGUsIGNoYWluLmMzMiAobG9jYXRlZCBpbgorY29tMzIvbW9kdWxlcy9jaGFpbi5jMzIpLiAgVG8gdXNlIGl0LCBzcGVjaWZ5IGEgTEFCRUwgaW4gdGhlCitjb25maWd1cmF0aW9uIGZpbGUgd2l0aCBLRVJORUwgY2hhaW4uYzMyIGFuZCBBUFBFTkQgW2hkfGZkXTxudW1iZXI+CitbPHBhcnRpdGlvbj5dCisKK0ZvciBleGFtcGxlOgorCisjIFdpbmRvd3MgQ0UvTUUvTlQsIGEgdmVyeSBkZW5zZSBvcGVyYXRpbmcgc3lzdGVtLgorIyBTZWNvbmQgcGFydGl0aW9uICgyKSBvbiB0aGUgZmlyc3QgaGFyZCBkaXNrIChoZDApOworIyBMaW51eCB3b3VsZCAqdHlwaWNhbGx5KiBjYWxsIHRoaXMgL2Rldi9oZGEyIG9yIC9kZXYvc2RhMi4KK0xBQkVMIGNlbWVudAorCUtFUk5FTCBjaGFpbi5jMzIKKwlBUFBFTkQgaGQwIDIKKworU2VlIGFsc28gZG9jL21lbnUudHh0LgorCmRpZmYgLS1naXQgYS9kb2MvZ3B0LnR4dCBiL2RvYy9ncHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjM4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZ3B0LnR4dApAQCAtMCwwICsxLDY5IEBACisJCQkgIEdQVCBib290IHByb3RvY29sCisKK1RoZXJlIGFyZSB0d28gd2F5cyB0byBib290IGEgR1BULWZvcm1hdHRlZCBkaXNrIG9uIGEgQklPUyBzeXN0ZW0uCitIeWJyaWQgYm9vdGluZywgYW5kIHRoZSBuZXcgR1BULW9ubHkgYm9vdGluZyBwcm90b2NvbCBvcmlnaW5hbGx5Citwcm9wb3NlZCBieSB0aGUgYXV0aG9yLCBhbmQgbGF0ZXIgYWRvcHRlZCBieSB0aGUgVDEzIGNvbW1pdHRlZSBpbgorc2xpZ2h0bHkgbW9kaWZpZWQgZm9ybS4KKworCisJKioqIEh5YnJpZCBib290aW5nICoqKgorCitIeWJyaWQgYm9vdGluZyB1c2VzIGEgc3RhbmRhcmQgTUJSLCBhbmQgaGFzIGJvb3RhYmxlICgiYWN0aXZlIikKK3BhcnRpdGlvbnMgcHJlc2VudCwgYXMgcGFydGl0aW9ucywgaW4gdGhlIEdQVCBQTUJSIHNlY3Rvci4gIFRoaXMgbWVhbnMKK3RoZSBQTUJSLCBpbnN0ZWFkIG9mIGNvbnRhaW5pbmcgb25seSBvbmUgInByb3RlY3RpdmUiIHBhcnRpdGlvbiAodHlwZQorRUUpLCBtYXkgY29udGFpbiB1cCB0byB0aHJlZSBwYXJ0aXRpb25zOiBhIHByb3RlY3RpdmUgcGFydGl0aW9uIChFRSkKKypiZWZvcmUqIHRoZSBhY3RpdmUgcGFydGl0aW9uLCB0aGUgYWN0aXZlIHBhcnRpdGlvbiwgYW5kIGEgcHJvdGVjdGl2ZQorcGFydGl0aW9uIChFRSkgKmFmdGVyKiB0aGUgYWN0aXZlIHBhcnRpdGlvbi4gIFRoZSBhY3RpdmUgcGFydGl0aW9uIGlzCitsaW1pdGVkIHRvIHRoZSBmaXJzdCAyXjMyIHNlY3RvcnMgKDIgVEIpIG9mIHRoZSBkaXNrLgorCitBbGwgcGFydGl0aW9ucywgaW5jbHVkaW5nIHRoZSBhY3RpdmUgcGFydGl0aW9uLCBzaG91bGQgaGF2ZSBHUFQKK3BhcnRpdGlvbiBlbnRyaWVzLiAgVGh1cywgY2hhbmdpbmcgd2hpY2ggcGFydGl0aW9uIGlzIGFjdGl2ZSBkb2VzIE5PVAorY2hhbmdlIHRoZSBHUFQgcGFydGl0aW9uIHRhYmxlLgorCitUaGlzIGlzIHRoZSBvbmx5IGtub3duIHdheSB0byBib290IE1pY3Jvc29mdCBvcGVyYXRpbmcgc3lzdGVtcyBmcm9tIGEKK0dQVCBkaXNrIHdpdGggQklPUyBmaXJtd2FyZS4KKworCisJKioqIE5ldyBwcm90b2NvbCAqKioKKworVGhpcyBkZWZpbmVzIHRoZSBUMTMtYXBwcm92ZWQgcHJvdG9jb2wgZm9yIEdQVCBwYXJ0aXRpb25zIHdpdGggQklPUworZmlybXdhcmUuICBJdCBtYWludGFpbnMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdG8gdGhlIGV4dGVudAorcG9zc2libGUuICBJdCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgZmlsZSBtYnIvZ3B0bWJyLmJpbi4KKworVGhlIChQKU1CUiBmb3JtYXQgaXMgdGhlIG5vcm1hbCBQTUJSIHNwZWNpZmllZCBpbiB0aGUgVUVGSQorZG9jdW1lbnRhdGlvbiwgd2l0aCB0aGUgZmlyc3QgNDQwIGJ5dGVzIHVzZWQgZm9yIHRoZSBib290IGNvZGUuICBUaGUKK3BhcnRpdGlvbiB0byBiZSBib290ZWQgaXMgbWFya2VkIGJ5IHNldHRpbmcgYml0IDIgaW4gdGhlIEdQVCBQYXJ0aXRpb24KK0VudHJ5IEF0dHJpYnV0ZXMgZmllbGQgKG9mZnNldCA0OCk7IHRoaXMgYml0IGlzIHJlc2VydmVkIGJ5IHRoZSBVRUZJCitGb3J1bSBmb3IgIkxlZ2FjeSBCSU9TIEJvb3RhYmxlIi4KKworCisgICAgLT4gVGhlIGhhbmRvdmVyIHByb3RvY29sCisKK1RoZSBQTUJSIGJvb3QgY29kZSBsb2FkcyB0aGUgZmlyc3Qgc2VjdG9yIG9mIHRoZSBib290YWJsZSBwYXJ0aXRpb24sCithbmQgcGFzc2VzIGluIERMPTxkaXNrIG51bWJlcj4sIEVTOkRJPTxwb2ludGVyIHRvICRQblA+LCBzZXRzIEVBWCB0bworMHg1NDUwNDcyMSAoIiFHUFQiKSBhbmQgcG9pbnRzIERTOlNJIHRvIGEgc3RydWN0dXJlIG9mIHRoZSBmb2xsb3dpbmcKK2Zvcm06CisKKwlPZmZzZXQJU2l6ZQlDb250ZW50cworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgMAkgIDEJMHg4MCAodGhpcyBpcyBhIGJvb3RhYmxlIHBhcnRpdGlvbikKKwkgIDEJICAzCUNIUyBvZiBwYXJ0aXRpb24gKHVzaW5nIElOVCAxM2ggZ2VvbWV0cnkpCisJICA0CSAgMQkweEVEIChwYXJ0aXRpb24gdHlwZTogc3ludGhldGljKQorCSAgNQkgIDMJQ0hTIG9mIHBhcnRpdGlvbiBlbmQKKwkgIDgJICA0CVBhcnRpdGlvbiBzdGFydCBMQkEKKwkgMTIJICA0CVBhcnRpdGlvbiBsZW5ndGggaW4gc2VjdG9ycworCSAxNgkgIDQJTGVuZ3RoIG9mIHRoZSBHUFQgZW50cnkKKwkgMjAJdmFyaWVzCUdQVCBwYXJ0aXRpb24gZW50cnkKKworVGhlIENIUyBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbDsgZ3B0bWJyLmJpbiBjdXJyZW50bHkgZG9lcyAqTk9UKgorY2FsY3VsYXRlIHRoZW0sIGFuZCBqdXN0IGxlYXZlcyB0aGVtIGFzIHplcm8uCisKK0J5dGVzIDAtMTUgbWF0Y2hlcyB0aGUgc3RhbmRhcmQgTUJSIGhhbmRvdmVyIChEUzpTSSBwb2ludHMgdG8gdGhlCitwYXJ0aXRpb24gZW50cnkpLCBleGNlcHQgdGhhdCB0aGUgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKK3N5bnRoZXRpY2FsbHkuICBUaGUgTUJSLWNvbXBhdGlibGUgZmllbGRzIGFyZSBkaXJlY3RseSB1c2FibGUgaWYgdGhleQorYXJlIDwgMiBUQiwgb3RoZXJ3aXNlIHRoZXNlIGZpZWxkcyBzaG91bGQgY29udGFpbiAweEZGRkZGRkZGIGFuZCB0aGUKK09TIHdpbGwgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBHUFQgcGFydGl0aW9uIGVudHJ5IHdoaWNoIGZvbGxvd3MgdGhlCitNQlIgb25lLiAgVGhlICIhR1BUIiBtYWdpYyBudW1iZXIgaW4gRUFYIGFuZCB0aGUgMHhFRCBwYXJ0aXRpb24gdHlwZQorYWxzbyBpbmZvcm1zIHRoZSBPUyB0aGF0IHRoZSBHUFQgcGFydGl0aW9uIGluZm9ybWF0aW9uIGlzIHByZXNlbnQuCisKK1N5c2xpbnV4IDQuMDAgYW5kIGxhdGVyIGZ1bGx5IGltcGxlbWVudHMgdGhpcyBwcm90b2NvbC4KZGlmZiAtLWdpdCBhL2RvYy9pc29saW51eC50eHQgYi9kb2MvaXNvbGludXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2M2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaXNvbGludXgudHh0CkBAIC0wLDAgKzEsMTAyIEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNPTElOVVgKKworICAgICAgIEEgYm9vdGxvYWRlciBmb3IgTGludXggdXNpbmcgSVNPIDk2NjAvRWwgVG9yaXRvIENELVJPTXMKKworICAgICAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1RoaXMgcHJvZ3JhbSBpcyBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSwgdmVyc2lvbiAyIG9yLCBhdCB5b3VyIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24uICBUaGVyZSBpcyBubword2FycmFudHksIG5laXRoZXIgZXhwcmVzc2VkIG5vciBpbXBsaWVkLCB0byB0aGUgZnVuY3Rpb24gb2YgdGhpcworcHJvZ3JhbS4gIFBsZWFzZSBzZWUgdGhlIGluY2x1ZGVkIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJU09MSU5VWCBpcyBhIGJvb3QgbG9hZGVyIGZvciBMaW51eC9pMzg2IHRoYXQgb3BlcmF0ZXMgb2ZmIElTTyA5NjYwL0VsCitUb3JpdG8gQ0QtUk9NcyBpbiAibm8gZW11bGF0aW9uIiBtb2RlLiAgVGhpcyBhdm9pZHMgdGhlIG5lZWQgdG8gY3JlYXRlCithbiAiZW11bGF0aW9uIGRpc2sgaW1hZ2UiIHdpdGggbGltaXRlZCBzcGFjZSAoZm9yICJmbG9wcHkgZW11bGF0aW9uIikKK29yIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgKGZvciAiaGFyZCBkaXNrIGVtdWxhdGlvbiIuKQorCitUaGlzIGRvY3VtZW50YXRpb24gaXNuJ3QgaGVyZSB5ZXQsIGJ1dCBoZXJlIGlzIGVub3VnaCB0aGF0IHlvdSBzaG91bGQKK2JlIGFibGUgdG8gdGVzdCBpdCBvdXQ6CisKK01ha2Ugc3VyZSB5b3UgaGF2ZSBhIHJlY2VudCBlbm91Z2ggdmVyc2lvbiBvZiBta2lzb2ZzLiAgSSByZWNvbW1lbmQKK21raXNvZnMgMS4xMyAoZGlzdHJpYnV0ZWQgd2l0aCBjZHJlY29yZCAxLjkpLCBidXQgMS4xMiBtaWdodCB3b3JrIGFzCit3ZWxsIChub3QgdGVzdGVkLikKKworVG8gY3JlYXRlIGFuIGltYWdlLCBjcmVhdGUgYSBkaXJlY3RvcnkgY2FsbGVkICJpc29saW51eCIgKG9yLCBpZiB5b3UKK3ByZWZlciwgImJvb3QvaXNvbGludXgiKSB1bmRlcm5lYXRoIHRoZSByb290IGRpcmVjdG9yeSBvZiB5b3VyIElTTworaW1hZ2UgbWFzdGVyIGZpbGUgdHJlZS4gIENvcHkgaXNvbGludXguYmluLCBhIGNvbmZpZyBmaWxlIGNhbGxlZAorImlzb2xpbnV4LmNmZyIgKHNlZSBzeXNsaW51eC50eHQgZm9yIGRldGFpbHMgb24gdGhlIGNvbmZpZ3VyYXRpb24KK2ZpbGUpLCBhbmQgYWxsIG5lY2Vzc2FyeSBmaWxlcyAoa2VybmVscywgaW5pdHJkLCBkaXNwbGF5IGZpbGVzLCBldGMuKQoraW50byB0aGlzIGRpcmVjdG9yeSwgdGhlbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIHRvIGNyZWF0ZSB5b3VyIElTTworaW1hZ2UgKGFkZCBhZGRpdGlvbmFsIG9wdGlvbnMgYXMgYXBwcm9wcmlhdGUsIHN1Y2ggYXMgLUogb3IgLVIpOgorCisJbWtpc29mcyAtbyA8aXNvaW1hZ2U+IFwKKwkJLWIgaXNvbGludXgvaXNvbGludXguYmluIC1jIGlzb2xpbnV4L2Jvb3QuY2F0IFwKKwkJLW5vLWVtdWwtYm9vdCAtYm9vdC1sb2FkLXNpemUgNCAtYm9vdC1pbmZvLXRhYmxlIFwKKwkJPHJvb3Qtb2YtaXNvLXRyZWU+CisKKyhJZiB5b3UgbmFtZWQgdGhlIGRpcmVjdG9yeSBib290L2lzb2xpbnV4IHRoYXQgc2hvdWxkIG9mIGNvdXJzZSBiZQorLWIgYm9vdC9pc29saW51eC9pc29saW51eC5iaW4gLWMgYm9vdC9pc29saW51eC9ib290LmNhdC4pCisKK0lTT0xJTlVYIHJlc29sdmVzIHBhdGhuYW1lcyB0aGUgZm9sbG93aW5nIHdheToKKworLSBBIHBhdGhuYW1lIGNvbnNpc3RzIG9mIG5hbWVzIHNlcGFyYXRlZCBieSBzbGFzaGVzLCBVbml4LXN0eWxlLgorLSBBIGxlYWRpbmcgLyBtZWFucyBpdCBzZWFyY2hlcyBmcm9tIHRoZSByb290IGRpcmVjdG9yeTsgb3RoZXJ3aXNlIHRoZQorICBzZWFyY2ggaXMgZnJvbSB0aGUgaXNvbGludXggZGlyZWN0b3J5ICh0aGluayBvZiB0aGlzIGFzIHRoZSAiY3VycmVudAorICBkaXJlY3RvcnkiLikKKy0gLiBhbmQgLi4gaW4gcGF0aG5hbWUgc2VhcmNoZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCistIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbnkgcGF0aG5hbWUgaXMgMjU1IGNoYXJhY3RlcnMuCisKK05vdGUgdGhhdCBJU09MSU5VWCBvbmx5IHVzZXMgdGhlICJwbGFpbiIgSVNPIDk2NjAgZmlsZW5hbWVzLCBpLmUuIGl0Citkb2VzIG5vdCBzdXBwb3J0IFJvY2sgUmlkZ2Ugb3IgSm9saWV0IGZpbGVuYW1lcy4gIEl0IGNhbiBzdGlsbCBiZSB1c2VkCitvbiBhIGRpc2sgd2hpY2ggdXNlcyBSb2NrIFJpZGdlIGFuZC9vciBKb2xpZXQgZXh0ZW5zaW9ucywgb2YgY291cnNlLgorVW5kZXIgTGludXgsIHlvdSBjYW4gdmVyaWZ5IHRoZSBwbGFpbiBmaWxlbmFtZXMgYnkgbW91bnRpbmcgd2l0aCB0aGUKKyItbyBub3JvY2ssbm9qb2xpZXQiIG9wdGlvbiB0byB0aGUgbW91bnQgY29tbWFuZC4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQKK0lTT0xJTlVYIGRvZXMgc3VwcG9ydCAibG9uZyIgKGxldmVsIDIpIElTTyA5NjYwIHBsYWluIGZpbGVuYW1lcywgc28gaWYKK2NvbXBhdGliaWxpdHkgd2l0aCBzaG9ydC1uYW1lcy1vbmx5IG9wZXJhdGluZyBzeXN0ZW1zIGxpa2UgTVMtRE9TIGlzCitub3QgYW4gaXNzdWUsIHlvdSBjYW4gdXNlIHRoZSAiLWwiIG9yICItaXNvLWxldmVsIDIiIG9wdGlvbiB0byBta2lzb2ZzCit0byBnZW5lcmF0ZSBsb25nICh1cCB0byAzMSBjaGFyYWN0ZXJzKSBwbGFpbiBmaWxlbmFtZXMuCisKK0lTT0xJTlVYIGRvZXMgbm90IHN1cHBvcnQgZGlzY29udGlndW91cyBmaWxlcywgaW50ZXJsZWF2ZWQgbW9kZSwgb3IKK2xvZ2ljYWwgYmxvY2sgYW5kIHNlY3RvciBzaXplcyBvdGhlciB0aGFuIDIwNDguICBUaGlzIHNob3VsZCBub3JtYWxseQorbm90IGJlIGEgcHJvYmxlbS4KKworSVNPTElOVVggaXMgYnkgZGVmYXVsdCBidWlsdCBpbiB0d28gdmVyc2lvbnMsIG9uZSB2ZXJzaW9uIHdpdGggZXh0cmEKK2RlYnVnZ2luZyBtZXNzYWdlcyBlbmFibGVkLiAgSWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCBJU09MSU5VWCwKK0kgd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGlmIHlvdSBjb3VsZCB0cnkgb3V0IHRoZSBkZWJ1Z2dpbmcgdmVyc2lvbgorKGlzb2xpbnV4LWRlYnVnLmJpbikgYW5kIGxldCBtZSBrbm93IHdoYXQgaXQgcmVwb3J0cy4gIFRoZSBkZWJ1Z2dpbmcKK3ZlcnNpb24gZG9lcyBub3QgaW5jbHVkZSBoeWJyaWQgbW9kZSBzdXBwb3J0IChzZWUgYmVsb3cuKQorCisKKyAgICAgICsrKysgTk9URSBPTiBUSEUgQ09ORklHIEZJTEUgRElSRUNUT1JZICsrKysKKworSVNPTElOVVggd2lsbCBzZWFyY2ggZm9yIHRoZSBjb25maWcgZmlsZSBkaXJlY3RvcnkgaW4gdGhlIG9yZGVyCisvYm9vdC9pc29saW51eCwgL2lzb2xpbnV4LCAvLiAgVGhlIGZpcnN0IGRpcmVjdG9yeSB0aGF0IGV4aXN0cyBpcwordXNlZCwgZXZlbiBpZiBpdCBjb250YWlucyBubyBmaWxlcy4gIFRoZXJlZm9yZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0Cit0aGVzZSBkaXJlY3RvcmllcyBkb24ndCBleGlzdCBpZiB5b3UgZG9uJ3Qgd2FudCBJU09MSU5VWCB0byB1c2UgdGhlbS4KKworCisgICAgICArKysrIEhZQlJJRCBDRC1ST00vSEFSRCBESVNLIE1PREUgKysrKworCitTdGFydGluZyBpbiB2ZXJzaW9uIDMuNzIsIElTT0xJTlVYIHN1cHBvcnRzIGEgImh5YnJpZCBtb2RlIiB3aGljaCBjYW4KK2JlIGJvb3RlZCBmcm9tIGVpdGhlciBDRC1ST00gb3IgZnJvbSBhIGRldmljZSB3aGljaCBCSU9TIGNvbnNpZGVycyBhCitoYXJkIGRpc2sgb3IgWklQIGRpc2ssIGUuZy4gYSBVU0Iga2V5IG9yIHNpbWlsYXIuCisKK1RvIGVuYWJsZSB0aGlzIG1vZGUsIHRoZSAuaXNvIGltYWdlIHNob3VsZCBiZSBwb3N0cHJvY2Vzc2VkIHdpdGggdGhlCisiaXNvaHlicmlkIiBzY3JpcHQgZnJvbSB0aGUgdXRpbHMgZGlyZWN0b3J5OgorCisJaXNvaHlicmlkIGZpbGVuYW1lLmlzbworCitUaGlzIHNjcmlwdCBjcmVhdGVzIHRoZSBuZWNlc3NhcnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBiZSBhYmxlIHRvCitib290IGluIGh5YnJpZCBtb2RlLiAgSXQgYWxzbyBwYWRzIG91dCB0aGUgaW1hZ2UgdG8gYW4gZXZlbiBtdWx0aXBsZQorb2YgMSBNQi4KKworVGhpcyBpbWFnZSBjYW4gdGhlbiBiZSBjb3BpZWQgdXNpbmcgYW55IHJhdyBkaXNrIHdyaXRpbmcgdG9vbCAob24gVW5peAorc3lzdGVtcywgdHlwaWNhbGx5ICJkZCIgb3IgImNhdCIpIHRvIGEgVVNCIGRpc2ssIG9yIHdyaXR0ZW4gdG8gYQorQ0QtUk9NIHVzaW5nIHN0YW5kYXJkIENEIGJ1cm5pbmcgdG9vbHMuCisKK1RoZSBJU08gOTY2MCBmaWxlc3lzdGVtIGlzIGVuY2Fwc3VsYXRlZCBpbiBhIHBhcnRpdGlvbiAod2hpY2ggc3RhcnRzCithdCBvZmZzZXQgemVybywgd2hpY2ggbWF5IGNvbmZ1c2Ugc29tZSBzeXN0ZW1zLikgIFRoaXMgbWFrZXMgaXQKK3Bvc3NpYmxlIGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgb25jZSBib290ZWQsIHRvIHVzZSB0aGUgcmVtYWluZGVyCitvZiB0aGUgZGV2aWNlIGZvciBwZXJzaXN0ZW50IHN0b3JhZ2UgYnkgY3JlYXRpbmcgYSBzZWNvbmQgcGFydGl0aW9uLgpkaWZmIC0tZ2l0IGEvZG9jL2tleXRhYi1saWxvLnR4dCBiL2RvYy9rZXl0YWItbGlsby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiZWEwZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9rZXl0YWItbGlsby50eHQKQEAgLTAsMCArMSw4NSBAQAorVGhpcyBpcyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGtleXRhYi1saWxvLnBsIHByb2dyYW0uICBJdCB3YXMKK3Rha2VuIHZlcmJhdGltIGZyb20gdGhlIExJTE8tMjAgUkVBRE1FIGZpbGU7IG9ubHkgdGhpcyBoZWFkZXIgd2FzCithZGRlZC4KKworTElMTyBwcm9ncmFtIGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIGF1eGlsaWFyeSBwcm9ncmFtcyBhcmUKK0NvcHlyaWdodCAxOTkyLTE5OTcgV2VybmVyIEFsbWVzYmVyZ2VyLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBvZiBwYXJ0cyBvZiBvciB0aGUKK3dob2xlIG9yaWdpbmFsIG9yIGRlcml2ZWQgd29yayBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCitvcmlnaW5hbCB3b3JrIGlzIHByb3Blcmx5IGF0dHJpYnV0ZWQgdG8gdGhlIGF1dGhvci4gVGhlIG5hbWUgb2YgdGhlCithdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KK3RoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIFRoaXMgd29yaworaXMgcHJvdmlkZWQgImFzIGlzIiBhbmQgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMuCisKK1RvIHVzZSBhIExJTE8ga2V5Ym9hcmQgdGFibGUgd2l0aCBTeXNsaW51eCwgc3BlY2lmeSB0aGUgS0JETUFQIGNvbW1hbmQKK2luIHN5c2xpbnV4LmNmZywgZm9yIGV4YW1wbGU6CisKKwlrYmRtYXAgZGUua3RsCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworS2V5Ym9hcmQgdHJhbnNsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBQQyBrZXlib2FyZCBlbWl0cyBzby1jYWxsZWQgc2NhbiBjb2Rlcywgd2hpY2ggYXJlIGJhc2ljYWxseSBrZXkKK251bWJlcnMuIFRoZSBCSU9TIHRoZW4gdHJhbnNsYXRlcyB0aG9zZSBzY2FuIGNvZGVzIHRvIHRoZSBjaGFyYWN0ZXIgY29kZXMKK29mIHRoZSBjaGFyYWN0ZXJzIHByaW50ZWQgb24gdGhlIGtleS1jYXBzLiBCeSBkZWZhdWx0LCB0aGUgQklPUyBub3JtYWxseQorYXNzdW1lcyB0aGF0IHRoZSBrZXlib2FyZCBoYXMgYSBVUyBsYXlvdXQuIE9uY2UgYW4gb3BlcmF0aW5nIHN5c3RlbSBpcworbG9hZGVkLCB0aGlzIG9wZXJhdGluZyBzeXN0ZW0gY2FuIHVzZSBhIGRpZmZlcmVudCBtYXBwaW5nLgorCitBdCBib290IHRpbWUsIExJTE8gb25seSBoYXMgYWNjZXNzIHRvIHRoZSBiYXNpYyBzZXJ2aWNlcyBwcm92aWRlZCBieSB0aGUKK0JJT1MgYW5kIHRoZXJlZm9yZSByZWNlaXZlcyB0aGUgY2hhcmFjdGVyIGNvZGVzIGZvciBhbiBVUyBrZXlib2FyZC4gSXQKK3Byb3ZpZGVzIGEgc2ltcGxlIG1lY2hhbmlzbSB0byByZS1tYXAgdGhlIGNoYXJhY3RlciBjb2RlcyB0byB3aGF0IGlzCithcHByb3ByaWF0ZSBmb3IgdGhlIGFjdHVhbCBsYXlvdXQuKgorCisgICogIFRoZSBjdXJyZW50IG1lY2hhbmlzbSBpc24ndCBwZXJmZWN0LCBiZWNhdXNlIGl0IHNpdHMgb24gdG9wIG9mIHRoZQorICAgIHNjYW4gY29kZSB0byBjaGFyYWN0ZXIgY29kZSB0cmFuc2xhdGlvbiBwZXJmb3JtZWQgYnkgdGhlIEJJT1MuIFRoaXMKKyAgICBtZWFucyB0aGF0IGtleSBjb21iaW5hdGlvbnMgdGhhdCBkb24ndCBwcm9kdWNlIGFueSB1c2VmdWwgY2hhcmFjdGVyIG9uCisgICAgdGhlIFVTIGtleWJvYXJkIHdpbGwgYmUgaWdub3JlZCBieSBMSUxPLiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgYXBwcm9hY2gKKyAgICBpcyBpdHMgc2ltcGxpY2l0eS4KKworCitDb21waWxpbmcga2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzCistIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK0xJTE8gb2J0YWlucyBsYXlvdXQgaW5mb3JtYXRpb24gZnJvbSB0aGUga2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzIExpbnV4Cit1c2VzIGZvciB0aGUgdGV4dCBjb25zb2xlLiBUaGV5IGFyZSB1c3VhbGx5IHN0b3JlZCBpbgorL3Vzci9saWIva2JkL2tleXRhYmxlcy4gTElMTyBjb21lcyB3aXRoIGEgcHJvZ3JhbSBrZXl0YWItbGlsby5wbCB0aGF0IHJlYWRzCit0aG9zZSB0YWJsZXMgYW5kIGdlbmVyYXRlcyBhIHRhYmxlIHN1aXRhYmxlIGZvciB1c2UgYnkgdGhlIG1hcCBpbnN0YWxsZXIuCitrZXl0YWItbGlsby5wbCBpbnZva2VzIHRoZSBwcm9ncmFtIGxvYWRrZXlzIHRvIHByaW50IHRoZSB0YWJsZXMgaW4gYSBmb3JtYXQKK3RoYXQgaXMgZWFzeSB0byBwYXJzZS4qCisKKyAgKiAgT24gc29tZSBzeXN0ZW1zLCBvbmx5IHJvb3QgY2FuIGV4ZWN1dGUgbG9hZGtleXMuIEl0IGlzIHRoZW4gbmVjZXNzYXJ5CisgICAgdG8gcnVuIGtleXRhYi1saWxvLnBsIGFzIHJvb3QgdG9vLgorCitrZXl0YWItbGlsby5wbCBpcyB1c2VkIGFzIGZvbGxvd3M6CisKKyAga2V5dGFiLWxpbG8ucGwgWyAtcCA8b2xkX2NvZGU+PTxuZXdfY29kZT4gXSAuLi4KKyAgICBbPHBhdGg+XTxkZWZhdWx0X2xheW91dD5bLjxleHRlbnNpb24+XSBdCisgICAgIFs8cGF0aD5dPGtiZF9sYXlvdXQ+Wy48ZXh0ZW5zaW9uPl0gXQorCisgICAtcCA8b2xkX2NvZGU+PTxuZXdfY29kZT4KKyAgICAgU3BlY2lmaWVzIGNvcnJlY3Rpb25zICgicGF0Y2hlcyIpIHRvIHRoZSBtYXBwaW5nIG9idGFpbmVkIGZyb20gdGhlCisgICAgdHJhbnNsYXRpb24gdGFibGUgZmlsZXMuIEUuZy4gaWYgcHJlc3NpbmcgdGhlIHVwcGVyIGNhc2UgIkEiIHNob3VsZAorICAgIHlpZWxkIGFuIGF0IHNpZ24sIC1wIDY1PTY0IHdvdWxkIGJlIHVzZWQuIFRoZSAgLXAgIG9wdGlvbiBjYW4gYmUKKyAgICByZXBlYXRlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLiBUaGUgY29kZXMgY2FuIGFsc28gYmUgZ2l2ZW4gYXMKKyAgICBoZXhhZGVjaW1hbCBvciBhcyBvY3RhbCBudW1iZXJzIGlmIHRoZXkgYXJlIHByZWZpeGVkIHdpdGggMHggb3IgMCwKKyAgICByZXNwZWN0aXZlbHkuCisgIDxwYXRoPiAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZmlsZSByZXNpZGVzLiBUaGUgZGVmYXVsdCBwYXRoIGlzCisgICAgL3Vzci9saWIva2JkL2tleXRhYmxlcy4KKyAgPGV4dGVuc2lvbj4gIFVzdWFsbHkgdGhlIHRyYWlsaW5nIC5tYXAsIHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgaWYKKyAgICB0aGUgZmlsZSBuYW1lIGRvZXNuJ3QgY29udGFpbiBkb3RzLgorICA8ZGVmYXVsdF9sYXlvdXQ+ICBJcyB0aGUgbGF5b3V0IHdoaWNoIHNwZWNpZmllcyB0aGUgdHJhbnNsYXRpb24gYnkgdGhlCisgICAgQklPUy4gSWYgbm9uZSBpcyBzcGVjaWZpZWQsIHVzIGlzIGFzc3VtZWQuCisgIDxrYmRfbGF5b3V0PiAgSXMgdGhlIGFjdHVhbCBsYXlvdXQgb2YgdGhlIGtleWJvYXJkLgorCitrZXl0YWItbGlsby5wbCB3cml0ZXMgdGhlIHJlc3VsdGluZyB0cmFuc2xhdGlvbiB0YWJsZSBhcyBhIGJpbmFyeSBzdHJpbmcgdG8KK3N0YW5kYXJkIG91dHB1dC4gU3VjaCB0YWJsZXMgY2FuIGJlIHN0b3JlZCBhbnl3aGVyZSB3aXRoIGFueSBuYW1lLCBidXQgdGhlCitzdWdnZXN0ZWQgbmFtaW5nIGNvbnZlbnRpb24gaXMgL2Jvb3QvPGtiZD4ua3RsICgiS2V5Ym9hcmQgVGFibGUgZm9yIExpbG8iKSwKK3doZXJlIDxrYmQ+IGlzIHRoZSBuYW1lIG9mIHRoZSBrZXlib2FyZCBsYXlvdXQuCisKK0V4YW1wbGU6CisKK2tleXRhYi1saWxvLnBsIGRlID4vYm9vdC9kZS5rdGwKZGlmZiAtLWdpdCBhL2RvYy9sb2dvL0xJQ0VOU0UgYi9kb2MvbG9nby9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTMwODcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbG9nby9MSUNFTlNFCkBAIC0wLDAgKzEsNSBAQAorVGhlIFN5c2xpbnV4IGxvZ28gaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMKK0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMy4wIFVucG9ydGVkIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKK2xpY2Vuc2UsIHZpc2l0IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8gb3Igc2VuZAorYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgNDQ0IENhc3RybyBTdHJlZXQsIFN1aXRlIDkwMCwgTW91bnRhaW4KK1ZpZXcsIENhbGlmb3JuaWEsIDk0MDQxLCBVU0EuCmRpZmYgLS1naXQgYS9kb2MvbG9nby9zeXNsaW51eC0xMDAucG5nIGIvZG9jL2xvZ28vc3lzbGludXgtMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDc2MzVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xvZ28vc3lzbGludXgtMTAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvbWJvb3QudHh0IGIvZG9jL21ib290LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjhjN2IxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21ib290LnR4dApAQCAtMCwwICsxLDI2IEBACisKK21ib290LmMzMgorLS0tLS0tLS0tCisKK21ib290LmMzMiBpcyBhIDMyLWJpdCBFTEYgbW9kdWxlIHRoYXQgYWxsb3dzIFN5c2xpbnV4IGFuZCBpdHMKK3ZhcmlhbnRzIHRvIGxvYWQgYW5kIGJvb3Qga2VybmVscyB0aGF0IHVzZSB0aGUgTXVsdGlib290IHN0YW5kYXJkCisoZS5nLiB0aGUgWGVuIHZpcnR1YWwgbWFjaGluZSBtb25pdG9yLCBhbmQgdGhlIEZpYXNjbyBhbmQgR05VIE1hY2gKK21pY3Jva2VybmVscykuCisKK1RvIGxvYWQgYSBtdWx0aWJvb3Qga2VybmVsIGFuZCBtb2R1bGVzIGluIFN5c2xpbnV4LCBwdXQgbWJvb3QuYzMyIChmcm9tCitjb20zMi9tb2R1bGVzKSBpbiB0aGUgYm9vdCBkaXJlY3RvcnksIGFuZCBsb2FkIGl0IGFzIHRoZSAia2VybmVsIiBpbiB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSBjb21tYW5kLWxpbmUgdG8gcGFzcyB0byBtYm9vdC5jMzIgaXMgdGhlIGtlcm5lbAorY29tbWFuZC1saW5lLCBmb2xsb3dlZCBieSBhbGwgdGhlIG1vZHVsZSBjb21tYW5kIGxpbmVzLCBzZXBhcmF0ZWQgd2l0aAorJy0tLScuICBGb3IgZXhhbXBsZSwgdG8gbG9hZCBhIFhlbiBWTU0sIHhlbmxpbnV4IGFuZCBhbiBpbml0cmQ6CisKK0RFRkFVTFQgbWJvb3QuYzMyIHhlbi5neiBkb20wX21lbT0xNTAwMCBub3NtcCBub2FjcGkgLS0tIGxpbnV4Lmd6IGNvbnNvbGU9dHR5MCByb290PS9kZXYvaGRhMSAtLS0gaW5pdHJkLmltZworCitvciwgYXMgYSBjaG9pY2UgaW4gYSBtZW51OgorCitMQUJFTCBYZW4KKyAgS0VSTkVMIG1ib290LmMzMgorICBBUFBFTkQgeGVuLmd6IGRvbTBfbWVtPTE1MDAwIG5vc21wIG5vYWNwaSAtLS0gbGludXguZ3ogY29uc29sZT10dHkwIHJvb3Q9L2Rldi9oZGExIC0tLSBpbml0cmQuaW1nCisKK21ib290LmMzMiByZXF1aXJlcyB2ZXJzaW9uIDIuMTIgb3IgbGF0ZXIgb2YgU3lzbGludXguCisKK1RpbSBEZWVnYW4sIE1heSAyMDA1CmRpZmYgLS1naXQgYS9kb2MvbWVtZGlzay50eHQgYi9kb2MvbWVtZGlzay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2MjkzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tZW1kaXNrLnR4dApAQCAtMCwwICsxLDI5OCBAQAorW1RoaXMgZG9jdW1lbnRhdGlvbiBpcyByYXRoZXIgY3J1ZnR5IGF0IHRoZSBtb21lbnQuXQorCitNRU1ESVNLIGlzIG1lYW50IHRvIGFsbG93IGJvb3RpbmcgbGVnYWN5IG9wZXJhdGluZyBzeXN0ZW1zIHZpYSBQWEUsCithbmQgYXMgYSB3b3JrYXJvdW5kIGZvciBCSU9TZXMgd2hlcmUgSVNPTElOVVggaW1hZ2Ugc3VwcG9ydCBkb2Vzbid0Cit3b3JrLgorCitNRU1ESVNLIHNpbXVsYXRlcyBhIGRpc2sgYnkgY2xhaW1pbmcgYSBjaHVuayBvZiBoaWdoIG1lbW9yeSBmb3IgdGhlCitkaXNrIGFuZCBhICh2ZXJ5IHNtYWxsIC0gMksgdHlwaWNhbCkgY2h1bmsgb2YgbG93IChET1MpIG1lbW9yeSBmb3IgdGhlCitkcml2ZXIgaXRzZWxmLCB0aGVuIGhvb2tpbmcgdGhlIElOVCAxM2ggKGRpc2sgZHJpdmVyKSBhbmQgSU5UIDE1aAorKG1lbW9yeSBxdWVyeSkgQklPUyBpbnRlcnJ1cHRzLgorCitNRU1ESVNLIGFsbG93cyBmb3IgYW4gT1MgdG8gZGV0ZWN0IHRoZSBNRU1ESVNLIGluc3RhbmNlLiAgKFNlZSB0aGUKKyJBZGRpdGlvbmFsIHRlY2huaWNhbCBpbmZvcm1hdGlvbiIgc2VjdGlvbiBiZWxvdy4pCisKK1RvIHVzZSBpdCwgdHlwZSBvbiB0aGUgU3lzbGludXggY29tbWFuZCBsaW5lOgorCittZW1kaXNrIGluaXRyZD1kaXNraW1nLmltZworCisuLi4gd2hlcmUgZGlza2ltZy5pbWcgaXMgdGhlIGRpc2sgaW1hZ2UgeW91IHdhbnQgdG8gYm9vdCBmcm9tLgorCitbT2J2aW91c2x5LCB0aGUgbWVtZGlzayBiaW5hcnkgYXMgd2VsbCBhcyB5b3VyIGRpc2sgaW1hZ2UgZmlsZSBuZWVkIHRvCitiZSBwcmVzZW50IGluIHRoZSBib290IGltYWdlIGRpcmVjdG9yeS5dCisKKy4uLiBvciBhZGQgdG8geW91ciBzeXNsaW51eC5jZmcvcHhlbGludXguY2ZnL2lzb2xpbnV4LmNmZyBzb21ldGhpbmcgbGlrZToKKworbGFiZWwgZG9zCisgICAga2VybmVsIG1lbWRpc2sKKyAgICBhcHBlbmQgaW5pdHJkPWRvc2Jvb3QuaW1nCisKK05vdGUgdGhlIGZvbGxvd2luZzoKKworYSkgVGhlIGRpc2sgaW1hZ2UgY2FuIGJlIHVuY29tcHJlc3NlZCBvciBjb21wcmVzc2VkIHdpdGggZ3ppcCBvciB6aXAuCisKK2IpIElmIHRoZSBkaXNrIGltYWdlIGlzIGxlc3MgdGhhbiA0LDE5NCwzMDQgYnl0ZXMgKDQwOTZLLCA0IE1CKSBpdCBpcworICAgYXNzdW1lZCB0byBiZSBhIGZsb3BweSBpbWFnZSBhbmQgTUVNRElTSyB3aWxsIHRyeSB0byBndWVzcyBpdHMKKyAgIGdlb21ldHJ5IGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgTUVNRElTSyByZWNvZ25pemVzIGFsbCB0aGUKKyAgIHN0YW5kYXJkIGZsb3BweSBzaXplcyBhcyB3ZWxsIGFzIGNvbW1vbiBleHRlbmRlZCBmb3JtYXRzOgorCisgICAgIDE2Myw4NDAgYnl0ZXMgICgxNjBLKSBjPTQwIGg9MSBzPTgJCTUuMjUiIFNTU0QKKyAgICAgMTg0LDMyMCBieXRlcyAgKDE4MEspIGM9NDAgaD0xIHM9OQkJNS4yNSIgU1NTRAorICAgICAzMjcsNjgwIGJ5dGVzICAoMzIwSykgYz00MCBoPTIgcz04CQk1LjI1IiBEU0RECisgICAgIDM2OCw2NDAgYnl0ZXMgICgzNjBLKSBjPTQwIGg9MiBzPTkJCTUuMjUiIERTREQKKyAgICAgNjU1LDM2MCBieXRlcyAgKDY0MEspIGM9ODAgaD0yIHM9OAkJMy41IiAgRFNERAorICAgICA3MzcsMjgwIGJ5dGVzICAoNzIwSykgYz04MCBoPTIgcz05CQkzLjUiICBEU0RECisgICAxLDIyMiw4MDAgYnl0ZXMgKDEyMDBLKSBjPTgwIGg9MiBzPTE1CTUuMjUiIERTSEQKKyAgIDEsNDc0LDU2MCBieXRlcyAoMTQ0MEspIGM9ODAgaD0yIHM9MTgJMy41IiAgRFNIRAorICAgMSw2MzgsNDAwIGJ5dGVzICgxNjAwSykgYz04MCBoPTIgcz0yMAkzLjUiICBEU0hEIChleHRlbmRlZCkKKyAgIDEsNzIwLDMyMCBieXRlcyAoMTY4MEspIGM9ODAgaD0yIHM9MjEJMy41IiAgRFNIRCAoZXh0ZW5kZWQpCisgICAxLDc2MywzMjggYnl0ZXMgKDE3MjJLKSBjPTgyIGg9MiBzPTIxCTMuNSIgIERTSEQgKGV4dGVuZGVkKQorICAgMSw3ODQsODMyIGJ5dGVzICgxNzQzSykgYz04MyBoPTIgcz0yMQkzLjUiICBEU0hEIChleHRlbmRlZCkKKyAgIDEsODAyLDI0MCBieXRlcyAoMTc2MEspIGM9ODAgaD0yIHM9MjIJMy41IiAgRFNIRCAoZXh0ZW5kZWQpCisgICAxLDg4NCwxNjAgYnl0ZXMgKDE4NDBLKSBjPTgwIGg9MiBzPTIzCTMuNSIgIERTSEQgKGV4dGVuZGVkKQorICAgMSw5NjYsMDgwIGJ5dGVzICgxOTIwSykgYz04MCBoPTIgcz0yNAkzLjUiICBEU0hEIChleHRlbmRlZCkKKyAgIDIsOTQ5LDEyMCBieXRlcyAoMjg4MEspIGM9ODAgaD0yIHM9MzYJMy41IiAgRFNFRAorICAgMywxOTQsODgwIGJ5dGVzICgzMTIwSykgYz04MCBoPTIgcz0zOQkzLjUiICBEU0VEIChleHRlbmRlZCkKKyAgIDMsMjc2LDgwMCBieXRlcyAoMzIwMEspIGM9ODAgaD0yIHM9NDAJMy41IiAgRFNFRCAoZXh0ZW5kZWQpCisgICAzLDYwNCw0ODAgYnl0ZXMgKDM1MjBLKSBjPTgwIGg9MiBzPTQ0CTMuNSIgIERTRUQgKGV4dGVuZGVkKQorICAgMyw5MzIsMTYwIGJ5dGVzICgzODQwSykgYz04MCBoPTIgcz00OAkzLjUiICBEU0VEIChleHRlbmRlZCkKKworICAgQSBzbWFsbCBwZXJsIHNjcmlwdCBpcyBpbmNsdWRlZCBpbiB0aGUgTUVNRElTSyBkaXJlY3Rvcnkgd2hpY2ggY2FuCisgICBkZXRlcm1pbmUgdGhlIGdlb21ldHJ5IHRoYXQgTUVNRElTSyB3b3VsZCBzZWxlY3QgZm9yIG90aGVyIHNpemVzOworICAgaW4gZ2VuZXJhbCBNRU1ESVNLIHdpbGwgY29ycmVjdGx5IGRldGVjdCBtb3N0IHBoeXNpY2FsIGV4dGVuZGVkCisgICBmb3JtYXRzIHVzZWQsIHdpdGggODAgY3lsaW5kZXJzIG9yIHNsaWdodGx5IG1vcmUuCisKKyAgIElmIHRoZSBpbWFnZSBpcyA0IE1CIG9yIGxhcmdlciwgaXQgaXMgYXNzdW1lZCB0byBiZSBhIGhhcmQgZGlzaworICAgaW1hZ2UsIGFuZCBzaG91bGQgdHlwaWNhbGx5IGhhdmUgYW4gTUJSIGFuZCBhIHBhcnRpdGlvbiB0YWJsZS4gIEl0CisgICBtYXkgb3B0aW9uYWxseSBoYXZlIGEgRE9TRU1VIGdlb21ldHJ5IGhlYWRlcjsgaW4gd2hpY2ggY2FzZSB0aGUKKyAgIGhlYWRlciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgQy9IL1MgZ2VvbWV0cnkgb2YgdGhlIGRpc2suCisgICBPdGhlcndpc2UsIHRoZSBnZW9tZXRyeSBpcyBkZXRlcm1pbmVkIGJ5IGV4YW1pbmluZyB0aGUgcGFydGl0aW9uCisgICB0YWJsZSwgc28gdGhlIGVudGlyZSBpbWFnZSBzaG91bGQgYmUgcGFydGl0aW9uZWQgZm9yIHByb3BlcgorICAgb3BlcmF0aW9uIChpdCBtYXkgYmUgZGl2aWRlZCBiZXR3ZWVuIG11bHRpcGxlIHBhcnRpdGlvbnMsIGhvd2V2ZXIuKQorCisgICBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgZ2VvbWV0cnkgbWFudWFsbHkgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQKKyAgIGxpbmUgb3B0aW9uczoKKworICAgYz0jCQlTcGVjaWZ5IG51bWJlciBvZiBjeWxpbmRlcnMgKG1heCAxMDI0WypdKQorICAgaD0jCQlTcGVjaWZ5IG51bWJlciBvZiBoZWFkcyAobWF4IDI1NlsqXSkKKyAgIHM9IwkJU3BlY2lmeSBudW1iZXIgb2Ygc2VjdG9ycyAobWF4IDYzKQorICAgZmxvcHB5Wz0jXQlUaGUgaW1hZ2UgaXMgYSBmbG9wcHkgaW1hZ2VbKipdCisgICBoYXJkZGlza1s9I10JVGhlIGltYWdlIGlzIGEgaGFyZCBkaXNrIGltYWdlWyoqXQorICAgaXNvCQlUaGUgaW1hZ2UgaXMgYW4gRWwgVG9yaXRvIElTTzk2NjAgaW1hZ2UgKGRyaXZlIDB4RTApCisKKyAgICMgcmVwcmVzZW50cyBhIGRlY2ltYWwgbnVtYmVyLgorCisgICAgWypdIE1TLURPUyBvbmx5IGFsbG93cyBtYXggMjU1IGhlYWRzLCBhbmQgb25seSBhbGxvd3MgMjU1IGN5bGluZGVycworICAgICAgICBvbiBmbG9wcHkgZGlza3MuCisKKyAgIFsqKl0gTm9ybWFsbHkgTUVNRElTSyBlbXVsYXRlcyB0aGUgZmlyc3QgZmxvcHB5IG9yIGhhcmQgZGlzay4gIFRoaXMKKyAgICAgICAgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3BlY2lmeWluZyBhbiBpbmRleCwgZS5nLiBmbG9wcHk9MSB3aWxsCisgICAgICAgIHNpbXVsYXRlIGZkMSAoQjopLiBUaGlzIG1heSBub3Qgd29yayBvbiBhbGwgb3BlcmF0aW5nIHN5c3RlbXMKKyAgICAgICAgb3IgQklPU2VzLgorCitjKSBUaGUgZGlzayBpcyBub3JtYWxseSB3cml0YWJsZSAoYWx0aG91Z2gsIG9mIGNvdXJzZSwgdGhlcmUgaXMKKyAgIG5vdGhpbmcgYmFja2luZyBpdCB1cCwgc28gaXQgb25seSBsYXN0cyB1bnRpbCByZXNldC4pICBJZiB5b3Ugd2FudCwKKyAgIHlvdSBjYW4gbWltaWMgYSB3cml0ZS1wcm90ZWN0ZWQgZGlzayBieSBzcGVjaWZ5aW5nIHRoZSBjb21tYW5kIGxpbmUKKyAgIG9wdGlvbjoKKworICAgcm8JCURpc2sgaXMgcmVhZG9ubHkKKworZCkgTUVNRElTSyBub3JtYWxseSB1c2VzIHRoZSBCSU9TICJJTlQgMTVoIG1vdmVyIiBBUEkgdG8gYWNjZXNzIGhpZ2gKKyAgIG1lbW9yeS4gIFRoaXMgaXMgd2VsbC1iZWhhdmVkIHdpdGggZXh0ZW5kZWQgbWVtb3J5IG1hbmFnZXJzIHdoaWNoIGxvYWQKKyAgIGxhdGVyLiAgVW5mb3J0dW5hdGVseSBpdCBhcHBlYXJzIHRoYXQgdGhlICJET1MgYm9vdCBkaXNrIiBmcm9tCisgICBXaW5NRS9YUCAqZGVsaWJlcmF0ZWx5KiBjcmFzaCB0aGUgc3lzdGVtIHdoZW4gdGhpcyBBUEkgaXMgaW52b2tlZC4KKyAgIFRoZSBmb2xsb3dpbmcgY29tbWFuZC1saW5lIG9wdGlvbnMgdGVsbHMgTUVNRElTSyB0byBlbnRlciBwcm90ZWN0ZWQKKyAgIG1vZGUgZGlyZWN0bHksIHdoZW5ldmVyIHBvc3NpYmxlOgorCisgICByYXcJCVVzZSByYXcgYWNjZXNzIHRvIHByb3RlY3RlZCBtb2RlIG1lbW9yeS4KKworICAgYmlncmF3CVVzZSByYXcgYWNjZXNzIHRvIHByb3RlY3RlZCBtb2RlIG1lbW9yeSwgYW5kIGxlYXZlIHRoZQorCQlDUFUgaW4gImJpZyByZWFsIiBtb2RlIGFmdGVyd2FyZHMuCisKKyAgIGludAkJVXNlIHBsYWluIElOVCAxNWggYWNjZXNzIHRvIHByb3RlY3RlZCBtZW1vcnkuICBUaGlzIGFzc3VtZXMKKyAgIAkJdGhhdCBhbnl0aGluZyB3aGljaCBob29rcyBJTlQgMTVoIGtub3dzIHdoYXQgaXQgaXMgZG9pbmcuCisKKyAgIHNhZmVpbnQJVXNlIElOVCAxNWggYWNjZXNzIHRvIHByb3RlY3RlZCBtZW1vcnksIGJ1dCBpbnZva2UKKwkJSU5UIDE1aCB0aGUgd2F5IGl0IHdhcyAqYmVmb3JlKiBNRU1ESVNLIHdhcyBsb2FkZWQuCisJCVRoaXMgaXMgdGhlIGRlZmF1bHQgc2luY2UgdmVyc2lvbiAzLjczLgorCitlKSBNRU1ESVNLIGJ5IGRlZmF1bHQgc3VwcG9ydHMgRUREL0VCSU9TIG9uIGhhcmQgZGlza3MsIGJ1dCBub3Qgb24KKyAgIGZsb3BweSBkaXNrcy4gIFRoaXMgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgb3B0aW9uczoKKworICAgZWRkCQlFbmFibGUgRUREL0VCSU9TCisgICBub2VkZAlEaXNhYmxlIEVERC9FQklPUworCitmKSBUaGUgZm9sbG93aW5nIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBwYXVzZSB0byB2aWV3IHRoZSBtZXNzYWdlczoKKworICAgcGF1c2UJV2FpdCBmb3IgYSBrZXlwcmVzcyByaWdodCBiZWZvcmUgYm9vdGluZworCitnKSBUaGUgZm9sbG93aW5nIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHJlYWwtbW9kZSBzdGFjayBzaXplLgorICAgVGhlIGRlZmF1bHQgaXMgNTEyIGJ5dGVzLCBidXQgaWYgdGhlcmUgaXMgYSBmYWlsdXJlIGl0IG1pZ2h0IGJlCisgICBpbnRlcmVzdGluZyB0byBzZXQgaXQgdG8gc29tZXRoaW5nIGxhcmdlcjoKKworICAgc3RhY2s9c2l6ZSAgIFNldCB0aGUgc3RhY2sgdG8gInNpemUiIGJ5dGVzCisKK2gpIFNvbWUgc3lzdGVtcyB3aXRob3V0IGEgZmxvcHB5IGRyaXZlIGhhdmUgYmVlbiBrbm93biB0byBoYXZlCisgICBwcm9ibGVtcyB3aXRoIGZsb3BweSBpbWFnZXMuICBUbyBhdm9pZCB0aGF0IHRob3NlIHByb2JsZW1zLCBmaXJzdAorICAgb2YgYWxsIG1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhIGZsb3BweSBkcml2ZSBjb25maWd1cmVkIG9uIHRoZQorICAgQklPUyBzY3JlZW4uICBJZiB0aGVyZSBpcyBubyBvcHRpb24gdG8gY29uZmlndXJlIHRoYXQsIG9yIHRoYXQKKyAgIGRvZXNuJ3Qgd29yaywgeW91IGNhbiB1c2UgdGhlIG9wdGlvbjoKKworICAgbm9wYXNzCUhpZGUgYWxsIHJlYWwgZHJpdmVzIG9mIHRoZSBzYW1lIHR5cGUgKGZsb3BweSBvciBoYXJkIGRpc2spCisgICBub3Bhc3NhbnkgICAgSGlkZSBhbGwgcmVhbCBkcml2ZXMgKGZsb3BweSBhbmQgaGFyZCBkaXNrKQorCitpKSBUaGUgZm9sbG93aW5nIHN0YW5kYXJkIExpbnV4IG9wdGlvbiB3aWxsIG1hcmsgbWVtb3J5IGFzIHJlc2VydmVkLgorICAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgU3lzbGludXggY29yZSBhbHJlYWR5IGxvYWRzIE1FTURJU0sgYW5kIGl0cworICAgaW5pdHJkIGJlbG93IHRoaXMgcG9pbnQ6CisKKyAgIG1lbT1zaXplCU1hcmsgYXZhaWxhYmxlIG1lbW9yeSBhYm92ZSB0aGlzIHBvaW50IGFzIFJlc2VydmVkLgorCisKK1NvbWUgaW50ZXJlc3RpbmcgdGhpbmdzIHRvIG5vdGU6CisKK0lmIHlvdSdyZSB1c2luZyBNRU1ESVNLIHRvIGJvb3QgRE9TIGZyb20gYSBDRC1ST00gKHVzaW5nIElTT0xJTlVYKSwKK3lvdSBtaWdodCBmaW5kIHRoZSBnZW5lcmljIEVsIFRvcml0byBDRC1ST00gZHJpdmVyIGJ5IEdhcnkgVG9uZyBhbmQKK0JhcnQgTGFnZXJ3ZWlqIHVzZWZ1bC4gIEl0IGlzIG5vdyBpbmNsdWRlZCB3aXRoIHRoZSBTeXNsaW51eAorZGlzdHJpYnV0aW9uLCBpbiB0aGUgZG9zdXRpbCBkaXJlY3RvcnkuICBTZWUgdGhlIGZpbGUKK2Rvc3V0aWwvZWx0b3JpdG8udHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitTaW1pbGFybHksIGlmIHlvdSdyZSBib290aW5nIERPUyBvdmVyIHRoZSBuZXR3b3JrIHVzaW5nIFBYRUxJTlVYLCB5b3UKK2NhbiB1c2UgdGhlICJrZWVwcHhlIiBvcHRpb24gYW5kIHVzZSB0aGUgZ2VuZXJpYyBQWEUgKFVOREkpIE5ESVMKK25ldHdvcmsgZHJpdmVyLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBQUk9CT09ULkVYRSBkaXN0cmlidXRpb24gZnJvbQorSW50ZWw6CisKKwlodHRwOi8vd3d3LmludGVsLmNvbS9zdXBwb3J0L25ldHdvcmsvYWRhcHRlci8xMDAwL3NvZnR3YXJlLmh0bQorCisKK0FkZGl0aW9uYWwgdGVjaG5pY2FsIGluZm9ybWF0aW9uOgorCitTdGFydGluZyB3aXRoIHZlcnNpb24gMi4wOCwgTUVNRElTSyBub3cgc3VwcG9ydHMgYW4gaW5zdGFsbGF0aW9uIGNoZWNrCitBUEkuICBUaGlzIHdvcmtzIGFzIGZvbGxvd3M6CisKKwlFQVggPSA0NTREMDh4eGggKCJNRSIpICgwOGggPSBwYXJhbWV0ZXIgcXVlcnkpCisJRUNYID0gNDQ0RHh4eHhoICgiTUQiKQorCUVEWCA9IDUzNDl4eG5uaAkoIklTIikgKG5uID0gZHJpdmUgIykKKwlFQlggPSAzRjRCeHh4eGggKCJLPyIpCisJSU5UIDEzaAorCitJZiBkcml2ZSBubiBpcyBhIE1FTURJU0ssIHRoZSByZWdpc3RlcnMgd2lsbCBjb250YWluOgorCisJRUFYID0gNEQyMXh4eHhoCSgiIU0iKQorCUVDWCA9IDRENDV4eHh4aCAoIkVNIikKKwlFRFggPSA0OTQ0eHh4eGggKCJESSIpCisJRUJYID0gNEI1M3h4eHhoICgiU0siKQorCisJRVM6REkgLT4gTUVNRElTSyBpbmZvIHN0cnVjdHVyZXMKKworVGhlIGxvdyBwYXJ0cyBvZiBFQVgvRUNYL0VEWC9FQlggaGF2ZSB0aGUgbm9ybWFsIHJldHVybiB2YWx1ZXMgZm9yIElOVAorMTNoLCBBSD0wOGgsIGkuZS4gaW5mb3JtYXRpb24gb2YgdGhlIGRpc2sgZ2VvbWV0cnkgZXRjLgorCitTZWUgUmFsZiBCcm93bidzIGludGVycnVwdCBsaXN0LAoraHR0cDovL3d3dy5jcy5jbXUuZWR1L2Fmcy9jcy5jbXUuZWR1L3VzZXIvcmFsZi9wdWIvV1dXL2ZpbGVzLmh0bWwgb3IKK2h0dHA6Ly93d3cuY3R5bWUuY29tL3Jicm93bi5odG0sIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLgorCitUaGUgTUVNRElTSyBpbmZvIHN0cnVjdHVyZSBjdXJyZW50bHkgY29udGFpbnM6CisKKwlbRVM6REldCQl3b3JkCVRvdGFsIHNpemUgb2Ygc3RydWN0dXJlIChjdXJyZW50bHkgMzAgYnl0ZXMpCisJW0VTOkRJKzJdCWJ5dGUJTUVNRElTSyBtaW5vciB2ZXJzaW9uCisJW0VTOkRJKzNdCWJ5dGUJTUVNRElTSyBtYWpvciB2ZXJzaW9uCisJW0VTOkRJKzRdCWR3b3JkCVBvaW50ZXIgdG8gTUVNRElTSyBkYXRhIGluIGhpZ2ggbWVtb3J5CisJW0VTOkRJKzhdCWR3b3JkCVNpemUgb2YgTUVNRElTSyBkYXRhIGluIHNlY3RvcnMKKwlbRVM6REkrMTJdCTE2OjE2CUZhciBwb2ludGVyIHRvIGNvbW1hbmQgbGluZQorCVtFUzpESSsxNl0JMTY6MTYJT2xkIElOVCAxM2ggcG9pbnRlcgorCVtFUzpESSsyMF0JMTY6MTYJT2xkIElOVCAxNWggcG9pbnRlcgorCVtFUzpESSsyNF0Jd29yZAlBbW91bnQgb2YgRE9TIG1lbW9yeSBiZWZvcmUgTUVNRElTSyBsb2FkZWQKKwlbRVM6REkrMjZdCWJ5dGUJQm9vdCBsb2FkZXIgSUQKKwlbRVM6REkrMjddCWJ5dGUJU2VjdG9yIHNpemUgYXMgYSBwb3dlciBvZiAyCisJCQkJKElmIHplcm8sIGFzc3VtZSA1MTItYnl0ZSBzZWN0b3JzKQorCVtFUzpESSsyOF0Jd29yZAlJZiBub256ZXJvLCBvZmZzZXQgKHZzIEVTKSB0byBpbnN0YWxsZWQgRFBUCisJCQkJVGhpcyBwb2ludGVyKzE2IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBJTlQgMUVoCisKK1NpemVzIG9mIHRoaXMgc3RydWN0dXJlOgorCiszLjcxKwkJMzAgYnl0ZXMJQWRkZWQgRFBUIHBvaW50ZXIKKzMuMDAtMy43MAkyNyBieXRlcwlBZGRlZCBib290IGxvYWRlciBJRAorcHJlLTMuMDAJMjYgYnl0ZXMKKworSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBhdmFpbGFibGUgYXQgW0VTOjBdOgorCisJW0VTOjBdCQl3b3JkCU9mZnNldCBvZiBJTlQgMTNoIHJvdXRpbmUgKHNlZ21lbnQgPT0gRVMpCisJW0VTOjJdCQl3b3JkCU9mZnNldCBvZiBJTlQgMTVoIHJvdXRpbmUgKHNlZ21lbnQgPT0gRVMpCisKK1RoZSBwcm9ncmFtIG1kaXNrY2hrLmMgaW4gdGhlIHNhbXBsZSBkaXJlY3RvcnkgaXMgYW4gZXhhbXBsZSBvbiBob3cKK3RoaXMgQVBJIGNhbiBiZSB1c2VkLgorCitUaGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQgdG8gImRpc2FibGUiIE1FTURJU0suICBOb3RlIHRoYXQgaXQKK2RvZXMgbm90IGZyZWUgdGhlIGhhbmRsZXIgaW4gRE9TIG1lbW9yeSwgYW5kIHRoYXQgcnVubmluZyB0aGlzIGZyb20KK0RPUyB3aWxsIHByb2JhYmx5IGNyYXNoIHlvdXIgbWFjaGluZSAoRE9TIGRvZXNuJ3QgbGlrZSBkcml2ZXMgc3VkZGVubHkKK2Rpc2FwcGVhcmluZyBmcm9tIHVuZGVybmVhdGguKSAgVGhpcyBpcyBhbHNvIG5vdCBuZWNlc3NhcmlseSB0aGUgYmVzdAorbWV0aG9kIGZvciB0aGlzLgorCisJbW92IGVheCwgNDU0RDA4MDBoCisJbW92IGVjeCwgNDQ0RDAwMDBoCisJbW92IGVkeCwgNTM0OTAwMDBoCisJbW92IGRsLGRyaXZlX251bWJlcgorCW1vdiBlYngsIDNGNEIwMDAwaAorCWludCAxM2gKKworCXNociBlYXgsIDE2CisJY21wIGF4LCA0RDIxaAorCWpuZSBub3RfbWVtZGlzaworCXNociBlY3gsIDE2CisJY21wIGN4LCA0RDQ1aAorCWpuZSBub3RfbWVtZGlzaworCXNociBlZHgsIDE2CisJY21wIGR4LCA0OTQ0aAorCWpuZSBub3RfbWVtZGlzaworCXNociBlYngsIDE2CisJY21wIGJ4LCA0QjUzaAorCWpuZSBub3RfbWVtZGlzaworCisJY2xpCisJbW92IGJ4LFtlczowXQkJOyBJTlQgMTNoIGhhbmRsZXIgb2Zmc2V0CisJbW92IGVheCxbZXM6ZGkrMTZdCTsgT2xkIElOVCAxM2ggaGFuZGxlcgorCW1vdiBieXRlIFtlczpieF0sIDBFQWgJOyBGQVIgSk1QCisJbW92IFtlczpieCsxXSwgZWF4CisKKwltb3YgYngsW2VzOjJdCQk7IElOVCAxNWggaGFuZGxlciBvZmZzZXQKKwltb3YgZWF4LFtlczpkaSsyMF0JOyBPbGQgSU5UIDE1aCBoYW5kbGVyCisJbW92IGJ5dGUgW2VzOmJ4XSwgMEVBaAk7IEZBUiBKTVAKKwltb3YgW2VzOmJ4KzFdLCBlYXgKKwlzdGkKKworTUVNRElTSyBzdXBwb3J0cyB0aGUgV2luOXggInNhZmUgaG9vayIgc3RydWN0dXJlIGZvciBPUyBkZXRlY3Rpb24uCisoU2VlICJTYWZlIE1hc3RlciBCb290IFJlY29yZCBJTlQgMTNoIEhvb2sgUm91dGluZXMsIiBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cub3Nyb25saW5lLmNvbS9kZGt4L3c5OGRkay9zdG9yYWdlXzVsNmcuaHRtIGFzIG9mCitEZWNlbWJlciA3dGgsIDIwMDkuKSAgQW4gT1MgZHJpdmVyIGNhbiB0YWtlIGEgbG9vayBhdCB0aGUgSU5UZXJydXB0IHRhYmxlCithbmQgdHJ5IHRvIHdhbGsgYWxvbmcgdGhlIGNoYWluIG9mIHRob3NlIGhvb2tzIHRoYXQgaW1wbGVtZW50IHRoZSAic2FmZSBob29rIgorc3RydWN0dXJlLiAgRm9yIGVhY2ggaG9vayBkaXNjb3ZlcmVkLCBhIHZlbmRvciBjYW4gYmUgaWRlbnRpZmllZCBhbmQgdGhlIE9TCitkcml2ZXIgY2FuIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uLiAgVGhlIE9TIGRyaXZlciBjYW4gbWFyayB0aGUgImZsYWdzIiBmaWVsZAorb2YgdGhlICJzYWZlIGhvb2siIHRvIGluZGljYXRlIHRoYXQgdGhlIGRyaXZlciBoYXMgcmV2aWV3ZWQgaXQgYWxyZWFkeS4gIFRoaXMKK3ByZXZlbnRzIGFjY2lkZW50YWwgcmUtZGV0ZWN0aW9uLCBmb3IgZXhhbXBsZS4KKworTUVNRElTSyBhZGRzIG9uZSBhZGRpdGlvbmFsIGV4dGVuc2lvbiBmaWVsZCB0byB0aGUgInNhZmUgaG9vayIgc3RydWN0dXJlLCBhCitwb2ludGVyIHRvIGEgc3BlY2lhbCBNRU1ESVNLIHN0cnVjdHVyZSBjYWxsZWQgdGhlICJtQkZULiIgIFRoZSBtQkZUIGlzIHRoZQorIk1FTURJU0sgQm9vdCBGaXJtd2FyZSBUYWJsZSIgKGFraW4gdG8gdGhlIGlTQ1NJIGlCRlQgYW5kIHRoZSBBb0UgYUJGVCkuICBBbgorT1MgZHJpdmVyIGxvb2tpbmcgYXQgTUVNRElTSydzICJzYWZlIGhvb2siIHNob3VsZCBrbm93IHRoYXQgdGhpcyBmaWVsZCB3aWxsCitiZSBwcmVzZW50IGJhc2VkIG9uIHRoZSBmYWN0IHRoYXQgTUVNRElTSyBpcyB0aGUgdmVuZG9yIGlkZW50aWZpZXIuCisKK1RoZSBtQkZUIGlzIGxpdHRsZSBtb3JlIHRoYW4gYW4gQUNQSSB0YWJsZSB0byBwcmVmaXggTUVNRElTSydzIHRyYWRpdGlvbmFsCitNRU1ESVNLIGluZm8gc3RydWN0dXJlICh0aGUgIk1ESSIpLiAgVGhlIEFDUEkgdGFibGUncyBkZXRhaWxzIGFyZToKKworICBPRU0gSUQuIC4gLiAuOiBNRU1EU0sKKyAgT0VNIFRhYmxlIElEIDogU3lzbGludXgKKworVGhlcmUgaXMgYSAxLWJ5dGUgY2hlY2tzdW0gZmllbGQgd2hpY2ggY292ZXJzIHRoZSBsZW5ndGggb2YgdGhlIG1CRlQgYWxsCit0aGUgd2F5IHRocm91Z2ggdG8gdGhlIGVuZCBvZiB0aGUgTUVNRElTSyBpbmZvIHN0cnVjdHVyZS4KKworVGhlcmUgaXMgYWxzbyBhIHBoeXNpY2FsIHBvaW50ZXIgdG8gdGhlICJzYWZlIGhvb2siIHN0cnVjdHVyZSBhc3NvY2lhdGVkCit3aXRoIHRoZSBNRU1ESVNLIGluc3RhbmNlLiAgQW4gT1MgZHJpdmVyIG1pZ2h0IHVzZSB0aGUgZm9sbG93aW5nIGxvZ2ljOgorCisgIDEuIFdhbGsgSU5UIDEzaCAic2FmZSBob29rIiBjaGFpbiBhcyBmYXIgYXMgcG9zc2libGUsIG1hcmtpbmcgaG9va3MgYXMKKyAgICAgaGF2aW5nIGJlZW4gcmV2aWV3ZWQuICBGb3IgTUVNRElTSyBob29rcywgdGhlIGRyaXZlciB0aGVuIGZvbGxvd3MgdGhlCisgICAgIHBvaW50ZXIgdG8gdGhlIG1CRlQgYW5kIGdhdGhlcnMgdGhlIFJBTSBkaXNrIGRldGFpbHMgZnJvbSB0aGUgaW5jbHVkZWQKKyAgICAgTURJLgorICAyLiBUaGUgT1MgZHJpdmVyIHNjYW5zIGxvdyBtZW1vcnkgZm9yIHZhbGlkIG1CRlRzLiAgTUVNRElTSyBpbnN0YW5jZXMgdGhhdAorICAgICBoYXZlIGJlZW4gImRpc2Nvbm5lY3RlZCIgZnJvbSB0aGUgSU5UIDEzaCAic2FmZSBob29rIiBjaGFpbiBjYW4gYmUgdGh1cworICAgICBkaXNjb3ZlcmVkLiAgTG9va2luZyBhdCB0aGVpciBhc3NvY2lhdGVkICJzYWZlIGhvb2siIHN0cnVjdHVyZSB3aWxsCisgICAgIHJldmVhbCBpZiB0aGV5IHdlcmUgaW5kZWVkIHJldmlld2VkIGJ5IHRoZSBwcmV2aW91cyBzdGFnZS4KZGlmZiAtLWdpdCBhL2RvYy9tZW51LnR4dCBiL2RvYy9tZW51LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTk5OWNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21lbnUudHh0CkBAIC0wLDAgKzEsNTg1IEBACitUaGVyZSBhcmUgdHdvIG1lbnUgc3lzdGVtcyBpbmNsdWRlZCB3aXRoIFN5c2xpbnV4LCB0aGUgYWR2YW5jZWQgbWVudQorc3lzdGVtLCBhbmQgdGhlIHNpbXBsZSBtZW51IHN5c3RlbS4KKworCisrKysgVEhFIEFEVkFOQ0VEIE1FTlUgU1lTVEVNICsrKworCitUaGUgYWR2YW5jZWQgbWVudSBzeXN0ZW0sIHdyaXR0ZW4gYnkgTXVyYWxpIEtyaXNobmFuIEdhbmFwYXRoeSwgaXMKK2xvY2F0ZWQgaW4gdGhlIG1lbnUvIHN1YmRpcmVjdGx5LiAgSXQgYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZQoraGllcmFyY2hpYWwgc3VibWVudXMsIGR5bmFtaWMgb3B0aW9ucywgY2hlY2tib3hlcywgYW5kIGp1c3QgYWJvdXQKK2FueXRoaW5nIHlvdSB3YW50LiAgSXQgcmVxdWlyZXMgdGhhdCB0aGUgbWVudSBpcyBjb21waWxlZCBmcm9tIGEKK3NpbXBsZSBDIGZpbGUsIHNlZSBtZW51L3NpbXBsZS5jIGFuZCBtZW51L2NvbXBsZXguYyBmb3IgZXhhbXBsZXMuCisKK1RoZSBhZHZhbmNlZCBtZW51IHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgc2VyaWFsIGNvbnNvbGUgYXQgdGhpcyB0aW1lLgorCitTZWUgbWVudS9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKworKysrIFRIRSBTSU1QTEUgTUVOVSBTWVNURU0gKysrCisKK1RoZSBzaW1wbGUgbWVudSBzeXN0ZW0gaXMgYSBzaW5nbGUgbW9kdWxlIGxvY2F0ZWQgYXQKK2NvbTMyL21lbnUvdmVzYW1lbnUuYzMyIChncmFwaGljYWwpIG9yIGNvbTMyL21lbnUvbWVudS5jMzIgKHRleHQKK21vZGUgb25seSkuICBJdCB1c2VzIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gZmlsZSBhcyB0aGUgcmVndWxhcgorU3lzbGludXggY29tbWFuZCBsaW5lLCBhbmQgZGlzcGxheXMgYWxsIHRoZSBMQUJFTCBzdGF0ZW1lbnRzLgorCitUbyB1c2UgdGhlIG1lbnUgc3lzdGVtLCBzaW1wbHkgbWFrZSBzdXJlIFt2ZXNhXW1lbnUuYzMyIGlzIGluIHRoZQorYXBwcm9wcmlhdGUgbG9jYXRpb24gZm9yIHlvdXIgYm9vdCBtZWRpdW0gKHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZSBmb3IgU1lTTElOVVgsIEVYVExJTlVYIGFuZCBJU09MSU5VWCwgYW5kIHRoZSBzYW1lCitkaXJlY3RvcnkgYXMgcHhlbGludXguMCBmb3IgUFhFTElOVVgpLCBhbmQgcHV0IHRoZSBmb2xsb3dpbmcgb3B0aW9ucworaW4geW91ciBjb25maWd1cmF0aW9uIGZpbGU6CisKK1VJIG1lbnUuYzMyCisKKworVGhlcmUgYXJlIGEgZmV3IG1lbnUgYWRkaXRpb25zIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIGFsbCBzdGFydGluZword2l0aCB0aGUga2V5d29yZHMgTUVOVSBvciBURVhUOyBsaWtlIHRoZSByZXN0IG9mIHRoZSBTeXNsaW51eCBjb25maWcKK2ZpbGUgbGFuZ3VhZ2UsIGl0IGlzIGNhc2UgaW5zZW5zaXRpdmU6CisKKworTUVOVSBUSVRMRSB0aXRsZQorCisJR2l2ZSB0aGUgbWVudSBhIHRpdGxlLiAgVGhlIHRpdGxlIGlzIHByZXNlbnRlZCBhdCB0aGUgdG9wIG9mCisJdGhlIG1lbnUuCisKKworTUVOVSBISURERU4KKworCURvIG5vdCBkaXNwbGF5IHRoZSBhY3R1YWwgbWVudSB1bmxlc3MgdGhlIHVzZXIgcHJlc3NlcyBhIGtleS4KKwlBbGwgdGhhdCBpcyBkaXNwbGF5ZWQgaXMgYSB0aW1lb3V0IG1lc3NhZ2UuCisKKworTUVOVSBISURERU5LRVkga2V5WyxrZXkuLi5dIGNvbW1hbmQuLi4KKworCUlmIHRoZXkga2V5IHVzZWQgdG8gaW50ZXJydXB0IE1FTlUgSElEREVOIGlzIDxrZXk+LCB0aGVuCisJZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaW5zdGVhZCBvZiBkaXNwbGF5aW5nIHRoZSBtZW51LgorCisJQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nIGtleSBuYW1lcyBhcmUgcmVjb2duaXplZDoKKworCUJhY2tzcGFjZSwgVGFiLCBFbnRlciwgRXNjLCBTcGFjZSwgRjEuLkYxMiwgVXAsIERvd24sIExlZnQsCisJUmlnaHQsIFBnVXAsIFBnRG4sIEhvbWUsIEVuZCwgSW5zZXJ0LCBEZWxldGUKKworCS4uLiBpbiBhZGRpdGlvbiB0byBhbGwgc2luZ2xlIGNoYXJhY3RlcnMgcGx1cyB0aGUgc3ludGF4IF5YCisJZm9yIEN0cmwtWC4gIE5vdGUgdGhhdCBzaW5nbGUgY2hhcmFjdGVycyBhcmUgdHJlYXRlZCBhcyBjYXNlCisJc2Vuc2l0aXZlLCBzbyBhIGRpZmZlcmVudCBjb21tYW5kIGNhbiBiZSBib3VuZCB0byAiQSIgdGhhbgorCSJhIi4gIE9uZSBjYW4gYmluZCB0aGUgc2FtZSBjb21tYW5kIHRvIG11bHRpcGxlIGtleXMgYnkgZ2l2aW5nCisJYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXlzOgorCisJbWVudSBoaWRkZW5rZXkgQSxhIGtleV9hX2NvbW1hbmQKKworCitNRU5VIENMRUFSCisKKwlDbGVhciB0aGUgc2NyZWVuIHdoZW4gZXhpdGluZyB0aGUgbWVudSwgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZQorCW1lbnUgZGlzcGxheWVkLiAgRm9yIHZlc2FtZW51LCB0aGlzIG1lYW5zIHRoZSBncmFwaGljYWwKKwliYWNrZ3JvdW5kIGlzIHN0aWxsIGRpc3BsYXllZCB3aXRob3V0IHRoZSBtZW51IGl0c2VsZiBmb3IgYXMKKwlsb25nIGFzIHRoZSBzY3JlZW4gcmVtYWlucyBpbiBncmFwaGljcyBtb2RlLgorCisKK01FTlUgU0hJRlRLRVkKKworCUV4aXQgdGhlIG1lbnUgc3lzdGVtIGltbWVkaWF0ZWx5IHVubGVzcyBlaXRoZXIgdGhlIFNoaWZ0IG9yIEFsdAorCWtleSBpcyBwcmVzc2VkLCBvciBDYXBzIExvY2sgb3IgU2Nyb2xsIExvY2sgaXMgc2V0LgorCisKK01FTlUgU0VQQVJBVE9SCisKKwlJbnNlcnQgYW4gZW1wdHkgbGluZSBpbiB0aGUgbWVudS4KKworCitNRU5VIExBQkVMIGxhYmVsCisKKwkoT25seSB2YWxpZCBhZnRlciBhIExBQkVMIHN0YXRlbWVudC4pCisJQ2hhbmdlcyB0aGUgbGFiZWwgZGlzcGxheWVkIGZvciBhIHNwZWNpZmljIGVudHJ5LiAgVGhpcyBhbGxvd3MKKwl5b3UgdG8gaGF2ZSBhIGxhYmVsIHRoYXQgaXNuJ3Qgc3VpdGFibGUgZm9yIHRoZSBjb21tYW5kIGxpbmUsCisJZm9yIGV4YW1wbGU6CisKKwkjIFNvZnQgQ2FwIExpbnV4CisJTEFCRUwgc29mdGNhcAorCQlNRU5VIExBQkVMIFNvZnQgQ2FwIF5MaW51eCA5LjYuMzYKKwkJS0VSTkVMIHNvZnRjYXAtOS42LjM2LmJ6aQorCQlBUFBFTkQgd2hhdGV2ZXIKKworCSMgQSB2ZXJ5IGRlbnNlIG9wZXJhdGluZyBzeXN0ZW0KKwlMQUJFTCBicmljaworCQlNRU5VIExBQkVMIF5XaW5kb3dzIENFL01FL05UCisJCUtFUk5FTCBjaGFpbi5jMzIKKwkJQVBQRU5EIGhkMCAyCisKKwlUaGUgXiBzeW1ib2wgaW4gYSBNRU5VIExBQkVMIHN0YXRlbWVudCBkZWZpbmVzIGEgaG90a2V5LgorCVRoZSBob3RrZXkgd2lsbCBiZSBoaWdobGlnaHRlZCBpbiB0aGUgbWVudSBhbmQgd2lsbCBtb3ZlIHRoZQorCW1lbnUgY3Vyc29yIGltbWVkaWF0ZWx5IHRvIHRoYXQgZW50cnkuCisKKwlSZXVzaW5nIGhvdGtleXMgaXMgZGlzYWxsb3dlZCwgc3Vic2VxdWVudCBlbnRyaWVzIHdpbGwgbm90IGJlCisJaGlnaGxpZ2h0ZWQsIGFuZCB3aWxsIG5vdCB3b3JrLgorCisJS2VlcCBpbiBtaW5kIHRoYXQgdGhlIExBQkVMcywgbm90IE1FTlUgTEFCRUxzLCBtdXN0IGJlIHVuaXF1ZSwKKwlvciBvZGQgdGhpbmdzIHdpbGwgaGFwcGVuIHRvIHRoZSBjb21tYW5kLWxpbmUuCisKKworTUVOVSBJTkRFTlQgY291bnQKKworCShPbmx5IHZhbGlkIGFmdGVyIGEgTEFCRUwgc3RhdGVtZW50LikKKwlXaWxsIGFkZCAiY291bnQiIHNwYWNlcyBpbiBmcm9udCBvZiB0aGUgZGlzcGxheWVkIG1lbnUgZW50cnkuCisKKworTUVOVSBESVNBQkxFCisKKwkoT25seSB2YWxpZCBhZnRlciBhIExBQkVMIHN0YXRlbWVudC4pCisJTWFrZXMgdGhlIGVudHJ5IHVuc2VsZWN0YWJsZS4gIFRoaXMgYWxsb3dzIHlvdSB0byBtYWtlIGEKKwlzZWN0aW9uIGluIHlvdXIgbWVudSB3aXRoIGRpZmZlcmVudCBvcHRpb25zIGJlbG93IGl0LgorCWZvciBleGFtcGxlOgorCisJIyBFbnRyaWVzIGZvciBuZXR3b3JrIGJvb3RzCisJTEFCRUwgLQorCQlNRU5VIExBQkVMIE5ldHdvcms6CisJCU1FTlUgRElTQUJMRQorCisJIyBTb2Z0IENhcCBMaW51eAorCUxBQkVMIHNvZnRjYXAKKwkJTUVOVSBMQUJFTCBTb2Z0IENhcCBeTGludXggOS42LjM2CisJCU1FTlUgSU5ERU5UIDEKKwkJS0VSTkVMIHNvZnRjYXAtOS42LjM2LmJ6aQorCQlBUFBFTkQgd2hhdGV2ZXIKKworCSMgRG9zIDYuMjIKKwlMQUJFTCBkb3MKKwkJTUVOVSBMQUJFTCBeRG9zIDYuMjIKKwkJTUVOVSBJTkRFTlQgMQorCQlLRVJORUwgbWVtZGlzaworCQlBUFBFTkQgaW5pdHJkPWRvczYyMi5pbXoKKworCSMgU2VwYXJhdG9yCisJTUVOVSBTRVBBUkFUT1IKKworCSMgRW50cmllcyBmb3IgbG9jYWwgYm9vdHMKKwlMQUJFTCAtCisJCU1FTlUgTEFCRUwgTG9jYWw6CisJCU1FTlUgRElTQUJMRQorCisJIyBXaW5kb3dzIDIwMDAKKwlMQUJFTCB3MmsKKwkJTUVOVSBMQUJFTCBeV2luZG93cyAyMDAwCisJCU1FTlUgSU5ERU5UIDEKKwkJS0VSTkVMIGNoYWluLmMzMgorCQlBUFBFTkQgaGQwIDEKKworCSMgV2luZG93cyBYUAorCUxBQkVMIHhwCisJCU1FTlUgTEFCRUwgV2luZG93cyBeWFAKKwkJTUVOVSBJTkRFTlQgMQorCQlLRVJORUwgY2hhaW4uYzMyCisJCUFQUEVORCBoZDAgMgorCitNRU5VIEhJREUKKworCShPbmx5IHZhbGlkIGFmdGVyIGEgTEFCRUwgc3RhdGVtZW50LikKKwlTdXBwcmVzc2VzIGEgcGFydGljdWxhciBMQUJFTCBlbnRyeSBmcm9tIHRoZSBtZW51LgorCisKK01FTlUgREVGQVVMVAorCisJKE9ubHkgdmFsaWQgYWZ0ZXIgYSBMQUJFTCBzdGF0ZW1lbnQuKQorCisJSW5kaWNhdGVzIHRoYXQgdGhpcyBlbnRyeSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgZm9yIHRoaXMKKwlwYXJ0aWN1bGFyIHN1Ym1lbnUuICBTZWUgYWxzbyB0aGUgREVGQVVMVCBkaXJlY3RpdmUgYmVsb3cuCisKKworVEVYVCBIRUxQCitIZWxwIHRleHQgLi4uCisuLi4gd2hpY2ggY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMKK0VORFRFWFQKKworCShPbmx5IHZhbGlkIGFmdGVyIGEgTEFCRUwgc3RhdGVtZW50LikKKworCVNwZWNpZmllcyBhIGhlbHAgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgd2hlbiBhIHBhcnRpY3VsYXIKKwlzZWxlY3Rpb24gaXMgaGlnaGxpZ2h0ZWQuCisKKworTUVOVSBQQVNTV0QgcGFzc3dkCisKKwkoT25seSB2YWxpZCBhZnRlciBhIExBQkVMIHN0YXRlbWVudC4pCisKKwlTZXRzIGEgcGFzc3dvcmQgb24gdGhpcyBtZW51IGVudHJ5LiAgInBhc3N3ZCIgY2FuIGJlIGVpdGhlciBhCisJY2xlYXJ0ZXh0IHBhc3N3b3JkIG9yIGEgcGFzc3dvcmQgZW5jcnlwdGVkIHdpdGggb25lIG9mIHRoZQorCWZvbGxvd2luZyBhbGdvcml0aG1zOgorCisJTUQ1CQkoU2lnbmF0dXJlOiAkMSQpCisJU0hBLTEJCShTaWduYXR1cmU6ICQ0JCkKKwlTSEEtMi0yNTYJKFNpZ25hdHVyZTogJDUkKQorCVNIQS0yLTUxMgkoU2lnbmF0dXJlOiAkNiQpCisKKwlVc2UgdGhlIGluY2x1ZGVkIFBlcmwgc2NyaXB0cyAic2hhMXBhc3MiIG9yICJtZDVwYXNzIiB0bworCWVuY3J5cHQgcGFzc3dvcmRzLiAgTUQ1IHBhc3N3b3JkcyBhcmUgY29tcGF0aWJsZSB3aXRoIG1vc3QKKwlVbml4IHBhc3N3b3JkIGZpbGUgdXRpbGl0aWVzOyBTSEEtMSBwYXNzd29yZHMgYXJlIHByb2JhYmx5CisJdW5pcXVlIHRvIFN5c2xpbnV4OyBTSEEtMiBwYXNzd29yZHMgYXJlIGNvbXBhdGlibGUgd2l0aCB2ZXJ5CisJcmVjZW50IExpbnV4IGRpc3RyaWJ1dGlvbnMuICBPYnZpb3VzbHksIGlmIHlvdSBkb24ndCBlbmNyeXB0CisJeW91ciBwYXNzd29yZHMgdGhleSB3aWxsIG5vdCBiZSB2ZXJ5IHNlY3VyZSBhdCBhbGwuCisKKwlJZiB5b3UgYXJlIHVzaW5nIHBhc3N3b3JkcywgeW91IHdhbnQgdG8gbWFrZSBzdXJlIHlvdSBhbHNvIHVzZQorCXRoZSBzZXR0aW5ncyAiTk9FU0NBUEUgMSIsICJQUk9NUFQgMCIsIGFuZCBlaXRoZXIgc2V0CisJIkFMTE9XT1BUSU9OUyAwIiBvciB1c2UgYSBtYXN0ZXIgcGFzc3dvcmQgKHNlZSBiZWxvdy4pCisKKwlJZiBwYXNzd2QgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGlzIG1lbnUgZW50cnkgY2FuIG9ubHkgYmUKKwl1bmxvY2tlZCB3aXRoIHRoZSBtYXN0ZXIgcGFzc3dvcmQuCisKKworTUVOVSBNQVNURVIgUEFTU1dEIHBhc3N3ZAorCisJU2V0cyBhIG1hc3RlciBwYXNzd29yZC4gIFRoaXMgcGFzc3dvcmQgY2FuIGJlIHVzZWQgdG8gYm9vdCBhbnkKKwltZW51IGVudHJ5LCBhbmQgaXMgcmVxdWlyZWQgZm9yIHRoZSBbVGFiXSBhbmQgW0VzY10ga2V5cyB0bworCXdvcmsuCisKKworTUVOVSBSRVNPTFVUSU9OIGhlaWdodCB3aWR0aAorCisJUmVxdWVzdHMgYSBzcGVjaWZpYyBzY3JlZW4gcmVzb2x1dGlvbiB3aGVuIGluIGdyYXBoaWNzIG1vZGUuCisJVGhlIGRlZmF1bHQgaXMgIjY0MCA0ODAiIGNvcnJlc3BvbmRpbmcgdG8gYSByZXNvbHV0aW9uIG9mCisJNjQweDQ4MCBwaXhlbHMsIHdoaWNoIGFsbCBWR0EtY29tcGF0aWJsZSBtb25pdG9ycyBzaG91bGQgYmUKKwlhYmxlIHRvIGRpc3BsYXkuCisKKwlJZiB0aGUgc2VsZWN0ZWQgcmVzb2x1dGlvbiBpcyB1bmF2YWlsYWJsZSwgdGhlIHRleHQgbW9kZSBtZW51CisJaXMgZGlzcGxheWVkIGluc3RlYWQuCisKKworTUVOVSBCQUNLR1JPVU5EIGJhY2tncm91bmQKKworCUZvciB2ZXNhbWVudS5jMzIsIHNldHMgdGhlIGJhY2tncm91bmQgaW1hZ2UuICBUaGUgYmFja2dyb3VuZAorCWNhbiBlaXRoZXIgYmUgYSBjb2xvciAoc2VlIE1FTlUgQ09MT1IpIG9yIHRoZSBuYW1lIG9mIGFuIGltYWdlCisJZmlsZSwgd2hpY2ggc2hvdWxkIGJlIHRoZSBzaXplIG9mIHRoZSBzY3JlZW4gKG5vcm1hbGx5IDY0MHg0ODAKKwlwaXhlbHMsIGJ1dCBzZWUgTUVOVSBSRVNPTFVUSU9OKSBhbmQgZWl0aGVyIGluIFBORywgSlBFRyBvcgorCUxTUzE2IGZvcm1hdC4KKworCitNRU5VIEJFR0lOIFt0YWduYW1lXQorTUVOVSBFTkQKKworCUJlZ2luL2VuZCBhIHN1Ym1lbnUuICBUaGUgZW50cmllcyBiZXR3ZWVuIE1FTlUgQkVHSU4gYW5kIE1FTlUKKwlFTkQgZm9ybSBhIHN1Ym1lbnUsIHdoaWNoIGlzIG1hcmtlZCB3aXRoIGEgPiBtYXJrIG9uIHRoZSByaWdodAorCWhhbmQgb2YgdGhlIHNjcmVlbi4gIFN1Ym1lbnVzIGluaGVyaXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlaXIKKwlwYXJlbnQgbWVudXMsIGJ1dCBjYW4gb3ZlcnJpZGUgdGhlbSwgYW5kIGNhbiB0aHVzIGhhdmUgdGhlaXIKKwlvd24gYmFja2dyb3VuZHMsIG1hc3RlciBwYXNzd29yZHMsIHRpdGxlcywgdGltZW91dHMsIG1lc3NhZ2VzCisJYW5kIHNvIGZvcnRoLgorCisKK01FTlUgR09UTyB0YWduYW1lCisKKwkoT25seSB2YWxpZCBhZnRlciBhIExBQkVMIHN0YXRlbWVudC4pCisKKwlUaGlzIGxhYmVsIHdpbGwgdHJhbnNmZXIgdG8gdGhlIG5hbWVkIHN1Ym1lbnUgaW5zdGVhZCBvZgorCWJvb3RpbmcgYW55dGhpbmcuICBUbyB0cmFuc2ZlciB0byB0aGUgdG9wLWxldmVsIG1lbnUsIHNwZWNpZnkKKwkibWVudSBnb3RvIC50b3AiLgorCisKK01FTlUgRVhJVCBbdGFnbmFtZV0KKworCShPbmx5IHZhbGlkIGFmdGVyIGEgbGFiZWwgc3RhdGVtZW50IGluc2lkZSBNRU5VIEJFR0lOIC4uLgorCU1FTlUgRU5EKQorCisJRXhpdCB0byB0aGUgbmV4dCBoaWdoZXIgbWVudSwgb3IsIGlmIHRhZ25hbWUgaXMgc3BlY2lmaWVkLCB0bworCXRoZSBuYW1lZCBtZW51LgorCisKK01FTlUgUVVJVAorCisJKE9ubHkgdmFsaWQgYWZ0ZXIgYSBMQUJFTCBzdGF0ZW1lbnQuKQorCisJVGhpcyBsYWJlbCBxdWl0cyB0aGUgbWVudSBzeXN0ZW0uCisKKwlXQVJOSU5HOiBpZiBNRU5VIE1BU1RFUiBQQVNTV0Qgb3IgQUxMT1dPUFRJT05TIDAgaXMgc2V0LCB0aGlzCisJd2lsbCBzdGlsbCBhbGxvdyBleGl0aW5nIHRvIHRoZSBDTEk7IGhvd2V2ZXIsIGEgc2VwYXJhdGUgTUVOVQorCVBBU1NXRCBjYW4gb2YgY291cnNlIGJlIHNldCBmb3IgdGhpcyBsYWJlbC4KKworCitNRU5VIFNUQVJUCisKKwkoT25seSB2YWxpZCBpbnNpZGUgTUVOVSBCRUdJTiAuLi4gTUVOVSBFTkQpCisKKwlJbmRpY2F0ZXMgdGhhdCB0aGUgbWVudSBzeXN0ZW0gc2hvdWxkIHN0YXJ0IGF0IHRoZSBtZW51IGJlaW5nCisJZGVmaW5lZCBpbnN0ZWFkIG9mIGF0IHRoZSB0b3AtbGV2ZWwgbWVudS4gIFNlZSBhbHNvIHRoZQorCURFRkFVTFQgZGlyZWN0aXZlIGJlbG93LgorCisKK0RFRkFVTFQgbGFiZWwKKworCVNldCB0aGUgZ2xvYmFsIGRlZmF1bHQuICBJZiAibGFiZWwiIHBvaW50cyBpbnRvIGEgc3VibWVudSwKKwl0aGF0IG1lbnUgYmVjb21lcyB0aGUgc3RhcnQgbWVudTsgaW4gb3RoZXIgd29yZHMsIHRoaXMKKwlkaXJlY3RpdmUgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBib3RoIE1FTlUgREVGQVVMVCBhbmQgTUVOVQorCVNUQVJULgorCisJRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBTeXNsaW51eCwKKwl0aGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkIHVubGVzcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFsc28KKwljb250YWlucyBhIFVJIGRpcmVjdGl2ZS4KKworCU5vdGU6IHRoZSBDTEkgYWNjZXB0cyBvcHRpb25zIGFmdGVyIHRoZSBsYWJlbCwgb3IgZXZlbiBhCisJbm9uLWxhYmVsLiAgVGhlIG1lbnUgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhhdC4KKworCitNRU5VIFNBVkUKK01FTlUgTk9TQVZFCisKKwlSZW1lbWJlciB0aGUgbGFzdCBlbnRyeSBzZWxlY3RlZCBhbmQgbWFrZSB0aGF0IHRoZSBkZWZhdWx0IGZvcgorCXRoZSBuZXh0IGJvb3QuICBBIHBhc3N3b3JkLXByb3RlY3RlZCBtZW51IGVudHJ5IGlzICpub3QqCisJc2F2ZWQuICBUaGlzIHJlcXVpcmVzIHRoZSBBRFYgZGF0YSBzdG9yYWdlIG1lY2hhbmlzbSwgd2hpY2ggaXMKKwljdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCBmb3IgRVhUTElOVVgsIGFsdGhvdWdoIHRoZSBvdGhlcgorCVN5c2xpbnV4IGRlcml2YXRpdmVzIHdpbGwgYWNjZXB0IHRoZSBjb21tYW5kIChhbmQgaWdub3JlIGl0LikKKworCU5PVEU6IE1FTlUgU0FWRSBzdG9yZXMgdGhlIExBQkVMIHRhZyBvZiB0aGUgc2VsZWN0ZWQgZW50cnk7CisJdGhpcyBtZWNoYW5pc20gdGhlcmVmb3JlIHJlbGllcyBvbiBMQUJFTCB0YWdzIGJlaW5nIHVuaXF1ZS4KKwlPbiB0aGUgb3RoZXIgaGFuZCwgaXQgaGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBjb25maWd1cmF0aW9uCisJZmlsZSBncmFjZWZ1bGx5LgorCisJTk9URTogSW4gc29mdHdhcmUgUkFJRC0xIHNldHVwcyBNRU5VIFNBVkUgb25seSBzdG9yZXMgdGhlCisJZGVmYXVsdCBsYWJlbCBvbiB0aGUgYWN0dWFsIGJvb3QgZGlzay4gIFRoaXMgbWF5IGxlYWQgdG8KKwlpbmNvbnNpc3RlbnQgcmVhZHMgZnJvbSB0aGUgYXJyYXksIG9yIHVuZXhwZWN0ZWRseSBjaGFuZ2UgdGhlCisJZGVmYXVsdCBsYWJlbCBhZnRlciBhcnJheSByZXN5bmNocm9uaXphdGlvbiBvciBkaXNrIGZhaWx1cmUuCisKKwlUaGUgTUVOVSBTQVZFIGluZm9ybWF0aW9uIGNhbiBiZSBmdWxseSBjbGVhcmVkIHdpdGgKKwkiZXh0bGludXggLS1yZXNldC1hZHYgPGJvb3RkaXI+Ii4KKworCUEgTUVOVSBTQVZFIG9yIE1FTlUgTk9TQVZFIGF0IHRoZSB0b3Agb2YgYSAoc3ViKW1lbnUgYWZmZWN0cworCWFsbCBlbnRyaWVzIHVuZGVybmVhdGggdGhhdCAoc3ViKW1lbnUgZXhjZXB0IHRob3NlIHRoYXQgaW4KKwl0dXJuIGhhdmUgTUVOVSBTQVZFIG9yIE1FTlUgTk9TQVZFIGRlY2xhcmVkLiAgVGhpcyBjYW4gYmUgdXNlZAorCXRvIG9ubHkgc2F2ZSBjZXJ0YWluIGVudGlyZXMgd2hlbiBzZWxlY3RlZC4KKworCitJTkNMVURFIGZpbGVuYW1lIFt0YWduYW1lXQorTUVOVSBJTkNMVURFIGZpbGVuYW1lIFt0YWduYW1lXQorCisJSW5jbHVkZSB0aGUgY29udGVudHMgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmaWxlbmFtZSBhdAorCXRoaXMgcG9pbnQuCisKKwlJbiB0aGUgY2FzZSBvZiBNRU5VIElOQ0xVREUsIHRoZSBpbmNsdWRlZCBkYXRhIGlzIG9ubHkgc2VlbiBieQorCXRoZSBtZW51IHN5c3RlbTsgdGhlIGNvcmUgc3lzbGludXggY29kZSBkb2VzIG5vdCBwYXJzZSB0aGlzCisJY29tbWFuZCwgc28gYW55IGxhYmVscyBkZWZpbmVkIGluIGl0IGFyZSB1bmF2YWlsYWJsZS4KKworCUlmIGEgdGFnbmFtZSBpcyBpbmNsdWRlZCwgdGhlIHdob2xlIGZpbGUgaXMgY29uc2lkZXJlZCB0byBoYXZlCisJYmVlbiBicmFja2V0ZWQgd2l0aCBhIE1FTlUgQkVHSU4gdGFnbmFtZSAuLi4gTUVOVSBFTkQgcGFpciwKKwlhbmQgd2lsbCB0aGVyZWZvcmUgc2hvdyB1cCBhcyBhIHN1Ym1lbnUuCisKKworTUVOVSBBVVRPQk9PVCBtZXNzYWdlCisKKwlSZXBsYWNlcyB0aGUgbWVzc2FnZSAiQXV0b21hdGljIGJvb3QgaW4gIyBzZWNvbmR7LHN9Li4uIi4gIFRoZQorCXN5bWJvbCAjIGlzIHJlcGxhY2VkIHdpdGggdGhlIG51bWJlciBvZiBzZWNvbmRzIHJlbWFpbmluZy4KKwlUaGUgc3ludGF4ICJ7c2luZ3VsYXIsW2R1YWwsXXBsdXJhbH0iIGNhbiBiZSB1c2VkIHRvIGNvbmp1Z2F0ZQorCWFwcHJvcHJpYXRlbHkuCisKKworTUVOVSBUQUJNU0cgbWVzc2FnZQorCisJUmVwbGFjZXMgdGhlIG1lc3NhZ2UgIlByZXNzIFtUYWJdIHRvIGVkaXQgb3B0aW9ucyIuCisKKworTUVOVSBOT1RBQk1TRyBtZXNzYWdlCisKKwlUYWtlcyB0aGUgcGxhY2Ugb2YgdGhlIFRBQk1TRyBtZXNzYWdlIGlmIG9wdGlvbiBlZGl0aW5nIGlzCisJZGlzYWJsZWQuICBEZWZhdWx0cyB0byBibGFuay4KKworCitNRU5VIFBBU1NQUk9NUFQgbWVzc2FnZQorCisJUmVwbGFjZXMgdGhlIG1lc3NhZ2UgIlBhc3N3b3JkIHJlcXVpcmVkIi4KKworCitNRU5VIENPTE9SIGVsZW1lbnQgYW5zaSBmb3JlZ3JvdW5kIGJhY2tncm91bmQgc2hhZG93CisKKwlTZXRzIHRoZSBjb2xvciBvZiBlbGVtZW50ICJlbGVtZW50IiB0byB0aGUgc3BlY2lmaWVkIGNvbG9yCisJc2VxdWVuY2U6CisKKwlzY3JlZW4gICAgICAgICAgUmVzdCBvZiB0aGUgc2NyZWVuCisJYm9yZGVyICAgICAgICAgIEJvcmRlciBhcmVhCisJdGl0bGUgICAgICAgICAgIFRpdGxlIGJhcgorCXVuc2VsICAgICAgICAgICBVbnNlbGVjdGVkIG1lbnUgaXRlbQorCWhvdGtleSAgICAgICAgICBVbnNlbGVjdGVkIGhvdGtleQorCXNlbCAgICAgICAgICAgICBTZWxlY3Rpb24gYmFyCisJaG90c2VsICAgICAgICAgIFNlbGVjdGVkIGhvdGtleQorCWRpc2FibGVkCURpc2FibGVkIG1lbnUgaXRlbQorCXNjcm9sbGJhciAgICAgICBTY3JvbGwgYmFyCisJdGFibXNnICAgICAgICAgIFByZXNzIFtUYWJdIG1lc3NhZ2UKKwljbWRtYXJrICAgICAgICAgQ29tbWFuZCBsaW5lIG1hcmtlcgorCWNtZGxpbmUgICAgICAgICBDb21tYW5kIGxpbmUKKwlwd2Rib3JkZXIgICAgICAgUGFzc3dvcmQgYm94IGJvcmRlcgorCXB3ZGhlYWRlciAgICAgICBQYXNzd29yZCBib3ggaGVhZGVyCisJcHdkZW50cnkgICAgICAgIFBhc3N3b3JkIGJveCBjb250ZW50cworCXRpbWVvdXRfbXNnICAgICBUaW1lb3V0IG1lc3NhZ2UKKwl0aW1lb3V0ICAgICAgICAgVGltZW91dCBjb3VudGVyCisJaGVscAkJSGVscCB0ZXh0CisJbXNnWFgJCU1lc3NhZ2UgKEYta2V5KSBmaWxlIGF0dHJpYnV0ZSBYWAorCisJLi4uIHdoZXJlIFhYIGlzIHR3byBoZXhhZGVjaW1hbCBkaWdpdHMgKHRoZSAicGxhaW4gdGV4dCIgaXMgMDcpLgorCisJImFuc2kiIGlzIGEgc2VxdWVuY2Ugb2Ygc2VtaWNvbG9uLXNlcGFyYXRlZCBFQ01BLTQ4IFNldAorCUdyYXBoaWNzIFJlbmRpdGlvbiAoPEVTQz5bbSkgc2VxdWVuY2VzOgorCisJMCAgICAgcmVzZXQgYWxsIGF0dHJpYnV0ZXMgdG8gdGhlaXIgZGVmYXVsdHMKKwkxICAgICBzZXQgYm9sZAorCTQgICAgIHNldCB1bmRlcnNjb3JlIChzaW11bGF0ZWQgd2l0aCBjb2xvciBvbiBhIGNvbG9yIGRpc3BsYXkpCisJNSAgICAgc2V0IGJsaW5rCisJNyAgICAgc2V0IHJldmVyc2UgdmlkZW8KKwkyMiAgICBzZXQgbm9ybWFsIGludGVuc2l0eQorCTI0ICAgIHVuZGVybGluZSBvZmYKKwkyNSAgICBibGluayBvZmYKKwkyNyAgICByZXZlcnNlIHZpZGVvIG9mZgorCTMwICAgIHNldCBibGFjayBmb3JlZ3JvdW5kCisJMzEgICAgc2V0IHJlZCBmb3JlZ3JvdW5kCisJMzIgICAgc2V0IGdyZWVuIGZvcmVncm91bmQKKwkzMyAgICBzZXQgYnJvd24gZm9yZWdyb3VuZAorCTM0ICAgIHNldCBibHVlIGZvcmVncm91bmQKKwkzNSAgICBzZXQgbWFnZW50YSBmb3JlZ3JvdW5kCisJMzYgICAgc2V0IGN5YW4gZm9yZWdyb3VuZAorCTM3ICAgIHNldCB3aGl0ZSBmb3JlZ3JvdW5kCisJMzggICAgc2V0IHVuZGVyc2NvcmUgb24sIHNldCBkZWZhdWx0IGZvcmVncm91bmQgY29sb3IKKwkzOSAgICBzZXQgdW5kZXJzY29yZSBvZmYsIHNldCBkZWZhdWx0IGZvcmVncm91bmQgY29sb3IKKwk0MCAgICBzZXQgYmxhY2sgYmFja2dyb3VuZAorCTQxICAgIHNldCByZWQgYmFja2dyb3VuZAorCTQyICAgIHNldCBncmVlbiBiYWNrZ3JvdW5kCisJNDMgICAgc2V0IGJyb3duIGJhY2tncm91bmQKKwk0NCAgICBzZXQgYmx1ZSBiYWNrZ3JvdW5kCisJNDUgICAgc2V0IG1hZ2VudGEgYmFja2dyb3VuZAorCTQ2ICAgIHNldCBjeWFuIGJhY2tncm91bmQKKwk0NyAgICBzZXQgd2hpdGUgYmFja2dyb3VuZAorCTQ5ICAgIHNldCBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IKKworCVRoZXNlIGFyZSB1c2VkIChhKSBpbiB0ZXh0IG1vZGUsIGFuZCAoYikgb24gdGhlIHNlcmlhbAorCWNvbnNvbGUuCisKKwkiZm9yZWdyb3VuZCIgYW5kICJiYWNrZ3JvdW5kIiBhcmUgY29sb3IgY29kZXMgaW4gI0FBUlJHR0JCCisJbm90YXRpb24sIHdoZXJlIEFBIFJSIEdHIEJCIGFyZSBoZXhhZGVjaW1hbCBkaWdpdHMgZm9yIGFscGhhCisJKG9wYWNpdHkpLCByZWQsIGdyZWVuIGFuZCBibHVlLCByZXNwZWN0aXZlbHkuICAjMDAwMDAwMDAKKwlyZXByZXNlbnRzIGZ1bGx5IHRyYW5zcGFyZW50LCBhbmQgI2ZmZmZmZmZmIHJlcHJlc2VudHMgb3BhcXVlCisJd2hpdGUuCisKKwkic2hhZG93IiBjb250cm9scyB0aGUgaGFuZGxpbmcgb2YgdGhlIGdyYXBoaWNhbCBjb25zb2xlIHRleHQKKwlzaGFkb3cuICBQZXJtaXR0ZWQgdmFsdWVzIGFyZSAibm9uZSIgKG5vIHNoYWRvd2luZyksICJzdGQiIG9yCisJInN0YW5kYXJkIiAoc3RhbmRhcmQgc2hhZG93aW5nIC0gZm9yZWdyb3VuZCBwaXhlbHMgYXJlCisJcmFpc2VkKSwgImFsbCIgKGJvdGggYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZCByYWlzZWQpLCBhbmQKKwkicmV2IiBvciAicmV2ZXJzZSIgKGJhY2tncm91bmQgcGl4ZWxzIGFyZSByYWlzZWQuKQorCisJSWYgYW55IGZpZWxkIGlzIHNldCB0byAiKiIgb3Igb21pdHRlZCAoYXQgdGhlIGVuZCBvZiB0aGUgbGluZSkKKwl0aGVuIHRoYXQgZmllbGQgaXMgbGVmdCB1bmNoYW5nZWQuCisKKworCVRoZSBjdXJyZW50IGRlZmF1bHRzIGFyZToKKworCW1lbnUgY29sb3Igc2NyZWVuCTM3OzQwICAgICAgIzgwZmZmZmZmICMwMDAwMDAwMCBzdGQKKwltZW51IGNvbG9yIGJvcmRlcgkzMDs0NCAgICAgICM0MDAwMDAwMCAjMDAwMDAwMDAgc3RkCisJbWVudSBjb2xvciB0aXRsZQkxOzM2OzQ0ICAgICNjMDAwOTBmMCAjMDAwMDAwMDAgc3RkCisJbWVudSBjb2xvciB1bnNlbAkzNzs0NCAgICAgICM5MGZmZmZmZiAjMDAwMDAwMDAgc3RkCisJbWVudSBjb2xvciBob3RrZXkJMTszNzs0NCAgICAjZmZmZmZmZmYgIzAwMDAwMDAwIHN0ZAorCW1lbnUgY29sb3Igc2VsCQk3OzM3OzQwICAgICNlMDAwMDAwMCAjMjBmZjgwMDAgYWxsCisJbWVudSBjb2xvciBob3RzZWwJMTs3OzM3OzQwICAjZTA0MDAwMDAgIzIwZmY4MDAwIGFsbAorCW1lbnUgY29sb3IgZGlzYWJsZWQJMTszMDs0NCAgICAjNjBjY2NjY2MgIzAwMDAwMDAwIHN0ZAorCW1lbnUgY29sb3Igc2Nyb2xsYmFyCTMwOzQ0ICAgICAgIzQwMDAwMDAwICMwMDAwMDAwMCBzdGQKKwltZW51IGNvbG9yIHRhYm1zZwkzMTs0MCAgICAgICM5MGZmZmYwMCAjMDAwMDAwMDAgc3RkCisJbWVudSBjb2xvciBjbWRtYXJrCTE7MzY7NDAgICAgI2MwMDBmZmZmICMwMDAwMDAwMCBzdGQKKwltZW51IGNvbG9yIGNtZGxpbmUJMzc7NDAgICAgICAjYzBmZmZmZmYgIzAwMDAwMDAwIHN0ZAorCW1lbnUgY29sb3IgcHdkYm9yZGVyCTMwOzQ3ICAgICAgIzgwZmZmZmZmICMyMGZmZmZmZiBzdGQKKwltZW51IGNvbG9yIHB3ZGhlYWRlcgkzMTs0NyAgICAgICM4MGZmODA4MCAjMjBmZmZmZmYgc3RkCisJbWVudSBjb2xvciBwd2RlbnRyeQkzMDs0NyAgICAgICM4MGZmZmZmZiAjMjBmZmZmZmYgc3RkCisJbWVudSBjb2xvciB0aW1lb3V0X21zZwkzNzs0MCAgICAgICM4MGZmZmZmZiAjMDAwMDAwMDAgc3RkCisJbWVudSBjb2xvciB0aW1lb3V0CTE7Mzc7NDAgICAgI2MwZmZmZmZmICMwMDAwMDAwMCBzdGQKKwltZW51IGNvbG9yIGhlbHAJCTM3OzQwICAgICAgI2MwZmZmZmZmICMwMDAwMDAwMCBzdGQKKwltZW51IGNvbG9yIG1zZzA3CTM3OzQwICAgICAgIzkwZmZmZmZmICMwMDAwMDAwMCBzdGQKKworCitNRU5VIE1TR0NPTE9SIGZnX2ZpbHRlciBiZ19maWx0ZXIgc2hhZG93CisKKwlTZXRzICphbGwqIHRoZSBtc2dYWCBjb2xvcnMgdG8gYSBjb2xvciBzY2hlbWUgZGVyaXZlZCBmcm9tIHRoZQorCWZnX2ZpbHRlciBhbmQgYmdfZmlsdGVyIHZhbHVlcy4gIEJhY2tncm91bmQgY29sb3IgemVybyBpcworCWFsd2F5cyB0cmVhdGVkIGFzIHRyYW5zcGFyZW50LiAgVGhlIGRlZmF1bHQgY29ycmVzcG9uZHMgdG86CisKKwltZW51IG1zZ2NvbG9yICM5MGZmZmZmZiAjODBmZmZmZmYgc3RkCisKKwlUaGlzIGRpcmVjdGl2ZSBzaG91bGQgY29tZSBiZWZvcmUgYW55IGRpcmVjdGl2ZSB0aGF0CisJY3VzdG9taXplcyBpbmRpdmlkdWFsIG1zZ1hYIGNvbG9ycy4KKworCitNRU5VIFdJRFRIIDgwCitNRU5VIE1BUkdJTiAxMAorTUVOVSBQQVNTV09SRE1BUkdJTiAzCitNRU5VIFJPV1MgMTIKK01FTlUgVEFCTVNHUk9XIDE4CitNRU5VIENNRExJTkVST1cgMTgKK01FTlUgRU5EUk9XIC0xCitNRU5VIFBBU1NXT1JEUk9XIDExCitNRU5VIFRJTUVPVVRST1cgMjAKK01FTlUgSEVMUE1TR1JPVyAyMgorTUVOVSBIRUxQTVNHRU5EUk9XIC0xCitNRU5VIEhJRERFTlJPVyAtMgorTUVOVSBIU0hJRlQgMAorTUVOVSBWU0hJRlQgMAorCisJVGhlc2Ugb3B0aW9ucyBjb250cm9sIHRoZSBsYXlvdXQgb2YgdGhlIG1lbnUgb24gdGhlIHNjcmVlbi4KKwlUaGUgdmFsdWVzIGFib3ZlIGFyZSB0aGUgZGVmYXVsdHMuCisKKwlBIG5lZ2F0aXZlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBjYWxjdWxhdGVkIGxlbmd0aCBvZiB0aGUKKwlzY3JlZW4gKDI1IGZvciB0ZXh0IG1vZGUsIDI4IGZvciBWRVNBIGdyYXBoaWNzIG1vZGUuKQorCisKK0YxIHRleHRmaWxlIFtiYWNrZ3JvdW5kXQorLi4uCitGMTIgdGV4dGZpbGUgW2JhY2tncm91bmRdCisKKwlEaXNwbGF5cyBmdWxsLXNjcmVlbiBoZWxwIChhbHNvIGF2YWlsYWJsZSBhdCB0aGUgY29tbWFuZCBsaW5lLikKKwlUaGUgc2FtZSBjb250cm9sIGNvZGUgc2VxdWVuY2VzIGFzIGluIHRoZSBjb21tYW5kIGxpbmUKKwlpbnRlcmZhY2UgYXJlIHN1cHBvcnRlZCwgYWx0aG91Z2ggc29tZSBhcmUgaWdub3JlZC4KKworCUFkZGl0aW9uYWxseSwgYSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgYWxsb3dzIGEgZGlmZmVyZW50CisJYmFja2dyb3VuZCBpbWFnZSAoc2VlIE1FTlUgQkFDS0dST1VORCBmb3Igc3VwcG9ydGVkIGZvcm1hdHMpCisJdG8gYmUgZGlzcGxheWVkLgorCisKK01FTlUgSEVMUCB0ZXh0ZmlsZSBbYmFja2dyb3VuZF0KKworCUNyZWF0ZXMgYSBtZW51IGVudHJ5IHdoaWNoLCB3aGVuIHNlbGVjdGVkLCBkaXNwbGF5cworCWZ1bGwtc2NyZWVuIGhlbHAgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBGLWtleSBoZWxwLgorCisKK1RoZSBtZW51IHN5c3RlbSBob25vdXJzIHRoZSBUSU1FT1VUIGNvbW1hbmQ7IGlmIFRJTUVPVVQgaXMgc3BlY2lmaWVkCitpdCB3aWxsIGV4ZWN1dGUgdGhlIE9OVElNRU9VVCBjb21tYW5kIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBpdCB3aWxsCitwaWNrIHRoZSBkZWZhdWx0IG1lbnUgb3B0aW9uLiAgV0FSTklORzogdGhlIHRpbWVvdXQgYWN0aW9uIHdpbGwgYnlwYXNzCitwYXNzd29yZCBwcm90ZWN0aW9uIGV2ZW4gaWYgb25lIGlzIHNldCBmb3IgdGhlIHNwZWNpZmllZCBvciBkZWZhdWx0CitlbnRyeSEKKworTm9ybWFsbHksIHRoZSB1c2VyIGNhbiBwcmVzcyBbVGFiXSB0byBlZGl0IHRoZSBtZW51IGVudHJ5LCBhbmQgW0VzY10KK3RvIHJldHVybiB0byB0aGUgU3lzbGludXggY29tbWFuZCBsaW5lLiAgSG93ZXZlciwgaWYgdGhlIGNvbmZpZ3VyYXRpb24KK2ZpbGUgc3BlY2lmaWVzIEFMTE9XT1BUSU9OUyAwLCB0aGVzZSBrZXlzIHdpbGwgYmUgZGlzYWJsZWQsIGFuZCBpZgorTUVOVSBNQVNURVIgUEFTU1dEIGlzIHNldCwgdGhleSByZXF1aXJlIHRoZSBtYXN0ZXIgcGFzc3dvcmQuCisKK1RoZSBzaW1wbGUgbWVudSBzeXN0ZW0gc3VwcG9ydHMgc2VyaWFsIGNvbnNvbGUsIHVzaW5nIHRoZSBub3JtYWwKK1NFUklBTCBkaXJlY3RpdmUuICBIb3dldmVyLCBpdCBjYW4gYmUgcXVpdGUgc2xvdyBvdmVyIGEgc2xvdyBzZXJpYWwKK2xpbms7IHlvdSBwcm9iYWJseSB3YW50IHRvIHNldCB5b3VyIGJhdWRyYXRlIHRvIDM4NDAwIG9yIGhpZ2hlciBpZgorcG9zc2libGUuICBJdCByZXF1aXJlcyBhIExpbnV4L1ZUMjIwL0FOU0ktY29tcGF0aWJsZSB0ZXJtaW5hbCBvbiB0aGUKK290aGVyIGVuZC4KKworCisJKysrIFVTSU5HIEFOIEFMVEVSTkFURSBDT05GSUdVUkFUSU9OIEZJTEUgKysrCisKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBsb2FkIGEgc2Vjb25kYXJ5IGNvbmZpZ3VyYXRpb24gZmlsZSwgdG8gZ2V0IHRvCithbm90aGVyIG1lbnUuICBUbyBkbyB0aGF0LCBpbnZva2UgbWVudS5jMzIgd2l0aCB0aGUgbmFtZSBvZiB0aGUKK3NlY29uZGFyeSBjb25maWd1cmF0aW9uIGZpbGUuCisKK0xBQkVMIG90aGVybWVudQorCU1FTlUgTEFCRUwgQW5vdGhlciBNZW51CisJS0VSTkVMIG1lbnUuYzMyCisJQVBQRU5EIG90aGVybWVudS5jb25mCisKK0lmIHlvdSBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgZmlsZSwgdGhleSB3aWxsIGFsbCBiZSByZWFkLCBpbiB0aGUgb3JkZXIKK3NwZWNpZmllZC4gIFRoZSBkdW1teSBmaWxlbmFtZSB+ICh0aWxkZSkgaXMgcmVwbGFjZWQgd2l0aCB0aGUgZmlsZW5hbWUKK29mIHRoZSBtYWluIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworIyBUaGUgZmlsZSBncmFwaGljcy5jb25mIGNvbnRhaW5zIGNvbW1vbiBjb2xvciBhbmQgbGF5b3V0IGNvbW1hbmRzIGZvcgorIyBhbGwgbWVudXMuCitMQUJFTCBvdGhlcm1lbnUKKwlNRU5VIExBQkVMIEFub3RoZXIgTWVudQorCUtFUk5FTCB2ZXNhbWVudS5jMzIKKwlBUFBFTkQgZ3JhcGhpY3MuY29uZiBvdGhlcm1lbnUuY29uZgorCisjIFJldHVybiB0byB0aGUgbWFpbiBtZW51CitMQUJFTCBtYWlubWVudQorCU1FTlUgTEFCRUwgUmV0dXJuIHRvIE1haW4gTWVudQorCUtFUk5FTCB2ZXNhbWVudS5jMzIKKwlBUFBFTkQgZ3JhcGhpY3MuY29uZiB+CisKK1NlZSBhbHNvIHRoZSBNRU5VIElOQ0xVREUgZGlyZWN0aXZlIGFib3ZlLgpkaWZmIC0tZ2l0IGEvZG9jL3B4ZWNobi50eHQgYi9kb2MvcHhlY2huLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODUzZDlhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3B4ZWNobi50eHQKQEAgLTAsMCArMSwxMzggQEAKKz0gcHhlY2huLmMzMigxKSA9Cis6ZG9jdHlwZTogbWFucGFnZQorOmF1dGhvcjogR2VuZSBDdW1tCis6ZW1haWw6IGdlbmUuY3VtbUBnbWFpbC5jb20KKzpyZXZkYXRlOiAyMDEyLTA5LTE2CisKKworPT0gTkFNRSA9PQorcHhlY2huLmMzMiAtIENoYWluYm9vdCB0byBuZXcgTmV0d29yayBCb290IFByb2dyYW0gKE5CUCkKKworCis9PSBTWU5PUFNJUyA9PQorW3ZlcnNlXQorKnB4ZWNobi5jMzIqIFstaCB8IC0taGVscCB8IC0/XQorKnB4ZWNobi5jMzIqIC1yICdGSUxFJworKnB4ZWNobi5jMzIqICdGSUxFJyBbJ09QVElPTlMnXQorCisKKz09IERFU0NSSVBUSU9OID09CitDaGFpbmJvb3QgdG8gYSBuZXcgTmV0d29yayBCb290IFByb2dyYW0gKE5CUCkgJ0ZJTEUnIHdpdGggb3B0aW9ucyB0bworYWRqdXN0IFBYRSBwYWNrZXQgIzMgKFBYRU5WX1BBQ0tFVF9UWVBFX0NBQ0hFRF9SRVBMWSkgdG8gYWx0ZXIgZW5kCitiZWhhdmlvci4gICdGSUxFJyBtYXkgYmUgYSBmaWxlbmFtZSwgYW4gSVA6OkZOICgKKzE5Mi4xNjguMS4xOjpwYXRoL3RvL2ZpbGUuMCApLCBvciBVUkwuICAnRklMRScgaXMgcGFyc2VkIHRvIGFkanVzdCB0aGUKK0RIQ1AgJ3NuYW1lJyBmaWVsZC9vcHRpb24gNjYgYW5kICdmaWxlJyBmaWVsZC9vcHRpb24gNjcuCisvLyBidXQgdGhlc2UgbWF5IGJlIG92ZXJyaWRlLWFibGUgaW4gdGhlIGZ1dHVyZS4KKworCis9PSBPUFRJT05TID09CisqLWMqICdDT05GSUcnOjoKKyAgICAnY29uZmlnJyBmaWxlIGZvciBQWEVMSU5VWCAoREhDUCBPcHRpb24gMjA5KS4KKworLy8gKi1mKiAnTU9EJzo6CisvLyAgICAgJ0ZvcmNlJyBiZWhhdmlvciBzcGVjaWZpZWQgYnkgbW9kaWZpZXIgJ01PRCcKKy8vCisvLyAqLWcqICdIT1NUJzo6CisvLyAgICAgU2V0ICdnYXRld2F5Jy9yZWxheSBESENQIGZpZWxkIHRvICdIT1NUJy4gIFBhcnNlZCBieSBweGVfZG5zKCkuCisvLworKi1oKiwgKi0taGVscCosICotPyo6OgorICAgIFByaW50ICdoZWxwJy91c2FnZSBpbmZvcm1hdGlvbjsgaW52YWxpZCBvcHRpb25zIHdpbGwgYWxzbyBjYXVzZQorICAgIHRoaXMuCisKKy8vICotbio6OgorLy8gICAgIFVzZSAnbmF0aXZlJyBtZXRob2RzLCBpZ25vcmluZyB1bmRlcmx5aW5nIGdQWEUvaVBYRS4KKy8vIAorLy8gKi1OKjo6CisvLyAgICAgVXNlICdub24tbmF0aXZlJyBtZXRob2RzIHRvIHV0aWxpemUgZ1BYRS9pUFhFIChpZiBhdmFpbGFibGUpLgorLy8KKyotbyogJ09QVC5UWVBFPVZBTFVFJzo6CisgICAgU2V0ICdvcHRpb24nLiAgJ09QVCcgaXMgaW4gJ0RFQ0lNQUwgSU5QVVQnIGZvcm1hdCAoYmVsb3cpLiAgJ1RZUEUnCisgICAgc3BlY2lmaWVzIHRoZSBvdXRwdXQgdHlwZSBhbmQgaW5wdXQgc3ludGF4IChsaXN0ZWQgaGVyZSBpbiBxdW90ZXMKKyAgICBhbmQgYXQgcHJlc2VudCwgMSBjaGFyYWN0ZXIpLiAgJydiJ3l0ZScsICcndydvcmQnKDJCKSwgJydsJ29uZycoNEIpLAorICAgICcncSd1YWQnKDhCKSwgY2hhcmFjdGVyICcncyd0cmluZycgYW5kIGNvbG9uLXNlcGFyYXRlZCAnaGUneCcnCisgICAgc3RyaW5nIChjYXNlIGluc2Vuc2l0aXZlOyBieXRlcyBtdXN0IGhhdmUgMiBkaWdpdHMgYW5kIGVhY2ggYnl0ZQorICAgIG11c3QgYmUgc2VwYXJhdGVkKS4gIGJ5dGUsIHdvcmQsIGxvbmcgYW5kIHF1YWQgaW5wdXQgdmFsdWVzIG11c3QKKyAgICBtZWV0IGNyaXRlcmlhIGZvciAnREVDSU1BTCBJTlBVVCcKKworKi1wKiAnUEFUSCc6OgorICAgICdwYXRoJyBvcHRpb24gZm9yIFBYRUxJTlVYIChESENQIE9wdGlvbiAyMTApLgorCisqLXIqOjoKKyAgICAncmVzdGFydCcuICBDYWxsIHRoZSBQWEUgc3RhY2sgd2l0aCBQWEVOVl9SRVNUQVJUX1RGVFAuICBfTXVzdF8gYmUKKyAgICB0aGUgb25seSBvcHRpb24gYW5kIGJlZm9yZSAnRklMRScuCisKKyotUyo6OgorICAgIFNldCAnc2lwJyBiYXNlZCBvbiBzbmFtZSBmaWVsZC9vcHRpb24gNjYgKGJ5IGRpcmVjdCBJUCBpZiBhCisgICAgcGVyaW9kLWRlbGltaXRlZCBhZGRyZXNzIG9yIG90aGVyd2lzZSBETlMpLgorCisqLXQqICdTRUNPTkRTJzo6CisgICAgJ3RpbWVvdXQnIG9wdGlvbiBmb3IgUFhFTElOVVggKERIQ1AgT3B0aW9uIDIxMSkuCisKKy8vICotdSo6OgorLy8gICAgIENvcHkgJ1VVSUQnIChPcHRpb24gOTcpIGlmIGZvdW5kIGluIHBhY2tldCAjMQorCisqLXcqOjoKKyAgICAnd2FpdCcuICBBZnRlciBsb2FkaW5nLCB3YWl0IGZvciB1c2VyIGlucHV0IGJlZm9yZSBib290aW5nLgorCisqLVcqOjoKKyAgICBFbmFibGUgJ1dEUycgKFdpbmRvd3MgRGVwbG95bWVudCBTZXJ2aWNlcykgLSBzcGVjaWZpYyBvcHRpb25zLiAKKyAgICAnRklMRScgKG9yIGl0cyBvdmVycmlkZXMgZm9yIERIQ1AgZmllbGRzIHNpYWRkciBhbmQgZmlsZSkgbXVzdCBwb2ludAorICAgIGF0IHRoZSBXRFMgc2VydmVyLgorICAgICpOT1RFOiogQXMgb2YgMjAxMi0wNS0zMSwgdGhlcmUgaXMgYSBrbm93biBpc3N1ZSB3aXRoIGdQWEUvaVBYRSwgYXQKKyAgICBsZWFzdCB3aXRoIHVuZGlvbmx5LmtrcHhlLgorLy8gUFhFTElOVVggYXNrcyBnUFhFL2lQWEUgdG8gdW5sb2FkLCByZXZlcnRpbmcgdG8gYW4gdW5kZXJseWluZyBzdGFjaworCisKKz09IERFQ0lNQUwgSU5QVVQgPT0KK0FsbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGRlZmF1bHRlZCB0byBkZWNpbWFsIGZvcm1hdCBhcmUgcHJvY2Vzc2VkIGJ5Cisqc3RydG91bCooMykgd2l0aCBhIGJhc2Ugb2YgMCB3aGljaCBhbGxvd3MgYWx0ZXJuYXRlIGZvcm1hdHMgYW5kIGZpbmRzIGEKK3N1aXRhYmxlIG5vbi1zcGFjZSBzZXBhcmF0aW5nIGNoYXJhY3Rlci4KKworCis9PSBFWEFNUExFUyA9PQorYHB4ZWNobi5jMzIgaHR0cDovL215aG9zdC5kb20ubG9jL3BhdGgvbmJwLjAgLWMgbXljb25maWdgOjoKKyAgICBMb2FkIG5icC4wIGFuZCBzZXQgUFhFTElOVVggY29uZmlnIChvcHRpb24gMjA5KS4KKworYHB4ZWNobi5jMzIgZ3B4ZWxpbnV4LjAgLXAgaHR0cDovLzEwLjEuMS40L3RmdHAvIC13IC1jIG15Y29uZmlnIC1vIDE1LnM9ZG9tYWluLmxvYyAtbyA2Lng9MEE6MDE6MDE6MDI6YWM6MTc6NEQ6RWMgLWA6OgorICAgIExvYWQgZ3B4ZWxpbnV4LjAgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnksIHNldCBwcmVmaXgsIHdhaXQgdG8KKyAgICBleGVjdXRlLCBzZXQgZmlyc3QgY29uZmlnLCBzZXQgdGhlIGRvbWFpbiBuYW1lIGFuZCAyIGRvbWFpbiBuYW1lCisgICAgc2VydmVycyAoY2FzZSBtaXhlZCB0byBzaG93IGluc2Vuc2l0aXZpdHk7IDEwLjEuMS4yIGFuZAorICAgIDE3Mi4yMy43Ny4yMzYpLgorCitgcHhlY2huLmMzMiBncHhlbGludXguMCAtcCBodHRwOi8vMTAuMS4xLjQvdGZ0cC8gLXcgLW8gMHhBMC54PTEyOjM0OjU2Ojc4IC14IDE5Ny54PTAwOmQwOmRlOjAwYDo6CisgICAgTG9hZCBncHhlbGludXguMCAocmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBub3QKKyAgICBhbHRlcmluZyBzbmFtZS9vcHRpb24gNjYpLCBzZXQgdGhlIFBYRUxJTlVYIHBhdGggcHJlZml4LCB3YWl0IGFmdGVyCisgICAgbG9hZGluZywgc2V0IG9wdGlvbiAxNjAgdG8gMHgxMiAweDM0IDB4NTYgMHg3OCwgYW5kIG9wdGlvbiAxOTcgdG8KKyAgICAweDAwIDB4RDAgMHhERSAweDAwLgorCitgcHhlY2huLmMzMiAxMC4xLjEuODpib290XHg4Nlx3ZHNuYnAuY29tIC1XYDo6CisgICAgTG9hZCB3ZHNuYnAuY29tIGZyb20gMTAuMS4xLjggYW5kIGNvcHkgREhDUCBPcHRpb24gNjYgdG8gREhDUAorICAgIGZpZWxkIHNuYW1lIGlmIHRoZXJlJ3Mgcm9vbS4KKyAKK2BweGVjaG4uYzMyIDEwLjEuMS40OmJvb3RceDg2XHdkc25icC5jb20gLVcgLW8gNjYueD0wYTowMTowMTowOCAtU2A6OgorICAgIExvYWQgd2RzbmJwLmNvbSBmcm9tIDEwLjEuMS40LCBwb2ludCBwYWNrZXRzIHRvIDEwLjEuMS44IGZvciB1c2UKKyAgICB3aXRoIFdEUywgY29weSBESENQIE9wdGlvbiA2NiB0byBESENQIGZpZWxkIHNuYW1lIGlmIHRoZXJlJ3Mgcm9vbQorICAgIGFuZCBkZWNvZGUgdGhpcyB0byBhbiBJUHY0IGFkZHJlc3MuCisKKworPT0gTk9URVMgPT0KK1BsZWFzZSBub3RlIHRoYXQgc29tZSBOQlBzIG1heSBpZ25vcmUgcGFja2V0ICMzIGJ5IGVpdGhlciBub3QgZXhhbWluaW5nCitpdCBhdCBhbGwgb3IgYnkgaXNzdWluZyBpdHMgb3duIERIQ1AgRElTQ09WRVIvUkVRVUVTVCwgbmVnYXRpbmcgYWxsIERIQ1AKK2ZpZWxkL29wdGlvbiBtb2RpZmljYXRpb25zIGJ5IHB4ZWNobi5jMzIsIGluY2x1ZGluZyBNaWNyb3NvZnQgV2luZG93cworU2VydmVyIDIwMDhSMiBXRFMncyB3ZHNuYnAuY29tLiAgU2VlIGFsc28gb3B0aW9uICctVycuCisKK1VSTCBzcGVjaWZpY2F0aW9ucyBpbiAnRklMRScgdGhhdCBpbmNsdWRlIHVzZXIvcGFzc3dvcmQgYmVmb3JlIHRoZSBob3N0Cit3aWxsIGN1cnJlbnRseSBjYXVzZSB0aGUgc2lhZGRyIGZpZWxkIHRvIG5vdCBiZSBzZXQgcHJvcGVybHkuCisKK1RoZSBub24tc3BhY2UgY29uc3RyYWludCBpcyBkdWUgdG8gaG93IFN5c2xpbnV4IHZhcmlhbnRzIHBhcnNlIHRoZQorY29tbWFuZCBsaW5lIGFzIG9mIDIwMTItMDktMTYuCisKKworPT0gQVVUSE9SID09Cit7YXV0aG9yfSA8e2VtYWlsfT4KKworCis9PSBDT1BZUklHSFQgPT0KK0NvcHlyaWdodCBcKEMpIDIwMTIge2F1dGhvcn0uIEZyZWUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdmVyc2lvbiAyIChHUEx2MikKKyhvciwgYXQgeW91ciBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uKS4KZGlmZiAtLWdpdCBhL2RvYy9weGVsaW51eC50eHQgYi9kb2MvcHhlbGludXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYmIxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcHhlbGludXgudHh0CkBAIC0wLDAgKzEsNDQzIEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFhFTElOVVgKKworICAgIEEgYm9vdGxvYWRlciBmb3IgTGludXggdXNpbmcgdGhlIFBYRSBuZXR3b3JrIGJvb3RpbmcgcHJvdG9jb2wKKworICAgICAgIENvcHlyaWdodCAxOTk0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgICAgICAgQ29weXJpZ2h0IDIwMDktMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorCitUaGlzIHByb2dyYW0gaXMgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UsIHZlcnNpb24gMiBvciwgYXQgeW91ciBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLiAgVGhlcmUgaXMgbm8KK3dhcnJhbnR5LCBuZWl0aGVyIGV4cHJlc3NlZCBub3IgaW1wbGllZCwgdG8gdGhlIGZ1bmN0aW9uIG9mIHRoaXMKK3Byb2dyYW0uICBQbGVhc2Ugc2VlIHRoZSBpbmNsdWRlZCBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMuCisKK1RoaXMgZG9jdW1lbnRhdGlvbiBmaWxlIGlzIHNsaWdodGx5IG91dCBvZiBkYXRlOyBwbGVhc2UgY2hlY2sgdGhlIE5FV1MKK2ZpbGUgZm9yIGNoYW5nZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUFhFTElOVVggaXMgYSBTeXNsaW51eCBkZXJpdmF0aXZlLCBmb3IgYm9vdGluZyBMaW51eCBvZmYgYSBuZXR3b3JrCitzZXJ2ZXIsIHVzaW5nIGEgbmV0d29yayBST00gY29uZm9ybWluZyB0byB0aGUgSW50ZWwgUFhFIChQcmUtRXhlY3V0aW9uCitFbnZpcm9ubWVudCkgc3BlY2lmaWNhdGlvbi4gIFBYRUxJTlVYIGlzICpub3QqIGEgcHJvZ3JhbSB0aGF0IGlzCitpbnRlbmRlZCB0byBiZSBmbGFzaGVkIG9yIGJ1cm5lZCBpbnRvIGEgUFJPTSBvbiB0aGUgbmV0d29yayBjYXJkOyBpZgoreW91IHdhbnQgdGhhdCwgY2hlY2sgb3V0IEV0aGVyYm9vdCAoaHR0cDovL3d3dy5ldGhlcmJvb3Qub3JnLykuCitFdGhlcmJvb3QgNS40IG9yIGxhdGVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gY3JlYXRlIGEgUFhFLWNvbXBsaWFudCBib290CitQUk9NIGZvciBtYW55IG5ldHdvcmsgY2FyZHMuCisKKworICAgICsrKysgSE9XIFRPIENPTkZJR1VSRSBQWEVMSU5VWCArKysrCisKK1BYRUxJTlVYIG9wZXJhdGVzIGluIG1hbnkgd2F5cyBsaWtlIFNZU0xJTlVYLiAgSWYgeW91IGFyZSBub3QgZmFtaWxpYXIKK3dpdGggU1lTTElOVVgsIHJlYWQgc3lzbGludXgudHh0IGZpcnN0LCBzaW5jZSB0aGlzIGRvY3VtZW50YXRpb24gb25seQorZXhwbGFpbnMgdGhlIGRpZmZlcmVuY2VzLgorCitPbiB0aGUgVEZUUCBzZXJ2ZXIsIGNyZWF0ZSB0aGUgZGlyZWN0b3J5ICIvdGZ0cGJvb3QiLCBhbmQgY29weSB0aGUKK2ZvbGxvd2luZyBmaWxlcyB0byBpdDoKKworCXB4ZWxpbnV4LjAJCS0gZnJvbSB0aGUgU3lzbGludXggZGlzdHJpYnV0aW9uCisKKwlhbnkga2VybmVsIG9yIGluaXRyZCBpbWFnZXMgeW91IHdhbnQgdG8gYm9vdAorCitGaW5hbGx5LCBjcmVhdGUgdGhlIGRpcmVjdG9yeSAiL3RmdHBib290L3B4ZWxpbnV4LmNmZyIuICBUaGUKK2NvbmZpZ3VyYXRpb24gZmlsZSAoZXF1aXZhbGVudCBvZiBzeXNsaW51eC5jZmcgLS0gc2VlIHN5c2xpbnV4LnR4dCBmb3IKK3RoZSBvcHRpb25zIGhlcmUpIHdpbGwgbGl2ZSBpbiB0aGlzIGRpcmVjdG9yeS4gIEJlY2F1c2UgbW9yZSB0aGFuIG9uZQorc3lzdGVtIG1heSBiZSBib290ZWQgZnJvbSB0aGUgc2FtZSBzZXJ2ZXIsIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZQorZGVwZW5kcyBvbiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgYm9vdGluZyBtYWNoaW5lLiAgUFhFTElOVVggd2lsbAorc2VhcmNoIGZvciBpdHMgY29uZmlnIGZpbGUgb24gdGhlIGJvb3Qgc2VydmVyIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorCisgIEZpcnN0LCBpdCB3aWxsIHNlYXJjaCBmb3IgdGhlIGNvbmZpZyBmaWxlIHVzaW5nIHRoZSBjbGllbnQgVVVJRCwgaWYKKyAgb25lIGlzIHByb3ZpZGVkIGJ5IHRoZSBQWEUgc3RhY2sgKG5vdGUsIHNvbWUgQklPU2VzIGRvbid0IGhhdmUgYQorICB2YWxpZCBVVUlELCBhbmQgeW91IG1pZ2h0IGVuZCB1cCB3aXRoIHNvbWV0aGluZyBsaWtlIGFsbCAxJ3MuKSAgVGhpcyBpcworICBpbiB0aGUgc3RhbmRhcmQgVVVJRCBmb3JtYXQgdXNpbmcgbG93ZXIgY2FzZSBoZXhhZGVjaW1hbCBkaWdpdHMsIGUuZy4KKyAgYjg5NDU5MDgtZDZhNi00MWE5LTYxMWQtNzRhNmFiODBiODNkLgorCisgIE5leHQsIGl0IHdpbGwgc2VhcmNoIGZvciB0aGUgY29uZmlnIGZpbGUgdXNpbmcgdGhlIGhhcmR3YXJlIHR5cGUKKyAgKHVzaW5nIGl0cyBBUlAgdHlwZSBjb2RlKSBhbmQgYWRkcmVzcywgYWxsIGluIGxvd2VyIGNhc2UgaGV4YWRlY2ltYWwKKyAgd2l0aCBkYXNoIHNlcGFyYXRvcnM7IGZvciBleGFtcGxlLCBmb3IgYW4gRXRoZXJuZXQgKEFSUCB0eXBlIDEpCisgIHdpdGggYWRkcmVzcyA4ODo5OTpBQTpCQjpDQzpERCBpdCB3b3VsZCBzZWFyY2ggZm9yIHRoZSBmaWxlbmFtZQorICAwMS04OC05OS1hYS1iYi1jYy1kZC4KKworICBOZXh0LCBpdCB3aWxsIHNlYXJjaCBmb3IgdGhlIGNvbmZpZyBmaWxlIHVzaW5nIGl0cyBvd24gSVAgYWRkcmVzcworICBpbiB1cHBlciBjYXNlIGhleGFkZWNpbWFsLCBlLmcuIDE5Mi4wLjIuOTEgLT4gQzAwMDAyNUIKKyAgKHlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlZCBwcm9nYW0gImdldGhvc3RpcCIgdG8gY29tcHV0ZSB0aGUKKyAgaGV4YWRlY2ltYWwgSVAgYWRkcmVzcyBmb3IgYW55IGhvc3QuKQorCisgIElmIHRoYXQgZmlsZSBpcyBub3QgZm91bmQsIGl0IHdpbGwgcmVtb3ZlIG9uZSBoZXggZGlnaXQgYW5kIHRyeQorICBhZ2Fpbi4gIFVsdGltYXRlbHksIGl0IHdpbGwgdHJ5IGxvb2tpbmcgZm9yIGEgZmlsZSBuYW1lZCAiZGVmYXVsdCIKKyAgKGluIGxvd2VyIGNhc2UpLgorCisgIEFzIGFuIGV4YW1wbGUsIGlmIHRoZSBib290IGZpbGUgbmFtZSBpcyAvbXlib290ZGlyL3B4ZWxpbnV4LjAsIHRoZQorICBVVUlEIGlzIGI4OTQ1OTA4LWQ2YTYtNDFhOS02MTFkLTc0YTZhYjgwYjgzZCwgdGhlIEV0aGVybmV0IE1BQworICBhZGRyZXNzIGlzIDg4Ojk5OkFBOkJCOkNDOkREIGFuZCB0aGUgSVAgYWRkcmVzcyAxOTIuMC4yLjkxLCBpdCB3aWxsCisgIHRyeToKKworCS9teWJvb3RkaXIvcHhlbGludXguY2ZnL2I4OTQ1OTA4LWQ2YTYtNDFhOS02MTFkLTc0YTZhYjgwYjgzZAorCS9teWJvb3RkaXIvcHhlbGludXguY2ZnLzAxLTg4LTk5LWFhLWJiLWNjLWRkCisJL215Ym9vdGRpci9weGVsaW51eC5jZmcvQzAwMDAyNUIKKwkvbXlib290ZGlyL3B4ZWxpbnV4LmNmZy9DMDAwMDI1CisJL215Ym9vdGRpci9weGVsaW51eC5jZmcvQzAwMDAyCisJL215Ym9vdGRpci9weGVsaW51eC5jZmcvQzAwMDAKKwkvbXlib290ZGlyL3B4ZWxpbnV4LmNmZy9DMDAwCisJL215Ym9vdGRpci9weGVsaW51eC5jZmcvQzAwCisJL215Ym9vdGRpci9weGVsaW51eC5jZmcvQzAKKwkvbXlib290ZGlyL3B4ZWxpbnV4LmNmZy9DCisJL215Ym9vdGRpci9weGVsaW51eC5jZmcvZGVmYXVsdAorCisgIC4uLiBpbiB0aGF0IG9yZGVyLgorCitOb3RlIHRoYXQgYWxsIGZpbGVuYW1lIHJlZmVyZW5jZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkKK3B4ZWxpbnV4LjAgbGl2ZXMgaW4uICBQWEVMSU5VWCBnZW5lcmFsbHkgcmVxdWlyZXMgdGhhdCBmaWxlbmFtZXMKKyhpbmNsdWRpbmcgYW55IHJlbGF0aXZlIHBhdGgpIGFyZSAxMjcgY2hhcmFjdGVycyBvciBzaG9ydGVyIGluIGxlbmd0aC4KKworU3RhcnRpbmcgaW4gcmVsZWFzZSAzLjIwLCBQWEVMSU5VWCB3aWxsIG5vIGxvbmdlciBhcHBseSBhIGJ1aWx0LWluCitkZWZhdWx0IGlmIGl0IGNhbm5vdCBmaW5kIGFueSBjb25maWd1cmF0aW9uIGZpbGUgYXQgYWxsOyBpbnN0ZWFkIGl0Cit3aWxsIHJlYm9vdCBhZnRlciB0aGUgdGltZW91dCBpbnRlcnZhbCBoYXMgZXhwaXJlZC4gIFRoaXMga2VlcHMgYQorbWFjaGluZSBmcm9tIGdldHRpbmcgc3R1Y2sgaW5kZWZpbml0ZWx5IGR1ZSB0byBhIGJvb3Qgc2VydmVyIGZhaWx1cmUuCisKK1N0YXJ0aW5nIGluIHJlbGVhc2UgMy41MCwgUFhFTElOVVggZGlzcGxheXMgbmV0d29yayBpbmZvcm1hdGlvbiBhdAordGhlIGJvb3QgcHJvbXB0IHByZXNzaW5nIDxDdHJsLU4+LgorCitQWEVMSU5VWCBkb2VzIG5vdCBzdXBwb3J0IE1URlRQLCBhbmQgSSBoYXZlIG5vIHBsYW5zIG9mIGRvaW5nIHNvLCBhcworTVRGVFAgaXMgaW5oZXJlbnRseSBicm9rZW4gZm9yIGZpbGVzIG1vcmUgdGhhbiA2NTUzNSBwYWNrZXRzIChhYm91dAorOTIgTUIpIGluIHNpemUuICBJdCBpcyBvZiBjb3Vyc2UgcG9zc2libGUgdG8gdXNlIE1URlRQIGZvciB0aGUgaW5pdGlhbAorYm9vdCwgaWYgeW91IGhhdmUgc3VjaCBhIHNldHVwLiAgTVRGVFAgc2VydmVyIHNldHVwIGlzIGJleW9uZCB0aGUKK3Njb3BlIG9mIHRoaXMgZG9jdW1lbnQuCisKKworICAgICsrKysgSFRUUCBBTkQgRlRQIERPV05MT0FEUyArKysrCisKK1NpbmNlIHZlcnNpb24gNS4xMCwgbmF0aXZlIHB4ZWxpbnV4LjAgY2FuIHN1cHBvcnQgSFRUUCBhbmQgRlRQCit0cmFuc2ZlcnMsIGdyZWF0bHkgaW5jcmVhc2luZyBsb2FkIHNwZWVkIGFuZCBhbGxvd2luZyBmb3Igc3RhbmRhcmQKK0hUVFAgc2NyaXB0cyB0byBwcmVzZW50IFBYRUxJTlVYJ3MgY29uZmlndXJhdGlvbiBmaWxlLiAgVG8gdXNlIGh0dHAgb3IKK2Z0cCwgdXNlIHN0YW5kYXJkIFVSTCBzeW50YXggYXMgZmlsZW5hbWU7IHVzZSB0aGUgREhDUCBvcHRpb25zIGJlbG93Cit0byB0cmFuc21pdCBhIHN1aXRhYmxlIFVSTCBwcmVmaXggdG8gdGhlIGNsaWVudCwgb3IgdXNlIHRoZQorInB4ZWxpbnV4LW9wdGlvbnMiIHRvb2wgcHJvdmlkZWQgaW4gdGhlIHV0aWxzIGRpcmVjdG9yeSB0byBwcm9ncmFtIGl0CitkaXJlY3RseSBpbnRvIHRoZSBweGVsaW51eC4wIGZpbGUuCisKKworICAgICsrKysgU0VUVElORyBVUCBUSEUgVEZUUCBTRVJWRVIgKysrKworCitGb3IgYmVzdCByZXN1bHRzLCB1c2UgYSBURlRQIHNlcnZlciB3aGljaCBzdXBwb3J0cyB0aGUgInRzaXplIiBURlRQCitvcHRpb24gKFJGQyAxNzg0L1JGQyAyMzQ5KS4gIFRoZSAidGZ0cC1ocGEiIFRGVFAgc2VydmVyLCB3aGljaCBzdXBwb3J0CitvcHRpb25zLCBpcyBhdmFpbGFibGUgYXQ6CisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL25ldHdvcmsvdGZ0cC8KKwlmdHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvbmV0d29yay90ZnRwLworCisuLi4gYW5kIG9uIGFueSBrZXJuZWwub3JnIG1pcnJvciAoc2VlIGh0dHA6Ly93d3cua2VybmVsLm9yZy9taXJyb3JzLykuCisKK0Fub3RoZXIgVEZUUCBzZXJ2ZXIgd2hpY2ggc3VwcG9ydHMgdGhpcyBpcyBhdGZ0cCBieSBKZWFuLVBpZXJyZQorTGVmZWJ2cmU6CisKKwlmdHA6Ly9mdHAubWFtYWxpbnV4LmNvbS9wdWIvYXRmdHAvCisKK0lmIHlvdXIgYm9vdCBzZXJ2ZXIgaXMgcnVubmluZyBXaW5kb3dzIChhbmQgeW91IGNhbid0IGZpeCB0aGF0KSwgdHJ5Cit0ZnRwZDMyIGJ5IFBoaWxpcHBlIEpvdW5pbiAoeW91IG5lZWQgdmVyc2lvbiAyLjExIG9yIGxhdGVyOyBwcmV2aW91cwordmVyc2lvbnMgaGFkIGEgYnVnIHdoaWNoIG1hZGUgaXQgaW5jb21wYXRpYmxlIHdpdGggUFhFTElOVVgpOgorCisJaHR0cDovL3RmdHBkMzIuam91bmluLm5ldC8KKworCisgICAgKysrKyBTRVRUSU5HIFVQIFRIRSBESENQIFNFUlZFUiArKysrCisKK1RoZSBQWEUgcHJvdG9jb2wgdXNlcyBhIHZlcnkgY29tcGxleCBzZXQgb2YgZXh0ZW5zaW9ucyB0byBESENQIG9yCitCT09UUC4gIEhvd2V2ZXIsIG1vc3QgUFhFIGltcGxlbWVudGF0aW9ucyAtLSB0aGlzIGluY2x1ZGVzIGFsbCBJbnRlbAorb25lcyB2ZXJzaW9uIDAuOTluIGFuZCBsYXRlciAtLSBzZWVtIHRvIGJlIGFibGUgdG8gYm9vdCBpbiBhCisiY29udmVudGlvbmFsIiBESENQL1RGVFAgY29uZmlndXJhdGlvbi4gIEFzc3VtaW5nIHlvdSBkb24ndCBoYXZlIHRvCitzdXBwb3J0IGFueSB2ZXJ5IG9sZCBvciBvdGhlcndpc2Ugc2V2ZXJlbHkgYnJva2VuIGNsaWVudHMsIHRoaXMgaXMKK3Byb2JhYmx5IHRoZSBiZXN0IGNvbmZpZ3VyYXRpb24gdW5sZXNzIHlvdSBhbHJlYWR5IGhhdmUgYSBQWEUgYm9vdAorc2VydmVyIG9uIHlvdXIgbmV0d29yay4KKworQSBzYW1wbGUgREhDUCBzZXR1cCwgdXNpbmcgdGhlICJjb252ZW50aW9uYWwgVEZUUCIgY29uZmlndXJhdGlvbiwKK3dvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgdXNpbmcgSVNDIGRoY3AgMi4wIGRoY3BkLmNvbmYKK3N5bnRheDoKKworICAgICAgICBhbGxvdyBib290aW5nOworICAgICAgICBhbGxvdyBib290cDsKKworCSMgU3RhbmRhcmQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uCisKKyAgICAgICAgb3B0aW9uIGRvbWFpbi1uYW1lICI8ZG9tYWluIG5hbWU+IjsKKyAgICAgICAgb3B0aW9uIHN1Ym5ldC1tYXNrIDxzdWJuZXQgbWFzaz47CisgICAgICAgIG9wdGlvbiBicm9hZGNhc3QtYWRkcmVzcyA8YnJvYWRjYXN0IGFkZHJlc3M+OworICAgICAgICBvcHRpb24gZG9tYWluLW5hbWUtc2VydmVycyA8ZG5zIHNlcnZlcnM+OworICAgICAgICBvcHRpb24gcm91dGVycyA8ZGVmYXVsdCByb3V0ZXI+OworCisJIyBHcm91cCB0aGUgUFhFIGJvb3RhYmxlIGhvc3RzIHRvZ2V0aGVyCisJZ3JvdXAgeworCQkjIFBYRS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4KKwkJbmV4dC1zZXJ2ZXIgPFRGVFAgc2VydmVyIGFkZHJlc3M+OworCQlmaWxlbmFtZSAiL3RmdHBib290L3B4ZWxpbnV4LjAiOworCisJCSMgWW91IG5lZWQgYW4gZW50cnkgbGlrZSB0aGlzIGZvciBldmVyeSBob3N0CisJCSMgdW5sZXNzIHlvdSdyZSB1c2luZyBkeW5hbWljIGFkZHJlc3NlcworCSAgICAgICAgaG9zdCA8aG9zdG5hbWU+IHsKKwkJICAgICAgICBoYXJkd2FyZSBldGhlcm5ldCA8ZXRoZXJuZXQgYWRkcmVzcz47CisJCQlmaXhlZC1hZGRyZXNzIDxob3N0bmFtZT47CisJCX0KKwl9CisKK05vdGUgdGhhdCBpZiB5b3VyIHBhcnRpY3VsYXIgVEZUUCBkYWVtb24gcnVucyB1bmRlciBjaHJvb3QgKHRmdHAtaHBhCit3aWxsIGRvIHRoaXMgaWYgeW91IHNwZWNpZnkgdGhlIC1zIChzZWN1cmUpIG9wdGlvbjsgdGhpcyBpcyBoaWdobHkKK3JlY29tbWVuZGVkKSwgeW91IGFsbW9zdCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSAvdGZ0cGJvb3QKK3ByZWZpeCBpbiB0aGUgZmlsZW5hbWUgc3RhdGVtZW50LgorCitJZiB0aGlzIGRvZXMgbm90IHdvcmsgZm9yIHlvdXIgY29uZmlndXJhdGlvbiwgeW91IHByb2JhYmx5IHNob3VsZCBzZXQKK3VwIGEgIlBYRSBib290IHNlcnZlciIgb24gcG9ydCA0MDExIG9mIHlvdXIgVEZUUCBzZXJ2ZXI7IGEgZnJlZSBQWEUKK2Jvb3Qgc2VydmVyIGlzIGF2YWlsYWJsZSBhdDoKKworCWh0dHA6Ly93d3cua2Fuby5vcmcudWsvcHJvamVjdHMvcHhlLworCitXaXRoIHN1Y2ggYSBib290IHNlcnZlciBkZWZpbmVkLCB5b3VyIERIQ1AgY29uZmlndXJhdGlvbiBzaG91bGQgbG9vawordGhlIHNhbWUgZXhjZXB0IGZvciBhbiAib3B0aW9uIGRoY3AtY2xhc3MtaWRlbnRpZmllciIgKCJvcHRpb24KK3ZlbmRvci1jbGFzcy1pZGVudGlmaWVyIiBpZiB5b3UgYXJlIHVzaW5nIERIQ1AgMy4wKToKKworICAgICAgICBhbGxvdyBib290aW5nOworICAgICAgICBhbGxvdyBib290cDsKKworCSMgU3RhbmRhcmQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uCisKKyAgICAgICAgb3B0aW9uIGRvbWFpbi1uYW1lICI8ZG9tYWluIG5hbWU+IjsKKyAgICAgICAgb3B0aW9uIHN1Ym5ldC1tYXNrIDxzdWJuZXQgbWFzaz47CisgICAgICAgIG9wdGlvbiBicm9hZGNhc3QtYWRkcmVzcyA8YnJvYWRjYXN0IGFkZHJlc3M+OworICAgICAgICBvcHRpb24gZG9tYWluLW5hbWUtc2VydmVycyA8ZG5zIHNlcnZlcnM+OworICAgICAgICBvcHRpb24gcm91dGVycyA8ZGVmYXVsdCByb3V0ZXI+OworCisJIyBHcm91cCB0aGUgUFhFIGJvb3RhYmxlIGhvc3RzIHRvZ2V0aGVyCisJZ3JvdXAgeworCQkjIFBYRS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4KKwkgICAgICAgIG9wdGlvbiBkaGNwLWNsYXNzLWlkZW50aWZpZXIgIlBYRUNsaWVudCI7CisJCW5leHQtc2VydmVyIDxweGUgYm9vdCBzZXJ2ZXIgYWRkcmVzcz47CisKKwkJIyBZb3UgbmVlZCBhbiBlbnRyeSBsaWtlIHRoaXMgZm9yIGV2ZXJ5IGhvc3QKKwkJIyB1bmxlc3MgeW91J3JlIHVzaW5nIGR5bmFtaWMgYWRkcmVzc2VzCisJICAgICAgICBob3N0IDxob3N0bmFtZT4geworCQkgICAgICAgIGhhcmR3YXJlIGV0aGVybmV0IDxldGhlcm5ldCBhZGRyZXNzPjsKKwkJCWZpeGVkLWFkZHJlc3MgPGhvc3RuYW1lPjsKKwkJfQorCX0KKworSGVyZSwgdGhlIGJvb3QgZmlsZSBuYW1lIGlzIG9idGFpbmVkIGZyb20gdGhlIFBYRSBzZXJ2ZXIuCisKK0lmIHRoZSAiY29udmVudGlvbmFsIFRGVFAiIGNvbmZpZ3VyYXRpb24gZG9lc24ndCB3b3JrIG9uIHlvdXIgY2xpZW50cywKK2FuZCBzZXR0aW5nIHVwIGEgUFhFIGJvb3Qgc2VydmVyIGlzIG5vdCBhbiBvcHRpb24sIHlvdSBjYW4gYXR0ZW1wdCB0aGUKK2ZvbGxvd2luZyBjb25maWd1cmF0aW9uLiAgSXQgaGFzIGJlZW4ga25vd24gdG8gYm9vdCBzb21lCitjb25maWd1cmF0aW9ucyBjb3JyZWN0bHk7IGhvd2V2ZXIsIHRoZXJlIGFyZSBubyBndWFyYW50ZWVzOgorCisgICAgICAgIGFsbG93IGJvb3Rpbmc7CisgICAgICAgIGFsbG93IGJvb3RwOworCisJIyBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4KKworICAgICAgICBvcHRpb24gZG9tYWluLW5hbWUgIjxkb21haW4gbmFtZT4iOworICAgICAgICBvcHRpb24gc3VibmV0LW1hc2sgPHN1Ym5ldCBtYXNrPjsKKyAgICAgICAgb3B0aW9uIGJyb2FkY2FzdC1hZGRyZXNzIDxicm9hZGNhc3QgYWRkcmVzcz47CisgICAgICAgIG9wdGlvbiBkb21haW4tbmFtZS1zZXJ2ZXJzIDxkbnMgc2VydmVycz47CisgICAgICAgIG9wdGlvbiByb3V0ZXJzIDxkZWZhdWx0IHJvdXRlcj47CisKKwkjIEdyb3VwIHRoZSBQWEUgYm9vdGFibGUgaG9zdHMgdG9nZXRoZXIKKwlncm91cCB7CisJCSMgUFhFLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLgorCSAgICAgICAgb3B0aW9uIGRoY3AtY2xhc3MtaWRlbnRpZmllciAiUFhFQ2xpZW50IjsKKwkJb3B0aW9uIHZlbmRvci1lbmNhcHN1bGF0ZWQtb3B0aW9ucyAwOTowZjo4MDowMDowYzo0ZTo2NTo3NDo3Nzo2Zjo3Mjo2YjoyMDo2Mjo2Zjo2Zjo3NDowYTowNzowMDo1MDo3Mjo2Zjo2ZDo3MDo3NDowNjowMTowMjowODowMzo4MDowMDowMDo0NzowNDo4MDowMDowMDowMDpmZjsKKwkJbmV4dC1zZXJ2ZXIgPFRGVFAgc2VydmVyPjsKKwkJZmlsZW5hbWUgIi90ZnRwYm9vdC9weGVsaW51eC4wIjsKKworCQkjIFlvdSBuZWVkIGFuIGVudHJ5IGxpa2UgdGhpcyBmb3IgZXZlcnkgaG9zdAorCQkjIHVubGVzcyB5b3UncmUgdXNpbmcgZHluYW1pYyBhZGRyZXNzZXMKKwkgICAgICAgIGhvc3QgPGhvc3RuYW1lPiB7CisJCSAgICAgICAgaGFyZHdhcmUgZXRoZXJuZXQgPGV0aGVybmV0IGFkZHJlc3M+OworCQkJZml4ZWQtYWRkcmVzcyA8aG9zdG5hbWU+OworCQl9CisJfQorCitOb3RlIHRoYXQgdGhpcyAqd2lsbCBub3QqIGJvb3Qgc29tZSBjbGllbnRzIHRoYXQgKndpbGwqIGJvb3Qgd2l0aCB0aGUKKyJjb252ZW50aW9uYWwgVEZUUCIgY29uZmlndXJhdGlvbjsgSW50ZWwgQm9vdCBDbGllbnQgMy4wIGFuZCBsYXRlciBhcmUKK2tub3duIHRvIGZhbGwgaW50byB0aGlzIGNhdGVnb3J5LgorCisKKyAgICArKysrIFNQRUNJQUwgREhDUCBPUFRJT05TICsrKysKKworUFhFTElOVVggKHN0YXJ0aW5nIHdpdGggdmVyc2lvbiAxLjYyKSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nCitub25zdGFuZGFyZCBESENQIG9wdGlvbnMsIHdoaWNoIGRlcGVuZGluZyBvbiB5b3VyIERIQ1Agc2VydmVyIHlvdSBtYXkKK2JlIGFibGUgdG8gdXNlIHRvIGN1c3RvbWl6ZSB0aGUgc3BlY2lmaWMgYmVoYXZpb3VyIG9mIFBYRUxJTlVYLiAgU2VlCitSRkMgNTA3MSBmb3Igc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIG9wdGlvbnMuCisKK09wdGlvbiAyMDgJcHhlbGludXgubWFnaWMKKwktIEVhcmxpZXIgdmVyc2lvbnMgb2YgUFhFTElOVVggcmVxdWlyZWQgdGhpcyB0byBiZSBzZXQgdG8KKwkgIEYxOjAwOjc0OjdFICgyNDEuMC4xMTYuMTI2KSBmb3IgUFhFTElOVVggdG8KKwkgIHJlY29nbml6ZSBhbnkgc3BlY2lhbCBESENQIG9wdGlvbnMgd2hhdHNvZXZlci4gIEFzIG9mCisJICBQWEVMSU5VWCAzLjU1LCB0aGlzIG9wdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBpcyBubyBsb25nZXIKKwkgIHJlcXVpcmVkLgorCitPcHRpb24gMjA5CXB4ZWxpbnV4LmNvbmZpZ2ZpbGUKKwktIFNwZWNpZmllcyB0aGUgUFhFTElOVVggY29uZmlndXJhdGlvbiBmaWxlIG5hbWUuCisKK09wdGlvbiAyMTAJcHhlbGludXgucGF0aHByZWZpeAorCS0gU3BlY2lmaWVzIHRoZSBQWEVMSU5VWCBjb21tb24gcGF0aCBwcmVmaXgsIGluc3RlYWQgb2YKKwkgIGRlcml2aW5nIGl0IGZyb20gdGhlIGJvb3QgZmlsZSBuYW1lLiAgVGhpcyBhbG1vc3QgY2VydGFpbmx5CisJICBuZWVkcyB0byBlbmQgaW4gd2hhdGV2ZXIgY2hhcmFjdGVyIHRoZSBURlRQIHNlcnZlciBPUyB1c2VzCisJICBhcyBhIHBhdGhuYW1lIHNlcGFyYXRvciwgZS5nLiBzbGFzaCAoLykgZm9yIFVuaXguCisKK09wdGlvbiAyMTEJcHhlbGludXgucmVib290dGltZQorCS0gU3BlY2lmaWVzLCBpbiBzZWNvbmRzLCB0aGUgdGltZSB0byB3YWl0IGJlZm9yZSByZWJvb3QgaW4gdGhlCisJICBldmVudCBvZiBURlRQIGZhaWx1cmUuICAwIG1lYW5zIHdhaXQgImZvcmV2ZXIiIChpbiByZWFsaXR5LAorCSAgaXQgd2FpdHMgYXBwcm94aW1hdGVseSAxMzYgeWVhcnMuKQorCitJU0MgZGhjcCAzLjAgc3VwcG9ydHMgYSByYXRoZXIgbmljZSBzeW50YXggZm9yIHNwZWNpZnlpbmcgY3VzdG9tCitvcHRpb25zOyB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHN5bnRheCBpbiBkaGNwZC5jb25mIGlmIHlvdSBhcmUKK3J1bm5pbmcgdGhpcyB2ZXJzaW9uIG9mIGRoY3BkOgorCisJb3B0aW9uIHNwYWNlIHB4ZWxpbnV4OworCW9wdGlvbiBweGVsaW51eC5tYWdpYyAgICAgIGNvZGUgMjA4ID0gc3RyaW5nOworCW9wdGlvbiBweGVsaW51eC5jb25maWdmaWxlIGNvZGUgMjA5ID0gdGV4dDsKKwlvcHRpb24gcHhlbGludXgucGF0aHByZWZpeCBjb2RlIDIxMCA9IHRleHQ7CisJb3B0aW9uIHB4ZWxpbnV4LnJlYm9vdHRpbWUgY29kZSAyMTEgPSB1bnNpZ25lZCBpbnRlZ2VyIDMyOworCisgICAgTk9URTogSW4gZWFybGllciB2ZXJzaW9ucyBvZiBQWEVMSU5VWCwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgYXMgYQorICAgICJzaXRlLW9wdGlvbi1zcGFjZSIuICBTaW5jZSBQWEVMSU5VWCAyLjA3LCB0aGlzIHdpbGwgd29yayBib3RoIGFzIGEKKyAgICAic2l0ZS1vcHRpb24tc3BhY2UiICh1bmVuY2Fwc3VsYXRlZCkgYW5kIGFzIGEgInZlbmRvci1vcHRpb24tc3BhY2UiCisgICAgKHR5cGUgNDMgZW5jYXBzdWxhdGVkLikgIFRoaXMgbWF5IGF2b2lkIG1lc3Npbmcgd2l0aCB0aGUKKyAgICBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QsIGFzIGRldGFpbGVkIGJlbG93LgorCitUaGVuLCBpbnNpZGUgeW91ciBQWEVMSU5VWC1ib290aW5nIGdyb3VwIG9yIGNsYXNzICh3aGVyZWV2ZXIgeW91IGhhdmUKK3RoZSBQWEVMSU5VWC1yZWxhdGVkIG9wdGlvbnMsIHN1Y2ggYXMgdGhlIGZpbGVuYW1lIG9wdGlvbiksIHlvdSBjYW4KK2FkZCwgZm9yIGV4YW1wbGU6CisKKwkjIEFsd2F5cyBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgbGluZXMgZm9yIGFsbCBQWEVMSU5VWCBjbGllbnRzCisJc2l0ZS1vcHRpb24tc3BhY2UgInB4ZWxpbnV4IjsKKwlvcHRpb24gcHhlbGludXgubWFnaWMgZjE6MDA6NzQ6N2U7CisJaWYgZXhpc3RzIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCB7CisJCSMgQWx3YXlzIHNlbmQgdGhlIFBYRUxJTlVYIG9wdGlvbnMgKHNwZWNpZmllZCBpbiBoZXhhZGVjaW1hbCkKKwkJb3B0aW9uIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCA9IGNvbmNhdChvcHRpb24gZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0LGQwLGQxLGQyLGQzKTsKKwl9CisJIyBUaGVzZSBsaW5lcyBzaG91bGQgYmUgY3VzdG9taXplZCB0byB5b3VyIHNldHVwCisJb3B0aW9uIHB4ZWxpbnV4LmNvbmZpZ2ZpbGUgImNvbmZpZ3MvY29tbW9uIjsKKwlvcHRpb24gcHhlbGludXgucGF0aHByZWZpeCAiL3RmdHBib290L3B4ZWxpbnV4L2ZpbGVzLyI7CisJb3B0aW9uIHB4ZWxpbnV4LnJlYm9vdHRpbWUgMzA7CisJZmlsZW5hbWUgIi90ZnRwYm9vdC9weGVsaW51eC9weGVsaW51eC5iaW4iOworCitOb3RlIHRoYXQgdGhlIGNvbmZpZ2ZpbGUgaXMgcmVsYXRpdmUgdG8gdGhlIHBhdGhwcmVmaXg6IHRoaXMgd2lsbCBsb29rCitmb3IgYSBjb25maWcgZmlsZSBjYWxsZWQgL3RmdHBib290L3B4ZWxpbnV4L2ZpbGVzL2NvbmZpZ3MvY29tbW9uIG9uCit0aGUgVEZUUCBzZXJ2ZXIuCisKK1RoZSAib3B0aW9uIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCIgc3RhdGVtZW50IGZvcmNlcyB0aGUgREhDUAorc2VydmVyIHRvIHNlbmQgdGhlIFBYRUxJTlVYLXNwZWNpZmljIG9wdGlvbnMsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdAorZXhwbGljaXRseSByZXF1ZXN0ZWQuICBTaW5jZSB0aGUgREhDUCByZXF1ZXN0IGlzIGRvbmUgYmVmb3JlIFBYRUxJTlVYCitpcyBsb2FkZWQsIHRoZSBQWEUgY2xpZW50IHdvbid0IGtub3cgdG8gcmVxdWVzdCB0aGVtLgorCitVc2luZyBJU0MgZGhjcCAzLjAgeW91IGNhbiBjcmVhdGUgYSBsb3Qgb2YgdGhlc2Ugc3RyaW5ncyBvbiB0aGUgZmx5LgorRm9yIGV4YW1wbGUsIHRvIHVzZSB0aGUgaGV4YWRlY2ltYWwgZm9ybSBvZiB0aGUgaGFyZHdhcmUgYWRkcmVzcyBhcwordGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lLCB5b3UgY291bGQgZG8gc29tZXRoaW5nIGxpa2U6CisKKwlzaXRlLW9wdGlvbi1zcGFjZSAicHhlbGludXgiOworCW9wdGlvbiBweGVsaW51eC5tYWdpYyBmMTowMDo3NDo3ZTsKKwlpZiBleGlzdHMgZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0IHsKKwkJIyBBbHdheXMgc2VuZCB0aGUgUFhFTElOVVggb3B0aW9ucyAoc3BlY2lmaWVkIGluIGhleGFkZWNpbWFsKQorCQlvcHRpb24gZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0ID0gY29uY2F0KG9wdGlvbiBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QsZDAsZDEsZDIsZDMpOworCX0KKwlvcHRpb24gcHhlbGludXguY29uZmlnZmlsZSA9CisJCWNvbmNhdCgicHhlbGludXguY2ZnLyIsIGJpbmFyeS10by1hc2NpaSgxNiwgOCwgIjoiLCBoYXJkd2FyZSkpOworCWZpbGVuYW1lICIvdGZ0cGJvb3QvcHhlbGludXguYmluIjsKKworSWYgeW91IHVzZWQgdGhpcyBmcm9tIGEgY2xpZW50IHdob3NlIEV0aGVybmV0IGFkZHJlc3Mgd2FzCis1ODpGQTo4NDpDRjo1NTowRSwgdGhpcyB3b3VsZCBsb29rIGZvciBhIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lZAorIi90ZnRwYm9vdC9weGVsaW51eC5jZmcvMTo1ODpmYTo4NDpjZjo1NTplIi4KKworCisgICAgKysrKyBIQVJEQ09ERUQgT1BUSU9OUyArKysrCisKK1NpbmNlIHZlcnNpb24gMy44MywgdGhlIHByb2dyYW0gInB4ZWxpbnV4LW9wdGlvbnMiIGNhbiBiZSB1c2VkIHRvCitoYXJkLWNvZGUgREhDUCBvcHRpb25zIGludG8gdGhlIHB4ZWxpbnV4LjAgaW1hZ2UgZmlsZTsgdGhpcyBpcworc29tZXRpbWVzIHVzZWZ1bCB3aGVuIHRoZSBESENQIHNlcnZlciBpcyB1bmRlciBkaWZmZXJlbnQKK2FkbWluaXN0cmF0aXZlIGNvbnRyb2wuCisKKworICAgICsrKysgQUxURVJOQVRFIFRGVFAgU0VSVkVSUyBBTkQgVVJMIFNZTlRBWCArKysrCisKK1BYRUxJTlVYIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBwYXRobmFtZSBjb252ZW50aW9uczoKKworOjpmaWxlbmFtZQorCisJU3VwcHJlc3NlcyB0aGUgY29tbW9uIGZpbGVuYW1lIHByZWZpeCwgaS5lLiBwYXNzZXMgdGhlIHN0cmluZworCSJmaWxlbmFtZSIgdW5tb2RpZmllZCB0byB0aGUgc2VydmVyLgorCitJUCBhZGRyZXNzOjpmaWxlbmFtZQkJKGUuZy4gMTkyLjAuMi4xOjpmaWxlbmFtZSkKKworCVN1cHByZXNzZXMgdGhlIGNvbW1vbiBmaWxlbmFtZSBwcmVmaXgsICphbmQqIHNlbmRzIGEgcmVxdWVzdAorCXRvIGFuIGFsdGVybmF0ZSBURlRQIHNlcnZlci4gIEluc3RlYWQgb2YgYW4gSVAgYWRkcmVzcywgYQorCUROUyBuYW1lIGNhbiBiZSB1c2VkLiAgSXQgd2lsbCBiZSBhc3N1bWVkIHRvIGJlIGZ1bGx5CisJcXVhbGlmaWVkIGlmIGl0IGNvbnRhaW5zIGRvdHM7IG90aGVyd2lzZSB0aGUgbG9jYWwgZG9tYWluIGFzCisJcmVwb3J0ZWQgYnkgdGhlIERIQ1Agc2VydmVyIChvcHRpb24gMTUpIHdpbGwgYmUgYWRkZWQuCisKKzo6IHdhcyBjaG9zZW4gYmVjYXVzZSBpdCBpcyB1bmxpa2VseSB0byBjb25mbGljdCB3aXRoIG9wZXJhdGluZyBzeXN0ZW0KK3VzYWdlLiAgSG93ZXZlciwgaWYgeW91IGhhcHBlbiB0byBoYXZlIGFuIGVudmlyb25tZW50IGZvciB3aGljaCB0aGUKK3NwZWNpYWwgdHJlYXRtZW50IG9mIDo6IGlzIGEgcHJvYmxlbSwgcGxlYXNlIGNvbnRhY3QgdGhlIFN5c2xpbnV4CittYWlsaW5nIGxpc3QuCisKK1NpbmNlIHZlcnNpb24gNC4wMCwgUFhFTElOVVggYWxzbyBzdXBwb3J0cyBzdGFuZGFyZCBVUkwgc3ludGF4LgorCisKKyAgICArKysrIFNPTUUgTk9URVMgKysrKworCitJZiB0aGUgYm9vdCBmYWlscywgUFhFTElOVVggKHVubGlrZSBTWVNMSU5VWCkgd2lsbCBub3Qgd2FpdCBmb3JldmVyOworcmF0aGVyLCBpZiBpdCBoYXMgbm90IHJlY2VpdmVkIGFueSBpbnB1dCBmb3IgYXBwcm94aW1hdGVseSBmaXZlCittaW51dGVzIGFmdGVyIGRpc3BsYXlpbmcgYW4gZXJyb3IgbWVzc2FnZSwgaXQgd2lsbCByZXNldCB0aGUgbWFjaGluZS4KK1RoaXMgYWxsb3dzIGFuIHVuYXR0ZW5kZWQgbWFjaGluZSB0byByZWNvdmVyIGluIGNhc2UgaXQgaGFkIGJhZCBlbm91Z2gKK2x1Y2sgb2YgdHJ5aW5nIHRvIGJvb3QgYXQgdGhlIHNhbWUgdGltZSB0aGUgVEZUUCBzZXJ2ZXIgZ29lcyBkb3duLgorCitMb3RzIG9mIFBYRSBzdGFja3MsIGVzcGVjaWFsbHkgb2xkIG9uZXMsIGhhdmUgdmFyaW91cyBwcm9ibGVtcyBvZgordmFyeWluZyBkZWdyZWVzIG9mIHNldmVyaXR5LiAgUGxlYXNlIHNlZToKKworCWh0dHA6Ly9zeXNsaW51eC56eXRvci5jb20vaGFyZHdhcmUucGhwCisKKy4uLiBmb3IgYSBsaXN0IG9mIGN1cnJlbnRseSBrbm93biBoYXJkd2FyZSBwcm9ibGVtcywgd2l0aCB3b3JrYXJvdW5kcworaWYga25vd24uCisKKworICAgICsrKysgS0VFUElORyBUSEUgUFhFIFNUQUNLIEFST1VORCArKysrCisKK05vcm1hbGx5LCBQWEVMSU5VWCB3aWxsIHVubG9hZCB0aGUgUFhFIGFuZCBVTkRJIHN0YWNrcyBiZWZvcmUgaW52b2tpbmcKK3RoZSBrZXJuZWwuICBJbiBzcGVjaWFsIGNpcmN1bXN0YW5jZXMgKGZvciBleGFtcGxlLCB3aGVuIHVzaW5nIE1FTURJU0sKK3RvIGJvb3QgYW4gb3BlcmF0aW5nIHN5c3RlbSB3aXRoIGFuIFVOREkgbmV0d29yayBkcml2ZXIpIGl0IG1pZ2h0IGJlCitkZXNpcmFibGUgdG8ga2VlcCB0aGUgUFhFIHN0YWNrIGluIG1lbW9yeS4gIElmIHRoZSBvcHRpb24gImtlZXBweGUiCitpcyBnaXZlbiBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZSwgUFhFTElOVVggd2lsbCBrZWVwIHRoZSBQWEUgYW5kCitVTkRJIHN0YWNrcyBpbiBtZW1vcnkuICAoSWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGlzIG1lYW5zLCB5b3UKK3Byb2JhYmx5IGRvbid0IG5lZWQgaXQuKQorCisKKyAgICArKysrIFBST0JMRU1TIFdJVEggWU9VUiBQWEUgU1RBQ0sgKysrKworCitUaGVyZSBhcmUgYSBudW1iZXIgb2YgZXh0cmVtZWx5IGJyb2tlbiBQWEUgc3RhY2tzIGluIHRoZSBmaWVsZC4gIFRoZQorZ1BYRSBwcm9qZWN0IChmb3JtZXJseSBrbm93biBhcyBFdGhlcmJvb3QpIHByb3ZpZGVzIGFuIG9wZW4tc291cmNlIFBYRQorc3RhY2sgdGhhdCB3b3JrcyB3aXRoIGEgbnVtYmVyIG9mIGNhcmRzLCBhbmQgd2hpY2ggY2FuIGJlIGxvYWRlZCBmcm9tCithIENELVJPTSwgVVNCIGtleSwgb3IgZmxvcHB5IGlmIGRlc2lyZWQuCisKK0luZm9ybWF0aW9uIG9uIGdQWEUgaXMgYXZhaWxhYmxlIGZyb206CisKKwlodHRwOi8vd3d3LmV0aGVyYm9vdC5vcmcvCisKKy4uLiBhbmQgcmVhZHktdG8tdXNlIFJPTSBvciBkaXNrIGltYWdlcyBmcm9tOgorCisJaHR0cDovL3d3dy5yb20tby1tYXRpYy5uZXQvCisKK1NvbWUgY2FyZHMsIGxpa2UgbWF5IHN5c3RlbXMgd2l0aCB0aGUgU2lTIDkwMCwgaGFzIGEgUFhFIHN0YWNrIHdoaWNoCit3b3JrcyBqdXN0IGJhcmVseSB3ZWxsIGVub3VnaCB0byBsb2FkIGEgc2luZ2xlIGZpbGUsIGJ1dCBkb2Vzbid0CitoYW5kbGUgdGhlIG1vcmUgYWR2YW5jZWQgaXRlbXMgcmVxdWlyZWQgYnkgUFhFTElOVVguICBJZiBzbywgaXQgaXMKK3Bvc3NpYmxlIHRvIHVzZSB0aGUgYnVpbHQtaW4gUFhFIHN0YWNrIHRvIGxvYWQgZ1BYRSwgd2hpY2ggY2FuIHRoZW4KK2xvYWQgUFhFTElOVVguICBTZWU6CisKKwlodHRwOi8vd3d3LmV0aGVyYm9vdC5vcmcvd2lraS9weGVjaGFpbmluZworCisKKyAgICArKysrIENVUlJFTlRMWSBLTk9XTiBQUk9CTEVNUyArKysrCisKK1RoZSBmb2xsb3dpbmcgcHJvYmxlbXMgYXJlIGtub3duIHdpdGggUFhFTElOVVgsIHNvIGZhcjoKKworKyBUaGUgZXJyb3IgcmVjb3Zlcnkgcm91dGluZSBkb2Vzbid0IHdvcmsgcXVpdGUgcmlnaHQuICBGb3IgcmlnaHQgbm93LAorICBpdCBqdXN0IGRvZXMgYSBoYXJkIHJlc2V0IC0gc2VlbXMgZ29vZCBlbm91Z2guCisrIFdlIHNob3VsZCBwcm9iYWJseSBjYWxsIHRoZSBVRFAgcmVjZWl2ZSBmdW5jdGlvbiBpbiB0aGUga2V5Ym9hcmQKKyAgZW50cnkgbG9vcCwgc28gdGhhdCB3ZSBhbnN3ZXIgQVJQIHJlcXVlc3RzLgorKyBCb290IHNlY3RvcnMvZGlzayBpbWFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgorCitJZiB5b3UgaGF2ZSBhZGRpdGlvbmFsIHByb2JsZW1zLCBwbGVhc2UgY29udGFjdCB0aGUgU3lzbGludXggbWFpbGluZworbGlzdCAoc2VlIHN5c2xpbnV4LnR4dCBmb3IgdGhlIGFkZHJlc3MuKQpkaWZmIC0tZ2l0IGEvZG9jL3JmYzUwNzEudHh0IGIvZG9jL3JmYzUwNzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjZmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcmZjNTA3MS50eHQKQEAgLTAsMCArMSw3ODcgQEAKKworCisKKworCisKK05ldHdvcmsgV29ya2luZyBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC4gSGFua2lucworUmVxdWVzdCBmb3IgQ29tbWVudHM6IDUwNzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNDCitDYXRlZ29yeTogSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2VtYmVyIDIwMDcKKworCisgICAgICBEeW5hbWljIEhvc3QgQ29uZmlndXJhdGlvbiBQcm90b2NvbCBPcHRpb25zIFVzZWQgYnkgUFhFTElOVVgKKworU3RhdHVzIG9mIFRoaXMgTWVtbworCisgICBUaGlzIG1lbW8gcHJvdmlkZXMgaW5mb3JtYXRpb24gZm9yIHRoZSBJbnRlcm5ldCBjb21tdW5pdHkuICBJdCBkb2VzCisgICBub3Qgc3BlY2lmeSBhbiBJbnRlcm5ldCBzdGFuZGFyZCBvZiBhbnkga2luZC4gIERpc3RyaWJ1dGlvbiBvZiB0aGlzCisgICBtZW1vIGlzIHVubGltaXRlZC4KKworQWJzdHJhY3QKKworICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHVzZSBieSBQWEVMSU5VWCBvZiBzb21lIERIQ1AgT3B0aW9uIENvZGVzCisgICBudW1iZXJpbmcgZnJvbSAyMDgtMjExLgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitIYW5raW5zICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMV0KKwwKK1JGQyA1MDcxICAgICAgICAgICAgICAgICAgICBQWEVMSU5VWCBPcHRpb25zICAgICAgICAgICAgICAgRGVjZW1iZXIgMjAwNworCisKK1RhYmxlIG9mIENvbnRlbnRzCisKKyAgIDEuICBJbnRyb2R1Y3Rpb24gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgMworICAgMi4gIFRlcm1pbm9sb2d5ICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA0CisgICAzLiAgTUFHSUMgT3B0aW9uIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDQKKyAgICAgMy4xLiAgRGVzY3JpcHRpb24gIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgNAorICAgICAzLjIuICBQYWNrZXQgRm9ybWF0ICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA1CisgICAgIDMuMy4gIEFwcGxpY2FiaWxpdHkgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDUKKyAgICAgMy40LiAgUmVzcG9uc2UgdG8gUkZDIDM5NDIgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgNQorICAgNC4gIENvbmZpZ3VyYXRpb24gRmlsZSBPcHRpb24gIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA1CisgICAgIDQuMS4gIERlc2NyaXB0aW9uICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDUKKyAgICAgNC4yLiAgUGFja2V0IEZvcm1hdCAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgNgorICAgICA0LjMuICBBcHBsaWNhYmlsaXR5ICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA2CisgICAgIDQuNC4gIFJlc3BvbnNlIHRvIFJGQyAzOTQyIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDYKKyAgICAgNC41LiAgQ2xpZW50IGFuZCBTZXJ2ZXIgQmVoYXZpb3VyICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgNgorICAgNS4gIFBhdGggUHJlZml4IE9wdGlvbiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA3CisgICAgIDUuMS4gIERlc2NyaXB0aW9uICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDcKKyAgICAgNS4yLiAgUGFja2V0IEZvcm1hdCAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgNworICAgICA1LjMuICBBcHBsaWNhYmlsaXR5ICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA3CisgICAgIDUuNC4gIFJlc3BvbnNlIHRvIFJGQyAzOTQyIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDgKKyAgICAgNS41LiAgQ2xpZW50IGFuZCBTZXJ2ZXIgQmVoYXZpb3VyICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgOAorICAgNi4gIFJlYm9vdCBUaW1lIE9wdGlvbiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA5CisgICAgIDYuMS4gIERlc2NyaXB0aW9uICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDkKKyAgICAgNi4yLiAgUGFja2V0IEZvcm1hdCAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgOQorICAgICA2LjMuICBBcHBsaWNhYmlsaXR5ICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDEwCisgICAgIDYuNC4gIFJlc3BvbnNlIHRvIFJGQyAzOTQyIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gMTAKKyAgICAgNi41LiAgQ2xpZW50IGFuZCBTZXJ2ZXIgQmVoYXZpb3VyICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAxMAorICAgNy4gIFNwZWNpZmljYXRpb24gQ29uZm9ybWFuY2UgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDExCisgICA4LiAgU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gMTEKKyAgIDkuICBJQU5BIENvbnNpZGVyYXRpb25zICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAxMQorICAgMTAuIEFja25vd2xlZGdlbWVudHMgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDEyCisgICAxMS4gUmVmZXJlbmNlcyAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gMTIKKyAgICAgMTEuMS4gTm9ybWF0aXZlIFJlZmVyZW5jZXMgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAxMgorICAgICAxMS4yLiBJbmZvcm1hdGl2ZSBSZWZlcmVuY2VzIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDEyCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworSGFua2lucyAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDJdCisMCitSRkMgNTA3MSAgICAgICAgICAgICAgICAgICAgUFhFTElOVVggT3B0aW9ucyAgICAgICAgICAgICAgIERlY2VtYmVyIDIwMDcKKworCisxLiAgSW50cm9kdWN0aW9uCisKKyAgIFBYRSwgdGhlIFByZWJvb3QgZVhlY3V0aW9uIEVudmlyb25tZW50LCBpcyBhIGZpcnN0LXN0YWdlIG5ldHdvcmsKKyAgIGJvb3RzdHJhcCBhZ2VudC4gIFBYRSBpcyBsb2FkZWQgb3V0IG9mIGZpcm13YXJlIG9uIHRoZSBjbGllbnQgaG9zdCwKKyAgIGFuZCBwZXJmb3JtcyBESENQIFszXSBxdWVyaWVzIHRvIG9idGFpbiBhbiBJUCBhZGRyZXNzLgorCisgICBPbmNlIG9uIHRoZSBuZXR3b3JrLCBpdCBsb2FkcyBhIHNlY29uZC1zdGFnZSBib290c3RyYXAgYWdlbnQgYXMKKyAgIGNvbmZpZ3VyZWQgYnkgREhDUCBoZWFkZXIgYW5kIG9wdGlvbiBjb250ZW50cy4KKworICAgUFhFTElOVVggaXMgb25lIHN1Y2ggc2Vjb25kLXN0YWdlIGJvb3RzdHJhcCBhZ2VudC4gIE9uY2UgUFhFIGhhcworICAgcGFzc2VkIGV4ZWN1dGlvbiB0byBpdCwgUFhFTElOVVggc2Vla3MgaXRzIGNvbmZpZ3VyYXRpb24gZnJvbSBhIGNhY2hlCisgICBvZiBESENQIG9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIFBYRSBmaXJzdC1zdGFnZSBhZ2VudCwgYW5kIHRoZW4gdGFrZXMKKyAgIGFjdGlvbiBiYXNlZCB1cG9uIHRob3NlIG9wdGlvbnMuCisKKyAgIE1vc3QgZnJlcXVlbnRseSwgdGhpcyBpbXBsaWVzIGxvYWRpbmcgdmlhIFRyaXZpYWwgRmlsZSBUcmFuc2ZlcgorICAgUHJvdG9jb2wgKFRGVFApIFs2XSBvbmUgb3IgbW9yZSBpbWFnZXMgdGhhdCBhcmUgZGVjb21wcmVzc2VkIGludG8KKyAgIG1lbW9yeSwgdGhlbiBleGVjdXRlZCB0byBwYXNzIGV4ZWN1dGlvbiB0byB0aGUgZmluYWwgSG9zdCBPcGVyYXRpbmcKKyAgIFN5c3RlbS4KKworICAgUFhFTElOVVggdXNlcyBESENQIG9wdGlvbnMgMjA4LTIxMSB0byBnb3Zlcm4gcGFydHMgb2YgdGhpcyBib290c3RyYXAKKyAgIHByb2Nlc3MsIGJ1dCB0aGVzZSBvcHRpb25zIGFyZSBub3QgcmVxdWVzdGVkIGJ5IHRoZSBQWEUgREhDUCBjbGllbnQKKyAgIGF0IHRoZSB0aW1lIGl0IGFjcXVpcmVzIGl0cyBsZWFzZS4gIEF0IHRoYXQgdGltZSwgdGhlIFBYRSBib290bG9hZGVyCisgICBoYXMgbm8ga25vd2xlZGdlIHRoYXQgUFhFTElOVVggaXMgZ29pbmcgdG8gYmUgaW4gdXNlLCBhbmQgZXZlbiBzbywKKyAgIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGtub3cgd2hhdCBvcHRpb24ocykgUFhFTElOVVggbWlnaHQgZGlnZXN0LgorICAgTG9jYWwgaW5zdGFsbGF0aW9ucyB0aGF0IHNlcnZlIHRoaXMgUFhFTElOVVggaW1hZ2UgdG8gaXRzIGNsaWVudHMKKyAgIG11c3QgYWxzbyBjb25maWd1cmUgdGhlaXIgREhDUCBzZXJ2ZXJzIHRvIHByb3ZpZGUgdGhlc2Ugb3B0aW9ucyBldmVuCisgICB0aG91Z2ggdGhleSBhcmUgbm90IG9uIHRoZSBESENQIFBhcmFtZXRlciBSZXF1ZXN0IExpc3QgWzRdLgorCisgICBUaGVzZSBvcHRpb25zIGFyZToKKworICAgbyAgIk1BR0lDIiAtIDIwOCAtIEFuIG9wdGlvbiB3aG9zZSBwcmVzZW5jZSBhbmQgY29udGVudCB2ZXJpZmllcyB0bworICAgICAgdGhlIFBYRUxJTlVYIGJvb3Rsb2FkZXIgdGhhdCB0aGUgb3B0aW9ucyBudW1iZXJlZCAyMDktMjExIGFyZSBmb3IKKyAgICAgIHRoZSBwdXJwb3NlIGFzIGRlc2NyaWJlZCBoZXJlaW4uCisKKyAgIG8gICJDb25maWdGaWxlIiAtIDIwOSAtIENvbmZpZ3VyZXMgdGhlIHBhdGgvZmlsZW5hbWUgY29tcG9uZW50IG9mIHRoZQorICAgICAgY29uZmlndXJhdGlvbiBmaWxlJ3MgbG9jYXRpb24sIHdoaWNoIHRoaXMgYm9vdGxvYWRlciBzaG91bGQgdXNlIHRvCisgICAgICBjb25maWd1cmUgaXRzZWxmLgorCisgICBvICAiUGF0aFByZWZpeCIgLSAyMTAgLSBDb25maWd1cmVzIGEgdmFsdWUgdG8gYmUgcHJlcGVuZGVkIHRvIHRoZQorICAgICAgQ29uZmlnRmlsZSB0byBkaXNjZXJuIHRoZSBkaXJlY3RvcnkgbG9jYXRpb24gb2YgdGhlIGZpbGUuCisKKyAgIG8gICJSZWJvb3RUaW1lIiAtIDIxMSAtIENvbmZpZ3VyZXMgYSB0aW1lb3V0IGFmdGVyIHdoaWNoIHRoZQorICAgICAgYm9vdHN0cmFwIHByb2dyYW0gd2lsbCByZWJvb3QgdGhlIHN5c3RlbSAobW9zdCBsaWtlbHkgcmV0dXJuaW5nIGl0CisgICAgICB0byBQWEUpLgorCisgICBIaXN0b3JpY2FsbHksIHRoZXNlIG9wdGlvbiBjb2RlcyBudW1iZXJpbmcgZnJvbSAyMDgtMjExIHdlcmUKKyAgIGRlc2lnbmF0ZWQgJ1NpdGUgTG9jYWwnLCBidXQgYWZ0ZXIgcHVibGljYXRpb24gb2YgUkZDMzk0MiBbOF0sIHRoZXkKKyAgIHdlcmUgbWFkZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gYXMgbmV3IHN0YW5kYXJkIERIQ1Agb3B0aW9ucy4KKworCisKK0hhbmtpbnMgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAzXQorDAorUkZDIDUwNzEgICAgICAgICAgICAgICAgICAgIFBYRUxJTlVYIE9wdGlvbnMgICAgICAgICAgICAgICBEZWNlbWJlciAyMDA3CisKKworICAgVGhpcyBkb2N1bWVudCBtYXJrcyB0aGVzZSBjb2RlcyBhcyBhc3NpZ25lZC4KKworICAgVGhpcyBkaXJlY3QgYXNzaWdubWVudCBvZiBvcHRpb24gY29kZSB2YWx1ZXMgaW4gdGhlIG9wdGlvbgorICAgZGVmaW5pdGlvbnMgYmVsb3cgaXMgdW51c3VhbCBhcyBpdCBpcyBub3QgbWVudGlvbmVkIGluIERIQ1AgT3B0aW9uCisgICBDb2RlIGFzc2lnbm1lbnQgZ3VpZGVsaW5lcyBbNV0uICBUaGlzIGRvY3VtZW50J3MgT3B0aW9uIENvZGUKKyAgIGFzc2lnbm1lbnRzIGFyZSBkb25lIHdpdGhpbiBSRkMgMzk0MidzIHByb3Zpc2lvbnMgZm9yIGRvY3VtZW50aW5nCisgICBwcmlvciB1c2Ugb2Ygb3B0aW9uIGNvZGVzIHdpdGhpbiB0aGUgbmV3IHJhbmdlICgxMjgtMjIzIGluY2x1c2l2ZSkuCisKKzIuICBUZXJtaW5vbG9neQorCisgICBvICAiZmlyc3Qtc3RhZ2UgYm9vdGxvYWRlciIgLSBBbHRob3VnaCBhIGdpdmVuIGJvb3Rsb2FkaW5nIG9yZGVyIG1heQorICAgICAgaGF2ZSBtYW55IHN0YWdlcywgc3VjaCBhcyB3aGVyZSBhIEJJT1MgYm9vdHMgYSBET1MgQm9vdCBEaXNrLAorICAgICAgd2hpY2ggdGhlbiBsb2FkcyBhIFBYRSBleGVjdXRhYmxlLCBpdCBpcywgaW4gdGhpcyBleGFtcGxlLCBvbmx5CisgICAgICB0aGUgUFhFIGV4ZWN1dGFibGUgdGhhdCB0aGlzIGRvY3VtZW50IGRlc2NyaWJlcyBhcyB0aGUgImZpcnN0LQorICAgICAgc3RhZ2UgYm9vdGxvYWRlciIgLS0gaW4gZXNzZW5jZSwgdGhpcyBpcyB0aGUgZmlyc3Qgc3RhZ2Ugb2YKKyAgICAgIGJvb3RpbmcgYXQgd2hpY2ggREhDUCBpcyBpbnZvbHZlZC4KKworICAgbyAgInNlY29uZC1zdGFnZSBib290bG9hZGVyIiAtIFRoaXMgZGVzY3JpYmVzIGEgcHJvZ3JhbSBsb2FkZWQgYnkgdGhlCisgICAgICBmaXJzdC1zdGFnZSBib290bG9hZGVyIGF0IHRoZSBiZWhlc3Qgb2YgdGhlIERIQ1Agc2VydmVyLgorCisgICBvICAiYm9vdGxvYWRlciIgYW5kICJuZXR3b3JrIGJvb3RzdHJhcCBhZ2VudCIgLSBUaGVzZSBhcmUgc3lub255bXMsCisgICAgICBleGNlcHRpbmcgdGhhdCAiYm9vdGxvYWRlciIgaXMgaW50ZW50aW9uYWxseSB2YWd1ZSBpbiB0aGF0IGl0cworICAgICAgbmV4dCBmb3JtIG9mIGJvb3RzdHJhcHBpbmcgbWF5IG5vdCBpbiBmYWN0IGludm9sdmUgbmV0d29yaworICAgICAgcmVzb3VyY2VzLgorCisgICBUaGUga2V5IHdvcmRzICJNQVkiLCAiTVVTVCIsICJNVVNUIE5PVCIsICJTSE9VTEQiLCBhbmQgIlNIT1VMRCBOT1QiCisgICBpbiB0aGlzIGRvY3VtZW50IGFyZSB0byBiZSBpbnRlcnByZXRlZCBhcyBkZXNjcmliZWQgaW4gUkZDIDIxMTkgWzJdLgorCiszLiAgTUFHSUMgT3B0aW9uCisKKzMuMS4gIERlc2NyaXB0aW9uCisKKyAgIElmIHRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkIHRvIHRoZSBQWEUgYm9vdGxvYWRlciwgdGhlbiB0aGUgdmFsdWUgaXMKKyAgIGNoZWNrZWQgYnkgUFhFTElOVVggdG8gbWF0Y2ggdGhlIG9jdGV0IHN0cmluZyBmMTowMDo3NDo3ZS4gIElmIHRoaXMKKyAgIG1hdGNoZXMsIHRoZW4gUFhFTElOVVggYm9vdGxvYWRlcnMgd2lsbCBhbHNvIGNvbnN1bWUgb3B0aW9ucyAyMDktMjExLAorICAgYXMgZGVzY3JpYmVkIGJlbG93LiAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBpZ25vcmVkLgorCisgICBUaGlzIG1lYXN1cmUgd2FzIGludGVuZGVkIHRvIGVuc3VyZSB0aGF0LCBhcyB0aGUgJ1NpdGUgTG9jYWwnIG9wdGlvbgorICAgc3BhY2UgaXMgbm90IGFsbG9jYXRlZCBmcm9tIGEgY2VudHJhbCBhdXRob3JpdHksIG5vIGNvbmZsaWN0IHdvdWxkCisgICByZXN1bHQgaW4gYSBQWEVMSU5VWCBib290bG9hZGVyIGltcHJvcGVybHkgZGlnZXN0aW5nIG9wdGlvbnMgaW50ZW5kZWQKKyAgIGZvciBhbm90aGVyIHB1cnBvc2UuCisKKworCisKKworCisKKworCisKK0hhbmtpbnMgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA0XQorDAorUkZDIDUwNzEgICAgICAgICAgICAgICAgICAgIFBYRUxJTlVYIE9wdGlvbnMgICAgICAgICAgICAgICBEZWNlbWJlciAyMDA3CisKKworMy4yLiAgUGFja2V0IEZvcm1hdAorCisgICBUaGUgTUFHSUMgT3B0aW9uIGZvcm1hdCBpcyBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICAgIENvZGUgICAgTGVuZ3RoICAgICBtMSAgICAgICBtMiAgICAgICBtMyAgICAgICBtNAorICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICAgICAgIHwgICAyMDggIHwgICAgNCAgIHwgIDB4RjEgIHwgIDB4MDAgIHwgIDB4NzQgIHwgIDB4N0UgIHwKKyAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworCisgICBUaGUgY29kZSBmb3IgdGhpcyBvcHRpb24gaXMgMjA4LiAgVGhlIGxlbmd0aCBpcyBhbHdheXMgZm91ci4KKworMy4zLiAgQXBwbGljYWJpbGl0eQorCisgICBUaGlzIG9wdGlvbiBpcyBhYnNvbHV0ZWx5IGluYXBwbGljYWJsZSB0byBhbnkgb3RoZXIgcHVycG9zZS4KKworMy40LiAgUmVzcG9uc2UgdG8gUkZDIDM5NDIKKworICAgVGhlIG9wdGlvbiBjb2RlIDIwOCB3aWxsIGJlIGFkb3B0ZWQgZm9yIHRoaXMgcHVycG9zZSBhbmQgaW1tZWRpYXRlbHkKKyAgIGRlcHJlY2F0ZWQuICBGdXR1cmUgc3RhbmRhcmRzIGFjdGlvbiBtYXkgcmV0dXJuIHRoaXMgb3B0aW9uIHRvIGFuCisgICBhdmFpbGFibGUgc3RhdHVzIHNob3VsZCBpdCBiZSBuZWNlc3NhcnkuCisKKyAgIEEgY29sbGlzaW9uIG9mIHRoZSB1c2Ugb2YgdGhpcyBvcHRpb24gaXMgaGFybWxlc3MgKGF0IGxlYXN0IGZyb20KKyAgIFBYRUxJTlVYJyBwb2ludCBvZiB2aWV3KSBieSBkZXNpZ246IGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZQorICAgYWZvcmVtZW50aW9uZWQgbWFnaWMgdmFsdWUsIHRoZSBQWEVMSU5VWCBib290bG9hZGVyIHdpbGwgdGFrZSBubworICAgc3BlY2lhbCBhY3Rpb24uCisKKyAgIFRoZSBQWEVMSU5VWCBwcm9qZWN0IHdpbGwgZGVwcmVjYXRlIHRoZSB1c2Ugb2YgdGhpcyBvcHRpb247IGZ1dHVyZQorICAgdmVyc2lvbnMgb2YgdGhlIHNvZnR3YXJlIHdpbGwgbm90IGV2YWx1YXRlIGl0cyBjb250ZW50cy4KKworICAgSXQgaXMgcmVhc29uYWJsZSB0byB1dGlsaXplIHRoaXMgb3B0aW9uIGNvZGUgZm9yIGFub3RoZXIgcHVycG9zZSwgYnV0CisgICBpdCBpcyByZWNvbW1lbmRlZCB0byBkbyB0aGlzIGF0IGEgbGF0ZXIgdGltZSwgZ2l2ZW4gdGhlIGRlc2lyZSB0bworICAgYXZvaWQgcG90ZW50aWFsIGNvbGxpc2lvbnMgaW4gbGVnYWN5IHVzZXIgYmFzZXMuCisKKzQuICBDb25maWd1cmF0aW9uIEZpbGUgT3B0aW9uCisKKzQuMS4gIERlc2NyaXB0aW9uCisKKyAgIE9uY2UgdGhlIFBYRUxJTlVYIGV4ZWN1dGFibGUgaGFzIGJlZW4gZW50ZXJlZCBmcm9tIHRoZSBQWEUKKyAgIGJvb3Rsb2FkZXIsIGl0IGV2YWx1YXRlcyB0aGlzIG9wdGlvbiBhbmQgbG9hZHMgYSBmaWxlIG9mIHRoYXQgbmFtZQorICAgdmlhIFRGVFAuICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHNlcnZlIHRvIGNvbmZpZ3VyZSBQWEVMSU5VWCBpbgorICAgaXRzIG5leHQgc3RhZ2Ugb2YgYm9vdGxvYWRpbmcgKHNwZWNpZnlpbmcgYm9vdCBpbWFnZSBuYW1lcywKKyAgIGxvY2F0aW9ucywgYm9vdC10aW1lIGZsYWdzLCB0ZXh0IHRvIHByZXNlbnQgdGhlIHVzZXIgaW4gbWVudQorICAgc2VsZWN0aW9ucywgZXRjKS4KKworICAgSW4gdGhlIGFic2VuY2Ugb2YgdGhpcyBvcHRpb24sIHRoZSBQWEVMSU5VWCBhZ2VudCB3aWxsIHNlYXJjaCB0aGUKKyAgIFRGVFAgc2VydmVyIChhcyBkZXRlcm1pbmVkIGJ5IFBYRSBwcmlvciB0byB0aGlzIHN0YWdlKSBmb3IgYSBjb25maWcKKyAgIGZpbGUgb2Ygc2V2ZXJhbCBkZWZhdWx0IG5hbWVzLgorCisKKworCitIYW5raW5zICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgNV0KKwwKK1JGQyA1MDcxICAgICAgICAgICAgICAgICAgICBQWEVMSU5VWCBPcHRpb25zICAgICAgICAgICAgICAgRGVjZW1iZXIgMjAwNworCisKKzQuMi4gIFBhY2tldCBGb3JtYXQKKworICAgVGhlIENvbmZpZ3VyYXRpb24gRmlsZSBPcHRpb24gZm9ybWF0IGlzIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgICAgQ29kZSAgICBMZW5ndGggICAgQ29uZmlnLWZpbGUuLi4KKyAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAgICAgICB8ICAgMjA5ICB8ICAgIG4gICB8ICAgYzEgICB8ICAgYzIgICB8ICAgLi4uICB8ICAgYyhuKSB8CisgICAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKKworICAgVGhlIGNvZGUgZm9yIHRoaXMgb3B0aW9uIGlzIDIwOS4gIFRoZSBDb25maWctZmlsZSAoYzEuLmMobikpIGlzIGFuCisgICBOVlQtQVNDSUkgWzFdIHByaW50YWJsZSBzdHJpbmc7IGl0IGlzIG5vdCB0ZXJtaW5hdGVkIGJ5IGEgemVybyBvciBhbnkKKyAgIG90aGVyIHZhbHVlLgorCis0LjMuICBBcHBsaWNhYmlsaXR5CisKKyAgIEFueSBib290bG9hZGVyLCBQWEUgb3Igb3RoZXJ3aXNlLCB0aGF0IG1ha2VzIHVzZSBvZiBhIHNlcGFyYXRlCisgICBjb25maWd1cmF0aW9uIGZpbGUgcmF0aGVyIHRoYW4gY29udGFpbmluZyBhbGwgY29uZmlndXJhdGlvbnMgd2l0aGluCisgICBESENQIG9wdGlvbnMgKHdoaWNoIG1heSBiZSBpbXBvc3NpYmxlIGR1ZSB0byB0aGUgbGltaXRlZCBzcGFjZQorICAgYXZhaWxhYmxlIGZvciBESENQIG9wdGlvbnMpIG1heSBjb25jZWl2YWJseSBtYWtlIHVzZSBvZiB0aGlzIG9wdGlvbi4KKworNC40LiAgUmVzcG9uc2UgdG8gUkZDIDM5NDIKKworICAgVGhlIGNvZGUgMjA5IHdpbGwgYmUgYWRvcHRlZCBmb3IgdGhpcyBwdXJwb3NlLgorCis0LjUuICBDbGllbnQgYW5kIFNlcnZlciBCZWhhdmlvdXIKKworICAgVGhlIENvbmZpZyBGaWxlIE9wdGlvbiBNVVNUIGJlIHN1cHBsaWVkIGJ5IHRoZSBESENQIHNlcnZlciBpZiBpdAorICAgYXBwZWFycyBvbiB0aGUgUGFyYW1ldGVyIFJlcXVlc3QgTGlzdCwgYnV0IE1VU1QgYWxzbyBiZSBzdXBwbGllZCBpZgorICAgdGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIGJlbGlldmVkIGl0IHdvdWxkIGxhdGVyIGJlIHVzZWZ1bCB0byB0aGUKKyAgIGNsaWVudCAoc3VjaCBhcyBiZWNhdXNlIHRoZSBzZXJ2ZXIgaXMgY29uZmlndXJlZCB0byBvZmZlciBhIHNlY29uZC0KKyAgIHN0YWdlIGJvb3QgaW1hZ2UsIHdoaWNoIHRoZXkga25vdyB3aWxsIG1ha2UgdXNlIG9mIGl0KS4gIFRoZSBvcHRpb24KKyAgIE1VU1QgTk9UIGJlIHN1cHBsaWVkIGlmIG5vIHZhbHVlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIGl0LCBvciBpZiBhCisgICB2YWx1ZSBvZiB6ZXJvIGxlbmd0aCBoYXMgYmVlbiBjb25maWd1cmVkLgorCisgICBUaGUgREhDUCBjbGllbnQgTVVTVCBvbmx5IGNhY2hlIHRoaXMgb3B0aW9uIGluIGEgbG9jYXRpb24gdGhlIHNlY29uZC0KKyAgIHN0YWdlIGJvb3Rsb2FkZXIgbWF5IGFjY2Vzcy4KKworICAgVGhlIHNlY29uZC1zdGFnZSBib290bG9hZGVyIE1VU1QsIGluIGNvbmNlcnQgd2l0aCBvdGhlciBESENQIG9wdGlvbnMKKyAgIGFuZCBmaWVsZHMsIHVzZSB0aGlzIG9wdGlvbidzIHZhbHVlIGFzIGEgZmlsZW5hbWUgdG8gYmUgbG9hZGVkIHZpYQorICAgVEZUUCBhbmQgcmVhZCBmb3IgZnVydGhlciBzZWNvbmQtc3RhZ2UtbG9hZGVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAgIHBhcmFtZXRlcnMuICBUaGUgZm9ybWF0IGFuZCBjb250ZW50IG9mIHN1Y2ggYSBmaWxlIGlzIHNwZWNpZmljIHRvIHRoZQorICAgc2Vjb25kLXN0YWdlIGJvb3Rsb2FkZXIsIGFuZCBhcyBzdWNoLCBpcyBvdXQgb2Ygc2NvcGUgb2YgdGhpcworICAgZG9jdW1lbnQuCisKKworCisKKworCisKKworSGFua2lucyAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDZdCisMCitSRkMgNTA3MSAgICAgICAgICAgICAgICAgICAgUFhFTElOVVggT3B0aW9ucyAgICAgICAgICAgICAgIERlY2VtYmVyIDIwMDcKKworCis1LiAgUGF0aCBQcmVmaXggT3B0aW9uCisKKzUuMS4gIERlc2NyaXB0aW9uCisKKyAgIEluIFBYRUxJTlVYJyBjYXNlLCBpdCBpcyBvZnRlbiB0aGUgY2FzZSB0aGF0IHNldmVyYWwgZGlmZmVyZW50CisgICBlbnZpcm9ubWVudHMgd291bGQgaGF2ZSB0aGUgc2FtZSBURlRQIHBhdGggcHJlZml4LCBidXQgd291bGQgaGF2ZQorICAgZGlmZmVyZW50IGZpbGVuYW1lcyAoZm9yIGV4YW1wbGU6IGhvc3RzJyBib290bG9hZGVyIGltYWdlcyBhbmQgY29uZmlnCisgICBmaWxlcyBtYXkgYmUga2VwdCBpbiBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZGVyaXZlZCBmcm9tIHRoZWlyIE1lZGlhCisgICBBY2Nlc3MgQ29udHJvbCAoTUFDKSBhZGRyZXNzKS4gIENvbnNlcXVlbnRseSwgaXQgd2FzIGRlZW1lZAorICAgd29ydGh3aGlsZSB0byBkZWxpdmVyIGEgVEZUUCBwYXRoIHByZWZpeCBjb25maWd1cmF0aW9uIG9wdGlvbiwgc28KKyAgIHRoYXQgdGhlc2UgdHdvIHRoaW5ncyBjb3VsZCBiZSBjb25maWd1cmVkIHNlcGFyYXRlbHkgaW4gYSBESENQIFNlcnZlcgorICAgY29uZmlndXJhdGlvbjogdGhlIHByZWZpeCBhbmQgdGhlIHBvc3NpYmx5IGhvc3Qtc3BlY2lmaWMgZmlsZQorICAgbG9jYXRpb24uCisKKyAgIFRoZSBhY3R1YWwgZmlsZW5hbWUgdGhhdCBQWEVMSU5VWCByZXF1ZXN0cyBmcm9tIGl0cyBURlRQIHNlcnZlciBpcworICAgZGVyaXZlZCBieSBwcmVwZW5kaW5nIHRoaXMgdmFsdWUgdG8gdGhlIENvbmZpZyBGaWxlIE9wdGlvbiBhYm92ZS4KKyAgIE9uY2UgdGhpcyBjb25maWcgZmlsZSBpcyBsb2FkZWQgYW5kIGR1cmluZyBwcm9jZXNzaW5nLCBhbnkgVEZUUCBmaWxlCisgICBwYXRocyBzcGVjaWZpZWQgd2l0aGluIGl0IGFyZSBzaW1pbGFybHkgcHJvY2Vzc2VkIC0tIHByZXBlbmRpbmcgdGhlCisgICBjb250ZW50cyBvZiB0aGlzIG9wdGlvbi4KKworNS4yLiAgUGFja2V0IEZvcm1hdAorCisgICBUaGUgUGF0aCBQcmVmaXggT3B0aW9uIGZvcm1hdCBpcyBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICAgIENvZGUgICAgTGVuZ3RoICAgUGF0aC1QcmVmaXguLi4KKyAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAgICAgICB8ICAgMjEwICB8ICAgIG4gICB8ICAgcDEgICB8ICAgcDIgICB8ICAgLi4uICB8ICAgcChuKSB8CisgICAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKKworICAgVGhlIGNvZGUgZm9yIHRoaXMgb3B0aW9uIGlzIDIxMC4gIFRoZSBQYXRoIFByZWZpeCBpcyBhbiBOVlQtQVNDSUkKKyAgIHByaW50YWJsZSBzdHJpbmc7IGl0IGlzIG5vdCB0ZXJtaW5hdGVkIGJ5IHplcm8gb3IgYW55IG90aGVyIHZhbHVlLgorCis1LjMuICBBcHBsaWNhYmlsaXR5CisKKyAgIFRoaXMgb3B0aW9uIGNhbWUgaW50byBleGlzdGVuY2UgYmVjYXVzZSBzZXJ2ZXIgYWRtaW5pc3RyYXRvcnMgZm91bmQKKyAgIGl0IHVzZWZ1bCB0byBjb25maWd1cmUgdGhlIHByZWZpeCBhbmQgc3VmZml4IG9mIHRoZSBjb25maWcgZmlsZSBwYXRoCisgICBzZXBhcmF0ZWx5LiAgQSBncm91cCBvZiBkaWZmZXJlbnQgUFhFIGJvb3RpbmcgY2xpZW50cyBtYXkgdXNlIHRoZQorICAgc2FtZSBwYXRoIHByZWZpeCwgYnV0IGRpZmZlcmVudCBmaWxlbmFtZXMsIG9yIHZpY2UgdmVyc2EuCisKKyAgIFRoZSAnc2hvcnRjdXQnIHRoaXMgcmVwcmVzZW50cyBpcyB3b3J0aHdoaWxlLCBidXQgaXQgaXMgcXVlc3Rpb25hYmxlCisgICB3aGV0aGVyIHRoYXQgbmVlZHMgdG8gbWFuaWZlc3QgaXRzZWxmIG9uIHRoZSBwcm90b2NvbCB3aXJlLgorCisKKworCisKKworCisKKworCitIYW5raW5zICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgN10KKwwKK1JGQyA1MDcxICAgICAgICAgICAgICAgICAgICBQWEVMSU5VWCBPcHRpb25zICAgICAgICAgICAgICAgRGVjZW1iZXIgMjAwNworCisKKyAgIEl0IG9ubHkgYmVjb21lcyBpbnRlcmVzdGluZyBmcm9tIGEgcHJvdG9jb2wgc3RhbmRwb2ludCBpZiBvdGhlcgorICAgb3B0aW9ucyBhcmUgYWRvcHRlZCB0aGF0IHByZWZpeCB0aGlzIHZhbHVlIGFzIHdlbGwgLS0gcGVyZm9ybWluZyBhCisgICBraW5kIG9mIHN0cmluZyBjb21wcmVzc2lvbiBpcyBoaWdobHkgYmVuZWZpY2lhbCB0byB0aGUgbGltaXRlZAorICAgYXZhaWxhYmxlIERIQ1Agb3B0aW9uIHNwYWNlLgorCisgICBCdXQgaXQncyBjbGVhcmx5IGluYXBwbGljYWJsZSB0byBhbnkgY3VycmVudCB1c2Ugb2YsIGUuZy4sIHRoZQorICAgRklMRU5BTUUgaGVhZGVyIGNvbnRlbnRzIG9yIHRoZSBESENQIEJvb3QgRmlsZSBOYW1lIG9wdGlvbiAoIzY3KS4KKyAgIFVzZSBvZiB0aGVzZSBmaWVsZHMgaXMgZW5jb2RlZCBvbiBmaXJtd2FyZSBvZiB0aG91c2FuZHMgb2YgZGV2aWNlcworICAgdGhhdCBjYW4ndCBvciBhcmUgbm90IGxpa2VseSB0byBiZSB1cGdyYWRlZC4gIEFsdGVyaW5nIGFueSBiZWhhdmlvdXIKKyAgIGhlcmUgaXMgbGlrZWx5IHRvIGNhdXNlIHNldmVyZSBjb21wYXRpYmlsaXR5IHByb2JsZW1zLgorCisgICBBbHRob3VnaCBjb21wcmVzc2lvbiBvZiB0aGUgVEZUUC1sb2FkZWQgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRlbnRzCisgICBpcyBub3QgYSBjb21wZWxsaW5nIGZhY3RvciwgY29udHJpdmVkIGNvbmZpZ3VyYXRpb25zIHVzaW5nIHRoZXNlCisgICB2YWx1ZXMgbWF5IGFsc28gZXhpc3Q6IHdoZXJlIGVhY2ggb2YgYSBsYXJnZSB2YXJpZXR5IG9mIGRpZmZlcmVudAorICAgY2xpZW50cyBsb2FkIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gZmlsZSwgd2l0aCB0aGUgc2FtZSBjb250ZW50cywgYnV0CisgICBkdWUgdG8gYSBkaWZmZXJlbnRseSBjb25maWd1cmVkIHBhdGggcHJlZml4IGFjdHVhbGx5IGxvYWQgZGlmZmVyZW50CisgICBpbWFnZXMuICBXaGV0aGVyIHRoaXMgc29ydCBvZiB1c2UgaXMgdHJ1bHkgbmVlZGVkIHJlbWFpbnMgdW5wcm92ZW4uCisKKzUuNC4gIFJlc3BvbnNlIHRvIFJGQyAzOTQyCisKKyAgIFRoZSBjb2RlIDIxMCB3aWxsIGJlIGFkb3B0ZWQgZm9yIHRoaXMgcHVycG9zZS4KKworNS41LiAgQ2xpZW50IGFuZCBTZXJ2ZXIgQmVoYXZpb3VyCisKKyAgIFRoZSBQYXRoIFByZWZpeCBvcHRpb24gTVVTVCBiZSBzdXBwbGllZCBieSB0aGUgREhDUCBzZXJ2ZXIgaWYgaXQKKyAgIGFwcGVhcnMgb24gdGhlIFBhcmFtZXRlciBSZXF1ZXN0IExpc3QsIGJ1dCBNVVNUIGFsc28gYmUgc3VwcGxpZWQgaWYKKyAgIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRvciBiZWxpZXZlZCBpdCB3b3VsZCBsYXRlciBiZSB1c2VmdWwgdG8gdGhlCisgICBjbGllbnQgKHN1Y2ggYXMgYmVjYXVzZSB0aGUgc2VydmVyIGlzIGNvbmZpZ3VyZWQgdG8gb2ZmZXIgYSBzZWNvbmQtCisgICBzdGFnZSBib290IGltYWdlIHRoYXQgdGhleSBrbm93IHdpbGwgbWFrZSB1c2Ugb2YgaXQpLiAgVGhlIG9wdGlvbgorICAgTVVTVCBOT1QgYmUgc3VwcGxpZWQgaWYgbm8gdmFsdWUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgaXQsIG9yIGlmIGEKKyAgIHZhbHVlIG9mIHplcm8gbGVuZ3RoIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCisKKyAgIFRoZSBESENQIGNsaWVudCBNVVNUIG9ubHkgY2FjaGUgdGhpcyBvcHRpb24gaW4gYSBsb2NhdGlvbiB3aGVyZSB0aGUKKyAgIHNlY29uZC1zdGFnZSBib290bG9hZGVyIG1heSBhY2Nlc3MgaXQuCisKKyAgIFRoZSBzZWNvbmQtc3RhZ2UgYm9vdGxvYWRlciBNVVNUIHByZXBlbmQgdGhpcyBvcHRpb24ncyB2YWx1ZSwgaWYgYW55LAorICAgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBDb25maWdGaWxlIG9wdGlvbiBwcmlvciB0byBvYnRhaW5pbmcgdGhlCisgICByZXN1bHRpbmcgdmFsdWUgdmlhIFRGVFAsIG9yIHRoZSBkZWZhdWx0ICdDb25maWcgRmlsZSBTZWFyY2ggUGF0aCcsCisgICB3aGljaCB0aGUgc2Vjb25kLXN0YWdlIGJvb3Rsb2FkZXIgaXRlcmF0ZXMgaW4gdGhlIGFic2VuY2Ugb2YgYSBDb25maWcKKyAgIEZpbGUgT3B0aW9uLiAgVGhlIGNsaWVudCBNQVkgcHJlcGVuZCB0aGUgdmFsdWUgdG8gb3RoZXIgY29uZmlndXJhdGlvbgorICAgZGlyZWN0aXZlcyB3aXRoaW4gdGhhdCBmaWxlIG9uY2UgaXQgaGFzIGJlZW4gbG9hZGVkLiAgVGhlIGNsaWVudCBNVVNUCisgICBOT1QgcHJlcGVuZCB0aGlzIG9wdGlvbidzIHZhbHVlIHRvIGFueSBvdGhlciBESENQIG9wdGlvbiBjb250ZW50cyBvcgorICAgZmllbGQsIHVubGVzcyBleHBsaWNpdGx5IHN0YXRlZCBpbiBhIGRvY3VtZW50IGRlc2NyaWJpbmcgdGhhdCBvcHRpb24KKyAgIG9yIGZpZWxkLgorCisKKworCisKKworCitIYW5raW5zICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOF0KKwwKK1JGQyA1MDcxICAgICAgICAgICAgICAgICAgICBQWEVMSU5VWCBPcHRpb25zICAgICAgICAgICAgICAgRGVjZW1iZXIgMjAwNworCisKKzYuICBSZWJvb3QgVGltZSBPcHRpb24KKworNi4xLiAgRGVzY3JpcHRpb24KKworICAgU2hvdWxkIFBYRUxJTlVYIGJlIGV4ZWN1dGVkLCBhbmQgdGhlbiBmb3Igc29tZSByZWFzb24sIGJlIHVuYWJsZSB0bworICAgcmVhY2ggaXRzIFRGVFAgc2VydmVyIHRvIGNvbnRpbnVlIGJvb3RzdHJhcHBpbmcsIHRoZSBjbGllbnQgd2lsbCwgYnkKKyAgIGRlZmF1bHQsIHJlYm9vdCBpdHNlbGYgYWZ0ZXIgMzAwIHNlY29uZHMgaGF2ZSBwYXNzZWQuICBUaGlzIG1heSBiZQorICAgdG9vIGxvbmcsIHRvbyBzaG9ydCwgb3IgaW5hcHByb3ByaWF0ZSBiZWhhdmlvdXIgZW50aXJlbHksIGRlcGVuZGluZworICAgb24gdGhlIGVudmlyb25tZW50LgorCisgICBCeSBjb25maWd1cmluZyBhIG5vbi16ZXJvIHZhbHVlIGluIHRoaXMgb3B0aW9uLCBhZG1pbnMgY2FuIGluZm9ybQorICAgUFhFTElOVVggb2Ygd2hpY2ggc3BlY2lmaWMgdGltZW91dCBpcyBkZXNpcmVkLiAgVGhlIGNsaWVudCB3aWxsCisgICByZWJvb3QgaXRzZWxmIGlmIGl0IGZhaWxzIHRvIGFjaGlldmUgaXRzIGNvbmZpZ3VyZWQgbmV0d29yayByZXNvdXJjZXMKKyAgIHdpdGhpbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzLgorCisgICBUaGlzIHJlYm9vdCB3aWxsIHJ1biB0aHJvdWdoIHRoZSBzeXN0ZW0ncyBub3JtYWwgYm9vdC10aW1lIGV4ZWN1dGlvbgorICAgcGF0aCwgbW9zdCBsaWtlbHkgbGVhZGluZyBpdCBiYWNrIHRvIFBYRSBhbmQgdGhlcmVmb3JlIFBYRUxJTlVYLiAgU28sCisgICBpbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGlzIGlzIGFraW4gdG8gcmV0dXJuaW5nIHRoZSBjbGllbnQgdG8gdGhlIERIQ1AKKyAgIElOSVQgc3RhdGUuCisKKyAgIEJ5IGNvbmZpZ3VyaW5nIHplcm8sIHRoZSBmZWF0dXJlIGlzIGRpc2FibGVkLCBhbmQgaW5zdGVhZCB0aGUgY2xpZW50CisgICBjaG9vc2VzIHRvIHJlbW92ZSBpdHNlbGYgZnJvbSB0aGUgbmV0d29yayBhbmQgd2FpdCBpbmRlZmluaXRlbHkgZm9yCisgICBvcGVyYXRvciBpbnRlcnZlbnRpb24uCisKKyAgIEl0IHNob3VsZCBiZSBzdHJlc3NlZCB0aGF0IHRoaXMgaXMgaW4gbm8gd2F5IHJlbGF0ZWQgdG8gY29uZmlndXJpbmcgYQorICAgbGVhc2UgdGltZS4gIFRoZSBwZXJjZWl2ZWQgdHJhbnNpdGlvbiB0byBJTklUIHN0YXRlIGlzIGR1ZSB0byBjbGllbnQKKyAgIHJ1bm5pbmcgc3RhdGUgLS0gcmVpbml0aWFsaXppbmcgaXRzZWxmIC0tIG5vdCBkdWUgdG8gbGVhc2UgdGltZXIKKyAgIGFjdGl2aXR5LiAgVGhhdCBpcywgaXQgaXMgbm90IHNhZmUgdG8gYXNzdW1lIHRoYXQgYSBQWEVMSU5VWCBjbGllbnQKKyAgIHdpbGwgYWJhbmRvbiBpdHMgbGVhc2Ugd2hlbiB0aGlzIHRpbWVyIGV4cGlyZXMuCisKKzYuMi4gIFBhY2tldCBGb3JtYXQKKworICAgVGhlIFJlYm9vdCBUaW1lIE9wdGlvbiBmb3JtYXQgaXMgYXMgZm9sbG93czoKKworICAgICAgICAgICAgICBDb2RlICAgIExlbmd0aAorICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICAgICAgIHwgICAyMTEgIHwgICAgNCAgIHwgICAgICAgICAgICBSZWJvb3QgVGltZSAgICAgICAgICAgIHwKKyAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworCisgICBUaGUgY29kZSBmb3IgdGhpcyBvcHRpb24gaXMgMjExLiAgVGhlIGxlbmd0aCBpcyBhbHdheXMgZm91ci4gIFRoZQorICAgUmVib290IFRpbWUgaXMgYSAzMi1iaXQgKDQgYnl0ZSkgaW50ZWdlciBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisKKworCisKKworCisKKworCisKK0hhbmtpbnMgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA5XQorDAorUkZDIDUwNzEgICAgICAgICAgICAgICAgICAgIFBYRUxJTlVYIE9wdGlvbnMgICAgICAgICAgICAgICBEZWNlbWJlciAyMDA3CisKKworNi4zLiAgQXBwbGljYWJpbGl0eQorCisgICBBbnkgbmV0d29yayBib290c3RyYXAgcHJvZ3JhbSBpbiBhbnkgc3VmZmljaWVudGx5IGNvbXBsZXggbmV0d29ya2luZworICAgZW52aXJvbm1lbnQgY291bGQgY29uY2VpdmFibHkgZW50ZXIgaW50byBzdWNoIGEgc2ltaWxhciBjb25kaXRpb24sCisgICBlaXRoZXIgZHVlIHRvIGhhdmluZyBpdHMgSVAgYWRkcmVzcyBzdG9sZW4gb3V0IGZyb20gdW5kZXIgaXQgYnkgYQorICAgcm9ndWUgY2xpZW50IG9uIHRoZSBuZXR3b3JrLCBieSBiZWluZyBtb3ZlZCBiZXR3ZWVuIG5ldHdvcmtzIHdoZXJlCisgICBpdHMgUFhFLWRlcml2ZWQgREhDUCBsZWFzZSBpcyBubyBsb25nZXIgdmFsaWQsIG9yIGFueSBzaW1pbGFyIG1lYW5zLgorCisgICBJdCBzZWVtcyBkZXNpcmFibGUgZm9yIGFueSBuZXR3b3JrIGJvb3RzdHJhcCBhZ2VudCB0byBpbXBsZW1lbnQgYW4KKyAgIHVsdGltYXRlIHRpbWVvdXQgZm9yIGl0IHRvIHN0YXJ0IG92ZXIuCisKKyAgIFRoZSBjbGllbnQgbWF5LCBmb3IgZXhhbXBsZSwgZ2V0IGRpZmZlcmVudCB3b3JraW5nIGNvbmZpZ3VyYXRpb24KKyAgIHBhcmFtZXRlcnMgZnJvbSBhIGRpZmZlcmVudCBESENQIHNlcnZlciB1cG9uIHJlc3RhcnRpbmcuCisKKzYuNC4gIFJlc3BvbnNlIHRvIFJGQyAzOTQyCisKKyAgIFRoZSBjb2RlIDIxMSB3aWxsIGJlIGFkb3B0ZWQgZm9yIHRoaXMgcHVycG9zZS4KKworNi41LiAgQ2xpZW50IGFuZCBTZXJ2ZXIgQmVoYXZpb3VyCisKKyAgIFRoZSBSZWJvb3QgVGltZSBPcHRpb24gTVVTVCBiZSBzdXBwbGllZCBieSB0aGUgREhDUCBzZXJ2ZXIgaWYgaXQKKyAgIGFwcGVhcnMgb24gdGhlIFBhcmFtZXRlciBSZXF1ZXN0IExpc3QsIGJ1dCBNVVNUIGFsc28gYmUgc3VwcGxpZWQgaWYKKyAgIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRvciBiZWxpZXZlZCBpdCB3b3VsZCBsYXRlciBiZSB1c2VmdWwgdG8gdGhlCisgICBjbGllbnQgKHN1Y2ggYXMgYmVjYXVzZSB0aGUgc2VydmVyIGlzIGNvbmZpZ3VyZWQgdG8gb2ZmZXIgYSBzZWNvbmQtCisgICBzdGFnZSBib290IGltYWdlIHRoYXQgdGhleSBrbm93IHdpbGwgbWFrZSB1c2Ugb2YgaXQpLiAgVGhlIG9wdGlvbgorICAgTVVTVCBOT1QgYmUgc3VwcGxpZWQgaWYgbm8gdmFsdWUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgaXQsIG9yIGlmIGl0CisgICBjb250YWlucyBhIHZhbHVlIG9mIHplcm8gbGVuZ3RoLgorCisgICBUaGUgREhDUCBjbGllbnQgTVVTVCBvbmx5IGNhY2hlIHRoaXMgb3B0aW9uIGluIGEgbG9jYXRpb24gdGhlIHNlY29uZC0KKyAgIHN0YWdlIGJvb3Rsb2FkZXIgbWF5IGFjY2Vzcy4KKworICAgSWYgdGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uIGlzIG5vbnplcm8sIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdGxvYWRlcgorICAgTVVTVCBzY2hlZHVsZSBhIHRpbWVvdXQ6IGFmdGVyIGEgbnVtYmVyIG9mIHNlY29uZHMgZXF1YWwgdG8gdGhpcworICAgb3B0aW9uJ3MgdmFsdWUgaGF2ZSBwYXNzZWQsIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdGxvYWRlciBNVVNUIHJlYm9vdAorICAgdGhlIHN5c3RlbSwgdWx0aW1hdGVseSByZXR1cm5pbmcgdGhlIHBhdGggb2YgZXhlY3V0aW9uIGJhY2sgdG8gdGhlCisgICBmaXJzdC1zdGFnZSBib290bG9hZGVyLiAgSXQgTVVTVCBOT1QgcmVib290IHRoZSBzeXN0ZW0gb25jZSB0aGUKKyAgIHRocmVhZCBvZiBleGVjdXRpb24gaGFzIGJlZW4gcGFzc2VkIHRvIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0gKGF0CisgICB3aGljaCBwb2ludCwgdGhpcyB0aW1lb3V0IGlzIGVmZmVjdGl2ZWx5IG9idmlhdGVkKS4KKworICAgSWYgdGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uIGlzIHplcm8sIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdGxvYWRlciBNVVNUCisgICBOT1Qgc2NoZWR1bGUgc3VjaCBhIHRpbWVvdXQgYXQgYWxsLiAgQW55IHNlY29uZC1zdGFnZSBib290bG9hZGVyIHRoYXQKKyAgIGZpbmRzIGl0IGhhcyBlbmNvdW50ZXJlZCBleGNlc3NpdmUgdGltZW91dHMgYXR0ZW1wdGluZyB0byBvYnRhaW4gaXRzCisgICBob3N0IG9wZXJhdGluZyBzeXN0ZW0gU0hPVUxEIGRpc2Nvbm5lY3QgaXRzZWxmIGZyb20gdGhlIG5ldHdvcmsgdG8KKyAgIHdhaXQgZm9yIG9wZXJhdG9yIGludGVydmVudGlvbiwgYnV0IE1BWSBjb250aW51ZSB0byBhdHRlbXB0IHRvCisgICBhY3F1aXJlIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0gaW5kZWZpbml0ZWx5LgorCisKKworCisKKworSGFua2lucyAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMTBdCisMCitSRkMgNTA3MSAgICAgICAgICAgICAgICAgICAgUFhFTElOVVggT3B0aW9ucyAgICAgICAgICAgICAgIERlY2VtYmVyIDIwMDcKKworCis3LiAgU3BlY2lmaWNhdGlvbiBDb25mb3JtYW5jZQorCisgICBUbyBjb25mb3JtIHRvIHRoaXMgc3BlY2lmaWNhdGlvbiwgY2xpZW50cyBhbmQgc2VydmVycyBNVVNUIGltcGxlbWVudAorICAgdGhlIENvbmZpZ3VyYXRpb24gRmlsZSwgUGF0aCBQcmVmaXgsIGFuZCBSZWJvb3QgVGltZSBvcHRpb25zIGFzCisgICBkaXJlY3RlZC4KKworICAgVGhlIE1BR0lDIG9wdGlvbiBNQVkgTk9UIGJlIGltcGxlbWVudGVkLCBhcyBpdCBoYXMgYmVlbiBkZXByZWNhdGVkLgorCis4LiAgU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMKKworICAgUFhFIGFuZCBQWEVMSU5VWCBhbGxvdyBhbnkgZW50aXR5IGFjdGluZyBhcyBhIERIQ1Agc2VydmVyIHRvIGV4ZWN1dGUKKyAgIGFyYml0cmFyeSBjb2RlIHVwb24gYSBzeXN0ZW0uICBBdCBwcmVzZW50LCBubyBQWEUgaW1wbGVtZW50YXRpb24gaXMKKyAgIGtub3duIHRvIGltcGxlbWVudCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIFs3XSBzbyB0aGF0IFBYRSBjbGllbnRzCisgICBjYW4gYmUgc3VyZSB0aGV5IGFyZSByZWNlaXZpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICAgY29ycmVjdCwgYXV0aG9yaXRhdGl2ZSBESENQIHNlcnZlci4KKworICAgVGhlIHVzZSBvZiBURlRQIGJ5IFBYRSBhbmQgUFhFTElOVVggYWxzbyBsYWNrcyBhbnkgZm9ybSBvZgorICAgY3J5cHRvZ3JhcGhpYyBzaWduYXR1cmUgLS0gc28gYSAnTWFuIGluIHRoZSBNaWRkbGUnIGF0dGFjayBtYXkgbGVhZAorICAgdG8gYW4gYXR0YWNrZXIncyBjb2RlIGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSBjbGllbnQgc3lzdGVtLiAgU2luY2UKKyAgIHRoaXMgaXMgbm90IGFuIGVuY3J5cHRlZCBjaGFubmVsLCBhbnkgb2YgdGhlIFRGVFAgbG9hZGVkIGRhdGEgbWF5CisgICBhbHNvIGJlIGV4cG9zZWQgKHN1Y2ggYXMgaW4gbG9hZGluZyBhICJSQU1ESVNLIiBpbWFnZSwgd2hpY2ggY29udGFpbnMKKyAgIC9ldGMvcGFzc3dkIG9yIHNpbWlsYXIgaW5mb3JtYXRpb24pLgorCisgICBUaGUgdXNlIG9mIHRoZSBFdGhlcm5ldCBNQUMgQWRkcmVzcyBhcyB0aGUgY2xpZW50J3MgdW5pcXVlIGlkZW50aXR5CisgICBtYXkgYWxsb3cgYW4gYXR0YWNrZXIgd2hvIHRha2VzIG9uIHRoYXQgaWRlbnRpdHkgdG8gZ2FpbgorICAgaW5hcHByb3ByaWF0ZSBhY2Nlc3MgdG8gYSBjbGllbnQgc3lzdGVtJ3MgbmV0d29yayByZXNvdXJjZXMgYnkgYmVpbmcKKyAgIGdpdmVuIGJ5IHRoZSBESENQIHNlcnZlciB3aGF0ZXZlciAna2V5cycgYXJlIHJlcXVpcmVkLCBpbiBmYWN0LCB0byBiZQorICAgdGhlIHRhcmdldCBzeXN0ZW0gKHRvIGJvb3QgdXAgYXMgdGhvdWdoIGl0IHdlcmUgdGhlIHRhcmdldCkuCisKKyAgIEdyZWF0IGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIHNlY3VyZSBQWEUgYW5kIFBYRUxJTlVYIGluc3RhbGxhdGlvbnMsCisgICBzdWNoIGFzIGJ5IHVzaW5nIElQIGZpcmV3YWxscywgdG8gcmVkdWNlIG9yIGVsaW1pbmF0ZSB0aGVzZSBjb25jZXJucy4KKworICAgQSBuZWFyYnkgYXR0YWNrZXIgbWlnaHQgZmVlZCBhICJSZWJvb3QgVGltZSIgb3B0aW9uIHZhbHVlIG9mIDEgc2Vjb25kCisgICB0byBhIG1hc3Mgb2YgdW5zdXNwZWN0aW5nIGNsaWVudHMsIHRvIGVmZmVjdCBhIERlbmlhbCBPZiBTZXJ2aWNlCisgICAoRG9TKSB1cG9uIHRoZSBESENQIHNlcnZlciwgYnV0IHRoZW4gYWdhaW4gaXQgbWF5IGp1c3QgYXMgZWFzaWx5CisgICBzdXBwbHkgdGhlc2UgY2xpZW50cyB3aXRoIHJvZ3VlIHNlY29uZC1zdGFnZSBib290bG9hZGVycyB0aGF0IHNpbXBseQorICAgdHJhbnNtaXQgYSBmbG9vZCBvZiBwYWNrZXRzLgorCisgICBUaGlzIGRvY3VtZW50IGluIGFuZCBieSBpdHNlbGYgcHJvdmlkZXMgbm8gc2VjdXJpdHksIG5vciBkb2VzIGl0CisgICBpbXBhY3QgZXhpc3RpbmcgRENIUCBzZWN1cml0eSBhcyBkZXNjcmliZWQgaW4gUkZDIDIxMzEgWzNdLgorCis5LiAgSUFOQSBDb25zaWRlcmF0aW9ucworCisgICBJQU5BIGhhcyBkb25lIHRoZSBmb2xsb3dpbmc6CisKKyAgIDEuICBNb3ZlZCBESENQdjQgT3B0aW9uIGNvZGUgMjA4IGZyb20gJ1RlbnRhdGl2ZWx5IEFzc2lnbmVkJyB0bworICAgICAgICdBc3NpZ25lZCcsIHJlZmVyZW5jaW5nIHRoaXMgZG9jdW1lbnQuICBJQU5BIGhhcyBtYXJrZWQgdGhpcyBzYW1lCisgICAgICAgb3B0aW9uIGNvZGUsIDIwOCwgYXMgRGVwcmVjYXRlZC4KKworCisKK0hhbmtpbnMgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDExXQorDAorUkZDIDUwNzEgICAgICAgICAgICAgICAgICAgIFBYRUxJTlVYIE9wdGlvbnMgICAgICAgICAgICAgICBEZWNlbWJlciAyMDA3CisKKworICAgMi4gIE1vdmVkIERIQ1B2NCBPcHRpb24gY29kZSAyMDkgZnJvbSAnVGVudGF0aXZlbHkgQXNzaWduZWQnIHRvCisgICAgICAgJ0Fzc2lnbmVkJywgcmVmZXJlbmNpbmcgdGhpcyBkb2N1bWVudC4KKworICAgMy4gIE1vdmVkIERIQ1B2NCBPcHRpb24gY29kZSAyMTAgZnJvbSAnVGVudGF0aXZlbHkgQXNzaWduZWQnIHRvCisgICAgICAgJ0Fzc2lnbmVkJywgcmVmZXJlbmNpbmcgdGhpcyBkb2N1bWVudC4KKworICAgNC4gIE1vdmVkIERIQ1B2NCBPcHRpb24gY29kZSAyMTEgZnJvbSAnVGVudGF0aXZlbHkgQXNzaWduZWQnIHRvCisgICAgICAgJ0Fzc2lnbmVkJywgcmVmZXJlbmNpbmcgdGhpcyBkb2N1bWVudC4KKworMTAuICBBY2tub3dsZWRnZW1lbnRzCisKKyAgIFRoZXNlIG9wdGlvbnMgd2VyZSBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgZm9yIHRoZSBQWEVMSU5VWCBwcm9qZWN0CisgICBieSBILiBQZXRlciBBbnZpbiwgYW5kIGhlIHdhcyBpbnN0cnVtZW50YWwgaW4gcHJvZHVjaW5nIHRoaXMKKyAgIGRvY3VtZW50LiAgU2hhbmUgS2VyciBoYXMgYWxzbyBwcm92aWRlZCBmZWVkYmFjayB0aGF0IGhhcyBpbXByb3ZlZAorICAgdGhpcyBkb2N1bWVudC4KKworMTEuICBSZWZlcmVuY2VzCisKKzExLjEuICBOb3JtYXRpdmUgUmVmZXJlbmNlcworCisgICBbMV0gIFBvc3RlbCwgSi4gYW5kIEouIFJleW5vbGRzLCAiVGVsbmV0IFByb3RvY29sIFNwZWNpZmljYXRpb24iLAorICAgICAgICBTVEQgOCwgUkZDIDg1NCwgTWF5IDE5ODMuCisKKyAgIFsyXSAgQnJhZG5lciwgUy4sICJLZXkgd29yZHMgZm9yIHVzZSBpbiBSRkNzIHRvIEluZGljYXRlIFJlcXVpcmVtZW50CisgICAgICAgIExldmVscyIsIEJDUCAxNCwgUkZDIDIxMTksIE1hcmNoIDE5OTcuCisKKyAgIFszXSAgRHJvbXMsIFIuLCAiRHluYW1pYyBIb3N0IENvbmZpZ3VyYXRpb24gUHJvdG9jb2wiLCBSRkMgMjEzMSwKKyAgICAgICAgTWFyY2ggMTk5Ny4KKworICAgWzRdICBBbGV4YW5kZXIsIFMuIGFuZCBSLiBEcm9tcywgIkRIQ1AgT3B0aW9ucyBhbmQgQk9PVFAgVmVuZG9yCisgICAgICAgIEV4dGVuc2lvbnMiLCBSRkMgMjEzMiwgTWFyY2ggMTk5Ny4KKworICAgWzVdICBEcm9tcywgUi4sICJQcm9jZWR1cmVzIGFuZCBJQU5BIEd1aWRlbGluZXMgZm9yIERlZmluaXRpb24gb2YgTmV3CisgICAgICAgIERIQ1AgT3B0aW9ucyBhbmQgTWVzc2FnZSBUeXBlcyIsIEJDUCA0MywgUkZDIDI5MzksCisgICAgICAgIFNlcHRlbWJlciAyMDAwLgorCisxMS4yLiAgSW5mb3JtYXRpdmUgUmVmZXJlbmNlcworCisgICBbNl0gIFNvbGxpbnMsIEsuLCAiVGhlIFRGVFAgUHJvdG9jb2wgKFJldmlzaW9uIDIpIiwgU1REIDMzLCBSRkMgMTM1MCwKKyAgICAgICAgSnVseSAxOTkyLgorCisgICBbN10gIERyb21zLCBSLiBhbmQgVy4gQXJiYXVnaCwgIkF1dGhlbnRpY2F0aW9uIGZvciBESENQIE1lc3NhZ2VzIiwKKyAgICAgICAgUkZDIDMxMTgsIEp1bmUgMjAwMS4KKworICAgWzhdICBWb2x6LCBCLiwgIlJlY2xhc3NpZnlpbmcgRHluYW1pYyBIb3N0IENvbmZpZ3VyYXRpb24gUHJvdG9jb2wKKyAgICAgICAgdmVyc2lvbiA0IChESENQdjQpIE9wdGlvbnMiLCBSRkMgMzk0MiwgTm92ZW1iZXIgMjAwNC4KKworCisKKworCitIYW5raW5zICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMl0KKwwKK1JGQyA1MDcxICAgICAgICAgICAgICAgICAgICBQWEVMSU5VWCBPcHRpb25zICAgICAgICAgICAgICAgRGVjZW1iZXIgMjAwNworCisKK0F1dGhvcidzIEFkZHJlc3MKKworICAgRGF2aWQgVy4gSGFua2lucworICAgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuCisgICA5NTAgQ2hhcnRlciBTdHJlZXQKKyAgIFJlZHdvb2QgQ2l0eSwgQ0EgIDk0MDYzCisgICBVUworCisgICBQaG9uZTogKzEgNjUwIDQyMyAxMzA3CisgICBFTWFpbDogRGF2aWRfSGFua2luc0Bpc2Mub3JnCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworSGFua2lucyAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMTNdCisMCitSRkMgNTA3MSAgICAgICAgICAgICAgICAgICAgUFhFTElOVVggT3B0aW9ucyAgICAgICAgICAgICAgIERlY2VtYmVyIDIwMDcKKworCitGdWxsIENvcHlyaWdodCBTdGF0ZW1lbnQKKworICAgQ29weXJpZ2h0IChDKSBUaGUgSUVURiBUcnVzdCAoMjAwNykuCisKKyAgIFRoaXMgZG9jdW1lbnQgaXMgc3ViamVjdCB0byB0aGUgcmlnaHRzLCBsaWNlbnNlcyBhbmQgcmVzdHJpY3Rpb25zCisgICBjb250YWluZWQgaW4gQkNQIDc4LCBhbmQgZXhjZXB0IGFzIHNldCBmb3J0aCB0aGVyZWluLCB0aGUgYXV0aG9ycworICAgcmV0YWluIGFsbCB0aGVpciByaWdodHMuCisKKyAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGFyZSBwcm92aWRlZCBvbiBhbgorICAgIkFTIElTIiBiYXNpcyBhbmQgVEhFIENPTlRSSUJVVE9SLCBUSEUgT1JHQU5JWkFUSU9OIEhFL1NIRSBSRVBSRVNFTlRTCisgICBPUiBJUyBTUE9OU09SRUQgQlkgKElGIEFOWSksIFRIRSBJTlRFUk5FVCBTT0NJRVRZLCBUSEUgSUVURiBUUlVTVCBBTkQKKyAgIFRIRSBJTlRFUk5FVCBFTkdJTkVFUklORyBUQVNLIEZPUkNFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTLCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5UWSBUSEFUIFRIRSBVU0UgT0YKKyAgIFRIRSBJTkZPUk1BVElPTiBIRVJFSU4gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFJJR0hUUyBPUiBBTlkgSU1QTElFRAorICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0ludGVsbGVjdHVhbCBQcm9wZXJ0eQorCisgICBUaGUgSUVURiB0YWtlcyBubyBwb3NpdGlvbiByZWdhcmRpbmcgdGhlIHZhbGlkaXR5IG9yIHNjb3BlIG9mIGFueQorICAgSW50ZWxsZWN0dWFsIFByb3BlcnR5IFJpZ2h0cyBvciBvdGhlciByaWdodHMgdGhhdCBtaWdodCBiZSBjbGFpbWVkIHRvCisgICBwZXJ0YWluIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvciB1c2Ugb2YgdGhlIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluCisgICB0aGlzIGRvY3VtZW50IG9yIHRoZSBleHRlbnQgdG8gd2hpY2ggYW55IGxpY2Vuc2UgdW5kZXIgc3VjaCByaWdodHMKKyAgIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGU7IG5vciBkb2VzIGl0IHJlcHJlc2VudCB0aGF0IGl0IGhhcworICAgbWFkZSBhbnkgaW5kZXBlbmRlbnQgZWZmb3J0IHRvIGlkZW50aWZ5IGFueSBzdWNoIHJpZ2h0cy4gIEluZm9ybWF0aW9uCisgICBvbiB0aGUgcHJvY2VkdXJlcyB3aXRoIHJlc3BlY3QgdG8gcmlnaHRzIGluIFJGQyBkb2N1bWVudHMgY2FuIGJlCisgICBmb3VuZCBpbiBCQ1AgNzggYW5kIEJDUCA3OS4KKworICAgQ29waWVzIG9mIElQUiBkaXNjbG9zdXJlcyBtYWRlIHRvIHRoZSBJRVRGIFNlY3JldGFyaWF0IGFuZCBhbnkKKyAgIGFzc3VyYW5jZXMgb2YgbGljZW5zZXMgdG8gYmUgbWFkZSBhdmFpbGFibGUsIG9yIHRoZSByZXN1bHQgb2YgYW4KKyAgIGF0dGVtcHQgbWFkZSB0byBvYnRhaW4gYSBnZW5lcmFsIGxpY2Vuc2Ugb3IgcGVybWlzc2lvbiBmb3IgdGhlIHVzZSBvZgorICAgc3VjaCBwcm9wcmlldGFyeSByaWdodHMgYnkgaW1wbGVtZW50ZXJzIG9yIHVzZXJzIG9mIHRoaXMKKyAgIHNwZWNpZmljYXRpb24gY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIElFVEYgb24tbGluZSBJUFIgcmVwb3NpdG9yeSBhdAorICAgaHR0cDovL3d3dy5pZXRmLm9yZy9pcHIuCisKKyAgIFRoZSBJRVRGIGludml0ZXMgYW55IGludGVyZXN0ZWQgcGFydHkgdG8gYnJpbmcgdG8gaXRzIGF0dGVudGlvbiBhbnkKKyAgIGNvcHlyaWdodHMsIHBhdGVudHMgb3IgcGF0ZW50IGFwcGxpY2F0aW9ucywgb3Igb3RoZXIgcHJvcHJpZXRhcnkKKyAgIHJpZ2h0cyB0aGF0IG1heSBjb3ZlciB0ZWNobm9sb2d5IHRoYXQgbWF5IGJlIHJlcXVpcmVkIHRvIGltcGxlbWVudAorICAgdGhpcyBzdGFuZGFyZC4gIFBsZWFzZSBhZGRyZXNzIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgSUVURiBhdAorICAgaWV0Zi1pcHJAaWV0Zi5vcmcuCisKKworCisKKworCisKKworCisKKworCitIYW5raW5zICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxNF0KKwwKZGlmZiAtLWdpdCBhL2RvYy9zZGkudHh0IGIvZG9jL3NkaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5YjczZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zZGkudHh0CkBAIC0wLDAgKzEsMTQ5IEBACisJCSAgICAgICBTREkgZmlsZXMKKworCitTeXNsaW51eCBzdXBwb3J0cyBTREkgZmlsZXMgKCAqLnNkaSApLgorCitGZWF0dXJlczoKKyAqIFN1cHBvcnQgZm9yIGd6aXBwZWQgU0RJIGltYWdlcworICogV2hlbiB1c2VkIHdpdGggZ3B4ZWxpbnV4LjAsIGltYWdlcyBjYW4gYmUgZG93bmxvYWRlZCBieSBIVFRQIG9yIEZUUCwKKyAgIGxlYWRpbmcgdG8gZmFzdGVzdCBib290IHRpbWVzLgorCisiU3lzdGVtIERlcGxveW1lbnQgSW1hZ2UiIGlzIGEgZmlsZSBmb3JtYXQgY3JlYXRlZCBieSBNaWNyb3NvZnQgYW5kIG1vc3RseSB1c2VkCitpbiBpdHMgcHJvZHVjdHMgdG8gcHJvdmlkZSBpbiBhIHNpbmdsZSBmaWxlIGEgYm9vdCBsb2FkZXIsIGFuIE9TIGxvYWRlcgorKGxpa2UgTlRMRFIpIGFuZCBhIGRpc2sgb3IgcGFydGl0aW9uIGltYWdlIHRvIGJvb3QgZnJvbSBpdCB3aXRob3V0IGFueQorb3RoZXIgaW5zdGFsbGVkIHByb2dyYW0uIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gYSBQWEUgZW52aXJvbm1lbnQgdG8gYm9vdAorZW1iZWRkZWQgV2luZG93cyB2ZXJzaW9ucyB3aXRob3V0IGJvb3QgZGlzayBzdXBwb3J0LgorCitUaGUgc3VwcG9ydCBvZiBTREkgaW1hZ2VzIGluIFN5c2xpbnV4IGlzIGJhc2VkIG9uIGEgd2hpdGUKK3BhcGVyIGZyb20gU2FhZCBTeWVkLiBZb3UgY2FuIGZpbmQgdGhlIHBhcGVyIGhlcmU6CisKK2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvZG54cGVzcDEvaHRtbC9yYW1fc2RpLmFzcAorCitTREkgc3VwcG9ydCBoYXMgYmVlbiBvbmx5IGJlZW4gdGVzdGVkIHdpdGggU0RJIHYxLjAgd2l0aCBXaW5kb3dzIFhQIEVtYmVkZGVkCitpbWFnZXMgYW5kIG1heSBub3Qgd29yayB3aXRoIGxhdGVyIHZlcnNpb25zIG9yIGFsdGVybmF0aXZlIHVzZXMuCisKKworICAgKysrKyBTdXBwb3J0ZWQgU0RJIGltYWdlcyArKysrCisKK1RvIG1ha2UgYSBTREkgaW1hZ2Ugc3VwcG9ydGVkIGJ5IHB4ZWxpbnV4L2lzb2xpbnV4L3N5c2xpbnV4LCB5b3UgbmVlZCB0bworZm9sbG93IHRoZSBzdGVwcyBiZWxvdyAoZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIGFyZSBpbiB0aGUgd2hpdGUgcGFwZXIKK2NpdGVkIGFib3ZlKToKKworWW91IG5lZWQgdG8gaW5zdGFsbCAiV2luZG93cyBFbWJlZGRlZCBTdHVkaW8iIGFuZCB0byBydW4gdGhlCisiUmVtb3RlIEJvb3QgU2VydmljZSBTZXR1cCIuCisKKzEpIENyZWF0ZSBhIG5ldyBTREkgZmlsZSAoZWc6IHNkaW1nciAvbmV3IHhwZS5zZGkpLgorCisyKSBCZWZvcmUgaW1wb3J0aW5nIHlvdXIgdGFyZ2V0IHBhcnRpdGlvbiwgYWRkIHRoZSBmb2xsb3dpbmcgZmlsZXMKK2luIHRoZSByb290IGZvbGRlcjoKKwkqIG50ZGV0ZWN0LmNvbQorCSogYm9vdC5pbmkKKwlJdHMgY29udGVudCBzaG91bGQgYmU6CisJCVtib290IGxvYWRlcl0KKwkJICBkZWZhdWx0PXJhbWRpc2soMClcV0lORE9XUworCQkgIFtvcGVyYXRpbmcgc3lzdGVtc10KKwkJICByYW1kaXNrKDApXFdJTkRPV1M9IldpbmRvd3MgWFBFICBGcm9tIFJBTSIgL2Zhc3RkZXRlY3QKKyh5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgbmFtZSBhbmQgYWRkIG9wdGlvbnMgbGlrZSAvZGVidWcpCisKK05vdGU6IFlvdXIgcGFydGl0aW9uIG1heSBiZSBjb21wcmVzc2VkICh1c2luZyBjb21wcmVzc2VkIE5URlMpLCBidXQgdGhlc2UgdHdvCitmaWxlcyBuZWVkIHRvIGJlIHVuY29tcHJlc3NlZC4KKworMykgSW1wb3J0IHRoZSBwYXJ0aXRpb24gaW4gdGhlIFNESSBmaWxlIChlZzogc2RpbWdyIHhwZS5zZGkgL3JlYWRwYXJ0OkQ6KS4KK1RoZSBzaXplIG9mIHRoZSBwYXJ0aXRpb24gbXVzdCBiZSBsZXNzIHRoYW4gNTAwIE1CLgorCis0KSBJbXBvcnQgdGhlIGJvb3QgcHJvZ3JhbSBTVEFSVFJPTS5DT00KKyhlZzogc2RpbWdyIHhwZS5zZGkgL2ltcG9ydDpCT09ULDAsQzpcUHJvZ3JhbSBGaWxlc1xXaW5kb3dzIEVtYmVkZGVkXFJlbW90ZSBCb290IFNlcnZpY2VcRG93bmxvYWRzXHN0YXJ0cm9tLmNvbSkKKworNSkgSW1wb3J0IHRoZSBudCBsb2FkZXIgTlRMRFIgaW4gdGhlIFNESSBmaWxlCisoZWc6IHNkaW1nciB4cGUuc2RpIC9pbXBvcnQ6TE9BRCwwLEM6XFByb2dyYW0gRmlsZXNcV2luZG93cyBFbWJlZGRlZFxSZW1vdGUgQm9vdCBTZXJ2aWNlXERvd25sb2Fkc1xudGxkcikKKworTm90ZTogb25seSB0aGUgdmVyc2lvbiBvZiBOVExEUiBwcm92aWRlZCBieSBSZW1vdGUgQm9vdCBTZXJ2aWNlIFNldHVwCithbmQgbG9jYXRlZCBpbiB0aGlzIGRpcmVjdG9yeSBoYXMgYmVlbiB0ZXN0ZWQuIEFjY29yZGluZyB0bworImh0dHA6Ly9za29say5saXZlam91cm5hbC5jb20vNjY3Lmh0bWwiLCAib3Nsb2FkZXIuZXhlIiBmcm9tIHJldGFpbCBYUAorY2FuIGFsc28gYmUgdXNlZCB0byByZXBsYWNlIHRoaXMgTlRMRFIgdmVyc2lvbi4KKworNikgUGFjayB0aGUgU0RJIGZpbGUgKGVnOiBzZGltZ3IgeHBlLnNkaSAvcGFjaykKKworNykgR3ppcCB5b3VyIGltYWdlCitJZiB5b3Ugd2FudCB0byBzcGVlZCB0aGUgZG93bmxvYWQgdGltZSwgeW91IGNhbiBnemlwIHRoZSBpbWFnZSBhcyBpdCB3aWxsCitiZSB1bmNvbXByZXNzZWQgYnkgc3lzbGludXggZHVyaW5nIHRoZSBsb2FkaW5nLiBZb3UgY2FuIHVzZSBzb21lIHByb2dyYW1zCitsaWtlIG50ZnNjbG9uZSAoImh0dHA6Ly93d3cubGludXgtbnRmcy5vcmcvZG9rdS5waHA/aWQ9bnRmc2Nsb25lIikgdG8KK3JlbW92ZSB1bnVzZWQgYmxvY2tzIGZyb20gdGhlIE5URlMgZmlsZXN5c3RlbSBiZWZvcmUgZGVwbG95aW5nIHlvdXIgaW1hZ2UuCisKKzgpIFlvdSBhcmUgbm93IHJlYWR5IHRvIGJvb3QgeW91ciBpbWFnZS4KK1VubGlrZSB0aGUgdHJhZGl0aW9uYWwgd2F5IG9mIHVzaW5nIFNESSBpbWFnZXMgKHN0YXJ0cm9tLm4xMiksIHlvdSBkb24ndCBuZWVkCitvdGhlciBmaWxlcyB0aGFuIHlvdXIgU0RJIGltYWdlIGluIHRoZSB0ZnRwYm9vdCAoZm9yIHB4ZWxpbnV4KSwgdGhlIENECisoZm9yIGlzb2xpbnV4KSwgb3IgdGhlIGhhcmQgZGlzayBmb3Igc3lzbGludXguCisKKyogWW91IGNhbiB1c2UgdGhlIHVzdWFsIG9wdGlvbnMgb2YgcHhlbGludXgvaXNvbGludXgvc3lzbGludXggKGNvbmZpZyBmaWxlLAorY29uZmlnIHBhdGgsIHJlYm9vdCB0aW1lLi4uKQorCitGb3IgZXhhbXBsZSwgYSBzaW1wbGUgY29uZmlndXJhdGlvbiB3aXRoIHB4ZWxpbnV4OgorL3RmdHBib290L3hwZS5zZGkKKy90ZnRwYm9vdC9weGVsaW51eC4wCisvdGZ0cGJvb3QvcHhlbGludXguY2ZnL2RlZmF1bHQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnQ6CisKKwlERUZBVUxUIDAKKwlsYWJlbCAwIFtXaW5YcGVdCisJCUtFUk5FTCBzZGkuYzMyCisJCUFQUEVORCB4cGUuc2RpCisKKworICAgKysrKyBFcnJvciBtZXNzYWdlcyArKysrCisKKyogTm8gJFNESSBzaWduYXR1cmUgaW4gZmlsZQorICAgICAgICBBIFNESSBpbWFnZSBzaG91bGQgYmVnaW4gYnkgYSBzaWduYXR1cmUgIiRTREkiLCB0aGUgc2lnbmF0dXJlIGhhcyBub3QKK2JlZW4gZm91bmQgaW4geW91ciBmaWxlLiBQZXJoYXBzIHlvdXIgZmlsZSBpcyBjb3JydXB0ZWQgb3IgaGFzIG5vdCBiZWVuIGNyZWF0ZWQKK2NvcnJlY3RseS4gUnVuIHNkaW1nciBvbiBpdCB0byBzZWUgaWYgZXZlcnl0aGluZyBpcyBjb3JyZWN0LgorCisqIE5vIEJPT1QgQkxPQiBpbiBpbWFnZQorICAgICAgICBZb3UgaGF2ZSB0byBpbXBvcnQgYSBib290IHByb2dyYW0gKGVnOiBzdGFydHJvbS5jb20pIHdoZW4geW91IG1ha2UKK3lvdXIgU0RJIGltYWdlIChzZWUgYWJvdmUpLiBUaGUgb2Zmc2V0IG9mIHRoaXMgcHJvZ3JhbSBpbiB0aGUgU0RJIGZpbGUKK2lzIGluIHRoZSBTREkgaGVhZGVyIChiZWdpbmluZyBvZiB0aGUgZmlsZSkuIEhvd2V2ZXIsIHRoZSBvZmZzZXQKK2ZvdW5kIGluIHlvdXIgU0RJIGZpbGUgaXMgbnVsbC4KK1lvdSBwcm9iYWJseSBmb3Jnb3QgdG8gaW5jbHVkZSB0aGUgYm9vdCBwcm9ncmFtLiBSdW4gdGhlIHNkaW1nciBwcm9ncmFtCithbmQgbG9vayBpZiB5b3Ugc2VlIGEgbGluZSBsaWtlOgorQk9PVCAweDAwMDAwMDAwLjAwMDAxMDAwIDB4MDAwMDAwMDAuMDAwMDVFQzIuLi4KKyAgICAgICAgICAgICAgICAtLS0tLS0tLQorICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlCisgICAgICAgICAgICAgICAgb2Zmc2V0IGFuZAorICAgICAgICAgICAgICAgIHNob3VsZCBub3QKKyAgICAgICAgICAgICAgICBiZSBudWxsCisKKyogQk9PVCBCTE9CIGlzIGVtcHR5CisgICAgICAgIFNlZSBhYm92ZS4gVGhlIHNpemUgb2YgeW91ciBib290IHByb2dyYW0gaW5jbHVkZWQgaW4gdGhlIFNESQoraXMgbnVsbC4gWW91IHByb2JhYmx5IGltcG9ydGVkIGEgY29ycnVwdGVkIHZlcnNpb24gb2Ygc3RhcnRyb20uY29tLgorUnVuIHNkaW1nciBhbmQgY2hlY2sgdGhlIHNpemUgaW4gdGhlIGZvbGxvd2luZyBsaW5lOgorQk9PVCAweDAwMDAwMDAwLjAwMDAxMDAwIDB4MDAwMDAwMDAuMDAwMDVFQzIuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIG51bGwKKworKiBCT09UIEJMT0IgZXh0ZW5kcyBiZXlvbmQgZmlsZQorICAgICAgICBZb3UgaGF2ZSBhIEJPT1QgQkxPQiBpbiB5b3VyIFNESSBmaWxlLCBidXQgaXRzIHNpemUgaXMgaW52YWxpZAorYmVjYXVzZSBpdHMgZ29lcyBiZXlvbmQgdGhlIHRvdGFsIGltYWdlIHNpemUuIENoZWNrIHRoZSB0b29scyB5b3UgdXNlZAordG8gYnVpbGQgdGhlIGltYWdlIGZpbGUuCisKKyogQk9PVCBCTE9CIHRvbyBsYXJnZSBmb3IgbWVtb3J5CisgICAgICAgIFlvdXIgQk9PVCBCTE9CIHNlZW1zIGNvcnJlY3QsIGhvd2V2ZXIgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkKK3RvIGxvYWQgaXQuIEluY3JlYXNlIHlvdXIgUkFNIG9yIHJlZHVjZSB0aGUgU0RJIHNpemUuIFRoaXMgaXMgYSB2ZXJ5CithYm5vcm1hbCBzaXR1YXRpb24gYXMgdGhlIEJPT1QgQkxPQiBpcyB1c3VhbGx5IHZlcnkgc21hbGwuIFlvdXIgU0RJCitmaWxlIG1pZ2h0IGJlIGNvcnJ1cHRlZC4KKworKiBJbWFnZSB0b28gbGFyZ2UgZm9yIG1lbW9yeQorICAgICAgICBZb3VyIFNESSBmaWxlIHNlZW1zIGNvcnJlY3QsIGhvd2V2ZXIgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkKK3RvIGxvYWQgaXQuIEluY3JlYXNlIHlvdXIgUkFNIG9yIHJlZHVjZSB0aGUgU0RJIHNpemUuCisKKyogU0RJIGhlYWRlciBpcyBjb3JydXB0ZWQKKyAgICAgICAgWW91ciBTREkgZmlsZSBzZWVtcyBjb3JyZWN0LCBidXQgaXRzIGhlYWRlciBjb250YWlucyBhIGNoZWNrc3VtCit0aGF0IGlzIGludmFsaWQuIFlvdSBtb3N0IGxpa2VseSBoYXZlIGEgY29ycnVwdGVkIFNESSBmaWxlLgorCisKKyAgICsrKysgV2FybmluZyBtZXNzYWdlcyArKysrCisKKyogV2FybmluZzogdW5rbm93biBTREkgdmVyc2lvbgorWW91IGFyZSB1c2luZyBhIG5ld2VyIHZlcnNpb24gb2YgU0RJIHRoYW4gdGhlIG9uZSB3aXRoIHdoaWNoIHRoaXMgcHJvZ3JhbQoraGFzIGJlZW4gdGVzdGVkLiBJdCBtYXkgbm90IHdvcmsuIFBsZWFzZSBnaXZlIGZlZWRiYWNrIGFuZCBwcm92aWRlIHlvdXIKK1NESSB2ZXJzaW9uLgpkaWZmIC0tZ2l0IGEvZG9jL3N5c2xpbnV4LnR4dCBiL2RvYy9zeXNsaW51eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3Mzk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zeXNsaW51eC50eHQKQEAgLTAsMCArMSw5MTIgQEAKKwkJCSBUaGUgU3lzbGludXggUHJvamVjdAorCisJCSAgIEEgc3VpdGUgb2YgYm9vdGxvYWRlcnMgZm9yIExpbnV4CisKKwkgQ29weXJpZ2h0IDE5OTQtMjAxMSBILiBQZXRlciBBbnZpbiBhbmQgY29udHJpYnV0b3JzCisKK1RoaXMgcHJvZ3JhbSBpcyBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSwgdmVyc2lvbiAyIG9yLCBhdCB5b3VyIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24uICBUaGVyZSBpcyBubword2FycmFudHksIG5laXRoZXIgZXhwcmVzc2VkIG5vciBpbXBsaWVkLCB0byB0aGUgZnVuY3Rpb24gb2YgdGhpcworcHJvZ3JhbS4gIFBsZWFzZSBzZWUgdGhlIGluY2x1ZGVkIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICBTeXNsaW51eCBub3cgaGFzIGEgaG9tZSBwYWdlIGF0IGh0dHA6Ly9zeXNsaW51eC56eXRvci5jb20vCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIFN5c2xpbnV4IHN1aXRlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYm9vdCBsb2FkZXJzCisoImRlcml2YXRpdmVzIiksIGZvciB0aGVpciByZXNwZWN0aXZlIGJvb3QgbWVkaWE6CisKKwlTWVNMSU5VWCAtIE1TLURPUy9XaW5kb3dzIEZBVCBmaWxlc3lzdGVtCisJUFhFTElOVVggLSBQWEUgbmV0d29yayBib290aW5nCisJSVNPTElOVVggLSBJU085NjYwIENELVJPTQorCUVYVExJTlVYIC0gTGludXggZXh0Mi9leHQzIGZpbGVzeXN0ZW0KKworRm9yIGhpc3RvcmljYWwgcmVhc29ucywgc29tZSBvZiB0aGUgc2VjdGlvbnMgaW4gdGhpcyBkb2N1bWVudCBhcHBsaWVzCit0byB0aGUgRkFUIGxvYWRlciAoU1lTTElOVVgpIG9ubHk7IHNlZSBweGVsaW51eC50eHQsIGlzb2xpbnV4LnR4dCBhbmQKK2V4dGxpbnV4LnR4dCBmb3Igd2hhdCBkaWZmZXJzIGluIHRoZXNlIHZlcnNpb25zLiAgVGhlIGFsbC1jYXBzIHRlcm0KKyJTWVNMSU5VWCIgZ2VuZXJhbGx5IHJlZmVycyB0byB0aGUgRkFUIGxvYWRlciwgd2hlcmVhcyAiU3lzbGludXgiCityZWZlcnMgdG8gdGhlIHByb2plY3QgYXMgYSB3aG9sZS4KKworSGVscCB3aXRoIGNsZWFuaW5nIHVwIHRoZSBkb2NzIHdvdWxkIGJlIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCisKKworICAgKysrKyBPcHRpb25zICsrKysKKworVGhlc2UgYXJlIHRoZSBvcHRpb25zIGNvbW1vbiB0byBhbGwgdmVyc2lvbnMgb2YgU3lzbGludXg6CisKKwktcwlTYWZlLCBzbG93LCBzdHVwaWQ7IHVzZXMgc2ltcGxlciBjb2RlIHRoYXQgYm9vdHMgYmV0dGVyCisJLWYJRm9yY2UgaW5zdGFsbGluZworCS1yCVJhaWQgbW9kZS4gIElmIGJvb3QgZmFpbHMsIHRlbGwgdGhlIEJJT1MgdG8gYm9vdCB0aGUgbmV4dAorCQlkZXZpY2UgaW4gdGhlIGJvb3Qgc2VxdWVuY2UgKHVzdWFsbHkgdGhlIG5leHQgaGFyZCBkaXNrKQorCQlpbnN0ZWFkIG9mIHN0b3BwaW5nIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4KKwkJVGhpcyBpcyB1c2VmdWwgZm9yIFJBSUQtMSBib290aW5nLgorCitUaGVzZSBhcmUgb25seSBpbiB0aGUgV2luZG93cyB2ZXJzaW9uOgorCisJLW0JTWJyOyBpbnN0YWxsIGEgYm9vdGFibGUgTUJSIHNlY3RvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCQlkcml2ZS4KKwktYQlBY3RpdmU7IG1hcmtzIHRoZSBwYXJ0aXRpb24gdXNlZCBhY3RpdmUgKD1ib290YWJsZSkKKworCisgICArKysrIENSRUFUSU5HIEEgQk9PVEFCTEUgTElOVVggRkxPUFBZICsrKworCitJbiBvcmRlciB0byBjcmVhdGUgYSBib290YWJsZSBMaW51eCBmbG9wcHkgdXNpbmcgU1lTTElOVVgsIHByZXBhcmUgYQorbm9ybWFsIE1TLURPUyBmb3JtYXR0ZWQgZmxvcHB5LiAgQ29weSBvbmUgb3IgbW9yZSBMaW51eCBrZXJuZWwgZmlsZXMgdG8KK2l0LCB0aGVuIGV4ZWN1dGUgdGhlIERPUyBjb21tYW5kOgorCisgICAgICAgIHN5c2xpbnV4IFstc2ZybWFdWy1kIGRpcmVjdG9yeV0gYTogW2Jvb3RzZWNmaWxlXQorCisob3Igd2hpY2hldmVyIGRyaXZlIGxldHRlciBpcyBhcHByb3ByaWF0ZTsgdGhlIFtdIG1lYW5pbmcgb3B0aW9uYWwuKQorCitVc2UgInN5c2xpbnV4LmNvbSIgKGluIHRoZSBkb3Mgc3ViZGlyZWN0b3J5IG9mIHRoZSBkaXN0cmlidXRpb24pIGZvcgorcGxhaW4gRE9TIChNUy1ET1MsIERSLURPUywgUEMtRE9TLCBGcmVlRE9TLi4uKSBvciBXaW45eC9NRS4KKworVXNlICJzeXNsaW51eC5leGUiIChpbiB0aGUgd2luMzIgc3ViZGlyZWN0b3J5IG9mIHRoZSBkaXN0cmlidXRpb24pIGZvcgorV2luTlQvMjAwMC9YUC4KKworVW5kZXIgTGludXgsIGV4ZWN1dGUgdGhlIGNvbW1hbmQ6CisKKwlzeXNsaW51eCBbLXNmcl1bLWQgZGlyZWN0b3J5XVstbyBvZmZzZXRdIC9kZXYvZmQwCisKKyhvciwgYWdhaW4sIHdoaWNoZXZlciBkZXZpY2UgaXMgdGhlIGNvcnJlY3Qgb25lLikKKworVGhpcyB3aWxsIGFsdGVyIHRoZSBib290IHNlY3RvciBvbiB0aGUgZGlzayBhbmQgY29weSBhIGZpbGUgbmFtZWQKK0xETElOVVguU1lTIGludG8gaXRzIHJvb3QgZGlyZWN0b3J5IChvciBhIHN1YmRpcmVjdG9yeSwgaWYgdGhlIC1kCitvcHRpb24gaXMgc3BlY2lmaWVkLikKKworVGhlIC1zIG9wdGlvbiwgaWYgZ2l2ZW4sIHdpbGwgaW5zdGFsbCBhICJzYWZlLCBzbG93IGFuZCBzdHVwaWQiCit2ZXJzaW9uIG9mIFNZU0xJTlVYLiAgVGhpcyB2ZXJzaW9uIG1heSB3b3JrIG9uIHNvbWUgdmVyeSBidWdneSBCSU9TZXMKK29uIHdoaWNoIFNZU0xJTlVYIHdvdWxkIG90aGVyd2lzZSBmYWlsLiAgSWYgeW91IGZpbmQgYSBtYWNoaW5lIG9uCit3aGljaCB0aGUgLXMgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIG1ha2UgaXQgYm9vdCByZWxpYWJseSwgcGxlYXNlIHNlbmQKK2FzIG11Y2ggaW5mbyBhYm91dCB5b3VyIG1hY2hpbmUgYXMgeW91IGNhbiwgYW5kIGluY2x1ZGUgdGhlIGZhaWx1cmUKK21vZGUuCisKK1RoZSAtbyBvcHRpb24gaXMgdXNlZCB3aXRoIGEgZGlzayBpbWFnZSBmaWxlIGFuZCBzcGVjaWZpZXMgdGhlIGJ5dGUKK29mZnNldCBvZiB0aGUgZmlsZXN5c3RlbSBpbWFnZSBpbiB0aGUgZmlsZS4KKworRm9yIHRoZSBET1MgYW5kIFdpbmRvd3MgaW5zdGFsbGVycywgdGhlIC1tIGFuZCAtYSBvcHRpb25zIGNhbiBiZSB1c2VkCitvbiBoYXJkIGRyaXZlcyB0byB3cml0ZSBhIE1hc3RlciBCb290IFJlY29yZCAoTUJSKSwgYW5kIHRvIG1hcmsgdGhlCitzcGVjaWZpYyBwYXJ0aXRpb24gYWN0aXZlLgorCitJZiB0aGUgU2hpZnQgb3IgQWx0IGtleXMgYXJlIGhlbGQgZG93biBkdXJpbmcgYm9vdCwgb3IgdGhlIENhcHMgb3IgU2Nyb2xsCitsb2NrcyBhcmUgc2V0LCBTeXNsaW51eCB3aWxsIGRpc3BsYXkgYSBMSUxPLXN0eWxlICJib290OiIgcHJvbXB0LiAgVGhlCit1c2VyIGNhbiB0aGVuIHR5cGUgYSBrZXJuZWwgZmlsZSBuYW1lIGZvbGxvd2VkIGJ5IGFueSBrZXJuZWwgcGFyYW1ldGVycy4KK1RoZSBTeXNsaW51eCBsb2FkZXIgZG9lcyBub3QgbmVlZCB0byBrbm93IGFib3V0IHRoZSBrZXJuZWwgZmlsZSBpbgorYWR2YW5jZTsgYWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdGhhdCBpdCBpcyBhIGZpbGUgbG9jYXRlZCBpbiB0aGUgcm9vdAorZGlyZWN0b3J5IG9uIHRoZSBkaXNrLgorCitUaGVyZSBhcmUgdHdvIHZlcnNpb25zIG9mIHRoZSBMaW51eCBpbnN0YWxsZXI7IG9uZSBpbiB0aGUgIm10b29scyIKK2RpcmVjdG9yeSB3aGljaCByZXF1aXJlcyBubyBzcGVjaWFsIHByaXZpbGVnZSAob3RoZXIgdGhhbiB3cml0ZQorcGVybWlzc2lvbiB0byB0aGUgZGV2aWNlIHdoZXJlIHlvdSBhcmUgaW5zdGFsbGluZykgYnV0IHJlcXVpcmVzIHRoZQorbXRvb2xzIHByb2dyYW0gc3VpdGUgdG8gYmUgYXZhaWxhYmxlLCBhbmQgb25lIGluIHRoZSAibGludXgiIGRpcmVjdG9yeQord2hpY2ggcmVxdWlyZXMgcm9vdCBwcml2aWxlZ2UuCisKKworICAgKysrKyBDT05GSUdVUkFUSU9OIEZJTEUgKysrKworCitBbGwgb3B0aW9ucyBoZXJlIGFwcGx5IHRvIFBYRUxJTlVYLCBJU09MSU5VWCBhbmQgRVhUTElOVVggYXMgd2VsbCBhcworU1lTTElOVVggdW5sZXNzIG90aGVyd2lzZSBub3RlZC4gIFNlZSB0aGUgcmVzcGVjdGl2ZSAudHh0IGZpbGVzLgorCitBbGwgdGhlIGNvbmZpZ3VyYWJsZSBkZWZhdWx0cyBpbiBTWVNMSU5VWCBjYW4gYmUgY2hhbmdlZCBieSBwdXR0aW5nIGEKK2ZpbGUgY2FsbGVkICJzeXNsaW51eC5jZmciIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgYm9vdCBkaXNrLgorCitTdGFydGluZyB3aXRoIHZlcnNpb24gMy4zNSwgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW4gYWxzbyBiZSBpbgorZWl0aGVyIHRoZSAvYm9vdC9zeXNsaW51eCBvciAvc3lzbGludXggZGlyZWN0b3JpZXMgKHNlYXJjaGVkIGluIHRoYXQKK29yZGVyLikgIElmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZW4gYWxsIGZpbGVuYW1lcyBhcmUgYXNzdW1lZCB0byBiZQorcmVsYXRpdmUgdG8gdGhhdCBzYW1lIGRpcmVjdG9yeSwgdW5sZXNzIHByZWNlZGVkIHdpdGggYSBzbGFzaCBvcgorYmFja3NsYXNoLgorCitUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGEgdGV4dCBmaWxlIGluIGVpdGhlciBVTklYIG9yIERPUyBmb3JtYXQsCitjb250YWluaW5nIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXRlbXMsIGVhY2ggb24gaXRzIG93biBsaW5lIHdpdGgKK29wdGlvbmFsIGxlYWRpbmcgd2hpdGVzcGFjZS4gIENhc2UgaXMgaW5zZW5zaXRpdmUgZm9yIGtleXdvcmRzOyB1cHBlcgorY2FzZSBpcyB1c2VkIGhlcmUgdG8gaW5kaWNhdGUgdGhhdCBhIHdvcmQgc2hvdWxkIGJlIHR5cGVkIHZlcmJhdGltLgorCisjY29tbWVudAorCUEgY29tbWVudCBsaW5lLgorCitJTkNMVURFIGZpbGVuYW1lCisJSW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYW5vdGhlciBmaWxlIGF0IHRoaXMgcG9pbnQgaW4gdGhlCisJY29uZmlndXJhdGlvbiBmaWxlLiBGaWxlcyBjYW4gY3VycmVudGx5IGJlIG5lc3RlZCB1cCB0byAxNgorCWxldmVscyBkZWVwLCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCBtb3JlIHRoYW4gOCBsZXZlbHMKKwl3aWxsIGJlIHN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlLgorCitERUZBVUxUIGtlcm5lbCBvcHRpb25zLi4uCisgICAgICAgIFNldHMgdGhlIGRlZmF1bHQgY29tbWFuZCBsaW5lLiAgSWYgU3lzbGludXggYm9vdHMgYXV0b21hdGljYWxseSwKKyAgICAgICAgaXQgd2lsbCBhY3QganVzdCBhcyBpZiB0aGUgZW50cmllcyBhZnRlciBERUZBVUxUIGhhZCBiZWVuIHR5cGVkCisgICAgICAgIGluIGF0IHRoZSAiYm9vdDoiIHByb21wdC4KKworCUlmIG5vIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBwcmVzZW50LCBvciBubyBERUZBVUxUIGVudHJ5IGlzCisgICAgICAgIHByZXNlbnQgaW4gdGhlIGNvbmZpZyBmaWxlLCBhbiBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZCBhbmQKKwl0aGUgYm9vdDogcHJvbXB0IGlzIHNob3duLgorCitVSSBtb2R1bGUgb3B0aW9ucy4uLgorCVNlbGVjdHMgYSBzcGVjaWZpYyB1c2VyIGludGVyZmFjZSBtb2R1bGUgKHR5cGljYWxseSBtZW51LmMzMgorCW9yIHZlc2FtZW51LmMzMikuICBUaGUgY29tbWFuZC1saW5lIGludGVyZmFjZSB0cmVhdHMgdGhpcyBhcyBhCisJZGlyZWN0aXZlIHRoYXQgb3ZlcnJpZGVzIHRoZSBERUZBVUxUIGFuZCBQUk9NUFQgZGlyZWN0aXZlcy4KKworQVBQRU5EIG9wdGlvbnMuLi4KKyAgICAgICAgQWRkIG9uZSBvciBtb3JlIG9wdGlvbnMgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuICBUaGVzZSBhcmUKKyAgICAgICAgYWRkZWQgYm90aCBmb3IgYXV0b21hdGljIGFuZCBtYW51YWwgYm9vdHMuICBUaGUgb3B0aW9ucyBhcmUKKyAgICAgICAgYWRkZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLAorICAgICAgICB1c3VhbGx5IHBlcm1pdHRpbmcgZXhwbGljaXRseSBlbnRlcmVkIGtlcm5lbCBvcHRpb25zIHRvIG92ZXJyaWRlCisgICAgICAgIHRoZW0uICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBMSUxPICJhcHBlbmQiIG9wdGlvbi4KKworU1lTQVBQRU5EIGJpdG1hc2sKK0lQQVBQRU5EIGJpdG1hc2sKKworCVRoZSBTWVNBUFBFTkQgb3B0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIFN5c2xpbnV4IDUuMTA7IGl0IGlzIGFuCisJZW5oYW5jZW1lbnQgb2YgYSBwcmV2aW91cyBvcHRpb24gSVBBUFBFTkQgd2hpY2ggd2FzIG9ubHkKKwlhdmFpbGFibGUgb24gUFhFTElOVVguICBiaXRtYXNrIGlzIGludGVycHJldGVkIGFzIGRlY2ltYWwgZm9ybWF0CisJdW5sZXNzIHByZWZpeGVkIHdpdGggIjB4IiBmb3IgaGV4YWRlY2ltYWwgb3IgIjAiICh6ZXJvKSBmb3IKKwlvY3RhbC4KKworCTE6IGluZGljYXRlcyB0aGF0IGFuIG9wdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdAorCXNob3VsZCBiZSBnZW5lcmF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lOgorCisJCWlwPTxjbGllbnQtaXA+Ojxib290LXNlcnZlci1pcD46PGd3LWlwPjo8bmV0bWFzaz4KKworCS4uLiBiYXNlZCBvbiB0aGUgaW5wdXQgZnJvbSB0aGUgREhDUC9CT09UUCBvciBQWEUgYm9vdCBzZXJ2ZXIuCisKKwlOT1RFOiBUaGUgdXNlIG9mIHRoaXMgb3B0aW9uIGlzIG5vIHN1YnN0aXR1dGUgZm9yIHJ1bm5pbmcgYQorCURIQ1AgY2xpZW50IGluIHRoZSBib290ZWQgc3lzdGVtLiAgV2l0aG91dCByZWd1bGFyIHJlbmV3YWxzLAorCXRoZSBsZWFzZSBhY3F1aXJlZCBieSB0aGUgUFhFIEJJT1Mgd2lsbCBleHBpcmUsIG1ha2luZyB0aGUKKwlJUCBhZGRyZXNzIGF2YWlsYWJsZSBmb3IgcmV1c2UgYnkgdGhlIERIQ1Agc2VydmVyLgorCisJVGhpcyBvcHRpb24gaXMgZW1wdHkgZm9yIG5vbi1QWEVMSU5VWC4KKworCTI6IGluZGljYXRlcyB0aGF0IGFuIG9wdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdAorCXNob3VsZCBiZSBnZW5lcmF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lOgorCisJCUJPT1RJRj08aGFyZHdhcmUtYWRkcmVzcy1vZi1ib290LWludGVyZmFjZT4KKworCS4uLiBpbiBkYXNoLXNlcGFyYXRlZCBoZXhhZGVjaW1hbCB3aXRoIGxlYWRpbmcgaGFyZHdhcmUgdHlwZQorCShzYW1lIGFzIGZvciB0aGUgY29uZmlndXJhdGlvbiBmaWxlOyBzZWUgcHhlbGludXgudHh0LikKKworCVRoaXMgYWxsb3dzIGFuIGluaXRyZCBwcm9ncmFtIHRvIGRldGVybWluZSBmcm9tIHdoaWNoCisJaW50ZXJmYWNlIHRoZSBzeXN0ZW0gYm9vdGVkLgorCisJVGhpcyBvcHRpb24gaXMgZW1wdHkgZm9yIG5vbi1QWEVMSU5VWC4KKworCTQ6IGluZGljYXRlcyB0aGF0IGFuIG9wdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdAorCXNob3VsZCBiZSBnZW5lcmF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lOgorCisJCVNZU1VVSUQ9PHN5c3RlbSB1dWlkPgorCisJLi4uIGluIGxvd2VyIGNhc2UgaGV4YWRlY2ltYWwgaW4gdGhlIGZvcm1hdCBub3JtYWxseSB1c2VkIGZvcgorCVVVSURzIChzYW1lIGFzIGZvciB0aGUgY29uZmlndXJhdGlvbiBmaWxlOyBzZWUgcHhlbGludXgudHh0LikKKwlUaGlzIG1heSBub3QgYmUgYXZhaWxhYmxlIGlmIG5vIHZhbGlkIFVVSUQgaXMgZm91bmQgb24gdGhlCisJc3lzdGVtLgorCisJODogaW5kaWNhdGUgdGhlIENQVSBmYW1pbHkgYW5kIGNlcnRhaW4gcGFydGljdWxhcmx5CisJc2lnbmlmaWNhbnQgQ1BVIGZlYXR1cmUgYml0czoKKworCQlDUFU9PGZhbWlseT48ZmVhdHVyZXM+CisKKwlUaGUgPGZhbWlseT4gaXMgYSBzaW5nbGUgZGlnaXQgZnJvbSAzIChpMzg2KSB0byA2IChpNjg2IG9yCisJaGlnaGVyLikgIFRoZSBmb2xsb3dpbmcgQ1BVIGZlYXR1cmUgYXJlIGN1cnJlbnRseSByZXBvcnRlZDsKKwlhZGRpdGlvbmFsIGZsYWdzIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlOgorCisJCVAJUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24gKFBBRSkKKwkJVglJbnRlbCBWaXJ0dWFsaXphdGlvbiBUZWNobm9sb2d5IChWVC9WTVgpCisJCVQJSW50ZWwgVHJ1c3RlZCBFeGVjdGlvbiBUZWNobm9sb2d5IChUWFQvU01YKQorCQlYCUV4ZWN1dGlvbiBEaXNhYmxlIChYRC9OWCkKKwkJTAlMb25nIE1vZGUgKHg4Ni02NCkKKwkJUwlBTUQgU01YIHZpcnR1YWxpemF0aW9uCisJCisJVGhpcyB3YXMgYWRkZWQgaW4gNS4xMC4KKworCVRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgZGVyaXZlZCBmcm9tIERNSS9TTUJJT1MgaW5mb3JtYXRpb24KKwlpZiBhdmFpbGFibGU7IHRoZXNlIGFyZSBhbGwgbmV3IGluIHZlcnNpb24gNS4xMDoKKwkKKwlCaXQJU3RyaW5nCQlTaWduaWZpY2FuY2UKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJMHgwMDAxMAlTWVNWRU5ET1I9CVN5c3RlbSB2ZW5kb3IgbmFtZQorCTB4MDAwMjAJU1lTUFJPRFVDVD0JU3lzdGVtIHByb2R1Y3QgbmFtZQorCTB4MDAwNDAJU1lTVkVSU0lPTj0JU3lzdGVtIHZlcnNpb24KKwkweDAwMDgwCVNZU1NFUklBTD0JU3lzdGVtIHNlcmlhbCBudW1iZXIKKwkweDAwMTAwCVNZU1NLVT0JCVN5c3RlbSBTS1UKKwkweDAwMjAwCVNZU0ZBTUlMWT0JU3lzdGVtIGZhbWlseQorCTB4MDA0MDAJTUJWRU5ET1I9CU1vdGhlcmJvYXJkIHZlbmRvciBuYW1lCisJMHgwMDgwMAlNQlZFUlNJT049CU1vdGhlcmJvYXJkIHZlcnNpb24KKwkweDAxMDAwCU1CU0VSSUFMPQlNb3RoZXJib2FyZCBzZXJpYWwgbnVtYmVyCisJMHgwMjAwMAlNQkFTU0VUPQlNb3RoZXJib2FyZCBhc3NldCB0YWcKKwkweDA0MDAwIEJJT1NWRU5ET1I9CUJJT1MgdmVuZG9yIG5hbWUKKwkweDA4MDAwCUJJT1NWRVJTSU9OPQlCSU9TIHZlcnNpb24KKwkweDEwMDAwCVNZU0ZGPQkJU3lzdGVtIGZvcm0gZmFjdG9yCisKKwlJZiB0aGVzZSBzdHJpbmdzIGNvbnRhaW4gd2hpdGVzcGFjZSB0aGV5IGFyZSByZXBsYWNlZCB3aXRoCisJdW5kZXJzY29yZXMgKF8pLgorCisJVGhlIHN5c3RlbSBmb3JtIGZhY3RvciB2YWx1ZSBpcyBhIG51bWJlciBkZWZpbmVkIGluIHRoZSBTTUJJT1MKKwlzcGVjaWZpY2F0aW9uLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5kbXRmLm9yZy8uICBBcyBvZgorCXZlcnNpb24gMi43LjEgb2YgdGhlIHNwZWNpZmljYXRpb24sIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZQorCWRlZmluZWQ6CisKKwkgIDEJT3RoZXIKKwkgIDIJVW5rbm93bgorCSAgMwlEZXNrdG9wCisJICA0CUxvdyBwcm9maWxlIGRlc2t0b3AKKwkgIDUJUGl6emEgYm94CisJICA2CU1pbmkgdG93ZXIKKwkgIDcJVG93ZXIKKwkgIDgJUG9ydGJsZQorCSAgOQlMYXB0b3AKKwkgMTAJTm90ZWJvb2sKKwkgMTEJSGFuZGhlbGQKKwkgMTIJRG9ja2luZyBzdGF0aW9uCisJIDEzCUFsbC1pbi1vbmUKKwkgMTQJU3Vibm90ZWJvb2sKKwkgMTUJU3BhY2Utc2F2aW5nCisJIDE2CUx1bmNoIGJveAorCSAxNwlNYWluIHNlcnZlciBjaGFzc2lzCisJIDE4CUV4cGFuc2lvbiBjaGFzc2lzCisJIDE5CVN1YmNoYXNzaXMKKwkgMjAJQnVzIGV4cGFuc2lvbiBjaGFzc2lzCisJIDIxCVBlcmlwaGVyYWwgY2hhc3NpcworCSAyMglSQUlEIGNoYXNzaXMKKwkgMjMJUmFjayBtb3VudCBjaGFzc3MKKwkgMjQJU2VhbGVkLWNhc2UgUEMKKwkgMjUJTXVsdGktc3lzdGVtIGNoYXNzaXMKKwkgMjYJQ29tcGFjdCBQQ0kKKwkgMjcJQWR2YW5jZWQgVENJCisJIDI4CUJsYWRlCisJIDI5CUJsYWRlIGVuY2xvc3VyZQorCitTRU5EQ09PS0lFUyBiaXRtYXNrCQkJW1BYRUxJTlVYIG9ubHldCisKKwlXaGVuIGRvd25sb2FkaW5nIGZpbGVzIG92ZXIgaHR0cCwgdGhlIFNZU0FQUEVORCBzdHJpbmdzIGFyZQorCXByZXBlbmRlZCB3aXRoIF9TeXNsaW51eF8gYW5kIHNlbnQgdG8gdGhlIHNlcnZlciBhcyBjb29raWVzLgorCVRoZSBjb29raWVzIGFyZSBVUkwtZW5jb2RlZDsgd2hpdGVzcGFjZSBpcyAqbm90KiByZXBsYWNlZCB3aXRoCisJdW5kZXJzY29yZXMuCisKKwlUaGlzIGNvbW1hbmQgbGltaXRzIHRoZSBjb29raWVzIHNlbmQ7IDAgbWVhbnMgbm8gY29va2llcy4gIFRoZQorCWRlZmF1bHQgaXMgLTEsIG1lYW5pbmcgc2VuZCBhbGwgY29va2llcy4KKworCVRoaXMgb3B0aW9uIGlzICJzdGlja3kiIGFuZCBpcyBub3QgYXV0b21hdGljYWxseSByZXNldCB3aGVuCisJbG9hZGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgQ09ORklHIGNvbW1hbmQuCisKK0xBQkVMIGxhYmVsCisgICAgS0VSTkVMIGltYWdlCisgICAgQVBQRU5EIG9wdGlvbnMuLi4KKyAgICBTWVNBUFBFTkQgZmxhZ192YWwJCQlbNS4xMCtdCisgICAgSVBBUFBFTkQgZmxhZ192YWwJCQlbNS4xMCsgb3IgUFhFTElOVVggb25seV0KKwlJbmRpY2F0ZXMgdGhhdCBpZiAibGFiZWwiIGlzIGVudGVyZWQgYXMgdGhlIGtlcm5lbCB0byBib290LAorICAgICAgICBTeXNsaW51eCBzaG91bGQgaW5zdGVhZCBib290ICJpbWFnZSIsIGFuZCB0aGUgc3BlY2lmaWVkIEFQUEVORAorCWFuZCBTWVNBUFBFTkQgb3B0aW9ucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgZ2xvYmFsIHNlY3Rpb24gb2YgdGhlIGZpbGUgKGJlZm9yZSB0aGUgZmlyc3QKKyAgICAgICAgTEFCRUwgY29tbWFuZC4pICBUaGUgZGVmYXVsdCBmb3IgImltYWdlIiBpcyB0aGUgc2FtZSBhcworICAgICAgICAibGFiZWwiLCBhbmQgaWYgbm8gQVBQRU5EIGlzIGdpdmVuIHRoZSBkZWZhdWx0IGlzIHRvIHVzZSB0aGUKKyAgICAgICAgZ2xvYmFsIGVudHJ5IChpZiBhbnkpLgorCisJU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDMuNjIsIHRoZSBudW1iZXIgb2YgTEFCRUwgc3RhdGVtZW50cyBpcworCXZpcnR1YWxseSB1bmxpbWl0ZWQuCisKKyAgICAgICAgTm90ZSB0aGF0IExJTE8gdXNlcyB0aGUgc3ludGF4OgorICAgICAgICBpbWFnZSA9IG15a2VybmVsCisgICAgICAgICAgbGFiZWwgPSBteWxhYmVsCisgICAgICAgICAgYXBwZW5kID0gIm15b3B0aW9ucyIKKworICAgICAgICAuLi4gd2hlcmVhcyBTeXNsaW51eCB1c2VzIHRoZSBzeW50YXg6CisgICAgICAgIGxhYmVsIG15bGFiZWwKKyAgICAgICAgICBrZXJuZWwgbXlrZXJuZWwKKyAgICAgICAgICBhcHBlbmQgbXlvcHRpb25zCisKKwlOb3RlOiBUaGUgImtlcm5lbCIgZG9lc24ndCBoYXZlIHRvIGJlIGEgTGludXgga2VybmVsOyBpdCBjYW4KKwkgICAgICBiZSBhIGJvb3Qgc2VjdG9yIChzZWUgYmVsb3cuKQorCisJU2luY2UgdmVyc2lvbiAzLjMyIGxhYmVsIG5hbWVzIGFyZSBubyBsb25nZXIgbWFuZ2xlZCBpbnRvIERPUworCWZvcm1hdCAoZm9yIFNZU0xJTlVYLikKKworICAgIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBhZnRlciBhIExBQkVMIHN0YXRlbWVudDoKKworICAgIExJTlVYIGltYWdlCQkJLSBMaW51eCBrZXJuZWwgaW1hZ2UgKGRlZmF1bHQpCisgICAgQk9PVCBpbWFnZQkJCS0gQm9vdHN0cmFwIHByb2dyYW0gKC5icywgLmJpbikKKyAgICBCU1MgaW1hZ2UJCQktIEJTUyBpbWFnZSAoLmJzcykKKyAgICBQWEUgaW1hZ2UJCQktIFBYRSBOZXR3b3JrIEJvb3RzdHJhcCBQcm9ncmFtICguMCkKKyAgICBGRElNQUdFIGltYWdlCQktIEZsb3BweSBkaXNrIGltYWdlICguaW1nKQorICAgIENPTTMyIGltYWdlCQkJLSBDT00zMiBwcm9ncmFtICguYzMyKQorICAgIENPTkZJRyBpbWFnZQkJLSBOZXcgY29uZmlndXJhdGlvbiBmaWxlCisJVXNpbmcgb25lIG9mIHRoZXNlIGtleXdvcmRzIGluc3RlYWQgb2YgS0VSTkVMIGZvcmNlcyB0aGUKKwlmaWxldHlwZSwgcmVnYXJkbGVzcyBvZiB0aGUgZmlsZW5hbWUuCisKKwlDT05GSUcgbWVhbnMgcmVzdGFydCB0aGUgYm9vdCBsb2FkZXIgdXNpbmcgYSBkaWZmZXJlbnQKKwljb25maWd1cmF0aW9uIGZpbGUuICBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIHJlYWQsIHRoZQorCXdvcmtpbmcgZGlyZWN0b3J5IGlzIGNoYW5nZWQgKGlmIHNwZWNpZmllZCB2aWEgYW4gQVBQRU5EKSwgdGhlbgorCXRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgcGFyc2VkLgorCisgICAgQVBQRU5EIC0KKyAgICAgICAgQXBwZW5kIG5vdGhpbmcuICBBUFBFTkQgd2l0aCBhIHNpbmdsZSBoeXBoZW4gYXMgYXJndW1lbnQgaW4gYQorICAgICAgICBMQUJFTCBzZWN0aW9uIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIGEgZ2xvYmFsIEFQUEVORC4KKworICAgIExPQ0FMQk9PVCB0eXBlCisJQXR0ZW1wdCBhIGRpZmZlcmVudCBsb2NhbCBib290IG1ldGhvZC4gIFRoZSBzcGVjaWFsIHZhbHVlIC0xCisJY2F1c2VzIHRoZSBib290IGxvYWRlciB0byByZXBvcnQgZmFpbHVyZSB0byB0aGUgQklPUywgd2hpY2gsIG9uCisJcmVjZW50IEJJT1Nlcywgc2hvdWxkIG1lYW4gdGhhdCB0aGUgbmV4dCBib290IGRldmljZSBpbiB0aGUKKwlib290IHNlcXVlbmNlIHNob3VsZCBiZSBhY3RpdmF0ZWQuICBWYWx1ZXMgb3RoZXIgdGhhbiB0aG9zZQorCWRvY3VtZW50ZWQgbWF5IHByb2R1Y2UgdW5kZXNpcmVkIHJlc3VsdHMuCisKKwlPbiBQWEVMSU5VWCwgInR5cGUiIDAgbWVhbnMgcGVyZm9ybSBhIG5vcm1hbCBib290LiAgInR5cGUiIDQKKwl3aWxsIHBlcmZvcm0gYSBsb2NhbCBib290IHdpdGggdGhlIFVuaXZlcnNhbCBOZXR3b3JrIERyaXZlcgorCUludGVyZmFjZSAoVU5ESSkgZHJpdmVyIHN0aWxsIHJlc2lkZW50IGluIG1lbW9yeS4gIEZpbmFsbHksCisJInR5cGUiIDUgd2lsbCBwZXJmb3JtIGEgbG9jYWwgYm9vdCB3aXRoIHRoZSBlbnRpcmUgUFhFCisJc3RhY2ssIGluY2x1ZGluZyB0aGUgVU5ESSBkcml2ZXIsIHN0aWxsIHJlc2lkZW50IGluIG1lbW9yeS4KKwlBbGwgb3RoZXIgdmFsdWVzIGFyZSB1bmRlZmluZWQuICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoZQorCVVOREkgb3IgUFhFIHN0YWNrcyBhcmUsIGRvbid0IHdvcnJ5IC0tIHlvdSBkb24ndCB3YW50IHRoZW0sCisJanVzdCBzcGVjaWZ5IDAuCisKKwlPbiBJU09MSU5VWCwgdGhlICJ0eXBlIiBzcGVjaWZpZXMgdGhlIGxvY2FsIGRyaXZlIG51bWJlciB0bworCWJvb3QgZnJvbTsgMHgwMCBpcyB0aGUgcHJpbWFyeSBmbG9wcHkgZHJpdmUgYW5kIDB4ODAgaXMgdGhlCisJcHJpbWFyeSBoYXJkIGRyaXZlLgorCisgICAgSU5JVFJEIGluaXRyZF9maWxlCisJU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDMuNzEsIGFuIGluaXRyZCBjYW4gYmUgc3BlY2lmaWVkIGluIGEKKwlzZXBhcmF0ZSBzdGF0ZW1lbnQgKElOSVRSRCkgaW5zdGVhZCBvZiBhcyBwYXJ0IG9mIHRoZSBBUFBFTkQKKwlzdGF0ZW1lbnQ7IHRoaXMgZnVuY3Rpb25hbGx5IGFwcGVuZHMgImluaXRyZD1pbml0cmRfZmlsZSIgdG8KKwl0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKworCUl0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGVuYW1lcyBzZXBhcmF0ZWQgYnkgY29tbWFzLgorCVRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgaW5pdHJhbWZzLCB3aGljaCBjYW4gYmUgY29tcG9zZWQgb2YKKwltdWx0aXBsZSBzZXBhcmF0ZSBjcGlvIG9yIGNwaW8uZ3ogYXJjaGl2ZXMuCisJTm90ZTogYWxsIGZpbGVzIGV4Y2VwdCB0aGUgbGFzdCBvbmUgYXJlIHplcm8tcGFkZGVkIHRvIGEKKwk0SyBwYWdlIGJvdW5kYXJ5LiAgVGhpcyBzaG91bGQgbm90IGFmZmVjdCBpbml0cmFtZnMuCisKK0lNUExJQ0lUIGZsYWdfdmFsCisgICAgICAgIElmIGZsYWdfdmFsIGlzIDAsIGRvIG5vdCBsb2FkIGEga2VybmVsIGltYWdlIHVubGVzcyBpdCBoYXMgYmVlbgorICAgICAgICBleHBsaWNpdGx5IG5hbWVkIGluIGEgTEFCRUwgc3RhdGVtZW50LiAgVGhlIGRlZmF1bHQgaXMgMS4KKworQUxMT1dPUFRJT05TIGZsYWdfdmFsCisJSWYgZmxhZ192YWwgaXMgMCwgdGhlIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSBhbnkKKwlhcmd1bWVudHMgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuICBUaGUgb25seSBvcHRpb25zCisJcmVjb2duaXplZCBhcmUgdGhvc2Ugc3BlY2lmaWVkIGluIGFuIEFQUEVORCBzdGF0ZW1lbnQuICBUaGUKKwlkZWZhdWx0IGlzIDEuCisKK1RJTUVPVVQgdGltZW91dAorICAgICAgICBJbmRpY2F0ZXMgaG93IGxvbmcgdG8gd2FpdCBhdCB0aGUgYm9vdDogcHJvbXB0IHVudGlsIGJvb3RpbmcKKyAgICAgICAgYXV0b21hdGljYWxseSwgaW4gdW5pdHMgb2YgMS8xMCBzLiAgVGhlIHRpbWVvdXQgaXMgY2FuY2VsbGVkIGFzCisgICAgICAgIHNvb24gYXMgdGhlIHVzZXIgdHlwZXMgYW55dGhpbmcgb24gdGhlIGtleWJvYXJkLCB0aGUgYXNzdW1wdGlvbgorICAgICAgICBiZWluZyB0aGF0IHRoZSB1c2VyIHdpbGwgY29tcGxldGUgdGhlIGNvbW1hbmQgbGluZSBhbHJlYWR5CisgICAgICAgIGJlZ3VuLiAgQSB0aW1lb3V0IG9mIHplcm8gd2lsbCBkaXNhYmxlIHRoZSB0aW1lb3V0IGNvbXBsZXRlbHksCisgICAgICAgIHRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdC4KKworVE9UQUxUSU1FT1VUIHRpbWVvdXQKKyAgICAgICAgSW5kaWNhdGVzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgYm9vdGluZyBhdXRvbWF0aWNhbGx5LCBpbgorCXVuaXRzIG9mIDEvMTAgcy4gIFRoaXMgdGltZW91dCBpcyAqbm90KiBjYW5jZWxsZWQgYnkgdXNlcgorCWlucHV0LCBhbmQgY2FuIHRodXMgYmUgdXNlZCB0byBkZWFsIHdpdGggc2VyaWFsIHBvcnQgZ2xpdGNoZXMKKwlvciAidGhlIHVzZXIgd2Fsa2VkIGF3YXkiIHR5cGUgc2l0dWF0aW9ucy4gIEEgdGltZW91dCBvZiB6ZXJvCisJd2lsbCBkaXNhYmxlIHRoZSB0aW1lb3V0IGNvbXBsZXRlbHksIHRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdC4KKworCUJvdGggVElNRU9VVCBhbmQgVE9UQUxUSU1FT1VUIGNhbiBiZSB1c2VkIHRvZ2V0aGVyLCBmb3IKKwlleGFtcGxlOgorCisJCSMgV2FpdCA1IHNlY29uZHMgdW5sZXNzIHRoZSB1c2VyIHR5cGVzIHNvbWV0aGluZywgYnV0CisJCSMgYWx3YXlzIGJvb3QgYWZ0ZXIgMTUgbWludXRlcy4KKwkJVElNRU9VVCA1MAorCQlUT1RBTFRJTUVPVVQgOTAwMAorCitPTlRJTUVPVVQga2VybmVsIG9wdGlvbnMuLi4KKwlTZXRzIHRoZSBjb21tYW5kIGxpbmUgaW52b2tlZCBvbiBhIHRpbWVvdXQuICBOb3JtYWxseSB0aGlzIGlzCisJdGhlIHNhbWUgdGhpbmcgYXMgaW52b2tlZCBieSAiREVGQVVMVCIuICBJZiB0aGlzIGlzIHNwZWNpZmllZCwKKwl0aGVuICJERUZBVUxUIiBpcyB1c2VkIG9ubHkgaWYgdGhlIHVzZXIgcHJlc3NlcyA8RW50ZXI+IHRvCisJYm9vdC4KKworT05FUlJPUiBrZXJuZWwgb3B0aW9ucy4uLgorCUlmIGEga2VybmVsIGltYWdlIGlzIG5vdCBmb3VuZCAoZWl0aGVyIGR1ZSB0byBpdCBub3QgZXhpc3RpbmcsCisJb3IgYmVjYXVzZSBJTVBMSUNJVCBpcyBzZXQpLCBydW4gdGhlIHNwZWNpZmllZCBjb21tYW5kLiAgVGhlCisJZmF1bHR5IGNvbW1hbmQgbGluZSBpcyBhcHBlbmRlZCB0byB0aGUgc3BlY2lmaWVkIG9wdGlvbnMsIHNvCisJaWYgdGhlIE9ORVJST1IgZGlyZWN0aXZlIHJlYWRzIGFzOgorCisJCU9ORVJST1IgeHl6enkgcGx1Z2gKKworCS4uLiBhbmQgdGhlIGNvbW1hbmQgbGluZSBhcyBlbnRlcmVkIGJ5IHRoZSB1c2VyIGlzOgorCisJCWZvbyBiYXIgYmF6CisKKwkuLi4gU3lzbGludXggd2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgYXMgaWYgZW50ZXJlZCBieSB0aGUKKwl1c2VyOgorCisJCXh5enp5IHBsdWdoIGZvbyBiYXIgYmF6CisKK1NFUklBTCBwb3J0IFtiYXVkcmF0ZSBbZmxvd2NvbnRyb2xdXQorCUVuYWJsZXMgYSBzZXJpYWwgcG9ydCB0byBhY3QgYXMgdGhlIGNvbnNvbGUuICAicG9ydCIgaXMgYQorCW51bWJlciAoMCA9IC9kZXYvdHR5UzAgPSBDT00xLCBldGMuKSBvciBhbiBJL08gcG9ydCBhZGRyZXNzCisJKGUuZy4gMHgzRjgpOyBpZiAiYmF1ZHJhdGUiIGlzIG9taXR0ZWQsIHRoZSBiYXVkIHJhdGUgZGVmYXVsdHMKKwl0byA5NjAwIGJwcy4gIFRoZSBzZXJpYWwgcGFyYW1ldGVycyBhcmUgaGFyZGNvZGVkIHRvIGJlIDgKKwliaXRzLCBubyBwYXJpdHksIDEgc3RvcCBiaXQuCisKKwkiZmxvd2NvbnRyb2wiIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBiaXRzOgorCTB4MDAxIC0gQXNzZXJ0IERUUgorCTB4MDAyIC0gQXNzZXJ0IFJUUworCTB4MDA4IC0gRW5hYmxlIGludGVycnVwdHMKKwkweDAxMCAtIFdhaXQgZm9yIENUUyBhc3NlcnRpb24KKwkweDAyMCAtIFdhaXQgZm9yIERTUiBhc3NlcnRpb24KKwkweDA0MCAtIFdhaXQgZm9yIFJJIGFzc2VydGlvbgorCTB4MDgwIC0gV2FpdCBmb3IgRENEIGFzc2VydGlvbgorCTB4MTAwIC0gSWdub3JlIGlucHV0IHVubGVzcyBDVFMgYXNzZXJ0ZWQKKwkweDIwMCAtIElnbm9yZSBpbnB1dCB1bmxlc3MgRFNSIGFzc2VydGVkCisJMHg0MDAgLSBJZ25vcmUgaW5wdXQgdW5sZXNzIFJJIGFzc2VydGVkCisJMHg4MDAgLSBJZ25vcmUgaW5wdXQgdW5sZXNzIERDRCBhc3NlcnRlZAorCisJQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkLgorCisJVHlwaWNhbCB2YWx1ZXMgYXJlOgorCisJICAgIDAgLSBObyBmbG93IGNvbnRyb2wgKGRlZmF1bHQpCisJMHgzMDMgLSBOdWxsIG1vZGVtIGNhYmxlIGRldGVjdAorCTB4MDEzIC0gUlRTL0NUUyBmbG93IGNvbnRyb2wKKwkweDgxMyAtIFJUUy9DVFMgZmxvdyBjb250cm9sLCBtb2RlbSBpbnB1dAorCTB4MDIzIC0gRFRSL0RTUiBmbG93IGNvbnRyb2wKKwkweDA4MyAtIERUUi9EQ0QgZmxvdyBjb250cm9sCisKKwlGb3IgdGhlIFNFUklBTCBkaXJlY3RpdmUgdG8gYmUgZ3VhcmFudGVlZCB0byB3b3JrIHByb3Blcmx5LCBpdAorCXNob3VsZCBiZSB0aGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisKKwlOT1RFOiAicG9ydCIgdmFsdWVzIGZyb20gMCB0byAzIG1lYW5zIHRoZSBmaXJzdCBmb3VyIHNlcmlhbAorCXBvcnRzIGRldGVjdGVkIGJ5IHRoZSBCSU9TLiAgVGhleSBtYXkgb3IgbWF5IG5vdCBjb3JyZXNwb25kIHRvCisJdGhlIGxlZ2FjeSBwb3J0IHZhbHVlcyAweDNGOCwgMHgyRjgsIDB4M0U4LCAweDJFOC4KKworCUVuYWJsaW5nIGludGVycnVwdHMgKHNldHRpbmcgdGhlIDB4MDA4IGJpdCkgbWF5IGdpdmUgYmV0dGVyCisJcmVzcG9uc2l2ZW5lc3Mgd2l0aG91dCBzZXR0aW5nIHRoZSBOT0hBTFQgb3B0aW9uLCBidXQgY291bGQKKwlwb3RlbnRpYWxseSBjYXVzZSBwcm9ibGVtcyB3aXRoIGJ1Z2d5IEJJT1Nlcy4KKworCVRoaXMgb3B0aW9uIGlzICJzdGlja3kiIGFuZCBpcyBub3QgYXV0b21hdGljYWxseSByZXNldCB3aGVuCisJbG9hZGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgQ09ORklHIGNvbW1hbmQuCisKK05PSEFMVCBmbGFnX3ZhbAorCUlmIGZsYWdfdmFsIGlzIDEsIGRvbid0IGhhbHQgdGhlIHByb2Nlc3NvciB3aGlsZSBpZGxlLgorCUhhbHRpbmcgdGhlIHByb2Nlc3NvciB3aGlsZSBpZGxlIHNpZ25pZmljYW50bHkgcmVkdWNlcyB0aGUKKwlwb3dlciBjb25zdW1wdGlvbiwgYnV0IGNhbiBjYXVzZSBwb29yIHJlc3BvbnNpdmVuZXNzIHRvIHRoZQorCXNlcmlhbCBjb25zb2xlLCBlc3BlY2lhbGx5IHdoZW4gdXNpbmcgc2NyaXB0cyB0byBkcml2ZSB0aGUKKwlzZXJpYWwgY29uc29sZSwgYXMgb3Bwb3NlZCB0byBodW1hbiBpbnRlcmFjdGlvbi4KKworQ09OU09MRSBmbGFnX3ZhbAorCUlmIGZsYWdfdmFsIGlzIDAsIGRpc2FibGUgb3V0cHV0IHRvIHRoZSBub3JtYWwgdmlkZW8gY29uc29sZS4KKwlJZiBmbGFnX3ZhbCBpcyAxLCBlbmFibGUgb3V0cHV0IHRvIHRoZSB2aWRlbyBjb25zb2xlICh0aGlzIGlzCisJdGhlIGRlZmF1bHQuKQorCisJU29tZSBCSU9TZXMgdHJ5IHRvIGZvcndhcmQgdGhpcyB0byB0aGUgc2VyaWFsIGNvbnNvbGUgYW5kCisJc29tZXRpbWVzIG1ha2UgYSB0b3RhbCBtZXNzIHRoZXJlb2YsIHNvIHRoaXMgb3B0aW9uIGxldHMgeW91CisJZGlzYWJsZSB0aGUgdmlkZW8gY29uc29sZSBvbiB0aGVzZSBzeXN0ZW1zLgorCitGT05UIGZpbGVuYW1lCisJTG9hZCBhIGZvbnQgaW4gLnBzZiBmb3JtYXQgYmVmb3JlIGRpc3BsYXlpbmcgYW55IG91dHB1dAorCShleGNlcHQgdGhlIGNvcHlyaWdodCBsaW5lLCB3aGljaCBpcyBvdXRwdXQgYXMgbGRsaW51eC5zeXMKKwlpdHNlbGYgaXMgbG9hZGVkLikgIFN5c2xpbnV4IG9ubHkgbG9hZHMgdGhlIGZvbnQgb250byB0aGUKKwl2aWRlbyBjYXJkOyBpZiB0aGUgLnBzZiBmaWxlIGNvbnRhaW5zIGEgVW5pY29kZSB0YWJsZSBpdCBpcworCWlnbm9yZWQuICBUaGlzIG9ubHkgd29ya3Mgb24gRUdBIGFuZCBWR0EgY2FyZHM7IGhvcGVmdWxseSBpdAorCXNob3VsZCBkbyBub3RoaW5nIG9uIG90aGVycy4KKworS0JETUFQIGtleW1hcAorCUluc3RhbGwgYSBzaW1wbGUga2V5Ym9hcmQgbWFwLiAgVGhlIGtleWJvYXJkIHJlbWFwcGVyIHVzZWQgaXMKKwkqdmVyeSogc2ltcGxpc3RpYyAoaXQgc2ltcGx5IHJlbWFwcyB0aGUga2V5Y29kZXMgcmVjZWl2ZWQgZnJvbQorCXRoZSBCSU9TLCB3aGljaCBtZWFucyB0aGF0IG9ubHkgdGhlIGtleSBjb21iaW5hdGlvbnMgcmVsZXZhbnQKKwlpbiB0aGUgZGVmYXVsdCBsYXlvdXQgLS0gdXN1YWxseSBVLlMuIEVuZ2xpc2ggLS0gY2FuIGJlCisJbWFwcGVkKSBidXQgc2hvdWxkIGF0IGxlYXN0IGhlbHAgcGVvcGxlIHdpdGggQVpFUlRZIGtleWJvYXJkCisJbGF5b3V0IGFuZCB0aGUgbG9jYXRpb25zIG9mID0gYW5kICwgKHR3byBzcGVjaWFsIGNoYXJhY3RlcnMKKwl1c2VkIGhlYXZpbHkgb24gdGhlIExpbnV4IGtlcm5lbCBjb21tYW5kIGxpbmUuKQorCisJVGhlIGluY2x1ZGVkIHByb2dyYW0ga2V5dGFiLWxpbG8ucGwgZnJvbSB0aGUgTElMTyBkaXN0cmlidXRpb24KKwljYW4gYmUgdXNlZCB0byBjcmVhdGUgc3VjaCBrZXltYXBzLiAgVGhlIGZpbGUga2V5dGFiLWxpbG8udHh0CisJY29udGFpbnMgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgcHJvZ3JhbS4KKworRElTUExBWSBmaWxlbmFtZQorCURpc3BsYXlzIHRoZSBpbmRpY2F0ZWQgZmlsZSBvbiB0aGUgc2NyZWVuIGF0IGJvb3QgdGltZSAoYmVmb3JlCisgICAgICAgIHRoZSBib290OiBwcm9tcHQsIGlmIGRpc3BsYXllZCkuICBQbGVhc2Ugc2VlIHRoZSBzZWN0aW9uIGJlbG93CisgICAgICAgIG9uIERJU1BMQVkgZmlsZXMuCisKKyAgICAgICAgTk9URTogSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgdGhpcyBvcHRpb24gaXMgc2ltcGx5IGlnbm9yZWQuCisKK1NBWSBtZXNzYWdlCisJUHJpbnRzIHRoZSBtZXNzYWdlIG9uIHRoZSBzY3JlZW4uCisKK1BST01QVCBmbGFnX3ZhbAorICAgICAgICBJZiBmbGFnX3ZhbCBpcyAwLCBkaXNwbGF5IHRoZSBib290OiBwcm9tcHQgb25seSBpZiB0aGUgU2hpZnQgb3IgQWx0CisgICAgICAgIGtleSBpcyBwcmVzc2VkLCBvciBDYXBzIExvY2sgb3IgU2Nyb2xsIGxvY2sgaXMgc2V0ICh0aGlzIGlzIHRoZQorICAgICAgICBkZWZhdWx0KS4gIElmIGZsYWdfdmFsIGlzIDEsIGFsd2F5cyBkaXNwbGF5IHRoZSBib290OiBwcm9tcHQuCisKK05PRVNDQVBFIGZsYWdfdmFsCisJSWYgZmxhZ192YWwgaXMgc2V0IHRvIDEsIGlnbm9yZSB0aGUgU2hpZnQvQWx0L0NhcHMgTG9jay9TY3JvbGwKKwlMb2NrIGVzY2FwZXMuICBVc2UgdGhpcyAodG9nZXRoZXIgd2l0aCBQUk9NUFQgMCkgdG8gZm9yY2UgdGhlCisJZGVmYXVsdCBib290IGFsdGVybmF0aXZlLgorCitOT0NPTVBMRVRFIGZsYWdfdmFsCisJSWYgZmxhZ192YWwgaXMgc2V0IHRvIDEsIHRoZSBUYWIga2V5IGRvZXMgbm90IGRpc3BsYXkgbGFiZWxzCisJYXQgdGhlIGJvb3Q6IHByb21wdC4KKworRjEgZmlsZW5hbWUKK0YyIGZpbGVuYW1lCisgICAuLi5ldGMuLi4KK0Y5IGZpbGVuYW1lCitGMTAgZmlsZW5hbWUKK0YxMSBmaWxlbmFtZQorRjEyIGZpbGVuYW1lCisgICAgICAgIERpc3BsYXlzIHRoZSBpbmRpY2F0ZWQgZmlsZSBvbiB0aGUgc2NyZWVuIHdoZW4gYSBmdW5jdGlvbiBrZXkgaXMKKyAgICAgICAgcHJlc3NlZCBhdCB0aGUgYm9vdDogcHJvbXB0LiAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKKyAgICAgICAgcHJlLWJvb3Qgb25saW5lIGhlbHAgKHByZXN1bWFibHkgZm9yIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lCisgICAgICAgIG9wdGlvbnMuKSAgUGxlYXNlIHNlZSB0aGUgc2VjdGlvbiBiZWxvdyBvbiBESVNQTEFZIGZpbGVzLgorCisJV2hlbiB1c2luZyB0aGUgc2VyaWFsIGNvbnNvbGUsIHByZXNzIDxDdHJsLUY+PGRpZ2l0PiB0byBnZXQgdG8KKwl0aGUgaGVscCBzY3JlZW5zLCBlLmcuIDxDdHJsLUY+PDI+IHRvIGdldCB0byB0aGUgRjIgc2NyZWVuLgorCUZvciBGMTAtRjEyLCBoaXQgPEN0cmwtRj48QT4sIDxDdHJsLUY+QiwgPEN0cmwtRj5DLiAgRm9yCisJY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMsIEYxMCBjYW4gYWxzbyBiZSBlbnRlcmVkIGFzCisJPEN0cmwtRj4wLgorCitQQVRIIHBhdGgKKwlTcGVjaWZ5IGEgY29sb24tc2VwYXJhdGVkICgnOicpIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoCisJd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgbW9kdWxlcy4gVGhpcyBkaXJlY3RpdmUgaXMgdXNlZnVsIGZvcgorCXNwZWNpZnlpbmcgdGhlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIGxpYiouYzMyIGxpYnJhcnkKKwlmaWxlcyBhcyBvdGhlciBtb2R1bGVzIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlc2UgZmlsZXMsIGJ1dAorCW1heSBub3QgcmVzaWRlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4gVGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMKKwlpcyBzZWFyY2hlZCBpbiBvcmRlci4gUGxlYXNlIHNlZSB0aGUgc2VjdGlvbiBiZWxvdyBvbiBQQVRICisJUlVMRVMuCisKK0JsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLgorCitOb3RlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBub3QgY29tcGxldGVseSBkZWNvZGVkLiAgU3ludGF4CitkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGRlc2NyaWJlZCBhYm92ZSBtYXkgc3RpbGwgd29yayBjb3JyZWN0bHkgaW4gdGhpcwordmVyc2lvbiBvZiBTeXNsaW51eCwgYnV0IG1heSBicmVhayBpbiBhIGZ1dHVyZSBvbmUuCisKKworICAgKysrKyBESVNQTEFZIEZJTEUgRk9STUFUICsrKysKKworRElTUExBWSBhbmQgZnVuY3Rpb24ta2V5IGhlbHAgZmlsZXMgYXJlIHRleHQgZmlsZXMgaW4gZWl0aGVyIERPUyBvciBVTklYCitmb3JtYXQgKHdpdGggb3Igd2l0aG91dCA8Q1I+KS4gIEluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIHNwZWNpYWwgY29kZXMKK2FyZSBpbnRlcnByZXRlZDoKKworPEZGPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGRj4gPSA8Q3RybC1MPiA9IEFTQ0lJIDEyCisgICAgICAgIENsZWFyIHRoZSBzY3JlZW4sIGhvbWUgdGhlIGN1cnNvci4gIE5vdGUgdGhhdCB0aGUgc2NyZWVuIGlzCisgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBjdXJyZW50IGRpc3BsYXkgY29sb3IuCisKKzxTST48Ymc+PGZnPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U0k+ID0gPEN0cmwtTz4gPSBBU0NJSSAxNQorICAgICAgICBTZXQgdGhlIGRpc3BsYXkgY29sb3JzIHRvIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBhbmQKKyAgICAgICAgZm9yZWdyb3VuZCBjb2xvcnMsIHdoZXJlIDxiZz4gYW5kIDxmZz4gYXJlIGhleCBkaWdpdHMsCisgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YW5kYXJkIFBDIGRpc3BsYXkgYXR0cmlidXRlczoKKworICAgICAgICAwID0gYmxhY2sgICAgICAgICAgICAgICA4ID0gZGFyayBncmV5CisgICAgICAgIDEgPSBkYXJrIGJsdWUgICAgICAgICAgIDkgPSBicmlnaHQgYmx1ZQorICAgICAgICAyID0gZGFyayBncmVlbiAgICAgICAgICBhID0gYnJpZ2h0IGdyZWVuCisgICAgICAgIDMgPSBkYXJrIGN5YW4gICAgICAgICAgIGIgPSBicmlnaHQgY3lhbgorICAgICAgICA0ID0gZGFyayByZWQgICAgICAgICAgICBjID0gYnJpZ2h0IHJlZAorICAgICAgICA1ID0gZGFyayBwdXJwbGUgICAgICAgICBkID0gYnJpZ2h0IHB1cnBsZQorICAgICAgICA2ID0gYnJvd24gICAgICAgICAgICAgICBlID0geWVsbG93CisgICAgICAgIDcgPSBsaWdodCBncmV5ICAgICAgICAgIGYgPSB3aGl0ZQorCisgICAgICAgIFBpY2tpbmcgYSBicmlnaHQgY29sb3IgKDgtZikgZm9yIHRoZSBiYWNrZ3JvdW5kIHJlc3VsdHMgaW4gdGhlCisgICAgICAgIGNvcnJlc3BvbmRpbmcgZGFyayBjb2xvciAoMC03KSwgd2l0aCB0aGUgZm9yZWdyb3VuZCBmbGFzaGluZy4KKworCUNvbG9ycyBhcmUgbm90IHZpc2libGUgb3ZlciB0aGUgc2VyaWFsIGNvbnNvbGUuCisKKzxDQU4+ZmlsZW5hbWU8bmV3bGluZT4JCQk8Q0FOPiA9IDxDdHJsLVg+ID0gQVNDSUkgMjQKKwlJZiBhIFZHQSBkaXNwbGF5IGlzIHByZXNlbnQsIGVudGVyIGdyYXBoaWNzIG1vZGUgYW5kIGRpc3BsYXkKKwl0aGUgZ3JhcGhpYyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQKKwlpcyBhbiBhZCBob2MgZm9ybWF0IGNhbGxlZCBMU1MxNjsgdGhlIGluY2x1ZGVkIFBlcmwgcHJvZ3JhbQorCSJwcG10b2xzczE2IiBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIHRoZXNlIGltYWdlcy4gIFRoaXMgUGVybAorCXByb2dyYW0gYWxzbyBpbmNsdWRlcyB0aGUgZmlsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbi4KKworCVRoZSBpbWFnZSBpcyBkaXNwbGF5ZWQgaW4gNjQweDQ4MCAxNi1jb2xvciBtb2RlLiAgT25jZSBpbgorCWdyYXBoaWNzIG1vZGUsIHRoZSBkaXNwbGF5IGF0dHJpYnV0ZXMgKHNldCBieSA8U0k+IGNvZGUKKwlzZXF1ZW5jZXMpIHdvcmsgc2xpZ2h0bHkgZGlmZmVyZW50bHk6IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGlzCisJaWdub3JlZCwgYW5kIHRoZSBmb3JlZ3JvdW5kIGNvbG9ycyBhcmUgdGhlIDE2IGNvbG9ycyBzcGVjaWZpZWQKKwlpbiB0aGUgaW1hZ2UgZmlsZS4gIEZvciB0aGF0IHJlYXNvbiwgcHBtdG9sc3MxNiBhbGxvd3MgeW91IHRvCisJc3BlY2lmeSB0aGF0IGNlcnRhaW4gY29sb3JzIHNob3VsZCBiZSBhc3NpZ25lZCB0byBzcGVjaWZpYworCWNvbG9yIGluZGljaWVzLgorCisJQ29sb3IgaW5kaWNpZXMgMCBhbmQgNywgaW4gcGFydGljdWxhciwgc2hvdWxkIGJlIGNob3NlbiB3aXRoCisJY2FyZTogMCBpcyB0aGUgYmFja2dyb3VuZCBjb2xvciwgYW5kIDcgaXMgdGhlIGNvbG9yIHVzZWQgZm9yCisJdGhlIHRleHQgcHJpbnRlZCBieSBTeXNsaW51eCBpdHNlbGYuCisKKzxFTT4JCQkJCTxFTT4gPSA8Q3RybC1ZPiA9IEFTQ0lJIDI1CisJSWYgd2UgYXJlIGN1cnJlbnRseSBpbiBncmFwaGljcyBtb2RlLCByZXR1cm4gdG8gdGV4dCBtb2RlLgorCis8RExFPi4uPEVUQj4JCQkJPEN0cmwtUD4uLjxDdHJsLVc+ID0gQVNDSUkgMTYtMjMKKwlUaGVzZSBjb2RlcyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hpY2ggbW9kZXMgdG8gcHJpbnQgYQorCWNlcnRhaW4gcGFydCBvZiB0aGUgbWVzc2FnZSBmaWxlIGluLiAgRWFjaCBvZiB0aGVzZSBjb250cm9sCisJY2hhcmFjdGVycyBzZWxlY3QgYSBzcGVjaWZpYyBzZXQgb2YgbW9kZXMgKHRleHQgc2NyZWVuLAorCWdyYXBoaWNzIHNjcmVlbiwgc2VyaWFsIHBvcnQpIGZvciB3aGljaCB0aGUgb3V0cHV0IGlzIGFjdHVhbGx5CisJZGlzcGxheWVkOgorCisJQ2hhcmFjdGVyCQkJVGV4dAlHcmFwaAlTZXJpYWwKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwk8RExFPiA9IDxDdHJsLVA+ID0gQVNDSUkgMTYJTm8JTm8JTm8KKwk8REMxPiA9IDxDdHJsLVE+ID0gQVNDSUkgMTcJWWVzCU5vCU5vCisJPERDMj4gPSA8Q3RybC1SPiA9IEFTQ0lJIDE4CU5vCVllcwlObworCTxEQzM+ID0gPEN0cmwtUz4gPSBBU0NJSSAxOQlZZXMJWWVzCU5vCisJPERDND4gPSA8Q3RybC1UPiA9IEFTQ0lJIDIwCU5vCU5vCVllcworCTxOQUs+ID0gPEN0cmwtVT4gPSBBU0NJSSAyMQlZZXMJTm8JWWVzCisJPFNZTj4gPSA8Q3RybC1WPiA9IEFTQ0lJIDIyCU5vCVllcwlZZXMKKwk8RVRCPiA9IDxDdHJsLVc+ID0gQVNDSUkgMjMJWWVzCVllcwlZZXMKKworCUZvciBleGFtcGxlOgorCisJPERDMT5UZXh0IG1vZGU8REMyPkdyYXBoaWNzIG1vZGU8REM0PlNlcmlhbCBwb3J0PEVUQj4KKworCS4uLiB3aWxsIGFjdHVhbGx5IHByaW50IG91dCB3aGljaCBtb2RlIHRoZSBjb25zb2xlIGlzIGluIQorCis8U1VCPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNVQj4gPSA8Q3RybC1aPiA9IEFTQ0lJIDI2CisgICAgICAgIEVuZCBvZiBmaWxlIChET1MgY29udmVudGlvbikuCisKKzxCRUw+CQkJCQk8QkVMPiA9IDxDdHJsLUc+ID0gQVNDSUkgNworCUJlZXAgdGhlIHNwZWFrZXIuCisKKworICAgKysrKyBDT01NQU5EIExJTkUgS0VZU1RST0tFUyArKysrCisKK1RoZSBjb21tYW5kIGxpbmUgcHJvbXB0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcga2V5c3Ryb2tlczoKKworPEVudGVyPgkJYm9vdCBzcGVjaWZpZWQgY29tbWFuZCBsaW5lCis8QmFja1NwYWNlPgllcmFzZSBvbmUgY2hhcmFjdGVyCis8Q3RybC1VPgllcmFzZSB0aGUgd2hvbGUgbGluZQorPEN0cmwtVj4JZGlzcGxheSB0aGUgY3VycmVudCBTeXNsaW51eCB2ZXJzaW9uCis8Q3RybC1XPgllcmFzZSBvbmUgd29yZAorPEN0cmwtWD4JZm9yY2UgdGV4dCBtb2RlCis8VGFiPgkJbGlzdCBtYXRjaGluZyBsYWJlbHMKKzxGMT4uLjxGMTI+CWhlbHAgc2NyZWVucyAoaWYgY29uZmlndXJlZCkKKzxDdHJsLUY+PGRpZ2l0PgllcXVpdmFsZW50IHRvIEYxLi5GMTAKKzxDdHJsLUM+CWludGVycnVwdCBib290IGluIHByb2dyZXNzCis8RXNjPgkJaW50ZXJydXB0IGJvb3QgaW4gcHJvZ3Jlc3MKKzxDdHJsLU4+CWRpc3BsYXkgbmV0d29yayBpbmZvcm1hdGlvbiAoUFhFTElOVVggb25seSkKKworCisgICArKysrIE9USEVSIE9QRVJBVElORyBTWVNURU1TICsrKysKKworVGhpcyB2ZXJzaW9uIG9mIFN5c2xpbnV4IHN1cHBvcnRzIGNoYWluIGxvYWRpbmcgb2Ygb3RoZXIgb3BlcmF0aW5nCitzeXN0ZW1zIChzdWNoIGFzIE1TLURPUyBhbmQgaXRzIGRlcml2YXRpdmVzLCBpbmNsdWRpbmcgV2luZG93cyA5NS85OCkuCisKK0NoYWluIGxvYWRpbmcgcmVxdWlyZXMgdGhlIGJvb3Qgc2VjdG9yIG9mIHRoZSBmb3JlaWduIG9wZXJhdGluZyBzeXN0ZW0KK3RvIGJlIHN0b3JlZCBpbiBhIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBmaWxlc3lzdGVtLgorQmVjYXVzZSBuZWl0aGVyIExpbnV4IGtlcm5lbHMsIG5vciBib290IHNlY3RvciBpbWFnZXMgaGF2ZSByZWxpYWJsZQorbWFnaWMgbnVtYmVycywgU3lzbGludXggd2lsbCBsb29rIGF0IHRoZSBmaWxlIGV4dGVuc2lvbi4KK1RoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyBhcmUgcmVjb2duaXplZCAoY2FzZSBpbnNlbnNpdGl2ZSk6CisKKyAgbm9uZSBvciBvdGhlcglMaW51eCBrZXJuZWwgaW1hZ2UKKyAgLjAJCVBYRSBib290c3RyYXAgcHJvZ3JhbSAoTkJQKSBbUFhFTElOVVggb25seV0KKyAgLmJpbgkJIkNEIGJvb3Qgc2VjdG9yIiBbSVNPTElOVVggb25seV0KKyAgLmJzCQlCb290IHNlY3RvciBbU1lTTElOVVggb25seV0KKyAgLmJzcwkJQm9vdCBzZWN0b3IsIERPUyBzdXBlcmJsb2NrIHdpbGwgYmUgcGF0Y2hlZCBpbiBbU1lTTElOVVggb25seV0KKyAgLmMzMgkJQ09NMzIgaW1hZ2UgKDMyLWJpdCBFTEYpCisgIC5pbWcJCURpc2sgaW1hZ2UgW0lTT0xJTlVYIG9ubHldCisKK0ZvciBmaWxlbmFtZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSwgU3lzbGludXggd2lsbCBzZWFyY2ggZm9yIHRoZQorZmlsZSBieSBhZGRpbmcgZXh0ZW5zaW9ucyBpbiB0aGUgb3JkZXIgbGlzdGVkIGFib3ZlIGlmIHRoZSBwbGFpbgorZmlsZW5hbWUgaXMgbm90IGZvdW5kLiAgRmlsZW5hbWVzIGluIEtFUk5FTCBzdGF0ZW1lbnRzIG11c3QgYmUgZnVsbHkKK3F1YWxpZmllZC4KKworSWYgdGhpcyBpcyBzcGVjaWZpZWQgd2l0aCBvbmUgb2YgdGhlIGtleXdvcmRzIExJTlVYLCBCT09ULCBCU1MsCitGRElNQUdFLCBDT00zMiwgb3IgQ09ORklHIGluc3RlYWQgb2YgS0VSTkVMLCB0aGUgZmlsZXR5cGUgaXMKK2NvbnNpZGVyZWQgdG8gYmUgdGhlIG9uZSBzcGVjaWZpZWQgcmVnYXJkbGVzcyBvZiB0aGUgZmlsZW5hbWUuCisKKworICAgICAgKysrKyBCT09USU5HIERPUyAoT1IgT1RIRVIgU0lNSUxBUiBPUEVSQVRJTkcgU1lTVEVNUykgKysrKworCitUaGlzIHNlY3Rpb24gYXBwbGllcyB0byBTWVNMSU5VWCBvbmx5LCBub3QgdG8gUFhFTElOVVggb3IgSVNPTElOVVguCitTZWUgaXNvbGludXgudHh0IGZvciBhbiBlcXVpdmFsZW50IHByb2NlZHVyZSBmb3IgSVNPTElOVVguCisKK1RoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHByb2NlZHVyZSBmb3IgY3JlYXRpbmcgYSBTWVNMSU5VWCBkaXNrIHRoYXQKK2NhbiBib290IGVpdGhlciBET1Mgb3IgTGludXguICBUaGlzIGV4YW1wbGUgYXNzdW1lcyB0aGUgZHJpdmUgaXMgQTogaW4KK0RPUyBhbmQgL2Rldi9mZDAgaW4gTGludXg7IGZvciBvdGhlciBkcml2ZXMsIHN1YnN0aXR1dGUgdGhlCithcHByb3ByaWF0ZSBkcml2ZSBkZXNpZ25hdG9yLgorCisgICAtLS0tIExpbnV4IHByb2NlZHVyZSAtLS0tCisKKzEuIE1ha2UgYSBET1MgYm9vdGFibGUgZGlzay4gIFRoaXMgY2FuIGJlIGRvbmUgZWl0aGVyIGJ5IHNwZWNpZnlpbmcKKyAgIHRoZSAvcyBvcHRpb24gd2hlbiBmb3JtYXR0aW5nIHRoZSBkaXNrIGluIERPUywgb3IgYnkgcnVubmluZyB0aGUKKyAgIERPUyBjb21tYW5kIFNZUyAodGhpcyBjYW4gYmUgZG9uZSB1bmRlciBET1NFTVUgaWYgRE9TRU1VIGhhcworICAgZGlyZWN0IGRldmljZSBhY2Nlc3MgdG8gdGhlIHJlbGV2YW50IGRyaXZlKToKKworCWZvcm1hdCBhOiAvcworICAgb3IKKwlzeXMgYToKKworMi4gQm9vdCBMaW51eC4gIENvcHkgdGhlIERPUyBib290IHNlY3RvciBmcm9tIHRoZSBkaXNrIGludG8gYSBmaWxlOgorCisJZGQgaWY9L2Rldi9mZDAgb2Y9ZG9zLmJzcyBicz01MTIgY291bnQ9MQorCiszLiBSdW4gU1lTTElOVVggb24gdGhlIGRpc2s6CisKKwlzeXNsaW51eCAvZGV2L2ZkMAorCis0LiBNb3VudCB0aGUgZGlzayBhbmQgY29weSB0aGUgRE9TIGJvb3Qgc2VjdG9yIGZpbGUgdG8gaXQuICBUaGUgZmlsZQorICAgKm11c3QqIGhhdmUgZXh0ZW5zaW9uIC5ic3M6CisKKwltb3VudCAtdCBtc2RvcyAvZGV2L2ZkMCAvbW50CisJY3AgZG9zLmJzcyAvbW50CisKKzUuIENvcHkgdGhlIExpbnV4IGtlcm5lbCBpbWFnZShzKSwgaW5pdHJkKHMpLCBldGMgdG8gdGhlIGRpc2ssIGFuZAorICAgY3JlYXRlL2VkaXQgc3lzbGludXguY2ZnIGFuZCBoZWxwIGZpbGVzIGlmIGRlc2lyZWQ6CisKKwljcCB2bWxpbnV4IC9tbnQKKwljcCBpbml0cmQuZ3ogL21udAorCis2LiBVbm1vdW50IHRoZSBkaXNrIChpZiBhcHBsaWNhYmxlLikKKworCXVtb3VudCAvbW50CisKKyAgIC0tLS0gRE9TL1dpbmRvd3MgcHJvY2VkdXJlIC0tLS0KKworVG8gbWFrZSB0aGlzIGluc3RhbGxhdGlvbiBpbiBET1Mgb25seSwgeW91IG5lZWQgdGhlIHV0aWxpdHkgY29weWJzLmNvbQorKGluY2x1ZGVkIHdpdGggU3lzbGludXgpIGFzIHdlbGwgYXMgdGhlIHN5c2xpbnV4LmNvbSBpbnN0YWxsZXIuICBJZgoreW91IGFyZSBvbiBhbiBXaW5OVC1iYXNlZCBzeXN0ZW0gKFdpbk5ULCBXaW4yaywgV2luWFAgb3IgbGF0ZXIpLCB1c2UKK3N5c2xpbnV4LmV4ZSBpbnN0ZWFkLgorCisxLiBNYWtlIGEgRE9TIGJvb3RhYmxlIGRpc2suICBUaGlzIGNhbiBiZSBkb25lIGVpdGhlciBieSBzcGVjaWZ5aW5nCisgICB0aGUgL3Mgb3B0aW9uIHdoZW4gZm9ybWF0dGluZyB0aGUgZGlzayBpbiBET1MsIG9yIGJ5IHJ1bm5pbmcgdGhlCisgICBET1MgY29tbWFuZCBTWVM6CisKKwlmb3JtYXQgYTogL3MKKyAgIG9yCisJc3lzIGE6CisKKzIuIENvcHkgdGhlIERPUyBib290IHNlY3RvciBmcm9tIHRoZSBkaXNrIGludG8gYSBmaWxlLiAgVGhlIGZpbGUKKyAgICptdXN0KiBoYXZlIGV4dGVuc2lvbiAuYnNzOgorCisJY29weWJzIGE6IGE6ZG9zLmJzcworCiszLiBSdW4gU1lTTElOVVggb24gdGhlIGRpc2s6CisKKwlzeXNsaW51eCBhOgorCis0LiBDb3B5IHRoZSBMaW51eCBrZXJuZWwgaW1hZ2UocyksIGluaXRyZChzKSwgZXRjIHRvIHRoZSBkaXNrLCBhbmQKKyAgIGNyZWF0ZS9lZGl0IHN5c2xpbnV4LmNmZyBhbmQgaGVscCBmaWxlcyBpZiBkZXNpcmVkOgorCisJY29weSB2bWxpbnV4IGE6CisJY29weSBpbml0cmQuZ3ogYToKKworCisgICArKysrIE5PVklDRSBQUk9URUNUSU9OICsrKysKKworU3lzbGludXggd2lsbCBhdHRlbXB0IHRvIGRldGVjdCBib290aW5nIG9uIGEgbWFjaGluZSB3aXRoIHRvbyBsaXR0bGUKK21lbW9yeSwgd2hpY2ggbWVhbnMgdGhlIExpbnV4IGJvb3Qgc2VxdWVuY2UgY2Fubm90IGNvbXBsZXRlLiAgSWYgc28sIGEKK21lc3NhZ2UgaXMgZGlzcGxheWVkIGFuZCB0aGUgYm9vdCBzZXF1ZW5jZSBhYm9ydGVkLiAgSG9sZGluZyBkb3duIHRoZQorQ3RybCBrZXkgd2hpbGUgYm9vdGluZyBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuCisKK0FueSBmaWxlIHRoYXQgU1lTTElOVVggdXNlcyBjYW4gYmUgbWFya2VkIGhpZGRlbiwgc3lzdGVtIG9yIHJlYWRvbmx5CitpZiBzbyBpcyBjb252ZW5pZW50OyBTWVNMSU5VWCBpZ25vcmVzIGFsbCBmaWxlIGF0dHJpYnV0ZXMuICBUaGUKK1NZU0xJTlVYIGluc3RhbGxlZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIHJlYWRvbmx5L2hpZGRlbi9zeXN0ZW0KK2F0dHJpYnV0ZXMgb24gTERMSU5VWC5TWVMuCisKKworICAgKysrKyBOT1RFUyBPTiBCT09UQUJMRSBDRC1ST01TICsrKysKKworU1lTTElOVVggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGJvb3RkaXNrIGltYWdlcyBmb3IgRWwKK1Rvcml0by1jb21wYXRpYmxlIGJvb3RhYmxlIENELVJPTXMuICBIb3dldmVyLCBpdCBhcHBlYXJzIHRoYXQgbWFueQorQklPU2VzIGFyZSB2ZXJ5IGJ1Z2d5IHdoZW4gaXQgY29tZXMgdG8gYm9vdGluZyBDRC1ST01zLiAgU29tZSB1c2VycworaGF2ZSByZXBvcnRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIGhlbHBmdWwgaW4gbWFraW5nIGEgQ0QtUk9NCit0aGF0IGlzIGJvb3RhYmxlIG9uIHRoZSBsYXJnZXN0IHBvc3NpYmxlIG51bWJlciBvZiBtYWNoaW5lczoKKworCWEpIFVzZSB0aGUgLXMgKHNhZmUsIHNsb3cgYW5kIHN0dXBpZCkgb3B0aW9uIHRvIFNZU0xJTlVYOworCWIpIFB1dCB0aGUgYm9vdCBpbWFnZSBhcyBjbG9zZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCSAgIElTTyA5NjYwIGZpbGVzeXN0ZW0gYXMgcG9zc2libGUuCisKK0EgQ0QtUk9NIGlzIHNvIG11Y2ggZmFzdGVyIHRoYW4gYSBmbG9wcHkgdGhhdCB0aGUgLXMgb3B0aW9uIHNob3VsZG4ndAorbWF0dGVyIGZyb20gYSBzcGVlZCBwZXJzcGVjdGl2ZS4KKworT2YgY291cnNlLCB5b3UgcHJvYmFibHkgd2FudCB0byB1c2UgSVNPTElOVVggaW5zdGVhZC4gIFNlZSBpc29saW51eC50eHQuCisKKworICAgKysrKyBCT09USU5HIEZST00gQSBGQVQgRklMRVNZU1RFTSBQQVJUSVRJT04gT04gQSBIQVJEIERJU0sgKysrKworCitTWVNMSU5VWCBjYW4gYm9vdCBmcm9tIGEgRkFUIGZpbGVzeXN0ZW0gcGFydGl0aW9uIG9uIGEgaGFyZCBkaXNrCisoaW5jbHVkaW5nIEZBVDMyKS4gIFRoZSBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIGlzIGlkZW50aWNhbCB0byB0aGUKK3Byb2NlZHVyZSBmb3IgaW5zdGFsbGluZyBpdCBvbiBhIGZsb3BweSwgYW5kIHNob3VsZCB3b3JrIHVuZGVyIGVpdGhlcgorRE9TIG9yIExpbnV4LiAgVG8gYm9vdCBmcm9tIGEgcGFydGl0aW9uLCBTWVNMSU5VWCBuZWVkcyB0byBiZSBsYXVuY2hlZAorZnJvbSBhIE1hc3RlciBCb290IFJlY29yZCBvciBhbm90aGVyIGJvb3QgbG9hZGVyLCBqdXN0IGxpa2UgRE9TIGl0c2VsZgord291bGQuCisKK1VuZGVyIERPUywgeW91IGNhbiBpbnN0YWxsIGEgc3RhbmRhcmQgc2ltcGxlIE1CUiBvbiB0aGUgcHJpbWFyeSBoYXJkCitkaXNrIGJ5IHJ1bm5pbmcgdGhlIGNvbW1hbmQ6CisKKwlGRElTSyAvTUJSCisKK1RoZW4gdXNlIHRoZSBGRElTSyBjb21tYW5kIHRvIG1hcmsgdGhlIGFwcHJvcHJpYXRlIHBhcnRpdGlvbiBhY3RpdmUuCisKK0Egc2ltcGxlIE1CUiwgcm91Z2hseSBvbiBwYXIgd2l0aCB0aGUgb25lIGluc3RhbGxlZCBieSBET1MgKGJ1dAordW5lbmN1bWJlcmVkKSwgaXMgaW5jbHVkZWQgaW4gdGhlIFNZU0xJTlVYIGRpc3RyaWJ1dGlvbi4gIFRvIGluc3RhbGwKK2l0IHVuZGVyIExpbnV4LCBzaW1wbHkgdHlwZToKKworCWNhdCBtYnIuYmluID4gL2Rldi9YWFgKKworLi4uIHdoZXJlIC9kZXYvWFhYIGlzIHRoZSBkZXZpY2UgeW91IHdpc2ggdG8gaW5zdGFsbCBpdCBvbi4KKworVW5kZXIgRE9TIG9yIFdpbjMyLCB5b3UgY2FuIGluc3RhbGwgdGhlIFNZU0xJTlVYIE1CUiB3aXRoIHRoZSAtbQorb3B0aW9uIHRvIHRoZSBTWVNMSU5VWCBpbnN0YWxsZXIsIGFuZCB1c2UgdGhlIC1hIG9wdGlvbiB0byBtYXJrIHRoZQorY3VycmVudCBwYXJ0aXRpb24gYWN0aXZlOgorCisJc3lzbGludXggLW1hIGM6CisKK05vdGUgdGhhdCB0aGlzIHdpbGwgYWxzbyBpbnN0YWxsIFNZU0xJTlVYIG9uIHRoZSBzcGVjaWZpZWQgcGFydGl0aW9uLgorCisKKyAgICsrKysgSEFSRFdBUkUgSU5GT1JNQVRJT04gKysrCisKK0kgaGF2ZSBzdGFydGVkIHRvIG1haW50YWluIGEgd2ViIHBhZ2Ugb2YgaGFyZHdhcmUgd2l0aCBrbm93bgorcHJvYmxlbXMuICBUaGVyZSBhcmUsIHVuZm9ydHVuYXRlbHksIGxvdHMgb2YgYnJva2VuIGhhcmR3YXJlIG91dAordGhlcmU7IGVzcGVjaWFsbHkgZWFybHkgUFhFIHN0YWNrcyAoZm9yIFBYRUxJTlVYKSBoYXZlIGxvdHMgb2YKK3Byb2JsZW1zLgorCitBIGxpc3Qgb2YgcHJvYmxlbXMsIGFuZCB3b3JrYXJvdW5kcyAoaWYga25vd24pLCBpcyBtYWludGFpbmVkIGF0OgorCisJaHR0cDovL3N5c2xpbnV4Lnp5dG9yLmNvbS9oYXJkd2FyZS5waHAKKworCisgICArKysrIEJPT1QgTE9BREVSIElEUyBVU0VEICsrKysKKworVGhlIExpbnV4IGJvb3QgcHJvdG9jb2wgc3VwcG9ydHMgYSAiYm9vdCBsb2FkZXIgSUQiLCBhIHNpbmdsZSBieXRlCit3aGVyZSB0aGUgdXBwZXIgbnliYmxlIHNwZWNpZmllcyBhIGJvb3QgbG9hZGVyIGZhbWlseSAoMyA9IFN5c2xpbnV4KQorYW5kIHRoZSBsb3dlciBueWJibGUgaXMgdmVyc2lvbiBvciwgaW4gdGhlIGNhc2Ugb2YgU3lzbGludXgsIG1lZGlhOgorCisJMHgzMSAoNDkpID0gU1lTTElOVVgKKwkweDMyICg1MCkgPSBQWEVMSU5VWAorCTB4MzMgKDUxKSA9IElTT0xJTlVYCisJMHgzNCAoNTIpID0gRVhUTElOVVgKKworSW4gcmVjZW50IHZlcnNpb25zIG9mIExpbnV4LCB0aGlzIElEIGlzIGF2YWlsYWJsZSBhcworL3Byb2Mvc3lzL2tlcm5lbC9ib290bG9hZGVyX3R5cGUuCisKKworICAgKysrKyBQQVRIIFJVTEVTICsrKysKKworVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgKmFsd2F5cyogc2VhcmNoZWQgZmlyc3QsIGJlZm9yZSBQQVRILAord2hlbiBhdHRlbXB0aW5nIHRvIG9wZW4gYSBmaWxlbmFtZS4gVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMKK25vdCBhZmZlY3RlZCB3aGVuIHNwZWNpZnlpbmcgYSBmaWxlIHdpdGggYW4gYWJzb2x1dGUgcGF0aC4gRm9yCitleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIGZpbGUgc3lzdGVtIGxheW91dCwKKworCSAvYm9vdC8KKwkJL2Jpbi8KKwkJCWxzLmMzMgorCQkJbGlibHMuYzMyCisJCS9mb28vCisJCQlsaWJscy5jMzIKKworYXNzdW1pbmcgdGhhdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyAvYm9vdC9mb28sIGFuZCBhc3N1bWluZwordGhhdCBsaWJscy5jMzIgaXMgYSBkZXBlbmRlbmN5IG9mIGxzLmMzMiwgZXhlY3V0aW5nIC9ib290L2Jpbi9scy5jMzIKK3dpbGwgY2F1c2UgL2Jvb3QvZm9vL2xpYmxzLmMzMiB0byBiZSBsb2FkZWQsIG5vdCAvYm9vdC9iaW4vbGlibHMuYzMyLAorZXZlbiBpZiAvYm9vdC9iaW4gaXMgc3BlY2lmaWVkIGluIHRoZSBQQVRIIGRpcmVjdGl2ZSBvZiBhIGNvbmZpZyBmaWxlLgorCitUaGUgcmVhc29uIHRoYXQgdGhpbmdzIHdvcmsgdGhpcyB3YXkgaXMgdGhhdCB0eXBpY2FsbHkgYSB1c2VyIHdpbGwKK2luc3RhbGwgYWxsIGxpYnJhcnkgZmlsZXMgaW4gdGhlIFN5c2xpbnV4IGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIGFzCitzcGVjaWZpZWQgd2l0aCB0aGUgLS1kaXJlY3RvcnkgaW5zdGFsbGVyIG9wdGlvbi4gVGhpcyBtZXRob2QgYWxsb3dzCit0aGUgdXNlciB0byBvbWl0IHRoZSBQQVRIIGRpcmVjdGl2ZSBmcm9tIHRoZWlyIGNvbmZpZyBmaWxlIGFuZCBzdGlsbAoraGF2ZSB0aGluZ3Mgd29yayBjb3JyZWN0bHkuCisKKworICAgKysrKyBCVUcgUkVQT1JUUyArKysrCisKK0kgd291bGQgYXBwcmVjaWF0ZSBoZWFyaW5nIG9mIGFueSBwcm9ibGVtcyB5b3UgaGF2ZSB3aXRoIFN5c2xpbnV4LiAgSQord291bGQgYWxzbyBsaWtlIHRvIGhlYXIgZnJvbSB5b3UgaWYgeW91IGhhdmUgc3VjY2Vzc2Z1bGx5IHVzZWQgU3lzbGludXgsCisqZXNwZWNpYWxseSogaWYgeW91IGFyZSB1c2luZyBpdCBmb3IgYSBkaXN0cmlidXRpb24uCisKK0lmIHlvdSBhcmUgcmVwb3J0aW5nIHByb2JsZW1zLCBwbGVhc2UgaW5jbHVkZSBhbGwgcG9zc2libGUgaW5mb3JtYXRpb24KK2Fib3V0IHlvdXIgc3lzdGVtIGFuZCB5b3VyIEJJT1M7IHRoZSB2YXN0IG1ham9yaXR5IG9mIGFsbCBwcm9ibGVtcworcmVwb3J0ZWQgdHVybiBvdXQgdG8gYmUgQklPUyBvciBoYXJkd2FyZSBidWdzLCBhbmQgSSBuZWVkIGFzIG11Y2gKK2luZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvIGRpYWdub3NlIHRoZSBwcm9ibGVtcy4KKworVGhlcmUgaXMgYSBtYWlsaW5nIGxpc3QgZm9yIGRpc2N1c3Npb24gYW1vbmcgU3lzbGludXggdXNlcnMgYW5kIGZvcgorYW5ub3VuY2VtZW50cyBvZiBuZXcgYW5kIHRlc3QgdmVyc2lvbnMuICBUbyBqb2luLCBvciB0byBicm93c2UgdGhlCithcmNoaXZlLCBnbyB0bzoKKworICAgaHR0cDovL3d3dy56eXRvci5jb20vbWFpbG1hbi9saXN0aW5mby9zeXNsaW51eAorCitQbGVhc2UgRE8gTk9UIHNlbmQgSFRNTCBtZXNzYWdlcyBvciBhdHRhY2htZW50cyB0byB0aGUgbWFpbGluZyBsaXN0CisoaW5jbHVkaW5nIG11bHRpcGFydC9hbHRlcm5hdGl2ZSBvciBzaW1pbGFyLikgIEFsbCBzdWNoIG1lc3NhZ2VzIHdpbGwKK2JlIGJvdW5jZWQuCmRpZmYgLS1naXQgYS9kb2MvdXNia2V5LnR4dCBiL2RvYy91c2JrZXkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjEzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdXNia2V5LnR4dApAQCAtMCwwICsxLDQ3IEBACitUaGUgcHJvcGVyIG1vZGUgdG8gYm9vdCBhIFVTQiBrZXkgZHJpdmUgaW4gaXMgIlVTQi1IREQiLiAgVGhhdCBpcyB0aGUKK09OTFkgbW9kZSBpbiB3aGljaCB0aGUgQy9IL1MgZ2VvbWV0cnkgZW5jb2RlZCBvbiB0aGUgZGlzayBpdHNlbGYKK2RvZXNuJ3QgaGF2ZSB0byBtYXRjaCB3aGF0IHRoZSBCSU9TIHRoaW5rcyBpdCBpcy4gIFNpbmNlIGdlb21ldHJ5IG9uCitVU0IgZHJpdmVzIGlzIGNvbXBsZXRlbHkgYXJiaXRyYXJ5LCBhbmQgY2FuIHZhcnkgZnJvbSBCSU9TIHRvIEJJT1MsCit0aGlzIGlzIHRoZSBvbmx5IG1vZGUgd2hpY2ggd2lsbCB3b3JrIGluIGdlbmVyYWwuCisKK1NvbWUgQklPU2VzIGhhdmUgYmVlbiByZXBvcnRlZCAoaW4gcGFydGljdWxhciwgY2VydGFpbiB2ZXJzaW9ucyBvZiB0aGUKK0F3YXJkIEJJT1MpIHRoYXQgY2Fubm90IGJvb3QgVVNCIGtleXMgaW4gIlVTQi1IREQiIG1vZGUuICBUaGlzIGlzIGEKK3Zlcnkgc2VyaW91cyBCSU9TIGJ1ZywgYnV0IGl0IGlzIHVuZm9ydHVuYXRlbHkgcmF0aGVyIHR5cGljYWwgb2YgdGhlCitraW5kIG9mIHF1YWxpdHkgd2UncmUgc2VlaW5nIG91dCBvZiBtYWpvciBCSU9TIHZlbmRvcnMgdGhlc2UgZGF5cy4gIE9uCit0aGVzZSBCSU9TZXMsIHlvdSdyZSBnZW5lcmFsbHkgc3R1Y2sgYm9vdGluZyB0aGVtIGluIFVTQi1aSVAgbW9kZS4KKworVEhJUyBNRUFOUyBUSEUgRklMRVNZU1RFTSBJTUFHRSBPTiBUSEUgRElTSyBIQVMgVE8gSEFWRSBBIENPUlJFQ1QKK1pJUERSSVZFLUNPTVBBVElCTEUgR0VPTUVUUlkuCisKK0Egc3RhbmRhcmQgemlwZHJpdmUgKGJvdGggdGhlIDEwMCBNQiBhbmQgdGhlIDI1MCBNQiB2YXJpZXRpZXMpIGhhdmUgYQorImdlb21ldHJ5IiBvZiA2NCBoZWFkcywgMzIgc2VjdG9ycywgYW5kIGFyZSBwYXJ0aXRpb25lZCBkZXZpY2VzIHdpdGggYQorc2luZ2xlIHBhcnRpdGlvbiA0ICh1bmxpa2UgbW9zdCBvdGhlciBtZWRpYSBvZiB0aGlzIHR5cGUgd2hpY2ggdXNlcworcGFydGl0aW9uIDEuKSAgVGhlIDEwMCBNQiB2YXJpZXR5IGhhcyA5NiBjeWxpbmRlcnMsIGFuZCB0aGUgMjUwIE1CCit2YXJpZXR5IGhhcyAyMzkgY3lsaW5kZXJzOyBidXQgYW55IG51bWJlciBvZiBjeWxpbmRlcnMgd2lsbCBkbyBhcworYXBwcm9wcmlhdGUgZm9yIHRoZSBzaXplIGRldmljZSB5b3UgaGF2ZS4gIEZvciBleGFtcGxlLCBpZiB5b3VyIGRldmljZQorcmVwb3J0cyB3aGVuIGluc2VydGVkIGludG8gYSBMaW51eCBzeXN0ZW06CisKK3VzYi1zdG9yYWdlOiBkZXZpY2UgZm91bmQgYXQgNAorICBWZW5kb3I6IDMyTUIgICAgICBNb2RlbDogSGFyZERyaXZlICAgICAgICAgUmV2OiAxLjg4CisgIFR5cGU6ICAgRGlyZWN0LUFjY2VzcyAgICAgICAgICAgICAgICAgICAgICBBTlNJIFNDU0kgcmV2aXNpb246IDAyCitTQ1NJIGRldmljZSBzZGE6IDY0MDAwIDUxMi1ieXRlIGhkd3Igc2VjdG9ycyAoMzMgTUIpCisKKy4uLiB5b3Ugd291bGQgaGF2ZSA2NDAwMC8oNjQqMzIpID0gMzEuMjUgY3lsaW5kZXJzOyByb3VuZCBkb3duIHRvIDMxLgorCitUaGUgc2NyaXB0ICJta2Rpc2tpbWFnZSIgd2hpY2ggaXMgc3VwcGxpZWQgd2l0aCB0aGUgc3lzbGludXgKK2Rpc3RyaWJ1dGlvbiBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIFVTQiBrZXlzIGluIGEgWmlwLWxpa2UgZmFzaGlvbi4KK1RvIGRvIHRoYXQsIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBudW1iZXIgb2YgY3lsaW5kZXJzICgzMSBpbiB0aGUKK2V4YW1wbGUgYWJvdmUpLCBhbmQsIGlmIHlvdXIgVVNCIGtleSBpcyAvZGV2L3NkYSAoQ0hFQ0sgVEhFIEtFUk5FTAorTUVTU0FHRVMgQ0FSRUZVTExZIC0gSUYgWU9VIEVOVEVSIFRIRSBXUk9ORyBESVNLIERSSVZFIElUIENBTk5PVCBCRQorUkVDT1ZFUkVEKSwgcnVuOgorCisJbWtkaXNraW1hZ2UgLTQgL2Rldi9zZGEgMCA2NCAzMgorCisoVGhlIDAgbWVhbnMgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGRldmljZSwgYW5kIC00CittZWFucyBtaW1pYyBhIHppcGRpc2sgYnkgdXNpbmcgcGFydGl0aW9uIDQuKQorCitUaGVuIHlvdSBzaG91bGQgYmUgYWJsZSB0byBydW4KKworCXN5c2xpbnV4IC9kZXYvc2RhNAorCisuLi4gYW5kIG1vdW50IC9kZXYvc2RhNCBhbmQgcHV0IHlvdXIgZmlsZXMgb24gaXQgYXMgbmVlZGVkLgpkaWZmIC0tZ2l0IGEvZG9zL01ha2VmaWxlIGIvZG9zL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzMzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb3MvTWFrZWZpbGUKQEAgLTAsMCArMSw3OSBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMjIE1TLURPUyBGQVQgaW5zdGFsbGVyCisjIworCitpbmNsdWRlICQoTUFLRURJUikvZW1iZWRkZWQubWsKKworQ0ZMQUdTCSs9IC1EX19NU0RPU19fIC1tcmVncGFybT0zIC1EUkVHUEFSTT0zCisjIENGTEFHUyAgKz0gLURERUJVRworCitMREZMQUdTCSA9IC1UICQoU1JDKS9kb3NleGUubGQKK09QVEZMQUdTID0gLWcKK0lOQ0xVREVTID0gLWluY2x1ZGUgY29kZTE2LmggLW5vc3RkaW5jIC1pd2l0aHByZWZpeCBpbmNsdWRlIFwKKwkgICAtSSQoU1JDKSAtSSQoU1JDKS8uLiAtSSQoU1JDKS8uLi9saWJmYXQgXAorCSAgIC1JICQoU1JDKS8uLi9saWJpbnN0YWxsZXIgLUkgJChTUkMpLy4uL2xpYmluc3RhbGxlci9nZXRvcHQgXAorCSAgIC1JJChvYmpkaXIpCisKK1NSQ1MgICAgID0gc3lzbGludXguYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL2ZzLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9zeXNseG1vZC5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvc3lzbHhvcHQuYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL3NldGFkdi5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvZ2V0b3B0L2dldG9wdF9sb25nLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9ib290c2VjdF9iaW4uYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL21icl9iaW4uYyBcCisgICAgICAgICAgICQod2lsZGNhcmQgJChTUkMpLy4uL2xpYmZhdC8qLmMpCitPQkpTCSA9IGhlYWRlci5vIGNydDAubyBsZGxpbnV4Lm8gXAorCSAgICQocGF0c3Vic3QgJS5jLCUubywkKG5vdGRpciAkKFNSQ1MpKSkKK0xJQk9CSlMJID0gaW50MjUyNi5vIGNvbmlvLm8gbWVtY3B5Lm8gbWVtc2V0Lm8gbWVtbW92ZS5vIHNraXBhdG91Lm8gYXRvdS5vIFwKKwkgICBtYWxsb2MubyBmcmVlLm8gZ2V0b3B0X2xvbmcubyBnZXRzZXRzbC5vIHN0cmNoci5vIHN0cnRvdWwubyBcCisJICAgc3RybnRvdW1heC5vIGFyZ3YubyBwcmludGYubyBfX2RpdmRpMy5vIF9fdWRpdm1vZGRpNC5vCisKK1ZQQVRIID0gJChTUkMpOiQoU1JDKS8uLi9saWJmYXQ6JChTUkMpLy4uL2xpYmluc3RhbGxlcjokKFNSQykvLi4vbGliaW5zdGFsbGVyL2dldG9wdDokKE9CSikvLi4vbGliaW5zdGFsbGVyCisKK1RBUkdFVFMgPSBzeXNsaW51eC5jb20KKworYWxsOiAkKFRBUkdFVFMpCisKK3RpZHkgZGlzdDoKKwktcm0gLWYgKi5vICouaSAqLnMgKi5hIC4qLmQgKi50bXAgKi5lbGYgKi5sc3QKKworY2xlYW46IHRpZHkKKworc3BvdGxlc3M6IGNsZWFuCisJLXJtIC1mICp+ICQoVEFSR0VUUykKKworaW5zdGFsbGVyOgorCitzeXNsaW51eC5lbGY6ICQoT0JKUykgZG9zZXhlLmxkIGxpYmNvbS5hCisJJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKE9CSlMpIGxpYmNvbS5hCisKK2xpYmNvbS5hOiAkKExJQk9CSlMpCisJLXJtIC1mICRACisJJChBUikgY3EgJEAgJF4KKwkkKFJBTkxJQikgJEAKKworc3lzbGludXguY29tOiBzeXNsaW51eC5lbGYKKwkkKE9CSkNPUFkpIC1PIGJpbmFyeSAkPCAkQAorCSQoVVBYKSAtLWx6bWEgLS11bHRyYS1icnV0ZSAkQCB8fCBcCisJCSQoVVBYKSAtLXVsdHJhLWJydXRlICRAIHx8IFwKKwkJdHJ1ZQorCislLmNvbTogJS5hc20KKwkkKE5BU00pICQoTkFTTU9QVCkgLWYgYmluIC1vICRAIC1NUCAtTUQgLiRALmQgLWwgJCoubHN0ICQ8CisKK2xkbGludXgubzogbGRsaW51eC5TICQoT0JKKS8uLi9jb3JlL2xkbGludXguc3lzCisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL2Rvcy9fX2RpdmRpMy5jIGIvZG9zL19fZGl2ZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjNzc5NQotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9fX2RpdmRpMy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBhcmNoL2kzODYvbGliZ2NjL19fZGl2ZGkzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiB1aW50NjRfdCBfX3VkaXZtb2RkaTQodWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4sIHVpbnQ2NF90ICogcmVtKTsKKworaW50NjRfdCBfX2RpdmRpMyhpbnQ2NF90IG51bSwgaW50NjRfdCBkZW4pCit7CisgICAgaW50IG1pbnVzID0gMDsKKyAgICBpbnQ2NF90IHY7CisKKyAgICBpZiAobnVtIDwgMCkgeworCW51bSA9IC1udW07CisJbWludXMgPSAxOworICAgIH0KKyAgICBpZiAoZGVuIDwgMCkgeworCWRlbiA9IC1kZW47CisJbWludXMgXj0gMTsKKyAgICB9CisKKyAgICB2ID0gX191ZGl2bW9kZGk0KG51bSwgZGVuLCBOVUxMKTsKKyAgICBpZiAobWludXMpCisJdiA9IC12OworCisgICAgcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS9kb3MvX191ZGl2bW9kZGk0LmMgYi9kb3MvX191ZGl2bW9kZGk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0NzZiNwotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9fX3VkaXZtb2RkaTQuYwpAQCAtMCwwICsxLDMxIEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3VpbnQ2NF90IF9fdWRpdm1vZGRpNCh1aW50NjRfdCBudW0sIHVpbnQ2NF90IGRlbiwgdWludDY0X3QgKiByZW1fcCkKK3sKKyAgICB1aW50NjRfdCBxdW90ID0gMCwgcWJpdCA9IDE7CisKKyAgICBpZiAoZGVuID09IDApIHsKKwlhc20gdm9sYXRpbGUgKCJpbnQgJDAiKTsKKwlyZXR1cm4gMDsJCS8qIElmIHRyYXAgcmV0dXJucy4uLiAqLworICAgIH0KKworICAgIC8qIExlZnQtanVzdGlmeSBkZW5vbWluYXRvciBhbmQgY291bnQgc2hpZnQgKi8KKyAgICB3aGlsZSAoKGludDY0X3QpIGRlbiA+PSAwKSB7CisJZGVuIDw8PSAxOworCXFiaXQgPDw9IDE7CisgICAgfQorCisgICAgd2hpbGUgKHFiaXQpIHsKKwlpZiAoZGVuIDw9IG51bSkgeworCSAgICBudW0gLT0gZGVuOworCSAgICBxdW90ICs9IHFiaXQ7CisJfQorCWRlbiA+Pj0gMTsKKwlxYml0ID4+PSAxOworICAgIH0KKworICAgIGlmIChyZW1fcCkKKwkqcmVtX3AgPSBudW07CisKKyAgICByZXR1cm4gcXVvdDsKK30KZGlmZiAtLWdpdCBhL2Rvcy9hcmd2LmMgYi9kb3MvYXJndi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMjgzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb3MvYXJndi5jCkBAIC0wLDAgKzEsMTI2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYXJndi5jCisgKgorICogUGFyc2UgdGhlIE1TLURPUyBjb21tYW5kIGxpbmUgaW50byBhcmdjIGFuZCBhcmd2IChhcmdjIGlzIHJldHVybiB2YWx1ZS4pCisgKiBtZW1wdHIgcG9pbnRzIHRvIGF2YWlsYWJsZSBtZW1vcnkuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgIm15c3R1ZmYuaCIKKworI2RlZmluZSBBTElHTl9VUChwLHQpICAgICAgICgodCAqKSgoKHVpbnRwdHJfdCkocCkgKyAoc2l6ZW9mKHQpLTEpKSAmIH4oc2l6ZW9mKHQpLTEpKSkKKworZXh0ZXJuIGNoYXIgX19oZWFwX3N0YXJ0W107Cit2b2lkICpfX21lbV9lbmQgPSAmX19oZWFwX3N0YXJ0OwkvKiBHbG9iYWwgdmFyaWFibGUgZm9yIHVzZSBieSBtYWxsb2MoKSAqLworCitpbnQgX19wYXJzZV9hcmd2KGNoYXIgKioqYXJndikKK3sKKyAgICBjaGFyICptZW0gPSBfX21lbV9lbmQ7CisgICAgY29uc3QgY2hhciAqc3RyLCAqcDsKKyAgICBjaGFyICpxID0gbWVtOworICAgIGNoYXIgYywgKnI7CisgICAgY2hhciAqKmFyZzsKKyAgICBib29sIHdhc3NwYWNlOworICAgIGludCBhcmdjOworICAgIGludCBsZW47CisgICAgc2l6ZV90IG9mZnM7CisgICAgaW50IG51bGxzOworICAgIHVpbnQxNl90IG5zdHI7CisKKyAgICAvKiBGaW5kIGFuZCBjb3B5IGFyZ3ZbMF0gYWZ0ZXIgdGhlIGVudmlyb25tZW50IGJsb2NrICovCisgICAgc2V0X2ZzKF9QU1AuZW52aXJvbm1lbnQpOworICAgIG9mZnMgPSAwOworICAgIG51bGxzID0gMDsKKyAgICBkbyB7CisJaWYgKGdldF84X2ZzKG9mZnMrKykgPT0gJ1wwJykKKwkgICAgbnVsbHMrKzsKKwllbHNlCisJICAgIG51bGxzID0gMDsKKyAgICB9IHdoaWxlIChudWxscyA8IDIpOworCisgICAgbnN0ciA9IGdldF8xNl9mcyhvZmZzKTsKKyAgICBvZmZzICs9IDI7CisKKyAgICAvKiBDb3B5IHRoZSBudWxsLXRlcm1pbmF0ZWQgZmlsZW5hbWUgc3RyaW5nICovCisgICAgaWYgKG5zdHIgPj0gMSkgeworCXdoaWxlICgoYyA9IGdldF84X2ZzKG9mZnMrKykpKQorCSAgICAqcSsrID0gYzsKKyAgICB9CisgICAgKnErKyA9ICdcMCc7CisKKyAgICAvKiBOb3cgZm9yIHRoZSBjb21tYW5kIGxpbmUgdGFpbC4uLiAqLworCisgICAgbGVuID0gX1BTUC5jbWRsZW47CisgICAgc3RyID0gX1BTUC5jbWR0YWlsOworICAgIGFyZ2MgPSAxOworICAgIHdhc3NwYWNlID0gdHJ1ZTsKKworICAgIC8qIENvcHkgdGhlIGNvbW1hbmQgdGFpbCwgdHVybmluZyB3aGl0ZXNwYWNlIHJ1bnMgaW50byBudWxscyAqLworICAgIGZvciAocCA9IHN0cjs7IHArKykgeworCWlmICghbGVuIHx8ICpwIDw9ICcgJykgeworCSAgICBpZiAoIXdhc3NwYWNlKSB7CisJCXdhc3NwYWNlID0gdHJ1ZTsKKwkJKnErKyA9ICdcMCc7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAod2Fzc3BhY2UpIHsKKwkJYXJnYysrOworCQl3YXNzcGFjZSA9IGZhbHNlOworCSAgICB9CisJICAgICpxKysgPSAqcDsKKwl9CisKKwkvKiBUaGlzIHRlc3QgaXMgQUZURVIgd2UgaGF2ZSBwcm9jZXNzZWQgdGhlIGVuZCBieXRlOworCSAgIHdlIHRyZWF0IGl0IGFzIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgc28gaXQgdGVybWluYXRlcworCSAgIHRoZSBsYXN0IGFyZ3VtZW50ICovCisJaWYgKCFsZW4tLSkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTm93IGNyZWF0ZSBhcmd2ICovCisgICAgYXJnID0gQUxJR05fVVAocSwgY2hhciAqKTsKKyAgICAqYXJndiA9IGFyZzsKKyAgICAqYXJnKysgPSBtZW07CQkvKiBhcmd2WzBdICovCisKKyAgICBxLS07CQkJLyogUG9pbnQgcSB0byB0ZXJtaW5hbCBjaGFyYWN0ZXIgKi8KKyAgICBmb3IgKHIgPSBtZW07IHIgPCBxOyByKyspIHsKKwlpZiAoKnIgPT0gJ1wwJykgeworCSAgICAqYXJnKysgPSByICsgMTsKKwl9CisgICAgfQorCisgICAgKmFyZysrID0gTlVMTDsJCS8qIE51bGwgcG9pbnRlciBhdCB0aGUgZW5kICovCisgICAgX19tZW1fZW5kID0gYXJnOwkJLyogRW5kIG9mIG1lbW9yeSB3ZSB1c2VkICovCisKKyAgICByZXR1cm4gYXJnYzsKK30KZGlmZiAtLWdpdCBhL2Rvcy9hdG91LmMgYi9kb3MvYXRvdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTczNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb3MvYXRvdS5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgIm15c3R1ZmYuaCIKKwordW5zaWduZWQgaW50IGF0b3UoY29uc3QgY2hhciAqcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSA9IDA7CisgICAgd2hpbGUgKGlzZGlnaXQoKnMpKQorCWkgPSBpICogMTAgKyAoKnMrKyAtICcwJyk7CisgICAgcmV0dXJuIGk7Cit9CmRpZmYgLS1naXQgYS9kb3MvY29kZTE2LmggYi9kb3MvY29kZTE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3NjU2NQotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9jb2RlMTYuaApAQCAtMCwwICsxLDYgQEAKKy8qIE11c3QgYmUgaW5jbHVkZWQgZmlyc3Qgb2YgYWxsICovCisjaWZkZWYgX19BU1NFTUJMWV9fCisJLmNvZGUxNgorI2Vsc2UKK19fYXNtX18gKCIuY29kZTE2Z2NjIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rvcy9jb25pby5jIGIvZG9zL2NvbmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwMGU0MgotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9jb25pby5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNvbmlvLmMKKyAqCisgKiBPdXRwdXQgdG8gdGhlIHNjcmVlbgorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJteXN0dWZmLmgiCisKK2ludCBwdXRjaGFyKGludCBjaCkKK3sKKyAgICBpZiAoY2ggPT0gJ1xuJykKKwlwdXRjaGFyKCdccicpOworYXNtKCJtb3ZiICQweDAyLCUlYWggOyBpbnQgJDB4MjEiOiA6ImQiKGNoKSk7CisgICAgcmV0dXJuIGNoOworfQorCisvKiBOb3RlOiBkb2Vzbid0IHB1dCAnXG4nIGxpa2UgdGhlIHN0ZGMgdmVyc2lvbiBkb2VzICovCitpbnQgcHV0cyhjb25zdCBjaGFyICpzKQoreworICAgIGludCBjb3VudCA9IDA7CisKKyAgICB3aGlsZSAoKnMpIHsKKwlwdXRjaGFyKCpzKTsKKwljb3VudCsrOworCXMrKzsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9kb3MvY3J0MC5TIGIvZG9zL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI1MmMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9zL2NydDAuUwpAQCAtMCwwICsxLDkxIEBACisJLmNvZGUxNgorCisjaWZuZGVmIFJFR1BBUk0KKyMgZXJyb3IgIlRoaXMgZmlsZSBhc3N1bWVzIC1tcmVncGFybT0zIC1EUkVHUEFSTT0zIgorI2VuZGlmCisKKwkuc2VjdGlvbiAiLnRleHQiLCJheCIKKwkuZ2xvYmwgX3N0YXJ0CisJLnR5cGUgX3N0YXJ0LEBmdW5jdGlvbgorX3N0YXJ0OgorCSMgQWxpZ24gdGhlIHN0YWNrIGFuZCBtYWtlIHN1cmUgdGhlIGhpZ2ggaGFsZiBpcyB6ZXJvCisJYW5kbCAkMHhmZmZjLCVlc3AKKworCSMgRFMsIEVTIHBvaW50cyB0byB0aGUgUFNQIGF0IHRoaXMgcG9pbnQKKwlwdXNodyAlZXMJCSMgU2F2ZSBQU1AgcG9pbnRlcgorCW1vdncgJWNzLCVheAorCW1vdncgJWF4LCVkcworCW1vdncgJWF4LCVlcworCisJIyBDbGVhciB0aGUgLmJzcworCWNsZAorCXhvcmwgJWVheCwlZWF4CisJbW92dyAkX19ic3Nfc3RhcnQsJWRpCisJbW92dyAkX19ic3NfZW5kKzMsJWN4CisJc3VidyAlZGksJWN4CisJc2hydyAkMiwlY3gKKwlyZXAgOyBzdG9zbAorCisJIyBDb3B5IHRoZSBQU1AgaW50byBvdXIgb3duIHNlZ21lbnQKKwlwb3B3ICVmcwkJIyBGUyAtPiBQU1AKKwltb3Z3ICRfUFNQLCVkaQorCXhvcncgJXNpLCVzaQorCW1vdncgJDB4NDAsJWN4CisJZnMgOyByZXAgOyBtb3ZzbAorCisJIyBWZXJpZnkgdGhhdCB0aGlzIGlzIGEgc3VwcG9ydGFibGUgRE9TIHZlcnNpb24KKwltb3Z3ICQweDMwMDEsJWF4CisJaW50ICQweDIxCisJeGNoZ2IgJWFoLCVhbAorCW1vdncgJWF4LGRvc192ZXJzaW9uCisJY21wdyAkMHgwMzE0LCVheAkjIERPUyA+PSAzLjIwPworCWphZSAxZgkJCSMgSWYgc28sIG9rYXkKKwltb3Z3ICRiYWRfZG9zLCVkeAkjIFByaW50IGVycm9yIG1lc3NhZ2UKKwltb3ZiICQweDA5LCVhaAorCWludCAkMHgyMQorCWludCAkMHgyMAkJIyBEaWUKKworMToKKwkjIENvbXB1dGUgYXJnYyBhbmQgYXJndiAoYXNzdW1lcyBSRUdQQVJNKQorCXB1c2hsICVlYXgJCSMgTWFrZSBzcGFjZSBmb3IgYXJndgorCW1vdmwgJWVzcCwlZWF4CisJY2FsbGwgX19wYXJzZV9hcmd2CisJcHVzaGwgJWVheAkJIyBhcmdjCisKKwkjIEluaXRpYWxpemUgbWFsbG9jCisJY2FsbGwgX19pbml0X21lbW9yeV9hcmVuYQorCisJIyBOb3cgY2FsbCBtYWluCisJcG9wbCAlZWF4CQkjIGFyZ2MKKwlwb3BsICVlZHgJCSMgYXJndgorCWNhbGxsIG1haW4KKworCSMgSGVyZSAlZWF4IGlzIHRoZSBleGl0IGNvZGUsIGZhbGwgdGhyb3VnaCBpbnRvIGV4aXQKKworCS5zaXplIF9zdGFydCwuLV9zdGFydAorCisJLmdsb2JsIGV4aXQKKwkudHlwZSBleGl0LEBmdW5jdGlvbgorZXhpdDoKKwkjIEV4aXQgY29kZSBhbHJlYWR5IGluICVlYXgKKwltb3ZiICQweDRjLCVhaAkJIyBUZXJtaW5hdGUgcHJvZ3JhbQorCWludCAkMHgyMQorMToJaGx0CisJam1wIDFiCisJLnNpemUgZXhpdCwuLWV4aXQKKworCS5zZWN0aW9uICIucm9kYXRhIiwiYSIKK2JhZF9kb3M6CisJLmFzY2lpICJVbnN1cHBvcnRlZCBET1MgdmVyc2lvblxyXG4kIgorCS5zaXplIGJhZF9kb3MsLi1iYWRfZG9zCisKKwkuc2VjdGlvbiAiLmJzcyIsImF3IgorCS5iYWxpZ24gMTYKKwkuZ2xvYmwgX1BTUAorX1BTUDoKKwkuc3BhY2UgMjU2CisJLnNpemUgX1BTUCwgLi1fUFNQCisKKwkvKiBQdXJlbHkgZm9yIHNhbml0eSAqLworCS5zZWN0aW9uICIubnVsbCIsImEiCisJLmxvbmcgMCwwLDAsMApkaWZmIC0tZ2l0IGEvZG9zL2N0eXBlLmggYi9kb3MvY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQwMGMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9zL2N0eXBlLmgKQEAgLTAsMCArMSwzIEBACitzdGF0aWMgaW50IGlzc3BhY2UoaW50IGMpIHsKKyAgcmV0dXJuIChjID09ICcgJyk7Cit9CmRpZmYgLS1naXQgYS9kb3MvZG9zZXhlLmxkIGIvZG9zL2Rvc2V4ZS5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNmNzNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9zL2Rvc2V4ZS5sZApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpbmtlciBzY3JpcHQgZm9yIGFuIE1TLURPUyBFWEUgYmluYXJ5OyB0aGlzIGhhcmQtY29kZXMgYSBzaW1wbGUKKyAqIE1aIGhlYWRlciB3aXRob3V0IHJlbG9jYXRpb25zLgorICoKKyAqIEZvciBkb2N1bWVudGF0aW9uIG9uIHRoZSBNUy1ET1MgTVogRVhFIGZvcm1hdCwgc2VlOgorICogaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvZXhlLworICovCisKKworLyogU2NyaXB0IGZvciAteiBjb21icmVsb2M6IGNvbWJpbmUgYW5kIHNvcnQgcmVsb2Mgc2VjdGlvbnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VYVEVSTihfc3RhcnQpCitFTlRSWShfc3RhcnQpCisKK1NFQ1RJT05TCit7CisJLiA9IDA7CisJLyogRVhFIGhlYWRlciwgZnJvbSBoZWFkZXIuUyAqLworCS5oZWFkZXIgOiB7CisJCSooLmhlYWRlcikKKwl9ID0wCisKKwkuID0gQUxJR04oMTYpOworCV9faGVhZGVyX3NpemUgPSAuOworCV9fcGF5bG9hZF9sbWEgPSAuOworCisJLiA9IDB4MTAwMDAwMDAwIC0gc3lzbGludXhfc2l6ZTsKKwkucGF5bG9hZCA6IEFUIChfX3BheWxvYWRfbG1hKSB7CisJCSBfX3BheWxvYWRfc3RhcnQgPSAuOworCQkgKigucGF5bG9hZCkKKwkJIF9fcGF5bG9hZF9lbmQgPSAuOworCX0KKwlfX3BheWxvYWRfbGVuID0gQUJTT0xVVEUoX19wYXlsb2FkX2VuZCkgLSBBQlNPTFVURShfX3BheWxvYWRfc3RhcnQpOworCV9fcGF5bG9hZF9kd29yZHMgPSBfX3BheWxvYWRfbGVuID4+IDI7CisKKwlfX2Rncm91cF9sbWEgPSBfX3BheWxvYWRfbG1hICsgc3lzbGludXhfc2l6ZTsKKwlfX3BheWxvYWRfc3NlZyA9IChfX3BheWxvYWRfbG1hIC0gX19kZ3JvdXBfbG1hKSA+PiA0OworCV9leGVfdGV4dF9zZWcgID0gKF9fZGdyb3VwX2xtYSAtIF9faGVhZGVyX3NpemUpID4+IDQ7CisKKy8qCisgKglfX2Fzc2VydDEgPSBBU1NFUlQoKF9fcGF5bG9hZF9sZW4gPT0gc3lzbGludXhfbGRsaW51eF9zaXplKSwKKyAqCSJzeXNsaW51eF9zaXplIG11c3QgZXF1YWwgdGhlIHNpemUgb2YgLnBheWxvYWQiKTsKKyAqLworCS4gPSAwOworCV9fbnVsbCA9IC47CisJLm51bGwgOiBBVChfX2Rncm91cF9sbWEpIHsKKwkJKigubnVsbCkKKwl9CisKKwkuID0gQUxJR04oMTYpOworCV9fdGV4dF92bWEgPSAuOworCS50ZXh0IDogQVQgKF9fdGV4dF92bWEgKyBfX2Rncm91cF9sbWEpIHsKKwkJKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorCQkqKC5nbnUud2FybmluZykKKwl9ID0weDkwOTA5MDkwCisJX2V0ZXh0ID0gLjsKKworCS4gPSBBTElHTigxNik7CisJX19yb2RhdGFfdm1hID0gLjsKKwkucm9kYXRhIDogQVQgKF9fcm9kYXRhX3ZtYSArIF9fZGdyb3VwX2xtYSkgeworCQkqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKQorCX0KKworCS8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEF2b2lkIG1peGluZyBjb2RlIGFuZAorCSAgIGRhdGEgd2l0aGluIHNhbWUgMTI4LWJ5dGUgY2h1bmsuICovCisJLiA9IEFMSUdOKDEyOCk7CisJX19kYXRhX3ZtYSA9IC47CisJLmRhdGEgOiBBVCAoX19kYXRhX3ZtYSArIF9fZGdyb3VwX2xtYSkgeworCQkqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisJCVNPUlQoQ09OU1RSVUNUT1JTKQorCX0KKwkuZGF0YTEgOiB7ICooLmRhdGExKSB9CisJX2VkYXRhID0gLjsKKworCV9leGVfZWRhdGFfbG93ICAgID0gKChfZWRhdGEgKyBfX2Rncm91cF9sbWEpICYgNTExKTsKKwlfZXhlX2VkYXRhX2Jsb2NrcyA9ICgoX2VkYXRhICsgX19kZ3JvdXBfbG1hKSArIDUxMSkgPj4gOTsKKworCS5ic3MgKE5PTE9BRCkgOiB7CisJCV9fYnNzX3N0YXJ0ID0gLjsKKwkJKiguZHluYnNzKQorCQkqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorCQkqKENPTU1PTikKKwkJX19ic3NfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMTYpOworCS5oZWFwIChOT0xPQUQpIDogeworCQlfX2hlYXBfc3RhcnQgPSAuOworCQkqKC5oZWFwKQorCQlfX2hlYXBfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMTYpOworCS5zdGFjayAoTk9MT0FEKSA6IHsKKwkJX19zdGFja19zdGFydCA9IC47CisJCSooLnN0YWNrKQorCQlfX3N0YWNrX2VuZCA9IC47CisJfQorCS4gPSBBTElHTigxNik7CisJX2VuZCA9IC47CisKKwlfZXhlX2Jzc19wYXJhcyA9IChfZW5kIC0gX19ic3Nfc3RhcnQpID4+IDQ7CisKKworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgfQorfQpkaWZmIC0tZ2l0IGEvZG9zL2Vycm5vLmggYi9kb3MvZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTczM2JmCi0tLSAvZGV2L251bGwKKysrIGIvZG9zL2Vycm5vLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBFUlJOT19ICisjZGVmaW5lIEVSUk5PX0gKKworI2RlZmluZQlFUEVSTQkJIDEJLyogT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgKi8KKyNkZWZpbmUJRU5PRU5UCQkgMgkvKiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICovCisjZGVmaW5lCUVTUkNICQkgMwkvKiBObyBzdWNoIHByb2Nlc3MgKi8KKyNkZWZpbmUJRUlOVFIJCSA0CS8qIEludGVycnVwdGVkIHN5c3RlbSBjYWxsICovCisjZGVmaW5lCUVJTwkJIDUJLyogSS9PIGVycm9yICovCisjZGVmaW5lCUVOWElPCQkgNgkvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzICovCisjZGVmaW5lCUUyQklHCQkgNwkvKiBBcmd1bWVudCBsaXN0IHRvbyBsb25nICovCisjZGVmaW5lCUVOT0VYRUMJCSA4CS8qIEV4ZWMgZm9ybWF0IGVycm9yICovCisjZGVmaW5lCUVCQURGCQkgOQkvKiBCYWQgZmlsZSBudW1iZXIgKi8KKyNkZWZpbmUJRUNISUxECQkxMAkvKiBObyBjaGlsZCBwcm9jZXNzZXMgKi8KKyNkZWZpbmUJRUFHQUlOCQkxMQkvKiBUcnkgYWdhaW4gKi8KKyNkZWZpbmUJRU5PTUVNCQkxMgkvKiBPdXQgb2YgbWVtb3J5ICovCisjZGVmaW5lCUVBQ0NFUwkJMTMJLyogUGVybWlzc2lvbiBkZW5pZWQgKi8KKyNkZWZpbmUJRUZBVUxUCQkxNAkvKiBCYWQgYWRkcmVzcyAqLworI2RlZmluZQlFTk9UQkxLCQkxNQkvKiBCbG9jayBkZXZpY2UgcmVxdWlyZWQgKi8KKyNkZWZpbmUJRUJVU1kJCTE2CS8qIERldmljZSBvciByZXNvdXJjZSBidXN5ICovCisjZGVmaW5lCUVFWElTVAkJMTcJLyogRmlsZSBleGlzdHMgKi8KKyNkZWZpbmUJRVhERVYJCTE4CS8qIENyb3NzLWRldmljZSBsaW5rICovCisjZGVmaW5lCUVOT0RFVgkJMTkJLyogTm8gc3VjaCBkZXZpY2UgKi8KKyNkZWZpbmUJRU5PVERJUgkJMjAJLyogTm90IGEgZGlyZWN0b3J5ICovCisjZGVmaW5lCUVJU0RJUgkJMjEJLyogSXMgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRUlOVkFMCQkyMgkvKiBJbnZhbGlkIGFyZ3VtZW50ICovCisjZGVmaW5lCUVORklMRQkJMjMJLyogRmlsZSB0YWJsZSBvdmVyZmxvdyAqLworI2RlZmluZQlFTUZJTEUJCTI0CS8qIFRvbyBtYW55IG9wZW4gZmlsZXMgKi8KKyNkZWZpbmUJRU5PVFRZCQkyNQkvKiBOb3QgYSB0eXBld3JpdGVyICovCisjZGVmaW5lCUVUWFRCU1kJCTI2CS8qIFRleHQgZmlsZSBidXN5ICovCisjZGVmaW5lCUVGQklHCQkyNwkvKiBGaWxlIHRvbyBsYXJnZSAqLworI2RlZmluZQlFTk9TUEMJCTI4CS8qIE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlICovCisjZGVmaW5lCUVTUElQRQkJMjkJLyogSWxsZWdhbCBzZWVrICovCisjZGVmaW5lCUVST0ZTCQkzMAkvKiBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUJRU1MSU5LCQkzMQkvKiBUb28gbWFueSBsaW5rcyAqLworI2RlZmluZQlFUElQRQkJMzIJLyogQnJva2VuIHBpcGUgKi8KKyNkZWZpbmUJRURPTQkJMzMJLyogTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmMgKi8KKyNkZWZpbmUJRVJBTkdFCQkzNAkvKiBNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSAqLworCitpbnQgZXJybm87Cit2b2lkIHBlcnJvcihjb25zdCBjaGFyICopOworCisjZW5kaWYgLyogRVJSTk9fSCAqLwpkaWZmIC0tZ2l0IGEvZG9zL2ZyZWUuYyBiL2Rvcy9mcmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiNzJlZgotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9mcmVlLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIGZyZWUuYworICoKKyAqIFZlcnkgc2ltcGxlIGxpbmtlZC1saXN0IGJhc2VkIG1hbGxvYygpL2ZyZWUoKS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibWFsbG9jLmgiCisKK3N0YXRpYyBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKl9fZnJlZV9ibG9jayhzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFoKQoreworICAgIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqcGFoLCAqbmFoOworCisgICAgcGFoID0gYWgtPmEucHJldjsKKyAgICBuYWggPSBhaC0+YS5uZXh0OworICAgIGlmIChwYWgtPmEudHlwZSA9PSBBUkVOQV9UWVBFX0ZSRUUgJiYKKwkoY2hhciAqKXBhaCArIHBhaC0+YS5zaXplID09IChjaGFyICopYWgpIHsKKwkvKiBDb2FsZXNjZSBpbnRvIHRoZSBwcmV2aW91cyBibG9jayAqLworCXBhaC0+YS5zaXplICs9IGFoLT5hLnNpemU7CisJcGFoLT5hLm5leHQgPSBuYWg7CisJbmFoLT5hLnByZXYgPSBwYWg7CisKKyNpZmRlZiBERUJVR19NQUxMT0MKKwlhaC0+YS50eXBlID0gQVJFTkFfVFlQRV9ERUFEOworI2VuZGlmCisKKwlhaCA9IHBhaDsKKwlwYWggPSBhaC0+YS5wcmV2OworICAgIH0gZWxzZSB7CisJLyogTmVlZCB0byBhZGQgdGhpcyBibG9jayB0byB0aGUgZnJlZSBjaGFpbiAqLworCWFoLT5hLnR5cGUgPSBBUkVOQV9UWVBFX0ZSRUU7CisKKwlhaC0+bmV4dF9mcmVlID0gX19tYWxsb2NfaGVhZC5uZXh0X2ZyZWU7CisJYWgtPnByZXZfZnJlZSA9ICZfX21hbGxvY19oZWFkOworCV9fbWFsbG9jX2hlYWQubmV4dF9mcmVlID0gYWg7CisJYWgtPm5leHRfZnJlZS0+cHJldl9mcmVlID0gYWg7CisgICAgfQorCisgICAgLyogSW4gZWl0aGVyIG9mIHRoZSBwcmV2aW91cyBjYXNlcywgd2UgbWlnaHQgYmUgYWJsZSB0byBtZXJnZQorICAgICAgIHdpdGggdGhlIHN1YnNlcXVlbnQgYmxvY2suLi4gKi8KKyAgICBpZiAobmFoLT5hLnR5cGUgPT0gQVJFTkFfVFlQRV9GUkVFICYmCisJKGNoYXIgKilhaCArIGFoLT5hLnNpemUgPT0gKGNoYXIgKiluYWgpIHsKKwlhaC0+YS5zaXplICs9IG5haC0+YS5zaXplOworCisJLyogUmVtb3ZlIHRoZSBvbGQgYmxvY2sgZnJvbSB0aGUgY2hhaW5zICovCisJbmFoLT5uZXh0X2ZyZWUtPnByZXZfZnJlZSA9IG5haC0+cHJldl9mcmVlOworCW5haC0+cHJldl9mcmVlLT5uZXh0X2ZyZWUgPSBuYWgtPm5leHRfZnJlZTsKKwlhaC0+YS5uZXh0ID0gbmFoLT5hLm5leHQ7CisJbmFoLT5hLm5leHQtPmEucHJldiA9IGFoOworCisjaWZkZWYgREVCVUdfTUFMTE9DCisJbmFoLT5hLnR5cGUgPSBBUkVOQV9UWVBFX0RFQUQ7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKiBSZXR1cm4gdGhlIGJsb2NrIHRoYXQgY29udGFpbnMgdGhlIGNhbGxlZCBibG9jayAqLworICAgIHJldHVybiBhaDsKK30KKwordm9pZCBmcmVlKHZvaWQgKnB0cikKK3sKKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFoOworCisgICAgaWYgKCFwdHIpCisJcmV0dXJuOworCisgICAgYWggPSAoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICopCisJKChzdHJ1Y3QgYXJlbmFfaGVhZGVyICopcHRyIC0gMSk7CisKKyAgICBfX2ZyZWVfYmxvY2soYWgpOworCisgICAgLyogSGVyZSB3ZSBjb3VsZCBpbnNlcnQgY29kZSB0byByZXR1cm4gbWVtb3J5IHRvIHRoZSBzeXN0ZW0uICovCit9CmRpZmYgLS1naXQgYS9kb3MvZ2V0c2V0c2wuYyBiL2Rvcy9nZXRzZXRzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTZhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb3MvZ2V0c2V0c2wuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBNUy1ET1MgZGVyaXZhdGl2ZTogc3lzbGludXhfbGRsaW51eAorICogaXMgYSAiZmFyIiBvYmplY3QuLi4KKyAqLworCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNTAwCS8qIFJlcXVpcmVkIG9uIGdsaWJjIDIueCAqLworI2RlZmluZSBfQlNEX1NPVVJDRQorLyogZ2xpYmMgMi4yMCBkZXByZWNhdGVzIF9CU0RfU09VUkNFIGluIGZhdm91ciBvZiBfREVGQVVMVF9TT1VSQ0UgKi8KKyNkZWZpbmUgX0RFRkFVTFRfU09VUkNFIDEKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAic3lzbHhpbnQuaCIKKyNpbmNsdWRlICJteXN0dWZmLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc2V0X2ZzX3NsKGNvbnN0IHZvaWQgKnApCit7CisgICAgdWludDE2X3Qgc2VnOworCisgICAgc2VnID0gZHMoKSArICgoc2l6ZV90KSBwID4+IDQpOworICAgIHNldF9mcyhzZWcpOworICAgIHJldHVybiAodm9pZCAqKSgoc2l6ZV90KSBwICYgMHhmKTsKK30KKworI2lmIDAJCQkJLyogdW51c2VkICovCit1aW50OF90IGdldF84X3NsKGNvbnN0IHVpbnQ4X3QgKiBwKQoreworICAgIHVpbnQ4X3QgdjsKKworICAgIHAgPSBzZXRfZnNfc2wocCk7CisgICAgYXNtIHZvbGF0aWxlKCJtb3ZiICUlZnM6JTEsJTAiOiI9cSIgKHYpOiJtIigqcCkpOworICAgIHJldHVybiB2OworfQorI2VuZGlmCisKK3VpbnQxNl90IGdldF8xNl9zbChjb25zdCB1aW50MTZfdCAqIHApCit7CisgICAgdWludDE2X3QgdjsKKworICAgIHAgPSBzZXRfZnNfc2wocCk7CisgICAgYXNtIHZvbGF0aWxlKCJtb3Z3ICUlZnM6JTEsJTAiOiI9ciIgKHYpOiJtIigqcCkpOworICAgIHJldHVybiB2OworfQorCit1aW50MzJfdCBnZXRfMzJfc2woY29uc3QgdWludDMyX3QgKiBwKQoreworICAgIHVpbnQzMl90IHY7CisKKyAgICBwID0gc2V0X2ZzX3NsKHApOworICAgIGFzbSB2b2xhdGlsZSgibW92bCAlJWZzOiUxLCUwIjoiPXIiICh2KToibSIoKnApKTsKKyAgICByZXR1cm4gdjsKK30KKworI2lmIDAJCQkJLyogdW51c2VkICovCit1aW50NjRfdCBnZXRfNjRfc2woY29uc3QgdWludDY0X3QgKiBwKQoreworICAgIHVpbnQzMl90IHYwLCB2MTsKKyAgICBjb25zdCB1aW50MzJfdCAqcHAgPSAoY29uc3QgdWludDMyX3QgKilzZXRfZnNfc2wocCk7CisKKyAgICBhc20gdm9sYXRpbGUoIm1vdmwgJSVmczolMSwlMCIgOiAiPXIiICh2MCkgOiAibSIgKHBwWzBdKSk7CisgICAgYXNtIHZvbGF0aWxlKCJtb3ZsICUlZnM6JTEsJTAiIDogIj1yIiAodjEpIDogIm0iIChwcFsxXSkpOworICAgIHJldHVybiB2MCArICgodWludDY0X3QpdjEgPDwgMzIpOworfQorI2VuZGlmCisKKyNpZiAwCQkJCS8qIHVudXNlZCAqLwordm9pZCBzZXRfOF9zbCh1aW50OF90ICogcCwgdWludDhfdCB2KQoreworICAgIHAgPSBzZXRfZnNfc2wocCk7CisgICAgYXNtIHZvbGF0aWxlKCJtb3ZiICUxLCUlZnM6JTAiOiI9bSIgKCpwKToicWkiKHYpKTsKK30KKyNlbmRpZgorCit2b2lkIHNldF8xNl9zbCh1aW50MTZfdCAqIHAsIHVpbnQxNl90IHYpCit7CisgICAgcCA9IHNldF9mc19zbChwKTsKKyAgICBhc20gdm9sYXRpbGUoIm1vdncgJTEsJSVmczolMCI6Ij1tIiAoKnApOiJyaSIodikpOworfQorCit2b2lkIHNldF8zMl9zbCh1aW50MzJfdCAqIHAsIHVpbnQzMl90IHYpCit7CisgICAgcCA9IHNldF9mc19zbChwKTsKKyAgICBhc20gdm9sYXRpbGUoIm1vdmwgJTEsJSVmczolMCI6Ij1tIiAoKnApOiJyaSIodikpOworfQorCit2b2lkIHNldF82NF9zbCh1aW50NjRfdCAqIHAsIHVpbnQ2NF90IHYpCit7CisgICAgdWludDMyX3QgKnBwID0gKHVpbnQzMl90ICopc2V0X2ZzX3NsKHApOworICAgIGFzbSB2b2xhdGlsZSgibW92bCAlMSwlJWZzOiUwIiA6ICI9bSIgKHBwWzBdKSA6ICJyaSIoKHVpbnQzMl90KXYpKTsKKyAgICBhc20gdm9sYXRpbGUoIm1vdmwgJTEsJSVmczolMCIgOiAiPW0iIChwcFsxXSkgOiAicmkiKCh1aW50MzJfdCkodiA+PiAzMikpKTsKK30KKwordm9pZCBtZW1jcHlfdG9fc2wodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCit7CisgICAgdWludDE2X3Qgc2VnOworICAgIHVpbnQxNl90IG9mZjsKKworICAgIHNlZyA9IGRzKCkgKyAoKHNpemVfdClkc3QgPj4gNCk7CisgICAgb2ZmID0gKHNpemVfdClkc3QgJiAxNTsKKworICAgIGFzbSB2b2xhdGlsZSgicHVzaHcgJSVlcyA7ICIKKwkJICJtb3Z3ICUzLCUlZXMgOyAiCisJCSAicmVwIDsgbW92c2IgOyAiCisJCSAicG9wdyAlJWVzIgorCQkgOiAiK0QiIChvZmYpLCAiK1MiIChzcmMpLCAiK2MiIChsZW4pCisJCSA6ICJyIiAoc2VnKQorCQkgOiAibWVtb3J5Iik7Cit9CisKK3ZvaWQgbWVtY3B5X2Zyb21fc2wodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCit7CisgICAgdWludDE2X3Qgc2VnOworICAgIHVpbnQxNl90IG9mZjsKKworICAgIHNlZyA9IGRzKCkgKyAoKHNpemVfdClzcmMgPj4gNCk7CisgICAgb2ZmID0gKHNpemVfdClzcmMgJiAxNTsKKworICAgIGFzbSB2b2xhdGlsZSgicHVzaHcgJSVkcyA7ICIKKwkJICJtb3Z3ICUzLCUlZHMgOyAiCisJCSAicmVwIDsgbW92c2IgOyAiCisJCSAicG9wdyAlJWRzIgorCQkgOiAiK0QiIChkc3QpLCAiK1MiIChvZmYpLCAiK2MiIChsZW4pCisJCSA6ICJyIiAoc2VnKQorCQkgOiAibWVtb3J5Iik7Cit9CisKK3ZvaWQgbWVtc2V0X3NsKHZvaWQgKmRzdCwgaW50IGMsIHNpemVfdCBsZW4pCit7CisgICAgdWludDE2X3Qgc2VnOworICAgIHVpbnQxNl90IG9mZjsKKworICAgIHNlZyA9IGRzKCkgKyAoKHNpemVfdClkc3QgPj4gNCk7CisgICAgb2ZmID0gKHNpemVfdClkc3QgJiAxNTsKKworICAgIGFzbSB2b2xhdGlsZSgicHVzaHcgJSVlcyA7ICIKKwkJICJtb3Z3ICUzLCUlZXMgOyAiCisJCSAicmVwIDsgc3Rvc2IgOyAiCisJCSAicG9wdyAlJWVzIgorCQkgOiAiK0QiIChvZmYpLCAiK2MiIChsZW4pCisJCSA6ICJhIiAoYyksICJyIiAoc2VnKQorCQkgOiAibWVtb3J5Iik7Cit9CmRpZmYgLS1naXQgYS9kb3MvaGVhZGVyLlMgYi9kb3MvaGVhZGVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2NzA3OAotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9oZWFkZXIuUwpAQCAtMCwwICsxLDU0IEBACitTVEFDS19TSVpFCT0gODE5MgorSEVBUF9TSVpFCT0gMTYzODQKKworCQkuc2VjdGlvbiAiLmhlYWRlciIsImEiCisJCS5iYWxpZ24JNTEyCitfX2hlYWRlcl9zdGFydDoKKwkJLnNob3J0CTB4NWE0ZAorCQkuc2hvcnQJX2V4ZV9lZGF0YV9sb3cKKwkJLnNob3J0CV9leGVfZWRhdGFfYmxvY2tzCisJCS5zaG9ydAkwCQkvKiBSZWxvY2F0aW9uIGNvdW50ICovCisJCS5zaG9ydAkoX19oZWFkZXJfZW5kIC0gX19oZWFkZXJfc3RhcnQpID4+IDQKKwkJLnNob3J0CV9leGVfYnNzX3BhcmFzCisJCS5zaG9ydAlfZXhlX2Jzc19wYXJhcworCQkuc2hvcnQJX2V4ZV90ZXh0X3NlZwkvKiBTUCAqLworCQkuc2hvcnQJX19zdGFja19lbmQKKwkJLnNob3J0CTAJCS8qIENoZWNrc3VtICovCisJCS5zaG9ydAlfc3RhcnQKKwkJLnNob3J0CV9leGVfdGV4dF9zZWcJLyogQ1MgKi8KKwkJLnNob3J0CV9fcmVsb2MKKwkJLnNob3J0CTAJCS8qIE92ZXJsYXkgbnVtYmVyICovCisvKgorICogRG9uJ3QgcHV0IHRoZXNlIGZpZWxkcyBpbiB1bmxlc3Mgd2UgYWN0dWFsbHkgaGF2ZSBhbiBORSBvciBQRSBpbWFnZTsKKyAqIHNvbWUgdG9vbHMgbWlnaHQgZ2V0IGNvbmZ1c2VkIGFuZCBhc3N1bWUgX19yZWxvYyA9IDY0IGF1dG9tYXRpY2FsbHkKKyAqIG1lYW5zIGFuIE5FL1BFIGltYWdlIG9yIGEgV2luZG93cyBpbWFnZSBvZiBzb21lIHNvcnQuCisgKi8KKyNpZiAwCisJCS5zaG9ydAkwCQkvKiBVbmtub3duL3BhZD8gKi8KKwkJLnNob3J0CTAJCS8qIFVua25vd24vcGFkPyAqLworCQkuc2hvcnQJMAkJLyogVW5rbm93bi9wYWQ/ICovCisJCS5zaG9ydAkwCQkvKiBVbmtub3duL3BhZD8gKi8KKwkJLnNob3J0CTAJCS8qIFVua25vd24vcGFkPyAqLworCQkuc2hvcnQJMAkJLyogVW5rbm93bi9wYWQ/ICovCisJCS5zaG9ydAkwCQkvKiBVbmtub3duL3BhZD8gKi8KKwkJLnNob3J0CTAJCS8qIFVua25vd24vcGFkPyAqLworCQkuc2hvcnQJMAkJLyogVW5rbm93bi9wYWQ/ICovCisJCS5zaG9ydAkwCQkvKiBVbmtub3duL3BhZD8gKi8KKwkJLnNob3J0CTAJCS8qIFVua25vd24vcGFkPyAqLworCQkuc2hvcnQJMAkJLyogVW5rbm93bi9wYWQ/ICovCisJCS5zaG9ydAkwCQkvKiBVbmtub3duL3BhZD8gKi8KKwkJLnNob3J0CTAJCS8qIFVua25vd24vcGFkPyAqLworCQkuc2hvcnQJMAkJLyogVW5rbm93bi9wYWQ/ICovCisJCS5zaG9ydAkwCQkvKiBVbmtub3duL3BhZD8gKi8KKwkJLmxvbmcJMAkJLyogUG9pbnRlciB0byBXaW5kb3dzIFBFIGhlYWRlciAqLworI2VuZGlmCisJCS5iYWxpZ24gNAorX19yZWxvYzoKKwkJLmJhbGlnbgk1MTIKK19faGVhZGVyX2VuZDoKKworCQkuc2VjdGlvbiAiLmhlYXAiLCJhdyIKKwkJLnNwYWNlCUhFQVBfU0laRQorCisJCS5zZWN0aW9uICIuc3RhY2siLCJhdyIKKwkJLnNwYWNlCVNUQUNLX1NJWkUKZGlmZiAtLWdpdCBhL2Rvcy9pbnQyNTI2LlMgYi9kb3MvaW50MjUyNi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTYzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb3MvaW50MjUyNi5TCkBAIC0wLDAgKzEsNzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk4LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGludCAweDI1IGFuZCAweDI2IGRpcmVjdCBzZWN0b3IgYWNjZXNzCisgKgorICogVXNlIGFzc2VtYmx5IHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGVzZSBzeXN0ZW0gY2FsbHMsIHNpbmNlIHVubGlrZQorICogaW50IDB4MjEgY2FsbHMgdGhleSBhcmUgImRpcnR5IiBhbmQgY2FuIGRlc3Ryb3kgdW5yZWxhdGVkIHJlZ2lzdGVycy4KKyAqCisgKiBOT1RFOiB0aGVzZSBhbGwgYXNzdW1lIHRoZSBkYXRhIGJ1ZmZlciBpcyBpbiB0aGUgZGF0YSBzZWdtZW50LCBpLmUuCisgKiAlZHMgPT0gJWVzID09IGRpby5idWZzZWcuCisgKgorICogVXNhZ2U6IGludCBpbnQyNV9yZWFkX3NlY3Rvcihkcml2ZSwgZGlvKQorICogVXNhZ2U6IGludCBpbnQyNl93cml0ZV9zZWN0b3IoZHJpdmUsIGRpbykKKyAqLworCisJLmNvZGUxNmdjYworCS50ZXh0CisKKwkuZ2xvYmwJaW50MjVfcmVhZF9zZWN0b3IKKwkudHlwZQlpbnQyNV9yZWFkX3NlY3RvciwgQGZ1bmN0aW9uCitpbnQyNV9yZWFkX3NlY3RvcjoKKwlwdXNobAklZWJwCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJ4CisKKwlkZWN3CSVheAkJLyogQUwgPSBkcml2ZSBudW1iZXIgKDAgPSBBOikgKi8KKwltb3Z3CSVkeCwgJWJ4CS8qIEJYID0gZGlvIHN0cnVjdHVyZSAqLworCW1vdncJNiglYngpLCAlZHgJLyogRFggPSBkYXRhIGJ1ZmZlciAqLworCW1vdncJJC0xLCAlY3gKKwlpbnQJJDB4MjUKKwlqYwkxZgorCXhvcncJJWF4LCAlYXgJLyogRXJyb3IgY29kZTogMCA9IG5vIGVycm9yICovCisxOgorCXBvcGZ3CisJbW92endsCSVheCwgJWVheAorCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXBvcGwJJWVicAorCXJldGwKKwkuc2l6ZQlpbnQyNV9yZWFkX3NlY3RvciwgLi1pbnQyNV9yZWFkX3NlY3RvcgorCisJLmdsb2JsCWludDI2X3dyaXRlX3NlY3RvcgorCS50eXBlCWludDI2X3dyaXRlX3NlY3RvciwgQGZ1bmN0aW9uCitpbnQyNl93cml0ZV9zZWN0b3I6CisJcHVzaGwJJWVicAorCXB1c2hsCSVlZGkKKwlwdXNobAklZXNpCisJcHVzaGwJJWVieAorCisJZGVjdwklYXgJCS8qIEFMID0gZHJpdmUgbnVtYmVyICgwID0gQTopICovCisJbW92dwklZHgsICVieAkvKiBCWCA9IGRpbyBzdHJ1Y3R1cmUgKi8KKwltb3Z3CTYoJWJ4KSwgJWR4CS8qIERYID0gZGF0YSBidWZmZXIgKi8KKwltb3Z3CSQtMSwgJWN4CisJaW50CSQweDI2CisJamMJMWYKKwl4b3J3CSVheCwgJWF4CS8qIEVycm9yIGNvZGU6IDAgPSBubyBlcnJvciAqLworMToKKwlwb3BmdworCW1vdnp3bAklYXgsICVlYXgKKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlwb3BsCSVlZGkKKwlwb3BsCSVlYnAKKwlyZXRsCisJLnNpemUJaW50MjZfd3JpdGVfc2VjdG9yLCAuLWludDI2X3dyaXRlX3NlY3RvcgpkaWZmIC0tZ2l0IGEvZG9zL2ludHR5cGVzLmggYi9kb3MvaW50dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYxMThiCi0tLSAvZGV2L251bGwKKysrIGIvZG9zL2ludHR5cGVzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgpkaWZmIC0tZ2l0IGEvZG9zL2xkbGludXguUyBiL2Rvcy9sZGxpbnV4LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0NWJkNwotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9sZGxpbnV4LlMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIFdyYXAgbGRsaW51eC5zeXMgYW5kIGxkbGludXguYzMyOyB0aGlzIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIERPUy4KKyAqLworCisJLnNlY3Rpb24gIi5wYXlsb2FkIiwiYXciCisJLmJhbGlnbgkxNgorCS5nbG9ibAlzeXNsaW51eF9sZGxpbnV4LCBzeXNsaW51eF9sZGxpbnV4X3NpemUKK3N5c2xpbnV4X2xkbGludXg6CisJLmluY2JpbiAiLi4vY29yZS9sZGxpbnV4LnN5cyIKKwkuc3BhY2UgKChzeXNsaW51eF9sZGxpbnV4IC0gLikgJiA1MTEpCitzeXNsaW51eF9sZGxpbnV4X3NpemUJPSAuIC0gc3lzbGludXhfbGRsaW51eAorCS5zaXplCXN5c2xpbnV4X2xkbGludXgsIC4tc3lzbGludXhfbGRsaW51eAorCS5nbG9ibAlzeXNsaW51eF9sZGxpbnV4YzMyLCBzeXNsaW51eF9sZGxpbnV4YzMyX3NpemUKK3N5c2xpbnV4X2xkbGludXhjMzI6CisJLmluY2JpbiAiLi4vY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguYzMyIgorCS5zcGFjZSAoKHN5c2xpbnV4X2xkbGludXhjMzIgLSAuKSAmIDUxMSkKK3N5c2xpbnV4X2xkbGludXhjMzJfc2l6ZSA9IC4gLSBzeXNsaW51eF9sZGxpbnV4YzMyCisJLnNpemUJc3lzbGludXhfbGRsaW51eGMzMiwgLi1zeXNsaW51eF9sZGxpbnV4YzMyCisJLmdsb2JsIHN5c2xpbnV4X3NpemUKK3N5c2xpbnV4X3NpemUJPSAuIC0gc3lzbGludXhfbGRsaW51eAorCisJLnNlY3Rpb24gIi5yb2RhdGEiLCJhIgorCS5iYWxpZ24JNAorCS5nbG9ibAlzeXNsaW51eF9sZGxpbnV4X2xlbgorc3lzbGludXhfbGRsaW51eF9sZW46CisJLmxvbmcJc3lzbGludXhfbGRsaW51eF9zaXplCisJLnNpemUJc3lzbGludXhfbGRsaW51eF9sZW4sIC4tc3lzbGludXhfbGRsaW51eF9sZW4KKwkuZ2xvYmwJc3lzbGludXhfbGRsaW51eGMzMl9sZW4KK3N5c2xpbnV4X2xkbGludXhjMzJfbGVuOgorCS5sb25nCXN5c2xpbnV4X2xkbGludXhjMzJfc2l6ZQorCS5zaXplCXN5c2xpbnV4X2xkbGludXhjMzJfbGVuLCAuLXN5c2xpbnV4X2xkbGludXhjMzJfbGVuCmRpZmYgLS1naXQgYS9kb3MvbWFsbG9jLmMgYi9kb3MvbWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjNzhjNAotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9tYWxsb2MuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIG1hbGxvYy5jCisgKgorICogVmVyeSBzaW1wbGUgbGlua2VkLWxpc3QgYmFzZWQgbWFsbG9jKCkvZnJlZSgpLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJtYWxsb2MuaCIKKworc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyIF9fbWFsbG9jX2hlYWQgPSB7CisgICAgeworICAgICBBUkVOQV9UWVBFX0hFQUQsCisgICAgIDAsCisgICAgICZfX21hbGxvY19oZWFkLAorICAgICAmX19tYWxsb2NfaGVhZCwKKyAgICAgfSwKKyAgICAmX19tYWxsb2NfaGVhZCwKKyAgICAmX19tYWxsb2NfaGVhZAorfTsKKworZXh0ZXJuIHZvaWQgKl9fbWVtX2VuZDsJCS8qIEluIGFyZ3YuYyAqLworCit2b2lkIF9faW5pdF9tZW1vcnlfYXJlbmEodm9pZCkKK3sKKyAgICBleHRlcm4gY2hhciBfX2hlYXBfZW5kW107CisgICAgc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpmcDsKKworICAgIGZwID0gKHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqKV9fbWVtX2VuZDsKKyAgICBmcC0+YS50eXBlID0gQVJFTkFfVFlQRV9GUkVFOworICAgIGZwLT5hLnNpemUgPSBfX2hlYXBfZW5kIC0gKGNoYXIgKilfX21lbV9lbmQ7CisKKyAgICAvKiBJbnNlcnQgaW50byBjaGFpbnMgKi8KKyAgICBmcC0+YS5uZXh0ID0gZnAtPmEucHJldiA9ICZfX21hbGxvY19oZWFkOworICAgIGZwLT5uZXh0X2ZyZWUgPSBmcC0+cHJldl9mcmVlID0gJl9fbWFsbG9jX2hlYWQ7CisgICAgX19tYWxsb2NfaGVhZC5hLm5leHQgPSBfX21hbGxvY19oZWFkLmEucHJldiA9IGZwOworICAgIF9fbWFsbG9jX2hlYWQubmV4dF9mcmVlID0gX19tYWxsb2NfaGVhZC5wcmV2X2ZyZWUgPSBmcDsKK30KKworc3RhdGljIHZvaWQgKl9fbWFsbG9jX2Zyb21fYmxvY2soc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpmcCwgc2l6ZV90IHNpemUpCit7CisgICAgc2l6ZV90IGZzaXplOworICAgIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqbmZwLCAqbmE7CisKKyAgICBmc2l6ZSA9IGZwLT5hLnNpemU7CisKKyAgICAvKiBXZSBuZWVkIHRoZSAyKiB0byBhY2NvdW50IGZvciB0aGUgbGFyZ2VyIHJlcXVpcmVtZW50cyBvZiBhIGZyZWUgYmxvY2sgKi8KKyAgICBpZiAoZnNpemUgPj0gc2l6ZSArIDIgKiBzaXplb2Yoc3RydWN0IGFyZW5hX2hlYWRlcikpIHsKKwkvKiBCaWdnZXIgYmxvY2sgdGhhbiByZXF1aXJlZCAtLSBzcGxpdCBibG9jayAqLworCW5mcCA9IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKikoKGNoYXIgKilmcCArIHNpemUpOworCW5hID0gZnAtPmEubmV4dDsKKworCW5mcC0+YS50eXBlID0gQVJFTkFfVFlQRV9GUkVFOworCW5mcC0+YS5zaXplID0gZnNpemUgLSBzaXplOworCWZwLT5hLnR5cGUgPSBBUkVOQV9UWVBFX1VTRUQ7CisJZnAtPmEuc2l6ZSA9IHNpemU7CisKKwkvKiBJbnNlcnQgaW50byBhbGwtYmxvY2sgY2hhaW4gKi8KKwluZnAtPmEucHJldiA9IGZwOworCW5mcC0+YS5uZXh0ID0gbmE7CisJbmEtPmEucHJldiA9IG5mcDsKKwlmcC0+YS5uZXh0ID0gbmZwOworCisJLyogUmVwbGFjZSBjdXJyZW50IGJsb2NrIG9uIGZyZWUgY2hhaW4gKi8KKwluZnAtPm5leHRfZnJlZSA9IGZwLT5uZXh0X2ZyZWU7CisJbmZwLT5wcmV2X2ZyZWUgPSBmcC0+cHJldl9mcmVlOworCWZwLT5uZXh0X2ZyZWUtPnByZXZfZnJlZSA9IG5mcDsKKwlmcC0+cHJldl9mcmVlLT5uZXh0X2ZyZWUgPSBuZnA7CisgICAgfSBlbHNlIHsKKwkvKiBBbGxvY2F0ZSB0aGUgd2hvbGUgYmxvY2sgKi8KKwlmcC0+YS50eXBlID0gQVJFTkFfVFlQRV9VU0VEOworCisJLyogUmVtb3ZlIGZyb20gZnJlZSBjaGFpbiAqLworCWZwLT5uZXh0X2ZyZWUtPnByZXZfZnJlZSA9IGZwLT5wcmV2X2ZyZWU7CisJZnAtPnByZXZfZnJlZS0+bmV4dF9mcmVlID0gZnAtPm5leHRfZnJlZTsKKyAgICB9CisKKyAgICByZXR1cm4gKHZvaWQgKikoJmZwLT5hICsgMSk7Cit9CisKK3ZvaWQgKm1hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmZwOworCisgICAgaWYgKHNpemUgPT0gMCkKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qIEFkZCB0aGUgb2JsaWdhdG9yeSBhcmVuYSBoZWFkZXIsIGFuZCByb3VuZCB1cCAqLworICAgIHNpemUgPSAoc2l6ZSArIDIgKiBzaXplb2Yoc3RydWN0IGFyZW5hX2hlYWRlcikgLSAxKSAmIH5BUkVOQV9TSVpFX01BU0s7CisKKyAgICBmb3IgKGZwID0gX19tYWxsb2NfaGVhZC5uZXh0X2ZyZWU7IGZwLT5hLnR5cGUgIT0gQVJFTkFfVFlQRV9IRUFEOworCSBmcCA9IGZwLT5uZXh0X2ZyZWUpIHsKKwlpZiAoZnAtPmEuc2l6ZSA+PSBzaXplKSB7CisJICAgIC8qIEZvdW5kIGZpdCAtLSBhbGxvY2F0ZSBvdXQgb2YgdGhpcyBibG9jayAqLworCSAgICByZXR1cm4gX19tYWxsb2NfZnJvbV9ibG9jayhmcCwgc2l6ZSk7CisJfQorICAgIH0KKworICAgIC8qIE5vdGhpbmcgZm91bmQuLi4gbmVlZCB0byByZXF1ZXN0IGEgYmxvY2sgZnJvbSB0aGUga2VybmVsICovCisgICAgcmV0dXJuIE5VTEw7CQkvKiBObyBrZXJuZWwgdG8gZ2V0IHN0dWZmIGZyb20gKi8KK30KKwordm9pZCAqY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcDsKKyAgICBzaXplICo9IG5tZW1iOworICAgIHAgPSBtYWxsb2Moc2l6ZSk7CisgICAgaWYgKHApCisJbWVtc2V0KHAsIDAsIHNpemUpOworICAgIHJldHVybiBwOworfQpkaWZmIC0tZ2l0IGEvZG9zL21hbGxvYy5oIGIvZG9zL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YmYyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb3MvbWFsbG9jLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIG1hbGxvYy5oCisgKgorICogSW50ZXJuYWxzIGZvciB0aGUgbWVtb3J5IGFsbG9jYXRvcgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyoKKyAqIFRoaXMgaXMgdGhlIG1pbmltdW0gY2h1bmsgc2l6ZSB3ZSB3aWxsIGFzayB0aGUga2VybmVsIGZvcjsgdGhpcyBzaG91bGQKKyAqIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZSBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KKyAqLworI2RlZmluZSBNQUxMT0NfQ0hVTktfU0laRQk2NTUzNgorI2RlZmluZSBNQUxMT0NfQ0hVTktfTUFTSyAgICAgICAoTUFMTE9DX0NIVU5LX1NJWkUtMSkKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3by4gIFRoaXMgYmVjb21lcyB0aGUKKyAqIGFsaWdubWVudCB1bml0LgorICovCitzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXI7CisKK3N0cnVjdCBhcmVuYV9oZWFkZXIgeworICAgIHNpemVfdCB0eXBlOworICAgIHNpemVfdCBzaXplOwkJLyogQWxzbyBnaXZlcyB0aGUgbG9jYXRpb24gb2YgdGhlIG5leHQgZW50cnkgKi8KKyAgICBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKm5leHQsICpwcmV2OworfTsKKworI2lmZGVmIERFQlVHX01BTExPQworI2RlZmluZSBBUkVOQV9UWVBFX1VTRUQgMHg2NGU2OWM3MAorI2RlZmluZSBBUkVOQV9UWVBFX0ZSRUUgMHgwMTJkNjEwYQorI2RlZmluZSBBUkVOQV9UWVBFX0hFQUQgMHg5NzE2NzZiNQorI2RlZmluZSBBUkVOQV9UWVBFX0RFQUQgMHhlZWVlZWVlZQorI2Vsc2UKKyNkZWZpbmUgQVJFTkFfVFlQRV9VU0VEIDAKKyNkZWZpbmUgQVJFTkFfVFlQRV9GUkVFIDEKKyNkZWZpbmUgQVJFTkFfVFlQRV9IRUFEIDIKKyNlbmRpZgorCisjZGVmaW5lIEFSRU5BX1NJWkVfTUFTSyAoc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpLTEpCisKKyNkZWZpbmUgQVJFTkFfQUxJR05fVVAocCkJKChjaGFyICopKCgodWludHB0cl90KShwKSArIEFSRU5BX1NJWkVfTUFTSykgJiB+QVJFTkFfU0laRV9NQVNLKSkKKyNkZWZpbmUgQVJFTkFfQUxJR05fRE9XTihwKQkoKGNoYXIgKikoKHVpbnRwdHJfdCkocCkgJiB+QVJFTkFfU0laRV9NQVNLKSkKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBubyBtb3JlIHRoYW4gdHdpY2UgdGhlIHNpemUgb2YgdGhlCisgKiBwcmV2aW91cyBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciB7CisgICAgc3RydWN0IGFyZW5hX2hlYWRlciBhOworICAgIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqbmV4dF9mcmVlLCAqcHJldl9mcmVlOworfTsKKworZXh0ZXJuIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciBfX21hbGxvY19oZWFkOwpkaWZmIC0tZ2l0IGEvZG9zL21lbWNweS5TIGIvZG9zL21lbWNweS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZWVmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb3MvbWVtY3B5LlMKQEAgLTAsMCArMSwyMyBAQAorIworIyBtZW1jcHkuUworIworIyBTaW1wbGUgMTYtYml0IG1lbWNweSgpIGltcGxlbWVudGF0aW9uCisjCisKKwkudGV4dAorCS5jb2RlMTZnY2MKKwkuZ2xvYmwgbWVtY3B5CisJLnR5cGUgbWVtY3B5LCBAZnVuY3Rpb24KK21lbWNweToKKwljbGQKKwlwdXNodyAlZGkKKwlwdXNodyAlc2kKKwltb3Z3ICVheCwlZGkKKwltb3Z3ICVkeCwlc2kKKwkjIFRoZSB0aGlyZCBhcmd1bWVudCBpcyBhbHJlYWR5IGluIGN4CisJcmVwIDsgbW92c2IKKwlwb3B3ICVzaQorCXBvcHcgJWRpCisJcmV0CisKKwkuc2l6ZSBtZW1jcHksLi1tZW1jcHkKZGlmZiAtLWdpdCBhL2Rvcy9tZW1tb3ZlLlMgYi9kb3MvbWVtbW92ZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjJjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb3MvbWVtbW92ZS5TCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgbWVtbW92ZS5TCisjCisjIFNpbXBsZSAxNi1iaXQgbWVtbW92ZSgpIGltcGxlbWVudGF0aW9uCisjCisKKwkudGV4dAorCS5jb2RlMTZnY2MKKwkuZ2xvYmwgbWVtbW92ZQorCS50eXBlIG1lbW1vdmUsIEBmdW5jdGlvbgorbWVtbW92ZToKKwlwdXNodyAlZGkKKwlwdXNodyAlc2kKKwltb3Z3ICVheCwlZGkKKwltb3Z3ICVkeCwlc2kKKwljbXB3ICVzaSwlZGkKKwlqYSAxZgorCSMgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIGFscmVhZHkgaW4gY3gKKwljbGQKKwlyZXAgOyBtb3ZzYgorMjoKKwlwb3B3ICVzaQorCXBvcHcgJWRpCisJcmV0CisKKzE6CS8qIHNpIDw9IGRpLCBuZWVkIHJldmVyc2UgY29weSAqLworCWFkZCAlY3gsJWRpCisJYWRkICVjeCwlc2kKKwlkZWMgJWRpCisJZGVjICVzaQorCXN0ZAorCXJlcCA7IG1vdnNiCisJY2xkCisJam1wIDJiCisKKwkuc2l6ZSBtZW1tb3ZlLC4tbWVtbW92ZQpkaWZmIC0tZ2l0IGEvZG9zL21lbXNldC5TIGIvZG9zL21lbXNldC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTEyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb3MvbWVtc2V0LlMKQEAgLTAsMCArMSwyMSBAQAorIworIyBtZW1zZXQuUworIworIyBNaW5pbWFsIDE2LWJpdCBtZW1zZXQoKSBpbXBsZW1lbnRhdGlvbgorIworCisJLnRleHQKKwkuY29kZTE2Z2NjCisJLmdsb2JsIG1lbXNldAorCS50eXBlIG1lbXNldCwgQGZ1bmN0aW9uCittZW1zZXQ6CisJY2xkCisJcHVzaHcgJWRpCisJbW92dyAlYXgsJWRpCisJbW92YiAlZGwsJWFsCisJIyBUaGUgdGhpcmQgYXJndW1lbnQgaXMgYWxyZWFkeSBpbiAlY3gKKwlyZXAgOyBzdG9zYgorCXBvcHcgJWRpCisJcmV0bAorCisJLnNpemUgbWVtc2V0LC4tbWVtc2V0CmRpZmYgLS1naXQgYS9kb3MvbXlzdHVmZi5oIGIvZG9zL215c3R1ZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk1NzRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9zL215c3R1ZmYuaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIE1ZU1RVRkZfSAorI2RlZmluZSBNWVNUVUZGX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3Vuc2lnbmVkIGludCBza2lwX2F0b3UoY29uc3QgY2hhciAqKnMpOwordW5zaWduZWQgaW50IGF0b3UoY29uc3QgY2hhciAqcyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzZGlnaXQoaW50IGNoKQoreworICAgIHJldHVybiAoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKTsKK30KKworc3RydWN0IGRpc2tpbyB7CisgICAgdWludDMyX3Qgc3RhcnRzZWN0b3I7CisgICAgdWludDE2X3Qgc2VjdG9yczsKKyAgICB1aW50MTZfdCBidWZvZmZzLCBidWZzZWc7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK2ludCBpbnQyNV9yZWFkX3NlY3Rvcih1bnNpZ25lZCBjaGFyIGRyaXZlLCBzdHJ1Y3QgZGlza2lvICpkaW8pOworaW50IGludDI2X3dyaXRlX3NlY3Rvcih1bnNpZ25lZCBjaGFyIGRyaXZlLCBzdHJ1Y3QgZGlza2lvICpkaW8pOworCitzdHJ1Y3QgcHNwIHsKKyAgICB1aW50MTZfdAlpbnQyMDsKKyAgICB1aW50MTZfdAluZXh0cGFyYTsKKyAgICB1aW50OF90CXJlc3YxOworICAgIHVpbnQ4X3QJZGlzcGF0Y2hlcls1XTsKKyAgICB1aW50MzJfdAl0ZXJtdmVjdG9yOworICAgIHVpbnQzMl90CWN0cmxjdmVjdG9yOworICAgIHVpbnQzMl90CWNyaXRlcnJ2ZWN0b3I7CisgICAgdWludDE2X3QJcmVzdjJbMTFdOworICAgIHVpbnQxNl90CWVudmlyb25tZW50OworICAgIHVpbnQxNl90CXJlc3YzWzIzXTsKKyAgICB1aW50OF90CWZjYlsyXVsxNl07CisgICAgdWludDMyX3QJcmVzdjQ7CisgICAgdWludDhfdAljbWRsZW47CisgICAgY2hhcgljbWR0YWlsWzEyN107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitleHRlcm4gc3RydWN0IHBzcCBfUFNQOworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKK3VpbnQxNl90IGRzKHZvaWQpCit7CisgICAgdWludDE2X3QgdjsKKyAgICBhc20oIm1vdncgJSVkcywlMCI6Ij1ybSIodikpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZzKHVpbnQxNl90IHNlZykKK3sKKyAgICBhc20gdm9sYXRpbGUoIm1vdncgJTAsJSVmcyI6OiJybSIgKHNlZykpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZ2V0XzhfZnMoc2l6ZV90IG9mZnMpCit7CisgICAgdWludDhfdCB2OworICAgIGFzbSB2b2xhdGlsZSgibW92YiAlJWZzOiUxLCUwIgorCQkgOiAiPXEiICh2KSA6ICJtIiAoKihjb25zdCB1aW50OF90ICopb2ZmcykpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGdldF8xNl9mcyhzaXplX3Qgb2ZmcykKK3sKKyAgICB1aW50MTZfdCB2OworICAgIGFzbSB2b2xhdGlsZSgibW92dyAlJWZzOiUxLCUwIgorCQkgOiAiPXIiICh2KSA6ICJtIiAoKihjb25zdCB1aW50MTZfdCAqKW9mZnMpKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfMzJfZnMoc2l6ZV90IG9mZnMpCit7CisgICAgdWludDMyX3QgdjsKKyAgICBhc20gdm9sYXRpbGUoIm1vdmwgJSVmczolMSwlMCIKKwkJIDogIj1yIiAodikgOiAibSIgKCooY29uc3QgdWludDMyX3QgKilvZmZzKSk7CisgICAgcmV0dXJuIHY7Cit9CisKKyNlbmRpZiAvKiBNWVNUVUZGX0ggKi8KZGlmZiAtLWdpdCBhL2Rvcy9wZXJyb3IuYyBiL2Rvcy9wZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWFiMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9zL3BlcnJvci5jCkBAIC0wLDAgKzEsNyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKwordm9pZCBwZXJyb3IoY29uc3QgY2hhciAqbXNnKQoreworICAgIHByaW50ZigiJXM6IGVycm9yICVzXG4iLCBtc2csIGVycm5vKTsKK30KZGlmZiAtLWdpdCBhL2Rvcy9wcmludGYuYyBiL2Rvcy9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmVmMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9zL3ByaW50Zi5jCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogT2gsIGl0J3MgYSB3YXN0ZSBvZiBzcGFjZSwgYnV0IG9oLXNvLXl1bW15IGZvciBkZWJ1Z2dpbmcuICBJdCdzIGp1c3QKKyAqIGluaXRpYWxpemF0aW9uIGNvZGUgYW55d2F5LCBzbyBpdCBkb2Vzbid0IHRha2UgdXAgc3BhY2Ugd2hlbiB3ZSdyZQorICogYWN0dWFsbHkgcnVubmluZy4gIFRoaXMgdmVyc2lvbiBvZiBwcmludGYoKSBkb2VzIG5vdCBpbmNsdWRlIDY0LWJpdAorICogc3VwcG9ydC4gICJMaXZlIHdpdGggaXQuIgorICoKKyAqIE1vc3Qgb2YgdGhpcyBjb2RlIHdhcyBzaGFtZWxlc3NseSBzbmFyZmVkIGZyb20gdGhlIExpbnV4IGtlcm5lbCwgdGhlbgorICogbW9kaWZpZWQuICBJdCdzIHRoZXJlZm9yZSBHUEwuCisgKgorICogcHJpbnRmKCkgaXNuJ3QgYWN0dWFsbHkgbmVlZGVkIHRvIGJ1aWxkIHN5c2xpbnV4LmNvbSwgYnV0IGR1cmluZworICogZGVidWdnaW5nIGl0J3MgaGFuZHkuCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAibXlzdHVmZi5oIgorCitzdGF0aWMgaW50IHN0cm5sZW4oY29uc3QgY2hhciAqcywgaW50IG1heGxlbikKK3sKKyAgICBjb25zdCBjaGFyICplcyA9IHM7CisgICAgd2hpbGUgKCplcyAmJiBtYXhsZW4pIHsKKwllcysrOworCW1heGxlbi0tOworICAgIH0KKworICAgIHJldHVybiAoZXMgLSBzKTsKK30KKworI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8KKyNkZWZpbmUgU0lHTgkyCQkvKiB1bnNpZ25lZC9zaWduZWQgbG9uZyAqLworI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLworI2RlZmluZSBTUEFDRQk4CQkvKiBzcGFjZSBpZiBwbHVzICovCisjZGVmaW5lIExFRlQJMTYJCS8qIGxlZnQganVzdGlmaWVkICovCisjZGVmaW5lIFNQRUNJQUwJMzIJCS8qIDB4ICovCisjZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAnYWJjZGVmJyAqLworCisjZGVmaW5lIGRvX2RpdihuLGJhc2UpICh7IFwKK2ludCBfX3JlczsgXAorX19yZXMgPSAoKHVuc2lnbmVkIGxvbmcpIG4pICUgKHVuc2lnbmVkKSBiYXNlOyBcCituID0gKCh1bnNpZ25lZCBsb25nKSBuKSAvICh1bnNpZ25lZCkgYmFzZTsgXAorX19yZXM7IH0pCisKK3N0YXRpYyBjaGFyICpudW1iZXIoY2hhciAqc3RyLCBsb25nIG51bSwgaW50IGJhc2UsIGludCBzaXplLCBpbnQgcHJlY2lzaW9uLAorCQkgICAgaW50IHR5cGUpCit7CisgICAgY2hhciBjLCBzaWduLCB0bXBbNjZdOworICAgIGNvbnN0IGNoYXIgKmRpZ2l0cyA9ICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICAgIGludCBpOworCisgICAgaWYgKHR5cGUgJiBMQVJHRSkKKwlkaWdpdHMgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKyAgICBpZiAodHlwZSAmIExFRlQpCisJdHlwZSAmPSB+WkVST1BBRDsKKyAgICBpZiAoYmFzZSA8IDIgfHwgYmFzZSA+IDM2KQorCXJldHVybiAwOworICAgIGMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOworICAgIHNpZ24gPSAwOworICAgIGlmICh0eXBlICYgU0lHTikgeworCWlmIChudW0gPCAwKSB7CisJICAgIHNpZ24gPSAnLSc7CisJICAgIG51bSA9IC1udW07CisJICAgIHNpemUtLTsKKwl9IGVsc2UgaWYgKHR5cGUgJiBQTFVTKSB7CisJICAgIHNpZ24gPSAnKyc7CisJICAgIHNpemUtLTsKKwl9IGVsc2UgaWYgKHR5cGUgJiBTUEFDRSkgeworCSAgICBzaWduID0gJyAnOworCSAgICBzaXplLS07CisJfQorICAgIH0KKyAgICBpZiAodHlwZSAmIFNQRUNJQUwpIHsKKwlpZiAoYmFzZSA9PSAxNikKKwkgICAgc2l6ZSAtPSAyOworCWVsc2UgaWYgKGJhc2UgPT0gOCkKKwkgICAgc2l6ZS0tOworICAgIH0KKyAgICBpID0gMDsKKyAgICBpZiAobnVtID09IDApCisJdG1wW2krK10gPSAnMCc7CisgICAgZWxzZQorCXdoaWxlIChudW0gIT0gMCkKKwkgICAgdG1wW2krK10gPSBkaWdpdHNbZG9fZGl2KG51bSwgYmFzZSldOworICAgIGlmIChpID4gcHJlY2lzaW9uKQorCXByZWNpc2lvbiA9IGk7CisgICAgc2l6ZSAtPSBwcmVjaXNpb247CisgICAgaWYgKCEodHlwZSAmIChaRVJPUEFEICsgTEVGVCkpKQorCXdoaWxlIChzaXplLS0gPiAwKQorCSAgICAqc3RyKysgPSAnICc7CisgICAgaWYgKHNpZ24pCisJKnN0cisrID0gc2lnbjsKKyAgICBpZiAodHlwZSAmIFNQRUNJQUwpIHsKKwlpZiAoYmFzZSA9PSA4KQorCSAgICAqc3RyKysgPSAnMCc7CisJZWxzZSBpZiAoYmFzZSA9PSAxNikgeworCSAgICAqc3RyKysgPSAnMCc7CisJICAgICpzdHIrKyA9IGRpZ2l0c1szM107CisJfQorICAgIH0KKyAgICBpZiAoISh0eXBlICYgTEVGVCkpCisJd2hpbGUgKHNpemUtLSA+IDApCisJICAgICpzdHIrKyA9IGM7CisgICAgd2hpbGUgKGkgPCBwcmVjaXNpb24tLSkKKwkqc3RyKysgPSAnMCc7CisgICAgd2hpbGUgKGktLSA+IDApCisJKnN0cisrID0gdG1wW2ldOworICAgIHdoaWxlIChzaXplLS0gPiAwKQorCSpzdHIrKyA9ICcgJzsKKyAgICByZXR1cm4gc3RyOworfQorCisvKiBGb3J3YXJkIGRlY2wuIG5lZWRlZCBmb3IgSVAgYWRkcmVzcyBwcmludGluZyBzdHVmZi4uLiAqLworaW50IHNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK2ludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworICAgIGludCBsZW47CisgICAgdW5zaWduZWQgbG9uZyBudW07CisgICAgaW50IGksIGJhc2U7CisgICAgY2hhciAqc3RyOworICAgIGNvbnN0IGNoYXIgKnM7CisKKyAgICBpbnQgZmxhZ3M7CQkJLyogZmxhZ3MgdG8gbnVtYmVyKCkgKi8KKworICAgIGludCBmaWVsZF93aWR0aDsJCS8qIHdpZHRoIG9mIG91dHB1dCBmaWVsZCAqLworICAgIGludCBwcmVjaXNpb247CQkvKiBtaW4uICMgb2YgZGlnaXRzIGZvciBpbnRlZ2VyczsgbWF4CisJCQkJICAgbnVtYmVyIG9mIGNoYXJzIGZvciBmcm9tIHN0cmluZyAqLworICAgIGludCBxdWFsaWZpZXI7CQkvKiAnaCcsICdsJywgb3IgJ0wnIGZvciBpbnRlZ2VyIGZpZWxkcyAqLworCisgICAgZm9yIChzdHIgPSBidWY7ICpmbXQ7ICsrZm10KSB7CisJaWYgKCpmbXQgIT0gJyUnKSB7CisJICAgICpzdHIrKyA9ICpmbXQ7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qIHByb2Nlc3MgZmxhZ3MgKi8KKwlmbGFncyA9IDA7CityZXBlYXQ6CisJKytmbXQ7CQkJLyogdGhpcyBhbHNvIHNraXBzIGZpcnN0ICclJyAqLworCXN3aXRjaCAoKmZtdCkgeworCWNhc2UgJy0nOgorCSAgICBmbGFncyB8PSBMRUZUOworCSAgICBnb3RvIHJlcGVhdDsKKwljYXNlICcrJzoKKwkgICAgZmxhZ3MgfD0gUExVUzsKKwkgICAgZ290byByZXBlYXQ7CisJY2FzZSAnICc6CisJICAgIGZsYWdzIHw9IFNQQUNFOworCSAgICBnb3RvIHJlcGVhdDsKKwljYXNlICcjJzoKKwkgICAgZmxhZ3MgfD0gU1BFQ0lBTDsKKwkgICAgZ290byByZXBlYXQ7CisJY2FzZSAnMCc6CisJICAgIGZsYWdzIHw9IFpFUk9QQUQ7CisJICAgIGdvdG8gcmVwZWF0OworCX0KKworCS8qIGdldCBmaWVsZCB3aWR0aCAqLworCWZpZWxkX3dpZHRoID0gLTE7CisJaWYgKGlzZGlnaXQoKmZtdCkpCisJICAgIGZpZWxkX3dpZHRoID0gc2tpcF9hdG91KCZmbXQpOworCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJICAgICsrZm10OworCSAgICAvKiBpdCdzIHRoZSBuZXh0IGFyZ3VtZW50ICovCisJICAgIGZpZWxkX3dpZHRoID0gdmFfYXJnKGFyZ3MsIGludCk7CisJICAgIGlmIChmaWVsZF93aWR0aCA8IDApIHsKKwkJZmllbGRfd2lkdGggPSAtZmllbGRfd2lkdGg7CisJCWZsYWdzIHw9IExFRlQ7CisJICAgIH0KKwl9CisKKwkvKiBnZXQgdGhlIHByZWNpc2lvbiAqLworCXByZWNpc2lvbiA9IC0xOworCWlmICgqZm10ID09ICcuJykgeworCSAgICArK2ZtdDsKKwkgICAgaWYgKGlzZGlnaXQoKmZtdCkpCisJCXByZWNpc2lvbiA9IHNraXBfYXRvdSgmZm10KTsKKwkgICAgZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKKwkJKytmbXQ7CisJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJcHJlY2lzaW9uID0gdmFfYXJnKGFyZ3MsIGludCk7CisJICAgIH0KKwkgICAgaWYgKHByZWNpc2lvbiA8IDApCisJCXByZWNpc2lvbiA9IDA7CisJfQorCisJLyogZ2V0IHRoZSBjb252ZXJzaW9uIHF1YWxpZmllciAqLworCXF1YWxpZmllciA9IC0xOworCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJykgeworCSAgICBxdWFsaWZpZXIgPSAqZm10OworCSAgICArK2ZtdDsKKwl9CisKKwkvKiBkZWZhdWx0IGJhc2UgKi8KKwliYXNlID0gMTA7CisKKwlzd2l0Y2ggKCpmbXQpIHsKKwljYXNlICdjJzoKKwkgICAgaWYgKCEoZmxhZ3MgJiBMRUZUKSkKKwkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkgICAgKnN0cisrID0gJyAnOworCSAgICAqc3RyKysgPSAodW5zaWduZWQgY2hhcil2YV9hcmcoYXJncywgaW50KTsKKwkgICAgd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkqc3RyKysgPSAnICc7CisJICAgIGNvbnRpbnVlOworCisJY2FzZSAncyc6CisJICAgIHMgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKKwkgICAgbGVuID0gc3RybmxlbihzLCBwcmVjaXNpb24pOworCisJICAgIGlmICghKGZsYWdzICYgTEVGVCkpCisJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkgICAgKnN0cisrID0gJyAnOworCSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCSpzdHIrKyA9ICpzKys7CisJICAgIHdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkqc3RyKysgPSAnICc7CisJICAgIGNvbnRpbnVlOworCisJY2FzZSAncCc6CisJICAgIGlmIChmaWVsZF93aWR0aCA9PSAtMSkgeworCQlmaWVsZF93aWR0aCA9IDIgKiBzaXplb2Yodm9pZCAqKTsKKwkJZmxhZ3MgfD0gWkVST1BBRDsKKwkgICAgfQorCSAgICBzdHIgPSBudW1iZXIoc3RyLAorCQkJICh1bnNpZ25lZCBsb25nKXZhX2FyZyhhcmdzLCB2b2lkICopLCAxNiwKKwkJCSBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CisJICAgIGNvbnRpbnVlOworCisJY2FzZSAnbic6CisJICAgIGlmIChxdWFsaWZpZXIgPT0gJ2wnKSB7CisJCWxvbmcgKmlwID0gdmFfYXJnKGFyZ3MsIGxvbmcgKik7CisJCSppcCA9IChzdHIgLSBidWYpOworCSAgICB9IGVsc2UgeworCQlpbnQgKmlwID0gdmFfYXJnKGFyZ3MsIGludCAqKTsKKwkJKmlwID0gKHN0ciAtIGJ1Zik7CisJICAgIH0KKwkgICAgY29udGludWU7CisKKwljYXNlICclJzoKKwkgICAgKnN0cisrID0gJyUnOworCSAgICBjb250aW51ZTsKKworCSAgICAvKiBpbnRlZ2VyIG51bWJlciBmb3JtYXRzIC0gc2V0IHVwIHRoZSBmbGFncyBhbmQgImJyZWFrIiAqLworCWNhc2UgJ28nOgorCSAgICBiYXNlID0gODsKKwkgICAgYnJlYWs7CisKKwljYXNlICdYJzoKKwkgICAgZmxhZ3MgfD0gTEFSR0U7CisJY2FzZSAneCc6CisJICAgIGJhc2UgPSAxNjsKKwkgICAgYnJlYWs7CisKKwljYXNlICdkJzoKKwljYXNlICdpJzoKKwkgICAgZmxhZ3MgfD0gU0lHTjsKKwljYXNlICd1JzoKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICAqc3RyKysgPSAnJSc7CisJICAgIGlmICgqZm10KQorCQkqc3RyKysgPSAqZm10OworCSAgICBlbHNlCisJCS0tZm10OworCSAgICBjb250aW51ZTsKKwl9CisJaWYgKHF1YWxpZmllciA9PSAnbCcpCisJICAgIG51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKwllbHNlIGlmIChxdWFsaWZpZXIgPT0gJ2gnKSB7CisJICAgIG51bSA9ICh1bnNpZ25lZCBzaG9ydCl2YV9hcmcoYXJncywgaW50KTsKKwkgICAgaWYgKGZsYWdzICYgU0lHTikKKwkJbnVtID0gKHNob3J0KW51bTsKKwl9IGVsc2UgaWYgKGZsYWdzICYgU0lHTikKKwkgICAgbnVtID0gdmFfYXJnKGFyZ3MsIGludCk7CisJZWxzZQorCSAgICBudW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKKwlzdHIgPSBudW1iZXIoc3RyLCBudW0sIGJhc2UsIGZpZWxkX3dpZHRoLCBwcmVjaXNpb24sIGZsYWdzKTsKKyAgICB9CisgICAgKnN0ciA9ICdcMCc7CisgICAgcmV0dXJuIHN0ciAtIGJ1ZjsKK30KKworaW50IHNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50IGk7CisKKyAgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgIGkgPSB2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiBpOworfQorCitpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIGNoYXIgcHJpbnRmX2J1ZlsxMDI0XTsKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50IHByaW50ZWQ7CisKKyAgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgIHByaW50ZWQgPSB2c3ByaW50ZihwcmludGZfYnVmLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKworICAgIHB1dHMocHJpbnRmX2J1Zik7CisKKyAgICByZXR1cm4gcHJpbnRlZDsKK30KZGlmZiAtLWdpdCBhL2Rvcy9za2lwYXRvdS5jIGIvZG9zL3NraXBhdG91LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1YWI1NgotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9za2lwYXRvdS5jCkBAIC0wLDAgKzEsMTAgQEAKKyNpbmNsdWRlICJteXN0dWZmLmgiCisKK3Vuc2lnbmVkIGludCBza2lwX2F0b3UoY29uc3QgY2hhciAqKnMpCit7CisgICAgaW50IGkgPSAwOworCisgICAgd2hpbGUgKGlzZGlnaXQoKipzKSkKKwlpID0gaSAqIDEwICsgKigoKnMpKyspIC0gJzAnOworICAgIHJldHVybiBpOworfQpkaWZmIC0tZ2l0IGEvZG9zL3N0ZGludC5oIGIvZG9zL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzkxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb3Mvc3RkaW50LmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBzdGRpbnQuaAorICovCisKKyNpZm5kZWYgX1NURElOVF9ICisjZGVmaW5lIF9TVERJTlRfSAorCisvKiBFeGFjdCB0eXBlcyAqLworCit0eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgaW50MzJfdDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBpbnQ2NF90OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OworCisvKiBTbWFsbCB0eXBlcyAqLworCit0eXBlZGVmIHNpZ25lZCBjaGFyIGludF9sZWFzdDhfdDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgaW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBpbnRfbGVhc3Q2NF90OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludF9sZWFzdDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnRfbGVhc3Q2NF90OworCisvKiBGYXN0IHR5cGVzICovCisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgaW50X2Zhc3QzMl90OwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIGludF9mYXN0NjRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnRfZmFzdDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50X2Zhc3Q2NF90OworCisvKiBQb2ludGVyIHR5cGVzICovCisKK3R5cGVkZWYgaW50MzJfdCBpbnRwdHJfdDsKK3R5cGVkZWYgdWludDMyX3QgdWludHB0cl90OworCisvKiBNYXhpbWFsIHR5cGVzICovCisKK3R5cGVkZWYgaW50NjRfdCBpbnRtYXhfdDsKK3R5cGVkZWYgdWludDY0X3QgdWludG1heF90OworCisvKgorICogVG8gYmUgc3RyaWN0bHkgY29ycmVjdC4uLgorICovCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERDX0xJTUlUX01BQ1JPUykKKworIyBkZWZpbmUgSU5UOF9NSU4gICAgICAgICAgICAgICAoLTEyOCkKKyMgZGVmaW5lIElOVDE2X01JTiAgICAgICAgICAgICAgKC0zMjc2Ny0xKQorIyBkZWZpbmUgSU5UMzJfTUlOICAgICAgICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyMgZGVmaW5lIElOVDY0X01JTiAgICAgICAgICAgICAgKC05MjIzMzcyMDM2ODU0Nzc1ODA3TEwtMSkKKworIyBkZWZpbmUgSU5UOF9NQVggICAgICAgICAgICAgICAoMTI3KQorIyBkZWZpbmUgSU5UMTZfTUFYICAgICAgICAgICAgICAoMzI3NjcpCisjIGRlZmluZSBJTlQzMl9NQVggICAgICAgICAgICAgICgyMTQ3NDgzNjQ3KQorIyBkZWZpbmUgSU5UNjRfTUFYICAgICAgICAgICAgICAoOTIyMzM3MjAzNjg1NDc3NTgwN0xMKQorCisjIGRlZmluZSBVSU5UOF9NQVggICAgICAgICAgICAgICgyNTVVKQorIyBkZWZpbmUgVUlOVDE2X01BWCAgICAgICAgICAgICAoNjU1MzVVKQorIyBkZWZpbmUgVUlOVDMyX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVUpCisjIGRlZmluZSBVSU5UNjRfTUFYICAgICAgICAgICAgICgxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTCkKKworIyBkZWZpbmUgSU5UX0xFQVNUOF9NSU4gICAgICAgICAgICAgICAoLTEyOCkKKyMgZGVmaW5lIElOVF9MRUFTVDE2X01JTiAgICAgICAgICAgICAgKC0zMjc2Ny0xKQorIyBkZWZpbmUgSU5UX0xFQVNUMzJfTUlOICAgICAgICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyMgZGVmaW5lIElOVF9MRUFTVDY0X01JTiAgICAgICAgICAgICAgKC05MjIzMzcyMDM2ODU0Nzc1ODA3TEwtMSkKKworIyBkZWZpbmUgSU5UX0xFQVNUOF9NQVggICAgICAgICAgICAgICAoMTI3KQorIyBkZWZpbmUgSU5UX0xFQVNUMTZfTUFYICAgICAgICAgICAgICAoMzI3NjcpCisjIGRlZmluZSBJTlRfTEVBU1QzMl9NQVggICAgICAgICAgICAgICgyMTQ3NDgzNjQ3KQorIyBkZWZpbmUgSU5UX0xFQVNUNjRfTUFYICAgICAgICAgICAgICAoOTIyMzM3MjAzNjg1NDc3NTgwN0xMKQorCisjIGRlZmluZSBVSU5UX0xFQVNUOF9NQVggICAgICAgICAgICAgICgyNTVVKQorIyBkZWZpbmUgVUlOVF9MRUFTVDE2X01BWCAgICAgICAgICAgICAoNjU1MzVVKQorIyBkZWZpbmUgVUlOVF9MRUFTVDMyX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVUpCisjIGRlZmluZSBVSU5UX0xFQVNUNjRfTUFYICAgICAgICAgICAgICgxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTCkKKworIyBkZWZpbmUgSU5UX0ZBU1Q4X01JTiAgICAgICAgICAgICAgICgtMTI4KQorIyBkZWZpbmUgSU5UX0ZBU1QxNl9NSU4gICAgICAgICAgICAgICgtMzI3NjctMSkKKyMgZGVmaW5lIElOVF9GQVNUMzJfTUlOICAgICAgICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyMgZGVmaW5lIElOVF9GQVNUNjRfTUlOICAgICAgICAgICAgICAoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTC0xKQorCisjIGRlZmluZSBJTlRfRkFTVDhfTUFYICAgICAgICAgICAgICAgKDEyNykKKyMgZGVmaW5lIElOVF9GQVNUMTZfTUFYICAgICAgICAgICAgICAoMzI3NjcpCisjIGRlZmluZSBJTlRfRkFTVDMyX01BWCAgICAgICAgICAgICAgKDIxNDc0ODM2NDcpCisjIGRlZmluZSBJTlRfRkFTVDY0X01BWCAgICAgICAgICAgICAgKDkyMjMzNzIwMzY4NTQ3NzU4MDdMTCkKKworIyBkZWZpbmUgVUlOVF9GQVNUOF9NQVggICAgICAgICAgICAgICgyNTVVKQorIyBkZWZpbmUgVUlOVF9GQVNUMTZfTUFYICAgICAgICAgICAgICg2NTUzNVUpCisjIGRlZmluZSBVSU5UX0ZBU1QzMl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVKQorIyBkZWZpbmUgVUlOVF9GQVNUNjRfTUFYICAgICAgICAgICAgICgxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTCkKKworIyBkZWZpbmUgSU5UUFRSX01JTgkJKC0yMTQ3NDgzNjQ3LTEpCisjIGRlZmluZSBJTlRQVFJfTUFYCQkoMjE0NzQ4MzY0NykKKyMgZGVmaW5lIFVJTlRQVFJfTUFYCQkoNDI5NDk2NzI5NVUpCisKKyMgZGVmaW5lIElOVE1BWF9NSU4JCSgtOTIyMzM3MjAzNjg1NDc3NTgwN0xMLTEpCisjIGRlZmluZSBJTlRNQVhfTUFYCQkoOTIyMzM3MjAzNjg1NDc3NTgwN0xMKQorIyBkZWZpbmUgVUlOVE1BWF9NQVgJCSgxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTCkKKworLyogcHRyZGlmZl90IGxpbWl0ICovCisjIGRlZmluZSBQVFJESUZGX01JTgkJKC0yMTQ3NDgzNjQ3LTEpCisjIGRlZmluZSBQVFJESUZGX01BWAkJKDIxNDc0ODM2NDcpCisKKy8qIHNpZ19hdG9taWNfdCBsaW1pdCAqLworIyBkZWZpbmUgU0lHX0FUT01JQ19NSU4gICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyMgZGVmaW5lIFNJR19BVE9NSUNfTUFYICAgICAgICAgKDIxNDc0ODM2NDcpCisKKy8qIHNpemVfdCBsaW1pdCAqLworIyBkZWZpbmUgU0laRV9NQVgJCSg0Mjk0OTY3Mjk1VSkKKworI2VuZGlmIC8qIFNURENfTElNSVRfTUFDUk9TICovCisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfQ09OU1RBTlRfTUFDUk9TKQorCisjIGRlZmluZSBJTlQ4X0MobikJbgorIyBkZWZpbmUgSU5UMTZfQyhuKQluCisjIGRlZmluZSBJTlQzMl9DKG4pCW4KKyMgZGVmaW5lIElOVDY0X0MobikJbiAjIyBMTAorCisjIGRlZmluZSBVSU5UOF9DKG4pCW4gIyMgVQorIyBkZWZpbmUgVUlOVDE2X0MobikJbiAjIyBVCisjIGRlZmluZSBVSU5UMzJfQyhuKQluICMjIFUKKyMgZGVmaW5lIFVJTlQ2NF9DKG4pCW4gIyMgVUxMCisKKyMgZGVmaW5lIElOVE1BWF9DKG4pCW4gIyMgTEwKKyMgZGVmaW5lIFVJTlRNQVhfQyhuKQluICMjIFVMTAorCisjZW5kaWYgLyogU1REQ19DT05TVEFOVF9NQUNST1MgKi8KKworI2VuZGlmIC8qIF9TVERJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZG9zL3N0ZGlvLmggYi9kb3Mvc3RkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2NhMjVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9zL3N0ZGlvLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBTVERJT19ICisjZGVmaW5lIFNURElPX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGludCBvZmZfdDsKKworaW50IHB1dGNoYXIoaW50KTsKK2ludCBwdXRzKGNvbnN0IGNoYXIgKik7CitpbnQgc3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2ludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKK2ludCBwcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOworCisjZGVmaW5lIHN0ZGluCTAKKyNkZWZpbmUgc3Rkb3V0CTEKKyNkZWZpbmUgc3RkZXJyCTIKKworI2RlZmluZSBFT0YgKC0xKQorCisjZGVmaW5lIGZwcmludGYoeCwgeSwgLi4uKSBwcmludGYoeSwgIyMgX19WQV9BUkdTX18pCisKKyNlbmRpZiAvKiBTVERJT19IICovCmRpZmYgLS1naXQgYS9kb3Mvc3RkbGliLmggYi9kb3Mvc3RkbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk4MjY3MAotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9zdGRsaWIuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIFNURExJQl9ICisjZGVmaW5lIFNURExJQl9ICisKK3R5cGVkZWYgaW50IHNzaXplX3Q7CisvKiBzaXplX3QgaXMgZGVmaW5lZCBlbHNld2hlcmUgKi8KKyNpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gNAordHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OworI2VsaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDgKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzaXplX3Q7CisjZWxzZQorI2Vycm9yICJ1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUiCisjZW5kaWYKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKSBleGl0KGludCk7CisKK3ZvaWQgKm1hbGxvYyhzaXplX3QpOwordm9pZCAqY2FsbG9jKHNpemVfdCwgc2l6ZV90KTsKK3ZvaWQgZnJlZSh2b2lkICopOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgc3RydG91bChjb25zdCBjaGFyICpucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kb3Mvc3RyY2hyLmMgYi9kb3Mvc3RyY2hyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxNTMxMQotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9zdHJjaHIuYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogc3RyY2hyLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibXlzdHVmZi5oIgorCitjaGFyICpzdHJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpCit7CisgICAgd2hpbGUgKCpzICE9IChjaGFyKWMpIHsKKwlpZiAoISpzKQorCSAgICByZXR1cm4gTlVMTDsKKwlzKys7CisgICAgfQorCisgICAgcmV0dXJuIChjaGFyICopczsKK30KZGlmZiAtLWdpdCBhL2Rvcy9zdHJpbmcuaCBiL2Rvcy9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQ4ZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZG9zL3N0cmluZy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBzdHJpbmcuaAorICovCisKKyNpZm5kZWYgX1NUUklOR19ICisjZGVmaW5lIF9TVFJJTkdfSAorCisvKiBTdGFuZGFyZCByb3V0aW5lcyAqLworI2RlZmluZSBtZW1jcHkoYSxiLGMpCV9fYnVpbHRpbl9tZW1jcHkoYSxiLGMpCisjZGVmaW5lIG1lbW1vdmUoYSxiLGMpCV9fYnVpbHRpbl9tZW1tb3ZlKGEsYixjKQorI2RlZmluZSBtZW1zZXQoYSxiLGMpCV9fYnVpbHRpbl9tZW1zZXQoYSxiLGMpCisjZGVmaW5lIHN0cmNweShhLGIpCV9fYnVpbHRpbl9zdHJjcHkoYSxiKQorI2RlZmluZSBzdHJsZW4oYSkJX19idWlsdGluX3N0cmxlbihhKQorCisvKiBUaGlzIG9ubHkgcmV0dXJucyB0cnVlIG9yIGZhbHNlICovCitzdGF0aWMgaW5saW5lIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqX19tMSwgY29uc3Qgdm9pZCAqX19tMiwgdW5zaWduZWQgaW50IF9fbikKK3sKKyAgICBfQm9vbCBydjsKKyAgICBhc20gdm9sYXRpbGUgKCJjbGQgOyByZXBlIDsgY21wc2IgOyBzZXRuZSAlMCI6Ij1hYmQiIChydiksICIrRCIoX19tMSksCisJCSAgIitTIihfX20yKSwgIitjIihfX24pKTsKKyAgICByZXR1cm4gcnY7Cit9CisKK2V4dGVybiBjaGFyICpzdHJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpOworCisjZW5kaWYgLyogX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9kb3Mvc3RybnRvdW1heC5jIGIvZG9zL3N0cm50b3VtYXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJjNzNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9zL3N0cm50b3VtYXguYwpAQCAtMCwwICsxLDczIEBACisvKgorICogc3RybnRvdW1heC5jCisgKgorICogVGhlIHN0cm50b3VtYXgoKSBmdW5jdGlvbiBhbmQgYXNzb2NpYXRlZAorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCitzdGF0aWMgaW5saW5lIGludCBkaWdpdHZhbChpbnQgY2gpCit7CisgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKwlyZXR1cm4gY2ggLSAnMCc7CisgICAgfSBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSB7CisJcmV0dXJuIGNoIC0gJ0EnICsgMTA7CisgICAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB7CisJcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gLTE7CisgICAgfQorfQorCit1aW50bWF4X3Qgc3RybnRvdW1heChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSwgc2l6ZV90IG4pCit7CisgICAgaW50IG1pbnVzID0gMDsKKyAgICB1aW50bWF4X3QgdiA9IDA7CisgICAgaW50IGQ7CisKKyAgICB3aGlsZSAobiAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpucHRyKSkgeworCW5wdHIrKzsKKwluLS07CisgICAgfQorCisgICAgLyogU2luZ2xlIG9wdGlvbmFsICsgb3IgLSAqLworICAgIGlmIChuICYmICpucHRyID09ICctJykgeworCW1pbnVzID0gMTsKKwlucHRyKys7CisJbi0tOworICAgIH0gZWxzZSBpZiAobiAmJiAqbnB0ciA9PSAnKycpIHsKKwlucHRyKys7CisgICAgfQorCisgICAgaWYgKGJhc2UgPT0gMCkgeworCWlmIChuID49IDIgJiYgbnB0clswXSA9PSAnMCcgJiYgKG5wdHJbMV0gPT0gJ3gnIHx8IG5wdHJbMV0gPT0gJ1gnKSkgeworCSAgICBuIC09IDI7CisJICAgIG5wdHIgKz0gMjsKKwkgICAgYmFzZSA9IDE2OworCX0gZWxzZSBpZiAobiA+PSAxICYmIG5wdHJbMF0gPT0gJzAnKSB7CisJICAgIG4tLTsKKwkgICAgbnB0cisrOworCSAgICBiYXNlID0gODsKKwl9IGVsc2UgeworCSAgICBiYXNlID0gMTA7CisJfQorICAgIH0gZWxzZSBpZiAoYmFzZSA9PSAxNikgeworCWlmIChuID49IDIgJiYgbnB0clswXSA9PSAnMCcgJiYgKG5wdHJbMV0gPT0gJ3gnIHx8IG5wdHJbMV0gPT0gJ1gnKSkgeworCSAgICBuIC09IDI7CisJICAgIG5wdHIgKz0gMjsKKwl9CisgICAgfQorCisgICAgd2hpbGUgKG4gJiYgKGQgPSBkaWdpdHZhbCgqbnB0cikpID49IDAgJiYgZCA8IGJhc2UpIHsKKwl2ID0gdiAqIGJhc2UgKyBkOworCW4tLTsKKwlucHRyKys7CisgICAgfQorCisgICAgaWYgKGVuZHB0cikKKwkqZW5kcHRyID0gKGNoYXIgKilucHRyOworCisgICAgcmV0dXJuIG1pbnVzID8gLXYgOiB2OworfQpkaWZmIC0tZ2l0IGEvZG9zL3N0cnRvdWwuYyBiL2Rvcy9zdHJ0b3VsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlOTQzMAotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9zdHJ0b3VsLmMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIHN0cnRvdWwuYworICoKKyAqIHN0cnRvdWwoKSBmdW5jdGlvbgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCitleHRlcm4gdWludG1heF90IHN0cm50b3VtYXgoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UsIHNpemVfdCBuKTsKKwordW5zaWduZWQgbG9uZyBzdHJ0b3VsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKQoreworICAgIHJldHVybiAodW5zaWduZWQgbG9uZykgc3RybnRvdW1heChucHRyLCBlbmRwdHIsIGJhc2UsIH4oc2l6ZV90KSAwKTsKK30KZGlmZiAtLWdpdCBhL2Rvcy9zeXNleGl0cy5oIGIvZG9zL3N5c2V4aXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzZDNiYQotLS0gL2Rldi9udWxsCisrKyBiL2Rvcy9zeXNleGl0cy5oCkBAIC0wLDAgKzEgQEAKKyNkZWZpbmUgRVhfVVNBR0UgMHg0MApkaWZmIC0tZ2l0IGEvZG9zL3N5c2xpbnV4LmMgYi9kb3Mvc3lzbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQ1ZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9zL3N5c2xpbnV4LmMKQEAgLTAsMCArMSw3NjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk4LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbGludXguYyAtIExpbnV4IGluc3RhbGxlciBwcm9ncmFtIGZvciBTWVNMSU5VWAorICoKKyAqIEhhY2tlZCB1cCBmb3IgRE9TLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAibXlzdHVmZi5oIgorCisjaW5jbHVkZSAic3lzbGludXguaCIKKyNpbmNsdWRlICJsaWJmYXQuaCIKKyNpbmNsdWRlICJzZXRhZHYuaCIKKyNpbmNsdWRlICJzeXNleGl0cy5oIgorI2luY2x1ZGUgInN5c2x4b3B0LmgiCisjaW5jbHVkZSAic3lzbHhpbnQuaCIKKyNpbmNsdWRlICJzeXNseGZzLmgiCisKK2NoYXIgKnByb2dyYW0gPSAic3lzbGludXguY29tIjsJCS8qIE5hbWUgb2YgcHJvZ3JhbSAqLwordWludDE2X3QgZG9zX3ZlcnNpb247CisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgZHByaW50ZiBwcmludGYKK3ZvaWQgcGF1c2Uodm9pZCkKK3sKKyAgICB1aW50MTZfdCBheDsKKworICAgIGFzbSB2b2xhdGlsZSgiaW50ICQweDE2IiA6ICI9YSIgKGF4KSA6ICJhIiAoMCkpOworfQorI2Vsc2UKKyMgZGVmaW5lIGRwcmludGYoLi4uKSAoKHZvaWQpMCkKKyMgZGVmaW5lIHBhdXNlKCkgKCh2b2lkKTApCisjZW5kaWYKKwordm9pZCB1bmxvY2tfZGV2aWNlKGludCk7CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkgZGllKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICB1bmxvY2tfZGV2aWNlKDApOworICAgIHB1dHMoInN5c2xpbnV4OiAiKTsKKyAgICBwdXRzKG1zZyk7CisgICAgcHV0Y2hhcignXG4nKTsKKyAgICBleGl0KDEpOworfQorCit2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqbXNnKQoreworICAgIHB1dHMoInN5c2xpbnV4OiB3YXJuaW5nOiAiKTsKKyAgICBwdXRzKG1zZyk7CisgICAgcHV0Y2hhcignXG4nKTsKK30KKworLyoKKyAqIHJlYWQvd3JpdGUgd3JhcHBlciBmdW5jdGlvbnMKKyAqLworaW50IGNyZWF0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbW9kZSkKK3sKKyAgICB1aW50MTZfdCBydjsKKyAgICB1aW50OF90IGVycjsKKworICAgIGRwcmludGYoImNyZWF0KFwiJXNcIiwgMHgleClcbiIsIGZpbGVuYW1lLCBtb2RlKTsKKworICAgIHJ2ID0gMHgzQzAwOworICAgIGFzbSB2b2xhdGlsZSAoImludCAkMHgyMSA7IHNldGMgJTAiCisJCSAgOiAiPWJjZG0iIChlcnIpLCAiK2EiIChydikKKwkJICA6ICJjIiAobW9kZSksICJkIiAoZmlsZW5hbWUpKTsKKyAgICBpZiAoZXJyKSB7CisJZHByaW50ZigicnYgPSAlZFxuIiwgcnYpOworCWRpZSgiY2Fubm90IG9wZW4gbGRsaW51eC5zeXMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gcnY7Cit9CisKK3ZvaWQgY2xvc2UoaW50IGZkKQoreworICAgIHVpbnQxNl90IHJ2ID0gMHgzRTAwOworCisgICAgZHByaW50ZigiY2xvc2UoJWQpXG4iLCBmZCk7CisKKyAgICBhc20gdm9sYXRpbGUgKCJpbnQgJDB4MjEiOiIrYSIgKHJ2KQorCQkgIDoiYiIoZmQpKTsKKworICAgIC8qIFRoZSBvbmx5IGVycm9yIE1TLURPUyByZXR1cm5zIGZvciBjbG9zZSBpcyBFQkFERiwKKyAgICAgICBhbmQgd2UgcmVhbGx5IGRvbid0IGNhcmUuLi4gKi8KK30KKworaW50IHJlbmFtZShjb25zdCBjaGFyICpvbGRuYW1lLCBjb25zdCBjaGFyICpuZXduYW1lKQoreworICAgIHVpbnQxNl90IHJ2ID0gMHg1NjAwOwkvKiBBbHNvIHN1cHBvcnQgNDNGRmg/ICovCisgICAgdWludDhfdCBlcnI7CisKKyAgICBkcHJpbnRmKCJyZW5hbWUoXCIlc1wiLCBcIiVzXCIpXG4iLCBvbGRuYW1lLCBuZXduYW1lKTsKKworICAgIGFzbSB2b2xhdGlsZSAoImludCAkMHgyMSA7IHNldGMgJTAiOiI9YmNkbSIgKGVyciksICIrYSIocnYpCisJCSAgOiJkIihvbGRuYW1lKSwgIkQiKG5ld25hbWUpKTsKKworICAgIGlmIChlcnIpIHsKKwlkcHJpbnRmKCJydiA9ICVkXG4iLCBydik7CisJd2FybmluZygiY2Fubm90IG1vdmUgbGRsaW51eC5zeXMiKTsKKwlyZXR1cm4gcnY7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3NzaXplX3Qgd3JpdGVfZmlsZV9zbChpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgX3NsaW1nICpidWYsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgdWludDMyX3QgZmlsZXBvcyA9IDA7CisgICAgdWludDE2X3QgcnY7CisgICAgdWludDhfdCBlcnI7CisKKyAgICB3aGlsZSAoZmlsZXBvcyA8IGxlbikgeworCXVpbnQxNl90IHNlZyA9ICgoc2l6ZV90KWJ1ZiA+PiA0KSArIGRzKCk7CisJdWludDE2X3Qgb2Zmc2V0ID0gKHNpemVfdClidWYgJiAxNTsKKwl1aW50MzJfdCBjaHVuayA9IGxlbiAtIGZpbGVwb3M7CisJaWYgKGNodW5rID4gMzI3NjggLSBvZmZzZXQpCisJICAgIGNodW5rID0gMzI3NjggLSBvZmZzZXQ7CisJYXNtIHZvbGF0aWxlICgicHVzaHcgJSVkcyA7ICIKKwkJICAgICAgIm1vdncgJTYsJSVkcyA7ICIKKwkJICAgICAgImludCAkMHgyMSA7ICIKKwkJICAgICAgInBvcHcgJSVkcyA7ICIgInNldGMgJTAiOiI9YmNkbSIgKGVyciksICI9YSIocnYpCisJCSAgICAgIDoiYSIoMHg0MDAwKSwgImIiKGZkKSwgImMiKGNodW5rKSwgImQiIChvZmZzZXQpLAorCQkgICAgICAgIlNEIiAoc2VnKSk7CisJaWYgKGVyciB8fCBydiA9PSAwKQorCSAgICBkaWUoImZpbGUgd3JpdGUgZXJyb3IiKTsKKwlmaWxlcG9zICs9IHJ2OworCWJ1ZiArPSBydjsKKyAgICB9CisKKyAgICByZXR1cm4gZmlsZXBvczsKK30KKworc3NpemVfdCB3cml0ZV9maWxlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgdWludDE2X3QgcnY7CisgICAgc3NpemVfdCBkb25lID0gMDsKKyAgICB1aW50OF90IGVycjsKKworICAgIGRwcmludGYoIndyaXRlX2ZpbGUoJWQsJXAsJXUpXG4iLCBmZCwgYnVmLCBjb3VudCk7CisKKyAgICB3aGlsZSAoY291bnQpIHsKKwlhc20gdm9sYXRpbGUgKCJpbnQgJDB4MjEgOyBzZXRjICUwIjoiPWJjZG0iIChlcnIpLCAiPWEiKHJ2KQorCQkgICAgICA6ImEiKDB4NDAwMCksICJiIihmZCksICJjIihjb3VudCksICJkIihidWYpKTsKKwlpZiAoZXJyIHx8IHJ2ID09IDApCisJICAgIGRpZSgiZmlsZSB3cml0ZSBlcnJvciIpOworCisJZG9uZSArPSBydjsKKwljb3VudCAtPSBydjsKKyAgICB9CisKKyAgICByZXR1cm4gZG9uZTsKK30KKwordm9pZCB3cml0ZV9kZXZpY2UoaW50IGRyaXZlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBuc2VjcywgdW5zaWduZWQgaW50IHNlY3RvcikKK3sKKyAgICB1aW50MTZfdCBlcnJudW0gPSAweDAwMDE7CisgICAgc3RydWN0IGRpc2tpbyBkaW87CisKKyAgICBkcHJpbnRmKCJ3cml0ZV9kZXZpY2UoJWQsJXAsJXUsJXUpXG4iLCBkcml2ZSwgYnVmLCBuc2Vjcywgc2VjdG9yKTsKKworICAgIGRpby5zdGFydHNlY3RvciA9IHNlY3RvcjsKKyAgICBkaW8uc2VjdG9ycyA9IG5zZWNzOworICAgIGRpby5idWZvZmZzID0gKHVpbnRwdHJfdCkgYnVmOworICAgIGRpby5idWZzZWcgPSBkcygpOworCisgICAgaWYgKGRvc192ZXJzaW9uID49IDB4MDcwYSkgeworCS8qIFRyeSBGQVQzMi1hd2FyZSBzeXN0ZW0gY2FsbCBmaXJzdCAqLworCWFzbSB2b2xhdGlsZSgiaW50ICQweDIxIDsgamMgMWYgOyB4b3J3ICUwLCUwXG4iCisJCSAgICAgIjE6IgorCQkgICAgIDogIj1hIiAoZXJybnVtKQorCQkgICAgIDogImEiICgweDczMDUpLCAiYiIgKCZkaW8pLCAiYyIgKC0xKSwgImQiIChkcml2ZSksCisJCSAgICAgICAiUyIgKDEpLCAibSIgKGRpbykKKwkJICAgICA6ICJtZW1vcnkiKTsKKwlkcHJpbnRmKCIgcnYoNzMwNSkgPSAlMDR4IiwgZXJybnVtKTsKKyAgICB9CisKKyAgICAvKiBJZiBub3Qgc3VwcG9ydGVkLCB0cnkgdGhlIGxlZ2FjeSBzeXN0ZW0gY2FsbCAoaW50MjUyNi5TKSAqLworICAgIGlmIChlcnJudW0gPT0gMHgwMDAxKQorCWVycm51bSA9IGludDI2X3dyaXRlX3NlY3Rvcihkcml2ZSwgJmRpbyk7CisKKyAgICBpZiAoZXJybnVtKSB7CisJZHByaW50ZigicnYgPSAlMDR4XG4iLCBlcnJudW0pOworCWRpZSgic2VjdG9yIHdyaXRlIGVycm9yIik7CisgICAgfQorfQorCit2b2lkIHJlYWRfZGV2aWNlKGludCBkcml2ZSwgdm9pZCAqYnVmLCBzaXplX3QgbnNlY3MsIHVuc2lnbmVkIGludCBzZWN0b3IpCit7CisgICAgdWludDE2X3QgZXJybnVtID0gMHgwMDAxOworICAgIHN0cnVjdCBkaXNraW8gZGlvOworCisgICAgZHByaW50ZigicmVhZF9kZXZpY2UoJWQsJXAsJXUsJXUpXG4iLCBkcml2ZSwgYnVmLCBuc2Vjcywgc2VjdG9yKTsKKworICAgIGRpby5zdGFydHNlY3RvciA9IHNlY3RvcjsKKyAgICBkaW8uc2VjdG9ycyA9IG5zZWNzOworICAgIGRpby5idWZvZmZzID0gKHVpbnRwdHJfdCkgYnVmOworICAgIGRpby5idWZzZWcgPSBkcygpOworCisgICAgaWYgKGRvc192ZXJzaW9uID49IDB4MDcwYSkgeworCS8qIFRyeSBGQVQzMi1hd2FyZSBzeXN0ZW0gY2FsbCBmaXJzdCAqLworCWFzbSB2b2xhdGlsZSgiaW50ICQweDIxIDsgamMgMWYgOyB4b3J3ICUwLCUwXG4iCisJCSAgICAgIjE6IgorCQkgICAgIDogIj1hIiAoZXJybnVtKQorCQkgICAgIDogImEiICgweDczMDUpLCAiYiIgKCZkaW8pLCAiYyIgKC0xKSwgImQiIChkcml2ZSksCisJCSAgICAgICAiUyIgKDApLCAibSIgKGRpbykpOworCWRwcmludGYoIiBydig3MzA1KSA9ICUwNHgiLCBlcnJudW0pOworICAgIH0KKworICAgIC8qIElmIG5vdCBzdXBwb3J0ZWQsIHRyeSB0aGUgbGVnYWN5IHN5c3RlbSBjYWxsIChpbnQyNTI2LlMpICovCisgICAgaWYgKGVycm51bSA9PSAweDAwMDEpCisJZXJybnVtID0gaW50MjVfcmVhZF9zZWN0b3IoZHJpdmUsICZkaW8pOworCisgICAgaWYgKGVycm51bSkgeworCWRwcmludGYoInJ2ID0gJTA0eFxuIiwgZXJybnVtKTsKKwlkaWUoInNlY3RvciByZWFkIGVycm9yIik7CisgICAgfQorfQorCisvKiBCb3RoIHRyYWRpdGlvbmFsIERPUyBhbmQgRkFUMzIgRE9TIHJldHVybiB0aGlzIHN0cnVjdHVyZSwgYnV0CisgICBGQVQzMiByZXR1cm4gYSBsb3QgbW9yZSBkYXRhLCBzbyBtYWtlIHN1cmUgd2UgaGF2ZSBwbGVudHkgb2Ygc3BhY2UgKi8KK3N0cnVjdCBkZXZpY2VwYXJhbXMgeworICAgIHVpbnQ4X3Qgc3BlY2Z1bmM7CisgICAgdWludDhfdCBkZXZ0eXBlOworICAgIHVpbnQxNl90IGRldmF0dHI7CisgICAgdWludDE2X3QgY3lsaW5kZXJzOworICAgIHVpbnQ4X3QgbWVkaWF0eXBlOworICAgIHVpbnQxNl90IGJ5dGVzcGVyc2VjOworICAgIHVpbnQ4X3Qgc2VjcGVyY2x1c3Q7CisgICAgdWludDE2X3QgcmVzc2VjdG9yczsKKyAgICB1aW50OF90IGZhdHM7CisgICAgdWludDE2X3Qgcm9vdGRpcmVudHM7CisgICAgdWludDE2X3Qgc2VjdG9yczsKKyAgICB1aW50OF90IG1lZGlhOworICAgIHVpbnQxNl90IGZhdHNlY3M7CisgICAgdWludDE2X3Qgc2VjcGVydHJhY2s7CisgICAgdWludDE2X3QgaGVhZHM7CisgICAgdWludDMyX3QgaGlkZGVuc2VjczsKKyAgICB1aW50MzJfdCBodWdlc2VjdG9yczsKKyAgICB1aW50OF90IGxvdHNvZnBhZGRpbmdbMjI0XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCit1aW50MzJfdCBnZXRfcGFydGl0aW9uX29mZnNldChpbnQgZHJpdmUpCit7CisgICAgdWludDhfdCBlcnI7CisgICAgdWludDE2X3QgcnY7CisgICAgc3RydWN0IGRldmljZXBhcmFtcyBkcDsKKworICAgIGRwLnNwZWNmdW5jID0gMTsJCS8qIEdldCBjdXJyZW50IGluZm9ybWF0aW9uICovCisKKyAgICBydiA9IDB4NDQwZDsKKyAgICBhc20gdm9sYXRpbGUgKCJpbnQgJDB4MjEgOyBzZXRjICUwIgorCQkgIDoiPWFiY2RtIiAoZXJyKSwgIithIihydiksICI9bSIoZHApCisJCSAgOiJiIiAoZHJpdmUpLCAiYyIgKDB4MDg2MCksICJkIiAoJmRwKSk7CisKKyAgICBpZiAoIWVycikKKwlyZXR1cm4gZHAuaGlkZGVuc2VjczsKKworICAgIHJ2ID0gMHg0NDBkOworICAgIGFzbSB2b2xhdGlsZSAoImludCAkMHgyMSA7IHNldGMgJTAiCisJCSAgOiAiPWFiY2RtIiAoZXJyKSwgIithIiAocnYpLCAiPW0iIChkcCkKKwkJICA6ICJiIiAoZHJpdmUpLCAiYyIgKDB4NDg2MCksICJkIiAoJmRwKSk7CisKKyAgICBpZiAoIWVycikKKwlyZXR1cm4gZHAuaGlkZGVuc2VjczsKKworICAgIGRpZSgiY291bGQgbm90IGZpbmQgcGFydGl0aW9uIHN0YXJ0IG9mZnNldCIpOworfQorCitzdHJ1Y3QgcndibG9jayB7CisgICAgdWludDhfdCBzcGVjaWFsOworICAgIHVpbnQxNl90IGhlYWQ7CisgICAgdWludDE2X3QgY3lsaW5kZXI7CisgICAgdWludDE2X3QgZmlyc3RzZWN0b3I7CisgICAgdWludDE2X3Qgc2VjdG9yczsKKyAgICB1aW50MTZfdCBidWZmZXJvZmZzZXQ7CisgICAgdWludDE2X3QgYnVmZmVyc2VnOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBzdHJ1Y3QgcndibG9jayBtYnIgPSB7CisgICAgLnNwZWNpYWwgPSAwLAorICAgIC5oZWFkID0gMCwKKyAgICAuY3lsaW5kZXIgPSAwLAorICAgIC5maXJzdHNlY3RvciA9IDAsCQkvKiBNUy1ET1MsIHVubGlrZSB0aGUgQklPUywgemVyby1iYXNlIHNlY3RvcnMgKi8KKyAgICAuc2VjdG9ycyA9IDEsCisgICAgLmJ1ZmZlcm9mZnNldCA9IDAsCisgICAgLmJ1ZmZlcnNlZyA9IDAKK307CisKK3ZvaWQgd3JpdGVfbWJyKGludCBkcml2ZSwgY29uc3Qgdm9pZCAqYnVmKQoreworICAgIHVpbnQxNl90IHJ2OworICAgIHVpbnQ4X3QgZXJyOworCisgICAgZHByaW50Zigid3JpdGVfbWJyKCVkLCVwKSIsIGRyaXZlLCBidWYpOworCisgICAgbWJyLmJ1ZmZlcm9mZnNldCA9ICh1aW50cHRyX3QpIGJ1ZjsKKyAgICBtYnIuYnVmZmVyc2VnID0gZHMoKTsKKworICAgIHJ2ID0gMHg0NDBkOworICAgIGFzbSB2b2xhdGlsZSAoImludCAkMHgyMSA7IHNldGMgJTAiIDogIj1iY2RtIiAoZXJyKSwgIithIihydikKKwkJICA6ImMiKDB4MDg0MSksICJkIigmbWJyKSwgImIiKGRyaXZlKSwgIm0iKG1icikpOworCisgICAgZHByaW50ZigiIHJ2KDA4NDEpID0gJTA0eCIsIHJ2KTsKKyAgICBpZiAoIWVycikgeworCWRwcmludGYoIlxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIHJ2ID0gMHg0NDBkOworICAgIGFzbSB2b2xhdGlsZSAoImludCAkMHgyMSA7IHNldGMgJTAiIDogIj1iY2RtIiAoZXJyKSwgIithIihydikKKwkJICA6ImMiKDB4NDg0MSksICJkIigmbWJyKSwgImIiKGRyaXZlKSwgIm0iKG1icikpOworCisgICAgZHByaW50ZigiIHJ2KDQ4NDEpID0gJTA0eFxuIiwgcnYpOworICAgIGlmIChlcnIpCisJZGllKCJtYnIgd3JpdGUgZXJyb3IiKTsKK30KKwordm9pZCByZWFkX21icihpbnQgZHJpdmUsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBydjsKKyAgICB1aW50OF90IGVycjsKKworICAgIGRwcmludGYoInJlYWRfbWJyKCVkLCVwKSIsIGRyaXZlLCBidWYpOworCisgICAgbWJyLmJ1ZmZlcm9mZnNldCA9ICh1aW50cHRyX3QpIGJ1ZjsKKyAgICBtYnIuYnVmZmVyc2VnID0gZHMoKTsKKworICAgIHJ2ID0gMHg0NDBkOworICAgIGFzbSB2b2xhdGlsZSAoImludCAkMHgyMSA7IHNldGMgJTAiOiI9YWJjZG0iIChlcnIpLCAiK2EiKHJ2KQorCQkgIDoiYyIoMHgwODYxKSwgImQiKCZtYnIpLCAiYiIoZHJpdmUpLCAibSIobWJyKSk7CisKKyAgICBkcHJpbnRmKCIgcnYoMDg2MSkgPSAlMDR4IiwgcnYpOworICAgIGlmICghZXJyKSB7CisJZHByaW50ZigiXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcnYgPSAweDQ0MGQ7CisgICAgYXNtIHZvbGF0aWxlICgiaW50ICQweDIxIDsgc2V0YyAlMCI6Ij1hYmNkbSIgKGVyciksICIrYSIocnYpCisJCSAgOiJjIigweDQ4NjEpLCAiZCIoJm1iciksICJiIihkcml2ZSksICJtIihtYnIpKTsKKworICAgIGRwcmludGYoIiBydig0ODQxKSA9ICUwNHhcbiIsIHJ2KTsKKyAgICBpZiAoZXJyKQorCWRpZSgibWJyIHJlYWQgZXJyb3IiKTsKKworICAgIGRwcmludGYoIkJ5dGVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJICAgICgoY29uc3QgdWludDhfdCAqKWJ1ZilbMF0sCisJICAgICgoY29uc3QgdWludDhfdCAqKWJ1ZilbMV0sCisJICAgICgoY29uc3QgdWludDhfdCAqKWJ1ZilbMl0sCisJICAgICgoY29uc3QgdWludDhfdCAqKWJ1ZilbM10sCisJICAgICgoY29uc3QgdWludDhfdCAqKWJ1ZilbNF0sCisJICAgICgoY29uc3QgdWludDhfdCAqKWJ1ZilbNV0sCisJICAgICgoY29uc3QgdWludDhfdCAqKWJ1ZilbNl0sCisJICAgICgoY29uc3QgdWludDhfdCAqKWJ1ZilbN10pOworfQorCisvKiBUaGlzIGNhbGwgY2FuIGxlZ2l0aW1hdGVseSBmYWlsLCBhbmQgd2UgZG9uJ3QgY2FyZSwgc28gaWdub3JlIGVycm9yIHJldHVybiAqLwordm9pZCBzZXRfYXR0cmlidXRlcyhjb25zdCBjaGFyICpmaWxlLCBpbnQgYXR0cmlidXRlcykKK3sKKyAgICB1aW50MTZfdCBydiA9IDB4NDMwMTsKKworICAgIGRwcmludGYoInNldF9hdHRyaWJ1dGVzKFwiJXNcIiwgMHglMDJ4KVxuIiwgZmlsZSwgYXR0cmlidXRlcyk7CisKKyAgICBhc20gdm9sYXRpbGUgKCJpbnQgJDB4MjEiOiIrYSIgKHJ2KQorCQkgIDoiYyIoYXR0cmlidXRlcyksICJkIihmaWxlKSk7Cit9CisKKy8qCisgKiBWZXJzaW9uIG9mIHRoZSByZWFkX2RldmljZSBmdW5jdGlvbiBzdWl0YWJsZSBmb3IgbGliZmF0CisgKi8KK2ludCBsaWJmYXRfeHByZWFkKGludHB0cl90IHBwLCB2b2lkICpidWYsIHNpemVfdCBzZWNzaXplLAorCQkgIGxpYmZhdF9zZWN0b3JfdCBzZWN0b3IpCit7CisgICAgcmVhZF9kZXZpY2UocHAsIGJ1ZiwgMSwgc2VjdG9yKTsKKyAgICByZXR1cm4gc2Vjc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdldF9kb3NfdmVyc2lvbih2b2lkKQoreworICAgIGRwcmludGYoIkRPUyB2ZXJzaW9uICVkLiVkXG4iLCAoZG9zX3ZlcnNpb24gPj4gOCksIGRvc192ZXJzaW9uICYgMHhmZik7Cit9CisKKy8qIFRoZSBsb2NraW5nIGludGVyZmFjZSByZWxpZXMgb24gc3RhdGljIHZhcmlhYmxlcy4gIEEgbWFzc2l2ZSBoYWNrIDooICovCitzdGF0aWMgdWludDhfdCBsb2NrX2xldmVsLCBsb2NrX2RyaXZlOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xvY2tfZGV2aWNlKHVpbnQ4X3QgZGV2aWNlKQoreworICAgIGxvY2tfbGV2ZWwgID0gMDsKKyAgICBsb2NrX2RyaXZlID0gZGV2aWNlOworfQorCitzdGF0aWMgaW50IGRvX2xvY2sodWludDhfdCBsZXZlbCkKK3sKKyAgICB1aW50MTZfdCBsZXZlbF9hcmcgPSBsb2NrX2RyaXZlICsgKGxldmVsIDw8IDgpOworICAgIHVpbnQxNl90IHJ2OworICAgIHVpbnQ4X3QgZXJyOworI2lmIDAKKyAgICAvKiBET1MgNy4xMCA9IFdpbjk1IE9TUjIgPSBmaXJzdCB2ZXJzaW9uIHdpdGggRkFUMzIgKi8KKyAgICB1aW50MTZfdCBsb2NrX2NhbGwgPSAoZG9zX3ZlcnNpb24gPj0gMHgwNzBhKSA/IDB4NDg0QSA6IDB4MDg0QTsKKyNlbHNlCisgICAgdWludDE2X3QgbG9ja19jYWxsID0gMHgwODRBOyAvKiBNU0ROIHNheXMgdGhpcyBpcyBPSyBmb3IgYWxsIGZpbGVzeXN0ZW1zICovCisjZW5kaWYKKworICAgIGRwcmludGYoIlRyeWluZyBsb2NrICUwNHguLi4gIiwgbGV2ZWxfYXJnKTsKKyAgICBhc20gdm9sYXRpbGUgKCJpbnQgJDB4MjEgOyBzZXRjICUwIgorCQkgIDogIj1iY2RtIiAoZXJyKSwgIj1hIiAocnYpCisJCSAgOiAiYSIgKDB4NDQwZCksICJiIiAobGV2ZWxfYXJnKSwKKwkJICAgICJjIiAobG9ja19jYWxsKSwgImQiICgweDAwMDEpKTsKKyAgICBkcHJpbnRmKCIlcyAlMDR4XG4iLCBlcnIgPyAiZXJyIiA6ICJvayIsIHJ2KTsKKworICAgIHJldHVybiBlcnIgPyBydiA6IDA7Cit9CisKK3ZvaWQgbG9ja19kZXZpY2UoaW50IGxldmVsKQoreworICAgIHN0YXRpYyBpbnQgaGFyZF9sb2NrID0gMDsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKGRvc192ZXJzaW9uIDwgMHgwNzAwKQorCXJldHVybjsJCQkvKiBXaW45eC9OVCBvbmx5ICovCisKKyAgICBpZiAoIWhhcmRfbG9jaykgeworCS8qIEFzc3VtZSBoaWVyYXJjaGlhbCAic29mdCIgbG9ja2luZyBzdXBwb3J0ZWQgKi8KKworCXdoaWxlIChsb2NrX2xldmVsIDwgbGV2ZWwpIHsKKwkgICAgaW50IG5ld19sZXZlbCA9IGxvY2tfbGV2ZWwgKyAxOworCSAgICBlcnIgPSBkb19sb2NrKG5ld19sZXZlbCk7CisJICAgIGlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAweDAwMDEpIHsKKwkJICAgIC8qIFRyeSBoYXJkIGxvY2tpbmcgbmV4dCAqLworCQkgICAgaGFyZF9sb2NrID0gMTsKKwkJfQorCQlnb3RvIHNvZnRfZmFpbDsKKwkgICAgfQorCisJICAgIGxvY2tfbGV2ZWwgPSBuZXdfbGV2ZWw7CisJfQorCXJldHVybjsKKyAgICB9CisKK3NvZnRfZmFpbDoKKyAgICBpZiAoaGFyZF9sb2NrKSB7CisJLyogSGFyZCBsb2NraW5nLCBvbmx5IGxldmVsIDQgc3VwcG9ydGVkICovCisJLyogVGhpcyBpcyBuZWVkZWQgZm9yIFdpbjl4IGluIERPUyBtb2RlICovCisKKwllcnIgPSBkb19sb2NrKDQpOworCWlmIChlcnIpIHsKKwkgICAgaWYgKGVyciA9PSAweDAwMDEpIHsKKwkJLyogQXNzdW1lIGxvY2tpbmcgaXMgbm90IG5lZWRlZCAqLworCQlyZXR1cm47CisJICAgIH0KKwkgICAgZ290byBoYXJkX2ZhaWw7CisJfQorCisJbG9ja19sZXZlbCA9IDQ7CisJcmV0dXJuOworICAgIH0KKworaGFyZF9mYWlsOgorICAgIGRpZSgiY291bGQgbm90IGxvY2sgZGV2aWNlIik7Cit9CisKK3ZvaWQgdW5sb2NrX2RldmljZShpbnQgbGV2ZWwpCit7CisgICAgdWludDE2X3QgcnY7CisgICAgdWludDhfdCBlcnI7CisgICAgdWludDE2X3QgdW5sb2NrX2NhbGw7CisKKyAgICBpZiAoZG9zX3ZlcnNpb24gPCAweDA3MDApCisJcmV0dXJuOwkJCS8qIFdpbjl4L05UIG9ubHkgKi8KKworI2lmIDAKKyAgICAvKiBET1MgNy4xMCA9IFdpbjk1IE9TUjIgPSBmaXJzdCB2ZXJzaW9uIHdpdGggRkFUMzIgKi8KKyAgICB1bmxvY2tfY2FsbCA9IChkb3NfdmVyc2lvbiA+PSAweDA3MGEpID8gMHg0ODZBIDogMHgwODZBOworI2Vsc2UKKyAgICB1bmxvY2tfY2FsbCA9IDB4MDg2QTsJLyogTVNETiBzYXlzIHRoaXMgaXMgT0sgZm9yIGFsbCBmaWxlc3lzdGVtcyAqLworI2VuZGlmCisKKyAgICBpZiAobG9ja19sZXZlbCA9PSA0ICYmIGxldmVsID4gMCkKKwlyZXR1cm47CQkJLyogT25seSBkcm9wIHRoZSBoYXJkIGxvY2sgYXQgdGhlIGVuZCAqLworCisgICAgd2hpbGUgKGxvY2tfbGV2ZWwgPiBsZXZlbCkgeworCXVpbnQ4X3QgbmV3X2xldmVsID0gKGxvY2tfbGV2ZWwgPT0gNCkgPyAwIDogbG9ja19sZXZlbCAtIDE7CisJdWludDE2X3QgbGV2ZWxfYXJnID0gKG5ld19sZXZlbCA8PCA4KSArIGxvY2tfZHJpdmU7CisJcnYgPSAweDQ0MGQ7CisJZHByaW50ZigiVHJ5aW5nIHVubG9jayAlMDR4Li4uICIsIG5ld19sZXZlbCk7CisJYXNtIHZvbGF0aWxlICgiaW50ICQweDIxIDsgc2V0YyAlMCIKKwkJICAgICAgOiAiPWJjZG0iIChlcnIpLCAiK2EiIChydikKKwkJICAgICAgOiAiYiIgKGxldmVsX2FyZyksICJjIiAodW5sb2NrX2NhbGwpKTsKKwlkcHJpbnRmKCIlcyAlMDR4XG4iLCBlcnIgPyAiZXJyIiA6ICJvayIsIHJ2KTsKKwlsb2NrX2xldmVsID0gbmV3X2xldmVsOworICAgIH0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhbnkgZGVzaXJlZCBNQlIgbWFuaXB1bGF0aW9uOyBjYWxsZWQgd2l0aCB0aGUgZGV2aWNlIGxvY2sgaGVsZC4KKyAqLworc3RydWN0IG1icl9lbnRyeSB7CisgICAgdWludDhfdCBhY3RpdmU7CQkvKiBBY3RpdmUgZmxhZyAqLworICAgIHVpbnQ4X3QgYmhlYWQ7CQkvKiBCZWdpbiBoZWFkICovCisgICAgdWludDhfdCBic2VjdG9yOwkJLyogQmVnaW4gc2VjdG9yICovCisgICAgdWludDhfdCBiY3lsaW5kZXI7CQkvKiBCZWdpbiBjeWxpbmRlciAqLworICAgIHVpbnQ4X3QgZmlsZXN5c3RlbTsJCS8qIEZpbGVzeXN0ZW0gdmFsdWUgKi8KKyAgICB1aW50OF90IGVoZWFkOwkJLyogRW5kIGhlYWQgKi8KKyAgICB1aW50OF90IGVzZWN0b3I7CQkvKiBFbmQgc2VjdG9yICovCisgICAgdWludDhfdCBlY3lsaW5kZXI7CQkvKiBFbmQgY3lsaW5kZXIgKi8KKyAgICB1aW50MzJfdCBzdGFydGxiYTsJCS8qIFN0YXJ0IHNlY3RvciBMQkEgKi8KKyAgICB1aW50MzJfdCBzZWN0b3JzOwkJLyogTGVuZ3RoIGluIHNlY3RvcnMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBhZGp1c3RfbWJyKGludCBkZXZpY2UsIGludCB3cml0ZW1iciwgaW50IHNldF9hY3RpdmUpCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgc2VjdGJ1ZltTRUNUT1JfU0laRV07CisgICAgaW50IGk7CisKKyAgICBpZiAoIXdyaXRlbWJyICYmICFzZXRfYWN0aXZlKQorCXJldHVybjsJCQkvKiBOb3RoaW5nIHRvIGRvICovCisKKyAgICByZWFkX21icihkZXZpY2UsIHNlY3RidWYpOworCisgICAgaWYgKHdyaXRlbWJyKSB7CisJbWVtY3B5KHNlY3RidWYsIHN5c2xpbnV4X21iciwgc3lzbGludXhfbWJyX2xlbik7CisJKih1aW50MTZfdCAqKSAoc2VjdGJ1ZiArIDUxMCkgPSAweGFhNTU7CisgICAgfQorCisgICAgaWYgKHNldF9hY3RpdmUpIHsKKwl1aW50MzJfdCBvZmZzZXQgPSBnZXRfcGFydGl0aW9uX29mZnNldChkZXZpY2UpOworCXN0cnVjdCBtYnJfZW50cnkgKm1lID0gKHN0cnVjdCBtYnJfZW50cnkgKikoc2VjdGJ1ZiArIDQ0Nik7CisJaW50IGZvdW5kID0gMDsKKworCWRwcmludGYoIlNlYXJjaGluZyBmb3IgcGFydGl0aW9uIG9mZnNldDogJTA4eFxuIiwgb2Zmc2V0KTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkgICAgaWYgKG1lLT5zdGFydGxiYSA9PSBvZmZzZXQpIHsKKwkJbWUtPmFjdGl2ZSA9IDB4ODA7CisJCWZvdW5kKys7CisJICAgIH0gZWxzZSB7CisJCW1lLT5hY3RpdmUgPSAwOworCSAgICB9CisJICAgIG1lKys7CisJfQorCisJaWYgKGZvdW5kIDwgMSkgeworCSAgICBkaWUoInBhcnRpdGlvbiBub3QgZm91bmQgKC1hIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgbG9naWNhbCBwYXJ0aXRpb25zKSIpOworCX0gZWxzZSBpZiAoZm91bmQgPiAxKSB7CisJICAgIGRpZSgibXVsdGlwbGUgYWxpYXNlZCBwYXJ0aXRpb25zIGZvdW5kIik7CisJfQorICAgIH0KKworICAgIHdyaXRlX21icihkZXZpY2UsIHNlY3RidWYpOworfQorCitzdGF0aWMgdm9pZCBtb3ZlX2ZpbGUoaW50IGRldl9mZCwgY2hhciAqcGF0aG5hbWUsIGNoYXIgKmZpbGVuYW1lKQoreworICAgIGNoYXIgbmV3X25hbWVbMTYwXTsKKyAgICBjaGFyICpjcCA9IG5ld19uYW1lICsgMzsKKyAgICBjb25zdCBjaGFyICpzZDsKKyAgICBpbnQgc2xhc2ggPSAxOworCisgICAgbmV3X25hbWVbMF0gPSBkZXZfZmQgfCAweDQwOworICAgIG5ld19uYW1lWzFdID0gJzonOworICAgIG5ld19uYW1lWzJdID0gJ1xcJzsKKworICAgIGZvciAoc2QgPSBvcHQuZGlyZWN0b3J5OyAqc2Q7IHNkKyspIHsKKwljaGFyIGMgPSAqc2Q7CisKKwlpZiAoYyA9PSAnLycgfHwgYyA9PSAnXFwnKSB7CisJICAgIGlmIChzbGFzaCkKKwkJY29udGludWU7CisJICAgIGMgPSAnXFwnOworCSAgICBzbGFzaCA9IDE7CisJfSBlbHNlIHsKKwkgICAgc2xhc2ggPSAwOworCX0KKworCSpjcCsrID0gYzsKKyAgICB9CisKKyAgICAvKiBTa2lwIGlmIHN1YmRpcmVjdG9yeSA9PSByb290ICovCisgICAgaWYgKGNwID4gbmV3X25hbWUgKyAzKSB7CisJaWYgKCFzbGFzaCkKKwkgICAgKmNwKysgPSAnXFwnOworCisJbWVtY3B5KGNwLCBmaWxlbmFtZSwgMTIpOworCisJc2V0X2F0dHJpYnV0ZXMocGF0aG5hbWUsIDApOworCWlmIChyZW5hbWUocGF0aG5hbWUsIG5ld19uYW1lKSkKKwkgICAgc2V0X2F0dHJpYnV0ZXMocGF0aG5hbWUsIDB4MDcpOworCWVsc2UKKwkgICAgc2V0X2F0dHJpYnV0ZXMobmV3X25hbWUsIDB4MDcpOworICAgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBzZWN0YnVmW1NFQ1RPUl9TSVpFXTsKKyAgICBpbnQgZGV2X2ZkLCBmZDsKKyAgICBzdGF0aWMgY2hhciBsZGxpbnV4X25hbWVbXSA9ICJAOlxcbGRsaW51eC5zeXMiOworICAgIHN0YXRpYyBjaGFyIGxkbGludXhjMzJfbmFtZVtdID0gIkA6XFxsZGxpbnV4LmMzMiI7CisgICAgc3RydWN0IGxpYmZhdF9maWxlc3lzdGVtICpmczsKKyAgICBsaWJmYXRfc2VjdG9yX3QgcywgKnNlY3A7CisgICAgbGliZmF0X3NlY3Rvcl90ICpzZWN0b3JzOworICAgIGludCBsZGxpbnV4X3NlY3RvcnM7CisgICAgaW50MzJfdCBsZGxpbnV4X2NsdXN0ZXI7CisgICAgaW50IG5zZWN0b3JzOworICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKKyAgICBpbnQgaTsKKyAgICBpbnQgcGF0Y2hfc2VjdG9yczsKKyAgICB1bnNpZ25lZCBjaGFyICpkcDsKKworICAgIGRwcmludGYoImFyZ3YgPSAlcFxuIiwgYXJndik7CisgICAgZm9yIChpID0gMDsgaSA8PSBhcmdjOyBpKyspCisJZHByaW50ZigiYXJndlslZF0gPSAlcCA9IFwiJXNcIlxuIiwgaSwgYXJndltpXSwgYXJndltpXSk7CisKKyAgICBnZXRfZG9zX3ZlcnNpb24oKTsKKworICAgIGFyZ3ZbMF0gPSBwcm9ncmFtOworICAgIHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgTU9ERV9TWVNMSU5VWF9ET1NXSU4pOworCisgICAgaWYgKCFvcHQuZGV2aWNlKQorCXVzYWdlKEVYX1VTQUdFLCBNT0RFX1NZU0xJTlVYX0RPU1dJTik7CisgICAgaWYgKG9wdC5zZWN0b3JzIHx8IG9wdC5oZWFkcyB8fCBvcHQucmVzZXRfYWR2IHx8IG9wdC5zZXRfb25jZQorCXx8IChvcHQudXBkYXRlX29ubHkgPiAwKSB8fCBvcHQubWVudV9zYXZlIHx8IG9wdC5vZmZzZXQpIHsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIkF0IGxlYXN0IG9uZSBzcGVjaWZpZWQgb3B0aW9uIG5vdCB5ZXQgaW1wbGVtZW50ZWQiCisJCSIgZm9yIHRoaXMgaW5zdGFsbGVyLlxuIik7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBhbiBBRFYgaW4gbWVtb3J5Li4uIHRoaXMgc2hvdWxkIGJlIHNtYXJ0ZXIuCisgICAgICovCisgICAgc3lzbGludXhfcmVzZXRfYWR2KHN5c2xpbnV4X2Fkdik7CisKKyAgICAvKgorICAgICAqIEZpZ3VyZSBvdXQgd2hpY2ggZHJpdmUgd2UncmUgdGFsa2luZyB0bworICAgICAqLworICAgIGRldl9mZCA9IChvcHQuZGV2aWNlWzBdICYgfjB4MjApIC0gMHg0MDsKKyAgICBpZiAoZGV2X2ZkIDwgMSB8fCBkZXZfZmQgPiAyNiB8fCBvcHQuZGV2aWNlWzFdICE9ICc6JyB8fCBvcHQuZGV2aWNlWzJdKQorCXVzYWdlKEVYX1VTQUdFLCBNT0RFX1NZU0xJTlVYX0RPU1dJTik7CisKKyAgICBzZXRfbG9ja19kZXZpY2UoZGV2X2ZkKTsKKworICAgIGxvY2tfZGV2aWNlKDIpOwkJLyogTWFrZSBzdXJlIHdlIGNhbiBsb2NrIHRoZSBkZXZpY2UgKi8KKyAgICByZWFkX2RldmljZShkZXZfZmQsIHNlY3RidWYsIDEsIDApOworICAgIHVubG9ja19kZXZpY2UoMSk7CisKKyAgICAvKgorICAgICAqIENoZWNrIHRvIHNlZSB0aGF0IHdoYXQgd2UgZ290IHdhcyBpbmRlZWQgYW4gTVMtRE9TIGJvb3Qgc2VjdG9yL3N1cGVyYmxvY2sKKyAgICAgKi8KKyAgICBpZiAoKGVycm1zZyA9IHN5c2xpbnV4X2NoZWNrX2Jvb3RzZWN0KHNlY3RidWYsIE5VTEwpKSkgeworCXVubG9ja19kZXZpY2UoMCk7CisJcHV0cyhlcnJtc2cpOworCXB1dGNoYXIoJ1xuJyk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICBsZGxpbnV4X25hbWVbMF0gPSBkZXZfZmQgfCAweDQwOworICAgIGxkbGludXhjMzJfbmFtZVswXSA9IGRldl9mZCB8IDB4NDA7CisKKyAgICBzZXRfYXR0cmlidXRlcyhsZGxpbnV4X25hbWUsIDApOworICAgIGZkID0gY3JlYXQobGRsaW51eF9uYW1lLCAwKTsJLyogU1lTVEVNIEhJRERFTiBSRUFET05MWSAqLworICAgIHdyaXRlX2ZpbGVfc2woZmQsIHN5c2xpbnV4X2xkbGludXgsIHN5c2xpbnV4X2xkbGludXhfbGVuKTsKKyAgICB3cml0ZV9maWxlKGZkLCBzeXNsaW51eF9hZHYsIDIgKiBBRFZfU0laRSk7CisgICAgY2xvc2UoZmQpOworICAgIHNldF9hdHRyaWJ1dGVzKGxkbGludXhfbmFtZSwgMHgwNyk7CS8qIFNZU1RFTSBISURERU4gUkVBRE9OTFkgKi8KKworICAgIHNldF9hdHRyaWJ1dGVzKGxkbGludXhjMzJfbmFtZSwgMCk7CisgICAgZmQgPSBjcmVhdChsZGxpbnV4YzMyX25hbWUsIDApOwkJLyogU1lTVEVNIEhJRERFTiBSRUFET05MWSAqLworICAgIHdyaXRlX2ZpbGVfc2woZmQsIHN5c2xpbnV4X2xkbGludXhjMzIsIHN5c2xpbnV4X2xkbGludXhjMzJfbGVuKTsKKyAgICBjbG9zZShmZCk7CisgICAgc2V0X2F0dHJpYnV0ZXMobGRsaW51eGMzMl9uYW1lLCAweDA3KTsJLyogU1lTVEVNIEhJRERFTiBSRUFET05MWSAqLworCisgICAgLyoKKyAgICAgKiBOb3csIHVzZSBsaWJmYXQgdG8gY3JlYXRlIGEgYmxvY2sgbWFwLiAgVGhpcyBwcm9iYWJseQorICAgICAqIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHVzZSBpb2N0bCguLi4sRklCTUFQLC4uLikgc2luY2UKKyAgICAgKiB0aGlzIGlzIHN1cHBvc2VkIHRvIGJlIGEgc2ltcGxlLCBwcml2aWxlZ2VkIHZlcnNpb24KKyAgICAgKiBvZiB0aGUgaW5zdGFsbGVyLgorICAgICAqLworICAgIGxkbGludXhfc2VjdG9ycyA9IChzeXNsaW51eF9sZGxpbnV4X2xlbiArIDIgKiBBRFZfU0laRQorCQkgICAgICAgKyBTRUNUT1JfU0laRSAtIDEpID4+IFNFQ1RPUl9TSElGVDsKKyAgICBzZWN0b3JzID0gY2FsbG9jKGxkbGludXhfc2VjdG9ycywgc2l6ZW9mICpzZWN0b3JzKTsKKyAgICBsb2NrX2RldmljZSgyKTsKKyAgICBmcyA9IGxpYmZhdF9vcGVuKGxpYmZhdF94cHJlYWQsIGRldl9mZCk7CisgICAgbGRsaW51eF9jbHVzdGVyID0gbGliZmF0X3NlYXJjaGRpcihmcywgMCwgIkxETElOVVggU1lTIiwgTlVMTCk7CisgICAgc2VjcCA9IHNlY3RvcnM7CisgICAgbnNlY3RvcnMgPSAwOworICAgIHMgPSBsaWJmYXRfY2x1c3RlcnRvc2VjdG9yKGZzLCBsZGxpbnV4X2NsdXN0ZXIpOworICAgIHdoaWxlIChzICYmIG5zZWN0b3JzIDwgbGRsaW51eF9zZWN0b3JzKSB7CisJKnNlY3ArKyA9IHM7CisJbnNlY3RvcnMrKzsKKwlzID0gbGliZmF0X25leHRzZWN0b3IoZnMsIHMpOworICAgIH0KKyAgICBsaWJmYXRfY2xvc2UoZnMpOworCisgICAgLyoKKyAgICAgKiBJZiByZXF1ZXN0ZWQsIG1vdmUgbGRsaW51eC5zeXMKKyAgICAgKi8KKyAgICBpZiAob3B0LmRpcmVjdG9yeSkgeworCW1vdmVfZmlsZShkZXZfZmQsIGxkbGludXhfbmFtZSwgImxkbGludXguc3lzIik7CisJbW92ZV9maWxlKGRldl9mZCwgbGRsaW51eGMzMl9uYW1lLCAibGRsaW51eC5jMzIiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhdGNoIGxkbGludXguc3lzIGFuZCB0aGUgYm9vdCBzZWN0b3IKKyAgICAgKi8KKyAgICBpID0gc3lzbGludXhfcGF0Y2goc2VjdG9ycywgbnNlY3RvcnMsIG9wdC5zdHVwaWRfbW9kZSwgb3B0LnJhaWRfbW9kZSwgb3B0LmRpcmVjdG9yeSwgTlVMTCk7CisgICAgcGF0Y2hfc2VjdG9ycyA9IChpICsgU0VDVE9SX1NJWkUgLSAxKSA+PiBTRUNUT1JfU0hJRlQ7CisKKyAgICAvKgorICAgICAqIE92ZXJ3cml0ZSB0aGUgbm93LXBhdGNoZWQgbGRsaW51eC5zeXMKKyAgICAgKi8KKyAgICAvKiBsb2NrX2RldmljZSgzKTsgLS0gZG9lc24ndCBzZWVtIHRvIGJlIG5lZWRlZCAqLworICAgIGRwID0gc3lzbGludXhfbGRsaW51eDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGF0Y2hfc2VjdG9yczsgaSsrKSB7CisJbWVtY3B5X2Zyb21fc2woc2VjdGJ1ZiwgZHAsIFNFQ1RPUl9TSVpFKTsKKwlkcCArPSBTRUNUT1JfU0laRTsKKwl3cml0ZV9kZXZpY2UoZGV2X2ZkLCBzZWN0YnVmLCAxLCBzZWN0b3JzW2ldKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE11Y2sgd2l0aCB0aGUgTUJSLCBpZiBkZXNpcmVkLCB3aGlsZSB3ZSBob2xkIHRoZSBsb2NrCisgICAgICovCisgICAgYWRqdXN0X21icihkZXZfZmQsIG9wdC5pbnN0YWxsX21iciwgb3B0LmFjdGl2YXRlX3BhcnRpdGlvbik7CisKKyAgICAvKgorICAgICAqIFRvIGZpbmlzaCB1cCwgd3JpdGUgdGhlIGJvb3Qgc2VjdG9yCisgICAgICovCisKKyAgICAvKiBSZWFkIHRoZSBzdXBlcmJsb2NrIGFnYWluIHNpbmNlIGl0IG1pZ2h0IGhhdmUgY2hhbmdlZCB3aGlsZSBtb3VudGVkICovCisgICAgcmVhZF9kZXZpY2UoZGV2X2ZkLCBzZWN0YnVmLCAxLCAwKTsKKworICAgIC8qIENvcHkgdGhlIHN5c2xpbnV4IGNvZGUgaW50byB0aGUgYm9vdCBzZWN0b3IgKi8KKyAgICBzeXNsaW51eF9tYWtlX2Jvb3RzZWN0KHNlY3RidWYsIFZGQVQpOworCisgICAgLyogV3JpdGUgbmV3IGJvb3Qgc2VjdG9yICovCisgICAgaWYgKG9wdC5ib290c2VjZmlsZSkgeworCXVubG9ja19kZXZpY2UoMCk7CisJZmQgPSBjcmVhdChvcHQuYm9vdHNlY2ZpbGUsIDB4MjApOwkvKiBBUkNISVZFICovCisJd3JpdGVfZmlsZShmZCwgc2VjdGJ1ZiwgU0VDVE9SX1NJWkUpOworCWNsb3NlKGZkKTsKKyAgICB9IGVsc2UgeworCXdyaXRlX2RldmljZShkZXZfZmQsIHNlY3RidWYsIDEsIDApOworCXVubG9ja19kZXZpY2UoMCk7CisgICAgfQorCisgICAgLyogRG9uZSEgKi8KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9zdXRpbC9NYWtlZmlsZSBiL2Rvc3V0aWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmYzU4YQotLS0gL2Rldi9udWxsCisrKyBiL2Rvc3V0aWwvTWFrZWZpbGUKQEAgLTAsMCArMSw3MSBAQAorIworIyBPcGVuV2F0Y29tIGNvbXBpbGUgYW5kIGxpbmsgdXRpbGl0eQorIworVlBBVEggPSAkKFNSQykKK2luY2x1ZGUgJChNQUtFRElSKS9zeXNsaW51eC5taworCitXQ0wJPSB3Y2wKK1dDTE9QVAk9IC02IC1vc3ggLW10IC1idD1ET1MgLWw9Q09NCisKK1dDTF9JU19HT09EIDo9ICQoc2hlbGwgJChXQ0wpICQoV0NMT1BUKSBcCisgICAgICAgIC1vIGhlbGxvLmV4ZSAkKFNSQykvLi4vd2luL2hlbGxvLmMgPi9kZXYvbnVsbCAyPiYxIDsgZWNobyAkJD8pCisKK1VQWCAgICAgPSB1cHgKKworTkFTTSAgICA9IG5hc20KK05BU01PUFQgPSAtT3gKKworV0NUQVJHRVRTID0gbWRpc2tjaGsuY29tCitOU1RBUkdFVFMgPSBlbHRvcml0by5zeXMgY29weWJzLmNvbQorV0NPQkpTICAgID0gJChhZGRwcmVmaXggJChTUkMpLywkKFdDVEFSR0VUUykpCitOU09CSlMgICAgPSAkKGFkZHByZWZpeCAkKE9CSikvLCQoTlNUQVJHRVRTKSkKK1RBUkdFVFMgICA9ICQoV0NUQVJHRVRTKSAkKE5TVEFSR0VUUykKKworJS5vYmo6ICUuYworCSQoV0NMKSAkKFdDTE9QVCkgLWMgLWZvPSRAICQ8CisKKyUuY29tOiAlLm9iagorCSQoV0NMKSAkKFdDTE9QVCkgLWZlPSRAICQ8CisJJChVUFgpIC0tdWx0cmEtYnJ1dGUgLS1sem1hICRAIHx8IFwKKwkJJChVUFgpIC0tdWx0cmEtYnJ1dGUgJEAgfHwgXAorCQl0cnVlCisJcm0gLWYgJCouMCoKKwljaG1vZCBhLXggJEAKKworJS5zeXM6ICUuYXNtCisJJChOQVNNKSAkKE5BU01PUFQpIC1mIGJpbiAtbyAkQCAtbCAkKi5sc3QgJDwKKwkkKFVQWCkgLS11bHRyYS1icnV0ZSAtLWx6bWEgJEAgfHwgXAorCQkkKFVQWCkgLS11bHRyYS1icnV0ZSAkQCB8fCBcCisJCXRydWUKKwlybSAtZiAkKi4wKgorCWNobW9kIGEteCAkQAorCislLmNvbTogJS5hc20KKwkkKE5BU00pICQoTkFTTU9QVCkgLWYgYmluIC1vICRAIC1sICQqLmxzdCAkPAorCSQoVVBYKSAtLXVsdHJhLWJydXRlIC0tbHptYSAkQCB8fCBcCisJCSQoVVBYKSAtLXVsdHJhLWJydXRlICRAIHx8IFwKKwkJdHJ1ZQorCXJtIC1mICQqLjAqCisJY2htb2QgYS14ICRACisKK2lmZXEgKCQoV0NMX0lTX0dPT0QpLDApCithbGw6ICQoVEFSR0VUUykKK2Vsc2UKK2FsbDogJChOU1RBUkdFVFMpCisJcm0gLWYgJChXQ1RBUkdFVFMpCitlbmRpZgorCit0aWR5IGRpc3Q6CisJLXJtIC1mICoub2JqICoubHN0ICoubyAqLjAqCisKK2NsZWFuOiB0aWR5CisKK3Nwb3RsZXNzOiBjbGVhbgorCS1ybSAtZiAkKE5TVEFSR0VUUykgKn4KKworaW5zdGFsbGVyOiBhbGwKKworaW5zdGFsbDogaW5zdGFsbGVyCisJbWtkaXIgLW0gNzU1IC1wICQoSU5TVEFMTFJPT1QpJChBVVhESVIpL2Rvc3V0aWwKKwlpbnN0YWxsIC1tIDY0NCAkKFdDT0JKUykgJChJTlNUQUxMUk9PVCkkKEFVWERJUikvZG9zdXRpbAorCWluc3RhbGwgLW0gNjQ0ICQoTlNPQkpTKSAkKElOU1RBTExST09UKSQoQVVYRElSKS9kb3N1dGlsCmRpZmYgLS1naXQgYS9kb3N1dGlsL1JFQURNRSBiL2Rvc3V0aWwvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiN2IyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb3N1dGlsL1JFQURNRQpAQCAtMCwwICsxLDEwIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB1dGlsaXRpZXMgZm9yIHVzZSB1bmRlciBET1MuCitBbHRob3VnaCBub3QgcGFydCBvZiBTeXNsaW51eCBwZXIgc2UsIHRoZXkgbWlnaHQgYmUgdXNlZnVsIHdpdGggTUVNRElTSy4KKworZWx0b3JpdG8uc3lzCS0gR2VuZXJpYyBFbCBUb3JpdG8gQ0QtUk9NIGRyaXZlcgorCQkgIFdyaXR0ZW4gYnkgR2FyeSBUb25nIGFuZCBCYXJ0IExhZ2Vyd2Vpai4KKwkJICBQb3J0ZWQgdG8gTkFTTSBieSBILiBQZXRlciBBbnZpbi4KKworbWRpc2tjaGsuY29tCS0gU2ltcGxlIHByb2dyYW0gdG8gcXVlcnkgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYQorCQkgIE1FTURJU0sgYW5kIGRpc3BsYXkgcGFyYW1ldGVycy4KKwpkaWZmIC0tZ2l0IGEvZG9zdXRpbC9jb3B5YnMuYXNtIGIvZG9zdXRpbC9jb3B5YnMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDA3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb3N1dGlsL2NvcHlicy5hc20KQEAgLTAsMCArMSwyNzEgQEAKKzsgLSotIGZ1bmRhbWVudGFsIC0qLSAoYXNtLW1vZGUgc3Vja3MpCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgQ29weXJpZ2h0IDE5OTgtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzsKKzsgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCis7ICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzsgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKzsKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOworOyBjb3B5YnMuYXNtCis7Cis7IFNtYWxsIERPUyBwcm9ncmFtIHRvIGNvcHkgdGhlIGJvb3Qgc2VjdG9yIGZyb20gYSBkcml2ZQorOyB0byBhIGZpbGUKKzsKKzsgVXNhZ2U6IGNvcHlicyA8ZHJpdmU+OiA8ZmlsZT4KKzsKKworCQlhYnNvbHV0ZSAwCitwc3BJbnQyMDoJCXJlc3cgMQorcHNwTmV4dFBhcmFncmFwaDoJcmVzdyAxCisJCQlyZXNiIDEJCTsgcmVzZXJ2ZWQKK3BzcERpc3BhdGNoZXI6CQlyZXNiIDUKK3BzcFRlcm1pbmF0ZVZlY3RvcjoJcmVzZCAxCitwc3BDb250cm9sQ1ZlY3RvcjoJcmVzZCAxCitwc3BDcml0RXJyb3JWZWN0b3I6CXJlc2QgMQorCQkJcmVzdyAxMQkJOyByZXNlcnZlZAorcHNwRW52aXJvbm1lbnQ6CQlyZXN3IDEKKwkJCXJlc3cgMjMJCTsgcmVzZXJ2ZWQKK3BzcEZDQl8xOgkJcmVzYiAxNgorcHNwRkNCXzI6CQlyZXNiIDE2CisJCQlyZXNkIDEJCTsgcmVzZXJ2ZWQKK3BzcENvbW1hbmRMZW46CQlyZXNiIDEKK3BzcENvbW1hbmRBcmc6CQlyZXNiIDEyNworCisJCXNlY3Rpb24gLnRleHQKKwkJb3JnIDEwMGgJCQk7IC5DT00gZm9ybWF0Citfc3RhcnQ6CisJCW1vdiBheCwzMDAwaAkJCTsgR2V0IERPUyB2ZXJzaW9uCisJCWludCAyMWgKKwkJeGNoZyBhbCxhaAorCQltb3YgW0RPU1ZlcnNpb25dLGF4CisJCWNtcCBheCwwMjAwaAkJCTsgRE9TIDIuMDAgbWluaW11bQorCQlqYWUgZG9zdmVyX29rCisJCW1vdiBkeCxtc2dfYW5jaWVudF9lcnIKKwkJam1wIGRpZQorCisJCXNlY3Rpb24gLmJzcworCQlhbGlnbmIgMgorRE9TVmVyc2lvbjoJcmVzdyAxCisKKwkJc2VjdGlvbiAudGV4dAorOworOyBTY2FuIGNvbW1hbmQgbGluZSBmb3IgYSBkcml2ZSBsZXR0ZXIgZm9sbG93ZWQgYnkgYSBjb2xvbgorOworZG9zdmVyX29rOgorCQl4b3IgY3gsY3gKKwkJbW92IHNpLHBzcENvbW1hbmRBcmcKKwkJbW92IGNsLFtwc3BDb21tYW5kTGVuXQorCitjbWRzY2FuMToJamN4eiBiYWRfdXNhZ2UJCQk7IEVuZCBvZiBjb21tYW5kIGxpbmU/CisJCWxvZHNiCQkJCTsgTG9hZCBjaGFyYWN0ZXIKKwkJZGVjIGN4CisJCWNtcCBhbCwnICcJCQk7IFdoaXRlIHNwYWNlCisJCWpiZSBjbWRzY2FuMQorCQlvciBhbCwwMjBoCQkJOyAtPiBsb3dlciBjYXNlCisJCWNtcCBhbCwnYScJCQk7IENoZWNrIGZvciBsZXR0ZXIKKwkJamIgYmFkX3VzYWdlCisJCWNtcCBhbCwneicKKwkJamEgYmFkX3VzYWdlCisJCXN1YiBhbCwnYScJCQk7IENvbnZlcnQgdG8gemVyby1iYXNlZCBpbmRleAorCQltb3YgW0RyaXZlTm9dLGFsCQk7IFNhdmUgYXdheSBkcml2ZSBpbmRleAorCisJCXNlY3Rpb24gLmJzcworRHJpdmVObzoJcmVzYiAxCisKKwkJc2VjdGlvbiAudGV4dAorOworOyBHb3QgdGhlIGxlYWRpbmcgbGV0dGVyLCBub3cgdGhlIG5leHQgY2hhcmFjdGVyIG11c3QgYmUgYSBjb2xvbgorOworZ290X2xldHRlcjoJamN4eiBiYWRfdXNhZ2UKKwkJbG9kc2IKKwkJZGVjIGN4CisJCWNtcCBhbCwnOicKKwkJam5lIGJhZF91c2FnZQorOworOyBHb3QgdGhlIGNvbG9uOyBub3cgd2Ugc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIHdoaXRlc3BhY2UKKzsgZm9sbG93ZWQgYnkgYSBmaWxlbmFtZQorOworZ290X2NvbG9uOglqY3h6IGJhZF91c2FnZQorCQlsb2RzYgorCQlkZWMgY3gKKwkJY21wIGFsLCcgJworCQlqYSBiYWRfdXNhZ2UKKworc2tpcHNwYWNlOglqY3h6IGJhZF91c2FnZQorCQlsb2RzYgorCQlkZWMgY3gKKwkJY21wIGFsLCcgJworCQlqYmUgc2tpcHNwYWNlCisKKwkJbW92IGRpLEZpbGVOYW1lCitjb3B5ZmlsZToJc3Rvc2IKKwkJamN4eiBnb3RfY21kbGluZQorCQlsb2RzYgorCQlkZWMgY3gKKwkJY21wIGFsLCcgJworCQlqYSBjb3B5ZmlsZQorCQlqbXAgc2hvcnQgZ290X2NtZGxpbmUKKworOworOyBXZSBlbmQgdXAgaGVyZSBpZiB0aGUgY29tbWFuZCBsaW5lIGRvZXNuJ3QgcGFyc2UKKzsKK2JhZF91c2FnZToJbW92IGR4LG1zZ191bmZhaXIKKwkJam1wIGRpZQorCisJCXNlY3Rpb24gLmRhdGEKK21zZ191bmZhaXI6CWRiICdVc2FnZTogY29weWJzIDxkcml2ZT46IDxmaWxlbmFtZT4nLCAwRGgsIDBBaCwgJyQnCisKKwkJc2VjdGlvbiAuYnNzCisJCWFsaWduYiA0CitGaWxlTmFtZQlyZXNiIDI1NgorCis7Cis7IFBhcnNlZCB0aGUgY29tbWFuZCBsaW5lIE9LLiAgR2V0IGRldmljZSBwYXJhbWV0ZXIgYmxvY2sgdG8gZ2V0IHRoZQorOyBzZWN0b3Igc2l6ZS4KKzsKKwkJc3RydWMgRFBCCitkcGJEcml2ZToJcmVzYiAxCitkcGJVbml0OglyZXNiIDEKK2RwYlNlY3RvclNpemU6CXJlc3cgMQorZHBiQ2x1c3Rlck1hc2s6CXJlc2IgMQorZHBiQ2x1c3RlclNoaWZ0OiByZXNiIDEKK2RwYkZpcnN0RkFUOglyZXN3IDEKK2RwYkZBVENvdW50OglyZXNiIDEKK2RwYlJvb3RFbnRyaWVzOglyZXN3IDEKK2RwYkZpcnN0U2VjdG9yOglyZXN3IDEKK2RwYk1heENsdXN0ZXI6CXJlc3cgMQorZHBiRkFUU2l6ZToJcmVzdyAxCitkcGJEaXJTZWN0b3I6CXJlc3cgMQorZHBiRHJpdmVyQWRkcjoJcmVzZCAxCitkcGJNZWRpYToJcmVzYiAxCitkcGJGaXJzdEFjY2VzczoJcmVzYiAxCitkcGJOZXh0RFBCOglyZXNkIDEKK2RwYk5leHRGcmVlOglyZXN3IDEKK2RwYkZyZWVDbnQ6CXJlc3cgMQorCQllbmRzdHJ1YworCisJCXNlY3Rpb24gLmJzcworCQlhbGlnbmIgMgorU2VjdG9yU2l6ZQlyZXN3IDEKKworCQlzZWN0aW9uIC50ZXh0Citnb3RfY21kbGluZToKKwkJeG9yIGFsLGFsCQkJOyBaZXJvLXRlcm1pbmF0ZSBmaWxlbmFtZQorCQlzdG9zYgorCisJCW1vdiBkbCxbRHJpdmVOb10KKwkJaW5jIGRsCQkJCTsgMS1iYXNlZAorCQltb3YgYWgsMzJoCisJCWludCAyMWgJCQkJOyBHZXQgRHJpdmUgUGFyYW1ldGVyIEJsb2NrCisKKwkJYW5kIGFsLGFsCisJCWpueiBmaWxlc3lzdGVtX2Vycm9yCisKKwkJbW92IGR4LFtieCtkcGJTZWN0b3JTaXplXQk7IFNhdmUgc2VjdG9yIHNpemUKKzsKKzsgUmVhZCB0aGUgYm9vdCBzZWN0b3IuCis7CisJCXNlY3Rpb24gLmRhdGEKKwkJYWxpZ24gNCwgZGIgMAorRElTS0lPCQllcXUgJAorZGlTdGFydFNlY3RvcjoJZGQgMAkJCQk7IEFic29sdXRlIHNlY3RvciAwCitkaVNlY3RvcnM6CWR3IDEJCQkJOyBPbmUgc2VjdG9yCitkaUJ1ZmZlcjoJZHcgU2VjdG9yQnVmZmVyCQkJOyBCdWZmZXIgb2Zmc2V0CisJCWR3IDAJCQkJOyBCdWZmZXIgc2VnbWVudAorCisJCXNlY3Rpb24gLnRleHQKK3JlYWRfYm9vdHNlY3Q6CisJCW1vdiBheCxjcwkJCTsgU2V0IERTIDwtIENTCisJCW1vdiBkcyxheAorCisJCW1vdiBbU2VjdG9yU2l6ZV0sZHgJCTsgU2F2ZWQgc2VjdG9yIHNpemUgZnJvbSBhYm92ZQorCisJCWNtcCB3b3JkIFtET1NWZXJzaW9uXSwwNDAwaAk7IERPUyA0LjAwIGhhcyBhIG5ldyBpbnRlcmZhY2UKKwkJamFlIC5uZXcKKy5vbGQ6CisJCW1vdiBieCxTZWN0b3JCdWZmZXIKKwkJbW92IGN4LDEJCQk7IE9uZSBzZWN0b3IKKwkJam1wIHNob3J0IC5jb21tb24KKy5uZXc6CisJCW1vdiBbZGlCdWZmZXIrMl0sYXgJCTsgPT0gRFMKKwkJbW92IGJ4LERJU0tJTworCQltb3YgY3gsLTEKKy5jb21tb246CisJCXhvciBkeCxkeAkJCTsgQWJzb2x1dGUgc2VjdG9yIDAKKwkJbW92IGFsLFtEcml2ZU5vXQorCQlpbnQgMjVoCQkJCTsgRE9TIGFic29sdXRlIGRpc2sgcmVhZAorCQlwb3AgYXgJCQkJOyBSZW1vdmUgZmxhZ3MgZnJvbSBzdGFjaworCQlqYyBkaXNrX3JlYWRfZXJyb3IKKworOworOyBPcGVuIHRoZSBmaWxlIGFuZCB3cml0ZSB0aGUgYm9vdCBzZWN0b3IgdG8gdGhlIGZpbGUuCis7CisJCW1vdiBkeCxGaWxlTmFtZQorCQltb3YgY3gsMDAyMGgJCQk7IEF0dHJpYnV0ZSA9IEFSQ0hJVkUKKwkJbW92IGFoLDNDaAkJCTsgQ3JlYXRlIGZpbGUKKwkJaW50IDIxaAorCQlqYyBmaWxlX3dyaXRlX2Vycm9yCisKKwkJbW92IGJ4LGF4CisJCXB1c2ggYXgJCQkJOyBIYW5kbGUKKworCQltb3YgY3gsW1NlY3RvclNpemVdCisJCW1vdiBkeCxTZWN0b3JCdWZmZXIKKwkJbW92IGFoLDQwaAkJCTsgV3JpdGUgZmlsZQorCQlpbnQgMjFoCisJCWpjIGZpbGVfd3JpdGVfZXJyb3IKKwkJY21wIGF4LFtTZWN0b3JTaXplXQorCQlqbmUgZmlsZV93cml0ZV9lcnJvcgorCisJCXBvcCBieAkJCQk7IEhhbmRsZQorCQltb3YgYWgsM0VoCQkJOyBDbG9zZSBmaWxlCisJCWludCAyMWgKKwkJamMgZmlsZV93cml0ZV9lcnJvcgorOworOyBXZSdyZSBkb25lIQorOworCQltb3YgYXgsNEMwMGgJCQk7IGV4aXQoMCkKKwkJaW50IDIxaAorCis7Cis7IEVycm9yIHJvdXRpbmUganVtcAorOworZmlsZXN5c3RlbV9lcnJvcjoKKwkJbW92IGR4LG1zZ19maWxlc3lzdGVtX2VycgorCQlqbXAgc2hvcnQgZGllCitkaXNrX3JlYWRfZXJyb3I6CisJCW1vdiBkeCxtc2dfcmVhZF9lcnIKKwkJam1wIHNob3J0IGRpZQorZmlsZV93cml0ZV9lcnJvcjoKKwkJbW92IGR4LG1zZ193cml0ZV9lcnIKK2RpZToKKwkJcHVzaCBjcworCQlwb3AgZHMKKwkJcHVzaCBkeAorCQltb3YgZHgsbXNnX2Vycm9yCisJCW1vdiBhaCwwOWgKKwkJaW50IDIxaAorCQlwb3AgZHgKKworCQltb3YgYWgsMDloCQkJOyBXcml0ZSBzdHJpbmcKKwkJaW50IDIxaAorCisJCW1vdiBheCw0QzAxaAkJCTsgRXhpdCBlcnJvciBzdGF0dXMKKwkJaW50IDIxaAorCisJCXNlY3Rpb24gLmRhdGEKK21zZ19lcnJvcjoJCWRiICdFUlJPUjogJCcKK21zZ19hbmNpZW50X2VycjoJZGIgJ0RPUyB2ZXJzaW9uIDIuMDAgb3IgbGF0ZXIgcmVxdWlyZWQnLCAwRGgsIDBBaCwgJyQnCittc2dfZmlsZXN5c3RlbV9lcnI6CWRiICdGaWxlc3lzdGVtIG5vdCBmb3VuZCBvbiBkaXNrJywgMERoLCAwQWgsICckJworbXNnX3JlYWRfZXJyOgkJZGIgJ0Jvb3Qgc2VjdG9yIHJlYWQgZmFpbGVkJywgMERoLCAwQWgsICckJworbXNnX3dyaXRlX2VycjoJCWRiICdGaWxlIHdyaXRlIGZhaWxlZCcsIDBEaCwgMEFoLCAnJCcKKworCQlzZWN0aW9uIC5ic3MKKwkJYWxpZ25iIDQKK1NlY3RvckJ1ZmZlcjoJcmVzYiA0MDk2CmRpZmYgLS1naXQgYS9kb3N1dGlsL2VsdG9yaXRvLmFzbSBiL2Rvc3V0aWwvZWx0b3JpdG8uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjZiNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb3N1dGlsL2VsdG9yaXRvLmFzbQpAQCAtMCwwICsxLDEwOTkgQEAKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVsVG9yaXRvLmFzbQorOworOyBFbCBUb3JpdG8gQm9vdGFibGUgQ0QtUk9NIGRyaXZlciB3aGljaCBkb2VzIG5vdCByZXNldCB0aGUgQ0QtUk9NIGRyaXZlIHVwb24KKzsgbG9hZGluZywgYnV0IGluc3RlYWQgYWNjZXNzZXMgdGhlIGRyaXZlIHRocm91Z2ggQklPUyBzeXN0ZW0gY2FsbHMKKzsKKzsgTUlUIExpY2Vuc2UKKzsKKzsgKGMpIDIwMDAgYnkgR2FyeSBUb25nCis7IChjKSAyMDAxLTIwMDkgYnkgQmFydCBMYWdlcndlaWoKKzsKKzsgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorOyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorOyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCis7IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKzsgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCis7IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cis7Cis7IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCis7IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorOworOyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorOyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKzsgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCis7IEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKzsgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKzsgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorOyBUSEUgU09GVFdBUkUuCis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOyBUbyBhc3NlbWJsZSBhbmQgbGluaywgdXNlIHRoZXNlIGNvbW1hbmRzIHdpdGggTkFTTSAyLng6Cis7ICAgbmFzbSAtT3ggLWYgYmluIC1vIGVsdG9yaXRvLnN5cyBlbHRvcml0by5hc20KKworOyBUbyBlbmFibGUgVHJhY2UgbWFya2VycyB1bmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cKKzsgREVCVUdfVFJBQ0VSUz0xCisKKzsgVG8gZW5hYmxlIGRlYnVnIGluZm8gdW5jb21tZW50IHRoZSBsaW5lIGJlbG93Cis7IERFQlVHPTEKKworJWlmZGVmIERFQlVHX1RSQUNFUlMKKyAlbWFjcm8JVFJBQ0VSCTEKKwljYWxsIGRlYnVnX3RyYWNlcgorCWRiICUxCisgJWVuZG1hY3JvCislZWxzZQorICVtYWNybwlUUkFDRVIJMQorICVlbmRtYWNybworJWVuZGlmCTsgREVCVUdfVFJBQ0VSUworCislZGVmaW5lCVZlcgknMS41JworJWRlZmluZSBDUgkwREgsIDBBaAorUlBvbHlICQllcXUJMEVEQjhoCitSUG9seUwJCWVxdQkwODMyMGgKKworCQlzZWN0aW9uIC50ZXh0IGFsaWduPTE2CisJCW9yZwkwCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDZHJvbToKKworTmV4dERyaXZlcglkZAktMQkJCTstKworQXR0cmlidXRlcwlkdwkwQzgwMGgJCQk7IHwKK1BvaW50ZXJzCWR3CVN0cmF0ZWd5CQk7IHwKKwkJZHcJQ29tbWFuZHMJCTsgfCAgIE1TQ0RFWCByZXF1aXJlcyB0aGlzCitEZXZpY2VOYW1lCWRiCSdFTFRPUklUTycJCTsgfCAgZGF0YSBpbiB0aGVzZSBsb2NhdGlvbnMKKwkJZHcJMAkJCTsgfAorRHJpdmVMZXR0ZXIJZGIJMAkJCTsgfAorTnVtVW5pdHNTdXBwCWRiCTEJCQk7LSsKKworRHJpdmVyTmFtZQlkYgknRWwtVG9yaXRvIENELVJPTSBEZXZpY2UgRHJpdmVyJywwCisJCWFsaWduIDQsIGRiIDAKK1JlcUhkckxvYwlkZAkwCitYZmVyQWRkcglkZAkwCitDaGVja3N1bQlkZAktMQorRHJpdmVOdW1iZXIJZGIJMAorUmVhZEJ5dGVzCWRiCTAJCQk7MCAtLT4gMjA0OCBieXRlcy9zZWN0b3IKKwkJCQkJCTsxIC0tPiAxMDI0IGJ5dGVzL3NlY3RvcgorCQkJCQkJOzIgLS0+ICA1MTIgYnl0ZXMvc2VjdG9yCisKK1JvdXRpbmVzCWR3CUluaXQJCTtJbml0CQk7MAorCQlkdwlVbnN1cHBvcnRlZAk7TWVkaWFDaGVjawk7MQorCQlkdwlVbnN1cHBvcnRlZAk7QnVpbGRCUEIJOzIKKwkJZHcJSW9jdGxJbnB1dAk7SW9jdGxJbnB1dAk7MworCQlkdwlVbnN1cHBvcnRlZAk7SW5wdXQJCTs0CisJCWR3CVVuc3VwcG9ydGVkCTtOb25EZXNJbnB1dAk7NQorCQlkdwlVbnN1cHBvcnRlZAk7SW5wdXRTdGF0dXMJOzYKKwkJZHcJVW5zdXBwb3J0ZWQJO0lucHV0Rmx1c2gJOzcKKwkJZHcJVW5zdXBwb3J0ZWQJO091dHB1dAkJOzgKKwkJZHcJVW5zdXBwb3J0ZWQJO091dHB1dFZlcmlmeQk7OQorCQlkdwlVbnN1cHBvcnRlZAk7T3V0cHV0U3RhdHVzCTsxMAorCQlkdwlVbnN1cHBvcnRlZAk7T3V0cHV0Rmx1c2gJOzExCisJCWR3CUlvY3RsT3V0cHV0CTtJb2N0bE91dHB1dAk7MTIKKwkJZHcJRG9Ob3RoaW5nCTtEZXZpY2VPcGVuCTsxMworCQlkdwlEb05vdGhpbmcJO0RldmljZUNsb3NlCTsxNAorCQlkdwlSZWFkTAkJO1JlYWRMCQk7MTI4CisKK0lvY3RsSUN0cmwJZHcJUmFkZHIJCTtSYWRkcgkJOzAKKwkJZHcJVW5zdXBwb3J0ZWQJO0xvY0hlYWQJOzEKKwkJZHcJVW5zdXBwb3J0ZWQJOyhSZXNlcnZlZCkJOzIKKwkJZHcJVW5zdXBwb3J0ZWQJO0VyclN0YXQJOzMKKwkJZHcJVW5zdXBwb3J0ZWQJO0F1ZEluZm8JOzQKKwkJZHcJRHJ2Qnl0ZXMJCTtEcnZCeXRlcwk7NQorCQlkdwlEZXZTdGF0CQk7RGV2U3RhdAk7NgorCQlkdwlTZWN0U2l6ZQkJO1NlY3RTaXplCTs3CisJCWR3CVZvbFNpemUJCTtWb2xTaXplCTs4CisJCWR3CU1lZENobmcJCTtNZWRDaG5nCTs5CisKK1NwZWNQa3QJCXRpbWVzCTE5CWRiCTAJOyBvZmZzZXQgNzdoIGluIDEuNAorCQl0aW1lcwkxMwlkYgkwCTsgdW5rbm93biBleHRyYSAwMHMgaW4gMS40CisKK0dyZWV0aW5nCWRiCSdFbC1Ub3JpdG8gQm9vdGFibGUgQ0QtUk9NIERyaXZlciBmb3IgRG9zIHYnLFZlciwnLCBodHRwOi8vd3d3Lm51Mi5udS9lbHRvcml0by8nLENSCisJCWRiCScgIChjKSAyMDAwIGJ5IEdhcnkgVG9uZycsQ1IKKwkJZGIJJyAgKGMpIDIwMDEtMjAwMiBieSBCYXJ0IExhZ2Vyd2VpaicsQ1IsMAorRGJsU3BhY2UJZGIJJyAgJywwCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdHJhdGVneToKKworCQltb3YJd29yZCBbY3M6UmVxSGRyTG9jXSxieAorCQltb3YJd29yZCBbY3M6UmVxSGRyTG9jKzJdLGVzCisJCXJldGYKKworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29tbWFuZHM6CisKKwkJcHVzaAlheAorCQlwdXNoCWJ4CisJCXB1c2gJY3gKKwkJcHVzaAlkeAorCQlwdXNoCXNpCisJCXB1c2gJZGkKKwkJcHVzaAlicAorOwkJcHVzaGFkCisJCXB1c2gJZHMKKwkJcHVzaAllcworCQlUUkFDRVIgJ0MnCisKKwkJY2xkCQkJCTtDbGVhciBkaXJlY3Rpb24KKwkJc3RpCQkJCTtFbmFibGUgaW50ZXJydXB0cworCisJCW1vdglheCwgY3MJCQk7ZHM9Y3MKKwkJbW92CWRzLCBheAorCisJCWxlcwlieCxbUmVxSGRyTG9jXQk7c2VnOm9mZnNldCBwdHIgaW50byBlczpieAorCQl4b3IJYXgsYXgKKwkJbW92CWFsLFtlczpieCsyXQkJO0dldCBDb21tYW5kIGNvZGUKKyVpZmRlZiBERUJVRworCQljYWxsCXByaW50X2hleDgKKyVlbmRpZgorCQljbXAJYWwsMTUKKwkJamIJTXVsdDIJCQk7SWYgMC0xNAorCQljbXAJYWwsMTI4CisJCWpiIAlVbmtub3duQ21kCQk7SWYgMTUtMTI3CisJCWNtcAlhbCwxMjkKKwkJamIJU2hpZnREb3duCQk7SWYgMTI4CitVbmtub3duQ21kOgltb3YJYWwsMTIxCQkJOzggPSBVbnN1cHBvcnRlZCAoUmVzZXJ2ZWQpCitTaGlmdERvd246CXN1YglhbCwxMTMJCQk7MTI4IC0tPiAxNSwgMTIxIC0tPiA4CitNdWx0MjoJCXNobAlhbCwxCQkJO0NvbnZlcnQgaW50byBvZmZzZXQgKCoyKQorCQltb3YJZGksUm91dGluZXMKKwkJYWRkCWRpLGF4CisJCWNhbGwgCXdvcmQgW2RpXQkJO0V4ZWN1dGUgZGVzaXJlZCBjb21tYW5kCisJCW9yCWF4LDEwMGgJCQk7U2V0IFJldHVybiBTdGF0dXMncyBEb25lIGJpdAorCQlsZHMJYngsW1JlcUhkckxvY10JCTtzZWc6b2Zmc2V0IHB0ciBpbnRvIGRzOmJ4CisJCW1vdglbYngrM10sYXgJCTtTYXZlIFN0YXR1cworCislaWZkZWYgREVCVUcKKwkJY21wCWJ5dGUgW2NzOmJ1ZmZlcisyMDQ4XSwgOTZoCisJCWplCWJ1ZmZlcl9vaworCQltb3YJYWwsICchJworCQljYWxsCXByaW50X2NoYXIKKwkJam1wCSQKK2J1ZmZlcl9vazoKKyVlbmRpZgorCisJCVRSQUNFUiAnYycKKwkJcG9wCWVzCisJCXBvcAlkcworOwkJcG9wYWQKKwkJcG9wCWJwCisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWF4CisJCXJldGYKKworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVW5zdXBwb3J0ZWQ6CQkJO1Vuc3VwcG9ydGVkIENvbW1hbmQKKworCQltb3YJYXgsODAwM2gJCTtTZXQgU3RhdHVzIEVycm9yIGJpdCwKKwkJVFJBQ0VSICdVJworCQlUUkFDRVIgJ0MnCisJCXJldG4JCQkJOyAgIEVycm9yIDMgPSBVbmtub3duIENvbW1hbmQKKworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW9jdGxJbnB1dDoJCQk7SU9DVEwgSW5wdXQgUm91dGluZQorCisJCW1vdglkaSxbZXM6YngrMTRdCQk7ZXM6YnggLS0+IFJlcXVlc3QgSGVhZGVyCisJCW1vdgllcyxbZXM6YngrMTZdCQk7R2V0IFhmZXIgQWRkcmVzcyBpbnRvIGVzOmRpCisJCXhvcglheCxheAkJCTtHZXQgQ29udHJvbCBCbG9jayBDb2RlCisJCW1vdglhbCxbZXM6ZGldCislaWZkZWYgREVCVUcKKwlUUkFDRVIgJ0knCisJVFJBQ0VSICdPJworCWNhbGwJcHJpbnRfaGV4OAorJWVuZGlmCisJCWNtcAlhbCwxMAorCQlqYglVbmtJb2N0bEkJCTtJZiAwLTkKKwkJbW92CWFsLDIJCQk7TWFwIHRvIFVuc3VwcG9ydGVkCitVbmtJb2N0bEk6CXNobAlhbCwxCQkJO0NvbnZlcnQgaW50byBvZmZzZXQgKCoyKQorCQltb3YJc2ksSW9jdGxJQ3RybAorCQlhZGQJc2ksYXgKKwkJY2FsbCAJd29yZCBbc2ldCQk7RXhlY3V0ZSBkZXNpcmVkIGNvbW1hbmQKKwkJcmV0bgorCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSYWRkcjoJCQk7UmV0dXJuIERldmljZSBIZWFkZXIgQWRkcmVzcworCisJCVRSQUNFUiAnQScKKwkJbW92CXdvcmQgW2VzOmRpKzFdLDAKKwkJbW92CVtlczpkaSszXSxjcworCQl4b3IJYXgsIGF4CQkJO1NldCBSZXR1cm4gU3RhdHVzID0gc3VjY2VzcworCQlUUkFDRVIgJ2EnCisJCXJldG4KKworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRHJ2Qnl0ZXM6CQkJO1JlYWQgRHJpdmUgQnl0ZXMKKworCQlUUkFDRVIgJ0InCisJCXB1c2gJZGkJCQk7U2F2ZSBvcmlnaW5hbCBYZmVyIEFkZHIKKwkJYWRkCWRpLDIJCQk7UG9pbnQgdG8gMXN0IGRlc3QgYnl0ZQorCQltb3YJc2ksR3JlZXRpbmcJO1BvaW50IHRvIEdyZWV0aW5nCitEcnZCOgkJbW92c2IJCQkJO0NvcHkgb3ZlciBhIGJ5dGUKKwkJY21wCWJ5dGUgW3NpXSwxMwk7SXMgbmV4dCBjaGFyIGEgQ1I/CisJCWpuZQlEcnZCCQkJO0xvb3AgaWYgbm90CisKKwkJc3ViCWRpLDIJCQk7R2V0ICNieXRlcyBjb3BpZWQgaW50byBheAorCQltb3YJYXgsZGkKKwkJcG9wCWRpCQkJO1JldHJpZXZlIG9yaWdpbmFsIFhmZXIgQWRkcgorCQlzdWIJYXgsZGkKKwkJbW92CWJ5dGUgW2VzOmRpKzFdLGFsCTthbmQgc2F2ZSBpdAorCQltb3YJYXgsMAkJCTtTZXQgUmV0dXJuIFN0YXR1cyA9IHN1Y2Nlc3MKKwkJVFJBQ0VSICdiJworCQlyZXRuCisKKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RldlN0YXQ6CQkJO1JldHVybiBEZXZpY2UgU3RhdHVzCisKKwkJVFJBQ0VSICdEJworCQltb3YJd29yZCBbZXM6ZGkrMV0sMjAyaAk7RG9vciBjbG9zZWQKKwkJbW92CXdvcmQgW2VzOmRpKzNdLDAJO0Rvb3IgdW5sb2NrZWQKKwkJCQkJCTtTdXBwb3J0cyBvbmx5IGNvb2tlZCByZWFkaW5nCisJCQkJCQk7UmVhZCBvbmx5CisJCQkJCQk7RGF0YSByZWFkIG9ubHkKKwkJCQkJCTtObyBpbnRlcmxlYXZpbmcKKwkJCQkJCTtObyBwcmVmZXRjaGluZworCQkJCQkJO05vIGF1ZGlvIGNoYW5uZWwgbWFuaXB1bGF0aW9uCisJCQkJCQk7U3VwcG9ydHMgYm90aCBIU0cgYW5kIFJlZGJvb2sKKwkJCQkJCTsgIGFkZHJlc3NpbmcgbW9kZXMKKworCQl4b3IJYXgsIGF4CQkJO1NldCBSZXR1cm4gU3RhdHVzID0gc3VjY2VzcworCQlUUkFDRVIgJ2QnCisJCXJldG4KKworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU2VjdFNpemU6CQkJO1JldHVybiBTZWN0b3IgU2l6ZQorCisJCVRSQUNFUiAnUycKKwkJbW92CXdvcmQgW2VzOmRpKzJdLDIwNDgKKwkJbW92CWF4LDAJCQk7U2V0IFJldHVybiBTdGF0dXMgPSBzdWNjZXNzCisJCVRSQUNFUiAncycKKwkJcmV0bgorCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWb2xTaXplOgkJCTtSZXR1cm4gVm9sdW1lIFNpemUKKworCQlUUkFDRVIgJ1YnCisJCWNhbGwJUHJpVm9sRGVzYwkJO0dldCBhbmQgQ2hlY2sgUHJpbWFyeSBWb2x1bWUKKwkJCQkJCTsgIERlc2NyaXB0b3IKKwkJbW92CWF4LDgwMEZoCQk7QXNzdW1lIEludmFsaWQgRGlzayBDaGFuZ2UKKwkJamMJVm9sRXhpdAkJCTtJZiBSZWFkIEZhaWx1cmUKKworCQltb3YJYXgsd29yZCBbQnVmZmVyKzgwXQk7UmVhZCBTdWNjZXNzZnVsCisJCW1vdgl3b3JkIFtlczpkaSsxXSxheAk7Q29weSBvdmVyIFZvbHVtZSBTaXplCisJCW1vdglheCx3b3JkIFtCdWZmZXIrODJdCisJCW1vdgl3b3JkIFtlczpkaSszXSxheAorCQltb3YJYXgsMAkJCTtTZXQgUmV0dXJuIFN0YXR1cyA9IHN1Y2Nlc3MKK1ZvbEV4aXQ6CisJCVRSQUNFUiAndicKKwkJcmV0bgorCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitNZWRDaG5nOgkJCTtSZXR1cm4gTWVkaWEgQ2hhbmdlZCBTdGF0dXMKKworCQlUUkFDRVIgJ00nCisJCWNhbGwJUHJpVm9sRGVzYwkJO0dldCBhbmQgQ2hlY2sgUHJpbWFyeSBWb2x1bWUKKwkJCQkJCTsgIERlc2NyaXB0b3IKKwkJbW92CWJ5dGUgW2VzOmRpKzFdLC0xCTtBc3N1bWUgTWVkaWEgQ2hhbmdlZAorCQltb3YJYXgsODAwRmgJCTsgIGFuZCBJbnZhbGlkIERpc2sgQ2hhbmdlCisJCWpjCU1lZEV4aXQJCQk7SWYgTWVkaWEgQ2hhbmdlZCBvciBCYWQKKworCQltb3YJYnl0ZSBbZXM6ZGkrMV0sMQk7TWVkaWEgaGFzIG5vdCBjaGFuZ2VkCisJCW1vdglheCwwCQkJO1NldCBSZXR1cm4gU3RhdHVzID0gc3VjY2VzcworTWVkRXhpdDoKKwkJVFJBQ0VSICdtJworCQlyZXRuCisKKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ByaVZvbERlc2M6CQkJO0dldCBhbmQgQ2hlY2sgUHJpbWFyeSBWb2x1bWUKKwkJCQkJCTsgIERlc2NyaXB0b3IKKwkJVFJBQ0VSICdQJworCQltb3YJYXgsY3MJCQk7U2V0IGRzOnNpIC0tPiBTcGVjUGt0CisJCW1vdglkcyxheAorCisJCW1vdgljeCwgNQorUHJpVm9sQWdhaW46CisJCW1vdglieXRlIFtTcGVjUGt0XSwxNgk7U3BlY1BrdCBTaXplCisJCW1vdglieXRlIFtTcGVjUGt0KzFdLDAJO1Jlc2VydmVkCisJCW1vdgl3b3JkIFtTcGVjUGt0KzJdLDEJO1RyYW5zZmVyIG9uZSAyMDQ4LWJ5dGUgc2VjdG9yCisJCXB1c2gJY3gKKwkJbW92CWNsLGJ5dGUgW1JlYWRCeXRlc10JO011bHRpcGx5IGJ5IDQgaWYgcmVhZGluZyA1MTIKKwkJc2hsCXdvcmQgW1NwZWNQa3QrMl0sY2wJOyAgYnl0ZXMgYXQgYSB0aW1lCisJCXBvcAljeAorCQltb3YJd29yZCBbU3BlY1BrdCs2XSxjcwk7SW50byBvdXIgQnVmZmVyCisJCW1vdgl3b3JkIFtTcGVjUGt0KzRdLCBCdWZmZXIKKwkJbW92CXdvcmQgW1NwZWNQa3QrOF0sMTYJO0Zyb20gQ0QgU2VjdG9yIDE2CisJCW1vdgl3b3JkIFtTcGVjUGt0KzEwXSwwCisJCW1vdgl3b3JkIFtTcGVjUGt0KzEyXSwwCisJCW1vdgl3b3JkIFtTcGVjUGt0KzE0XSwwCisKKwkJbW92CXNpLCBTcGVjUGt0CisJCW1vdglkbCwgW0RyaXZlTnVtYmVyXQorCQltb3YJYWgsIDQyaAkJCTtFeHRlbmRlZCBSZWFkCisJCWludAkxM2gKKwkJam5jCVByaVZvbFBhc3MJCTtJZiBzdWNjZXNzCisKKzsJCVRSQUNFUiAnMScKKwkJOyByZWFkIGVycm9yCisJCWxvb3AJUHJpVm9sQWdhaW4KKworCQlUUkFDRVIgJzInCisJCTsgcmVhZCByZXRyaWVzIGV4aGF1c3RlZAorCQk7IGZsb3cgaW50byBiZWxvdworCQlqbXAJUHJpUmVhZEVycgorCitQcmlWb2xQYXNzOgorCQltb3YJc2ksQnVmZmVyCTtQb2ludCBpbnB1dCB0byBCdWZmZXIKKwkJbW92CWF4LC0xCQkJO0luaXQgQ2hlY2tzdW0gcmVnaXN0ZXJzCisJCW1vdglieCxheAkJCTsgIGJ4LGF4ID0gMEZGRkZGRkZGaAorCQlqYwlQcmlOZXcJCQk7SWYgUmVhZCBGYWlsdXJlCisKKwkJcHVzaAlkaQkJCTtSZWFkIFN1Y2Nlc3NmdWwsCisJCQkJCQk7ICBzbyBDYWxjdWxhdGUgQ2hlY2tzdW0KKwkJbW92CWRpLDEwMjQJCQk7SW5pdCBXb3JkIGNvdW50ZXIKK1ByaVdvcmQ6CW1vdglkeCxbY3M6c2ldCQk7R3JhYiBuZXh0IHdvcmQgZnJvbSBidWZmZXIKKwkJbW92CWN4LDE2CQkJO0luaXQgYml0IGNvdW50ZXIKK1ByaUJpdDoJCXNocglkeCwxCQkJO1NoaWZ0IGV2ZXJ5dGhpbmcgcmlnaHQgMSBiaXQKKwkJcmNyCWJ4LDEKKwkJcmNyCWF4LDEKKwkJam5jCU5vTXVsdAkJCTtJZiBhIHplcm8gc2hpZnRlZCBvdXQKKworCQl4b3IJYngsUlBvbHlICQk7QSBvbmUgc2hpZnRlZCBvdXQsIHNvIFhPUgorCQl4b3IJYXgsUlBvbHlMCQk7ICBDaGVja3N1bSB3aXRoIFJQb2x5CitOb011bHQ6CisJCWxvb3AJUHJpQml0CisKKwkJYWRkCXNpLDIJCQk7SW5jIFdvcmQgUG9pbnRlcgorCQlkZWMJZGkKKwkJamEJUHJpV29yZAorCQlUUkFDRVIgJzMnCisKKwkJcG9wCWRpCQkJO0NoZWNrc3VtIGNhbGN1bGF0aW9uIGNvbXBsZXRlCisJCWNtcAlieCxbQ2hlY2tzdW0rMl0JCTtIYXMgQ2hlY2tzdW0gY2hhbmdlZD8KKwkJam5lCVByaU5ldwkJCTtJZiBDaGVja3N1bSBDaGFuZ2VkCisKKwkJY21wCWF4LFtDaGVja3N1bV0KKwkJam5lCVByaU5ldwkJCTtJZiBDaGVja3N1bSBDaGFuZ2VkCisKKwkJY2xjCQkJCTtDaGVja3N1bSBub3QgY2hhbmdlZCwgQ0Y9MAorCQltb3YJYXgsMAkJCTtTdGF0dXMgPSBzdWNjZXNzCisJCWptcAlQcmlPbGQKKworUHJpUmVhZEVycjoKKwkJbW92CVdPUkQgW0NoZWNrc3VtKzJdLGJ4CQk7U2F2ZSBOZXcgQ2hlY2tzdW0KKwkJbW92CVtDaGVja3N1bV0sYXgJCTsgIG9yIDBGRkZGRkZGRmggaWYgYmFkIHJlYWQKKwkJc3RjCQkJCTtDaGVja3N1bSBjaGFuZ2UsIENGPTEKKwkJbW92CWF4LCA4MDBiaAkJO1N0YXR1cyA9IHJlYWQgZmF1bHQKKwkJam1wCVByaU9sZAorCitQcmlOZXc6CQltb3YJV09SRCBbQ2hlY2tzdW0rMl0sYngJCTtTYXZlIE5ldyBDaGVja3N1bQorCQltb3YJW0NoZWNrc3VtXSxheAkJOyAgb3IgMEZGRkZGRkZGaCBpZiBiYWQgcmVhZAorCQlzdGMJCQkJO0NoZWNrc3VtIENoYW5nZWQsIENGPTEKKwkJbW92CWF4LDgwMEZoCQk7U3RhdHVzID0gSW52YWxpZCBNZWRpYSBDaGFuZ2UKK1ByaU9sZDoKKwkJVFJBQ0VSICdwJworCQlyZXRuCisKKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0lvY3RsT3V0cHV0OgkJCTtJT0NUTCBPdXRwdXQgUm91dGluZQorCisJCVRSQUNFUiAnTycKKwkJbW92CWRpLFtlczpieCsxNF0JCTtlczpieCAtLT4gUmVxdWVzdCBIZWFkZXIKKwkJbW92CWVzLFtlczpieCsxNl0JCTtHZXQgWGZlciBBZGRyZXNzIGludG8gZXM6ZGkKKwkJeG9yCWF4LGF4CQkJO0dldCBDb250cm9sIEJsb2NrIENvZGUKKwkJbW92CWFsLFtlczpkaV0KKwkJY21wCWFsLDIKKwkJam5lCVVua0lvY3RsTwkJO0lmIG5vdCAyIChSZXNldERydikKKwkJY2FsbAlEb05vdGhpbmcJCTtSZXNldCBEcml2ZQorCQlqbXAJSW9jdGxPRG9uZQorVW5rSW9jdGxPOgorCQljYWxsCVVuc3VwcG9ydGVkCQk7VW5zdXBwb3J0ZWQgY29tbWFuZAorSW9jdGxPRG9uZToKKwkJVFJBQ0VSICdvJworCQlyZXRuCisKKworOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RvTm90aGluZzoJCQk7RG8gTm90aGluZyBDb21tYW5kCisKKwkJbW92CWF4LDAJCQk7U2V0IFJldHVybiBTdGF0dXMgPSBzdWNjZXNzCisJCXJldG4KKworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVhZEw6CQkJO1JlYWQgTG9uZyBDb21tYW5kCisKKwkJVFJBQ0VSICdSJworCQltb3YJYXgsY3MJCQk7U2V0IGRzPWNzCisJCW1vdglkcyxheAorCQkJCQkJO2VzOmJ4IC0tPiBSZXF1ZXN0IEhlYWRlcgorCQljbXAJYnl0ZSBbZXM6YngrMjRdLDAJO0NoZWNrIERhdGEgUmVhZCBNb2RlCisJCWpuZQlSZWFkTEVycgkJO0lmIENvb2tlZCBNb2RlCisKKwkJY21wCWJ5dGUgW2VzOmJ4KzEzXSwyCTtDaGVjayBBZGRyZXNzaW5nIE1vZGUKKwkJamIJUmVhZExPSwkJCTtJZiBIU0cgb3IgUmVkYm9vayBNb2RlCisKK1JlYWRMRXJyOgorCQlUUkFDRVIgJzgnCisJCW1vdglheCw4MDAzaAkJO1NldCBSZXR1cm4gU3RhdHVzID0gVW5rbm93bgorCQlqbXAJUmVhZExFeGl0CQk7ICBDb21tYW5kIEVycm9yIGFuZCBleGl0CisKK1JlYWRMT0s6CisJCW1vdglheCxbZXM6YngrMjBdCQk7R2V0IFN0YXJ0aW5nIFNlY3RvciBOdW1iZXIsCisJCW1vdglkeCxbZXM6YngrMjJdCQk7ICBBc3N1bWUgSFNHIEFkZHJlc3NpbmcgTW9kZQorCQljbXAJYnl0ZSBbZXM6YngrMTNdLDAJO0NoZWNrIEFkZHJlc3NpbmcgTW9kZSBhZ2FpbgorCQlqZQlSZWFkTEhTRwkJO0lmIEhTRyBBZGRyZXNzaW5nIE1vZGUKKworCQlUUkFDRVIgJzcnCisJCTtVc2luZyBSZWRib29rIEFkZHJlc3NpbmcgTW9kZS4gIENvbnZlcnQgdG8gSFNHIGZvcm1hdAorCQltb3YJYWwsZGwJCQk7R2V0IE1pbnV0ZXMKKwkJbW92CWRsLDYwCisJCW11bAlkbAkJCTtheCA9IE1pbnV0ZXMgKiA2MAorCQlhZGQJYWwsYnl0ZSBbZXM6YngrMjFdCTtBZGQgaW4gU2Vjb25kcworCQlhZGMJYWgsMAorCQltb3YJZHgsNzUJCQk7ZHg6YXggPQorCQltdWwJZHgJCQk7ICAoKE1pbiAqIDYwKSArIFNlYykgKiA3NQorCQlhZGQJYWwsYnl0ZSBbZXM6YngrMjBdCTtBZGQgaW4gRnJhbWVzCisJCWFkYwlhaCwwCisJCWFkYwlkeCwwCisJCXN1YglheCwxNTAJCQk7U3VidHJhY3QgMi1TZWNvbmQgb2Zmc2V0CisJCXNiYglkeCwwCQkJO2R4OmF4ID0gSFNHIFN0YXJ0aW5nIFNlY3RvcgorCitSZWFkTEhTRzoKKwkJbW92CXdvcmQgW1NwZWNQa3QrOF0sIGF4CTtTdG9yZSBTdGFydGluZworCQltb3YJd29yZCBbU3BlY1BrdCsxMF0sIGR4CTsgIFNlY3RvciBOdW1iZXIKKwkJbW92CXdvcmQgW1NwZWNQa3QrMTJdLCAwCTsgIChIU0cgRm9ybWF0KQorCQltb3YJd29yZCBbU3BlY1BrdCsxNF0sIDAKKworCQltb3YJYXgsW2VzOmJ4KzE0XQkJO0dldCBUcmFuc2ZlciBBZGRyZXNzCisJCW1vdgl3b3JkIFtTcGVjUGt0KzRdLGF4CisJCW1vdglheCxbZXM6YngrMTZdCisJCW1vdgl3b3JkIFtTcGVjUGt0KzZdLGF4CisKKwkJbW92CWJ5dGUgW1NwZWNQa3RdLDE2CTtTaXplIG9mIERpc2sgQWRkcmVzcyBQYWNrZXQKKwkJbW92CWJ5dGUgW1NwZWNQa3QrMV0sMAk7UmVzZXJ2ZWQKKworCQltb3YJY3gsIDUKK1JlYWRMQWdhaW46CisJCW1vdglheCxbZXM6YngrMThdCQk7R2V0IG51bWJlciBvZiBzZWN0b3JzIHRvIHJlYWQKKwkJbW92CXdvcmQgW1NwZWNQa3QrMl0sYXgKKwkJY21wCWF4LCAzRkZGaAkJO1RvbyBsYXJnZT8KKwkJamEJUmVhZExCYWQJCTtJZiB5ZXMKKworCQlwdXNoCWN4CisJCW1vdgljbCxieXRlIFtSZWFkQnl0ZXNdCTtNdWx0aXBseSBieSA0IGlmIHJlYWRpbmcgNTEyCisJCXNobAl3b3JkIFtTcGVjUGt0KzJdLGNsCTsgIGJ5dGVzIGF0IGEgdGltZQorCQlwb3AJY3gKKworJWlmZGVmIERFQlVHCisJCXB1c2gJYXgKKwkJcHVzaAljeAorCQlwdXNoCXNpCisJCW1vdgljeCwgMTYKKwkJbW92CXNpLFNwZWNQa3QKK1JlYWREdW1wOgltb3YJYWwsICcgJworCQljYWxsCXByaW50X2NoYXIKKwkJbW92CWFsLCBieXRlIFtzaV0JO0hleGR1bXAgYSBTcGVjUGt0IGJ5dGUKKwkJY2FsbAlwcmludF9oZXg4CisJCWluYwlzaQkJCTtQb2ludCB0byBuZXh0IGJ5dGUKKwkJbG9vcAlSZWFkRHVtcAorCQlwb3AJc2kKKwkJcG9wCWN4CisJCXBvcAlheAorJWVuZGlmCisJCW1vdglzaSxTcGVjUGt0CisJCW1vdglkbCxbRHJpdmVOdW1iZXJdCisJCW1vdglhaCw0MmgJCQk7RXh0ZW5kZWQgUmVhZAorCQlpbnQJMTNoCisJCWpuYwlSZWFkTEdkCQkJO0lmIHN1Y2Nlc3MKKworO2hhbmc6Cis7CQlqbXAJaGFuZworOwkJVFJBQ0VSICcxJworCQlsb29wCVJlYWRMQWdhaW4KKwkJVFJBQ0VSICcyJworCQlqbXAgc2hvcnQgUmVhZExCYWQKK1JlYWRMR2Q6CisJCVRSQUNFUiAnMycKKwkJeG9yCWF4LCBheCAJCQk7U3RhdHVzIDAgPSBzdWNjZXNzCisJCWptcCBzaG9ydCBSZWFkTEV4aXQKKworUmVhZExCYWQ6CisJCVRSQUNFUiAnOScKKwkJbW92CWF4LCA4MDBCaAkJO1NldCBSZWFkIEZhdWx0IEVycm9yCisJCTsgZmxvdyBpbnRvIFJlYWRMRXhpdAorUmVhZExFeGl0OgorCQlUUkFDRVIgJ3InCisJCXJldG4KKworCisKKyVpZmRlZiBERUJVR19UUkFDRVJTCitkZWJ1Z190cmFjZXI6CXB1c2hhZAorCQlwdXNoZmQKKworCQltb3YJYWwsICdbJworCQltb3YJYWgsMEVoCQkJO0JJT1MgdmlkZW8gdGVsZXR5cGUgb3V0cHV0CisJCXhvcgliaCwgYmgKKwkJaW50CTEwaAkJCTtQcmludCBpdAorCisJCW1vdglicCxzcAorCQltb3YJYngsW2JwKzkqNF0JCTsgR2V0IHJldHVybiBhZGRyZXNzCisJCW1vdglhbCxbY3M6YnhdCQk7IEdldCBkYXRhIGJ5dGUKKwkJaW5jCXdvcmQgW2JwKzkqNF0JOyBSZXR1cm4gdG8gYWZ0ZXIgZGF0YSBieXRlCisKKwkJbW92CWFoLDBFaAkJCTtCSU9TIHZpZGVvIHRlbGV0eXBlIG91dHB1dAorCQl4b3IJYmgsIGJoCisJCWludAkxMGgJCQk7UHJpbnQgaXQKKworCQltb3YJYWwsICddJworCQltb3YJYWgsMEVoCQkJO0JJT1MgdmlkZW8gdGVsZXR5cGUgb3V0cHV0CisJCXhvcgliaCwgYmgKKwkJaW50CTEwaAkJCTtQcmludCBpdAorCisJCXBvcGZkCisJCXBvcGFkCisJCXJldG4KKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUFJJTlRfSEVYNAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHByaW50IGEgNCBiaXRzIGludGVnZXIgaW4gaGV4Cis7Cis7IElucHV0OgorOwlBTCAtIDQgYml0cyBpbnRlZ2VyIHRvIHByaW50IChsb3cpCis7Cis7IE91dHB1dDogTm9uZQorOworOyBSZWdpc3RlcnMgZGVzdHJveWVkOiBOb25lCis7CitwcmludF9oZXg0OgorCisJcHVzaAlheAorCWFuZAlhbCwgMGZoCQk7IHdlIG9ubHkgbmVlZCB0aGUgZmlyc3QgbmliYmxlCisJY21wCWFsLCAxMAorCWphZQloZXhfQV9GCisJYWRkCWFsLCAnMCcKKwlqbXAJaGV4XzBfOQoraGV4X0FfRjoKKwlhZGQJYWwsICdBJy0xMAoraGV4XzBfOToKKwljYWxsCXByaW50X2NoYXIKKwlwb3AJYXgKKwlyZXRuCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHByaW50X2hleDgKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBwcmludAlhIDggYml0cyBpbnRlZ2VyIGluIGhleAorOworOyBJbnB1dDoKKzsJQUwgLSA4IGJpdHMgaW50ZWdlciB0byBwcmludAorOworOyBPdXRwdXQ6IE5vbmUKKzsKKzsgUmVnaXN0ZXJzIGRlc3Ryb3llZDogTm9uZQorOworcHJpbnRfaGV4ODoKKworCXB1c2gJYXgKKwlwdXNoCWJ4CisKKwltb3YJYWgsIGFsCisJc2hyCWFsLCA0CisJY2FsbAlwcmludF9oZXg0CisKKwltb3YJYWwsIGFoCisJYW5kCWFsLCAwZmgKKwljYWxsCXByaW50X2hleDQKKworCXBvcAlieAorCXBvcAlheAorCXJldG4KKworCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsgcHJpbnRfaGV4MTYgLSBwcmludCBhIDE2IGJpdHMgaW50ZWdlciBpbiBoZXgKKzsKKzsgSW5wdXQ6Cis7CUFYIC0gMTYgYml0cyBpbnRlZ2VyIHRvIHByaW50Cis7Cis7IE91dHB1dDogTm9uZQorOworOyBSZWdpc3RlcnMgZGVzdHJveWVkOiBOb25lCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3ByaW50X2hleDE2OgorCisJcHVzaAlheAorCXB1c2gJYngKKwlwdXNoCWN4CisKKwltb3YJY3gsIDQKK3ByaW50X2hleDE2X2xvb3A6CisJcm9sCWF4LCA0CisJY2FsbAlwcmludF9oZXg0CisJbG9vcAlwcmludF9oZXgxNl9sb29wCisKKwlwb3AJY3gKKwlwb3AJYngKKwlwb3AJYXgKKwlyZXRuCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyBwcmludF9oZXgzMiAtIHByaW50IGEgMzIgYml0cyBpbnRlZ2VyIGluIGhleAorOworOyBJbnB1dDoKKzsJRUFYIC0gMzIgYml0cyBpbnRlZ2VyIHRvIHByaW50Cis7Cis7IE91dHB1dDogTm9uZQorOworOyBSZWdpc3RlcnMgZGVzdHJveWVkOiBOb25lCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3ByaW50X2hleDMyOgorCisJcHVzaAllYXgKKwlwdXNoCWJ4CisJcHVzaAljeAorCisJbW92CWN4LCA4CitwcmludF9oZXgzMl9sb29wOgorCXJvbAllYXgsIDQKKwljYWxsCXByaW50X2hleDQKKwlsb29wCXByaW50X2hleDMyX2xvb3AKKworCXBvcAljeAorCXBvcAlieAorCXBvcAllYXgKKwlyZXRuCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyBwcmludF9zdHJpbmcgLSBwcmludCBzdHJpbmcgYXQgY3VycmVudCBjdXJzb3IgbG9jYXRpb24KKzsKKzsgSW5wdXQ6Cis7CURTOlNJIC0gQVNDSUlaIHN0cmluZyB0byBwcmludAorOworOyBPdXRwdXQ6IE5vbmUKKzsKKzsgUmVnaXN0ZXJzIGRlc3Ryb3llZDogTm9uZQorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitwcmludF9zdHJpbmc6CisJCXB1c2gJYXgKKwkJcHVzaAlzaQorCitwcmludF9zdHJpbmdfYWdhaW46CisJCW1vdglhbCwgW3NpXQorCQlvcglhbCwgYWwKKwkJanoJcHJpbnRfc3RyaW5nX2V4aXQKKwkJY2FsbAlwcmludF9jaGFyCisJCWluYwlzaQorCQlqbXAJcHJpbnRfc3RyaW5nX2FnYWluCisKK3ByaW50X3N0cmluZ19leGl0OgorCQlwb3AJc2kKKwkJcG9wCWF4CisJCXJldG4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFBSSU5UX0NIQVIKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBQcmludCdzIGEgY2hhcmFjdGVyIGF0IGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCis7Cis7IElucHV0OgorOwlBTCAtIENoYXJhY3RlciB0byBwcmludAorOworOyBPdXRwdXQ6IE5vbmUKKzsKKzsgUmVnaXN0ZXJzIGRlc3Ryb3llZDogTm9uZQorOworcHJpbnRfY2hhcjoKKworCQlwdXNoCWF4CisJCXB1c2gJYngKKworCQltb3YJYWgsMEVoCQkJO0JJT1MgdmlkZW8gdGVsZXR5cGUgb3V0cHV0CisJCXhvcgliaCwgYmgKKwkJaW50CTEwaAkJCTtQcmludCBpdAorCitwcmludF9jaGFyX2V4aXQ6CisJCXBvcAlieAorCQlwb3AJYXgKKwkJcmV0bgorCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis7VGhpcyBzcGFjZSBpcyB1c2VkIGFzIGEgMjA0OC1ieXRlIHJlYWQgYnVmZmVyIHBsdXMgb25lIHRlc3QgYnl0ZS4KKztUaGUgOTZoIGRhdGEgaXMgdXNlZCBmb3IgdGVzdGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJldHVybmVkIGJ5IGFuIEV4dGVuZGVkCis7ICBDRC1ST00gc2VjdG9yIHJlYWQKKworCQlhbGlnbgkxNiwgZGIgMAorQnVmZmVyCQl0aW1lcwkyMDQ5CWRiCTk2aAorCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW5pdDoJCQk7SW5pdGlhbGl6YXRpb24gUm91dGluZQorCisJCVRSQUNFUiAnSScKKwkJbW92CWF4LGNzCQkJO2RzPWNzCisJCW1vdglkcyxheAorCislaWZkZWYgREVCVUcKKzsgcHJpbnQgQ1MgdmFsdWUgKGxvYWQgc2VnbWVudCkKKwkJY2FsbAlwcmludF9oZXgxNgorJWVuZGlmCisKKwkJbW92CXNpLCBHcmVldGluZwk7RGlzcGxheSBHcmVldGluZworCQljYWxsCXByaW50X3N0cmluZworCisJCW1vdglheCxVbnN1cHBvcnRlZAk7SW5pdCBpcyBleGVjdXRlZCBvbmx5IG9uY2UKKwkJbW92CVtSb3V0aW5lc10sYXgKKworCQltb3YJYXgsIDU0MDBoCisJCWludAkxM2gJCQk7IEdldCBkaXNrZW11IHN0YXR1cworCQlqYwlGaW5kQm9vdAkJOyBJZiBDRj0xIG5vIGRpc2tlbXUgbG9hZGVkCisKKwkJbW92CVtEcml2ZU51bWJlcl0sIGNsCQk7IFN0b3JlIGRyaXZlIG51bWJlcgorCisJCWNhbGwJa2V5ZmxhZworCQlhbmQJYWwsIDgJCQk7IGFsdCBrZXkgPworCQlqeglleHRyZWFkCisKKwkJbW92CXNpLCBEcnZOdW1Nc2cJOyBEaXNwbGF5ICJkcml2ZSBudW1iZXI9IgorCQljYWxsCXByaW50X3N0cmluZworCQltb3YJYWwsIFtEcml2ZU51bWJlcl0KKwkJY2FsbAlwcmludF9oZXg4CisJCW1vdglzaSwgTGluZUVuZAk7IENSL0xGCisJCWNhbGwJcHJpbnRfc3RyaW5nCisJCWptcAlleHRyZWFkCisKKzsgRGlza2VtdSBpcyBub3QgbG9hZGVkCis7IHNvIGxvb3AgdG8gZmluZCBkcml2ZSBudW1iZXIKKwkJOyAqKiogc3RhcnQgb2YgMS40IGNoYW5nZXMgKioqCisJCTsgPz8/IG1vdiBkbCwgMGZmaAkJO1N0YXJ0IGF0IERyaXZlIDB4ZmYKKwkJOyAqKiogRmluZEJvb3QgYXQgYzQ3IGluIDEuNCwgYXQgYzBjIGluIDEuMyAqKioKK0ZpbmRCb290OgljYWxsCVNjYW5Ecml2ZXMJCTsgY2FsbCBuZXcgaGVscGVyIGluIDEuNAorCQlqbmMJRm91bmRCb290CQk7IGRlZCpkZjMKKzsJCW1vdglzaSxvZmZzZXQgU3BlY1BrdAk7TG9jYXRlIGJvb3RlZCBDRC1ST00gZHJpdmUKKzsJCW1vdglbU3BlY1BrdF0sMAkJO0NsZWFyIDFzdCBieXRlIG9mIFNwZWNQa3QKKzsJCW1vdglheCw0QjAxaAkJO0dldCBCb290YWJsZSBDRC1ST00gU3RhdHVzCis7CQlpbnQJMTNoCis7CQlqbmMJRmluZFBhc3MJCTtJZiBib290ZWQgQ0QgZm91bmQKKzsKKzsgQ2FycnkgaXMgbm90IGNsZWFyZWQgaW4gYnVnZ3kgRGVsbCBCSU9TZXMsCis7IHNvIEknbSBjaGVja2luZyBwYWNrZXQgc2l6ZSBieXRlCis7IHNvbWUgYm9ndXMgYmlvc2VzIChEZWxsIEluc3Bpcm9uIDI1MDApIHJldHVybnMgcGFja2V0IHNpemUgMHhmZiB3aGVuIGZhaWxlZAorOyBEZWxsIERpbWVuc2lvbiBYUHNUIHJldHVybnMgcGFja2V0IHNpemUgMHgxNCB3aGVuIE9LCisKKzsJCWNtcAlbU3BlY1BrdF0sIDAKKzsJCWpuZQlGb3VuZEJvb3QKKworOwkJY21wCVtTcGVjUGt0XSwgMTNoCTsgYW55dGhpbmcgYmV0d2VlbiAxM2ggYW5kIDIwaCBzaG91bGQgYmUgT0sKKzsJCWpiCUZpbmRGYWlsCis7CQljbXAJW1NwZWNQa3RdLCAyMGgKKzsJCWphCUZpbmRGYWlsCis7CQlqbXAJc2hvcnQgRm91bmRCb290Cis7Cis7IEZpbmRGYWlsOgorOwkJZGVjCWRsCQkJO05leHQgZHJpdmUKKzsJCWNtcAlkbCwgODBoCis7CQlqYWUJRmluZEJvb3QJCTtDaGVjayBmcm9tIGZmaC4uODBoCisJCTsgKioqIGVuZCBvZiAxLjQgY2hhbmdlcyAqKioKKworCQltb3YJc2ksTm9Cb290Q0QJO05vIGJvb3RlZCBDRCBmb3VuZCwKKwkJY2FsbAlwcmludF9zdHJpbmcKKwkJam1wCU5vRW5kQWRkcgkJO0RvIG5vdCBpbnN0YWxsIGRyaXZlcgorCitGb3VuZEJvb3Q6Cis7CQltb3YJZGwsIFtTcGVjUGt0KzJdCQk7IDEuNCBjaGFuZ2UKKwkJOyAqKiogbmV4dCBsaW5lIGF0IGM1NyBpbiAxLjQsIGF0IGMzZCBpbiAxLjMgKioqCisJCW1vdglbRHJpdmVOdW1iZXJdLGRsCQk7Qm9vdGVkIENELVJPTSBmb3VuZCwKKwkJCQkJCTsgIHNvIHNhdmUgRHJpdmUgIworCisJCWNhbGwJa2V5ZmxhZworCQlhbmQJYWwsIDgJCQk7IGFsdCBrZXkgPworCQlqeglleHRyZWFkCisKKwkJbW92CXNpLCBDRFN0YXQKKwkJY2FsbAlwcmludF9zdHJpbmcKKwkJbW92CXNpLCBTcGVjUGt0CTtQb2ludCB0byByZXR1cm5lZCBDRCBTcGVjUGt0CisJCW1vdgljeCwgMTkJCQk7ICBjb250YWluaW5nIDE5IGJ5dGVzCitTdGF0RHVtcDoJbW92CWFsLCAnICcJCQk7UHJpbnQgYSBzcGFjZQorCQljYWxsCXByaW50X2NoYXIKKwkJbW92CWFsLCBieXRlIFtzaV0JO0hleGR1bXAgYSBTcGVjUGt0IGJ5dGUKKwkJY2FsbAlwcmludF9oZXg4CisJCWluYwlzaQkJCTtQb2ludCB0byBuZXh0IGJ5dGUKKwkJbG9vcAlTdGF0RHVtcAorCisJCW1vdglzaSwgTGluZUVuZAk7UHJpbnQgYSBDUi9MRgorCQljYWxsCXByaW50X3N0cmluZworCitleHRyZWFkOgorO1NlZSBob3cgbWFueSBDRCBTZWN0b3IgYnl0ZXMgYXJlIHJldHVybmVkIGJ5IGFuIEV4dGVuZGVkIFJlYWQKKwkJbW92CWJ5dGUgW1NwZWNQa3RdLDE2CTtTcGVjUGt0IFNpemUKKwkJbW92CWJ5dGUgW1NwZWNQa3QrMV0sMAk7UmVzZXJ2ZWQKKwkJbW92CXdvcmQgW1NwZWNQa3QrMl0sMQk7VHJhbnNmZXIgb25lIHNlY3RvcgorCQltb3YJd29yZCBbU3BlY1BrdCs2XSxjcwk7SW50byBvdXIgQnVmZmVyCisJCW1vdgl3b3JkIFtTcGVjUGt0KzRdLEJ1ZmZlcgorCQltb3YJd29yZCBbU3BlY1BrdCs4XSwxNgk7RnJvbSBDRCBTZWN0b3IgMTYKKwkJbW92CXdvcmQgW1NwZWNQa3QrMTBdLDAKKwkJbW92CXdvcmQgW1NwZWNQa3QrMTJdLDAKKwkJbW92CXdvcmQgW1NwZWNQa3QrMTRdLDAKKworCQltb3YJc2ksIFNwZWNQa3QJO1NldCBkczpzaSAtLT4gU3BlY1BrdAorCQltb3YJZGwsIFtEcml2ZU51bWJlcl0KKwkJbW92CWFoLCA0MmgJCQk7RXh0ZW5kZWQgUmVhZAorCQlpbnQJMTNoCisJCWpuYwlTZWNTaXplCQkJO0lmIHN1Y2Nlc3MKKworCQltb3YJYWgsIDQyaAkJCTtBbHdheXMgbWFrZSAyIHJlYWQgYXR0ZW1wdHMKKwkJaW50CTEzaAorCQkJCQkJO0hvdyBtYW55IGJ5dGVzIGRpZCB3ZSBnZXQ/CitTZWNTaXplOglzdGQJCQkJO0NvdW50IGRvd24KKwkJbW92CWF4LGNzCQkJO1BvaW50IHRvIGVuZCBvZiBCdWZmZXIKKwkJbW92CWVzLGF4CisJCW1vdglkaSxCdWZmZXIrMjA0Nwk7RmluZCBlbmQgb2YgcmVhZCBkYXRhCisJCW1vdglzaSxCdWZmZXIrMjA0OAorCQltb3YJY3gsMjA0OQorCQlyZXBlCWNtcHNiCQkJO2N4ID0gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKworCQljbGQJCQkJO1Jlc3RvcmUgY291bnQgZGlyZWN0aW9uIHRvIHVwCisJCW1vdglzaSxDREJ5dGVzCTtEaXNwbGF5IG51bWJlciBvZiBieXRlcyByZWFkCisJCWNhbGwJcHJpbnRfc3RyaW5nCisKKwkJbW92CWFsLCBbRHJpdmVOdW1iZXJdCisJCWNhbGwJcHJpbnRfaGV4OAorCisJCW1vdglzaSxDREJ5dGVzQQk7UmVtYWluZGVyIEEgb2YgbWVzc2FnZQorCQljYWxsCXByaW50X3N0cmluZworCisJCW1vdglhbCxjaAkJCTtIZXgtZHVtcCBjeAorCQlhbmQJYWwsMEZoCQkJO1NlY29uZCBuaWJibGUKKwkJY2FsbAlwcmludF9oZXg4CQk7ICAoZG9uJ3QgbmVlZCB0aGUgRmlyc3QpCisJCW1vdglhbCxjbAorCQljYWxsCXByaW50X2hleDgJCTsgIChkb24ndCBuZWVkIHRoZSBGaXJzdCkKKworCQltb3YJc2ksQ0RCeXRlc0IJO1JlbWFpbmRlciBCIG9mIG1lc3NhZ2UKKwkJY2FsbAlwcmludF9zdHJpbmcKKworCQljbXAJY3gsMjA0OAkJCTtEaWQgd2UgcmVhZCAyMDQ4IGJ5dGVzPworCQlqZQlQYXJzZVBhcm0JCTtJZiB5ZXMgPC0tIE8uSy4KKworCQltb3YJYnl0ZSBbUmVhZEJ5dGVzXSwxCisJCWNtcAljeCwxMDI0CQkJO0RpZCB3ZSByZWFkIDEwMjQgYnl0ZXM/CisJCWplCVBhcnNlUGFybQkJO0lmIHllcyA8LS0gTy5LLgorCisJCW1vdglieXRlIFtSZWFkQnl0ZXNdLDIKKwkJY21wCWN4LDUxMgkJCTtEaWQgd2UgcmVhZCA1MTIgYnl0ZXM/CisJCWpuZQlOb0VuZEFkZHIJCTtJZiBub3QsIGRvIG5vdCBsb2FkIGRyaXZlcgorCitQYXJzZVBhcm06CW1vdglieCx3b3JkIFtjczpSZXFIZHJMb2NdCTtQYXJzZSBjb21tYW5kIGxpbmUKKwkJbW92CWVzLHdvcmQgW2NzOlJlcUhkckxvYysyXQk7ICBwYXJhbWV0ZXJzCisJCW1vdglzaSxbZXM6YngrMThdCQk7R2V0IEJQQiBhcnJheSBwdHIgaW50byBEUzpTSQorCQltb3YJZHMsW2VzOmJ4KzIwXQorRmluZFBhcm06CWluYwlzaQorRmluZFBhcm0xOgljbXAJYnl0ZSBbc2ldLDBEaAk7Q1I/IChFbmQgb2YgcGFyYW1ldGVycykKKwkJamUJRW5kT2ZQYXJtcworCisJCWNtcAlieXRlIFtzaV0sMEFoCTtMRj8KKwkJamUJRW5kT2ZQYXJtcworCisJCWNtcAlieXRlIFtzaV0sJy8nCTtBIHBhcmFtZXRlcj8KKwkJam5lCUZpbmRQYXJtCisKKwkJaW5jCXNpCisJCWNtcAlieXRlIFtzaV0sJ0QnCTtEZXZpY2UgTmFtZSBwYXJhbWV0ZXI/CisJCWpuZQlGaW5kUGFybTEKKworCQlpbmMJc2kKKwkJY21wCWJ5dGUgW3NpXSwnOicKKwkJam5lCUZpbmRQYXJtMQorCis7YmJiCisJCXB1c2gJc2kKKwkJbW92CXNpLCBEZXZOYW1lCTtEZXZpY2UgTmFtZSBpcyBhdCBkczpzaQorCQlwdXNoCWRzCQkJO0tlZXAgcHRyIHRvIERldmljZSBOYW1lCisJCW1vdglheCwgY3MKKwkJbW92CWRzLCBheAorCQljYWxsCXByaW50X3N0cmluZworCQlwb3AJZHMJCQk7UmV0cmlldmUgRGV2aWNlIE5hbWUgcHRyCisJCXBvcAlzaQorCQltb3YJY3gsIDgJCQk7R2V0IG5leHQgOCBjaGFycworCQlpbmMJc2kJCQk7ICA9IERldmljZSBOYW1lCisJCW1vdglheCwgY3MKKwkJbW92CWVzLCBheAorCQltb3YJZGksIERldmljZU5hbWUKK05leHRDaGFyOgljbXAJYnl0ZSBbc2ldLCcgJworCQlqYQlBYm92ZVNwYWNlCisKKwkJbW92CWF4LGNzCQkJO1BhZCBlbmQgb2YgRGV2aWNlIE5hbWUgd2l0aAorCQltb3YJZHMsYXgJCQk7ICBzcGFjZXMgaWYgbmVjZXNzYXJ5CisJCW1vdglzaSxEYmxTcGFjZQk7QSBzcGFjZQorQWJvdmVTcGFjZToJbW92CWFsLCBbc2ldCisJCWNhbGwJcHJpbnRfY2hhcgorCQltb3ZzYgkJCQk7ZHM6W3NpXSAtLT4gZXM6W2RpXQorCQlsb29wIAlOZXh0Q2hhcgorCisJCW1vdglzaSxMaW5lRW5kCisJCW1vdglheCxjcworCQltb3YJZHMsYXgKKwkJY2FsbAlwcmludF9zdHJpbmcKKworCQltb3YJYXgsSW5pdC0yCTtMYXN0IGJ5dGUgb2YgZHJpdmVyIHRvIGtlZXAKKwkJam1wCUVuZEFkZHIJCQk7SW5zdGFsbCBkcml2ZXIKKworRW5kT2ZQYXJtczoKKwkJbW92CWF4LCBjcwkJCTsgUmVzdG9yZSBzZWdtZW50IHJlZ2lzdGVycyAoZml4KQorCQltb3YJZHMsIGF4CisJCW1vdgllcywgYXgKKworCQltb3YJc2ksTm9EZXZOYW1lCTtObyBEZXZpY2UgTmFtZSBGb3VuZAorCQljYWxsCXByaW50X3N0cmluZworCitOb0VuZEFkZHI6CW1vdglheCwwCQkJO0RvIG5vdCBpbnN0YWxsIGRyaXZlcgorCitFbmRBZGRyOgltb3YJZXMsW1JlcUhkckxvYysyXQkJO1dyaXRlIEVuZCBBZGRyZXNzCisJCW1vdglieCxbUmVxSGRyTG9jXQorCQltb3YJW2VzOmJ4KzE0XSxheAorCQltb3YJW2VzOmJ4KzE2XSxjcworCQltb3YJYngsYXgJCQk7SG9sZCBvbnRvIGluc3RhbGwgc3RhdHVzCisKKwkJbW92CXNpLCBEcnZJbnN0CTtEaXNwbGF5IGRyaXZlciBpbnN0YWxsIHN0YXR1cworCQljYWxsCXByaW50X3N0cmluZworCQltb3YJc2ksIERydkluc3QxCTtBc3N1bWUgZHJpdmVyIGluc3RhbGxlZAorCQljbXAJYngsMAkJCTtXYXMgZHJpdmVyIGluc3RhbGxlZD8KKwkJam5lCURydlN0YXR1cwkJO0lmIHllcworCQltb3YJc2ksIE5vRHJ2SW5zdAk7RHJpdmVyIG5vdCBpbnN0YWxsZWQKK0RydlN0YXR1czoJY2FsbAlwcmludF9zdHJpbmcKKworCQltb3YJYXgsMAkJCTtTZXQgUmV0dXJuIFN0YXR1cyA9IHN1Y2Nlc3MKKwkJY21wCWJ4LDAJCQk7V2FzIElOSVQgc3VjY2Vzc2Z1bD8KKwkJam5lCUluaXRTdGF0CQk7SWYgeWVzCisJCW1vdglheCw4MDBDaAkJO1N0YXR1cyA9IEdlbmVyYWwgRmFpbHVyZQorSW5pdFN0YXQ6CisJCXB1c2gJYXgJCQk7U2F2ZSBSZXR1cm4gU3RhdHVzCisKKwkJY2FsbAlrZXlmbGFnCisJCWFuZAlhbCwgOAkJCTsgYWx0IGtleSA/CisJCWp6CUluaXRFeGl0CisKK1dhaXRIZXJlOgorCQltb3YJc2ksIFdhaXRNc2cJO0Rpc3BsYXkgSGFsdGVkIG1lc3NhZ2UKKwkJY2FsbAlwcmludF9zdHJpbmcKKworQWx0V2FpdDoKKwkJY2FsbAlrZXlmbGFnCisJCWFuZAlhbCwgOAkJCTsgQWx0IGtleT8KKwkJam56CUFsdFdhaXQJCQk7IFByZXNzZWQ/IHllcyAtPiB3YWl0CisKK0luaXRFeGl0OgorCQlwb3AJYXgJCQk7UmV0cmlldmUgUmV0dXJuIFN0YXR1cworCQlUUkFDRVIgJ2knCisJCXJldG4JCQkJO1RoYXQncyBpdCBmb3IgSW5pdCEKKworCQk7ICoqKiBzdGFydCAxLjQgY2hhbmdlcyBhdCBkZWQgKioqCitTcGVjR286CQltb3YJc2ksU3BlY1BrdAorCQlpbnQJMTNoCisJCXJldG4KKworU2NhbkRyaXZlczoJcHVzaAlheAkJOyBhdCBkZjMgaW4gMS40CisJCXB1c2gJc2kKKwkJbW92IGRsLCA3ZmgJCTtTdGFydCBhdCBEcml2ZSAweDgwCitOZXh0RHJ2OglpbmMJZGwKKwkJY2xjCisJCW1vdglheCw0QjAxaAk7R2V0IEJvb3RhYmxlIENELVJPTSBTdGF0dXMKKwkJbW92CUJZVEUgW1NwZWNQa3RdLDAJO0NsZWFyIDFzdCBieXRlIG9mIFNwZWNQa3QKKwkJY2FsbAlTcGVjR28KKzsgQ2FycnkgaXMgbm90IGNsZWFyZWQgaW4gYnVnZ3kgRGVsbCBCSU9TZXMsCis7IHNvIEknbSBjaGVja2luZyBwYWNrZXQgc2l6ZSBieXRlCis7IHNvbWUgYm9ndXMgYmlvc2VzIChEZWxsIEluc3Bpcm9uIDI1MDApIHJldHVybnMgcGFja2V0IHNpemUgMHhmZiB3aGVuIGZhaWxlZAorOyBEZWxsIERpbWVuc2lvbiBYUHNUIHJldHVybnMgcGFja2V0IHNpemUgMHgxNCB3aGVuIE9LCisKKwkJY21wCUJZVEUgW1NwZWNQa3RdLCAxM2gJOyBhbnl0aGluZyBiZXR3ZWVuIDEzaCBhbmQgMjBoIHNob3VsZCBiZSBPSworCQlqYglGaW5kRmFpbAorCQljbXAJQllURSBbU3BlY1BrdF0sIDIwaAorCQlqYQlGaW5kRmFpbAk7IGluIDEuNCBhdCBlMTYKKwkJam1wCXNob3J0IFNlbmRGb3VuZAk7IGluIDEuNCBhdCBlMjYKKworRmluZEZhaWw6CWNtcAlkbCwgMGZmaAorCQlqZQlTZW5kRmFpbAkJOyBDaGVjayBmcm9tIDgwaC4uZmZoCisJCWptcAlzaG9ydCBOZXh0RHJ2CQk7TmV4dCBkcml2ZQorU2VuZEZhaWw6CXhvcglkbCxkbAorCQlzdGMKKwkJam1wCXNob3J0IFRoaW5nRG9uZQorU2VuZEZvdW5kOgltb3YJZGwsIFtTcGVjUGt0KzJdCisJCWNsYworVGhpbmdEb25lOglwb3AJc2kKKwkJcG9wCWF4CisJCXJldG4KKwkJOyAqKiogZW5kIDEuNCBjaGFuZ2VzICoqKgorCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBrZXlib2FyZCBmbGFncyAtIHJldHVybiBrZXlib2FyZCBmbGFncyBpbiBBTAorOyBiaXQgMyA9IEFMVCBrZXkKK2tleWZsYWc6CTsgYXQgZGJjIGluIDEuMywgYXQgZTJlIGluIDEuNAorCXB1c2gJYngKKwltb3YJYWgsIDIKKwlpbnQJMTZoCisJcG9wCWJ4CisJcmV0bgorCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRHJ2TnVtTXNnCWRiCScgIERpc2tlbXh4LmJpbiByZXR1cm5lZCBkcml2ZSBudW1iZXI9JywgMAorTm9Cb290Q0QJZGIJJyAgTm8gYm9vdGVkIENELVJPTSBmb3VuZC4nLENSLDAKKworQ0RTdGF0CQlkYgknICBJTlQgMTNoIC8gQVg9NEIwMWggU3BlY2lmaWNhdGlvbiBQYWNrZXQgZm9yICcKKwkJZGIJJ0Jvb3RlZCBDRC1ST006JyxDUiwnICAgICAnLCAwCisKK0NEQnl0ZXMJCWRiCScgIERyaXZlICcsIDAKK0NEQnl0ZXNBCWRiCScgcmV0dXJucyAnLCAwCitDREJ5dGVzQglkYgknaCBieXRlcyBwZXIgU2VjdG9yLicsQ1IsMAorCitEZXZOYW1lCQlkYgknICBEZXZpY2UgTmFtZTogJywgMAorTm9EZXZOYW1lCWRiCScgIE5vIERldmljZSBOYW1lIGZvdW5kLiAnCisJCWRiCSdVc2FnZTogZGV2aWNlPWVsdG9yaXRvLnN5cyAvRDo8RGV2TmFtZT4nLENSLDAKKworRHJ2SW5zdAkJZGIJJyAgRHJpdmVyICcsIDAKK05vRHJ2SW5zdAlkYgk3LCdub3QgJwkJOzcgPSBDdHJsLUcgPSBCZWVwCitEcnZJbnN0MQlkYgknaW5zdGFsbGVkJyxDUiwwCisKK1dhaXRNc2cJCWRiCScgIEFsdCBwcmVzc2VkLCB3YWl0aW5nLi4uJywgQ1IsIDAKKztDb250TXNnCQlkYgknICBDb250aW51aW5nLi4uJworTGluZUVuZAkJZGIJQ1IsMAorCisKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvZG9zdXRpbC9lbHRvcml0by50eHQgYi9kb3N1dGlsL2VsdG9yaXRvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZlNTRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9zdXRpbC9lbHRvcml0by50eHQKQEAgLTAsMCArMSw1MCBAQAorCitDaGFuZ2UgbG9nIGZvciBlbHRvcml0by5hc20sIGJ5IEJhcnQgTGFnZXJ3ZWlqCisKK0p1biAyNSwgMjAwOSAtIExpY2Vuc2Ugc291cmNlIGNvZGUgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCisKK0p1biA2LCAyMDAyIC0gdjEuMgorRWx0b3JpdG8uc3lzIGRvZXMgbm93IGFsc28gZmluZHMgdGhlIGNvcnJlY3QgZHJpdmVyIG51bWJlciBmb3IgdGhlIGJvb3RlZCBDRC1Sb20KK29uIGEgRGVsbCBQQyB3aXRoIHZlcnkgYnVnZ3kgQklPUy4gSXQgZG9lcyBub3QgY2xlYXIgdGhlIGNhcnJ5IGZsYWcgYWZ0ZXIgYQorc3VjY2VzZnVsbCBjYWxsIHRvIGludDEzL2F4PTRiMDFoIGNhbGwuIE90aGVyIFBDJ3MgYWxzbyB1c2luZyBQaG9lbml4IEJJT1MKK3ZlcnNpb24gMS4xMCBBMTQsIG9yIGFsaWtlIG1heWJlIGFsc28gYmVuZWZpdCBmcm9tIHRoaXMgIndvcmthcm91bmQiLgorCitNYXIgOSwgMjAwMgorLSBBbGwgcmVhZCByZXF1ZXN0cyBhcmUgbm93IHJldHJpZWQgNSB0aW1lcy4KKy0gQnVnIGZpeCwgaGFkLi4uCisJY21wCWF4LCAzRkZGaAkJO1RvbyBsYXJnZT8KKwlqYQlSZWFkTEJhZAkJO0lmIHllcworICBzZXBlcmF0ZWQgZnJvbS4uLgorCW1vdglheCxlczpbYngrMThdCQk7R2V0IG51bWJlciBvZiBzZWN0b3JzIHRvIHJlYWQKKwltb3YJd29yZCBwdHIgW1NwZWNQa3QrMl0sYXgKKyAgc28sIGl0IHdhcyBjaGVja2luZyAid2lsZCIgYXggdmFsdWVzLi4uCistIFNvbWUgY2xlYW51cCBhbmQgc21hbGwgY2hhbmdlcworLSBUaGUgdHJhY2VycyBnaXZlIHRyb3VibGUgd2hlbiB1c2luZyBTSENELi4KKy0gUmV2ZXJ0ZWQgcHJvYyBSZWFkTCBiYWNrIHRvIFJldi4gMC4xNUJFVEEKKworTWFyIDUsIDIwMDIKKy0gQnVnIGZpeCwgd2hlbiBjaGFuZ2luZyBDRCBtZWRpYSBzb21lIG1hY2hpbmVzIHdvdWxkICJoYW5nIiBpbiB0aGUgUHJpVm9sRGVzYworICByb3V0aW5lLgorLSBBZGRlZCBwcmludGluZyBvZiBUUkFDRVIgY2hhcmFjdGVycyB0byB0cmFjZSB0aGUgYnVnIGFib3ZlCistIE1ham9yIGNsZWFudXAgYW5kIG5vdyB1c2luZyBBU0NJSVogc3RyaW5ncworCitNYXkgOSwgMjAwMQorLSBGaXhlZCBhICJwYWQgZGV2aWNlbmFtZSB3aXRoIHNwYWNlcyIgYnVnLCB0aGlzIG9ubHkgaGFwcGVuZWQgd2hlbiBhIGRldmljZQorICBuYW1lIHdhcyB1c2VkIHdpdGggbGVzcyB0aGFuIDggY2hhcmFjdGVycywgZm9yIGV4YW1wbGUsICJNU0NEMDAwIiBiZWNhbWUKKyAgIk1TQ0QwMDAoIgorLSBCdWcgZml4LCB3aGVuIGVsdG9yaXRvLnN5cyB3YXMgY2FsbGVkIHdpdGggaW52YWxpZCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycywKKyAgZ2FyYmFnZSB3YXMgcHJpbnRlZCBhbmQgc29tZXRpbWVzIGZvbGxvd2VkIGJ5ICJzeXN0ZW0gaGFsdGVkIiB0aGF0IGhhcyBiZWVuCisgIHRoZXJlIHNpbmNlIHRoZSB2ZXJ5IGZpcnN0IHZlcnNpb24gb2YgZWx0b3JpdG8uc3lzLiBJIGtub3cgdGhhdCBiZWNhdXNlIEkKKyAgaGFkIHRoZSBidWcgYmFjayB0aGVuLiBXaGVuIGxvYWRpbmcgZWx0b3JpdG8uc3lzIHVzaW5nIGEgZGV2aWNlIGxvYWRlciwKKyAgZm9yIGV4YW1wbGUgImRldmljZS5jb20gZWx0b3JpdG8uc3lzIC90ZXN0OjEyMyIgZ2FyYmFnZSB3YXMgcHJpbnRlZCBpbnN0ZWFkCisgIG9mICJObyBkZXZpY2UgbmFtZSBmb3VuZC4iICJkcml2ZXIgbm90IGluc3RhbGxlZCIuCisgIENoYW5nZWQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gaW5jbHVkZSBhICJ1c2FnZSIgc3RyaW5nLgorCitNYXkgOCwgMjAwMQorLSBJZiBkaXNrZW11LmJpbiBpcyBsb2FkZWQgZWx0b3JpdG8uc3lzIHVzZXMgdGhlIGRyaXZlbnVtYmVyIGZyb20gZGlza2VtdQorICBBIGNhbGwgaXMgbWFkZSB0byAiZGlza2VtdS9HZXQgc3RhdHVzIiAoSU5UMTMvQVg9NTQwMCkgYW5kIHRoZSBkcml2ZW51bWJlciBpcyByZXR1cm5lZCBpbiBDTAorICBUaGlzIHNob3VsZCBmaXggYm9vdCBwcm9ibGVtcyBvbiBEZWxsIFBDcyAoWUVTISkKKyAgV2hlbiBkaXNrZW11LmJpbiBpcyBub3QgbG9hZGVkLCBlbHRvcml0byBzdGlsbCBsb29wcyBhbGwgZHJpdmUgbnVtYmVycyB1c2luZyBlbHRvcml0byBjYWxscy4KKy0gUmVtb3ZlZCAicHJlc3MgRXNjYXBlLi4uIgorLSBXaGVuIHRoZSBBbHQta2V5IGlzIHByZXNzZWQgKGFuZCBob2xkZWQpIG1vcmUgaW5mbyBpcyBwcmludGVkIGFuZCBlbHRvcml0by5zeXMgaGFsdHMKKwpkaWZmIC0tZ2l0IGEvZG9zdXRpbC9tZGlza2Noay5jIGIvZG9zdXRpbC9tZGlza2Noay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YmIwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb3N1dGlsL21kaXNrY2hrLmMKQEAgLTAsMCArMSwzNTcgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIFBvcnRpb25zIGNvcHlyaWdodCAyMDEwIFNoYW8gTWlsbGVyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1kaXNrY2hrLmMKKyAqCisgKiBET1MgcHJvZ3JhbSB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIG1lbWRpc2suCisgKgorICogVGhpcyBwcm9ncmFtIGNhbiBiZSBjb21waWxlZCBmb3IgRE9TIHdpdGggdGhlIE9wZW5XYXRjb20gY29tcGlsZXIKKyAqIChodHRwOi8vd3d3Lm9wZW53YXRjb20ub3JnLyk6CisgKgorICogd2NsIC0zIC1vc3ggLW10IG1kaXNrY2hrLmMKKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGk4Ni5oPgkJLyogRm9yIE1LX0ZQKCkgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OworCisvKiBQdWxsIGluIE1FTURJU0sgY29tbW9uIHN0cnVjdHVyZXMgKi8KKyNpbmNsdWRlICIuLi9tZW1kaXNrL21zdHJ1Y3RzLmgiCisKK3N0cnVjdCBtZW1kaXNraW5mbyB7CisgICAgc3RydWN0IG1kaSBtZGk7CisKKyAgICAvKiBXZSBhZGQgb3VyIG93biBmaWVsZHMgYXQgdGhlIGVuZCAqLworICAgIGludCBjeWxpbmRlcnM7CisgICAgaW50IGhlYWRzOworICAgIGludCBzZWN0b3JzOworfTsKKworc3RydWN0IG1lbWRpc2tpbmZvICpxdWVyeV9tZW1kaXNrKGludCBkcml2ZSkKK3sKKyAgICBzdGF0aWMgc3RydWN0IG1lbWRpc2tpbmZvIG1tOworICAgIHVpbnQzMl90IF9lYXgsIF9lYngsIF9lY3gsIF9lZHg7CisgICAgdWludDE2X3QgX2VzLCBfZGk7CisgICAgdW5zaWduZWQgY2hhciBfZGwgPSBkcml2ZTsKKyAgICB1aW50MTZfdCBieXRlczsKKworICAgIF9fYXNtIHsKKwkuMzg2OworCW1vdiBlYXgsIDQ1NGQwODAwaDsKKwltb3YgZWN4LCA0NDRkMDAwMGg7CisJbW92IGVkeCwgNTM0OTAwMDBoOworCW1vdiBkbCwgX2RsOworCW1vdiBlYngsIDNmNGIwMDAwaDsKKwlpbnQgMTNoOworCW1vdiBfZWF4LCBlYXg7CisJbW92IF9lY3gsIGVjeDsKKwltb3YgX2VkeCwgZWR4OworCW1vdiBfZWJ4LCBlYng7CisJbW92IF9lcywgZXM7CisJbW92IF9kaSwgZGk7CisgICAgfQorCisgICAgaWYgKF9lYXggPj4gMTYgIT0gMHg0ZDIxIHx8CisJX2VjeCA+PiAxNiAhPSAweDRkNDUgfHwgX2VkeCA+PiAxNiAhPSAweDQ5NDQgfHwgX2VieCA+PiAxNiAhPSAweDRiNTMpCisJcmV0dXJuIE5VTEw7CisKKyAgICBtZW1zZXQoJm1tLCAwLCBzaXplb2YgbW0pOworCisgICAgYnl0ZXMgPSAqKHVpbnQxNl90IGZhciAqKSBNS19GUChfZXMsIF9kaSk7CisKKyAgICAvKiAyNyBpcyB0aGUgbW9zdCB3ZSBrbm93IGhvdyB0byBoYW5kbGUgKi8KKyAgICBpZiAoYnl0ZXMgPiAyNykKKwlieXRlcyA9IDI3OworCisgICAgX2ZtZW1jcHkoKHZvaWQgZmFyICopJm1tLCAodm9pZCBmYXIgKilNS19GUChfZXMsIF9kaSksIGJ5dGVzKTsKKworICAgIG1tLmN5bGluZGVycyA9ICgoX2VjeCA+PiA4KSAmIDB4ZmYpICsgKChfZWN4ICYgMHhjMCkgPDwgMikgKyAxOworICAgIG1tLmhlYWRzID0gKChfZWR4ID4+IDgpICYgMHhmZikgKyAxOworICAgIG1tLnNlY3RvcnMgPSAoX2VjeCAmIDB4M2YpOworCisgICAgcmV0dXJuICZtbTsKK30KKworY29uc3QgY2hhciAqYm9vdGxvYWRlcm5hbWUodWludDhfdCBpZCkKK3sKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1aW50OF90IGlkLCBtYXNrOworCWNvbnN0IGNoYXIgKm5hbWU7CisgICAgfSAqbHAsIGxpc3RbXSA9IHsKKwl7MHgwMCwgMHhmMCwgIkxJTE8ifSwgCisJezB4MTAsIDB4ZjAsICJMT0FETElOIn0sCisJezB4MzEsIDB4ZmYsICJTWVNMSU5VWCJ9LAorCXsweDMyLCAweGZmLCAiUFhFTElOVVgifSwKKwl7MHgzMywgMHhmZiwgIklTT0xJTlVYIn0sCisJezB4MzQsIDB4ZmYsICJFWFRMSU5VWCJ9LAorCXsweDMwLCAweGYwLCAiU1lTTElOVVggZmFtaWx5In0sCisJezB4NDAsIDB4ZjAsICJFdGhlcmJvb3QifSwKKwl7MHg1MCwgMHhmMCwgIkVMSUxPIn0sCisJezB4NzAsIDB4ZjAsICJHclVCIn0sCisJezB4ODAsIDB4ZjAsICJVLUJvb3QifSwKKwl7MHhBMCwgMHhmMCwgIkd1amluIn0sCisJezB4QjAsIDB4ZjAsICJRZW11In0sCisJezB4MDAsIDB4MDAsICJ1bmtub3duIn0KKyAgICB9OworCisgICAgZm9yIChscCA9IGxpc3Q7OyBscCsrKSB7CisJaWYgKCgoaWQgXiBscC0+aWQpICYgbHAtPm1hc2spID09IDApCisJICAgIHJldHVybiBscC0+bmFtZTsKKyAgICB9Cit9CisKKy8qIFRoZSBmdW5jdGlvbiB0eXBlIGZvciBhbiBvdXRwdXQgZnVuY3Rpb24gKi8KKyNkZWZpbmUgT1VUUFVUX0ZVTkNfREVDTCh4KSBcCit2b2lkIHgoY29uc3QgaW50IGQsIGNvbnN0IHN0cnVjdCBtZW1kaXNraW5mbyAqIGNvbnN0IG0pCit0eXBlZGVmIE9VVFBVVF9GVU5DX0RFQ0woKCpvdXRwdXRfZnVuYykpOworCisvKiBTaG93IE1FTURJU0sgaW5mb3JtYXRpb24gZm9yIHRoZSBwYXNzZWQgc3RydWN0dXJlICovCitzdGF0aWMgT1VUUFVUX0ZVTkNfREVDTChub3JtYWxfb3V0cHV0KQoreworICAgIGlmIChtID09IE5VTEwpCisJcmV0dXJuOworICAgIHByaW50ZigiRHJpdmUgJTAyWCBpcyBNRU1ESVNLICV1LiUwMnU6XG4iCisJICAgIlx0QWRkcmVzcyA9IDB4JTA4bHgsIGxlbiA9ICVsdSBzZWN0b3JzLCBjaHMgPSAldS8ldS8ldSxcbiIKKwkgICAiXHRsb2FkZXIgPSAweCUwMnggKCVzKSxcbiIKKwkgICAiXHRjbWRsaW5lID0gJUZzXG4iLAorCSAgIGQsIG0tPm1kaS52ZXJzaW9uX21ham9yLCBtLT5tZGkudmVyc2lvbl9taW5vciwKKwkgICBtLT5tZGkuZGlza2J1ZiwgbS0+bWRpLmRpc2tzaXplLCBtLT5jeWxpbmRlcnMsIG0tPmhlYWRzLCBtLT5zZWN0b3JzLAorCSAgIG0tPm1kaS5ib290bG9hZGVyaWQsIGJvb3Rsb2FkZXJuYW1lKG0tPm1kaS5ib290bG9hZGVyaWQpLAorCSAgIE1LX0ZQKG0tPm1kaS5jbWRsaW5lLnNlZ19vZmYuc2VnbWVudCwKKwkJIG0tPm1kaS5jbWRsaW5lLnNlZ19vZmYub2Zmc2V0KSk7Cit9CisKKy8qIFlpZWxkIERPUyBTRVQgY29tbWFuZChzKSBhcyBvdXRwdXQgZm9yIGVhY2ggTUVNRElTSyBrZXJuZWwgYXJndW1lbnQgKi8KK3N0YXRpYyBPVVRQVVRfRlVOQ19ERUNMKGJhdGNoX291dHB1dCkKK3sKKyAgICBpZiAobSAhPSBOVUxMKSB7CisJY2hhciBidWZbMjU2XSwgKmJjOworCWNvbnN0IGNoYXIgZmFyICpjID0KKwkgICAgTUtfRlAobS0+bWRpLmNtZGxpbmUuc2VnX29mZi5zZWdtZW50LAorCQkgIG0tPm1kaS5jbWRsaW5lLnNlZ19vZmYub2Zmc2V0KTsKKwljb25zdCBjaGFyICpoYXZlX2VxdWFscywgaXNfc2V0W10gPSAiPTEiOworCisJd2hpbGUgKCpjICE9ICdcMCcpIHsKKwkgICAgLyogU2tpcCB3aGl0ZXNwYWNlICovCisJICAgIHdoaWxlIChpc3NwYWNlKCpjKSkKKwkJYysrOworCSAgICBpZiAoKmMgPT0gJ1wwJykKKwkJLyogVHJhaWxpbmcgd2hpdGVzcGFjZS4gIFRoYXQncyBlbm91Z2ggcHJvY2Vzc2luZyAqLworCQlicmVhazsKKwkgICAgLyogV2FsayB0aGUga2VybmVsIGFyZ3VtZW50cyB3aGlsZSBmaWxsaW5nIHRoZSBidWZmZXIsCisJICAgICAqIGxvb2tpbmcgZm9yIHNwYWNlIG9yIE5VTCBvciBjaGVja2luZyBmb3IgYSBmdWxsIGJ1ZmZlcgorCSAgICAgKi8KKwkgICAgYmMgPSBidWY7CisJICAgIGhhdmVfZXF1YWxzID0gaXNfc2V0OworCSAgICB3aGlsZSAoKCpjICE9ICdcMCcpICYmICFpc3NwYWNlKCpjKSAmJgorCQkgICAoYmMgPCAmYnVmW3NpemVvZihidWYpIC0gMV0pKSB7CisJCS8qIENoZWNrIGlmIHRoZSBwYXJhbSBpcyAieD15IiAqLworCQlpZiAoKmMgPT0gJz0nKQorCQkgICAgLyogIj0xIiBub3QgbmVlZGVkICovCisJCSAgICBoYXZlX2VxdWFscyA9ICZpc19zZXRbc2l6ZW9mKGlzX3NldCkgLSAxXTsKKwkJKmJjID0gKmM7CisJCWMrKzsKKwkJYmMrKzsKKwkgICAgfQorCSAgICAvKiBGb3VuZCB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgYW5kIG9wdGlvbmFsIHZhbHVlIHNlcXVlbmNlICovCisJICAgICpiYyA9ICdcMCc7CisJICAgIHByaW50Zigic2V0ICVzJXNcbiIsIGJ1ZiwgaGF2ZV9lcXVhbHMpOworCX0KKyAgICB9Cit9CisKKy8qIFdlIGRvIG5vdCBvdXRwdXQgYmF0Y2ggZmlsZSBvdXRwdXQgYnkgZGVmYXVsdC4gIFdlIHNob3cgTUVNRElTSyBpbmZvICovCitzdGF0aWMgb3V0cHV0X2Z1bmMgc2hvd19tZW1kaXNrID0gbm9ybWFsX291dHB1dDsKKworLyogQSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgKi8KKyNkZWZpbmUgTURJU0tDSEtfRlVOQ19ERUNMKHgpIFwKK3ZvaWQgeCh2b2lkKQordHlwZWRlZiBNRElTS0NIS19GVU5DX0RFQ0woKCptZGlza2Noa19mdW5jKSk7CisKK3N0YXRpYyBNRElTS0NIS19GVU5DX0RFQ0woZG9fbm90aGluZykKK3sKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBNRElTS0NIS19GVU5DX0RFQ0woc2hvd191c2FnZSkKK3sKKyAgICBwcmludGYoIlxuVXNhZ2U6IG1kaXNrY2hrIFstLXNhZmUtaG9va3NdIFstLW1iZnRzXSBbLS1iYXRjaC1vdXRwdXRdXG4iCisJICAgIlxuIgorCSAgICJBY3Rpb246IC0tc2FmZS1ob29rcyAuIC4gV2lsbCBzY2FuIElOVCAxM2ggXCJzYWZlIGhvb2tcIiBjaGFpblxuIgorCSAgICIgICAgICAgIC0tbWJmdHMgLiAuIC4gLiAgV2lsbCBzY2FuIG1lbW9yeSBmb3IgTUVNRElTSyBtQkZUc1xuIgorCSAgICIgICAgICAgIC0tYmF0Y2gtb3V0cHV0IC4gV2lsbCBvdXRwdXQgU0VUIGNvbW1hbmQgb3V0cHV0IGJhc2VkXG4iCisJICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBvbiBNRU1ESVNLIGtlcm5lbCBhcmd1bWVudHNcbiIKKwkgICAiICAgICAgICAtLW5vLXNlcXVlbnRpYWwgIFN1cHByZXNzZXMgcHJvYmluZyBhbGwgZHJpdmUgbnVtYmVyc1xuIik7Cit9CisKKy8qIFNlYXJjaCBtZW1vcnkgZm9yIG1CRlRzIGFuZCByZXBvcnQgdGhlbSB2aWEgdGhlIG91dHB1dCBtZXRob2QgKi8KK3N0YXRpYyBNRElTS0NIS19GVU5DX0RFQ0woc2hvd19tYmZ0cykKK3sKKyAgICBjb25zdCB1aW50MTZfdCBmYXIgKiBjb25zdCBmcmVlX2Jhc2VfbWVtID0KKwlNS19GUCgweDAwNDAsIDB4MDAxMyk7CisgICAgaW50IHNlZzsKKyAgICB1aW50OF90IGNoa3N1bTsKKyAgICB1aW50MzJfdCBpOworICAgIGNvbnN0IHN0cnVjdCBtQkZUIGZhciAqbWJmdDsKKyAgICBzdHJ1Y3QgbWVtZGlza2luZm8gbTsKKyAgICBzdHJ1Y3QgcGF0Y2hfYXJlYSBmYXIgKnBhdGNoX2FyZWE7CisKKyAgICBmb3IgKHNlZyA9ICpmcmVlX2Jhc2VfbWVtIC8gMTY7IHNlZyA8IDB4OUZGRjsgc2VnKyspIHsKKwltYmZ0ID0gTUtfRlAoc2VnLCAwKTsKKwkvKiBDaGVjayBmb3Igc2lnbmF0dXJlICovCisJaWYgKG1iZnQtPmFjcGkuc2lnbmF0dXJlWzBdICE9ICdtJyB8fAorCSAgICBtYmZ0LT5hY3BpLnNpZ25hdHVyZVsxXSAhPSAnQicgfHwKKwkgICAgbWJmdC0+YWNwaS5zaWduYXR1cmVbMl0gIT0gJ0YnIHx8CisJICAgIG1iZnQtPmFjcGkuc2lnbmF0dXJlWzNdICE9ICdUJykKKwkgICAgY29udGludWU7CisJaWYgKG1iZnQtPmFjcGkubGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgbUJGVCkpCisJICAgIGNvbnRpbnVlOworCS8qIENoZWNrIHN1bSAqLworCWNoa3N1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgbUJGVCk7IGkrKykKKwkgICAgY2hrc3VtICs9ICgoY29uc3QgdWludDhfdCBmYXIgKiltYmZ0KVtpXTsKKwlpZiAoY2hrc3VtKQorCSAgICBjb250aW51ZTsKKwkvKiBDb3B5IHRoZSBNREkgZnJvbSB0aGUgbUJGVCAqLworCV9mbWVtY3B5KCh2b2lkIGZhciAqKSZtLCAmbWJmdC0+bWRpLCBzaXplb2Yoc3RydWN0IG1kaSkpOworCS8qIEFkanVzdCBDL0gvUyBzaW5jZSB3ZSBhY3R1YWxseSBrbm93CisJICogaXQgZGlyZWN0bHkgZm9yIGFueSBNRU1ESVNLIHdpdGggYW4gbUJGVAorCSAqLworCXBhdGNoX2FyZWEgPSAoc3RydWN0IHBhdGNoX2FyZWEgZmFyICopJm1iZnQtPm1kaTsKKwltLmN5bGluZGVycyA9IHBhdGNoX2FyZWEtPmN5bGluZGVyczsKKwltLmhlYWRzID0gcGF0Y2hfYXJlYS0+aGVhZHM7CisJbS5zZWN0b3JzID0gcGF0Y2hfYXJlYS0+c2VjdG9yczsKKwlzaG93X21lbWRpc2socGF0Y2hfYXJlYS0+ZHJpdmVubywgJm0pOworICAgIH0KK30KKworLyogV2FsayB0aGUgInNhZmUgaG9vayIgY2hhaW4gYXMgZmFyIGFzIHBvc3NpYmxlCisgKiBhbmQgcmVwb3J0IE1FTURJU0tzIHRoYXQgd2UgZmluZCB2aWEgdGhlIG91dHB1dCBtZXRob2QKKyAqLworc3RhdGljIE1ESVNLQ0hLX0ZVTkNfREVDTChzaG93X3NhZmVfaG9va3MpCit7CisgICAgY29uc3QgcmVhbF9hZGRyX3QgZmFyICogY29uc3QgaW50MTMgPQorCU1LX0ZQKDB4MDAwMCwgMHgwMDEzICogc2l6ZW9mKHJlYWxfYWRkcl90KSk7CisgICAgY29uc3Qgc3RydWN0IHNhZmVfaG9vayBmYXIgKmhvb2sgPQorCU1LX0ZQKGludDEzLT5zZWdfb2ZmLnNlZ21lbnQsIGludDEzLT5zZWdfb2ZmLm9mZnNldCk7CisKKyAgICB3aGlsZSAoKGhvb2stPnNpZ25hdHVyZVswXSA9PSAnJCcpICYmCisJICAgKGhvb2stPnNpZ25hdHVyZVsxXSA9PSAnSScpICYmCisJICAgKGhvb2stPnNpZ25hdHVyZVsyXSA9PSAnTicpICYmCisJICAgKGhvb2stPnNpZ25hdHVyZVszXSA9PSAnVCcpICYmCisJICAgKGhvb2stPnNpZ25hdHVyZVs0XSA9PSAnMScpICYmCisJICAgKGhvb2stPnNpZ25hdHVyZVs1XSA9PSAnMycpICYmCisJICAgKGhvb2stPnNpZ25hdHVyZVs2XSA9PSAnUycpICYmCisJICAgKGhvb2stPnNpZ25hdHVyZVs3XSA9PSAnRicpKSB7CisJLyogRm91bmQgYSB2YWxpZCAic2FmZSBob29rIiAqLworCWlmICgoaG9vay0+dmVuZG9yWzBdID09ICdNJykgJiYKKwkgICAgKGhvb2stPnZlbmRvclsxXSA9PSAnRScpICYmCisJICAgIChob29rLT52ZW5kb3JbMl0gPT0gJ00nKSAmJgorCSAgICAoaG9vay0+dmVuZG9yWzNdID09ICdEJykgJiYKKwkgICAgKGhvb2stPnZlbmRvcls0XSA9PSAnSScpICYmCisJICAgIChob29rLT52ZW5kb3JbNV0gPT0gJ1MnKSAmJgorCSAgICAoaG9vay0+dmVuZG9yWzZdID09ICdLJykpIHsKKwkgICAgLyogRm91bmQgYSB2YWxpZCBNRU1ESVNLICJzYWZlIGhvb2siLiAgSXQgd2lsbCBoYXZlIGFuIG1CRlQgKi8KKwkgICAgY29uc3Qgc3RydWN0IG1CRlQgZmFyICptYmZ0OworCSAgICBzdHJ1Y3QgbWVtZGlza2luZm8gbTsKKwkgICAgc3RydWN0IHBhdGNoX2FyZWEgZmFyICpwYXRjaF9hcmVhOworCisJICAgIC8qIENvcHkgdGhlIE1ESSBmcm9tIHRoZSBtQkZULiAgT2Zmc2V0IGlzIGEgbWlzbm9tZXIgaGVyZSAqLworCSAgICBtYmZ0ID0gTUtfRlAoaG9vay0+bWJmdCA+PiA0LCAwKTsJLyogQWx3YXlzIGFsaWduZWQgKi8KKwkgICAgX2ZtZW1jcHkoKHZvaWQgZmFyICopJm0sICZtYmZ0LT5tZGksIHNpemVvZihzdHJ1Y3QgbWRpKSk7CisJICAgIC8qIEFkanVzdCBDL0gvUyBzaW5jZSB3ZSBhY3R1YWxseSBrbm93CisJICAgICAqIGl0IGRpcmVjdGx5IGZvciBhbnkgTUVNRElTSyB3aXRoIGFuIG1CRlQKKwkgICAgICovCisJICAgIHBhdGNoX2FyZWEgPSAoc3RydWN0IHBhdGNoX2FyZWEgZmFyICopJm1iZnQtPm1kaTsKKwkgICAgbS5jeWxpbmRlcnMgPSBwYXRjaF9hcmVhLT5jeWxpbmRlcnM7CisJICAgIG0uaGVhZHMgPSBwYXRjaF9hcmVhLT5oZWFkczsKKwkgICAgbS5zZWN0b3JzID0gcGF0Y2hfYXJlYS0+c2VjdG9yczsKKwkgICAgc2hvd19tZW1kaXNrKHBhdGNoX2FyZWEtPmRyaXZlbm8sICZtKTsKKwl9IC8qIGlmICovCisJLyogU3RlcCB0byB0aGUgbmV4dCBob29rIGluIHRoZSAic2FmZSBob29rIiBjaGFpbiAqLworCWhvb2sgPSBNS19GUChob29rLT5vbGRfaG9vay5zZWdfb2ZmLnNlZ21lbnQsCisJCSAgICAgaG9vay0+b2xkX2hvb2suc2VnX29mZi5vZmZzZXQpOworICAgIH0gLyogd2hpbGUgKi8KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgZDsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCBzZXF1ZW50aWFsX3NjYW4gPSAxOwkvKiBDbGFzc2ljIGJlaGF2aW91ciAqLworICAgIGNvbnN0IHN0cnVjdCBtZW1kaXNraW5mbyAqbTsKKworICAgIC8qIERlZmF1bHQgYmVoYXZpb3VyICovCisgICAgbWRpc2tjaGtfZnVuYyB1c2FnZSA9IGRvX25vdGhpbmcsCisJc2FmZV9ob29rcyA9IGRvX25vdGhpbmcsCisJbWJmdHMgPSBkb19ub3RoaW5nOworCisgICAgLyogRm9yIGVhY2ggYXJndW1lbnQgKi8KKyAgICB3aGlsZSAoLS1hcmdjKSB7CisJLyogQXJndW1lbnQgc2hvdWxkIGJlZ2luIHdpdGggb25lIG9mIHRoZXNlIGNoYXJzICovCisJaWYgKCgqYXJndlthcmdjXSAhPSAnLycpICYmICgqYXJndlthcmdjXSAhPSAnLScpKSB7CisJICAgIC8qIEl0IGRvZXNuJ3QuICBQcmludCB1c2FnZSBzb29uICovCisJICAgIHVzYWdlID0gc2hvd191c2FnZTsKKwkgICAgYnJlYWs7CisJfQorCWFyZ3ZbYXJnY10rKzsKKworCS8qIE5leHQgY2hhciBtaWdodCBiZSAnLScgYXMgaW4gIi0tc2FmZS1ob29rcyIgKi8KKwlpZiAoKmFyZ3ZbYXJnY10gPT0gJy0nKQorCSAgICBhcmd2W2FyZ2NdKys7CisKKwlzd2l0Y2ggKCphcmd2W2FyZ2NdKSB7CisJICAgIGNhc2UgJ1MnOgorCSAgICBjYXNlICdzJzoKKwkJc2FmZV9ob29rcyA9IHNob3dfc2FmZV9ob29rczsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ00nOgorCSAgICBjYXNlICdtJzoKKwkJbWJmdHMgPSBzaG93X21iZnRzOworCQlicmVhazsKKwkgICAgY2FzZSAnQic6CisJICAgIGNhc2UgJ2InOgorCQlzaG93X21lbWRpc2sgPSBiYXRjaF9vdXRwdXQ7CisJCWJyZWFrOworCSAgICBjYXNlICdOJzoKKwkgICAgY2FzZSAnbic6CisJCXNlcXVlbnRpYWxfc2NhbiA9IDA7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQl1c2FnZSA9IHNob3dfdXNhZ2U7CisJfSAvKiBzd2l0Y2ggKi8KKyAgIH0gLyogd2hpbGUgKi8KKworICAgIHNhZmVfaG9va3MoKTsKKyAgICBtYmZ0cygpOworICAgIGlmICghc2VxdWVudGlhbF9zY2FuKQorCWdvdG8gc2tpcF9zZXF1ZW50aWFsOworICAgIGZvciAoZCA9IDA7IGQgPD0gMHhmZjsgZCsrKSB7CisJbSA9IHF1ZXJ5X21lbWRpc2soZCk7CisJaWYgKG0gIT0gTlVMTCkgeworCSAgICBmb3VuZCsrOworCSAgICBzaG93X21lbWRpc2soZCwgbSk7CisJfQorICAgIH0KK3NraXBfc2VxdWVudGlhbDoKKyAgICB1c2FnZSgpOworCisgICAgcmV0dXJuIGZvdW5kOworfQorCmRpZmYgLS1naXQgYS9kb3N1dGlsL21kaXNrY2hrLmNvbSBiL2Rvc3V0aWwvbWRpc2tjaGsuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyY2NmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb3N1dGlsL21kaXNrY2hrLmNvbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kdW1teS5jIGIvZHVtbXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjAyYzliCi0tLSAvZGV2L251bGwKKysrIGIvZHVtbXkuYwpAQCAtMCwwICsxLDggQEAKKy8qCisgKiBUcml2aWFsIEMgcHJvZ3JhbSB0byB0ZXN0IHRoZSBjb21waWxlcgorICovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lZmkvTWFrZWZpbGUgYi9lZmkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0NDNiZAotLS0gL2Rldi9udWxsCisrKyBiL2VmaS9NYWtlZmlsZQpAQCAtMCwwICsxLDEwOSBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IE1hdHQgRmxlbWluZworIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvbGliLm1rCitpbmNsdWRlICQoTUFLRURJUikvZWZpLm1rCisKKyMgVXBzdHJlYW0gZ251LWVmaSBoYXMgb2xkLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorQ0ZMQUdTICs9IC1Xbm8tc3RyaWN0LXByb3RvdHlwZXMKKworQ09SRV9DU1JDIDo9ICQod2lsZGNhcmQgJChjb3JlKS8qLmMgJChjb3JlKS8qLyouYyAkKGNvcmUpLyovKi8qLmMpCitDT1JFX0NPQkogOj0gJChzdWJzdCAkKGNvcmUpLCQoT0JKKS8uLi9jb3JlLywkKHBhdHN1YnN0ICUuYywlLm8sJChDT1JFX0NTUkMpKSkKKworIyBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgYW55IG9mIHRoZSBuZXR3b3JraW5nIHN0YWNrIG9yIHRoZSB0aHJlYWQKKyMgY29kZSBzaW5jZSBpdCB3aWxsIGJlIGltcGxlbWVudGVkIGNvbXBsZXRlbHkgZGlmZmVyZW50bHkgZm9yIEVGSS4KK0ZJTFRFUkVEX09CSlM6PSAkKHN1YnN0ICQoY29yZSksJChPQkopLy4uL2NvcmUvLCQocGF0c3Vic3QgJS5jLCUubywgXAorCSQod2lsZGNhcmQgJChjb3JlKS9sZWdhY3luZXQvKi5jKSBcCisJJCh3aWxkY2FyZCAkKGNvcmUpL2ZzL3B4ZS8qLmMpIFwKKwkkKHdpbGRjYXJkICQoY29yZSkvdGhyZWFkLyouYykpKQorCisjIERvbid0IGluY2x1ZGUgdW5pdCB0ZXN0cworRklMVEVSRURfT0JKUyArPSAkKHN1YnN0ICQoY29yZSksJChPQkopLy4uL2NvcmUvLCBcCisJJChwYXRzdWJzdCAlLmMsJS5vLCQoc2hlbGwgZmluZCAkKGNvcmUpIC1wYXRoICIqL3Rlc3RzLyouYyIgLXByaW50KSkpCisKKyMgRG9uJ3QgaW5jbHVkZSBjb25zb2xlIG9iamVjdHMKK0NPUkVfT0JKUyA9ICQoZmlsdGVyLW91dCAlaGVsbG8ubyAlcmF3Y29uLm8gJXBsYWluY29uLm8gJXN0cmNhc2VjbXAubyAlYmlvcy5vIFwKKwklZGlza2lvX2Jpb3MubyAlbGRsaW51eC1jLm8gJWlzb2xpbnV4LWMubyAlcHhlbGludXgtYy5vIFwKKwklbG9jYWxib290Lm8gJXB4ZWJvb3QubyBcCisJJChGSUxURVJFRF9PQkpTKSwkKENPUkVfQ09CSikgJChDT1JFX1NPQkopKQorCitDT1JFX09CSlMgKz0gJChhZGRwcmVmaXggJChPQkopLy4uL2NvcmUvLCBcCisJZnMvcHhlL3B4ZS5vIGZzL3B4ZS90ZnRwLm8gZnMvcHhlL3VybHBhcnNlLm8gZnMvcHhlL2RoY3Bfb3B0aW9uLm8gXAorCWZzL3B4ZS9mdHAubyBmcy9weGUvZnRwX3JlYWRkaXIubyBmcy9weGUvaHR0cC5vIGZzL3B4ZS9odHRwX3JlYWRkaXIubykKKworTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKG9iamRpcikvY29tMzIvbGliLywkKENPUkVMSUJPQkpTKSkgXAorCSQoTElCRUZJKQorCitDU1JDID0gJCh3aWxkY2FyZCAkKFNSQykvKi5jKQorT0JKUyA9ICQoc3Vic3QgJChTUkMpLywsJChmaWx0ZXItb3V0ICV3cmFwcGVyLm8sICQocGF0c3Vic3QgJS5jLCUubywkKENTUkMpKSkpCisKK09CSlMgKz0gJChvYmpkaXIpL2NvcmUvY29kZXBhZ2UubyAkKEFSQ0gpL2xpbnV4Lm8KKworIyBUaGUgREFURSBpcyBzZXQgb24gdGhlIG1ha2UgY29tbWFuZCBsaW5lIHdoZW4gYnVpbGRpbmcgYmluYXJpZXMgZm9yCisjIG9mZmljaWFsIHJlbGVhc2UuICBPdGhlcndpc2UsIHN1YnN0aXR1dGUgYSBoZXggc3RyaW5nIHRoYXQgaXMgcHJldHR5IG11Y2gKKyMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgdG8gYmUgdW5pcXVlIGZyb20gYnVpbGQgdG8gYnVpbGQuCitpZm5kZWYgSEVYREFURQorSEVYREFURSA6PSAkKHNoZWxsICQoUEVSTCkgJChTUkMpLy4uL25vdy5wbCAkKFNSQ1MpKQorZW5kaWYKK2lmbmRlZiBEQVRFCitEQVRFICAgIDo9ICQoc2hlbGwgc2ggJChTUkMpLy4uL2dlbi1pZC5zaCAkKFZFUlNJT04pICQoSEVYREFURSkpCitlbmRpZgorQ0ZMQUdTCQkrPSAtRERBVEVfU1RSPSciJChEQVRFKSInCisKKy5QSE9OWTogc3ViZGlycworc3ViZGlyczoKKwlta2RpciAtcCAkKEFSQ0gpCisKKyQoT0JKUyk6IHN1YmRpcnMKKworIyBUaGUgdGFyZ2V0cyB0byBidWlsZCBpbiB0aGlzIGRpcmVjdG9yeQorQlRBUkdFVCAgPSBzeXNsaW51eC5lZmkKKworc3lzbGludXguc286ICQoT0JKUykgJChDT1JFX09CSlMpICQoTElCX09CSlMpCisJJChMRCkgJChMREZMQUdTKSAtLXN0cmlwLWRlYnVnIC1vICRAICReIC1sZ251ZWZpIC1sZWZpCisKKyMgV2UgbmVlZCB0byByZW5hbWUgdGhlIC5oYXNoIHNlY3Rpb24gYmVjYXVzZSB0aGUgRUZJIGZpcm13YXJlCisjIGxpbmtlciByZWFsbHkgZG9lc24ndCBsaWtlIGl0LgorIyAkKE9CSkNPUFkpIC0tcmVuYW1lLXNlY3Rpb24gLmdudS5oYXNoPS5zZGF0YSxsb2FkLGRhdGEsYWxsb2MgJF4gJEAKKyNzeXNsaW51eC5zbzogc3lzbGludXgxLnNvCisjCWNwICReICRACisKK3dyYXBwZXI6IHdyYXBwZXIuYworCSQoQ0MpICReIC1vICRACisKKyMKKyMgQnVpbGQgdGhlIHdyYXBwZXIgYXBwIGFuZCB3cmFwIG91ciAuc28gdG8gcHJvZHVjZSBhIC5lZmkKK3N5c2xpbnV4LmVmaTogc3lzbGludXguc28gd3JhcHBlcgorCSQoT0JKKS93cmFwcGVyIHN5c2xpbnV4LnNvICRACisKK2FsbDogJChCVEFSR0VUKQorCitjb2RlcGFnZS5vOiAuLi9jb2RlcGFnZS9jcDg2NS5jcAorCWNwICQob2JqZGlyKS8uLi9jb2RlcGFnZS9jcDg2NS5jcCBjb2RlcGFnZS5jcAorCSQoQ0MpICQoU0ZMQUdTKSAtYyAtbyAkQCAkKGNvcmUpL2NvZGVwYWdlLlMKKworaW5zdGFsbDoKKwlpbnN0YWxsIC1tIDc1NSAkKEJUQVJHRVQpICQoSU5TVEFMTFJPT1QpJChBVVhESVIpCisKK3N0cmlwOgorCit0aWR5IGRpc3Q6CisJcm0gLWYgKi5zbyAqLm8gd3JhcHBlcgorCWZpbmQgLiBcKCAtbmFtZSBcKi5vIC1vIC1uYW1lIFwqLmEgLW8gLW5hbWUgLlwqLmQgLW8gLW5hbWUgXCoudG1wIFwpIC1wcmludDAgfCBcCisJCXhhcmdzIC0wciBybSAtZgorCSQodG9wZGlyKS9lZmkvY2xlYW4tZ251LWVmaS5zaCAkKEVGSV9TVUJBUkNIKSAkKG9iamRpcikKKworY2xlYW46IHRpZHkKKworc3BvdGxlc3M6IGNsZWFuCisJcm0gLWYgJChCVEFSR0VUKQpkaWZmIC0tZ2l0IGEvZWZpL2Fkdi5jIGIvZWZpL2Fkdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTZkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvYWR2LmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDEyIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKiAgIENoYW5kcmFtb3VsaSBOYXJheWFuYW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYWR2LmMKKyAqCisgKiBDb3JlIEFEViBJL08KKyAqIENvZGUgY29uc29saWRhdGVkIGZyb20gbGliaW5zdGFsbGVyL2FkdiouYyBhbmQgY29yZS9hZHYuaW5jIHdpdGggdGhlCisgKiBhZGRpdGlvbiBvZiBFRkkgc3VwcG9ydAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLCBhbmQgc2V0IGVycm5vLgorICoKKyAqLworI2RlZmluZSAgX0dOVV9TT1VSQ0UKKworI2luY2x1ZGUgPHN5c2xpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFkdi5oIgorCit1bnNpZ25lZCBjaGFyIHN5c2xpbnV4X2FkdlsyICogQURWX1NJWkVdOworCitzdGF0aWMgdm9pZCBjbGVhbnVwX2Fkdih1bnNpZ25lZCBjaGFyICphZHZidWYpCit7CisgICAgaW50IGk7CisgICAgdWludDMyX3QgY3N1bTsKKworICAgIC8qIE1ha2Ugc3VyZSBib3RoIGNvcGllcyBhZ3JlZSwgYW5kIHVwZGF0ZSB0aGUgY2hlY2tzdW0gKi8KKyAgICAqKHVpbnQzMl90ICopYWR2YnVmID0gIEFEVl9NQUdJQzE7CisKKyAgICBjc3VtID0gQURWX01BR0lDMjsKKyAgICBmb3IgKGkgPSA4OyBpIDwgQURWX1NJWkUgLSA0OyBpICs9IDQpCisJY3N1bSAtPSAqKHVpbnQzMl90ICopKGFkdmJ1ZiArIGkpOworCisgICAgKih1aW50MzJfdCAqKShhZHZidWYgKyA0KSA9ICBjc3VtOworICAgICoodWludDMyX3QgKikoYWR2YnVmICsgQURWX1NJWkUgLSA0KSA9ICBBRFZfTUFHSUMzOworCisgICAgbWVtY3B5KGFkdmJ1ZiArIEFEVl9TSVpFLCBhZHZidWYsIEFEVl9TSVpFKTsKK30KKwordm9pZCBzeXNsaW51eF9yZXNldF9hZHYodW5zaWduZWQgY2hhciAqYWR2YnVmKQoreworICAgIC8qIENyZWF0ZSBhbiBhbGwtemVybyBBRFYgKi8KKyAgICBtZW1zZXQoYWR2YnVmICsgMiAqIDQsIDAsIEFEVl9MRU4pOworICAgIGNsZWFudXBfYWR2KGFkdmJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgYWR2X2NvbnNpc3RlbnQoY29uc3QgdW5zaWduZWQgY2hhciAqcCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBjc3VtOworCisgICAgaWYgKCoodWludDMyX3QgKilwICE9IEFEVl9NQUdJQzEgfHwKKwkqKHVpbnQzMl90ICopKHAgKyBBRFZfU0laRSAtIDQpICE9IEFEVl9NQUdJQzMpCisJcmV0dXJuIDA7CisKKyAgICBjc3VtID0gMDsKKyAgICBmb3IgKGkgPSA0OyBpIDwgQURWX1NJWkUgLSA0OyBpICs9IDQpCisJY3N1bSArPSAqKHVpbnQzMl90ICopKHAgKyBpKTsKKworICAgIHJldHVybiBjc3VtID09IEFEVl9NQUdJQzI7Cit9CisKKy8qCisgKiBWZXJpZnkgdGhhdCBhbiBpbi1tZW1vcnkgQURWIGlzIGNvbnNpc3RlbnQsIG1ha2luZyB0aGUgY29waWVzIGNvbnNpc3RlbnQuCisgKiBJZiBuZWl0aGVyIGNvcHkgaXMgT0ssIHJldHVybiAtMSBhbmQgY2FsbCBzeXNsaW51eF9yZXNldF9hZHYoKS4KKyAqLworaW50IHN5c2xpbnV4X3ZhbGlkYXRlX2Fkdih1bnNpZ25lZCBjaGFyICphZHZidWYpCit7CisgICAgaWYgKGFkdl9jb25zaXN0ZW50KGFkdmJ1ZiArIDAgKiBBRFZfU0laRSkpIHsKKwltZW1jcHkoYWR2YnVmICsgQURWX1NJWkUsIGFkdmJ1ZiwgQURWX1NJWkUpOworCXJldHVybiAwOworICAgIH0gZWxzZSBpZiAoYWR2X2NvbnNpc3RlbnQoYWR2YnVmICsgMSAqIEFEVl9TSVpFKSkgeworCW1lbWNweShhZHZidWYsIGFkdmJ1ZiArIEFEVl9TSVpFLCBBRFZfU0laRSk7CisJcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKwlzeXNsaW51eF9yZXNldF9hZHYoYWR2YnVmKTsKKwlyZXR1cm4gLTE7CisgICAgfQorfQorCisvKgorICogUmVhZCB0aGUgQURWIGZyb20gYW4gZXhpc3RpbmcgaW5zdGFuY2UsIG9yIGluaXRpYWxpemUgaWYgaW52YWxpZC4KKyAqIFJldHVybnMgLTEgb24gZmF0YWwgZXJyb3JzLCAwIGlmIEFEViBpcyBva2F5LCAxIGlmIHRoZSBBRFYgaXMKKyAqIGludmFsaWQsIGFuZCAyIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgorICovCisKKy8qIG1ha2VfZmlsZXNwZWMKKyAqIFRha2UgdGhlIEFTQ0lJIHBhdGhuYW1lIGFuZCBmaWxlbmFtZSBhbmQgY29uY2F0ZW5hdGUgdGhlbQorICogaW50byBhbiBhbGxvY2F0ZWQgbWVtb3J5IHNwYWNlIGFzIHVuaWNvZGUgZmlsZSBzcGVjaWZpY2F0aW9uIHN0cmluZy4KKyAqIFRoZSBwYXRoIGFuZCBjZmcgQVNDSUkgc3RyaW5ncyBhcmUgYXNzdW1lZCB0byBiZSBudWxsLXRlcm1pbmF0ZWQuCisgKiBGb3IgRUZJLCB0aGUgc2VwYXJhdGlvbiBjaGFyYWN0ZXIgaW4gdGhlIHBhdGggbmFtZSBpcyAnXCcKKyAqIGFuZCB0aGVyZWZvcmUgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIHNwZWMgdXNlcyAnXCcgYXMgc2VwYXJhdGlvbiBjaGFyCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMKKyAqIAkgMCAgaWYgc3VjY2Vzc2Z1bCBhbmQgZnNwZWMgaXMgYSB2YWxpZCBhbGxvY2F0ZWQgQ0hBUjE2IHBvaW50ZXIKKyAqIAkgICAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGZyZWUgdXAgdGhlIGFsbG9jYXRlZCBmaWxlc3BlYyBzdHJpbmcKKyAqIAktMSAgb3RoZXJ3aXNlCisgKgorICovCitzdGF0aWMgaW50IG1ha2VfZmlsZXNwZWMoQ0hBUjE2ICoqZnNwZWMsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmNmZykKK3sKKwlDSEFSMTYgKnA7CisJaW50IHNpemUsIGFwcGVuZDsKKworCS8qIGFsbG9jYXRlIHNpemUgZm9yIGEgQ0hBUjE2IHN0cmluZyAqLworCXNpemUgPSBzaXplb2YoQ0hBUjE2KSAqIChzdHJsZW5hKChDSEFSOCAqKXBhdGgpK3N0cmxlbmEoKENIQVI4ICopY2ZnKSsyKTsJLyogaW5jbHVkaW5nIG51bGwgKi8KKwkqZnNwZWMgPSBtYWxsb2Moc2l6ZSk7CisJaWYgKCEqZnNwZWMpIHJldHVybiAtMTsKKworCWFwcGVuZCA9IHBhdGhbc3RybGVuYSgoQ0hBUjggKilwYXRoKSAtIDFdICE9ICdcXCc7CisJZm9yIChwID0gKmZzcGVjOyAqcGF0aDsgcGF0aCsrLCBwKyspCisJCSpwID0gKENIQVIxNikqcGF0aDsKKwkvKiBhcHBlbmQgdGhlIHNlcGFyYXRpb24gY2hhcmFjdGVyIHRvIHRoZSBwYXRoIGlmIG5lZWQgYmUgKi8KKwlpZiAoYXBwZW5kKSAqcCsrID0gKENIQVIxNiknXFwnOworCWZvciAoOyAqY2ZnOyBjZmcrKywgcCsrKQorCQkqcCA9IChDSEFSMTYpKmNmZzsKKwkqcCA9IChDSEFSMTYpQ0hBUl9OVUxMOworCisJcmV0dXJuIDA7Cit9CisKKworLyogVE9ETzoKKyAqIHNldF9hdHRyaWJ1dGVzKCkgYW5kIGNsZWFyX2F0dHJpYnV0ZXMoKSBhcmUgc3VwcG9ydGVkIGZvciBWRkFUIG9ubHkKKyAqLworaW50IHJlYWRfYWR2KGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmNmZykKK3sKKyAgICBDSEFSMTYgKmZpbGU7CisgICAgRUZJX0ZJTEVfSEFORExFIGZkOworICAgIEVGSV9GSUxFX0lORk8gc3Q7CisgICAgaW50IGVyciA9IDA7CisgICAgaW50IHJ2OworCisgICAgcnYgPSBtYWtlX2ZpbGVzcGVjKCZmaWxlLCBwYXRoLCBjZmcpOworICAgIGlmIChydiA8IDAgfHwgIWZpbGUpIHsKKwllZmlfcGVycm9yKEwicmVhZF9hZHYiKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogVEJEOiBOb3Qgc3VyZSBpZiBFRkkgYWNjZXB0cyB0aGUgYXR0cmlidXRlIHJlYWQgb25seQorICAgICAqIGV2ZW4gaWYgYW4gZXhpc3RpbmcgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWQgYWNjZXNzCisgICAgICovCisgICAgZmQgPSBlZmlfb3BlbihmaWxlLCBFRklfRklMRV9NT0RFX1JFQUQpOworICAgIGlmICghZmQpIHsKKwlpZiAoZWZpX2Vycm5vICE9IEVGSV9OT1RfRk9VTkQpIHsKKwkgICAgZXJyID0gLTE7CisJfSBlbHNlIHsKKwkgICAgc3lzbGludXhfcmVzZXRfYWR2KHN5c2xpbnV4X2Fkdik7CisJICAgIGVyciA9IDI7CQkvKiBOb25leGlzdGVuY2UgaXMgbm90IGEgZmF0YWwgZXJyb3IgKi8KKwl9CisgICAgfSBlbHNlIGlmICghZWZpX2ZzdGF0KGZkLCAmc3QpKSB7CisJZXJyID0gLTE7CisgICAgfSBlbHNlIGlmIChzdC5GaWxlU2l6ZSA8IDIgKiBBRFZfU0laRSkgeworCS8qIFRvbyBzbWFsbCB0byBiZSB1c2VmdWwgKi8KKwlzeXNsaW51eF9yZXNldF9hZHYoc3lzbGludXhfYWR2KTsKKwllcnIgPSAwOwkJLyogTm90aGluZyB0byByZWFkLi4uICovCisgICAgfSBlbHNlIGlmIChlZmlfeHByZWFkKGZkLCBzeXNsaW51eF9hZHYsIDIgKiBBRFZfU0laRSwKKwkJICAgICAgc3QuRmlsZVNpemUgLSAyICogQURWX1NJWkUpICE9IDIgKiBBRFZfU0laRSkgeworCWVyciA9IC0xOworICAgIH0gZWxzZSB7CisJLyogV2UgZ290IGl0Li4uIG1heWJlPyAqLworCWVyciA9IHN5c2xpbnV4X3ZhbGlkYXRlX2FkdihzeXNsaW51eF9hZHYpID8gMSA6IDA7CisgICAgfQorCisgICAgaWYgKGVyciA8IDApCisJZWZpX3BlcnJvcihmaWxlKTsKKyAgICBpZiAoZmQpCisJZWZpX2Nsb3NlKGZkKTsKKyAgICBmcmVlKGZpbGUpOworCisgICAgcmV0dXJuIGVycjsKK30KKworLyogRm9yIEVGSSBwbGF0Zm9ybSwgaW5pdGlhbGl6ZSBBRFYgYnkgb3BlbmluZyBsZGxpbnV4LnN5cworICogYXMgY29uZmlndXJlZCBhbmQgcmV0dXJuIHRoZSBwcmltYXJ5IChhZHYwKSBhbmQgYWx0ZXJuYXRlIChhZHYxKQorICogZGF0YSBpbnRvIGNhbGxlcidzIGJ1ZmZlci4gRmlsZSByZW1haW5zIG9wZW4gZm9yIHN1YnNlcXVlbnQKKyAqIG9wZXJhdGlvbnMuIFRoaXMgcm91dGluZSBpcyB0byBiZSBjYWxsZWQgZnJvbSBjb21ib290IHZlY3Rvci4KKyAqLwordm9pZCBlZmlfYWR2X2luaXQodm9pZCkKK3sKKyAgICB1bmlvbiBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8gc2RpOworCisgICAgZ2V0X2Rlcml2YXRpdmVfaW5mbygmc2RpKTsKKworICAgIGlmIChzZGkuYy5maWxlc3lzdGVtID09IFNZU0xJTlVYX0ZTX1NZU0xJTlVYKQorCXJlYWRfYWR2KCIiLCBTWVNMSU5VWF9GSUxFKTsKKyAgICBlbHNlIHsKKwlfX3N5c2xpbnV4X2Fkdl9wdHIgPSAmc3lzbGludXhfYWR2WzhdOyAvKiBza2lwIGhlYWQsIGNzdW0gKi8KKwlfX3N5c2xpbnV4X2Fkdl9zaXplID0gQURWX0xFTjsKKworCXN5c2xpbnV4X3ZhbGlkYXRlX2FkdihzeXNsaW51eF9hZHYpOworICAgIH0KK30KKworLyogRm9yIEVGSSBwbGF0Zm9ybSwgd3JpdGUgMiAqIEFEVl9TSVpFIGRhdGEgdG8gdGhlIGZpbGUgb3BlbmVkCisgKiBhdCBBRFYgaW5pdGlhbGl6YXRpb24uIChpLmUgbGRsaW51eC5zeXMpLgorICoKKyAqIFRPRE86CisgKiAxLiBWYWxpZGF0ZSBhc3N1bXB0aW9uOiB3cml0ZSBiYWNrIHRvIGZpbGUgZnJvbSBfX3N5c2xpbnV4X2Fkdl9wdHIKKyAqIDIuIFdoYXQgaWYgdGhlcmUgZXJyb3JzPworICogMy4gRG8gd2UgbmVlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHN5cyBmaWxlPworICoKKyAqLworaW50IGVmaV9hZHZfd3JpdGUodm9pZCkKK3sKKyAgICBjaGFyICpuYW1lOworICAgIHVuc2lnbmVkIGNoYXIgYWR2dG1wWzIgKiBBRFZfU0laRV07CisgICAgdW5zaWduZWQgY2hhciAqYWR2YnVmID0gc3lzbGludXhfYWR2OworICAgIGludCBydjsKKyAgICBpbnQgZXJyID0gMDsKKyAgICBFRklfRklMRV9IQU5ETEUJZmQ7CS8qIGhhbmRsZSB0byBsZGxpbnV4LnN5cyAqLworICAgIENIQVIxNiAqZmlsZTsKKyAgICBFRklfRklMRV9JTkZPIHN0LCB4c3Q7CisgICAgdW5pb24gc3lzbGludXhfZGVyaXZhdGl2ZV9pbmZvIHNkaTsKKworICAgIGdldF9kZXJpdmF0aXZlX2luZm8oJnNkaSk7CisgICAgaWYgKHNkaS5jLmZpbGVzeXN0ZW0gIT0gU1lTTElOVVhfRlNfU1lTTElOVVgpCisJcmV0dXJuIC0xOworCisgICAgbmFtZSA9IFNZU0xJTlVYX0ZJTEU7CisgICAgcnYgPSBtYWtlX2ZpbGVzcGVjKCZmaWxlLCAiIiwgbmFtZSk7CisgICAgaWYgKHJ2IDwgMCB8fCAhZmlsZSkgeworCWVmaV9lcnJubyA9IEVGSV9PVVRfT0ZfUkVTT1VSQ0VTOworCWVmaV9wZXJyb3IoTCJlZmlfYWR2X3dyaXRlOiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBmZCA9IGVmaV9vcGVuKGZpbGUsIEVGSV9GSUxFX01PREVfUkVBRCk7CisgICAgaWYgKGZkID09IChFRklfRklMRV9IQU5ETEUpTlVMTCkgeworCWVyciA9IC0xOworCWVmaV9wcmludGVycihMImVmaV9hZHZfd3JpdGU6IFVuYWJsZSB0byBvcGVuIGZpbGUgJXNcbiIsIGZpbGUpOworICAgIH0gZWxzZSBpZiAoZWZpX2ZzdGF0KGZkLCAmc3QpKSB7CisJZXJyID0gLTE7CisJZWZpX3ByaW50ZXJyKEwiZWZpX2Fkdl93cml0ZTogVW5hYmxlIHRvIGdldCBpbmZvIGZvciBmaWxlICVzXG4iLCBmaWxlKTsKKyAgICB9IGVsc2UgaWYgKHN0LkZpbGVTaXplIDwgMiAqIEFEVl9TSVpFKSB7CisJLyogVG9vIHNtYWxsIHRvIGJlIHVzZWZ1bCAqLworCWVyciA9IC0yOworCWVmaV9wcmludGVycihMImVmaV9hZHZfd3JpdGU6IEZpbGUgc2l6ZSB0b28gc21hbGwgdG8gYmUgdXNlZnVsIGZvciBmaWxlICVzXG4iLCBmaWxlKTsKKyAgICB9IGVsc2UgaWYgKGVmaV94cHJlYWQoZmQsIGFkdnRtcCwgMiAqIEFEVl9TSVpFLAorCQkgICAgICBzdC5GaWxlU2l6ZSAtIDIgKiBBRFZfU0laRSkgIT0gMiAqIEFEVl9TSVpFKSB7CisJZXJyID0gLTE7CisJZWZpX3ByaW50ZXJyKEwiZWZpX2Fkdl93cml0ZTogRXJyb3IgcmVhZGluZyBBRFYgZGF0YSBmcm9tIGZpbGUgJXNcbiIsIGZpbGUpOworICAgIH0gZWxzZSB7CisJY2xlYW51cF9hZHYoYWR2YnVmKTsKKwllcnIgPSBzeXNsaW51eF92YWxpZGF0ZV9hZHYoYWR2YnVmKSA/IC0yIDogMDsKKworCWlmICghZXJyKSB7CisJICAgIC8qIEdvdCBhIGdvb2Qgb25lLCB3cml0ZSBvdXIgb3duIEFEViBoZXJlICovCisJICAgIGVmaV9jbGVhcl9hdHRyaWJ1dGVzKGZkKTsKKworCSAgICAvKiBOZWVkIHRvIHJlLW9wZW4gcmVhZC13cml0ZSAqLworCSAgICBlZmlfY2xvc2UoZmQpOworCQkvKiBUaGVyZSBpcyBubyBTWU5DIGF0dHJpYnV0ZSB3aXRoIEVGSSBvcGVuICovCisJICAgIGZkID0gZWZpX29wZW4oZmlsZSwgRUZJX0ZJTEVfTU9ERV9SRUFEIHwgRUZJX0ZJTEVfTU9ERV9XUklURSk7CisJICAgIGlmIChmZCA9PSAoRUZJX0ZJTEVfSEFORExFKU5VTEwpIHsKKwkJZXJyID0gLTE7CisJICAgIH0gZWxzZSBpZiAoZWZpX2ZzdGF0KGZkLCAmeHN0KSB8fCB4c3QuRmlsZVNpemUgIT0gc3QuRmlsZVNpemUpIHsKKwkJZWZpX3BlcnJvcihMImVmaV9hZHZfd3JpdGU6IGZpbGUgc3RhdHVzIGVycm9yL21pc21hdGNoIik7CisJCWVyciA9IC0yOworCSAgICB9CisJICAgIC8qIFdyaXRlIG91ciBvd24gdmVyc2lvbiAuLi4gKi8KKwkgICAgaWYgKGVmaV94cHdyaXRlKGZkLCBhZHZidWYsIDIgKiBBRFZfU0laRSwKKwkJCXN0LkZpbGVTaXplIC0gMiAqIEFEVl9TSVpFKSAhPSAyICogQURWX1NJWkUpIHsKKwkJZXJyID0gLTE7CisJCWVmaV9wcmludGVycihMImVmaV9hZHZfd3JpdGU6IEVycm9yIHdyaXRlIEFEViBkYXRhIHRvIGZpbGUgJXNcbiIsIGZpbGUpOworCSAgICB9CisJICAgIGlmICghZXJyKSB7CisJCWVmaV9zeW5jKGZkKTsKKwkJZWZpX3NldF9hdHRyaWJ1dGVzKGZkKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoZXJyID09IC0yKQorCWVmaV9wcmludGVycihMIiVzOiBjYW5ub3Qgd3JpdGUgYXV4aWxsaWFyeSBkYXRhIChuZWVkIC0tdXBkYXRlKT9cbiIsCisJCWZpbGUpOworICAgIGVsc2UgaWYgKGVyciA9PSAtMSkKKwllZmlfcGVycm9yKEwiZWZpX2Fkdl93cml0ZToiKTsKKworICAgIGlmIChmZCkKKwllZmlfY2xvc2UoZmQpOworICAgIGlmIChmaWxlKQorCWZyZWUoZmlsZSk7CisKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZWZpL2Fkdi5oIGIvZWZpL2Fkdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWFkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvYWR2LmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfSF9FRklfQURWXworI2RlZmluZSBfSF9FRklfQURWXworCisjaW5jbHVkZSAiZWZpLmgiCisjaW5jbHVkZSAiZmlvLmgiCisjaW5jbHVkZSA8c3lzbGludXgvZmlybXdhcmUuaD4KKworLyogQURWIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEFEVl9TSVpFCTUxMgkvKiBUb3RhbCBzaXplICovCisjZGVmaW5lIEFEVl9MRU4JCShBRFZfU0laRS0zKjQpCS8qIFVzYWJsZSBkYXRhIHNpemUgKi8KKyNkZWZpbmUgU1lTTElOVVhfRklMRQkibGRsaW51eC5zeXMiCisKKyNkZWZpbmUgQURWX01BR0lDMQkweDVhMmQyZmE1CS8qIEhlYWQgc2lnbmF0dXJlICovCisjZGVmaW5lIEFEVl9NQUdJQzIJMHhhMzA0MTc2NwkvKiBUb3RhbCBjaGVja3N1bSAqLworI2RlZmluZSBBRFZfTUFHSUMzCTB4ZGQyOGJmNjQJLyogVGFpbCBzaWduYXR1cmUgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc3lzbGludXhfYWR2WzIgKiBBRFZfU0laRV07CitleHRlcm4gdm9pZCAqX19zeXNsaW51eF9hZHZfcHRyOworZXh0ZXJuIHNzaXplX3QgX19zeXNsaW51eF9hZHZfc2l6ZTsKKworLyogVE9ETzogUmV2aXNpdCB0byBlbnN1cmUgaWYgdGhlc2UgZnVuY3Rpb25zIG5lZWQgdG8gYmUgZXhwb3J0ZWQgKi8KK3ZvaWQgc3lzbGludXhfcmVzZXRfYWR2KHVuc2lnbmVkIGNoYXIgKmFkdmJ1Zik7CitpbnQgc3lzbGludXhfdmFsaWRhdGVfYWR2KHVuc2lnbmVkIGNoYXIgKmFkdmJ1Zik7CitpbnQgcmVhZF9hZHYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqY2ZnKTsKK2ludCB3cml0ZV9hZHYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqY2ZnKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmkvYnVpbGQtZ251LWVmaS5zaCBiL2VmaS9idWlsZC1nbnUtZWZpLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM4N2U2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvYnVpbGQtZ251LWVmaS5zaApAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKworc2V0IC1lCisKKyMgSW5pdGlhbGlzZSB0aGUgZ251LWVmaSBzdWJtb2R1bGUgYW5kIGVuc3VyZSB0aGUgc291cmNlIGlzIHVwLXRvLWRhdGUuCisjIFRoZW4gYnVpbGQgYW5kIGluc3RhbGwgaXQgZm9yIHRoZSBnaXZlbiBhcmNoaXRlY3R1cmUuCisKK2lmIFsgJCMgLWx0IDIgXTsgdGhlbgorY2F0IDw8RU9GCitVc2FnZTogJDA6IDxhcmNoPiA8b2JqZGlyPgorCitCdWlsZCB0aGUgPGFyY2g+IGdudS1lZmkgbGlicyBhbmQgaGVhZGVyIGZpbGVzIGFuZCBpbnN0YWxsIGluIDxvYmpkaXI+LgorCisgIDxhcmNoPiAgIC0gQSBnbnUtZWZpIFwkQVJDSCBhcmd1bWVudCwgaS5lLiBpYTMyLCB4ODZfNjQKKyAgPG9iamRpcj4gLSBUaGUgU3lzbGludXggb2JqZWN0IGRpcmVjdG9yeQorCitFT0YKKyAgICBleGl0IDEKK2ZpCisKK0FSQ0g9IiQxIgorb2JqZGlyPSIkKHJlYWRsaW5rIC1mICQyKSIKKworaWYgWyAhIC1lIC4uL3ZlcnNpb24uaCBdOyB0aGVuCisgICAgcHJpbnRmICJidWlsZC1nbnUtZWZpLnNoOiBDYW5ub3QgYmUgcnVuIG91dHNpZGUgU3lzbGludXggb2JqZWN0IHRyZWVcbiIKKyAgICBwd2QKKyAgICBleGl0IDEKK2ZpCisKKygKKwljZCAuLi8uLgorCWdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdAorKQorCitta2RpciAtcCAiJG9iamRpci9nbnUtZWZpIgorY2QgIiRvYmpkaXIvZ251LWVmaSIKKworRUZJRElSPSIkKHJlYWRsaW5rIC1mICIkb2JqZGlyLy4uL2dudS1lZmkvZ251LWVmaS0zLjAiKSIKKworbWFrZSBTUkNESVI9IiRFRklESVIiIFRPUERJUj0iJEVGSURJUiIgLWYgIiRFRklESVIvTWFrZWZpbGUiIEFSQ0g9JEFSQ0gKK21ha2UgU1JDRElSPSIkRUZJRElSIiBUT1BESVI9IiRFRklESVIiIC1mICIkRUZJRElSL01ha2VmaWxlIiBBUkNIPSRBUkNIIFBSRUZJWD0iJG9iamRpciIgaW5zdGFsbAorCitjZCAiJG9iamRpci9lZmkiCmRpZmYgLS1naXQgYS9lZmkvY2hlY2stZ251LWVmaS5zaCBiL2VmaS9jaGVjay1nbnUtZWZpLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg1MzA1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvY2hlY2stZ251LWVmaS5zaApAQCAtMCwwICsxLDM4IEBACisjIS9iaW4vc2gKKworIyBWZXJpZnkgdGhhdCBnbnUtZWZpIGlzIGluc3RhbGxlZCBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeSBmb3Igb3VyCisjIGZpcm13YXJlLiBJZiBpdCBpc24ndCwgYnVpbGQgaXQuCisKK2lmIFsgJCMgLWx0IDIgXTsgdGhlbgorY2F0IDw8RU9GCitVc2FnZTogJDA6IDxhcmNoPiA8b2JqZGlyPgorCitDaGVjayBmb3IgZ251LWVmaSBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcyBpbiA8b2JqZGlyPiBhbmQsIGlmIG5vbmUKK2V4aXN0LCBidWlsZCBhbmQgaW5zdGFsbCB0aGVtLgorCisgIDxhcmNoPiAgIC0gQSBnbnUtZWZpIFwkQVJDSCBhcmd1bWVudCwgaS5lLiBpYTMyLCB4ODZfNjQKKyAgPG9iamRpcj4gLSBUaGUgU3lzbGludXggb2JqZWN0IGRpcmVjdG9yeQorCitFT0YKKyAgICBleGl0IDEKK2ZpCisKK0FSQ0g9JDEKK29iamRpcj0kMgorCitpZiBbICEgXCggLWYgIiRvYmpkaXIvaW5jbHVkZS9lZmkvJEFSQ0gvZWZpYmluZC5oIiAtYSAtZiAiJG9iamRpci9saWIvbGliZWZpLmEiIC1hIC1mICIkb2JqZGlyL2xpYi9saWJnbnVlZmkuYSIgXCkgXTsgdGhlbgorICAgICMgQnVpbGQgdGhlIGV4dGVybmFsIHByb2plY3Qgd2l0aCBhIGNsZWFuIG1ha2UgZW52aXJvbm1lbnQsIGFzCisgICAgIyBTeXNsaW51eCBkaXNhYmxlcyBidWlsdC1pbiBpbXBsaWNpdCBydWxlcy4KKyAgICBleHBvcnQgTUFLRUZMQUdTPQorCisgICAgLi4vLi4vZWZpL2J1aWxkLWdudS1lZmkuc2ggJEFSQ0ggIiRvYmpkaXIiID4gL2Rldi9udWxsIDI+JjEKKyAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwlwcmludGYgIkZhaWxlZCB0byBidWlsZCBnbnUtZWZpLiAiCisJcHJpbnRmICJFeGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmb3IgZnVsbCBkZXRhaWxzOiBcblxuIgorCXByaW50ZiAiYnVpbGQtZ251LWVmaS5zaCAkQVJDSCAkb2JqZGlyXG5cbiIKKworCWV4aXQgMQorICAgIGZpCitlbHNlCisgICAgcHJpbnRmICJza2lwIGdudS1lZmkgYnVpbGQvaW5zdGFsbFxuIgorZmkKZGlmZiAtLWdpdCBhL2VmaS9jbGVhbi1nbnUtZWZpLnNoIGIvZWZpL2NsZWFuLWdudS1lZmkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODRlZDE3YQotLS0gL2Rldi9udWxsCisrKyBiL2VmaS9jbGVhbi1nbnUtZWZpLnNoCkBAIC0wLDAgKzEsMzUgQEAKKyMhL2Jpbi9zaAorCitzZXQgLWUKKworIyBJbml0aWFsaXNlIHRoZSBnbnUtZWZpIHN1Ym1vZHVsZSBhbmQgZW5zdXJlIHRoZSBzb3VyY2UgaXMgdXAtdG8tZGF0ZS4KKyMgVGhlbiBidWlsZCBhbmQgaW5zdGFsbCBpdCBmb3IgdGhlIGdpdmVuIGFyY2hpdGVjdHVyZS4KKworaWYgWyAkIyAtbHQgMiBdOyB0aGVuCitjYXQgPDxFT0YKK1VzYWdlOiAkMDogPGFyY2g+IDxvYmpkaXI+CisKK0J1aWxkIHRoZSA8YXJjaD4gZ251LWVmaSBsaWJzIGFuZCBoZWFkZXIgZmlsZXMgYW5kIGluc3RhbGwgaW4gPG9iamRpcj4uCisKKyAgPGFyY2g+ICAgLSBBIGdudS1lZmkgXCRBUkNIIGFyZ3VtZW50LCBpLmUuIGlhMzIsIHg4Nl82NAorICA8b2JqZGlyPiAtIFRoZSBTeXNsaW51eCBvYmplY3QgZGlyZWN0b3J5CisKK0VPRgorICAgIGV4aXQgMQorZmkKKworQVJDSD0iJDEiCitvYmpkaXI9JChyZWFkbGluayAtZiAiJDIiKQorCisoCisJY2QgLi4vLi4KKwlnaXQgc3VibW9kdWxlIHVwZGF0ZSAtLWluaXQKKykKKworaWYgWyAtZCAiJG9iamRpci9nbnUtZWZpIiBdO3RoZW4KKwljZCAiJG9iamRpci9nbnUtZWZpIgorCUVGSURJUj0iJChyZWFkbGluayAtZiAiJG9iamRpci8uLi9nbnUtZWZpL2dudS1lZmktMy4wIikiCisJbWFrZSBTUkNESVI9IiRFRklESVIiIFRPUERJUj0iJEVGSURJUiIgLWYgIiRFRklESVIvTWFrZWZpbGUiIEFSQ0g9JEFSQ0ggY2xlYW4KK2ZpCisKK2NkICIkb2JqZGlyL2VmaSIKZGlmZiAtLWdpdCBhL2VmaS9jb25zb2xlLmMgYi9lZmkvY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZWQwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvY29uc29sZS5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEtMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqLworCisjaW5jbHVkZSA8c3lzbGludXgvbGludXguaD4KKyNpbmNsdWRlICJlZmkuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIEVGSV9HVUlEIEdyYXBoaWNzT3V0cHV0UHJvdG9jb2w7CisKK3N0YXRpYyB1aW50MzJfdCBjb25zb2xlX2RlZmF1bHRfYXR0cmlidXRlOworc3RhdGljIGJvb2wgY29uc29sZV9kZWZhdWx0X2N1cnNvcjsKKworLyoKKyAqIFdlIHdhbnQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBzdGF0ZSB3aGVuIHdlIGJvb3QgYSBrZXJuZWwgb3IgcmV0dXJuCisgKiB0byB0aGUgZmlybXdhcmUuCisgKi8KK3ZvaWQgZWZpX2NvbnNvbGVfc2F2ZSh2b2lkKQoreworICAgIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgKm91dCA9IFNULT5Db25PdXQ7CisgICAgU0lNUExFX1RFWFRfT1VUUFVUX01PREUgKm1vZGUgPSBvdXQtPk1vZGU7CisKKyAgICBjb25zb2xlX2RlZmF1bHRfYXR0cmlidXRlID0gbW9kZS0+QXR0cmlidXRlOworICAgIGNvbnNvbGVfZGVmYXVsdF9jdXJzb3IgPSBtb2RlLT5DdXJzb3JWaXNpYmxlOworfQorCit2b2lkIGVmaV9jb25zb2xlX3Jlc3RvcmUodm9pZCkKK3sKKyAgICBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICpvdXQgPSBTVC0+Q29uT3V0OworCisgICAgdWVmaV9jYWxsX3dyYXBwZXIob3V0LT5TZXRBdHRyaWJ1dGUsIDIsIG91dCwgY29uc29sZV9kZWZhdWx0X2F0dHJpYnV0ZSk7CisgICAgdWVmaV9jYWxsX3dyYXBwZXIob3V0LT5FbmFibGVDdXJzb3IsIDIsIG91dCwgY29uc29sZV9kZWZhdWx0X2N1cnNvcik7Cit9CisKK19fZXhwb3J0IHZvaWQgd3JpdGVjaHIoY2hhciBkYXRhKQoreworCWVmaV93cml0ZV9jaGFyKGRhdGEsIDApOworfQorCitzdGF0aWMgaW5saW5lIEVGSV9TVEFUVVMgb3Blbl9wcm90b2NvbChFRklfSEFORExFIGhhbmRsZSwgRUZJX0dVSUQgKnByb3RvY29sLAorCQkJCSAgICAgICB2b2lkICoqaW50ZXJmYWNlLCBFRklfSEFORExFIGFnZW50LAorCQkJCSAgICAgICBFRklfSEFORExFIGNvbnRyb2xsZXIsIFVJTlQzMiBhdHRyaWJ1dGVzKQoreworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+T3BlblByb3RvY29sLCA2LCBoYW5kbGUsIHByb3RvY29sLAorCQkJCSBpbnRlcmZhY2UsIGFnZW50LCBjb250cm9sbGVyLCBhdHRyaWJ1dGVzKTsKK30KKworc3RhdGljIGlubGluZSBFRklfU1RBVFVTCitnb3BfcXVlcnlfbW9kZShFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MICpnb3AsIFVJTlROICpzaXplLAorCSAgICAgICBFRklfR1JBUEhJQ1NfT1VUUFVUX01PREVfSU5GT1JNQVRJT04gKippbmZvKQoreworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcihnb3AtPlF1ZXJ5TW9kZSwgNCwgZ29wLAorCQkJCSBnb3AtPk1vZGUtPk1vZGUsIHNpemUsIGluZm8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYml0X21hc2sodWludDMyX3QgbWFzaywgdWludDhfdCAqcG9zLCB1aW50OF90ICpzaXplKQoreworCSpwb3MgPSAwOworCSpzaXplID0gMDsKKworCWlmIChtYXNrKSB7CisJCXdoaWxlICghKG1hc2sgJiAweDEpKSB7CisJCQltYXNrID4+PSAxOworCQkJKCpwb3MpKys7CisJCX0KKworCQl3aGlsZSAobWFzayAmIDB4MSkgeworCQkJbWFzayA+Pj0gMTsKKwkJCSgqc2l6ZSkrKzsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBzZXR1cF9nb3Aoc3RydWN0IHNjcmVlbl9pbmZvICpzaSkKK3sKKwlFRklfSEFORExFICpoYW5kbGVzID0gTlVMTDsKKwlFRklfU1RBVFVTIHN0YXR1czsKKwlFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MICpnb3AsICpmb3VuZDsKKwlFRklfR1JBUEhJQ1NfUElYRUxfRk9STUFUIHBpeGVsX2ZtdDsKKwlFRklfUElYRUxfQklUTUFTSyBwaXhlbF9pbmZvOworCXVpbnQzMl90IHBpeGVsX3NjYW5saW5lOworCVVJTlROIGksIG5yX2hhbmRsZXM7CisJVUlOVE4gc2l6ZTsKKwl1aW50MTZfdCBsZmJfd2lkdGgsIGxmYl9oZWlnaHQ7CisJdWludDMyX3QgbGZiX2Jhc2UsIGxmYl9zaXplOworCWludCBlcnIgPSAwOworCXZvaWQgKipnb3BfaGFuZGxlID0gTlVMTDsKKworCXNpemUgPSAwOworCXN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5Mb2NhdGVIYW5kbGUsIDUsIEJ5UHJvdG9jb2wsICZHcmFwaGljc091dHB1dFByb3RvY29sLAorCQkJCU5VTEwsICZzaXplLCBnb3BfaGFuZGxlKTsKKwkvKiBMaWJMb2NhdGVIYW5kbGUgaGFuZGxlIGFscmVhZHkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGhhbmRsZXMuCisJICogVGhlcmUgaXMgbm8gbmVlZCB0byBkaXZpZGUgYnkgc2l6ZW9mKEVGSV9IQU5ETEUpCisJICovCisJc3RhdHVzID0gTGliTG9jYXRlSGFuZGxlKEJ5UHJvdG9jb2wsICZHcmFwaGljc091dHB1dFByb3RvY29sLAorCQkJCSBOVUxMLCAmbnJfaGFuZGxlcywgJmhhbmRsZXMpOworCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKworCQloYW5kbGVzID0gQWxsb2NhdGVQb29sKG5yX2hhbmRsZXMpOworCQlpZiAoIWhhbmRsZXMpCisJCQlyZXR1cm4gMDsKKworCQlzdGF0dXMgPSBMaWJMb2NhdGVIYW5kbGUoQnlQcm90b2NvbCwgJkdyYXBoaWNzT3V0cHV0UHJvdG9jb2wsCisJCQkJCSBOVUxMLCAmbnJfaGFuZGxlcywgJmhhbmRsZXMpOworCX0KKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlnb3RvIG91dDsKKworCWZvdW5kID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaGFuZGxlczsgaSsrKSB7CisJCUVGSV9HUkFQSElDU19PVVRQVVRfTU9ERV9JTkZPUk1BVElPTiAqaW5mbzsKKwkJRUZJX1BDSV9JTyAqcGNpaW8gPSBOVUxMOworCQlFRklfSEFORExFICpoID0gaGFuZGxlc1tpXTsKKworCQlzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SGFuZGxlUHJvdG9jb2wsIDMsIGgsCisJCQkJCSAgICZHcmFwaGljc091dHB1dFByb3RvY29sLCAodm9pZCAqKikmZ29wKTsKKwkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJCWNvbnRpbnVlOworCQl1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SGFuZGxlUHJvdG9jb2wsIDMsIGgsCisJCQkJICAmUGNpSW9Qcm90b2NvbCwgKHZvaWQgKiopJnBjaWlvKTsKKwkJc3RhdHVzID0gZ29wX3F1ZXJ5X21vZGUoZ29wLCAmc2l6ZSwgJmluZm8pOworCQlpZiAoc3RhdHVzID09IEVGSV9TVUNDRVNTICYmICghZm91bmQgfHwgcGNpaW8pKSB7CisJCQlsZmJfd2lkdGggPSBpbmZvLT5Ib3Jpem9udGFsUmVzb2x1dGlvbjsKKwkJCWxmYl9oZWlnaHQgPSBpbmZvLT5WZXJ0aWNhbFJlc29sdXRpb247CisJCQlsZmJfYmFzZSA9IGdvcC0+TW9kZS0+RnJhbWVCdWZmZXJCYXNlOworCQkJbGZiX3NpemUgPSBnb3AtPk1vZGUtPkZyYW1lQnVmZmVyU2l6ZTsKKwkJCXBpeGVsX2ZtdCA9IGluZm8tPlBpeGVsRm9ybWF0OworCQkJcGl4ZWxfaW5mbyA9IGluZm8tPlBpeGVsSW5mb3JtYXRpb247CisJCQlwaXhlbF9zY2FubGluZSA9IGluZm8tPlBpeGVsc1BlclNjYW5MaW5lOworCQkJaWYgKHBjaWlvKQorCQkJCWJyZWFrOworCQkJZm91bmQgPSBnb3A7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKQorCQlnb3RvIG91dDsKKworCWVyciA9IDE7CisKKwlkcHJpbnRmKCJzZXR1cF9zY3JlZW46IHNldCB1cCBzY3JlZW4gcGFyYW1ldGVycyBmb3IgRUZJIEdPUFxuIik7CisJc2ktPm9yaWdfdmlkZW9faXNWR0EgPSAweDcwOyAvKiBFRkkgZnJhbWVidWZmZXIgKi8KKworCXNpLT5sZmJfYmFzZSA9IGxmYl9iYXNlOworCXNpLT5sZmJfc2l6ZSA9IGxmYl9zaXplOworCXNpLT5sZmJfd2lkdGggPSBsZmJfd2lkdGg7CisJc2ktPmxmYl9oZWlnaHQgPSBsZmJfaGVpZ2h0OworCXNpLT5wYWdlcyA9IDE7CisKKwlkcHJpbnRmKCJzZXR1cF9zY3JlZW46IGxmYl9iYXNlIDB4JXggbGZiX3NpemUgJWQgbGZiX3dpZHRoICVkIGxmYl9oZWlnaHQgJWRcbiIsIGxmYl9iYXNlLCBsZmJfc2l6ZSwgbGZiX3dpZHRoLCBsZmJfaGVpZ2h0KTsKKwlzd2l0Y2ggKHBpeGVsX2ZtdCkgeworCWNhc2UgUGl4ZWxSZWRHcmVlbkJsdWVSZXNlcnZlZDhCaXRQZXJDb2xvcjoKKwkJc2ktPmxmYl9kZXB0aCA9IDMyOworCQlzaS0+bGZiX2xpbmVsZW5ndGggPSBwaXhlbF9zY2FubGluZSAqIDQ7CisJCXNpLT5yZWRfc2l6ZSA9IDg7CisJCXNpLT5yZWRfcG9zID0gMDsKKwkJc2ktPmdyZWVuX3NpemUgPSA4OworCQlzaS0+Z3JlZW5fcG9zID0gODsKKwkJc2ktPmJsdWVfc2l6ZSA9IDg7CisJCXNpLT5ibHVlX3BvcyA9IDE2OworCQlzaS0+cnN2ZF9zaXplID0gODsKKwkJc2ktPnJzdmRfcG9zID0gMjQ7CisJCWJyZWFrOworCWNhc2UgUGl4ZWxCbHVlR3JlZW5SZWRSZXNlcnZlZDhCaXRQZXJDb2xvcjoKKwkJc2ktPmxmYl9kZXB0aCA9IDMyOworCQlzaS0+bGZiX2xpbmVsZW5ndGggPSBwaXhlbF9zY2FubGluZSAqIDQ7CisJCXNpLT5yZWRfc2l6ZSA9IDg7CisJCXNpLT5yZWRfcG9zID0gMTY7CisJCXNpLT5ncmVlbl9zaXplID0gODsKKwkJc2ktPmdyZWVuX3BvcyA9IDg7CisJCXNpLT5ibHVlX3NpemUgPSA4OworCQlzaS0+Ymx1ZV9wb3MgPSAwOworCQlzaS0+cnN2ZF9zaXplID0gODsKKwkJc2ktPnJzdmRfcG9zID0gMjQ7CisJCWJyZWFrOworCWNhc2UgUGl4ZWxCaXRNYXNrOgorCQliaXRfbWFzayhwaXhlbF9pbmZvLlJlZE1hc2ssICZzaS0+cmVkX3BvcywKKwkJCSAmc2ktPnJlZF9zaXplKTsKKwkJYml0X21hc2socGl4ZWxfaW5mby5HcmVlbk1hc2ssICZzaS0+Z3JlZW5fcG9zLAorCQkJICZzaS0+Z3JlZW5fc2l6ZSk7CisJCWJpdF9tYXNrKHBpeGVsX2luZm8uQmx1ZU1hc2ssICZzaS0+Ymx1ZV9wb3MsCisJCQkgJnNpLT5ibHVlX3NpemUpOworCQliaXRfbWFzayhwaXhlbF9pbmZvLlJlc2VydmVkTWFzaywgJnNpLT5yc3ZkX3BvcywKKwkJCSAmc2ktPnJzdmRfc2l6ZSk7CisJCXNpLT5sZmJfZGVwdGggPSBzaS0+cmVkX3NpemUgKyBzaS0+Z3JlZW5fc2l6ZSArCisJCQlzaS0+Ymx1ZV9zaXplICsgc2ktPnJzdmRfc2l6ZTsKKwkJc2ktPmxmYl9saW5lbGVuZ3RoID0gKHBpeGVsX3NjYW5saW5lICogc2ktPmxmYl9kZXB0aCkgLyA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzaS0+bGZiX2RlcHRoID0gNDs7CisJCXNpLT5sZmJfbGluZWxlbmd0aCA9IHNpLT5sZmJfd2lkdGggLyAyOworCQlzaS0+cmVkX3NpemUgPSAwOworCQlzaS0+cmVkX3BvcyA9IDA7CisJCXNpLT5ncmVlbl9zaXplID0gMDsKKwkJc2ktPmdyZWVuX3BvcyA9IDA7CisJCXNpLT5ibHVlX3NpemUgPSAwOworCQlzaS0+Ymx1ZV9wb3MgPSAwOworCQlzaS0+cnN2ZF9zaXplID0gMDsKKwkJc2ktPnJzdmRfcG9zID0gMDsKKwkJYnJlYWs7CisJfQorCWRwcmludGYoInNldHVwX3NjcmVlbjogZGVwdGggJWQgbGluZSAlZCBycG9zICVkIHJzaXplICVkIGdwb3MgJWQgZ3NpemUgJWQgYnBvcyAlZCBic2l6ZSAlZCByc3Zwb3MgJWQgcnN2c2l6ZSAlZFxuIiwKKwkJc2ktPmxmYl9kZXB0aCwgc2ktPmxmYl9saW5lbGVuZ3RoLAorCQlzaS0+cmVkX3Bvcywgc2ktPnJlZF9zaXplLAorCQlzaS0+Z3JlZW5fcG9zLCBzaS0+Z3JlZW5fc2l6ZSwKKwkJc2ktPmJsdWVfcG9zLCBzaS0+Ymx1ZV9zaXplLAorCQlzaS0+Ymx1ZV9wb3MsIHNpLT5ibHVlX3NpemUsCisJCXNpLT5yc3ZkX3Bvcywgc2ktPnJzdmRfc2l6ZSk7CisJCitvdXQ6CisJaWYgKGhhbmRsZXMpIEZyZWVQb29sKGhhbmRsZXMpOworCisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBFRklfVUdBX1BST1RPQ09MX0dVSUQgXAorICB7IFwKKyAgICAweDk4MmMyOThiLCAweGY0ZmEsIDB4NDFjYiwgezB4YjgsIDB4MzgsIDB4NzcsIDB4YWEsIDB4NjgsIDB4OGYsIDB4YjgsIDB4MzkgfSBcCisgIH0KKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9VR0FfRFJBV19QUk9UT0NPTCBFRklfVUdBX0RSQVdfUFJPVE9DT0w7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VR0FfRFJBV19QUk9UT0NPTF9HRVRfTU9ERSkgKAorICBJTiAgRUZJX1VHQV9EUkFXX1BST1RPQ09MICpUaGlzLAorICBPVVQgVUlOVDMyICpXaWR0aCwKKyAgT1VUIFVJTlQzMiAqSGVpZ2h0LAorICBPVVQgVUlOVDMyICpEZXB0aCwKKyAgT1VUIFVJTlQzMiAqUmVmcmVzaAorICApCis7CisKK3N0cnVjdCBfRUZJX1VHQV9EUkFXX1BST1RPQ09MIHsKKwlFRklfVUdBX0RSQVdfUFJPVE9DT0xfR0VUX01PREUJR2V0TW9kZTsKKwl2b2lkCSpTZXRNb2RlOworCXZvaWQJKkJsdDsKK307CisKK3N0YXRpYyBpbnQgc2V0dXBfdWdhKHN0cnVjdCBzY3JlZW5faW5mbyAqc2kpCit7CisJRUZJX1VHQV9EUkFXX1BST1RPQ09MICp1Z2EsICpmaXJzdDsKKwlFRklfR1VJRCBVZ2FQcm90b2NvbCA9IEVGSV9VR0FfUFJPVE9DT0xfR1VJRDsKKwlVSU5UMzIgd2lkdGgsIGhlaWdodDsKKwlFRklfU1RBVFVTIHN0YXR1czsKKwlFRklfSEFORExFICpoYW5kbGVzOworCVVJTlROIGksIG5yX2hhbmRsZXM7CisJaW50IHJ2ID0gMDsKKworCXN0YXR1cyA9IExpYkxvY2F0ZUhhbmRsZShCeVByb3RvY29sLCAmVWdhUHJvdG9jb2wsCisJCQkJIE5VTEwsICZucl9oYW5kbGVzLCAmaGFuZGxlcyk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIHJ2OworCisJZm9yIChpID0gMDsgaSA8IG5yX2hhbmRsZXM7IGkrKykgeworCQlFRklfUENJX0lPICpwY2lpbyA9IE5VTEw7CisJCUVGSV9IQU5ETEUgKmhhbmRsZSA9IGhhbmRsZXNbaV07CisJCVVJTlQzMiB3LCBoLCBkZXB0aCwgcmVmcmVzaDsKKworCQlzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SGFuZGxlUHJvdG9jb2wsIDMsIGhhbmRsZSwKKwkJCQkJICAgJlVnYVByb3RvY29sLCAodm9pZCAqKikmdWdhKTsKKwkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJCWNvbnRpbnVlOworCisJCXVlZmlfY2FsbF93cmFwcGVyKEJTLT5IYW5kbGVQcm90b2NvbCwgMywgaGFuZGxlLAorCQkJCSAgJlBjaUlvUHJvdG9jb2wsICh2b2lkICoqKSZwY2lpbyk7CisKKwkJc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIodWdhLT5HZXRNb2RlLCA1LCB1Z2EsICZ3LCAmaCwKKwkJCQkJICAgJmRlcHRoLCAmcmVmcmVzaCk7CisKKwkJaWYgKHN0YXR1cyA9PSBFRklfU1VDQ0VTUyAmJiAoIWZpcnN0IHx8IHBjaWlvKSkgeworCQkJd2lkdGggPSB3OworCQkJaGVpZ2h0ID0gaDsKKworCQkJaWYgKHBjaWlvKQorCQkJCWJyZWFrOworCisJCQlmaXJzdCA9IHVnYTsKKwkJfQorCX0KKworCWlmICghZmlyc3QpCisJCWdvdG8gb3V0OworCXJ2ID0gMTsKKworCXNpLT5vcmlnX3ZpZGVvX2lzVkdBID0gMHg3MDsgLyogRUZJIGZyYW1lYnVmZmVyICovCisKKwlzaS0+bGZiX2RlcHRoID0gMzI7CisJc2ktPmxmYl93aWR0aCA9IHdpZHRoOworCXNpLT5sZmJfaGVpZ2h0ID0gaGVpZ2h0OworCisJc2ktPnJlZF9zaXplID0gODsKKwlzaS0+cmVkX3BvcyA9IDE2OworCXNpLT5ncmVlbl9zaXplID0gODsKKwlzaS0+Z3JlZW5fcG9zID0gODsKKwlzaS0+Ymx1ZV9zaXplID0gODsKKwlzaS0+Ymx1ZV9wb3MgPSAwOworCXNpLT5yc3ZkX3NpemUgPSA4OworCXNpLT5yc3ZkX3BvcyA9IDI0OworCitvdXQ6CisJRnJlZVBvb2woaGFuZGxlcyk7CisJcmV0dXJuIHJ2OworfQorCit2b2lkIHNldHVwX3NjcmVlbihzdHJ1Y3Qgc2NyZWVuX2luZm8gKnNpKQoreworCW1lbXNldChzaSwgMCwgc2l6ZW9mKCpzaSkpOworCisJaWYgKCFzZXR1cF9nb3Aoc2kpKQorCQlzZXR1cF91Z2Eoc2kpOworfQpkaWZmIC0tZ2l0IGEvZWZpL2NwODY1Xzh4MTYuaCBiL2VmaS9jcDg2NV84eDE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4YTU2MwotLS0gL2Rldi9udWxsCisrKyBiL2VmaS9jcDg2NV84eDE2LmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk5LTIwMTIgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENoYW5kcmFtb3VsaSBOYXJheWFuYW4gLSBleHRlbmRlZCBmb3IgRUZJIHN1cHBvcnQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZm5kZWYgQ1A4NjVfOHgxNgorI2RlZmluZSBDUDg2NV84eDE2CisKK3N0YXRpYyBjb25zdCBzaG9ydCBjcDg2NV84eDE2X2ZvbnRfbWFnaWMgPSAweDQzNjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjcDg2NV84eDE2X2ZvbnRfbW9kZSA9IDB4MDsKK3N0YXRpYyBjb25zdCBpbnQgY3A4NjVfOHgxNl9mb250X2hlaWdodCA9IDB4MTA7CitzdGF0aWMgY29uc3QgdWludDhfdCBjcDg2NV84eDE2X2ZvbnRfZGF0YVtdID0geworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2UsIDB4ODEsIDB4YTUsIDB4ODEsIDB4ODEsIDB4YmQsIDB4OTksIDB4ODEsIDB4ODEsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2UsIDB4ZmYsIDB4ZGIsIDB4ZmYsIDB4ZmYsIDB4YzMsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NmMsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4N2MsIDB4MzgsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzgsIDB4N2MsIDB4ZmUsIDB4N2MsIDB4MzgsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4M2MsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4N2UsIDB4ZmYsIDB4ZmYsIDB4N2UsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4M2MsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZTcsIDB4YzMsIDB4YzMsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M2MsIDB4NjYsIDB4NDIsIDB4NDIsIDB4NjYsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YzMsIDB4OTksIDB4YmQsIDB4YmQsIDB4OTksIDB4YzMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIAorCTB4MDAsIDB4MDAsIDB4MWUsIDB4MGUsIDB4MWEsIDB4MzIsIDB4NzgsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2MsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M2MsIDB4MTgsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2YsIDB4MzMsIDB4M2YsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4NzAsIDB4ZjAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2YsIDB4NjMsIDB4N2YsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjcsIDB4ZTcsIDB4ZTYsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4ZGIsIDB4M2MsIDB4ZTcsIDB4M2MsIDB4ZGIsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4ODAsIDB4YzAsIDB4ZTAsIDB4ZjAsIDB4ZjgsIDB4ZmUsIDB4ZjgsIDB4ZjAsIDB4ZTAsIDB4YzAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDIsIDB4MDYsIDB4MGUsIDB4MWUsIDB4M2UsIDB4ZmUsIDB4M2UsIDB4MWUsIDB4MGUsIDB4MDYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MTgsIDB4N2UsIDB4M2MsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2YsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4N2IsIDB4MWIsIDB4MWIsIDB4MWIsIDB4MWIsIDB4MWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4N2MsIDB4YzYsIDB4NjAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4NmMsIDB4MzgsIDB4MGMsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MTgsIDB4N2UsIDB4M2MsIDB4MTgsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4N2UsIDB4M2MsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MGMsIDB4ZmUsIDB4MGMsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzAsIDB4NjAsIDB4ZmUsIDB4NjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjgsIDB4NmMsIDB4ZmUsIDB4NmMsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzgsIDB4MzgsIDB4N2MsIDB4N2MsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4N2MsIDB4N2MsIDB4MzgsIDB4MzgsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTgsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4NmMsIDB4NmMsIDB4ZmUsIDB4NmMsIDB4NmMsIDB4NmMsIDB4ZmUsIDB4NmMsIDB4NmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MTgsIDB4MTgsIDB4N2MsIDB4YzYsIDB4YzIsIDB4YzAsIDB4N2MsIDB4MDYsIDB4MDYsIDB4ODYsIDB4YzYsIDB4N2MsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzIsIDB4YzYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzYsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MzgsIDB4NmMsIDB4NmMsIDB4MzgsIDB4NzYsIDB4ZGMsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjYsIDB4M2MsIDB4ZmYsIDB4M2MsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4ZDYsIDB4ZDYsIDB4YzYsIDB4YzYsIDB4NmMsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTgsIDB4MzgsIDB4NzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzAsIDB4YzYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4MDYsIDB4MDYsIDB4M2MsIDB4MDYsIDB4MDYsIDB4MDYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MGMsIDB4MWMsIDB4M2MsIDB4NmMsIDB4Y2MsIDB4ZmUsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzAsIDB4ZmMsIDB4MDYsIDB4MDYsIDB4MDYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MzgsIDB4NjAsIDB4YzAsIDB4YzAsIDB4ZmMsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmUsIDB4YzYsIDB4MDYsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2UsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MGMsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2UsIDB4MDAsIDB4MDAsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4MGMsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGMsIDB4YzAsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N2MsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4ZmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2MsIDB4NjYsIDB4YzIsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsIDB4NjYsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZjgsIDB4NmMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NmMsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmUsIDB4NjYsIDB4NjIsIDB4NjgsIDB4NzgsIDB4NjgsIDB4NjAsIDB4NjIsIDB4NjYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmUsIDB4NjYsIDB4NjIsIDB4NjgsIDB4NzgsIDB4NjgsIDB4NjAsIDB4NjAsIDB4NjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2MsIDB4NjYsIDB4YzIsIDB4YzAsIDB4YzAsIDB4ZGUsIDB4YzYsIDB4YzYsIDB4NjYsIDB4M2EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2MsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MWUsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZTYsIDB4NjYsIDB4NjYsIDB4NmMsIDB4NzgsIDB4NzgsIDB4NmMsIDB4NjYsIDB4NjYsIDB4ZTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjIsIDB4NjYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4ZWUsIDB4ZmUsIDB4ZmUsIDB4ZDYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4ZTYsIDB4ZjYsIDB4ZmUsIDB4ZGUsIDB4Y2UsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N2MsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4ZDYsIDB4ZGUsIDB4N2MsIDB4MGMsIDB4MGUsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N2MsIDB4NmMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4ZTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4NjAsIDB4MzgsIDB4MGMsIDB4MDYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2UsIDB4N2UsIDB4NWEsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4NmMsIDB4MzgsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZmUsIDB4ZWUsIDB4NmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4NmMsIDB4N2MsIDB4MzgsIDB4MzgsIDB4N2MsIDB4NmMsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M2MsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmUsIDB4YzYsIDB4ODYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzIsIDB4YzYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2MsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4YzAsIDB4ZTAsIDB4NzAsIDB4MzgsIDB4MWMsIDB4MGUsIDB4MDYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2MsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MTAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZTAsIDB4NjAsIDB4NjAsIDB4NzgsIDB4NmMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MWMsIDB4MGMsIDB4MGMsIDB4M2MsIDB4NmMsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MWMsIDB4MzYsIDB4MzIsIDB4MzAsIDB4NzgsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4N2MsIDB4MGMsIDB4Y2MsIDB4NzgsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZTAsIDB4NjAsIDB4NjAsIDB4NmMsIDB4NzYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4ZTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDYsIDB4MDYsIDB4MDAsIDB4MGUsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4NjYsIDB4NjYsIDB4M2MsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZTAsIDB4NjAsIDB4NjAsIDB4NjYsIDB4NmMsIDB4NzgsIDB4NzgsIDB4NmMsIDB4NjYsIDB4ZTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWMsIDB4ZmUsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N2MsIDB4NjAsIDB4NjAsIDB4ZjAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4N2MsIDB4MGMsIDB4MGMsIDB4MWUsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4NzYsIDB4NjYsIDB4NjAsIDB4NjAsIDB4NjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4NjAsIDB4MzgsIDB4MGMsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTAsIDB4MzAsIDB4MzAsIDB4ZmMsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzYsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4NmMsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZmUsIDB4NmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzYsIDB4NmMsIDB4MzgsIDB4MzgsIDB4MzgsIDB4NmMsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2UsIDB4MDYsIDB4MGMsIDB4ZjgsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4Y2MsIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MGUsIDB4MTgsIDB4MTgsIDB4MTgsIDB4NzAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4NzAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MGUsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NzYsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2MsIDB4NjYsIDB4YzIsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsIDB4NjYsIDB4M2MsIDB4MTgsIDB4NzAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MTAsIDB4MzgsIDB4NmMsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MzgsIDB4NmMsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzYsIDB4N2MsIDB4MTgsIDB4NzAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MTAsIDB4MzgsIDB4NmMsIDB4MDAsIDB4N2MsIDB4YzYsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MDAsIDB4N2MsIDB4YzYsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MTgsIDB4M2MsIDB4NjYsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4YzYsIDB4MDAsIDB4MTAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MzgsIDB4NmMsIDB4MzgsIDB4MTAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MGMsIDB4MTgsIDB4MDAsIDB4ZmUsIDB4NjYsIDB4NjIsIDB4NjgsIDB4NzgsIDB4NjgsIDB4NjIsIDB4NjYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWMsIDB4MzYsIDB4MzYsIDB4N2UsIDB4ZDgsIDB4ZDgsIDB4NmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2UsIDB4NmMsIDB4Y2MsIDB4Y2MsIDB4ZmUsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MTAsIDB4MzgsIDB4NmMsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MzAsIDB4NzgsIDB4Y2MsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4YzYsIDB4MDAsIDB4MDAsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2UsIDB4MDYsIDB4MGMsIDB4NzgsIDB4MDAsIAorCTB4MDAsIDB4YzYsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4YzYsIDB4MDAsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4Y2UsIDB4ZDYsIDB4ZTYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MzgsIDB4NmMsIDB4NjQsIDB4NjAsIDB4ZjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4ZTYsIDB4ZmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDQsIDB4N2MsIDB4Y2UsIDB4Y2UsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZTYsIDB4ZTYsIDB4N2MsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4ZjgsIDB4Y2MsIDB4Y2MsIDB4ZjgsIDB4YzQsIDB4Y2MsIDB4ZGUsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MGUsIDB4MWIsIDB4MTgsIDB4MTgsIDB4MTgsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZDgsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MDAsIDB4NzgsIDB4MGMsIDB4N2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4NzYsIDB4ZGMsIDB4MDAsIDB4ZGMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4NzYsIDB4ZGMsIDB4MDAsIDB4YzYsIDB4ZTYsIDB4ZjYsIDB4ZmUsIDB4ZGUsIDB4Y2UsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4M2MsIDB4NmMsIDB4NmMsIDB4M2UsIDB4MDAsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MzgsIDB4NmMsIDB4NmMsIDB4MzgsIDB4MDAsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4NjAsIDB4YzAsIDB4YzYsIDB4YzYsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NjAsIDB4ZTAsIDB4NjIsIDB4NjYsIDB4NmMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4ZGMsIDB4ODYsIDB4MGMsIDB4MTgsIDB4M2UsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NjAsIDB4ZTAsIDB4NjIsIDB4NjYsIDB4NmMsIDB4MTgsIDB4MzAsIDB4NjYsIDB4Y2UsIDB4OWEsIDB4M2YsIDB4MDYsIDB4MDYsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4NmMsIDB4MzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzYsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4N2MsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIDB4MTEsIDB4NDQsIAorCTB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsIAorCTB4ZGQsIDB4NzcsIDB4ZGQsIDB4NzcsIDB4ZGQsIDB4NzcsIDB4ZGQsIDB4NzcsIDB4ZGQsIDB4NzcsIDB4ZGQsIDB4NzcsIDB4ZGQsIDB4NzcsIDB4ZGQsIDB4NzcsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZjgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZjgsIDB4MTgsIDB4ZjgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZjYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4MTgsIDB4ZjgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZjYsIDB4MDYsIDB4ZjYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4MDYsIDB4ZjYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZjYsIDB4MDYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZjgsIDB4MTgsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZmYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzcsIDB4MzAsIDB4M2YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M2YsIDB4MzAsIDB4MzcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZjcsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZjcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzcsIDB4MzAsIDB4MzcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZjcsIDB4MDAsIDB4ZjcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4M2YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWYsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M2YsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4ZmYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZmYsIDB4MTgsIDB4ZmYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIAorCTB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIAorCTB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIAorCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4ZGMsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZGMsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4NzgsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4ZDgsIDB4Y2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmUsIDB4YzYsIDB4YzYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4ZmUsIDB4YzYsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MTgsIDB4MzAsIDB4NjAsIDB4YzYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2UsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N2MsIDB4NjAsIDB4NjAsIDB4YzAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4ZGMsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4N2UsIDB4MTgsIDB4M2MsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M2MsIDB4MTgsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4NmMsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MzgsIDB4NmMsIDB4YzYsIDB4YzYsIDB4YzYsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmMsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MWUsIDB4MzAsIDB4MTgsIDB4MGMsIDB4M2UsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2UsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDYsIDB4N2UsIDB4ZGIsIDB4ZGIsIDB4ZjMsIDB4N2UsIDB4NjAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MWMsIDB4MzAsIDB4NjAsIDB4NjAsIDB4N2MsIDB4NjAsIDB4NjAsIDB4NjAsIDB4MzAsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4N2UsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsIDB4MDAsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MGMsIDB4MDAsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MGUsIDB4MWIsIDB4MWIsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIAorCTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4N2UsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4ZGMsIDB4MDAsIDB4NzYsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MzgsIDB4NmMsIDB4NmMsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MGYsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4ZWMsIDB4NmMsIDB4NmMsIDB4M2MsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4NmMsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4M2MsIDB4NjYsIDB4MGMsIDB4MTgsIDB4MzIsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorfTsKKyNlbmRpZiAvKiBDUDg2NV84eDE2ICovCmRpZmYgLS1naXQgYS9lZmkvZGVyaXZhdGl2ZS5jIGIvZWZpL2Rlcml2YXRpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmVkZDcwCi0tLSAvZGV2L251bGwKKysrIGIvZWZpL2Rlcml2YXRpdmUuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTItMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqLworCisjaW5jbHVkZSA8c3lzbGludXgvY29uZmlnLmg+CisKKy8qCisgKiBJUCBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCB0aGUgZmllbGQgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZQorICogTGludXgga2VybmVsIGV4cGVjdHMgaW4gdGhlIGlwPSBvcHRpb24uCisgKi8KK3N0cnVjdCBzeXNsaW51eF9pcGluZm8gSVBJbmZvOwordWludDE2X3QgQVBJVmVyOwkJLyogUFhFIEFQSSB2ZXJzaW9uIGZvdW5kICovCisKK3N0YXRpYyBlbnVtIHN5c2xpbnV4X2ZpbGVzeXN0ZW0gX19maWxlc3lzdGVtOworCit2b2lkIGVmaV9kZXJpdmF0aXZlKGVudW0gc3lzbGludXhfZmlsZXN5c3RlbSBmcykKK3sKKyAgICBfX2ZpbGVzeXN0ZW0gPSBmczsKK30KK19fZXhwb3J0IHZvaWQgZ2V0X2Rlcml2YXRpdmVfaW5mbyh1bmlvbiBzeXNsaW51eF9kZXJpdmF0aXZlX2luZm8gKmRpKQoreworCWRpLT5kaXNrLmZpbGVzeXN0ZW0gPSBfX2ZpbGVzeXN0ZW07Cit9CmRpZmYgLS1naXQgYS9lZmkvZGlza2lvLmMgYi9lZmkvZGlza2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhMTYwZQotLS0gL2Rldi9udWxsCisrKyBiL2VmaS9kaXNraW8uYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEtMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqLworCisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxpbG9nMi5oPgorI2luY2x1ZGUgPGRpc2suaD4KKyNpbmNsdWRlIDxkcHJpbnRmLmg+CisjaW5jbHVkZSAiZWZpLmgiCisKK3N0YXRpYyBpbmxpbmUgRUZJX1NUQVRVUyByZWFkX2Jsb2NrcyhFRklfQkxPQ0tfSU8gKmJpbywgdWludDMyX3QgaWQsIAorCQkJCSAgICAgc2VjdG9yX3QgbGJhLCBVSU5UTiBieXRlcywgdm9pZCAqYnVmKQoreworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcihiaW8tPlJlYWRCbG9ja3MsIDUsIGJpbywgaWQsIGxiYSwgYnl0ZXMsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgRUZJX1NUQVRVUyB3cml0ZV9ibG9ja3MoRUZJX0JMT0NLX0lPICpiaW8sIHVpbnQzMl90IGlkLCAKKwkJCQkgICAgIHNlY3Rvcl90IGxiYSwgVUlOVE4gYnl0ZXMsIHZvaWQgKmJ1ZikKK3sKKwlyZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIoYmlvLT5Xcml0ZUJsb2NrcywgNSwgYmlvLCBpZCwgbGJhLCBieXRlcywgYnVmKTsKK30KKworc3RhdGljIGludCBlZmlfcmR3cl9zZWN0b3JzKHN0cnVjdCBkaXNrICpkaXNrLCB2b2lkICpidWYsCisJCQkgICAgc2VjdG9yX3QgbGJhLCBzaXplX3QgY291bnQsIGJvb2wgaXNfd3JpdGUpCit7CisJc3RydWN0IGVmaV9kaXNrX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IGVmaV9kaXNrX3ByaXZhdGUgKilkaXNrLT5wcml2YXRlOworCUVGSV9CTE9DS19JTyAqYmlvID0gcHJpdi0+YmlvOworCUVGSV9TVEFUVVMgc3RhdHVzOworCVVJTlROIGJ5dGVzID0gY291bnQgKiBkaXNrLT5zZWN0b3Jfc2l6ZTsKKworCWlmIChpc193cml0ZSkKKwkJc3RhdHVzID0gd3JpdGVfYmxvY2tzKGJpbywgZGlzay0+ZGlza19udW1iZXIsIGxiYSwgYnl0ZXMsIGJ1Zik7CisJZWxzZQorCQlzdGF0dXMgPSByZWFkX2Jsb2NrcyhiaW8sIGRpc2stPmRpc2tfbnVtYmVyLCBsYmEsIGJ5dGVzLCBidWYpOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJUHJpbnQoTCJGYWlsZWQgdG8gJXMgYmxvY2tzOiAweCV4XG4iLAorCQkJaXNfd3JpdGUgPyBMIndyaXRlIiA6IEwicmVhZCIsCisJCQlzdGF0dXMpOworCisJcmV0dXJuIGNvdW50IDw8IGRpc2stPnNlY3Rvcl9zaGlmdDsKK30KKworc3RydWN0IGRpc2sgKmVmaV9kaXNrX2luaXQodm9pZCAqcHJpdmF0ZSkKK3sKKyAgICBzdGF0aWMgc3RydWN0IGRpc2sgZGlzazsKKyAgICBzdHJ1Y3QgZWZpX2Rpc2tfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgZWZpX2Rpc2tfcHJpdmF0ZSAqKXByaXZhdGU7CisgICAgRUZJX0hBTkRMRSBoYW5kbGUgPSBwcml2LT5kZXZfaGFuZGxlOworICAgIEVGSV9CTE9DS19JTyAqYmlvOworICAgIEVGSV9ESVNLX0lPICpkaW87CisgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SGFuZGxlUHJvdG9jb2wsIDMsIGhhbmRsZSwKKwkJCSAgICAgICAmRGlza0lvUHJvdG9jb2wsICh2b2lkICoqKSZkaW8pOworICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJICAgIHJldHVybiBOVUxMOworCisgICAgc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkhhbmRsZVByb3RvY29sLCAzLCBoYW5kbGUsCisJCQkgICAgICAgJkJsb2NrSW9Qcm90b2NvbCwgKHZvaWQgKiopJmJpbyk7CisgICAgaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKgorICAgICAqIFhYWCBEbyB3ZSBuZWVkIHRvIG1hcCB0aGlzIHRvIGEgQklPUyBkaXNrIG51bWJlcj8KKyAgICAgKi8KKyAgICBkaXNrLmRpc2tfbnVtYmVyICAgPSBiaW8tPk1lZGlhLT5NZWRpYUlkOworCisgICAgZGlzay5zZWN0b3Jfc2l6ZSAgID0gYmlvLT5NZWRpYS0+QmxvY2tTaXplOworICAgIGRpc2sucmR3cl9zZWN0b3JzICA9IGVmaV9yZHdyX3NlY3RvcnM7CisgICAgZGlzay5zZWN0b3Jfc2hpZnQgID0gaWxvZzIoZGlzay5zZWN0b3Jfc2l6ZSk7CisKKyAgICBkcHJpbnRmKCJzZWN0b3Jfc2l6ZT0lZCwgZGlza19udW1iZXI9JWRcbiIsIGRpc2suc2VjdG9yX3NpemUsCisJICAgIGRpc2suZGlza19udW1iZXIpOworCisgICAgcHJpdi0+YmlvID0gYmlvOworICAgIHByaXYtPmRpbyA9IGRpbzsKKyAgICBkaXNrLnByaXZhdGUgPSBwcml2YXRlOworI2lmIDAKKworICAgIGRpc2sucGFydF9zdGFydCAgICA9IHBhcnRfc3RhcnQ7CisgICAgZGlzay5zZWNwZXJjeWwgICAgID0gZGlzay5oICogZGlzay5zOworCisKKyAgICBkaXNrLm1heHRyYW5zZmVyICAgPSBNYXhUcmFuc2ZlcjsKKworICAgIGRwcmludGYoImRpc2sgJTAyeCBjZHJvbSAlZCB0eXBlICVkIHNlY3RvciAldS8ldSBvZmZzZXQgJWxsdSBsaW1pdCAldVxuIiwKKwkgICAgbWVkaWFfaWQsIGNkcm9tLCBlYmlvcywgc2VjdG9yX3NpemUsIGRpc2suc2VjdG9yX3NoaWZ0LAorCSAgICBwYXJ0X3N0YXJ0LCBkaXNrLm1heHRyYW5zZmVyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuICZkaXNrOworfQpkaWZmIC0tZ2l0IGEvZWZpL2VmaS5oIGIvZWZpL2VmaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWJhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvZWZpLmgKQEAgLTAsMCArMSw4MyBAQAorI2lmbmRlZiBfU1lTTElOVVhfRUZJX0gKKyNkZWZpbmUgX1NZU0xJTlVYX0VGSV9ICisKKyNpbmNsdWRlIDxzeXNsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxjb3JlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CS8qIG5lZWRlZCBmb3Igb2ZmX3QgKi8KKy8vI2luY2x1ZGUgPHN5c2xpbnV4L3ZlcnNpb24uaD4gLyogYXZvaWQgcmVkZWZpbml0aW9uIG9mIF9fU1REQ19WRVJTSU9OX18gKi8KKworLyoKKyAqIGdudS1lZmkgPj0gMy4wcyBlbmFibGVzIEdOVV9FRklfVVNFX01TX0FCSSBieSBkZWZhdWx0LCB3aGljaCBtZWFucworICogdGhhdCB3ZSBtdXN0IGFsc28gZW5hYmxlIGl0IGlmIHN1cHBvcnRlZCBieSB0aGUgY29tcGlsZXIuIE5vdGUgdGhhdAorICogZmFpbGluZyB0byBlbmFibGUgR05VX0VGSV9VU0VfTVNfQUJJIGlmIGdudS1lZmkgd2FzIGNvbXBpbGVkIHdpdGgKKyAqIGl0IG9uIHdpbGwgcmVzdWx0IGluIHVuZGVmaW5lZCByZWZlcmVuY2VzIHRvIHVlZmlfY2FsbF93cmFwcGVyKCkuCisgKgorICogVGhlIHJlYXNvbiB3ZSBkb24ndCBhdHRlbXB0IHRvIGNoZWNrIHRoZSB2ZXJzaW9uIG9mIGdudS1lZmkgd2UncmUKKyAqIGJ1aWxkaW5nIGFnYWluc3QgaXMgYmVjYXVzZSB0aGVyZSdzIG5vIGhhcm0gaW4gdHVybmluZyBpdCBvbiBmb3IKKyAqIG9sZGVyIHZlcnNpb25zIC0gaXQgd2lsbCBqdXN0IGJlIGlnbm9yZWQuCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPiA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDcpKQorICAjZGVmaW5lIEdOVV9FRklfVVNFX01TX0FCSSAxCisjZW5kaWYKKworI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorI2luY2x1ZGUgPGVmaXN0ZGFyZy5oPgorCisvKiBEZWxheSBmb3IgMTAwIG1zICovCisjZGVmaW5lIEVGSV9OT01BUF9QUklOVF9ERUxBWQkxMDAKKy8qIFdlIHNob3VsZCBrZWVwIEVGSV9OT01BUF9QUklOVF9DT1VOVCBhdCAxMCB0byBsaW1pdCBmbG9vZGluZyB0aGUgY29uc29sZSAqLworI2RlZmluZSBFRklfTk9NQVBfUFJJTlRfQ09VTlQJMTAKKworc3RydWN0IGVmaV9kaXNrX3ByaXZhdGUgeworCUVGSV9IQU5ETEUgZGV2X2hhbmRsZTsKKwlFRklfQkxPQ0tfSU8gKmJpbzsKKwlFRklfRElTS19JTyAqZGlvOworfTsKKworc3RydWN0IGVmaV9iaW5kaW5nIHsKKyAgICBFRklfU0VSVklDRV9CSU5ESU5HICpiaW5kaW5nOworICAgIEVGSV9IQU5ETEUgcGFyZW50OworICAgIEVGSV9IQU5ETEUgY2hpbGQ7CisgICAgRUZJX0hBTkRMRSB0aGlzOworfTsKKworZXh0ZXJuIEVGSV9IQU5ETEUgaW1hZ2VfaGFuZGxlOworCitzdHJ1Y3Qgc2NyZWVuX2luZm87CitleHRlcm4gdm9pZCBzZXR1cF9zY3JlZW4oc3RydWN0IHNjcmVlbl9pbmZvICopOworCitleHRlcm4gdm9pZCBlZmlfd3JpdGVfY2hhcih1aW50OF90LCB1aW50OF90KTsKKworZW51bSBoZWFwOworZXh0ZXJuIHZvaWQgKmVmaV9tYWxsb2Moc2l6ZV90LCBlbnVtIGhlYXAsIHNpemVfdCk7CitleHRlcm4gdm9pZCAqZWZpX3JlYWxsb2Modm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgZWZpX2ZyZWUodm9pZCAqKTsKKworZXh0ZXJuIHN0cnVjdCBlZmlfYmluZGluZyAqZWZpX2NyZWF0ZV9iaW5kaW5nKEVGSV9HVUlEICosIEVGSV9HVUlEICopOworZXh0ZXJuIHZvaWQgZWZpX2Rlc3Ryb3lfYmluZGluZyhzdHJ1Y3QgZWZpX2JpbmRpbmcgKiwgRUZJX0dVSUQgKik7CisKK3N0YXRpYyBpbmxpbmUgRUZJX1NUQVRVUworZWZpX3NldHVwX2V2ZW50KEVGSV9FVkVOVCAqZXYsIEVGSV9FVkVOVF9OT1RJRlkgZnVuYywgdm9pZCAqY3R4KQoreworICAgIEVGSV9TVEFUVVMgc3RhdHVzOworCisgICAgc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkNyZWF0ZUV2ZW50LCA1LCBFVlRfTk9USUZZX1NJR05BTCwKKwkJCSAgICAgICBUUExfQ0FMTEJBQ0ssIGZ1bmMsIGN0eCwgZXYpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2V4dGVybiB2b2lkIGVmaV9kZXJpdmF0aXZlKGVudW0gc3lzbGludXhfZmlsZXN5c3RlbSBmcyk7CisKK3N0cnVjdCBib290X3BhcmFtczsKK3R5cGVkZWYgdm9pZCAoaGFuZG92ZXJfZnVuY190KSh2b2lkICosIEVGSV9TWVNURU1fVEFCTEUgKiwKKwkJCSAgICAgICBzdHJ1Y3QgYm9vdF9wYXJhbXMgKiwgdW5zaWduZWQgbG9uZyk7CisKK2hhbmRvdmVyX2Z1bmNfdCBlZmlfaGFuZG92ZXJfMzI7CitoYW5kb3Zlcl9mdW5jX3QgZWZpX2hhbmRvdmVyXzY0OworaGFuZG92ZXJfZnVuY190IGVmaV9oYW5kb3ZlcjsKKworZXh0ZXJuIHZvaWQgZWZpX2NvbnNvbGVfc2F2ZSh2b2lkKTsKK2V4dGVybiB2b2lkIGVmaV9jb25zb2xlX3Jlc3RvcmUodm9pZCk7CisKKyNlbmRpZiAvKiBfU1lTTElOVVhfRUZJX0ggKi8KZGlmZiAtLWdpdCBhL2VmaS9maW8uYyBiL2VmaS9maW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTZjZDViCi0tLSAvZGV2L251bGwKKysrIGIvZWZpL2Zpby5jCkBAIC0wLDAgKzEsMjgzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICogICBDaGFuZHJhbW91bGkgTmFyYXlhbmFuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgZm9yIFVFRkkgc3VwcG9ydAorICogV2UgYXNzdW1lIHRoYXQgRUZJIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZAorICogYW5kIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBnbG9iYWwgRUZJIGV4cG9ydGVkIHZhcmlhYmxlcworICoKKyAqLworI2luY2x1ZGUgImVmaS5oIgorI2luY2x1ZGUgImZpby5oIgorCisvKiBWYXJpYWJsZXMgdGhhdCBuZWVkIHRvIGJlIGV4cG9ydGVkCisgKiBlZmlfZXJybm8gLSBtYWludGFpbnMgdGhlIGVycm9ycyBmcm9tIEVGSSBjYWxscyB0byBkaXNwbGF5IGVycm9yIG1lc3NhZ2VzLgorICovCitFRklfU1RBVFVTIGVmaV9lcnJubyA9IEVGSV9TVUNDRVNTOworCisvKiBMb2NhbHMKKyAqIHZvbF9yb290IC0gaGFuZGxlIHRvIHRoZSByb290IGRldmljZSBmb3IgZmlsZSBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBFRklfRklMRV9IQU5ETEUgdm9sX3Jvb3Q7CisKKy8qIFRhYmxlIG9mIFVFRkkgZXJyb3IgbWVzc2FnZXMgdG8gYmUgaW5kZXhlZCB3aXRoIHRoZSBFRkkgZXJybm8KKyAqIFVwZGF0ZSBlcnJvciBtZXNzYWdlIGxpc3QgYXMgbmVlZGVkCisgKi8KK3N0YXRpYyBDSEFSMTYgKnVlZmlfZXJybXNnW10gPSB7CisJTCJFRklfVU5ERUZJTkVEIiwJLyogc2hvdWxkIG5vdCBnZXQgaGVyZSAqLworCUwiRUZJX0xPQURfRVJST1IiLAorCUwiRUZJX0lOVkFMSURfUEFSQU1FVEVSIiwKKwlMIkVGSV9VTlNVUFBPUlRFRCIsCisJTCJFRklfQkFEX0JVRkZFUl9TSVpFIiwKKwlMIkVGSV9CVUZGRVJfVE9PX1NNQUxMIiwKKwlMIkVGSV9OT1RfUkVBRFkiLAorCUwiRUZJX0RFVklDRV9FUlJPUiIsCisJTCJFRklfV1JJVEVfUFJPVEVDVEVEIiwKKwlMIkVGSV9PVVRfT0ZfUkVTT1VSQ0VTIiwKKwlMIkVGSV9WT0xVTUVfQ09SUlVQVEVEIiwKKwlMIkVGSV9WT0xVTUVfRlVMTCIsCisJTCJFRklfTk9fTUVESUEiLAorCUwiRUZJX01FRElBX0NIQU5HRUQiLAorCUwiRUZJX05PVF9GT1VORCIsCisJTCJFRklfQUNDRVNTX0RFTklFRCIsCisJTCJFRklfTk9fUkVTUE9OU0UiLAorCUwiRUZJX05PX01BUFBJTkciLAorCUwiRUZJX1RJTUVPVVQiLAorCUwiRUZJX05PVF9TVEFSVEVEIiwKKwlMIkVGSV9BTFJFQURZX1NUQVJURUQiLAorCUwiRUZJX0FCT1JURUQiLAorCUwiRUZJX0lDTVBfRVJST1IiLAorCUwiRUZJX1RGVFBfRVJST1IiLAorCUwiRUZJX1BST1RPQ09MX0VSUk9SIgorfTsKKworc3RhdGljIFVJTlROIG5lcnJzID0gc2l6ZW9mKHVlZmlfZXJybXNnKS9zaXplb2YoQ0hBUjE2ICopOworCisKKy8qIEdlbmVyaWMgd3JpdGUgZXJyb3IgbWVzc2FnZTsgdGhlcmUgaXMgbm8gZ251IGxpYiBhcGkgdG8gd3JpdGUgdG8gU3RkRXJyCisgKiBGb3Igbm93LCBldmVyeXRoaW5nIGdvZXMgQ29uT3V0CisgKi8KK3ZvaWQgZWZpX3ByaW50ZXJyKAorICAgIENIQVIxNiAgICpmbXQsCisgICAgLi4uCisgICAgKQoreworICAgIHZhX2xpc3QgICAgIGFyZ3M7CisgICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisgICAgVlByaW50IChmbXQsIGFyZ3MpOworICAgIHZhX2VuZCAoYXJncyk7Cit9CisKKy8qIFNpbXBsZSBjb25zb2xlIGxvZ2dlciBvZiBlZmktc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMuIEl0IHVzZXMKKyAqIGdudS1lZmkgbGlicmFyeSBQcmludCBmdW5jdGlvbiB0byBkbyB0aGUgam9iLgorICovCisKK3ZvaWQgZWZpX3BlcnJvcihDSEFSMTYgKnByb2cpCit7CisJLyogRW5zdXJlIHRoYXQgdGhlIGVyciBudW1iZXIgbGllcyB3aXRoaW4gcmFuZ2UKKwkgKiBCZXdhcmU6IHVuc2lnbmVkIGNvbXBhcmlzb25zIGZhaWwgb24gZWZpLCBzaWduZWQgY29tcGFyaXNvbnMgd29yaworCSAqLworCWlmIChFRklfRVJST1IoZWZpX2Vycm5vKSAmJiAoSU5UTillZmlfZXJybm8gPCAoSU5UTiluZXJycykKKwkJZWZpX3ByaW50ZXJyKEwiJXM6ICVzXG4iLCBwcm9nLCB1ZWZpX2Vycm1zZ1tlZmlfZXJybm9dKTsKK30KKworLyogV3JpdGUgdG8gVUVGSSBDb25PdXQgKi8KK3ZvaWQgZWZpX3ByaW50b3V0KAorICAgIENIQVIxNiAgICpmbXQsCisgICAgLi4uCisgICAgKQoreworICAgIHZhX2xpc3QgICAgIGFyZ3M7CisgICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisgICAgVlByaW50IChmbXQsIGFyZ3MpOworICAgIHZhX2VuZCAoYXJncyk7Cit9CisKKy8qIElNUE9SVEFOVDoKKyAqIGVmaV9zZXR2b2xfcm9vdCgpIG5lZWRzIHRvIGJlIGNhbGxlZCBmcm9tIGVmaSBtYWluLgorICogVGhlIHJlc3Qgb2YgdGhlIEFEViBzdXBwb3J0IHJlbGllcyBvbiB0aGUgZmlsZSBpL28gZW52aXJvbm1lbnQKKyAqIHNldHVwIGhlcmUuIEluIG9yZGVyIHRvIHVzZSB0aGUgRUZJIGZpbGUgc3VwcG9ydCwgd2UgbmVlZAorICogdG8gc2V0IHVwIHRoZSB2b2x1bWUgcm9vdC4gU3Vic2VxdWVudCBmaWxlIG9wZXJhdGlvbnMgbmVlZCB0aGUgcm9vdCB0bworICogYWNjZXNzIHRoZSBpbnRlcmZhY2Ugcm91dGluZXMuCisgKgorICovCisKK0VGSV9TVEFUVVMgZWZpX3NldF92b2xyb290KEVGSV9IQU5ETEUgZGV2aWNlX2hhbmRsZSkKK3sKKwl2b2xfcm9vdCA9IExpYk9wZW5Sb290KGRldmljZV9oYW5kbGUpOworCWlmICghdm9sX3Jvb3QpIHsKKwkJcmV0dXJuIEVGSV9ERVZJQ0VfRVJST1I7CisJfQorCXJldHVybiBFRklfU1VDQ0VTUzsKK30KKworLyogRmlsZSBvcGVyYXRpb25zIHVzaW5nIEVGSSBydW50aW1lIHNlcnZpY2VzICovCisKKy8qIE9wZW4gdGhlIGZpbGUgdXNpbmcgRUZJIHJ1bnRpbWUgc2VydmljZQorICogT3BlbmluZyBhIGZpbGUgaW4gRUZJIHJlcXVpcmVzIGEgaGFuZGxlIHRvIHRoZSBkZXZpY2UKKyAqIHJvb3QgaW4gb3JkZXIgdG8gdXNlIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGZpbGUgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgVUVGSS4KKyAqIEZvciBub3csIGFzc3VtZSBkZXZpY2Ugdm9sdW1lIHJvb3QgaGFuZGxlIGZyb20gdGhlIGxvYWRlZCBpbWFnZQorICoKKyAqIFJldHVybiBhIHZhbGlkIGhhbmRsZSBpZiBvcGVuIHN1Y2NlZWRlZCBhbmQgbnVsbCBvdGhlcndpc2UuCisgKiBVRUZJIHJldHVybnMgYSBib2d1cyBoYW5kbGUgb24gZXJyb3IsIHNvIHJldHVybiBudWxsIGhhbmRsZSBvbiBlcnJvci4KKyAqCisgKiBUT0RPOgorICogMS4gVmFsaWRhdGUgdGhlIGFzc3VtcHRpb24gYWJvdXQgdGhlIHJvb3QgZGV2aWNlCisgKiAyLiBDYW4gRUZJIG9wZW4gYSBmaWxlIHdpdGggZnVsbCBwYXRoIG5hbWUgc3BlY2lmaWNhdGlvbj8KKyAqIDMuIExvb2sgaW50byBnbnUtZWZpIGhlbHBlciBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBkZXZpY2UgcGF0aC9maWxlIHBhdGgKKyAqIDQuIENvbnNpZGVyIHV0aWxpemluZyBFRkkgZmlsZSBvcGVuIGF0dHJpYnV0ZXMuCisgKiA1LiBJbiBFRkksIGZpbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIG9ubHkgYXQgdGhlIHRpbWUgb2YgY3JlYXRpb24uCisgKiBIb3cgZG8gd2Ugc3VwcG9ydCB0aGUgZXF1aXZhbGVudCBvZiBzZXRfYXR0cmlidXRlcygpIGFuZCBjbGVhcl9hdHRyaWJ1dGVzKCkKKyAqLworRUZJX0ZJTEVfSEFORExFIGVmaV9vcGVuKENIQVIxNiAqZmlsZSwgVUlOVDY0IG1vZGUpCit7CisJLyogaW5pdGlhbGl6ZSB3aXRoIE5VTEwgaGFuZGxlIHNpbmNlIEVGSSBvcGVuIHJldHVybnMgYm9ndXMgKi8KKwlFRklfRklMRV9IQU5ETEUJZmQgPSBOVUxMOworCisJQVNTRVJUKHZvbF9yb290KTsKKworCS8qIE5vdGUgdGhhdCB0aGUgYXR0cmlidXRlcyBwYXJhbWV0ZXIgaXMgbm9uZSBmb3Igbm93ICovCisJZWZpX2Vycm5vID0gdWVmaV9jYWxsX3dyYXBwZXIodm9sX3Jvb3QtPk9wZW4sCisJCQkJCTUsCisJCQkJCXZvbF9yb290LAorCQkJCQkmZmQsCisJCQkJCWZpbGUsCisJCQkJCW1vZGUsCisJCQkJCTApOworCXJldHVybiBmZDsKK30KKworLyoKKyAqIHJlYWQvd3JpdGUgd3JhcHBlciBmdW5jdGlvbnMgZm9yIFVFRkkKKyAqCisgKiBSZWFkIG9yIHdyaXRlIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZQorICogb2Zmc2V0IHNwZWNpZmllZC4KKyAqCisgKiBSZXR1cm5zOgorICogbnVtYmVyIG9mIGJ5dGVzIHJlYWQvd3JpdHRlbiBvbiBzdWNjZXNzCisgKiAtMSBvbiBlcnJvcgorICovCisvKiBXcmFwcGVyIGZ1bmN0aW9uIHRvIHJlYWQgZnJvbSBhIGZpbGUgKi8KK3NpemVfdCBlZmlfeHByZWFkKEVGSV9GSUxFX0hBTkRMRSBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCkKK3sKKwlBU1NFUlQoZmQpOworCWVmaV9lcnJubyA9IHVlZmlfY2FsbF93cmFwcGVyKGZkLT5TZXRQb3NpdGlvbiwKKwkJCQkJMiwKKwkJCQkgICAgZmQsCisJCQkJICAgIG9mZnNldCk7CisJaWYgKEVGSV9FUlJPUihlZmlfZXJybm8pKSByZXR1cm4gLTE7CisJZWZpX2Vycm5vID0gdWVmaV9jYWxsX3dyYXBwZXIoZmQtPlJlYWQsCisJCQkJCTMsCisJCQkJICAgIGZkLAorCQkJCSAgICAmY291bnQsCisJCQkJCWJ1Zik7CisJaWYgKEVGSV9FUlJPUihlZmlfZXJybm8pKSByZXR1cm4gLTE7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBXcmFwcGVyIGZ1bmN0aW9uIHRvIHdyaXRlICovCitzaXplX3QgZWZpX3hwd3JpdGUoRUZJX0ZJTEVfSEFORExFIGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgb2ZmX3Qgb2Zmc2V0KQoreworCUFTU0VSVChmZCk7CisJZWZpX2Vycm5vID0gdWVmaV9jYWxsX3dyYXBwZXIoZmQtPlNldFBvc2l0aW9uLAorCQkJCQkyLAorCQkJCSAgICBmZCwKKwkJCQkgICAgb2Zmc2V0KTsKKwlpZiAoRUZJX0VSUk9SKGVmaV9lcnJubykpIHJldHVybiAtMTsKKwllZmlfZXJybm8gPSB1ZWZpX2NhbGxfd3JhcHBlcihmZC0+V3JpdGUsCisJCQkJCTMsCisJCQkJICAgIGZkLAorCQkJCSAgICAmY291bnQsCisJCQkJCWJ1Zik7CisJaWYgKEVGSV9FUlJPUihlZmlfZXJybm8pKSByZXR1cm4gLTE7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBGb3IgYW4gb3BlbiBoYW5kbGUsIHJldHVybiB0aGUgZ2VuZXJpYyBmaWxlIGluZm8gZXhjbHVkaW5nCisgKiB0aGUgdmFyaWFibGUtbGVuZ3RoIGZpbGVuYW1lIGluIHRoZSBFRklfRklMRV9JTkZPIHN0cnVjdHVyZS4KKyAqLworaW50IGVmaV9mc3RhdChFRklfRklMRV9IQU5ETEUgZmQsIEVGSV9GSUxFX0lORk8gKnN0KQoreworCUVGSV9GSUxFX0lORk8gKmZpbmZvOworCisJQVNTRVJUKGZkKTsKKwlmaW5mbyA9IExpYkZpbGVJbmZvKGZkKTsKKwlpZiAoZmluZm8pIHsKKwkJdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkNvcHlNZW0sIDMsIChWT0lEICopc3QsIChWT0lEICopZmluZm8sIFNJWkVfT0ZfRUZJX0ZJTEVfSU5GTyk7CisJCUZyZWVQb29sKGZpbmZvKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGdudS1lZmkgbGliIGRvZXMgbm90IHJldHVybiBFRkkgc3RhdHVzOyBleHBvcnQgYSBnZW5lcmljIGRldmljZSBlcnJvciBmb3Igbm93ICovCisJZWZpX2Vycm5vID0gRUZJX0RFVklDRV9FUlJPUjsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIHNldC9jbGVhcl9hdHRyaWJ1dGVzKCkKKyAqIAlDdXJyZW50bHkgaGFuZGxlcyBvbmx5IFZGQVQgZmlsZXN5c3RlbQorICogVE9ETzoKKyAqICAgIDEuIEFzc3VtZXMgVkZBVCBmaWxlIHN5c3RlbS4KKyAqICAgIDIuIEhvdyBkbyB3ZSBzdXBwb3J0IG90aGVyIGZpbGUgc3lzdGVtcz8KKyAqLwordm9pZCBlZmlfc2V0X2F0dHJpYnV0ZXMoRUZJX0ZJTEVfSEFORExFIGZkKQoreworCUVGSV9GSUxFX0lORk8gKmZpbmZvOworCisJQVNTRVJUKGZkKTsKKwlmaW5mbyA9IExpYkZpbGVJbmZvKGZkKTsKKwlpZiAoZmluZm8pIHsKKwkJLyogSGlkZGVuK1N5c3RlbStSZWFkb25seSAqLworCQlmaW5mby0+QXR0cmlidXRlID0gRUZJX0ZJTEVfUkVBRF9PTkxZfEVGSV9GSUxFX0hJRERFTnxFRklfRklMRV9TWVNURU07CisJCWVmaV9lcnJubyA9IHVlZmlfY2FsbF93cmFwcGVyKGZkLT5TZXRJbmZvLAorCQkJCQk0LAorCQkJCQlmZCwKKwkJCQkJJkdlbmVyaWNGaWxlSW5mbywKKwkJCQkJZmluZm8tPlNpemUsCisJCQkJCWZpbmZvKTsKKwkJRnJlZVBvb2woZmluZm8pOworCX0gZWxzZSBlZmlfZXJybm8gPSBFRklfTk9UX0ZPVU5EOworfQorCit2b2lkIGVmaV9jbGVhcl9hdHRyaWJ1dGVzKEVGSV9GSUxFX0hBTkRMRSBmZCkKK3sKKwlFRklfRklMRV9JTkZPICpmaW5mbzsKKworCUFTU0VSVChmZCk7CisJZmluZm8gPSBMaWJGaWxlSW5mbyhmZCk7CisJaWYgKGZpbmZvKSB7CisJCWZpbmZvLT5BdHRyaWJ1dGUgPSAwOyAvKiBubyBhdHRyaWJ1dGVzICovCisJCWVmaV9lcnJubyA9IHVlZmlfY2FsbF93cmFwcGVyKGZkLT5TZXRJbmZvLCAKKwkJCQkJNCwgCisJCQkJCWZkLAorCQkJCQkmR2VuZXJpY0ZpbGVJbmZvLAorCQkJCQlmaW5mby0+U2l6ZSwKKwkJCQkJZmluZm8pOworCQlGcmVlUG9vbChmaW5mbyk7CisJfSBlbHNlIGVmaV9lcnJubyA9IEVGSV9OT1RfRk9VTkQ7Cit9CisKKy8qIEltcGxlbWVudCB0aGUgc3luYyBvcGVyYXRpb24gdXNpbmcgdGhlIEVGSSBGbHVzaCBmaWxlIG9wZXJhdGlvbiovCit2b2lkIGVmaV9zeW5jKEVGSV9GSUxFX0hBTkRMRSBmZCkKK3sKKwlBU1NFUlQoZmQpOworCWVmaV9lcnJubyA9IHVlZmlfY2FsbF93cmFwcGVyKGZkLT5GbHVzaCwgMSwgZmQpOworCXJldHVybjsKK30KKworLyogQ2xvc2UgdGhlIGZpbGUgKi8KK3ZvaWQgZWZpX2Nsb3NlKEVGSV9GSUxFX0hBTkRMRSBmZCkKK3sKKworCUFTU0VSVChmZCk7CisJZWZpX2Vycm5vID0gdWVmaV9jYWxsX3dyYXBwZXIoZmQtPkNsb3NlLCAxLCBmZCk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZWZpL2Zpby5oIGIvZWZpL2Zpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZmZmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvZmlvLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBfSF9FRklfRklPXworI2RlZmluZSBfSF9FRklfRklPXworCisvKgorICogRnJpZW5kbHkgaW50ZXJmYWNlcyBmb3IgRUZJIGZpbGUgSS9PIGFuZCB2YXJpb3VzIEVGSSBzdXBwb3J0IGZ1bmN0aW9ucworICovCisKKy8qIE1BWF9FRklfQVJHUyAtIGNvbW1hbmQgbGluZSBhcmdzIGZvciBFRkkgZXhlY3V0YWJsZQorICogV1MoYzE2KSAJLSBjaGVjayBmb3IgQ0hBUjE2IHdoaXRlIHNwYWNlCisgKi8KKyNkZWZpbmUgTUFYX0VGSV9BUkdTCQk2NAorI2RlZmluZSBXUyhjMTYpICAgICAgICAgKGMxNiA9PSBMJyAnIHx8IGMxNiA9PSBDSEFSX1RBQikKKworLyogVlByaW50IGlzIG5vdCBpbiBleHBvcnQgZGVjbGFyYXRpb25zIGluIGdudS1lZmkgbGliIHlldAorICogYWx0aG91Z2ggaXQgaXMgYSBnbG9iYWwgZnVuY3Rpb247IGRlY2xhcmUgaXQgaGVyZQorICovCitleHRlcm4gVUlOVE4KK1ZQcmludCAoCisgICAgSU4gQ0hBUjE2ICAgKmZtdCwKKyAgICB2YV9saXN0ICAgICBhcmdzCisgICAgKTsKKworZXh0ZXJuIEVGSV9TVEFUVVMgZWZpX2Vycm5vOworCit2b2lkIGVmaV9tZW1jcHkodW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBjaGFyICpzcmMsIHNpemVfdCBsZW4pOwordm9pZCBlZmlfbWVtbW92ZSh1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywgc2l6ZV90IGxlbik7Cit2b2lkIGVmaV9tZW1zZXQodW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBjaGFyIHZhbCwgc2l6ZV90IGxlbik7Cit2b2lkICplZmlfYWxsb2MoaW50IHNpemUpOwordm9pZCBlZmlfZnJlZSh2b2lkICpwdHIpOwordm9pZCBlZmlfcGVycm9yKENIQVIxNiAqc3RyKTsKK3ZvaWQgZWZpX3ByaW50ZXJyKElOIENIQVIxNiAqZm10LCAuLi4pOwordm9pZCBlZmlfcHJpbnRvdXQoSU4gQ0hBUjE2ICpmbXQsIC4uLik7CitFRklfU1RBVFVTIGVmaV9zZXRfdm9scm9vdChFRklfSEFORExFIGRldmljZV9oYW5kbGUpOworRUZJX0ZJTEVfSEFORExFIGVmaV9vcGVuKENIQVIxNiAqZmlsZSwgVUlOVDY0IG1vZGUpOwordm9pZCBlZmlfY2xvc2UoRUZJX0ZJTEVfSEFORExFIGZkKTsKK3ZvaWQgZWZpX3N5bmMoRUZJX0ZJTEVfSEFORExFIGZkKTsKK3NpemVfdCBlZmlfeHByZWFkKEVGSV9GSUxFX0hBTkRMRSBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCk7CitzaXplX3QgZWZpX3hwd3JpdGUoRUZJX0ZJTEVfSEFORExFIGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgb2ZmX3Qgb2Zmc2V0KTsKK2ludCBlZmlfZnN0YXQoRUZJX0ZJTEVfSEFORExFIGZkLCBFRklfRklMRV9JTkZPICpzdCk7Cit2b2lkIGVmaV9zZXRfYXR0cmlidXRlcyhFRklfRklMRV9IQU5ETEUgZmQpOwordm9pZCBlZmlfY2xlYXJfYXR0cmlidXRlcyhFRklfRklMRV9IQU5ETEUgZmQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2VmaS9pMzg2L2xpbnV4LlMgYi9lZmkvaTM4Ni9saW51eC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDlhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvaTM4Ni9saW51eC5TCkBAIC0wLDAgKzEsNTAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDEzIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IE1hdHQgRmxlbWluZworICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLmdsb2JsIGtlcm5lbF9qdW1wCisJLnR5cGUgIGtlcm5lbF9qdW1wLEBmdW5jdGlvbgorCS50ZXh0CitrZXJuZWxfanVtcDoKKwljbGkKKwltb3ZsCTB4OCglZXNwKSwgJWVzaQorCW1vdmwJMHg0KCVlc3ApLCAlZWN4CisJam1wCSolZWN4CisKKwkvKgorCSAqIFRoZSBkZWZhdWx0IGhhbmRvdmVyIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGludm9rZWQgZm9yCisJICogYnpJbWFnZSBib290IHByb3RvY29sIHZlcnNpb25zIDwgMi4xMi4KKwkgKi8KKwkuZ2xvYmwgZWZpX2hhbmRvdmVyCisJLnR5cGUgIGVmaV9oYW5kb3ZlcixAZnVuY3Rpb24KK2VmaV9oYW5kb3ZlcjoKKwljbGkKKwlwb3BsCSVlY3gJCS8qIGRpc2NhcmQgcmV0dXJuIGFkZHJlc3MgKi8KKwltb3ZsCTB4YyglZXNwKSwgJWVjeAorCWptcAkqJWVjeAorCisJLmdsb2JsIGVmaV9oYW5kb3Zlcl8zMgorCS50eXBlICBlZmlfaGFuZG92ZXJfMzIsQGZ1bmN0aW9uCitlZmlfaGFuZG92ZXJfMzI6CisJY2xpCisJcG9wbAklZWN4CQkvKiBkaXNjYXJkIHJldHVybiBhZGRyZXNzICovCisJbW92bAkweGMoJWVzcCksICVlY3gKKwljYWxsCSolZWN4CisKKwkuZ2xvYmwgZWZpX2hhbmRvdmVyXzY0CisJLnR5cGUgIGVmaV9oYW5kb3Zlcl82NCxAZnVuY3Rpb24KK2VmaV9oYW5kb3Zlcl82NDoKKwljYWxsCTFmCisxOgorCXBvcGwJJWVheAorCXN1YmwJJDFiLCAlZWF4CisJbW92bAkkMzgsIGVycm5vKCVlYXgpCS8qIEVOT1NZUyAqLworCXJldApkaWZmIC0tZ2l0IGEvZWZpL2kzODYvc3lzbGludXgubGQgYi9lZmkvaTM4Ni9zeXNsaW51eC5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIzZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpL2kzODYvc3lzbGludXgubGQKQEAgLTAsMCArMSwxNzMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIAorICogICBDb3B5cmlnaHQgMjAwOC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgdGhlIFNZU0xJTlVYIGNvcmUKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorCitTRUNUSU9OUworeworCS4gPSAwOworCUltYWdlQmFzZSA9IC47CQkvKiBGb3IgZ251LWVmaSdzIGNydDAgKi8KKwlfX21vZHVsZV9zdGFydCA9IC47CisJLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDApICsgU0laRU9GX0hFQURFUlM7CisJLnRleHQgOiB7CisJCUZJTEwoMHg5MDkwOTA5MCkKKwkJX190ZXh0X3N0YXJ0ID0gLjsKKwkJKigudGV4dCkKKwkJKigudGV4dC4qKQorCQlfX3RleHRfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMTYpOworCisJLnJvZGF0YSA6IHsKKwkJX19yb2RhdGFfc3RhcnQgPSAuOworCQkqKC5yb2RhdGEpCisJCSooLnJvZGF0YS4qKQorCQlfX3JvZGF0YV9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCS5jdG9ycyA6IHsKKwkJX19jdG9yc19zdGFydCA9IC47CisJCUtFRVAgKCooU09SVCguY3RvcnMuKikpKQorCQlLRUVQICgqKC5jdG9ycykpCisJCV9fY3RvcnNfZW5kID0gLjsKKwl9CisKKwkuZHRvcnMgOiB7CisJCV9fZHRvcnNfc3RhcnQgPSAuOworCQlLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKwkJS0VFUCAoKiguZHRvcnMpKQorCQlfX2R0b3JzX2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDQwOTYpOworCS5yZWwgOiB7CisJCSooLnJlbC5nb3QpCisJCSooLnJlbC5kYXRhKQorCQkqKC5yZWwuZGF0YS4qKQorCQkqKC5yZWwuY3RvcnMpCisJfQorCisJLiA9IEFMSUdOKDQpOworCisJLmdudS5oYXNoIDogeworCQlfX2dudV9oYXNoX3N0YXJ0ID0gLjsKKwkJKiguZ251Lmhhc2gpCisJCV9fZ251X2hhc2hfZW5kID0gLjsKKwl9CisKKworCS5keW5zeW0gOiB7CisJCV9fZHluc3ltX3N0YXJ0ID0gLjsKKwkJKiguZHluc3ltKQorCQlfX2R5bnN5bV9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCS5keW5zdHIgOiB7CisJCV9fZHluc3RyX3N0YXJ0ID0gLjsKKwkJKiguZHluc3RyKQorCQlfX2R5bnN0cl9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCS5keW5saW5rIDogeworCQlfX2R5bmxpbmtfc3RhcnQgPSAuOworCQkqKC5keW5saW5rKQorCQlfX2R5bmxpbmtfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oNCk7CisKKwkuZ290IDogeworCQlfX2dvdF9zdGFydCA9IC47CisJCUtFRVAgKCooLmdvdC5wbHQpKQorCQlLRUVQICgqKC5nb3QpKQorCQlfX2dvdF9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCS5keW5hbWljIDogeworCQlfX2R5bmFtaWNfc3RhcnQgPSAuOworCQkqKC5keW5hbWljKQorCQlfX2R5bmFtaWNfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMTYpOworCisJLmRhdGEgOiB7CisJCV9fZGF0YV9zdGFydCA9IC47CisJCSooLmRhdGEpCisJCSooLmRhdGEuKikKKwkJKigubG93bWVtKQorCQlfX2RhdGFfZW5kID0gLjsKKwl9CisKKwkucmVsb2MgOiB7CisJCSooLnJlbG9jKQorCX0KKworCS5zeW10YWIgOiB7CisJCSooLnN5bXRhYikKKwl9CisKKwkuc3RydGFiIDogeworCQkqKC5zdHJ0YWIpCisJfQorCisJLmJzcyAoTk9MT0FEKSA6IHsKKwkJLyogdGhlIEVGSSBsb2FkZXIgZG9lc24ndCBzZWVtIHRvIGxpa2UgYSAuYnNzIHNlY3Rpb24sCisJCSAgIHNvIHdlIHN0aWNrIGl0IGFsbCBpbnRvIC5kYXRhOiAqLworCQlfX2Jzc19zdGFydCA9IC47CisJCSooLmJzcykKKwkJKiguYnNzLiopCisJCSooLmJzczE2KQorCQkqKC5odWdlYnNzKQorCQkqKENPTU1PTikKKwkJX19ic3NfZW5kID0gLjsKKwkJKiguc2JzcykKKwkJKiguc2NvbW1vbikKKwl9CisJX19ic3NfbGVuID0gQUJTT0xVVEUoX19ic3NfZW5kKSAtIEFCU09MVVRFKF9fYnNzX3N0YXJ0KTsKKwlfX2Jzc19kd29yZHMgPSAoX19ic3NfbGVuICsgMykgPj4gMjsKKworCS4gPSBBTElHTigxMjgpOworCisJLyogVmVyeSBsYXJnZSBvYmplY3RzIHdoaWNoIGRvbid0IG5lZWQgdG8gYmUgemVyb2VkICovCisKKwkuaHVnZWJzcyA6IHsKKwkJX19odWdlYnNzX3N0YXJ0ID0gLjsKKwkJKiguaHVnZWJzcykKKwkJKiguaHVnZWJzcy4qKQorCQlfX2h1Z2Vic3NfZW5kID0gLjsKKwl9CisKKwlfZW5kID0gLjsKKworCS8qIFN0dWZmIHdlIGRvbid0IG5lZWQuLi4gKi8KKwkvRElTQ0FSRC8gOiB7CisJCSooLmVoX2ZyYW1lKQorCQkqKC5jb21tZW50KQorCX0KK30KZGlmZiAtLWdpdCBhL2VmaS9tYWluLmMgYi9lZmkvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOGZlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvbWFpbi5jCkBAIC0wLDAgKzEsMTM0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExLTIwMTQgSW50ZWwgQ29ycG9yYXRpb24gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKi8KKworI2luY2x1ZGUgPGNvZGVwYWdlLmg+CisjaW5jbHVkZSA8Y29yZS5oPgorI2luY2x1ZGUgPGZzLmg+CisjaW5jbHVkZSA8Y29tMzIuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9tZW1zY2FuLmg+CisjaW5jbHVkZSA8c3lzbGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxzeXNsaW51eC9saW51eC5oPgorI2luY2x1ZGUgPHN5cy9hbnNpLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisKKyNpbmNsdWRlICJlZmkuaCIKKyNpbmNsdWRlICJmaW8uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKK19fZXhwb3J0IHVpbnQxNl90IFBYRVJldHJ5OworX19leHBvcnQgY2hhciBjb3B5cmlnaHRfc3RyW10gPSAiQ29weXJpZ2h0IChDKSAyMDExLSIgWUVBUl9TVFIgIlxuIjsKK3VpbnQ4X3QgU2VyaWFsTm90aWNlID0gMTsKK19fZXhwb3J0IGNoYXIgc3lzbGludXhfYmFubmVyW10gPSAiU3lzbGludXggIiBWRVJTSU9OX1NUUiAiIChFRkk7ICIgREFURV9TVFIgIilcbiI7CitjaGFyIEN1cnJlbnREaXJOYW1lW0NVUlJFTlRESVJfTUFYXTsKK3N0cnVjdCBjb20zMl9zeXNfYXJncyBfX2NvbTMyOworCit1aW50MzJfdCBfSWRsZVRpbWVyID0gMDsKK2NoYXIgX19sb3dtZW1faGVhcFszMl07Cit1aW50MzJfdCBCSU9TX3RpbWVyX25leHQ7Cit1aW50MzJfdCB0aW1lcl9pcnE7CitfX2V4cG9ydCB1aW50OF90IEtiZE1hcFsyNTZdOworY2hhciBhdXhfc2VnWzI1Nl07CisKK3N0YXRpYyBqbXBfYnVmIGxvYWRfZXJyb3JfYnVmOworCitzdGF0aWMgaW5saW5lIEVGSV9TVEFUVVMKK2VmaV9jbG9zZV9wcm90b2NvbChFRklfSEFORExFIGhhbmRsZSwgRUZJX0dVSUQgKmd1aWQsIEVGSV9IQU5ETEUgYWdlbnQsCisJCSAgIEVGSV9IQU5ETEUgY29udHJvbGxlcikKK3sKKyAgICByZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkNsb3NlUHJvdG9jb2wsIDQsIGhhbmRsZSwKKwkJCSAgICAgZ3VpZCwgYWdlbnQsIGNvbnRyb2xsZXIpOworfQorCitzdHJ1Y3QgZWZpX2JpbmRpbmcgKmVmaV9jcmVhdGVfYmluZGluZyhFRklfR1VJRCAqYmd1aWQsIEVGSV9HVUlEICpwZ3VpZCkKK3sKKyAgICBFRklfU0VSVklDRV9CSU5ESU5HICpzYnA7CisgICAgc3RydWN0IGVmaV9iaW5kaW5nICpiOworICAgIEVGSV9TVEFUVVMgc3RhdHVzOworICAgIEVGSV9IQU5ETEUgcHJvdG9jb2wsIGNoaWxkLCAqaGFuZGxlcyA9IE5VTEw7CisgICAgVUlOVE4gaSwgbnJfaGFuZGxlcyA9IDA7CisKKyAgICBiID0gbWFsbG9jKHNpemVvZigqYikpOworICAgIGlmICghYikKKwlyZXR1cm4gTlVMTDsKKworICAgIHN0YXR1cyA9IExpYkxvY2F0ZUhhbmRsZShCeVByb3RvY29sLCBiZ3VpZCwgTlVMTCwgJm5yX2hhbmRsZXMsICZoYW5kbGVzKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCWdvdG8gZnJlZV9iaW5kaW5nOworCisgICAgZm9yIChpID0gMDsgaSA8IG5yX2hhbmRsZXM7IGkrKykgeworCXN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5PcGVuUHJvdG9jb2wsIDYsIGhhbmRsZXNbaV0sCisJCQkJICAgYmd1aWQsICh2b2lkICoqKSZzYnAsCisJCQkJICAgaW1hZ2VfaGFuZGxlLCBoYW5kbGVzW2ldLAorCQkJCSAgIEVGSV9PUEVOX1BST1RPQ09MX0dFVF9QUk9UT0NPTCk7CisJaWYgKHN0YXR1cyA9PSBFRklfU1VDQ0VTUykKKwkgICAgYnJlYWs7CisKKwl1ZWZpX2NhbGxfd3JhcHBlcihCUy0+Q2xvc2VQcm90b2NvbCwgNCwgaGFuZGxlc1tpXSwgYmd1aWQsCisJCQkgIGltYWdlX2hhbmRsZSwgaGFuZGxlc1tpXSk7CisgICAgfQorCisgICAgaWYgKGkgPT0gbnJfaGFuZGxlcykKKwlnb3RvIGZyZWVfYmluZGluZzsKKworICAgIGNoaWxkID0gTlVMTDsKKworICAgIHN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKHNicC0+Q3JlYXRlQ2hpbGQsIDIsIHNicCwgKEVGSV9IQU5ETEUgKikmY2hpbGQpOworICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJZ290byBjbG9zZV9wcm90b2NvbDsKKworICAgIHN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5PcGVuUHJvdG9jb2wsIDYsIGNoaWxkLAorCQkJICAgICAgcGd1aWQsICh2b2lkICoqKSZwcm90b2NvbCwKKwkJCSAgICAgIGltYWdlX2hhbmRsZSwgc2JwLAorCQkJICAgICAgRUZJX09QRU5fUFJPVE9DT0xfR0VUX1BST1RPQ09MKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCWdvdG8gZGVzdHJveV9jaGlsZDsKKworICAgIGItPnBhcmVudCA9IGhhbmRsZXNbaV07CisgICAgYi0+YmluZGluZyA9IHNicDsKKyAgICBiLT5jaGlsZCA9IGNoaWxkOworICAgIGItPnRoaXMgPSBwcm90b2NvbDsKKworICAgIHJldHVybiBiOworCitkZXN0cm95X2NoaWxkOgorICAgIHVlZmlfY2FsbF93cmFwcGVyKHNicC0+RGVzdHJveUNoaWxkLCAyLCBzYnAsIGNoaWxkKTsKKworY2xvc2VfcHJvdG9jb2w6CisgICAgdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkNsb3NlUHJvdG9jb2wsIDQsIGhhbmRsZXNbaV0sIGJndWlkLAorCQkgICAgICBpbWFnZV9oYW5kbGUsIGhhbmRsZXNbaV0pOworCitmcmVlX2JpbmRpbmc6CisgICAgZnJlZShiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBlZmlfZGVzdHJveV9iaW5kaW5nKHN0cnVjdCBlZmlfYmluZGluZyAqYiwgRUZJX0dVSUQgKmd1aWQpCit7CisgICAgZWZpX2Nsb3NlX3Byb3RvY29sKGItPmNoaWxkLCBndWlkLCBpbWFnZV9oYW5kbGUsIGItPmJpbmRpbmcpOworICAgIHVlZmlfY2FsbF93cmFwcGVyKGItPmJpbmRpbmctPkRlc3Ryb3lDaGlsZCwgMiwgYi0+YmluZGluZywgYi0+Y2hpbGQpOworICAgIGVmaV9jbG9zZV9wcm90b2NvbChiLT5wYXJlbnQsIGd1aWQsIGltYWdlX2hhbmRsZSwgYi0+cGFyZW50KTsKKworICAgIGZyZWUoYik7Cit9CisKKyN1bmRlZiBrYWJvb20KK3ZvaWQga2Fib29tKHZvaWQpCit7Cit9CisKK3ZvaWQgcHJpbnRmX2luaXQodm9pZCkKK3sKK30KKworX19leHBvcnQgdm9pZCBsb2NhbF9ib290KHVpbnQxNl90IGF4KQoreworICAgIC8qCisgICAgICogSW5mb3JtIHRoZSBmaXJtd2FyZSB0aGF0IHdlIGZhaWxlZCB0byBleGVjdXRlIGNvcnJlY3RseSwgd2hpY2gKKyAgICAgKiB3aWxsIHRyaWdnZXIgdGhlIG5leHQgZW50cnkgaW4gdGhlIEVGSSBCb290IE1hbmFnZXIgbGlzdC4KKyAgICAgKi8KKyAgICBsb25nam1wKGxvYWRfZXJyb3JfYnVmLCAxKTsKK30KKwordm9pZCBiaW9zX3RpbWVyX2NsZWFudXAodm9pZCkKK3sKK30KKworY2hhciB0cmFja2J1Zls0MDk2XTsKKwordm9pZCBfX2NkZWNsIGNvcmVfZmFyY2FsbCh1aW50MzJfdCBjLCBjb25zdCBjb20zMnN5c190ICphLCBjb20zMnN5c190ICpiKQoreworfQorCitfX2V4cG9ydCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlID0gTlVMTDsKK19fZXhwb3J0IHZvaWQgKl9fc3lzbGludXhfYWR2X3B0cjsKK19fZXhwb3J0IHNpemVfdCBfX3N5c2xpbnV4X2Fkdl9zaXplOworY2hhciBjb3JlX3hmZXJfYnVmWzY1NTM2XTsKK3N0cnVjdCBpc29fYm9vdF9pbmZvIHsKKwl1aW50MzJfdCBwdmQ7ICAgICAgICAgICAgICAgLyogTEJBIG9mIHByaW1hcnkgdm9sdW1lIGRlc2NyaXB0b3IgKi8KKwl1aW50MzJfdCBmaWxlOyAgICAgICAgICAgICAgLyogTEJBIG9mIGJvb3QgZmlsZSAqLworCXVpbnQzMl90IGxlbmd0aDsgICAgICAgICAgICAvKiBMZW5ndGggb2YgYm9vdCBmaWxlICovCisJdWludDMyX3QgY3N1bTsgICAgICAgICAgICAgIC8qIENoZWNrc3VtIG9mIGJvb3QgZmlsZSAqLworCXVpbnQzMl90IHJlc2VydmVkWzEwXTsgICAgICAvKiBDdXJyZW50bHkgdW51c2VkICovCit9IGlzb19ib290X2luZm87CisKK3VpbnQ4X3QgREhDUE1hZ2ljOwordWludDMyX3QgUmVib290VGltZTsKKwordm9pZCBweGVudih2b2lkKQoreworfQorCit1aW50MTZfdCBCSU9TX2ZibSA9IDE7CitmYXJfcHRyX3QgSW5pdFN0YWNrOworZmFyX3B0cl90IFBYRUVudHJ5OworCit2b2lkIGdweGVfdW5sb2FkKHZvaWQpCit7Cit9CisKK3ZvaWQgZG9faWRsZSh2b2lkKQoreworfQorCit2b2lkIHB4ZV9pbnQxYSh2b2lkKQoreworfQorCit1aW50OF90IEtlZXBQWEU7CisKK3N0cnVjdCBzZW1hcGhvcmU7Cittc3RpbWVfdCBzZW1fZG93bihzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sIG1zdGltZV90IHRpbWUpCit7CisJLyogRUZJIGlzIHNpbmdsZSB0aHJlYWRlZCAqLworCXJldHVybiAwOworfQorCit2b2lkIHNlbV91cChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCit7CisJLyogRUZJIGlzIHNpbmdsZSB0aHJlYWRlZCAqLworfQorCitfX2V4cG9ydCB2b2xhdGlsZSB1aW50MzJfdCBfX21zX3RpbWVyID0gMDsKK3ZvbGF0aWxlIHVpbnQzMl90IF9famlmZmllcyA9IDA7CisKK3ZvaWQgZWZpX3dyaXRlX2NoYXIodWludDhfdCBjaCwgdWludDhfdCBhdHRyaWJ1dGUpCit7CisJU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAqb3V0ID0gU1QtPkNvbk91dDsKKwl1aW50MTZfdCBjWzJdOworCisJdWVmaV9jYWxsX3dyYXBwZXIob3V0LT5TZXRBdHRyaWJ1dGUsIDIsIG91dCwgYXR0cmlidXRlKTsKKworCS8qIExvb2t1cCBwcmltYXJ5IFVuaWNvZGUgZW5jb2RpbmcgaW4gdGhlIHN5c3RlbSBjb2RlcGFnZSAqLworCWNbMF0gPSBjb2RlcGFnZS51bmlbMF1bY2hdOworCWNbMV0gPSAnXDAnOworCisJdWVmaV9jYWxsX3dyYXBwZXIob3V0LT5PdXRwdXRTdHJpbmcsIDIsIG91dCwgYyk7Cit9CisKK3N0YXRpYyB2b2lkIGVmaV9zaG93Y3Vyc29yKGNvbnN0IHN0cnVjdCB0ZXJtX3N0YXRlICpzdCkKK3sKKwlTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICpvdXQgPSBTVC0+Q29uT3V0OworCWJvb2wgY3Vyc29yID0gc3QtPmN1cnNvciA/IHRydWUgOiBmYWxzZTsKKworCXVlZmlfY2FsbF93cmFwcGVyKG91dC0+RW5hYmxlQ3Vyc29yLCAyLCBvdXQsIGN1cnNvcik7Cit9CisKK3N0YXRpYyB2b2lkIGVmaV9zZXRfY3Vyc29yKGludCB4LCBpbnQgeSwgYm9vbCB2aXNpYmxlKQoreworCVNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgKm91dCA9IFNULT5Db25PdXQ7CisKKwl1ZWZpX2NhbGxfd3JhcHBlcihvdXQtPlNldEN1cnNvclBvc2l0aW9uLCAzLCBvdXQsIHgsIHkpOworfQorCitzdGF0aWMgdm9pZCBlZmlfc2Nyb2xsX3VwKHVpbnQ4X3QgY29scywgdWludDhfdCByb3dzLCB1aW50OF90IGF0dHJpYnV0ZSkKK3sKKwllZmlfd3JpdGVfY2hhcignXG4nLCAwKTsKKwllZmlfd3JpdGVfY2hhcignXHInLCAwKTsKK30KKworc3RhdGljIHZvaWQgZWZpX2dldF9tb2RlKGludCAqY29scywgaW50ICpyb3dzKQoreworCVNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgKm91dCA9IFNULT5Db25PdXQ7CisJVUlOVE4gYywgcjsKKworCXVlZmlfY2FsbF93cmFwcGVyKG91dC0+UXVlcnlNb2RlLCA0LCBvdXQsIG91dC0+TW9kZS0+TW9kZSwgJmMsICZyKTsKKwkqcm93cyA9IHI7CisJKmNvbHMgPSBjOworfQorCitzdGF0aWMgdm9pZCBlZmlfZXJhc2UoaW50IHgwLCBpbnQgeTAsIGludCB4MSwgaW50IHkxLCB1aW50OF90IGF0dHJpYnV0ZSkKK3sKKwlTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICpvdXQgPSBTVC0+Q29uT3V0OworCWludCBjb2xzLCByb3dzOworCisJZWZpX2dldF9tb2RlKCZjb2xzLCAmcm93cyk7CisKKwkvKgorCSAqIFRoZSBCSU9TIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBoYXMgdGhlIGFiaWxpdHkgdG8gZXJhc2UKKwkgKiBwYXJ0cyBvciBhbGwgb2YgdGhlIHNjcmVlbiAtIHRoZSBVRUZJIGNvbnNvbGUgZG9lc24ndAorCSAqIHN1cHBvcnQgdGhpcyBzbyB3ZSBqdXN0IHNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHVubGVzcworCSAqIHdlJ3JlIGNsZWFyaW5nIHRoZSB3aG9sZSBzY3JlZW4uCisJICovCisJaWYgKCF4MCAmJiB5MCA9PSAoY29scyAtIDEpKSB7CisJCS8qIFJlYWxseSBjbGVhciB0aGUgc2NyZWVuICovCisJCXVlZmlfY2FsbF93cmFwcGVyKG91dC0+Q2xlYXJTY3JlZW4sIDEsIG91dCk7CisJfSBlbHNlIHsKKwkJdWVmaV9jYWxsX3dyYXBwZXIob3V0LT5TZXRDdXJzb3JQb3NpdGlvbiwgMywgb3V0LCB5MSwgeDEpOworCX0KK30KKworc3RhdGljIHZvaWQgZWZpX3RleHRfbW9kZSh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBlZmlfZ2V0X2N1cnNvcih1aW50OF90ICp4LCB1aW50OF90ICp5KQoreworCVNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgKm91dCA9IFNULT5Db25PdXQ7CisJKnggPSBvdXQtPk1vZGUtPkN1cnNvckNvbHVtbjsKKwkqeSA9IG91dC0+TW9kZS0+Q3Vyc29yUm93OworfQorCitzdHJ1Y3Qgb3V0cHV0X29wcyBlZmlfb3BzID0geworCS5lcmFzZSA9IGVmaV9lcmFzZSwKKwkud3JpdGVfY2hhciA9IGVmaV93cml0ZV9jaGFyLAorCS5zaG93Y3Vyc29yID0gZWZpX3Nob3djdXJzb3IsCisJLnNldF9jdXJzb3IgPSBlZmlfc2V0X2N1cnNvciwKKwkuc2Nyb2xsX3VwID0gZWZpX3Njcm9sbF91cCwKKwkuZ2V0X21vZGUgPSBlZmlfZ2V0X21vZGUsCisJLnRleHRfbW9kZSA9IGVmaV90ZXh0X21vZGUsCisJLmdldF9jdXJzb3IgPSBlZmlfZ2V0X2N1cnNvciwKK307CisKK2NoYXIgU3Vidm9sTmFtZVsyXTsKK3N0YXRpYyBpbmxpbmUgRUZJX01FTU9SWV9ERVNDUklQVE9SICoKK2dldF9tZW1vcnlfbWFwKFVJTlROICpucl9lbnRyaWVzLCBVSU5UTiAqa2V5LCBVSU5UTiAqZGVzY19zeiwKKwkgICAgICAgdWludDMyX3QgKmRlc2NfdmVyKQoreworCXJldHVybiBMaWJNZW1vcnlNYXAobnJfZW50cmllcywga2V5LCBkZXNjX3N6LCBkZXNjX3Zlcik7Cit9CisKKworaW50IGVmaV9zY2FuX21lbW9yeShzY2FuX21lbW9yeV9jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICpkYXRhKQoreworCVVJTlROIGksIG5yX2VudHJpZXMsIGtleSwgZGVzY19zejsKKwlVSU5UTiBidWYsIGJ1ZnBvczsKKwlVSU5UMzIgZGVzY192ZXI7CisJaW50IHJ2ID0gMDsKKworCWJ1ZiA9IChVSU5UTilnZXRfbWVtb3J5X21hcCgmbnJfZW50cmllcywgJmtleSwgJmRlc2Nfc3osICZkZXNjX3Zlcik7CisJaWYgKCFidWYpCisJCXJldHVybiAtMTsKKwlidWZwb3MgPSBidWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZW50cmllczsgYnVmcG9zICs9IGRlc2Nfc3osIGkrKykgeworCQlFRklfTUVNT1JZX0RFU0NSSVBUT1IgKm07CisJCVVJTlQ2NCByZWdpb25fc3o7CisJCWVudW0gc3lzbGludXhfbWVtbWFwX3R5cGVzIHR5cGU7CisKKwkJbSA9IChFRklfTUVNT1JZX0RFU0NSSVBUT1IgKilidWZwb3M7CisJCXJlZ2lvbl9zeiA9IG0tPk51bWJlck9mUGFnZXMgKiBFRklfUEFHRV9TSVpFOworCisJCXN3aXRjaCAobS0+VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRWZpQ29udmVudGlvbmFsTWVtb3J5OgorCQkJdHlwZSA9IFNNVF9GUkVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0eXBlID0gU01UX1JFU0VSVkVEOworCQkJYnJlYWs7CisJCX0KKworCQlydiA9IGNhbGxiYWNrKGRhdGEsIG0tPlBoeXNpY2FsU3RhcnQsIHJlZ2lvbl9zeiwgdHlwZSk7CisJCWlmIChydikKKwkJCWJyZWFrOworCX0KKworCUZyZWVQb29sKCh2b2lkICopYnVmKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzbGludXhfbWVtc2NhbiBlZmlfbWVtc2NhbiA9IHsKKyAgICAuZnVuYyA9IGVmaV9zY2FuX21lbW9yeSwKK307CisKK2V4dGVybiB1aW50MTZfdCAqYmlvc19mcmVlX21lbTsKK3ZvaWQgZWZpX2luaXQodm9pZCkKK3sKKwkvKiBYWFggdGltZXIgKi8KKwkqYmlvc19mcmVlX21lbSA9IDA7CisJc3lzbGludXhfbWVtc2Nhbl9hZGQoJmVmaV9tZW1zY2FuKTsKKwltZW1faW5pdCgpOworfQorCitjaGFyIGVmaV9nZXRjaGFyKGNoYXIgKmhpKQoreworCVNJTVBMRV9JTlBVVF9JTlRFUkZBQ0UgKmluID0gU1QtPkNvbkluOworCUVGSV9JTlBVVF9LRVkga2V5OworCUVGSV9TVEFUVVMgc3RhdHVzOworCisJZG8geworCQlzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihpbi0+UmVhZEtleVN0cm9rZSwgMiwgaW4sICZrZXkpOworCX0gd2hpbGUgKHN0YXR1cyA9PSBFRklfTk9UX1JFQURZKTsKKworCWlmICgha2V5LlNjYW5Db2RlKQorCQlyZXR1cm4gKGNoYXIpa2V5LlVuaWNvZGVDaGFyOworCisJLyoKKwkgKiBXZSBjdXJyZW50bHkgb25seSBoYW5kbGUgc2NhbiBjb2RlcyB0aGF0IGZpdCBpbiA4IGJpdHMuCisJICovCisJKmhpID0gKGNoYXIpa2V5LlNjYW5Db2RlOworCXJldHVybiAwOworfQorCitpbnQgZWZpX3BvbGxjaGFyKHZvaWQpCit7CisJU0lNUExFX0lOUFVUX0lOVEVSRkFDRSAqaW4gPSBTVC0+Q29uSW47CisJRUZJX1NUQVRVUyBzdGF0dXM7CisKKwlzdGF0dXMgPSBXYWl0Rm9yU2luZ2xlRXZlbnQoaW4tPldhaXRGb3JLZXksIDEpOworCXJldHVybiBzdGF0dXMgIT0gRUZJX1RJTUVPVVQ7Cit9CisKK3N0cnVjdCBpbnB1dF9vcHMgZWZpX2lvcHMgPSB7CisJLmdldGNoYXIgPSBlZmlfZ2V0Y2hhciwKKwkucG9sbGNoYXIgPSBlZmlfcG9sbGNoYXIsCit9OworCitleHRlcm4gdm9pZCBlZmlfYWR2X2luaXQodm9pZCk7CitleHRlcm4gaW50IGVmaV9hZHZfd3JpdGUodm9pZCk7CisKK3N0cnVjdCBhZHZfb3BzIGVmaV9hZHZfb3BzID0geworCS5pbml0ID0gZWZpX2Fkdl9pbml0LAorCS53cml0ZSA9IGVmaV9hZHZfd3JpdGUsCit9OworCitzdHJ1Y3QgZWZpX2luZm8geworCXVpbnQzMl90IGxvYWRfc2lnbmF0dXJlOworCXVpbnQzMl90IHN5c3RhYjsKKwl1aW50MzJfdCBkZXNjX3NpemU7CisJdWludDMyX3QgZGVzY192ZXJzaW9uOworCXVpbnQzMl90IG1lbW1hcDsKKwl1aW50MzJfdCBtZW1tYXBfc2l6ZTsKKwl1aW50MzJfdCBzeXN0YWJfaGk7CisJdWludDMyX3QgbWVtbWFwX2hpOworfTsKKworI2RlZmluZSBFODIwTUFYCTEyOAorI2RlZmluZSBFODIwX1JBTQkxCisjZGVmaW5lIEU4MjBfUkVTRVJWRUQJMgorI2RlZmluZSBFODIwX0FDUEkJMworI2RlZmluZSBFODIwX05WUwk0CisjZGVmaW5lIEU4MjBfVU5VU0FCTEUJNQorCisjZGVmaW5lIEJPT1RfU0lHTkFUVVJFCTB4YWE1NQorI2RlZmluZSBTWVNMSU5VWF9FRklMRFIJMHgzMAkvKiBJcyB0aGlzIHB1Ymxpc2hlZCB2YWx1ZT8gKi8KKyNkZWZpbmUgREVGQVVMVF9USU1FUl9USUNLX0RVUkFUSU9OIAk1MDAwMDAgLyogNTAwMDAwID09IDUwMDAwMCAqIDEwMCAqIDEwXi05ID09IDUwIG1zZWMgKi8KKyNkZWZpbmUgREVGQVVMVF9NU1RJTUVSX0lOQwkJMHgzMgkvKiA1MCBtc2VjICovCitzdHJ1Y3QgZTgyMF9lbnRyeSB7CisJdWludDY0X3Qgc3RhcnQ7CisJdWludDY0X3QgbGVuOworCXVpbnQzMl90IHR5cGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYm9vdF9wYXJhbXMgeworCXN0cnVjdCBzY3JlZW5faW5mbyBzY3JlZW5faW5mbzsKKwl1aW50OF90IF9wYWRbMHgxYzAgLSBzaXplb2Yoc3RydWN0IHNjcmVlbl9pbmZvKV07CisJc3RydWN0IGVmaV9pbmZvIGVmaTsKKwl1aW50OF90IF9wYWQyWzhdOworCXVpbnQ4X3QgZTgyMF9lbnRyaWVzOworCXVpbnQ4X3QgX3BhZDNbMHgyZDAgLSAweDFlOCAtIHNpemVvZih1aW50OF90KV07CisJc3RydWN0IGU4MjBfZW50cnkgZTgyMF9tYXBbRTgyME1BWF07Cit9IF9fcGFja2VkOworCisvKiBBbGxvY2F0ZSBib290IHBhcmFtZXRlciBibG9jayBhbGlnbmVkIHRvIHBhZ2UgKi8KKyNkZWZpbmUgQk9PVF9QQVJBTV9CTEtTSVpFCUVGSV9TSVpFX1RPX1BBR0VTKHNpemVvZihzdHJ1Y3QgYm9vdF9wYXJhbXMpKSAqIEVGSV9QQUdFX1NJWkUKKworLyogUm91dGluZXMgaW4gc3VwcG9ydCBvZiBlZmkgYm9vdCBsb2FkZXIgd2VyZSBvYnRhaW5lZCBmcm9tCisgKiBodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9Ym9vdC9lZmlsaW51eC9lZmlsaW51eC5naXQ6CisgKiBrZXJuZWxfanVtcCgpLCBoYW5kb3Zlcl9qdW1wKCksCisgKiBlbWFsbG9jKCkvZWZyZWUsIGFsbG9jX3BhZ2VzL2ZyZWVfcGFnZXMKKyAqIGFsbG9jYXRlX3Bvb2woKS9mcmVlX3Bvb2woKQorICogbWVtb3J5X21hcCgpCisgKi8gCitleHRlcm4gdm9pZCBrZXJuZWxfanVtcChFRklfUEhZU0lDQUxfQUREUkVTUyBrZXJuZWxfc3RhcnQsCisJCQkgICAgICAgc3RydWN0IGJvb3RfcGFyYW1zICpib290X3BhcmFtcyk7CisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKyNkZWZpbmUgRUZJX0xPQURfU0lHCSJFTDMyIgorI2VsaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDgKKyNkZWZpbmUgRUZJX0xPQURfU0lHCSJFTDY0IgorI2Vsc2UKKyNlcnJvciAidW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIgorI2VuZGlmCisKK3N0cnVjdCBkdF9kZXNjIHsKKwl1aW50MTZfdCBsaW1pdDsKKwl1aW50NjRfdCAqYmFzZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBkdF9kZXNjIGdkdCA9IHsgMHg4MDAsICh1aW50NjRfdCAqKTAgfTsKK3N0cnVjdCBkdF9kZXNjIGlkdCA9IHsgMCwgMCB9OworCitzdGF0aWMgaW5saW5lIEVGSV9NRU1PUllfREVTQ1JJUFRPUiAqCitnZXRfbWVtX2Rlc2ModW5zaWduZWQgbG9uZyBtZW1tYXAsIFVJTlROIGRlc2Nfc3osIGludCBpKQoreworCXJldHVybiAoRUZJX01FTU9SWV9ERVNDUklQVE9SICopKG1lbW1hcCArIChpICogZGVzY19zeikpOworfQorCitFRklfSEFORExFIGltYWdlX2hhbmRsZTsKKworc3RhdGljIGlubGluZSBVSU5UNjQgcm91bmRfdXAoVUlOVDY0IHgsIFVJTlQ2NCB5KQoreworCXJldHVybiAoKCh4IC0gMSkgfCAoeSAtIDEpKSArIDEpOworfQorCitzdGF0aWMgaW5saW5lIFVJTlQ2NCByb3VuZF9kb3duKFVJTlQ2NCB4LCBVSU5UNjQgeSkKK3sKKwlyZXR1cm4gKHggJiB+KHkgLSAxKSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfYWRkcihFRklfUEhZU0lDQUxfQUREUkVTUyAqZmlyc3QsCisJCSAgICAgIEVGSV9QSFlTSUNBTF9BRERSRVNTICpsYXN0LAorCQkgICAgICBFRklfUEhZU0lDQUxfQUREUkVTUyBtaW4sCisJCSAgICAgIEVGSV9QSFlTSUNBTF9BRERSRVNTIG1heCwKKwkJICAgICAgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbikKK3sKKwlFRklfTUVNT1JZX0RFU0NSSVBUT1IgKm1hcDsKKwlVSU5UMzIgZGVzY192ZXI7CisJVUlOVE4gaSwgbnJfZW50cmllcywga2V5LCBkZXNjX3N6OworCisJbWFwID0gZ2V0X21lbW9yeV9tYXAoJm5yX2VudHJpZXMsICZrZXksICZkZXNjX3N6LCAmZGVzY192ZXIpOworCWlmICghbWFwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZW50cmllczsgaSsrKSB7CisJCUVGSV9NRU1PUllfREVTQ1JJUFRPUiAqbTsKKwkJRUZJX1BIWVNJQ0FMX0FERFJFU1MgYmVzdDsKKwkJVUlOVDY0IHN0YXJ0LCBlbmQ7CisKKwkJbSA9IGdldF9tZW1fZGVzYygodW5zaWduZWQgbG9uZyltYXAsIGRlc2Nfc3osIGkpOworCQlpZiAobS0+VHlwZSAhPSBFZmlDb252ZW50aW9uYWxNZW1vcnkpCisJCQljb250aW51ZTsKKworCQlpZiAobS0+TnVtYmVyT2ZQYWdlcyA8IEVGSV9TSVpFX1RPX1BBR0VTKHNpemUpKQorCQkJY29udGludWU7CisKKwkJc3RhcnQgPSBtLT5QaHlzaWNhbFN0YXJ0OworCQllbmQgPSBtLT5QaHlzaWNhbFN0YXJ0ICsgKG0tPk51bWJlck9mUGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpOworCQlpZiAoZmlyc3QpIHsKKwkJCWlmIChlbmQgPCBtaW4pCisJCQkJY29udGludWU7CisKKwkJCS8qIFdoYXQncyB0aGUgYmVzdCBhZGRyZXNzPyAqLworCQkJaWYgKHN0YXJ0IDwgbWluICYmIG1pbiA8IGVuZCkKKwkJCQliZXN0ID0gbWluOworCQkJZWxzZQorCQkJCWJlc3QgPSBtLT5QaHlzaWNhbFN0YXJ0OworCisJCQlzdGFydCA9IHJvdW5kX3VwKGJlc3QsIGFsaWduKTsKKwkJCWlmIChzdGFydCA+IG1heCkKKwkJCQljb250aW51ZTsKKworCQkJLyogSGF2ZSB3ZSBydW4gb3V0IG9mIHNwYWNlIGluIHRoaXMgcmVnaW9uPyAqLworCQkJaWYgKGVuZCA8IHN0YXJ0IHx8IChzdGFydCArIHNpemUpID4gZW5kKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3RhcnQgPCAqZmlyc3QpCisJCQkJKmZpcnN0ID0gc3RhcnQ7CisJCX0KKworCQlpZiAobGFzdCkgeworCQkJaWYgKHN0YXJ0ID4gbWF4KQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBXaGF0J3MgdGhlIGJlc3QgYWRkcmVzcz8gKi8KKwkJCWlmIChzdGFydCA8IG1heCAmJiBtYXggPCBlbmQpCisJCQkJYmVzdCA9IG1heCAtIHNpemU7CisJCQllbHNlCisJCQkJYmVzdCA9IGVuZCAtIHNpemU7CisKKwkJCXN0YXJ0ID0gcm91bmRfZG93bihiZXN0LCBhbGlnbik7CisJCQlpZiAoc3RhcnQgPCBtaW4gfHwgc3RhcnQgPCBtLT5QaHlzaWNhbFN0YXJ0KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3RhcnQgPiAqbGFzdCkKKwkJCQkqbGFzdCA9IHN0YXJ0OworCQl9CisJfQorCisJRnJlZVBvb2wobWFwKTsKK30KKworLyoqCisgKiBhbGxvY2F0ZV9wYWdlcyAtIEFsbG9jYXRlIG1lbW9yeSBwYWdlcyBmcm9tIHRoZSBzeXN0ZW0KKyAqIEBhdHlwZTogdHlwZSBvZiBhbGxvY2F0aW9uIHRvIHBlcmZvcm0KKyAqIEBtdHlwZTogdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUKKyAqIEBudW1fcGFnZXM6IG51bWJlciBvZiBjb250aWd1b3VzIDRLQiBwYWdlcyB0byBhbGxvY2F0ZQorICogQG1lbW9yeTogdXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIHBhZ2VzCisgKgorICogQWxsb2NhdGUgQG51bV9wYWdlcyBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgcGFnZXMgZnJvbSB0aGUgc3lzdGVtCisgKiBtZW1vcnkgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJhc2Ugb2YgdGhlIGFsbG9jYXRpb24gaW4KKyAqIEBtZW1vcnkgaWYgdGhlIGFsbG9jYXRpb24gc3VjY2VlZHMuIE9uIHN1Y2Nlc3MsIHRoZSBmaXJtd2FyZSBtZW1vcnkKKyAqIG1hcCBpcyB1cGRhdGVkIGFjY29yZGluZ2x5LgorICoKKyAqIElmIEBhdHlwZSBpcyBBbGxvY2F0ZUFkZHJlc3MgdGhlbiwgb24gaW5wdXQsIEBtZW1vcnkgc3BlY2lmaWVzIHRoZQorICogYWRkcmVzcyBhdCB3aGljaCB0byBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgcGFnZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgRUZJX1NUQVRVUworYWxsb2NhdGVfcGFnZXMoRUZJX0FMTE9DQVRFX1RZUEUgYXR5cGUsIEVGSV9NRU1PUllfVFlQRSBtdHlwZSwKKwkgICAgICAgVUlOVE4gbnVtX3BhZ2VzLCBFRklfUEhZU0lDQUxfQUREUkVTUyAqbWVtb3J5KQoreworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+QWxsb2NhdGVQYWdlcywgNCwgYXR5cGUsCisJCQkJIG10eXBlLCBudW1fcGFnZXMsIG1lbW9yeSk7Cit9CisvKioKKyAqIGZyZWVfcGFnZXMgLSBSZXR1cm4gbWVtb3J5IGFsbG9jYXRlZCBieSBhbGxvY2F0ZV9wYWdlcygpIHRvIHRoZSBmaXJtd2FyZQorICogQG1lbW9yeTogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBwYWdlIHJhbmdlIHRvIGJlIGZyZWVkCisgKiBAbnVtX3BhZ2VzOiBudW1iZXIgb2YgY29udGlndW91cyA0S0IgcGFnZXMgdG8gZnJlZQorICoKKyAqIE9uIHN1Y2Nlc3MsIHRoZSBmaXJtd2FyZSBtZW1vcnkgbWFwIGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgRUZJX1NUQVRVUworZnJlZV9wYWdlcyhFRklfUEhZU0lDQUxfQUREUkVTUyBtZW1vcnksIFVJTlROIG51bV9wYWdlcykKK3sKKwlyZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkZyZWVQYWdlcywgMiwgbWVtb3J5LCBudW1fcGFnZXMpOworfQorCitzdGF0aWMgRUZJX1NUQVRVUyBhbGxvY2F0ZV9hZGRyKEVGSV9QSFlTSUNBTF9BRERSRVNTICphZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlVSU5UTiBucGFnZXMgPSBFRklfU0laRV9UT19QQUdFUyhzaXplKTsKKworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+QWxsb2NhdGVQYWdlcywgNCwKKwkJCQkgICBBbGxvY2F0ZUFkZHJlc3MsCisJCQkJICAgRWZpTG9hZGVyRGF0YSwgbnBhZ2VzLAorCQkJCSAgIGFkZHIpOworfQorLyoqCisgKiBhbGxvY2F0ZV9wb29sIC0gQWxsb2NhdGUgcG9vbCBtZW1vcnkKKyAqIEB0eXBlOiB0aGUgdHlwZSBvZiBwb29sIHRvIGFsbG9jYXRlCisgKiBAc2l6ZTogbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGZyb20gcG9vbCBvZiBAdHlwZQorICogQGJ1ZmZlcjogdXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeQorICoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHBvb2wgb2YgQHR5cGUuIElmIHRoZSBwb29sIG5lZWRzIG1vcmUgbWVtb3J5CisgKiBwYWdlcyBhcmUgYWxsb2NhdGVkIGZyb20gRWZpQ29udmVudGlvbmFsTWVtb3J5IGluIG9yZGVyIHRvIGdyb3cgdGhlCisgKiBwb29sLgorICoKKyAqIEFsbCBhbGxvY2F0aW9ucyBhcmUgZWlnaHQtYnl0ZSBhbGlnbmVkLgorICovCitzdGF0aWMgaW5saW5lIEVGSV9TVEFUVVMKK2FsbG9jYXRlX3Bvb2woRUZJX01FTU9SWV9UWVBFIHR5cGUsIFVJTlROIHNpemUsIHZvaWQgKipidWZmZXIpCit7CisJcmV0dXJuIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5BbGxvY2F0ZVBvb2wsIDMsIHR5cGUsIHNpemUsIGJ1ZmZlcik7Cit9CisKKy8qKgorICogZnJlZV9wb29sIC0gUmV0dXJuIHBvb2wgbWVtb3J5IHRvIHRoZSBzeXN0ZW0KKyAqIEBidWZmZXI6IHRoZSBidWZmZXIgdG8gZnJlZQorICoKKyAqIFJldHVybiBAYnVmZmVyIHRvIHRoZSBzeXN0ZW0uIFRoZSByZXR1cm5lZCBtZW1vcnkgaXMgbWFya2VkIGFzCisgKiBFZmlDb252ZW50aW9uYWxNZW1vcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgRUZJX1NUQVRVUyBmcmVlX3Bvb2wodm9pZCAqYnVmZmVyKQoreworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+RnJlZVBvb2wsIDEsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYWRkcihFRklfUEhZU0lDQUxfQUREUkVTUyBhZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlVSU5UTiBucGFnZXMgPSBFRklfU0laRV9UT19QQUdFUyhzaXplKTsKKworCXVlZmlfY2FsbF93cmFwcGVyKEJTLT5GcmVlUGFnZXMsIDIsIGFkZHIsIG5wYWdlcyk7Cit9CisKKy8qIGNhbmNlbCB0aGUgZXN0YWJsaXNoZWQgdGltZXIgKi8KK3N0YXRpYyBFRklfU1RBVFVTIGNhbmNlbF90aW1lcihFRklfRVZFTlQgZXYpCit7CisJcmV0dXJuIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5TZXRUaW1lciwgMywgZXYsIFRpbWVyQ2FuY2VsLCAwKTsKK30KKworLyogQ2hlY2sgaWYgdGltZXIgd2VudCBvZmYgYW5kIHVwZGF0ZSBkZWZhdWx0IHRpbWVyIGNvdW50ZXIgKi8KK3ZvaWQgdGltZXJfaGFuZGxlcihFRklfRVZFTlQgZXYsIFZPSUQgKmN0eCkKK3sKKwlfX21zX3RpbWVyICs9IERFRkFVTFRfTVNUSU1FUl9JTkM7CisJKytfX2ppZmZpZXM7Cit9CisKKy8qIFNldHVwIGEgZGVmYXVsdCBwZXJpb2RpYyB0aW1lciAqLworc3RhdGljIEVGSV9TVEFUVVMgc2V0dXBfZGVmYXVsdF90aW1lcihFRklfRVZFTlQgKmV2KQoreworCUVGSV9TVEFUVVMgZWZpX3N0YXR1czsKKworCSpldiA9IE5VTEw7CisJZWZpX3N0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKCBCUy0+Q3JlYXRlRXZlbnQsIDUsIEVWVF9USU1FUnxFVlRfTk9USUZZX1NJR05BTCwgVFBMX05PVElGWSwgKEVGSV9FVkVOVF9OT1RJRlkpdGltZXJfaGFuZGxlciwgTlVMTCwgZXYpOworCWlmIChlZmlfc3RhdHVzID09IEVGSV9TVUNDRVNTKSB7CisJCWVmaV9zdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+U2V0VGltZXIsIDMsICpldiwgVGltZXJQZXJpb2RpYywgREVGQVVMVF9USU1FUl9USUNLX0RVUkFUSU9OKTsKKwl9CisJcmV0dXJuIGVmaV9zdGF0dXM7Cit9CisKKy8qKgorICogZW1hbGxvYyAtIEFsbG9jYXRlIG1lbW9yeSB3aXRoIGEgc3RyaWN0IGFsaWdubWVudCByZXF1aXJlbWVudAorICogQHNpemU6IHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uCisgKiBAYWxpZ246IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgb2YgdGhlIGFsbG9jYXRpb24KKyAqIEBhZGRyOiBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBhZGRyZXNzIG9uIHN1Y2Nlc3MKKyAqCisgKiBJZiB3ZSBjYW5ub3Qgc2F0aXNmeSBAYWxpZ24gd2UgcmV0dXJuIDAuCisgKi8KK0VGSV9TVEFUVVMgZW1hbGxvYyhVSU5UTiBzaXplLCBVSU5UTiBhbGlnbiwgRUZJX1BIWVNJQ0FMX0FERFJFU1MgKmFkZHIpCit7CisJVUlOVE4gaSwgbnJfZW50cmllcywgbWFwX2tleSwgZGVzY19zaXplOworCUVGSV9NRU1PUllfREVTQ1JJUFRPUiAqbWFwX2J1ZjsKKwlVSU5UTiBkOworCVVJTlQzMiBkZXNjX3ZlcnNpb247CisJRUZJX1NUQVRVUyBlcnI7CisJVUlOVE4gbnJfcGFnZXMgPSBFRklfU0laRV9UT19QQUdFUyhzaXplKTsKKworCW1hcF9idWYgPSBnZXRfbWVtb3J5X21hcCgmbnJfZW50cmllcywgJm1hcF9rZXksCisJCQkJICZkZXNjX3NpemUsICZkZXNjX3ZlcnNpb24pOworCWlmICghbWFwX2J1ZikKKwkJZ290byBmYWlsOworCisJZCA9IChVSU5UTiltYXBfYnVmOworCisJZm9yIChpID0gMDsgaSA8IG5yX2VudHJpZXM7IGkrKywgZCArPSBkZXNjX3NpemUpIHsKKwkJRUZJX01FTU9SWV9ERVNDUklQVE9SICpkZXNjOworCQlFRklfUEhZU0lDQUxfQUREUkVTUyBzdGFydCwgZW5kLCBhbGlnbmVkOworCisJCWRlc2MgPSAoRUZJX01FTU9SWV9ERVNDUklQVE9SICopZDsKKwkJaWYgKGRlc2MtPlR5cGUgIT0gRWZpQ29udmVudGlvbmFsTWVtb3J5KQorCQkJY29udGludWU7CisKKwkJaWYgKGRlc2MtPk51bWJlck9mUGFnZXMgPCBucl9wYWdlcykKKwkJCWNvbnRpbnVlOworCisJCXN0YXJ0ID0gZGVzYy0+UGh5c2ljYWxTdGFydDsKKwkJZW5kID0gc3RhcnQgKyAoZGVzYy0+TnVtYmVyT2ZQYWdlcyA8PCBFRklfUEFHRV9TSElGVCk7CisKKwkJLyogTG93LW1lbW9yeSBpcyBzdXBlci1wcmVjaW91cyEgKi8KKwkJaWYgKGVuZCA8PSAxIDw8IDIwKQorCQkJY29udGludWU7CisJCWlmIChzdGFydCA8IDEgPDwgMjApCisJCQlzdGFydCA9ICgxIDw8IDIwKTsKKworCQlhbGlnbmVkID0gKHN0YXJ0ICsgYWxpZ24gLTEpICYgfihhbGlnbiAtMSk7CisKKwkJaWYgKChhbGlnbmVkICsgc2l6ZSkgPD0gZW5kKSB7CisJCQllcnIgPSBhbGxvY2F0ZV9wYWdlcyhBbGxvY2F0ZUFkZHJlc3MsIEVmaUxvYWRlckRhdGEsCisJCQkJCSAgICAgbnJfcGFnZXMsICZhbGlnbmVkKTsKKwkJCWlmIChlcnIgPT0gRUZJX1NVQ0NFU1MpIHsKKwkJCQkqYWRkciA9IGFsaWduZWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaSA9PSBucl9lbnRyaWVzKQorCQllcnIgPSBFRklfT1VUX09GX1JFU09VUkNFUzsKKworCWZyZWVfcG9vbChtYXBfYnVmKTsKK2ZhaWw6CisJcmV0dXJuIGVycjsKK30KKy8qKgorICogZWZyZWUgLSBSZXR1cm4gbWVtb3J5IGFsbG9jYXRlZCB3aXRoIGVtYWxsb2MKKyAqIEBtZW1vcnk6IHRoZSBhZGRyZXNzIG9mIHRoZSBlbWFsbG9jKCkgYWxsb2NhdGlvbgorICogQHNpemU6IHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uCisgKi8KK3ZvaWQgZWZyZWUoRUZJX1BIWVNJQ0FMX0FERFJFU1MgbWVtb3J5LCBVSU5UTiBzaXplKQoreworCVVJTlROIG5yX3BhZ2VzID0gRUZJX1NJWkVfVE9fUEFHRVMoc2l6ZSk7CisKKwlmcmVlX3BhZ2VzKG1lbW9yeSwgbnJfcGFnZXMpOworfQorCisvKgorICogQ2hlY2sgd2hldGhlciAnYnVmJyBjb250YWlucyBhIFBFL0NPRkYgaGVhZGVyIGFuZCB0aGF0IHRoZSBQRS9DT0ZGCisgKiBmaWxlIGNhbiBiZSBleGVjdXRlZCBieSB0aGlzIGFyY2hpdGVjdHVyZS4KKyAqLworc3RhdGljIGJvb2wgdmFsaWRfcGVjb2ZmX2ltYWdlKGNoYXIgKmJ1ZikKK3sKKyAgICBzdHJ1Y3QgcGVfaGVhZGVyIHsKKwl1aW50MTZfdCBzaWduYXR1cmU7CisJdWludDhfdCBfcGFkWzB4M2FdOworCXVpbnQzMl90IG9mZnNldDsKKyAgICB9ICpwZWhkciA9IChzdHJ1Y3QgcGVfaGVhZGVyICopYnVmOworICAgIHN0cnVjdCBjb2ZmX2hlYWRlciB7CisJdWludDMyX3Qgc2lnbmF0dXJlOworCXVpbnQxNl90IG1hY2hpbmU7CisgICAgfSAqY2hkcjsKKworICAgIGlmIChwZWhkci0+c2lnbmF0dXJlICE9IDB4NWE0ZCkgeworCWRwcmludGYoIkludmFsaWQgTVMtRE9TIGhlYWRlciBzaWduYXR1cmVcbiIpOworCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIXBlaGRyLT5vZmZzZXQgfHwgcGVoZHItPm9mZnNldCA+IDUxMikgeworCWRwcmludGYoIkludmFsaWQgUEUgaGVhZGVyIG9mZnNldFxuIik7CisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNoZHIgPSAoc3RydWN0IGNvZmZfaGVhZGVyICopJmJ1ZltwZWhkci0+b2Zmc2V0XTsKKyAgICBpZiAoY2hkci0+c2lnbmF0dXJlICE9IDB4NDU1MCkgeworCWRwcmludGYoIkludmFsaWQgUEUgaGVhZGVyIHNpZ25hdHVyZVxuIik7CisJcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmIGRlZmluZWQoX194ODZfNjRfXykKKyAgICBpZiAoY2hkci0+bWFjaGluZSAhPSAweDg2NjQpIHsKKwlkcHJpbnRmKCJJbnZhbGlkIFBFIG1hY2hpbmUgZmllbGRcbiIpOworCXJldHVybiBmYWxzZTsKKyAgICB9CisjZWxzZQorICAgIGlmIChjaGRyLT5tYWNoaW5lICE9IDB4MTRjKSB7CisJZHByaW50ZigiSW52YWxpZCBQRSBtYWNoaW5lIGZpZWxkXG4iKTsKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIEJvb3QgYSBMaW51eCBrZXJuZWwgdXNpbmcgdGhlIEVGSSBib290IHN0dWIgaGFuZG92ZXIgcHJvdG9jb2wuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCByZXR1cm4gdG8gaXRzIGNhbGxlciBpZiBib290aW5nIHRoZSBrZXJuZWwKKyAqIGltYWdlIHN1Y2NlZWRzLiBJZiBib290aW5nIHRoZSBrZXJuZWwgaW1hZ2UgZmFpbHMsIGEgbGVnYWN5IGJvb3QKKyAqIG1ldGhvZCBzaG91bGQgYmUgYXR0ZW1wdGVkLgorICovCitzdGF0aWMgdm9pZCBoYW5kb3Zlcl9ib290KHN0cnVjdCBsaW51eF9oZWFkZXIgKmhkciwgc3RydWN0IGJvb3RfcGFyYW1zICpicCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBoZHItPmNvZGUzMl9zdGFydCArIGhkci0+aGFuZG92ZXJfb2Zmc2V0OworICAgIGhhbmRvdmVyX2Z1bmNfdCAqZnVuYyA9IGVmaV9oYW5kb3ZlcjsKKworICAgIGRwcmludGYoIkJvb3Rpbmcga2VybmVsIHVzaW5nIGhhbmRvdmVyIHByb3RvY29sXG4iKTsKKworICAgIC8qCisgICAgICogRW5zdXJlIHRoYXQgdGhlIGtlcm5lbCBpcyBhIHZhbGlkIFBFMzIoKykgZmlsZSBhbmQgdGhhdCB0aGUKKyAgICAgKiBhcmNoaXRlY3R1cmUgb2YgdGhlIGZpbGUgbWF0Y2hlcyB0aGlzIHZlcnNpb24gb2YgU3lzbGludXggLSB3ZQorICAgICAqIGNhbid0IG1peCBmaXJtd2FyZSBhbmQga2VybmVsIGJpdG5lc3MgKGUuZy4gMzItYml0IGtlcm5lbCBvbgorICAgICAqIDY0LWJpdCBFRkkgZmlybXdhcmUpIHVzaW5nIHRoZSBoYW5kb3ZlciBwcm90b2NvbC4KKyAgICAgKi8KKyAgICBpZiAoIXZhbGlkX3BlY29mZl9pbWFnZSgoY2hhciAqKWhkcikpCisJcmV0dXJuOworCisgICAgaWYgKGhkci0+dmVyc2lvbiA+PSAweDIwYykgeworCWlmIChoZHItPnhsb2FkZmxhZ3MgJiBYTEZfRUZJX0hBTkRPVkVSXzMyKQorCSAgICBmdW5jID0gZWZpX2hhbmRvdmVyXzMyOworCisJaWYgKGhkci0+eGxvYWRmbGFncyAmIFhMRl9FRklfSEFORE9WRVJfNjQpCisJICAgIGZ1bmMgPSBlZmlfaGFuZG92ZXJfNjQ7CisgICAgfQorCisgICAgZWZpX2NvbnNvbGVfcmVzdG9yZSgpOworICAgIGZ1bmMoaW1hZ2VfaGFuZGxlLCBTVCwgYnAsIGFkZHJlc3MpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2xpbnV4X2hlYWRlcihzdHJ1Y3QgbGludXhfaGVhZGVyICpoZHIpCit7CisJaWYgKGhkci0+dmVyc2lvbiA8IDB4MjA1KQorCQloZHItPnJlbG9jYXRhYmxlX2tlcm5lbCA9IDA7CisKKwkvKiBGSVhNRTogY2hlY2sgYm9vdCBzZWN0b3Igc2lnbmF0dXJlICovCisJaWYgKGhkci0+Ym9vdF9mbGFnICE9IEJPT1RfU0lHTkFUVVJFKSB7CisJCXByaW50ZigiSW52YWxpZCBCb290IHNpZ25hdHVyZSAweCV4LCBiYWlsaW5nIG91dFxuIiwgaGRyLT5ib290X2ZsYWcpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpidWlsZF9jbWRsaW5lKGNoYXIgKnN0cikKK3sKKwlFRklfUEhZU0lDQUxfQUREUkVTUyBhZGRyOworCUVGSV9TVEFUVVMgc3RhdHVzOworCWNoYXIgKmNtZGxpbmUgPSBOVUxMOyAvKiBpbnRlcm5hbCwgaW4gZWZpX3BoeXNpY2FsIGJlbG93IDB4M0ZGRkZGRkYgKi8KKworCS8qCisJICogVGhlIGtlcm5lbCBleHBlY3RzIGNtZGxpbmUgdG8gYmUgYWxsb2NhdGVkIHByZXR0eSBsb3csCisJICogRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQgc2F5cywKKwkgKgorCSAqCSJUaGUga2VybmVsIGNvbW1hbmQgbGluZSBjYW4gYmUgbG9jYXRlZCBhbnl3aGVyZQorCSAqCWJldHdlZW4gdGhlIGVuZCBvZiB0aGUgc2V0dXAgaGVhcCBhbmQgMHhBMDAwMCIKKwkgKi8KKwlhZGRyID0gMHhBMDAwMDsKKwlzdGF0dXMgPSBhbGxvY2F0ZV9wYWdlcyhBbGxvY2F0ZU1heEFkZHJlc3MsIEVmaUxvYWRlckRhdGEsCisJCQkgICAgIEVGSV9TSVpFX1RPX1BBR0VTKHN0cmxlbihzdHIpICsgMSksCisJCQkgICAgICZhZGRyKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Iga2VybmVsIGNvbW1hbmQgbGluZSwgYmFpbGluZyBvdXRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY21kbGluZSA9IChjaGFyICopKFVJTlROKWFkZHI7CisJbWVtY3B5KGNtZGxpbmUsIHN0ciwgc3RybGVuKHN0cikgKyAxKTsKKwlyZXR1cm4gY21kbGluZTsKK30KKworc3RhdGljIGludCBidWlsZF9nZHQodm9pZCkKK3sKKwlFRklfU1RBVFVTIHN0YXR1czsKKworCS8qIEFsbG9jYXRlIGdkdCBjb25zaXN0ZW50IHdpdGggdGhlIGFsaWdubWVudCBmb3IgYXJjaGl0ZWN0dXJlICovCisJc3RhdHVzID0gZW1hbGxvYyhnZHQubGltaXQsIF9fU0laRU9GX1BPSU5URVJfXyAsIChFRklfUEhZU0lDQUxfQUREUkVTUyAqKSZnZHQuYmFzZSk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlwcmludGYoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEdEVCwgYmFpbGluZyBvdXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChnZHQuYmFzZSwgMHgwLCBnZHQubGltaXQpOworCisJLyoKKyAgICAgICAgICogNEdiIC0gKDB4MTAwMDAwKjB4MTAwMCA9IDRHYikKKyAgICAgICAgICogYmFzZSBhZGRyZXNzPTAKKyAgICAgICAgICogY29kZSByZWFkL2V4ZWMKKyAgICAgICAgICogZ3JhbnVsYXJpdHk9NDA5NiwgMzg2ICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkKKyAgICAgICAgICovCisgICAgICAgIGdkdC5iYXNlWzJdID0gMHgwMGNmOWEwMDAwMDBmZmZmOworCisgICAgICAgIC8qCisgICAgICAgICAqIDRHYiAtICgweDEwMDAwMCoweDEwMDAgPSA0R2IpCisgICAgICAgICAqIGJhc2UgYWRkcmVzcz0wCisgICAgICAgICAqIGRhdGEgcmVhZC93cml0ZQorICAgICAgICAgKiBncmFudWxhcml0eT00MDk2LCAzODYgKCs1dGggbmliYmxlIG9mIGxpbWl0KQorICAgICAgICAgKi8KKyAgICAgICAgZ2R0LmJhc2VbM10gPSAweDAwY2Y5MjAwMDAwMGZmZmY7CisKKyAgICAgICAgLyogVGFzayBzZWdtZW50IHZhbHVlICovCisgICAgICAgIGdkdC5iYXNlWzRdID0gMHgwMDgwODkwMDAwMDAwMDAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZXJzIHVzZSAtPnJhbWRpc2tfc2l6ZSB0byBjaGVjayB3aGV0aGVyIGFueSBtZW1vcnkgd2FzCisgKiBhbGxvY2F0ZWQgKGFuZCB0aGVyZWZvcmUgbmVlZHMgZnJlZSdpbmcpLiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcworICogaGFyZCBlcnJvciBjb25kaXRpb25zLCBzdWNoIGFzIGZhaWxpbmcgdG8gYWxsb2MgbWVtb3J5IGZvciB0aGUKKyAqIHJhbWRpc2sgaW1hZ2UuIEhhdmluZyBubyBpbml0cmFtZnMgaXMgbm90IGFuIGVycm9yLgorICovCitzdGF0aWMgaW50IGhhbmRsZV9yYW1kaXNrcyhzdHJ1Y3QgbGludXhfaGVhZGVyICpoZHIsCisJCQkgICBzdHJ1Y3QgaW5pdHJhbWZzICppbml0cmFtZnMpCit7CisJRUZJX1BIWVNJQ0FMX0FERFJFU1MgbGFzdDsKKwlzdHJ1Y3QgaW5pdHJhbWZzICppcDsKKwlFRklfU1RBVFVTIHN0YXR1czsKKwlhZGRyX3QgaXJmX3NpemU7CisJYWRkcl90IG5leHRfYWRkciwgbGVuLCBwYWQ7CisKKwloZHItPnJhbWRpc2tfaW1hZ2UgPSAwOworCWhkci0+cmFtZGlza19zaXplID0gMDsKKworCS8qCisJICogRmlndXJlIG91dCB0aGUgc2l6ZSBvZiB0aGUgaW5pdHJhbWZzLCBhbmQgd2hlcmUgdG8gcHV0IGl0LgorCSAqIFdlIHNob3VsZCBwdXQgaXQgYXQgdGhlIGhpZ2hlc3QgcG9zc2libGUgYWRkcmVzcyB3aGljaCBpcworCSAqIDw9IGhkci0+aW5pdHJkX2FkZHJfbWF4LCB3aGljaCBmaXRzIHRoZSBlbnRpcmUgaW5pdHJhbWZzLgorCSAqLworCWlyZl9zaXplID0gaW5pdHJhbWZzX3NpemUoaW5pdHJhbWZzKTsJLyogSGFuZGxlcyBpbml0cmFtZnMgPT0gTlVMTCAqLworCWlmICghaXJmX3NpemUpCisJCXJldHVybiAwOworCisJbGFzdCA9IDA7CisJZmluZF9hZGRyKE5VTEwsICZsYXN0LCAweDEwMDAsIGhkci0+aW5pdHJkX2FkZHJfbWF4LAorCQkgIGlyZl9zaXplLCBJTklUUkFNRlNfTUFYX0FMSUdOKTsKKwlpZiAobGFzdCkKKwkJc3RhdHVzID0gYWxsb2NhdGVfYWRkcigmbGFzdCwgaXJmX3NpemUpOworCisJaWYgKCFsYXN0IHx8IHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlwcmludGYoIkZhaWxlZCB0byBhbGxvY2F0ZSBpbml0cmFtZnMgbWVtb3J5LCBiYWlsaW5nIG91dFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwloZHItPnJhbWRpc2tfaW1hZ2UgPSAodWludDMyX3QpbGFzdDsKKwloZHItPnJhbWRpc2tfc2l6ZSA9IGlyZl9zaXplOworCisJLyogQ29weSBpbml0cmFtZnMgaW50byBhbGxvY2F0ZWQgbWVtb3J5ICovCisJZm9yIChpcCA9IGluaXRyYW1mcy0+bmV4dDsgaXAtPmxlbjsgaXAgPSBpcC0+bmV4dCkgeworCQlsZW4gPSBpcC0+bGVuOworCQluZXh0X2FkZHIgPSBsYXN0ICsgbGVuOworCisJCS8qCisJCSAqIElmIHRoaXMgaXNuJ3QgdGhlIGxhc3QgZW50cnksIGV4dGVuZCB0aGUKKwkJICogemVyby1wYWQgcmVnaW9uIHRvIGVuZm9yY2UgdGhlIGFsaWdubWVudCBvZgorCQkgKiB0aGUgbmV4dCBjaHVuay4KKwkJICovCisJCWlmIChpcC0+bmV4dC0+bGVuKSB7CisJCQlwYWQgPSAtbmV4dF9hZGRyICYgKGlwLT5uZXh0LT5hbGlnbiAtIDEpOworCQkJbGVuICs9IHBhZDsKKwkJCW5leHRfYWRkciArPSBwYWQ7CisJCX0KKworCQlpZiAoaXAtPmRhdGFfbGVuKQorCQkJbWVtY3B5KCh2b2lkICopKFVJTlROKWxhc3QsIGlwLT5kYXRhLCBpcC0+ZGF0YV9sZW4pOworCisJCWlmIChsZW4gPiBpcC0+ZGF0YV9sZW4pCisJCQltZW1zZXQoKHZvaWQgKikoVUlOVE4pKGxhc3QgKyBpcC0+ZGF0YV9sZW4pLCAwLAorCQkJICAgICAgIGxlbiAtIGlwLT5kYXRhX2xlbik7CisKKwkJbGFzdCA9IG5leHRfYWRkcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXhpdF9ib290KHN0cnVjdCBib290X3BhcmFtcyAqYnApCit7CisJc3RydWN0IGU4MjBfZW50cnkgKmU4MjBidWYsICplOworCUVGSV9NRU1PUllfREVTQ1JJUFRPUiAqbWFwOworCUVGSV9TVEFUVVMgc3RhdHVzOworCXVpbnQzMl90IGU4MjBfdHlwZTsKKwlVSU5UTiBpLCBucl9lbnRyaWVzLCBrZXksIGRlc2Nfc3o7CisJVUlOVDMyIGRlc2NfdmVyOworCisJLyogQnVpbGQgZWZpIG1lbW9yeSBtYXAgKi8KKwltYXAgPSBnZXRfbWVtb3J5X21hcCgmbnJfZW50cmllcywgJmtleSwgJmRlc2Nfc3osICZkZXNjX3Zlcik7CisJaWYgKCFtYXApCisJCXJldHVybiAtMTsKKworCWJwLT5lZmkubWVtbWFwID0gKHVpbnQzMl90KSh1bnNpZ25lZCBsb25nKW1hcDsKKwlicC0+ZWZpLm1lbW1hcF9zaXplID0gbnJfZW50cmllcyAqIGRlc2Nfc3o7CisJYnAtPmVmaS5zeXN0YWIgPSAodWludDMyX3QpKHVuc2lnbmVkIGxvbmcpU1Q7CisJYnAtPmVmaS5kZXNjX3NpemUgPSBkZXNjX3N6OworCWJwLT5lZmkuZGVzY192ZXJzaW9uID0gZGVzY192ZXI7CisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorICAgICAgICBicC0+ZWZpLnN5c3RhYl9oaSA9ICgodW5zaWduZWQgbG9uZylTVCkgPj4gMzI7CisgICAgICAgIGJwLT5lZmkubWVtbWFwX2hpID0gKCh1bnNpZ25lZCBsb25nKW1hcCkgPj4gMzI7CisjZW5kaWYKKworCisJLyoKKwkgKiBFdmVuIHRob3VnaCAnbWVtbWFwJyBjb250YWlucyB0aGUgbWVtb3J5IG1hcCB3ZSBwcm92aWRlZAorCSAqIHByZXZpb3VzbHkgaW4gZWZpX3NjYW5fbWVtb3J5KCksIHdlIHNob3VsZCByZWNhbGN1bGF0ZSB0aGUKKwkgKiBlODIwIG1hcCBiZWNhdXNlIGl0IHdpbGwgbW9zdCBsaWtlbHkgaGF2ZSBjaGFuZ2VkIGluIHRoZQorCSAqIGludGVyaW0uCisJICovCisJZSA9IGU4MjBidWYgPSBicC0+ZTgyMF9tYXA7CisJZm9yIChpID0gMDsgaSA8IG5yX2VudHJpZXMgJiYgaSA8IEU4MjBNQVg7IGkrKykgeworCQlzdHJ1Y3QgZTgyMF9lbnRyeSAqcHJldiA9IE5VTEw7CisKKwkJaWYgKGUgPiBlODIwYnVmKQorCQkJcHJldiA9IGUgLSAxOworCisJCW1hcCA9IGdldF9tZW1fZGVzYyhicC0+ZWZpLm1lbW1hcCwgZGVzY19zeiwgaSk7CisJCWUtPnN0YXJ0ID0gbWFwLT5QaHlzaWNhbFN0YXJ0OworCQllLT5sZW4gPSBtYXAtPk51bWJlck9mUGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQ7CisKKwkJc3dpdGNoIChtYXAtPlR5cGUpIHsKKwkJY2FzZSBFZmlSZXNlcnZlZE1lbW9yeVR5cGU6CisgICAgICAgICAgICAgICAgY2FzZSBFZmlSdW50aW1lU2VydmljZXNDb2RlOgorICAgICAgICAgICAgICAgIGNhc2UgRWZpUnVudGltZVNlcnZpY2VzRGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIEVmaU1lbW9yeU1hcHBlZElPOgorICAgICAgICAgICAgICAgIGNhc2UgRWZpTWVtb3J5TWFwcGVkSU9Qb3J0U3BhY2U6CisgICAgICAgICAgICAgICAgY2FzZSBFZmlQYWxDb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgZTgyMF90eXBlID0gRTgyMF9SRVNFUlZFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFZmlVbnVzYWJsZU1lbW9yeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGU4MjBfdHlwZSA9IEU4MjBfVU5VU0FCTEU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRWZpQUNQSVJlY2xhaW1NZW1vcnk6CisgICAgICAgICAgICAgICAgICAgICAgICBlODIwX3R5cGUgPSBFODIwX0FDUEk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRWZpTG9hZGVyQ29kZToKKyAgICAgICAgICAgICAgICBjYXNlIEVmaUxvYWRlckRhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBFZmlCb290U2VydmljZXNDb2RlOgorICAgICAgICAgICAgICAgIGNhc2UgRWZpQm9vdFNlcnZpY2VzRGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIEVmaUNvbnZlbnRpb25hbE1lbW9yeToKKwkJCWU4MjBfdHlwZSA9IEU4MjBfUkFNOworCQkJYnJlYWs7CisKKwkJY2FzZSBFZmlBQ1BJTWVtb3J5TlZTOgorCQkJZTgyMF90eXBlID0gRTgyMF9OVlM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZS0+dHlwZSA9IGU4MjBfdHlwZTsKKworCQkvKiBDaGVjayBmb3IgYWRqYWNlbnQgZW50cmllcyB3ZSBjYW4gbWVyZ2UuICovCisJCWlmIChwcmV2ICYmIChwcmV2LT5zdGFydCArIHByZXYtPmxlbikgPT0gZS0+c3RhcnQgJiYKKwkJICAgIHByZXYtPnR5cGUgPT0gZS0+dHlwZSkKKwkJCXByZXYtPmxlbiArPSBlLT5sZW47CisJCWVsc2UKKwkJCWUrKzsKKwl9CisKKwlicC0+ZTgyMF9lbnRyaWVzID0gZSAtIGU4MjBidWY7CisKKwlzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+RXhpdEJvb3RTZXJ2aWNlcywgMiwgaW1hZ2VfaGFuZGxlLCBrZXkpOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gZXhpdCBib290IHNlcnZpY2VzOiAweCUwMTZseFxuIiwgc3RhdHVzKTsKKwkJRnJlZVBvb2wobWFwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKiBlZmlfYm9vdF9saW51eDogCisgKiBCb290cyB0aGUgbGludXgga2VybmVsIHVzaW5nIHRoZSBpbWFnZSBhbmQgcGFyYW1ldGVycyB0byBib290IHdpdGguCisgKiBUaGUgRUZJIGJvb3QgbG9hZGVyIGlzIHJld29ya2VkIHRha2luZyB0aGUgY3VlIGZyb20KKyAqIGh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1ib290L2VmaWxpbnV4L2VmaWxpbnV4LmdpdCBvbiB0aGUgbmVlZCB0bworICogY2FwIGtleSBrZXJuZWwgZGF0YSBzdHJ1Y3R1cmVzIGF0ICogMHgzRkZGRkZGRi4KKyAqIFRoZSBrZXJuZWwgaW1hZ2UsIGtlcm5lbCBjb21tYW5kIGxpbmUgYW5kIGJvb3QgcGFyYW1ldGVyIGJsb2NrIGFyZSBjb3BpZWQKKyAqIGludG8gYWxsb2NhdGVkIG1lbW9yeSBhcmVhcyB0aGF0IGhvbm9yIHRoZSBhZGRyZXNzIGNhcHBpbmcgcmVxdWlyZW1lbnQKKyAqIHByaW9yIHRvIGtlcm5lbCBoYW5kb2ZmLiAKKyAqCisgKiBGSVhNRQorICogQ2FuIHdlIG1vdmUgdGhpcyBhbGxvY2F0aW9uIHJlcXVpcmVtZW50IHRvIGNvbTMyIGxpbnV4IGxvYWRlciBpbiBvcmRlcgorICogdG8gYXZvaWQgZG91YmxlIGNvcHlpbmcga2VybmVsIGltYWdlPworICovCitpbnQgZWZpX2Jvb3RfbGludXgodm9pZCAqa2VybmVsX2J1Ziwgc2l6ZV90IGtlcm5lbF9zaXplLAorCQkgICBzdHJ1Y3QgaW5pdHJhbWZzICppbml0cmFtZnMsCisJCSAgIHN0cnVjdCBzZXR1cF9kYXRhICpzZXR1cF9kYXRhLAorCQkgICBjaGFyICpjbWRsaW5lKQoreworCXN0cnVjdCBsaW51eF9oZWFkZXIgKmhkcjsKKwlzdHJ1Y3QgYm9vdF9wYXJhbXMgKmJwOworCUVGSV9TVEFUVVMgc3RhdHVzOworCUVGSV9QSFlTSUNBTF9BRERSRVNTIGFkZHIsIHByZWZfYWRkcmVzcywga2VybmVsX3N0YXJ0ID0gMDsKKwlVSU5UNjQgc2V0dXBfc3osIGluaXRfc2l6ZSA9IDA7CisJY2hhciAqX2NtZGxpbmU7CisKKwlpZiAoY2hlY2tfbGludXhfaGVhZGVyKGtlcm5lbF9idWYpKQorCQlnb3RvIGJhaWw7CisKKwkvKiBhbGxvY2F0ZSBmb3IgYm9vdCBwYXJhbWV0ZXIgYmxvY2sgKi8KKwlhZGRyID0gMHgzRkZGRkZGRjsKKwlzdGF0dXMgPSBhbGxvY2F0ZV9wYWdlcyhBbGxvY2F0ZU1heEFkZHJlc3MsIEVmaUxvYWRlckRhdGEsCisJCQkgICAgIEJPT1RfUEFSQU1fQkxLU0laRSwgJmFkZHIpOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBrZXJuZWwgYm9vdCBwYXJhbWV0ZXIgYmxvY2ssIGJhaWxpbmcgb3V0XG4iKTsKKwkJZ290byBiYWlsOworCX0KKworCWJwID0gKHN0cnVjdCBib290X3BhcmFtcyAqKShVSU5UTilhZGRyOworCisJbWVtc2V0KCh2b2lkICopYnAsIDB4MCwgQk9PVF9QQVJBTV9CTEtTSVpFKTsKKwkvKiBDb3B5IHRoZSBmaXJzdCB0d28gc2VjdG9ycyB0byBib290X3BhcmFtcyAqLworCW1lbWNweSgoY2hhciAqKWJwLCBrZXJuZWxfYnVmLCAyICogNTEyKTsKKwloZHIgPSAoc3RydWN0IGxpbnV4X2hlYWRlciAqKWJwOworCisJc2V0dXBfc3ogPSAoaGRyLT5zZXR1cF9zZWN0cyArIDEpICogNTEyOworCWlmIChoZHItPnZlcnNpb24gPj0gMHgyMGEpIHsKKwkJcHJlZl9hZGRyZXNzID0gaGRyLT5wcmVmX2FkZHJlc3M7CisJCWluaXRfc2l6ZSA9IGhkci0+aW5pdF9zaXplOworCX0gZWxzZSB7CisJCXByZWZfYWRkcmVzcyA9IDB4MTAwMDAwOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCB0aGUga2VybmVsCisJCSAqIG5lZWRzIHJvb20gZm9yIGRlY29tcHJlc3Npb24sIG90aGVyd2lzZSB3ZSBjb3VsZAorCQkgKiBlbmQgdXAgdHJhc2hpbmcgb3RoZXIgY2h1bmtzIG9mIGFsbG9jYXRlZCBtZW1vcnkuCisJCSAqLworCQlpbml0X3NpemUgPSAoa2VybmVsX3NpemUgLSBzZXR1cF9zeikgKiAzOworCX0KKwloZHItPnR5cGVfb2ZfbG9hZGVyID0gU1lTTElOVVhfRUZJTERSOwkvKiBTWVNMSU5VWCBib290IGxvYWRlciBtb2R1bGUgKi8KKwlfY21kbGluZSA9IGJ1aWxkX2NtZGxpbmUoY21kbGluZSk7CisJaWYgKCFfY21kbGluZSkKKwkJZ290byBiYWlsOworCisJaGRyLT5jbWRfbGluZV9wdHIgPSAoVUlOVDMyKShVSU5UTilfY21kbGluZTsKKworCWFkZHIgPSBwcmVmX2FkZHJlc3M7CisJc3RhdHVzID0gYWxsb2NhdGVfcGFnZXMoQWxsb2NhdGVBZGRyZXNzLCBFZmlMb2FkZXJEYXRhLAorCQkJICAgICBFRklfU0laRV9UT19QQUdFUyhpbml0X3NpemUpLCAmYWRkcik7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQkvKgorCQkgKiBXZSBmYWlsZWQgdG8gYWxsb2NhdGUgdGhlIHByZWZlcnJlZCBhZGRyZXNzLCBzbworCQkgKiBqdXN0IGFsbG9jYXRlIHNvbWUgbWVtb3J5IGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKwkJICovCisJCWlmICghaGRyLT5yZWxvY2F0YWJsZV9rZXJuZWwpIHsKKwkJCXByaW50ZigiQ2Fubm90IHJlbG9jYXRlIGtlcm5lbCwgYmFpbGluZyBvdXRcbiIpOworCQkJZ290byBiYWlsOworCQl9CisKKwkJc3RhdHVzID0gZW1hbGxvYyhpbml0X3NpemUsIGhkci0+a2VybmVsX2FsaWdubWVudCwgJmFkZHIpOworCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCQlwcmludGYoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGtlcm5lbCBpbWFnZSwgYmFpbGluZyBvdXRcbiIpOworCQkJZ290byBmcmVlX21hcDsKKwkJfQorCX0KKwlrZXJuZWxfc3RhcnQgPSBhZGRyOworCS8qIEZJWE1FOiB3ZSBjb3B5IHRoZSBrZXJuZWwgaW50byB0aGUgcGh5c2ljYWwgbWVtb3J5IGFsbG9jYXRlZCBoZXJlCisJICogVGhlIHN5c2xpbnV4IGtlcm5lbCBpbWFnZSBsb2FkIGVsc2V3aGVyZSBjb3VsZCBhbGxvY2F0ZSB0aGUgRUZJIG1lbW9yeSBmcm9tIGhlcmUKKwkgKiBwcmlvciB0byBjb3B5aW5nIGtlcm5lbCBhbmQgc2F2ZSBhbiBleHRyYSBjb3B5CisJICovCisJbWVtY3B5KCh2b2lkICopKFVJTlROKWtlcm5lbF9zdGFydCwga2VybmVsX2J1ZitzZXR1cF9zeiwga2VybmVsX3NpemUtc2V0dXBfc3opOworCisJaGRyLT5jb2RlMzJfc3RhcnQgPSAoVUlOVDMyKSgoVUlOVDY0KWtlcm5lbF9zdGFydCk7CisKKwlkcHJpbnRmKCJlZmlfYm9vdF9saW51eDoga2VybmVsX3N0YXJ0IDB4JXgga2VybmVsX3NpemUgMHgleCBpbml0cmFtZnMgMHgleCBzZXR1cF9kYXRhIDB4JXggY21kbGluZSAweCV4XG4iLAorCWtlcm5lbF9zdGFydCwga2VybmVsX3NpemUsIGluaXRyYW1mcywgc2V0dXBfZGF0YSwgX2NtZGxpbmUpOworCisJaWYgKGhhbmRsZV9yYW1kaXNrcyhoZHIsIGluaXRyYW1mcykpCisJCWdvdG8gZnJlZV9tYXA7CisKKwkvKiBBdHRlbXB0IHRvIHVzZSB0aGUgaGFuZG92ZXIgcHJvdG9jb2wgaWYgYXZhaWxhYmxlICovCisJaWYgKGhkci0+dmVyc2lvbiA+PSAweDIwYiAmJiBoZHItPmhhbmRvdmVyX29mZnNldCkKKwkJaGFuZG92ZXJfYm9vdChoZHIsIGJwKTsKKworCXNldHVwX3NjcmVlbigmYnAtPnNjcmVlbl9pbmZvKTsKKworCWlmIChidWlsZF9nZHQoKSkKKwkJZ290byBmcmVlX21hcDsKKworCWRwcmludGYoImVmaV9ib290X2xpbnV4OiBzZXR1cF9zZWN0cyAlZCBrZXJuZWxfc2l6ZSAlZFxuIiwgaGRyLT5zZXR1cF9zZWN0cywga2VybmVsX3NpemUpOworCisJZWZpX2NvbnNvbGVfcmVzdG9yZSgpOworCisJaWYgKGV4aXRfYm9vdChicCkpCisJCWdvdG8gZnJlZV9tYXA7CisKKwltZW1jcHkoJmJwLT5lZmkubG9hZF9zaWduYXR1cmUsIEVGSV9MT0FEX1NJRywgc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlhc20gdm9sYXRpbGUgKCJsaWR0ICUwIiA6OiAibSIgKGlkdCkpOworCWFzbSB2b2xhdGlsZSAoImxnZHQgJTAiIDo6ICJtIiAoZ2R0KSk7CisKKwlrZXJuZWxfanVtcChrZXJuZWxfc3RhcnQsIGJwKTsKKworCS8qIE5PVFJFQUNIRUQgKi8KKworZnJlZV9tYXA6CisJaWYgKF9jbWRsaW5lKQorCQllZnJlZSgoRUZJX1BIWVNJQ0FMX0FERFJFU1MpKHVuc2lnbmVkIGxvbmcpX2NtZGxpbmUsCisJCSAgICAgIHN0cmxlbihfY21kbGluZSkgKyAxKTsKKworCWlmIChicCkKKwkJZWZyZWUoKEVGSV9QSFlTSUNBTF9BRERSRVNTKSh1bnNpZ25lZCBsb25nKWJwLAorCQkgICAgICAgQk9PVF9QQVJBTV9CTEtTSVpFKTsKKwlpZiAoa2VybmVsX3N0YXJ0KSBlZnJlZShrZXJuZWxfc3RhcnQsIGluaXRfc2l6ZSk7CisJaWYgKGhkci0+cmFtZGlza19zaXplKQorCQlmcmVlX2FkZHIoaGRyLT5yYW1kaXNrX2ltYWdlLCBoZHItPnJhbWRpc2tfc2l6ZSk7CitiYWlsOgorCXJldHVybiAtMTsKK30KKworZXh0ZXJuIHN0cnVjdCBkaXNrICplZmlfZGlza19pbml0KEVGSV9IQU5ETEUpOworZXh0ZXJuIHZvaWQgc2VyaWFsY2ZnKHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQxNl90ICopOworCitleHRlcm4gc3RydWN0IHZlc2Ffb3BzIGVmaV92ZXNhX29wczsKKworc3RydWN0IG1lbV9vcHMgZWZpX21lbV9vcHMgPSB7CisJLm1hbGxvYyA9IGVmaV9tYWxsb2MsCisJLnJlYWxsb2MgPSBlZmlfcmVhbGxvYywKKwkuZnJlZSA9IGVmaV9mcmVlLAorfTsKKworc3RydWN0IGZpcm13YXJlIGVmaV9mdyA9IHsKKwkuaW5pdCA9IGVmaV9pbml0LAorCS5kaXNrX2luaXQgPSBlZmlfZGlza19pbml0LAorCS5vX29wcyA9ICZlZmlfb3BzLAorCS5pX29wcyA9ICZlZmlfaW9wcywKKwkuZ2V0X3NlcmlhbF9jb25zb2xlX2luZm8gPSBzZXJpYWxjZmcsCisJLmFkdl9vcHMgPSAmZWZpX2Fkdl9vcHMsCisJLmJvb3RfbGludXggPSBlZmlfYm9vdF9saW51eCwKKwkudmVzYSA9ICZlZmlfdmVzYV9vcHMsCisJLm1lbSA9ICZlZmlfbWVtX29wcywKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNsaW51eF9yZWdpc3Rlcl9lZmkodm9pZCkKK3sKKwlmaXJtd2FyZSA9ICZlZmlfZnc7Cit9CisKK2V4dGVybiB2b2lkIGluaXQodm9pZCk7CitleHRlcm4gY29uc3Qgc3RydWN0IGZzX29wcyB2ZmF0X2ZzX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZnNfb3BzIHB4ZV9mc19vcHM7CisKK2NoYXIgZnJlZV9oaWdoX21lbW9yeVs0MDk2XTsKKworZXh0ZXJuIGNoYXIgX19ic3Nfc3RhcnRbXTsKK2V4dGVybiBjaGFyIF9fYnNzX2VuZFtdOworCitzdGF0aWMgdm9pZCBlZmlfc2V0Y3dkKENIQVIxNiAqZHApCit7CisJQ0hBUjE2ICpjMTY7CisJY2hhciAqYzg7CisJaW50IGksIGo7CisKKwkvKiBTZWFyY2ggZm9yIHRoZSBzdGFydCBvZiB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCAqLworCWZvciAoaSA9IFN0ckxlbihkcCkgLSAxOyBpID49IDA7IGktLSkgeworCQlpZiAoZHBbaV0gPT0gJ1xcJyB8fCBkcFtpXSA9PSAnLycpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA8IDAgfHwgaSA+IENVUlJFTlRESVJfTUFYKSB7CisJCWRwID0gTCJcXCI7CisJCWkgPSAxOworCX0KKworCWM4ID0gQ3VycmVudERpck5hbWU7CisJYzE2ID0gZHA7CisKKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCWlmICgqYzE2ID09ICdcXCcpIHsKKwkJCSpjOCsrID0gJy8nOworCQkJYzE2Kys7CisJCX0gZWxzZQorCQkJKmM4KysgPSAqYzE2Kys7CisJfQorCisJKmM4ID0gJ1wwJzsKK30KKworRUZJX1NUQVRVUyBlZmlfbWFpbihFRklfSEFORExFIGltYWdlLCBFRklfU1lTVEVNX1RBQkxFICp0YWJsZSkKK3sKKwlFRklfUFhFX0JBU0VfQ09ERSAqcHhlOworCUVGSV9MT0FERURfSU1BR0UgKmluZm87CisJRUZJX1NUQVRVUyBzdGF0dXMgPSBFRklfU1VDQ0VTUzsKKwljb25zdCBzdHJ1Y3QgZnNfb3BzICpvcHNbXSA9IHsgTlVMTCwgTlVMTCB9OworCXVuc2lnbmVkIGxvbmcgbGVuID0gKHVuc2lnbmVkIGxvbmcpX19ic3NfZW5kIC0gKHVuc2lnbmVkIGxvbmcpX19ic3Nfc3RhcnQ7CisJc3RhdGljIHN0cnVjdCBlZmlfZGlza19wcml2YXRlIHByaXY7CisJU0lNUExFX0lOUFVUX0lOVEVSRkFDRSAqaW47CisJRUZJX0lOUFVUX0tFWSBrZXk7CisJRUZJX0VWRU5UIHRpbWVyX2V2OworCisJbWVtc2V0KF9fYnNzX3N0YXJ0LCAwLCBsZW4pOworCUluaXRpYWxpemVMaWIoaW1hZ2UsIHRhYmxlKTsKKworCWltYWdlX2hhbmRsZSA9IGltYWdlOworCXN5c2xpbnV4X3JlZ2lzdGVyX2VmaSgpOworCisJZWZpX2NvbnNvbGVfc2F2ZSgpOworCWluaXQoKTsKKworCXN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5IYW5kbGVQcm90b2NvbCwgMywgaW1hZ2UsCisJCQkJICAgJkxvYWRlZEltYWdlUHJvdG9jb2wsICh2b2lkICoqKSZpbmZvKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCVByaW50KEwiRmFpbGVkIHRvIGxvb2t1cCBMb2FkZWRJbWFnZVByb3RvY29sXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkhhbmRsZVByb3RvY29sLCAzLCBpbmZvLT5EZXZpY2VIYW5kbGUsCisJCQkJICAgJlB4ZUJhc2VDb2RlUHJvdG9jb2wsICh2b2lkICoqKSZweGUpOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJLyoKKwkJICogVXNlIGRldmljZSBoYW5kbGUgdG8gc2V0IHVwIHRoZSB2b2x1bWUgcm9vdCB0bworCQkgKiBwcm9jZWVkIHdpdGggQURWIGluaXQuCisJCSAqLworCQlpZiAoRUZJX0VSUk9SKGVmaV9zZXRfdm9scm9vdChpbmZvLT5EZXZpY2VIYW5kbGUpKSkgeworCQkJUHJpbnQoTCJGYWlsZWQgdG8gbG9jYXRlIHJvb3QgZGV2aWNlIHRvIHByZXAgZm9yICIpOworCQkJUHJpbnQoTCJmaWxlIG9wZXJhdGlvbnMgJiBBRFYgaW5pdGlhbGl6YXRpb25cbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllZmlfZGVyaXZhdGl2ZShTWVNMSU5VWF9GU19TWVNMSU5VWCk7CisJCW9wc1swXSA9ICZ2ZmF0X2ZzX29wczsKKwl9IGVsc2UgeworCQllZmlfZGVyaXZhdGl2ZShTWVNMSU5VWF9GU19QWEVMSU5VWCk7CisJCW9wc1swXSA9ICZweGVfZnNfb3BzOworCX0KKworCS8qIHNldHVwIHRpbWVyIGZvciBib290IG1lbnUgc3lzdGVtIHN1cHBvcnQgKi8KKwlzdGF0dXMgPSBzZXR1cF9kZWZhdWx0X3RpbWVyKCZ0aW1lcl9ldik7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlQcmludChMIkZhaWxlZCB0byBzZXQgdXAgRUZJIHRpbWVyIHN1cHBvcnQsIGJhaWxpbmcgb3V0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogVE9ETzogb25jZSBhbGwgZXJyb3JzIGFyZSBjYXB0dXJlZCBpbiBlZmlfZXJybm8sIGJhaWwgb3V0IGlmIG5lY2Vzc2FyeSAqLworCisJcHJpdi5kZXZfaGFuZGxlID0gaW5mby0+RGV2aWNlSGFuZGxlOworCisJLyoKKwkgKiBTZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIHdoaWNoIHNob3VsZCBiZSB0aGUKKwkgKiBkaXJlY3RvcnkgdGhhdCBzeXNsaW51eC5lZmkgcmVzaWRlcyBpbi4KKwkgKi8KKwllZmlfc2V0Y3dkKERldmljZVBhdGhUb1N0cihpbmZvLT5GaWxlUGF0aCkpOworCisJZnNfaW5pdChvcHMsICh2b2lkICopJnByaXYpOworCisJLyoKKwkgKiBUaGVyZSBtYXkgYmUgcGVuZGluZyB1c2VyIGlucHV0IHRoYXQgd2Fzbid0IHByb2Nlc3NlZCBieQorCSAqIHdoYXRldmVyIGFwcGxpY2F0aW9uIGludm9rZWQgdXMuIENvbnN1bWUgYW5kIGRpc2NhcmQgdGhhdAorCSAqIGRhdGEgbm93LgorCSAqLworCWluID0gU1QtPkNvbkluOworCWRvIHsKKwkJc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoaW4tPlJlYWRLZXlTdHJva2UsIDIsIGluLCAma2V5KTsKKwl9IHdoaWxlIChzdGF0dXMgIT0gRUZJX05PVF9SRUFEWSk7CisKKwlpZiAoIXNldGptcChsb2FkX2Vycm9yX2J1ZikpCisJCWxvYWRfZW52MzIoTlVMTCk7CisKKwkvKiBsb2FkX2VudjMyKCkgZmFpbGVkLi4gY2FuY2VsIHRpbWVyIGFuZCBiYWlsb3V0ICovCisJc3RhdHVzID0gY2FuY2VsX3RpbWVyKHRpbWVyX2V2KTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlQcmludChMIkZhaWxlZCB0byBjYW5jZWwgRUZJIHRpbWVyOiAleFxuIiwgc3RhdHVzKTsKKworCS8qCisJICogVGVsbCB0aGUgZmlybXdhcmUgdGhhdCBTeXNsaW51eCBmYWlsZWQgdG8gbG9hZC4KKwkgKi8KKwlzdGF0dXMgPSBFRklfTE9BRF9FUlJPUjsKK291dDoKKwllZmlfY29uc29sZV9yZXN0b3JlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2VmaS9tZW0uYyBiL2VmaS9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2U4MjIxCi0tLSAvZGV2L251bGwKKysrIGIvZWZpL21lbS5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMi0yMDE0IEludGVsIENvcnBvcmF0aW9uIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICovCisKKyNpbmNsdWRlIDxtZW0vbWFsbG9jLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZWZpLmgiCisKK3ZvaWQgKmVmaV9tYWxsb2Moc2l6ZV90IHNpemUsIGVudW0gaGVhcCBoZWFwLCBtYWxsb2NfdGFnX3QgdGFnKQoreworCXJldHVybiBBbGxvY2F0ZVBvb2woc2l6ZSk7Cit9CisKK3ZvaWQgKmVmaV9yZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJdm9pZCAqbmV3cHRyOworCisJbmV3cHRyID0gQWxsb2NhdGVQb29sKHNpemUpOworCW1lbWNweShuZXdwdHIsIHB0ciwgc2l6ZSk7CisJRnJlZVBvb2wocHRyKTsKKwlyZXR1cm4gbmV3cHRyOworfQorCit2b2lkIGVmaV9mcmVlKHZvaWQgKnB0cikKK3sKKwlGcmVlUG9vbChwdHIpOworfQpkaWZmIC0tZ2l0IGEvZWZpL3B4ZS5jIGIvZWZpL3B4ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWZiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvcHhlLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEludGVsIENvcnBvcmF0aW9uIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICovCisKKyNpbmNsdWRlIDxzeXNsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3B4ZV9hcGkuaD4KKyNpbmNsdWRlICJlZmkuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJmcy9weGUvcHhlLmgiCisKK2NvbnN0IHN0cnVjdCB1cmxfc2NoZW1lIHVybF9zY2hlbWVzW10gPSB7CisgICAgeyAidGZ0cCIsIHRmdHBfb3BlbiwgMCB9LAorICAgIHsgImh0dHAiLCBodHRwX29wZW4sIE9fRElSRUNUT1JZIH0sCisgICAgeyAiZnRwIiwgIGZ0cF9vcGVuLCAgT19ESVJFQ1RPUlkgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAgfSwKK307CisKKy8qKgorICogTmV0d29yayBzdGFjay1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICovCit2b2lkIG5ldF9jb3JlX2luaXQodm9pZCkKK3sKKyAgICBodHRwX2Jha2VfY29va2llcygpOworfQorCit2b2lkIHB4ZV9pbml0X2lzcih2b2lkKSB7fQordm9pZCBncHhlX2luaXQodm9pZCkge30KK3ZvaWQgcHhlX2lkbGVfaW5pdCh2b2lkKSB7fQorCitpbnQgcmVzZXRfcHhlKHZvaWQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRE5TX01BWF9TRVJWRVJTIDQJCS8qIE1heCBubyBvZiBETlMgc2VydmVycyAqLwordWludDMyX3QgZG5zX3NlcnZlcltETlNfTUFYX1NFUlZFUlNdID0gezAsIH07CisKK19fZXhwb3J0IHVpbnQzMl90IGRuc19yZXNvbHYoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICAvKgorICAgICAqIFJldHVybiBmYWlsdXJlIG9uIGFuIGVtcHR5IGlucHV0Li4uIHRoaXMgY2FuIGhhcHBlbiBkdXJpbmcKKyAgICAgKiBzb21lIHR5cGVzIG9mIFVSTCBwYXJzaW5nLCBhbmQgdGhpcyBpcyB0aGUgZWFzaWVzdCBwbGFjZSB0bworICAgICAqIGNoZWNrIGZvciBpdC4KKyAgICAgKi8KKyAgICBpZiAoIW5hbWUgfHwgISpuYW1lKQorCXJldHVybiAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBweGVfaW5pdChib29sIHF1aWV0KQoreworICAgIEVGSV9IQU5ETEUgKmhhbmRsZXM7CisgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisgICAgVUlOVE4gbnJfaGFuZGxlczsKKworICAgIHN0YXR1cyA9IExpYkxvY2F0ZUhhbmRsZShCeVByb3RvY29sLCAmUHhlQmFzZUNvZGVQcm90b2NvbCwKKwkJCSAgICAgTlVMTCwgJm5yX2hhbmRsZXMsICZoYW5kbGVzKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJaWYgKCFxdWlldCkKKwkgICAgUHJpbnQoTCJObyBQWEUgQmFzZSBDb2RlIFByb3RvY29sXG4iKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRURIQ1BfQlVGX0xFTiA4MTkyCisKK3N0cnVjdCBlbWJlZGRlZF9kaGNwX29wdGlvbnMgeworICAgIHVpbnQzMl90IG1hZ2ljWzRdOworICAgIHVpbnQzMl90IGJkaGNwX2xlbjsKKyAgICB1aW50MzJfdCBhZGhjcF9sZW47CisgICAgdWludDMyX3QgYnVmZmVyX3NpemU7CisgICAgdWludDMyX3QgcmVzZXJ2ZWQ7CisgICAgdWludDhfdCAgZGhjcF9kYXRhW0VESENQX0JVRl9MRU5dOworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOworCitzdHJ1Y3QgZW1iZWRkZWRfZGhjcF9vcHRpb25zIGVtYmVkZGVkX2RoY3Bfb3B0aW9ucyA9Cit7CisgICAgLm1hZ2ljWzBdID0gMHgyYTE3MWVhZCwKKyAgICAubWFnaWNbMV0gPSAweDA2MDBlNjVlLAorICAgIC5tYWdpY1syXSA9IDB4NDAyNWE0ZTQsCisgICAgLm1hZ2ljWzNdID0gMHg0MjM4OGZjOCwKKyAgICAuYmRoY3BfbGVuID0gMCwKKyAgICAuYWRoY3BfbGVuID0gMCwKKyAgICAuYnVmZmVyX3NpemUgPSBFREhDUF9CVUZfTEVOLAorfTsKKwordm9pZCBuZXRfcGFyc2VfZGhjcCh2b2lkKQoreworICAgIEVGSV9QWEVfQkFTRV9DT0RFX01PREUgKm1vZGU7CisgICAgRUZJX1BYRV9CQVNFX0NPREUgKmJjOworICAgIHVuc2lnbmVkIGludCBwa3RfbGVuID0gc2l6ZW9mKEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCk7CisgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisgICAgRUZJX0hBTkRMRSAqaGFuZGxlcyA9IE5VTEw7CisgICAgVUlOVE4gbnJfaGFuZGxlcyA9IDA7CisgICAgdWludDhfdCBoYXJkbGVuOworICAgIHVpbnQzMl90IGlwOworICAgIGNoYXIgZHN0WzI1Nl07CisKKyAgICBzdGF0dXMgPSBMaWJMb2NhdGVIYW5kbGUoQnlQcm90b2NvbCwgJlB4ZUJhc2VDb2RlUHJvdG9jb2wsCisJCQkgTlVMTCwgJm5yX2hhbmRsZXMsICZoYW5kbGVzKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCXJldHVybjsKKworICAgIC8qIFByb2JhYmx5IHdhbnQgdG8gdXNlIElQdjQgcHJvdG9jb2wgdG8gZGVjaWRlIHdoaWNoIGhhbmRsZSB0byB1c2UgKi8KKyAgICBzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SGFuZGxlUHJvdG9jb2wsIDMsIGhhbmRsZXNbMF0sCisJCQkgICAmUHhlQmFzZUNvZGVQcm90b2NvbCwgKHZvaWQgKiopJmJjKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJUHJpbnQoTCJGYWlsZWQgdG8gbG9va3VwIFB4ZUJhc2VDb2RlUHJvdG9jb2xcbiIpOworICAgIH0KKworICAgIG1vZGUgPSBiYy0+TW9kZTsKKworICAgIC8qCisgICAgICogUGFyc2UgYW55ICJiZWZvcmUiIGhhcmRjb2RlZCBvcHRpb25zCisgICAgICovCisgICAgcGFyc2VfZGhjcF9vcHRpb25zKGVtYmVkZGVkX2RoY3Bfb3B0aW9ucy5kaGNwX2RhdGEsCisJCSAgICAgICBlbWJlZGRlZF9kaGNwX29wdGlvbnMuYmRoY3BfbGVuLCAwKTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBESENQIGNsaWVudCBpZGVudGlmaWVycyAocXVlcnkgaW5mbyAxKQorICAgICAqLworICAgIFByaW50KEwiR2V0dGluZyBjYWNoZWQgcGFja2V0ICIpOworICAgIHBhcnNlX2RoY3AoJm1vZGUtPkRoY3BEaXNjb3Zlci5EaGNwdjQsIHBrdF9sZW4pOworICAgIC8qCisgICAgICogV2UgZG9uJ3QgdXNlIGZsYWdzIGZyb20gdGhlIHJlcXVlc3QgcGFja2V0LCBzbworICAgICAqIHRoaXMgaXMgYSBnb29kIHRpbWUgdG8gaW5pdGlhbGl6ZSBESENQTWFnaWMuLi4KKyAgICAgKiBJbml0aWFsaXplIGl0IHRvIDEgbWVhbmluZyB3ZSB3aWxsIGFjY2VwdCBvcHRpb25zIGZvdW5kOworICAgICAqIGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgUFhFTElOVVggYml0IDAgd2FzIHVzZWQgdG8gaW5kaWNhdGUKKyAgICAgKiB3ZSBoYXZlIGZvdW5kIG9wdGlvbiAyMDggd2l0aCB0aGUgYXBwcm9wcmlhdGUgbWFnaWMgbnVtYmVyOworICAgICAqIHdlIG5vIGxvbmdlciByZXF1aXJlIHRoYXQsIGJ1dCBNQVkgd2FudCB0byByZS1pbnRyb2R1Y2UKKyAgICAgKiBpdCBpbiB0aGUgZnV0dXJlIGZvciB2ZW5kb3IgZW5jYXBzdWxhdGVkIG9wdGlvbnMuCisgICAgICovCisgICAgKihjaGFyICopJkRIQ1BNYWdpYyA9IDE7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgQk9PVFAvREhDUCBwYWNrZXQgdGhhdCBicm91Z2h0IHVzIGZpbGUgKGFuZCBhbiBJUAorICAgICAqIGFkZHJlc3MpLiBUaGlzIGxpdmVzIGluIHRoZSBESENQQUNLIHBhY2tldCAocXVlcnkgaW5mbyAyKQorICAgICAqLworICAgIHBhcnNlX2RoY3AoJm1vZGUtPkRoY3BBY2suRGhjcHY0LCBwa3RfbGVuKTsKKyAgICAvKgorICAgICAqIFNhdmUgYXdheSBNQUMgYWRkcmVzcyAoYXNzdW1lIHRoaXMgaXMgaW4gcXVlcnkgaW5mbyAyLiBJZiB0aGlzCisgICAgICogdHVybnMgb3V0IHRvIGJlIHByb2JsZW1hdGljIGl0IG1pZ2h0IGJlIGJldHRlciBnZXR0aW5nIGl0IGZyb20KKyAgICAgKiB0aGUgcXVlcnkgaW5mbyAxIHBhY2tldAorICAgICAqLworICAgIGhhcmRsZW4gPSBtb2RlLT5EaGNwQWNrLkRoY3B2NC5Cb290cEh3QWRkckxlbjsKKyAgICBNQUNfbGVuID0gaGFyZGxlbiA+IDE2ID8gMCA6IGhhcmRsZW47CisgICAgTUFDX3R5cGUgPSBtb2RlLT5EaGNwQWNrLkRoY3B2NC5Cb290cEh3VHlwZTsKKyAgICBtZW1jcHkoTUFDLCBtb2RlLT5EaGNwQWNrLkRoY3B2NC5Cb290cEh3QWRkciwgTUFDX2xlbik7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgYm9vdCBmaWxlIGFuZCBvdGhlciBpbmZvLiBUaGlzIGxpdmVzIGluIHRoZSBDQUNIRURfUkVQTFkKKyAgICAgKiBwYWNrZXQgKHF1ZXJ5IGluZm8gMykKKyAgICAgKi8KKyAgICBwYXJzZV9kaGNwKCZtb2RlLT5QeGVSZXBseS5EaGNwdjQsIHBrdF9sZW4pOworICAgIFByaW50KEwiXG4iKTsKKworICAgIC8qCisgICAgICogUGFyc2UgYW55ICJhZnRlciIgaGFyZGNvZGVkIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwYXJzZV9kaGNwX29wdGlvbnMoZW1iZWRkZWRfZGhjcF9vcHRpb25zLmRoY3BfZGF0YSArCisJCSAgICAgICBlbWJlZGRlZF9kaGNwX29wdGlvbnMuYmRoY3BfbGVuLAorCQkgICAgICAgZW1iZWRkZWRfZGhjcF9vcHRpb25zLmFkaGNwX2xlbiwgMCk7CisKKyAgICBpcCA9IElQSW5mby5teWlwOworICAgIHNwcmludGYoZHN0LCAiJXUuJXUuJXUuJXUiLAorICAgICAgICAoKGNvbnN0IHVpbnQ4X3QgKikmaXApWzBdLAorICAgICAgICAoKGNvbnN0IHVpbnQ4X3QgKikmaXApWzFdLAorICAgICAgICAoKGNvbnN0IHVpbnQ4X3QgKikmaXApWzJdLAorICAgICAgICAoKGNvbnN0IHVpbnQ4X3QgKikmaXApWzNdKTsKKworICAgIFByaW50KEwiTXkgSVAgaXMgJWFcbiIsIGRzdCk7Cit9CmRpZmYgLS1naXQgYS9lZmkvc3lzbGludXgubGQgYi9lZmkvc3lzbGludXgubGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyNzA1MwotLS0gL2Rldi9udWxsCisrKyBiL2VmaS9zeXNsaW51eC5sZApAQCAtMCwwICsxLDE3NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDA4LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciB0aGUgU1lTTElOVVggY29yZQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCisKK1NFQ1RJT05TCit7CisJLiA9IDA7CisJSW1hZ2VCYXNlID0gLjsJCS8qIEZvciBnbnUtZWZpJ3MgY3J0MCAqLworCV9fbW9kdWxlX3N0YXJ0ID0gLjsKKwkuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMCkgKyBTSVpFT0ZfSEVBREVSUzsKKwkudGV4dCA6IHsKKwkJRklMTCgweDkwOTA5MDkwKQorCQlfX3RleHRfc3RhcnQgPSAuOworCQkqKC50ZXh0KQorCQkqKC50ZXh0LiopCisJCV9fdGV4dF9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTigxNik7CisKKwkucm9kYXRhIDogeworCQlfX3JvZGF0YV9zdGFydCA9IC47CisJCSooLnJvZGF0YSkKKwkJKigucm9kYXRhLiopCisJCV9fcm9kYXRhX2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDQpOworCisJLmN0b3JzIDogeworCQlfX2N0b3JzX3N0YXJ0ID0gLjsKKwkJS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisJCUtFRVAgKCooLmN0b3JzKSkKKwkJX19jdG9yc19lbmQgPSAuOworCX0KKworCS5kdG9ycyA6IHsKKwkJX19kdG9yc19zdGFydCA9IC47CisJCUtFRVAgKCooU09SVCguZHRvcnMuKikpKQorCQlLRUVQICgqKC5kdG9ycykpCisJCV9fZHRvcnNfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oNDA5Nik7CisJLnJlbCA6IHsKKwkJKigucmVsLmdvdCkKKwkJKigucmVsLmRhdGEpCisJCSooLnJlbC5kYXRhLiopCisJCSooLnJlbC5jdG9ycykKKwl9CisKKwkuID0gQUxJR04oNCk7CisKKwkuZ251Lmhhc2ggOiB7CisJCV9fZ251X2hhc2hfc3RhcnQgPSAuOworCQkqKC5nbnUuaGFzaCkKKwkJX19nbnVfaGFzaF9lbmQgPSAuOworCX0KKworCisJLmR5bnN5bSA6IHsKKwkJX19keW5zeW1fc3RhcnQgPSAuOworCQkqKC5keW5zeW0pCisJCV9fZHluc3ltX2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDQpOworCisJLmR5bnN0ciA6IHsKKwkJX19keW5zdHJfc3RhcnQgPSAuOworCQkqKC5keW5zdHIpCisJCV9fZHluc3RyX2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDQpOworCisJLmR5bmxpbmsgOiB7CisJCV9fZHlubGlua19zdGFydCA9IC47CisJCSooLmR5bmxpbmspCisJCV9fZHlubGlua19lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCS5nb3QgOiB7CisJCV9fZ290X3N0YXJ0ID0gLjsKKwkJS0VFUCAoKiguZ290LnBsdCkpCisJCUtFRVAgKCooLmdvdCkpCisJCV9fZ290X2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDQpOworCisJLmR5bmFtaWMgOiB7CisJCV9fZHluYW1pY19zdGFydCA9IC47CisJCSooLmR5bmFtaWMpCisJCV9fZHluYW1pY19lbmQgPSAuOworCX0KKworCS4gPSBBTElHTigxNik7CisKKwkuZGF0YSA6IHsKKwkJX19kYXRhX3N0YXJ0ID0gLjsKKwkJKiguZGF0YSkKKwkJKiguZGF0YS4qKQorCQkqKC5sb3dtZW0pCisJCV9fZGF0YV9lbmQgPSAuOworCX0KKworCS5yZWxvYyA6IHsKKwkJKigucmVsb2MpCisJfQorCisJLmNvbW1lbnQgOiB7CisJCSooLmNvbW1ldCkKKwl9CisKKwkuc3ltdGFiIDogeworCQkqKC5zeW10YWIpCisJfQorCisJLnN0cnRhYiA6IHsKKwkJKiguc3RydGFiKQorCX0KKworCS5ic3MgOiB7CisJCS8qIHRoZSBFRkkgbG9hZGVyIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIGEgLmJzcyBzZWN0aW9uLAorCQkgICBzbyB3ZSBzdGljayBpdCBhbGwgaW50byAuZGF0YTogKi8KKwkJX19ic3Nfc3RhcnQgPSAuOworCQkqKC5ic3MpCisJCSooLmJzcy4qKQorCQkqKC5ic3MxNikKKwkJKiguaHVnZWJzcykKKwkJKihDT01NT04pCisJCV9fYnNzX2VuZCA9IC47CisJCSooLnNic3MpCisJCSooLnNjb21tb24pCisJfQorCV9fYnNzX2xlbiA9IEFCU09MVVRFKF9fYnNzX2VuZCkgLSBBQlNPTFVURShfX2Jzc19zdGFydCk7CisJX19ic3NfZHdvcmRzID0gKF9fYnNzX2xlbiArIDMpID4+IDI7CisKKwkuID0gQUxJR04oMTI4KTsKKwkKKwkvKiBWZXJ5IGxhcmdlIG9iamVjdHMgd2hpY2ggZG9uJ3QgbmVlZCB0byBiZSB6ZXJvZWQgKi8KKworCS5odWdlYnNzIDogeworCQlfX2h1Z2Vic3Nfc3RhcnQgPSAuOworCQkqKC5odWdlYnNzKQorCQkqKC5odWdlYnNzLiopCisJCV9faHVnZWJzc19lbmQgPSAuOworCX0KKworCV9lbmQgPSAuOworCisJLyogU3R1ZmYgd2UgZG9uJ3QgbmVlZC4uLiAqLworCS9ESVNDQVJELyA6IHsKKwkJKiguZWhfZnJhbWUpCisJfQorfQpkaWZmIC0tZ2l0IGEvZWZpL3RjcC5jIGIvZWZpL3RjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MGVmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvdGNwLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEludGVsIENvcnBvcmF0aW9uIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICovCisKKyNpbmNsdWRlICJlZmkuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJmcy9weGUvcHhlLmgiCisKK2V4dGVybiBFRklfR1VJRCBUY3A0U2VydmljZUJpbmRpbmdQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBUY3A0UHJvdG9jb2w7CisKKworZXh0ZXJuIHN0cnVjdCBlZmlfYmluZGluZyAqZWZpX2NyZWF0ZV9iaW5kaW5nKEVGSV9HVUlEICosIEVGSV9HVUlEICopOworZXh0ZXJuIHZvaWQgZWZpX2Rlc3Ryb3lfYmluZGluZyhzdHJ1Y3QgZWZpX2JpbmRpbmcgKiwgRUZJX0dVSUQgKik7CitpbnQgY29yZV90Y3Bfb3BlbihzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0KQoreworICAgIHN0cnVjdCBlZmlfYmluZGluZyAqYjsKKworICAgIGIgPSBlZmlfY3JlYXRlX2JpbmRpbmcoJlRjcDRTZXJ2aWNlQmluZGluZ1Byb3RvY29sLCAmVGNwNFByb3RvY29sKTsKKyAgICBpZiAoIWIpCisJcmV0dXJuIC0xOworCisgICAgc29ja2V0LT5uZXQuZWZpLmJpbmRpbmcgPSBiOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBFRklBUEkgdm9pZCBudWxsX2NiKEVGSV9FVkVOVCBldiwgdm9pZCAqY29udGV4dCkKK3sKKyAgICBFRklfVENQNF9DT01QTEVUSU9OX1RPS0VOICp0b2tlbiA9IGNvbnRleHQ7CisKKyAgICAodm9pZClldjsKKworICAgIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5DbG9zZUV2ZW50LCAxLCB0b2tlbi0+RXZlbnQpOworfQorCitzdGF0aWMgaW50IHZvbGF0aWxlIGNiX3N0YXR1cyA9IC0xOworc3RhdGljIEVGSUFQSSB2b2lkIHRjcF9jYihFRklfRVZFTlQgZXYsIHZvaWQgKmNvbnRleHQpCit7CisgICAgRUZJX1RDUDRfQ09NUExFVElPTl9UT0tFTiAqdG9rZW4gPSBjb250ZXh0OworCisgICAgKHZvaWQpZXY7CisKKyAgICBpZiAodG9rZW4tPlN0YXR1cyA9PSBFRklfU1VDQ0VTUykKKwljYl9zdGF0dXMgPSAwOworICAgIGVsc2UKKwljYl9zdGF0dXMgPSAxOworfQorCitpbnQgY29yZV90Y3BfY29ubmVjdChzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0LCB1aW50MzJfdCBpcCwgdWludDE2X3QgcG9ydCkKK3sKKyAgICBFRklfVENQNF9DT05ORUNUSU9OX1RPS0VOIHRva2VuOworICAgIEVGSV9UQ1A0X0FDQ0VTU19QT0lOVCAqYXA7CisgICAgRUZJX1RDUDRfQ09ORklHX0RBVEEgdGRhdGE7CisgICAgc3RydWN0IGVmaV9iaW5kaW5nICpiID0gc29ja2V0LT5uZXQuZWZpLmJpbmRpbmc7CisgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisgICAgRUZJX1RDUDQgKnRjcCA9IChFRklfVENQNCAqKWItPnRoaXM7CisgICAgaW50IHJ2ID0gLTE7CisgICAgaW50IHVubWFwcGVkID0gMTsKKyAgICBqaWZmaWVzX3Qgc3RhcnQsIGxhc3QsIGN1cjsKKworICAgIG1lbXNldCgmdGRhdGEsIDAsIHNpemVvZih0ZGF0YSkpOworCisgICAgYXAgPSAmdGRhdGEuQWNjZXNzUG9pbnQ7CisgICAgYXAtPlVzZURlZmF1bHRBZGRyZXNzID0gVFJVRTsKKyAgICBtZW1jcHkoJmFwLT5SZW1vdGVBZGRyZXNzLCAmaXAsIHNpemVvZihpcCkpOworICAgIGFwLT5SZW1vdGVQb3J0ID0gcG9ydDsKKyAgICBhcC0+QWN0aXZlRmxhZyA9IFRSVUU7IC8qIEluaXRpYXRlIGFjdGl2ZSBvcGVuICovCisKKyAgICB0ZGF0YS5UaW1lVG9MaXZlID0gNjQ7CisKKyAgICBsYXN0ID0gc3RhcnQgPSBqaWZmaWVzKCk7CisgICAgd2hpbGUgKHVubWFwcGVkKXsKKwlzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcih0Y3AtPkNvbmZpZ3VyZSwgMiwgdGNwLCAmdGRhdGEpOworCWlmIChzdGF0dXMgIT0gRUZJX05PX01BUFBJTkcpCisJCXVubWFwcGVkID0gMDsKKwllbHNlIHsKKwkgICAgY3VyID0gamlmZmllcygpOworCSAgICBpZiAoIChjdXIgLSBsYXN0KSA+PSBFRklfTk9NQVBfUFJJTlRfREVMQVkgKSB7CisJCWxhc3QgPSBjdXI7CisJCVByaW50KEwiY29yZV90Y3BfY29ubmVjdDogc3RhbGxpbmcgb24gY29uZmlndXJlIHdpdGggbm8gbWFwcGluZ1xuIik7CisJICAgIH0gZWxzZSBpZiAoIChjdXIgLSBzdGFydCkgPiBFRklfTk9NQVBfUFJJTlRfREVMQVkgKiBFRklfTk9NQVBfUFJJTlRfQ09VTlQpIHsKKwkJUHJpbnQoTCJjb3JlX3RjcF9jb25uZWN0OiBhYm9ydGluZyBvbiBubyBtYXBwaW5nXG4iKTsKKwkJdW5tYXBwZWQgPSAwOworCSAgICB9CisJfQorICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCXJldHVybiAtMTsKKworICAgIHN0YXR1cyA9IGVmaV9zZXR1cF9ldmVudCgmdG9rZW4uQ29tcGxldGlvblRva2VuLkV2ZW50LAorCQkJICAgIChFRklfRVZFTlRfTk9USUZZKXRjcF9jYiwgJnRva2VuLkNvbXBsZXRpb25Ub2tlbik7CisgICAgaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwlyZXR1cm4gLTE7CisKKyAgICBzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcih0Y3AtPkNvbm5lY3QsIDIsIHRjcCwgJnRva2VuKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJUHJpbnQoTCJGYWlsZWQgdG8gY29ubmVjdDogJWRcbiIsIHN0YXR1cyk7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgd2hpbGUgKGNiX3N0YXR1cyA9PSAtMSkKKwl1ZWZpX2NhbGxfd3JhcHBlcih0Y3AtPlBvbGwsIDEsIHRjcCk7CisKKyAgICBpZiAoY2Jfc3RhdHVzID09IDApCisJcnYgPSAwOworCisgICAgLyogUmVzZXQgKi8KKyAgICBjYl9zdGF0dXMgPSAtMTsKKworb3V0OgorICAgIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5DbG9zZUV2ZW50LCAxLCB0b2tlbi5Db21wbGV0aW9uVG9rZW4uRXZlbnQpOworICAgIHJldHVybiBydjsKK30KKworYm9vbCBjb3JlX3RjcF9pc19jb25uZWN0ZWQoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCkKK3sKKyAgICBpZiAoc29ja2V0LT5uZXQuZWZpLmJpbmRpbmcpCisJcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludCBjb3JlX3RjcF93cml0ZShzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0LCBjb25zdCB2b2lkICpkYXRhLAorCQkgICBzaXplX3QgbGVuLCBib29sIGNvcHkpCit7CisgICAgRUZJX1RDUDRfVFJBTlNNSVRfREFUQSB0eGRhdGE7CisgICAgRUZJX1RDUDRfRlJBR01FTlRfREFUQSAqZnJhZzsKKyAgICBzdHJ1Y3QgZWZpX2JpbmRpbmcgKmIgPSBzb2NrZXQtPm5ldC5lZmkuYmluZGluZzsKKyAgICBFRklfVENQNF9JT19UT0tFTiBpb3Rva2VuOworICAgIEVGSV9TVEFUVVMgc3RhdHVzOworICAgIEVGSV9UQ1A0ICp0Y3AgPSAoRUZJX1RDUDQgKiliLT50aGlzOworICAgIGludCBydiA9IC0xOworCisgICAgKHZvaWQpY29weTsKKworICAgIG1lbXNldCgmaW90b2tlbiwgMCwgc2l6ZW9mKGlvdG9rZW4pKTsKKyAgICBtZW1zZXQoJnR4ZGF0YSwgMCwgc2l6ZW9mKHR4ZGF0YSkpOworCisgICAgdHhkYXRhLkRhdGFMZW5ndGggPSBsZW47CisgICAgdHhkYXRhLkZyYWdtZW50Q291bnQgPSAxOworCisgICAgZnJhZyA9ICZ0eGRhdGEuRnJhZ21lbnRUYWJsZVswXTsKKyAgICBmcmFnLT5GcmFnbWVudExlbmd0aCA9IGxlbjsKKyAgICBmcmFnLT5GcmFnbWVudEJ1ZmZlciA9ICh2b2lkICopZGF0YTsKKworICAgIGlvdG9rZW4uUGFja2V0LlR4RGF0YSA9ICZ0eGRhdGE7CisKKyAgICBzdGF0dXMgPSBlZmlfc2V0dXBfZXZlbnQoJmlvdG9rZW4uQ29tcGxldGlvblRva2VuLkV2ZW50LAorCQkJICAgICAoRUZJX0VWRU5UX05PVElGWSl0Y3BfY2IsICZpb3Rva2VuLkNvbXBsZXRpb25Ub2tlbik7CisgICAgaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwlyZXR1cm4gLTE7CisKKyAgICBzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcih0Y3AtPlRyYW5zbWl0LCAyLCB0Y3AsICZpb3Rva2VuKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJUHJpbnQoTCJ0Y3AgdHJhbnNtaXQgZmFpbGVkLCAlZFxuIiwgc3RhdHVzKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICB3aGlsZSAoY2Jfc3RhdHVzID09IC0xKQorCXVlZmlfY2FsbF93cmFwcGVyKHRjcC0+UG9sbCwgMSwgdGNwKTsKKworICAgIGlmIChjYl9zdGF0dXMgPT0gMCkKKwlydiA9IDA7CisKKyAgICAvKiBSZXNldCAqLworICAgIGNiX3N0YXR1cyA9IC0xOworCitvdXQ6CisgICAgdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkNsb3NlRXZlbnQsIDEsIGlvdG9rZW4uQ29tcGxldGlvblRva2VuLkV2ZW50KTsKKyAgICByZXR1cm4gcnY7Cit9CisKK3ZvaWQgY29yZV90Y3BfY2xvc2VfZmlsZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworICAgIHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQgPSBQVlQoaW5vZGUpOworICAgIHN0cnVjdCBlZmlfYmluZGluZyAqYiA9IHNvY2tldC0+bmV0LmVmaS5iaW5kaW5nOworICAgIEVGSV9UQ1A0X0NMT1NFX1RPS0VOIHRva2VuOworICAgIEVGSV9TVEFUVVMgc3RhdHVzOworICAgIEVGSV9UQ1A0ICp0Y3AgPSAoRUZJX1RDUDQgKiliLT50aGlzOworCisgIGlmICghc29ja2V0LT50ZnRwX2dvdGVvZikgeworCW1lbXNldCgmdG9rZW4sIDAsIHNpemVvZih0b2tlbikpOworCisJc3RhdHVzID0gZWZpX3NldHVwX2V2ZW50KCZ0b2tlbi5Db21wbGV0aW9uVG9rZW4uRXZlbnQsCisJCQkJIChFRklfRVZFTlRfTk9USUZZKW51bGxfY2IsCisJCQkJICZ0b2tlbi5Db21wbGV0aW9uVG9rZW4pOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJICAgIHJldHVybjsKKworCXN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKHRjcC0+Q2xvc2UsIDIsIHRjcCwgJnRva2VuKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCSAgICBQcmludChMInRjcCBjbG9zZSBmYWlsZWQ6ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKworICAgIGVmaV9kZXN0cm95X2JpbmRpbmcoYiwgJlRjcDRTZXJ2aWNlQmluZGluZ1Byb3RvY29sKTsKKyAgICBzb2NrZXQtPm5ldC5lZmkuYmluZGluZyA9IE5VTEw7Cit9CisKK3N0YXRpYyBjaGFyIGRhdGFidWZbODE5Ml07CisKK3ZvaWQgY29yZV90Y3BfZmlsbF9idWZmZXIoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0ID0gUFZUKGlub2RlKTsKKyAgICBzdHJ1Y3QgZWZpX2JpbmRpbmcgKmIgPSBzb2NrZXQtPm5ldC5lZmkuYmluZGluZzsKKyAgICBFRklfVENQNF9JT19UT0tFTiBpb3Rva2VuOworICAgIEVGSV9UQ1A0X1JFQ0VJVkVfREFUQSByeGRhdGE7CisgICAgRUZJX1RDUDRfRlJBR01FTlRfREFUQSAqZnJhZzsKKyAgICBFRklfU1RBVFVTIHN0YXR1czsKKyAgICBFRklfVENQNCAqdGNwID0gKEVGSV9UQ1A0ICopYi0+dGhpczsKKyAgICB2b2lkICpkYXRhOworICAgIHNpemVfdCBsZW47CisKKyAgICBtZW1zZXQoJmlvdG9rZW4sIDAsIHNpemVvZihpb3Rva2VuKSk7CisgICAgbWVtc2V0KCZyeGRhdGEsIDAsIHNpemVvZihyeGRhdGEpKTsKKworICAgIHN0YXR1cyA9IGVmaV9zZXR1cF9ldmVudCgmaW90b2tlbi5Db21wbGV0aW9uVG9rZW4uRXZlbnQsCisJCSAgICAgIChFRklfRVZFTlRfTk9USUZZKXRjcF9jYiwgJmlvdG9rZW4uQ29tcGxldGlvblRva2VuKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCXJldHVybjsKKworICAgIGlvdG9rZW4uUGFja2V0LlJ4RGF0YSA9ICZyeGRhdGE7CisgICAgcnhkYXRhLkZyYWdtZW50Q291bnQgPSAxOworICAgIHJ4ZGF0YS5EYXRhTGVuZ3RoID0gc2l6ZW9mKGRhdGFidWYpOworICAgIGZyYWcgPSAmcnhkYXRhLkZyYWdtZW50VGFibGVbMF07CisgICAgZnJhZy0+RnJhZ21lbnRCdWZmZXIgPSBkYXRhYnVmOworICAgIGZyYWctPkZyYWdtZW50TGVuZ3RoID0gc2l6ZW9mKGRhdGFidWYpOworCisgICAgc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIodGNwLT5SZWNlaXZlLCAyLCB0Y3AsICZpb3Rva2VuKTsKKyAgICBpZiAoc3RhdHVzID09IEVGSV9DT05ORUNUSU9OX0ZJTikgeworCXNvY2tldC0+dGZ0cF9nb3Rlb2YgPSAxOworCWlmIChpbm9kZS0+c2l6ZSA9PSAodWludDY0X3QpLTEpCisJICAgIGlub2RlLT5zaXplID0gc29ja2V0LT50ZnRwX2ZpbGVwb3M7CisJc29ja2V0LT5vcHMtPmNsb3NlKGlub2RlKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICB3aGlsZSAoY2Jfc3RhdHVzID09IC0xKQorCXVlZmlfY2FsbF93cmFwcGVyKHRjcC0+UG9sbCwgMSwgdGNwKTsKKworICAgIC8qIFJlc2V0ICovCisgICAgY2Jfc3RhdHVzID0gLTE7CisKKyAgICBsZW4gPSBmcmFnLT5GcmFnbWVudExlbmd0aDsKKyAgICBtZW1jcHkoZGF0YWJ1ZiwgZnJhZy0+RnJhZ21lbnRCdWZmZXIsIGxlbik7CisgICAgZGF0YSA9IGRhdGFidWY7CisKKyAgICBzb2NrZXQtPnRmdHBfZGF0YXB0ciA9IGRhdGE7CisgICAgc29ja2V0LT50ZnRwX2ZpbGVwb3MgKz0gbGVuOworICAgIHNvY2tldC0+dGZ0cF9ieXRlc2xlZnQgPSBsZW47CisKK291dDoKKyAgICB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+Q2xvc2VFdmVudCwgMSwgaW90b2tlbi5Db21wbGV0aW9uVG9rZW4uRXZlbnQpOworfQpkaWZmIC0tZ2l0IGEvZWZpL3VkcC5jIGIvZWZpL3VkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMWQwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvdWRwLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEludGVsIENvcnBvcmF0aW9uIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtaW5tYXguaD4KKyNpbmNsdWRlICJlZmkuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJmcy9weGUvcHhlLmgiCisKK2V4dGVybiBFRklfR1VJRCBVZHA0U2VydmljZUJpbmRpbmdQcm90b2NvbCwgVWRwNFByb3RvY29sOworCisvKgorICogVGhpcyBVRFAgYmluZGluZyBpcyBjb25maWd1cmVkIHRvIG9wZXJhdGUgaW4gcHJvbWlzY3VvdXMgbW9kZS4gSXQgaXMKKyAqIG9ubHkgdXNlZCBmb3IgcmVhZGluZyBwYWNrZXRzLiBJdCBoYXMgbm8gYXNzb2NpYXRlZCBzdGF0ZSB1bmxpa2UKKyAqIHNvY2tldC0+bmV0LmVmaS5iaW5kaW5nLCB3aGljaCBoYXMgYSByZW1vdGUgSVAgYWRkcmVzcyBhbmQgcG9ydAorICogbnVtYmVyLgorICovCitzdGF0aWMgc3RydWN0IGVmaV9iaW5kaW5nICp1ZHBfcmVhZGVyOworCisvKiogCisgKiBUcnkgdG8gY29uZmlndXJlIHRoaXMgVURQIHNvY2tldAorICoKKyAqIEBwYXJhbTp1ZHAsIHRoZSBFRklfVURQNCBzb2NrZXQgdG8gY29uZmlndXJlCisgKiBAcGFyYW06dWRhdGEsIHRoZSBFRklfVURQNF9DT05GSUdfREFUQSB0byB1c2UKKyAqIEBwYXJhbTpmLCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYXMgYSB3aWRlIHN0cmluZy4KKyAqCisgKiBAb3V0OiBzdGF0dXMgYXMgRUZJX1NUQVRVUworICovCisKK0VGSV9TVEFUVVMgY29yZV91ZHBfY29uZmlndXJlKEVGSV9VRFA0ICp1ZHAsIEVGSV9VRFA0X0NPTkZJR19EQVRBICp1ZGF0YSwKKwlzaG9ydCB1bnNpZ25lZCBpbnQgKmYpCit7CisgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisgICAgaW50IHVubWFwcGVkID0gMTsKKyAgICBqaWZmaWVzX3Qgc3RhcnQsIGxhc3QsIGN1cjsKKworICAgIGxhc3QgPSBzdGFydCA9IGppZmZpZXMoKTsKKyAgICB3aGlsZSAodW5tYXBwZWQpeworCXN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKHVkcC0+Q29uZmlndXJlLCAyLCB1ZHAsIHVkYXRhKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9OT19NQVBQSU5HKQorCQl1bm1hcHBlZCA9IDA7CisJZWxzZSB7CisJICAgIGN1ciA9IGppZmZpZXMoKTsKKwkgICAgaWYgKCAoY3VyIC0gbGFzdCkgPj0gRUZJX05PTUFQX1BSSU5UX0RFTEFZICkgeworCQlsYXN0ID0gY3VyOworCQlQcmludChMIiVzOiBzdGFsbGluZyBvbiBjb25maWd1cmUgd2l0aCBubyBtYXBwaW5nXG4iLCBmKTsKKwkgICAgfSBlbHNlIGlmICggKGN1ciAtIHN0YXJ0KSA+IEVGSV9OT01BUF9QUklOVF9ERUxBWSAqIEVGSV9OT01BUF9QUklOVF9DT1VOVCkgeworCQlQcmludChMIiVzOiBhYm9ydGluZyBvbiBubyBtYXBwaW5nXG4iLCBmKTsKKwkJdW5tYXBwZWQgPSAwOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIE9wZW4gYSBzb2NrZXQKKyAqCisgKiBAcGFyYW06c29ja2V0LCB0aGUgc29ja2V0IHRvIG9wZW4KKyAqCisgKiBAb3V0OiBlcnJvciBjb2RlLCAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNvcmVfdWRwX29wZW4oc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCkKK3sKKyAgICBFRklfVURQNF9DT05GSUdfREFUQSB1ZGF0YTsKKyAgICBzdHJ1Y3QgZWZpX2JpbmRpbmcgKmI7CisgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisgICAgRUZJX1VEUDQgKnVkcDsKKworICAgICh2b2lkKXNvY2tldDsKKworICAgIHVkcF9yZWFkZXIgPSBlZmlfY3JlYXRlX2JpbmRpbmcoJlVkcDRTZXJ2aWNlQmluZGluZ1Byb3RvY29sLCAmVWRwNFByb3RvY29sKTsKKyAgICBpZiAoIXVkcF9yZWFkZXIpCisJcmV0dXJuIC0xOworCisgICAgYiA9IGVmaV9jcmVhdGVfYmluZGluZygmVWRwNFNlcnZpY2VCaW5kaW5nUHJvdG9jb2wsICZVZHA0UHJvdG9jb2wpOworICAgIGlmICghYikKKwlnb3RvIGJhaWw7CisKKyAgICB1ZHAgPSAoRUZJX1VEUDQgKil1ZHBfcmVhZGVyLT50aGlzOworCisgICAgbWVtc2V0KCZ1ZGF0YSwgMCwgc2l6ZW9mKHVkYXRhKSk7CisKKyAgICBzdGF0dXMgPSBjb3JlX3VkcF9jb25maWd1cmUodWRwLCAmdWRhdGEsIEwiY29yZV91ZHBfb3BlbiIpOworICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJZ290byBiYWlsOworCisgICAgc29ja2V0LT5uZXQuZWZpLmJpbmRpbmcgPSBiOworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSByYW5kb20gbG9jYWwgcG9ydCBudW1iZXIgdGhhdCB0aGUgVURQdjQgUHJvdG9jb2wKKyAgICAgKiBEcml2ZXIgcGlja2VkIGZvciB1cy4gVGhlIFRGVFAgcHJvdG9jb2wgdXNlcyB0aGUgbG9jYWwgcG9ydAorICAgICAqIG51bWJlciBhcyB0aGUgVElELgorICAgICAqLworICAgIHN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKHVkcC0+R2V0TW9kZURhdGEsIDUsIHVkcCwKKwkJCSAgICAgICAmdWRhdGEsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJUHJpbnQoTCJGYWlsZWQgdG8gZ2V0IFVEUCBtb2RlIGRhdGE6ICVkXG4iLCBzdGF0dXMpOworICAgIGVsc2UKKwlzb2NrZXQtPm5ldC5lZmkubG9jYWxwb3J0ID0gdWRhdGEuU3RhdGlvblBvcnQ7CisKKyAgICByZXR1cm4gMDsKKworYmFpbDoKKyAgICBpZiAoYikKKwllZmlfZGVzdHJveV9iaW5kaW5nKGIsICZVZHA0U2VydmljZUJpbmRpbmdQcm90b2NvbCk7CisKKyAgICBlZmlfZGVzdHJveV9iaW5kaW5nKHVkcF9yZWFkZXIsICZVZHA0U2VydmljZUJpbmRpbmdQcm90b2NvbCk7CisgICAgdWRwX3JlYWRlciA9IE5VTEw7CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qKgorICogQ2xvc2UgYSBzb2NrZXQKKyAqCisgKiBAcGFyYW06c29ja2V0LCB0aGUgc29ja2V0IHRvIG9wZW4KKyAqLwordm9pZCBjb3JlX3VkcF9jbG9zZShzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0KQoreworICAgIGVmaV9kZXN0cm95X2JpbmRpbmcodWRwX3JlYWRlciwgJlVkcDRTZXJ2aWNlQmluZGluZ1Byb3RvY29sKTsKKyAgICB1ZHBfcmVhZGVyID0gTlVMTDsKKworICAgIGlmICghc29ja2V0LT5uZXQuZWZpLmJpbmRpbmcpCisJcmV0dXJuOworCisgICAgZWZpX2Rlc3Ryb3lfYmluZGluZyhzb2NrZXQtPm5ldC5lZmkuYmluZGluZywgJlVkcDRTZXJ2aWNlQmluZGluZ1Byb3RvY29sKTsKKyAgICBzb2NrZXQtPm5ldC5lZmkuYmluZGluZyA9IE5VTEw7Cit9CisKKy8qKgorICogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiBvbiBhbiBvcGVuIHNvY2tldAorICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBvcGVuIHNvY2tldAorICogQHBhcmFtOmlwLCB0aGUgaXAgYWRkcmVzcworICogQHBhcmFtOnBvcnQsIHRoZSBwb3J0IG51bWJlciwgaG9zdC1ieXRlIG9yZGVyCisgKi8KK3ZvaWQgY29yZV91ZHBfY29ubmVjdChzdHJ1Y3QgcHhlX3B2dF9pbm9kZSAqc29ja2V0LCB1aW50MzJfdCBpcCwKKwkJICAgICAgdWludDE2X3QgcG9ydCkKK3sKKyAgICBFRklfVURQNF9DT05GSUdfREFUQSB1ZGF0YTsKKyAgICBFRklfU1RBVFVTIHN0YXR1czsKKyAgICBFRklfVURQNCAqdWRwOworCisgICAgdWRwID0gKEVGSV9VRFA0ICopc29ja2V0LT5uZXQuZWZpLmJpbmRpbmctPnRoaXM7CisKKyAgICBtZW1zZXQoJnVkYXRhLCAwLCBzaXplb2YodWRhdGEpKTsKKworICAgIC8qIFJlLXVzZSB0aGUgZXhpc3RpbmcgbG9jYWwgcG9ydCBudW1iZXIgKi8KKyAgICB1ZGF0YS5TdGF0aW9uUG9ydCA9IHNvY2tldC0+bmV0LmVmaS5sb2NhbHBvcnQ7CisKKyAgICB1ZGF0YS5Vc2VEZWZhdWx0QWRkcmVzcyA9IFRSVUU7CisgICAgbWVtY3B5KCZ1ZGF0YS5SZW1vdGVBZGRyZXNzLCAmaXAsIHNpemVvZihpcCkpOworICAgIHVkYXRhLlJlbW90ZVBvcnQgPSBwb3J0OworICAgIHVkYXRhLkFjY2VwdFByb21pc2N1b3VzID0gVFJVRTsKKyAgICB1ZGF0YS5UaW1lVG9MaXZlID0gNjQ7CisKKyAgICBzdGF0dXMgPSBjb3JlX3VkcF9jb25maWd1cmUodWRwLCAmdWRhdGEsIEwiY29yZV91ZHBfY29ubmVjdCIpOworICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwlQcmludChMIkZhaWxlZCB0byBjb25maWd1cmUgVURQOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm47CisgICAgfQorfQorCisvKioKKyAqIFRlYXIgZG93biBhIGNvbm5lY3Rpb24gb24gYW4gb3BlbiBzb2NrZXQKKyAqCisgKiBAcGFyYW06c29ja2V0LCB0aGUgb3BlbiBzb2NrZXQKKyAqLwordm9pZCBjb3JlX3VkcF9kaXNjb25uZWN0KHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQpCit7CisgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisgICAgRUZJX1VEUDQgKnVkcDsKKworICAgIHVkcCA9IChFRklfVURQNCAqKXNvY2tldC0+bmV0LmVmaS5iaW5kaW5nLT50aGlzOworCisgICAgLyogUmVzZXQgKi8KKyAgICBzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcih1ZHAtPkNvbmZpZ3VyZSwgMiwgdWRwLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCVByaW50KEwiRmFpbGVkIHRvIHJlc2V0IFVEUDogJWRcbiIsIHN0YXR1cyk7CisKK30KKworc3RhdGljIGludCB2b2xhdGlsZSBjYl9zdGF0dXMgPSAtMTsKK3N0YXRpYyBFRklBUEkgdm9pZCB1ZHA0X2NiKEVGSV9FVkVOVCBldmVudCwgdm9pZCAqY29udGV4dCkKK3sKKyAgICAodm9pZClldmVudDsKKworICAgIEVGSV9VRFA0X0NPTVBMRVRJT05fVE9LRU4gKnRva2VuID0gY29udGV4dDsKKworICAgIGlmICh0b2tlbi0+U3RhdHVzID09IEVGSV9TVUNDRVNTKQorCWNiX3N0YXR1cyA9IDA7CisgICAgZWxzZQorCWNiX3N0YXR1cyA9IDE7Cit9CisKKy8qKgorICogUmVhZCBkYXRhIGZyb20gdGhlIG5ldHdvcmsgc3RhY2sKKyAqCisgKiBAcGFyYW06c29ja2V0LCB0aGUgb3BlbiBzb2NrZXQKKyAqIEBwYXJhbTpidWYsIGxvY2F0aW9uIG9mIGJ1ZmZlciB0byBzdG9yZSBkYXRhCisgKiBAcGFyYW06YnVmX2xlbiwgc2l6ZSBvZiBidWZmZXIKKworICogQG91dDogc3JjX2lwLCBpcCBhZGRyZXNzIG9mIHRoZSBkYXRhIHNvdXJjZQorICogQG91dDogc3JjX3BvcnQsIHBvcnQgbnVtYmVyIG9mIHRoZSBkYXRhIHNvdXJjZSwgaG9zdC1ieXRlIG9yZGVyCisgKi8KK2ludCBjb3JlX3VkcF9yZWN2KHN0cnVjdCBweGVfcHZ0X2lub2RlICpzb2NrZXQsIHZvaWQgKmJ1ZiwgdWludDE2X3QgKmJ1Zl9sZW4sCisJCSAgdWludDMyX3QgKnNyY19pcCwgdWludDE2X3QgKnNyY19wb3J0KQoreworICAgIEVGSV9VRFA0X0NPTVBMRVRJT05fVE9LRU4gdG9rZW47CisgICAgRUZJX1VEUDRfRlJBR01FTlRfREFUQSAqZnJhZzsKKyAgICBFRklfVURQNF9SRUNFSVZFX0RBVEEgKnJ4ZGF0YTsKKyAgICBzdHJ1Y3QgZWZpX2JpbmRpbmcgKmI7CisgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisgICAgRUZJX1VEUDQgKnVkcDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpbnQgcnYgPSAtMTsKKyAgICBqaWZmaWVzX3Qgc3RhcnQ7CisKKyAgICAodm9pZClzb2NrZXQ7CisKKyAgICBiID0gdWRwX3JlYWRlcjsKKyAgICB1ZHAgPSAoRUZJX1VEUDQgKiliLT50aGlzOworICAgIG1lbXNldCgmdG9rZW4sIDAsIHNpemVvZih0b2tlbikpOworCisgICAgc3RhdHVzID0gZWZpX3NldHVwX2V2ZW50KCZ0b2tlbi5FdmVudCwgKEVGSV9FVkVOVF9OT1RJRlkpdWRwNF9jYiwKKwkJCSAgICAgJnRva2VuKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCXJldHVybiAtMTsKKworICAgIHN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKHVkcC0+UmVjZWl2ZSwgMiwgdWRwLCAmdG9rZW4pOworICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJZ290byBiYWlsOworCisgICAgc3RhcnQgPSBqaWZmaWVzKCk7CisgICAgd2hpbGUgKGNiX3N0YXR1cyA9PSAtMSkgeworCS8qIDE1bXMgcmVjZWl2ZSB0aW1lb3V0Li4uICovCisJaWYgKGppZmZpZXMoKSAtIHN0YXJ0ID49IDE1KSB7CisJICAgIGlmIChqaWZmaWVzKCkgLSBzdGFydCA+PSAzMCkKKwkJZHByaW50ZigiRmFpbGVkIHRvIGNhbmNlbCBVRFBcbiIpOworCisJICAgIHVlZmlfY2FsbF93cmFwcGVyKHVkcC0+Q2FuY2VsLCAyLCB1ZHAsICZ0b2tlbik7CisJICAgIGRwcmludGYoImNvcmVfdWRwX3JlY3Y6IHRpbWVkIG91dFxuIik7CisJfQorCisJdWVmaV9jYWxsX3dyYXBwZXIodWRwLT5Qb2xsLCAxLCB1ZHApOworICAgIH0KKworICAgIGlmIChjYl9zdGF0dXMgPT0gMCkKKwlydiA9IDA7CisKKyAgICAvKiBSZXNldCAqLworICAgIGNiX3N0YXR1cyA9IC0xOworCisgICAgaWYgKHJ2KQorCWdvdG8gYmFpbDsKKworICAgIHJ4ZGF0YSA9IHRva2VuLlBhY2tldC5SeERhdGE7CisgICAgZnJhZyA9ICZyeGRhdGEtPkZyYWdtZW50VGFibGVbMF07CisKKyAgICBzaXplID0gbWluKGZyYWctPkZyYWdtZW50TGVuZ3RoLCAqYnVmX2xlbik7CisgICAgbWVtY3B5KGJ1ZiwgZnJhZy0+RnJhZ21lbnRCdWZmZXIsIHNpemUpOworICAgICpidWZfbGVuID0gc2l6ZTsKKworICAgIG1lbWNweShzcmNfcG9ydCwgJnJ4ZGF0YS0+VWRwU2Vzc2lvbi5Tb3VyY2VQb3J0LCBzaXplb2YoKnNyY19wb3J0KSk7CisgICAgbWVtY3B5KHNyY19pcCwgJnJ4ZGF0YS0+VWRwU2Vzc2lvbi5Tb3VyY2VBZGRyZXNzLCBzaXplb2YoKnNyY19pcCkpOworCisgICAgdWVmaV9jYWxsX3dyYXBwZXIoQlMtPlNpZ25hbEV2ZW50LCAxLCByeGRhdGEtPlJlY3ljbGVTaWduYWwpOworCitiYWlsOgorICAgIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5DbG9zZUV2ZW50LCAxLCB0b2tlbi5FdmVudCk7CisgICAgcmV0dXJuIHJ2OworfQorCisvKioKKyAqIFNlbmQgYSBVRFAgcGFja2V0LgorICoKKyAqIEBwYXJhbTpzb2NrZXQsIHRoZSBvcGVuIHNvY2tldAorICogQHBhcmFtOmRhdGEsIGRhdGEgYnVmZmVyIHRvIHNlbmQKKyAqIEBwYXJhbTpsZW4sIHNpemUgb2YgZGF0YSBidWZlcgorICovCit2b2lkIGNvcmVfdWRwX3NlbmQoc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKyAgICBFRklfVURQNF9DT01QTEVUSU9OX1RPS0VOICp0b2tlbjsKKyAgICBFRklfVURQNF9UUkFOU01JVF9EQVRBICp0eGRhdGE7CisgICAgRUZJX1VEUDRfRlJBR01FTlRfREFUQSAqZnJhZzsKKyAgICBzdHJ1Y3QgZWZpX2JpbmRpbmcgKmIgPSBzb2NrZXQtPm5ldC5lZmkuYmluZGluZzsKKyAgICBFRklfU1RBVFVTIHN0YXR1czsKKyAgICBFRklfVURQNCAqdWRwID0gKEVGSV9VRFA0ICopYi0+dGhpczsKKworICAgIHRva2VuID0gemFsbG9jKHNpemVvZigqdG9rZW4pKTsKKyAgICBpZiAoIXRva2VuKQorCXJldHVybjsKKworICAgIHR4ZGF0YSA9IHphbGxvYyhzaXplb2YoKnR4ZGF0YSkpOworICAgIGlmICghdHhkYXRhKSB7CisJZnJlZSh0b2tlbik7CisJcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IGVmaV9zZXR1cF9ldmVudCgmdG9rZW4tPkV2ZW50LCAoRUZJX0VWRU5UX05PVElGWSl1ZHA0X2NiLAorCQkJICAgICB0b2tlbik7CisgICAgaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwlnb3RvIGJhaWw7CisKKyAgICB0eGRhdGEtPkRhdGFMZW5ndGggPSBsZW47CisgICAgdHhkYXRhLT5GcmFnbWVudENvdW50ID0gMTsKKyAgICBmcmFnID0gJnR4ZGF0YS0+RnJhZ21lbnRUYWJsZVswXTsKKworICAgIGZyYWctPkZyYWdtZW50TGVuZ3RoID0gbGVuOworICAgIGZyYWctPkZyYWdtZW50QnVmZmVyID0gKHZvaWQgKilkYXRhOworCisgICAgdG9rZW4tPlBhY2tldC5UeERhdGEgPSB0eGRhdGE7CisKKyAgICBzdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcih1ZHAtPlRyYW5zbWl0LCAyLCB1ZHAsIHRva2VuKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCWdvdG8gY2xvc2U7CisKKyAgICB3aGlsZSAoY2Jfc3RhdHVzID09IC0xKQorCXVlZmlfY2FsbF93cmFwcGVyKHVkcC0+UG9sbCwgMSwgdWRwKTsKKworICAgIC8qIFJlc2V0ICovCisgICAgY2Jfc3RhdHVzID0gLTE7CisKK2Nsb3NlOgorICAgIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5DbG9zZUV2ZW50LCAxLCB0b2tlbi0+RXZlbnQpOworCitiYWlsOgorICAgIGZyZWUodHhkYXRhKTsKKyAgICBmcmVlKHRva2VuKTsKK30KKworLyoqCisgKiBTZW5kIGEgVURQIHBhY2tldCB0byBhIGRlc3RpbmF0aW9uCisgKgorICogQHBhcmFtOnNvY2tldCwgdGhlIG9wZW4gc29ja2V0CisgKiBAcGFyYW06ZGF0YSwgZGF0YSBidWZmZXIgdG8gc2VuZAorICogQHBhcmFtOmxlbiwgc2l6ZSBvZiBkYXRhIGJ1ZmVyCisgKiBAcGFyYW06aXAsIHRoZSBpcCBhZGRyZXNzCisgKiBAcGFyYW06cG9ydCwgdGhlIHBvcnQgbnVtYmVyLCBob3N0LWJ5dGUgb3JkZXIKKyAqLwordm9pZCBjb3JlX3VkcF9zZW5kdG8oc3RydWN0IHB4ZV9wdnRfaW5vZGUgKnNvY2tldCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJICAgICBzaXplX3QgbGVuLCB1aW50MzJfdCBpcCwgdWludDE2X3QgcG9ydCkKK3sKKyAgICBFRklfVURQNF9DT01QTEVUSU9OX1RPS0VOICp0b2tlbjsKKyAgICBFRklfVURQNF9UUkFOU01JVF9EQVRBICp0eGRhdGE7CisgICAgRUZJX1VEUDRfRlJBR01FTlRfREFUQSAqZnJhZzsKKyAgICBFRklfVURQNF9DT05GSUdfREFUQSB1ZGF0YTsKKyAgICBFRklfU1RBVFVTIHN0YXR1czsKKyAgICBzdHJ1Y3QgZWZpX2JpbmRpbmcgKmI7CisgICAgRUZJX1VEUDQgKnVkcDsKKworICAgICh2b2lkKXNvY2tldDsKKworICAgIGIgPSBlZmlfY3JlYXRlX2JpbmRpbmcoJlVkcDRTZXJ2aWNlQmluZGluZ1Byb3RvY29sLCAmVWRwNFByb3RvY29sKTsKKyAgICBpZiAoIWIpCisJcmV0dXJuOworCisgICAgdWRwID0gKEVGSV9VRFA0ICopYi0+dGhpczsKKworICAgIHRva2VuID0gemFsbG9jKHNpemVvZigqdG9rZW4pKTsKKyAgICBpZiAoIXRva2VuKQorCWdvdG8gb3V0OworCisgICAgdHhkYXRhID0gemFsbG9jKHNpemVvZigqdHhkYXRhKSk7CisgICAgaWYgKCF0eGRhdGEpCisJZ290byBiYWlsOworCisgICAgbWVtc2V0KCZ1ZGF0YSwgMCwgc2l6ZW9mKHVkYXRhKSk7CisKKyAgICAvKiBSZS11c2UgdGhlIGV4aXN0aW5nIGxvY2FsIHBvcnQgbnVtYmVyICovCisgICAgdWRhdGEuU3RhdGlvblBvcnQgPSBzb2NrZXQtPm5ldC5lZmkubG9jYWxwb3J0OworCisgICAgdWRhdGEuVXNlRGVmYXVsdEFkZHJlc3MgPSBUUlVFOworICAgIG1lbWNweSgmdWRhdGEuUmVtb3RlQWRkcmVzcywgJmlwLCBzaXplb2YoaXApKTsKKyAgICB1ZGF0YS5SZW1vdGVQb3J0ID0gcG9ydDsKKyAgICB1ZGF0YS5BY2NlcHRQcm9taXNjdW91cyA9IFRSVUU7CisgICAgdWRhdGEuVGltZVRvTGl2ZSA9IDY0OworCisgICAgc3RhdHVzID0gY29yZV91ZHBfY29uZmlndXJlKHVkcCwgJnVkYXRhLCBMImNvcmVfdWRwX3NlbmR0byIpOworICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJZ290byBiYWlsOworCisgICAgc3RhdHVzID0gZWZpX3NldHVwX2V2ZW50KCZ0b2tlbi0+RXZlbnQsIChFRklfRVZFTlRfTk9USUZZKXVkcDRfY2IsCisJCQkgICAgIHRva2VuKTsKKyAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCWdvdG8gYmFpbDsKKworICAgIHR4ZGF0YS0+RGF0YUxlbmd0aCA9IGxlbjsKKyAgICB0eGRhdGEtPkZyYWdtZW50Q291bnQgPSAxOworICAgIGZyYWcgPSAmdHhkYXRhLT5GcmFnbWVudFRhYmxlWzBdOworCisgICAgZnJhZy0+RnJhZ21lbnRMZW5ndGggPSBsZW47CisgICAgZnJhZy0+RnJhZ21lbnRCdWZmZXIgPSAodm9pZCAqKWRhdGE7CisKKyAgICB0b2tlbi0+UGFja2V0LlR4RGF0YSA9IHR4ZGF0YTsKKworICAgIHN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKHVkcC0+VHJhbnNtaXQsIDIsIHVkcCwgdG9rZW4pOworICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJZ290byBjbG9zZTsKKworICAgIHdoaWxlIChjYl9zdGF0dXMgPT0gLTEpCisJdWVmaV9jYWxsX3dyYXBwZXIodWRwLT5Qb2xsLCAxLCB1ZHApOworCisgICAgLyogUmVzZXQgKi8KKyAgICBjYl9zdGF0dXMgPSAtMTsKKworY2xvc2U6CisgICAgdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkNsb3NlRXZlbnQsIDEsIHRva2VuLT5FdmVudCk7CisKK2JhaWw6CisgICAgZnJlZSh0eGRhdGEpOworICAgIGZyZWUodG9rZW4pOworb3V0OgorICAgIGVmaV9kZXN0cm95X2JpbmRpbmcoYiwgJlVkcDRTZXJ2aWNlQmluZGluZ1Byb3RvY29sKTsKK30KZGlmZiAtLWdpdCBhL2VmaS92ZXNhLmMgYi9lZmkvdmVzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YTU0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvdmVzYS5jCkBAIC0wLDAgKzEsMzEwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMTk5OS0yMDEyIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDaGFuZHJhbW91bGkgTmFyYXlhbmFuIC0gZXh0ZW5kZWQgZm9yIEVGSSBzdXBwb3J0CisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGNvbTMyLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2ZwdS5oPgorI2luY2x1ZGUgPHN5c2xpbnV4L3ZpZGVvLmg+CisjaW5jbHVkZSA8ZHByaW50Zi5oPgorI2luY2x1ZGUgImVmaS5oIgorLyogV2UgdXNlIGNwODY1Xzh4MTYucHNmIGFzIHRoZSBzdGFuZGFyZCBmb250IGZvciBFRkkgaW1wbGVtZW50YXRpb24KKyAqIHRoZSBoZWFkZXIgZmlsZSBiZWxvdyBjb250YWlucyByYXcgZGF0YSBwYXJzZWQgZnJvbSBjcDg2NV84eDE2LnBzZgorICovCisjaW5jbHVkZSAiY3A4NjVfOHgxNi5oIgorI2luY2x1ZGUgInN5cy92ZXNhL3Zlc2EuaCIKKyNpbmNsdWRlICJzeXMvdmVzYS92aWRlby5oIgorI2luY2x1ZGUgInN5cy92ZXNhL2ZpbGwuaCIKKyNpbmNsdWRlICJzeXMvdmVzYS9kZWJ1Zy5oIgorCisvKiBFRkkgR09QIHN1cHBvcnQKKyAqIE5vdGUgR09QIHN1cHBvcnQgdXNlcyB0aGUgVkVTQSBpbmZvIHN0cnVjdHVyZSBhcyBtdWNoIGFzIHBvc3NpYmxlIGFuZAorICogZXh0ZW5kcyBpdCBhcyBuZWVkZWQgZm9yIEVGSSBzdXBwb3J0LiBOb3QgYWxsIG9mIHRoZSB2ZXNhIGluZm8gc3RydWN0dXJlCisgKiBpcyBwb3B1bGF0ZWQuIENhcmUgbXVzdCBiZSB0YWtlbiBpbiB0aGUgcm91dGluZXMgdGhhdCByZWx5IHRoZSB2ZXNhCisgKiBpbmZvcm1hdGFpb24gc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGZpbmRfcGl4bWFza19iaXRzKHVpbnQzMl90IG1hc2ssIHVpbnQ4X3QgKmZpcnN0X2JpdCwgdWludDhfdCAqbGVuKSB7CisgICAgdWludDhfdCBiaXRfcG9zID0gMCwgYml0X2xlbiA9IDA7CisKKyAgICAqZmlyc3RfYml0ID0gMDsKKyAgICAqbGVuID0gMDsKKyAgICBpZiAobWFzayA9PSAwKQorCXJldHVybjsKKyAgICB3aGlsZSAoIShtYXNrICYgMHgxKSkgeworCW1hc2sgPSBtYXNrID4+IDE7CisJYml0X3BvcysrOworICAgIH0KKyAgICB3aGlsZSAobWFzayAmIDB4MSkgeworCW1hc2sgPSBtYXNrID4+IDE7CisJYml0X2xlbisrOworICAgIH0KKyAgICAqZmlyc3RfYml0ID0gYml0X3BvczsKKyAgICAqbGVuID0gYml0X2xlbjsKK30KKwordW5zaWduZWQgbG9uZyBsZmJfc2l6ZTsKK3VpbnQxNl90IGxmYl9saW5lX3NpemU7Cit1aW50OF90IGxmYl9yc2l6ZTsKK3VpbnQ4X3QgbGZiX2dzaXplOwordWludDhfdCBsZmJfYnNpemU7Cit1aW50OF90IGxmYl9yZXN2X3NpemU7CisKK3N0YXRpYyBpbnQgZWZpX3Zlc2Fjb25fc2V0X21vZGUoc3RydWN0IHZlc2FfaW5mbyAqdmVzYV9pbmZvLCBpbnQgKngsIGludCAqeSwKKwkJCQllbnVtIHZlc2FfcGl4ZWxfZm9ybWF0ICpiZXN0cHhmKQoreworICAgIEVGSV9HVUlEIEdyYXBoaWNzT3V0cHV0UHJvdG9jb2xHdWlkID0gRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTF9HVUlEOworICAgIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0wgKkdyYXBoaWNzT3V0cHV0ID0gTlVMTDsKKyAgICBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX01PREUgKmdvcF9tb2RlOworICAgIEVGSV9HUkFQSElDU19PVVRQVVRfTU9ERV9JTkZPUk1BVElPTiAqbW9kZV9pbmZvOworICAgIEVGSV9TVEFUVVMgc3Q7CisgICAgVUlOVDMyIG1vZGVfbnVtID0gMCwgYmVzdG1vZGU7CisgICAgQk9PTEVBTiBtb2RlX21hdGNoID0gRkFMU0U7CisgICAgVUlOVE4gc3pfaW5mbzsKKyAgICBzdHJ1Y3QgdmVzYV9pbmZvICp2aTsKKyAgICBzdHJ1Y3QgdmVzYV9tb2RlX2luZm8gKm1pOworICAgIGludCBlcnIgPSAwOworCisgICAgLy9kZWJ1ZygiSGVsbG8sIFdvcmxkIVxyXG4iKTsKKyAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBhc3N1bWUgdGhhdCBnbnUtZWZpIGxpYnJhcnkgaXMgaW5pdGlhbGl6ZWQgKi8KKyAgICBzdCA9IExpYkxvY2F0ZVByb3RvY29sKCZHcmFwaGljc091dHB1dFByb3RvY29sR3VpZCwgKFZPSUQgKiopICZHcmFwaGljc091dHB1dCk7CisgICAgaWYgKEVGSV9FUlJPUihzdCkpIHsKKwlkZWJ1ZygiTGlibG9jYXRlUHJvdG9jb2wgZm9yIEdPUCBmYWlsZWQgJWRcbiIsIHN0KTsKKwlyZXR1cm4gMTsgLyogZnVuY3Rpb24gY2FsbCBmYWlsZWQgKi8KKyAgICB9CisKKyAgICAvKiBXZSB1c2UgdGhlIFZFU0EgaW5mbyBzdHJ1Y3R1cmUgdG8gc3RvcmUgcmVsZXZhbnQgR09QIGluZm8gYXMgbXVjaCBhcyBwb3NzaWJsZSAqLworICAgIGdvcF9tb2RlID0gR3JhcGhpY3NPdXRwdXQtPk1vZGU7CisKKyAgICBtb2RlX2luZm8gPSBnb3BfbW9kZS0+SW5mbzsKKyAgICBkcHJpbnRmKCJtb2RlICVkIHZlcnNpb24gJWQgcGl4bGZtdCAlZCBocmVzPSVkIHZyZXM9JWRcbiIsIG1vZGVfbnVtLCAKKwkJCW1vZGVfaW5mby0+VmVyc2lvbiwgbW9kZV9pbmZvLT5QaXhlbEZvcm1hdCwKKwkJCW1vZGVfaW5mby0+SG9yaXpvbnRhbFJlc29sdXRpb24sIG1vZGVfaW5mby0+VmVydGljYWxSZXNvbHV0aW9uKTsKKyAgICAKKyAgICAvKiBzaW1wbHkgcGljayB0aGUgYmVzdCBtb2RlIHRoYXQgc3VpdHMgdGhlIGNhbGxlcidzIHJlc29sdXRpb24gKi8KKyAgICBmb3IgKG1vZGVfbnVtID0gMDsgbW9kZV9udW0gPCBnb3BfbW9kZS0+TWF4TW9kZTsgbW9kZV9udW0rKykgeworCXN0ID0gdWVmaV9jYWxsX3dyYXBwZXIoR3JhcGhpY3NPdXRwdXQtPlF1ZXJ5TW9kZSwgNCwgR3JhcGhpY3NPdXRwdXQsIG1vZGVfbnVtLCAmc3pfaW5mbywgJm1vZGVfaW5mbyk7CisJZGVidWcoIm1vZGVfbnVtID0gJWQgcXVlcnlfc3RhdHVzICVkXG4iLCBtb2RlX251bSwgc3QpOworCWlmIChzdCA9PSBFRklfU1VDQ0VTUyAmJiBzel9pbmZvID49IHNpemVvZihFRklfR1JBUEhJQ1NfT1VUUFVUX01PREVfSU5GT1JNQVRJT04pKSB7CisKKwkJLyogRm9yIG5vdywgc2ltcGx5IHBpY2sgdGhlIGJlc3QgbW9kZSB0aGF0IHN1aXRzIGNhbGxlcidzIHJlc29sdXRpb24gKHgseSkKKwkJICogRklYTUU6IENvbnNpZGVyIGFueSBhZGRpdGlvbmFsIGNyaXRlcmlhIGZvciBtYXRjaGluZyBtb2RlCisJCSAqLworCQltb2RlX21hdGNoID0gKCh1aW50MzJfdCkqeCA9PSBtb2RlX2luZm8tPkhvcml6b250YWxSZXNvbHV0aW9uICYmICh1aW50MzJfdCkqeSA9PSBtb2RlX2luZm8tPlZlcnRpY2FsUmVzb2x1dGlvbik7CisJCWRlYnVnKCJtb2RlICVkIGhyZXM9JWQgdnJlcz0lZFxuIiwgbW9kZV9udW0sIG1vZGVfaW5mby0+SG9yaXpvbnRhbFJlc29sdXRpb24sIG1vZGVfaW5mby0+VmVydGljYWxSZXNvbHV0aW9uKTsKKwkJaWYgKG1vZGVfbWF0Y2gpIHsKKwkJCWJlc3Rtb2RlID0gbW9kZV9udW07CisJCQlicmVhazsKKwkJfQorCX0KKyAgICB9CisKKyAgICBpZiAoIW1vZGVfbWF0Y2gpIHsKKwkvKiBJbnN0ZWFkIG9mIGJhaWxpbmcgb3V0LCBzZXQgdGhlIG1vZGUgdG8gdGhlIHN5c3RlbSBkZWZhdWx0LgorIAkgKiBTb21lIHN5c3RlbXMgZG8gbm90IGhhdmUgc3VwcG9ydCBmb3IgNjQweDQ4MCBmb3IgaW5zdGFuY2UKKyAJICogVGhpcyBjb2RlIGRlYWxzIHdpdGggc3VjaCBjYXNlcy4KKyAJICovCisJbW9kZV9pbmZvID0gZ29wX21vZGUtPkluZm87CisJKnggPSBtb2RlX2luZm8tPkhvcml6b250YWxSZXNvbHV0aW9uOworCSp5ID0gbW9kZV9pbmZvLT5WZXJ0aWNhbFJlc29sdXRpb247CisJYmVzdG1vZGUgPSBnb3BfbW9kZS0+TW9kZTsKKwlkZWJ1ZygiTm8gbWF0Y2hpbmcgbW9kZSwgc2V0dGluZyB0byBhdmFpbGFibGUgZGVmYXVsdCBtb2RlICVkICh4PSVkLCB5PSVkKVxuIiwgYmVzdG1vZGUsICp4LCAqeSk7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgc3BhY2UgaW4gdGhlIGJvdW5jZSBidWZmZXIgZm9yIHRoZXNlIHN0cnVjdHVyZXMgKi8KKyAgICB2aSA9IG1hbGxvYyhzaXplb2YoKnZpKSk7CisgICAgaWYgKCF2aSkgeworCWVyciA9IDEwOwkJLyogT3V0IG9mIG1lbW9yeSAqLworCWdvdG8gZXhpdDsKKyAgICB9CisgICAgLyogTm90ZSB0aGF0IHRoZSBnZW5lcmljIGluZm8gaXMgdW50b3VjaGVkIGFzIHdlIGRvbid0IGZpbmQgYW55IHJlbGV2YW5jZSB0byBFRkkgKi8KKyAgICBtaSA9ICZ2aS0+bWk7CisgICAgLyogU2V0IHVwIG1vZGUtc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKyAgICBtaS0+aF9yZXMgPSAqeDsKKyAgICBtaS0+dl9yZXMgPSAqeTsKKyAgICBtaS0+bGZiX3B0ciA9ICh1aW50OF90ICopKFZPSUQgKikoVUlOVE4pZ29wX21vZGUtPkZyYW1lQnVmZmVyQmFzZTsKKyAgICBsZmJfc2l6ZSA9IGdvcF9tb2RlLT5GcmFtZUJ1ZmZlclNpemU7CisKKyAgICAvKiBGSVhNRTogCisgICAgICogVGhlIGNvZGUgYmVsb3cgdHJlYXRzIGJwcCA9PSBsZmJfZGVwdGggOyB2ZXJpZnkKKyAgICAgKi8KKworICAgIHN3aXRjaCAobW9kZV9pbmZvLT5QaXhlbEZvcm1hdCkgeworICAgIGNhc2UgUGl4ZWxSZWRHcmVlbkJsdWVSZXNlcnZlZDhCaXRQZXJDb2xvcjoKKwlkcHJpbnRmKCJSR0I4Yml0ICIpOworCW1pLT5tb2RlX2F0dHIgPSAweDAwODA7CQkvKiBzdXBwb3J0cyBwaHlzaWNhbCBmcmFtZSBidWZmZXIgKi8KKwltaS0+YnBwID0gc2l6ZW9mKEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX1BJWEVMKSAqIDg7CisJbWktPnJwb3MgPSAwOworCW1pLT5ncG9zID0gODsKKwltaS0+YnBvcyA9IDE2OworCW1pLT5yZXN2X3BvcyA9IDI0OworCWxmYl9yZXN2X3NpemUgPSA4OworCW1pLT5sb2dpY2FsX3NjYW4gPSBsZmJfbGluZV9zaXplID0gKG1vZGVfaW5mby0+UGl4ZWxzUGVyU2NhbkxpbmUgKiBtaS0+YnBwKSAvIDg7CisJKmJlc3RweGYgPSBQWEZfQkdSQTMyOworCWRwcmludGYoImJwcCAlZCBwaXhwZXJTY2FuTGluZSAlZCBsb2dpY2FsX3NjYW4gJWQgYnl0ZXNwZXJQaXggJWRcbiIsIG1pLT5icHAsIG1vZGVfaW5mby0+UGl4ZWxzUGVyU2NhbkxpbmUsIAorCQltaS0+bG9naWNhbF9zY2FuLCAobWktPmJwcCArIDcpPj4zKTsKKwlicmVhazsKKyAgICBjYXNlIFBpeGVsQmx1ZUdyZWVuUmVkUmVzZXJ2ZWQ4Qml0UGVyQ29sb3I6CisJZHByaW50ZigiQkdSOGJpdCAiKTsKKwltaS0+bW9kZV9hdHRyID0gMHgwMDgwOwkJLyogc3VwcG9ydHMgcGh5c2ljYWwgZnJhbWUgYnVmZmVyICovCisJbWktPmJwcCA9IHNpemVvZihFRklfR1JBUEhJQ1NfT1VUUFVUX0JMVF9QSVhFTCkgKiA4OworCW1pLT5icG9zID0gMDsKKwltaS0+Z3BvcyA9IDg7CisJbWktPnJwb3MgPSAxNjsKKwltaS0+cmVzdl9wb3MgPSAyNDsKKwlsZmJfcmVzdl9zaXplID0gODsKKwltaS0+bG9naWNhbF9zY2FuID0gbGZiX2xpbmVfc2l6ZSA9IChtb2RlX2luZm8tPlBpeGVsc1BlclNjYW5MaW5lICogbWktPmJwcCkgLyA4OworCSpiZXN0cHhmID0gUFhGX0JHUkEzMjsKKwlkcHJpbnRmKCJicHAgJWQgcGl4cGVyU2NhbkxpbmUgJWQgbG9naWNhbF9zY2FuICVkIGJ5dGVzcGVyUGl4ICVkXG4iLCBtaS0+YnBwLCBtb2RlX2luZm8tPlBpeGVsc1BlclNjYW5MaW5lLCAKKwkJbWktPmxvZ2ljYWxfc2NhbiwgKG1pLT5icHAgKyA3KT4+Myk7CisJYnJlYWs7CisgICAgY2FzZSBQaXhlbEJpdE1hc2s6CisJbWktPm1vZGVfYXR0ciA9IDB4MDA4MDsJCS8qIHN1cHBvcnRzIHBoeXNpY2FsIGZyYW1lIGJ1ZmZlciAqLworCWRwcmludGYoIlJlZE1hc2sgMHgleCBHcm5NYXNrIDB4JXggQmx1TWFzayAweCV4IFJzdk1hc2sgMHgleFxuIiwKKwkJbW9kZV9pbmZvLT5QaXhlbEluZm9ybWF0aW9uLlJlZE1hc2ssCisJCW1vZGVfaW5mby0+UGl4ZWxJbmZvcm1hdGlvbi5HcmVlbk1hc2ssCisJCW1vZGVfaW5mby0+UGl4ZWxJbmZvcm1hdGlvbi5CbHVlTWFzaywKKwkJbW9kZV9pbmZvLT5QaXhlbEluZm9ybWF0aW9uLlJlc2VydmVkTWFzayk7CisJZmluZF9waXhtYXNrX2JpdHMobW9kZV9pbmZvLT5QaXhlbEluZm9ybWF0aW9uLlJlZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaS0+cnBvcywgJmxmYl9yc2l6ZSk7CisJZmluZF9waXhtYXNrX2JpdHMobW9kZV9pbmZvLT5QaXhlbEluZm9ybWF0aW9uLkdyZWVuTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pLT5ncG9zLCAmbGZiX2dzaXplKTsKKwlmaW5kX3BpeG1hc2tfYml0cyhtb2RlX2luZm8tPlBpeGVsSW5mb3JtYXRpb24uQmx1ZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaS0+YnBvcywgJmxmYl9ic2l6ZSk7CisJZmluZF9waXhtYXNrX2JpdHMobW9kZV9pbmZvLT5QaXhlbEluZm9ybWF0aW9uLlJlc2VydmVkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pLT5yZXN2X3BvcywgJmxmYl9yZXN2X3NpemUpOworCW1pLT5icHAgPSBsZmJfcnNpemUgKyBsZmJfZ3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxmYl9ic2l6ZSArIGxmYl9yZXN2X3NpemU7CisJbWktPmxvZ2ljYWxfc2NhbiA9IGxmYl9saW5lX3NpemUgPSAobW9kZV9pbmZvLT5QaXhlbHNQZXJTY2FuTGluZSAqIG1pLT5icHApIC8gODsKKwlkcHJpbnRmKCJSUG9zICVkIFJzaXplICVkIEdQb3MgJWQgR3NpemUgJWRcbiIsIG1pLT5ycG9zLCBsZmJfcnNpemUsIG1pLT5ncG9zLCBsZmJfZ3NpemUpOworCWRwcmludGYoIkJQb3MgJWQgQnNpemUgJWQgUnN2UCAlZCBSc3ZTeiAlZFxuIiwgbWktPmJwb3MsIGxmYl9ic2l6ZSwgbWktPnJlc3ZfcG9zLCBsZmJfcmVzdl9zaXplKTsKKwlkcHJpbnRmKCJicHAgJWQgbG9naWNhbF9zY2FuICVkIGJ5dGVzcGVyUGl4ICVkXG4iLCBtaS0+YnBwLCBtaS0+bG9naWNhbF9zY2FuLCAobWktPmJwcCArIDcpPj4zKTsKKwlzd2l0Y2ggKG1pLT5icHApIHsKKwljYXNlIDMyOgorCQkqYmVzdHB4ZiA9IFBYRl9CR1JBMzI7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCSpiZXN0cHhmID0gUFhGX0JHUjI0OworCQlicmVhazsKKwljYXNlIDE2OgorCQkqYmVzdHB4ZiA9IFBYRl9MRV9SR0IxNl81NjU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRwcmludGYoIlVuYWJsZSB0byBoYW5kbGUgYml0cyBwZXIgcGl4ZWwgJWQsIGJhaWxpbmcgb3V0XG4iLCBtaS0+YnBwKTsKKwkJZXJyID0gNDsKKwkJZ290byBleGl0OworCX0KKwlicmVhazsKKyAgICBjYXNlIFBpeGVsQmx0T25seToKKwkvKiBGSVhNRTogdW5zdXBwb3J0ZWQgKi8KKwltaS0+bW9kZV9hdHRyID0gMHgwMDAwOwkJLyogbm8gc3VwcG9ydCBmb3IgcGh5c2ljYWwgZnJhbWUgYnVmZmVyICovCisJZXJyID0gNDsgLyogbm8gbW9kZSBmb3VuZCAqLworCWdvdG8gZXhpdDsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCS8qIHNob3VsZCBub3QgZ2V0IGhlcmUsIGJ1dCBsZXQncyBlcnJvciBvdXQgKi8KKwllcnIgPSA0OyAvKiBubyBtb2RlIGZvdW5kICovCisJZ290byBleGl0OworCWJyZWFrOworICAgIH0JCSAgIAorICAgIAorICAgIG1lbWNweSgmdmVzYV9pbmZvLT5taSwgbWksIHNpemVvZiAqbWkpOworCisgICAgLyogTm93IHNldCB2aWRlbyBtb2RlICovCisgICAgc3QgPSB1ZWZpX2NhbGxfd3JhcHBlcihHcmFwaGljc091dHB1dC0+U2V0TW9kZSwgMiwgR3JhcGhpY3NPdXRwdXQsIGJlc3Rtb2RlKTsKKyAgICBpZiAoRUZJX0VSUk9SKHN0KSkgeworCWVyciA9IDk7CQkvKiBGYWlsZWQgdG8gc2V0IG1vZGUgKi8KKwlkcHJpbnRmKCJGYWlsZWQgdG8gc2V0IG1vZGUgJWRcbiIsIGJlc3Rtb2RlKTsKKwlnb3RvIGV4aXQ7CisgICAgfQkKKworICAgIC8qIFRPRE86IEZvbGxvdyB0aGUgY29kZSB1c2FnZSBvZiB2ZXNhY29uX2JhY2tncm91bmQgJiB2ZXNhY29uX3NoYWRvd2ZiICovCisgICAgLyoKKyAgICAgX192ZXNhY29uX2JhY2tncm91bmQgPSBjYWxsb2MobWktPmhfcmVzKm1pLT52X3JlcywgNCk7CisgICAgIF9fdmVzYWNvbl9zaGFkb3dmYiA9IGNhbGxvYyhtaS0+aF9yZXMqbWktPnZfcmVzLCA0KTsKKyAgICAgKi8KKyAgICAgLyogRklYTUU6IHRoZSBhbGxvY2F0aW9uIHRha2VzIHRoZSBwb3NzaWJsZSBwYWRkaW5nIGludG8gYWNjb3VudAorICAgICAgKiB3aGVyZWFzICAgQklPUyBjb2RlIHNpbXBseSBhbGxvY2F0ZXMgaHJlcyAqIHZyZXMgYnl0ZXMuCisgICAgICAqIFdoaWNoIGlzIGNvcnJlY3Q/CisgICAgICAqLworICAgICAvKgorICAgICAgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgb3IgZHVlIHRvIGhhcmR3YXJlIHJlc3RyaWN0aW9ucywgc2NhbiBsaW5lcworICAgICAgKiBtYXkgYmUgcGFkZGVkIHRvIGFuIGFtb3VudCBvZiBtZW1vcnkgYWxpZ25tZW50LiBUaGVzZSBwYWRkaW5nIHBpeGVsIGVsZW1lbnRzCisgICAgICAqIGFyZSBvdXRzaWRlIHRoZSBhcmVhIGNvdmVyZWQgYnkgSG9yaXpvbnRhbFJlc29sdXRpb24gYW5kIGFyZSBub3QgdmlzaWJsZS4KKyAgICAgICogRm9yIGRpcmVjdCBmcmFtZSBidWZmZXIgYWNjZXNzLCB0aGlzIG51bWJlciBpcyB1c2VkIGFzIGEgc3BhbiBiZXR3ZWVuIHN0YXJ0cworICAgICAgKiBvZiBwaXhlbCBsaW5lcyBpbiB2aWRlbyBtZW1vcnkuIEJhc2VkIG9uIHRoZSBzaXplIG9mIGFuIGluZGl2aWR1YWwgcGl4ZWwgZWxlbWVudAorICAgICAgKiBhbmQgUGl4ZWxzUGVyU2NhbmxpbmUsIHRoZSBvZmZzZXQgaW4gdmlkZW8gbWVtb3J5IGZyb20gcGl4ZWwgZWxlbWVudCAoeCwgeSkKKyAgICAgICogdG8gcGl4ZWwgZWxlbWVudCAoeCwgeSsxKSBoYXMgdG8gYmUgY2FsY3VsYXRlZCBhcyAKKyAgICAgICogInNpemVvZiggUGl4ZWxFbGVtZW50ICkgKiBQaXhlbHNQZXJTY2FuTGluZSIsIGFuZCBub3QgCisgICAgICAqICJzaXplb2YoIFBpeGVsRWxlbWVudCApICogSG9yaXpvbnRhbFJlc29sdXRpb24iLCB0aG91Z2ggaW4gbWFueSBjYXNlcworICAgICAgKiB0aG9zZSB2YWx1ZXMgY2FuIGNvaW5jaWRlLgorICAgICAgKi8KKworZXhpdDoKKyAgICBpZiAodmkpCisJZnJlZSh2aSk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBlZmlfdmVzYWNvbl9zY3JlZW5jcHkoc2l6ZV90IGRzdCwgY29uc3QgdWludDMyX3QgKnMsCisJCQkJICBzaXplX3QgYnl0ZXMsIHN0cnVjdCB3aW5faW5mbyAqd2kpCit7CisgICAgc2l6ZV90IHdpbl9vZmY7CisgICAgY2hhciAqd2luX2Jhc2UgPSB3aS0+d2luX2Jhc2U7CisgCisgICAgLyogRm9yIEVGSSwgd2Ugc2ltcGx5IHRha2UgdGhlIG9mZnNldCBmcm9tIHRoZSBmcmFtZWJ1ZmZlciBhbmQgd3JpdGUgdG8gaXQKKyAgICAgKiBGSVhNRTogYW55IGdvdGNoYXM/CisgICAgICovCisgICAgd2luX29mZiA9IGRzdDsKKyAgICBtZW1jcHkod2luX2Jhc2UgKyB3aW5fb2ZmLCBzLCBieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQgZWZpX3Zlc2Fjb25fZm9udF9xdWVyeSh1aW50OF90ICoqZm9udCkKK3sKKyAgICAvKiBzZXQgdXAgZm9udCBpbmZvCisgICAgICogRm9yIG5vdywgZm9udCBpbmZvIGlzIHN0b3JlZCBhcyByYXcgZGF0YSBhbmQgdXNlZAorICAgICAqIGFzIHN1Y2guIEFsdGVuYXRpdmVseSwgdGhlIGZvbnQgZGF0YSBzdG9yZWQgaW4gYSBmaWxlIAorICAgICAqIGNvdWxkIGJlIHJlYWQgYW5kIHBhcnNlZC4gKG5vdGU6IGZvciB0aGlzLCBFRkkKKyAgICAgKiBmaWxlIHN1cHBvcnQgc2hvdWxkIGJlIGV4cG9zZWQgdmlhIGZpcm13YXJlIHN0cnVjdHVyZSkKKyAgICAgKi8KKyAgICAqZm9udCA9ICh1aW50OF90ICopY3A4NjVfOHgxNl9mb250X2RhdGE7CisgICAgcmV0dXJuIGNwODY1Xzh4MTZfZm9udF9oZWlnaHQ7Cit9CisKK19fZXhwb3J0IGludCBfX3Zlc2Fjb25faTkxNXJlc29sdXRpb24oaW50IHgsIGludCB5KQoreworCS8qIFdlIGRvbid0IHN1cHBvcnQgdGhpcyBmdW5jdGlvbiAqLworCXJldHVybiAxOworfQorCitzdHJ1Y3QgdmVzYV9vcHMgZWZpX3Zlc2Ffb3BzID0geworCS5zZXRfbW9kZSA9IGVmaV92ZXNhY29uX3NldF9tb2RlLAorCS5zY3JlZW5jcHkgPSBlZmlfdmVzYWNvbl9zY3JlZW5jcHksCisJLmZvbnRfcXVlcnkgPSBlZmlfdmVzYWNvbl9mb250X3F1ZXJ5LAorfTsKZGlmZiAtLWdpdCBhL2VmaS93cmFwcGVyLmMgYi9lZmkvd3JhcHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ODgxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvd3JhcHBlci5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgTWF0dCBGbGVtaW5nCisgKgorICogV3JhcCB0aGUgRUxGIHNoYXJlZCBsaWJyYXJ5IGluIGEgUEUzMiAoMzJiaXQpIG9yIFBFMzIrICg2NGJpdCkgc3VpdC4KKyAqCisgKiBTeXNsaW51eCBwbGF5cyBzb21lIGdhbWVzIHdpdGggdGhlIEVMRiBzZWN0aW9ucyB0aGF0IGFyZSBub3QgZWFzaWx5CisgKiBjb252ZXJ0ZWQgdG8gYSBQRTMyIGV4ZWN1dGFibGUuIEZvciBpbnN0YW5jZSwgU3lzbGludXggcmVxdWlyZXMKKyAqIHRoYXQgYSBzeW1ib2wgaGFzaCB0YWJsZSBiZSBwcmVzZW50IChHTlUgaGFzaCBvciBTeXNWKSBzbyB0aGF0CisgKiBzeW1ib2xzIGluIEVMRiBtb2R1bGVzIGNhbiBiZSByZXNvbHZlZCBhdCBydW50aW1lIGJ1dCB0aGUgRUZJCisgKiBmaXJtd2FyZSBsb2FkZXIgZG9lc24ndCBsaWtlIHRoYXQgYW5kIHJlZnVzZXMgdG8gbG9hZCB0aGUgZmlsZS4KKyAqCisgKiBXZSBwcmV0ZW5kIHRoYXQgd2UgaGF2ZSBhbiBFRkkgZXhlY3V0YWJsZSB3aXRoIGEgc2luZ2xlIC50ZXh0CisgKiBzZWN0aW9uIHNvIHRoYXQgdGhlIEVGSSBsb2FkZXIgd2lsbCBsb2FkIGl0IGFuZCBqdW1wIHRvIHRoZSBlbnRyeQorICogcG9pbnQuIE9uY2UgdGhlIFN5c2xpbnV4IEVMRiBzaGFyZWQgb2JqZWN0IGhhcyBjb250cm9sIHdlIGNhbiBkbworICogd2hhdGV2ZXIgd2Ugd2FudC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIndyYXBwZXIuaCIKKworI2lmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA0Cit0eXBlZGVmIEVsZjMyX0VoZHIgRWxmX0VoZHI7Cit0eXBlZGVmIEVsZjMyX0FkZHIgRWxmX0FkZHI7CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAordHlwZWRlZiBFbGY2NF9FaGRyIEVsZl9FaGRyOwordHlwZWRlZiBFbGY2NF9BZGRyIEVsZl9BZGRyOworI2Vsc2UKKyNlcnJvciAidW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIgorI2VuZGlmCisKKy8qCisgKiAnc29fbWVtc3onIGlzIHRoZSBzaXplIG9mIHRoZSBFTEYgc2hhcmVkIG9iamVjdCBvbmNlIGxvYWRlZC4KKyAqICdkYXRhX3NpemUnIGlzIHRoZSBzaXplIG9mIGluaXRpYWxpc2VkIGRhdGEgaW4gdGhlIHNoYXJlZCBvYmplY3QuCisgKiAgJ2NsYXNzJyBkaWN0YXRlcyBob3cgdGhlIGhlYWRlciBpcyB3cml0dGVuCisgKiAJRm9yIDMyYml0IG1hY2hpbmVzIChjbGFzcyA9PSBFTEZDTEFTUzMyKSwgdGhlIG9wdGlvbmFsCisgKiAJaGVhZGVyIGluY2x1ZGVzIFBFMzIgaGVhZGVyIGZpZWxkcworICogCUZvciA2NGJpdCBtYWNoaW5lcyAoY2xhc3MgPT0gRUxGQ0xBU1M2NCksIHRoZSBvcHRpb25hbAorICogCWhlYWRlciBpbmNsdWRlcyBQRTMyK2hlYWRlciBmaWVsZHMKKyAqLworc3RhdGljIHZvaWQgd3JpdGVfaGVhZGVyKEZJTEUgKmYsIF9fdWludDMyX3QgZW50cnksIHNpemVfdCBkYXRhX3NpemUsCisJCQkgX191aW50MzJfdCBzb19tZW1zeiwgX191aW50OF90IGNsYXNzKQoreworCXN0cnVjdCBvcHRpb25hbF9oZHIgb19oZHI7CisJc3RydWN0IG9wdGlvbmFsX2hkcl9wZTMycCBvX2hkcl9wZTMycDsKKwlzdHJ1Y3Qgc2VjdGlvbiB0X3NlYzsKKwlzdHJ1Y3QgZXh0cmFfaGRyIGVfaGRyOworCXN0cnVjdCBleHRyYV9oZHJfcGUzMnAgZV9oZHJfcGUzMnA7CisJc3RydWN0IGNvZmZfaGRyIGNfaGRyOworCXN0cnVjdCBoZWFkZXIgaGRyOworCV9fdWludDMyX3QgdG90YWxfc3ogPSBkYXRhX3NpemU7CisJX191aW50MzJfdCBoZHJfc3o7CisJX191aW50MzJfdCByZWxvY19zdGFydCwgcmVsb2NfZW5kOworCisJLyoKKwkgKiBUaGUgaGVhZGVyIHNpemUgaGF2ZSB0byBiZSBhIG11bHRpcGxlIG9mIGZpbGVfYWxpZ24sIHdoaWNoIGN1cnJlbnRseQorCSAqIGlzIDUxMgorCSAqLworCWhkcl9zeiA9IDUxMjsKKwl0b3RhbF9zeiArPSBoZHJfc3o7CisJZW50cnkgKz0gaGRyX3N6OworCisJbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKKwloZHIubXNkb3Nfc2lnbmF0dXJlID0gTVNET1NfU0lHTkFUVVJFOworCisJLyoKKwkgKiBUaGUgcmVsb2NzIHRhYmxlIHBvaW50ZXIgbmVlZHMgdG8gYmUgPj0gMHg0MCBmb3IgUEUgZmlsZXMuIEl0CisJICogaW5mb3JtcyB0aGluZ3MgbGlrZSBmaWxlKDEpIHRoYXQgd2UgYXJlIG5vdCBhbiBNUy1ET1MKKwkgKiBleGVjdXRhYmxlLgorCSAqLworCWhkci5yZWxvY3NfcHRyID0gMHg0MDsKKworCWhkci5wZV9oZHIgPSBPRkZTRVRPRihzdHJ1Y3QgaGVhZGVyLCBwZV9zaWduYXR1cmUpOworCWhkci5wZV9zaWduYXR1cmUgPSBQRV9TSUdOQVRVUkU7CisJZndyaXRlKCZoZHIsIHNpemVvZihoZHIpLCAxLCBmKTsKKworCW1lbXNldCgmY19oZHIsIDAsIHNpemVvZihjX2hkcikpOworCWNfaGRyLm5yX3NlY3Rpb25zID0gMTsKKwljX2hkci5ucl9zeW1zID0gMTsKKwlpZiAoY2xhc3MgPT0gRUxGQ0xBU1MzMikgeworCQljX2hkci5hcmNoID0gSU1BR0VfRklMRV9NQUNISU5FX0kzODY7CisJCWNfaGRyLmNoYXJhY3RlcmlzdGljcyA9IElNQUdFX0ZJTEVfMzJCSVRfTUFDSElORSB8CisJCQlJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVEIHwgSU1BR0VfRklMRV9FWEVDVVRBQkxFX0lNQUdFIHwKKwkJCUlNQUdFX0ZJTEVfTElORV9OVU1CRVJTX1NUUklQUEVEOworCQljX2hkci5vcHRpb25hbF9oZHJfc3ogPSBzaXplb2Yob19oZHIpICsgc2l6ZW9mKGVfaGRyKTsKKwkJZndyaXRlKCZjX2hkciwgc2l6ZW9mKGNfaGRyKSwgMSwgZik7CisJCW1lbXNldCgmb19oZHIsIDAsIHNpemVvZihvX2hkcikpOworCQlvX2hkci5mb3JtYXQgPSBQRTMyX0ZPUk1BVDsKKwkJb19oZHIubWFqb3JfbGlua2VyX3ZlcnNpb24gPSAweDAyOworCQlvX2hkci5taW5vcl9saW5rZXJfdmVyc2lvbiA9IDB4MTQ7CisJCW9faGRyLmNvZGVfc3ogPSBkYXRhX3NpemU7CisJCW9faGRyLmVudHJ5X3BvaW50ID0gZW50cnk7CisJCW9faGRyLmluaXRpYWxpemVkX2RhdGFfc3ogPSBkYXRhX3NpemU7CisJCWZ3cml0ZSgmb19oZHIsIHNpemVvZihvX2hkciksIDEsIGYpOworCQltZW1zZXQoJmVfaGRyLCAwLCBzaXplb2YoZV9oZHIpKTsKKwkJZV9oZHIuc2VjdGlvbl9hbGlnbiA9IDQwOTY7CisJCWVfaGRyLmZpbGVfYWxpZ24gPSA1MTI7CisJCWVfaGRyLmltYWdlX3N6ID0gaGRyX3N6ICsgc29fbWVtc3o7CisJCWVfaGRyLmhlYWRlcnNfc3ogPSBoZHJfc3o7CisJCWVfaGRyLnN1YnN5c3RlbSA9IElNQUdFX1NVQlNZU1RFTV9FRklfQVBQTElDQVRJT047CisJCWVfaGRyLnJ2YV9hbmRfc2l6ZXNfbnIgPSBzaXplb2YoZV9oZHIuZGF0YV9kaXJlY3RvcnkpIC8gc2l6ZW9mKF9fdWludDY0X3QpOworCQlmd3JpdGUoJmVfaGRyLCBzaXplb2YoZV9oZHIpLCAxLCBmKTsKKwl9CisJZWxzZSBpZiAoY2xhc3MgPT0gRUxGQ0xBU1M2NCkgeworCQljX2hkci5hcmNoID0gSU1BR0VfRklMRV9NQUNISU5FX1g4Nl82NDsKKwkJY19oZHIuY2hhcmFjdGVyaXN0aWNzID0gSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCB8IElNQUdFX0ZJTEVfRVhFQ1VUQUJMRV9JTUFHRSB8CisJCQlJTUFHRV9GSUxFX0xJTkVfTlVNQkVSU19TVFJJUFBFRDsKKwkJY19oZHIub3B0aW9uYWxfaGRyX3N6ID0gc2l6ZW9mKG9faGRyX3BlMzJwKSArIHNpemVvZihlX2hkcl9wZTMycCk7CisJCWZ3cml0ZSgmY19oZHIsIHNpemVvZihjX2hkciksIDEsIGYpOworCQltZW1zZXQoJm9faGRyX3BlMzJwLCAwLCBzaXplb2Yob19oZHJfcGUzMnApKTsKKwkJb19oZHJfcGUzMnAuZm9ybWF0ID0gUEUzMlBfRk9STUFUOworCQlvX2hkcl9wZTMycC5tYWpvcl9saW5rZXJfdmVyc2lvbiA9IDB4MDI7CisJCW9faGRyX3BlMzJwLm1pbm9yX2xpbmtlcl92ZXJzaW9uID0gMHgxNDsKKwkJb19oZHJfcGUzMnAuY29kZV9zeiA9IGRhdGFfc2l6ZTsKKwkJb19oZHJfcGUzMnAuZW50cnlfcG9pbnQgPSBlbnRyeTsKKwkJb19oZHIuaW5pdGlhbGl6ZWRfZGF0YV9zeiA9IGRhdGFfc2l6ZTsKKwkJZndyaXRlKCZvX2hkcl9wZTMycCwgc2l6ZW9mKG9faGRyX3BlMzJwKSwgMSwgZik7CisJCW1lbXNldCgmZV9oZHJfcGUzMnAsIDAsIHNpemVvZihlX2hkcl9wZTMycCkpOworCQllX2hkcl9wZTMycC5zZWN0aW9uX2FsaWduID0gNDA5NjsKKwkJZV9oZHJfcGUzMnAuZmlsZV9hbGlnbiA9IDUxMjsKKwkJZV9oZHJfcGUzMnAuaW1hZ2Vfc3ogPSBoZHJfc3ogKyBzb19tZW1zejsKKwkJZV9oZHJfcGUzMnAuaGVhZGVyc19zeiA9IGhkcl9zejsKKwkJZV9oZHJfcGUzMnAuc3Vic3lzdGVtID0gSU1BR0VfU1VCU1lTVEVNX0VGSV9BUFBMSUNBVElPTjsKKwkJZV9oZHJfcGUzMnAucnZhX2FuZF9zaXplc19uciA9IHNpemVvZihlX2hkcl9wZTMycC5kYXRhX2RpcmVjdG9yeSkgLyBzaXplb2YoX191aW50NjRfdCk7CisJCWZ3cml0ZSgmZV9oZHJfcGUzMnAsIHNpemVvZihlX2hkcl9wZTMycCksIDEsIGYpOworCX0KKworCW1lbXNldCgmdF9zZWMsIDAsIHNpemVvZih0X3NlYykpOworCXN0cmNweSgoY2hhciAqKXRfc2VjLm5hbWUsICIudGV4dCIpOworCXRfc2VjLnZpcnR1YWxfc3ogPSBkYXRhX3NpemU7CisJdF9zZWMudmlydHVhbF9hZGRyZXNzID0gaGRyX3N6OworCXRfc2VjLnJhd19kYXRhX3N6ID0gdF9zZWMudmlydHVhbF9zejsKKwl0X3NlYy5yYXdfZGF0YSA9IHRfc2VjLnZpcnR1YWxfYWRkcmVzczsKKwl0X3NlYy5jaGFyYWN0ZXJpc3RpY3MgPSBJTUFHRV9TQ05fQ05UX0NPREUgfAorCQlJTUFHRV9TQ05fQUxJR05fMTZCWVRFUyB8IElNQUdFX1NDTl9NRU1fRVhFQ1VURSB8CisJCUlNQUdFX1NDTl9NRU1fUkVBRDsKKwlmd3JpdGUoJnRfc2VjLCBzaXplb2YodF9zZWMpLCAxLCBmKTsKKworCS8qCisJICogQWRkIHNvbWUgcGFkZGluZyB0byBhbGlnbiB0aGUgRUxGIGFzIG5lZWRlZAorCSAqLworCWlmIChmdGVsbChmKSA+IHRfc2VjLnZpcnR1YWxfYWRkcmVzcykgeworCQkvKiBEb24ndCByZXdpbmQhIGhkcl9zeiBuZWVkIHRvIGJlIGluY3JlYXNlZC4gKi8KKwkJZnByaW50ZihzdGRlcnIsICJQRTMyKyBoZWFkZXJzIGFyZSB0b28gbGFyZ2UuXG4iKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWZzZWVrKGYsIHRfc2VjLnZpcnR1YWxfYWRkcmVzcywgU0VFS19TRVQpOworfQorCitzdGF0aWMgdm9pZCB1c2FnZShjaGFyICpwcm9nbmFtZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwJInVzYWdlOiAlcyA8RUxGIHNoYXJlZCBvYmplY3Q+IDxvdXRwdXQgZmlsZT5cbiIsCisJCXByb2duYW1lKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUVsZjMyX0VoZHIgZTMyX2hkcjsKKwlFbGY2NF9FaGRyIGU2NF9oZHI7CisJX191aW50MzJfdCBlbnRyeTsKKwlfX3VpbnQ4X3QgY2xhc3M7CisJX191aW50NjRfdCBwaG9mZiA9IDA7CisJX191aW50MTZfdCBwaG51bSA9IDAsIHBoZW50c2l6ZSA9IDA7CisJdW5zaWduZWQgY2hhciAqaWQ7CisJRklMRSAqZl9pbiwgKmZfb3V0OworCXZvaWQgKmJ1ZjsKKwlzaXplX3QgZGF0YXN6LCBtZW1zeiwgcnY7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJdXNhZ2UoYXJndlswXSk7CisJCWV4aXQoMCk7CisJfQorCisJZl9pbiA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CisJaWYgKCFmX2luKSB7CisJCXBlcnJvcigiZm9wZW4iKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWZfb3V0ID0gZm9wZW4oYXJndlsyXSwgInciKTsKKwlpZiAoIWZfb3V0KSB7CisJCXBlcnJvcigiZm9wZW4iKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCS8qCisJICogUGFyc2UgdGhlIEVMRiBoZWFkZXIgYW5kIGZpbmQgdGhlIGVudHJ5IHBvaW50LgorCSAqLworCWZyZWFkKCh2b2lkICopJmUzMl9oZHIsIHNpemVvZihlMzJfaGRyKSwgMSwgZl9pbik7CisJaWYgKGUzMl9oZHIuZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMikgeworCQlpZCA9IGUzMl9oZHIuZV9pZGVudDsKKwkJY2xhc3MgPSBFTEZDTEFTUzMyOworCQllbnRyeSA9IGUzMl9oZHIuZV9lbnRyeTsKKwkJcGhvZmYgPSBlMzJfaGRyLmVfcGhvZmY7CisJCXBobnVtID0gZTMyX2hkci5lX3BobnVtOworCQlwaGVudHNpemUgPSBlMzJfaGRyLmVfcGhlbnRzaXplOworCX0KKwllbHNlIGlmIChlMzJfaGRyLmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTNjQpIHsKKwkJLyogcmVhZCB0aGUgaGVhZGVyIGFnYWluIGZvciB4ODZfNjQgCisJCSAqIG5vdGUgdGhhdCB0aGUgZWxmIGhlYWRlciBlbnRyeSBwb2ludCBpcyA2NGJpdCB3aGVyZWFzCisJCSAqIHRoZSBlbnRyeSBwb2ludCBpbiBQRS9DT0ZGIGZvcm1hdCBpcyAzMmJpdCEqLworCQljbGFzcyA9IEVMRkNMQVNTNjQ7CisJCXJld2luZChmX2luKTsKKwkJZnJlYWQoKHZvaWQgKikmZTY0X2hkciwgc2l6ZW9mKGU2NF9oZHIpLCAxLCBmX2luKTsKKwkJaWQgPSBlNjRfaGRyLmVfaWRlbnQ7CisJCWVudHJ5ID0gZTY0X2hkci5lX2VudHJ5OworCQlwaG9mZiA9IGU2NF9oZHIuZV9waG9mZjsKKwkJcGhudW0gPSBlNjRfaGRyLmVfcGhudW07CisJCXBoZW50c2l6ZSA9IGU2NF9oZHIuZV9waGVudHNpemU7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmVcbiIpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJaWYgKGlkW0VJX01BRzBdICE9IEVMRk1BRzAgfHwKKwkgICAgaWRbRUlfTUFHMV0gIT0gRUxGTUFHMSB8fAorCSAgICBpZFtFSV9NQUcyXSAhPSBFTEZNQUcyIHx8CisJICAgIGlkW0VJX01BRzNdICE9IEVMRk1BRzMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbnB1dCBmaWxlIG5vdCBFTEYgc2hhcmVkIG9iamVjdFxuIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlpZiAoIXBob2ZmIHx8ICFwaG51bSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIHNlZ21lbnQgdGFibGVcbiIpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJLyoKKwkgKiBGaW5kIHRoZSBMT0FEIHByb2dyYW0gaGVhZGVyLiBFdmVyeXRoaW5nIGluIHRoaXMgc2VnbWVudAorCSAqIGlzIGNvcGllZCB2ZXJiYXRpbSB0byB0aGUgb3V0cHV0IGZpbGUuCisJICogQWx0aG91Z2ggdGhlcmUgbWF5IGJlIHNldmVyYWwgTE9BRCBwcm9ncmFtIGhlYWRlcnMsIG9ubHkKKwkgKiBvbmUgaXMgY3VycmVudGx5IGNvcGllZC4KKwkgKi8KKwlpZiAoZTMyX2hkci5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyKSB7CisJCUVsZjMyX1BoZHIgcGhkcjsKKwkJaW50IGk7CisKKwkJLyogRmluZCB0aGUgZmlyc3QgTE9BRCBwcm9ncmFtIGhlYWRlciAqLworCQlmb3IgKGkgPSAwOyBpIDwgcGhudW07IGkrKykgeworCQkJZnNlZWsoZl9pbiwgcGhvZmYgKyBpICogcGhlbnRzaXplLCBTRUVLX1NFVCk7CisJCQlmcmVhZCgmcGhkciwgc2l6ZW9mKHBoZHIpLCAxLCBmX2luKTsKKworCQkJaWYgKHBoZHIucF90eXBlID09IFBUX0xPQUQpCisJCQkJYnJlYWs7CisJCX0KKworCQlkYXRhc3ogPSBwaGRyLnBfZmlsZXN6OworCQltZW1zeiA9IHBoZHIucF9tZW1zejsKKwl9IGVsc2UgaWYgKGUzMl9oZHIuZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NCkgeworCQlFbGY2NF9QaGRyIHBoZHI7CisJCWludCBpOworCisJCS8qIEZpbmQgdGhlIGZpcnN0IExPQUQgcHJvZ3JhbSBoZWFkZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IHBobnVtOyBpKyspIHsKKwkJCWZzZWVrKGZfaW4sIHBob2ZmICsgaSAqIHBoZW50c2l6ZSwgU0VFS19TRVQpOworCQkJZnJlYWQoJnBoZHIsIHNpemVvZihwaGRyKSwgMSwgZl9pbik7CisKKwkJCWlmIChwaGRyLnBfdHlwZSA9PSBQVF9MT0FEKQorCQkJCWJyZWFrOworCQl9CisKKwkJZGF0YXN6ID0gcGhkci5wX2ZpbGVzejsKKwkJbWVtc3ogPSBwaGRyLnBfbWVtc3o7CisJfQorCisJYnVmID0gbWFsbG9jKGRhdGFzeik7CisJaWYgKCFidWYpIHsKKwkJcGVycm9yKCJtYWxsb2MiKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCXdyaXRlX2hlYWRlcihmX291dCwgZW50cnksIGRhdGFzeiwgbWVtc3osIGNsYXNzKTsKKworCS8qIFdyaXRlIG91dCB0aGUgZW50aXJlIEVMRiBzaGFyZWQgb2JqZWN0ICovCisJcmV3aW5kKGZfaW4pOworCXJ2ID0gZnJlYWQoYnVmLCBkYXRhc3osIDEsIGZfaW4pOworCWlmICghcnYgJiYgZmVycm9yKGZfaW4pKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlYWQgYWxsIGJ5dGVzIGZyb20gaW5wdXRcbiIpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJZndyaXRlKGJ1ZiwgZGF0YXN6LCBydiwgZl9vdXQpOworCWZyZWUoYnVmKTsKKwlmY2xvc2UoZl9vdXQpOworCWZjbG9zZShmX2luKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2VmaS93cmFwcGVyLmggYi9lZmkvd3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmIzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkvd3JhcHBlci5oCkBAIC0wLDAgKzEsMTcwIEBACisjaWZuZGVmIEVGSV9XUkFQUEVSX0gKKyNkZWZpbmUgRUZJX1dSQVBQRVJfSAorCisjZGVmaW5lIE1TRE9TX1NJR05BVFVSRQkweDVhNGQKKyNkZWZpbmUgUEVfU0lHTkFUVVJFCTB4NDU1MAorI2RlZmluZSBQRTMyX0ZPUk1BVAkweDEwYgorI2RlZmluZSBQRTMyUF9GT1JNQVQJMHgyMGIJLyogUEUzMisgKi8KKworI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NgkJCTB4MTRjCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9YODZfNjQJCTB4ODY2NAorI2RlZmluZSBJTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UJCTB4MDAwMgorI2RlZmluZSBJTUFHRV9GSUxFX0xJTkVfTlVNQkVSU19TVFJJUFBFRAkweDAwMDQKKyNkZWZpbmUgSU1BR0VfRklMRV8zMkJJVF9NQUNISU5FCQkweDAxMDAKKyNkZWZpbmUgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRAkJMHgwMjAwCisKKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX0VGSV9BUFBMSUNBVElPTgkJMHgwYQorCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfQ09ERQkJMHgwMDAwMDAyMAorI2RlZmluZSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEJMHgwMDAwMDA0MAorI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMUJZVEVTCQkweDAwMTAwMDAwCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTCQkweDAwNTAwMDAwCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUJMHgwMjAwMDAwMAorI2RlZmluZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUJCTB4MjAwMDAwMDAKKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFECQkweDQwMDAwMDAwCisKKyNkZWZpbmUgX19wYWNrZWQJX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKyNkZWZpbmUgT0ZGU0VUT0YodCxtKQkoKHNpemVfdCkmKCh0ICopMCktPm0pCisKK3N0cnVjdCBoZWFkZXIgeworCV9fdWludDE2X3QgbXNkb3Nfc2lnbmF0dXJlOworCV9fdWludDhfdCBfcGFkMVsweDE2XTsKKwlfX3VpbnQxNl90IHJlbG9jc19wdHI7CisJX191aW50OF90IF9fcGFkMlsweDNjIC0gMHgxYV07CisJX191aW50MzJfdCBwZV9oZHI7CisJX191aW50MTZfdCBwZV9zaWduYXR1cmU7CisJX191aW50MTZfdCBfcGFkMjsKK30gX19wYWNrZWQ7CisKKy8qIEZJWE1FOiB3aGVuIHNldHRpbmcgdXAgY29mZl9oZHIsIHNldCB1cCBvcHRpb25hbF9oZHJfc3oKKyAqIGJhc2VkIG9uIFBFMzIgb3IgUEUzMisgZm9ybWF0CisgKi8KKy8qCisgKiBDT0ZGIGhlYWRlcgorICovCitzdHJ1Y3QgY29mZl9oZHIgeworCV9fdWludDE2X3QgYXJjaDsKKwlfX3VpbnQxNl90IG5yX3NlY3Rpb25zOworCV9fdWludDMyX3QgdGltZWRhdGVzdGFtcDsKKwlfX3VpbnQzMl90IHN5bXRhYjsKKwlfX3VpbnQzMl90IG5yX3N5bXM7CisJX191aW50MTZfdCBvcHRpb25hbF9oZHJfc3o7CisJX191aW50MTZfdCBjaGFyYWN0ZXJpc3RpY3M7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgb3B0aW9uYWxfaGRyIHsKKwlfX3VpbnQxNl90IGZvcm1hdDsKKwlfX3VpbnQ4X3QgbWFqb3JfbGlua2VyX3ZlcnNpb247CisJX191aW50OF90IG1pbm9yX2xpbmtlcl92ZXJzaW9uOworCV9fdWludDMyX3QgY29kZV9zejsKKwlfX3VpbnQzMl90IGluaXRpYWxpemVkX2RhdGFfc3o7CisJX191aW50MzJfdCB1bmluaXRpYWxpemVkX2RhdGFfc3o7CisJX191aW50MzJfdCBlbnRyeV9wb2ludDsKKwlfX3VpbnQzMl90IGJhc2VfY29kZTsKKwlfX3VpbnQzMl90IGRhdGE7Cit9IF9fcGFja2VkOworCisvKiBGb3IgUEUzMissIHRoZSBvcHRpb25hbF9oZWFkZXIgZG9lcyBOT1QgaGF2ZQorICogZGF0YSBhZnRlciBiYXNlX2NvZGUKKyAqLworc3RydWN0IG9wdGlvbmFsX2hkcl9wZTMycCB7CisJX191aW50MTZfdCBmb3JtYXQ7CisJX191aW50OF90IG1ham9yX2xpbmtlcl92ZXJzaW9uOworCV9fdWludDhfdCBtaW5vcl9saW5rZXJfdmVyc2lvbjsKKwlfX3VpbnQzMl90IGNvZGVfc3o7CisJX191aW50MzJfdCBpbml0aWFsaXplZF9kYXRhX3N6OworCV9fdWludDMyX3QgdW5pbml0aWFsaXplZF9kYXRhX3N6OworCV9fdWludDMyX3QgZW50cnlfcG9pbnQ7CisJX191aW50MzJfdCBiYXNlX2NvZGU7Cit9IF9fcGFja2VkOworLyoKKyAqIEV4dHJhIGhlYWRlciBmaWVsZHMKKyAqLworc3RydWN0IGV4dHJhX2hkciB7CisJX191aW50MzJfdCBpbWFnZV9iYXNlOworCV9fdWludDMyX3Qgc2VjdGlvbl9hbGlnbjsKKwlfX3VpbnQzMl90IGZpbGVfYWxpZ247CisJX191aW50MTZfdCBtYWpvcl9vc192ZXJzaW9uOworCV9fdWludDE2X3QgbWlub3Jfb3NfdmVyc2lvbjsKKwlfX3VpbnQxNl90IG1ham9yX2ltYWdlX3ZlcnNpb247CisJX191aW50MTZfdCBtaW5vcl9pbWFnZV92ZXJzaW9uOworCV9fdWludDE2X3QgbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb247CisJX191aW50MTZfdCBtaW5vcl9zdWJzeXN0ZW1fdmVyc2lvbjsKKwlfX3VpbnQzMl90IHdpbjMyX3ZlcnNpb247CisJX191aW50MzJfdCBpbWFnZV9zejsKKwlfX3VpbnQzMl90IGhlYWRlcnNfc3o7CisJX191aW50MzJfdCBjaGVja3N1bTsKKwlfX3VpbnQxNl90IHN1YnN5c3RlbTsKKwlfX3VpbnQxNl90IGRsbF9jaGFyYWN0ZXJpc3RpY3M7CisJX191aW50MzJfdCBzdGFja19yZXNlcnZlX3N6OworCV9fdWludDMyX3Qgc3RhY2tfY29tbWl0X3N6OworCV9fdWludDMyX3QgaGVhcF9yZXNlcnZlX3N6OworCV9fdWludDMyX3QgaGVhcF9jb21taXRfc3o7CisJX191aW50MzJfdCBsb2FkZXJfZmxhZ3M7CisJX191aW50MzJfdCBydmFfYW5kX3NpemVzX25yOworCXN0cnVjdCB7CisJCV9fdWludDY0X3QgZXhwb3J0X3RhYmxlOworCQlfX3VpbnQ2NF90IGltcG9ydF90YWJsZTsKKwkJX191aW50NjRfdCByZXNvdXJjZV90YWJsZTsKKwkJX191aW50NjRfdCBleGNlcHRpb25fdGFibGU7CisJCV9fdWludDY0X3QgY2VydGlmaWNhdGlvbl90YWJsZTsKKwkJX191aW50NjRfdCBiYXNlX3JlbG9jYXRpb25fdGFibGU7CisJfSBkYXRhX2RpcmVjdG9yeTsKK30gX19wYWNrZWQ7CisKKy8qIEV4dHJhIGhlYWRlciBmb3IgUEUzMisgZm9ybWF0IAorICogRklYTUU6IFRoZXJlIGFyZSBhZGRpdGlvbmFsIGZpZWxkcyBpbiBNaWNyb3NvZnQgUEUgQ09GRiB2OAorICovCisKK3N0cnVjdCBleHRyYV9oZHJfcGUzMnAgeworCV9fdWludDY0X3QgaW1hZ2VfYmFzZTsKKwlfX3VpbnQzMl90IHNlY3Rpb25fYWxpZ247CisJX191aW50MzJfdCBmaWxlX2FsaWduOworCV9fdWludDE2X3QgbWFqb3Jfb3NfdmVyc2lvbjsKKwlfX3VpbnQxNl90IG1pbm9yX29zX3ZlcnNpb247CisJX191aW50MTZfdCBtYWpvcl9pbWFnZV92ZXJzaW9uOworCV9fdWludDE2X3QgbWlub3JfaW1hZ2VfdmVyc2lvbjsKKwlfX3VpbnQxNl90IG1ham9yX3N1YnN5c3RlbV92ZXJzaW9uOworCV9fdWludDE2X3QgbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb247CisJX191aW50MzJfdCB3aW4zMl92ZXJzaW9uOworCV9fdWludDMyX3QgaW1hZ2Vfc3o7CisJX191aW50MzJfdCBoZWFkZXJzX3N6OworCV9fdWludDMyX3QgY2hlY2tzdW07CisJX191aW50MTZfdCBzdWJzeXN0ZW07CisJX191aW50MTZfdCBkbGxfY2hhcmFjdGVyaXN0aWNzOworCV9fdWludDY0X3Qgc3RhY2tfcmVzZXJ2ZV9zejsKKwlfX3VpbnQ2NF90IHN0YWNrX2NvbW1pdF9zejsKKwlfX3VpbnQ2NF90IGhlYXBfcmVzZXJ2ZV9zejsKKwlfX3VpbnQ2NF90IGhlYXBfY29tbWl0X3N6OworCV9fdWludDMyX3QgbG9hZGVyX2ZsYWdzOworCV9fdWludDMyX3QgcnZhX2FuZF9zaXplc19ucjsKKwlzdHJ1Y3QgeworCQlfX3VpbnQ2NF90IGV4cG9ydF90YWJsZTsKKwkJX191aW50NjRfdCBpbXBvcnRfdGFibGU7CisJCV9fdWludDY0X3QgcmVzb3VyY2VfdGFibGU7CisJCV9fdWludDY0X3QgZXhjZXB0aW9uX3RhYmxlOworCQlfX3VpbnQ2NF90IGNlcnRpZmljYXRpb25fdGFibGU7CisJCV9fdWludDY0X3QgYmFzZV9yZWxvY2F0aW9uX3RhYmxlOworCX0gZGF0YV9kaXJlY3Rvcnk7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc2VjdGlvbiB7CisJX191aW50OF90IG5hbWVbOF07CisJX191aW50MzJfdCB2aXJ0dWFsX3N6OworCV9fdWludDMyX3QgdmlydHVhbF9hZGRyZXNzOworCV9fdWludDMyX3QgcmF3X2RhdGFfc3o7CisJX191aW50MzJfdCByYXdfZGF0YTsKKwlfX3VpbnQzMl90IHJlbG9jczsKKwlfX3VpbnQzMl90IGxpbmVfbnVtYmVyczsKKwlfX3VpbnQxNl90IHJlbG9jc19ucjsKKwlfX3VpbnQxNl90IGxpbmVfbnVtYmVyc19ucjsKKwlfX3VpbnQzMl90IGNoYXJhY3RlcmlzdGljczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjb2ZmX3JlbG9jIHsKKwlfX3VpbnQzMl90IHZpcnR1YWxfYWRkcmVzczsKKwlfX3VpbnQzMl90IHN5bXRhYl9pbmRleDsKKwlfX3VpbnQxNl90IHR5cGU7Cit9OworCisjZW5kaWYgLyogRUZJX1dSQVBQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZWZpL3g4Nl82NC9saW51eC5TIGIvZWZpL3g4Nl82NC9saW51eC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMGU5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkveDg2XzY0L2xpbnV4LlMKQEAgLTAsMCArMSw2MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTMgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogTWF0dCBGbGVtaW5nCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ1IwX1BHX0ZMQUcJMHg4MDAwMDAwMAorI2RlZmluZSBNU1JfRUZFUgkweGMwMDAwMDgwCisKKwkuZ2xvYmwga2VybmVsX2p1bXAKKwkudHlwZSBrZXJuZWxfanVtcCxAZnVuY3Rpb24KKwkuY29kZTY0CitrZXJuZWxfanVtcDoKKwljbGkKKworCS8qCisJICogU2V0dXAgb3VyIHNlZ21lbnQgc2VsZWN0b3IgKDB4MTApIGFuZCByZXR1cm4gYWRkcmVzcyAoJXJkaSkKKwkgKiBvbiB0aGUgc3RhY2sgaW4gcHJlcGFyYXRpb24gZm9yIHRoZSBmYXIgcmV0dXJuIGJlbG93LgorCSAqLworCW1vdgkkMHgxMDAwMDAwMDAwLCAlcmN4CisJYWRkcQklcmN4LCAlcmRpCisJcHVzaHEJJXJkaQorCisJLmNvZGUzMgorcG1fY29kZToKKworCS8qIERpc2FibGUgSUEtMzJlIG1vZGUgYnkgY2xlYXJpbmcgSUEzMl9FRkVSLkxNRSAqLworCXhvcmwJJWVheCwgJWVheAorCXhvcmwJJWVkeCwgJWVkeAorCW1vdmwJJE1TUl9FRkVSLCAlZWN4CisJd3Jtc3IKKworCS8qIFR1cm4gb2ZmIHBhZ2luZyB0byBkaXNhYmxlIGxvbmcgbW9kZSAqLworCW1vdmwJJWNyMCwgJWVheAorCWFuZGwJJH5DUjBfUEdfRkxBRywgJWVheAorCW1vdmwJJWVheCwgJWNyMAorCisJLyogRmFyIHJldHVybiAqLworCWxyZXQKKworCS5jb2RlNjQKKwkuYWxpZ24gNAorCS5nbG9ibCBlZmlfaGFuZG92ZXJfMzIKKwkudHlwZSAgZWZpX2hhbmRvdmVyXzMyLEBmdW5jdGlvbgorZWZpX2hhbmRvdmVyXzMyOgorCW1vdmwJJDM4LCBlcnJubyglcmlwKQkvKiBFTk9TWVMgKi8KKwlyZXQKKworCS5nbG9ibCBlZmlfaGFuZG92ZXJfNjQKKwkuZ2xvYmwgZWZpX2hhbmRvdmVyCisJLnR5cGUgIGVmaV9oYW5kb3Zlcl82NCxAZnVuY3Rpb24KKwkudHlwZSAgZWZpX2hhbmRvdmVyLEBmdW5jdGlvbgorZWZpX2hhbmRvdmVyXzY0OgorZWZpX2hhbmRvdmVyOgorCWFkZAkkNTEyLCAlcmN4CisJY2xpCisJam1wCSolcmN4CmRpZmYgLS1naXQgYS9lZmkveDg2XzY0L3N5c2xpbnV4LmxkIGIvZWZpL3g4Nl82NC9zeXNsaW51eC5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTA2NDFjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpL3g4Nl82NC9zeXNsaW51eC5sZApAQCAtMCwwICsxLDE3MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDA4LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciB0aGUgU1lTTElOVVggY29yZQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorRU5UUlkoX3N0YXJ0KQorCitTRUNUSU9OUworeworCS4gPSAwOworCUltYWdlQmFzZSA9IC47CQkvKiBGb3IgZ251LWVmaSdzIGNydDAgKi8KKwlfX21vZHVsZV9zdGFydCA9IC47CisJLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDApICsgU0laRU9GX0hFQURFUlM7CisJLnRleHQgOiB7CisJCUZJTEwoMHg5MDkwOTA5MCkKKwkJX190ZXh0X3N0YXJ0ID0gLjsKKwkJKigudGV4dCkKKwkJKigudGV4dC4qKQorCQlfX3RleHRfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMTYpOworCisJLnJvZGF0YSA6IHsKKwkJX19yb2RhdGFfc3RhcnQgPSAuOworCQkqKC5yb2RhdGEpCisJCSooLnJvZGF0YS4qKQorCQlfX3JvZGF0YV9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCS5jdG9ycyA6IHsKKwkJX19jdG9yc19zdGFydCA9IC47CisJCUtFRVAgKCooU09SVCguY3RvcnMuKikpKQorCQlLRUVQICgqKC5jdG9ycykpCisJCV9fY3RvcnNfZW5kID0gLjsKKwl9CisKKwkuZHRvcnMgOiB7CisJCV9fZHRvcnNfc3RhcnQgPSAuOworCQlLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKwkJS0VFUCAoKiguZHRvcnMpKQorCQlfX2R0b3JzX2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDQwOTYpOworCS5yZWwgOiB7CisJCSooLnJlbC5nb3QpCisJCSooLnJlbC5kYXRhKQorCQkqKC5yZWwuZGF0YS4qKQorCQkqKC5yZWwuY3RvcnMpCisJfQorCisJLiA9IEFMSUdOKDQpOworCisJLmdudS5oYXNoIDogeworCQlfX2dudV9oYXNoX3N0YXJ0ID0gLjsKKwkJKiguZ251Lmhhc2gpCisJCV9fZ251X2hhc2hfZW5kID0gLjsKKwl9CisKKworCS5keW5zeW0gOiB7CisJCV9fZHluc3ltX3N0YXJ0ID0gLjsKKwkJKiguZHluc3ltKQorCQlfX2R5bnN5bV9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCS5keW5zdHIgOiB7CisJCV9fZHluc3RyX3N0YXJ0ID0gLjsKKwkJKiguZHluc3RyKQorCQlfX2R5bnN0cl9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCS5keW5saW5rIDogeworCQlfX2R5bmxpbmtfc3RhcnQgPSAuOworCQkqKC5keW5saW5rKQorCQlfX2R5bmxpbmtfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oNCk7CisKKwkuZ290IDogeworCQlfX2dvdF9zdGFydCA9IC47CisJCUtFRVAgKCooLmdvdC5wbHQpKQorCQlLRUVQICgqKC5nb3QpKQorCQlfX2dvdF9lbmQgPSAuOworCX0KKworCS4gPSBBTElHTig0KTsKKworCS5keW5hbWljIDogeworCQlfX2R5bmFtaWNfc3RhcnQgPSAuOworCQkqKC5keW5hbWljKQorCQlfX2R5bmFtaWNfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMTYpOworCisJLmRhdGEgOiB7CisJCV9fZGF0YV9zdGFydCA9IC47CisJCSooLmRhdGEpCisJCSooLmRhdGEuKikKKwkJKigubG93bWVtKQorCQlfX2RhdGFfZW5kID0gLjsKKwl9CisKKwkucmVsb2MgOiB7CisJCSooLnJlbG9jKQorCX0KKworCS5zeW10YWIgOiB7CisJCSooLnN5bXRhYikKKwl9CisKKwkuc3RydGFiIDogeworCQkqKC5zdHJ0YWIpCisJfQorCisJLmJzcyAoTk9MT0FEKSA6IHsKKwkJLyogdGhlIEVGSSBsb2FkZXIgZG9lc24ndCBzZWVtIHRvIGxpa2UgYSAuYnNzIHNlY3Rpb24sCisJCSAgIHNvIHdlIHN0aWNrIGl0IGFsbCBpbnRvIC5kYXRhOiAqLworCQlfX2Jzc19zdGFydCA9IC47CisJCSooLmJzcykKKwkJKiguYnNzLiopCisJCSooLmJzczE2KQorCQkqKC5odWdlYnNzKQorCQkqKENPTU1PTikKKwkJX19ic3NfZW5kID0gLjsKKwkJKiguc2JzcykKKwkJKiguc2NvbW1vbikKKwl9CisJX19ic3NfbGVuID0gQUJTT0xVVEUoX19ic3NfZW5kKSAtIEFCU09MVVRFKF9fYnNzX3N0YXJ0KTsKKwlfX2Jzc19kd29yZHMgPSAoX19ic3NfbGVuICsgMykgPj4gMjsKKworCS4gPSBBTElHTigxMjgpOworCisJLyogVmVyeSBsYXJnZSBvYmplY3RzIHdoaWNoIGRvbid0IG5lZWQgdG8gYmUgemVyb2VkICovCisKKwkuaHVnZWJzcyA6IHsKKwkJX19odWdlYnNzX3N0YXJ0ID0gLjsKKwkJKiguaHVnZWJzcykKKwkJKiguaHVnZWJzcy4qKQorCQlfX2h1Z2Vic3NfZW5kID0gLjsKKwl9CisKKwlfZW5kID0gLjsKKworCS8qIFN0dWZmIHdlIGRvbid0IG5lZWQuLi4gKi8KKwkvRElTQ0FSRC8gOiB7CisJCSooLmVoX2ZyYW1lKQorCQkqKC5jb21tZW50KQorCX0KK30KZGlmZiAtLWdpdCBhL2VmaTMyL2NvbTMyL2NoYWluL2NoYWluLmMzMiBiL2VmaTMyL2NvbTMyL2NoYWluL2NoYWluLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iM2YzMzZkCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvY2hhaW4vY2hhaW4uYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTMyL2NvbTMyL2NtZW51L2NvbXBsZXguYzMyIGIvZWZpMzIvY29tMzIvY21lbnUvY29tcGxleC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTQ0NTNkNAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2NtZW51L2NvbXBsZXguYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTMyL2NvbTMyL2NtZW51L2Rpc3BsYXkuYzMyIGIvZWZpMzIvY29tMzIvY21lbnUvZGlzcGxheS5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmNlYjYwOAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2NtZW51L2Rpc3BsYXkuYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTMyL2NvbTMyL2NtZW51L2xpYm1lbnUvbGlibWVudS5jMzIgYi9lZmkzMi9jb20zMi9jbWVudS9saWJtZW51L2xpYm1lbnUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiNzlmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9jbWVudS9saWJtZW51L2xpYm1lbnUuYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTMyL2NvbTMyL2NtZW51L3NpbXBsZS5jMzIgYi9lZmkzMi9jb20zMi9jbWVudS9zaW1wbGUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwNGRkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9jbWVudS9zaW1wbGUuYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTMyL2NvbTMyL2NtZW51L3Rlc3QuYyBiL2VmaTMyL2NvbTMyL2NtZW51L3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZkZTIxCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvY21lbnUvdGVzdC5jCkBAIC0wLDAgKzEsNDc3IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA2IE11cmFsaSBLcmlzaG5hbiBHYW5hcGF0aHkgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCisjZW5kaWYKKworI2luY2x1ZGUgImNtZW51LmgiCisjaW5jbHVkZSAiaGVscC5oIgorI2luY2x1ZGUgInBhc3N3b3Jkcy5oIgorI2luY2x1ZGUgImNvbTMyaW8uaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBNQVhfQ01EX0xJTkVfTEVOR1RIIDUxNAorCit0eXBlZGVmIHN0cnVjdCBzX3h0cmEgeworICBsb25nIGlwYXBwZW5kOyAvLyBTdG9yZXMgdGhlIGlwYXBwZW5kIGZsYWcgdG8gc2VuZCAodXNlZnVsIGZvciBQWEVMSU5VWCBvbmx5KQorICBjaGFyICphcmdzbWVudTsgLy8gU3RvcmVzIHRoZSBuYW1lIG9mIG1lbnUgd2hpY2ggY29udGFpbnMgb3B0aW9ucyBmb3IgdGhlIGdpdmVuIFJVTiBpdGVtCisgIGNoYXIgKnBlcm1zOyAvLyBzdG9yZXMgdGhlIHBlcm1pc3Npb25zIHJlcXVpcmVkIHRvIGFjdGl2YXRlIHRoZSBpdGVtCit9IHRfeHRyYTsKKwordHlwZWRlZiB0X3h0cmEgKnB0X3h0cmE7IC8vIFBvaW50ZXIgdG8gZXh0cmEgZGF0YXN0cnVjdHVyZQorCisvLyBUeXBlcyBvZiBkb3QgY29tbWFuZHMgZm9yIHdoaWNoIGNhbGxlciB0YWtlcyByZXNwb25zaWJpbGl0eSBvZiBoYW5kbGluZworLy8gSW4gc29tZSBjYXNlIHNvbWUgY29tbWFuZHMgbWF5IG5vdCBtYWtlIHNlbnNlLCBpdCBpcyB1cCB0byB0aGUgY2FsbGVyCisvLyB0byBoYW5kbGUgY2FzZXMgd2hpY2ggZG8gbm90IG1ha2Ugc2Vuc2UKK3R5cGVkZWYgZW51bSB7UVVJVF9DTUQsIFJFUEVBVF9DTUQsIEVOVEVSX0NNRCwgRVNDQVBFX0NNRH0gdF9kb3RjbWQ7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzICovCisKKy8vIGRlZmF1bHQgdXNlcgorI2RlZmluZSBHVUVTVF9VU0VSICJndWVzdCIKKworLy8gZm9yIGxvY2FsIGNvbW1hbmRzLiByZXR1cm4gdmFsdWUgb2YgZXhlY2RvdGNtZAorI2RlZmluZSBRVUlUX0NNRCAwCisjZGVmaW5lIFJQVF9DTUQgMQorCitjaGFyIHVzZXJuYW1lWzEyXTsgLy8gTmFtZSBvZiB1c2VyIGN1cnJlbnRseSB1c2luZyB0aGUgc3lzdGVtCisKK2ludCBQV0RfUk9XOyAvLyBMaW5lIG51bWJlciB3aGVyZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGhhcHBlbnMKK2ludCBFRElUX1JPVzsgLy8gcm93IHdoZXJlIFVzZXIgVGFiCisKK2NoYXIgbG9naW5zdHJbXSA9ICI8TD5vZ2luICAiOworY2hhciBsb2dvdXRzdHJbMzBdOworCitpbnQgdm1vZGU7IC8vIFRoZSB2aWRlbyBtb2RlIHdlIHdhbnQgdG8gYmUgaW4KK2NoYXIgdGltZW91dGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsgLy8gQ29tbWFuZCB0byBleGVjdXRlIG9uIHRpbWVvdXQKK2NoYXIgdG90YWx0aW1lb3V0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOyAvLyBDb21tYW5kIHRvIGV4ZWN1dGUgb24gdG90YWx0aW1lb3V0CisKK2NoYXIgUVVJVFNUUltdID0gIi5xdWl0IjsgLy8gc2FtZSBhcyBleGl0CitjaGFyIElHTk9SRVNUUltdPSIuaWdub3JlIjsgLy8gc2FtZSBhcyByZXBlYXQsIHdhaXQKKworLyotLS0tLS0tLS0tLS0tLS0tICBFbmQgZ2xvYmFscyAqLworCisvLyByZXR1cm5zIHBvaW50ZXIgdG8gZmlyc3Qgbm9uLXNwYWNlIGNoYXIKKy8vIGFuZCBhZHZhbmNlcyBlbmQgb2Ygc3RyIGJ5IHJlbW92aW5nIHRyYWlsaW5nIHNwYWNlcworY2hhciAqIHN0cmlwKGNoYXIgKnN0cikKK3sKKyAgY2hhciAqcCwqcywqZTsKKyAgaWYgKCFzdHIpIHJldHVybiBOVUxMOworICBwID0gc3RyOworICBzID0gTlVMTDsKKyAgZSA9IE5VTEw7CisgIHdoaWxlICgqcCkgeworICAgIGlmICgqcCAhPSAnICcpIHsKKyAgICAgICAvLyBtYXJrIHN0YXJ0IG9mIHN0cmluZyBvciByZWNvcmQgdGhlIGxhc3QgdmlzaXRlZCBub24tc3BhY2UgY2hhcgorICAgICAgIGlmICghcykgcz1wOyBlbHNlIGU9cDsKKyAgICB9CisgICAgcCsrOworICB9CisgICooKytlKT0nXDAnOyAvLyBraWxsIHN0cmluZyBlYXJsaWVyCisgIHJldHVybiBzOworfQorCisvLyBleGVjdXRlcyBhIGxpc3Qgb2YgJSBzZXBhcmF0ZWQgY29tbWFuZHMKKy8vIG5vbi1kb3QgY29tbWFuZHMgYXJlIGFzc3VtZWQgdG8gYmUgc3lzbGludXggY29tbWFuZHMKKy8vIEFsbCBzeXNsaW51eCBjb21tYW5kcyBhcmUgYXBwZW5kZWQgd2l0aCB0aGUgY29udGVudHMgb2Yga2VyYXJncworLy8gSWYgaXQgZmFpbHMgKGtlcm5lbCBub3QgZm91bmQpIHRoZW4gdGhlIG5leHQgb25lIGlzIHRyaWVkIGluIHRoZQorLy8gbGlzdAorLy8gcmV0dXJucyBRVUlUX0NNRCBvciBSUFRfQ01ECit0X2RvdGNtZCBleGVjZG90Y21kKGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqZGVmY21kLCBjb25zdCBjaGFyICprZXJhcmdzKQoreworICAgY2hhciBjbWRsaW5lW01BWF9DTURfTElORV9MRU5HVEhdOworICAgY2hhciBkb3RjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgICBjaGFyICpjdXJyLCpuZXh0LCpwLCphcmdzOworICAgY2hhciBjdHI7CisKKyAgIHN0cmNweShkb3RjbWQsY21kKTsKKyAgIG5leHQgPSBkb3RjbWQ7CisgICBjbWRsaW5lWzBdID0gJ1wwJzsKKyAgIHdoaWxlICgqbmV4dCkgeyAvLyBpZiBzb21ldGhpbmcgdG8gZG8KKyAgICAgIGN1cnIgPSBuZXh0OworICAgICAgcCA9IHN0cmNocihuZXh0LCclJyk7CisgICAgICBpZiAocCkgeworICAgICAgICAgKnAtLT0nXDAnOyBuZXh0PXArMjsKKyAgICAgICAgIHdoaWxlICgqcCA9PSAnICcpIHAtLTsKKyAgICAgICAgICooKytwKT0nXDAnOyAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKmRlZmNtZCkgeyAvLyBleGVjdXRlIGRlZmNtZCBuZXh0CisgICAgICAgICAgICBuZXh0PWRlZmNtZDsKKyAgICAgICAgICAgIGRlZmNtZD1OVUxMOyAvLyBleGVjIGRlZiBjbWQgb25seSBvbmNlCisgICAgICAgIH0gZWxzZSBuZXh0PU5VTEw7CisgICAgICB9CisgICAgICAvLyBub3cgd2UganVzdCBuZWVkIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgImN1cnIiCisgICAgICBjdXJyID0gc3RyaXAoY3Vycik7CisgICAgICBpZiAoY3VyclswXSAhPSAnLicpIHsgLy8ganVzdCBydW4gdGhlIGtlcm5lbAorICAgICAgICAgc3RyY3B5KGNtZGxpbmUsY3Vycik7CisgICAgICAgICBpZiAoa2VyYXJncykgc3RyY2F0KGNtZGxpbmUsa2VyYXJncyk7CisgICAgICAgICBydW5zeXNsaW51eGltYWdlKGNtZGxpbmUsMCk7IC8vIE5vIElQQXBwZW5kCisgICAgICB9IGVsc2UgeyAvLyBXZSBoYXZlIGEgRE9UIGNvbW1hbmQKKyAgICAgICAgLy8gc3BsaXQgY29tbWFuZCBpbnRvIGNvbW1hbmQgYW5kIGFyZ3MgKG1heSBiZSBlbXB0eSkKKyAgICAgICAgYXJncyA9IGN1cnI7CisgICAgICAgIHdoaWxlICggKCphcmdzICE9ICcgJykgJiYgKCphcmdzICE9ICdcMCcpICkgYXJncysrOworICAgICAgICBpZiAoKmFyZ3MpIHsgLy8gZm91bmQgYSBzcGFjZQorICAgICAgICAgICAqYXJncysrID0gJ1wwJzsKKyAgICAgICAgICAgd2hpbGUgKCphcmdzID09ICcgJykgYXJncysrOyAvLyBza2lwIG92ZXIgc3BhY2VzCisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoc3RyY21wKGN1cnIsIi5leGl0Iik9PTApIHx8CisgICAgICAgICAgICAgKHN0cmNtcChjdXJyLCIucXVpdCIpPT0wKQorICAgICAgICAgICApCisgICAgICAgICAgIHJldHVybiBRVUlUX0NNRDsKKyAgICAgICAgaWYgKCAoc3RyY21wKGN1cnIsIi5yZXBlYXQiKT09MCkgfHwKKyAgICAgICAgICAgICAoc3RyY21wKGN1cnIsIi5pZ25vcmUiKT09MCkgfHwKKyAgICAgICAgICAgICAoc3RyY21wKGN1cnIsIi53YWl0Iik9PTApCisgICAgICAgICAgICkKKyAgICAgICAgICAgcmV0dXJuIFJQVF9DTUQ7CisgICAgICAgIGlmIChzdHJjbXAoY3VyciwiLmJlZXAiKT09MCkgeworICAgICAgICAgICBpZiAoKGFyZ3MpICYmICgnMCcgPD0gYXJnc1swXSkgJiYgKGFyZ3NbMF0gPD0gJzknKSkKKyAgICAgICAgICAgICAgY3RyID0gYXJnc1swXS0nMCc7CisgICAgICAgICAgIGVsc2UgY3RyPTE7CisgICAgICAgICAgIGZvciAoO2N0cj4wOyBjdHItLSkgYmVlcCgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAoY3VyciwiLmhlbHAiKT09MCkgcnVuaGVscChhcmdzKTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBSUFRfQ01EOyAvLyBieSBkZWZhdWx0IHdlIGRvIG5vdCBxdWl0Cit9CisKKworVElNRU9VVENPREUgdGltZW91dChjb25zdCBjaGFyICpjbWQpCit7CisgIHRfZG90Y21kIGM7CisgIGMgPSBleGVjZG90Y21kKGNtZCwiLndhaXQiLE5VTEwpOworICBzd2l0Y2goYykgeworICAgIGNhc2UgRU5URVJfQ01EOgorICAgICAgICAgcmV0dXJuIENPREVfRU5URVI7CisgICAgY2FzZSBFU0NBUEVfQ01EOgorICAgICAgICAgcmV0dXJuIENPREVfRVNDQVBFOworICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gQ09ERV9XQUlUOworICB9Cit9CisKK1RJTUVPVVRDT0RFIG9udGltZW91dCh2b2lkKQoreworICAgcmV0dXJuIHRpbWVvdXQodGltZW91dGNtZCk7Cit9CisKK1RJTUVPVVRDT0RFIG9udG90YWx0aW1lb3V0KHZvaWQpCit7CisgICByZXR1cm4gdGltZW91dCh0b3RhbHRpbWVvdXRjbWQpOworfQorCit2b2lkIGtleXNfaGFuZGxlcih0X21lbnVzeXN0ZW0gKiBtcyBfX2F0dHJpYnV0ZV9fICgoIHVudXNlZCApKSwgdF9tZW51aXRlbSAqIG1pLCBpbnQgc2NhbmNvZGUpCit7CisgICBpbnQgbmMsIG5yOworCisgICBpZiAoZ2V0c2NyZWVuc2l6ZSgxLCAmbnIsICZuYykpIHsKKyAgICAgICAvKiBVbmtub3duIHNjcmVlbiBzaXplPyAqLworICAgICAgIG5jID0gODA7CisgICAgICAgbnIgPSAyNDsKKyAgIH0KKworICAgaWYgKCAoc2NhbmNvZGUgPT0gS0VZX0YxKSAmJiAobWktPmhlbHBpZCAhPSAweEZGRkYpICkgeyAvLyBJZiBzY2FuY29kZSBvZiBGMSBhbmQgbm9uLXRyaXZpYWwgaGVscGlkCisgICAgICBydW5oZWxwc3lzdGVtKG1pLT5oZWxwaWQpOworICAgfQorCisgICAvLyBJZiB1c2VyIGhpdCBUQUIsIGFuZCBpdGVtIGlzIGFuICJleGVjdXRhYmxlIiBpdGVtCisgICAvLyBhbmQgdXNlciBoYXMgcHJpdmlsZWdlcyB0byBlZGl0IGl0LCBlZGl0IGl0IGluIHBsYWNlLgorICAgaWYgKChzY2FuY29kZSA9PSBLRVlfVEFCKSAmJiAobWktPmFjdGlvbiA9PSBPUFRfUlVOKSAmJgorICAgICAgIChFRElUX1JPVyA8IG5yKSAmJiAoRURJVF9ST1cgPiAwKSAmJgorICAgICAgIChpc2FsbG93ZWQodXNlcm5hbWUsImVkaXRjbWQiKSB8fCBpc2FsbG93ZWQodXNlcm5hbWUsInJvb3QiKSkpIHsKKyAgICAgLy8gVXNlciB0eXBlZCBUQUIgYW5kIGhhcyBwZXJtaXNzaW9ucyB0byBlZGl0IGNvbW1hbmQgbGluZQorICAgICBnb3RveHkoRURJVF9ST1csMSk7CisgICAgIGNzcHJpbnQoIkNvbW1hbmQgbGluZToiLDB4MDcpOworICAgICBlZGl0c3RyaW5nKG1pLT5kYXRhLEFDVElPTkxFTik7CisgICAgIGdvdG94eShFRElUX1JPVywxKTsKKyAgICAgY3ByaW50KCcgJywweDA3LG5jLTEpOworICAgfQorfQorCit0X2hhbmRsZXJfcmV0dXJuIGxvZ2luX2hhbmRsZXIodF9tZW51c3lzdGVtICptcywgdF9tZW51aXRlbSAqbWkpCit7CisgICh2b2lkKW1pOyAvLyBVbnVzZWQKKyAgY2hhciBwd2RbNDBdOworICBjaGFyIGxvZ2luWzQwXTsKKyAgaW50IG5jLCBucjsKKyAgdF9oYW5kbGVyX3JldHVybiBydjsKKworICAodm9pZCltczsKKworICBydiA9IEFDVElPTl9JTlZBTElEOworICBpZiAoUFdEX1JPVyA8IDApIHJldHVybiBydjsgLy8gTm8gbmVlZCB0byBhdXRoZW50aWNhdGUKKworICBpZiAobWktPml0ZW0gPT0gbG9naW5zdHIpIHsgLyogVXNlciB3YW50cyB0byBsb2dpbiAqLworICAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZuciwgJm5jKSkgeworICAgICAgICAvKiBVbmtub3duIHNjcmVlbiBzaXplPyAqLworICAgICAgICBuYyA9IDgwOworICAgICAgICBuciA9IDI0OworICAgIH0KKworICAgIGdvdG94eShQV0RfUk9XLDEpOworICAgIGNzcHJpbnQoIkVudGVyIFVzZXJuYW1lOiAiLDB4MDcpOworICAgIGdldHN0cmluZyhsb2dpbiwgc2l6ZW9mIHVzZXJuYW1lKTsKKyAgICBnb3RveHkoUFdEX1JPVywxKTsKKyAgICBjcHJpbnQoJyAnLDB4MDcsbmMpOworICAgIGNzcHJpbnQoIkVudGVyIFBhc3N3b3JkOiAiLDB4MDcpOworICAgIGdldHB3ZChwd2QsIHNpemVvZiBwd2QpOworICAgIGdvdG94eShQV0RfUk9XLDEpOworICAgIGNwcmludCgnICcsMHgwNyxuYyk7CisKKyAgICBpZiAoYXV0aGVudGljYXRlX3VzZXIobG9naW4scHdkKSkKKyAgICB7CisgICAgICBzdHJjcHkodXNlcm5hbWUsbG9naW4pOworICAgICAgc3RyY3B5KGxvZ291dHN0ciwiPEw+b2dvdXQgIik7CisgICAgICBzdHJjYXQobG9nb3V0c3RyLHVzZXJuYW1lKTsKKyAgICAgIG1pLT5pdGVtID0gbG9nb3V0c3RyOyAvLyBDaGFuZ2UgaXRlbSB0byByZWFkICJMb2dvdXQiCisgICAgICBydi5yZWZyZXNoID0gMTsgLy8gcmVmcmVzaCB0aGUgc2NyZWVuIChhcyBpdGVtIGNvbnRlbnRzIGNoYW5nZWQpCisgICAgfQorICAgIGVsc2Ugc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworICB9CisgIGVsc2UgLy8gVXNlciBuZWVkcyB0byBsb2dvdXQKKyAgeworICAgIHN0cmNweSh1c2VybmFtZSxHVUVTVF9VU0VSKTsKKyAgICBzdHJjcHkobG9nb3V0c3RyLCIiKTsKKyAgICBtaS0+aXRlbSA9IGxvZ2luc3RyOworICB9CisKKyAgcmV0dXJuIHJ2OworfQorCit0X2hhbmRsZXJfcmV0dXJuIGNoZWNrX3Blcm1zKHRfbWVudXN5c3RlbSAqbXMsIHRfbWVudWl0ZW0gKm1pKQoreworICAgY2hhciAqcGVybXM7CisgICBwdF94dHJhIHg7CisKKyAgICh2b2lkKSBtczsgLy8gVG8ga2VlcCBjb21waWxlciBoYXBweQorCisgICB4ID0gKHB0X3h0cmEpIG1pLT5leHRyYV9kYXRhOworICAgcGVybXMgPSAoIHggPyB4LT5wZXJtcyA6IE5VTEwpOworICAgaWYgKCFwZXJtcykgcmV0dXJuIEFDVElPTl9WQUxJRDsKKworICAgaWYgKGlzYWxsb3dlZCh1c2VybmFtZSwicm9vdCIpIHx8IGlzYWxsb3dlZCh1c2VybmFtZSxwZXJtcykpIC8vIElmIGFsbG93ZWQKKyAgICAgIHJldHVybiBBQ1RJT05fVkFMSUQ7CisgICBlbHNlIHJldHVybiBBQ1RJT05fSU5WQUxJRDsKK30KKworLy8gQ29tcHV0ZSB0aGUgZnVsbCBjb21tYW5kIGxpbmUgdG8gYWRkIGFuZCBpZiBub24tdHJpdmlhbAorLy8gcHJlcGVuZCB0aGUgc3RyaW5nIHByZXBlbmQgdG8gZmluYWwgY29tbWFuZCBsaW5lCisvLyBBc3N1bWUgY21kbGluZSBwb2ludHMgdG8gYnVmZmVyIGxvbmcgZW5vdWdoIHRvIGhvbGQgYW5zd2VyCit2b2lkIGdlbmNvbW1hbmQocHRfbWVudWl0ZW0gbWksIGNoYXIgKmNtZGxpbmUpCit7CisgICBwdF94dHJhIHg7CisgICBjbWRsaW5lWzBdID0gJ1wwJzsKKyAgIHN0cmNhdChjbWRsaW5lLG1pLT5kYXRhKTsKKyAgIHggPSAocHRfeHRyYSkgbWktPmV4dHJhX2RhdGE7CisgICBpZiAoICh4KSAmJiAoeC0+YXJnc21lbnUpKSBnZW5fYXBwZW5kX2xpbmUoeC0+YXJnc21lbnUsY21kbGluZSk7Cit9CisKKworLy8gcnVuIHRoZSBnaXZlbiBjb21tYW5kIHRvZ2V0aGVyIHdpdGggYWRkaXRpb25hbCBvcHRpb25zIHdoaWNoIG1heSBuZWVkIHBhc3NpbmcKK3ZvaWQgcnVuY29tbWFuZChwdF9tZW51aXRlbSBtaSkKK3sKKyAgIGNoYXIgKmxpbmU7CisgICBwdF94dHJhIHg7CisgICBsb25nIGlwYXBwZW5kOworCisgICBsaW5lID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKk1BWF9DTURfTElORV9MRU5HVEgpOworICAgZ2VuY29tbWFuZChtaSxsaW5lKTsKKyAgIHggPSAocHRfeHRyYSkgbWktPmV4dHJhX2RhdGE7CisgICBpcGFwcGVuZCA9ICh4ID8geC0+aXBhcHBlbmQgOiAwKTsKKworICAgcnVuc3lzbGludXhpbWFnZShsaW5lLGlwYXBwZW5kKTsKKyAgIGZyZWUobGluZSk7Cit9CisKKy8vIHNldCB0aGUgZXh0cmEgaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBtZW51IGl0ZW0uCit2b2lkIHNldF94dHJhKHB0X21lbnVpdGVtIG1pLCBjb25zdCBjaGFyICphcmdzbWVudSwgY29uc3QgY2hhciAqcGVybXMsIHVuc2lnbmVkIGludCBoZWxwaWQsIGxvbmcgaXBhcHBlbmQpCit7CisgICBwdF94dHJhIHh0cmE7CisgICBpbnQgYmFkX2FyZ3NtZW51LCBiYWRfcGVybXMsIGJhZF9pcGFwcGVuZDsKKworICAgbWktPmV4dHJhX2RhdGEgPSBOVUxMOyAvLyBpbml0YWxpemUKKyAgIG1pLT5oZWxwaWQgPSBoZWxwaWQ7IC8vIHNldCBoZWxwIGlkCisKKyAgIGlmIChtaS0+YWN0aW9uICE9IE9QVF9SVU4pIHJldHVybjsKKworICAgYmFkX2FyZ3NtZW51ID0gYmFkX3Blcm1zID0gYmFkX2lwYXBwZW5kID0gMDsKKyAgIGlmICggKGFyZ3NtZW51PT1OVUxMKSB8fCAoc3RybGVuKGFyZ3NtZW51KT09MCkpIGJhZF9hcmdzbWVudSA9IDE7CisgICBpZiAoIChwZXJtcz09TlVMTCkgfHwgKHN0cmxlbihwZXJtcyk9PTApKSBiYWRfcGVybXMgPSAxOworICAgaWYgKCBpcGFwcGVuZD09MCkgYmFkX2lwYXBwZW5kID0gMTsKKworICAgaWYgKGJhZF9hcmdzbWVudSAmJiBiYWRfcGVybXMgJiYgYmFkX2lwYXBwZW5kKSByZXR1cm47CisKKyAgIHh0cmEgPSAocHRfeHRyYSkgbWFsbG9jKHNpemVvZih0X3h0cmEpKTsKKyAgIG1pLT5leHRyYV9kYXRhID0gKHZvaWQgKikgeHRyYTsKKyAgIHh0cmEtPmFyZ3NtZW51ID0geHRyYS0+cGVybXMgPSBOVUxMOworICAgeHRyYS0+aXBhcHBlbmQgPSBpcGFwcGVuZDsKKyAgIGlmICghYmFkX2FyZ3NtZW51KSB7CisgICAgICB4dHJhLT5hcmdzbWVudSA9IChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikqKHN0cmxlbihhcmdzbWVudSkrMSkpOworICAgICAgc3RyY3B5KHh0cmEtPmFyZ3NtZW51LGFyZ3NtZW51KTsKKyAgIH0KKyAgIGlmICghYmFkX3Blcm1zKSB7CisgICAgICB4dHJhLT5wZXJtcyA9IChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikqKHN0cmxlbihwZXJtcykrMSkpOworICAgICAgc3RyY3B5KHh0cmEtPnBlcm1zLHBlcm1zKTsKKyAgICAgIG1pLT5oYW5kbGVyID0gJmNoZWNrX3Blcm1zOworICAgfQorfQorCitpbnQgbWFpbih2b2lkKQoreworICBwdF9tZW51aXRlbSBjdXJyOworICBjaGFyIHF1aXQ7CisgIGNoYXIgZXhpdGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciBleGl0Y21kcm9vdFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciBvbmVycmNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciBzdGFydGZpbGVbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgIGNoYXIgKmVjbWQ7IC8vIGVmZmVjdGl2ZSBleGl0IGNvbW1hbmQgb3Igb25lcnJvcmNtZAorICBjaGFyIHNraXBiaXRzOworICBjaGFyIHNraXBjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgIGludCB0aW1lb3V0OyAvLyB0aW1lIGluIG11bHRpcGxlcyBvZiAwLjEgc2Vjb25kcworICBpbnQgdG90YWx0aW1lb3V0OyAvLyB0aW1lIGluIG11bHRpcGxlcyBvZiAwLjEgc2Vjb25kcworICB0X2RvdGNtZCBkb3RydjsgLy8gdG8gc3RvcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBleGVjZG90Y21kCisgIGludCB0ZW1wOworCisgIHN0cmNweSh1c2VybmFtZSxHVUVTVF9VU0VSKTsKKy8qIC0tLS0gSW5pdGlhbGl6aW5nIG1lbnUgc3lzdGVtIHBhcmFtZXRlcnMgLS0tICovCisgIHZtb2RlID0gMHhGRjsKKyAgc2tpcGJpdHMgPSAwOworICBQV0RfUk9XID0gMjM7CisgIEVESVRfUk9XID0gMjM7CisgIHN0cmNweShvbmVycmNtZCwiLnJlcGVhdCIpOworICBzdHJjcHkoZXhpdGNtZCwiLmV4aXQiKTsKKyAgc3RyY3B5KGV4aXRjbWRyb290LCIiKTsKKyAgLy8gSWYgbm90IHNwZWNpZmllZCBleGl0Y21kcm9vdCA9IGV4aXRjbWQKKyAgaWYgKGV4aXRjbWRyb290WzBdID09ICdcMCcpIHN0cmNweShleGl0Y21kcm9vdCxleGl0Y21kKTsKKyAgLy8gVGltZW91dCBzdHVmZgorICB0aW1lb3V0ID0gNjAwOworICBzdHJjcHkodGltZW91dGNtZCwiLmJlZXAiKTsKKyAgdG90YWx0aW1lb3V0ID0gMDsKKyAgc3RyY3B5KHRvdGFsdGltZW91dGNtZCwiLndhaXQiKTsKKyAgc3RyY3B5KHN0YXJ0ZmlsZSwiIik7CisKKyAgaW5pdF9oZWxwKCIvaXNvbGludXgvaGVscCIpOworICBpbml0X3Bhc3N3b3JkcygiIik7CisgIGluaXRfbWVudXN5c3RlbSgiQSB0ZXN0IG9mIHRoZSB0ZXN0Lm1lbnUgZmlsZSIpOworICBzZXRfd2luZG93X3NpemUoMSwxLDIzLDc4KTsKKworICAvLyBSZWdpc3RlciB0aGUgb250aW1lb3V0IGhhbmRsZXIsIHdpdGggYSB0aW1lIG91dCBvZiAxMCBzZWNvbmRzCisgIHJlZ19vbnRpbWVvdXQob250aW1lb3V0LHRpbWVvdXQqMTAsMCk7CisgIHJlZ19vbnRvdGFsdGltZW91dChvbnRvdGFsdGltZW91dCx0b3RhbHRpbWVvdXQqMTApOworCisgIC8vIFJlZ2lzdGVyIG1lbnVzeXN0ZW0gaGFuZGxlcnMKKyAgcmVnX2hhbmRsZXIoSERMUl9LRVlTLCZrZXlzX2hhbmRsZXIpOworLyogLS0tLSBFbmQgb2YgaW5pdGlhbGl6YXRpb24gLS0tICovCisKKy8qIC0tLS0tLS0gTUVOVSB0ZXN0aW5nIC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJ0ZXN0aW5nIiwiIFRlc3RpbmcgIiwtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJTZWxmIExvb3AiLCJHbyB0byBUZXN0aW5nIixPUFRfU1VCTUVOVSwidGVzdGluZyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIk1lbW9yeSBUZXN0IiwiUGVyZm9ybSBleHRlbnNpdmUgbWVtb3J5IHRlc3RpbmciLE9QVF9SVU4sIm1lbXRlc3QiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJFeGl0IHRoaXMgbWVudSIsIkdvIG9uZSBsZXZlbCB1cCIsT1BUX0VYSVRNRU5VLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKy8qIC0tLS0tLS0gTUVOVSByZXNjdWUgLS0tLS0gKi8KKyAgYWRkX25hbWVkX21lbnUoInJlc2N1ZSIsIiBSZXNjdWUgT3B0aW9ucyAiLC0xKTsKKyAgc2V0X21lbnVfcG9zKDEwLDEwKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIkxpbnV4IFJlc2N1ZSIsImxpbnJlc2MiLE9QVF9SVU4sImxpbnJlc2MiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJEb3MgUmVzY3VlIiwiZG9zcmVzYyIsT1BUX1JVTiwiZG9zcmVzYyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIldpbmRvd3MgUmVzY3VlIiwid2lucmVzYyIsT1BUX1JVTiwid2lucmVzYyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIkV4aXQgdGhpcyBtZW51IiwiR28gb25lIGxldmVsIHVwIixPUFRfRVhJVE1FTlUsIiIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworLyogLS0tLS0tLSBNRU5VIG1haW4gLS0tLS0gKi8KKyAgYWRkX25hbWVkX21lbnUoIm1haW4iLCIgTWFpbiBNZW51ICIsLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiUHJlcGFyZSIsInByZXAiLE9QVF9SVU4sInByZXAiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJSZXNjdWUgb3B0aW9ucy4uLiIsIlRyb3VibGVzaG9vdCBhIHN5c3RlbSIsT1BUX1NVQk1FTlUsInJlc2N1ZSIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIlRlc3RpbmcuLi4iLCJPcHRpb25zIHRvIHRlc3QgaGFyZHdhcmUiLE9QVF9TVUJNRU5VLCJ0ZXN0aW5nIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiRXhpdCB0aGlzIG1lbnUiLCJHbyBvbmUgbGV2ZWwgdXAiLE9QVF9FWElUTUVOVSwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworLyogLS0tLS0tLSBFTkQgT0YgTUVOVSBkZWNsYXJhdGlvbnMgLS0tLS0gKi8KKworLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHNraXAgdGhlIG1lbnUgYWx0b2dldGhlcgorICBxdWl0ID0gMDsgLy8gRG9udCBza2lwIHRoZSBtZW51CisgIGlmIChnZXRzaGlmdGZsYWdzKCkgJiBza2lwYml0cykgeyAvLyB3ZSBtdXN0IHNraXAgdGhlIG1lbnUgYWx0b2d0aGVyIGFuZCBleGVjdXRlIHNraXBjbWQKKyAgICBkb3RydiA9IGV4ZWNkb3RjbWQoc2tpcGNtZCwiLmJlZXAlLmV4aXQiLE5VTEwpOyAvLyBXb3JzdCBjYXNlIHdlIGJlZXAgYW5kIGV4aXQKKyAgICBpZiAoZG90cnYgPT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICB9CisKKy8vIFN3aXRjaCB2aWRlIG1vZGUgaWYgcmVxdWlyZWQKKyAgIGlmICh2bW9kZSAhPSAweEZGKSBzZXR2aWRlb21vZGUodm1vZGUpOworCisvLyBEbyB3ZSBoYXZlIGEgc3RhcnRmaWxlIHRvIGRpc3BsYXk/CisgICBpZiAoc3RhcnRmaWxlWzBdICE9ICdcMCcpIHJ1bmhlbHAoc3RhcnRmaWxlKTsKKworLy8gVGhlIG1haW4gbG9vcAorICB3aGlsZSAocXVpdCA9PSAwKSB7IC8vIEFzIGxvbmcgYXMgcXVpdCBpcyB6ZXJvIHJlcGVhdAorICAgICBjdXJyID0gc2hvd21lbnVzKGZpbmRfbWVudV9udW0oIm1haW4iKSk7IC8vIEluaXRpYWwgbWVudSBpcyB0aGUgb25lIGNhbGxlZCAibWFpbiIKKworICAgICBpZiAoY3VycikgeworICAgICAgICBpZiAoY3Vyci0+YWN0aW9uID09IE9QVF9SVU4pIHsKKyAgICAgICAgICAgZWNtZCA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSpNQVhfQ01EX0xJTkVfTEVOR1RIKTsKKyAgICAgICAgICAgZ2VuY29tbWFuZChjdXJyLGVjbWQpOworICAgICAgICAgICB0ZW1wID0gKGN1cnItPmV4dHJhX2RhdGEgPyAoKHB0X3h0cmEpY3Vyci0+ZXh0cmFfZGF0YSktPmlwYXBwZW5kIDogMCk7CisgICAgICAgICAgIHJ1bnN5c2xpbnV4aW1hZ2UoZWNtZCx0ZW1wKTsKKyAgICAgICAgICAgLy8ga2VybmVsIG5vdCBmb3VuZCBzbyBleGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBkb3QgY29tbWFuZAorICAgICAgICAgICBkb3RydiA9IGV4ZWNkb3RjbWQob25lcnJjbWQsIi5xdWl0IixlY21kKTsgLy8gcGFzcyBiYWQgY21kbGluZSBhcyBhcmcKKyAgICAgICAgICAgaWYgKGRvdHJ2PT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICAgICAgICAgICBmcmVlKGVjbWQpOyBlY21kID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGNzcHJpbnQoIkVycm9yIGluIHByb2dyYW1taW5nISIsMHgwNyk7CisgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZpbmQgZWZmZWN0aXZlIGV4aXQgY29tbWFuZAorICAgICAgICBlY21kID0gKCBpc2FsbG93ZWQodXNlcm5hbWUsInJvb3QiKSA/IGV4aXRjbWRyb290IDogZXhpdGNtZCk7CisgICAgICAgIGRvdHJ2ID0gZXhlY2RvdGNtZChlY21kLCIucmVwZWF0IixOVUxMKTsKKyAgICAgICAgcXVpdCA9IChkb3RydiA9PSBRVUlUX0NNRCA/IDEgOiAwKTsgLy8gc2hvdWxkIHdlIGV4aXQgbm93CisgICAgIH0KKyAgfQorCisvLyBEZWFsbG9jYXRlIHNwYWNlIHVzZWQgYW5kIHF1aXQKKyAgY2xvc2VfcGFzc3dvcmRzKCk7CisgIGNsb3NlX2hlbHAoKTsKKyAgY2xvc2VfbWVudXN5c3RlbSgpOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvY21lbnUvdGVzdC5jMzIgYi9lZmkzMi9jb20zMi9jbWVudS90ZXN0LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MjlmNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvY21lbnUvdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvY21lbnUvdGVzdDIuYyBiL2VmaTMyL2NvbTMyL2NtZW51L3Rlc3QyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1MmYxYgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2NtZW51L3Rlc3QyLmMKQEAgLTAsMCArMSw1MzQgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDYgTXVyYWxpIEtyaXNobmFuIEdhbmFwYXRoeSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiY21lbnUuaCIKKyNpbmNsdWRlICJoZWxwLmgiCisjaW5jbHVkZSAicGFzc3dvcmRzLmgiCisjaW5jbHVkZSAiY29tMzJpby5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIE1BWF9DTURfTElORV9MRU5HVEggNTE0CisKK3R5cGVkZWYgc3RydWN0IHNfeHRyYSB7CisgIGxvbmcgaXBhcHBlbmQ7IC8vIFN0b3JlcyB0aGUgaXBhcHBlbmQgZmxhZyB0byBzZW5kICh1c2VmdWwgZm9yIFBYRUxJTlVYIG9ubHkpCisgIGNoYXIgKmFyZ3NtZW51OyAvLyBTdG9yZXMgdGhlIG5hbWUgb2YgbWVudSB3aGljaCBjb250YWlucyBvcHRpb25zIGZvciB0aGUgZ2l2ZW4gUlVOIGl0ZW0KKyAgY2hhciAqcGVybXM7IC8vIHN0b3JlcyB0aGUgcGVybWlzc2lvbnMgcmVxdWlyZWQgdG8gYWN0aXZhdGUgdGhlIGl0ZW0KK30gdF94dHJhOworCit0eXBlZGVmIHRfeHRyYSAqcHRfeHRyYTsgLy8gUG9pbnRlciB0byBleHRyYSBkYXRhc3RydWN0dXJlCisKKy8vIFR5cGVzIG9mIGRvdCBjb21tYW5kcyBmb3Igd2hpY2ggY2FsbGVyIHRha2VzIHJlc3BvbnNpYmlsaXR5IG9mIGhhbmRsaW5nCisvLyBJbiBzb21lIGNhc2Ugc29tZSBjb21tYW5kcyBtYXkgbm90IG1ha2Ugc2Vuc2UsIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIKKy8vIHRvIGhhbmRsZSBjYXNlcyB3aGljaCBkbyBub3QgbWFrZSBzZW5zZQordHlwZWRlZiBlbnVtIHtRVUlUX0NNRCwgUkVQRUFUX0NNRCwgRU5URVJfQ01ELCBFU0NBUEVfQ01EfSB0X2RvdGNtZDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgKi8KKworLy8gZGVmYXVsdCB1c2VyCisjZGVmaW5lIEdVRVNUX1VTRVIgImd1ZXN0IgorCisvLyBmb3IgbG9jYWwgY29tbWFuZHMuIHJldHVybiB2YWx1ZSBvZiBleGVjZG90Y21kCisjZGVmaW5lIFFVSVRfQ01EIDAKKyNkZWZpbmUgUlBUX0NNRCAxCisKK2NoYXIgdXNlcm5hbWVbMTJdOyAvLyBOYW1lIG9mIHVzZXIgY3VycmVudGx5IHVzaW5nIHRoZSBzeXN0ZW0KKworaW50IFBXRF9ST1c7IC8vIExpbmUgbnVtYmVyIHdoZXJlIHVzZXIgYXV0aGVudGljYXRpb24gaGFwcGVucworaW50IEVESVRfUk9XOyAvLyByb3cgd2hlcmUgVXNlciBUYWIKKworY2hhciBsb2dpbnN0cltdID0gIjxMPm9naW4gICI7CitjaGFyIGxvZ291dHN0clszMF07CisKK2ludCB2bW9kZTsgLy8gVGhlIHZpZGVvIG1vZGUgd2Ugd2FudCB0byBiZSBpbgorY2hhciB0aW1lb3V0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOyAvLyBDb21tYW5kIHRvIGV4ZWN1dGUgb24gdGltZW91dAorY2hhciB0b3RhbHRpbWVvdXRjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07IC8vIENvbW1hbmQgdG8gZXhlY3V0ZSBvbiB0b3RhbHRpbWVvdXQKKworY2hhciBRVUlUU1RSW10gPSAiLnF1aXQiOyAvLyBzYW1lIGFzIGV4aXQKK2NoYXIgSUdOT1JFU1RSW109Ii5pZ25vcmUiOyAvLyBzYW1lIGFzIHJlcGVhdCwgd2FpdAorCisvKi0tLS0tLS0tLS0tLS0tLS0gIEVuZCBnbG9iYWxzICovCisKKy8vIHJldHVybnMgcG9pbnRlciB0byBmaXJzdCBub24tc3BhY2UgY2hhcgorLy8gYW5kIGFkdmFuY2VzIGVuZCBvZiBzdHIgYnkgcmVtb3ZpbmcgdHJhaWxpbmcgc3BhY2VzCitjaGFyICogc3RyaXAoY2hhciAqc3RyKQoreworICBjaGFyICpwLCpzLCplOworICBpZiAoIXN0cikgcmV0dXJuIE5VTEw7CisgIHAgPSBzdHI7CisgIHMgPSBOVUxMOworICBlID0gTlVMTDsKKyAgd2hpbGUgKCpwKSB7CisgICAgaWYgKCpwICE9ICcgJykgeworICAgICAgIC8vIG1hcmsgc3RhcnQgb2Ygc3RyaW5nIG9yIHJlY29yZCB0aGUgbGFzdCB2aXNpdGVkIG5vbi1zcGFjZSBjaGFyCisgICAgICAgaWYgKCFzKSBzPXA7IGVsc2UgZT1wOworICAgIH0KKyAgICBwKys7CisgIH0KKyAgKigrK2UpPSdcMCc7IC8vIGtpbGwgc3RyaW5nIGVhcmxpZXIKKyAgcmV0dXJuIHM7Cit9CisKKy8vIGV4ZWN1dGVzIGEgbGlzdCBvZiAlIHNlcGFyYXRlZCBjb21tYW5kcworLy8gbm9uLWRvdCBjb21tYW5kcyBhcmUgYXNzdW1lZCB0byBiZSBzeXNsaW51eCBjb21tYW5kcworLy8gQWxsIHN5c2xpbnV4IGNvbW1hbmRzIGFyZSBhcHBlbmRlZCB3aXRoIHRoZSBjb250ZW50cyBvZiBrZXJhcmdzCisvLyBJZiBpdCBmYWlscyAoa2VybmVsIG5vdCBmb3VuZCkgdGhlbiB0aGUgbmV4dCBvbmUgaXMgdHJpZWQgaW4gdGhlCisvLyBsaXN0CisvLyByZXR1cm5zIFFVSVRfQ01EIG9yIFJQVF9DTUQKK3RfZG90Y21kIGV4ZWNkb3RjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpkZWZjbWQsIGNvbnN0IGNoYXIgKmtlcmFyZ3MpCit7CisgICBjaGFyIGNtZGxpbmVbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgICBjaGFyIGRvdGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgIGNoYXIgKmN1cnIsKm5leHQsKnAsKmFyZ3M7CisgICBjaGFyIGN0cjsKKworICAgc3RyY3B5KGRvdGNtZCxjbWQpOworICAgbmV4dCA9IGRvdGNtZDsKKyAgIGNtZGxpbmVbMF0gPSAnXDAnOworICAgd2hpbGUgKCpuZXh0KSB7IC8vIGlmIHNvbWV0aGluZyB0byBkbworICAgICAgY3VyciA9IG5leHQ7CisgICAgICBwID0gc3RyY2hyKG5leHQsJyUnKTsKKyAgICAgIGlmIChwKSB7CisgICAgICAgICAqcC0tPSdcMCc7IG5leHQ9cCsyOworICAgICAgICAgd2hpbGUgKCpwID09ICcgJykgcC0tOworICAgICAgICAgKigrK3ApPSdcMCc7IC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqZGVmY21kKSB7IC8vIGV4ZWN1dGUgZGVmY21kIG5leHQKKyAgICAgICAgICAgIG5leHQ9ZGVmY21kOworICAgICAgICAgICAgZGVmY21kPU5VTEw7IC8vIGV4ZWMgZGVmIGNtZCBvbmx5IG9uY2UKKyAgICAgICAgfSBlbHNlIG5leHQ9TlVMTDsKKyAgICAgIH0KKyAgICAgIC8vIG5vdyB3ZSBqdXN0IG5lZWQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCAiY3VyciIKKyAgICAgIGN1cnIgPSBzdHJpcChjdXJyKTsKKyAgICAgIGlmIChjdXJyWzBdICE9ICcuJykgeyAvLyBqdXN0IHJ1biB0aGUga2VybmVsCisgICAgICAgICBzdHJjcHkoY21kbGluZSxjdXJyKTsKKyAgICAgICAgIGlmIChrZXJhcmdzKSBzdHJjYXQoY21kbGluZSxrZXJhcmdzKTsKKyAgICAgICAgIHJ1bnN5c2xpbnV4aW1hZ2UoY21kbGluZSwwKTsgLy8gTm8gSVBBcHBlbmQKKyAgICAgIH0gZWxzZSB7IC8vIFdlIGhhdmUgYSBET1QgY29tbWFuZAorICAgICAgICAvLyBzcGxpdCBjb21tYW5kIGludG8gY29tbWFuZCBhbmQgYXJncyAobWF5IGJlIGVtcHR5KQorICAgICAgICBhcmdzID0gY3VycjsKKyAgICAgICAgd2hpbGUgKCAoKmFyZ3MgIT0gJyAnKSAmJiAoKmFyZ3MgIT0gJ1wwJykgKSBhcmdzKys7CisgICAgICAgIGlmICgqYXJncykgeyAvLyBmb3VuZCBhIHNwYWNlCisgICAgICAgICAgICphcmdzKysgPSAnXDAnOworICAgICAgICAgICB3aGlsZSAoKmFyZ3MgPT0gJyAnKSBhcmdzKys7IC8vIHNraXAgb3ZlciBzcGFjZXMKKyAgICAgICAgfQorICAgICAgICBpZiAoIChzdHJjbXAoY3VyciwiLmV4aXQiKT09MCkgfHwKKyAgICAgICAgICAgICAoc3RyY21wKGN1cnIsIi5xdWl0Iik9PTApCisgICAgICAgICAgICkKKyAgICAgICAgICAgcmV0dXJuIFFVSVRfQ01EOworICAgICAgICBpZiAoIChzdHJjbXAoY3VyciwiLnJlcGVhdCIpPT0wKSB8fAorICAgICAgICAgICAgIChzdHJjbXAoY3VyciwiLmlnbm9yZSIpPT0wKSB8fAorICAgICAgICAgICAgIChzdHJjbXAoY3VyciwiLndhaXQiKT09MCkKKyAgICAgICAgICAgKQorICAgICAgICAgICByZXR1cm4gUlBUX0NNRDsKKyAgICAgICAgaWYgKHN0cmNtcChjdXJyLCIuYmVlcCIpPT0wKSB7CisgICAgICAgICAgIGlmICgoYXJncykgJiYgKCcwJyA8PSBhcmdzWzBdKSAmJiAoYXJnc1swXSA8PSAnOScpKQorICAgICAgICAgICAgICBjdHIgPSBhcmdzWzBdLScwJzsKKyAgICAgICAgICAgZWxzZSBjdHI9MTsKKyAgICAgICAgICAgZm9yICg7Y3RyPjA7IGN0ci0tKSBiZWVwKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChjdXJyLCIuaGVscCIpPT0wKSBydW5oZWxwKGFyZ3MpOworICAgICAgfQorICAgfQorICAgcmV0dXJuIFJQVF9DTUQ7IC8vIGJ5IGRlZmF1bHQgd2UgZG8gbm90IHF1aXQKK30KKworCitUSU1FT1VUQ09ERSB0aW1lb3V0KGNvbnN0IGNoYXIgKmNtZCkKK3sKKyAgdF9kb3RjbWQgYzsKKyAgYyA9IGV4ZWNkb3RjbWQoY21kLCIud2FpdCIsTlVMTCk7CisgIHN3aXRjaChjKSB7CisgICAgY2FzZSBFTlRFUl9DTUQ6CisgICAgICAgICByZXR1cm4gQ09ERV9FTlRFUjsKKyAgICBjYXNlIEVTQ0FQRV9DTUQ6CisgICAgICAgICByZXR1cm4gQ09ERV9FU0NBUEU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBDT0RFX1dBSVQ7CisgIH0KK30KKworVElNRU9VVENPREUgb250aW1lb3V0KHZvaWQpCit7CisgICByZXR1cm4gdGltZW91dCh0aW1lb3V0Y21kKTsKK30KKworVElNRU9VVENPREUgb250b3RhbHRpbWVvdXQodm9pZCkKK3sKKyAgIHJldHVybiB0aW1lb3V0KHRvdGFsdGltZW91dGNtZCk7Cit9CisKK3ZvaWQga2V5c19oYW5kbGVyKHRfbWVudXN5c3RlbSAqIG1zIF9fYXR0cmlidXRlX18gKCggdW51c2VkICkpLCB0X21lbnVpdGVtICogbWksIGludCBzY2FuY29kZSkKK3sKKyAgIGludCBuYywgbnI7CisKKyAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZuciwgJm5jKSkgeworICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgbmMgPSA4MDsKKyAgICAgICBuciA9IDI0OworICAgfQorCisgICBpZiAoIChzY2FuY29kZSA9PSBLRVlfRjEpICYmIChtaS0+aGVscGlkICE9IDB4RkZGRikgKSB7IC8vIElmIHNjYW5jb2RlIG9mIEYxIGFuZCBub24tdHJpdmlhbCBoZWxwaWQKKyAgICAgIHJ1bmhlbHBzeXN0ZW0obWktPmhlbHBpZCk7CisgICB9CisKKyAgIC8vIElmIHVzZXIgaGl0IFRBQiwgYW5kIGl0ZW0gaXMgYW4gImV4ZWN1dGFibGUiIGl0ZW0KKyAgIC8vIGFuZCB1c2VyIGhhcyBwcml2aWxlZ2VzIHRvIGVkaXQgaXQsIGVkaXQgaXQgaW4gcGxhY2UuCisgICBpZiAoKHNjYW5jb2RlID09IEtFWV9UQUIpICYmIChtaS0+YWN0aW9uID09IE9QVF9SVU4pICYmCisgICAgICAgKEVESVRfUk9XIDwgbnIpICYmIChFRElUX1JPVyA+IDApICYmCisgICAgICAgKGlzYWxsb3dlZCh1c2VybmFtZSwiZWRpdGNtZCIpIHx8IGlzYWxsb3dlZCh1c2VybmFtZSwicm9vdCIpKSkgeworICAgICAvLyBVc2VyIHR5cGVkIFRBQiBhbmQgaGFzIHBlcm1pc3Npb25zIHRvIGVkaXQgY29tbWFuZCBsaW5lCisgICAgIGdvdG94eShFRElUX1JPVywxKTsKKyAgICAgY3NwcmludCgiQ29tbWFuZCBsaW5lOiIsMHgwNyk7CisgICAgIGVkaXRzdHJpbmcobWktPmRhdGEsQUNUSU9OTEVOKTsKKyAgICAgZ290b3h5KEVESVRfUk9XLDEpOworICAgICBjcHJpbnQoJyAnLDB4MDcsbmMtMSk7CisgICB9Cit9CisKK3RfaGFuZGxlcl9yZXR1cm4gbG9naW5faGFuZGxlcih0X21lbnVzeXN0ZW0gKm1zLCB0X21lbnVpdGVtICptaSkKK3sKKyAgKHZvaWQpbWk7IC8vIFVudXNlZAorICBjaGFyIHB3ZFs0MF07CisgIGNoYXIgbG9naW5bNDBdOworICBpbnQgbmMsIG5yOworICB0X2hhbmRsZXJfcmV0dXJuIHJ2OworCisgICh2b2lkKW1zOworCisgIHJ2ID0gQUNUSU9OX0lOVkFMSUQ7CisgIGlmIChQV0RfUk9XIDwgMCkgcmV0dXJuIHJ2OyAvLyBObyBuZWVkIHRvIGF1dGhlbnRpY2F0ZQorCisgIGlmIChtaS0+aXRlbSA9PSBsb2dpbnN0cikgeyAvKiBVc2VyIHdhbnRzIHRvIGxvZ2luICovCisgICAgaWYgKGdldHNjcmVlbnNpemUoMSwgJm5yLCAmbmMpKSB7CisgICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgIG5jID0gODA7CisgICAgICAgIG5yID0gMjQ7CisgICAgfQorCisgICAgZ290b3h5KFBXRF9ST1csMSk7CisgICAgY3NwcmludCgiRW50ZXIgVXNlcm5hbWU6ICIsMHgwNyk7CisgICAgZ2V0c3RyaW5nKGxvZ2luLCBzaXplb2YgdXNlcm5hbWUpOworICAgIGdvdG94eShQV0RfUk9XLDEpOworICAgIGNwcmludCgnICcsMHgwNyxuYyk7CisgICAgY3NwcmludCgiRW50ZXIgUGFzc3dvcmQ6ICIsMHgwNyk7CisgICAgZ2V0cHdkKHB3ZCwgc2l6ZW9mIHB3ZCk7CisgICAgZ290b3h5KFBXRF9ST1csMSk7CisgICAgY3ByaW50KCcgJywweDA3LG5jKTsKKworICAgIGlmIChhdXRoZW50aWNhdGVfdXNlcihsb2dpbixwd2QpKQorICAgIHsKKyAgICAgIHN0cmNweSh1c2VybmFtZSxsb2dpbik7CisgICAgICBzdHJjcHkobG9nb3V0c3RyLCI8TD5vZ291dCAiKTsKKyAgICAgIHN0cmNhdChsb2dvdXRzdHIsdXNlcm5hbWUpOworICAgICAgbWktPml0ZW0gPSBsb2dvdXRzdHI7IC8vIENoYW5nZSBpdGVtIHRvIHJlYWQgIkxvZ291dCIKKyAgICAgIHJ2LnJlZnJlc2ggPSAxOyAvLyByZWZyZXNoIHRoZSBzY3JlZW4gKGFzIGl0ZW0gY29udGVudHMgY2hhbmdlZCkKKyAgICB9CisgICAgZWxzZSBzdHJjcHkodXNlcm5hbWUsR1VFU1RfVVNFUik7CisgIH0KKyAgZWxzZSAvLyBVc2VyIG5lZWRzIHRvIGxvZ291dAorICB7CisgICAgc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworICAgIHN0cmNweShsb2dvdXRzdHIsIiIpOworICAgIG1pLT5pdGVtID0gbG9naW5zdHI7CisgIH0KKworICByZXR1cm4gcnY7Cit9CisKK3RfaGFuZGxlcl9yZXR1cm4gY2hlY2tfcGVybXModF9tZW51c3lzdGVtICptcywgdF9tZW51aXRlbSAqbWkpCit7CisgICBjaGFyICpwZXJtczsKKyAgIHB0X3h0cmEgeDsKKworICAgKHZvaWQpIG1zOyAvLyBUbyBrZWVwIGNvbXBpbGVyIGhhcHB5CisKKyAgIHggPSAocHRfeHRyYSkgbWktPmV4dHJhX2RhdGE7CisgICBwZXJtcyA9ICggeCA/IHgtPnBlcm1zIDogTlVMTCk7CisgICBpZiAoIXBlcm1zKSByZXR1cm4gQUNUSU9OX1ZBTElEOworCisgICBpZiAoaXNhbGxvd2VkKHVzZXJuYW1lLCJyb290IikgfHwgaXNhbGxvd2VkKHVzZXJuYW1lLHBlcm1zKSkgLy8gSWYgYWxsb3dlZAorICAgICAgcmV0dXJuIEFDVElPTl9WQUxJRDsKKyAgIGVsc2UgcmV0dXJuIEFDVElPTl9JTlZBTElEOworfQorCisvLyBDb21wdXRlIHRoZSBmdWxsIGNvbW1hbmQgbGluZSB0byBhZGQgYW5kIGlmIG5vbi10cml2aWFsCisvLyBwcmVwZW5kIHRoZSBzdHJpbmcgcHJlcGVuZCB0byBmaW5hbCBjb21tYW5kIGxpbmUKKy8vIEFzc3VtZSBjbWRsaW5lIHBvaW50cyB0byBidWZmZXIgbG9uZyBlbm91Z2ggdG8gaG9sZCBhbnN3ZXIKK3ZvaWQgZ2VuY29tbWFuZChwdF9tZW51aXRlbSBtaSwgY2hhciAqY21kbGluZSkKK3sKKyAgIHB0X3h0cmEgeDsKKyAgIGNtZGxpbmVbMF0gPSAnXDAnOworICAgc3RyY2F0KGNtZGxpbmUsbWktPmRhdGEpOworICAgeCA9IChwdF94dHJhKSBtaS0+ZXh0cmFfZGF0YTsKKyAgIGlmICggKHgpICYmICh4LT5hcmdzbWVudSkpIGdlbl9hcHBlbmRfbGluZSh4LT5hcmdzbWVudSxjbWRsaW5lKTsKK30KKworCisvLyBydW4gdGhlIGdpdmVuIGNvbW1hbmQgdG9nZXRoZXIgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnMgd2hpY2ggbWF5IG5lZWQgcGFzc2luZwordm9pZCBydW5jb21tYW5kKHB0X21lbnVpdGVtIG1pKQoreworICAgY2hhciAqbGluZTsKKyAgIHB0X3h0cmEgeDsKKyAgIGxvbmcgaXBhcHBlbmQ7CisKKyAgIGxpbmUgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqTUFYX0NNRF9MSU5FX0xFTkdUSCk7CisgICBnZW5jb21tYW5kKG1pLGxpbmUpOworICAgeCA9IChwdF94dHJhKSBtaS0+ZXh0cmFfZGF0YTsKKyAgIGlwYXBwZW5kID0gKHggPyB4LT5pcGFwcGVuZCA6IDApOworCisgICBydW5zeXNsaW51eGltYWdlKGxpbmUsaXBhcHBlbmQpOworICAgZnJlZShsaW5lKTsKK30KKworLy8gc2V0IHRoZSBleHRyYSBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIG1lbnUgaXRlbS4KK3ZvaWQgc2V0X3h0cmEocHRfbWVudWl0ZW0gbWksIGNvbnN0IGNoYXIgKmFyZ3NtZW51LCBjb25zdCBjaGFyICpwZXJtcywgdW5zaWduZWQgaW50IGhlbHBpZCwgbG9uZyBpcGFwcGVuZCkKK3sKKyAgIHB0X3h0cmEgeHRyYTsKKyAgIGludCBiYWRfYXJnc21lbnUsIGJhZF9wZXJtcywgYmFkX2lwYXBwZW5kOworCisgICBtaS0+ZXh0cmFfZGF0YSA9IE5VTEw7IC8vIGluaXRhbGl6ZQorICAgbWktPmhlbHBpZCA9IGhlbHBpZDsgLy8gc2V0IGhlbHAgaWQKKworICAgaWYgKG1pLT5hY3Rpb24gIT0gT1BUX1JVTikgcmV0dXJuOworCisgICBiYWRfYXJnc21lbnUgPSBiYWRfcGVybXMgPSBiYWRfaXBhcHBlbmQgPSAwOworICAgaWYgKCAoYXJnc21lbnU9PU5VTEwpIHx8IChzdHJsZW4oYXJnc21lbnUpPT0wKSkgYmFkX2FyZ3NtZW51ID0gMTsKKyAgIGlmICggKHBlcm1zPT1OVUxMKSB8fCAoc3RybGVuKHBlcm1zKT09MCkpIGJhZF9wZXJtcyA9IDE7CisgICBpZiAoIGlwYXBwZW5kPT0wKSBiYWRfaXBhcHBlbmQgPSAxOworCisgICBpZiAoYmFkX2FyZ3NtZW51ICYmIGJhZF9wZXJtcyAmJiBiYWRfaXBhcHBlbmQpIHJldHVybjsKKworICAgeHRyYSA9IChwdF94dHJhKSBtYWxsb2Moc2l6ZW9mKHRfeHRyYSkpOworICAgbWktPmV4dHJhX2RhdGEgPSAodm9pZCAqKSB4dHJhOworICAgeHRyYS0+YXJnc21lbnUgPSB4dHJhLT5wZXJtcyA9IE5VTEw7CisgICB4dHJhLT5pcGFwcGVuZCA9IGlwYXBwZW5kOworICAgaWYgKCFiYWRfYXJnc21lbnUpIHsKKyAgICAgIHh0cmEtPmFyZ3NtZW51ID0gKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSooc3RybGVuKGFyZ3NtZW51KSsxKSk7CisgICAgICBzdHJjcHkoeHRyYS0+YXJnc21lbnUsYXJnc21lbnUpOworICAgfQorICAgaWYgKCFiYWRfcGVybXMpIHsKKyAgICAgIHh0cmEtPnBlcm1zID0gKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSooc3RybGVuKHBlcm1zKSsxKSk7CisgICAgICBzdHJjcHkoeHRyYS0+cGVybXMscGVybXMpOworICAgICAgbWktPmhhbmRsZXIgPSAmY2hlY2tfcGVybXM7CisgICB9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgIHB0X21lbnVpdGVtIGN1cnI7CisgIGNoYXIgcXVpdDsKKyAgY2hhciBleGl0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIGV4aXRjbWRyb290W01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIG9uZXJyY21kW01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIHN0YXJ0ZmlsZVtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciAqZWNtZDsgLy8gZWZmZWN0aXZlIGV4aXQgY29tbWFuZCBvciBvbmVycm9yY21kCisgIGNoYXIgc2tpcGJpdHM7CisgIGNoYXIgc2tpcGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgaW50IHRpbWVvdXQ7IC8vIHRpbWUgaW4gbXVsdGlwbGVzIG9mIDAuMSBzZWNvbmRzCisgIGludCB0b3RhbHRpbWVvdXQ7IC8vIHRpbWUgaW4gbXVsdGlwbGVzIG9mIDAuMSBzZWNvbmRzCisgIHRfZG90Y21kIGRvdHJ2OyAvLyB0byBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4ZWNkb3RjbWQKKyAgaW50IHRlbXA7CisKKyAgc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworLyogLS0tLSBJbml0aWFsaXppbmcgbWVudSBzeXN0ZW0gcGFyYW1ldGVycyAtLS0gKi8KKyAgdm1vZGUgPSAweEZGOworICBza2lwYml0cyA9IFNISUZUX1BSRVNTRUQgfCBDQVBTTE9DS19PTjsKKyAgUFdEX1JPVyA9IDIzOworICBFRElUX1JPVyA9IDIzOworICBzdHJjcHkob25lcnJjbWQsIi5iZWVwIDIgJSAlIC5oZWxwIGhscDAwMDI1LnR4dCAlIC5leGl0Iik7CisgIHN0cmNweShleGl0Y21kLCIuZXhpdCIpOworICBzdHJjcHkoZXhpdGNtZHJvb3QsIiIpOworICAvLyBJZiBub3Qgc3BlY2lmaWVkIGV4aXRjbWRyb290ID0gZXhpdGNtZAorICBpZiAoZXhpdGNtZHJvb3RbMF0gPT0gJ1wwJykgc3RyY3B5KGV4aXRjbWRyb290LGV4aXRjbWQpOworICAvLyBUaW1lb3V0IHN0dWZmCisgIHRpbWVvdXQgPSA2MDA7CisgIHN0cmNweSh0aW1lb3V0Y21kLCIud2FpdCIpOworICB0b3RhbHRpbWVvdXQgPSAwOworICBzdHJjcHkodG90YWx0aW1lb3V0Y21kLCJjaGFpbi5jMzIgaGQgMCIpOworICBzdHJjcHkoc3RhcnRmaWxlLCJobHAwMDAyNi50eHQiKTsKKworICBpbml0X2hlbHAoIi9pc29saW51eC9oZWxwIik7CisgIGluaXRfcGFzc3dvcmRzKCIvaXNvbGludXgvcGFzc3dvcmQiKTsKKyAgaW5pdF9tZW51c3lzdGVtKCIgQ09NQk9PVCBNZW51IFN5c3RlbSAiKTsKKyAgc2V0X3dpbmRvd19zaXplKDEsMSwyMSw3OSk7CisKKyAgLy8gUmVnaXN0ZXIgdGhlIG9udGltZW91dCBoYW5kbGVyLCB3aXRoIGEgdGltZSBvdXQgb2YgMTAgc2Vjb25kcworICByZWdfb250aW1lb3V0KG9udGltZW91dCx0aW1lb3V0KjEwLDApOworICByZWdfb250b3RhbHRpbWVvdXQob250b3RhbHRpbWVvdXQsdG90YWx0aW1lb3V0KjEwKTsKKworICAvLyBSZWdpc3RlciBtZW51c3lzdGVtIGhhbmRsZXJzCisgIHJlZ19oYW5kbGVyKEhETFJfS0VZUywma2V5c19oYW5kbGVyKTsKKy8qIC0tLS0gRW5kIG9mIGluaXRpYWxpemF0aW9uIC0tLSAqLworCisvKiAtLS0tLS0tIE1FTlUgbmV0bWVudSAtLS0tLSAqLworICBhZGRfbmFtZWRfbWVudSgibmV0bWVudSIsIiBJbml0IE5ldHdvcmsgIiwtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8Tj5vbmUiLCJEb250IHN0YXJ0IG5ldHdvcmsiLE9QVF9SQURJT0lURU0sIm5ldHdvcms9bm8iLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8ZD5oY3AiLCJVc2UgREhDUCIsT1BUX1JBRElPSVRFTSwibmV0d29yaz1kaGNwIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisvKiAtLS0tLS0tIE1FTlUgdGVzdGluZyAtLS0tLSAqLworICBhZGRfbmFtZWRfbWVudSgidGVzdGluZyIsIiBUZXN0aW5nICIsLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPE0+ZW1vcnkgVGVzdCIsIlBlcmZvcm0gZXh0ZW5zaXZlIG1lbW9yeSB0ZXN0aW5nIixPUFRfUlVOLCJtZW10ZXN0IiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiwyNSwzKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEk+bnZpc2libGUiLCJZb3UgZG9udCBzZWUgdGhpcyIsT1BUX0lOVklTSUJMRSwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEU+eGl0IG1lbnUiLCJHbyBvbmUgbGV2ZWwgdXAiLE9QVF9FWElUTUVOVSwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisvKiAtLS0tLS0tIE1FTlUgcmVzY3VlIC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJyZXNjdWUiLCIgUmVzY3VlIE9wdGlvbnMgIiwtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8TD5pbnV4IFJlc2N1ZSIsIlJ1biBsaW5yZXNjIixPUFRfUlVOLCJsaW5yZXNjIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEQ+b3MgUmVzY3VlIiwiZG9zcmVzYyIsT1BUX1JVTiwiZG9zcmVzYyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxXPmluZG93cyBSZXNjdWUiLCJ3aW5yZXNjIixPUFRfUlVOLCJ3aW5yZXNjIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEU+eGl0IHRoaXMgbWVudSIsIkdvIG9uZSBsZXZlbCB1cCIsT1BUX0VYSVRNRU5VLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKy8qIC0tLS0tLS0gTUVOVSBwcmVwIC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJwcmVwIiwiIFByZXAgb3B0aW9ucyAiLC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxiPmFzZXVybCBieSBJUD8iLCJTcGVjaWZ5IGd1aSBiYXNldXJsIGJ5IElQIGFkZHJlc3MiLE9QVF9DSEVDS0JPWCwiYmFzZXVybD1odHRwOi8vMTkyLjE2OC4wLjEiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8bT5vdW50Y2Q/IiwiTW91bnQgdGhlIGNkcm9tIGRyaXZlPyIsT1BUX0NIRUNLQk9YLCJtb3VudGNkIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiTmV0d29yayBJbml0aWFsaXphdGlvbiIsIkhvdyB0byBpbml0aWFsaXNlIG5ldHdvcmsgZGV2aWNlPyIsT1BUX1JBRElPTUVOVSwibmV0bWVudSIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIiIsIiIsT1BUX1NFUCwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiUmVpbnN0YWxsIDx3PmluZG93cyIsIlJlLWluc3RhbGwgdGhlIHdpbmRvd3Mgc2lkZSBvZiBhIGR1YWwgYm9vdCBzZXR1cCIsT1BUX0NIRUNLQk9YLCJyZXBhaXI9d2luIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiUmVpbnN0YWxsIDxsPmludXgiLCJSZS1pbnN0YWxsIHRoZSBsaW51eCBzaWRlIG9mIGEgZHVhbCBib290IHNldHVwIixPUFRfQ0hFQ0tCT1gsInJlcGFpcj1saW4iLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCIiLCIiLE9QVF9TRVAsIiIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxSPnVuIHByZXAgbm93IiwiRXhlY3V0ZSBwcmVwIHdpdGggdGhlIGFib3ZlIG9wdGlvbnMiLE9QVF9SVU4sInByZXAiLDApOworICBzZXRfeHRyYShjdXJyLCJwcmVwIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEU+eGl0IHRoaXMgbWVudSIsIkdvIHVwIG9uZSBsZXZlbCIsT1BUX0VYSVRNRU5VLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKy8qIC0tLS0tLS0gTUVOVSBtYWluIC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJtYWluIiwiIE1haW4gTWVudSAiLC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0obG9naW5zdHIsIkxvZ2luL0xvZ291dCBvZiBhdXRoZW50aWNhdGlvbiBzeXN0ZW0iLE9QVF9SVU4sTlVMTCwwKTsKKyAgY3Vyci0+aGVscGlkID0gNjU1MzU7CisgIGN1cnItPmhhbmRsZXIgPSAmbG9naW5faGFuZGxlcjsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxQPnJlcGFyZSIsInByZXAiLE9QVF9SVU4sInByZXAiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8UD5yZXAgb3B0aW9ucy4uLiIsIk9wdGlvbnMgZm9yIHByZXAiLE9QVF9TVUJNRU5VLCJwcmVwIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPFI+ZXNjdWUgb3B0aW9ucy4uLiIsIlRyb3VibGVzaG9vdCBhIHN5c3RlbSIsT1BUX1NVQk1FTlUsInJlc2N1ZSIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsMjYsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxUPmVzdGluZy4uLiIsIk9wdGlvbnMgdG8gdGVzdCBoYXJkd2FyZSIsT1BUX1NVQk1FTlUsInRlc3RpbmciLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8RT54aXQgdG8gcHJvbXB0IiwiRXhpdCB0aGUgbWVudSBzeXN0ZW0iLE9QVF9FWElUTUVOVSwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworLyogLS0tLS0tLSBFTkQgT0YgTUVOVSBkZWNsYXJhdGlvbnMgLS0tLS0gKi8KKworLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHNraXAgdGhlIG1lbnUgYWx0b2dldGhlcgorICBxdWl0ID0gMDsgLy8gRG9udCBza2lwIHRoZSBtZW51CisgIGlmIChnZXRzaGlmdGZsYWdzKCkgJiBza2lwYml0cykgeyAvLyB3ZSBtdXN0IHNraXAgdGhlIG1lbnUgYWx0b2d0aGVyIGFuZCBleGVjdXRlIHNraXBjbWQKKyAgICBkb3RydiA9IGV4ZWNkb3RjbWQoc2tpcGNtZCwiLmJlZXAlLmV4aXQiLE5VTEwpOyAvLyBXb3JzdCBjYXNlIHdlIGJlZXAgYW5kIGV4aXQKKyAgICBpZiAoZG90cnYgPT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICB9CisKKy8vIFN3aXRjaCB2aWRlIG1vZGUgaWYgcmVxdWlyZWQKKyAgIGlmICh2bW9kZSAhPSAweEZGKSBzZXR2aWRlb21vZGUodm1vZGUpOworCisvLyBEbyB3ZSBoYXZlIGEgc3RhcnRmaWxlIHRvIGRpc3BsYXk/CisgICBpZiAoc3RhcnRmaWxlWzBdICE9ICdcMCcpIHJ1bmhlbHAoc3RhcnRmaWxlKTsKKworLy8gVGhlIG1haW4gbG9vcAorICB3aGlsZSAocXVpdCA9PSAwKSB7IC8vIEFzIGxvbmcgYXMgcXVpdCBpcyB6ZXJvIHJlcGVhdAorICAgICBjdXJyID0gc2hvd21lbnVzKGZpbmRfbWVudV9udW0oIm1haW4iKSk7IC8vIEluaXRpYWwgbWVudSBpcyB0aGUgb25lIGNhbGxlZCAibWFpbiIKKworICAgICBpZiAoY3VycikgeworICAgICAgICBpZiAoY3Vyci0+YWN0aW9uID09IE9QVF9SVU4pIHsKKyAgICAgICAgICAgZWNtZCA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSpNQVhfQ01EX0xJTkVfTEVOR1RIKTsKKyAgICAgICAgICAgZ2VuY29tbWFuZChjdXJyLGVjbWQpOworICAgICAgICAgICB0ZW1wID0gKGN1cnItPmV4dHJhX2RhdGEgPyAoKHB0X3h0cmEpY3Vyci0+ZXh0cmFfZGF0YSktPmlwYXBwZW5kIDogMCk7CisgICAgICAgICAgIHJ1bnN5c2xpbnV4aW1hZ2UoZWNtZCx0ZW1wKTsKKyAgICAgICAgICAgLy8ga2VybmVsIG5vdCBmb3VuZCBzbyBleGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBkb3QgY29tbWFuZAorICAgICAgICAgICBkb3RydiA9IGV4ZWNkb3RjbWQob25lcnJjbWQsIi5xdWl0IixlY21kKTsgLy8gcGFzcyBiYWQgY21kbGluZSBhcyBhcmcKKyAgICAgICAgICAgaWYgKGRvdHJ2PT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICAgICAgICAgICBmcmVlKGVjbWQpOyBlY21kID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGNzcHJpbnQoIkVycm9yIGluIHByb2dyYW1taW5nISIsMHgwNyk7CisgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZpbmQgZWZmZWN0aXZlIGV4aXQgY29tbWFuZAorICAgICAgICBlY21kID0gKCBpc2FsbG93ZWQodXNlcm5hbWUsInJvb3QiKSA/IGV4aXRjbWRyb290IDogZXhpdGNtZCk7CisgICAgICAgIGRvdHJ2ID0gZXhlY2RvdGNtZChlY21kLCIucmVwZWF0IixOVUxMKTsKKyAgICAgICAgcXVpdCA9IChkb3RydiA9PSBRVUlUX0NNRCA/IDEgOiAwKTsgLy8gc2hvdWxkIHdlIGV4aXQgbm93CisgICAgIH0KKyAgfQorCisvLyBEZWFsbG9jYXRlIHNwYWNlIHVzZWQgYW5kIHF1aXQKKyAgY2xvc2VfcGFzc3dvcmRzKCk7CisgIGNsb3NlX2hlbHAoKTsKKyAgY2xvc2VfbWVudXN5c3RlbSgpOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvY21lbnUvdGVzdDIuYzMyIGIvZWZpMzIvY29tMzIvY21lbnUvdGVzdDIuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxM2JiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9jbWVudS90ZXN0Mi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguZTMyIGIvZWZpMzIvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguZTMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlkMzY5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9lbGZsaW5rL2xkbGludXgvbGRsaW51eC5lMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguZWxmIGIvZWZpMzIvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguZWxmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE3ZTczMzEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9lbGZsaW5rL2xkbGludXgvbGRsaW51eC5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvZ2Z4Ym9vdC9nZnhib290LmMzMiBiL2VmaTMyL2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGM4OWI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvZ2Z4Ym9vdC9nZnhib290LmVsZiBiL2VmaTMyL2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5lbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDJkMjE5OQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvZ3BsbGliL2xpYmdwbC5jMzIgYi9lZmkzMi9jb20zMi9ncGxsaWIvbGliZ3BsLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYTYxMjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvZ3BsbGliL2xpYmdwbC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvZ3BsbGliL2xpYmdwbC5lbGYgYi9lZmkzMi9jb20zMi9ncGxsaWIvbGliZ3BsLmVsZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNDhjZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvZ3BsbGliL2xpYmdwbC5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvaGR0L2hkdC5jMzIgYi9lZmkzMi9jb20zMi9oZHQvaGR0LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZTJjYmExCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvaGR0L2hkdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbGliL2xpYmNvbTMyLmMzMiBiL2VmaTMyL2NvbTMyL2xpYi9saWJjb20zMi5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWViZTAwMQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2xpYi9saWJjb20zMi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbGliL2xpYmNvbTMyLmVsZiBiL2VmaTMyL2NvbTMyL2xpYi9saWJjb20zMi5lbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmQxNTQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2xpYi9saWJjb20zMi5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbGlidXRpbC9saWJ1dGlsLmMzMiBiL2VmaTMyL2NvbTMyL2xpYnV0aWwvbGlidXRpbC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzY1ZWRlZQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2xpYnV0aWwvbGlidXRpbC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbGlidXRpbC9saWJ1dGlsX2xueC5hIGIvZWZpMzIvY29tMzIvbGlidXRpbC9saWJ1dGlsX2xueC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjFjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9saWJ1dGlsL2xpYnV0aWxfbG54LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy9jbWVudS5jMzIgYi9lZmkzMi9jb20zMi9sdWEvc3JjL2NtZW51LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDdiNjBlCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbHVhL3NyYy9jbWVudS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy9jcHUuYzMyIGIvZWZpMzIvY29tMzIvbHVhL3NyYy9jcHUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY2OTM2NjMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9sdWEvc3JjL2NwdS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy9kaGNwLmMzMiBiL2VmaTMyL2NvbTMyL2x1YS9zcmMvZGhjcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWRiOTY3MQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2x1YS9zcmMvZGhjcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy9kbWkuYzMyIGIvZWZpMzIvY29tMzIvbHVhL3NyYy9kbWkuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhOTJiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9sdWEvc3JjL2RtaS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy9sZnMuYzMyIGIvZWZpMzIvY29tMzIvbHVhL3NyYy9sZnMuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlMzViNDYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9sdWEvc3JjL2xmcy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy9saWJsdWEuYzMyIGIvZWZpMzIvY29tMzIvbHVhL3NyYy9saWJsdWEuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjZDVjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9sdWEvc3JjL2xpYmx1YS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy9sdWEuYzMyIGIvZWZpMzIvY29tMzIvbHVhL3NyYy9sdWEuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjZDQyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9sdWEvc3JjL2x1YS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy9wY2kuYzMyIGIvZWZpMzIvY29tMzIvbHVhL3NyYy9wY2kuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzMjI5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9sdWEvc3JjL3BjaS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy9zeXNsaW51eC5jMzIgYi9lZmkzMi9jb20zMi9sdWEvc3JjL3N5c2xpbnV4LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYzA3MDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbHVhL3NyYy9zeXNsaW51eC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbHVhL3NyYy92ZXNhLmMzMiBiL2VmaTMyL2NvbTMyL2x1YS9zcmMvdmVzYS5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWJlOWI4NgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL2x1YS9zcmMvdmVzYS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbWJvb3QvbWJvb3QuYzMyIGIvZWZpMzIvY29tMzIvbWJvb3QvbWJvb3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkYzA0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tYm9vdC9tYm9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbWVudS9tZW51LmMzMiBiL2VmaTMyL2NvbTMyL21lbnUvbWVudS5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjhjNTk1MgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21lbnUvbWVudS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbWVudS92ZXNhbWVudS5jMzIgYi9lZmkzMi9jb20zMi9tZW51L3Zlc2FtZW51LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zY2JhNWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbWVudS92ZXNhbWVudS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9jYXQuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9jYXQuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmYTJhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2NhdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9jbWQuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9jbWQuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyYjBlN2EKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2NtZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9jb25maWcuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9jb25maWcuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzMjVkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2NvbmZpZy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9jcHRpbWUuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9jcHRpbWUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExODMzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2NwdGltZS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9jcHVpZC5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2NwdWlkLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40N2JhNDRlCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9jcHVpZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9jcHVpZHRlc3QuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9jcHVpZHRlc3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmYmMzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2NwdWlkdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9kZWJ1Zy5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2RlYnVnLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZTk2ODBkCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9kZWJ1Zy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9kaXNrLmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvZGlzay5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2E2OWRhNQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvZGlzay5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9kbWl0ZXN0LmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvZG1pdGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmUxZDEzMAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvZG1pdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9lbGYuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9lbGYuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1NDMzODEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2VsZi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9ldGhlcnNlbC5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2V0aGVyc2VsLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NTE4YzZhCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9ldGhlcnNlbC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9ncHhlY21kLmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvZ3B4ZWNtZC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTBhNDg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvZ3B4ZWNtZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9oZXhkdW1wLmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvaGV4ZHVtcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDk4YWZiZAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvaGV4ZHVtcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9ob3N0LmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvaG9zdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzBlMmUzNgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvaG9zdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9pZmNwdS5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2lmY3B1LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYmI2MTViCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9pZmNwdS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9pZmNwdTY0LmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvaWZjcHU2NC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjdjNDY0YgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvaWZjcHU2NC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9pZm1lbWRzay5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2lmbWVtZHNrLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOWVjMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9pZm1lbWRzay5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9pZnBsb3AuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9pZnBsb3AuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVjNDEzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2lmcGxvcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9rYmRtYXAuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9rYmRtYXAuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkyMWNmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2tiZG1hcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9rb250cm9uX3dkdC5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2tvbnRyb25fd2R0LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYzJhOTkyCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9rb250cm9uX3dkdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9saW51eC5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2xpbnV4LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNjI5MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9saW51eC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9scy5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL2xzLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNmNhMzUwCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9scy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9tZW1pbmZvLmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvbWVtaW5mby5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjFmMTBiZAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvbWVtaW5mby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9wY2l0ZXN0LmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvcGNpdGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTM2YzgxYgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvcGNpdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9wbWxvYWQuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9wbWxvYWQuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjOGVkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3BtbG9hZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9wb3dlcm9mZi5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3Bvd2Vyb2ZmLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDU0MDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9wb3dlcm9mZi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9wcmRoY3AuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9wcmRoY3AuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlMjhmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3ByZGhjcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9wd2QuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9wd2QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliOTcxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3B3ZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9weGVjaG4uYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9weGVjaG4uYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjMzEzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3B4ZWNobi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9yZWJvb3QuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9yZWJvb3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmZjY5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3JlYm9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9zYW5ib290LmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvc2FuYm9vdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWJhYWIwNgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvc2FuYm9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy9zZGkuYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy9zZGkuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhMjdlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3NkaS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy92ZXNhaW5mby5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3Zlc2FpbmZvLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZDRiZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy92ZXNhaW5mby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy92cGR0ZXN0LmMzMiBiL2VmaTMyL2NvbTMyL21vZHVsZXMvdnBkdGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmUyNzc5NgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL21vZHVsZXMvdnBkdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy93aGljaHN5cy5jMzIgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3doaWNoc3lzLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZWQxZDBiCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvbW9kdWxlcy93aGljaHN5cy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvbW9kdWxlcy96empzb24uYzMyIGIvZWZpMzIvY29tMzIvbW9kdWxlcy96empzb24uYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyZTM3NmMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9tb2R1bGVzL3p6anNvbi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvcm9zaC9yb3NoLmMzMiBiL2VmaTMyL2NvbTMyL3Jvc2gvcm9zaC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ0YWE3NgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL3Jvc2gvcm9zaC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9hZHZkdW1wLmMzMiBiL2VmaTMyL2NvbTMyL3NhbXBsZXMvYWR2ZHVtcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTQyMWI0MgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL3NhbXBsZXMvYWR2ZHVtcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9lbnRyeWR1bXAuYzMyIGIvZWZpMzIvY29tMzIvc2FtcGxlcy9lbnRyeWR1bXAuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmNGJkZTYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9zYW1wbGVzL2VudHJ5ZHVtcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9mYW5jeWhlbGxvLmMzMiBiL2VmaTMyL2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzkwMjhjYwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9mYW5jeWhlbGxvLmxueCBiL2VmaTMyL2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5sbngKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjg0NGUzOQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5sbngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9oZWxsby5jMzIgYi9lZmkzMi9jb20zMi9zYW1wbGVzL2hlbGxvLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTA0ODRiCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvY29tMzIvc2FtcGxlcy9oZWxsby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9rZXl0ZXN0LmMzMiBiL2VmaTMyL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGQ4NDdkZQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9rZXl0ZXN0LmxueCBiL2VmaTMyL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5sbngKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGJlMjgwYgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL3NhbXBsZXMva2V5dGVzdC5sbngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9sb2NhbGJvb3QuYzMyIGIvZWZpMzIvY29tMzIvc2FtcGxlcy9sb2NhbGJvb3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlOGQ5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9zYW1wbGVzL2xvY2FsYm9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9yZXNvbHYuYzMyIGIvZWZpMzIvY29tMzIvc2FtcGxlcy9yZXNvbHYuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0NGRjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9jb20zMi9zYW1wbGVzL3Jlc29sdi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc2FtcGxlcy9zZXJpYWxpbmZvLmMzMiBiL2VmaTMyL2NvbTMyL3NhbXBsZXMvc2VyaWFsaW5mby5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDk4YmNhMAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL3NhbXBsZXMvc2VyaWFsaW5mby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc3lzZHVtcC9zeXNkdW1wLmMzMiBiL2VmaTMyL2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjFmYzVjOQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvY29tMzIvc3lzZHVtcC9zeXNkdW1wLmVsZiBiL2VmaTMyL2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5lbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTNjNWYxYQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvZWZpL3N5c2xpbnV4LmVmaSBiL2VmaTMyL2VmaS9zeXNsaW51eC5lZmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiZjk0MgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2VmaS9zeXNsaW51eC5lZmkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvYXJnaWZ5LmggYi9lZmkzMi9pbmNsdWRlL2VmaS9hcmdpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2YzZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvYXJnaWZ5LmgKQEAgLTAsMCArMSw0MSBAQAorCisKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgSGV3bGV0dC1QYWNrYXJkIENvLgorICogICAgICBDb250cmlidXRlZCBieSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiAgICAgIENvbnRyaWJ1dGVkIGJ5IEJyZW50IENhc2F2YW50IDxiY2FzYXZhbkBzZ2kuY29tPgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICogICAgICBDb250cmlidXRlZCBieSBGZW5naHVhIFl1IDxmZW5naHVhLnl1QGludGVsLmNvbT4KKyAqICAgICAgQ29udHJpYnV0ZWQgYnkgQmlibyBNYW8gPGJpYm8ubWFvQGludGVsLmNvbT4KKyAqICAgICAgQ29udHJpYnV0ZWQgYnkgQ2hhbmRyYW1vdWxpIE5hcmF5YW5hbiA8bW91bGlAbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBFTElMTywgdGhlIEVGSSBMaW51eCBib290IGxvYWRlci4KKyAqCisgKiAgRUxJTE8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBFTElMTyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCBFTElMTzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBjaGVjayBvdXQgdGhlIGVsaWxvLnR4dCBmb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBvbiBob3cKKyAqIHRvIHVzZSB0aGlzIHByb2dyYW0uCisgKi8KKworCisjZGVmaW5lIE1BWF9BUkdTIDI1NgorCitJTlROCithcmdpZnkoQ0hBUjE2ICpidWYsIFVJTlROIGxlbiwgQ0hBUjE2ICoqYXJndik7CisKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2VmaS5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkMjc0MAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaS5oCisKK0Fic3RyYWN0OgorCisgICAgUHVibGljIEVGSSBoZWFkZXIgZmlsZXMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisvLworLy8gQnVpbGQgZmxhZ3Mgb24gaW5wdXQKKy8vICBFRkkzMgorLy8gIEVGSV9ERUJVRyAgICAgICAgICAgICAgIC0gRW5hYmxlIGRlYnVnZ2luZyBjb2RlCisvLyAgRUZJX05UX0VNVUxBVE9SICAgICAgICAgLSBCdWlsZGluZyBmb3IgcnVubmluZyB1bmRlciBOVAorLy8KKworCisjaWZuZGVmIF9FRklfSU5DTFVERV8KKyNkZWZpbmUgX0VGSV9JTkNMVURFXworCisjZGVmaW5lIEVGSV9GSVJNV0FSRV9WRU5ET1IgICAgICAgICBMIklOVEVMIgorI2RlZmluZSBFRklfRklSTVdBUkVfTUFKT1JfUkVWSVNJT04gMTIKKyNkZWZpbmUgRUZJX0ZJUk1XQVJFX01JTk9SX1JFVklTSU9OIDMzCisjZGVmaW5lIEVGSV9GSVJNV0FSRV9SRVZJU0lPTiAoKEVGSV9GSVJNV0FSRV9NQUpPUl9SRVZJU0lPTiA8PDE2KSB8IChFRklfRklSTVdBUkVfTUlOT1JfUkVWSVNJT04pKQorCisjaW5jbHVkZSAiZWZpYmluZC5oIgorI2luY2x1ZGUgImVmaWRlZi5oIgorI2luY2x1ZGUgImVmaWRldnAuaCIKKyNpbmNsdWRlICJlZmlwY2lpby5oIgorI2luY2x1ZGUgImVmaXByb3QuaCIKKyNpbmNsdWRlICJlZmljb24uaCIKKyNpbmNsdWRlICJlZmlzZXIuaCIKKyNpbmNsdWRlICJlZmlfbmlpLmgiCisjaW5jbHVkZSAiZWZpcHhlYmMuaCIKKyNpbmNsdWRlICJlZmluZXQuaCIKKyNpbmNsdWRlICJlZmlhcGkuaCIKKyNpbmNsdWRlICJlZmlmcy5oIgorI2luY2x1ZGUgImVmaWVyci5oIgorI2luY2x1ZGUgImVmaXVpLmgiCisjaW5jbHVkZSAiZWZpaXAuaCIKKyNpbmNsdWRlICJlZml1ZHAuaCIKKyNpbmNsdWRlICJlZml0Y3AuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9lZmlfbmlpLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlfbmlpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3YTViMgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaV9uaWkuaApAQCAtMCwwICsxLDc0IEBACisjaWZuZGVmIF9FRklfTklJX0gKKyNkZWZpbmUgX0VGSV9OSUlfSAorCisvKisrCitDb3B5cmlnaHQgKGMpIDIwMDAgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBuYW1lOgorICAgIGVmaV9uaWkuaAorCitBYnN0cmFjdDoKKworUmV2aXNpb24gaGlzdG9yeToKKyAgICAyMDAwLUZlYi0xOCBNKGYpSiAgIEdVSUQgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBTdHJ1Y3R1cmUgb3JkZXIgY2hhbmdlZCBmb3IgbWFjaGluZSB3b3JkIGFsaWdubWVudC4KKyAgICAgICAgICAgICAgICBBZGRlZCBTdHJpbmdJZFs0XSB0byBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgCisgICAgMjAwMC1GZWItMTQgTShmKUogICBHZW5lc2lzLgorLS0qLworCisjZGVmaW5lIEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX1BST1RPQ09MIFwKKyAgICB7IDB4RTE4NTQxQ0QsIDB4Rjc1NSwgMHg0ZjczLCB7MHg5MiwgMHg4RCwgMHg2NCwgMHgzQywgMHg4QSwgMHg3OSwgMHhCMiwgMHgyOX0gfQorCisjZGVmaW5lIEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX0lOVEVSRkFDRV9SRVZJU0lPTiAweDAwMDEwMDAwCisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpTmV0d29ya0ludGVyZmFjZVVuZGkgPSAxCit9IEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9UWVBFOworCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBVSU5UNjQgUmV2aXNpb247CisgICAgLy8gUmV2aXNpb24gb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlkZW50aWZpZXIgcHJvdG9jb2wgaW50ZXJmYWNlLgorCisgICAgVUlOVDY0IElEOworICAgIC8vIEFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGlkZW50aWZ5aW5nIHN0cnVjdHVyZSBmb3IgdGhpcworICAgIC8vIG5ldHdvcmsgaW50ZXJmYWNlLiAgVGhpcyBpcyBzZXQgdG8gemVybyBpZiB0aGVyZSBpcyBubyBzdHJ1Y3R1cmUuCisgICAgLy8KKyAgICAvLyBGb3IgUFhFL1VOREkgdGhpcyBpcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgIVBYRSBzdHJ1Y3R1cmUuCisKKyAgICBVSU5UNjQgSW1hZ2VBZGRyOworICAgIC8vIEFkZHJlc3Mgb2YgdGhlIFVOcmVsb2NhdGVkIGRyaXZlci9ST00gaW1hZ2UuICBUaGlzIGlzIHNldAorICAgIC8vIHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gZHJpdmVyL1JPTSBpbWFnZS4KKyAgICAvLworICAgIC8vIEZvciAxNi1iaXQgVU5ESSwgdGhpcyBpcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgb3B0aW9uIFJPTSBpbgorICAgIC8vIHVwcGVyIG1lbW9yeS4KKyAgICAvLworICAgIC8vIEZvciAzMi82NC1iaXQgUy9XIFVOREksIHRoaXMgaXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIEVGSSBST00KKyAgICAvLyBpbWFnZS4KKyAgICAvLworICAgIC8vIEZvciBIL1cgVU5ESSwgdGhpcyBpcyBzZXQgdG8gemVyby4KKworICAgIFVJTlQzMiBJbWFnZVNpemU7CisgICAgLy8gU2l6ZSBvZiB0aGUgVU5yZWxvY2F0ZWQgZHJpdmVyL1JPTSBpbWFnZSBvZiB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgIC8vIFRoaXMgaXMgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gZHJpdmVyL1JPTSBpbWFnZS4KKworICAgIENIQVI4IFN0cmluZ0lkWzRdOworICAgIC8vIDQgY2hhciBBU0NJSSBzdHJpbmcgdG8gZ28gaW4gY2xhc3MgaWRlbnRpZmllciAob3B0aW9uIDYwKSBpbiBESENQCisgICAgLy8gYW5kIEJvb3QgU2VydmVyIGRpc2NvdmVyIHBhY2tldHMuCisgICAgLy8gRm9yIEVmaU5ldHdvcmtJbnRlcmZhY2VVbmRpIHRoaXMgZmllbGQgaXMgIlVOREkiLgorICAgIC8vIEZvciBFZmlOZXR3b3JrSW50ZXJmYWNlU25wIHRoaXMgZmllbGQgaXMgIlNOUE4iLgorCisgICAgVUlOVDggVHlwZTsKKyAgICBVSU5UOCBNYWpvclZlcjsKKyAgICBVSU5UOCBNaW5vclZlcjsKKyAgICAvLyBJbmZvcm1hdGlvbiB0byBiZSBwbGFjZWQgaW50byB0aGUgUFhFIERIQ1AgYW5kIERpc2NvdmVyIHBhY2tldHMuCisgICAgLy8gVGhpcyBpcyB0aGUgbmV0d29yayBpbnRlcmZhY2UgdHlwZSBhbmQgdmVyc2lvbiBudW1iZXIgdGhhdCB3aWxsCisgICAgLy8gYmUgcGxhY2VkIGludG8gREhDUCBvcHRpb24gOTQgKGNsaWVudCBuZXR3b3JrIGludGVyZmFjZSBpZGVudGlmaWVyKS4KKyAgICBCT09MRUFOIElwdjZTdXBwb3J0ZWQ7CisJVUlOVDggICBJZk51bTsJLy8gaW50ZXJmYWNlIG51bWJlciB0byBiZSB1c2VkIHdpdGggcHhlaWQgc3RydWN0dXJlCit9IEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX0lOVEVSRkFDRTsKKworZXh0ZXJuIEVGSV9HVUlEIE5ldHdvcmtJbnRlcmZhY2VJZGVudGlmaWVyUHJvdG9jb2w7CisKKyNlbmRpZiAvLyBfRUZJX05JSV9ICmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9lZmlfcHhlLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlfcHhlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0MjUxZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaV9weGUuaApAQCAtMCwwICsxLDE3NDMgQEAKKyNpZm5kZWYgX0VGSV9QWEVfSAorI2RlZmluZSBfRUZJX1BYRV9ICisKKworLyorKworQ29weXJpZ2h0IChjKSBJbnRlbCAgMTk5OQorCitNb2R1bGUgbmFtZToKKyAgICBlZmlfcHhlLmgKKworMzIvNjQtYml0IFBYRSBzcGVjaWZpY2F0aW9uOgorICAgIGFscGhhLTQsIDk5LURlYy0xNworCitBYnN0cmFjdDoKKyAgICBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgUFhFIHR5cGUgZGVmaW5pdGlvbnMsCisgICAgc3RydWN0dXJlIHByb3RvdHlwZXMsIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGNvbnN0YW50cyB0aGF0CisgICAgYXJlIG5lZWRlZCBmb3IgcG9ydGluZyBQWEUgdG8gRUZJLgorLS0qLworCisjcHJhZ21hIHBhY2soMSkKKworI2RlZmluZSBQWEVfSU5URUxfT1JERVIgICAgICAgICAxICAgLy8gSW50ZWwgb3JkZXIKKy8vI2RlZmluZSBQWEVfTkVUV09SS19PUkRFUiAgICAgICAgIDEgICAvLyBuZXR3b3JrIG9yZGVyCisKKyNkZWZpbmUgUFhFX1VJTlQ2NF9TVVBQT1JUICAgICAgICAgIDEgICAvLyBVSU5UNjQgc3VwcG9ydGVkCisvLyNkZWZpbmUgUFhFX05PX1VJTlQ2NF9TVVBQT1JUICAgICAxICAgLy8gVUlOVDY0IG5vdCBzdXBwb3J0ZWQKKworI2RlZmluZSBQWEVfQlVTVFlQRShhLGIsYyxkKSAgICAgICAgICAgIFwKKygoKChQWEVfVUlOVDMyKShkKSAmIDB4RkYpIDw8IDI0KSB8IFwKKygoKFBYRV9VSU5UMzIpKGMpICYgMHhGRikgPDwgMTYpIHwgIFwKKygoKFBYRV9VSU5UMzIpKGIpICYgMHhGRikgPDwgOCkgfCAgICAgICBcCisoKFBYRV9VSU5UMzIpKGEpICYgMHhGRikpCisKKy8vCisvLyBVTkRJIFJPTSBJRCBhbmQgZGV2aXZlIElEIHNpZ25hdHVyZQorLy8KKyNkZWZpbmUgUFhFX0JVU1RZUEVfUFhFICAgICAgICAgUFhFX0JVU1RZUEUoJyEnLCAnUCcsICdYJywgJ0UnKQorCisvLworLy8gQlVTIFJPTSBJRCBzaWduYXR1cmVzCisvLworI2RlZmluZSBQWEVfQlVTVFlQRV9QQ0kgICAgICAgICBQWEVfQlVTVFlQRSgnUCcsICdDJywgJ0knLCAnUicpCisjZGVmaW5lIFBYRV9CVVNUWVBFX1BDX0NBUkQgICAgIFBYRV9CVVNUWVBFKCdQJywgJ0MnLCAnQycsICdSJykKKyNkZWZpbmUgUFhFX0JVU1RZUEVfVVNCICAgICAgICAgUFhFX0JVU1RZUEUoJ1UnLCAnUycsICdCJywgJ1InKQorI2RlZmluZSBQWEVfQlVTVFlQRV8xMzk0ICAgICAgICBQWEVfQlVTVFlQRSgnMScsICczJywgJzknLCAnNCcpCisKKyNkZWZpbmUgUFhFX1NXQVBfVUlOVDE2KG4pICAgICAgICAgIFwKKygoKChQWEVfVUlOVDE2KShuKSAmIDB4MDBGRikgPDwgOCkgfCAgICBcCisoKChQWEVfVUlOVDE2KShuKSAmIDB4RkYwMCkgPj4gOCkpCisKKyNkZWZpbmUgUFhFX1NXQVBfVUlOVDMyKG4pICAgICAgICAgICAgICBcCisoKCgoUFhFX1VJTlQzMikobikgJiAweDAwMDAwMEZGKSA8PCAyNCkgfCAgIFwKKygoKFBYRV9VSU5UMzIpKG4pICYgMHgwMDAwRkYwMCkgPDwgOCkgfCAgICAgXAorKCgoUFhFX1VJTlQzMikobikgJiAweDAwRkYwMDAwKSA+PiA4KSB8ICAgICBcCisoKChQWEVfVUlOVDMyKShuKSAmIDB4RkYwMDAwMDApID4+IDI0KSkKKworI2lmIFBYRV9VSU5UNjRfU1VQUE9SVCAhPSAwCisjZGVmaW5lIFBYRV9TV0FQX1VJTlQ2NChuKSAgICAgICAgICAgICAgICAgIFwKKygoKChQWEVfVUlOVDY0KShuKSAmIDB4MDAwMDAwMDAwMDAwMDBGRikgPDwgNTYpIHwgICBcCisoKChQWEVfVUlOVDY0KShuKSAmIDB4MDAwMDAwMDAwMDAwRkYwMCkgPDwgNDApIHwgICAgXAorKCgoUFhFX1VJTlQ2NCkobikgJiAweDAwMDAwMDAwMDBGRjAwMDApIDw8IDI0KSB8ICAgIFwKKygoKFBYRV9VSU5UNjQpKG4pICYgMHgwMDAwMDAwMEZGMDAwMDAwKSA8PCA4KSB8IFwKKygoKFBYRV9VSU5UNjQpKG4pICYgMHgwMDAwMDBGRjAwMDAwMDAwKSA+PiA4KSB8IFwKKygoKFBYRV9VSU5UNjQpKG4pICYgMHgwMDAwRkYwMDAwMDAwMDAwKSA+PiAyNCkgfCAgICBcCisoKChQWEVfVUlOVDY0KShuKSAmIDB4MDBGRjAwMDAwMDAwMDAwMCkgPj4gNDApIHwgICAgXAorKCgoUFhFX1VJTlQ2NCkobikgJiAweEZGMDAwMDAwMDAwMDAwMDApID4+IDU2KSkKKyNlbmRpZiAvLyBQWEVfVUlOVDY0X1NVUFBPUlQKKworI2lmIFBYRV9OT19VSU5UNjRfU1VQUE9SVCAhPSAwCisjZGVmaW5lIFBYRV9TV0FQX1VJTlQ2NChuKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorUFhFX1VJTlQzMiB0bXAgPSAoUFhFX1VJTlQ2NCkobilbMV07ICAgICAgICAgICAgICAgIFwKKyhQWEVfVUlOVDY0KShuKVsxXSA9IFBYRV9TV0FQX1VJTlQzMigoUFhFX1VJTlQ2NCkobilbMF0pOyAgIFwKKyhQWEVfVUlOVDY0KShuKVswXSA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvLyBQWEVfTk9fVUlOVDY0X1NVUFBPUlQKKworI2RlZmluZSBQWEVfQ1BCU0laRV9OT1RfVVNFRCAgICAgICAgICAgIDAgICAvLyB6ZXJvCisjZGVmaW5lIFBYRV9EQlNJWkVfTk9UX1VTRUQgICAgICAgICAwICAgLy8gemVybworI2RlZmluZSBQWEVfQ1BCQUREUl9OT1RfVVNFRCAgICAgICAgKFBYRV9VSU5UNjQpMCAgICAgICAvLyB6ZXJvCisjZGVmaW5lIFBYRV9EQkFERFJfTk9UX1VTRUQgICAgIChQWEVfVUlOVDY0KTAgICAgICAgLy8gemVybworCisjZGVmaW5lIFBYRV9DT05TVCBjb25zdAorCisjZGVmaW5lIFBYRV9WT0xBVElMRSB2b2xhdGlsZQorCit0eXBlZGVmIHZvaWQgUFhFX1ZPSUQ7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBQWEVfVUlOVDg7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUFhFX1VJTlQxNjsKKwordHlwZWRlZiB1bnNpZ25lZCBQWEVfVUlOVDMyOworCisjaWYgUFhFX1VJTlQ2NF9TVVBQT1JUICE9IDAKKy8vIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBQWEVfVUlOVDY0OwordHlwZWRlZiBVSU5UNjQgUFhFX1VJTlQ2NDsKKyNlbmRpZiAvLyBQWEVfVUlOVDY0X1NVUFBPUlQKKworI2lmIFBYRV9OT19VSU5UNjRfU1VQUE9SVCAhPSAwCit0eXBlZGVmIFBYRV9VSU5UMzIgUFhFX1VJTlQ2NFsyXTsKKyNlbmRpZiAvLyBQWEVfTk9fVUlOVDY0X1NVUFBPUlQKKwordHlwZWRlZiB1bnNpZ25lZCBQWEVfVUlOVE47CisKK3R5cGVkZWYgUFhFX1VJTlQ4IFBYRV9CT09MOworCisjZGVmaW5lIFBYRV9GQUxTRSAgICAgICAgICAgICAgIDAgICAvLyB6ZXJvCisjZGVmaW5lIFBYRV9UUlVFICAgICAgICAgICAgICAgICAgICAoIVBYRV9GQUxTRSkKKwordHlwZWRlZiBQWEVfVUlOVDE2IFBYRV9PUENPREU7CisKKy8vCisvLyBSZXR1cm4gVU5ESSBvcGVyYXRpb25hbCBzdGF0ZS4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfR0VUX1NUQVRFICAgICAgICAgICAgICAgICAgICAweDAwMDAKKworLy8KKy8vIENoYW5nZSBVTkRJIG9wZXJhdGlvbmFsIHN0YXRlIGZyb20gU3RvcHBlZCB0byBTdGFydGVkLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9TVEFSVCAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8vCisvLyBDaGFuZ2UgVU5ESSBvcGVyYXRpb25hbCBzdGF0ZSBmcm9tIFN0YXJ0ZWQgdG8gU3RvcHBlZC4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfU1RPUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorCisvLworLy8gR2V0IFVOREkgaW5pdGlhbGl6YXRpb24gaW5mb3JtYXRpb24uCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0dFVF9JTklUX0lORk8gICAgICAgICAgICAgICAgMHgwMDAzCisKKy8vCisvLyBHZXQgTklDIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0dFVF9DT05GSUdfSU5GTyAgICAgICAgICAgICAgMHgwMDA0CisKKy8vCisvLyBDaGFuZ2VkIFVOREkgb3BlcmF0aW9uYWwgc3RhdGUgZnJvbSBTdGFydGVkIHRvIEluaXRpYWxpemVkLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9JTklUSUFMSVpFICAgICAgICAgICAgICAgICAgIDB4MDAwNQorCisvLworLy8gUmUtaW5pdGlhbGl6ZSB0aGUgTklDIEgvVy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfUkVTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwNgorCisvLworLy8gQ2hhbmdlIHRoZSBVTkRJIG9wZXJhdGlvbmFsIHN0YXRlIGZyb20gSW5pdGlhbGl6ZWQgdG8gU3RhcnRlZC4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfU0hVVERPV04gICAgICAgICAgICAgICAgIDB4MDAwNworCisvLworLy8gUmVhZCAmIGNoYW5nZSBzdGF0ZSBvZiBleHRlcm5hbCBpbnRlcnJ1cHQgZW5hYmxlcy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfSU5URVJSVVBUX0VOQUJMRVMgICAgICAgICAgICAgICAgMHgwMDA4CisKKy8vCisvLyBSZWFkICYgY2hhbmdlIHN0YXRlIG9mIHBhY2tldCByZWNlaXZlIGZpbHRlcnMuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1JFQ0VJVkVfRklMVEVSUyAgICAgICAgICAgICAgMHgwMDA5CisKKy8vCisvLyBSZWFkICYgY2hhbmdlIHN0YXRpb24gTUFDIGFkZHJlc3MuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1NUQVRJT05fQUREUkVTUyAgICAgICAgICAgICAgMHgwMDBBCisKKy8vCisvLyBSZWFkIHRyYWZmaWMgc3RhdGlzdGljcy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfU1RBVElTVElDUyAgICAgICAgICAgICAgICAgICAweDAwMEIKKworLy8KKy8vIENvbnZlcnQgbXVsdGljYXN0IElQIGFkZHJlc3MgdG8gbXVsdGljYXN0IE1BQyBhZGRyZXNzLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9NQ0FTVF9JUF9UT19NQUMgICAgICAgICAgICAgIDB4MDAwQworCisvLworLy8gUmVhZCBvciBjaGFuZ2Ugbm9uLXZvbGF0aWxlIHN0b3JhZ2Ugb24gdGhlIE5JQy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfTlZEQVRBICAgICAgICAgICAgICAgICAgIDB4MDAwRAorCisvLworLy8gR2V0ICYgY2xlYXIgaW50ZXJydXB0IHN0YXR1cy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfR0VUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweDAwMEUKKworLy8KKy8vIEZpbGwgbWVkaWEgaGVhZGVyIGluIHBhY2tldCBmb3IgdHJhbnNtaXQuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0ZJTExfSEVBREVSICAgICAgICAgICAgICAweDAwMEYKKworLy8KKy8vIFRyYW5zbWl0IHBhY2tldChzKS4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfVFJBTlNNSVQgICAgICAgICAgICAgICAgIDB4MDAxMAorCisvLworLy8gUmVjZWl2ZSBwYWNrZXQuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1JFQ0VJVkUgICAgICAgICAgICAgICAgICAweDAwMTEKKworLy8gbGFzdCB2YWxpZCBvcGNvZGU6CisjZGVmaW5lIFBYRV9PUENPREVfVkFMSURfTUFYICAgICAgICAgICAgICAgICAgICAweDAwMTEKKworLy8KKy8vIExhc3QgdmFsaWQgUFhFIFVOREkgT3BDb2RlIG51bWJlci4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfTEFTVF9WQUxJRCAgICAgICAgICAgICAgICAgICAweDAwMTEKKwordHlwZWRlZiBQWEVfVUlOVDE2IFBYRV9PUEZMQUdTOworCisjZGVmaW5lIFBYRV9PUEZMQUdTX05PVF9VU0VEICAgICAgICAgICAgICAgICAgICAweDAwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBHZXQgU3RhdGUKKy8vCisKKy8vIE5vIE9wRmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBTdGFydAorLy8KKworLy8gTm8gT3BGbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFN0b3AKKy8vCisKKy8vIE5vIE9wRmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBHZXQgSW5pdCBJbmZvCisvLworCisvLyBObyBPcGZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IENvbmZpZyBJbmZvCisvLworCisvLyBObyBPcGZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgSW5pdGlhbGl6ZQorLy8KKworI2RlZmluZSBQWEVfT1BGTEFHU19JTklUSUFMSVpFX0NBQkxFX0RFVEVDVF9NQVNLICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19JTklUSUFMSVpFX0RFVEVDVF9DQUJMRSAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19JTklUSUFMSVpFX0RPX05PVF9ERVRFQ1RfQ0FCTEUgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFJlc2V0CisvLworCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFU0VUX0RJU0FCTEVfSU5URVJSVVBUUyAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFU0VUX0RJU0FCTEVfRklMVEVSUyAgICAgICAgICAgMHgwMDAyCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU2h1dGRvd24KKy8vCisKKy8vIE5vIE9wRmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBJbnRlcnJ1cHQgRW5hYmxlcworLy8KKworLy8KKy8vIFNlbGVjdCB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIGV4dGVybmFsIGludGVycnVwdCBzaWduYWxzLgorLy8gU2V0dGluZyBib3RoIGVuYWJsZSBhbmQgZGlzYWJsZSB3aWxsIHJldHVybiBQWEVfU1RBVENPREVfSU5WQUxJRF9PUEZMQUdTLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX09QTUFTSyAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX0VOQUJMRSAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX0RJU0FCTEUgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfUkVBRCAgICAgICAgICAgICAgMHgwMDAwCisKKy8vCisvLyBFbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzLiAgQW4gZXh0ZXJuYWwgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkCisvLyBhZnRlciBhIGNvbXBsZXRlIG5vbi1lcnJvciBwYWNrZXQgaGFzIGJlZW4gcmVjZWl2ZWQuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfUkVDRUlWRSAgICAgICAgICAgMHgwMDAxCisKKy8vCisvLyBFbmFibGUgdHJhbnNtaXQgaW50ZXJydXB0cy4gIEFuIGV4dGVybmFsIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZAorLy8gYWZ0ZXIgYSBjb21wbGV0ZSBub24tZXJyb3IgcGFja2V0IGhhcyBiZWVuIHRyYW5zbWl0dGVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX1RSQU5TTUlUICAgICAgICAgIDB4MDAwMgorCisvLworLy8gRW5hYmxlIGNvbW1hbmQgaW50ZXJydXB0cy4gIEFuIGV4dGVybmFsIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZAorLy8gd2hlbiBjb21tYW5kIGV4ZWN1dGlvbiBzdG9wcy4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX0lOVEVSUlVQVF9DT01NQU5EICAgICAgICAgICAweDAwMDQKKworLy8KKy8vIEdlbmVyYXRlIHNvZnR3YXJlIGludGVycnVwdC4gIFNldHRpbmcgdGhpcyBiaXQgZ2VuZXJhdGVzIGFuIGV4dGVybmFsCisvLyBpbnRlcnJ1cHQsIGlmIGl0IGlzIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfU09GVFdBUkUgICAgICAgICAgMHgwMDA4CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgUmVjZWl2ZSBGaWx0ZXJzCisvLworCisvLworLy8gU2VsZWN0IHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgcmVjZWl2ZSBmaWx0ZXJzLgorLy8gU2V0dGluZyBib3RoIGVuYWJsZSBhbmQgZGlzYWJsZSB3aWxsIHJldHVybiBQWEVfU1RBVENPREVfSU5WQUxJRF9PUENPREUuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9PUE1BU0sgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9FTkFCTEUgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9ESVNBQkxFICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9SRUFEICAgICAgICAgMHgwMDAwCisKKy8vCisvLyBUbyByZXNldCB0aGUgY29udGVudHMgb2YgdGhlIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmaWx0ZXIgbGlzdCwKKy8vIHNldCB0aGlzIE9wRmxhZzoKKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX1JFU0VUX01DQVNUX0xJU1QgMHgyMDAwCisKKy8vCisvLyBFbmFibGUgdW5pY2FzdCBwYWNrZXQgcmVjZWl2aW5nLiAgUGFja2V0cyBzZW50IHRvIHRoZSBjdXJyZW50IHN0YXRpb24KKy8vIE1BQyBhZGRyZXNzIHdpbGwgYmUgcmVjZWl2ZWQuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9VTklDQVNUICAgICAgICAgIDB4MDAwMQorCisvLworLy8gRW5hYmxlIGJyb2FkY2FzdCBwYWNrZXQgcmVjZWl2aW5nLiAgUGFja2V0cyBzZW50IHRvIHRoZSBicm9hZGNhc3QgCisvLyBNQUMgYWRkcmVzcyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfQlJPQURDQVNUICAgICAgICAweDAwMDIKKworLy8KKy8vIEVuYWJsZSBmaWx0ZXJlZCBtdWx0aWNhc3QgcGFja2V0IHJlY2VpdmluZy4gIFBhY2tldHMgc2VudCB0byBhbnkKKy8vIG9mIHRoZSBtdWx0aWNhc3QgTUFDIGFkZHJlc3NlcyBpbiB0aGUgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZpbHRlcgorLy8gbGlzdCB3aWxsIGJlIHJlY2VpdmVkLiAgSWYgdGhlIGZpbHRlciBsaXN0IGlzIGVtcHR5LCBubyBtdWx0aWNhc3QKKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX0ZJTFRFUkVEX01VTFRJQ0FTVCAgIDB4MDAwNAorCisvLworLy8gRW5hYmxlIHByb21pc2N1b3VzIHBhY2tldCByZWNlaXZpbmcuICBBbGwgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfUFJPTUlTQ1VPVVMgICAgICAweDAwMDgKKworLy8KKy8vIEVuYWJsZSBwcm9taXNjdW91cyBtdWx0aWNhc3QgcGFja2V0IHJlY2VpdmluZy4gIEFsbCBtdWx0aWNhc3QKKy8vIHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX0FMTF9NVUxUSUNBU1QgICAgICAgIDB4MDAxMAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFN0YXRpb24gQWRkcmVzcworLy8KKworI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSU9OX0FERFJFU1NfUkVBRCAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSU9OX0FERFJFU1NfUkVTRVQgICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFN0YXRpc3RpY3MKKy8vCisKKyNkZWZpbmUgUFhFX09QRkxBR1NfU1RBVElTVElDU19SRUFEICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSVNUSUNTX1JFU0VUICAgICAgICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIE1DYXN0IElQIHRvIE1BQworLy8KKworLy8KKy8vIElkZW50aWZ5IHRoZSB0eXBlIG9mIElQIGFkZHJlc3MgaW4gdGhlIENQQi4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX01DQVNUX0lQX1RPX01BQ19PUE1BU0sgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFBYRV9PUEZMQUdTX01DQVNUX0lQVjRfVE9fTUFDICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfTUNBU1RfSVBWNl9UT19NQUMgICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIE52RGF0YQorLy8KKworLy8KKy8vIFNlbGVjdCB0aGUgdHlwZSBvZiBub24tdm9sYXRpbGUgZGF0YSBvcGVyYXRpb24uCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19OVkRBVEFfT1BNQVNLICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX05WREFUQV9SRUFEICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19OVkRBVEFfV1JJVEUgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IFN0YXR1cworLy8KKworLy8KKy8vIFJldHVybiBjdXJyZW50IGludGVycnVwdCBzdGF0dXMuICBUaGlzIHdpbGwgYWxzbyBjbGVhciBhbnkgaW50ZXJydXB0cworLy8gdGhhdCBhcmUgY3VycmVudGx5IHNldC4gIFRoaXMgY2FuIGJlIHVzZWQgaW4gYSBwb2xsaW5nIHJvdXRpbmUuICBUaGUKKy8vIGludGVycnVwdCBmbGFncyBhcmUgc3RpbGwgc2V0IGFuZCBjbGVhcmVkIGV2ZW4gd2hlbiB0aGUgaW50ZXJydXB0cworLy8gYXJlIGRpc2FibGVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfR0VUX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAweDAwMDEKKworLy8KKy8vIFJldHVybiBsaXN0IG9mIHRyYW5zbWl0dGVkIGJ1ZmZlcnMgZm9yIHJlY3ljbGluZy4gIFRyYW5zbWl0IGJ1ZmZlcnMKKy8vIG11c3Qgbm90IGJlIGNoYW5nZWQgb3IgdW5hbGxvY2F0ZWQgdW50aWwgdGhleSBoYXZlIHJlY3ljbGVkLiAgQWZ0ZXIKKy8vIGlzc3VpbmcgYSB0cmFuc21pdCBjb21tYW5kLCB3YWl0IGZvciBhIHRyYW5zbWl0IGNvbXBsZXRlIGludGVycnVwdC4KKy8vIFdoZW4gYSB0cmFuc21pdCBjb21wbGV0ZSBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQsIHJlYWQgdGhlIHRyYW5zbWl0dGVkCisvLyBidWZmZXJzLiAgRG8gbm90IHBsYW4gb24gZ2V0dGluZyBvbmUgYnVmZmVyIHBlciBpbnRlcnJ1cHQuICBTb21lCisvLyBOSUNzIGFuZCBVTkRJcyBtYXkgdHJhbnNtaXQgbXVsdGlwbGUgYnVmZmVycyBwZXIgaW50ZXJydXB0LgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfR0VUX1RSQU5TTUlUVEVEX0JVRkZFUlMgICAgICAgICAweDAwMDIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBGaWxsIEhlYWRlcgorLy8KKworI2RlZmluZSBQWEVfT1BGTEFHU19GSUxMX0hFQURFUl9PUE1BU0sgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX0ZJTExfSEVBREVSX0ZSQUdNRU5URUQgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX0ZJTExfSEVBREVSX1dIT0xFICAgICAgICAgICAweDAwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBUcmFuc21pdAorLy8KKworLy8KKy8vIFMvVyBVTkRJIG9ubHkuICBSZXR1cm4gYWZ0ZXIgdGhlIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZC4gIEEKKy8vIHRyYW5zbWl0IGNvbXBsZXRlIGludGVycnVwdCB3aWxsIHN0aWxsIGJlIGdlbmVyYXRlZCBhbmQgdGhlIHRyYW5zbWl0CisvLyBidWZmZXIgd2lsbCBoYXZlIHRvIGJlIHJlY3ljbGVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfU1dVTkRJX1RSQU5TTUlUX09QTUFTSyAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX09QRkxBR1NfVFJBTlNNSVRfQkxPQ0sgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19UUkFOU01JVF9ET05UX0JMT0NLICAgICAgICAgMHgwMDAwCisKKy8vCisvLworLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfVFJBTlNNSVRfT1BNQVNLICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQWEVfT1BGTEFHU19UUkFOU01JVF9GUkFHTUVOVEVEICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBYRV9PUEZMQUdTX1RSQU5TTUlUX1dIT0xFICAgICAgICAgICAgICAweDAwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBSZWNlaXZlCisvLworCisvLyBObyBPcEZsYWdzCisKK3R5cGVkZWYgUFhFX1VJTlQxNiBQWEVfU1RBVEZMQUdTOworCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5JVElBTElaRSAgICAgICAgICAgICAgICAweDAwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tbW9uIFN0YXRGbGFncyB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSBhbGwgY29tbWFuZHMuCisvLworCisvLworLy8gVGhlIENPTU1BTkRfQ09NUExFVEUgYW5kIENPTU1BTkRfRkFJTEVEIHN0YXR1cyBmbGFncyBtdXN0IGJlCisvLyBpbXBsZW1lbnRlZCBieSBhbGwgVU5ESXMuICBDT01NQU5EX1FVRVVFRCBpcyBvbmx5IG5lZWRlZCBieSBVTkRJcworLy8gdGhhdCBzdXBwb3J0IGNvbW1hbmQgcXVldWluZy4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfU1RBVFVTX01BU0sgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19DT01NQU5EX0NPTVBMRVRFICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NPTU1BTkRfRkFJTEVEICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NPTU1BTkRfUVVFVUVEICAgICAgICAgICAgICAgIDB4NDAwMAorLy8jZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5JVElBTElaRSAgICAgICAgICAgICAgMHgwMDAwCisKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19EQl9XUklURV9UUlVOQ0FURUQgICAgICAgICAgICAweDIwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBHZXQgU3RhdGUKKy8vCisKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVEVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVEVfSU5JVElBTElaRUQgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVEVfU1RBUlRFRCAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFURV9TVE9QUEVEICAgICAgICAgMHgwMDAwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU3RhcnQKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IEluaXQgSW5mbworLy8KKworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NBQkxFX0RFVEVDVF9NQVNLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NBQkxFX0RFVEVDVF9OT1RfU1VQUE9SVEVEIDB4MDAwMAorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NBQkxFX0RFVEVDVF9TVVBQT1JURUQgICAgIDB4MDAwMQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgSW5pdGlhbGl6ZQorLy8KKworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOSVRJQUxJWkVEX05PX01FRElBICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFJlc2V0CisvLworCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVTRVRfTk9fTUVESUEgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU2h1dGRvd24KKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgSW50ZXJydXB0IEVuYWJsZXMKKy8vCisKKy8vCisvLyBJZiBzZXQsIHJlY2VpdmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5URVJSVVBUX1JFQ0VJVkUgICAgICAgICAweDAwMDEKKworLy8KKy8vIElmIHNldCwgdHJhbnNtaXQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5URVJSVVBUX1RSQU5TTUlUICAgICAgICAgICAgMHgwMDAyCisKKy8vCisvLyBJZiBzZXQsIGNvbW1hbmQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5URVJSVVBUX0NPTU1BTkQgICAgICAgICAweDAwMDQKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFJlY2VpdmUgRmlsdGVycworLy8KKworLy8KKy8vIElmIHNldCwgdW5pY2FzdCBwYWNrZXRzIHdpbGwgYmUgcmVjZWl2ZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX1JFQ0VJVkVfRklMVEVSX1VOSUNBU1QgICAgICAgIDB4MDAwMQorCisvLworLy8gSWYgc2V0LCBicm9hZGNhc3QgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19SRUNFSVZFX0ZJTFRFUl9CUk9BRENBU1QgICAgICAweDAwMDIKKworLy8KKy8vIElmIHNldCwgbXVsdGljYXN0IHBhY2tldHMgdGhhdCBtYXRjaCB1cCB3aXRoIHRoZSBtdWx0aWNhc3QgYWRkcmVzcworLy8gZmlsdGVyIGxpc3Qgd2lsbCBiZSByZWNlaXZlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVDRUlWRV9GSUxURVJfRklMVEVSRURfTVVMVElDQVNUIDB4MDAwNAorCisvLworLy8gSWYgc2V0LCBhbGwgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19SRUNFSVZFX0ZJTFRFUl9QUk9NSVNDVU9VUyAgICAgICAgMHgwMDA4CisKKy8vCisvLyBJZiBzZXQsIGFsbCBtdWx0aWNhc3QgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19SRUNFSVZFX0ZJTFRFUl9BTExfTVVMVElDQVNUICAweDAwMTAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBTdGF0aW9uIEFkZHJlc3MKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU3RhdGlzdGljcworLy8KKworLy8gTm8gYWRkaXRpb25hbCBTdGF0RmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBNQ2FzdCBJUCB0byBNQUMKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgTnZEYXRhCisvLworCisvLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IFN0YXR1cworLy8KKworLy8KKy8vIFVzZSB0byBkZXRlcm1pbmUgaWYgYW4gaW50ZXJydXB0IGhhcyBvY2N1cnJlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19JTlRFUlJVUFRfTUFTSyAgICAgMHgwMDBGCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19OT19JTlRFUlJVUFRTICAgICAgMHgwMDAwCisKKy8vCisvLyBJZiBzZXQsIGF0IGxlYXN0IG9uZSByZWNlaXZlIGludGVycnVwdCBvY2N1cnJlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19SRUNFSVZFICAgICAgICAgICAgMHgwMDAxCisKKy8vCisvLyBJZiBzZXQsIGF0IGxlYXN0IG9uZSB0cmFuc21pdCBpbnRlcnJ1cHQgb2NjdXJyZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfVFJBTlNNSVQgICAgICAgICAgIDB4MDAwMgorCisvLworLy8gSWYgc2V0LCBhdCBsZWFzdCBvbmUgY29tbWFuZCBpbnRlcnJ1cHQgb2NjdXJyZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfQ09NTUFORCAgICAgICAgICAgIDB4MDAwNAorCisvLworLy8gSWYgc2V0LCBhdCBsZWFzdCBvbmUgc29mdHdhcmUgaW50ZXJydXB0IG9jY3VycmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVFVTX1NPRlRXQVJFICAgICAgICAgICAweDAwMDgKKworLy8KKy8vIFRoaXMgZmxhZyBpcyBzZXQgaWYgdGhlIHRyYW5zbWl0dGVkIGJ1ZmZlciBxdWV1ZSBpcyBlbXB0eS4gIFRoaXMgZmxhZworLy8gd2lsbCBiZSBzZXQgaWYgYWxsIHRyYW5zbWl0dGVkIGJ1ZmZlciBhZGRyZXNzZXMgZ2V0IHdyaXR0ZW4gaW50byB0aGUgREIuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfVFhCVUZfUVVFVUVfRU1QVFkgIDB4MDAxMAorCisvLworLy8gVGhpcyBmbGFnIGlzIHNldCBpZiBubyB0cmFuc21pdHRlZCBidWZmZXIgYWRkcmVzc2VzIHdlcmUgd3JpdHRlbgorLy8gaW50byB0aGUgREIuICAoVGhpcyBjb3VsZCBiZSBiZWNhdXNlIERCc2l6ZSB3YXMgdG9vIHNtYWxsLikKKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19OT19UWEJVRlNfV1JJVFRFTiAgMHgwMDIwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgRmlsbCBIZWFkZXIKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgVHJhbnNtaXQKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFJlY2VpdmUKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzLgorCit0eXBlZGVmIFBYRV9VSU5UMTYgUFhFX1NUQVRDT0RFOworCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JTklUSUFMSVpFICAgICAgICAgICAgIDB4MDAwMAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb21tb24gU3RhdENvZGVzIHJldHVybmVkIGJ5IGFsbCBVTkRJIGNvbW1hbmRzLCBVTkRJIHByb3RvY29sIGZ1bmN0aW9ucworLy8gYW5kIEJDIHByb3RvY29sIGZ1bmN0aW9ucy4KKy8vCisKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JTlZBTElEX0NEQiAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lOVkFMSURfQ1BCICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQWEVfU1RBVENPREVfQlVTWSAgICAgICAgICAgICAgICAgICAJMHgwMDAzCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9RVUVVRV9GVUxMICAgICAgICAgICAgIAkweDAwMDQKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0FMUkVBRFlfU1RBUlRFRCAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBQWEVfU1RBVENPREVfTk9UX1NUQVJURUQgICAgICAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIFBYRV9TVEFUQ09ERV9OT1RfU0hVVERPV04gICAgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0FMUkVBRFlfSU5JVElBTElaRUQgICAgICAgIDB4MDAwOAorI2RlZmluZSBQWEVfU1RBVENPREVfTk9UX0lOSVRJQUxJWkVEICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIFBYRV9TVEFUQ09ERV9ERVZJQ0VfRkFJTFVSRSAgICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX05WREFUQV9GQUlMVVJFICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBQWEVfU1RBVENPREVfVU5TVVBQT1JURUQgICAgICAgICAgICAgICAgMHgwMDBDCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9CVUZGRVJfRlVMTCAgICAgICAgICAgICAgICAweDAwMEQKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lOVkFMSURfUEFSQU1FVEVSCQkweDAwMEUKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lOVkFMSURfVU5ESQkJMHgwMDBGCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JUFY0X05PVF9TVVBQT1JURUQJCTB4MDAxMAorI2RlZmluZSBQWEVfU1RBVENPREVfSVBWNl9OT1RfU1VQUE9SVEVECQkweDAwMTEKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX05PVF9FTk9VR0hfTUVNT1JZCQkweDAwMTIKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX05PX0RBVEEJCQkweDAwMTMKKworCit0eXBlZGVmIFBYRV9VSU5UMTYgUFhFX0lGTlVNOworCisvLworLy8gVGhpcyBpbnRlcmZhY2UgbnVtYmVyIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBTL1cgVU5ESSBTdGFydCBjb21tYW5kLgorLy8KKyNkZWZpbmUgUFhFX0lGTlVNX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisKKy8vCisvLyBUaGlzIGludGVyZmFjZSBudW1iZXIgaXMgcmV0dXJuZWQgYnkgdGhlIFMvVyBVTkRJIEdldCBTdGF0ZSBhbmQKKy8vIFN0YXJ0IGNvbW1hbmRzIGlmIGluZm9ybWF0aW9uIGluIHRoZSBDREIsIENQQiBvciBEQiBpcyBpbnZhbGlkLgorLy8KKyNkZWZpbmUgUFhFX0lGTlVNX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwCisKK3R5cGVkZWYgUFhFX1VJTlQxNiBQWEVfQ09OVFJPTDsKKworLy8KKy8vIFNldHRpbmcgdGhpcyBmbGFnIGRpcmVjdHMgdGhlIFVOREkgdG8gcXVldWUgdGhpcyBjb21tYW5kIGZvciBsYXRlcgorLy8gZXhlY3V0aW9uIGlmIHRoZSBVTkRJIGlzIGJ1c3kgYW5kIGl0IHN1cHBvcnRzIGNvbW1hbmQgcXVldWluZy4KKy8vIElmIHF1ZXVpbmcgaXMgbm90IHN1cHBvcnRlZCwgYSBQWEVfU1RBVENPREVfSU5WQUxJRF9DT05UUk9MIGVycm9yCisvLyBpcyByZXR1cm5lZC4gIElmIHRoZSBxdWV1ZSBpcyBmdWxsLCBhIFBYRV9TVEFUQ09ERV9DREJfUVVFVUVfRlVMTCAKKy8vIGVycm9yIGlzIHJldHVybmVkLgorLy8KKyNkZWZpbmUgUFhFX0NPTlRST0xfUVVFVUVfSUZfQlVTWSAgICAgICAgICAgICAgIDB4MDAwMgorCisvLworLy8gVGhlc2UgdHdvIGJpdCB2YWx1ZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBtb3JlIFVOREkKKy8vIENEQiBzdHJ1Y3R1cmVzIGZvbGxvd2luZyB0aGlzIG9uZS4gIElmIHRoZSBsaW5rIGJpdCBpcyBzZXQsIHRoZXJlCisvLyBtdXN0IGJlIGEgQ0RCIHN0cnVjdHVyZSBmb2xsb3dpbmcgdGhpcyBvbmUuICBFeGVjdXRpb24gd2lsbCBzdGFydAorLy8gb24gdGhlIG5leHQgQ0RCIHN0cnVjdHVyZSBhcyBzb29uIGFzIHRoaXMgb25lIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuCisvLyBJZiBhbiBlcnJvciBpcyBnZW5lcmF0ZWQgYnkgdGhpcyBjb21tYW5kLCBleGVjdXRpb24gd2lsbCBzdG9wLgorLy8KKyNkZWZpbmUgUFhFX0NPTlRST0xfTElOSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9DT05UUk9MX0xBU1RfQ0RCX0lOX0xJU1QgICAgICAgICAgICAgICAgMHgwMDAwCisKK3R5cGVkZWYgUFhFX1VJTlQ4IFBYRV9GUkFNRV9UWVBFOworCisjZGVmaW5lIFBYRV9GUkFNRV9UWVBFX05PTkUgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUFhFX0ZSQU1FX1RZUEVfVU5JQ0FTVCAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9CUk9BRENBU1QgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9NVUxUSUNBU1QgICAgICAgICAgICAweDAzCisjZGVmaW5lIFBYRV9GUkFNRV9UWVBFX1BST01JU0NVT1VTICAgICAgICAgICAgICAweDA0CisKK3R5cGVkZWYgUFhFX1VJTlQzMiBQWEVfSVBWNDsKKwordHlwZWRlZiBQWEVfVUlOVDMyIFBYRV9JUFY2WzRdOworI2RlZmluZSBQWEVfTUFDX0xFTkdUSCAzMgorCit0eXBlZGVmIFBYRV9VSU5UOCBQWEVfTUFDX0FERFJbUFhFX01BQ19MRU5HVEhdOworCit0eXBlZGVmIFBYRV9VSU5UOCBQWEVfSUZUWVBFOwordHlwZWRlZiBQWEVfVUlOVDE2IFBYRV9NRURJQV9QUk9UT0NPTDsKKworLy8KKy8vIFRoaXMgaW5mb3JtYXRpb24gaXMgZnJvbSB0aGUgQVJQIHNlY3Rpb24gb2YgUkZDIDE3MDAuCisvLworLy8gICAgIDEgRXRoZXJuZXQgKDEwTWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0pCUF0KKy8vICAgICAyIEV4cGVyaW1lbnRhbCBFdGhlcm5ldCAoM01iKSAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAgMyBBbWF0ZXVyIFJhZGlvIEFYLjI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUFhLXQorLy8gICAgIDQgUHJvdGVvbiBQcm9ORVQgVG9rZW4gUmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgW0pCUF0KKy8vICAgICA1IENoYW9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHWFBdCisvLyAgICAgNiBJRUVFIDgwMiBOZXR3b3JrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSkJQXQorLy8gICAgIDcgQVJDTkVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0pCUF0KKy8vICAgICA4IEh5cGVyY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAgOSBMYW5zdGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1RVXQorLy8gICAgMTAgQXV0b25ldCBTaG9ydCBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTVhCMV0KKy8vICAgIDExIExvY2FsVGFsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0pLUjFdCisvLyAgICAxMiBMb2NhbE5ldCAoSUJNIFBDTmV0IG9yIFNZVEVLIExvY2FsTkVUKSAgICAgICAgICAgICBbSlhNXQorLy8gICAgMTMgVWx0cmEgbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUlhEMl0KKy8vICAgIDE0IFNNRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0dYQzFdCisvLyAgICAxNSBGcmFtZSBSZWxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUdNXQorLy8gICAgMTYgQXN5bmNocm9ub3VzIFRyYW5zbWlzc2lvbiBNb2RlIChBVE0pICAgICAgICAgICAgICBbSlhCMl0KKy8vICAgIDE3IEhETEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAxOCBGaWJyZSBDaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtZYWtvdiBSZWtodGVyXQorLy8gICAgMTkgQXN5bmNocm9ub3VzIFRyYW5zbWlzc2lvbiBNb2RlIChBVE0pICAgICAgW01hcmsgTGF1YmFjaF0KKy8vICAgIDIwIFNlcmlhbCBMaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAyMSBBc3luY2hyb25vdXMgVHJhbnNtaXNzaW9uIE1vZGUgKEFUTSkgICAgICAgICAgICAgIFtNWEIxXQorLy8KKworI2RlZmluZSBQWEVfSUZUWVBFX0VUSEVSTkVUICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFBYRV9JRlRZUEVfVE9LRU5SSU5HICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFBYRV9JRlRZUEVfRklCUkVfQ0hBTk5FTCAgICAgICAgICAgICAgICAweDEyCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2h3X3VuZGkgeworUFhFX1VJTlQzMiBTaWduYXR1cmU7ICAgICAgIC8vIFBYRV9ST01JRF9TSUdOQVRVUkUKK1BYRV9VSU5UOCBMZW47ICAgICAgICAgIC8vIHNpemVvZihQWEVfSFdfVU5ESSkKK1BYRV9VSU5UOCBGdWRnZTsgICAgICAgICAgICAvLyBtYWtlcyA4LWJpdCBja3N1bSBlcXVhbCB6ZXJvCitQWEVfVUlOVDggUmV2OyAgICAgICAgICAvLyBQWEVfUk9NSURfUkVWCitQWEVfVUlOVDggSUZjbnQ7ICAgICAgICAgICAgLy8gcGh5c2ljYWwgY29ubmVjdG9yIGNvdW50CitQWEVfVUlOVDggTWFqb3JWZXI7ICAgICAgICAgLy8gUFhFX1JPTUlEX01BSk9SVkVSCitQWEVfVUlOVDggTWlub3JWZXI7ICAgICAgICAgLy8gUFhFX1JPTUlEX01JTk9SVkVSCitQWEVfVUlOVDE2IHJlc2VydmVkOyAgICAgICAgLy8gemVybywgbm90IHVzZWQKK1BYRV9VSU5UMzIgSW1wbGVtZW50YXRpb247ICAgICAgLy8gaW1wbGVtZW50YXRpb24gZmxhZ3MKKy8vIHJlc2VydmVkICAgICAgICAgICAgIC8vIHZlbmRvciB1c2UKKy8vIFBYRV9VSU5UMzIgU3RhdHVzOyAgICAgICAvLyBzdGF0dXMgcG9ydAorLy8gUFhFX1VJTlQzMiBDb21tYW5kOyAgICAgIC8vIGNvbW1hbmQgcG9ydAorLy8gUFhFX1VJTlQ2NCBDREJhZGRyOyAgICAgIC8vIENEQiBhZGRyZXNzIHBvcnQKK30gUFhFX0hXX1VOREk7CisKKy8vCisvLyBTdGF0dXMgcG9ydCBiaXQgZGVmaW5pdGlvbnMKKy8vCisKKy8vCisvLyBVTkRJIG9wZXJhdGlvbiBzdGF0ZQorLy8KKyNkZWZpbmUgUFhFX0hXU1RBVF9TVEFURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4QzAwMDAwMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9CVVNZICAgICAgICAgICAgICAgICAgICAgMHhDMDAwMDAwMAorI2RlZmluZSBQWEVfSFdTVEFUX0lOSVRJQUxJWkVEICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFBYRV9IV1NUQVRfU1RBUlRFRCAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9TVE9QUEVEICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorCisvLworLy8gSWYgc2V0LCBsYXN0IGNvbW1hbmQgZmFpbGVkCisvLworI2RlZmluZSBQWEVfSFdTVEFUX0NPTU1BTkRfRkFJTEVEICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorCisvLworLy8gSWYgc2V0LCBpZGVudGlmaWVzIGVuYWJsZWQgcmVjZWl2ZSBmaWx0ZXJzCisvLworI2RlZmluZSBQWEVfSFdTVEFUX1BST01JU0NVT1VTX01VTFRJQ0FTVF9SWF9FTkFCTEVEIDB4MDAwMDEwMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9QUk9NSVNDVU9VU19SWF9FTkFCTEVEICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBYRV9IV1NUQVRfQlJPQURDQVNUX1JYX0VOQUJMRUQgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBYRV9IV1NUQVRfTVVMVElDQVNUX1JYX0VOQUJMRUQgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBYRV9IV1NUQVRfVU5JQ0FTVF9SWF9FTkFCTEVEICAgICAgICAgICAweDAwMDAwMTAwCisKKy8vCisvLyBJZiBzZXQsIGlkZW50aWZpZXMgZW5hYmxlZCBleHRlcm5hbCBpbnRlcnJ1cHRzCisvLworI2RlZmluZSBQWEVfSFdTVEFUX1NPRlRXQVJFX0lOVF9FTkFCTEVEICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBQWEVfSFdTVEFUX1RYX0NPTVBMRVRFX0lOVF9FTkFCTEVEICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9QQUNLRVRfUlhfSU5UX0VOQUJMRUQgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFBYRV9IV1NUQVRfQ01EX0NPTVBMRVRFX0lOVF9FTkFCTEVEICAgICAgICAgMHgwMDAwMDAxMAorCisvLworLy8gSWYgc2V0LCBpZGVudGlmaWVzIHBlbmRpbmcgaW50ZXJydXB0cworLy8KKyNkZWZpbmUgUFhFX0hXU1RBVF9TT0ZUV0FSRV9JTlRfUEVORElORyAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUFhFX0hXU1RBVF9UWF9DT01QTEVURV9JTlRfUEVORElORyAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBYRV9IV1NUQVRfUEFDS0VUX1JYX0lOVF9QRU5ESU5HICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQWEVfSFdTVEFUX0NNRF9DT01QTEVURV9JTlRfUEVORElORyAgICAgICAgIDB4MDAwMDAwMDEKKworLy8KKy8vIENvbW1hbmQgcG9ydCBkZWZpbml0aW9ucworLy8KKworLy8KKy8vIElmIHNldCwgQ0RCIGlkZW50aWZpZWQgaW4gQ0RCYWRkciBwb3J0IGlzIGdpdmVuIHRvIFVOREkuCisvLyBJZiBub3Qgc2V0LCBvdGhlciBiaXRzIGluIHRoaXMgd29yZCB3aWxsIGJlIHByb2Nlc3NlZC4KKy8vCisjZGVmaW5lIFBYRV9IV0NNRF9JU1NVRV9DT01NQU5EICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgUFhFX0hXQ01EX0lOVFNfQU5EX0ZJTFRTICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKworLy8KKy8vIFVzZSB0aGVzZSB0byBlbmFibGUvZGlzYWJsZSByZWNlaXZlIGZpbHRlcnMuCisvLworI2RlZmluZSBQWEVfSFdDTURfUFJPTUlTQ1VPVVNfTVVMVElDQVNUX1JYX0VOQUJMRSAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFBYRV9IV0NNRF9QUk9NSVNDVU9VU19SWF9FTkFCTEUgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBYRV9IV0NNRF9CUk9BRENBU1RfUlhfRU5BQkxFICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBYRV9IV0NNRF9NVUxUSUNBU1RfUlhfRU5BQkxFICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBYRV9IV0NNRF9VTklDQVNUX1JYX0VOQUJMRSAgICAgICAgICAgICAweDAwMDAwMTAwCisKKy8vCisvLyBVc2UgdGhlc2UgdG8gZW5hYmxlL2Rpc2FibGUgZXh0ZXJuYWwgaW50ZXJydXB0cworLy8KKyNkZWZpbmUgUFhFX0hXQ01EX1NPRlRXQVJFX0lOVF9FTkFCTEUgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUFhFX0hXQ01EX1RYX0NPTVBMRVRFX0lOVF9FTkFCTEUgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFBYRV9IV0NNRF9QQUNLRVRfUlhfSU5UX0VOQUJMRSAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFBYRV9IV0NNRF9DTURfQ09NUExFVEVfSU5UX0VOQUJMRSAgICAgICAgICAgMHgwMDAwMDAxMAorCisvLworLy8gVXNlIHRoZXNlIHRvIGNsZWFyIHBlbmRpbmcgZXh0ZXJuYWwgaW50ZXJydXB0cworLy8KKyNkZWZpbmUgUFhFX0hXQ01EX0NMRUFSX1NPRlRXQVJFX0lOVCAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBYRV9IV0NNRF9DTEVBUl9UWF9DT01QTEVURV9JTlQgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBYRV9IV0NNRF9DTEVBUl9QQUNLRVRfUlhfSU5UICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFBYRV9IV0NNRF9DTEVBUl9DTURfQ09NUExFVEVfSU5UICAgICAgICAgICAgMHgwMDAwMDAwMQorCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9zd191bmRpIHsKK1BYRV9VSU5UMzIgU2lnbmF0dXJlOyAgICAgICAvLyBQWEVfUk9NSURfU0lHTkFUVVJFCitQWEVfVUlOVDggTGVuOyAgICAgICAgICAvLyBzaXplb2YoUFhFX1NXX1VOREkpCitQWEVfVUlOVDggRnVkZ2U7ICAgICAgICAgICAgLy8gbWFrZXMgOC1iaXQgY2tzdW0gemVybworUFhFX1VJTlQ4IFJldjsgICAgICAgICAgLy8gUFhFX1JPTUlEX1JFVgorUFhFX1VJTlQ4IElGY250OyAgICAgICAgICAgIC8vIHBoeXNpY2FsIGNvbm5lY3RvciBjb3VudAorUFhFX1VJTlQ4IE1ham9yVmVyOyAgICAgICAgIC8vIFBYRV9ST01JRF9NQUpPUlZFUgorUFhFX1VJTlQ4IE1pbm9yVmVyOyAgICAgICAgIC8vIFBYRV9ST01JRF9NSU5PUlZFUgorUFhFX1VJTlQxNiByZXNlcnZlZDE7ICAgICAgIC8vIHplcm8sIG5vdCB1c2VkCitQWEVfVUlOVDMyIEltcGxlbWVudGF0aW9uOyAgICAgIC8vIEltcGxlbWVudGF0aW9uIGZsYWdzCitQWEVfVUlOVDY0IEVudHJ5UG9pbnQ7ICAgICAgLy8gQVBJIGVudHJ5IHBvaW50CitQWEVfVUlOVDggcmVzZXJ2ZWQyWzNdOyAgICAgLy8gemVybywgbm90IHVzZWQKK1BYRV9VSU5UOCBCdXNDbnQ7ICAgICAgICAgICAvLyBudW1iZXIgb2YgYnVzdHlwZXMgc3VwcG9ydGVkCitQWEVfVUlOVDMyIEJ1c1R5cGVbMV07ICAgICAgLy8gbGlzdCBvZiBzdXBwb3J0ZWQgYnVzdHlwZXMKK30gUFhFX1NXX1VOREk7CisKK3R5cGVkZWYgdW5pb24gdV9weGVfdW5kaSB7CitQWEVfSFdfVU5ESSBodzsKK1BYRV9TV19VTkRJIHN3OworfSBQWEVfVU5ESTsKKworLy8KKy8vIFNpZ25hdHVyZSBvZiAhUFhFIHN0cnVjdHVyZQorLy8KKyNkZWZpbmUgUFhFX1JPTUlEX1NJR05BVFVSRSAgICAgUFhFX0JVU1RZUEUoJyEnLCAnUCcsICdYJywgJ0UnKQorCisvLworLy8gIVBYRSBzdHJ1Y3R1cmUgZm9ybWF0IHJldmlzaW9uCisvLworI2RlZmluZSBQWEVfUk9NSURfUkVWICAgICAgICAgICAgICAgICAgICAgICAweDAyCisKKy8vCisvLyBVTkRJIGNvbW1hbmQgaW50ZXJmYWNlIHJldmlzaW9uLiAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdCBnZXQgc2VudAorLy8gaW4gb3B0aW9uIDk0IChDbGllbnQgTmV0d29yayBJbnRlcmZhY2UgSWRlbnRpZmllcikgaW4gdGhlIERIQ1AgRGlzY292ZXIKKy8vIGFuZCBQWEUgQm9vdCBTZXJ2ZXIgUmVxdWVzdCBwYWNrZXRzLgorLy8KKyNkZWZpbmUgUFhFX1JPTUlEX01BSk9SVkVSICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBQWEVfUk9NSURfTUlOT1JWRVIgICAgICAgICAgICAgICAgICAweDAwCisKKy8vCisvLyBJbXBsZW1lbnRhdGlvbiBmbGFncworLy8KKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9IV19VTkRJICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9TV19WSVJUX0FERFIgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF82NEJJVF9ERVZJQ0UgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9GUkFHX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfQ01EX0xJTktfU1VQUE9SVEVEICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX0NNRF9RVUVVRV9TVVBQT1JURUQgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9NVUxUSV9GUkFNRV9TVVBQT1JURUQgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTlZEQVRBX1NVUFBPUlRfTUFTSyAgICAgICAgICAgMHgwMDAwMEMwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX05WREFUQV9CVUxLX1dSSVRBQkxFICAgICAgICAgIDB4MDAwMDBDMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9OVkRBVEFfU1BBUlNFX1dSSVRBQkxFICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTlZEQVRBX1JFQURfT05MWSAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTlZEQVRBX05PVF9BVkFJTEFCTEUgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX1NUQVRJU1RJQ1NfU1VQUE9SVEVEICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9TVEFUSU9OX0FERFJfU0VUVEFCTEUgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfUFJPTUlTQ1VPVVNfTVVMVElDQVNUX1JYX1NVUFBPUlRFRCAgICAweDAwMDAwMDgwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfUFJPTUlTQ1VPVVNfUlhfU1VQUE9SVEVEICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBQWEVfUk9NSURfSU1QX0JST0FEQ0FTVF9SWF9TVVBQT1JURUQgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9GSUxURVJFRF9NVUxUSUNBU1RfUlhfU1VQUE9SVEVEICAgMHgwMDAwMDAxMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX1NPRlRXQVJFX0lOVF9TVVBQT1JURUQgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9UWF9DT01QTEVURV9JTlRfU1VQUE9SVEVEICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBYRV9ST01JRF9JTVBfUEFDS0VUX1JYX0lOVF9TVVBQT1JURUQgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQWEVfUk9NSURfSU1QX0NNRF9DT01QTEVURV9JTlRfU1VQUE9SVEVEICAgICAgICAweDAwMDAwMDAxCisKKyAKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NkYiB7CitQWEVfT1BDT0RFIE9wQ29kZTsKK1BYRV9PUEZMQUdTIE9wRmxhZ3M7CitQWEVfVUlOVDE2IENQQnNpemU7CitQWEVfVUlOVDE2IERCc2l6ZTsKK1VJTlQ2NCBDUEJhZGRyOworVUlOVDY0IERCYWRkcjsKK1BYRV9TVEFUQ09ERSBTdGF0Q29kZTsKK1BYRV9TVEFURkxBR1MgU3RhdEZsYWdzOworUFhFX1VJTlQxNiBJRm51bTsKK1BYRV9DT05UUk9MIENvbnRyb2w7Cit9IFBYRV9DREI7CisKKwordHlwZWRlZiB1bmlvbiB1X3B4ZV9pcF9hZGRyIHsKK1BYRV9JUFY2IElQdjY7CitQWEVfSVBWNCBJUHY0OworfSBQWEVfSVBfQUREUjsKKwordHlwZWRlZiB1bmlvbiBweGVfZGV2aWNlIHsKKy8vCisvLyBQQ0kgYW5kIFBDIENhcmQgTklDcyBhcmUgYm90aCBpZGVudGlmaWVkIHVzaW5nIGJ1cywgZGV2aWNlCisvLyBhbmQgZnVuY3Rpb24gbnVtYmVycy4gIEZvciBQQyBDYXJkLCB0aGlzIG1heSByZXF1aXJlIFBDCisvLyBDYXJkIHNlcnZpY2VzIHRvIGJlIGxvYWRlZCBpbiB0aGUgQklPUyBvciBwcmVib290CisvLyBlbnZpcm9ubWVudC4KKy8vCitzdHJ1Y3QgeworLy8KKy8vIFNlZSBTL1cgVU5ESSBST01JRCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgUENJIGFuZAorLy8gUENDIEJ1c1R5cGUgZGVmaW5pdGlvbnMuCisvLworUFhFX1VJTlQzMiBCdXNUeXBlOworCisvLworLy8gQnVzLCBkZXZpY2UgJiBmdW5jdGlvbiBudW1iZXJzIHRoYXQgbG9jYXRlIHRoaXMgZGV2aWNlLgorLy8KK1BYRV9VSU5UMTYgQnVzOworUFhFX1VJTlQ4IERldmljZTsKK1BYRV9VSU5UOCBGdW5jdGlvbjsKK30gUENJLCBQQ0M7CisKKy8vCisvLyAlJVRCRCAtIE1vcmUgaW5mb3JtYXRpb24gaXMgbmVlZGVkIGFib3V0IGVudW1lcmF0aW5nCisvLyBVU0IgYW5kIDEzOTQgZGV2aWNlcy4KKy8vCitzdHJ1Y3QgeworUFhFX1VJTlQzMiBCdXNUeXBlOworUFhFX1VJTlQzMiB0ZGI7Cit9IFVTQiwgXzEzOTQ7Cit9IFBYRV9ERVZJQ0U7CisKKy8vIGNwYiBhbmQgZGIgZGVmaW5pdGlvbnMKKworI2RlZmluZSBNQVhfUENJX0NPTkZJR19MRU4gNjQgICAvLyAjIG9mIGR3b3JkcworI2RlZmluZSBNQVhfRUVQUk9NX0xFTiAxMjggICAgICAgLy8gI29mIGR3b3JkcworI2RlZmluZSBNQVhfWE1JVF9CVUZGRVJTICAgIDMyICAvLyByZWN5Y2xpbmcgUSBsZW5ndGggZm9yIHhtaXRfZG9uZQorI2RlZmluZSBNQVhfTUNBU1RfQUREUkVTU19DTlQgOAorCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfc3RhcnQgeworICAgIC8vCisgICAgLy8gUFhFX1ZPSUQgRGVsYXkoUFhFX1VJTlQ2NCBtaWNyb3NlY29uZHMpOworICAgIC8vCisgICAgLy8gVU5ESSB3aWxsIG5ldmVyIHJlcXVlc3QgYSBkZWxheSBzbWFsbGVyIHRoYW4gMTAgbWljcm9zZWNvbmRzCisgICAgLy8gYW5kIHdpbGwgYWx3YXlzIHJlcXVlc3QgZGVsYXlzIGluIGluY3JlbWVudHMgb2YgMTAgbWljcm9zZWNvbmRzLgorICAgIC8vIFRoZSBEZWxheSgpIENhbGxCYWNrIHJvdXRpbmUgbXVzdCBkZWxheSBiZXR3ZWVuIG4gYW5kIG4gKyAxMCAKKyAgICAvLyBtaWNyb3NlY29uZHMgYmVmb3JlIHJldHVybmluZyBjb250cm9sIHRvIHRoZSBVTkRJLgorICAgIC8vCisgICAgLy8gVGhpcyBmaWVsZCBjYW5ub3QgYmUgc2V0IHRvIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IERlbGF5OworCisgICAgLy8KKyAgICAvLyBQWEVfVk9JRCBCbG9jayhQWEVfVUlOVDMyIGVuYWJsZSk7CisgICAgLy8KKyAgICAvLyBVTkRJIG1heSBuZWVkIHRvIGJsb2NrIG11bHRpLXRocmVhZGVkL211bHRpLXByb2Nlc3NvciBhY2Nlc3MgdG8KKyAgICAvLyBjcml0aWNhbCBjb2RlIHNlY3Rpb25zIHdoZW4gcHJvZ3JhbW1pbmcgb3IgYWNjZXNzaW5nIHRoZSBuZXR3b3JrCisgICAgLy8gZGV2aWNlLiAgVG8gdGhpcyBlbmQsIGEgYmxvY2tpbmcgc2VydmljZSBpcyBuZWVkZWQgYnkgdGhlIFVOREkuCisgICAgLy8gV2hlbiBVTkRJIG5lZWRzIGEgYmxvY2ssIGl0IHdpbGwgY2FsbCBCbG9jaygpIHBhc3NpbmcgYSBub24temVybworICAgIC8vIHZhbHVlLiAgV2hlbiBVTkRJIG5vIGxvbmdlciBuZWVkcyBhIGJsb2NrLCBpdCB3aWxsIGNhbGwgQmxvY2soKQorICAgIC8vIHdpdGggYSB6ZXJvIHZhbHVlLiAgV2hlbiBjYWxsZWQsIGlmIHRoZSBCbG9jaygpIGlzIGFscmVhZHkgZW5hYmxlZCwKKyAgICAvLyBkbyBub3QgcmV0dXJuIGNvbnRyb2wgdG8gdGhlIFVOREkgdW50aWwgdGhlIHByZXZpb3VzIEJsb2NrKCkgaXMKKyAgICAvLyBkaXNhYmxlZC4KKyAgICAvLworICAgIC8vIFRoaXMgZmllbGQgY2Fubm90IGJlIHNldCB0byB6ZXJvLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBCbG9jazsKKworICAgIC8vCisgICAgLy8gUFhFX1ZPSUQgVmlydDJQaHlzKFBYRV9VSU5UNjQgdmlydHVhbCwgUFhFX1VJTlQ2NCBwaHlzaWNhbF9wdHIpOworICAgIC8vCisgICAgLy8gVU5ESSB3aWxsIHBhc3MgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiBhIGJ1ZmZlciBhbmQgdGhlIHZpcnR1YWwKKyAgICAvLyBhZGRyZXNzIG9mIGEgNjQtYml0IHBoeXNpY2FsIGJ1ZmZlci4gIENvbnZlcnQgdGhlIHZpcnR1YWwgYWRkcmVzcworICAgIC8vIHRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgcGh5c2ljYWwgYWRkcmVzcworICAgIC8vIGJ1ZmZlci4gIElmIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUgdGhlIHNhbWUsIGp1c3QKKyAgICAvLyBjb3B5IHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gdGhlIHBoeXNpY2FsIGFkZHJlc3MgYnVmZmVyLgorICAgIC8vCisgICAgLy8gVGhpcyBmaWVsZCBjYW4gYmUgc2V0IHRvIHplcm8gaWYgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzIAorICAgIC8vIGFyZSBlcXVhbC4KKyAgICAvLworICAgIFBYRV9VSU5UNjQgVmlydDJQaHlzOworICAgIC8vCisgICAgLy8gUFhFX1ZPSUQgTWVtX0lPKFBYRV9VSU5UOCByZWFkX3dyaXRlLCBQWEVfVUlOVDggbGVuLCBQWEVfVUlOVDY0IHBvcnQsIAorICAgIC8vICAgICAgICAgICAgICBQWEVfVUlOVDY0IGJ1Zl9hZGRyKTsKKyAgICAvLworICAgIC8vIFVOREkgd2lsbCByZWFkIG9yIHdyaXRlIHRoZSBkZXZpY2UgaW8gc3BhY2UgdXNpbmcgdGhpcyBjYWxsIGJhY2sgCisgICAgLy8gZnVuY3Rpb24uIEl0IHBhc3NlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFzIHRoZSBsZW4gcGFyYW1ldGVyIGFuZCBpdCAKKyAgICAvLyB3aWxsIGJlIGVpdGhlciAxLDIsNCBvciA4LgorICAgIC8vCisgICAgLy8gVGhpcyBmaWVsZCBjYW4gbm90IGJlIHNldCB0byB6ZXJvLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBNZW1fSU87Cit9IFBYRV9DUEJfU1RBUlQ7CisKKyNkZWZpbmUgUFhFX0RFTEFZX01JTExJU0VDT05EICAgICAgICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgUFhFX0RFTEFZX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgMTAwMDAwMAorI2RlZmluZSBQWEVfSU9fUkVBRCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUFhFX0lPX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQWEVfTUVNX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBYRV9NRU1fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgIDQKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9nZXRfaW5pdF9pbmZvIHsKKyAgICAvLworICAgIC8vIE1pbmltdW0gbGVuZ3RoIG9mIGxvY2tlZCBtZW1vcnkgYnVmZmVyIHRoYXQgbXVzdCBiZSBnaXZlbiB0bworICAgIC8vIHRoZSBJbml0aWFsaXplIGNvbW1hbmQuIEdpdmluZyBVTkRJIG1vcmUgbWVtb3J5IHdpbGwgZ2VuZXJhbGx5CisgICAgLy8gZ2l2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgLy8KKyAgICAvLyBJZiBNZW1vcnlSZXF1aXJlZCBpcyB6ZXJvLCB0aGUgVU5ESSBkb2VzIG5vdCBuZWVkIGFuZCB3aWxsIG5vdAorICAgIC8vIHVzZSBzeXN0ZW0gbWVtb3J5IHRvIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHBhY2tldHMuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIE1lbW9yeVJlcXVpcmVkOworCisgICAgLy8KKyAgICAvLyBNYXhpbXVtIGZyYW1lIGRhdGEgbGVuZ3RoIGZvciBUeC9SeCBleGNsdWRpbmcgdGhlIG1lZGlhIGhlYWRlci4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgRnJhbWVEYXRhTGVuOworCisgICAgLy8KKyAgICAvLyBTdXBwb3J0ZWQgbGluayBzcGVlZHMgYXJlIGluIHVuaXRzIG9mIG1lZ2EgYml0cy4gIENvbW1vbiBldGhlcm5ldAorICAgIC8vIHZhbHVlcyBhcmUgMTAsIDEwMCBhbmQgMTAwMC4gIFVudXNlZCBMaW5rU3BlZWRzW10gZW50cmllcyBhcmUgemVybworICAgIC8vIGZpbGxlZC4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgTGlua1NwZWVkc1s0XTsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIG5vbi12b2xhdGlsZSBzdG9yYWdlIGl0ZW1zLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBOdkNvdW50OworCisgICAgLy8KKyAgICAvLyBXaWR0aCBvZiBub24tdm9sYXRpbGUgc3RvcmFnZSBpdGVtIGluIGJ5dGVzLiAgMCwgMSwgMiBvciA0CisgICAgLy8KKyAgICBQWEVfVUlOVDE2IE52V2lkdGg7CisKKyAgICAvLworICAgIC8vIE1lZGlhIGhlYWRlciBsZW5ndGguICBUaGlzIGlzIHRoZSB0eXBpY2FsIG1lZGlhIGhlYWRlciBsZW5ndGggZm9yCisgICAgLy8gdGhpcyBVTkRJLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgd2hlbiBhbGxvY2F0aW5nIHJlY2VpdmUKKyAgICAvLyBhbmQgdHJhbnNtaXQgYnVmZmVycy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgTWVkaWFIZWFkZXJMZW47CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiB0aGUgTklDIGhhcmR3YXJlIChNQUMpIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IEhXYWRkckxlbjsKKworICAgIC8vCisgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IE1BQyBhZGRyZXNzZXMgaW4gdGhlIG11bHRpY2FzdAorICAgIC8vIE1BQyBhZGRyZXNzIGZpbHRlciBsaXN0LgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNQ2FzdEZpbHRlckNudDsKKworICAgIC8vCisgICAgLy8gRGVmYXVsdCBudW1iZXIgYW5kIHNpemUgb2YgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyB0aGF0IHdpbGwgCisgICAgLy8gYmUgYWxsb2NhdGVkIGJ5IHRoZSBVTkRJLiAgSWYgTWVtb3J5UmVxdWlyZWQgaXMgbm9uLXplcm8sIHRoaXMgCisgICAgLy8gYWxsb2NhdGlvbiB3aWxsIGNvbWUgb3V0IG9mIHRoZSBtZW1vcnkgYnVmZmVyIGdpdmVuIHRvIHRoZSBJbml0aWFsaXplIAorICAgIC8vIGNvbW1hbmQuICBJZiBNZW1vcnlSZXF1aXJlZCBpcyB6ZXJvLCB0aGlzIGFsbG9jYXRpb24gd2lsbCBjb21lIG91dCBvZiAKKyAgICAvLyBtZW1vcnkgb24gdGhlIE5JQy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgVHhCdWZDbnQ7CisgICAgUFhFX1VJTlQxNiBUeEJ1ZlNpemU7CisgICAgUFhFX1VJTlQxNiBSeEJ1ZkNudDsKKyAgICBQWEVfVUlOVDE2IFJ4QnVmU2l6ZTsKKworICAgIC8vCisgICAgLy8gSGFyZHdhcmUgaW50ZXJmYWNlIHR5cGVzIGRlZmluZWQgaW4gdGhlIEFzc2lnbmVkIE51bWJlcnMgUkZDCisgICAgLy8gYW5kIHVzZWQgaW4gREhDUCBhbmQgQVJQIHBhY2tldHMuCisgICAgLy8gU2VlIHRoZSBQWEVfSUZUWVBFIHR5cGVkZWYgYW5kIFBYRV9JRlRZUEVfeHh4IG1hY3Jvcy4KKyAgICAvLworICAgIFBYRV9VSU5UOCBJRnR5cGU7CisKKyAgICAvLworICAgIC8vIFN1cHBvcnRlZCBkdXBsZXguICBTZWUgUFhFX0RVUExFWF94eHh4eCAjZGVmaW5lcyBiZWxvdy4KKyAgICAvLworICAgIFBYRV9VSU5UOCBEdXBsZXg7CisKKyAgICAvLworICAgIC8vIFN1cHBvcnRlZCBsb29wYmFjayBvcHRpb25zLiAgU2VlIFBYRV9MT09QQkFDS194eHh4eCAjZGVmaW5lcyBiZWxvdy4KKyAgICAvLworICAgIFBYRV9VSU5UOCBMb29wQmFjazsKK30gUFhFX0RCX0dFVF9JTklUX0lORk87CisKKyNkZWZpbmUgUFhFX01BWF9UWFJYX1VOSVRfRVRIRVIgICAgICAgICAgICAgMTUwMAorCisjZGVmaW5lIFBYRV9IV0FERFJfTEVOX0VUSEVSICAgICAgICAgICAgICAgICAgICAweDAwMDYKKyNkZWZpbmUgUFhFX01BQ19IRUFERVJfTEVOX0VUSEVSICAgICAgICAgICAgICAgIDB4MDAwRQorCisjZGVmaW5lIFBYRV9EVVBMRVhfRU5BQkxFX0ZVTExfU1VQUE9SVEVEICAgICAgICAgICAgMQorI2RlZmluZSBQWEVfRFVQTEVYX0ZPUkNFX0ZVTExfU1VQUE9SVEVEICAgICAgICAgMgorCisjZGVmaW5lIFBYRV9MT09QQkFDS19JTlRFUk5BTF9TVVBQT1JURUQgICAgICAgICAxCisjZGVmaW5lIFBYRV9MT09QQkFDS19FWFRFUk5BTF9TVVBQT1JURUQgICAgICAgICAyCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfcGNpX2NvbmZpZ19pbmZvIHsKKyAgICAvLworICAgIC8vIFRoaXMgaXMgdGhlIGZsYWcgZmllbGQgZm9yIHRoZSBQWEVfREJfR0VUX0NPTkZJR19JTkZPIHVuaW9uLgorICAgIC8vIEZvciBQQ0kgYnVzIGRldmljZXMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIFBYRV9CVVNUWVBFX1BDSS4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgQnVzVHlwZTsKKworICAgIC8vCisgICAgLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBQQ0kgbmV0d29yayBkZXZpY2UgdGhhdCB0aGlzIFVOREkgaW50ZXJmYWNlCisgICAgLy8gaXMgYm91bmQgdG8uCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IEJ1czsKKyAgICBQWEVfVUlOVDggRGV2aWNlOworICAgIFBYRV9VSU5UOCBGdW5jdGlvbjsKKworICAgIC8vCisgICAgLy8gVGhpcyBpcyBhIGNvcHkgb2YgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGZvciB0aGlzIAorICAgIC8vIG5ldHdvcmsgZGV2aWNlLgorICAgIC8vCisgICAgdW5pb24geworICAgICAgICBQWEVfVUlOVDggQnl0ZVsyNTZdOworICAgICAgICBQWEVfVUlOVDE2IFdvcmRbMTI4XTsKKyAgICAgICAgUFhFX1VJTlQzMiBEd29yZFs2NF07CisgICAgfSBDb25maWc7Cit9IFBYRV9QQ0lfQ09ORklHX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfcGNjX2NvbmZpZ19pbmZvIHsKKyAgICAvLworICAgIC8vIFRoaXMgaXMgdGhlIGZsYWcgZmllbGQgZm9yIHRoZSBQWEVfREJfR0VUX0NPTkZJR19JTkZPIHVuaW9uLgorICAgIC8vIEZvciBQQ0MgYnVzIGRldmljZXMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIFBYRV9CVVNUWVBFX1BDQy4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgQnVzVHlwZTsKKyAgICAKKyAgICAvLworICAgIC8vIFRoaXMgaWRlbnRpZmllcyB0aGUgUENDIG5ldHdvcmsgZGV2aWNlIHRoYXQgdGhpcyBVTkRJIGludGVyZmFjZQorICAgIC8vIGlzIGJvdW5kIHRvLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBCdXM7CisgICAgUFhFX1VJTlQ4IERldmljZTsKKyAgICBQWEVfVUlOVDggRnVuY3Rpb247CisKKyAgICAvLworICAgIC8vIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBQQ0MgY29uZmlndXJhdGlvbiBzcGFjZSBmb3IgdGhpcyAKKyAgICAvLyBuZXR3b3JrIGRldmljZS4KKyAgICAvLworICAgIHVuaW9uIHsKKyAgICAgICAgUFhFX1VJTlQ4IEJ5dGVbMjU2XTsKKyAgICAgICAgUFhFX1VJTlQxNiBXb3JkWzEyOF07CisgICAgICAgIFBYRV9VSU5UMzIgRHdvcmRbNjRdOworICAgIH0gQ29uZmlnOworfSBQWEVfUENDX0NPTkZJR19JTkZPOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX3VzYl9jb25maWdfaW5mbyB7CisgICAgUFhFX1VJTlQzMiBCdXNUeXBlOworICAgIC8vICUlVEJEIFdoYXQgc2hvdWxkIHdlIHJldHVybiBoZXJlLi4uCit9IFBYRV9VU0JfQ09ORklHX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfMTM5NF9jb25maWdfaW5mbyB7CisgICAgUFhFX1VJTlQzMiBCdXNUeXBlOworICAgIC8vICUlVEJEIFdoYXQgc2hvdWxkIHdlIHJldHVybiBoZXJlLi4uCit9IFBYRV8xMzk0X0NPTkZJR19JTkZPOworCisKK3R5cGVkZWYgdW5pb24gdV9weGVfZGJfZ2V0X2NvbmZpZ19pbmZvIHsKKyAgICBQWEVfUENJX0NPTkZJR19JTkZPIHBjaTsKKyAgICBQWEVfUENDX0NPTkZJR19JTkZPIHBjYzsKKyAgICBQWEVfVVNCX0NPTkZJR19JTkZPIHVzYjsKKyAgICBQWEVfMTM5NF9DT05GSUdfSU5GTyBfMTM5NDsKK30gUFhFX0RCX0dFVF9DT05GSUdfSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfaW5pdGlhbGl6ZSB7CisgICAgLy8KKyAgICAvLyBBZGRyZXNzIG9mIGZpcnN0IChsb3dlc3QpIGJ5dGUgb2YgdGhlIG1lbW9yeSBidWZmZXIuICBUaGlzIGJ1ZmZlciBtdXN0CisgICAgLy8gYmUgaW4gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkgYW5kIGNhbm5vdCBiZSBzd2FwcGVkIG91dC4gIFRoZSBVTkRJCisgICAgLy8gd2lsbCBiZSB1c2luZyB0aGlzIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXJpbmcuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IE1lbW9yeUFkZHI7CisKKyAgICAvLworICAgIC8vIE1lbW9yeUxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBNZW1vcnlSZXF1aXJlZAorICAgIC8vIHJldHVybmVkIGJ5IHRoZSBHZXQgSW5pdCBJbmZvIGNvbW1hbmQuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIE1lbW9yeUxlbmd0aDsKKworICAgIC8vCisgICAgLy8gRGVzaXJlZCBsaW5rIHNwZWVkIGluIE1iaXQvc2VjLiAgQ29tbW9uIGV0aGVybmV0IHZhbHVlcyBhcmUgMTAsIDEwMAorICAgIC8vIGFuZCAxMDAwLiAgU2V0dGluZyBhIHZhbHVlIG9mIHplcm8gd2lsbCBhdXRvLWRldGVjdCBhbmQvb3IgdXNlIHRoZQorICAgIC8vIGRlZmF1bHQgbGluayBzcGVlZCAob3BlcmF0aW9uIGRlcGVuZHMgb24gVU5ESS9OSUMgZnVuY3Rpb25hbGl0eSkuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIExpbmtTcGVlZDsKKworICAgIC8vCisgICAgLy8gU3VnZ2VzdGVkIG51bWJlciBhbmQgc2l6ZSBvZiByZWNlaXZlIGFuZCB0cmFuc21pdCBidWZmZXJzIHRvCisgICAgLy8gYWxsb2NhdGUuICBJZiBNZW1vcnlBZGRyIGFuZCBNZW1vcnlMZW5ndGggYXJlIG5vbi16ZXJvLCB0aGlzCisgICAgLy8gYWxsb2NhdGlvbiBjb21lcyBvdXQgb2YgdGhlIHN1cHBsaWVkIG1lbW9yeSBidWZmZXIuICBJZiBNZW1vcnlBZGRyIAorICAgIC8vIGFuZCBNZW1vcnlMZW5ndGggYXJlIHplcm8sIHRoaXMgYWxsb2NhdGlvbiBjb21lcyBvdXQgb2YgbWVtb3J5CisgICAgLy8gb24gdGhlIE5JQy4KKyAgICAvLworICAgIC8vIElmIHRoZXNlIGZpZWxkcyBhcmUgc2V0IHRvIHplcm8sIHRoZSBVTkRJIHdpbGwgYWxsb2NhdGUgYnVmZmVyCisgICAgLy8gY291bnRzIGFuZCBzaXplcyBhcyBpdCBzZWVzIGZpdC4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgVHhCdWZDbnQ7CisgICAgUFhFX1VJTlQxNiBUeEJ1ZlNpemU7CisgICAgUFhFX1VJTlQxNiBSeEJ1ZkNudDsKKyAgICBQWEVfVUlOVDE2IFJ4QnVmU2l6ZTsKKworICAgIC8vCisgICAgLy8gVGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsIGFuZCBtdXN0IGJlIHplcm8gCisgICAgLy8gdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlcy4KKyAgICAvLworICAgIFBYRV9VSU5UOCBEdXBsZXg7IAorCisgICAgUFhFX1VJTlQ4IExvb3BCYWNrOworfSBQWEVfQ1BCX0lOSVRJQUxJWkU7CisKKworI2RlZmluZSBQWEVfRFVQTEVYX0RFRkFVTFQgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFBYRV9GT1JDRV9GVUxMX0RVUExFWCAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFBYRV9FTkFCTEVfRlVMTF9EVVBMRVggICAgICAgICAgICAgIDB4MDIKKworI2RlZmluZSBMT09QQkFDS19OT1JNQUwgMAorI2RlZmluZSBMT09QQkFDS19JTlRFUk5BTCAxCisjZGVmaW5lIExPT1BCQUNLX0VYVEVSTkFMIDIKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9pbml0aWFsaXplIHsKKyAgICAvLworICAgIC8vIEFjdHVhbCBhbW91bnQgb2YgbWVtb3J5IHVzZWQgZnJvbSB0aGUgc3VwcGxpZWQgbWVtb3J5IGJ1ZmZlci4gIFRoaXMKKyAgICAvLyBtYXkgYmUgbGVzcyB0aGF0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHN1cHBsbGllZCBhbmQgbWF5IGJlIHplcm8gaWYKKyAgICAvLyB0aGUgVU5ESSBhbmQgbmV0d29yayBkZXZpY2UgZG8gbm90IHVzZSBleHRlcm5hbCBtZW1vcnkgYnVmZmVycy4KKyAgICAvLworICAgIC8vIE1lbW9yeSB1c2VkIGJ5IHRoZSBVTkRJIGFuZCBuZXR3b3JrIGRldmljZSBpcyBhbGxvY2F0ZWQgZnJvbSB0aGUgCisgICAgLy8gbG93ZXN0IG1lbW9yeSBidWZmZXIgYWRkcmVzcy4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgTWVtb3J5VXNlZDsKKworICAgIC8vCisgICAgLy8gQWN0dWFsIG51bWJlciBhbmQgc2l6ZSBvZiByZWNlaXZlIGFuZCB0cmFuc21pdCBidWZmZXJzIHRoYXQgd2VyZQorICAgIC8vIGFsbG9jYXRlZC4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgVHhCdWZDbnQ7CisgICAgUFhFX1VJTlQxNiBUeEJ1ZlNpemU7CisgICAgUFhFX1VJTlQxNiBSeEJ1ZkNudDsKKyAgICBQWEVfVUlOVDE2IFJ4QnVmU2l6ZTsKK30gUFhFX0RCX0lOSVRJQUxJWkU7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3JlY2VpdmVfZmlsdGVycyB7CisgICAgLy8KKyAgICAvLyBMaXN0IG9mIG11bHRpY2FzdCBNQUMgYWRkcmVzc2VzLiAgVGhpcyBsaXN0LCBpZiBwcmVzZW50LCB3aWxsCisgICAgLy8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZpbHRlciBsaXN0LgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIE1DYXN0TGlzdFtNQVhfTUNBU1RfQUREUkVTU19DTlRdOworfSBQWEVfQ1BCX1JFQ0VJVkVfRklMVEVSUzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9yZWNlaXZlX2ZpbHRlcnMgeworICAgIC8vCisgICAgLy8gRmlsdGVyZWQgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGxpc3QuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgTUNhc3RMaXN0W01BWF9NQ0FTVF9BRERSRVNTX0NOVF07Cit9IFBYRV9EQl9SRUNFSVZFX0ZJTFRFUlM7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3N0YXRpb25fYWRkcmVzcyB7CisgICAgLy8KKyAgICAvLyBJZiBzdXBwbGllZCBhbmQgc3VwcG9ydGVkLCB0aGUgY3VycmVudCBzdGF0aW9uIE1BQyBhZGRyZXNzCisgICAgLy8gd2lsbCBiZSBjaGFuZ2VkLgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIFN0YXRpb25BZGRyOworfSBQWEVfQ1BCX1NUQVRJT05fQUREUkVTUzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kcGJfc3RhdGlvbl9hZGRyZXNzIHsKKyAgICAvLworICAgIC8vIEN1cnJlbnQgc3RhdGlvbiBNQUMgYWRkcmVzcy4KKyAgICAvLworICAgIFBYRV9NQUNfQUREUiBTdGF0aW9uQWRkcjsKKworICAgIC8vCisgICAgLy8gU3RhdGlvbiBicm9hZGNhc3QgTUFDIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgQnJvYWRjYXN0QWRkcjsKKworICAgIC8vCisgICAgLy8gUGVybWFuZW50IHN0YXRpb24gTUFDIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgUGVybWFuZW50QWRkcjsKK30gUFhFX0RCX1NUQVRJT05fQUREUkVTUzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9zdGF0aXN0aWNzIHsKKyAgICAvLworICAgIC8vIEJpdCBmaWVsZCBpZGVudGlmeWluZyB3aGF0IHN0YXRpc3RpYyBkYXRhIGlzIGNvbGxlY3RlZCBieSB0aGUgCisgICAgLy8gVU5ESS9OSUMuCisgICAgLy8gSWYgYml0IDB4MDAgaXMgc2V0LCBEYXRhWzB4MDBdIGlzIGNvbGxlY3RlZC4KKyAgICAvLyBJZiBiaXQgMHgwMSBpcyBzZXQsIERhdGFbMHgwMV0gaXMgY29sbGVjdGVkLgorICAgIC8vIElmIGJpdCAweDIwIGlzIHNldCwgRGF0YVsweDIwXSBpcyBjb2xsZWN0ZWQuCisgICAgLy8gSWYgYml0IDB4MjEgaXMgc2V0LCBEYXRhWzB4MjFdIGlzIGNvbGxlY3RlZC4KKyAgICAvLyBFdGMuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IFN1cHBvcnRlZDsKKworICAgIC8vCisgICAgLy8gU3RhdGlzdGljIGRhdGEuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IERhdGFbNjRdOworfSBQWEVfREJfU1RBVElTVElDUzsKKworLy8KKy8vIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQuICBJbmNsdWRlcyBmcmFtZXMgd2l0aCBlcnJvcnMgYW5kCisvLyBkcm9wcGVkIGZyYW1lcy4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX1RPVEFMX0ZSQU1FUyAgICAgICAgICAweDAwCisKKy8vCisvLyBOdW1iZXIgb2YgdmFsaWQgZnJhbWVzIHJlY2VpdmVkIGFuZCBjb3BpZWQgaW50byByZWNlaXZlIGJ1ZmZlcnMuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9HT09EX0ZSQU1FUyAgICAgICAgICAgMHgwMQorCisvLworLy8gTnVtYmVyIG9mIGZyYW1lcyBiZWxvdyB0aGUgbWluaW11bSBsZW5ndGggZm9yIHRoZSBtZWRpYS4KKy8vIFRoaXMgd291bGQgYmUgPDY0IGZvciBldGhlcm5ldC4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX1VOREVSU0laRV9GUkFNRVMgICAgICAgICAgMHgwMgorCisvLworLy8gTnVtYmVyIG9mIGZyYW1lcyBsb25nZXIgdGhhbiB0aGUgbWF4bWludW0gbGVuZ3RoIGZvciB0aGUKKy8vIG1lZGlhLiAgVGhpcyB3b3VsZCBiZSA+MTUwMCBmb3IgZXRoZXJuZXQuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9PVkVSU0laRV9GUkFNRVMgICAgICAgICAgIDB4MDMKKworLy8KKy8vIFZhbGlkIGZyYW1lcyB0aGF0IHdlcmUgZHJvcHBlZCBiZWNhdXNlIHJlY2VpdmUgYnVmZmVycyB3ZXJlIGZ1bGwuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9EUk9QUEVEX0ZSQU1FUyAgICAgICAgICAgIDB4MDQKKworLy8KKy8vIE51bWJlciBvZiB2YWxpZCB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBhbmQgbm90IGRyb3BwZWQuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgIDB4MDUKKworLy8KKy8vIE51bWJlciBvZiB2YWxpZCBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIGFuZCBub3QgZHJvcHBlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgMHgwNgorCisvLworLy8gTnVtYmVyIG9mIHZhbGlkIG11dGxpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgYW5kIG5vdCBkcm9wcGVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAweDA3CisKKy8vCisvLyBOdW1iZXIgb2YgZnJhbWVzIHcvIENSQyBvciBhbGlnbm1lbnQgZXJyb3JzLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfQ1JDX0VSUk9SX0ZSQU1FUyAgICAgICAgICAweDA4CisKKy8vCisvLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuICBJbmNsdWRlcyBmcmFtZXMgd2l0aCBlcnJvcnMKKy8vIGFuZCBkcm9wcGVkIGZyYW1lcy4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX1RPVEFMX0JZVEVTICAgICAgICAgICAweDA5CisKKy8vCisvLyBUcmFuc21pdCBzdGF0aXN0aWNzLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfVE9UQUxfRlJBTUVTICAgICAgICAgIDB4MEEKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfR09PRF9GUkFNRVMgICAgICAgICAgIDB4MEIKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfVU5ERVJTSVpFX0ZSQU1FUyAgICAgICAgICAweDBDCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX09WRVJTSVpFX0ZSQU1FUyAgICAgICAgICAgMHgwRAorI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9EUk9QUEVEX0ZSQU1FUyAgICAgICAgICAgIDB4MEUKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAweDBGCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgMHgxMAorI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgIDB4MTEKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfQ1JDX0VSUk9SX0ZSQU1FUyAgICAgICAgICAweDEyCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX1RPVEFMX0JZVEVTICAgICAgICAgICAweDEzCisKKy8vCisvLyBOdW1iZXIgb2YgY29sbGlzaW9ucyBkZXRlY3Rpb24gb24gdGhpcyBzdWJuZXQuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19DT0xMSVNJT05TICAgICAgICAgICAgICAgMHgxNAorCisvLworLy8gTnVtYmVyIG9mIGZyYW1lcyBkZXN0aW5lZCBmb3IgdW5zdXBwb3J0ZWQgcHJvdG9jb2wuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19VTlNVUFBPUlRFRF9QUk9UT0NPTCAgICAgICAgIDB4MTUKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfbWNhc3RfaXBfdG9fbWFjIHsKKyAgICAvLworICAgIC8vIE11bHRpY2FzdCBJUCBhZGRyZXNzIHRvIGJlIGNvbnZlcnRlZCB0byBtdWx0aWNhc3QgTUFDIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfSVBfQUREUiBJUDsKK30gUFhFX0NQQl9NQ0FTVF9JUF9UT19NQUM7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfbWNhc3RfaXBfdG9fbWFjIHsKKyAgICAvLworICAgIC8vIE11bHRpY2FzdCBNQUMgYWRkcmVzcy4KKyAgICAvLworICAgIFBYRV9NQUNfQUREUiBNQUM7Cit9IFBYRV9EQl9NQ0FTVF9JUF9UT19NQUM7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX252ZGF0YV9zcGFyc2UgeworICAgIC8vCisgICAgLy8gTnZEYXRhIGl0ZW0gbGlzdC4gIE9ubHkgaXRlbXMgaW4gdGhpcyBsaXN0IHdpbGwgYmUgdXBkYXRlZC4KKyAgICAvLworICAgIHN0cnVjdCB7CisgICAgICAgIC8vICBOb24tdm9sYXRpbGUgc3RvcmFnZSBhZGRyZXNzIHRvIGJlIGNoYW5nZWQuCisgICAgICAgIFBYRV9VSU5UMzIgQWRkcjsKKworICAgICAgICAvLyBEYXRhIGl0ZW0gdG8gd3JpdGUgaW50byBhYm92ZSBzdG9yYWdlIGFkZHJlc3MuCisgICAgCisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIFBYRV9VSU5UOCBCeXRlOworICAgICAgICAgICAgUFhFX1VJTlQxNiBXb3JkOworICAgICAgICAgICAgUFhFX1VJTlQzMiBEd29yZDsKKyAgICAgICAgfSBEYXRhOworICAgIH0gSXRlbVtNQVhfRUVQUk9NX0xFTl07Cit9IFBYRV9DUEJfTlZEQVRBX1NQQVJTRTsKKworCisvLworLy8gV2hlbiB1c2luZyBidWxrIHVwZGF0ZSwgdGhlIHNpemUgb2YgdGhlIENQQiBzdHJ1Y3R1cmUgbXVzdCBiZQorLy8gdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbm9uLXZvbGF0aWxlIE5JQyBzdG9yYWdlLgorLy8KK3R5cGVkZWYgdW5pb24gdV9weGVfY3BiX252ZGF0YV9idWxrIHsKKyAgICAvLworICAgIC8vIEFycmF5IG9mIGJ5dGUtd2lkZSBkYXRhIGl0ZW1zLgorICAgIC8vCisgICAgUFhFX1VJTlQ4IEJ5dGVbTUFYX0VFUFJPTV9MRU4gPDwgMl07CisKKyAgICAvLworICAgIC8vIEFycmF5IG9mIHdvcmQtd2lkZSBkYXRhIGl0ZW1zLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBXb3JkW01BWF9FRVBST01fTEVOIDw8IDFdOworCisgICAgLy8KKyAgICAvLyBBcnJheSBvZiBkd29yZC13aWRlIGRhdGEgaXRlbXMuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIER3b3JkW01BWF9FRVBST01fTEVOXTsKK30gUFhFX0NQQl9OVkRBVEFfQlVMSzsKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfbnZkYXRhIHsKKworICAgIC8vIEFycmF5cyBvZiBkYXRhIGl0ZW1zIGZyb20gbm9uLXZvbGF0aWxlIHN0b3JhZ2UuCisKKyAgICB1bmlvbiB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEFycmF5IG9mIGJ5dGUtd2lkZSBkYXRhIGl0ZW1zLgorICAgICAgICAvLworICAgICAgICBQWEVfVUlOVDggQnl0ZVtNQVhfRUVQUk9NX0xFTiA8PCAyXTsKKworICAgICAgICAvLworICAgICAgICAvLyBBcnJheSBvZiB3b3JkLXdpZGUgZGF0YSBpdGVtcy4KKyAgICAgICAgLy8KKyAgICAgICAgUFhFX1VJTlQxNiBXb3JkW01BWF9FRVBST01fTEVOIDw8IDFdOworCisgICAgICAgIC8vIEFycmF5IG9mIGR3b3JkLXdpZGUgZGF0YSBpdGVtcy4KKworICAgICAgICBQWEVfVUlOVDMyIER3b3JkW01BWF9FRVBST01fTEVOXTsKKyAgICB9IERhdGE7Cit9IFBYRV9EQl9OVkRBVEE7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfZ2V0X3N0YXR1cyB7CisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgbmV4dCByZWNlaXZlIGZyYW1lIChoZWFkZXIgKyBkYXRhKS4gIElmIHRoaXMgaXMgemVybywKKyAgICAvLyB0aGVyZSBpcyBubyBuZXh0IHJlY2VpdmUgZnJhbWUgYXZhaWxhYmxlLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBSeEZyYW1lTGVuOworCisgICAgLy8KKyAgICAvLyBSZXNlcnZlZCwgc2V0IHRvIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIHJlc2VydmVkOworCisgICAgLy8KKyAgICAvLyAgQWRkcmVzc2VzIG9mIHRyYW5zbWl0dGVkIGJ1ZmZlcnMgdGhhdCBuZWVkIHRvIGJlIHJlY3ljbGVkLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBUeEJ1ZmZlcltNQVhfWE1JVF9CVUZGRVJTXTsKK30gUFhFX0RCX0dFVF9TVEFUVVM7CisKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfZmlsbF9oZWFkZXIgeworICAgIC8vCisgICAgLy8gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzc2VzLiAgVGhlc2Ugd2lsbCBiZSBjb3BpZWQgaW50bworICAgIC8vIHRoZSBtZWRpYSBoZWFkZXIgd2l0aG91dCBkb2luZyBieXRlIHN3YXBwaW5nLgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIFNyY0FkZHI7CisgICAgUFhFX01BQ19BRERSIERlc3RBZGRyOworCisgICAgLy8KKyAgICAvLyBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgbWVkaWEgaGVhZGVyLiAgVGhlIGZpcnN0IGJ5dGUgb2YgcGFja2V0IGRhdGEKKyAgICAvLyBmb2xsb3dzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIG1lZGlhIGhlYWRlci4KKyAgICAvLworICAgIFBYRV9VSU5UNjQgTWVkaWFIZWFkZXI7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiBwYWNrZXQgZGF0YSBpbiBieXRlcyAobm90IGluY2x1ZGluZyB0aGUgbWVkaWEgaGVhZGVyKS4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgUGFja2V0TGVuOworCisgICAgLy8KKyAgICAvLyBQcm90b2NvbCB0eXBlLiAgVGhpcyB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBtZWRpYSBoZWFkZXIgd2l0aG91dAorICAgIC8vIGRvaW5nIGJ5dGUgc3dhcHBpbmcuICBQcm90b2NvbCB0eXBlIG51bWJlcnMgY2FuIGJlIG9idGFpbmVkIGZyb20KKyAgICAvLyB0aGUgQXNzaWduZWQgTnVtYmVycyBSRkMgMTcwMC4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgUHJvdG9jb2w7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyIGluIGJ5dGVzLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYUhlYWRlckxlbjsKK30gUFhFX0NQQl9GSUxMX0hFQURFUjsKKworCisjZGVmaW5lIFBYRV9QUk9UT0NPTF9FVEhFUk5FVF9JUCAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgUFhFX1BST1RPQ09MX0VUSEVSTkVUX0FSUCAgICAgICAgICAgICAgIDB4MDgwNgorI2RlZmluZSBNQVhfWE1JVF9GUkFHTUVOVFMgMTYKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX2ZpbGxfaGVhZGVyX2ZyYWdtZW50ZWQgeworICAgIC8vCisgICAgLy8gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzc2VzLiAgVGhlc2Ugd2lsbCBiZSBjb3BpZWQgaW50bworICAgIC8vIHRoZSBtZWRpYSBoZWFkZXIgd2l0aG91dCBkb2luZyBieXRlIHN3YXBwaW5nLgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIFNyY0FkZHI7CisgICAgUFhFX01BQ19BRERSIERlc3RBZGRyOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgcGFja2V0IGRhdGEgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgdGhlIG1lZGlhIGhlYWRlcikuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIFBhY2tldExlbjsKKworICAgIC8vCisgICAgLy8gUHJvdG9jb2wgdHlwZS4gIFRoaXMgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgbWVkaWEgaGVhZGVyIHdpdGhvdXQKKyAgICAvLyBkb2luZyBieXRlIHN3YXBwaW5nLiAgUHJvdG9jb2wgdHlwZSBudW1iZXJzIGNhbiBiZSBvYnRhaW5lZCBmcm9tCisgICAgLy8gdGhlIEFzc2lnbmVkIE51bWJlcnMgUkZDIDE3MDAuCisgICAgLy8KKyAgICBQWEVfTUVESUFfUFJPVE9DT0wgUHJvdG9jb2w7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyIGluIGJ5dGVzLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYUhlYWRlckxlbjsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIHBhY2tldCBmcmFnbWVudCBkZXNjcmlwdG9ycy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgRnJhZ0NudDsKKworICAgIC8vCisgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IHJlc2VydmVkOworCisgICAgLy8KKyAgICAvLyBBcnJheSBvZiBwYWNrZXQgZnJhZ21lbnQgZGVzY3JpcHRvcnMuICBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVkaWEKKyAgICAvLyBoZWFkZXIgaXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGZpcnN0IGZyYWdtZW50LgorICAgIC8vCisgICAgc3RydWN0IHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRkcmVzcyBvZiB0aGlzIHBhY2tldCBmcmFnbWVudC4KKyAgICAgICAgLy8KKyAgICAgICAgUFhFX1VJTlQ2NCBGcmFnQWRkcjsKKworICAgICAgICAvLworICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBwYWNrZXQgZnJhZ21lbnQuCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UMzIgRnJhZ0xlbjsKKworICAgICAgICAvLworICAgICAgICAvLyBSZXNlcnZlZCwgbXVzdCBiZSBzZXQgdG8gemVyby4KKyAgICAgICAgLy8KKyAgICAgICAgUFhFX1VJTlQzMiByZXNlcnZlZDsKKyAgICB9IEZyYWdEZXNjW01BWF9YTUlUX0ZSQUdNRU5UU107Cit9IFBYRV9DUEJfRklMTF9IRUFERVJfRlJBR01FTlRFRDsKKworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NwYl90cmFuc21pdCB7CisgICAgLy8KKyAgICAvLyBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgZnJhbWUgYnVmZmVyLiAgVGhpcyBpcyBhbHNvIHRoZSBmaXJzdCBieXRlCisgICAgLy8gb2YgdGhlIG1lZGlhIGhlYWRlci4KKyAgICAvLworICAgIFBYRV9VSU5UNjQgRnJhbWVBZGRyOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgZnJhbWUgYnVmZmVyIGluIGJ5dGVzLiAgRG8gbm90CisgICAgLy8gaW5jbHVkZSB0aGUgbGVuZ3RoIG9mIHRoZSBtZWRpYSBoZWFkZXIuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIERhdGFMZW47CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyIGluIGJ5dGVzLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYWhlYWRlckxlbjsKKworICAgIC8vCisgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgcmVzZXJ2ZWQ7Cit9IFBYRV9DUEJfVFJBTlNNSVQ7CisKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfdHJhbnNtaXRfZnJhZ21lbnRzIHsKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiBwYWNrZXQgZGF0YSBpbiBieXRlcyAobm90IGluY2x1ZGluZyB0aGUgbWVkaWEgaGVhZGVyKS4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgRnJhbWVMZW47CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyIGluIGJ5dGVzLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYWhlYWRlckxlbjsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIHBhY2tldCBmcmFnbWVudCBkZXNjcmlwdG9ycy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgRnJhZ0NudDsKKworICAgIC8vCisgICAgLy8gQXJyYXkgb2YgZnJhbWUgZnJhZ21lbnQgZGVzY3JpcHRvcnMuICBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlyc3QKKyAgICAvLyBmcmFnbWVudCBpcyBhbHNvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZWRpYSBoZWFkZXIuCisgICAgLy8KKyAgICBzdHJ1Y3QgeworICAgICAgICAvLworICAgICAgICAvLyBBZGRyZXNzIG9mIHRoaXMgZnJhbWUgZnJhZ21lbnQuCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UNjQgRnJhZ0FkZHI7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgZnJhbWUgZnJhZ21lbnQuCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UMzIgRnJhZ0xlbjsKKworICAgICAgICAvLworICAgICAgICAvLyBSZXNlcnZlZCwgbXVzdCBiZSBzZXQgdG8gemVyby4KKyAgICAgICAgLy8KKyAgICAgICAgUFhFX1VJTlQzMiByZXNlcnZlZDsKKyAgICB9IEZyYWdEZXNjW01BWF9YTUlUX0ZSQUdNRU5UU107Cit9IFBYRV9DUEJfVFJBTlNNSVRfRlJBR01FTlRTOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NwYl9yZWNlaXZlIHsKKyAgICAvLworICAgIC8vIEFkZHJlc3Mgb2YgZmlyc3QgYnl0ZSBvZiByZWNlaXZlIGJ1ZmZlci4gIFRoaXMgaXMgYWxzbyB0aGUgZmlyc3QgYnl0ZQorICAgIC8vIG9mIHRoZSBmcmFtZSBoZWFkZXIuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IEJ1ZmZlckFkZHI7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiByZWNlaXZlIGJ1ZmZlci4gIFRoaXMgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgICAvLyByZWNlaXZlZCBmcmFtZSAobWVkaWEgaGVhZGVyICsgZGF0YSkuICBJZiB0aGUgbGVuZ3RoIG9mIHNtYWxsZXIgdGhhbgorICAgIC8vIHRoZSByZWNlaXZlZCBmcmFtZSwgZGF0YSB3aWxsIGJlIGxvc3QuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIEJ1ZmZlckxlbjsKKworICAgIC8vCisgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIHJlc2VydmVkOworfSBQWEVfQ1BCX1JFQ0VJVkU7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfcmVjZWl2ZSB7CisgICAgLy8KKyAgICAvLyBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzZXMgZnJvbSBtZWRpYSBoZWFkZXIuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgU3JjQWRkcjsKKyAgICBQWEVfTUFDX0FERFIgRGVzdEFkZHI7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiByZWNlaXZlZCBmcmFtZS4gIE1heSBiZSBsYXJnZXIgdGhhbiByZWNlaXZlIGJ1ZmZlciBzaXplLgorICAgIC8vIFRoZSByZWNlaXZlIGJ1ZmZlciB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbi4gIFRoaXMgaXMgaG93IHRvIHRlbGwKKyAgICAvLyBpZiBkYXRhIHdhcyBsb3N0IGJlY2F1c2UgdGhlIHJlY2VpdmUgYnVmZmVyIHdhcyB0b28gc21hbGwuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIEZyYW1lTGVuOworCisgICAgLy8KKyAgICAvLyBQcm90b2NvbCB0eXBlIGZyb20gbWVkaWEgaGVhZGVyLgorICAgIC8vCisgICAgUFhFX01FRElBX1BST1RPQ09MIFByb3RvY29sOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgbWVkaWEgaGVhZGVyIGluIHJlY2VpdmVkIGZyYW1lLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYUhlYWRlckxlbjsKKworICAgIC8vCisgICAgLy8gVHlwZSBvZiByZWNlaXZlIGZyYW1lLgorICAgIC8vCisgICAgUFhFX0ZSQU1FX1RZUEUgVHlwZTsKKworICAgIC8vCisgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KKyAgICAvLworICAgIFBYRV9VSU5UOCByZXNlcnZlZFs3XTsKKworfSBQWEVfREJfUkVDRUlWRTsKKworI3ByYWdtYSBwYWNrKCkKKworLyogRU9GIC0gZWZpX3B4ZS5oICovCisjZW5kaWYgLyogX0VGSV9QWEVfSCAqLworCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9lZmlhcGkuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDczMjQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlhcGkuaApAQCAtMCwwICsxLDg5MCBAQAorI2lmbmRlZiBfRUZJX0FQSV9ICisjZGVmaW5lIF9FRklfQVBJX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpYXBpLmgKKworQWJzdHJhY3Q6CisKKyAgICBHbG9iYWwgRUZJIHJ1bnRpbWUgJiBib290IHNlcnZpY2UgaW50ZXJmYWNlcworCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIEVGSSBTcGVjaWZpY2F0aW9uIFJldmlzaW9uCisvLworCisjZGVmaW5lIEVGSV9TUEVDSUZJQ0FUSU9OX01BSk9SX1JFVklTSU9OIDEKKyNkZWZpbmUgRUZJX1NQRUNJRklDQVRJT05fTUlOT1JfUkVWSVNJT04gMDIKKworLy8KKy8vIERlY2xhcmUgZm9yd2FyZCByZWZlcmVuY2VkIGRhdGEgc3RydWN0dXJlcworLy8KKworSU5URVJGQUNFX0RFQ0woX0VGSV9TWVNURU1fVEFCTEUpOworCisvLworLy8gRUZJIE1lbW9yeQorLy8KKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0FMTE9DQVRFX1BBR0VTKSAoCisgICAgSU4gRUZJX0FMTE9DQVRFX1RZUEUgICAgICAgICAgICBUeXBlLAorICAgIElOIEVGSV9NRU1PUllfVFlQRSAgICAgICAgICAgICAgTWVtb3J5VHlwZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE5vUGFnZXMsCisgICAgT1VUIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAqTWVtb3J5CisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZSRUVfUEFHRVMpICgKKyAgICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgIE1lbW9yeSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE5vUGFnZXMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX01FTU9SWV9NQVApICgKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpNZW1vcnlNYXBTaXplLAorICAgIElOIE9VVCBFRklfTUVNT1JZX0RFU0NSSVBUT1IgICAgKk1lbW9yeU1hcCwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpNYXBLZXksCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqRGVzY3JpcHRvclNpemUsCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAqRGVzY3JpcHRvclZlcnNpb24KKyAgICApOworCisjZGVmaW5lIE5leHRNZW1vcnlEZXNjcmlwdG9yKFB0cixTaXplKSAgKChFRklfTUVNT1JZX0RFU0NSSVBUT1IgKikgKCgoVUlOVDggKikgUHRyKSArIFNpemUpKQorCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9BTExPQ0FURV9QT09MKSAoCisgICAgSU4gRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgICBQb29sVHlwZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GUkVFX1BPT0wpICgKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmIAorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9WSVJUVUFMX0FERFJFU1NfTUFQKSAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlNYXBTaXplLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclNpemUsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yVmVyc2lvbiwKKyAgICBJTiBFRklfTUVNT1JZX0RFU0NSSVBUT1IgICAgICAgICpWaXJ0dWFsTWFwCisgICAgKTsKKworCisjZGVmaW5lIEVGSV9PUFRJT05BTF9QVFIgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVGSV9JTlRFUk5BTF9GTkMgICAgICAgICAgICAweDAwMDAwMDAyICAgICAgLy8gUG9pbnRlciB0byBpbnRlcm5hbCBydW50aW1lIGZuYworI2RlZmluZSBFRklfSU5URVJOQUxfUFRSICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAgIC8vIFBvaW50ZXIgdG8gaW50ZXJuYWwgcnVudGltZSBkYXRhCisKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DT05WRVJUX1BPSU5URVIpICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnRGlzcG9zaXRpb24sCisgICAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAqKkFkZHJlc3MKKyAgICApOworCisKKy8vCisvLyBFRkkgRXZlbnRzCisvLworCisKKworI2RlZmluZSBFVlRfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEVWVF9SVU5USU1FICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgRVZUX1JVTlRJTUVfQ09OVEVYVCAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorCisjZGVmaW5lIEVWVF9OT1RJRllfV0FJVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRVZUX05PVElGWV9TSUdOQUwgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorCisjZGVmaW5lIEVWVF9TSUdOQUxfRVhJVF9CT09UX1NFUlZJQ0VTICAgICAgIDB4MDAwMDAyMDEKKyNkZWZpbmUgRVZUX1NJR05BTF9WSVJUVUFMX0FERFJFU1NfQ0hBTkdFICAgMHg2MDAwMDIwMgorCisjZGVmaW5lIEVWVF9FRklfU0lHTkFMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgRVZUX0VGSV9TSUdOQUxfTUFYICAgICAgICAgICAgICAgICAgMgorCit0eXBlZGVmCitWT0lECisoRUZJQVBJICpFRklfRVZFTlRfTk9USUZZKSAoCisgICAgSU4gRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50LAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQ29udGV4dAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DUkVBVEVfRVZFTlQpICgKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFR5cGUsCisgICAgSU4gRUZJX1RQTCAgICAgICAgICAgICAgICAgICAgICBOb3RpZnlUcGwsCisgICAgSU4gRUZJX0VWRU5UX05PVElGWSAgICAgICAgICAgICBOb3RpZnlGdW5jdGlvbiwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpOb3RpZnlDb250ZXh0LAorICAgIE9VVCBFRklfRVZFTlQgICAgICAgICAgICAgICAgICAgKkV2ZW50CisgICAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUaW1lckNhbmNlbCwKKyAgICBUaW1lclBlcmlvZGljLAorICAgIFRpbWVyUmVsYXRpdmUsCisgICAgVGltZXJUeXBlTWF4Cit9IEVGSV9USU1FUl9ERUxBWTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9USU1FUikgKAorICAgIElOIEVGSV9FVkVOVCAgICAgICAgICAgICAgICBFdmVudCwKKyAgICBJTiBFRklfVElNRVJfREVMQVkgICAgICAgICAgVHlwZSwKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgVHJpZ2dlclRpbWUKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0lHTkFMX0VWRU5UKSAoCisgICAgSU4gRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50CisgICAgKTsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9XQUlUX0ZPUl9FVkVOVCkgKAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkV2ZW50cywKKyAgICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgKkV2ZW50LAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAqSW5kZXgKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ0xPU0VfRVZFTlQpICgKKyAgICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ0hFQ0tfRVZFTlQpICgKKyAgICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQKKyAgICApOworCisvLworLy8gVGFzayBwcmlvcml0eSBsZXZlbAorLy8KKworI2RlZmluZSBUUExfQVBQTElDQVRJT04gICAgNAorI2RlZmluZSBUUExfQ0FMTEJBQ0sgICAgICAgOAorI2RlZmluZSBUUExfTk9USUZZICAgICAgICAxNiAKKyNkZWZpbmUgVFBMX0hJR0hfTEVWRUwgICAgMzEgCisKK3R5cGVkZWYKK0VGSV9UUEwKKyhFRklBUEkgKkVGSV9SQUlTRV9UUEwpICgKKyAgICBJTiBFRklfVFBMICAgICAgTmV3VHBsCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1JFU1RPUkVfVFBMKSAoCisgICAgSU4gRUZJX1RQTCAgICAgIE9sZFRwbAorICAgICk7CisKKworLy8KKy8vIEVGSSBwbGF0Zm9ybSB2YXJpYmxlcworLy8KKworI2RlZmluZSBFRklfR0xPQkFMX1ZBUklBQkxFICAgICBcCisgICAgeyAweDhCRTRERjYxLCAweDkzQ0EsIDB4MTFkMiwgezB4QUEsIDB4MEQsIDB4MDAsIDB4RTAsIDB4OTgsIDB4MDMsIDB4MkIsIDB4OEN9IH0KKworLy8gVmFyaWFibGUgYXR0cmlidXRlcworI2RlZmluZSBFRklfVkFSSUFCTEVfTk9OX1ZPTEFUSUxFICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVGSV9WQVJJQUJMRV9CT09UU0VSVklDRV9BQ0NFU1MgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUZJX1ZBUklBQkxFX1JVTlRJTUVfQUNDRVNTICAgICAgICAgMHgwMDAwMDAwNAorCisvLyBWYXJpYWJsZSBzaXplIGxpbWl0YXRpb24KKyNkZWZpbmUgRUZJX01BWElNVU1fVkFSSUFCTEVfU0laRSAgICAgICAgICAgMTAyNAorCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX1ZBUklBQkxFKSAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqVmFyaWFibGVOYW1lLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgKlZlbmRvckd1aWQsCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAqQXR0cmlidXRlcyBPUFRJT05BTCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpEYXRhU2l6ZSwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICpEYXRhCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dFVF9ORVhUX1ZBUklBQkxFX05BTUUpICgKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpWYXJpYWJsZU5hbWVTaXplLAorICAgIElOIE9VVCBDSEFSMTYgICAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZSwKKyAgICBJTiBPVVQgRUZJX0dVSUQgICAgICAgICAgICAgICAgICpWZW5kb3JHdWlkCisgICAgKTsKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VUX1ZBUklBQkxFKSAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqVmFyaWFibGVOYW1lLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgKlZlbmRvckd1aWQsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqRGF0YQorICAgICk7CisKKworLy8KKy8vIEVGSSBUaW1lCisvLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBSZXNvbHV0aW9uOyAgICAgLy8gMWUtNiBwYXJ0cyBwZXIgbWlsbGlvbgorICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgQWNjdXJhY3k7ICAgICAgIC8vIGhlcnR6CisgICAgICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBTZXRzVG9aZXJvOyAgICAgLy8gU2V0IGNsZWFycyBzdWItc2Vjb25kIHRpbWUKK30gRUZJX1RJTUVfQ0FQQUJJTElUSUVTOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfVElNRSkgKAorICAgIE9VVCBFRklfVElNRSAgICAgICAgICAgICAgICAgICAgKlRpbWUsCisgICAgT1VUIEVGSV9USU1FX0NBUEFCSUxJVElFUyAgICAgICAqQ2FwYWJpbGl0aWVzIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9USU1FKSAoCisgICAgSU4gRUZJX1RJTUUgICAgICAgICAgICAgICAgICAgICAqVGltZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfV0FLRVVQX1RJTUUpICgKKyAgICBPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICpFbmFibGVkLAorICAgIE9VVCBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgKlBlbmRpbmcsCisgICAgT1VUIEVGSV9USU1FICAgICAgICAgICAgICAgICAgICAqVGltZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVRfV0FLRVVQX1RJTUUpICgKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSwKKyAgICBJTiBFRklfVElNRSAgICAgICAgICAgICAgICAgICAgICpUaW1lIE9QVElPTkFMCisgICAgKTsKKworCisvLworLy8gSW1hZ2UgZnVuY3Rpb25zCisvLworCisKKy8vIFBFMzIrIFN1YnN5c3RlbSB0eXBlIGZvciBFRkkgaW1hZ2VzCisKKyNpZiAhZGVmaW5lZChJTUFHRV9TVUJTWVNURU1fRUZJX0FQUExJQ0FUSU9OKQorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fRUZJX0FQUExJQ0FUSU9OICAgICAgICAgICAgIDEwCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9FRklfQk9PVF9TRVJWSUNFX0RSSVZFUiAgICAgMTEKKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX0VGSV9SVU5USU1FX0RSSVZFUiAgICAgICAgICAxMgorI2VuZGlmCisKKy8vIFBFMzIrIE1hY2hpbmUgdHlwZSBmb3IgRUZJIGltYWdlcworCisjaWYgIWRlZmluZWQoRUZJX0lNQUdFX01BQ0hJTkVfSUEzMikKKyNkZWZpbmUgRUZJX0lNQUdFX01BQ0hJTkVfSUEzMiAgICAgIDB4MDE0YworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChFRklfSU1BR0VfTUFDSElORV9JQTY0KQorI2RlZmluZSBFRklfSU1BR0VfTUFDSElORV9JQTY0ICAgICAgMHgwMjAwCisjZW5kaWYKKworLy8gSW1hZ2UgRW50cnkgcHJvdG90eXBlCisKK3R5cGVkZWYgCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU1BR0VfRU5UUllfUE9JTlQpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIElOIHN0cnVjdCBfRUZJX1NZU1RFTV9UQUJMRSAgICAgKlN5c3RlbVRhYmxlCisgICAgKTsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTUFHRV9MT0FEKSAoCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBCb290UG9saWN5LAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgUGFyZW50SW1hZ2VIYW5kbGUsCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAqRmlsZVBhdGgsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqU291cmNlQnVmZmVyICAgT1BUSU9OQUwsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VTaXplLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAgICAgKkltYWdlSGFuZGxlCisgICAgKTsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTUFHRV9TVEFSVCkgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGUsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqRXhpdERhdGFTaXplLAorICAgIE9VVCBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgKipFeGl0RGF0YSAgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRVhJVCkgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGUsCisgICAgSU4gRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgICBFeGl0U3RhdHVzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRXhpdERhdGFTaXplLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKkV4aXREYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTUFHRV9VTkxPQUQpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlCisgICAgKTsKKworCisvLyBJbWFnZSBoYW5kbGUKKyNkZWZpbmUgTE9BREVEX0lNQUdFX1BST1RPQ09MICAgICAgXAorICAgIHsgMHg1QjFCMzFBMSwgMHg5NTYyLCAweDExZDIsIHsweDhFLCAweDNGLCAweDAwLCAweEEwLCAweEM5LCAweDY5LCAweDcyLCAweDNCfSB9CisKKyNkZWZpbmUgRUZJX0lNQUdFX0lORk9STUFUSU9OX1JFVklTSU9OICAgICAgMHgxMDAwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgIFBhcmVudEhhbmRsZTsKKyAgICBzdHJ1Y3QgX0VGSV9TWVNURU1fVEFCTEUgICAgICAgICpTeXN0ZW1UYWJsZTsKKworICAgIC8vIFNvdXJjZSBsb2NhdGlvbiBvZiBpbWFnZQorICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSGFuZGxlOworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgKkZpbGVQYXRoOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlJlc2VydmVkOworCisgICAgLy8gSW1hZ2VzIGxvYWQgb3B0aW9ucworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZE9wdGlvbnNTaXplOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxvYWRPcHRpb25zOworCisgICAgLy8gTG9jYXRpb24gb2Ygd2hlcmUgaW1hZ2Ugd2FzIGxvYWRlZAorICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkltYWdlQmFzZTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlU2l6ZTsKKyAgICBFRklfTUVNT1JZX1RZUEUgICAgICAgICAgICAgICAgIEltYWdlQ29kZVR5cGU7CisgICAgRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgICAgICBJbWFnZURhdGFUeXBlOworCisgICAgLy8gSWYgdGhlIGRyaXZlciBpbWFnZSBzdXBwb3J0cyBhIGR5bmFtaWMgdW5sb2FkIHJlcXVlc3QKKyAgICBFRklfSU1BR0VfVU5MT0FEICAgICAgICAgICAgICAgIFVubG9hZDsKKworfSBFRklfTE9BREVEX0lNQUdFOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9FWElUX0JPT1RfU0VSVklDRVMpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgTWFwS2V5CisgICAgKTsKKworLy8KKy8vIE1pc2MKKy8vCisKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NUQUxMKSAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIE1pY3Jvc2Vjb25kcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVRfV0FUQ0hET0dfVElNRVIpICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgVGltZW91dCwKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgV2F0Y2hkb2dDb2RlLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBEYXRhU2l6ZSwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgKldhdGNoZG9nRGF0YSBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DT05ORUNUX0NPTlRST0xMRVIpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZSwKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgKkRyaXZlckltYWdlSGFuZGxlIE9QVElPTkFMLAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAqUmVtYWluaW5nRGV2aWNlUGF0aCBPUFRJT05BTCwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RJU0NPTk5FQ1RfQ09OVFJPTExFUikgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlLAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBEcml2ZXJJbWFnZUhhbmRsZSBPUFRJT05BTCwKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQ2hpbGRIYW5kbGUgT1BUSU9OQUwKKyAgICApOworCisjZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX0JZX0hBTkRMRV9QUk9UT0NPTCAgMHgwMDAwMDAwMQorI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9HRVRfUFJPVE9DT0wgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfVEVTVF9QUk9UT0NPTCAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX0JZX0NISUxEX0NPTlRST0xMRVIgMHgwMDAwMDAwOAorI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9CWV9EUklWRVIgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfRVhDTFVTSVZFICAgICAgICAgICAweDAwMDAwMDIwCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9PUEVOX1BST1RPQ09MKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqKkludGVyZmFjZSBPUFRJT05BTCwKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQWdlbnRIYW5kbGUsCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ0xPU0VfUFJPVE9DT0wpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgSGFuZGxlLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEFnZW50SGFuZGxlLAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICBBZ2VudEhhbmRsZTsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgT3BlbkNvdW50OworfSBFRklfT1BFTl9QUk9UT0NPTF9JTkZPUk1BVElPTl9FTlRSWTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT04pICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgSGFuZGxlLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgT1VUIEVGSV9PUEVOX1BST1RPQ09MX0lORk9STUFUSU9OX0VOVFJZICoqRW50cnlCdWZmZXIsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICpFbnRyeUNvdW50CisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BST1RPQ09MU19QRVJfSEFORExFKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBPVVQgRUZJX0dVSUQgICAgICAgICAgICAgICAgKioqUHJvdG9jb2xCdWZmZXIsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICpQcm90b2NvbEJ1ZmZlckNvdW50CisgICAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBbGxIYW5kbGVzLAorICAgIEJ5UmVnaXN0ZXJOb3RpZnksCisgICAgQnlQcm90b2NvbAorfSBFRklfTE9DQVRFX1NFQVJDSF9UWVBFOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfTE9DQVRFX0hBTkRMRV9CVUZGRVIpICgKKyAgICBJTiBFRklfTE9DQVRFX1NFQVJDSF9UWVBFICAgU2VhcmNoVHlwZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sIE9QVElPTkFMLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU2VhcmNoS2V5IE9QVElPTkFMLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAqTm9IYW5kbGVzLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAqKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9MT0NBVEVfUFJPVE9DT0wpICgKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqUmVnaXN0cmF0aW9uIE9QVElPTkFMLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqKkludGVyZmFjZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTlNUQUxMX01VTFRJUExFX1BST1RPQ09MX0lOVEVSRkFDRVMpICgKKyAgICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgKkhhbmRsZSwKKyAgICAuLi4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVU5JTlNUQUxMX01VTFRJUExFX1BST1RPQ09MX0lOVEVSRkFDRVMpICgKKyAgICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgSGFuZGxlLAorICAgIC4uLgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DQUxDVUxBVEVfQ1JDMzIpICgKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkRhdGEsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIERhdGFTaXplLAorICAgIE9VVCBVSU5UMzIgICAgICAgICAgICAgICAgICAqQ3JjMzIKKyAgICApOworCit0eXBlZGVmCitWT0lECisoRUZJQVBJICpFRklfQ09QWV9NRU0pICgKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkRlc3RpbmF0aW9uLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU291cmNlLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBMZW5ndGgKKyAgICApOworCit0eXBlZGVmCitWT0lECisoRUZJQVBJICpFRklfU0VUX01FTSkgKAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBTaXplLAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBWYWx1ZQorICAgICk7CisKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0NSRUFURV9FVkVOVF9FWCkgKAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICBUeXBlLAorICAgIElOIEVGSV9UUEwgICAgICAgICAgICAgICAgICBOb3RpZnlUcGwsCisgICAgSU4gRUZJX0VWRU5UX05PVElGWSAgICAgICAgIE5vdGlmeUZ1bmN0aW9uIE9QVElPTkFMLAorICAgIElOIGNvbnN0IFZPSUQgICAgICAgICAgICAgICAqTm90aWZ5Q29udGV4dCBPUFRJT05BTCwKKyAgICBJTiBjb25zdCBFRklfR1VJRCAgICAgICAgICAgRXZlbnRHcm91cCBPUFRJT05BTCwKKyAgICBPVVQgRUZJX0VWRU5UICAgICAgICAgICAgICAgKkV2ZW50CisgICAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFZmlSZXNldENvbGQsCisgICAgRWZpUmVzZXRXYXJtLAorICAgIEVmaVJlc2V0U2h1dGRvd24KK30gRUZJX1JFU0VUX1RZUEU7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRVNFVF9TWVNURU0pICgKKyAgICBJTiBFRklfUkVTRVRfVFlQRSAgICAgICAgICAgUmVzZXRUeXBlLAorICAgIElOIEVGSV9TVEFUVVMgICAgICAgICAgICAgICBSZXNldFN0YXR1cywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgRGF0YVNpemUsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICpSZXNldERhdGEgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX05FWFRfTU9OT1RPTklDX0NPVU5UKSAoCisgICAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICpDb3VudAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfTkVYVF9ISUdIX01PTk9fQ09VTlQpICgKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgKkhpZ2hDb3VudAorICAgICk7CisKKy8vCisvLyBQcm90b2NvbCBoYW5kbGVyIGZ1bmN0aW9ucworLy8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBFRklfTkFUSVZFX0lOVEVSRkFDRSwKKyAgICBFRklfUENPREVfSU5URVJGQUNFCit9IEVGSV9JTlRFUkZBQ0VfVFlQRTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFKSAoCisgICAgSU4gT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICpIYW5kbGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBJTiBFRklfSU5URVJGQUNFX1RZUEUgICAgICAgSW50ZXJmYWNlVHlwZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkludGVyZmFjZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRUlOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqT2xkSW50ZXJmYWNlLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqTmV3SW50ZXJmYWNlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VOSU5TVEFMTF9QUk9UT0NPTF9JTlRFUkZBQ0UpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgSGFuZGxlLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpJbnRlcmZhY2UKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSEFORExFX1BST1RPQ09MKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqKkludGVyZmFjZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfUkVHSVNURVJfUFJPVE9DT0xfTk9USUZZKSAoCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICoqUmVnaXN0cmF0aW9uCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0xPQ0FURV9IQU5ETEUpICgKKyAgICBJTiBFRklfTE9DQVRFX1NFQVJDSF9UWVBFICAgU2VhcmNoVHlwZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sIE9QVElPTkFMLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU2VhcmNoS2V5IE9QVElPTkFMLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9MT0NBVEVfREVWSUNFX1BBVEgpICgKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIElOIE9VVCBFRklfREVWSUNFX1BBVEggICAgICAqKkRldmljZVBhdGgsCisgICAgT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICAgICpEZXZpY2UKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU5TVEFMTF9DT05GSUdVUkFUSU9OX1RBQkxFKSAoCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpHdWlkLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqVGFibGUKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUkVTRVJWRURfU0VSVklDRSkgKAorICAgICk7CisKKy8vCisvLyBTdGFuZGFyZCBFRkkgdGFibGUgaGVhZGVyCisvLworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1RBQkxFX0hFQVJERVIgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBDUkMzMjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7Cit9IEVGSV9UQUJMRV9IRUFERVI7CisKKworLy8KKy8vIEVGSSBSdW50aW1lIFNlcml2Y2VzIFRhYmxlCisvLworCisjZGVmaW5lIEVGSV9SVU5USU1FX1NFUlZJQ0VTX1NJR05BVFVSRSAgMHg1NjUyNDU1MzU0NGU1NTUyCisjZGVmaW5lIEVGSV9SVU5USU1FX1NFUlZJQ0VTX1JFVklTSU9OICAgKEVGSV9TUEVDSUZJQ0FUSU9OX01BSk9SX1JFVklTSU9OPDwxNikgfCAoRUZJX1NQRUNJRklDQVRJT05fTUlOT1JfUkVWSVNJT04pCisKK3R5cGVkZWYgc3RydWN0ICB7CisgICAgRUZJX1RBQkxFX0hFQURFUiAgICAgICAgICAgICAgICBIZHI7CisKKyAgICAvLworICAgIC8vIFRpbWUgc2VydmljZXMKKyAgICAvLworCisgICAgRUZJX0dFVF9USU1FICAgICAgICAgICAgICAgICAgICBHZXRUaW1lOworICAgIEVGSV9TRVRfVElNRSAgICAgICAgICAgICAgICAgICAgU2V0VGltZTsKKyAgICBFRklfR0VUX1dBS0VVUF9USU1FICAgICAgICAgICAgIEdldFdha2V1cFRpbWU7CisgICAgRUZJX1NFVF9XQUtFVVBfVElNRSAgICAgICAgICAgICBTZXRXYWtldXBUaW1lOworCisgICAgLy8KKyAgICAvLyBWaXJ0dWFsIG1lbW9yeSBzZXJ2aWNlcworICAgIC8vCisKKyAgICBFRklfU0VUX1ZJUlRVQUxfQUREUkVTU19NQVAgICAgIFNldFZpcnR1YWxBZGRyZXNzTWFwOworICAgIEVGSV9DT05WRVJUX1BPSU5URVIgICAgICAgICAgICAgQ29udmVydFBvaW50ZXI7CisKKyAgICAvLworICAgIC8vIFZhcmlhYmxlIHNlcnZpZXJzCisgICAgLy8KKworICAgIEVGSV9HRVRfVkFSSUFCTEUgICAgICAgICAgICAgICAgR2V0VmFyaWFibGU7CisgICAgRUZJX0dFVF9ORVhUX1ZBUklBQkxFX05BTUUgICAgICBHZXROZXh0VmFyaWFibGVOYW1lOworICAgIEVGSV9TRVRfVkFSSUFCTEUgICAgICAgICAgICAgICAgU2V0VmFyaWFibGU7CisKKyAgICAvLworICAgIC8vIE1pc2MKKyAgICAvLworCisgICAgRUZJX0dFVF9ORVhUX0hJR0hfTU9OT19DT1VOVCAgICBHZXROZXh0SGlnaE1vbm90b25pY0NvdW50OworICAgIEVGSV9SRVNFVF9TWVNURU0gICAgICAgICAgICAgICAgUmVzZXRTeXN0ZW07CisKK30gRUZJX1JVTlRJTUVfU0VSVklDRVM7CisKKworLy8KKy8vIEVGSSBCb290IFNlcnZpY2VzIFRhYmxlCisvLworCisjZGVmaW5lIEVGSV9CT09UX1NFUlZJQ0VTX1NJR05BVFVSRSAgICAgMHg1NjUyNDU1MzU0NGY0ZjQyCisjZGVmaW5lIEVGSV9CT09UX1NFUlZJQ0VTX1JFVklTSU9OICAgICAgKEVGSV9TUEVDSUZJQ0FUSU9OX01BSk9SX1JFVklTSU9OPDwxNikgfCAoRUZJX1NQRUNJRklDQVRJT05fTUlOT1JfUkVWSVNJT04pCisKK3R5cGVkZWYgc3RydWN0IF9FRklfQk9PVF9TRVJWSUNFUyB7CisKKyAgICBFRklfVEFCTEVfSEVBREVSICAgICAgICAgICAgICAgIEhkcjsKKworICAgIC8vCisgICAgLy8gVGFzayBwcmlvcml0eSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgRUZJX1JBSVNFX1RQTCAgICAgICAgICAgICAgICAgICBSYWlzZVRQTDsKKyAgICBFRklfUkVTVE9SRV9UUEwgICAgICAgICAgICAgICAgIFJlc3RvcmVUUEw7CisKKyAgICAvLworICAgIC8vIE1lbW9yeSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgRUZJX0FMTE9DQVRFX1BBR0VTICAgICAgICAgICAgICBBbGxvY2F0ZVBhZ2VzOworICAgIEVGSV9GUkVFX1BBR0VTICAgICAgICAgICAgICAgICAgRnJlZVBhZ2VzOworICAgIEVGSV9HRVRfTUVNT1JZX01BUCAgICAgICAgICAgICAgR2V0TWVtb3J5TWFwOworICAgIEVGSV9BTExPQ0FURV9QT09MICAgICAgICAgICAgICAgQWxsb2NhdGVQb29sOworICAgIEVGSV9GUkVFX1BPT0wgICAgICAgICAgICAgICAgICAgRnJlZVBvb2w7CisKKyAgICAvLworICAgIC8vIEV2ZW50ICYgdGltZXIgZnVuY3Rpb25zCisgICAgLy8KKworICAgIEVGSV9DUkVBVEVfRVZFTlQgICAgICAgICAgICAgICAgQ3JlYXRlRXZlbnQ7CisgICAgRUZJX1NFVF9USU1FUiAgICAgICAgICAgICAgICAgICBTZXRUaW1lcjsKKyAgICBFRklfV0FJVF9GT1JfRVZFTlQgICAgICAgICAgICAgIFdhaXRGb3JFdmVudDsKKyAgICBFRklfU0lHTkFMX0VWRU5UICAgICAgICAgICAgICAgIFNpZ25hbEV2ZW50OworICAgIEVGSV9DTE9TRV9FVkVOVCAgICAgICAgICAgICAgICAgQ2xvc2VFdmVudDsKKyAgICBFRklfQ0hFQ0tfRVZFTlQgICAgICAgICAgICAgICAgIENoZWNrRXZlbnQ7CisKKyAgICAvLworICAgIC8vIFByb3RvY29sIGhhbmRsZXIgZnVuY3Rpb25zCisgICAgLy8KKworICAgIEVGSV9JTlNUQUxMX1BST1RPQ09MX0lOVEVSRkFDRSAgSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlOworICAgIEVGSV9SRUlOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFIFJlaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlOworICAgIEVGSV9VTklOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFIFVuaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlOworICAgIEVGSV9IQU5ETEVfUFJPVE9DT0wgICAgICAgICAgICAgSGFuZGxlUHJvdG9jb2w7CisgICAgRUZJX0hBTkRMRV9QUk9UT0NPTCAgICAgICAgICAgICBQQ0hhbmRsZVByb3RvY29sOworICAgIEVGSV9SRUdJU1RFUl9QUk9UT0NPTF9OT1RJRlkgICAgUmVnaXN0ZXJQcm90b2NvbE5vdGlmeTsKKyAgICBFRklfTE9DQVRFX0hBTkRMRSAgICAgICAgICAgICAgIExvY2F0ZUhhbmRsZTsKKyAgICBFRklfTE9DQVRFX0RFVklDRV9QQVRIICAgICAgICAgIExvY2F0ZURldmljZVBhdGg7CisgICAgRUZJX0lOU1RBTExfQ09ORklHVVJBVElPTl9UQUJMRSBJbnN0YWxsQ29uZmlndXJhdGlvblRhYmxlOworCisgICAgLy8KKyAgICAvLyBJbWFnZSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgRUZJX0lNQUdFX0xPQUQgICAgICAgICAgICAgICAgICBMb2FkSW1hZ2U7CisgICAgRUZJX0lNQUdFX1NUQVJUICAgICAgICAgICAgICAgICBTdGFydEltYWdlOworICAgIEVGSV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgRXhpdDsKKyAgICBFRklfSU1BR0VfVU5MT0FEICAgICAgICAgICAgICAgIFVubG9hZEltYWdlOworICAgIEVGSV9FWElUX0JPT1RfU0VSVklDRVMgICAgICAgICAgRXhpdEJvb3RTZXJ2aWNlczsKKworICAgIC8vCisgICAgLy8gTWlzYyBmdW5jdGlvbnMKKyAgICAvLworCisgICAgRUZJX0dFVF9ORVhUX01PTk9UT05JQ19DT1VOVCAgICBHZXROZXh0TW9ub3RvbmljQ291bnQ7CisgICAgRUZJX1NUQUxMICAgICAgICAgICAgICAgICAgICAgICBTdGFsbDsKKyAgICBFRklfU0VUX1dBVENIRE9HX1RJTUVSICAgICAgICAgIFNldFdhdGNoZG9nVGltZXI7CisKKyAgICAvLworICAgIC8vIERyaXZlclN1cHBvcnQgU2VydmljZXMKKyAgICAvLworCisgICAgRUZJX0NPTk5FQ1RfQ09OVFJPTExFUiAgICAgICAgICBDb25uZWN0Q29udHJvbGxlcjsKKyAgICBFRklfRElTQ09OTkVDVF9DT05UUk9MTEVSICAgICAgIERpc2Nvbm5lY3RDb250cm9sbGVyOworCisgICAgLy8KKyAgICAvLyBPcGVuIGFuZCBDbG9zZSBQcm90b2NvbCBTZXJ2aWNlcworICAgIC8vCisgICAgRUZJX09QRU5fUFJPVE9DT0wgICAgICAgICAgICAgICBPcGVuUHJvdG9jb2w7CisgICAgRUZJX0NMT1NFX1BST1RPQ09MICAgICAgICAgICAgICBDbG9zZVByb3RvY29sOworICAgIEVGSV9PUEVOX1BST1RPQ09MX0lORk9STUFUSU9OICAgT3BlblByb3RvY29sSW5mb3JtYXRpb247CisKKyAgICAvLworICAgIC8vIExpYnJhcnkgU2VydmljZXMKKyAgICAvLworICAgIEVGSV9QUk9UT0NPTFNfUEVSX0hBTkRMRSAgICAgICAgUHJvdG9jb2xzUGVySGFuZGxlOworICAgIEVGSV9MT0NBVEVfSEFORExFX0JVRkZFUiAgICAgICAgTG9jYXRlSGFuZGxlQnVmZmVyOworICAgIEVGSV9MT0NBVEVfUFJPVE9DT0wgICAgICAgICAgICAgTG9jYXRlUHJvdG9jb2w7CisgICAgRUZJX0lOU1RBTExfTVVMVElQTEVfUFJPVE9DT0xfSU5URVJGQUNFUyBJbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVyZmFjZXM7CisgICAgRUZJX1VOSU5TVEFMTF9NVUxUSVBMRV9QUk9UT0NPTF9JTlRFUkZBQ0VTIFVuaW5zdGFsbE11bHRpcGxlUHJvdG9jb2xJbnRlcmZhY2VzOworCisgICAgLy8KKyAgICAvLyAzMi1iaXQgQ1JDIFNlcnZpY2VzCisgICAgLy8KKyAgICBFRklfQ0FMQ1VMQVRFX0NSQzMyICAgICAgICAgICAgIENhbGN1bGF0ZUNyYzMyOworCisgICAgLy8KKyAgICAvLyBNaXNjIFNlcnZpY2VzCisgICAgLy8KKyAgICBFRklfQ09QWV9NRU0gICAgICAgICAgICAgICAgICAgIENvcHlNZW07CisgICAgRUZJX1NFVF9NRU0gICAgICAgICAgICAgICAgICAgICBTZXRNZW07CisgICAgRUZJX0NSRUFURV9FVkVOVF9FWCAgICAgICAgICAgICBDcmVhdGVFdmVudEV4OworfSBFRklfQk9PVF9TRVJWSUNFUzsKKworCisvLworLy8gRUZJIENvbmZpZ3VyYXRpb24gVGFibGUgYW5kIEdVSUQgZGVmaW5pdGlvbnMKKy8vCisKKyNkZWZpbmUgTVBTX1RBQkxFX0dVSUQgICAgXAorICAgIHsgMHhlYjlkMmQyZiwgMHgyZDg4LCAweDExZDMsIHsweDlhLCAweDE2LCAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworI2RlZmluZSBBQ1BJX1RBQkxFX0dVSUQgICAgXAorICAgIHsgMHhlYjlkMmQzMCwgMHgyZDg4LCAweDExZDMsIHsweDlhLCAweDE2LCAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworI2RlZmluZSBBQ1BJXzIwX1RBQkxFX0dVSUQgIFwKKyAgICB7IDB4ODg2OGU4NzEsIDB4ZTRmMSwgMHgxMWQzLCB7MHhiYywgMHgyMiwgMHgwLCAweDgwLCAweGM3LCAweDNjLCAweDg4LCAweDgxfSB9CisKKyNkZWZpbmUgU01CSU9TX1RBQkxFX0dVSUQgICAgXAorICAgIHsgMHhlYjlkMmQzMSwgMHgyZDg4LCAweDExZDMsIHsweDlhLCAweDE2LCAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworI2RlZmluZSBTQUxfU1lTVEVNX1RBQkxFX0dVSUQgICAgXAorICAgIHsgMHhlYjlkMmQzMiwgMHgyZDg4LCAweDExZDMsIHsweDlhLCAweDE2LCAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0NPTkZJR1VSQVRJT05fVEFCTEUgeworICAgIEVGSV9HVUlEICAgICAgICAgICAgICAgIFZlbmRvckd1aWQ7CisgICAgVk9JRCAgICAgICAgICAgICAgICAgICAgKlZlbmRvclRhYmxlOworfSBFRklfQ09ORklHVVJBVElPTl9UQUJMRTsKKworCisvLworLy8gRUZJIFN5c3RlbSBUYWJsZQorLy8KKworCisKKworI2RlZmluZSBFRklfU1lTVEVNX1RBQkxFX1NJR05BVFVSRSAgICAgIDB4NTQ1MzU5NTMyMDQ5NDI0OQorI2RlZmluZSBFRklfU1lTVEVNX1RBQkxFX1JFVklTSU9OICAgICAgKEVGSV9TUEVDSUZJQ0FUSU9OX01BSk9SX1JFVklTSU9OPDwxNikgfCAoRUZJX1NQRUNJRklDQVRJT05fTUlOT1JfUkVWSVNJT04pCisKK3R5cGVkZWYgc3RydWN0IF9FRklfU1lTVEVNX1RBQkxFIHsKKyAgICBFRklfVEFCTEVfSEVBREVSICAgICAgICAgICAgICAgIEhkcjsKKworICAgIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKkZpcm13YXJlVmVuZG9yOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlybXdhcmVSZXZpc2lvbjsKKworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZUluSGFuZGxlOworICAgIFNJTVBMRV9JTlBVVF9JTlRFUkZBQ0UgICAgICAgICAgKkNvbkluOworCisgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlT3V0SGFuZGxlOworICAgIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgKkNvbk91dDsKKworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRFcnJvckhhbmRsZTsKKyAgICBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICpTdGRFcnI7CisKKyAgICBFRklfUlVOVElNRV9TRVJWSUNFUyAgICAgICAgICAgICpSdW50aW1lU2VydmljZXM7CisgICAgRUZJX0JPT1RfU0VSVklDRVMgICAgICAgICAgICAgICAqQm9vdFNlcnZpY2VzOworCisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlRhYmxlRW50cmllczsKKyAgICBFRklfQ09ORklHVVJBVElPTl9UQUJMRSAgICAgICAgICpDb25maWd1cmF0aW9uVGFibGU7CisKK30gRUZJX1NZU1RFTV9UQUJMRTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWNvbi5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpY29uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5ZGI5OAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWNvbi5oCkBAIC0wLDAgKzEsMzAyIEBACisjaWZuZGVmIF9FRklfQ09OX0gKKyNkZWZpbmUgX0VGSV9DT05fSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmljb24uaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBjb25zb2xlIHByb3RvY29scworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBUZXh0IG91dHB1dCBwcm90b2NvbAorLy8KKworI2RlZmluZSBTSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0wgXAorICAgIHsgMHgzODc0NzdjMiwgMHg2OWM3LCAweDExZDIsIHsweDhlLCAweDM5LCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworSU5URVJGQUNFX0RFQ0woX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9SRVNFVCkgKAorICAgIElOIHN0cnVjdCBfU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFZlcmlmaWNhdGlvbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX09VVFBVVF9TVFJJTkcpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKlN0cmluZworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX1RFU1RfU1RSSU5HKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICpTdHJpbmcKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9RVUVSWV9NT0RFKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVOdW1iZXIsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqQ29sdW1ucywKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpSb3dzCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RFWFRfU0VUX01PREUpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgTW9kZU51bWJlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX1NFVF9BVFRSSUJVVEUpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlCisgICAgKTsKKworI2RlZmluZSBFRklfQkxBQ0sgICAweDAwCisjZGVmaW5lIEVGSV9CTFVFICAgIDB4MDEKKyNkZWZpbmUgRUZJX0dSRUVOICAgMHgwMgorI2RlZmluZSBFRklfQ1lBTiAgICAgICAgICAgIChFRklfQkxVRSB8IEVGSV9HUkVFTikKKyNkZWZpbmUgRUZJX1JFRCAgICAgMHgwNAorI2RlZmluZSBFRklfTUFHRU5UQSAgICAgICAgIChFRklfQkxVRSB8IEVGSV9SRUQpCisjZGVmaW5lIEVGSV9CUk9XTiAgICAgICAgICAgKEVGSV9HUkVFTiB8IEVGSV9SRUQpCisjZGVmaW5lIEVGSV9MSUdIVEdSQVkgICAgICAgKEVGSV9CTFVFIHwgRUZJX0dSRUVOIHwgRUZJX1JFRCkKKyNkZWZpbmUgRUZJX0JSSUdIVCAgMHgwOAorI2RlZmluZSBFRklfREFSS0dSQVkgICAgICAgIChFRklfQlJJR0hUKQorI2RlZmluZSBFRklfTElHSFRCTFVFICAgICAgIChFRklfQkxVRSB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVEdSRUVOICAgICAgKEVGSV9HUkVFTiB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVENZQU4gICAgICAgKEVGSV9DWUFOIHwgRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX0xJR0hUUkVEICAgICAgICAoRUZJX1JFRCB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVE1BR0VOVEEgICAgKEVGSV9NQUdFTlRBIHwgRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX1lFTExPVyAgICAgICAgICAoRUZJX0JST1dOIHwgRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX1dISVRFICAgICAgICAgICAoRUZJX0JMVUUgfCBFRklfR1JFRU4gfCBFRklfUkVEIHwgRUZJX0JSSUdIVCkKKworI2RlZmluZSBFRklfVEVYVF9BVFRSKGYsYikgICgoZikgfCAoKGIpIDw8IDQpKQorCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0JMQUNLICAgICAgICAweDAwCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0JMVUUgICAgICAgICAweDEwCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0dSRUVOICAgICAgICAweDIwCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0NZQU4gICAgICAgICAoRUZJX0JBQ0tHUk9VTkRfQkxVRSB8IEVGSV9CQUNLR1JPVU5EX0dSRUVOKQorI2RlZmluZSBFRklfQkFDS0dST1VORF9SRUQgICAgICAgICAgMHg0MAorI2RlZmluZSBFRklfQkFDS0dST1VORF9NQUdFTlRBICAgICAgKEVGSV9CQUNLR1JPVU5EX0JMVUUgfCBFRklfQkFDS0dST1VORF9SRUQpCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0JST1dOICAgICAgICAoRUZJX0JBQ0tHUk9VTkRfR1JFRU4gfCBFRklfQkFDS0dST1VORF9SRUQpCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0xJR0hUR1JBWSAgICAoRUZJX0JBQ0tHUk9VTkRfQkxVRSB8IEVGSV9CQUNLR1JPVU5EX0dSRUVOIHwgRUZJX0JBQ0tHUk9VTkRfUkVEKQorCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX0NMRUFSX1NDUkVFTikgKAorICAgIElOIHN0cnVjdCBfU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKlRoaXMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9TRVRfQ1VSU09SX1BPU0lUSU9OKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbiwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIFJvdworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX0VOQUJMRV9DVVJTT1IpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgRW5hYmxlCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIElOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TW9kZTsKKyAgICAvLyBjdXJyZW50IHNldHRpbmdzCisgICAgSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlOworICAgIElOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOworICAgIElOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yQ29sdW1uOworICAgIElOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yUm93OworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yVmlzaWJsZTsKK30gU0lNUExFX1RFWFRfT1VUUFVUX01PREU7CisKK3R5cGVkZWYgc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFIHsKKyAgICBFRklfVEVYVF9SRVNFVCAgICAgICAgICAgICAgICAgIFJlc2V0OworCisgICAgRUZJX1RFWFRfT1VUUFVUX1NUUklORyAgICAgICAgICBPdXRwdXRTdHJpbmc7CisgICAgRUZJX1RFWFRfVEVTVF9TVFJJTkcgICAgICAgICAgICBUZXN0U3RyaW5nOworCisgICAgRUZJX1RFWFRfUVVFUllfTU9ERSAgICAgICAgICAgICBRdWVyeU1vZGU7CisgICAgRUZJX1RFWFRfU0VUX01PREUgICAgICAgICAgICAgICBTZXRNb2RlOworICAgIEVGSV9URVhUX1NFVF9BVFRSSUJVVEUgICAgICAgICAgU2V0QXR0cmlidXRlOworCisgICAgRUZJX1RFWFRfQ0xFQVJfU0NSRUVOICAgICAgICAgICBDbGVhclNjcmVlbjsKKyAgICBFRklfVEVYVF9TRVRfQ1VSU09SX1BPU0lUSU9OICAgIFNldEN1cnNvclBvc2l0aW9uOworICAgIEVGSV9URVhUX0VOQUJMRV9DVVJTT1IgICAgICAgICAgRW5hYmxlQ3Vyc29yOworCisgICAgLy8gQ3VycmVudCBtb2RlCisgICAgU0lNUExFX1RFWFRfT1VUUFVUX01PREUgICAgICAgICAqTW9kZTsKK30gU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRTsKKworLy8KKy8vIERlZmluZSdzIGZvciByZXF1aXJlZCBFRkkgVW5pY29kZSBCb3ggRHJhdyBjaGFyYWN0ZXIKKy8vCisKKyNkZWZpbmUgQk9YRFJBV19IT1JJWk9OVEFMICAgICAgICAgICAgICAgICAgMHgyNTAwCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUwgICAgICAgICAgICAgICAgICAgIDB4MjUwMgorI2RlZmluZSBCT1hEUkFXX0RPV05fUklHSFQgICAgICAgICAgICAgICAgICAweDI1MGMKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0xFRlQgICAgICAgICAgICAgICAgICAgMHgyNTEwCisjZGVmaW5lIEJPWERSQVdfVVBfUklHSFQgICAgICAgICAgICAgICAgICAgIDB4MjUxNAorI2RlZmluZSBCT1hEUkFXX1VQX0xFRlQgICAgICAgICAgICAgICAgICAgICAweDI1MTgKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9SSUdIVCAgICAgICAgICAgICAgMHgyNTFjCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfTEVGVCAgICAgICAgICAgICAgIDB4MjUyNAorI2RlZmluZSBCT1hEUkFXX0RPV05fSE9SSVpPTlRBTCAgICAgICAgICAgICAweDI1MmMKKyNkZWZpbmUgQk9YRFJBV19VUF9IT1JJWk9OVEFMICAgICAgICAgICAgICAgMHgyNTM0CisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfSE9SSVpPTlRBTCAgICAgICAgIDB4MjUzYworCisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX0hPUklaT05UQUwgICAgICAgICAgIDB4MjU1MAorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9WRVJUSUNBTCAgICAgICAgICAgICAweDI1NTEKKyNkZWZpbmUgQk9YRFJBV19ET1dOX1JJR0hUX0RPVUJMRSAgICAgICAgICAgMHgyNTUyCisjZGVmaW5lIEJPWERSQVdfRE9XTl9ET1VCTEVfUklHSFQgICAgICAgICAgIDB4MjU1MworI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9ET1dOX1JJR0hUICAgICAgICAgICAweDI1NTQKKworI2RlZmluZSBCT1hEUkFXX0RPV05fTEVGVF9ET1VCTEUgICAgICAgICAgICAweDI1NTUKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0RPVUJMRV9MRUZUICAgICAgICAgICAgMHgyNTU2CisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX0RPV05fTEVGVCAgICAgICAgICAgIDB4MjU1NworCisjZGVmaW5lIEJPWERSQVdfVVBfUklHSFRfRE9VQkxFICAgICAgICAgICAgIDB4MjU1OAorI2RlZmluZSBCT1hEUkFXX1VQX0RPVUJMRV9SSUdIVCAgICAgICAgICAgICAweDI1NTkKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfVVBfUklHSFQgICAgICAgICAgICAgMHgyNTVhCisKKyNkZWZpbmUgQk9YRFJBV19VUF9MRUZUX0RPVUJMRSAgICAgICAgICAgICAgMHgyNTViCisjZGVmaW5lIEJPWERSQVdfVVBfRE9VQkxFX0xFRlQgICAgICAgICAgICAgIDB4MjU1YworI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9VUF9MRUZUICAgICAgICAgICAgICAweDI1NWQKKworI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX1JJR0hUX0RPVUJMRSAgICAgICAweDI1NWUKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9ET1VCTEVfUklHSFQgICAgICAgMHgyNTVmCisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX1ZFUlRJQ0FMX1JJR0hUICAgICAgIDB4MjU2MAorCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfTEVGVF9ET1VCTEUgICAgICAgIDB4MjU2MQorI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX0RPVUJMRV9MRUZUICAgICAgICAweDI1NjIKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfVkVSVElDQUxfTEVGVCAgICAgICAgMHgyNTYzCisKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0hPUklaT05UQUxfRE9VQkxFICAgICAgMHgyNTY0CisjZGVmaW5lIEJPWERSQVdfRE9XTl9ET1VCTEVfSE9SSVpPTlRBTCAgICAgIDB4MjU2NQorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9ET1dOX0hPUklaT05UQUwgICAgICAweDI1NjYKKworI2RlZmluZSBCT1hEUkFXX1VQX0hPUklaT05UQUxfRE9VQkxFICAgICAgICAweDI1NjcKKyNkZWZpbmUgQk9YRFJBV19VUF9ET1VCTEVfSE9SSVpPTlRBTCAgICAgICAgMHgyNTY4CisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX1VQX0hPUklaT05UQUwgICAgICAgIDB4MjU2OQorCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfSE9SSVpPTlRBTF9ET1VCTEUgIDB4MjU2YQorI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX0RPVUJMRV9IT1JJWk9OVEFMICAweDI1NmIKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfVkVSVElDQUxfSE9SSVpPTlRBTCAgMHgyNTZjCisKKy8vCisvLyBFRkkgUmVxdWlyZWQgQmxvY2sgRWxlbWVudHMgQ29kZSBDaGFydAorLy8KKworI2RlZmluZSBCTE9DS0VMRU1FTlRfRlVMTF9CTE9DSyAgICAgICAgICAgICAweDI1ODgKKyNkZWZpbmUgQkxPQ0tFTEVNRU5UX0xJR0hUX1NIQURFICAgICAgICAgICAgMHgyNTkxCisvLworLy8gRUZJIFJlcXVpcmVkIEdlb21ldHJpYyBTaGFwZXMgQ29kZSBDaGFydAorLy8KKworI2RlZmluZSBHRU9NRVRSSUNTSEFQRV9VUF9UUklBTkdMRSAgICAgICAgICAgMHgyNWIyCisjZGVmaW5lIEdFT01FVFJJQ1NIQVBFX1JJR0hUX1RSSUFOR0xFICAgICAgICAweDI1YmEKKyNkZWZpbmUgR0VPTUVUUklDU0hBUEVfRE9XTl9UUklBTkdMRSAgICAgICAgIDB4MjViYworI2RlZmluZSBHRU9NRVRSSUNTSEFQRV9MRUZUX1RSSUFOR0xFICAgICAgICAgMHgyNWM0CisKKy8vCisvLyBFRkkgUmVxdWlyZWQgQXJyb3cgc2hhcGVzCisvLworCisjZGVmaW5lIEFSUk9XX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE5MQorI2RlZmluZSBBUlJPV19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxOTMKKworLy8KKy8vIFRleHQgaW5wdXQgcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgU0lNUExFX1RFWFRfSU5QVVRfUFJPVE9DT0wgIFwKKyAgICB7IDB4Mzg3NDc3YzEsIDB4NjljNywgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKK0lOVEVSRkFDRV9ERUNMKF9TSU1QTEVfSU5QVVRfSU5URVJGQUNFKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYW5Db2RlOworICAgIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVDaGFyOworfSBFRklfSU5QVVRfS0VZOworCisvLworLy8gQmFzZWxpbmUgdW5pY29kZSBjb250cm9sIGNoYXJzCisvLworCisjZGVmaW5lIENIQVJfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIENIQVJfQkFDS1NQQUNFICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIENIQVJfVEFCICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIENIQVJfTElORUZFRUQgICAgICAgICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIENIQVJfQ0FSUklBR0VfUkVUVVJOICAgICAgICAgICAgMHgwMDBECisKKy8vCisvLyBTY2FuIGNvZGVzIGZvciBiYXNlIGxpbmUga2V5cworLy8KKworI2RlZmluZSBTQ0FOX05VTEwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTQ0FOX1VQICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTQ0FOX0RPV04gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBTQ0FOX1JJR0hUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBTQ0FOX0xFRlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBTQ0FOX0hPTUUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBTQ0FOX0VORCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBTQ0FOX0lOU0VSVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBTQ0FOX0RFTEVURSAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBTQ0FOX1BBR0VfVVAgICAgICAgICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBTQ0FOX1BBR0VfRE9XTiAgICAgICAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBTQ0FOX0YxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBTQ0FOX0YyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBTQ0FOX0YzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRAorI2RlZmluZSBTQ0FOX0Y0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBTQ0FOX0Y1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRgorI2RlZmluZSBTQ0FOX0Y2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBTQ0FOX0Y3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMQorI2RlZmluZSBTQ0FOX0Y4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMgorI2RlZmluZSBTQ0FOX0Y5ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMworI2RlZmluZSBTQ0FOX0YxMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBTQ0FOX0VTQyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU5QVVRfUkVTRVQpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9JTlBVVF9JTlRFUkZBQ0UgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFZlcmlmaWNhdGlvbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTlBVVF9SRUFEX0tFWSkgKAorICAgIElOIHN0cnVjdCBfU0lNUExFX0lOUFVUX0lOVEVSRkFDRSAgICpUaGlzLAorICAgIE9VVCBFRklfSU5QVVRfS0VZICAgICAgICAgICAgICAgICAgICpLZXkKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfU0lNUExFX0lOUFVUX0lOVEVSRkFDRSB7CisgICAgRUZJX0lOUFVUX1JFU0VUICAgICAgICAgICAgICAgICAgICAgUmVzZXQ7CisgICAgRUZJX0lOUFVUX1JFQURfS0VZICAgICAgICAgICAgICAgICAgUmVhZEtleVN0cm9rZTsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICBXYWl0Rm9yS2V5OworfSBTSU1QTEVfSU5QVVRfSU5URVJGQUNFOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvZWZpZGVidWcuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1ZDQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWRlYnVnLmgKQEAgLTAsMCArMSwxMTAgQEAKKyNpZm5kZWYgX0VGSV9ERUJVR19ICisjZGVmaW5lIF9FRklfREVCVUdfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlkZWJ1Zy5oCisKK0Fic3RyYWN0OgorCisgICAgRUZJIGxpYnJhcnkgZGVidWcgZnVuY3Rpb25zCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworZXh0ZXJuIFVJTlROICAgICBFRklEZWJ1ZzsKKworI2lmIEVGSV9ERUJVRworCisgICAgI2RlZmluZSBEQkdBU1NFUlQoYSkgICAgICAgIERiZ0Fzc2VydChfX0ZJTEVfXywgX19MSU5FX18sICNhKQorICAgICNkZWZpbmUgREVCVUcoYSkgICAgICAgICAgICBEYmdQcmludCBhCisgICAgCisjZWxzZQorCisgICAgI2RlZmluZSBEQkdBU1NFUlQoYSkKKyAgICAjZGVmaW5lIERFQlVHKGEpCisgICAgCisjZW5kaWYKKworI2lmIEVGSV9ERUJVR19DTEVBUl9NRU1PUlkKKworICAgICNkZWZpbmUgREJHU0VUTUVNKGEsbCkgICAgICBTZXRNZW0oYSxsLChDSEFSOClCQURfUE9JTlRFUikKKworI2Vsc2UKKworICAgICNkZWZpbmUgREJHU0VUTUVNKGEsbCkKKworI2VuZGlmCisKKyNkZWZpbmUgRF9JTklUICAgICAgICAweDAwMDAwMDAxICAgICAgICAgIC8vIEluaXRpYWxpemF0aW9uIHN0eWxlIG1lc3NhZ2VzCisjZGVmaW5lIERfV0FSTiAgICAgICAgMHgwMDAwMDAwMiAgICAgICAgICAvLyBXYXJuaW5ncworI2RlZmluZSBEX0xPQUQgICAgICAgIDB4MDAwMDAwMDQgICAgICAgICAgLy8gTG9hZCBldmVudHMKKyNkZWZpbmUgRF9GUyAgICAgICAgICAweDAwMDAwMDA4ICAgICAgICAgIC8vIEVGSSBGaWxlIHN5c3RlbQorI2RlZmluZSBEX1BPT0wgICAgICAgIDB4MDAwMDAwMTAgICAgICAgICAgLy8gQWxsb2MgJiBGcmVlJ3MKKyNkZWZpbmUgRF9QQUdFICAgICAgICAweDAwMDAwMDIwICAgICAgICAgIC8vIEFsbG9jICYgRnJlZSdzCisjZGVmaW5lIERfSU5GTyAgICAgICAgMHgwMDAwMDA0MCAgICAgICAgICAvLyBWZXJib3NlCisjZGVmaW5lIERfVkFSICAgICAgICAgMHgwMDAwMDEwMCAgICAgICAgICAvLyBWYXJpYWJsZQorI2RlZmluZSBEX1BBUlNFICAgICAgIDB4MDAwMDAyMDAgICAgICAgICAgLy8gQ29tbWFuZCBwYXJzaW5nCisjZGVmaW5lIERfQk0gICAgICAgICAgMHgwMDAwMDQwMCAgICAgICAgICAvLyBCb290IG1hbmFnZXIKKyNkZWZpbmUgRF9CTEtJTyAgICAgICAweDAwMDAxMDAwICAgICAgICAgIC8vIEJsa0lvIERyaXZlcgorI2RlZmluZSBEX0JMS0lPX1VMVFJBIDB4MDAwMDIwMDAgICAgICAgICAgLy8gQmxrSW8gRHJpdmVyCisjZGVmaW5lIERfTkVUICAgICAgICAgMHgwMDAwNDAwMCAgICAgICAgICAvLyBTTkkgRHJpdmVyCisjZGVmaW5lIERfTkVUX1VMVFJBICAgMHgwMDAwODAwMCAgICAgICAgICAvLyBTTkkgRHJpdmVyCisjZGVmaW5lIERfVFhUSU4gICAgICAgMHgwMDAxMDAwMCAgICAgICAgICAvLyBTaW1wbGUgSW5wdXQgRHJpdmVyCisjZGVmaW5lIERfVFhUT1VUICAgICAgMHgwMDAyMDAwMCAgICAgICAgICAvLyBTaW1wbGUgVGV4dCBPdXRwdXQgRHJpdmVyCisjZGVmaW5lIERfRVJST1JfQVRBCSAgMHgwMDA0MDAwMAkJICAJCS8vIEFUQSBlcnJvciBtZXNzYWdlcyAKKyNkZWZpbmUgRF9FUlJPUiAgICAgICAweDgwMDAwMDAwICAgICAgICAgIC8vIEVycm9yCisKKyNkZWZpbmUgRF9SRVNFUlZFRCAgICAweDdmZmZDODgwICAgICAgICAgIC8vIEJpdHMgbm90IHJlc2VydmVkIGFib3ZlCisKKy8vCisvLyBDdXJyZW50IERlYnVnIGxldmVsIG9mIHRoZSBzeXN0ZW0sIHZhbHVlIG9mIEVGSURlYnVnCisvLworLy8jZGVmaW5lIEVGSV9EQlVHX01BU0sgICAoRF9FUlJPUiB8IERfV0FSTiB8IERfTE9BRCB8IERfQkxLSU8gfCBEX0lOSVQpCisjZGVmaW5lIEVGSV9EQlVHX01BU0sgICAoRF9FUlJPUikKKworLy8KKy8vCisvLworCisjaWYgRUZJX0RFQlVHCisKKyAgICAjZGVmaW5lIEFTU0VSVChhKSAgICAgICAgICAgICAgIGlmKCEoYSkpICAgICAgIERCR0FTU0VSVChhKQorICAgICNkZWZpbmUgQVNTRVJUX0xPQ0tFRChsKSAgICAgICAgaWYoIShsKS0+TG9jaykgREJHQVNTRVJUKGwgbm90IGxvY2tlZCkKKyAgICAjZGVmaW5lIEFTU0VSVF9TVFJVQ1QocCx0KSAgICAgIERCR0FTU0VSVCh0IG5vdCBzdHJ1Y3R1cmUpLCBwCisKKyNlbHNlCisKKyAgICAjZGVmaW5lIEFTU0VSVChhKSAgICAgICAgICAgICAgIAorICAgICNkZWZpbmUgQVNTRVJUX0xPQ0tFRChsKSAgICAgICAgCisgICAgI2RlZmluZSBBU1NFUlRfU1RSVUNUKHAsdCkgICAgICAKKworI2VuZGlmCisKKy8vCisvLyBQcm90b3R5cGVzCisvLworCitJTlROCitEYmdBc3NlcnQgKAorICAgIENIQVI4ICAgKmZpbGUsCisgICAgSU5UTiAgICBsaW5lbm8sCisgICAgQ0hBUjggICAqc3RyaW5nCisgICAgKTsKKworSU5UTgorRGJnUHJpbnQgKAorICAgIElOVE4gICAgbWFzaywKKyAgICBDSEFSOCAgICpmb3JtYXQsCisgICAgLi4uCisgICAgKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWRlZi5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2YjE5MwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWRlZi5oCkBAIC0wLDAgKzEsMjExIEBACisjaWZuZGVmIF9FRklfREVGX0gKKyNkZWZpbmUgX0VGSV9ERUZfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlkZWYuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBkZWZpbml0aW9ucworCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKwordHlwZWRlZiBVSU5UMTYgICAgICAgICAgQ0hBUjE2OwordHlwZWRlZiBVSU5UOCAgICAgICAgICAgQ0hBUjg7Cit0eXBlZGVmIFVJTlQ4ICAgICAgICAgICBCT09MRUFOOworI2lmbmRlZiBDT05TVAorICAgI2RlZmluZSBDT05TVCBjb25zdAorI2VuZGlmCisjaWZuZGVmIFRSVUUKKyAgICAjZGVmaW5lIFRSVUUgICAgKChCT09MRUFOKSAxKQorICAgICNkZWZpbmUgRkFMU0UgICAoKEJPT0xFQU4pIDApCisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisgICAgI2RlZmluZSBOVUxMICAgICgoVk9JRCAqKSAwKQorI2VuZGlmCisKK3R5cGVkZWYgVUlOVE4gICAgICAgICAgIEVGSV9TVEFUVVM7Cit0eXBlZGVmIFVJTlQ2NCAgICAgICAgICBFRklfTEJBOwordHlwZWRlZiBVSU5UTiAgICAgICAgICAgRUZJX1RQTDsKK3R5cGVkZWYgVk9JRCAgICAgICAgICAgICpFRklfSEFORExFOwordHlwZWRlZiBWT0lEICAgICAgICAgICAgKkVGSV9FVkVOVDsKKworCisvLworLy8gUHJvdG90eXBlIGFyZ3VtZW50IGRlY29yYXRpb24gZm9yIEVGSSBwYXJhbWV0ZXJzIHRvIGluZGljYXRlCisvLyB0aGVpciBkaXJlY3Rpb24KKy8vCisvLyBJTiAtIGFyZ3VtZW50IGlzIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvbgorLy8gT1VUIC0gYXJndW1lbnQgKHBvaW50ZXIpIGlzIHJldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uCisvLyBPUFRJT05BTCAtIGFyZ3VtZW50IGlzIG9wdGlvbmFsCisvLworCisjaWZuZGVmIElOCisgICAgI2RlZmluZSBJTgorICAgICNkZWZpbmUgT1VUCisgICAgI2RlZmluZSBPUFRJT05BTAorI2VuZGlmCisKKworLy8KKy8vIEEgR1VJRAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAKKyAgICBVSU5UMzIgIERhdGExOworICAgIFVJTlQxNiAgRGF0YTI7CisgICAgVUlOVDE2ICBEYXRhMzsKKyAgICBVSU5UOCAgIERhdGE0WzhdOyAKK30gRUZJX0dVSUQ7CisKKworLy8KKy8vIFRpbWUKKy8vCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgCisgICAgVUlOVDE2ICAgICAgWWVhcjsgICAgICAgLy8gMTk5OCAtIDIwWFgKKyAgICBVSU5UOCAgICAgICBNb250aDsgICAgICAvLyAxIC0gMTIKKyAgICBVSU5UOCAgICAgICBEYXk7ICAgICAgICAvLyAxIC0gMzEKKyAgICBVSU5UOCAgICAgICBIb3VyOyAgICAgICAvLyAwIC0gMjMKKyAgICBVSU5UOCAgICAgICBNaW51dGU7ICAgICAvLyAwIC0gNTkKKyAgICBVSU5UOCAgICAgICBTZWNvbmQ7ICAgICAvLyAwIC0gNTkKKyAgICBVSU5UOCAgICAgICBQYWQxOworICAgIFVJTlQzMiAgICAgIE5hbm9zZWNvbmQ7IC8vIDAgLSA5OTksOTk5LDk5OQorICAgIElOVDE2ICAgICAgIFRpbWVab25lOyAgIC8vIC0xNDQwIHRvIDE0NDAgb3IgMjA0NworICAgIFVJTlQ4ICAgICAgIERheWxpZ2h0OworICAgIFVJTlQ4ICAgICAgIFBhZDI7Cit9IEVGSV9USU1FOworCisvLyBCaXQgZGVmaW5pdGlvbnMgZm9yIEVGSV9USU1FLkRheWxpZ2h0CisjZGVmaW5lIEVGSV9USU1FX0FESlVTVF9EQVlMSUdIVCAgICAweDAxCisjZGVmaW5lIEVGSV9USU1FX0lOX0RBWUxJR0hUICAgICAgICAweDAyCisKKy8vIFZhbHVlIGRlZmluaXRpb24gZm9yIEVGSV9USU1FLlRpbWVab25lCisjZGVmaW5lIEVGSV9VTlNQRUNJRklFRF9USU1FWk9ORSAgICAweDA3RkYKKworCisKKy8vCisvLyBOZXR3b3JraW5nCisvLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgQWRkcls0XTsKK30gRUZJX0lQdjRfQUREUkVTUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEFkZHJbMTZdOworfSBFRklfSVB2Nl9BRERSRVNTOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgQWRkclszMl07Cit9IEVGSV9NQUNfQUREUkVTUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiBSZWNlaXZlZFF1ZXVlVGltZW91dFZhbHVlOworICAgIFVJTlQzMiBUcmFuc21pdFF1ZXVlVGltZW91dFZhbHVlOworICAgIFVJTlQxNiBQcm90b2NvbFR5cGVGaWx0ZXI7CisgICAgQk9PTEVBTiBFbmFibGVVbmljYXN0UmVjZWl2ZTsKKyAgICBCT09MRUFOIEVuYWJsZU11bHRpY2FzdFJlY2VpdmU7CisgICAgQk9PTEVBTiBFbmFibGVCcm9hZGNhc3RSZWNlaXZlOworICAgIEJPT0xFQU4gRW5hYmxlUHJvbWlzY3VvdXNSZWNlaXZlOworICAgIEJPT0xFQU4gRmx1c2hRdWV1ZXNPblJlc2V0OworICAgIEJPT0xFQU4gRW5hYmxlUmVjZWl2ZVRpbWVzdGFtcHM7CisgICAgQk9PTEVBTiBEaXNhYmxlQmFja2dyb3VuZFBvbGxpbmc7Cit9IEVGSV9NQU5BR0VEX05FVFdPUktfQ09ORklHX0RBVEE7CisKKy8vCisvLyBNZW1vcnkKKy8vCisKK3R5cGVkZWYgVUlOVDY0ICAgICAgICAgIEVGSV9QSFlTSUNBTF9BRERSRVNTOwordHlwZWRlZiBVSU5UNjQgICAgICAgICAgRUZJX1ZJUlRVQUxfQUREUkVTUzsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBbGxvY2F0ZUFueVBhZ2VzLAorICAgIEFsbG9jYXRlTWF4QWRkcmVzcywKKyAgICBBbGxvY2F0ZUFkZHJlc3MsCisgICAgTWF4QWxsb2NhdGVUeXBlCit9IEVGSV9BTExPQ0FURV9UWVBFOworCisvL1ByZXNldmUgdGhlIGF0dHIgb24gYW55IHJhbmdlIHN1cHBsaWVkLgorLy9Db252ZW50aWFsTWVtb3J5IG11c3QgaGF2ZSBXQixTUixTVyB3aGVuIHN1cHBsaWVkLgorLy9XaGVuIGFsbG9jYXRpbmcgZnJvbSBDb252ZW50aWFsTWVtb3J5IGFsd2F5cyBtYWtlIGl0IFdCLFNSLFNXCisvL1doZW4gcmV0dXJuaW5nIHRvIENvbnZlbnRpYWxNZW1vcnkgYWx3YXlzIG1ha2UgaXQgV0IsU1IsU1cKKy8vV2hlbiBnZXR0aW5nIHRoZSBtZW1vcnkgbWFwLCBvciBvbiBSVCBmb3IgcnVudGltZSB0eXBlcworCisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpUmVzZXJ2ZWRNZW1vcnlUeXBlLAorICAgIEVmaUxvYWRlckNvZGUsCisgICAgRWZpTG9hZGVyRGF0YSwKKyAgICBFZmlCb290U2VydmljZXNDb2RlLAorICAgIEVmaUJvb3RTZXJ2aWNlc0RhdGEsCisgICAgRWZpUnVudGltZVNlcnZpY2VzQ29kZSwKKyAgICBFZmlSdW50aW1lU2VydmljZXNEYXRhLAorICAgIEVmaUNvbnZlbnRpb25hbE1lbW9yeSwKKyAgICBFZmlVbnVzYWJsZU1lbW9yeSwKKyAgICBFZmlBQ1BJUmVjbGFpbU1lbW9yeSwKKyAgICBFZmlBQ1BJTWVtb3J5TlZTLAorICAgIEVmaU1lbW9yeU1hcHBlZElPLAorICAgIEVmaU1lbW9yeU1hcHBlZElPUG9ydFNwYWNlLAorICAgIEVmaVBhbENvZGUsCisgICAgRWZpTWF4TWVtb3J5VHlwZQorfSBFRklfTUVNT1JZX1RZUEU7CisKKy8vIHBvc3NpYmxlIGNhY2hpbmcgdHlwZXMgZm9yIHRoZSBtZW1vcnkgcmFuZ2UKKyNkZWZpbmUgRUZJX01FTU9SWV9VQyAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCisjZGVmaW5lIEVGSV9NRU1PUllfV0MgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMgorI2RlZmluZSBFRklfTUVNT1JZX1dUICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDQKKyNkZWZpbmUgRUZJX01FTU9SWV9XQiAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDA4CisjZGVmaW5lIEVGSV9NRU1PUllfVUNFICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAxMCAgCisKKy8vIHBoeXNpY2FsIG1lbW9yeSBwcm90ZWN0aW9uIG9uIHJhbmdlIAorI2RlZmluZSBFRklfTUVNT1JZX1dQICAgICAgICAgICAweDAwMDAwMDAwMDAwMDEwMDAKKyNkZWZpbmUgRUZJX01FTU9SWV9SUCAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAyMDAwCisjZGVmaW5lIEVGSV9NRU1PUllfWFAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwNDAwMAorCisvLyByYW5nZSByZXF1aXJlcyBhIHJ1bnRpbWUgbWFwcGluZworI2RlZmluZSBFRklfTUVNT1JZX1JVTlRJTUUgICAgICAweDgwMDAwMDAwMDAwMDAwMDAKKworI2RlZmluZSBFRklfTUVNT1JZX0RFU0NSSVBUT1JfVkVSU0lPTiAgMQordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTsgICAgICAgICAgIC8vIEZpZWxkIHNpemUgaXMgMzIgYml0cyBmb2xsb3dlZCBieSAzMiBiaXQgcGFkCisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBQYWQ7CisgICAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICBQaHlzaWNhbFN0YXJ0OyAgLy8gRmllbGQgc2l6ZSBpcyA2NCBiaXRzCisgICAgRUZJX1ZJUlRVQUxfQUREUkVTUyAgICAgICAgICAgICBWaXJ0dWFsU3RhcnQ7ICAgLy8gRmllbGQgc2l6ZSBpcyA2NCBiaXRzCisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlBhZ2VzOyAgLy8gRmllbGQgc2l6ZSBpcyA2NCBiaXRzCisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU7ICAgICAgLy8gRmllbGQgc2l6ZSBpcyA2NCBiaXRzCit9IEVGSV9NRU1PUllfREVTQ1JJUFRPUjsKKworLy8KKy8vIEludGVybmF0aW9uYWwgTGFuZ3VhZ2UKKy8vCisKK3R5cGVkZWYgVUlOVDggICBJU09fNjM5XzI7CisjZGVmaW5lIElTT182MzlfMl9FTlRSWV9TSVpFICAgIDMKKworLy8KKy8vCisvLworCisjZGVmaW5lIEVGSV9QQUdFX1NJWkUgICA0MDk2CisjZGVmaW5lIEVGSV9QQUdFX01BU0sgICAweEZGRgorI2RlZmluZSBFRklfUEFHRV9TSElGVCAgMTIKKworI2RlZmluZSBFRklfU0laRV9UT19QQUdFUyhhKSAgXAorICAgICggKChhKSA+PiBFRklfUEFHRV9TSElGVCkgKyAoKGEpICYgRUZJX1BBR0VfTUFTSyA/IDEgOiAwKSApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvZWZpZGV2cC5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpZGV2cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjU3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlkZXZwLmgKQEAgLTAsMCArMSw0MDIgQEAKKyNpZm5kZWYgX0RFVlBBVEhfSAorI2RlZmluZSBfREVWUEFUSF9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGRldnBhdGguaAorCitBYnN0cmFjdDoKKworICAgIERlZmluZXMgZm9yIHBhcnNpbmcgdGhlIEVGSSBEZXZpY2UgUGF0aCBzdHJ1Y3R1cmVzCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIERldmljZSBQYXRoIHN0cnVjdHVyZXMgLSBTZWN0aW9uIEMKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9FRklfREVWSUNFX1BBVEggeworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViVHlwZTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGhbMl07Cit9IEVGSV9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBFRklfRFBfVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgICAweDdGCisjZGVmaW5lIEVGSV9EUF9UWVBFX1VOUEFDS0VEICAgICAgICAgICAgICAgIDB4ODAKKworLy8jZGVmaW5lIEVORF9ERVZJQ0VfUEFUSF9UWVBFICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgRU5EX0RFVklDRV9QQVRIX1RZUEUgICAgICAgICAgICAgICAgMHg3ZgorLy8jZGVmaW5lIEVORF9ERVZJQ0VfUEFUSF9UWVBFX1VOUEFDS0VEICAgICAgIDB4N2YKKworI2RlZmluZSBFTkRfRU5USVJFX0RFVklDRV9QQVRIX1NVQlRZUEUgICAgICAweGZmCisjZGVmaW5lIEVORF9JTlNUQU5DRV9ERVZJQ0VfUEFUSF9TVUJUWVBFICAgIDB4MDEKKyNkZWZpbmUgRU5EX0RFVklDRV9QQVRIX0xFTkdUSCAgICAgICAgICAgICAgKHNpemVvZihFRklfREVWSUNFX1BBVEgpKQorCisKKyNkZWZpbmUgRFBfSVNfRU5EX1RZUEUoYSkKKyNkZWZpbmUgRFBfSVNfRU5EX1NVQlRZUEUoYSkgICAgICAgICggKChhKS0+U3ViVHlwZSA9PSBFTkRfRU5USVJFX0RFVklDRV9QQVRIX1NVQlRZUEUgKQorCisjZGVmaW5lIERldmljZVBhdGhUeXBlKGEpICAgICAgICAgICAoICgoYSktPlR5cGUpICYgRUZJX0RQX1RZUEVfTUFTSyApCisjZGVmaW5lIERldmljZVBhdGhTdWJUeXBlKGEpICAgICAgICAoIChhKS0+U3ViVHlwZSApCisjZGVmaW5lIERldmljZVBhdGhOb2RlTGVuZ3RoKGEpICAgICAoICgoYSktPkxlbmd0aFswXSkgfCAoKGEpLT5MZW5ndGhbMV0gPDwgOCkgKQorI2RlZmluZSBOZXh0RGV2aWNlUGF0aE5vZGUoYSkgICAgICAgKCAoRUZJX0RFVklDRV9QQVRIICopICggKChVSU5UOCAqKSAoYSkpICsgRGV2aWNlUGF0aE5vZGVMZW5ndGgoYSkpKQorLy8jZGVmaW5lIElzRGV2aWNlUGF0aEVuZFR5cGUoYSkgICAgICAoIERldmljZVBhdGhUeXBlKGEpID09IEVORF9ERVZJQ0VfUEFUSF9UWVBFX1VOUEFDS0VEICkKKyNkZWZpbmUgSXNEZXZpY2VQYXRoRW5kVHlwZShhKSAgICAgICggRGV2aWNlUGF0aFR5cGUoYSkgPT0gRU5EX0RFVklDRV9QQVRIX1RZUEUgKQorI2RlZmluZSBJc0RldmljZVBhdGhFbmRTdWJUeXBlKGEpICAgKCAoYSktPlN1YlR5cGUgPT0gRU5EX0VOVElSRV9ERVZJQ0VfUEFUSF9TVUJUWVBFICkKKyNkZWZpbmUgSXNEZXZpY2VQYXRoRW5kKGEpICAgICAgICAgICggSXNEZXZpY2VQYXRoRW5kVHlwZShhKSAmJiBJc0RldmljZVBhdGhFbmRTdWJUeXBlKGEpICkKKyNkZWZpbmUgSXNEZXZpY2VQYXRoVW5wYWNrZWQoYSkgICAgICggKGEpLT5UeXBlICYgRUZJX0RQX1RZUEVfVU5QQUNLRUQgKQorCisKKyNkZWZpbmUgU2V0RGV2aWNlUGF0aE5vZGVMZW5ndGgoYSxsKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKGEpLT5MZW5ndGhbMF0gPSAoVUlOVDgpIChsKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoYSktPkxlbmd0aFsxXSA9IChVSU5UOCkgKChsKSA+PiA4KTsgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworI2RlZmluZSBTZXREZXZpY2VQYXRoRW5kTm9kZShhKSAgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoYSktPlR5cGUgPSBFTkRfREVWSUNFX1BBVEhfVFlQRTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIChhKS0+U3ViVHlwZSA9IEVORF9FTlRJUkVfREVWSUNFX1BBVEhfU1VCVFlQRTsgICAgIFwKKyAgICAgICAgICAgIChhKS0+TGVuZ3RoWzBdID0gc2l6ZW9mKEVGSV9ERVZJQ0VfUEFUSCk7ICAgXAorICAgICAgICAgICAgKGEpLT5MZW5ndGhbMV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKworCisvKgorICoKKyAqLworI2RlZmluZSBIQVJEV0FSRV9ERVZJQ0VfUEFUSCAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBIV19QQ0lfRFAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKK3R5cGVkZWYgc3RydWN0IF9QQ0lfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2U7Cit9IFBDSV9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBIV19QQ0NBUkRfRFAgICAgICAgICAgICAgICAgICAgIDB4MDIKK3R5cGVkZWYgc3RydWN0IF9QQ0NBUkRfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXROdW1iZXI7Cit9IFBDQ0FSRF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBIV19NRU1NQVBfRFAgICAgICAgICAgICAgICAgICAgIDB4MDMKK3R5cGVkZWYgc3RydWN0IF9NRU1NQVBfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlUeXBlOworICAgICAgICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgIFN0YXJ0aW5nQWRkcmVzczsKKyAgICAgICAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICBFbmRpbmdBZGRyZXNzOworfSBNRU1NQVBfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgSFdfVkVORE9SX0RQICAgICAgICAgICAgICAgICAgICAweDA0Cit0eXBlZGVmIHN0cnVjdCBfVkVORE9SX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgR3VpZDsKK30gVkVORE9SX0RFVklDRV9QQVRIOworCisjZGVmaW5lIFVOS05PV05fREVWSUNFX0dVSUQgXAorICAgIHsgMHhjZjMxZmFjNSwgMHhjMjRlLCAweDExZDIsICB7MHg4NSwgMHhmMywgMHgwLCAweGEwLCAweGM5LCAweDNlLCAweGM5LCAweDNifSAgfQorCit0eXBlZGVmIHN0cnVjdCBfVUtOT1dOX0RFVklDRV9WRU5ET1JfRFAgeworICAgIFZFTkRPUl9ERVZJQ0VfUEFUSCAgICAgIERldmljZVBhdGg7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgTGVnYWN5RHJpdmVMZXR0ZXI7Cit9IFVOS05PV05fREVWSUNFX1ZFTkRPUl9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBIV19DT05UUk9MTEVSX0RQICAgICAgICAgICAgMHgwNQordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xMRVJfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICBDb250cm9sbGVyOworfSBDT05UUk9MTEVSX0RFVklDRV9QQVRIOworCisvKgorICoKKyAqLworI2RlZmluZSBBQ1BJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAweDAyCisKKyNkZWZpbmUgQUNQSV9EUCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCit0eXBlZGVmIHN0cnVjdCBfQUNQSV9ISURfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBISUQ7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEOworfSBBQ1BJX0hJRF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBFWFBBTkRFRF9BQ1BJX0RQCQkweDAyCit0eXBlZGVmIHN0cnVjdCBfRVhQQU5ERURfQUNQSV9ISURfREVWSUNFX1BBVEggeworCUVGSV9ERVZJQ0VfUEFUSAkJCUhlYWRlcjsKKwlVSU5UMzIJCQkJSElEOworCVVJTlQzMgkJCQlVSUQ7CisJVUlOVDMyCQkJCUNJRDsKKwlVSU5UOAkJCQlIaWRTdHJbMV07Cit9IEVYUEFOREVEX0FDUElfSElEX0RFVklDRV9QQVRIOworCisvLworLy8gRUlTQSBJRCBNYWNybworLy8gRUlTQSBJRCBEZWZpbml0aW9uIDMyLWJpdHMKKy8vICBiaXRzWzE1OjBdIC0gdGhyZWUgY2hhcmFjdGVyIGNvbXByZXNzZWQgQVNDSUkgRUlTQSBJRC4KKy8vICBiaXRzWzMxOjE2XSAtIGJpbmFyeSBudW1iZXIKKy8vICAgQ29tcHJlc3NlZCBBU0NJSSBpcyA1IGJpdHMgcGVyIGNoYXJhY3RlciAwYjAwMDAxID0gJ0EnIDBiMTEwMTAgPSAnWicKKy8vCisjZGVmaW5lIFBOUF9FSVNBX0lEX0NPTlNUICAgICAgIDB4NDFkMCAgICAKKyNkZWZpbmUgRUlTQV9JRChfTmFtZSwgX051bSkgICAgKChVSU5UMzIpICgoX05hbWUpIHwgKF9OdW0pIDw8IDE2KSkgICAKKyNkZWZpbmUgRUlTQV9QTlBfSUQoX1BOUElkKSAgICAgKEVJU0FfSUQoUE5QX0VJU0FfSURfQ09OU1QsIChfUE5QSWQpKSkKKworI2RlZmluZSBQTlBfRUlTQV9JRF9NQVNLICAgICAgICAweGZmZmYKKyNkZWZpbmUgRUlTQV9JRF9UT19OVU0oX0lkKSAgICAgKChfSWQpID4+IDE2KQorLyoKKyAqCisgKi8KKyNkZWZpbmUgTUVTU0FHSU5HX0RFVklDRV9QQVRIICAgICAgICAgICAweDAzIAorCisjZGVmaW5lIE1TR19BVEFQSV9EUCAgICAgICAgICAgICAgICAgICAgMHgwMQordHlwZWRlZiBzdHJ1Y3QgX0FUQVBJX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeVNlY29uZGFyeTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTbGF2ZU1hc3RlcjsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBMdW47Cit9IEFUQVBJX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19TQ1NJX0RQICAgICAgICAgICAgICAgICAgICAgMHgwMgordHlwZWRlZiBzdHJ1Y3QgX1NDU0lfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBQdW47CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTHVuOyAKK30gU0NTSV9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfRklCUkVDSEFOTkVMX0RQICAgICAgICAgICAgIDB4MDMKK3R5cGVkZWYgc3RydWN0IF9GSUJSRUNIQU5ORUxfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBXV047CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgTHVuOworfSBGSUJSRUNIQU5ORUxfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHXzEzOTRfRFAgICAgICAgICAgICAgICAgICAgICAweDA0Cit0eXBlZGVmIHN0cnVjdCBfRjEzOTRfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBHdWlkOworfSBGMTM5NF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfVVNCX0RQICAgICAgICAgICAgICAgICAgICAgIDB4MDUKK3R5cGVkZWYgc3RydWN0IF9VU0JfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0OworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50OworfSBVU0JfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX1VTQl9DTEFTU19EUCAgICAgICAgICAgICAgICAweDBGCit0eXBlZGVmIHN0cnVjdCBfVVNCX0NMQVNTX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgVmVuZG9ySWQ7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdElkOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUNsYXNzOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN1YmNsYXNzOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVByb3RvY29sOworfSBVU0JfQ0xBU1NfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0kyT19EUCAgICAgICAgICAgICAgICAgICAgICAweDA2Cit0eXBlZGVmIHN0cnVjdCBfSTJPX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgVGlkOworfSBJMk9fREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX01BQ19BRERSX0RQICAgICAgICAgICAgICAgICAweDBiCit0eXBlZGVmIHN0cnVjdCBfTUFDX0FERFJfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICBNYWNBZGRyZXNzOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIElmVHlwZTsKK30gTUFDX0FERFJfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0lQdjRfRFAgICAgICAgICAgICAgICAgICAgICAweDBjCit0eXBlZGVmIHN0cnVjdCBfSVB2NF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBFRklfSVB2NF9BRERSRVNTICAgICAgICAgICAgICAgIExvY2FsSXBBZGRyZXNzOworICAgICAgICBFRklfSVB2NF9BRERSRVNTICAgICAgICAgICAgICAgIFJlbW90ZUlwQWRkcmVzczsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFBvcnQ7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlUG9ydDsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbDsKKyAgICAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWNJcEFkZHJlc3M7Cit9IElQdjRfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0lQdjZfRFAgICAgICAgICAgICAgICAgICAgICAweDBkCit0eXBlZGVmIHN0cnVjdCBfSVB2Nl9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBFRklfSVB2Nl9BRERSRVNTICAgICAgICAgICAgICAgIExvY2FsSXBBZGRyZXNzOworICAgICAgICBFRklfSVB2Nl9BRERSRVNTICAgICAgICAgICAgICAgIFJlbW90ZUlwQWRkcmVzczsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFBvcnQ7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlUG9ydDsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbDsKKyAgICAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWNJcEFkZHJlc3M7Cit9IElQdjZfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0lORklOSUJBTkRfRFAgICAgICAgICAgICAgICAweDA5Cit0eXBlZGVmIHN0cnVjdCBfSU5GSU5JQkFORF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVHdWlkOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIElvY0d1aWQ7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSWQ7Cit9IElORklOSUJBTkRfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX1VBUlRfRFAgICAgICAgICAgICAgICAgICAgICAweDBlCit0eXBlZGVmIHN0cnVjdCBfVUFSVF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWRSYXRlOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCaXRzOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcml0eTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wQml0czsKK30gVUFSVF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfVkVORE9SX0RQICAgICAgICAgICAgICAgICAgIDB4MEEKKy8qIFVzZSBWRU5ET1JfREVWSUNFX1BBVEggc3RydWN0ICovCisKKyNkZWZpbmUgREVWSUNFX1BBVEhfTUVTU0FHSU5HX1BDX0FOU0kgXAorICAgIHsgMHhlMGMxNDc1MywgMHhmOWJlLCAweDExZDIsICB7MHg5YSwgMHgwYywgMHgwMCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZH0gIH0KKworI2RlZmluZSBERVZJQ0VfUEFUSF9NRVNTQUdJTkdfVlRfMTAwIFwKKyAgICB7IDB4ZGZhNjYwNjUsIDB4YjQxOSwgMHgxMWQzLCAgezB4OWEsIDB4MmQsIDB4MDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9ICB9CisKKworCisjZGVmaW5lIE1FRElBX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgMHgwNAorCisjZGVmaW5lIE1FRElBX0hBUkREUklWRV9EUCAgICAgICAgICAgICAgMHgwMQordHlwZWRlZiBzdHJ1Y3QgX0hBUkREUklWRV9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbk51bWJlcjsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25TdGFydDsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25TaXplOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZVsxNl07CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJSVHlwZTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVUeXBlOworfSBIQVJERFJJVkVfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTUJSX1RZUEVfUENBVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBNQlJfVFlQRV9FRklfUEFSVElUSU9OX1RBQkxFX0hFQURFUiAweDAyCisKKyNkZWZpbmUgU0lHTkFUVVJFX1RZUEVfTUJSICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTSUdOQVRVUkVfVFlQRV9HVUlEICAgICAgICAgICAgICAgICAweDAyCisKKyNkZWZpbmUgTUVESUFfQ0RST01fRFAgICAgICAgICAgICAgICAgICAweDAyCit0eXBlZGVmIHN0cnVjdCBfQ0RST01fREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBCb290RW50cnk7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RhcnQ7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU2l6ZTsKK30gQ0RST01fREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTUVESUFfVkVORE9SX0RQICAgICAgICAgICAgICAgICAweDAzCisvKiBVc2UgVkVORE9SX0RFVklDRV9QQVRIIHN0cnVjdCAqLworCisjZGVmaW5lIE1FRElBX0ZJTEVQQVRIX0RQICAgICAgICAgICAgICAgMHgwNAordHlwZWRlZiBzdHJ1Y3QgX0ZJTEVQQVRIX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aE5hbWVbMV07Cit9IEZJTEVQQVRIX0RFVklDRV9QQVRIOworCisjZGVmaW5lIFNJWkVfT0ZfRklMRVBBVEhfREVWSUNFX1BBVEggRUZJX0ZJRUxEX09GRlNFVChGSUxFUEFUSF9ERVZJQ0VfUEFUSCxQYXRoTmFtZSkKKworI2RlZmluZSBNRURJQV9QUk9UT0NPTF9EUCAgICAgICAgICAgICAgIDB4MDUKK3R5cGVkZWYgc3RydWN0IF9NRURJQV9QUk9UT0NPTF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sOworfSBNRURJQV9QUk9UT0NPTF9ERVZJQ0VfUEFUSDsKKworCisjZGVmaW5lIEJCU19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBCQlNfQkJTX0RQICAgICAgICAgICAgICAgICAgICAgIDB4MDEKK3R5cGVkZWYgc3RydWN0IF9CQlNfQkJTX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVHlwZTsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNGbGFnOworICAgICAgICBDSEFSOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1sxXTsKK30gQkJTX0JCU19ERVZJQ0VfUEFUSDsKKworLyogRGV2aWNlVHlwZSBkZWZpbml0aW9ucyAtIGZyb20gQkJTIHNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgQkJTX1RZUEVfRkxPUFBZICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEJCU19UWVBFX0hBUkREUklWRSAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBCQlNfVFlQRV9DRFJPTSAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgQkJTX1RZUEVfUENNQ0lBICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEJCU19UWVBFX1VTQiAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBCQlNfVFlQRV9FTUJFRERFRF9ORVRXT1JLICAgICAgIDB4MDYKKyNkZWZpbmUgQkJTX1RZUEVfREVWICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEJCU19UWVBFX1VOS05PV04gICAgICAgICAgICAgICAgMHhGRgorCit0eXBlZGVmIHVuaW9uIHsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgRGV2UGF0aDsKKyAgICBQQ0lfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgUGNpOworICAgIFBDQ0FSRF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICBQY0NhcmQ7CisgICAgTUVNTUFQX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgIE1lbU1hcDsKKyAgICBWRU5ET1JfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgVmVuZG9yOworICAgIFVOS05PV05fREVWSUNFX1ZFTkRPUl9ERVZJQ0VfUEFUSCAgICBVbmtub3duVmVuZG9yOyAgIAorICAgIENPTlRST0xMRVJfREVWSUNFX1BBVEggICAgICAgICAgICAgICBDb250cm9sbGVyOworICAgIEFDUElfSElEX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBBY3BpOworCisgICAgQVRBUElfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgIEF0YXBpOworICAgIFNDU0lfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICBTY3NpOworICAgIEZJQlJFQ0hBTk5FTF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICBGaWJyZUNoYW5uZWw7CisKKyAgICBGMTM5NF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgRjEzOTQ7CisgICAgVVNCX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgIFVzYjsKKyAgICBVU0JfQ0xBU1NfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgVXNiQ2xhc3M7CisgICAgSTJPX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgIEkyTzsKKyAgICBNQUNfQUREUl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgTWFjQWRkcjsKKyAgICBJUHY0X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgSXB2NDsKKyAgICBJUHY2X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgSXB2NjsKKyAgICBJTkZJTklCQU5EX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgSW5maW5pQmFuZDsKKyAgICBVQVJUX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgVWFydDsKKworICAgIEhBUkREUklWRV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICBIYXJkRHJpdmU7CisgICAgQ0RST01fREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgIENEOworCisgICAgRklMRVBBVEhfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEZpbGVQYXRoOworICAgIE1FRElBX1BST1RPQ09MX0RFVklDRV9QQVRIICAgICAgICAgICBNZWRpYVByb3RvY29sOworCisgICAgQkJTX0JCU19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgIEJiczsKKworfSBFRklfREVWX1BBVEg7CisKK3R5cGVkZWYgdW5pb24geworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICAqRGV2UGF0aDsKKyAgICBQQ0lfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKlBjaTsKKyAgICBQQ0NBUkRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgKlBjQ2FyZDsKKyAgICBNRU1NQVBfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgKk1lbU1hcDsKKyAgICBWRU5ET1JfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgKlZlbmRvcjsKKyAgICBVTktOT1dOX0RFVklDRV9WRU5ET1JfREVWSUNFX1BBVEggICAgKlVua25vd25WZW5kb3I7ICAgCisgICAgQ09OVFJPTExFUl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICpDb250cm9sbGVyOworICAgIEFDUElfSElEX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAqQWNwaTsKKworICAgIEFUQVBJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAqQXRhcGk7CisgICAgU0NTSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICpTY3NpOworICAgIEZJQlJFQ0hBTk5FTF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAqRmlicmVDaGFubmVsOworCisgICAgRjEzOTRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICpGMTM5NDsKKyAgICBVU0JfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKlVzYjsKKyAgICBVU0JfQ0xBU1NfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgKlVzYkNsYXNzOworICAgIEkyT19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICAqSTJPOworICAgIE1BQ19BRERSX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAqTWFjQWRkcjsKKyAgICBJUHY0X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgKklwdjQ7CisgICAgSVB2Nl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICpJcHY2OworICAgIElORklOSUJBTkRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAqSW5maW5pQmFuZDsKKyAgICBVQVJUX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgKlVhcnQ7CisKKyAgICBIQVJERFJJVkVfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgKkhhcmREcml2ZTsKKworICAgIEZJTEVQQVRIX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAqRmlsZVBhdGg7CisgICAgTUVESUFfUFJPVE9DT0xfREVWSUNFX1BBVEggICAgICAgICAgICpNZWRpYVByb3RvY29sOworCisgICAgQ0RST01fREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICpDRDsKKyAgICBCQlNfQkJTX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgKkJiczsKKworfSBFRklfREVWX1BBVEhfUFRSOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvZWZpZXJyLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmllcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQzZDNjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpZXJyLmgKQEAgLTAsMCArMSw2NyBAQAorI2lmbmRlZiBfRUZJX0VSUl9ICisjZGVmaW5lIF9FRklfRVJSX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpZXJyLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgZXJyb3IgY29kZXMKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKworI2RlZmluZSBFRklXQVJOKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhKQorI2RlZmluZSBFRklfRVJST1IoYSkgICAgICAgICAgICAgICgoKElOVE4pIGEpIDwgMCkKKworCisjZGVmaW5lIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEVGSV9MT0FEX0VSUk9SICAgICAgICAgICAgICAgICAgRUZJRVJSKDEpCisjZGVmaW5lIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgICAgRUZJRVJSKDIpCisjZGVmaW5lIEVGSV9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgRUZJRVJSKDMpCisjZGVmaW5lIEVGSV9CQURfQlVGRkVSX1NJWkUgICAgICAgICAgICAgRUZJRVJSKDQpCisjZGVmaW5lIEVGSV9CVUZGRVJfVE9PX1NNQUxMICAgICAgICAgICAgRUZJRVJSKDUpCisjZGVmaW5lIEVGSV9OT1RfUkVBRFkgICAgICAgICAgICAgICAgICAgRUZJRVJSKDYpCisjZGVmaW5lIEVGSV9ERVZJQ0VfRVJST1IgICAgICAgICAgICAgICAgRUZJRVJSKDcpCisjZGVmaW5lIEVGSV9XUklURV9QUk9URUNURUQgICAgICAgICAgICAgRUZJRVJSKDgpCisjZGVmaW5lIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgICAgICAgICAgRUZJRVJSKDkpCisjZGVmaW5lIEVGSV9WT0xVTUVfQ09SUlVQVEVEICAgICAgICAgICAgRUZJRVJSKDEwKQorI2RlZmluZSBFRklfVk9MVU1FX0ZVTEwgICAgICAgICAgICAgICAgIEVGSUVSUigxMSkKKyNkZWZpbmUgRUZJX05PX01FRElBICAgICAgICAgICAgICAgICAgICBFRklFUlIoMTIpCisjZGVmaW5lIEVGSV9NRURJQV9DSEFOR0VEICAgICAgICAgICAgICAgRUZJRVJSKDEzKQorI2RlZmluZSBFRklfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgIEVGSUVSUigxNCkKKyNkZWZpbmUgRUZJX0FDQ0VTU19ERU5JRUQgICAgICAgICAgICAgICBFRklFUlIoMTUpCisjZGVmaW5lIEVGSV9OT19SRVNQT05TRSAgICAgICAgICAgICAgICAgRUZJRVJSKDE2KQorI2RlZmluZSBFRklfTk9fTUFQUElORyAgICAgICAgICAgICAgICAgIEVGSUVSUigxNykKKyNkZWZpbmUgRUZJX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICBFRklFUlIoMTgpCisjZGVmaW5lIEVGSV9OT1RfU1RBUlRFRCAgICAgICAgICAgICAgICAgRUZJRVJSKDE5KQorI2RlZmluZSBFRklfQUxSRUFEWV9TVEFSVEVEICAgICAgICAgICAgIEVGSUVSUigyMCkKKyNkZWZpbmUgRUZJX0FCT1JURUQgICAgICAgICAgICAgICAgICAgICBFRklFUlIoMjEpCisjZGVmaW5lIEVGSV9JQ01QX0VSUk9SICAgICAgICAgICAgICAgICAgRUZJRVJSKDIyKQorI2RlZmluZSBFRklfVEZUUF9FUlJPUiAgICAgICAgICAgICAgICAgIEVGSUVSUigyMykKKyNkZWZpbmUgRUZJX1BST1RPQ09MX0VSUk9SICAgICAgICAgICAgICBFRklFUlIoMjQpCisjZGVmaW5lIEVGSV9JTkNPTVBBVElCTEVfVkVSU0lPTiAgICAgICAgRUZJRVJSKDI1KQorI2RlZmluZSBFRklfU0VDVVJJVFlfVklPTEFUSU9OICAgICAgICAgIEVGSUVSUigyNikKKyNkZWZpbmUgRUZJX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICBFRklFUlIoMjcpCisjZGVmaW5lIEVGSV9FTkRfT0ZfTUVESUEgICAgICAgICAgICAgICAgRUZJRVJSKDI4KQorI2RlZmluZSBFRklfRU5EX09GX0ZJTEUgICAgICAgICAgICAgICAgIEVGSUVSUigzMSkKKyNkZWZpbmUgRUZJX0lOVkFMSURfTEFOR1VBR0UgICAgICAgICAgICBFRklFUlIoMzIpCisjZGVmaW5lIEVGSV9DT01QUk9NSVNFRF9EQVRBICAgICAgICAgICAgRUZJRVJSKDMzKQorCisjZGVmaW5lIEVGSV9XQVJOX1VOS09XTl9HTFlQSCAgICAgICAgICAgRUZJV0FSTigxKQorI2RlZmluZSBFRklfV0FSTl9ERUxFVEVfRkFJTFVSRSAgICAgICAgIEVGSVdBUk4oMikKKyNkZWZpbmUgRUZJX1dBUk5fV1JJVEVfRkFJTFVSRSAgICAgICAgICBFRklXQVJOKDMpCisjZGVmaW5lIEVGSV9XQVJOX0JVRkZFUl9UT09fU01BTEwgICAgICAgRUZJV0FSTig0KQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvZWZpZnMuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1OTVkMQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWZzLmgKQEAgLTAsMCArMSwxMTYgQEAKKyNpZm5kZWYgX0VGSV9GU19ICisjZGVmaW5lIF9FRklfRlNfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlmcy5oCisKK0Fic3RyYWN0OgorCisgICAgRUZJIEZpbGUgU3lzdGVtIHN0cnVjdHVyZXMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisKKy8vCisvLyBFRkkgUGFydGl0aW9uIGhlYWRlciAobm9ybWFseSBzdGFydHMgaW4gTEJBIDEpCisvLworCisjZGVmaW5lIEVGSV9QQVJUSVRJT05fU0lHTkFUVVJFICAgICAgICAgMHg1MDUzNTk1MzIwNDk0MjQ5CisjZGVmaW5lIEVGSV9QQVJUSVRJT05fUkVWSVNJT04gICAgICAgICAgMHgwMDAxMDAwMQorI2RlZmluZSBNSU5fRUZJX1BBUlRJVElPTl9CTE9DS19TSVpFICAgIDUxMgorI2RlZmluZSBFRklfUEFSVElUSU9OX0xCQSAgICAgICAgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9QQVJUSVRJT05fSEVBREVSIHsKKyAgICBFRklfVEFCTEVfSEVBREVSICAgIEhkcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIERpcmVjdG9yeUFsbG9jYXRpb25OdW1iZXI7CisgICAgVUlOVDMyICAgICAgICAgICAgICBCbG9ja1NpemU7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBGaXJzdFVzYWJsZUxiYTsKKyAgICBFRklfTEJBICAgICAgICAgICAgIExhc3RVc2FibGVMYmE7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBVbnVzYWJsZVNwYWNlOworICAgIEVGSV9MQkEgICAgICAgICAgICAgRnJlZVNwYWNlOworICAgIEVGSV9MQkEgICAgICAgICAgICAgUm9vdEZpbGU7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBTZWN1dGlyeUZpbGU7Cit9IEVGSV9QQVJUSVRJT05fSEVBREVSOworCisKKy8vCisvLyBGaWxlIGhlYWRlcgorLy8KKworI2RlZmluZSBFRklfRklMRV9IRUFERVJfU0lHTkFUVVJFICAgMHg0NTRjNDk0NjIwNDk0MjQ5CisjZGVmaW5lIEVGSV9GSUxFX0hFQURFUl9SRVZJU0lPTiAgICAweDAwMDEwMDAwCisjZGVmaW5lIEVGSV9GSUxFX1NUUklOR19TSVpFICAgICAgICAyNjAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9GSUxFX0hFQURFUiB7CisgICAgRUZJX1RBQkxFX0hFQURFUiAgICBIZHI7CisgICAgVUlOVDMyICAgICAgICAgICAgICBDbGFzczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIExCQUxPZmZzZXQ7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBQYXJlbnQ7CisgICAgVUlOVDY0ICAgICAgICAgICAgICBGaWxlU2l6ZTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgIEZpbGVBdHRyaWJ1dGVzOworICAgIEVGSV9USU1FICAgICAgICAgICAgRmlsZUNyZWF0ZVRpbWU7CisgICAgRUZJX1RJTUUgICAgICAgICAgICBGaWxlTW9kaWZpY2F0aW9uVGltZTsKKyAgICBFRklfR1VJRCAgICAgICAgICAgIFZlbmRvckd1aWQ7CisgICAgQ0hBUjE2ICAgICAgICAgICAgICBGaWxlU3RyaW5nW0VGSV9GSUxFX1NUUklOR19TSVpFXTsKK30gRUZJX0ZJTEVfSEVBREVSOworCisKKy8vCisvLyBSZXR1cm4gdGhlIGZpbGUncyBmaXJzdCBMQkFMIHdoaWNoIGlzIGluIHRoZSBzYW1lCisvLyBsb2dpY2FsIGJsb2NrIGFzIHRoZSBmaWxlIGhlYWRlcgorLy8KKworI2RlZmluZSBFRklfRklMRV9MQkFMKGEpICAgICgoRUZJX0xCQUwgKikgKCgoQ0hBUjggKikgKGEpKSArIChhKS0+TEJBTE9mZnNldCkpCisKKyNkZWZpbmUgRUZJX0ZJTEVfQ0xBU1NfRlJFRV9TUEFDRSAgIDEKKyNkZWZpbmUgRUZJX0ZJTEVfQ0xBU1NfRU1QVFkgICAgICAgIDIKKyNkZWZpbmUgRUZJX0ZJTEVfQ0xBU1NfTk9STUFMICAgICAgIDMKKworCisvLworLy8gTG9naWNhbCBCbG9jayBBZGRyZXNzIExpc3QgLSB0aGUgZnVuZGVtZW50YWwgYmxvY2sKKy8vIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQorLy8KKworI2RlZmluZSBFRklfTEJBTF9TSUdOQVRVUkUgICAgICAweDRjNDE0MjRjMjA0OTQyNDkKKyNkZWZpbmUgRUZJX0xCQUxfUkVWSVNJT04gICAgICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0xCQUwgeworICAgIEVGSV9UQUJMRV9IRUFERVIgICAgSGRyOworICAgIFVJTlQzMiAgICAgICAgICAgICAgQ2xhc3M7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBQYXJlbnQ7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBOZXh0OworICAgIFVJTlQzMiAgICAgICAgICAgICAgQXJyYXlTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICAgQXJyYXlDb3VudDsKK30gRUZJX0xCQUw7CisKKy8vIEFycmF5IHNpemUgCisjZGVmaW5lIEVGSV9MQkFMX0FSUkFZX1NJWkUobGJhbCxvZmZzLGJsa3MpICBcCisgICAgICAgICgoKGJsa3MpIC0gKG9mZnMpIC0gKGxiYWwpLT5IZHIuSGVhZGVyU2l6ZSkgLyBzaXplb2YoRUZJX1JMKSkKKworLy8KKy8vIExvZ2ljYWwgQmxvY2sgcnVuLWxlbmd0aAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9MQkEgICAgIFN0YXJ0OworICAgIFVJTlQ2NCAgICAgIExlbmd0aDsKK30gRUZJX1JMOworCisvLworLy8gUmV0dXJuIHRoZSBydW4tbGVuZ3RoIHN0cnVjdHVyZSBmcm9tIGFuIExCQUwgaGVhZGVyCisvLworCisjZGVmaW5lIEVGSV9MQkFMX1JMKGEpICAgICAgKChFRklfUkwqKSAoKChDSEFSOCAqKSAoYSkpICsgKGEpLT5IZHIuSGVhZGVyU2l6ZSkpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9lZmlncHQuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWdwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjk0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlncHQuaApAQCAtMCwwICsxLDY4IEBACisjaWZuZGVmIF9FRklfR1BUX0gKKyNkZWZpbmUgX0VGSV9HUFRfSAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgRWZpR3B0LmgKKyAgICAKK0Fic3RyYWN0OgorICAgIEluY2x1ZGUgZmlsZSBmb3IgRUZJIHBhcnRpdGlvbmluZyBzY2hlbWUKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjZGVmaW5lIFBSSU1BUllfUEFSVF9IRUFERVJfTEJBICAgICAgICAgMQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RBQkxFX0hFQURFUiAgICBIZWFkZXI7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBNeUxCQTsKKyAgICBFRklfTEJBICAgICAgICAgICAgIEFsdGVybmF0ZUxCQTsKKyAgICBFRklfTEJBICAgICAgICAgICAgIEZpcnN0VXNhYmxlTEJBOworICAgIEVGSV9MQkEgICAgICAgICAgICAgTGFzdFVzYWJsZUxCQTsKKyAgICBFRklfR1VJRCAgICAgICAgICAgIERpc2tHVUlEOworICAgIEVGSV9MQkEgICAgICAgICAgICAgUGFydGl0aW9uRW50cnlMQkE7CisgICAgVUlOVDMyICAgICAgICAgICAgICBOdW1iZXJPZlBhcnRpdGlvbkVudHJpZXM7CisgICAgVUlOVDMyICAgICAgICAgICAgICBTaXplT2ZQYXJ0aXRpb25FbnRyeTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIFBhcnRpdGlvbkVudHJ5QXJyYXlDUkMzMjsKK30gRUZJX1BBUlRJVElPTl9UQUJMRV9IRUFERVI7CisKKyNkZWZpbmUgRUZJX1BUQUJfSEVBREVSX0lEICAiRUZJIFBBUlQiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfR1VJRCAgICBQYXJ0aXRpb25UeXBlR1VJRDsKKyAgICBFRklfR1VJRCAgICBVbmlxdWVQYXJ0aXRpb25HVUlEOworICAgIEVGSV9MQkEgICAgIFN0YXJ0aW5nTEJBOworICAgIEVGSV9MQkEgICAgIEVuZGluZ0xCQTsKKyAgICBVSU5UNjQgICAgICBBdHRyaWJ1dGVzOworICAgIENIQVIxNiAgICAgIFBhcnRpdGlvbk5hbWVbMzZdOworfSBFRklfUEFSVElUSU9OX0VOVFJZOworCisvLworLy8gRUZJIFBhcnRpdGlvbiBBdHRyaWJ1dGVzCisvLworI2RlZmluZSBFRklfUEFSVF9VU0VEX0JZX0VGSSAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMQorI2RlZmluZSBFRklfUEFSVF9SRVFVSVJFRF9UT19GVU5DVElPTiAgIDB4MDAwMDAwMDAwMDAwMDAwMgorI2RlZmluZSBFRklfUEFSVF9VU0VEX0JZX09TICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwNAorI2RlZmluZSBFRklfUEFSVF9SRVFVSVJFRF9CWV9PUyAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwOAorI2RlZmluZSBFRklfUEFSVF9CQUNLVVBfUkVRVUlSRUQgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAxMAorI2RlZmluZSBFRklfUEFSVF9VU0VSX0RBVEEgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAyMAorI2RlZmluZSBFRklfUEFSVF9DUklUSUNBTF9VU0VSX0RBVEEgICAgIDB4MDAwMDAwMDAwMDAwMDA0MAorI2RlZmluZSBFRklfUEFSVF9SRURVTkRBTlRfUEFSVElUSU9OICAgIDB4MDAwMDAwMDAwMDAwMDA4MAorCisjZGVmaW5lIEVGSV9QQVJUX1RZUEVfVU5VU0VEX0dVSUQgICBcCisgICAgeyAweDAwMDAwMDAwLCAweDAwMDAsIDB4MDAwMCwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9IH0KKyAgICAKKyNkZWZpbmUgRUZJX1BBUlRfVFlQRV9FRklfU1lTVEVNX1BBUlRfR1VJRCAgXAorICAgIHsgMHhjMTJhNzMyOCwgMHhmODFmLCAweDExZDIsIHsweGJhLCAweDRiLCAweDAwLCAweGEwLCAweGM5LCAweDNlLCAweGM5LCAweDNifSB9CisKKyNkZWZpbmUgRUZJX1BBUlRfVFlQRV9MRUdBQ1lfTUJSX0dVSUQgICBcCisgICAgeyAweDAyNGRlZTQxLCAweDMzZTcsIDB4MTFkMywgezB4OWQsIDB4NjksIDB4MDAsIDB4MDgsIDB4YzcsIDB4ODEsIDB4ZjMsIDB4OWZ9IH0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWlwLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTUwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlpcC5oCkBAIC0wLDAgKzEsNDU5IEBACisjaWZuZGVmIF9FRklfSVBfSAorI2RlZmluZSBfRUZJX0lQX0gKKworLyorKworQ29weXJpZ2h0IChjKSAyMDEzICBJbnRlbCBDb3Jwb3JhdGlvbgorCistLSovCisKKyNkZWZpbmUgRUZJX0lQNF9TRVJWSUNFX0JJTkRJTkdfUFJPVE9DT0wgXAorICAgezB4YzUxNzExZTcsMHhiNGJmLDB4NDA0YSx7MHhiZiwweGI4LDB4MGEsMHgwNCwgMHg4ZSwweGYxLDB4ZmYsMHhlNH19CisKKyNkZWZpbmUgRUZJX0lQNF9QUk9UT0NPTCBcCisgICAgezB4NDFkOTRjZDIsMHgzNWI2LDB4NDU1YSx7MHg4MiwweDU4LDB4ZDQsMHhlNSwweDEzLDB4MzQsMHhhYSwweGRkfX0KKworI2RlZmluZSBFRklfSVA2X1NFUlZJQ0VfQklORElOR19QUk9UT0NPTCBcCisgICAgezB4ZWM4MzVkZDMsMHhmZTBmLDB4NjE3Yix7MHhhNiwweDIxLDB4YjMsMHg1MCwweGMzLDB4ZTEsMHgzMywweDg4fX0KKworI2RlZmluZSBFRklfSVA2X1BST1RPQ09MIFwKKyAgICB7MHgyYzg3NTlkNSwweDVjMmQsMHg2NmVmLHsweDkyLDB4NWYsMHhiNiwweDZjLDB4MTAsMHgxOSwweDU3LDB4ZTJ9fQorCitJTlRFUkZBQ0VfREVDTChfRUZJX0lQNCk7CitJTlRFUkZBQ0VfREVDTChfRUZJX0lQNik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSEFORExFICAgICAgIEluc3RhbmNlSGFuZGxlOworICAgIEVGSV9JUHY0X0FERFJFU1MgSXA0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN1Ym5ldE1hc2s7Cit9IEVGSV9JUDRfQUREUkVTU19QQUlSOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0hBTkRMRSAgICAgICAgICAgRHJpdmVySGFuZGxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgIEFkZHJlc3NDb3VudDsKKyAgICBFRklfSVA0X0FERFJFU1NfUEFJUiBBZGRyZXNzUGFpcnNbMV07Cit9IEVGSV9JUDRfVkFSSUFCTEVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgRGVmYXVsdFByb3RvY29sOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QW55UHJvdG9jb2w7CisgICAgQk9PTEVBTiAgICAgICAgICBBY2NlcHRJY21wRXJyb3JzOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QnJvYWRjYXN0OworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0UHJvbWlzY3VvdXM7CisgICAgQk9PTEVBTiAgICAgICAgICBVc2VEZWZhdWx0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN0YXRpb25BZGRyZXNzOworICAgIEVGSV9JUHY0X0FERFJFU1MgU3VibmV0TWFzazsKKyAgICBVSU5UOCAgICAgICAgICAgIFR5cGVPZlNlcnZpY2U7CisgICAgVUlOVDggICAgICAgICAgICBUaW1lVG9MaXZlOworICAgIEJPT0xFQU4gICAgICAgICAgRG9Ob3RGcmFnbWVudDsKKyAgICBCT09MRUFOICAgICAgICAgIFJhd0RhdGE7CisgICAgVUlOVDMyICAgICAgICAgICBSZWNlaXZlVGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgIFRyYW5zbWl0VGltZW91dDsKK30gRUZJX0lQNF9DT05GSUdfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9JUHY0X0FERFJFU1MgU3VibmV0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN1Ym5ldE1hc2s7CisgICAgRUZJX0lQdjRfQUREUkVTUyBHYXRld2F5QWRkcmVzczsKK30gRUZJX0lQNF9ST1VURV9UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4IFR5cGU7CisgICAgVUlOVDggQ29kZTsKK30gRUZJX0lQNF9JQ01QX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgIElzU3RhcnRlZDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIE1heFBhY2tldFNpemU7CisgICAgRUZJX0lQNF9DT05GSUdfREFUQSBDb25maWdEYXRhOworICAgIEJPT0xFQU4gICAgICAgICAgICAgSXNDb25maWd1cmVkOworICAgIFVJTlQzMiAgICAgICAgICAgICAgR3JvdXBDb3VudDsKKyAgICBFRklfSVB2NF9BRERSRVNTICAgICpHcm91cFRhYmxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgUm91dGVDb3VudDsKKyAgICBFRklfSVA0X1JPVVRFX1RBQkxFICpSb3V0ZVRhYmxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgSWNtcFR5cGVDb3VudDsKKyAgICBFRklfSVA0X0lDTVBfVFlQRSAgICpJY21wVHlwZUxpc3Q7Cit9IEVGSV9JUDRfTU9ERV9EQVRBOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA0X0dFVF9NT0RFX0RBVEEpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDQgICAgICAgICAgICAgICAgICAqVGhpcywKKyAgICBPVVQgRUZJX0lQNF9NT0RFX0RBVEEgICAgICAgICAgICAgICAqSXA0TW9kZURhdGEgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BTkFHRURfTkVUV09SS19DT05GSUdfREFUQSAqTW5wQ29uZmlnRGF0YSBPUFRJT05BTCwKKyAgICBPVVQgRUZJX1NJTVBMRV9ORVRXT1JLX01PREUgICAgICAgICAqU25wTW9kZURhdGEgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDRfQ09ORklHVVJFKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA0ICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA0X0NPTkZJR19EQVRBICpJcENvbmZpZ0RhdGEgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA0X0dST1VQUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBKb2luRmxhZywKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpHcm91cEFkZHJlc3MgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA0X1JPVVRFUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBEZWxldGVSb3V0ZSwKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpTdWJuZXRBZGRyZXNzLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKlN1Ym5ldE1hc2ssCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqR2F0ZXdheUFkZHJlc3MKKyAgICApOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgIEhlYWRlckxlbmd0aDo0OworICAgIFVJTlQ4ICAgICAgICAgICAgVmVyc2lvbjo0OworICAgIFVJTlQ4ICAgICAgICAgICAgVHlwZU9mU2VydmljZTsKKyAgICBVSU5UMTYgICAgICAgICAgIFRvdGFsTGVuZ3RoOworICAgIFVJTlQxNiAgICAgICAgICAgSWRlbnRpZmljYXRpb247CisgICAgVUlOVDE2ICAgICAgICAgICBGcmFnbWVudGF0aW9uOworICAgIFVJTlQ4ICAgICAgICAgICAgVGltZVRvTGl2ZTsKKyAgICBVSU5UOCAgICAgICAgICAgIFByb3RvY29sOworICAgIFVJTlQxNiAgICAgICAgICAgQ2hlY2tzdW07CisgICAgRUZJX0lQdjRfQUREUkVTUyBTb3VyY2VBZGRyZXNzOworICAgIEVGSV9JUHY0X0FERFJFU1MgRGVzdGluYXRpb25BZGRyZXNzOworfSBFRklfSVA0X0hFQURFUjsKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgRnJhZ21lbnRMZW5ndGg7CisgICAgVk9JRCAgICpGcmFnbWVudEJ1ZmZlcjsKK30gRUZJX0lQNF9GUkFHTUVOVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RJTUUgICAgICAgICAgICAgIFRpbWVTdGFtcDsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgUmVjeWNsZVNpZ25hbDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgSGVhZGVyTGVuZ3RoOworICAgIEVGSV9JUDRfSEVBREVSICAgICAgICAqSGVhZGVyOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBPcHRpb25zTGVuZ3RoOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAqT3B0aW9uczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfSVA0X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX0lQNF9SRUNFSVZFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2NF9BRERSRVNTIFNvdXJjZUFkZHJlc3M7CisgICAgRUZJX0lQdjRfQUREUkVTUyBHYXRld2F5QWRkcmVzczsKKyAgICBVSU5UOCAgICAgICAgICAgIFByb3RvY29sOworICAgIFVJTlQ4ICAgICAgICAgICAgVHlwZU9mU2VydmljZTsKKyAgICBVSU5UOCAgICAgICAgICAgIFRpbWVUb0xpdmU7CisgICAgQk9PTEVBTiAgICAgICAgICBEb05vdEZyYWdtZW50OworfSBFRklfSVA0X09WRVJSSURFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2NF9BRERSRVNTICAgICAgRGVzdGluYXRpb25BZGRyZXNzOworICAgIEVGSV9JUDRfT1ZFUlJJREVfREFUQSAqT3ZlcnJpZGVEYXRhOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBPcHRpb25zTGVuZ3RoOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAqT3B0aW9uc0J1ZmZlcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgVG90YWxEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9JUDRfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfSVA0X1RSQU5TTUlUX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgICAgIEV2ZW50OworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgU3RhdHVzOworICAgIHVuaW9uIHsKKyAgICAgICAgRUZJX0lQNF9SRUNFSVZFX0RBVEEgICpSeERhdGE7CisgICAgICAgIEVGSV9JUDRfVFJBTlNNSVRfREFUQSAqVHhEYXRhOworICAgIH0gUGFja2V0OworfSBFRklfSVA0X0NPTVBMRVRJT05fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDRfVFJBTlNNSVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDRfUkVDRUlWRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA0X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNF9DQU5DRUwpKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA0X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNF9QT0xMKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA0ICpUaGlzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JUDQgeworICAgIEVGSV9JUDRfR0VUX01PREVfREFUQSBHZXRNb2RlRGF0YTsKKyAgICBFRklfSVA0X0NPTkZJR1VSRSAgICAgQ29uZmlndXJlOworICAgIEVGSV9JUDRfR1JPVVBTICAgICAgICBHcm91cHM7CisgICAgRUZJX0lQNF9ST1VURVMgICAgICAgIFJvdXRlczsKKyAgICBFRklfSVA0X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX0lQNF9SRUNFSVZFICAgICAgIFJlY2VpdmU7CisgICAgRUZJX0lQNF9DQU5DRUwgICAgICAgIENhbmNlbDsKKyAgICBFRklfSVA0X1BPTEwgICAgICAgICAgUG9sbDsKK30gRUZJX0lQNDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgRGVmYXVsdFByb3RvY29sOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QW55UHJvdG9jb2w7CisgICAgQk9PTEVBTiAgICAgICAgICBBY2NlcHRJY21wRXJyb3JzOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0UHJvbWlzY3VvdXM7CisgICAgRUZJX0lQdjZfQUREUkVTUyBEZXN0aW5hdGlvbkFkZHJlc3M7CisgICAgRUZJX0lQdjZfQUREUkVTUyBTdGF0aW9uQWRkcmVzczsKKyAgICBVSU5UOCAgICAgICAgICAgIFRyYWZmaWNDbGFzczsKKyAgICBVSU5UOCAgICAgICAgICAgIEhvcExpbWl0OworICAgIFVJTlQzMiAgICAgICAgICAgRmxvd0xhYmVsOworICAgIFVJTlQzMiAgICAgICAgICAgUmVjZWl2ZVRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICBUcmFuc21pdFRpbWVvdXQ7Cit9IEVGSV9JUDZfQ09ORklHX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2Nl9BRERSRVNTIEFkZHJlc3M7CisgICAgVUlOVDggICAgICAgICAgICBQcmVmaXhMZW5ndGg7Cit9IEVGSV9JUDZfQUREUkVTU19JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjZfQUREUkVTUyBHYXRld2F5OworICAgIEVGSV9JUHY2X0FERFJFU1MgRGVzdGluYXRpb247CisgICAgVUlOVDggICAgICAgICAgICBQcmVmaXhMZW5ndGg7Cit9IEVGSV9JUDZfUk9VVEVfVEFCTEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpTmVpZ2hib3JJbkNvbXBsZXRlLAorICAgIEVmaU5laWdoYm9yUmVhY2hhYmxlLAorICAgIEVmaU5laWdoYm9yU3RhbGUsCisgICAgRWZpTmVpZ2hib3JEZWxheSwKKyAgICBFZmlOZWlnaGJvclByb2JlCit9IEVGSV9JUDZfTkVJR0hCT1JfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2Nl9BRERSRVNTICAgICAgIE5laWdoYm9yOworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgTGlua0FkZHJlc3M7CisgICAgRUZJX0lQNl9ORUlHSEJPUl9TVEFURSBTdGF0ZTsKK30gRUZJX0lQNl9ORUlHSEJPUl9DQUNIRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4IFR5cGU7CisgICAgVUlOVDggQ29kZTsKK30gRUZJX0lQNl9JQ01QX1RZUEU7CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIElDTVB2NiB0eXBlIGRlZmluaXRpb25zIGZvciBlcnJvciBtZXNzYWdlcworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBJQ01QX1Y2X0RFU1RfVU5SRUFDSEFCTEUgICAgIDB4MQorI2RlZmluZSBJQ01QX1Y2X1BBQ0tFVF9UT09fQklHICAgICAgIDB4MgorI2RlZmluZSBJQ01QX1Y2X1RJTUVfRVhDRUVERUQgICAgICAgIDB4MworI2RlZmluZSBJQ01QX1Y2X1BBUkFNRVRFUl9QUk9CTEVNICAgIDB4NAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBJQ01QdjYgdHlwZSBkZWZpbml0aW9uIGZvciBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElDTVBfVjZfRUNIT19SRVFVRVNUICAgICAgICAgMHg4MAorI2RlZmluZSBJQ01QX1Y2X0VDSE9fUkVQTFkgICAgICAgICAgIDB4ODEKKyNkZWZpbmUgSUNNUF9WNl9MSVNURU5FUl9RVUVSWSAgICAgICAweDgyCisjZGVmaW5lIElDTVBfVjZfTElTVEVORVJfUkVQT1JUICAgICAgMHg4MworI2RlZmluZSBJQ01QX1Y2X0xJU1RFTkVSX0RPTkUgICAgICAgIDB4ODQKKyNkZWZpbmUgSUNNUF9WNl9ST1VURVJfU09MSUNJVCAgICAgICAweDg1CisjZGVmaW5lIElDTVBfVjZfUk9VVEVSX0FEVkVSVElTRSAgICAgMHg4NgorI2RlZmluZSBJQ01QX1Y2X05FSUdIQk9SX1NPTElDSVQgICAgIDB4ODcKKyNkZWZpbmUgSUNNUF9WNl9ORUlHSEJPUl9BRFZFUlRJU0UgICAweDg4CisjZGVmaW5lIElDTVBfVjZfUkVESVJFQ1QgICAgICAgICAgICAgMHg4OQorI2RlZmluZSBJQ01QX1Y2X0xJU1RFTkVSX1JFUE9SVF8yICAgIDB4OEYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gSUNNUHY2IGNvZGUgZGVmaW5pdGlvbnMgZm9yIElDTVBfVjZfREVTVF9VTlJFQUNIQUJMRQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBJQ01QX1Y2X05PX1JPVVRFX1RPX0RFU1QgICAgIDB4MAorI2RlZmluZSBJQ01QX1Y2X0NPTU1fUFJPSElCSVRFRCAgICAgIDB4MQorI2RlZmluZSBJQ01QX1Y2X0JFWU9ORF9TQ09QRSAgICAgICAgIDB4MgorI2RlZmluZSBJQ01QX1Y2X0FERFJfVU5SRUFDSEFCTEUgICAgIDB4MworI2RlZmluZSBJQ01QX1Y2X1BPUlRfVU5SRUFDSEFCTEUgICAgIDB4NAorI2RlZmluZSBJQ01QX1Y2X1NPVVJDRV9BRERSX0ZBSUxFRCAgIDB4NQorI2RlZmluZSBJQ01QX1Y2X1JPVVRFX1JFSkVDVEVEICAgICAgIDB4NgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBJQ01QdjYgY29kZSBkZWZpbml0aW9ucyBmb3IgSUNNUF9WNl9USU1FX0VYQ0VFREVECisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElDTVBfVjZfVElNRU9VVF9IT1BfTElNSVQgICAgMHgwCisjZGVmaW5lIElDTVBfVjZfVElNRU9VVF9SRUFTU0VNQkxFICAgMHgxCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIElDTVB2NiBjb2RlIGRlZmluaXRpb25zIGZvciBJQ01QX1Y2X1BBUkFNRVRFUl9QUk9CTEVNCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElDTVBfVjZfRVJST05FT1VTX0hFQURFUiAgICAgMHgwCisjZGVmaW5lIElDTVBfVjZfVU5SRUNPR05JWkVfTkVYVF9IRFIgMHgxCisjZGVmaW5lIElDTVBfVjZfVU5SRUNPR05JWkVfT1BUSU9OICAgMHgyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIElzU3RhcnRlZDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIE1heFBhY2tldFNpemU7CisgICAgRUZJX0lQNl9DT05GSUdfREFUQSAgICBDb25maWdEYXRhOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgSXNDb25maWd1cmVkOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgQWRkcmVzc0NvdW50OworICAgIEVGSV9JUDZfQUREUkVTU19JTkZPICAgKkFkZHJlc3NMaXN0OworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgR3JvdXBDb3VudDsKKyAgICBFRklfSVB2Nl9BRERSRVNTICAgICAgICpHcm91cFRhYmxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgUm91dGVDb3VudDsKKyAgICBFRklfSVA2X1JPVVRFX1RBQkxFICAgICpSb3V0ZVRhYmxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgTmVpZ2hib3JDb3VudDsKKyAgICBFRklfSVA2X05FSUdIQk9SX0NBQ0hFICpOZWlnaGJvckNhY2hlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgUHJlZml4Q291bnQ7CisgICAgRUZJX0lQNl9BRERSRVNTX0lORk8gICAqUHJlZml4VGFibGU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBJY21wVHlwZUNvdW50OworICAgIEVGSV9JUDZfSUNNUF9UWVBFICAgICAgKkljbXBUeXBlTGlzdDsKK30gRUZJX0lQNl9NT0RFX0RBVEE7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfR0VUX01PREVfREFUQSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNiAgICAgICAgICAgICAgICAgICpUaGlzLAorICAgIE9VVCBFRklfSVA2X01PREVfREFUQSAgICAgICAgICAgICAgICpJcDZNb2RlRGF0YSAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfTUFOQUdFRF9ORVRXT1JLX0NPTkZJR19EQVRBICpNbnBDb25maWdEYXRhIE9QVElPTkFMLAorICAgIE9VVCBFRklfU0lNUExFX05FVFdPUktfTU9ERSAgICAgICAgICpTbnBNb2RlRGF0YSAgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9DT05GSUdVUkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICAgICpUaGlzLAorICAgIElOIEVGSV9JUDZfQ09ORklHX0RBVEEgKklwNkNvbmZpZ0RhdGEgT1BUSU9OQUwKKyAgICApOwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9HUk9VUFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgSm9pbkZsYWcsCisgICAgSU4gRUZJX0lQdjZfQUREUkVTUyAqR3JvdXBBZGRyZXNzIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9ST1VURVMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgRGVsZXRlUm91dGUsCisgICAgSU4gRUZJX0lQdjZfQUREUkVTUyAqRGVzdGluYXRpb24gICAgT1BUSU9OQUwsCisgICAgSU4gVUlOVDggICAgICAgICAgICBQcmVmaXhMZW5ndGgsCisgICAgSU4gRUZJX0lQdjZfQUREUkVTUyAqR2F0ZXdheUFkZHJlc3MgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA2X05FSUdIQk9SUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNiAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBEZWxldGVGbGFnLAorICAgIElOIEVGSV9JUHY2X0FERFJFU1MgKlRhcmdldElwNkFkZHJlc3MsCisgICAgSU4gRUZJX01BQ19BRERSRVNTICAqVGFyZ2V0TGlua0FkZHJlc3MgT1BUSU9OQUwsCisgICAgSU4gVUlOVDMyICAgICAgICAgICBUaW1lb3V0LAorICAgIElOIEJPT0xFQU4gICAgICAgICAgT3ZlcnJpZGUKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lQNl9GUkFHTUVOVF9EQVRBIHsKKyAgICBVSU5UMzIgRnJhZ21lbnRMZW5ndGg7CisgICAgVk9JRCAgICpGcmFnbWVudEJ1ZmZlcjsKK30gRUZJX0lQNl9GUkFHTUVOVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lQNl9PVkVSUklERV9EQVRBIHsKKyAgICBVSU5UOCAgUHJvdG9jb2w7CisgICAgVUlOVDggIEhvcExpbWl0OworICAgIFVJTlQzMiBGbG93TGFiZWw7Cit9IEVGSV9JUDZfT1ZFUlJJREVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JUDZfVFJBTlNNSVRfREFUQSB7CisgICAgRUZJX0lQdjZfQUREUkVTUyAgICAgIERlc3RpbmF0aW9uQWRkcmVzczsKKyAgICBFRklfSVA2X09WRVJSSURFX0RBVEEgKk92ZXJyaWRlRGF0YTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgRXh0SGRyc0xlbmd0aDsKKyAgICBWT0lEICAgICAgICAgICAgICAgICAgKkV4dEhkcnM7CisgICAgVUlOVDggICAgICAgICAgICAgICAgIE5leHRIZWFkZXI7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX0lQNl9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9JUDZfVFJBTlNNSVRfREFUQTsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lQNl9IRUFERVIgeworICAgIFVJTlQ4ICAgICAgICAgICAgVHJhZmZpY0NsYXNzSDo0OworICAgIFVJTlQ4ICAgICAgICAgICAgVmVyc2lvbjo0OworICAgIFVJTlQ4ICAgICAgICAgICAgRmxvd0xhYmVsSDo0OworICAgIFVJTlQ4ICAgICAgICAgICAgVHJhZmZpY0NsYXNzTDo0OworICAgIFVJTlQxNiAgICAgICAgICAgRmxvd0xhYmVsTDsKKyAgICBVSU5UMTYgICAgICAgICAgIFBheWxvYWRMZW5ndGg7CisgICAgVUlOVDggICAgICAgICAgICBOZXh0SGVhZGVyOworICAgIFVJTlQ4ICAgICAgICAgICAgSG9wTGltaXQ7CisgICAgRUZJX0lQdjZfQUREUkVTUyBTb3VyY2VBZGRyZXNzOworICAgIEVGSV9JUHY2X0FERFJFU1MgRGVzdGluYXRpb25BZGRyZXNzOworfSBFRklfSVA2X0hFQURFUjsKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IF9FRklfSVA2X1JFQ0VJVkVfREFUQSB7CisgICAgRUZJX1RJTUUgICAgICAgICAgICAgIFRpbWVTdGFtcDsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgUmVjeWNsZVNpZ25hbDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgSGVhZGVyTGVuZ3RoOworICAgIEVGSV9JUDZfSEVBREVSICAgICAgICAqSGVhZGVyOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9JUDZfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfSVA2X1JFQ0VJVkVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9FVkVOVCAgICAgICAgICAgICAgICAgRXZlbnQ7CisgICAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICBTdGF0dXM7CisgICAgdW5pb24geworCUVGSV9JUDZfUkVDRUlWRV9EQVRBICAqUnhEYXRhOworCUVGSV9JUDZfVFJBTlNNSVRfREFUQSAqVHhEYXRhOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0OworfSBFRklfSVA2X0NPTVBMRVRJT05fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfVFJBTlNNSVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQNl9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfUkVDRUlWRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNiAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA2X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9DQU5DRUwpKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNiAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA2X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9QT0xMKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA2ICpUaGlzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JUDYgeworICAgIEVGSV9JUDZfR0VUX01PREVfREFUQSBHZXRNb2RlRGF0YTsKKyAgICBFRklfSVA2X0NPTkZJR1VSRSAgICAgQ29uZmlndXJlOworICAgIEVGSV9JUDZfR1JPVVBTICAgICAgICBHcm91cHM7CisgICAgRUZJX0lQNl9ST1VURVMgICAgICAgIFJvdXRlczsKKyAgICBFRklfSVA2X05FSUdIQk9SUyAgICAgTmVpZ2hib3JzOworICAgIEVGSV9JUDZfVFJBTlNNSVQgICAgICBUcmFuc21pdDsKKyAgICBFRklfSVA2X1JFQ0VJVkUgICAgICAgUmVjZWl2ZTsKKyAgICBFRklfSVA2X0NBTkNFTCAgICAgICAgQ2FuY2VsOworICAgIEVGSV9JUDZfUE9MTCAgICAgICAgICBQb2xsOworfSBFRklfSVA2OworCisjZW5kaWYgLyogX0VGSV9JUF9IICovCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9lZmlsaWIuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDU0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlsaWIuaApAQCAtMCwwICsxLDkxMCBAQAorI2lmbmRlZiBfRUZJTElCX0lOQ0xVREVfCisjZGVmaW5lIF9FRklMSUJfSU5DTFVERV8KKworLyorKworCitDb3B5cmlnaHQgKGMpIDIwMDAgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpbGliLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgbGlicmFyeSBmdW5jdGlvbnMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAiZWZpZGVidWcuaCIKKyNpbmNsdWRlICJlZmlwYXJ0LmgiCisjaW5jbHVkZSAiZWZpbGlicGxhdC5oIgorI2luY2x1ZGUgImVmaWxpbmsuaCIKKyNpbmNsdWRlICJlZmlydGxpYi5oIgorI2luY2x1ZGUgImVmaXN0ZGFyZy5oIgorI2luY2x1ZGUgInBjaTIyLmgiCisjaW5jbHVkZSAibGlic21iaW9zLmgiCisKKy8vCisvLyBQdWJsaWMgcmVhZC1vbmx5IGRhdGEgaW4gdGhlIEVGSSBsaWJyYXJ5CisvLworCitleHRlcm4gRUZJX1NZU1RFTV9UQUJMRSAgICAgICAgICpTVDsKK2V4dGVybiBFRklfQk9PVF9TRVJWSUNFUyAgICAgICAgKkJTOworZXh0ZXJuIEVGSV9SVU5USU1FX1NFUlZJQ0VTICAgICAqUlQ7CisKK2V4dGVybiBFRklfR1VJRCBEZXZpY2VQYXRoUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgTG9hZGVkSW1hZ2VQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBUZXh0SW5Qcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBUZXh0T3V0UHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgQmxvY2tJb1Byb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIERpc2tJb1Byb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIEZpbGVTeXN0ZW1Qcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBMb2FkRmlsZVByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIERldmljZUlvUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVmFyaWFibGVTdG9yZVByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIExlZ2FjeUJvb3RQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBVbmljb2RlQ29sbGF0aW9uUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgU2VyaWFsSW9Qcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBWZ2FDbGFzc1Byb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFRleHRPdXRTcGxpdGVyUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgRXJyb3JPdXRTcGxpdGVyUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVGV4dEluU3BsaXRlclByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFNpbXBsZU5ldHdvcmtQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBQeGVCYXNlQ29kZVByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFB4ZUNhbGxiYWNrUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgTmV0d29ya0ludGVyZmFjZUlkZW50aWZpZXJQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBVaVByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIEludGVybmFsU2hlbGxQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBQY2lJb1Byb3RvY29sOworCitleHRlcm4gRUZJX0dVSUQgRWZpR2xvYmFsVmFyaWFibGU7CitleHRlcm4gRUZJX0dVSUQgR2VuZXJpY0ZpbGVJbmZvOworZXh0ZXJuIEVGSV9HVUlEIEZpbGVTeXN0ZW1JbmZvOworZXh0ZXJuIEVGSV9HVUlEIEZpbGVTeXN0ZW1Wb2x1bWVMYWJlbEluZm87CitleHRlcm4gRUZJX0dVSUQgUGNBbnNpUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVnQxMDBQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBOdWxsR3VpZDsKK2V4dGVybiBFRklfR1VJRCBVbmtub3duRGV2aWNlOworCitleHRlcm4gRUZJX0dVSUQgRWZpUGFydFR5cGVTeXN0ZW1QYXJ0aXRpb25HdWlkOworZXh0ZXJuIEVGSV9HVUlEIEVmaVBhcnRUeXBlTGVnYWN5TWJyR3VpZDsKKworZXh0ZXJuIEVGSV9HVUlEIE1wc1RhYmxlR3VpZDsKK2V4dGVybiBFRklfR1VJRCBBY3BpVGFibGVHdWlkOworZXh0ZXJuIEVGSV9HVUlEIFNNQklPU1RhYmxlR3VpZDsKK2V4dGVybiBFRklfR1VJRCBTYWxTeXN0ZW1UYWJsZUd1aWQ7CisKKy8vCisvLyBFRkkgVmFyaWFibGUgc3RyaW5ncworLy8KKyNkZWZpbmUgTE9BRF9PUFRJT05fQUNUSVZFICAgICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIFZhckxhbmd1YWdlQ29kZXMgICAgICAgTCJMYW5nQ29kZXMiCisjZGVmaW5lIFZhckxhbmd1YWdlICAgICAgICAgICAgTCJMYW5nIgorI2RlZmluZSBWYXJUaW1lb3V0ICAgICAgICAgICAgIEwiVGltZW91dCIKKyNkZWZpbmUgVmFyQ29uc29sZUlucCAgICAgICAgICBMIkNvbkluIgorI2RlZmluZSBWYXJDb25zb2xlT3V0ICAgICAgICAgIEwiQ29uT3V0IgorI2RlZmluZSBWYXJFcnJvck91dCAgICAgICAgICAgIEwiRXJyT3V0IgorI2RlZmluZSBWYXJCb290T3B0aW9uICAgICAgICAgIEwiQm9vdCUwNHgiCisjZGVmaW5lIFZhckJvb3RPcmRlciAgICAgICAgICAgTCJCb290T3JkZXIiCisjZGVmaW5lIFZhckJvb3ROZXh0ICAgICAgICAgICAgTCJCb290TmV4dCIKKyNkZWZpbmUgVmFyQm9vdEN1cnJlbnQgICAgICAgICBMIkJvb3RDdXJyZW50IgorI2RlZmluZSBWYXJEcml2ZXJPcHRpb24gICAgICAgIEwiRHJpdmVyJTA0eCIKKyNkZWZpbmUgVmFyRHJpdmVyT3JkZXIgICAgICAgICBMIkRyaXZlck9yZGVyIgorI2RlZmluZSBWYXJDb25zb2xlSW5wRGV2ICAgICAgIEwiQ29uSW5EZXYiCisjZGVmaW5lIFZhckNvbnNvbGVPdXREZXYgICAgICAgTCJDb25PdXREZXYiCisjZGVmaW5lIFZhckVycm9yT3V0RGV2ICAgICAgICAgTCJFcnJPdXREZXYiCisKKyNkZWZpbmUgTGFuZ3VhZ2VDb2RlRW5nbGlzaCAgICAiZW5nIgorCitleHRlcm4gRUZJX0RFVklDRV9QQVRIIFJvb3REZXZpY2VQYXRoW107CitleHRlcm4gRUZJX0RFVklDRV9QQVRIIEVuZERldmljZVBhdGhbXTsKK2V4dGVybiBFRklfREVWSUNFX1BBVEggRW5kSW5zdGFuY2VEZXZpY2VQYXRoW107CisKKy8vCisvLyBPdGhlciBwdWJsaWMgZGF0YSBpbiB0aGUgRUZJIGxpYnJhcnkKKy8vCisKK2V4dGVybiBFRklfTUVNT1JZX1RZUEUgUG9vbEFsbG9jYXRpb25UeXBlOworCisvLworLy8gU1RBVElDIC0gTmFtZSBpcyBpbnRlcm5hbCB0byB0aGUgbW9kdWxlCisvLyBJTlRFUk5BTCAtIE5hbWUgaXMgaW50ZXJuYWwgdG8gdGhlIGNvbXBvbmVudCAoaS5lLiwgZGlyZWN0b3J5KQorLy8gQk9PVFNFUlZDRSAtIE5hbWUgb2YgYSBib290IHNlcnZpY2UgZnVuY3Rpb24KKy8vCisKKyNkZWZpbmUgU1RBVElDCisjZGVmaW5lIElOVEVSTkFMCisjZGVmaW5lIEJPT1RTRVJWSUNFCisKKy8vCisvLyBQcm90b3R5cGVzCisvLworCitWT0lECitJbml0aWFsaXplTGliICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgICBJTiBFRklfU1lTVEVNX1RBQkxFICAgICAqU3lzdGVtVGFibGUKKyAgICApOworCitWT0lECitJbml0aWFsaXplVW5pY29kZVN1cHBvcnQgKAorICAgIENIQVI4ICpMYW5nQ29kZQorICAgICk7CisKK1ZPSUQKK0VGSURlYnVnVmFyaWFibGUgKAorICAgIFZPSUQKKyAgICApOworCitWT0lECitTZXRDcmMgKAorICAgIElOIE9VVCBFRklfVEFCTEVfSEVBREVSICpIZHIKKyAgICApOworCitWT0lECitTZXRDcmNBbHRTaXplICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgU2l6ZSwKKyAgICBJTiBPVVQgRUZJX1RBQkxFX0hFQURFUiAqSGRyCisgICAgKTsKKworQk9PTEVBTgorQ2hlY2tDcmMgKAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICBNYXhTaXplLAorICAgIElOIE9VVCBFRklfVEFCTEVfSEVBREVSICpIZHIKKyAgICApOworCitCT09MRUFOCitDaGVja0NyY0FsdFNpemUgKAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICBNYXhTaXplLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICBTaXplLAorICAgIElOIE9VVCBFRklfVEFCTEVfSEVBREVSICpIZHIKKyAgICApOworCitVSU5UMzIKK0NhbGN1bGF0ZUNyYyAoCisgICAgVUlOVDggKnB0LAorICAgIFVJTlROIFNpemUKKyAgICApOworCitWT0lECitaZXJvTWVtICgKKyAgICBJTiBWT0lEICAgICAqQnVmZmVyLAorICAgIElOIFVJTlROICAgICBTaXplCisgICAgKTsKKworVk9JRAorU2V0TWVtICgKKyAgICBJTiBWT0lEICAgICAqQnVmZmVyLAorICAgIElOIFVJTlROICAgIFNpemUsCisgICAgSU4gVUlOVDggICAgVmFsdWUgICAgCisgICAgKTsKKworVk9JRAorQ29weU1lbSAoCisgICAgSU4gVk9JRCAgICAgKkRlc3QsCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKlNyYywKKyAgICBJTiBVSU5UTiAgICBsZW4KKyAgICApOworCitJTlROCitDb21wYXJlTWVtICgKKyAgICBJTiBDT05TVCBWT0lEICAgICAqRGVzdCwKKyAgICBJTiBDT05TVCBWT0lEICAgICAqU3JjLAorICAgIElOIFVJTlROICAgIGxlbgorICAgICk7CisKK0lOVE4KK1N0ckNtcCAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxLAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMgorICAgICk7CisKK0lOVE4KK1N0cm5DbXAgKAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczIsCisgICAgSU4gVUlOVE4gICAgbGVuCisgICAgKTsKKworSU5UTgorU3RyaUNtcCAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxLAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMgorICAgICk7CisKK1ZPSUQKK1N0ckx3ciAoCisgICAgSU4gQ0hBUjE2ICAgKlN0cgorICAgICk7CisKK1ZPSUQKK1N0clVwciAoCisgICAgSU4gQ0hBUjE2ICAgKlN0cgorICAgICk7CisKK1ZPSUQKK1N0ckNweSAoCisgICAgSU4gQ0hBUjE2ICAgKkRlc3QsCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgICpTcmMKKyAgICApOworCitWT0lECitTdHJDYXQgKAorICAgIElOIENIQVIxNiAgICpEZXN0LAorICAgIElOIENPTlNUIENIQVIxNiAgICpTcmMKKyAgICApOworCitVSU5UTgorU3RyTGVuICgKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczEKKyAgICApOworCitVSU5UTgorU3RyU2l6ZSAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxCisgICAgKTsKKworQ0hBUjE2ICoKK1N0ckR1cGxpY2F0ZSAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKlNyYworICAgICk7CisKK1VJTlROCitzdHJsZW5hICgKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczEKKyAgICApOworICAgIAorVUlOVE4KK3N0cmNtcGEgKAorICAgIElOIENPTlNUIENIQVI4ICAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczIKKyAgICApOworCitVSU5UTgorc3RybmNtcGEgKAorICAgIElOIENPTlNUIENIQVI4ICAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczIsCisgICAgSU4gVUlOVE4gICAgbGVuCisgICAgKTsKKworVUlOVE4KK3h0b2kgKAorICAgIENPTlNUIENIQVIxNiAgICAgICpzdHIKKyAgICApOworCitVSU5UTgorQXRvaSAoCisgICAgQ09OU1QgQ0hBUjE2ICAqc3RyCisgICAgKTsKKworQk9PTEVBTiAKK01ldGFNYXRjaCAoCisgICAgSU4gQ0hBUjE2ICAgKlN0cmluZywKKyAgICBJTiBDSEFSMTYgICAqUGF0dGVybgorICAgICk7CisKK0JPT0xFQU4gCitNZXRhaU1hdGNoICgKKyAgICBJTiBDSEFSMTYgICAqU3RyaW5nLAorICAgIElOIENIQVIxNiAgICpQYXR0ZXJuCisgICAgKTsKKworVUlOVDY0CitMU2hpZnRVNjQgKAorICAgIElOIFVJTlQ2NCAgIE9wZXJhbmQsCisgICAgSU4gVUlOVE4gICAgQ291bnQKKyAgICApOworCitVSU5UNjQKK1JTaGlmdFU2NCAoCisgICAgSU4gVUlOVDY0ICAgT3BlcmFuZCwKKyAgICBJTiBVSU5UTiAgICBDb3VudAorICAgICk7CisKK1VJTlQ2NAorTXVsdFU2NHgzMiAoCisgICAgSU4gVUlOVDY0ICAgTXVsdGlwbGljYW5kLAorICAgIElOIFVJTlROICAgIE11bHRpcGxpZXIKKyAgICApOworCitVSU5UNjQKK0RpdlU2NHgzMiAoCisgICAgSU4gVUlOVDY0ICAgRGl2aWRlbmQsCisgICAgSU4gVUlOVE4gICAgRGl2aXNvciwKKyAgICBPVVQgVUlOVE4gICAqUmVtYWluZGVyIE9QVElPTkFMCisgICAgKTsKKworVk9JRAorSW5pdGlhbGl6ZUxvY2sgKAorICAgIElOIE9VVCBGTE9DSyAgICAqTG9jaywKKyAgICBJTiBFRklfVFBMICBQcmlvcml0eQorICAgICk7CisKK1ZPSUQKK0FjcXVpcmVMb2NrICgKKyAgICBJTiBGTE9DSyAgICAqTG9jaworICAgICk7CisKK1ZPSUQKK1JlbGVhc2VMb2NrICgKKyAgICBJTiBGTE9DSyAgICAqTG9jaworICAgICk7CisKKworSU5UTgorQ29tcGFyZUd1aWQoCisgICAgSU4gRUZJX0dVSUQgICAgICpHdWlkMSwKKyAgICBJTiBFRklfR1VJRCAgICAgKkd1aWQyCisgICAgKTsKKworVk9JRCAqCitBbGxvY2F0ZVBvb2wgKAorICAgIElOIFVJTlROICAgICBTaXplCisgICAgKTsKKworVk9JRCAqCitBbGxvY2F0ZVplcm9Qb29sICgKKyAgICBJTiBVSU5UTiAgICAgU2l6ZQorICAgICk7CisKK1ZPSUQgKgorUmVhbGxvY2F0ZVBvb2wgKAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICpPbGRQb29sLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgIE9sZFNpemUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgTmV3U2l6ZQorICAgICk7CisKK1ZPSUQKK0ZyZWVQb29sICgKKyAgICBJTiBWT0lEICAgICAqcAorICAgICk7CisKKworVk9JRAorT3V0cHV0ICgKKyAgICBJTiBDSEFSMTYgICAqU3RyCisgICAgKTsKKworVk9JRAorSW5wdXQgKAorICAgIElOIENIQVIxNiAgICpQcm9tcHQgT1BUSU9OQUwsCisgICAgT1VUIENIQVIxNiAgKkluU3RyLAorICAgIElOIFVJTlROICAgIFN0ckxlbgorICAgICk7CisKK1ZPSUQKK0lJbnB1dCAoCisgICAgSU4gU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKkNvbk91dCwKKyAgICBJTiBTSU1QTEVfSU5QVVRfSU5URVJGQUNFICAgICAgICAgICAqQ29uSW4sCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKlByb21wdCBPUFRJT05BTCwKKyAgICBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqSW5TdHIsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyTGVuCisgICAgKTsKKworVUlOVE4KK1ByaW50ICgKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK1VJTlROCitWUHJpbnQgKAorICAgIElOIENIQVIxNiAgICpmbXQsCisgICAgdmFfbGlzdCAgICAgYXJncworICAgICk7CisKK1VJTlROCitTUHJpbnQgKAorICAgIE9VVCBDSEFSMTYgICpTdHIsCisgICAgSU4gVUlOVE4gICAgU3RyU2l6ZSwKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK1VJTlROCitWU1ByaW50ICgKKyAgICBPVVQgQ0hBUjE2ICAqU3RyLAorICAgIElOIFVJTlROICAgIFN0clNpemUsCisgICAgSU4gQ0hBUjE2ICAgKmZtdCwKKyAgICB2YV9saXN0ICAgICBhcmdzCisgICAgKTsKKworQ0hBUjE2ICoKK1Bvb2xQcmludCAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDSEFSMTYgICAgICAqc3RyOworICAgIFVJTlROICAgICAgIGxlbjsKKyAgICBVSU5UTiAgICAgICBtYXhsZW47Cit9IFBPT0xfUFJJTlQ7CisKK0NIQVIxNiAqCitDYXRQcmludCAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAqU3RyLAorICAgIElOIENIQVIxNiAgICAgICAgICAgKmZtdCwKKyAgICAuLi4KKyAgICApOworCitVSU5UTgorUHJpbnRBdCAoCisgICAgSU4gVUlOVE4gICAgQ29sdW1uLAorICAgIElOIFVJTlROICAgIFJvdywKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK1VJTlROCitJUHJpbnQgKAorICAgIElOIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgKk91dCwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICpmbXQsCisgICAgLi4uCisgICAgKTsKKworVUlOVE4KK0lQcmludEF0ICgKKyAgICBJTiBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqT3V0LAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbiwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3csCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZtdCwKKyAgICAuLi4KKyAgICApOworCitVSU5UTgorQVByaW50ICgKKyAgICBJTiBDSEFSOCAgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK1ZPSUQKK1ZhbHVlVG9IZXggKAorICAgIElOIENIQVIxNiAgICpCdWZmZXIsCisgICAgSU4gVUlOVDY0ICAgdgorICAgICk7CisKK1ZPSUQKK1ZhbHVlVG9TdHJpbmcgKAorICAgIElOIENIQVIxNiAgICpCdWZmZXIsCisgICAgSU4gQk9PTEVBTiAgQ29tbWEsCisgICAgSU4gSU5UNjQgICAgdgorICAgICk7CisKK1ZPSUQKK1RpbWVUb1N0cmluZyAoCisgICAgT1VUIENIQVIxNiAgICAgICpCdWZmZXIsCisgICAgSU4gRUZJX1RJTUUgICAgICpUaW1lCisgICAgKTsKKworVk9JRAorR3VpZFRvU3RyaW5nICgKKyAgICBPVVQgQ0hBUjE2ICAgICAgKkJ1ZmZlciwKKyAgICBJTiBFRklfR1VJRCAgICAgKkd1aWQKKyAgICApOworCitWT0lECitTdGF0dXNUb1N0cmluZyAoCisgICAgT1VUIENIQVIxNiAgICAgICpCdWZmZXIsCisgICAgRUZJX1NUQVRVUyAgICAgIFN0YXR1cworICAgICk7CisKK1ZPSUQKK0R1bXBIZXggKAorICAgIElOIFVJTlROICAgICAgICBJbmRlbnQsCisgICAgSU4gVUlOVE4gICAgICAgIE9mZnNldCwKKyAgICBJTiBVSU5UTiAgICAgICAgRGF0YVNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICpVc2VyRGF0YQorICAgICk7CisKK0JPT0xFQU4KK0dyb3dCdWZmZXIoCisgICAgSU4gT1VUIEVGSV9TVEFUVVMgICAqU3RhdHVzLAorICAgIElOIE9VVCBWT0lEICAgICAgICAgKipCdWZmZXIsCisgICAgSU4gVUlOVE4gICAgICAgICAgICBCdWZmZXJTaXplCisgICAgKTsKKworRUZJX01FTU9SWV9ERVNDUklQVE9SICoKK0xpYk1lbW9yeU1hcCAoCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgKk5vRW50cmllcywKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAqTWFwS2V5LAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICpEZXNjcmlwdG9yU2l6ZSwKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAqRGVzY3JpcHRvclZlcnNpb24KKyAgICApOworCitWT0lEICoKK0xpYkdldFZhcmlhYmxlICgKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAqTmFtZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAqVmVuZG9yR3VpZAorICAgICk7CisKK1ZPSUQgKgorTGliR2V0VmFyaWFibGVBbmRTaXplICgKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAqTmFtZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAqVmVuZG9yR3VpZCwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAqVmFyU2l6ZQorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYkRlbGV0ZVZhcmlhYmxlICgKKyAgICBJTiBDSEFSMTYgICAqVmFyTmFtZSwKKyAgICBJTiBFRklfR1VJRCAqVmFyR3VpZAorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYlNldE5WVmFyaWFibGUgKAorICAgIElOIENIQVIxNiAgICpWYXJOYW1lLAorICAgIElOIEVGSV9HVUlEICpWYXJHdWlkLAorICAgIElOIFVJTlROCSBEYXRhU2l6ZSwKKyAgICBJTiBWT0lEICAgICAqRGF0YQorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYlNldFZhcmlhYmxlICgKKyAgICBJTiBDSEFSMTYgICAqVmFyTmFtZSwKKyAgICBJTiBFRklfR1VJRCAqVmFyR3VpZCwKKyAgICBJTiBVSU5UTgkgRGF0YVNpemUsCisgICAgSU4gVk9JRCAgICAgKkRhdGEKKyAgICApOworRUZJX1NUQVRVUworTGliSW5zZXJ0VG9UYWlsT2ZCb290T3JkZXIgKAorICAgIElOICBVSU5UMTYgIEJvb3RPcHRpb24sCisgICAgSU4gIEJPT0xFQU4gT25seUluc2VydElmRW1wdHkKKyAgICApOworCitFRklfU1RBVFVTCitMaWJMb2NhdGVQcm90b2NvbCAoCisgICAgSU4gIEVGSV9HVUlEICAgICpQcm90b2NvbEd1aWQsCisgICAgT1VUIFZPSUQgICAgICAgICoqSW50ZXJmYWNlCisgICAgKTsKKworRUZJX1NUQVRVUworTGliTG9jYXRlSGFuZGxlICgKKyAgICBJTiBFRklfTE9DQVRFX1NFQVJDSF9UWVBFICAgU2VhcmNoVHlwZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sIE9QVElPTkFMLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU2VhcmNoS2V5IE9QVElPTkFMLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAqTm9IYW5kbGVzLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAqKkJ1ZmZlcgorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYkxvY2F0ZUhhbmRsZUJ5RGlza1NpZ25hdHVyZSAoCisgICAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBNQlJUeXBlLAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlVHlwZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpTaWduYXR1cmUsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqTm9IYW5kbGVzLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAgICAgKipCdWZmZXIKKyAgICApOworCitFRklfU1RBVFVTCitMaWJJbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2VzICgKKyAgICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgICAqSGFuZGxlLAorICAgIC4uLgorICAgICk7CisKK1ZPSUQKK0xpYlVuaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlcyAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgSGFuZGxlLAorICAgIC4uLgorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYlJlaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlcyAoCisgICAgSU4gT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICpIYW5kbGUsCisgICAgLi4uCisgICAgKTsKKworRUZJX0VWRU5UCitMaWJDcmVhdGVQcm90b2NvbE5vdGlmeUV2ZW50ICgKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAqUHJvdG9jb2xHdWlkLAorICAgIElOIEVGSV9UUEwgICAgICAgICAgICAgIE5vdGlmeVRwbCwKKyAgICBJTiBFRklfRVZFTlRfTk9USUZZICAgICBOb3RpZnlGdW5jdGlvbiwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqTm90aWZ5Q29udGV4dCwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAqUmVnaXN0cmF0aW9uCisgICAgKTsKKworRUZJX1NUQVRVUworV2FpdEZvclNpbmdsZUV2ZW50ICgKKyAgICBJTiBFRklfRVZFTlQgICAgICAgIEV2ZW50LAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgVGltZW91dCBPUFRJT05BTAorICAgICk7CisKK1ZPSUQKK1dhaXRGb3JFdmVudFdpdGhUaW1lb3V0ICgKKyAgICBJTiAgRUZJX0VWRU5UICAgICAgIEV2ZW50LAorICAgIElOICBVSU5UTiAgICAgICAgICAgVGltZW91dCwKKyAgICBJTiAgVUlOVE4gICAgICAgICAgIFJvdywKKyAgICBJTiAgVUlOVE4gICAgICAgICAgIENvbHVtbiwKKyAgICBJTiAgQ0hBUjE2ICAgICAgICAgICpTdHJpbmcsCisgICAgSU4gIEVGSV9JTlBVVF9LRVkgICBUaW1lb3V0S2V5LAorICAgIE9VVCBFRklfSU5QVVRfS0VZICAgKktleQorICAgICk7CisKK0VGSV9GSUxFX0hBTkRMRQorTGliT3BlblJvb3QgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgIERldmljZUhhbmRsZQorICAgICk7CisKK0VGSV9GSUxFX0lORk8gKgorTGliRmlsZUluZm8gKAorICAgIElOIEVGSV9GSUxFX0hBTkRMRSAgICAgIEZIYW5kCisgICAgKTsKKworRUZJX0ZJTEVfU1lTVEVNX0lORk8gKgorTGliRmlsZVN5c3RlbUluZm8gKAorICAgIElOIEVGSV9GSUxFX0hBTkRMRSAgICAgIEZIYW5kCisgICAgKTsKKworRUZJX0ZJTEVfU1lTVEVNX1ZPTFVNRV9MQUJFTF9JTkZPICoKK0xpYkZpbGVTeXN0ZW1Wb2x1bWVMYWJlbEluZm8gKAorICAgIElOIEVGSV9GSUxFX0hBTkRMRSAgICAgIEZIYW5kCisgICAgKTsKKworQk9PTEVBTgorVmFsaWRNQlIoCisgICAgSU4gIE1BU1RFUl9CT09UX1JFQ09SRCAgKk1iciwKKyAgICBJTiAgRUZJX0JMT0NLX0lPICAgICAgICAqQmxrSW8KKyAgICApOworCitCT09MRUFOCitMaWJNYXRjaERldmljZVBhdGhzICgKKyAgICBJTiAgRUZJX0RFVklDRV9QQVRIICpNdWx0aSwKKyAgICBJTiAgRUZJX0RFVklDRV9QQVRIICpTaW5nbGUKKyAgICApOworCitFRklfREVWSUNFX1BBVEggKgorTGliRHVwbGljYXRlRGV2aWNlUGF0aEluc3RhbmNlICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICpEZXZQYXRoCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0RldmljZVBhdGhGcm9tSGFuZGxlICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBIYW5kbGUKKyAgICApOworCitFRklfREVWSUNFX1BBVEggKgorRGV2aWNlUGF0aEluc3RhbmNlICgKKyAgICBJTiBPVVQgRUZJX0RFVklDRV9QQVRIICAqKkRldmljZVBhdGgsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgKlNpemUKKyAgICApOworCitVSU5UTgorRGV2aWNlUGF0aEluc3RhbmNlQ291bnQgKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICpEZXZpY2VQYXRoCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0FwcGVuZERldmljZVBhdGggKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICpTcmMxLAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICpTcmMyCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0FwcGVuZERldmljZVBhdGhOb2RlICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqU3JjMSwKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqU3JjMgorICAgICk7CisKK0VGSV9ERVZJQ0VfUEFUSCoKK0FwcGVuZERldmljZVBhdGhJbnN0YW5jZSAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAqU3JjLAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgKkluc3RhbmNlCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0ZpbGVEZXZpY2VQYXRoICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBEZXZpY2UgIE9QVElPTkFMLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICpGaWxlTmFtZQorICAgICk7CisKK1VJTlROCitEZXZpY2VQYXRoU2l6ZSAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKkRldlBhdGgKKyAgICApOworCitFRklfREVWSUNFX1BBVEggKgorRHVwbGljYXRlRGV2aWNlUGF0aCAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKkRldlBhdGgKKyAgICApOworCitFRklfREVWSUNFX1BBVEggKgorVW5wYWNrRGV2aWNlUGF0aCAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKkRldlBhdGgKKyAgICApOworCitFRklfU1RBVFVTCitMaWJEZXZpY2VQYXRoVG9JbnRlcmZhY2UgKAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqRmlsZVBhdGgsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgKipJbnRlcmZhY2UKKyAgICApOworCitDSEFSMTYgKgorRGV2aWNlUGF0aFRvU3RyICgKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAqRGV2UGF0aAorICAgICk7CisKKy8vCisvLyBCdWdCdWc6IEkgbmVlZCBteSBvd24gaW5jbHVkZSBmaWxlcworLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgIFJlZ2lzdGVyOworICAgIFVJTlQ4ICAgRnVuY3Rpb247CisgICAgVUlOVDggICBEZXZpY2U7CisgICAgVUlOVDggICBCdXM7CisgICAgVUlOVDMyICBSZXNlcnZlZDsKK30gRUZJX0FERFJFU1M7CisKK3R5cGVkZWYgdW5pb24geworICAgIFVJTlQ2NCAgICAgICAgICBBZGRyZXNzOworICAgIEVGSV9BRERSRVNTICAgICBFZmlBZGRyZXNzOworfSBFRklfUENJX0FERFJFU1NfVU5JT047CisKKworRUZJX1NUQVRVUworUGNpRmluZERldmljZUNsYXNzICgKKyAgICBJTiAgT1VUIEVGSV9QQ0lfQUREUkVTU19VTklPTiAgICpBZGRyZXNzLAorICAgIElOICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLAorICAgIElOICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgU3ViQ2xhc3MKKyAgICApOworCitFRklfU1RBVFVTCitQY2lGaW5kRGV2aWNlICgKKyAgICBJTiAgT1VUIEVGSV9QQ0lfQUREUkVTU19VTklPTiAgICpEZXZpY2VBZGRyZXNzLAorICAgIElOICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgVmVuZG9ySWQsCisgICAgSU4gICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBEZXZpY2VJZCwKKyAgICBJTiBPVVQgIFBDSV9UWVBFMDAgICAgICAgICAgICAgICpQY2kKKyAgICApOworCisvLworLy8gU0lNUExFX1JFQURfRklMRSBvYmplY3QgdXNlZCB0byBhY2Nlc3MgZmlsZXMKKy8vCisKK3R5cGVkZWYgVk9JRCAgICAgICAgKlNJTVBMRV9SRUFEX0ZJTEU7CisKK0VGSV9TVEFUVVMKK09wZW5TaW1wbGVSZWFkRmlsZSAoCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgIEJvb3RQb2xpY3ksCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpTb3VyY2VCdWZmZXIgICBPUFRJT05BTCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgU291cmNlU2l6ZSwKKyAgICBJTiBPVVQgRUZJX0RFVklDRV9QQVRIICAgICAgKipGaWxlUGF0aCwKKyAgICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgKkRldmljZUhhbmRsZSwgICAgCisgICAgT1VUIFNJTVBMRV9SRUFEX0ZJTEUgICAgICAgICpTaW1wbGVSZWFkSGFuZGxlCisgICAgKTsKKworRUZJX1NUQVRVUworUmVhZFNpbXBsZVJlYWRGaWxlICgKKyAgICBJTiBTSU1QTEVfUkVBRF9GSUxFICAgICBTaW1wbGVSZWFkSGFuZGxlLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAqUmVhZFNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKKworVk9JRAorQ2xvc2VTaW1wbGVSZWFkRmlsZSAoCisgICAgSU4gU0lNUExFX1JFQURfRklMRSAgICAgU2ltcGxlUmVhZEhhbmRsZQorICAgICk7CisKK1ZPSUQKK0luaXRpYWxpemVHdWlkICgKKyAgICBWT0lECisgICAgKTsKKworVUlOVDgKK0RlY2ltYWx0b0JDRCgKKyAgICBJTiAgVUlOVDggRGVjVmFsdWUKKyAgICApOworCitVSU5UOAorQkNEdG9EZWNpbWFsKAorICAgIElOICBVSU5UOCBCY2RWYWx1ZQorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYkdldFN5c3RlbUNvbmZpZ3VyYXRpb25UYWJsZSgKKyAgICBJTiBFRklfR1VJRCAqVGFibGVHdWlkLAorICAgIElOIE9VVCBWT0lEICoqVGFibGUKKyAgICApOworCitCT09MRUFOCitMaWJJc1ZhbGlkVGV4dEdyYXBoaWNzICgKKyAgICBJTiAgQ0hBUjE2ICBHcmFwaGljLCAgIAorICAgIE9VVCBDSEFSOCAgICpQY0Fuc2ksICAgIE9QVElPTkFMCisgICAgT1VUIENIQVI4ICAgKkFzY2lpICAgICAgT1BUSU9OQUwKKyAgICApOworCitCT09MRUFOCitJc1ZhbGlkQXNjaWkgKAorICAgIElOICBDSEFSMTYgIEFzY2lpCisgICAgKTsKKworQk9PTEVBTgorSXNWYWxpZEVmaUNudGxDaGFyICgKKyAgICBJTiAgQ0hBUjE2ICBjCisgICAgKTsKKworQ0hBUjE2ICoKK0xpYkdldFVpU3RyaW5nICgKKyAgICBJTiAgRUZJX0hBTkRMRSAgICAgIEhhbmRsZSwKKyAgICBJTiAgVUlfU1RSSU5HX1RZUEUgIFN0cmluZ1R5cGUsCisgICAgSU4gIElTT182MzlfMiAgICAgICAqTGFuZ0NvZGUsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBSZXR1cm5EZXZpY2VQYXRoU3RyT25NaXNtYXRjaAorICAgICk7CisKK0NIQVI4KgorTGliR2V0U21iaW9zU3RyaW5nICgKKyAgICBJTiAgU01CSU9TX1NUUlVDVFVSRV9QT0lOVEVSICAgICpTbWJpb3MsCisgICAgSU4gIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdOdW1iZXIKKyAgICApOworCitFRklfU1RBVFVTCitMaWJHZXRTbWJpb3NTeXN0ZW1HdWlkQW5kU2VyaWFsTnVtYmVyICgKKyAgICBJTiAgRUZJX0dVSUQgICAgKlN5c3RlbUd1aWQsCisgICAgT1VUIENIQVI4ICAgICAgICoqU3lzdGVtU2VyaWFsTnVtYmVyCisgICAgKTsKKworCitFRklfU1RBVFVTCitJbml0aWFsaXplR2xvYmFsSW9EZXZpY2UgKAorICAgICAgICBJTiAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICpEZXZpY2VQYXRoLAorICAgICAgICBJTiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICAgICAgSU4gIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAqRXJyb3JTdHIsCisgICAgICAgIE9VVCBFRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgICAgKipHbG9iYWxJb0ZuY3MgCisgICAgICAgICk7CisKK1VJTlQzMiAKK1JlYWRQb3J0ICgKKyAgICAgICAgSU4gIEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAgICAqR2xvYmFsSW9GbmNzLCAKKyAgICAgICAgSU4gIEVGSV9JT19XSURUSCAgICAgICAgICAgICAgICBXaWR0aCwKKyAgICAgICAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBQb3J0CisgICAgICAgICk7CisKK1VJTlQzMiAKK1dyaXRlUG9ydCAoCisgICAgICAgIElOICBFRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgICAgKkdsb2JhbElvRm5jcywgCisgICAgICAgIElOICBFRklfSU9fV0lEVEggICAgICAgICAgICAgICAgV2lkdGgsCisgICAgICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgUG9ydCwKKyAgICAgICAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBEYXRhCisgICAgICAgICk7CisKK1VJTlQzMiAKK1JlYWRQY2lDb25maWcgKAorICAgICAgICBJTiAgRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICAgICpHbG9iYWxJb0ZuY3MsIAorICAgICAgICBJTiAgRUZJX0lPX1dJRFRIICAgICAgICAgICAgICAgIFdpZHRoLAorICAgICAgICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIFBvcnQKKyAgICAgICAgKTsKKworVUlOVDMyIAorV3JpdGVQY2lDb25maWcgKAorICAgICAgICBJTiAgRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICAgICpHbG9iYWxJb0ZuY3MsIAorICAgICAgICBJTiAgRUZJX0lPX1dJRFRIICAgICAgICAgICAgICAgIFdpZHRoLAorICAgICAgICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIFBvcnQsCisgICAgICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgRGF0YQorICAgICAgICApOworCitleHRlcm4gRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpHbG9iYWxJb0ZuY3M7CisKKyNkZWZpbmUgb3V0cChfUG9ydCwgX0RhdGFCeXRlKSAgKFVJTlQ4KVdyaXRlUG9ydChHbG9iYWxJb0ZuY3MsICBJT19VSU5UOCwgIChVSU5UTilfUG9ydCwgKFVJTlROKV9EYXRhQnl0ZSkKKyNkZWZpbmUgaW5wKF9Qb3J0KSAgICAgICAgICAgICAgKFVJTlQ4KVJlYWRQb3J0KEdsb2JhbElvRm5jcywgICBJT19VSU5UOCwgIChVSU5UTilfUG9ydCkKKyNkZWZpbmUgb3V0cHcoX1BvcnQsIF9EYXRhQnl0ZSkgKFVJTlQxNilXcml0ZVBvcnQoR2xvYmFsSW9GbmNzLCBJT19VSU5UMTYsIChVSU5UTilfUG9ydCwgKFVJTlROKV9EYXRhQnl0ZSkKKyNkZWZpbmUgaW5wdyhfUG9ydCkgICAgICAgICAgICAgKFVJTlQxNilSZWFkUG9ydChHbG9iYWxJb0ZuY3MsICBJT19VSU5UMTYsIChVSU5UTilfUG9ydCkKKyNkZWZpbmUgb3V0cGQoX1BvcnQsIF9EYXRhQnl0ZSkgKFVJTlQzMilXcml0ZVBvcnQoR2xvYmFsSW9GbmNzLCBJT19VSU5UMzIsIChVSU5UTilfUG9ydCwgKFVJTlROKV9EYXRhQnl0ZSkKKyNkZWZpbmUgaW5wZChfUG9ydCkgICAgICAgICAgICAgKFVJTlQzMilSZWFkUG9ydChHbG9iYWxJb0ZuY3MsICBJT19VSU5UMzIsIChVSU5UTilfUG9ydCkKKworI2RlZmluZSB3cml0ZXBjaTgoX0FkZHIsIF9EYXRhQnl0ZSkgIChVSU5UOClXcml0ZVBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsICBJT19VSU5UOCwgIChVSU5UTilfQWRkciwgKFVJTlROKV9EYXRhQnl0ZSkKKyNkZWZpbmUgcmVhZHBjaTgoX0FkZHIpICAgICAgICAgICAgICAoVUlOVDgpUmVhZFBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsICAgSU9fVUlOVDgsICAoVUlOVE4pX0FkZHIpCisjZGVmaW5lIHdyaXRlcGNpMTYoX0FkZHIsIF9EYXRhQnl0ZSkgKFVJTlQxNilXcml0ZVBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsIElPX1VJTlQxNiwgKFVJTlROKV9BZGRyLCAoVUlOVE4pX0RhdGFCeXRlKQorI2RlZmluZSByZWFkcGNpMTYoX0FkZHIpICAgICAgICAgICAgIChVSU5UMTYpUmVhZFBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsICBJT19VSU5UMTYsIChVSU5UTilfQWRkcikKKyNkZWZpbmUgd3JpdGVwY2kzMihfQWRkciwgX0RhdGFCeXRlKSAoVUlOVDMyKVdyaXRlUGNpQ29uZmlnKEdsb2JhbElvRm5jcywgSU9fVUlOVDMyLCAoVUlOVE4pX0FkZHIsIChVSU5UTilfRGF0YUJ5dGUpCisjZGVmaW5lIHJlYWRwY2kzMihfQWRkcikgICAgICAgICAgICAgKFVJTlQzMilSZWFkUGNpQ29uZmlnKEdsb2JhbElvRm5jcywgIElPX1VJTlQzMiwgKFVJTlROKV9BZGRyKQorCisjZGVmaW5lIFBhdXNlKCkgICAgICAgICAgICAgV2FpdEZvclNpbmdsZUV2ZW50IChTVC0+Q29uSW4tPldhaXRGb3JLZXksIDApCisjZGVmaW5lIFBvcnQ4MChfUG9zdENvZGUpICAgR2xvYmFsSW9GbmNzLT5Jby5Xcml0ZSAoR2xvYmFsSW9GbmNzLCBJT19VSU5UMTYsIChVSU5UNjQpMHg4MCwgMSwgJihfUG9zdENvZGUpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWxpbmsuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaWxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmZmNGZhCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpbGluay5oCkBAIC0wLDAgKzEsMTc3IEBACisjaWZuZGVmIF9FRklfTElOS19ICisjZGVmaW5lIF9FRklfTElOS19ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGxpbmsuaCAocmVuYW1lZCBlZmlsaW5rLmggdG8gYXZvaWQgY29uZmxpY3RzKQorCitBYnN0cmFjdDoKKworICAgIEVGSSBsaW5rIGxpc3QgbWFjcm8ncworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpZm5kZWYgRUZJX05UX0VNVUwKKworLy8KKy8vIExpc3QgZW50cnkgLSBkb3VibHkgbGlua2VkIGxpc3QKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9MSVNUX0VOVFJZIHsKKyAgICBzdHJ1Y3QgX0xJU1RfRU5UUlkgICpGbGluazsKKyAgICBzdHJ1Y3QgX0xJU1RfRU5UUlkgICpCbGluazsKK30gTElTVF9FTlRSWTsKKworI2VuZGlmIAorCisKKy8vCisvLyAgVk9JRAorLy8gIEluaXRpYWxpemVMaXN0SGVhZCgKKy8vICAgICAgTElTVF9FTlRSWSAqTGlzdEhlYWQKKy8vICAgICAgKTsKKy8vCisKKyNkZWZpbmUgSW5pdGlhbGl6ZUxpc3RIZWFkKExpc3RIZWFkKSBcCisgICAgKExpc3RIZWFkKS0+RmxpbmsgPSBMaXN0SGVhZDsgICAgXAorICAgIChMaXN0SGVhZCktPkJsaW5rID0gTGlzdEhlYWQ7CisKKy8vCisvLyAgQk9PTEVBTgorLy8gIElzTGlzdEVtcHR5KAorLy8gICAgICBQTElTVF9FTlRSWSBMaXN0SGVhZAorLy8gICAgICApOworLy8KKworI2RlZmluZSBJc0xpc3RFbXB0eShMaXN0SGVhZCkgXAorICAgICgoTGlzdEhlYWQpLT5GbGluayA9PSAoTGlzdEhlYWQpKQorCisvLworLy8gIFZPSUQKKy8vICBSZW1vdmVFbnRyeUxpc3QoCisvLyAgICAgIFBMSVNUX0VOVFJZIEVudHJ5CisvLyAgICAgICk7CisvLworCisjZGVmaW5lIF9SZW1vdmVFbnRyeUxpc3QoRW50cnkpIHsgICAgICAgXAorICAgICAgICBMSVNUX0VOVFJZICpfQmxpbmssICpfRmxpbms7ICAgIFwKKyAgICAgICAgX0ZsaW5rID0gKEVudHJ5KS0+Rmxpbms7ICAgICAgICBcCisgICAgICAgIF9CbGluayA9IChFbnRyeSktPkJsaW5rOyAgICAgICAgXAorICAgICAgICBfQmxpbmstPkZsaW5rID0gX0ZsaW5rOyAgICAgICAgIFwKKyAgICAgICAgX0ZsaW5rLT5CbGluayA9IF9CbGluazsgICAgICAgICBcCisgICAgICAgIH0KKworI2lmIEVGSV9ERUJVRworICAgICNkZWZpbmUgUmVtb3ZlRW50cnlMaXN0KEVudHJ5KSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9SZW1vdmVFbnRyeUxpc3QoRW50cnkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKEVudHJ5KS0+RmxpbmsgPSAoTElTVF9FTlRSWSAqKSBCQURfUE9JTlRFUjsgICAgXAorICAgICAgICAoRW50cnkpLT5CbGluayA9IChMSVNUX0VOVFJZICopIEJBRF9QT0lOVEVSOyAKKyNlbHNlCisgICAgI2RlZmluZSBSZW1vdmVFbnRyeUxpc3QoRW50cnkpICAgICAgXAorICAgICAgICBfUmVtb3ZlRW50cnlMaXN0KEVudHJ5KTsKKyNlbmRpZgorCisvLworLy8gIFZPSUQKKy8vICBJbnNlcnRUYWlsTGlzdCgKKy8vICAgICAgUExJU1RfRU5UUlkgTGlzdEhlYWQsCisvLyAgICAgIFBMSVNUX0VOVFJZIEVudHJ5CisvLyAgICAgICk7CisvLworCisjZGVmaW5lIEluc2VydFRhaWxMaXN0KExpc3RIZWFkLEVudHJ5KSB7XAorICAgIExJU1RfRU5UUlkgKl9MaXN0SGVhZCwgKl9CbGluazsgICAgIFwKKyAgICBfTGlzdEhlYWQgPSAoTGlzdEhlYWQpOyAgICAgICAgICAgICBcCisgICAgX0JsaW5rID0gX0xpc3RIZWFkLT5CbGluazsgICAgICAgICAgXAorICAgIChFbnRyeSktPkZsaW5rID0gX0xpc3RIZWFkOyAgICAgICAgIFwKKyAgICAoRW50cnkpLT5CbGluayA9IF9CbGluazsgICAgICAgICAgICBcCisgICAgX0JsaW5rLT5GbGluayA9IChFbnRyeSk7ICAgICAgICAgICAgXAorICAgIF9MaXN0SGVhZC0+QmxpbmsgPSAoRW50cnkpOyAgICAgICAgIFwKKyAgICB9CisKKy8vCisvLyAgVk9JRAorLy8gIEluc2VydEhlYWRMaXN0KAorLy8gICAgICBQTElTVF9FTlRSWSBMaXN0SGVhZCwKKy8vICAgICAgUExJU1RfRU5UUlkgRW50cnkKKy8vICAgICAgKTsKKy8vCisKKyNkZWZpbmUgSW5zZXJ0SGVhZExpc3QoTGlzdEhlYWQsRW50cnkpIHtcCisgICAgTElTVF9FTlRSWSAqX0xpc3RIZWFkLCAqX0ZsaW5rOyAgICAgXAorICAgIF9MaXN0SGVhZCA9IChMaXN0SGVhZCk7ICAgICAgICAgICAgIFwKKyAgICBfRmxpbmsgPSBfTGlzdEhlYWQtPkZsaW5rOyAgICAgICAgICBcCisgICAgKEVudHJ5KS0+RmxpbmsgPSBfRmxpbms7ICAgICAgICAgICAgXAorICAgIChFbnRyeSktPkJsaW5rID0gX0xpc3RIZWFkOyAgICAgICAgIFwKKyAgICBfRmxpbmstPkJsaW5rID0gKEVudHJ5KTsgICAgICAgICAgICBcCisgICAgX0xpc3RIZWFkLT5GbGluayA9IChFbnRyeSk7ICAgICAgICAgXAorICAgIH0KKworLy8gIFZPSUQKKy8vICBTd2FwTGlzdEVudHJpZXMoCisvLyAgICAgIFBMSVNUX0VOVFJZIEVudHJ5MSwKKy8vICAgICAgUExJU1RfRU5UUlkgRW50cnkyCisvLyAgICAgICk7CisvLworLy8gUHV0IEVudHJ5MiBiZWZvcmUgRW50cnkxCisvLworI2RlZmluZSBTd2FwTGlzdEVudHJpZXMoRW50cnkxLEVudHJ5Mikge1wKKyAgICBMSVNUX0VOVFJZICpFbnRyeTFGbGluaywgKkVudHJ5MUJsaW5rOyAgICAgXAorICAgIExJU1RfRU5UUlkgKkVudHJ5MkZsaW5rLCAqRW50cnkyQmxpbms7ICAgICBcCisgICAgRW50cnkyRmxpbmsgPSAoRW50cnkyKS0+Rmxpbms7ICAgICAgICAgICAgIFwKKyAgICBFbnRyeTJCbGluayA9IChFbnRyeTIpLT5CbGluazsgICAgICAgICAgICAgXAorICAgIEVudHJ5MUZsaW5rID0gKEVudHJ5MSktPkZsaW5rOyAgICAgICAgICAgICBcCisgICAgRW50cnkxQmxpbmsgPSAoRW50cnkxKS0+Qmxpbms7ICAgICAgICAgICAgIFwKKyAgICBFbnRyeTJCbGluay0+RmxpbmsgPSBFbnRyeTJGbGluazsgICAgICAgXAorICAgIEVudHJ5MkZsaW5rLT5CbGluayA9IEVudHJ5MkJsaW5rOyAgICAgICAgXAorICAgIChFbnRyeTIpLT5GbGluayA9IEVudHJ5MTsgICAgICAgICAgICAgICBcCisgICAgKEVudHJ5MiktPkJsaW5rID0gRW50cnkxQmxpbms7ICAgICAgICAgIFwKKyAgICBFbnRyeTFCbGluay0+RmxpbmsgPSAoRW50cnkyKTsgICAgICAgICAgICBcCisgICAgKEVudHJ5MSktPkJsaW5rID0gKEVudHJ5Mik7ICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vCisvLyAgRUZJX0ZJRUxEX09GRlNFVCAtIHJldHVybnMgdGhlIGJ5dGUgb2Zmc2V0IHRvIGEgZmllbGQgd2l0aGluIGEgc3RydWN0dXJlCisvLworCisjZGVmaW5lIEVGSV9GSUVMRF9PRkZTRVQoVFlQRSxGaWVsZCkgKChVSU5UTikoJigoKFRZUEUgKikgMCktPkZpZWxkKSkpCisKKy8vCisvLyAgQ09OVEFJTklOR19SRUNPUkQgLSByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlCisvLyAgICAgIGZyb20gb25lIG9mIGl0J3MgZWxlbWVudHMuCisvLworCisjZGVmaW5lIF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKSAgXAorICAgICgoVFlQRSAqKSAoIChDSEFSOCAqKShSZWNvcmQpIC0gKENIQVI4ICopICYoKChUWVBFICopIDApLT5GaWVsZCkpKQorCisjaWYgRUZJX0RFQlVHCisgICAgI2RlZmluZSBDUihSZWNvcmQsIFRZUEUsIEZpZWxkLCBTaWcpICAgICBcCisgICAgICAgIF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKS0+U2lnbmF0dXJlICE9IFNpZyA/ICAgICAgICBcCisgICAgICAgICAgICAoVFlQRSAqKSBBU1NFUlRfU1RSVUNUKF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKSwgUmVjb3JkKSA6IFwKKyAgICAgICAgICAgIF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKQorI2Vsc2UKKyAgICAjZGVmaW5lIENSKFJlY29yZCwgVFlQRSwgRmllbGQsIFNpZ25hdHVyZSkgICBcCisgICAgICAgIF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2VuZGlmCisKKworLy8KKy8vIEEgbG9jayBzdHJ1Y3R1cmUKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9GTE9DSyB7CisgICAgRUZJX1RQTCAgICAgVHBsOworICAgIEVGSV9UUEwgICAgIE93bmVyVHBsOworICAgIFVJTlROICAgICAgIExvY2s7Cit9IEZMT0NLOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvZWZpbmV0LmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmluZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU1YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpbmV0LmgKQEAgLTAsMCArMSwzNDAgQEAKKyNpZm5kZWYgX0VGSU5FVF9ICisjZGVmaW5lIF9FRklORVRfSAorCisKKy8qKysKK0NvcHlyaWdodCAoYykgMTk5OSAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisgICAgZWZpbmV0LmgKKworQWJzdHJhY3Q6CisgICAgRUZJIFNpbXBsZSBOZXR3b3JrIHByb3RvY29sCisKK1JldmlzaW9uIEhpc3RvcnkKKy0tKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgICBTaW1wbGUgTmV0d29yayBQcm90b2NvbAorLy8KKworI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgXAorICAgIHsgMHhBMTk4MzJCOSwgMHhBQzI1LCAweDExRDMsIHsweDlBLCAweDJELCAweDAwLCAweDkwLCAweDI3LCAweDNGLCAweEMxLCAweDREfSB9CisKKworSU5URVJGQUNFX0RFQ0woX0VGSV9TSU1QTEVfTkVUV09SSyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvLworICAgIC8vIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQuICBJbmNsdWRlcyBmcmFtZXMgd2l0aCBlcnJvcnMgYW5kCisgICAgLy8gZHJvcHBlZCBmcmFtZXMuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4VG90YWxGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiB2YWxpZCBmcmFtZXMgcmVjZWl2ZWQgYW5kIGNvcGllZCBpbnRvIHJlY2VpdmUgYnVmZmVycy4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhHb29kRnJhbWVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIGJlbG93IHRoZSBtaW5pbXVtIGxlbmd0aCBmb3IgdGhlIG1lZGlhLgorICAgIC8vIFRoaXMgd291bGQgYmUgPDY0IGZvciBldGhlcm5ldC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhVbmRlcnNpemVGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBmcmFtZXMgbG9uZ2VyIHRoYW4gdGhlIG1heG1pbnVtIGxlbmd0aCBmb3IgdGhlCisgICAgLy8gbWVkaWEuICBUaGlzIHdvdWxkIGJlID4xNTAwIGZvciBldGhlcm5ldC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhPdmVyc2l6ZUZyYW1lczsKKworICAgIC8vCisgICAgLy8gVmFsaWQgZnJhbWVzIHRoYXQgd2VyZSBkcm9wcGVkIGJlY2F1c2UgcmVjZWl2ZSBidWZmZXJzIHdlcmUgZnVsbC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhEcm9wcGVkRnJhbWVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgdmFsaWQgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgYW5kIG5vdCBkcm9wcGVkLgorICAgIC8vCisgICAgVUlOVDY0ICBSeFVuaWNhc3RGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiB2YWxpZCBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIGFuZCBub3QgZHJvcHBlZC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhCcm9hZGNhc3RGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiB2YWxpZCBtdXRsaWNhc3QgZnJhbWVzIHJlY2VpdmVkIGFuZCBub3QgZHJvcHBlZC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhNdWx0aWNhc3RGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBmcmFtZXMgdy8gQ1JDIG9yIGFsaWdubWVudCBlcnJvcnMuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4Q3JjRXJyb3JGcmFtZXM7CisKKyAgICAvLworICAgIC8vIFRvdGFsIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4gIEluY2x1ZGVzIGZyYW1lcyB3aXRoIGVycm9ycworICAgIC8vIGFuZCBkcm9wcGVkIGZyYW1lcy4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhUb3RhbEJ5dGVzOworCisgICAgLy8KKyAgICAvLyBUcmFuc21pdCBzdGF0aXN0aWNzLgorICAgIC8vCisgICAgVUlOVDY0ICBUeFRvdGFsRnJhbWVzOworICAgIFVJTlQ2NCAgVHhHb29kRnJhbWVzOworICAgIFVJTlQ2NCAgVHhVbmRlcnNpemVGcmFtZXM7CisgICAgVUlOVDY0ICBUeE92ZXJzaXplRnJhbWVzOworICAgIFVJTlQ2NCAgVHhEcm9wcGVkRnJhbWVzOworICAgIFVJTlQ2NCAgVHhVbmljYXN0RnJhbWVzOworICAgIFVJTlQ2NCAgVHhCcm9hZGNhc3RGcmFtZXM7CisgICAgVUlOVDY0ICBUeE11bHRpY2FzdEZyYW1lczsKKyAgICBVSU5UNjQgIFR4Q3JjRXJyb3JGcmFtZXM7CisgICAgVUlOVDY0ICBUeFRvdGFsQnl0ZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBjb2xsaXNpb25zIGRldGVjdGlvbiBvbiB0aGlzIHN1Ym5ldC4KKyAgICAvLworICAgIFVJTlQ2NCAgQ29sbGlzaW9uczsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBkZXN0aW5lZCBmb3IgdW5zdXBwb3J0ZWQgcHJvdG9jb2wuCisgICAgLy8KKyAgICBVSU5UNjQgIFVuc3VwcG9ydGVkUHJvdG9jb2w7CisKK30gRUZJX05FVFdPUktfU1RBVElTVElDUzsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBFZmlTaW1wbGVOZXR3b3JrU3RvcHBlZCwKKyAgICBFZmlTaW1wbGVOZXR3b3JrU3RhcnRlZCwKKyAgICBFZmlTaW1wbGVOZXR3b3JrSW5pdGlhbGl6ZWQsCisgICAgRWZpU2ltcGxlTmV0d29ya01heFN0YXRlCit9IEVGSV9TSU1QTEVfTkVUV09SS19TVEFURTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKworI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9VTklDQVNUICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9NVUxUSUNBU1QgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9CUk9BRENBU1QgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9QUk9NSVNDVU9VUyAgICAgICAgICAgMHgwOAorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9QUk9NSVNDVU9VU19NVUxUSUNBU1QgMHgxMAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCisjZGVmaW5lIEVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFX0lOVEVSUlVQVCAgICAgICAgMHgwMQorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfVFJBTlNNSVRfSU5URVJSVVBUICAgICAgIDB4MDIKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX0NPTU1BTkRfSU5URVJSVVBUICAgICAgICAweDA0CisjZGVmaW5lIEVGSV9TSU1QTEVfTkVUV09SS19TT0ZUV0FSRV9JTlRFUlJVUFQgICAgICAgMHgwOAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworI2RlZmluZSBNQVhfTUNBU1RfRklMVEVSX0NOVCAgICAxNgordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBTdGF0ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgSHdBZGRyZXNzU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgTWVkaWFIZWFkZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBNYXhQYWNrZXRTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBOdlJhbVNpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIE52UmFtQWNjZXNzU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZUZpbHRlck1hc2s7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVGaWx0ZXJTZXR0aW5nOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBNYXhNQ2FzdEZpbHRlckNvdW50OworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBNQ2FzdEZpbHRlckNvdW50OworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNQ2FzdEZpbHRlcltNQVhfTUNBU1RfRklMVEVSX0NOVF07CisgICAgRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzOworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICBCcm9hZGNhc3RBZGRyZXNzOworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICBQZXJtYW5lbnRBZGRyZXNzOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBJZlR5cGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIE1hY0FkZHJlc3NDaGFuZ2VhYmxlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZVR4U3VwcG9ydGVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBNZWRpYVByZXNlbnRTdXBwb3J0ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIE1lZGlhUHJlc2VudDsKK30gRUZJX1NJTVBMRV9ORVRXT1JLX01PREU7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1NUQVJUKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19TVE9QKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19JTklUSUFMSVpFKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBFeHRyYVJ4QnVmZmVyU2l6ZSAgT1BUSU9OQUwsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIEV4dHJhVHhCdWZmZXJTaXplICBPUFRJT05BTAorKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfUkVTRVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRWZXJpZmljYXRpb24KKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1NIVVRET1dOKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFX0ZJTFRFUlMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIFJlc2V0TUNhc3RGaWx0ZXIsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBNQ2FzdEZpbHRlckNudCAgICAgT1BUSU9OQUwsCisgICAgSU4gRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICAqTUNhc3RGaWx0ZXIgICAgICAgT1BUSU9OQUwKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1NUQVRJT05fQUREUkVTUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBSZXNldCwKKyAgICBJTiBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICpOZXcgICAgICBPUFRJT05BTAorKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfU1RBVElTVElDUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBSZXNldCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpTdGF0aXN0aWNzU2l6ZSAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfTkVUV09SS19TVEFUSVNUSUNTICAgICAgKlN0YXRpc3RpY3NUYWJsZSAgT1BUSU9OQUwKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX01DQVNUX0lQX1RPX01BQykgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBJUHY2LAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgKklQLAorICAgIE9VVCBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgKk1BQworKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfTlZEQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBSZWFkV3JpdGUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZSwKKyAgICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfR0VUX1NUQVRVUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAqVGhpcywKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgKkludGVycnVwdFN0YXR1cyAgT1BUSU9OQUwsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICoqVHhCdWYgICAgICAgICAgIE9QVElPTkFMCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19UUkFOU01JVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAgKlRoaXMsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJTaXplLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIsCisgICAgSU4gRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICAqU3JjQWRkciAgICAgT1BUSU9OQUwsCisgICAgSU4gRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICAqRGVzdEFkZHIgICAgT1BUSU9OQUwsCisgICAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAqUHJvdG9jb2wgICAgT1BUSU9OQUwKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKkhlYWRlclNpemUgIE9QVElPTkFMLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyLAorICAgIE9VVCBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgKlNyY0FkZHIgICAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgKkRlc3RBZGRyICAgIE9QVElPTkFMLAorICAgIE9VVCBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgKlByb3RvY29sICAgIE9QVElPTkFMCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCisjZGVmaW5lIEVGSV9TSU1QTEVfTkVUV09SS19JTlRFUkZBQ0VfUkVWSVNJT04gICAweDAwMDEwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIEVGSV9TSU1QTEVfTkVUV09SS19TVEFSVCAgICAgICAgICAgIFN0YXJ0OworICAgIEVGSV9TSU1QTEVfTkVUV09SS19TVE9QICAgICAgICAgICAgIFN0b3A7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX0lOSVRJQUxJWkUgICAgICAgSW5pdGlhbGl6ZTsKKyAgICBFRklfU0lNUExFX05FVFdPUktfUkVTRVQgICAgICAgICAgICBSZXNldDsKKyAgICBFRklfU0lNUExFX05FVFdPUktfU0hVVERPV04gICAgICAgICBTaHV0ZG93bjsKKyAgICBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9GSUxURVJTICBSZWNlaXZlRmlsdGVyczsKKyAgICBFRklfU0lNUExFX05FVFdPUktfU1RBVElPTl9BRERSRVNTICBTdGF0aW9uQWRkcmVzczsKKyAgICBFRklfU0lNUExFX05FVFdPUktfU1RBVElTVElDUyAgICAgICBTdGF0aXN0aWNzOworICAgIEVGSV9TSU1QTEVfTkVUV09SS19NQ0FTVF9JUF9UT19NQUMgIE1DYXN0SXBUb01hYzsKKyAgICBFRklfU0lNUExFX05FVFdPUktfTlZEQVRBICAgICAgICAgICBOdkRhdGE7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX0dFVF9TVEFUVVMgICAgICAgR2V0U3RhdHVzOworICAgIEVGSV9TSU1QTEVfTkVUV09SS19UUkFOU01JVCAgICAgICAgIFRyYW5zbWl0OworICAgIEVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFICAgICAgICAgIFJlY2VpdmU7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FpdEZvclBhY2tldDsKKyAgICBFRklfU0lNUExFX05FVFdPUktfTU9ERSAgICAgICAgICAgICAqTW9kZTsKK30gRUZJX1NJTVBMRV9ORVRXT1JLOworCisjZW5kaWYgLyogX0VGSU5FVF9IICovCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9lZmlwYXJ0LmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlwYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjNTU3MwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaXBhcnQuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9FRklfUEFSVF9ICisjZGVmaW5lIF9FRklfUEFSVF9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaXBhcnQuaAorICAgIAorQWJzdHJhY3Q6ICAgCisgICAgSW5mbyBhYm91dCBkaXNrIHBhcnRpdGlvbnMgYW5kIE1hc3RlciBCb290IFJlY29yZHMKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLworLy8KKworI2RlZmluZSBFRklfUEFSVElUSU9OICAgMHhlZgorI2RlZmluZSBNQlJfU0laRSAgICAgICAgNTEyCisKKyNwcmFnbWEgcGFjaygxKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgQm9vdEluZGljYXRvcjsKKyAgICBVSU5UOCAgICAgICBTdGFydEhlYWQ7CisgICAgVUlOVDggICAgICAgU3RhcnRTZWN0b3I7CisgICAgVUlOVDggICAgICAgU3RhcnRUcmFjazsKKyAgICBVSU5UOCAgICAgICBPU0luZGljYXRvcjsKKyAgICBVSU5UOCAgICAgICBFbmRIZWFkOworICAgIFVJTlQ4ICAgICAgIEVuZFNlY3RvcjsKKyAgICBVSU5UOCAgICAgICBFbmRUcmFjazsKKyAgICBVSU5UOCAgICAgICBTdGFydGluZ0xCQVs0XTsKKyAgICBVSU5UOCAgICAgICBTaXplSW5MQkFbNF07Cit9IE1CUl9QQVJUSVRJT05fUkVDT1JEOworCisjZGVmaW5lIEVYVFJBQ1RfVUlOVDMyKEQpIChVSU5UMzIpKERbMF0gfCAoRFsxXSA8PCA4KSB8IChEWzJdIDw8IDE2KSB8IChEWzNdIDw8IDI0KSkKKworI2RlZmluZSBNQlJfU0lHTkFUVVJFICAgICAgICAgICAweGFhNTUKKyNkZWZpbmUgTUlOX01CUl9ERVZJQ0VfU0laRSAgICAgMHg4MDAwMAorI2RlZmluZSBNQlJfRVJSQVRBX1BBRCAgICAgICAgICAweDQwMDAwIC8vIDEyOCBNQgorCisjZGVmaW5lIE1BWF9NQlJfUEFSVElUSU9OUyAgNCAgIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEJvb3RTdHJhcENvZGVbNDQwXTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBVbmlxdWVNYnJTaWduYXR1cmVbNF07CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgVW5rbm93blsyXTsKKyAgICBNQlJfUEFSVElUSU9OX1JFQ09SRCAgICBQYXJ0aXRpb25bTUFYX01CUl9QQVJUSVRJT05TXTsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBTaWduYXR1cmU7Cit9IE1BU1RFUl9CT09UX1JFQ09SRDsKKyNwcmFnbWEgcGFjaygpCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9lZmlwY2lpby5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpcGNpaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI0Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpcGNpaW8uaApAQCAtMCwwICsxLDIxOSBAQAorI2lmbmRlZiBfRUZJX1BDSV9JT19ICisjZGVmaW5lIF9FRklfUENJX0lPX0gKKworI2RlZmluZSBFRklfUENJX0lPX1BST1RPQ09MIFwKKyAgICB7IDB4NGNmNWIyMDAsIDB4NjhiOCwgMHg0Y2E1LCB7MHg5ZSwgMHhlYywgMHhiMiwgMHgzZSwgMHgzZiwgMHg1MCwgMHgwMiwgMHg5YX0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX1BDSV9JTyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpUGNpSW9XaWR0aFVpbnQ4LAorICAgIEVmaVBjaUlvV2lkdGhVaW50MTYsCisgICAgRWZpUGNpSW9XaWR0aFVpbnQzMiwKKyAgICBFZmlQY2lJb1dpZHRoVWludDY0LAorICAgIEVmaVBjaUlvV2lkdGhGaWZvVWludDgsCisgICAgRWZpUGNpSW9XaWR0aEZpZm9VaW50MTYsCisgICAgRWZpUGNpSW9XaWR0aEZpZm9VaW50MzIsCisgICAgRWZpUGNpSW9XaWR0aEZpZm9VaW50NjQsCisgICAgRWZpUGNpSW9XaWR0aEZpbGxVaW50OCwKKyAgICBFZmlQY2lJb1dpZHRoRmlsbFVpbnQxNiwKKyAgICBFZmlQY2lJb1dpZHRoRmlsbFVpbnQzMiwKKyAgICBFZmlQY2lJb1dpZHRoRmlsbFVpbnQ2NCwKKyAgICBFZmlQY2lJb1dpZHRoTWF4aW11bQorfSBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIOworCisjZGVmaW5lIEVGSV9QQ0lfSU9fUEFTU19USFJPVUdIX0JBUiAweGZmCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfUE9MTF9JT19NRU0pICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIICBXaWR0aCwKKyAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgQmFySW5kZXgsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgTWFzaywKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgVmFsdWUsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIERlbGF5LAorICBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAqUmVzdWx0CisgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfSU9fTUVNKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTF9XSURUSCAgV2lkdGgsCisgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgIEJhckluZGV4LAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgIENvdW50LAorICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAqQnVmZmVyCispOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfSU9fTUVNICAgIFJlYWQ7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfSU9fTUVNICAgIFdyaXRlOworfSBFRklfUENJX0lPX1BST1RPQ09MX0FDQ0VTUzsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUcpICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIICBXaWR0aCwKKyAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICBDb3VudCwKKyAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfUENJX0lPX1BST1RPQ09MX0NPTkZJRyBSZWFkOworICBFRklfUENJX0lPX1BST1RPQ09MX0NPTkZJRyBXcml0ZTsKK30gRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUdfQUNDRVNTOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0NPUFlfTUVNKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTF9XSURUSCAgV2lkdGgsCisgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgIERlc3RCYXJJbmRleCwKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgRGVzdE9mZnNldCwKKyAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgU3JjQmFySW5kZXgsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIFNyY09mZnNldCwKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgQ291bnQKKyAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFZmlQY2lJb09wZXJhdGlvbkJ1c01hc3RlclJlYWQsCisgICAgRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJXcml0ZSwKKyAgICBFZmlQY2lJb09wZXJhdGlvbkJ1c01hc3RlckNvbW1vbkJ1ZmZlciwKKyAgICBFZmlQY2lJb09wZXJhdGlvbk1heGltdW0KK30gRUZJX1BDSV9JT19QUk9UT0NPTF9PUEVSQVRJT047CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfTUFQKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAgICAqVGhpcywKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTF9PUEVSQVRJT04gT3BlcmF0aW9uLAorICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAqSG9zdEFkZHJlc3MsCisgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICpOdW1iZXJPZkJ5dGVzLAorICBPVVQgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAqRGV2aWNlQWRkcmVzcywKKyAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKipNYXBwaW5nCisgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfVU5NQVApICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAqTWFwcGluZworKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9BTExPQ0FURV9CVUZGRVIpICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBFRklfQUxMT0NBVEVfVFlQRSAgICAgICAgICBUeXBlLAorICBJTiBFRklfTUVNT1JZX1RZUEUgICAgICAgICAgICBNZW1vcnlUeXBlLAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICBQYWdlcywKKyAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgKipIb3N0QWRkcmVzcywKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcworICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0ZSRUVfQlVGRkVSKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgUGFnZXMsCisgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICpIb3N0QWRkcmVzcworICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0ZMVVNIKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcworICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0dFVF9MT0NBVElPTikgKAorICBJTiBzdHJ1Y3QgX0VGSV9QQ0lfSU8gKlRoaXMsCisgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICpTZWdtZW50TnVtYmVyLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAqQnVzTnVtYmVyLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAqRGV2aWNlTnVtYmVyLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAqRnVuY3Rpb25OdW1iZXIKKyAgKTsKKworI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9JU0FfSU8gICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX1BBTEVUVEVfSU8gICAgICAgMHgwMDA0CisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX1ZHQV9NRU1PUlkgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfSU8gICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSURFX1BSSU1BUllfSU8gICAgICAgMHgwMDIwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0lERV9TRUNPTkRBUllfSU8gICAgIDB4MDA0MAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUllfV1JJVEVfQ09NQklORSAweDAwODAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSU8gICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX01FTU9SWSAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9CVVNfTUFTVEVSICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfTUVNT1JZX0NBQ0hFRCAgICAgICAgMHgwODAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX01FTU9SWV9ESVNBQkxFICAgICAgIDB4MTAwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9FTUJFRERFRF9ERVZJQ0UgICAgICAweDIwMDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfRU1CRURERURfUk9NICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0RVQUxfQUREUkVTU19DWUNMRSAgIDB4ODAwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9JU0FfSU9fMTYgICAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX1ZHQV9QQUxFVFRFX0lPXzE2ICAgIDB4MjAwMDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX0lPXzE2ICAgICAgICAgICAgMHg0MDAwMAorCit0eXBlZGVmIGVudW0geworICAgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uR2V0LAorICAgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uU2V0LAorICAgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uRW5hYmxlLAorICAgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uRGlzYWJsZSwKKyAgICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvblN1cHBvcnRlZCwKKyAgICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvbk1heGltdW0KK30gRUZJX1BDSV9JT19QUk9UT0NPTF9BVFRSSUJVVEVfT1BFUkFUSU9OOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0FUVFJJQlVURVMpICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICAgICAgICAgICAgICpUaGlzLAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MX0FUVFJJQlVURV9PUEVSQVRJT04gT3BlcmF0aW9uLAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcywKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSZXN1bHQgT1BUSU9OQUwKKyAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9HRVRfQkFSX0FUVFJJQlVURVMpICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICBCYXJJbmRleCwKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgKlN1cHBvcnRzIE9QVElPTkFMLAorICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAqKlJlc291cmNlcyBPUFRJT05BTAorICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX1NFVF9CQVJfQVRUUklCVVRFUykgKAorICBJTiBzdHJ1Y3QgX0VGSV9QQ0lfSU8gKlRoaXMsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMsCisgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgIEJhckluZGV4LAorICBJTiBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAqT2Zmc2V0LAorICBJTiBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAqTGVuZ3RoCisgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfUENJX0lPIHsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9QT0xMX0lPX01FTSAgICAgICAgUG9sbE1lbTsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9QT0xMX0lPX01FTSAgICAgICAgUG9sbElvOworICBFRklfUENJX0lPX1BST1RPQ09MX0FDQ0VTUyAgICAgICAgICAgICBNZW07CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQUNDRVNTICAgICAgICAgICAgIElvOworICBFRklfUENJX0lPX1BST1RPQ09MX0NPTkZJR19BQ0NFU1MgICAgICBQY2k7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQ09QWV9NRU0gICAgICAgICAgIENvcHlNZW07CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfTUFQICAgICAgICAgICAgICAgIE1hcDsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9VTk1BUCAgICAgICAgICAgICAgVW5tYXA7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQUxMT0NBVEVfQlVGRkVSICAgIEFsbG9jYXRlQnVmZmVyOworICBFRklfUENJX0lPX1BST1RPQ09MX0ZSRUVfQlVGRkVSICAgICAgICBGcmVlQnVmZmVyOworICBFRklfUENJX0lPX1BST1RPQ09MX0ZMVVNIICAgICAgICAgICAgICBGbHVzaDsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9HRVRfTE9DQVRJT04gICAgICAgR2V0TG9jYXRpb247CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQVRUUklCVVRFUyAgICAgICAgIEF0dHJpYnV0ZXM7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfR0VUX0JBUl9BVFRSSUJVVEVTIEdldEJhckF0dHJpYnV0ZXM7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfU0VUX0JBUl9BVFRSSUJVVEVTIFNldEJhckF0dHJpYnV0ZXM7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbVNpemU7CisgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSb21JbWFnZTsKK30gRUZJX1BDSV9JTzsKKworI2VuZGlmIC8qIF9FRklfUENJX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2VmaXByb3QuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaXByb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDc2ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpcHJvdC5oCkBAIC0wLDAgKzEsNzU3IEBACisjaWZuZGVmIF9FRklfUFJPVF9ICisjZGVmaW5lIF9FRklfUFJPVF9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaXByb3QuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBQcm90b2NvbHMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisvLworLy8gIEZQU1dBIGxpYnJhcnkgcHJvdG9jb2wKKy8vCisjZGVmaW5lIEZQU1dBX1BST1RPQ09MICAgICAgICAgIFwKKyAgICB7IDB4YzQxYjY1MzEsIDB4OTdiOSwgMHgxMWQzLCB7MHg5YSwgMHgyOSwgMHgwLCAweDkwLCAweDI3LCAweDNmLCAweGMxLCAweDRkfSB9CisKKy8vCisvLyBEZXZpY2UgUGF0aCBwcm90b2NvbAorLy8KKworI2RlZmluZSBERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICBcCisgICAgeyAweDk1NzZlOTEsIDB4NmQzZiwgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKKworLy8KKy8vIEJsb2NrIElPIHByb3RvY29sCisvLworCisjZGVmaW5lIEJMT0NLX0lPX1BST1RPQ09MIFwKKyAgICB7IDB4OTY0ZTViMjEsIDB4NjQ1OSwgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisjZGVmaW5lIEVGSV9CTE9DS19JT19JTlRFUkZBQ0VfUkVWSVNJT04gICAweDAwMDEwMDAwCisjZGVmaW5lIEVGSV9CTE9DS19JT19JTlRFUkZBQ0VfUkVWSVNJT04yICAweDAwMDIwMDAxCisjZGVmaW5lIEVGSV9CTE9DS19JT19JTlRFUkZBQ0VfUkVWSVNJT04zICAoKDI8PDE2KSB8IDMxKQorCitJTlRFUkZBQ0VfREVDTChfRUZJX0JMT0NLX0lPKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0JMT0NLX1JFU0VUKSAoCisgICAgSU4gc3RydWN0IF9FRklfQkxPQ0tfSU8gICAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICBFeHRlbmRlZFZlcmlmaWNhdGlvbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9CTE9DS19SRUFEKSAoCisgICAgSU4gc3RydWN0IF9FRklfQkxPQ0tfSU8gICAgICpUaGlzLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICBNZWRpYUlkLAorICAgIElOIEVGSV9MQkEgICAgICAgICAgICAgICAgICBMQkEsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9CTE9DS19XUklURSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0JMT0NLX0lPICAgICAqVGhpcywKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgTWVkaWFJZCwKKyAgICBJTiBFRklfTEJBICAgICAgICAgICAgICAgICAgTEJBLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQkxPQ0tfRkxVU0gpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9CTE9DS19JTyAgICAgKlRoaXMKKyAgICApOworCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgTWVkaWFJZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgIFJlbW92YWJsZU1lZGlhOworICAgIEJPT0xFQU4gICAgICAgICAgICAgTWVkaWFQcmVzZW50OworCisgICAgQk9PTEVBTiAgICAgICAgICAgICBMb2dpY2FsUGFydGl0aW9uOworICAgIEJPT0xFQU4gICAgICAgICAgICAgUmVhZE9ubHk7CisgICAgQk9PTEVBTiAgICAgICAgICAgICBXcml0ZUNhY2hpbmc7CisKKyAgICBVSU5UMzIgICAgICAgICAgICAgIEJsb2NrU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIElvQWxpZ247CisKKyAgICBFRklfTEJBICAgICAgICAgICAgIExhc3RCbG9jazsKKworICAgIC8qIHJldmlzaW9uIDIgKi8KKyAgICBFRklfTEJBICAgICAgICAgICAgIExvd2VzdEFsaWduZWRMYmE7CisgICAgVUlOVDMyICAgICAgICAgICAgICBMb2dpY2FsQmxvY2tzUGVyUGh5c2ljYWxCbG9jazsKKyAgICAvKiByZXZpc2lvbiAzICovCisgICAgVUlOVDMyICAgICAgICAgICAgICBPcHRpbWFsVHJhbnNmZXJMZW5ndGhHcmFudWxhcml0eTsKK30gRUZJX0JMT0NLX0lPX01FRElBOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0JMT0NLX0lPIHsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKworICAgIEVGSV9CTE9DS19JT19NRURJQSAgICAgICpNZWRpYTsKKworICAgIEVGSV9CTE9DS19SRVNFVCAgICAgICAgIFJlc2V0OworICAgIEVGSV9CTE9DS19SRUFEICAgICAgICAgIFJlYWRCbG9ja3M7CisgICAgRUZJX0JMT0NLX1dSSVRFICAgICAgICAgV3JpdGVCbG9ja3M7CisgICAgRUZJX0JMT0NLX0ZMVVNIICAgICAgICAgRmx1c2hCbG9ja3M7CisKK30gRUZJX0JMT0NLX0lPOworCisKKworLy8KKy8vIERpc2sgQmxvY2sgSU8gcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgRElTS19JT19QUk9UT0NPTCBcCisgICAgeyAweGNlMzQ1MTcxLCAweGJhMGIsIDB4MTFkMiwgIHsweDhlLCAweDRmLCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKyNkZWZpbmUgRUZJX0RJU0tfSU9fSU5URVJGQUNFX1JFVklTSU9OICAgMHgwMDAxMDAwMAorCitJTlRFUkZBQ0VfREVDTChfRUZJX0RJU0tfSU8pOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRElTS19SRUFEKSAoCisgICAgSU4gc3RydWN0IF9FRklfRElTS19JTyAgICAgICpUaGlzLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICBNZWRpYUlkLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9ESVNLX1dSSVRFKSAoCisgICAgSU4gc3RydWN0IF9FRklfRElTS19JTyAgICAgICpUaGlzLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICBNZWRpYUlkLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCisKK3R5cGVkZWYgc3RydWN0IF9FRklfRElTS19JTyB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfRElTS19SRUFEICAgICAgIFJlYWREaXNrOworICAgIEVGSV9ESVNLX1dSSVRFICAgICAgV3JpdGVEaXNrOworfSBFRklfRElTS19JTzsKKworCisvLworLy8gU2ltcGxlIGZpbGUgc3lzdGVtIHByb3RvY29sCisvLworCisjZGVmaW5lIFNJTVBMRV9GSUxFX1NZU1RFTV9QUk9UT0NPTCBcCisgICAgeyAweDk2NGU1YjIyLCAweDY0NTksIDB4MTFkMiwgezB4OGUsIDB4MzksIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX0ZJTEVfSU9fSU5URVJGQUNFKTsKK0lOVEVSRkFDRV9ERUNMKF9FRklfRklMRV9IQU5ETEUpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVk9MVU1FX09QRU4pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0lPX0lOVEVSRkFDRSAgICAqVGhpcywKKyAgICBPVVQgc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICAgICAgICAqKlJvb3QKKyAgICApOworCisjZGVmaW5lIEVGSV9GSUxFX0lPX0lOVEVSRkFDRV9SRVZJU0lPTiAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9GSUxFX0lPX0lOVEVSRkFDRSB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgUmV2aXNpb247CisgICAgRUZJX1ZPTFVNRV9PUEVOICAgICAgICAgT3BlblZvbHVtZTsKK30gRUZJX0ZJTEVfSU9fSU5URVJGQUNFOworCisvLworLy8KKy8vCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GSUxFX09QRU4pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSAgKkZpbGUsCisgICAgT1VUIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICoqTmV3SGFuZGxlLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAqRmlsZU5hbWUsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgIE9wZW5Nb2RlLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzCisgICAgKTsKKworLy8gT3BlbiBtb2RlcworI2RlZmluZSBFRklfRklMRV9NT0RFX1JFQUQgICAgICAweDAwMDAwMDAwMDAwMDAwMDEKKyNkZWZpbmUgRUZJX0ZJTEVfTU9ERV9XUklURSAgICAgMHgwMDAwMDAwMDAwMDAwMDAyCisjZGVmaW5lIEVGSV9GSUxFX01PREVfQ1JFQVRFICAgIDB4ODAwMDAwMDAwMDAwMDAwMAorCisvLyBGaWxlIGF0dHJpYnV0ZXMKKyNkZWZpbmUgRUZJX0ZJTEVfUkVBRF9PTkxZICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCisjZGVmaW5lIEVGSV9GSUxFX0hJRERFTiAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMgorI2RlZmluZSBFRklfRklMRV9TWVNURU0gICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDQKKyNkZWZpbmUgRUZJX0ZJTEVfUkVTRVJWSUVEICAgICAgMHgwMDAwMDAwMDAwMDAwMDA4CisjZGVmaW5lIEVGSV9GSUxFX0RJUkVDVE9SWSAgICAgIDB4MDAwMDAwMDAwMDAwMDAxMAorI2RlZmluZSBFRklfRklMRV9BUkNISVZFICAgICAgICAweDAwMDAwMDAwMDAwMDAwMjAKKyNkZWZpbmUgRUZJX0ZJTEVfVkFMSURfQVRUUiAgICAgMHgwMDAwMDAwMDAwMDAwMDM3CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GSUxFX0NMT1NFKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfREVMRVRFKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfUkVBRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZSwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9XUklURSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZSwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9TRVRfUE9TSVRJT04pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSAgKkZpbGUsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfR0VUX1BPU0lUSU9OKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlLAorICAgIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAqUG9zaXRpb24KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9HRVRfSU5GTykgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKkluZm9ybWF0aW9uVHlwZSwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9TRVRfSU5GTykgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKkluZm9ybWF0aW9uVHlwZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GSUxFX0ZMVVNIKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlCisgICAgKTsKKworCisKKyNkZWZpbmUgRUZJX0ZJTEVfSEFORExFX1JFVklTSU9OICAgICAgICAgMHgwMDAxMDAwMAordHlwZWRlZiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgUmV2aXNpb247CisgICAgRUZJX0ZJTEVfT1BFTiAgICAgICAgICAgT3BlbjsKKyAgICBFRklfRklMRV9DTE9TRSAgICAgICAgICBDbG9zZTsKKyAgICBFRklfRklMRV9ERUxFVEUgICAgICAgICBEZWxldGU7CisgICAgRUZJX0ZJTEVfUkVBRCAgICAgICAgICAgUmVhZDsKKyAgICBFRklfRklMRV9XUklURSAgICAgICAgICBXcml0ZTsKKyAgICBFRklfRklMRV9HRVRfUE9TSVRJT04gICBHZXRQb3NpdGlvbjsKKyAgICBFRklfRklMRV9TRVRfUE9TSVRJT04gICBTZXRQb3NpdGlvbjsKKyAgICBFRklfRklMRV9HRVRfSU5GTyAgICAgICBHZXRJbmZvOworICAgIEVGSV9GSUxFX1NFVF9JTkZPICAgICAgIFNldEluZm87CisgICAgRUZJX0ZJTEVfRkxVU0ggICAgICAgICAgRmx1c2g7Cit9IEVGSV9GSUxFLCAqRUZJX0ZJTEVfSEFORExFOworCisKKy8vCisvLyBGaWxlIGluZm9ybWF0aW9uIHR5cGVzCisvLworCisjZGVmaW5lIEVGSV9GSUxFX0lORk9fSUQgICBcCisgICAgeyAweDk1NzZlOTIsIDB4NmQzZiwgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBTaXplOworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIEZpbGVTaXplOworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIFBoeXNpY2FsU2l6ZTsKKyAgICBFRklfVElNRSAgICAgICAgICAgICAgICBDcmVhdGVUaW1lOworICAgIEVGSV9USU1FICAgICAgICAgICAgICAgIExhc3RBY2Nlc3NUaW1lOworICAgIEVGSV9USU1FICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvblRpbWU7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOworICAgIENIQVIxNiAgICAgICAgICAgICAgICAgIEZpbGVOYW1lWzFdOworfSBFRklfRklMRV9JTkZPOworCisvLworLy8gVGhlIEZpbGVOYW1lIGZpZWxkIG9mIHRoZSBFRklfRklMRV9JTkZPIGRhdGEgc3RydWN0dXJlIGlzIHZhcmlhYmxlIGxlbmd0aC4KKy8vIFdoZW5ldmVyIGNvZGUgbmVlZHMgdG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgRUZJX0ZJTEVfSU5GTyBkYXRhIHN0cnVjdHVyZSwgaXQgbmVlZHMgdG8KKy8vIGJlIHRoZSBzaXplIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSB3aXRob3V0IHRoZSBGaWxlTmFtZSBmaWVsZC4gIFRoZSBmb2xsb3dpbmcgbWFjcm8gCisvLyBjb21wdXRlcyB0aGlzIHNpemUgY29ycmVjdGx5IG5vIG1hdHRlciBob3cgYmlnIHRoZSBGaWxlTmFtZSBhcnJheSBpcyBkZWNsYXJlZC4KKy8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSB0aGUgRUZJX0ZJTEVfSU5GTyBkYXRhIHN0cnVjdHVyZSBBTlNJIGNvbXBpbGFudC4gCisvLworCisjZGVmaW5lIFNJWkVfT0ZfRUZJX0ZJTEVfSU5GTyBFRklfRklFTERfT0ZGU0VUKEVGSV9GSUxFX0lORk8sRmlsZU5hbWUpCisKKyNkZWZpbmUgRUZJX0ZJTEVfU1lTVEVNX0lORk9fSUQgICAgXAorICAgIHsgMHg5NTc2ZTkzLCAweDZkM2YsIDB4MTFkMiwgezB4OGUsIDB4MzksIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgU2l6ZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICBSZWFkT25seTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBWb2x1bWVTaXplOworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIEZyZWVTcGFjZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBCbG9ja1NpemU7CisgICAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgVm9sdW1lTGFiZWxbMV07Cit9IEVGSV9GSUxFX1NZU1RFTV9JTkZPOworCisvLworLy8gVGhlIFZvbHVtZUxhYmVsIGZpZWxkIG9mIHRoZSBFRklfRklMRV9TWVNURU1fSU5GTyBkYXRhIHN0cnVjdHVyZSBpcyB2YXJpYWJsZSBsZW5ndGguCisvLyBXaGVuZXZlciBjb2RlIG5lZWRzIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIEVGSV9GSUxFX1NZU1RFTV9JTkZPIGRhdGEgc3RydWN0dXJlLCBpdCBuZWVkcworLy8gdG8gYmUgdGhlIHNpemUgb2YgdGhlIGRhdGEgc3RydWN0dXJlIHdpdGhvdXQgdGhlIFZvbHVtZUxhYmxlIGZpZWxkLiAgVGhlIGZvbGxvd2luZyBtYWNybyAKKy8vIGNvbXB1dGVzIHRoaXMgc2l6ZSBjb3JyZWN0bHkgbm8gbWF0dGVyIGhvdyBiaWcgdGhlIFZvbHVtZUxhYmxlIGFycmF5IGlzIGRlY2xhcmVkLgorLy8gVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIHRoZSBFRklfRklMRV9TWVNURU1fSU5GTyBkYXRhIHN0cnVjdHVyZSBBTlNJIGNvbXBpbGFudC4gCisvLworCisjZGVmaW5lIFNJWkVfT0ZfRUZJX0ZJTEVfU1lTVEVNX0lORk8gRUZJX0ZJRUxEX09GRlNFVChFRklfRklMRV9TWVNURU1fSU5GTyxWb2x1bWVMYWJlbCkKKworI2RlZmluZSBFRklfRklMRV9TWVNURU1fVk9MVU1FX0xBQkVMX0lORk9fSUQgICAgXAorICAgIHsgMHhEQjQ3RDdEMywweEZFODEsIDB4MTFkMywgezB4OUEsIDB4MzUsIDB4MDAsIDB4OTAsIDB4MjcsIDB4M0YsIDB4QzEsIDB4NER9IH0KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENIQVIxNiAgICAgICAgICAgICAgICAgIFZvbHVtZUxhYmVsWzFdOworfSBFRklfRklMRV9TWVNURU1fVk9MVU1FX0xBQkVMX0lORk87CisKKyNkZWZpbmUgU0laRV9PRl9FRklfRklMRV9TWVNURU1fVk9MVU1FX0xBQkVMX0lORk8gRUZJX0ZJRUxEX09GRlNFVChFRklfRklMRV9TWVNURU1fVk9MVU1FX0xBQkVMX0lORk8sVm9sdW1lTGFiZWwpCisKKy8vCisvLyBMb2FkIGZpbGUgcHJvdG9jb2wKKy8vCisKKworI2RlZmluZSBMT0FEX0ZJTEVfUFJPVE9DT0wgXAorICAgIHsgMHg1NkVDMzA5MSwgMHg5NTRDLCAweDExZDIsIHsweDhFLCAweDNGLCAweDAwLCAweEEwLCAweEM5LCAweDY5LCAweDcyLCAweDNCfSB9CisKK0lOVEVSRkFDRV9ERUNMKF9FRklfTE9BRF9GSUxFX0lOVEVSRkFDRSk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9MT0FEX0ZJTEUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9MT0FEX0ZJTEVfSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAqRmlsZVBhdGgsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdFBvbGljeSwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9MT0FEX0ZJTEVfSU5URVJGQUNFIHsKKyAgICBFRklfTE9BRF9GSUxFICAgICAgICAgICAgICAgICAgICAgICBMb2FkRmlsZTsKK30gRUZJX0xPQURfRklMRV9JTlRFUkZBQ0U7CisKKworLy8KKy8vIERldmljZSBJTyBwcm90b2NvbAorLy8KKworI2RlZmluZSBERVZJQ0VfSU9fUFJPVE9DT0wgXAorICAgIHsgMHhhZjZhYzMxMSwgMHg4NGMzLCAweDExZDIsIHsweDhlLCAweDNjLCAweDAwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKK0lOVEVSRkFDRV9ERUNMKF9FRklfREVWSUNFX0lPX0lOVEVSRkFDRSk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgSU9fVUlOVDgsCisgICAgSU9fVUlOVDE2LAorICAgIElPX1VJTlQzMiwKKyAgICBJT19VSU5UNjQsCisvLworLy8gU3BlY2lmaWNhdGlvbiBDaGFuZ2U6IENvcHkgZnJvbSBNTUlPIHRvIE1NSU8gdnMuIE1NSU8gdG8gYnVmZmVyLCBidWZmZXIgdG8gTU1JTworLy8KKyAgICBNTUlPX0NPUFlfVUlOVDgsCisgICAgTU1JT19DT1BZX1VJTlQxNiwKKyAgICBNTUlPX0NPUFlfVUlOVDMyLAorICAgIE1NSU9fQ09QWV9VSU5UNjQKK30gRUZJX0lPX1dJRFRIOworCisjZGVmaW5lIEVGSV9QQ0lfQUREUkVTUyhfYnVzLF9kZXYsX2Z1bmMpIFwKKyAgICAoIChVSU5UNjQpICggKCgoVUlOVE4pX2J1cykgPDwgMjQpICsgKCgoVUlOVE4pX2RldikgPDwgMTYpICsgKCgoVUlOVE4pX2Z1bmMpIDw8IDgpICkgKQorCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9ERVZJQ0VfSU8pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICpUaGlzLAorICAgIElOIEVGSV9JT19XSURUSCAgICAgICAgICAgICAgICAgV2lkdGgsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQsCisgICAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9ERVZJQ0VfSU8gICAgICAgICAgICAgICAgICAgUmVhZDsKKyAgICBFRklfREVWSUNFX0lPICAgICAgICAgICAgICAgICAgIFdyaXRlOworfSBFRklfSU9fQUNDRVNTOworCit0eXBlZGVmIAorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ERVZJQ0VfUEFUSCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MsCisgICAgSU4gT1VUIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgKipQY2lEZXZpY2VQYXRoCisgICAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFZmlCdXNNYXN0ZXJSZWFkLAorICAgIEVmaUJ1c01hc3RlcldyaXRlLAorICAgIEVmaUJ1c01hc3RlckNvbW1vbkJ1ZmZlcgorfSBFRklfSU9fT1BFUkFUSU9OX1RZUEU7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JT19NQVApICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBFRklfSU9fT1BFUkFUSU9OX1RZUEUgICAgICAgICAgICBPcGVyYXRpb24sCisgICAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICAgKkhvc3RBZGRyZXNzLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICpOdW1iZXJPZkJ5dGVzLAorICAgIE9VVCBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgICpEZXZpY2VBZGRyZXNzLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqTWFwcGluZworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JT19VTk1BUCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpNYXBwaW5nCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lPX0FMTE9DQVRFX0JVRkZFUikgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIEVGSV9BTExPQ0FURV9UWVBFICAgICAgICAgICAgICAgIFR5cGUsCisgICAgSU4gRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgICAgICAgTWVtb3J5VHlwZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlcywKKyAgICBJTiBPVVQgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAqSG9zdEFkZHJlc3MKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU9fRkxVU0gpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAqVGhpcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JT19GUkVFX0JVRkZFUikgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VzLAorICAgIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgIEhvc3RBZGRyZXNzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFIHsKKyAgICBFRklfSU9fQUNDRVNTICAgICAgICAgICAgICAgICAgICAgICBNZW07CisgICAgRUZJX0lPX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgSW87CisgICAgRUZJX0lPX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgUGNpOworICAgIEVGSV9JT19NQVAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDsKKyAgICBFRklfUENJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBQY2lEZXZpY2VQYXRoOworICAgIEVGSV9JT19VTk1BUCAgICAgICAgICAgICAgICAgICAgICAgIFVubWFwOworICAgIEVGSV9JT19BTExPQ0FURV9CVUZGRVIgICAgICAgICAgICAgIEFsbG9jYXRlQnVmZmVyOworICAgIEVGSV9JT19GTFVTSCAgICAgICAgICAgICAgICAgICAgICAgIEZsdXNoOworICAgIEVGSV9JT19GUkVFX0JVRkZFUiAgICAgICAgICAgICAgICAgIEZyZWVCdWZmZXI7Cit9IEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFOworCisKKy8vCisvLyBVbmljb2RlIENvbGxhdGlvbiBwcm90b2NvbAorLy8KKworI2RlZmluZSBVTklDT0RFX0NPTExBVElPTl9QUk9UT0NPTCBcCisgICAgeyAweDFkODVjZDdmLCAweGY0M2QsIDB4MTFkMiwgezB4OWEsIDB4YywgIDB4MCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZH0gfQorCisjZGVmaW5lIFVOSUNPREVfQllURV9PUkRFUl9NQVJLICAgICAgIChDSEFSMTYpKDB4ZmVmZikKKworSU5URVJGQUNFX0RFQ0woX0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UpOworCit0eXBlZGVmCitJTlROCisoRUZJQVBJICpFRklfVU5JQ09ERV9TVFJJQ09MTCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICpzMSwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgKnMyCisgICAgKTsKKwordHlwZWRlZgorQk9PTEVBTgorKEVGSUFQSSAqRUZJX1VOSUNPREVfTUVUQUlNQVRDSCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICpTdHJpbmcsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICpQYXR0ZXJuCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1VOSUNPREVfU1RSTFdSKSAoCisgICAgSU4gc3RydWN0IF9FRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqU3RyCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1VOSUNPREVfU1RSVVBSKSAoCisgICAgSU4gc3RydWN0IF9FRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqU3RyCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1VOSUNPREVfRkFUVE9TVFIpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdFNpemUsCisgICAgSU4gQ0hBUjggICAgICAgICAgICAgICAgICAgICAgICAgICAgKkZhdCwKKyAgICBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nCisgICAgKTsKKwordHlwZWRlZgorQk9PTEVBTgorKEVGSUFQSSAqRUZJX1VOSUNPREVfU1RSVE9GQVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdHJpbmcsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF0U2l6ZSwKKyAgICBPVVQgQ0hBUjggICAgICAgICAgICAgICAgICAgICAgICAgICAqRmF0CisgICAgKTsKKworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSB7CisKKyAgICAvLyBnZW5lcmFsCisgICAgRUZJX1VOSUNPREVfU1RSSUNPTEwgICAgICAgICAgICAgICAgU3RyaUNvbGw7CisgICAgRUZJX1VOSUNPREVfTUVUQUlNQVRDSCAgICAgICAgICAgICAgTWV0YWlNYXRjaDsKKyAgICBFRklfVU5JQ09ERV9TVFJMV1IgICAgICAgICAgICAgICAgICBTdHJMd3I7CisgICAgRUZJX1VOSUNPREVfU1RSVVBSICAgICAgICAgICAgICAgICAgU3RyVXByOworCisgICAgLy8gZm9yIHN1cHBvcnRpbmcgZmF0IHZvbHVtZXMKKyAgICBFRklfVU5JQ09ERV9GQVRUT1NUUiAgICAgICAgICAgICAgICBGYXRUb1N0cjsKKyAgICBFRklfVU5JQ09ERV9TVFJUT0ZBVCAgICAgICAgICAgICAgICBTdHJUb0ZhdDsKKworICAgIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdXBwb3J0ZWRMYW5ndWFnZXM7Cit9IEVGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0U7CisKKy8qIEdyYXBoaWNzIG91dHB1dCBwcm90b2NvbCAqLworI2RlZmluZSBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX0dVSUQgXAorICB7IFwKKyAgICAweDkwNDJhOWRlLCAweDIzZGMsIDB4NGEzOCwgezB4OTYsIDB4ZmIsIDB4N2EsIDB4ZGUsIDB4ZDAsIDB4ODAsIDB4NTEsIDB4NmEgfSBcCisgIH0KKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0wgRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgICAgICAgICAgICBSZWRNYXNrOworICBVSU5UMzIgICAgICAgICAgICBHcmVlbk1hc2s7CisgIFVJTlQzMiAgICAgICAgICAgIEJsdWVNYXNrOworICBVSU5UMzIgICAgICAgICAgICBSZXNlcnZlZE1hc2s7Cit9IEVGSV9QSVhFTF9CSVRNQVNLOworCit0eXBlZGVmIGVudW0geworICBQaXhlbFJlZEdyZWVuQmx1ZVJlc2VydmVkOEJpdFBlckNvbG9yLAorICBQaXhlbEJsdWVHcmVlblJlZFJlc2VydmVkOEJpdFBlckNvbG9yLAorICBQaXhlbEJpdE1hc2ssCisgIFBpeGVsQmx0T25seSwKKyAgUGl4ZWxGb3JtYXRNYXgKK30gRUZJX0dSQVBISUNTX1BJWEVMX0ZPUk1BVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsUmVzb2x1dGlvbjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgVmVydGljYWxSZXNvbHV0aW9uOworICBFRklfR1JBUEhJQ1NfUElYRUxfRk9STUFUICBQaXhlbEZvcm1hdDsKKyAgRUZJX1BJWEVMX0JJVE1BU0sgICAgICAgICAgUGl4ZWxJbmZvcm1hdGlvbjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgUGl4ZWxzUGVyU2NhbkxpbmU7Cit9IEVGSV9HUkFQSElDU19PVVRQVVRfTU9ERV9JTkZPUk1BVElPTjsKKworLyoqCisgIFJldHVybiB0aGUgY3VycmVudCB2aWRlbyBtb2RlIGluZm9ybWF0aW9uLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIE1vZGVOdW1iZXIgVGhlIG1vZGUgbnVtYmVyIHRvIHJldHVybiBpbmZvcm1hdGlvbiBvbi4KKyAgQHBhcmFtICBTaXplT2ZJbmZvIEEgcG9pbnRlciB0byB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBJbmZvIGJ1ZmZlci4KKyAgQHBhcmFtICBJbmZvICAgICAgIEEgcG9pbnRlciB0byBjYWxsZWUgYWxsb2NhdGVkIGJ1ZmZlciB0aGF0IHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgTW9kZU51bWJlci4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBNb2RlIGluZm9ybWF0aW9uIHJldHVybmVkLgorICBAcmV0dmFsIEVGSV9CVUZGRVJfVE9PX1NNQUxMICBUaGUgSW5mbyBidWZmZXIgd2FzIHRvbyBzbWFsbC4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgQSBoYXJkd2FyZSBlcnJvciBvY2N1cnJlZCB0cnlpbmcgdG8gcmV0cmlldmUgdGhlIHZpZGVvIG1vZGUuCisgIEByZXR2YWwgRUZJX05PVF9TVEFSVEVEICAgICAgIFZpZGVvIGRpc3BsYXkgaXMgbm90IGluaXRpYWxpemVkLiBDYWxsIFNldE1vZGUgKCkKKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9mIHRoZSBpbnB1dCBhcmdzIHdhcyBOVUxMLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0xfUVVFUllfTU9ERSkgKAorICBJTiAgRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTCAgICAgICAgICAqVGhpcywKKyAgSU4gIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZU51bWJlciwKKyAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlNpemVPZkluZm8sCisgIE9VVCBFRklfR1JBUEhJQ1NfT1VUUFVUX01PREVfSU5GT1JNQVRJT04gICoqSW5mbworICApCis7CisKKy8qKgorICBSZXR1cm4gdGhlIGN1cnJlbnQgdmlkZW8gbW9kZSBpbmZvcm1hdGlvbi4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgTW9kZU51bWJlciAgICAgICAgVGhlIG1vZGUgbnVtYmVyIHRvIGJlIHNldC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgIEdyYXBoaWNzIG1vZGUgd2FzIGNoYW5nZWQuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgVGhlIGRldmljZSBoYWQgYW4gZXJyb3IgYW5kIGNvdWxkIG5vdCBjb21wbGV0ZSB0aGUgcmVxdWVzdC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICBNb2RlTnVtYmVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTF9TRVRfTU9ERSkgKAorICBJTiAgRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTCAqVGhpcywKKyAgSU4gIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgTW9kZU51bWJlcgorICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQ4IEJsdWU7CisgIFVJTlQ4IEdyZWVuOworICBVSU5UOCBSZWQ7CisgIFVJTlQ4IFJlc2VydmVkOworfSBFRklfR1JBUEhJQ1NfT1VUUFVUX0JMVF9QSVhFTDsKKwordHlwZWRlZiB1bmlvbiB7CisgIEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX1BJWEVMIFBpeGVsOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICBSYXc7Cit9IEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX1BJWEVMX1VOSU9OOworCit0eXBlZGVmIGVudW0geworICBFZmlCbHRWaWRlb0ZpbGwsCisgIEVmaUJsdFZpZGVvVG9CbHRCdWZmZXIsCisgIEVmaUJsdEJ1ZmZlclRvVmlkZW8sIAorICBFZmlCbHRWaWRlb1RvVmlkZW8sCisgIEVmaUdyYXBoaWNzT3V0cHV0Qmx0T3BlcmF0aW9uTWF4Cit9IEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX09QRVJBVElPTjsKKworLyoqCisgIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVmaW5lcyBhY3Rpb25zIGZvciBCbHRPcGVyYXRpb25zOgorCisgIDxCPkVmaUJsdFZpZGVvRmlsbDwvQj4gLSBXcml0ZSBkYXRhIGZyb20gdGhlICBCbHRCdWZmZXIgcGl4ZWwgKFNvdXJjZVgsIFNvdXJjZVkpIAorICBkaXJlY3RseSB0byBldmVyeSBwaXhlbCBvZiB0aGUgdmlkZW8gZGlzcGxheSByZWN0YW5nbGUgCisgIChEZXN0aW5hdGlvblgsIERlc3RpbmF0aW9uWSkgKERlc3RpbmF0aW9uWCArIFdpZHRoLCBEZXN0aW5hdGlvblkgKyBIZWlnaHQpLiAKKyAgT25seSBvbmUgcGl4ZWwgd2lsbCBiZSB1c2VkIGZyb20gdGhlIEJsdEJ1ZmZlci4gRGVsdGEgaXMgTk9UIHVzZWQuCisKKyAgPEI+RWZpQmx0VmlkZW9Ub0JsdEJ1ZmZlcjwvQj4gLSBSZWFkIGRhdGEgZnJvbSB0aGUgdmlkZW8gZGlzcGxheSByZWN0YW5nbGUgCisgIChTb3VyY2VYLCBTb3VyY2VZKSAoU291cmNlWCArIFdpZHRoLCBTb3VyY2VZICsgSGVpZ2h0KSBhbmQgcGxhY2UgaXQgaW4gCisgIHRoZSBCbHRCdWZmZXIgcmVjdGFuZ2xlIChEZXN0aW5hdGlvblgsIERlc3RpbmF0aW9uWSApIAorICAoRGVzdGluYXRpb25YICsgV2lkdGgsIERlc3RpbmF0aW9uWSArIEhlaWdodCkuIElmIERlc3RpbmF0aW9uWCBvciAKKyAgRGVzdGluYXRpb25ZIGlzIG5vdCB6ZXJvIHRoZW4gRGVsdGEgbXVzdCBiZSBzZXQgdG8gdGhlIGxlbmd0aCBpbiBieXRlcyAKKyAgb2YgYSByb3cgaW4gdGhlIEJsdEJ1ZmZlci4KKworICA8Qj5FZmlCbHRCdWZmZXJUb1ZpZGVvPC9CPiAtIFdyaXRlIGRhdGEgZnJvbSB0aGUgIEJsdEJ1ZmZlciByZWN0YW5nbGUgCisgIChTb3VyY2VYLCBTb3VyY2VZKSAoU291cmNlWCArIFdpZHRoLCBTb3VyY2VZICsgSGVpZ2h0KSBkaXJlY3RseSB0byB0aGUgCisgIHZpZGVvIGRpc3BsYXkgcmVjdGFuZ2xlIChEZXN0aW5hdGlvblgsIERlc3RpbmF0aW9uWSkgCisgIChEZXN0aW5hdGlvblggKyBXaWR0aCwgRGVzdGluYXRpb25ZICsgSGVpZ2h0KS4gSWYgU291cmNlWCBvciBTb3VyY2VZIGlzIAorICBub3QgemVybyB0aGVuIERlbHRhIG11c3QgYmUgc2V0IHRvIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgYSByb3cgaW4gdGhlIAorICBCbHRCdWZmZXIuCisKKyAgPEI+RWZpQmx0VmlkZW9Ub1ZpZGVvPC9CPiAtIENvcHkgZnJvbSB0aGUgdmlkZW8gZGlzcGxheSByZWN0YW5nbGUgKFNvdXJjZVgsIFNvdXJjZVkpCisgIChTb3VyY2VYICsgV2lkdGgsIFNvdXJjZVkgKyBIZWlnaHQpIC50byB0aGUgdmlkZW8gZGlzcGxheSByZWN0YW5nbGUgCisgIChEZXN0aW5hdGlvblgsIERlc3RpbmF0aW9uWSkgKERlc3RpbmF0aW9uWCArIFdpZHRoLCBEZXN0aW5hdGlvblkgKyBIZWlnaHQpLiAKKyAgVGhlIEJsdEJ1ZmZlciBhbmQgRGVsdGEgIGFyZSBub3QgdXNlZCBpbiB0aGlzIG1vZGUuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBCbHRCdWZmZXIgICAgQnVmZmVyIGNvbnRhaW5pbmcgZGF0YSB0byBibGl0IGludG8gdmlkZW8gYnVmZmVyLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBoYXMgYSBzaXplIG9mIFdpZHRoKkhlaWdodCpzaXplb2YoRUZJX0dSQVBISUNTX09VVFBVVF9CTFRfUElYRUwpCisgIEBwYXJhbSAgQmx0T3BlcmF0aW9uIE9wZXJhdGlvbiB0byBwZXJmb3JtIG9uIEJsaXRCdWZmZXIgYW5kIHZpZGVvIG1lbW9yeQorICBAcGFyYW0gIFNvdXJjZVggICAgICBYIGNvb3JkaW5hdGUgb2Ygc291cmNlIGZvciB0aGUgQmx0QnVmZmVyLgorICBAcGFyYW0gIFNvdXJjZVkgICAgICBZIGNvb3JkaW5hdGUgb2Ygc291cmNlIGZvciB0aGUgQmx0QnVmZmVyLgorICBAcGFyYW0gIERlc3RpbmF0aW9uWCBYIGNvb3JkaW5hdGUgb2YgZGVzdGluYXRpb24gZm9yIHRoZSBCbHRCdWZmZXIuCisgIEBwYXJhbSAgRGVzdGluYXRpb25ZIFkgY29vcmRpbmF0ZSBvZiBkZXN0aW5hdGlvbiBmb3IgdGhlIEJsdEJ1ZmZlci4KKyAgQHBhcmFtICBXaWR0aCAgICAgICAgV2lkdGggb2YgcmVjdGFuZ2xlIGluIEJsdEJ1ZmZlciBpbiBwaXhlbHMuCisgIEBwYXJhbSAgSGVpZ2h0ICAgICAgIEhpZ2h0IG9mIHJlY3RhbmdsZSBpbiBCbHRCdWZmZXIgaW4gcGl4ZWxzLgorICBAcGFyYW0gIERlbHRhICAgICAgICBPUFRJT05BTAorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBCbHQgb3BlcmF0aW9uIGNvbXBsZXRlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQmx0T3BlcmF0aW9uIGlzIG5vdCB2YWxpZC4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgQSBoYXJkd2FyZSBlcnJvciBvY2N1cmVkIHdyaXR0aW5nIHRvIHRoZSB2aWRlbyBidWZmZXIuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTF9CTFQpICgKKyAgSU4gIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0wgICAgICAgICAgICAqVGhpcywKKyAgSU4gIEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX1BJWEVMICAgICAgICAgICAqQmx0QnVmZmVyLCAgIE9QVElPTkFMCisgIElOICBFRklfR1JBUEhJQ1NfT1VUUFVUX0JMVF9PUEVSQVRJT04gICAgICAgQmx0T3BlcmF0aW9uLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVgsCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlWSwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvblgsCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb25ZLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZHRoLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlaWdodCwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWx0YSAgICAgICAgIE9QVElPTkFMCisgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TW9kZTsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZTsKKyAgRUZJX0dSQVBISUNTX09VVFBVVF9NT0RFX0lORk9STUFUSU9OICAgKkluZm87CisgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemVPZkluZm87CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgICAgICAgIEZyYW1lQnVmZmVyQmFzZTsKKyAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJTaXplOworfSBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX01PREU7CisKK3N0cnVjdCBfRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTCB7CisgIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0xfUVVFUllfTU9ERSAgUXVlcnlNb2RlOworICBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX1NFVF9NT0RFICAgIFNldE1vZGU7CisgIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0xfQkxUICAgICAgICAgQmx0OworICBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX01PREUgICAgICAgICpNb2RlOworfTsKKworSU5URVJGQUNFX0RFQ0woX0VGSV9TRVJWSUNFX0JJTkRJTkcpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VSVklDRV9CSU5ESU5HX0NSRUFURV9DSElMRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1NFUlZJQ0VfQklORElORyAqVGhpcywKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgKkNoaWxkSGFuZGxlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUlZJQ0VfQklORElOR19ERVNUUk9ZX0NISUxEKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0VSVklDRV9CSU5ESU5HICpUaGlzLAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICBDaGlsZEhhbmRsZQorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfU0VSVklDRV9CSU5ESU5HIHsKKyAgICBFRklfU0VSVklDRV9CSU5ESU5HX0NSRUFURV9DSElMRCAgQ3JlYXRlQ2hpbGQ7CisgICAgRUZJX1NFUlZJQ0VfQklORElOR19ERVNUUk9ZX0NISUxEIERlc3Ryb3lDaGlsZDsKK30gRUZJX1NFUlZJQ0VfQklORElORzsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2VmaXB4ZWJjLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlweGViYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjM4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlweGViYy5oCkBAIC0wLDAgKzEsNDY0IEBACisjaWZuZGVmIF9FRklQWEVCQ19ICisjZGVmaW5lIF9FRklQWEVCQ19ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaXB4ZWJjLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgUFhFIEJhc2UgQ29kZSBQcm90b2NvbAorCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBQWEUgQmFzZSBDb2RlIHByb3RvY29sCisvLworCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MIFwKKyAgICB7IDB4MDNjNGU2MDMsIDB4YWMyOCwgMHgxMWQzLCB7MHg5YSwgMHgyZCwgMHgwMCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZH0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX1BYRV9CQVNFX0NPREUpOworCisjZGVmaW5lIERFRkFVTFRfVFRMIDQKKyNkZWZpbmUgREVGQVVMVF9Ub1MgMAorLy8KKy8vIEFkZHJlc3MgZGVmaW5pdGlvbnMKKy8vCisKK3R5cGVkZWYgdW5pb24geworICAgIFVJTlQzMiAgICAgIEFkZHJbNF07CisgICAgRUZJX0lQdjRfQUREUkVTUyAgICB2NDsKKyAgICBFRklfSVB2Nl9BRERSRVNTICAgIHY2OworfSBFRklfSVBfQUREUkVTUzsKKwordHlwZWRlZiBVSU5UMTYgRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQ7CisKKy8vCisvLyBQYWNrZXQgZGVmaW5pdGlvbnMKKy8vCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwT3Bjb2RlOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBId1R5cGU7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cEh3QWRkckxlbjsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwR2F0ZUhvcHM7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cElkZW50OworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBTZWNvbmRzOworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBGbGFnczsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwQ2lBZGRyWzRdOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBZaUFkZHJbNF07CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cFNpQWRkcls0XTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwR2lBZGRyWzRdOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBId0FkZHJbMTZdOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBTcnZOYW1lWzY0XTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwQm9vdEZpbGVbMTI4XTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIERoY3BNYWdpazsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERoY3BPcHRpb25zWzU2XTsKK30gRUZJX1BYRV9CQVNFX0NPREVfREhDUFY0X1BBQ0tFVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVR5cGU6ODsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQ6MjQ7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEaGNwT3B0aW9uc1sxMDI0XTsKK30gRUZJX1BYRV9CQVNFX0NPREVfREhDUFY2X1BBQ0tFVDsKKwordHlwZWRlZiB1bmlvbiB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3WzE0NzJdOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0RIQ1BWNF9QQUNLRVQgICAgIERoY3B2NDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9ESENQVjZfUEFDS0VUICAgICBEaGNwdjY7Cit9IEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIFR5cGU7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgQ29kZTsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBDaGVja3N1bTsKKyAgICB1bmlvbiB7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgTXR1OworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgIFBvaW50ZXI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBVSU5UMTYgICAgICAgICAgSWRlbnRpZmllcjsKKyAgICAgICAgICAgIFVJTlQxNiAgICAgICAgICBTZXF1ZW5jZTsKKyAgICAgICAgfSBFY2hvOworICAgIH0gdTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBEYXRhWzQ5NF07Cit9IEVGSV9QWEVfQkFTRV9DT0RFX0lDTVBfRVJST1I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBFcnJvckNvZGU7CisgICAgQ0hBUjggICAgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmdbMTI3XTsKK30gRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9FUlJPUjsKKworLy8KKy8vIElQIFJlY2VpdmUgRmlsdGVyIGRlZmluaXRpb25zCisvLworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9NQVhfSVBDTlQgICAgICAgICAgICAgOAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJzOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBJcENudDsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgIElwTGlzdFtFRklfUFhFX0JBU0VfQ09ERV9NQVhfSVBDTlRdOworfSBFRklfUFhFX0JBU0VfQ09ERV9JUF9GSUxURVI7CisKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSX1NUQVRJT05fSVAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0lQX0ZJTFRFUl9CUk9BRENBU1QgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9JUF9GSUxURVJfUFJPTUlTQ1VPVVMgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSX1BST01JU0NVT1VTX01VTFRJQ0FTVCAgMHgwMDA4CisKKy8vCisvLyBBUlAgQ2FjaGUgZGVmaW5pdGlvbnMKKy8vCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVBfQUREUkVTUyAgICAgICBJcEFkZHI7CisgICAgRUZJX01BQ19BRERSRVNTICAgICAgTWFjQWRkcjsKK30gRUZJX1BYRV9CQVNFX0NPREVfQVJQX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgSXBBZGRyOworICAgIEVGSV9JUF9BRERSRVNTICAgICAgIFN1Ym5ldE1hc2s7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgR3dBZGRyOworfSBFRklfUFhFX0JBU0VfQ09ERV9ST1VURV9FTlRSWTsKKworLy8KKy8vIFVEUCBkZWZpbml0aW9ucworLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19BTllfU1JDX0lQICAgIDB4MDAwMQorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19BTllfU1JDX1BPUlQgIDB4MDAwMgorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19BTllfREVTVF9JUCAgIDB4MDAwNAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19BTllfREVTVF9QT1JUIDB4MDAwOAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19VU0VfRklMVEVSICAgIDB4MDAxMAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19NQVlfRlJBR01FTlQgIDB4MDAyMAorCisvLworLy8gRGlzY292ZXIoKSBkZWZpbml0aW9ucworLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfQk9PVFNUUkFQICAgICAgICAgICAwICAgCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9NU19XSU5OVF9SSVMgICAgICAgIDEKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0lOVEVMX0xDTSAgICAgICAgICAgMgorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfRE9TVU5ESSAgICAgICAgICAgICAzCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9ORUNfRVNNUFJPICAgICAgICAgIDQKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0lCTV9XU29EICAgICAgICAgICAgNQorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfSUJNX0xDQ00gICAgICAgICAgICA2CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9DQV9VTklDRU5URVJfVE5HICAgIDcKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0hQX09QRU5WSUVXICAgICAgICAgOAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfQUxUSVJJU185ICAgICAgICAgICA5CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9BTFRJUklTXzEwICAgICAgICAgIDEwCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9BTFRJUklTXzExICAgICAgICAgIDExCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9OT1RfVVNFRF8xMiAgICAgICAgIDEyCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9SRURIQVRfSU5TVEFMTCAgICAgIDEzCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9SRURIQVRfQk9PVCAgICAgICAgIDE0CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9SRU1CTyAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9CRU9CT09UICAgICAgICAgICAgIDE2CisvLworLy8gMTcgdGhyb3VnaCAzMjc2NyBhcmUgcmVzZXJ2ZWQKKy8vIDMyNzY4IHRocm91Z2ggNjUyNzkgYXJlIGZvciB2ZW5kb3IgdXNlCisvLyA2NTI4MCB0aHJvdWdoIDY1NTM0IGFyZSByZXNlcnZlZAorLy8KKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX1BYRVRFU1QgICAgICAgICAgICAgNjU1MzUKKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX0xBWUVSX01BU0sgICAgICAgICAgICAgICAweDdGRkYKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9MQVlFUl9JTklUSUFMICAgICAgICAgICAgMHgwMDAwCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBUeXBlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBBY2NlcHRBbnlSZXNwb25zZTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgIElwQWRkcjsKK30gRUZJX1BYRV9CQVNFX0NPREVfU1JWTElTVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBVc2VNQ2FzdDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgVXNlQkNhc3Q7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIFVzZVVDYXN0OworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBNdXN0VXNlTGlzdDsKKyAgICBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgU2VydmVyTUNhc3RJcDsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgSXBDbnQ7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfU1JWTElTVCAgIFNydkxpc3RbMV07Cit9IEVGSV9QWEVfQkFTRV9DT0RFX0RJU0NPVkVSX0lORk87CisKKy8vCisvLyBNdGZ0cCgpIGRlZmluaXRpb25zCisvLworCit0eXBlZGVmIGVudW0geworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfRklSU1QsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9HRVRfRklMRV9TSVpFLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfUkVBRF9GSUxFLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfV1JJVEVfRklMRSwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9URlRQX1JFQURfRElSRUNUT1JZLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX0dFVF9GSUxFX1NJWkUsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfTVRGVFBfUkVBRF9GSUxFLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX1JFQURfRElSRUNUT1JZLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX0xBU1QKK30gRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9PUENPREU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVBfQUREUkVTUyAgIE1DYXN0SXA7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQgIENQb3J0OworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1VEUF9QT1JUICBTUG9ydDsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuVGltZW91dDsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgVHJhbnNtaXRUaW1lb3V0OworfSBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUF9JTkZPOworCisvLworLy8gUFhFIEJhc2UgQ29kZSBNb2RlIHN0cnVjdHVyZQorLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9NQVhfQVJQX0VOVFJJRVMgICAgICAgOAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9NQVhfUk9VVEVfRU5UUklFUyAgICAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgSXB2NkF2YWlsYWJsZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIElwdjZTdXBwb3J0ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZ0lwdjY7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBCaXNTdXBwb3J0ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBCaXNEZXRlY3RlZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9BcnA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kR1VJRDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIERoY3BEaXNjb3ZlclZhbGlkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgRGhjcEFja1JlY2VpdmVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlPZmZlclJlY2VpdmVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgUHhlRGlzY292ZXJWYWxpZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIFB4ZVJlcGx5UmVjZWl2ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBQeGVCaXNSZXBseVJlY2VpdmVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgSWNtcEVycm9yUmVjZWl2ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBUZnRwRXJyb3JSZWNlaXZlZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VDYWxsYmFja3M7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBUVEw7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBUb1M7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICBTdGF0aW9uSXA7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICBTdWJuZXRNYXNrOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgICAgRGhjcERpc2NvdmVyOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgICAgRGhjcEFjazsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICAgIFByb3h5T2ZmZXI7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICBQeGVEaXNjb3ZlcjsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICAgIFB4ZVJlcGx5OworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgICAgUHhlQmlzUmVwbHk7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSICAgICBJcEZpbHRlcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEFycENhY2hlRW50cmllczsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9BUlBfRU5UUlkgICAgIEFycENhY2hlW0VGSV9QWEVfQkFTRV9DT0RFX01BWF9BUlBfRU5UUklFU107CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZVRhYmxlRW50cmllczsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9ST1VURV9FTlRSWSAgIFJvdXRlVGFibGVbRUZJX1BYRV9CQVNFX0NPREVfTUFYX1JPVVRFX0VOVFJJRVNdOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0lDTVBfRVJST1IgICAgSWNtcEVycm9yOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfRVJST1IgICAgVGZ0cEVycm9yOworfSBFRklfUFhFX0JBU0VfQ09ERV9NT0RFOworCisvLworLy8gUFhFIEJhc2UgQ29kZSBJbnRlcmZhY2UgRnVuY3Rpb24gZGVmaW5pdGlvbnMKKy8vCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NUQVJUKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIFVzZUlwdjYKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9TVE9QKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX0RIQ1ApICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgU29ydE9mZmVycworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX0RJU0NPVkVSKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAgICAgICAgICpUaGlzLAorICAgIElOIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLAorICAgIElOIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTGF5ZXIsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUJpcywKKyAgICBJTiBPVVQgRUZJX1BYRV9CQVNFX0NPREVfRElTQ09WRVJfSU5GTyAgKkluZm8gICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX01URlRQKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9PUENPREUgICAgT3BlcmF0aW9uLAorICAgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJQdHIgIE9QVElPTkFMLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ3cml0ZSwKKyAgICBJTiBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQmxvY2tTaXplICBPUFRJT05BTCwKKyAgICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqU2VydmVySXAsCisgICAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgKkZpbGVuYW1lLAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX0lORk8gICAgICpJbmZvICAgICAgIE9QVElPTkFMLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgIERvbnRVc2VCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9VRFBfV1JJVEUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICAgICAqVGhpcywKKyAgICBJTiBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPcEZsYWdzLAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICpEZXN0SXAsCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQgICAgICAgKkRlc3RQb3J0LAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICpHYXRld2F5SXAsICBPUFRJT05BTAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICpTcmNJcCwgICAgICBPUFRJT05BTAorICAgIElOIE9VVCBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUE9SVCAgICpTcmNQb3J0LCAgICBPUFRJT05BTAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICpIZWFkZXJTaXplLCBPUFRJT05BTAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpIZWFkZXJQdHIsICBPUFRJT05BTAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJQdHIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9VRFBfUkVBRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgICAgICpUaGlzLAorICAgIElOIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wRmxhZ3MsCisgICAgSU4gT1VUIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgKkRlc3RJcCwgICAgICBPUFRJT05BTAorICAgIElOIE9VVCBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUE9SVCAgICpEZXN0UG9ydCwgICAgT1BUSU9OQUwKKyAgICBJTiBPVVQgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAqU3JjSXAsICAgICAgIE9QVElPTkFMCisgICAgSU4gT1VUIEVGSV9QWEVfQkFTRV9DT0RFX1VEUF9QT1JUICAgKlNyY1BvcnQsICAgICBPUFRJT05BTAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICpIZWFkZXJTaXplLCAgT1BUSU9OQUwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSGVhZGVyUHRyLCAgIE9QVElPTkFMCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclB0cgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NFVF9JUF9GSUxURVIpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICpUaGlzLAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX0lQX0ZJTFRFUiAgKk5ld0ZpbHRlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX0FSUCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAqSXBBZGRyLCAgICAgIAorICAgIElOIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgKk1hY0FkZHIgICAgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NFVF9QQVJBTUVURVJTKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICpOZXdBdXRvQXJwLCAgICBPUFRJT05BTAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgKk5ld1NlbmRHVUlELCAgIE9QVElPTkFMCisgICAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAqTmV3VFRMLCAgICAgICAgT1BUSU9OQUwKKyAgICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICpOZXdUb1MsICAgICAgICBPUFRJT05BTAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgKk5ld01ha2VDYWxsYmFjayAgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NFVF9TVEFUSU9OX0lQKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcywKKyAgICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICpOZXdTdGF0aW9uSXAsICBPUFRJT05BTAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgKk5ld1N1Ym5ldE1hc2sgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BYRV9CQVNFX0NPREVfU0VUX1BBQ0tFVFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICpUaGlzLAorICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgKk5ld0RoY3BEaXNjb3ZlclZhbGlkLCAgT1BUSU9OQUwKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdEaGNwQWNrUmVjZWl2ZWQsICAgIE9QVElPTkFMCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3UHJveHlPZmZlclJlY2VpdmVkLCBPUFRJT05BTAorICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgKk5ld1B4ZURpc2NvdmVyVmFsaWQsICAgT1BUSU9OQUwKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdQeGVSZXBseVJlY2VpdmVkLCAgIE9QVElPTkFMCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3UHhlQmlzUmVwbHlSZWNlaXZlZCxPUFRJT05BTAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgKk5ld0RoY3BEaXNjb3ZlciwgT1BUSU9OQUwKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICpOZXdEaGNwQWNrLCAgICAgIE9QVElPTkFMCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAqTmV3UHJveHlPZmZlciwgICBPUFRJT05BTAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgKk5ld1B4ZURpc2NvdmVyLCAgT1BUSU9OQUwKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICpOZXdQeGVSZXBseSwgICAgIE9QVElPTkFMCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAqTmV3UHhlQmlzUmVwbHkgICBPUFRJT05BTAorICAgICk7CisKKy8vCisvLyBQWEUgQmFzZSBDb2RlIFByb3RvY29sIHN0cnVjdHVyZQorLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9JTlRFUkZBQ0VfUkVWSVNJT04gICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1NUQVJUICAgICAgICAgICAgIFN0YXJ0OworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1NUT1AgICAgICAgICAgICAgIFN0b3A7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfREhDUCAgICAgICAgICAgICAgRGhjcDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9ESVNDT1ZFUiAgICAgICAgICBEaXNjb3ZlcjsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUCAgICAgICAgICAgICBNdGZ0cDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9VRFBfV1JJVEUgICAgICAgICBVZHBXcml0ZTsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUkVBRCAgICAgICAgICBVZHBSZWFkOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1NFVF9JUF9GSUxURVIgICAgIFNldElwRmlsdGVyOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0FSUCAgICAgICAgICAgICAgIEFycDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9TRVRfUEFSQU1FVEVSUyAgICBTZXRQYXJhbWV0ZXJzOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1NFVF9TVEFUSU9OX0lQICAgIFNldFN0YXRpb25JcDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9TRVRfUEFDS0VUUyAgICAgICBTZXRQYWNrZXRzOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX01PREUgICAgICAgICAgICAgICpNb2RlOworfSBFRklfUFhFX0JBU0VfQ09ERTsKKworLy8KKy8vIENhbGwgQmFjayBEZWZpbml0aW9ucworLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDS19QUk9UT0NPTCBcCisgICAgeyAweDI0NWRjYTIxLCAweGZiN2IsIDB4MTFkMywgezB4OGYsIDB4MDEsIDB4MDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworLy8KKy8vIFJldmlzaW9uIE51bWJlcgorLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDS19JTlRFUkZBQ0VfUkVWSVNJT04gICAweDAwMDEwMDAwCisKK0lOVEVSRkFDRV9ERUNMKF9FRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDSyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fRklSU1QsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fREhDUCwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9GVU5DVElPTl9ESVNDT1ZFUiwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9GVU5DVElPTl9NVEZUUCwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9GVU5DVElPTl9VRFBfV1JJVEUsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fVURQX1JFQUQsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fQVJQLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX0ZVTkNUSU9OX0lHTVAsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfUFhFX0ZVTkNUSU9OX0xBU1QKK30gRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT047CisKK3R5cGVkZWYgZW51bSB7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfU1RBVFVTX0ZJUlNULAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX0NBTExCQUNLX1NUQVRVU19DT05USU5VRSwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDS19TVEFUVVNfQUJPUlQsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfU1RBVFVTX0xBU1QKK30gRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfU1RBVFVTOworCit0eXBlZGVmCitFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDS19TVEFUVVMgCisoRUZJQVBJICpFRklfUFhFX0NBTExCQUNLKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDSyAgICpUaGlzLAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX0ZVTkNUSU9OICAgICAgICAgICBGdW5jdGlvbiwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZWQsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldExlbiwKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICAgICAgICAgKlBhY2tldCAgICAgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0sgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfUFhFX0NBTExCQUNLICAgICAgICAgICAgQ2FsbGJhY2s7Cit9IEVGSV9QWEVfQkFTRV9DT0RFX0NBTExCQUNLOworCisjZW5kaWYgLyogX0VGSVBYRUJDX0ggKi8KZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2VmaXJ0bGliLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlydGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzNlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlydGxpYi5oCkBAIC0wLDAgKzEsMTQxIEBACisjaWZuZGVmIF9FRklfUlRfTElCX0lOQ0xVREVfCisjZGVmaW5lIF9FRklfUlRfTElCX0lOQ0xVREVfCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlsaWIuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBSdW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImVmaWRlYnVnLmgiCisjaW5jbHVkZSAiZWZpcGFydC5oIgorI2luY2x1ZGUgImVmaWxpYnBsYXQuaCIKKworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0WmVyb01lbSAoCisgICAgSU4gVk9JRCAgICAgKkJ1ZmZlciwKKyAgICBJTiBVSU5UTiAgICAgU2l6ZQorICAgICk7CisKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRTZXRNZW0gKAorICAgIElOIFZPSUQgICAgICpCdWZmZXIsCisgICAgSU4gVUlOVE4gICAgU2l6ZSwKKyAgICBJTiBVSU5UOCAgICBWYWx1ZSAgICAKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0Q29weU1lbSAoCisgICAgSU4gVk9JRCAgICAgKkRlc3QsCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKlNyYywKKyAgICBJTiBVSU5UTiAgICBsZW4KKyAgICApOworCitJTlROCitSVU5USU1FRlVOQ1RJT04KK1J0Q29tcGFyZU1lbSAoCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKkRlc3QsCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKlNyYywKKyAgICBJTiBVSU5UTiAgICBsZW4KKyAgICApOworCitJTlROCitSVU5USU1FRlVOQ1RJT04KK1J0U3RyQ21wICgKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczEsCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMyCisgICAgKTsKKworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0U3RyQ3B5ICgKKyAgICBJTiBDSEFSMTYgICAqRGVzdCwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAgKlNyYworICAgICk7CisKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRTdHJDYXQgKAorICAgIElOIENIQVIxNiAgICpEZXN0LAorICAgIElOIENPTlNUIENIQVIxNiAgICpTcmMKKyAgICApOworCitVSU5UTgorUlVOVElNRUZVTkNUSU9OCitSdFN0ckxlbiAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxCisgICAgKTsKKworVUlOVE4KK1JVTlRJTUVGVU5DVElPTgorUnRTdHJTaXplICgKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczEKKyAgICApOworCitJTlROCitSVU5USU1FRlVOQ1RJT04KK1J0Q29tcGFyZUd1aWQgKAorICAgIElOIEVGSV9HVUlEICAgICAqR3VpZDEsCisgICAgSU4gRUZJX0dVSUQgICAgICpHdWlkMgorICAgICk7CisKK1VJTlQ4CitSVU5USU1FRlVOQ1RJT04KK1J0RGVjaW1hbHRvQkNEKAorICAgIElOICBVSU5UOCBCY2RWYWx1ZQorICAgICk7CisKK1VJTlQ4CitSVU5USU1FRlVOQ1RJT04KK1J0QkNEdG9EZWNpbWFsKAorICAgIElOICBVSU5UOCBCY2RWYWx1ZQorICAgICk7CisKKy8vCisvLyBWaXJ0dWFsIG1hcHBpbmcgdHJhbnNpdGlvbiBzdXBwb3J0LiAgKE9ubHkgdXNlZCBkdXJpbmcKKy8vIHRoZSB2aXJ0dWFsIGFkZHJlc3MgY2hhbmdlIHRyYW5zaXNpdGlvbikKKy8vCisKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRMaWJFbmFibGVWaXJ0dWFsTWFwcGluZ3MgKAorICAgIFZPSUQKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0Q29udmVydExpc3QgKAorICAgIElOIFVJTlROICAgICAgICAgICAgRGVidWdEaXNwb3NpdGlvbiwKKyAgICBJTiBPVVQgTElTVF9FTlRSWSAgICpMaXN0SGVhZAorICAgICk7CisKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRBY3F1aXJlTG9jayAoCisgICAgSU4gRkxPQ0sgICAgKkxvY2sKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0UmVsZWFzZUxvY2sgKAorICAgIElOIEZMT0NLICAgICpMb2NrCisgICAgKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2VmaXNlci5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjOTdhMQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaXNlci5oCkBAIC0wLDAgKzEsMTMyIEBACisjaWZuZGVmIF9FRklfU0VSX0gKKyNkZWZpbmUgX0VGSV9TRVJfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlzZXIuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBzZXJpYWwgcHJvdG9jb2wKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBTZXJpYWwgcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgU0VSSUFMX0lPX1BST1RPQ09MIFwKKyAgICB7IDB4QkIyNUNGNkYsIDB4RjFENCwgMHgxMUQyLCB7MHg5QSwgMHgwQywgMHgwMCwgMHg5MCwgMHgyNywgMHgzRiwgMHhDMSwgMHhGRH0gfQorCitJTlRFUkZBQ0VfREVDTChfU0VSSUFMX0lPX0lOVEVSRkFDRSk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRGVmYXVsdFBhcml0eSwgICAgICAKKyAgICBOb1Bhcml0eSwgICAgICAgICAgIAorICAgIEV2ZW5QYXJpdHksCisgICAgT2RkUGFyaXR5LAorICAgIE1hcmtQYXJpdHksCisgICAgU3BhY2VQYXJpdHkKK30gRUZJX1BBUklUWV9UWVBFOworCit0eXBlZGVmIGVudW0geworICAgIERlZmF1bHRTdG9wQml0cywgICAgICAgIAorICAgIE9uZVN0b3BCaXQsICAgICAgICAgLy8gMSBzdG9wIGJpdAorICAgIE9uZUZpdmVTdG9wQml0cywgICAgLy8gMS41IHN0b3AgYml0cworICAgIFR3b1N0b3BCaXRzICAgICAgICAgLy8gMiBzdG9wIGJpdHMKK30gRUZJX1NUT1BfQklUU19UWVBFOworCisjZGVmaW5lIEVGSV9TRVJJQUxfQ0xFQVJfVE9fU0VORCAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfREFUQV9TRVRfUkVBRFkgICAgICAgICAgICAgICAgICAweDAwMjAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfUklOR19JTkRJQ0FURSAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfQ0FSUklFUl9ERVRFQ1QgICAgICAgICAgICAgICAgICAweDAwODAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfUkVRVUVTVF9UT19TRU5EICAgICAgICAgICAgICAgICAweDAwMDIgIC8vIFdPCisjZGVmaW5lIEVGSV9TRVJJQUxfREFUQV9URVJNSU5BTF9SRUFEWSAgICAgICAgICAgICAweDAwMDEgIC8vIFdPCisjZGVmaW5lIEVGSV9TRVJJQUxfSU5QVVRfQlVGRkVSX0VNUFRZICAgICAgICAgICAgICAweDAxMDAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfT1VUUFVUX0JVRkZFUl9FTVBUWSAgICAgICAgICAgICAweDAyMDAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfSEFSRFdBUkVfTE9PUEJBQ0tfRU5BQkxFICAgICAgICAweDEwMDAgIC8vIFJXCisjZGVmaW5lIEVGSV9TRVJJQUxfU09GVFdBUkVfTE9PUEJBQ0tfRU5BQkxFICAgICAgICAweDIwMDAgIC8vIFJXCisjZGVmaW5lIEVGSV9TRVJJQUxfSEFSRFdBUkVfRkxPV19DT05UUk9MX0VOQUJMRSAgICAweDQwMDAgIC8vIFJXCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVJJQUxfUkVTRVQpICgKKyAgICBJTiBzdHJ1Y3QgX1NFUklBTF9JT19JTlRFUkZBQ0UgICpUaGlzCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUklBTF9TRVRfQVRUUklCVVRFUykgKAorICAgIElOIHN0cnVjdCBfU0VSSUFMX0lPX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBCYXVkUmF0ZSwKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVGaWZvRGVwdGgsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAorICAgIElOIEVGSV9QQVJJVFlfVFlQRSAgICAgICAgICAgICAgUGFyaXR5LAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJpdHMsCisgICAgSU4gRUZJX1NUT1BfQklUU19UWVBFICAgICAgICAgICBTdG9wQml0cworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVJJQUxfU0VUX0NPTlRST0xfQklUUykgKAorICAgIElOIHN0cnVjdCBfU0VSSUFMX0lPX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUklBTF9HRVRfQ09OVFJPTF9CSVRTKSAoCisgICAgSU4gc3RydWN0IF9TRVJJQUxfSU9fSU5URVJGQUNFICAqVGhpcywKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICpDb250cm9sCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUklBTF9XUklURSkgKAorICAgIElOIHN0cnVjdCBfU0VSSUFMX0lPX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VSSUFMX1JFQUQpICgKKyAgICBJTiBzdHJ1Y3QgX1NFUklBTF9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIENvbnRyb2xNYXNrOworCisgICAgLy8gY3VycmVudCBBdHRyaWJ1dGVzCisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgVGltZW91dDsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBCYXVkUmF0ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBSZWNlaXZlRmlmb0RlcHRoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIERhdGFCaXRzOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIFBhcml0eTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBTdG9wQml0czsKK30gU0VSSUFMX0lPX01PREU7CisKKyNkZWZpbmUgU0VSSUFMX0lPX0lOVEVSRkFDRV9SRVZJU0lPTiAgICAweDAwMDEwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9TRVJJQUxfSU9fSU5URVJGQUNFIHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIEVGSV9TRVJJQUxfUkVTRVQgICAgICAgICAgICAgUmVzZXQ7CisgICAgRUZJX1NFUklBTF9TRVRfQVRUUklCVVRFUyAgICBTZXRBdHRyaWJ1dGVzOworICAgIEVGSV9TRVJJQUxfU0VUX0NPTlRST0xfQklUUyAgU2V0Q29udHJvbDsKKyAgICBFRklfU0VSSUFMX0dFVF9DT05UUk9MX0JJVFMgIEdldENvbnRyb2w7CisgICAgRUZJX1NFUklBTF9XUklURSAgICAgICAgICAgICBXcml0ZTsKKyAgICBFRklfU0VSSUFMX1JFQUQgICAgICAgICAgICAgIFJlYWQ7CisKKyAgICBTRVJJQUxfSU9fTU9ERSAgICAgICAgICAgICAgICpNb2RlOworfSBTRVJJQUxfSU9fSU5URVJGQUNFOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvZWZpc3RkYXJnLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZmlzdGRhcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTk2Yjk0Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpc3RkYXJnLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfRUZJU1REQVJHX0hfCisjZGVmaW5lIF9FRklTVERBUkdfSF8KKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZGV2cGF0aC5oCisKK0Fic3RyYWN0OgorCisgICAgRGVmaW5lcyBmb3IgcGFyc2luZyB0aGUgRUZJIERldmljZSBQYXRoIHN0cnVjdHVyZXMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworI2lmZGVmIF9fR05VQ19fCisjaW5jbHVkZSAic3RkYXJnLmgiCisjZWxzZQorI2RlZmluZSBfSU5UU0laRU9GKG4pICAgKCAoc2l6ZW9mKG4pICsgc2l6ZW9mKFVJTlROKSAtIDEpICYgfihzaXplb2YoVUlOVE4pIC0gMSkgKQorCit0eXBlZGVmIENIQVI4ICogdmFfbGlzdDsKKworI2RlZmluZSB2YV9zdGFydChhcCx2KSAgKCBhcCA9ICh2YV9saXN0KSZ2ICsgX0lOVFNJWkVPRih2KSApCisjZGVmaW5lIHZhX2FyZyhhcCx0KSAgICAoICoodCAqKSgoYXAgKz0gX0lOVFNJWkVPRih0KSkgLSBfSU5UU0laRU9GKHQpKSApCisjZGVmaW5lIHZhX2VuZChhcCkgICggYXAgPSAodmFfbGlzdCkwICkKKyNlbmRpZgorCisjZW5kaWYgIC8qIF9JTkNfU1REQVJHICovCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9lZml0Y3AuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL2VmaXRjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWRmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9lZml0Y3AuaApAQCAtMCwwICsxLDM5MSBAQAorI2lmbmRlZiBfRUZJX1RDUF9ICisjZGVmaW5lIF9FRklfVENQX0gKKworLyorKworQ29weXJpZ2h0IChjKSAyMDEzICBJbnRlbCBDb3Jwb3JhdGlvbgorCistLSovCisKKyNkZWZpbmUgRUZJX1RDUDRfU0VSVklDRV9CSU5ESU5HX1BST1RPQ09MIFwKKyAgICB7IDB4MDA3MjA2NjUsIDB4NjdlYiwgMHg0YTk5LCB7MHhiYSwgMHhmNywgMHhkMywgMHhjMywgMHgzYSwgMHgxYywweDdjLCAweGM5fX0KKworI2RlZmluZSBFRklfVENQNF9QUk9UT0NPTCBcCisgICAgeyAweDY1NTMwYmM3LCAweGEzNTksIDB4NDEwZiwgezB4YjAsIDB4MTAsIDB4NWEsIDB4YWQsIDB4YzcsIDB4ZWMsIDB4MmIsIDB4NjJ9fQorCisjZGVmaW5lIEVGSV9UQ1A2X1NFUlZJQ0VfQklORElOR19QUk9UT0NPTCBcCisgICAgeyAweGVjMjBlYjc5LCAweDZjMWEsIDB4NDY2NCwgezB4OWEsIDB4ZCwgMHhkMiwgMHhlNCwgMHhjYywgMHgxNiwgMHhkNiwgMHg2NH19CisKKyNkZWZpbmUgRUZJX1RDUDZfUFJPVE9DT0wgXAorICAgIHsgMHg0NmU0NDg1NSwgMHhiZDYwLCAweDRhYjcsIHsweGFiLCAweGQsIDB4YTYsIDB4NzksIDB4YjksIDB4NDQsIDB4N2QsIDB4Nzd9fQorCitJTlRFUkZBQ0VfREVDTChfRUZJX1RDUDQpOworSU5URVJGQUNFX0RFQ0woX0VGSV9UQ1A2KTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICBVc2VEZWZhdWx0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTICAgU3RhdGlvbkFkZHJlc3M7CisgICAgRUZJX0lQdjRfQUREUkVTUyAgIFN1Ym5ldE1hc2s7CisgICAgVUlOVDE2ICAgICAgICAgICAgIFN0YXRpb25Qb3J0OworICAgIEVGSV9JUHY0X0FERFJFU1MgICBSZW1vdGVBZGRyZXNzOworICAgIFVJTlQxNiAgICAgICAgICAgICBSZW1vdGVQb3J0OworICAgIEJPT0xFQU4gICAgICAgICAgICBBY3RpdmVGbGFnOworfSBFRklfVENQNF9BQ0NFU1NfUE9JTlQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgUmVjZWl2ZUJ1ZmZlclNpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgIFNlbmRCdWZmZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICBNYXhTeW5CYWNrTG9nOworICAgIFVJTlQzMiAgICAgICAgICAgICBDb25uZWN0aW9uVGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgRGF0YVJldHJpZXM7CisgICAgVUlOVDMyICAgICAgICAgICAgIEZpblRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICAgIFRpbWVXYWl0VGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgS2VlcEFsaXZlUHJvYmVzOworICAgIFVJTlQzMiAgICAgICAgICAgICBLZWVwQWxpdmVUaW1lOworICAgIFVJTlQzMiAgICAgICAgICAgICBLZWVwQWxpdmVJbnRlcnZhbDsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlTmFnbGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVRpbWVTdGFtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlV2luZG93U2NhbGluZzsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlU2VsZWN0aXZlQWNrOworICAgIEJPT0xFQU4gICAgICAgICAgICBFbmFibGVQQXRoTXR1RGlzY292ZXJ5OworfSBFRklfVENQNF9PUFRJT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvLyBSZWNlaXZpbmcgRmlsdGVycworICAgIC8vIEkvTyBwYXJhbWV0ZXJzCisgICAgVUlOVDggICAgICAgICAgICAgICAgIFR5cGVPZlNlcnZpY2U7CisgICAgVUlOVDggICAgICAgICAgICAgICAgIFRpbWVUb0xpdmU7CisKKyAgICAvLyBBY2Nlc3MgUG9pbnQKKyAgICBFRklfVENQNF9BQ0NFU1NfUE9JTlQgQWNjZXNzUG9pbnQ7CisKKyAgICAvLyBUQ1AgQ29udHJvbCBPcHRpb25zCisgICAgRUZJX1RDUDRfT1BUSU9OICAgICAgICpDb250cm9sT3B0aW9uOworfSBFRklfVENQNF9DT05GSUdfREFUQTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUY3A0U3RhdGVDbG9zZWQgICAgICA9IDAsCisgICAgVGNwNFN0YXRlTGlzdGVuICAgICAgPSAxLAorICAgIFRjcDRTdGF0ZVN5blNlbnQgICAgID0gMiwKKyAgICBUY3A0U3RhdGVTeW5SZWNlaXZlZCA9IDMsCisgICAgVGNwNFN0YXRlRXN0YWJsaXNoZWQgPSA0LAorICAgIFRjcDRTdGF0ZUZpbldhaXQxICAgID0gNSwKKyAgICBUY3A0U3RhdGVGaW5XYWl0MiAgICA9IDYsCisgICAgVGNwNFN0YXRlQ2xvc2luZyAgICAgPSA3LAorICAgIFRjcDRTdGF0ZVRpbWVXYWl0ICAgID0gOCwKKyAgICBUY3A0U3RhdGVDbG9zZVdhaXQgICA9IDksCisgICAgVGNwNFN0YXRlTGFzdEFjayAgICAgPSAxMAorfSBFRklfVENQNF9DT05ORUNUSU9OX1NUQVRFOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNF9HRVRfTU9ERV9EQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAgICAgICAgICAgICAgICAgKlRoaXMsCisgICAgT1VUIEVGSV9UQ1A0X0NPTk5FQ1RJT05fU1RBVEUgICAgICAgKlRjcDRTdGF0ZSAgICAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfVENQNF9DT05GSUdfREFUQSAgICAgICAgICAgICpUY3A0Q29uZmlnRGF0YSBPUFRJT05BTCwKKyAgICBPVVQgRUZJX0lQNF9NT0RFX0RBVEEgICAgICAgICAgICAgICAqSXA0TW9kZURhdGEgICAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9NQU5BR0VEX05FVFdPUktfQ09ORklHX0RBVEEgKk1ucENvbmZpZ0RhdGEgIE9QVElPTkFMLAorICAgIE9VVCBFRklfU0lNUExFX05FVFdPUktfTU9ERSAgICAgICAgICpTbnBNb2RlRGF0YSAgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X0NPTkZJR1VSRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A0X0NPTkZJR19EQVRBICpUY3BDb25maWdEYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfUk9VVEVTKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgIERlbGV0ZVJvdXRlLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKlN1Ym5ldEFkZHJlc3MsCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqU3VibmV0TWFzaywKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpHYXRld2F5QWRkcmVzcworKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9FVkVOVCAgRXZlbnQ7CisgICAgRUZJX1NUQVRVUyBTdGF0dXM7Cit9IEVGSV9UQ1A0X0NPTVBMRVRJT05fVE9LRU47CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVENQNF9DT01QTEVUSU9OX1RPS0VOIENvbXBsZXRpb25Ub2tlbjsKK30gRUZJX1RDUDRfQ09OTkVDVElPTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfQ09OTkVDVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDRfQ09OTkVDVElPTl9UT0tFTiAqQ29ubmVjdGlvblRva2VuCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9UQ1A0X0NPTVBMRVRJT05fVE9LRU4gQ29tcGxldGlvblRva2VuOworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgTmV3Q2hpbGRIYW5kbGU7Cit9IEVGSV9UQ1A0X0xJU1RFTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfQUNDRVBUKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A0X0xJU1RFTl9UT0tFTiAqTGlzdGVuVG9rZW4KKyAgICApOworCisjZGVmaW5lIEVGSV9DT05ORUNUSU9OX0ZJTiAgICAgRUZJRVJSKDEwNCkKKyNkZWZpbmUgRUZJX0NPTk5FQ1RJT05fUkVTRVQgICBFRklFUlIoMTA1KQorI2RlZmluZSBFRklfQ09OTkVDVElPTl9SRUZVU0VEIEVGSUVSUigxMDYpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgRnJhZ21lbnRMZW5ndGg7CisgICAgVk9JRCAgICpGcmFnbWVudEJ1ZmZlcjsKK30gRUZJX1RDUDRfRlJBR01FTlRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgVXJnZW50RmxhZzsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9UQ1A0X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX1RDUDRfUkVDRUlWRV9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICBQdXNoOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgVXJnZW50OworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX1RDUDRfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfVENQNF9UUkFOU01JVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RDUDRfQ09NUExFVElPTl9UT0tFTiAgQ29tcGxldGlvblRva2VuOworICAgIHVuaW9uIHsKKwlFRklfVENQNF9SRUNFSVZFX0RBVEEgICpSeERhdGE7CisJRUZJX1RDUDRfVFJBTlNNSVRfREFUQSAqVHhEYXRhOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldDsKK30gRUZJX1RDUDRfSU9fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X1RSQU5TTUlUKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDRfSU9fVE9LRU4gKlRva2VuCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfUkVDRUlWRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgICpUaGlzLAorICAgIElOIEVGSV9UQ1A0X0lPX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVENQNF9DT01QTEVUSU9OX1RPS0VOIENvbXBsZXRpb25Ub2tlbjsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgIEFib3J0T25DbG9zZTsKK30gRUZJX1RDUDRfQ0xPU0VfVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X0NMT1NFKSgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A0ICAgICAqVGhpcywKKyAgICBJTiBFRklfVENQNF9DTE9TRV9UT0tFTiAqQ2xvc2VUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X0NBTkNFTCkoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAqVGhpcywKKyAgICBJTiBFRklfVENQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbiBPUFRJT05BTAorKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfUE9MTCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgKlRoaXMKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1RDUDQgeworICAgIEVGSV9UQ1A0X0dFVF9NT0RFX0RBVEEgR2V0TW9kZURhdGE7CisgICAgRUZJX1RDUDRfQ09ORklHVVJFICAgICBDb25maWd1cmU7CisgICAgRUZJX1RDUDRfUk9VVEVTICAgICAgICBSb3V0ZXM7CisgICAgRUZJX1RDUDRfQ09OTkVDVCAgICAgICBDb25uZWN0OworICAgIEVGSV9UQ1A0X0FDQ0VQVCAgICAgICAgQWNjZXB0OworICAgIEVGSV9UQ1A0X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX1RDUDRfUkVDRUlWRSAgICAgICBSZWNlaXZlOworICAgIEVGSV9UQ1A0X0NMT1NFICAgICAgICAgQ2xvc2U7CisgICAgRUZJX1RDUDRfQ0FOQ0VMICAgICAgICBDYW5jZWw7CisgICAgRUZJX1RDUDRfUE9MTCAgICAgICAgICBQb2xsOworfSBFRklfVENQNDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUY3A2U3RhdGVDbG9zZWQgICAgICA9IDAsCisgICAgVGNwNlN0YXRlTGlzdGVuICAgICAgPSAxLAorICAgIFRjcDZTdGF0ZVN5blNlbnQgICAgID0gMiwKKyAgICBUY3A2U3RhdGVTeW5SZWNlaXZlZCA9IDMsCisgICAgVGNwNlN0YXRlRXN0YWJsaXNoZWQgPSA0LAorICAgIFRjcDZTdGF0ZUZpbldhaXQxICAgID0gNSwKKyAgICBUY3A2U3RhdGVGaW5XYWl0MiAgICA9IDYsCisgICAgVGNwNlN0YXRlQ2xvc2luZyAgICAgPSA3LAorICAgIFRjcDZTdGF0ZVRpbWVXYWl0ICAgID0gOCwKKyAgICBUY3A2U3RhdGVDbG9zZVdhaXQgICA9IDksCisgICAgVGNwNlN0YXRlTGFzdEFjayAgICAgPSAxMAorfSBFRklfVENQNl9DT05ORUNUSU9OX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjZfQUREUkVTUyBTdGF0aW9uQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFN0YXRpb25Qb3J0OworICAgIEVGSV9JUHY2X0FERFJFU1MgUmVtb3RlQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFJlbW90ZVBvcnQ7CisgICAgQk9PTEVBTiAgICAgICAgICBBY3RpdmVGbGFnOworfSBFRklfVENQNl9BQ0NFU1NfUE9JTlQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgUmVjZWl2ZUJ1ZmZlclNpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgIFNlbmRCdWZmZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICBNYXhTeW5CYWNrTG9nOworICAgIFVJTlQzMiAgICAgICAgICAgICBDb25uZWN0aW9uVGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgRGF0YVJldHJpZXM7CisgICAgVUlOVDMyICAgICAgICAgICAgIEZpblRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICAgIFRpbWVXYWl0VGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgS2VlcEFsaXZlUHJvYmVzOworICAgIFVJTlQzMiAgICAgICAgICAgICBLZWVwQWxpdmVUaW1lOworICAgIFVJTlQzMiAgICAgICAgICAgICBLZWVwQWxpdmVJbnRlcnZhbDsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlTmFnbGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVRpbWVTdGFtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlV2luZGJvd1NjYWxpbmc7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVNlbGVjdGl2ZUFjazsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlUGF0aE10dURpc2NvdmVyeTsKK30gRUZJX1RDUDZfT1BUSU9OOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgIFRyYWZmaWNDbGFzczsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgSG9wTGltaXQ7CisgICAgRUZJX1RDUDZfQUNDRVNTX1BPSU5UIEFjY2Vzc1BvaW50OworICAgIEVGSV9UQ1A2X09QVElPTiAgICAgICAqQ29udHJvbE9wdGlvbjsKK30gRUZJX1RDUDZfQ09ORklHX0RBVEE7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A2X0dFVF9NT0RFX0RBVEEpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A2ICAgICAgICAgICAgICAgICAqVGhpcywKKyAgICBPVVQgRUZJX1RDUDZfQ09OTkVDVElPTl9TVEFURSAgICAgICAqVGNwNlN0YXRlICAgICAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9UQ1A2X0NPTkZJR19EQVRBICAgICAgICAgICAgKlRjcDZDb25maWdEYXRhIE9QVElPTkFMLAorICAgIE9VVCBFRklfSVA2X01PREVfREFUQSAgICAgICAgICAgICAgICpJcDZNb2RlRGF0YSAgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BTkFHRURfTkVUV09SS19DT05GSUdfREFUQSAqTW5wQ29uZmlnRGF0YSAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9TSU1QTEVfTkVUV09SS19NT0RFICAgICAgICAgKlNucE1vZGVEYXRhICAgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfQ09ORklHVVJFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDZfQ09ORklHX0RBVEEgKlRjcDZDb25maWdEYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9FVkVOVCAgRXZlbnQ7CisgICAgRUZJX1NUQVRVUyBTdGF0dXM7Cit9IEVGSV9UQ1A2X0NPTVBMRVRJT05fVE9LRU47CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVENQNl9DT01QTEVUSU9OX1RPS0VOIENvbXBsZXRpb25Ub2tlbjsKK30gRUZJX1RDUDZfQ09OTkVDVElPTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfQ09OTkVDVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDZfQ09OTkVDVElPTl9UT0tFTiAqQ29ubmVjdGlvblRva2VuCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9UQ1A2X0NPTVBMRVRJT05fVE9LRU4gQ29tcGxldGlvblRva2VuOworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgTmV3Q2hpbGRIYW5kbGU7Cit9IEVGSV9UQ1A2X0xJU1RFTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfQUNDRVBUKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A2X0xJU1RFTl9UT0tFTiAqTGlzdGVuVG9rZW4KKyAgICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyIEZyYWdtZW50TGVuZ3RoOworICAgIFZPSUQgICAqRnJhZ21lbnRCdWZmZXI7Cit9IEVGSV9UQ1A2X0ZSQUdNRU5UX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIFVyZ2VudEZsYWc7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfVENQNl9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9UQ1A2X1JFQ0VJVkVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgUHVzaDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIFVyZ2VudDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9UQ1A2X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX1RDUDZfVFJBTlNNSVRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9UQ1A2X0NPTVBMRVRJT05fVE9LRU4gIENvbXBsZXRpb25Ub2tlbjsKKyAgICB1bmlvbiB7CisJRUZJX1RDUDZfUkVDRUlWRV9EQVRBICAqUnhEYXRhOworCUVGSV9UQ1A2X1RSQU5TTUlUX0RBVEEgKlR4RGF0YTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQ7Cit9IEVGSV9UQ1A2X0lPX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9UUkFOU01JVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgICpUaGlzLAorICAgIElOIEVGSV9UQ1A2X0lPX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A2X1JFQ0VJVkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A2ICAqVGhpcywKKyAgICBJTiBFRklfVENQNl9JT19UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RDUDZfQ09NUExFVElPTl9UT0tFTiBDb21wbGV0aW9uVG9rZW47CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICBBYm9ydE9uQ2xvc2U7Cit9IEVGSV9UQ1A2X0NMT1NFX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9DTE9TRSkoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDZfQ0xPU0VfVE9LRU4gKkNsb3NlVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9DQU5DRUwpKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDZfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4gT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9QT0xMKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAqVGhpcworICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfVENQNiB7CisgICAgRUZJX1RDUDZfR0VUX01PREVfREFUQSBHZXRNb2RlRGF0YTsKKyAgICBFRklfVENQNl9DT05GSUdVUkUgICAgIENvbmZpZ3VyZTsKKyAgICBFRklfVENQNl9DT05ORUNUICAgICAgIENvbm5lY3Q7CisgICAgRUZJX1RDUDZfQUNDRVBUICAgICAgICBBY2NlcHQ7CisgICAgRUZJX1RDUDZfVFJBTlNNSVQgICAgICBUcmFuc21pdDsKKyAgICBFRklfVENQNl9SRUNFSVZFICAgICAgIFJlY2VpdmU7CisgICAgRUZJX1RDUDZfQ0xPU0UgICAgICAgICBDbG9zZTsKKyAgICBFRklfVENQNl9DQU5DRUwgICAgICAgIENhbmNlbDsKKyAgICBFRklfVENQNl9QT0xMICAgICAgICAgIFBvbGw7Cit9IEVGSV9UQ1A2OworCisjZW5kaWYgLyogX0VGSV9UQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvZWZpdWRwLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9lZml1ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhiNDY3Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpdWRwLmgKQEAgLTAsMCArMSwyNzIgQEAKKyNpZm5kZWYgX0VGSV9VRFBfSAorI2RlZmluZSBfRUZJX1VEUF9ICisKKworLyorKworQ29weXJpZ2h0IChjKSAyMDEzICBJbnRlbCBDb3Jwb3JhdGlvbgorCistLSovCisKKyNkZWZpbmUgRUZJX1VEUDRfU0VSVklDRV9CSU5ESU5HX1BST1RPQ09MIFwKKyAgICB7IDB4ODNmMDE0NjQsIDB4OTliZCwgMHg0NWU1LCB7MHhiMywgMHg4MywgMHhhZiwgMHg2MywgMHgwNSwgMHhkOCwgMHhlOSwgMHhlNn0gfQorCisjZGVmaW5lIEVGSV9VRFA0X1BST1RPQ09MIFwKKyAgICB7IDB4M2FkOWRmMjksIDB4NDUwMSwgMHg0NzhkLCB7MHhiMSwgMHhmOCwgMHg3ZiwgMHg3ZiwgMHhlNywgMHgwZSwgMHg1MCwgMHhmM30gfQorCisjZGVmaW5lIEVGSV9VRFA2X1NFUlZJQ0VfQklORElOR19QUk9UT0NPTCBcCisgICAgeyAweDY2ZWQ0NzIxLCAweDNjOTgsIDB4NGQzZSwgezB4ODEsIDB4ZTMsIDB4ZDAsIDB4M2QsIDB4ZDMsIDB4OWEsIDB4NzIsIDB4NTR9IH0KKworI2RlZmluZSBFRklfVURQNl9QUk9UT0NPTCBcCisgICAgeyAweDRmOTQ4ODE1LCAweGI0YjksIDB4NDNjYiwgezB4OGEsIDB4MzMsIDB4OTAsIDB4ZTAsIDB4NjAsIDB4YjMsMHg0OSwgMHg1NX0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX1VEUDQpOworSU5URVJGQUNFX0RFQ0woX0VGSV9VRFA2KTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QnJvYWRjYXN0OworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0UHJvbWlzY3VvdXM7CisgICAgQk9PTEVBTiAgICAgICAgICBBY2NlcHRBbnlQb3J0OworICAgIEJPT0xFQU4gICAgICAgICAgQWxsb3dEdXBsaWNhdGVQb3J0OworICAgIFVJTlQ4ICAgICAgICAgICAgVHlwZU9mU2VydmljZTsKKyAgICBVSU5UOCAgICAgICAgICAgIFRpbWVUb0xpdmU7CisgICAgQk9PTEVBTiAgICAgICAgICBEb05vdEZyYWdtZW50OworICAgIFVJTlQzMiAgICAgICAgICAgUmVjZWl2ZVRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICBUcmFuc21pdFRpbWVvdXQ7CisgICAgQk9PTEVBTiAgICAgICAgICBVc2VEZWZhdWx0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN0YXRpb25BZGRyZXNzOworICAgIEVGSV9JUHY0X0FERFJFU1MgU3VibmV0TWFzazsKKyAgICBVSU5UMTYgICAgICAgICAgIFN0YXRpb25Qb3J0OworICAgIEVGSV9JUHY0X0FERFJFU1MgUmVtb3RlQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFJlbW90ZVBvcnQ7Cit9IEVGSV9VRFA0X0NPTkZJR19EQVRBOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9HRVRfTU9ERV9EQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAgICAgICAgICAgICAgICAgKlRoaXMsCisgICAgT1VUIEVGSV9VRFA0X0NPTkZJR19EQVRBICAgICAgICAgICAgKlVkcDRDb25maWdEYXRhIE9QVElPTkFMLAorICAgIE9VVCBFRklfSVA0X01PREVfREFUQSAgICAgICAgICAgICAgICpJcDRNb2RlRGF0YSAgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BTkFHRURfTkVUV09SS19DT05GSUdfREFUQSAqTW5wQ29uZmlnRGF0YSAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9TSU1QTEVfTkVUV09SS19NT0RFICAgICAgICAgKlNucE1vZGVEYXRhICAgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDRfQ09ORklHVVJFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDRfQ09ORklHX0RBVEEgKlVkcENvbmZpZ0RhdGEgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9HUk9VUFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA0ICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgSm9pbkZsYWcsCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqTXVsdGljYXN0QWRkcmVzcyBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA0X1JPVVRFUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDQgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBEZWxldGVSb3V0ZSwKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpTdWJuZXRBZGRyZXNzLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKlN1Ym5ldE1hc2ssCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqR2F0ZXdheUFkZHJlc3MKKyAgICApOworCisjZGVmaW5lIEVGSV9ORVRXT1JLX1VOUkVBQ0hBQkxFICBFRklFUlIoMTAwKQorI2RlZmluZSBFRklfSE9TVF9VTlJFQUNIQUJMRSAgICAgRUZJRVJSKDEwMSkKKyNkZWZpbmUgRUZJX1BST1RPQ09MX1VOUkVBQ0hBQkxFIEVGSUVSUigxMDIpCisjZGVmaW5lIEVGSV9QT1JUX1VOUkVBQ0hBQkxFICAgICBFRklFUlIoMTAzKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjRfQUREUkVTUyBTb3VyY2VBZGRyZXNzOworICAgIFVJTlQxNiAgICAgICAgICAgU291cmNlUG9ydDsKKyAgICBFRklfSVB2NF9BRERSRVNTIERlc3RpbmF0aW9uQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIERlc3RpbmF0aW9uUG9ydDsKK30gRUZJX1VEUDRfU0VTU0lPTl9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyIEZyYWdtZW50TGVuZ3RoOworICAgIFZPSUQgICAqRnJhZ21lbnRCdWZmZXI7Cit9IEVGSV9VRFA0X0ZSQUdNRU5UX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVElNRSAgICAgICAgICAgICAgIFRpbWVTdGFtcDsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgIFJlY3ljbGVTaWduYWw7CisgICAgRUZJX1VEUDRfU0VTU0lPTl9EQVRBICBVZHBTZXNzaW9uOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX1VEUDRfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfVURQNF9SRUNFSVZFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVURQNF9TRVNTSU9OX0RBVEEgICpVZHBTZXNzaW9uRGF0YTsKKyAgICBFRklfSVB2NF9BRERSRVNTICAgICAgICpHYXRld2F5QWRkcmVzczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9VRFA0X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX1VEUDRfVFJBTlNNSVRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9FVkVOVCAgICAgICAgICAgICAgICAgIEV2ZW50OworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgIFN0YXR1czsKKyAgICB1bmlvbiB7CisgICAgICAgIEVGSV9VRFA0X1JFQ0VJVkVfREFUQSAgKlJ4RGF0YTsKKwlFRklfVURQNF9UUkFOU01JVF9EQVRBICpUeERhdGE7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0OworfSBFRklfVURQNF9DT01QTEVUSU9OX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9UUkFOU01JVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDRfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9SRUNFSVZFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfVURQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA0X0NBTkNFTCkoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfVURQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbiBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA0X1BPTEwpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA0ICpUaGlzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9VRFA0IHsKKyAgICBFRklfVURQNF9HRVRfTU9ERV9EQVRBIEdldE1vZGVEYXRhOworICAgIEVGSV9VRFA0X0NPTkZJR1VSRSAgICAgQ29uZmlndXJlOworICAgIEVGSV9VRFA0X0dST1VQUyAgICAgICAgR3JvdXBzOworICAgIEVGSV9VRFA0X1JPVVRFUyAgICAgICAgUm91dGVzOworICAgIEVGSV9VRFA0X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX1VEUDRfUkVDRUlWRSAgICAgICBSZWNlaXZlOworICAgIEVGSV9VRFA0X0NBTkNFTCAgICAgICAgQ2FuY2VsOworICAgIEVGSV9VRFA0X1BPTEwgICAgICAgICAgUG9sbDsKK30gRUZJX1VEUDQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdFByb21pc2N1b3VzOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QW55UG9ydDsKKyAgICBCT09MRUFOICAgICAgICAgIEFsbG93RHVwbGljYXRlUG9ydDsKKyAgICBVSU5UOCAgICAgICAgICAgIFRyYWZmaWNDbGFzczsKKyAgICBVSU5UOCAgICAgICAgICAgIEhvcExpbWl0OworICAgIFVJTlQzMiAgICAgICAgICAgUmVjZWl2ZVRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICBUcmFuc21pdFRpbWVvdXQ7CisgICAgRUZJX0lQdjZfQUREUkVTUyBTdGF0aW9uQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFN0YXRpb25Qb3J0OworICAgIEVGSV9JUHY2X0FERFJFU1MgUmVtb3RlQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFJlbW90ZVBvcnQ7Cit9IEVGSV9VRFA2X0NPTkZJR19EQVRBOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9HRVRfTU9ERV9EQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAgICAgICAgICAgICAgICAgKlRoaXMsCisgICAgT1VUIEVGSV9VRFA2X0NPTkZJR19EQVRBICAgICAgICAgICAgKlVkcDZDb25maWdEYXRhIE9QVElPTkFMLAorICAgIE9VVCBFRklfSVA2X01PREVfREFUQSAgICAgICAgICAgICAgICpJcDZNb2RlRGF0YSAgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BTkFHRURfTkVUV09SS19DT05GSUdfREFUQSAqTW5wQ29uZmlnRGF0YSAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9TSU1QTEVfTkVUV09SS19NT0RFICAgICAgICAgKlNucE1vZGVEYXRhICAgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDZfQ09ORklHVVJFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDZfQ09ORklHX0RBVEEgKlVkcENvbmZpZ0RhdGEgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9HUk9VUFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA2ICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgSm9pbkZsYWcsCisgICAgSU4gRUZJX0lQdjZfQUREUkVTUyAqTXVsdGljYXN0QWRkcmVzcyBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2Nl9BRERSRVNTIFNvdXJjZUFkZHJlc3M7CisgICAgVUlOVDE2ICAgICAgICAgICBTb3VyY2VQb3J0OworICAgIEVGSV9JUHY2X0FERFJFU1MgRGVzdGluYXRpb25BZGRyZXNzOworICAgIFVJTlQxNiAgICAgICAgICAgRGVzdGluYXRpb25Qb3J0OworfSBFRklfVURQNl9TRVNTSU9OX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgRnJhZ21lbnRMZW5ndGg7CisgICAgVk9JRCAgICpGcmFnbWVudEJ1ZmZlcjsKK30gRUZJX1VEUDZfRlJBR01FTlRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9USU1FICAgICAgICAgICAgICAgVGltZVN0YW1wOworICAgIEVGSV9FVkVOVCAgICAgICAgICAgICAgUmVjeWNsZVNpZ25hbDsKKyAgICBFRklfVURQNl9TRVNTSU9OX0RBVEEgIFVkcFNlc3Npb247CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfVURQNl9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9VRFA2X1JFQ0VJVkVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9VRFA2X1NFU1NJT05fREFUQSAgKlVkcFNlc3Npb25EYXRhOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX1VEUDZfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfVURQNl9UUkFOU01JVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgICAgICAgRXZlbnQ7CisgICAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgU3RhdHVzOworICAgIHVuaW9uIHsKKyAgICAgICAgRUZJX1VEUDZfUkVDRUlWRV9EQVRBICAqUnhEYXRhOworICAgICAgICBFRklfVURQNl9UUkFOU01JVF9EQVRBICpUeERhdGE7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0OworfSBFRklfVURQNl9DT01QTEVUSU9OX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9UUkFOU01JVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDZfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9SRUNFSVZFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfVURQNl9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA2X0NBTkNFTCkoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfVURQNl9DT01QTEVUSU9OX1RPS0VOICpUb2tlbiBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA2X1BPTEwpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA2ICpUaGlzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9VRFA2IHsKKyAgICBFRklfVURQNl9HRVRfTU9ERV9EQVRBIEdldE1vZGVEYXRhOworICAgIEVGSV9VRFA2X0NPTkZJR1VSRSAgICAgQ29uZmlndXJlOworICAgIEVGSV9VRFA2X0dST1VQUyAgICAgICAgR3JvdXBzOworICAgIEVGSV9VRFA2X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX1VEUDZfUkVDRUlWRSAgICAgICBSZWNlaXZlOworICAgIEVGSV9VRFA2X0NBTkNFTCAgICAgICAgQ2FuY2VsOworICAgIEVGSV9VRFA2X1BPTEwgICAgICAgICAgUG9sbDsKK30gRUZJX1VEUDY7CisKKyNlbmRpZiAvKiBfRUZJX1VEUF9IICovCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9lZml1aS5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpdWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQxOTQzCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvZWZpdWkuaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIF9FRklfVUlfSAorI2RlZmluZSBfRUZJX1VJX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDIwMCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBFZmlVaS5oCisgICAgCitBYnN0cmFjdDogICAKKyAgICBQcm90b2NvbCB1c2VkIHRvIGJ1aWxkIFVzZXIgSW50ZXJmYWNlIChVSSkgc3R1ZmYuCisKKyAgICBUaGlzIHByb3RvY29sIGlzIGp1c3QgZGF0YS4gSXQgaXMgYSBtdWx0aSBkaW1lbnRpb25hbCBhcnJheS4KKyAgICBGb3IgZWFjaCBzdHJpbmcgdGhlcmUgaXMgYW4gYXJyYXkgb2YgVUlfU1RSSU5HX0VOVFJZLiBFYWNoIHN0cmluZworICAgIGlzIGZvciBhIGRpZmZlcmVudCBsYW5ndWFnZSB0cmFuc2xhdGlvbiBvZiB0aGUgc2FtZSBzdHJpbmcuIFRoZSBsaXN0IAorICAgIGlzIHRlcm1pbmF0ZWQgYnkgYSBOVUxMIFVpU3RyaW5nLiBUaGVyZSBjYW4gYmUgYW55IG51bWJlciBvZiAKKyAgICBVSV9TVFJJTkdfRU5UUlkgYXJyYXlzLiBBIE5VTEwgYXJyYXkgdGVybWluYXRlcyB0aGUgbGlzdC4gQSBOVUxMIGFycmF5CisgICAgZW50cnkgY29udGFpbnMgYWxsIHplcm9zLiAgCisKKyAgICBUaHVzIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSBFRklfVUlfUFJPVE9DT0wgaGFzIHRocmVlIFVJX1NUUklOR19FTlRSWS4KKyAgICBUaGUgU3RyaW5nLCBpdCdzIE5VTEwgdGVybWluYXRvciwgYW5kIHRoZSBOVUxMIHRlcm1pbmF0b3IgZm9yIHRoZSBlbnRpcmUgCisgICAgdGhpbmcuCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNkZWZpbmUgRUZJX1VJX1BST1RPQ09MIFwKKyAgICB7IDB4MzJkZDc5ODEsIDB4MmQyNywgMHgxMWQ0LCB7MHhiYywgMHg4YiwgMHgwLCAweDgwLCAweGM3LCAweDNjLCAweDg4LCAweDgxfSB9CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBVaURldmljZVN0cmluZywKKyAgICBVaVZlbmRvclN0cmluZywKKyAgICBVaU1heFN0cmluZworfSBVSV9TVFJJTkdfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIElTT182MzlfMiAgICpMYW5nQ29kZTsKKyAgICBDSEFSMTYgICAgICAqVWlTdHJpbmc7Cit9IFVJX1NUUklOR19FTlRSWTsKKworI2RlZmluZSBFRklfVUlfVkVSU0lPTiAgICAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX1VJX0lOVEVSRkFDRSB7CisgICAgVUlOVDMyICAgICAgICAgIFZlcnNpb247CisgICAgVUlfU1RSSU5HX0VOVFJZICpFbnRyeTsKK30gVUlfSU5URVJGQUNFOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvaWEzMi9lZmliaW5kLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9pYTMyL2VmaWJpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWI5ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvaWEzMi9lZmliaW5kLmgKQEAgLTAsMCArMSwyODQgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmZWZpbmQuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSB0byBjb21waWxlIGJpbmRpbmdzCisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCisKKy8vCisvLyBCYXNpYyBpbnQgdHlwZXMgb2YgdmFyaW91cyB3aWR0aHMKKy8vCisKKyNpZiAhZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSB8fCAoX19TVERDX1ZFUlNJT05fXyA8IDE5OTkwMUwgKQorCisgICAgLy8gTm8gQU5TSSBDIDE5OTkvMjAwMCBzdGRpbnQuaCBpbnRlZ2VyIHdpZHRoIGRlY2xhcmF0aW9ucyAKKworICAgICNpZiBkZWZpbmVkKF9NU0NfRVhURU5TSU9OUykKKworICAgICAgICAvLyBVc2UgTWljcm9zb2Z0IEMgY29tcGlsZXIgaW50ZWdlciB3aWR0aCBkZWNsYXJhdGlvbnMgCisKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgIHVpbnQ2NF90OworICAgICAgICB0eXBlZGVmIF9faW50NjQgICAgICAgICAgICAgaW50NjRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyICAgIHVpbnQzMl90OworICAgICAgICB0eXBlZGVmIF9faW50MzIgICAgICAgICAgICAgaW50MzJfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVpbnQxNl90OworICAgICAgICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgaW50MTZfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVpbnQ4X3Q7CisgICAgICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBpbnQ4X3Q7CisgICAgI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgICAgICAgdHlwZWRlZiBpbnQgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpICAgICAgICAgICBpbnQ2NF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0RJX18pKSkgIHVpbnQ2NF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdWludDMyX3Q7CisgICAgICAgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBpbnQzMl90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdWludDE2X3Q7CisgICAgICAgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBpbnQxNl90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdWludDhfdDsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgY2hhciAgICAgICAgIGludDhfdDsKKyAgICAjZWxpZiBkZWZpbmVkKFVOSVhfTFA2NCkKKworICAgICAgICAvKiAgVXNlIExQNjQgcHJvZ3JhbW1pbmcgbW9kZWwgZnJvbSBDX0ZMQUdTIGZvciBpbnRlZ2VyIHdpZHRoIGRlY2xhcmF0aW9ucyAqLworCisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgIHVpbnQ2NF90OworICAgICAgIHR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICBpbnQ2NF90OworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICB1aW50MzJfdDsKKyAgICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgaW50MzJfdDsKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdWludDE2X3Q7CisgICAgICAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAgIGludDE2X3Q7CisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVpbnQ4X3Q7CisgICAgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIGludDhfdDsKKyAgICAjZWxzZQorCisgICAgICAgLyogIEFzc3VtZSBQNjQgcHJvZ3JhbW1pbmcgbW9kZWwgZnJvbSBDX0ZMQUdTIGZvciBpbnRlZ2VyIHdpZHRoIGRlY2xhcmF0aW9ucyAqLworCisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHVpbnQ2NF90IF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDgpKSk7CisgICAgICAgdHlwZWRlZiBsb25nIGxvbmcgICAgICAgICAgIGludDY0X3QgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKTsKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdWludDMyX3Q7CisgICAgICAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgIGludDMyX3Q7CisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVpbnQxNl90OworICAgICAgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBpbnQxNl90OworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1aW50OF90OworICAgICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBpbnQ4X3Q7CisgICAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorICAgICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvLworLy8gQmFzaWMgRUZJIHR5cGVzIG9mIHZhcmlvdXMgd2lkdGhzCisvLworCisjaWZuZGVmIF9fV0NIQVJfVFlQRV9fCisjIGRlZmluZSBfX1dDSEFSX1RZUEVfXyBzaG9ydAorI2VuZGlmCisKK3R5cGVkZWYgdWludDY0X3QgICBVSU5UNjQ7Cit0eXBlZGVmIGludDY0X3QgICAgSU5UNjQ7CisKKyNpZm5kZWYgX0JBU0VUU0RfSF8KKyAgICB0eXBlZGVmIHVpbnQzMl90ICAgVUlOVDMyOworICAgIHR5cGVkZWYgaW50MzJfdCAgICBJTlQzMjsKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQxNl90ICAgVUlOVDE2OwordHlwZWRlZiBpbnQxNl90ICAgIElOVDE2OwordHlwZWRlZiB1aW50OF90ICAgIFVJTlQ4OwordHlwZWRlZiBpbnQ4X3QgICAgIElOVDg7Cit0eXBlZGVmIF9fV0NIQVJfVFlQRV9fIFdDSEFSOworCisjdW5kZWYgVk9JRAorI2RlZmluZSBWT0lEICAgIHZvaWQKKworCit0eXBlZGVmIGludDMyX3QgICAgSU5UTjsKK3R5cGVkZWYgdWludDMyX3QgICBVSU5UTjsKKworI2lmZGVmIEVGSV9OVF9FTVVMQVRPUgorICAgICNkZWZpbmUgUE9TVF9DT0RFKF9EYXRhKQorI2Vsc2UgICAgCisgICAgI2lmZGVmIEVGSV9ERUJVRworI2RlZmluZSBQT1NUX0NPREUoX0RhdGEpICAgIF9fYXNtIG1vdiBlYXgsKF9EYXRhKSBfX2FzbSBvdXQgMHg4MCxhbAorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgUE9TVF9DT0RFKF9EYXRhKQorICAgICNlbmRpZiAgCisjZW5kaWYKKworI2RlZmluZSBFRklFUlIoYSkgICAgICAgICAgICgweDgwMDAwMDAwIHwgYSkKKyNkZWZpbmUgRUZJX0VSUk9SX01BU0sgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEVGSUVSUl9PRU0oYSkgICAgICAgKDB4YzAwMDAwMDAgfCBhKSAgICAgIAorCisKKyNkZWZpbmUgQkFEX1BPSU5URVIgICAgICAgICAweEZCRkJGQkZCCisjZGVmaW5lIE1BWF9BRERSRVNTICAgICAgICAgMHhGRkZGRkZGRgorCisjaWZkZWYgRUZJX05UX0VNVUxBVE9SCisgICAgI2RlZmluZSBCUkVBS1BPSU5UKCkgICAgICAgIF9fYXNtIHsgaW50IDMgfQorI2Vsc2UKKyAgICAjZGVmaW5lIEJSRUFLUE9JTlQoKSAgICAgICAgd2hpbGUgKFRSVUUpOyAgICAvLyBNYWtlIGl0IGhhbmcgb24gQmlvc1tEYmddMzIKKyNlbmRpZgorCisvLworLy8gUG9pbnRlcnMgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZXNlIGFkZHJlc3MgdG8gZnVuY3Rpb24KKy8vCisKKyNkZWZpbmUgTUlOX0FMSUdOTUVOVF9TSVpFICA0CisKKyNkZWZpbmUgQUxJR05fVkFSSUFCTEUoVmFsdWUgLEFkanVzdG1lbnQpIFwKKyAgICAgICAgICAgIChVSU5UTilBZGp1c3RtZW50ID0gMDsgXAorICAgICAgICAgICAgaWYoKFVJTlROKVZhbHVlICUgTUlOX0FMSUdOTUVOVF9TSVpFKSBcCisgICAgICAgICAgICAgICAgKFVJTlROKUFkanVzdG1lbnQgPSBNSU5fQUxJR05NRU5UX1NJWkUgLSAoKFVJTlROKVZhbHVlICUgTUlOX0FMSUdOTUVOVF9TSVpFKTsgXAorICAgICAgICAgICAgVmFsdWUgPSAoVUlOVE4pVmFsdWUgKyAoVUlOVE4pQWRqdXN0bWVudAorCisKKy8vCisvLyBEZWZpbmUgbWFjcm9zIHRvIGJ1aWxkIGRhdGEgc3RydWN0dXJlIHNpZ25hdHVyZXMgZnJvbSBjaGFyYWN0ZXJzLgorLy8KKworI2RlZmluZSBFRklfU0lHTkFUVVJFXzE2KEEsQikgICAgICAgICAgICAgKChBKSB8IChCPDw4KSkKKyNkZWZpbmUgRUZJX1NJR05BVFVSRV8zMihBLEIsQyxEKSAgICAgICAgIChFRklfU0lHTkFUVVJFXzE2KEEsQikgICAgIHwgKEVGSV9TSUdOQVRVUkVfMTYoQyxEKSAgICAgPDwgMTYpKQorI2RlZmluZSBFRklfU0lHTkFUVVJFXzY0KEEsQixDLEQsRSxGLEcsSCkgKEVGSV9TSUdOQVRVUkVfMzIoQSxCLEMsRCkgfCAoKFVJTlQ2NCkoRUZJX1NJR05BVFVSRV8zMihFLEYsRyxIKSkgPDwgMzIpKQorLy8KKy8vIFRvIGV4cG9ydCAmIGltcG9ydCBmdW5jdGlvbnMgaW4gdGhlIEVGSSBlbXVsYXRvciBlbnZpcm9ubWVudAorLy8KKworI2lmZGVmIEVGSV9OVF9FTVVMQVRPUgorICAgICNkZWZpbmUgRVhQT1JUQVBJICAgICAgICAgICBfX2RlY2xzcGVjKCBkbGxleHBvcnQgKQorI2Vsc2UKKyAgICAjZGVmaW5lIEVYUE9SVEFQSQorI2VuZGlmCisKKworLy8KKy8vIEVGSUFQSSAtIHByb3RvdHlwZSBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIEVGSSBmdW5jdGlvbiBwb2ludGVycworLy8gQk9PVFNFUlZJQ0UgLSBwcm90b3R5cGUgZm9yIGltcGxlbWVudGF0aW9uIG9mIGEgYm9vdCBzZXJ2aWNlIGludGVyZmFjZQorLy8gUlVOVElNRVNFUlZJQ0UgLSBwcm90b3R5cGUgZm9yIGltcGxlbWVudGF0aW9uIG9mIGEgcnVudGltZSBzZXJ2aWNlIGludGVyZmFjZQorLy8gUlVOVElNRUZVTkNUSU9OIC0gcHJvdG90eXBlIGZvciBpbXBsZW1lbnRhdGlvbiBvZiBhIHJ1bnRpbWUgZnVuY3Rpb24gdGhhdCBpcyBub3QgYSBzZXJ2aWNlCisvLyBSVU5USU1FX0NPREUgLSBwcmFnbWEgbWFjcm8gZm9yIGRlY2xhcmluZyBydW50aW1lIGNvZGUgICAgCisvLworCisjaWZuZGVmIEVGSUFQSSAgICAgICAgICAgICAgICAgIC8vIEZvcmNlcyBFRkkgY2FsbGluZyBjb252ZW50aW9ucyByZWd1YXJkbGVzcyBvZiBjb21waWxlciBvcHRpb25zIAorICAgICNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKKyAgICAgICAgI2RlZmluZSBFRklBUEkgX19jZGVjbCAgLy8gRm9yY2UgQyBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIE1pY3Jvc29mdCBDIGNvbXBpbGVyIAorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgRUZJQVBJICAgICAgICAgIC8vIFN1YnN0aXR1dGUgZXhwcmVzaW9uIHRvIGZvcmNlIEMgY2FsbGluZyBjb252ZW50aW9uIAorICAgICNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQk9PVFNFUlZJQ0UKKy8vI2RlZmluZSBSVU5USU1FU0VSVklDRShwcm90byxhKSAgICBhbGxvY190ZXh0KCJydGNvZGUiLGEpOyBwcm90byBhCisvLyNkZWZpbmUgUlVOVElNRUZVTkNUSU9OKHByb3RvLGEpICAgYWxsb2NfdGV4dCgicnRjb2RlIixhKTsgcHJvdG8gYQorI2RlZmluZSBSVU5USU1FU0VSVklDRQorI2RlZmluZSBSVU5USU1FRlVOQ1RJT04KKworCisjZGVmaW5lIFJVTlRJTUVfQ09ERShhKSAgICAgICAgIGFsbG9jX3RleHQoInJ0Y29kZSIsIGEpCisjZGVmaW5lIEJFR0lOX1JVTlRJTUVfREFUQSgpICAgIGRhdGFfc2VnKCJydGRhdGEiKQorI2RlZmluZSBFTkRfUlVOVElNRV9EQVRBKCkgICAgICBkYXRhX3NlZygiIikKKworI2RlZmluZSBWT0xBVElMRSAgICB2b2xhdGlsZQorCisjZGVmaW5lIE1FTU9SWV9GRU5DRSgpICAgIAorCisjaWZkZWYgRUZJX05UX0VNVUxBVE9SCisKKy8vCisvLyBUbyBoZWxwIGVuc3VyZSBwcm9wZXIgY29kaW5nIG9mIGludGVncmF0ZWQgZHJpdmVycywgdGhleSBhcmUKKy8vIGNvbXBpbGVkIGFzIERMTHMuICBJbiBOVCB0aGV5IHJlcXVpcmUgYSBkbGwgaW5pdCBlbnRyeSBwb2ludGVyLgorLy8gVGhlIG1hY3JvIHB1dHMgYSBzdHViIGVudHJ5IHBvaW50IGludG8gdGhlIERMTCBzbyBpdCB3aWxsIGxvYWQuCisvLworCisjZGVmaW5lIEVGSV9EUklWRVJfRU5UUllfUE9JTlQoSW5pdEZ1bmN0aW9uKSAgICBcCisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19zdGRjYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0RsbE1haW5DUlRTdGFydHVwICggICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFVJTlROICAgIEluc3QsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFVJTlROICAgIHJlYXNvbl9mb3JfY2FsbCwgICAgICAgICAgICAgICBcCisgICAgICAgIFZPSUQgICAgKnJzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRVhQT1JUQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19jZGVjbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSW5pdGlhbGl6ZURyaXZlciAoICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZvaWQgKkltYWdlSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZvaWQgKlN5c3RlbVRhYmxlICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBJbml0RnVuY3Rpb24oSW1hZ2VIYW5kbGUsIFN5c3RlbVRhYmxlKTsgICAgICAgXAorICAgIH0KKworCisgICAgI2RlZmluZSBMT0FEX0lOVEVSTkFMX0RSSVZFUihfaWYsIHR5cGUsIG5hbWUsIGVudHJ5KSAgICAgIFwKKyAgICAgICAgKF9pZiktPkxvYWRJbnRlcm5hbCh0eXBlLCBuYW1lLCBOVUxMKSAgICAgICAgICAgICAKKworI2Vsc2UgLy8gRUZJX05UX0VNVUxBVE9SIAorCisvLworLy8gV2hlbiBidWlsZCBzaW1pbGlhciB0byBGVywgdGhlbiBsaW5rIGV2ZXJ5dGhpbmcgdG9nZXRoZXIgYXMKKy8vIG9uZSBiaWcgbW9kdWxlLgorLy8KKworICAgICNkZWZpbmUgRUZJX0RSSVZFUl9FTlRSWV9QT0lOVChJbml0RnVuY3Rpb24pICAgIFwKKyAgICAgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEluaXRpYWxpemVEcml2ZXIgKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVk9JRCAgICAqSW1hZ2VIYW5kbGUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFZPSUQgICAgKlN5c3RlbVRhYmxlICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBJbml0RnVuY3Rpb24oSW1hZ2VIYW5kbGUsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRhYmxlKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVGSV9TVEFUVVMgZWZpX21haW4oICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRUZJX0hBTkRMRSBpbWFnZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEVGSV9TWVNURU1fVEFCTEUgKnN5c3RhYiAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICApIF9fYXR0cmlidXRlX18oKHdlYWssICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBhbGlhcyAoIkluaXRpYWxpemVEcml2ZXIiKSkpOworCisgICAgI2RlZmluZSBMT0FEX0lOVEVSTkFMX0RSSVZFUihfaWYsIHR5cGUsIG5hbWUsIGVudHJ5KSAgICBcCisgICAgICAgICAgICAoX2lmKS0+TG9hZEludGVybmFsKHR5cGUsIG5hbWUsIGVudHJ5KQorCisjZW5kaWYgLy8gRUZJX0ZXX05UIAorCisvLworLy8gU29tZSBjb21waWxlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgZm9yd2FyZCByZWZlcmVuY2UgY29uc3RydWN0OgorLy8gIHR5cGVkZWYgc3RydWN0IFhYWFhYCisvLworLy8gVGhlIGZvbGxvd2luZyBtYWNybyBwcm92aWRlIGEgd29ya2Fyb3VuZCBmb3Igc3VjaCBjYXNlcy4KKy8vCisjaWZkZWYgTk9fSU5URVJGQUNFX0RFQ0wKKyNkZWZpbmUgSU5URVJGQUNFX0RFQ0woeCkKKyNlbHNlCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgSU5URVJGQUNFX0RFQ0woeCkgc3RydWN0IHgKKyNlbHNlCisjZGVmaW5lIElOVEVSRkFDRV9ERUNMKHgpIHR5cGVkZWYgc3RydWN0IHgKKyNlbmRpZgorI2VuZGlmCisKKy8qIE5vIGVmaSBjYWxsIHdyYXBwZXIgZm9yIElBMzIgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIHVlZmlfY2FsbF93cmFwcGVyKGZ1bmMsIHZhX251bSwgLi4uKQlmdW5jKF9fVkFfQVJHU19fKQorI2RlZmluZSBFRklfRlVOQ1RJT04KKworI2lmZGVmIF9NU0NfRVhURU5TSU9OUworI3ByYWdtYSB3YXJuaW5nICggZGlzYWJsZSA6IDQ3MzEgKSAgLy8gU3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgbW9kaWZpY2F0aW9uIG9mIEVCUAorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL2lhMzIvZWZpbGlicGxhdC5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvaWEzMi9lZmlsaWJwbGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0NDU3OAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL2lhMzIvZWZpbGlicGxhdC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaWxpYnBsYXQuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSB0byBjb21waWxlIGJpbmRpbmdzCisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCitWT0lECitJbml0aWFsaXplTGliUGxhdGZvcm0gKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIElOIEVGSV9TWVNURU1fVEFCTEUgICAgICpTeXN0ZW1UYWJsZQorICAgICk7CisKKyAgIApkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvaWEzMi9wZS5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvaWEzMi9wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OWI5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9pYTMyL3BlLmgKQEAgLTAsMCArMSw1OTUgQEAKKy8qIAorICAgIFBFMzIrIGhlYWRlciBmaWxlCisgKi8KKyNpZm5kZWYgX1BFX0gKKyNkZWZpbmUgX1BFX0gKKworI2RlZmluZSBJTUFHRV9ET1NfU0lHTkFUVVJFICAgICAgICAgICAgICAgICAweDVBNEQgICAgICAvLyBNWgorI2RlZmluZSBJTUFHRV9PUzJfU0lHTkFUVVJFICAgICAgICAgICAgICAgICAweDQ1NEUgICAgICAvLyBORQorI2RlZmluZSBJTUFHRV9PUzJfU0lHTkFUVVJFX0xFICAgICAgICAgICAgICAweDQ1NEMgICAgICAvLyBMRQorI2RlZmluZSBJTUFHRV9OVF9TSUdOQVRVUkUgICAgICAgICAgICAgICAgICAweDAwMDA0NTUwICAvLyBQRTAwICAKKyNkZWZpbmUgSU1BR0VfRURPU19TSUdOQVRVUkUgICAgICAgICAgICAgICAgMHg0NDQ1NDU1MCAgLy8gUEVFRAorCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9ET1NfSEVBREVSIHsgICAgICAvLyBET1MgLkVYRSBoZWFkZXIKKyAgICBVSU5UMTYgICBlX21hZ2ljOyAgICAgICAgICAgICAgICAgICAgIC8vIE1hZ2ljIG51bWJlcgorICAgIFVJTlQxNiAgIGVfY2JscDsgICAgICAgICAgICAgICAgICAgICAgLy8gQnl0ZXMgb24gbGFzdCBwYWdlIG9mIGZpbGUKKyAgICBVSU5UMTYgICBlX2NwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhZ2VzIGluIGZpbGUKKyAgICBVSU5UMTYgICBlX2NybGM7ICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbG9jYXRpb25zCisgICAgVUlOVDE2ICAgZV9jcGFyaGRyOyAgICAgICAgICAgICAgICAgICAvLyBTaXplIG9mIGhlYWRlciBpbiBwYXJhZ3JhcGhzCisgICAgVUlOVDE2ICAgZV9taW5hbGxvYzsgICAgICAgICAgICAgICAgICAvLyBNaW5pbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkCisgICAgVUlOVDE2ICAgZV9tYXhhbGxvYzsgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkCisgICAgVUlOVDE2ICAgZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIChyZWxhdGl2ZSkgU1MgdmFsdWUKKyAgICBVSU5UMTYgICBlX3NwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgU1AgdmFsdWUKKyAgICBVSU5UMTYgICBlX2NzdW07ICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrc3VtCisgICAgVUlOVDE2ICAgZV9pcDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIElQIHZhbHVlCisgICAgVUlOVDE2ICAgZV9jczsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUKKyAgICBVSU5UMTYgICBlX2xmYXJsYzsgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgYWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlCisgICAgVUlOVDE2ICAgZV9vdm5vOyAgICAgICAgICAgICAgICAgICAgICAvLyBPdmVybGF5IG51bWJlcgorICAgIFVJTlQxNiAgIGVfcmVzWzRdOyAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXJ2ZWQgd29yZHMKKyAgICBVSU5UMTYgICBlX29lbWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIE9FTSBpZGVudGlmaWVyIChmb3IgZV9vZW1pbmZvKQorICAgIFVJTlQxNiAgIGVfb2VtaW5mbzsgICAgICAgICAgICAgICAgICAgLy8gT0VNIGluZm9ybWF0aW9uOyBlX29lbWlkIHNwZWNpZmljCisgICAgVUlOVDE2ICAgZV9yZXMyWzEwXTsgICAgICAgICAgICAgICAgICAvLyBSZXNlcnZlZCB3b3JkcworICAgIFVJTlQzMiAgIGVfbGZhbmV3OyAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBhZGRyZXNzIG9mIG5ldyBleGUgaGVhZGVyCisgIH0gSU1BR0VfRE9TX0hFQURFUiwgKlBJTUFHRV9ET1NfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfT1MyX0hFQURFUiB7ICAgICAgLy8gT1MvMiAuRVhFIGhlYWRlcgorICAgIFVJTlQxNiAgIG5lX21hZ2ljOyAgICAgICAgICAgICAgICAgICAgLy8gTWFnaWMgbnVtYmVyCisgICAgVUlOVDggICAgbmVfdmVyOyAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uIG51bWJlcgorICAgIFVJTlQ4ICAgIG5lX3JldjsgICAgICAgICAgICAgICAgICAgICAgLy8gUmV2aXNpb24gbnVtYmVyCisgICAgVUlOVDE2ICAgbmVfZW50dGFiOyAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgRW50cnkgVGFibGUKKyAgICBVSU5UMTYgICBuZV9jYmVudHRhYjsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBFbnRyeSBUYWJsZQorICAgIFVJTlQzMiAgIG5lX2NyYzsgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzdW0gb2Ygd2hvbGUgZmlsZQorICAgIFVJTlQxNiAgIG5lX2ZsYWdzOyAgICAgICAgICAgICAgICAgICAgLy8gRmxhZyBVSU5UMTYKKyAgICBVSU5UMTYgICBuZV9hdXRvZGF0YTsgICAgICAgICAgICAgICAgIC8vIEF1dG9tYXRpYyBkYXRhIHNlZ21lbnQgbnVtYmVyCisgICAgVUlOVDE2ICAgbmVfaGVhcDsgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIGhlYXAgYWxsb2NhdGlvbgorICAgIFVJTlQxNiAgIG5lX3N0YWNrOyAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBzdGFjayBhbGxvY2F0aW9uCisgICAgVUlOVDMyICAgbmVfY3NpcDsgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIENTOklQIHNldHRpbmcKKyAgICBVSU5UMzIgICBuZV9zc3NwOyAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgU1M6U1Agc2V0dGluZworICAgIFVJTlQxNiAgIG5lX2NzZWc7ICAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgb2YgZmlsZSBzZWdtZW50cworICAgIFVJTlQxNiAgIG5lX2Ntb2Q7ICAgICAgICAgICAgICAgICAgICAgLy8gRW50cmllcyBpbiBNb2R1bGUgUmVmZXJlbmNlIFRhYmxlCisgICAgVUlOVDE2ICAgbmVfY2JucmVzdGFiOyAgICAgICAgICAgICAgICAvLyBTaXplIG9mIG5vbi1yZXNpZGVudCBuYW1lIHRhYmxlCisgICAgVUlOVDE2ICAgbmVfc2VndGFiOyAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgU2VnbWVudCBUYWJsZQorICAgIFVJTlQxNiAgIG5lX3JzcmN0YWI7ICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIFJlc291cmNlIFRhYmxlCisgICAgVUlOVDE2ICAgbmVfcmVzdGFiOyAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgcmVzaWRlbnQgbmFtZSB0YWJsZQorICAgIFVJTlQxNiAgIG5lX21vZHRhYjsgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIE1vZHVsZSBSZWZlcmVuY2UgVGFibGUKKyAgICBVSU5UMTYgICBuZV9pbXB0YWI7ICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBJbXBvcnRlZCBOYW1lcyBUYWJsZQorICAgIFVJTlQzMiAgIG5lX25yZXN0YWI7ICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIE5vbi1yZXNpZGVudCBOYW1lcyBUYWJsZQorICAgIFVJTlQxNiAgIG5lX2Ntb3ZlbnQ7ICAgICAgICAgICAgICAgICAgLy8gQ291bnQgb2YgbW92YWJsZSBlbnRyaWVzCisgICAgVUlOVDE2ICAgbmVfYWxpZ247ICAgICAgICAgICAgICAgICAgICAvLyBTZWdtZW50IGFsaWdubWVudCBzaGlmdCBjb3VudAorICAgIFVJTlQxNiAgIG5lX2NyZXM7ICAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgb2YgcmVzb3VyY2Ugc2VnbWVudHMKKyAgICBVSU5UOCAgICBuZV9leGV0eXA7ICAgICAgICAgICAgICAgICAgIC8vIFRhcmdldCBPcGVyYXRpbmcgc3lzdGVtCisgICAgVUlOVDggICAgbmVfZmxhZ3NvdGhlcnM7ICAgICAgICAgICAgICAvLyBPdGhlciAuRVhFIGZsYWdzCisgICAgVUlOVDE2ICAgbmVfcHJldHRodW5rczsgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gcmV0dXJuIHRodW5rcworICAgIFVJTlQxNiAgIG5lX3BzZWdyZWZieXRlczsgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIHNlZ21lbnQgcmVmLiBieXRlcworICAgIFVJTlQxNiAgIG5lX3N3YXBhcmVhOyAgICAgICAgICAgICAgICAgLy8gTWluaW11bSBjb2RlIHN3YXAgYXJlYSBzaXplCisgICAgVUlOVDE2ICAgbmVfZXhwdmVyOyAgICAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBXaW5kb3dzIHZlcnNpb24gbnVtYmVyCisgIH0gSU1BR0VfT1MyX0hFQURFUiwgKlBJTUFHRV9PUzJfSEVBREVSOworCisvLworLy8gRmlsZSBoZWFkZXIgZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0ZJTEVfSEVBREVSIHsKKyAgICBVSU5UMTYgICBNYWNoaW5lOworICAgIFVJTlQxNiAgIE51bWJlck9mU2VjdGlvbnM7CisgICAgVUlOVDMyICAgVGltZURhdGVTdGFtcDsKKyAgICBVSU5UMzIgICBQb2ludGVyVG9TeW1ib2xUYWJsZTsKKyAgICBVSU5UMzIgICBOdW1iZXJPZlN5bWJvbHM7CisgICAgVUlOVDE2ICAgU2l6ZU9mT3B0aW9uYWxIZWFkZXI7CisgICAgVUlOVDE2ICAgQ2hhcmFjdGVyaXN0aWNzOworfSBJTUFHRV9GSUxFX0hFQURFUiwgKlBJTUFHRV9GSUxFX0hFQURFUjsKKworI2RlZmluZSBJTUFHRV9TSVpFT0ZfRklMRV9IRUFERVIgICAgICAgICAgICAgMjAKKworI2RlZmluZSBJTUFHRV9GSUxFX1JFTE9DU19TVFJJUFBFRCAgICAgICAgICAgMHgwMDAxICAvLyBSZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlLgorI2RlZmluZSBJTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UgICAgICAgICAgMHgwMDAyICAvLyBGaWxlIGlzIGV4ZWN1dGFibGUgIChpLmUuIG5vIHVucmVzb2x2ZWQgZXh0ZXJuZWwgcmVmZXJlbmNlcykuCisjZGVmaW5lIElNQUdFX0ZJTEVfTElORV9OVU1TX1NUUklQUEVEICAgICAgICAweDAwMDQgIC8vIExpbmUgbnVuYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUuCisjZGVmaW5lIElNQUdFX0ZJTEVfTE9DQUxfU1lNU19TVFJJUFBFRCAgICAgICAweDAwMDggIC8vIExvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlLgorI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0xPICAgICAgICAgMHgwMDgwICAvLyBCeXRlcyBvZiBtYWNoaW5lIHdvcmQgYXJlIHJldmVyc2VkLgorI2RlZmluZSBJTUFHRV9GSUxFXzMyQklUX01BQ0hJTkUgICAgICAgICAgICAgMHgwMTAwICAvLyAzMiBiaXQgd29yZCBtYWNoaW5lLgorI2RlZmluZSBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVEICAgICAgICAgICAgMHgwMjAwICAvLyBEZWJ1Z2dpbmcgaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUgaW4gLkRCRyBmaWxlCisjZGVmaW5lIElNQUdFX0ZJTEVfU1lTVEVNICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8vIFN5c3RlbSBGaWxlLgorI2RlZmluZSBJTUFHRV9GSUxFX0RMTCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvLyBGaWxlIGlzIGEgRExMLgorI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0hJICAgICAgICAgMHg4MDAwICAvLyBCeXRlcyBvZiBtYWNoaW5lIHdvcmQgYXJlIHJldmVyc2VkLgorCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9VTktOT1dOICAgICAgICAgICAwCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9JMzg2ICAgICAgICAgICAgICAweDE0YyAgIC8vIEludGVsIDM4Ni4KKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1IzMDAwICAgICAgICAgICAgIDB4MTYyICAgLy8gTUlQUyBsaXR0bGUtZW5kaWFuLCAwNTQwIGJpZy1lbmRpYW4KKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1I0MDAwICAgICAgICAgICAgIDB4MTY2ICAgLy8gTUlQUyBsaXR0bGUtZW5kaWFuCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9BTFBIQSAgICAgICAgICAgICAweDE4NCAgIC8vIEFscGhhX0FYUAorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfQVJNVEhVTUJfTUlYRUQgICAgMHgxYzIgICAvLyBBcm0vVGh1bWIKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1BPV0VSUEMgICAgICAgICAgIDB4MUYwICAgLy8gSUJNIFBvd2VyUEMgTGl0dGxlLUVuZGlhbgorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfSUE2NCAgICAgICAgICAgICAgMHgyMDAgICAvLyBJQS02NAorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfVEFIT0UgICAgICAgICAgICAgMHg3Y2MgICAvLyBJbnRlbCBFTSBtYWNoaW5lCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9FQkMgICAgICAgICAgICAgICAweGViYyAgIC8vIEVGSSBCeXRlIENvZGUKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1g2NCAgICAgICAgICAgICAgIDB4ODY2NCAgLy8geDg2XzY0CisvLworLy8gRGlyZWN0b3J5IGZvcm1hdC4KKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9EQVRBX0RJUkVDVE9SWSB7CisgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7CisgICAgVUlOVDMyICAgU2l6ZTsKK30gSU1BR0VfREFUQV9ESVJFQ1RPUlksICpQSU1BR0VfREFUQV9ESVJFQ1RPUlk7CisKKyNkZWZpbmUgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVMgICAgMTYKKworLy8KKy8vIE9wdGlvbmFsIGhlYWRlciBmb3JtYXQuCisvLworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfT1BUSU9OQUxfSEVBREVSIHsKKyAgICAvLworICAgIC8vIFN0YW5kYXJkIGZpZWxkcy4KKyAgICAvLworCisgICAgVUlOVDE2ICAgIE1hZ2ljOworICAgIFVJTlQ4ICAgICBNYWpvckxpbmtlclZlcnNpb247CisgICAgVUlOVDggICAgIE1pbm9yTGlua2VyVmVyc2lvbjsKKyAgICBVSU5UMzIgICAgU2l6ZU9mQ29kZTsKKyAgICBVSU5UMzIgICAgU2l6ZU9mSW5pdGlhbGl6ZWREYXRhOworICAgIFVJTlQzMiAgICBTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsKKyAgICBVSU5UMzIgICAgQWRkcmVzc09mRW50cnlQb2ludDsKKyAgICBVSU5UMzIgICAgQmFzZU9mQ29kZTsKKyAgICBVSU5UMzIgICAgQmFzZU9mRGF0YTsKKyAgICAgICAgICAgICAgICAKKyAgICAvLworICAgIC8vIE5UIGFkZGl0aW9uYWwgZmllbGRzLgorICAgIC8vCisKKyAgICBVSU5UMzIgICBJbWFnZUJhc2U7CisgICAgVUlOVDMyICAgU2VjdGlvbkFsaWdubWVudDsKKyAgICBVSU5UMzIgICBGaWxlQWxpZ25tZW50OworICAgIFVJTlQxNiAgIE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKKyAgICBVSU5UMTYgICBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgICAgVUlOVDE2ICAgTWFqb3JJbWFnZVZlcnNpb247CisgICAgVUlOVDE2ICAgTWlub3JJbWFnZVZlcnNpb247CisgICAgVUlOVDE2ICAgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOworICAgIFVJTlQxNiAgIE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsKKyAgICBVSU5UMzIgICBSZXNlcnZlZDE7CisgICAgVUlOVDMyICAgU2l6ZU9mSW1hZ2U7CisgICAgVUlOVDMyICAgU2l6ZU9mSGVhZGVyczsKKyAgICBVSU5UMzIgICBDaGVja1N1bTsKKyAgICBVSU5UMTYgICBTdWJzeXN0ZW07CisgICAgVUlOVDE2ICAgRGxsQ2hhcmFjdGVyaXN0aWNzOworICAgIFVJTlQzMiAgIFNpemVPZlN0YWNrUmVzZXJ2ZTsKKyAgICBVSU5UMzIgICBTaXplT2ZTdGFja0NvbW1pdDsKKyAgICBVSU5UMzIgICBTaXplT2ZIZWFwUmVzZXJ2ZTsKKyAgICBVSU5UMzIgICBTaXplT2ZIZWFwQ29tbWl0OworICAgIFVJTlQzMiAgIExvYWRlckZsYWdzOworICAgIFVJTlQzMiAgIE51bWJlck9mUnZhQW5kU2l6ZXM7CisgICAgSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107Cit9IElNQUdFX09QVElPTkFMX0hFQURFUiwgKlBJTUFHRV9PUFRJT05BTF9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSIHsKKyAgICBVSU5UMTYgIE1hZ2ljOworICAgIFVJTlQ4ICAgTWFqb3JMaW5rZXJWZXJzaW9uOworICAgIFVJTlQ4ICAgTWlub3JMaW5rZXJWZXJzaW9uOworICAgIFVJTlQzMiAgU2l6ZU9mQ29kZTsKKyAgICBVSU5UMzIgIFNpemVPZkluaXRpYWxpemVkRGF0YTsKKyAgICBVSU5UMzIgIFNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOworICAgIFVJTlQzMiAgQWRkcmVzc09mRW50cnlQb2ludDsKKyAgICBVSU5UMzIgIEJhc2VPZkNvZGU7CisgICAgVUlOVDMyICBCYXNlT2ZEYXRhOworICAgIFVJTlQzMiAgQmFzZU9mQnNzOworICAgIFVJTlQzMiAgR3ByTWFzazsKKyAgICBVSU5UMzIgIENwck1hc2tbNF07CisgICAgVUlOVDMyICBHcFZhbHVlOworfSBJTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSLCAqUElNQUdFX1JPTV9PUFRJT05BTF9IRUFERVI7CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1JPTV9PUFRJT05BTF9IRUFERVIgICAgICA1NgorI2RlZmluZSBJTUFHRV9TSVpFT0ZfU1REX09QVElPTkFMX0hFQURFUiAgICAgIDI4CisjZGVmaW5lIElNQUdFX1NJWkVPRl9OVF9PUFRJT05BTF9IRUFERVIgICAgICAyMjQKKworI2RlZmluZSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMgICAgICAgIDB4MTBiCisjZGVmaW5lIElNQUdFX1JPTV9PUFRJT05BTF9IRFJfTUFHSUMgICAgICAgMHgxMDcKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX05UX0hFQURFUlMgeworICAgIFVJTlQzMiBTaWduYXR1cmU7CisgICAgSU1BR0VfRklMRV9IRUFERVIgRmlsZUhlYWRlcjsKKyAgICBJTUFHRV9PUFRJT05BTF9IRUFERVIgT3B0aW9uYWxIZWFkZXI7Cit9IElNQUdFX05UX0hFQURFUlMsICpQSU1BR0VfTlRfSEVBREVSUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1JPTV9IRUFERVJTIHsKKyAgICBJTUFHRV9GSUxFX0hFQURFUiBGaWxlSGVhZGVyOworICAgIElNQUdFX1JPTV9PUFRJT05BTF9IRUFERVIgT3B0aW9uYWxIZWFkZXI7Cit9IElNQUdFX1JPTV9IRUFERVJTLCAqUElNQUdFX1JPTV9IRUFERVJTOworCisjZGVmaW5lIElNQUdFX0ZJUlNUX1NFQ1RJT04oIG50aGVhZGVyICkgKChQSU1BR0VfU0VDVElPTl9IRUFERVIpICAgICAgICBcCisgICAgKChVSU5UMzIpbnRoZWFkZXIgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBGSUVMRF9PRkZTRVQoIElNQUdFX05UX0hFQURFUlMsIE9wdGlvbmFsSGVhZGVyICkgKyAgICAgICAgICAgICAgICAgXAorICAgICAoKFBJTUFHRV9OVF9IRUFERVJTKShudGhlYWRlcikpLT5GaWxlSGVhZGVyLlNpemVPZk9wdGlvbmFsSGVhZGVyICAgXAorICAgICkpCisKKworLy8gU3Vic3lzdGVtIFZhbHVlcworCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9VTktOT1dOICAgICAgICAgICAgICAwICAgLy8gVW5rbm93biBzdWJzeXN0ZW0uCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9OQVRJVkUgICAgICAgICAgICAgICAxICAgLy8gSW1hZ2UgZG9lc24ndCByZXF1aXJlIGEgc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fV0lORE9XU19HVUkgICAgICAgICAgMiAgIC8vIEltYWdlIHJ1bnMgaW4gdGhlIFdpbmRvd3MgR1VJIHN1YnN5c3RlbS4KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfQ1VJICAgICAgICAgIDMgICAvLyBJbWFnZSBydW5zIGluIHRoZSBXaW5kb3dzIGNoYXJhY3RlciBzdWJzeXN0ZW0uCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9PUzJfQ1VJICAgICAgICAgICAgICA1ICAgLy8gaW1hZ2UgcnVucyBpbiB0aGUgT1MvMiBjaGFyYWN0ZXIgc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fUE9TSVhfQ1VJICAgICAgICAgICAgNyAgIC8vIGltYWdlIHJ1biAgaW4gdGhlIFBvc2l4IGNoYXJhY3RlciBzdWJzeXN0ZW0uCisKKworLy8gRGlyZWN0b3J5IEVudHJpZXMKKworI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfRVhQT1JUICAgICAgICAgMCAgIC8vIEV4cG9ydCBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0lNUE9SVCAgICAgICAgIDEgICAvLyBJbXBvcnQgRGlyZWN0b3J5CisjZGVmaW5lIElNQUdFX0RJUkVDVE9SWV9FTlRSWV9SRVNPVVJDRSAgICAgICAyICAgLy8gUmVzb3VyY2UgRGlyZWN0b3J5CisjZGVmaW5lIElNQUdFX0RJUkVDVE9SWV9FTlRSWV9FWENFUFRJT04gICAgICAzICAgLy8gRXhjZXB0aW9uIERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfU0VDVVJJVFkgICAgICAgNCAgIC8vIFNlY3VyaXR5IERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfQkFTRVJFTE9DICAgICAgNSAgIC8vIEJhc2UgUmVsb2NhdGlvbiBUYWJsZQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfREVCVUcgICAgICAgICAgNiAgIC8vIERlYnVnIERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfQ09QWVJJR0hUICAgICAgNyAgIC8vIERlc2NyaXB0aW9uIFN0cmluZworI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfR0xPQkFMUFRSICAgICAgOCAgIC8vIE1hY2hpbmUgVmFsdWUgKE1JUFMgR1ApCisjZGVmaW5lIElNQUdFX0RJUkVDVE9SWV9FTlRSWV9UTFMgICAgICAgICAgICA5ICAgLy8gVExTIERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfTE9BRF9DT05GSUcgICAxMCAgIC8vIExvYWQgQ29uZmlndXJhdGlvbiBEaXJlY3RvcnkKKworLy8KKy8vIFNlY3Rpb24gaGVhZGVyIGZvcm1hdC4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1NIT1JUX05BTUUgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1NFQ1RJT05fSEVBREVSIHsKKyAgICBVSU5UOCAgIE5hbWVbSU1BR0VfU0laRU9GX1NIT1JUX05BTUVdOworICAgIHVuaW9uIHsKKyAgICAgICAgICAgIFVJTlQzMiAgIFBoeXNpY2FsQWRkcmVzczsKKyAgICAgICAgICAgIFVJTlQzMiAgIFZpcnR1YWxTaXplOworICAgIH0gTWlzYzsKKyAgICBVSU5UMzIgICBWaXJ0dWFsQWRkcmVzczsKKyAgICBVSU5UMzIgICBTaXplT2ZSYXdEYXRhOworICAgIFVJTlQzMiAgIFBvaW50ZXJUb1Jhd0RhdGE7CisgICAgVUlOVDMyICAgUG9pbnRlclRvUmVsb2NhdGlvbnM7CisgICAgVUlOVDMyICAgUG9pbnRlclRvTGluZW51bWJlcnM7CisgICAgVUlOVDE2ICAgTnVtYmVyT2ZSZWxvY2F0aW9uczsKKyAgICBVSU5UMTYgICBOdW1iZXJPZkxpbmVudW1iZXJzOworICAgIFVJTlQzMiAgIENoYXJhY3RlcmlzdGljczsKK30gSU1BR0VfU0VDVElPTl9IRUFERVIsICpQSU1BR0VfU0VDVElPTl9IRUFERVI7CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1NFQ1RJT05fSEVBREVSICAgICAgICAgIDQwCisKKyNkZWZpbmUgSU1BR0VfU0NOX1RZUEVfTk9fUEFEICAgICAgICAgICAgICAgIDB4MDAwMDAwMDggIC8vIFJlc2VydmVkLgorCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvLyBTZWN0aW9uIGNvbnRhaW5zIGNvZGUuCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSAgICAgICAweDAwMDAwMDQwICAvLyBTZWN0aW9uIGNvbnRhaW5zIGluaXRpYWxpemVkIGRhdGEuCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBICAgICAweDAwMDAwMDgwICAvLyBTZWN0aW9uIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgZGF0YS4KKworI2RlZmluZSBJTUFHRV9TQ05fTE5LX09USEVSICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLy8gUmVzZXJ2ZWQuCisjZGVmaW5lIElNQUdFX1NDTl9MTktfSU5GTyAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvLyBTZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIG9yIHNvbWUgb3RoZXIgdHlwZSBvZiBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgSU1BR0VfU0NOX0xOS19SRU1PVkUgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgIC8vIFNlY3Rpb24gY29udGVudHMgd2lsbCBub3QgYmVjb21lIHBhcnQgb2YgaW1hZ2UuCisjZGVmaW5lIElNQUdFX1NDTl9MTktfQ09NREFUICAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAvLyBTZWN0aW9uIGNvbnRlbnRzIGNvbWRhdC4KKworI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMUJZVEVTICAgICAgICAgICAgICAgMHgwMDEwMDAwMCAgLy8KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzJCWVRFUyAgICAgICAgICAgICAgIDB4MDAyMDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl80QllURVMgICAgICAgICAgICAgICAweDAwMzAwMDAwICAvLworI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fOEJZVEVTICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgLy8KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMgICAgICAgICAgICAgIDB4MDA1MDAwMDAgIC8vIERlZmF1bHQgYWxpZ25tZW50IGlmIG5vIG90aGVycyBhcmUgc3BlY2lmaWVkLgorI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUyAgICAgICAgICAgICAgMHgwMDYwMDAwMCAgLy8KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMgICAgICAgICAgICAgIDB4MDA3MDAwMDAgIC8vCisKKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRSAgICAgICAgICAgIDB4MDIwMDAwMDAgIC8vIFNlY3Rpb24gY2FuIGJlIGRpc2NhcmRlZC4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9OT1RfQ0FDSEVEICAgICAgICAgICAgIDB4MDQwMDAwMDAgIC8vIFNlY3Rpb24gaXMgbm90IGNhY2hhYmxlLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9QQUdFRCAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLy8gU2VjdGlvbiBpcyBub3QgcGFnZWFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fU0hBUkVEICAgICAgICAgICAgICAgICAweDEwMDAwMDAwICAvLyBTZWN0aW9uIGlzIHNoYXJlYWJsZS4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9FWEVDVVRFICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAgIC8vIFNlY3Rpb24gaXMgZXhlY3V0YWJsZS4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFEICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAgIC8vIFNlY3Rpb24gaXMgcmVhZGFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fV1JJVEUgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwICAvLyBTZWN0aW9uIGlzIHdyaXRlYWJsZS4KKworLy8KKy8vIFN5bWJvbCBmb3JtYXQuCisvLworCisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1NZTUJPTCAgICAgICAgICAgICAgICAgIDE4CisKKy8vCisvLyBTZWN0aW9uIHZhbHVlcy4KKy8vCisvLyBTeW1ib2xzIGhhdmUgYSBzZWN0aW9uIG51bWJlciBvZiB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGV5IGFyZQorLy8gZGVmaW5lZC4gT3RoZXJ3aXNlLCBzZWN0aW9uIG51bWJlcnMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgorLy8KKworI2RlZmluZSBJTUFHRV9TWU1fVU5ERUZJTkVEICAgICAgICAgICAoVUlOVDE2KTAgICAgICAgICAgIC8vIFN5bWJvbCBpcyB1bmRlZmluZWQgb3IgaXMgY29tbW9uLgorI2RlZmluZSBJTUFHRV9TWU1fQUJTT0xVVEUgICAgICAgICAgICAoVUlOVDE2KS0xICAgICAgICAgIC8vIFN5bWJvbCBpcyBhbiBhYnNvbHV0ZSB2YWx1ZS4KKyNkZWZpbmUgSU1BR0VfU1lNX0RFQlVHICAgICAgICAgICAgICAgKFVJTlQxNiktMiAgICAgICAgICAvLyBTeW1ib2wgaXMgYSBzcGVjaWFsIGRlYnVnIGl0ZW0uCisKKy8vCisvLyBUeXBlIChmdW5kYW1lbnRhbCkgdmFsdWVzLgorLy8KKworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9OVUxMICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgLy8gbm8gdHlwZS4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfVk9JRCAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0NIQVIgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAvLyB0eXBlIGNoYXJhY3Rlci4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfU0hPUlQgICAgICAgICAgICAgICAgIDMgICAgICAgICAgIC8vIHR5cGUgc2hvcnQgaW50ZWdlci4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfSU5UICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0xPTkcgICAgICAgICAgICAgICAgICA1ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9GTE9BVCAgICAgICAgICAgICAgICAgNiAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRE9VQkxFICAgICAgICAgICAgICAgIDcgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1NUUlVDVCAgICAgICAgICAgICAgICA4ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9VTklPTiAgICAgICAgICAgICAgICAgOSAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRU5VTSAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgIC8vIGVudW1lcmF0aW9uLgorI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9NT0UgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgLy8gbWVtYmVyIG9mIGVudW1lcmF0aW9uLgorI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9CWVRFICAgICAgICAgICAgICAgICAgMTIgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfV09SRCAgICAgICAgICAgICAgICAgIDEzICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1VJTlQgICAgICAgICAgICAgICAgICAxNCAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9EV09SRCAgICAgICAgICAgICAgICAgMTUgICAgICAgICAgLy8KKworLy8KKy8vIFR5cGUgKGRlcml2ZWQpIHZhbHVlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX0RUWVBFX05VTEwgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIC8vIG5vIGRlcml2ZWQgdHlwZS4KKyNkZWZpbmUgSU1BR0VfU1lNX0RUWVBFX1BPSU5URVIgICAgICAgICAgICAgIDEgICAgICAgICAgIC8vIHBvaW50ZXIuCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9GVU5DVElPTiAgICAgICAgICAgICAyICAgICAgICAgICAvLyBmdW5jdGlvbi4KKyNkZWZpbmUgSU1BR0VfU1lNX0RUWVBFX0FSUkFZICAgICAgICAgICAgICAgIDMgICAgICAgICAgIC8vIGFycmF5LgorCisvLworLy8gU3RvcmFnZSBjbGFzc2VzLgorLy8KKworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRU5EX09GX0ZVTkNUSU9OICAgICAgKEJZVEUgKS0xCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19OVUxMICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19BVVRPTUFUSUMgICAgICAgICAgICAxCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19FWFRFUk5BTCAgICAgICAgICAgICAyCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19TVEFUSUMgICAgICAgICAgICAgICAzCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19SRUdJU1RFUiAgICAgICAgICAgICA0CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19FWFRFUk5BTF9ERUYgICAgICAgICA1CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19MQUJFTCAgICAgICAgICAgICAgICA2CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19VTkRFRklORURfTEFCRUwgICAgICA3CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19NRU1CRVJfT0ZfU1RSVUNUICAgICA4CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19BUkdVTUVOVCAgICAgICAgICAgICA5CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19TVFJVQ1RfVEFHICAgICAgICAgICAxMAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX1VOSU9OICAgICAgMTEKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1VOSU9OX1RBRyAgICAgICAgICAgIDEyCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19UWVBFX0RFRklOSVRJT04gICAgICAxMworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfVU5ERUZJTkVEX1NUQVRJQyAgICAgMTQKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0VOVU1fVEFHICAgICAgICAgICAgIDE1CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19NRU1CRVJfT0ZfRU5VTSAgICAgICAxNgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfUkVHSVNURVJfUEFSQU0gICAgICAgMTcKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0JJVF9GSUVMRCAgICAgICAgICAgIDE4CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19CTE9DSyAgICAgICAgICAgICAgICAxMDAKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0ZVTkNUSU9OICAgICAgICAgICAgIDEwMQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRU5EX09GX1NUUlVDVCAgICAgICAgMTAyCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19GSUxFICAgICAgICAgICAgICAgICAxMDMKKy8vIG5ldworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfU0VDVElPTiAgICAgICAgICAgICAgMTA0CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19XRUFLX0VYVEVSTkFMICAgICAgICAxMDUKKworLy8gdHlwZSBwYWNraW5nIGNvbnN0YW50cworCisjZGVmaW5lIE5fQlRNQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxNworI2RlZmluZSBOX1RNQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNjAKKyNkZWZpbmUgTl9UTUFTSzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDMwMAorI2RlZmluZSBOX1RNQVNLMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMzYwCisjZGVmaW5lIE5fQlRTSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTl9UU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisvLyBNQUNST1MKKworLy8KKy8vIENvbW11bmFsIHNlbGVjdGlvbiB0eXBlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9OT0RVUExJQ0FURVMgICAxCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZICAgICAgICAgICAgMgorI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRSAgICAgIDMKKyNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSCAgICA0CisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkUgICAgNQorCisjZGVmaW5lIElNQUdFX1dFQUtfRVhURVJOX1NFQVJDSF9OT0xJQlJBUlkgMQorI2RlZmluZSBJTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfTElCUkFSWSAgIDIKKyNkZWZpbmUgSU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX0FMSUFTICAgICAzCisKKworLy8KKy8vIFJlbG9jYXRpb24gZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1JFTE9DQVRJT04geworICAgIFVJTlQzMiAgIFZpcnR1YWxBZGRyZXNzOworICAgIFVJTlQzMiAgIFN5bWJvbFRhYmxlSW5kZXg7CisgICAgVUlOVDE2ICAgIFR5cGU7Cit9IElNQUdFX1JFTE9DQVRJT047CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1JFTE9DQVRJT04gICAgICAgICAgICAgIDEwCisKKy8vCisvLyBJMzg2IHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0FCU09MVVRFICAgICAgICAgICAgICAwICAgICAgICAgICAvLyBSZWZlcmVuY2UgaXMgYWJzb2x1dGUsIG5vIHJlbG9jYXRpb24gaXMgbmVjZXNzYXJ5CisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0RJUjE2ICAgICAgICAgICAgICAgICAwMSAgICAgICAgICAvLyBEaXJlY3QgMTYtYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfUkVMMTYgICAgICAgICAgICAgICAgIDAyICAgICAgICAgIC8vIFBDLXJlbGF0aXZlIDE2LWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0RJUjMyICAgICAgICAgICAgICAgICAwNiAgICAgICAgICAvLyBEaXJlY3QgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfRElSMzJOQiAgICAgICAgICAgICAgIDA3ICAgICAgICAgIC8vIERpcmVjdCAzMi1iaXQgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2xzIHZpcnR1YWwgYWRkcmVzcywgYmFzZSBub3QgaW5jbHVkZWQKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfU0VHMTIgICAgICAgICAgICAgICAgIDAxMSAgICAgICAgIC8vIERpcmVjdCAxNi1iaXQgcmVmZXJlbmNlIHRvIHRoZSBzZWdtZW50LXNlbGVjdG9yIGJpdHMgb2YgYSAzMi1iaXQgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X1NFQ1RJT04gICAgICAgICAgICAgICAwMTIKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfU0VDUkVMICAgICAgICAgICAgICAgIDAxMworI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9SRUwzMiAgICAgICAgICAgICAgICAgMDI0ICAgICAgICAgLy8gUEMtcmVsYXRpdmUgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKworLy8KKy8vIE1JUFMgcmVsb2NhdGlvbiB0eXBlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfQUJTT0xVVEUgICAgICAgICAgICAgIDAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBpcyBhYnNvbHV0ZSwgbm8gcmVsb2NhdGlvbiBpcyBuZWNlc3NhcnkKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfUkVGSEFMRiAgICAgICAgICAgICAgIDAxCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRldPUkQgICAgICAgICAgICAgICAwMgorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19KTVBBRERSICAgICAgICAgICAgICAgMDMKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfUkVGSEkgICAgICAgICAgICAgICAgIDA0CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRkxPICAgICAgICAgICAgICAgICAwNQorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19HUFJFTCAgICAgICAgICAgICAgICAgMDYKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfTElURVJBTCAgICAgICAgICAgICAgIDA3CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1NFQ1RJT04gICAgICAgICAgICAgICAwMTIKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfU0VDUkVMICAgICAgICAgICAgICAgIDAxMworI2RlZmluZSBJTUFHRV9SRUxfTUlQU19SRUZXT1JETkIgICAgICAgICAgICAgMDQyCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1BBSVIgICAgICAgICAgICAgICAgICAwNDUKKworLy8KKy8vIEFscGhhIFJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9BQlNPTFVURSAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkxPTkcgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfUkVGUVVBRCAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9HUFJFTDMyICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0xJVEVSQUwgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfTElUVVNFICAgICAgICAgICAgICAgMHg1CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9HUERJU1AgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0JSQUREUiAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfSElOVCAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9JTkxJTkVfUkVGTE9ORyAgICAgICAweDkKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkhJICAgICAgICAgICAgICAgIDB4QQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfUkVGTE8gICAgICAgICAgICAgICAgMHhCCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9QQUlSICAgICAgICAgICAgICAgICAweEMKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX01BVENIICAgICAgICAgICAgICAgIDB4RAorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfU0VDVElPTiAgICAgICAgICAgICAgMHhFCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9TRUNSRUwgICAgICAgICAgICAgICAweEYKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkxPTkdOQiAgICAgICAgICAgIDB4MTAKKworLy8KKy8vIElCTSBQb3dlclBDIHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgMHgwMDAwICAvLyBOT1AKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSNjQgICAweDAwMDEgIC8vIDY0LWJpdCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyICAgMHgwMDAyICAvLyAzMi1iaXQgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIyNCAgIDB4MDAwMyAgLy8gMjYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggYWJzb2x1dGUpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjE2ICAgMHgwMDA0ICAvLyAxNi1iaXQgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNCAgIDB4MDAwNSAgLy8gMTYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMjQgICAgMHgwMDA2ICAvLyAyNi1iaXQgUEMtcmVsYXRpdmUgb2Zmc2V0LCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIHJlbGF0aXZlKQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFTDE0ICAgIDB4MDAwNyAgLy8gMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTYgMHgwMDA4ICAvLyAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNCAweDAwMDkgIC8vIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSwgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkKKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5CIDB4MDAwQSAgLy8gMzItYml0IGFkZHIgdy9vIGltYWdlIGJhc2UKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNSRUwgICAweDAwMEIgIC8vIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNUSU9OICAweDAwMEMgIC8vIHNlY3Rpb25oZWFkZXIgbnVtYmVyCisjZGVmaW5lIElNQUdFX1JFTF9QUENfSUZHTFVFICAgMHgwMDBEICAvLyBzdWJzdGl0dXRlIFRPQyByZXN0b3JlIGluc3RydWN0aW9uIGlmZiBzeW1ib2wgaXMgZ2x1ZSBjb2RlCisjZGVmaW5lIElNQUdFX1JFTF9QUENfSU1HTFVFICAgMHgwMDBFICAvLyBzeW1ib2wgaXMgZ2x1ZSBjb2RlOyB2aXJ0dWFsIGFkZHJlc3MgaXMgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24KKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RZUEVNQVNLIDB4MDBGRiAgLy8gbWFzayB0byBpc29sYXRlIGFib3ZlIHZhbHVlcyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlR5cGUKKworLy8gRmxhZyBiaXRzIGluIElNQUdFX1JFTE9DQVRJT04uVFlQRQorCisjZGVmaW5lIElNQUdFX1JFTF9QUENfTkVHICAgICAgMHgwMTAwICAvLyBzdWJ0cmFjdCByZWxvYyB2YWx1ZSByYXRoZXIgdGhhbiBhZGRpbmcgaXQKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19CUlRBS0VOICAweDAyMDAgIC8vIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggdGFrZW4KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19CUk5UQUtFTiAweDA0MDAgIC8vIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggbm90IHRha2VuCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DREVGTiAgMHgwODAwICAvLyB0b2Mgc2xvdCBkZWZpbmVkIGluIGZpbGUgKG9yLCBkYXRhIGluIHRvYykKKworLy8KKy8vIEJhc2VkIHJlbG9jYXRpb24gZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0JBU0VfUkVMT0NBVElPTiB7CisgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7CisgICAgVUlOVDMyICAgU2l6ZU9mQmxvY2s7CisvLyAgVUlOVDE2ICAgIFR5cGVPZmZzZXRbMV07Cit9IElNQUdFX0JBU0VfUkVMT0NBVElPTiwgKlBJTUFHRV9CQVNFX1JFTE9DQVRJT047CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX0JBU0VfUkVMT0NBVElPTiAgICAgICAgIDgKKworLy8KKy8vIEJhc2VkIHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9BQlNPTFVURSAgICAgICAgICAgICAgMAorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0xPVyAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9ISUdITE9XICAgICAgICAgICAgICAgMworI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSEFESiAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX01JUFNfSk1QQUREUiAgICAgICAgICA1CisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9JQTY0X0lNTTY0ICAgICAgICAgICAgOQorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfRElSNjQgICAgICAgICAgICAgICAgIDEwCisKKy8vCisvLyBMaW5lIG51bWJlciBmb3JtYXQuCisvLworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfTElORU5VTUJFUiB7CisgICAgdW5pb24geworICAgICAgICBVSU5UMzIgICBTeW1ib2xUYWJsZUluZGV4OyAgICAgICAgICAgICAgIC8vIFN5bWJvbCB0YWJsZSBpbmRleCBvZiBmdW5jdGlvbiBuYW1lIGlmIExpbmVudW1iZXIgaXMgMC4KKyAgICAgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7ICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIuCisgICAgfSBUeXBlOworICAgIFVJTlQxNiAgICBMaW5lbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW5lIG51bWJlci4KK30gSU1BR0VfTElORU5VTUJFUjsKKworI2RlZmluZSBJTUFHRV9TSVpFT0ZfTElORU5VTUJFUiAgICAgICAgICAgICAgNgorCisvLworLy8gQXJjaGl2ZSBmb3JtYXQuCisvLworCisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfU1RBUlRfU0laRSAgICAgICAgICAgICA4CisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfU1RBUlQgICAgICAgICAgICAgICAgICAiITxhcmNoPlxuIgorI2RlZmluZSBJTUFHRV9BUkNISVZFX0VORCAgICAgICAgICAgICAgICAgICAgImBcbiIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9QQUQgICAgICAgICAgICAgICAgICAgICJcbiIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9MSU5LRVJfTUVNQkVSICAgICAgICAgICIvICAgICAgICAgICAgICAgIgorI2RlZmluZSBJTUFHRV9BUkNISVZFX0xPTkdOQU1FU19NRU1CRVIgICAgICAgIi8vICAgICAgICAgICAgICAiCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9BUkNISVZFX01FTUJFUl9IRUFERVIgeworICAgIFVJTlQ4ICAgICBOYW1lWzE2XTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbWVtYmVyIG5hbWUgLSBgLycgdGVybWluYXRlZC4KKyAgICBVSU5UOCAgICAgRGF0ZVsxMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBkYXRlIC0gZGVjaW1hbC4KKyAgICBVSU5UOCAgICAgVXNlcklEWzZdOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciB1c2VyIGlkIC0gZGVjaW1hbC4KKyAgICBVSU5UOCAgICAgR3JvdXBJRFs2XTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBncm91cCBpZCAtIGRlY2ltYWwuCisgICAgVUlOVDggICAgIE1vZGVbOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBtZW1iZXIgbW9kZSAtIG9jdGFsLgorICAgIFVJTlQ4ICAgICBTaXplWzEwXTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbWVtYmVyIHNpemUgLSBkZWNpbWFsLgorICAgIFVJTlQ4ICAgICBFbmRIZWFkZXJbMl07ICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmluZyB0byBlbmQgaGVhZGVyLgorfSBJTUFHRV9BUkNISVZFX01FTUJFUl9IRUFERVIsICpQSU1BR0VfQVJDSElWRV9NRU1CRVJfSEVBREVSOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9BUkNISVZFX01FTUJFUl9IRFIgICAgICA2MAorCisvLworLy8gRExMIHN1cHBvcnQuCisvLworCisvLworLy8gRXhwb3J0IEZvcm1hdAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgeworICAgIFVJTlQzMiAgIENoYXJhY3RlcmlzdGljczsKKyAgICBVSU5UMzIgICBUaW1lRGF0ZVN0YW1wOworICAgIFVJTlQxNiAgIE1ham9yVmVyc2lvbjsKKyAgICBVSU5UMTYgICBNaW5vclZlcnNpb247CisgICAgVUlOVDMyICAgTmFtZTsKKyAgICBVSU5UMzIgICBCYXNlOworICAgIFVJTlQzMiAgIE51bWJlck9mRnVuY3Rpb25zOworICAgIFVJTlQzMiAgIE51bWJlck9mTmFtZXM7CisgICAgVUlOVDMyICAgKkFkZHJlc3NPZkZ1bmN0aW9uczsKKyAgICBVSU5UMzIgICAqQWRkcmVzc09mTmFtZXM7CisgICAgVUlOVDMyICAgKkFkZHJlc3NPZk5hbWVPcmRpbmFsczsKK30gSU1BR0VfRVhQT1JUX0RJUkVDVE9SWSwgKlBJTUFHRV9FWFBPUlRfRElSRUNUT1JZOworCisvLworLy8gSW1wb3J0IEZvcm1hdAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0lNUE9SVF9CWV9OQU1FIHsKKyAgICBVSU5UMTYgICAgSGludDsKKyAgICBVSU5UOCAgICAgTmFtZVsxXTsKK30gSU1BR0VfSU1QT1JUX0JZX05BTUUsICpQSU1BR0VfSU1QT1JUX0JZX05BTUU7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9USFVOS19EQVRBIHsKKyAgICB1bmlvbiB7CisgICAgICAgIFVJTlQzMiBGdW5jdGlvbjsKKyAgICAgICAgVUlOVDMyIE9yZGluYWw7CisgICAgICAgIFBJTUFHRV9JTVBPUlRfQllfTkFNRSBBZGRyZXNzT2ZEYXRhOworICAgIH0gdTE7Cit9IElNQUdFX1RIVU5LX0RBVEEsICpQSU1BR0VfVEhVTktfREFUQTsKKworI2RlZmluZSBJTUFHRV9PUkRJTkFMX0ZMQUcgMHg4MDAwMDAwMAorI2RlZmluZSBJTUFHRV9TTkFQX0JZX09SRElOQUwoT3JkaW5hbCkgKChPcmRpbmFsICYgSU1BR0VfT1JESU5BTF9GTEFHKSAhPSAwKQorI2RlZmluZSBJTUFHRV9PUkRJTkFMKE9yZGluYWwpIChPcmRpbmFsICYgMHhmZmZmKQorCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1IgeworICAgIFVJTlQzMiAgIENoYXJhY3RlcmlzdGljczsKKyAgICBVSU5UMzIgICBUaW1lRGF0ZVN0YW1wOworICAgIFVJTlQzMiAgIEZvcndhcmRlckNoYWluOworICAgIFVJTlQzMiAgIE5hbWU7CisgICAgUElNQUdFX1RIVU5LX0RBVEEgRmlyc3RUaHVuazsKK30gSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1IsICpQSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1I7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvbGlic21iaW9zLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9saWJzbWJpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjFhMjhlCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvbGlic21iaW9zLmgKQEAgLTAsMCArMSwxMzIgQEAKKyNpZm5kZWYgX0xJQl9TTUJJT1NfSAorI2RlZmluZSBfTElCX1NNQklPU19ICisvKisrCisKK0NvcHlyaWdodCAoYykgMjAwMCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBMaWJTbWJpb3MuaAorICAgIAorQWJzdHJhY3Q6CisKKyAgICBMaWIgaW5jbHVkZSAgZm9yIFNNQklPUyBzZXJ2aWNlcy4gVXNlZCB0byBnZXQgc3lzdGVtIHNlcmlhbCBudW1iZXIgYW5kIEdVSUQKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBEZWZpbmUgU01CSU9TIHRhYmxlcy4KKy8vCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgIEFuY2hvclN0cmluZ1s0XTsKKyAgICBVSU5UOCAgIEVudHJ5UG9pbnRTdHJ1Y3R1cmVDaGVja3N1bTsKKyAgICBVSU5UOCAgIEVudHJ5UG9pbnRMZW5ndGg7CisgICAgVUlOVDggICBNYWpvclZlcnNpb247CisgICAgVUlOVDggICBNaW5vclZlcnNpb247CisgICAgVUlOVDE2ICBNYXhTdHJ1Y3R1cmVTaXplOworICAgIFVJTlQ4ICAgRW50cnlQb2ludFJldmlzaW9uOworICAgIFVJTlQ4ICAgRm9ybWF0dGVkQXJlYVs1XTsKKyAgICBVSU5UOCAgIEludGVybWVkaWF0ZUFuY2hvclN0cmluZ1s1XTsKKyAgICBVSU5UOCAgIEludGVybWVkaWF0ZUNoZWNrc3VtOworICAgIFVJTlQxNiAgVGFibGVMZW5ndGg7CisgICAgVUlOVDMyICBUYWJsZUFkZHJlc3M7CisgICAgVUlOVDE2ICBOdW1iZXJPZlNtYmlvc1N0cnVjdHVyZXM7CisgICAgVUlOVDggICBTbWJpb3NCY2RSZXZpc2lvbjsKK30gU01CSU9TX1NUUlVDVFVSRV9UQUJMRTsKKworLy8KKy8vIFBsZWFzZSBub3RlIHRoYXQgU01CSU9TIHN0cnVjdHVyZXMgY2FuIGJlIG9kZCBieXRlIGFsaWduZWQgc2luY2UgdGhlCisvLyAgdW5mb3JtYXRlZCBzZWN0aW9uIG9mIGVhY2ggcmVjb3JkIGlzIGEgc2V0IG9mIGFyYml0cmFyeSBzaXplIHN0cmluZ3MuCisvLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICBUeXBlOworICAgIFVJTlQ4ICAgTGVuZ3RoOworICAgIFVJTlQ4ICAgSGFuZGxlWzJdOworfSBTTUJJT1NfSEVBREVSOworCit0eXBlZGVmIFVJTlQ4ICAgU01CSU9TX1NUUklORzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNNQklPU19IRUFERVIgICBIZHI7CisgICAgU01CSU9TX1NUUklORyAgIFZlbmRvcjsKKyAgICBTTUJJT1NfU1RSSU5HICAgQmlvc1ZlcnNpb247CisgICAgVUlOVDggICAgICAgICAgIEJpb3NTZWdtZW50WzJdOworICAgIFNNQklPU19TVFJJTkcgICBCaW9zUmVsZWFzZURhdGU7CisgICAgVUlOVDggICAgICAgICAgIEJpb3NTaXplOworICAgIFVJTlQ4ICAgICAgICAgICBCaW9zQ2hhcmFjdGVyaXN0aWNzWzhdOworfSBTTUJJT1NfVFlQRTA7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTTUJJT1NfSEVBREVSICAgSGRyOworICAgIFNNQklPU19TVFJJTkcgICBNYW51ZmFjdHVyZXI7CisgICAgU01CSU9TX1NUUklORyAgIFByb2R1Y3ROYW1lOworICAgIFNNQklPU19TVFJJTkcgICBWZXJzaW9uOworICAgIFNNQklPU19TVFJJTkcgICBTZXJpYWxOdW1iZXI7CisKKyAgICAvLworICAgIC8vIGFsd2F5cyBieXRlIGNvcHkgdGhpcyBkYXRhIHRvIHByZXZlbnQgYWxpZ25tZW50IGZhdWx0cyEKKyAgICAvLworICAgIEVGSV9HVUlEICAgICAgICBVdWlkOworICAgIAorICAgIFVJTlQ4ICAgICAgICAgICBXYWtlVXBUeXBlOworfSBTTUJJT1NfVFlQRTE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTTUJJT1NfSEVBREVSICAgSGRyOworICAgIFNNQklPU19TVFJJTkcgICBNYW51ZmFjdHVyZXI7CisgICAgU01CSU9TX1NUUklORyAgIFByb2R1Y3ROYW1lOworICAgIFNNQklPU19TVFJJTkcgICBWZXJzaW9uOworICAgIFNNQklPU19TVFJJTkcgICBTZXJpYWxOdW1iZXI7Cit9IFNNQklPU19UWVBFMjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNNQklPU19IRUFERVIgICBIZHI7CisgICAgU01CSU9TX1NUUklORyAgIE1hbnVmYWN0dXJlcjsKKyAgICBVSU5UOCAgICAgICAgICAgVHlwZTsKKyAgICBTTUJJT1NfU1RSSU5HICAgVmVyc2lvbjsKKyAgICBTTUJJT1NfU1RSSU5HICAgU2VyaWFsTnVtYmVyOworICAgIFNNQklPU19TVFJJTkcgICBBc3NldFRhZzsKKyAgICBVSU5UOCAgICAgICAgICAgQm9vdHVwU3RhdGU7CisgICAgVUlOVDggICAgICAgICAgIFBvd2VyU3VwcGx5U3RhdGU7CisgICAgVUlOVDggICAgICAgICAgIFRoZXJtYWxTdGF0ZTsKKyAgICBVSU5UOCAgICAgICAgICAgU2VjdXJpdHlTdGF0dXM7CisgICAgVUlOVDggICAgICAgICAgIE9lbURlZmluZWRbNF07Cit9IFNNQklPU19UWVBFMzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNNQklPU19IRUFERVIgICBIZHI7CisgICAgVUlOVDggICAgICAgICAgIFNvY2tldDsKKyAgICBVSU5UOCAgICAgICAgICAgUHJvY2Vzc29yVHlwZTsKKyAgICBVSU5UOCAgICAgICAgICAgUHJvY2Vzc29yRmFtaWx5OworICAgIFNNQklPU19TVFJJTkcgICBQcm9jZXNzb3JNYW51ZmFjdHVyZTsKKyAgICBVSU5UOCAgICAgICAgICAgUHJvY2Vzc29ySWRbOF07CisgICAgU01CSU9TX1NUUklORyAgIFByb2Nlc3NvclZlcnNpb247CisgICAgVUlOVDggICAgICAgICAgIFZvbHRhZ2U7CisgICAgVUlOVDggICAgICAgICAgIEV4dGVybmFsQ2xvY2tbMl07CisgICAgVUlOVDggICAgICAgICAgIE1heFNwZWVkWzJdOworICAgIFVJTlQ4ICAgICAgICAgICBDdXJyZW50U3BlZWRbMl07CisgICAgVUlOVDggICAgICAgICAgIFN0YXR1czsKKyAgICBVSU5UOCAgICAgICAgICAgUHJvY2Vzc29yVXBncmFkZTsKKyAgICBVSU5UOCAgICAgICAgICAgTDFDYWNoZUhhbmRsZVsyXTsKKyAgICBVSU5UOCAgICAgICAgICAgTDJDYWNoZUhhbmRsZVsyXTsKKyAgICBVSU5UOCAgICAgICAgICAgTDNDYWNoZUhhbmRsZVsyXTsKK30gU01CSU9TX1RZUEU0OworCit0eXBlZGVmIHVuaW9uIHsKKyAgICBTTUJJT1NfSEVBREVSICAgKkhkcjsKKyAgICBTTUJJT1NfVFlQRTAgICAgKlR5cGUwOworICAgIFNNQklPU19UWVBFMSAgICAqVHlwZTE7CisgICAgU01CSU9TX1RZUEUyICAgICpUeXBlMjsKKyAgICBTTUJJT1NfVFlQRTMgICAgKlR5cGUzOworICAgIFNNQklPU19UWVBFNCAgICAqVHlwZTQ7CisgICAgVUlOVDggICAgICAgICAgICpSYXc7Cit9IFNNQklPU19TVFJVQ1RVUkVfUE9JTlRFUjsKKyNwcmFnbWEgcGFjaygpCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL3BjaTIyLmggYi9lZmkzMi9pbmNsdWRlL2VmaS9wY2kyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGY1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9wY2kyMi5oCkBAIC0wLDAgKzEsMTkzIEBACisjaWZuZGVmIF9QQ0kyMl9ICisjZGVmaW5lIF9QQ0kyMl9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk5ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIHBjaTIyLmgKKyAgICAKK0Fic3RyYWN0OiAgICAgIAorICAgIFN1cHBvcnQgZm9yIFBDSSAyLjIgc3RhbmRhcmQuCisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaWZkZWYgU09GVF9TRFYKKyNkZWZpbmUgUENJX01BWF9CVVMgICAgIDEKKyNlbHNlCisjZGVmaW5lIFBDSV9NQVhfQlVTICAgICAyNTUKKyNlbmRpZgorCisjZGVmaW5lIFBDSV9NQVhfREVWSUNFICAzMQorI2RlZmluZSBQQ0lfTUFYX0ZVTkMgICAgNworCisvLworLy8gQ29tbWFuZAorLy8KKyNkZWZpbmUgUENJX1ZHQV9QQUxFVFRFX1NOT09QX0RJU0FCTEVEICAgMHgyMAorCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgICAgICBWZW5kb3JJZDsKKyAgICBVSU5UMTYgICAgICBEZXZpY2VJZDsKKyAgICBVSU5UMTYgICAgICBDb21tYW5kOworICAgIFVJTlQxNiAgICAgIFN0YXR1czsKKyAgICBVSU5UOCAgICAgICBSZXZpc2lvbklEOworICAgIFVJTlQ4ICAgICAgIENsYXNzQ29kZVszXTsKKyAgICBVSU5UOCAgICAgICBDYWNoZUxpbmVTaXplOworICAgIFVJTlQ4ICAgICAgIExheXRlbmN5VGltZXI7CisgICAgVUlOVDggICAgICAgSGVhZGVyVHlwZTsKKyAgICBVSU5UOCAgICAgICBCSVNUOworfSBQQ0lfREVWSUNFX0lOREVQRU5ERU5UX1JFR0lPTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgIEJhcls2XTsKKyAgICBVSU5UMzIgICAgICBDSVNQdHI7CisgICAgVUlOVDE2ICAgICAgU3Vic3lzdGVtVmVuZG9ySUQ7CisgICAgVUlOVDE2ICAgICAgU3Vic3lzdGVtSUQ7CisgICAgVUlOVDMyICAgICAgRXhwYW5zaW9uUm9tQmFyOworICAgIFVJTlQzMiAgICAgIFJlc2VydmVkWzJdOworICAgIFVJTlQ4ICAgICAgIEludGVycnVwdExpbmU7CisgICAgVUlOVDggICAgICAgSW50ZXJydXB0UGluOworICAgIFVJTlQ4ICAgICAgIE1pbkdudDsKKyAgICBVSU5UOCAgICAgICBNYXhMYXQ7ICAgICAKK30gUENJX0RFVklDRV9IRUFERVJfVFlQRV9SRUdJT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQQ0lfREVWSUNFX0lOREVQRU5ERU5UX1JFR0lPTiAgIEhkcjsKKyAgICBQQ0lfREVWSUNFX0hFQURFUl9UWVBFX1JFR0lPTiAgIERldmljZTsKK30gUENJX1RZUEUwMDsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgCisgICAgVUlOVDMyICAgICAgQmFyWzJdOworICAgIFVJTlQ4ICAgICAgIFByaW1hcnlCdXM7CisgICAgVUlOVDggICAgICAgU2Vjb25kYXJ5QnVzOworICAgIFVJTlQ4ICAgICAgIFN1Ym9yZGluYXRlQnVzOworICAgIFVJTlQ4ICAgICAgIFNlY29uZGFyeUxhdGVuY3lUaW1lcjsKKyAgICBVSU5UOCAgICAgICBJb0Jhc2U7CisgICAgVUlOVDggICAgICAgSW9MaW1pdDsKKyAgICBVSU5UMTYgICAgICBTZWNvbmRhcnlTdGF0dXM7CisgICAgVUlOVDE2ICAgICAgTWVtb3J5QmFzZTsKKyAgICBVSU5UMTYgICAgICBNZW1vcnlMaW1pdDsKKyAgICBVSU5UMTYgICAgICBQcmVmZXRjaGFibGVNZW1vcnlCYXNlOworICAgIFVJTlQxNiAgICAgIFByZWZldGNoYWJsZU1lbW9yeUxpbWl0OworICAgIFVJTlQzMiAgICAgIFByZWZldGNoYWJsZUJhc2VVcHBlcjMyOworICAgIFVJTlQzMiAgICAgIFByZWZldGNoYWJsZUxpbWl0VXBwZXIzMjsKKyAgICBVSU5UMTYgICAgICBJb0Jhc2VVcHBlcjE2OworICAgIFVJTlQxNiAgICAgIElvTGltaXRVcHBlcjE2OworICAgIFVJTlQzMiAgICAgIFJlc2VydmVkOworICAgIFVJTlQzMiAgICAgIEV4cGFuc2lvblJvbUJBUjsKKyAgICBVSU5UOCAgICAgICBJbnRlcnJ1cHRMaW5lOworICAgIFVJTlQ4ICAgICAgIEludGVycnVwdFBpbjsKKyAgICBVSU5UMTYgICAgICBCcmlkZ2VDb250cm9sOworfSBQQ0lfQlJJREdFX0NPTlRST0xfUkVHSVNURVI7CisKKyNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVlfQ1RSTCAgICAgICAgICAweDAzCisjZGVmaW5lIFBDSV9DTEFTU19WR0EgICAgICAgICAgICAgICAgICAgMHgwMAorCisjZGVmaW5lIFBDSV9DTEFTU19CUklER0UgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBQQ0lfQ0xBU1NfSVNBICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUENJX0NMQVNTX0lTQV9QT1NJVElWRV9ERUNPREUgICAweDgwCisKKyNkZWZpbmUgUENJX0NMQVNTX05FVFdPUksgICAgICAgICAgICAgICAweDAyIAorI2RlZmluZSBQQ0lfQ0xBU1NfRVRIRVJORVQgICAgICAgICAgICAgIDB4MDAKKyAgICAgICAgCisjZGVmaW5lIEhFQURFUl9UWVBFX0RFVklDRSAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBIRUFERVJfVFlQRV9QQ0lfVE9fUENJX0JSSURHRSAgIDB4MDEKKyNkZWZpbmUgSEVBREVSX1RZUEVfTVVMVElfRlVOQ1RJT04gICAgICAweDgwCisjZGVmaW5lIEhFQURFUl9MQVlPVVRfQ09ERSAgICAgICAgICAgICAgMHg3ZgorCisjZGVmaW5lIElTX1BDSV9CUklER0UoX3ApICgoKChfcCktPkhkci5IZWFkZXJUeXBlKSAmIEhFQURFUl9MQVlPVVRfQ09ERSkgPT0gSEVBREVSX1RZUEVfUENJX1RPX1BDSV9CUklER0UpICAgICAgICAKKyNkZWZpbmUgSVNfUENJX01VTFRJX0ZVTkMoX3ApICAgKCgoX3ApLT5IZHIuSGVhZGVyVHlwZSkgJiBIRUFERVJfVFlQRV9NVUxUSV9GVU5DVElPTikgICAgICAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFBDSV9ERVZJQ0VfSU5ERVBFTkRFTlRfUkVHSU9OICAgSGRyOworICAgIFBDSV9CUklER0VfQ09OVFJPTF9SRUdJU1RFUiAgICAgQnJpZGdlOworfSBQQ0lfVFlQRTAxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICBSZWdpc3RlcjsKKyAgICBVSU5UOCAgIEZ1bmN0aW9uOworICAgIFVJTlQ4ICAgRGV2aWNlOworICAgIFVJTlQ4ICAgQnVzOworICAgIFVJTlQ4ICAgUmVzZXJ2ZWRbNF07Cit9IERFRklPX1BDSV9BRERSOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICBSZWcgICAgIDogODsKKyAgICBVSU5UMzIgIEZ1bmMgICAgOiAzOworICAgIFVJTlQzMiAgRGV2ICAgICA6IDU7CisgICAgVUlOVDMyICBCdXMgICAgIDogODsKKyAgICBVSU5UMzIgIFJlc2VydmVkOiA3OworICAgIFVJTlQzMiAgRW5hYmxlICA6IDE7Cit9IFBDSV9DT05GSUdfQUNDRVNTX0NGODsKKworI3ByYWdtYSBwYWNrKCkKKworI2RlZmluZSBFRklfUk9PVF9CUklER0VfTElTVCAgICAnZXByYicKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UTiAgICAgICAgICAgU2lnbmF0dXJlOworCisgICAgVUlOVDE2ICAgICAgICAgIEJyaWRnZU51bWJlcjsKKyAgICBVSU5UMTYgICAgICAgICAgUHJpbWFyeUJ1czsKKyAgICBVSU5UMTYgICAgICAgICAgU3Vib3JkaW5hdGVCdXM7CisKKyAgICBFRklfREVWSUNFX1BBVEggKkRldmljZVBhdGg7CisKKyAgICBMSVNUX0VOVFJZICAgICAgTGluazsKK30gUENJX1JPT1RfQlJJREdFX0VOVFJZOworCisKKyNkZWZpbmUgUENJX0VYUEFOU0lPTl9ST01fSEVBREVSX1NJR05BVFVSRSAgICAgICAgMHhhYTU1CisjZGVmaW5lIEVGSV9QQ0lfRVhQQU5TSU9OX1JPTV9IRUFERVJfRUZJU0lHTkFUVVJFIDB4MEVGMQorI2RlZmluZSBQQ0lfREFUQV9TVFJVQ1RVUkVfU0lHTkFUVVJFICAgICAgICAgICAgICBFRklfU0lHTkFUVVJFXzMyKCdQJywnQycsJ0knLCdSJykKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDE2ICAgICAgICAgIFNpZ25hdHVyZTsgICAgICAgICAgICAgIC8vIDB4YWE1NQorICAgIFVJTlQ4ICAgICAgICAgICBSZXNlcnZlZFsweDE2XTsKKyAgICBVSU5UMTYgICAgICAgICAgUGNpck9mZnNldDsKK30gUENJX0VYUEFOU0lPTl9ST01fSEVBREVSOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgICAgICAgICAgU2lnbmF0dXJlOyAgICAgICAgICAgICAgLy8gMHhhYTU1CisgICAgVUlOVDE2ICAgICAgICAgIEluaXRpYWxpemF0aW9uU2l6ZTsKKyAgICBVSU5UMTYgICAgICAgICAgRWZpU2lnbmF0dXJlOyAgICAgICAgICAgLy8gMHgwRUYxCisgICAgVUlOVDE2ICAgICAgICAgIEVmaVN1YnN5c3RlbTsKKyAgICBVSU5UMTYgICAgICAgICAgRWZpTWFjaGluZVR5cGU7CisgICAgVUlOVDggICAgICAgICAgIFJlc2VydmVkWzB4MEFdOworICAgIFVJTlQxNiAgICAgICAgICBFZmlJbWFnZUhlYWRlck9mZnNldDsKKyAgICBVSU5UMTYgICAgICAgICAgUGNpck9mZnNldDsKK30gRUZJX1BDSV9FWFBBTlNJT05fUk9NX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICBTaWduYXR1cmU7ICAgICAgICAgICAgICAvLyAiUENJUiIgCisgICAgVUlOVDE2ICAgICAgICAgIFZlbmRvcklkOworICAgIFVJTlQxNiAgICAgICAgICBEZXZpY2VJZDsKKyAgICBVSU5UMTYgICAgICAgICAgUmVzZXJ2ZWQwOworICAgIFVJTlQxNiAgICAgICAgICBMZW5ndGg7CisgICAgVUlOVDggICAgICAgICAgIFJldmlzaW9uOworICAgIFVJTlQ4ICAgICAgICAgICBDbGFzc0NvZGVbM107CisgICAgVUlOVDE2ICAgICAgICAgIEltYWdlTGVuZ3RoOworICAgIFVJTlQxNiAgICAgICAgICBDb2RlUmV2aXNpb247CisgICAgVUlOVDggICAgICAgICAgIENvZGVUeXBlOworICAgIFVJTlQ4ICAgICAgICAgICBJbmRpY2F0b3I7CisgICAgVUlOVDE2ICAgICAgICAgIFJlc2VydmVkMTsKK30gUENJX0RBVEFfU1RSVUNUVVJFOworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmCisgICAgCisKKworCisKKyAgICAKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL3Byb3RvY29sL2FkYXB0ZXJkZWJ1Zy5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvcHJvdG9jb2wvYWRhcHRlcmRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwYWY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL3Byb3RvY29sL2FkYXB0ZXJkZWJ1Zy5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX0FEQVBURVJfREVCVUdfSAorI2RlZmluZSBfQURBUFRFUl9ERUJVR19ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk5ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIEFkYXB0ZXJEZWJ1Zy5oCisgICAgCitBYnN0cmFjdDoKKworICAgIFByb3RvY29sIHRvIGRlYnVnIHRoZSBFREQgMy4wIGVuYWJsZW1lbnQgb2YgQklPUyBvcHRpb24gUk9NcworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vIHs4MkY4Njg4MS0yODJCLTExZDQtQkM3RC0wMDgwQzczQzg4ODF9CisjZGVmaW5lIEFEQVBURVJfREVCVUdfUFJPVE9DT0wgXAoreyAweDgyZjg2ODgxLCAweDI4MmIsIDB4MTFkNCwgezB4YmMsIDB4N2QsIDB4MCwgMHg4MCwgMHhjNywgMHgzYywgMHg4OCwgMHg4MX0gfQorCisvLworLy8gVGhpcyBwcm90b2NvbCBwb2ludHMgdG8gdGhlIEJJT1NfTEVHQUNZX0RSSVZFIGRhdGEgc3RydWN0dXJlCisvLyAgc2VlIGVkZC5oIGZvciBtb3JlIGRldGFpbHMKKy8vCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9wcm90b2NvbC9lZmljb25zcGxpdC5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvcHJvdG9jb2wvZWZpY29uc3BsaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWFkYjkyCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvcHJvdG9jb2wvZWZpY29uc3BsaXQuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9FRklfQ09ORk9SS19ICisjZGVmaW5lIF9FRklfQ09ORk9SS19ICisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OSAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKK0Fic3RyYWN0OgorCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKworCisvLworLy8gQ29uT3V0IEZvcmtlciBQcm90b2NvbAorLy8KKworI2RlZmluZSBURVhUX09VVF9TUExJVEVSX1BST1RPQ09MICAgIFwKKyAgICB7IDB4NTZkODMwYTAsIDB4N2U3YSwgMHgxMWQzLCB7MHhiYiwgMHhhMCwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKKyNkZWZpbmUgRVJST1JfT1VUX1NQTElURVJfUFJPVE9DT0wgICAgXAorICAgIHsgMHhmMGJhOTAzOSwgMHg2OGYxLCAweDQyNWUsIHsweGFhLCAweDdmLCAweGQ5LCAweGFhLCAweGY5LCAweDFiLCAweDgyLCAweGExfX0KKworI2RlZmluZSBURVhUX0lOX1NQTElURVJfUFJPVE9DT0wgICAgXAorICAgIHsgMHhmOWEzYzU1MCwgMHg3ZmI1LCAweDExZDMsIHsweGJiLCAweGEwLCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9wcm90b2NvbC9lZmlkYmcuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL3Byb3RvY29sL2VmaWRiZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTVhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9pbmNsdWRlL2VmaS9wcm90b2NvbC9lZmlkYmcuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMAorICogSW50ZWwgQ29ycG9yYXRpb24uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIAorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIAorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogCisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEludGVsIENvcnBvcmF0aW9uIGFuZAorICogICAgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIAorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBvciBpdHMgY29udHJpYnV0b3JzIG1heSBiZQorICogICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIElOVEVMIENPUlBPUkFUSU9OIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFTCBDT1JQT1JBVElPTiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogCisgKi8KKworCisjaWZuZGVmIF9FRklEQkdfSF8KKyNkZWZpbmUgX0VGSURCR19IXworCisjaW5jbHVkZSAiZWZpY29udGV4dC5oIgorI2luY2x1ZGUgImVmaXNlci5oIgorCit0eXBlZGVmIHN0cnVjdCBfREVCVUdQT1JUXzE2NTUwX0NPTkZJR19EQVRBIHsKKyAgICAgICAgVUlOVDMyCQkJCQkJCVBvcnRBZGRyZXNzOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWRSYXRlOworICAgIAlVSU5UMzIgICAgICAgICAgICAgICAJCQlSZWNlaXZlRmlmb0RlcHRoOworICAgIAlVSU5UMzIgICAgICAgICAgICAgICAJCQlUaW1lb3V0OworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcml0eTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQml0czsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wQml0czsKKwkgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAJQ29udHJvbE1hc2s7CisgICAgICAgIEJPT0xFQU4JCQkJCQkJUnRzQ3RzRW5hYmxlOwkJLy8gUlRTLCBDVFMgY29udHJvbAorfSBERUJVR1BPUlRfMTY1NTBfQ09ORklHX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IF9ERUJVR1BPUlRfMTY1NTBfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgREVCVUdQT1JUXzE2NTUwX0NPTkZJR19EQVRBCQlDb25maWdEYXRhOworfSBERUJVR1BPUlRfMTY1NTBfREVWSUNFX1BBVEg7CisKK3R5cGVkZWYgdW5pb24geworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgIERldlBhdGg7CisgICAgREVCVUdQT1JUXzE2NTUwX0RFVklDRV9QQVRIICAgICAgICAgVWFydDsKKyAgICAvLyBhZGQgbmV3IHR5cGVzIG9mIGRlYnVncG9ydCBkZXZpY2UgcGF0aHMgdG8gdGhpcyB1bmlvbi4uLgorfSBERUJVR1BPUlRfREVWX1BBVEg7CisKKworLy8KKy8vIERlYnVnIFN1cHBvcnQgcHJvdG9jb2wgezI3NTU1OTBDLTZGM0MtNDJGQS05RUE0LUEzQkE1NDNDREEyNX0KKy8vCisKKyNkZWZpbmUgREVCVUdfU1VQUE9SVF9QUk9UT0NPTCBcCit7IDB4Mjc1NTU5MEMsIDB4NkYzQywgMHg0MmZhLCAweDlFLCAweEE0LCAweEEzLCAweEJBLCAweDU0LCAweDNDLCAweERBLCAweDI1IH0KKworCit0eXBlZGVmIFVJTlROIEVYQ0VQVElPTl9UWVBFOworCit0eXBlZGVmCitWT0lECisoKkVYQ0VQVElPTl9IQU5ETEVSKSAoCisJSU4gRVhDRVBUSU9OX1RZUEUgRXhjZXB0aW9uVHlwZSwKKyAgICBJTiBTWVNURU1fQ09OVEVYVCAqU3lzdGVtQ29udGV4dAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRUdJU1RFUl9USU1FUl9USUNLX0NBTExCQUNLKSAoCisgICAgSU4gc3RydWN0IF9FRklfREVCVUdfU1VQUE9SVF9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIEVYQ0VQVElPTl9IQU5ETEVSCSAgICAgICAgICAgICAgICBUaW1lclRpY2tDYWxsYmFjaworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRUdJU1RFUl9FWENFUFRJT05fSEFORExFUikgKAorICAgIElOICAgICBzdHJ1Y3QgX0VGSV9ERUJVR19TVVBQT1JUX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gICAgIEVYQ0VQVElPTl9IQU5ETEVSICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25IYW5kbGVyLAorICAgIElOICAgICBFWENFUFRJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUF9DQUxMX1RSQUNFKSAoCisgICAgSU4gICAgIHN0cnVjdCBfRUZJX0RFQlVHX1NVUFBPUlRfSU5URVJGQUNFICAqVGhpcworICAgICk7CisKKworI2RlZmluZSBFRklfREVCVUdfU1VQUE9SVF9JTlRFUkZBQ0VfUkVWSVNJT04gICAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ERUJVR19TVVBQT1JUX0lOVEVSRkFDRSB7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAJUmV2aXNpb247CisgICAgRUZJX1JFR0lTVEVSX1RJTUVSX1RJQ0tfQ0FMTEJBQ0sJUmVnaXN0ZXJUaW1lclRpY2tDYWxsYmFjazsKKyAgICBFRklfUkVHSVNURVJfRVhDRVBUSU9OX0hBTkRMRVIgIAlSZWdpc3RlckV4Y2VwdGlvbkhhbmRsZXI7CisgICAgRUZJX0lQX0NBTExfVFJBQ0UgICAgICAgICAgICAgICAJSXBDYWxsVHJhY2U7Cit9IEVGSV9ERUJVR19TVVBQT1JUX0lOVEVSRkFDRTsKKworCisvLworLy8gRGVidWdwb3J0IGlvIHByb3RvY29sIHtFQkE0RThEMi0zODU4LTQxRUMtQTI4MS0yNjQ3QkE5NjYwRDB9CisvLworCisjZGVmaW5lIERFQlVHUE9SVF9JT19QUk9UT0NPTCBcCit7IDBYRUJBNEU4RDIsIDBYMzg1OCwgMFg0MUVDLCAwWEEyLCAwWDgxLCAwWDI2LCAwWDQ3LCAwWEJBLCAwWDk2LCAwWDYwLCAwWEQwIH0KKyAKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RFQlVHUE9SVF9JT19SRVNFVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9JT19JTlRFUkZBQ0UgIAkqVGhpcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9ERUJVR1BPUlRfSU9fUkVBRCkgKAorICAgIElOICAgICBzdHJ1Y3QgX0VGSV9ERUJVR1BPUlRfSU9fSU5URVJGQUNFCSpUaGlzLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgCQkqQnVmZmVyU2l6ZSwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAJCSpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfREVCVUdQT1JUX0lPX1dSSVRFKSAoCisgICAgSU4gICAgIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9JT19JTlRFUkZBQ0UgKlRoaXMsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAJCSpCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgCQkqQnVmZmVyCisgICAgKTsKKworI2RlZmluZSBFRklfREVCVUdQT1JUX0lPX0lOVEVSRkFDRV9SRVZJU0lPTiAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ERUJVR1BPUlRfSU9fSU5URVJGQUNFIHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIAkJUmV2aXNpb247CisgICAgRUZJX0RFQlVHUE9SVF9JT19SRUFECQkJCQlSZWFkOworICAgIEVGSV9ERUJVR1BPUlRfSU9fV1JJVEUJCQkJCVdyaXRlOworICAgIEVGSV9ERUJVR1BPUlRfSU9fUkVTRVQJCQkJCVJlc2V0OworfSBFRklfREVCVUdQT1JUX0lPX0lOVEVSRkFDRTsKKworCisvLworLy8gRGVidWdwb3J0IFVBUlQxNjU1MCBjb250cm9sIHByb3RvY29sIHs2MjhFQTk3OC00QzI2LTQ2MDUtQkMwMi1BNDJBNDk2OTE3RER9CisvLworCisjZGVmaW5lIERFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9QUk9UT0NPTCBcCit7IDBYNjI4RUE5NzgsIDBYNEMyNiwgMFg0NjA1LCAwWEJDLCAwWDIsIDBYQTQsIDBYMkEsIDBYNDksIDBYNjksIDBYMTcsIDBYREQgfQorIAorLy8gTm90ZTogVGhlIGRlZmluaXRpb25zIGZvciBFRklfUEFSSVRZX1RZUEUsIEVGSV9TVE9QX0JJVFNfVFlQRSwgYW5kIAorLy8gU0VSSUFMX0lPX01PREUgYXJlIGluY2x1ZGVkIGZyb20gZWZpc2VyLmgKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VBUlQxNjU1MF9TRVRfQVRUUklCVVRFUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9JTlRFUkZBQ0UgIAkqVGhpcywKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgIAlCYXVkUmF0ZSwKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIAlSZWNlaXZlRmlmb0RlcHRoLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgCVRpbWVvdXQsCisgICAgSU4gRUZJX1BBUklUWV9UWVBFICAgICAgIAkJCVBhcml0eSwKKyAgICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIAlEYXRhQml0cywKKyAgICBJTiBFRklfU1RPUF9CSVRTX1RZUEUgICAgCQkJU3RvcEJpdHMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVUFSVDE2NTUwX1NFVF9DT05UUk9MX0JJVFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERUJVR1BPUlRfVUFSVDE2NTUwX0NPTlRST0xfSU5URVJGQUNFICAJKlRoaXMsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAJQ29udHJvbAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VQVJUMTY1NTBfR0VUX0NPTlRST0xfQklUUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9JTlRFUkZBQ0UJKlRoaXMsCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAJKkNvbnRyb2wKKyAgICApOworCisjZGVmaW5lIEVGSV9ERUJVR1BPUlRfVUFSVDE2NTUwX0NPTlRST0xfSU5URVJGQUNFX1JFVklTSU9OICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9JTlRFUkZBQ0UgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgCVJldmlzaW9uOworCUVGSV9VQVJUMTY1NTBfU0VUX0FUVFJJQlVURVMJCVNldEF0dHJpYnV0ZXM7CisJRUZJX1VBUlQxNjU1MF9TRVRfQ09OVFJPTF9CSVRTCQlTZXRDb250cm9sOworCUVGSV9VQVJUMTY1NTBfR0VUX0NPTlRST0xfQklUUyAJCUdldENvbnRyb2w7CisJREVCVUdQT1JUXzE2NTUwX0NPTkZJR19EQVRBCQkJKk1vZGU7Cit9IEVGSV9ERUJVR1BPUlRfVUFSVDE2NTUwX0NPTlRST0xfSU5URVJGQUNFOworICAgICAgICAKKworI2RlZmluZSBERVZJQ0VfUEFUSF9ERUJVR1BPUlQgREVCVUdQT1JUX0lPX1BST1RPQ09MCisgICAgICAgIAorI2VuZGlmIC8qIF9FRklEQkdfSF8gKi8KZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL3Byb3RvY29sL2VmaXZhci5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvcHJvdG9jb2wvZWZpdmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkYzUwNgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL3Byb3RvY29sL2VmaXZhci5oCkBAIC0wLDAgKzEsMTMzIEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKK0Fic3RyYWN0OgorCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKworCisvLworLy8gVGhlIHZhcmlhYmxlIHN0b3JlIHByb3RvY29sIGludGVyZmFjZSBpcyBzcGVjaWZpYyB0byB0aGUgcmVmZXJlbmNlCisvLyBpbXBsZW1lbnRhdGlvbi4gIFRoZSBpbml0aWFsaXphdGlvbiBjb2RlIGFkZHMgdmFyaWFibGUgc3RvcmUgZGV2aWNlcworLy8gdG8gdGhlIHN5c3RlbSwgYW5kIHRoZSBGVyBjb25uZWN0cyB0byB0aGUgZGV2aWNlcyB0byBwcm92aWRlIHRoZQorLy8gdmFyaWFibGUgc3RvcmUgaW50ZXJmYWNlcyB0aHJvdWdoIHRoZXNlIGRldmljZXMuCisvLworCisvLworLy8gVmFyaWFibGUgU3RvcmUgRGV2aWNlIHByb3RvY29sCisvLworCisjZGVmaW5lIFZBUklBQkxFX1NUT1JFX1BST1RPQ09MICAgIFwKKyAgICB7IDB4ZjA4OGNkOTEsIDB4YTA0NiwgMHgxMWQyLCB7MHg4ZSwgMHg0MiwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKK0lOVEVSRkFDRV9ERUNMKF9FRklfVkFSSUFCTEVfU1RPUkUpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU1RPUkVfQ0xFQVIpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9WQVJJQUJMRV9TVE9SRSAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQmFua05vLAorICAgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgKlNjcmF0Y2gKKyAgICApOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TVE9SRV9SRUFEKSAoCisgICAgSU4gc3RydWN0IF9FRklfVkFSSUFCTEVfU1RPUkUgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJhbmtObywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NUT1JFX1VQREFURSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1ZBUklBQkxFX1NUT1JFICAgKlRoaXMsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBCYW5rTm8sCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TVE9SRV9TSVpFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVkFSSUFCTEVfU1RPUkUgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE5vQmFua3MKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVFJBTlNBQ1RJT05fVVBEQVRFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVkFSSUFCTEVfU1RPUkUgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJhbmtObywKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdDb250ZW50cworICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfVkFSSUFCTEVfU1RPUkUgeworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgYmFua3MgYW5kIGJhbmsgc2l6ZQorICAgIC8vCisKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgQmFua1NpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIE5vQmFua3M7CisKKyAgICAvLworICAgIC8vIEZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIHN0b3JhZ2UgYmFua3MKKyAgICAvLworCisgICAgRUZJX1NUT1JFX0NMRUFSICAgICAgICAgICAgIENsZWFyU3RvcmU7CisgICAgRUZJX1NUT1JFX1JFQUQgICAgICAgICAgICAgIFJlYWRTdG9yZTsKKyAgICBFRklfU1RPUkVfVVBEQVRFICAgICAgICAgICAgVXBkYXRlU3RvcmU7CisgICAgRUZJX1NUT1JFX1NJWkUgICAgICAgICAgICAgIFNpemVTdG9yZSBPUFRJT05BTDsKKyAgICBFRklfVFJBTlNBQ1RJT05fVVBEQVRFICAgICAgVHJhbnNhY3Rpb25VcGRhdGUgT1BUSU9OQUw7CisKK30gRUZJX1ZBUklBQkxFX1NUT1JFOworCisKKy8vCisvLworLy8gQ2xlYXJTdG9yZSgpICAgICAtIEEgZnVuY3Rpb24gdG8gY2xlYXIgdGhlIHJlcXVlc3RlZCBzdG9yYWdlIGJhbmsuICBBIGNsZWFyZWQKKy8vICAgICAgYmFuayBjb250YWlucyBhbGwgIm9uIiBiaXRzLgorLy8KKy8vIFJlYWRTdG9yZSgpICAgICAgLSBSZWFkIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHN0b3JlLgorLy8KKy8vIFVwZGF0ZVN0b3JlKCkgICAgLSBVcGRhdGVzIGRhdGEgb24gdGhlIHJlcXVlc3RlZCBzdG9yZS4gVGhlIEZXIHdpbGwgb25seQorLy8gICAgICBldmVyIGlzc3VlIHVwZGF0ZXMgdG8gY2xlYXIgYml0cyBpbiB0aGUgc3RvcmUuIFVwZGF0ZXMgbXVzdCBiZQorLy8gICAgICBwZXJmb3JtZWQgaW4gTFNiIHRvIE1TYiBvcmRlciBvZiB0aGUgdXBkYXRlIGJ1ZmZlci4KKy8vCisvLyBTaXplU3RvcmUoKSAgICAgIC0gQW4gb3B0aW9uYWwgZnVuY3Rpb24gZm9yIG5vbi1ydW50aW1lIHN0b3JlcyB0aGF0IGNhbiBiZQorLy8gICAgICBkeW5hbWljYWxseSBzaXplZC4gIFRoZSBGVyB3aWxsIG9ubHkgZXZlciBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgc3RvcmUKKy8vICAgICAgYnkgMSBiYW5rc2l6ZSBhdCBhIHRpbWUsIGFuZCBpdCBpcyBhbHdheXMgYWRkaW5nIG9yIHJlbW92aW5nIGEgYmFuayBmcm9tIAorLy8gICAgICB0aGUgZW5kIG9mIHRoZSBzdG9yZS4KKy8vCisvLyBCeSBkZWZhdWx0IHRoZSBGVyB3aWxsIHVwZGF0ZSB2YXJpYWJsZXMgYW5kIHN0b3JhZ2UgYmFua3MgaW4gYW4KKy8vICJhdG9taWMiIG1hbm5lciBieSBrZWVwaW5nIDEgb2xkIGNvcHkgb2YgdGhlIGRhdGEgZHVyaW5nIGFuIHVwZGF0ZSwKKy8vIGFuZCByZWNvdmVyaW5nIGFwcHJvcGlhdGVseSBpZiB0aGUgcG93ZXIgaXMgbG9zdCBkdXJpbmcgdGhlIG1pZGRsZQorLy8gb2YgYW4gb3BlcmF0aW9uLiAgVG8gZG8gdGhpcyB0aGUgRlcgbmVlZHMgdG8gaGF2ZSBtdWx0aXBsZSBiYW5rcworLy8gb2Ygc3RvcmFnZSBkZWRpY2F0ZWQgdG8gaXRzIHVzZS4gSWYgdGhhdCdzIG5vdCBwb3NzaWJsZSwgdGhlIGRyaXZlciAKKy8vIGNhbiBpbXBsZW1lbnQgYW4gYXRvbWljIGJhbmsgdXBkYXRlIGZ1bmN0aW9uIGFuZCB0aGUgRlcgd2lsbCBhbGxvdyAKKy8vIDEgYmFuayBpbiB0aGlzIGNhc2UuICAoSXQgd2lsbCBhbGxvdyBhbnkgbnVtYmVyIG9mIGJhbmtzLAorLy8gYnV0IGl0IHdvbid0IHJlcXVpcmUgYW4gImV4dHJhIiBiYW5rIHRvIHByb3ZpZGUgaXRzIGJhbmsgdHJhbnNhY3Rpb24gCisvLyBmdW5jdGlvbikuCisvLworLy8gVHJhbnNhY3Rpb25VcGRhdGUoKSAgLSBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGNhbiBjbGVhciAmIHVwZGF0ZSBhbiAKKy8vICAgICAgZW50aXJlIGJhbmsgaW4gYW4gImF0b21pYyIgZmFzaGlvbi4gIElmIHRoZSBvcGVyYXRpb24gZmFpbHMgaW4gdGhlIAorLy8gICAgICBtaWRkbGUgdGhlIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgaGF2aW5nIGVpdGhlciB0aGUgcHJldmlvdXMgY29weSAKKy8vICAgICAgb2YgdGhlIGJhbmsncyBkYXRhIG9yIHRoZSBuZXcgY29weS4gIEEgY29weSB0aGF0J3MgcGFydGlhbGx5IHdyaXR0ZW4KKy8vICAgICAgaXMgbm90IHZhbGlkIGFzIGludGVybmFsIGRhdGEgc2V0dGluZ3MgbWF5IGdldCBsb3N0LiAgU3VwcGx5IHRoaXMKKy8vICAgICAgZnVuY3Rpb24gb25seSB3aGVuIG5lZWRlZC4KKy8vCisKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL3Byb3RvY29sL2ludGxvYWQuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL3Byb3RvY29sL2ludGxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI0ZTNmCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvcHJvdG9jb2wvaW50bG9hZC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk5IEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgaW50bG9hZAorCitBYnN0cmFjdDoKKworICAgIEVGSSBzdXBwb3J0IGZvciBsb2FkaW5nIGludGVybmFsbHkgbGlua2VkIGluIGFwcHMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaWZuZGVmIF9JTlRFUk5BTF9MT0FEX0lOQ0xVREVfCisjZGVmaW5lIF9JTlRFUk5BTF9MT0FEX0lOQ0xVREVfCisKKy8vIHtENjVBNkI4Qy03MUU1LTRkZjAtQTkwOS1GMEQyOTkyQjVBQTl9CisjZGVmaW5lIElOVEVSTkFMX1NIRUxMX0dVSUQgXAorICAgIHsgMHhkNjVhNmI4YywgMHg3MWU1LCAweDRkZjAsIHsweGE5LCAweDA5LCAweGYwLCAweGQyLCAweDk5LCAweDJiLCAweDVhLCAweGE5fSB9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9wcm90b2NvbC9sZWdhY3lib290LmggYi9lZmkzMi9pbmNsdWRlL2VmaS9wcm90b2NvbC9sZWdhY3lib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlOTRlNwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2luY2x1ZGUvZWZpL3Byb3RvY29sL2xlZ2FjeWJvb3QuaApAQCAtMCwwICsxLDExOSBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTkgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBsZWdhY3lib290CisKK0Fic3RyYWN0OgorCisgICAgRUZJIHN1cHBvcnQgZm9yIGxlZ2FjeSBib290CisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2lmbmRlZiBfTEVHQUNZX0JPT1RfSU5DTFVERV8KKyNkZWZpbmUgX0xFR0FDWV9CT09UX0lOQ0xVREVfCisKKyNkZWZpbmUgTEVHQUNZX0JPT1RfUFJPVE9DT0wgXAorICAgIHsgMHgzNzZlNWViMiwgMHgzMGU0LCAweDExZDMsIHsgMHhiYSwgMHhlNSwgMHgwLCAweDgwLCAweGM3LCAweDNjLCAweDg4LCAweDgxIH0gfQorCisjcHJhZ21hIHBhY2soMSkKKworLy8KKy8vIEJCUyAxLjAxIChTZWUgQXBwZW5kaXggQSkgSVBMIGFuZCBCQ1YgVGFibGUgRW50cnkgRGF0YSBzdHJ1Y3R1cmUuCisvLyAgU2VnOk9mZiBwb2ludGVycyBoYXZlIGJlZW4gY29udmVydGVkIHRvIEVGSSBwb2ludGVycyBpbiB0aGlzIGRhdGEgc3RydWN0dXJlCisvLyAgVGhpcyBpcyB0aGUgc3RydWN0dXJlIHRoYXQgYWxzbyBtYXBzIHRvIHRoZSBFRkkgZGV2aWNlIHBhdGggZm9yIHRoZSBib290IHNlbGVjdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgIERldmljZVR5cGU7CisgICAgVUlOVDE2ICBTdGF0dXNGbGFnOworICAgIFVJTlQzMiAgUmVzZXJ2ZWQ7CisgICAgVk9JRCAgICAqQm9vdEhhbmRsZXI7ICAgLy8gTm90IGFuIEVGSSBlbnRyeSBwb2ludAorICAgIENIQVI4ICAgKkRlc2NTdHJpbmc7Cit9IEJCU19UQUJMRV9FTlRSWTsKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkxFR0FDWV9CT09UX0NBTEwpICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqRGV2aWNlUGF0aAorICAgICk7CisKKworLy8KKy8vIEJCUyBzdXBwb3J0IGZ1bmN0aW9ucworLy8gIFBuUCBDYWxsIG51bWJlcnMgYW5kIEJpb3NTZWxlY3RvciBoaWRkZW4gaW4gaW1wbGVtZW50YXRpb24KKy8vCisKK3R5cGVkZWYgZW51bSB7CisgICAgSXBsUmVsYXRpdmUsCisgICAgQmN2UmVsYXRpdmUKK30gQkJTX1RZUEU7CisKK0lOVEVSRkFDRV9ERUNMKF9MRUdBQ1lfQk9PVF9JTlRFUkZBQ0UpOworCisvLworLy8gPT0gUG5QIEZ1bmN0aW9uIDB4NjAgdGhlbiBCYnNWZXJzaW9uID09IDB4MDEwMSBpZiB0aGlzIGNhbGwgZmFpbHMgdGhlbiBCYnNWZXJzaW9uID09IDB4MDAwMAorLy8KKworLy8KKy8vID09IFBuUCBGdW5jdGlvbiAweDYxCisvLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqR0VUX0RFVklDRV9DT1VOVCkgKAorICAgIElOICBzdHJ1Y3QgX0xFR0FDWV9CT09UX0lOVEVSRkFDRSAgICpUaGlzLAorICAgIElOICBCQlNfVFlQRSAgICAgICAgKlRhYmxlVHlwZSwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICpEZXZpY2VDb3VudCwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICpNYXhDb3VudAorICAgICk7CisKKy8vCisvLyA9PSBQblAgRnVuY3Rpb24gMHg2MgorLy8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkdFVF9QUklPUklUWV9BTkRfVEFCTEUpICgKKyAgICBJTiAgc3RydWN0IF9MRUdBQ1lfQk9PVF9JTlRFUkZBQ0UgICAqVGhpcywKKyAgICBJTiAgQkJTX1RZUEUgICAgICAgICpUYWJsZVR5cGUsCisgICAgSU4gT1VUICBVSU5UTiAgICAgICAqUHJpb3JpdHlTaXplLCAvLyBNYXhDb3VudCAqIHNpemVvZihVSU5UOCkKKyAgICBPVVQgICAgIFVJTlROICAgICAgICpQcmlvcml0eSwKKyAgICBJTiBPVVQgIFVJTlROICAgICAgICpUYWJsZVNpemUsICAgIC8vIE1heENvdW50ICogc2l6ZW9mKEJCU19UQUJMRV9FTlRSWSkKKyAgICBPVVQgQkJTX1RBQkxFX0VOVFJZICpUYWJsZUVudHJ5U2l6ZQorICAgICk7CisKKy8vCisvLyA9PSBQblAgRnVuY3Rpb24gMHg2MworLy8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKlNFVF9QUklPUklUWSkgKAorICAgIElOICBzdHJ1Y3QgX0xFR0FDWV9CT09UX0lOVEVSRkFDRSAgICpUaGlzLAorICAgIElOICBCQlNfVFlQRSAgICAgICAgKlRhYmxlVHlwZSwKKyAgICBJTiBPVVQgIFVJTlROICAgICAgICpQcmlvcml0eVNpemUsCisgICAgT1VUICAgICBVSU5UTiAgICAgICAqUHJpb3JpdHkKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfTEVHQUNZX0JPT1RfSU5URVJGQUNFIHsKKyAgICBMRUdBQ1lfQk9PVF9DQUxMICAgIEJvb3RJdDsKKworICAgIC8vCisgICAgLy8gTmV3IGZ1bmN0aW9ucyB0byBhbGxvdyBCQlMgYm9vdGluZyB0byBiZSBjb25maWd1cmVkIGZyb20gRUZJCisgICAgLy8KKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICBCYnNWZXJzaW9uOyAgICAgLy8gQ3VycmVudGx5IDB4MDEwMQorICAgIEdFVF9ERVZJQ0VfQ09VTlQgICAgICAgIEdldERldmljZUNvdW50OworICAgIEdFVF9QUklPUklUWV9BTkRfVEFCTEUgIEdldFByaW9yaXR5QW5kVGFibGU7CisgICAgU0VUX1BSSU9SSVRZICAgICAgICAgICAgU2V0UHJpb3JpdHk7ICAgCit9IExFR0FDWV9CT09UX0lOVEVSRkFDRTsKKworRUZJX1NUQVRVUworUGxJbml0aWFsaXplTGVnYWN5Qm9vdCAoCisgICAgVk9JRAorICAgICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZWZpMzIvaW5jbHVkZS9lZmkvcHJvdG9jb2wvcGlmbGFzaDY0LmggYi9lZmkzMi9pbmNsdWRlL2VmaS9wcm90b2NvbC9waWZsYXNoNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTIxZGZjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvcHJvdG9jb2wvcGlmbGFzaDY0LmgKQEAgLTAsMCArMSwxMjEgQEAKKyNpZm5kZWYgX1BJRkxBU0g2NF9ICisjZGVmaW5lIF9QSUZMQVNINjRfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OSAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBQSWZsYXNoNjQuaAorICAgIAorQWJzdHJhY3Q6CisKKyAgICBJZmxhc2g2NC5lZmkgcHJvdG9jb2wgdG8gYWJzdHJhY3QgaWZsYXNoIGZyb20KKyAgICB0aGUgc3lzdGVtLgorCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIEd1aWQgdGhhdCBpZGVudGlmaWVzIHRoZSBJRkxBU0ggcHJvdG9jb2wKKy8vCisjZGVmaW5lIElGTEFTSDY0X1BST1RPQ09MX1BST1RPQ09MIFwKKyAgICB7IDB4NjVjYmExMTAsIDB4NzRhYiwgMHgxMWQzLCAweGJiLCAweDg5LCAweDAsIDB4ODAsIDB4YzcsIDB4M2MsIDB4ODgsIDB4ODEgfTsKKworLy8KKy8vIFVubG9jayBGTEFTSCBmcm9tIFN0YXJ0QWRkcmVzcyB0byBFbmRBZGRyZXNzIGFuZCByZXR1cm4gYSBMb2NrS2V5CisvLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqVU5MT0NLX0ZMQVNIX0FQSSkoCisgICAgSU4gc3RydWN0IF9JRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0UgICpUaGlzCisgICAgKTsKKworLy8KKy8vIExvY2sgdGhlIGZsYXNoIHJlcHJlc2VudGVkIGJ5IHRoZSBMb2NrS2V5CisvLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqTE9DS19GTEFTSF9BUEkpKAorICAgIElOIHN0cnVjdCBfSUZMQVNINjRfUFJPVE9DT0xfSU5URVJGQUNFICAqVGhpcworICAgICk7CisKKy8vCisvLyBTdGF0dXMgY2FsbGJhY2sgZm9yIGEgdXRpbGl0eSBsaWtlIElGTEFTSDY0CisvLworLy8gIFRva2VuIHdvdWxkIG1hcCB0byBhIGxpc3QgbGlrZSBUZWQgcHJvcG9zZWQuIFRoZSB1dGlsaXR5IGhhcyBubyBpZGVhIHdoYXQgCisvLyAgICAgIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUuCisvLyAgRXJyb3JTdGF0dXMgLSBMZXZlbCBvZiBFcnJvciBvciBzdWNjZXNzLiBJbmRlcGVuZGVudCBvZiBUb2tlbi4gSWYgeW91IAorLy8gICAgICBkb24ndCBrbm93IHRoZSB0b2tlbiB5b3Ugd2lsbCBhdCBsZWFzdCBrbm93IHBhc3Mgb3IgZmFpbC4KKy8vICBTdHJpbmcgLSBPcHRpb25hbCBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuIENvdWxkIGJlIHVzZWQgZm9yIAorLy8gICAgICBkZWJ1ZyBvciBmdXR1cmUgZXhwYW5zaW9uCisvLworLy8gIEF0dHJpYnV0ZXMgLSBPcHRpb25zIHNjcmVlbiBhdHRyaWJ1dGVzIGZvciBTdHJpbmcuIENvdWxkIGFsbG93IHRoZSBzdHJpbmcgdG8gYmUgZGlmZmVyZW50IGNvbG9ycy4KKy8vCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpVVElMSVRZX1BST0dSRVNTX0FQSSkoCisgICAgSU4gc3RydWN0IF9JRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiwKKyAgICBJTiAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXMsIAorICAgIElOICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nLCAgICBPUFRJT05BTAorICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQXR0cmlidXRlcyBPUFRJT05BTAorICAgICk7CisKKy8vCisvLyBUb2tlbiBWYWx1ZXMKKy8vCisvLyBJRmxhc2g2NCBUb2tlbiBDb2RlcworI2RlZmluZSBJRkxBU0hfVE9LRU5fSUZMQVNIU1RBUlQgICAgMHhCMCAgICAgICAgICAgICAgICAvLyBJRmxhc2g2NCBoYXMgc3RhcnRlZAorI2RlZmluZSBJRkxBU0hfVE9LRU5fUkVBRElOR0ZJTEUgICAgMHhCMSAgICAgICAgICAgICAgICAvLyBSZWFkaW5nIEZpbGUKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0lOSVRWUFAgICAgICAgIDB4QjIgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6aW5nIFZwcAorI2RlZmluZSBJRkxBU0hfVE9LRU5fRElTQUJMRVZQUCAgICAgMHgxMCAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIFZwcAorI2RlZmluZSBJRkxBU0hfVE9LRU5fRkxBU0hVTkxPQ0sgICAgMHhCMyAgICAgICAgICAgICAgICAvLyBVbmxvY2tpbmcgRkxBU0ggRGV2aWNlcworI2RlZmluZSBJRkxBU0hfVE9LRU5fRkxBU0hFUkFTRSAgICAgMHhCNCAgICAgICAgICAgICAgICAvLyBFcmFzaW5nIEZMQVNIIERldmljZXMKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0ZMQVNIUFJPR1JBTSAgIDB4QjUgICAgICAgICAgICAgICAgLy8gUHJvZ3JhbW1pbmcgRkxBU0gKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0ZMQVNIVkVSSUZZICAgIDB4QjYgICAgICAgICAgICAgICAgLy8gVmVyaWZ5aW5nIEZMQVNICisjZGVmaW5lIElGTEFTSF9UT0tFTl9VUERBVEVTVUNDRVMgICAweEI3ICAgICAgICAgICAgICAgIC8vIEZMQVNIIFVwZGFnZSBTdWNjZXNzIQorCisjZGVmaW5lIElGTEFTSF9UT0tFTl9QUk9HUkVTU19SRUFESU5HRklMRSAgIDB4MTEgICAgICAgIC8vICUgUmVhZGluZyBGaWxlCisjZGVmaW5lIElGTEFTSF9UT0tFTl9QUk9HUkVTU19GTEFTSFVOTE9DSyAgIDB4MTMgICAgICAgIC8vICUgVW5sb2NraW5nIEZMQVNIIERldmljZXMKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX1BST0dSRVNTX0ZMQVNIRVJBU0UgICAgMHgxNCAgICAgICAgLy8gJSBFcmFzaW5nIEZMQVNIIERldmljZXMKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX1BST0dSRVNTX0ZMQVNIUFJPR1JBTSAgMHgxNSAgICAgICAgLy8gJSBQcm9ncmFtbWluZyBGTEFTSAorI2RlZmluZSBJRkxBU0hfVE9LRU5fUFJPR1JFU1NfRkxBU0hWRVJJRlkgICAweDE2ICAgICAgICAvLyAlIFZlcmlmeWluZyBGTEFTSAorCisjZGVmaW5lIElGTEFTSF9UT0tFTl9SRUFESU5HRklMRV9FUiAweEI4ICAgICAgICAgICAgICAgIC8vIEZpbGUgUmVhZCBFcnJvcgorI2RlZmluZSBJRkxBU0hfVE9LRU5fSU5JVFZQUF9FUiAgICAgMHhCOSAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXphdGlvbiBvZiBJRkIgRXJyb3IKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0ZMQVNIVU5MT0NLX0VSIDB4QkEgICAgICAgICAgICAgICAgLy8gRkxBU0ggVW5sb2NrIEVycm9yCisjZGVmaW5lIElGTEFTSF9UT0tFTl9GTEFTSEVSQVNFX0VSICAweEJCICAgICAgICAgICAgICAgIC8vIEZMQVNIIEVyYXNlIEVycm9yCisjZGVmaW5lIElGTEFTSF9UT0tFTl9GTEFTSFZFUklGWV9FUiAweEJDICAgICAgICAgICAgICAgIC8vIEZMQVNIIFZlcmlmeSBFcnJvcgorI2RlZmluZSBJRkxBU0hfVE9LRU5fRkxBU0hQUk9HX0VSICAgMHhCRCAgICAgICAgICAgICAgICAvLyBGTEFTSCBQcm9ncmFtIEVycm9yCisKKyNkZWZpbmUgSUZMQVNIX1RBQkxFX0VORCAgICAgICAgICAgIDB4MDAKKworLy8KKy8vIElmIHRoaXMgbnVtYmVyIGNoYW5nZXMgb25lIG9mIHRoZSBleGlzdGluZyBBUEkncyBoYXMgY2hhbmdlcworLy8KKyNkZWZpbmUgSUZMQVNIX1BJX01BSk9SX1ZFUlNJT04gMHgwMQorCisvLworLy8gVGhpcyBudW1iZXIgY2hhbmdlcyB3aGVuIG5ldyBBUElzIG9yIGRhdGEgdmFyaWFibGVzIGdldCBhZGRlZCB0byB0aGUgZW5kCisvLyAgb2YgdGhlIGRhdGEgc3RydWN0dXJlCisvLworI2RlZmluZSBJRkxBU0hfUElfTUlOT1JfVkVSU0lPTiAweDAxCisKK3R5cGVkZWYgc3RydWN0IF9JRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0UgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIE1ham9yVmVyc2lvbjsgICAgICAgCisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgTWlub3JWZXJzaW9uOyAgIAorICAgIFVOTE9DS19GTEFTSF9BUEkgICAgICAgIFVubG9ja0ZsYXNoOworICAgIExPQ0tfRkxBU0hfQVBJICAgICAgICAgIExvY2tGbGFzaDsKKyAgICBVVElMSVRZX1BST0dSRVNTX0FQSSAgICBQcm9ncmVzczsKKyAgICAKKyAgICAvLworICAgIC8vIEZ1dHVyZSBleHBhbnNpb24gZ29lcyBoZXJlCisgICAgLy8KKworfSBJRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0U7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmkzMi9pbmNsdWRlL2VmaS9wcm90b2NvbC92Z2FjbGFzcy5oIGIvZWZpMzIvaW5jbHVkZS9lZmkvcHJvdG9jb2wvdmdhY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRlYjVjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvcHJvdG9jb2wvdmdhY2xhc3MuaApAQCAtMCwwICsxLDk1IEBACisjaWZuZGVmIF9WR0FfQ0xBU1NfSAorI2RlZmluZSBfVkdBX0NMQVNTX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTkgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgVmdhQ2xhc3MuaAorICAgIAorQWJzdHJhY3Q6CisKKyAgICBWZ2EgTWluaSBwb3J0IGJpbmRpbmcgdG8gVmdhIENsYXNzIHByb3RvY29sCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIFZHQSBEZXZpY2UgU3RydWN0dXJlCisvLworCisvLyB7MEUzRDYzMTAtNkZFNC0xMWQzLUJCODEtMDA4MEM3M0M4ODgxfQorI2RlZmluZSBWR0FfQ0xBU1NfRFJJVkVSX1BST1RPQ09MIFwKKyAgICB7IDB4ZTNkNjMxMCwgMHg2ZmU0LCAweDExZDMsIHsweGJiLCAweDgxLCAweDAsIDB4ODAsIDB4YzcsIDB4M2MsIDB4ODgsIDB4ODF9IH0KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoKiBJTklUX1ZHQV9DQVJEKSAoCisgICAgSU4gIFVJTlROICAgVmdhTW9kZSwKKyAgICBJTiAgVk9JRCAgICAqQ29udGV4dAorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UTiAgIE1heENvbHVtbnM7CisgICAgVUlOVE4gICBNYXhSb3dzOworfSBNQVhfQ09OU09MRV9HRU9NRVRSWTsKKworI2RlZmluZSBWR0FfQ09OX09VVF9ERVZfU0lHTkFUVVJFICAgRUZJX1NJR05BVFVSRV8zMignYycsJ3YnLCdnJywnYScpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmU7CisKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZTsKKyAgICBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgIENvbk91dDsKKyAgICBTSU1QTEVfVEVYVF9PVVRQVVRfTU9ERSAgICAgICAgIENvbk91dE1vZGU7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAqRGV2aWNlUGF0aDsKKworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcjsKKyAgICBFRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgICAgICAgICpEZXZpY2VJbzsKKworICAgIC8vCisgICAgLy8gVmlkZW8gQ2FyZCBDb250ZXh0CisgICAgLy8KKyAgICBJTklUX1ZHQV9DQVJEICAgICAgICAgICAgICAgICAgIEluaXRWZ2FDYXJkOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZnYUNhcmRDb250ZXh0OworICAgIE1BWF9DT05TT0xFX0dFT01FVFJZICAgICAgICAgICAgKkdlb21ldHJ5OworICAgIC8vCisgICAgLy8gVmlkZW8gYnVmZmVyIG5vcm1hbGx5IDB4YjgwMDAKKyAgICAvLworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9CdWZmZXI7CisKKyAgICAvLworICAgIC8vIENsZWFyIFNjcmVlbiAmIERlZmF1bHQgQXR0cmlidXRlCisgICAgLy8KKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTsKKworICAgIC8vCisgICAgLy8gLTEgbWVhbnMgc2VhcmNoIGZvciBhY3RpdmUgVkdBIGRldmljZQorICAgIC8vCisgICAgRUZJX1BDSV9BRERSRVNTX1VOSU9OICAgICAgICAgICBQY2k7Cit9IFZHQV9DT05fT1VUX0RFVjsKKworI2RlZmluZSBWR0FfQ09OX09VVF9ERVZfRlJPTV9USElTKGEpIENSKGEsIFZHQV9DT05fT1VUX0RFViwgQ29uT3V0LCBWR0FfQ09OX09VVF9ERVZfU0lHTkFUVVJFKQorCisvLworLy8gVmdhIENsYXNzIERyaXZlciBQcm90b2NvbC4gCisvLyBHVUlEIGRlZmluZWQgaW4gRUZJIExpYgorLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKklOU1RBTExfVkdBX0RSSVZFUikgKAorICAgIElOICBWR0FfQ09OX09VVF9ERVYgICAgKkNvbk91dERldiAKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgVmVyc2lvbjsKKyAgICBJTlNUQUxMX1ZHQV9EUklWRVIgICBJbnN0YWxsR2VuZXJpY1ZnYURyaXZlcjsKK30gSU5TVEFMTF9WR0FfRFJJVkVSX0lOVEVSRkFDRTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTMyL2luY2x1ZGUvZWZpL3JvbWxvYWQuaCBiL2VmaTMyL2luY2x1ZGUvZWZpL3JvbWxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA2MDExCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvaW5jbHVkZS9lZmkvcm9tbG9hZC5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgX0VGSV9ST01MT0FEX0gKKyNkZWZpbmUgX0VGSV9ST01MT0FEX0gKKworI2RlZmluZSBST01fU0lHTkFUVVJFIDB4YWE1NQorI2RlZmluZSBQQ0lEU19TSUdOQVRVUkUgIlBDSVIiCisjcHJhZ21hIHBhY2socHVzaCkKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAgVUlOVDggICAgUGNpZHNfU2lnWzRdOworICAgIFVJTlQxNiAgVmVuZElkOworICAgIFVJTlQxNiAgRGV2SWQ7CisgICAgVUlOVDE2ICBWcGRfT2ZmOworICAgIFVJTlQxNiAgU2l6ZTsKKyAgICBVSU5UOCBSZXY7CisgICAgVUlOVDggQ2xhc3NfQ29kZVszXTsKKyAgICBVSU5UMTYgIEltYWdlX0xlbjsKKyAgICBVSU5UMTYgIFJldl9Mdmw7CisgICAgVUlOVDggQ29kZV9UeXBlOworICAgIFVJTlQ4IEluZGk7CisgICAgVUlOVDE2ICBSc3ZkOworfVBjaURhdGFTdHJ1Y3R1cmU7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQxNiBTaXplOworICAgIFVJTlQzMiBIZWFkZXJfU2lnOworICAgIFVJTlQxNiBTdWJTeXN0ZW07CisgICAgVUlOVDE2IE1hY2hpbmVUeXBlOworICAgIFVJTlQ4ICBSZXN2ZFsxMF07CisgICAgVUlOVDE2IEVmaU9mZnNldDsKK31BcmNoRGF0YTsKK3R5cGVkZWYgc3RydWN0IAoreworICAgIFVJTlQxNiBSb21fU2lnOworICAgIEFyY2hEYXRhIEFyY2hfRGF0YTsKKyAgICBVSU5UMTYgUGNpZHNfT2ZmOworICAgIFVJTlQ4IHJlc3ZkWzM4XTsKK31Sb21IZWFkZXI7CisjcHJhZ21hIHBhY2socG9wKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2VmaTMyL2xpYi9jcnQwLWVmaS1pYTMyLm8gYi9lZmkzMi9saWIvY3J0MC1lZmktaWEzMi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYTlhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9saWIvY3J0MC1lZmktaWEzMi5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTMyL2xpYi9lbGZfaWEzMl9lZmkubGRzIGIvZWZpMzIvbGliL2VsZl9pYTMyX2VmaS5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1ZTM2YwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL2xpYi9lbGZfaWEzMl9lZmkubGRzCkBAIC0wLDAgKzEsNzUgQEAKK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAuID0gMDsKKyAgSW1hZ2VCYXNlID0gLjsKKyAgLmhhc2ggOiB7ICooLmhhc2gpIH0JLyogdGhpcyBNVVNUIGNvbWUgZmlyc3QhICovCisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnRleHQgOgorICB7CisgICAqKC50ZXh0KQorICAgKigudGV4dC4qKQorICAgKiguZ251LmxpbmtvbmNlLnQuKikKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5zZGF0YSA6CisgIHsKKyAgICooLmdvdC5wbHQpCisgICAqKC5nb3QpCisgICAqKC5zcm9kYXRhKQorICAgKiguc2RhdGEpCisgICAqKC5zYnNzKQorICAgKiguc2NvbW1vbikKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhIDoKKyAgeworICAgKigucm9kYXRhKikKKyAgICooLmRhdGEpCisgICAqKC5kYXRhMSkKKyAgICooLmRhdGEuKikKKyAgICooLnNkYXRhKQorICAgKiguZ290LnBsdCkKKyAgICooLmdvdCkKKyAgIC8qIHRoZSBFRkkgbG9hZGVyIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIGEgLmJzcyBzZWN0aW9uLCBzbyB3ZSBzdGljaworICAgICAgaXQgYWxsIGludG8gLmRhdGE6ICovCisgICAqKC5zYnNzKQorICAgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmR5bmFtaWMgIDogeyAqKC5keW5hbWljKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnJlbCA6CisgIHsKKyAgICAqKC5yZWwuZGF0YSkKKyAgICAqKC5yZWwuZGF0YS4qKQorICAgICooLnJlbC5nb3QpCisgICAgKigucmVsLnN0YWIpCisgICAgKiguZGF0YS5yZWwucm8ubG9jYWwpCisgICAgKiguZGF0YS5yZWwubG9jYWwpCisgICAgKiguZGF0YS5yZWwucm8pCisgICAgKiguZGF0YS5yZWwqKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnJlbG9jIDoJCS8qIFRoaXMgaXMgdGhlIFBFQ09GRiAucmVsb2Mgc2VjdGlvbiEgKi8KKyAgeworICAgICooLnJlbG9jKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmR5bnN5bSAgIDogeyAqKC5keW5zeW0pIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZHluc3RyICAgOiB7ICooLmR5bnN0cikgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC9ESVNDQVJELyA6CisgIHsKKyAgICAqKC5yZWwucmVsb2MpCisgICAgKiguZWhfZnJhbWUpCisgICAgKigubm90ZS5HTlUtc3RhY2spCisgIH0KKyAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQorfQpkaWZmIC0tZ2l0IGEvZWZpMzIvbGliL2xpYmVmaS5hIGIvZWZpMzIvbGliL2xpYmVmaS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMGQ5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9saWIvbGliZWZpLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbGliL2xpYmdudWVmaS5hIGIvZWZpMzIvbGliL2xpYmdudWVmaS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODVlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9saWIvbGliZ251ZWZpLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2FsdG1ici5iaW4gYi9lZmkzMi9tYnIvYWx0bWJyLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjYwMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvbWJyL2FsdG1ici5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2FsdG1icl9jLmJpbiBiL2VmaTMyL21ici9hbHRtYnJfYy5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1MzI0MwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL21ici9hbHRtYnJfYy5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2FsdG1icl9mLmJpbiBiL2VmaTMyL21ici9hbHRtYnJfZi5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzNzkzOQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL21ici9hbHRtYnJfZi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2dwdG1ici5iaW4gYi9lZmkzMi9tYnIvZ3B0bWJyLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc4MWIwCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvbWJyL2dwdG1ici5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2dwdG1icl9jLmJpbiBiL2VmaTMyL21ici9ncHRtYnJfYy5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1N2NlOQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL21ici9ncHRtYnJfYy5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2dwdG1icl9mLmJpbiBiL2VmaTMyL21ici9ncHRtYnJfZi5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyNjY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL21ici9ncHRtYnJfZi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2lzb2hkcGZ4LmJpbiBiL2VmaTMyL21ici9pc29oZHBmeC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzNzE3MwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL21ici9pc29oZHBmeC5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2lzb2hkcGZ4X2MuYmluIGIvZWZpMzIvbWJyL2lzb2hkcGZ4X2MuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYzIyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9tYnIvaXNvaGRwZnhfYy5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2lzb2hkcGZ4X2YuYmluIGIvZWZpMzIvbWJyL2lzb2hkcGZ4X2YuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOTRhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9tYnIvaXNvaGRwZnhfZi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2lzb2hkcHB4LmJpbiBiL2VmaTMyL21ici9pc29oZHBweC5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwNjNmNgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL21ici9pc29oZHBweC5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2lzb2hkcHB4X2MuYmluIGIvZWZpMzIvbWJyL2lzb2hkcHB4X2MuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTc1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9tYnIvaXNvaGRwcHhfYy5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL2lzb2hkcHB4X2YuYmluIGIvZWZpMzIvbWJyL2lzb2hkcHB4X2YuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWRjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9tYnIvaXNvaGRwcHhfZi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL21ici5iaW4gYi9lZmkzMi9tYnIvbWJyLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZhNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvbWJyL21ici5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL21icl9jLmJpbiBiL2VmaTMyL21ici9tYnJfYy5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhODRhYwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL21ici9tYnJfYy5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvbWJyL21icl9mLmJpbiBiL2VmaTMyL21ici9tYnJfZi5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlMzY5NAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL21ici9tYnJfZi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvc2FtcGxlL3N5c2xvZ28ubHNzIGIvZWZpMzIvc2FtcGxlL3N5c2xvZ28ubHNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTMwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmkzMi9zYW1wbGUvc3lzbG9nby5sc3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpMzIvdHh0L2h0bWwvaXNvbGludXguaHRtbCBiL2VmaTMyL3R4dC9odG1sL2lzb2xpbnV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhOWU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL3R4dC9odG1sL2lzb2xpbnV4Lmh0bWwKQEAgLTAsMCArMSw4ODEgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiINCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCis8aGVhZD4NCis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9ImFwcGxpY2F0aW9uL3hodG1sK3htbDsgY2hhcnNldD1VVEYtOCIgLz4NCis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkFzY2lpRG9jIDguNi44IiAvPg0KKzx0aXRsZT5pc29saW51eCgxKTwvdGl0bGU+DQorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCisvKiBTaGFyZWQgQ1NTIGZvciBBc2NpaURvYyB4aHRtbDExIGFuZCBodG1sNSBiYWNrZW5kcyAqLw0KKw0KKy8qIERlZmF1bHQgZm9udC4gKi8NCitib2R5IHsNCisgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLHNlcmlmOw0KK30NCisNCisvKiBUaXRsZSBmb250LiAqLw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlLA0KK3RoZWFkLCBwLnRhYmxlLmhlYWRlciwNCisjdG9jdGl0bGUsDQorI2F1dGhvciwgI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmssDQorI2Zvb3RlciB7DQorICBmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7DQorfQ0KKw0KK2JvZHkgew0KKyAgbWFyZ2luOiAxZW0gNSUgMWVtIDUlOw0KK30NCisNCithIHsNCisgIGNvbG9yOiBibHVlOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorfQ0KK2E6dmlzaXRlZCB7DQorICBjb2xvcjogZnVjaHNpYTsNCit9DQorDQorZW0gew0KKyAgZm9udC1zdHlsZTogaXRhbGljOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KKw0KK3N0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjMDgzMTk0Ow0KK30NCisNCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgbWFyZ2luLXRvcDogMS4yZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCisgIGxpbmUtaGVpZ2h0OiAxLjM7DQorfQ0KKw0KK2gxLCBoMiwgaDMgew0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQoraDIgew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KK30NCitoMyB7DQorICBmbG9hdDogbGVmdDsNCit9DQoraDMgKyAqIHsNCisgIGNsZWFyOiBsZWZ0Ow0KK30NCitoNSB7DQorICBmb250LXNpemU6IDEuMGVtOw0KK30NCisNCitkaXYuc2VjdGlvbmJvZHkgew0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorfQ0KKw0KK2hyIHsNCisgIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjsNCit9DQorDQorcCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCisNCit1bCwgb2wsIGxpID4gcCB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit1bCA+IGxpICAgICB7IGNvbG9yOiAjYWFhOyB9DQordWwgPiBsaSA+ICogeyBjb2xvcjogYmxhY2s7IH0NCisNCisubW9ub3NwYWNlZCwgY29kZSwgcHJlIHsNCisgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7DQorICBmb250LXNpemU6IGluaGVyaXQ7DQorICBjb2xvcjogbmF2eTsNCisgIHBhZGRpbmc6IDA7DQorICBtYXJnaW46IDA7DQorfQ0KKw0KKw0KKyNhdXRob3Igew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorfQ0KKyNlbWFpbCB7DQorfQ0KKyNyZXZudW1iZXIsICNyZXZkYXRlLCAjcmV2cmVtYXJrIHsNCit9DQorDQorI2Zvb3RlciB7DQorICBmb250LXNpemU6IHNtYWxsOw0KKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIG1hcmdpbi10b3A6IDQuMGVtOw0KK30NCisjZm9vdGVyLXRleHQgew0KKyAgZmxvYXQ6IGxlZnQ7DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorfQ0KKyNmb290ZXItYmFkZ2VzIHsNCisgIGZsb2F0OiByaWdodDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorDQorI3ByZWFtYmxlIHsNCisgIG1hcmdpbi10b3A6IDEuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5pbWFnZWJsb2NrLCBkaXYuZXhhbXBsZWJsb2NrLCBkaXYudmVyc2VibG9jaywNCitkaXYucXVvdGVibG9jaywgZGl2LmxpdGVyYWxibG9jaywgZGl2Lmxpc3RpbmdibG9jaywgZGl2LnNpZGViYXJibG9jaywNCitkaXYuYWRtb25pdGlvbmJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMi4wZW07DQorICBtYXJnaW4tYm90dG9tOiAyLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgY29sb3I6ICM2MDYwNjA7DQorfQ0KKw0KK2Rpdi5jb250ZW50IHsgLyogQmxvY2sgZWxlbWVudCBjb250ZW50LiAqLw0KKyAgcGFkZGluZzogMDsNCit9DQorDQorLyogQmxvY2sgZWxlbWVudCB0aXRsZXMuICovDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCit9DQorZGl2LnRpdGxlICsgKiB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisNCit0ZCBkaXYudGl0bGU6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KK2Rpdi5jb250ZW50IGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgKyBkaXYudGl0bGUgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KKw0KK2Rpdi5zaWRlYmFyYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBiYWNrZ3JvdW5kOiAjZmZmZmVlOw0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgI2YwZjBmMDsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYubGlzdGluZ2Jsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGJhY2tncm91bmQ6ICNmOGY4Zjg7DQorICBwYWRkaW5nOiAwLjVlbTsNCit9DQorDQorZGl2LnF1b3RlYmxvY2ssIGRpdi52ZXJzZWJsb2NrIHsNCisgIHBhZGRpbmctbGVmdDogMS4wZW07DQorICBtYXJnaW4tbGVmdDogMS4wZW07DQorICBtYXJnaW4tcmlnaHQ6IDEwJTsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGNvbG9yOiAjODg4Ow0KK30NCisNCitkaXYucXVvdGVibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQorZGl2LnZlcnNlYmxvY2sgPiBwcmUuY29udGVudCB7DQorICBmb250LWZhbWlseTogaW5oZXJpdDsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCit9DQorZGl2LnZlcnNlYmxvY2sgPiBkaXYuYXR0cmlidXRpb24gew0KKyAgcGFkZGluZy10b3A6IDAuNzVlbTsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KKy8qIERFUFJFQ0FURUQ6IFByZSB2ZXJzaW9uIDguMi43IHZlcnNlIHN0eWxlIGxpdGVyYWwgYmxvY2suICovDQorZGl2LnZlcnNlYmxvY2sgKyBkaXYuYXR0cmlidXRpb24gew0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorDQorZGl2LmFkbW9uaXRpb25ibG9jayAuaWNvbiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KK30NCitkaXYuYWRtb25pdGlvbmJsb2NrIHRkLmNvbnRlbnQgew0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCit9DQorDQorZGl2LmV4YW1wbGVibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCisgIHBhZGRpbmctbGVmdDogMC41ZW07DQorfQ0KKw0KK2Rpdi5pbWFnZWJsb2NrIGRpdi5jb250ZW50IHsgcGFkZGluZy1sZWZ0OiAwOyB9DQorc3Bhbi5pbWFnZSBpbWcgeyBib3JkZXItc3R5bGU6IG5vbmU7IH0NCithLmltYWdlOnZpc2l0ZWQgeyBjb2xvcjogd2hpdGU7IH0NCisNCitkbCB7DQorICBtYXJnaW4tdG9wOiAwLjhlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuOGVtOw0KK30NCitkdCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBjb2xvcjogbmF2eTsNCit9DQorZGQgPiAqOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KK30NCisNCit1bCwgb2wgew0KKyAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOw0KK30NCitvbC5hcmFiaWMgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOw0KK30NCitvbC5sb3dlcmFscGhhIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGE7DQorfQ0KK29sLnVwcGVyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1hbHBoYTsNCit9DQorb2wubG93ZXJyb21hbiB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLXJvbWFuOw0KK30NCitvbC51cHBlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogdXBwZXItcm9tYW47DQorfQ0KKw0KK2Rpdi5jb21wYWN0IHVsLCBkaXYuY29tcGFjdCBvbCwNCitkaXYuY29tcGFjdCBwLCBkaXYuY29tcGFjdCBwLA0KK2Rpdi5jb21wYWN0IGRpdiwgZGl2LmNvbXBhY3QgZGl2IHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK3Rmb290IHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZCA+IGRpdi52ZXJzZSB7DQorICB3aGl0ZS1zcGFjZTogcHJlOw0KK30NCisNCitkaXYuaGRsaXN0IHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2Rpdi5oZGxpc3QgdHIgew0KKyAgcGFkZGluZy1ib3R0b206IDE1cHg7DQorfQ0KK2R0LmhkbGlzdDEuc3Ryb25nLCB0ZC5oZGxpc3QxLnN0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQordGQuaGRsaXN0MSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zdHlsZTogbm9ybWFsOw0KKyAgcGFkZGluZy1yaWdodDogMC44ZW07DQorICBjb2xvcjogbmF2eTsNCit9DQordGQuaGRsaXN0MiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCitkaXYuaGRsaXN0LmNvbXBhY3QgdHIgew0KKyAgbWFyZ2luOiAwOw0KKyAgcGFkZGluZy1ib3R0b206IDA7DQorfQ0KKw0KKy5jb21tZW50IHsNCisgIGJhY2tncm91bmQ6IHllbGxvdzsNCit9DQorDQorLmZvb3Rub3RlLCAuZm9vdG5vdGVyZWYgew0KKyAgZm9udC1zaXplOiAwLjhlbTsNCit9DQorDQorc3Bhbi5mb290bm90ZSwgc3Bhbi5mb290bm90ZXJlZiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7DQorfQ0KKw0KKyNmb290bm90ZXMgew0KKyAgbWFyZ2luOiAyMHB4IDAgMjBweCAwOw0KKyAgcGFkZGluZzogN3B4IDAgMCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGRpdi5mb290bm90ZSB7DQorICBtYXJnaW46IDAgMCA1cHggMDsNCit9DQorDQorI2Zvb3Rub3RlcyBociB7DQorICBib3JkZXI6IG5vbmU7DQorICBib3JkZXItdG9wOiAxcHggc29saWQgc2lsdmVyOw0KKyAgaGVpZ2h0OiAxcHg7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorICB3aWR0aDogMjAlOw0KKyAgbWluLXdpZHRoOiAxMDBweDsNCit9DQorDQorZGl2LmNvbGlzdCB0ZCB7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjNlbTsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5jb2xpc3QgdGQgaW1nIHsNCisgIG1hcmdpbi10b3A6IDAuM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgI2Zvb3Rlci1iYWRnZXMgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKyN0b2Mgew0KKyAgbWFyZ2luLWJvdHRvbTogMi41ZW07DQorfQ0KKw0KKyN0b2N0aXRsZSB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK2Rpdi50b2NsZXZlbDAsIGRpdi50b2NsZXZlbDEsIGRpdi50b2NsZXZlbDIsIGRpdi50b2NsZXZlbDMsIGRpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLXRvcDogMDsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorfQ0KK2Rpdi50b2NsZXZlbDIgew0KKyAgbWFyZ2luLWxlZnQ6IDJlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDMgew0KKyAgbWFyZ2luLWxlZnQ6IDRlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLWxlZnQ6IDZlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KKw0KK3NwYW4uYXF1YSB7IGNvbG9yOiBhcXVhOyB9DQorc3Bhbi5ibGFjayB7IGNvbG9yOiBibGFjazsgfQ0KK3NwYW4uYmx1ZSB7IGNvbG9yOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhIHsgY29sb3I6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXkgeyBjb2xvcjogZ3JheTsgfQ0KK3NwYW4uZ3JlZW4geyBjb2xvcjogZ3JlZW47IH0NCitzcGFuLmxpbWUgeyBjb2xvcjogbGltZTsgfQ0KK3NwYW4ubWFyb29uIHsgY29sb3I6IG1hcm9vbjsgfQ0KK3NwYW4ubmF2eSB7IGNvbG9yOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZSB7IGNvbG9yOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlIHsgY29sb3I6IHB1cnBsZTsgfQ0KK3NwYW4ucmVkIHsgY29sb3I6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyIHsgY29sb3I6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbCB7IGNvbG9yOiB0ZWFsOyB9DQorc3Bhbi53aGl0ZSB7IGNvbG9yOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93IHsgY29sb3I6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYXF1YS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYXF1YTsgfQ0KK3NwYW4uYmxhY2stYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsYWNrOyB9DQorc3Bhbi5ibHVlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBmdWNoc2lhOyB9DQorc3Bhbi5ncmF5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9DQorc3Bhbi5ncmVlbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZ3JlZW47IH0NCitzcGFuLmxpbWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGxpbWU7IH0NCitzcGFuLm1hcm9vbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbWFyb29uOyB9DQorc3Bhbi5uYXZ5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogb2xpdmU7IH0NCitzcGFuLnB1cnBsZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcHVycGxlOyB9DQorc3Bhbi5yZWQtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBzaWx2ZXI7IH0NCitzcGFuLnRlYWwtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHRlYWw7IH0NCitzcGFuLndoaXRlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB5ZWxsb3c7IH0NCisNCitzcGFuLmJpZyB7IGZvbnQtc2l6ZTogMmVtOyB9DQorc3Bhbi5zbWFsbCB7IGZvbnQtc2l6ZTogMC42ZW07IH0NCisNCitzcGFuLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9DQorc3Bhbi5vdmVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7IH0NCitzcGFuLmxpbmUtdGhyb3VnaCB7IHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyB9DQorDQorZGl2LnVuYnJlYWthYmxlIHsgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOyB9DQorDQorDQorLyoNCisgKiB4aHRtbDExIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2Rpdi50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGUgew0KKyAgYm9yZGVyOiAzcHggc29saWQgIzUyN2JiZDsNCit9DQordGhlYWQsIHAudGFibGUuaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGUgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQorLyogQmVjYXVzZSB0aGUgdGFibGUgZnJhbWUgYXR0cmlidXRlIGlzIG92ZXJyaWRlbiBieSBDU1MgaW4gbW9zdCBicm93c2Vycy4gKi8NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2b2lkIl0gew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJoc2lkZXMiXSB7DQorICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0idnNpZGVzIl0gew0KKyAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7DQorfQ0KKw0KKw0KKy8qDQorICogaHRtbDUgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQordGFibGUudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCit0aGVhZCwgcC50YWJsZWJsb2NrLmhlYWRlciB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjNTI3YmJkOw0KK30NCitwLnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQordGFibGUudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDNweDsNCisgIGJvcmRlci1zcGFjaW5nOiAwcHg7DQorICBib3JkZXItc3R5bGU6IHNvbGlkOw0KKyAgYm9yZGVyLWNvbG9yOiAjNTI3YmJkOw0KKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCit9DQordGgudGFibGVibG9jaywgdGQudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDFweDsNCisgIHBhZGRpbmc6IDRweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorfQ0KKw0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtdG9wYm90IHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItcmlnaHQtc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1zaWRlcyB7DQorICBib3JkZXItdG9wLXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItYm90dG9tLXN0eWxlOiBoaWRkZW47DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtbm9uZSB7DQorICBib3JkZXItc3R5bGU6IGhpZGRlbjsNCit9DQorDQordGgudGFibGVibG9jay5oYWxpZ24tbGVmdCwgdGQudGFibGVibG9jay5oYWxpZ24tbGVmdCB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCit0aC50YWJsZWJsb2NrLmhhbGlnbi1jZW50ZXIsIHRkLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciB7DQorICB0ZXh0LWFsaWduOiBjZW50ZXI7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1yaWdodCB7DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQordGgudGFibGVibG9jay52YWxpZ24tdG9wLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi10b3Agew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tbWlkZGxlLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUgew0KKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tYm90dG9tLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20gew0KKyAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsNCit9DQorDQorDQorLyoNCisgKiBtYW5wYWdlIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2JvZHkubWFucGFnZSBoMSB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQorYm9keS5tYW5wYWdlIGgyIHsNCisgIGJvcmRlci1zdHlsZTogbm9uZTsNCit9DQorYm9keS5tYW5wYWdlIGRpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgYm9keS5tYW5wYWdlIGRpdiN0b2MgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKw0KKzwvc3R5bGU+DQorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KKy8qPCFbQ0RBVEFbKi8NCit2YXIgYXNjaWlkb2MgPSB7ICAvLyBOYW1lc3BhY2UuDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gVGFibGUgT2YgQ29udGVudHMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQXV0aG9yOiBNaWhhaSBCYXpvbiwgU2VwdGVtYmVyIDIwMDINCisgKiBodHRwOi8vc3R1ZGVudHMuaW5mb2lhc2kucm8vfm1pc2hvbw0KKyAqDQorICogVGFibGUgT2YgQ29udGVudCBnZW5lcmF0b3INCisgKiBWZXJzaW9uOiAwLjQNCisgKg0KKyAqIEZlZWwgZnJlZSB0byB1c2UgdGhpcyBzY3JpcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMNCisgKiBMaWNlbnNlLCBhcyBsb25nIGFzIHlvdSBkbyBub3QgcmVtb3ZlIG9yIGFsdGVyIHRoaXMgbm90aWNlLg0KKyAqLw0KKw0KKyAvKiBtb2RpZmllZCBieSBUcm95IEQuIEhhbnNvbiwgU2VwdGVtYmVyIDIwMDYuIExpY2Vuc2U6IEdQTCAqLw0KKyAvKiBtb2RpZmllZCBieSBTdHVhcnQgUmFja2hhbSwgMjAwNiwgMjAwOS4gTGljZW5zZTogR1BMICovDQorDQorLy8gdG9jbGV2ZWxzID0gMS4uNC4NCit0b2M6IGZ1bmN0aW9uICh0b2NsZXZlbHMpIHsNCisNCisgIGZ1bmN0aW9uIGdldFRleHQoZWwpIHsNCisgICAgdmFyIHRleHQgPSAiIjsNCisgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICBpZiAoaS5ub2RlVHlwZSA9PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSAvLyBJRSBkb2Vzbid0IHNwZWFrIGNvbnN0YW50cy4NCisgICAgICAgIHRleHQgKz0gaS5kYXRhOw0KKyAgICAgIGVsc2UgaWYgKGkuZmlyc3RDaGlsZCAhPSBudWxsKQ0KKyAgICAgICAgdGV4dCArPSBnZXRUZXh0KGkpOw0KKyAgICB9DQorICAgIHJldHVybiB0ZXh0Ow0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gVG9jRW50cnkoZWwsIHRleHQsIHRvY2xldmVsKSB7DQorICAgIHRoaXMuZWxlbWVudCA9IGVsOw0KKyAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KKyAgICB0aGlzLnRvY2xldmVsID0gdG9jbGV2ZWw7DQorICB9DQorDQorICBmdW5jdGlvbiB0b2NFbnRyaWVzKGVsLCB0b2NsZXZlbHMpIHsNCisgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTsNCisgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnW2hIXShbMS0nKyh0b2NsZXZlbHMrMSkrJ10pJyk7DQorICAgIC8vIEZ1bmN0aW9uIHRoYXQgc2NhbnMgdGhlIERPTSB0cmVlIGZvciBoZWFkZXIgZWxlbWVudHMgKHRoZSBET00yDQorICAgIC8vIG5vZGVJdGVyYXRvciBBUEkgd291bGQgYmUgYSBiZXR0ZXIgdGVjaG5pcXVlIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IGFsbA0KKyAgICAvLyBicm93c2VycykuDQorICAgIHZhciBpdGVyYXRlID0gZnVuY3Rpb24gKGVsKSB7DQorICAgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICAgIGlmIChpLm5vZGVUeXBlID09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHsNCisgICAgICAgICAgdmFyIG1vID0gcmUuZXhlYyhpLnRhZ05hbWUpOw0KKyAgICAgICAgICBpZiAobW8gJiYgKGkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8IGkuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKSkgIT0gImZsb2F0Iikgew0KKyAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IG5ldyBUb2NFbnRyeShpLCBnZXRUZXh0KGkpLCBtb1sxXS0xKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpdGVyYXRlKGkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpdGVyYXRlKGVsKTsNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHZhciB0b2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9jIik7DQorICBpZiAoIXRvYykgew0KKyAgICByZXR1cm47DQorICB9DQorDQorICAvLyBEZWxldGUgZXhpc3RpbmcgVE9DIGVudHJpZXMgaW4gY2FzZSB3ZSdyZSByZWxvYWRpbmcgdGhlIFRPQy4NCisgIHZhciB0b2NFbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIHZhciBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHRvYy5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IHRvYy5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2Jw0KKyAgICAgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikubWF0Y2goL150b2NsZXZlbC8pKQ0KKyAgICAgIHRvY0VudHJpZXNUb1JlbW92ZS5wdXNoKGVudHJ5KTsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCB0b2NFbnRyaWVzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCisgICAgdG9jLnJlbW92ZUNoaWxkKHRvY0VudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIFRPQyBlbnRyaWVzLg0KKyAgdmFyIGVudHJpZXMgPSB0b2NFbnRyaWVzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50IiksIHRvY2xldmVscyk7DQorICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHsNCisgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpXTsNCisgICAgaWYgKGVudHJ5LmVsZW1lbnQuaWQgPT0gIiIpDQorICAgICAgZW50cnkuZWxlbWVudC5pZCA9ICJfdG9jXyIgKyBpOw0KKyAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsNCisgICAgYS5ocmVmID0gIiMiICsgZW50cnkuZWxlbWVudC5pZDsNCisgICAgYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbnRyeS50ZXh0KSk7DQorICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCisgICAgZGl2LmFwcGVuZENoaWxkKGEpOw0KKyAgICBkaXYuY2xhc3NOYW1lID0gInRvY2xldmVsIiArIGVudHJ5LnRvY2xldmVsOw0KKyAgICB0b2MuYXBwZW5kQ2hpbGQoZGl2KTsNCisgIH0NCisgIGlmIChlbnRyaWVzLmxlbmd0aCA9PSAwKQ0KKyAgICB0b2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b2MpOw0KK30sDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gRm9vdG5vdGVzIGdlbmVyYXRvcg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qIEJhc2VkIG9uIGZvb3Rub3RlIGdlbmVyYXRpb24gY29kZSBmcm9tOg0KKyAqIGh0dHA6Ly93d3cuYnJhbmRzcGFua2luZ25ldy5uZXQvYXJjaGl2ZS8yMDA1LzA3L2Zvcm1hdF9mb290bm90ZS5odG1sDQorICovDQorDQorZm9vdG5vdGVzOiBmdW5jdGlvbiAoKSB7DQorICAvLyBEZWxldGUgZXhpc3RpbmcgZm9vdG5vdGUgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgZm9vdG5vZGVzLg0KKyAgdmFyIGk7DQorICB2YXIgbm90ZWhvbGRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb290bm90ZXMiKTsNCisgIGlmICghbm90ZWhvbGRlcikgew0KKyAgICByZXR1cm47DQorICB9DQorICB2YXIgZW50cmllc1RvUmVtb3ZlID0gW107DQorICBmb3IgKGkgPSAwOyBpIDwgbm90ZWhvbGRlci5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IG5vdGVob2xkZXIuY2hpbGROb2Rlc1tpXTsNCisgICAgaWYgKGVudHJ5Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2RpdicgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpID09ICJmb290bm90ZSIpDQorICAgICAgZW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IGVudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICBub3RlaG9sZGVyLnJlbW92ZUNoaWxkKGVudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIGZvb3Rub3RlIGVudHJpZXMuDQorICB2YXIgY29udCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50Iik7DQorICB2YXIgc3BhbnMgPSBjb250LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQorICB2YXIgcmVmcyA9IHt9Ow0KKyAgdmFyIG4gPSAwOw0KKyAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGUiKSB7DQorICAgICAgbisrOw0KKyAgICAgIHZhciBub3RlID0gc3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiKTsNCisgICAgICBpZiAoIW5vdGUpIHsNCisgICAgICAgIC8vIFVzZSBbXHNcU10gaW4gcGxhY2Ugb2YgLiBzbyBtdWx0aS1saW5lIG1hdGNoZXMgd29yay4NCisgICAgICAgIC8vIEJlY2F1c2UgSmF2YVNjcmlwdCBoYXMgbm8gcyAoZG90YWxsKSByZWdleCBmbGFnLg0KKyAgICAgICAgbm90ZSA9IHNwYW5zW2ldLmlubmVySFRNTC5tYXRjaCgvXHMqXFsoW1xzXFNdKildXHMqLylbMV07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGlkPSdfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgICAgc3BhbnNbaV0uc2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiLCBub3RlKTsNCisgICAgICB9DQorICAgICAgbm90ZWhvbGRlci5pbm5lckhUTUwgKz0NCisgICAgICAgICI8ZGl2IGNsYXNzPSdmb290bm90ZScgaWQ9J19mb290bm90ZV8iICsgbiArICInPiIgKw0KKyAgICAgICAgIjxhIGhyZWY9JyNfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyB0aXRsZT0nUmV0dXJuIHRvIHRleHQnPiIgKw0KKyAgICAgICAgbiArICI8L2E+LiAiICsgbm90ZSArICI8L2Rpdj4iOw0KKyAgICAgIHZhciBpZCA9c3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOw0KKyAgICAgIGlmIChpZCAhPSBudWxsKSByZWZzWyIjIitpZF0gPSBuOw0KKyAgICB9DQorICB9DQorICBpZiAobiA9PSAwKQ0KKyAgICBub3RlaG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm90ZWhvbGRlcik7DQorICBlbHNlIHsNCisgICAgLy8gUHJvY2VzcyBmb290bm90ZXJlZnMuDQorICAgIGZvciAoaT0wOyBpPHNwYW5zLmxlbmd0aDsgaSsrKSB7DQorICAgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGVyZWYiKSB7DQorICAgICAgICB2YXIgaHJlZiA9IHNwYW5zW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0uZ2V0QXR0cmlidXRlKCJocmVmIik7DQorICAgICAgICBocmVmID0gaHJlZi5tYXRjaCgvIy4qLylbMF07ICAvLyBCZWNhdXNlIElFIHJldHVybiBmdWxsIFVSTC4NCisgICAgICAgIG4gPSByZWZzW2hyZWZdOw0KKyAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0NCisgICAgICAgICAgIls8YSBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30sDQorDQoraW5zdGFsbDogZnVuY3Rpb24odG9jbGV2ZWxzKSB7DQorICB2YXIgdGltZXJJZDsNCisNCisgIGZ1bmN0aW9uIHJlaW5zdGFsbCgpIHsNCisgICAgYXNjaWlkb2MuZm9vdG5vdGVzKCk7DQorICAgIGlmICh0b2NsZXZlbHMpIHsNCisgICAgICBhc2NpaWRvYy50b2ModG9jbGV2ZWxzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIoKSB7DQorICAgIGNsZWFySW50ZXJ2YWwodGltZXJJZCk7DQorICAgIHJlaW5zdGFsbCgpOw0KKyAgfQ0KKw0KKyAgdGltZXJJZCA9IHNldEludGVydmFsKHJlaW5zdGFsbCwgNTAwKTsNCisgIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKQ0KKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIsIGZhbHNlKTsNCisgIGVsc2UNCisgICAgd2luZG93Lm9ubG9hZCA9IHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyOw0KK30NCisNCit9DQorYXNjaWlkb2MuaW5zdGFsbCgpOw0KKy8qXV0+Ki8NCis8L3NjcmlwdD4NCis8L2hlYWQ+DQorPGJvZHkgY2xhc3M9Im1hbnBhZ2UiPg0KKzxkaXYgaWQ9ImhlYWRlciI+DQorPGgxPg0KK2lzb2xpbnV4KDEpIE1hbnVhbCBQYWdlDQorPC9oMT4NCis8aDI+TkFNRTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxwPmlzb2xpbnV4IC0NCisgICBUaGUgU3lzbGludXggZGVyaXZhdGl2ZSBJU09MSU5VWCBmb3IgSVNPOTY2MCBDRC9EVkQgbWVkaWENCis8L3A+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBpZD0iY29udGVudCI+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX3N5bm9wc2lzIj5TWU5PUFNJUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InZlcnNlYmxvY2siPg0KKzxwcmUgY2xhc3M9ImNvbnRlbnQiPjxzdHJvbmc+bWtpc29mczwvc3Ryb25nPiAtbyA8ZW0+aXNvaW1hZ2U8L2VtPiBcDQorICAgICAgICAtYiA8ZW0+aXNvbGludXgvaXNvbGludXguYmluPC9lbT4gLWMgPGVtPmlzb2xpbnV4L2Jvb3QuY2F0PC9lbT4gXA0KKyAgICAgICAgLW5vLWVtdWwtYm9vdCAtYm9vdC1sb2FkLXNpemUgNCAtYm9vdC1pbmZvLXRhYmxlIFwNCisgICAgICAgIDxlbT5yb290LW9mLWlzby10cmVlPC9lbT48L3ByZT4NCis8ZGl2IGNsYXNzPSJhdHRyaWJ1dGlvbiI+DQorPC9kaXY+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2Rlc2NyaXB0aW9uIj5ERVNDUklQVElPTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNPTElOVVggaXMgYSBib290IGxvYWRlciBmb3IgTGludXgvaTM4NiB0aGF0IG9wZXJhdGVzIG9mZiBJU08gOTY2MC9FbA0KK1Rvcml0byBDRC1ST01zIGluICJubyBlbXVsYXRpb24iIG1vZGUuICBUaGlzIGF2b2lkcyB0aGUgbmVlZCB0byBjcmVhdGUNCithbiAiZW11bGF0aW9uIGRpc2sgaW1hZ2UiIHdpdGggbGltaXRlZCBzcGFjZSAoZm9yICJmbG9wcHkgZW11bGF0aW9uIikNCitvciBjb21wYXRpYmlsaXR5IHByb2JsZW1zIChmb3IgImhhcmQgZGlzayBlbXVsYXRpb24iLik8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UbyBjcmVhdGUgYW4gaW1hZ2UsIGNyZWF0ZSBhIGRpcmVjdG9yeSBjYWxsZWQgImlzb2xpbnV4LyIgKG9yLCBpZiB5b3UNCitwcmVmZXIsICJib290L2lzb2xpbnV4LyIpIHVuZGVybmVhdGggdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHlvdXIgSVNPIGltYWdlDQorbWFzdGVyIGZpbGUgdHJlZS4gIENvcHkgaXNvbGludXguYmluLCBhIGNvbmZpZyBmaWxlIGNhbGxlZA0KKyJpc29saW51eC5jZmciIChzZWUgPHN0cm9uZz5zeXNsaW51eC5jZmc8L3N0cm9uZz4oNSkgZm9yIGRldGFpbHMgb24gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSksDQorYW5kIGFsbCBuZWNlc3NhcnkgZmlsZXMgKGtlcm5lbHMsIGluaXRyZCwgZGlzcGxheSBmaWxlcywgZXRjLikgaW50byB0aGlzDQorZGlyZWN0b3J5LCB0aGVuIHVzZSB0aGUgYWJvdmUgY29tbWFuZCB0byBjcmVhdGUgeW91ciBJU08gaW1hZ2UgKGFkZA0KK2FkZGl0aW9uYWwgb3B0aW9ucyBhcyBhcHByb3ByaWF0ZSwgc3VjaCBhcyAtSiBvciAtUikuICBJZiB5b3UgbmFtZWQgdGhlDQorZGlyZWN0b3J5IGJvb3QvaXNvbGludXggdGhhdCBzaG91bGQgb2YgY291cnNlIGJlPGJyIC8+DQorICAgICAgICAtYiBib290L2lzb2xpbnV4L2lzb2xpbnV4LmJpbiAtYyBib290L2lzb2xpbnV4L2Jvb3QuY2F0LjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfY29uZmlnX2ZpbGVfZGlyZWN0b3J5Ij5DT05GSUcgRklMRSBESVJFQ1RPUlk8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklTT0xJTlVYIHdpbGwgc2VhcmNoIGZvciB0aGUgY29uZmlnIGZpbGUgZGlyZWN0b3J5IGluIHRoZSBvcmRlcg0KKy9ib290L2lzb2xpbnV4LCAvaXNvbGludXgsIC8uICBUaGUgZmlyc3QgZGlyZWN0b3J5IHRoYXQgZXhpc3RzIGlzDQordXNlZCwgZXZlbiBpZiBpdCBjb250YWlucyBubyBmaWxlcy4gIFRoZXJlZm9yZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0DQordGhlc2UgZGlyZWN0b3JpZXMgZG9uJiM4MjE3O3QgZXhpc3QgaWYgeW91IGRvbiYjODIxNzt0IHdhbnQgSVNPTElOVVggdG8gdXNlIHRoZW0uPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9oeWJyaWRfY2Rfcm9tX2hhcmRfZGlza19tb2RlIj5IWUJSSUQgQ0QtUk9NL0hBUkQgRElTSyBNT0RFPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5TdGFydGluZyBpbiB2ZXJzaW9uIDMuNzIsIElTT0xJTlVYIHN1cHBvcnRzIGEgImh5YnJpZCBtb2RlIiB3aGljaCBjYW4NCitiZSBib290ZWQgZnJvbSBlaXRoZXIgQ0QtUk9NIG9yIGZyb20gYSBkZXZpY2Ugd2hpY2ggQklPUyBjb25zaWRlcnMgYQ0KK2hhcmQgZGlzayBvciBaSVAgZGlzaywgZS5nLiBhIFVTQiBrZXkgb3Igc2ltaWxhci48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UbyBlbmFibGUgdGhpcyBtb2RlLCB0aGUgLmlzbyBpbWFnZSBzaG91bGQgYmUgcG9zdHByb2Nlc3NlZCB3aXRoIHRoZQ0KKyJpc29oeWJyaWQiIHNjcmlwdCBmcm9tIHRoZSB1dGlscyBkaXJlY3Rvcnk6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5pc29oeWJyaWQgZmlsZW5hbWUuaXNvPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhpcyBzY3JpcHQgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYmUgYWJsZSB0bw0KK2Jvb3QgaW4gaHlicmlkIG1vZGUuICBJdCBhbHNvIHBhZHMgb3V0IHRoZSBpbWFnZSB0byBhbiBldmVuIG11bHRpcGxlDQorb2YgMSBNQi48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIGltYWdlIGNhbiB0aGVuIGJlIGNvcGllZCB1c2luZyBhbnkgcmF3IGRpc2sgd3JpdGluZyB0b29sIChvbiBVbml4DQorc3lzdGVtcywgdHlwaWNhbGx5ICJkZCIgb3IgImNhdCIpIHRvIGEgVVNCIGRpc2ssIG9yIHdyaXR0ZW4gdG8gYQ0KK0NELVJPTSB1c2luZyBzdGFuZGFyZCBDRCBidXJuaW5nIHRvb2xzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSBJU08gOTY2MCBmaWxlc3lzdGVtIGlzIGVuY2Fwc3VsYXRlZCBpbiBhIHBhcnRpdGlvbiAod2hpY2ggc3RhcnRzDQorYXQgb2Zmc2V0IHplcm8sIHdoaWNoIG1heSBjb25mdXNlIHNvbWUgc3lzdGVtcy4pICBUaGlzIG1ha2VzIGl0DQorcG9zc2libGUgZm9yIHRoZSBvcGVyYXRpbmcgc3lzdGVtLCBvbmNlIGJvb3RlZCwgdG8gdXNlIHRoZSByZW1haW5kZXINCitvZiB0aGUgZGV2aWNlIGZvciBwZXJzaXN0ZW50IHN0b3JhZ2UgYnkgY3JlYXRpbmcgYSBzZWNvbmQgcGFydGl0aW9uLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfbWlzY2VsbGFuZW91cyI+TUlTQ0VMTEFORU9VUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+TWFrZSBzdXJlIHlvdSBoYXZlIGEgcmVjZW50IGVub3VnaCB2ZXJzaW9uIG9mIG1raXNvZnMuICBJIHJlY29tbWVuZA0KK21raXNvZnMgMS4xMyAoZGlzdHJpYnV0ZWQgd2l0aCBjZHJlY29yZCAxLjkpLCBidXQgMS4xMiBtaWdodCB3b3JrIGFzDQord2VsbCAobm90IHRlc3RlZC4pPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNPTElOVVggcmVzb2x2ZXMgcGF0aG5hbWVzIHRoZSBmb2xsb3dpbmcgd2F5OjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJ1bGlzdCI+PHVsPg0KKzxsaT4NCis8cD4NCitBIHBhdGhuYW1lIGNvbnNpc3RzIG9mIG5hbWVzIHNlcGFyYXRlZCBieSBzbGFzaGVzLCBVbml4LXN0eWxlLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitBIGxlYWRpbmcgLyBtZWFucyBpdCBzZWFyY2hlcyBmcm9tIHRoZSByb290IGRpcmVjdG9yeTsgb3RoZXJ3aXNlIHRoZQ0KKyAgc2VhcmNoIGlzIGZyb20gdGhlIGlzb2xpbnV4IGRpcmVjdG9yeSAodGhpbmsgb2YgdGhpcyBhcyB0aGUgImN1cnJlbnQNCisgIGRpcmVjdG9yeSIuKQ0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCisuIGFuZCAuLiBpbiBwYXRobmFtZSBzZWFyY2hlcyBhcmUgbm90IHN1cHBvcnRlZC4NCis8L3A+DQorPC9saT4NCis8bGk+DQorPHA+DQorVGhlIG1heGltdW0gbGVuZ3RoIG9mIGFueSBwYXRobmFtZSBpcyAyNTUgY2hhcmFjdGVycy4NCis8L3A+DQorPC9saT4NCis8L3VsPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Tm90ZSB0aGF0IElTT0xJTlVYIG9ubHkgdXNlcyB0aGUgInBsYWluIiBJU08gOTY2MCBmaWxlbmFtZXMsIGkuZS4gaXQNCitkb2VzIG5vdCBzdXBwb3J0IFJvY2sgUmlkZ2Ugb3IgSm9saWV0IGZpbGVuYW1lcy4gIEl0IGNhbiBzdGlsbCBiZSB1c2VkDQorb24gYSBkaXNrIHdoaWNoIHVzZXMgUm9jayBSaWRnZSBhbmQvb3IgSm9saWV0IGV4dGVuc2lvbnMsIG9mIGNvdXJzZS4NCitVbmRlciBMaW51eCwgeW91IGNhbiB2ZXJpZnkgdGhlIHBsYWluIGZpbGVuYW1lcyBieSBtb3VudGluZyB3aXRoIHRoZQ0KKyItbyBub3JvY2ssbm9qb2xpZXQiIG9wdGlvbiB0byB0aGUgbW91bnQgY29tbWFuZC4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQNCitJU09MSU5VWCBkb2VzIHN1cHBvcnQgImxvbmciIChsZXZlbCAyKSBJU08gOTY2MCBwbGFpbiBmaWxlbmFtZXMsIHNvIGlmDQorY29tcGF0aWJpbGl0eSB3aXRoIHNob3J0LW5hbWVzLW9ubHkgb3BlcmF0aW5nIHN5c3RlbXMgbGlrZSBNUy1ET1MgaXMNCitub3QgYW4gaXNzdWUsIHlvdSBjYW4gdXNlIHRoZSAiLWwiIG9yICItaXNvLWxldmVsIDIiIG9wdGlvbiB0byBta2lzb2ZzDQordG8gZ2VuZXJhdGUgbG9uZyAodXAgdG8gMzEgY2hhcmFjdGVycykgcGxhaW4gZmlsZW5hbWVzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklTT0xJTlVYIGRvZXMgbm90IHN1cHBvcnQgZGlzY29udGlndW91cyBmaWxlcywgaW50ZXJsZWF2ZWQgbW9kZSwgb3INCitsb2dpY2FsIGJsb2NrIGFuZCBzZWN0b3Igc2l6ZXMgb3RoZXIgdGhhbiAyMDQ4LiAgVGhpcyBzaG91bGQgbm9ybWFsbHkNCitub3QgYmUgYSBwcm9ibGVtLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklTT0xJTlVYIGlzIGJ5IGRlZmF1bHQgYnVpbHQgaW4gdHdvIHZlcnNpb25zLCBvbmUgdmVyc2lvbiB3aXRoIGV4dHJhDQorZGVidWdnaW5nIG1lc3NhZ2VzIGVuYWJsZWQuICBJZiB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3aXRoIElTT0xJTlVYLA0KK0kgd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGlmIHlvdSBjb3VsZCB0cnkgb3V0IHRoZSBkZWJ1Z2dpbmcgdmVyc2lvbg0KKyhpc29saW51eC1kZWJ1Zy5iaW4pIGFuZCBsZXQgbWUga25vdyB3aGF0IGl0IHJlcG9ydHMuICBUaGUgZGVidWdnaW5nDQordmVyc2lvbiBkb2VzIG5vdCBpbmNsdWRlIGh5YnJpZCBtb2RlIHN1cHBvcnQgKHNlZSBiZWxvdy4pPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9zZWVfYWxzbyI+U0VFIEFMU088L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+c3lzbGludXguY2ZnPC9zdHJvbmc+KDUpLCA8c3Ryb25nPnN5c2xpbnV4LWNsaTwvc3Ryb25nPigxKSwgPHN0cm9uZz5saWxvPC9zdHJvbmc+KDgpLCA8c3Ryb25nPmtleXRhYi1saWxvLnBsPC9zdHJvbmc+KDgpLA0KKzxzdHJvbmc+ZmRpc2s8L3N0cm9uZz4oOCksIDxzdHJvbmc+bWtmczwvc3Ryb25nPig4KSwgPHN0cm9uZz5zdXBlcmZvcm1hdDwvc3Ryb25nPigxKS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2F1dGhvciI+QVVUSE9SPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIEFzY2lpRG9jIGRlcml2ZWQgZG9jdW1lbnQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbA0KKzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gZG9jdW1lbnRhdGlvbiBieSBILiBQZXRlciBBbnZpbiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmhwYUB6eXRvci5jb20iPmhwYUB6eXRvci5jb208L2E+Jmd0Oy4gIFRoZSBjb252ZXJzaW9uDQordG8gYW4gQXNjaWlEb2Mgd2FzIG1hZGUgYnkgR2VuZSBDdW1tICZsdDs8YSBocmVmPSJtYWlsdG86Z2VuZS5jdW1tQGdtYWlsLmNvbSI+Z2VuZS5jdW1tQGdtYWlsLmNvbTwvYT4mZ3Q7PC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3Rub3RlcyI+PGhyIC8+PC9kaXY+DQorPGRpdiBpZD0iZm9vdGVyIj4NCis8ZGl2IGlkPSJmb290ZXItdGV4dCI+DQorTGFzdCB1cGRhdGVkIDIwMTQtMDEtMTcgMTY6MDk6NTYgUFNUDQorPC9kaXY+DQorPC9kaXY+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9lZmkzMi90eHQvaHRtbC9weGVsaW51eC5odG1sIGIvZWZpMzIvdHh0L2h0bWwvcHhlbGludXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQ5YzUxCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvdHh0L2h0bWwvcHhlbGludXguaHRtbApAQCAtMCwwICsxLDEzMTEgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiINCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCis8aGVhZD4NCis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9ImFwcGxpY2F0aW9uL3hodG1sK3htbDsgY2hhcnNldD1VVEYtOCIgLz4NCis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkFzY2lpRG9jIDguNi44IiAvPg0KKzx0aXRsZT5weGVsaW51eCgxKTwvdGl0bGU+DQorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCisvKiBTaGFyZWQgQ1NTIGZvciBBc2NpaURvYyB4aHRtbDExIGFuZCBodG1sNSBiYWNrZW5kcyAqLw0KKw0KKy8qIERlZmF1bHQgZm9udC4gKi8NCitib2R5IHsNCisgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLHNlcmlmOw0KK30NCisNCisvKiBUaXRsZSBmb250LiAqLw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlLA0KK3RoZWFkLCBwLnRhYmxlLmhlYWRlciwNCisjdG9jdGl0bGUsDQorI2F1dGhvciwgI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmssDQorI2Zvb3RlciB7DQorICBmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7DQorfQ0KKw0KK2JvZHkgew0KKyAgbWFyZ2luOiAxZW0gNSUgMWVtIDUlOw0KK30NCisNCithIHsNCisgIGNvbG9yOiBibHVlOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorfQ0KK2E6dmlzaXRlZCB7DQorICBjb2xvcjogZnVjaHNpYTsNCit9DQorDQorZW0gew0KKyAgZm9udC1zdHlsZTogaXRhbGljOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KKw0KK3N0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjMDgzMTk0Ow0KK30NCisNCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgbWFyZ2luLXRvcDogMS4yZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCisgIGxpbmUtaGVpZ2h0OiAxLjM7DQorfQ0KKw0KK2gxLCBoMiwgaDMgew0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQoraDIgew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KK30NCitoMyB7DQorICBmbG9hdDogbGVmdDsNCit9DQoraDMgKyAqIHsNCisgIGNsZWFyOiBsZWZ0Ow0KK30NCitoNSB7DQorICBmb250LXNpemU6IDEuMGVtOw0KK30NCisNCitkaXYuc2VjdGlvbmJvZHkgew0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorfQ0KKw0KK2hyIHsNCisgIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjsNCit9DQorDQorcCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCisNCit1bCwgb2wsIGxpID4gcCB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit1bCA+IGxpICAgICB7IGNvbG9yOiAjYWFhOyB9DQordWwgPiBsaSA+ICogeyBjb2xvcjogYmxhY2s7IH0NCisNCisubW9ub3NwYWNlZCwgY29kZSwgcHJlIHsNCisgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7DQorICBmb250LXNpemU6IGluaGVyaXQ7DQorICBjb2xvcjogbmF2eTsNCisgIHBhZGRpbmc6IDA7DQorICBtYXJnaW46IDA7DQorfQ0KKw0KKw0KKyNhdXRob3Igew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorfQ0KKyNlbWFpbCB7DQorfQ0KKyNyZXZudW1iZXIsICNyZXZkYXRlLCAjcmV2cmVtYXJrIHsNCit9DQorDQorI2Zvb3RlciB7DQorICBmb250LXNpemU6IHNtYWxsOw0KKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIG1hcmdpbi10b3A6IDQuMGVtOw0KK30NCisjZm9vdGVyLXRleHQgew0KKyAgZmxvYXQ6IGxlZnQ7DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorfQ0KKyNmb290ZXItYmFkZ2VzIHsNCisgIGZsb2F0OiByaWdodDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorDQorI3ByZWFtYmxlIHsNCisgIG1hcmdpbi10b3A6IDEuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5pbWFnZWJsb2NrLCBkaXYuZXhhbXBsZWJsb2NrLCBkaXYudmVyc2VibG9jaywNCitkaXYucXVvdGVibG9jaywgZGl2LmxpdGVyYWxibG9jaywgZGl2Lmxpc3RpbmdibG9jaywgZGl2LnNpZGViYXJibG9jaywNCitkaXYuYWRtb25pdGlvbmJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMi4wZW07DQorICBtYXJnaW4tYm90dG9tOiAyLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgY29sb3I6ICM2MDYwNjA7DQorfQ0KKw0KK2Rpdi5jb250ZW50IHsgLyogQmxvY2sgZWxlbWVudCBjb250ZW50LiAqLw0KKyAgcGFkZGluZzogMDsNCit9DQorDQorLyogQmxvY2sgZWxlbWVudCB0aXRsZXMuICovDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCit9DQorZGl2LnRpdGxlICsgKiB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisNCit0ZCBkaXYudGl0bGU6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KK2Rpdi5jb250ZW50IGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgKyBkaXYudGl0bGUgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KKw0KK2Rpdi5zaWRlYmFyYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBiYWNrZ3JvdW5kOiAjZmZmZmVlOw0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgI2YwZjBmMDsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYubGlzdGluZ2Jsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGJhY2tncm91bmQ6ICNmOGY4Zjg7DQorICBwYWRkaW5nOiAwLjVlbTsNCit9DQorDQorZGl2LnF1b3RlYmxvY2ssIGRpdi52ZXJzZWJsb2NrIHsNCisgIHBhZGRpbmctbGVmdDogMS4wZW07DQorICBtYXJnaW4tbGVmdDogMS4wZW07DQorICBtYXJnaW4tcmlnaHQ6IDEwJTsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGNvbG9yOiAjODg4Ow0KK30NCisNCitkaXYucXVvdGVibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQorZGl2LnZlcnNlYmxvY2sgPiBwcmUuY29udGVudCB7DQorICBmb250LWZhbWlseTogaW5oZXJpdDsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCit9DQorZGl2LnZlcnNlYmxvY2sgPiBkaXYuYXR0cmlidXRpb24gew0KKyAgcGFkZGluZy10b3A6IDAuNzVlbTsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KKy8qIERFUFJFQ0FURUQ6IFByZSB2ZXJzaW9uIDguMi43IHZlcnNlIHN0eWxlIGxpdGVyYWwgYmxvY2suICovDQorZGl2LnZlcnNlYmxvY2sgKyBkaXYuYXR0cmlidXRpb24gew0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorDQorZGl2LmFkbW9uaXRpb25ibG9jayAuaWNvbiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KK30NCitkaXYuYWRtb25pdGlvbmJsb2NrIHRkLmNvbnRlbnQgew0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCit9DQorDQorZGl2LmV4YW1wbGVibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCisgIHBhZGRpbmctbGVmdDogMC41ZW07DQorfQ0KKw0KK2Rpdi5pbWFnZWJsb2NrIGRpdi5jb250ZW50IHsgcGFkZGluZy1sZWZ0OiAwOyB9DQorc3Bhbi5pbWFnZSBpbWcgeyBib3JkZXItc3R5bGU6IG5vbmU7IH0NCithLmltYWdlOnZpc2l0ZWQgeyBjb2xvcjogd2hpdGU7IH0NCisNCitkbCB7DQorICBtYXJnaW4tdG9wOiAwLjhlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuOGVtOw0KK30NCitkdCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBjb2xvcjogbmF2eTsNCit9DQorZGQgPiAqOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KK30NCisNCit1bCwgb2wgew0KKyAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOw0KK30NCitvbC5hcmFiaWMgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOw0KK30NCitvbC5sb3dlcmFscGhhIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGE7DQorfQ0KK29sLnVwcGVyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1hbHBoYTsNCit9DQorb2wubG93ZXJyb21hbiB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLXJvbWFuOw0KK30NCitvbC51cHBlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogdXBwZXItcm9tYW47DQorfQ0KKw0KK2Rpdi5jb21wYWN0IHVsLCBkaXYuY29tcGFjdCBvbCwNCitkaXYuY29tcGFjdCBwLCBkaXYuY29tcGFjdCBwLA0KK2Rpdi5jb21wYWN0IGRpdiwgZGl2LmNvbXBhY3QgZGl2IHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK3Rmb290IHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZCA+IGRpdi52ZXJzZSB7DQorICB3aGl0ZS1zcGFjZTogcHJlOw0KK30NCisNCitkaXYuaGRsaXN0IHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2Rpdi5oZGxpc3QgdHIgew0KKyAgcGFkZGluZy1ib3R0b206IDE1cHg7DQorfQ0KK2R0LmhkbGlzdDEuc3Ryb25nLCB0ZC5oZGxpc3QxLnN0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQordGQuaGRsaXN0MSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zdHlsZTogbm9ybWFsOw0KKyAgcGFkZGluZy1yaWdodDogMC44ZW07DQorICBjb2xvcjogbmF2eTsNCit9DQordGQuaGRsaXN0MiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCitkaXYuaGRsaXN0LmNvbXBhY3QgdHIgew0KKyAgbWFyZ2luOiAwOw0KKyAgcGFkZGluZy1ib3R0b206IDA7DQorfQ0KKw0KKy5jb21tZW50IHsNCisgIGJhY2tncm91bmQ6IHllbGxvdzsNCit9DQorDQorLmZvb3Rub3RlLCAuZm9vdG5vdGVyZWYgew0KKyAgZm9udC1zaXplOiAwLjhlbTsNCit9DQorDQorc3Bhbi5mb290bm90ZSwgc3Bhbi5mb290bm90ZXJlZiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7DQorfQ0KKw0KKyNmb290bm90ZXMgew0KKyAgbWFyZ2luOiAyMHB4IDAgMjBweCAwOw0KKyAgcGFkZGluZzogN3B4IDAgMCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGRpdi5mb290bm90ZSB7DQorICBtYXJnaW46IDAgMCA1cHggMDsNCit9DQorDQorI2Zvb3Rub3RlcyBociB7DQorICBib3JkZXI6IG5vbmU7DQorICBib3JkZXItdG9wOiAxcHggc29saWQgc2lsdmVyOw0KKyAgaGVpZ2h0OiAxcHg7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorICB3aWR0aDogMjAlOw0KKyAgbWluLXdpZHRoOiAxMDBweDsNCit9DQorDQorZGl2LmNvbGlzdCB0ZCB7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjNlbTsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5jb2xpc3QgdGQgaW1nIHsNCisgIG1hcmdpbi10b3A6IDAuM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgI2Zvb3Rlci1iYWRnZXMgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKyN0b2Mgew0KKyAgbWFyZ2luLWJvdHRvbTogMi41ZW07DQorfQ0KKw0KKyN0b2N0aXRsZSB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK2Rpdi50b2NsZXZlbDAsIGRpdi50b2NsZXZlbDEsIGRpdi50b2NsZXZlbDIsIGRpdi50b2NsZXZlbDMsIGRpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLXRvcDogMDsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorfQ0KK2Rpdi50b2NsZXZlbDIgew0KKyAgbWFyZ2luLWxlZnQ6IDJlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDMgew0KKyAgbWFyZ2luLWxlZnQ6IDRlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLWxlZnQ6IDZlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KKw0KK3NwYW4uYXF1YSB7IGNvbG9yOiBhcXVhOyB9DQorc3Bhbi5ibGFjayB7IGNvbG9yOiBibGFjazsgfQ0KK3NwYW4uYmx1ZSB7IGNvbG9yOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhIHsgY29sb3I6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXkgeyBjb2xvcjogZ3JheTsgfQ0KK3NwYW4uZ3JlZW4geyBjb2xvcjogZ3JlZW47IH0NCitzcGFuLmxpbWUgeyBjb2xvcjogbGltZTsgfQ0KK3NwYW4ubWFyb29uIHsgY29sb3I6IG1hcm9vbjsgfQ0KK3NwYW4ubmF2eSB7IGNvbG9yOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZSB7IGNvbG9yOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlIHsgY29sb3I6IHB1cnBsZTsgfQ0KK3NwYW4ucmVkIHsgY29sb3I6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyIHsgY29sb3I6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbCB7IGNvbG9yOiB0ZWFsOyB9DQorc3Bhbi53aGl0ZSB7IGNvbG9yOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93IHsgY29sb3I6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYXF1YS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYXF1YTsgfQ0KK3NwYW4uYmxhY2stYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsYWNrOyB9DQorc3Bhbi5ibHVlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBmdWNoc2lhOyB9DQorc3Bhbi5ncmF5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9DQorc3Bhbi5ncmVlbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZ3JlZW47IH0NCitzcGFuLmxpbWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGxpbWU7IH0NCitzcGFuLm1hcm9vbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbWFyb29uOyB9DQorc3Bhbi5uYXZ5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogb2xpdmU7IH0NCitzcGFuLnB1cnBsZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcHVycGxlOyB9DQorc3Bhbi5yZWQtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBzaWx2ZXI7IH0NCitzcGFuLnRlYWwtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHRlYWw7IH0NCitzcGFuLndoaXRlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB5ZWxsb3c7IH0NCisNCitzcGFuLmJpZyB7IGZvbnQtc2l6ZTogMmVtOyB9DQorc3Bhbi5zbWFsbCB7IGZvbnQtc2l6ZTogMC42ZW07IH0NCisNCitzcGFuLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9DQorc3Bhbi5vdmVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7IH0NCitzcGFuLmxpbmUtdGhyb3VnaCB7IHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyB9DQorDQorZGl2LnVuYnJlYWthYmxlIHsgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOyB9DQorDQorDQorLyoNCisgKiB4aHRtbDExIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2Rpdi50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGUgew0KKyAgYm9yZGVyOiAzcHggc29saWQgIzUyN2JiZDsNCit9DQordGhlYWQsIHAudGFibGUuaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGUgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQorLyogQmVjYXVzZSB0aGUgdGFibGUgZnJhbWUgYXR0cmlidXRlIGlzIG92ZXJyaWRlbiBieSBDU1MgaW4gbW9zdCBicm93c2Vycy4gKi8NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2b2lkIl0gew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJoc2lkZXMiXSB7DQorICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0idnNpZGVzIl0gew0KKyAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7DQorfQ0KKw0KKw0KKy8qDQorICogaHRtbDUgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQordGFibGUudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCit0aGVhZCwgcC50YWJsZWJsb2NrLmhlYWRlciB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjNTI3YmJkOw0KK30NCitwLnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQordGFibGUudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDNweDsNCisgIGJvcmRlci1zcGFjaW5nOiAwcHg7DQorICBib3JkZXItc3R5bGU6IHNvbGlkOw0KKyAgYm9yZGVyLWNvbG9yOiAjNTI3YmJkOw0KKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCit9DQordGgudGFibGVibG9jaywgdGQudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDFweDsNCisgIHBhZGRpbmc6IDRweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorfQ0KKw0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtdG9wYm90IHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItcmlnaHQtc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1zaWRlcyB7DQorICBib3JkZXItdG9wLXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItYm90dG9tLXN0eWxlOiBoaWRkZW47DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtbm9uZSB7DQorICBib3JkZXItc3R5bGU6IGhpZGRlbjsNCit9DQorDQordGgudGFibGVibG9jay5oYWxpZ24tbGVmdCwgdGQudGFibGVibG9jay5oYWxpZ24tbGVmdCB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCit0aC50YWJsZWJsb2NrLmhhbGlnbi1jZW50ZXIsIHRkLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciB7DQorICB0ZXh0LWFsaWduOiBjZW50ZXI7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1yaWdodCB7DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQordGgudGFibGVibG9jay52YWxpZ24tdG9wLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi10b3Agew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tbWlkZGxlLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUgew0KKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tYm90dG9tLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20gew0KKyAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsNCit9DQorDQorDQorLyoNCisgKiBtYW5wYWdlIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2JvZHkubWFucGFnZSBoMSB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQorYm9keS5tYW5wYWdlIGgyIHsNCisgIGJvcmRlci1zdHlsZTogbm9uZTsNCit9DQorYm9keS5tYW5wYWdlIGRpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgYm9keS5tYW5wYWdlIGRpdiN0b2MgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKw0KKzwvc3R5bGU+DQorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KKy8qPCFbQ0RBVEFbKi8NCit2YXIgYXNjaWlkb2MgPSB7ICAvLyBOYW1lc3BhY2UuDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gVGFibGUgT2YgQ29udGVudHMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQXV0aG9yOiBNaWhhaSBCYXpvbiwgU2VwdGVtYmVyIDIwMDINCisgKiBodHRwOi8vc3R1ZGVudHMuaW5mb2lhc2kucm8vfm1pc2hvbw0KKyAqDQorICogVGFibGUgT2YgQ29udGVudCBnZW5lcmF0b3INCisgKiBWZXJzaW9uOiAwLjQNCisgKg0KKyAqIEZlZWwgZnJlZSB0byB1c2UgdGhpcyBzY3JpcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMNCisgKiBMaWNlbnNlLCBhcyBsb25nIGFzIHlvdSBkbyBub3QgcmVtb3ZlIG9yIGFsdGVyIHRoaXMgbm90aWNlLg0KKyAqLw0KKw0KKyAvKiBtb2RpZmllZCBieSBUcm95IEQuIEhhbnNvbiwgU2VwdGVtYmVyIDIwMDYuIExpY2Vuc2U6IEdQTCAqLw0KKyAvKiBtb2RpZmllZCBieSBTdHVhcnQgUmFja2hhbSwgMjAwNiwgMjAwOS4gTGljZW5zZTogR1BMICovDQorDQorLy8gdG9jbGV2ZWxzID0gMS4uNC4NCit0b2M6IGZ1bmN0aW9uICh0b2NsZXZlbHMpIHsNCisNCisgIGZ1bmN0aW9uIGdldFRleHQoZWwpIHsNCisgICAgdmFyIHRleHQgPSAiIjsNCisgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICBpZiAoaS5ub2RlVHlwZSA9PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSAvLyBJRSBkb2Vzbid0IHNwZWFrIGNvbnN0YW50cy4NCisgICAgICAgIHRleHQgKz0gaS5kYXRhOw0KKyAgICAgIGVsc2UgaWYgKGkuZmlyc3RDaGlsZCAhPSBudWxsKQ0KKyAgICAgICAgdGV4dCArPSBnZXRUZXh0KGkpOw0KKyAgICB9DQorICAgIHJldHVybiB0ZXh0Ow0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gVG9jRW50cnkoZWwsIHRleHQsIHRvY2xldmVsKSB7DQorICAgIHRoaXMuZWxlbWVudCA9IGVsOw0KKyAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KKyAgICB0aGlzLnRvY2xldmVsID0gdG9jbGV2ZWw7DQorICB9DQorDQorICBmdW5jdGlvbiB0b2NFbnRyaWVzKGVsLCB0b2NsZXZlbHMpIHsNCisgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTsNCisgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnW2hIXShbMS0nKyh0b2NsZXZlbHMrMSkrJ10pJyk7DQorICAgIC8vIEZ1bmN0aW9uIHRoYXQgc2NhbnMgdGhlIERPTSB0cmVlIGZvciBoZWFkZXIgZWxlbWVudHMgKHRoZSBET00yDQorICAgIC8vIG5vZGVJdGVyYXRvciBBUEkgd291bGQgYmUgYSBiZXR0ZXIgdGVjaG5pcXVlIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IGFsbA0KKyAgICAvLyBicm93c2VycykuDQorICAgIHZhciBpdGVyYXRlID0gZnVuY3Rpb24gKGVsKSB7DQorICAgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICAgIGlmIChpLm5vZGVUeXBlID09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHsNCisgICAgICAgICAgdmFyIG1vID0gcmUuZXhlYyhpLnRhZ05hbWUpOw0KKyAgICAgICAgICBpZiAobW8gJiYgKGkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8IGkuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKSkgIT0gImZsb2F0Iikgew0KKyAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IG5ldyBUb2NFbnRyeShpLCBnZXRUZXh0KGkpLCBtb1sxXS0xKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpdGVyYXRlKGkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpdGVyYXRlKGVsKTsNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHZhciB0b2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9jIik7DQorICBpZiAoIXRvYykgew0KKyAgICByZXR1cm47DQorICB9DQorDQorICAvLyBEZWxldGUgZXhpc3RpbmcgVE9DIGVudHJpZXMgaW4gY2FzZSB3ZSdyZSByZWxvYWRpbmcgdGhlIFRPQy4NCisgIHZhciB0b2NFbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIHZhciBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHRvYy5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IHRvYy5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2Jw0KKyAgICAgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikubWF0Y2goL150b2NsZXZlbC8pKQ0KKyAgICAgIHRvY0VudHJpZXNUb1JlbW92ZS5wdXNoKGVudHJ5KTsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCB0b2NFbnRyaWVzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCisgICAgdG9jLnJlbW92ZUNoaWxkKHRvY0VudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIFRPQyBlbnRyaWVzLg0KKyAgdmFyIGVudHJpZXMgPSB0b2NFbnRyaWVzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50IiksIHRvY2xldmVscyk7DQorICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHsNCisgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpXTsNCisgICAgaWYgKGVudHJ5LmVsZW1lbnQuaWQgPT0gIiIpDQorICAgICAgZW50cnkuZWxlbWVudC5pZCA9ICJfdG9jXyIgKyBpOw0KKyAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsNCisgICAgYS5ocmVmID0gIiMiICsgZW50cnkuZWxlbWVudC5pZDsNCisgICAgYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbnRyeS50ZXh0KSk7DQorICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCisgICAgZGl2LmFwcGVuZENoaWxkKGEpOw0KKyAgICBkaXYuY2xhc3NOYW1lID0gInRvY2xldmVsIiArIGVudHJ5LnRvY2xldmVsOw0KKyAgICB0b2MuYXBwZW5kQ2hpbGQoZGl2KTsNCisgIH0NCisgIGlmIChlbnRyaWVzLmxlbmd0aCA9PSAwKQ0KKyAgICB0b2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b2MpOw0KK30sDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gRm9vdG5vdGVzIGdlbmVyYXRvcg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qIEJhc2VkIG9uIGZvb3Rub3RlIGdlbmVyYXRpb24gY29kZSBmcm9tOg0KKyAqIGh0dHA6Ly93d3cuYnJhbmRzcGFua2luZ25ldy5uZXQvYXJjaGl2ZS8yMDA1LzA3L2Zvcm1hdF9mb290bm90ZS5odG1sDQorICovDQorDQorZm9vdG5vdGVzOiBmdW5jdGlvbiAoKSB7DQorICAvLyBEZWxldGUgZXhpc3RpbmcgZm9vdG5vdGUgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgZm9vdG5vZGVzLg0KKyAgdmFyIGk7DQorICB2YXIgbm90ZWhvbGRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb290bm90ZXMiKTsNCisgIGlmICghbm90ZWhvbGRlcikgew0KKyAgICByZXR1cm47DQorICB9DQorICB2YXIgZW50cmllc1RvUmVtb3ZlID0gW107DQorICBmb3IgKGkgPSAwOyBpIDwgbm90ZWhvbGRlci5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IG5vdGVob2xkZXIuY2hpbGROb2Rlc1tpXTsNCisgICAgaWYgKGVudHJ5Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2RpdicgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpID09ICJmb290bm90ZSIpDQorICAgICAgZW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IGVudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICBub3RlaG9sZGVyLnJlbW92ZUNoaWxkKGVudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIGZvb3Rub3RlIGVudHJpZXMuDQorICB2YXIgY29udCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50Iik7DQorICB2YXIgc3BhbnMgPSBjb250LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQorICB2YXIgcmVmcyA9IHt9Ow0KKyAgdmFyIG4gPSAwOw0KKyAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGUiKSB7DQorICAgICAgbisrOw0KKyAgICAgIHZhciBub3RlID0gc3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiKTsNCisgICAgICBpZiAoIW5vdGUpIHsNCisgICAgICAgIC8vIFVzZSBbXHNcU10gaW4gcGxhY2Ugb2YgLiBzbyBtdWx0aS1saW5lIG1hdGNoZXMgd29yay4NCisgICAgICAgIC8vIEJlY2F1c2UgSmF2YVNjcmlwdCBoYXMgbm8gcyAoZG90YWxsKSByZWdleCBmbGFnLg0KKyAgICAgICAgbm90ZSA9IHNwYW5zW2ldLmlubmVySFRNTC5tYXRjaCgvXHMqXFsoW1xzXFNdKildXHMqLylbMV07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGlkPSdfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgICAgc3BhbnNbaV0uc2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiLCBub3RlKTsNCisgICAgICB9DQorICAgICAgbm90ZWhvbGRlci5pbm5lckhUTUwgKz0NCisgICAgICAgICI8ZGl2IGNsYXNzPSdmb290bm90ZScgaWQ9J19mb290bm90ZV8iICsgbiArICInPiIgKw0KKyAgICAgICAgIjxhIGhyZWY9JyNfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyB0aXRsZT0nUmV0dXJuIHRvIHRleHQnPiIgKw0KKyAgICAgICAgbiArICI8L2E+LiAiICsgbm90ZSArICI8L2Rpdj4iOw0KKyAgICAgIHZhciBpZCA9c3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOw0KKyAgICAgIGlmIChpZCAhPSBudWxsKSByZWZzWyIjIitpZF0gPSBuOw0KKyAgICB9DQorICB9DQorICBpZiAobiA9PSAwKQ0KKyAgICBub3RlaG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm90ZWhvbGRlcik7DQorICBlbHNlIHsNCisgICAgLy8gUHJvY2VzcyBmb290bm90ZXJlZnMuDQorICAgIGZvciAoaT0wOyBpPHNwYW5zLmxlbmd0aDsgaSsrKSB7DQorICAgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGVyZWYiKSB7DQorICAgICAgICB2YXIgaHJlZiA9IHNwYW5zW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0uZ2V0QXR0cmlidXRlKCJocmVmIik7DQorICAgICAgICBocmVmID0gaHJlZi5tYXRjaCgvIy4qLylbMF07ICAvLyBCZWNhdXNlIElFIHJldHVybiBmdWxsIFVSTC4NCisgICAgICAgIG4gPSByZWZzW2hyZWZdOw0KKyAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0NCisgICAgICAgICAgIls8YSBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30sDQorDQoraW5zdGFsbDogZnVuY3Rpb24odG9jbGV2ZWxzKSB7DQorICB2YXIgdGltZXJJZDsNCisNCisgIGZ1bmN0aW9uIHJlaW5zdGFsbCgpIHsNCisgICAgYXNjaWlkb2MuZm9vdG5vdGVzKCk7DQorICAgIGlmICh0b2NsZXZlbHMpIHsNCisgICAgICBhc2NpaWRvYy50b2ModG9jbGV2ZWxzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIoKSB7DQorICAgIGNsZWFySW50ZXJ2YWwodGltZXJJZCk7DQorICAgIHJlaW5zdGFsbCgpOw0KKyAgfQ0KKw0KKyAgdGltZXJJZCA9IHNldEludGVydmFsKHJlaW5zdGFsbCwgNTAwKTsNCisgIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKQ0KKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIsIGZhbHNlKTsNCisgIGVsc2UNCisgICAgd2luZG93Lm9ubG9hZCA9IHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyOw0KK30NCisNCit9DQorYXNjaWlkb2MuaW5zdGFsbCgpOw0KKy8qXV0+Ki8NCis8L3NjcmlwdD4NCis8L2hlYWQ+DQorPGJvZHkgY2xhc3M9Im1hbnBhZ2UiPg0KKzxkaXYgaWQ9ImhlYWRlciI+DQorPGgxPg0KK3B4ZWxpbnV4KDEpIE1hbnVhbCBQYWdlDQorPC9oMT4NCis8aDI+TkFNRTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxwPnB4ZWxpbnV4IC0NCisgICBUaGUgU3lzbGludXggZGVyaXZhdGl2ZSBQWEVMSU5VWCBmb3IgUFhFIG5ldHdvcmsgYm9vdGluZw0KKzwvcD4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJjb250ZW50Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfc3lub3BzaXMiPlNZTk9QU0lTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0idmVyc2VibG9jayI+DQorPHByZSBjbGFzcz0iY29udGVudCI+cHhlbGludXguMDwvcHJlPg0KKzxkaXYgY2xhc3M9ImF0dHJpYnV0aW9uIj4NCis8L2Rpdj48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZGVzY3JpcHRpb24iPkRFU0NSSVBUSU9OPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IGlzIGEgU3lzbGludXggZGVyaXZhdGl2ZSwgZm9yIGJvb3RpbmcgTGludXggb2ZmIGEgbmV0d29yaw0KK3NlcnZlciwgdXNpbmcgYSBuZXR3b3JrIFJPTSBjb25mb3JtaW5nIHRvIHRoZSBJbnRlbCBQWEUgKFByZS1FeGVjdXRpb24NCitFbnZpcm9ubWVudCkgc3BlY2lmaWNhdGlvbi4gIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gaXMgPGVtPipub3QqPC9lbT4gYSBwcm9ncmFtIHRoYXQgaXMNCitpbnRlbmRlZCB0byBiZSBmbGFzaGVkIG9yIGJ1cm5lZCBpbnRvIGEgUFJPTSBvbiB0aGUgbmV0d29yayBjYXJkOyBpZg0KK3lvdSB3YW50IHRoYXQsIGNoZWNrIG91dCBFdGhlcmJvb3QgKDxhIGhyZWY9Imh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy8iPmh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy88L2E+KS4NCitFdGhlcmJvb3QgNS40IG9yIGxhdGVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gY3JlYXRlIGEgUFhFLWNvbXBsaWFudCBib290DQorUFJPTSBmb3IgbWFueSBuZXR3b3JrIGNhcmRzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlBYRUxJTlVYIGdlbmVyYWxseSByZXF1aXJlcyB0aGF0IGZ1bGwgZmlsZSBwYXRobmFtZXMgYXJlIDEyNyBjaGFyYWN0ZXJzIG9yIHNob3J0ZXIgaW4gbGVuZ3RoLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfY3VycmVudF9kaXJlY3RvcnkiPkNVUlJFTlQgRElSRUNUT1JZPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgaW5pdGlhbCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIGVpdGhlciBhcyBzdXBwbGllZCBieSBESENQDQorb3B0aW9uIDIxMCAocHhlbGludXgucGF0aHByZWZpeCksIHRoZSBoYXJkY29kZWQgcGF0aC1wcmVmaXggb3IgdGhlDQorcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgUFhFTElOVVggZmlsZSwgYXMgaW5kaWNhdGVkIGJ5IERIQ1AgZmllbGRzDQorPGVtPnNuYW1lPC9lbT4gYW5kIDxlbT5maWxlPC9lbT4gKHNuYW1lPSIxOTIuMTY4LjIuMyIgYW5kIGZpbGU9ImJvb3QvcHhlbGludXguMCINCityZXN1bHRzIGluICJ0ZnRwOi8vMTkyLjE2OC4yLjMvYm9vdC8iLCAiMTkyLjE2OC4yLjM6OmJvb3QvIiBpbiBvbGRlcg0KK1BYRUxJTlVYIGZvcm1hdCkgd2l0aCBwcmVjZWRlbmNlIHNwZWNpZmllZCB1bmRlciA8c3Ryb25nPk9QVElPTlM8L3N0cm9uZz4uPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+QWxsIHVucXVhbGlmaWVkIGZpbGVuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfY29uZmlndXJhdGlvbiI+Q09ORklHVVJBVElPTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U2VlIDxzdHJvbmc+c3lzbGludXguY2ZnPC9zdHJvbmc+KDUpIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBjb250ZW50cy48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5CZWNhdXNlIG1vcmUgdGhhbiBvbmUgc3lzdGVtIG1heSBiZSBib290ZWQgZnJvbSB0aGUgc2FtZSBzZXJ2ZXIsIHRoZQ0KK2NvbmZpZ3VyYXRpb24gZmlsZSBuYW1lIGRlcGVuZHMgb24gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGJvb3RpbmcNCittYWNoaW5lLiAgQWZ0ZXIgYXR0ZW1wdGluZyB0aGUgZmlsZSBhcyBzcGVjaWZpZWQgaW4gdGhlIERIQ1Agb3INCitoYXJkY29kZWQgb3B0aW9ucywgUFhFTElOVVggd2lsbCBwcm9iZSB0aGUgZm9sbG93aW5nIHBhdGhzLCBwcmVmaXhlZA0KK3dpdGggInB4ZWxpbnV4LmNmZy8iLCB1bmRlciB0aGUgaW5pdGlhbCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJ1bGlzdCI+PHVsPg0KKzxsaT4NCis8cD4NCitUaGUgY2xpZW50IFVVSUQgaWYgcHJvdmlkZWQgYnkgdGhlIFBYRSBzdGFjayAobm90ZSwgc29tZSBCSU9TZXMgZG9uJiM4MjE3O3QNCitoYXZlIGEgdmFsaWQgVVVJRCwgYW5kIHlvdSBtaWdodCBlbmQgdXAgd2l0aCBzb21ldGhpbmcgbGlrZSBhbGwgMSYjODIxNztzLikNCitUaGlzIGlzIGluIHRoZSBzdGFuZGFyZCBVVUlEIGZvcm1hdCB1c2luZyBsb3dlciBjYXNlIGhleGFkZWNpbWFsIGRpZ2l0cywNCitlLmcuIGI4OTQ1OTA4LWQ2YTYtNDFhOS02MTFkLTc0YTZhYjgwYjgzZC4NCis8L3A+DQorPC9saT4NCis8bGk+DQorPHA+DQorVGhlIGhhcmR3YXJlIHR5cGUgKHVzaW5nIGl0cyBBUlAgdHlwZSBjb2RlKSBhbmQgYWRkcmVzcywgYWxsIGluIGxvd2VyDQorY2FzZSBoZXhhZGVjaW1hbCB3aXRoIGRhc2ggc2VwYXJhdG9yczsgZm9yIGV4YW1wbGUsIGZvciBhbiBFdGhlcm5ldCAoQVJQDQordHlwZSAxKSB3aXRoIGFkZHJlc3MgODg6OTk6QUE6QkI6Q0M6REQgaXQgd291bGQgc2VhcmNoIGZvciB0aGUgZmlsZW5hbWUNCiswMS04OC05OS1hYS1iYi1jYy1kZC4NCis8L3A+DQorPC9saT4NCis8bGk+DQorPHA+DQorVGhlIGNsaWVudCYjODIxNztzIElQdjQgYWRkcmVzcyBpbiB1cHBlci1jYXNlIGhleGlkZWNpbWFsIChpZSAxOTIuMTY4LjIuOTENCismIzg1OTQ7IEMwQTgwMjVCOyB5b3UgY2FuIHVzZSB0aGUgaW5jbHVkZWQgcHJvZ2FtICJnZXRob3N0aXAiIHRvIGNvbXB1dGUgdGhlDQoraGV4YWRlY2ltYWwgSVAgYWRkcmVzcyBmb3IgYW55IGhvc3QuKSBmb2xsb3dlZCBieSByZW1vdmluZyBjaGFyYWN0ZXJzLA0KK29uZSBhdCBhIHRpbWUsIGZyb20gdGhlIGVuZC4NCis8L3A+DQorPC9saT4NCis8bGk+DQorPHA+DQorImRlZmF1bHQiDQorPC9wPg0KKzwvbGk+DQorPC91bD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlN0YXJ0aW5nIGluIHJlbGVhc2UgMy4yMCwgaWYgUFhFTElOVVggY2FuIG5vdCBmaW5kIGEgY29uZmlndXJhdGlvbiBmaWxlLA0KK2l0IHdpbGwgcmVib290IGFmdGVyIHRoZSB0aW1lb3V0IGludGVydmFsIGhhcyBleHBpcmVkLiAgVGhpcyBrZWVwcyBhDQorbWFjaGluZSBmcm9tIGdldHRpbmcgc3R1Y2sgaW5kZWZpbml0ZWx5IGR1ZSB0byBhIGJvb3Qgc2VydmVyIGZhaWx1cmUuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9vcHRpb25zIj5PUFRJT05TPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IChzdGFydGluZyB3aXRoIHZlcnNpb24gMS42Mikgc3VwcG9ydHMgdGhlIGZvbGxvd2luZw0KK25vbnN0YW5kYXJkIERIQ1Agb3B0aW9ucywgd2hpY2ggZGVwZW5kaW5nIG9uIHlvdXIgREhDUCBzZXJ2ZXIgeW91IG1heSBiZQ0KK2FibGUgdG8gdXNlIHRvIGN1c3RvbWl6ZSB0aGUgc3BlY2lmaWMgYmVoYXZpb3VyIG9mIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4uICBTZWUgUkZDDQorNTA3MSBmb3Igc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIG9wdGlvbnMuIE9wdGlvbnMgZm9yDQorPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiBjYW4gYmUgc3BlY2lmaWVkIGJ5IERIQ1Agb3B0aW9ucyBvciBoYXJkY29kZWQgaW50byB0aGUNCitiaW5hcnkuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9vcHRpb25fcHJpb3JpdHkiPk9wdGlvbiBQcmlvcml0eTwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5IYXJkY29kZWQgYWZ0ZXItb3B0aW9ucyBhcmUgYXBwbGllZCBhZnRlciBESENQIG9wdGlvbnMgKGFuZCBvdmVycnJpZGUpDQord2hpbGUgaGFyZGNvZGVkIGJlZm9yZS1vcHRpb25zIGFyZSBhcHBsaWVkIHByaW9yIHRvIERIQ1Agb3B0aW9ucyBhbmQNCitkZWZhdWx0IGJlaGF2aW9yIHRha2VzIHRoZSBsb3dlc3QgcHJpb3JpdHkuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9kaGNwX29wdGlvbnMiPkRIQ1Agb3B0aW9uczwvaDM+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+T3B0aW9uIDIwODwvc3Ryb25nPiAocHhlbGludXgubWFnaWMpDQorPC9kdD4NCis8ZGQ+DQorPHA+DQorRWFybGllciB2ZXJzaW9ucyBvZiA8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IHJlcXVpcmVkIHRoaXMgdG8gYmUgc2V0IHRvIEYxOjAwOjc0OjdFDQorKDI0MS4wLjExNi4xMjYpIGZvciA8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IHRvIHJlY29nbml6ZSBhbnkgc3BlY2lhbCBESENQIG9wdGlvbnMNCit3aGF0c29ldmVyLiAgQXMgb2YgPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiAzLjU1LCB0aGlzIG9wdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBpcyBubw0KK2xvbmdlciByZXF1aXJlZC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+T3B0aW9uIDIwOTwvc3Ryb25nPiAocHhlbGludXguY29uZmlnZmlsZSkNCis8L2R0Pg0KKzxkZD4NCis8cD4NCitTcGVjaWZpZXMgdGhlIGluaXRpYWwgPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSB3aGljaCBtYXkgYmUNCitxdWFsaWZpZWQgb3IgdW5xdWFsaWZpZWQuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk9wdGlvbiAyMTA8L3N0cm9uZz4gKHB4ZWxpbnV4LnBhdGhwcmVmaXgpDQorPC9kdD4NCis8ZGQ+DQorPHA+DQorU3BlY2lmaWVzIHRoZSA8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IGNvbW1vbiBwYXRoIHByZWZpeCwgaW5zdGVhZCBvZiBkZXJpdmluZyBpdCBmcm9tDQordGhlIGJvb3QgZmlsZSBuYW1lLiAgVGhpcyBhbG1vc3QgY2VydGFpbmx5IG5lZWRzIHRvIGVuZCBpbiB3aGF0ZXZlcg0KK2NoYXJhY3RlciB0aGUgVEZUUCBzZXJ2ZXIgT1MgdXNlcyBhcyBhIHBhdGhuYW1lIHNlcGFyYXRvciwgZS5nLiBzbGFzaA0KKygvKSBmb3IgVW5peC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+T3B0aW9uIDIxMTwvc3Ryb25nPiAocHhlbGludXgucmVib290dGltZSkNCis8L2R0Pg0KKzxkZD4NCis8cD4NCitTcGVjaWZpZXMsIGluIHNlY29uZHMsIHRoZSB0aW1lIHRvIHdhaXQgYmVmb3JlIHJlYm9vdCBpbiB0aGUgZXZlbnQgb2YNCitURlRQIGZhaWx1cmUuICAwIG1lYW5zIHdhaXQgImZvcmV2ZXIiIChpbiByZWFsaXR5LCBpdCB3YWl0cw0KK2FwcHJveGltYXRlbHkgMTM2IHllYXJzLikNCis8L3A+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9oYXJkY29kZWRfb3B0aW9ucyI+SGFyZGNvZGVkIG9wdGlvbnM8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U2luY2UgdmVyc2lvbiAzLjgzLCB0aGUgcHJvZ3JhbSAicHhlbGludXgtb3B0aW9ucyIgY2FuIGJlIHVzZWQgdG8NCitoYXJkLWNvZGUgREhDUCBvcHRpb25zIGludG8gdGhlIHB4ZWxpbnV4LjAgaW1hZ2UgZmlsZTsgdGhpcyBpcw0KK3NvbWV0aW1lcyB1c2VmdWwgd2hlbiB0aGUgREhDUCBzZXJ2ZXIgaXMgdW5kZXIgZGlmZmVyZW50DQorYWRtaW5pc3RyYXRpdmUgY29udHJvbC4gIEhhcmRjb2RlZCBvcHRpb25zPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4gIDYgPSZndDsgJ2RvbWFpbi1uYW1lLXNlcnZlcnMnLA0KKyAxNSA9Jmd0OyAnZG9tYWluLW5hbWUnLA0KKyA1NCA9Jmd0OyAnbmV4dC1zZXJ2ZXInLA0KKzIwOSA9Jmd0OyAnY29uZmlnLWZpbGUnLA0KKzIxMCA9Jmd0OyAncGF0aC1wcmVmaXgnLA0KKzIxMSA9Jmd0OyAncmVib290dGltZSc8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2h0dHBfZnRwIj5IVFRQL0ZUUDwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U2luY2UgdmVyc2lvbiA1LjEwLCBhIHNwZWNpYWwgUFhFTElOVVggYmluYXJ5LCBscHhlbGludXguMCwgbmF0aXZlbHkNCitzdXBwb3J0cyBIVFRQIGFuZCBGVFAgdHJhbnNmZXJzLCBncmVhdGx5IGluY3JlYXNpbmcgbG9hZCBzcGVlZCBhbmQNCithbGxvd2luZyBmb3Igc3RhbmRhcmQgSFRUUCBzY3JpcHRzIHRvIHByZXNlbnQgUFhFTElOVVgmIzgyMTc7cyBjb25maWd1cmF0aW9uDQorZmlsZS4gIFRvIHVzZSBodHRwIG9yIGZ0cCwgdXNlIHN0YW5kYXJkIFVSTCBzeW50YXggYXMgZmlsZW5hbWU7IHVzZSB0aGUNCitESENQIG9wdGlvbnMgYmVsb3cgdG8gdHJhbnNtaXQgYSBzdWl0YWJsZSBVUkwgcHJlZml4IHRvIHRoZSBjbGllbnQsIG9yDQordXNlIHRoZSAicHhlbGludXgtb3B0aW9ucyIgdG9vbCBwcm92aWRlZCBpbiB0aGUgdXRpbHMgZGlyZWN0b3J5IHRvDQorcHJvZ3JhbSBpdCBkaXJlY3RseSBpbnRvIHRoZSBscHhlbGludXguMCBmaWxlLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZmlsZW5hbWVfc3ludGF4Ij5GSUxFTkFNRSBTWU5UQVg8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlBYRUxJTlVYIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBwYXRobmFtZSBjb252ZW50aW9uczo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+OjpmaWxlbmFtZTwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK1N1cHByZXNzZXMgdGhlIGNvbW1vbiBmaWxlbmFtZSBwcmVmaXgsIGkuZS4gcGFzc2VzIHRoZSBzdHJpbmcgImZpbGVuYW1lIg0KK3VubW9kaWZpZWQgdG8gdGhlIHNlcnZlci4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+SVAgYWRkcmVzczo6ZmlsZW5hbWU8L3N0cm9uZz4gKGUuZy4gMTkyLjE2OC4yLjM6OmZpbGVuYW1lKQ0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK1N1cHByZXNzZXMgdGhlIGNvbW1vbiBmaWxlbmFtZSBwcmVmaXgsIDxzdHJvbmc+YW5kPC9zdHJvbmc+IHNlbmRzIGEgcmVxdWVzdCB0byBhbiBhbHRlcm5hdGUgVEZUUCBzZXJ2ZXIuICBJbnN0ZWFkIG9mIGFuIElQIGFkZHJlc3MsIGEgRE5TIG5hbWUgY2FuIGJlIHVzZWQuICBJdCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgZnVsbHkgcXVhbGlmaWVkIGlmIGl0IGNvbnRhaW5zIGRvdHM7IG90aGVyd2lzZSB0aGUgbG9jYWwgZG9tYWluIGFzIHJlcG9ydGVkIGJ5IHRoZSBESENQIHNlcnZlciAob3B0aW9uIDE1KSB3aWxsIGJlIGFkZGVkLg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD46OiB3YXMgY2hvc2VuIGJlY2F1c2UgaXQgaXMgdW5saWtlbHkgdG8gY29uZmxpY3Qgd2l0aCBvcGVyYXRpbmcgc3lzdGVtDQordXNhZ2UuICBIb3dldmVyLCBpZiB5b3UgaGFwcGVuIHRvIGhhdmUgYW4gZW52aXJvbm1lbnQgZm9yIHdoaWNoIHRoZQ0KK3NwZWNpYWwgdHJlYXRtZW50IG9mIDo6IGlzIGEgcHJvYmxlbSwgcGxlYXNlIGNvbnRhY3QgdGhlIFN5c2xpbnV4DQorbWFpbGluZyBsaXN0LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlNpbmNlIHZlcnNpb24gNC4wMCwgUFhFTElOVVggYWxzbyBzdXBwb3J0cyBzdGFuZGFyZCBVUkwgc3ludGF4LjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfa2VlcHB4ZSI+S0VFUFBYRTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Tm9ybWFsbHksIFBYRUxJTlVYIHdpbGwgdW5sb2FkIHRoZSBQWEUgYW5kIFVOREkgc3RhY2tzIGJlZm9yZSBpbnZva2luZw0KK3RoZSBrZXJuZWwuICBJbiBzcGVjaWFsIGNpcmN1bXN0YW5jZXMgKGZvciBleGFtcGxlLCB3aGVuIHVzaW5nIE1FTURJU0sNCit0byBib290IGFuIG9wZXJhdGluZyBzeXN0ZW0gd2l0aCBhbiBVTkRJIG5ldHdvcmsgZHJpdmVyKSBpdCBtaWdodCBiZQ0KK2Rlc2lyYWJsZSB0byBrZWVwIHRoZSBQWEUgc3RhY2sgaW4gbWVtb3J5LiAgSWYgdGhlIG9wdGlvbiAia2VlcHB4ZSINCitpcyBnaXZlbiBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZSwgUFhFTElOVVggd2lsbCBrZWVwIHRoZSBQWEUgYW5kDQorVU5ESSBzdGFja3MgaW4gbWVtb3J5LiAgKElmIHlvdSBkb24mIzgyMTc7dCBrbm93IHdoYXQgdGhpcyBtZWFucywgeW91DQorcHJvYmFibHkgZG9uJiM4MjE3O3QgbmVlZCBpdC4pPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9leGFtcGxlcyI+RVhBTVBMRVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfY29uZmlndXJhdGlvbl9maWxlbmFtZSI+Q29uZmlndXJhdGlvbiBmaWxlbmFtZTwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Gb3IgREhDUCBzaWFkZHIgMTkyLjE2OC4yLjMsIGZpbGUgPGVtPm15Ym9vdGRpci9weGVsaW51eC4wPC9lbT4sIGNsaWVudCBVVUlEDQorYjg5NDU5MDgtZDZhNi00MWE5LTYxMWQtNzRhNmFiODBiODNkLCBFdGhlcm5ldCBNQUMgYWRkcmVzcw0KKzg4Ojk5OkFBOkJCOkNDOkREIGFuZCBJUHY0IGFkZHJlc3MgMTkyLjE2OC4yLjkxLCB0aGUgZm9sbG93aW5nIGZpbGVzIGluDQordGhpcyBvcmRlciB3aWxsIGJlIGF0dGVtcHRlZCAoYWZ0ZXIgY29uZmlnLWZpbGUgb3B0aW9ucyk6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5teWJvb3RkaXIvcHhlbGludXguY2ZnL2I4OTQ1OTA4LWQ2YTYtNDFhOS02MTFkLTc0YTZhYjgwYjgzZA0KK215Ym9vdGRpci9weGVsaW51eC5jZmcvMDEtODgtOTktYWEtYmItY2MtZGQNCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgwMjVCDQorbXlib290ZGlyL3B4ZWxpbnV4LmNmZy9DMEE4MDI1DQorbXlib290ZGlyL3B4ZWxpbnV4LmNmZy9DMEE4MDINCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgwDQorbXlib290ZGlyL3B4ZWxpbnV4LmNmZy9DMEE4DQorbXlib290ZGlyL3B4ZWxpbnV4LmNmZy9DMEENCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwDQorbXlib290ZGlyL3B4ZWxpbnV4LmNmZy9DDQorbXlib290ZGlyL3B4ZWxpbnV4LmNmZy9kZWZhdWx0PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il90ZnRwX3NlcnZlcnMiPlRGVFAgc2VydmVyczwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Gb3IgYmVzdCByZXN1bHRzLCB1c2UgYSBURlRQIHNlcnZlciB3aGljaCBzdXBwb3J0cyB0aGUgInRzaXplIiBURlRQDQorb3B0aW9uIChSRkMgMTc4NC9SRkMgMjM0OSkuICBUaGUgInRmdHAtaHBhIiBURlRQIHNlcnZlciwgd2hpY2ggc3VwcG9ydA0KK29wdGlvbnMsIGlzIGF2YWlsYWJsZSBhdDo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvbmV0d29yay90ZnRwLw0KK2Z0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9uZXR3b3JrL3RmdHAvPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+YW5kIG9uIGFueSBrZXJuZWwub3JnIG1pcnJvciAoc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cua2VybmVsLm9yZy9taXJyb3JzLyI+aHR0cDovL3d3dy5rZXJuZWwub3JnL21pcnJvcnMvPC9hPikuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+QW5vdGhlciBURlRQIHNlcnZlciB3aGljaCBzdXBwb3J0cyB0aGlzIGlzIGF0ZnRwIGJ5IEplYW4tUGllcnJlDQorTGVmZWJ2cmU6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5mdHA6Ly9mdHAubWFtYWxpbnV4LmNvbS9wdWIvYXRmdHAvPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgeW91ciBib290IHNlcnZlciBpcyBydW5uaW5nIFdpbmRvd3MgKGFuZCB5b3UgY2FuJiM4MjE3O3QgZml4IHRoYXQpLCB0cnkNCit0ZnRwZDMyIGJ5IFBoaWxpcHBlIEpvdW5pbiAoeW91IG5lZWQgdmVyc2lvbiAyLjExIG9yIGxhdGVyOyBwcmV2aW91cw0KK3ZlcnNpb25zIGhhZCBhIGJ1ZyB3aGljaCBtYWRlIGl0IGluY29tcGF0aWJsZSB3aXRoIFBYRUxJTlVYKTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmh0dHA6Ly90ZnRwZDMyLmpvdW5pbi5uZXQvPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9kaGNwX2NvbmZpZ19zaW1wbGUiPkRIQ1AgY29uZmlnOiBTaW1wbGU8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIFBYRSBwcm90b2NvbCB1c2VzIGEgdmVyeSBjb21wbGV4IHNldCBvZiBleHRlbnNpb25zIHRvIERIQ1Agb3INCitCT09UUC4gIEhvd2V2ZXIsIG1vc3QgUFhFIGltcGxlbWVudGF0aW9ucyYjODIwMTsmIzgyMTI7JiM4MjAxO3RoaXMgaW5jbHVkZXMgYWxsIEludGVsDQorb25lcyB2ZXJzaW9uIDAuOTluIGFuZCBsYXRlciYjODIwMTsmIzgyMTI7JiM4MjAxO3NlZW0gdG8gYmUgYWJsZSB0byBib290IGluIGENCisiY29udmVudGlvbmFsIiBESENQL1RGVFAgY29uZmlndXJhdGlvbi4gIEFzc3VtaW5nIHlvdSBkb24mIzgyMTc7dCBoYXZlIHRvDQorc3VwcG9ydCBhbnkgdmVyeSBvbGQgb3Igb3RoZXJ3aXNlIHNldmVyZWx5IGJyb2tlbiBjbGllbnRzLCB0aGlzIGlzDQorcHJvYmFibHkgdGhlIGJlc3QgY29uZmlndXJhdGlvbiB1bmxlc3MgeW91IGFscmVhZHkgaGF2ZSBhIFBYRSBib290DQorc2VydmVyIG9uIHlvdXIgbmV0d29yay48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5BIHNhbXBsZSBESENQIHNldHVwLCB1c2luZyB0aGUgImNvbnZlbnRpb25hbCBURlRQIiBjb25maWd1cmF0aW9uLA0KK3dvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgdXNpbmcgSVNDIGRoY3AgMi4wIGRoY3BkLmNvbmYNCitzeW50YXg6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5hbGxvdyBib290aW5nOw0KK2FsbG93IGJvb3RwOw0KKw0KKyMgU3RhbmRhcmQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uDQorDQorb3B0aW9uIGRvbWFpbi1uYW1lICImbHQ7ZG9tYWluIG5hbWUmZ3Q7IjsNCitvcHRpb24gc3VibmV0LW1hc2sgJmx0O3N1Ym5ldCBtYXNrJmd0OzsNCitvcHRpb24gYnJvYWRjYXN0LWFkZHJlc3MgJmx0O2Jyb2FkY2FzdCBhZGRyZXNzJmd0OzsNCitvcHRpb24gZG9tYWluLW5hbWUtc2VydmVycyAmbHQ7ZG5zIHNlcnZlcnMmZ3Q7Ow0KK29wdGlvbiByb3V0ZXJzICZsdDtkZWZhdWx0IHJvdXRlciZndDs7DQorDQorIyBHcm91cCB0aGUgUFhFIGJvb3RhYmxlIGhvc3RzIHRvZ2V0aGVyDQorZ3JvdXAgew0KKyAgICAgICAgIyBQWEUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uDQorICAgICAgICBuZXh0LXNlcnZlciAmbHQ7VEZUUCBzZXJ2ZXIgYWRkcmVzcyZndDs7DQorICAgICAgICBmaWxlbmFtZSAiL3RmdHBib290L3B4ZWxpbnV4LjAiOw0KKw0KKyAgICAgICAgIyBZb3UgbmVlZCBhbiBlbnRyeSBsaWtlIHRoaXMgZm9yIGV2ZXJ5IGhvc3QNCisgICAgICAgICMgdW5sZXNzIHlvdSdyZSB1c2luZyBkeW5hbWljIGFkZHJlc3Nlcw0KKyAgICAgICAgaG9zdCAmbHQ7aG9zdG5hbWUmZ3Q7IHsNCisgICAgICAgICAgICAgICAgaGFyZHdhcmUgZXRoZXJuZXQgJmx0O2V0aGVybmV0IGFkZHJlc3MmZ3Q7Ow0KKyAgICAgICAgICAgICAgICBmaXhlZC1hZGRyZXNzICZsdDtob3N0bmFtZSZndDs7DQorICAgICAgICB9DQorfTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGUgdGhhdCBpZiB5b3VyIHBhcnRpY3VsYXIgVEZUUCBkYWVtb24gcnVucyB1bmRlciBjaHJvb3QgKHRmdHAtaHBhDQord2lsbCBkbyB0aGlzIGlmIHlvdSBzcGVjaWZ5IHRoZSAtcyAoc2VjdXJlKSBvcHRpb247IHRoaXMgaXMgaGlnaGx5DQorcmVjb21tZW5kZWQpLCB5b3UgYWxtb3N0IGNlcnRhaW5seSBzaG91bGQgbm90IGluY2x1ZGUgdGhlIC90ZnRwYm9vdA0KK3ByZWZpeCBpbiB0aGUgZmlsZW5hbWUgc3RhdGVtZW50LjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfZGhjcF9jb25maWdfcHhlXzEiPkRIQ1AgQ29uZmlnOiBQWEUtMTwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JZiB0aGUgc2ltcGxlIGNvbmZpZyBkb2VzIG5vdCB3b3JrIGZvciB5b3VyIGVudmlyb25tZW50LCB5b3UgcHJvYmFibHkNCitzaG91bGQgc2V0IHVwIGEgIlBYRSBib290IHNlcnZlciIgb24gcG9ydCA0MDExIG9mIHlvdXIgVEZUUCBzZXJ2ZXI7IGENCitmcmVlIFBYRSBib290IHNlcnZlciBpcyBhdmFpbGFibGUgYXQ6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PGEgaHJlZj0iaHR0cDovL3d3dy5rYW5vLm9yZy51ay9wcm9qZWN0cy9weGUvIj5odHRwOi8vd3d3Lmthbm8ub3JnLnVrL3Byb2plY3RzL3B4ZS88L2E+PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+V2l0aCBzdWNoIGEgYm9vdCBzZXJ2ZXIgZGVmaW5lZCwgeW91ciBESENQIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGxvb2sNCit0aGUgc2FtZSBleGNlcHQgZm9yIGFuICJvcHRpb24gZGhjcC1jbGFzcy1pZGVudGlmaWVyIiAoIm9wdGlvbg0KK3ZlbmRvci1jbGFzcy1pZGVudGlmaWVyIiBpZiB5b3UgYXJlIHVzaW5nIERIQ1AgMy4wKTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmFsbG93IGJvb3Rpbmc7DQorYWxsb3cgYm9vdHA7DQorDQorIyBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4NCisNCitvcHRpb24gZG9tYWluLW5hbWUgIiZsdDtkb21haW4gbmFtZSZndDsiOw0KK29wdGlvbiBzdWJuZXQtbWFzayAmbHQ7c3VibmV0IG1hc2smZ3Q7Ow0KK29wdGlvbiBicm9hZGNhc3QtYWRkcmVzcyAmbHQ7YnJvYWRjYXN0IGFkZHJlc3MmZ3Q7Ow0KK29wdGlvbiBkb21haW4tbmFtZS1zZXJ2ZXJzICZsdDtkbnMgc2VydmVycyZndDs7DQorb3B0aW9uIHJvdXRlcnMgJmx0O2RlZmF1bHQgcm91dGVyJmd0OzsNCisNCisjIEdyb3VwIHRoZSBQWEUgYm9vdGFibGUgaG9zdHMgdG9nZXRoZXINCitncm91cCB7DQorICAgICAgICAjIFBYRS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4NCisgICAgICAgIG9wdGlvbiBkaGNwLWNsYXNzLWlkZW50aWZpZXIgIlBYRUNsaWVudCI7DQorICAgICAgICBuZXh0LXNlcnZlciAmbHQ7cHhlIGJvb3Qgc2VydmVyIGFkZHJlc3MmZ3Q7Ow0KKw0KKyAgICAgICAgIyBZb3UgbmVlZCBhbiBlbnRyeSBsaWtlIHRoaXMgZm9yIGV2ZXJ5IGhvc3QNCisgICAgICAgICMgdW5sZXNzIHlvdSdyZSB1c2luZyBkeW5hbWljIGFkZHJlc3Nlcw0KKyAgICAgICAgaG9zdCAmbHQ7aG9zdG5hbWUmZ3Q7IHsNCisgICAgICAgICAgICAgICAgaGFyZHdhcmUgZXRoZXJuZXQgJmx0O2V0aGVybmV0IGFkZHJlc3MmZ3Q7Ow0KKyAgICAgICAgICAgICAgICBmaXhlZC1hZGRyZXNzICZsdDtob3N0bmFtZSZndDs7DQorICAgICAgICB9DQorfTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkhlcmUsIHRoZSBib290IGZpbGUgbmFtZSBpcyBvYnRhaW5lZCBmcm9tIHRoZSBQWEUgc2VydmVyLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfZGhjcF9jb25maWdfZW5jYXBzdWxhdGVkIj5ESENQIENvbmZpZzogRW5jYXBzdWxhdGVkPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklmIHRoZSAiY29udmVudGlvbmFsIFRGVFAiIGNvbmZpZ3VyYXRpb24gZG9lc24mIzgyMTc7dCB3b3JrIG9uIHlvdXIgY2xpZW50cywNCithbmQgc2V0dGluZyB1cCBhIFBYRSBib290IHNlcnZlciBpcyBub3QgYW4gb3B0aW9uLCB5b3UgY2FuIGF0dGVtcHQgdGhlDQorZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24uICBJdCBoYXMgYmVlbiBrbm93biB0byBib290IHNvbWUNCitjb25maWd1cmF0aW9ucyBjb3JyZWN0bHk7IGhvd2V2ZXIsIHRoZXJlIGFyZSBubyBndWFyYW50ZWVzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+YWxsb3cgYm9vdGluZzsNCithbGxvdyBib290cDsNCisNCisjIFN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLg0KKw0KK29wdGlvbiBkb21haW4tbmFtZSAiJmx0O2RvbWFpbiBuYW1lJmd0OyI7DQorb3B0aW9uIHN1Ym5ldC1tYXNrICZsdDtzdWJuZXQgbWFzayZndDs7DQorb3B0aW9uIGJyb2FkY2FzdC1hZGRyZXNzICZsdDticm9hZGNhc3QgYWRkcmVzcyZndDs7DQorb3B0aW9uIGRvbWFpbi1uYW1lLXNlcnZlcnMgJmx0O2RucyBzZXJ2ZXJzJmd0OzsNCitvcHRpb24gcm91dGVycyAmbHQ7ZGVmYXVsdCByb3V0ZXImZ3Q7Ow0KKw0KKyMgR3JvdXAgdGhlIFBYRSBib290YWJsZSBob3N0cyB0b2dldGhlcg0KK2dyb3VwIHsNCisgICAgICAgICMgUFhFLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLg0KKyAgICAgICAgb3B0aW9uIGRoY3AtY2xhc3MtaWRlbnRpZmllciAiUFhFQ2xpZW50IjsNCisgICAgICAgIG9wdGlvbiB2ZW5kb3ItZW5jYXBzdWxhdGVkLW9wdGlvbnMgMDk6MGY6ODA6MDA6MGM6NGU6NjU6NzQ6Nzc6NmY6NzI6NmI6MjA6NjI6NmY6NmY6NzQ6MGE6MDc6MDA6NTA6NzI6NmY6NmQ6NzA6NzQ6MDY6MDE6MDI6MDg6MDM6ODA6MDA6MDA6NDc6MDQ6ODA6MDA6MDA6MDA6ZmY7DQorICAgICAgICBuZXh0LXNlcnZlciAmbHQ7VEZUUCBzZXJ2ZXImZ3Q7Ow0KKyAgICAgICAgZmlsZW5hbWUgIi90ZnRwYm9vdC9weGVsaW51eC4wIjsNCisNCisgICAgICAgICMgWW91IG5lZWQgYW4gZW50cnkgbGlrZSB0aGlzIGZvciBldmVyeSBob3N0DQorICAgICAgICAjIHVubGVzcyB5b3UncmUgdXNpbmcgZHluYW1pYyBhZGRyZXNzZXMNCisgICAgICAgIGhvc3QgJmx0O2hvc3RuYW1lJmd0OyB7DQorICAgICAgICAgICAgICAgIGhhcmR3YXJlIGV0aGVybmV0ICZsdDtldGhlcm5ldCBhZGRyZXNzJmd0OzsNCisgICAgICAgICAgICAgICAgZml4ZWQtYWRkcmVzcyAmbHQ7aG9zdG5hbWUmZ3Q7Ow0KKyAgICAgICAgfQ0KK308L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Ob3RlIHRoYXQgdGhpcyA8c3Ryb25nPndpbGwgbm90PC9zdHJvbmc+IGJvb3Qgc29tZSBjbGllbnRzIHRoYXQgPHN0cm9uZz53aWxsPC9zdHJvbmc+IGJvb3Qgd2l0aCB0aGUNCisiY29udmVudGlvbmFsIFRGVFAiIGNvbmZpZ3VyYXRpb247IEludGVsIEJvb3QgQ2xpZW50IDMuMCBhbmQgbGF0ZXIgYXJlDQora25vd24gdG8gZmFsbCBpbnRvIHRoaXMgY2F0ZWdvcnkuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9kaGNwX2NvbmZpZ19pc2NfZGhjcGRfb3B0aW9ucyI+REhDUCBDb25maWc6IElTQyBkaGNwZCBvcHRpb25zPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklTQyBkaGNwIDMuMCBzdXBwb3J0cyBhIHJhdGhlciBuaWNlIHN5bnRheCBmb3Igc3BlY2lmeWluZyBjdXN0b20NCitvcHRpb25zOyB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHN5bnRheCBpbiBkaGNwZC5jb25mIGlmIHlvdSBhcmUNCitydW5uaW5nIHRoaXMgdmVyc2lvbiBvZiBkaGNwZDo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPm9wdGlvbiBzcGFjZSBweGVsaW51eDsNCitvcHRpb24gcHhlbGludXgubWFnaWMgICAgICBjb2RlIDIwOCA9IHN0cmluZzsNCitvcHRpb24gcHhlbGludXguY29uZmlnZmlsZSBjb2RlIDIwOSA9IHRleHQ7DQorb3B0aW9uIHB4ZWxpbnV4LnBhdGhwcmVmaXggY29kZSAyMTAgPSB0ZXh0Ow0KK29wdGlvbiBweGVsaW51eC5yZWJvb3R0aW1lIGNvZGUgMjExID0gdW5zaWduZWQgaW50ZWdlciAzMjs8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPk5PVEU6IEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgUFhFTElOVVgsIHRoaXMgd291bGQgb25seSB3b3JrIGFzIGENCisic2l0ZS1vcHRpb24tc3BhY2UiLiAgU2luY2UgUFhFTElOVVggMi4wNywgdGhpcyB3aWxsIHdvcmsgYm90aCBhcyBhDQorInNpdGUtb3B0aW9uLXNwYWNlIiAodW5lbmNhcHN1bGF0ZWQpIGFuZCBhcyBhICJ2ZW5kb3Itb3B0aW9uLXNwYWNlIg0KKyh0eXBlIDQzIGVuY2Fwc3VsYXRlZC4pICBUaGlzIG1heSBhdm9pZCBtZXNzaW5nIHdpdGggdGhlDQorZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0LCBhcyBkZXRhaWxlZCBiZWxvdy48L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGVuLCBpbnNpZGUgeW91ciBQWEVMSU5VWC1ib290aW5nIGdyb3VwIG9yIGNsYXNzICh3aGVyZWV2ZXIgeW91IGhhdmUNCit0aGUgUFhFTElOVVgtcmVsYXRlZCBvcHRpb25zLCBzdWNoIGFzIHRoZSBmaWxlbmFtZSBvcHRpb24pLCB5b3UgY2FuDQorYWRkLCBmb3IgZXhhbXBsZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiMgQWx3YXlzIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBsaW5lcyBmb3IgYWxsIFBYRUxJTlVYIGNsaWVudHMNCitzaXRlLW9wdGlvbi1zcGFjZSAicHhlbGludXgiOw0KK29wdGlvbiBweGVsaW51eC5tYWdpYyBmMTowMDo3NDo3ZTsNCitpZiBleGlzdHMgZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0IHsNCisgICAgICAgICMgQWx3YXlzIHNlbmQgdGhlIFBYRUxJTlVYIG9wdGlvbnMgKHNwZWNpZmllZCBpbiBoZXhhZGVjaW1hbCkNCisgICAgICAgIG9wdGlvbiBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QgPSBjb25jYXQob3B0aW9uIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCxkMCxkMSxkMixkMyk7DQorfQ0KKyMgVGhlc2UgbGluZXMgc2hvdWxkIGJlIGN1c3RvbWl6ZWQgdG8geW91ciBzZXR1cA0KK29wdGlvbiBweGVsaW51eC5jb25maWdmaWxlICJjb25maWdzL2NvbW1vbiI7DQorb3B0aW9uIHB4ZWxpbnV4LnBhdGhwcmVmaXggIi90ZnRwYm9vdC9weGVsaW51eC9maWxlcy8iOw0KK29wdGlvbiBweGVsaW51eC5yZWJvb3R0aW1lIDMwOw0KK2ZpbGVuYW1lICIvdGZ0cGJvb3QvcHhlbGludXgvcHhlbGludXguYmluIjs8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Ob3RlIHRoYXQgdGhlIGNvbmZpZ2ZpbGUgaXMgcmVsYXRpdmUgdG8gdGhlIHBhdGhwcmVmaXg6IHRoaXMgd2lsbCBsb29rDQorZm9yIGEgY29uZmlnIGZpbGUgY2FsbGVkIC90ZnRwYm9vdC9weGVsaW51eC9maWxlcy9jb25maWdzL2NvbW1vbiBvbg0KK3RoZSBURlRQIHNlcnZlci48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgIm9wdGlvbiBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QiIHN0YXRlbWVudCBmb3JjZXMgdGhlIERIQ1ANCitzZXJ2ZXIgdG8gc2VuZCB0aGUgUFhFTElOVVgtc3BlY2lmaWMgb3B0aW9ucywgZXZlbiB0aG91Z2ggdGhleSBhcmUgbm90DQorZXhwbGljaXRseSByZXF1ZXN0ZWQuICBTaW5jZSB0aGUgREhDUCByZXF1ZXN0IGlzIGRvbmUgYmVmb3JlIFBYRUxJTlVYDQoraXMgbG9hZGVkLCB0aGUgUFhFIGNsaWVudCB3b24mIzgyMTc7dCBrbm93IHRvIHJlcXVlc3QgdGhlbS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Vc2luZyBJU0MgZGhjcCAzLjAgeW91IGNhbiBjcmVhdGUgYSBsb3Qgb2YgdGhlc2Ugc3RyaW5ncyBvbiB0aGUgZmx5Lg0KK0ZvciBleGFtcGxlLCB0byB1c2UgdGhlIGhleGFkZWNpbWFsIGZvcm0gb2YgdGhlIGhhcmR3YXJlIGFkZHJlc3MgYXMNCit0aGUgY29uZmlndXJhdGlvbiBmaWxlIG5hbWUsIHlvdSBjb3VsZCBkbyBzb21ldGhpbmcgbGlrZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPnNpdGUtb3B0aW9uLXNwYWNlICJweGVsaW51eCI7DQorb3B0aW9uIHB4ZWxpbnV4Lm1hZ2ljIGYxOjAwOjc0OjdlOw0KK2lmIGV4aXN0cyBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3Qgew0KKyAgICAgICAgIyBBbHdheXMgc2VuZCB0aGUgUFhFTElOVVggb3B0aW9ucyAoc3BlY2lmaWVkIGluIGhleGFkZWNpbWFsKQ0KKyAgICAgICAgb3B0aW9uIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCA9IGNvbmNhdChvcHRpb24gZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0LGQwLGQxLGQyLGQzKTsNCit9DQorb3B0aW9uIHB4ZWxpbnV4LmNvbmZpZ2ZpbGUgPQ0KKyAgICAgICAgY29uY2F0KCJweGVsaW51eC5jZmcvIiwgYmluYXJ5LXRvLWFzY2lpKDE2LCA4LCAiOiIsIGhhcmR3YXJlKSk7DQorZmlsZW5hbWUgIi90ZnRwYm9vdC9weGVsaW51eC5iaW4iOzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklmIHlvdSB1c2VkIHRoaXMgZnJvbSBhIGNsaWVudCB3aG9zZSBFdGhlcm5ldCBhZGRyZXNzIHdhcw0KKzU4OkZBOjg0OkNGOjU1OjBFLCB0aGlzIHdvdWxkIGxvb2sgZm9yIGEgY29uZmlndXJhdGlvbiBmaWxlIG5hbWVkDQorIi90ZnRwYm9vdC9weGVsaW51eC5jZmcvMTo1ODpmYTo4NDpjZjo1NTplIi48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2tub3duX2lzc3VlcyI+S05PV04gSVNTVUVTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgZm9sbG93aW5nIHByb2JsZW1zIGFyZSBrbm93biB3aXRoIFBYRUxJTlVYLCBzbyBmYXI6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InVsaXN0Ij48dWw+DQorPGxpPg0KKzxwPg0KK1RoZSBlcnJvciByZWNvdmVyeSByb3V0aW5lIGRvZXNuJiM4MjE3O3Qgd29yayBxdWl0ZSByaWdodC4gIEZvciByaWdodCBub3csDQorICBpdCBqdXN0IGRvZXMgYSBoYXJkIHJlc2V0IC0gc2VlbXMgZ29vZCBlbm91Z2guDQorPC9wPg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK1dlIHNob3VsZCBwcm9iYWJseSBjYWxsIHRoZSBVRFAgcmVjZWl2ZSBmdW5jdGlvbiBpbiB0aGUga2V5Ym9hcmQNCisgIGVudHJ5IGxvb3AsIHNvIHRoYXQgd2UgYW5zd2VyIEFSUCByZXF1ZXN0cy4NCis8L3A+DQorPC9saT4NCis8bGk+DQorPHA+DQorQm9vdCBzZWN0b3JzL2Rpc2sgaW1hZ2VzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4NCis8L3A+DQorPC9saT4NCis8L3VsPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgeW91IGhhdmUgYWRkaXRpb25hbCBwcm9ibGVtcywgcGxlYXNlIGNvbnRhY3QgdGhlIFN5c2xpbnV4IG1haWxpbmcNCitsaXN0IChzZWUgc3lzbGludXgudHh0IGZvciB0aGUgYWRkcmVzcy4pPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9icm9rZW5fcHhlX3N0YWNrcyI+QnJva2VuIFBYRSBzdGFja3M8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+TG90cyBvZiBQWEUgc3RhY2tzLCBlc3BlY2lhbGx5IG9sZCBvbmVzLCBoYXZlIHZhcmlvdXMgcHJvYmxlbXMgb2YNCit2YXJ5aW5nIGRlZ3JlZXMgb2Ygc2V2ZXJpdHkuICBQbGVhc2Ugc2VlOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+aHR0cDovL3N5c2xpbnV4Lnp5dG9yLmNvbS9oYXJkd2FyZS5waHA8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0ib2xpc3QgbG93ZXJyb21hbiI+PG9sIGNsYXNzPSJsb3dlcnJvbWFuIj4NCis8bGk+DQorPHA+DQorZm9yIGEgbGlzdCBvZiBjdXJyZW50bHkga25vd24gaGFyZHdhcmUgcHJvYmxlbXMsIHdpdGggd29ya2Fyb3VuZHMNCitpZiBrbm93bi4NCis8L3A+DQorPC9saT4NCis8L29sPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlcmUgYXJlIGEgbnVtYmVyIG9mIGV4dHJlbWVseSBicm9rZW4gUFhFIHN0YWNrcyBpbiB0aGUgZmllbGQuICBUaGUNCitnUFhFIHByb2plY3QgKGZvcm1lcmx5IGtub3duIGFzIEV0aGVyYm9vdCkgcHJvdmlkZXMgYW4gb3Blbi1zb3VyY2UgUFhFDQorc3RhY2sgdGhhdCB3b3JrcyB3aXRoIGEgbnVtYmVyIG9mIGNhcmRzLCBhbmQgd2hpY2ggY2FuIGJlIGxvYWRlZCBmcm9tDQorYSBDRC1ST00sIFVTQiBrZXksIG9yIGZsb3BweSBpZiBkZXNpcmVkLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkluZm9ybWF0aW9uIG9uIGdQWEUgaXMgYXZhaWxhYmxlIGZyb206PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5odHRwOi8vd3d3LmV0aGVyYm9vdC5vcmcvPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9Im9saXN0IGxvd2Vycm9tYW4iPjxvbCBjbGFzcz0ibG93ZXJyb21hbiI+DQorPGxpPg0KKzxwPg0KK2FuZCByZWFkeS10by11c2UgUk9NIG9yIGRpc2sgaW1hZ2VzIGZyb206DQorPC9wPg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5odHRwOi8vd3d3LnJvbS1vLW1hdGljLm5ldC88L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9saT4NCis8L29sPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U29tZSBjYXJkcywgbGlrZSBtYXkgc3lzdGVtcyB3aXRoIHRoZSBTaVMgOTAwLCBoYXMgYSBQWEUgc3RhY2sgd2hpY2gNCit3b3JrcyBqdXN0IGJhcmVseSB3ZWxsIGVub3VnaCB0byBsb2FkIGEgc2luZ2xlIGZpbGUsIGJ1dCBkb2VzbiYjODIxNzt0DQoraGFuZGxlIHRoZSBtb3JlIGFkdmFuY2VkIGl0ZW1zIHJlcXVpcmVkIGJ5IFBYRUxJTlVYLiAgSWYgc28sIGl0IGlzDQorcG9zc2libGUgdG8gdXNlIHRoZSBidWlsdC1pbiBQWEUgc3RhY2sgdG8gbG9hZCBnUFhFLCB3aGljaCBjYW4gdGhlbg0KK2xvYWQgUFhFTElOVVguICBTZWU6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5odHRwOi8vd3d3LmV0aGVyYm9vdC5vcmcvd2lraS9weGVjaGFpbmluZzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfbm90ZXMiPk5PVEVTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX210ZnRwIj5NVEZUUDwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5QWEVMSU5VWCBkb2VzIG5vdCBzdXBwb3J0IE1URlRQLCBhbmQgdGhlcmUgYXJlIG5vIHBsYW5zIG9mIGRvaW5nIHNvLCBhcw0KK01URlRQIGlzIGluaGVyZW50bHkgYnJva2VuIGZvciBmaWxlcyBtb3JlIHRoYW4gNjU1MzUgcGFja2V0cyAoYWJvdXQgOTINCitNQikgaW4gc2l6ZS4gIEl0IGlzIG9mIGNvdXJzZSBwb3NzaWJsZSB0byB1c2UgTVRGVFAgZm9yIHRoZSBpbml0aWFsDQorYm9vdCwgaWYgeW91IGhhdmUgc3VjaCBhIHNldHVwLiAgTVRGVFAgc2VydmVyIHNldHVwIGlzIGJleW9uZCB0aGUgc2NvcGUNCitvZiB0aGlzIGRvY3VtZW50LjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfZXJyb3JfcmVjb3ZlcnkiPkVycm9yIFJlY292ZXJ5PC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklmIHRoZSBib290IGZhaWxzLCBQWEVMSU5VWCAodW5saWtlIFNZU0xJTlVYKSB3aWxsIG5vdCB3YWl0IGZvcmV2ZXI7DQorcmF0aGVyLCBpZiBpdCBoYXMgbm90IHJlY2VpdmVkIGFueSBpbnB1dCBmb3IgYXBwcm94aW1hdGVseSBmaXZlDQorbWludXRlcyBhZnRlciBkaXNwbGF5aW5nIGFuIGVycm9yIG1lc3NhZ2UsIGl0IHdpbGwgcmVzZXQgdGhlIG1hY2hpbmUuDQorVGhpcyBhbGxvd3MgYW4gdW5hdHRlbmRlZCBtYWNoaW5lIHRvIHJlY292ZXIgaW4gY2FzZSBpdCBoYWQgYmFkIGVub3VnaA0KK2x1Y2sgb2YgdHJ5aW5nIHRvIGJvb3QgYXQgdGhlIHNhbWUgdGltZSB0aGUgVEZUUCBzZXJ2ZXIgZ29lcyBkb3duLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfc2VlX2Fsc28iPlNFRSBBTFNPPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPnN5c2xpbnV4LmNmZzwvc3Ryb25nPig1KSwgPHN0cm9uZz5zeXNsaW51eC1jbGk8L3N0cm9uZz4oMSksIDxzdHJvbmc+bGlsbzwvc3Ryb25nPig4KSwgPHN0cm9uZz5rZXl0YWItbGlsby5wbDwvc3Ryb25nPig4KSwNCis8c3Ryb25nPmZkaXNrPC9zdHJvbmc+KDgpLCA8c3Ryb25nPm1rZnM8L3N0cm9uZz4oOCksIDxzdHJvbmc+c3VwZXJmb3JtYXQ8L3N0cm9uZz4oMSkuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9hdXRob3IiPkFVVEhPUjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhpcyBBc2NpaURvYyBkZXJpdmVkIGRvY3VtZW50IGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwNCis8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IGRvY3VtZW50YXRpb24gYnkgSC4gUGV0ZXIgQW52aW4gJmx0OzxhIGhyZWY9Im1haWx0bzpocGFAenl0b3IuY29tIj5ocGFAenl0b3IuY29tPC9hPiZndDsuICBUaGUgY29udmVyc2lvbg0KK3RvIGFuIEFzY2lpRG9jIHdhcyBtYWRlIGJ5IEdlbmUgQ3VtbSAmbHQ7PGEgaHJlZj0ibWFpbHRvOmdlbmUuY3VtbUBnbWFpbC5jb20iPmdlbmUuY3VtbUBnbWFpbC5jb208L2E+Jmd0OzwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJmb290bm90ZXMiPjxociAvPjwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3RlciI+DQorPGRpdiBpZD0iZm9vdGVyLXRleHQiPg0KK0xhc3QgdXBkYXRlZCAyMDE0LTAxLTE3IDE2OjA5OjU2IFBTVA0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZWZpMzIvdHh0L2h0bWwvc3lzbGludXgtY2xpLmh0bWwgYi9lZmkzMi90eHQvaHRtbC9zeXNsaW51eC1jbGkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM4NDNmCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvdHh0L2h0bWwvc3lzbGludXgtY2xpLmh0bWwKQEAgLTAsMCArMSw4MzggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiINCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCis8aGVhZD4NCis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9ImFwcGxpY2F0aW9uL3hodG1sK3htbDsgY2hhcnNldD1VVEYtOCIgLz4NCis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkFzY2lpRG9jIDguNi44IiAvPg0KKzx0aXRsZT5zeXNsaW51eC1jbGkoMSk8L3RpdGxlPg0KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQorLyogU2hhcmVkIENTUyBmb3IgQXNjaWlEb2MgeGh0bWwxMSBhbmQgaHRtbDUgYmFja2VuZHMgKi8NCisNCisvKiBEZWZhdWx0IGZvbnQuICovDQorYm9keSB7DQorICBmb250LWZhbWlseTogR2VvcmdpYSxzZXJpZjsNCit9DQorDQorLyogVGl0bGUgZm9udC4gKi8NCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LA0KK2Rpdi50aXRsZSwgY2FwdGlvbi50aXRsZSwNCit0aGVhZCwgcC50YWJsZS5oZWFkZXIsDQorI3RvY3RpdGxlLA0KKyNhdXRob3IsICNyZXZudW1iZXIsICNyZXZkYXRlLCAjcmV2cmVtYXJrLA0KKyNmb290ZXIgew0KKyAgZm9udC1mYW1pbHk6IEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmOw0KK30NCisNCitib2R5IHsNCisgIG1hcmdpbjogMWVtIDUlIDFlbSA1JTsNCit9DQorDQorYSB7DQorICBjb2xvcjogYmx1ZTsNCisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KK30NCithOnZpc2l0ZWQgew0KKyAgY29sb3I6IGZ1Y2hzaWE7DQorfQ0KKw0KK2VtIHsNCisgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCisNCitzdHJvbmcgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzA4MzE5NDsNCit9DQorDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIG1hcmdpbi10b3A6IDEuMmVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorICBsaW5lLWhlaWdodDogMS4zOw0KK30NCisNCitoMSwgaDIsIGgzIHsNCisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBzaWx2ZXI7DQorfQ0KK2gyIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCit9DQoraDMgew0KKyAgZmxvYXQ6IGxlZnQ7DQorfQ0KK2gzICsgKiB7DQorICBjbGVhcjogbGVmdDsNCit9DQoraDUgew0KKyAgZm9udC1zaXplOiAxLjBlbTsNCit9DQorDQorZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAwOw0KK30NCisNCitociB7DQorICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7DQorfQ0KKw0KK3Agew0KKyAgbWFyZ2luLXRvcDogMC41ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCit9DQorDQordWwsIG9sLCBsaSA+IHAgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQordWwgPiBsaSAgICAgeyBjb2xvcjogI2FhYTsgfQ0KK3VsID4gbGkgPiAqIHsgY29sb3I6IGJsYWNrOyB9DQorDQorLm1vbm9zcGFjZWQsIGNvZGUsIHByZSB7DQorICBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlOw0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KKyAgY29sb3I6IG5hdnk7DQorICBwYWRkaW5nOiAwOw0KKyAgbWFyZ2luOiAwOw0KK30NCisNCisNCisjYXV0aG9yIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBmb250LXNpemU6IDEuMWVtOw0KK30NCisjZW1haWwgew0KK30NCisjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyayB7DQorfQ0KKw0KKyNmb290ZXIgew0KKyAgZm9udC1zaXplOiBzbWFsbDsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICBtYXJnaW4tdG9wOiA0LjBlbTsNCit9DQorI2Zvb3Rlci10ZXh0IHsNCisgIGZsb2F0OiBsZWZ0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisjZm9vdGVyLWJhZGdlcyB7DQorICBmbG9hdDogcmlnaHQ7DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KKyNwcmVhbWJsZSB7DQorICBtYXJnaW4tdG9wOiAxLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCitkaXYuaW1hZ2VibG9jaywgZGl2LmV4YW1wbGVibG9jaywgZGl2LnZlcnNlYmxvY2ssDQorZGl2LnF1b3RlYmxvY2ssIGRpdi5saXRlcmFsYmxvY2ssIGRpdi5saXN0aW5nYmxvY2ssIGRpdi5zaWRlYmFyYmxvY2ssDQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCitkaXYuYWRtb25pdGlvbmJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDIuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMi4wZW07DQorICBtYXJnaW4tcmlnaHQ6IDEwJTsNCisgIGNvbG9yOiAjNjA2MDYwOw0KK30NCisNCitkaXYuY29udGVudCB7IC8qIEJsb2NrIGVsZW1lbnQgY29udGVudC4gKi8NCisgIHBhZGRpbmc6IDA7DQorfQ0KKw0KKy8qIEJsb2NrIGVsZW1lbnQgdGl0bGVzLiAqLw0KK2Rpdi50aXRsZSwgY2FwdGlvbi50aXRsZSB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KK2Rpdi50aXRsZSArICogew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQorDQordGQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCBkaXYudGl0bGU6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KK2Rpdi5jb250ZW50ICsgZGl2LnRpdGxlIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCisNCitkaXYuc2lkZWJhcmJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYmFja2dyb3VuZDogI2ZmZmZlZTsNCisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7DQorICBib3JkZXItbGVmdDogNHB4IHNvbGlkICNmMGYwZjA7DQorICBwYWRkaW5nOiAwLjVlbTsNCit9DQorDQorZGl2Lmxpc3RpbmdibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7DQorICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmMGYwZjA7DQorICBiYWNrZ3JvdW5kOiAjZjhmOGY4Ow0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYudmVyc2VibG9jayB7DQorICBwYWRkaW5nLWxlZnQ6IDEuMGVtOw0KKyAgbWFyZ2luLWxlZnQ6IDEuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmMGYwZjA7DQorICBjb2xvcjogIzg4ODsNCit9DQorDQorZGl2LnF1b3RlYmxvY2sgPiBkaXYuYXR0cmlidXRpb24gew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgdGV4dC1hbGlnbjogcmlnaHQ7DQorfQ0KKw0KK2Rpdi52ZXJzZWJsb2NrID4gcHJlLmNvbnRlbnQgew0KKyAgZm9udC1mYW1pbHk6IGluaGVyaXQ7DQorICBmb250LXNpemU6IGluaGVyaXQ7DQorfQ0KK2Rpdi52ZXJzZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjc1ZW07DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisvKiBERVBSRUNBVEVEOiBQcmUgdmVyc2lvbiA4LjIuNyB2ZXJzZSBzdHlsZSBsaXRlcmFsIGJsb2NrLiAqLw0KK2Rpdi52ZXJzZWJsb2NrICsgZGl2LmF0dHJpYnV0aW9uIHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KKw0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgLmljb24gew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB0ZC5jb250ZW50IHsNCisgIHBhZGRpbmctbGVmdDogMC41ZW07DQorICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNkZGRkZGQ7DQorfQ0KKw0KK2Rpdi5leGFtcGxlYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNkZGRkZGQ7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KK30NCisNCitkaXYuaW1hZ2VibG9jayBkaXYuY29udGVudCB7IHBhZGRpbmctbGVmdDogMDsgfQ0KK3NwYW4uaW1hZ2UgaW1nIHsgYm9yZGVyLXN0eWxlOiBub25lOyB9DQorYS5pbWFnZTp2aXNpdGVkIHsgY29sb3I6IHdoaXRlOyB9DQorDQorZGwgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZHQgew0KKyAgbWFyZ2luLXRvcDogMC41ZW07DQorICBtYXJnaW4tYm90dG9tOiAwOw0KKyAgZm9udC1zdHlsZTogbm9ybWFsOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KK2RkID4gKjpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjFlbTsNCit9DQorDQordWwsIG9sIHsNCisgICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTsNCit9DQorb2wuYXJhYmljIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsNCit9DQorb2wubG93ZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhOw0KK30NCitvbC51cHBlcmFscGhhIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogdXBwZXItYWxwaGE7DQorfQ0KK29sLmxvd2Vycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1yb21hbjsNCit9DQorb2wudXBwZXJyb21hbiB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLXJvbWFuOw0KK30NCisNCitkaXYuY29tcGFjdCB1bCwgZGl2LmNvbXBhY3Qgb2wsDQorZGl2LmNvbXBhY3QgcCwgZGl2LmNvbXBhY3QgcCwNCitkaXYuY29tcGFjdCBkaXYsIGRpdi5jb21wYWN0IGRpdiB7DQorICBtYXJnaW4tdG9wOiAwLjFlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuMWVtOw0KK30NCisNCit0Zm9vdCB7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQordGQgPiBkaXYudmVyc2Ugew0KKyAgd2hpdGUtc3BhY2U6IHByZTsNCit9DQorDQorZGl2LmhkbGlzdCB7DQorICBtYXJnaW4tdG9wOiAwLjhlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuOGVtOw0KK30NCitkaXYuaGRsaXN0IHRyIHsNCisgIHBhZGRpbmctYm90dG9tOiAxNXB4Ow0KK30NCitkdC5oZGxpc3QxLnN0cm9uZywgdGQuaGRsaXN0MS5zdHJvbmcgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkLmhkbGlzdDEgew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIHBhZGRpbmctcmlnaHQ6IDAuOGVtOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KK3RkLmhkbGlzdDIgew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmhkbGlzdC5jb21wYWN0IHRyIHsNCisgIG1hcmdpbjogMDsNCisgIHBhZGRpbmctYm90dG9tOiAwOw0KK30NCisNCisuY29tbWVudCB7DQorICBiYWNrZ3JvdW5kOiB5ZWxsb3c7DQorfQ0KKw0KKy5mb290bm90ZSwgLmZvb3Rub3RlcmVmIHsNCisgIGZvbnQtc2l6ZTogMC44ZW07DQorfQ0KKw0KK3NwYW4uZm9vdG5vdGUsIHNwYW4uZm9vdG5vdGVyZWYgew0KKyAgdmVydGljYWwtYWxpZ246IHN1cGVyOw0KK30NCisNCisjZm9vdG5vdGVzIHsNCisgIG1hcmdpbjogMjBweCAwIDIwcHggMDsNCisgIHBhZGRpbmc6IDdweCAwIDAgMDsNCit9DQorDQorI2Zvb3Rub3RlcyBkaXYuZm9vdG5vdGUgew0KKyAgbWFyZ2luOiAwIDAgNXB4IDA7DQorfQ0KKw0KKyNmb290bm90ZXMgaHIgew0KKyAgYm9yZGVyOiBub25lOw0KKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHNpbHZlcjsNCisgIGhlaWdodDogMXB4Ow0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCisgIG1hcmdpbi1sZWZ0OiAwOw0KKyAgd2lkdGg6IDIwJTsNCisgIG1pbi13aWR0aDogMTAwcHg7DQorfQ0KKw0KK2Rpdi5jb2xpc3QgdGQgew0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorICBwYWRkaW5nLWJvdHRvbTogMC4zZW07DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCitkaXYuY29saXN0IHRkIGltZyB7DQorICBtYXJnaW4tdG9wOiAwLjNlbTsNCit9DQorDQorQG1lZGlhIHByaW50IHsNCisgICNmb290ZXItYmFkZ2VzIHsgZGlzcGxheTogbm9uZTsgfQ0KK30NCisNCisjdG9jIHsNCisgIG1hcmdpbi1ib3R0b206IDIuNWVtOw0KK30NCisNCisjdG9jdGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuMWVtOw0KK30NCisNCitkaXYudG9jbGV2ZWwwLCBkaXYudG9jbGV2ZWwxLCBkaXYudG9jbGV2ZWwyLCBkaXYudG9jbGV2ZWwzLCBkaXYudG9jbGV2ZWw0IHsNCisgIG1hcmdpbi10b3A6IDA7DQorICBtYXJnaW4tYm90dG9tOiAwOw0KK30NCitkaXYudG9jbGV2ZWwyIHsNCisgIG1hcmdpbi1sZWZ0OiAyZW07DQorICBmb250LXNpemU6IDAuOWVtOw0KK30NCitkaXYudG9jbGV2ZWwzIHsNCisgIG1hcmdpbi1sZWZ0OiA0ZW07DQorICBmb250LXNpemU6IDAuOWVtOw0KK30NCitkaXYudG9jbGV2ZWw0IHsNCisgIG1hcmdpbi1sZWZ0OiA2ZW07DQorICBmb250LXNpemU6IDAuOWVtOw0KK30NCisNCitzcGFuLmFxdWEgeyBjb2xvcjogYXF1YTsgfQ0KK3NwYW4uYmxhY2sgeyBjb2xvcjogYmxhY2s7IH0NCitzcGFuLmJsdWUgeyBjb2xvcjogYmx1ZTsgfQ0KK3NwYW4uZnVjaHNpYSB7IGNvbG9yOiBmdWNoc2lhOyB9DQorc3Bhbi5ncmF5IHsgY29sb3I6IGdyYXk7IH0NCitzcGFuLmdyZWVuIHsgY29sb3I6IGdyZWVuOyB9DQorc3Bhbi5saW1lIHsgY29sb3I6IGxpbWU7IH0NCitzcGFuLm1hcm9vbiB7IGNvbG9yOiBtYXJvb247IH0NCitzcGFuLm5hdnkgeyBjb2xvcjogbmF2eTsgfQ0KK3NwYW4ub2xpdmUgeyBjb2xvcjogb2xpdmU7IH0NCitzcGFuLnB1cnBsZSB7IGNvbG9yOiBwdXJwbGU7IH0NCitzcGFuLnJlZCB7IGNvbG9yOiByZWQ7IH0NCitzcGFuLnNpbHZlciB7IGNvbG9yOiBzaWx2ZXI7IH0NCitzcGFuLnRlYWwgeyBjb2xvcjogdGVhbDsgfQ0KK3NwYW4ud2hpdGUgeyBjb2xvcjogd2hpdGU7IH0NCitzcGFuLnllbGxvdyB7IGNvbG9yOiB5ZWxsb3c7IH0NCisNCitzcGFuLmFxdWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGFxdWE7IH0NCitzcGFuLmJsYWNrLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBibGFjazsgfQ0KK3NwYW4uYmx1ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmx1ZTsgfQ0KK3NwYW4uZnVjaHNpYS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZ3JheTsgfQ0KK3NwYW4uZ3JlZW4tYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyZWVuOyB9DQorc3Bhbi5saW1lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24tYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG1hcm9vbjsgfQ0KK3NwYW4ubmF2eS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbmF2eTsgfQ0KK3NwYW4ub2xpdmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHB1cnBsZTsgfQ0KK3NwYW4ucmVkLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiByZWQ7IH0NCitzcGFuLnNpbHZlci1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogc2lsdmVyOyB9DQorc3Bhbi50ZWFsLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB0ZWFsOyB9DQorc3Bhbi53aGl0ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogd2hpdGU7IH0NCitzcGFuLnllbGxvdy1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogeWVsbG93OyB9DQorDQorc3Bhbi5iaWcgeyBmb250LXNpemU6IDJlbTsgfQ0KK3NwYW4uc21hbGwgeyBmb250LXNpemU6IDAuNmVtOyB9DQorDQorc3Bhbi51bmRlcmxpbmUgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQ0KK3NwYW4ub3ZlcmxpbmUgeyB0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lOyB9DQorc3Bhbi5saW5lLXRocm91Z2ggeyB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsgfQ0KKw0KK2Rpdi51bmJyZWFrYWJsZSB7IHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsgfQ0KKw0KKw0KKy8qDQorICogeGh0bWwxMSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCitkaXYudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlIHsNCisgIGJvcmRlcjogM3B4IHNvbGlkICM1MjdiYmQ7DQorfQ0KK3RoZWFkLCBwLnRhYmxlLmhlYWRlciB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjNTI3YmJkOw0KK30NCitwLnRhYmxlIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKy8qIEJlY2F1c2UgdGhlIHRhYmxlIGZyYW1lIGF0dHJpYnV0ZSBpcyBvdmVycmlkZW4gYnkgQ1NTIGluIG1vc3QgYnJvd3NlcnMuICovDQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0idm9pZCJdIHsNCisgIGJvcmRlci1zdHlsZTogbm9uZTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0iaHNpZGVzIl0gew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7DQorICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZzaWRlcyJdIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IG5vbmU7DQorICBib3JkZXItYm90dG9tLXN0eWxlOiBub25lOw0KK30NCisNCisNCisvKg0KKyAqIGh0bWw1IHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK3RhYmxlLnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQordGhlYWQsIHAudGFibGVibG9jay5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2sgew0KKyAgYm9yZGVyLXdpZHRoOiAzcHg7DQorICBib3JkZXItc3BhY2luZzogMHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCisgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7DQorfQ0KK3RoLnRhYmxlYmxvY2ssIHRkLnRhYmxlYmxvY2sgew0KKyAgYm9yZGVyLXdpZHRoOiAxcHg7DQorICBwYWRkaW5nOiA0cHg7DQorICBib3JkZXItc3R5bGU6IHNvbGlkOw0KKyAgYm9yZGVyLWNvbG9yOiAjNTI3YmJkOw0KK30NCisNCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXRvcGJvdCB7DQorICBib3JkZXItbGVmdC1zdHlsZTogaGlkZGVuOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBoaWRkZW47DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtc2lkZXMgew0KKyAgYm9yZGVyLXRvcC1zdHlsZTogaGlkZGVuOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLW5vbmUgew0KKyAgYm9yZGVyLXN0eWxlOiBoaWRkZW47DQorfQ0KKw0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWxlZnQsIHRkLnRhYmxlYmxvY2suaGFsaWduLWxlZnQgew0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tY2VudGVyLCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1jZW50ZXIgew0KKyAgdGV4dC1hbGlnbjogY2VudGVyOw0KK30NCit0aC50YWJsZWJsb2NrLmhhbGlnbi1yaWdodCwgdGQudGFibGVibG9jay5oYWxpZ24tcmlnaHQgew0KKyAgdGV4dC1hbGlnbjogcmlnaHQ7DQorfQ0KKw0KK3RoLnRhYmxlYmxvY2sudmFsaWduLXRvcCwgdGQudGFibGVibG9jay52YWxpZ24tdG9wIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK3RoLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSwgdGQudGFibGVibG9jay52YWxpZ24tbWlkZGxlIHsNCisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQorfQ0KK3RoLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSwgdGQudGFibGVibG9jay52YWxpZ24tYm90dG9tIHsNCisgIHZlcnRpY2FsLWFsaWduOiBib3R0b207DQorfQ0KKw0KKw0KKy8qDQorICogbWFucGFnZSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCitib2R5Lm1hbnBhZ2UgaDEgew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjsNCisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBzaWx2ZXI7DQorfQ0KK2JvZHkubWFucGFnZSBoMiB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2JvZHkubWFucGFnZSBkaXYuc2VjdGlvbmJvZHkgew0KKyAgbWFyZ2luLWxlZnQ6IDNlbTsNCit9DQorDQorQG1lZGlhIHByaW50IHsNCisgIGJvZHkubWFucGFnZSBkaXYjdG9jIHsgZGlzcGxheTogbm9uZTsgfQ0KK30NCisNCisNCis8L3N0eWxlPg0KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCisvKjwhW0NEQVRBWyovDQordmFyIGFzY2lpZG9jID0geyAgLy8gTmFtZXNwYWNlLg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIFRhYmxlIE9mIENvbnRlbnRzIGdlbmVyYXRvcg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qIEF1dGhvcjogTWloYWkgQmF6b24sIFNlcHRlbWJlciAyMDAyDQorICogaHR0cDovL3N0dWRlbnRzLmluZm9pYXNpLnJvL35taXNob28NCisgKg0KKyAqIFRhYmxlIE9mIENvbnRlbnQgZ2VuZXJhdG9yDQorICogVmVyc2lvbjogMC40DQorICoNCisgKiBGZWVsIGZyZWUgdG8gdXNlIHRoaXMgc2NyaXB0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljDQorICogTGljZW5zZSwgYXMgbG9uZyBhcyB5b3UgZG8gbm90IHJlbW92ZSBvciBhbHRlciB0aGlzIG5vdGljZS4NCisgKi8NCisNCisgLyogbW9kaWZpZWQgYnkgVHJveSBELiBIYW5zb24sIFNlcHRlbWJlciAyMDA2LiBMaWNlbnNlOiBHUEwgKi8NCisgLyogbW9kaWZpZWQgYnkgU3R1YXJ0IFJhY2toYW0sIDIwMDYsIDIwMDkuIExpY2Vuc2U6IEdQTCAqLw0KKw0KKy8vIHRvY2xldmVscyA9IDEuLjQuDQordG9jOiBmdW5jdGlvbiAodG9jbGV2ZWxzKSB7DQorDQorICBmdW5jdGlvbiBnZXRUZXh0KGVsKSB7DQorICAgIHZhciB0ZXh0ID0gIiI7DQorICAgIGZvciAodmFyIGkgPSBlbC5maXJzdENoaWxkOyBpICE9IG51bGw7IGkgPSBpLm5leHRTaWJsaW5nKSB7DQorICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykgLy8gSUUgZG9lc24ndCBzcGVhayBjb25zdGFudHMuDQorICAgICAgICB0ZXh0ICs9IGkuZGF0YTsNCisgICAgICBlbHNlIGlmIChpLmZpcnN0Q2hpbGQgIT0gbnVsbCkNCisgICAgICAgIHRleHQgKz0gZ2V0VGV4dChpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gdGV4dDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIFRvY0VudHJ5KGVsLCB0ZXh0LCB0b2NsZXZlbCkgew0KKyAgICB0aGlzLmVsZW1lbnQgPSBlbDsNCisgICAgdGhpcy50ZXh0ID0gdGV4dDsNCisgICAgdGhpcy50b2NsZXZlbCA9IHRvY2xldmVsOw0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gdG9jRW50cmllcyhlbCwgdG9jbGV2ZWxzKSB7DQorICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk7DQorICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1toSF0oWzEtJysodG9jbGV2ZWxzKzEpKyddKScpOw0KKyAgICAvLyBGdW5jdGlvbiB0aGF0IHNjYW5zIHRoZSBET00gdHJlZSBmb3IgaGVhZGVyIGVsZW1lbnRzICh0aGUgRE9NMg0KKyAgICAvLyBub2RlSXRlcmF0b3IgQVBJIHdvdWxkIGJlIGEgYmV0dGVyIHRlY2huaXF1ZSBidXQgbm90IHN1cHBvcnRlZCBieSBhbGwNCisgICAgLy8gYnJvd3NlcnMpLg0KKyAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uIChlbCkgew0KKyAgICAgIGZvciAodmFyIGkgPSBlbC5maXJzdENoaWxkOyBpICE9IG51bGw7IGkgPSBpLm5leHRTaWJsaW5nKSB7DQorICAgICAgICBpZiAoaS5ub2RlVHlwZSA9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7DQorICAgICAgICAgIHZhciBtbyA9IHJlLmV4ZWMoaS50YWdOYW1lKTsNCisgICAgICAgICAgaWYgKG1vICYmIChpLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSB8fCBpLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIikpICE9ICJmbG9hdCIpIHsNCisgICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBuZXcgVG9jRW50cnkoaSwgZ2V0VGV4dChpKSwgbW9bMV0tMSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaXRlcmF0ZShpKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgaXRlcmF0ZShlbCk7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorDQorICB2YXIgdG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvYyIpOw0KKyAgaWYgKCF0b2MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgLy8gRGVsZXRlIGV4aXN0aW5nIFRPQyBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBUT0MuDQorICB2YXIgdG9jRW50cmllc1RvUmVtb3ZlID0gW107DQorICB2YXIgaTsNCisgIGZvciAoaSA9IDA7IGkgPCB0b2MuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgew0KKyAgICB2YXIgZW50cnkgPSB0b2MuY2hpbGROb2Rlc1tpXTsNCisgICAgaWYgKGVudHJ5Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2RpdicNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKQ0KKyAgICAgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLm1hdGNoKC9edG9jbGV2ZWwvKSkNCisgICAgICB0b2NFbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jRW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIHRvYy5yZW1vdmVDaGlsZCh0b2NFbnRyaWVzVG9SZW1vdmVbaV0pOw0KKyAgfQ0KKw0KKyAgLy8gUmVidWlsZCBUT0MgZW50cmllcy4NCisgIHZhciBlbnRyaWVzID0gdG9jRW50cmllcyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGVudCIpLCB0b2NsZXZlbHMpOw0KKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7DQorICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaV07DQorICAgIGlmIChlbnRyeS5lbGVtZW50LmlkID09ICIiKQ0KKyAgICAgIGVudHJ5LmVsZW1lbnQuaWQgPSAiX3RvY18iICsgaTsNCisgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7DQorICAgIGEuaHJlZiA9ICIjIiArIGVudHJ5LmVsZW1lbnQuaWQ7DQorICAgIGEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZW50cnkudGV4dCkpOw0KKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQorICAgIGRpdi5hcHBlbmRDaGlsZChhKTsNCisgICAgZGl2LmNsYXNzTmFtZSA9ICJ0b2NsZXZlbCIgKyBlbnRyeS50b2NsZXZlbDsNCisgICAgdG9jLmFwcGVuZENoaWxkKGRpdik7DQorICB9DQorICBpZiAoZW50cmllcy5sZW5ndGggPT0gMCkNCisgICAgdG9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9jKTsNCit9LA0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEZvb3Rub3RlcyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBCYXNlZCBvbiBmb290bm90ZSBnZW5lcmF0aW9uIGNvZGUgZnJvbToNCisgKiBodHRwOi8vd3d3LmJyYW5kc3BhbmtpbmduZXcubmV0L2FyY2hpdmUvMjAwNS8wNy9mb3JtYXRfZm9vdG5vdGUuaHRtbA0KKyAqLw0KKw0KK2Zvb3Rub3RlczogZnVuY3Rpb24gKCkgew0KKyAgLy8gRGVsZXRlIGV4aXN0aW5nIGZvb3Rub3RlIGVudHJpZXMgaW4gY2FzZSB3ZSdyZSByZWxvYWRpbmcgdGhlIGZvb3Rub2Rlcy4NCisgIHZhciBpOw0KKyAgdmFyIG5vdGVob2xkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9vdG5vdGVzIik7DQorICBpZiAoIW5vdGVob2xkZXIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgdmFyIGVudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgZm9yIChpID0gMDsgaSA8IG5vdGVob2xkZXIuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgew0KKyAgICB2YXIgZW50cnkgPSBub3RlaG9sZGVyLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSA9PSAiZm9vdG5vdGUiKQ0KKyAgICAgIGVudHJpZXNUb1JlbW92ZS5wdXNoKGVudHJ5KTsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCisgICAgbm90ZWhvbGRlci5yZW1vdmVDaGlsZChlbnRyaWVzVG9SZW1vdmVbaV0pOw0KKyAgfQ0KKw0KKyAgLy8gUmVidWlsZCBmb290bm90ZSBlbnRyaWVzLg0KKyAgdmFyIGNvbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGVudCIpOw0KKyAgdmFyIHNwYW5zID0gY29udC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KKyAgdmFyIHJlZnMgPSB7fTsNCisgIHZhciBuID0gMDsNCisgIGZvciAoaT0wOyBpPHNwYW5zLmxlbmd0aDsgaSsrKSB7DQorICAgIGlmIChzcGFuc1tpXS5jbGFzc05hbWUgPT0gImZvb3Rub3RlIikgew0KKyAgICAgIG4rKzsNCisgICAgICB2YXIgbm90ZSA9IHNwYW5zW2ldLmdldEF0dHJpYnV0ZSgiZGF0YS1ub3RlIik7DQorICAgICAgaWYgKCFub3RlKSB7DQorICAgICAgICAvLyBVc2UgW1xzXFNdIGluIHBsYWNlIG9mIC4gc28gbXVsdGktbGluZSBtYXRjaGVzIHdvcmsuDQorICAgICAgICAvLyBCZWNhdXNlIEphdmFTY3JpcHQgaGFzIG5vIHMgKGRvdGFsbCkgcmVnZXggZmxhZy4NCisgICAgICAgIG5vdGUgPSBzcGFuc1tpXS5pbm5lckhUTUwubWF0Y2goL1xzKlxbKFtcc1xTXSopXVxzKi8pWzFdOw0KKyAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0NCisgICAgICAgICAgIls8YSBpZD0nX2Zvb3Rub3RlcmVmXyIgKyBuICsgIicgaHJlZj0nI19mb290bm90ZV8iICsgbiArDQorICAgICAgICAgICInIHRpdGxlPSdWaWV3IGZvb3Rub3RlJyBjbGFzcz0nZm9vdG5vdGUnPiIgKyBuICsgIjwvYT5dIjsNCisgICAgICAgIHNwYW5zW2ldLnNldEF0dHJpYnV0ZSgiZGF0YS1ub3RlIiwgbm90ZSk7DQorICAgICAgfQ0KKyAgICAgIG5vdGVob2xkZXIuaW5uZXJIVE1MICs9DQorICAgICAgICAiPGRpdiBjbGFzcz0nZm9vdG5vdGUnIGlkPSdfZm9vdG5vdGVfIiArIG4gKyAiJz4iICsNCisgICAgICAgICI8YSBocmVmPScjX2Zvb3Rub3RlcmVmXyIgKyBuICsgIicgdGl0bGU9J1JldHVybiB0byB0ZXh0Jz4iICsNCisgICAgICAgIG4gKyAiPC9hPi4gIiArIG5vdGUgKyAiPC9kaXY+IjsNCisgICAgICB2YXIgaWQgPXNwYW5zW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsNCisgICAgICBpZiAoaWQgIT0gbnVsbCkgcmVmc1siIyIraWRdID0gbjsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG4gPT0gMCkNCisgICAgbm90ZWhvbGRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vdGVob2xkZXIpOw0KKyAgZWxzZSB7DQorICAgIC8vIFByb2Nlc3MgZm9vdG5vdGVyZWZzLg0KKyAgICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICAgIGlmIChzcGFuc1tpXS5jbGFzc05hbWUgPT0gImZvb3Rub3RlcmVmIikgew0KKyAgICAgICAgdmFyIGhyZWYgPSBzcGFuc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLmdldEF0dHJpYnV0ZSgiaHJlZiIpOw0KKyAgICAgICAgaHJlZiA9IGhyZWYubWF0Y2goLyMuKi8pWzBdOyAgLy8gQmVjYXVzZSBJRSByZXR1cm4gZnVsbCBVUkwuDQorICAgICAgICBuID0gcmVmc1tocmVmXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaHJlZj0nI19mb290bm90ZV8iICsgbiArDQorICAgICAgICAgICInIHRpdGxlPSdWaWV3IGZvb3Rub3RlJyBjbGFzcz0nZm9vdG5vdGUnPiIgKyBuICsgIjwvYT5dIjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9LA0KKw0KK2luc3RhbGw6IGZ1bmN0aW9uKHRvY2xldmVscykgew0KKyAgdmFyIHRpbWVySWQ7DQorDQorICBmdW5jdGlvbiByZWluc3RhbGwoKSB7DQorICAgIGFzY2lpZG9jLmZvb3Rub3RlcygpOw0KKyAgICBpZiAodG9jbGV2ZWxzKSB7DQorICAgICAgYXNjaWlkb2MudG9jKHRvY2xldmVscyk7DQorICAgIH0NCisgIH0NCisNCisgIGZ1bmN0aW9uIHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyKCkgew0KKyAgICBjbGVhckludGVydmFsKHRpbWVySWQpOw0KKyAgICByZWluc3RhbGwoKTsNCisgIH0NCisNCisgIHRpbWVySWQgPSBzZXRJbnRlcnZhbChyZWluc3RhbGwsIDUwMCk7DQorICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikNCisgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyLCBmYWxzZSk7DQorICBlbHNlDQorICAgIHdpbmRvdy5vbmxvYWQgPSByZWluc3RhbGxBbmRSZW1vdmVUaW1lcjsNCit9DQorDQorfQ0KK2FzY2lpZG9jLmluc3RhbGwoKTsNCisvKl1dPiovDQorPC9zY3JpcHQ+DQorPC9oZWFkPg0KKzxib2R5IGNsYXNzPSJtYW5wYWdlIj4NCis8ZGl2IGlkPSJoZWFkZXIiPg0KKzxoMT4NCitzeXNsaW51eC1jbGkoMSkgTWFudWFsIFBhZ2UNCis8L2gxPg0KKzxoMj5OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPHA+c3lzbGludXgtY2xpIC0NCisgICAqU3lzbGludXgqIGJvb3QgcHJvbXB0L2NvbW1hbmQgbGluZSBpbnRlcmZhY2UNCis8L3A+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBpZD0iY29udGVudCI+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2Rlc2NyaXB0aW9uIj5ERVNDUklQVElPTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPidzIGJvb3QgcHJvbXB0IHByb3ZpZGVzIGEgdmVyeSBzaW1wbGlzdGljIGNvbW1hbmQgbGluZQ0KK2ludGVyZmFjZSBmb3IgbG9hZGluZyBtb2R1bGVzIGFuZCBib290aW5nIGtlcm5lbHMuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9ib290X3Byb21wdCI+Qk9PVCBQUk9NUFQ8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfY29tbWFuZF9saW5lX2tleXN0cm9rZXMiPkNPTU1BTkQgTElORSBLRVlTVFJPS0VTPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSBjb21tYW5kIGxpbmUgcHJvbXB0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcga2V5c3Ryb2tlczo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiZsdDtFbnRlciZndDsgICAgICAgICAgICAgICBib290IHNwZWNpZmllZCBjb21tYW5kIGxpbmUNCismbHQ7QmFja1NwYWNlJmd0OyAgICAgICAgICAgZXJhc2Ugb25lIGNoYXJhY3Rlcg0KKyZsdDtDdHJsLVUmZ3Q7ICAgICAgICAgICAgICBlcmFzZSB0aGUgd2hvbGUgbGluZQ0KKyZsdDtDdHJsLVYmZ3Q7ICAgICAgICAgICAgICBkaXNwbGF5IHRoZSBjdXJyZW50IFN5c2xpbnV4IHZlcnNpb24NCismbHQ7Q3RybC1XJmd0OyAgICAgICAgICAgICAgZXJhc2Ugb25lIHdvcmQNCismbHQ7Q3RybC1YJmd0OyAgICAgICAgICAgICAgZm9yY2UgdGV4dCBtb2RlDQorJmx0O1RhYiZndDsgICAgICAgICAgICAgICAgIGxpc3QgbWF0Y2hpbmcgbGFiZWxzDQorJmx0O0YxJmd0Oy4uJmx0O0YxMiZndDsgICAgICAgICAgIGhlbHAgc2NyZWVucyAoaWYgY29uZmlndXJlZCkNCismbHQ7Q3RybC1GJmd0OyZsdDtkaWdpdCZndDsgICAgICAgZXF1aXZhbGVudCB0byBGMS4uRjEwDQorJmx0O0N0cmwtQyZndDsgICAgICAgICAgICAgIGludGVycnVwdCBib290IGluIHByb2dyZXNzDQorJmx0O0VzYyZndDsgICAgICAgICAgICAgICAgIGludGVycnVwdCBib290IGluIHByb2dyZXNzDQorJmx0O0N0cmwtTiZndDsgICAgICAgICAgICAgIGRpc3BsYXkgbmV0d29yayBpbmZvcm1hdGlvbiAoUFhFTElOVVggb25seTsgMy41MC00LjA2KTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfd29ya2luZ19kaXJlY3RvcnkiPldPUktJTkcgRElSRUNUT1JZPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkF0IHN0YXJ0LCB0aGUgaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPi88c3Ryb25nPklTT0xJTlVYPC9zdHJvbmc+IHdpbGwNCitiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBmaWxlLiAgSWYgbm8NCitjb25maWd1cmF0aW9uIGZpbGUgaXMgZm91bmQsIDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gc2hvdWxkIGRlZmF1bHQgdG8gdGhlDQoraW5zdGFsbC10aW1lIHdvcmtpbmcgZGlyZWN0b3J5LCBob3dldmVyIHRoaXMgaXMgYSBrbm93biBpc3N1ZSB3aXRoIHNvbWUNCit2ZXJzaW9ucyBpbmNsdWRpbmcgNC4wNi48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5BdCBzdGFydCwgdGhlIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkgZm9yIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gd2lsbCBiZSB0aGUNCitwYXJlbnQgZGlyZWN0b3J5IG9mIHB4ZWxpbnV4LjAgdW5sZXNzIG92ZXJyaWRkZW4gd2l0aCBESENQIG9wdGlvbiAyMTAuDQorSWYgbm8gY29uZmlndXJhdGlvbiBmaWxlIGlzIGZvdW5kLCA8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IHdpbGwgc3RhcnQgYSB0aW1lciB0bw0KK3JlYm9vdCB0aGUgc3lzdGVtIGluIGFuIGF0dGVtcHQgdG8gcmVzdGFydCB0aGUgYm9vdCBwcm9jZXNzIGFuZCByZXNvbHZlDQorYSBwb3NzaWJsZSB0cmFuc2llbnQgaXNzdWUuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9hbHRlcm5hdGVfZmlsZW5hbWVzIj5BTFRFUk5BVEUgRklMRU5BTUVTPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciBrZXJuZWwtbGlrZSBmaWxlIG5hbWVzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gd2lsbA0KK2F0dGVtcHQgdG8gYXBwZW5kIGZpbGUgbmFtZSBleHRlbnNpb25zIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIHdoZW4NCit0aGUgZmlsZSBpcyBub3QgZm91bmQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogLjBbPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiBvbmx5XSwNCisuYmluWzxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gb25seV0sIC5ic1s8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IG9ubHldLCAuYnNzWzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gb25seV0sDQorLmMzMiwgLmNidFtVcCB0byA0LjA2XSwgLmNvbVtVcCB0byA0LjA2XSBhbmQgLmltZ1s8c3Ryb25nPklTT0xJTlVYPC9zdHJvbmc+IDEuNjUtNC4wNCBvbmx5XS48L3A+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX3BhdGhfcnVsZXMiPlBBVEggUlVMRVM8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgPHN0cm9uZz5hbHdheXM8L3N0cm9uZz4gc2VhcmNoZWQgZmlyc3QsIGJlZm9yZSBQQVRILA0KK3doZW4gYXR0ZW1wdGluZyB0byBvcGVuIGEgZmlsZW5hbWUuIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzDQorbm90IGFmZmVjdGVkIHdoZW4gc3BlY2lmeWluZyBhIGZpbGUgd2l0aCBhbiBhYnNvbHV0ZSBwYXRoLiBGb3INCitleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIGZpbGUgc3lzdGVtIGxheW91dCw8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPi9ib290Lw0KKyAgICAgICAgL2Jpbi8NCisgICAgICAgICAgICAgICAgbHMuYzMyDQorICAgICAgICAgICAgICAgIGxpYmxzLmMzMg0KKyAgICAgICAgL2Zvby8NCisgICAgICAgICAgICAgICAgbGlibHMuYzMyPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+YXNzdW1pbmcgdGhhdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyAvYm9vdC9mb28sIGFuZCBhc3N1bWluZw0KK3RoYXQgbGlibHMuYzMyIGlzIGEgZGVwZW5kZW5jeSBvZiBscy5jMzIsIGV4ZWN1dGluZyAvYm9vdC9iaW4vbHMuYzMyDQord2lsbCBjYXVzZSAvYm9vdC9mb28vbGlibHMuYzMyIHRvIGJlIGxvYWRlZCwgbm90IC9ib290L2Jpbi9saWJscy5jMzIsDQorZXZlbiBpZiAvYm9vdC9iaW4gaXMgc3BlY2lmaWVkIGluIHRoZSBQQVRIIGRpcmVjdGl2ZSBvZiBhIGNvbmZpZyBmaWxlLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSByZWFzb24gdGhhdCB0aGluZ3Mgd29yayB0aGlzIHdheSBpcyB0aGF0IHR5cGljYWxseSBhIHVzZXIgd2lsbA0KK2luc3RhbGwgYWxsIGxpYnJhcnkgZmlsZXMgaW4gdGhlIFN5c2xpbnV4IGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIGFzDQorc3BlY2lmaWVkIHdpdGggdGhlIC0tZGlyZWN0b3J5IGluc3RhbGxlciBvcHRpb24uIFRoaXMgbWV0aG9kIGFsbG93cw0KK3RoZSB1c2VyIHRvIG9taXQgdGhlIFBBVEggZGlyZWN0aXZlIGZyb20gdGhlaXIgY29uZmlnIGZpbGUgYW5kIHN0aWxsDQoraGF2ZSB0aGluZ3Mgd29yayBjb3JyZWN0bHkuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9hdXRob3IiPkFVVEhPUjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhpcyBBc2NpaURvYyBkZXJpdmVkIGRvY3VtZW50IGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwNCis8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IGRvY3VtZW50YXRpb24gYnkgSC4gUGV0ZXIgQW52aW4gJmx0OzxhIGhyZWY9Im1haWx0bzpocGFAenl0b3IuY29tIj5ocGFAenl0b3IuY29tPC9hPiZndDsuICBUaGUgY29udmVyc2lvbg0KK3RvIGFuIEFzY2lpRG9jIHdhcyBtYWRlIGJ5IEdlbmUgQ3VtbSAmbHQ7PGEgaHJlZj0ibWFpbHRvOmdlbmUuY3VtbUBnbWFpbC5jb20iPmdlbmUuY3VtbUBnbWFpbC5jb208L2E+Jmd0OzwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJmb290bm90ZXMiPjxociAvPjwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3RlciI+DQorPGRpdiBpZD0iZm9vdGVyLXRleHQiPg0KK0xhc3QgdXBkYXRlZCAyMDE0LTAxLTE3IDE2OjA5OjU2IFBTVA0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZWZpMzIvdHh0L2h0bWwvc3lzbGludXguY2ZnLmh0bWwgYi9lZmkzMi90eHQvaHRtbC9zeXNsaW51eC5jZmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZhZGUwCi0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvdHh0L2h0bWwvc3lzbGludXguY2ZnLmh0bWwKQEAgLTAsMCArMSwxNzg2IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iDQorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+DQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiI+DQorPGhlYWQ+DQorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJhcHBsaWNhdGlvbi94aHRtbCt4bWw7IGNoYXJzZXQ9VVRGLTgiIC8+DQorPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJBc2NpaURvYyA4LjYuOCIgLz4NCis8dGl0bGU+c3lzbGludXguY2ZnKDUpPC90aXRsZT4NCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KKy8qIFNoYXJlZCBDU1MgZm9yIEFzY2lpRG9jIHhodG1sMTEgYW5kIGh0bWw1IGJhY2tlbmRzICovDQorDQorLyogRGVmYXVsdCBmb250LiAqLw0KK2JvZHkgew0KKyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsc2VyaWY7DQorfQ0KKw0KKy8qIFRpdGxlIGZvbnQuICovDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiwNCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUsDQordGhlYWQsIHAudGFibGUuaGVhZGVyLA0KKyN0b2N0aXRsZSwNCisjYXV0aG9yLCAjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyaywNCisjZm9vdGVyIHsNCisgIGZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsNCit9DQorDQorYm9keSB7DQorICBtYXJnaW46IDFlbSA1JSAxZW0gNSU7DQorfQ0KKw0KK2Egew0KKyAgY29sb3I6IGJsdWU7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCit9DQorYTp2aXNpdGVkIHsNCisgIGNvbG9yOiBmdWNoc2lhOw0KK30NCisNCitlbSB7DQorICBmb250LXN0eWxlOiBpdGFsaWM7DQorICBjb2xvcjogbmF2eTsNCit9DQorDQorc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICMwODMxOTQ7DQorfQ0KKw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBtYXJnaW4tdG9wOiAxLjJlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KKyAgbGluZS1oZWlnaHQ6IDEuMzsNCit9DQorDQoraDEsIGgyLCBoMyB7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitoMiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorfQ0KK2gzIHsNCisgIGZsb2F0OiBsZWZ0Ow0KK30NCitoMyArICogew0KKyAgY2xlYXI6IGxlZnQ7DQorfQ0KK2g1IHsNCisgIGZvbnQtc2l6ZTogMS4wZW07DQorfQ0KKw0KK2Rpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogMDsNCit9DQorDQoraHIgew0KKyAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOw0KK30NCisNCitwIHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KK3VsLCBvbCwgbGkgPiBwIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3VsID4gbGkgICAgIHsgY29sb3I6ICNhYWE7IH0NCit1bCA+IGxpID4gKiB7IGNvbG9yOiBibGFjazsgfQ0KKw0KKy5tb25vc3BhY2VkLCBjb2RlLCBwcmUgew0KKyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCisgIGNvbG9yOiBuYXZ5Ow0KKyAgcGFkZGluZzogMDsNCisgIG1hcmdpbjogMDsNCit9DQorDQorDQorI2F1dGhvciB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCit9DQorI2VtYWlsIHsNCit9DQorI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmsgew0KK30NCisNCisjZm9vdGVyIHsNCisgIGZvbnQtc2l6ZTogc21hbGw7DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLXRvcDogNC4wZW07DQorfQ0KKyNmb290ZXItdGV4dCB7DQorICBmbG9hdDogbGVmdDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorI2Zvb3Rlci1iYWRnZXMgew0KKyAgZmxvYXQ6IHJpZ2h0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisNCisjcHJlYW1ibGUgew0KKyAgbWFyZ2luLXRvcDogMS41ZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmltYWdlYmxvY2ssIGRpdi5leGFtcGxlYmxvY2ssIGRpdi52ZXJzZWJsb2NrLA0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYubGl0ZXJhbGJsb2NrLCBkaXYubGlzdGluZ2Jsb2NrLCBkaXYuc2lkZWJhcmJsb2NrLA0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAyLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDIuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBjb2xvcjogIzYwNjA2MDsNCit9DQorDQorZGl2LmNvbnRlbnQgeyAvKiBCbG9jayBlbGVtZW50IGNvbnRlbnQuICovDQorICBwYWRkaW5nOiAwOw0KK30NCisNCisvKiBCbG9jayBlbGVtZW50IHRpdGxlcy4gKi8NCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCitkaXYudGl0bGUgKyAqIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKw0KK3RkIGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCArIGRpdi50aXRsZSB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorDQorZGl2LnNpZGViYXJibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJhY2tncm91bmQ6ICNmZmZmZWU7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjBmMGYwOw0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5saXN0aW5nYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgYmFja2dyb3VuZDogI2Y4ZjhmODsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYucXVvdGVibG9jaywgZGl2LnZlcnNlYmxvY2sgew0KKyAgcGFkZGluZy1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgY29sb3I6ICM4ODg7DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCitkaXYudmVyc2VibG9jayA+IHByZS5jb250ZW50IHsNCisgIGZvbnQtZmFtaWx5OiBpbmhlcml0Ow0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KK30NCitkaXYudmVyc2VibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC43NWVtOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorLyogREVQUkVDQVRFRDogUHJlIHZlcnNpb24gOC4yLjcgdmVyc2Ugc3R5bGUgbGl0ZXJhbCBibG9jay4gKi8NCitkaXYudmVyc2VibG9jayArIGRpdi5hdHRyaWJ1dGlvbiB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisNCitkaXYuYWRtb25pdGlvbmJsb2NrIC5pY29uIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgdGQuY29udGVudCB7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KK30NCisNCitkaXYuZXhhbXBsZWJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCit9DQorDQorZGl2LmltYWdlYmxvY2sgZGl2LmNvbnRlbnQgeyBwYWRkaW5nLWxlZnQ6IDA7IH0NCitzcGFuLmltYWdlIGltZyB7IGJvcmRlci1zdHlsZTogbm9uZTsgfQ0KK2EuaW1hZ2U6dmlzaXRlZCB7IGNvbG9yOiB3aGl0ZTsgfQ0KKw0KK2RsIHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2R0IHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCitkZCA+ICo6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorfQ0KKw0KK3VsLCBvbCB7DQorICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7DQorfQ0KK29sLmFyYWJpYyB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7DQorfQ0KK29sLmxvd2VyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYTsNCit9DQorb2wudXBwZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLWFscGhhOw0KK30NCitvbC5sb3dlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItcm9tYW47DQorfQ0KK29sLnVwcGVycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1yb21hbjsNCit9DQorDQorZGl2LmNvbXBhY3QgdWwsIGRpdi5jb21wYWN0IG9sLA0KK2Rpdi5jb21wYWN0IHAsIGRpdi5jb21wYWN0IHAsDQorZGl2LmNvbXBhY3QgZGl2LCBkaXYuY29tcGFjdCBkaXYgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQordGZvb3Qgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkID4gZGl2LnZlcnNlIHsNCisgIHdoaXRlLXNwYWNlOiBwcmU7DQorfQ0KKw0KK2Rpdi5oZGxpc3Qgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZGl2LmhkbGlzdCB0ciB7DQorICBwYWRkaW5nLWJvdHRvbTogMTVweDsNCit9DQorZHQuaGRsaXN0MS5zdHJvbmcsIHRkLmhkbGlzdDEuc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZC5oZGxpc3QxIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjhlbTsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCit0ZC5oZGxpc3QyIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5oZGxpc3QuY29tcGFjdCB0ciB7DQorICBtYXJnaW46IDA7DQorICBwYWRkaW5nLWJvdHRvbTogMDsNCit9DQorDQorLmNvbW1lbnQgew0KKyAgYmFja2dyb3VuZDogeWVsbG93Ow0KK30NCisNCisuZm9vdG5vdGUsIC5mb290bm90ZXJlZiB7DQorICBmb250LXNpemU6IDAuOGVtOw0KK30NCisNCitzcGFuLmZvb3Rub3RlLCBzcGFuLmZvb3Rub3RlcmVmIHsNCisgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjsNCit9DQorDQorI2Zvb3Rub3RlcyB7DQorICBtYXJnaW46IDIwcHggMCAyMHB4IDA7DQorICBwYWRkaW5nOiA3cHggMCAwIDA7DQorfQ0KKw0KKyNmb290bm90ZXMgZGl2LmZvb3Rub3RlIHsNCisgIG1hcmdpbjogMCAwIDVweCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGhyIHsNCisgIGJvcmRlcjogbm9uZTsNCisgIGJvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7DQorICBoZWlnaHQ6IDFweDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tbGVmdDogMDsNCisgIHdpZHRoOiAyMCU7DQorICBtaW4td2lkdGg6IDEwMHB4Ow0KK30NCisNCitkaXYuY29saXN0IHRkIHsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuM2VtOw0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmNvbGlzdCB0ZCBpbWcgew0KKyAgbWFyZ2luLXRvcDogMC4zZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICAjZm9vdGVyLWJhZGdlcyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorI3RvYyB7DQorICBtYXJnaW4tYm90dG9tOiAyLjVlbTsNCit9DQorDQorI3RvY3RpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQorZGl2LnRvY2xldmVsMCwgZGl2LnRvY2xldmVsMSwgZGl2LnRvY2xldmVsMiwgZGl2LnRvY2xldmVsMywgZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tdG9wOiAwOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCit9DQorZGl2LnRvY2xldmVsMiB7DQorICBtYXJnaW4tbGVmdDogMmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsMyB7DQorICBtYXJnaW4tbGVmdDogNGVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tbGVmdDogNmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorDQorc3Bhbi5hcXVhIHsgY29sb3I6IGFxdWE7IH0NCitzcGFuLmJsYWNrIHsgY29sb3I6IGJsYWNrOyB9DQorc3Bhbi5ibHVlIHsgY29sb3I6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEgeyBjb2xvcjogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheSB7IGNvbG9yOiBncmF5OyB9DQorc3Bhbi5ncmVlbiB7IGNvbG9yOiBncmVlbjsgfQ0KK3NwYW4ubGltZSB7IGNvbG9yOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24geyBjb2xvcjogbWFyb29uOyB9DQorc3Bhbi5uYXZ5IHsgY29sb3I6IG5hdnk7IH0NCitzcGFuLm9saXZlIHsgY29sb3I6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUgeyBjb2xvcjogcHVycGxlOyB9DQorc3Bhbi5yZWQgeyBjb2xvcjogcmVkOyB9DQorc3Bhbi5zaWx2ZXIgeyBjb2xvcjogc2lsdmVyOyB9DQorc3Bhbi50ZWFsIHsgY29sb3I6IHRlYWw7IH0NCitzcGFuLndoaXRlIHsgY29sb3I6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3cgeyBjb2xvcjogeWVsbG93OyB9DQorDQorc3Bhbi5hcXVhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBhcXVhOyB9DQorc3Bhbi5ibGFjay1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmxhY2s7IH0NCitzcGFuLmJsdWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyYXk7IH0NCitzcGFuLmdyZWVuLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmVlbjsgfQ0KK3NwYW4ubGltZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbGltZTsgfQ0KK3NwYW4ubWFyb29uLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBtYXJvb247IH0NCitzcGFuLm5hdnktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG5hdnk7IH0NCitzcGFuLm9saXZlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBwdXJwbGU7IH0NCitzcGFuLnJlZC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcmVkOyB9DQorc3Bhbi5zaWx2ZXItYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogdGVhbDsgfQ0KK3NwYW4ud2hpdGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3ctYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYmlnIHsgZm9udC1zaXplOiAyZW07IH0NCitzcGFuLnNtYWxsIHsgZm9udC1zaXplOiAwLjZlbTsgfQ0KKw0KK3NwYW4udW5kZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0NCitzcGFuLm92ZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsgfQ0KK3NwYW4ubGluZS10aHJvdWdoIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IH0NCisNCitkaXYudW5icmVha2FibGUgeyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0NCisNCisNCisvKg0KKyAqIHhodG1sMTEgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorZGl2LnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZSB7DQorICBib3JkZXI6IDNweCBzb2xpZCAjNTI3YmJkOw0KK30NCit0aGVhZCwgcC50YWJsZS5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZSB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisvKiBCZWNhdXNlIHRoZSB0YWJsZSBmcmFtZSBhdHRyaWJ1dGUgaXMgb3ZlcnJpZGVuIGJ5IENTUyBpbiBtb3N0IGJyb3dzZXJzLiAqLw0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZvaWQiXSB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9ImhzaWRlcyJdIHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2c2lkZXMiXSB7DQorICBib3JkZXItdG9wLXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsNCit9DQorDQorDQorLyoNCisgKiBodG1sNSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK3RoZWFkLCBwLnRhYmxlYmxvY2suaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogM3B4Ow0KKyAgYm9yZGVyLXNwYWNpbmc6IDBweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KK30NCit0aC50YWJsZWJsb2NrLCB0ZC50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogMXB4Ow0KKyAgcGFkZGluZzogNHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCit9DQorDQordGFibGUudGFibGVibG9jay5mcmFtZS10b3Bib3Qgew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXNpZGVzIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1ub25lIHsNCisgIGJvcmRlci1zdHlsZTogaGlkZGVuOw0KK30NCisNCit0aC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0IHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciwgdGQudGFibGVibG9jay5oYWxpZ24tY2VudGVyIHsNCisgIHRleHQtYWxpZ246IGNlbnRlcjsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tcmlnaHQsIHRkLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0IHsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCit0aC50YWJsZWJsb2NrLnZhbGlnbi10b3AsIHRkLnRhYmxlYmxvY2sudmFsaWduLXRvcCB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUsIHRkLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20sIHRkLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOw0KK30NCisNCisNCisvKg0KKyAqIG1hbnBhZ2Ugc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorYm9keS5tYW5wYWdlIGgxIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitib2R5Lm1hbnBhZ2UgaDIgew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitib2R5Lm1hbnBhZ2UgZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAzZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICBib2R5Lm1hbnBhZ2UgZGl2I3RvYyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorDQorPC9zdHlsZT4NCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQorLyo8IVtDREFUQVsqLw0KK3ZhciBhc2NpaWRvYyA9IHsgIC8vIE5hbWVzcGFjZS4NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBUYWJsZSBPZiBDb250ZW50cyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBBdXRob3I6IE1paGFpIEJhem9uLCBTZXB0ZW1iZXIgMjAwMg0KKyAqIGh0dHA6Ly9zdHVkZW50cy5pbmZvaWFzaS5yby9+bWlzaG9vDQorICoNCisgKiBUYWJsZSBPZiBDb250ZW50IGdlbmVyYXRvcg0KKyAqIFZlcnNpb246IDAuNA0KKyAqDQorICogRmVlbCBmcmVlIHRvIHVzZSB0aGlzIHNjcmlwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYw0KKyAqIExpY2Vuc2UsIGFzIGxvbmcgYXMgeW91IGRvIG5vdCByZW1vdmUgb3IgYWx0ZXIgdGhpcyBub3RpY2UuDQorICovDQorDQorIC8qIG1vZGlmaWVkIGJ5IFRyb3kgRC4gSGFuc29uLCBTZXB0ZW1iZXIgMjAwNi4gTGljZW5zZTogR1BMICovDQorIC8qIG1vZGlmaWVkIGJ5IFN0dWFydCBSYWNraGFtLCAyMDA2LCAyMDA5LiBMaWNlbnNlOiBHUEwgKi8NCisNCisvLyB0b2NsZXZlbHMgPSAxLi40Lg0KK3RvYzogZnVuY3Rpb24gKHRvY2xldmVscykgew0KKw0KKyAgZnVuY3Rpb24gZ2V0VGV4dChlbCkgew0KKyAgICB2YXIgdGV4dCA9ICIiOw0KKyAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgIGlmIChpLm5vZGVUeXBlID09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIC8vIElFIGRvZXNuJ3Qgc3BlYWsgY29uc3RhbnRzLg0KKyAgICAgICAgdGV4dCArPSBpLmRhdGE7DQorICAgICAgZWxzZSBpZiAoaS5maXJzdENoaWxkICE9IG51bGwpDQorICAgICAgICB0ZXh0ICs9IGdldFRleHQoaSk7DQorICAgIH0NCisgICAgcmV0dXJuIHRleHQ7DQorICB9DQorDQorICBmdW5jdGlvbiBUb2NFbnRyeShlbCwgdGV4dCwgdG9jbGV2ZWwpIHsNCisgICAgdGhpcy5lbGVtZW50ID0gZWw7DQorICAgIHRoaXMudGV4dCA9IHRleHQ7DQorICAgIHRoaXMudG9jbGV2ZWwgPSB0b2NsZXZlbDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIHRvY0VudHJpZXMoZWwsIHRvY2xldmVscykgew0KKyAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5Ow0KKyAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdbaEhdKFsxLScrKHRvY2xldmVscysxKSsnXSknKTsNCisgICAgLy8gRnVuY3Rpb24gdGhhdCBzY2FucyB0aGUgRE9NIHRyZWUgZm9yIGhlYWRlciBlbGVtZW50cyAodGhlIERPTTINCisgICAgLy8gbm9kZUl0ZXJhdG9yIEFQSSB3b3VsZCBiZSBhIGJldHRlciB0ZWNobmlxdWUgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgYWxsDQorICAgIC8vIGJyb3dzZXJzKS4NCisgICAgdmFyIGl0ZXJhdGUgPSBmdW5jdGlvbiAoZWwpIHsNCisgICAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykgew0KKyAgICAgICAgICB2YXIgbW8gPSByZS5leGVjKGkudGFnTmFtZSk7DQorICAgICAgICAgIGlmIChtbyAmJiAoaS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgaS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpKSAhPSAiZmxvYXQiKSB7DQorICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbmV3IFRvY0VudHJ5KGksIGdldFRleHQoaSksIG1vWzFdLTEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGl0ZXJhdGUoaSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGl0ZXJhdGUoZWwpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgdmFyIHRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b2MiKTsNCisgIGlmICghdG9jKSB7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIC8vIERlbGV0ZSBleGlzdGluZyBUT0MgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgVE9DLg0KKyAgdmFyIHRvY0VudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgdmFyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gdG9jLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCgvXnRvY2xldmVsLykpDQorICAgICAgdG9jRW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IHRvY0VudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICB0b2MucmVtb3ZlQ2hpbGQodG9jRW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgVE9DIGVudHJpZXMuDQorICB2YXIgZW50cmllcyA9IHRvY0VudHJpZXMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKSwgdG9jbGV2ZWxzKTsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KKyAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2ldOw0KKyAgICBpZiAoZW50cnkuZWxlbWVudC5pZCA9PSAiIikNCisgICAgICBlbnRyeS5lbGVtZW50LmlkID0gIl90b2NfIiArIGk7DQorICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOw0KKyAgICBhLmhyZWYgPSAiIyIgKyBlbnRyeS5lbGVtZW50LmlkOw0KKyAgICBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVudHJ5LnRleHQpKTsNCisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KKyAgICBkaXYuYXBwZW5kQ2hpbGQoYSk7DQorICAgIGRpdi5jbGFzc05hbWUgPSAidG9jbGV2ZWwiICsgZW50cnkudG9jbGV2ZWw7DQorICAgIHRvYy5hcHBlbmRDaGlsZChkaXYpOw0KKyAgfQ0KKyAgaWYgKGVudHJpZXMubGVuZ3RoID09IDApDQorICAgIHRvYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYyk7DQorfSwNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBGb290bm90ZXMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQmFzZWQgb24gZm9vdG5vdGUgZ2VuZXJhdGlvbiBjb2RlIGZyb206DQorICogaHR0cDovL3d3dy5icmFuZHNwYW5raW5nbmV3Lm5ldC9hcmNoaXZlLzIwMDUvMDcvZm9ybWF0X2Zvb3Rub3RlLmh0bWwNCisgKi8NCisNCitmb290bm90ZXM6IGZ1bmN0aW9uICgpIHsNCisgIC8vIERlbGV0ZSBleGlzdGluZyBmb290bm90ZSBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBmb290bm9kZXMuDQorICB2YXIgaTsNCisgIHZhciBub3RlaG9sZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvb3Rub3RlcyIpOw0KKyAgaWYgKCFub3RlaG9sZGVyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHZhciBlbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIGZvciAoaSA9IDA7IGkgPCBub3RlaG9sZGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gbm90ZWhvbGRlci5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2JyAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gImZvb3Rub3RlIikNCisgICAgICBlbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgZW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIG5vdGVob2xkZXIucmVtb3ZlQ2hpbGQoZW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgZm9vdG5vdGUgZW50cmllcy4NCisgIHZhciBjb250ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKTsNCisgIHZhciBzcGFucyA9IGNvbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCisgIHZhciByZWZzID0ge307DQorICB2YXIgbiA9IDA7DQorICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZSIpIHsNCisgICAgICBuKys7DQorICAgICAgdmFyIG5vdGUgPSBzcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIpOw0KKyAgICAgIGlmICghbm90ZSkgew0KKyAgICAgICAgLy8gVXNlIFtcc1xTXSBpbiBwbGFjZSBvZiAuIHNvIG11bHRpLWxpbmUgbWF0Y2hlcyB3b3JrLg0KKyAgICAgICAgLy8gQmVjYXVzZSBKYXZhU2NyaXB0IGhhcyBubyBzIChkb3RhbGwpIHJlZ2V4IGZsYWcuDQorICAgICAgICBub3RlID0gc3BhbnNbaV0uaW5uZXJIVE1MLm1hdGNoKC9ccypcWyhbXHNcU10qKV1ccyovKVsxXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaWQ9J19mb290bm90ZXJlZl8iICsgbiArICInIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgICBzcGFuc1tpXS5zZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIsIG5vdGUpOw0KKyAgICAgIH0NCisgICAgICBub3RlaG9sZGVyLmlubmVySFRNTCArPQ0KKyAgICAgICAgIjxkaXYgY2xhc3M9J2Zvb3Rub3RlJyBpZD0nX2Zvb3Rub3RlXyIgKyBuICsgIic+IiArDQorICAgICAgICAiPGEgaHJlZj0nI19mb290bm90ZXJlZl8iICsgbiArICInIHRpdGxlPSdSZXR1cm4gdG8gdGV4dCc+IiArDQorICAgICAgICBuICsgIjwvYT4uICIgKyBub3RlICsgIjwvZGl2PiI7DQorICAgICAgdmFyIGlkID1zcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7DQorICAgICAgaWYgKGlkICE9IG51bGwpIHJlZnNbIiMiK2lkXSA9IG47DQorICAgIH0NCisgIH0NCisgIGlmIChuID09IDApDQorICAgIG5vdGVob2xkZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub3RlaG9sZGVyKTsNCisgIGVsc2Ugew0KKyAgICAvLyBQcm9jZXNzIGZvb3Rub3RlcmVmcy4NCisgICAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZXJlZiIpIHsNCisgICAgICAgIHZhciBocmVmID0gc3BhbnNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsNCisgICAgICAgIGhyZWYgPSBocmVmLm1hdGNoKC8jLiovKVswXTsgIC8vIEJlY2F1c2UgSUUgcmV0dXJuIGZ1bGwgVVJMLg0KKyAgICAgICAgbiA9IHJlZnNbaHJlZl07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfSwNCisNCitpbnN0YWxsOiBmdW5jdGlvbih0b2NsZXZlbHMpIHsNCisgIHZhciB0aW1lcklkOw0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsKCkgew0KKyAgICBhc2NpaWRvYy5mb290bm90ZXMoKTsNCisgICAgaWYgKHRvY2xldmVscykgew0KKyAgICAgIGFzY2lpZG9jLnRvYyh0b2NsZXZlbHMpOw0KKyAgICB9DQorICB9DQorDQorICBmdW5jdGlvbiByZWluc3RhbGxBbmRSZW1vdmVUaW1lcigpIHsNCisgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsNCisgICAgcmVpbnN0YWxsKCk7DQorICB9DQorDQorICB0aW1lcklkID0gc2V0SW50ZXJ2YWwocmVpbnN0YWxsLCA1MDApOw0KKyAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpDQorICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCByZWluc3RhbGxBbmRSZW1vdmVUaW1lciwgZmFsc2UpOw0KKyAgZWxzZQ0KKyAgICB3aW5kb3cub25sb2FkID0gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXI7DQorfQ0KKw0KK30NCithc2NpaWRvYy5pbnN0YWxsKCk7DQorLypdXT4qLw0KKzwvc2NyaXB0Pg0KKzwvaGVhZD4NCis8Ym9keSBjbGFzcz0ibWFucGFnZSI+DQorPGRpdiBpZD0iaGVhZGVyIj4NCis8aDE+DQorc3lzbGludXguY2ZnKDUpIE1hbnVhbCBQYWdlDQorPC9oMT4NCis8aDI+TkFNRTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxwPnN5c2xpbnV4LmNmZyAtDQorICAgKlN5c2xpbnV4KiBjb25maWd1cmF0aW9uIGZpbGUNCis8L3A+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBpZD0iY29udGVudCI+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2Rlc2NyaXB0aW9uIj5ERVNDUklQVElPTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Q29uZmlndXJhdGlvbiBmb3IgdGhlIGJvb3QgYmVoYXZpb3IgYW5kIHVzZXIgZXhwZXJpZW5jZSBvZiA8c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+DQorYm9vdCBsb2FkZXJzLCB0aGUgZm9ybWF0IG9mIGRpc3BsYXkgZmlsZXMgYW5kIHRoZSBib290IHByb21wdCBiZWhhdmlvci48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5CbGFuayBsaW5lcyBhcmUgaWdub3JlZC48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Ob3RlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBub3QgY29tcGxldGVseSBkZWNvZGVkLiAgU3ludGF4DQorZGlmZmVyZW50IGZyb20gdGhlIG9uZSBkZXNjcmliZWQgYWJvdmUgbWF5IHN0aWxsIHdvcmsgY29ycmVjdGx5IGluIHRoaXMNCit2ZXJzaW9uIG9mIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4sIGJ1dCBtYXkgYnJlYWsgaW4gYSBmdXR1cmUgb25lLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfbG9jYXRpb25fbmFtZSI+TE9DQVRJT04vTkFNRTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiAoYmVmb3JlIDQuMDApIHVzZWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZW5hbWUgb2YNCitzeXNsaW51eC5jZmcuICA8c3Ryb25nPkVYVExJTlVYPC9zdHJvbmc+IChtZXJnZWQgaW50byA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IGFzIG9mIDQuMDApIHVzZWQgdGhlDQorZmlsZW5hbWUgZXh0bGludXguY29uZi4gIEJvdGggZGVmYXVsdCB0byBzZWFyY2hpbmcgZm9yIHRoZSBjb25maWcgZmlsZQ0KK2luIHRoZSBpbnN0YWxsZWQgZGlyZWN0b3J5IChjb250YWluaW5nIGxkbGludXguc3lzL2V4dGxpbnV4LnN5cykuICBBcyBvZg0KKzQuMDAsIDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gd2lsbCBzZWFyY2ggZm9yIGV4dGxpbnV4LmNvbmYgdGhlbiBzeXNsaW51eC5jZmcgaW4gZWFjaA0KK2RpcmVjdG9yeSBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHRoZSBuZXh0IGRpcmVjdG9yeS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5BcyBvZiAzLjM1LCA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IGFsc28gc2VhcmNoZXMgL2Jvb3Qvc3lzbGludXgsIC9zeXNsaW51eCBhbmQgLy48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPklTT0xJTlVYPC9zdHJvbmc+IChiZWZvcmUgNC4wMikgdXNlZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlbmFtZSBvZg0KK2lzb2xpbnV4LmNmZywgc2VhcmNoaW5nICAvYm9vdC9pc29saW51eCAoc3RhcnRpbmcgMi4wMCksIHRoZW4gL2lzb2xpbnV4DQorYW5kIC8uICBBcyBvZiA0LjAyLCA8c3Ryb25nPklTT0xJTlVYPC9zdHJvbmc+IHdpbGwgc2VhcmNoIGZvciBpc29saW51eC5jZmcgdGhlbg0KK3N5c2xpbnV4LmNmZyBpbiAvYm9vdC9pc29saW51eCBiZWZvcmUgc2VhcmNoaW5nIGZvciB0aGUgc2FtZSBmaWxlcyBpbg0KKy9pc29saW51eCwgL2Jvb3Qvc3lzbGludXgsIC9zeXNsaW51eCwgYW5kIC8uPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9nbG9iYWxfZGlyZWN0aXZlc19tYWluIj5HTE9CQUwgRElSRUNUSVZFUyAtIE1BSU48L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4jPC9zdHJvbmc+IGNvbW1lbnQNCis8L2R0Pg0KKzxkZD4NCis8cD4NCitBIGxpbmUgY29tbWVudC4gIEFzIG9mIHZlcnNpb24gMy4xMCwgdGhlIHNwYWNlIGJldHdlZW4gdGhlIDxzdHJvbmc+Izwvc3Ryb25nPiBhbmQgdGhlDQorY29tbWVudCBpcyBubyBsb25nZXIgcmVxdWlyZWQuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk1FTlU8L3N0cm9uZz4gYW55IHN0cmluZw0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKygzLjAwKykgQSBkaXJlY3RpdmUgZm9yIHRoZSBzaW1wbGUgbWVudSBzeXN0ZW0sIHRyZWF0ZWQgYXMgYSBjb21tZW50DQorb3V0c2lkZSB0aGUgbWVudS4gIFNlZSBtZW51LnR4dC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+SU5DTFVERTwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0luc2VydHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgZmlsZSBhdCB0aGlzIHBvaW50IGluIHRoZSBjb25maWd1cmF0aW9uDQorZmlsZS4gRmlsZXMgY2FuIGN1cnJlbnRseSBiZSBuZXN0ZWQgdXAgdG8gMTYgbGV2ZWxzIGRlZXAsIGJ1dCBpdCBpcyBub3QNCitndWFyYW50ZWVkIHRoYXQgbW9yZSB0aGFuIDggbGV2ZWxzIHdpbGwgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkRFRkFVTFQ8L3N0cm9uZz4gPGVtPmtlcm5lbDwvZW0+IDxlbT5vcHRpb25zJiM4MjMwOzwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorU2V0cyB0aGUgZGVmYXVsdCBjb21tYW5kIGxpbmUgKHdoaWNoIG9mdGVuIHJlZmVyZW5jZXMgYSBMQUJFTCkuICBJZg0KKzxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gYm9vdHMgYXV0b21hdGljYWxseSwgaXQgd2lsbCBhY3QganVzdCBhcyBpZiB0aGUgZW50cmllcyBhZnRlcg0KKzxzdHJvbmc+REVGQVVMVDwvc3Ryb25nPiBoYWQgYmVlbiB0eXBlZCBpbiBhdCB0aGUgPGVtPmJvb3Q6PC9lbT4gcHJvbXB0LiAgTXVsdGlwbGUgdXNlcyB3aWxsDQorcmVzdWx0IGluIGFuIG92ZXJyaWRlLg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklmIG5vIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBwcmVzZW50LCBvciBubyA8c3Ryb25nPkRFRkFVTFQ8L3N0cm9uZz4gb3IgPHN0cm9uZz5VSTwvc3Ryb25nPiBlbnRyeSBpcw0KK3ByZXNlbnQgaW4gdGhlIGNvbmZpZyBmaWxlLCBhbiBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZCBhbmQgdGhlDQorPGVtPmJvb3Q6PC9lbT4gcHJvbXB0IGlzIHNob3duICgzLjg1KykuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPlVJPC9zdHJvbmc+IDxlbT5tb2R1bGU8L2VtPiA8ZW0+b3B0aW9ucyYjODIzMDs8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK1NlbGVjdHMgYSBzcGVjaWZpYyB1c2VyIGludGVyZmFjZSA8ZW0+bW9kdWxlPC9lbT4gKHR5cGljYWxseSBtZW51LmMzMiBvcg0KK3Zlc2FtZW51LmMzMikuICBUaGUgY29tbWFuZC1saW5lIGludGVyZmFjZSB0cmVhdHMgdGhpcyBhcyBhIGRpcmVjdGl2ZQ0KK3RoYXQgb3ZlcnJpZGVzIHRoZSA8c3Ryb25nPkRFRkFVTFQ8L3N0cm9uZz4gZGlyZWN0aXZlIHRvIGxvYWQgdGhpcyBtb2R1bGUgaW5zdGVhZCBhdA0KK3N0YXJ0dXAsIGZvciBhbiBlbXB0eSBjb21tYW5kIGxpbmUgYW5kIGF0IHRpbWVvdXQgYW5kIDxzdHJvbmc+UFJPTVBUPC9zdHJvbmc+IGRpcmVjdGl2ZQ0KK3RvIG5vdCBwcm9tcHQgKGJ1dCB0aGVzZSBkaXJlY3RpdmVzIG1heSBoYXZlIGVmZmVjdHMgb24gb3RoZXINCitjb25maWd1cmF0aW9uIHBhcnNlcnMpLiAgTXVsdGlwbGUgdXNlcyB3aWxsIHJlc3VsdCBpbiBhbiBvdmVycmlkZS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+TEFCRUw8L3N0cm9uZz4gPGVtPm15bGFiZWw8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0JlZ2luIGEgbmV3IDxzdHJvbmc+TEFCRUw8L3N0cm9uZz4gY2xhdXNlLiAgSWYgPGVtPm15bGFiZWw8L2VtPiBpcyBlbnRlcmVkIGFzIHRoZSBrZXJuZWwgdG8NCitib290LCA8c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+IHNob3VsZCBpbnN0ZWFkIGJvb3QgImltYWdlIiAoc3BlY2lmaWVkIGJ5IGEgZGlyZWN0aXZlDQorZnJvbSA8c3Ryb25nPktFUk5FTC1MSUtFIERJUkVDVElWRVM8L3N0cm9uZz4pIHdpdGggYW55IHNwZWNpZmllZCA8c3Ryb25nPkRVQUwtUFVSUE9TRQ0KK0RJUkVDVElWRVM8L3N0cm9uZz4gYmVpbmcgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgaW5zdGFuY2UuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PGVtPm15bGFiZWw8L2VtPiBtdXN0IGJlIHVuaXF1ZS4gIEN1cnJlbnRseSB0aGUgZmlyc3QgaW5zdGFuY2UgaXMgdXNlZCBidXQgbWF5DQorcmVzdWx0IGluIGFuIGVycm9yIG9yIHVuZGVzaXJlZCBiZWhhdmlvci4gIDxlbT5teWxhYmVsPC9lbT4gZW5kcyBhdCB0aGUgZmlyc3QNCitjaGFyYWN0ZXIgdGhhdCBpcyBub3QgYSBub24td2hpdGUtc3BhY2UgcHJpbnRhYmxlIGNoYXJhY3RlciBhbmQgc2hvdWxkDQorYmUgcmVzdHJpY3RlZCB0byBub24td2hpdGUtc3BhY2UgdHlwZWFibGUgY2hhcmFjdGVycy4gIFByaW9yIHRvIHZlcnNpb24NCiszLjMyLCB0aGlzIHdvdWxkIHRyYW5zZm9ybWVkIHRvIGEgRE9TIGNvbXBhdGlibGUgZm9ybWF0IG9mIDguMyB3aXRoIGENCityZXN0cmljdGVkIGNoYXJhY3RlciBzZXQuICBBIDxzdHJvbmc+TEFCRUw8L3N0cm9uZz4gY2xhdXNlIG11c3QgY29udGFpbiBleGFjdGx5IDEgb2YNCit0aGUgPHN0cm9uZz5LRVJORUwtTElLRSBESVJFQ1RJVkVTPC9zdHJvbmc+IGFuZCBtYXkgY29udGFpbiAxIGVhY2ggb2YgdGhlIDxzdHJvbmc+TEFCRUwtT05MWQ0KK0RJUkVDVElWRVM8L3N0cm9uZz4gb3IgPHN0cm9uZz5EVUFMLVBVUlBPU0UgRElSRUNUSVZFUzwvc3Ryb25nPi48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5XaXRoaW4gYSA8c3Ryb25nPkxBQkVMPC9zdHJvbmc+LCB1c2luZyBtdWx0aXBsZSA8c3Ryb25nPktFUk5FTC1MSUtFIERJUkVDVElWRVM8L3N0cm9uZz4gb3IgcmV1c2Ugb2YNCis8c3Ryb25nPkxBQkVMLU9OTFkgRElSRUNUSVZFUzwvc3Ryb25nPiBvciA8c3Ryb25nPkRVQUwtUFVSUE9TRSBESVJFQ1RJVkVTPC9zdHJvbmc+IHdpbGwgcmVzdWx0IGluIGFuDQorb3ZlcnJpZGUuICBPdGhlcndpc2UsIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBkaXJlY3RpdmUgd2lsbA0KK3Jlc3VsdCBpbiB0aGUgbGFzdCBiZWluZyBlZmZlY3RpdmUuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZHVhbF9wdXJwb3NlX2RpcmVjdGl2ZXMiPkRVQUwtUFVSUE9TRSBESVJFQ1RJVkVTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Vc2Ugb2YgYW55IG9mIHRoZSA8c3Ryb25nPkRVQUwtUFVSUE9TRSBESVJFQ1RJVkVTPC9zdHJvbmc+IGFzIDxzdHJvbmc+R0xPQkFMIERJUkVDVElWRVM8L3N0cm9uZz4gaXMNCitkaXNjb3VyYWdlZCBpZiB0aGVyZSB3aWxsIGJlIGFueSBub24tTGludXggaW1hZ2VzIGxvYWRlZCBhcyA8c3Ryb25nPkFMTDwvc3Ryb25nPiBpbWFnZXMNCit3aWxsIGdldCB0aGVzZSwgaW5jbHVkaW5nIHRob3NlIG1hbnVhbGx5IGVudGVyZWQgYXQgdGhlIDxlbT5ib290OjwvZW0+IHByb21wdC48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+QVBQRU5EPC9zdHJvbmc+IDxlbT5vcHRpb25zJiM4MjMwOzwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorQWRkIG9uZSBvciBtb3JlIG9wdGlvbnMgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuICBUaGVzZSBhcmUgYWRkZWQNCitib3RoIGZvciBhdXRvbWF0aWMgYW5kIG1hbnVhbCBib290cy4gIFRoZSBvcHRpb25zIGFyZSBhZGRlZCBhdCB0aGUgdmVyeQ0KK2JlZ2lubmluZyBvZiB0aGUga2VybmVsIGNvbW1hbmQgbGluZSwgdXN1YWxseSBwZXJtaXR0aW5nIGV4cGxpY2l0bHkNCitlbnRlcmVkIGtlcm5lbCBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZW0uICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZQ0KK0xJTE8gImFwcGVuZCIgb3B0aW9uLg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlVzZSBvZiB0aGUgcGFyYW1ldGVyIDxlbT5pbml0cmQ9PC9lbT4gc3VwcG9ydHMgbXVsdGlwbGUgZmlsZW5hbWVzIHNlcGFyYXRlZCBieQ0KK2NvbW1hcyAoaWUgPGVtPmluaXRyZD1pbml0cmRfZmlsZTEsaW5pdHJkX2ZpbGUyPC9lbT4pIHdpdGhpbiBhIHNpbmdsZSBpbnN0YW5jZS4NCitUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGluaXRyYW1mcywgd2hpY2ggY2FuIGJlIGNvbXBvc2VkIG9mIG11bHRpcGxlDQorc2VwYXJhdGUgY3BpbyBvciBjcGlvLmd6IGFyY2hpdmVzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGU6IGFsbCBpbml0cmQgZmlsZXMgZXhjZXB0IHRoZSBsYXN0IG9uZSBhcmUgemVyby1wYWRkZWQgdG8gYSA0SyBwYWdlDQorYm91bmRhcnkuICBUaGlzIHNob3VsZCBub3QgYWZmZWN0IGluaXRyYW1mcy48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Ob3RlOiBPbmx5IHRoZSBsYXN0IGVmZmVjdGl2ZSA8ZW0+aW5pdHJkPTwvZW0+IHBhcmFtZXRlciBpcyB1c2VkIGZvciBsb2FkaW5nDQoraW5pdHJkIGZpbGVzLjwvcD48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4gLQ0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0FwcGVuZCBub3RoaW5nLiAgPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4gd2l0aCBhIHNpbmdsZSBoeXBoZW4gYXMgYXJndW1lbnQgaW4gYSA8c3Ryb25nPkxBQkVMPC9zdHJvbmc+DQorc2VjdGlvbiBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBhIGdsb2JhbCA8c3Ryb25nPkFQUEVORDwvc3Ryb25nPi4NCis8L3A+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPlNZU0FQUEVORDwvc3Ryb25nPiA8ZW0+Yml0bWFzazwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+SVBBUFBFTkQ8L3N0cm9uZz4gPGVtPmJpdG1hc2s8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyg8c3Ryb25nPlNZU0FQUEVORDwvc3Ryb25nPjogNS4xMCs7IDxzdHJvbmc+SVBBUFBFTkQ8L3N0cm9uZz46IDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gb25seSkNCitUaGUgPHN0cm9uZz5TWVNBUFBFTkQ8L3N0cm9uZz4gb3B0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gNS4xMDsgaXQgaXMgYW4NCitlbmhhbmNlbWVudCBvZiBhIHByZXZpb3VzIG9wdGlvbiA8c3Ryb25nPklQQVBQRU5EPC9zdHJvbmc+IHdoaWNoIHdhcyBvbmx5IGF2YWlsYWJsZSBvbg0KKzxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4uICA8ZW0+Yml0bWFzazwvZW0+IGlzIGludGVycHJldGVkIGFzIGRlY2ltYWwgZm9ybWF0IHVubGVzcyBwcmVmaXhlZA0KK3dpdGggIjB4IiBmb3IgaGV4YWRlY2ltYWwgb3IgIjAiICh6ZXJvKSBmb3Igb2N0YWwuICBUaGUgPGVtPmJpdG1hc2s8L2VtPiBpcyBhbg0KK09SIChzdW0pIG9mIHRoZSBmb2xsb3dpbmcgaW50ZWdlciBvcHRpb25zOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4xPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorQW4gb3B0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0IHNob3VsZCBiZSBnZW5lcmF0ZWQsIGJhc2VkIG9uDQordGhlIGlucHV0IGZyb20gdGhlIERIQ1AvQk9PVFAgb3IgUFhFIGJvb3Qgc2VydmVyIGFuZCBhZGRlZCB0byB0aGUga2VybmVsDQorY29tbWFuZCBsaW5lKHNlZSBub3RlIGJlbG93OyBlbXB0eSBmb3Igbm9uLVBYRUxJTlVYIHZhcmlhbnRzKToNCis8L3A+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmlwPSZsdDtjbGllbnQtaXAmZ3Q7OiZsdDtib290LXNlcnZlci1pcCZndDs6Jmx0O2d3LWlwJmd0OzombHQ7bmV0bWFzayZndDs8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0iYWRtb25pdGlvbmJsb2NrIj4NCis8dGFibGU+PHRyPg0KKzx0ZCBjbGFzcz0iaWNvbiI+DQorPGRpdiBjbGFzcz0idGl0bGUiPk5vdGU8L2Rpdj4NCis8L3RkPg0KKzx0ZCBjbGFzcz0iY29udGVudCI+VGhlIHVzZSBvZiBvcHRpb24gMSBpcyBubyBzdWJzdGl0dXRlIGZvciBydW5uaW5nIGEgREhDUCBjbGllbnQgaW4NCit0aGUgYm9vdGVkIHN5c3RlbSBhbmQgc2hvdWxkIGluc3RlYWQgb25seSBiZSB1c2VkIHRvIHNlZWQgdGhlIGNsaWVudCBmb3INCithIHJlcXVlc3QuICBXaXRob3V0IHJlZ3VsYXIgcmVuZXdhbHMsIHRoZSBsZWFzZSBhY3F1aXJlZCBieSB0aGUgUFhFIEJJT1MNCit3aWxsIGV4cGlyZSwgbWFraW5nIHRoZSBJUCBhZGRyZXNzIGF2YWlsYWJsZSBmb3IgcmV1c2UgYnkgdGhlIERIQ1ANCitzZXJ2ZXIuPC90ZD4NCis8L3RyPjwvdGFibGU+DQorPC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Mjwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0FuIG9wdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdCBzaG91bGQgYmUgZ2VuZXJhdGVkLCBpbg0KK2Rhc2gtc2VwYXJhdGVkIGhleGFkZWNpbWFsIHdpdGggbGVhZGluZyBoYXJkd2FyZSB0eXBlIChzYW1lIGFzIGZvciB0aGUNCitjb25maWd1cmF0aW9uIGZpbGU7IHNlZSBweGVsaW51eC50eHQuKSBhbmQgYWRkZWQgdG8gdGhlIGtlcm5lbCBjb21tYW5kDQorbGluZSwgYWxsb3dpbmcgYW4gaW5pdHJkIHByb2dyYW0gdG8gZGV0ZXJtaW5lIGZyb20gd2hpY2ggaW50ZXJmYWNlIHRoZQ0KK3N5c3RlbSBib290ZWQoZW1wdHkgZm9yIG5vbi1QWEVMSU5VWCB2YXJpYW50cyk6DQorPC9wPg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5CT09USUY9Jmx0O2hhcmR3YXJlLWFkZHJlc3Mtb2YtYm9vdC1pbnRlcmZhY2UmZ3Q7PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPjQ8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitBbiBvcHRpb24gb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCwgaW4gbG93ZXINCitjYXNlIGhleGFkZWNpbWFsIGluIHRoZSBmb3JtYXQgbm9ybWFsbHkgdXNlZCBmb3IgVVVJRHMgKHNhbWUgYXMgZm9yIHRoZQ0KK2NvbmZpZ3VyYXRpb24gZmlsZTsgc2VlIHB4ZWxpbnV4LnR4dC4pIGFuZCBhZGRlZCB0byB0aGUga2VybmVsIGNvbW1hbmQNCitsaW5lOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+U1lTVVVJRD0mbHQ7c3lzdGVtIHV1aWQmZ3Q7PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPjg8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoNS4xMCspIGluZGljYXRlIHRoZSBDUFUgZmFtaWx5IGFuZCBjZXJ0YWluIHBhcnRpY3VsYXJseQ0KK3NpZ25pZmljYW50IENQVSBmZWF0dXJlIGJpdHM6DQorPC9wPg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5DUFU9Jmx0O2ZhbWlseSZndDsmbHQ7ZmVhdHVyZXMmZ3Q7PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlICZsdDtmYW1pbHkmZ3Q7IGlzIGEgc2luZ2xlIGRpZ2l0IGZyb20gMyAoaTM4NikgdG8gNiAoaTY4NiBvciBoaWdoZXIuKSAgVGhlDQorZm9sbG93aW5nIENQVSBmZWF0dXJlcyBhcmUgY3VycmVudGx5IHJlcG9ydGVkOyBhZGRpdGlvbmFsIGZsYWdzIG1heSBiZQ0KK2FkZGVkIGluIHRoZSBmdXR1cmU6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5QICAgICAgIFBoeXNpY2FsIEFkZHJlc3MgRXh0ZW5zaW9uIChQQUUpDQorViAgICAgICBJbnRlbCBWaXJ0dWFsaXphdGlvbiBUZWNobm9sb2d5IChWVC9WTVgpDQorVCAgICAgICBJbnRlbCBUcnVzdGVkIEV4ZWN0aW9uIFRlY2hub2xvZ3kgKFRYVC9TTVgpDQorWCAgICAgICBFeGVjdXRpb24gRGlzYWJsZSAoWEQvTlgpDQorTCAgICAgICBMb25nIE1vZGUgKHg4Ni02NCkNCitTICAgICAgIEFNRCBTTVggdmlydHVhbGl6YXRpb248L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RE1JPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDUuMTArKSBUaGUgZm9sbG93aW5nIHN0cmluZ3MgYXJlIGRlcml2ZWQgZnJvbSBETUkvU01CSU9TDQoraW5mb3JtYXRpb24gaWYgYXZhaWxhYmxlOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+Qml0ICAgICBTdHJpbmcgICAgICAgICAgU2lnbmlmaWNhbmNlDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKzB4MDAwMTAgU1lTVkVORE9SPSAgICAgIFN5c3RlbSB2ZW5kb3IgbmFtZQ0KKzB4MDAwMjAgU1lTUFJPRFVDVD0gICAgIFN5c3RlbSBwcm9kdWN0IG5hbWUNCisweDAwMDQwIFNZU1ZFUlNJT049ICAgICBTeXN0ZW0gdmVyc2lvbg0KKzB4MDAwODAgU1lTU0VSSUFMPSAgICAgIFN5c3RlbSBzZXJpYWwgbnVtYmVyDQorMHgwMDEwMCBTWVNTS1U9ICAgICAgICAgU3lzdGVtIFNLVQ0KKzB4MDAyMDAgU1lTRkFNSUxZPSAgICAgIFN5c3RlbSBmYW1pbHkNCisweDAwNDAwIE1CVkVORE9SPSAgICAgICBNb3RoZXJib2FyZCB2ZW5kb3IgbmFtZQ0KKzB4MDA4MDAgTUJWRVJTSU9OPSAgICAgIE1vdGhlcmJvYXJkIHZlcnNpb24NCisweDAxMDAwIE1CU0VSSUFMPSAgICAgICBNb3RoZXJib2FyZCBzZXJpYWwgbnVtYmVyDQorMHgwMjAwMCBNQkFTU0VUPSAgICAgICAgTW90aGVyYm9hcmQgYXNzZXQgdGFnDQorMHgwNDAwMCBCSU9TVkVORE9SPSAgICAgQklPUyB2ZW5kb3IgbmFtZQ0KKzB4MDgwMDAgQklPU1ZFUlNJT049ICAgIEJJT1MgdmVyc2lvbg0KKzB4MTAwMDAgU1lTRkY9ICAgICAgICAgIFN5c3RlbSBmb3JtIGZhY3RvcjwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklmIHRoZXNlIHN0cmluZ3MgY29udGFpbiB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzLCB0aGV5IGFyZSByZXBsYWNlZCB3aXRoDQordW5kZXJzY29yZXMgKF8pLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSBzeXN0ZW0gZm9ybSBmYWN0b3IgdmFsdWUgaXMgYSBudW1iZXIgZGVmaW5lZCBpbiB0aGUgU01CSU9TDQorc3BlY2lmaWNhdGlvbiwgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZG10Zi5vcmcvIj5odHRwOi8vd3d3LmRtdGYub3JnLzwvYT4uICBBcyBvZiB2ZXJzaW9uIDIuNy4xDQorb2YgdGhlIHNwZWNpZmljYXRpb24sIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBkZWZpbmVkOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+IDEgICAgIE90aGVyDQorIDIgICAgIFVua25vd24NCisgMyAgICAgRGVza3RvcA0KKyA0ICAgICBMb3cgcHJvZmlsZSBkZXNrdG9wDQorIDUgICAgIFBpenphIGJveA0KKyA2ICAgICBNaW5pIHRvd2VyDQorIDcgICAgIFRvd2VyDQorIDggICAgIFBvcnRibGUNCisgOSAgICAgTGFwdG9wDQorMTAgICAgIE5vdGVib29rDQorMTEgICAgIEhhbmRoZWxkDQorMTIgICAgIERvY2tpbmcgc3RhdGlvbg0KKzEzICAgICBBbGwtaW4tb25lDQorMTQgICAgIFN1Ym5vdGVib29rDQorMTUgICAgIFNwYWNlLXNhdmluZw0KKzE2ICAgICBMdW5jaCBib3gNCisxNyAgICAgTWFpbiBzZXJ2ZXIgY2hhc3Npcw0KKzE4ICAgICBFeHBhbnNpb24gY2hhc3Npcw0KKzE5ICAgICBTdWJjaGFzc2lzDQorMjAgICAgIEJ1cyBleHBhbnNpb24gY2hhc3Npcw0KKzIxICAgICBQZXJpcGhlcmFsIGNoYXNzaXMNCisyMiAgICAgUkFJRCBjaGFzc2lzDQorMjMgICAgIFJhY2sgbW91bnQgY2hhc3NzDQorMjQgICAgIFNlYWxlZC1jYXNlIFBDDQorMjUgICAgIE11bHRpLXN5c3RlbSBjaGFzc2lzDQorMjYgICAgIENvbXBhY3QgUENJDQorMjcgICAgIEFkdmFuY2VkIFRDSQ0KKzI4ICAgICBCbGFkZQ0KKzI5ICAgICBCbGFkZSBlbmNsb3N1cmU8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfa2VybmVsX2xpa2VfZGlyZWN0aXZlcyI+S0VSTkVMLUxJS0UgRElSRUNUSVZFUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPktFUk5FTDwvc3Ryb25nPiA8ZW0+aW1hZ2U8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0xvYWQgYSBrZXJuZWwtbGlrZSBmaWxlIDxlbT5pbWFnZTwvZW0+IHdpdGggYXV0b21hdGljIGZpbGV0eXBlIGRldGVjdGlvbiBiYXNlZA0KK29uIGZpbGUgZXh0ZW5zaW9uLCBsaXN0ZWQgdW5kZXIgdGhlIG5vbi1hdXRvLWRldGVjdGluZyBkaXJlY3RpdmVzLA0KK2RlZmF1bHRpbmcgdG8gPHN0cm9uZz5MSU5VWDwvc3Ryb25nPi4NCis8L3A+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5MSU5VWDwvc3Ryb25nPiBpcyB1c2VkIGFzIGFuIGV4YW1wbGVdDQorPHN0cm9uZz5MSU5VWDwvc3Ryb25nPiA8ZW0+aW1hZ2U8L2VtPjo6DQorTG9hZCA8ZW0+aW1hZ2U8L2VtPiBhcyBhIExpbnV4LWxpa2Uga2VybmVsLiBNRU1ESVNLIGlzIGFuIGV4YW1wbGUgb2YgYQ0KK25vbi1MaW51eCBrZXJuZWwgbG9hZGVkIGluIGEgTGludXgtbGlrZSBmYXNoaW9uLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5CT09UPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gb25seTogLmJpbjsgPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBvbmx5OiAuYnMpIExvYWQgYSBib290IHNlY3Rvci4gIC5iaW4NCitpcyBhICJDRCBib290IHNlY3RvciIgYW5kIC5icyBpcyBhIHJlZ3VsYXIgZGlzayBib290IHNlY3Rvci4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+QlNTPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gb25seTogLmJzcykgTG9hZCBhIEJTUyBpbWFnZSwgYSAuYnMgaW1hZ2Ugd2l0aCB0aGUgRE9TDQorc3VwZXJibG9jayBwYXRjaGVkIGluLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5DT01CT09UPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKC5jb20sIC5jYnQ7IFJlbW92ZWQgYXMgb2YgNS4wMCkgTG9hZCBhIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gQ09NQk9PVCBpbWFnZS4gIC5jb20NCitpbWFnZXMgbWF5IGFsc28gYmUgcnVubmFibGUgZnJvbSBET1Mgd2hpbGUgLmNidCBpbWFnZXMgYXJlIG5vdC4gIFNlZQ0KK2Fsc28gPHN0cm9uZz5jb21ib290LnR4dDwvc3Ryb25nPg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5DT00zMjwvc3Ryb25nPiA8ZW0+aW1hZ2U8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyguYzMyKSBMb2FkIGEgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBDT00zMiAoMzItYml0IDxzdHJvbmc+Q09NQk9PVDwvc3Ryb25nPikgaW1hZ2UuICBTZWUgYWxzbw0KKzxzdHJvbmc+Y29tYm9vdC50eHQ8L3N0cm9uZz4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Q09ORklHPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorTG9hZCBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIHJlYWQsIHRoZQ0KK3dvcmtpbmcgZGlyZWN0b3J5IGlzIGNoYW5nZWQgKGlmIHNwZWNpZmllZCB2aWEgYW4gPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4pLCB0aGVuIHRoZQ0KK2NvbmZpZ3VyYXRpb24gZmlsZSBpcyBwYXJzZWQuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkZESU1BR0U8L3N0cm9uZz4gPGVtPmltYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoUmVtb3ZlZCBhcyBvZiA0LjA1LCBhZGRlZCAxLjY1OyA8c3Ryb25nPklTT0xJTlVYPC9zdHJvbmc+IG9ubHk6IC5pbWcpIExvYWQgYSBkaXNrDQoraW1hZ2UuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkxPQ0FMQk9PVDwvc3Ryb25nPiA8ZW0+dHlwZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gMS41Mys7IDxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gPz8zLjEwKzsgPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiAzLjcwKylBdHRlbXB0IGENCitkaWZmZXJlbnQgbG9jYWwgYm9vdCBtZXRob2QuICBUaGUgc3BlY2lhbCB2YWx1ZSAtMSBjYXVzZXMgdGhlIGJvb3QNCitsb2FkZXIgdG8gcmVwb3J0IGZhaWx1cmUgdG8gdGhlIEJJT1MsIHdoaWNoLCBvbiByZWNlbnQgQklPU2VzLCBzaG91bGQNCittZWFuIHRoYXQgdGhlIG5leHQgYm9vdCBkZXZpY2UgaW4gdGhlIGJvb3Qgc2VxdWVuY2Ugc2hvdWxkIGJlIGFjdGl2YXRlZC4NCisgVmFsdWVzIG90aGVyIHRoYW4gdGhvc2UgZG9jdW1lbnRlZCBtYXkgcHJvZHVjZSB1bmRlc2lyZWQgcmVzdWx0cy4NCis8L3A+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5PbiA8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+LCA8ZW0+dHlwZTwvZW0+IDAgbWVhbnMgcGVyZm9ybSBhIG5vcm1hbCBib290LiAgPGVtPnR5cGU8L2VtPiA0IHdpbGwNCitwZXJmb3JtIGEgbG9jYWwgYm9vdCB3aXRoIHRoZSBVbml2ZXJzYWwgTmV0d29yayBEcml2ZXIgSW50ZXJmYWNlIChVTkRJKQ0KK2RyaXZlciBzdGlsbCByZXNpZGVudCBpbiBtZW1vcnkuICBGaW5hbGx5LCA8ZW0+dHlwZTwvZW0+IDUgd2lsbCBwZXJmb3JtIGEgbG9jYWwNCitib290IHdpdGggdGhlIGVudGlyZSBQWEUgc3RhY2ssIGluY2x1ZGluZyB0aGUgVU5ESSBkcml2ZXIsIHN0aWxsDQorcmVzaWRlbnQgaW4gbWVtb3J5LiBBbGwgb3RoZXIgdmFsdWVzIGFyZSB1bmRlZmluZWQuICBJZiB5b3UgZG9uJiM4MjE3O3Qga25vdw0KK3doYXQgdGhlIFVOREkgb3IgUFhFIHN0YWNrcyBhcmUsIGRvbiYjODIxNzt0IHdvcnJ5JiM4MjAxOyYjODIxMjsmIzgyMDE7eW91IGRvbiYjODIxNzt0IHdhbnQgdGhlbSwNCitqdXN0IHNwZWNpZnkgMC48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5PbiA8c3Ryb25nPklTT0xJTlVYPC9zdHJvbmc+LzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4sIHRoZSA8ZW0+dHlwZTwvZW0+IHNwZWNpZmllcyB0aGUgbG9jYWwgZHJpdmUgbnVtYmVyIHRvDQorYm9vdCBmcm9tOyAweDAwIGlzIHRoZSBwcmltYXJ5IGZsb3BweSBkcml2ZSBhbmQgMHg4MCBpcyB0aGUgcHJpbWFyeSBoYXJkDQorZHJpdmUuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPlBYRTwvc3Ryb25nPiA8ZW0+aW1hZ2U8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyg8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IG9ubHk6IC4wKSBMb2FkIGEgUFhFIE5CUCAoTmV0d29yayBCb290IFByb2dyYW0pIGltYWdlLiAgVGhlDQorUFhFIHByb3RvY29sIGRvZXMgbm90IHByb3ZpZGUgYW55IG1lYW5zIGZvciBzcGVjaWZpeWluZyBvciB1c2luZyBhDQorY29tbWFuZCBsaW5lIG9yIGluaXRyZC4NCis8L3A+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9sYWJlbF9vbmx5X2RpcmVjdGl2ZXMiPkxBQkVMLU9OTFkgRElSRUNUSVZFUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPklOSVRSRDwvc3Ryb25nPiA8ZW0+aW5pdHJkX2ZpbGU8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKygzLjcxKykgQW4gaW5pdHJkIGNhbiBiZSBzcGVjaWZpZWQgaW4gYSBzZXBhcmF0ZSBzdGF0ZW1lbnQgKElOSVRSRCkNCitpbnN0ZWFkIG9mIGFzIHBhcnQgb2YgdGhlIDxzdHJvbmc+QVBQRU5EPC9zdHJvbmc+IHN0YXRlbWVudDsgdGhpcyBmdW5jdGlvbmFsbHkgYXBwZW5kcw0KKyJpbml0cmQ9aW5pdHJkX2ZpbGUiIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgTGlrZSA8ZW0+aW5pdHJkPTwvZW0+LCB0aGlzDQorYWxzbyBzdXBwb3J0cyBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgZmlsZSBuYW1lcyAoc2VlIDxzdHJvbmc+QVBQRU5EPC9zdHJvbmc+KS4NCis8L3A+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9nbG9iYWxfZGlyZWN0aXZlc19zZWNvbmRhcnkiPkdMT0JBTCBESVJFQ1RJVkVTIC0gU0VDT05EQVJZPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGVzZSBhcmUgZ2xvYmFsIGRpcmVjdGl2ZXMgdGhhdCBhcmUgb2YgbGVzc2VyIGltcG9ydGFuY2UsIG9mdGVuDQorYWZmZWN0aW5nIHRoZSB1c2VyIGV4cGVyaWVuY2UgYW5kIG5vdCB0aGUgYm9vdCBwcm9jZXNzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5BTExPV09QVElPTlM8L3N0cm9uZz4gPGVtPmZsYWdfdmFsPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJZiA8ZW0+ZmxhZ192YWw8L2VtPiBpcyAwLCB0aGUgdXNlciBpcyBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IGFueSBhcmd1bWVudHMgb24NCit0aGUga2VybmVsIGNvbW1hbmQgbGluZS4gIFRoZSBvbmx5IG9wdGlvbnMgcmVjb2duaXplZCBhcmUgdGhvc2UNCitzcGVjaWZpZWQgaW4gYW4gPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4pIHN0YXRlbWVudC4gIFRoZSBkZWZhdWx0IGlzIDEuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPklNUExJQ0lUPC9zdHJvbmc+IDxlbT5mbGFnX3ZhbDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSWYgPGVtPmZsYWdfdmFsPC9lbT4gaXMgMCwgZG8gbm90IGxvYWQgYSBrZXJuZWwgaW1hZ2UgdW5sZXNzIGl0IGhhcyBiZWVuDQorZXhwbGljaXRseSBuYW1lZCBpbiBhIDxzdHJvbmc+TEFCRUw8L3N0cm9uZz4gc3RhdGVtZW50LiAgVGhlIGRlZmF1bHQgaXMgMS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+VElNRU9VVDwvc3Ryb25nPiA8ZW0+dGltZW91dDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSW5kaWNhdGVzIGhvdyBsb25nIHRvIHdhaXQgYXQgdGhlIDxlbT5ib290OjwvZW0+IHByb21wdCB1bnRpbCBib290aW5nDQorYXV0b21hdGljYWxseSwgaW4gdW5pdHMgb2YgMS8xMCBzLiAgVGhlIHRpbWVvdXQgaXMgY2FuY2VsbGVkIGFzIHNvb24gYXMNCit0aGUgdXNlciB0eXBlcyBhbnl0aGluZyBvbiB0aGUga2V5Ym9hcmQsIHRoZSBhc3N1bXB0aW9uIGJlaW5nIHRoYXQgdGhlDQordXNlciB3aWxsIGNvbXBsZXRlIHRoZSBjb21tYW5kIGxpbmUgYWxyZWFkeSBiZWd1bi4gIFRoZSB0aW1lciBpcyByZXNldA0KK3RvIDAgdXBvbiByZXR1cm4gZnJvbSBhbiB1bnN1Y2Nlc3NmdWwgYXR0ZW1wdCB0byBib290IG9yIGZyb20gYSBtb2R1bGUuDQorQSB0aW1lb3V0IG9mIHplcm8gKHRoZSBkZWZhdWx0KSB3aWxsIGRpc2FibGUgdGhlIHRpbWVvdXQgY29tcGxldGVseS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+VE9UQUxUSU1FT1VUPC9zdHJvbmc+IDxlbT50aW1lb3V0PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJbmRpY2F0ZXMgaG93IGxvbmcgdG8gd2FpdCB1bnRpbCBib290aW5nIGF1dG9tYXRpY2FsbHksIGluIHVuaXRzIG9mDQorMS8xMCBzLiAgVGhpcyB0aW1lb3V0IGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IGNhbmNlbGxlZCBieSB1c2VyIGlucHV0LCBhbmQgY2FuIHRodXMgYmUNCit1c2VkIHRvIGRlYWwgd2l0aCBzZXJpYWwgcG9ydCBnbGl0Y2hlcyBvciAidGhlIHVzZXIgd2Fsa2VkIGF3YXkiIHR5cGUNCitzaXR1YXRpb25zLiAgQSB0aW1lb3V0IG9mIHplcm8gKHRoZSBkZWZhdWx0KSB3aWxsIGRpc2FibGUgdGhlIHRpbWVvdXQNCitjb21wbGV0ZWx5Lg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkJvdGggPHN0cm9uZz5USU1FT1VUPC9zdHJvbmc+IGFuZCA8c3Ryb25nPlRPVEFMVElNRU9VVDwvc3Ryb25nPiBjYW4gYmUgdXNlZCB0b2dldGhlciwgZm9yIGV4YW1wbGU6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4jIFdhaXQgNSBzZWNvbmRzIHVubGVzcyB0aGUgdXNlciB0eXBlcyBzb21ldGhpbmcsIGJ1dA0KKyMgYWx3YXlzIGJvb3QgYWZ0ZXIgMTUgbWludXRlcy4NCitUSU1FT1VUIDUwDQorVE9UQUxUSU1FT1VUIDkwMDA8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk9OVElNRU9VVDwvc3Ryb25nPiA8ZW0+a2VybmVsIG9wdGlvbnMmIzgyMzA7PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitTZXRzIHRoZSBjb21tYW5kIGxpbmUgaW52b2tlZCBvbiBhIHRpbWVvdXQgKHdoaWNoIG9mdGVuIHJlZmVyZW5jZXMgYQ0KK0xBQkVMKS4gIElmIG5vdCBzcGVjaWZpZWQsIDxlbT5VSTwvZW0+IChpZiB1c2VkKSBvciAnREVGQVVMVCBpcyB1c2VkLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5PTkVSUk9SPC9zdHJvbmc+IDxlbT5rZXJuZWwgb3B0aW9ucyYjODIzMDs8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0lmIGEga2VybmVsIGltYWdlIGlzIG5vdCBmb3VuZCAoZWl0aGVyIGR1ZSB0byBpdCBub3QgZXhpc3RpbmcsIG9yDQorYmVjYXVzZSA8c3Ryb25nPklNUExJQ0lUPC9zdHJvbmc+IGlzIHNldCksIHJ1biB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuICBUaGUgZmF1bHR5DQorY29tbWFuZCBsaW5lIGlzIGFwcGVuZGVkIHRvIHRoZSBzcGVjaWZpZWQgb3B0aW9ucywgc28gaWYgdGhlIDxzdHJvbmc+T05FUlJPUjwvc3Ryb25nPg0KK2RpcmVjdGl2ZSByZWFkcyBhczoNCis8L3A+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPk9ORVJST1IgeHl6enkgcGx1Z2g8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5hbmQgdGhlIGNvbW1hbmQgbGluZSBhcyBlbnRlcmVkIGJ5IHRoZSB1c2VyIGlzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+Zm9vIGJhciBiYXo8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+IHdpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGFzIGlmIGVudGVyZWQgYnkgdGhlIHVzZXI6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT54eXp6eSBwbHVnaCBmb28gYmFyIGJhejwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5TRVJJQUw8L3N0cm9uZz4gPGVtPnBvcnQgW2JhdWRyYXRlIFtmbG93Y29udHJvbF1dPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitFbmFibGVzIGEgc2VyaWFsIHBvcnQgdG8gYWN0IGFzIHRoZSBjb25zb2xlLiAgPGVtPnBvcnQ8L2VtPiBpcyBhIG51bWJlciAoMCA9DQorL2Rldi90dHlTMCA9IENPTTEsIGV0Yy4pIG9yIGFuIEkvTyBwb3J0IGFkZHJlc3MgKGUuZy4gMHgzRjgpOyBpZg0KKzxlbT5iYXVkcmF0ZTwvZW0+IGlzIG9taXR0ZWQsIHRoZSBiYXVkIHJhdGUgZGVmYXVsdHMgdG8gOTYwMCBicHMuICBUaGUgc2VyaWFsDQorcGFyYW1ldGVycyBhcmUgaGFyZGNvZGVkIHRvIGJlIDggYml0cywgbm8gcGFyaXR5LCAxIHN0b3AgYml0Lg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxlbT5mbG93Y29udHJvbDwvZW0+IGlzIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBiaXRzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+MHgwMDEgLSBBc3NlcnQgRFRSDQorMHgwMDIgLSBBc3NlcnQgUlRTDQorMHgwMDggLSBFbmFibGUgaW50ZXJydXB0cw0KKzB4MDEwIC0gV2FpdCBmb3IgQ1RTIGFzc2VydGlvbg0KKzB4MDIwIC0gV2FpdCBmb3IgRFNSIGFzc2VydGlvbg0KKzB4MDQwIC0gV2FpdCBmb3IgUkkgYXNzZXJ0aW9uDQorMHgwODAgLSBXYWl0IGZvciBEQ0QgYXNzZXJ0aW9uDQorMHgxMDAgLSBJZ25vcmUgaW5wdXQgdW5sZXNzIENUUyBhc3NlcnRlZA0KKzB4MjAwIC0gSWdub3JlIGlucHV0IHVubGVzcyBEU1IgYXNzZXJ0ZWQNCisweDQwMCAtIElnbm9yZSBpbnB1dCB1bmxlc3MgUkkgYXNzZXJ0ZWQNCisweDgwMCAtIElnbm9yZSBpbnB1dCB1bmxlc3MgRENEIGFzc2VydGVkPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+QWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlR5cGljYWwgdmFsdWVzIGFyZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiAgICAwIC0gTm8gZmxvdyBjb250cm9sIChkZWZhdWx0KQ0KKzB4MzAzIC0gTnVsbCBtb2RlbSBjYWJsZSBkZXRlY3QNCisweDAxMyAtIFJUUy9DVFMgZmxvdyBjb250cm9sDQorMHg4MTMgLSBSVFMvQ1RTIGZsb3cgY29udHJvbCwgbW9kZW0gaW5wdXQNCisweDAyMyAtIERUUi9EU1IgZmxvdyBjb250cm9sDQorMHgwODMgLSBEVFIvRENEIGZsb3cgY29udHJvbDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciB0aGUgPHN0cm9uZz5TRVJJQUw8L3N0cm9uZz4gZGlyZWN0aXZlIHRvIGJlIGd1YXJhbnRlZWQgdG8gd29yayBwcm9wZXJseSwgaXQgc2hvdWxkDQorYmUgdGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJhZG1vbml0aW9uYmxvY2siPg0KKzx0YWJsZT48dHI+DQorPHRkIGNsYXNzPSJpY29uIj4NCis8ZGl2IGNsYXNzPSJ0aXRsZSI+Tm90ZTwvZGl2Pg0KKzwvdGQ+DQorPHRkIGNsYXNzPSJjb250ZW50Ij48ZW0+cG9ydDwvZW0+IHZhbHVlcyBmcm9tIDAgdG8gMyBtZWFucyB0aGUgZmlyc3QgZm91ciBzZXJpYWwgcG9ydHMNCitkZXRlY3RlZCBieSB0aGUgQklPUy4gIFRoZXkgbWF5IG9yIG1heSBub3QgY29ycmVzcG9uZCB0byB0aGUgbGVnYWN5IHBvcnQNCit2YWx1ZXMgMHgzRjgsIDB4MkY4LCAweDNFOCwgMHgyRTguPC90ZD4NCis8L3RyPjwvdGFibGU+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5FbmFibGluZyBpbnRlcnJ1cHRzIChzZXR0aW5nIHRoZSAweDAwOCBiaXQpIG1heSBnaXZlIGJldHRlcg0KK3Jlc3BvbnNpdmVuZXNzIHdpdGhvdXQgc2V0dGluZyB0aGUgPHN0cm9uZz5OT0hBTFQ8L3N0cm9uZz4gb3B0aW9uLCBidXQgY291bGQNCitwb3RlbnRpYWxseSBjYXVzZSBwcm9ibGVtcyB3aXRoIGJ1Z2d5IEJJT1Nlcy48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIG9wdGlvbiBpcyAic3RpY2t5IiBhbmQgaXMgbm90IGF1dG9tYXRpY2FsbHkgcmVzZXQgd2hlbiBsb2FkaW5nIGENCituZXcgY29uZmlndXJhdGlvbiBmaWxlIHdpdGggdGhlIENPTkZJRyBjb21tYW5kLjwvcD48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5OT0hBTFQ8L3N0cm9uZz4gPGVtPmZsYWdfdmFsPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJZiA8ZW0+ZmxhZ192YWw8L2VtPiBpcyAxLCBkb24mIzgyMTc7dCBoYWx0IHRoZSBwcm9jZXNzb3Igd2hpbGUgaWRsZS4gSGFsdGluZyB0aGUNCitwcm9jZXNzb3Igd2hpbGUgaWRsZSBzaWduaWZpY2FudGx5IHJlZHVjZXMgdGhlIHBvd2VyIGNvbnN1bXB0aW9uLCBidXQNCitjYW4gY2F1c2UgcG9vciByZXNwb25zaXZlbmVzcyB0byB0aGUgc2VyaWFsIGNvbnNvbGUsIGVzcGVjaWFsbHkgd2hlbg0KK3VzaW5nIHNjcmlwdHMgdG8gZHJpdmUgdGhlIHNlcmlhbCBjb25zb2xlLCBhcyBvcHBvc2VkIHRvIGh1bWFuDQoraW50ZXJhY3Rpb24uDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkNPTlNPTEU8L3N0cm9uZz4gPGVtPmZsYWdfdmFsPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJZiA8ZW0+ZmxhZ192YWw8L2VtPiBpcyAwLCBkaXNhYmxlIG91dHB1dCB0byB0aGUgbm9ybWFsIHZpZGVvIGNvbnNvbGUuIElmDQorPGVtPmZsYWdfdmFsPC9lbT4gaXMgMSwgZW5hYmxlIG91dHB1dCB0byB0aGUgdmlkZW8gY29uc29sZSAodGhpcyBpcyB0aGUNCitkZWZhdWx0LikNCis8L3A+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Tb21lIEJJT1NlcyB0cnkgdG8gZm9yd2FyZCB0aGlzIHRvIHRoZSBzZXJpYWwgY29uc29sZSBhbmQgc29tZXRpbWVzIG1ha2UNCithIHRvdGFsIG1lc3MgdGhlcmVvZiwgc28gdGhpcyBvcHRpb24gbGV0cyB5b3UgZGlzYWJsZSB0aGUgdmlkZW8gY29uc29sZQ0KK29uIHRoZXNlIHN5c3RlbXMuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkZPTlQ8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitMb2FkIGEgZm9udCBpbiAucHNmIGZvcm1hdCBiZWZvcmUgZGlzcGxheWluZyBhbnkgb3V0cHV0IChleGNlcHQgdGhlDQorY29weXJpZ2h0IGxpbmUsIHdoaWNoIGlzIG91dHB1dCBhcyBsZGxpbnV4LnN5cyBpdHNlbGYgaXMgbG9hZGVkLikNCis8c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+IG9ubHkgbG9hZHMgdGhlIGZvbnQgb250byB0aGUgdmlkZW8gY2FyZDsgaWYgdGhlIC5wc2YgZmlsZQ0KK2NvbnRhaW5zIGEgVW5pY29kZSB0YWJsZSBpdCBpcyBpZ25vcmVkLiAgVGhpcyBvbmx5IHdvcmtzIG9uIEVHQSBhbmQgVkdBDQorY2FyZHM7IGhvcGVmdWxseSBpdCBzaG91bGQgZG8gbm90aGluZyBvbiBvdGhlcnMuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPktCRE1BUDwvc3Ryb25nPiA8ZW0+a2V5bWFwPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJbnN0YWxsIGEgc2ltcGxlIGtleWJvYXJkIG1hcC4gIFRoZSBrZXlib2FyZCByZW1hcHBlciB1c2VkIGlzIDxzdHJvbmc+dmVyeTwvc3Ryb25nPg0KK3NpbXBsaXN0aWMgKGl0IHNpbXBseSByZW1hcHMgdGhlIGtleWNvZGVzIHJlY2VpdmVkIGZyb20gdGhlIEJJT1MsIHdoaWNoDQorbWVhbnMgdGhhdCBvbmx5IHRoZSBrZXkgY29tYmluYXRpb25zIHJlbGV2YW50IGluIHRoZSBkZWZhdWx0IGxheW91dCYjODIwMTsmIzgyMTI7JiM4MjAxO3VzdWFsbHkgVS5TLiBFbmdsaXNoJiM4MjAxOyYjODIxMjsmIzgyMDE7Y2FuIGJlIG1hcHBlZCkgYnV0IHNob3VsZCBhdCBsZWFzdCBoZWxwIHBlb3BsZQ0KK3dpdGggQVpFUlRZIGtleWJvYXJkIGxheW91dCBhbmQgdGhlIGxvY2F0aW9ucyBvZiA9IGFuZCAsICh0d28gc3BlY2lhbA0KK2NoYXJhY3RlcnMgdXNlZCBoZWF2aWx5IG9uIHRoZSBMaW51eCBrZXJuZWwgY29tbWFuZCBsaW5lLikNCis8L3A+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgaW5jbHVkZWQgcHJvZ3JhbSBrZXl0YWItbGlsby5wbCBmcm9tIHRoZSBMSUxPIGRpc3RyaWJ1dGlvbiBjYW4gYmUNCit1c2VkIHRvIGNyZWF0ZSBzdWNoIGtleW1hcHMuICBUaGUgZmlsZSBrZXl0YWItbGlsby50eHQgY29udGFpbnMgdGhlDQorZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBwcm9ncmFtLjwvcD48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5ESVNQTEFZPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorRGlzcGxheXMgdGhlIGluZGljYXRlZCBmaWxlIG9uIHRoZSBzY3JlZW4gYXQgYm9vdCB0aW1lIChiZWZvcmUgdGhlIGJvb3Q6DQorcHJvbXB0LCBpZiBkaXNwbGF5ZWQpLiAgUGxlYXNlIHNlZSB0aGUgc2VjdGlvbiBiZWxvdyBvbiA8c3Ryb25nPkRJU1BMQVk8L3N0cm9uZz4gZmlsZXMuDQorPC9wPg0KKzxkaXYgY2xhc3M9ImFkbW9uaXRpb25ibG9jayI+DQorPHRhYmxlPjx0cj4NCis8dGQgY2xhc3M9Imljb24iPg0KKzxkaXYgY2xhc3M9InRpdGxlIj5Ob3RlPC9kaXY+DQorPC90ZD4NCis8dGQgY2xhc3M9ImNvbnRlbnQiPklmIHRoZSBmaWxlIGlzIG1pc3NpbmcsIHRoaXMgb3B0aW9uIGlzIHNpbXBseSBpZ25vcmVkLjwvdGQ+DQorPC90cj48L3RhYmxlPg0KKzwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPlNBWTwvc3Ryb25nPiA8ZW0+bWVzc2FnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorUHJpbnRzIHRoZSBtZXNzYWdlIG9uIHRoZSBzY3JlZW4uDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPlBST01QVDwvc3Ryb25nPiA8ZW0+ZmxhZ192YWw8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0lmIDxlbT5mbGFnX3ZhbDwvZW0+IGlzIDAsIGRpc3BsYXkgdGhlIGJvb3Q6IHByb21wdCBvbmx5IGlmIHRoZSBTaGlmdCBvciBBbHQNCitrZXkgaXMgcHJlc3NlZCwgb3IgQ2FwcyBMb2NrIG9yIFNjcm9sbCBsb2NrIGlzIHNldCAodGhpcyBpcyB0aGUNCitkZWZhdWx0KS4gIElmIDxlbT5mbGFnX3ZhbDwvZW0+IGlzIDEsIGFsd2F5cyBkaXNwbGF5IHRoZSBib290OiBwcm9tcHQuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk5PRVNDQVBFPC9zdHJvbmc+IDxlbT5mbGFnX3ZhbDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSWYgPGVtPmZsYWdfdmFsPC9lbT4gaXMgc2V0IHRvIDEsIGlnbm9yZSB0aGUgU2hpZnQvQWx0L0NhcHMgTG9jay9TY3JvbGwgTG9jaw0KK2VzY2FwZXMuICBVc2UgdGhpcyAodG9nZXRoZXIgd2l0aCBQUk9NUFQgMCkgdG8gZm9yY2UgdGhlIGRlZmF1bHQgYm9vdA0KK2FsdGVybmF0aXZlLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5OT0NPTVBMRVRFPC9zdHJvbmc+IDxlbT5mbGFnX3ZhbDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSWYgPGVtPmZsYWdfdmFsPC9lbT4gaXMgc2V0IHRvIDEsIHRoZSBUYWIga2V5IGRvZXMgbm90IGRpc3BsYXkgbGFiZWxzIGF0IHRoZQ0KK2Jvb3Q6IHByb21wdC4NCis8L3A+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkYxPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjI8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5GMzwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkY0PC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjU8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5GNjwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkY3PC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Rjg8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5GOTwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkYxMDwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkYxMTwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkYxMjwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0Rpc3BsYXlzIHRoZSBpbmRpY2F0ZWQgZmlsZSBvbiB0aGUgc2NyZWVuIHdoZW4gYSBmdW5jdGlvbiBrZXkgaXMgcHJlc3NlZA0KK2F0IHRoZSBib290OiBwcm9tcHQuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBwcmUtYm9vdCBvbmxpbmUgaGVscA0KKyhwcmVzdW1hYmx5IGZvciB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb25zLikgIFBsZWFzZSBzZWUgdGhlDQorc2VjdGlvbiBiZWxvdyBvbiBESVNQTEFZIGZpbGVzLg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPldoZW4gdXNpbmcgdGhlIHNlcmlhbCBjb25zb2xlLCBwcmVzcyAmbHQ7Q3RybC1GJmd0OyZsdDtkaWdpdCZndDsgdG8gZ2V0IHRvIHRoZSBoZWxwDQorc2NyZWVucywgZS5nLiAmbHQ7Q3RybC1GJmd0OyZsdDsyJmd0OyB0byBnZXQgdG8gdGhlIEYyIHNjcmVlbi4gRm9yIEYxMC1GMTIsIGhpdA0KKyZsdDtDdHJsLUYmZ3Q7Jmx0O0EmZ3Q7LCAmbHQ7Q3RybC1GJmd0O0IsICZsdDtDdHJsLUYmZ3Q7Qy4gIEZvciBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllcg0KK3ZlcnNpb25zLCBGMTAgY2FuIGFsc28gYmUgZW50ZXJlZCBhcyAmbHQ7Q3RybC1GJmd0OzAuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPlBBVEg8L3N0cm9uZz4gPGVtPnBhdGg8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyg1LjAwKykgU3BlY2lmeSBhIHNwYWNlLXNlcGFyYXRlZCAoJyA8ZW0+OyA1LjAwLTUuMTAgd2FzIGEgY29sb24gJzo8L2VtPikgbGlzdA0KK29mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBtb2R1bGVzLiBUaGlzIGRpcmVjdGl2ZQ0KK2lzIHVzZWZ1bCBmb3Igc3BlY2lmeWluZyB0aGUgZGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgbGliKi5jMzIgbGlicmFyeQ0KK2ZpbGVzIGFzIG90aGVyIG1vZHVsZXMgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGVzZSBmaWxlcywgYnV0IG1heSBub3QNCityZXNpZGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LiAgTXVsdGlwbGUgaW5zdGFuY2VzIHdpbGwgYXBwZW5kIGFkZGl0aW9uYWwNCitwYXRocy4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+U0VORENPT0tJRVM8L3N0cm9uZz4gPGVtPmJpdG1hc2s8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyg8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IDUuMTArKSBXaGVuIGRvd25sb2FkaW5nIGZpbGVzIG92ZXIgaHR0cCwgdGhlIFNZU0FQUEVORA0KK3N0cmluZ3MgYXJlIHByZXBlbmRlZCB3aXRoIDxlbT5TeXNsaW51eDwvZW0+IGFuZCBzZW50IHRvIHRoZSBzZXJ2ZXIgYXMgY29va2llcy4NCitUaGUgY29va2llcyBhcmUgVVJMLWVuY29kZWQ7IHdoaXRlc3BhY2UgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gcmVwbGFjZWQgd2l0aA0KK3VuZGVyc2NvcmVzLg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgY29tbWFuZCBsaW1pdHMgdGhlIGNvb2tpZXMgc2VuZDsgMCBtZWFucyBubyBjb29raWVzLiAgVGhlIGRlZmF1bHQNCitpcyAtMSwgbWVhbmluZyBzZW5kIGFsbCBjb29raWVzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgb3B0aW9uIGlzICJzdGlja3kiIGFuZCBpcyBub3QgYXV0b21hdGljYWxseSByZXNldCB3aGVuIGxvYWRpbmcgYQ0KK25ldyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgQ09ORklHIGNvbW1hbmQuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZGlzcGxheV9maWxlX2Zvcm1hdCI+RElTUExBWSBGSUxFIEZPUk1BVDwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+RElTUExBWSBhbmQgZnVuY3Rpb24ta2V5IGhlbHAgZmlsZXMgYXJlIHRleHQgZmlsZXMgaW4gZWl0aGVyIERPUyBvciBVTklYDQorZm9ybWF0ICh3aXRoIG9yIHdpdGhvdXQgJmx0O0NSJmd0OykuICBJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBzcGVjaWFsIGNvZGVzDQorYXJlIGludGVycHJldGVkOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPmlkZW50aWNhbCB0byAjMzwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7RkYmZ3Q7PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorJiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJmx0O0N0cmwtTCZndDsgPSBBU0NJSSAxMjxiciAvPg0KK0NsZWFyIHRoZSBzY3JlZW4sIGhvbWUgdGhlIGN1cnNvci4gIE5vdGUgdGhhdCB0aGUgc2NyZWVuIGlzIGZpbGxlZCB3aXRoDQordGhlIGN1cnJlbnQgZGlzcGxheSBjb2xvci4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Jmx0O0ZGJmd0Ozwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKz0gJmx0O0N0cmwtTCZndDsgPSBBU0NJSSAxMjsgQ2xlYXIgdGhlIHNjcmVlbiwgaG9tZSB0aGUgY3Vyc29yLiAgTm90ZSB0aGF0IHRoZQ0KK3NjcmVlbiBpcyBmaWxsZWQgd2l0aCB0aGUgY3VycmVudCBkaXNwbGF5IGNvbG9yLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7RkYmZ3Q7PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorJmx0O0ZGJmd0OyA9ICZsdDtDdHJsLUwmZ3Q7ID0gQVNDSUkgMTINCis8L3A+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5DbGVhciB0aGUgc2NyZWVuLCBob21lIHRoZSBjdXJzb3IuICBOb3RlIHRoYXQgdGhlIHNjcmVlbiBpcyBmaWxsZWQgd2l0aA0KK3RoZSBjdXJyZW50IGRpc3BsYXkgY29sb3IuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtGRiZndDs8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7RkYmZ3Q7ID0gJmx0O0N0cmwtTCZndDsgPSBBU0NJSSAxMjxiciAvPg0KK0NsZWFyIHRoZSBzY3JlZW4sIGhvbWUgdGhlIGN1cnNvci4gIE5vdGUgdGhhdCB0aGUgc2NyZWVuIGlzIGZpbGxlZCB3aXRoDQordGhlIGN1cnJlbnQgZGlzcGxheSBjb2xvci4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Jmx0O1NJJmd0Ozwvc3Ryb25nPjxlbT4mbHQ7YmcmZ3Q7Jmx0O2ZnJmd0OzwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorJmx0O1NJJmd0OyA9ICZsdDtDdHJsLU8mZ3Q7ID0gQVNDSUkgMTUNCis8L3A+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5TZXQgdGhlIGRpc3BsYXkgY29sb3JzIHRvIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZA0KK2NvbG9ycywgd2hlcmUgJmx0O2JnJmd0OyBhbmQgJmx0O2ZnJmd0OyBhcmUgdGhlIDIgaGV4IGRpZ2l0cyByZXByZXNlbnRpbmcgMSBieXRlLA0KK2NvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YW5kYXJkIFBDIGRpc3BsYXkgYXR0cmlidXRlczo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPjAgPSBibGFjayAgICAgICAgICAgICAgIDggPSBkYXJrIGdyZXkNCisxID0gZGFyayBibHVlICAgICAgICAgICA5ID0gYnJpZ2h0IGJsdWUNCisyID0gZGFyayBncmVlbiAgICAgICAgICBhID0gYnJpZ2h0IGdyZWVuDQorMyA9IGRhcmsgY3lhbiAgICAgICAgICAgYiA9IGJyaWdodCBjeWFuDQorNCA9IGRhcmsgcmVkICAgICAgICAgICAgYyA9IGJyaWdodCByZWQNCis1ID0gZGFyayBwdXJwbGUgICAgICAgICBkID0gYnJpZ2h0IHB1cnBsZQ0KKzYgPSBicm93biAgICAgICAgICAgICAgIGUgPSB5ZWxsb3cNCis3ID0gbGlnaHQgZ3JleSAgICAgICAgICBmID0gd2hpdGU8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5QaWNraW5nIGEgYnJpZ2h0IGNvbG9yICg4LWYpIGZvciB0aGUgYmFja2dyb3VuZCByZXN1bHRzIGluIHRoZQ0KK2NvcnJlc3BvbmRpbmcgZGFyayBjb2xvciAoMC03KSwgd2l0aCB0aGUgZm9yZWdyb3VuZCBmbGFzaGluZy48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Db2xvcnMgYXJlIG5vdCB2aXNpYmxlIG92ZXIgdGhlIHNlcmlhbCBjb25zb2xlLjwvcD48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7Q0FOJmd0Ozwvc3Ryb25nPjxlbT5maWxlbmFtZSZsdDtuZXdsaW5lJmd0OzwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorJmx0O0NBTiZndDsgPSAmbHQ7Q3RybC1YJmd0OyA9IEFTQ0lJIDI0DQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgYSBWR0EgZGlzcGxheSBpcyBwcmVzZW50LCBlbnRlciBncmFwaGljcyBtb2RlIGFuZCBkaXNwbGF5IHRoZSBncmFwaGljDQoraW5jbHVkZWQgaW4gdGhlIHNwZWNpZmllZCBmaWxlLiAgVGhlIGZpbGUgZm9ybWF0IGlzIGFuIGFkIGhvYyBmb3JtYXQNCitjYWxsZWQgTFNTMTY7IHRoZSBpbmNsdWRlZCBQZXJsIHByb2dyYW0gInBwbXRvbHNzMTYiIGNhbiBiZSB1c2VkIHRvDQorcHJvZHVjZSB0aGVzZSBpbWFnZXMuICBUaGlzIFBlcmwgcHJvZ3JhbSBhbHNvIGluY2x1ZGVzIHRoZSBmaWxlIGZvcm1hdA0KK3NwZWNpZmljYXRpb24uPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIGltYWdlIGlzIGRpc3BsYXllZCBpbiA2NDB4NDgwIDE2LWNvbG9yIG1vZGUuICBPbmNlIGluIGdyYXBoaWNzIG1vZGUsDQordGhlIGRpc3BsYXkgYXR0cmlidXRlcyAoc2V0IGJ5ICZsdDtTSSZndDsgY29kZSBzZXF1ZW5jZXMpIHdvcmsgc2xpZ2h0bHkNCitkaWZmZXJlbnRseTogdGhlIGJhY2tncm91bmQgY29sb3IgaXMgaWdub3JlZCwgYW5kIHRoZSBmb3JlZ3JvdW5kIGNvbG9ycw0KK2FyZSB0aGUgMTYgY29sb3JzIHNwZWNpZmllZCBpbiB0aGUgaW1hZ2UgZmlsZS4gIEZvciB0aGF0IHJlYXNvbiwNCitwcG10b2xzczE2IGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGF0IGNlcnRhaW4gY29sb3JzIHNob3VsZCBiZSBhc3NpZ25lZA0KK3RvIHNwZWNpZmljIGNvbG9yIGluZGljaWVzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkNvbG9yIGluZGljaWVzIDAgYW5kIDcsIGluIHBhcnRpY3VsYXIsIHNob3VsZCBiZSBjaG9zZW4gd2l0aCBjYXJlOiAwIGlzDQordGhlIGJhY2tncm91bmQgY29sb3IsIGFuZCA3IGlzIHRoZSBjb2xvciB1c2VkIGZvciB0aGUgdGV4dCBwcmludGVkIGJ5DQorPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBpdHNlbGYuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtFTSZndDs8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7RU0mZ3Q7ID0gJmx0O0N0cmwtWSZndDsgPSBBU0NJSSAyNTxiciAvPg0KK0lmIHdlIGFyZSBjdXJyZW50bHkgaW4gZ3JhcGhpY3MgbW9kZSwgcmV0dXJuIHRvIHRleHQgbW9kZS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Jmx0O0RMRSZndDs8L3N0cm9uZz4uLjxzdHJvbmc+Jmx0O0VUQiZndDs8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7Q3RybC1QJmd0Oy4uJmx0O0N0cmwtVyZndDsgPSBBU0NJSSAxNi0yMw0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZXNlIGNvZGVzIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGljaCBtb2RlcyB0byBwcmludCBhIGNlcnRhaW4gcGFydCBvZg0KK3RoZSBtZXNzYWdlIGZpbGUgaW4uICBFYWNoIG9mIHRoZXNlIGNvbnRyb2wgY2hhcmFjdGVycyBzZWxlY3QgYSBzcGVjaWZpYw0KK3NldCBvZiBtb2RlcyAodGV4dCBzY3JlZW4sIGdyYXBoaWNzIHNjcmVlbiwgc2VyaWFsIHBvcnQpIGZvciB3aGljaCB0aGUNCitvdXRwdXQgaXMgYWN0dWFsbHkgZGlzcGxheWVkOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+Q2hhcmFjdGVyICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgIEdyYXBoICAgU2VyaWFsDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorJmx0O0RMRSZndDsgPSAmbHQ7Q3RybC1QJmd0OyA9IEFTQ0lJIDE2ICAgICBObyAgICAgIE5vICAgICAgTm8NCismbHQ7REMxJmd0OyA9ICZsdDtDdHJsLVEmZ3Q7ID0gQVNDSUkgMTcgICAgIFllcyAgICAgTm8gICAgICBObw0KKyZsdDtEQzImZ3Q7ID0gJmx0O0N0cmwtUiZndDsgPSBBU0NJSSAxOCAgICAgTm8gICAgICBZZXMgICAgIE5vDQorJmx0O0RDMyZndDsgPSAmbHQ7Q3RybC1TJmd0OyA9IEFTQ0lJIDE5ICAgICBZZXMgICAgIFllcyAgICAgTm8NCismbHQ7REM0Jmd0OyA9ICZsdDtDdHJsLVQmZ3Q7ID0gQVNDSUkgMjAgICAgIE5vICAgICAgTm8gICAgICBZZXMNCismbHQ7TkFLJmd0OyA9ICZsdDtDdHJsLVUmZ3Q7ID0gQVNDSUkgMjEgICAgIFllcyAgICAgTm8gICAgICBZZXMNCismbHQ7U1lOJmd0OyA9ICZsdDtDdHJsLVYmZ3Q7ID0gQVNDSUkgMjIgICAgIE5vICAgICAgWWVzICAgICBZZXMNCismbHQ7RVRCJmd0OyA9ICZsdDtDdHJsLVcmZ3Q7ID0gQVNDSUkgMjMgICAgIFllcyAgICAgWWVzICAgICBZZXM8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB3aWxsIGFjdHVhbGx5IHByaW50IG91dCB3aGljaCBtb2RlIHRoZQ0KK2NvbnNvbGUgaXMgaW46PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4mbHQ7REMxJmd0O1RleHQgbW9kZSZsdDtEQzImZ3Q7R3JhcGhpY3MgbW9kZSZsdDtEQzQmZ3Q7U2VyaWFsIHBvcnQmbHQ7RVRCJmd0OzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7U1VCJmd0Ozwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyZsdDtTVUImZ3Q7ID0gJmx0O0N0cmwtWiZndDsgPSBBU0NJSSAyNg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkVuZCBvZiBmaWxlIChET1MgY29udmVudGlvbikuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtCRUwmZ3Q7PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorJmx0O0JFTCZndDsgPSAmbHQ7Q3RybC1HJmd0OyA9IEFTQ0lJIDc8YnIgLz4NCitCZWVwIHRoZSBzcGVha2VyLg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2Jvb3RfbG9hZGVyX2lkc191c2VkIj5CT09UIExPQURFUiBJRFMgVVNFRDwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIExpbnV4IGJvb3QgcHJvdG9jb2wgc3VwcG9ydHMgYSAiYm9vdCBsb2FkZXIgSUQiLCBhIHNpbmdsZSBieXRlIHdoZXJlDQordGhlIHVwcGVyIG55YmJsZSBzcGVjaWZpZXMgYSBib290IGxvYWRlciBmYW1pbHkgKDMgPSA8c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+KSBhbmQgdGhlDQorbG93ZXIgbnliYmxlIGlzIHZlcnNpb24gb3IsIGluIHRoZSBjYXNlIG9mIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4sIG1lZGlhOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+MHgzMSAoNDkpID0gU1lTTElOVVgNCisweDMyICg1MCkgPSBQWEVMSU5VWA0KKzB4MzMgKDUxKSA9IElTT0xJTlVYDQorMHgzNCAoNTIpID0gRVhUTElOVVg8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JbiByZWNlbnQgdmVyc2lvbnMgb2YgTGludXgsIHRoaXMgSUQgaXMgYXZhaWxhYmxlIGFzDQorL3Byb2Mvc3lzL2tlcm5lbC9ib290bG9hZGVyX3R5cGUuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9ub3ZpY2VfcHJvdGVjdGlvbiI+Tk9WSUNFIFBST1RFQ1RJT048L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gd2lsbCBhdHRlbXB0IHRvIGRldGVjdCBib290aW5nIG9uIGEgbWFjaGluZSB3aXRoIHRvbyBsaXR0bGUNCittZW1vcnksIHdoaWNoIG1lYW5zIHRoZSBMaW51eCBib290IHNlcXVlbmNlIGNhbm5vdCBjb21wbGV0ZS4gIElmIHNvLCBhDQorbWVzc2FnZSBpcyBkaXNwbGF5ZWQgYW5kIHRoZSBib290IHNlcXVlbmNlIGFib3J0ZWQuICBIb2xkaW5nIGRvd24gdGhlDQorQ3RybCBrZXkgd2hpbGUgYm9vdGluZyBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+QW55IGZpbGUgdGhhdCA8c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+IHVzZXMgY2FuIGJlIG1hcmtlZCBoaWRkZW4sIHN5c3RlbSBvciByZWFkb25seQ0KK2lmIHNvIGlzIGNvbnZlbmllbnQ7IDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gaWdub3JlcyBhbGwgZmlsZSBhdHRyaWJ1dGVzLiAgVGhlDQorPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBpbnN0YWxsZXIgYXV0b21hdGljYWxseSBzZXRzIHRoZSByZWFkb25seS9oaWRkZW4vc3lzdGVtDQorYXR0cmlidXRlcyBvbiBMRExJTlVYLlNZUy48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2V4YW1wbGUiPkVYQU1QTEU8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkhlcmUgYXJlIHNvbWUgc2FtcGxlIGNvbmZpZyBmaWxlczo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiMgU0VSSUFMIDAgMTE1MjAwDQorREVGQVVMVCBsaW51eA0KK1BST01QVCAxDQorVElNRU9VVCA2MDANCisNCitMQUJFTCBsaW51eA0KKyAgTElOVVggdm1saW51eg0KKyAgQVBQRU5EIGluaXRyZD1pbml0cmQxLmd6LGluaXRyZDIuZ3oNCisNCitMQUJFTCBtDQorICBDT00zMiBtZW51LmMzMjwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkluIHRoaXMgZXhhbXBsZSwgc2VyaWFsIHBvcnQgdXNlIGlzIGRpc2FibGVkIGJ1dCBjYW4gYmUgZW5hYmxlZCBieQ0KK3VuY29tbWVudGluZyB0aGUgZmlyc3QgbGluZSBhbmQgdXRpbGl6ZSBzZXJpYWwgcG9ydCAwIGF0IDExNTIwMCBicHMuICBJZg0KKzxlbT5saW51eDwvZW0+IGlzIHR5cGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBrZXJuZWwtbGlrZSBmaWxlIDxlbT52bWxpbnV6PC9lbT4gaXMNCitleGVjdXRlZCBhcyBhIExpbnV4IGtlcm5lbCwgaW5pdHJkIGZpbGVzIGluaXRyZDEuZ3ogYW5kIGluaXRyZDIuZ3ogYXJlDQorbG9hZGVkIGFzIGluaXRpYWwgcmFtZGlzayBmaWxlcyAobGlrZSBjcGlvLmd6IGZpbGVzIGZvciBpbml0cmFtZnMpLiAgSWYNCis8ZW0+bTwvZW0+IGlzIHR5cGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBDT00zMiBtb2R1bGUgPGVtPm1lbnUuYzMyPC9lbT4gaXMNCitleGVjdXRlZCB0byBsYXVuY2ggYSBtZW51IHN5c3RlbS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2tub3duX2J1Z3MiPktOT1dOIEJVR1M8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlNldmVyYWwga25vd24gYnVncy9jb21tb24gcHJvYmxlbXMgYXJlIGxpc3RlZCBhdA0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuc3lzbGludXgub3JnL3dpa2kvaW5kZXgucGhwL0NvbW1vbl9Qcm9ibGVtcyI+aHR0cDovL3d3dy5zeXNsaW51eC5vcmcvd2lraS9pbmRleC5waHAvQ29tbW9uX1Byb2JsZW1zPC9hPiBhbmQga25vd24NCitoYXJkd2FyZSBjb21wYXRpYmlsaXR5IGlzc3VlcyBhcmUgbGlzdGVkIGF0DQorPGEgaHJlZj0iaHR0cDovL3d3dy5zeXNsaW51eC5vcmcvd2lraS9pbmRleC5waHAvSGFyZHdhcmVfQ29tcGF0aWJpbGl0eSI+aHR0cDovL3d3dy5zeXNsaW51eC5vcmcvd2lraS9pbmRleC5waHAvSGFyZHdhcmVfQ29tcGF0aWJpbGl0eTwvYT4gd2l0aA0KK2ZpbGVuYW1lIHRyYW5zbGF0aW9uIGRpZmZpY3VsdHkgYW5kIGVhcmx5IFBYRSBzdGFja3MgYmVpbmcgc29tZSBvZiB0aGUNCittb3N0IGNvbW1vbi4gIFJlcG9ydGluZyBvZiBvdGhlciBlbmNvdW50ZXJlZCBpc3N1ZXMgaXMgd2VsY29tZSBhbmQNCithcHByZWNpYXRlZC48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2J1Z19yZXBvcnRzIj5CVUcgUkVQT1JUUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SSB3b3VsZCBhcHByZWNpYXRlIGhlYXJpbmcgb2YgYW55IHByb2JsZW1zIHlvdSBoYXZlIHdpdGggU3lzbGludXguICBJDQord291bGQgYWxzbyBsaWtlIHRvIGhlYXIgZnJvbSB5b3UgaWYgeW91IGhhdmUgc3VjY2Vzc2Z1bGx5IHVzZWQgU3lzbGludXgsDQorPHN0cm9uZz5lc3BlY2lhbGx5PC9zdHJvbmc+IGlmIHlvdSBhcmUgdXNpbmcgaXQgZm9yIGEgZGlzdHJpYnV0aW9uLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklmIHlvdSBhcmUgcmVwb3J0aW5nIHByb2JsZW1zLCBwbGVhc2UgaW5jbHVkZSBhbGwgcG9zc2libGUgaW5mb3JtYXRpb24NCithYm91dCB5b3VyIHN5c3RlbSBhbmQgeW91ciBCSU9TOyB0aGUgdmFzdCBtYWpvcml0eSBvZiBhbGwgcHJvYmxlbXMNCityZXBvcnRlZCB0dXJuIG91dCB0byBiZSBCSU9TIG9yIGhhcmR3YXJlIGJ1Z3MsIGFuZCBJIG5lZWQgYXMgbXVjaA0KK2luZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvIGRpYWdub3NlIHRoZSBwcm9ibGVtcy48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGVyZSBpcyBhIG1haWxpbmcgbGlzdCBmb3IgZGlzY3Vzc2lvbiBhbW9uZyBTeXNsaW51eCB1c2VycyBhbmQgZm9yDQorYW5ub3VuY2VtZW50cyBvZiBuZXcgYW5kIHRlc3QgdmVyc2lvbnMuICBUbyBqb2luLCBvciB0byBicm93c2UgdGhlDQorYXJjaGl2ZSwgZ28gdG86PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PGEgaHJlZj0iaHR0cDovL3d3dy56eXRvci5jb20vbWFpbG1hbi9saXN0aW5mby9zeXNsaW51eCI+aHR0cDovL3d3dy56eXRvci5jb20vbWFpbG1hbi9saXN0aW5mby9zeXNsaW51eDwvYT48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5QbGVhc2UgRE8gTk9UIHNlbmQgSFRNTCBtZXNzYWdlcyBvciBhdHRhY2htZW50cyB0byB0aGUgbWFpbGluZyBsaXN0DQorKGluY2x1ZGluZyBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUgb3Igc2ltaWxhci4pICBBbGwgc3VjaCBtZXNzYWdlcyB3aWxsIGJlDQorYm91bmNlZC48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2F1dGhvciI+QVVUSE9SPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIEFzY2lpRG9jIGRlcml2ZWQgZG9jdW1lbnQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbA0KKzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gZG9jdW1lbnRhdGlvbiBieSBILiBQZXRlciBBbnZpbiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmhwYUB6eXRvci5jb20iPmhwYUB6eXRvci5jb208L2E+Jmd0Oy4gIFRoZSBjb252ZXJzaW9uDQordG8gYW4gQXNjaWlEb2Mgd2FzIG1hZGUgYnkgR2VuZSBDdW1tICZsdDs8YSBocmVmPSJtYWlsdG86Z2VuZS5jdW1tQGdtYWlsLmNvbSI+Z2VuZS5jdW1tQGdtYWlsLmNvbTwvYT4mZ3Q7PC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3Rub3RlcyI+PGhyIC8+PC9kaXY+DQorPGRpdiBpZD0iZm9vdGVyIj4NCis8ZGl2IGlkPSJmb290ZXItdGV4dCI+DQorTGFzdCB1cGRhdGVkIDIwMTQtMDEtMTcgMTY6MDk6NTYgUFNUDQorPC9kaXY+DQorPC9kaXY+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9lZmkzMi90eHQvaHRtbC9zeXNsaW51eC5odG1sIGIvZWZpMzIvdHh0L2h0bWwvc3lzbGludXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzA4NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvdHh0L2h0bWwvc3lzbGludXguaHRtbApAQCAtMCwwICsxLDExMjMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiINCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCis8aGVhZD4NCis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9ImFwcGxpY2F0aW9uL3hodG1sK3htbDsgY2hhcnNldD1VVEYtOCIgLz4NCis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkFzY2lpRG9jIDguNi44IiAvPg0KKzx0aXRsZT5zeXNsaW51eCgxKTwvdGl0bGU+DQorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCisvKiBTaGFyZWQgQ1NTIGZvciBBc2NpaURvYyB4aHRtbDExIGFuZCBodG1sNSBiYWNrZW5kcyAqLw0KKw0KKy8qIERlZmF1bHQgZm9udC4gKi8NCitib2R5IHsNCisgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLHNlcmlmOw0KK30NCisNCisvKiBUaXRsZSBmb250LiAqLw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlLA0KK3RoZWFkLCBwLnRhYmxlLmhlYWRlciwNCisjdG9jdGl0bGUsDQorI2F1dGhvciwgI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmssDQorI2Zvb3RlciB7DQorICBmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7DQorfQ0KKw0KK2JvZHkgew0KKyAgbWFyZ2luOiAxZW0gNSUgMWVtIDUlOw0KK30NCisNCithIHsNCisgIGNvbG9yOiBibHVlOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorfQ0KK2E6dmlzaXRlZCB7DQorICBjb2xvcjogZnVjaHNpYTsNCit9DQorDQorZW0gew0KKyAgZm9udC1zdHlsZTogaXRhbGljOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KKw0KK3N0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjMDgzMTk0Ow0KK30NCisNCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgbWFyZ2luLXRvcDogMS4yZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCisgIGxpbmUtaGVpZ2h0OiAxLjM7DQorfQ0KKw0KK2gxLCBoMiwgaDMgew0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQoraDIgew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KK30NCitoMyB7DQorICBmbG9hdDogbGVmdDsNCit9DQoraDMgKyAqIHsNCisgIGNsZWFyOiBsZWZ0Ow0KK30NCitoNSB7DQorICBmb250LXNpemU6IDEuMGVtOw0KK30NCisNCitkaXYuc2VjdGlvbmJvZHkgew0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorfQ0KKw0KK2hyIHsNCisgIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjsNCit9DQorDQorcCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCisNCit1bCwgb2wsIGxpID4gcCB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit1bCA+IGxpICAgICB7IGNvbG9yOiAjYWFhOyB9DQordWwgPiBsaSA+ICogeyBjb2xvcjogYmxhY2s7IH0NCisNCisubW9ub3NwYWNlZCwgY29kZSwgcHJlIHsNCisgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7DQorICBmb250LXNpemU6IGluaGVyaXQ7DQorICBjb2xvcjogbmF2eTsNCisgIHBhZGRpbmc6IDA7DQorICBtYXJnaW46IDA7DQorfQ0KKw0KKw0KKyNhdXRob3Igew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorfQ0KKyNlbWFpbCB7DQorfQ0KKyNyZXZudW1iZXIsICNyZXZkYXRlLCAjcmV2cmVtYXJrIHsNCit9DQorDQorI2Zvb3RlciB7DQorICBmb250LXNpemU6IHNtYWxsOw0KKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIG1hcmdpbi10b3A6IDQuMGVtOw0KK30NCisjZm9vdGVyLXRleHQgew0KKyAgZmxvYXQ6IGxlZnQ7DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorfQ0KKyNmb290ZXItYmFkZ2VzIHsNCisgIGZsb2F0OiByaWdodDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorDQorI3ByZWFtYmxlIHsNCisgIG1hcmdpbi10b3A6IDEuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5pbWFnZWJsb2NrLCBkaXYuZXhhbXBsZWJsb2NrLCBkaXYudmVyc2VibG9jaywNCitkaXYucXVvdGVibG9jaywgZGl2LmxpdGVyYWxibG9jaywgZGl2Lmxpc3RpbmdibG9jaywgZGl2LnNpZGViYXJibG9jaywNCitkaXYuYWRtb25pdGlvbmJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMi4wZW07DQorICBtYXJnaW4tYm90dG9tOiAyLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgY29sb3I6ICM2MDYwNjA7DQorfQ0KKw0KK2Rpdi5jb250ZW50IHsgLyogQmxvY2sgZWxlbWVudCBjb250ZW50LiAqLw0KKyAgcGFkZGluZzogMDsNCit9DQorDQorLyogQmxvY2sgZWxlbWVudCB0aXRsZXMuICovDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCit9DQorZGl2LnRpdGxlICsgKiB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisNCit0ZCBkaXYudGl0bGU6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KK2Rpdi5jb250ZW50IGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgKyBkaXYudGl0bGUgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KKw0KK2Rpdi5zaWRlYmFyYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBiYWNrZ3JvdW5kOiAjZmZmZmVlOw0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgI2YwZjBmMDsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYubGlzdGluZ2Jsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGJhY2tncm91bmQ6ICNmOGY4Zjg7DQorICBwYWRkaW5nOiAwLjVlbTsNCit9DQorDQorZGl2LnF1b3RlYmxvY2ssIGRpdi52ZXJzZWJsb2NrIHsNCisgIHBhZGRpbmctbGVmdDogMS4wZW07DQorICBtYXJnaW4tbGVmdDogMS4wZW07DQorICBtYXJnaW4tcmlnaHQ6IDEwJTsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGNvbG9yOiAjODg4Ow0KK30NCisNCitkaXYucXVvdGVibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQorZGl2LnZlcnNlYmxvY2sgPiBwcmUuY29udGVudCB7DQorICBmb250LWZhbWlseTogaW5oZXJpdDsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCit9DQorZGl2LnZlcnNlYmxvY2sgPiBkaXYuYXR0cmlidXRpb24gew0KKyAgcGFkZGluZy10b3A6IDAuNzVlbTsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KKy8qIERFUFJFQ0FURUQ6IFByZSB2ZXJzaW9uIDguMi43IHZlcnNlIHN0eWxlIGxpdGVyYWwgYmxvY2suICovDQorZGl2LnZlcnNlYmxvY2sgKyBkaXYuYXR0cmlidXRpb24gew0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorDQorZGl2LmFkbW9uaXRpb25ibG9jayAuaWNvbiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KK30NCitkaXYuYWRtb25pdGlvbmJsb2NrIHRkLmNvbnRlbnQgew0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCit9DQorDQorZGl2LmV4YW1wbGVibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCisgIHBhZGRpbmctbGVmdDogMC41ZW07DQorfQ0KKw0KK2Rpdi5pbWFnZWJsb2NrIGRpdi5jb250ZW50IHsgcGFkZGluZy1sZWZ0OiAwOyB9DQorc3Bhbi5pbWFnZSBpbWcgeyBib3JkZXItc3R5bGU6IG5vbmU7IH0NCithLmltYWdlOnZpc2l0ZWQgeyBjb2xvcjogd2hpdGU7IH0NCisNCitkbCB7DQorICBtYXJnaW4tdG9wOiAwLjhlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuOGVtOw0KK30NCitkdCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBjb2xvcjogbmF2eTsNCit9DQorZGQgPiAqOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KK30NCisNCit1bCwgb2wgew0KKyAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOw0KK30NCitvbC5hcmFiaWMgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOw0KK30NCitvbC5sb3dlcmFscGhhIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGE7DQorfQ0KK29sLnVwcGVyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1hbHBoYTsNCit9DQorb2wubG93ZXJyb21hbiB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLXJvbWFuOw0KK30NCitvbC51cHBlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogdXBwZXItcm9tYW47DQorfQ0KKw0KK2Rpdi5jb21wYWN0IHVsLCBkaXYuY29tcGFjdCBvbCwNCitkaXYuY29tcGFjdCBwLCBkaXYuY29tcGFjdCBwLA0KK2Rpdi5jb21wYWN0IGRpdiwgZGl2LmNvbXBhY3QgZGl2IHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK3Rmb290IHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZCA+IGRpdi52ZXJzZSB7DQorICB3aGl0ZS1zcGFjZTogcHJlOw0KK30NCisNCitkaXYuaGRsaXN0IHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2Rpdi5oZGxpc3QgdHIgew0KKyAgcGFkZGluZy1ib3R0b206IDE1cHg7DQorfQ0KK2R0LmhkbGlzdDEuc3Ryb25nLCB0ZC5oZGxpc3QxLnN0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQordGQuaGRsaXN0MSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zdHlsZTogbm9ybWFsOw0KKyAgcGFkZGluZy1yaWdodDogMC44ZW07DQorICBjb2xvcjogbmF2eTsNCit9DQordGQuaGRsaXN0MiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCitkaXYuaGRsaXN0LmNvbXBhY3QgdHIgew0KKyAgbWFyZ2luOiAwOw0KKyAgcGFkZGluZy1ib3R0b206IDA7DQorfQ0KKw0KKy5jb21tZW50IHsNCisgIGJhY2tncm91bmQ6IHllbGxvdzsNCit9DQorDQorLmZvb3Rub3RlLCAuZm9vdG5vdGVyZWYgew0KKyAgZm9udC1zaXplOiAwLjhlbTsNCit9DQorDQorc3Bhbi5mb290bm90ZSwgc3Bhbi5mb290bm90ZXJlZiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7DQorfQ0KKw0KKyNmb290bm90ZXMgew0KKyAgbWFyZ2luOiAyMHB4IDAgMjBweCAwOw0KKyAgcGFkZGluZzogN3B4IDAgMCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGRpdi5mb290bm90ZSB7DQorICBtYXJnaW46IDAgMCA1cHggMDsNCit9DQorDQorI2Zvb3Rub3RlcyBociB7DQorICBib3JkZXI6IG5vbmU7DQorICBib3JkZXItdG9wOiAxcHggc29saWQgc2lsdmVyOw0KKyAgaGVpZ2h0OiAxcHg7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorICB3aWR0aDogMjAlOw0KKyAgbWluLXdpZHRoOiAxMDBweDsNCit9DQorDQorZGl2LmNvbGlzdCB0ZCB7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjNlbTsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5jb2xpc3QgdGQgaW1nIHsNCisgIG1hcmdpbi10b3A6IDAuM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgI2Zvb3Rlci1iYWRnZXMgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKyN0b2Mgew0KKyAgbWFyZ2luLWJvdHRvbTogMi41ZW07DQorfQ0KKw0KKyN0b2N0aXRsZSB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK2Rpdi50b2NsZXZlbDAsIGRpdi50b2NsZXZlbDEsIGRpdi50b2NsZXZlbDIsIGRpdi50b2NsZXZlbDMsIGRpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLXRvcDogMDsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorfQ0KK2Rpdi50b2NsZXZlbDIgew0KKyAgbWFyZ2luLWxlZnQ6IDJlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDMgew0KKyAgbWFyZ2luLWxlZnQ6IDRlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLWxlZnQ6IDZlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KKw0KK3NwYW4uYXF1YSB7IGNvbG9yOiBhcXVhOyB9DQorc3Bhbi5ibGFjayB7IGNvbG9yOiBibGFjazsgfQ0KK3NwYW4uYmx1ZSB7IGNvbG9yOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhIHsgY29sb3I6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXkgeyBjb2xvcjogZ3JheTsgfQ0KK3NwYW4uZ3JlZW4geyBjb2xvcjogZ3JlZW47IH0NCitzcGFuLmxpbWUgeyBjb2xvcjogbGltZTsgfQ0KK3NwYW4ubWFyb29uIHsgY29sb3I6IG1hcm9vbjsgfQ0KK3NwYW4ubmF2eSB7IGNvbG9yOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZSB7IGNvbG9yOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlIHsgY29sb3I6IHB1cnBsZTsgfQ0KK3NwYW4ucmVkIHsgY29sb3I6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyIHsgY29sb3I6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbCB7IGNvbG9yOiB0ZWFsOyB9DQorc3Bhbi53aGl0ZSB7IGNvbG9yOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93IHsgY29sb3I6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYXF1YS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYXF1YTsgfQ0KK3NwYW4uYmxhY2stYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsYWNrOyB9DQorc3Bhbi5ibHVlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBmdWNoc2lhOyB9DQorc3Bhbi5ncmF5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9DQorc3Bhbi5ncmVlbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZ3JlZW47IH0NCitzcGFuLmxpbWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGxpbWU7IH0NCitzcGFuLm1hcm9vbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbWFyb29uOyB9DQorc3Bhbi5uYXZ5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogb2xpdmU7IH0NCitzcGFuLnB1cnBsZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcHVycGxlOyB9DQorc3Bhbi5yZWQtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBzaWx2ZXI7IH0NCitzcGFuLnRlYWwtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHRlYWw7IH0NCitzcGFuLndoaXRlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB5ZWxsb3c7IH0NCisNCitzcGFuLmJpZyB7IGZvbnQtc2l6ZTogMmVtOyB9DQorc3Bhbi5zbWFsbCB7IGZvbnQtc2l6ZTogMC42ZW07IH0NCisNCitzcGFuLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9DQorc3Bhbi5vdmVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7IH0NCitzcGFuLmxpbmUtdGhyb3VnaCB7IHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyB9DQorDQorZGl2LnVuYnJlYWthYmxlIHsgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOyB9DQorDQorDQorLyoNCisgKiB4aHRtbDExIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2Rpdi50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGUgew0KKyAgYm9yZGVyOiAzcHggc29saWQgIzUyN2JiZDsNCit9DQordGhlYWQsIHAudGFibGUuaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGUgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQorLyogQmVjYXVzZSB0aGUgdGFibGUgZnJhbWUgYXR0cmlidXRlIGlzIG92ZXJyaWRlbiBieSBDU1MgaW4gbW9zdCBicm93c2Vycy4gKi8NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2b2lkIl0gew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJoc2lkZXMiXSB7DQorICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0idnNpZGVzIl0gew0KKyAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7DQorfQ0KKw0KKw0KKy8qDQorICogaHRtbDUgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQordGFibGUudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCit0aGVhZCwgcC50YWJsZWJsb2NrLmhlYWRlciB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjNTI3YmJkOw0KK30NCitwLnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQordGFibGUudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDNweDsNCisgIGJvcmRlci1zcGFjaW5nOiAwcHg7DQorICBib3JkZXItc3R5bGU6IHNvbGlkOw0KKyAgYm9yZGVyLWNvbG9yOiAjNTI3YmJkOw0KKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCit9DQordGgudGFibGVibG9jaywgdGQudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDFweDsNCisgIHBhZGRpbmc6IDRweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorfQ0KKw0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtdG9wYm90IHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItcmlnaHQtc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1zaWRlcyB7DQorICBib3JkZXItdG9wLXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItYm90dG9tLXN0eWxlOiBoaWRkZW47DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtbm9uZSB7DQorICBib3JkZXItc3R5bGU6IGhpZGRlbjsNCit9DQorDQordGgudGFibGVibG9jay5oYWxpZ24tbGVmdCwgdGQudGFibGVibG9jay5oYWxpZ24tbGVmdCB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCit0aC50YWJsZWJsb2NrLmhhbGlnbi1jZW50ZXIsIHRkLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciB7DQorICB0ZXh0LWFsaWduOiBjZW50ZXI7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1yaWdodCB7DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQordGgudGFibGVibG9jay52YWxpZ24tdG9wLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi10b3Agew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tbWlkZGxlLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUgew0KKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tYm90dG9tLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20gew0KKyAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsNCit9DQorDQorDQorLyoNCisgKiBtYW5wYWdlIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2JvZHkubWFucGFnZSBoMSB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQorYm9keS5tYW5wYWdlIGgyIHsNCisgIGJvcmRlci1zdHlsZTogbm9uZTsNCit9DQorYm9keS5tYW5wYWdlIGRpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgYm9keS5tYW5wYWdlIGRpdiN0b2MgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKw0KKzwvc3R5bGU+DQorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KKy8qPCFbQ0RBVEFbKi8NCit2YXIgYXNjaWlkb2MgPSB7ICAvLyBOYW1lc3BhY2UuDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gVGFibGUgT2YgQ29udGVudHMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQXV0aG9yOiBNaWhhaSBCYXpvbiwgU2VwdGVtYmVyIDIwMDINCisgKiBodHRwOi8vc3R1ZGVudHMuaW5mb2lhc2kucm8vfm1pc2hvbw0KKyAqDQorICogVGFibGUgT2YgQ29udGVudCBnZW5lcmF0b3INCisgKiBWZXJzaW9uOiAwLjQNCisgKg0KKyAqIEZlZWwgZnJlZSB0byB1c2UgdGhpcyBzY3JpcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMNCisgKiBMaWNlbnNlLCBhcyBsb25nIGFzIHlvdSBkbyBub3QgcmVtb3ZlIG9yIGFsdGVyIHRoaXMgbm90aWNlLg0KKyAqLw0KKw0KKyAvKiBtb2RpZmllZCBieSBUcm95IEQuIEhhbnNvbiwgU2VwdGVtYmVyIDIwMDYuIExpY2Vuc2U6IEdQTCAqLw0KKyAvKiBtb2RpZmllZCBieSBTdHVhcnQgUmFja2hhbSwgMjAwNiwgMjAwOS4gTGljZW5zZTogR1BMICovDQorDQorLy8gdG9jbGV2ZWxzID0gMS4uNC4NCit0b2M6IGZ1bmN0aW9uICh0b2NsZXZlbHMpIHsNCisNCisgIGZ1bmN0aW9uIGdldFRleHQoZWwpIHsNCisgICAgdmFyIHRleHQgPSAiIjsNCisgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICBpZiAoaS5ub2RlVHlwZSA9PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSAvLyBJRSBkb2Vzbid0IHNwZWFrIGNvbnN0YW50cy4NCisgICAgICAgIHRleHQgKz0gaS5kYXRhOw0KKyAgICAgIGVsc2UgaWYgKGkuZmlyc3RDaGlsZCAhPSBudWxsKQ0KKyAgICAgICAgdGV4dCArPSBnZXRUZXh0KGkpOw0KKyAgICB9DQorICAgIHJldHVybiB0ZXh0Ow0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gVG9jRW50cnkoZWwsIHRleHQsIHRvY2xldmVsKSB7DQorICAgIHRoaXMuZWxlbWVudCA9IGVsOw0KKyAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KKyAgICB0aGlzLnRvY2xldmVsID0gdG9jbGV2ZWw7DQorICB9DQorDQorICBmdW5jdGlvbiB0b2NFbnRyaWVzKGVsLCB0b2NsZXZlbHMpIHsNCisgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTsNCisgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnW2hIXShbMS0nKyh0b2NsZXZlbHMrMSkrJ10pJyk7DQorICAgIC8vIEZ1bmN0aW9uIHRoYXQgc2NhbnMgdGhlIERPTSB0cmVlIGZvciBoZWFkZXIgZWxlbWVudHMgKHRoZSBET00yDQorICAgIC8vIG5vZGVJdGVyYXRvciBBUEkgd291bGQgYmUgYSBiZXR0ZXIgdGVjaG5pcXVlIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IGFsbA0KKyAgICAvLyBicm93c2VycykuDQorICAgIHZhciBpdGVyYXRlID0gZnVuY3Rpb24gKGVsKSB7DQorICAgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICAgIGlmIChpLm5vZGVUeXBlID09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHsNCisgICAgICAgICAgdmFyIG1vID0gcmUuZXhlYyhpLnRhZ05hbWUpOw0KKyAgICAgICAgICBpZiAobW8gJiYgKGkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8IGkuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKSkgIT0gImZsb2F0Iikgew0KKyAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IG5ldyBUb2NFbnRyeShpLCBnZXRUZXh0KGkpLCBtb1sxXS0xKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpdGVyYXRlKGkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpdGVyYXRlKGVsKTsNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHZhciB0b2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9jIik7DQorICBpZiAoIXRvYykgew0KKyAgICByZXR1cm47DQorICB9DQorDQorICAvLyBEZWxldGUgZXhpc3RpbmcgVE9DIGVudHJpZXMgaW4gY2FzZSB3ZSdyZSByZWxvYWRpbmcgdGhlIFRPQy4NCisgIHZhciB0b2NFbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIHZhciBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHRvYy5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IHRvYy5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2Jw0KKyAgICAgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikubWF0Y2goL150b2NsZXZlbC8pKQ0KKyAgICAgIHRvY0VudHJpZXNUb1JlbW92ZS5wdXNoKGVudHJ5KTsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCB0b2NFbnRyaWVzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCisgICAgdG9jLnJlbW92ZUNoaWxkKHRvY0VudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIFRPQyBlbnRyaWVzLg0KKyAgdmFyIGVudHJpZXMgPSB0b2NFbnRyaWVzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50IiksIHRvY2xldmVscyk7DQorICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHsNCisgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpXTsNCisgICAgaWYgKGVudHJ5LmVsZW1lbnQuaWQgPT0gIiIpDQorICAgICAgZW50cnkuZWxlbWVudC5pZCA9ICJfdG9jXyIgKyBpOw0KKyAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsNCisgICAgYS5ocmVmID0gIiMiICsgZW50cnkuZWxlbWVudC5pZDsNCisgICAgYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbnRyeS50ZXh0KSk7DQorICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCisgICAgZGl2LmFwcGVuZENoaWxkKGEpOw0KKyAgICBkaXYuY2xhc3NOYW1lID0gInRvY2xldmVsIiArIGVudHJ5LnRvY2xldmVsOw0KKyAgICB0b2MuYXBwZW5kQ2hpbGQoZGl2KTsNCisgIH0NCisgIGlmIChlbnRyaWVzLmxlbmd0aCA9PSAwKQ0KKyAgICB0b2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b2MpOw0KK30sDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gRm9vdG5vdGVzIGdlbmVyYXRvcg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qIEJhc2VkIG9uIGZvb3Rub3RlIGdlbmVyYXRpb24gY29kZSBmcm9tOg0KKyAqIGh0dHA6Ly93d3cuYnJhbmRzcGFua2luZ25ldy5uZXQvYXJjaGl2ZS8yMDA1LzA3L2Zvcm1hdF9mb290bm90ZS5odG1sDQorICovDQorDQorZm9vdG5vdGVzOiBmdW5jdGlvbiAoKSB7DQorICAvLyBEZWxldGUgZXhpc3RpbmcgZm9vdG5vdGUgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgZm9vdG5vZGVzLg0KKyAgdmFyIGk7DQorICB2YXIgbm90ZWhvbGRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb290bm90ZXMiKTsNCisgIGlmICghbm90ZWhvbGRlcikgew0KKyAgICByZXR1cm47DQorICB9DQorICB2YXIgZW50cmllc1RvUmVtb3ZlID0gW107DQorICBmb3IgKGkgPSAwOyBpIDwgbm90ZWhvbGRlci5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IG5vdGVob2xkZXIuY2hpbGROb2Rlc1tpXTsNCisgICAgaWYgKGVudHJ5Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2RpdicgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpID09ICJmb290bm90ZSIpDQorICAgICAgZW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IGVudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICBub3RlaG9sZGVyLnJlbW92ZUNoaWxkKGVudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIGZvb3Rub3RlIGVudHJpZXMuDQorICB2YXIgY29udCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50Iik7DQorICB2YXIgc3BhbnMgPSBjb250LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQorICB2YXIgcmVmcyA9IHt9Ow0KKyAgdmFyIG4gPSAwOw0KKyAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGUiKSB7DQorICAgICAgbisrOw0KKyAgICAgIHZhciBub3RlID0gc3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiKTsNCisgICAgICBpZiAoIW5vdGUpIHsNCisgICAgICAgIC8vIFVzZSBbXHNcU10gaW4gcGxhY2Ugb2YgLiBzbyBtdWx0aS1saW5lIG1hdGNoZXMgd29yay4NCisgICAgICAgIC8vIEJlY2F1c2UgSmF2YVNjcmlwdCBoYXMgbm8gcyAoZG90YWxsKSByZWdleCBmbGFnLg0KKyAgICAgICAgbm90ZSA9IHNwYW5zW2ldLmlubmVySFRNTC5tYXRjaCgvXHMqXFsoW1xzXFNdKildXHMqLylbMV07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGlkPSdfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgICAgc3BhbnNbaV0uc2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiLCBub3RlKTsNCisgICAgICB9DQorICAgICAgbm90ZWhvbGRlci5pbm5lckhUTUwgKz0NCisgICAgICAgICI8ZGl2IGNsYXNzPSdmb290bm90ZScgaWQ9J19mb290bm90ZV8iICsgbiArICInPiIgKw0KKyAgICAgICAgIjxhIGhyZWY9JyNfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyB0aXRsZT0nUmV0dXJuIHRvIHRleHQnPiIgKw0KKyAgICAgICAgbiArICI8L2E+LiAiICsgbm90ZSArICI8L2Rpdj4iOw0KKyAgICAgIHZhciBpZCA9c3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOw0KKyAgICAgIGlmIChpZCAhPSBudWxsKSByZWZzWyIjIitpZF0gPSBuOw0KKyAgICB9DQorICB9DQorICBpZiAobiA9PSAwKQ0KKyAgICBub3RlaG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm90ZWhvbGRlcik7DQorICBlbHNlIHsNCisgICAgLy8gUHJvY2VzcyBmb290bm90ZXJlZnMuDQorICAgIGZvciAoaT0wOyBpPHNwYW5zLmxlbmd0aDsgaSsrKSB7DQorICAgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGVyZWYiKSB7DQorICAgICAgICB2YXIgaHJlZiA9IHNwYW5zW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0uZ2V0QXR0cmlidXRlKCJocmVmIik7DQorICAgICAgICBocmVmID0gaHJlZi5tYXRjaCgvIy4qLylbMF07ICAvLyBCZWNhdXNlIElFIHJldHVybiBmdWxsIFVSTC4NCisgICAgICAgIG4gPSByZWZzW2hyZWZdOw0KKyAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0NCisgICAgICAgICAgIls8YSBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30sDQorDQoraW5zdGFsbDogZnVuY3Rpb24odG9jbGV2ZWxzKSB7DQorICB2YXIgdGltZXJJZDsNCisNCisgIGZ1bmN0aW9uIHJlaW5zdGFsbCgpIHsNCisgICAgYXNjaWlkb2MuZm9vdG5vdGVzKCk7DQorICAgIGlmICh0b2NsZXZlbHMpIHsNCisgICAgICBhc2NpaWRvYy50b2ModG9jbGV2ZWxzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIoKSB7DQorICAgIGNsZWFySW50ZXJ2YWwodGltZXJJZCk7DQorICAgIHJlaW5zdGFsbCgpOw0KKyAgfQ0KKw0KKyAgdGltZXJJZCA9IHNldEludGVydmFsKHJlaW5zdGFsbCwgNTAwKTsNCisgIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKQ0KKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIsIGZhbHNlKTsNCisgIGVsc2UNCisgICAgd2luZG93Lm9ubG9hZCA9IHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyOw0KK30NCisNCit9DQorYXNjaWlkb2MuaW5zdGFsbCgpOw0KKy8qXV0+Ki8NCis8L3NjcmlwdD4NCis8L2hlYWQ+DQorPGJvZHkgY2xhc3M9Im1hbnBhZ2UiPg0KKzxkaXYgaWQ9ImhlYWRlciI+DQorPGgxPg0KK3N5c2xpbnV4KDEpIE1hbnVhbCBQYWdlDQorPC9oMT4NCis8aDI+TkFNRTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxwPnN5c2xpbnV4IC0NCisgICBJbnN0YWxsIFNZU0xJTlVYIHRvIGEgZmlsZSBzeXN0ZW0NCis8L3A+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBpZD0iY29udGVudCI+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX3N5bm9wc2lzIj5TWU5PUFNJUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InZlcnNlYmxvY2siPg0KKzxwcmUgY2xhc3M9ImNvbnRlbnQiPjxzdHJvbmc+c3lzbGludXg8L3N0cm9uZz4gWzxlbT5PUFRJT05TPC9lbT5dIDxlbT5ERVZJQ0U8L2VtPg0KKzxzdHJvbmc+ZXh0bGludXg8L3N0cm9uZz4gWzxlbT5PUFRJT05TPC9lbT5dIDxlbT5QQVRIPC9lbT4NCis8c3Ryb25nPnN5c2xpbnV4PC9zdHJvbmc+IFstaCB8IC0taGVscCB8IC12IHwgLS12ZXJzaW9uXQ0KKzxzdHJvbmc+ZXh0bGludXg8L3N0cm9uZz4gWy1oIHwgLS1oZWxwIHwgLXYgfCAtLXZlcnNpb25dPC9wcmU+DQorPGRpdiBjbGFzcz0iYXR0cmlidXRpb24iPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9kZXNjcmlwdGlvbiI+REVTQ1JJUFRJT048L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkluc3RhbGwgPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiB0byB0aGUgPGVtPkRFVklDRTwvZW0+LzxlbT5QQVRIPC9lbT4sIGFsdGVyaW5nIHRoZSBib290IHNlY3RvciBhbmQNCitpbnN0YWxsaW5nIHRoZSA8ZW0+bGRsaW51eC5zeXM8L2VtPiBib290IGxvYWRlciBmaWxlLiAgRm9yIHRoZSBMaW51eCBpbnN0YWxsZXINCitleHRsaW51eCwgPGVtPlBBVEg8L2VtPiBpcyB0aGUgZGVzaXJlZCBwYXRoIGZvciB0aGUgY29udHJvbCBmaWxlcyBvbiBhIG1vdW50ZWQsDQorc3VwcG9ydGVkIGZpbGUgc3lzdGVtIGFuZCBzZXRzIHRoZSBpbnN0YWxsLXRpbWUgd29ya2luZyBkaXJlY3RvcnkuICBGb3INCithbGwgb3RoZXJzLCA8ZW0+REVWSUNFPC9lbT4gbXVzdCBzcGVjaWZ5IGEgRkFUMTIvRkFUMTYvRkFUMzIgZmlsZSBzeXN0ZW0uICBGb3INCit0aGUgTGludXggaW5zdGFsbGVycyBzeXNsaW51eCBhbmQgc3lzbGludXgtbXRvb2xzLCA8ZW0+REVWSUNFPC9lbT4gc2hvdWxkIGJlIGFuDQordW5tb3VudGVkIGZpbGUgc3lzdGVtLiAgRm9yIHRoZSBET1MvV2luMzIvV2luNjQgaW5zdGFsbGVycywgPGVtPkRFVklDRTwvZW0+DQorc2hvdWxkIGJlIGEgZHJpdmUgbGlrZSA8ZW0+YTo8L2VtPiAoY2FzZSBpbnNlbnNpdGl2ZSkuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Rm9yIHZlcnNpb25zIH40LjAwIGFuZCBsYXRlciwgZWl0aGVyIC1pLy0taW5zdGFsbCBvciAtVS8tLXVwZGF0ZSBtdXN0IGJlDQorc3BlY2lmaWVkIHVubGVzcyBtb2RpZnlpbmcgdGhlIEFEViBvZiBhbiBleGlzdGluZyBpbnN0YWxsIChvcHRpb25zDQordGFnZ2VkIHdpdGggPGVtPkFEVjwvZW0+KSBvciByZXF1ZXN0aW5nIHRoZSBoZWxwL3VzYWdlIG9yIHZlcnNpb24gaW5mbywgLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklmLCBkdXJpbmcgYm9vdCwgdGhlIFNoaWZ0IG9yIEFsdCBrZXlzIGFyZSBoZWxkIGRvd24sIG9yIHRoZSBDYXBzIG9yDQorU2Nyb2xsIGxvY2tzIGFyZSBzZXQsIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gd2lsbCBkaXNwbGF5IGEgPHN0cm9uZz5saWxvPC9zdHJvbmc+KDgpIC1zdHlsZSAiYm9vdDoiDQorcHJvbXB0LiBUaGUgdXNlciBjYW4gdGhlbiB0eXBlIGEga2VybmVsIGZpbGUgbmFtZSBmb2xsb3dlZCBieSBhbnkga2VybmVsDQorcGFyYW1ldGVycy4gVGhlIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gYm9vdGxvYWRlciBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgdGhlDQora2VybmVsIG9yIGNvbmZpZyBmaWxlcyBpbiBhZHZhbmNlLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gc3VwcG9ydHMgdGhlIGxvYWRpbmcgb2YgaW5pdGlhbCByYW1kaXNrcyAoaW5pdHJkKSBhbmQgdGhlDQorYnpJbWFnZSBrZXJuZWwgZm9ybWF0LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlBsZWFzZSBub3RlLCB0aGUgbGRsaW51eC5zeXMgYm9vdCBsb2FkZXIgZmlsZSBpcyBmbGFnZ2VkIGFzIGltbXV0YWJsZQ0KKyh3aGVyZSBhcHBsaWNhYmxlKSBhbmQgaXMgbW9kaWZpZWQgYWZ0ZXIgY29weWluZyBpbiB0byBoZWxwIGVuc3VyZQ0KK2Jvb3QtdGltZSBpbnRlZ3JpdHkuICBGaWxlIHN5c3RlbXMgd2l0aCBhIHN1ZmZpY2llbnRseSBsYXJnZSBib290IGxvYWRlcg0KK3Jlc2VydmVkIGFyZWEsIGxpa2UgYnRyZnMsIHdpbGwgaGF2ZSBsZGxpbnV4LnN5cyBpbnN0YWxsZWQgdGhlcmUgcmF0aGVyDQordGhhbiBhcyBhIG5vcm1hbCBmaWxlLiAgUHJpb3IgdG8gdmVyc2lvbiA0LjAwLCBleHRsaW51eCB3b3VsZCBpbnN0YWxsIGENCitmaWxlIGV4dGxpbnV4LnN5cyB3aGljaCB2ZXJzaW9ucyA0LjAwIGFuZCBsYXRlciBpbnN0YWxsZXJzIHdpbGwgcmVwbGFjZSB3aXRoIGxkbGludXguc3lzLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfb3B0aW9ucyI+T1BUSU9OUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9zdGFuZGFsb25lX29wdGlvbnMiPlN0YW5kYWxvbmUgb3B0aW9uczwvaDM+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LWk8L3N0cm9uZz4sIDxzdHJvbmc+LS1pbnN0YWxsPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKH40LjAwKykgSW5zdGFsbCBTWVNMSU5VWCwgcmVnYXJkbGVzcyBvZiBhbiBleGlzdGluZyBpbnN0YWxsLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tVTwvc3Ryb25nPiwgPHN0cm9uZz4tLXVwZGF0ZTwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyh+NC4wMCspIFVwZGF0ZSBhbiBleGlzdGluZyBTWVNMSU5VWC9FWFRMSU5VWCBpbnN0YWxsLiAgSWYgbm8gU3lzbGludXgNCitib290IGxvYWRlciBpcyBwcmVzZW50LCByZXR1cm4gYW4gZXJyb3IuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1oPC9zdHJvbmc+LCA8c3Ryb25nPi0taGVscDwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0Rpc3BsYXkgaGVscC91c2FnZSBpbmZvcm1hdGlvbi4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LXY8L3N0cm9uZz4sIDxzdHJvbmc+LS12ZXJzaW9uPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorRGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IGltbWVkaWF0ZWx5Lg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX3JlZ3VsYXJfb3B0aW9ucyI+UmVndWxhciBPcHRpb25zPC9oMz4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tYTwvc3Ryb25nPiwgPHN0cm9uZz4tLWFjdGl2ZTwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyhET1MvV2luMzIvV2luNjQgT05MWSkgTWFyayB0aGUgaW5zdGFsbCB0YXJnZXQgZmlsZSBzeXN0ZW0mIzgyMTc7cyBwYXJ0aXRpb24NCithY3RpdmUuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1kPC9zdHJvbmc+LCA8c3Ryb25nPi0tZGlyZWN0b3J5PC9zdHJvbmc+IDxlbT5zdWJkaXJlY3Rvcnk8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyhOb3QgbmVjZXNzYXJ5IGZvciBleHRsaW51eCBhcyBpdCBpcyBpbXBsaWVkIGJ5IDxlbT5QQVRIPC9lbT4pIEluc3RhbGwgdGhlDQorPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBjb250cm9sIGZpbGVzIGluIGEgc3ViZGlyZWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lDQorKHJlbGF0aXZlIHRvIHRoZSByb290IGRpcmVjdG9yeSBvbiB0aGUgZGV2aWNlKS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LS1kZXZpY2U8L3N0cm9uZz4gPGVtPkRFVklDRTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKGV4dGxpbnV4IE9OTFk7IDQuMDYrKSBGb3JjZSB1c2Ugb2YgYSBzcGVjaWZpYyBibG9jayBkZXZpY2UgKGV4cGVydHMNCitvbmx5KS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LWY8L3N0cm9uZz4sIDxzdHJvbmc+LS1mb3JjZTwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0ZvcmNlIGluc3RhbGwgZXZlbiBpZiBpdCBhcHBlYXJzIHVuc2FmZS4gIEJlZm9yZSA0LjAwLCAtZiB3YXMgdXNlZCBmb3INCistLW9mZnNldCBpbiB0aGUgTGludXggaW5zdGFsbGVycy4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LUg8L3N0cm9uZz4sIDxzdHJvbmc+LS1oZWFkczwvc3Ryb25nPiA8ZW0+aGVhZC1jb3VudDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorT3ZlcnJpZGUgdGhlIGRldGVjdGVkIG51bWJlciBvZiBoZWFkcyBmb3IgdGhlIGdlb21ldHJ5LiAgU2VlIGFsc28NCis8c3Ryb25nPi0tc2VjdG9yPC9zdHJvbmc+Lg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPi1tPC9zdHJvbmc+LCA8c3Ryb25nPi0tbWJyPC9zdHJvbmc+Og0KKyhET1MvV2luMzIvV2luNjQgT05MWSkgSW5zdGFsbCB0aGUgcmVndWxhciBTeXNsaW51eCBNQlIgY29kZSB0byB0aGUgTUJSLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tTTwvc3Ryb25nPiwgPHN0cm9uZz4tLW1lbnUtc2F2ZTwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyg0LjAwKzsgQURWKSBTZXQgdGhlIGxhYmVsIHRvIHNlbGVjdCBhcyBkZWZhdWx0IG9uIHRoZSBuZXh0IGJvb3QuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1vPC9zdHJvbmc+LCA8c3Ryb25nPi0tb25jZTwvc3Ryb25nPiA8ZW0+Y29tbWFuZDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKEFEVikgRGVjbGFyZSBhIGJvb3QgY29tbWFuZCB0byBiZSB0cmllZCBvbiB0aGUgZmlyc3QgYm9vdCBvbmx5LiAgVGhlDQordXNlIG9mIDxzdHJvbmc+LW88L3N0cm9uZz4gZm9yIHRoZSBMaW51eCBpbnN0YWxsZXJzIHN5c2xpbnV4IG9yIHN5c2xpbnV4LW10b29scyBoYXMNCitiZWVuIGRlcHJlY2F0ZWQgYXMgb2YgfjQuMDAgYW5kIGlzIG5vIGxvbmdlciB2YWxpZCBhcyBvZiB+NC4wMi4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LU88L3N0cm9uZz4sIDxzdHJvbmc+LS1jbGVhci1vbmNlPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorQ2xlYXIgdGhlIGJvb3Qtb25jZSBjb21tYW5kLiAgU2VlIGFsc28gPHN0cm9uZz4tLW9uY2U8L3N0cm9uZz4uDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1yPC9zdHJvbmc+LCA8c3Ryb25nPi0tcmFpZDwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyhBRFYpIFJBSUQgbW9kZS4gIElmIGJvb3QgZmFpbHMsIHRlbGwgdGhlIEJJT1MgdG8gYm9vdCB0aGUgbmV4dCBkZXZpY2UNCitpbiB0aGUgYm9vdCBzZXF1ZW5jZSAodXN1YWxseSB0aGUgbmV4dCBoYXJkIGRpc2spIGluc3RlYWQgb2Ygc3RvcHBpbmcNCit3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICBUaGlzIGlzIHVzZWZ1bCBmb3IgUkFJRC0xIGJvb3RpbmcuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi0tcmVzZXQtYWR2PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKEFEVikgUmVzZXQgYXV4aWxsaWFyeSBkYXRhIHZlY3Rvci4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LVM8L3N0cm9uZz4sIDxzdHJvbmc+LS1zZWN0b3JzPC9zdHJvbmc+IDxlbT5zZWN0b3ItY291bnQ8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK092ZXJyaWRlIHRoZSBkZXRlY3RlZCBudW1iZXIgb2Ygc2VjdG9ycyBmb3IgdGhlIGdlb21ldHJ5LiAgU2VlIGFsc28NCis8c3Ryb25nPi0taGVhZDwvc3Ryb25nPi4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LXM8L3N0cm9uZz4sIDxzdHJvbmc+LS1zdHVwaWQ8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJbnN0YWxsIGEgInNhZmUsIHNsb3cgYW5kIHN0dXBpZCIgdmVyc2lvbiBvZiA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+LiBUaGlzIHZlcnNpb24NCittYXkgd29yayBvbiBzb21lIHZlcnkgYnVnZ3kgQklPU2VzIG9uIHdoaWNoIDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gd291bGQgb3RoZXJ3aXNlDQorZmFpbC4gSWYgeW91IGZpbmQgYSBtYWNoaW5lIG9uIHdoaWNoIHRoZSAtcyBvcHRpb24gaXMgcmVxdWlyZWQgdG8gbWFrZQ0KK2l0IGJvb3QgcmVsaWFibHksIHBsZWFzZSBzZW5kIGFzIG11Y2ggaW5mbyBhYm91dCB5b3VyIG1hY2hpbmUgYXMgeW91DQorY2FuLCBhbmQgaW5jbHVkZSB0aGUgZmFpbHVyZSBtb2RlLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tdDwvc3Ryb25nPiwgPHN0cm9uZz4tLW9mZnNldDwvc3Ryb25nPiA8ZW0+b2Zmc2V0PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoTGludXggc3lzbGludXgvc3lzbGludXgtbXRvb2xzIE9OTFkpIEluZGljYXRlcyB0aGF0IHRoZSBmaWxlc3lzdGVtIGlzDQorYXQgYW4gb2Zmc2V0IGZyb20gdGhlIGJhc2Ugb2YgdGhlIGRldmljZSBvciBmaWxlLg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPi16PC9zdHJvbmc+LCA8c3Ryb25nPi0temlwZHJpdmU8L3N0cm9uZz4NCitBc3N1bWUgemlwZHJpdmUgZ2VvbWV0cnkgKDxlbT4tLWhlYWRzIDY0IC0tc2VjdG9ycyAzMjwvZW0+KS4gIFNlZSBhbHNvIDxzdHJvbmc+LS1oZWFkPC9zdHJvbmc+DQorYW5kIDxzdHJvbmc+LS1zZWN0b3I8L3N0cm9uZz4uPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9leGFtcGxlcyI+RVhBTVBMRVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfYm9vdGluZ19kb3MiPkJvb3RpbmcgRE9TPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciBib290aW5nIERPUyBhbmQgb3RoZXIgc2ltaWxhciBvcGVyYXRpbmcgc3lzdGVtcywgdGhlcmUgaXMgYW4gZWFzeQ0KK2FuZCBnZW5lcmFsbHkgcmVsaWFibGUgc29sdXRpb24gdG8gc3Vic3RpdHV0ZSBpbiBTWVNMSU5VWCBhcyB0aGUgcHJpbWFyeQ0KK2Jvb3QgbG9hZGVyLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJ1bGlzdCI+PHVsPg0KKzxsaT4NCis8cD4NCitNYWtlIGEgRE9TLWJvb3RhYmxlIGRpc2s7ICBUaGUgZm9sbG93aW5nIGFyZSBwb3NzaWJsZSBjb21tYW5kczoNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmZvcm1hdCBhOiAvcw0KK3N5cyBhOjwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitDb3B5IHRoZSBET1MgYm9vdCBzZWN0b3Igb2ZmIHVzaW5nIExpbnV4IG9yIGNvcHlicy5jb206DQorPC9wPg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5kZCBpZj0vZGV2L2ZkMCBvZj1kb3MuYnNzIGJzPTUxMiBjb3VudD0xDQorY29weWJzIGE6IGE6ZG9zLmJzczwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitJbnN0YWxsIFNZU0xJTlVYIHVzaW5nIG9uZSBvZjoNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPnN5c2xpbnV4IGE6DQorc3lzbGludXggL2Rldi9mZDAgICAgICAgICAgICAgICAoYmVmb3JlIDQuMDApDQorc3lzbGludXggLWkgL2Rldi9mZDAgICAgICAgICAgICAoNC4wMCspPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0ZvciBMaW51eCwgbW91bnQgdGhlIGRpc2sgYW5kIGNvcHkgdGhlIGRvcy5ic3MgdG8gdGhlIGRpc2s6DQorPC9wPg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5tb3VudCAtdCBtc2RvcyAvZGV2L2ZkMCAvbW50DQorY3AgZG9zLmJzcyAvbW50PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0NvcHkgYSBMaW51eCBrZXJuZWwgaW1hZ2UgYW5kIGluaXRyZCBwYXlsb2FkIGZpbGVzOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5MaW51eDo8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisgICAgICAgIGNwIHZtbGludXggL21udA0KKyAgICAgICAgY3AgaW5pdHJkLmd6IC9tbnQNCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RE9TL1dpbmRvd3M6PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorICAgICAgICBjb3B5IHZtbGludXggYToNCisgICAgICAgIGNvcHkgaW5pdHJkLmd6IGE6DQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitGb3IgTGludXgsIHVtb3VudCB0aGUgZGlzayAoaWYgYXBwbGljYWJsZSk6DQorPC9wPg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT51bW91bnQgL21udDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2xpPg0KKzwvdWw+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX21iciI+TUJSPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkluIG9yZGVyIHRvIGJvb3QgZnJvbSBhIGhhcmQgZGlzayAob3IgaGFyZCBkaXNrLWxpa2UgZGV2aWNlKSBpbiBCSU9TDQorbW9kZSwgYW4gYXBwcm9wcmlhdGUgTUJSIGJvb3QgYmxvY2sgbXVzdCBhbHNvIGJlIGluc3RhbGxlZCBpbiB0aGUgTUJSDQorKGZpcnN0IHNlY3RvciBvciA1MTIgYnl0ZXMgb2YgdGhlIGRpc2spLCBvY2N1cHlpbmcgYXQgbW9zdCA0NDAgYnl0ZXMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkRPUy9XaW5kb3dzOjwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0lmIHVzaW5nIEZESVNLLCBGRElTSyBvciBhIHNpbWlsYXIgYXBwbGljYXRpb24gbXVzdCBhbHNvIGJlIHVzZWQgdG8gbWFyaw0KK3RoZSBwYXJ0aXRpb24gYXMgYWN0aXZlLg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+ICAgIGZkaXNrIC9tYnINCitPUg0KKyAgICBzeXNsaW51eCAtbWEgYzo8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+TGludXg6PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmRkIGJzPTQ0MCBjb3VudD0xIGNvbnY9bm90cnVuYyBpZj1tYnIvbWJyLmJpbiBvZj0vZGV2L3NkYTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciBhbHRtYnIuYmluLCBhbiBlYXN5IHdheSB0byBvdmVyd3JpdGUgdGhlIE1CUiBib290IGJsb2NrIGFuZCBzcGVjaWZ5DQordGhlIHBhcnRpb24gbnVtYmVyIGlzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+cHJpbnRmICdcMScgfCBjYXQgYWx0bWJyLmJpbiAtIHwgZGQgYnM9NDQwIGNvdW50PTEgXA0KKyAgaWZsYWc9ZnVsbGJsb2NrIGNvbnY9bm90cnVuYyBvZj0vZGV2L3NkYTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGU6IHVzaW5nIDxlbT5jYXQ8L2VtPiBmb3Igd3JpdGluZyB0aGUgTUJSIGNhbiB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgY2F1c2UNCitkYXRhIGxvc3Mgb3Igb3ZlcndyaXR0aW5nLiAgRm9yIHRoaXMgcmVhc29uLCB1c2luZyA8ZW0+ZGQ8L2VtPiBpcyByZWNvbW1lbmRlZA0KK2ZvciBhbGwgc2l0dWF0aW9ucy48L3A+PC9kaXY+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9zZWVfYWxzbyI+U0VFIEFMU088L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+c3lzbGludXguY2ZnPC9zdHJvbmc+KDUpLCA8c3Ryb25nPnN5c2xpbnV4LWNsaTwvc3Ryb25nPigxKSwgPHN0cm9uZz5saWxvPC9zdHJvbmc+KDgpLCA8c3Ryb25nPmtleXRhYi1saWxvLnBsPC9zdHJvbmc+KDgpLA0KKzxzdHJvbmc+ZmRpc2s8L3N0cm9uZz4oOCksIDxzdHJvbmc+bWtmczwvc3Ryb25nPig4KSwgPHN0cm9uZz5zdXBlcmZvcm1hdDwvc3Ryb25nPigxKS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2F1dGhvciI+QVVUSE9SPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIEFzY2lpRG9jIGRlcml2ZWQgZG9jdW1lbnQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbA0KKzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gZG9jdW1lbnRhdGlvbiBieSBILiBQZXRlciBBbnZpbiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmhwYUB6eXRvci5jb20iPmhwYUB6eXRvci5jb208L2E+Jmd0Oy4gVGhlIGNvbnZlcnNpb24gdG8NCithIG1hbnBhZ2Ugd2FzIG1hZGUgYnkgQXJ0aHVyIEtvcm4gJmx0OzxhIGhyZWY9Im1haWx0bzphcnRodXJAa29ybi5jaCI+YXJ0aHVyQGtvcm4uY2g8L2E+Jmd0Oy4gIFRoZSBjb252ZXJzaW9uIHRvDQorYW4gQXNjaWlEb2Mgd2FzIG1hZGUgYnkgR2VuZSBDdW1tICZsdDs8YSBocmVmPSJtYWlsdG86Z2VuZS5jdW1tQGdtYWlsLmNvbSI+Z2VuZS5jdW1tQGdtYWlsLmNvbTwvYT4mZ3Q7PC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9jb3B5cmlnaHQiPkNPUFlSSUdIVDwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Q29weXJpZ2h0IChDKSAxOTk0LTIwMTIgSC4gUGV0ZXIgQW52aW4uIEZyZWUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZA0KK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIHZlcnNpb24gMg0KKyhHUEx2MikgKG9yLCBhdCB5b3VyIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24pLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJmb290bm90ZXMiPjxociAvPjwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3RlciI+DQorPGRpdiBpZD0iZm9vdGVyLXRleHQiPg0KK0xhc3QgdXBkYXRlZCAyMDE0LTAxLTE3IDE2OjA5OjU2IFBTVA0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZWZpMzIvdmVyc2lvbi5nZW4gYi9lZmkzMi92ZXJzaW9uLmdlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGE2ZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpMzIvdmVyc2lvbi5nZW4KQEAgLTAsMCArMSw2IEBACislZGVmaW5lIFZFUlNJT04gNi4wMworJWRlZmluZSBWRVJTSU9OX1NUUiAiNi4wMyIKKyVkZWZpbmUgVkVSU0lPTl9NQUpPUiA2CislZGVmaW5lIFZFUlNJT05fTUlOT1IgMworJWRlZmluZSBZRUFSIDIwMTQKKyVkZWZpbmUgWUVBUl9TVFIgIjIwMTQiCmRpZmYgLS1naXQgYS9lZmkzMi92ZXJzaW9uLmggYi9lZmkzMi92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxOTc5OAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTMyL3ZlcnNpb24uaApAQCAtMCwwICsxLDYgQEAKKyNkZWZpbmUgVkVSU0lPTiA2LjAzCisjZGVmaW5lIFZFUlNJT05fU1RSICI2LjAzIgorI2RlZmluZSBWRVJTSU9OX01BSk9SIDYKKyNkZWZpbmUgVkVSU0lPTl9NSU5PUiAzCisjZGVmaW5lIFlFQVIgMjAxNAorI2RlZmluZSBZRUFSX1NUUiAiMjAxNCIKZGlmZiAtLWdpdCBhL2VmaTY0L2NvbTMyL2NoYWluL2NoYWluLmMzMiBiL2VmaTY0L2NvbTMyL2NoYWluL2NoYWluLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYWM1YzVhCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvY2hhaW4vY2hhaW4uYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTY0L2NvbTMyL2NtZW51L2NvbXBsZXguYzMyIGIvZWZpNjQvY29tMzIvY21lbnUvY29tcGxleC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjdjOGIxYgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2NtZW51L2NvbXBsZXguYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTY0L2NvbTMyL2NtZW51L2Rpc3BsYXkuYzMyIGIvZWZpNjQvY29tMzIvY21lbnUvZGlzcGxheS5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWIwMjE2MAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2NtZW51L2Rpc3BsYXkuYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTY0L2NvbTMyL2NtZW51L2xpYm1lbnUvbGlibWVudS5jMzIgYi9lZmk2NC9jb20zMi9jbWVudS9saWJtZW51L2xpYm1lbnUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNkYWM0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9jbWVudS9saWJtZW51L2xpYm1lbnUuYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTY0L2NvbTMyL2NtZW51L3NpbXBsZS5jMzIgYi9lZmk2NC9jb20zMi9jbWVudS9zaW1wbGUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkZTFkODUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9jbWVudS9zaW1wbGUuYzMyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTY0L2NvbTMyL2NtZW51L3Rlc3QuYyBiL2VmaTY0L2NvbTMyL2NtZW51L3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZkZTIxCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvY21lbnUvdGVzdC5jCkBAIC0wLDAgKzEsNDc3IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA2IE11cmFsaSBLcmlzaG5hbiBHYW5hcGF0aHkgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCisjZW5kaWYKKworI2luY2x1ZGUgImNtZW51LmgiCisjaW5jbHVkZSAiaGVscC5oIgorI2luY2x1ZGUgInBhc3N3b3Jkcy5oIgorI2luY2x1ZGUgImNvbTMyaW8uaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBNQVhfQ01EX0xJTkVfTEVOR1RIIDUxNAorCit0eXBlZGVmIHN0cnVjdCBzX3h0cmEgeworICBsb25nIGlwYXBwZW5kOyAvLyBTdG9yZXMgdGhlIGlwYXBwZW5kIGZsYWcgdG8gc2VuZCAodXNlZnVsIGZvciBQWEVMSU5VWCBvbmx5KQorICBjaGFyICphcmdzbWVudTsgLy8gU3RvcmVzIHRoZSBuYW1lIG9mIG1lbnUgd2hpY2ggY29udGFpbnMgb3B0aW9ucyBmb3IgdGhlIGdpdmVuIFJVTiBpdGVtCisgIGNoYXIgKnBlcm1zOyAvLyBzdG9yZXMgdGhlIHBlcm1pc3Npb25zIHJlcXVpcmVkIHRvIGFjdGl2YXRlIHRoZSBpdGVtCit9IHRfeHRyYTsKKwordHlwZWRlZiB0X3h0cmEgKnB0X3h0cmE7IC8vIFBvaW50ZXIgdG8gZXh0cmEgZGF0YXN0cnVjdHVyZQorCisvLyBUeXBlcyBvZiBkb3QgY29tbWFuZHMgZm9yIHdoaWNoIGNhbGxlciB0YWtlcyByZXNwb25zaWJpbGl0eSBvZiBoYW5kbGluZworLy8gSW4gc29tZSBjYXNlIHNvbWUgY29tbWFuZHMgbWF5IG5vdCBtYWtlIHNlbnNlLCBpdCBpcyB1cCB0byB0aGUgY2FsbGVyCisvLyB0byBoYW5kbGUgY2FzZXMgd2hpY2ggZG8gbm90IG1ha2Ugc2Vuc2UKK3R5cGVkZWYgZW51bSB7UVVJVF9DTUQsIFJFUEVBVF9DTUQsIEVOVEVSX0NNRCwgRVNDQVBFX0NNRH0gdF9kb3RjbWQ7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzICovCisKKy8vIGRlZmF1bHQgdXNlcgorI2RlZmluZSBHVUVTVF9VU0VSICJndWVzdCIKKworLy8gZm9yIGxvY2FsIGNvbW1hbmRzLiByZXR1cm4gdmFsdWUgb2YgZXhlY2RvdGNtZAorI2RlZmluZSBRVUlUX0NNRCAwCisjZGVmaW5lIFJQVF9DTUQgMQorCitjaGFyIHVzZXJuYW1lWzEyXTsgLy8gTmFtZSBvZiB1c2VyIGN1cnJlbnRseSB1c2luZyB0aGUgc3lzdGVtCisKK2ludCBQV0RfUk9XOyAvLyBMaW5lIG51bWJlciB3aGVyZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGhhcHBlbnMKK2ludCBFRElUX1JPVzsgLy8gcm93IHdoZXJlIFVzZXIgVGFiCisKK2NoYXIgbG9naW5zdHJbXSA9ICI8TD5vZ2luICAiOworY2hhciBsb2dvdXRzdHJbMzBdOworCitpbnQgdm1vZGU7IC8vIFRoZSB2aWRlbyBtb2RlIHdlIHdhbnQgdG8gYmUgaW4KK2NoYXIgdGltZW91dGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsgLy8gQ29tbWFuZCB0byBleGVjdXRlIG9uIHRpbWVvdXQKK2NoYXIgdG90YWx0aW1lb3V0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOyAvLyBDb21tYW5kIHRvIGV4ZWN1dGUgb24gdG90YWx0aW1lb3V0CisKK2NoYXIgUVVJVFNUUltdID0gIi5xdWl0IjsgLy8gc2FtZSBhcyBleGl0CitjaGFyIElHTk9SRVNUUltdPSIuaWdub3JlIjsgLy8gc2FtZSBhcyByZXBlYXQsIHdhaXQKKworLyotLS0tLS0tLS0tLS0tLS0tICBFbmQgZ2xvYmFscyAqLworCisvLyByZXR1cm5zIHBvaW50ZXIgdG8gZmlyc3Qgbm9uLXNwYWNlIGNoYXIKKy8vIGFuZCBhZHZhbmNlcyBlbmQgb2Ygc3RyIGJ5IHJlbW92aW5nIHRyYWlsaW5nIHNwYWNlcworY2hhciAqIHN0cmlwKGNoYXIgKnN0cikKK3sKKyAgY2hhciAqcCwqcywqZTsKKyAgaWYgKCFzdHIpIHJldHVybiBOVUxMOworICBwID0gc3RyOworICBzID0gTlVMTDsKKyAgZSA9IE5VTEw7CisgIHdoaWxlICgqcCkgeworICAgIGlmICgqcCAhPSAnICcpIHsKKyAgICAgICAvLyBtYXJrIHN0YXJ0IG9mIHN0cmluZyBvciByZWNvcmQgdGhlIGxhc3QgdmlzaXRlZCBub24tc3BhY2UgY2hhcgorICAgICAgIGlmICghcykgcz1wOyBlbHNlIGU9cDsKKyAgICB9CisgICAgcCsrOworICB9CisgICooKytlKT0nXDAnOyAvLyBraWxsIHN0cmluZyBlYXJsaWVyCisgIHJldHVybiBzOworfQorCisvLyBleGVjdXRlcyBhIGxpc3Qgb2YgJSBzZXBhcmF0ZWQgY29tbWFuZHMKKy8vIG5vbi1kb3QgY29tbWFuZHMgYXJlIGFzc3VtZWQgdG8gYmUgc3lzbGludXggY29tbWFuZHMKKy8vIEFsbCBzeXNsaW51eCBjb21tYW5kcyBhcmUgYXBwZW5kZWQgd2l0aCB0aGUgY29udGVudHMgb2Yga2VyYXJncworLy8gSWYgaXQgZmFpbHMgKGtlcm5lbCBub3QgZm91bmQpIHRoZW4gdGhlIG5leHQgb25lIGlzIHRyaWVkIGluIHRoZQorLy8gbGlzdAorLy8gcmV0dXJucyBRVUlUX0NNRCBvciBSUFRfQ01ECit0X2RvdGNtZCBleGVjZG90Y21kKGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqZGVmY21kLCBjb25zdCBjaGFyICprZXJhcmdzKQoreworICAgY2hhciBjbWRsaW5lW01BWF9DTURfTElORV9MRU5HVEhdOworICAgY2hhciBkb3RjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgICBjaGFyICpjdXJyLCpuZXh0LCpwLCphcmdzOworICAgY2hhciBjdHI7CisKKyAgIHN0cmNweShkb3RjbWQsY21kKTsKKyAgIG5leHQgPSBkb3RjbWQ7CisgICBjbWRsaW5lWzBdID0gJ1wwJzsKKyAgIHdoaWxlICgqbmV4dCkgeyAvLyBpZiBzb21ldGhpbmcgdG8gZG8KKyAgICAgIGN1cnIgPSBuZXh0OworICAgICAgcCA9IHN0cmNocihuZXh0LCclJyk7CisgICAgICBpZiAocCkgeworICAgICAgICAgKnAtLT0nXDAnOyBuZXh0PXArMjsKKyAgICAgICAgIHdoaWxlICgqcCA9PSAnICcpIHAtLTsKKyAgICAgICAgICooKytwKT0nXDAnOyAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKmRlZmNtZCkgeyAvLyBleGVjdXRlIGRlZmNtZCBuZXh0CisgICAgICAgICAgICBuZXh0PWRlZmNtZDsKKyAgICAgICAgICAgIGRlZmNtZD1OVUxMOyAvLyBleGVjIGRlZiBjbWQgb25seSBvbmNlCisgICAgICAgIH0gZWxzZSBuZXh0PU5VTEw7CisgICAgICB9CisgICAgICAvLyBub3cgd2UganVzdCBuZWVkIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgImN1cnIiCisgICAgICBjdXJyID0gc3RyaXAoY3Vycik7CisgICAgICBpZiAoY3VyclswXSAhPSAnLicpIHsgLy8ganVzdCBydW4gdGhlIGtlcm5lbAorICAgICAgICAgc3RyY3B5KGNtZGxpbmUsY3Vycik7CisgICAgICAgICBpZiAoa2VyYXJncykgc3RyY2F0KGNtZGxpbmUsa2VyYXJncyk7CisgICAgICAgICBydW5zeXNsaW51eGltYWdlKGNtZGxpbmUsMCk7IC8vIE5vIElQQXBwZW5kCisgICAgICB9IGVsc2UgeyAvLyBXZSBoYXZlIGEgRE9UIGNvbW1hbmQKKyAgICAgICAgLy8gc3BsaXQgY29tbWFuZCBpbnRvIGNvbW1hbmQgYW5kIGFyZ3MgKG1heSBiZSBlbXB0eSkKKyAgICAgICAgYXJncyA9IGN1cnI7CisgICAgICAgIHdoaWxlICggKCphcmdzICE9ICcgJykgJiYgKCphcmdzICE9ICdcMCcpICkgYXJncysrOworICAgICAgICBpZiAoKmFyZ3MpIHsgLy8gZm91bmQgYSBzcGFjZQorICAgICAgICAgICAqYXJncysrID0gJ1wwJzsKKyAgICAgICAgICAgd2hpbGUgKCphcmdzID09ICcgJykgYXJncysrOyAvLyBza2lwIG92ZXIgc3BhY2VzCisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoc3RyY21wKGN1cnIsIi5leGl0Iik9PTApIHx8CisgICAgICAgICAgICAgKHN0cmNtcChjdXJyLCIucXVpdCIpPT0wKQorICAgICAgICAgICApCisgICAgICAgICAgIHJldHVybiBRVUlUX0NNRDsKKyAgICAgICAgaWYgKCAoc3RyY21wKGN1cnIsIi5yZXBlYXQiKT09MCkgfHwKKyAgICAgICAgICAgICAoc3RyY21wKGN1cnIsIi5pZ25vcmUiKT09MCkgfHwKKyAgICAgICAgICAgICAoc3RyY21wKGN1cnIsIi53YWl0Iik9PTApCisgICAgICAgICAgICkKKyAgICAgICAgICAgcmV0dXJuIFJQVF9DTUQ7CisgICAgICAgIGlmIChzdHJjbXAoY3VyciwiLmJlZXAiKT09MCkgeworICAgICAgICAgICBpZiAoKGFyZ3MpICYmICgnMCcgPD0gYXJnc1swXSkgJiYgKGFyZ3NbMF0gPD0gJzknKSkKKyAgICAgICAgICAgICAgY3RyID0gYXJnc1swXS0nMCc7CisgICAgICAgICAgIGVsc2UgY3RyPTE7CisgICAgICAgICAgIGZvciAoO2N0cj4wOyBjdHItLSkgYmVlcCgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAoY3VyciwiLmhlbHAiKT09MCkgcnVuaGVscChhcmdzKTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBSUFRfQ01EOyAvLyBieSBkZWZhdWx0IHdlIGRvIG5vdCBxdWl0Cit9CisKKworVElNRU9VVENPREUgdGltZW91dChjb25zdCBjaGFyICpjbWQpCit7CisgIHRfZG90Y21kIGM7CisgIGMgPSBleGVjZG90Y21kKGNtZCwiLndhaXQiLE5VTEwpOworICBzd2l0Y2goYykgeworICAgIGNhc2UgRU5URVJfQ01EOgorICAgICAgICAgcmV0dXJuIENPREVfRU5URVI7CisgICAgY2FzZSBFU0NBUEVfQ01EOgorICAgICAgICAgcmV0dXJuIENPREVfRVNDQVBFOworICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gQ09ERV9XQUlUOworICB9Cit9CisKK1RJTUVPVVRDT0RFIG9udGltZW91dCh2b2lkKQoreworICAgcmV0dXJuIHRpbWVvdXQodGltZW91dGNtZCk7Cit9CisKK1RJTUVPVVRDT0RFIG9udG90YWx0aW1lb3V0KHZvaWQpCit7CisgICByZXR1cm4gdGltZW91dCh0b3RhbHRpbWVvdXRjbWQpOworfQorCit2b2lkIGtleXNfaGFuZGxlcih0X21lbnVzeXN0ZW0gKiBtcyBfX2F0dHJpYnV0ZV9fICgoIHVudXNlZCApKSwgdF9tZW51aXRlbSAqIG1pLCBpbnQgc2NhbmNvZGUpCit7CisgICBpbnQgbmMsIG5yOworCisgICBpZiAoZ2V0c2NyZWVuc2l6ZSgxLCAmbnIsICZuYykpIHsKKyAgICAgICAvKiBVbmtub3duIHNjcmVlbiBzaXplPyAqLworICAgICAgIG5jID0gODA7CisgICAgICAgbnIgPSAyNDsKKyAgIH0KKworICAgaWYgKCAoc2NhbmNvZGUgPT0gS0VZX0YxKSAmJiAobWktPmhlbHBpZCAhPSAweEZGRkYpICkgeyAvLyBJZiBzY2FuY29kZSBvZiBGMSBhbmQgbm9uLXRyaXZpYWwgaGVscGlkCisgICAgICBydW5oZWxwc3lzdGVtKG1pLT5oZWxwaWQpOworICAgfQorCisgICAvLyBJZiB1c2VyIGhpdCBUQUIsIGFuZCBpdGVtIGlzIGFuICJleGVjdXRhYmxlIiBpdGVtCisgICAvLyBhbmQgdXNlciBoYXMgcHJpdmlsZWdlcyB0byBlZGl0IGl0LCBlZGl0IGl0IGluIHBsYWNlLgorICAgaWYgKChzY2FuY29kZSA9PSBLRVlfVEFCKSAmJiAobWktPmFjdGlvbiA9PSBPUFRfUlVOKSAmJgorICAgICAgIChFRElUX1JPVyA8IG5yKSAmJiAoRURJVF9ST1cgPiAwKSAmJgorICAgICAgIChpc2FsbG93ZWQodXNlcm5hbWUsImVkaXRjbWQiKSB8fCBpc2FsbG93ZWQodXNlcm5hbWUsInJvb3QiKSkpIHsKKyAgICAgLy8gVXNlciB0eXBlZCBUQUIgYW5kIGhhcyBwZXJtaXNzaW9ucyB0byBlZGl0IGNvbW1hbmQgbGluZQorICAgICBnb3RveHkoRURJVF9ST1csMSk7CisgICAgIGNzcHJpbnQoIkNvbW1hbmQgbGluZToiLDB4MDcpOworICAgICBlZGl0c3RyaW5nKG1pLT5kYXRhLEFDVElPTkxFTik7CisgICAgIGdvdG94eShFRElUX1JPVywxKTsKKyAgICAgY3ByaW50KCcgJywweDA3LG5jLTEpOworICAgfQorfQorCit0X2hhbmRsZXJfcmV0dXJuIGxvZ2luX2hhbmRsZXIodF9tZW51c3lzdGVtICptcywgdF9tZW51aXRlbSAqbWkpCit7CisgICh2b2lkKW1pOyAvLyBVbnVzZWQKKyAgY2hhciBwd2RbNDBdOworICBjaGFyIGxvZ2luWzQwXTsKKyAgaW50IG5jLCBucjsKKyAgdF9oYW5kbGVyX3JldHVybiBydjsKKworICAodm9pZCltczsKKworICBydiA9IEFDVElPTl9JTlZBTElEOworICBpZiAoUFdEX1JPVyA8IDApIHJldHVybiBydjsgLy8gTm8gbmVlZCB0byBhdXRoZW50aWNhdGUKKworICBpZiAobWktPml0ZW0gPT0gbG9naW5zdHIpIHsgLyogVXNlciB3YW50cyB0byBsb2dpbiAqLworICAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZuciwgJm5jKSkgeworICAgICAgICAvKiBVbmtub3duIHNjcmVlbiBzaXplPyAqLworICAgICAgICBuYyA9IDgwOworICAgICAgICBuciA9IDI0OworICAgIH0KKworICAgIGdvdG94eShQV0RfUk9XLDEpOworICAgIGNzcHJpbnQoIkVudGVyIFVzZXJuYW1lOiAiLDB4MDcpOworICAgIGdldHN0cmluZyhsb2dpbiwgc2l6ZW9mIHVzZXJuYW1lKTsKKyAgICBnb3RveHkoUFdEX1JPVywxKTsKKyAgICBjcHJpbnQoJyAnLDB4MDcsbmMpOworICAgIGNzcHJpbnQoIkVudGVyIFBhc3N3b3JkOiAiLDB4MDcpOworICAgIGdldHB3ZChwd2QsIHNpemVvZiBwd2QpOworICAgIGdvdG94eShQV0RfUk9XLDEpOworICAgIGNwcmludCgnICcsMHgwNyxuYyk7CisKKyAgICBpZiAoYXV0aGVudGljYXRlX3VzZXIobG9naW4scHdkKSkKKyAgICB7CisgICAgICBzdHJjcHkodXNlcm5hbWUsbG9naW4pOworICAgICAgc3RyY3B5KGxvZ291dHN0ciwiPEw+b2dvdXQgIik7CisgICAgICBzdHJjYXQobG9nb3V0c3RyLHVzZXJuYW1lKTsKKyAgICAgIG1pLT5pdGVtID0gbG9nb3V0c3RyOyAvLyBDaGFuZ2UgaXRlbSB0byByZWFkICJMb2dvdXQiCisgICAgICBydi5yZWZyZXNoID0gMTsgLy8gcmVmcmVzaCB0aGUgc2NyZWVuIChhcyBpdGVtIGNvbnRlbnRzIGNoYW5nZWQpCisgICAgfQorICAgIGVsc2Ugc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworICB9CisgIGVsc2UgLy8gVXNlciBuZWVkcyB0byBsb2dvdXQKKyAgeworICAgIHN0cmNweSh1c2VybmFtZSxHVUVTVF9VU0VSKTsKKyAgICBzdHJjcHkobG9nb3V0c3RyLCIiKTsKKyAgICBtaS0+aXRlbSA9IGxvZ2luc3RyOworICB9CisKKyAgcmV0dXJuIHJ2OworfQorCit0X2hhbmRsZXJfcmV0dXJuIGNoZWNrX3Blcm1zKHRfbWVudXN5c3RlbSAqbXMsIHRfbWVudWl0ZW0gKm1pKQoreworICAgY2hhciAqcGVybXM7CisgICBwdF94dHJhIHg7CisKKyAgICh2b2lkKSBtczsgLy8gVG8ga2VlcCBjb21waWxlciBoYXBweQorCisgICB4ID0gKHB0X3h0cmEpIG1pLT5leHRyYV9kYXRhOworICAgcGVybXMgPSAoIHggPyB4LT5wZXJtcyA6IE5VTEwpOworICAgaWYgKCFwZXJtcykgcmV0dXJuIEFDVElPTl9WQUxJRDsKKworICAgaWYgKGlzYWxsb3dlZCh1c2VybmFtZSwicm9vdCIpIHx8IGlzYWxsb3dlZCh1c2VybmFtZSxwZXJtcykpIC8vIElmIGFsbG93ZWQKKyAgICAgIHJldHVybiBBQ1RJT05fVkFMSUQ7CisgICBlbHNlIHJldHVybiBBQ1RJT05fSU5WQUxJRDsKK30KKworLy8gQ29tcHV0ZSB0aGUgZnVsbCBjb21tYW5kIGxpbmUgdG8gYWRkIGFuZCBpZiBub24tdHJpdmlhbAorLy8gcHJlcGVuZCB0aGUgc3RyaW5nIHByZXBlbmQgdG8gZmluYWwgY29tbWFuZCBsaW5lCisvLyBBc3N1bWUgY21kbGluZSBwb2ludHMgdG8gYnVmZmVyIGxvbmcgZW5vdWdoIHRvIGhvbGQgYW5zd2VyCit2b2lkIGdlbmNvbW1hbmQocHRfbWVudWl0ZW0gbWksIGNoYXIgKmNtZGxpbmUpCit7CisgICBwdF94dHJhIHg7CisgICBjbWRsaW5lWzBdID0gJ1wwJzsKKyAgIHN0cmNhdChjbWRsaW5lLG1pLT5kYXRhKTsKKyAgIHggPSAocHRfeHRyYSkgbWktPmV4dHJhX2RhdGE7CisgICBpZiAoICh4KSAmJiAoeC0+YXJnc21lbnUpKSBnZW5fYXBwZW5kX2xpbmUoeC0+YXJnc21lbnUsY21kbGluZSk7Cit9CisKKworLy8gcnVuIHRoZSBnaXZlbiBjb21tYW5kIHRvZ2V0aGVyIHdpdGggYWRkaXRpb25hbCBvcHRpb25zIHdoaWNoIG1heSBuZWVkIHBhc3NpbmcKK3ZvaWQgcnVuY29tbWFuZChwdF9tZW51aXRlbSBtaSkKK3sKKyAgIGNoYXIgKmxpbmU7CisgICBwdF94dHJhIHg7CisgICBsb25nIGlwYXBwZW5kOworCisgICBsaW5lID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKk1BWF9DTURfTElORV9MRU5HVEgpOworICAgZ2VuY29tbWFuZChtaSxsaW5lKTsKKyAgIHggPSAocHRfeHRyYSkgbWktPmV4dHJhX2RhdGE7CisgICBpcGFwcGVuZCA9ICh4ID8geC0+aXBhcHBlbmQgOiAwKTsKKworICAgcnVuc3lzbGludXhpbWFnZShsaW5lLGlwYXBwZW5kKTsKKyAgIGZyZWUobGluZSk7Cit9CisKKy8vIHNldCB0aGUgZXh0cmEgaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBtZW51IGl0ZW0uCit2b2lkIHNldF94dHJhKHB0X21lbnVpdGVtIG1pLCBjb25zdCBjaGFyICphcmdzbWVudSwgY29uc3QgY2hhciAqcGVybXMsIHVuc2lnbmVkIGludCBoZWxwaWQsIGxvbmcgaXBhcHBlbmQpCit7CisgICBwdF94dHJhIHh0cmE7CisgICBpbnQgYmFkX2FyZ3NtZW51LCBiYWRfcGVybXMsIGJhZF9pcGFwcGVuZDsKKworICAgbWktPmV4dHJhX2RhdGEgPSBOVUxMOyAvLyBpbml0YWxpemUKKyAgIG1pLT5oZWxwaWQgPSBoZWxwaWQ7IC8vIHNldCBoZWxwIGlkCisKKyAgIGlmIChtaS0+YWN0aW9uICE9IE9QVF9SVU4pIHJldHVybjsKKworICAgYmFkX2FyZ3NtZW51ID0gYmFkX3Blcm1zID0gYmFkX2lwYXBwZW5kID0gMDsKKyAgIGlmICggKGFyZ3NtZW51PT1OVUxMKSB8fCAoc3RybGVuKGFyZ3NtZW51KT09MCkpIGJhZF9hcmdzbWVudSA9IDE7CisgICBpZiAoIChwZXJtcz09TlVMTCkgfHwgKHN0cmxlbihwZXJtcyk9PTApKSBiYWRfcGVybXMgPSAxOworICAgaWYgKCBpcGFwcGVuZD09MCkgYmFkX2lwYXBwZW5kID0gMTsKKworICAgaWYgKGJhZF9hcmdzbWVudSAmJiBiYWRfcGVybXMgJiYgYmFkX2lwYXBwZW5kKSByZXR1cm47CisKKyAgIHh0cmEgPSAocHRfeHRyYSkgbWFsbG9jKHNpemVvZih0X3h0cmEpKTsKKyAgIG1pLT5leHRyYV9kYXRhID0gKHZvaWQgKikgeHRyYTsKKyAgIHh0cmEtPmFyZ3NtZW51ID0geHRyYS0+cGVybXMgPSBOVUxMOworICAgeHRyYS0+aXBhcHBlbmQgPSBpcGFwcGVuZDsKKyAgIGlmICghYmFkX2FyZ3NtZW51KSB7CisgICAgICB4dHJhLT5hcmdzbWVudSA9IChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikqKHN0cmxlbihhcmdzbWVudSkrMSkpOworICAgICAgc3RyY3B5KHh0cmEtPmFyZ3NtZW51LGFyZ3NtZW51KTsKKyAgIH0KKyAgIGlmICghYmFkX3Blcm1zKSB7CisgICAgICB4dHJhLT5wZXJtcyA9IChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikqKHN0cmxlbihwZXJtcykrMSkpOworICAgICAgc3RyY3B5KHh0cmEtPnBlcm1zLHBlcm1zKTsKKyAgICAgIG1pLT5oYW5kbGVyID0gJmNoZWNrX3Blcm1zOworICAgfQorfQorCitpbnQgbWFpbih2b2lkKQoreworICBwdF9tZW51aXRlbSBjdXJyOworICBjaGFyIHF1aXQ7CisgIGNoYXIgZXhpdGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciBleGl0Y21kcm9vdFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciBvbmVycmNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciBzdGFydGZpbGVbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgIGNoYXIgKmVjbWQ7IC8vIGVmZmVjdGl2ZSBleGl0IGNvbW1hbmQgb3Igb25lcnJvcmNtZAorICBjaGFyIHNraXBiaXRzOworICBjaGFyIHNraXBjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgIGludCB0aW1lb3V0OyAvLyB0aW1lIGluIG11bHRpcGxlcyBvZiAwLjEgc2Vjb25kcworICBpbnQgdG90YWx0aW1lb3V0OyAvLyB0aW1lIGluIG11bHRpcGxlcyBvZiAwLjEgc2Vjb25kcworICB0X2RvdGNtZCBkb3RydjsgLy8gdG8gc3RvcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBleGVjZG90Y21kCisgIGludCB0ZW1wOworCisgIHN0cmNweSh1c2VybmFtZSxHVUVTVF9VU0VSKTsKKy8qIC0tLS0gSW5pdGlhbGl6aW5nIG1lbnUgc3lzdGVtIHBhcmFtZXRlcnMgLS0tICovCisgIHZtb2RlID0gMHhGRjsKKyAgc2tpcGJpdHMgPSAwOworICBQV0RfUk9XID0gMjM7CisgIEVESVRfUk9XID0gMjM7CisgIHN0cmNweShvbmVycmNtZCwiLnJlcGVhdCIpOworICBzdHJjcHkoZXhpdGNtZCwiLmV4aXQiKTsKKyAgc3RyY3B5KGV4aXRjbWRyb290LCIiKTsKKyAgLy8gSWYgbm90IHNwZWNpZmllZCBleGl0Y21kcm9vdCA9IGV4aXRjbWQKKyAgaWYgKGV4aXRjbWRyb290WzBdID09ICdcMCcpIHN0cmNweShleGl0Y21kcm9vdCxleGl0Y21kKTsKKyAgLy8gVGltZW91dCBzdHVmZgorICB0aW1lb3V0ID0gNjAwOworICBzdHJjcHkodGltZW91dGNtZCwiLmJlZXAiKTsKKyAgdG90YWx0aW1lb3V0ID0gMDsKKyAgc3RyY3B5KHRvdGFsdGltZW91dGNtZCwiLndhaXQiKTsKKyAgc3RyY3B5KHN0YXJ0ZmlsZSwiIik7CisKKyAgaW5pdF9oZWxwKCIvaXNvbGludXgvaGVscCIpOworICBpbml0X3Bhc3N3b3JkcygiIik7CisgIGluaXRfbWVudXN5c3RlbSgiQSB0ZXN0IG9mIHRoZSB0ZXN0Lm1lbnUgZmlsZSIpOworICBzZXRfd2luZG93X3NpemUoMSwxLDIzLDc4KTsKKworICAvLyBSZWdpc3RlciB0aGUgb250aW1lb3V0IGhhbmRsZXIsIHdpdGggYSB0aW1lIG91dCBvZiAxMCBzZWNvbmRzCisgIHJlZ19vbnRpbWVvdXQob250aW1lb3V0LHRpbWVvdXQqMTAsMCk7CisgIHJlZ19vbnRvdGFsdGltZW91dChvbnRvdGFsdGltZW91dCx0b3RhbHRpbWVvdXQqMTApOworCisgIC8vIFJlZ2lzdGVyIG1lbnVzeXN0ZW0gaGFuZGxlcnMKKyAgcmVnX2hhbmRsZXIoSERMUl9LRVlTLCZrZXlzX2hhbmRsZXIpOworLyogLS0tLSBFbmQgb2YgaW5pdGlhbGl6YXRpb24gLS0tICovCisKKy8qIC0tLS0tLS0gTUVOVSB0ZXN0aW5nIC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJ0ZXN0aW5nIiwiIFRlc3RpbmcgIiwtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJTZWxmIExvb3AiLCJHbyB0byBUZXN0aW5nIixPUFRfU1VCTUVOVSwidGVzdGluZyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIk1lbW9yeSBUZXN0IiwiUGVyZm9ybSBleHRlbnNpdmUgbWVtb3J5IHRlc3RpbmciLE9QVF9SVU4sIm1lbXRlc3QiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJFeGl0IHRoaXMgbWVudSIsIkdvIG9uZSBsZXZlbCB1cCIsT1BUX0VYSVRNRU5VLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKy8qIC0tLS0tLS0gTUVOVSByZXNjdWUgLS0tLS0gKi8KKyAgYWRkX25hbWVkX21lbnUoInJlc2N1ZSIsIiBSZXNjdWUgT3B0aW9ucyAiLC0xKTsKKyAgc2V0X21lbnVfcG9zKDEwLDEwKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIkxpbnV4IFJlc2N1ZSIsImxpbnJlc2MiLE9QVF9SVU4sImxpbnJlc2MiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJEb3MgUmVzY3VlIiwiZG9zcmVzYyIsT1BUX1JVTiwiZG9zcmVzYyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIldpbmRvd3MgUmVzY3VlIiwid2lucmVzYyIsT1BUX1JVTiwid2lucmVzYyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIkV4aXQgdGhpcyBtZW51IiwiR28gb25lIGxldmVsIHVwIixPUFRfRVhJVE1FTlUsIiIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworLyogLS0tLS0tLSBNRU5VIG1haW4gLS0tLS0gKi8KKyAgYWRkX25hbWVkX21lbnUoIm1haW4iLCIgTWFpbiBNZW51ICIsLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiUHJlcGFyZSIsInByZXAiLE9QVF9SVU4sInByZXAiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCJSZXNjdWUgb3B0aW9ucy4uLiIsIlRyb3VibGVzaG9vdCBhIHN5c3RlbSIsT1BUX1NVQk1FTlUsInJlc2N1ZSIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIlRlc3RpbmcuLi4iLCJPcHRpb25zIHRvIHRlc3QgaGFyZHdhcmUiLE9QVF9TVUJNRU5VLCJ0ZXN0aW5nIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiRXhpdCB0aGlzIG1lbnUiLCJHbyBvbmUgbGV2ZWwgdXAiLE9QVF9FWElUTUVOVSwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworLyogLS0tLS0tLSBFTkQgT0YgTUVOVSBkZWNsYXJhdGlvbnMgLS0tLS0gKi8KKworLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHNraXAgdGhlIG1lbnUgYWx0b2dldGhlcgorICBxdWl0ID0gMDsgLy8gRG9udCBza2lwIHRoZSBtZW51CisgIGlmIChnZXRzaGlmdGZsYWdzKCkgJiBza2lwYml0cykgeyAvLyB3ZSBtdXN0IHNraXAgdGhlIG1lbnUgYWx0b2d0aGVyIGFuZCBleGVjdXRlIHNraXBjbWQKKyAgICBkb3RydiA9IGV4ZWNkb3RjbWQoc2tpcGNtZCwiLmJlZXAlLmV4aXQiLE5VTEwpOyAvLyBXb3JzdCBjYXNlIHdlIGJlZXAgYW5kIGV4aXQKKyAgICBpZiAoZG90cnYgPT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICB9CisKKy8vIFN3aXRjaCB2aWRlIG1vZGUgaWYgcmVxdWlyZWQKKyAgIGlmICh2bW9kZSAhPSAweEZGKSBzZXR2aWRlb21vZGUodm1vZGUpOworCisvLyBEbyB3ZSBoYXZlIGEgc3RhcnRmaWxlIHRvIGRpc3BsYXk/CisgICBpZiAoc3RhcnRmaWxlWzBdICE9ICdcMCcpIHJ1bmhlbHAoc3RhcnRmaWxlKTsKKworLy8gVGhlIG1haW4gbG9vcAorICB3aGlsZSAocXVpdCA9PSAwKSB7IC8vIEFzIGxvbmcgYXMgcXVpdCBpcyB6ZXJvIHJlcGVhdAorICAgICBjdXJyID0gc2hvd21lbnVzKGZpbmRfbWVudV9udW0oIm1haW4iKSk7IC8vIEluaXRpYWwgbWVudSBpcyB0aGUgb25lIGNhbGxlZCAibWFpbiIKKworICAgICBpZiAoY3VycikgeworICAgICAgICBpZiAoY3Vyci0+YWN0aW9uID09IE9QVF9SVU4pIHsKKyAgICAgICAgICAgZWNtZCA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSpNQVhfQ01EX0xJTkVfTEVOR1RIKTsKKyAgICAgICAgICAgZ2VuY29tbWFuZChjdXJyLGVjbWQpOworICAgICAgICAgICB0ZW1wID0gKGN1cnItPmV4dHJhX2RhdGEgPyAoKHB0X3h0cmEpY3Vyci0+ZXh0cmFfZGF0YSktPmlwYXBwZW5kIDogMCk7CisgICAgICAgICAgIHJ1bnN5c2xpbnV4aW1hZ2UoZWNtZCx0ZW1wKTsKKyAgICAgICAgICAgLy8ga2VybmVsIG5vdCBmb3VuZCBzbyBleGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBkb3QgY29tbWFuZAorICAgICAgICAgICBkb3RydiA9IGV4ZWNkb3RjbWQob25lcnJjbWQsIi5xdWl0IixlY21kKTsgLy8gcGFzcyBiYWQgY21kbGluZSBhcyBhcmcKKyAgICAgICAgICAgaWYgKGRvdHJ2PT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICAgICAgICAgICBmcmVlKGVjbWQpOyBlY21kID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGNzcHJpbnQoIkVycm9yIGluIHByb2dyYW1taW5nISIsMHgwNyk7CisgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZpbmQgZWZmZWN0aXZlIGV4aXQgY29tbWFuZAorICAgICAgICBlY21kID0gKCBpc2FsbG93ZWQodXNlcm5hbWUsInJvb3QiKSA/IGV4aXRjbWRyb290IDogZXhpdGNtZCk7CisgICAgICAgIGRvdHJ2ID0gZXhlY2RvdGNtZChlY21kLCIucmVwZWF0IixOVUxMKTsKKyAgICAgICAgcXVpdCA9IChkb3RydiA9PSBRVUlUX0NNRCA/IDEgOiAwKTsgLy8gc2hvdWxkIHdlIGV4aXQgbm93CisgICAgIH0KKyAgfQorCisvLyBEZWFsbG9jYXRlIHNwYWNlIHVzZWQgYW5kIHF1aXQKKyAgY2xvc2VfcGFzc3dvcmRzKCk7CisgIGNsb3NlX2hlbHAoKTsKKyAgY2xvc2VfbWVudXN5c3RlbSgpOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvY21lbnUvdGVzdC5jMzIgYi9lZmk2NC9jb20zMi9jbWVudS90ZXN0LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YTM4NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvY21lbnUvdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvY21lbnUvdGVzdDIuYyBiL2VmaTY0L2NvbTMyL2NtZW51L3Rlc3QyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1MmYxYgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2NtZW51L3Rlc3QyLmMKQEAgLTAsMCArMSw1MzQgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDYgTXVyYWxpIEtyaXNobmFuIEdhbmFwYXRoeSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiY21lbnUuaCIKKyNpbmNsdWRlICJoZWxwLmgiCisjaW5jbHVkZSAicGFzc3dvcmRzLmgiCisjaW5jbHVkZSAiY29tMzJpby5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIE1BWF9DTURfTElORV9MRU5HVEggNTE0CisKK3R5cGVkZWYgc3RydWN0IHNfeHRyYSB7CisgIGxvbmcgaXBhcHBlbmQ7IC8vIFN0b3JlcyB0aGUgaXBhcHBlbmQgZmxhZyB0byBzZW5kICh1c2VmdWwgZm9yIFBYRUxJTlVYIG9ubHkpCisgIGNoYXIgKmFyZ3NtZW51OyAvLyBTdG9yZXMgdGhlIG5hbWUgb2YgbWVudSB3aGljaCBjb250YWlucyBvcHRpb25zIGZvciB0aGUgZ2l2ZW4gUlVOIGl0ZW0KKyAgY2hhciAqcGVybXM7IC8vIHN0b3JlcyB0aGUgcGVybWlzc2lvbnMgcmVxdWlyZWQgdG8gYWN0aXZhdGUgdGhlIGl0ZW0KK30gdF94dHJhOworCit0eXBlZGVmIHRfeHRyYSAqcHRfeHRyYTsgLy8gUG9pbnRlciB0byBleHRyYSBkYXRhc3RydWN0dXJlCisKKy8vIFR5cGVzIG9mIGRvdCBjb21tYW5kcyBmb3Igd2hpY2ggY2FsbGVyIHRha2VzIHJlc3BvbnNpYmlsaXR5IG9mIGhhbmRsaW5nCisvLyBJbiBzb21lIGNhc2Ugc29tZSBjb21tYW5kcyBtYXkgbm90IG1ha2Ugc2Vuc2UsIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIKKy8vIHRvIGhhbmRsZSBjYXNlcyB3aGljaCBkbyBub3QgbWFrZSBzZW5zZQordHlwZWRlZiBlbnVtIHtRVUlUX0NNRCwgUkVQRUFUX0NNRCwgRU5URVJfQ01ELCBFU0NBUEVfQ01EfSB0X2RvdGNtZDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgKi8KKworLy8gZGVmYXVsdCB1c2VyCisjZGVmaW5lIEdVRVNUX1VTRVIgImd1ZXN0IgorCisvLyBmb3IgbG9jYWwgY29tbWFuZHMuIHJldHVybiB2YWx1ZSBvZiBleGVjZG90Y21kCisjZGVmaW5lIFFVSVRfQ01EIDAKKyNkZWZpbmUgUlBUX0NNRCAxCisKK2NoYXIgdXNlcm5hbWVbMTJdOyAvLyBOYW1lIG9mIHVzZXIgY3VycmVudGx5IHVzaW5nIHRoZSBzeXN0ZW0KKworaW50IFBXRF9ST1c7IC8vIExpbmUgbnVtYmVyIHdoZXJlIHVzZXIgYXV0aGVudGljYXRpb24gaGFwcGVucworaW50IEVESVRfUk9XOyAvLyByb3cgd2hlcmUgVXNlciBUYWIKKworY2hhciBsb2dpbnN0cltdID0gIjxMPm9naW4gICI7CitjaGFyIGxvZ291dHN0clszMF07CisKK2ludCB2bW9kZTsgLy8gVGhlIHZpZGVvIG1vZGUgd2Ugd2FudCB0byBiZSBpbgorY2hhciB0aW1lb3V0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOyAvLyBDb21tYW5kIHRvIGV4ZWN1dGUgb24gdGltZW91dAorY2hhciB0b3RhbHRpbWVvdXRjbWRbTUFYX0NNRF9MSU5FX0xFTkdUSF07IC8vIENvbW1hbmQgdG8gZXhlY3V0ZSBvbiB0b3RhbHRpbWVvdXQKKworY2hhciBRVUlUU1RSW10gPSAiLnF1aXQiOyAvLyBzYW1lIGFzIGV4aXQKK2NoYXIgSUdOT1JFU1RSW109Ii5pZ25vcmUiOyAvLyBzYW1lIGFzIHJlcGVhdCwgd2FpdAorCisvKi0tLS0tLS0tLS0tLS0tLS0gIEVuZCBnbG9iYWxzICovCisKKy8vIHJldHVybnMgcG9pbnRlciB0byBmaXJzdCBub24tc3BhY2UgY2hhcgorLy8gYW5kIGFkdmFuY2VzIGVuZCBvZiBzdHIgYnkgcmVtb3ZpbmcgdHJhaWxpbmcgc3BhY2VzCitjaGFyICogc3RyaXAoY2hhciAqc3RyKQoreworICBjaGFyICpwLCpzLCplOworICBpZiAoIXN0cikgcmV0dXJuIE5VTEw7CisgIHAgPSBzdHI7CisgIHMgPSBOVUxMOworICBlID0gTlVMTDsKKyAgd2hpbGUgKCpwKSB7CisgICAgaWYgKCpwICE9ICcgJykgeworICAgICAgIC8vIG1hcmsgc3RhcnQgb2Ygc3RyaW5nIG9yIHJlY29yZCB0aGUgbGFzdCB2aXNpdGVkIG5vbi1zcGFjZSBjaGFyCisgICAgICAgaWYgKCFzKSBzPXA7IGVsc2UgZT1wOworICAgIH0KKyAgICBwKys7CisgIH0KKyAgKigrK2UpPSdcMCc7IC8vIGtpbGwgc3RyaW5nIGVhcmxpZXIKKyAgcmV0dXJuIHM7Cit9CisKKy8vIGV4ZWN1dGVzIGEgbGlzdCBvZiAlIHNlcGFyYXRlZCBjb21tYW5kcworLy8gbm9uLWRvdCBjb21tYW5kcyBhcmUgYXNzdW1lZCB0byBiZSBzeXNsaW51eCBjb21tYW5kcworLy8gQWxsIHN5c2xpbnV4IGNvbW1hbmRzIGFyZSBhcHBlbmRlZCB3aXRoIHRoZSBjb250ZW50cyBvZiBrZXJhcmdzCisvLyBJZiBpdCBmYWlscyAoa2VybmVsIG5vdCBmb3VuZCkgdGhlbiB0aGUgbmV4dCBvbmUgaXMgdHJpZWQgaW4gdGhlCisvLyBsaXN0CisvLyByZXR1cm5zIFFVSVRfQ01EIG9yIFJQVF9DTUQKK3RfZG90Y21kIGV4ZWNkb3RjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpkZWZjbWQsIGNvbnN0IGNoYXIgKmtlcmFyZ3MpCit7CisgICBjaGFyIGNtZGxpbmVbTUFYX0NNRF9MSU5FX0xFTkdUSF07CisgICBjaGFyIGRvdGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgIGNoYXIgKmN1cnIsKm5leHQsKnAsKmFyZ3M7CisgICBjaGFyIGN0cjsKKworICAgc3RyY3B5KGRvdGNtZCxjbWQpOworICAgbmV4dCA9IGRvdGNtZDsKKyAgIGNtZGxpbmVbMF0gPSAnXDAnOworICAgd2hpbGUgKCpuZXh0KSB7IC8vIGlmIHNvbWV0aGluZyB0byBkbworICAgICAgY3VyciA9IG5leHQ7CisgICAgICBwID0gc3RyY2hyKG5leHQsJyUnKTsKKyAgICAgIGlmIChwKSB7CisgICAgICAgICAqcC0tPSdcMCc7IG5leHQ9cCsyOworICAgICAgICAgd2hpbGUgKCpwID09ICcgJykgcC0tOworICAgICAgICAgKigrK3ApPSdcMCc7IC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqZGVmY21kKSB7IC8vIGV4ZWN1dGUgZGVmY21kIG5leHQKKyAgICAgICAgICAgIG5leHQ9ZGVmY21kOworICAgICAgICAgICAgZGVmY21kPU5VTEw7IC8vIGV4ZWMgZGVmIGNtZCBvbmx5IG9uY2UKKyAgICAgICAgfSBlbHNlIG5leHQ9TlVMTDsKKyAgICAgIH0KKyAgICAgIC8vIG5vdyB3ZSBqdXN0IG5lZWQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCAiY3VyciIKKyAgICAgIGN1cnIgPSBzdHJpcChjdXJyKTsKKyAgICAgIGlmIChjdXJyWzBdICE9ICcuJykgeyAvLyBqdXN0IHJ1biB0aGUga2VybmVsCisgICAgICAgICBzdHJjcHkoY21kbGluZSxjdXJyKTsKKyAgICAgICAgIGlmIChrZXJhcmdzKSBzdHJjYXQoY21kbGluZSxrZXJhcmdzKTsKKyAgICAgICAgIHJ1bnN5c2xpbnV4aW1hZ2UoY21kbGluZSwwKTsgLy8gTm8gSVBBcHBlbmQKKyAgICAgIH0gZWxzZSB7IC8vIFdlIGhhdmUgYSBET1QgY29tbWFuZAorICAgICAgICAvLyBzcGxpdCBjb21tYW5kIGludG8gY29tbWFuZCBhbmQgYXJncyAobWF5IGJlIGVtcHR5KQorICAgICAgICBhcmdzID0gY3VycjsKKyAgICAgICAgd2hpbGUgKCAoKmFyZ3MgIT0gJyAnKSAmJiAoKmFyZ3MgIT0gJ1wwJykgKSBhcmdzKys7CisgICAgICAgIGlmICgqYXJncykgeyAvLyBmb3VuZCBhIHNwYWNlCisgICAgICAgICAgICphcmdzKysgPSAnXDAnOworICAgICAgICAgICB3aGlsZSAoKmFyZ3MgPT0gJyAnKSBhcmdzKys7IC8vIHNraXAgb3ZlciBzcGFjZXMKKyAgICAgICAgfQorICAgICAgICBpZiAoIChzdHJjbXAoY3VyciwiLmV4aXQiKT09MCkgfHwKKyAgICAgICAgICAgICAoc3RyY21wKGN1cnIsIi5xdWl0Iik9PTApCisgICAgICAgICAgICkKKyAgICAgICAgICAgcmV0dXJuIFFVSVRfQ01EOworICAgICAgICBpZiAoIChzdHJjbXAoY3VyciwiLnJlcGVhdCIpPT0wKSB8fAorICAgICAgICAgICAgIChzdHJjbXAoY3VyciwiLmlnbm9yZSIpPT0wKSB8fAorICAgICAgICAgICAgIChzdHJjbXAoY3VyciwiLndhaXQiKT09MCkKKyAgICAgICAgICAgKQorICAgICAgICAgICByZXR1cm4gUlBUX0NNRDsKKyAgICAgICAgaWYgKHN0cmNtcChjdXJyLCIuYmVlcCIpPT0wKSB7CisgICAgICAgICAgIGlmICgoYXJncykgJiYgKCcwJyA8PSBhcmdzWzBdKSAmJiAoYXJnc1swXSA8PSAnOScpKQorICAgICAgICAgICAgICBjdHIgPSBhcmdzWzBdLScwJzsKKyAgICAgICAgICAgZWxzZSBjdHI9MTsKKyAgICAgICAgICAgZm9yICg7Y3RyPjA7IGN0ci0tKSBiZWVwKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChjdXJyLCIuaGVscCIpPT0wKSBydW5oZWxwKGFyZ3MpOworICAgICAgfQorICAgfQorICAgcmV0dXJuIFJQVF9DTUQ7IC8vIGJ5IGRlZmF1bHQgd2UgZG8gbm90IHF1aXQKK30KKworCitUSU1FT1VUQ09ERSB0aW1lb3V0KGNvbnN0IGNoYXIgKmNtZCkKK3sKKyAgdF9kb3RjbWQgYzsKKyAgYyA9IGV4ZWNkb3RjbWQoY21kLCIud2FpdCIsTlVMTCk7CisgIHN3aXRjaChjKSB7CisgICAgY2FzZSBFTlRFUl9DTUQ6CisgICAgICAgICByZXR1cm4gQ09ERV9FTlRFUjsKKyAgICBjYXNlIEVTQ0FQRV9DTUQ6CisgICAgICAgICByZXR1cm4gQ09ERV9FU0NBUEU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBDT0RFX1dBSVQ7CisgIH0KK30KKworVElNRU9VVENPREUgb250aW1lb3V0KHZvaWQpCit7CisgICByZXR1cm4gdGltZW91dCh0aW1lb3V0Y21kKTsKK30KKworVElNRU9VVENPREUgb250b3RhbHRpbWVvdXQodm9pZCkKK3sKKyAgIHJldHVybiB0aW1lb3V0KHRvdGFsdGltZW91dGNtZCk7Cit9CisKK3ZvaWQga2V5c19oYW5kbGVyKHRfbWVudXN5c3RlbSAqIG1zIF9fYXR0cmlidXRlX18gKCggdW51c2VkICkpLCB0X21lbnVpdGVtICogbWksIGludCBzY2FuY29kZSkKK3sKKyAgIGludCBuYywgbnI7CisKKyAgIGlmIChnZXRzY3JlZW5zaXplKDEsICZuciwgJm5jKSkgeworICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgbmMgPSA4MDsKKyAgICAgICBuciA9IDI0OworICAgfQorCisgICBpZiAoIChzY2FuY29kZSA9PSBLRVlfRjEpICYmIChtaS0+aGVscGlkICE9IDB4RkZGRikgKSB7IC8vIElmIHNjYW5jb2RlIG9mIEYxIGFuZCBub24tdHJpdmlhbCBoZWxwaWQKKyAgICAgIHJ1bmhlbHBzeXN0ZW0obWktPmhlbHBpZCk7CisgICB9CisKKyAgIC8vIElmIHVzZXIgaGl0IFRBQiwgYW5kIGl0ZW0gaXMgYW4gImV4ZWN1dGFibGUiIGl0ZW0KKyAgIC8vIGFuZCB1c2VyIGhhcyBwcml2aWxlZ2VzIHRvIGVkaXQgaXQsIGVkaXQgaXQgaW4gcGxhY2UuCisgICBpZiAoKHNjYW5jb2RlID09IEtFWV9UQUIpICYmIChtaS0+YWN0aW9uID09IE9QVF9SVU4pICYmCisgICAgICAgKEVESVRfUk9XIDwgbnIpICYmIChFRElUX1JPVyA+IDApICYmCisgICAgICAgKGlzYWxsb3dlZCh1c2VybmFtZSwiZWRpdGNtZCIpIHx8IGlzYWxsb3dlZCh1c2VybmFtZSwicm9vdCIpKSkgeworICAgICAvLyBVc2VyIHR5cGVkIFRBQiBhbmQgaGFzIHBlcm1pc3Npb25zIHRvIGVkaXQgY29tbWFuZCBsaW5lCisgICAgIGdvdG94eShFRElUX1JPVywxKTsKKyAgICAgY3NwcmludCgiQ29tbWFuZCBsaW5lOiIsMHgwNyk7CisgICAgIGVkaXRzdHJpbmcobWktPmRhdGEsQUNUSU9OTEVOKTsKKyAgICAgZ290b3h5KEVESVRfUk9XLDEpOworICAgICBjcHJpbnQoJyAnLDB4MDcsbmMtMSk7CisgICB9Cit9CisKK3RfaGFuZGxlcl9yZXR1cm4gbG9naW5faGFuZGxlcih0X21lbnVzeXN0ZW0gKm1zLCB0X21lbnVpdGVtICptaSkKK3sKKyAgKHZvaWQpbWk7IC8vIFVudXNlZAorICBjaGFyIHB3ZFs0MF07CisgIGNoYXIgbG9naW5bNDBdOworICBpbnQgbmMsIG5yOworICB0X2hhbmRsZXJfcmV0dXJuIHJ2OworCisgICh2b2lkKW1zOworCisgIHJ2ID0gQUNUSU9OX0lOVkFMSUQ7CisgIGlmIChQV0RfUk9XIDwgMCkgcmV0dXJuIHJ2OyAvLyBObyBuZWVkIHRvIGF1dGhlbnRpY2F0ZQorCisgIGlmIChtaS0+aXRlbSA9PSBsb2dpbnN0cikgeyAvKiBVc2VyIHdhbnRzIHRvIGxvZ2luICovCisgICAgaWYgKGdldHNjcmVlbnNpemUoMSwgJm5yLCAmbmMpKSB7CisgICAgICAgIC8qIFVua25vd24gc2NyZWVuIHNpemU/ICovCisgICAgICAgIG5jID0gODA7CisgICAgICAgIG5yID0gMjQ7CisgICAgfQorCisgICAgZ290b3h5KFBXRF9ST1csMSk7CisgICAgY3NwcmludCgiRW50ZXIgVXNlcm5hbWU6ICIsMHgwNyk7CisgICAgZ2V0c3RyaW5nKGxvZ2luLCBzaXplb2YgdXNlcm5hbWUpOworICAgIGdvdG94eShQV0RfUk9XLDEpOworICAgIGNwcmludCgnICcsMHgwNyxuYyk7CisgICAgY3NwcmludCgiRW50ZXIgUGFzc3dvcmQ6ICIsMHgwNyk7CisgICAgZ2V0cHdkKHB3ZCwgc2l6ZW9mIHB3ZCk7CisgICAgZ290b3h5KFBXRF9ST1csMSk7CisgICAgY3ByaW50KCcgJywweDA3LG5jKTsKKworICAgIGlmIChhdXRoZW50aWNhdGVfdXNlcihsb2dpbixwd2QpKQorICAgIHsKKyAgICAgIHN0cmNweSh1c2VybmFtZSxsb2dpbik7CisgICAgICBzdHJjcHkobG9nb3V0c3RyLCI8TD5vZ291dCAiKTsKKyAgICAgIHN0cmNhdChsb2dvdXRzdHIsdXNlcm5hbWUpOworICAgICAgbWktPml0ZW0gPSBsb2dvdXRzdHI7IC8vIENoYW5nZSBpdGVtIHRvIHJlYWQgIkxvZ291dCIKKyAgICAgIHJ2LnJlZnJlc2ggPSAxOyAvLyByZWZyZXNoIHRoZSBzY3JlZW4gKGFzIGl0ZW0gY29udGVudHMgY2hhbmdlZCkKKyAgICB9CisgICAgZWxzZSBzdHJjcHkodXNlcm5hbWUsR1VFU1RfVVNFUik7CisgIH0KKyAgZWxzZSAvLyBVc2VyIG5lZWRzIHRvIGxvZ291dAorICB7CisgICAgc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworICAgIHN0cmNweShsb2dvdXRzdHIsIiIpOworICAgIG1pLT5pdGVtID0gbG9naW5zdHI7CisgIH0KKworICByZXR1cm4gcnY7Cit9CisKK3RfaGFuZGxlcl9yZXR1cm4gY2hlY2tfcGVybXModF9tZW51c3lzdGVtICptcywgdF9tZW51aXRlbSAqbWkpCit7CisgICBjaGFyICpwZXJtczsKKyAgIHB0X3h0cmEgeDsKKworICAgKHZvaWQpIG1zOyAvLyBUbyBrZWVwIGNvbXBpbGVyIGhhcHB5CisKKyAgIHggPSAocHRfeHRyYSkgbWktPmV4dHJhX2RhdGE7CisgICBwZXJtcyA9ICggeCA/IHgtPnBlcm1zIDogTlVMTCk7CisgICBpZiAoIXBlcm1zKSByZXR1cm4gQUNUSU9OX1ZBTElEOworCisgICBpZiAoaXNhbGxvd2VkKHVzZXJuYW1lLCJyb290IikgfHwgaXNhbGxvd2VkKHVzZXJuYW1lLHBlcm1zKSkgLy8gSWYgYWxsb3dlZAorICAgICAgcmV0dXJuIEFDVElPTl9WQUxJRDsKKyAgIGVsc2UgcmV0dXJuIEFDVElPTl9JTlZBTElEOworfQorCisvLyBDb21wdXRlIHRoZSBmdWxsIGNvbW1hbmQgbGluZSB0byBhZGQgYW5kIGlmIG5vbi10cml2aWFsCisvLyBwcmVwZW5kIHRoZSBzdHJpbmcgcHJlcGVuZCB0byBmaW5hbCBjb21tYW5kIGxpbmUKKy8vIEFzc3VtZSBjbWRsaW5lIHBvaW50cyB0byBidWZmZXIgbG9uZyBlbm91Z2ggdG8gaG9sZCBhbnN3ZXIKK3ZvaWQgZ2VuY29tbWFuZChwdF9tZW51aXRlbSBtaSwgY2hhciAqY21kbGluZSkKK3sKKyAgIHB0X3h0cmEgeDsKKyAgIGNtZGxpbmVbMF0gPSAnXDAnOworICAgc3RyY2F0KGNtZGxpbmUsbWktPmRhdGEpOworICAgeCA9IChwdF94dHJhKSBtaS0+ZXh0cmFfZGF0YTsKKyAgIGlmICggKHgpICYmICh4LT5hcmdzbWVudSkpIGdlbl9hcHBlbmRfbGluZSh4LT5hcmdzbWVudSxjbWRsaW5lKTsKK30KKworCisvLyBydW4gdGhlIGdpdmVuIGNvbW1hbmQgdG9nZXRoZXIgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnMgd2hpY2ggbWF5IG5lZWQgcGFzc2luZwordm9pZCBydW5jb21tYW5kKHB0X21lbnVpdGVtIG1pKQoreworICAgY2hhciAqbGluZTsKKyAgIHB0X3h0cmEgeDsKKyAgIGxvbmcgaXBhcHBlbmQ7CisKKyAgIGxpbmUgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqTUFYX0NNRF9MSU5FX0xFTkdUSCk7CisgICBnZW5jb21tYW5kKG1pLGxpbmUpOworICAgeCA9IChwdF94dHJhKSBtaS0+ZXh0cmFfZGF0YTsKKyAgIGlwYXBwZW5kID0gKHggPyB4LT5pcGFwcGVuZCA6IDApOworCisgICBydW5zeXNsaW51eGltYWdlKGxpbmUsaXBhcHBlbmQpOworICAgZnJlZShsaW5lKTsKK30KKworLy8gc2V0IHRoZSBleHRyYSBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIG1lbnUgaXRlbS4KK3ZvaWQgc2V0X3h0cmEocHRfbWVudWl0ZW0gbWksIGNvbnN0IGNoYXIgKmFyZ3NtZW51LCBjb25zdCBjaGFyICpwZXJtcywgdW5zaWduZWQgaW50IGhlbHBpZCwgbG9uZyBpcGFwcGVuZCkKK3sKKyAgIHB0X3h0cmEgeHRyYTsKKyAgIGludCBiYWRfYXJnc21lbnUsIGJhZF9wZXJtcywgYmFkX2lwYXBwZW5kOworCisgICBtaS0+ZXh0cmFfZGF0YSA9IE5VTEw7IC8vIGluaXRhbGl6ZQorICAgbWktPmhlbHBpZCA9IGhlbHBpZDsgLy8gc2V0IGhlbHAgaWQKKworICAgaWYgKG1pLT5hY3Rpb24gIT0gT1BUX1JVTikgcmV0dXJuOworCisgICBiYWRfYXJnc21lbnUgPSBiYWRfcGVybXMgPSBiYWRfaXBhcHBlbmQgPSAwOworICAgaWYgKCAoYXJnc21lbnU9PU5VTEwpIHx8IChzdHJsZW4oYXJnc21lbnUpPT0wKSkgYmFkX2FyZ3NtZW51ID0gMTsKKyAgIGlmICggKHBlcm1zPT1OVUxMKSB8fCAoc3RybGVuKHBlcm1zKT09MCkpIGJhZF9wZXJtcyA9IDE7CisgICBpZiAoIGlwYXBwZW5kPT0wKSBiYWRfaXBhcHBlbmQgPSAxOworCisgICBpZiAoYmFkX2FyZ3NtZW51ICYmIGJhZF9wZXJtcyAmJiBiYWRfaXBhcHBlbmQpIHJldHVybjsKKworICAgeHRyYSA9IChwdF94dHJhKSBtYWxsb2Moc2l6ZW9mKHRfeHRyYSkpOworICAgbWktPmV4dHJhX2RhdGEgPSAodm9pZCAqKSB4dHJhOworICAgeHRyYS0+YXJnc21lbnUgPSB4dHJhLT5wZXJtcyA9IE5VTEw7CisgICB4dHJhLT5pcGFwcGVuZCA9IGlwYXBwZW5kOworICAgaWYgKCFiYWRfYXJnc21lbnUpIHsKKyAgICAgIHh0cmEtPmFyZ3NtZW51ID0gKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSooc3RybGVuKGFyZ3NtZW51KSsxKSk7CisgICAgICBzdHJjcHkoeHRyYS0+YXJnc21lbnUsYXJnc21lbnUpOworICAgfQorICAgaWYgKCFiYWRfcGVybXMpIHsKKyAgICAgIHh0cmEtPnBlcm1zID0gKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSooc3RybGVuKHBlcm1zKSsxKSk7CisgICAgICBzdHJjcHkoeHRyYS0+cGVybXMscGVybXMpOworICAgICAgbWktPmhhbmRsZXIgPSAmY2hlY2tfcGVybXM7CisgICB9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgIHB0X21lbnVpdGVtIGN1cnI7CisgIGNoYXIgcXVpdDsKKyAgY2hhciBleGl0Y21kW01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIGV4aXRjbWRyb290W01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIG9uZXJyY21kW01BWF9DTURfTElORV9MRU5HVEhdOworICBjaGFyIHN0YXJ0ZmlsZVtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgY2hhciAqZWNtZDsgLy8gZWZmZWN0aXZlIGV4aXQgY29tbWFuZCBvciBvbmVycm9yY21kCisgIGNoYXIgc2tpcGJpdHM7CisgIGNoYXIgc2tpcGNtZFtNQVhfQ01EX0xJTkVfTEVOR1RIXTsKKyAgaW50IHRpbWVvdXQ7IC8vIHRpbWUgaW4gbXVsdGlwbGVzIG9mIDAuMSBzZWNvbmRzCisgIGludCB0b3RhbHRpbWVvdXQ7IC8vIHRpbWUgaW4gbXVsdGlwbGVzIG9mIDAuMSBzZWNvbmRzCisgIHRfZG90Y21kIGRvdHJ2OyAvLyB0byBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4ZWNkb3RjbWQKKyAgaW50IHRlbXA7CisKKyAgc3RyY3B5KHVzZXJuYW1lLEdVRVNUX1VTRVIpOworLyogLS0tLSBJbml0aWFsaXppbmcgbWVudSBzeXN0ZW0gcGFyYW1ldGVycyAtLS0gKi8KKyAgdm1vZGUgPSAweEZGOworICBza2lwYml0cyA9IFNISUZUX1BSRVNTRUQgfCBDQVBTTE9DS19PTjsKKyAgUFdEX1JPVyA9IDIzOworICBFRElUX1JPVyA9IDIzOworICBzdHJjcHkob25lcnJjbWQsIi5iZWVwIDIgJSAlIC5oZWxwIGhscDAwMDI1LnR4dCAlIC5leGl0Iik7CisgIHN0cmNweShleGl0Y21kLCIuZXhpdCIpOworICBzdHJjcHkoZXhpdGNtZHJvb3QsIiIpOworICAvLyBJZiBub3Qgc3BlY2lmaWVkIGV4aXRjbWRyb290ID0gZXhpdGNtZAorICBpZiAoZXhpdGNtZHJvb3RbMF0gPT0gJ1wwJykgc3RyY3B5KGV4aXRjbWRyb290LGV4aXRjbWQpOworICAvLyBUaW1lb3V0IHN0dWZmCisgIHRpbWVvdXQgPSA2MDA7CisgIHN0cmNweSh0aW1lb3V0Y21kLCIud2FpdCIpOworICB0b3RhbHRpbWVvdXQgPSAwOworICBzdHJjcHkodG90YWx0aW1lb3V0Y21kLCJjaGFpbi5jMzIgaGQgMCIpOworICBzdHJjcHkoc3RhcnRmaWxlLCJobHAwMDAyNi50eHQiKTsKKworICBpbml0X2hlbHAoIi9pc29saW51eC9oZWxwIik7CisgIGluaXRfcGFzc3dvcmRzKCIvaXNvbGludXgvcGFzc3dvcmQiKTsKKyAgaW5pdF9tZW51c3lzdGVtKCIgQ09NQk9PVCBNZW51IFN5c3RlbSAiKTsKKyAgc2V0X3dpbmRvd19zaXplKDEsMSwyMSw3OSk7CisKKyAgLy8gUmVnaXN0ZXIgdGhlIG9udGltZW91dCBoYW5kbGVyLCB3aXRoIGEgdGltZSBvdXQgb2YgMTAgc2Vjb25kcworICByZWdfb250aW1lb3V0KG9udGltZW91dCx0aW1lb3V0KjEwLDApOworICByZWdfb250b3RhbHRpbWVvdXQob250b3RhbHRpbWVvdXQsdG90YWx0aW1lb3V0KjEwKTsKKworICAvLyBSZWdpc3RlciBtZW51c3lzdGVtIGhhbmRsZXJzCisgIHJlZ19oYW5kbGVyKEhETFJfS0VZUywma2V5c19oYW5kbGVyKTsKKy8qIC0tLS0gRW5kIG9mIGluaXRpYWxpemF0aW9uIC0tLSAqLworCisvKiAtLS0tLS0tIE1FTlUgbmV0bWVudSAtLS0tLSAqLworICBhZGRfbmFtZWRfbWVudSgibmV0bWVudSIsIiBJbml0IE5ldHdvcmsgIiwtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8Tj5vbmUiLCJEb250IHN0YXJ0IG5ldHdvcmsiLE9QVF9SQURJT0lURU0sIm5ldHdvcms9bm8iLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8ZD5oY3AiLCJVc2UgREhDUCIsT1BUX1JBRElPSVRFTSwibmV0d29yaz1kaGNwIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisvKiAtLS0tLS0tIE1FTlUgdGVzdGluZyAtLS0tLSAqLworICBhZGRfbmFtZWRfbWVudSgidGVzdGluZyIsIiBUZXN0aW5nICIsLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPE0+ZW1vcnkgVGVzdCIsIlBlcmZvcm0gZXh0ZW5zaXZlIG1lbW9yeSB0ZXN0aW5nIixPUFRfUlVOLCJtZW10ZXN0IiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiwyNSwzKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEk+bnZpc2libGUiLCJZb3UgZG9udCBzZWUgdGhpcyIsT1BUX0lOVklTSUJMRSwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEU+eGl0IG1lbnUiLCJHbyBvbmUgbGV2ZWwgdXAiLE9QVF9FWElUTUVOVSwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisvKiAtLS0tLS0tIE1FTlUgcmVzY3VlIC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJyZXNjdWUiLCIgUmVzY3VlIE9wdGlvbnMgIiwtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8TD5pbnV4IFJlc2N1ZSIsIlJ1biBsaW5yZXNjIixPUFRfUlVOLCJsaW5yZXNjIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEQ+b3MgUmVzY3VlIiwiZG9zcmVzYyIsT1BUX1JVTiwiZG9zcmVzYyIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxXPmluZG93cyBSZXNjdWUiLCJ3aW5yZXNjIixPUFRfUlVOLCJ3aW5yZXNjIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEU+eGl0IHRoaXMgbWVudSIsIkdvIG9uZSBsZXZlbCB1cCIsT1BUX0VYSVRNRU5VLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKy8qIC0tLS0tLS0gTUVOVSBwcmVwIC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJwcmVwIiwiIFByZXAgb3B0aW9ucyAiLC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxiPmFzZXVybCBieSBJUD8iLCJTcGVjaWZ5IGd1aSBiYXNldXJsIGJ5IElQIGFkZHJlc3MiLE9QVF9DSEVDS0JPWCwiYmFzZXVybD1odHRwOi8vMTkyLjE2OC4wLjEiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8bT5vdW50Y2Q/IiwiTW91bnQgdGhlIGNkcm9tIGRyaXZlPyIsT1BUX0NIRUNLQk9YLCJtb3VudGNkIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiTmV0d29yayBJbml0aWFsaXphdGlvbiIsIkhvdyB0byBpbml0aWFsaXNlIG5ldHdvcmsgZGV2aWNlPyIsT1BUX1JBRElPTUVOVSwibmV0bWVudSIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIiIsIiIsT1BUX1NFUCwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiUmVpbnN0YWxsIDx3PmluZG93cyIsIlJlLWluc3RhbGwgdGhlIHdpbmRvd3Mgc2lkZSBvZiBhIGR1YWwgYm9vdCBzZXR1cCIsT1BUX0NIRUNLQk9YLCJyZXBhaXI9d2luIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiUmVpbnN0YWxsIDxsPmludXgiLCJSZS1pbnN0YWxsIHRoZSBsaW51eCBzaWRlIG9mIGEgZHVhbCBib290IHNldHVwIixPUFRfQ0hFQ0tCT1gsInJlcGFpcj1saW4iLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCIiLCIiLE9QVF9TRVAsIiIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsNjU1MzUsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxSPnVuIHByZXAgbm93IiwiRXhlY3V0ZSBwcmVwIHdpdGggdGhlIGFib3ZlIG9wdGlvbnMiLE9QVF9SVU4sInByZXAiLDApOworICBzZXRfeHRyYShjdXJyLCJwcmVwIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPEU+eGl0IHRoaXMgbWVudSIsIkdvIHVwIG9uZSBsZXZlbCIsT1BUX0VYSVRNRU5VLCIiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKy8qIC0tLS0tLS0gTUVOVSBtYWluIC0tLS0tICovCisgIGFkZF9uYW1lZF9tZW51KCJtYWluIiwiIE1haW4gTWVudSAiLC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0obG9naW5zdHIsIkxvZ2luL0xvZ291dCBvZiBhdXRoZW50aWNhdGlvbiBzeXN0ZW0iLE9QVF9SVU4sTlVMTCwwKTsKKyAgY3Vyci0+aGVscGlkID0gNjU1MzU7CisgIGN1cnItPmhhbmRsZXIgPSAmbG9naW5faGFuZGxlcjsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxQPnJlcGFyZSIsInByZXAiLE9QVF9SVU4sInByZXAiLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8UD5yZXAgb3B0aW9ucy4uLiIsIk9wdGlvbnMgZm9yIHByZXAiLE9QVF9TVUJNRU5VLCJwcmVwIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworCisgIGN1cnIgPSBhZGRfaXRlbSgiPFI+ZXNjdWUgb3B0aW9ucy4uLiIsIlRyb3VibGVzaG9vdCBhIHN5c3RlbSIsT1BUX1NVQk1FTlUsInJlc2N1ZSIsMCk7CisgIHNldF94dHJhKGN1cnIsIiIsIiIsMjYsMCk7IC8vIFNldCBhc3NvY2lhdGVkIGV4dHJhIGluZm8KKyAgc2V0X3Nob3J0Y3V0KC0xKTsKKworICBjdXJyID0gYWRkX2l0ZW0oIjxUPmVzdGluZy4uLiIsIk9wdGlvbnMgdG8gdGVzdCBoYXJkd2FyZSIsT1BUX1NVQk1FTlUsInRlc3RpbmciLDApOworICBzZXRfeHRyYShjdXJyLCIiLCIiLDY1NTM1LDApOyAvLyBTZXQgYXNzb2NpYXRlZCBleHRyYSBpbmZvCisgIHNldF9zaG9ydGN1dCgtMSk7CisKKyAgY3VyciA9IGFkZF9pdGVtKCI8RT54aXQgdG8gcHJvbXB0IiwiRXhpdCB0aGUgbWVudSBzeXN0ZW0iLE9QVF9FWElUTUVOVSwiIiwwKTsKKyAgc2V0X3h0cmEoY3VyciwiIiwiIiw2NTUzNSwwKTsgLy8gU2V0IGFzc29jaWF0ZWQgZXh0cmEgaW5mbworICBzZXRfc2hvcnRjdXQoLTEpOworLyogLS0tLS0tLSBFTkQgT0YgTUVOVSBkZWNsYXJhdGlvbnMgLS0tLS0gKi8KKworLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHNraXAgdGhlIG1lbnUgYWx0b2dldGhlcgorICBxdWl0ID0gMDsgLy8gRG9udCBza2lwIHRoZSBtZW51CisgIGlmIChnZXRzaGlmdGZsYWdzKCkgJiBza2lwYml0cykgeyAvLyB3ZSBtdXN0IHNraXAgdGhlIG1lbnUgYWx0b2d0aGVyIGFuZCBleGVjdXRlIHNraXBjbWQKKyAgICBkb3RydiA9IGV4ZWNkb3RjbWQoc2tpcGNtZCwiLmJlZXAlLmV4aXQiLE5VTEwpOyAvLyBXb3JzdCBjYXNlIHdlIGJlZXAgYW5kIGV4aXQKKyAgICBpZiAoZG90cnYgPT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICB9CisKKy8vIFN3aXRjaCB2aWRlIG1vZGUgaWYgcmVxdWlyZWQKKyAgIGlmICh2bW9kZSAhPSAweEZGKSBzZXR2aWRlb21vZGUodm1vZGUpOworCisvLyBEbyB3ZSBoYXZlIGEgc3RhcnRmaWxlIHRvIGRpc3BsYXk/CisgICBpZiAoc3RhcnRmaWxlWzBdICE9ICdcMCcpIHJ1bmhlbHAoc3RhcnRmaWxlKTsKKworLy8gVGhlIG1haW4gbG9vcAorICB3aGlsZSAocXVpdCA9PSAwKSB7IC8vIEFzIGxvbmcgYXMgcXVpdCBpcyB6ZXJvIHJlcGVhdAorICAgICBjdXJyID0gc2hvd21lbnVzKGZpbmRfbWVudV9udW0oIm1haW4iKSk7IC8vIEluaXRpYWwgbWVudSBpcyB0aGUgb25lIGNhbGxlZCAibWFpbiIKKworICAgICBpZiAoY3VycikgeworICAgICAgICBpZiAoY3Vyci0+YWN0aW9uID09IE9QVF9SVU4pIHsKKyAgICAgICAgICAgZWNtZCA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSpNQVhfQ01EX0xJTkVfTEVOR1RIKTsKKyAgICAgICAgICAgZ2VuY29tbWFuZChjdXJyLGVjbWQpOworICAgICAgICAgICB0ZW1wID0gKGN1cnItPmV4dHJhX2RhdGEgPyAoKHB0X3h0cmEpY3Vyci0+ZXh0cmFfZGF0YSktPmlwYXBwZW5kIDogMCk7CisgICAgICAgICAgIHJ1bnN5c2xpbnV4aW1hZ2UoZWNtZCx0ZW1wKTsKKyAgICAgICAgICAgLy8ga2VybmVsIG5vdCBmb3VuZCBzbyBleGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBkb3QgY29tbWFuZAorICAgICAgICAgICBkb3RydiA9IGV4ZWNkb3RjbWQob25lcnJjbWQsIi5xdWl0IixlY21kKTsgLy8gcGFzcyBiYWQgY21kbGluZSBhcyBhcmcKKyAgICAgICAgICAgaWYgKGRvdHJ2PT0gUVVJVF9DTUQpIHF1aXQgPSAxOworICAgICAgICAgICBmcmVlKGVjbWQpOyBlY21kID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGNzcHJpbnQoIkVycm9yIGluIHByb2dyYW1taW5nISIsMHgwNyk7CisgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZpbmQgZWZmZWN0aXZlIGV4aXQgY29tbWFuZAorICAgICAgICBlY21kID0gKCBpc2FsbG93ZWQodXNlcm5hbWUsInJvb3QiKSA/IGV4aXRjbWRyb290IDogZXhpdGNtZCk7CisgICAgICAgIGRvdHJ2ID0gZXhlY2RvdGNtZChlY21kLCIucmVwZWF0IixOVUxMKTsKKyAgICAgICAgcXVpdCA9IChkb3RydiA9PSBRVUlUX0NNRCA/IDEgOiAwKTsgLy8gc2hvdWxkIHdlIGV4aXQgbm93CisgICAgIH0KKyAgfQorCisvLyBEZWFsbG9jYXRlIHNwYWNlIHVzZWQgYW5kIHF1aXQKKyAgY2xvc2VfcGFzc3dvcmRzKCk7CisgIGNsb3NlX2hlbHAoKTsKKyAgY2xvc2VfbWVudXN5c3RlbSgpOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvY21lbnUvdGVzdDIuYzMyIGIvZWZpNjQvY29tMzIvY21lbnUvdGVzdDIuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmMTAxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9jbWVudS90ZXN0Mi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguZTY0IGIvZWZpNjQvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguZTY0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkZmE2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9lbGZsaW5rL2xkbGludXgvbGRsaW51eC5lNjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguZWxmIGIvZWZpNjQvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguZWxmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNkNjFmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9lbGZsaW5rL2xkbGludXgvbGRsaW51eC5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvZ2Z4Ym9vdC9nZnhib290LmMzMiBiL2VmaTY0L2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzQwM2U3NwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvZ2Z4Ym9vdC9nZnhib290LmVsZiBiL2VmaTY0L2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5lbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2YyZDM4NAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2dmeGJvb3QvZ2Z4Ym9vdC5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvZ3BsbGliL2xpYmdwbC5jMzIgYi9lZmk2NC9jb20zMi9ncGxsaWIvbGliZ3BsLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OGNiOTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvZ3BsbGliL2xpYmdwbC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvZ3BsbGliL2xpYmdwbC5lbGYgYi9lZmk2NC9jb20zMi9ncGxsaWIvbGliZ3BsLmVsZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTViMmNkCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvZ3BsbGliL2xpYmdwbC5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvaGR0L2hkdC5jMzIgYi9lZmk2NC9jb20zMi9oZHQvaGR0LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNGU4YTNjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvaGR0L2hkdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbGliL2xpYmNvbTMyLmMzMiBiL2VmaTY0L2NvbTMyL2xpYi9saWJjb20zMi5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWM1Yzk2OQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2xpYi9saWJjb20zMi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbGliL2xpYmNvbTMyLmVsZiBiL2VmaTY0L2NvbTMyL2xpYi9saWJjb20zMi5lbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTM4NDczMwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2xpYi9saWJjb20zMi5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbGlidXRpbC9saWJ1dGlsLmMzMiBiL2VmaTY0L2NvbTMyL2xpYnV0aWwvbGlidXRpbC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODliNTA1OAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2xpYnV0aWwvbGlidXRpbC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbGlidXRpbC9saWJ1dGlsX2xueC5hIGIvZWZpNjQvY29tMzIvbGlidXRpbC9saWJ1dGlsX2xueC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTRkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9saWJ1dGlsL2xpYnV0aWxfbG54LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy9jbWVudS5jMzIgYi9lZmk2NC9jb20zMi9sdWEvc3JjL2NtZW51LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MTc0N2ViCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbHVhL3NyYy9jbWVudS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy9jcHUuYzMyIGIvZWZpNjQvY29tMzIvbHVhL3NyYy9jcHUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0MDE5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9sdWEvc3JjL2NwdS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy9kaGNwLmMzMiBiL2VmaTY0L2NvbTMyL2x1YS9zcmMvZGhjcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjkxZThhZAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2x1YS9zcmMvZGhjcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy9kbWkuYzMyIGIvZWZpNjQvY29tMzIvbHVhL3NyYy9kbWkuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0NjcwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9sdWEvc3JjL2RtaS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy9sZnMuYzMyIGIvZWZpNjQvY29tMzIvbHVhL3NyYy9sZnMuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwYjU1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9sdWEvc3JjL2xmcy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy9saWJsdWEuYzMyIGIvZWZpNjQvY29tMzIvbHVhL3NyYy9saWJsdWEuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5MDFlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9sdWEvc3JjL2xpYmx1YS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy9sdWEuYzMyIGIvZWZpNjQvY29tMzIvbHVhL3NyYy9sdWEuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2M2RjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9sdWEvc3JjL2x1YS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy9wY2kuYzMyIGIvZWZpNjQvY29tMzIvbHVhL3NyYy9wY2kuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxMGU0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9sdWEvc3JjL3BjaS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy9zeXNsaW51eC5jMzIgYi9lZmk2NC9jb20zMi9sdWEvc3JjL3N5c2xpbnV4LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNjQzZDNmCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbHVhL3NyYy9zeXNsaW51eC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbHVhL3NyYy92ZXNhLmMzMiBiL2VmaTY0L2NvbTMyL2x1YS9zcmMvdmVzYS5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjkxODZhYgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL2x1YS9zcmMvdmVzYS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbWJvb3QvbWJvb3QuYzMyIGIvZWZpNjQvY29tMzIvbWJvb3QvbWJvb3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg4MmVhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tYm9vdC9tYm9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbWVudS9tZW51LmMzMiBiL2VmaTY0L2NvbTMyL21lbnUvbWVudS5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDE0YmNkNwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21lbnUvbWVudS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbWVudS92ZXNhbWVudS5jMzIgYi9lZmk2NC9jb20zMi9tZW51L3Zlc2FtZW51LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZTc3NDNlCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbWVudS92ZXNhbWVudS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9jYXQuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9jYXQuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmMDg2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2NhdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9jbWQuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9jbWQuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAxYzE4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2NtZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9jb25maWcuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9jb25maWcuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjYjMxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2NvbmZpZy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9jcHRpbWUuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9jcHRpbWUuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlOTQ0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2NwdGltZS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9jcHVpZC5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2NwdWlkLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTliMmZlCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9jcHVpZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9jcHVpZHRlc3QuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9jcHVpZHRlc3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5MTFhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2NwdWlkdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9kZWJ1Zy5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2RlYnVnLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMzEwOGMyCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9kZWJ1Zy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9kaXNrLmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvZGlzay5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDZlMjg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvZGlzay5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9kbWl0ZXN0LmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvZG1pdGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmViMjllOQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvZG1pdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9lbGYuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9lbGYuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxMzBhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2VsZi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9ldGhlcnNlbC5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2V0aGVyc2VsLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jM2EzOWJkCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9ldGhlcnNlbC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9ncHhlY21kLmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvZ3B4ZWNtZC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODkwNWIyNAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvZ3B4ZWNtZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9oZXhkdW1wLmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvaGV4ZHVtcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTUyYjM2YgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvaGV4ZHVtcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9ob3N0LmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvaG9zdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODE0NmM4YQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvaG9zdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9pZmNwdS5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2lmY3B1LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNWQxNzYwCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9pZmNwdS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9pZmNwdTY0LmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvaWZjcHU2NC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGYyODU5MAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvaWZjcHU2NC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9pZm1lbWRzay5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2lmbWVtZHNrLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MDQ1Mjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9pZm1lbWRzay5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9pZnBsb3AuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9pZnBsb3AuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyOGJmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2lmcGxvcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9rYmRtYXAuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9rYmRtYXAuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmOTRiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2tiZG1hcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9rb250cm9uX3dkdC5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2tvbnRyb25fd2R0LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wODcyODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9rb250cm9uX3dkdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9saW51eC5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2xpbnV4LmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZTI2Zjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9saW51eC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9scy5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL2xzLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YTVkODU5Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9scy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9tZW1pbmZvLmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvbWVtaW5mby5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGFmYmNiMAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvbWVtaW5mby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9wY2l0ZXN0LmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvcGNpdGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDUwMWI4NQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvcGNpdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9wbWxvYWQuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9wbWxvYWQuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiMDFlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3BtbG9hZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9wb3dlcm9mZi5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3Bvd2Vyb2ZmLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOGU3ZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9wb3dlcm9mZi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9wcmRoY3AuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9wcmRoY3AuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzNWE3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3ByZGhjcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9wd2QuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9wd2QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmNmU1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3B3ZC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9weGVjaG4uYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9weGVjaG4uYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1NzNhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3B4ZWNobi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9yZWJvb3QuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9yZWJvb3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiNGIwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3JlYm9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9zYW5ib290LmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvc2FuYm9vdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTRkZTBmZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvc2FuYm9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy9zZGkuYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy9zZGkuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmMWFjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3NkaS5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy92ZXNhaW5mby5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3Zlc2FpbmZvLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MTkzMWVjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy92ZXNhaW5mby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy92cGR0ZXN0LmMzMiBiL2VmaTY0L2NvbTMyL21vZHVsZXMvdnBkdGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODdjMmRjZQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL21vZHVsZXMvdnBkdGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy93aGljaHN5cy5jMzIgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3doaWNoc3lzLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDU5NzhmCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvbW9kdWxlcy93aGljaHN5cy5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvbW9kdWxlcy96empzb24uYzMyIGIvZWZpNjQvY29tMzIvbW9kdWxlcy96empzb24uYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlkNDI2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9tb2R1bGVzL3p6anNvbi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvcm9zaC9yb3NoLmMzMiBiL2VmaTY0L2NvbTMyL3Jvc2gvcm9zaC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE5YjU2NwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL3Jvc2gvcm9zaC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9hZHZkdW1wLmMzMiBiL2VmaTY0L2NvbTMyL3NhbXBsZXMvYWR2ZHVtcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzgxYzI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL3NhbXBsZXMvYWR2ZHVtcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9lbnRyeWR1bXAuYzMyIGIvZWZpNjQvY29tMzIvc2FtcGxlcy9lbnRyeWR1bXAuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiYWM4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9zYW1wbGVzL2VudHJ5ZHVtcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9mYW5jeWhlbGxvLmMzMiBiL2VmaTY0L2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjRlMTA4ZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9mYW5jeWhlbGxvLmxueCBiL2VmaTY0L2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5sbngKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjg0NGUzOQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL3NhbXBsZXMvZmFuY3loZWxsby5sbngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9oZWxsby5jMzIgYi9lZmk2NC9jb20zMi9zYW1wbGVzL2hlbGxvLmMzMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OTFhOWYyCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvY29tMzIvc2FtcGxlcy9oZWxsby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9rZXl0ZXN0LmMzMiBiL2VmaTY0L2NvbTMyL3NhbXBsZXMva2V5dGVzdC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM1MDA3NQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL3NhbXBsZXMva2V5dGVzdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9rZXl0ZXN0LmxueCBiL2VmaTY0L2NvbTMyL3NhbXBsZXMva2V5dGVzdC5sbngKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGJlMjgwYgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL3NhbXBsZXMva2V5dGVzdC5sbngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9sb2NhbGJvb3QuYzMyIGIvZWZpNjQvY29tMzIvc2FtcGxlcy9sb2NhbGJvb3QuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZiY2IzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9zYW1wbGVzL2xvY2FsYm9vdC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9yZXNvbHYuYzMyIGIvZWZpNjQvY29tMzIvc2FtcGxlcy9yZXNvbHYuYzMyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiNzU4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9jb20zMi9zYW1wbGVzL3Jlc29sdi5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc2FtcGxlcy9zZXJpYWxpbmZvLmMzMiBiL2VmaTY0L2NvbTMyL3NhbXBsZXMvc2VyaWFsaW5mby5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWZiZDI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL3NhbXBsZXMvc2VyaWFsaW5mby5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc3lzZHVtcC9zeXNkdW1wLmMzMiBiL2VmaTY0L2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5jMzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Y5ZjhlNgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5jMzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvY29tMzIvc3lzZHVtcC9zeXNkdW1wLmVsZiBiL2VmaTY0L2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5lbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjAzNWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2NvbTMyL3N5c2R1bXAvc3lzZHVtcC5lbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvZWZpL3N5c2xpbnV4LmVmaSBiL2VmaTY0L2VmaS9zeXNsaW51eC5lZmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiYTljMwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2VmaS9zeXNsaW51eC5lZmkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvYXJnaWZ5LmggYi9lZmk2NC9pbmNsdWRlL2VmaS9hcmdpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2YzZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvYXJnaWZ5LmgKQEAgLTAsMCArMSw0MSBAQAorCisKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgSGV3bGV0dC1QYWNrYXJkIENvLgorICogICAgICBDb250cmlidXRlZCBieSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiAgICAgIENvbnRyaWJ1dGVkIGJ5IEJyZW50IENhc2F2YW50IDxiY2FzYXZhbkBzZ2kuY29tPgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICogICAgICBDb250cmlidXRlZCBieSBGZW5naHVhIFl1IDxmZW5naHVhLnl1QGludGVsLmNvbT4KKyAqICAgICAgQ29udHJpYnV0ZWQgYnkgQmlibyBNYW8gPGJpYm8ubWFvQGludGVsLmNvbT4KKyAqICAgICAgQ29udHJpYnV0ZWQgYnkgQ2hhbmRyYW1vdWxpIE5hcmF5YW5hbiA8bW91bGlAbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBFTElMTywgdGhlIEVGSSBMaW51eCBib290IGxvYWRlci4KKyAqCisgKiAgRUxJTE8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBFTElMTyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCBFTElMTzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBjaGVjayBvdXQgdGhlIGVsaWxvLnR4dCBmb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBvbiBob3cKKyAqIHRvIHVzZSB0aGlzIHByb2dyYW0uCisgKi8KKworCisjZGVmaW5lIE1BWF9BUkdTIDI1NgorCitJTlROCithcmdpZnkoQ0hBUjE2ICpidWYsIFVJTlROIGxlbiwgQ0hBUjE2ICoqYXJndik7CisKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL2VmaS5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkMjc0MAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaS5oCisKK0Fic3RyYWN0OgorCisgICAgUHVibGljIEVGSSBoZWFkZXIgZmlsZXMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisvLworLy8gQnVpbGQgZmxhZ3Mgb24gaW5wdXQKKy8vICBFRkkzMgorLy8gIEVGSV9ERUJVRyAgICAgICAgICAgICAgIC0gRW5hYmxlIGRlYnVnZ2luZyBjb2RlCisvLyAgRUZJX05UX0VNVUxBVE9SICAgICAgICAgLSBCdWlsZGluZyBmb3IgcnVubmluZyB1bmRlciBOVAorLy8KKworCisjaWZuZGVmIF9FRklfSU5DTFVERV8KKyNkZWZpbmUgX0VGSV9JTkNMVURFXworCisjZGVmaW5lIEVGSV9GSVJNV0FSRV9WRU5ET1IgICAgICAgICBMIklOVEVMIgorI2RlZmluZSBFRklfRklSTVdBUkVfTUFKT1JfUkVWSVNJT04gMTIKKyNkZWZpbmUgRUZJX0ZJUk1XQVJFX01JTk9SX1JFVklTSU9OIDMzCisjZGVmaW5lIEVGSV9GSVJNV0FSRV9SRVZJU0lPTiAoKEVGSV9GSVJNV0FSRV9NQUpPUl9SRVZJU0lPTiA8PDE2KSB8IChFRklfRklSTVdBUkVfTUlOT1JfUkVWSVNJT04pKQorCisjaW5jbHVkZSAiZWZpYmluZC5oIgorI2luY2x1ZGUgImVmaWRlZi5oIgorI2luY2x1ZGUgImVmaWRldnAuaCIKKyNpbmNsdWRlICJlZmlwY2lpby5oIgorI2luY2x1ZGUgImVmaXByb3QuaCIKKyNpbmNsdWRlICJlZmljb24uaCIKKyNpbmNsdWRlICJlZmlzZXIuaCIKKyNpbmNsdWRlICJlZmlfbmlpLmgiCisjaW5jbHVkZSAiZWZpcHhlYmMuaCIKKyNpbmNsdWRlICJlZmluZXQuaCIKKyNpbmNsdWRlICJlZmlhcGkuaCIKKyNpbmNsdWRlICJlZmlmcy5oIgorI2luY2x1ZGUgImVmaWVyci5oIgorI2luY2x1ZGUgImVmaXVpLmgiCisjaW5jbHVkZSAiZWZpaXAuaCIKKyNpbmNsdWRlICJlZml1ZHAuaCIKKyNpbmNsdWRlICJlZml0Y3AuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9lZmlfbmlpLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlfbmlpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3YTViMgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaV9uaWkuaApAQCAtMCwwICsxLDc0IEBACisjaWZuZGVmIF9FRklfTklJX0gKKyNkZWZpbmUgX0VGSV9OSUlfSAorCisvKisrCitDb3B5cmlnaHQgKGMpIDIwMDAgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBuYW1lOgorICAgIGVmaV9uaWkuaAorCitBYnN0cmFjdDoKKworUmV2aXNpb24gaGlzdG9yeToKKyAgICAyMDAwLUZlYi0xOCBNKGYpSiAgIEdVSUQgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBTdHJ1Y3R1cmUgb3JkZXIgY2hhbmdlZCBmb3IgbWFjaGluZSB3b3JkIGFsaWdubWVudC4KKyAgICAgICAgICAgICAgICBBZGRlZCBTdHJpbmdJZFs0XSB0byBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgCisgICAgMjAwMC1GZWItMTQgTShmKUogICBHZW5lc2lzLgorLS0qLworCisjZGVmaW5lIEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX1BST1RPQ09MIFwKKyAgICB7IDB4RTE4NTQxQ0QsIDB4Rjc1NSwgMHg0ZjczLCB7MHg5MiwgMHg4RCwgMHg2NCwgMHgzQywgMHg4QSwgMHg3OSwgMHhCMiwgMHgyOX0gfQorCisjZGVmaW5lIEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX0lOVEVSRkFDRV9SRVZJU0lPTiAweDAwMDEwMDAwCisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpTmV0d29ya0ludGVyZmFjZVVuZGkgPSAxCit9IEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9UWVBFOworCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBVSU5UNjQgUmV2aXNpb247CisgICAgLy8gUmV2aXNpb24gb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlkZW50aWZpZXIgcHJvdG9jb2wgaW50ZXJmYWNlLgorCisgICAgVUlOVDY0IElEOworICAgIC8vIEFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGlkZW50aWZ5aW5nIHN0cnVjdHVyZSBmb3IgdGhpcworICAgIC8vIG5ldHdvcmsgaW50ZXJmYWNlLiAgVGhpcyBpcyBzZXQgdG8gemVybyBpZiB0aGVyZSBpcyBubyBzdHJ1Y3R1cmUuCisgICAgLy8KKyAgICAvLyBGb3IgUFhFL1VOREkgdGhpcyBpcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgIVBYRSBzdHJ1Y3R1cmUuCisKKyAgICBVSU5UNjQgSW1hZ2VBZGRyOworICAgIC8vIEFkZHJlc3Mgb2YgdGhlIFVOcmVsb2NhdGVkIGRyaXZlci9ST00gaW1hZ2UuICBUaGlzIGlzIHNldAorICAgIC8vIHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gZHJpdmVyL1JPTSBpbWFnZS4KKyAgICAvLworICAgIC8vIEZvciAxNi1iaXQgVU5ESSwgdGhpcyBpcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgb3B0aW9uIFJPTSBpbgorICAgIC8vIHVwcGVyIG1lbW9yeS4KKyAgICAvLworICAgIC8vIEZvciAzMi82NC1iaXQgUy9XIFVOREksIHRoaXMgaXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIEVGSSBST00KKyAgICAvLyBpbWFnZS4KKyAgICAvLworICAgIC8vIEZvciBIL1cgVU5ESSwgdGhpcyBpcyBzZXQgdG8gemVyby4KKworICAgIFVJTlQzMiBJbWFnZVNpemU7CisgICAgLy8gU2l6ZSBvZiB0aGUgVU5yZWxvY2F0ZWQgZHJpdmVyL1JPTSBpbWFnZSBvZiB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgIC8vIFRoaXMgaXMgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gZHJpdmVyL1JPTSBpbWFnZS4KKworICAgIENIQVI4IFN0cmluZ0lkWzRdOworICAgIC8vIDQgY2hhciBBU0NJSSBzdHJpbmcgdG8gZ28gaW4gY2xhc3MgaWRlbnRpZmllciAob3B0aW9uIDYwKSBpbiBESENQCisgICAgLy8gYW5kIEJvb3QgU2VydmVyIGRpc2NvdmVyIHBhY2tldHMuCisgICAgLy8gRm9yIEVmaU5ldHdvcmtJbnRlcmZhY2VVbmRpIHRoaXMgZmllbGQgaXMgIlVOREkiLgorICAgIC8vIEZvciBFZmlOZXR3b3JrSW50ZXJmYWNlU25wIHRoaXMgZmllbGQgaXMgIlNOUE4iLgorCisgICAgVUlOVDggVHlwZTsKKyAgICBVSU5UOCBNYWpvclZlcjsKKyAgICBVSU5UOCBNaW5vclZlcjsKKyAgICAvLyBJbmZvcm1hdGlvbiB0byBiZSBwbGFjZWQgaW50byB0aGUgUFhFIERIQ1AgYW5kIERpc2NvdmVyIHBhY2tldHMuCisgICAgLy8gVGhpcyBpcyB0aGUgbmV0d29yayBpbnRlcmZhY2UgdHlwZSBhbmQgdmVyc2lvbiBudW1iZXIgdGhhdCB3aWxsCisgICAgLy8gYmUgcGxhY2VkIGludG8gREhDUCBvcHRpb24gOTQgKGNsaWVudCBuZXR3b3JrIGludGVyZmFjZSBpZGVudGlmaWVyKS4KKyAgICBCT09MRUFOIElwdjZTdXBwb3J0ZWQ7CisJVUlOVDggICBJZk51bTsJLy8gaW50ZXJmYWNlIG51bWJlciB0byBiZSB1c2VkIHdpdGggcHhlaWQgc3RydWN0dXJlCit9IEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX0lOVEVSRkFDRTsKKworZXh0ZXJuIEVGSV9HVUlEIE5ldHdvcmtJbnRlcmZhY2VJZGVudGlmaWVyUHJvdG9jb2w7CisKKyNlbmRpZiAvLyBfRUZJX05JSV9ICmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9lZmlfcHhlLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlfcHhlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0MjUxZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaV9weGUuaApAQCAtMCwwICsxLDE3NDMgQEAKKyNpZm5kZWYgX0VGSV9QWEVfSAorI2RlZmluZSBfRUZJX1BYRV9ICisKKworLyorKworQ29weXJpZ2h0IChjKSBJbnRlbCAgMTk5OQorCitNb2R1bGUgbmFtZToKKyAgICBlZmlfcHhlLmgKKworMzIvNjQtYml0IFBYRSBzcGVjaWZpY2F0aW9uOgorICAgIGFscGhhLTQsIDk5LURlYy0xNworCitBYnN0cmFjdDoKKyAgICBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgUFhFIHR5cGUgZGVmaW5pdGlvbnMsCisgICAgc3RydWN0dXJlIHByb3RvdHlwZXMsIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGNvbnN0YW50cyB0aGF0CisgICAgYXJlIG5lZWRlZCBmb3IgcG9ydGluZyBQWEUgdG8gRUZJLgorLS0qLworCisjcHJhZ21hIHBhY2soMSkKKworI2RlZmluZSBQWEVfSU5URUxfT1JERVIgICAgICAgICAxICAgLy8gSW50ZWwgb3JkZXIKKy8vI2RlZmluZSBQWEVfTkVUV09SS19PUkRFUiAgICAgICAgIDEgICAvLyBuZXR3b3JrIG9yZGVyCisKKyNkZWZpbmUgUFhFX1VJTlQ2NF9TVVBQT1JUICAgICAgICAgIDEgICAvLyBVSU5UNjQgc3VwcG9ydGVkCisvLyNkZWZpbmUgUFhFX05PX1VJTlQ2NF9TVVBQT1JUICAgICAxICAgLy8gVUlOVDY0IG5vdCBzdXBwb3J0ZWQKKworI2RlZmluZSBQWEVfQlVTVFlQRShhLGIsYyxkKSAgICAgICAgICAgIFwKKygoKChQWEVfVUlOVDMyKShkKSAmIDB4RkYpIDw8IDI0KSB8IFwKKygoKFBYRV9VSU5UMzIpKGMpICYgMHhGRikgPDwgMTYpIHwgIFwKKygoKFBYRV9VSU5UMzIpKGIpICYgMHhGRikgPDwgOCkgfCAgICAgICBcCisoKFBYRV9VSU5UMzIpKGEpICYgMHhGRikpCisKKy8vCisvLyBVTkRJIFJPTSBJRCBhbmQgZGV2aXZlIElEIHNpZ25hdHVyZQorLy8KKyNkZWZpbmUgUFhFX0JVU1RZUEVfUFhFICAgICAgICAgUFhFX0JVU1RZUEUoJyEnLCAnUCcsICdYJywgJ0UnKQorCisvLworLy8gQlVTIFJPTSBJRCBzaWduYXR1cmVzCisvLworI2RlZmluZSBQWEVfQlVTVFlQRV9QQ0kgICAgICAgICBQWEVfQlVTVFlQRSgnUCcsICdDJywgJ0knLCAnUicpCisjZGVmaW5lIFBYRV9CVVNUWVBFX1BDX0NBUkQgICAgIFBYRV9CVVNUWVBFKCdQJywgJ0MnLCAnQycsICdSJykKKyNkZWZpbmUgUFhFX0JVU1RZUEVfVVNCICAgICAgICAgUFhFX0JVU1RZUEUoJ1UnLCAnUycsICdCJywgJ1InKQorI2RlZmluZSBQWEVfQlVTVFlQRV8xMzk0ICAgICAgICBQWEVfQlVTVFlQRSgnMScsICczJywgJzknLCAnNCcpCisKKyNkZWZpbmUgUFhFX1NXQVBfVUlOVDE2KG4pICAgICAgICAgIFwKKygoKChQWEVfVUlOVDE2KShuKSAmIDB4MDBGRikgPDwgOCkgfCAgICBcCisoKChQWEVfVUlOVDE2KShuKSAmIDB4RkYwMCkgPj4gOCkpCisKKyNkZWZpbmUgUFhFX1NXQVBfVUlOVDMyKG4pICAgICAgICAgICAgICBcCisoKCgoUFhFX1VJTlQzMikobikgJiAweDAwMDAwMEZGKSA8PCAyNCkgfCAgIFwKKygoKFBYRV9VSU5UMzIpKG4pICYgMHgwMDAwRkYwMCkgPDwgOCkgfCAgICAgXAorKCgoUFhFX1VJTlQzMikobikgJiAweDAwRkYwMDAwKSA+PiA4KSB8ICAgICBcCisoKChQWEVfVUlOVDMyKShuKSAmIDB4RkYwMDAwMDApID4+IDI0KSkKKworI2lmIFBYRV9VSU5UNjRfU1VQUE9SVCAhPSAwCisjZGVmaW5lIFBYRV9TV0FQX1VJTlQ2NChuKSAgICAgICAgICAgICAgICAgIFwKKygoKChQWEVfVUlOVDY0KShuKSAmIDB4MDAwMDAwMDAwMDAwMDBGRikgPDwgNTYpIHwgICBcCisoKChQWEVfVUlOVDY0KShuKSAmIDB4MDAwMDAwMDAwMDAwRkYwMCkgPDwgNDApIHwgICAgXAorKCgoUFhFX1VJTlQ2NCkobikgJiAweDAwMDAwMDAwMDBGRjAwMDApIDw8IDI0KSB8ICAgIFwKKygoKFBYRV9VSU5UNjQpKG4pICYgMHgwMDAwMDAwMEZGMDAwMDAwKSA8PCA4KSB8IFwKKygoKFBYRV9VSU5UNjQpKG4pICYgMHgwMDAwMDBGRjAwMDAwMDAwKSA+PiA4KSB8IFwKKygoKFBYRV9VSU5UNjQpKG4pICYgMHgwMDAwRkYwMDAwMDAwMDAwKSA+PiAyNCkgfCAgICBcCisoKChQWEVfVUlOVDY0KShuKSAmIDB4MDBGRjAwMDAwMDAwMDAwMCkgPj4gNDApIHwgICAgXAorKCgoUFhFX1VJTlQ2NCkobikgJiAweEZGMDAwMDAwMDAwMDAwMDApID4+IDU2KSkKKyNlbmRpZiAvLyBQWEVfVUlOVDY0X1NVUFBPUlQKKworI2lmIFBYRV9OT19VSU5UNjRfU1VQUE9SVCAhPSAwCisjZGVmaW5lIFBYRV9TV0FQX1VJTlQ2NChuKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorUFhFX1VJTlQzMiB0bXAgPSAoUFhFX1VJTlQ2NCkobilbMV07ICAgICAgICAgICAgICAgIFwKKyhQWEVfVUlOVDY0KShuKVsxXSA9IFBYRV9TV0FQX1VJTlQzMigoUFhFX1VJTlQ2NCkobilbMF0pOyAgIFwKKyhQWEVfVUlOVDY0KShuKVswXSA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvLyBQWEVfTk9fVUlOVDY0X1NVUFBPUlQKKworI2RlZmluZSBQWEVfQ1BCU0laRV9OT1RfVVNFRCAgICAgICAgICAgIDAgICAvLyB6ZXJvCisjZGVmaW5lIFBYRV9EQlNJWkVfTk9UX1VTRUQgICAgICAgICAwICAgLy8gemVybworI2RlZmluZSBQWEVfQ1BCQUREUl9OT1RfVVNFRCAgICAgICAgKFBYRV9VSU5UNjQpMCAgICAgICAvLyB6ZXJvCisjZGVmaW5lIFBYRV9EQkFERFJfTk9UX1VTRUQgICAgIChQWEVfVUlOVDY0KTAgICAgICAgLy8gemVybworCisjZGVmaW5lIFBYRV9DT05TVCBjb25zdAorCisjZGVmaW5lIFBYRV9WT0xBVElMRSB2b2xhdGlsZQorCit0eXBlZGVmIHZvaWQgUFhFX1ZPSUQ7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBQWEVfVUlOVDg7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUFhFX1VJTlQxNjsKKwordHlwZWRlZiB1bnNpZ25lZCBQWEVfVUlOVDMyOworCisjaWYgUFhFX1VJTlQ2NF9TVVBQT1JUICE9IDAKKy8vIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBQWEVfVUlOVDY0OwordHlwZWRlZiBVSU5UNjQgUFhFX1VJTlQ2NDsKKyNlbmRpZiAvLyBQWEVfVUlOVDY0X1NVUFBPUlQKKworI2lmIFBYRV9OT19VSU5UNjRfU1VQUE9SVCAhPSAwCit0eXBlZGVmIFBYRV9VSU5UMzIgUFhFX1VJTlQ2NFsyXTsKKyNlbmRpZiAvLyBQWEVfTk9fVUlOVDY0X1NVUFBPUlQKKwordHlwZWRlZiB1bnNpZ25lZCBQWEVfVUlOVE47CisKK3R5cGVkZWYgUFhFX1VJTlQ4IFBYRV9CT09MOworCisjZGVmaW5lIFBYRV9GQUxTRSAgICAgICAgICAgICAgIDAgICAvLyB6ZXJvCisjZGVmaW5lIFBYRV9UUlVFICAgICAgICAgICAgICAgICAgICAoIVBYRV9GQUxTRSkKKwordHlwZWRlZiBQWEVfVUlOVDE2IFBYRV9PUENPREU7CisKKy8vCisvLyBSZXR1cm4gVU5ESSBvcGVyYXRpb25hbCBzdGF0ZS4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfR0VUX1NUQVRFICAgICAgICAgICAgICAgICAgICAweDAwMDAKKworLy8KKy8vIENoYW5nZSBVTkRJIG9wZXJhdGlvbmFsIHN0YXRlIGZyb20gU3RvcHBlZCB0byBTdGFydGVkLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9TVEFSVCAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8vCisvLyBDaGFuZ2UgVU5ESSBvcGVyYXRpb25hbCBzdGF0ZSBmcm9tIFN0YXJ0ZWQgdG8gU3RvcHBlZC4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfU1RPUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorCisvLworLy8gR2V0IFVOREkgaW5pdGlhbGl6YXRpb24gaW5mb3JtYXRpb24uCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0dFVF9JTklUX0lORk8gICAgICAgICAgICAgICAgMHgwMDAzCisKKy8vCisvLyBHZXQgTklDIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0dFVF9DT05GSUdfSU5GTyAgICAgICAgICAgICAgMHgwMDA0CisKKy8vCisvLyBDaGFuZ2VkIFVOREkgb3BlcmF0aW9uYWwgc3RhdGUgZnJvbSBTdGFydGVkIHRvIEluaXRpYWxpemVkLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9JTklUSUFMSVpFICAgICAgICAgICAgICAgICAgIDB4MDAwNQorCisvLworLy8gUmUtaW5pdGlhbGl6ZSB0aGUgTklDIEgvVy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfUkVTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwNgorCisvLworLy8gQ2hhbmdlIHRoZSBVTkRJIG9wZXJhdGlvbmFsIHN0YXRlIGZyb20gSW5pdGlhbGl6ZWQgdG8gU3RhcnRlZC4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfU0hVVERPV04gICAgICAgICAgICAgICAgIDB4MDAwNworCisvLworLy8gUmVhZCAmIGNoYW5nZSBzdGF0ZSBvZiBleHRlcm5hbCBpbnRlcnJ1cHQgZW5hYmxlcy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfSU5URVJSVVBUX0VOQUJMRVMgICAgICAgICAgICAgICAgMHgwMDA4CisKKy8vCisvLyBSZWFkICYgY2hhbmdlIHN0YXRlIG9mIHBhY2tldCByZWNlaXZlIGZpbHRlcnMuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1JFQ0VJVkVfRklMVEVSUyAgICAgICAgICAgICAgMHgwMDA5CisKKy8vCisvLyBSZWFkICYgY2hhbmdlIHN0YXRpb24gTUFDIGFkZHJlc3MuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1NUQVRJT05fQUREUkVTUyAgICAgICAgICAgICAgMHgwMDBBCisKKy8vCisvLyBSZWFkIHRyYWZmaWMgc3RhdGlzdGljcy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfU1RBVElTVElDUyAgICAgICAgICAgICAgICAgICAweDAwMEIKKworLy8KKy8vIENvbnZlcnQgbXVsdGljYXN0IElQIGFkZHJlc3MgdG8gbXVsdGljYXN0IE1BQyBhZGRyZXNzLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9NQ0FTVF9JUF9UT19NQUMgICAgICAgICAgICAgIDB4MDAwQworCisvLworLy8gUmVhZCBvciBjaGFuZ2Ugbm9uLXZvbGF0aWxlIHN0b3JhZ2Ugb24gdGhlIE5JQy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfTlZEQVRBICAgICAgICAgICAgICAgICAgIDB4MDAwRAorCisvLworLy8gR2V0ICYgY2xlYXIgaW50ZXJydXB0IHN0YXR1cy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfR0VUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweDAwMEUKKworLy8KKy8vIEZpbGwgbWVkaWEgaGVhZGVyIGluIHBhY2tldCBmb3IgdHJhbnNtaXQuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0ZJTExfSEVBREVSICAgICAgICAgICAgICAweDAwMEYKKworLy8KKy8vIFRyYW5zbWl0IHBhY2tldChzKS4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfVFJBTlNNSVQgICAgICAgICAgICAgICAgIDB4MDAxMAorCisvLworLy8gUmVjZWl2ZSBwYWNrZXQuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1JFQ0VJVkUgICAgICAgICAgICAgICAgICAweDAwMTEKKworLy8gbGFzdCB2YWxpZCBvcGNvZGU6CisjZGVmaW5lIFBYRV9PUENPREVfVkFMSURfTUFYICAgICAgICAgICAgICAgICAgICAweDAwMTEKKworLy8KKy8vIExhc3QgdmFsaWQgUFhFIFVOREkgT3BDb2RlIG51bWJlci4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfTEFTVF9WQUxJRCAgICAgICAgICAgICAgICAgICAweDAwMTEKKwordHlwZWRlZiBQWEVfVUlOVDE2IFBYRV9PUEZMQUdTOworCisjZGVmaW5lIFBYRV9PUEZMQUdTX05PVF9VU0VEICAgICAgICAgICAgICAgICAgICAweDAwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBHZXQgU3RhdGUKKy8vCisKKy8vIE5vIE9wRmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBTdGFydAorLy8KKworLy8gTm8gT3BGbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFN0b3AKKy8vCisKKy8vIE5vIE9wRmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBHZXQgSW5pdCBJbmZvCisvLworCisvLyBObyBPcGZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IENvbmZpZyBJbmZvCisvLworCisvLyBObyBPcGZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgSW5pdGlhbGl6ZQorLy8KKworI2RlZmluZSBQWEVfT1BGTEFHU19JTklUSUFMSVpFX0NBQkxFX0RFVEVDVF9NQVNLICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19JTklUSUFMSVpFX0RFVEVDVF9DQUJMRSAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19JTklUSUFMSVpFX0RPX05PVF9ERVRFQ1RfQ0FCTEUgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFJlc2V0CisvLworCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFU0VUX0RJU0FCTEVfSU5URVJSVVBUUyAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFU0VUX0RJU0FCTEVfRklMVEVSUyAgICAgICAgICAgMHgwMDAyCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU2h1dGRvd24KKy8vCisKKy8vIE5vIE9wRmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBJbnRlcnJ1cHQgRW5hYmxlcworLy8KKworLy8KKy8vIFNlbGVjdCB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIGV4dGVybmFsIGludGVycnVwdCBzaWduYWxzLgorLy8gU2V0dGluZyBib3RoIGVuYWJsZSBhbmQgZGlzYWJsZSB3aWxsIHJldHVybiBQWEVfU1RBVENPREVfSU5WQUxJRF9PUEZMQUdTLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX09QTUFTSyAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX0VOQUJMRSAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX0RJU0FCTEUgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfUkVBRCAgICAgICAgICAgICAgMHgwMDAwCisKKy8vCisvLyBFbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzLiAgQW4gZXh0ZXJuYWwgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkCisvLyBhZnRlciBhIGNvbXBsZXRlIG5vbi1lcnJvciBwYWNrZXQgaGFzIGJlZW4gcmVjZWl2ZWQuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfUkVDRUlWRSAgICAgICAgICAgMHgwMDAxCisKKy8vCisvLyBFbmFibGUgdHJhbnNtaXQgaW50ZXJydXB0cy4gIEFuIGV4dGVybmFsIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZAorLy8gYWZ0ZXIgYSBjb21wbGV0ZSBub24tZXJyb3IgcGFja2V0IGhhcyBiZWVuIHRyYW5zbWl0dGVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX1RSQU5TTUlUICAgICAgICAgIDB4MDAwMgorCisvLworLy8gRW5hYmxlIGNvbW1hbmQgaW50ZXJydXB0cy4gIEFuIGV4dGVybmFsIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZAorLy8gd2hlbiBjb21tYW5kIGV4ZWN1dGlvbiBzdG9wcy4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX0lOVEVSUlVQVF9DT01NQU5EICAgICAgICAgICAweDAwMDQKKworLy8KKy8vIEdlbmVyYXRlIHNvZnR3YXJlIGludGVycnVwdC4gIFNldHRpbmcgdGhpcyBiaXQgZ2VuZXJhdGVzIGFuIGV4dGVybmFsCisvLyBpbnRlcnJ1cHQsIGlmIGl0IGlzIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfU09GVFdBUkUgICAgICAgICAgMHgwMDA4CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgUmVjZWl2ZSBGaWx0ZXJzCisvLworCisvLworLy8gU2VsZWN0IHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgcmVjZWl2ZSBmaWx0ZXJzLgorLy8gU2V0dGluZyBib3RoIGVuYWJsZSBhbmQgZGlzYWJsZSB3aWxsIHJldHVybiBQWEVfU1RBVENPREVfSU5WQUxJRF9PUENPREUuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9PUE1BU0sgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9FTkFCTEUgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9ESVNBQkxFICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9SRUFEICAgICAgICAgMHgwMDAwCisKKy8vCisvLyBUbyByZXNldCB0aGUgY29udGVudHMgb2YgdGhlIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmaWx0ZXIgbGlzdCwKKy8vIHNldCB0aGlzIE9wRmxhZzoKKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX1JFU0VUX01DQVNUX0xJU1QgMHgyMDAwCisKKy8vCisvLyBFbmFibGUgdW5pY2FzdCBwYWNrZXQgcmVjZWl2aW5nLiAgUGFja2V0cyBzZW50IHRvIHRoZSBjdXJyZW50IHN0YXRpb24KKy8vIE1BQyBhZGRyZXNzIHdpbGwgYmUgcmVjZWl2ZWQuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9VTklDQVNUICAgICAgICAgIDB4MDAwMQorCisvLworLy8gRW5hYmxlIGJyb2FkY2FzdCBwYWNrZXQgcmVjZWl2aW5nLiAgUGFja2V0cyBzZW50IHRvIHRoZSBicm9hZGNhc3QgCisvLyBNQUMgYWRkcmVzcyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfQlJPQURDQVNUICAgICAgICAweDAwMDIKKworLy8KKy8vIEVuYWJsZSBmaWx0ZXJlZCBtdWx0aWNhc3QgcGFja2V0IHJlY2VpdmluZy4gIFBhY2tldHMgc2VudCB0byBhbnkKKy8vIG9mIHRoZSBtdWx0aWNhc3QgTUFDIGFkZHJlc3NlcyBpbiB0aGUgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZpbHRlcgorLy8gbGlzdCB3aWxsIGJlIHJlY2VpdmVkLiAgSWYgdGhlIGZpbHRlciBsaXN0IGlzIGVtcHR5LCBubyBtdWx0aWNhc3QKKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX0ZJTFRFUkVEX01VTFRJQ0FTVCAgIDB4MDAwNAorCisvLworLy8gRW5hYmxlIHByb21pc2N1b3VzIHBhY2tldCByZWNlaXZpbmcuICBBbGwgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfUFJPTUlTQ1VPVVMgICAgICAweDAwMDgKKworLy8KKy8vIEVuYWJsZSBwcm9taXNjdW91cyBtdWx0aWNhc3QgcGFja2V0IHJlY2VpdmluZy4gIEFsbCBtdWx0aWNhc3QKKy8vIHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX0FMTF9NVUxUSUNBU1QgICAgICAgIDB4MDAxMAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFN0YXRpb24gQWRkcmVzcworLy8KKworI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSU9OX0FERFJFU1NfUkVBRCAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSU9OX0FERFJFU1NfUkVTRVQgICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFN0YXRpc3RpY3MKKy8vCisKKyNkZWZpbmUgUFhFX09QRkxBR1NfU1RBVElTVElDU19SRUFEICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSVNUSUNTX1JFU0VUICAgICAgICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIE1DYXN0IElQIHRvIE1BQworLy8KKworLy8KKy8vIElkZW50aWZ5IHRoZSB0eXBlIG9mIElQIGFkZHJlc3MgaW4gdGhlIENQQi4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX01DQVNUX0lQX1RPX01BQ19PUE1BU0sgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFBYRV9PUEZMQUdTX01DQVNUX0lQVjRfVE9fTUFDICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfTUNBU1RfSVBWNl9UT19NQUMgICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIE52RGF0YQorLy8KKworLy8KKy8vIFNlbGVjdCB0aGUgdHlwZSBvZiBub24tdm9sYXRpbGUgZGF0YSBvcGVyYXRpb24uCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19OVkRBVEFfT1BNQVNLICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX05WREFUQV9SRUFEICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19OVkRBVEFfV1JJVEUgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IFN0YXR1cworLy8KKworLy8KKy8vIFJldHVybiBjdXJyZW50IGludGVycnVwdCBzdGF0dXMuICBUaGlzIHdpbGwgYWxzbyBjbGVhciBhbnkgaW50ZXJydXB0cworLy8gdGhhdCBhcmUgY3VycmVudGx5IHNldC4gIFRoaXMgY2FuIGJlIHVzZWQgaW4gYSBwb2xsaW5nIHJvdXRpbmUuICBUaGUKKy8vIGludGVycnVwdCBmbGFncyBhcmUgc3RpbGwgc2V0IGFuZCBjbGVhcmVkIGV2ZW4gd2hlbiB0aGUgaW50ZXJydXB0cworLy8gYXJlIGRpc2FibGVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfR0VUX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAweDAwMDEKKworLy8KKy8vIFJldHVybiBsaXN0IG9mIHRyYW5zbWl0dGVkIGJ1ZmZlcnMgZm9yIHJlY3ljbGluZy4gIFRyYW5zbWl0IGJ1ZmZlcnMKKy8vIG11c3Qgbm90IGJlIGNoYW5nZWQgb3IgdW5hbGxvY2F0ZWQgdW50aWwgdGhleSBoYXZlIHJlY3ljbGVkLiAgQWZ0ZXIKKy8vIGlzc3VpbmcgYSB0cmFuc21pdCBjb21tYW5kLCB3YWl0IGZvciBhIHRyYW5zbWl0IGNvbXBsZXRlIGludGVycnVwdC4KKy8vIFdoZW4gYSB0cmFuc21pdCBjb21wbGV0ZSBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQsIHJlYWQgdGhlIHRyYW5zbWl0dGVkCisvLyBidWZmZXJzLiAgRG8gbm90IHBsYW4gb24gZ2V0dGluZyBvbmUgYnVmZmVyIHBlciBpbnRlcnJ1cHQuICBTb21lCisvLyBOSUNzIGFuZCBVTkRJcyBtYXkgdHJhbnNtaXQgbXVsdGlwbGUgYnVmZmVycyBwZXIgaW50ZXJydXB0LgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfR0VUX1RSQU5TTUlUVEVEX0JVRkZFUlMgICAgICAgICAweDAwMDIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBGaWxsIEhlYWRlcgorLy8KKworI2RlZmluZSBQWEVfT1BGTEFHU19GSUxMX0hFQURFUl9PUE1BU0sgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX0ZJTExfSEVBREVSX0ZSQUdNRU5URUQgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX0ZJTExfSEVBREVSX1dIT0xFICAgICAgICAgICAweDAwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBUcmFuc21pdAorLy8KKworLy8KKy8vIFMvVyBVTkRJIG9ubHkuICBSZXR1cm4gYWZ0ZXIgdGhlIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZC4gIEEKKy8vIHRyYW5zbWl0IGNvbXBsZXRlIGludGVycnVwdCB3aWxsIHN0aWxsIGJlIGdlbmVyYXRlZCBhbmQgdGhlIHRyYW5zbWl0CisvLyBidWZmZXIgd2lsbCBoYXZlIHRvIGJlIHJlY3ljbGVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfU1dVTkRJX1RSQU5TTUlUX09QTUFTSyAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX09QRkxBR1NfVFJBTlNNSVRfQkxPQ0sgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19UUkFOU01JVF9ET05UX0JMT0NLICAgICAgICAgMHgwMDAwCisKKy8vCisvLworLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfVFJBTlNNSVRfT1BNQVNLICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQWEVfT1BGTEFHU19UUkFOU01JVF9GUkFHTUVOVEVEICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBYRV9PUEZMQUdTX1RSQU5TTUlUX1dIT0xFICAgICAgICAgICAgICAweDAwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBSZWNlaXZlCisvLworCisvLyBObyBPcEZsYWdzCisKK3R5cGVkZWYgUFhFX1VJTlQxNiBQWEVfU1RBVEZMQUdTOworCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5JVElBTElaRSAgICAgICAgICAgICAgICAweDAwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tbW9uIFN0YXRGbGFncyB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSBhbGwgY29tbWFuZHMuCisvLworCisvLworLy8gVGhlIENPTU1BTkRfQ09NUExFVEUgYW5kIENPTU1BTkRfRkFJTEVEIHN0YXR1cyBmbGFncyBtdXN0IGJlCisvLyBpbXBsZW1lbnRlZCBieSBhbGwgVU5ESXMuICBDT01NQU5EX1FVRVVFRCBpcyBvbmx5IG5lZWRlZCBieSBVTkRJcworLy8gdGhhdCBzdXBwb3J0IGNvbW1hbmQgcXVldWluZy4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfU1RBVFVTX01BU0sgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19DT01NQU5EX0NPTVBMRVRFICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NPTU1BTkRfRkFJTEVEICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NPTU1BTkRfUVVFVUVEICAgICAgICAgICAgICAgIDB4NDAwMAorLy8jZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5JVElBTElaRSAgICAgICAgICAgICAgMHgwMDAwCisKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19EQl9XUklURV9UUlVOQ0FURUQgICAgICAgICAgICAweDIwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBHZXQgU3RhdGUKKy8vCisKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVEVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVEVfSU5JVElBTElaRUQgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVEVfU1RBUlRFRCAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFURV9TVE9QUEVEICAgICAgICAgMHgwMDAwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU3RhcnQKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IEluaXQgSW5mbworLy8KKworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NBQkxFX0RFVEVDVF9NQVNLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NBQkxFX0RFVEVDVF9OT1RfU1VQUE9SVEVEIDB4MDAwMAorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NBQkxFX0RFVEVDVF9TVVBQT1JURUQgICAgIDB4MDAwMQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgSW5pdGlhbGl6ZQorLy8KKworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOSVRJQUxJWkVEX05PX01FRElBICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFJlc2V0CisvLworCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVTRVRfTk9fTUVESUEgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU2h1dGRvd24KKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgSW50ZXJydXB0IEVuYWJsZXMKKy8vCisKKy8vCisvLyBJZiBzZXQsIHJlY2VpdmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5URVJSVVBUX1JFQ0VJVkUgICAgICAgICAweDAwMDEKKworLy8KKy8vIElmIHNldCwgdHJhbnNtaXQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5URVJSVVBUX1RSQU5TTUlUICAgICAgICAgICAgMHgwMDAyCisKKy8vCisvLyBJZiBzZXQsIGNvbW1hbmQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfSU5URVJSVVBUX0NPTU1BTkQgICAgICAgICAweDAwMDQKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFJlY2VpdmUgRmlsdGVycworLy8KKworLy8KKy8vIElmIHNldCwgdW5pY2FzdCBwYWNrZXRzIHdpbGwgYmUgcmVjZWl2ZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX1JFQ0VJVkVfRklMVEVSX1VOSUNBU1QgICAgICAgIDB4MDAwMQorCisvLworLy8gSWYgc2V0LCBicm9hZGNhc3QgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19SRUNFSVZFX0ZJTFRFUl9CUk9BRENBU1QgICAgICAweDAwMDIKKworLy8KKy8vIElmIHNldCwgbXVsdGljYXN0IHBhY2tldHMgdGhhdCBtYXRjaCB1cCB3aXRoIHRoZSBtdWx0aWNhc3QgYWRkcmVzcworLy8gZmlsdGVyIGxpc3Qgd2lsbCBiZSByZWNlaXZlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVDRUlWRV9GSUxURVJfRklMVEVSRURfTVVMVElDQVNUIDB4MDAwNAorCisvLworLy8gSWYgc2V0LCBhbGwgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19SRUNFSVZFX0ZJTFRFUl9QUk9NSVNDVU9VUyAgICAgICAgMHgwMDA4CisKKy8vCisvLyBJZiBzZXQsIGFsbCBtdWx0aWNhc3QgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19SRUNFSVZFX0ZJTFRFUl9BTExfTVVMVElDQVNUICAweDAwMTAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBTdGF0aW9uIEFkZHJlc3MKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU3RhdGlzdGljcworLy8KKworLy8gTm8gYWRkaXRpb25hbCBTdGF0RmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBNQ2FzdCBJUCB0byBNQUMKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgTnZEYXRhCisvLworCisvLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IFN0YXR1cworLy8KKworLy8KKy8vIFVzZSB0byBkZXRlcm1pbmUgaWYgYW4gaW50ZXJydXB0IGhhcyBvY2N1cnJlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19JTlRFUlJVUFRfTUFTSyAgICAgMHgwMDBGCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19OT19JTlRFUlJVUFRTICAgICAgMHgwMDAwCisKKy8vCisvLyBJZiBzZXQsIGF0IGxlYXN0IG9uZSByZWNlaXZlIGludGVycnVwdCBvY2N1cnJlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19SRUNFSVZFICAgICAgICAgICAgMHgwMDAxCisKKy8vCisvLyBJZiBzZXQsIGF0IGxlYXN0IG9uZSB0cmFuc21pdCBpbnRlcnJ1cHQgb2NjdXJyZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfVFJBTlNNSVQgICAgICAgICAgIDB4MDAwMgorCisvLworLy8gSWYgc2V0LCBhdCBsZWFzdCBvbmUgY29tbWFuZCBpbnRlcnJ1cHQgb2NjdXJyZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfQ09NTUFORCAgICAgICAgICAgIDB4MDAwNAorCisvLworLy8gSWYgc2V0LCBhdCBsZWFzdCBvbmUgc29mdHdhcmUgaW50ZXJydXB0IG9jY3VycmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVFVTX1NPRlRXQVJFICAgICAgICAgICAweDAwMDgKKworLy8KKy8vIFRoaXMgZmxhZyBpcyBzZXQgaWYgdGhlIHRyYW5zbWl0dGVkIGJ1ZmZlciBxdWV1ZSBpcyBlbXB0eS4gIFRoaXMgZmxhZworLy8gd2lsbCBiZSBzZXQgaWYgYWxsIHRyYW5zbWl0dGVkIGJ1ZmZlciBhZGRyZXNzZXMgZ2V0IHdyaXR0ZW4gaW50byB0aGUgREIuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfVFhCVUZfUVVFVUVfRU1QVFkgIDB4MDAxMAorCisvLworLy8gVGhpcyBmbGFnIGlzIHNldCBpZiBubyB0cmFuc21pdHRlZCBidWZmZXIgYWRkcmVzc2VzIHdlcmUgd3JpdHRlbgorLy8gaW50byB0aGUgREIuICAoVGhpcyBjb3VsZCBiZSBiZWNhdXNlIERCc2l6ZSB3YXMgdG9vIHNtYWxsLikKKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19OT19UWEJVRlNfV1JJVFRFTiAgMHgwMDIwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgRmlsbCBIZWFkZXIKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgVHJhbnNtaXQKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFJlY2VpdmUKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzLgorCit0eXBlZGVmIFBYRV9VSU5UMTYgUFhFX1NUQVRDT0RFOworCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JTklUSUFMSVpFICAgICAgICAgICAgIDB4MDAwMAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb21tb24gU3RhdENvZGVzIHJldHVybmVkIGJ5IGFsbCBVTkRJIGNvbW1hbmRzLCBVTkRJIHByb3RvY29sIGZ1bmN0aW9ucworLy8gYW5kIEJDIHByb3RvY29sIGZ1bmN0aW9ucy4KKy8vCisKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JTlZBTElEX0NEQiAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lOVkFMSURfQ1BCICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQWEVfU1RBVENPREVfQlVTWSAgICAgICAgICAgICAgICAgICAJMHgwMDAzCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9RVUVVRV9GVUxMICAgICAgICAgICAgIAkweDAwMDQKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0FMUkVBRFlfU1RBUlRFRCAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBQWEVfU1RBVENPREVfTk9UX1NUQVJURUQgICAgICAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIFBYRV9TVEFUQ09ERV9OT1RfU0hVVERPV04gICAgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0FMUkVBRFlfSU5JVElBTElaRUQgICAgICAgIDB4MDAwOAorI2RlZmluZSBQWEVfU1RBVENPREVfTk9UX0lOSVRJQUxJWkVEICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIFBYRV9TVEFUQ09ERV9ERVZJQ0VfRkFJTFVSRSAgICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX05WREFUQV9GQUlMVVJFICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBQWEVfU1RBVENPREVfVU5TVVBQT1JURUQgICAgICAgICAgICAgICAgMHgwMDBDCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9CVUZGRVJfRlVMTCAgICAgICAgICAgICAgICAweDAwMEQKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lOVkFMSURfUEFSQU1FVEVSCQkweDAwMEUKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lOVkFMSURfVU5ESQkJMHgwMDBGCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JUFY0X05PVF9TVVBQT1JURUQJCTB4MDAxMAorI2RlZmluZSBQWEVfU1RBVENPREVfSVBWNl9OT1RfU1VQUE9SVEVECQkweDAwMTEKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX05PVF9FTk9VR0hfTUVNT1JZCQkweDAwMTIKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX05PX0RBVEEJCQkweDAwMTMKKworCit0eXBlZGVmIFBYRV9VSU5UMTYgUFhFX0lGTlVNOworCisvLworLy8gVGhpcyBpbnRlcmZhY2UgbnVtYmVyIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBTL1cgVU5ESSBTdGFydCBjb21tYW5kLgorLy8KKyNkZWZpbmUgUFhFX0lGTlVNX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisKKy8vCisvLyBUaGlzIGludGVyZmFjZSBudW1iZXIgaXMgcmV0dXJuZWQgYnkgdGhlIFMvVyBVTkRJIEdldCBTdGF0ZSBhbmQKKy8vIFN0YXJ0IGNvbW1hbmRzIGlmIGluZm9ybWF0aW9uIGluIHRoZSBDREIsIENQQiBvciBEQiBpcyBpbnZhbGlkLgorLy8KKyNkZWZpbmUgUFhFX0lGTlVNX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwCisKK3R5cGVkZWYgUFhFX1VJTlQxNiBQWEVfQ09OVFJPTDsKKworLy8KKy8vIFNldHRpbmcgdGhpcyBmbGFnIGRpcmVjdHMgdGhlIFVOREkgdG8gcXVldWUgdGhpcyBjb21tYW5kIGZvciBsYXRlcgorLy8gZXhlY3V0aW9uIGlmIHRoZSBVTkRJIGlzIGJ1c3kgYW5kIGl0IHN1cHBvcnRzIGNvbW1hbmQgcXVldWluZy4KKy8vIElmIHF1ZXVpbmcgaXMgbm90IHN1cHBvcnRlZCwgYSBQWEVfU1RBVENPREVfSU5WQUxJRF9DT05UUk9MIGVycm9yCisvLyBpcyByZXR1cm5lZC4gIElmIHRoZSBxdWV1ZSBpcyBmdWxsLCBhIFBYRV9TVEFUQ09ERV9DREJfUVVFVUVfRlVMTCAKKy8vIGVycm9yIGlzIHJldHVybmVkLgorLy8KKyNkZWZpbmUgUFhFX0NPTlRST0xfUVVFVUVfSUZfQlVTWSAgICAgICAgICAgICAgIDB4MDAwMgorCisvLworLy8gVGhlc2UgdHdvIGJpdCB2YWx1ZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBtb3JlIFVOREkKKy8vIENEQiBzdHJ1Y3R1cmVzIGZvbGxvd2luZyB0aGlzIG9uZS4gIElmIHRoZSBsaW5rIGJpdCBpcyBzZXQsIHRoZXJlCisvLyBtdXN0IGJlIGEgQ0RCIHN0cnVjdHVyZSBmb2xsb3dpbmcgdGhpcyBvbmUuICBFeGVjdXRpb24gd2lsbCBzdGFydAorLy8gb24gdGhlIG5leHQgQ0RCIHN0cnVjdHVyZSBhcyBzb29uIGFzIHRoaXMgb25lIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuCisvLyBJZiBhbiBlcnJvciBpcyBnZW5lcmF0ZWQgYnkgdGhpcyBjb21tYW5kLCBleGVjdXRpb24gd2lsbCBzdG9wLgorLy8KKyNkZWZpbmUgUFhFX0NPTlRST0xfTElOSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9DT05UUk9MX0xBU1RfQ0RCX0lOX0xJU1QgICAgICAgICAgICAgICAgMHgwMDAwCisKK3R5cGVkZWYgUFhFX1VJTlQ4IFBYRV9GUkFNRV9UWVBFOworCisjZGVmaW5lIFBYRV9GUkFNRV9UWVBFX05PTkUgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUFhFX0ZSQU1FX1RZUEVfVU5JQ0FTVCAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9CUk9BRENBU1QgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9NVUxUSUNBU1QgICAgICAgICAgICAweDAzCisjZGVmaW5lIFBYRV9GUkFNRV9UWVBFX1BST01JU0NVT1VTICAgICAgICAgICAgICAweDA0CisKK3R5cGVkZWYgUFhFX1VJTlQzMiBQWEVfSVBWNDsKKwordHlwZWRlZiBQWEVfVUlOVDMyIFBYRV9JUFY2WzRdOworI2RlZmluZSBQWEVfTUFDX0xFTkdUSCAzMgorCit0eXBlZGVmIFBYRV9VSU5UOCBQWEVfTUFDX0FERFJbUFhFX01BQ19MRU5HVEhdOworCit0eXBlZGVmIFBYRV9VSU5UOCBQWEVfSUZUWVBFOwordHlwZWRlZiBQWEVfVUlOVDE2IFBYRV9NRURJQV9QUk9UT0NPTDsKKworLy8KKy8vIFRoaXMgaW5mb3JtYXRpb24gaXMgZnJvbSB0aGUgQVJQIHNlY3Rpb24gb2YgUkZDIDE3MDAuCisvLworLy8gICAgIDEgRXRoZXJuZXQgKDEwTWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0pCUF0KKy8vICAgICAyIEV4cGVyaW1lbnRhbCBFdGhlcm5ldCAoM01iKSAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAgMyBBbWF0ZXVyIFJhZGlvIEFYLjI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUFhLXQorLy8gICAgIDQgUHJvdGVvbiBQcm9ORVQgVG9rZW4gUmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgW0pCUF0KKy8vICAgICA1IENoYW9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHWFBdCisvLyAgICAgNiBJRUVFIDgwMiBOZXR3b3JrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSkJQXQorLy8gICAgIDcgQVJDTkVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0pCUF0KKy8vICAgICA4IEh5cGVyY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAgOSBMYW5zdGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1RVXQorLy8gICAgMTAgQXV0b25ldCBTaG9ydCBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTVhCMV0KKy8vICAgIDExIExvY2FsVGFsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0pLUjFdCisvLyAgICAxMiBMb2NhbE5ldCAoSUJNIFBDTmV0IG9yIFNZVEVLIExvY2FsTkVUKSAgICAgICAgICAgICBbSlhNXQorLy8gICAgMTMgVWx0cmEgbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUlhEMl0KKy8vICAgIDE0IFNNRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0dYQzFdCisvLyAgICAxNSBGcmFtZSBSZWxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUdNXQorLy8gICAgMTYgQXN5bmNocm9ub3VzIFRyYW5zbWlzc2lvbiBNb2RlIChBVE0pICAgICAgICAgICAgICBbSlhCMl0KKy8vICAgIDE3IEhETEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAxOCBGaWJyZSBDaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtZYWtvdiBSZWtodGVyXQorLy8gICAgMTkgQXN5bmNocm9ub3VzIFRyYW5zbWlzc2lvbiBNb2RlIChBVE0pICAgICAgW01hcmsgTGF1YmFjaF0KKy8vICAgIDIwIFNlcmlhbCBMaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAyMSBBc3luY2hyb25vdXMgVHJhbnNtaXNzaW9uIE1vZGUgKEFUTSkgICAgICAgICAgICAgIFtNWEIxXQorLy8KKworI2RlZmluZSBQWEVfSUZUWVBFX0VUSEVSTkVUICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFBYRV9JRlRZUEVfVE9LRU5SSU5HICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFBYRV9JRlRZUEVfRklCUkVfQ0hBTk5FTCAgICAgICAgICAgICAgICAweDEyCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2h3X3VuZGkgeworUFhFX1VJTlQzMiBTaWduYXR1cmU7ICAgICAgIC8vIFBYRV9ST01JRF9TSUdOQVRVUkUKK1BYRV9VSU5UOCBMZW47ICAgICAgICAgIC8vIHNpemVvZihQWEVfSFdfVU5ESSkKK1BYRV9VSU5UOCBGdWRnZTsgICAgICAgICAgICAvLyBtYWtlcyA4LWJpdCBja3N1bSBlcXVhbCB6ZXJvCitQWEVfVUlOVDggUmV2OyAgICAgICAgICAvLyBQWEVfUk9NSURfUkVWCitQWEVfVUlOVDggSUZjbnQ7ICAgICAgICAgICAgLy8gcGh5c2ljYWwgY29ubmVjdG9yIGNvdW50CitQWEVfVUlOVDggTWFqb3JWZXI7ICAgICAgICAgLy8gUFhFX1JPTUlEX01BSk9SVkVSCitQWEVfVUlOVDggTWlub3JWZXI7ICAgICAgICAgLy8gUFhFX1JPTUlEX01JTk9SVkVSCitQWEVfVUlOVDE2IHJlc2VydmVkOyAgICAgICAgLy8gemVybywgbm90IHVzZWQKK1BYRV9VSU5UMzIgSW1wbGVtZW50YXRpb247ICAgICAgLy8gaW1wbGVtZW50YXRpb24gZmxhZ3MKKy8vIHJlc2VydmVkICAgICAgICAgICAgIC8vIHZlbmRvciB1c2UKKy8vIFBYRV9VSU5UMzIgU3RhdHVzOyAgICAgICAvLyBzdGF0dXMgcG9ydAorLy8gUFhFX1VJTlQzMiBDb21tYW5kOyAgICAgIC8vIGNvbW1hbmQgcG9ydAorLy8gUFhFX1VJTlQ2NCBDREJhZGRyOyAgICAgIC8vIENEQiBhZGRyZXNzIHBvcnQKK30gUFhFX0hXX1VOREk7CisKKy8vCisvLyBTdGF0dXMgcG9ydCBiaXQgZGVmaW5pdGlvbnMKKy8vCisKKy8vCisvLyBVTkRJIG9wZXJhdGlvbiBzdGF0ZQorLy8KKyNkZWZpbmUgUFhFX0hXU1RBVF9TVEFURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4QzAwMDAwMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9CVVNZICAgICAgICAgICAgICAgICAgICAgMHhDMDAwMDAwMAorI2RlZmluZSBQWEVfSFdTVEFUX0lOSVRJQUxJWkVEICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFBYRV9IV1NUQVRfU1RBUlRFRCAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9TVE9QUEVEICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorCisvLworLy8gSWYgc2V0LCBsYXN0IGNvbW1hbmQgZmFpbGVkCisvLworI2RlZmluZSBQWEVfSFdTVEFUX0NPTU1BTkRfRkFJTEVEICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorCisvLworLy8gSWYgc2V0LCBpZGVudGlmaWVzIGVuYWJsZWQgcmVjZWl2ZSBmaWx0ZXJzCisvLworI2RlZmluZSBQWEVfSFdTVEFUX1BST01JU0NVT1VTX01VTFRJQ0FTVF9SWF9FTkFCTEVEIDB4MDAwMDEwMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9QUk9NSVNDVU9VU19SWF9FTkFCTEVEICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBYRV9IV1NUQVRfQlJPQURDQVNUX1JYX0VOQUJMRUQgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBYRV9IV1NUQVRfTVVMVElDQVNUX1JYX0VOQUJMRUQgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBYRV9IV1NUQVRfVU5JQ0FTVF9SWF9FTkFCTEVEICAgICAgICAgICAweDAwMDAwMTAwCisKKy8vCisvLyBJZiBzZXQsIGlkZW50aWZpZXMgZW5hYmxlZCBleHRlcm5hbCBpbnRlcnJ1cHRzCisvLworI2RlZmluZSBQWEVfSFdTVEFUX1NPRlRXQVJFX0lOVF9FTkFCTEVEICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBQWEVfSFdTVEFUX1RYX0NPTVBMRVRFX0lOVF9FTkFCTEVEICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9QQUNLRVRfUlhfSU5UX0VOQUJMRUQgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFBYRV9IV1NUQVRfQ01EX0NPTVBMRVRFX0lOVF9FTkFCTEVEICAgICAgICAgMHgwMDAwMDAxMAorCisvLworLy8gSWYgc2V0LCBpZGVudGlmaWVzIHBlbmRpbmcgaW50ZXJydXB0cworLy8KKyNkZWZpbmUgUFhFX0hXU1RBVF9TT0ZUV0FSRV9JTlRfUEVORElORyAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUFhFX0hXU1RBVF9UWF9DT01QTEVURV9JTlRfUEVORElORyAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBYRV9IV1NUQVRfUEFDS0VUX1JYX0lOVF9QRU5ESU5HICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQWEVfSFdTVEFUX0NNRF9DT01QTEVURV9JTlRfUEVORElORyAgICAgICAgIDB4MDAwMDAwMDEKKworLy8KKy8vIENvbW1hbmQgcG9ydCBkZWZpbml0aW9ucworLy8KKworLy8KKy8vIElmIHNldCwgQ0RCIGlkZW50aWZpZWQgaW4gQ0RCYWRkciBwb3J0IGlzIGdpdmVuIHRvIFVOREkuCisvLyBJZiBub3Qgc2V0LCBvdGhlciBiaXRzIGluIHRoaXMgd29yZCB3aWxsIGJlIHByb2Nlc3NlZC4KKy8vCisjZGVmaW5lIFBYRV9IV0NNRF9JU1NVRV9DT01NQU5EICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgUFhFX0hXQ01EX0lOVFNfQU5EX0ZJTFRTICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKworLy8KKy8vIFVzZSB0aGVzZSB0byBlbmFibGUvZGlzYWJsZSByZWNlaXZlIGZpbHRlcnMuCisvLworI2RlZmluZSBQWEVfSFdDTURfUFJPTUlTQ1VPVVNfTVVMVElDQVNUX1JYX0VOQUJMRSAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFBYRV9IV0NNRF9QUk9NSVNDVU9VU19SWF9FTkFCTEUgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBYRV9IV0NNRF9CUk9BRENBU1RfUlhfRU5BQkxFICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBYRV9IV0NNRF9NVUxUSUNBU1RfUlhfRU5BQkxFICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBYRV9IV0NNRF9VTklDQVNUX1JYX0VOQUJMRSAgICAgICAgICAgICAweDAwMDAwMTAwCisKKy8vCisvLyBVc2UgdGhlc2UgdG8gZW5hYmxlL2Rpc2FibGUgZXh0ZXJuYWwgaW50ZXJydXB0cworLy8KKyNkZWZpbmUgUFhFX0hXQ01EX1NPRlRXQVJFX0lOVF9FTkFCTEUgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUFhFX0hXQ01EX1RYX0NPTVBMRVRFX0lOVF9FTkFCTEUgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFBYRV9IV0NNRF9QQUNLRVRfUlhfSU5UX0VOQUJMRSAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFBYRV9IV0NNRF9DTURfQ09NUExFVEVfSU5UX0VOQUJMRSAgICAgICAgICAgMHgwMDAwMDAxMAorCisvLworLy8gVXNlIHRoZXNlIHRvIGNsZWFyIHBlbmRpbmcgZXh0ZXJuYWwgaW50ZXJydXB0cworLy8KKyNkZWZpbmUgUFhFX0hXQ01EX0NMRUFSX1NPRlRXQVJFX0lOVCAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBYRV9IV0NNRF9DTEVBUl9UWF9DT01QTEVURV9JTlQgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBYRV9IV0NNRF9DTEVBUl9QQUNLRVRfUlhfSU5UICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFBYRV9IV0NNRF9DTEVBUl9DTURfQ09NUExFVEVfSU5UICAgICAgICAgICAgMHgwMDAwMDAwMQorCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9zd191bmRpIHsKK1BYRV9VSU5UMzIgU2lnbmF0dXJlOyAgICAgICAvLyBQWEVfUk9NSURfU0lHTkFUVVJFCitQWEVfVUlOVDggTGVuOyAgICAgICAgICAvLyBzaXplb2YoUFhFX1NXX1VOREkpCitQWEVfVUlOVDggRnVkZ2U7ICAgICAgICAgICAgLy8gbWFrZXMgOC1iaXQgY2tzdW0gemVybworUFhFX1VJTlQ4IFJldjsgICAgICAgICAgLy8gUFhFX1JPTUlEX1JFVgorUFhFX1VJTlQ4IElGY250OyAgICAgICAgICAgIC8vIHBoeXNpY2FsIGNvbm5lY3RvciBjb3VudAorUFhFX1VJTlQ4IE1ham9yVmVyOyAgICAgICAgIC8vIFBYRV9ST01JRF9NQUpPUlZFUgorUFhFX1VJTlQ4IE1pbm9yVmVyOyAgICAgICAgIC8vIFBYRV9ST01JRF9NSU5PUlZFUgorUFhFX1VJTlQxNiByZXNlcnZlZDE7ICAgICAgIC8vIHplcm8sIG5vdCB1c2VkCitQWEVfVUlOVDMyIEltcGxlbWVudGF0aW9uOyAgICAgIC8vIEltcGxlbWVudGF0aW9uIGZsYWdzCitQWEVfVUlOVDY0IEVudHJ5UG9pbnQ7ICAgICAgLy8gQVBJIGVudHJ5IHBvaW50CitQWEVfVUlOVDggcmVzZXJ2ZWQyWzNdOyAgICAgLy8gemVybywgbm90IHVzZWQKK1BYRV9VSU5UOCBCdXNDbnQ7ICAgICAgICAgICAvLyBudW1iZXIgb2YgYnVzdHlwZXMgc3VwcG9ydGVkCitQWEVfVUlOVDMyIEJ1c1R5cGVbMV07ICAgICAgLy8gbGlzdCBvZiBzdXBwb3J0ZWQgYnVzdHlwZXMKK30gUFhFX1NXX1VOREk7CisKK3R5cGVkZWYgdW5pb24gdV9weGVfdW5kaSB7CitQWEVfSFdfVU5ESSBodzsKK1BYRV9TV19VTkRJIHN3OworfSBQWEVfVU5ESTsKKworLy8KKy8vIFNpZ25hdHVyZSBvZiAhUFhFIHN0cnVjdHVyZQorLy8KKyNkZWZpbmUgUFhFX1JPTUlEX1NJR05BVFVSRSAgICAgUFhFX0JVU1RZUEUoJyEnLCAnUCcsICdYJywgJ0UnKQorCisvLworLy8gIVBYRSBzdHJ1Y3R1cmUgZm9ybWF0IHJldmlzaW9uCisvLworI2RlZmluZSBQWEVfUk9NSURfUkVWICAgICAgICAgICAgICAgICAgICAgICAweDAyCisKKy8vCisvLyBVTkRJIGNvbW1hbmQgaW50ZXJmYWNlIHJldmlzaW9uLiAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdCBnZXQgc2VudAorLy8gaW4gb3B0aW9uIDk0IChDbGllbnQgTmV0d29yayBJbnRlcmZhY2UgSWRlbnRpZmllcikgaW4gdGhlIERIQ1AgRGlzY292ZXIKKy8vIGFuZCBQWEUgQm9vdCBTZXJ2ZXIgUmVxdWVzdCBwYWNrZXRzLgorLy8KKyNkZWZpbmUgUFhFX1JPTUlEX01BSk9SVkVSICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBQWEVfUk9NSURfTUlOT1JWRVIgICAgICAgICAgICAgICAgICAweDAwCisKKy8vCisvLyBJbXBsZW1lbnRhdGlvbiBmbGFncworLy8KKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9IV19VTkRJICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9TV19WSVJUX0FERFIgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF82NEJJVF9ERVZJQ0UgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9GUkFHX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfQ01EX0xJTktfU1VQUE9SVEVEICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX0NNRF9RVUVVRV9TVVBQT1JURUQgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9NVUxUSV9GUkFNRV9TVVBQT1JURUQgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTlZEQVRBX1NVUFBPUlRfTUFTSyAgICAgICAgICAgMHgwMDAwMEMwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX05WREFUQV9CVUxLX1dSSVRBQkxFICAgICAgICAgIDB4MDAwMDBDMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9OVkRBVEFfU1BBUlNFX1dSSVRBQkxFICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTlZEQVRBX1JFQURfT05MWSAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTlZEQVRBX05PVF9BVkFJTEFCTEUgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX1NUQVRJU1RJQ1NfU1VQUE9SVEVEICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9TVEFUSU9OX0FERFJfU0VUVEFCTEUgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfUFJPTUlTQ1VPVVNfTVVMVElDQVNUX1JYX1NVUFBPUlRFRCAgICAweDAwMDAwMDgwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfUFJPTUlTQ1VPVVNfUlhfU1VQUE9SVEVEICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBQWEVfUk9NSURfSU1QX0JST0FEQ0FTVF9SWF9TVVBQT1JURUQgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9GSUxURVJFRF9NVUxUSUNBU1RfUlhfU1VQUE9SVEVEICAgMHgwMDAwMDAxMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX1NPRlRXQVJFX0lOVF9TVVBQT1JURUQgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9UWF9DT01QTEVURV9JTlRfU1VQUE9SVEVEICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBYRV9ST01JRF9JTVBfUEFDS0VUX1JYX0lOVF9TVVBQT1JURUQgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQWEVfUk9NSURfSU1QX0NNRF9DT01QTEVURV9JTlRfU1VQUE9SVEVEICAgICAgICAweDAwMDAwMDAxCisKKyAKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NkYiB7CitQWEVfT1BDT0RFIE9wQ29kZTsKK1BYRV9PUEZMQUdTIE9wRmxhZ3M7CitQWEVfVUlOVDE2IENQQnNpemU7CitQWEVfVUlOVDE2IERCc2l6ZTsKK1VJTlQ2NCBDUEJhZGRyOworVUlOVDY0IERCYWRkcjsKK1BYRV9TVEFUQ09ERSBTdGF0Q29kZTsKK1BYRV9TVEFURkxBR1MgU3RhdEZsYWdzOworUFhFX1VJTlQxNiBJRm51bTsKK1BYRV9DT05UUk9MIENvbnRyb2w7Cit9IFBYRV9DREI7CisKKwordHlwZWRlZiB1bmlvbiB1X3B4ZV9pcF9hZGRyIHsKK1BYRV9JUFY2IElQdjY7CitQWEVfSVBWNCBJUHY0OworfSBQWEVfSVBfQUREUjsKKwordHlwZWRlZiB1bmlvbiBweGVfZGV2aWNlIHsKKy8vCisvLyBQQ0kgYW5kIFBDIENhcmQgTklDcyBhcmUgYm90aCBpZGVudGlmaWVkIHVzaW5nIGJ1cywgZGV2aWNlCisvLyBhbmQgZnVuY3Rpb24gbnVtYmVycy4gIEZvciBQQyBDYXJkLCB0aGlzIG1heSByZXF1aXJlIFBDCisvLyBDYXJkIHNlcnZpY2VzIHRvIGJlIGxvYWRlZCBpbiB0aGUgQklPUyBvciBwcmVib290CisvLyBlbnZpcm9ubWVudC4KKy8vCitzdHJ1Y3QgeworLy8KKy8vIFNlZSBTL1cgVU5ESSBST01JRCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgUENJIGFuZAorLy8gUENDIEJ1c1R5cGUgZGVmaW5pdGlvbnMuCisvLworUFhFX1VJTlQzMiBCdXNUeXBlOworCisvLworLy8gQnVzLCBkZXZpY2UgJiBmdW5jdGlvbiBudW1iZXJzIHRoYXQgbG9jYXRlIHRoaXMgZGV2aWNlLgorLy8KK1BYRV9VSU5UMTYgQnVzOworUFhFX1VJTlQ4IERldmljZTsKK1BYRV9VSU5UOCBGdW5jdGlvbjsKK30gUENJLCBQQ0M7CisKKy8vCisvLyAlJVRCRCAtIE1vcmUgaW5mb3JtYXRpb24gaXMgbmVlZGVkIGFib3V0IGVudW1lcmF0aW5nCisvLyBVU0IgYW5kIDEzOTQgZGV2aWNlcy4KKy8vCitzdHJ1Y3QgeworUFhFX1VJTlQzMiBCdXNUeXBlOworUFhFX1VJTlQzMiB0ZGI7Cit9IFVTQiwgXzEzOTQ7Cit9IFBYRV9ERVZJQ0U7CisKKy8vIGNwYiBhbmQgZGIgZGVmaW5pdGlvbnMKKworI2RlZmluZSBNQVhfUENJX0NPTkZJR19MRU4gNjQgICAvLyAjIG9mIGR3b3JkcworI2RlZmluZSBNQVhfRUVQUk9NX0xFTiAxMjggICAgICAgLy8gI29mIGR3b3JkcworI2RlZmluZSBNQVhfWE1JVF9CVUZGRVJTICAgIDMyICAvLyByZWN5Y2xpbmcgUSBsZW5ndGggZm9yIHhtaXRfZG9uZQorI2RlZmluZSBNQVhfTUNBU1RfQUREUkVTU19DTlQgOAorCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfc3RhcnQgeworICAgIC8vCisgICAgLy8gUFhFX1ZPSUQgRGVsYXkoUFhFX1VJTlQ2NCBtaWNyb3NlY29uZHMpOworICAgIC8vCisgICAgLy8gVU5ESSB3aWxsIG5ldmVyIHJlcXVlc3QgYSBkZWxheSBzbWFsbGVyIHRoYW4gMTAgbWljcm9zZWNvbmRzCisgICAgLy8gYW5kIHdpbGwgYWx3YXlzIHJlcXVlc3QgZGVsYXlzIGluIGluY3JlbWVudHMgb2YgMTAgbWljcm9zZWNvbmRzLgorICAgIC8vIFRoZSBEZWxheSgpIENhbGxCYWNrIHJvdXRpbmUgbXVzdCBkZWxheSBiZXR3ZWVuIG4gYW5kIG4gKyAxMCAKKyAgICAvLyBtaWNyb3NlY29uZHMgYmVmb3JlIHJldHVybmluZyBjb250cm9sIHRvIHRoZSBVTkRJLgorICAgIC8vCisgICAgLy8gVGhpcyBmaWVsZCBjYW5ub3QgYmUgc2V0IHRvIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IERlbGF5OworCisgICAgLy8KKyAgICAvLyBQWEVfVk9JRCBCbG9jayhQWEVfVUlOVDMyIGVuYWJsZSk7CisgICAgLy8KKyAgICAvLyBVTkRJIG1heSBuZWVkIHRvIGJsb2NrIG11bHRpLXRocmVhZGVkL211bHRpLXByb2Nlc3NvciBhY2Nlc3MgdG8KKyAgICAvLyBjcml0aWNhbCBjb2RlIHNlY3Rpb25zIHdoZW4gcHJvZ3JhbW1pbmcgb3IgYWNjZXNzaW5nIHRoZSBuZXR3b3JrCisgICAgLy8gZGV2aWNlLiAgVG8gdGhpcyBlbmQsIGEgYmxvY2tpbmcgc2VydmljZSBpcyBuZWVkZWQgYnkgdGhlIFVOREkuCisgICAgLy8gV2hlbiBVTkRJIG5lZWRzIGEgYmxvY2ssIGl0IHdpbGwgY2FsbCBCbG9jaygpIHBhc3NpbmcgYSBub24temVybworICAgIC8vIHZhbHVlLiAgV2hlbiBVTkRJIG5vIGxvbmdlciBuZWVkcyBhIGJsb2NrLCBpdCB3aWxsIGNhbGwgQmxvY2soKQorICAgIC8vIHdpdGggYSB6ZXJvIHZhbHVlLiAgV2hlbiBjYWxsZWQsIGlmIHRoZSBCbG9jaygpIGlzIGFscmVhZHkgZW5hYmxlZCwKKyAgICAvLyBkbyBub3QgcmV0dXJuIGNvbnRyb2wgdG8gdGhlIFVOREkgdW50aWwgdGhlIHByZXZpb3VzIEJsb2NrKCkgaXMKKyAgICAvLyBkaXNhYmxlZC4KKyAgICAvLworICAgIC8vIFRoaXMgZmllbGQgY2Fubm90IGJlIHNldCB0byB6ZXJvLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBCbG9jazsKKworICAgIC8vCisgICAgLy8gUFhFX1ZPSUQgVmlydDJQaHlzKFBYRV9VSU5UNjQgdmlydHVhbCwgUFhFX1VJTlQ2NCBwaHlzaWNhbF9wdHIpOworICAgIC8vCisgICAgLy8gVU5ESSB3aWxsIHBhc3MgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiBhIGJ1ZmZlciBhbmQgdGhlIHZpcnR1YWwKKyAgICAvLyBhZGRyZXNzIG9mIGEgNjQtYml0IHBoeXNpY2FsIGJ1ZmZlci4gIENvbnZlcnQgdGhlIHZpcnR1YWwgYWRkcmVzcworICAgIC8vIHRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgcGh5c2ljYWwgYWRkcmVzcworICAgIC8vIGJ1ZmZlci4gIElmIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUgdGhlIHNhbWUsIGp1c3QKKyAgICAvLyBjb3B5IHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gdGhlIHBoeXNpY2FsIGFkZHJlc3MgYnVmZmVyLgorICAgIC8vCisgICAgLy8gVGhpcyBmaWVsZCBjYW4gYmUgc2V0IHRvIHplcm8gaWYgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzIAorICAgIC8vIGFyZSBlcXVhbC4KKyAgICAvLworICAgIFBYRV9VSU5UNjQgVmlydDJQaHlzOworICAgIC8vCisgICAgLy8gUFhFX1ZPSUQgTWVtX0lPKFBYRV9VSU5UOCByZWFkX3dyaXRlLCBQWEVfVUlOVDggbGVuLCBQWEVfVUlOVDY0IHBvcnQsIAorICAgIC8vICAgICAgICAgICAgICBQWEVfVUlOVDY0IGJ1Zl9hZGRyKTsKKyAgICAvLworICAgIC8vIFVOREkgd2lsbCByZWFkIG9yIHdyaXRlIHRoZSBkZXZpY2UgaW8gc3BhY2UgdXNpbmcgdGhpcyBjYWxsIGJhY2sgCisgICAgLy8gZnVuY3Rpb24uIEl0IHBhc3NlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFzIHRoZSBsZW4gcGFyYW1ldGVyIGFuZCBpdCAKKyAgICAvLyB3aWxsIGJlIGVpdGhlciAxLDIsNCBvciA4LgorICAgIC8vCisgICAgLy8gVGhpcyBmaWVsZCBjYW4gbm90IGJlIHNldCB0byB6ZXJvLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBNZW1fSU87Cit9IFBYRV9DUEJfU1RBUlQ7CisKKyNkZWZpbmUgUFhFX0RFTEFZX01JTExJU0VDT05EICAgICAgICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgUFhFX0RFTEFZX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgMTAwMDAwMAorI2RlZmluZSBQWEVfSU9fUkVBRCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUFhFX0lPX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQWEVfTUVNX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBYRV9NRU1fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgIDQKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9nZXRfaW5pdF9pbmZvIHsKKyAgICAvLworICAgIC8vIE1pbmltdW0gbGVuZ3RoIG9mIGxvY2tlZCBtZW1vcnkgYnVmZmVyIHRoYXQgbXVzdCBiZSBnaXZlbiB0bworICAgIC8vIHRoZSBJbml0aWFsaXplIGNvbW1hbmQuIEdpdmluZyBVTkRJIG1vcmUgbWVtb3J5IHdpbGwgZ2VuZXJhbGx5CisgICAgLy8gZ2l2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgLy8KKyAgICAvLyBJZiBNZW1vcnlSZXF1aXJlZCBpcyB6ZXJvLCB0aGUgVU5ESSBkb2VzIG5vdCBuZWVkIGFuZCB3aWxsIG5vdAorICAgIC8vIHVzZSBzeXN0ZW0gbWVtb3J5IHRvIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHBhY2tldHMuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIE1lbW9yeVJlcXVpcmVkOworCisgICAgLy8KKyAgICAvLyBNYXhpbXVtIGZyYW1lIGRhdGEgbGVuZ3RoIGZvciBUeC9SeCBleGNsdWRpbmcgdGhlIG1lZGlhIGhlYWRlci4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgRnJhbWVEYXRhTGVuOworCisgICAgLy8KKyAgICAvLyBTdXBwb3J0ZWQgbGluayBzcGVlZHMgYXJlIGluIHVuaXRzIG9mIG1lZ2EgYml0cy4gIENvbW1vbiBldGhlcm5ldAorICAgIC8vIHZhbHVlcyBhcmUgMTAsIDEwMCBhbmQgMTAwMC4gIFVudXNlZCBMaW5rU3BlZWRzW10gZW50cmllcyBhcmUgemVybworICAgIC8vIGZpbGxlZC4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgTGlua1NwZWVkc1s0XTsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIG5vbi12b2xhdGlsZSBzdG9yYWdlIGl0ZW1zLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBOdkNvdW50OworCisgICAgLy8KKyAgICAvLyBXaWR0aCBvZiBub24tdm9sYXRpbGUgc3RvcmFnZSBpdGVtIGluIGJ5dGVzLiAgMCwgMSwgMiBvciA0CisgICAgLy8KKyAgICBQWEVfVUlOVDE2IE52V2lkdGg7CisKKyAgICAvLworICAgIC8vIE1lZGlhIGhlYWRlciBsZW5ndGguICBUaGlzIGlzIHRoZSB0eXBpY2FsIG1lZGlhIGhlYWRlciBsZW5ndGggZm9yCisgICAgLy8gdGhpcyBVTkRJLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgd2hlbiBhbGxvY2F0aW5nIHJlY2VpdmUKKyAgICAvLyBhbmQgdHJhbnNtaXQgYnVmZmVycy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgTWVkaWFIZWFkZXJMZW47CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiB0aGUgTklDIGhhcmR3YXJlIChNQUMpIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IEhXYWRkckxlbjsKKworICAgIC8vCisgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IE1BQyBhZGRyZXNzZXMgaW4gdGhlIG11bHRpY2FzdAorICAgIC8vIE1BQyBhZGRyZXNzIGZpbHRlciBsaXN0LgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNQ2FzdEZpbHRlckNudDsKKworICAgIC8vCisgICAgLy8gRGVmYXVsdCBudW1iZXIgYW5kIHNpemUgb2YgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyB0aGF0IHdpbGwgCisgICAgLy8gYmUgYWxsb2NhdGVkIGJ5IHRoZSBVTkRJLiAgSWYgTWVtb3J5UmVxdWlyZWQgaXMgbm9uLXplcm8sIHRoaXMgCisgICAgLy8gYWxsb2NhdGlvbiB3aWxsIGNvbWUgb3V0IG9mIHRoZSBtZW1vcnkgYnVmZmVyIGdpdmVuIHRvIHRoZSBJbml0aWFsaXplIAorICAgIC8vIGNvbW1hbmQuICBJZiBNZW1vcnlSZXF1aXJlZCBpcyB6ZXJvLCB0aGlzIGFsbG9jYXRpb24gd2lsbCBjb21lIG91dCBvZiAKKyAgICAvLyBtZW1vcnkgb24gdGhlIE5JQy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgVHhCdWZDbnQ7CisgICAgUFhFX1VJTlQxNiBUeEJ1ZlNpemU7CisgICAgUFhFX1VJTlQxNiBSeEJ1ZkNudDsKKyAgICBQWEVfVUlOVDE2IFJ4QnVmU2l6ZTsKKworICAgIC8vCisgICAgLy8gSGFyZHdhcmUgaW50ZXJmYWNlIHR5cGVzIGRlZmluZWQgaW4gdGhlIEFzc2lnbmVkIE51bWJlcnMgUkZDCisgICAgLy8gYW5kIHVzZWQgaW4gREhDUCBhbmQgQVJQIHBhY2tldHMuCisgICAgLy8gU2VlIHRoZSBQWEVfSUZUWVBFIHR5cGVkZWYgYW5kIFBYRV9JRlRZUEVfeHh4IG1hY3Jvcy4KKyAgICAvLworICAgIFBYRV9VSU5UOCBJRnR5cGU7CisKKyAgICAvLworICAgIC8vIFN1cHBvcnRlZCBkdXBsZXguICBTZWUgUFhFX0RVUExFWF94eHh4eCAjZGVmaW5lcyBiZWxvdy4KKyAgICAvLworICAgIFBYRV9VSU5UOCBEdXBsZXg7CisKKyAgICAvLworICAgIC8vIFN1cHBvcnRlZCBsb29wYmFjayBvcHRpb25zLiAgU2VlIFBYRV9MT09QQkFDS194eHh4eCAjZGVmaW5lcyBiZWxvdy4KKyAgICAvLworICAgIFBYRV9VSU5UOCBMb29wQmFjazsKK30gUFhFX0RCX0dFVF9JTklUX0lORk87CisKKyNkZWZpbmUgUFhFX01BWF9UWFJYX1VOSVRfRVRIRVIgICAgICAgICAgICAgMTUwMAorCisjZGVmaW5lIFBYRV9IV0FERFJfTEVOX0VUSEVSICAgICAgICAgICAgICAgICAgICAweDAwMDYKKyNkZWZpbmUgUFhFX01BQ19IRUFERVJfTEVOX0VUSEVSICAgICAgICAgICAgICAgIDB4MDAwRQorCisjZGVmaW5lIFBYRV9EVVBMRVhfRU5BQkxFX0ZVTExfU1VQUE9SVEVEICAgICAgICAgICAgMQorI2RlZmluZSBQWEVfRFVQTEVYX0ZPUkNFX0ZVTExfU1VQUE9SVEVEICAgICAgICAgMgorCisjZGVmaW5lIFBYRV9MT09QQkFDS19JTlRFUk5BTF9TVVBQT1JURUQgICAgICAgICAxCisjZGVmaW5lIFBYRV9MT09QQkFDS19FWFRFUk5BTF9TVVBQT1JURUQgICAgICAgICAyCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfcGNpX2NvbmZpZ19pbmZvIHsKKyAgICAvLworICAgIC8vIFRoaXMgaXMgdGhlIGZsYWcgZmllbGQgZm9yIHRoZSBQWEVfREJfR0VUX0NPTkZJR19JTkZPIHVuaW9uLgorICAgIC8vIEZvciBQQ0kgYnVzIGRldmljZXMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIFBYRV9CVVNUWVBFX1BDSS4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgQnVzVHlwZTsKKworICAgIC8vCisgICAgLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBQQ0kgbmV0d29yayBkZXZpY2UgdGhhdCB0aGlzIFVOREkgaW50ZXJmYWNlCisgICAgLy8gaXMgYm91bmQgdG8uCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IEJ1czsKKyAgICBQWEVfVUlOVDggRGV2aWNlOworICAgIFBYRV9VSU5UOCBGdW5jdGlvbjsKKworICAgIC8vCisgICAgLy8gVGhpcyBpcyBhIGNvcHkgb2YgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGZvciB0aGlzIAorICAgIC8vIG5ldHdvcmsgZGV2aWNlLgorICAgIC8vCisgICAgdW5pb24geworICAgICAgICBQWEVfVUlOVDggQnl0ZVsyNTZdOworICAgICAgICBQWEVfVUlOVDE2IFdvcmRbMTI4XTsKKyAgICAgICAgUFhFX1VJTlQzMiBEd29yZFs2NF07CisgICAgfSBDb25maWc7Cit9IFBYRV9QQ0lfQ09ORklHX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfcGNjX2NvbmZpZ19pbmZvIHsKKyAgICAvLworICAgIC8vIFRoaXMgaXMgdGhlIGZsYWcgZmllbGQgZm9yIHRoZSBQWEVfREJfR0VUX0NPTkZJR19JTkZPIHVuaW9uLgorICAgIC8vIEZvciBQQ0MgYnVzIGRldmljZXMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIFBYRV9CVVNUWVBFX1BDQy4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgQnVzVHlwZTsKKyAgICAKKyAgICAvLworICAgIC8vIFRoaXMgaWRlbnRpZmllcyB0aGUgUENDIG5ldHdvcmsgZGV2aWNlIHRoYXQgdGhpcyBVTkRJIGludGVyZmFjZQorICAgIC8vIGlzIGJvdW5kIHRvLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBCdXM7CisgICAgUFhFX1VJTlQ4IERldmljZTsKKyAgICBQWEVfVUlOVDggRnVuY3Rpb247CisKKyAgICAvLworICAgIC8vIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBQQ0MgY29uZmlndXJhdGlvbiBzcGFjZSBmb3IgdGhpcyAKKyAgICAvLyBuZXR3b3JrIGRldmljZS4KKyAgICAvLworICAgIHVuaW9uIHsKKyAgICAgICAgUFhFX1VJTlQ4IEJ5dGVbMjU2XTsKKyAgICAgICAgUFhFX1VJTlQxNiBXb3JkWzEyOF07CisgICAgICAgIFBYRV9VSU5UMzIgRHdvcmRbNjRdOworICAgIH0gQ29uZmlnOworfSBQWEVfUENDX0NPTkZJR19JTkZPOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX3VzYl9jb25maWdfaW5mbyB7CisgICAgUFhFX1VJTlQzMiBCdXNUeXBlOworICAgIC8vICUlVEJEIFdoYXQgc2hvdWxkIHdlIHJldHVybiBoZXJlLi4uCit9IFBYRV9VU0JfQ09ORklHX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfMTM5NF9jb25maWdfaW5mbyB7CisgICAgUFhFX1VJTlQzMiBCdXNUeXBlOworICAgIC8vICUlVEJEIFdoYXQgc2hvdWxkIHdlIHJldHVybiBoZXJlLi4uCit9IFBYRV8xMzk0X0NPTkZJR19JTkZPOworCisKK3R5cGVkZWYgdW5pb24gdV9weGVfZGJfZ2V0X2NvbmZpZ19pbmZvIHsKKyAgICBQWEVfUENJX0NPTkZJR19JTkZPIHBjaTsKKyAgICBQWEVfUENDX0NPTkZJR19JTkZPIHBjYzsKKyAgICBQWEVfVVNCX0NPTkZJR19JTkZPIHVzYjsKKyAgICBQWEVfMTM5NF9DT05GSUdfSU5GTyBfMTM5NDsKK30gUFhFX0RCX0dFVF9DT05GSUdfSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfaW5pdGlhbGl6ZSB7CisgICAgLy8KKyAgICAvLyBBZGRyZXNzIG9mIGZpcnN0IChsb3dlc3QpIGJ5dGUgb2YgdGhlIG1lbW9yeSBidWZmZXIuICBUaGlzIGJ1ZmZlciBtdXN0CisgICAgLy8gYmUgaW4gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkgYW5kIGNhbm5vdCBiZSBzd2FwcGVkIG91dC4gIFRoZSBVTkRJCisgICAgLy8gd2lsbCBiZSB1c2luZyB0aGlzIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXJpbmcuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IE1lbW9yeUFkZHI7CisKKyAgICAvLworICAgIC8vIE1lbW9yeUxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBNZW1vcnlSZXF1aXJlZAorICAgIC8vIHJldHVybmVkIGJ5IHRoZSBHZXQgSW5pdCBJbmZvIGNvbW1hbmQuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIE1lbW9yeUxlbmd0aDsKKworICAgIC8vCisgICAgLy8gRGVzaXJlZCBsaW5rIHNwZWVkIGluIE1iaXQvc2VjLiAgQ29tbW9uIGV0aGVybmV0IHZhbHVlcyBhcmUgMTAsIDEwMAorICAgIC8vIGFuZCAxMDAwLiAgU2V0dGluZyBhIHZhbHVlIG9mIHplcm8gd2lsbCBhdXRvLWRldGVjdCBhbmQvb3IgdXNlIHRoZQorICAgIC8vIGRlZmF1bHQgbGluayBzcGVlZCAob3BlcmF0aW9uIGRlcGVuZHMgb24gVU5ESS9OSUMgZnVuY3Rpb25hbGl0eSkuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIExpbmtTcGVlZDsKKworICAgIC8vCisgICAgLy8gU3VnZ2VzdGVkIG51bWJlciBhbmQgc2l6ZSBvZiByZWNlaXZlIGFuZCB0cmFuc21pdCBidWZmZXJzIHRvCisgICAgLy8gYWxsb2NhdGUuICBJZiBNZW1vcnlBZGRyIGFuZCBNZW1vcnlMZW5ndGggYXJlIG5vbi16ZXJvLCB0aGlzCisgICAgLy8gYWxsb2NhdGlvbiBjb21lcyBvdXQgb2YgdGhlIHN1cHBsaWVkIG1lbW9yeSBidWZmZXIuICBJZiBNZW1vcnlBZGRyIAorICAgIC8vIGFuZCBNZW1vcnlMZW5ndGggYXJlIHplcm8sIHRoaXMgYWxsb2NhdGlvbiBjb21lcyBvdXQgb2YgbWVtb3J5CisgICAgLy8gb24gdGhlIE5JQy4KKyAgICAvLworICAgIC8vIElmIHRoZXNlIGZpZWxkcyBhcmUgc2V0IHRvIHplcm8sIHRoZSBVTkRJIHdpbGwgYWxsb2NhdGUgYnVmZmVyCisgICAgLy8gY291bnRzIGFuZCBzaXplcyBhcyBpdCBzZWVzIGZpdC4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgVHhCdWZDbnQ7CisgICAgUFhFX1VJTlQxNiBUeEJ1ZlNpemU7CisgICAgUFhFX1VJTlQxNiBSeEJ1ZkNudDsKKyAgICBQWEVfVUlOVDE2IFJ4QnVmU2l6ZTsKKworICAgIC8vCisgICAgLy8gVGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsIGFuZCBtdXN0IGJlIHplcm8gCisgICAgLy8gdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlcy4KKyAgICAvLworICAgIFBYRV9VSU5UOCBEdXBsZXg7IAorCisgICAgUFhFX1VJTlQ4IExvb3BCYWNrOworfSBQWEVfQ1BCX0lOSVRJQUxJWkU7CisKKworI2RlZmluZSBQWEVfRFVQTEVYX0RFRkFVTFQgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFBYRV9GT1JDRV9GVUxMX0RVUExFWCAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFBYRV9FTkFCTEVfRlVMTF9EVVBMRVggICAgICAgICAgICAgIDB4MDIKKworI2RlZmluZSBMT09QQkFDS19OT1JNQUwgMAorI2RlZmluZSBMT09QQkFDS19JTlRFUk5BTCAxCisjZGVmaW5lIExPT1BCQUNLX0VYVEVSTkFMIDIKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9pbml0aWFsaXplIHsKKyAgICAvLworICAgIC8vIEFjdHVhbCBhbW91bnQgb2YgbWVtb3J5IHVzZWQgZnJvbSB0aGUgc3VwcGxpZWQgbWVtb3J5IGJ1ZmZlci4gIFRoaXMKKyAgICAvLyBtYXkgYmUgbGVzcyB0aGF0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHN1cHBsbGllZCBhbmQgbWF5IGJlIHplcm8gaWYKKyAgICAvLyB0aGUgVU5ESSBhbmQgbmV0d29yayBkZXZpY2UgZG8gbm90IHVzZSBleHRlcm5hbCBtZW1vcnkgYnVmZmVycy4KKyAgICAvLworICAgIC8vIE1lbW9yeSB1c2VkIGJ5IHRoZSBVTkRJIGFuZCBuZXR3b3JrIGRldmljZSBpcyBhbGxvY2F0ZWQgZnJvbSB0aGUgCisgICAgLy8gbG93ZXN0IG1lbW9yeSBidWZmZXIgYWRkcmVzcy4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgTWVtb3J5VXNlZDsKKworICAgIC8vCisgICAgLy8gQWN0dWFsIG51bWJlciBhbmQgc2l6ZSBvZiByZWNlaXZlIGFuZCB0cmFuc21pdCBidWZmZXJzIHRoYXQgd2VyZQorICAgIC8vIGFsbG9jYXRlZC4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgVHhCdWZDbnQ7CisgICAgUFhFX1VJTlQxNiBUeEJ1ZlNpemU7CisgICAgUFhFX1VJTlQxNiBSeEJ1ZkNudDsKKyAgICBQWEVfVUlOVDE2IFJ4QnVmU2l6ZTsKK30gUFhFX0RCX0lOSVRJQUxJWkU7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3JlY2VpdmVfZmlsdGVycyB7CisgICAgLy8KKyAgICAvLyBMaXN0IG9mIG11bHRpY2FzdCBNQUMgYWRkcmVzc2VzLiAgVGhpcyBsaXN0LCBpZiBwcmVzZW50LCB3aWxsCisgICAgLy8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZpbHRlciBsaXN0LgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIE1DYXN0TGlzdFtNQVhfTUNBU1RfQUREUkVTU19DTlRdOworfSBQWEVfQ1BCX1JFQ0VJVkVfRklMVEVSUzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9yZWNlaXZlX2ZpbHRlcnMgeworICAgIC8vCisgICAgLy8gRmlsdGVyZWQgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGxpc3QuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgTUNhc3RMaXN0W01BWF9NQ0FTVF9BRERSRVNTX0NOVF07Cit9IFBYRV9EQl9SRUNFSVZFX0ZJTFRFUlM7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3N0YXRpb25fYWRkcmVzcyB7CisgICAgLy8KKyAgICAvLyBJZiBzdXBwbGllZCBhbmQgc3VwcG9ydGVkLCB0aGUgY3VycmVudCBzdGF0aW9uIE1BQyBhZGRyZXNzCisgICAgLy8gd2lsbCBiZSBjaGFuZ2VkLgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIFN0YXRpb25BZGRyOworfSBQWEVfQ1BCX1NUQVRJT05fQUREUkVTUzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kcGJfc3RhdGlvbl9hZGRyZXNzIHsKKyAgICAvLworICAgIC8vIEN1cnJlbnQgc3RhdGlvbiBNQUMgYWRkcmVzcy4KKyAgICAvLworICAgIFBYRV9NQUNfQUREUiBTdGF0aW9uQWRkcjsKKworICAgIC8vCisgICAgLy8gU3RhdGlvbiBicm9hZGNhc3QgTUFDIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgQnJvYWRjYXN0QWRkcjsKKworICAgIC8vCisgICAgLy8gUGVybWFuZW50IHN0YXRpb24gTUFDIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgUGVybWFuZW50QWRkcjsKK30gUFhFX0RCX1NUQVRJT05fQUREUkVTUzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9zdGF0aXN0aWNzIHsKKyAgICAvLworICAgIC8vIEJpdCBmaWVsZCBpZGVudGlmeWluZyB3aGF0IHN0YXRpc3RpYyBkYXRhIGlzIGNvbGxlY3RlZCBieSB0aGUgCisgICAgLy8gVU5ESS9OSUMuCisgICAgLy8gSWYgYml0IDB4MDAgaXMgc2V0LCBEYXRhWzB4MDBdIGlzIGNvbGxlY3RlZC4KKyAgICAvLyBJZiBiaXQgMHgwMSBpcyBzZXQsIERhdGFbMHgwMV0gaXMgY29sbGVjdGVkLgorICAgIC8vIElmIGJpdCAweDIwIGlzIHNldCwgRGF0YVsweDIwXSBpcyBjb2xsZWN0ZWQuCisgICAgLy8gSWYgYml0IDB4MjEgaXMgc2V0LCBEYXRhWzB4MjFdIGlzIGNvbGxlY3RlZC4KKyAgICAvLyBFdGMuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IFN1cHBvcnRlZDsKKworICAgIC8vCisgICAgLy8gU3RhdGlzdGljIGRhdGEuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IERhdGFbNjRdOworfSBQWEVfREJfU1RBVElTVElDUzsKKworLy8KKy8vIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQuICBJbmNsdWRlcyBmcmFtZXMgd2l0aCBlcnJvcnMgYW5kCisvLyBkcm9wcGVkIGZyYW1lcy4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX1RPVEFMX0ZSQU1FUyAgICAgICAgICAweDAwCisKKy8vCisvLyBOdW1iZXIgb2YgdmFsaWQgZnJhbWVzIHJlY2VpdmVkIGFuZCBjb3BpZWQgaW50byByZWNlaXZlIGJ1ZmZlcnMuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9HT09EX0ZSQU1FUyAgICAgICAgICAgMHgwMQorCisvLworLy8gTnVtYmVyIG9mIGZyYW1lcyBiZWxvdyB0aGUgbWluaW11bSBsZW5ndGggZm9yIHRoZSBtZWRpYS4KKy8vIFRoaXMgd291bGQgYmUgPDY0IGZvciBldGhlcm5ldC4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX1VOREVSU0laRV9GUkFNRVMgICAgICAgICAgMHgwMgorCisvLworLy8gTnVtYmVyIG9mIGZyYW1lcyBsb25nZXIgdGhhbiB0aGUgbWF4bWludW0gbGVuZ3RoIGZvciB0aGUKKy8vIG1lZGlhLiAgVGhpcyB3b3VsZCBiZSA+MTUwMCBmb3IgZXRoZXJuZXQuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9PVkVSU0laRV9GUkFNRVMgICAgICAgICAgIDB4MDMKKworLy8KKy8vIFZhbGlkIGZyYW1lcyB0aGF0IHdlcmUgZHJvcHBlZCBiZWNhdXNlIHJlY2VpdmUgYnVmZmVycyB3ZXJlIGZ1bGwuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9EUk9QUEVEX0ZSQU1FUyAgICAgICAgICAgIDB4MDQKKworLy8KKy8vIE51bWJlciBvZiB2YWxpZCB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBhbmQgbm90IGRyb3BwZWQuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgIDB4MDUKKworLy8KKy8vIE51bWJlciBvZiB2YWxpZCBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIGFuZCBub3QgZHJvcHBlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgMHgwNgorCisvLworLy8gTnVtYmVyIG9mIHZhbGlkIG11dGxpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgYW5kIG5vdCBkcm9wcGVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAweDA3CisKKy8vCisvLyBOdW1iZXIgb2YgZnJhbWVzIHcvIENSQyBvciBhbGlnbm1lbnQgZXJyb3JzLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfQ1JDX0VSUk9SX0ZSQU1FUyAgICAgICAgICAweDA4CisKKy8vCisvLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuICBJbmNsdWRlcyBmcmFtZXMgd2l0aCBlcnJvcnMKKy8vIGFuZCBkcm9wcGVkIGZyYW1lcy4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX1RPVEFMX0JZVEVTICAgICAgICAgICAweDA5CisKKy8vCisvLyBUcmFuc21pdCBzdGF0aXN0aWNzLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfVE9UQUxfRlJBTUVTICAgICAgICAgIDB4MEEKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfR09PRF9GUkFNRVMgICAgICAgICAgIDB4MEIKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfVU5ERVJTSVpFX0ZSQU1FUyAgICAgICAgICAweDBDCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX09WRVJTSVpFX0ZSQU1FUyAgICAgICAgICAgMHgwRAorI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9EUk9QUEVEX0ZSQU1FUyAgICAgICAgICAgIDB4MEUKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAweDBGCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgMHgxMAorI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgIDB4MTEKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfQ1JDX0VSUk9SX0ZSQU1FUyAgICAgICAgICAweDEyCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX1RPVEFMX0JZVEVTICAgICAgICAgICAweDEzCisKKy8vCisvLyBOdW1iZXIgb2YgY29sbGlzaW9ucyBkZXRlY3Rpb24gb24gdGhpcyBzdWJuZXQuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19DT0xMSVNJT05TICAgICAgICAgICAgICAgMHgxNAorCisvLworLy8gTnVtYmVyIG9mIGZyYW1lcyBkZXN0aW5lZCBmb3IgdW5zdXBwb3J0ZWQgcHJvdG9jb2wuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19VTlNVUFBPUlRFRF9QUk9UT0NPTCAgICAgICAgIDB4MTUKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfbWNhc3RfaXBfdG9fbWFjIHsKKyAgICAvLworICAgIC8vIE11bHRpY2FzdCBJUCBhZGRyZXNzIHRvIGJlIGNvbnZlcnRlZCB0byBtdWx0aWNhc3QgTUFDIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfSVBfQUREUiBJUDsKK30gUFhFX0NQQl9NQ0FTVF9JUF9UT19NQUM7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfbWNhc3RfaXBfdG9fbWFjIHsKKyAgICAvLworICAgIC8vIE11bHRpY2FzdCBNQUMgYWRkcmVzcy4KKyAgICAvLworICAgIFBYRV9NQUNfQUREUiBNQUM7Cit9IFBYRV9EQl9NQ0FTVF9JUF9UT19NQUM7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX252ZGF0YV9zcGFyc2UgeworICAgIC8vCisgICAgLy8gTnZEYXRhIGl0ZW0gbGlzdC4gIE9ubHkgaXRlbXMgaW4gdGhpcyBsaXN0IHdpbGwgYmUgdXBkYXRlZC4KKyAgICAvLworICAgIHN0cnVjdCB7CisgICAgICAgIC8vICBOb24tdm9sYXRpbGUgc3RvcmFnZSBhZGRyZXNzIHRvIGJlIGNoYW5nZWQuCisgICAgICAgIFBYRV9VSU5UMzIgQWRkcjsKKworICAgICAgICAvLyBEYXRhIGl0ZW0gdG8gd3JpdGUgaW50byBhYm92ZSBzdG9yYWdlIGFkZHJlc3MuCisgICAgCisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIFBYRV9VSU5UOCBCeXRlOworICAgICAgICAgICAgUFhFX1VJTlQxNiBXb3JkOworICAgICAgICAgICAgUFhFX1VJTlQzMiBEd29yZDsKKyAgICAgICAgfSBEYXRhOworICAgIH0gSXRlbVtNQVhfRUVQUk9NX0xFTl07Cit9IFBYRV9DUEJfTlZEQVRBX1NQQVJTRTsKKworCisvLworLy8gV2hlbiB1c2luZyBidWxrIHVwZGF0ZSwgdGhlIHNpemUgb2YgdGhlIENQQiBzdHJ1Y3R1cmUgbXVzdCBiZQorLy8gdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbm9uLXZvbGF0aWxlIE5JQyBzdG9yYWdlLgorLy8KK3R5cGVkZWYgdW5pb24gdV9weGVfY3BiX252ZGF0YV9idWxrIHsKKyAgICAvLworICAgIC8vIEFycmF5IG9mIGJ5dGUtd2lkZSBkYXRhIGl0ZW1zLgorICAgIC8vCisgICAgUFhFX1VJTlQ4IEJ5dGVbTUFYX0VFUFJPTV9MRU4gPDwgMl07CisKKyAgICAvLworICAgIC8vIEFycmF5IG9mIHdvcmQtd2lkZSBkYXRhIGl0ZW1zLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBXb3JkW01BWF9FRVBST01fTEVOIDw8IDFdOworCisgICAgLy8KKyAgICAvLyBBcnJheSBvZiBkd29yZC13aWRlIGRhdGEgaXRlbXMuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIER3b3JkW01BWF9FRVBST01fTEVOXTsKK30gUFhFX0NQQl9OVkRBVEFfQlVMSzsKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfbnZkYXRhIHsKKworICAgIC8vIEFycmF5cyBvZiBkYXRhIGl0ZW1zIGZyb20gbm9uLXZvbGF0aWxlIHN0b3JhZ2UuCisKKyAgICB1bmlvbiB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEFycmF5IG9mIGJ5dGUtd2lkZSBkYXRhIGl0ZW1zLgorICAgICAgICAvLworICAgICAgICBQWEVfVUlOVDggQnl0ZVtNQVhfRUVQUk9NX0xFTiA8PCAyXTsKKworICAgICAgICAvLworICAgICAgICAvLyBBcnJheSBvZiB3b3JkLXdpZGUgZGF0YSBpdGVtcy4KKyAgICAgICAgLy8KKyAgICAgICAgUFhFX1VJTlQxNiBXb3JkW01BWF9FRVBST01fTEVOIDw8IDFdOworCisgICAgICAgIC8vIEFycmF5IG9mIGR3b3JkLXdpZGUgZGF0YSBpdGVtcy4KKworICAgICAgICBQWEVfVUlOVDMyIER3b3JkW01BWF9FRVBST01fTEVOXTsKKyAgICB9IERhdGE7Cit9IFBYRV9EQl9OVkRBVEE7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfZ2V0X3N0YXR1cyB7CisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgbmV4dCByZWNlaXZlIGZyYW1lIChoZWFkZXIgKyBkYXRhKS4gIElmIHRoaXMgaXMgemVybywKKyAgICAvLyB0aGVyZSBpcyBubyBuZXh0IHJlY2VpdmUgZnJhbWUgYXZhaWxhYmxlLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBSeEZyYW1lTGVuOworCisgICAgLy8KKyAgICAvLyBSZXNlcnZlZCwgc2V0IHRvIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIHJlc2VydmVkOworCisgICAgLy8KKyAgICAvLyAgQWRkcmVzc2VzIG9mIHRyYW5zbWl0dGVkIGJ1ZmZlcnMgdGhhdCBuZWVkIHRvIGJlIHJlY3ljbGVkLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBUeEJ1ZmZlcltNQVhfWE1JVF9CVUZGRVJTXTsKK30gUFhFX0RCX0dFVF9TVEFUVVM7CisKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfZmlsbF9oZWFkZXIgeworICAgIC8vCisgICAgLy8gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzc2VzLiAgVGhlc2Ugd2lsbCBiZSBjb3BpZWQgaW50bworICAgIC8vIHRoZSBtZWRpYSBoZWFkZXIgd2l0aG91dCBkb2luZyBieXRlIHN3YXBwaW5nLgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIFNyY0FkZHI7CisgICAgUFhFX01BQ19BRERSIERlc3RBZGRyOworCisgICAgLy8KKyAgICAvLyBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgbWVkaWEgaGVhZGVyLiAgVGhlIGZpcnN0IGJ5dGUgb2YgcGFja2V0IGRhdGEKKyAgICAvLyBmb2xsb3dzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIG1lZGlhIGhlYWRlci4KKyAgICAvLworICAgIFBYRV9VSU5UNjQgTWVkaWFIZWFkZXI7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiBwYWNrZXQgZGF0YSBpbiBieXRlcyAobm90IGluY2x1ZGluZyB0aGUgbWVkaWEgaGVhZGVyKS4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgUGFja2V0TGVuOworCisgICAgLy8KKyAgICAvLyBQcm90b2NvbCB0eXBlLiAgVGhpcyB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBtZWRpYSBoZWFkZXIgd2l0aG91dAorICAgIC8vIGRvaW5nIGJ5dGUgc3dhcHBpbmcuICBQcm90b2NvbCB0eXBlIG51bWJlcnMgY2FuIGJlIG9idGFpbmVkIGZyb20KKyAgICAvLyB0aGUgQXNzaWduZWQgTnVtYmVycyBSRkMgMTcwMC4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgUHJvdG9jb2w7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyIGluIGJ5dGVzLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYUhlYWRlckxlbjsKK30gUFhFX0NQQl9GSUxMX0hFQURFUjsKKworCisjZGVmaW5lIFBYRV9QUk9UT0NPTF9FVEhFUk5FVF9JUCAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgUFhFX1BST1RPQ09MX0VUSEVSTkVUX0FSUCAgICAgICAgICAgICAgIDB4MDgwNgorI2RlZmluZSBNQVhfWE1JVF9GUkFHTUVOVFMgMTYKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX2ZpbGxfaGVhZGVyX2ZyYWdtZW50ZWQgeworICAgIC8vCisgICAgLy8gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzc2VzLiAgVGhlc2Ugd2lsbCBiZSBjb3BpZWQgaW50bworICAgIC8vIHRoZSBtZWRpYSBoZWFkZXIgd2l0aG91dCBkb2luZyBieXRlIHN3YXBwaW5nLgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIFNyY0FkZHI7CisgICAgUFhFX01BQ19BRERSIERlc3RBZGRyOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgcGFja2V0IGRhdGEgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgdGhlIG1lZGlhIGhlYWRlcikuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIFBhY2tldExlbjsKKworICAgIC8vCisgICAgLy8gUHJvdG9jb2wgdHlwZS4gIFRoaXMgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgbWVkaWEgaGVhZGVyIHdpdGhvdXQKKyAgICAvLyBkb2luZyBieXRlIHN3YXBwaW5nLiAgUHJvdG9jb2wgdHlwZSBudW1iZXJzIGNhbiBiZSBvYnRhaW5lZCBmcm9tCisgICAgLy8gdGhlIEFzc2lnbmVkIE51bWJlcnMgUkZDIDE3MDAuCisgICAgLy8KKyAgICBQWEVfTUVESUFfUFJPVE9DT0wgUHJvdG9jb2w7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyIGluIGJ5dGVzLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYUhlYWRlckxlbjsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIHBhY2tldCBmcmFnbWVudCBkZXNjcmlwdG9ycy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgRnJhZ0NudDsKKworICAgIC8vCisgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IHJlc2VydmVkOworCisgICAgLy8KKyAgICAvLyBBcnJheSBvZiBwYWNrZXQgZnJhZ21lbnQgZGVzY3JpcHRvcnMuICBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVkaWEKKyAgICAvLyBoZWFkZXIgaXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGZpcnN0IGZyYWdtZW50LgorICAgIC8vCisgICAgc3RydWN0IHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRkcmVzcyBvZiB0aGlzIHBhY2tldCBmcmFnbWVudC4KKyAgICAgICAgLy8KKyAgICAgICAgUFhFX1VJTlQ2NCBGcmFnQWRkcjsKKworICAgICAgICAvLworICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBwYWNrZXQgZnJhZ21lbnQuCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UMzIgRnJhZ0xlbjsKKworICAgICAgICAvLworICAgICAgICAvLyBSZXNlcnZlZCwgbXVzdCBiZSBzZXQgdG8gemVyby4KKyAgICAgICAgLy8KKyAgICAgICAgUFhFX1VJTlQzMiByZXNlcnZlZDsKKyAgICB9IEZyYWdEZXNjW01BWF9YTUlUX0ZSQUdNRU5UU107Cit9IFBYRV9DUEJfRklMTF9IRUFERVJfRlJBR01FTlRFRDsKKworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NwYl90cmFuc21pdCB7CisgICAgLy8KKyAgICAvLyBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgZnJhbWUgYnVmZmVyLiAgVGhpcyBpcyBhbHNvIHRoZSBmaXJzdCBieXRlCisgICAgLy8gb2YgdGhlIG1lZGlhIGhlYWRlci4KKyAgICAvLworICAgIFBYRV9VSU5UNjQgRnJhbWVBZGRyOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgZnJhbWUgYnVmZmVyIGluIGJ5dGVzLiAgRG8gbm90CisgICAgLy8gaW5jbHVkZSB0aGUgbGVuZ3RoIG9mIHRoZSBtZWRpYSBoZWFkZXIuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIERhdGFMZW47CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyIGluIGJ5dGVzLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYWhlYWRlckxlbjsKKworICAgIC8vCisgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgcmVzZXJ2ZWQ7Cit9IFBYRV9DUEJfVFJBTlNNSVQ7CisKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfdHJhbnNtaXRfZnJhZ21lbnRzIHsKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiBwYWNrZXQgZGF0YSBpbiBieXRlcyAobm90IGluY2x1ZGluZyB0aGUgbWVkaWEgaGVhZGVyKS4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgRnJhbWVMZW47CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyIGluIGJ5dGVzLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYWhlYWRlckxlbjsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIHBhY2tldCBmcmFnbWVudCBkZXNjcmlwdG9ycy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgRnJhZ0NudDsKKworICAgIC8vCisgICAgLy8gQXJyYXkgb2YgZnJhbWUgZnJhZ21lbnQgZGVzY3JpcHRvcnMuICBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlyc3QKKyAgICAvLyBmcmFnbWVudCBpcyBhbHNvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZWRpYSBoZWFkZXIuCisgICAgLy8KKyAgICBzdHJ1Y3QgeworICAgICAgICAvLworICAgICAgICAvLyBBZGRyZXNzIG9mIHRoaXMgZnJhbWUgZnJhZ21lbnQuCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UNjQgRnJhZ0FkZHI7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgZnJhbWUgZnJhZ21lbnQuCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UMzIgRnJhZ0xlbjsKKworICAgICAgICAvLworICAgICAgICAvLyBSZXNlcnZlZCwgbXVzdCBiZSBzZXQgdG8gemVyby4KKyAgICAgICAgLy8KKyAgICAgICAgUFhFX1VJTlQzMiByZXNlcnZlZDsKKyAgICB9IEZyYWdEZXNjW01BWF9YTUlUX0ZSQUdNRU5UU107Cit9IFBYRV9DUEJfVFJBTlNNSVRfRlJBR01FTlRTOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NwYl9yZWNlaXZlIHsKKyAgICAvLworICAgIC8vIEFkZHJlc3Mgb2YgZmlyc3QgYnl0ZSBvZiByZWNlaXZlIGJ1ZmZlci4gIFRoaXMgaXMgYWxzbyB0aGUgZmlyc3QgYnl0ZQorICAgIC8vIG9mIHRoZSBmcmFtZSBoZWFkZXIuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IEJ1ZmZlckFkZHI7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiByZWNlaXZlIGJ1ZmZlci4gIFRoaXMgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgICAvLyByZWNlaXZlZCBmcmFtZSAobWVkaWEgaGVhZGVyICsgZGF0YSkuICBJZiB0aGUgbGVuZ3RoIG9mIHNtYWxsZXIgdGhhbgorICAgIC8vIHRoZSByZWNlaXZlZCBmcmFtZSwgZGF0YSB3aWxsIGJlIGxvc3QuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIEJ1ZmZlckxlbjsKKworICAgIC8vCisgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIHJlc2VydmVkOworfSBQWEVfQ1BCX1JFQ0VJVkU7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfcmVjZWl2ZSB7CisgICAgLy8KKyAgICAvLyBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzZXMgZnJvbSBtZWRpYSBoZWFkZXIuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgU3JjQWRkcjsKKyAgICBQWEVfTUFDX0FERFIgRGVzdEFkZHI7CisKKyAgICAvLworICAgIC8vIExlbmd0aCBvZiByZWNlaXZlZCBmcmFtZS4gIE1heSBiZSBsYXJnZXIgdGhhbiByZWNlaXZlIGJ1ZmZlciBzaXplLgorICAgIC8vIFRoZSByZWNlaXZlIGJ1ZmZlciB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbi4gIFRoaXMgaXMgaG93IHRvIHRlbGwKKyAgICAvLyBpZiBkYXRhIHdhcyBsb3N0IGJlY2F1c2UgdGhlIHJlY2VpdmUgYnVmZmVyIHdhcyB0b28gc21hbGwuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIEZyYW1lTGVuOworCisgICAgLy8KKyAgICAvLyBQcm90b2NvbCB0eXBlIGZyb20gbWVkaWEgaGVhZGVyLgorICAgIC8vCisgICAgUFhFX01FRElBX1BST1RPQ09MIFByb3RvY29sOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgbWVkaWEgaGVhZGVyIGluIHJlY2VpdmVkIGZyYW1lLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBNZWRpYUhlYWRlckxlbjsKKworICAgIC8vCisgICAgLy8gVHlwZSBvZiByZWNlaXZlIGZyYW1lLgorICAgIC8vCisgICAgUFhFX0ZSQU1FX1RZUEUgVHlwZTsKKworICAgIC8vCisgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KKyAgICAvLworICAgIFBYRV9VSU5UOCByZXNlcnZlZFs3XTsKKworfSBQWEVfREJfUkVDRUlWRTsKKworI3ByYWdtYSBwYWNrKCkKKworLyogRU9GIC0gZWZpX3B4ZS5oICovCisjZW5kaWYgLyogX0VGSV9QWEVfSCAqLworCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9lZmlhcGkuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDczMjQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlhcGkuaApAQCAtMCwwICsxLDg5MCBAQAorI2lmbmRlZiBfRUZJX0FQSV9ICisjZGVmaW5lIF9FRklfQVBJX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpYXBpLmgKKworQWJzdHJhY3Q6CisKKyAgICBHbG9iYWwgRUZJIHJ1bnRpbWUgJiBib290IHNlcnZpY2UgaW50ZXJmYWNlcworCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIEVGSSBTcGVjaWZpY2F0aW9uIFJldmlzaW9uCisvLworCisjZGVmaW5lIEVGSV9TUEVDSUZJQ0FUSU9OX01BSk9SX1JFVklTSU9OIDEKKyNkZWZpbmUgRUZJX1NQRUNJRklDQVRJT05fTUlOT1JfUkVWSVNJT04gMDIKKworLy8KKy8vIERlY2xhcmUgZm9yd2FyZCByZWZlcmVuY2VkIGRhdGEgc3RydWN0dXJlcworLy8KKworSU5URVJGQUNFX0RFQ0woX0VGSV9TWVNURU1fVEFCTEUpOworCisvLworLy8gRUZJIE1lbW9yeQorLy8KKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0FMTE9DQVRFX1BBR0VTKSAoCisgICAgSU4gRUZJX0FMTE9DQVRFX1RZUEUgICAgICAgICAgICBUeXBlLAorICAgIElOIEVGSV9NRU1PUllfVFlQRSAgICAgICAgICAgICAgTWVtb3J5VHlwZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE5vUGFnZXMsCisgICAgT1VUIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAqTWVtb3J5CisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZSRUVfUEFHRVMpICgKKyAgICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgIE1lbW9yeSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE5vUGFnZXMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX01FTU9SWV9NQVApICgKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpNZW1vcnlNYXBTaXplLAorICAgIElOIE9VVCBFRklfTUVNT1JZX0RFU0NSSVBUT1IgICAgKk1lbW9yeU1hcCwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpNYXBLZXksCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqRGVzY3JpcHRvclNpemUsCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAqRGVzY3JpcHRvclZlcnNpb24KKyAgICApOworCisjZGVmaW5lIE5leHRNZW1vcnlEZXNjcmlwdG9yKFB0cixTaXplKSAgKChFRklfTUVNT1JZX0RFU0NSSVBUT1IgKikgKCgoVUlOVDggKikgUHRyKSArIFNpemUpKQorCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9BTExPQ0FURV9QT09MKSAoCisgICAgSU4gRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgICBQb29sVHlwZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GUkVFX1BPT0wpICgKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmIAorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9WSVJUVUFMX0FERFJFU1NfTUFQKSAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlNYXBTaXplLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclNpemUsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yVmVyc2lvbiwKKyAgICBJTiBFRklfTUVNT1JZX0RFU0NSSVBUT1IgICAgICAgICpWaXJ0dWFsTWFwCisgICAgKTsKKworCisjZGVmaW5lIEVGSV9PUFRJT05BTF9QVFIgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVGSV9JTlRFUk5BTF9GTkMgICAgICAgICAgICAweDAwMDAwMDAyICAgICAgLy8gUG9pbnRlciB0byBpbnRlcm5hbCBydW50aW1lIGZuYworI2RlZmluZSBFRklfSU5URVJOQUxfUFRSICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAgIC8vIFBvaW50ZXIgdG8gaW50ZXJuYWwgcnVudGltZSBkYXRhCisKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DT05WRVJUX1BPSU5URVIpICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnRGlzcG9zaXRpb24sCisgICAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAqKkFkZHJlc3MKKyAgICApOworCisKKy8vCisvLyBFRkkgRXZlbnRzCisvLworCisKKworI2RlZmluZSBFVlRfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEVWVF9SVU5USU1FICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgRVZUX1JVTlRJTUVfQ09OVEVYVCAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorCisjZGVmaW5lIEVWVF9OT1RJRllfV0FJVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRVZUX05PVElGWV9TSUdOQUwgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorCisjZGVmaW5lIEVWVF9TSUdOQUxfRVhJVF9CT09UX1NFUlZJQ0VTICAgICAgIDB4MDAwMDAyMDEKKyNkZWZpbmUgRVZUX1NJR05BTF9WSVJUVUFMX0FERFJFU1NfQ0hBTkdFICAgMHg2MDAwMDIwMgorCisjZGVmaW5lIEVWVF9FRklfU0lHTkFMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgRVZUX0VGSV9TSUdOQUxfTUFYICAgICAgICAgICAgICAgICAgMgorCit0eXBlZGVmCitWT0lECisoRUZJQVBJICpFRklfRVZFTlRfTk9USUZZKSAoCisgICAgSU4gRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50LAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQ29udGV4dAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DUkVBVEVfRVZFTlQpICgKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFR5cGUsCisgICAgSU4gRUZJX1RQTCAgICAgICAgICAgICAgICAgICAgICBOb3RpZnlUcGwsCisgICAgSU4gRUZJX0VWRU5UX05PVElGWSAgICAgICAgICAgICBOb3RpZnlGdW5jdGlvbiwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpOb3RpZnlDb250ZXh0LAorICAgIE9VVCBFRklfRVZFTlQgICAgICAgICAgICAgICAgICAgKkV2ZW50CisgICAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUaW1lckNhbmNlbCwKKyAgICBUaW1lclBlcmlvZGljLAorICAgIFRpbWVyUmVsYXRpdmUsCisgICAgVGltZXJUeXBlTWF4Cit9IEVGSV9USU1FUl9ERUxBWTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9USU1FUikgKAorICAgIElOIEVGSV9FVkVOVCAgICAgICAgICAgICAgICBFdmVudCwKKyAgICBJTiBFRklfVElNRVJfREVMQVkgICAgICAgICAgVHlwZSwKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgVHJpZ2dlclRpbWUKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0lHTkFMX0VWRU5UKSAoCisgICAgSU4gRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50CisgICAgKTsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9XQUlUX0ZPUl9FVkVOVCkgKAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkV2ZW50cywKKyAgICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgKkV2ZW50LAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAqSW5kZXgKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ0xPU0VfRVZFTlQpICgKKyAgICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ0hFQ0tfRVZFTlQpICgKKyAgICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQKKyAgICApOworCisvLworLy8gVGFzayBwcmlvcml0eSBsZXZlbAorLy8KKworI2RlZmluZSBUUExfQVBQTElDQVRJT04gICAgNAorI2RlZmluZSBUUExfQ0FMTEJBQ0sgICAgICAgOAorI2RlZmluZSBUUExfTk9USUZZICAgICAgICAxNiAKKyNkZWZpbmUgVFBMX0hJR0hfTEVWRUwgICAgMzEgCisKK3R5cGVkZWYKK0VGSV9UUEwKKyhFRklBUEkgKkVGSV9SQUlTRV9UUEwpICgKKyAgICBJTiBFRklfVFBMICAgICAgTmV3VHBsCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1JFU1RPUkVfVFBMKSAoCisgICAgSU4gRUZJX1RQTCAgICAgIE9sZFRwbAorICAgICk7CisKKworLy8KKy8vIEVGSSBwbGF0Zm9ybSB2YXJpYmxlcworLy8KKworI2RlZmluZSBFRklfR0xPQkFMX1ZBUklBQkxFICAgICBcCisgICAgeyAweDhCRTRERjYxLCAweDkzQ0EsIDB4MTFkMiwgezB4QUEsIDB4MEQsIDB4MDAsIDB4RTAsIDB4OTgsIDB4MDMsIDB4MkIsIDB4OEN9IH0KKworLy8gVmFyaWFibGUgYXR0cmlidXRlcworI2RlZmluZSBFRklfVkFSSUFCTEVfTk9OX1ZPTEFUSUxFICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVGSV9WQVJJQUJMRV9CT09UU0VSVklDRV9BQ0NFU1MgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUZJX1ZBUklBQkxFX1JVTlRJTUVfQUNDRVNTICAgICAgICAgMHgwMDAwMDAwNAorCisvLyBWYXJpYWJsZSBzaXplIGxpbWl0YXRpb24KKyNkZWZpbmUgRUZJX01BWElNVU1fVkFSSUFCTEVfU0laRSAgICAgICAgICAgMTAyNAorCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX1ZBUklBQkxFKSAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqVmFyaWFibGVOYW1lLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgKlZlbmRvckd1aWQsCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAqQXR0cmlidXRlcyBPUFRJT05BTCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpEYXRhU2l6ZSwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICpEYXRhCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dFVF9ORVhUX1ZBUklBQkxFX05BTUUpICgKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpWYXJpYWJsZU5hbWVTaXplLAorICAgIElOIE9VVCBDSEFSMTYgICAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZSwKKyAgICBJTiBPVVQgRUZJX0dVSUQgICAgICAgICAgICAgICAgICpWZW5kb3JHdWlkCisgICAgKTsKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VUX1ZBUklBQkxFKSAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqVmFyaWFibGVOYW1lLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgKlZlbmRvckd1aWQsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqRGF0YQorICAgICk7CisKKworLy8KKy8vIEVGSSBUaW1lCisvLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBSZXNvbHV0aW9uOyAgICAgLy8gMWUtNiBwYXJ0cyBwZXIgbWlsbGlvbgorICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgQWNjdXJhY3k7ICAgICAgIC8vIGhlcnR6CisgICAgICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBTZXRzVG9aZXJvOyAgICAgLy8gU2V0IGNsZWFycyBzdWItc2Vjb25kIHRpbWUKK30gRUZJX1RJTUVfQ0FQQUJJTElUSUVTOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfVElNRSkgKAorICAgIE9VVCBFRklfVElNRSAgICAgICAgICAgICAgICAgICAgKlRpbWUsCisgICAgT1VUIEVGSV9USU1FX0NBUEFCSUxJVElFUyAgICAgICAqQ2FwYWJpbGl0aWVzIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9USU1FKSAoCisgICAgSU4gRUZJX1RJTUUgICAgICAgICAgICAgICAgICAgICAqVGltZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfV0FLRVVQX1RJTUUpICgKKyAgICBPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICpFbmFibGVkLAorICAgIE9VVCBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgKlBlbmRpbmcsCisgICAgT1VUIEVGSV9USU1FICAgICAgICAgICAgICAgICAgICAqVGltZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVRfV0FLRVVQX1RJTUUpICgKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSwKKyAgICBJTiBFRklfVElNRSAgICAgICAgICAgICAgICAgICAgICpUaW1lIE9QVElPTkFMCisgICAgKTsKKworCisvLworLy8gSW1hZ2UgZnVuY3Rpb25zCisvLworCisKKy8vIFBFMzIrIFN1YnN5c3RlbSB0eXBlIGZvciBFRkkgaW1hZ2VzCisKKyNpZiAhZGVmaW5lZChJTUFHRV9TVUJTWVNURU1fRUZJX0FQUExJQ0FUSU9OKQorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fRUZJX0FQUExJQ0FUSU9OICAgICAgICAgICAgIDEwCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9FRklfQk9PVF9TRVJWSUNFX0RSSVZFUiAgICAgMTEKKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX0VGSV9SVU5USU1FX0RSSVZFUiAgICAgICAgICAxMgorI2VuZGlmCisKKy8vIFBFMzIrIE1hY2hpbmUgdHlwZSBmb3IgRUZJIGltYWdlcworCisjaWYgIWRlZmluZWQoRUZJX0lNQUdFX01BQ0hJTkVfSUEzMikKKyNkZWZpbmUgRUZJX0lNQUdFX01BQ0hJTkVfSUEzMiAgICAgIDB4MDE0YworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChFRklfSU1BR0VfTUFDSElORV9JQTY0KQorI2RlZmluZSBFRklfSU1BR0VfTUFDSElORV9JQTY0ICAgICAgMHgwMjAwCisjZW5kaWYKKworLy8gSW1hZ2UgRW50cnkgcHJvdG90eXBlCisKK3R5cGVkZWYgCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU1BR0VfRU5UUllfUE9JTlQpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIElOIHN0cnVjdCBfRUZJX1NZU1RFTV9UQUJMRSAgICAgKlN5c3RlbVRhYmxlCisgICAgKTsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTUFHRV9MT0FEKSAoCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBCb290UG9saWN5LAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgUGFyZW50SW1hZ2VIYW5kbGUsCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAqRmlsZVBhdGgsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqU291cmNlQnVmZmVyICAgT1BUSU9OQUwsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VTaXplLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAgICAgKkltYWdlSGFuZGxlCisgICAgKTsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTUFHRV9TVEFSVCkgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGUsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqRXhpdERhdGFTaXplLAorICAgIE9VVCBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgKipFeGl0RGF0YSAgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRVhJVCkgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGUsCisgICAgSU4gRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgICBFeGl0U3RhdHVzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRXhpdERhdGFTaXplLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKkV4aXREYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTUFHRV9VTkxPQUQpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlCisgICAgKTsKKworCisvLyBJbWFnZSBoYW5kbGUKKyNkZWZpbmUgTE9BREVEX0lNQUdFX1BST1RPQ09MICAgICAgXAorICAgIHsgMHg1QjFCMzFBMSwgMHg5NTYyLCAweDExZDIsIHsweDhFLCAweDNGLCAweDAwLCAweEEwLCAweEM5LCAweDY5LCAweDcyLCAweDNCfSB9CisKKyNkZWZpbmUgRUZJX0lNQUdFX0lORk9STUFUSU9OX1JFVklTSU9OICAgICAgMHgxMDAwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgIFBhcmVudEhhbmRsZTsKKyAgICBzdHJ1Y3QgX0VGSV9TWVNURU1fVEFCTEUgICAgICAgICpTeXN0ZW1UYWJsZTsKKworICAgIC8vIFNvdXJjZSBsb2NhdGlvbiBvZiBpbWFnZQorICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSGFuZGxlOworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgKkZpbGVQYXRoOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlJlc2VydmVkOworCisgICAgLy8gSW1hZ2VzIGxvYWQgb3B0aW9ucworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZE9wdGlvbnNTaXplOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxvYWRPcHRpb25zOworCisgICAgLy8gTG9jYXRpb24gb2Ygd2hlcmUgaW1hZ2Ugd2FzIGxvYWRlZAorICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkltYWdlQmFzZTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlU2l6ZTsKKyAgICBFRklfTUVNT1JZX1RZUEUgICAgICAgICAgICAgICAgIEltYWdlQ29kZVR5cGU7CisgICAgRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgICAgICBJbWFnZURhdGFUeXBlOworCisgICAgLy8gSWYgdGhlIGRyaXZlciBpbWFnZSBzdXBwb3J0cyBhIGR5bmFtaWMgdW5sb2FkIHJlcXVlc3QKKyAgICBFRklfSU1BR0VfVU5MT0FEICAgICAgICAgICAgICAgIFVubG9hZDsKKworfSBFRklfTE9BREVEX0lNQUdFOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9FWElUX0JPT1RfU0VSVklDRVMpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgTWFwS2V5CisgICAgKTsKKworLy8KKy8vIE1pc2MKKy8vCisKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NUQUxMKSAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIE1pY3Jvc2Vjb25kcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVRfV0FUQ0hET0dfVElNRVIpICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgVGltZW91dCwKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgV2F0Y2hkb2dDb2RlLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBEYXRhU2l6ZSwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgKldhdGNoZG9nRGF0YSBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DT05ORUNUX0NPTlRST0xMRVIpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZSwKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgKkRyaXZlckltYWdlSGFuZGxlIE9QVElPTkFMLAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAqUmVtYWluaW5nRGV2aWNlUGF0aCBPUFRJT05BTCwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RJU0NPTk5FQ1RfQ09OVFJPTExFUikgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlLAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBEcml2ZXJJbWFnZUhhbmRsZSBPUFRJT05BTCwKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQ2hpbGRIYW5kbGUgT1BUSU9OQUwKKyAgICApOworCisjZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX0JZX0hBTkRMRV9QUk9UT0NPTCAgMHgwMDAwMDAwMQorI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9HRVRfUFJPVE9DT0wgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfVEVTVF9QUk9UT0NPTCAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX0JZX0NISUxEX0NPTlRST0xMRVIgMHgwMDAwMDAwOAorI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9CWV9EUklWRVIgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfRVhDTFVTSVZFICAgICAgICAgICAweDAwMDAwMDIwCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9PUEVOX1BST1RPQ09MKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqKkludGVyZmFjZSBPUFRJT05BTCwKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQWdlbnRIYW5kbGUsCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ0xPU0VfUFJPVE9DT0wpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgSGFuZGxlLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEFnZW50SGFuZGxlLAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICBBZ2VudEhhbmRsZTsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgT3BlbkNvdW50OworfSBFRklfT1BFTl9QUk9UT0NPTF9JTkZPUk1BVElPTl9FTlRSWTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT04pICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgSGFuZGxlLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgT1VUIEVGSV9PUEVOX1BST1RPQ09MX0lORk9STUFUSU9OX0VOVFJZICoqRW50cnlCdWZmZXIsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICpFbnRyeUNvdW50CisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BST1RPQ09MU19QRVJfSEFORExFKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBPVVQgRUZJX0dVSUQgICAgICAgICAgICAgICAgKioqUHJvdG9jb2xCdWZmZXIsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICpQcm90b2NvbEJ1ZmZlckNvdW50CisgICAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBbGxIYW5kbGVzLAorICAgIEJ5UmVnaXN0ZXJOb3RpZnksCisgICAgQnlQcm90b2NvbAorfSBFRklfTE9DQVRFX1NFQVJDSF9UWVBFOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfTE9DQVRFX0hBTkRMRV9CVUZGRVIpICgKKyAgICBJTiBFRklfTE9DQVRFX1NFQVJDSF9UWVBFICAgU2VhcmNoVHlwZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sIE9QVElPTkFMLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU2VhcmNoS2V5IE9QVElPTkFMLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAqTm9IYW5kbGVzLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAqKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9MT0NBVEVfUFJPVE9DT0wpICgKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqUmVnaXN0cmF0aW9uIE9QVElPTkFMLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqKkludGVyZmFjZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTlNUQUxMX01VTFRJUExFX1BST1RPQ09MX0lOVEVSRkFDRVMpICgKKyAgICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgKkhhbmRsZSwKKyAgICAuLi4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVU5JTlNUQUxMX01VTFRJUExFX1BST1RPQ09MX0lOVEVSRkFDRVMpICgKKyAgICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgSGFuZGxlLAorICAgIC4uLgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DQUxDVUxBVEVfQ1JDMzIpICgKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkRhdGEsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIERhdGFTaXplLAorICAgIE9VVCBVSU5UMzIgICAgICAgICAgICAgICAgICAqQ3JjMzIKKyAgICApOworCit0eXBlZGVmCitWT0lECisoRUZJQVBJICpFRklfQ09QWV9NRU0pICgKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkRlc3RpbmF0aW9uLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU291cmNlLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBMZW5ndGgKKyAgICApOworCit0eXBlZGVmCitWT0lECisoRUZJQVBJICpFRklfU0VUX01FTSkgKAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBTaXplLAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBWYWx1ZQorICAgICk7CisKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0NSRUFURV9FVkVOVF9FWCkgKAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICBUeXBlLAorICAgIElOIEVGSV9UUEwgICAgICAgICAgICAgICAgICBOb3RpZnlUcGwsCisgICAgSU4gRUZJX0VWRU5UX05PVElGWSAgICAgICAgIE5vdGlmeUZ1bmN0aW9uIE9QVElPTkFMLAorICAgIElOIGNvbnN0IFZPSUQgICAgICAgICAgICAgICAqTm90aWZ5Q29udGV4dCBPUFRJT05BTCwKKyAgICBJTiBjb25zdCBFRklfR1VJRCAgICAgICAgICAgRXZlbnRHcm91cCBPUFRJT05BTCwKKyAgICBPVVQgRUZJX0VWRU5UICAgICAgICAgICAgICAgKkV2ZW50CisgICAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFZmlSZXNldENvbGQsCisgICAgRWZpUmVzZXRXYXJtLAorICAgIEVmaVJlc2V0U2h1dGRvd24KK30gRUZJX1JFU0VUX1RZUEU7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRVNFVF9TWVNURU0pICgKKyAgICBJTiBFRklfUkVTRVRfVFlQRSAgICAgICAgICAgUmVzZXRUeXBlLAorICAgIElOIEVGSV9TVEFUVVMgICAgICAgICAgICAgICBSZXNldFN0YXR1cywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgRGF0YVNpemUsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICpSZXNldERhdGEgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX05FWFRfTU9OT1RPTklDX0NPVU5UKSAoCisgICAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICpDb3VudAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfTkVYVF9ISUdIX01PTk9fQ09VTlQpICgKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgKkhpZ2hDb3VudAorICAgICk7CisKKy8vCisvLyBQcm90b2NvbCBoYW5kbGVyIGZ1bmN0aW9ucworLy8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBFRklfTkFUSVZFX0lOVEVSRkFDRSwKKyAgICBFRklfUENPREVfSU5URVJGQUNFCit9IEVGSV9JTlRFUkZBQ0VfVFlQRTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFKSAoCisgICAgSU4gT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICpIYW5kbGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBJTiBFRklfSU5URVJGQUNFX1RZUEUgICAgICAgSW50ZXJmYWNlVHlwZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkludGVyZmFjZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRUlOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqT2xkSW50ZXJmYWNlLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqTmV3SW50ZXJmYWNlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VOSU5TVEFMTF9QUk9UT0NPTF9JTlRFUkZBQ0UpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgSGFuZGxlLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpJbnRlcmZhY2UKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSEFORExFX1BST1RPQ09MKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqKkludGVyZmFjZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfUkVHSVNURVJfUFJPVE9DT0xfTk9USUZZKSAoCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICoqUmVnaXN0cmF0aW9uCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0xPQ0FURV9IQU5ETEUpICgKKyAgICBJTiBFRklfTE9DQVRFX1NFQVJDSF9UWVBFICAgU2VhcmNoVHlwZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sIE9QVElPTkFMLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU2VhcmNoS2V5IE9QVElPTkFMLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9MT0NBVEVfREVWSUNFX1BBVEgpICgKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIElOIE9VVCBFRklfREVWSUNFX1BBVEggICAgICAqKkRldmljZVBhdGgsCisgICAgT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICAgICpEZXZpY2UKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU5TVEFMTF9DT05GSUdVUkFUSU9OX1RBQkxFKSAoCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpHdWlkLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqVGFibGUKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUkVTRVJWRURfU0VSVklDRSkgKAorICAgICk7CisKKy8vCisvLyBTdGFuZGFyZCBFRkkgdGFibGUgaGVhZGVyCisvLworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1RBQkxFX0hFQVJERVIgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBDUkMzMjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7Cit9IEVGSV9UQUJMRV9IRUFERVI7CisKKworLy8KKy8vIEVGSSBSdW50aW1lIFNlcml2Y2VzIFRhYmxlCisvLworCisjZGVmaW5lIEVGSV9SVU5USU1FX1NFUlZJQ0VTX1NJR05BVFVSRSAgMHg1NjUyNDU1MzU0NGU1NTUyCisjZGVmaW5lIEVGSV9SVU5USU1FX1NFUlZJQ0VTX1JFVklTSU9OICAgKEVGSV9TUEVDSUZJQ0FUSU9OX01BSk9SX1JFVklTSU9OPDwxNikgfCAoRUZJX1NQRUNJRklDQVRJT05fTUlOT1JfUkVWSVNJT04pCisKK3R5cGVkZWYgc3RydWN0ICB7CisgICAgRUZJX1RBQkxFX0hFQURFUiAgICAgICAgICAgICAgICBIZHI7CisKKyAgICAvLworICAgIC8vIFRpbWUgc2VydmljZXMKKyAgICAvLworCisgICAgRUZJX0dFVF9USU1FICAgICAgICAgICAgICAgICAgICBHZXRUaW1lOworICAgIEVGSV9TRVRfVElNRSAgICAgICAgICAgICAgICAgICAgU2V0VGltZTsKKyAgICBFRklfR0VUX1dBS0VVUF9USU1FICAgICAgICAgICAgIEdldFdha2V1cFRpbWU7CisgICAgRUZJX1NFVF9XQUtFVVBfVElNRSAgICAgICAgICAgICBTZXRXYWtldXBUaW1lOworCisgICAgLy8KKyAgICAvLyBWaXJ0dWFsIG1lbW9yeSBzZXJ2aWNlcworICAgIC8vCisKKyAgICBFRklfU0VUX1ZJUlRVQUxfQUREUkVTU19NQVAgICAgIFNldFZpcnR1YWxBZGRyZXNzTWFwOworICAgIEVGSV9DT05WRVJUX1BPSU5URVIgICAgICAgICAgICAgQ29udmVydFBvaW50ZXI7CisKKyAgICAvLworICAgIC8vIFZhcmlhYmxlIHNlcnZpZXJzCisgICAgLy8KKworICAgIEVGSV9HRVRfVkFSSUFCTEUgICAgICAgICAgICAgICAgR2V0VmFyaWFibGU7CisgICAgRUZJX0dFVF9ORVhUX1ZBUklBQkxFX05BTUUgICAgICBHZXROZXh0VmFyaWFibGVOYW1lOworICAgIEVGSV9TRVRfVkFSSUFCTEUgICAgICAgICAgICAgICAgU2V0VmFyaWFibGU7CisKKyAgICAvLworICAgIC8vIE1pc2MKKyAgICAvLworCisgICAgRUZJX0dFVF9ORVhUX0hJR0hfTU9OT19DT1VOVCAgICBHZXROZXh0SGlnaE1vbm90b25pY0NvdW50OworICAgIEVGSV9SRVNFVF9TWVNURU0gICAgICAgICAgICAgICAgUmVzZXRTeXN0ZW07CisKK30gRUZJX1JVTlRJTUVfU0VSVklDRVM7CisKKworLy8KKy8vIEVGSSBCb290IFNlcnZpY2VzIFRhYmxlCisvLworCisjZGVmaW5lIEVGSV9CT09UX1NFUlZJQ0VTX1NJR05BVFVSRSAgICAgMHg1NjUyNDU1MzU0NGY0ZjQyCisjZGVmaW5lIEVGSV9CT09UX1NFUlZJQ0VTX1JFVklTSU9OICAgICAgKEVGSV9TUEVDSUZJQ0FUSU9OX01BSk9SX1JFVklTSU9OPDwxNikgfCAoRUZJX1NQRUNJRklDQVRJT05fTUlOT1JfUkVWSVNJT04pCisKK3R5cGVkZWYgc3RydWN0IF9FRklfQk9PVF9TRVJWSUNFUyB7CisKKyAgICBFRklfVEFCTEVfSEVBREVSICAgICAgICAgICAgICAgIEhkcjsKKworICAgIC8vCisgICAgLy8gVGFzayBwcmlvcml0eSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgRUZJX1JBSVNFX1RQTCAgICAgICAgICAgICAgICAgICBSYWlzZVRQTDsKKyAgICBFRklfUkVTVE9SRV9UUEwgICAgICAgICAgICAgICAgIFJlc3RvcmVUUEw7CisKKyAgICAvLworICAgIC8vIE1lbW9yeSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgRUZJX0FMTE9DQVRFX1BBR0VTICAgICAgICAgICAgICBBbGxvY2F0ZVBhZ2VzOworICAgIEVGSV9GUkVFX1BBR0VTICAgICAgICAgICAgICAgICAgRnJlZVBhZ2VzOworICAgIEVGSV9HRVRfTUVNT1JZX01BUCAgICAgICAgICAgICAgR2V0TWVtb3J5TWFwOworICAgIEVGSV9BTExPQ0FURV9QT09MICAgICAgICAgICAgICAgQWxsb2NhdGVQb29sOworICAgIEVGSV9GUkVFX1BPT0wgICAgICAgICAgICAgICAgICAgRnJlZVBvb2w7CisKKyAgICAvLworICAgIC8vIEV2ZW50ICYgdGltZXIgZnVuY3Rpb25zCisgICAgLy8KKworICAgIEVGSV9DUkVBVEVfRVZFTlQgICAgICAgICAgICAgICAgQ3JlYXRlRXZlbnQ7CisgICAgRUZJX1NFVF9USU1FUiAgICAgICAgICAgICAgICAgICBTZXRUaW1lcjsKKyAgICBFRklfV0FJVF9GT1JfRVZFTlQgICAgICAgICAgICAgIFdhaXRGb3JFdmVudDsKKyAgICBFRklfU0lHTkFMX0VWRU5UICAgICAgICAgICAgICAgIFNpZ25hbEV2ZW50OworICAgIEVGSV9DTE9TRV9FVkVOVCAgICAgICAgICAgICAgICAgQ2xvc2VFdmVudDsKKyAgICBFRklfQ0hFQ0tfRVZFTlQgICAgICAgICAgICAgICAgIENoZWNrRXZlbnQ7CisKKyAgICAvLworICAgIC8vIFByb3RvY29sIGhhbmRsZXIgZnVuY3Rpb25zCisgICAgLy8KKworICAgIEVGSV9JTlNUQUxMX1BST1RPQ09MX0lOVEVSRkFDRSAgSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlOworICAgIEVGSV9SRUlOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFIFJlaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlOworICAgIEVGSV9VTklOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFIFVuaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlOworICAgIEVGSV9IQU5ETEVfUFJPVE9DT0wgICAgICAgICAgICAgSGFuZGxlUHJvdG9jb2w7CisgICAgRUZJX0hBTkRMRV9QUk9UT0NPTCAgICAgICAgICAgICBQQ0hhbmRsZVByb3RvY29sOworICAgIEVGSV9SRUdJU1RFUl9QUk9UT0NPTF9OT1RJRlkgICAgUmVnaXN0ZXJQcm90b2NvbE5vdGlmeTsKKyAgICBFRklfTE9DQVRFX0hBTkRMRSAgICAgICAgICAgICAgIExvY2F0ZUhhbmRsZTsKKyAgICBFRklfTE9DQVRFX0RFVklDRV9QQVRIICAgICAgICAgIExvY2F0ZURldmljZVBhdGg7CisgICAgRUZJX0lOU1RBTExfQ09ORklHVVJBVElPTl9UQUJMRSBJbnN0YWxsQ29uZmlndXJhdGlvblRhYmxlOworCisgICAgLy8KKyAgICAvLyBJbWFnZSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgRUZJX0lNQUdFX0xPQUQgICAgICAgICAgICAgICAgICBMb2FkSW1hZ2U7CisgICAgRUZJX0lNQUdFX1NUQVJUICAgICAgICAgICAgICAgICBTdGFydEltYWdlOworICAgIEVGSV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgRXhpdDsKKyAgICBFRklfSU1BR0VfVU5MT0FEICAgICAgICAgICAgICAgIFVubG9hZEltYWdlOworICAgIEVGSV9FWElUX0JPT1RfU0VSVklDRVMgICAgICAgICAgRXhpdEJvb3RTZXJ2aWNlczsKKworICAgIC8vCisgICAgLy8gTWlzYyBmdW5jdGlvbnMKKyAgICAvLworCisgICAgRUZJX0dFVF9ORVhUX01PTk9UT05JQ19DT1VOVCAgICBHZXROZXh0TW9ub3RvbmljQ291bnQ7CisgICAgRUZJX1NUQUxMICAgICAgICAgICAgICAgICAgICAgICBTdGFsbDsKKyAgICBFRklfU0VUX1dBVENIRE9HX1RJTUVSICAgICAgICAgIFNldFdhdGNoZG9nVGltZXI7CisKKyAgICAvLworICAgIC8vIERyaXZlclN1cHBvcnQgU2VydmljZXMKKyAgICAvLworCisgICAgRUZJX0NPTk5FQ1RfQ09OVFJPTExFUiAgICAgICAgICBDb25uZWN0Q29udHJvbGxlcjsKKyAgICBFRklfRElTQ09OTkVDVF9DT05UUk9MTEVSICAgICAgIERpc2Nvbm5lY3RDb250cm9sbGVyOworCisgICAgLy8KKyAgICAvLyBPcGVuIGFuZCBDbG9zZSBQcm90b2NvbCBTZXJ2aWNlcworICAgIC8vCisgICAgRUZJX09QRU5fUFJPVE9DT0wgICAgICAgICAgICAgICBPcGVuUHJvdG9jb2w7CisgICAgRUZJX0NMT1NFX1BST1RPQ09MICAgICAgICAgICAgICBDbG9zZVByb3RvY29sOworICAgIEVGSV9PUEVOX1BST1RPQ09MX0lORk9STUFUSU9OICAgT3BlblByb3RvY29sSW5mb3JtYXRpb247CisKKyAgICAvLworICAgIC8vIExpYnJhcnkgU2VydmljZXMKKyAgICAvLworICAgIEVGSV9QUk9UT0NPTFNfUEVSX0hBTkRMRSAgICAgICAgUHJvdG9jb2xzUGVySGFuZGxlOworICAgIEVGSV9MT0NBVEVfSEFORExFX0JVRkZFUiAgICAgICAgTG9jYXRlSGFuZGxlQnVmZmVyOworICAgIEVGSV9MT0NBVEVfUFJPVE9DT0wgICAgICAgICAgICAgTG9jYXRlUHJvdG9jb2w7CisgICAgRUZJX0lOU1RBTExfTVVMVElQTEVfUFJPVE9DT0xfSU5URVJGQUNFUyBJbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVyZmFjZXM7CisgICAgRUZJX1VOSU5TVEFMTF9NVUxUSVBMRV9QUk9UT0NPTF9JTlRFUkZBQ0VTIFVuaW5zdGFsbE11bHRpcGxlUHJvdG9jb2xJbnRlcmZhY2VzOworCisgICAgLy8KKyAgICAvLyAzMi1iaXQgQ1JDIFNlcnZpY2VzCisgICAgLy8KKyAgICBFRklfQ0FMQ1VMQVRFX0NSQzMyICAgICAgICAgICAgIENhbGN1bGF0ZUNyYzMyOworCisgICAgLy8KKyAgICAvLyBNaXNjIFNlcnZpY2VzCisgICAgLy8KKyAgICBFRklfQ09QWV9NRU0gICAgICAgICAgICAgICAgICAgIENvcHlNZW07CisgICAgRUZJX1NFVF9NRU0gICAgICAgICAgICAgICAgICAgICBTZXRNZW07CisgICAgRUZJX0NSRUFURV9FVkVOVF9FWCAgICAgICAgICAgICBDcmVhdGVFdmVudEV4OworfSBFRklfQk9PVF9TRVJWSUNFUzsKKworCisvLworLy8gRUZJIENvbmZpZ3VyYXRpb24gVGFibGUgYW5kIEdVSUQgZGVmaW5pdGlvbnMKKy8vCisKKyNkZWZpbmUgTVBTX1RBQkxFX0dVSUQgICAgXAorICAgIHsgMHhlYjlkMmQyZiwgMHgyZDg4LCAweDExZDMsIHsweDlhLCAweDE2LCAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworI2RlZmluZSBBQ1BJX1RBQkxFX0dVSUQgICAgXAorICAgIHsgMHhlYjlkMmQzMCwgMHgyZDg4LCAweDExZDMsIHsweDlhLCAweDE2LCAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworI2RlZmluZSBBQ1BJXzIwX1RBQkxFX0dVSUQgIFwKKyAgICB7IDB4ODg2OGU4NzEsIDB4ZTRmMSwgMHgxMWQzLCB7MHhiYywgMHgyMiwgMHgwLCAweDgwLCAweGM3LCAweDNjLCAweDg4LCAweDgxfSB9CisKKyNkZWZpbmUgU01CSU9TX1RBQkxFX0dVSUQgICAgXAorICAgIHsgMHhlYjlkMmQzMSwgMHgyZDg4LCAweDExZDMsIHsweDlhLCAweDE2LCAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworI2RlZmluZSBTQUxfU1lTVEVNX1RBQkxFX0dVSUQgICAgXAorICAgIHsgMHhlYjlkMmQzMiwgMHgyZDg4LCAweDExZDMsIHsweDlhLCAweDE2LCAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0NPTkZJR1VSQVRJT05fVEFCTEUgeworICAgIEVGSV9HVUlEICAgICAgICAgICAgICAgIFZlbmRvckd1aWQ7CisgICAgVk9JRCAgICAgICAgICAgICAgICAgICAgKlZlbmRvclRhYmxlOworfSBFRklfQ09ORklHVVJBVElPTl9UQUJMRTsKKworCisvLworLy8gRUZJIFN5c3RlbSBUYWJsZQorLy8KKworCisKKworI2RlZmluZSBFRklfU1lTVEVNX1RBQkxFX1NJR05BVFVSRSAgICAgIDB4NTQ1MzU5NTMyMDQ5NDI0OQorI2RlZmluZSBFRklfU1lTVEVNX1RBQkxFX1JFVklTSU9OICAgICAgKEVGSV9TUEVDSUZJQ0FUSU9OX01BSk9SX1JFVklTSU9OPDwxNikgfCAoRUZJX1NQRUNJRklDQVRJT05fTUlOT1JfUkVWSVNJT04pCisKK3R5cGVkZWYgc3RydWN0IF9FRklfU1lTVEVNX1RBQkxFIHsKKyAgICBFRklfVEFCTEVfSEVBREVSICAgICAgICAgICAgICAgIEhkcjsKKworICAgIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKkZpcm13YXJlVmVuZG9yOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlybXdhcmVSZXZpc2lvbjsKKworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZUluSGFuZGxlOworICAgIFNJTVBMRV9JTlBVVF9JTlRFUkZBQ0UgICAgICAgICAgKkNvbkluOworCisgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlT3V0SGFuZGxlOworICAgIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgKkNvbk91dDsKKworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRFcnJvckhhbmRsZTsKKyAgICBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICpTdGRFcnI7CisKKyAgICBFRklfUlVOVElNRV9TRVJWSUNFUyAgICAgICAgICAgICpSdW50aW1lU2VydmljZXM7CisgICAgRUZJX0JPT1RfU0VSVklDRVMgICAgICAgICAgICAgICAqQm9vdFNlcnZpY2VzOworCisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlRhYmxlRW50cmllczsKKyAgICBFRklfQ09ORklHVVJBVElPTl9UQUJMRSAgICAgICAgICpDb25maWd1cmF0aW9uVGFibGU7CisKK30gRUZJX1NZU1RFTV9UQUJMRTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWNvbi5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpY29uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5ZGI5OAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWNvbi5oCkBAIC0wLDAgKzEsMzAyIEBACisjaWZuZGVmIF9FRklfQ09OX0gKKyNkZWZpbmUgX0VGSV9DT05fSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmljb24uaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBjb25zb2xlIHByb3RvY29scworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBUZXh0IG91dHB1dCBwcm90b2NvbAorLy8KKworI2RlZmluZSBTSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0wgXAorICAgIHsgMHgzODc0NzdjMiwgMHg2OWM3LCAweDExZDIsIHsweDhlLCAweDM5LCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworSU5URVJGQUNFX0RFQ0woX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9SRVNFVCkgKAorICAgIElOIHN0cnVjdCBfU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFZlcmlmaWNhdGlvbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX09VVFBVVF9TVFJJTkcpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKlN0cmluZworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX1RFU1RfU1RSSU5HKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICpTdHJpbmcKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9RVUVSWV9NT0RFKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVOdW1iZXIsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqQ29sdW1ucywKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpSb3dzCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RFWFRfU0VUX01PREUpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgTW9kZU51bWJlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX1NFVF9BVFRSSUJVVEUpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlCisgICAgKTsKKworI2RlZmluZSBFRklfQkxBQ0sgICAweDAwCisjZGVmaW5lIEVGSV9CTFVFICAgIDB4MDEKKyNkZWZpbmUgRUZJX0dSRUVOICAgMHgwMgorI2RlZmluZSBFRklfQ1lBTiAgICAgICAgICAgIChFRklfQkxVRSB8IEVGSV9HUkVFTikKKyNkZWZpbmUgRUZJX1JFRCAgICAgMHgwNAorI2RlZmluZSBFRklfTUFHRU5UQSAgICAgICAgIChFRklfQkxVRSB8IEVGSV9SRUQpCisjZGVmaW5lIEVGSV9CUk9XTiAgICAgICAgICAgKEVGSV9HUkVFTiB8IEVGSV9SRUQpCisjZGVmaW5lIEVGSV9MSUdIVEdSQVkgICAgICAgKEVGSV9CTFVFIHwgRUZJX0dSRUVOIHwgRUZJX1JFRCkKKyNkZWZpbmUgRUZJX0JSSUdIVCAgMHgwOAorI2RlZmluZSBFRklfREFSS0dSQVkgICAgICAgIChFRklfQlJJR0hUKQorI2RlZmluZSBFRklfTElHSFRCTFVFICAgICAgIChFRklfQkxVRSB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVEdSRUVOICAgICAgKEVGSV9HUkVFTiB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVENZQU4gICAgICAgKEVGSV9DWUFOIHwgRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX0xJR0hUUkVEICAgICAgICAoRUZJX1JFRCB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVE1BR0VOVEEgICAgKEVGSV9NQUdFTlRBIHwgRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX1lFTExPVyAgICAgICAgICAoRUZJX0JST1dOIHwgRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX1dISVRFICAgICAgICAgICAoRUZJX0JMVUUgfCBFRklfR1JFRU4gfCBFRklfUkVEIHwgRUZJX0JSSUdIVCkKKworI2RlZmluZSBFRklfVEVYVF9BVFRSKGYsYikgICgoZikgfCAoKGIpIDw8IDQpKQorCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0JMQUNLICAgICAgICAweDAwCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0JMVUUgICAgICAgICAweDEwCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0dSRUVOICAgICAgICAweDIwCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0NZQU4gICAgICAgICAoRUZJX0JBQ0tHUk9VTkRfQkxVRSB8IEVGSV9CQUNLR1JPVU5EX0dSRUVOKQorI2RlZmluZSBFRklfQkFDS0dST1VORF9SRUQgICAgICAgICAgMHg0MAorI2RlZmluZSBFRklfQkFDS0dST1VORF9NQUdFTlRBICAgICAgKEVGSV9CQUNLR1JPVU5EX0JMVUUgfCBFRklfQkFDS0dST1VORF9SRUQpCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0JST1dOICAgICAgICAoRUZJX0JBQ0tHUk9VTkRfR1JFRU4gfCBFRklfQkFDS0dST1VORF9SRUQpCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0xJR0hUR1JBWSAgICAoRUZJX0JBQ0tHUk9VTkRfQkxVRSB8IEVGSV9CQUNLR1JPVU5EX0dSRUVOIHwgRUZJX0JBQ0tHUk9VTkRfUkVEKQorCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX0NMRUFSX1NDUkVFTikgKAorICAgIElOIHN0cnVjdCBfU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKlRoaXMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9TRVRfQ1VSU09SX1BPU0lUSU9OKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbiwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIFJvdworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX0VOQUJMRV9DVVJTT1IpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgRW5hYmxlCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIElOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TW9kZTsKKyAgICAvLyBjdXJyZW50IHNldHRpbmdzCisgICAgSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlOworICAgIElOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOworICAgIElOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yQ29sdW1uOworICAgIElOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yUm93OworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yVmlzaWJsZTsKK30gU0lNUExFX1RFWFRfT1VUUFVUX01PREU7CisKK3R5cGVkZWYgc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFIHsKKyAgICBFRklfVEVYVF9SRVNFVCAgICAgICAgICAgICAgICAgIFJlc2V0OworCisgICAgRUZJX1RFWFRfT1VUUFVUX1NUUklORyAgICAgICAgICBPdXRwdXRTdHJpbmc7CisgICAgRUZJX1RFWFRfVEVTVF9TVFJJTkcgICAgICAgICAgICBUZXN0U3RyaW5nOworCisgICAgRUZJX1RFWFRfUVVFUllfTU9ERSAgICAgICAgICAgICBRdWVyeU1vZGU7CisgICAgRUZJX1RFWFRfU0VUX01PREUgICAgICAgICAgICAgICBTZXRNb2RlOworICAgIEVGSV9URVhUX1NFVF9BVFRSSUJVVEUgICAgICAgICAgU2V0QXR0cmlidXRlOworCisgICAgRUZJX1RFWFRfQ0xFQVJfU0NSRUVOICAgICAgICAgICBDbGVhclNjcmVlbjsKKyAgICBFRklfVEVYVF9TRVRfQ1VSU09SX1BPU0lUSU9OICAgIFNldEN1cnNvclBvc2l0aW9uOworICAgIEVGSV9URVhUX0VOQUJMRV9DVVJTT1IgICAgICAgICAgRW5hYmxlQ3Vyc29yOworCisgICAgLy8gQ3VycmVudCBtb2RlCisgICAgU0lNUExFX1RFWFRfT1VUUFVUX01PREUgICAgICAgICAqTW9kZTsKK30gU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRTsKKworLy8KKy8vIERlZmluZSdzIGZvciByZXF1aXJlZCBFRkkgVW5pY29kZSBCb3ggRHJhdyBjaGFyYWN0ZXIKKy8vCisKKyNkZWZpbmUgQk9YRFJBV19IT1JJWk9OVEFMICAgICAgICAgICAgICAgICAgMHgyNTAwCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUwgICAgICAgICAgICAgICAgICAgIDB4MjUwMgorI2RlZmluZSBCT1hEUkFXX0RPV05fUklHSFQgICAgICAgICAgICAgICAgICAweDI1MGMKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0xFRlQgICAgICAgICAgICAgICAgICAgMHgyNTEwCisjZGVmaW5lIEJPWERSQVdfVVBfUklHSFQgICAgICAgICAgICAgICAgICAgIDB4MjUxNAorI2RlZmluZSBCT1hEUkFXX1VQX0xFRlQgICAgICAgICAgICAgICAgICAgICAweDI1MTgKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9SSUdIVCAgICAgICAgICAgICAgMHgyNTFjCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfTEVGVCAgICAgICAgICAgICAgIDB4MjUyNAorI2RlZmluZSBCT1hEUkFXX0RPV05fSE9SSVpPTlRBTCAgICAgICAgICAgICAweDI1MmMKKyNkZWZpbmUgQk9YRFJBV19VUF9IT1JJWk9OVEFMICAgICAgICAgICAgICAgMHgyNTM0CisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfSE9SSVpPTlRBTCAgICAgICAgIDB4MjUzYworCisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX0hPUklaT05UQUwgICAgICAgICAgIDB4MjU1MAorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9WRVJUSUNBTCAgICAgICAgICAgICAweDI1NTEKKyNkZWZpbmUgQk9YRFJBV19ET1dOX1JJR0hUX0RPVUJMRSAgICAgICAgICAgMHgyNTUyCisjZGVmaW5lIEJPWERSQVdfRE9XTl9ET1VCTEVfUklHSFQgICAgICAgICAgIDB4MjU1MworI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9ET1dOX1JJR0hUICAgICAgICAgICAweDI1NTQKKworI2RlZmluZSBCT1hEUkFXX0RPV05fTEVGVF9ET1VCTEUgICAgICAgICAgICAweDI1NTUKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0RPVUJMRV9MRUZUICAgICAgICAgICAgMHgyNTU2CisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX0RPV05fTEVGVCAgICAgICAgICAgIDB4MjU1NworCisjZGVmaW5lIEJPWERSQVdfVVBfUklHSFRfRE9VQkxFICAgICAgICAgICAgIDB4MjU1OAorI2RlZmluZSBCT1hEUkFXX1VQX0RPVUJMRV9SSUdIVCAgICAgICAgICAgICAweDI1NTkKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfVVBfUklHSFQgICAgICAgICAgICAgMHgyNTVhCisKKyNkZWZpbmUgQk9YRFJBV19VUF9MRUZUX0RPVUJMRSAgICAgICAgICAgICAgMHgyNTViCisjZGVmaW5lIEJPWERSQVdfVVBfRE9VQkxFX0xFRlQgICAgICAgICAgICAgIDB4MjU1YworI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9VUF9MRUZUICAgICAgICAgICAgICAweDI1NWQKKworI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX1JJR0hUX0RPVUJMRSAgICAgICAweDI1NWUKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9ET1VCTEVfUklHSFQgICAgICAgMHgyNTVmCisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX1ZFUlRJQ0FMX1JJR0hUICAgICAgIDB4MjU2MAorCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfTEVGVF9ET1VCTEUgICAgICAgIDB4MjU2MQorI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX0RPVUJMRV9MRUZUICAgICAgICAweDI1NjIKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfVkVSVElDQUxfTEVGVCAgICAgICAgMHgyNTYzCisKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0hPUklaT05UQUxfRE9VQkxFICAgICAgMHgyNTY0CisjZGVmaW5lIEJPWERSQVdfRE9XTl9ET1VCTEVfSE9SSVpPTlRBTCAgICAgIDB4MjU2NQorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9ET1dOX0hPUklaT05UQUwgICAgICAweDI1NjYKKworI2RlZmluZSBCT1hEUkFXX1VQX0hPUklaT05UQUxfRE9VQkxFICAgICAgICAweDI1NjcKKyNkZWZpbmUgQk9YRFJBV19VUF9ET1VCTEVfSE9SSVpPTlRBTCAgICAgICAgMHgyNTY4CisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX1VQX0hPUklaT05UQUwgICAgICAgIDB4MjU2OQorCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfSE9SSVpPTlRBTF9ET1VCTEUgIDB4MjU2YQorI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX0RPVUJMRV9IT1JJWk9OVEFMICAweDI1NmIKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfVkVSVElDQUxfSE9SSVpPTlRBTCAgMHgyNTZjCisKKy8vCisvLyBFRkkgUmVxdWlyZWQgQmxvY2sgRWxlbWVudHMgQ29kZSBDaGFydAorLy8KKworI2RlZmluZSBCTE9DS0VMRU1FTlRfRlVMTF9CTE9DSyAgICAgICAgICAgICAweDI1ODgKKyNkZWZpbmUgQkxPQ0tFTEVNRU5UX0xJR0hUX1NIQURFICAgICAgICAgICAgMHgyNTkxCisvLworLy8gRUZJIFJlcXVpcmVkIEdlb21ldHJpYyBTaGFwZXMgQ29kZSBDaGFydAorLy8KKworI2RlZmluZSBHRU9NRVRSSUNTSEFQRV9VUF9UUklBTkdMRSAgICAgICAgICAgMHgyNWIyCisjZGVmaW5lIEdFT01FVFJJQ1NIQVBFX1JJR0hUX1RSSUFOR0xFICAgICAgICAweDI1YmEKKyNkZWZpbmUgR0VPTUVUUklDU0hBUEVfRE9XTl9UUklBTkdMRSAgICAgICAgIDB4MjViYworI2RlZmluZSBHRU9NRVRSSUNTSEFQRV9MRUZUX1RSSUFOR0xFICAgICAgICAgMHgyNWM0CisKKy8vCisvLyBFRkkgUmVxdWlyZWQgQXJyb3cgc2hhcGVzCisvLworCisjZGVmaW5lIEFSUk9XX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE5MQorI2RlZmluZSBBUlJPV19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxOTMKKworLy8KKy8vIFRleHQgaW5wdXQgcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgU0lNUExFX1RFWFRfSU5QVVRfUFJPVE9DT0wgIFwKKyAgICB7IDB4Mzg3NDc3YzEsIDB4NjljNywgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKK0lOVEVSRkFDRV9ERUNMKF9TSU1QTEVfSU5QVVRfSU5URVJGQUNFKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYW5Db2RlOworICAgIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVDaGFyOworfSBFRklfSU5QVVRfS0VZOworCisvLworLy8gQmFzZWxpbmUgdW5pY29kZSBjb250cm9sIGNoYXJzCisvLworCisjZGVmaW5lIENIQVJfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIENIQVJfQkFDS1NQQUNFICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIENIQVJfVEFCICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIENIQVJfTElORUZFRUQgICAgICAgICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIENIQVJfQ0FSUklBR0VfUkVUVVJOICAgICAgICAgICAgMHgwMDBECisKKy8vCisvLyBTY2FuIGNvZGVzIGZvciBiYXNlIGxpbmUga2V5cworLy8KKworI2RlZmluZSBTQ0FOX05VTEwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTQ0FOX1VQICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTQ0FOX0RPV04gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBTQ0FOX1JJR0hUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBTQ0FOX0xFRlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBTQ0FOX0hPTUUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBTQ0FOX0VORCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBTQ0FOX0lOU0VSVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBTQ0FOX0RFTEVURSAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBTQ0FOX1BBR0VfVVAgICAgICAgICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBTQ0FOX1BBR0VfRE9XTiAgICAgICAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBTQ0FOX0YxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBTQ0FOX0YyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBTQ0FOX0YzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRAorI2RlZmluZSBTQ0FOX0Y0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBTQ0FOX0Y1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRgorI2RlZmluZSBTQ0FOX0Y2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBTQ0FOX0Y3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMQorI2RlZmluZSBTQ0FOX0Y4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMgorI2RlZmluZSBTQ0FOX0Y5ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMworI2RlZmluZSBTQ0FOX0YxMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBTQ0FOX0VTQyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU5QVVRfUkVTRVQpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9JTlBVVF9JTlRFUkZBQ0UgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFZlcmlmaWNhdGlvbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTlBVVF9SRUFEX0tFWSkgKAorICAgIElOIHN0cnVjdCBfU0lNUExFX0lOUFVUX0lOVEVSRkFDRSAgICpUaGlzLAorICAgIE9VVCBFRklfSU5QVVRfS0VZICAgICAgICAgICAgICAgICAgICpLZXkKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfU0lNUExFX0lOUFVUX0lOVEVSRkFDRSB7CisgICAgRUZJX0lOUFVUX1JFU0VUICAgICAgICAgICAgICAgICAgICAgUmVzZXQ7CisgICAgRUZJX0lOUFVUX1JFQURfS0VZICAgICAgICAgICAgICAgICAgUmVhZEtleVN0cm9rZTsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICBXYWl0Rm9yS2V5OworfSBTSU1QTEVfSU5QVVRfSU5URVJGQUNFOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvZWZpZGVidWcuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1ZDQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWRlYnVnLmgKQEAgLTAsMCArMSwxMTAgQEAKKyNpZm5kZWYgX0VGSV9ERUJVR19ICisjZGVmaW5lIF9FRklfREVCVUdfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlkZWJ1Zy5oCisKK0Fic3RyYWN0OgorCisgICAgRUZJIGxpYnJhcnkgZGVidWcgZnVuY3Rpb25zCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworZXh0ZXJuIFVJTlROICAgICBFRklEZWJ1ZzsKKworI2lmIEVGSV9ERUJVRworCisgICAgI2RlZmluZSBEQkdBU1NFUlQoYSkgICAgICAgIERiZ0Fzc2VydChfX0ZJTEVfXywgX19MSU5FX18sICNhKQorICAgICNkZWZpbmUgREVCVUcoYSkgICAgICAgICAgICBEYmdQcmludCBhCisgICAgCisjZWxzZQorCisgICAgI2RlZmluZSBEQkdBU1NFUlQoYSkKKyAgICAjZGVmaW5lIERFQlVHKGEpCisgICAgCisjZW5kaWYKKworI2lmIEVGSV9ERUJVR19DTEVBUl9NRU1PUlkKKworICAgICNkZWZpbmUgREJHU0VUTUVNKGEsbCkgICAgICBTZXRNZW0oYSxsLChDSEFSOClCQURfUE9JTlRFUikKKworI2Vsc2UKKworICAgICNkZWZpbmUgREJHU0VUTUVNKGEsbCkKKworI2VuZGlmCisKKyNkZWZpbmUgRF9JTklUICAgICAgICAweDAwMDAwMDAxICAgICAgICAgIC8vIEluaXRpYWxpemF0aW9uIHN0eWxlIG1lc3NhZ2VzCisjZGVmaW5lIERfV0FSTiAgICAgICAgMHgwMDAwMDAwMiAgICAgICAgICAvLyBXYXJuaW5ncworI2RlZmluZSBEX0xPQUQgICAgICAgIDB4MDAwMDAwMDQgICAgICAgICAgLy8gTG9hZCBldmVudHMKKyNkZWZpbmUgRF9GUyAgICAgICAgICAweDAwMDAwMDA4ICAgICAgICAgIC8vIEVGSSBGaWxlIHN5c3RlbQorI2RlZmluZSBEX1BPT0wgICAgICAgIDB4MDAwMDAwMTAgICAgICAgICAgLy8gQWxsb2MgJiBGcmVlJ3MKKyNkZWZpbmUgRF9QQUdFICAgICAgICAweDAwMDAwMDIwICAgICAgICAgIC8vIEFsbG9jICYgRnJlZSdzCisjZGVmaW5lIERfSU5GTyAgICAgICAgMHgwMDAwMDA0MCAgICAgICAgICAvLyBWZXJib3NlCisjZGVmaW5lIERfVkFSICAgICAgICAgMHgwMDAwMDEwMCAgICAgICAgICAvLyBWYXJpYWJsZQorI2RlZmluZSBEX1BBUlNFICAgICAgIDB4MDAwMDAyMDAgICAgICAgICAgLy8gQ29tbWFuZCBwYXJzaW5nCisjZGVmaW5lIERfQk0gICAgICAgICAgMHgwMDAwMDQwMCAgICAgICAgICAvLyBCb290IG1hbmFnZXIKKyNkZWZpbmUgRF9CTEtJTyAgICAgICAweDAwMDAxMDAwICAgICAgICAgIC8vIEJsa0lvIERyaXZlcgorI2RlZmluZSBEX0JMS0lPX1VMVFJBIDB4MDAwMDIwMDAgICAgICAgICAgLy8gQmxrSW8gRHJpdmVyCisjZGVmaW5lIERfTkVUICAgICAgICAgMHgwMDAwNDAwMCAgICAgICAgICAvLyBTTkkgRHJpdmVyCisjZGVmaW5lIERfTkVUX1VMVFJBICAgMHgwMDAwODAwMCAgICAgICAgICAvLyBTTkkgRHJpdmVyCisjZGVmaW5lIERfVFhUSU4gICAgICAgMHgwMDAxMDAwMCAgICAgICAgICAvLyBTaW1wbGUgSW5wdXQgRHJpdmVyCisjZGVmaW5lIERfVFhUT1VUICAgICAgMHgwMDAyMDAwMCAgICAgICAgICAvLyBTaW1wbGUgVGV4dCBPdXRwdXQgRHJpdmVyCisjZGVmaW5lIERfRVJST1JfQVRBCSAgMHgwMDA0MDAwMAkJICAJCS8vIEFUQSBlcnJvciBtZXNzYWdlcyAKKyNkZWZpbmUgRF9FUlJPUiAgICAgICAweDgwMDAwMDAwICAgICAgICAgIC8vIEVycm9yCisKKyNkZWZpbmUgRF9SRVNFUlZFRCAgICAweDdmZmZDODgwICAgICAgICAgIC8vIEJpdHMgbm90IHJlc2VydmVkIGFib3ZlCisKKy8vCisvLyBDdXJyZW50IERlYnVnIGxldmVsIG9mIHRoZSBzeXN0ZW0sIHZhbHVlIG9mIEVGSURlYnVnCisvLworLy8jZGVmaW5lIEVGSV9EQlVHX01BU0sgICAoRF9FUlJPUiB8IERfV0FSTiB8IERfTE9BRCB8IERfQkxLSU8gfCBEX0lOSVQpCisjZGVmaW5lIEVGSV9EQlVHX01BU0sgICAoRF9FUlJPUikKKworLy8KKy8vCisvLworCisjaWYgRUZJX0RFQlVHCisKKyAgICAjZGVmaW5lIEFTU0VSVChhKSAgICAgICAgICAgICAgIGlmKCEoYSkpICAgICAgIERCR0FTU0VSVChhKQorICAgICNkZWZpbmUgQVNTRVJUX0xPQ0tFRChsKSAgICAgICAgaWYoIShsKS0+TG9jaykgREJHQVNTRVJUKGwgbm90IGxvY2tlZCkKKyAgICAjZGVmaW5lIEFTU0VSVF9TVFJVQ1QocCx0KSAgICAgIERCR0FTU0VSVCh0IG5vdCBzdHJ1Y3R1cmUpLCBwCisKKyNlbHNlCisKKyAgICAjZGVmaW5lIEFTU0VSVChhKSAgICAgICAgICAgICAgIAorICAgICNkZWZpbmUgQVNTRVJUX0xPQ0tFRChsKSAgICAgICAgCisgICAgI2RlZmluZSBBU1NFUlRfU1RSVUNUKHAsdCkgICAgICAKKworI2VuZGlmCisKKy8vCisvLyBQcm90b3R5cGVzCisvLworCitJTlROCitEYmdBc3NlcnQgKAorICAgIENIQVI4ICAgKmZpbGUsCisgICAgSU5UTiAgICBsaW5lbm8sCisgICAgQ0hBUjggICAqc3RyaW5nCisgICAgKTsKKworSU5UTgorRGJnUHJpbnQgKAorICAgIElOVE4gICAgbWFzaywKKyAgICBDSEFSOCAgICpmb3JtYXQsCisgICAgLi4uCisgICAgKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWRlZi5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2YjE5MwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWRlZi5oCkBAIC0wLDAgKzEsMjExIEBACisjaWZuZGVmIF9FRklfREVGX0gKKyNkZWZpbmUgX0VGSV9ERUZfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlkZWYuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBkZWZpbml0aW9ucworCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKwordHlwZWRlZiBVSU5UMTYgICAgICAgICAgQ0hBUjE2OwordHlwZWRlZiBVSU5UOCAgICAgICAgICAgQ0hBUjg7Cit0eXBlZGVmIFVJTlQ4ICAgICAgICAgICBCT09MRUFOOworI2lmbmRlZiBDT05TVAorICAgI2RlZmluZSBDT05TVCBjb25zdAorI2VuZGlmCisjaWZuZGVmIFRSVUUKKyAgICAjZGVmaW5lIFRSVUUgICAgKChCT09MRUFOKSAxKQorICAgICNkZWZpbmUgRkFMU0UgICAoKEJPT0xFQU4pIDApCisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisgICAgI2RlZmluZSBOVUxMICAgICgoVk9JRCAqKSAwKQorI2VuZGlmCisKK3R5cGVkZWYgVUlOVE4gICAgICAgICAgIEVGSV9TVEFUVVM7Cit0eXBlZGVmIFVJTlQ2NCAgICAgICAgICBFRklfTEJBOwordHlwZWRlZiBVSU5UTiAgICAgICAgICAgRUZJX1RQTDsKK3R5cGVkZWYgVk9JRCAgICAgICAgICAgICpFRklfSEFORExFOwordHlwZWRlZiBWT0lEICAgICAgICAgICAgKkVGSV9FVkVOVDsKKworCisvLworLy8gUHJvdG90eXBlIGFyZ3VtZW50IGRlY29yYXRpb24gZm9yIEVGSSBwYXJhbWV0ZXJzIHRvIGluZGljYXRlCisvLyB0aGVpciBkaXJlY3Rpb24KKy8vCisvLyBJTiAtIGFyZ3VtZW50IGlzIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvbgorLy8gT1VUIC0gYXJndW1lbnQgKHBvaW50ZXIpIGlzIHJldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uCisvLyBPUFRJT05BTCAtIGFyZ3VtZW50IGlzIG9wdGlvbmFsCisvLworCisjaWZuZGVmIElOCisgICAgI2RlZmluZSBJTgorICAgICNkZWZpbmUgT1VUCisgICAgI2RlZmluZSBPUFRJT05BTAorI2VuZGlmCisKKworLy8KKy8vIEEgR1VJRAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAKKyAgICBVSU5UMzIgIERhdGExOworICAgIFVJTlQxNiAgRGF0YTI7CisgICAgVUlOVDE2ICBEYXRhMzsKKyAgICBVSU5UOCAgIERhdGE0WzhdOyAKK30gRUZJX0dVSUQ7CisKKworLy8KKy8vIFRpbWUKKy8vCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgCisgICAgVUlOVDE2ICAgICAgWWVhcjsgICAgICAgLy8gMTk5OCAtIDIwWFgKKyAgICBVSU5UOCAgICAgICBNb250aDsgICAgICAvLyAxIC0gMTIKKyAgICBVSU5UOCAgICAgICBEYXk7ICAgICAgICAvLyAxIC0gMzEKKyAgICBVSU5UOCAgICAgICBIb3VyOyAgICAgICAvLyAwIC0gMjMKKyAgICBVSU5UOCAgICAgICBNaW51dGU7ICAgICAvLyAwIC0gNTkKKyAgICBVSU5UOCAgICAgICBTZWNvbmQ7ICAgICAvLyAwIC0gNTkKKyAgICBVSU5UOCAgICAgICBQYWQxOworICAgIFVJTlQzMiAgICAgIE5hbm9zZWNvbmQ7IC8vIDAgLSA5OTksOTk5LDk5OQorICAgIElOVDE2ICAgICAgIFRpbWVab25lOyAgIC8vIC0xNDQwIHRvIDE0NDAgb3IgMjA0NworICAgIFVJTlQ4ICAgICAgIERheWxpZ2h0OworICAgIFVJTlQ4ICAgICAgIFBhZDI7Cit9IEVGSV9USU1FOworCisvLyBCaXQgZGVmaW5pdGlvbnMgZm9yIEVGSV9USU1FLkRheWxpZ2h0CisjZGVmaW5lIEVGSV9USU1FX0FESlVTVF9EQVlMSUdIVCAgICAweDAxCisjZGVmaW5lIEVGSV9USU1FX0lOX0RBWUxJR0hUICAgICAgICAweDAyCisKKy8vIFZhbHVlIGRlZmluaXRpb24gZm9yIEVGSV9USU1FLlRpbWVab25lCisjZGVmaW5lIEVGSV9VTlNQRUNJRklFRF9USU1FWk9ORSAgICAweDA3RkYKKworCisKKy8vCisvLyBOZXR3b3JraW5nCisvLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgQWRkcls0XTsKK30gRUZJX0lQdjRfQUREUkVTUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEFkZHJbMTZdOworfSBFRklfSVB2Nl9BRERSRVNTOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgQWRkclszMl07Cit9IEVGSV9NQUNfQUREUkVTUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiBSZWNlaXZlZFF1ZXVlVGltZW91dFZhbHVlOworICAgIFVJTlQzMiBUcmFuc21pdFF1ZXVlVGltZW91dFZhbHVlOworICAgIFVJTlQxNiBQcm90b2NvbFR5cGVGaWx0ZXI7CisgICAgQk9PTEVBTiBFbmFibGVVbmljYXN0UmVjZWl2ZTsKKyAgICBCT09MRUFOIEVuYWJsZU11bHRpY2FzdFJlY2VpdmU7CisgICAgQk9PTEVBTiBFbmFibGVCcm9hZGNhc3RSZWNlaXZlOworICAgIEJPT0xFQU4gRW5hYmxlUHJvbWlzY3VvdXNSZWNlaXZlOworICAgIEJPT0xFQU4gRmx1c2hRdWV1ZXNPblJlc2V0OworICAgIEJPT0xFQU4gRW5hYmxlUmVjZWl2ZVRpbWVzdGFtcHM7CisgICAgQk9PTEVBTiBEaXNhYmxlQmFja2dyb3VuZFBvbGxpbmc7Cit9IEVGSV9NQU5BR0VEX05FVFdPUktfQ09ORklHX0RBVEE7CisKKy8vCisvLyBNZW1vcnkKKy8vCisKK3R5cGVkZWYgVUlOVDY0ICAgICAgICAgIEVGSV9QSFlTSUNBTF9BRERSRVNTOwordHlwZWRlZiBVSU5UNjQgICAgICAgICAgRUZJX1ZJUlRVQUxfQUREUkVTUzsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBbGxvY2F0ZUFueVBhZ2VzLAorICAgIEFsbG9jYXRlTWF4QWRkcmVzcywKKyAgICBBbGxvY2F0ZUFkZHJlc3MsCisgICAgTWF4QWxsb2NhdGVUeXBlCit9IEVGSV9BTExPQ0FURV9UWVBFOworCisvL1ByZXNldmUgdGhlIGF0dHIgb24gYW55IHJhbmdlIHN1cHBsaWVkLgorLy9Db252ZW50aWFsTWVtb3J5IG11c3QgaGF2ZSBXQixTUixTVyB3aGVuIHN1cHBsaWVkLgorLy9XaGVuIGFsbG9jYXRpbmcgZnJvbSBDb252ZW50aWFsTWVtb3J5IGFsd2F5cyBtYWtlIGl0IFdCLFNSLFNXCisvL1doZW4gcmV0dXJuaW5nIHRvIENvbnZlbnRpYWxNZW1vcnkgYWx3YXlzIG1ha2UgaXQgV0IsU1IsU1cKKy8vV2hlbiBnZXR0aW5nIHRoZSBtZW1vcnkgbWFwLCBvciBvbiBSVCBmb3IgcnVudGltZSB0eXBlcworCisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpUmVzZXJ2ZWRNZW1vcnlUeXBlLAorICAgIEVmaUxvYWRlckNvZGUsCisgICAgRWZpTG9hZGVyRGF0YSwKKyAgICBFZmlCb290U2VydmljZXNDb2RlLAorICAgIEVmaUJvb3RTZXJ2aWNlc0RhdGEsCisgICAgRWZpUnVudGltZVNlcnZpY2VzQ29kZSwKKyAgICBFZmlSdW50aW1lU2VydmljZXNEYXRhLAorICAgIEVmaUNvbnZlbnRpb25hbE1lbW9yeSwKKyAgICBFZmlVbnVzYWJsZU1lbW9yeSwKKyAgICBFZmlBQ1BJUmVjbGFpbU1lbW9yeSwKKyAgICBFZmlBQ1BJTWVtb3J5TlZTLAorICAgIEVmaU1lbW9yeU1hcHBlZElPLAorICAgIEVmaU1lbW9yeU1hcHBlZElPUG9ydFNwYWNlLAorICAgIEVmaVBhbENvZGUsCisgICAgRWZpTWF4TWVtb3J5VHlwZQorfSBFRklfTUVNT1JZX1RZUEU7CisKKy8vIHBvc3NpYmxlIGNhY2hpbmcgdHlwZXMgZm9yIHRoZSBtZW1vcnkgcmFuZ2UKKyNkZWZpbmUgRUZJX01FTU9SWV9VQyAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCisjZGVmaW5lIEVGSV9NRU1PUllfV0MgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMgorI2RlZmluZSBFRklfTUVNT1JZX1dUICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDQKKyNkZWZpbmUgRUZJX01FTU9SWV9XQiAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDA4CisjZGVmaW5lIEVGSV9NRU1PUllfVUNFICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAxMCAgCisKKy8vIHBoeXNpY2FsIG1lbW9yeSBwcm90ZWN0aW9uIG9uIHJhbmdlIAorI2RlZmluZSBFRklfTUVNT1JZX1dQICAgICAgICAgICAweDAwMDAwMDAwMDAwMDEwMDAKKyNkZWZpbmUgRUZJX01FTU9SWV9SUCAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAyMDAwCisjZGVmaW5lIEVGSV9NRU1PUllfWFAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwNDAwMAorCisvLyByYW5nZSByZXF1aXJlcyBhIHJ1bnRpbWUgbWFwcGluZworI2RlZmluZSBFRklfTUVNT1JZX1JVTlRJTUUgICAgICAweDgwMDAwMDAwMDAwMDAwMDAKKworI2RlZmluZSBFRklfTUVNT1JZX0RFU0NSSVBUT1JfVkVSU0lPTiAgMQordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTsgICAgICAgICAgIC8vIEZpZWxkIHNpemUgaXMgMzIgYml0cyBmb2xsb3dlZCBieSAzMiBiaXQgcGFkCisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBQYWQ7CisgICAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICBQaHlzaWNhbFN0YXJ0OyAgLy8gRmllbGQgc2l6ZSBpcyA2NCBiaXRzCisgICAgRUZJX1ZJUlRVQUxfQUREUkVTUyAgICAgICAgICAgICBWaXJ0dWFsU3RhcnQ7ICAgLy8gRmllbGQgc2l6ZSBpcyA2NCBiaXRzCisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlBhZ2VzOyAgLy8gRmllbGQgc2l6ZSBpcyA2NCBiaXRzCisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU7ICAgICAgLy8gRmllbGQgc2l6ZSBpcyA2NCBiaXRzCit9IEVGSV9NRU1PUllfREVTQ1JJUFRPUjsKKworLy8KKy8vIEludGVybmF0aW9uYWwgTGFuZ3VhZ2UKKy8vCisKK3R5cGVkZWYgVUlOVDggICBJU09fNjM5XzI7CisjZGVmaW5lIElTT182MzlfMl9FTlRSWV9TSVpFICAgIDMKKworLy8KKy8vCisvLworCisjZGVmaW5lIEVGSV9QQUdFX1NJWkUgICA0MDk2CisjZGVmaW5lIEVGSV9QQUdFX01BU0sgICAweEZGRgorI2RlZmluZSBFRklfUEFHRV9TSElGVCAgMTIKKworI2RlZmluZSBFRklfU0laRV9UT19QQUdFUyhhKSAgXAorICAgICggKChhKSA+PiBFRklfUEFHRV9TSElGVCkgKyAoKGEpICYgRUZJX1BBR0VfTUFTSyA/IDEgOiAwKSApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvZWZpZGV2cC5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpZGV2cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjU3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlkZXZwLmgKQEAgLTAsMCArMSw0MDIgQEAKKyNpZm5kZWYgX0RFVlBBVEhfSAorI2RlZmluZSBfREVWUEFUSF9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGRldnBhdGguaAorCitBYnN0cmFjdDoKKworICAgIERlZmluZXMgZm9yIHBhcnNpbmcgdGhlIEVGSSBEZXZpY2UgUGF0aCBzdHJ1Y3R1cmVzCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIERldmljZSBQYXRoIHN0cnVjdHVyZXMgLSBTZWN0aW9uIEMKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9FRklfREVWSUNFX1BBVEggeworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViVHlwZTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGhbMl07Cit9IEVGSV9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBFRklfRFBfVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgICAweDdGCisjZGVmaW5lIEVGSV9EUF9UWVBFX1VOUEFDS0VEICAgICAgICAgICAgICAgIDB4ODAKKworLy8jZGVmaW5lIEVORF9ERVZJQ0VfUEFUSF9UWVBFICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgRU5EX0RFVklDRV9QQVRIX1RZUEUgICAgICAgICAgICAgICAgMHg3ZgorLy8jZGVmaW5lIEVORF9ERVZJQ0VfUEFUSF9UWVBFX1VOUEFDS0VEICAgICAgIDB4N2YKKworI2RlZmluZSBFTkRfRU5USVJFX0RFVklDRV9QQVRIX1NVQlRZUEUgICAgICAweGZmCisjZGVmaW5lIEVORF9JTlNUQU5DRV9ERVZJQ0VfUEFUSF9TVUJUWVBFICAgIDB4MDEKKyNkZWZpbmUgRU5EX0RFVklDRV9QQVRIX0xFTkdUSCAgICAgICAgICAgICAgKHNpemVvZihFRklfREVWSUNFX1BBVEgpKQorCisKKyNkZWZpbmUgRFBfSVNfRU5EX1RZUEUoYSkKKyNkZWZpbmUgRFBfSVNfRU5EX1NVQlRZUEUoYSkgICAgICAgICggKChhKS0+U3ViVHlwZSA9PSBFTkRfRU5USVJFX0RFVklDRV9QQVRIX1NVQlRZUEUgKQorCisjZGVmaW5lIERldmljZVBhdGhUeXBlKGEpICAgICAgICAgICAoICgoYSktPlR5cGUpICYgRUZJX0RQX1RZUEVfTUFTSyApCisjZGVmaW5lIERldmljZVBhdGhTdWJUeXBlKGEpICAgICAgICAoIChhKS0+U3ViVHlwZSApCisjZGVmaW5lIERldmljZVBhdGhOb2RlTGVuZ3RoKGEpICAgICAoICgoYSktPkxlbmd0aFswXSkgfCAoKGEpLT5MZW5ndGhbMV0gPDwgOCkgKQorI2RlZmluZSBOZXh0RGV2aWNlUGF0aE5vZGUoYSkgICAgICAgKCAoRUZJX0RFVklDRV9QQVRIICopICggKChVSU5UOCAqKSAoYSkpICsgRGV2aWNlUGF0aE5vZGVMZW5ndGgoYSkpKQorLy8jZGVmaW5lIElzRGV2aWNlUGF0aEVuZFR5cGUoYSkgICAgICAoIERldmljZVBhdGhUeXBlKGEpID09IEVORF9ERVZJQ0VfUEFUSF9UWVBFX1VOUEFDS0VEICkKKyNkZWZpbmUgSXNEZXZpY2VQYXRoRW5kVHlwZShhKSAgICAgICggRGV2aWNlUGF0aFR5cGUoYSkgPT0gRU5EX0RFVklDRV9QQVRIX1RZUEUgKQorI2RlZmluZSBJc0RldmljZVBhdGhFbmRTdWJUeXBlKGEpICAgKCAoYSktPlN1YlR5cGUgPT0gRU5EX0VOVElSRV9ERVZJQ0VfUEFUSF9TVUJUWVBFICkKKyNkZWZpbmUgSXNEZXZpY2VQYXRoRW5kKGEpICAgICAgICAgICggSXNEZXZpY2VQYXRoRW5kVHlwZShhKSAmJiBJc0RldmljZVBhdGhFbmRTdWJUeXBlKGEpICkKKyNkZWZpbmUgSXNEZXZpY2VQYXRoVW5wYWNrZWQoYSkgICAgICggKGEpLT5UeXBlICYgRUZJX0RQX1RZUEVfVU5QQUNLRUQgKQorCisKKyNkZWZpbmUgU2V0RGV2aWNlUGF0aE5vZGVMZW5ndGgoYSxsKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKGEpLT5MZW5ndGhbMF0gPSAoVUlOVDgpIChsKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoYSktPkxlbmd0aFsxXSA9IChVSU5UOCkgKChsKSA+PiA4KTsgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworI2RlZmluZSBTZXREZXZpY2VQYXRoRW5kTm9kZShhKSAgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoYSktPlR5cGUgPSBFTkRfREVWSUNFX1BBVEhfVFlQRTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIChhKS0+U3ViVHlwZSA9IEVORF9FTlRJUkVfREVWSUNFX1BBVEhfU1VCVFlQRTsgICAgIFwKKyAgICAgICAgICAgIChhKS0+TGVuZ3RoWzBdID0gc2l6ZW9mKEVGSV9ERVZJQ0VfUEFUSCk7ICAgXAorICAgICAgICAgICAgKGEpLT5MZW5ndGhbMV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKworCisvKgorICoKKyAqLworI2RlZmluZSBIQVJEV0FSRV9ERVZJQ0VfUEFUSCAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBIV19QQ0lfRFAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKK3R5cGVkZWYgc3RydWN0IF9QQ0lfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2U7Cit9IFBDSV9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBIV19QQ0NBUkRfRFAgICAgICAgICAgICAgICAgICAgIDB4MDIKK3R5cGVkZWYgc3RydWN0IF9QQ0NBUkRfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXROdW1iZXI7Cit9IFBDQ0FSRF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBIV19NRU1NQVBfRFAgICAgICAgICAgICAgICAgICAgIDB4MDMKK3R5cGVkZWYgc3RydWN0IF9NRU1NQVBfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlUeXBlOworICAgICAgICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgIFN0YXJ0aW5nQWRkcmVzczsKKyAgICAgICAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICBFbmRpbmdBZGRyZXNzOworfSBNRU1NQVBfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgSFdfVkVORE9SX0RQICAgICAgICAgICAgICAgICAgICAweDA0Cit0eXBlZGVmIHN0cnVjdCBfVkVORE9SX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgR3VpZDsKK30gVkVORE9SX0RFVklDRV9QQVRIOworCisjZGVmaW5lIFVOS05PV05fREVWSUNFX0dVSUQgXAorICAgIHsgMHhjZjMxZmFjNSwgMHhjMjRlLCAweDExZDIsICB7MHg4NSwgMHhmMywgMHgwLCAweGEwLCAweGM5LCAweDNlLCAweGM5LCAweDNifSAgfQorCit0eXBlZGVmIHN0cnVjdCBfVUtOT1dOX0RFVklDRV9WRU5ET1JfRFAgeworICAgIFZFTkRPUl9ERVZJQ0VfUEFUSCAgICAgIERldmljZVBhdGg7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgTGVnYWN5RHJpdmVMZXR0ZXI7Cit9IFVOS05PV05fREVWSUNFX1ZFTkRPUl9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBIV19DT05UUk9MTEVSX0RQICAgICAgICAgICAgMHgwNQordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xMRVJfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICBDb250cm9sbGVyOworfSBDT05UUk9MTEVSX0RFVklDRV9QQVRIOworCisvKgorICoKKyAqLworI2RlZmluZSBBQ1BJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAweDAyCisKKyNkZWZpbmUgQUNQSV9EUCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCit0eXBlZGVmIHN0cnVjdCBfQUNQSV9ISURfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBISUQ7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEOworfSBBQ1BJX0hJRF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBFWFBBTkRFRF9BQ1BJX0RQCQkweDAyCit0eXBlZGVmIHN0cnVjdCBfRVhQQU5ERURfQUNQSV9ISURfREVWSUNFX1BBVEggeworCUVGSV9ERVZJQ0VfUEFUSAkJCUhlYWRlcjsKKwlVSU5UMzIJCQkJSElEOworCVVJTlQzMgkJCQlVSUQ7CisJVUlOVDMyCQkJCUNJRDsKKwlVSU5UOAkJCQlIaWRTdHJbMV07Cit9IEVYUEFOREVEX0FDUElfSElEX0RFVklDRV9QQVRIOworCisvLworLy8gRUlTQSBJRCBNYWNybworLy8gRUlTQSBJRCBEZWZpbml0aW9uIDMyLWJpdHMKKy8vICBiaXRzWzE1OjBdIC0gdGhyZWUgY2hhcmFjdGVyIGNvbXByZXNzZWQgQVNDSUkgRUlTQSBJRC4KKy8vICBiaXRzWzMxOjE2XSAtIGJpbmFyeSBudW1iZXIKKy8vICAgQ29tcHJlc3NlZCBBU0NJSSBpcyA1IGJpdHMgcGVyIGNoYXJhY3RlciAwYjAwMDAxID0gJ0EnIDBiMTEwMTAgPSAnWicKKy8vCisjZGVmaW5lIFBOUF9FSVNBX0lEX0NPTlNUICAgICAgIDB4NDFkMCAgICAKKyNkZWZpbmUgRUlTQV9JRChfTmFtZSwgX051bSkgICAgKChVSU5UMzIpICgoX05hbWUpIHwgKF9OdW0pIDw8IDE2KSkgICAKKyNkZWZpbmUgRUlTQV9QTlBfSUQoX1BOUElkKSAgICAgKEVJU0FfSUQoUE5QX0VJU0FfSURfQ09OU1QsIChfUE5QSWQpKSkKKworI2RlZmluZSBQTlBfRUlTQV9JRF9NQVNLICAgICAgICAweGZmZmYKKyNkZWZpbmUgRUlTQV9JRF9UT19OVU0oX0lkKSAgICAgKChfSWQpID4+IDE2KQorLyoKKyAqCisgKi8KKyNkZWZpbmUgTUVTU0FHSU5HX0RFVklDRV9QQVRIICAgICAgICAgICAweDAzIAorCisjZGVmaW5lIE1TR19BVEFQSV9EUCAgICAgICAgICAgICAgICAgICAgMHgwMQordHlwZWRlZiBzdHJ1Y3QgX0FUQVBJX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeVNlY29uZGFyeTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTbGF2ZU1hc3RlcjsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBMdW47Cit9IEFUQVBJX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19TQ1NJX0RQICAgICAgICAgICAgICAgICAgICAgMHgwMgordHlwZWRlZiBzdHJ1Y3QgX1NDU0lfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBQdW47CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTHVuOyAKK30gU0NTSV9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfRklCUkVDSEFOTkVMX0RQICAgICAgICAgICAgIDB4MDMKK3R5cGVkZWYgc3RydWN0IF9GSUJSRUNIQU5ORUxfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBXV047CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgTHVuOworfSBGSUJSRUNIQU5ORUxfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHXzEzOTRfRFAgICAgICAgICAgICAgICAgICAgICAweDA0Cit0eXBlZGVmIHN0cnVjdCBfRjEzOTRfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBHdWlkOworfSBGMTM5NF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfVVNCX0RQICAgICAgICAgICAgICAgICAgICAgIDB4MDUKK3R5cGVkZWYgc3RydWN0IF9VU0JfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0OworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50OworfSBVU0JfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX1VTQl9DTEFTU19EUCAgICAgICAgICAgICAgICAweDBGCit0eXBlZGVmIHN0cnVjdCBfVVNCX0NMQVNTX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgVmVuZG9ySWQ7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdElkOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUNsYXNzOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN1YmNsYXNzOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVByb3RvY29sOworfSBVU0JfQ0xBU1NfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0kyT19EUCAgICAgICAgICAgICAgICAgICAgICAweDA2Cit0eXBlZGVmIHN0cnVjdCBfSTJPX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgVGlkOworfSBJMk9fREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX01BQ19BRERSX0RQICAgICAgICAgICAgICAgICAweDBiCit0eXBlZGVmIHN0cnVjdCBfTUFDX0FERFJfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICBNYWNBZGRyZXNzOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIElmVHlwZTsKK30gTUFDX0FERFJfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0lQdjRfRFAgICAgICAgICAgICAgICAgICAgICAweDBjCit0eXBlZGVmIHN0cnVjdCBfSVB2NF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBFRklfSVB2NF9BRERSRVNTICAgICAgICAgICAgICAgIExvY2FsSXBBZGRyZXNzOworICAgICAgICBFRklfSVB2NF9BRERSRVNTICAgICAgICAgICAgICAgIFJlbW90ZUlwQWRkcmVzczsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFBvcnQ7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlUG9ydDsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbDsKKyAgICAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWNJcEFkZHJlc3M7Cit9IElQdjRfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0lQdjZfRFAgICAgICAgICAgICAgICAgICAgICAweDBkCit0eXBlZGVmIHN0cnVjdCBfSVB2Nl9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBFRklfSVB2Nl9BRERSRVNTICAgICAgICAgICAgICAgIExvY2FsSXBBZGRyZXNzOworICAgICAgICBFRklfSVB2Nl9BRERSRVNTICAgICAgICAgICAgICAgIFJlbW90ZUlwQWRkcmVzczsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFBvcnQ7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlUG9ydDsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbDsKKyAgICAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWNJcEFkZHJlc3M7Cit9IElQdjZfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0lORklOSUJBTkRfRFAgICAgICAgICAgICAgICAweDA5Cit0eXBlZGVmIHN0cnVjdCBfSU5GSU5JQkFORF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVHdWlkOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIElvY0d1aWQ7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSWQ7Cit9IElORklOSUJBTkRfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX1VBUlRfRFAgICAgICAgICAgICAgICAgICAgICAweDBlCit0eXBlZGVmIHN0cnVjdCBfVUFSVF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWRSYXRlOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCaXRzOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcml0eTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wQml0czsKK30gVUFSVF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfVkVORE9SX0RQICAgICAgICAgICAgICAgICAgIDB4MEEKKy8qIFVzZSBWRU5ET1JfREVWSUNFX1BBVEggc3RydWN0ICovCisKKyNkZWZpbmUgREVWSUNFX1BBVEhfTUVTU0FHSU5HX1BDX0FOU0kgXAorICAgIHsgMHhlMGMxNDc1MywgMHhmOWJlLCAweDExZDIsICB7MHg5YSwgMHgwYywgMHgwMCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZH0gIH0KKworI2RlZmluZSBERVZJQ0VfUEFUSF9NRVNTQUdJTkdfVlRfMTAwIFwKKyAgICB7IDB4ZGZhNjYwNjUsIDB4YjQxOSwgMHgxMWQzLCAgezB4OWEsIDB4MmQsIDB4MDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9ICB9CisKKworCisjZGVmaW5lIE1FRElBX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgMHgwNAorCisjZGVmaW5lIE1FRElBX0hBUkREUklWRV9EUCAgICAgICAgICAgICAgMHgwMQordHlwZWRlZiBzdHJ1Y3QgX0hBUkREUklWRV9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbk51bWJlcjsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25TdGFydDsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25TaXplOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZVsxNl07CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJSVHlwZTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVUeXBlOworfSBIQVJERFJJVkVfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTUJSX1RZUEVfUENBVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBNQlJfVFlQRV9FRklfUEFSVElUSU9OX1RBQkxFX0hFQURFUiAweDAyCisKKyNkZWZpbmUgU0lHTkFUVVJFX1RZUEVfTUJSICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTSUdOQVRVUkVfVFlQRV9HVUlEICAgICAgICAgICAgICAgICAweDAyCisKKyNkZWZpbmUgTUVESUFfQ0RST01fRFAgICAgICAgICAgICAgICAgICAweDAyCit0eXBlZGVmIHN0cnVjdCBfQ0RST01fREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBCb290RW50cnk7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RhcnQ7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU2l6ZTsKK30gQ0RST01fREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTUVESUFfVkVORE9SX0RQICAgICAgICAgICAgICAgICAweDAzCisvKiBVc2UgVkVORE9SX0RFVklDRV9QQVRIIHN0cnVjdCAqLworCisjZGVmaW5lIE1FRElBX0ZJTEVQQVRIX0RQICAgICAgICAgICAgICAgMHgwNAordHlwZWRlZiBzdHJ1Y3QgX0ZJTEVQQVRIX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aE5hbWVbMV07Cit9IEZJTEVQQVRIX0RFVklDRV9QQVRIOworCisjZGVmaW5lIFNJWkVfT0ZfRklMRVBBVEhfREVWSUNFX1BBVEggRUZJX0ZJRUxEX09GRlNFVChGSUxFUEFUSF9ERVZJQ0VfUEFUSCxQYXRoTmFtZSkKKworI2RlZmluZSBNRURJQV9QUk9UT0NPTF9EUCAgICAgICAgICAgICAgIDB4MDUKK3R5cGVkZWYgc3RydWN0IF9NRURJQV9QUk9UT0NPTF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sOworfSBNRURJQV9QUk9UT0NPTF9ERVZJQ0VfUEFUSDsKKworCisjZGVmaW5lIEJCU19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBCQlNfQkJTX0RQICAgICAgICAgICAgICAgICAgICAgIDB4MDEKK3R5cGVkZWYgc3RydWN0IF9CQlNfQkJTX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVHlwZTsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNGbGFnOworICAgICAgICBDSEFSOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1sxXTsKK30gQkJTX0JCU19ERVZJQ0VfUEFUSDsKKworLyogRGV2aWNlVHlwZSBkZWZpbml0aW9ucyAtIGZyb20gQkJTIHNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgQkJTX1RZUEVfRkxPUFBZICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEJCU19UWVBFX0hBUkREUklWRSAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBCQlNfVFlQRV9DRFJPTSAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgQkJTX1RZUEVfUENNQ0lBICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEJCU19UWVBFX1VTQiAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBCQlNfVFlQRV9FTUJFRERFRF9ORVRXT1JLICAgICAgIDB4MDYKKyNkZWZpbmUgQkJTX1RZUEVfREVWICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEJCU19UWVBFX1VOS05PV04gICAgICAgICAgICAgICAgMHhGRgorCit0eXBlZGVmIHVuaW9uIHsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgRGV2UGF0aDsKKyAgICBQQ0lfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgUGNpOworICAgIFBDQ0FSRF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICBQY0NhcmQ7CisgICAgTUVNTUFQX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgIE1lbU1hcDsKKyAgICBWRU5ET1JfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgVmVuZG9yOworICAgIFVOS05PV05fREVWSUNFX1ZFTkRPUl9ERVZJQ0VfUEFUSCAgICBVbmtub3duVmVuZG9yOyAgIAorICAgIENPTlRST0xMRVJfREVWSUNFX1BBVEggICAgICAgICAgICAgICBDb250cm9sbGVyOworICAgIEFDUElfSElEX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBBY3BpOworCisgICAgQVRBUElfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgIEF0YXBpOworICAgIFNDU0lfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICBTY3NpOworICAgIEZJQlJFQ0hBTk5FTF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICBGaWJyZUNoYW5uZWw7CisKKyAgICBGMTM5NF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgRjEzOTQ7CisgICAgVVNCX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgIFVzYjsKKyAgICBVU0JfQ0xBU1NfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgVXNiQ2xhc3M7CisgICAgSTJPX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgIEkyTzsKKyAgICBNQUNfQUREUl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgTWFjQWRkcjsKKyAgICBJUHY0X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgSXB2NDsKKyAgICBJUHY2X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgSXB2NjsKKyAgICBJTkZJTklCQU5EX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgSW5maW5pQmFuZDsKKyAgICBVQVJUX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgVWFydDsKKworICAgIEhBUkREUklWRV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICBIYXJkRHJpdmU7CisgICAgQ0RST01fREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgIENEOworCisgICAgRklMRVBBVEhfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEZpbGVQYXRoOworICAgIE1FRElBX1BST1RPQ09MX0RFVklDRV9QQVRIICAgICAgICAgICBNZWRpYVByb3RvY29sOworCisgICAgQkJTX0JCU19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgIEJiczsKKworfSBFRklfREVWX1BBVEg7CisKK3R5cGVkZWYgdW5pb24geworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICAqRGV2UGF0aDsKKyAgICBQQ0lfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKlBjaTsKKyAgICBQQ0NBUkRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgKlBjQ2FyZDsKKyAgICBNRU1NQVBfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgKk1lbU1hcDsKKyAgICBWRU5ET1JfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgKlZlbmRvcjsKKyAgICBVTktOT1dOX0RFVklDRV9WRU5ET1JfREVWSUNFX1BBVEggICAgKlVua25vd25WZW5kb3I7ICAgCisgICAgQ09OVFJPTExFUl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICpDb250cm9sbGVyOworICAgIEFDUElfSElEX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAqQWNwaTsKKworICAgIEFUQVBJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAqQXRhcGk7CisgICAgU0NTSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICpTY3NpOworICAgIEZJQlJFQ0hBTk5FTF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAqRmlicmVDaGFubmVsOworCisgICAgRjEzOTRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICpGMTM5NDsKKyAgICBVU0JfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKlVzYjsKKyAgICBVU0JfQ0xBU1NfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgKlVzYkNsYXNzOworICAgIEkyT19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICAqSTJPOworICAgIE1BQ19BRERSX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAqTWFjQWRkcjsKKyAgICBJUHY0X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgKklwdjQ7CisgICAgSVB2Nl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICpJcHY2OworICAgIElORklOSUJBTkRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAqSW5maW5pQmFuZDsKKyAgICBVQVJUX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgKlVhcnQ7CisKKyAgICBIQVJERFJJVkVfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgKkhhcmREcml2ZTsKKworICAgIEZJTEVQQVRIX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAqRmlsZVBhdGg7CisgICAgTUVESUFfUFJPVE9DT0xfREVWSUNFX1BBVEggICAgICAgICAgICpNZWRpYVByb3RvY29sOworCisgICAgQ0RST01fREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICpDRDsKKyAgICBCQlNfQkJTX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgKkJiczsKKworfSBFRklfREVWX1BBVEhfUFRSOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvZWZpZXJyLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmllcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQzZDNjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpZXJyLmgKQEAgLTAsMCArMSw2NyBAQAorI2lmbmRlZiBfRUZJX0VSUl9ICisjZGVmaW5lIF9FRklfRVJSX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpZXJyLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgZXJyb3IgY29kZXMKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKworI2RlZmluZSBFRklXQVJOKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhKQorI2RlZmluZSBFRklfRVJST1IoYSkgICAgICAgICAgICAgICgoKElOVE4pIGEpIDwgMCkKKworCisjZGVmaW5lIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEVGSV9MT0FEX0VSUk9SICAgICAgICAgICAgICAgICAgRUZJRVJSKDEpCisjZGVmaW5lIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgICAgRUZJRVJSKDIpCisjZGVmaW5lIEVGSV9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgRUZJRVJSKDMpCisjZGVmaW5lIEVGSV9CQURfQlVGRkVSX1NJWkUgICAgICAgICAgICAgRUZJRVJSKDQpCisjZGVmaW5lIEVGSV9CVUZGRVJfVE9PX1NNQUxMICAgICAgICAgICAgRUZJRVJSKDUpCisjZGVmaW5lIEVGSV9OT1RfUkVBRFkgICAgICAgICAgICAgICAgICAgRUZJRVJSKDYpCisjZGVmaW5lIEVGSV9ERVZJQ0VfRVJST1IgICAgICAgICAgICAgICAgRUZJRVJSKDcpCisjZGVmaW5lIEVGSV9XUklURV9QUk9URUNURUQgICAgICAgICAgICAgRUZJRVJSKDgpCisjZGVmaW5lIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgICAgICAgICAgRUZJRVJSKDkpCisjZGVmaW5lIEVGSV9WT0xVTUVfQ09SUlVQVEVEICAgICAgICAgICAgRUZJRVJSKDEwKQorI2RlZmluZSBFRklfVk9MVU1FX0ZVTEwgICAgICAgICAgICAgICAgIEVGSUVSUigxMSkKKyNkZWZpbmUgRUZJX05PX01FRElBICAgICAgICAgICAgICAgICAgICBFRklFUlIoMTIpCisjZGVmaW5lIEVGSV9NRURJQV9DSEFOR0VEICAgICAgICAgICAgICAgRUZJRVJSKDEzKQorI2RlZmluZSBFRklfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgIEVGSUVSUigxNCkKKyNkZWZpbmUgRUZJX0FDQ0VTU19ERU5JRUQgICAgICAgICAgICAgICBFRklFUlIoMTUpCisjZGVmaW5lIEVGSV9OT19SRVNQT05TRSAgICAgICAgICAgICAgICAgRUZJRVJSKDE2KQorI2RlZmluZSBFRklfTk9fTUFQUElORyAgICAgICAgICAgICAgICAgIEVGSUVSUigxNykKKyNkZWZpbmUgRUZJX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICBFRklFUlIoMTgpCisjZGVmaW5lIEVGSV9OT1RfU1RBUlRFRCAgICAgICAgICAgICAgICAgRUZJRVJSKDE5KQorI2RlZmluZSBFRklfQUxSRUFEWV9TVEFSVEVEICAgICAgICAgICAgIEVGSUVSUigyMCkKKyNkZWZpbmUgRUZJX0FCT1JURUQgICAgICAgICAgICAgICAgICAgICBFRklFUlIoMjEpCisjZGVmaW5lIEVGSV9JQ01QX0VSUk9SICAgICAgICAgICAgICAgICAgRUZJRVJSKDIyKQorI2RlZmluZSBFRklfVEZUUF9FUlJPUiAgICAgICAgICAgICAgICAgIEVGSUVSUigyMykKKyNkZWZpbmUgRUZJX1BST1RPQ09MX0VSUk9SICAgICAgICAgICAgICBFRklFUlIoMjQpCisjZGVmaW5lIEVGSV9JTkNPTVBBVElCTEVfVkVSU0lPTiAgICAgICAgRUZJRVJSKDI1KQorI2RlZmluZSBFRklfU0VDVVJJVFlfVklPTEFUSU9OICAgICAgICAgIEVGSUVSUigyNikKKyNkZWZpbmUgRUZJX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICBFRklFUlIoMjcpCisjZGVmaW5lIEVGSV9FTkRfT0ZfTUVESUEgICAgICAgICAgICAgICAgRUZJRVJSKDI4KQorI2RlZmluZSBFRklfRU5EX09GX0ZJTEUgICAgICAgICAgICAgICAgIEVGSUVSUigzMSkKKyNkZWZpbmUgRUZJX0lOVkFMSURfTEFOR1VBR0UgICAgICAgICAgICBFRklFUlIoMzIpCisjZGVmaW5lIEVGSV9DT01QUk9NSVNFRF9EQVRBICAgICAgICAgICAgRUZJRVJSKDMzKQorCisjZGVmaW5lIEVGSV9XQVJOX1VOS09XTl9HTFlQSCAgICAgICAgICAgRUZJV0FSTigxKQorI2RlZmluZSBFRklfV0FSTl9ERUxFVEVfRkFJTFVSRSAgICAgICAgIEVGSVdBUk4oMikKKyNkZWZpbmUgRUZJX1dBUk5fV1JJVEVfRkFJTFVSRSAgICAgICAgICBFRklXQVJOKDMpCisjZGVmaW5lIEVGSV9XQVJOX0JVRkZFUl9UT09fU01BTEwgICAgICAgRUZJV0FSTig0KQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvZWZpZnMuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1OTVkMQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWZzLmgKQEAgLTAsMCArMSwxMTYgQEAKKyNpZm5kZWYgX0VGSV9GU19ICisjZGVmaW5lIF9FRklfRlNfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlmcy5oCisKK0Fic3RyYWN0OgorCisgICAgRUZJIEZpbGUgU3lzdGVtIHN0cnVjdHVyZXMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisKKy8vCisvLyBFRkkgUGFydGl0aW9uIGhlYWRlciAobm9ybWFseSBzdGFydHMgaW4gTEJBIDEpCisvLworCisjZGVmaW5lIEVGSV9QQVJUSVRJT05fU0lHTkFUVVJFICAgICAgICAgMHg1MDUzNTk1MzIwNDk0MjQ5CisjZGVmaW5lIEVGSV9QQVJUSVRJT05fUkVWSVNJT04gICAgICAgICAgMHgwMDAxMDAwMQorI2RlZmluZSBNSU5fRUZJX1BBUlRJVElPTl9CTE9DS19TSVpFICAgIDUxMgorI2RlZmluZSBFRklfUEFSVElUSU9OX0xCQSAgICAgICAgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9QQVJUSVRJT05fSEVBREVSIHsKKyAgICBFRklfVEFCTEVfSEVBREVSICAgIEhkcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIERpcmVjdG9yeUFsbG9jYXRpb25OdW1iZXI7CisgICAgVUlOVDMyICAgICAgICAgICAgICBCbG9ja1NpemU7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBGaXJzdFVzYWJsZUxiYTsKKyAgICBFRklfTEJBICAgICAgICAgICAgIExhc3RVc2FibGVMYmE7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBVbnVzYWJsZVNwYWNlOworICAgIEVGSV9MQkEgICAgICAgICAgICAgRnJlZVNwYWNlOworICAgIEVGSV9MQkEgICAgICAgICAgICAgUm9vdEZpbGU7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBTZWN1dGlyeUZpbGU7Cit9IEVGSV9QQVJUSVRJT05fSEVBREVSOworCisKKy8vCisvLyBGaWxlIGhlYWRlcgorLy8KKworI2RlZmluZSBFRklfRklMRV9IRUFERVJfU0lHTkFUVVJFICAgMHg0NTRjNDk0NjIwNDk0MjQ5CisjZGVmaW5lIEVGSV9GSUxFX0hFQURFUl9SRVZJU0lPTiAgICAweDAwMDEwMDAwCisjZGVmaW5lIEVGSV9GSUxFX1NUUklOR19TSVpFICAgICAgICAyNjAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9GSUxFX0hFQURFUiB7CisgICAgRUZJX1RBQkxFX0hFQURFUiAgICBIZHI7CisgICAgVUlOVDMyICAgICAgICAgICAgICBDbGFzczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIExCQUxPZmZzZXQ7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBQYXJlbnQ7CisgICAgVUlOVDY0ICAgICAgICAgICAgICBGaWxlU2l6ZTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgIEZpbGVBdHRyaWJ1dGVzOworICAgIEVGSV9USU1FICAgICAgICAgICAgRmlsZUNyZWF0ZVRpbWU7CisgICAgRUZJX1RJTUUgICAgICAgICAgICBGaWxlTW9kaWZpY2F0aW9uVGltZTsKKyAgICBFRklfR1VJRCAgICAgICAgICAgIFZlbmRvckd1aWQ7CisgICAgQ0hBUjE2ICAgICAgICAgICAgICBGaWxlU3RyaW5nW0VGSV9GSUxFX1NUUklOR19TSVpFXTsKK30gRUZJX0ZJTEVfSEVBREVSOworCisKKy8vCisvLyBSZXR1cm4gdGhlIGZpbGUncyBmaXJzdCBMQkFMIHdoaWNoIGlzIGluIHRoZSBzYW1lCisvLyBsb2dpY2FsIGJsb2NrIGFzIHRoZSBmaWxlIGhlYWRlcgorLy8KKworI2RlZmluZSBFRklfRklMRV9MQkFMKGEpICAgICgoRUZJX0xCQUwgKikgKCgoQ0hBUjggKikgKGEpKSArIChhKS0+TEJBTE9mZnNldCkpCisKKyNkZWZpbmUgRUZJX0ZJTEVfQ0xBU1NfRlJFRV9TUEFDRSAgIDEKKyNkZWZpbmUgRUZJX0ZJTEVfQ0xBU1NfRU1QVFkgICAgICAgIDIKKyNkZWZpbmUgRUZJX0ZJTEVfQ0xBU1NfTk9STUFMICAgICAgIDMKKworCisvLworLy8gTG9naWNhbCBCbG9jayBBZGRyZXNzIExpc3QgLSB0aGUgZnVuZGVtZW50YWwgYmxvY2sKKy8vIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQorLy8KKworI2RlZmluZSBFRklfTEJBTF9TSUdOQVRVUkUgICAgICAweDRjNDE0MjRjMjA0OTQyNDkKKyNkZWZpbmUgRUZJX0xCQUxfUkVWSVNJT04gICAgICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0xCQUwgeworICAgIEVGSV9UQUJMRV9IRUFERVIgICAgSGRyOworICAgIFVJTlQzMiAgICAgICAgICAgICAgQ2xhc3M7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBQYXJlbnQ7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBOZXh0OworICAgIFVJTlQzMiAgICAgICAgICAgICAgQXJyYXlTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICAgQXJyYXlDb3VudDsKK30gRUZJX0xCQUw7CisKKy8vIEFycmF5IHNpemUgCisjZGVmaW5lIEVGSV9MQkFMX0FSUkFZX1NJWkUobGJhbCxvZmZzLGJsa3MpICBcCisgICAgICAgICgoKGJsa3MpIC0gKG9mZnMpIC0gKGxiYWwpLT5IZHIuSGVhZGVyU2l6ZSkgLyBzaXplb2YoRUZJX1JMKSkKKworLy8KKy8vIExvZ2ljYWwgQmxvY2sgcnVuLWxlbmd0aAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9MQkEgICAgIFN0YXJ0OworICAgIFVJTlQ2NCAgICAgIExlbmd0aDsKK30gRUZJX1JMOworCisvLworLy8gUmV0dXJuIHRoZSBydW4tbGVuZ3RoIHN0cnVjdHVyZSBmcm9tIGFuIExCQUwgaGVhZGVyCisvLworCisjZGVmaW5lIEVGSV9MQkFMX1JMKGEpICAgICAgKChFRklfUkwqKSAoKChDSEFSOCAqKSAoYSkpICsgKGEpLT5IZHIuSGVhZGVyU2l6ZSkpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9lZmlncHQuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWdwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjk0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlncHQuaApAQCAtMCwwICsxLDY4IEBACisjaWZuZGVmIF9FRklfR1BUX0gKKyNkZWZpbmUgX0VGSV9HUFRfSAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgRWZpR3B0LmgKKyAgICAKK0Fic3RyYWN0OgorICAgIEluY2x1ZGUgZmlsZSBmb3IgRUZJIHBhcnRpdGlvbmluZyBzY2hlbWUKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjZGVmaW5lIFBSSU1BUllfUEFSVF9IRUFERVJfTEJBICAgICAgICAgMQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RBQkxFX0hFQURFUiAgICBIZWFkZXI7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBNeUxCQTsKKyAgICBFRklfTEJBICAgICAgICAgICAgIEFsdGVybmF0ZUxCQTsKKyAgICBFRklfTEJBICAgICAgICAgICAgIEZpcnN0VXNhYmxlTEJBOworICAgIEVGSV9MQkEgICAgICAgICAgICAgTGFzdFVzYWJsZUxCQTsKKyAgICBFRklfR1VJRCAgICAgICAgICAgIERpc2tHVUlEOworICAgIEVGSV9MQkEgICAgICAgICAgICAgUGFydGl0aW9uRW50cnlMQkE7CisgICAgVUlOVDMyICAgICAgICAgICAgICBOdW1iZXJPZlBhcnRpdGlvbkVudHJpZXM7CisgICAgVUlOVDMyICAgICAgICAgICAgICBTaXplT2ZQYXJ0aXRpb25FbnRyeTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIFBhcnRpdGlvbkVudHJ5QXJyYXlDUkMzMjsKK30gRUZJX1BBUlRJVElPTl9UQUJMRV9IRUFERVI7CisKKyNkZWZpbmUgRUZJX1BUQUJfSEVBREVSX0lEICAiRUZJIFBBUlQiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfR1VJRCAgICBQYXJ0aXRpb25UeXBlR1VJRDsKKyAgICBFRklfR1VJRCAgICBVbmlxdWVQYXJ0aXRpb25HVUlEOworICAgIEVGSV9MQkEgICAgIFN0YXJ0aW5nTEJBOworICAgIEVGSV9MQkEgICAgIEVuZGluZ0xCQTsKKyAgICBVSU5UNjQgICAgICBBdHRyaWJ1dGVzOworICAgIENIQVIxNiAgICAgIFBhcnRpdGlvbk5hbWVbMzZdOworfSBFRklfUEFSVElUSU9OX0VOVFJZOworCisvLworLy8gRUZJIFBhcnRpdGlvbiBBdHRyaWJ1dGVzCisvLworI2RlZmluZSBFRklfUEFSVF9VU0VEX0JZX0VGSSAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMQorI2RlZmluZSBFRklfUEFSVF9SRVFVSVJFRF9UT19GVU5DVElPTiAgIDB4MDAwMDAwMDAwMDAwMDAwMgorI2RlZmluZSBFRklfUEFSVF9VU0VEX0JZX09TICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwNAorI2RlZmluZSBFRklfUEFSVF9SRVFVSVJFRF9CWV9PUyAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwOAorI2RlZmluZSBFRklfUEFSVF9CQUNLVVBfUkVRVUlSRUQgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAxMAorI2RlZmluZSBFRklfUEFSVF9VU0VSX0RBVEEgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAyMAorI2RlZmluZSBFRklfUEFSVF9DUklUSUNBTF9VU0VSX0RBVEEgICAgIDB4MDAwMDAwMDAwMDAwMDA0MAorI2RlZmluZSBFRklfUEFSVF9SRURVTkRBTlRfUEFSVElUSU9OICAgIDB4MDAwMDAwMDAwMDAwMDA4MAorCisjZGVmaW5lIEVGSV9QQVJUX1RZUEVfVU5VU0VEX0dVSUQgICBcCisgICAgeyAweDAwMDAwMDAwLCAweDAwMDAsIDB4MDAwMCwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9IH0KKyAgICAKKyNkZWZpbmUgRUZJX1BBUlRfVFlQRV9FRklfU1lTVEVNX1BBUlRfR1VJRCAgXAorICAgIHsgMHhjMTJhNzMyOCwgMHhmODFmLCAweDExZDIsIHsweGJhLCAweDRiLCAweDAwLCAweGEwLCAweGM5LCAweDNlLCAweGM5LCAweDNifSB9CisKKyNkZWZpbmUgRUZJX1BBUlRfVFlQRV9MRUdBQ1lfTUJSX0dVSUQgICBcCisgICAgeyAweDAyNGRlZTQxLCAweDMzZTcsIDB4MTFkMywgezB4OWQsIDB4NjksIDB4MDAsIDB4MDgsIDB4YzcsIDB4ODEsIDB4ZjMsIDB4OWZ9IH0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWlwLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTUwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlpcC5oCkBAIC0wLDAgKzEsNDU5IEBACisjaWZuZGVmIF9FRklfSVBfSAorI2RlZmluZSBfRUZJX0lQX0gKKworLyorKworQ29weXJpZ2h0IChjKSAyMDEzICBJbnRlbCBDb3Jwb3JhdGlvbgorCistLSovCisKKyNkZWZpbmUgRUZJX0lQNF9TRVJWSUNFX0JJTkRJTkdfUFJPVE9DT0wgXAorICAgezB4YzUxNzExZTcsMHhiNGJmLDB4NDA0YSx7MHhiZiwweGI4LDB4MGEsMHgwNCwgMHg4ZSwweGYxLDB4ZmYsMHhlNH19CisKKyNkZWZpbmUgRUZJX0lQNF9QUk9UT0NPTCBcCisgICAgezB4NDFkOTRjZDIsMHgzNWI2LDB4NDU1YSx7MHg4MiwweDU4LDB4ZDQsMHhlNSwweDEzLDB4MzQsMHhhYSwweGRkfX0KKworI2RlZmluZSBFRklfSVA2X1NFUlZJQ0VfQklORElOR19QUk9UT0NPTCBcCisgICAgezB4ZWM4MzVkZDMsMHhmZTBmLDB4NjE3Yix7MHhhNiwweDIxLDB4YjMsMHg1MCwweGMzLDB4ZTEsMHgzMywweDg4fX0KKworI2RlZmluZSBFRklfSVA2X1BST1RPQ09MIFwKKyAgICB7MHgyYzg3NTlkNSwweDVjMmQsMHg2NmVmLHsweDkyLDB4NWYsMHhiNiwweDZjLDB4MTAsMHgxOSwweDU3LDB4ZTJ9fQorCitJTlRFUkZBQ0VfREVDTChfRUZJX0lQNCk7CitJTlRFUkZBQ0VfREVDTChfRUZJX0lQNik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSEFORExFICAgICAgIEluc3RhbmNlSGFuZGxlOworICAgIEVGSV9JUHY0X0FERFJFU1MgSXA0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN1Ym5ldE1hc2s7Cit9IEVGSV9JUDRfQUREUkVTU19QQUlSOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0hBTkRMRSAgICAgICAgICAgRHJpdmVySGFuZGxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgIEFkZHJlc3NDb3VudDsKKyAgICBFRklfSVA0X0FERFJFU1NfUEFJUiBBZGRyZXNzUGFpcnNbMV07Cit9IEVGSV9JUDRfVkFSSUFCTEVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgRGVmYXVsdFByb3RvY29sOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QW55UHJvdG9jb2w7CisgICAgQk9PTEVBTiAgICAgICAgICBBY2NlcHRJY21wRXJyb3JzOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QnJvYWRjYXN0OworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0UHJvbWlzY3VvdXM7CisgICAgQk9PTEVBTiAgICAgICAgICBVc2VEZWZhdWx0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN0YXRpb25BZGRyZXNzOworICAgIEVGSV9JUHY0X0FERFJFU1MgU3VibmV0TWFzazsKKyAgICBVSU5UOCAgICAgICAgICAgIFR5cGVPZlNlcnZpY2U7CisgICAgVUlOVDggICAgICAgICAgICBUaW1lVG9MaXZlOworICAgIEJPT0xFQU4gICAgICAgICAgRG9Ob3RGcmFnbWVudDsKKyAgICBCT09MRUFOICAgICAgICAgIFJhd0RhdGE7CisgICAgVUlOVDMyICAgICAgICAgICBSZWNlaXZlVGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgIFRyYW5zbWl0VGltZW91dDsKK30gRUZJX0lQNF9DT05GSUdfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9JUHY0X0FERFJFU1MgU3VibmV0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN1Ym5ldE1hc2s7CisgICAgRUZJX0lQdjRfQUREUkVTUyBHYXRld2F5QWRkcmVzczsKK30gRUZJX0lQNF9ST1VURV9UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4IFR5cGU7CisgICAgVUlOVDggQ29kZTsKK30gRUZJX0lQNF9JQ01QX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgIElzU3RhcnRlZDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIE1heFBhY2tldFNpemU7CisgICAgRUZJX0lQNF9DT05GSUdfREFUQSBDb25maWdEYXRhOworICAgIEJPT0xFQU4gICAgICAgICAgICAgSXNDb25maWd1cmVkOworICAgIFVJTlQzMiAgICAgICAgICAgICAgR3JvdXBDb3VudDsKKyAgICBFRklfSVB2NF9BRERSRVNTICAgICpHcm91cFRhYmxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgUm91dGVDb3VudDsKKyAgICBFRklfSVA0X1JPVVRFX1RBQkxFICpSb3V0ZVRhYmxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgSWNtcFR5cGVDb3VudDsKKyAgICBFRklfSVA0X0lDTVBfVFlQRSAgICpJY21wVHlwZUxpc3Q7Cit9IEVGSV9JUDRfTU9ERV9EQVRBOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA0X0dFVF9NT0RFX0RBVEEpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDQgICAgICAgICAgICAgICAgICAqVGhpcywKKyAgICBPVVQgRUZJX0lQNF9NT0RFX0RBVEEgICAgICAgICAgICAgICAqSXA0TW9kZURhdGEgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BTkFHRURfTkVUV09SS19DT05GSUdfREFUQSAqTW5wQ29uZmlnRGF0YSBPUFRJT05BTCwKKyAgICBPVVQgRUZJX1NJTVBMRV9ORVRXT1JLX01PREUgICAgICAgICAqU25wTW9kZURhdGEgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDRfQ09ORklHVVJFKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA0ICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA0X0NPTkZJR19EQVRBICpJcENvbmZpZ0RhdGEgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA0X0dST1VQUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBKb2luRmxhZywKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpHcm91cEFkZHJlc3MgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA0X1JPVVRFUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBEZWxldGVSb3V0ZSwKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpTdWJuZXRBZGRyZXNzLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKlN1Ym5ldE1hc2ssCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqR2F0ZXdheUFkZHJlc3MKKyAgICApOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgIEhlYWRlckxlbmd0aDo0OworICAgIFVJTlQ4ICAgICAgICAgICAgVmVyc2lvbjo0OworICAgIFVJTlQ4ICAgICAgICAgICAgVHlwZU9mU2VydmljZTsKKyAgICBVSU5UMTYgICAgICAgICAgIFRvdGFsTGVuZ3RoOworICAgIFVJTlQxNiAgICAgICAgICAgSWRlbnRpZmljYXRpb247CisgICAgVUlOVDE2ICAgICAgICAgICBGcmFnbWVudGF0aW9uOworICAgIFVJTlQ4ICAgICAgICAgICAgVGltZVRvTGl2ZTsKKyAgICBVSU5UOCAgICAgICAgICAgIFByb3RvY29sOworICAgIFVJTlQxNiAgICAgICAgICAgQ2hlY2tzdW07CisgICAgRUZJX0lQdjRfQUREUkVTUyBTb3VyY2VBZGRyZXNzOworICAgIEVGSV9JUHY0X0FERFJFU1MgRGVzdGluYXRpb25BZGRyZXNzOworfSBFRklfSVA0X0hFQURFUjsKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgRnJhZ21lbnRMZW5ndGg7CisgICAgVk9JRCAgICpGcmFnbWVudEJ1ZmZlcjsKK30gRUZJX0lQNF9GUkFHTUVOVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RJTUUgICAgICAgICAgICAgIFRpbWVTdGFtcDsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgUmVjeWNsZVNpZ25hbDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgSGVhZGVyTGVuZ3RoOworICAgIEVGSV9JUDRfSEVBREVSICAgICAgICAqSGVhZGVyOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBPcHRpb25zTGVuZ3RoOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAqT3B0aW9uczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfSVA0X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX0lQNF9SRUNFSVZFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2NF9BRERSRVNTIFNvdXJjZUFkZHJlc3M7CisgICAgRUZJX0lQdjRfQUREUkVTUyBHYXRld2F5QWRkcmVzczsKKyAgICBVSU5UOCAgICAgICAgICAgIFByb3RvY29sOworICAgIFVJTlQ4ICAgICAgICAgICAgVHlwZU9mU2VydmljZTsKKyAgICBVSU5UOCAgICAgICAgICAgIFRpbWVUb0xpdmU7CisgICAgQk9PTEVBTiAgICAgICAgICBEb05vdEZyYWdtZW50OworfSBFRklfSVA0X09WRVJSSURFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2NF9BRERSRVNTICAgICAgRGVzdGluYXRpb25BZGRyZXNzOworICAgIEVGSV9JUDRfT1ZFUlJJREVfREFUQSAqT3ZlcnJpZGVEYXRhOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBPcHRpb25zTGVuZ3RoOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAqT3B0aW9uc0J1ZmZlcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgVG90YWxEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9JUDRfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfSVA0X1RSQU5TTUlUX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgICAgIEV2ZW50OworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgU3RhdHVzOworICAgIHVuaW9uIHsKKyAgICAgICAgRUZJX0lQNF9SRUNFSVZFX0RBVEEgICpSeERhdGE7CisgICAgICAgIEVGSV9JUDRfVFJBTlNNSVRfREFUQSAqVHhEYXRhOworICAgIH0gUGFja2V0OworfSBFRklfSVA0X0NPTVBMRVRJT05fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDRfVFJBTlNNSVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDRfUkVDRUlWRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA0X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNF9DQU5DRUwpKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA0X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNF9QT0xMKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA0ICpUaGlzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JUDQgeworICAgIEVGSV9JUDRfR0VUX01PREVfREFUQSBHZXRNb2RlRGF0YTsKKyAgICBFRklfSVA0X0NPTkZJR1VSRSAgICAgQ29uZmlndXJlOworICAgIEVGSV9JUDRfR1JPVVBTICAgICAgICBHcm91cHM7CisgICAgRUZJX0lQNF9ST1VURVMgICAgICAgIFJvdXRlczsKKyAgICBFRklfSVA0X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX0lQNF9SRUNFSVZFICAgICAgIFJlY2VpdmU7CisgICAgRUZJX0lQNF9DQU5DRUwgICAgICAgIENhbmNlbDsKKyAgICBFRklfSVA0X1BPTEwgICAgICAgICAgUG9sbDsKK30gRUZJX0lQNDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgRGVmYXVsdFByb3RvY29sOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QW55UHJvdG9jb2w7CisgICAgQk9PTEVBTiAgICAgICAgICBBY2NlcHRJY21wRXJyb3JzOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0UHJvbWlzY3VvdXM7CisgICAgRUZJX0lQdjZfQUREUkVTUyBEZXN0aW5hdGlvbkFkZHJlc3M7CisgICAgRUZJX0lQdjZfQUREUkVTUyBTdGF0aW9uQWRkcmVzczsKKyAgICBVSU5UOCAgICAgICAgICAgIFRyYWZmaWNDbGFzczsKKyAgICBVSU5UOCAgICAgICAgICAgIEhvcExpbWl0OworICAgIFVJTlQzMiAgICAgICAgICAgRmxvd0xhYmVsOworICAgIFVJTlQzMiAgICAgICAgICAgUmVjZWl2ZVRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICBUcmFuc21pdFRpbWVvdXQ7Cit9IEVGSV9JUDZfQ09ORklHX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2Nl9BRERSRVNTIEFkZHJlc3M7CisgICAgVUlOVDggICAgICAgICAgICBQcmVmaXhMZW5ndGg7Cit9IEVGSV9JUDZfQUREUkVTU19JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjZfQUREUkVTUyBHYXRld2F5OworICAgIEVGSV9JUHY2X0FERFJFU1MgRGVzdGluYXRpb247CisgICAgVUlOVDggICAgICAgICAgICBQcmVmaXhMZW5ndGg7Cit9IEVGSV9JUDZfUk9VVEVfVEFCTEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpTmVpZ2hib3JJbkNvbXBsZXRlLAorICAgIEVmaU5laWdoYm9yUmVhY2hhYmxlLAorICAgIEVmaU5laWdoYm9yU3RhbGUsCisgICAgRWZpTmVpZ2hib3JEZWxheSwKKyAgICBFZmlOZWlnaGJvclByb2JlCit9IEVGSV9JUDZfTkVJR0hCT1JfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2Nl9BRERSRVNTICAgICAgIE5laWdoYm9yOworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgTGlua0FkZHJlc3M7CisgICAgRUZJX0lQNl9ORUlHSEJPUl9TVEFURSBTdGF0ZTsKK30gRUZJX0lQNl9ORUlHSEJPUl9DQUNIRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4IFR5cGU7CisgICAgVUlOVDggQ29kZTsKK30gRUZJX0lQNl9JQ01QX1RZUEU7CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIElDTVB2NiB0eXBlIGRlZmluaXRpb25zIGZvciBlcnJvciBtZXNzYWdlcworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBJQ01QX1Y2X0RFU1RfVU5SRUFDSEFCTEUgICAgIDB4MQorI2RlZmluZSBJQ01QX1Y2X1BBQ0tFVF9UT09fQklHICAgICAgIDB4MgorI2RlZmluZSBJQ01QX1Y2X1RJTUVfRVhDRUVERUQgICAgICAgIDB4MworI2RlZmluZSBJQ01QX1Y2X1BBUkFNRVRFUl9QUk9CTEVNICAgIDB4NAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBJQ01QdjYgdHlwZSBkZWZpbml0aW9uIGZvciBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElDTVBfVjZfRUNIT19SRVFVRVNUICAgICAgICAgMHg4MAorI2RlZmluZSBJQ01QX1Y2X0VDSE9fUkVQTFkgICAgICAgICAgIDB4ODEKKyNkZWZpbmUgSUNNUF9WNl9MSVNURU5FUl9RVUVSWSAgICAgICAweDgyCisjZGVmaW5lIElDTVBfVjZfTElTVEVORVJfUkVQT1JUICAgICAgMHg4MworI2RlZmluZSBJQ01QX1Y2X0xJU1RFTkVSX0RPTkUgICAgICAgIDB4ODQKKyNkZWZpbmUgSUNNUF9WNl9ST1VURVJfU09MSUNJVCAgICAgICAweDg1CisjZGVmaW5lIElDTVBfVjZfUk9VVEVSX0FEVkVSVElTRSAgICAgMHg4NgorI2RlZmluZSBJQ01QX1Y2X05FSUdIQk9SX1NPTElDSVQgICAgIDB4ODcKKyNkZWZpbmUgSUNNUF9WNl9ORUlHSEJPUl9BRFZFUlRJU0UgICAweDg4CisjZGVmaW5lIElDTVBfVjZfUkVESVJFQ1QgICAgICAgICAgICAgMHg4OQorI2RlZmluZSBJQ01QX1Y2X0xJU1RFTkVSX1JFUE9SVF8yICAgIDB4OEYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gSUNNUHY2IGNvZGUgZGVmaW5pdGlvbnMgZm9yIElDTVBfVjZfREVTVF9VTlJFQUNIQUJMRQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBJQ01QX1Y2X05PX1JPVVRFX1RPX0RFU1QgICAgIDB4MAorI2RlZmluZSBJQ01QX1Y2X0NPTU1fUFJPSElCSVRFRCAgICAgIDB4MQorI2RlZmluZSBJQ01QX1Y2X0JFWU9ORF9TQ09QRSAgICAgICAgIDB4MgorI2RlZmluZSBJQ01QX1Y2X0FERFJfVU5SRUFDSEFCTEUgICAgIDB4MworI2RlZmluZSBJQ01QX1Y2X1BPUlRfVU5SRUFDSEFCTEUgICAgIDB4NAorI2RlZmluZSBJQ01QX1Y2X1NPVVJDRV9BRERSX0ZBSUxFRCAgIDB4NQorI2RlZmluZSBJQ01QX1Y2X1JPVVRFX1JFSkVDVEVEICAgICAgIDB4NgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBJQ01QdjYgY29kZSBkZWZpbml0aW9ucyBmb3IgSUNNUF9WNl9USU1FX0VYQ0VFREVECisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElDTVBfVjZfVElNRU9VVF9IT1BfTElNSVQgICAgMHgwCisjZGVmaW5lIElDTVBfVjZfVElNRU9VVF9SRUFTU0VNQkxFICAgMHgxCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIElDTVB2NiBjb2RlIGRlZmluaXRpb25zIGZvciBJQ01QX1Y2X1BBUkFNRVRFUl9QUk9CTEVNCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElDTVBfVjZfRVJST05FT1VTX0hFQURFUiAgICAgMHgwCisjZGVmaW5lIElDTVBfVjZfVU5SRUNPR05JWkVfTkVYVF9IRFIgMHgxCisjZGVmaW5lIElDTVBfVjZfVU5SRUNPR05JWkVfT1BUSU9OICAgMHgyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIElzU3RhcnRlZDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIE1heFBhY2tldFNpemU7CisgICAgRUZJX0lQNl9DT05GSUdfREFUQSAgICBDb25maWdEYXRhOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgSXNDb25maWd1cmVkOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgQWRkcmVzc0NvdW50OworICAgIEVGSV9JUDZfQUREUkVTU19JTkZPICAgKkFkZHJlc3NMaXN0OworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgR3JvdXBDb3VudDsKKyAgICBFRklfSVB2Nl9BRERSRVNTICAgICAgICpHcm91cFRhYmxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgUm91dGVDb3VudDsKKyAgICBFRklfSVA2X1JPVVRFX1RBQkxFICAgICpSb3V0ZVRhYmxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgTmVpZ2hib3JDb3VudDsKKyAgICBFRklfSVA2X05FSUdIQk9SX0NBQ0hFICpOZWlnaGJvckNhY2hlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgUHJlZml4Q291bnQ7CisgICAgRUZJX0lQNl9BRERSRVNTX0lORk8gICAqUHJlZml4VGFibGU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBJY21wVHlwZUNvdW50OworICAgIEVGSV9JUDZfSUNNUF9UWVBFICAgICAgKkljbXBUeXBlTGlzdDsKK30gRUZJX0lQNl9NT0RFX0RBVEE7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfR0VUX01PREVfREFUQSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNiAgICAgICAgICAgICAgICAgICpUaGlzLAorICAgIE9VVCBFRklfSVA2X01PREVfREFUQSAgICAgICAgICAgICAgICpJcDZNb2RlRGF0YSAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfTUFOQUdFRF9ORVRXT1JLX0NPTkZJR19EQVRBICpNbnBDb25maWdEYXRhIE9QVElPTkFMLAorICAgIE9VVCBFRklfU0lNUExFX05FVFdPUktfTU9ERSAgICAgICAgICpTbnBNb2RlRGF0YSAgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9DT05GSUdVUkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICAgICpUaGlzLAorICAgIElOIEVGSV9JUDZfQ09ORklHX0RBVEEgKklwNkNvbmZpZ0RhdGEgT1BUSU9OQUwKKyAgICApOwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9HUk9VUFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgSm9pbkZsYWcsCisgICAgSU4gRUZJX0lQdjZfQUREUkVTUyAqR3JvdXBBZGRyZXNzIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9ST1VURVMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgRGVsZXRlUm91dGUsCisgICAgSU4gRUZJX0lQdjZfQUREUkVTUyAqRGVzdGluYXRpb24gICAgT1BUSU9OQUwsCisgICAgSU4gVUlOVDggICAgICAgICAgICBQcmVmaXhMZW5ndGgsCisgICAgSU4gRUZJX0lQdjZfQUREUkVTUyAqR2F0ZXdheUFkZHJlc3MgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA2X05FSUdIQk9SUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNiAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBEZWxldGVGbGFnLAorICAgIElOIEVGSV9JUHY2X0FERFJFU1MgKlRhcmdldElwNkFkZHJlc3MsCisgICAgSU4gRUZJX01BQ19BRERSRVNTICAqVGFyZ2V0TGlua0FkZHJlc3MgT1BUSU9OQUwsCisgICAgSU4gVUlOVDMyICAgICAgICAgICBUaW1lb3V0LAorICAgIElOIEJPT0xFQU4gICAgICAgICAgT3ZlcnJpZGUKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lQNl9GUkFHTUVOVF9EQVRBIHsKKyAgICBVSU5UMzIgRnJhZ21lbnRMZW5ndGg7CisgICAgVk9JRCAgICpGcmFnbWVudEJ1ZmZlcjsKK30gRUZJX0lQNl9GUkFHTUVOVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lQNl9PVkVSUklERV9EQVRBIHsKKyAgICBVSU5UOCAgUHJvdG9jb2w7CisgICAgVUlOVDggIEhvcExpbWl0OworICAgIFVJTlQzMiBGbG93TGFiZWw7Cit9IEVGSV9JUDZfT1ZFUlJJREVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JUDZfVFJBTlNNSVRfREFUQSB7CisgICAgRUZJX0lQdjZfQUREUkVTUyAgICAgIERlc3RpbmF0aW9uQWRkcmVzczsKKyAgICBFRklfSVA2X09WRVJSSURFX0RBVEEgKk92ZXJyaWRlRGF0YTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgRXh0SGRyc0xlbmd0aDsKKyAgICBWT0lEICAgICAgICAgICAgICAgICAgKkV4dEhkcnM7CisgICAgVUlOVDggICAgICAgICAgICAgICAgIE5leHRIZWFkZXI7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX0lQNl9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9JUDZfVFJBTlNNSVRfREFUQTsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lQNl9IRUFERVIgeworICAgIFVJTlQ4ICAgICAgICAgICAgVHJhZmZpY0NsYXNzSDo0OworICAgIFVJTlQ4ICAgICAgICAgICAgVmVyc2lvbjo0OworICAgIFVJTlQ4ICAgICAgICAgICAgRmxvd0xhYmVsSDo0OworICAgIFVJTlQ4ICAgICAgICAgICAgVHJhZmZpY0NsYXNzTDo0OworICAgIFVJTlQxNiAgICAgICAgICAgRmxvd0xhYmVsTDsKKyAgICBVSU5UMTYgICAgICAgICAgIFBheWxvYWRMZW5ndGg7CisgICAgVUlOVDggICAgICAgICAgICBOZXh0SGVhZGVyOworICAgIFVJTlQ4ICAgICAgICAgICAgSG9wTGltaXQ7CisgICAgRUZJX0lQdjZfQUREUkVTUyBTb3VyY2VBZGRyZXNzOworICAgIEVGSV9JUHY2X0FERFJFU1MgRGVzdGluYXRpb25BZGRyZXNzOworfSBFRklfSVA2X0hFQURFUjsKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IF9FRklfSVA2X1JFQ0VJVkVfREFUQSB7CisgICAgRUZJX1RJTUUgICAgICAgICAgICAgIFRpbWVTdGFtcDsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgUmVjeWNsZVNpZ25hbDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgSGVhZGVyTGVuZ3RoOworICAgIEVGSV9JUDZfSEVBREVSICAgICAgICAqSGVhZGVyOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9JUDZfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfSVA2X1JFQ0VJVkVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9FVkVOVCAgICAgICAgICAgICAgICAgRXZlbnQ7CisgICAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICBTdGF0dXM7CisgICAgdW5pb24geworCUVGSV9JUDZfUkVDRUlWRV9EQVRBICAqUnhEYXRhOworCUVGSV9JUDZfVFJBTlNNSVRfREFUQSAqVHhEYXRhOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0OworfSBFRklfSVA2X0NPTVBMRVRJT05fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfVFJBTlNNSVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQNl9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfUkVDRUlWRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNiAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA2X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9DQU5DRUwpKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNiAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA2X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9QT0xMKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA2ICpUaGlzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JUDYgeworICAgIEVGSV9JUDZfR0VUX01PREVfREFUQSBHZXRNb2RlRGF0YTsKKyAgICBFRklfSVA2X0NPTkZJR1VSRSAgICAgQ29uZmlndXJlOworICAgIEVGSV9JUDZfR1JPVVBTICAgICAgICBHcm91cHM7CisgICAgRUZJX0lQNl9ST1VURVMgICAgICAgIFJvdXRlczsKKyAgICBFRklfSVA2X05FSUdIQk9SUyAgICAgTmVpZ2hib3JzOworICAgIEVGSV9JUDZfVFJBTlNNSVQgICAgICBUcmFuc21pdDsKKyAgICBFRklfSVA2X1JFQ0VJVkUgICAgICAgUmVjZWl2ZTsKKyAgICBFRklfSVA2X0NBTkNFTCAgICAgICAgQ2FuY2VsOworICAgIEVGSV9JUDZfUE9MTCAgICAgICAgICBQb2xsOworfSBFRklfSVA2OworCisjZW5kaWYgLyogX0VGSV9JUF9IICovCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9lZmlsaWIuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDU0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlsaWIuaApAQCAtMCwwICsxLDkxMCBAQAorI2lmbmRlZiBfRUZJTElCX0lOQ0xVREVfCisjZGVmaW5lIF9FRklMSUJfSU5DTFVERV8KKworLyorKworCitDb3B5cmlnaHQgKGMpIDIwMDAgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpbGliLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgbGlicmFyeSBmdW5jdGlvbnMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAiZWZpZGVidWcuaCIKKyNpbmNsdWRlICJlZmlwYXJ0LmgiCisjaW5jbHVkZSAiZWZpbGlicGxhdC5oIgorI2luY2x1ZGUgImVmaWxpbmsuaCIKKyNpbmNsdWRlICJlZmlydGxpYi5oIgorI2luY2x1ZGUgImVmaXN0ZGFyZy5oIgorI2luY2x1ZGUgInBjaTIyLmgiCisjaW5jbHVkZSAibGlic21iaW9zLmgiCisKKy8vCisvLyBQdWJsaWMgcmVhZC1vbmx5IGRhdGEgaW4gdGhlIEVGSSBsaWJyYXJ5CisvLworCitleHRlcm4gRUZJX1NZU1RFTV9UQUJMRSAgICAgICAgICpTVDsKK2V4dGVybiBFRklfQk9PVF9TRVJWSUNFUyAgICAgICAgKkJTOworZXh0ZXJuIEVGSV9SVU5USU1FX1NFUlZJQ0VTICAgICAqUlQ7CisKK2V4dGVybiBFRklfR1VJRCBEZXZpY2VQYXRoUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgTG9hZGVkSW1hZ2VQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBUZXh0SW5Qcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBUZXh0T3V0UHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgQmxvY2tJb1Byb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIERpc2tJb1Byb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIEZpbGVTeXN0ZW1Qcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBMb2FkRmlsZVByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIERldmljZUlvUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVmFyaWFibGVTdG9yZVByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIExlZ2FjeUJvb3RQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBVbmljb2RlQ29sbGF0aW9uUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgU2VyaWFsSW9Qcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBWZ2FDbGFzc1Byb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFRleHRPdXRTcGxpdGVyUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgRXJyb3JPdXRTcGxpdGVyUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVGV4dEluU3BsaXRlclByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFNpbXBsZU5ldHdvcmtQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBQeGVCYXNlQ29kZVByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFB4ZUNhbGxiYWNrUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgTmV0d29ya0ludGVyZmFjZUlkZW50aWZpZXJQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBVaVByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIEludGVybmFsU2hlbGxQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBQY2lJb1Byb3RvY29sOworCitleHRlcm4gRUZJX0dVSUQgRWZpR2xvYmFsVmFyaWFibGU7CitleHRlcm4gRUZJX0dVSUQgR2VuZXJpY0ZpbGVJbmZvOworZXh0ZXJuIEVGSV9HVUlEIEZpbGVTeXN0ZW1JbmZvOworZXh0ZXJuIEVGSV9HVUlEIEZpbGVTeXN0ZW1Wb2x1bWVMYWJlbEluZm87CitleHRlcm4gRUZJX0dVSUQgUGNBbnNpUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVnQxMDBQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBOdWxsR3VpZDsKK2V4dGVybiBFRklfR1VJRCBVbmtub3duRGV2aWNlOworCitleHRlcm4gRUZJX0dVSUQgRWZpUGFydFR5cGVTeXN0ZW1QYXJ0aXRpb25HdWlkOworZXh0ZXJuIEVGSV9HVUlEIEVmaVBhcnRUeXBlTGVnYWN5TWJyR3VpZDsKKworZXh0ZXJuIEVGSV9HVUlEIE1wc1RhYmxlR3VpZDsKK2V4dGVybiBFRklfR1VJRCBBY3BpVGFibGVHdWlkOworZXh0ZXJuIEVGSV9HVUlEIFNNQklPU1RhYmxlR3VpZDsKK2V4dGVybiBFRklfR1VJRCBTYWxTeXN0ZW1UYWJsZUd1aWQ7CisKKy8vCisvLyBFRkkgVmFyaWFibGUgc3RyaW5ncworLy8KKyNkZWZpbmUgTE9BRF9PUFRJT05fQUNUSVZFICAgICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIFZhckxhbmd1YWdlQ29kZXMgICAgICAgTCJMYW5nQ29kZXMiCisjZGVmaW5lIFZhckxhbmd1YWdlICAgICAgICAgICAgTCJMYW5nIgorI2RlZmluZSBWYXJUaW1lb3V0ICAgICAgICAgICAgIEwiVGltZW91dCIKKyNkZWZpbmUgVmFyQ29uc29sZUlucCAgICAgICAgICBMIkNvbkluIgorI2RlZmluZSBWYXJDb25zb2xlT3V0ICAgICAgICAgIEwiQ29uT3V0IgorI2RlZmluZSBWYXJFcnJvck91dCAgICAgICAgICAgIEwiRXJyT3V0IgorI2RlZmluZSBWYXJCb290T3B0aW9uICAgICAgICAgIEwiQm9vdCUwNHgiCisjZGVmaW5lIFZhckJvb3RPcmRlciAgICAgICAgICAgTCJCb290T3JkZXIiCisjZGVmaW5lIFZhckJvb3ROZXh0ICAgICAgICAgICAgTCJCb290TmV4dCIKKyNkZWZpbmUgVmFyQm9vdEN1cnJlbnQgICAgICAgICBMIkJvb3RDdXJyZW50IgorI2RlZmluZSBWYXJEcml2ZXJPcHRpb24gICAgICAgIEwiRHJpdmVyJTA0eCIKKyNkZWZpbmUgVmFyRHJpdmVyT3JkZXIgICAgICAgICBMIkRyaXZlck9yZGVyIgorI2RlZmluZSBWYXJDb25zb2xlSW5wRGV2ICAgICAgIEwiQ29uSW5EZXYiCisjZGVmaW5lIFZhckNvbnNvbGVPdXREZXYgICAgICAgTCJDb25PdXREZXYiCisjZGVmaW5lIFZhckVycm9yT3V0RGV2ICAgICAgICAgTCJFcnJPdXREZXYiCisKKyNkZWZpbmUgTGFuZ3VhZ2VDb2RlRW5nbGlzaCAgICAiZW5nIgorCitleHRlcm4gRUZJX0RFVklDRV9QQVRIIFJvb3REZXZpY2VQYXRoW107CitleHRlcm4gRUZJX0RFVklDRV9QQVRIIEVuZERldmljZVBhdGhbXTsKK2V4dGVybiBFRklfREVWSUNFX1BBVEggRW5kSW5zdGFuY2VEZXZpY2VQYXRoW107CisKKy8vCisvLyBPdGhlciBwdWJsaWMgZGF0YSBpbiB0aGUgRUZJIGxpYnJhcnkKKy8vCisKK2V4dGVybiBFRklfTUVNT1JZX1RZUEUgUG9vbEFsbG9jYXRpb25UeXBlOworCisvLworLy8gU1RBVElDIC0gTmFtZSBpcyBpbnRlcm5hbCB0byB0aGUgbW9kdWxlCisvLyBJTlRFUk5BTCAtIE5hbWUgaXMgaW50ZXJuYWwgdG8gdGhlIGNvbXBvbmVudCAoaS5lLiwgZGlyZWN0b3J5KQorLy8gQk9PVFNFUlZDRSAtIE5hbWUgb2YgYSBib290IHNlcnZpY2UgZnVuY3Rpb24KKy8vCisKKyNkZWZpbmUgU1RBVElDCisjZGVmaW5lIElOVEVSTkFMCisjZGVmaW5lIEJPT1RTRVJWSUNFCisKKy8vCisvLyBQcm90b3R5cGVzCisvLworCitWT0lECitJbml0aWFsaXplTGliICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgICBJTiBFRklfU1lTVEVNX1RBQkxFICAgICAqU3lzdGVtVGFibGUKKyAgICApOworCitWT0lECitJbml0aWFsaXplVW5pY29kZVN1cHBvcnQgKAorICAgIENIQVI4ICpMYW5nQ29kZQorICAgICk7CisKK1ZPSUQKK0VGSURlYnVnVmFyaWFibGUgKAorICAgIFZPSUQKKyAgICApOworCitWT0lECitTZXRDcmMgKAorICAgIElOIE9VVCBFRklfVEFCTEVfSEVBREVSICpIZHIKKyAgICApOworCitWT0lECitTZXRDcmNBbHRTaXplICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgU2l6ZSwKKyAgICBJTiBPVVQgRUZJX1RBQkxFX0hFQURFUiAqSGRyCisgICAgKTsKKworQk9PTEVBTgorQ2hlY2tDcmMgKAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICBNYXhTaXplLAorICAgIElOIE9VVCBFRklfVEFCTEVfSEVBREVSICpIZHIKKyAgICApOworCitCT09MRUFOCitDaGVja0NyY0FsdFNpemUgKAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICBNYXhTaXplLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICBTaXplLAorICAgIElOIE9VVCBFRklfVEFCTEVfSEVBREVSICpIZHIKKyAgICApOworCitVSU5UMzIKK0NhbGN1bGF0ZUNyYyAoCisgICAgVUlOVDggKnB0LAorICAgIFVJTlROIFNpemUKKyAgICApOworCitWT0lECitaZXJvTWVtICgKKyAgICBJTiBWT0lEICAgICAqQnVmZmVyLAorICAgIElOIFVJTlROICAgICBTaXplCisgICAgKTsKKworVk9JRAorU2V0TWVtICgKKyAgICBJTiBWT0lEICAgICAqQnVmZmVyLAorICAgIElOIFVJTlROICAgIFNpemUsCisgICAgSU4gVUlOVDggICAgVmFsdWUgICAgCisgICAgKTsKKworVk9JRAorQ29weU1lbSAoCisgICAgSU4gVk9JRCAgICAgKkRlc3QsCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKlNyYywKKyAgICBJTiBVSU5UTiAgICBsZW4KKyAgICApOworCitJTlROCitDb21wYXJlTWVtICgKKyAgICBJTiBDT05TVCBWT0lEICAgICAqRGVzdCwKKyAgICBJTiBDT05TVCBWT0lEICAgICAqU3JjLAorICAgIElOIFVJTlROICAgIGxlbgorICAgICk7CisKK0lOVE4KK1N0ckNtcCAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxLAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMgorICAgICk7CisKK0lOVE4KK1N0cm5DbXAgKAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczIsCisgICAgSU4gVUlOVE4gICAgbGVuCisgICAgKTsKKworSU5UTgorU3RyaUNtcCAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxLAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMgorICAgICk7CisKK1ZPSUQKK1N0ckx3ciAoCisgICAgSU4gQ0hBUjE2ICAgKlN0cgorICAgICk7CisKK1ZPSUQKK1N0clVwciAoCisgICAgSU4gQ0hBUjE2ICAgKlN0cgorICAgICk7CisKK1ZPSUQKK1N0ckNweSAoCisgICAgSU4gQ0hBUjE2ICAgKkRlc3QsCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgICpTcmMKKyAgICApOworCitWT0lECitTdHJDYXQgKAorICAgIElOIENIQVIxNiAgICpEZXN0LAorICAgIElOIENPTlNUIENIQVIxNiAgICpTcmMKKyAgICApOworCitVSU5UTgorU3RyTGVuICgKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczEKKyAgICApOworCitVSU5UTgorU3RyU2l6ZSAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxCisgICAgKTsKKworQ0hBUjE2ICoKK1N0ckR1cGxpY2F0ZSAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKlNyYworICAgICk7CisKK1VJTlROCitzdHJsZW5hICgKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczEKKyAgICApOworICAgIAorVUlOVE4KK3N0cmNtcGEgKAorICAgIElOIENPTlNUIENIQVI4ICAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczIKKyAgICApOworCitVSU5UTgorc3RybmNtcGEgKAorICAgIElOIENPTlNUIENIQVI4ICAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczIsCisgICAgSU4gVUlOVE4gICAgbGVuCisgICAgKTsKKworVUlOVE4KK3h0b2kgKAorICAgIENPTlNUIENIQVIxNiAgICAgICpzdHIKKyAgICApOworCitVSU5UTgorQXRvaSAoCisgICAgQ09OU1QgQ0hBUjE2ICAqc3RyCisgICAgKTsKKworQk9PTEVBTiAKK01ldGFNYXRjaCAoCisgICAgSU4gQ0hBUjE2ICAgKlN0cmluZywKKyAgICBJTiBDSEFSMTYgICAqUGF0dGVybgorICAgICk7CisKK0JPT0xFQU4gCitNZXRhaU1hdGNoICgKKyAgICBJTiBDSEFSMTYgICAqU3RyaW5nLAorICAgIElOIENIQVIxNiAgICpQYXR0ZXJuCisgICAgKTsKKworVUlOVDY0CitMU2hpZnRVNjQgKAorICAgIElOIFVJTlQ2NCAgIE9wZXJhbmQsCisgICAgSU4gVUlOVE4gICAgQ291bnQKKyAgICApOworCitVSU5UNjQKK1JTaGlmdFU2NCAoCisgICAgSU4gVUlOVDY0ICAgT3BlcmFuZCwKKyAgICBJTiBVSU5UTiAgICBDb3VudAorICAgICk7CisKK1VJTlQ2NAorTXVsdFU2NHgzMiAoCisgICAgSU4gVUlOVDY0ICAgTXVsdGlwbGljYW5kLAorICAgIElOIFVJTlROICAgIE11bHRpcGxpZXIKKyAgICApOworCitVSU5UNjQKK0RpdlU2NHgzMiAoCisgICAgSU4gVUlOVDY0ICAgRGl2aWRlbmQsCisgICAgSU4gVUlOVE4gICAgRGl2aXNvciwKKyAgICBPVVQgVUlOVE4gICAqUmVtYWluZGVyIE9QVElPTkFMCisgICAgKTsKKworVk9JRAorSW5pdGlhbGl6ZUxvY2sgKAorICAgIElOIE9VVCBGTE9DSyAgICAqTG9jaywKKyAgICBJTiBFRklfVFBMICBQcmlvcml0eQorICAgICk7CisKK1ZPSUQKK0FjcXVpcmVMb2NrICgKKyAgICBJTiBGTE9DSyAgICAqTG9jaworICAgICk7CisKK1ZPSUQKK1JlbGVhc2VMb2NrICgKKyAgICBJTiBGTE9DSyAgICAqTG9jaworICAgICk7CisKKworSU5UTgorQ29tcGFyZUd1aWQoCisgICAgSU4gRUZJX0dVSUQgICAgICpHdWlkMSwKKyAgICBJTiBFRklfR1VJRCAgICAgKkd1aWQyCisgICAgKTsKKworVk9JRCAqCitBbGxvY2F0ZVBvb2wgKAorICAgIElOIFVJTlROICAgICBTaXplCisgICAgKTsKKworVk9JRCAqCitBbGxvY2F0ZVplcm9Qb29sICgKKyAgICBJTiBVSU5UTiAgICAgU2l6ZQorICAgICk7CisKK1ZPSUQgKgorUmVhbGxvY2F0ZVBvb2wgKAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICpPbGRQb29sLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgIE9sZFNpemUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgTmV3U2l6ZQorICAgICk7CisKK1ZPSUQKK0ZyZWVQb29sICgKKyAgICBJTiBWT0lEICAgICAqcAorICAgICk7CisKKworVk9JRAorT3V0cHV0ICgKKyAgICBJTiBDSEFSMTYgICAqU3RyCisgICAgKTsKKworVk9JRAorSW5wdXQgKAorICAgIElOIENIQVIxNiAgICpQcm9tcHQgT1BUSU9OQUwsCisgICAgT1VUIENIQVIxNiAgKkluU3RyLAorICAgIElOIFVJTlROICAgIFN0ckxlbgorICAgICk7CisKK1ZPSUQKK0lJbnB1dCAoCisgICAgSU4gU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKkNvbk91dCwKKyAgICBJTiBTSU1QTEVfSU5QVVRfSU5URVJGQUNFICAgICAgICAgICAqQ29uSW4sCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKlByb21wdCBPUFRJT05BTCwKKyAgICBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqSW5TdHIsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyTGVuCisgICAgKTsKKworVUlOVE4KK1ByaW50ICgKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK1VJTlROCitWUHJpbnQgKAorICAgIElOIENIQVIxNiAgICpmbXQsCisgICAgdmFfbGlzdCAgICAgYXJncworICAgICk7CisKK1VJTlROCitTUHJpbnQgKAorICAgIE9VVCBDSEFSMTYgICpTdHIsCisgICAgSU4gVUlOVE4gICAgU3RyU2l6ZSwKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK1VJTlROCitWU1ByaW50ICgKKyAgICBPVVQgQ0hBUjE2ICAqU3RyLAorICAgIElOIFVJTlROICAgIFN0clNpemUsCisgICAgSU4gQ0hBUjE2ICAgKmZtdCwKKyAgICB2YV9saXN0ICAgICBhcmdzCisgICAgKTsKKworQ0hBUjE2ICoKK1Bvb2xQcmludCAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDSEFSMTYgICAgICAqc3RyOworICAgIFVJTlROICAgICAgIGxlbjsKKyAgICBVSU5UTiAgICAgICBtYXhsZW47Cit9IFBPT0xfUFJJTlQ7CisKK0NIQVIxNiAqCitDYXRQcmludCAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAqU3RyLAorICAgIElOIENIQVIxNiAgICAgICAgICAgKmZtdCwKKyAgICAuLi4KKyAgICApOworCitVSU5UTgorUHJpbnRBdCAoCisgICAgSU4gVUlOVE4gICAgQ29sdW1uLAorICAgIElOIFVJTlROICAgIFJvdywKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK1VJTlROCitJUHJpbnQgKAorICAgIElOIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgKk91dCwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICpmbXQsCisgICAgLi4uCisgICAgKTsKKworVUlOVE4KK0lQcmludEF0ICgKKyAgICBJTiBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqT3V0LAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbiwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3csCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZtdCwKKyAgICAuLi4KKyAgICApOworCitVSU5UTgorQVByaW50ICgKKyAgICBJTiBDSEFSOCAgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK1ZPSUQKK1ZhbHVlVG9IZXggKAorICAgIElOIENIQVIxNiAgICpCdWZmZXIsCisgICAgSU4gVUlOVDY0ICAgdgorICAgICk7CisKK1ZPSUQKK1ZhbHVlVG9TdHJpbmcgKAorICAgIElOIENIQVIxNiAgICpCdWZmZXIsCisgICAgSU4gQk9PTEVBTiAgQ29tbWEsCisgICAgSU4gSU5UNjQgICAgdgorICAgICk7CisKK1ZPSUQKK1RpbWVUb1N0cmluZyAoCisgICAgT1VUIENIQVIxNiAgICAgICpCdWZmZXIsCisgICAgSU4gRUZJX1RJTUUgICAgICpUaW1lCisgICAgKTsKKworVk9JRAorR3VpZFRvU3RyaW5nICgKKyAgICBPVVQgQ0hBUjE2ICAgICAgKkJ1ZmZlciwKKyAgICBJTiBFRklfR1VJRCAgICAgKkd1aWQKKyAgICApOworCitWT0lECitTdGF0dXNUb1N0cmluZyAoCisgICAgT1VUIENIQVIxNiAgICAgICpCdWZmZXIsCisgICAgRUZJX1NUQVRVUyAgICAgIFN0YXR1cworICAgICk7CisKK1ZPSUQKK0R1bXBIZXggKAorICAgIElOIFVJTlROICAgICAgICBJbmRlbnQsCisgICAgSU4gVUlOVE4gICAgICAgIE9mZnNldCwKKyAgICBJTiBVSU5UTiAgICAgICAgRGF0YVNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICpVc2VyRGF0YQorICAgICk7CisKK0JPT0xFQU4KK0dyb3dCdWZmZXIoCisgICAgSU4gT1VUIEVGSV9TVEFUVVMgICAqU3RhdHVzLAorICAgIElOIE9VVCBWT0lEICAgICAgICAgKipCdWZmZXIsCisgICAgSU4gVUlOVE4gICAgICAgICAgICBCdWZmZXJTaXplCisgICAgKTsKKworRUZJX01FTU9SWV9ERVNDUklQVE9SICoKK0xpYk1lbW9yeU1hcCAoCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgKk5vRW50cmllcywKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAqTWFwS2V5LAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICpEZXNjcmlwdG9yU2l6ZSwKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAqRGVzY3JpcHRvclZlcnNpb24KKyAgICApOworCitWT0lEICoKK0xpYkdldFZhcmlhYmxlICgKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAqTmFtZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAqVmVuZG9yR3VpZAorICAgICk7CisKK1ZPSUQgKgorTGliR2V0VmFyaWFibGVBbmRTaXplICgKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAqTmFtZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAqVmVuZG9yR3VpZCwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAqVmFyU2l6ZQorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYkRlbGV0ZVZhcmlhYmxlICgKKyAgICBJTiBDSEFSMTYgICAqVmFyTmFtZSwKKyAgICBJTiBFRklfR1VJRCAqVmFyR3VpZAorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYlNldE5WVmFyaWFibGUgKAorICAgIElOIENIQVIxNiAgICpWYXJOYW1lLAorICAgIElOIEVGSV9HVUlEICpWYXJHdWlkLAorICAgIElOIFVJTlROCSBEYXRhU2l6ZSwKKyAgICBJTiBWT0lEICAgICAqRGF0YQorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYlNldFZhcmlhYmxlICgKKyAgICBJTiBDSEFSMTYgICAqVmFyTmFtZSwKKyAgICBJTiBFRklfR1VJRCAqVmFyR3VpZCwKKyAgICBJTiBVSU5UTgkgRGF0YVNpemUsCisgICAgSU4gVk9JRCAgICAgKkRhdGEKKyAgICApOworRUZJX1NUQVRVUworTGliSW5zZXJ0VG9UYWlsT2ZCb290T3JkZXIgKAorICAgIElOICBVSU5UMTYgIEJvb3RPcHRpb24sCisgICAgSU4gIEJPT0xFQU4gT25seUluc2VydElmRW1wdHkKKyAgICApOworCitFRklfU1RBVFVTCitMaWJMb2NhdGVQcm90b2NvbCAoCisgICAgSU4gIEVGSV9HVUlEICAgICpQcm90b2NvbEd1aWQsCisgICAgT1VUIFZPSUQgICAgICAgICoqSW50ZXJmYWNlCisgICAgKTsKKworRUZJX1NUQVRVUworTGliTG9jYXRlSGFuZGxlICgKKyAgICBJTiBFRklfTE9DQVRFX1NFQVJDSF9UWVBFICAgU2VhcmNoVHlwZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sIE9QVElPTkFMLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU2VhcmNoS2V5IE9QVElPTkFMLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAqTm9IYW5kbGVzLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAqKkJ1ZmZlcgorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYkxvY2F0ZUhhbmRsZUJ5RGlza1NpZ25hdHVyZSAoCisgICAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBNQlJUeXBlLAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlVHlwZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpTaWduYXR1cmUsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqTm9IYW5kbGVzLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAgICAgKipCdWZmZXIKKyAgICApOworCitFRklfU1RBVFVTCitMaWJJbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2VzICgKKyAgICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgICAqSGFuZGxlLAorICAgIC4uLgorICAgICk7CisKK1ZPSUQKK0xpYlVuaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlcyAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgSGFuZGxlLAorICAgIC4uLgorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYlJlaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlcyAoCisgICAgSU4gT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICpIYW5kbGUsCisgICAgLi4uCisgICAgKTsKKworRUZJX0VWRU5UCitMaWJDcmVhdGVQcm90b2NvbE5vdGlmeUV2ZW50ICgKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAqUHJvdG9jb2xHdWlkLAorICAgIElOIEVGSV9UUEwgICAgICAgICAgICAgIE5vdGlmeVRwbCwKKyAgICBJTiBFRklfRVZFTlRfTk9USUZZICAgICBOb3RpZnlGdW5jdGlvbiwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqTm90aWZ5Q29udGV4dCwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAqUmVnaXN0cmF0aW9uCisgICAgKTsKKworRUZJX1NUQVRVUworV2FpdEZvclNpbmdsZUV2ZW50ICgKKyAgICBJTiBFRklfRVZFTlQgICAgICAgIEV2ZW50LAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgVGltZW91dCBPUFRJT05BTAorICAgICk7CisKK1ZPSUQKK1dhaXRGb3JFdmVudFdpdGhUaW1lb3V0ICgKKyAgICBJTiAgRUZJX0VWRU5UICAgICAgIEV2ZW50LAorICAgIElOICBVSU5UTiAgICAgICAgICAgVGltZW91dCwKKyAgICBJTiAgVUlOVE4gICAgICAgICAgIFJvdywKKyAgICBJTiAgVUlOVE4gICAgICAgICAgIENvbHVtbiwKKyAgICBJTiAgQ0hBUjE2ICAgICAgICAgICpTdHJpbmcsCisgICAgSU4gIEVGSV9JTlBVVF9LRVkgICBUaW1lb3V0S2V5LAorICAgIE9VVCBFRklfSU5QVVRfS0VZICAgKktleQorICAgICk7CisKK0VGSV9GSUxFX0hBTkRMRQorTGliT3BlblJvb3QgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgIERldmljZUhhbmRsZQorICAgICk7CisKK0VGSV9GSUxFX0lORk8gKgorTGliRmlsZUluZm8gKAorICAgIElOIEVGSV9GSUxFX0hBTkRMRSAgICAgIEZIYW5kCisgICAgKTsKKworRUZJX0ZJTEVfU1lTVEVNX0lORk8gKgorTGliRmlsZVN5c3RlbUluZm8gKAorICAgIElOIEVGSV9GSUxFX0hBTkRMRSAgICAgIEZIYW5kCisgICAgKTsKKworRUZJX0ZJTEVfU1lTVEVNX1ZPTFVNRV9MQUJFTF9JTkZPICoKK0xpYkZpbGVTeXN0ZW1Wb2x1bWVMYWJlbEluZm8gKAorICAgIElOIEVGSV9GSUxFX0hBTkRMRSAgICAgIEZIYW5kCisgICAgKTsKKworQk9PTEVBTgorVmFsaWRNQlIoCisgICAgSU4gIE1BU1RFUl9CT09UX1JFQ09SRCAgKk1iciwKKyAgICBJTiAgRUZJX0JMT0NLX0lPICAgICAgICAqQmxrSW8KKyAgICApOworCitCT09MRUFOCitMaWJNYXRjaERldmljZVBhdGhzICgKKyAgICBJTiAgRUZJX0RFVklDRV9QQVRIICpNdWx0aSwKKyAgICBJTiAgRUZJX0RFVklDRV9QQVRIICpTaW5nbGUKKyAgICApOworCitFRklfREVWSUNFX1BBVEggKgorTGliRHVwbGljYXRlRGV2aWNlUGF0aEluc3RhbmNlICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICpEZXZQYXRoCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0RldmljZVBhdGhGcm9tSGFuZGxlICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBIYW5kbGUKKyAgICApOworCitFRklfREVWSUNFX1BBVEggKgorRGV2aWNlUGF0aEluc3RhbmNlICgKKyAgICBJTiBPVVQgRUZJX0RFVklDRV9QQVRIICAqKkRldmljZVBhdGgsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgKlNpemUKKyAgICApOworCitVSU5UTgorRGV2aWNlUGF0aEluc3RhbmNlQ291bnQgKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICpEZXZpY2VQYXRoCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0FwcGVuZERldmljZVBhdGggKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICpTcmMxLAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICpTcmMyCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0FwcGVuZERldmljZVBhdGhOb2RlICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqU3JjMSwKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqU3JjMgorICAgICk7CisKK0VGSV9ERVZJQ0VfUEFUSCoKK0FwcGVuZERldmljZVBhdGhJbnN0YW5jZSAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAqU3JjLAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgKkluc3RhbmNlCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0ZpbGVEZXZpY2VQYXRoICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBEZXZpY2UgIE9QVElPTkFMLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICpGaWxlTmFtZQorICAgICk7CisKK1VJTlROCitEZXZpY2VQYXRoU2l6ZSAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKkRldlBhdGgKKyAgICApOworCitFRklfREVWSUNFX1BBVEggKgorRHVwbGljYXRlRGV2aWNlUGF0aCAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKkRldlBhdGgKKyAgICApOworCitFRklfREVWSUNFX1BBVEggKgorVW5wYWNrRGV2aWNlUGF0aCAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKkRldlBhdGgKKyAgICApOworCitFRklfU1RBVFVTCitMaWJEZXZpY2VQYXRoVG9JbnRlcmZhY2UgKAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqRmlsZVBhdGgsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgKipJbnRlcmZhY2UKKyAgICApOworCitDSEFSMTYgKgorRGV2aWNlUGF0aFRvU3RyICgKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAqRGV2UGF0aAorICAgICk7CisKKy8vCisvLyBCdWdCdWc6IEkgbmVlZCBteSBvd24gaW5jbHVkZSBmaWxlcworLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgIFJlZ2lzdGVyOworICAgIFVJTlQ4ICAgRnVuY3Rpb247CisgICAgVUlOVDggICBEZXZpY2U7CisgICAgVUlOVDggICBCdXM7CisgICAgVUlOVDMyICBSZXNlcnZlZDsKK30gRUZJX0FERFJFU1M7CisKK3R5cGVkZWYgdW5pb24geworICAgIFVJTlQ2NCAgICAgICAgICBBZGRyZXNzOworICAgIEVGSV9BRERSRVNTICAgICBFZmlBZGRyZXNzOworfSBFRklfUENJX0FERFJFU1NfVU5JT047CisKKworRUZJX1NUQVRVUworUGNpRmluZERldmljZUNsYXNzICgKKyAgICBJTiAgT1VUIEVGSV9QQ0lfQUREUkVTU19VTklPTiAgICpBZGRyZXNzLAorICAgIElOICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLAorICAgIElOICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgU3ViQ2xhc3MKKyAgICApOworCitFRklfU1RBVFVTCitQY2lGaW5kRGV2aWNlICgKKyAgICBJTiAgT1VUIEVGSV9QQ0lfQUREUkVTU19VTklPTiAgICpEZXZpY2VBZGRyZXNzLAorICAgIElOICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgVmVuZG9ySWQsCisgICAgSU4gICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBEZXZpY2VJZCwKKyAgICBJTiBPVVQgIFBDSV9UWVBFMDAgICAgICAgICAgICAgICpQY2kKKyAgICApOworCisvLworLy8gU0lNUExFX1JFQURfRklMRSBvYmplY3QgdXNlZCB0byBhY2Nlc3MgZmlsZXMKKy8vCisKK3R5cGVkZWYgVk9JRCAgICAgICAgKlNJTVBMRV9SRUFEX0ZJTEU7CisKK0VGSV9TVEFUVVMKK09wZW5TaW1wbGVSZWFkRmlsZSAoCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgIEJvb3RQb2xpY3ksCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpTb3VyY2VCdWZmZXIgICBPUFRJT05BTCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgU291cmNlU2l6ZSwKKyAgICBJTiBPVVQgRUZJX0RFVklDRV9QQVRIICAgICAgKipGaWxlUGF0aCwKKyAgICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgKkRldmljZUhhbmRsZSwgICAgCisgICAgT1VUIFNJTVBMRV9SRUFEX0ZJTEUgICAgICAgICpTaW1wbGVSZWFkSGFuZGxlCisgICAgKTsKKworRUZJX1NUQVRVUworUmVhZFNpbXBsZVJlYWRGaWxlICgKKyAgICBJTiBTSU1QTEVfUkVBRF9GSUxFICAgICBTaW1wbGVSZWFkSGFuZGxlLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAqUmVhZFNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKKworVk9JRAorQ2xvc2VTaW1wbGVSZWFkRmlsZSAoCisgICAgSU4gU0lNUExFX1JFQURfRklMRSAgICAgU2ltcGxlUmVhZEhhbmRsZQorICAgICk7CisKK1ZPSUQKK0luaXRpYWxpemVHdWlkICgKKyAgICBWT0lECisgICAgKTsKKworVUlOVDgKK0RlY2ltYWx0b0JDRCgKKyAgICBJTiAgVUlOVDggRGVjVmFsdWUKKyAgICApOworCitVSU5UOAorQkNEdG9EZWNpbWFsKAorICAgIElOICBVSU5UOCBCY2RWYWx1ZQorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYkdldFN5c3RlbUNvbmZpZ3VyYXRpb25UYWJsZSgKKyAgICBJTiBFRklfR1VJRCAqVGFibGVHdWlkLAorICAgIElOIE9VVCBWT0lEICoqVGFibGUKKyAgICApOworCitCT09MRUFOCitMaWJJc1ZhbGlkVGV4dEdyYXBoaWNzICgKKyAgICBJTiAgQ0hBUjE2ICBHcmFwaGljLCAgIAorICAgIE9VVCBDSEFSOCAgICpQY0Fuc2ksICAgIE9QVElPTkFMCisgICAgT1VUIENIQVI4ICAgKkFzY2lpICAgICAgT1BUSU9OQUwKKyAgICApOworCitCT09MRUFOCitJc1ZhbGlkQXNjaWkgKAorICAgIElOICBDSEFSMTYgIEFzY2lpCisgICAgKTsKKworQk9PTEVBTgorSXNWYWxpZEVmaUNudGxDaGFyICgKKyAgICBJTiAgQ0hBUjE2ICBjCisgICAgKTsKKworQ0hBUjE2ICoKK0xpYkdldFVpU3RyaW5nICgKKyAgICBJTiAgRUZJX0hBTkRMRSAgICAgIEhhbmRsZSwKKyAgICBJTiAgVUlfU1RSSU5HX1RZUEUgIFN0cmluZ1R5cGUsCisgICAgSU4gIElTT182MzlfMiAgICAgICAqTGFuZ0NvZGUsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBSZXR1cm5EZXZpY2VQYXRoU3RyT25NaXNtYXRjaAorICAgICk7CisKK0NIQVI4KgorTGliR2V0U21iaW9zU3RyaW5nICgKKyAgICBJTiAgU01CSU9TX1NUUlVDVFVSRV9QT0lOVEVSICAgICpTbWJpb3MsCisgICAgSU4gIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdOdW1iZXIKKyAgICApOworCitFRklfU1RBVFVTCitMaWJHZXRTbWJpb3NTeXN0ZW1HdWlkQW5kU2VyaWFsTnVtYmVyICgKKyAgICBJTiAgRUZJX0dVSUQgICAgKlN5c3RlbUd1aWQsCisgICAgT1VUIENIQVI4ICAgICAgICoqU3lzdGVtU2VyaWFsTnVtYmVyCisgICAgKTsKKworCitFRklfU1RBVFVTCitJbml0aWFsaXplR2xvYmFsSW9EZXZpY2UgKAorICAgICAgICBJTiAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICpEZXZpY2VQYXRoLAorICAgICAgICBJTiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICAgICAgSU4gIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAqRXJyb3JTdHIsCisgICAgICAgIE9VVCBFRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgICAgKipHbG9iYWxJb0ZuY3MgCisgICAgICAgICk7CisKK1VJTlQzMiAKK1JlYWRQb3J0ICgKKyAgICAgICAgSU4gIEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAgICAqR2xvYmFsSW9GbmNzLCAKKyAgICAgICAgSU4gIEVGSV9JT19XSURUSCAgICAgICAgICAgICAgICBXaWR0aCwKKyAgICAgICAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBQb3J0CisgICAgICAgICk7CisKK1VJTlQzMiAKK1dyaXRlUG9ydCAoCisgICAgICAgIElOICBFRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgICAgKkdsb2JhbElvRm5jcywgCisgICAgICAgIElOICBFRklfSU9fV0lEVEggICAgICAgICAgICAgICAgV2lkdGgsCisgICAgICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgUG9ydCwKKyAgICAgICAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBEYXRhCisgICAgICAgICk7CisKK1VJTlQzMiAKK1JlYWRQY2lDb25maWcgKAorICAgICAgICBJTiAgRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICAgICpHbG9iYWxJb0ZuY3MsIAorICAgICAgICBJTiAgRUZJX0lPX1dJRFRIICAgICAgICAgICAgICAgIFdpZHRoLAorICAgICAgICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIFBvcnQKKyAgICAgICAgKTsKKworVUlOVDMyIAorV3JpdGVQY2lDb25maWcgKAorICAgICAgICBJTiAgRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICAgICpHbG9iYWxJb0ZuY3MsIAorICAgICAgICBJTiAgRUZJX0lPX1dJRFRIICAgICAgICAgICAgICAgIFdpZHRoLAorICAgICAgICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIFBvcnQsCisgICAgICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgRGF0YQorICAgICAgICApOworCitleHRlcm4gRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpHbG9iYWxJb0ZuY3M7CisKKyNkZWZpbmUgb3V0cChfUG9ydCwgX0RhdGFCeXRlKSAgKFVJTlQ4KVdyaXRlUG9ydChHbG9iYWxJb0ZuY3MsICBJT19VSU5UOCwgIChVSU5UTilfUG9ydCwgKFVJTlROKV9EYXRhQnl0ZSkKKyNkZWZpbmUgaW5wKF9Qb3J0KSAgICAgICAgICAgICAgKFVJTlQ4KVJlYWRQb3J0KEdsb2JhbElvRm5jcywgICBJT19VSU5UOCwgIChVSU5UTilfUG9ydCkKKyNkZWZpbmUgb3V0cHcoX1BvcnQsIF9EYXRhQnl0ZSkgKFVJTlQxNilXcml0ZVBvcnQoR2xvYmFsSW9GbmNzLCBJT19VSU5UMTYsIChVSU5UTilfUG9ydCwgKFVJTlROKV9EYXRhQnl0ZSkKKyNkZWZpbmUgaW5wdyhfUG9ydCkgICAgICAgICAgICAgKFVJTlQxNilSZWFkUG9ydChHbG9iYWxJb0ZuY3MsICBJT19VSU5UMTYsIChVSU5UTilfUG9ydCkKKyNkZWZpbmUgb3V0cGQoX1BvcnQsIF9EYXRhQnl0ZSkgKFVJTlQzMilXcml0ZVBvcnQoR2xvYmFsSW9GbmNzLCBJT19VSU5UMzIsIChVSU5UTilfUG9ydCwgKFVJTlROKV9EYXRhQnl0ZSkKKyNkZWZpbmUgaW5wZChfUG9ydCkgICAgICAgICAgICAgKFVJTlQzMilSZWFkUG9ydChHbG9iYWxJb0ZuY3MsICBJT19VSU5UMzIsIChVSU5UTilfUG9ydCkKKworI2RlZmluZSB3cml0ZXBjaTgoX0FkZHIsIF9EYXRhQnl0ZSkgIChVSU5UOClXcml0ZVBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsICBJT19VSU5UOCwgIChVSU5UTilfQWRkciwgKFVJTlROKV9EYXRhQnl0ZSkKKyNkZWZpbmUgcmVhZHBjaTgoX0FkZHIpICAgICAgICAgICAgICAoVUlOVDgpUmVhZFBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsICAgSU9fVUlOVDgsICAoVUlOVE4pX0FkZHIpCisjZGVmaW5lIHdyaXRlcGNpMTYoX0FkZHIsIF9EYXRhQnl0ZSkgKFVJTlQxNilXcml0ZVBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsIElPX1VJTlQxNiwgKFVJTlROKV9BZGRyLCAoVUlOVE4pX0RhdGFCeXRlKQorI2RlZmluZSByZWFkcGNpMTYoX0FkZHIpICAgICAgICAgICAgIChVSU5UMTYpUmVhZFBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsICBJT19VSU5UMTYsIChVSU5UTilfQWRkcikKKyNkZWZpbmUgd3JpdGVwY2kzMihfQWRkciwgX0RhdGFCeXRlKSAoVUlOVDMyKVdyaXRlUGNpQ29uZmlnKEdsb2JhbElvRm5jcywgSU9fVUlOVDMyLCAoVUlOVE4pX0FkZHIsIChVSU5UTilfRGF0YUJ5dGUpCisjZGVmaW5lIHJlYWRwY2kzMihfQWRkcikgICAgICAgICAgICAgKFVJTlQzMilSZWFkUGNpQ29uZmlnKEdsb2JhbElvRm5jcywgIElPX1VJTlQzMiwgKFVJTlROKV9BZGRyKQorCisjZGVmaW5lIFBhdXNlKCkgICAgICAgICAgICAgV2FpdEZvclNpbmdsZUV2ZW50IChTVC0+Q29uSW4tPldhaXRGb3JLZXksIDApCisjZGVmaW5lIFBvcnQ4MChfUG9zdENvZGUpICAgR2xvYmFsSW9GbmNzLT5Jby5Xcml0ZSAoR2xvYmFsSW9GbmNzLCBJT19VSU5UMTYsIChVSU5UNjQpMHg4MCwgMSwgJihfUG9zdENvZGUpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWxpbmsuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaWxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmZmNGZhCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpbGluay5oCkBAIC0wLDAgKzEsMTc3IEBACisjaWZuZGVmIF9FRklfTElOS19ICisjZGVmaW5lIF9FRklfTElOS19ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGxpbmsuaCAocmVuYW1lZCBlZmlsaW5rLmggdG8gYXZvaWQgY29uZmxpY3RzKQorCitBYnN0cmFjdDoKKworICAgIEVGSSBsaW5rIGxpc3QgbWFjcm8ncworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpZm5kZWYgRUZJX05UX0VNVUwKKworLy8KKy8vIExpc3QgZW50cnkgLSBkb3VibHkgbGlua2VkIGxpc3QKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9MSVNUX0VOVFJZIHsKKyAgICBzdHJ1Y3QgX0xJU1RfRU5UUlkgICpGbGluazsKKyAgICBzdHJ1Y3QgX0xJU1RfRU5UUlkgICpCbGluazsKK30gTElTVF9FTlRSWTsKKworI2VuZGlmIAorCisKKy8vCisvLyAgVk9JRAorLy8gIEluaXRpYWxpemVMaXN0SGVhZCgKKy8vICAgICAgTElTVF9FTlRSWSAqTGlzdEhlYWQKKy8vICAgICAgKTsKKy8vCisKKyNkZWZpbmUgSW5pdGlhbGl6ZUxpc3RIZWFkKExpc3RIZWFkKSBcCisgICAgKExpc3RIZWFkKS0+RmxpbmsgPSBMaXN0SGVhZDsgICAgXAorICAgIChMaXN0SGVhZCktPkJsaW5rID0gTGlzdEhlYWQ7CisKKy8vCisvLyAgQk9PTEVBTgorLy8gIElzTGlzdEVtcHR5KAorLy8gICAgICBQTElTVF9FTlRSWSBMaXN0SGVhZAorLy8gICAgICApOworLy8KKworI2RlZmluZSBJc0xpc3RFbXB0eShMaXN0SGVhZCkgXAorICAgICgoTGlzdEhlYWQpLT5GbGluayA9PSAoTGlzdEhlYWQpKQorCisvLworLy8gIFZPSUQKKy8vICBSZW1vdmVFbnRyeUxpc3QoCisvLyAgICAgIFBMSVNUX0VOVFJZIEVudHJ5CisvLyAgICAgICk7CisvLworCisjZGVmaW5lIF9SZW1vdmVFbnRyeUxpc3QoRW50cnkpIHsgICAgICAgXAorICAgICAgICBMSVNUX0VOVFJZICpfQmxpbmssICpfRmxpbms7ICAgIFwKKyAgICAgICAgX0ZsaW5rID0gKEVudHJ5KS0+Rmxpbms7ICAgICAgICBcCisgICAgICAgIF9CbGluayA9IChFbnRyeSktPkJsaW5rOyAgICAgICAgXAorICAgICAgICBfQmxpbmstPkZsaW5rID0gX0ZsaW5rOyAgICAgICAgIFwKKyAgICAgICAgX0ZsaW5rLT5CbGluayA9IF9CbGluazsgICAgICAgICBcCisgICAgICAgIH0KKworI2lmIEVGSV9ERUJVRworICAgICNkZWZpbmUgUmVtb3ZlRW50cnlMaXN0KEVudHJ5KSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9SZW1vdmVFbnRyeUxpc3QoRW50cnkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKEVudHJ5KS0+RmxpbmsgPSAoTElTVF9FTlRSWSAqKSBCQURfUE9JTlRFUjsgICAgXAorICAgICAgICAoRW50cnkpLT5CbGluayA9IChMSVNUX0VOVFJZICopIEJBRF9QT0lOVEVSOyAKKyNlbHNlCisgICAgI2RlZmluZSBSZW1vdmVFbnRyeUxpc3QoRW50cnkpICAgICAgXAorICAgICAgICBfUmVtb3ZlRW50cnlMaXN0KEVudHJ5KTsKKyNlbmRpZgorCisvLworLy8gIFZPSUQKKy8vICBJbnNlcnRUYWlsTGlzdCgKKy8vICAgICAgUExJU1RfRU5UUlkgTGlzdEhlYWQsCisvLyAgICAgIFBMSVNUX0VOVFJZIEVudHJ5CisvLyAgICAgICk7CisvLworCisjZGVmaW5lIEluc2VydFRhaWxMaXN0KExpc3RIZWFkLEVudHJ5KSB7XAorICAgIExJU1RfRU5UUlkgKl9MaXN0SGVhZCwgKl9CbGluazsgICAgIFwKKyAgICBfTGlzdEhlYWQgPSAoTGlzdEhlYWQpOyAgICAgICAgICAgICBcCisgICAgX0JsaW5rID0gX0xpc3RIZWFkLT5CbGluazsgICAgICAgICAgXAorICAgIChFbnRyeSktPkZsaW5rID0gX0xpc3RIZWFkOyAgICAgICAgIFwKKyAgICAoRW50cnkpLT5CbGluayA9IF9CbGluazsgICAgICAgICAgICBcCisgICAgX0JsaW5rLT5GbGluayA9IChFbnRyeSk7ICAgICAgICAgICAgXAorICAgIF9MaXN0SGVhZC0+QmxpbmsgPSAoRW50cnkpOyAgICAgICAgIFwKKyAgICB9CisKKy8vCisvLyAgVk9JRAorLy8gIEluc2VydEhlYWRMaXN0KAorLy8gICAgICBQTElTVF9FTlRSWSBMaXN0SGVhZCwKKy8vICAgICAgUExJU1RfRU5UUlkgRW50cnkKKy8vICAgICAgKTsKKy8vCisKKyNkZWZpbmUgSW5zZXJ0SGVhZExpc3QoTGlzdEhlYWQsRW50cnkpIHtcCisgICAgTElTVF9FTlRSWSAqX0xpc3RIZWFkLCAqX0ZsaW5rOyAgICAgXAorICAgIF9MaXN0SGVhZCA9IChMaXN0SGVhZCk7ICAgICAgICAgICAgIFwKKyAgICBfRmxpbmsgPSBfTGlzdEhlYWQtPkZsaW5rOyAgICAgICAgICBcCisgICAgKEVudHJ5KS0+RmxpbmsgPSBfRmxpbms7ICAgICAgICAgICAgXAorICAgIChFbnRyeSktPkJsaW5rID0gX0xpc3RIZWFkOyAgICAgICAgIFwKKyAgICBfRmxpbmstPkJsaW5rID0gKEVudHJ5KTsgICAgICAgICAgICBcCisgICAgX0xpc3RIZWFkLT5GbGluayA9IChFbnRyeSk7ICAgICAgICAgXAorICAgIH0KKworLy8gIFZPSUQKKy8vICBTd2FwTGlzdEVudHJpZXMoCisvLyAgICAgIFBMSVNUX0VOVFJZIEVudHJ5MSwKKy8vICAgICAgUExJU1RfRU5UUlkgRW50cnkyCisvLyAgICAgICk7CisvLworLy8gUHV0IEVudHJ5MiBiZWZvcmUgRW50cnkxCisvLworI2RlZmluZSBTd2FwTGlzdEVudHJpZXMoRW50cnkxLEVudHJ5Mikge1wKKyAgICBMSVNUX0VOVFJZICpFbnRyeTFGbGluaywgKkVudHJ5MUJsaW5rOyAgICAgXAorICAgIExJU1RfRU5UUlkgKkVudHJ5MkZsaW5rLCAqRW50cnkyQmxpbms7ICAgICBcCisgICAgRW50cnkyRmxpbmsgPSAoRW50cnkyKS0+Rmxpbms7ICAgICAgICAgICAgIFwKKyAgICBFbnRyeTJCbGluayA9IChFbnRyeTIpLT5CbGluazsgICAgICAgICAgICAgXAorICAgIEVudHJ5MUZsaW5rID0gKEVudHJ5MSktPkZsaW5rOyAgICAgICAgICAgICBcCisgICAgRW50cnkxQmxpbmsgPSAoRW50cnkxKS0+Qmxpbms7ICAgICAgICAgICAgIFwKKyAgICBFbnRyeTJCbGluay0+RmxpbmsgPSBFbnRyeTJGbGluazsgICAgICAgXAorICAgIEVudHJ5MkZsaW5rLT5CbGluayA9IEVudHJ5MkJsaW5rOyAgICAgICAgXAorICAgIChFbnRyeTIpLT5GbGluayA9IEVudHJ5MTsgICAgICAgICAgICAgICBcCisgICAgKEVudHJ5MiktPkJsaW5rID0gRW50cnkxQmxpbms7ICAgICAgICAgIFwKKyAgICBFbnRyeTFCbGluay0+RmxpbmsgPSAoRW50cnkyKTsgICAgICAgICAgICBcCisgICAgKEVudHJ5MSktPkJsaW5rID0gKEVudHJ5Mik7ICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vCisvLyAgRUZJX0ZJRUxEX09GRlNFVCAtIHJldHVybnMgdGhlIGJ5dGUgb2Zmc2V0IHRvIGEgZmllbGQgd2l0aGluIGEgc3RydWN0dXJlCisvLworCisjZGVmaW5lIEVGSV9GSUVMRF9PRkZTRVQoVFlQRSxGaWVsZCkgKChVSU5UTikoJigoKFRZUEUgKikgMCktPkZpZWxkKSkpCisKKy8vCisvLyAgQ09OVEFJTklOR19SRUNPUkQgLSByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlCisvLyAgICAgIGZyb20gb25lIG9mIGl0J3MgZWxlbWVudHMuCisvLworCisjZGVmaW5lIF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKSAgXAorICAgICgoVFlQRSAqKSAoIChDSEFSOCAqKShSZWNvcmQpIC0gKENIQVI4ICopICYoKChUWVBFICopIDApLT5GaWVsZCkpKQorCisjaWYgRUZJX0RFQlVHCisgICAgI2RlZmluZSBDUihSZWNvcmQsIFRZUEUsIEZpZWxkLCBTaWcpICAgICBcCisgICAgICAgIF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKS0+U2lnbmF0dXJlICE9IFNpZyA/ICAgICAgICBcCisgICAgICAgICAgICAoVFlQRSAqKSBBU1NFUlRfU1RSVUNUKF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKSwgUmVjb3JkKSA6IFwKKyAgICAgICAgICAgIF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKQorI2Vsc2UKKyAgICAjZGVmaW5lIENSKFJlY29yZCwgVFlQRSwgRmllbGQsIFNpZ25hdHVyZSkgICBcCisgICAgICAgIF9DUihSZWNvcmQsIFRZUEUsIEZpZWxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2VuZGlmCisKKworLy8KKy8vIEEgbG9jayBzdHJ1Y3R1cmUKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9GTE9DSyB7CisgICAgRUZJX1RQTCAgICAgVHBsOworICAgIEVGSV9UUEwgICAgIE93bmVyVHBsOworICAgIFVJTlROICAgICAgIExvY2s7Cit9IEZMT0NLOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvZWZpbmV0LmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmluZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU1YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpbmV0LmgKQEAgLTAsMCArMSwzNDAgQEAKKyNpZm5kZWYgX0VGSU5FVF9ICisjZGVmaW5lIF9FRklORVRfSAorCisKKy8qKysKK0NvcHlyaWdodCAoYykgMTk5OSAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisgICAgZWZpbmV0LmgKKworQWJzdHJhY3Q6CisgICAgRUZJIFNpbXBsZSBOZXR3b3JrIHByb3RvY29sCisKK1JldmlzaW9uIEhpc3RvcnkKKy0tKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgICBTaW1wbGUgTmV0d29yayBQcm90b2NvbAorLy8KKworI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgXAorICAgIHsgMHhBMTk4MzJCOSwgMHhBQzI1LCAweDExRDMsIHsweDlBLCAweDJELCAweDAwLCAweDkwLCAweDI3LCAweDNGLCAweEMxLCAweDREfSB9CisKKworSU5URVJGQUNFX0RFQ0woX0VGSV9TSU1QTEVfTkVUV09SSyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvLworICAgIC8vIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQuICBJbmNsdWRlcyBmcmFtZXMgd2l0aCBlcnJvcnMgYW5kCisgICAgLy8gZHJvcHBlZCBmcmFtZXMuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4VG90YWxGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiB2YWxpZCBmcmFtZXMgcmVjZWl2ZWQgYW5kIGNvcGllZCBpbnRvIHJlY2VpdmUgYnVmZmVycy4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhHb29kRnJhbWVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIGJlbG93IHRoZSBtaW5pbXVtIGxlbmd0aCBmb3IgdGhlIG1lZGlhLgorICAgIC8vIFRoaXMgd291bGQgYmUgPDY0IGZvciBldGhlcm5ldC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhVbmRlcnNpemVGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBmcmFtZXMgbG9uZ2VyIHRoYW4gdGhlIG1heG1pbnVtIGxlbmd0aCBmb3IgdGhlCisgICAgLy8gbWVkaWEuICBUaGlzIHdvdWxkIGJlID4xNTAwIGZvciBldGhlcm5ldC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhPdmVyc2l6ZUZyYW1lczsKKworICAgIC8vCisgICAgLy8gVmFsaWQgZnJhbWVzIHRoYXQgd2VyZSBkcm9wcGVkIGJlY2F1c2UgcmVjZWl2ZSBidWZmZXJzIHdlcmUgZnVsbC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhEcm9wcGVkRnJhbWVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgdmFsaWQgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgYW5kIG5vdCBkcm9wcGVkLgorICAgIC8vCisgICAgVUlOVDY0ICBSeFVuaWNhc3RGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiB2YWxpZCBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIGFuZCBub3QgZHJvcHBlZC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhCcm9hZGNhc3RGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiB2YWxpZCBtdXRsaWNhc3QgZnJhbWVzIHJlY2VpdmVkIGFuZCBub3QgZHJvcHBlZC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhNdWx0aWNhc3RGcmFtZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBmcmFtZXMgdy8gQ1JDIG9yIGFsaWdubWVudCBlcnJvcnMuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4Q3JjRXJyb3JGcmFtZXM7CisKKyAgICAvLworICAgIC8vIFRvdGFsIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4gIEluY2x1ZGVzIGZyYW1lcyB3aXRoIGVycm9ycworICAgIC8vIGFuZCBkcm9wcGVkIGZyYW1lcy4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhUb3RhbEJ5dGVzOworCisgICAgLy8KKyAgICAvLyBUcmFuc21pdCBzdGF0aXN0aWNzLgorICAgIC8vCisgICAgVUlOVDY0ICBUeFRvdGFsRnJhbWVzOworICAgIFVJTlQ2NCAgVHhHb29kRnJhbWVzOworICAgIFVJTlQ2NCAgVHhVbmRlcnNpemVGcmFtZXM7CisgICAgVUlOVDY0ICBUeE92ZXJzaXplRnJhbWVzOworICAgIFVJTlQ2NCAgVHhEcm9wcGVkRnJhbWVzOworICAgIFVJTlQ2NCAgVHhVbmljYXN0RnJhbWVzOworICAgIFVJTlQ2NCAgVHhCcm9hZGNhc3RGcmFtZXM7CisgICAgVUlOVDY0ICBUeE11bHRpY2FzdEZyYW1lczsKKyAgICBVSU5UNjQgIFR4Q3JjRXJyb3JGcmFtZXM7CisgICAgVUlOVDY0ICBUeFRvdGFsQnl0ZXM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBjb2xsaXNpb25zIGRldGVjdGlvbiBvbiB0aGlzIHN1Ym5ldC4KKyAgICAvLworICAgIFVJTlQ2NCAgQ29sbGlzaW9uczsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBkZXN0aW5lZCBmb3IgdW5zdXBwb3J0ZWQgcHJvdG9jb2wuCisgICAgLy8KKyAgICBVSU5UNjQgIFVuc3VwcG9ydGVkUHJvdG9jb2w7CisKK30gRUZJX05FVFdPUktfU1RBVElTVElDUzsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBFZmlTaW1wbGVOZXR3b3JrU3RvcHBlZCwKKyAgICBFZmlTaW1wbGVOZXR3b3JrU3RhcnRlZCwKKyAgICBFZmlTaW1wbGVOZXR3b3JrSW5pdGlhbGl6ZWQsCisgICAgRWZpU2ltcGxlTmV0d29ya01heFN0YXRlCit9IEVGSV9TSU1QTEVfTkVUV09SS19TVEFURTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKworI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9VTklDQVNUICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9NVUxUSUNBU1QgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9CUk9BRENBU1QgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9QUk9NSVNDVU9VUyAgICAgICAgICAgMHgwOAorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9QUk9NSVNDVU9VU19NVUxUSUNBU1QgMHgxMAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCisjZGVmaW5lIEVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFX0lOVEVSUlVQVCAgICAgICAgMHgwMQorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfVFJBTlNNSVRfSU5URVJSVVBUICAgICAgIDB4MDIKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX0NPTU1BTkRfSU5URVJSVVBUICAgICAgICAweDA0CisjZGVmaW5lIEVGSV9TSU1QTEVfTkVUV09SS19TT0ZUV0FSRV9JTlRFUlJVUFQgICAgICAgMHgwOAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworI2RlZmluZSBNQVhfTUNBU1RfRklMVEVSX0NOVCAgICAxNgordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBTdGF0ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgSHdBZGRyZXNzU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgTWVkaWFIZWFkZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBNYXhQYWNrZXRTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBOdlJhbVNpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIE52UmFtQWNjZXNzU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZUZpbHRlck1hc2s7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVGaWx0ZXJTZXR0aW5nOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBNYXhNQ2FzdEZpbHRlckNvdW50OworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBNQ2FzdEZpbHRlckNvdW50OworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNQ2FzdEZpbHRlcltNQVhfTUNBU1RfRklMVEVSX0NOVF07CisgICAgRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzOworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICBCcm9hZGNhc3RBZGRyZXNzOworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICBQZXJtYW5lbnRBZGRyZXNzOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBJZlR5cGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIE1hY0FkZHJlc3NDaGFuZ2VhYmxlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZVR4U3VwcG9ydGVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBNZWRpYVByZXNlbnRTdXBwb3J0ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIE1lZGlhUHJlc2VudDsKK30gRUZJX1NJTVBMRV9ORVRXT1JLX01PREU7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1NUQVJUKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19TVE9QKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19JTklUSUFMSVpFKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBFeHRyYVJ4QnVmZmVyU2l6ZSAgT1BUSU9OQUwsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIEV4dHJhVHhCdWZmZXJTaXplICBPUFRJT05BTAorKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfUkVTRVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRWZXJpZmljYXRpb24KKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1NIVVRET1dOKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFX0ZJTFRFUlMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIFJlc2V0TUNhc3RGaWx0ZXIsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBNQ2FzdEZpbHRlckNudCAgICAgT1BUSU9OQUwsCisgICAgSU4gRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICAqTUNhc3RGaWx0ZXIgICAgICAgT1BUSU9OQUwKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1NUQVRJT05fQUREUkVTUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBSZXNldCwKKyAgICBJTiBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICpOZXcgICAgICBPUFRJT05BTAorKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfU1RBVElTVElDUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBSZXNldCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpTdGF0aXN0aWNzU2l6ZSAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfTkVUV09SS19TVEFUSVNUSUNTICAgICAgKlN0YXRpc3RpY3NUYWJsZSAgT1BUSU9OQUwKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX01DQVNUX0lQX1RPX01BQykgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBJUHY2LAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgKklQLAorICAgIE9VVCBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgKk1BQworKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfTlZEQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBSZWFkV3JpdGUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZSwKKyAgICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfR0VUX1NUQVRVUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAqVGhpcywKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgKkludGVycnVwdFN0YXR1cyAgT1BUSU9OQUwsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICoqVHhCdWYgICAgICAgICAgIE9QVElPTkFMCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19UUkFOU01JVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAgKlRoaXMsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJTaXplLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIsCisgICAgSU4gRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICAqU3JjQWRkciAgICAgT1BUSU9OQUwsCisgICAgSU4gRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICAqRGVzdEFkZHIgICAgT1BUSU9OQUwsCisgICAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAqUHJvdG9jb2wgICAgT1BUSU9OQUwKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKkhlYWRlclNpemUgIE9QVElPTkFMLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyLAorICAgIE9VVCBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgKlNyY0FkZHIgICAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgKkRlc3RBZGRyICAgIE9QVElPTkFMLAorICAgIE9VVCBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgKlByb3RvY29sICAgIE9QVElPTkFMCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCisjZGVmaW5lIEVGSV9TSU1QTEVfTkVUV09SS19JTlRFUkZBQ0VfUkVWSVNJT04gICAweDAwMDEwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIEVGSV9TSU1QTEVfTkVUV09SS19TVEFSVCAgICAgICAgICAgIFN0YXJ0OworICAgIEVGSV9TSU1QTEVfTkVUV09SS19TVE9QICAgICAgICAgICAgIFN0b3A7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX0lOSVRJQUxJWkUgICAgICAgSW5pdGlhbGl6ZTsKKyAgICBFRklfU0lNUExFX05FVFdPUktfUkVTRVQgICAgICAgICAgICBSZXNldDsKKyAgICBFRklfU0lNUExFX05FVFdPUktfU0hVVERPV04gICAgICAgICBTaHV0ZG93bjsKKyAgICBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9GSUxURVJTICBSZWNlaXZlRmlsdGVyczsKKyAgICBFRklfU0lNUExFX05FVFdPUktfU1RBVElPTl9BRERSRVNTICBTdGF0aW9uQWRkcmVzczsKKyAgICBFRklfU0lNUExFX05FVFdPUktfU1RBVElTVElDUyAgICAgICBTdGF0aXN0aWNzOworICAgIEVGSV9TSU1QTEVfTkVUV09SS19NQ0FTVF9JUF9UT19NQUMgIE1DYXN0SXBUb01hYzsKKyAgICBFRklfU0lNUExFX05FVFdPUktfTlZEQVRBICAgICAgICAgICBOdkRhdGE7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX0dFVF9TVEFUVVMgICAgICAgR2V0U3RhdHVzOworICAgIEVGSV9TSU1QTEVfTkVUV09SS19UUkFOU01JVCAgICAgICAgIFRyYW5zbWl0OworICAgIEVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFICAgICAgICAgIFJlY2VpdmU7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FpdEZvclBhY2tldDsKKyAgICBFRklfU0lNUExFX05FVFdPUktfTU9ERSAgICAgICAgICAgICAqTW9kZTsKK30gRUZJX1NJTVBMRV9ORVRXT1JLOworCisjZW5kaWYgLyogX0VGSU5FVF9IICovCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9lZmlwYXJ0LmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlwYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjNTU3MwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaXBhcnQuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9FRklfUEFSVF9ICisjZGVmaW5lIF9FRklfUEFSVF9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaXBhcnQuaAorICAgIAorQWJzdHJhY3Q6ICAgCisgICAgSW5mbyBhYm91dCBkaXNrIHBhcnRpdGlvbnMgYW5kIE1hc3RlciBCb290IFJlY29yZHMKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLworLy8KKworI2RlZmluZSBFRklfUEFSVElUSU9OICAgMHhlZgorI2RlZmluZSBNQlJfU0laRSAgICAgICAgNTEyCisKKyNwcmFnbWEgcGFjaygxKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgQm9vdEluZGljYXRvcjsKKyAgICBVSU5UOCAgICAgICBTdGFydEhlYWQ7CisgICAgVUlOVDggICAgICAgU3RhcnRTZWN0b3I7CisgICAgVUlOVDggICAgICAgU3RhcnRUcmFjazsKKyAgICBVSU5UOCAgICAgICBPU0luZGljYXRvcjsKKyAgICBVSU5UOCAgICAgICBFbmRIZWFkOworICAgIFVJTlQ4ICAgICAgIEVuZFNlY3RvcjsKKyAgICBVSU5UOCAgICAgICBFbmRUcmFjazsKKyAgICBVSU5UOCAgICAgICBTdGFydGluZ0xCQVs0XTsKKyAgICBVSU5UOCAgICAgICBTaXplSW5MQkFbNF07Cit9IE1CUl9QQVJUSVRJT05fUkVDT1JEOworCisjZGVmaW5lIEVYVFJBQ1RfVUlOVDMyKEQpIChVSU5UMzIpKERbMF0gfCAoRFsxXSA8PCA4KSB8IChEWzJdIDw8IDE2KSB8IChEWzNdIDw8IDI0KSkKKworI2RlZmluZSBNQlJfU0lHTkFUVVJFICAgICAgICAgICAweGFhNTUKKyNkZWZpbmUgTUlOX01CUl9ERVZJQ0VfU0laRSAgICAgMHg4MDAwMAorI2RlZmluZSBNQlJfRVJSQVRBX1BBRCAgICAgICAgICAweDQwMDAwIC8vIDEyOCBNQgorCisjZGVmaW5lIE1BWF9NQlJfUEFSVElUSU9OUyAgNCAgIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEJvb3RTdHJhcENvZGVbNDQwXTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBVbmlxdWVNYnJTaWduYXR1cmVbNF07CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgVW5rbm93blsyXTsKKyAgICBNQlJfUEFSVElUSU9OX1JFQ09SRCAgICBQYXJ0aXRpb25bTUFYX01CUl9QQVJUSVRJT05TXTsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBTaWduYXR1cmU7Cit9IE1BU1RFUl9CT09UX1JFQ09SRDsKKyNwcmFnbWEgcGFjaygpCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9lZmlwY2lpby5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpcGNpaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI0Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpcGNpaW8uaApAQCAtMCwwICsxLDIxOSBAQAorI2lmbmRlZiBfRUZJX1BDSV9JT19ICisjZGVmaW5lIF9FRklfUENJX0lPX0gKKworI2RlZmluZSBFRklfUENJX0lPX1BST1RPQ09MIFwKKyAgICB7IDB4NGNmNWIyMDAsIDB4NjhiOCwgMHg0Y2E1LCB7MHg5ZSwgMHhlYywgMHhiMiwgMHgzZSwgMHgzZiwgMHg1MCwgMHgwMiwgMHg5YX0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX1BDSV9JTyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpUGNpSW9XaWR0aFVpbnQ4LAorICAgIEVmaVBjaUlvV2lkdGhVaW50MTYsCisgICAgRWZpUGNpSW9XaWR0aFVpbnQzMiwKKyAgICBFZmlQY2lJb1dpZHRoVWludDY0LAorICAgIEVmaVBjaUlvV2lkdGhGaWZvVWludDgsCisgICAgRWZpUGNpSW9XaWR0aEZpZm9VaW50MTYsCisgICAgRWZpUGNpSW9XaWR0aEZpZm9VaW50MzIsCisgICAgRWZpUGNpSW9XaWR0aEZpZm9VaW50NjQsCisgICAgRWZpUGNpSW9XaWR0aEZpbGxVaW50OCwKKyAgICBFZmlQY2lJb1dpZHRoRmlsbFVpbnQxNiwKKyAgICBFZmlQY2lJb1dpZHRoRmlsbFVpbnQzMiwKKyAgICBFZmlQY2lJb1dpZHRoRmlsbFVpbnQ2NCwKKyAgICBFZmlQY2lJb1dpZHRoTWF4aW11bQorfSBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIOworCisjZGVmaW5lIEVGSV9QQ0lfSU9fUEFTU19USFJPVUdIX0JBUiAweGZmCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfUE9MTF9JT19NRU0pICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIICBXaWR0aCwKKyAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgQmFySW5kZXgsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgTWFzaywKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgVmFsdWUsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIERlbGF5LAorICBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAqUmVzdWx0CisgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfSU9fTUVNKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTF9XSURUSCAgV2lkdGgsCisgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgIEJhckluZGV4LAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgIENvdW50LAorICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAqQnVmZmVyCispOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfSU9fTUVNICAgIFJlYWQ7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfSU9fTUVNICAgIFdyaXRlOworfSBFRklfUENJX0lPX1BST1RPQ09MX0FDQ0VTUzsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUcpICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIICBXaWR0aCwKKyAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICBDb3VudCwKKyAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfUENJX0lPX1BST1RPQ09MX0NPTkZJRyBSZWFkOworICBFRklfUENJX0lPX1BST1RPQ09MX0NPTkZJRyBXcml0ZTsKK30gRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUdfQUNDRVNTOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0NPUFlfTUVNKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTF9XSURUSCAgV2lkdGgsCisgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgIERlc3RCYXJJbmRleCwKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgRGVzdE9mZnNldCwKKyAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgU3JjQmFySW5kZXgsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIFNyY09mZnNldCwKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgQ291bnQKKyAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFZmlQY2lJb09wZXJhdGlvbkJ1c01hc3RlclJlYWQsCisgICAgRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJXcml0ZSwKKyAgICBFZmlQY2lJb09wZXJhdGlvbkJ1c01hc3RlckNvbW1vbkJ1ZmZlciwKKyAgICBFZmlQY2lJb09wZXJhdGlvbk1heGltdW0KK30gRUZJX1BDSV9JT19QUk9UT0NPTF9PUEVSQVRJT047CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfTUFQKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAgICAqVGhpcywKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTF9PUEVSQVRJT04gT3BlcmF0aW9uLAorICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAqSG9zdEFkZHJlc3MsCisgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICpOdW1iZXJPZkJ5dGVzLAorICBPVVQgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAqRGV2aWNlQWRkcmVzcywKKyAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKipNYXBwaW5nCisgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfVU5NQVApICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAqTWFwcGluZworKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9BTExPQ0FURV9CVUZGRVIpICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBFRklfQUxMT0NBVEVfVFlQRSAgICAgICAgICBUeXBlLAorICBJTiBFRklfTUVNT1JZX1RZUEUgICAgICAgICAgICBNZW1vcnlUeXBlLAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICBQYWdlcywKKyAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgKipIb3N0QWRkcmVzcywKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcworICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0ZSRUVfQlVGRkVSKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgUGFnZXMsCisgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICpIb3N0QWRkcmVzcworICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0ZMVVNIKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcworICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0dFVF9MT0NBVElPTikgKAorICBJTiBzdHJ1Y3QgX0VGSV9QQ0lfSU8gKlRoaXMsCisgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICpTZWdtZW50TnVtYmVyLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAqQnVzTnVtYmVyLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAqRGV2aWNlTnVtYmVyLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAqRnVuY3Rpb25OdW1iZXIKKyAgKTsKKworI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9JU0FfSU8gICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX1BBTEVUVEVfSU8gICAgICAgMHgwMDA0CisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX1ZHQV9NRU1PUlkgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfSU8gICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSURFX1BSSU1BUllfSU8gICAgICAgMHgwMDIwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0lERV9TRUNPTkRBUllfSU8gICAgIDB4MDA0MAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUllfV1JJVEVfQ09NQklORSAweDAwODAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSU8gICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX01FTU9SWSAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9CVVNfTUFTVEVSICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfTUVNT1JZX0NBQ0hFRCAgICAgICAgMHgwODAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX01FTU9SWV9ESVNBQkxFICAgICAgIDB4MTAwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9FTUJFRERFRF9ERVZJQ0UgICAgICAweDIwMDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfRU1CRURERURfUk9NICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0RVQUxfQUREUkVTU19DWUNMRSAgIDB4ODAwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9JU0FfSU9fMTYgICAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX1ZHQV9QQUxFVFRFX0lPXzE2ICAgIDB4MjAwMDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX0lPXzE2ICAgICAgICAgICAgMHg0MDAwMAorCit0eXBlZGVmIGVudW0geworICAgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uR2V0LAorICAgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uU2V0LAorICAgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uRW5hYmxlLAorICAgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uRGlzYWJsZSwKKyAgICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvblN1cHBvcnRlZCwKKyAgICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvbk1heGltdW0KK30gRUZJX1BDSV9JT19QUk9UT0NPTF9BVFRSSUJVVEVfT1BFUkFUSU9OOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0FUVFJJQlVURVMpICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICAgICAgICAgICAgICpUaGlzLAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MX0FUVFJJQlVURV9PUEVSQVRJT04gT3BlcmF0aW9uLAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcywKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSZXN1bHQgT1BUSU9OQUwKKyAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9HRVRfQkFSX0FUVFJJQlVURVMpICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICBCYXJJbmRleCwKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgKlN1cHBvcnRzIE9QVElPTkFMLAorICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAqKlJlc291cmNlcyBPUFRJT05BTAorICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX1NFVF9CQVJfQVRUUklCVVRFUykgKAorICBJTiBzdHJ1Y3QgX0VGSV9QQ0lfSU8gKlRoaXMsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMsCisgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgIEJhckluZGV4LAorICBJTiBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAqT2Zmc2V0LAorICBJTiBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAqTGVuZ3RoCisgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfUENJX0lPIHsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9QT0xMX0lPX01FTSAgICAgICAgUG9sbE1lbTsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9QT0xMX0lPX01FTSAgICAgICAgUG9sbElvOworICBFRklfUENJX0lPX1BST1RPQ09MX0FDQ0VTUyAgICAgICAgICAgICBNZW07CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQUNDRVNTICAgICAgICAgICAgIElvOworICBFRklfUENJX0lPX1BST1RPQ09MX0NPTkZJR19BQ0NFU1MgICAgICBQY2k7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQ09QWV9NRU0gICAgICAgICAgIENvcHlNZW07CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfTUFQICAgICAgICAgICAgICAgIE1hcDsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9VTk1BUCAgICAgICAgICAgICAgVW5tYXA7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQUxMT0NBVEVfQlVGRkVSICAgIEFsbG9jYXRlQnVmZmVyOworICBFRklfUENJX0lPX1BST1RPQ09MX0ZSRUVfQlVGRkVSICAgICAgICBGcmVlQnVmZmVyOworICBFRklfUENJX0lPX1BST1RPQ09MX0ZMVVNIICAgICAgICAgICAgICBGbHVzaDsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9HRVRfTE9DQVRJT04gICAgICAgR2V0TG9jYXRpb247CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQVRUUklCVVRFUyAgICAgICAgIEF0dHJpYnV0ZXM7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfR0VUX0JBUl9BVFRSSUJVVEVTIEdldEJhckF0dHJpYnV0ZXM7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfU0VUX0JBUl9BVFRSSUJVVEVTIFNldEJhckF0dHJpYnV0ZXM7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbVNpemU7CisgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSb21JbWFnZTsKK30gRUZJX1BDSV9JTzsKKworI2VuZGlmIC8qIF9FRklfUENJX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL2VmaXByb3QuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaXByb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDc2ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpcHJvdC5oCkBAIC0wLDAgKzEsNzU3IEBACisjaWZuZGVmIF9FRklfUFJPVF9ICisjZGVmaW5lIF9FRklfUFJPVF9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaXByb3QuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBQcm90b2NvbHMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisvLworLy8gIEZQU1dBIGxpYnJhcnkgcHJvdG9jb2wKKy8vCisjZGVmaW5lIEZQU1dBX1BST1RPQ09MICAgICAgICAgIFwKKyAgICB7IDB4YzQxYjY1MzEsIDB4OTdiOSwgMHgxMWQzLCB7MHg5YSwgMHgyOSwgMHgwLCAweDkwLCAweDI3LCAweDNmLCAweGMxLCAweDRkfSB9CisKKy8vCisvLyBEZXZpY2UgUGF0aCBwcm90b2NvbAorLy8KKworI2RlZmluZSBERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICBcCisgICAgeyAweDk1NzZlOTEsIDB4NmQzZiwgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKKworLy8KKy8vIEJsb2NrIElPIHByb3RvY29sCisvLworCisjZGVmaW5lIEJMT0NLX0lPX1BST1RPQ09MIFwKKyAgICB7IDB4OTY0ZTViMjEsIDB4NjQ1OSwgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisjZGVmaW5lIEVGSV9CTE9DS19JT19JTlRFUkZBQ0VfUkVWSVNJT04gICAweDAwMDEwMDAwCisjZGVmaW5lIEVGSV9CTE9DS19JT19JTlRFUkZBQ0VfUkVWSVNJT04yICAweDAwMDIwMDAxCisjZGVmaW5lIEVGSV9CTE9DS19JT19JTlRFUkZBQ0VfUkVWSVNJT04zICAoKDI8PDE2KSB8IDMxKQorCitJTlRFUkZBQ0VfREVDTChfRUZJX0JMT0NLX0lPKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0JMT0NLX1JFU0VUKSAoCisgICAgSU4gc3RydWN0IF9FRklfQkxPQ0tfSU8gICAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICBFeHRlbmRlZFZlcmlmaWNhdGlvbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9CTE9DS19SRUFEKSAoCisgICAgSU4gc3RydWN0IF9FRklfQkxPQ0tfSU8gICAgICpUaGlzLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICBNZWRpYUlkLAorICAgIElOIEVGSV9MQkEgICAgICAgICAgICAgICAgICBMQkEsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9CTE9DS19XUklURSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0JMT0NLX0lPICAgICAqVGhpcywKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgTWVkaWFJZCwKKyAgICBJTiBFRklfTEJBICAgICAgICAgICAgICAgICAgTEJBLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQkxPQ0tfRkxVU0gpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9CTE9DS19JTyAgICAgKlRoaXMKKyAgICApOworCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgTWVkaWFJZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgIFJlbW92YWJsZU1lZGlhOworICAgIEJPT0xFQU4gICAgICAgICAgICAgTWVkaWFQcmVzZW50OworCisgICAgQk9PTEVBTiAgICAgICAgICAgICBMb2dpY2FsUGFydGl0aW9uOworICAgIEJPT0xFQU4gICAgICAgICAgICAgUmVhZE9ubHk7CisgICAgQk9PTEVBTiAgICAgICAgICAgICBXcml0ZUNhY2hpbmc7CisKKyAgICBVSU5UMzIgICAgICAgICAgICAgIEJsb2NrU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIElvQWxpZ247CisKKyAgICBFRklfTEJBICAgICAgICAgICAgIExhc3RCbG9jazsKKworICAgIC8qIHJldmlzaW9uIDIgKi8KKyAgICBFRklfTEJBICAgICAgICAgICAgIExvd2VzdEFsaWduZWRMYmE7CisgICAgVUlOVDMyICAgICAgICAgICAgICBMb2dpY2FsQmxvY2tzUGVyUGh5c2ljYWxCbG9jazsKKyAgICAvKiByZXZpc2lvbiAzICovCisgICAgVUlOVDMyICAgICAgICAgICAgICBPcHRpbWFsVHJhbnNmZXJMZW5ndGhHcmFudWxhcml0eTsKK30gRUZJX0JMT0NLX0lPX01FRElBOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0JMT0NLX0lPIHsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKworICAgIEVGSV9CTE9DS19JT19NRURJQSAgICAgICpNZWRpYTsKKworICAgIEVGSV9CTE9DS19SRVNFVCAgICAgICAgIFJlc2V0OworICAgIEVGSV9CTE9DS19SRUFEICAgICAgICAgIFJlYWRCbG9ja3M7CisgICAgRUZJX0JMT0NLX1dSSVRFICAgICAgICAgV3JpdGVCbG9ja3M7CisgICAgRUZJX0JMT0NLX0ZMVVNIICAgICAgICAgRmx1c2hCbG9ja3M7CisKK30gRUZJX0JMT0NLX0lPOworCisKKworLy8KKy8vIERpc2sgQmxvY2sgSU8gcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgRElTS19JT19QUk9UT0NPTCBcCisgICAgeyAweGNlMzQ1MTcxLCAweGJhMGIsIDB4MTFkMiwgIHsweDhlLCAweDRmLCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKyNkZWZpbmUgRUZJX0RJU0tfSU9fSU5URVJGQUNFX1JFVklTSU9OICAgMHgwMDAxMDAwMAorCitJTlRFUkZBQ0VfREVDTChfRUZJX0RJU0tfSU8pOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRElTS19SRUFEKSAoCisgICAgSU4gc3RydWN0IF9FRklfRElTS19JTyAgICAgICpUaGlzLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICBNZWRpYUlkLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9ESVNLX1dSSVRFKSAoCisgICAgSU4gc3RydWN0IF9FRklfRElTS19JTyAgICAgICpUaGlzLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICBNZWRpYUlkLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCisKK3R5cGVkZWYgc3RydWN0IF9FRklfRElTS19JTyB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfRElTS19SRUFEICAgICAgIFJlYWREaXNrOworICAgIEVGSV9ESVNLX1dSSVRFICAgICAgV3JpdGVEaXNrOworfSBFRklfRElTS19JTzsKKworCisvLworLy8gU2ltcGxlIGZpbGUgc3lzdGVtIHByb3RvY29sCisvLworCisjZGVmaW5lIFNJTVBMRV9GSUxFX1NZU1RFTV9QUk9UT0NPTCBcCisgICAgeyAweDk2NGU1YjIyLCAweDY0NTksIDB4MTFkMiwgezB4OGUsIDB4MzksIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX0ZJTEVfSU9fSU5URVJGQUNFKTsKK0lOVEVSRkFDRV9ERUNMKF9FRklfRklMRV9IQU5ETEUpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVk9MVU1FX09QRU4pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0lPX0lOVEVSRkFDRSAgICAqVGhpcywKKyAgICBPVVQgc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICAgICAgICAqKlJvb3QKKyAgICApOworCisjZGVmaW5lIEVGSV9GSUxFX0lPX0lOVEVSRkFDRV9SRVZJU0lPTiAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9GSUxFX0lPX0lOVEVSRkFDRSB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgUmV2aXNpb247CisgICAgRUZJX1ZPTFVNRV9PUEVOICAgICAgICAgT3BlblZvbHVtZTsKK30gRUZJX0ZJTEVfSU9fSU5URVJGQUNFOworCisvLworLy8KKy8vCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GSUxFX09QRU4pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSAgKkZpbGUsCisgICAgT1VUIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICoqTmV3SGFuZGxlLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAqRmlsZU5hbWUsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgIE9wZW5Nb2RlLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzCisgICAgKTsKKworLy8gT3BlbiBtb2RlcworI2RlZmluZSBFRklfRklMRV9NT0RFX1JFQUQgICAgICAweDAwMDAwMDAwMDAwMDAwMDEKKyNkZWZpbmUgRUZJX0ZJTEVfTU9ERV9XUklURSAgICAgMHgwMDAwMDAwMDAwMDAwMDAyCisjZGVmaW5lIEVGSV9GSUxFX01PREVfQ1JFQVRFICAgIDB4ODAwMDAwMDAwMDAwMDAwMAorCisvLyBGaWxlIGF0dHJpYnV0ZXMKKyNkZWZpbmUgRUZJX0ZJTEVfUkVBRF9PTkxZICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCisjZGVmaW5lIEVGSV9GSUxFX0hJRERFTiAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMgorI2RlZmluZSBFRklfRklMRV9TWVNURU0gICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDQKKyNkZWZpbmUgRUZJX0ZJTEVfUkVTRVJWSUVEICAgICAgMHgwMDAwMDAwMDAwMDAwMDA4CisjZGVmaW5lIEVGSV9GSUxFX0RJUkVDVE9SWSAgICAgIDB4MDAwMDAwMDAwMDAwMDAxMAorI2RlZmluZSBFRklfRklMRV9BUkNISVZFICAgICAgICAweDAwMDAwMDAwMDAwMDAwMjAKKyNkZWZpbmUgRUZJX0ZJTEVfVkFMSURfQVRUUiAgICAgMHgwMDAwMDAwMDAwMDAwMDM3CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GSUxFX0NMT1NFKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfREVMRVRFKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfUkVBRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZSwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9XUklURSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZSwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9TRVRfUE9TSVRJT04pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSAgKkZpbGUsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfR0VUX1BPU0lUSU9OKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlLAorICAgIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAqUG9zaXRpb24KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9HRVRfSU5GTykgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKkluZm9ybWF0aW9uVHlwZSwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9TRVRfSU5GTykgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKkluZm9ybWF0aW9uVHlwZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GSUxFX0ZMVVNIKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlCisgICAgKTsKKworCisKKyNkZWZpbmUgRUZJX0ZJTEVfSEFORExFX1JFVklTSU9OICAgICAgICAgMHgwMDAxMDAwMAordHlwZWRlZiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgUmV2aXNpb247CisgICAgRUZJX0ZJTEVfT1BFTiAgICAgICAgICAgT3BlbjsKKyAgICBFRklfRklMRV9DTE9TRSAgICAgICAgICBDbG9zZTsKKyAgICBFRklfRklMRV9ERUxFVEUgICAgICAgICBEZWxldGU7CisgICAgRUZJX0ZJTEVfUkVBRCAgICAgICAgICAgUmVhZDsKKyAgICBFRklfRklMRV9XUklURSAgICAgICAgICBXcml0ZTsKKyAgICBFRklfRklMRV9HRVRfUE9TSVRJT04gICBHZXRQb3NpdGlvbjsKKyAgICBFRklfRklMRV9TRVRfUE9TSVRJT04gICBTZXRQb3NpdGlvbjsKKyAgICBFRklfRklMRV9HRVRfSU5GTyAgICAgICBHZXRJbmZvOworICAgIEVGSV9GSUxFX1NFVF9JTkZPICAgICAgIFNldEluZm87CisgICAgRUZJX0ZJTEVfRkxVU0ggICAgICAgICAgRmx1c2g7Cit9IEVGSV9GSUxFLCAqRUZJX0ZJTEVfSEFORExFOworCisKKy8vCisvLyBGaWxlIGluZm9ybWF0aW9uIHR5cGVzCisvLworCisjZGVmaW5lIEVGSV9GSUxFX0lORk9fSUQgICBcCisgICAgeyAweDk1NzZlOTIsIDB4NmQzZiwgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBTaXplOworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIEZpbGVTaXplOworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIFBoeXNpY2FsU2l6ZTsKKyAgICBFRklfVElNRSAgICAgICAgICAgICAgICBDcmVhdGVUaW1lOworICAgIEVGSV9USU1FICAgICAgICAgICAgICAgIExhc3RBY2Nlc3NUaW1lOworICAgIEVGSV9USU1FICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvblRpbWU7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOworICAgIENIQVIxNiAgICAgICAgICAgICAgICAgIEZpbGVOYW1lWzFdOworfSBFRklfRklMRV9JTkZPOworCisvLworLy8gVGhlIEZpbGVOYW1lIGZpZWxkIG9mIHRoZSBFRklfRklMRV9JTkZPIGRhdGEgc3RydWN0dXJlIGlzIHZhcmlhYmxlIGxlbmd0aC4KKy8vIFdoZW5ldmVyIGNvZGUgbmVlZHMgdG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgRUZJX0ZJTEVfSU5GTyBkYXRhIHN0cnVjdHVyZSwgaXQgbmVlZHMgdG8KKy8vIGJlIHRoZSBzaXplIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSB3aXRob3V0IHRoZSBGaWxlTmFtZSBmaWVsZC4gIFRoZSBmb2xsb3dpbmcgbWFjcm8gCisvLyBjb21wdXRlcyB0aGlzIHNpemUgY29ycmVjdGx5IG5vIG1hdHRlciBob3cgYmlnIHRoZSBGaWxlTmFtZSBhcnJheSBpcyBkZWNsYXJlZC4KKy8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSB0aGUgRUZJX0ZJTEVfSU5GTyBkYXRhIHN0cnVjdHVyZSBBTlNJIGNvbXBpbGFudC4gCisvLworCisjZGVmaW5lIFNJWkVfT0ZfRUZJX0ZJTEVfSU5GTyBFRklfRklFTERfT0ZGU0VUKEVGSV9GSUxFX0lORk8sRmlsZU5hbWUpCisKKyNkZWZpbmUgRUZJX0ZJTEVfU1lTVEVNX0lORk9fSUQgICAgXAorICAgIHsgMHg5NTc2ZTkzLCAweDZkM2YsIDB4MTFkMiwgezB4OGUsIDB4MzksIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgU2l6ZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICBSZWFkT25seTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBWb2x1bWVTaXplOworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIEZyZWVTcGFjZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBCbG9ja1NpemU7CisgICAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgVm9sdW1lTGFiZWxbMV07Cit9IEVGSV9GSUxFX1NZU1RFTV9JTkZPOworCisvLworLy8gVGhlIFZvbHVtZUxhYmVsIGZpZWxkIG9mIHRoZSBFRklfRklMRV9TWVNURU1fSU5GTyBkYXRhIHN0cnVjdHVyZSBpcyB2YXJpYWJsZSBsZW5ndGguCisvLyBXaGVuZXZlciBjb2RlIG5lZWRzIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIEVGSV9GSUxFX1NZU1RFTV9JTkZPIGRhdGEgc3RydWN0dXJlLCBpdCBuZWVkcworLy8gdG8gYmUgdGhlIHNpemUgb2YgdGhlIGRhdGEgc3RydWN0dXJlIHdpdGhvdXQgdGhlIFZvbHVtZUxhYmxlIGZpZWxkLiAgVGhlIGZvbGxvd2luZyBtYWNybyAKKy8vIGNvbXB1dGVzIHRoaXMgc2l6ZSBjb3JyZWN0bHkgbm8gbWF0dGVyIGhvdyBiaWcgdGhlIFZvbHVtZUxhYmxlIGFycmF5IGlzIGRlY2xhcmVkLgorLy8gVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIHRoZSBFRklfRklMRV9TWVNURU1fSU5GTyBkYXRhIHN0cnVjdHVyZSBBTlNJIGNvbXBpbGFudC4gCisvLworCisjZGVmaW5lIFNJWkVfT0ZfRUZJX0ZJTEVfU1lTVEVNX0lORk8gRUZJX0ZJRUxEX09GRlNFVChFRklfRklMRV9TWVNURU1fSU5GTyxWb2x1bWVMYWJlbCkKKworI2RlZmluZSBFRklfRklMRV9TWVNURU1fVk9MVU1FX0xBQkVMX0lORk9fSUQgICAgXAorICAgIHsgMHhEQjQ3RDdEMywweEZFODEsIDB4MTFkMywgezB4OUEsIDB4MzUsIDB4MDAsIDB4OTAsIDB4MjcsIDB4M0YsIDB4QzEsIDB4NER9IH0KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENIQVIxNiAgICAgICAgICAgICAgICAgIFZvbHVtZUxhYmVsWzFdOworfSBFRklfRklMRV9TWVNURU1fVk9MVU1FX0xBQkVMX0lORk87CisKKyNkZWZpbmUgU0laRV9PRl9FRklfRklMRV9TWVNURU1fVk9MVU1FX0xBQkVMX0lORk8gRUZJX0ZJRUxEX09GRlNFVChFRklfRklMRV9TWVNURU1fVk9MVU1FX0xBQkVMX0lORk8sVm9sdW1lTGFiZWwpCisKKy8vCisvLyBMb2FkIGZpbGUgcHJvdG9jb2wKKy8vCisKKworI2RlZmluZSBMT0FEX0ZJTEVfUFJPVE9DT0wgXAorICAgIHsgMHg1NkVDMzA5MSwgMHg5NTRDLCAweDExZDIsIHsweDhFLCAweDNGLCAweDAwLCAweEEwLCAweEM5LCAweDY5LCAweDcyLCAweDNCfSB9CisKK0lOVEVSRkFDRV9ERUNMKF9FRklfTE9BRF9GSUxFX0lOVEVSRkFDRSk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9MT0FEX0ZJTEUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9MT0FEX0ZJTEVfSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAqRmlsZVBhdGgsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdFBvbGljeSwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9MT0FEX0ZJTEVfSU5URVJGQUNFIHsKKyAgICBFRklfTE9BRF9GSUxFICAgICAgICAgICAgICAgICAgICAgICBMb2FkRmlsZTsKK30gRUZJX0xPQURfRklMRV9JTlRFUkZBQ0U7CisKKworLy8KKy8vIERldmljZSBJTyBwcm90b2NvbAorLy8KKworI2RlZmluZSBERVZJQ0VfSU9fUFJPVE9DT0wgXAorICAgIHsgMHhhZjZhYzMxMSwgMHg4NGMzLCAweDExZDIsIHsweDhlLCAweDNjLCAweDAwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKK0lOVEVSRkFDRV9ERUNMKF9FRklfREVWSUNFX0lPX0lOVEVSRkFDRSk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgSU9fVUlOVDgsCisgICAgSU9fVUlOVDE2LAorICAgIElPX1VJTlQzMiwKKyAgICBJT19VSU5UNjQsCisvLworLy8gU3BlY2lmaWNhdGlvbiBDaGFuZ2U6IENvcHkgZnJvbSBNTUlPIHRvIE1NSU8gdnMuIE1NSU8gdG8gYnVmZmVyLCBidWZmZXIgdG8gTU1JTworLy8KKyAgICBNTUlPX0NPUFlfVUlOVDgsCisgICAgTU1JT19DT1BZX1VJTlQxNiwKKyAgICBNTUlPX0NPUFlfVUlOVDMyLAorICAgIE1NSU9fQ09QWV9VSU5UNjQKK30gRUZJX0lPX1dJRFRIOworCisjZGVmaW5lIEVGSV9QQ0lfQUREUkVTUyhfYnVzLF9kZXYsX2Z1bmMpIFwKKyAgICAoIChVSU5UNjQpICggKCgoVUlOVE4pX2J1cykgPDwgMjQpICsgKCgoVUlOVE4pX2RldikgPDwgMTYpICsgKCgoVUlOVE4pX2Z1bmMpIDw8IDgpICkgKQorCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9ERVZJQ0VfSU8pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICpUaGlzLAorICAgIElOIEVGSV9JT19XSURUSCAgICAgICAgICAgICAgICAgV2lkdGgsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQsCisgICAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9ERVZJQ0VfSU8gICAgICAgICAgICAgICAgICAgUmVhZDsKKyAgICBFRklfREVWSUNFX0lPICAgICAgICAgICAgICAgICAgIFdyaXRlOworfSBFRklfSU9fQUNDRVNTOworCit0eXBlZGVmIAorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ERVZJQ0VfUEFUSCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MsCisgICAgSU4gT1VUIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgKipQY2lEZXZpY2VQYXRoCisgICAgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFZmlCdXNNYXN0ZXJSZWFkLAorICAgIEVmaUJ1c01hc3RlcldyaXRlLAorICAgIEVmaUJ1c01hc3RlckNvbW1vbkJ1ZmZlcgorfSBFRklfSU9fT1BFUkFUSU9OX1RZUEU7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JT19NQVApICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBFRklfSU9fT1BFUkFUSU9OX1RZUEUgICAgICAgICAgICBPcGVyYXRpb24sCisgICAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICAgKkhvc3RBZGRyZXNzLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICpOdW1iZXJPZkJ5dGVzLAorICAgIE9VVCBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgICpEZXZpY2VBZGRyZXNzLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqTWFwcGluZworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JT19VTk1BUCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpNYXBwaW5nCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lPX0FMTE9DQVRFX0JVRkZFUikgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIEVGSV9BTExPQ0FURV9UWVBFICAgICAgICAgICAgICAgIFR5cGUsCisgICAgSU4gRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgICAgICAgTWVtb3J5VHlwZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlcywKKyAgICBJTiBPVVQgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAqSG9zdEFkZHJlc3MKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU9fRkxVU0gpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAqVGhpcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JT19GUkVFX0JVRkZFUikgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VzLAorICAgIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgIEhvc3RBZGRyZXNzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFIHsKKyAgICBFRklfSU9fQUNDRVNTICAgICAgICAgICAgICAgICAgICAgICBNZW07CisgICAgRUZJX0lPX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgSW87CisgICAgRUZJX0lPX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgUGNpOworICAgIEVGSV9JT19NQVAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDsKKyAgICBFRklfUENJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBQY2lEZXZpY2VQYXRoOworICAgIEVGSV9JT19VTk1BUCAgICAgICAgICAgICAgICAgICAgICAgIFVubWFwOworICAgIEVGSV9JT19BTExPQ0FURV9CVUZGRVIgICAgICAgICAgICAgIEFsbG9jYXRlQnVmZmVyOworICAgIEVGSV9JT19GTFVTSCAgICAgICAgICAgICAgICAgICAgICAgIEZsdXNoOworICAgIEVGSV9JT19GUkVFX0JVRkZFUiAgICAgICAgICAgICAgICAgIEZyZWVCdWZmZXI7Cit9IEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFOworCisKKy8vCisvLyBVbmljb2RlIENvbGxhdGlvbiBwcm90b2NvbAorLy8KKworI2RlZmluZSBVTklDT0RFX0NPTExBVElPTl9QUk9UT0NPTCBcCisgICAgeyAweDFkODVjZDdmLCAweGY0M2QsIDB4MTFkMiwgezB4OWEsIDB4YywgIDB4MCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZH0gfQorCisjZGVmaW5lIFVOSUNPREVfQllURV9PUkRFUl9NQVJLICAgICAgIChDSEFSMTYpKDB4ZmVmZikKKworSU5URVJGQUNFX0RFQ0woX0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UpOworCit0eXBlZGVmCitJTlROCisoRUZJQVBJICpFRklfVU5JQ09ERV9TVFJJQ09MTCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICpzMSwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgKnMyCisgICAgKTsKKwordHlwZWRlZgorQk9PTEVBTgorKEVGSUFQSSAqRUZJX1VOSUNPREVfTUVUQUlNQVRDSCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICpTdHJpbmcsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICpQYXR0ZXJuCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1VOSUNPREVfU1RSTFdSKSAoCisgICAgSU4gc3RydWN0IF9FRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqU3RyCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1VOSUNPREVfU1RSVVBSKSAoCisgICAgSU4gc3RydWN0IF9FRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqU3RyCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1VOSUNPREVfRkFUVE9TVFIpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdFNpemUsCisgICAgSU4gQ0hBUjggICAgICAgICAgICAgICAgICAgICAgICAgICAgKkZhdCwKKyAgICBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nCisgICAgKTsKKwordHlwZWRlZgorQk9PTEVBTgorKEVGSUFQSSAqRUZJX1VOSUNPREVfU1RSVE9GQVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdHJpbmcsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF0U2l6ZSwKKyAgICBPVVQgQ0hBUjggICAgICAgICAgICAgICAgICAgICAgICAgICAqRmF0CisgICAgKTsKKworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSB7CisKKyAgICAvLyBnZW5lcmFsCisgICAgRUZJX1VOSUNPREVfU1RSSUNPTEwgICAgICAgICAgICAgICAgU3RyaUNvbGw7CisgICAgRUZJX1VOSUNPREVfTUVUQUlNQVRDSCAgICAgICAgICAgICAgTWV0YWlNYXRjaDsKKyAgICBFRklfVU5JQ09ERV9TVFJMV1IgICAgICAgICAgICAgICAgICBTdHJMd3I7CisgICAgRUZJX1VOSUNPREVfU1RSVVBSICAgICAgICAgICAgICAgICAgU3RyVXByOworCisgICAgLy8gZm9yIHN1cHBvcnRpbmcgZmF0IHZvbHVtZXMKKyAgICBFRklfVU5JQ09ERV9GQVRUT1NUUiAgICAgICAgICAgICAgICBGYXRUb1N0cjsKKyAgICBFRklfVU5JQ09ERV9TVFJUT0ZBVCAgICAgICAgICAgICAgICBTdHJUb0ZhdDsKKworICAgIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdXBwb3J0ZWRMYW5ndWFnZXM7Cit9IEVGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0U7CisKKy8qIEdyYXBoaWNzIG91dHB1dCBwcm90b2NvbCAqLworI2RlZmluZSBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX0dVSUQgXAorICB7IFwKKyAgICAweDkwNDJhOWRlLCAweDIzZGMsIDB4NGEzOCwgezB4OTYsIDB4ZmIsIDB4N2EsIDB4ZGUsIDB4ZDAsIDB4ODAsIDB4NTEsIDB4NmEgfSBcCisgIH0KKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0wgRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgICAgICAgICAgICBSZWRNYXNrOworICBVSU5UMzIgICAgICAgICAgICBHcmVlbk1hc2s7CisgIFVJTlQzMiAgICAgICAgICAgIEJsdWVNYXNrOworICBVSU5UMzIgICAgICAgICAgICBSZXNlcnZlZE1hc2s7Cit9IEVGSV9QSVhFTF9CSVRNQVNLOworCit0eXBlZGVmIGVudW0geworICBQaXhlbFJlZEdyZWVuQmx1ZVJlc2VydmVkOEJpdFBlckNvbG9yLAorICBQaXhlbEJsdWVHcmVlblJlZFJlc2VydmVkOEJpdFBlckNvbG9yLAorICBQaXhlbEJpdE1hc2ssCisgIFBpeGVsQmx0T25seSwKKyAgUGl4ZWxGb3JtYXRNYXgKK30gRUZJX0dSQVBISUNTX1BJWEVMX0ZPUk1BVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsUmVzb2x1dGlvbjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgVmVydGljYWxSZXNvbHV0aW9uOworICBFRklfR1JBUEhJQ1NfUElYRUxfRk9STUFUICBQaXhlbEZvcm1hdDsKKyAgRUZJX1BJWEVMX0JJVE1BU0sgICAgICAgICAgUGl4ZWxJbmZvcm1hdGlvbjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgUGl4ZWxzUGVyU2NhbkxpbmU7Cit9IEVGSV9HUkFQSElDU19PVVRQVVRfTU9ERV9JTkZPUk1BVElPTjsKKworLyoqCisgIFJldHVybiB0aGUgY3VycmVudCB2aWRlbyBtb2RlIGluZm9ybWF0aW9uLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIE1vZGVOdW1iZXIgVGhlIG1vZGUgbnVtYmVyIHRvIHJldHVybiBpbmZvcm1hdGlvbiBvbi4KKyAgQHBhcmFtICBTaXplT2ZJbmZvIEEgcG9pbnRlciB0byB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBJbmZvIGJ1ZmZlci4KKyAgQHBhcmFtICBJbmZvICAgICAgIEEgcG9pbnRlciB0byBjYWxsZWUgYWxsb2NhdGVkIGJ1ZmZlciB0aGF0IHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgTW9kZU51bWJlci4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBNb2RlIGluZm9ybWF0aW9uIHJldHVybmVkLgorICBAcmV0dmFsIEVGSV9CVUZGRVJfVE9PX1NNQUxMICBUaGUgSW5mbyBidWZmZXIgd2FzIHRvbyBzbWFsbC4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgQSBoYXJkd2FyZSBlcnJvciBvY2N1cnJlZCB0cnlpbmcgdG8gcmV0cmlldmUgdGhlIHZpZGVvIG1vZGUuCisgIEByZXR2YWwgRUZJX05PVF9TVEFSVEVEICAgICAgIFZpZGVvIGRpc3BsYXkgaXMgbm90IGluaXRpYWxpemVkLiBDYWxsIFNldE1vZGUgKCkKKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9mIHRoZSBpbnB1dCBhcmdzIHdhcyBOVUxMLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0xfUVVFUllfTU9ERSkgKAorICBJTiAgRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTCAgICAgICAgICAqVGhpcywKKyAgSU4gIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZU51bWJlciwKKyAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlNpemVPZkluZm8sCisgIE9VVCBFRklfR1JBUEhJQ1NfT1VUUFVUX01PREVfSU5GT1JNQVRJT04gICoqSW5mbworICApCis7CisKKy8qKgorICBSZXR1cm4gdGhlIGN1cnJlbnQgdmlkZW8gbW9kZSBpbmZvcm1hdGlvbi4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgTW9kZU51bWJlciAgICAgICAgVGhlIG1vZGUgbnVtYmVyIHRvIGJlIHNldC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgIEdyYXBoaWNzIG1vZGUgd2FzIGNoYW5nZWQuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgVGhlIGRldmljZSBoYWQgYW4gZXJyb3IgYW5kIGNvdWxkIG5vdCBjb21wbGV0ZSB0aGUgcmVxdWVzdC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICBNb2RlTnVtYmVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTF9TRVRfTU9ERSkgKAorICBJTiAgRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTCAqVGhpcywKKyAgSU4gIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgTW9kZU51bWJlcgorICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQ4IEJsdWU7CisgIFVJTlQ4IEdyZWVuOworICBVSU5UOCBSZWQ7CisgIFVJTlQ4IFJlc2VydmVkOworfSBFRklfR1JBUEhJQ1NfT1VUUFVUX0JMVF9QSVhFTDsKKwordHlwZWRlZiB1bmlvbiB7CisgIEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX1BJWEVMIFBpeGVsOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICBSYXc7Cit9IEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX1BJWEVMX1VOSU9OOworCit0eXBlZGVmIGVudW0geworICBFZmlCbHRWaWRlb0ZpbGwsCisgIEVmaUJsdFZpZGVvVG9CbHRCdWZmZXIsCisgIEVmaUJsdEJ1ZmZlclRvVmlkZW8sIAorICBFZmlCbHRWaWRlb1RvVmlkZW8sCisgIEVmaUdyYXBoaWNzT3V0cHV0Qmx0T3BlcmF0aW9uTWF4Cit9IEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX09QRVJBVElPTjsKKworLyoqCisgIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVmaW5lcyBhY3Rpb25zIGZvciBCbHRPcGVyYXRpb25zOgorCisgIDxCPkVmaUJsdFZpZGVvRmlsbDwvQj4gLSBXcml0ZSBkYXRhIGZyb20gdGhlICBCbHRCdWZmZXIgcGl4ZWwgKFNvdXJjZVgsIFNvdXJjZVkpIAorICBkaXJlY3RseSB0byBldmVyeSBwaXhlbCBvZiB0aGUgdmlkZW8gZGlzcGxheSByZWN0YW5nbGUgCisgIChEZXN0aW5hdGlvblgsIERlc3RpbmF0aW9uWSkgKERlc3RpbmF0aW9uWCArIFdpZHRoLCBEZXN0aW5hdGlvblkgKyBIZWlnaHQpLiAKKyAgT25seSBvbmUgcGl4ZWwgd2lsbCBiZSB1c2VkIGZyb20gdGhlIEJsdEJ1ZmZlci4gRGVsdGEgaXMgTk9UIHVzZWQuCisKKyAgPEI+RWZpQmx0VmlkZW9Ub0JsdEJ1ZmZlcjwvQj4gLSBSZWFkIGRhdGEgZnJvbSB0aGUgdmlkZW8gZGlzcGxheSByZWN0YW5nbGUgCisgIChTb3VyY2VYLCBTb3VyY2VZKSAoU291cmNlWCArIFdpZHRoLCBTb3VyY2VZICsgSGVpZ2h0KSBhbmQgcGxhY2UgaXQgaW4gCisgIHRoZSBCbHRCdWZmZXIgcmVjdGFuZ2xlIChEZXN0aW5hdGlvblgsIERlc3RpbmF0aW9uWSApIAorICAoRGVzdGluYXRpb25YICsgV2lkdGgsIERlc3RpbmF0aW9uWSArIEhlaWdodCkuIElmIERlc3RpbmF0aW9uWCBvciAKKyAgRGVzdGluYXRpb25ZIGlzIG5vdCB6ZXJvIHRoZW4gRGVsdGEgbXVzdCBiZSBzZXQgdG8gdGhlIGxlbmd0aCBpbiBieXRlcyAKKyAgb2YgYSByb3cgaW4gdGhlIEJsdEJ1ZmZlci4KKworICA8Qj5FZmlCbHRCdWZmZXJUb1ZpZGVvPC9CPiAtIFdyaXRlIGRhdGEgZnJvbSB0aGUgIEJsdEJ1ZmZlciByZWN0YW5nbGUgCisgIChTb3VyY2VYLCBTb3VyY2VZKSAoU291cmNlWCArIFdpZHRoLCBTb3VyY2VZICsgSGVpZ2h0KSBkaXJlY3RseSB0byB0aGUgCisgIHZpZGVvIGRpc3BsYXkgcmVjdGFuZ2xlIChEZXN0aW5hdGlvblgsIERlc3RpbmF0aW9uWSkgCisgIChEZXN0aW5hdGlvblggKyBXaWR0aCwgRGVzdGluYXRpb25ZICsgSGVpZ2h0KS4gSWYgU291cmNlWCBvciBTb3VyY2VZIGlzIAorICBub3QgemVybyB0aGVuIERlbHRhIG11c3QgYmUgc2V0IHRvIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgYSByb3cgaW4gdGhlIAorICBCbHRCdWZmZXIuCisKKyAgPEI+RWZpQmx0VmlkZW9Ub1ZpZGVvPC9CPiAtIENvcHkgZnJvbSB0aGUgdmlkZW8gZGlzcGxheSByZWN0YW5nbGUgKFNvdXJjZVgsIFNvdXJjZVkpCisgIChTb3VyY2VYICsgV2lkdGgsIFNvdXJjZVkgKyBIZWlnaHQpIC50byB0aGUgdmlkZW8gZGlzcGxheSByZWN0YW5nbGUgCisgIChEZXN0aW5hdGlvblgsIERlc3RpbmF0aW9uWSkgKERlc3RpbmF0aW9uWCArIFdpZHRoLCBEZXN0aW5hdGlvblkgKyBIZWlnaHQpLiAKKyAgVGhlIEJsdEJ1ZmZlciBhbmQgRGVsdGEgIGFyZSBub3QgdXNlZCBpbiB0aGlzIG1vZGUuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBCbHRCdWZmZXIgICAgQnVmZmVyIGNvbnRhaW5pbmcgZGF0YSB0byBibGl0IGludG8gdmlkZW8gYnVmZmVyLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBoYXMgYSBzaXplIG9mIFdpZHRoKkhlaWdodCpzaXplb2YoRUZJX0dSQVBISUNTX09VVFBVVF9CTFRfUElYRUwpCisgIEBwYXJhbSAgQmx0T3BlcmF0aW9uIE9wZXJhdGlvbiB0byBwZXJmb3JtIG9uIEJsaXRCdWZmZXIgYW5kIHZpZGVvIG1lbW9yeQorICBAcGFyYW0gIFNvdXJjZVggICAgICBYIGNvb3JkaW5hdGUgb2Ygc291cmNlIGZvciB0aGUgQmx0QnVmZmVyLgorICBAcGFyYW0gIFNvdXJjZVkgICAgICBZIGNvb3JkaW5hdGUgb2Ygc291cmNlIGZvciB0aGUgQmx0QnVmZmVyLgorICBAcGFyYW0gIERlc3RpbmF0aW9uWCBYIGNvb3JkaW5hdGUgb2YgZGVzdGluYXRpb24gZm9yIHRoZSBCbHRCdWZmZXIuCisgIEBwYXJhbSAgRGVzdGluYXRpb25ZIFkgY29vcmRpbmF0ZSBvZiBkZXN0aW5hdGlvbiBmb3IgdGhlIEJsdEJ1ZmZlci4KKyAgQHBhcmFtICBXaWR0aCAgICAgICAgV2lkdGggb2YgcmVjdGFuZ2xlIGluIEJsdEJ1ZmZlciBpbiBwaXhlbHMuCisgIEBwYXJhbSAgSGVpZ2h0ICAgICAgIEhpZ2h0IG9mIHJlY3RhbmdsZSBpbiBCbHRCdWZmZXIgaW4gcGl4ZWxzLgorICBAcGFyYW0gIERlbHRhICAgICAgICBPUFRJT05BTAorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBCbHQgb3BlcmF0aW9uIGNvbXBsZXRlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQmx0T3BlcmF0aW9uIGlzIG5vdCB2YWxpZC4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgQSBoYXJkd2FyZSBlcnJvciBvY2N1cmVkIHdyaXR0aW5nIHRvIHRoZSB2aWRlbyBidWZmZXIuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTF9CTFQpICgKKyAgSU4gIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0wgICAgICAgICAgICAqVGhpcywKKyAgSU4gIEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX1BJWEVMICAgICAgICAgICAqQmx0QnVmZmVyLCAgIE9QVElPTkFMCisgIElOICBFRklfR1JBUEhJQ1NfT1VUUFVUX0JMVF9PUEVSQVRJT04gICAgICAgQmx0T3BlcmF0aW9uLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVgsCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlWSwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvblgsCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb25ZLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZHRoLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlaWdodCwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWx0YSAgICAgICAgIE9QVElPTkFMCisgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TW9kZTsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZTsKKyAgRUZJX0dSQVBISUNTX09VVFBVVF9NT0RFX0lORk9STUFUSU9OICAgKkluZm87CisgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemVPZkluZm87CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgICAgICAgIEZyYW1lQnVmZmVyQmFzZTsKKyAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJTaXplOworfSBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX01PREU7CisKK3N0cnVjdCBfRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTCB7CisgIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0xfUVVFUllfTU9ERSAgUXVlcnlNb2RlOworICBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX1NFVF9NT0RFICAgIFNldE1vZGU7CisgIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0xfQkxUICAgICAgICAgQmx0OworICBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX01PREUgICAgICAgICpNb2RlOworfTsKKworSU5URVJGQUNFX0RFQ0woX0VGSV9TRVJWSUNFX0JJTkRJTkcpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VSVklDRV9CSU5ESU5HX0NSRUFURV9DSElMRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1NFUlZJQ0VfQklORElORyAqVGhpcywKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgKkNoaWxkSGFuZGxlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUlZJQ0VfQklORElOR19ERVNUUk9ZX0NISUxEKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0VSVklDRV9CSU5ESU5HICpUaGlzLAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICBDaGlsZEhhbmRsZQorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfU0VSVklDRV9CSU5ESU5HIHsKKyAgICBFRklfU0VSVklDRV9CSU5ESU5HX0NSRUFURV9DSElMRCAgQ3JlYXRlQ2hpbGQ7CisgICAgRUZJX1NFUlZJQ0VfQklORElOR19ERVNUUk9ZX0NISUxEIERlc3Ryb3lDaGlsZDsKK30gRUZJX1NFUlZJQ0VfQklORElORzsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL2VmaXB4ZWJjLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlweGViYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjM4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlweGViYy5oCkBAIC0wLDAgKzEsNDY0IEBACisjaWZuZGVmIF9FRklQWEVCQ19ICisjZGVmaW5lIF9FRklQWEVCQ19ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaXB4ZWJjLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgUFhFIEJhc2UgQ29kZSBQcm90b2NvbAorCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBQWEUgQmFzZSBDb2RlIHByb3RvY29sCisvLworCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MIFwKKyAgICB7IDB4MDNjNGU2MDMsIDB4YWMyOCwgMHgxMWQzLCB7MHg5YSwgMHgyZCwgMHgwMCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZH0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX1BYRV9CQVNFX0NPREUpOworCisjZGVmaW5lIERFRkFVTFRfVFRMIDQKKyNkZWZpbmUgREVGQVVMVF9Ub1MgMAorLy8KKy8vIEFkZHJlc3MgZGVmaW5pdGlvbnMKKy8vCisKK3R5cGVkZWYgdW5pb24geworICAgIFVJTlQzMiAgICAgIEFkZHJbNF07CisgICAgRUZJX0lQdjRfQUREUkVTUyAgICB2NDsKKyAgICBFRklfSVB2Nl9BRERSRVNTICAgIHY2OworfSBFRklfSVBfQUREUkVTUzsKKwordHlwZWRlZiBVSU5UMTYgRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQ7CisKKy8vCisvLyBQYWNrZXQgZGVmaW5pdGlvbnMKKy8vCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwT3Bjb2RlOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBId1R5cGU7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cEh3QWRkckxlbjsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwR2F0ZUhvcHM7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cElkZW50OworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBTZWNvbmRzOworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBGbGFnczsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwQ2lBZGRyWzRdOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBZaUFkZHJbNF07CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cFNpQWRkcls0XTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwR2lBZGRyWzRdOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBId0FkZHJbMTZdOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBTcnZOYW1lWzY0XTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwQm9vdEZpbGVbMTI4XTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIERoY3BNYWdpazsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERoY3BPcHRpb25zWzU2XTsKK30gRUZJX1BYRV9CQVNFX0NPREVfREhDUFY0X1BBQ0tFVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVR5cGU6ODsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQ6MjQ7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEaGNwT3B0aW9uc1sxMDI0XTsKK30gRUZJX1BYRV9CQVNFX0NPREVfREhDUFY2X1BBQ0tFVDsKKwordHlwZWRlZiB1bmlvbiB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3WzE0NzJdOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0RIQ1BWNF9QQUNLRVQgICAgIERoY3B2NDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9ESENQVjZfUEFDS0VUICAgICBEaGNwdjY7Cit9IEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIFR5cGU7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgQ29kZTsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBDaGVja3N1bTsKKyAgICB1bmlvbiB7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgTXR1OworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgIFBvaW50ZXI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBVSU5UMTYgICAgICAgICAgSWRlbnRpZmllcjsKKyAgICAgICAgICAgIFVJTlQxNiAgICAgICAgICBTZXF1ZW5jZTsKKyAgICAgICAgfSBFY2hvOworICAgIH0gdTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBEYXRhWzQ5NF07Cit9IEVGSV9QWEVfQkFTRV9DT0RFX0lDTVBfRVJST1I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBFcnJvckNvZGU7CisgICAgQ0hBUjggICAgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmdbMTI3XTsKK30gRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9FUlJPUjsKKworLy8KKy8vIElQIFJlY2VpdmUgRmlsdGVyIGRlZmluaXRpb25zCisvLworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9NQVhfSVBDTlQgICAgICAgICAgICAgOAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJzOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBJcENudDsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgIElwTGlzdFtFRklfUFhFX0JBU0VfQ09ERV9NQVhfSVBDTlRdOworfSBFRklfUFhFX0JBU0VfQ09ERV9JUF9GSUxURVI7CisKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSX1NUQVRJT05fSVAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0lQX0ZJTFRFUl9CUk9BRENBU1QgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9JUF9GSUxURVJfUFJPTUlTQ1VPVVMgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSX1BST01JU0NVT1VTX01VTFRJQ0FTVCAgMHgwMDA4CisKKy8vCisvLyBBUlAgQ2FjaGUgZGVmaW5pdGlvbnMKKy8vCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVBfQUREUkVTUyAgICAgICBJcEFkZHI7CisgICAgRUZJX01BQ19BRERSRVNTICAgICAgTWFjQWRkcjsKK30gRUZJX1BYRV9CQVNFX0NPREVfQVJQX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgSXBBZGRyOworICAgIEVGSV9JUF9BRERSRVNTICAgICAgIFN1Ym5ldE1hc2s7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgR3dBZGRyOworfSBFRklfUFhFX0JBU0VfQ09ERV9ST1VURV9FTlRSWTsKKworLy8KKy8vIFVEUCBkZWZpbml0aW9ucworLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19BTllfU1JDX0lQICAgIDB4MDAwMQorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19BTllfU1JDX1BPUlQgIDB4MDAwMgorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19BTllfREVTVF9JUCAgIDB4MDAwNAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19BTllfREVTVF9QT1JUIDB4MDAwOAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19VU0VfRklMVEVSICAgIDB4MDAxMAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9VRFBfT1BGTEFHU19NQVlfRlJBR01FTlQgIDB4MDAyMAorCisvLworLy8gRGlzY292ZXIoKSBkZWZpbml0aW9ucworLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfQk9PVFNUUkFQICAgICAgICAgICAwICAgCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9NU19XSU5OVF9SSVMgICAgICAgIDEKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0lOVEVMX0xDTSAgICAgICAgICAgMgorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfRE9TVU5ESSAgICAgICAgICAgICAzCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9ORUNfRVNNUFJPICAgICAgICAgIDQKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0lCTV9XU29EICAgICAgICAgICAgNQorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfSUJNX0xDQ00gICAgICAgICAgICA2CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9DQV9VTklDRU5URVJfVE5HICAgIDcKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0hQX09QRU5WSUVXICAgICAgICAgOAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfQUxUSVJJU185ICAgICAgICAgICA5CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9BTFRJUklTXzEwICAgICAgICAgIDEwCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9BTFRJUklTXzExICAgICAgICAgIDExCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9OT1RfVVNFRF8xMiAgICAgICAgIDEyCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9SRURIQVRfSU5TVEFMTCAgICAgIDEzCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9SRURIQVRfQk9PVCAgICAgICAgIDE0CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9SRU1CTyAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9CRU9CT09UICAgICAgICAgICAgIDE2CisvLworLy8gMTcgdGhyb3VnaCAzMjc2NyBhcmUgcmVzZXJ2ZWQKKy8vIDMyNzY4IHRocm91Z2ggNjUyNzkgYXJlIGZvciB2ZW5kb3IgdXNlCisvLyA2NTI4MCB0aHJvdWdoIDY1NTM0IGFyZSByZXNlcnZlZAorLy8KKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX1BYRVRFU1QgICAgICAgICAgICAgNjU1MzUKKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX0xBWUVSX01BU0sgICAgICAgICAgICAgICAweDdGRkYKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9MQVlFUl9JTklUSUFMICAgICAgICAgICAgMHgwMDAwCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBUeXBlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBBY2NlcHRBbnlSZXNwb25zZTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgIElwQWRkcjsKK30gRUZJX1BYRV9CQVNFX0NPREVfU1JWTElTVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBVc2VNQ2FzdDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgVXNlQkNhc3Q7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIFVzZVVDYXN0OworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBNdXN0VXNlTGlzdDsKKyAgICBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgU2VydmVyTUNhc3RJcDsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgSXBDbnQ7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfU1JWTElTVCAgIFNydkxpc3RbMV07Cit9IEVGSV9QWEVfQkFTRV9DT0RFX0RJU0NPVkVSX0lORk87CisKKy8vCisvLyBNdGZ0cCgpIGRlZmluaXRpb25zCisvLworCit0eXBlZGVmIGVudW0geworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfRklSU1QsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9HRVRfRklMRV9TSVpFLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfUkVBRF9GSUxFLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfV1JJVEVfRklMRSwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9URlRQX1JFQURfRElSRUNUT1JZLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX0dFVF9GSUxFX1NJWkUsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfTVRGVFBfUkVBRF9GSUxFLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX1JFQURfRElSRUNUT1JZLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX0xBU1QKK30gRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9PUENPREU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVBfQUREUkVTUyAgIE1DYXN0SXA7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQgIENQb3J0OworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1VEUF9QT1JUICBTUG9ydDsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuVGltZW91dDsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgVHJhbnNtaXRUaW1lb3V0OworfSBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUF9JTkZPOworCisvLworLy8gUFhFIEJhc2UgQ29kZSBNb2RlIHN0cnVjdHVyZQorLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9NQVhfQVJQX0VOVFJJRVMgICAgICAgOAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9NQVhfUk9VVEVfRU5UUklFUyAgICAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgSXB2NkF2YWlsYWJsZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIElwdjZTdXBwb3J0ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZ0lwdjY7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBCaXNTdXBwb3J0ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBCaXNEZXRlY3RlZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9BcnA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kR1VJRDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIERoY3BEaXNjb3ZlclZhbGlkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgRGhjcEFja1JlY2VpdmVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlPZmZlclJlY2VpdmVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgUHhlRGlzY292ZXJWYWxpZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIFB4ZVJlcGx5UmVjZWl2ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBQeGVCaXNSZXBseVJlY2VpdmVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgSWNtcEVycm9yUmVjZWl2ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBUZnRwRXJyb3JSZWNlaXZlZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VDYWxsYmFja3M7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBUVEw7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBUb1M7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICBTdGF0aW9uSXA7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICBTdWJuZXRNYXNrOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgICAgRGhjcERpc2NvdmVyOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgICAgRGhjcEFjazsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICAgIFByb3h5T2ZmZXI7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICBQeGVEaXNjb3ZlcjsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICAgIFB4ZVJlcGx5OworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgICAgUHhlQmlzUmVwbHk7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSICAgICBJcEZpbHRlcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEFycENhY2hlRW50cmllczsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9BUlBfRU5UUlkgICAgIEFycENhY2hlW0VGSV9QWEVfQkFTRV9DT0RFX01BWF9BUlBfRU5UUklFU107CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZVRhYmxlRW50cmllczsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9ST1VURV9FTlRSWSAgIFJvdXRlVGFibGVbRUZJX1BYRV9CQVNFX0NPREVfTUFYX1JPVVRFX0VOVFJJRVNdOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0lDTVBfRVJST1IgICAgSWNtcEVycm9yOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfRVJST1IgICAgVGZ0cEVycm9yOworfSBFRklfUFhFX0JBU0VfQ09ERV9NT0RFOworCisvLworLy8gUFhFIEJhc2UgQ29kZSBJbnRlcmZhY2UgRnVuY3Rpb24gZGVmaW5pdGlvbnMKKy8vCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NUQVJUKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIFVzZUlwdjYKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9TVE9QKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX0RIQ1ApICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgU29ydE9mZmVycworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX0RJU0NPVkVSKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAgICAgICAgICpUaGlzLAorICAgIElOIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLAorICAgIElOIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTGF5ZXIsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUJpcywKKyAgICBJTiBPVVQgRUZJX1BYRV9CQVNFX0NPREVfRElTQ09WRVJfSU5GTyAgKkluZm8gICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX01URlRQKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9PUENPREUgICAgT3BlcmF0aW9uLAorICAgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJQdHIgIE9QVElPTkFMLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ3cml0ZSwKKyAgICBJTiBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQmxvY2tTaXplICBPUFRJT05BTCwKKyAgICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqU2VydmVySXAsCisgICAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgKkZpbGVuYW1lLAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX0lORk8gICAgICpJbmZvICAgICAgIE9QVElPTkFMLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgIERvbnRVc2VCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9VRFBfV1JJVEUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICAgICAqVGhpcywKKyAgICBJTiBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPcEZsYWdzLAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICpEZXN0SXAsCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQgICAgICAgKkRlc3RQb3J0LAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICpHYXRld2F5SXAsICBPUFRJT05BTAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICpTcmNJcCwgICAgICBPUFRJT05BTAorICAgIElOIE9VVCBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUE9SVCAgICpTcmNQb3J0LCAgICBPUFRJT05BTAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICpIZWFkZXJTaXplLCBPUFRJT05BTAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpIZWFkZXJQdHIsICBPUFRJT05BTAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJQdHIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9VRFBfUkVBRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgICAgICpUaGlzLAorICAgIElOIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wRmxhZ3MsCisgICAgSU4gT1VUIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgKkRlc3RJcCwgICAgICBPUFRJT05BTAorICAgIElOIE9VVCBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUE9SVCAgICpEZXN0UG9ydCwgICAgT1BUSU9OQUwKKyAgICBJTiBPVVQgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAqU3JjSXAsICAgICAgIE9QVElPTkFMCisgICAgSU4gT1VUIEVGSV9QWEVfQkFTRV9DT0RFX1VEUF9QT1JUICAgKlNyY1BvcnQsICAgICBPUFRJT05BTAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICpIZWFkZXJTaXplLCAgT1BUSU9OQUwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSGVhZGVyUHRyLCAgIE9QVElPTkFMCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclB0cgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NFVF9JUF9GSUxURVIpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICpUaGlzLAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX0lQX0ZJTFRFUiAgKk5ld0ZpbHRlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX0FSUCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAqSXBBZGRyLCAgICAgIAorICAgIElOIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgKk1hY0FkZHIgICAgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NFVF9QQVJBTUVURVJTKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICpOZXdBdXRvQXJwLCAgICBPUFRJT05BTAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgKk5ld1NlbmRHVUlELCAgIE9QVElPTkFMCisgICAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAqTmV3VFRMLCAgICAgICAgT1BUSU9OQUwKKyAgICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICpOZXdUb1MsICAgICAgICBPUFRJT05BTAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgKk5ld01ha2VDYWxsYmFjayAgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NFVF9TVEFUSU9OX0lQKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcywKKyAgICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICpOZXdTdGF0aW9uSXAsICBPUFRJT05BTAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgKk5ld1N1Ym5ldE1hc2sgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BYRV9CQVNFX0NPREVfU0VUX1BBQ0tFVFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICpUaGlzLAorICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgKk5ld0RoY3BEaXNjb3ZlclZhbGlkLCAgT1BUSU9OQUwKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdEaGNwQWNrUmVjZWl2ZWQsICAgIE9QVElPTkFMCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3UHJveHlPZmZlclJlY2VpdmVkLCBPUFRJT05BTAorICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgKk5ld1B4ZURpc2NvdmVyVmFsaWQsICAgT1BUSU9OQUwKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdQeGVSZXBseVJlY2VpdmVkLCAgIE9QVElPTkFMCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3UHhlQmlzUmVwbHlSZWNlaXZlZCxPUFRJT05BTAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgKk5ld0RoY3BEaXNjb3ZlciwgT1BUSU9OQUwKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICpOZXdEaGNwQWNrLCAgICAgIE9QVElPTkFMCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAqTmV3UHJveHlPZmZlciwgICBPUFRJT05BTAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgKk5ld1B4ZURpc2NvdmVyLCAgT1BUSU9OQUwKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICpOZXdQeGVSZXBseSwgICAgIE9QVElPTkFMCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAqTmV3UHhlQmlzUmVwbHkgICBPUFRJT05BTAorICAgICk7CisKKy8vCisvLyBQWEUgQmFzZSBDb2RlIFByb3RvY29sIHN0cnVjdHVyZQorLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9JTlRFUkZBQ0VfUkVWSVNJT04gICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1NUQVJUICAgICAgICAgICAgIFN0YXJ0OworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1NUT1AgICAgICAgICAgICAgIFN0b3A7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfREhDUCAgICAgICAgICAgICAgRGhjcDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9ESVNDT1ZFUiAgICAgICAgICBEaXNjb3ZlcjsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUCAgICAgICAgICAgICBNdGZ0cDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9VRFBfV1JJVEUgICAgICAgICBVZHBXcml0ZTsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUkVBRCAgICAgICAgICBVZHBSZWFkOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1NFVF9JUF9GSUxURVIgICAgIFNldElwRmlsdGVyOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0FSUCAgICAgICAgICAgICAgIEFycDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9TRVRfUEFSQU1FVEVSUyAgICBTZXRQYXJhbWV0ZXJzOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1NFVF9TVEFUSU9OX0lQICAgIFNldFN0YXRpb25JcDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9TRVRfUEFDS0VUUyAgICAgICBTZXRQYWNrZXRzOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX01PREUgICAgICAgICAgICAgICpNb2RlOworfSBFRklfUFhFX0JBU0VfQ09ERTsKKworLy8KKy8vIENhbGwgQmFjayBEZWZpbml0aW9ucworLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDS19QUk9UT0NPTCBcCisgICAgeyAweDI0NWRjYTIxLCAweGZiN2IsIDB4MTFkMywgezB4OGYsIDB4MDEsIDB4MDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworLy8KKy8vIFJldmlzaW9uIE51bWJlcgorLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDS19JTlRFUkZBQ0VfUkVWSVNJT04gICAweDAwMDEwMDAwCisKK0lOVEVSRkFDRV9ERUNMKF9FRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDSyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fRklSU1QsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fREhDUCwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9GVU5DVElPTl9ESVNDT1ZFUiwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9GVU5DVElPTl9NVEZUUCwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9GVU5DVElPTl9VRFBfV1JJVEUsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fVURQX1JFQUQsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fQVJQLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX0ZVTkNUSU9OX0lHTVAsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfUFhFX0ZVTkNUSU9OX0xBU1QKK30gRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT047CisKK3R5cGVkZWYgZW51bSB7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfU1RBVFVTX0ZJUlNULAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX0NBTExCQUNLX1NUQVRVU19DT05USU5VRSwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDS19TVEFUVVNfQUJPUlQsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfU1RBVFVTX0xBU1QKK30gRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfU1RBVFVTOworCit0eXBlZGVmCitFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDS19TVEFUVVMgCisoRUZJQVBJICpFRklfUFhFX0NBTExCQUNLKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDSyAgICpUaGlzLAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX0ZVTkNUSU9OICAgICAgICAgICBGdW5jdGlvbiwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZWQsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldExlbiwKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICAgICAgICAgKlBhY2tldCAgICAgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0sgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfUFhFX0NBTExCQUNLICAgICAgICAgICAgQ2FsbGJhY2s7Cit9IEVGSV9QWEVfQkFTRV9DT0RFX0NBTExCQUNLOworCisjZW5kaWYgLyogX0VGSVBYRUJDX0ggKi8KZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL2VmaXJ0bGliLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlydGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzNlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlydGxpYi5oCkBAIC0wLDAgKzEsMTQxIEBACisjaWZuZGVmIF9FRklfUlRfTElCX0lOQ0xVREVfCisjZGVmaW5lIF9FRklfUlRfTElCX0lOQ0xVREVfCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlsaWIuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBSdW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImVmaWRlYnVnLmgiCisjaW5jbHVkZSAiZWZpcGFydC5oIgorI2luY2x1ZGUgImVmaWxpYnBsYXQuaCIKKworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0WmVyb01lbSAoCisgICAgSU4gVk9JRCAgICAgKkJ1ZmZlciwKKyAgICBJTiBVSU5UTiAgICAgU2l6ZQorICAgICk7CisKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRTZXRNZW0gKAorICAgIElOIFZPSUQgICAgICpCdWZmZXIsCisgICAgSU4gVUlOVE4gICAgU2l6ZSwKKyAgICBJTiBVSU5UOCAgICBWYWx1ZSAgICAKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0Q29weU1lbSAoCisgICAgSU4gVk9JRCAgICAgKkRlc3QsCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKlNyYywKKyAgICBJTiBVSU5UTiAgICBsZW4KKyAgICApOworCitJTlROCitSVU5USU1FRlVOQ1RJT04KK1J0Q29tcGFyZU1lbSAoCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKkRlc3QsCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKlNyYywKKyAgICBJTiBVSU5UTiAgICBsZW4KKyAgICApOworCitJTlROCitSVU5USU1FRlVOQ1RJT04KK1J0U3RyQ21wICgKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczEsCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMyCisgICAgKTsKKworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0U3RyQ3B5ICgKKyAgICBJTiBDSEFSMTYgICAqRGVzdCwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAgKlNyYworICAgICk7CisKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRTdHJDYXQgKAorICAgIElOIENIQVIxNiAgICpEZXN0LAorICAgIElOIENPTlNUIENIQVIxNiAgICpTcmMKKyAgICApOworCitVSU5UTgorUlVOVElNRUZVTkNUSU9OCitSdFN0ckxlbiAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxCisgICAgKTsKKworVUlOVE4KK1JVTlRJTUVGVU5DVElPTgorUnRTdHJTaXplICgKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczEKKyAgICApOworCitJTlROCitSVU5USU1FRlVOQ1RJT04KK1J0Q29tcGFyZUd1aWQgKAorICAgIElOIEVGSV9HVUlEICAgICAqR3VpZDEsCisgICAgSU4gRUZJX0dVSUQgICAgICpHdWlkMgorICAgICk7CisKK1VJTlQ4CitSVU5USU1FRlVOQ1RJT04KK1J0RGVjaW1hbHRvQkNEKAorICAgIElOICBVSU5UOCBCY2RWYWx1ZQorICAgICk7CisKK1VJTlQ4CitSVU5USU1FRlVOQ1RJT04KK1J0QkNEdG9EZWNpbWFsKAorICAgIElOICBVSU5UOCBCY2RWYWx1ZQorICAgICk7CisKKy8vCisvLyBWaXJ0dWFsIG1hcHBpbmcgdHJhbnNpdGlvbiBzdXBwb3J0LiAgKE9ubHkgdXNlZCBkdXJpbmcKKy8vIHRoZSB2aXJ0dWFsIGFkZHJlc3MgY2hhbmdlIHRyYW5zaXNpdGlvbikKKy8vCisKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRMaWJFbmFibGVWaXJ0dWFsTWFwcGluZ3MgKAorICAgIFZPSUQKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0Q29udmVydExpc3QgKAorICAgIElOIFVJTlROICAgICAgICAgICAgRGVidWdEaXNwb3NpdGlvbiwKKyAgICBJTiBPVVQgTElTVF9FTlRSWSAgICpMaXN0SGVhZAorICAgICk7CisKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRBY3F1aXJlTG9jayAoCisgICAgSU4gRkxPQ0sgICAgKkxvY2sKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0UmVsZWFzZUxvY2sgKAorICAgIElOIEZMT0NLICAgICpMb2NrCisgICAgKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL2VmaXNlci5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjOTdhMQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaXNlci5oCkBAIC0wLDAgKzEsMTMyIEBACisjaWZuZGVmIF9FRklfU0VSX0gKKyNkZWZpbmUgX0VGSV9TRVJfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlzZXIuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBzZXJpYWwgcHJvdG9jb2wKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBTZXJpYWwgcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgU0VSSUFMX0lPX1BST1RPQ09MIFwKKyAgICB7IDB4QkIyNUNGNkYsIDB4RjFENCwgMHgxMUQyLCB7MHg5QSwgMHgwQywgMHgwMCwgMHg5MCwgMHgyNywgMHgzRiwgMHhDMSwgMHhGRH0gfQorCitJTlRFUkZBQ0VfREVDTChfU0VSSUFMX0lPX0lOVEVSRkFDRSk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRGVmYXVsdFBhcml0eSwgICAgICAKKyAgICBOb1Bhcml0eSwgICAgICAgICAgIAorICAgIEV2ZW5QYXJpdHksCisgICAgT2RkUGFyaXR5LAorICAgIE1hcmtQYXJpdHksCisgICAgU3BhY2VQYXJpdHkKK30gRUZJX1BBUklUWV9UWVBFOworCit0eXBlZGVmIGVudW0geworICAgIERlZmF1bHRTdG9wQml0cywgICAgICAgIAorICAgIE9uZVN0b3BCaXQsICAgICAgICAgLy8gMSBzdG9wIGJpdAorICAgIE9uZUZpdmVTdG9wQml0cywgICAgLy8gMS41IHN0b3AgYml0cworICAgIFR3b1N0b3BCaXRzICAgICAgICAgLy8gMiBzdG9wIGJpdHMKK30gRUZJX1NUT1BfQklUU19UWVBFOworCisjZGVmaW5lIEVGSV9TRVJJQUxfQ0xFQVJfVE9fU0VORCAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfREFUQV9TRVRfUkVBRFkgICAgICAgICAgICAgICAgICAweDAwMjAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfUklOR19JTkRJQ0FURSAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfQ0FSUklFUl9ERVRFQ1QgICAgICAgICAgICAgICAgICAweDAwODAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfUkVRVUVTVF9UT19TRU5EICAgICAgICAgICAgICAgICAweDAwMDIgIC8vIFdPCisjZGVmaW5lIEVGSV9TRVJJQUxfREFUQV9URVJNSU5BTF9SRUFEWSAgICAgICAgICAgICAweDAwMDEgIC8vIFdPCisjZGVmaW5lIEVGSV9TRVJJQUxfSU5QVVRfQlVGRkVSX0VNUFRZICAgICAgICAgICAgICAweDAxMDAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfT1VUUFVUX0JVRkZFUl9FTVBUWSAgICAgICAgICAgICAweDAyMDAgIC8vIFJPCisjZGVmaW5lIEVGSV9TRVJJQUxfSEFSRFdBUkVfTE9PUEJBQ0tfRU5BQkxFICAgICAgICAweDEwMDAgIC8vIFJXCisjZGVmaW5lIEVGSV9TRVJJQUxfU09GVFdBUkVfTE9PUEJBQ0tfRU5BQkxFICAgICAgICAweDIwMDAgIC8vIFJXCisjZGVmaW5lIEVGSV9TRVJJQUxfSEFSRFdBUkVfRkxPV19DT05UUk9MX0VOQUJMRSAgICAweDQwMDAgIC8vIFJXCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVJJQUxfUkVTRVQpICgKKyAgICBJTiBzdHJ1Y3QgX1NFUklBTF9JT19JTlRFUkZBQ0UgICpUaGlzCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUklBTF9TRVRfQVRUUklCVVRFUykgKAorICAgIElOIHN0cnVjdCBfU0VSSUFMX0lPX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBCYXVkUmF0ZSwKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVGaWZvRGVwdGgsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAorICAgIElOIEVGSV9QQVJJVFlfVFlQRSAgICAgICAgICAgICAgUGFyaXR5LAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJpdHMsCisgICAgSU4gRUZJX1NUT1BfQklUU19UWVBFICAgICAgICAgICBTdG9wQml0cworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVJJQUxfU0VUX0NPTlRST0xfQklUUykgKAorICAgIElOIHN0cnVjdCBfU0VSSUFMX0lPX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUklBTF9HRVRfQ09OVFJPTF9CSVRTKSAoCisgICAgSU4gc3RydWN0IF9TRVJJQUxfSU9fSU5URVJGQUNFICAqVGhpcywKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICpDb250cm9sCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUklBTF9XUklURSkgKAorICAgIElOIHN0cnVjdCBfU0VSSUFMX0lPX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VSSUFMX1JFQUQpICgKKyAgICBJTiBzdHJ1Y3QgX1NFUklBTF9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIENvbnRyb2xNYXNrOworCisgICAgLy8gY3VycmVudCBBdHRyaWJ1dGVzCisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgVGltZW91dDsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBCYXVkUmF0ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBSZWNlaXZlRmlmb0RlcHRoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIERhdGFCaXRzOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIFBhcml0eTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBTdG9wQml0czsKK30gU0VSSUFMX0lPX01PREU7CisKKyNkZWZpbmUgU0VSSUFMX0lPX0lOVEVSRkFDRV9SRVZJU0lPTiAgICAweDAwMDEwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9TRVJJQUxfSU9fSU5URVJGQUNFIHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIEVGSV9TRVJJQUxfUkVTRVQgICAgICAgICAgICAgUmVzZXQ7CisgICAgRUZJX1NFUklBTF9TRVRfQVRUUklCVVRFUyAgICBTZXRBdHRyaWJ1dGVzOworICAgIEVGSV9TRVJJQUxfU0VUX0NPTlRST0xfQklUUyAgU2V0Q29udHJvbDsKKyAgICBFRklfU0VSSUFMX0dFVF9DT05UUk9MX0JJVFMgIEdldENvbnRyb2w7CisgICAgRUZJX1NFUklBTF9XUklURSAgICAgICAgICAgICBXcml0ZTsKKyAgICBFRklfU0VSSUFMX1JFQUQgICAgICAgICAgICAgIFJlYWQ7CisKKyAgICBTRVJJQUxfSU9fTU9ERSAgICAgICAgICAgICAgICpNb2RlOworfSBTRVJJQUxfSU9fSU5URVJGQUNFOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvZWZpc3RkYXJnLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZmlzdGRhcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTk2Yjk0Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpc3RkYXJnLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfRUZJU1REQVJHX0hfCisjZGVmaW5lIF9FRklTVERBUkdfSF8KKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZGV2cGF0aC5oCisKK0Fic3RyYWN0OgorCisgICAgRGVmaW5lcyBmb3IgcGFyc2luZyB0aGUgRUZJIERldmljZSBQYXRoIHN0cnVjdHVyZXMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworI2lmZGVmIF9fR05VQ19fCisjaW5jbHVkZSAic3RkYXJnLmgiCisjZWxzZQorI2RlZmluZSBfSU5UU0laRU9GKG4pICAgKCAoc2l6ZW9mKG4pICsgc2l6ZW9mKFVJTlROKSAtIDEpICYgfihzaXplb2YoVUlOVE4pIC0gMSkgKQorCit0eXBlZGVmIENIQVI4ICogdmFfbGlzdDsKKworI2RlZmluZSB2YV9zdGFydChhcCx2KSAgKCBhcCA9ICh2YV9saXN0KSZ2ICsgX0lOVFNJWkVPRih2KSApCisjZGVmaW5lIHZhX2FyZyhhcCx0KSAgICAoICoodCAqKSgoYXAgKz0gX0lOVFNJWkVPRih0KSkgLSBfSU5UU0laRU9GKHQpKSApCisjZGVmaW5lIHZhX2VuZChhcCkgICggYXAgPSAodmFfbGlzdCkwICkKKyNlbmRpZgorCisjZW5kaWYgIC8qIF9JTkNfU1REQVJHICovCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9lZml0Y3AuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL2VmaXRjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWRmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9lZml0Y3AuaApAQCAtMCwwICsxLDM5MSBAQAorI2lmbmRlZiBfRUZJX1RDUF9ICisjZGVmaW5lIF9FRklfVENQX0gKKworLyorKworQ29weXJpZ2h0IChjKSAyMDEzICBJbnRlbCBDb3Jwb3JhdGlvbgorCistLSovCisKKyNkZWZpbmUgRUZJX1RDUDRfU0VSVklDRV9CSU5ESU5HX1BST1RPQ09MIFwKKyAgICB7IDB4MDA3MjA2NjUsIDB4NjdlYiwgMHg0YTk5LCB7MHhiYSwgMHhmNywgMHhkMywgMHhjMywgMHgzYSwgMHgxYywweDdjLCAweGM5fX0KKworI2RlZmluZSBFRklfVENQNF9QUk9UT0NPTCBcCisgICAgeyAweDY1NTMwYmM3LCAweGEzNTksIDB4NDEwZiwgezB4YjAsIDB4MTAsIDB4NWEsIDB4YWQsIDB4YzcsIDB4ZWMsIDB4MmIsIDB4NjJ9fQorCisjZGVmaW5lIEVGSV9UQ1A2X1NFUlZJQ0VfQklORElOR19QUk9UT0NPTCBcCisgICAgeyAweGVjMjBlYjc5LCAweDZjMWEsIDB4NDY2NCwgezB4OWEsIDB4ZCwgMHhkMiwgMHhlNCwgMHhjYywgMHgxNiwgMHhkNiwgMHg2NH19CisKKyNkZWZpbmUgRUZJX1RDUDZfUFJPVE9DT0wgXAorICAgIHsgMHg0NmU0NDg1NSwgMHhiZDYwLCAweDRhYjcsIHsweGFiLCAweGQsIDB4YTYsIDB4NzksIDB4YjksIDB4NDQsIDB4N2QsIDB4Nzd9fQorCitJTlRFUkZBQ0VfREVDTChfRUZJX1RDUDQpOworSU5URVJGQUNFX0RFQ0woX0VGSV9UQ1A2KTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICBVc2VEZWZhdWx0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTICAgU3RhdGlvbkFkZHJlc3M7CisgICAgRUZJX0lQdjRfQUREUkVTUyAgIFN1Ym5ldE1hc2s7CisgICAgVUlOVDE2ICAgICAgICAgICAgIFN0YXRpb25Qb3J0OworICAgIEVGSV9JUHY0X0FERFJFU1MgICBSZW1vdGVBZGRyZXNzOworICAgIFVJTlQxNiAgICAgICAgICAgICBSZW1vdGVQb3J0OworICAgIEJPT0xFQU4gICAgICAgICAgICBBY3RpdmVGbGFnOworfSBFRklfVENQNF9BQ0NFU1NfUE9JTlQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgUmVjZWl2ZUJ1ZmZlclNpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgIFNlbmRCdWZmZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICBNYXhTeW5CYWNrTG9nOworICAgIFVJTlQzMiAgICAgICAgICAgICBDb25uZWN0aW9uVGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgRGF0YVJldHJpZXM7CisgICAgVUlOVDMyICAgICAgICAgICAgIEZpblRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICAgIFRpbWVXYWl0VGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgS2VlcEFsaXZlUHJvYmVzOworICAgIFVJTlQzMiAgICAgICAgICAgICBLZWVwQWxpdmVUaW1lOworICAgIFVJTlQzMiAgICAgICAgICAgICBLZWVwQWxpdmVJbnRlcnZhbDsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlTmFnbGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVRpbWVTdGFtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlV2luZG93U2NhbGluZzsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlU2VsZWN0aXZlQWNrOworICAgIEJPT0xFQU4gICAgICAgICAgICBFbmFibGVQQXRoTXR1RGlzY292ZXJ5OworfSBFRklfVENQNF9PUFRJT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvLyBSZWNlaXZpbmcgRmlsdGVycworICAgIC8vIEkvTyBwYXJhbWV0ZXJzCisgICAgVUlOVDggICAgICAgICAgICAgICAgIFR5cGVPZlNlcnZpY2U7CisgICAgVUlOVDggICAgICAgICAgICAgICAgIFRpbWVUb0xpdmU7CisKKyAgICAvLyBBY2Nlc3MgUG9pbnQKKyAgICBFRklfVENQNF9BQ0NFU1NfUE9JTlQgQWNjZXNzUG9pbnQ7CisKKyAgICAvLyBUQ1AgQ29udHJvbCBPcHRpb25zCisgICAgRUZJX1RDUDRfT1BUSU9OICAgICAgICpDb250cm9sT3B0aW9uOworfSBFRklfVENQNF9DT05GSUdfREFUQTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUY3A0U3RhdGVDbG9zZWQgICAgICA9IDAsCisgICAgVGNwNFN0YXRlTGlzdGVuICAgICAgPSAxLAorICAgIFRjcDRTdGF0ZVN5blNlbnQgICAgID0gMiwKKyAgICBUY3A0U3RhdGVTeW5SZWNlaXZlZCA9IDMsCisgICAgVGNwNFN0YXRlRXN0YWJsaXNoZWQgPSA0LAorICAgIFRjcDRTdGF0ZUZpbldhaXQxICAgID0gNSwKKyAgICBUY3A0U3RhdGVGaW5XYWl0MiAgICA9IDYsCisgICAgVGNwNFN0YXRlQ2xvc2luZyAgICAgPSA3LAorICAgIFRjcDRTdGF0ZVRpbWVXYWl0ICAgID0gOCwKKyAgICBUY3A0U3RhdGVDbG9zZVdhaXQgICA9IDksCisgICAgVGNwNFN0YXRlTGFzdEFjayAgICAgPSAxMAorfSBFRklfVENQNF9DT05ORUNUSU9OX1NUQVRFOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNF9HRVRfTU9ERV9EQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAgICAgICAgICAgICAgICAgKlRoaXMsCisgICAgT1VUIEVGSV9UQ1A0X0NPTk5FQ1RJT05fU1RBVEUgICAgICAgKlRjcDRTdGF0ZSAgICAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfVENQNF9DT05GSUdfREFUQSAgICAgICAgICAgICpUY3A0Q29uZmlnRGF0YSBPUFRJT05BTCwKKyAgICBPVVQgRUZJX0lQNF9NT0RFX0RBVEEgICAgICAgICAgICAgICAqSXA0TW9kZURhdGEgICAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9NQU5BR0VEX05FVFdPUktfQ09ORklHX0RBVEEgKk1ucENvbmZpZ0RhdGEgIE9QVElPTkFMLAorICAgIE9VVCBFRklfU0lNUExFX05FVFdPUktfTU9ERSAgICAgICAgICpTbnBNb2RlRGF0YSAgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X0NPTkZJR1VSRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A0X0NPTkZJR19EQVRBICpUY3BDb25maWdEYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfUk9VVEVTKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgIERlbGV0ZVJvdXRlLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKlN1Ym5ldEFkZHJlc3MsCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqU3VibmV0TWFzaywKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpHYXRld2F5QWRkcmVzcworKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9FVkVOVCAgRXZlbnQ7CisgICAgRUZJX1NUQVRVUyBTdGF0dXM7Cit9IEVGSV9UQ1A0X0NPTVBMRVRJT05fVE9LRU47CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVENQNF9DT01QTEVUSU9OX1RPS0VOIENvbXBsZXRpb25Ub2tlbjsKK30gRUZJX1RDUDRfQ09OTkVDVElPTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfQ09OTkVDVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDRfQ09OTkVDVElPTl9UT0tFTiAqQ29ubmVjdGlvblRva2VuCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9UQ1A0X0NPTVBMRVRJT05fVE9LRU4gQ29tcGxldGlvblRva2VuOworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgTmV3Q2hpbGRIYW5kbGU7Cit9IEVGSV9UQ1A0X0xJU1RFTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfQUNDRVBUKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A0X0xJU1RFTl9UT0tFTiAqTGlzdGVuVG9rZW4KKyAgICApOworCisjZGVmaW5lIEVGSV9DT05ORUNUSU9OX0ZJTiAgICAgRUZJRVJSKDEwNCkKKyNkZWZpbmUgRUZJX0NPTk5FQ1RJT05fUkVTRVQgICBFRklFUlIoMTA1KQorI2RlZmluZSBFRklfQ09OTkVDVElPTl9SRUZVU0VEIEVGSUVSUigxMDYpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgRnJhZ21lbnRMZW5ndGg7CisgICAgVk9JRCAgICpGcmFnbWVudEJ1ZmZlcjsKK30gRUZJX1RDUDRfRlJBR01FTlRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgVXJnZW50RmxhZzsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9UQ1A0X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX1RDUDRfUkVDRUlWRV9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICBQdXNoOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgVXJnZW50OworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX1RDUDRfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfVENQNF9UUkFOU01JVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RDUDRfQ09NUExFVElPTl9UT0tFTiAgQ29tcGxldGlvblRva2VuOworICAgIHVuaW9uIHsKKwlFRklfVENQNF9SRUNFSVZFX0RBVEEgICpSeERhdGE7CisJRUZJX1RDUDRfVFJBTlNNSVRfREFUQSAqVHhEYXRhOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldDsKK30gRUZJX1RDUDRfSU9fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X1RSQU5TTUlUKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDRfSU9fVE9LRU4gKlRva2VuCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfUkVDRUlWRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgICpUaGlzLAorICAgIElOIEVGSV9UQ1A0X0lPX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVENQNF9DT01QTEVUSU9OX1RPS0VOIENvbXBsZXRpb25Ub2tlbjsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgIEFib3J0T25DbG9zZTsKK30gRUZJX1RDUDRfQ0xPU0VfVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X0NMT1NFKSgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A0ICAgICAqVGhpcywKKyAgICBJTiBFRklfVENQNF9DTE9TRV9UT0tFTiAqQ2xvc2VUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X0NBTkNFTCkoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAqVGhpcywKKyAgICBJTiBFRklfVENQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbiBPUFRJT05BTAorKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfUE9MTCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgKlRoaXMKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1RDUDQgeworICAgIEVGSV9UQ1A0X0dFVF9NT0RFX0RBVEEgR2V0TW9kZURhdGE7CisgICAgRUZJX1RDUDRfQ09ORklHVVJFICAgICBDb25maWd1cmU7CisgICAgRUZJX1RDUDRfUk9VVEVTICAgICAgICBSb3V0ZXM7CisgICAgRUZJX1RDUDRfQ09OTkVDVCAgICAgICBDb25uZWN0OworICAgIEVGSV9UQ1A0X0FDQ0VQVCAgICAgICAgQWNjZXB0OworICAgIEVGSV9UQ1A0X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX1RDUDRfUkVDRUlWRSAgICAgICBSZWNlaXZlOworICAgIEVGSV9UQ1A0X0NMT1NFICAgICAgICAgQ2xvc2U7CisgICAgRUZJX1RDUDRfQ0FOQ0VMICAgICAgICBDYW5jZWw7CisgICAgRUZJX1RDUDRfUE9MTCAgICAgICAgICBQb2xsOworfSBFRklfVENQNDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUY3A2U3RhdGVDbG9zZWQgICAgICA9IDAsCisgICAgVGNwNlN0YXRlTGlzdGVuICAgICAgPSAxLAorICAgIFRjcDZTdGF0ZVN5blNlbnQgICAgID0gMiwKKyAgICBUY3A2U3RhdGVTeW5SZWNlaXZlZCA9IDMsCisgICAgVGNwNlN0YXRlRXN0YWJsaXNoZWQgPSA0LAorICAgIFRjcDZTdGF0ZUZpbldhaXQxICAgID0gNSwKKyAgICBUY3A2U3RhdGVGaW5XYWl0MiAgICA9IDYsCisgICAgVGNwNlN0YXRlQ2xvc2luZyAgICAgPSA3LAorICAgIFRjcDZTdGF0ZVRpbWVXYWl0ICAgID0gOCwKKyAgICBUY3A2U3RhdGVDbG9zZVdhaXQgICA9IDksCisgICAgVGNwNlN0YXRlTGFzdEFjayAgICAgPSAxMAorfSBFRklfVENQNl9DT05ORUNUSU9OX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjZfQUREUkVTUyBTdGF0aW9uQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFN0YXRpb25Qb3J0OworICAgIEVGSV9JUHY2X0FERFJFU1MgUmVtb3RlQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFJlbW90ZVBvcnQ7CisgICAgQk9PTEVBTiAgICAgICAgICBBY3RpdmVGbGFnOworfSBFRklfVENQNl9BQ0NFU1NfUE9JTlQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgUmVjZWl2ZUJ1ZmZlclNpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgIFNlbmRCdWZmZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICBNYXhTeW5CYWNrTG9nOworICAgIFVJTlQzMiAgICAgICAgICAgICBDb25uZWN0aW9uVGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgRGF0YVJldHJpZXM7CisgICAgVUlOVDMyICAgICAgICAgICAgIEZpblRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICAgIFRpbWVXYWl0VGltZW91dDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgS2VlcEFsaXZlUHJvYmVzOworICAgIFVJTlQzMiAgICAgICAgICAgICBLZWVwQWxpdmVUaW1lOworICAgIFVJTlQzMiAgICAgICAgICAgICBLZWVwQWxpdmVJbnRlcnZhbDsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlTmFnbGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVRpbWVTdGFtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlV2luZGJvd1NjYWxpbmc7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVNlbGVjdGl2ZUFjazsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlUGF0aE10dURpc2NvdmVyeTsKK30gRUZJX1RDUDZfT1BUSU9OOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgIFRyYWZmaWNDbGFzczsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgSG9wTGltaXQ7CisgICAgRUZJX1RDUDZfQUNDRVNTX1BPSU5UIEFjY2Vzc1BvaW50OworICAgIEVGSV9UQ1A2X09QVElPTiAgICAgICAqQ29udHJvbE9wdGlvbjsKK30gRUZJX1RDUDZfQ09ORklHX0RBVEE7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A2X0dFVF9NT0RFX0RBVEEpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A2ICAgICAgICAgICAgICAgICAqVGhpcywKKyAgICBPVVQgRUZJX1RDUDZfQ09OTkVDVElPTl9TVEFURSAgICAgICAqVGNwNlN0YXRlICAgICAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9UQ1A2X0NPTkZJR19EQVRBICAgICAgICAgICAgKlRjcDZDb25maWdEYXRhIE9QVElPTkFMLAorICAgIE9VVCBFRklfSVA2X01PREVfREFUQSAgICAgICAgICAgICAgICpJcDZNb2RlRGF0YSAgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BTkFHRURfTkVUV09SS19DT05GSUdfREFUQSAqTW5wQ29uZmlnRGF0YSAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9TSU1QTEVfTkVUV09SS19NT0RFICAgICAgICAgKlNucE1vZGVEYXRhICAgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfQ09ORklHVVJFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDZfQ09ORklHX0RBVEEgKlRjcDZDb25maWdEYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9FVkVOVCAgRXZlbnQ7CisgICAgRUZJX1NUQVRVUyBTdGF0dXM7Cit9IEVGSV9UQ1A2X0NPTVBMRVRJT05fVE9LRU47CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVENQNl9DT01QTEVUSU9OX1RPS0VOIENvbXBsZXRpb25Ub2tlbjsKK30gRUZJX1RDUDZfQ09OTkVDVElPTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfQ09OTkVDVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDZfQ09OTkVDVElPTl9UT0tFTiAqQ29ubmVjdGlvblRva2VuCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9UQ1A2X0NPTVBMRVRJT05fVE9LRU4gQ29tcGxldGlvblRva2VuOworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgTmV3Q2hpbGRIYW5kbGU7Cit9IEVGSV9UQ1A2X0xJU1RFTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfQUNDRVBUKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A2X0xJU1RFTl9UT0tFTiAqTGlzdGVuVG9rZW4KKyAgICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyIEZyYWdtZW50TGVuZ3RoOworICAgIFZPSUQgICAqRnJhZ21lbnRCdWZmZXI7Cit9IEVGSV9UQ1A2X0ZSQUdNRU5UX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIFVyZ2VudEZsYWc7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfVENQNl9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9UQ1A2X1JFQ0VJVkVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgUHVzaDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIFVyZ2VudDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9UQ1A2X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX1RDUDZfVFJBTlNNSVRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9UQ1A2X0NPTVBMRVRJT05fVE9LRU4gIENvbXBsZXRpb25Ub2tlbjsKKyAgICB1bmlvbiB7CisJRUZJX1RDUDZfUkVDRUlWRV9EQVRBICAqUnhEYXRhOworCUVGSV9UQ1A2X1RSQU5TTUlUX0RBVEEgKlR4RGF0YTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQ7Cit9IEVGSV9UQ1A2X0lPX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9UUkFOU01JVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgICpUaGlzLAorICAgIElOIEVGSV9UQ1A2X0lPX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A2X1JFQ0VJVkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A2ICAqVGhpcywKKyAgICBJTiBFRklfVENQNl9JT19UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RDUDZfQ09NUExFVElPTl9UT0tFTiBDb21wbGV0aW9uVG9rZW47CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICBBYm9ydE9uQ2xvc2U7Cit9IEVGSV9UQ1A2X0NMT1NFX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9DTE9TRSkoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDZfQ0xPU0VfVE9LRU4gKkNsb3NlVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9DQU5DRUwpKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDZfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4gT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9QT0xMKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAqVGhpcworICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfVENQNiB7CisgICAgRUZJX1RDUDZfR0VUX01PREVfREFUQSBHZXRNb2RlRGF0YTsKKyAgICBFRklfVENQNl9DT05GSUdVUkUgICAgIENvbmZpZ3VyZTsKKyAgICBFRklfVENQNl9DT05ORUNUICAgICAgIENvbm5lY3Q7CisgICAgRUZJX1RDUDZfQUNDRVBUICAgICAgICBBY2NlcHQ7CisgICAgRUZJX1RDUDZfVFJBTlNNSVQgICAgICBUcmFuc21pdDsKKyAgICBFRklfVENQNl9SRUNFSVZFICAgICAgIFJlY2VpdmU7CisgICAgRUZJX1RDUDZfQ0xPU0UgICAgICAgICBDbG9zZTsKKyAgICBFRklfVENQNl9DQU5DRUwgICAgICAgIENhbmNlbDsKKyAgICBFRklfVENQNl9QT0xMICAgICAgICAgIFBvbGw7Cit9IEVGSV9UQ1A2OworCisjZW5kaWYgLyogX0VGSV9UQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvZWZpdWRwLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9lZml1ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhiNDY3Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpdWRwLmgKQEAgLTAsMCArMSwyNzIgQEAKKyNpZm5kZWYgX0VGSV9VRFBfSAorI2RlZmluZSBfRUZJX1VEUF9ICisKKworLyorKworQ29weXJpZ2h0IChjKSAyMDEzICBJbnRlbCBDb3Jwb3JhdGlvbgorCistLSovCisKKyNkZWZpbmUgRUZJX1VEUDRfU0VSVklDRV9CSU5ESU5HX1BST1RPQ09MIFwKKyAgICB7IDB4ODNmMDE0NjQsIDB4OTliZCwgMHg0NWU1LCB7MHhiMywgMHg4MywgMHhhZiwgMHg2MywgMHgwNSwgMHhkOCwgMHhlOSwgMHhlNn0gfQorCisjZGVmaW5lIEVGSV9VRFA0X1BST1RPQ09MIFwKKyAgICB7IDB4M2FkOWRmMjksIDB4NDUwMSwgMHg0NzhkLCB7MHhiMSwgMHhmOCwgMHg3ZiwgMHg3ZiwgMHhlNywgMHgwZSwgMHg1MCwgMHhmM30gfQorCisjZGVmaW5lIEVGSV9VRFA2X1NFUlZJQ0VfQklORElOR19QUk9UT0NPTCBcCisgICAgeyAweDY2ZWQ0NzIxLCAweDNjOTgsIDB4NGQzZSwgezB4ODEsIDB4ZTMsIDB4ZDAsIDB4M2QsIDB4ZDMsIDB4OWEsIDB4NzIsIDB4NTR9IH0KKworI2RlZmluZSBFRklfVURQNl9QUk9UT0NPTCBcCisgICAgeyAweDRmOTQ4ODE1LCAweGI0YjksIDB4NDNjYiwgezB4OGEsIDB4MzMsIDB4OTAsIDB4ZTAsIDB4NjAsIDB4YjMsMHg0OSwgMHg1NX0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX1VEUDQpOworSU5URVJGQUNFX0RFQ0woX0VGSV9VRFA2KTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QnJvYWRjYXN0OworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0UHJvbWlzY3VvdXM7CisgICAgQk9PTEVBTiAgICAgICAgICBBY2NlcHRBbnlQb3J0OworICAgIEJPT0xFQU4gICAgICAgICAgQWxsb3dEdXBsaWNhdGVQb3J0OworICAgIFVJTlQ4ICAgICAgICAgICAgVHlwZU9mU2VydmljZTsKKyAgICBVSU5UOCAgICAgICAgICAgIFRpbWVUb0xpdmU7CisgICAgQk9PTEVBTiAgICAgICAgICBEb05vdEZyYWdtZW50OworICAgIFVJTlQzMiAgICAgICAgICAgUmVjZWl2ZVRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICBUcmFuc21pdFRpbWVvdXQ7CisgICAgQk9PTEVBTiAgICAgICAgICBVc2VEZWZhdWx0QWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN0YXRpb25BZGRyZXNzOworICAgIEVGSV9JUHY0X0FERFJFU1MgU3VibmV0TWFzazsKKyAgICBVSU5UMTYgICAgICAgICAgIFN0YXRpb25Qb3J0OworICAgIEVGSV9JUHY0X0FERFJFU1MgUmVtb3RlQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFJlbW90ZVBvcnQ7Cit9IEVGSV9VRFA0X0NPTkZJR19EQVRBOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9HRVRfTU9ERV9EQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAgICAgICAgICAgICAgICAgKlRoaXMsCisgICAgT1VUIEVGSV9VRFA0X0NPTkZJR19EQVRBICAgICAgICAgICAgKlVkcDRDb25maWdEYXRhIE9QVElPTkFMLAorICAgIE9VVCBFRklfSVA0X01PREVfREFUQSAgICAgICAgICAgICAgICpJcDRNb2RlRGF0YSAgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BTkFHRURfTkVUV09SS19DT05GSUdfREFUQSAqTW5wQ29uZmlnRGF0YSAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9TSU1QTEVfTkVUV09SS19NT0RFICAgICAgICAgKlNucE1vZGVEYXRhICAgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDRfQ09ORklHVVJFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDRfQ09ORklHX0RBVEEgKlVkcENvbmZpZ0RhdGEgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9HUk9VUFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA0ICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgSm9pbkZsYWcsCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqTXVsdGljYXN0QWRkcmVzcyBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA0X1JPVVRFUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDQgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBEZWxldGVSb3V0ZSwKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpTdWJuZXRBZGRyZXNzLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKlN1Ym5ldE1hc2ssCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqR2F0ZXdheUFkZHJlc3MKKyAgICApOworCisjZGVmaW5lIEVGSV9ORVRXT1JLX1VOUkVBQ0hBQkxFICBFRklFUlIoMTAwKQorI2RlZmluZSBFRklfSE9TVF9VTlJFQUNIQUJMRSAgICAgRUZJRVJSKDEwMSkKKyNkZWZpbmUgRUZJX1BST1RPQ09MX1VOUkVBQ0hBQkxFIEVGSUVSUigxMDIpCisjZGVmaW5lIEVGSV9QT1JUX1VOUkVBQ0hBQkxFICAgICBFRklFUlIoMTAzKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjRfQUREUkVTUyBTb3VyY2VBZGRyZXNzOworICAgIFVJTlQxNiAgICAgICAgICAgU291cmNlUG9ydDsKKyAgICBFRklfSVB2NF9BRERSRVNTIERlc3RpbmF0aW9uQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIERlc3RpbmF0aW9uUG9ydDsKK30gRUZJX1VEUDRfU0VTU0lPTl9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyIEZyYWdtZW50TGVuZ3RoOworICAgIFZPSUQgICAqRnJhZ21lbnRCdWZmZXI7Cit9IEVGSV9VRFA0X0ZSQUdNRU5UX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVElNRSAgICAgICAgICAgICAgIFRpbWVTdGFtcDsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgIFJlY3ljbGVTaWduYWw7CisgICAgRUZJX1VEUDRfU0VTU0lPTl9EQVRBICBVZHBTZXNzaW9uOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX1VEUDRfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfVURQNF9SRUNFSVZFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVURQNF9TRVNTSU9OX0RBVEEgICpVZHBTZXNzaW9uRGF0YTsKKyAgICBFRklfSVB2NF9BRERSRVNTICAgICAgICpHYXRld2F5QWRkcmVzczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9VRFA0X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX1VEUDRfVFJBTlNNSVRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9FVkVOVCAgICAgICAgICAgICAgICAgIEV2ZW50OworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgIFN0YXR1czsKKyAgICB1bmlvbiB7CisgICAgICAgIEVGSV9VRFA0X1JFQ0VJVkVfREFUQSAgKlJ4RGF0YTsKKwlFRklfVURQNF9UUkFOU01JVF9EQVRBICpUeERhdGE7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0OworfSBFRklfVURQNF9DT01QTEVUSU9OX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9UUkFOU01JVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDRfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9SRUNFSVZFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfVURQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA0X0NBTkNFTCkoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfVURQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbiBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA0X1BPTEwpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA0ICpUaGlzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9VRFA0IHsKKyAgICBFRklfVURQNF9HRVRfTU9ERV9EQVRBIEdldE1vZGVEYXRhOworICAgIEVGSV9VRFA0X0NPTkZJR1VSRSAgICAgQ29uZmlndXJlOworICAgIEVGSV9VRFA0X0dST1VQUyAgICAgICAgR3JvdXBzOworICAgIEVGSV9VRFA0X1JPVVRFUyAgICAgICAgUm91dGVzOworICAgIEVGSV9VRFA0X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX1VEUDRfUkVDRUlWRSAgICAgICBSZWNlaXZlOworICAgIEVGSV9VRFA0X0NBTkNFTCAgICAgICAgQ2FuY2VsOworICAgIEVGSV9VRFA0X1BPTEwgICAgICAgICAgUG9sbDsKK30gRUZJX1VEUDQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdFByb21pc2N1b3VzOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QW55UG9ydDsKKyAgICBCT09MRUFOICAgICAgICAgIEFsbG93RHVwbGljYXRlUG9ydDsKKyAgICBVSU5UOCAgICAgICAgICAgIFRyYWZmaWNDbGFzczsKKyAgICBVSU5UOCAgICAgICAgICAgIEhvcExpbWl0OworICAgIFVJTlQzMiAgICAgICAgICAgUmVjZWl2ZVRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICBUcmFuc21pdFRpbWVvdXQ7CisgICAgRUZJX0lQdjZfQUREUkVTUyBTdGF0aW9uQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFN0YXRpb25Qb3J0OworICAgIEVGSV9JUHY2X0FERFJFU1MgUmVtb3RlQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFJlbW90ZVBvcnQ7Cit9IEVGSV9VRFA2X0NPTkZJR19EQVRBOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9HRVRfTU9ERV9EQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAgICAgICAgICAgICAgICAgKlRoaXMsCisgICAgT1VUIEVGSV9VRFA2X0NPTkZJR19EQVRBICAgICAgICAgICAgKlVkcDZDb25maWdEYXRhIE9QVElPTkFMLAorICAgIE9VVCBFRklfSVA2X01PREVfREFUQSAgICAgICAgICAgICAgICpJcDZNb2RlRGF0YSAgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BTkFHRURfTkVUV09SS19DT05GSUdfREFUQSAqTW5wQ29uZmlnRGF0YSAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9TSU1QTEVfTkVUV09SS19NT0RFICAgICAgICAgKlNucE1vZGVEYXRhICAgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDZfQ09ORklHVVJFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDZfQ09ORklHX0RBVEEgKlVkcENvbmZpZ0RhdGEgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9HUk9VUFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA2ICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgSm9pbkZsYWcsCisgICAgSU4gRUZJX0lQdjZfQUREUkVTUyAqTXVsdGljYXN0QWRkcmVzcyBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2Nl9BRERSRVNTIFNvdXJjZUFkZHJlc3M7CisgICAgVUlOVDE2ICAgICAgICAgICBTb3VyY2VQb3J0OworICAgIEVGSV9JUHY2X0FERFJFU1MgRGVzdGluYXRpb25BZGRyZXNzOworICAgIFVJTlQxNiAgICAgICAgICAgRGVzdGluYXRpb25Qb3J0OworfSBFRklfVURQNl9TRVNTSU9OX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgRnJhZ21lbnRMZW5ndGg7CisgICAgVk9JRCAgICpGcmFnbWVudEJ1ZmZlcjsKK30gRUZJX1VEUDZfRlJBR01FTlRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9USU1FICAgICAgICAgICAgICAgVGltZVN0YW1wOworICAgIEVGSV9FVkVOVCAgICAgICAgICAgICAgUmVjeWNsZVNpZ25hbDsKKyAgICBFRklfVURQNl9TRVNTSU9OX0RBVEEgIFVkcFNlc3Npb247CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfVURQNl9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9VRFA2X1JFQ0VJVkVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9VRFA2X1NFU1NJT05fREFUQSAgKlVkcFNlc3Npb25EYXRhOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX1VEUDZfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfVURQNl9UUkFOU01JVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgICAgICAgRXZlbnQ7CisgICAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgU3RhdHVzOworICAgIHVuaW9uIHsKKyAgICAgICAgRUZJX1VEUDZfUkVDRUlWRV9EQVRBICAqUnhEYXRhOworICAgICAgICBFRklfVURQNl9UUkFOU01JVF9EQVRBICpUeERhdGE7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0OworfSBFRklfVURQNl9DT01QTEVUSU9OX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9UUkFOU01JVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDZfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9SRUNFSVZFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfVURQNl9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA2X0NBTkNFTCkoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAgICAgICAgICAqVGhpcywKKyAgICBJTiBFRklfVURQNl9DT01QTEVUSU9OX1RPS0VOICpUb2tlbiBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA2X1BPTEwpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA2ICpUaGlzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9VRFA2IHsKKyAgICBFRklfVURQNl9HRVRfTU9ERV9EQVRBIEdldE1vZGVEYXRhOworICAgIEVGSV9VRFA2X0NPTkZJR1VSRSAgICAgQ29uZmlndXJlOworICAgIEVGSV9VRFA2X0dST1VQUyAgICAgICAgR3JvdXBzOworICAgIEVGSV9VRFA2X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX1VEUDZfUkVDRUlWRSAgICAgICBSZWNlaXZlOworICAgIEVGSV9VRFA2X0NBTkNFTCAgICAgICAgQ2FuY2VsOworICAgIEVGSV9VRFA2X1BPTEwgICAgICAgICAgUG9sbDsKK30gRUZJX1VEUDY7CisKKyNlbmRpZiAvKiBfRUZJX1VEUF9IICovCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9lZml1aS5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpdWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQxOTQzCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvZWZpdWkuaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIF9FRklfVUlfSAorI2RlZmluZSBfRUZJX1VJX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDIwMCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBFZmlVaS5oCisgICAgCitBYnN0cmFjdDogICAKKyAgICBQcm90b2NvbCB1c2VkIHRvIGJ1aWxkIFVzZXIgSW50ZXJmYWNlIChVSSkgc3R1ZmYuCisKKyAgICBUaGlzIHByb3RvY29sIGlzIGp1c3QgZGF0YS4gSXQgaXMgYSBtdWx0aSBkaW1lbnRpb25hbCBhcnJheS4KKyAgICBGb3IgZWFjaCBzdHJpbmcgdGhlcmUgaXMgYW4gYXJyYXkgb2YgVUlfU1RSSU5HX0VOVFJZLiBFYWNoIHN0cmluZworICAgIGlzIGZvciBhIGRpZmZlcmVudCBsYW5ndWFnZSB0cmFuc2xhdGlvbiBvZiB0aGUgc2FtZSBzdHJpbmcuIFRoZSBsaXN0IAorICAgIGlzIHRlcm1pbmF0ZWQgYnkgYSBOVUxMIFVpU3RyaW5nLiBUaGVyZSBjYW4gYmUgYW55IG51bWJlciBvZiAKKyAgICBVSV9TVFJJTkdfRU5UUlkgYXJyYXlzLiBBIE5VTEwgYXJyYXkgdGVybWluYXRlcyB0aGUgbGlzdC4gQSBOVUxMIGFycmF5CisgICAgZW50cnkgY29udGFpbnMgYWxsIHplcm9zLiAgCisKKyAgICBUaHVzIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSBFRklfVUlfUFJPVE9DT0wgaGFzIHRocmVlIFVJX1NUUklOR19FTlRSWS4KKyAgICBUaGUgU3RyaW5nLCBpdCdzIE5VTEwgdGVybWluYXRvciwgYW5kIHRoZSBOVUxMIHRlcm1pbmF0b3IgZm9yIHRoZSBlbnRpcmUgCisgICAgdGhpbmcuCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNkZWZpbmUgRUZJX1VJX1BST1RPQ09MIFwKKyAgICB7IDB4MzJkZDc5ODEsIDB4MmQyNywgMHgxMWQ0LCB7MHhiYywgMHg4YiwgMHgwLCAweDgwLCAweGM3LCAweDNjLCAweDg4LCAweDgxfSB9CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBVaURldmljZVN0cmluZywKKyAgICBVaVZlbmRvclN0cmluZywKKyAgICBVaU1heFN0cmluZworfSBVSV9TVFJJTkdfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIElTT182MzlfMiAgICpMYW5nQ29kZTsKKyAgICBDSEFSMTYgICAgICAqVWlTdHJpbmc7Cit9IFVJX1NUUklOR19FTlRSWTsKKworI2RlZmluZSBFRklfVUlfVkVSU0lPTiAgICAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX1VJX0lOVEVSRkFDRSB7CisgICAgVUlOVDMyICAgICAgICAgIFZlcnNpb247CisgICAgVUlfU1RSSU5HX0VOVFJZICpFbnRyeTsKK30gVUlfSU5URVJGQUNFOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvbGlic21iaW9zLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9saWJzbWJpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjFhMjhlCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvbGlic21iaW9zLmgKQEAgLTAsMCArMSwxMzIgQEAKKyNpZm5kZWYgX0xJQl9TTUJJT1NfSAorI2RlZmluZSBfTElCX1NNQklPU19ICisvKisrCisKK0NvcHlyaWdodCAoYykgMjAwMCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBMaWJTbWJpb3MuaAorICAgIAorQWJzdHJhY3Q6CisKKyAgICBMaWIgaW5jbHVkZSAgZm9yIFNNQklPUyBzZXJ2aWNlcy4gVXNlZCB0byBnZXQgc3lzdGVtIHNlcmlhbCBudW1iZXIgYW5kIEdVSUQKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBEZWZpbmUgU01CSU9TIHRhYmxlcy4KKy8vCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgIEFuY2hvclN0cmluZ1s0XTsKKyAgICBVSU5UOCAgIEVudHJ5UG9pbnRTdHJ1Y3R1cmVDaGVja3N1bTsKKyAgICBVSU5UOCAgIEVudHJ5UG9pbnRMZW5ndGg7CisgICAgVUlOVDggICBNYWpvclZlcnNpb247CisgICAgVUlOVDggICBNaW5vclZlcnNpb247CisgICAgVUlOVDE2ICBNYXhTdHJ1Y3R1cmVTaXplOworICAgIFVJTlQ4ICAgRW50cnlQb2ludFJldmlzaW9uOworICAgIFVJTlQ4ICAgRm9ybWF0dGVkQXJlYVs1XTsKKyAgICBVSU5UOCAgIEludGVybWVkaWF0ZUFuY2hvclN0cmluZ1s1XTsKKyAgICBVSU5UOCAgIEludGVybWVkaWF0ZUNoZWNrc3VtOworICAgIFVJTlQxNiAgVGFibGVMZW5ndGg7CisgICAgVUlOVDMyICBUYWJsZUFkZHJlc3M7CisgICAgVUlOVDE2ICBOdW1iZXJPZlNtYmlvc1N0cnVjdHVyZXM7CisgICAgVUlOVDggICBTbWJpb3NCY2RSZXZpc2lvbjsKK30gU01CSU9TX1NUUlVDVFVSRV9UQUJMRTsKKworLy8KKy8vIFBsZWFzZSBub3RlIHRoYXQgU01CSU9TIHN0cnVjdHVyZXMgY2FuIGJlIG9kZCBieXRlIGFsaWduZWQgc2luY2UgdGhlCisvLyAgdW5mb3JtYXRlZCBzZWN0aW9uIG9mIGVhY2ggcmVjb3JkIGlzIGEgc2V0IG9mIGFyYml0cmFyeSBzaXplIHN0cmluZ3MuCisvLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICBUeXBlOworICAgIFVJTlQ4ICAgTGVuZ3RoOworICAgIFVJTlQ4ICAgSGFuZGxlWzJdOworfSBTTUJJT1NfSEVBREVSOworCit0eXBlZGVmIFVJTlQ4ICAgU01CSU9TX1NUUklORzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNNQklPU19IRUFERVIgICBIZHI7CisgICAgU01CSU9TX1NUUklORyAgIFZlbmRvcjsKKyAgICBTTUJJT1NfU1RSSU5HICAgQmlvc1ZlcnNpb247CisgICAgVUlOVDggICAgICAgICAgIEJpb3NTZWdtZW50WzJdOworICAgIFNNQklPU19TVFJJTkcgICBCaW9zUmVsZWFzZURhdGU7CisgICAgVUlOVDggICAgICAgICAgIEJpb3NTaXplOworICAgIFVJTlQ4ICAgICAgICAgICBCaW9zQ2hhcmFjdGVyaXN0aWNzWzhdOworfSBTTUJJT1NfVFlQRTA7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTTUJJT1NfSEVBREVSICAgSGRyOworICAgIFNNQklPU19TVFJJTkcgICBNYW51ZmFjdHVyZXI7CisgICAgU01CSU9TX1NUUklORyAgIFByb2R1Y3ROYW1lOworICAgIFNNQklPU19TVFJJTkcgICBWZXJzaW9uOworICAgIFNNQklPU19TVFJJTkcgICBTZXJpYWxOdW1iZXI7CisKKyAgICAvLworICAgIC8vIGFsd2F5cyBieXRlIGNvcHkgdGhpcyBkYXRhIHRvIHByZXZlbnQgYWxpZ25tZW50IGZhdWx0cyEKKyAgICAvLworICAgIEVGSV9HVUlEICAgICAgICBVdWlkOworICAgIAorICAgIFVJTlQ4ICAgICAgICAgICBXYWtlVXBUeXBlOworfSBTTUJJT1NfVFlQRTE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTTUJJT1NfSEVBREVSICAgSGRyOworICAgIFNNQklPU19TVFJJTkcgICBNYW51ZmFjdHVyZXI7CisgICAgU01CSU9TX1NUUklORyAgIFByb2R1Y3ROYW1lOworICAgIFNNQklPU19TVFJJTkcgICBWZXJzaW9uOworICAgIFNNQklPU19TVFJJTkcgICBTZXJpYWxOdW1iZXI7Cit9IFNNQklPU19UWVBFMjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNNQklPU19IRUFERVIgICBIZHI7CisgICAgU01CSU9TX1NUUklORyAgIE1hbnVmYWN0dXJlcjsKKyAgICBVSU5UOCAgICAgICAgICAgVHlwZTsKKyAgICBTTUJJT1NfU1RSSU5HICAgVmVyc2lvbjsKKyAgICBTTUJJT1NfU1RSSU5HICAgU2VyaWFsTnVtYmVyOworICAgIFNNQklPU19TVFJJTkcgICBBc3NldFRhZzsKKyAgICBVSU5UOCAgICAgICAgICAgQm9vdHVwU3RhdGU7CisgICAgVUlOVDggICAgICAgICAgIFBvd2VyU3VwcGx5U3RhdGU7CisgICAgVUlOVDggICAgICAgICAgIFRoZXJtYWxTdGF0ZTsKKyAgICBVSU5UOCAgICAgICAgICAgU2VjdXJpdHlTdGF0dXM7CisgICAgVUlOVDggICAgICAgICAgIE9lbURlZmluZWRbNF07Cit9IFNNQklPU19UWVBFMzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNNQklPU19IRUFERVIgICBIZHI7CisgICAgVUlOVDggICAgICAgICAgIFNvY2tldDsKKyAgICBVSU5UOCAgICAgICAgICAgUHJvY2Vzc29yVHlwZTsKKyAgICBVSU5UOCAgICAgICAgICAgUHJvY2Vzc29yRmFtaWx5OworICAgIFNNQklPU19TVFJJTkcgICBQcm9jZXNzb3JNYW51ZmFjdHVyZTsKKyAgICBVSU5UOCAgICAgICAgICAgUHJvY2Vzc29ySWRbOF07CisgICAgU01CSU9TX1NUUklORyAgIFByb2Nlc3NvclZlcnNpb247CisgICAgVUlOVDggICAgICAgICAgIFZvbHRhZ2U7CisgICAgVUlOVDggICAgICAgICAgIEV4dGVybmFsQ2xvY2tbMl07CisgICAgVUlOVDggICAgICAgICAgIE1heFNwZWVkWzJdOworICAgIFVJTlQ4ICAgICAgICAgICBDdXJyZW50U3BlZWRbMl07CisgICAgVUlOVDggICAgICAgICAgIFN0YXR1czsKKyAgICBVSU5UOCAgICAgICAgICAgUHJvY2Vzc29yVXBncmFkZTsKKyAgICBVSU5UOCAgICAgICAgICAgTDFDYWNoZUhhbmRsZVsyXTsKKyAgICBVSU5UOCAgICAgICAgICAgTDJDYWNoZUhhbmRsZVsyXTsKKyAgICBVSU5UOCAgICAgICAgICAgTDNDYWNoZUhhbmRsZVsyXTsKK30gU01CSU9TX1RZUEU0OworCit0eXBlZGVmIHVuaW9uIHsKKyAgICBTTUJJT1NfSEVBREVSICAgKkhkcjsKKyAgICBTTUJJT1NfVFlQRTAgICAgKlR5cGUwOworICAgIFNNQklPU19UWVBFMSAgICAqVHlwZTE7CisgICAgU01CSU9TX1RZUEUyICAgICpUeXBlMjsKKyAgICBTTUJJT1NfVFlQRTMgICAgKlR5cGUzOworICAgIFNNQklPU19UWVBFNCAgICAqVHlwZTQ7CisgICAgVUlOVDggICAgICAgICAgICpSYXc7Cit9IFNNQklPU19TVFJVQ1RVUkVfUE9JTlRFUjsKKyNwcmFnbWEgcGFjaygpCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL3BjaTIyLmggYi9lZmk2NC9pbmNsdWRlL2VmaS9wY2kyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGY1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9wY2kyMi5oCkBAIC0wLDAgKzEsMTkzIEBACisjaWZuZGVmIF9QQ0kyMl9ICisjZGVmaW5lIF9QQ0kyMl9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk5ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIHBjaTIyLmgKKyAgICAKK0Fic3RyYWN0OiAgICAgIAorICAgIFN1cHBvcnQgZm9yIFBDSSAyLjIgc3RhbmRhcmQuCisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaWZkZWYgU09GVF9TRFYKKyNkZWZpbmUgUENJX01BWF9CVVMgICAgIDEKKyNlbHNlCisjZGVmaW5lIFBDSV9NQVhfQlVTICAgICAyNTUKKyNlbmRpZgorCisjZGVmaW5lIFBDSV9NQVhfREVWSUNFICAzMQorI2RlZmluZSBQQ0lfTUFYX0ZVTkMgICAgNworCisvLworLy8gQ29tbWFuZAorLy8KKyNkZWZpbmUgUENJX1ZHQV9QQUxFVFRFX1NOT09QX0RJU0FCTEVEICAgMHgyMAorCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgICAgICBWZW5kb3JJZDsKKyAgICBVSU5UMTYgICAgICBEZXZpY2VJZDsKKyAgICBVSU5UMTYgICAgICBDb21tYW5kOworICAgIFVJTlQxNiAgICAgIFN0YXR1czsKKyAgICBVSU5UOCAgICAgICBSZXZpc2lvbklEOworICAgIFVJTlQ4ICAgICAgIENsYXNzQ29kZVszXTsKKyAgICBVSU5UOCAgICAgICBDYWNoZUxpbmVTaXplOworICAgIFVJTlQ4ICAgICAgIExheXRlbmN5VGltZXI7CisgICAgVUlOVDggICAgICAgSGVhZGVyVHlwZTsKKyAgICBVSU5UOCAgICAgICBCSVNUOworfSBQQ0lfREVWSUNFX0lOREVQRU5ERU5UX1JFR0lPTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgIEJhcls2XTsKKyAgICBVSU5UMzIgICAgICBDSVNQdHI7CisgICAgVUlOVDE2ICAgICAgU3Vic3lzdGVtVmVuZG9ySUQ7CisgICAgVUlOVDE2ICAgICAgU3Vic3lzdGVtSUQ7CisgICAgVUlOVDMyICAgICAgRXhwYW5zaW9uUm9tQmFyOworICAgIFVJTlQzMiAgICAgIFJlc2VydmVkWzJdOworICAgIFVJTlQ4ICAgICAgIEludGVycnVwdExpbmU7CisgICAgVUlOVDggICAgICAgSW50ZXJydXB0UGluOworICAgIFVJTlQ4ICAgICAgIE1pbkdudDsKKyAgICBVSU5UOCAgICAgICBNYXhMYXQ7ICAgICAKK30gUENJX0RFVklDRV9IRUFERVJfVFlQRV9SRUdJT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQQ0lfREVWSUNFX0lOREVQRU5ERU5UX1JFR0lPTiAgIEhkcjsKKyAgICBQQ0lfREVWSUNFX0hFQURFUl9UWVBFX1JFR0lPTiAgIERldmljZTsKK30gUENJX1RZUEUwMDsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgCisgICAgVUlOVDMyICAgICAgQmFyWzJdOworICAgIFVJTlQ4ICAgICAgIFByaW1hcnlCdXM7CisgICAgVUlOVDggICAgICAgU2Vjb25kYXJ5QnVzOworICAgIFVJTlQ4ICAgICAgIFN1Ym9yZGluYXRlQnVzOworICAgIFVJTlQ4ICAgICAgIFNlY29uZGFyeUxhdGVuY3lUaW1lcjsKKyAgICBVSU5UOCAgICAgICBJb0Jhc2U7CisgICAgVUlOVDggICAgICAgSW9MaW1pdDsKKyAgICBVSU5UMTYgICAgICBTZWNvbmRhcnlTdGF0dXM7CisgICAgVUlOVDE2ICAgICAgTWVtb3J5QmFzZTsKKyAgICBVSU5UMTYgICAgICBNZW1vcnlMaW1pdDsKKyAgICBVSU5UMTYgICAgICBQcmVmZXRjaGFibGVNZW1vcnlCYXNlOworICAgIFVJTlQxNiAgICAgIFByZWZldGNoYWJsZU1lbW9yeUxpbWl0OworICAgIFVJTlQzMiAgICAgIFByZWZldGNoYWJsZUJhc2VVcHBlcjMyOworICAgIFVJTlQzMiAgICAgIFByZWZldGNoYWJsZUxpbWl0VXBwZXIzMjsKKyAgICBVSU5UMTYgICAgICBJb0Jhc2VVcHBlcjE2OworICAgIFVJTlQxNiAgICAgIElvTGltaXRVcHBlcjE2OworICAgIFVJTlQzMiAgICAgIFJlc2VydmVkOworICAgIFVJTlQzMiAgICAgIEV4cGFuc2lvblJvbUJBUjsKKyAgICBVSU5UOCAgICAgICBJbnRlcnJ1cHRMaW5lOworICAgIFVJTlQ4ICAgICAgIEludGVycnVwdFBpbjsKKyAgICBVSU5UMTYgICAgICBCcmlkZ2VDb250cm9sOworfSBQQ0lfQlJJREdFX0NPTlRST0xfUkVHSVNURVI7CisKKyNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVlfQ1RSTCAgICAgICAgICAweDAzCisjZGVmaW5lIFBDSV9DTEFTU19WR0EgICAgICAgICAgICAgICAgICAgMHgwMAorCisjZGVmaW5lIFBDSV9DTEFTU19CUklER0UgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBQQ0lfQ0xBU1NfSVNBICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUENJX0NMQVNTX0lTQV9QT1NJVElWRV9ERUNPREUgICAweDgwCisKKyNkZWZpbmUgUENJX0NMQVNTX05FVFdPUksgICAgICAgICAgICAgICAweDAyIAorI2RlZmluZSBQQ0lfQ0xBU1NfRVRIRVJORVQgICAgICAgICAgICAgIDB4MDAKKyAgICAgICAgCisjZGVmaW5lIEhFQURFUl9UWVBFX0RFVklDRSAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBIRUFERVJfVFlQRV9QQ0lfVE9fUENJX0JSSURHRSAgIDB4MDEKKyNkZWZpbmUgSEVBREVSX1RZUEVfTVVMVElfRlVOQ1RJT04gICAgICAweDgwCisjZGVmaW5lIEhFQURFUl9MQVlPVVRfQ09ERSAgICAgICAgICAgICAgMHg3ZgorCisjZGVmaW5lIElTX1BDSV9CUklER0UoX3ApICgoKChfcCktPkhkci5IZWFkZXJUeXBlKSAmIEhFQURFUl9MQVlPVVRfQ09ERSkgPT0gSEVBREVSX1RZUEVfUENJX1RPX1BDSV9CUklER0UpICAgICAgICAKKyNkZWZpbmUgSVNfUENJX01VTFRJX0ZVTkMoX3ApICAgKCgoX3ApLT5IZHIuSGVhZGVyVHlwZSkgJiBIRUFERVJfVFlQRV9NVUxUSV9GVU5DVElPTikgICAgICAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFBDSV9ERVZJQ0VfSU5ERVBFTkRFTlRfUkVHSU9OICAgSGRyOworICAgIFBDSV9CUklER0VfQ09OVFJPTF9SRUdJU1RFUiAgICAgQnJpZGdlOworfSBQQ0lfVFlQRTAxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICBSZWdpc3RlcjsKKyAgICBVSU5UOCAgIEZ1bmN0aW9uOworICAgIFVJTlQ4ICAgRGV2aWNlOworICAgIFVJTlQ4ICAgQnVzOworICAgIFVJTlQ4ICAgUmVzZXJ2ZWRbNF07Cit9IERFRklPX1BDSV9BRERSOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICBSZWcgICAgIDogODsKKyAgICBVSU5UMzIgIEZ1bmMgICAgOiAzOworICAgIFVJTlQzMiAgRGV2ICAgICA6IDU7CisgICAgVUlOVDMyICBCdXMgICAgIDogODsKKyAgICBVSU5UMzIgIFJlc2VydmVkOiA3OworICAgIFVJTlQzMiAgRW5hYmxlICA6IDE7Cit9IFBDSV9DT05GSUdfQUNDRVNTX0NGODsKKworI3ByYWdtYSBwYWNrKCkKKworI2RlZmluZSBFRklfUk9PVF9CUklER0VfTElTVCAgICAnZXByYicKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UTiAgICAgICAgICAgU2lnbmF0dXJlOworCisgICAgVUlOVDE2ICAgICAgICAgIEJyaWRnZU51bWJlcjsKKyAgICBVSU5UMTYgICAgICAgICAgUHJpbWFyeUJ1czsKKyAgICBVSU5UMTYgICAgICAgICAgU3Vib3JkaW5hdGVCdXM7CisKKyAgICBFRklfREVWSUNFX1BBVEggKkRldmljZVBhdGg7CisKKyAgICBMSVNUX0VOVFJZICAgICAgTGluazsKK30gUENJX1JPT1RfQlJJREdFX0VOVFJZOworCisKKyNkZWZpbmUgUENJX0VYUEFOU0lPTl9ST01fSEVBREVSX1NJR05BVFVSRSAgICAgICAgMHhhYTU1CisjZGVmaW5lIEVGSV9QQ0lfRVhQQU5TSU9OX1JPTV9IRUFERVJfRUZJU0lHTkFUVVJFIDB4MEVGMQorI2RlZmluZSBQQ0lfREFUQV9TVFJVQ1RVUkVfU0lHTkFUVVJFICAgICAgICAgICAgICBFRklfU0lHTkFUVVJFXzMyKCdQJywnQycsJ0knLCdSJykKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDE2ICAgICAgICAgIFNpZ25hdHVyZTsgICAgICAgICAgICAgIC8vIDB4YWE1NQorICAgIFVJTlQ4ICAgICAgICAgICBSZXNlcnZlZFsweDE2XTsKKyAgICBVSU5UMTYgICAgICAgICAgUGNpck9mZnNldDsKK30gUENJX0VYUEFOU0lPTl9ST01fSEVBREVSOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgICAgICAgICAgU2lnbmF0dXJlOyAgICAgICAgICAgICAgLy8gMHhhYTU1CisgICAgVUlOVDE2ICAgICAgICAgIEluaXRpYWxpemF0aW9uU2l6ZTsKKyAgICBVSU5UMTYgICAgICAgICAgRWZpU2lnbmF0dXJlOyAgICAgICAgICAgLy8gMHgwRUYxCisgICAgVUlOVDE2ICAgICAgICAgIEVmaVN1YnN5c3RlbTsKKyAgICBVSU5UMTYgICAgICAgICAgRWZpTWFjaGluZVR5cGU7CisgICAgVUlOVDggICAgICAgICAgIFJlc2VydmVkWzB4MEFdOworICAgIFVJTlQxNiAgICAgICAgICBFZmlJbWFnZUhlYWRlck9mZnNldDsKKyAgICBVSU5UMTYgICAgICAgICAgUGNpck9mZnNldDsKK30gRUZJX1BDSV9FWFBBTlNJT05fUk9NX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICBTaWduYXR1cmU7ICAgICAgICAgICAgICAvLyAiUENJUiIgCisgICAgVUlOVDE2ICAgICAgICAgIFZlbmRvcklkOworICAgIFVJTlQxNiAgICAgICAgICBEZXZpY2VJZDsKKyAgICBVSU5UMTYgICAgICAgICAgUmVzZXJ2ZWQwOworICAgIFVJTlQxNiAgICAgICAgICBMZW5ndGg7CisgICAgVUlOVDggICAgICAgICAgIFJldmlzaW9uOworICAgIFVJTlQ4ICAgICAgICAgICBDbGFzc0NvZGVbM107CisgICAgVUlOVDE2ICAgICAgICAgIEltYWdlTGVuZ3RoOworICAgIFVJTlQxNiAgICAgICAgICBDb2RlUmV2aXNpb247CisgICAgVUlOVDggICAgICAgICAgIENvZGVUeXBlOworICAgIFVJTlQ4ICAgICAgICAgICBJbmRpY2F0b3I7CisgICAgVUlOVDE2ICAgICAgICAgIFJlc2VydmVkMTsKK30gUENJX0RBVEFfU1RSVUNUVVJFOworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmCisgICAgCisKKworCisKKyAgICAKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL3Byb3RvY29sL2FkYXB0ZXJkZWJ1Zy5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvcHJvdG9jb2wvYWRhcHRlcmRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwYWY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL3Byb3RvY29sL2FkYXB0ZXJkZWJ1Zy5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX0FEQVBURVJfREVCVUdfSAorI2RlZmluZSBfQURBUFRFUl9ERUJVR19ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk5ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIEFkYXB0ZXJEZWJ1Zy5oCisgICAgCitBYnN0cmFjdDoKKworICAgIFByb3RvY29sIHRvIGRlYnVnIHRoZSBFREQgMy4wIGVuYWJsZW1lbnQgb2YgQklPUyBvcHRpb24gUk9NcworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vIHs4MkY4Njg4MS0yODJCLTExZDQtQkM3RC0wMDgwQzczQzg4ODF9CisjZGVmaW5lIEFEQVBURVJfREVCVUdfUFJPVE9DT0wgXAoreyAweDgyZjg2ODgxLCAweDI4MmIsIDB4MTFkNCwgezB4YmMsIDB4N2QsIDB4MCwgMHg4MCwgMHhjNywgMHgzYywgMHg4OCwgMHg4MX0gfQorCisvLworLy8gVGhpcyBwcm90b2NvbCBwb2ludHMgdG8gdGhlIEJJT1NfTEVHQUNZX0RSSVZFIGRhdGEgc3RydWN0dXJlCisvLyAgc2VlIGVkZC5oIGZvciBtb3JlIGRldGFpbHMKKy8vCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9wcm90b2NvbC9lZmljb25zcGxpdC5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvcHJvdG9jb2wvZWZpY29uc3BsaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWFkYjkyCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvcHJvdG9jb2wvZWZpY29uc3BsaXQuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9FRklfQ09ORk9SS19ICisjZGVmaW5lIF9FRklfQ09ORk9SS19ICisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OSAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKK0Fic3RyYWN0OgorCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKworCisvLworLy8gQ29uT3V0IEZvcmtlciBQcm90b2NvbAorLy8KKworI2RlZmluZSBURVhUX09VVF9TUExJVEVSX1BST1RPQ09MICAgIFwKKyAgICB7IDB4NTZkODMwYTAsIDB4N2U3YSwgMHgxMWQzLCB7MHhiYiwgMHhhMCwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKKyNkZWZpbmUgRVJST1JfT1VUX1NQTElURVJfUFJPVE9DT0wgICAgXAorICAgIHsgMHhmMGJhOTAzOSwgMHg2OGYxLCAweDQyNWUsIHsweGFhLCAweDdmLCAweGQ5LCAweGFhLCAweGY5LCAweDFiLCAweDgyLCAweGExfX0KKworI2RlZmluZSBURVhUX0lOX1NQTElURVJfUFJPVE9DT0wgICAgXAorICAgIHsgMHhmOWEzYzU1MCwgMHg3ZmI1LCAweDExZDMsIHsweGJiLCAweGEwLCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9wcm90b2NvbC9lZmlkYmcuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL3Byb3RvY29sL2VmaWRiZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTVhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS9wcm90b2NvbC9lZmlkYmcuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMAorICogSW50ZWwgQ29ycG9yYXRpb24uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIAorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIAorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogCisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEludGVsIENvcnBvcmF0aW9uIGFuZAorICogICAgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIAorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBvciBpdHMgY29udHJpYnV0b3JzIG1heSBiZQorICogICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIElOVEVMIENPUlBPUkFUSU9OIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFTCBDT1JQT1JBVElPTiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogCisgKi8KKworCisjaWZuZGVmIF9FRklEQkdfSF8KKyNkZWZpbmUgX0VGSURCR19IXworCisjaW5jbHVkZSAiZWZpY29udGV4dC5oIgorI2luY2x1ZGUgImVmaXNlci5oIgorCit0eXBlZGVmIHN0cnVjdCBfREVCVUdQT1JUXzE2NTUwX0NPTkZJR19EQVRBIHsKKyAgICAgICAgVUlOVDMyCQkJCQkJCVBvcnRBZGRyZXNzOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWRSYXRlOworICAgIAlVSU5UMzIgICAgICAgICAgICAgICAJCQlSZWNlaXZlRmlmb0RlcHRoOworICAgIAlVSU5UMzIgICAgICAgICAgICAgICAJCQlUaW1lb3V0OworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcml0eTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQml0czsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wQml0czsKKwkgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAJQ29udHJvbE1hc2s7CisgICAgICAgIEJPT0xFQU4JCQkJCQkJUnRzQ3RzRW5hYmxlOwkJLy8gUlRTLCBDVFMgY29udHJvbAorfSBERUJVR1BPUlRfMTY1NTBfQ09ORklHX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IF9ERUJVR1BPUlRfMTY1NTBfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgREVCVUdQT1JUXzE2NTUwX0NPTkZJR19EQVRBCQlDb25maWdEYXRhOworfSBERUJVR1BPUlRfMTY1NTBfREVWSUNFX1BBVEg7CisKK3R5cGVkZWYgdW5pb24geworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgIERldlBhdGg7CisgICAgREVCVUdQT1JUXzE2NTUwX0RFVklDRV9QQVRIICAgICAgICAgVWFydDsKKyAgICAvLyBhZGQgbmV3IHR5cGVzIG9mIGRlYnVncG9ydCBkZXZpY2UgcGF0aHMgdG8gdGhpcyB1bmlvbi4uLgorfSBERUJVR1BPUlRfREVWX1BBVEg7CisKKworLy8KKy8vIERlYnVnIFN1cHBvcnQgcHJvdG9jb2wgezI3NTU1OTBDLTZGM0MtNDJGQS05RUE0LUEzQkE1NDNDREEyNX0KKy8vCisKKyNkZWZpbmUgREVCVUdfU1VQUE9SVF9QUk9UT0NPTCBcCit7IDB4Mjc1NTU5MEMsIDB4NkYzQywgMHg0MmZhLCAweDlFLCAweEE0LCAweEEzLCAweEJBLCAweDU0LCAweDNDLCAweERBLCAweDI1IH0KKworCit0eXBlZGVmIFVJTlROIEVYQ0VQVElPTl9UWVBFOworCit0eXBlZGVmCitWT0lECisoKkVYQ0VQVElPTl9IQU5ETEVSKSAoCisJSU4gRVhDRVBUSU9OX1RZUEUgRXhjZXB0aW9uVHlwZSwKKyAgICBJTiBTWVNURU1fQ09OVEVYVCAqU3lzdGVtQ29udGV4dAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRUdJU1RFUl9USU1FUl9USUNLX0NBTExCQUNLKSAoCisgICAgSU4gc3RydWN0IF9FRklfREVCVUdfU1VQUE9SVF9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIEVYQ0VQVElPTl9IQU5ETEVSCSAgICAgICAgICAgICAgICBUaW1lclRpY2tDYWxsYmFjaworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRUdJU1RFUl9FWENFUFRJT05fSEFORExFUikgKAorICAgIElOICAgICBzdHJ1Y3QgX0VGSV9ERUJVR19TVVBQT1JUX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gICAgIEVYQ0VQVElPTl9IQU5ETEVSICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25IYW5kbGVyLAorICAgIElOICAgICBFWENFUFRJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUF9DQUxMX1RSQUNFKSAoCisgICAgSU4gICAgIHN0cnVjdCBfRUZJX0RFQlVHX1NVUFBPUlRfSU5URVJGQUNFICAqVGhpcworICAgICk7CisKKworI2RlZmluZSBFRklfREVCVUdfU1VQUE9SVF9JTlRFUkZBQ0VfUkVWSVNJT04gICAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ERUJVR19TVVBQT1JUX0lOVEVSRkFDRSB7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAJUmV2aXNpb247CisgICAgRUZJX1JFR0lTVEVSX1RJTUVSX1RJQ0tfQ0FMTEJBQ0sJUmVnaXN0ZXJUaW1lclRpY2tDYWxsYmFjazsKKyAgICBFRklfUkVHSVNURVJfRVhDRVBUSU9OX0hBTkRMRVIgIAlSZWdpc3RlckV4Y2VwdGlvbkhhbmRsZXI7CisgICAgRUZJX0lQX0NBTExfVFJBQ0UgICAgICAgICAgICAgICAJSXBDYWxsVHJhY2U7Cit9IEVGSV9ERUJVR19TVVBQT1JUX0lOVEVSRkFDRTsKKworCisvLworLy8gRGVidWdwb3J0IGlvIHByb3RvY29sIHtFQkE0RThEMi0zODU4LTQxRUMtQTI4MS0yNjQ3QkE5NjYwRDB9CisvLworCisjZGVmaW5lIERFQlVHUE9SVF9JT19QUk9UT0NPTCBcCit7IDBYRUJBNEU4RDIsIDBYMzg1OCwgMFg0MUVDLCAwWEEyLCAwWDgxLCAwWDI2LCAwWDQ3LCAwWEJBLCAwWDk2LCAwWDYwLCAwWEQwIH0KKyAKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RFQlVHUE9SVF9JT19SRVNFVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9JT19JTlRFUkZBQ0UgIAkqVGhpcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9ERUJVR1BPUlRfSU9fUkVBRCkgKAorICAgIElOICAgICBzdHJ1Y3QgX0VGSV9ERUJVR1BPUlRfSU9fSU5URVJGQUNFCSpUaGlzLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgCQkqQnVmZmVyU2l6ZSwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAJCSpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfREVCVUdQT1JUX0lPX1dSSVRFKSAoCisgICAgSU4gICAgIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9JT19JTlRFUkZBQ0UgKlRoaXMsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAJCSpCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgCQkqQnVmZmVyCisgICAgKTsKKworI2RlZmluZSBFRklfREVCVUdQT1JUX0lPX0lOVEVSRkFDRV9SRVZJU0lPTiAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ERUJVR1BPUlRfSU9fSU5URVJGQUNFIHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIAkJUmV2aXNpb247CisgICAgRUZJX0RFQlVHUE9SVF9JT19SRUFECQkJCQlSZWFkOworICAgIEVGSV9ERUJVR1BPUlRfSU9fV1JJVEUJCQkJCVdyaXRlOworICAgIEVGSV9ERUJVR1BPUlRfSU9fUkVTRVQJCQkJCVJlc2V0OworfSBFRklfREVCVUdQT1JUX0lPX0lOVEVSRkFDRTsKKworCisvLworLy8gRGVidWdwb3J0IFVBUlQxNjU1MCBjb250cm9sIHByb3RvY29sIHs2MjhFQTk3OC00QzI2LTQ2MDUtQkMwMi1BNDJBNDk2OTE3RER9CisvLworCisjZGVmaW5lIERFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9QUk9UT0NPTCBcCit7IDBYNjI4RUE5NzgsIDBYNEMyNiwgMFg0NjA1LCAwWEJDLCAwWDIsIDBYQTQsIDBYMkEsIDBYNDksIDBYNjksIDBYMTcsIDBYREQgfQorIAorLy8gTm90ZTogVGhlIGRlZmluaXRpb25zIGZvciBFRklfUEFSSVRZX1RZUEUsIEVGSV9TVE9QX0JJVFNfVFlQRSwgYW5kIAorLy8gU0VSSUFMX0lPX01PREUgYXJlIGluY2x1ZGVkIGZyb20gZWZpc2VyLmgKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VBUlQxNjU1MF9TRVRfQVRUUklCVVRFUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9JTlRFUkZBQ0UgIAkqVGhpcywKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgIAlCYXVkUmF0ZSwKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIAlSZWNlaXZlRmlmb0RlcHRoLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgCVRpbWVvdXQsCisgICAgSU4gRUZJX1BBUklUWV9UWVBFICAgICAgIAkJCVBhcml0eSwKKyAgICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIAlEYXRhQml0cywKKyAgICBJTiBFRklfU1RPUF9CSVRTX1RZUEUgICAgCQkJU3RvcEJpdHMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVUFSVDE2NTUwX1NFVF9DT05UUk9MX0JJVFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERUJVR1BPUlRfVUFSVDE2NTUwX0NPTlRST0xfSU5URVJGQUNFICAJKlRoaXMsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAJQ29udHJvbAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VQVJUMTY1NTBfR0VUX0NPTlRST0xfQklUUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9JTlRFUkZBQ0UJKlRoaXMsCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAJKkNvbnRyb2wKKyAgICApOworCisjZGVmaW5lIEVGSV9ERUJVR1BPUlRfVUFSVDE2NTUwX0NPTlRST0xfSU5URVJGQUNFX1JFVklTSU9OICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9JTlRFUkZBQ0UgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgCVJldmlzaW9uOworCUVGSV9VQVJUMTY1NTBfU0VUX0FUVFJJQlVURVMJCVNldEF0dHJpYnV0ZXM7CisJRUZJX1VBUlQxNjU1MF9TRVRfQ09OVFJPTF9CSVRTCQlTZXRDb250cm9sOworCUVGSV9VQVJUMTY1NTBfR0VUX0NPTlRST0xfQklUUyAJCUdldENvbnRyb2w7CisJREVCVUdQT1JUXzE2NTUwX0NPTkZJR19EQVRBCQkJKk1vZGU7Cit9IEVGSV9ERUJVR1BPUlRfVUFSVDE2NTUwX0NPTlRST0xfSU5URVJGQUNFOworICAgICAgICAKKworI2RlZmluZSBERVZJQ0VfUEFUSF9ERUJVR1BPUlQgREVCVUdQT1JUX0lPX1BST1RPQ09MCisgICAgICAgIAorI2VuZGlmIC8qIF9FRklEQkdfSF8gKi8KZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL3Byb3RvY29sL2VmaXZhci5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvcHJvdG9jb2wvZWZpdmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkYzUwNgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL3Byb3RvY29sL2VmaXZhci5oCkBAIC0wLDAgKzEsMTMzIEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKK0Fic3RyYWN0OgorCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKworCisvLworLy8gVGhlIHZhcmlhYmxlIHN0b3JlIHByb3RvY29sIGludGVyZmFjZSBpcyBzcGVjaWZpYyB0byB0aGUgcmVmZXJlbmNlCisvLyBpbXBsZW1lbnRhdGlvbi4gIFRoZSBpbml0aWFsaXphdGlvbiBjb2RlIGFkZHMgdmFyaWFibGUgc3RvcmUgZGV2aWNlcworLy8gdG8gdGhlIHN5c3RlbSwgYW5kIHRoZSBGVyBjb25uZWN0cyB0byB0aGUgZGV2aWNlcyB0byBwcm92aWRlIHRoZQorLy8gdmFyaWFibGUgc3RvcmUgaW50ZXJmYWNlcyB0aHJvdWdoIHRoZXNlIGRldmljZXMuCisvLworCisvLworLy8gVmFyaWFibGUgU3RvcmUgRGV2aWNlIHByb3RvY29sCisvLworCisjZGVmaW5lIFZBUklBQkxFX1NUT1JFX1BST1RPQ09MICAgIFwKKyAgICB7IDB4ZjA4OGNkOTEsIDB4YTA0NiwgMHgxMWQyLCB7MHg4ZSwgMHg0MiwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKK0lOVEVSRkFDRV9ERUNMKF9FRklfVkFSSUFCTEVfU1RPUkUpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU1RPUkVfQ0xFQVIpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9WQVJJQUJMRV9TVE9SRSAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQmFua05vLAorICAgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgKlNjcmF0Y2gKKyAgICApOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TVE9SRV9SRUFEKSAoCisgICAgSU4gc3RydWN0IF9FRklfVkFSSUFCTEVfU1RPUkUgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJhbmtObywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NUT1JFX1VQREFURSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1ZBUklBQkxFX1NUT1JFICAgKlRoaXMsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBCYW5rTm8sCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TVE9SRV9TSVpFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVkFSSUFCTEVfU1RPUkUgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE5vQmFua3MKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVFJBTlNBQ1RJT05fVVBEQVRFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVkFSSUFCTEVfU1RPUkUgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJhbmtObywKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdDb250ZW50cworICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfVkFSSUFCTEVfU1RPUkUgeworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgYmFua3MgYW5kIGJhbmsgc2l6ZQorICAgIC8vCisKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgQmFua1NpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIE5vQmFua3M7CisKKyAgICAvLworICAgIC8vIEZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIHN0b3JhZ2UgYmFua3MKKyAgICAvLworCisgICAgRUZJX1NUT1JFX0NMRUFSICAgICAgICAgICAgIENsZWFyU3RvcmU7CisgICAgRUZJX1NUT1JFX1JFQUQgICAgICAgICAgICAgIFJlYWRTdG9yZTsKKyAgICBFRklfU1RPUkVfVVBEQVRFICAgICAgICAgICAgVXBkYXRlU3RvcmU7CisgICAgRUZJX1NUT1JFX1NJWkUgICAgICAgICAgICAgIFNpemVTdG9yZSBPUFRJT05BTDsKKyAgICBFRklfVFJBTlNBQ1RJT05fVVBEQVRFICAgICAgVHJhbnNhY3Rpb25VcGRhdGUgT1BUSU9OQUw7CisKK30gRUZJX1ZBUklBQkxFX1NUT1JFOworCisKKy8vCisvLworLy8gQ2xlYXJTdG9yZSgpICAgICAtIEEgZnVuY3Rpb24gdG8gY2xlYXIgdGhlIHJlcXVlc3RlZCBzdG9yYWdlIGJhbmsuICBBIGNsZWFyZWQKKy8vICAgICAgYmFuayBjb250YWlucyBhbGwgIm9uIiBiaXRzLgorLy8KKy8vIFJlYWRTdG9yZSgpICAgICAgLSBSZWFkIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHN0b3JlLgorLy8KKy8vIFVwZGF0ZVN0b3JlKCkgICAgLSBVcGRhdGVzIGRhdGEgb24gdGhlIHJlcXVlc3RlZCBzdG9yZS4gVGhlIEZXIHdpbGwgb25seQorLy8gICAgICBldmVyIGlzc3VlIHVwZGF0ZXMgdG8gY2xlYXIgYml0cyBpbiB0aGUgc3RvcmUuIFVwZGF0ZXMgbXVzdCBiZQorLy8gICAgICBwZXJmb3JtZWQgaW4gTFNiIHRvIE1TYiBvcmRlciBvZiB0aGUgdXBkYXRlIGJ1ZmZlci4KKy8vCisvLyBTaXplU3RvcmUoKSAgICAgIC0gQW4gb3B0aW9uYWwgZnVuY3Rpb24gZm9yIG5vbi1ydW50aW1lIHN0b3JlcyB0aGF0IGNhbiBiZQorLy8gICAgICBkeW5hbWljYWxseSBzaXplZC4gIFRoZSBGVyB3aWxsIG9ubHkgZXZlciBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgc3RvcmUKKy8vICAgICAgYnkgMSBiYW5rc2l6ZSBhdCBhIHRpbWUsIGFuZCBpdCBpcyBhbHdheXMgYWRkaW5nIG9yIHJlbW92aW5nIGEgYmFuayBmcm9tIAorLy8gICAgICB0aGUgZW5kIG9mIHRoZSBzdG9yZS4KKy8vCisvLyBCeSBkZWZhdWx0IHRoZSBGVyB3aWxsIHVwZGF0ZSB2YXJpYWJsZXMgYW5kIHN0b3JhZ2UgYmFua3MgaW4gYW4KKy8vICJhdG9taWMiIG1hbm5lciBieSBrZWVwaW5nIDEgb2xkIGNvcHkgb2YgdGhlIGRhdGEgZHVyaW5nIGFuIHVwZGF0ZSwKKy8vIGFuZCByZWNvdmVyaW5nIGFwcHJvcGlhdGVseSBpZiB0aGUgcG93ZXIgaXMgbG9zdCBkdXJpbmcgdGhlIG1pZGRsZQorLy8gb2YgYW4gb3BlcmF0aW9uLiAgVG8gZG8gdGhpcyB0aGUgRlcgbmVlZHMgdG8gaGF2ZSBtdWx0aXBsZSBiYW5rcworLy8gb2Ygc3RvcmFnZSBkZWRpY2F0ZWQgdG8gaXRzIHVzZS4gSWYgdGhhdCdzIG5vdCBwb3NzaWJsZSwgdGhlIGRyaXZlciAKKy8vIGNhbiBpbXBsZW1lbnQgYW4gYXRvbWljIGJhbmsgdXBkYXRlIGZ1bmN0aW9uIGFuZCB0aGUgRlcgd2lsbCBhbGxvdyAKKy8vIDEgYmFuayBpbiB0aGlzIGNhc2UuICAoSXQgd2lsbCBhbGxvdyBhbnkgbnVtYmVyIG9mIGJhbmtzLAorLy8gYnV0IGl0IHdvbid0IHJlcXVpcmUgYW4gImV4dHJhIiBiYW5rIHRvIHByb3ZpZGUgaXRzIGJhbmsgdHJhbnNhY3Rpb24gCisvLyBmdW5jdGlvbikuCisvLworLy8gVHJhbnNhY3Rpb25VcGRhdGUoKSAgLSBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGNhbiBjbGVhciAmIHVwZGF0ZSBhbiAKKy8vICAgICAgZW50aXJlIGJhbmsgaW4gYW4gImF0b21pYyIgZmFzaGlvbi4gIElmIHRoZSBvcGVyYXRpb24gZmFpbHMgaW4gdGhlIAorLy8gICAgICBtaWRkbGUgdGhlIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgaGF2aW5nIGVpdGhlciB0aGUgcHJldmlvdXMgY29weSAKKy8vICAgICAgb2YgdGhlIGJhbmsncyBkYXRhIG9yIHRoZSBuZXcgY29weS4gIEEgY29weSB0aGF0J3MgcGFydGlhbGx5IHdyaXR0ZW4KKy8vICAgICAgaXMgbm90IHZhbGlkIGFzIGludGVybmFsIGRhdGEgc2V0dGluZ3MgbWF5IGdldCBsb3N0LiAgU3VwcGx5IHRoaXMKKy8vICAgICAgZnVuY3Rpb24gb25seSB3aGVuIG5lZWRlZC4KKy8vCisKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL3Byb3RvY29sL2ludGxvYWQuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL3Byb3RvY29sL2ludGxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI0ZTNmCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvcHJvdG9jb2wvaW50bG9hZC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk5IEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgaW50bG9hZAorCitBYnN0cmFjdDoKKworICAgIEVGSSBzdXBwb3J0IGZvciBsb2FkaW5nIGludGVybmFsbHkgbGlua2VkIGluIGFwcHMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaWZuZGVmIF9JTlRFUk5BTF9MT0FEX0lOQ0xVREVfCisjZGVmaW5lIF9JTlRFUk5BTF9MT0FEX0lOQ0xVREVfCisKKy8vIHtENjVBNkI4Qy03MUU1LTRkZjAtQTkwOS1GMEQyOTkyQjVBQTl9CisjZGVmaW5lIElOVEVSTkFMX1NIRUxMX0dVSUQgXAorICAgIHsgMHhkNjVhNmI4YywgMHg3MWU1LCAweDRkZjAsIHsweGE5LCAweDA5LCAweGYwLCAweGQyLCAweDk5LCAweDJiLCAweDVhLCAweGE5fSB9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9wcm90b2NvbC9sZWdhY3lib290LmggYi9lZmk2NC9pbmNsdWRlL2VmaS9wcm90b2NvbC9sZWdhY3lib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlOTRlNwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL3Byb3RvY29sL2xlZ2FjeWJvb3QuaApAQCAtMCwwICsxLDExOSBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTkgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBsZWdhY3lib290CisKK0Fic3RyYWN0OgorCisgICAgRUZJIHN1cHBvcnQgZm9yIGxlZ2FjeSBib290CisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2lmbmRlZiBfTEVHQUNZX0JPT1RfSU5DTFVERV8KKyNkZWZpbmUgX0xFR0FDWV9CT09UX0lOQ0xVREVfCisKKyNkZWZpbmUgTEVHQUNZX0JPT1RfUFJPVE9DT0wgXAorICAgIHsgMHgzNzZlNWViMiwgMHgzMGU0LCAweDExZDMsIHsgMHhiYSwgMHhlNSwgMHgwLCAweDgwLCAweGM3LCAweDNjLCAweDg4LCAweDgxIH0gfQorCisjcHJhZ21hIHBhY2soMSkKKworLy8KKy8vIEJCUyAxLjAxIChTZWUgQXBwZW5kaXggQSkgSVBMIGFuZCBCQ1YgVGFibGUgRW50cnkgRGF0YSBzdHJ1Y3R1cmUuCisvLyAgU2VnOk9mZiBwb2ludGVycyBoYXZlIGJlZW4gY29udmVydGVkIHRvIEVGSSBwb2ludGVycyBpbiB0aGlzIGRhdGEgc3RydWN0dXJlCisvLyAgVGhpcyBpcyB0aGUgc3RydWN0dXJlIHRoYXQgYWxzbyBtYXBzIHRvIHRoZSBFRkkgZGV2aWNlIHBhdGggZm9yIHRoZSBib290IHNlbGVjdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgIERldmljZVR5cGU7CisgICAgVUlOVDE2ICBTdGF0dXNGbGFnOworICAgIFVJTlQzMiAgUmVzZXJ2ZWQ7CisgICAgVk9JRCAgICAqQm9vdEhhbmRsZXI7ICAgLy8gTm90IGFuIEVGSSBlbnRyeSBwb2ludAorICAgIENIQVI4ICAgKkRlc2NTdHJpbmc7Cit9IEJCU19UQUJMRV9FTlRSWTsKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkxFR0FDWV9CT09UX0NBTEwpICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqRGV2aWNlUGF0aAorICAgICk7CisKKworLy8KKy8vIEJCUyBzdXBwb3J0IGZ1bmN0aW9ucworLy8gIFBuUCBDYWxsIG51bWJlcnMgYW5kIEJpb3NTZWxlY3RvciBoaWRkZW4gaW4gaW1wbGVtZW50YXRpb24KKy8vCisKK3R5cGVkZWYgZW51bSB7CisgICAgSXBsUmVsYXRpdmUsCisgICAgQmN2UmVsYXRpdmUKK30gQkJTX1RZUEU7CisKK0lOVEVSRkFDRV9ERUNMKF9MRUdBQ1lfQk9PVF9JTlRFUkZBQ0UpOworCisvLworLy8gPT0gUG5QIEZ1bmN0aW9uIDB4NjAgdGhlbiBCYnNWZXJzaW9uID09IDB4MDEwMSBpZiB0aGlzIGNhbGwgZmFpbHMgdGhlbiBCYnNWZXJzaW9uID09IDB4MDAwMAorLy8KKworLy8KKy8vID09IFBuUCBGdW5jdGlvbiAweDYxCisvLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqR0VUX0RFVklDRV9DT1VOVCkgKAorICAgIElOICBzdHJ1Y3QgX0xFR0FDWV9CT09UX0lOVEVSRkFDRSAgICpUaGlzLAorICAgIElOICBCQlNfVFlQRSAgICAgICAgKlRhYmxlVHlwZSwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICpEZXZpY2VDb3VudCwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICpNYXhDb3VudAorICAgICk7CisKKy8vCisvLyA9PSBQblAgRnVuY3Rpb24gMHg2MgorLy8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkdFVF9QUklPUklUWV9BTkRfVEFCTEUpICgKKyAgICBJTiAgc3RydWN0IF9MRUdBQ1lfQk9PVF9JTlRFUkZBQ0UgICAqVGhpcywKKyAgICBJTiAgQkJTX1RZUEUgICAgICAgICpUYWJsZVR5cGUsCisgICAgSU4gT1VUICBVSU5UTiAgICAgICAqUHJpb3JpdHlTaXplLCAvLyBNYXhDb3VudCAqIHNpemVvZihVSU5UOCkKKyAgICBPVVQgICAgIFVJTlROICAgICAgICpQcmlvcml0eSwKKyAgICBJTiBPVVQgIFVJTlROICAgICAgICpUYWJsZVNpemUsICAgIC8vIE1heENvdW50ICogc2l6ZW9mKEJCU19UQUJMRV9FTlRSWSkKKyAgICBPVVQgQkJTX1RBQkxFX0VOVFJZICpUYWJsZUVudHJ5U2l6ZQorICAgICk7CisKKy8vCisvLyA9PSBQblAgRnVuY3Rpb24gMHg2MworLy8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKlNFVF9QUklPUklUWSkgKAorICAgIElOICBzdHJ1Y3QgX0xFR0FDWV9CT09UX0lOVEVSRkFDRSAgICpUaGlzLAorICAgIElOICBCQlNfVFlQRSAgICAgICAgKlRhYmxlVHlwZSwKKyAgICBJTiBPVVQgIFVJTlROICAgICAgICpQcmlvcml0eVNpemUsCisgICAgT1VUICAgICBVSU5UTiAgICAgICAqUHJpb3JpdHkKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfTEVHQUNZX0JPT1RfSU5URVJGQUNFIHsKKyAgICBMRUdBQ1lfQk9PVF9DQUxMICAgIEJvb3RJdDsKKworICAgIC8vCisgICAgLy8gTmV3IGZ1bmN0aW9ucyB0byBhbGxvdyBCQlMgYm9vdGluZyB0byBiZSBjb25maWd1cmVkIGZyb20gRUZJCisgICAgLy8KKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICBCYnNWZXJzaW9uOyAgICAgLy8gQ3VycmVudGx5IDB4MDEwMQorICAgIEdFVF9ERVZJQ0VfQ09VTlQgICAgICAgIEdldERldmljZUNvdW50OworICAgIEdFVF9QUklPUklUWV9BTkRfVEFCTEUgIEdldFByaW9yaXR5QW5kVGFibGU7CisgICAgU0VUX1BSSU9SSVRZICAgICAgICAgICAgU2V0UHJpb3JpdHk7ICAgCit9IExFR0FDWV9CT09UX0lOVEVSRkFDRTsKKworRUZJX1NUQVRVUworUGxJbml0aWFsaXplTGVnYWN5Qm9vdCAoCisgICAgVk9JRAorICAgICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZWZpNjQvaW5jbHVkZS9lZmkvcHJvdG9jb2wvcGlmbGFzaDY0LmggYi9lZmk2NC9pbmNsdWRlL2VmaS9wcm90b2NvbC9waWZsYXNoNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTIxZGZjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvcHJvdG9jb2wvcGlmbGFzaDY0LmgKQEAgLTAsMCArMSwxMjEgQEAKKyNpZm5kZWYgX1BJRkxBU0g2NF9ICisjZGVmaW5lIF9QSUZMQVNINjRfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OSAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBQSWZsYXNoNjQuaAorICAgIAorQWJzdHJhY3Q6CisKKyAgICBJZmxhc2g2NC5lZmkgcHJvdG9jb2wgdG8gYWJzdHJhY3QgaWZsYXNoIGZyb20KKyAgICB0aGUgc3lzdGVtLgorCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIEd1aWQgdGhhdCBpZGVudGlmaWVzIHRoZSBJRkxBU0ggcHJvdG9jb2wKKy8vCisjZGVmaW5lIElGTEFTSDY0X1BST1RPQ09MX1BST1RPQ09MIFwKKyAgICB7IDB4NjVjYmExMTAsIDB4NzRhYiwgMHgxMWQzLCAweGJiLCAweDg5LCAweDAsIDB4ODAsIDB4YzcsIDB4M2MsIDB4ODgsIDB4ODEgfTsKKworLy8KKy8vIFVubG9jayBGTEFTSCBmcm9tIFN0YXJ0QWRkcmVzcyB0byBFbmRBZGRyZXNzIGFuZCByZXR1cm4gYSBMb2NrS2V5CisvLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqVU5MT0NLX0ZMQVNIX0FQSSkoCisgICAgSU4gc3RydWN0IF9JRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0UgICpUaGlzCisgICAgKTsKKworLy8KKy8vIExvY2sgdGhlIGZsYXNoIHJlcHJlc2VudGVkIGJ5IHRoZSBMb2NrS2V5CisvLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqTE9DS19GTEFTSF9BUEkpKAorICAgIElOIHN0cnVjdCBfSUZMQVNINjRfUFJPVE9DT0xfSU5URVJGQUNFICAqVGhpcworICAgICk7CisKKy8vCisvLyBTdGF0dXMgY2FsbGJhY2sgZm9yIGEgdXRpbGl0eSBsaWtlIElGTEFTSDY0CisvLworLy8gIFRva2VuIHdvdWxkIG1hcCB0byBhIGxpc3QgbGlrZSBUZWQgcHJvcG9zZWQuIFRoZSB1dGlsaXR5IGhhcyBubyBpZGVhIHdoYXQgCisvLyAgICAgIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUuCisvLyAgRXJyb3JTdGF0dXMgLSBMZXZlbCBvZiBFcnJvciBvciBzdWNjZXNzLiBJbmRlcGVuZGVudCBvZiBUb2tlbi4gSWYgeW91IAorLy8gICAgICBkb24ndCBrbm93IHRoZSB0b2tlbiB5b3Ugd2lsbCBhdCBsZWFzdCBrbm93IHBhc3Mgb3IgZmFpbC4KKy8vICBTdHJpbmcgLSBPcHRpb25hbCBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuIENvdWxkIGJlIHVzZWQgZm9yIAorLy8gICAgICBkZWJ1ZyBvciBmdXR1cmUgZXhwYW5zaW9uCisvLworLy8gIEF0dHJpYnV0ZXMgLSBPcHRpb25zIHNjcmVlbiBhdHRyaWJ1dGVzIGZvciBTdHJpbmcuIENvdWxkIGFsbG93IHRoZSBzdHJpbmcgdG8gYmUgZGlmZmVyZW50IGNvbG9ycy4KKy8vCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpVVElMSVRZX1BST0dSRVNTX0FQSSkoCisgICAgSU4gc3RydWN0IF9JRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiwKKyAgICBJTiAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXMsIAorICAgIElOICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nLCAgICBPUFRJT05BTAorICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQXR0cmlidXRlcyBPUFRJT05BTAorICAgICk7CisKKy8vCisvLyBUb2tlbiBWYWx1ZXMKKy8vCisvLyBJRmxhc2g2NCBUb2tlbiBDb2RlcworI2RlZmluZSBJRkxBU0hfVE9LRU5fSUZMQVNIU1RBUlQgICAgMHhCMCAgICAgICAgICAgICAgICAvLyBJRmxhc2g2NCBoYXMgc3RhcnRlZAorI2RlZmluZSBJRkxBU0hfVE9LRU5fUkVBRElOR0ZJTEUgICAgMHhCMSAgICAgICAgICAgICAgICAvLyBSZWFkaW5nIEZpbGUKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0lOSVRWUFAgICAgICAgIDB4QjIgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6aW5nIFZwcAorI2RlZmluZSBJRkxBU0hfVE9LRU5fRElTQUJMRVZQUCAgICAgMHgxMCAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIFZwcAorI2RlZmluZSBJRkxBU0hfVE9LRU5fRkxBU0hVTkxPQ0sgICAgMHhCMyAgICAgICAgICAgICAgICAvLyBVbmxvY2tpbmcgRkxBU0ggRGV2aWNlcworI2RlZmluZSBJRkxBU0hfVE9LRU5fRkxBU0hFUkFTRSAgICAgMHhCNCAgICAgICAgICAgICAgICAvLyBFcmFzaW5nIEZMQVNIIERldmljZXMKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0ZMQVNIUFJPR1JBTSAgIDB4QjUgICAgICAgICAgICAgICAgLy8gUHJvZ3JhbW1pbmcgRkxBU0gKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0ZMQVNIVkVSSUZZICAgIDB4QjYgICAgICAgICAgICAgICAgLy8gVmVyaWZ5aW5nIEZMQVNICisjZGVmaW5lIElGTEFTSF9UT0tFTl9VUERBVEVTVUNDRVMgICAweEI3ICAgICAgICAgICAgICAgIC8vIEZMQVNIIFVwZGFnZSBTdWNjZXNzIQorCisjZGVmaW5lIElGTEFTSF9UT0tFTl9QUk9HUkVTU19SRUFESU5HRklMRSAgIDB4MTEgICAgICAgIC8vICUgUmVhZGluZyBGaWxlCisjZGVmaW5lIElGTEFTSF9UT0tFTl9QUk9HUkVTU19GTEFTSFVOTE9DSyAgIDB4MTMgICAgICAgIC8vICUgVW5sb2NraW5nIEZMQVNIIERldmljZXMKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX1BST0dSRVNTX0ZMQVNIRVJBU0UgICAgMHgxNCAgICAgICAgLy8gJSBFcmFzaW5nIEZMQVNIIERldmljZXMKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX1BST0dSRVNTX0ZMQVNIUFJPR1JBTSAgMHgxNSAgICAgICAgLy8gJSBQcm9ncmFtbWluZyBGTEFTSAorI2RlZmluZSBJRkxBU0hfVE9LRU5fUFJPR1JFU1NfRkxBU0hWRVJJRlkgICAweDE2ICAgICAgICAvLyAlIFZlcmlmeWluZyBGTEFTSAorCisjZGVmaW5lIElGTEFTSF9UT0tFTl9SRUFESU5HRklMRV9FUiAweEI4ICAgICAgICAgICAgICAgIC8vIEZpbGUgUmVhZCBFcnJvcgorI2RlZmluZSBJRkxBU0hfVE9LRU5fSU5JVFZQUF9FUiAgICAgMHhCOSAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXphdGlvbiBvZiBJRkIgRXJyb3IKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0ZMQVNIVU5MT0NLX0VSIDB4QkEgICAgICAgICAgICAgICAgLy8gRkxBU0ggVW5sb2NrIEVycm9yCisjZGVmaW5lIElGTEFTSF9UT0tFTl9GTEFTSEVSQVNFX0VSICAweEJCICAgICAgICAgICAgICAgIC8vIEZMQVNIIEVyYXNlIEVycm9yCisjZGVmaW5lIElGTEFTSF9UT0tFTl9GTEFTSFZFUklGWV9FUiAweEJDICAgICAgICAgICAgICAgIC8vIEZMQVNIIFZlcmlmeSBFcnJvcgorI2RlZmluZSBJRkxBU0hfVE9LRU5fRkxBU0hQUk9HX0VSICAgMHhCRCAgICAgICAgICAgICAgICAvLyBGTEFTSCBQcm9ncmFtIEVycm9yCisKKyNkZWZpbmUgSUZMQVNIX1RBQkxFX0VORCAgICAgICAgICAgIDB4MDAKKworLy8KKy8vIElmIHRoaXMgbnVtYmVyIGNoYW5nZXMgb25lIG9mIHRoZSBleGlzdGluZyBBUEkncyBoYXMgY2hhbmdlcworLy8KKyNkZWZpbmUgSUZMQVNIX1BJX01BSk9SX1ZFUlNJT04gMHgwMQorCisvLworLy8gVGhpcyBudW1iZXIgY2hhbmdlcyB3aGVuIG5ldyBBUElzIG9yIGRhdGEgdmFyaWFibGVzIGdldCBhZGRlZCB0byB0aGUgZW5kCisvLyAgb2YgdGhlIGRhdGEgc3RydWN0dXJlCisvLworI2RlZmluZSBJRkxBU0hfUElfTUlOT1JfVkVSU0lPTiAweDAxCisKK3R5cGVkZWYgc3RydWN0IF9JRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0UgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIE1ham9yVmVyc2lvbjsgICAgICAgCisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgTWlub3JWZXJzaW9uOyAgIAorICAgIFVOTE9DS19GTEFTSF9BUEkgICAgICAgIFVubG9ja0ZsYXNoOworICAgIExPQ0tfRkxBU0hfQVBJICAgICAgICAgIExvY2tGbGFzaDsKKyAgICBVVElMSVRZX1BST0dSRVNTX0FQSSAgICBQcm9ncmVzczsKKyAgICAKKyAgICAvLworICAgIC8vIEZ1dHVyZSBleHBhbnNpb24gZ29lcyBoZXJlCisgICAgLy8KKworfSBJRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0U7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS9wcm90b2NvbC92Z2FjbGFzcy5oIGIvZWZpNjQvaW5jbHVkZS9lZmkvcHJvdG9jb2wvdmdhY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRlYjVjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvcHJvdG9jb2wvdmdhY2xhc3MuaApAQCAtMCwwICsxLDk1IEBACisjaWZuZGVmIF9WR0FfQ0xBU1NfSAorI2RlZmluZSBfVkdBX0NMQVNTX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTkgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgVmdhQ2xhc3MuaAorICAgIAorQWJzdHJhY3Q6CisKKyAgICBWZ2EgTWluaSBwb3J0IGJpbmRpbmcgdG8gVmdhIENsYXNzIHByb3RvY29sCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIFZHQSBEZXZpY2UgU3RydWN0dXJlCisvLworCisvLyB7MEUzRDYzMTAtNkZFNC0xMWQzLUJCODEtMDA4MEM3M0M4ODgxfQorI2RlZmluZSBWR0FfQ0xBU1NfRFJJVkVSX1BST1RPQ09MIFwKKyAgICB7IDB4ZTNkNjMxMCwgMHg2ZmU0LCAweDExZDMsIHsweGJiLCAweDgxLCAweDAsIDB4ODAsIDB4YzcsIDB4M2MsIDB4ODgsIDB4ODF9IH0KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoKiBJTklUX1ZHQV9DQVJEKSAoCisgICAgSU4gIFVJTlROICAgVmdhTW9kZSwKKyAgICBJTiAgVk9JRCAgICAqQ29udGV4dAorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UTiAgIE1heENvbHVtbnM7CisgICAgVUlOVE4gICBNYXhSb3dzOworfSBNQVhfQ09OU09MRV9HRU9NRVRSWTsKKworI2RlZmluZSBWR0FfQ09OX09VVF9ERVZfU0lHTkFUVVJFICAgRUZJX1NJR05BVFVSRV8zMignYycsJ3YnLCdnJywnYScpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmU7CisKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZTsKKyAgICBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgIENvbk91dDsKKyAgICBTSU1QTEVfVEVYVF9PVVRQVVRfTU9ERSAgICAgICAgIENvbk91dE1vZGU7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAqRGV2aWNlUGF0aDsKKworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcjsKKyAgICBFRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgICAgICAgICpEZXZpY2VJbzsKKworICAgIC8vCisgICAgLy8gVmlkZW8gQ2FyZCBDb250ZXh0CisgICAgLy8KKyAgICBJTklUX1ZHQV9DQVJEICAgICAgICAgICAgICAgICAgIEluaXRWZ2FDYXJkOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZnYUNhcmRDb250ZXh0OworICAgIE1BWF9DT05TT0xFX0dFT01FVFJZICAgICAgICAgICAgKkdlb21ldHJ5OworICAgIC8vCisgICAgLy8gVmlkZW8gYnVmZmVyIG5vcm1hbGx5IDB4YjgwMDAKKyAgICAvLworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9CdWZmZXI7CisKKyAgICAvLworICAgIC8vIENsZWFyIFNjcmVlbiAmIERlZmF1bHQgQXR0cmlidXRlCisgICAgLy8KKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTsKKworICAgIC8vCisgICAgLy8gLTEgbWVhbnMgc2VhcmNoIGZvciBhY3RpdmUgVkdBIGRldmljZQorICAgIC8vCisgICAgRUZJX1BDSV9BRERSRVNTX1VOSU9OICAgICAgICAgICBQY2k7Cit9IFZHQV9DT05fT1VUX0RFVjsKKworI2RlZmluZSBWR0FfQ09OX09VVF9ERVZfRlJPTV9USElTKGEpIENSKGEsIFZHQV9DT05fT1VUX0RFViwgQ29uT3V0LCBWR0FfQ09OX09VVF9ERVZfU0lHTkFUVVJFKQorCisvLworLy8gVmdhIENsYXNzIERyaXZlciBQcm90b2NvbC4gCisvLyBHVUlEIGRlZmluZWQgaW4gRUZJIExpYgorLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKklOU1RBTExfVkdBX0RSSVZFUikgKAorICAgIElOICBWR0FfQ09OX09VVF9ERVYgICAgKkNvbk91dERldiAKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgVmVyc2lvbjsKKyAgICBJTlNUQUxMX1ZHQV9EUklWRVIgICBJbnN0YWxsR2VuZXJpY1ZnYURyaXZlcjsKK30gSU5TVEFMTF9WR0FfRFJJVkVSX0lOVEVSRkFDRTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL3JvbWxvYWQuaCBiL2VmaTY0L2luY2x1ZGUvZWZpL3JvbWxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA2MDExCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkvcm9tbG9hZC5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgX0VGSV9ST01MT0FEX0gKKyNkZWZpbmUgX0VGSV9ST01MT0FEX0gKKworI2RlZmluZSBST01fU0lHTkFUVVJFIDB4YWE1NQorI2RlZmluZSBQQ0lEU19TSUdOQVRVUkUgIlBDSVIiCisjcHJhZ21hIHBhY2socHVzaCkKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAgVUlOVDggICAgUGNpZHNfU2lnWzRdOworICAgIFVJTlQxNiAgVmVuZElkOworICAgIFVJTlQxNiAgRGV2SWQ7CisgICAgVUlOVDE2ICBWcGRfT2ZmOworICAgIFVJTlQxNiAgU2l6ZTsKKyAgICBVSU5UOCBSZXY7CisgICAgVUlOVDggQ2xhc3NfQ29kZVszXTsKKyAgICBVSU5UMTYgIEltYWdlX0xlbjsKKyAgICBVSU5UMTYgIFJldl9Mdmw7CisgICAgVUlOVDggQ29kZV9UeXBlOworICAgIFVJTlQ4IEluZGk7CisgICAgVUlOVDE2ICBSc3ZkOworfVBjaURhdGFTdHJ1Y3R1cmU7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQxNiBTaXplOworICAgIFVJTlQzMiBIZWFkZXJfU2lnOworICAgIFVJTlQxNiBTdWJTeXN0ZW07CisgICAgVUlOVDE2IE1hY2hpbmVUeXBlOworICAgIFVJTlQ4ICBSZXN2ZFsxMF07CisgICAgVUlOVDE2IEVmaU9mZnNldDsKK31BcmNoRGF0YTsKK3R5cGVkZWYgc3RydWN0IAoreworICAgIFVJTlQxNiBSb21fU2lnOworICAgIEFyY2hEYXRhIEFyY2hfRGF0YTsKKyAgICBVSU5UMTYgUGNpZHNfT2ZmOworICAgIFVJTlQ4IHJlc3ZkWzM4XTsKK31Sb21IZWFkZXI7CisjcHJhZ21hIHBhY2socG9wKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL3g4Nl82NC9lZmliaW5kLmggYi9lZmk2NC9pbmNsdWRlL2VmaS94ODZfNjQvZWZpYmluZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzM3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9pbmNsdWRlL2VmaS94ODZfNjQvZWZpYmluZC5oCkBAIC0wLDAgKzEsMzgwIEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmVmaW5kLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgdG8gY29tcGlsZSBiaW5kaW5ncworCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKyNpZm5kZWYgWDg2XzY0X0VGSV9CSU5ECisjZGVmaW5lIFg4Nl82NF9FRklfQklORAorI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBwYWNrKCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChHTlVfRUZJX1VTRV9NU19BQkkpCisgICAgI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+IDQgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNykpCisgICAgICAgICNkZWZpbmUgSEFWRV9VU0VfTVNfQUJJIDEKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgQ29tcGlsZXIgaXMgdG9vIG9sZCBmb3IgR05VX0VGSV9VU0VfTVNfQUJJCisgICAgI2VuZGlmCisjZW5kaWYKKworLy8KKy8vIEJhc2ljIGludCB0eXBlcyBvZiB2YXJpb3VzIHdpZHRocworLy8KKworI2lmICFkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pIHx8IChfX1NURENfVkVSU0lPTl9fIDwgMTk5OTAxTCApCisKKyAgICAvLyBObyBBTlNJIEMgMTk5OS8yMDAwIHN0ZGludC5oIGludGVnZXIgd2lkdGggZGVjbGFyYXRpb25zIAorCisgICAgI2lmIGRlZmluZWQoX01TQ19FWFRFTlNJT05TKQorCisgICAgICAgIC8vIFVzZSBNaWNyb3NvZnQgQyBjb21waWxlciBpbnRlZ2VyIHdpZHRoIGRlY2xhcmF0aW9ucyAKKworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgdWludDY0X3Q7CisgICAgICAgIHR5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgICBpbnQ2NF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgICAgdWludDMyX3Q7CisgICAgICAgIHR5cGVkZWYgX19pbnQzMiAgICAgICAgICAgICBpbnQzMl90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdWludDE2X3Q7CisgICAgICAgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBpbnQxNl90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdWludDhfdDsKKyAgICAgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIGludDhfdDsKKyAgICAjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorICAgICAgICB0eXBlZGVmIGludCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0RJX18pKSkgICAgICAgICAgIGludDY0X3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKSAgdWludDY0X3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICB1aW50MzJfdDsKKyAgICAgICAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgIGludDMyX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1aW50MTZfdDsKKyAgICAgICAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAgIGludDE2X3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1aW50OF90OworICAgICAgICB0eXBlZGVmIHNpZ25lZCBjaGFyICAgICAgICAgaW50OF90OworICAgICNlbGlmIGRlZmluZWQoVU5JWF9MUDY0KQorCisgICAgICAgIC8qICBVc2UgTFA2NCBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIENfRkxBR1MgZm9yIGludGVnZXIgd2lkdGggZGVjbGFyYXRpb25zICovCisKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgdWludDY0X3Q7CisgICAgICAgdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgIGludDY0X3Q7CisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQzMl90OworICAgICAgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBpbnQzMl90OworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1aW50MTZfdDsKKyAgICAgICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgaW50MTZfdDsKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdWludDhfdDsKKyAgICAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgaW50OF90OworICAgICNlbHNlCisKKyAgICAgICAvKiAgQXNzdW1lIFA2NCBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIENfRkxBR1MgZm9yIGludGVnZXIgd2lkdGggZGVjbGFyYXRpb25zICovCisKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgdWludDY0X3QgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoOCkpKTsKKyAgICAgICB0eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICAgaW50NjRfdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICB1aW50MzJfdDsKKyAgICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgaW50MzJfdDsKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdWludDE2X3Q7CisgICAgICAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAgIGludDE2X3Q7CisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVpbnQ4X3Q7CisgICAgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIGludDhfdDsKKyAgICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisgICAgI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8vCisvLyBCYXNpYyBFRkkgdHlwZXMgb2YgdmFyaW91cyB3aWR0aHMKKy8vCisKKyNpZm5kZWYgX19XQ0hBUl9UWVBFX18KKyMgZGVmaW5lIF9fV0NIQVJfVFlQRV9fIHNob3J0CisjZW5kaWYKKwordHlwZWRlZiB1aW50NjRfdCAgIFVJTlQ2NDsKK3R5cGVkZWYgaW50NjRfdCAgICBJTlQ2NDsKKworI2lmbmRlZiBfQkFTRVRTRF9IXworICAgIHR5cGVkZWYgdWludDMyX3QgICBVSU5UMzI7CisgICAgdHlwZWRlZiBpbnQzMl90ICAgIElOVDMyOworI2VuZGlmCisKK3R5cGVkZWYgdWludDE2X3QgICBVSU5UMTY7Cit0eXBlZGVmIGludDE2X3QgICAgSU5UMTY7Cit0eXBlZGVmIHVpbnQ4X3QgICAgVUlOVDg7Cit0eXBlZGVmIGludDhfdCAgICAgSU5UODsKK3R5cGVkZWYgX19XQ0hBUl9UWVBFX18gV0NIQVI7CisKKyN1bmRlZiBWT0lECisjZGVmaW5lIFZPSUQgICAgdm9pZAorCisKK3R5cGVkZWYgaW50NjRfdCAgICBJTlROOwordHlwZWRlZiB1aW50NjRfdCAgIFVJTlROOworCisjaWZkZWYgRUZJX05UX0VNVUxBVE9SCisgICAgI2RlZmluZSBQT1NUX0NPREUoX0RhdGEpCisjZWxzZSAgICAKKyAgICAjaWZkZWYgRUZJX0RFQlVHCisjZGVmaW5lIFBPU1RfQ09ERShfRGF0YSkgICAgX19hc20gbW92IGVheCwoX0RhdGEpIF9fYXNtIG91dCAweDgwLGFsCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBQT1NUX0NPREUoX0RhdGEpCisgICAgI2VuZGlmICAKKyNlbmRpZgorCisjZGVmaW5lIEVGSUVSUihhKSAgICAgICAgICAgKDB4ODAwMDAwMDAwMDAwMDAwMCB8IGEpCisjZGVmaW5lIEVGSV9FUlJPUl9NQVNLICAgICAgMHg4MDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIEVGSUVSUl9PRU0oYSkgICAgICAgKDB4YzAwMDAwMDAwMDAwMDAwMCB8IGEpICAgICAgCisKKworI2RlZmluZSBCQURfUE9JTlRFUiAgICAgICAgIDB4RkJGQkZCRkJGQkZCRkJGQgorI2RlZmluZSBNQVhfQUREUkVTUyAgICAgICAgIDB4RkZGRkZGRkZGRkZGRkZGRgorCisjaWZkZWYgRUZJX05UX0VNVUxBVE9SCisgICAgI2RlZmluZSBCUkVBS1BPSU5UKCkgICAgICAgIF9fYXNtIHsgaW50IDMgfQorI2Vsc2UKKyAgICAjZGVmaW5lIEJSRUFLUE9JTlQoKSAgICAgICAgd2hpbGUgKFRSVUUpOyAgICAvLyBNYWtlIGl0IGhhbmcgb24gQmlvc1tEYmddMzIKKyNlbmRpZgorCisvLworLy8gUG9pbnRlcnMgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZXNlIGFkZHJlc3MgdG8gZnVuY3Rpb24KKy8vCisKKyNkZWZpbmUgTUlOX0FMSUdOTUVOVF9TSVpFICA0CisKKyNkZWZpbmUgQUxJR05fVkFSSUFCTEUoVmFsdWUgLEFkanVzdG1lbnQpIFwKKyAgICAgICAgICAgIChVSU5UTilBZGp1c3RtZW50ID0gMDsgXAorICAgICAgICAgICAgaWYoKFVJTlROKVZhbHVlICUgTUlOX0FMSUdOTUVOVF9TSVpFKSBcCisgICAgICAgICAgICAgICAgKFVJTlROKUFkanVzdG1lbnQgPSBNSU5fQUxJR05NRU5UX1NJWkUgLSAoKFVJTlROKVZhbHVlICUgTUlOX0FMSUdOTUVOVF9TSVpFKTsgXAorICAgICAgICAgICAgVmFsdWUgPSAoVUlOVE4pVmFsdWUgKyAoVUlOVE4pQWRqdXN0bWVudAorCisKKy8vCisvLyBEZWZpbmUgbWFjcm9zIHRvIGJ1aWxkIGRhdGEgc3RydWN0dXJlIHNpZ25hdHVyZXMgZnJvbSBjaGFyYWN0ZXJzLgorLy8KKworI2RlZmluZSBFRklfU0lHTkFUVVJFXzE2KEEsQikgICAgICAgICAgICAgKChBKSB8IChCPDw4KSkKKyNkZWZpbmUgRUZJX1NJR05BVFVSRV8zMihBLEIsQyxEKSAgICAgICAgIChFRklfU0lHTkFUVVJFXzE2KEEsQikgICAgIHwgKEVGSV9TSUdOQVRVUkVfMTYoQyxEKSAgICAgPDwgMTYpKQorI2RlZmluZSBFRklfU0lHTkFUVVJFXzY0KEEsQixDLEQsRSxGLEcsSCkgKEVGSV9TSUdOQVRVUkVfMzIoQSxCLEMsRCkgfCAoKFVJTlQ2NCkoRUZJX1NJR05BVFVSRV8zMihFLEYsRyxIKSkgPDwgMzIpKQorLy8KKy8vIFRvIGV4cG9ydCAmIGltcG9ydCBmdW5jdGlvbnMgaW4gdGhlIEVGSSBlbXVsYXRvciBlbnZpcm9ubWVudAorLy8KKworI2lmZGVmIEVGSV9OVF9FTVVMQVRPUgorICAgICNkZWZpbmUgRVhQT1JUQVBJICAgICAgICAgICBfX2RlY2xzcGVjKCBkbGxleHBvcnQgKQorI2Vsc2UKKyAgICAjZGVmaW5lIEVYUE9SVEFQSQorI2VuZGlmCisKKworLy8KKy8vIEVGSUFQSSAtIHByb3RvdHlwZSBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIEVGSSBmdW5jdGlvbiBwb2ludGVycworLy8gQk9PVFNFUlZJQ0UgLSBwcm90b3R5cGUgZm9yIGltcGxlbWVudGF0aW9uIG9mIGEgYm9vdCBzZXJ2aWNlIGludGVyZmFjZQorLy8gUlVOVElNRVNFUlZJQ0UgLSBwcm90b3R5cGUgZm9yIGltcGxlbWVudGF0aW9uIG9mIGEgcnVudGltZSBzZXJ2aWNlIGludGVyZmFjZQorLy8gUlVOVElNRUZVTkNUSU9OIC0gcHJvdG90eXBlIGZvciBpbXBsZW1lbnRhdGlvbiBvZiBhIHJ1bnRpbWUgZnVuY3Rpb24gdGhhdCBpcyBub3QgYSBzZXJ2aWNlCisvLyBSVU5USU1FX0NPREUgLSBwcmFnbWEgbWFjcm8gZm9yIGRlY2xhcmluZyBydW50aW1lIGNvZGUgICAgCisvLworCisjaWZuZGVmIEVGSUFQSSAgICAgICAgICAgICAgICAgIC8vIEZvcmNlcyBFRkkgY2FsbGluZyBjb252ZW50aW9ucyByZWd1YXJkbGVzcyBvZiBjb21waWxlciBvcHRpb25zIAorICAgICNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKKyAgICAgICAgI2RlZmluZSBFRklBUEkgX19jZGVjbCAgLy8gRm9yY2UgQyBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIE1pY3Jvc29mdCBDIGNvbXBpbGVyIAorICAgICNlbGlmIGRlZmluZWQoSEFWRV9VU0VfTVNfQUJJKQorICAgICAgICAvLyBGb3JjZSBhbWQ2NC9tcyBjYWxsaW5nIGNvbnZlbnRpb25zLgorICAgICAgICAjZGVmaW5lIEVGSUFQSSBfX2F0dHJpYnV0ZV9fKChtc19hYmkpKQorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgRUZJQVBJICAgICAgICAgIC8vIFN1YnN0aXR1dGUgZXhwcmVzaW9uIHRvIGZvcmNlIEMgY2FsbGluZyBjb252ZW50aW9uIAorICAgICNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQk9PVFNFUlZJQ0UKKy8vI2RlZmluZSBSVU5USU1FU0VSVklDRShwcm90byxhKSAgICBhbGxvY190ZXh0KCJydGNvZGUiLGEpOyBwcm90byBhCisvLyNkZWZpbmUgUlVOVElNRUZVTkNUSU9OKHByb3RvLGEpICAgYWxsb2NfdGV4dCgicnRjb2RlIixhKTsgcHJvdG8gYQorI2RlZmluZSBSVU5USU1FU0VSVklDRQorI2RlZmluZSBSVU5USU1FRlVOQ1RJT04KKworCisjZGVmaW5lIFJVTlRJTUVfQ09ERShhKSAgICAgICAgIGFsbG9jX3RleHQoInJ0Y29kZSIsIGEpCisjZGVmaW5lIEJFR0lOX1JVTlRJTUVfREFUQSgpICAgIGRhdGFfc2VnKCJydGRhdGEiKQorI2RlZmluZSBFTkRfUlVOVElNRV9EQVRBKCkgICAgICBkYXRhX3NlZygiIikKKworI2RlZmluZSBWT0xBVElMRSAgICB2b2xhdGlsZQorCisjZGVmaW5lIE1FTU9SWV9GRU5DRSgpICAgIAorCisjaWZkZWYgRUZJX05UX0VNVUxBVE9SCisKKy8vCisvLyBUbyBoZWxwIGVuc3VyZSBwcm9wZXIgY29kaW5nIG9mIGludGVncmF0ZWQgZHJpdmVycywgdGhleSBhcmUKKy8vIGNvbXBpbGVkIGFzIERMTHMuICBJbiBOVCB0aGV5IHJlcXVpcmUgYSBkbGwgaW5pdCBlbnRyeSBwb2ludGVyLgorLy8gVGhlIG1hY3JvIHB1dHMgYSBzdHViIGVudHJ5IHBvaW50IGludG8gdGhlIERMTCBzbyBpdCB3aWxsIGxvYWQuCisvLworCisjZGVmaW5lIEVGSV9EUklWRVJfRU5UUllfUE9JTlQoSW5pdEZ1bmN0aW9uKSAgICBcCisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19zdGRjYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0RsbE1haW5DUlRTdGFydHVwICggICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFVJTlROICAgIEluc3QsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFVJTlROICAgIHJlYXNvbl9mb3JfY2FsbCwgICAgICAgICAgICAgICBcCisgICAgICAgIFZPSUQgICAgKnJzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRVhQT1JUQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19jZGVjbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSW5pdGlhbGl6ZURyaXZlciAoICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZvaWQgKkltYWdlSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZvaWQgKlN5c3RlbVRhYmxlICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBJbml0RnVuY3Rpb24oSW1hZ2VIYW5kbGUsIFN5c3RlbVRhYmxlKTsgICAgICAgXAorICAgIH0KKworCisgICAgI2RlZmluZSBMT0FEX0lOVEVSTkFMX0RSSVZFUihfaWYsIHR5cGUsIG5hbWUsIGVudHJ5KSAgICAgIFwKKyAgICAgICAgKF9pZiktPkxvYWRJbnRlcm5hbCh0eXBlLCBuYW1lLCBOVUxMKSAgICAgICAgICAgICAKKworI2Vsc2UgLy8gRUZJX05UX0VNVUxBVE9SIAorCisvLworLy8gV2hlbiBidWlsZCBzaW1pbGlhciB0byBGVywgdGhlbiBsaW5rIGV2ZXJ5dGhpbmcgdG9nZXRoZXIgYXMKKy8vIG9uZSBiaWcgbW9kdWxlLgorLy8KKworICAgICNkZWZpbmUgRUZJX0RSSVZFUl9FTlRSWV9QT0lOVChJbml0RnVuY3Rpb24pICAgIFwKKyAgICAgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEluaXRpYWxpemVEcml2ZXIgKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVk9JRCAgICAqSW1hZ2VIYW5kbGUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFZPSUQgICAgKlN5c3RlbVRhYmxlICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBJbml0RnVuY3Rpb24oSW1hZ2VIYW5kbGUsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRhYmxlKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVGSV9TVEFUVVMgZWZpX21haW4oICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRUZJX0hBTkRMRSBpbWFnZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEVGSV9TWVNURU1fVEFCTEUgKnN5c3RhYiAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICApIF9fYXR0cmlidXRlX18oKHdlYWssICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBhbGlhcyAoIkluaXRpYWxpemVEcml2ZXIiKSkpOworCisgICAgI2RlZmluZSBMT0FEX0lOVEVSTkFMX0RSSVZFUihfaWYsIHR5cGUsIG5hbWUsIGVudHJ5KSAgICBcCisgICAgICAgICAgICAoX2lmKS0+TG9hZEludGVybmFsKHR5cGUsIG5hbWUsIGVudHJ5KQorCisjZW5kaWYgLy8gRUZJX0ZXX05UIAorCisvLworLy8gU29tZSBjb21waWxlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgZm9yd2FyZCByZWZlcmVuY2UgY29uc3RydWN0OgorLy8gIHR5cGVkZWYgc3RydWN0IFhYWFhYCisvLworLy8gVGhlIGZvbGxvd2luZyBtYWNybyBwcm92aWRlIGEgd29ya2Fyb3VuZCBmb3Igc3VjaCBjYXNlcy4KKy8vCisjaWZkZWYgTk9fSU5URVJGQUNFX0RFQ0wKKyNkZWZpbmUgSU5URVJGQUNFX0RFQ0woeCkKKyNlbHNlCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgSU5URVJGQUNFX0RFQ0woeCkgc3RydWN0IHgKKyNlbHNlCisjZGVmaW5lIElOVEVSRkFDRV9ERUNMKHgpIHR5cGVkZWYgc3RydWN0IHgKKyNlbmRpZgorI2VuZGlmCisKKy8qIGZvciB4ODZfNjQsIEVGSV9GVU5DVElPTl9XUkFQUEVSIG11c3QgYmUgZGVmaW5lZCAqLworI2lmIGRlZmluZWQoSEFWRV9VU0VfTVNfQUJJKQorI2RlZmluZSB1ZWZpX2NhbGxfd3JhcHBlcihmdW5jLCB2YV9udW0sIC4uLikgZnVuYyhfX1ZBX0FSR1NfXykKKyNlbHNlCisvKgorICBDcmVkaXRzIGZvciBtYWNyby1tYWdpYzoKKyAgICBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2ZvcnVtLz9mcm9tZ3JvdXBzIyF0b3BpYy9jb21wLnN0ZC5jL2QtNk1qNUxrb19zCisgICAgaHR0cDovL2VmZXN4LmNvbS8yMDEwLzA4LzMxL292ZXJsb2FkaW5nLW1hY3Jvcy8KKyovCisjZGVmaW5lIF9fVkFfTkFSR19fKC4uLikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fVkFfTkFSR18oXzAsICMjIF9fVkFfQVJHU19fLCBfX1JTRVFfTigpKQorI2RlZmluZSBfX1ZBX05BUkdfKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX1ZBX0FSR19OKF9fVkFfQVJHU19fKQorI2RlZmluZSBfX1ZBX0FSR19OKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfMCxfMSxfMixfMyxfNCxfNSxfNixfNyxfOCxfOSxfMTAsTiwuLi4pIE4KKyNkZWZpbmUgX19SU0VRX04oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMTAsIDksICA4LCAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgIDAKKworI2RlZmluZSBfX1ZBX0FSR19OU1VGRklYX18ocHJlZml4LC4uLikgICAgICAgICAgICAgICAgICBcCisgIF9fVkFfQVJHX05TVUZGSVhfTihwcmVmaXgsIF9fVkFfTkFSR19fKF9fVkFfQVJHU19fKSkKKyNkZWZpbmUgX19WQV9BUkdfTlNVRkZJWF9OKHByZWZpeCxuYXJncykgICAgICAgIFwKKyAgX19WQV9BUkdfTlNVRkZJWF9OXyhwcmVmaXgsIG5hcmdzKQorI2RlZmluZSBfX1ZBX0FSR19OU1VGRklYX05fKHByZWZpeCxuYXJncykgICAgICAgXAorICBwcmVmaXggIyMgbmFyZ3MKKworLyogUHJvdG90eXBlcyBvZiBFRkkgY2RlY2wgLT4gc3RkY2FsbCB0cmFtcG9saW5lcyAqLworVUlOVDY0IGVmaV9jYWxsMCh2b2lkICpmdW5jKTsKK1VJTlQ2NCBlZmlfY2FsbDEodm9pZCAqZnVuYywgVUlOVDY0IGFyZzEpOworVUlOVDY0IGVmaV9jYWxsMih2b2lkICpmdW5jLCBVSU5UNjQgYXJnMSwgVUlOVDY0IGFyZzIpOworVUlOVDY0IGVmaV9jYWxsMyh2b2lkICpmdW5jLCBVSU5UNjQgYXJnMSwgVUlOVDY0IGFyZzIsIFVJTlQ2NCBhcmczKTsKK1VJTlQ2NCBlZmlfY2FsbDQodm9pZCAqZnVuYywgVUlOVDY0IGFyZzEsIFVJTlQ2NCBhcmcyLCBVSU5UNjQgYXJnMywKKyAgICAgICAgICAgICAgICAgVUlOVDY0IGFyZzQpOworVUlOVDY0IGVmaV9jYWxsNSh2b2lkICpmdW5jLCBVSU5UNjQgYXJnMSwgVUlOVDY0IGFyZzIsIFVJTlQ2NCBhcmczLAorICAgICAgICAgICAgICAgICBVSU5UNjQgYXJnNCwgVUlOVDY0IGFyZzUpOworVUlOVDY0IGVmaV9jYWxsNih2b2lkICpmdW5jLCBVSU5UNjQgYXJnMSwgVUlOVDY0IGFyZzIsIFVJTlQ2NCBhcmczLAorICAgICAgICAgICAgICAgICBVSU5UNjQgYXJnNCwgVUlOVDY0IGFyZzUsIFVJTlQ2NCBhcmc2KTsKK1VJTlQ2NCBlZmlfY2FsbDcodm9pZCAqZnVuYywgVUlOVDY0IGFyZzEsIFVJTlQ2NCBhcmcyLCBVSU5UNjQgYXJnMywKKyAgICAgICAgICAgICAgICAgVUlOVDY0IGFyZzQsIFVJTlQ2NCBhcmc1LCBVSU5UNjQgYXJnNiwgVUlOVDY0IGFyZzcpOworVUlOVDY0IGVmaV9jYWxsOCh2b2lkICpmdW5jLCBVSU5UNjQgYXJnMSwgVUlOVDY0IGFyZzIsIFVJTlQ2NCBhcmczLAorICAgICAgICAgICAgICAgICBVSU5UNjQgYXJnNCwgVUlOVDY0IGFyZzUsIFVJTlQ2NCBhcmc2LCBVSU5UNjQgYXJnNywKKyAgICAgICAgICAgICAgICAgVUlOVDY0IGFyZzgpOworVUlOVDY0IGVmaV9jYWxsOSh2b2lkICpmdW5jLCBVSU5UNjQgYXJnMSwgVUlOVDY0IGFyZzIsIFVJTlQ2NCBhcmczLAorICAgICAgICAgICAgICAgICBVSU5UNjQgYXJnNCwgVUlOVDY0IGFyZzUsIFVJTlQ2NCBhcmc2LCBVSU5UNjQgYXJnNywKKyAgICAgICAgICAgICAgICAgVUlOVDY0IGFyZzgsIFVJTlQ2NCBhcmc5KTsKK1VJTlQ2NCBlZmlfY2FsbDEwKHZvaWQgKmZ1bmMsIFVJTlQ2NCBhcmcxLCBVSU5UNjQgYXJnMiwgVUlOVDY0IGFyZzMsCisgICAgICAgICAgICAgICAgICBVSU5UNjQgYXJnNCwgVUlOVDY0IGFyZzUsIFVJTlQ2NCBhcmc2LCBVSU5UNjQgYXJnNywKKyAgICAgICAgICAgICAgICAgIFVJTlQ2NCBhcmc4LCBVSU5UNjQgYXJnOSwgVUlOVDY0IGFyZzEwKTsKKworLyogRnJvbnQtZW5kcyB0byBlZmlfY2FsbFggdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyNkZWZpbmUgX2Nhc3Q2NF9lZmlfY2FsbDAoZikgXAorICBlZmlfY2FsbDAoZikKKyNkZWZpbmUgX2Nhc3Q2NF9lZmlfY2FsbDEoZixhMSkgXAorICBlZmlfY2FsbDEoZiwgKFVJTlQ2NCkoYTEpKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsMihmLGExLGEyKSBcCisgIGVmaV9jYWxsMihmLCAoVUlOVDY0KShhMSksIChVSU5UNjQpKGEyKSkKKyNkZWZpbmUgX2Nhc3Q2NF9lZmlfY2FsbDMoZixhMSxhMixhMykgXAorICBlZmlfY2FsbDMoZiwgKFVJTlQ2NCkoYTEpLCAoVUlOVDY0KShhMiksIChVSU5UNjQpKGEzKSkKKyNkZWZpbmUgX2Nhc3Q2NF9lZmlfY2FsbDQoZixhMSxhMixhMyxhNCkgXAorICBlZmlfY2FsbDQoZiwgKFVJTlQ2NCkoYTEpLCAoVUlOVDY0KShhMiksIChVSU5UNjQpKGEzKSwgKFVJTlQ2NCkoYTQpKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsNShmLGExLGEyLGEzLGE0LGE1KSBcCisgIGVmaV9jYWxsNShmLCAoVUlOVDY0KShhMSksIChVSU5UNjQpKGEyKSwgKFVJTlQ2NCkoYTMpLCAoVUlOVDY0KShhNCksIFwKKyAgICAgICAgICAgIChVSU5UNjQpKGE1KSkKKyNkZWZpbmUgX2Nhc3Q2NF9lZmlfY2FsbDYoZixhMSxhMixhMyxhNCxhNSxhNikgXAorICBlZmlfY2FsbDYoZiwgKFVJTlQ2NCkoYTEpLCAoVUlOVDY0KShhMiksIChVSU5UNjQpKGEzKSwgKFVJTlQ2NCkoYTQpLCBcCisgICAgICAgICAgICAoVUlOVDY0KShhNSksIChVSU5UNjQpKGE2KSkKKyNkZWZpbmUgX2Nhc3Q2NF9lZmlfY2FsbDcoZixhMSxhMixhMyxhNCxhNSxhNixhNykgXAorICBlZmlfY2FsbDcoZiwgKFVJTlQ2NCkoYTEpLCAoVUlOVDY0KShhMiksIChVSU5UNjQpKGEzKSwgKFVJTlQ2NCkoYTQpLCBcCisgICAgICAgICAgICAoVUlOVDY0KShhNSksIChVSU5UNjQpKGE2KSwgKFVJTlQ2NCkoYTcpKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsOChmLGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4KSBcCisgIGVmaV9jYWxsOChmLCAoVUlOVDY0KShhMSksIChVSU5UNjQpKGEyKSwgKFVJTlQ2NCkoYTMpLCAoVUlOVDY0KShhNCksIFwKKyAgICAgICAgICAgIChVSU5UNjQpKGE1KSwgKFVJTlQ2NCkoYTYpLCAoVUlOVDY0KShhNyksIChVSU5UNjQpKGE4KSkKKyNkZWZpbmUgX2Nhc3Q2NF9lZmlfY2FsbDkoZixhMSxhMixhMyxhNCxhNSxhNixhNyxhOCxhOSkgXAorICBlZmlfY2FsbDkoZiwgKFVJTlQ2NCkoYTEpLCAoVUlOVDY0KShhMiksIChVSU5UNjQpKGEzKSwgKFVJTlQ2NCkoYTQpLCBcCisgICAgICAgICAgICAoVUlOVDY0KShhNSksIChVSU5UNjQpKGE2KSwgKFVJTlQ2NCkoYTcpLCAoVUlOVDY0KShhOCksIFwKKyAgICAgICAgICAgIChVSU5UNjQpKGE5KSkKKyNkZWZpbmUgX2Nhc3Q2NF9lZmlfY2FsbDEwKGYsYTEsYTIsYTMsYTQsYTUsYTYsYTcsYTgsYTksYTEwKSBcCisgIGVmaV9jYWxsMTAoZiwgKFVJTlQ2NCkoYTEpLCAoVUlOVDY0KShhMiksIChVSU5UNjQpKGEzKSwgKFVJTlQ2NCkoYTQpLCBcCisgICAgICAgICAgICAgKFVJTlQ2NCkoYTUpLCAoVUlOVDY0KShhNiksIChVSU5UNjQpKGE3KSwgKFVJTlQ2NCkoYTgpLCBcCisgICAgICAgICAgICAgKFVJTlQ2NCkoYTkpLCAoVUlOVDY0KShhMTApKQorCisvKiBtYWluIHdyYXBwZXIgKHZhX251bSBpZ25vcmVkKSAqLworI2RlZmluZSB1ZWZpX2NhbGxfd3JhcHBlcihmdW5jLHZhX251bSwuLi4pICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX1ZBX0FSR19OU1VGRklYX18oX2Nhc3Q2NF9lZmlfY2FsbCwgX19WQV9BUkdTX18pIChmdW5jICwgIyNfX1ZBX0FSR1NfXykKKworI2VuZGlmCisjZGVmaW5lIEVGSV9GVU5DVElPTiBfX2F0dHJpYnV0ZV9fKChtc19hYmkpKQorCisjaWZkZWYgX01TQ19FWFRFTlNJT05TCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDczMSApICAvLyBTdXBwcmVzcyB3YXJuaW5ncyBhYm91dCBtb2RpZmljYXRpb24gb2YgRUJQCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lZmk2NC9pbmNsdWRlL2VmaS94ODZfNjQvZWZpbGlicGxhdC5oIGIvZWZpNjQvaW5jbHVkZS9lZmkveDg2XzY0L2VmaWxpYnBsYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQ0NTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvaW5jbHVkZS9lZmkveDg2XzY0L2VmaWxpYnBsYXQuaApAQCAtMCwwICsxLDI2IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlsaWJwbGF0LmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgdG8gY29tcGlsZSBiaW5kaW5ncworCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworVk9JRAorSW5pdGlhbGl6ZUxpYlBsYXRmb3JtICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgICBJTiBFRklfU1lTVEVNX1RBQkxFICAgICAqU3lzdGVtVGFibGUKKyAgICApOworCisgICAKZGlmZiAtLWdpdCBhL2VmaTY0L2luY2x1ZGUvZWZpL3g4Nl82NC9wZS5oIGIvZWZpNjQvaW5jbHVkZS9lZmkveDg2XzY0L3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5YjkzNgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2luY2x1ZGUvZWZpL3g4Nl82NC9wZS5oCkBAIC0wLDAgKzEsNTk1IEBACisvKiAKKyAgICBQRTMyKyBoZWFkZXIgZmlsZQorICovCisjaWZuZGVmIF9QRV9ICisjZGVmaW5lIF9QRV9ICisKKyNkZWZpbmUgSU1BR0VfRE9TX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgMHg1QTREICAgICAgLy8gTVoKKyNkZWZpbmUgSU1BR0VfT1MyX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgMHg0NTRFICAgICAgLy8gTkUKKyNkZWZpbmUgSU1BR0VfT1MyX1NJR05BVFVSRV9MRSAgICAgICAgICAgICAgMHg0NTRDICAgICAgLy8gTEUKKyNkZWZpbmUgSU1BR0VfTlRfU0lHTkFUVVJFICAgICAgICAgICAgICAgICAgMHgwMDAwNDU1MCAgLy8gUEUwMCAgCisjZGVmaW5lIElNQUdFX0VET1NfU0lHTkFUVVJFICAgICAgICAgICAgICAgIDB4NDQ0NTQ1NTAgIC8vIFBFRUQKKworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfRE9TX0hFQURFUiB7ICAgICAgLy8gRE9TIC5FWEUgaGVhZGVyCisgICAgVUlOVDE2ICAgZV9tYWdpYzsgICAgICAgICAgICAgICAgICAgICAvLyBNYWdpYyBudW1iZXIKKyAgICBVSU5UMTYgICBlX2NibHA7ICAgICAgICAgICAgICAgICAgICAgIC8vIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlCisgICAgVUlOVDE2ICAgZV9jcDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYWdlcyBpbiBmaWxlCisgICAgVUlOVDE2ICAgZV9jcmxjOyAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxvY2F0aW9ucworICAgIFVJTlQxNiAgIGVfY3BhcmhkcjsgICAgICAgICAgICAgICAgICAgLy8gU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocworICAgIFVJTlQxNiAgIGVfbWluYWxsb2M7ICAgICAgICAgICAgICAgICAgLy8gTWluaW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZAorICAgIFVJTlQxNiAgIGVfbWF4YWxsb2M7ICAgICAgICAgICAgICAgICAgLy8gTWF4aW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZAorICAgIFVJTlQxNiAgIGVfc3M7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCAocmVsYXRpdmUpIFNTIHZhbHVlCisgICAgVUlOVDE2ICAgZV9zcDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIFNQIHZhbHVlCisgICAgVUlOVDE2ICAgZV9jc3VtOyAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3N1bQorICAgIFVJTlQxNiAgIGVfaXA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBJUCB2YWx1ZQorICAgIFVJTlQxNiAgIGVfY3M7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCAocmVsYXRpdmUpIENTIHZhbHVlCisgICAgVUlOVDE2ICAgZV9sZmFybGM7ICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIGFkZHJlc3Mgb2YgcmVsb2NhdGlvbiB0YWJsZQorICAgIFVJTlQxNiAgIGVfb3ZubzsgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcmxheSBudW1iZXIKKyAgICBVSU5UMTYgICBlX3Jlc1s0XTsgICAgICAgICAgICAgICAgICAgIC8vIFJlc2VydmVkIHdvcmRzCisgICAgVUlOVDE2ICAgZV9vZW1pZDsgICAgICAgICAgICAgICAgICAgICAvLyBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbykKKyAgICBVSU5UMTYgICBlX29lbWluZm87ICAgICAgICAgICAgICAgICAgIC8vIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYworICAgIFVJTlQxNiAgIGVfcmVzMlsxMF07ICAgICAgICAgICAgICAgICAgLy8gUmVzZXJ2ZWQgd29yZHMKKyAgICBVSU5UMzIgICBlX2xmYW5ldzsgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgYWRkcmVzcyBvZiBuZXcgZXhlIGhlYWRlcgorICB9IElNQUdFX0RPU19IRUFERVIsICpQSU1BR0VfRE9TX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX09TMl9IRUFERVIgeyAgICAgIC8vIE9TLzIgLkVYRSBoZWFkZXIKKyAgICBVSU5UMTYgICBuZV9tYWdpYzsgICAgICAgICAgICAgICAgICAgIC8vIE1hZ2ljIG51bWJlcgorICAgIFVJTlQ4ICAgIG5lX3ZlcjsgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbiBudW1iZXIKKyAgICBVSU5UOCAgICBuZV9yZXY7ICAgICAgICAgICAgICAgICAgICAgIC8vIFJldmlzaW9uIG51bWJlcgorICAgIFVJTlQxNiAgIG5lX2VudHRhYjsgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIEVudHJ5IFRhYmxlCisgICAgVUlOVDE2ICAgbmVfY2JlbnR0YWI7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gRW50cnkgVGFibGUKKyAgICBVSU5UMzIgICBuZV9jcmM7ICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrc3VtIG9mIHdob2xlIGZpbGUKKyAgICBVSU5UMTYgICBuZV9mbGFnczsgICAgICAgICAgICAgICAgICAgIC8vIEZsYWcgVUlOVDE2CisgICAgVUlOVDE2ICAgbmVfYXV0b2RhdGE7ICAgICAgICAgICAgICAgICAvLyBBdXRvbWF0aWMgZGF0YSBzZWdtZW50IG51bWJlcgorICAgIFVJTlQxNiAgIG5lX2hlYXA7ICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBoZWFwIGFsbG9jYXRpb24KKyAgICBVSU5UMTYgICBuZV9zdGFjazsgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgc3RhY2sgYWxsb2NhdGlvbgorICAgIFVJTlQzMiAgIG5lX2NzaXA7ICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBDUzpJUCBzZXR0aW5nCisgICAgVUlOVDMyICAgbmVfc3NzcDsgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIFNTOlNQIHNldHRpbmcKKyAgICBVSU5UMTYgICBuZV9jc2VnOyAgICAgICAgICAgICAgICAgICAgIC8vIENvdW50IG9mIGZpbGUgc2VnbWVudHMKKyAgICBVSU5UMTYgICBuZV9jbW9kOyAgICAgICAgICAgICAgICAgICAgIC8vIEVudHJpZXMgaW4gTW9kdWxlIFJlZmVyZW5jZSBUYWJsZQorICAgIFVJTlQxNiAgIG5lX2NibnJlc3RhYjsgICAgICAgICAgICAgICAgLy8gU2l6ZSBvZiBub24tcmVzaWRlbnQgbmFtZSB0YWJsZQorICAgIFVJTlQxNiAgIG5lX3NlZ3RhYjsgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIFNlZ21lbnQgVGFibGUKKyAgICBVSU5UMTYgICBuZV9yc3JjdGFiOyAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBSZXNvdXJjZSBUYWJsZQorICAgIFVJTlQxNiAgIG5lX3Jlc3RhYjsgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIHJlc2lkZW50IG5hbWUgdGFibGUKKyAgICBVSU5UMTYgICBuZV9tb2R0YWI7ICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBNb2R1bGUgUmVmZXJlbmNlIFRhYmxlCisgICAgVUlOVDE2ICAgbmVfaW1wdGFiOyAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgSW1wb3J0ZWQgTmFtZXMgVGFibGUKKyAgICBVSU5UMzIgICBuZV9ucmVzdGFiOyAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBOb24tcmVzaWRlbnQgTmFtZXMgVGFibGUKKyAgICBVSU5UMTYgICBuZV9jbW92ZW50OyAgICAgICAgICAgICAgICAgIC8vIENvdW50IG9mIG1vdmFibGUgZW50cmllcworICAgIFVJTlQxNiAgIG5lX2FsaWduOyAgICAgICAgICAgICAgICAgICAgLy8gU2VnbWVudCBhbGlnbm1lbnQgc2hpZnQgY291bnQKKyAgICBVSU5UMTYgICBuZV9jcmVzOyAgICAgICAgICAgICAgICAgICAgIC8vIENvdW50IG9mIHJlc291cmNlIHNlZ21lbnRzCisgICAgVUlOVDggICAgbmVfZXhldHlwOyAgICAgICAgICAgICAgICAgICAvLyBUYXJnZXQgT3BlcmF0aW5nIHN5c3RlbQorICAgIFVJTlQ4ICAgIG5lX2ZsYWdzb3RoZXJzOyAgICAgICAgICAgICAgLy8gT3RoZXIgLkVYRSBmbGFncworICAgIFVJTlQxNiAgIG5lX3ByZXR0aHVua3M7ICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIHJldHVybiB0aHVua3MKKyAgICBVSU5UMTYgICBuZV9wc2VncmVmYnl0ZXM7ICAgICAgICAgICAgIC8vIG9mZnNldCB0byBzZWdtZW50IHJlZi4gYnl0ZXMKKyAgICBVSU5UMTYgICBuZV9zd2FwYXJlYTsgICAgICAgICAgICAgICAgIC8vIE1pbmltdW0gY29kZSBzd2FwIGFyZWEgc2l6ZQorICAgIFVJTlQxNiAgIG5lX2V4cHZlcjsgICAgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgV2luZG93cyB2ZXJzaW9uIG51bWJlcgorICB9IElNQUdFX09TMl9IRUFERVIsICpQSU1BR0VfT1MyX0hFQURFUjsKKworLy8KKy8vIEZpbGUgaGVhZGVyIGZvcm1hdC4KKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9GSUxFX0hFQURFUiB7CisgICAgVUlOVDE2ICAgTWFjaGluZTsKKyAgICBVSU5UMTYgICBOdW1iZXJPZlNlY3Rpb25zOworICAgIFVJTlQzMiAgIFRpbWVEYXRlU3RhbXA7CisgICAgVUlOVDMyICAgUG9pbnRlclRvU3ltYm9sVGFibGU7CisgICAgVUlOVDMyICAgTnVtYmVyT2ZTeW1ib2xzOworICAgIFVJTlQxNiAgIFNpemVPZk9wdGlvbmFsSGVhZGVyOworICAgIFVJTlQxNiAgIENoYXJhY3RlcmlzdGljczsKK30gSU1BR0VfRklMRV9IRUFERVIsICpQSU1BR0VfRklMRV9IRUFERVI7CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX0ZJTEVfSEVBREVSICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgSU1BR0VfRklMRV9SRUxPQ1NfU1RSSVBQRUQgICAgICAgICAgIDB4MDAwMSAgLy8gUmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9FWEVDVVRBQkxFX0lNQUdFICAgICAgICAgIDB4MDAwMiAgLy8gRmlsZSBpcyBleGVjdXRhYmxlICAoaS5lLiBubyB1bnJlc29sdmVkIGV4dGVybmVsIHJlZmVyZW5jZXMpLgorI2RlZmluZSBJTUFHRV9GSUxFX0xJTkVfTlVNU19TVFJJUFBFRCAgICAgICAgMHgwMDA0ICAvLyBMaW5lIG51bmJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlLgorI2RlZmluZSBJTUFHRV9GSUxFX0xPQ0FMX1NZTVNfU1RSSVBQRUQgICAgICAgMHgwMDA4ICAvLyBMb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9MTyAgICAgICAgIDB4MDA4MCAgLy8gQnl0ZXMgb2YgbWFjaGluZSB3b3JkIGFyZSByZXZlcnNlZC4KKyNkZWZpbmUgSU1BR0VfRklMRV8zMkJJVF9NQUNISU5FICAgICAgICAgICAgIDB4MDEwMCAgLy8gMzIgYml0IHdvcmQgbWFjaGluZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCAgICAgICAgICAgIDB4MDIwMCAgLy8gRGVidWdnaW5nIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlIGluIC5EQkcgZmlsZQorI2RlZmluZSBJTUFHRV9GSUxFX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvLyBTeXN0ZW0gRmlsZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9ETEwgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLy8gRmlsZSBpcyBhIERMTC4KKyNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9ISSAgICAgICAgIDB4ODAwMCAgLy8gQnl0ZXMgb2YgbWFjaGluZSB3b3JkIGFyZSByZXZlcnNlZC4KKworI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfVU5LTk9XTiAgICAgICAgICAgMAorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NiAgICAgICAgICAgICAgMHgxNGMgICAvLyBJbnRlbCAzODYuCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9SMzAwMCAgICAgICAgICAgICAweDE2MiAgIC8vIE1JUFMgbGl0dGxlLWVuZGlhbiwgMDU0MCBiaWctZW5kaWFuCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9SNDAwMCAgICAgICAgICAgICAweDE2NiAgIC8vIE1JUFMgbGl0dGxlLWVuZGlhbgorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfQUxQSEEgICAgICAgICAgICAgMHgxODQgICAvLyBBbHBoYV9BWFAKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0FSTVRIVU1CX01JWEVEICAgIDB4MWMyICAgLy8gQXJtL1RodW1iCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9QT1dFUlBDICAgICAgICAgICAweDFGMCAgIC8vIElCTSBQb3dlclBDIExpdHRsZS1FbmRpYW4KKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0lBNjQgICAgICAgICAgICAgIDB4MjAwICAgLy8gSUEtNjQKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1RBSE9FICAgICAgICAgICAgIDB4N2NjICAgLy8gSW50ZWwgRU0gbWFjaGluZQorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfRUJDICAgICAgICAgICAgICAgMHhlYmMgICAvLyBFRkkgQnl0ZSBDb2RlCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9YNjQgICAgICAgICAgICAgICAweDg2NjQgIC8vIHg4Nl82NAorLy8KKy8vIERpcmVjdG9yeSBmb3JtYXQuCisvLworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfREFUQV9ESVJFQ1RPUlkgeworICAgIFVJTlQzMiAgIFZpcnR1YWxBZGRyZXNzOworICAgIFVJTlQzMiAgIFNpemU7Cit9IElNQUdFX0RBVEFfRElSRUNUT1JZLCAqUElNQUdFX0RBVEFfRElSRUNUT1JZOworCisjZGVmaW5lIElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTICAgIDE2CisKKy8vCisvLyBPcHRpb25hbCBoZWFkZXIgZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX09QVElPTkFMX0hFQURFUiB7CisgICAgLy8KKyAgICAvLyBTdGFuZGFyZCBmaWVsZHMuCisgICAgLy8KKworICAgIFVJTlQxNiAgICBNYWdpYzsKKyAgICBVSU5UOCAgICAgTWFqb3JMaW5rZXJWZXJzaW9uOworICAgIFVJTlQ4ICAgICBNaW5vckxpbmtlclZlcnNpb247CisgICAgVUlOVDMyICAgIFNpemVPZkNvZGU7CisgICAgVUlOVDMyICAgIFNpemVPZkluaXRpYWxpemVkRGF0YTsKKyAgICBVSU5UMzIgICAgU2l6ZU9mVW5pbml0aWFsaXplZERhdGE7CisgICAgVUlOVDMyICAgIEFkZHJlc3NPZkVudHJ5UG9pbnQ7CisgICAgVUlOVDMyICAgIEJhc2VPZkNvZGU7CisgICAgVUlOVDMyICAgIEJhc2VPZkRhdGE7CisgICAgICAgICAgICAgICAgCisgICAgLy8KKyAgICAvLyBOVCBhZGRpdGlvbmFsIGZpZWxkcy4KKyAgICAvLworCisgICAgVUlOVDMyICAgSW1hZ2VCYXNlOworICAgIFVJTlQzMiAgIFNlY3Rpb25BbGlnbm1lbnQ7CisgICAgVUlOVDMyICAgRmlsZUFsaWdubWVudDsKKyAgICBVSU5UMTYgICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgICAgVUlOVDE2ICAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworICAgIFVJTlQxNiAgIE1ham9ySW1hZ2VWZXJzaW9uOworICAgIFVJTlQxNiAgIE1pbm9ySW1hZ2VWZXJzaW9uOworICAgIFVJTlQxNiAgIE1ham9yU3Vic3lzdGVtVmVyc2lvbjsKKyAgICBVSU5UMTYgICBNaW5vclN1YnN5c3RlbVZlcnNpb247CisgICAgVUlOVDMyICAgUmVzZXJ2ZWQxOworICAgIFVJTlQzMiAgIFNpemVPZkltYWdlOworICAgIFVJTlQzMiAgIFNpemVPZkhlYWRlcnM7CisgICAgVUlOVDMyICAgQ2hlY2tTdW07CisgICAgVUlOVDE2ICAgU3Vic3lzdGVtOworICAgIFVJTlQxNiAgIERsbENoYXJhY3RlcmlzdGljczsKKyAgICBVSU5UMzIgICBTaXplT2ZTdGFja1Jlc2VydmU7CisgICAgVUlOVDMyICAgU2l6ZU9mU3RhY2tDb21taXQ7CisgICAgVUlOVDMyICAgU2l6ZU9mSGVhcFJlc2VydmU7CisgICAgVUlOVDMyICAgU2l6ZU9mSGVhcENvbW1pdDsKKyAgICBVSU5UMzIgICBMb2FkZXJGbGFnczsKKyAgICBVSU5UMzIgICBOdW1iZXJPZlJ2YUFuZFNpemVzOworICAgIElNQUdFX0RBVEFfRElSRUNUT1JZIERhdGFEaXJlY3RvcnlbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdOworfSBJTUFHRV9PUFRJT05BTF9IRUFERVIsICpQSU1BR0VfT1BUSU9OQUxfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfUk9NX09QVElPTkFMX0hFQURFUiB7CisgICAgVUlOVDE2ICBNYWdpYzsKKyAgICBVSU5UOCAgIE1ham9yTGlua2VyVmVyc2lvbjsKKyAgICBVSU5UOCAgIE1pbm9yTGlua2VyVmVyc2lvbjsKKyAgICBVSU5UMzIgIFNpemVPZkNvZGU7CisgICAgVUlOVDMyICBTaXplT2ZJbml0aWFsaXplZERhdGE7CisgICAgVUlOVDMyICBTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsKKyAgICBVSU5UMzIgIEFkZHJlc3NPZkVudHJ5UG9pbnQ7CisgICAgVUlOVDMyICBCYXNlT2ZDb2RlOworICAgIFVJTlQzMiAgQmFzZU9mRGF0YTsKKyAgICBVSU5UMzIgIEJhc2VPZkJzczsKKyAgICBVSU5UMzIgIEdwck1hc2s7CisgICAgVUlOVDMyICBDcHJNYXNrWzRdOworICAgIFVJTlQzMiAgR3BWYWx1ZTsKK30gSU1BR0VfUk9NX09QVElPTkFMX0hFQURFUiwgKlBJTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9ST01fT1BUSU9OQUxfSEVBREVSICAgICAgNTYKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1NURF9PUFRJT05BTF9IRUFERVIgICAgICAyOAorI2RlZmluZSBJTUFHRV9TSVpFT0ZfTlRfT1BUSU9OQUxfSEVBREVSICAgICAgMjI0CisKKyNkZWZpbmUgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDICAgICAgICAweDEwYgorI2RlZmluZSBJTUFHRV9ST01fT1BUSU9OQUxfSERSX01BR0lDICAgICAgIDB4MTA3CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9OVF9IRUFERVJTIHsKKyAgICBVSU5UMzIgU2lnbmF0dXJlOworICAgIElNQUdFX0ZJTEVfSEVBREVSIEZpbGVIZWFkZXI7CisgICAgSU1BR0VfT1BUSU9OQUxfSEVBREVSIE9wdGlvbmFsSGVhZGVyOworfSBJTUFHRV9OVF9IRUFERVJTLCAqUElNQUdFX05UX0hFQURFUlM7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9ST01fSEVBREVSUyB7CisgICAgSU1BR0VfRklMRV9IRUFERVIgRmlsZUhlYWRlcjsKKyAgICBJTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSIE9wdGlvbmFsSGVhZGVyOworfSBJTUFHRV9ST01fSEVBREVSUywgKlBJTUFHRV9ST01fSEVBREVSUzsKKworI2RlZmluZSBJTUFHRV9GSVJTVF9TRUNUSU9OKCBudGhlYWRlciApICgoUElNQUdFX1NFQ1RJT05fSEVBREVSKSAgICAgICAgXAorICAgICgoVUlOVDMyKW50aGVhZGVyICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgRklFTERfT0ZGU0VUKCBJTUFHRV9OVF9IRUFERVJTLCBPcHRpb25hbEhlYWRlciApICsgICAgICAgICAgICAgICAgIFwKKyAgICAgKChQSU1BR0VfTlRfSEVBREVSUykobnRoZWFkZXIpKS0+RmlsZUhlYWRlci5TaXplT2ZPcHRpb25hbEhlYWRlciAgIFwKKyAgICApKQorCisKKy8vIFN1YnN5c3RlbSBWYWx1ZXMKKworI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fVU5LTk9XTiAgICAgICAgICAgICAgMCAgIC8vIFVua25vd24gc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fTkFUSVZFICAgICAgICAgICAgICAgMSAgIC8vIEltYWdlIGRvZXNuJ3QgcmVxdWlyZSBhIHN1YnN5c3RlbS4KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfR1VJICAgICAgICAgIDIgICAvLyBJbWFnZSBydW5zIGluIHRoZSBXaW5kb3dzIEdVSSBzdWJzeXN0ZW0uCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0NVSSAgICAgICAgICAzICAgLy8gSW1hZ2UgcnVucyBpbiB0aGUgV2luZG93cyBjaGFyYWN0ZXIgc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fT1MyX0NVSSAgICAgICAgICAgICAgNSAgIC8vIGltYWdlIHJ1bnMgaW4gdGhlIE9TLzIgY2hhcmFjdGVyIHN1YnN5c3RlbS4KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1BPU0lYX0NVSSAgICAgICAgICAgIDcgICAvLyBpbWFnZSBydW4gIGluIHRoZSBQb3NpeCBjaGFyYWN0ZXIgc3Vic3lzdGVtLgorCisKKy8vIERpcmVjdG9yeSBFbnRyaWVzCisKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0VYUE9SVCAgICAgICAgIDAgICAvLyBFeHBvcnQgRGlyZWN0b3J5CisjZGVmaW5lIElNQUdFX0RJUkVDVE9SWV9FTlRSWV9JTVBPUlQgICAgICAgICAxICAgLy8gSW1wb3J0IERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfUkVTT1VSQ0UgICAgICAgMiAgIC8vIFJlc291cmNlIERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfRVhDRVBUSU9OICAgICAgMyAgIC8vIEV4Y2VwdGlvbiBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX1NFQ1VSSVRZICAgICAgIDQgICAvLyBTZWN1cml0eSBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0JBU0VSRUxPQyAgICAgIDUgICAvLyBCYXNlIFJlbG9jYXRpb24gVGFibGUKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0RFQlVHICAgICAgICAgIDYgICAvLyBEZWJ1ZyBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0NPUFlSSUdIVCAgICAgIDcgICAvLyBEZXNjcmlwdGlvbiBTdHJpbmcKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0dMT0JBTFBUUiAgICAgIDggICAvLyBNYWNoaW5lIFZhbHVlIChNSVBTIEdQKQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfVExTICAgICAgICAgICAgOSAgIC8vIFRMUyBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0xPQURfQ09ORklHICAgMTAgICAvLyBMb2FkIENvbmZpZ3VyYXRpb24gRGlyZWN0b3J5CisKKy8vCisvLyBTZWN0aW9uIGhlYWRlciBmb3JtYXQuCisvLworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9TSE9SVF9OQU1FICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9TRUNUSU9OX0hFQURFUiB7CisgICAgVUlOVDggICBOYW1lW0lNQUdFX1NJWkVPRl9TSE9SVF9OQU1FXTsKKyAgICB1bmlvbiB7CisgICAgICAgICAgICBVSU5UMzIgICBQaHlzaWNhbEFkZHJlc3M7CisgICAgICAgICAgICBVSU5UMzIgICBWaXJ0dWFsU2l6ZTsKKyAgICB9IE1pc2M7CisgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7CisgICAgVUlOVDMyICAgU2l6ZU9mUmF3RGF0YTsKKyAgICBVSU5UMzIgICBQb2ludGVyVG9SYXdEYXRhOworICAgIFVJTlQzMiAgIFBvaW50ZXJUb1JlbG9jYXRpb25zOworICAgIFVJTlQzMiAgIFBvaW50ZXJUb0xpbmVudW1iZXJzOworICAgIFVJTlQxNiAgIE51bWJlck9mUmVsb2NhdGlvbnM7CisgICAgVUlOVDE2ICAgTnVtYmVyT2ZMaW5lbnVtYmVyczsKKyAgICBVSU5UMzIgICBDaGFyYWN0ZXJpc3RpY3M7Cit9IElNQUdFX1NFQ1RJT05fSEVBREVSLCAqUElNQUdFX1NFQ1RJT05fSEVBREVSOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9TRUNUSU9OX0hFQURFUiAgICAgICAgICA0MAorCisjZGVmaW5lIElNQUdFX1NDTl9UWVBFX05PX1BBRCAgICAgICAgICAgICAgICAweDAwMDAwMDA4ICAvLyBSZXNlcnZlZC4KKworI2RlZmluZSBJTUFHRV9TQ05fQ05UX0NPREUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgLy8gU2VjdGlvbiBjb250YWlucyBjb2RlLgorI2RlZmluZSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgICAgICAgMHgwMDAwMDA0MCAgLy8gU2VjdGlvbiBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLgorI2RlZmluZSBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSAgICAgMHgwMDAwMDA4MCAgLy8gU2VjdGlvbiBjb250YWlucyB1bmluaXRpYWxpemVkIGRhdGEuCisKKyNkZWZpbmUgSU1BR0VfU0NOX0xOS19PVEhFUiAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8vIFJlc2VydmVkLgorI2RlZmluZSBJTUFHRV9TQ05fTE5LX0lORk8gICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgLy8gU2VjdGlvbiBjb250YWlucyBjb21tZW50cyBvciBzb21lIG90aGVyIHR5cGUgb2YgaW5mb3JtYXRpb24uCisjZGVmaW5lIElNQUdFX1NDTl9MTktfUkVNT1ZFICAgICAgICAgICAgICAgICAweDAwMDAwODAwICAvLyBTZWN0aW9uIGNvbnRlbnRzIHdpbGwgbm90IGJlY29tZSBwYXJ0IG9mIGltYWdlLgorI2RlZmluZSBJTUFHRV9TQ05fTE5LX0NPTURBVCAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAgLy8gU2VjdGlvbiBjb250ZW50cyBjb21kYXQuCisKKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl8yQllURVMgICAgICAgICAgICAgICAweDAwMjAwMDAwICAvLworI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNEJZVEVTICAgICAgICAgICAgICAgMHgwMDMwMDAwMCAgLy8KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyAgICAgICAgICAgICAgIDB4MDA0MDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTICAgICAgICAgICAgICAweDAwNTAwMDAwICAvLyBEZWZhdWx0IGFsaWdubWVudCBpZiBubyBvdGhlcnMgYXJlIHNwZWNpZmllZC4KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzMyQllURVMgICAgICAgICAgICAgIDB4MDA2MDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl82NEJZVEVTICAgICAgICAgICAgICAweDAwNzAwMDAwICAvLworCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUgICAgICAgICAgICAweDAyMDAwMDAwICAvLyBTZWN0aW9uIGNhbiBiZSBkaXNjYXJkZWQuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCAgICAgICAgICAgICAweDA0MDAwMDAwICAvLyBTZWN0aW9uIGlzIG5vdCBjYWNoYWJsZS4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgICAgICAgICAgICAgIDB4MDgwMDAwMDAgIC8vIFNlY3Rpb24gaXMgbm90IHBhZ2VhYmxlLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX1NIQVJFRCAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMCAgLy8gU2VjdGlvbiBpcyBzaGFyZWFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fRVhFQ1VURSAgICAgICAgICAgICAgICAweDIwMDAwMDAwICAvLyBTZWN0aW9uIGlzIGV4ZWN1dGFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fUkVBRCAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwICAvLyBTZWN0aW9uIGlzIHJlYWRhYmxlLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX1dSSVRFICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgLy8gU2VjdGlvbiBpcyB3cml0ZWFibGUuCisKKy8vCisvLyBTeW1ib2wgZm9ybWF0LgorLy8KKworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9TWU1CT0wgICAgICAgICAgICAgICAgICAxOAorCisvLworLy8gU2VjdGlvbiB2YWx1ZXMuCisvLworLy8gU3ltYm9scyBoYXZlIGEgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhleSBhcmUKKy8vIGRlZmluZWQuIE90aGVyd2lzZSwgc2VjdGlvbiBudW1iZXJzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX1VOREVGSU5FRCAgICAgICAgICAgKFVJTlQxNikwICAgICAgICAgICAvLyBTeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGlzIGNvbW1vbi4KKyNkZWZpbmUgSU1BR0VfU1lNX0FCU09MVVRFICAgICAgICAgICAgKFVJTlQxNiktMSAgICAgICAgICAvLyBTeW1ib2wgaXMgYW4gYWJzb2x1dGUgdmFsdWUuCisjZGVmaW5lIElNQUdFX1NZTV9ERUJVRyAgICAgICAgICAgICAgIChVSU5UMTYpLTIgICAgICAgICAgLy8gU3ltYm9sIGlzIGEgc3BlY2lhbCBkZWJ1ZyBpdGVtLgorCisvLworLy8gVHlwZSAoZnVuZGFtZW50YWwpIHZhbHVlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfTlVMTCAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIC8vIG5vIHR5cGUuCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1ZPSUQgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9DSEFSICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgLy8gdHlwZSBjaGFyYWN0ZXIuCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1NIT1JUICAgICAgICAgICAgICAgICAzICAgICAgICAgICAvLyB0eXBlIHNob3J0IGludGVnZXIuCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0lOVCAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9MT05HICAgICAgICAgICAgICAgICAgNSAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRkxPQVQgICAgICAgICAgICAgICAgIDYgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0RPVUJMRSAgICAgICAgICAgICAgICA3ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9TVFJVQ1QgICAgICAgICAgICAgICAgOCAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfVU5JT04gICAgICAgICAgICAgICAgIDkgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0VOVU0gICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAvLyBlbnVtZXJhdGlvbi4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfTU9FICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgIC8vIG1lbWJlciBvZiBlbnVtZXJhdGlvbi4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfQllURSAgICAgICAgICAgICAgICAgIDEyICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1dPUkQgICAgICAgICAgICAgICAgICAxMyAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9VSU5UICAgICAgICAgICAgICAgICAgMTQgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRFdPUkQgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgIC8vCisKKy8vCisvLyBUeXBlIChkZXJpdmVkKSB2YWx1ZXMuCisvLworCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9OVUxMICAgICAgICAgICAgICAgICAwICAgICAgICAgICAvLyBubyBkZXJpdmVkIHR5cGUuCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9QT0lOVEVSICAgICAgICAgICAgICAxICAgICAgICAgICAvLyBwb2ludGVyLgorI2RlZmluZSBJTUFHRV9TWU1fRFRZUEVfRlVOQ1RJT04gICAgICAgICAgICAgMiAgICAgICAgICAgLy8gZnVuY3Rpb24uCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9BUlJBWSAgICAgICAgICAgICAgICAzICAgICAgICAgICAvLyBhcnJheS4KKworLy8KKy8vIFN0b3JhZ2UgY2xhc3Nlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0VORF9PRl9GVU5DVElPTiAgICAgIChCWVRFICktMQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTlVMTCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfQVVUT01BVElDICAgICAgICAgICAgMQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUwgICAgICAgICAgICAgMgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfU1RBVElDICAgICAgICAgICAgICAgMworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfUkVHSVNURVIgICAgICAgICAgICAgNAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUxfREVGICAgICAgICAgNQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTEFCRUwgICAgICAgICAgICAgICAgNgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfVU5ERUZJTkVEX0xBQkVMICAgICAgNworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX1NUUlVDVCAgICAgOAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfQVJHVU1FTlQgICAgICAgICAgICAgOQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfU1RSVUNUX1RBRyAgICAgICAgICAgMTAKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX01FTUJFUl9PRl9VTklPTiAgICAgIDExCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19VTklPTl9UQUcgICAgICAgICAgICAxMgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfVFlQRV9ERUZJTklUSU9OICAgICAgMTMKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1VOREVGSU5FRF9TVEFUSUMgICAgIDE0CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19FTlVNX1RBRyAgICAgICAgICAgICAxNQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX0VOVU0gICAgICAgMTYKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1JFR0lTVEVSX1BBUkFNICAgICAgIDE3CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19CSVRfRklFTEQgICAgICAgICAgICAxOAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfQkxPQ0sgICAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19GVU5DVElPTiAgICAgICAgICAgICAxMDEKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0VORF9PRl9TVFJVQ1QgICAgICAgIDEwMgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRklMRSAgICAgICAgICAgICAgICAgMTAzCisvLyBuZXcKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1NFQ1RJT04gICAgICAgICAgICAgIDEwNAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfV0VBS19FWFRFUk5BTCAgICAgICAgMTA1CisKKy8vIHR5cGUgcGFja2luZyBjb25zdGFudHMKKworI2RlZmluZSBOX0JUTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTcKKyNkZWZpbmUgTl9UTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDYwCisjZGVmaW5lIE5fVE1BU0sxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAzMDAKKyNkZWZpbmUgTl9UTUFTSzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDM2MAorI2RlZmluZSBOX0JUU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5fVFNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworLy8gTUFDUk9TCisKKy8vCisvLyBDb21tdW5hbCBzZWxlY3Rpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTICAgMQorI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWSAgICAgICAgICAgIDIKKyNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkUgICAgICAzCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0ggICAgNAorI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFICAgIDUKKworI2RlZmluZSBJTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfTk9MSUJSQVJZIDEKKyNkZWZpbmUgSU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX0xJQlJBUlkgICAyCisjZGVmaW5lIElNQUdFX1dFQUtfRVhURVJOX1NFQVJDSF9BTElBUyAgICAgMworCisKKy8vCisvLyBSZWxvY2F0aW9uIGZvcm1hdC4KKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9SRUxPQ0FUSU9OIHsKKyAgICBVSU5UMzIgICBWaXJ0dWFsQWRkcmVzczsKKyAgICBVSU5UMzIgICBTeW1ib2xUYWJsZUluZGV4OworICAgIFVJTlQxNiAgICBUeXBlOworfSBJTUFHRV9SRUxPQ0FUSU9OOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9SRUxPQ0FUSU9OICAgICAgICAgICAgICAxMAorCisvLworLy8gSTM4NiByZWxvY2F0aW9uIHR5cGVzLgorLy8KKworI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9BQlNPTFVURSAgICAgICAgICAgICAgMCAgICAgICAgICAgLy8gUmVmZXJlbmNlIGlzIGFic29sdXRlLCBubyByZWxvY2F0aW9uIGlzIG5lY2Vzc2FyeQorI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9ESVIxNiAgICAgICAgICAgICAgICAgMDEgICAgICAgICAgLy8gRGlyZWN0IDE2LWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X1JFTDE2ICAgICAgICAgICAgICAgICAwMiAgICAgICAgICAvLyBQQy1yZWxhdGl2ZSAxNi1iaXQgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2xzIHZpcnR1YWwgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9ESVIzMiAgICAgICAgICAgICAgICAgMDYgICAgICAgICAgLy8gRGlyZWN0IDMyLWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0RJUjMyTkIgICAgICAgICAgICAgICAwNyAgICAgICAgICAvLyBEaXJlY3QgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MsIGJhc2Ugbm90IGluY2x1ZGVkCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X1NFRzEyICAgICAgICAgICAgICAgICAwMTEgICAgICAgICAvLyBEaXJlY3QgMTYtYml0IHJlZmVyZW5jZSB0byB0aGUgc2VnbWVudC1zZWxlY3RvciBiaXRzIG9mIGEgMzItYml0IHZpcnR1YWwgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9TRUNUSU9OICAgICAgICAgICAgICAgMDEyCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X1NFQ1JFTCAgICAgICAgICAgICAgICAwMTMKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfUkVMMzIgICAgICAgICAgICAgICAgIDAyNCAgICAgICAgIC8vIFBDLXJlbGF0aXZlIDMyLWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisKKy8vCisvLyBNSVBTIHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX0FCU09MVVRFICAgICAgICAgICAgICAwICAgICAgICAgICAvLyBSZWZlcmVuY2UgaXMgYWJzb2x1dGUsIG5vIHJlbG9jYXRpb24gaXMgbmVjZXNzYXJ5CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRkhBTEYgICAgICAgICAgICAgICAwMQorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19SRUZXT1JEICAgICAgICAgICAgICAgMDIKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfSk1QQUREUiAgICAgICAgICAgICAgIDAzCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRkhJICAgICAgICAgICAgICAgICAwNAorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19SRUZMTyAgICAgICAgICAgICAgICAgMDUKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfR1BSRUwgICAgICAgICAgICAgICAgIDA2CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX0xJVEVSQUwgICAgICAgICAgICAgICAwNworI2RlZmluZSBJTUFHRV9SRUxfTUlQU19TRUNUSU9OICAgICAgICAgICAgICAgMDEyCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1NFQ1JFTCAgICAgICAgICAgICAgICAwMTMKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfUkVGV09SRE5CICAgICAgICAgICAgIDA0MgorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19QQUlSICAgICAgICAgICAgICAgICAgMDQ1CisKKy8vCisvLyBBbHBoYSBSZWxvY2F0aW9uIHR5cGVzLgorLy8KKworI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfQUJTT0xVVEUgICAgICAgICAgICAgMHgwCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9SRUZMT05HICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRlFVQUQgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfR1BSRUwzMiAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9MSVRFUkFMICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0xJVFVTRSAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfR1BESVNQICAgICAgICAgICAgICAgMHg2CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9CUkFERFIgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0hJTlQgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfSU5MSU5FX1JFRkxPTkcgICAgICAgMHg5CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9SRUZISSAgICAgICAgICAgICAgICAweEEKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkxPICAgICAgICAgICAgICAgIDB4QgorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfUEFJUiAgICAgICAgICAgICAgICAgMHhDCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9NQVRDSCAgICAgICAgICAgICAgICAweEQKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1NFQ1RJT04gICAgICAgICAgICAgIDB4RQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfU0VDUkVMICAgICAgICAgICAgICAgMHhGCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9SRUZMT05HTkIgICAgICAgICAgICAweDEwCisKKy8vCisvLyBJQk0gUG93ZXJQQyByZWxvY2F0aW9uIHR5cGVzLgorLy8KKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FCU09MVVRFIDB4MDAwMCAgLy8gTk9QCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjY0ICAgMHgwMDAxICAvLyA2NC1iaXQgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIzMiAgIDB4MDAwMiAgLy8gMzItYml0IGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMjQgICAweDAwMDMgIC8vIDI2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIGFic29sdXRlKQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNiAgIDB4MDAwNCAgLy8gMTYtYml0IGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMTQgICAweDAwMDUgIC8vIDE2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFTDI0ICAgIDB4MDAwNiAgLy8gMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUwxNCAgICAweDAwMDcgIC8vIDE2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChiciBjb25kIHJlbGF0aXZlKQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2IDB4MDAwOCAgLy8gMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgMHgwMDA5ICAvLyAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpCisKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMzJOQiAweDAwMEEgIC8vIDMyLWJpdCBhZGRyIHcvbyBpbWFnZSBiYXNlCisjZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDUkVMICAgMHgwMDBCICAvLyB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGFzIGluIGFuIGltYWdlIHNlY3Rpb25oZHIpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDVElPTiAgMHgwMDBDICAvLyBzZWN0aW9uaGVhZGVyIG51bWJlcgorI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lGR0xVRSAgIDB4MDAwRCAgLy8gc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lNR0xVRSAgIDB4MDAwRSAgLy8gc3ltYm9sIGlzIGdsdWUgY29kZTsgdmlydHVhbCBhZGRyZXNzIGlzIFRPQyByZXN0b3JlIGluc3RydWN0aW9uCisKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyAweDAwRkYgIC8vIG1hc2sgdG8gaXNvbGF0ZSBhYm92ZSB2YWx1ZXMgaW4gSU1BR0VfUkVMT0NBVElPTi5UeXBlCisKKy8vIEZsYWcgYml0cyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlRZUEUKKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX05FRyAgICAgIDB4MDEwMCAgLy8gc3VidHJhY3QgcmVsb2MgdmFsdWUgcmF0aGVyIHRoYW4gYWRkaW5nIGl0CisjZGVmaW5lIElNQUdFX1JFTF9QUENfQlJUQUtFTiAgMHgwMjAwICAvLyBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIHRha2VuCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gMHgwNDAwICAvLyBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIG5vdCB0YWtlbgorI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gIDB4MDgwMCAgLy8gdG9jIHNsb3QgZGVmaW5lZCBpbiBmaWxlIChvciwgZGF0YSBpbiB0b2MpCisKKy8vCisvLyBCYXNlZCByZWxvY2F0aW9uIGZvcm1hdC4KKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9CQVNFX1JFTE9DQVRJT04geworICAgIFVJTlQzMiAgIFZpcnR1YWxBZGRyZXNzOworICAgIFVJTlQzMiAgIFNpemVPZkJsb2NrOworLy8gIFVJTlQxNiAgICBUeXBlT2Zmc2V0WzFdOworfSBJTUFHRV9CQVNFX1JFTE9DQVRJT04sICpQSU1BR0VfQkFTRV9SRUxPQ0FUSU9OOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9CQVNFX1JFTE9DQVRJT04gICAgICAgICA4CisKKy8vCisvLyBCYXNlZCByZWxvY2F0aW9uIHR5cGVzLgorLy8KKworI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfQUJTT0xVVEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0hJR0ggICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9MT1cgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSExPVyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0hJR0hBREogICAgICAgICAgICAgICA0CisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9NSVBTX0pNUEFERFIgICAgICAgICAgNQorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSUE2NF9JTU02NCAgICAgICAgICAgIDkKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0RJUjY0ICAgICAgICAgICAgICAgICAxMAorCisvLworLy8gTGluZSBudW1iZXIgZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0xJTkVOVU1CRVIgeworICAgIHVuaW9uIHsKKyAgICAgICAgVUlOVDMyICAgU3ltYm9sVGFibGVJbmRleDsgICAgICAgICAgICAgICAvLyBTeW1ib2wgdGFibGUgaW5kZXggb2YgZnVuY3Rpb24gbmFtZSBpZiBMaW5lbnVtYmVyIGlzIDAuCisgICAgICAgIFVJTlQzMiAgIFZpcnR1YWxBZGRyZXNzOyAgICAgICAgICAgICAgICAgLy8gVmlydHVhbCBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyLgorICAgIH0gVHlwZTsKKyAgICBVSU5UMTYgICAgTGluZW51bWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGluZSBudW1iZXIuCit9IElNQUdFX0xJTkVOVU1CRVI7CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX0xJTkVOVU1CRVIgICAgICAgICAgICAgIDYKKworLy8KKy8vIEFyY2hpdmUgZm9ybWF0LgorLy8KKworI2RlZmluZSBJTUFHRV9BUkNISVZFX1NUQVJUX1NJWkUgICAgICAgICAgICAgOAorI2RlZmluZSBJTUFHRV9BUkNISVZFX1NUQVJUICAgICAgICAgICAgICAgICAgIiE8YXJjaD5cbiIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9FTkQgICAgICAgICAgICAgICAgICAgICJgXG4iCisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfUEFEICAgICAgICAgICAgICAgICAgICAiXG4iCisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfTElOS0VSX01FTUJFUiAgICAgICAgICAiLyAgICAgICAgICAgICAgICIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9MT05HTkFNRVNfTUVNQkVSICAgICAgICIvLyAgICAgICAgICAgICAgIgorCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfQVJDSElWRV9NRU1CRVJfSEVBREVSIHsKKyAgICBVSU5UOCAgICAgTmFtZVsxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBuYW1lIC0gYC8nIHRlcm1pbmF0ZWQuCisgICAgVUlOVDggICAgIERhdGVbMTJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBtZW1iZXIgZGF0ZSAtIGRlY2ltYWwuCisgICAgVUlOVDggICAgIFVzZXJJRFs2XTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBtZW1iZXIgdXNlciBpZCAtIGRlY2ltYWwuCisgICAgVUlOVDggICAgIEdyb3VwSURbNl07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBtZW1iZXIgZ3JvdXAgaWQgLSBkZWNpbWFsLgorICAgIFVJTlQ4ICAgICBNb2RlWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbWVtYmVyIG1vZGUgLSBvY3RhbC4KKyAgICBVSU5UOCAgICAgU2l6ZVsxMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBzaXplIC0gZGVjaW1hbC4KKyAgICBVSU5UOCAgICAgRW5kSGVhZGVyWzJdOyAgICAgICAgICAgICAgICAgICAgICAvLyBTdHJpbmcgdG8gZW5kIGhlYWRlci4KK30gSU1BR0VfQVJDSElWRV9NRU1CRVJfSEVBREVSLCAqUElNQUdFX0FSQ0hJVkVfTUVNQkVSX0hFQURFUjsKKworI2RlZmluZSBJTUFHRV9TSVpFT0ZfQVJDSElWRV9NRU1CRVJfSERSICAgICAgNjAKKworLy8KKy8vIERMTCBzdXBwb3J0LgorLy8KKworLy8KKy8vIEV4cG9ydCBGb3JtYXQKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9FWFBPUlRfRElSRUNUT1JZIHsKKyAgICBVSU5UMzIgICBDaGFyYWN0ZXJpc3RpY3M7CisgICAgVUlOVDMyICAgVGltZURhdGVTdGFtcDsKKyAgICBVSU5UMTYgICBNYWpvclZlcnNpb247CisgICAgVUlOVDE2ICAgTWlub3JWZXJzaW9uOworICAgIFVJTlQzMiAgIE5hbWU7CisgICAgVUlOVDMyICAgQmFzZTsKKyAgICBVSU5UMzIgICBOdW1iZXJPZkZ1bmN0aW9uczsKKyAgICBVSU5UMzIgICBOdW1iZXJPZk5hbWVzOworICAgIFVJTlQzMiAgICpBZGRyZXNzT2ZGdW5jdGlvbnM7CisgICAgVUlOVDMyICAgKkFkZHJlc3NPZk5hbWVzOworICAgIFVJTlQzMiAgICpBZGRyZXNzT2ZOYW1lT3JkaW5hbHM7Cit9IElNQUdFX0VYUE9SVF9ESVJFQ1RPUlksICpQSU1BR0VfRVhQT1JUX0RJUkVDVE9SWTsKKworLy8KKy8vIEltcG9ydCBGb3JtYXQKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9JTVBPUlRfQllfTkFNRSB7CisgICAgVUlOVDE2ICAgIEhpbnQ7CisgICAgVUlOVDggICAgIE5hbWVbMV07Cit9IElNQUdFX0lNUE9SVF9CWV9OQU1FLCAqUElNQUdFX0lNUE9SVF9CWV9OQU1FOworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfVEhVTktfREFUQSB7CisgICAgdW5pb24geworICAgICAgICBVSU5UMzIgRnVuY3Rpb247CisgICAgICAgIFVJTlQzMiBPcmRpbmFsOworICAgICAgICBQSU1BR0VfSU1QT1JUX0JZX05BTUUgQWRkcmVzc09mRGF0YTsKKyAgICB9IHUxOworfSBJTUFHRV9USFVOS19EQVRBLCAqUElNQUdFX1RIVU5LX0RBVEE7CisKKyNkZWZpbmUgSU1BR0VfT1JESU5BTF9GTEFHIDB4ODAwMDAwMDAKKyNkZWZpbmUgSU1BR0VfU05BUF9CWV9PUkRJTkFMKE9yZGluYWwpICgoT3JkaW5hbCAmIElNQUdFX09SRElOQUxfRkxBRykgIT0gMCkKKyNkZWZpbmUgSU1BR0VfT1JESU5BTChPcmRpbmFsKSAoT3JkaW5hbCAmIDB4ZmZmZikKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0lNUE9SVF9ERVNDUklQVE9SIHsKKyAgICBVSU5UMzIgICBDaGFyYWN0ZXJpc3RpY3M7CisgICAgVUlOVDMyICAgVGltZURhdGVTdGFtcDsKKyAgICBVSU5UMzIgICBGb3J3YXJkZXJDaGFpbjsKKyAgICBVSU5UMzIgICBOYW1lOworICAgIFBJTUFHRV9USFVOS19EQVRBIEZpcnN0VGh1bms7Cit9IElNQUdFX0lNUE9SVF9ERVNDUklQVE9SLCAqUElNQUdFX0lNUE9SVF9ERVNDUklQVE9SOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2VmaTY0L2xpYi9jcnQwLWVmaS14ODZfNjQubyBiL2VmaTY0L2xpYi9jcnQwLWVmaS14ODZfNjQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTEwZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvbGliL2NydDAtZWZpLXg4Nl82NC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2VmaTY0L2xpYi9lbGZfeDg2XzY0X2VmaS5sZHMgYi9lZmk2NC9saWIvZWxmX3g4Nl82NF9lZmkubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZGYwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9saWIvZWxmX3g4Nl82NF9lZmkubGRzCkBAIC0wLDAgKzEsNjUgQEAKKy8qIFNhbWUgYXMgZWxmX3g4Nl82NF9mYnNkX2VmaS5sZHMsIGV4Y2VwdCBmb3IgT1VUUFVUX0ZPUk1BVCBiZWxvdyAtIEtFRVAgSU4gU1lOQyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAuID0gMDsKKyAgSW1hZ2VCYXNlID0gLjsKKyAgLmhhc2ggOiB7ICooLmhhc2gpIH0JLyogdGhpcyBNVVNUIGNvbWUgZmlyc3QhICovCisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmVoX2ZyYW1lIDogCisgIHsgCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAudGV4dCA6CisgIHsKKyAgICooLnRleHQpCisgICAqKC50ZXh0LiopCisgICAqKC5nbnUubGlua29uY2UudC4qKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnJlbG9jIDoKKyAgeworICAgKigucmVsb2MpCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZGF0YSA6CisgIHsKKyAgICooLnJvZGF0YSopCisgICAqKC5nb3QucGx0KQorICAgKiguZ290KQorICAgKiguZGF0YSopCisgICAqKC5zZGF0YSkKKyAgIC8qIHRoZSBFRkkgbG9hZGVyIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIGEgLmJzcyBzZWN0aW9uLCBzbyB3ZSBzdGljaworICAgICAgaXQgYWxsIGludG8gLmRhdGE6ICovCisgICAqKC5zYnNzKQorICAgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgKigucmVsLmxvY2FsKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmR5bmFtaWMgIDogeyAqKC5keW5hbWljKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnJlbGEgOgorICB7CisgICAgKigucmVsYS5kYXRhKikKKyAgICAqKC5yZWxhLmdvdCkKKyAgICAqKC5yZWxhLnN0YWIpCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZHluc3ltICAgOiB7ICooLmR5bnN5bSkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5keW5zdHIgICA6IHsgKiguZHluc3RyKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmlnbm9yZWQucmVsb2MgOgorICB7CisgICAgKigucmVsYS5yZWxvYykKKyAgICAqKC5laF9mcmFtZSkKKyAgICAqKC5ub3RlLkdOVS1zdGFjaykKKyAgfQorICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Cit9CmRpZmYgLS1naXQgYS9lZmk2NC9saWIvbGliZWZpLmEgYi9lZmk2NC9saWIvbGliZWZpLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjYzI2MAotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2xpYi9saWJlZmkuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9saWIvbGliZ251ZWZpLmEgYi9lZmk2NC9saWIvbGliZ251ZWZpLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmN2RiZgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L2xpYi9saWJnbnVlZmkuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvYWx0bWJyLmJpbiBiL2VmaTY0L21ici9hbHRtYnIuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjAwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9tYnIvYWx0bWJyLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvYWx0bWJyX2MuYmluIGIvZWZpNjQvbWJyL2FsdG1icl9jLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDUzMjQzCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvbWJyL2FsdG1icl9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvYWx0bWJyX2YuYmluIGIvZWZpNjQvbWJyL2FsdG1icl9mLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM3OTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvbWJyL2FsdG1icl9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvZ3B0bWJyLmJpbiBiL2VmaTY0L21ici9ncHRtYnIuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzgxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9tYnIvZ3B0bWJyLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvZ3B0bWJyX2MuYmluIGIvZWZpNjQvbWJyL2dwdG1icl9jLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzU3Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvbWJyL2dwdG1icl9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvZ3B0bWJyX2YuYmluIGIvZWZpNjQvbWJyL2dwdG1icl9mLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzI2NjZmCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvbWJyL2dwdG1icl9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvaXNvaGRwZnguYmluIGIvZWZpNjQvbWJyL2lzb2hkcGZ4LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTM3MTczCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvbWJyL2lzb2hkcGZ4LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvaXNvaGRwZnhfYy5iaW4gYi9lZmk2NC9tYnIvaXNvaGRwZnhfYy5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjMjI5NQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L21ici9pc29oZHBmeF9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvaXNvaGRwZnhfZi5iaW4gYi9lZmk2NC9tYnIvaXNvaGRwZnhfZi5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5NGFjYQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L21ici9pc29oZHBmeF9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvaXNvaGRwcHguYmluIGIvZWZpNjQvbWJyL2lzb2hkcHB4LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA2M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvbWJyL2lzb2hkcHB4LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvaXNvaGRwcHhfYy5iaW4gYi9lZmk2NC9tYnIvaXNvaGRwcHhfYy5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlNzVkMQotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L21ici9pc29oZHBweF9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvaXNvaGRwcHhfZi5iaW4gYi9lZmk2NC9tYnIvaXNvaGRwcHhfZi5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZGNkMwotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L21ici9pc29oZHBweF9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvbWJyLmJpbiBiL2VmaTY0L21ici9tYnIuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmE2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC9tYnIvbWJyLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvbWJyX2MuYmluIGIvZWZpNjQvbWJyL21icl9jLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmE4NGFjCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvbWJyL21icl9jLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9tYnIvbWJyX2YuYmluIGIvZWZpNjQvbWJyL21icl9mLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGUzNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvbWJyL21icl9mLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC9zYW1wbGUvc3lzbG9nby5sc3MgYi9lZmk2NC9zYW1wbGUvc3lzbG9nby5sc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5MzA3NgotLS0gL2Rldi9udWxsCisrKyBiL2VmaTY0L3NhbXBsZS9zeXNsb2dvLmxzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lZmk2NC90eHQvaHRtbC9pc29saW51eC5odG1sIGIvZWZpNjQvdHh0L2h0bWwvaXNvbGludXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2E5ZTRlCi0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvdHh0L2h0bWwvaXNvbGludXguaHRtbApAQCAtMCwwICsxLDg4MSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPg0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iYXBwbGljYXRpb24veGh0bWwreG1sOyBjaGFyc2V0PVVURi04IiAvPg0KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQXNjaWlEb2MgOC42LjgiIC8+DQorPHRpdGxlPmlzb2xpbnV4KDEpPC90aXRsZT4NCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KKy8qIFNoYXJlZCBDU1MgZm9yIEFzY2lpRG9jIHhodG1sMTEgYW5kIGh0bWw1IGJhY2tlbmRzICovDQorDQorLyogRGVmYXVsdCBmb250LiAqLw0KK2JvZHkgew0KKyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsc2VyaWY7DQorfQ0KKw0KKy8qIFRpdGxlIGZvbnQuICovDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiwNCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUsDQordGhlYWQsIHAudGFibGUuaGVhZGVyLA0KKyN0b2N0aXRsZSwNCisjYXV0aG9yLCAjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyaywNCisjZm9vdGVyIHsNCisgIGZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsNCit9DQorDQorYm9keSB7DQorICBtYXJnaW46IDFlbSA1JSAxZW0gNSU7DQorfQ0KKw0KK2Egew0KKyAgY29sb3I6IGJsdWU7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCit9DQorYTp2aXNpdGVkIHsNCisgIGNvbG9yOiBmdWNoc2lhOw0KK30NCisNCitlbSB7DQorICBmb250LXN0eWxlOiBpdGFsaWM7DQorICBjb2xvcjogbmF2eTsNCit9DQorDQorc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICMwODMxOTQ7DQorfQ0KKw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBtYXJnaW4tdG9wOiAxLjJlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KKyAgbGluZS1oZWlnaHQ6IDEuMzsNCit9DQorDQoraDEsIGgyLCBoMyB7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitoMiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorfQ0KK2gzIHsNCisgIGZsb2F0OiBsZWZ0Ow0KK30NCitoMyArICogew0KKyAgY2xlYXI6IGxlZnQ7DQorfQ0KK2g1IHsNCisgIGZvbnQtc2l6ZTogMS4wZW07DQorfQ0KKw0KK2Rpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogMDsNCit9DQorDQoraHIgew0KKyAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOw0KK30NCisNCitwIHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KK3VsLCBvbCwgbGkgPiBwIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3VsID4gbGkgICAgIHsgY29sb3I6ICNhYWE7IH0NCit1bCA+IGxpID4gKiB7IGNvbG9yOiBibGFjazsgfQ0KKw0KKy5tb25vc3BhY2VkLCBjb2RlLCBwcmUgew0KKyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCisgIGNvbG9yOiBuYXZ5Ow0KKyAgcGFkZGluZzogMDsNCisgIG1hcmdpbjogMDsNCit9DQorDQorDQorI2F1dGhvciB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCit9DQorI2VtYWlsIHsNCit9DQorI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmsgew0KK30NCisNCisjZm9vdGVyIHsNCisgIGZvbnQtc2l6ZTogc21hbGw7DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLXRvcDogNC4wZW07DQorfQ0KKyNmb290ZXItdGV4dCB7DQorICBmbG9hdDogbGVmdDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorI2Zvb3Rlci1iYWRnZXMgew0KKyAgZmxvYXQ6IHJpZ2h0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisNCisjcHJlYW1ibGUgew0KKyAgbWFyZ2luLXRvcDogMS41ZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmltYWdlYmxvY2ssIGRpdi5leGFtcGxlYmxvY2ssIGRpdi52ZXJzZWJsb2NrLA0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYubGl0ZXJhbGJsb2NrLCBkaXYubGlzdGluZ2Jsb2NrLCBkaXYuc2lkZWJhcmJsb2NrLA0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAyLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDIuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBjb2xvcjogIzYwNjA2MDsNCit9DQorDQorZGl2LmNvbnRlbnQgeyAvKiBCbG9jayBlbGVtZW50IGNvbnRlbnQuICovDQorICBwYWRkaW5nOiAwOw0KK30NCisNCisvKiBCbG9jayBlbGVtZW50IHRpdGxlcy4gKi8NCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCitkaXYudGl0bGUgKyAqIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKw0KK3RkIGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCArIGRpdi50aXRsZSB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorDQorZGl2LnNpZGViYXJibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJhY2tncm91bmQ6ICNmZmZmZWU7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjBmMGYwOw0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5saXN0aW5nYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgYmFja2dyb3VuZDogI2Y4ZjhmODsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYucXVvdGVibG9jaywgZGl2LnZlcnNlYmxvY2sgew0KKyAgcGFkZGluZy1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgY29sb3I6ICM4ODg7DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCitkaXYudmVyc2VibG9jayA+IHByZS5jb250ZW50IHsNCisgIGZvbnQtZmFtaWx5OiBpbmhlcml0Ow0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KK30NCitkaXYudmVyc2VibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC43NWVtOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorLyogREVQUkVDQVRFRDogUHJlIHZlcnNpb24gOC4yLjcgdmVyc2Ugc3R5bGUgbGl0ZXJhbCBibG9jay4gKi8NCitkaXYudmVyc2VibG9jayArIGRpdi5hdHRyaWJ1dGlvbiB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisNCitkaXYuYWRtb25pdGlvbmJsb2NrIC5pY29uIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgdGQuY29udGVudCB7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KK30NCisNCitkaXYuZXhhbXBsZWJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCit9DQorDQorZGl2LmltYWdlYmxvY2sgZGl2LmNvbnRlbnQgeyBwYWRkaW5nLWxlZnQ6IDA7IH0NCitzcGFuLmltYWdlIGltZyB7IGJvcmRlci1zdHlsZTogbm9uZTsgfQ0KK2EuaW1hZ2U6dmlzaXRlZCB7IGNvbG9yOiB3aGl0ZTsgfQ0KKw0KK2RsIHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2R0IHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCitkZCA+ICo6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorfQ0KKw0KK3VsLCBvbCB7DQorICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7DQorfQ0KK29sLmFyYWJpYyB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7DQorfQ0KK29sLmxvd2VyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYTsNCit9DQorb2wudXBwZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLWFscGhhOw0KK30NCitvbC5sb3dlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItcm9tYW47DQorfQ0KK29sLnVwcGVycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1yb21hbjsNCit9DQorDQorZGl2LmNvbXBhY3QgdWwsIGRpdi5jb21wYWN0IG9sLA0KK2Rpdi5jb21wYWN0IHAsIGRpdi5jb21wYWN0IHAsDQorZGl2LmNvbXBhY3QgZGl2LCBkaXYuY29tcGFjdCBkaXYgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQordGZvb3Qgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkID4gZGl2LnZlcnNlIHsNCisgIHdoaXRlLXNwYWNlOiBwcmU7DQorfQ0KKw0KK2Rpdi5oZGxpc3Qgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZGl2LmhkbGlzdCB0ciB7DQorICBwYWRkaW5nLWJvdHRvbTogMTVweDsNCit9DQorZHQuaGRsaXN0MS5zdHJvbmcsIHRkLmhkbGlzdDEuc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZC5oZGxpc3QxIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjhlbTsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCit0ZC5oZGxpc3QyIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5oZGxpc3QuY29tcGFjdCB0ciB7DQorICBtYXJnaW46IDA7DQorICBwYWRkaW5nLWJvdHRvbTogMDsNCit9DQorDQorLmNvbW1lbnQgew0KKyAgYmFja2dyb3VuZDogeWVsbG93Ow0KK30NCisNCisuZm9vdG5vdGUsIC5mb290bm90ZXJlZiB7DQorICBmb250LXNpemU6IDAuOGVtOw0KK30NCisNCitzcGFuLmZvb3Rub3RlLCBzcGFuLmZvb3Rub3RlcmVmIHsNCisgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjsNCit9DQorDQorI2Zvb3Rub3RlcyB7DQorICBtYXJnaW46IDIwcHggMCAyMHB4IDA7DQorICBwYWRkaW5nOiA3cHggMCAwIDA7DQorfQ0KKw0KKyNmb290bm90ZXMgZGl2LmZvb3Rub3RlIHsNCisgIG1hcmdpbjogMCAwIDVweCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGhyIHsNCisgIGJvcmRlcjogbm9uZTsNCisgIGJvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7DQorICBoZWlnaHQ6IDFweDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tbGVmdDogMDsNCisgIHdpZHRoOiAyMCU7DQorICBtaW4td2lkdGg6IDEwMHB4Ow0KK30NCisNCitkaXYuY29saXN0IHRkIHsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuM2VtOw0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmNvbGlzdCB0ZCBpbWcgew0KKyAgbWFyZ2luLXRvcDogMC4zZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICAjZm9vdGVyLWJhZGdlcyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorI3RvYyB7DQorICBtYXJnaW4tYm90dG9tOiAyLjVlbTsNCit9DQorDQorI3RvY3RpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQorZGl2LnRvY2xldmVsMCwgZGl2LnRvY2xldmVsMSwgZGl2LnRvY2xldmVsMiwgZGl2LnRvY2xldmVsMywgZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tdG9wOiAwOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCit9DQorZGl2LnRvY2xldmVsMiB7DQorICBtYXJnaW4tbGVmdDogMmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsMyB7DQorICBtYXJnaW4tbGVmdDogNGVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tbGVmdDogNmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorDQorc3Bhbi5hcXVhIHsgY29sb3I6IGFxdWE7IH0NCitzcGFuLmJsYWNrIHsgY29sb3I6IGJsYWNrOyB9DQorc3Bhbi5ibHVlIHsgY29sb3I6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEgeyBjb2xvcjogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheSB7IGNvbG9yOiBncmF5OyB9DQorc3Bhbi5ncmVlbiB7IGNvbG9yOiBncmVlbjsgfQ0KK3NwYW4ubGltZSB7IGNvbG9yOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24geyBjb2xvcjogbWFyb29uOyB9DQorc3Bhbi5uYXZ5IHsgY29sb3I6IG5hdnk7IH0NCitzcGFuLm9saXZlIHsgY29sb3I6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUgeyBjb2xvcjogcHVycGxlOyB9DQorc3Bhbi5yZWQgeyBjb2xvcjogcmVkOyB9DQorc3Bhbi5zaWx2ZXIgeyBjb2xvcjogc2lsdmVyOyB9DQorc3Bhbi50ZWFsIHsgY29sb3I6IHRlYWw7IH0NCitzcGFuLndoaXRlIHsgY29sb3I6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3cgeyBjb2xvcjogeWVsbG93OyB9DQorDQorc3Bhbi5hcXVhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBhcXVhOyB9DQorc3Bhbi5ibGFjay1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmxhY2s7IH0NCitzcGFuLmJsdWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyYXk7IH0NCitzcGFuLmdyZWVuLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmVlbjsgfQ0KK3NwYW4ubGltZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbGltZTsgfQ0KK3NwYW4ubWFyb29uLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBtYXJvb247IH0NCitzcGFuLm5hdnktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG5hdnk7IH0NCitzcGFuLm9saXZlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBwdXJwbGU7IH0NCitzcGFuLnJlZC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcmVkOyB9DQorc3Bhbi5zaWx2ZXItYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogdGVhbDsgfQ0KK3NwYW4ud2hpdGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3ctYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYmlnIHsgZm9udC1zaXplOiAyZW07IH0NCitzcGFuLnNtYWxsIHsgZm9udC1zaXplOiAwLjZlbTsgfQ0KKw0KK3NwYW4udW5kZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0NCitzcGFuLm92ZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsgfQ0KK3NwYW4ubGluZS10aHJvdWdoIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IH0NCisNCitkaXYudW5icmVha2FibGUgeyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0NCisNCisNCisvKg0KKyAqIHhodG1sMTEgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorZGl2LnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZSB7DQorICBib3JkZXI6IDNweCBzb2xpZCAjNTI3YmJkOw0KK30NCit0aGVhZCwgcC50YWJsZS5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZSB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisvKiBCZWNhdXNlIHRoZSB0YWJsZSBmcmFtZSBhdHRyaWJ1dGUgaXMgb3ZlcnJpZGVuIGJ5IENTUyBpbiBtb3N0IGJyb3dzZXJzLiAqLw0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZvaWQiXSB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9ImhzaWRlcyJdIHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2c2lkZXMiXSB7DQorICBib3JkZXItdG9wLXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsNCit9DQorDQorDQorLyoNCisgKiBodG1sNSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK3RoZWFkLCBwLnRhYmxlYmxvY2suaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogM3B4Ow0KKyAgYm9yZGVyLXNwYWNpbmc6IDBweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KK30NCit0aC50YWJsZWJsb2NrLCB0ZC50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogMXB4Ow0KKyAgcGFkZGluZzogNHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCit9DQorDQordGFibGUudGFibGVibG9jay5mcmFtZS10b3Bib3Qgew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXNpZGVzIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1ub25lIHsNCisgIGJvcmRlci1zdHlsZTogaGlkZGVuOw0KK30NCisNCit0aC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0IHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciwgdGQudGFibGVibG9jay5oYWxpZ24tY2VudGVyIHsNCisgIHRleHQtYWxpZ246IGNlbnRlcjsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tcmlnaHQsIHRkLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0IHsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCit0aC50YWJsZWJsb2NrLnZhbGlnbi10b3AsIHRkLnRhYmxlYmxvY2sudmFsaWduLXRvcCB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUsIHRkLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20sIHRkLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOw0KK30NCisNCisNCisvKg0KKyAqIG1hbnBhZ2Ugc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorYm9keS5tYW5wYWdlIGgxIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitib2R5Lm1hbnBhZ2UgaDIgew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitib2R5Lm1hbnBhZ2UgZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAzZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICBib2R5Lm1hbnBhZ2UgZGl2I3RvYyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorDQorPC9zdHlsZT4NCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQorLyo8IVtDREFUQVsqLw0KK3ZhciBhc2NpaWRvYyA9IHsgIC8vIE5hbWVzcGFjZS4NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBUYWJsZSBPZiBDb250ZW50cyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBBdXRob3I6IE1paGFpIEJhem9uLCBTZXB0ZW1iZXIgMjAwMg0KKyAqIGh0dHA6Ly9zdHVkZW50cy5pbmZvaWFzaS5yby9+bWlzaG9vDQorICoNCisgKiBUYWJsZSBPZiBDb250ZW50IGdlbmVyYXRvcg0KKyAqIFZlcnNpb246IDAuNA0KKyAqDQorICogRmVlbCBmcmVlIHRvIHVzZSB0aGlzIHNjcmlwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYw0KKyAqIExpY2Vuc2UsIGFzIGxvbmcgYXMgeW91IGRvIG5vdCByZW1vdmUgb3IgYWx0ZXIgdGhpcyBub3RpY2UuDQorICovDQorDQorIC8qIG1vZGlmaWVkIGJ5IFRyb3kgRC4gSGFuc29uLCBTZXB0ZW1iZXIgMjAwNi4gTGljZW5zZTogR1BMICovDQorIC8qIG1vZGlmaWVkIGJ5IFN0dWFydCBSYWNraGFtLCAyMDA2LCAyMDA5LiBMaWNlbnNlOiBHUEwgKi8NCisNCisvLyB0b2NsZXZlbHMgPSAxLi40Lg0KK3RvYzogZnVuY3Rpb24gKHRvY2xldmVscykgew0KKw0KKyAgZnVuY3Rpb24gZ2V0VGV4dChlbCkgew0KKyAgICB2YXIgdGV4dCA9ICIiOw0KKyAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgIGlmIChpLm5vZGVUeXBlID09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIC8vIElFIGRvZXNuJ3Qgc3BlYWsgY29uc3RhbnRzLg0KKyAgICAgICAgdGV4dCArPSBpLmRhdGE7DQorICAgICAgZWxzZSBpZiAoaS5maXJzdENoaWxkICE9IG51bGwpDQorICAgICAgICB0ZXh0ICs9IGdldFRleHQoaSk7DQorICAgIH0NCisgICAgcmV0dXJuIHRleHQ7DQorICB9DQorDQorICBmdW5jdGlvbiBUb2NFbnRyeShlbCwgdGV4dCwgdG9jbGV2ZWwpIHsNCisgICAgdGhpcy5lbGVtZW50ID0gZWw7DQorICAgIHRoaXMudGV4dCA9IHRleHQ7DQorICAgIHRoaXMudG9jbGV2ZWwgPSB0b2NsZXZlbDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIHRvY0VudHJpZXMoZWwsIHRvY2xldmVscykgew0KKyAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5Ow0KKyAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdbaEhdKFsxLScrKHRvY2xldmVscysxKSsnXSknKTsNCisgICAgLy8gRnVuY3Rpb24gdGhhdCBzY2FucyB0aGUgRE9NIHRyZWUgZm9yIGhlYWRlciBlbGVtZW50cyAodGhlIERPTTINCisgICAgLy8gbm9kZUl0ZXJhdG9yIEFQSSB3b3VsZCBiZSBhIGJldHRlciB0ZWNobmlxdWUgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgYWxsDQorICAgIC8vIGJyb3dzZXJzKS4NCisgICAgdmFyIGl0ZXJhdGUgPSBmdW5jdGlvbiAoZWwpIHsNCisgICAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykgew0KKyAgICAgICAgICB2YXIgbW8gPSByZS5leGVjKGkudGFnTmFtZSk7DQorICAgICAgICAgIGlmIChtbyAmJiAoaS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgaS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpKSAhPSAiZmxvYXQiKSB7DQorICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbmV3IFRvY0VudHJ5KGksIGdldFRleHQoaSksIG1vWzFdLTEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGl0ZXJhdGUoaSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGl0ZXJhdGUoZWwpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgdmFyIHRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b2MiKTsNCisgIGlmICghdG9jKSB7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIC8vIERlbGV0ZSBleGlzdGluZyBUT0MgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgVE9DLg0KKyAgdmFyIHRvY0VudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgdmFyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gdG9jLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCgvXnRvY2xldmVsLykpDQorICAgICAgdG9jRW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IHRvY0VudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICB0b2MucmVtb3ZlQ2hpbGQodG9jRW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgVE9DIGVudHJpZXMuDQorICB2YXIgZW50cmllcyA9IHRvY0VudHJpZXMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKSwgdG9jbGV2ZWxzKTsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KKyAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2ldOw0KKyAgICBpZiAoZW50cnkuZWxlbWVudC5pZCA9PSAiIikNCisgICAgICBlbnRyeS5lbGVtZW50LmlkID0gIl90b2NfIiArIGk7DQorICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOw0KKyAgICBhLmhyZWYgPSAiIyIgKyBlbnRyeS5lbGVtZW50LmlkOw0KKyAgICBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVudHJ5LnRleHQpKTsNCisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KKyAgICBkaXYuYXBwZW5kQ2hpbGQoYSk7DQorICAgIGRpdi5jbGFzc05hbWUgPSAidG9jbGV2ZWwiICsgZW50cnkudG9jbGV2ZWw7DQorICAgIHRvYy5hcHBlbmRDaGlsZChkaXYpOw0KKyAgfQ0KKyAgaWYgKGVudHJpZXMubGVuZ3RoID09IDApDQorICAgIHRvYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYyk7DQorfSwNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBGb290bm90ZXMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQmFzZWQgb24gZm9vdG5vdGUgZ2VuZXJhdGlvbiBjb2RlIGZyb206DQorICogaHR0cDovL3d3dy5icmFuZHNwYW5raW5nbmV3Lm5ldC9hcmNoaXZlLzIwMDUvMDcvZm9ybWF0X2Zvb3Rub3RlLmh0bWwNCisgKi8NCisNCitmb290bm90ZXM6IGZ1bmN0aW9uICgpIHsNCisgIC8vIERlbGV0ZSBleGlzdGluZyBmb290bm90ZSBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBmb290bm9kZXMuDQorICB2YXIgaTsNCisgIHZhciBub3RlaG9sZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvb3Rub3RlcyIpOw0KKyAgaWYgKCFub3RlaG9sZGVyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHZhciBlbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIGZvciAoaSA9IDA7IGkgPCBub3RlaG9sZGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gbm90ZWhvbGRlci5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2JyAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gImZvb3Rub3RlIikNCisgICAgICBlbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgZW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIG5vdGVob2xkZXIucmVtb3ZlQ2hpbGQoZW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgZm9vdG5vdGUgZW50cmllcy4NCisgIHZhciBjb250ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKTsNCisgIHZhciBzcGFucyA9IGNvbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCisgIHZhciByZWZzID0ge307DQorICB2YXIgbiA9IDA7DQorICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZSIpIHsNCisgICAgICBuKys7DQorICAgICAgdmFyIG5vdGUgPSBzcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIpOw0KKyAgICAgIGlmICghbm90ZSkgew0KKyAgICAgICAgLy8gVXNlIFtcc1xTXSBpbiBwbGFjZSBvZiAuIHNvIG11bHRpLWxpbmUgbWF0Y2hlcyB3b3JrLg0KKyAgICAgICAgLy8gQmVjYXVzZSBKYXZhU2NyaXB0IGhhcyBubyBzIChkb3RhbGwpIHJlZ2V4IGZsYWcuDQorICAgICAgICBub3RlID0gc3BhbnNbaV0uaW5uZXJIVE1MLm1hdGNoKC9ccypcWyhbXHNcU10qKV1ccyovKVsxXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaWQ9J19mb290bm90ZXJlZl8iICsgbiArICInIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgICBzcGFuc1tpXS5zZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIsIG5vdGUpOw0KKyAgICAgIH0NCisgICAgICBub3RlaG9sZGVyLmlubmVySFRNTCArPQ0KKyAgICAgICAgIjxkaXYgY2xhc3M9J2Zvb3Rub3RlJyBpZD0nX2Zvb3Rub3RlXyIgKyBuICsgIic+IiArDQorICAgICAgICAiPGEgaHJlZj0nI19mb290bm90ZXJlZl8iICsgbiArICInIHRpdGxlPSdSZXR1cm4gdG8gdGV4dCc+IiArDQorICAgICAgICBuICsgIjwvYT4uICIgKyBub3RlICsgIjwvZGl2PiI7DQorICAgICAgdmFyIGlkID1zcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7DQorICAgICAgaWYgKGlkICE9IG51bGwpIHJlZnNbIiMiK2lkXSA9IG47DQorICAgIH0NCisgIH0NCisgIGlmIChuID09IDApDQorICAgIG5vdGVob2xkZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub3RlaG9sZGVyKTsNCisgIGVsc2Ugew0KKyAgICAvLyBQcm9jZXNzIGZvb3Rub3RlcmVmcy4NCisgICAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZXJlZiIpIHsNCisgICAgICAgIHZhciBocmVmID0gc3BhbnNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsNCisgICAgICAgIGhyZWYgPSBocmVmLm1hdGNoKC8jLiovKVswXTsgIC8vIEJlY2F1c2UgSUUgcmV0dXJuIGZ1bGwgVVJMLg0KKyAgICAgICAgbiA9IHJlZnNbaHJlZl07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfSwNCisNCitpbnN0YWxsOiBmdW5jdGlvbih0b2NsZXZlbHMpIHsNCisgIHZhciB0aW1lcklkOw0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsKCkgew0KKyAgICBhc2NpaWRvYy5mb290bm90ZXMoKTsNCisgICAgaWYgKHRvY2xldmVscykgew0KKyAgICAgIGFzY2lpZG9jLnRvYyh0b2NsZXZlbHMpOw0KKyAgICB9DQorICB9DQorDQorICBmdW5jdGlvbiByZWluc3RhbGxBbmRSZW1vdmVUaW1lcigpIHsNCisgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsNCisgICAgcmVpbnN0YWxsKCk7DQorICB9DQorDQorICB0aW1lcklkID0gc2V0SW50ZXJ2YWwocmVpbnN0YWxsLCA1MDApOw0KKyAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpDQorICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCByZWluc3RhbGxBbmRSZW1vdmVUaW1lciwgZmFsc2UpOw0KKyAgZWxzZQ0KKyAgICB3aW5kb3cub25sb2FkID0gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXI7DQorfQ0KKw0KK30NCithc2NpaWRvYy5pbnN0YWxsKCk7DQorLypdXT4qLw0KKzwvc2NyaXB0Pg0KKzwvaGVhZD4NCis8Ym9keSBjbGFzcz0ibWFucGFnZSI+DQorPGRpdiBpZD0iaGVhZGVyIj4NCis8aDE+DQoraXNvbGludXgoMSkgTWFudWFsIFBhZ2UNCis8L2gxPg0KKzxoMj5OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPHA+aXNvbGludXggLQ0KKyAgIFRoZSBTeXNsaW51eCBkZXJpdmF0aXZlIElTT0xJTlVYIGZvciBJU085NjYwIENEL0RWRCBtZWRpYQ0KKzwvcD4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJjb250ZW50Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfc3lub3BzaXMiPlNZTk9QU0lTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0idmVyc2VibG9jayI+DQorPHByZSBjbGFzcz0iY29udGVudCI+PHN0cm9uZz5ta2lzb2ZzPC9zdHJvbmc+IC1vIDxlbT5pc29pbWFnZTwvZW0+IFwNCisgICAgICAgIC1iIDxlbT5pc29saW51eC9pc29saW51eC5iaW48L2VtPiAtYyA8ZW0+aXNvbGludXgvYm9vdC5jYXQ8L2VtPiBcDQorICAgICAgICAtbm8tZW11bC1ib290IC1ib290LWxvYWQtc2l6ZSA0IC1ib290LWluZm8tdGFibGUgXA0KKyAgICAgICAgPGVtPnJvb3Qtb2YtaXNvLXRyZWU8L2VtPjwvcHJlPg0KKzxkaXYgY2xhc3M9ImF0dHJpYnV0aW9uIj4NCis8L2Rpdj48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZGVzY3JpcHRpb24iPkRFU0NSSVBUSU9OPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JU09MSU5VWCBpcyBhIGJvb3QgbG9hZGVyIGZvciBMaW51eC9pMzg2IHRoYXQgb3BlcmF0ZXMgb2ZmIElTTyA5NjYwL0VsDQorVG9yaXRvIENELVJPTXMgaW4gIm5vIGVtdWxhdGlvbiIgbW9kZS4gIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIGNyZWF0ZQ0KK2FuICJlbXVsYXRpb24gZGlzayBpbWFnZSIgd2l0aCBsaW1pdGVkIHNwYWNlIChmb3IgImZsb3BweSBlbXVsYXRpb24iKQ0KK29yIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgKGZvciAiaGFyZCBkaXNrIGVtdWxhdGlvbiIuKTwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRvIGNyZWF0ZSBhbiBpbWFnZSwgY3JlYXRlIGEgZGlyZWN0b3J5IGNhbGxlZCAiaXNvbGludXgvIiAob3IsIGlmIHlvdQ0KK3ByZWZlciwgImJvb3QvaXNvbGludXgvIikgdW5kZXJuZWF0aCB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgeW91ciBJU08gaW1hZ2UNCittYXN0ZXIgZmlsZSB0cmVlLiAgQ29weSBpc29saW51eC5iaW4sIGEgY29uZmlnIGZpbGUgY2FsbGVkDQorImlzb2xpbnV4LmNmZyIgKHNlZSA8c3Ryb25nPnN5c2xpbnV4LmNmZzwvc3Ryb25nPig1KSBmb3IgZGV0YWlscyBvbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlKSwNCithbmQgYWxsIG5lY2Vzc2FyeSBmaWxlcyAoa2VybmVscywgaW5pdHJkLCBkaXNwbGF5IGZpbGVzLCBldGMuKSBpbnRvIHRoaXMNCitkaXJlY3RvcnksIHRoZW4gdXNlIHRoZSBhYm92ZSBjb21tYW5kIHRvIGNyZWF0ZSB5b3VyIElTTyBpbWFnZSAoYWRkDQorYWRkaXRpb25hbCBvcHRpb25zIGFzIGFwcHJvcHJpYXRlLCBzdWNoIGFzIC1KIG9yIC1SKS4gIElmIHlvdSBuYW1lZCB0aGUNCitkaXJlY3RvcnkgYm9vdC9pc29saW51eCB0aGF0IHNob3VsZCBvZiBjb3Vyc2UgYmU8YnIgLz4NCisgICAgICAgIC1iIGJvb3QvaXNvbGludXgvaXNvbGludXguYmluIC1jIGJvb3QvaXNvbGludXgvYm9vdC5jYXQuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9jb25maWdfZmlsZV9kaXJlY3RvcnkiPkNPTkZJRyBGSUxFIERJUkVDVE9SWTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNPTElOVVggd2lsbCBzZWFyY2ggZm9yIHRoZSBjb25maWcgZmlsZSBkaXJlY3RvcnkgaW4gdGhlIG9yZGVyDQorL2Jvb3QvaXNvbGludXgsIC9pc29saW51eCwgLy4gIFRoZSBmaXJzdCBkaXJlY3RvcnkgdGhhdCBleGlzdHMgaXMNCit1c2VkLCBldmVuIGlmIGl0IGNvbnRhaW5zIG5vIGZpbGVzLiAgVGhlcmVmb3JlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQNCit0aGVzZSBkaXJlY3RvcmllcyBkb24mIzgyMTc7dCBleGlzdCBpZiB5b3UgZG9uJiM4MjE3O3Qgd2FudCBJU09MSU5VWCB0byB1c2UgdGhlbS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2h5YnJpZF9jZF9yb21faGFyZF9kaXNrX21vZGUiPkhZQlJJRCBDRC1ST00vSEFSRCBESVNLIE1PREU8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlN0YXJ0aW5nIGluIHZlcnNpb24gMy43MiwgSVNPTElOVVggc3VwcG9ydHMgYSAiaHlicmlkIG1vZGUiIHdoaWNoIGNhbg0KK2JlIGJvb3RlZCBmcm9tIGVpdGhlciBDRC1ST00gb3IgZnJvbSBhIGRldmljZSB3aGljaCBCSU9TIGNvbnNpZGVycyBhDQoraGFyZCBkaXNrIG9yIFpJUCBkaXNrLCBlLmcuIGEgVVNCIGtleSBvciBzaW1pbGFyLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRvIGVuYWJsZSB0aGlzIG1vZGUsIHRoZSAuaXNvIGltYWdlIHNob3VsZCBiZSBwb3N0cHJvY2Vzc2VkIHdpdGggdGhlDQorImlzb2h5YnJpZCIgc2NyaXB0IGZyb20gdGhlIHV0aWxzIGRpcmVjdG9yeTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmlzb2h5YnJpZCBmaWxlbmFtZS5pc288L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIHNjcmlwdCBjcmVhdGVzIHRoZSBuZWNlc3NhcnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBiZSBhYmxlIHRvDQorYm9vdCBpbiBoeWJyaWQgbW9kZS4gIEl0IGFsc28gcGFkcyBvdXQgdGhlIGltYWdlIHRvIGFuIGV2ZW4gbXVsdGlwbGUNCitvZiAxIE1CLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgaW1hZ2UgY2FuIHRoZW4gYmUgY29waWVkIHVzaW5nIGFueSByYXcgZGlzayB3cml0aW5nIHRvb2wgKG9uIFVuaXgNCitzeXN0ZW1zLCB0eXBpY2FsbHkgImRkIiBvciAiY2F0IikgdG8gYSBVU0IgZGlzaywgb3Igd3JpdHRlbiB0byBhDQorQ0QtUk9NIHVzaW5nIHN0YW5kYXJkIENEIGJ1cm5pbmcgdG9vbHMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIElTTyA5NjYwIGZpbGVzeXN0ZW0gaXMgZW5jYXBzdWxhdGVkIGluIGEgcGFydGl0aW9uICh3aGljaCBzdGFydHMNCithdCBvZmZzZXQgemVybywgd2hpY2ggbWF5IGNvbmZ1c2Ugc29tZSBzeXN0ZW1zLikgIFRoaXMgbWFrZXMgaXQNCitwb3NzaWJsZSBmb3IgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIG9uY2UgYm9vdGVkLCB0byB1c2UgdGhlIHJlbWFpbmRlcg0KK29mIHRoZSBkZXZpY2UgZm9yIHBlcnNpc3RlbnQgc3RvcmFnZSBieSBjcmVhdGluZyBhIHNlY29uZCBwYXJ0aXRpb24uPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9taXNjZWxsYW5lb3VzIj5NSVNDRUxMQU5FT1VTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5NYWtlIHN1cmUgeW91IGhhdmUgYSByZWNlbnQgZW5vdWdoIHZlcnNpb24gb2YgbWtpc29mcy4gIEkgcmVjb21tZW5kDQorbWtpc29mcyAxLjEzIChkaXN0cmlidXRlZCB3aXRoIGNkcmVjb3JkIDEuOSksIGJ1dCAxLjEyIG1pZ2h0IHdvcmsgYXMNCit3ZWxsIChub3QgdGVzdGVkLik8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JU09MSU5VWCByZXNvbHZlcyBwYXRobmFtZXMgdGhlIGZvbGxvd2luZyB3YXk6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InVsaXN0Ij48dWw+DQorPGxpPg0KKzxwPg0KK0EgcGF0aG5hbWUgY29uc2lzdHMgb2YgbmFtZXMgc2VwYXJhdGVkIGJ5IHNsYXNoZXMsIFVuaXgtc3R5bGUuDQorPC9wPg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0EgbGVhZGluZyAvIG1lYW5zIGl0IHNlYXJjaGVzIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5OyBvdGhlcndpc2UgdGhlDQorICBzZWFyY2ggaXMgZnJvbSB0aGUgaXNvbGludXggZGlyZWN0b3J5ICh0aGluayBvZiB0aGlzIGFzIHRoZSAiY3VycmVudA0KKyAgZGlyZWN0b3J5Ii4pDQorPC9wPg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KKy4gYW5kIC4uIGluIHBhdGhuYW1lIHNlYXJjaGVzIGFyZSBub3Qgc3VwcG9ydGVkLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitUaGUgbWF4aW11bSBsZW5ndGggb2YgYW55IHBhdGhuYW1lIGlzIDI1NSBjaGFyYWN0ZXJzLg0KKzwvcD4NCis8L2xpPg0KKzwvdWw+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Ob3RlIHRoYXQgSVNPTElOVVggb25seSB1c2VzIHRoZSAicGxhaW4iIElTTyA5NjYwIGZpbGVuYW1lcywgaS5lLiBpdA0KK2RvZXMgbm90IHN1cHBvcnQgUm9jayBSaWRnZSBvciBKb2xpZXQgZmlsZW5hbWVzLiAgSXQgY2FuIHN0aWxsIGJlIHVzZWQNCitvbiBhIGRpc2sgd2hpY2ggdXNlcyBSb2NrIFJpZGdlIGFuZC9vciBKb2xpZXQgZXh0ZW5zaW9ucywgb2YgY291cnNlLg0KK1VuZGVyIExpbnV4LCB5b3UgY2FuIHZlcmlmeSB0aGUgcGxhaW4gZmlsZW5hbWVzIGJ5IG1vdW50aW5nIHdpdGggdGhlDQorIi1vIG5vcm9jayxub2pvbGlldCIgb3B0aW9uIHRvIHRoZSBtb3VudCBjb21tYW5kLiAgTm90ZSwgaG93ZXZlciwgdGhhdA0KK0lTT0xJTlVYIGRvZXMgc3VwcG9ydCAibG9uZyIgKGxldmVsIDIpIElTTyA5NjYwIHBsYWluIGZpbGVuYW1lcywgc28gaWYNCitjb21wYXRpYmlsaXR5IHdpdGggc2hvcnQtbmFtZXMtb25seSBvcGVyYXRpbmcgc3lzdGVtcyBsaWtlIE1TLURPUyBpcw0KK25vdCBhbiBpc3N1ZSwgeW91IGNhbiB1c2UgdGhlICItbCIgb3IgIi1pc28tbGV2ZWwgMiIgb3B0aW9uIHRvIG1raXNvZnMNCit0byBnZW5lcmF0ZSBsb25nICh1cCB0byAzMSBjaGFyYWN0ZXJzKSBwbGFpbiBmaWxlbmFtZXMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNPTElOVVggZG9lcyBub3Qgc3VwcG9ydCBkaXNjb250aWd1b3VzIGZpbGVzLCBpbnRlcmxlYXZlZCBtb2RlLCBvcg0KK2xvZ2ljYWwgYmxvY2sgYW5kIHNlY3RvciBzaXplcyBvdGhlciB0aGFuIDIwNDguICBUaGlzIHNob3VsZCBub3JtYWxseQ0KK25vdCBiZSBhIHByb2JsZW0uPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNPTElOVVggaXMgYnkgZGVmYXVsdCBidWlsdCBpbiB0d28gdmVyc2lvbnMsIG9uZSB2ZXJzaW9uIHdpdGggZXh0cmENCitkZWJ1Z2dpbmcgbWVzc2FnZXMgZW5hYmxlZC4gIElmIHlvdSBhcmUgaGF2aW5nIHByb2JsZW1zIHdpdGggSVNPTElOVVgsDQorSSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaWYgeW91IGNvdWxkIHRyeSBvdXQgdGhlIGRlYnVnZ2luZyB2ZXJzaW9uDQorKGlzb2xpbnV4LWRlYnVnLmJpbikgYW5kIGxldCBtZSBrbm93IHdoYXQgaXQgcmVwb3J0cy4gIFRoZSBkZWJ1Z2dpbmcNCit2ZXJzaW9uIGRvZXMgbm90IGluY2x1ZGUgaHlicmlkIG1vZGUgc3VwcG9ydCAoc2VlIGJlbG93Lik8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX3NlZV9hbHNvIj5TRUUgQUxTTzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5zeXNsaW51eC5jZmc8L3N0cm9uZz4oNSksIDxzdHJvbmc+c3lzbGludXgtY2xpPC9zdHJvbmc+KDEpLCA8c3Ryb25nPmxpbG88L3N0cm9uZz4oOCksIDxzdHJvbmc+a2V5dGFiLWxpbG8ucGw8L3N0cm9uZz4oOCksDQorPHN0cm9uZz5mZGlzazwvc3Ryb25nPig4KSwgPHN0cm9uZz5ta2ZzPC9zdHJvbmc+KDgpLCA8c3Ryb25nPnN1cGVyZm9ybWF0PC9zdHJvbmc+KDEpLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYXV0aG9yIj5BVVRIT1I8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgQXNjaWlEb2MgZGVyaXZlZCBkb2N1bWVudCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsDQorPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBkb2N1bWVudGF0aW9uIGJ5IEguIFBldGVyIEFudmluICZsdDs8YSBocmVmPSJtYWlsdG86aHBhQHp5dG9yLmNvbSI+aHBhQHp5dG9yLmNvbTwvYT4mZ3Q7LiAgVGhlIGNvbnZlcnNpb24NCit0byBhbiBBc2NpaURvYyB3YXMgbWFkZSBieSBHZW5lIEN1bW0gJmx0OzxhIGhyZWY9Im1haWx0bzpnZW5lLmN1bW1AZ21haWwuY29tIj5nZW5lLmN1bW1AZ21haWwuY29tPC9hPiZndDs8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBpZD0iZm9vdG5vdGVzIj48aHIgLz48L2Rpdj4NCis8ZGl2IGlkPSJmb290ZXIiPg0KKzxkaXYgaWQ9ImZvb3Rlci10ZXh0Ij4NCitMYXN0IHVwZGF0ZWQgMjAxNC0wMS0xNyAxNjowOTo1NiBQU1QNCis8L2Rpdj4NCis8L2Rpdj4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2VmaTY0L3R4dC9odG1sL3B4ZWxpbnV4Lmh0bWwgYi9lZmk2NC90eHQvaHRtbC9weGVsaW51eC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDljNTEKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC90eHQvaHRtbC9weGVsaW51eC5odG1sCkBAIC0wLDAgKzEsMTMxMSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPg0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iYXBwbGljYXRpb24veGh0bWwreG1sOyBjaGFyc2V0PVVURi04IiAvPg0KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQXNjaWlEb2MgOC42LjgiIC8+DQorPHRpdGxlPnB4ZWxpbnV4KDEpPC90aXRsZT4NCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KKy8qIFNoYXJlZCBDU1MgZm9yIEFzY2lpRG9jIHhodG1sMTEgYW5kIGh0bWw1IGJhY2tlbmRzICovDQorDQorLyogRGVmYXVsdCBmb250LiAqLw0KK2JvZHkgew0KKyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsc2VyaWY7DQorfQ0KKw0KKy8qIFRpdGxlIGZvbnQuICovDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiwNCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUsDQordGhlYWQsIHAudGFibGUuaGVhZGVyLA0KKyN0b2N0aXRsZSwNCisjYXV0aG9yLCAjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyaywNCisjZm9vdGVyIHsNCisgIGZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsNCit9DQorDQorYm9keSB7DQorICBtYXJnaW46IDFlbSA1JSAxZW0gNSU7DQorfQ0KKw0KK2Egew0KKyAgY29sb3I6IGJsdWU7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCit9DQorYTp2aXNpdGVkIHsNCisgIGNvbG9yOiBmdWNoc2lhOw0KK30NCisNCitlbSB7DQorICBmb250LXN0eWxlOiBpdGFsaWM7DQorICBjb2xvcjogbmF2eTsNCit9DQorDQorc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICMwODMxOTQ7DQorfQ0KKw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBtYXJnaW4tdG9wOiAxLjJlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KKyAgbGluZS1oZWlnaHQ6IDEuMzsNCit9DQorDQoraDEsIGgyLCBoMyB7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitoMiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorfQ0KK2gzIHsNCisgIGZsb2F0OiBsZWZ0Ow0KK30NCitoMyArICogew0KKyAgY2xlYXI6IGxlZnQ7DQorfQ0KK2g1IHsNCisgIGZvbnQtc2l6ZTogMS4wZW07DQorfQ0KKw0KK2Rpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogMDsNCit9DQorDQoraHIgew0KKyAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOw0KK30NCisNCitwIHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KK3VsLCBvbCwgbGkgPiBwIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3VsID4gbGkgICAgIHsgY29sb3I6ICNhYWE7IH0NCit1bCA+IGxpID4gKiB7IGNvbG9yOiBibGFjazsgfQ0KKw0KKy5tb25vc3BhY2VkLCBjb2RlLCBwcmUgew0KKyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCisgIGNvbG9yOiBuYXZ5Ow0KKyAgcGFkZGluZzogMDsNCisgIG1hcmdpbjogMDsNCit9DQorDQorDQorI2F1dGhvciB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCit9DQorI2VtYWlsIHsNCit9DQorI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmsgew0KK30NCisNCisjZm9vdGVyIHsNCisgIGZvbnQtc2l6ZTogc21hbGw7DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLXRvcDogNC4wZW07DQorfQ0KKyNmb290ZXItdGV4dCB7DQorICBmbG9hdDogbGVmdDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorI2Zvb3Rlci1iYWRnZXMgew0KKyAgZmxvYXQ6IHJpZ2h0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisNCisjcHJlYW1ibGUgew0KKyAgbWFyZ2luLXRvcDogMS41ZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmltYWdlYmxvY2ssIGRpdi5leGFtcGxlYmxvY2ssIGRpdi52ZXJzZWJsb2NrLA0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYubGl0ZXJhbGJsb2NrLCBkaXYubGlzdGluZ2Jsb2NrLCBkaXYuc2lkZWJhcmJsb2NrLA0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAyLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDIuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBjb2xvcjogIzYwNjA2MDsNCit9DQorDQorZGl2LmNvbnRlbnQgeyAvKiBCbG9jayBlbGVtZW50IGNvbnRlbnQuICovDQorICBwYWRkaW5nOiAwOw0KK30NCisNCisvKiBCbG9jayBlbGVtZW50IHRpdGxlcy4gKi8NCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCitkaXYudGl0bGUgKyAqIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKw0KK3RkIGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCArIGRpdi50aXRsZSB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorDQorZGl2LnNpZGViYXJibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJhY2tncm91bmQ6ICNmZmZmZWU7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjBmMGYwOw0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5saXN0aW5nYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgYmFja2dyb3VuZDogI2Y4ZjhmODsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYucXVvdGVibG9jaywgZGl2LnZlcnNlYmxvY2sgew0KKyAgcGFkZGluZy1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgY29sb3I6ICM4ODg7DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCitkaXYudmVyc2VibG9jayA+IHByZS5jb250ZW50IHsNCisgIGZvbnQtZmFtaWx5OiBpbmhlcml0Ow0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KK30NCitkaXYudmVyc2VibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC43NWVtOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorLyogREVQUkVDQVRFRDogUHJlIHZlcnNpb24gOC4yLjcgdmVyc2Ugc3R5bGUgbGl0ZXJhbCBibG9jay4gKi8NCitkaXYudmVyc2VibG9jayArIGRpdi5hdHRyaWJ1dGlvbiB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisNCitkaXYuYWRtb25pdGlvbmJsb2NrIC5pY29uIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgdGQuY29udGVudCB7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KK30NCisNCitkaXYuZXhhbXBsZWJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCit9DQorDQorZGl2LmltYWdlYmxvY2sgZGl2LmNvbnRlbnQgeyBwYWRkaW5nLWxlZnQ6IDA7IH0NCitzcGFuLmltYWdlIGltZyB7IGJvcmRlci1zdHlsZTogbm9uZTsgfQ0KK2EuaW1hZ2U6dmlzaXRlZCB7IGNvbG9yOiB3aGl0ZTsgfQ0KKw0KK2RsIHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2R0IHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCitkZCA+ICo6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorfQ0KKw0KK3VsLCBvbCB7DQorICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7DQorfQ0KK29sLmFyYWJpYyB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7DQorfQ0KK29sLmxvd2VyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYTsNCit9DQorb2wudXBwZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLWFscGhhOw0KK30NCitvbC5sb3dlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItcm9tYW47DQorfQ0KK29sLnVwcGVycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1yb21hbjsNCit9DQorDQorZGl2LmNvbXBhY3QgdWwsIGRpdi5jb21wYWN0IG9sLA0KK2Rpdi5jb21wYWN0IHAsIGRpdi5jb21wYWN0IHAsDQorZGl2LmNvbXBhY3QgZGl2LCBkaXYuY29tcGFjdCBkaXYgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQordGZvb3Qgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkID4gZGl2LnZlcnNlIHsNCisgIHdoaXRlLXNwYWNlOiBwcmU7DQorfQ0KKw0KK2Rpdi5oZGxpc3Qgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZGl2LmhkbGlzdCB0ciB7DQorICBwYWRkaW5nLWJvdHRvbTogMTVweDsNCit9DQorZHQuaGRsaXN0MS5zdHJvbmcsIHRkLmhkbGlzdDEuc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZC5oZGxpc3QxIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjhlbTsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCit0ZC5oZGxpc3QyIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5oZGxpc3QuY29tcGFjdCB0ciB7DQorICBtYXJnaW46IDA7DQorICBwYWRkaW5nLWJvdHRvbTogMDsNCit9DQorDQorLmNvbW1lbnQgew0KKyAgYmFja2dyb3VuZDogeWVsbG93Ow0KK30NCisNCisuZm9vdG5vdGUsIC5mb290bm90ZXJlZiB7DQorICBmb250LXNpemU6IDAuOGVtOw0KK30NCisNCitzcGFuLmZvb3Rub3RlLCBzcGFuLmZvb3Rub3RlcmVmIHsNCisgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjsNCit9DQorDQorI2Zvb3Rub3RlcyB7DQorICBtYXJnaW46IDIwcHggMCAyMHB4IDA7DQorICBwYWRkaW5nOiA3cHggMCAwIDA7DQorfQ0KKw0KKyNmb290bm90ZXMgZGl2LmZvb3Rub3RlIHsNCisgIG1hcmdpbjogMCAwIDVweCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGhyIHsNCisgIGJvcmRlcjogbm9uZTsNCisgIGJvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7DQorICBoZWlnaHQ6IDFweDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tbGVmdDogMDsNCisgIHdpZHRoOiAyMCU7DQorICBtaW4td2lkdGg6IDEwMHB4Ow0KK30NCisNCitkaXYuY29saXN0IHRkIHsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuM2VtOw0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmNvbGlzdCB0ZCBpbWcgew0KKyAgbWFyZ2luLXRvcDogMC4zZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICAjZm9vdGVyLWJhZGdlcyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorI3RvYyB7DQorICBtYXJnaW4tYm90dG9tOiAyLjVlbTsNCit9DQorDQorI3RvY3RpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQorZGl2LnRvY2xldmVsMCwgZGl2LnRvY2xldmVsMSwgZGl2LnRvY2xldmVsMiwgZGl2LnRvY2xldmVsMywgZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tdG9wOiAwOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCit9DQorZGl2LnRvY2xldmVsMiB7DQorICBtYXJnaW4tbGVmdDogMmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsMyB7DQorICBtYXJnaW4tbGVmdDogNGVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tbGVmdDogNmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorDQorc3Bhbi5hcXVhIHsgY29sb3I6IGFxdWE7IH0NCitzcGFuLmJsYWNrIHsgY29sb3I6IGJsYWNrOyB9DQorc3Bhbi5ibHVlIHsgY29sb3I6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEgeyBjb2xvcjogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheSB7IGNvbG9yOiBncmF5OyB9DQorc3Bhbi5ncmVlbiB7IGNvbG9yOiBncmVlbjsgfQ0KK3NwYW4ubGltZSB7IGNvbG9yOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24geyBjb2xvcjogbWFyb29uOyB9DQorc3Bhbi5uYXZ5IHsgY29sb3I6IG5hdnk7IH0NCitzcGFuLm9saXZlIHsgY29sb3I6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUgeyBjb2xvcjogcHVycGxlOyB9DQorc3Bhbi5yZWQgeyBjb2xvcjogcmVkOyB9DQorc3Bhbi5zaWx2ZXIgeyBjb2xvcjogc2lsdmVyOyB9DQorc3Bhbi50ZWFsIHsgY29sb3I6IHRlYWw7IH0NCitzcGFuLndoaXRlIHsgY29sb3I6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3cgeyBjb2xvcjogeWVsbG93OyB9DQorDQorc3Bhbi5hcXVhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBhcXVhOyB9DQorc3Bhbi5ibGFjay1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmxhY2s7IH0NCitzcGFuLmJsdWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyYXk7IH0NCitzcGFuLmdyZWVuLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmVlbjsgfQ0KK3NwYW4ubGltZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbGltZTsgfQ0KK3NwYW4ubWFyb29uLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBtYXJvb247IH0NCitzcGFuLm5hdnktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG5hdnk7IH0NCitzcGFuLm9saXZlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBwdXJwbGU7IH0NCitzcGFuLnJlZC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcmVkOyB9DQorc3Bhbi5zaWx2ZXItYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogdGVhbDsgfQ0KK3NwYW4ud2hpdGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3ctYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYmlnIHsgZm9udC1zaXplOiAyZW07IH0NCitzcGFuLnNtYWxsIHsgZm9udC1zaXplOiAwLjZlbTsgfQ0KKw0KK3NwYW4udW5kZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0NCitzcGFuLm92ZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsgfQ0KK3NwYW4ubGluZS10aHJvdWdoIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IH0NCisNCitkaXYudW5icmVha2FibGUgeyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0NCisNCisNCisvKg0KKyAqIHhodG1sMTEgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorZGl2LnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZSB7DQorICBib3JkZXI6IDNweCBzb2xpZCAjNTI3YmJkOw0KK30NCit0aGVhZCwgcC50YWJsZS5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZSB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisvKiBCZWNhdXNlIHRoZSB0YWJsZSBmcmFtZSBhdHRyaWJ1dGUgaXMgb3ZlcnJpZGVuIGJ5IENTUyBpbiBtb3N0IGJyb3dzZXJzLiAqLw0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZvaWQiXSB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9ImhzaWRlcyJdIHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2c2lkZXMiXSB7DQorICBib3JkZXItdG9wLXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsNCit9DQorDQorDQorLyoNCisgKiBodG1sNSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK3RoZWFkLCBwLnRhYmxlYmxvY2suaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogM3B4Ow0KKyAgYm9yZGVyLXNwYWNpbmc6IDBweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KK30NCit0aC50YWJsZWJsb2NrLCB0ZC50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogMXB4Ow0KKyAgcGFkZGluZzogNHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCit9DQorDQordGFibGUudGFibGVibG9jay5mcmFtZS10b3Bib3Qgew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXNpZGVzIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1ub25lIHsNCisgIGJvcmRlci1zdHlsZTogaGlkZGVuOw0KK30NCisNCit0aC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0IHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciwgdGQudGFibGVibG9jay5oYWxpZ24tY2VudGVyIHsNCisgIHRleHQtYWxpZ246IGNlbnRlcjsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tcmlnaHQsIHRkLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0IHsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCit0aC50YWJsZWJsb2NrLnZhbGlnbi10b3AsIHRkLnRhYmxlYmxvY2sudmFsaWduLXRvcCB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUsIHRkLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20sIHRkLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOw0KK30NCisNCisNCisvKg0KKyAqIG1hbnBhZ2Ugc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorYm9keS5tYW5wYWdlIGgxIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitib2R5Lm1hbnBhZ2UgaDIgew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitib2R5Lm1hbnBhZ2UgZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAzZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICBib2R5Lm1hbnBhZ2UgZGl2I3RvYyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorDQorPC9zdHlsZT4NCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQorLyo8IVtDREFUQVsqLw0KK3ZhciBhc2NpaWRvYyA9IHsgIC8vIE5hbWVzcGFjZS4NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBUYWJsZSBPZiBDb250ZW50cyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBBdXRob3I6IE1paGFpIEJhem9uLCBTZXB0ZW1iZXIgMjAwMg0KKyAqIGh0dHA6Ly9zdHVkZW50cy5pbmZvaWFzaS5yby9+bWlzaG9vDQorICoNCisgKiBUYWJsZSBPZiBDb250ZW50IGdlbmVyYXRvcg0KKyAqIFZlcnNpb246IDAuNA0KKyAqDQorICogRmVlbCBmcmVlIHRvIHVzZSB0aGlzIHNjcmlwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYw0KKyAqIExpY2Vuc2UsIGFzIGxvbmcgYXMgeW91IGRvIG5vdCByZW1vdmUgb3IgYWx0ZXIgdGhpcyBub3RpY2UuDQorICovDQorDQorIC8qIG1vZGlmaWVkIGJ5IFRyb3kgRC4gSGFuc29uLCBTZXB0ZW1iZXIgMjAwNi4gTGljZW5zZTogR1BMICovDQorIC8qIG1vZGlmaWVkIGJ5IFN0dWFydCBSYWNraGFtLCAyMDA2LCAyMDA5LiBMaWNlbnNlOiBHUEwgKi8NCisNCisvLyB0b2NsZXZlbHMgPSAxLi40Lg0KK3RvYzogZnVuY3Rpb24gKHRvY2xldmVscykgew0KKw0KKyAgZnVuY3Rpb24gZ2V0VGV4dChlbCkgew0KKyAgICB2YXIgdGV4dCA9ICIiOw0KKyAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgIGlmIChpLm5vZGVUeXBlID09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIC8vIElFIGRvZXNuJ3Qgc3BlYWsgY29uc3RhbnRzLg0KKyAgICAgICAgdGV4dCArPSBpLmRhdGE7DQorICAgICAgZWxzZSBpZiAoaS5maXJzdENoaWxkICE9IG51bGwpDQorICAgICAgICB0ZXh0ICs9IGdldFRleHQoaSk7DQorICAgIH0NCisgICAgcmV0dXJuIHRleHQ7DQorICB9DQorDQorICBmdW5jdGlvbiBUb2NFbnRyeShlbCwgdGV4dCwgdG9jbGV2ZWwpIHsNCisgICAgdGhpcy5lbGVtZW50ID0gZWw7DQorICAgIHRoaXMudGV4dCA9IHRleHQ7DQorICAgIHRoaXMudG9jbGV2ZWwgPSB0b2NsZXZlbDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIHRvY0VudHJpZXMoZWwsIHRvY2xldmVscykgew0KKyAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5Ow0KKyAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdbaEhdKFsxLScrKHRvY2xldmVscysxKSsnXSknKTsNCisgICAgLy8gRnVuY3Rpb24gdGhhdCBzY2FucyB0aGUgRE9NIHRyZWUgZm9yIGhlYWRlciBlbGVtZW50cyAodGhlIERPTTINCisgICAgLy8gbm9kZUl0ZXJhdG9yIEFQSSB3b3VsZCBiZSBhIGJldHRlciB0ZWNobmlxdWUgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgYWxsDQorICAgIC8vIGJyb3dzZXJzKS4NCisgICAgdmFyIGl0ZXJhdGUgPSBmdW5jdGlvbiAoZWwpIHsNCisgICAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykgew0KKyAgICAgICAgICB2YXIgbW8gPSByZS5leGVjKGkudGFnTmFtZSk7DQorICAgICAgICAgIGlmIChtbyAmJiAoaS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgaS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpKSAhPSAiZmxvYXQiKSB7DQorICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbmV3IFRvY0VudHJ5KGksIGdldFRleHQoaSksIG1vWzFdLTEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGl0ZXJhdGUoaSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGl0ZXJhdGUoZWwpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgdmFyIHRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b2MiKTsNCisgIGlmICghdG9jKSB7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIC8vIERlbGV0ZSBleGlzdGluZyBUT0MgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgVE9DLg0KKyAgdmFyIHRvY0VudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgdmFyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gdG9jLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCgvXnRvY2xldmVsLykpDQorICAgICAgdG9jRW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IHRvY0VudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICB0b2MucmVtb3ZlQ2hpbGQodG9jRW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgVE9DIGVudHJpZXMuDQorICB2YXIgZW50cmllcyA9IHRvY0VudHJpZXMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKSwgdG9jbGV2ZWxzKTsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KKyAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2ldOw0KKyAgICBpZiAoZW50cnkuZWxlbWVudC5pZCA9PSAiIikNCisgICAgICBlbnRyeS5lbGVtZW50LmlkID0gIl90b2NfIiArIGk7DQorICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOw0KKyAgICBhLmhyZWYgPSAiIyIgKyBlbnRyeS5lbGVtZW50LmlkOw0KKyAgICBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVudHJ5LnRleHQpKTsNCisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KKyAgICBkaXYuYXBwZW5kQ2hpbGQoYSk7DQorICAgIGRpdi5jbGFzc05hbWUgPSAidG9jbGV2ZWwiICsgZW50cnkudG9jbGV2ZWw7DQorICAgIHRvYy5hcHBlbmRDaGlsZChkaXYpOw0KKyAgfQ0KKyAgaWYgKGVudHJpZXMubGVuZ3RoID09IDApDQorICAgIHRvYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYyk7DQorfSwNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBGb290bm90ZXMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQmFzZWQgb24gZm9vdG5vdGUgZ2VuZXJhdGlvbiBjb2RlIGZyb206DQorICogaHR0cDovL3d3dy5icmFuZHNwYW5raW5nbmV3Lm5ldC9hcmNoaXZlLzIwMDUvMDcvZm9ybWF0X2Zvb3Rub3RlLmh0bWwNCisgKi8NCisNCitmb290bm90ZXM6IGZ1bmN0aW9uICgpIHsNCisgIC8vIERlbGV0ZSBleGlzdGluZyBmb290bm90ZSBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBmb290bm9kZXMuDQorICB2YXIgaTsNCisgIHZhciBub3RlaG9sZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvb3Rub3RlcyIpOw0KKyAgaWYgKCFub3RlaG9sZGVyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHZhciBlbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIGZvciAoaSA9IDA7IGkgPCBub3RlaG9sZGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gbm90ZWhvbGRlci5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2JyAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gImZvb3Rub3RlIikNCisgICAgICBlbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgZW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIG5vdGVob2xkZXIucmVtb3ZlQ2hpbGQoZW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgZm9vdG5vdGUgZW50cmllcy4NCisgIHZhciBjb250ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKTsNCisgIHZhciBzcGFucyA9IGNvbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCisgIHZhciByZWZzID0ge307DQorICB2YXIgbiA9IDA7DQorICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZSIpIHsNCisgICAgICBuKys7DQorICAgICAgdmFyIG5vdGUgPSBzcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIpOw0KKyAgICAgIGlmICghbm90ZSkgew0KKyAgICAgICAgLy8gVXNlIFtcc1xTXSBpbiBwbGFjZSBvZiAuIHNvIG11bHRpLWxpbmUgbWF0Y2hlcyB3b3JrLg0KKyAgICAgICAgLy8gQmVjYXVzZSBKYXZhU2NyaXB0IGhhcyBubyBzIChkb3RhbGwpIHJlZ2V4IGZsYWcuDQorICAgICAgICBub3RlID0gc3BhbnNbaV0uaW5uZXJIVE1MLm1hdGNoKC9ccypcWyhbXHNcU10qKV1ccyovKVsxXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaWQ9J19mb290bm90ZXJlZl8iICsgbiArICInIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgICBzcGFuc1tpXS5zZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIsIG5vdGUpOw0KKyAgICAgIH0NCisgICAgICBub3RlaG9sZGVyLmlubmVySFRNTCArPQ0KKyAgICAgICAgIjxkaXYgY2xhc3M9J2Zvb3Rub3RlJyBpZD0nX2Zvb3Rub3RlXyIgKyBuICsgIic+IiArDQorICAgICAgICAiPGEgaHJlZj0nI19mb290bm90ZXJlZl8iICsgbiArICInIHRpdGxlPSdSZXR1cm4gdG8gdGV4dCc+IiArDQorICAgICAgICBuICsgIjwvYT4uICIgKyBub3RlICsgIjwvZGl2PiI7DQorICAgICAgdmFyIGlkID1zcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7DQorICAgICAgaWYgKGlkICE9IG51bGwpIHJlZnNbIiMiK2lkXSA9IG47DQorICAgIH0NCisgIH0NCisgIGlmIChuID09IDApDQorICAgIG5vdGVob2xkZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub3RlaG9sZGVyKTsNCisgIGVsc2Ugew0KKyAgICAvLyBQcm9jZXNzIGZvb3Rub3RlcmVmcy4NCisgICAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZXJlZiIpIHsNCisgICAgICAgIHZhciBocmVmID0gc3BhbnNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsNCisgICAgICAgIGhyZWYgPSBocmVmLm1hdGNoKC8jLiovKVswXTsgIC8vIEJlY2F1c2UgSUUgcmV0dXJuIGZ1bGwgVVJMLg0KKyAgICAgICAgbiA9IHJlZnNbaHJlZl07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfSwNCisNCitpbnN0YWxsOiBmdW5jdGlvbih0b2NsZXZlbHMpIHsNCisgIHZhciB0aW1lcklkOw0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsKCkgew0KKyAgICBhc2NpaWRvYy5mb290bm90ZXMoKTsNCisgICAgaWYgKHRvY2xldmVscykgew0KKyAgICAgIGFzY2lpZG9jLnRvYyh0b2NsZXZlbHMpOw0KKyAgICB9DQorICB9DQorDQorICBmdW5jdGlvbiByZWluc3RhbGxBbmRSZW1vdmVUaW1lcigpIHsNCisgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsNCisgICAgcmVpbnN0YWxsKCk7DQorICB9DQorDQorICB0aW1lcklkID0gc2V0SW50ZXJ2YWwocmVpbnN0YWxsLCA1MDApOw0KKyAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpDQorICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCByZWluc3RhbGxBbmRSZW1vdmVUaW1lciwgZmFsc2UpOw0KKyAgZWxzZQ0KKyAgICB3aW5kb3cub25sb2FkID0gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXI7DQorfQ0KKw0KK30NCithc2NpaWRvYy5pbnN0YWxsKCk7DQorLypdXT4qLw0KKzwvc2NyaXB0Pg0KKzwvaGVhZD4NCis8Ym9keSBjbGFzcz0ibWFucGFnZSI+DQorPGRpdiBpZD0iaGVhZGVyIj4NCis8aDE+DQorcHhlbGludXgoMSkgTWFudWFsIFBhZ2UNCis8L2gxPg0KKzxoMj5OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPHA+cHhlbGludXggLQ0KKyAgIFRoZSBTeXNsaW51eCBkZXJpdmF0aXZlIFBYRUxJTlVYIGZvciBQWEUgbmV0d29yayBib290aW5nDQorPC9wPg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImNvbnRlbnQiPg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9zeW5vcHNpcyI+U1lOT1BTSVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJ2ZXJzZWJsb2NrIj4NCis8cHJlIGNsYXNzPSJjb250ZW50Ij5weGVsaW51eC4wPC9wcmU+DQorPGRpdiBjbGFzcz0iYXR0cmlidXRpb24iPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9kZXNjcmlwdGlvbiI+REVTQ1JJUFRJT048L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gaXMgYSBTeXNsaW51eCBkZXJpdmF0aXZlLCBmb3IgYm9vdGluZyBMaW51eCBvZmYgYSBuZXR3b3JrDQorc2VydmVyLCB1c2luZyBhIG5ldHdvcmsgUk9NIGNvbmZvcm1pbmcgdG8gdGhlIEludGVsIFBYRSAoUHJlLUV4ZWN1dGlvbg0KK0Vudmlyb25tZW50KSBzcGVjaWZpY2F0aW9uLiAgPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiBpcyA8ZW0+Km5vdCo8L2VtPiBhIHByb2dyYW0gdGhhdCBpcw0KK2ludGVuZGVkIHRvIGJlIGZsYXNoZWQgb3IgYnVybmVkIGludG8gYSBQUk9NIG9uIHRoZSBuZXR3b3JrIGNhcmQ7IGlmDQoreW91IHdhbnQgdGhhdCwgY2hlY2sgb3V0IEV0aGVyYm9vdCAoPGEgaHJlZj0iaHR0cDovL3d3dy5ldGhlcmJvb3Qub3JnLyI+aHR0cDovL3d3dy5ldGhlcmJvb3Qub3JnLzwvYT4pLg0KK0V0aGVyYm9vdCA1LjQgb3IgbGF0ZXIgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgYSBQWEUtY29tcGxpYW50IGJvb3QNCitQUk9NIGZvciBtYW55IG5ldHdvcmsgY2FyZHMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+UFhFTElOVVggZ2VuZXJhbGx5IHJlcXVpcmVzIHRoYXQgZnVsbCBmaWxlIHBhdGhuYW1lcyBhcmUgMTI3IGNoYXJhY3RlcnMgb3Igc2hvcnRlciBpbiBsZW5ndGguPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9jdXJyZW50X2RpcmVjdG9yeSI+Q1VSUkVOVCBESVJFQ1RPUlk8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSBpbml0aWFsIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgZWl0aGVyIGFzIHN1cHBsaWVkIGJ5IERIQ1ANCitvcHRpb24gMjEwIChweGVsaW51eC5wYXRocHJlZml4KSwgdGhlIGhhcmRjb2RlZCBwYXRoLXByZWZpeCBvciB0aGUNCitwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBQWEVMSU5VWCBmaWxlLCBhcyBpbmRpY2F0ZWQgYnkgREhDUCBmaWVsZHMNCis8ZW0+c25hbWU8L2VtPiBhbmQgPGVtPmZpbGU8L2VtPiAoc25hbWU9IjE5Mi4xNjguMi4zIiBhbmQgZmlsZT0iYm9vdC9weGVsaW51eC4wIg0KK3Jlc3VsdHMgaW4gInRmdHA6Ly8xOTIuMTY4LjIuMy9ib290LyIsICIxOTIuMTY4LjIuMzo6Ym9vdC8iIGluIG9sZGVyDQorUFhFTElOVVggZm9ybWF0KSB3aXRoIHByZWNlZGVuY2Ugc3BlY2lmaWVkIHVuZGVyIDxzdHJvbmc+T1BUSU9OUzwvc3Ryb25nPi48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5BbGwgdW5xdWFsaWZpZWQgZmlsZW5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9jb25maWd1cmF0aW9uIj5DT05GSUdVUkFUSU9OPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5TZWUgPHN0cm9uZz5zeXNsaW51eC5jZmc8L3N0cm9uZz4oNSkgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIGNvbnRlbnRzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkJlY2F1c2UgbW9yZSB0aGFuIG9uZSBzeXN0ZW0gbWF5IGJlIGJvb3RlZCBmcm9tIHRoZSBzYW1lIHNlcnZlciwgdGhlDQorY29uZmlndXJhdGlvbiBmaWxlIG5hbWUgZGVwZW5kcyBvbiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgYm9vdGluZw0KK21hY2hpbmUuICBBZnRlciBhdHRlbXB0aW5nIHRoZSBmaWxlIGFzIHNwZWNpZmllZCBpbiB0aGUgREhDUCBvcg0KK2hhcmRjb2RlZCBvcHRpb25zLCBQWEVMSU5VWCB3aWxsIHByb2JlIHRoZSBmb2xsb3dpbmcgcGF0aHMsIHByZWZpeGVkDQord2l0aCAicHhlbGludXguY2ZnLyIsIHVuZGVyIHRoZSBpbml0aWFsIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InVsaXN0Ij48dWw+DQorPGxpPg0KKzxwPg0KK1RoZSBjbGllbnQgVVVJRCBpZiBwcm92aWRlZCBieSB0aGUgUFhFIHN0YWNrIChub3RlLCBzb21lIEJJT1NlcyBkb24mIzgyMTc7dA0KK2hhdmUgYSB2YWxpZCBVVUlELCBhbmQgeW91IG1pZ2h0IGVuZCB1cCB3aXRoIHNvbWV0aGluZyBsaWtlIGFsbCAxJiM4MjE3O3MuKQ0KK1RoaXMgaXMgaW4gdGhlIHN0YW5kYXJkIFVVSUQgZm9ybWF0IHVzaW5nIGxvd2VyIGNhc2UgaGV4YWRlY2ltYWwgZGlnaXRzLA0KK2UuZy4gYjg5NDU5MDgtZDZhNi00MWE5LTYxMWQtNzRhNmFiODBiODNkLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitUaGUgaGFyZHdhcmUgdHlwZSAodXNpbmcgaXRzIEFSUCB0eXBlIGNvZGUpIGFuZCBhZGRyZXNzLCBhbGwgaW4gbG93ZXINCitjYXNlIGhleGFkZWNpbWFsIHdpdGggZGFzaCBzZXBhcmF0b3JzOyBmb3IgZXhhbXBsZSwgZm9yIGFuIEV0aGVybmV0IChBUlANCit0eXBlIDEpIHdpdGggYWRkcmVzcyA4ODo5OTpBQTpCQjpDQzpERCBpdCB3b3VsZCBzZWFyY2ggZm9yIHRoZSBmaWxlbmFtZQ0KKzAxLTg4LTk5LWFhLWJiLWNjLWRkLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitUaGUgY2xpZW50JiM4MjE3O3MgSVB2NCBhZGRyZXNzIGluIHVwcGVyLWNhc2UgaGV4aWRlY2ltYWwgKGllIDE5Mi4xNjguMi45MQ0KKyYjODU5NDsgQzBBODAyNUI7IHlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlZCBwcm9nYW0gImdldGhvc3RpcCIgdG8gY29tcHV0ZSB0aGUNCitoZXhhZGVjaW1hbCBJUCBhZGRyZXNzIGZvciBhbnkgaG9zdC4pIGZvbGxvd2VkIGJ5IHJlbW92aW5nIGNoYXJhY3RlcnMsDQorb25lIGF0IGEgdGltZSwgZnJvbSB0aGUgZW5kLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCisiZGVmYXVsdCINCis8L3A+DQorPC9saT4NCis8L3VsPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U3RhcnRpbmcgaW4gcmVsZWFzZSAzLjIwLCBpZiBQWEVMSU5VWCBjYW4gbm90IGZpbmQgYSBjb25maWd1cmF0aW9uIGZpbGUsDQoraXQgd2lsbCByZWJvb3QgYWZ0ZXIgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgaGFzIGV4cGlyZWQuICBUaGlzIGtlZXBzIGENCittYWNoaW5lIGZyb20gZ2V0dGluZyBzdHVjayBpbmRlZmluaXRlbHkgZHVlIHRvIGEgYm9vdCBzZXJ2ZXIgZmFpbHVyZS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX29wdGlvbnMiPk9QVElPTlM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gKHN0YXJ0aW5nIHdpdGggdmVyc2lvbiAxLjYyKSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nDQorbm9uc3RhbmRhcmQgREhDUCBvcHRpb25zLCB3aGljaCBkZXBlbmRpbmcgb24geW91ciBESENQIHNlcnZlciB5b3UgbWF5IGJlDQorYWJsZSB0byB1c2UgdG8gY3VzdG9taXplIHRoZSBzcGVjaWZpYyBiZWhhdmlvdXIgb2YgPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPi4gIFNlZSBSRkMNCis1MDcxIGZvciBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2Ugb3B0aW9ucy4gT3B0aW9ucyBmb3INCis8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IGNhbiBiZSBzcGVjaWZpZWQgYnkgREhDUCBvcHRpb25zIG9yIGhhcmRjb2RlZCBpbnRvIHRoZQ0KK2JpbmFyeS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX29wdGlvbl9wcmlvcml0eSI+T3B0aW9uIFByaW9yaXR5PC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkhhcmRjb2RlZCBhZnRlci1vcHRpb25zIGFyZSBhcHBsaWVkIGFmdGVyIERIQ1Agb3B0aW9ucyAoYW5kIG92ZXJycmlkZSkNCit3aGlsZSBoYXJkY29kZWQgYmVmb3JlLW9wdGlvbnMgYXJlIGFwcGxpZWQgcHJpb3IgdG8gREhDUCBvcHRpb25zIGFuZA0KK2RlZmF1bHQgYmVoYXZpb3IgdGFrZXMgdGhlIGxvd2VzdCBwcmlvcml0eS48L3A+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2RoY3Bfb3B0aW9ucyI+REhDUCBvcHRpb25zPC9oMz4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5PcHRpb24gMjA4PC9zdHJvbmc+IChweGVsaW51eC5tYWdpYykNCis8L2R0Pg0KKzxkZD4NCis8cD4NCitFYXJsaWVyIHZlcnNpb25zIG9mIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gcmVxdWlyZWQgdGhpcyB0byBiZSBzZXQgdG8gRjE6MDA6NzQ6N0UNCisoMjQxLjAuMTE2LjEyNikgZm9yIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gdG8gcmVjb2duaXplIGFueSBzcGVjaWFsIERIQ1Agb3B0aW9ucw0KK3doYXRzb2V2ZXIuICBBcyBvZiA8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IDMuNTUsIHRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIG5vDQorbG9uZ2VyIHJlcXVpcmVkLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5PcHRpb24gMjA5PC9zdHJvbmc+IChweGVsaW51eC5jb25maWdmaWxlKQ0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK1NwZWNpZmllcyB0aGUgaW5pdGlhbCA8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lIHdoaWNoIG1heSBiZQ0KK3F1YWxpZmllZCBvciB1bnF1YWxpZmllZC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+T3B0aW9uIDIxMDwvc3Ryb25nPiAocHhlbGludXgucGF0aHByZWZpeCkNCis8L2R0Pg0KKzxkZD4NCis8cD4NCitTcGVjaWZpZXMgdGhlIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gY29tbW9uIHBhdGggcHJlZml4LCBpbnN0ZWFkIG9mIGRlcml2aW5nIGl0IGZyb20NCit0aGUgYm9vdCBmaWxlIG5hbWUuICBUaGlzIGFsbW9zdCBjZXJ0YWlubHkgbmVlZHMgdG8gZW5kIGluIHdoYXRldmVyDQorY2hhcmFjdGVyIHRoZSBURlRQIHNlcnZlciBPUyB1c2VzIGFzIGEgcGF0aG5hbWUgc2VwYXJhdG9yLCBlLmcuIHNsYXNoDQorKC8pIGZvciBVbml4Lg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5PcHRpb24gMjExPC9zdHJvbmc+IChweGVsaW51eC5yZWJvb3R0aW1lKQ0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK1NwZWNpZmllcywgaW4gc2Vjb25kcywgdGhlIHRpbWUgdG8gd2FpdCBiZWZvcmUgcmVib290IGluIHRoZSBldmVudCBvZg0KK1RGVFAgZmFpbHVyZS4gIDAgbWVhbnMgd2FpdCAiZm9yZXZlciIgKGluIHJlYWxpdHksIGl0IHdhaXRzDQorYXBwcm94aW1hdGVseSAxMzYgeWVhcnMuKQ0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2hhcmRjb2RlZF9vcHRpb25zIj5IYXJkY29kZWQgb3B0aW9uczwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5TaW5jZSB2ZXJzaW9uIDMuODMsIHRoZSBwcm9ncmFtICJweGVsaW51eC1vcHRpb25zIiBjYW4gYmUgdXNlZCB0bw0KK2hhcmQtY29kZSBESENQIG9wdGlvbnMgaW50byB0aGUgcHhlbGludXguMCBpbWFnZSBmaWxlOyB0aGlzIGlzDQorc29tZXRpbWVzIHVzZWZ1bCB3aGVuIHRoZSBESENQIHNlcnZlciBpcyB1bmRlciBkaWZmZXJlbnQNCithZG1pbmlzdHJhdGl2ZSBjb250cm9sLiAgSGFyZGNvZGVkIG9wdGlvbnM8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiAgNiA9Jmd0OyAnZG9tYWluLW5hbWUtc2VydmVycycsDQorIDE1ID0mZ3Q7ICdkb21haW4tbmFtZScsDQorIDU0ID0mZ3Q7ICduZXh0LXNlcnZlcicsDQorMjA5ID0mZ3Q7ICdjb25maWctZmlsZScsDQorMjEwID0mZ3Q7ICdwYXRoLXByZWZpeCcsDQorMjExID0mZ3Q7ICdyZWJvb3R0aW1lJzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfaHR0cF9mdHAiPkhUVFAvRlRQPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5TaW5jZSB2ZXJzaW9uIDUuMTAsIGEgc3BlY2lhbCBQWEVMSU5VWCBiaW5hcnksIGxweGVsaW51eC4wLCBuYXRpdmVseQ0KK3N1cHBvcnRzIEhUVFAgYW5kIEZUUCB0cmFuc2ZlcnMsIGdyZWF0bHkgaW5jcmVhc2luZyBsb2FkIHNwZWVkIGFuZA0KK2FsbG93aW5nIGZvciBzdGFuZGFyZCBIVFRQIHNjcmlwdHMgdG8gcHJlc2VudCBQWEVMSU5VWCYjODIxNztzIGNvbmZpZ3VyYXRpb24NCitmaWxlLiAgVG8gdXNlIGh0dHAgb3IgZnRwLCB1c2Ugc3RhbmRhcmQgVVJMIHN5bnRheCBhcyBmaWxlbmFtZTsgdXNlIHRoZQ0KK0RIQ1Agb3B0aW9ucyBiZWxvdyB0byB0cmFuc21pdCBhIHN1aXRhYmxlIFVSTCBwcmVmaXggdG8gdGhlIGNsaWVudCwgb3INCit1c2UgdGhlICJweGVsaW51eC1vcHRpb25zIiB0b29sIHByb3ZpZGVkIGluIHRoZSB1dGlscyBkaXJlY3RvcnkgdG8NCitwcm9ncmFtIGl0IGRpcmVjdGx5IGludG8gdGhlIGxweGVsaW51eC4wIGZpbGUuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9maWxlbmFtZV9zeW50YXgiPkZJTEVOQU1FIFNZTlRBWDwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+UFhFTElOVVggc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHBhdGhuYW1lIGNvbnZlbnRpb25zOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz46OmZpbGVuYW1lPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorU3VwcHJlc3NlcyB0aGUgY29tbW9uIGZpbGVuYW1lIHByZWZpeCwgaS5lLiBwYXNzZXMgdGhlIHN0cmluZyAiZmlsZW5hbWUiDQordW5tb2RpZmllZCB0byB0aGUgc2VydmVyLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5JUCBhZGRyZXNzOjpmaWxlbmFtZTwvc3Ryb25nPiAoZS5nLiAxOTIuMTY4LjIuMzo6ZmlsZW5hbWUpDQorPC9kdD4NCis8ZGQ+DQorPHA+DQorU3VwcHJlc3NlcyB0aGUgY29tbW9uIGZpbGVuYW1lIHByZWZpeCwgPHN0cm9uZz5hbmQ8L3N0cm9uZz4gc2VuZHMgYSByZXF1ZXN0IHRvIGFuIGFsdGVybmF0ZSBURlRQIHNlcnZlci4gIEluc3RlYWQgb2YgYW4gSVAgYWRkcmVzcywgYSBETlMgbmFtZSBjYW4gYmUgdXNlZC4gIEl0IHdpbGwgYmUgYXNzdW1lZCB0byBiZSBmdWxseSBxdWFsaWZpZWQgaWYgaXQgY29udGFpbnMgZG90czsgb3RoZXJ3aXNlIHRoZSBsb2NhbCBkb21haW4gYXMgcmVwb3J0ZWQgYnkgdGhlIERIQ1Agc2VydmVyIChvcHRpb24gMTUpIHdpbGwgYmUgYWRkZWQuDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjo6IHdhcyBjaG9zZW4gYmVjYXVzZSBpdCBpcyB1bmxpa2VseSB0byBjb25mbGljdCB3aXRoIG9wZXJhdGluZyBzeXN0ZW0NCit1c2FnZS4gIEhvd2V2ZXIsIGlmIHlvdSBoYXBwZW4gdG8gaGF2ZSBhbiBlbnZpcm9ubWVudCBmb3Igd2hpY2ggdGhlDQorc3BlY2lhbCB0cmVhdG1lbnQgb2YgOjogaXMgYSBwcm9ibGVtLCBwbGVhc2UgY29udGFjdCB0aGUgU3lzbGludXgNCittYWlsaW5nIGxpc3QuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U2luY2UgdmVyc2lvbiA0LjAwLCBQWEVMSU5VWCBhbHNvIHN1cHBvcnRzIHN0YW5kYXJkIFVSTCBzeW50YXguPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9rZWVwcHhlIj5LRUVQUFhFPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Ob3JtYWxseSwgUFhFTElOVVggd2lsbCB1bmxvYWQgdGhlIFBYRSBhbmQgVU5ESSBzdGFja3MgYmVmb3JlIGludm9raW5nDQordGhlIGtlcm5lbC4gIEluIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyAoZm9yIGV4YW1wbGUsIHdoZW4gdXNpbmcgTUVNRElTSw0KK3RvIGJvb3QgYW4gb3BlcmF0aW5nIHN5c3RlbSB3aXRoIGFuIFVOREkgbmV0d29yayBkcml2ZXIpIGl0IG1pZ2h0IGJlDQorZGVzaXJhYmxlIHRvIGtlZXAgdGhlIFBYRSBzdGFjayBpbiBtZW1vcnkuICBJZiB0aGUgb3B0aW9uICJrZWVwcHhlIg0KK2lzIGdpdmVuIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLCBQWEVMSU5VWCB3aWxsIGtlZXAgdGhlIFBYRSBhbmQNCitVTkRJIHN0YWNrcyBpbiBtZW1vcnkuICAoSWYgeW91IGRvbiYjODIxNzt0IGtub3cgd2hhdCB0aGlzIG1lYW5zLCB5b3UNCitwcm9iYWJseSBkb24mIzgyMTc7dCBuZWVkIGl0Lik8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2V4YW1wbGVzIj5FWEFNUExFUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9jb25maWd1cmF0aW9uX2ZpbGVuYW1lIj5Db25maWd1cmF0aW9uIGZpbGVuYW1lPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciBESENQIHNpYWRkciAxOTIuMTY4LjIuMywgZmlsZSA8ZW0+bXlib290ZGlyL3B4ZWxpbnV4LjA8L2VtPiwgY2xpZW50IFVVSUQNCitiODk0NTkwOC1kNmE2LTQxYTktNjExZC03NGE2YWI4MGI4M2QsIEV0aGVybmV0IE1BQyBhZGRyZXNzDQorODg6OTk6QUE6QkI6Q0M6REQgYW5kIElQdjQgYWRkcmVzcyAxOTIuMTY4LjIuOTEsIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4NCit0aGlzIG9yZGVyIHdpbGwgYmUgYXR0ZW1wdGVkIChhZnRlciBjb25maWctZmlsZSBvcHRpb25zKTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPm15Ym9vdGRpci9weGVsaW51eC5jZmcvYjg5NDU5MDgtZDZhNi00MWE5LTYxMWQtNzRhNmFiODBiODNkDQorbXlib290ZGlyL3B4ZWxpbnV4LmNmZy8wMS04OC05OS1hYS1iYi1jYy1kZA0KK215Ym9vdGRpci9weGVsaW51eC5jZmcvQzBBODAyNUINCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgwMjUNCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgwMg0KK215Ym9vdGRpci9weGVsaW51eC5jZmcvQzBBODANCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgNCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQQ0KK215Ym9vdGRpci9weGVsaW51eC5jZmcvQzANCitteWJvb3RkaXIvcHhlbGludXguY2ZnL0MNCitteWJvb3RkaXIvcHhlbGludXguY2ZnL2RlZmF1bHQ8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX3RmdHBfc2VydmVycyI+VEZUUCBzZXJ2ZXJzPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciBiZXN0IHJlc3VsdHMsIHVzZSBhIFRGVFAgc2VydmVyIHdoaWNoIHN1cHBvcnRzIHRoZSAidHNpemUiIFRGVFANCitvcHRpb24gKFJGQyAxNzg0L1JGQyAyMzQ5KS4gIFRoZSAidGZ0cC1ocGEiIFRGVFAgc2VydmVyLCB3aGljaCBzdXBwb3J0DQorb3B0aW9ucywgaXMgYXZhaWxhYmxlIGF0OjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9uZXR3b3JrL3RmdHAvDQorZnRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL25ldHdvcmsvdGZ0cC88L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5hbmQgb24gYW55IGtlcm5lbC5vcmcgbWlycm9yIChzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5rZXJuZWwub3JnL21pcnJvcnMvIj5odHRwOi8vd3d3Lmtlcm5lbC5vcmcvbWlycm9ycy88L2E+KS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Bbm90aGVyIFRGVFAgc2VydmVyIHdoaWNoIHN1cHBvcnRzIHRoaXMgaXMgYXRmdHAgYnkgSmVhbi1QaWVycmUNCitMZWZlYnZyZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmZ0cDovL2Z0cC5tYW1hbGludXguY29tL3B1Yi9hdGZ0cC88L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JZiB5b3VyIGJvb3Qgc2VydmVyIGlzIHJ1bm5pbmcgV2luZG93cyAoYW5kIHlvdSBjYW4mIzgyMTc7dCBmaXggdGhhdCksIHRyeQ0KK3RmdHBkMzIgYnkgUGhpbGlwcGUgSm91bmluICh5b3UgbmVlZCB2ZXJzaW9uIDIuMTEgb3IgbGF0ZXI7IHByZXZpb3VzDQordmVyc2lvbnMgaGFkIGEgYnVnIHdoaWNoIG1hZGUgaXQgaW5jb21wYXRpYmxlIHdpdGggUFhFTElOVVgpOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+aHR0cDovL3RmdHBkMzIuam91bmluLm5ldC88L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2RoY3BfY29uZmlnX3NpbXBsZSI+REhDUCBjb25maWc6IFNpbXBsZTwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgUFhFIHByb3RvY29sIHVzZXMgYSB2ZXJ5IGNvbXBsZXggc2V0IG9mIGV4dGVuc2lvbnMgdG8gREhDUCBvcg0KK0JPT1RQLiAgSG93ZXZlciwgbW9zdCBQWEUgaW1wbGVtZW50YXRpb25zJiM4MjAxOyYjODIxMjsmIzgyMDE7dGhpcyBpbmNsdWRlcyBhbGwgSW50ZWwNCitvbmVzIHZlcnNpb24gMC45OW4gYW5kIGxhdGVyJiM4MjAxOyYjODIxMjsmIzgyMDE7c2VlbSB0byBiZSBhYmxlIHRvIGJvb3QgaW4gYQ0KKyJjb252ZW50aW9uYWwiIERIQ1AvVEZUUCBjb25maWd1cmF0aW9uLiAgQXNzdW1pbmcgeW91IGRvbiYjODIxNzt0IGhhdmUgdG8NCitzdXBwb3J0IGFueSB2ZXJ5IG9sZCBvciBvdGhlcndpc2Ugc2V2ZXJlbHkgYnJva2VuIGNsaWVudHMsIHRoaXMgaXMNCitwcm9iYWJseSB0aGUgYmVzdCBjb25maWd1cmF0aW9uIHVubGVzcyB5b3UgYWxyZWFkeSBoYXZlIGEgUFhFIGJvb3QNCitzZXJ2ZXIgb24geW91ciBuZXR3b3JrLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkEgc2FtcGxlIERIQ1Agc2V0dXAsIHVzaW5nIHRoZSAiY29udmVudGlvbmFsIFRGVFAiIGNvbmZpZ3VyYXRpb24sDQord291bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nLCB1c2luZyBJU0MgZGhjcCAyLjAgZGhjcGQuY29uZg0KK3N5bnRheDo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmFsbG93IGJvb3Rpbmc7DQorYWxsb3cgYm9vdHA7DQorDQorIyBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4NCisNCitvcHRpb24gZG9tYWluLW5hbWUgIiZsdDtkb21haW4gbmFtZSZndDsiOw0KK29wdGlvbiBzdWJuZXQtbWFzayAmbHQ7c3VibmV0IG1hc2smZ3Q7Ow0KK29wdGlvbiBicm9hZGNhc3QtYWRkcmVzcyAmbHQ7YnJvYWRjYXN0IGFkZHJlc3MmZ3Q7Ow0KK29wdGlvbiBkb21haW4tbmFtZS1zZXJ2ZXJzICZsdDtkbnMgc2VydmVycyZndDs7DQorb3B0aW9uIHJvdXRlcnMgJmx0O2RlZmF1bHQgcm91dGVyJmd0OzsNCisNCisjIEdyb3VwIHRoZSBQWEUgYm9vdGFibGUgaG9zdHMgdG9nZXRoZXINCitncm91cCB7DQorICAgICAgICAjIFBYRS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4NCisgICAgICAgIG5leHQtc2VydmVyICZsdDtURlRQIHNlcnZlciBhZGRyZXNzJmd0OzsNCisgICAgICAgIGZpbGVuYW1lICIvdGZ0cGJvb3QvcHhlbGludXguMCI7DQorDQorICAgICAgICAjIFlvdSBuZWVkIGFuIGVudHJ5IGxpa2UgdGhpcyBmb3IgZXZlcnkgaG9zdA0KKyAgICAgICAgIyB1bmxlc3MgeW91J3JlIHVzaW5nIGR5bmFtaWMgYWRkcmVzc2VzDQorICAgICAgICBob3N0ICZsdDtob3N0bmFtZSZndDsgew0KKyAgICAgICAgICAgICAgICBoYXJkd2FyZSBldGhlcm5ldCAmbHQ7ZXRoZXJuZXQgYWRkcmVzcyZndDs7DQorICAgICAgICAgICAgICAgIGZpeGVkLWFkZHJlc3MgJmx0O2hvc3RuYW1lJmd0OzsNCisgICAgICAgIH0NCit9PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Tm90ZSB0aGF0IGlmIHlvdXIgcGFydGljdWxhciBURlRQIGRhZW1vbiBydW5zIHVuZGVyIGNocm9vdCAodGZ0cC1ocGENCit3aWxsIGRvIHRoaXMgaWYgeW91IHNwZWNpZnkgdGhlIC1zIChzZWN1cmUpIG9wdGlvbjsgdGhpcyBpcyBoaWdobHkNCityZWNvbW1lbmRlZCksIHlvdSBhbG1vc3QgY2VydGFpbmx5IHNob3VsZCBub3QgaW5jbHVkZSB0aGUgL3RmdHBib290DQorcHJlZml4IGluIHRoZSBmaWxlbmFtZSBzdGF0ZW1lbnQuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9kaGNwX2NvbmZpZ19weGVfMSI+REhDUCBDb25maWc6IFBYRS0xPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPklmIHRoZSBzaW1wbGUgY29uZmlnIGRvZXMgbm90IHdvcmsgZm9yIHlvdXIgZW52aXJvbm1lbnQsIHlvdSBwcm9iYWJseQ0KK3Nob3VsZCBzZXQgdXAgYSAiUFhFIGJvb3Qgc2VydmVyIiBvbiBwb3J0IDQwMTEgb2YgeW91ciBURlRQIHNlcnZlcjsgYQ0KK2ZyZWUgUFhFIGJvb3Qgc2VydmVyIGlzIGF2YWlsYWJsZSBhdDo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48YSBocmVmPSJodHRwOi8vd3d3Lmthbm8ub3JnLnVrL3Byb2plY3RzL3B4ZS8iPmh0dHA6Ly93d3cua2Fuby5vcmcudWsvcHJvamVjdHMvcHhlLzwvYT48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5XaXRoIHN1Y2ggYSBib290IHNlcnZlciBkZWZpbmVkLCB5b3VyIERIQ1AgY29uZmlndXJhdGlvbiBzaG91bGQgbG9vaw0KK3RoZSBzYW1lIGV4Y2VwdCBmb3IgYW4gIm9wdGlvbiBkaGNwLWNsYXNzLWlkZW50aWZpZXIiICgib3B0aW9uDQordmVuZG9yLWNsYXNzLWlkZW50aWZpZXIiIGlmIHlvdSBhcmUgdXNpbmcgREhDUCAzLjApOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+YWxsb3cgYm9vdGluZzsNCithbGxvdyBib290cDsNCisNCisjIFN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLg0KKw0KK29wdGlvbiBkb21haW4tbmFtZSAiJmx0O2RvbWFpbiBuYW1lJmd0OyI7DQorb3B0aW9uIHN1Ym5ldC1tYXNrICZsdDtzdWJuZXQgbWFzayZndDs7DQorb3B0aW9uIGJyb2FkY2FzdC1hZGRyZXNzICZsdDticm9hZGNhc3QgYWRkcmVzcyZndDs7DQorb3B0aW9uIGRvbWFpbi1uYW1lLXNlcnZlcnMgJmx0O2RucyBzZXJ2ZXJzJmd0OzsNCitvcHRpb24gcm91dGVycyAmbHQ7ZGVmYXVsdCByb3V0ZXImZ3Q7Ow0KKw0KKyMgR3JvdXAgdGhlIFBYRSBib290YWJsZSBob3N0cyB0b2dldGhlcg0KK2dyb3VwIHsNCisgICAgICAgICMgUFhFLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLg0KKyAgICAgICAgb3B0aW9uIGRoY3AtY2xhc3MtaWRlbnRpZmllciAiUFhFQ2xpZW50IjsNCisgICAgICAgIG5leHQtc2VydmVyICZsdDtweGUgYm9vdCBzZXJ2ZXIgYWRkcmVzcyZndDs7DQorDQorICAgICAgICAjIFlvdSBuZWVkIGFuIGVudHJ5IGxpa2UgdGhpcyBmb3IgZXZlcnkgaG9zdA0KKyAgICAgICAgIyB1bmxlc3MgeW91J3JlIHVzaW5nIGR5bmFtaWMgYWRkcmVzc2VzDQorICAgICAgICBob3N0ICZsdDtob3N0bmFtZSZndDsgew0KKyAgICAgICAgICAgICAgICBoYXJkd2FyZSBldGhlcm5ldCAmbHQ7ZXRoZXJuZXQgYWRkcmVzcyZndDs7DQorICAgICAgICAgICAgICAgIGZpeGVkLWFkZHJlc3MgJmx0O2hvc3RuYW1lJmd0OzsNCisgICAgICAgIH0NCit9PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SGVyZSwgdGhlIGJvb3QgZmlsZSBuYW1lIGlzIG9idGFpbmVkIGZyb20gdGhlIFBYRSBzZXJ2ZXIuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9kaGNwX2NvbmZpZ19lbmNhcHN1bGF0ZWQiPkRIQ1AgQ29uZmlnOiBFbmNhcHN1bGF0ZWQ8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgdGhlICJjb252ZW50aW9uYWwgVEZUUCIgY29uZmlndXJhdGlvbiBkb2VzbiYjODIxNzt0IHdvcmsgb24geW91ciBjbGllbnRzLA0KK2FuZCBzZXR0aW5nIHVwIGEgUFhFIGJvb3Qgc2VydmVyIGlzIG5vdCBhbiBvcHRpb24sIHlvdSBjYW4gYXR0ZW1wdCB0aGUNCitmb2xsb3dpbmcgY29uZmlndXJhdGlvbi4gIEl0IGhhcyBiZWVuIGtub3duIHRvIGJvb3Qgc29tZQ0KK2NvbmZpZ3VyYXRpb25zIGNvcnJlY3RseTsgaG93ZXZlciwgdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXM6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5hbGxvdyBib290aW5nOw0KK2FsbG93IGJvb3RwOw0KKw0KKyMgU3RhbmRhcmQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uDQorDQorb3B0aW9uIGRvbWFpbi1uYW1lICImbHQ7ZG9tYWluIG5hbWUmZ3Q7IjsNCitvcHRpb24gc3VibmV0LW1hc2sgJmx0O3N1Ym5ldCBtYXNrJmd0OzsNCitvcHRpb24gYnJvYWRjYXN0LWFkZHJlc3MgJmx0O2Jyb2FkY2FzdCBhZGRyZXNzJmd0OzsNCitvcHRpb24gZG9tYWluLW5hbWUtc2VydmVycyAmbHQ7ZG5zIHNlcnZlcnMmZ3Q7Ow0KK29wdGlvbiByb3V0ZXJzICZsdDtkZWZhdWx0IHJvdXRlciZndDs7DQorDQorIyBHcm91cCB0aGUgUFhFIGJvb3RhYmxlIGhvc3RzIHRvZ2V0aGVyDQorZ3JvdXAgew0KKyAgICAgICAgIyBQWEUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uDQorICAgICAgICBvcHRpb24gZGhjcC1jbGFzcy1pZGVudGlmaWVyICJQWEVDbGllbnQiOw0KKyAgICAgICAgb3B0aW9uIHZlbmRvci1lbmNhcHN1bGF0ZWQtb3B0aW9ucyAwOTowZjo4MDowMDowYzo0ZTo2NTo3NDo3Nzo2Zjo3Mjo2YjoyMDo2Mjo2Zjo2Zjo3NDowYTowNzowMDo1MDo3Mjo2Zjo2ZDo3MDo3NDowNjowMTowMjowODowMzo4MDowMDowMDo0NzowNDo4MDowMDowMDowMDpmZjsNCisgICAgICAgIG5leHQtc2VydmVyICZsdDtURlRQIHNlcnZlciZndDs7DQorICAgICAgICBmaWxlbmFtZSAiL3RmdHBib290L3B4ZWxpbnV4LjAiOw0KKw0KKyAgICAgICAgIyBZb3UgbmVlZCBhbiBlbnRyeSBsaWtlIHRoaXMgZm9yIGV2ZXJ5IGhvc3QNCisgICAgICAgICMgdW5sZXNzIHlvdSdyZSB1c2luZyBkeW5hbWljIGFkZHJlc3Nlcw0KKyAgICAgICAgaG9zdCAmbHQ7aG9zdG5hbWUmZ3Q7IHsNCisgICAgICAgICAgICAgICAgaGFyZHdhcmUgZXRoZXJuZXQgJmx0O2V0aGVybmV0IGFkZHJlc3MmZ3Q7Ow0KKyAgICAgICAgICAgICAgICBmaXhlZC1hZGRyZXNzICZsdDtob3N0bmFtZSZndDs7DQorICAgICAgICB9DQorfTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGUgdGhhdCB0aGlzIDxzdHJvbmc+d2lsbCBub3Q8L3N0cm9uZz4gYm9vdCBzb21lIGNsaWVudHMgdGhhdCA8c3Ryb25nPndpbGw8L3N0cm9uZz4gYm9vdCB3aXRoIHRoZQ0KKyJjb252ZW50aW9uYWwgVEZUUCIgY29uZmlndXJhdGlvbjsgSW50ZWwgQm9vdCBDbGllbnQgMy4wIGFuZCBsYXRlciBhcmUNCitrbm93biB0byBmYWxsIGludG8gdGhpcyBjYXRlZ29yeS48L3A+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2RoY3BfY29uZmlnX2lzY19kaGNwZF9vcHRpb25zIj5ESENQIENvbmZpZzogSVNDIGRoY3BkIG9wdGlvbnM8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SVNDIGRoY3AgMy4wIHN1cHBvcnRzIGEgcmF0aGVyIG5pY2Ugc3ludGF4IGZvciBzcGVjaWZ5aW5nIGN1c3RvbQ0KK29wdGlvbnM7IHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgc3ludGF4IGluIGRoY3BkLmNvbmYgaWYgeW91IGFyZQ0KK3J1bm5pbmcgdGhpcyB2ZXJzaW9uIG9mIGRoY3BkOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+b3B0aW9uIHNwYWNlIHB4ZWxpbnV4Ow0KK29wdGlvbiBweGVsaW51eC5tYWdpYyAgICAgIGNvZGUgMjA4ID0gc3RyaW5nOw0KK29wdGlvbiBweGVsaW51eC5jb25maWdmaWxlIGNvZGUgMjA5ID0gdGV4dDsNCitvcHRpb24gcHhlbGludXgucGF0aHByZWZpeCBjb2RlIDIxMCA9IHRleHQ7DQorb3B0aW9uIHB4ZWxpbnV4LnJlYm9vdHRpbWUgY29kZSAyMTEgPSB1bnNpZ25lZCBpbnRlZ2VyIDMyOzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+Tk9URTogSW4gZWFybGllciB2ZXJzaW9ucyBvZiBQWEVMSU5VWCwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgYXMgYQ0KKyJzaXRlLW9wdGlvbi1zcGFjZSIuICBTaW5jZSBQWEVMSU5VWCAyLjA3LCB0aGlzIHdpbGwgd29yayBib3RoIGFzIGENCisic2l0ZS1vcHRpb24tc3BhY2UiICh1bmVuY2Fwc3VsYXRlZCkgYW5kIGFzIGEgInZlbmRvci1vcHRpb24tc3BhY2UiDQorKHR5cGUgNDMgZW5jYXBzdWxhdGVkLikgIFRoaXMgbWF5IGF2b2lkIG1lc3Npbmcgd2l0aCB0aGUNCitkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QsIGFzIGRldGFpbGVkIGJlbG93LjwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZW4sIGluc2lkZSB5b3VyIFBYRUxJTlVYLWJvb3RpbmcgZ3JvdXAgb3IgY2xhc3MgKHdoZXJlZXZlciB5b3UgaGF2ZQ0KK3RoZSBQWEVMSU5VWC1yZWxhdGVkIG9wdGlvbnMsIHN1Y2ggYXMgdGhlIGZpbGVuYW1lIG9wdGlvbiksIHlvdSBjYW4NCithZGQsIGZvciBleGFtcGxlOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+IyBBbHdheXMgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGxpbmVzIGZvciBhbGwgUFhFTElOVVggY2xpZW50cw0KK3NpdGUtb3B0aW9uLXNwYWNlICJweGVsaW51eCI7DQorb3B0aW9uIHB4ZWxpbnV4Lm1hZ2ljIGYxOjAwOjc0OjdlOw0KK2lmIGV4aXN0cyBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3Qgew0KKyAgICAgICAgIyBBbHdheXMgc2VuZCB0aGUgUFhFTElOVVggb3B0aW9ucyAoc3BlY2lmaWVkIGluIGhleGFkZWNpbWFsKQ0KKyAgICAgICAgb3B0aW9uIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCA9IGNvbmNhdChvcHRpb24gZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0LGQwLGQxLGQyLGQzKTsNCit9DQorIyBUaGVzZSBsaW5lcyBzaG91bGQgYmUgY3VzdG9taXplZCB0byB5b3VyIHNldHVwDQorb3B0aW9uIHB4ZWxpbnV4LmNvbmZpZ2ZpbGUgImNvbmZpZ3MvY29tbW9uIjsNCitvcHRpb24gcHhlbGludXgucGF0aHByZWZpeCAiL3RmdHBib290L3B4ZWxpbnV4L2ZpbGVzLyI7DQorb3B0aW9uIHB4ZWxpbnV4LnJlYm9vdHRpbWUgMzA7DQorZmlsZW5hbWUgIi90ZnRwYm9vdC9weGVsaW51eC9weGVsaW51eC5iaW4iOzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGUgdGhhdCB0aGUgY29uZmlnZmlsZSBpcyByZWxhdGl2ZSB0byB0aGUgcGF0aHByZWZpeDogdGhpcyB3aWxsIGxvb2sNCitmb3IgYSBjb25maWcgZmlsZSBjYWxsZWQgL3RmdHBib290L3B4ZWxpbnV4L2ZpbGVzL2NvbmZpZ3MvY29tbW9uIG9uDQordGhlIFRGVFAgc2VydmVyLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSAib3B0aW9uIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCIgc3RhdGVtZW50IGZvcmNlcyB0aGUgREhDUA0KK3NlcnZlciB0byBzZW5kIHRoZSBQWEVMSU5VWC1zcGVjaWZpYyBvcHRpb25zLCBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QNCitleHBsaWNpdGx5IHJlcXVlc3RlZC4gIFNpbmNlIHRoZSBESENQIHJlcXVlc3QgaXMgZG9uZSBiZWZvcmUgUFhFTElOVVgNCitpcyBsb2FkZWQsIHRoZSBQWEUgY2xpZW50IHdvbiYjODIxNzt0IGtub3cgdG8gcmVxdWVzdCB0aGVtLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlVzaW5nIElTQyBkaGNwIDMuMCB5b3UgY2FuIGNyZWF0ZSBhIGxvdCBvZiB0aGVzZSBzdHJpbmdzIG9uIHRoZSBmbHkuDQorRm9yIGV4YW1wbGUsIHRvIHVzZSB0aGUgaGV4YWRlY2ltYWwgZm9ybSBvZiB0aGUgaGFyZHdhcmUgYWRkcmVzcyBhcw0KK3RoZSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSwgeW91IGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+c2l0ZS1vcHRpb24tc3BhY2UgInB4ZWxpbnV4IjsNCitvcHRpb24gcHhlbGludXgubWFnaWMgZjE6MDA6NzQ6N2U7DQoraWYgZXhpc3RzIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCB7DQorICAgICAgICAjIEFsd2F5cyBzZW5kIHRoZSBQWEVMSU5VWCBvcHRpb25zIChzcGVjaWZpZWQgaW4gaGV4YWRlY2ltYWwpDQorICAgICAgICBvcHRpb24gZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0ID0gY29uY2F0KG9wdGlvbiBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QsZDAsZDEsZDIsZDMpOw0KK30NCitvcHRpb24gcHhlbGludXguY29uZmlnZmlsZSA9DQorICAgICAgICBjb25jYXQoInB4ZWxpbnV4LmNmZy8iLCBiaW5hcnktdG8tYXNjaWkoMTYsIDgsICI6IiwgaGFyZHdhcmUpKTsNCitmaWxlbmFtZSAiL3RmdHBib290L3B4ZWxpbnV4LmJpbiI7PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgeW91IHVzZWQgdGhpcyBmcm9tIGEgY2xpZW50IHdob3NlIEV0aGVybmV0IGFkZHJlc3Mgd2FzDQorNTg6RkE6ODQ6Q0Y6NTU6MEUsIHRoaXMgd291bGQgbG9vayBmb3IgYSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZWQNCisiL3RmdHBib290L3B4ZWxpbnV4LmNmZy8xOjU4OmZhOjg0OmNmOjU1OmUiLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfa25vd25faXNzdWVzIj5LTk9XTiBJU1NVRVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSBmb2xsb3dpbmcgcHJvYmxlbXMgYXJlIGtub3duIHdpdGggUFhFTElOVVgsIHNvIGZhcjo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0idWxpc3QiPjx1bD4NCis8bGk+DQorPHA+DQorVGhlIGVycm9yIHJlY292ZXJ5IHJvdXRpbmUgZG9lc24mIzgyMTc7dCB3b3JrIHF1aXRlIHJpZ2h0LiAgRm9yIHJpZ2h0IG5vdywNCisgIGl0IGp1c3QgZG9lcyBhIGhhcmQgcmVzZXQgLSBzZWVtcyBnb29kIGVub3VnaC4NCis8L3A+DQorPC9saT4NCis8bGk+DQorPHA+DQorV2Ugc2hvdWxkIHByb2JhYmx5IGNhbGwgdGhlIFVEUCByZWNlaXZlIGZ1bmN0aW9uIGluIHRoZSBrZXlib2FyZA0KKyAgZW50cnkgbG9vcCwgc28gdGhhdCB3ZSBhbnN3ZXIgQVJQIHJlcXVlc3RzLg0KKzwvcD4NCis8L2xpPg0KKzxsaT4NCis8cD4NCitCb290IHNlY3RvcnMvZGlzayBpbWFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Lg0KKzwvcD4NCis8L2xpPg0KKzwvdWw+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JZiB5b3UgaGF2ZSBhZGRpdGlvbmFsIHByb2JsZW1zLCBwbGVhc2UgY29udGFjdCB0aGUgU3lzbGludXggbWFpbGluZw0KK2xpc3QgKHNlZSBzeXNsaW51eC50eHQgZm9yIHRoZSBhZGRyZXNzLik8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2Jyb2tlbl9weGVfc3RhY2tzIj5Ccm9rZW4gUFhFIHN0YWNrczwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Mb3RzIG9mIFBYRSBzdGFja3MsIGVzcGVjaWFsbHkgb2xkIG9uZXMsIGhhdmUgdmFyaW91cyBwcm9ibGVtcyBvZg0KK3ZhcnlpbmcgZGVncmVlcyBvZiBzZXZlcml0eS4gIFBsZWFzZSBzZWU6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5odHRwOi8vc3lzbGludXguenl0b3IuY29tL2hhcmR3YXJlLnBocDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJvbGlzdCBsb3dlcnJvbWFuIj48b2wgY2xhc3M9Imxvd2Vycm9tYW4iPg0KKzxsaT4NCis8cD4NCitmb3IgYSBsaXN0IG9mIGN1cnJlbnRseSBrbm93biBoYXJkd2FyZSBwcm9ibGVtcywgd2l0aCB3b3JrYXJvdW5kcw0KK2lmIGtub3duLg0KKzwvcD4NCis8L2xpPg0KKzwvb2w+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGVyZSBhcmUgYSBudW1iZXIgb2YgZXh0cmVtZWx5IGJyb2tlbiBQWEUgc3RhY2tzIGluIHRoZSBmaWVsZC4gIFRoZQ0KK2dQWEUgcHJvamVjdCAoZm9ybWVybHkga25vd24gYXMgRXRoZXJib290KSBwcm92aWRlcyBhbiBvcGVuLXNvdXJjZSBQWEUNCitzdGFjayB0aGF0IHdvcmtzIHdpdGggYSBudW1iZXIgb2YgY2FyZHMsIGFuZCB3aGljaCBjYW4gYmUgbG9hZGVkIGZyb20NCithIENELVJPTSwgVVNCIGtleSwgb3IgZmxvcHB5IGlmIGRlc2lyZWQuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SW5mb3JtYXRpb24gb24gZ1BYRSBpcyBhdmFpbGFibGUgZnJvbTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy88L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0ib2xpc3QgbG93ZXJyb21hbiI+PG9sIGNsYXNzPSJsb3dlcnJvbWFuIj4NCis8bGk+DQorPHA+DQorYW5kIHJlYWR5LXRvLXVzZSBST00gb3IgZGlzayBpbWFnZXMgZnJvbToNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmh0dHA6Ly93d3cucm9tLW8tbWF0aWMubmV0LzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2xpPg0KKzwvb2w+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Tb21lIGNhcmRzLCBsaWtlIG1heSBzeXN0ZW1zIHdpdGggdGhlIFNpUyA5MDAsIGhhcyBhIFBYRSBzdGFjayB3aGljaA0KK3dvcmtzIGp1c3QgYmFyZWx5IHdlbGwgZW5vdWdoIHRvIGxvYWQgYSBzaW5nbGUgZmlsZSwgYnV0IGRvZXNuJiM4MjE3O3QNCitoYW5kbGUgdGhlIG1vcmUgYWR2YW5jZWQgaXRlbXMgcmVxdWlyZWQgYnkgUFhFTElOVVguICBJZiBzbywgaXQgaXMNCitwb3NzaWJsZSB0byB1c2UgdGhlIGJ1aWx0LWluIFBYRSBzdGFjayB0byBsb2FkIGdQWEUsIHdoaWNoIGNhbiB0aGVuDQorbG9hZCBQWEVMSU5VWC4gIFNlZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy93aWtpL3B4ZWNoYWluaW5nPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9ub3RlcyI+Tk9URVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfbXRmdHAiPk1URlRQPC9oMz4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlBYRUxJTlVYIGRvZXMgbm90IHN1cHBvcnQgTVRGVFAsIGFuZCB0aGVyZSBhcmUgbm8gcGxhbnMgb2YgZG9pbmcgc28sIGFzDQorTVRGVFAgaXMgaW5oZXJlbnRseSBicm9rZW4gZm9yIGZpbGVzIG1vcmUgdGhhbiA2NTUzNSBwYWNrZXRzIChhYm91dCA5Mg0KK01CKSBpbiBzaXplLiAgSXQgaXMgb2YgY291cnNlIHBvc3NpYmxlIHRvIHVzZSBNVEZUUCBmb3IgdGhlIGluaXRpYWwNCitib290LCBpZiB5b3UgaGF2ZSBzdWNoIGEgc2V0dXAuICBNVEZUUCBzZXJ2ZXIgc2V0dXAgaXMgYmV5b25kIHRoZSBzY29wZQ0KK29mIHRoaXMgZG9jdW1lbnQuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9lcnJvcl9yZWNvdmVyeSI+RXJyb3IgUmVjb3Zlcnk8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgdGhlIGJvb3QgZmFpbHMsIFBYRUxJTlVYICh1bmxpa2UgU1lTTElOVVgpIHdpbGwgbm90IHdhaXQgZm9yZXZlcjsNCityYXRoZXIsIGlmIGl0IGhhcyBub3QgcmVjZWl2ZWQgYW55IGlucHV0IGZvciBhcHByb3hpbWF0ZWx5IGZpdmUNCittaW51dGVzIGFmdGVyIGRpc3BsYXlpbmcgYW4gZXJyb3IgbWVzc2FnZSwgaXQgd2lsbCByZXNldCB0aGUgbWFjaGluZS4NCitUaGlzIGFsbG93cyBhbiB1bmF0dGVuZGVkIG1hY2hpbmUgdG8gcmVjb3ZlciBpbiBjYXNlIGl0IGhhZCBiYWQgZW5vdWdoDQorbHVjayBvZiB0cnlpbmcgdG8gYm9vdCBhdCB0aGUgc2FtZSB0aW1lIHRoZSBURlRQIHNlcnZlciBnb2VzIGRvd24uPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9zZWVfYWxzbyI+U0VFIEFMU088L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+c3lzbGludXguY2ZnPC9zdHJvbmc+KDUpLCA8c3Ryb25nPnN5c2xpbnV4LWNsaTwvc3Ryb25nPigxKSwgPHN0cm9uZz5saWxvPC9zdHJvbmc+KDgpLCA8c3Ryb25nPmtleXRhYi1saWxvLnBsPC9zdHJvbmc+KDgpLA0KKzxzdHJvbmc+ZmRpc2s8L3N0cm9uZz4oOCksIDxzdHJvbmc+bWtmczwvc3Ryb25nPig4KSwgPHN0cm9uZz5zdXBlcmZvcm1hdDwvc3Ryb25nPigxKS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2F1dGhvciI+QVVUSE9SPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIEFzY2lpRG9jIGRlcml2ZWQgZG9jdW1lbnQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbA0KKzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gZG9jdW1lbnRhdGlvbiBieSBILiBQZXRlciBBbnZpbiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmhwYUB6eXRvci5jb20iPmhwYUB6eXRvci5jb208L2E+Jmd0Oy4gIFRoZSBjb252ZXJzaW9uDQordG8gYW4gQXNjaWlEb2Mgd2FzIG1hZGUgYnkgR2VuZSBDdW1tICZsdDs8YSBocmVmPSJtYWlsdG86Z2VuZS5jdW1tQGdtYWlsLmNvbSI+Z2VuZS5jdW1tQGdtYWlsLmNvbTwvYT4mZ3Q7PC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3Rub3RlcyI+PGhyIC8+PC9kaXY+DQorPGRpdiBpZD0iZm9vdGVyIj4NCis8ZGl2IGlkPSJmb290ZXItdGV4dCI+DQorTGFzdCB1cGRhdGVkIDIwMTQtMDEtMTcgMTY6MDk6NTYgUFNUDQorPC9kaXY+DQorPC9kaXY+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9lZmk2NC90eHQvaHRtbC9zeXNsaW51eC1jbGkuaHRtbCBiL2VmaTY0L3R4dC9odG1sL3N5c2xpbnV4LWNsaS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzg0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC90eHQvaHRtbC9zeXNsaW51eC1jbGkuaHRtbApAQCAtMCwwICsxLDgzOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPg0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iYXBwbGljYXRpb24veGh0bWwreG1sOyBjaGFyc2V0PVVURi04IiAvPg0KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQXNjaWlEb2MgOC42LjgiIC8+DQorPHRpdGxlPnN5c2xpbnV4LWNsaSgxKTwvdGl0bGU+DQorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCisvKiBTaGFyZWQgQ1NTIGZvciBBc2NpaURvYyB4aHRtbDExIGFuZCBodG1sNSBiYWNrZW5kcyAqLw0KKw0KKy8qIERlZmF1bHQgZm9udC4gKi8NCitib2R5IHsNCisgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLHNlcmlmOw0KK30NCisNCisvKiBUaXRsZSBmb250LiAqLw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlLA0KK3RoZWFkLCBwLnRhYmxlLmhlYWRlciwNCisjdG9jdGl0bGUsDQorI2F1dGhvciwgI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmssDQorI2Zvb3RlciB7DQorICBmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7DQorfQ0KKw0KK2JvZHkgew0KKyAgbWFyZ2luOiAxZW0gNSUgMWVtIDUlOw0KK30NCisNCithIHsNCisgIGNvbG9yOiBibHVlOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorfQ0KK2E6dmlzaXRlZCB7DQorICBjb2xvcjogZnVjaHNpYTsNCit9DQorDQorZW0gew0KKyAgZm9udC1zdHlsZTogaXRhbGljOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KKw0KK3N0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjMDgzMTk0Ow0KK30NCisNCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgbWFyZ2luLXRvcDogMS4yZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCisgIGxpbmUtaGVpZ2h0OiAxLjM7DQorfQ0KKw0KK2gxLCBoMiwgaDMgew0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQoraDIgew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KK30NCitoMyB7DQorICBmbG9hdDogbGVmdDsNCit9DQoraDMgKyAqIHsNCisgIGNsZWFyOiBsZWZ0Ow0KK30NCitoNSB7DQorICBmb250LXNpemU6IDEuMGVtOw0KK30NCisNCitkaXYuc2VjdGlvbmJvZHkgew0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorfQ0KKw0KK2hyIHsNCisgIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjsNCit9DQorDQorcCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCisNCit1bCwgb2wsIGxpID4gcCB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit1bCA+IGxpICAgICB7IGNvbG9yOiAjYWFhOyB9DQordWwgPiBsaSA+ICogeyBjb2xvcjogYmxhY2s7IH0NCisNCisubW9ub3NwYWNlZCwgY29kZSwgcHJlIHsNCisgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7DQorICBmb250LXNpemU6IGluaGVyaXQ7DQorICBjb2xvcjogbmF2eTsNCisgIHBhZGRpbmc6IDA7DQorICBtYXJnaW46IDA7DQorfQ0KKw0KKw0KKyNhdXRob3Igew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorfQ0KKyNlbWFpbCB7DQorfQ0KKyNyZXZudW1iZXIsICNyZXZkYXRlLCAjcmV2cmVtYXJrIHsNCit9DQorDQorI2Zvb3RlciB7DQorICBmb250LXNpemU6IHNtYWxsOw0KKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIG1hcmdpbi10b3A6IDQuMGVtOw0KK30NCisjZm9vdGVyLXRleHQgew0KKyAgZmxvYXQ6IGxlZnQ7DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorfQ0KKyNmb290ZXItYmFkZ2VzIHsNCisgIGZsb2F0OiByaWdodDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorDQorI3ByZWFtYmxlIHsNCisgIG1hcmdpbi10b3A6IDEuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5pbWFnZWJsb2NrLCBkaXYuZXhhbXBsZWJsb2NrLCBkaXYudmVyc2VibG9jaywNCitkaXYucXVvdGVibG9jaywgZGl2LmxpdGVyYWxibG9jaywgZGl2Lmxpc3RpbmdibG9jaywgZGl2LnNpZGViYXJibG9jaywNCitkaXYuYWRtb25pdGlvbmJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMi4wZW07DQorICBtYXJnaW4tYm90dG9tOiAyLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgY29sb3I6ICM2MDYwNjA7DQorfQ0KKw0KK2Rpdi5jb250ZW50IHsgLyogQmxvY2sgZWxlbWVudCBjb250ZW50LiAqLw0KKyAgcGFkZGluZzogMDsNCit9DQorDQorLyogQmxvY2sgZWxlbWVudCB0aXRsZXMuICovDQorZGl2LnRpdGxlLCBjYXB0aW9uLnRpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCit9DQorZGl2LnRpdGxlICsgKiB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisNCit0ZCBkaXYudGl0bGU6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KK2Rpdi5jb250ZW50IGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgKyBkaXYudGl0bGUgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KKw0KK2Rpdi5zaWRlYmFyYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBiYWNrZ3JvdW5kOiAjZmZmZmVlOw0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgI2YwZjBmMDsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYubGlzdGluZ2Jsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGJhY2tncm91bmQ6ICNmOGY4Zjg7DQorICBwYWRkaW5nOiAwLjVlbTsNCit9DQorDQorZGl2LnF1b3RlYmxvY2ssIGRpdi52ZXJzZWJsb2NrIHsNCisgIHBhZGRpbmctbGVmdDogMS4wZW07DQorICBtYXJnaW4tbGVmdDogMS4wZW07DQorICBtYXJnaW4tcmlnaHQ6IDEwJTsNCisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2YwZjBmMDsNCisgIGNvbG9yOiAjODg4Ow0KK30NCisNCitkaXYucXVvdGVibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQorZGl2LnZlcnNlYmxvY2sgPiBwcmUuY29udGVudCB7DQorICBmb250LWZhbWlseTogaW5oZXJpdDsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCit9DQorZGl2LnZlcnNlYmxvY2sgPiBkaXYuYXR0cmlidXRpb24gew0KKyAgcGFkZGluZy10b3A6IDAuNzVlbTsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KKy8qIERFUFJFQ0FURUQ6IFByZSB2ZXJzaW9uIDguMi43IHZlcnNlIHN0eWxlIGxpdGVyYWwgYmxvY2suICovDQorZGl2LnZlcnNlYmxvY2sgKyBkaXYuYXR0cmlidXRpb24gew0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorDQorZGl2LmFkbW9uaXRpb25ibG9jayAuaWNvbiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KK30NCitkaXYuYWRtb25pdGlvbmJsb2NrIHRkLmNvbnRlbnQgew0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCit9DQorDQorZGl2LmV4YW1wbGVibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RkZGRkZDsNCisgIHBhZGRpbmctbGVmdDogMC41ZW07DQorfQ0KKw0KK2Rpdi5pbWFnZWJsb2NrIGRpdi5jb250ZW50IHsgcGFkZGluZy1sZWZ0OiAwOyB9DQorc3Bhbi5pbWFnZSBpbWcgeyBib3JkZXItc3R5bGU6IG5vbmU7IH0NCithLmltYWdlOnZpc2l0ZWQgeyBjb2xvcjogd2hpdGU7IH0NCisNCitkbCB7DQorICBtYXJnaW4tdG9wOiAwLjhlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuOGVtOw0KK30NCitkdCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBjb2xvcjogbmF2eTsNCit9DQorZGQgPiAqOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KK30NCisNCit1bCwgb2wgew0KKyAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOw0KK30NCitvbC5hcmFiaWMgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOw0KK30NCitvbC5sb3dlcmFscGhhIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGE7DQorfQ0KK29sLnVwcGVyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1hbHBoYTsNCit9DQorb2wubG93ZXJyb21hbiB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLXJvbWFuOw0KK30NCitvbC51cHBlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogdXBwZXItcm9tYW47DQorfQ0KKw0KK2Rpdi5jb21wYWN0IHVsLCBkaXYuY29tcGFjdCBvbCwNCitkaXYuY29tcGFjdCBwLCBkaXYuY29tcGFjdCBwLA0KK2Rpdi5jb21wYWN0IGRpdiwgZGl2LmNvbXBhY3QgZGl2IHsNCisgIG1hcmdpbi10b3A6IDAuMWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK3Rmb290IHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZCA+IGRpdi52ZXJzZSB7DQorICB3aGl0ZS1zcGFjZTogcHJlOw0KK30NCisNCitkaXYuaGRsaXN0IHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2Rpdi5oZGxpc3QgdHIgew0KKyAgcGFkZGluZy1ib3R0b206IDE1cHg7DQorfQ0KK2R0LmhkbGlzdDEuc3Ryb25nLCB0ZC5oZGxpc3QxLnN0cm9uZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQordGQuaGRsaXN0MSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KKyAgZm9udC1zdHlsZTogbm9ybWFsOw0KKyAgcGFkZGluZy1yaWdodDogMC44ZW07DQorICBjb2xvcjogbmF2eTsNCit9DQordGQuaGRsaXN0MiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCitkaXYuaGRsaXN0LmNvbXBhY3QgdHIgew0KKyAgbWFyZ2luOiAwOw0KKyAgcGFkZGluZy1ib3R0b206IDA7DQorfQ0KKw0KKy5jb21tZW50IHsNCisgIGJhY2tncm91bmQ6IHllbGxvdzsNCit9DQorDQorLmZvb3Rub3RlLCAuZm9vdG5vdGVyZWYgew0KKyAgZm9udC1zaXplOiAwLjhlbTsNCit9DQorDQorc3Bhbi5mb290bm90ZSwgc3Bhbi5mb290bm90ZXJlZiB7DQorICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7DQorfQ0KKw0KKyNmb290bm90ZXMgew0KKyAgbWFyZ2luOiAyMHB4IDAgMjBweCAwOw0KKyAgcGFkZGluZzogN3B4IDAgMCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGRpdi5mb290bm90ZSB7DQorICBtYXJnaW46IDAgMCA1cHggMDsNCit9DQorDQorI2Zvb3Rub3RlcyBociB7DQorICBib3JkZXI6IG5vbmU7DQorICBib3JkZXItdG9wOiAxcHggc29saWQgc2lsdmVyOw0KKyAgaGVpZ2h0OiAxcHg7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorICB3aWR0aDogMjAlOw0KKyAgbWluLXdpZHRoOiAxMDBweDsNCit9DQorDQorZGl2LmNvbGlzdCB0ZCB7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjNlbTsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5jb2xpc3QgdGQgaW1nIHsNCisgIG1hcmdpbi10b3A6IDAuM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgI2Zvb3Rlci1iYWRnZXMgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKyN0b2Mgew0KKyAgbWFyZ2luLWJvdHRvbTogMi41ZW07DQorfQ0KKw0KKyN0b2N0aXRsZSB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4xZW07DQorfQ0KKw0KK2Rpdi50b2NsZXZlbDAsIGRpdi50b2NsZXZlbDEsIGRpdi50b2NsZXZlbDIsIGRpdi50b2NsZXZlbDMsIGRpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLXRvcDogMDsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorfQ0KK2Rpdi50b2NsZXZlbDIgew0KKyAgbWFyZ2luLWxlZnQ6IDJlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDMgew0KKyAgbWFyZ2luLWxlZnQ6IDRlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KK2Rpdi50b2NsZXZlbDQgew0KKyAgbWFyZ2luLWxlZnQ6IDZlbTsNCisgIGZvbnQtc2l6ZTogMC45ZW07DQorfQ0KKw0KK3NwYW4uYXF1YSB7IGNvbG9yOiBhcXVhOyB9DQorc3Bhbi5ibGFjayB7IGNvbG9yOiBibGFjazsgfQ0KK3NwYW4uYmx1ZSB7IGNvbG9yOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhIHsgY29sb3I6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXkgeyBjb2xvcjogZ3JheTsgfQ0KK3NwYW4uZ3JlZW4geyBjb2xvcjogZ3JlZW47IH0NCitzcGFuLmxpbWUgeyBjb2xvcjogbGltZTsgfQ0KK3NwYW4ubWFyb29uIHsgY29sb3I6IG1hcm9vbjsgfQ0KK3NwYW4ubmF2eSB7IGNvbG9yOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZSB7IGNvbG9yOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlIHsgY29sb3I6IHB1cnBsZTsgfQ0KK3NwYW4ucmVkIHsgY29sb3I6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyIHsgY29sb3I6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbCB7IGNvbG9yOiB0ZWFsOyB9DQorc3Bhbi53aGl0ZSB7IGNvbG9yOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93IHsgY29sb3I6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYXF1YS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYXF1YTsgfQ0KK3NwYW4uYmxhY2stYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsYWNrOyB9DQorc3Bhbi5ibHVlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBibHVlOyB9DQorc3Bhbi5mdWNoc2lhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBmdWNoc2lhOyB9DQorc3Bhbi5ncmF5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9DQorc3Bhbi5ncmVlbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZ3JlZW47IH0NCitzcGFuLmxpbWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGxpbWU7IH0NCitzcGFuLm1hcm9vbi1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbWFyb29uOyB9DQorc3Bhbi5uYXZ5LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBuYXZ5OyB9DQorc3Bhbi5vbGl2ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogb2xpdmU7IH0NCitzcGFuLnB1cnBsZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcHVycGxlOyB9DQorc3Bhbi5yZWQtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHJlZDsgfQ0KK3NwYW4uc2lsdmVyLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBzaWx2ZXI7IH0NCitzcGFuLnRlYWwtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHRlYWw7IH0NCitzcGFuLndoaXRlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgfQ0KK3NwYW4ueWVsbG93LWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB5ZWxsb3c7IH0NCisNCitzcGFuLmJpZyB7IGZvbnQtc2l6ZTogMmVtOyB9DQorc3Bhbi5zbWFsbCB7IGZvbnQtc2l6ZTogMC42ZW07IH0NCisNCitzcGFuLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9DQorc3Bhbi5vdmVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7IH0NCitzcGFuLmxpbmUtdGhyb3VnaCB7IHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyB9DQorDQorZGl2LnVuYnJlYWthYmxlIHsgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOyB9DQorDQorDQorLyoNCisgKiB4aHRtbDExIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2Rpdi50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGUgew0KKyAgYm9yZGVyOiAzcHggc29saWQgIzUyN2JiZDsNCit9DQordGhlYWQsIHAudGFibGUuaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGUgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQorLyogQmVjYXVzZSB0aGUgdGFibGUgZnJhbWUgYXR0cmlidXRlIGlzIG92ZXJyaWRlbiBieSBDU1MgaW4gbW9zdCBicm93c2Vycy4gKi8NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2b2lkIl0gew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJoc2lkZXMiXSB7DQorICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0idnNpZGVzIl0gew0KKyAgYm9yZGVyLXRvcC1zdHlsZTogbm9uZTsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7DQorfQ0KKw0KKw0KKy8qDQorICogaHRtbDUgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQordGFibGUudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCit0aGVhZCwgcC50YWJsZWJsb2NrLmhlYWRlciB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjNTI3YmJkOw0KK30NCitwLnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQordGFibGUudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDNweDsNCisgIGJvcmRlci1zcGFjaW5nOiAwcHg7DQorICBib3JkZXItc3R5bGU6IHNvbGlkOw0KKyAgYm9yZGVyLWNvbG9yOiAjNTI3YmJkOw0KKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCit9DQordGgudGFibGVibG9jaywgdGQudGFibGVibG9jayB7DQorICBib3JkZXItd2lkdGg6IDFweDsNCisgIHBhZGRpbmc6IDRweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorfQ0KKw0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtdG9wYm90IHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItcmlnaHQtc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1zaWRlcyB7DQorICBib3JkZXItdG9wLXN0eWxlOiBoaWRkZW47DQorICBib3JkZXItYm90dG9tLXN0eWxlOiBoaWRkZW47DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtbm9uZSB7DQorICBib3JkZXItc3R5bGU6IGhpZGRlbjsNCit9DQorDQordGgudGFibGVibG9jay5oYWxpZ24tbGVmdCwgdGQudGFibGVibG9jay5oYWxpZ24tbGVmdCB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCit0aC50YWJsZWJsb2NrLmhhbGlnbi1jZW50ZXIsIHRkLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciB7DQorICB0ZXh0LWFsaWduOiBjZW50ZXI7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1yaWdodCB7DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQordGgudGFibGVibG9jay52YWxpZ24tdG9wLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi10b3Agew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tbWlkZGxlLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUgew0KKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCit9DQordGgudGFibGVibG9jay52YWxpZ24tYm90dG9tLCB0ZC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20gew0KKyAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsNCit9DQorDQorDQorLyoNCisgKiBtYW5wYWdlIHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK2JvZHkubWFucGFnZSBoMSB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHNpbHZlcjsNCit9DQorYm9keS5tYW5wYWdlIGgyIHsNCisgIGJvcmRlci1zdHlsZTogbm9uZTsNCit9DQorYm9keS5tYW5wYWdlIGRpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogM2VtOw0KK30NCisNCitAbWVkaWEgcHJpbnQgew0KKyAgYm9keS5tYW5wYWdlIGRpdiN0b2MgeyBkaXNwbGF5OiBub25lOyB9DQorfQ0KKw0KKw0KKzwvc3R5bGU+DQorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KKy8qPCFbQ0RBVEFbKi8NCit2YXIgYXNjaWlkb2MgPSB7ICAvLyBOYW1lc3BhY2UuDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gVGFibGUgT2YgQ29udGVudHMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQXV0aG9yOiBNaWhhaSBCYXpvbiwgU2VwdGVtYmVyIDIwMDINCisgKiBodHRwOi8vc3R1ZGVudHMuaW5mb2lhc2kucm8vfm1pc2hvbw0KKyAqDQorICogVGFibGUgT2YgQ29udGVudCBnZW5lcmF0b3INCisgKiBWZXJzaW9uOiAwLjQNCisgKg0KKyAqIEZlZWwgZnJlZSB0byB1c2UgdGhpcyBzY3JpcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMNCisgKiBMaWNlbnNlLCBhcyBsb25nIGFzIHlvdSBkbyBub3QgcmVtb3ZlIG9yIGFsdGVyIHRoaXMgbm90aWNlLg0KKyAqLw0KKw0KKyAvKiBtb2RpZmllZCBieSBUcm95IEQuIEhhbnNvbiwgU2VwdGVtYmVyIDIwMDYuIExpY2Vuc2U6IEdQTCAqLw0KKyAvKiBtb2RpZmllZCBieSBTdHVhcnQgUmFja2hhbSwgMjAwNiwgMjAwOS4gTGljZW5zZTogR1BMICovDQorDQorLy8gdG9jbGV2ZWxzID0gMS4uNC4NCit0b2M6IGZ1bmN0aW9uICh0b2NsZXZlbHMpIHsNCisNCisgIGZ1bmN0aW9uIGdldFRleHQoZWwpIHsNCisgICAgdmFyIHRleHQgPSAiIjsNCisgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICBpZiAoaS5ub2RlVHlwZSA9PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSAvLyBJRSBkb2Vzbid0IHNwZWFrIGNvbnN0YW50cy4NCisgICAgICAgIHRleHQgKz0gaS5kYXRhOw0KKyAgICAgIGVsc2UgaWYgKGkuZmlyc3RDaGlsZCAhPSBudWxsKQ0KKyAgICAgICAgdGV4dCArPSBnZXRUZXh0KGkpOw0KKyAgICB9DQorICAgIHJldHVybiB0ZXh0Ow0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gVG9jRW50cnkoZWwsIHRleHQsIHRvY2xldmVsKSB7DQorICAgIHRoaXMuZWxlbWVudCA9IGVsOw0KKyAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KKyAgICB0aGlzLnRvY2xldmVsID0gdG9jbGV2ZWw7DQorICB9DQorDQorICBmdW5jdGlvbiB0b2NFbnRyaWVzKGVsLCB0b2NsZXZlbHMpIHsNCisgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTsNCisgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnW2hIXShbMS0nKyh0b2NsZXZlbHMrMSkrJ10pJyk7DQorICAgIC8vIEZ1bmN0aW9uIHRoYXQgc2NhbnMgdGhlIERPTSB0cmVlIGZvciBoZWFkZXIgZWxlbWVudHMgKHRoZSBET00yDQorICAgIC8vIG5vZGVJdGVyYXRvciBBUEkgd291bGQgYmUgYSBiZXR0ZXIgdGVjaG5pcXVlIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IGFsbA0KKyAgICAvLyBicm93c2VycykuDQorICAgIHZhciBpdGVyYXRlID0gZnVuY3Rpb24gKGVsKSB7DQorICAgICAgZm9yICh2YXIgaSA9IGVsLmZpcnN0Q2hpbGQ7IGkgIT0gbnVsbDsgaSA9IGkubmV4dFNpYmxpbmcpIHsNCisgICAgICAgIGlmIChpLm5vZGVUeXBlID09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHsNCisgICAgICAgICAgdmFyIG1vID0gcmUuZXhlYyhpLnRhZ05hbWUpOw0KKyAgICAgICAgICBpZiAobW8gJiYgKGkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8IGkuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKSkgIT0gImZsb2F0Iikgew0KKyAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IG5ldyBUb2NFbnRyeShpLCBnZXRUZXh0KGkpLCBtb1sxXS0xKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpdGVyYXRlKGkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpdGVyYXRlKGVsKTsNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHZhciB0b2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9jIik7DQorICBpZiAoIXRvYykgew0KKyAgICByZXR1cm47DQorICB9DQorDQorICAvLyBEZWxldGUgZXhpc3RpbmcgVE9DIGVudHJpZXMgaW4gY2FzZSB3ZSdyZSByZWxvYWRpbmcgdGhlIFRPQy4NCisgIHZhciB0b2NFbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIHZhciBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHRvYy5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IHRvYy5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2Jw0KKyAgICAgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikubWF0Y2goL150b2NsZXZlbC8pKQ0KKyAgICAgIHRvY0VudHJpZXNUb1JlbW92ZS5wdXNoKGVudHJ5KTsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCB0b2NFbnRyaWVzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCisgICAgdG9jLnJlbW92ZUNoaWxkKHRvY0VudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIFRPQyBlbnRyaWVzLg0KKyAgdmFyIGVudHJpZXMgPSB0b2NFbnRyaWVzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50IiksIHRvY2xldmVscyk7DQorICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHsNCisgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpXTsNCisgICAgaWYgKGVudHJ5LmVsZW1lbnQuaWQgPT0gIiIpDQorICAgICAgZW50cnkuZWxlbWVudC5pZCA9ICJfdG9jXyIgKyBpOw0KKyAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsNCisgICAgYS5ocmVmID0gIiMiICsgZW50cnkuZWxlbWVudC5pZDsNCisgICAgYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbnRyeS50ZXh0KSk7DQorICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCisgICAgZGl2LmFwcGVuZENoaWxkKGEpOw0KKyAgICBkaXYuY2xhc3NOYW1lID0gInRvY2xldmVsIiArIGVudHJ5LnRvY2xldmVsOw0KKyAgICB0b2MuYXBwZW5kQ2hpbGQoZGl2KTsNCisgIH0NCisgIGlmIChlbnRyaWVzLmxlbmd0aCA9PSAwKQ0KKyAgICB0b2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b2MpOw0KK30sDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gRm9vdG5vdGVzIGdlbmVyYXRvcg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qIEJhc2VkIG9uIGZvb3Rub3RlIGdlbmVyYXRpb24gY29kZSBmcm9tOg0KKyAqIGh0dHA6Ly93d3cuYnJhbmRzcGFua2luZ25ldy5uZXQvYXJjaGl2ZS8yMDA1LzA3L2Zvcm1hdF9mb290bm90ZS5odG1sDQorICovDQorDQorZm9vdG5vdGVzOiBmdW5jdGlvbiAoKSB7DQorICAvLyBEZWxldGUgZXhpc3RpbmcgZm9vdG5vdGUgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgZm9vdG5vZGVzLg0KKyAgdmFyIGk7DQorICB2YXIgbm90ZWhvbGRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb290bm90ZXMiKTsNCisgIGlmICghbm90ZWhvbGRlcikgew0KKyAgICByZXR1cm47DQorICB9DQorICB2YXIgZW50cmllc1RvUmVtb3ZlID0gW107DQorICBmb3IgKGkgPSAwOyBpIDwgbm90ZWhvbGRlci5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQorICAgIHZhciBlbnRyeSA9IG5vdGVob2xkZXIuY2hpbGROb2Rlc1tpXTsNCisgICAgaWYgKGVudHJ5Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2RpdicgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpID09ICJmb290bm90ZSIpDQorICAgICAgZW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IGVudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICBub3RlaG9sZGVyLnJlbW92ZUNoaWxkKGVudHJpZXNUb1JlbW92ZVtpXSk7DQorICB9DQorDQorICAvLyBSZWJ1aWxkIGZvb3Rub3RlIGVudHJpZXMuDQorICB2YXIgY29udCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50Iik7DQorICB2YXIgc3BhbnMgPSBjb250LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7DQorICB2YXIgcmVmcyA9IHt9Ow0KKyAgdmFyIG4gPSAwOw0KKyAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGUiKSB7DQorICAgICAgbisrOw0KKyAgICAgIHZhciBub3RlID0gc3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiKTsNCisgICAgICBpZiAoIW5vdGUpIHsNCisgICAgICAgIC8vIFVzZSBbXHNcU10gaW4gcGxhY2Ugb2YgLiBzbyBtdWx0aS1saW5lIG1hdGNoZXMgd29yay4NCisgICAgICAgIC8vIEJlY2F1c2UgSmF2YVNjcmlwdCBoYXMgbm8gcyAoZG90YWxsKSByZWdleCBmbGFnLg0KKyAgICAgICAgbm90ZSA9IHNwYW5zW2ldLmlubmVySFRNTC5tYXRjaCgvXHMqXFsoW1xzXFNdKildXHMqLylbMV07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGlkPSdfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgICAgc3BhbnNbaV0uc2V0QXR0cmlidXRlKCJkYXRhLW5vdGUiLCBub3RlKTsNCisgICAgICB9DQorICAgICAgbm90ZWhvbGRlci5pbm5lckhUTUwgKz0NCisgICAgICAgICI8ZGl2IGNsYXNzPSdmb290bm90ZScgaWQ9J19mb290bm90ZV8iICsgbiArICInPiIgKw0KKyAgICAgICAgIjxhIGhyZWY9JyNfZm9vdG5vdGVyZWZfIiArIG4gKyAiJyB0aXRsZT0nUmV0dXJuIHRvIHRleHQnPiIgKw0KKyAgICAgICAgbiArICI8L2E+LiAiICsgbm90ZSArICI8L2Rpdj4iOw0KKyAgICAgIHZhciBpZCA9c3BhbnNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOw0KKyAgICAgIGlmIChpZCAhPSBudWxsKSByZWZzWyIjIitpZF0gPSBuOw0KKyAgICB9DQorICB9DQorICBpZiAobiA9PSAwKQ0KKyAgICBub3RlaG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm90ZWhvbGRlcik7DQorICBlbHNlIHsNCisgICAgLy8gUHJvY2VzcyBmb290bm90ZXJlZnMuDQorICAgIGZvciAoaT0wOyBpPHNwYW5zLmxlbmd0aDsgaSsrKSB7DQorICAgICAgaWYgKHNwYW5zW2ldLmNsYXNzTmFtZSA9PSAiZm9vdG5vdGVyZWYiKSB7DQorICAgICAgICB2YXIgaHJlZiA9IHNwYW5zW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0uZ2V0QXR0cmlidXRlKCJocmVmIik7DQorICAgICAgICBocmVmID0gaHJlZi5tYXRjaCgvIy4qLylbMF07ICAvLyBCZWNhdXNlIElFIHJldHVybiBmdWxsIFVSTC4NCisgICAgICAgIG4gPSByZWZzW2hyZWZdOw0KKyAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0NCisgICAgICAgICAgIls8YSBocmVmPScjX2Zvb3Rub3RlXyIgKyBuICsNCisgICAgICAgICAgIicgdGl0bGU9J1ZpZXcgZm9vdG5vdGUnIGNsYXNzPSdmb290bm90ZSc+IiArIG4gKyAiPC9hPl0iOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30sDQorDQoraW5zdGFsbDogZnVuY3Rpb24odG9jbGV2ZWxzKSB7DQorICB2YXIgdGltZXJJZDsNCisNCisgIGZ1bmN0aW9uIHJlaW5zdGFsbCgpIHsNCisgICAgYXNjaWlkb2MuZm9vdG5vdGVzKCk7DQorICAgIGlmICh0b2NsZXZlbHMpIHsNCisgICAgICBhc2NpaWRvYy50b2ModG9jbGV2ZWxzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIoKSB7DQorICAgIGNsZWFySW50ZXJ2YWwodGltZXJJZCk7DQorICAgIHJlaW5zdGFsbCgpOw0KKyAgfQ0KKw0KKyAgdGltZXJJZCA9IHNldEludGVydmFsKHJlaW5zdGFsbCwgNTAwKTsNCisgIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKQ0KKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXIsIGZhbHNlKTsNCisgIGVsc2UNCisgICAgd2luZG93Lm9ubG9hZCA9IHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyOw0KK30NCisNCit9DQorYXNjaWlkb2MuaW5zdGFsbCgpOw0KKy8qXV0+Ki8NCis8L3NjcmlwdD4NCis8L2hlYWQ+DQorPGJvZHkgY2xhc3M9Im1hbnBhZ2UiPg0KKzxkaXYgaWQ9ImhlYWRlciI+DQorPGgxPg0KK3N5c2xpbnV4LWNsaSgxKSBNYW51YWwgUGFnZQ0KKzwvaDE+DQorPGgyPk5BTUU8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8cD5zeXNsaW51eC1jbGkgLQ0KKyAgICpTeXNsaW51eCogYm9vdCBwcm9tcHQvY29tbWFuZCBsaW5lIGludGVyZmFjZQ0KKzwvcD4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJjb250ZW50Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZGVzY3JpcHRpb24iPkRFU0NSSVBUSU9OPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+J3MgYm9vdCBwcm9tcHQgcHJvdmlkZXMgYSB2ZXJ5IHNpbXBsaXN0aWMgY29tbWFuZCBsaW5lDQoraW50ZXJmYWNlIGZvciBsb2FkaW5nIG1vZHVsZXMgYW5kIGJvb3Rpbmcga2VybmVscy48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2Jvb3RfcHJvbXB0Ij5CT09UIFBST01QVDwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9jb21tYW5kX2xpbmVfa2V5c3Ryb2tlcyI+Q09NTUFORCBMSU5FIEtFWVNUUk9LRVM8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIGNvbW1hbmQgbGluZSBwcm9tcHQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBrZXlzdHJva2VzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+Jmx0O0VudGVyJmd0OyAgICAgICAgICAgICAgIGJvb3Qgc3BlY2lmaWVkIGNvbW1hbmQgbGluZQ0KKyZsdDtCYWNrU3BhY2UmZ3Q7ICAgICAgICAgICBlcmFzZSBvbmUgY2hhcmFjdGVyDQorJmx0O0N0cmwtVSZndDsgICAgICAgICAgICAgIGVyYXNlIHRoZSB3aG9sZSBsaW5lDQorJmx0O0N0cmwtViZndDsgICAgICAgICAgICAgIGRpc3BsYXkgdGhlIGN1cnJlbnQgU3lzbGludXggdmVyc2lvbg0KKyZsdDtDdHJsLVcmZ3Q7ICAgICAgICAgICAgICBlcmFzZSBvbmUgd29yZA0KKyZsdDtDdHJsLVgmZ3Q7ICAgICAgICAgICAgICBmb3JjZSB0ZXh0IG1vZGUNCismbHQ7VGFiJmd0OyAgICAgICAgICAgICAgICAgbGlzdCBtYXRjaGluZyBsYWJlbHMNCismbHQ7RjEmZ3Q7Li4mbHQ7RjEyJmd0OyAgICAgICAgICAgaGVscCBzY3JlZW5zIChpZiBjb25maWd1cmVkKQ0KKyZsdDtDdHJsLUYmZ3Q7Jmx0O2RpZ2l0Jmd0OyAgICAgICBlcXVpdmFsZW50IHRvIEYxLi5GMTANCismbHQ7Q3RybC1DJmd0OyAgICAgICAgICAgICAgaW50ZXJydXB0IGJvb3QgaW4gcHJvZ3Jlc3MNCismbHQ7RXNjJmd0OyAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGJvb3QgaW4gcHJvZ3Jlc3MNCismbHQ7Q3RybC1OJmd0OyAgICAgICAgICAgICAgZGlzcGxheSBuZXR3b3JrIGluZm9ybWF0aW9uIChQWEVMSU5VWCBvbmx5OyAzLjUwLTQuMDYpPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il93b3JraW5nX2RpcmVjdG9yeSI+V09SS0lORyBESVJFQ1RPUlk8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+QXQgc3RhcnQsIHRoZSBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5IGZvciA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+LzxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gd2lsbA0KK2JlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uIGZpbGUuICBJZiBubw0KK2NvbmZpZ3VyYXRpb24gZmlsZSBpcyBmb3VuZCwgPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBzaG91bGQgZGVmYXVsdCB0byB0aGUNCitpbnN0YWxsLXRpbWUgd29ya2luZyBkaXJlY3RvcnksIGhvd2V2ZXIgdGhpcyBpcyBhIGtub3duIGlzc3VlIHdpdGggc29tZQ0KK3ZlcnNpb25zIGluY2x1ZGluZyA0LjA2LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkF0IHN0YXJ0LCB0aGUgaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiB3aWxsIGJlIHRoZQ0KK3BhcmVudCBkaXJlY3Rvcnkgb2YgcHhlbGludXguMCB1bmxlc3Mgb3ZlcnJpZGRlbiB3aXRoIERIQ1Agb3B0aW9uIDIxMC4NCitJZiBubyBjb25maWd1cmF0aW9uIGZpbGUgaXMgZm91bmQsIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gd2lsbCBzdGFydCBhIHRpbWVyIHRvDQorcmVib290IHRoZSBzeXN0ZW0gaW4gYW4gYXR0ZW1wdCB0byByZXN0YXJ0IHRoZSBib290IHByb2Nlc3MgYW5kIHJlc29sdmUNCithIHBvc3NpYmxlIHRyYW5zaWVudCBpc3N1ZS48L3A+PC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX2FsdGVybmF0ZV9maWxlbmFtZXMiPkFMVEVSTkFURSBGSUxFTkFNRVM8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Rm9yIGtlcm5lbC1saWtlIGZpbGUgbmFtZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSwgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiB3aWxsDQorYXR0ZW1wdCB0byBhcHBlbmQgZmlsZSBuYW1lIGV4dGVuc2lvbnMgdG8gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgd2hlbg0KK3RoZSBmaWxlIGlzIG5vdCBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAuMFs8c3Ryb25nPlBYRUxJTlVYPC9zdHJvbmc+IG9ubHldLA0KKy5iaW5bPHN0cm9uZz5JU09MSU5VWDwvc3Ryb25nPiBvbmx5XSwgLmJzWzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gb25seV0sIC5ic3NbPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBvbmx5XSwNCisuYzMyLCAuY2J0W1VwIHRvIDQuMDZdLCAuY29tW1VwIHRvIDQuMDZdIGFuZCAuaW1nWzxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gMS42NS00LjA0IG9ubHldLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfcGF0aF9ydWxlcyI+UEFUSCBSVUxFUzwvaDM+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyA8c3Ryb25nPmFsd2F5czwvc3Ryb25nPiBzZWFyY2hlZCBmaXJzdCwgYmVmb3JlIFBBVEgsDQord2hlbiBhdHRlbXB0aW5nIHRvIG9wZW4gYSBmaWxlbmFtZS4gVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMNCitub3QgYWZmZWN0ZWQgd2hlbiBzcGVjaWZ5aW5nIGEgZmlsZSB3aXRoIGFuIGFic29sdXRlIHBhdGguIEZvcg0KK2V4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcgZmlsZSBzeXN0ZW0gbGF5b3V0LDwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+L2Jvb3QvDQorICAgICAgICAvYmluLw0KKyAgICAgICAgICAgICAgICBscy5jMzINCisgICAgICAgICAgICAgICAgbGlibHMuYzMyDQorICAgICAgICAvZm9vLw0KKyAgICAgICAgICAgICAgICBsaWJscy5jMzI8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5hc3N1bWluZyB0aGF0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIC9ib290L2ZvbywgYW5kIGFzc3VtaW5nDQordGhhdCBsaWJscy5jMzIgaXMgYSBkZXBlbmRlbmN5IG9mIGxzLmMzMiwgZXhlY3V0aW5nIC9ib290L2Jpbi9scy5jMzINCit3aWxsIGNhdXNlIC9ib290L2Zvby9saWJscy5jMzIgdG8gYmUgbG9hZGVkLCBub3QgL2Jvb3QvYmluL2xpYmxzLmMzMiwNCitldmVuIGlmIC9ib290L2JpbiBpcyBzcGVjaWZpZWQgaW4gdGhlIFBBVEggZGlyZWN0aXZlIG9mIGEgY29uZmlnIGZpbGUuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIHJlYXNvbiB0aGF0IHRoaW5ncyB3b3JrIHRoaXMgd2F5IGlzIHRoYXQgdHlwaWNhbGx5IGEgdXNlciB3aWxsDQoraW5zdGFsbCBhbGwgbGlicmFyeSBmaWxlcyBpbiB0aGUgU3lzbGludXggaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgYXMNCitzcGVjaWZpZWQgd2l0aCB0aGUgLS1kaXJlY3RvcnkgaW5zdGFsbGVyIG9wdGlvbi4gVGhpcyBtZXRob2QgYWxsb3dzDQordGhlIHVzZXIgdG8gb21pdCB0aGUgUEFUSCBkaXJlY3RpdmUgZnJvbSB0aGVpciBjb25maWcgZmlsZSBhbmQgc3RpbGwNCitoYXZlIHRoaW5ncyB3b3JrIGNvcnJlY3RseS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2F1dGhvciI+QVVUSE9SPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGlzIEFzY2lpRG9jIGRlcml2ZWQgZG9jdW1lbnQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbA0KKzxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gZG9jdW1lbnRhdGlvbiBieSBILiBQZXRlciBBbnZpbiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmhwYUB6eXRvci5jb20iPmhwYUB6eXRvci5jb208L2E+Jmd0Oy4gIFRoZSBjb252ZXJzaW9uDQordG8gYW4gQXNjaWlEb2Mgd2FzIG1hZGUgYnkgR2VuZSBDdW1tICZsdDs8YSBocmVmPSJtYWlsdG86Z2VuZS5jdW1tQGdtYWlsLmNvbSI+Z2VuZS5jdW1tQGdtYWlsLmNvbTwvYT4mZ3Q7PC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3Rub3RlcyI+PGhyIC8+PC9kaXY+DQorPGRpdiBpZD0iZm9vdGVyIj4NCis8ZGl2IGlkPSJmb290ZXItdGV4dCI+DQorTGFzdCB1cGRhdGVkIDIwMTQtMDEtMTcgMTY6MDk6NTYgUFNUDQorPC9kaXY+DQorPC9kaXY+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9lZmk2NC90eHQvaHRtbC9zeXNsaW51eC5jZmcuaHRtbCBiL2VmaTY0L3R4dC9odG1sL3N5c2xpbnV4LmNmZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmFkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC90eHQvaHRtbC9zeXNsaW51eC5jZmcuaHRtbApAQCAtMCwwICsxLDE3ODYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiINCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCis8aGVhZD4NCis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9ImFwcGxpY2F0aW9uL3hodG1sK3htbDsgY2hhcnNldD1VVEYtOCIgLz4NCis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkFzY2lpRG9jIDguNi44IiAvPg0KKzx0aXRsZT5zeXNsaW51eC5jZmcoNSk8L3RpdGxlPg0KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQorLyogU2hhcmVkIENTUyBmb3IgQXNjaWlEb2MgeGh0bWwxMSBhbmQgaHRtbDUgYmFja2VuZHMgKi8NCisNCisvKiBEZWZhdWx0IGZvbnQuICovDQorYm9keSB7DQorICBmb250LWZhbWlseTogR2VvcmdpYSxzZXJpZjsNCit9DQorDQorLyogVGl0bGUgZm9udC4gKi8NCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LA0KK2Rpdi50aXRsZSwgY2FwdGlvbi50aXRsZSwNCit0aGVhZCwgcC50YWJsZS5oZWFkZXIsDQorI3RvY3RpdGxlLA0KKyNhdXRob3IsICNyZXZudW1iZXIsICNyZXZkYXRlLCAjcmV2cmVtYXJrLA0KKyNmb290ZXIgew0KKyAgZm9udC1mYW1pbHk6IEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmOw0KK30NCisNCitib2R5IHsNCisgIG1hcmdpbjogMWVtIDUlIDFlbSA1JTsNCit9DQorDQorYSB7DQorICBjb2xvcjogYmx1ZTsNCisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KK30NCithOnZpc2l0ZWQgew0KKyAgY29sb3I6IGZ1Y2hzaWE7DQorfQ0KKw0KK2VtIHsNCisgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCisNCitzdHJvbmcgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzA4MzE5NDsNCit9DQorDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIG1hcmdpbi10b3A6IDEuMmVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorICBsaW5lLWhlaWdodDogMS4zOw0KK30NCisNCitoMSwgaDIsIGgzIHsNCisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBzaWx2ZXI7DQorfQ0KK2gyIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCit9DQoraDMgew0KKyAgZmxvYXQ6IGxlZnQ7DQorfQ0KK2gzICsgKiB7DQorICBjbGVhcjogbGVmdDsNCit9DQoraDUgew0KKyAgZm9udC1zaXplOiAxLjBlbTsNCit9DQorDQorZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAwOw0KK30NCisNCitociB7DQorICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7DQorfQ0KKw0KK3Agew0KKyAgbWFyZ2luLXRvcDogMC41ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCit9DQorDQordWwsIG9sLCBsaSA+IHAgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQordWwgPiBsaSAgICAgeyBjb2xvcjogI2FhYTsgfQ0KK3VsID4gbGkgPiAqIHsgY29sb3I6IGJsYWNrOyB9DQorDQorLm1vbm9zcGFjZWQsIGNvZGUsIHByZSB7DQorICBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlOw0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KKyAgY29sb3I6IG5hdnk7DQorICBwYWRkaW5nOiAwOw0KKyAgbWFyZ2luOiAwOw0KK30NCisNCisNCisjYXV0aG9yIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBmb250LXNpemU6IDEuMWVtOw0KK30NCisjZW1haWwgew0KK30NCisjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyayB7DQorfQ0KKw0KKyNmb290ZXIgew0KKyAgZm9udC1zaXplOiBzbWFsbDsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorICBtYXJnaW4tdG9wOiA0LjBlbTsNCit9DQorI2Zvb3Rlci10ZXh0IHsNCisgIGZsb2F0OiBsZWZ0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisjZm9vdGVyLWJhZGdlcyB7DQorICBmbG9hdDogcmlnaHQ7DQorICBwYWRkaW5nLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KKyNwcmVhbWJsZSB7DQorICBtYXJnaW4tdG9wOiAxLjVlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCitkaXYuaW1hZ2VibG9jaywgZGl2LmV4YW1wbGVibG9jaywgZGl2LnZlcnNlYmxvY2ssDQorZGl2LnF1b3RlYmxvY2ssIGRpdi5saXRlcmFsYmxvY2ssIGRpdi5saXN0aW5nYmxvY2ssIGRpdi5zaWRlYmFyYmxvY2ssDQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCitkaXYuYWRtb25pdGlvbmJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDIuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMi4wZW07DQorICBtYXJnaW4tcmlnaHQ6IDEwJTsNCisgIGNvbG9yOiAjNjA2MDYwOw0KK30NCisNCitkaXYuY29udGVudCB7IC8qIEJsb2NrIGVsZW1lbnQgY29udGVudC4gKi8NCisgIHBhZGRpbmc6IDA7DQorfQ0KKw0KKy8qIEJsb2NrIGVsZW1lbnQgdGl0bGVzLiAqLw0KK2Rpdi50aXRsZSwgY2FwdGlvbi50aXRsZSB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KK2Rpdi50aXRsZSArICogew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQorDQordGQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCBkaXYudGl0bGU6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4wZW07DQorfQ0KK2Rpdi5jb250ZW50ICsgZGl2LnRpdGxlIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCisNCitkaXYuc2lkZWJhcmJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYmFja2dyb3VuZDogI2ZmZmZlZTsNCisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7DQorICBib3JkZXItbGVmdDogNHB4IHNvbGlkICNmMGYwZjA7DQorICBwYWRkaW5nOiAwLjVlbTsNCit9DQorDQorZGl2Lmxpc3RpbmdibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7DQorICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmMGYwZjA7DQorICBiYWNrZ3JvdW5kOiAjZjhmOGY4Ow0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYudmVyc2VibG9jayB7DQorICBwYWRkaW5nLWxlZnQ6IDEuMGVtOw0KKyAgbWFyZ2luLWxlZnQ6IDEuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmMGYwZjA7DQorICBjb2xvcjogIzg4ODsNCit9DQorDQorZGl2LnF1b3RlYmxvY2sgPiBkaXYuYXR0cmlidXRpb24gew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgdGV4dC1hbGlnbjogcmlnaHQ7DQorfQ0KKw0KK2Rpdi52ZXJzZWJsb2NrID4gcHJlLmNvbnRlbnQgew0KKyAgZm9udC1mYW1pbHk6IGluaGVyaXQ7DQorICBmb250LXNpemU6IGluaGVyaXQ7DQorfQ0KK2Rpdi52ZXJzZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjc1ZW07DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisvKiBERVBSRUNBVEVEOiBQcmUgdmVyc2lvbiA4LjIuNyB2ZXJzZSBzdHlsZSBsaXRlcmFsIGJsb2NrLiAqLw0KK2Rpdi52ZXJzZWJsb2NrICsgZGl2LmF0dHJpYnV0aW9uIHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KKw0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgLmljb24gew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCisgIGZvbnQtc2l6ZTogMS4xZW07DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB0ZC5jb250ZW50IHsNCisgIHBhZGRpbmctbGVmdDogMC41ZW07DQorICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNkZGRkZGQ7DQorfQ0KKw0KK2Rpdi5leGFtcGxlYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNkZGRkZGQ7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KK30NCisNCitkaXYuaW1hZ2VibG9jayBkaXYuY29udGVudCB7IHBhZGRpbmctbGVmdDogMDsgfQ0KK3NwYW4uaW1hZ2UgaW1nIHsgYm9yZGVyLXN0eWxlOiBub25lOyB9DQorYS5pbWFnZTp2aXNpdGVkIHsgY29sb3I6IHdoaXRlOyB9DQorDQorZGwgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZHQgew0KKyAgbWFyZ2luLXRvcDogMC41ZW07DQorICBtYXJnaW4tYm90dG9tOiAwOw0KKyAgZm9udC1zdHlsZTogbm9ybWFsOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KK2RkID4gKjpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjFlbTsNCit9DQorDQordWwsIG9sIHsNCisgICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTsNCit9DQorb2wuYXJhYmljIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsNCit9DQorb2wubG93ZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhOw0KK30NCitvbC51cHBlcmFscGhhIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogdXBwZXItYWxwaGE7DQorfQ0KK29sLmxvd2Vycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1yb21hbjsNCit9DQorb2wudXBwZXJyb21hbiB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLXJvbWFuOw0KK30NCisNCitkaXYuY29tcGFjdCB1bCwgZGl2LmNvbXBhY3Qgb2wsDQorZGl2LmNvbXBhY3QgcCwgZGl2LmNvbXBhY3QgcCwNCitkaXYuY29tcGFjdCBkaXYsIGRpdi5jb21wYWN0IGRpdiB7DQorICBtYXJnaW4tdG9wOiAwLjFlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuMWVtOw0KK30NCisNCit0Zm9vdCB7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQordGQgPiBkaXYudmVyc2Ugew0KKyAgd2hpdGUtc3BhY2U6IHByZTsNCit9DQorDQorZGl2LmhkbGlzdCB7DQorICBtYXJnaW4tdG9wOiAwLjhlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuOGVtOw0KK30NCitkaXYuaGRsaXN0IHRyIHsNCisgIHBhZGRpbmctYm90dG9tOiAxNXB4Ow0KK30NCitkdC5oZGxpc3QxLnN0cm9uZywgdGQuaGRsaXN0MS5zdHJvbmcgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkLmhkbGlzdDEgew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIHBhZGRpbmctcmlnaHQ6IDAuOGVtOw0KKyAgY29sb3I6IG5hdnk7DQorfQ0KK3RkLmhkbGlzdDIgew0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmhkbGlzdC5jb21wYWN0IHRyIHsNCisgIG1hcmdpbjogMDsNCisgIHBhZGRpbmctYm90dG9tOiAwOw0KK30NCisNCisuY29tbWVudCB7DQorICBiYWNrZ3JvdW5kOiB5ZWxsb3c7DQorfQ0KKw0KKy5mb290bm90ZSwgLmZvb3Rub3RlcmVmIHsNCisgIGZvbnQtc2l6ZTogMC44ZW07DQorfQ0KKw0KK3NwYW4uZm9vdG5vdGUsIHNwYW4uZm9vdG5vdGVyZWYgew0KKyAgdmVydGljYWwtYWxpZ246IHN1cGVyOw0KK30NCisNCisjZm9vdG5vdGVzIHsNCisgIG1hcmdpbjogMjBweCAwIDIwcHggMDsNCisgIHBhZGRpbmc6IDdweCAwIDAgMDsNCit9DQorDQorI2Zvb3Rub3RlcyBkaXYuZm9vdG5vdGUgew0KKyAgbWFyZ2luOiAwIDAgNXB4IDA7DQorfQ0KKw0KKyNmb290bm90ZXMgaHIgew0KKyAgYm9yZGVyOiBub25lOw0KKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHNpbHZlcjsNCisgIGhlaWdodDogMXB4Ow0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCisgIG1hcmdpbi1sZWZ0OiAwOw0KKyAgd2lkdGg6IDIwJTsNCisgIG1pbi13aWR0aDogMTAwcHg7DQorfQ0KKw0KK2Rpdi5jb2xpc3QgdGQgew0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorICBwYWRkaW5nLWJvdHRvbTogMC4zZW07DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCitkaXYuY29saXN0IHRkIGltZyB7DQorICBtYXJnaW4tdG9wOiAwLjNlbTsNCit9DQorDQorQG1lZGlhIHByaW50IHsNCisgICNmb290ZXItYmFkZ2VzIHsgZGlzcGxheTogbm9uZTsgfQ0KK30NCisNCisjdG9jIHsNCisgIG1hcmdpbi1ib3R0b206IDIuNWVtOw0KK30NCisNCisjdG9jdGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuMWVtOw0KK30NCisNCitkaXYudG9jbGV2ZWwwLCBkaXYudG9jbGV2ZWwxLCBkaXYudG9jbGV2ZWwyLCBkaXYudG9jbGV2ZWwzLCBkaXYudG9jbGV2ZWw0IHsNCisgIG1hcmdpbi10b3A6IDA7DQorICBtYXJnaW4tYm90dG9tOiAwOw0KK30NCitkaXYudG9jbGV2ZWwyIHsNCisgIG1hcmdpbi1sZWZ0OiAyZW07DQorICBmb250LXNpemU6IDAuOWVtOw0KK30NCitkaXYudG9jbGV2ZWwzIHsNCisgIG1hcmdpbi1sZWZ0OiA0ZW07DQorICBmb250LXNpemU6IDAuOWVtOw0KK30NCitkaXYudG9jbGV2ZWw0IHsNCisgIG1hcmdpbi1sZWZ0OiA2ZW07DQorICBmb250LXNpemU6IDAuOWVtOw0KK30NCisNCitzcGFuLmFxdWEgeyBjb2xvcjogYXF1YTsgfQ0KK3NwYW4uYmxhY2sgeyBjb2xvcjogYmxhY2s7IH0NCitzcGFuLmJsdWUgeyBjb2xvcjogYmx1ZTsgfQ0KK3NwYW4uZnVjaHNpYSB7IGNvbG9yOiBmdWNoc2lhOyB9DQorc3Bhbi5ncmF5IHsgY29sb3I6IGdyYXk7IH0NCitzcGFuLmdyZWVuIHsgY29sb3I6IGdyZWVuOyB9DQorc3Bhbi5saW1lIHsgY29sb3I6IGxpbWU7IH0NCitzcGFuLm1hcm9vbiB7IGNvbG9yOiBtYXJvb247IH0NCitzcGFuLm5hdnkgeyBjb2xvcjogbmF2eTsgfQ0KK3NwYW4ub2xpdmUgeyBjb2xvcjogb2xpdmU7IH0NCitzcGFuLnB1cnBsZSB7IGNvbG9yOiBwdXJwbGU7IH0NCitzcGFuLnJlZCB7IGNvbG9yOiByZWQ7IH0NCitzcGFuLnNpbHZlciB7IGNvbG9yOiBzaWx2ZXI7IH0NCitzcGFuLnRlYWwgeyBjb2xvcjogdGVhbDsgfQ0KK3NwYW4ud2hpdGUgeyBjb2xvcjogd2hpdGU7IH0NCitzcGFuLnllbGxvdyB7IGNvbG9yOiB5ZWxsb3c7IH0NCisNCitzcGFuLmFxdWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGFxdWE7IH0NCitzcGFuLmJsYWNrLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBibGFjazsgfQ0KK3NwYW4uYmx1ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmx1ZTsgfQ0KK3NwYW4uZnVjaHNpYS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogZ3JheTsgfQ0KK3NwYW4uZ3JlZW4tYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyZWVuOyB9DQorc3Bhbi5saW1lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24tYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG1hcm9vbjsgfQ0KK3NwYW4ubmF2eS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbmF2eTsgfQ0KK3NwYW4ub2xpdmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHB1cnBsZTsgfQ0KK3NwYW4ucmVkLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiByZWQ7IH0NCitzcGFuLnNpbHZlci1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogc2lsdmVyOyB9DQorc3Bhbi50ZWFsLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiB0ZWFsOyB9DQorc3Bhbi53aGl0ZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogd2hpdGU7IH0NCitzcGFuLnllbGxvdy1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogeWVsbG93OyB9DQorDQorc3Bhbi5iaWcgeyBmb250LXNpemU6IDJlbTsgfQ0KK3NwYW4uc21hbGwgeyBmb250LXNpemU6IDAuNmVtOyB9DQorDQorc3Bhbi51bmRlcmxpbmUgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQ0KK3NwYW4ub3ZlcmxpbmUgeyB0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lOyB9DQorc3Bhbi5saW5lLXRocm91Z2ggeyB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsgfQ0KKw0KK2Rpdi51bmJyZWFrYWJsZSB7IHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsgfQ0KKw0KKw0KKy8qDQorICogeGh0bWwxMSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCitkaXYudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDEuNWVtOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlIHsNCisgIGJvcmRlcjogM3B4IHNvbGlkICM1MjdiYmQ7DQorfQ0KK3RoZWFkLCBwLnRhYmxlLmhlYWRlciB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjNTI3YmJkOw0KK30NCitwLnRhYmxlIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKy8qIEJlY2F1c2UgdGhlIHRhYmxlIGZyYW1lIGF0dHJpYnV0ZSBpcyBvdmVycmlkZW4gYnkgQ1NTIGluIG1vc3QgYnJvd3NlcnMuICovDQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0idm9pZCJdIHsNCisgIGJvcmRlci1zdHlsZTogbm9uZTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZVtmcmFtZT0iaHNpZGVzIl0gew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7DQorICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZzaWRlcyJdIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IG5vbmU7DQorICBib3JkZXItYm90dG9tLXN0eWxlOiBub25lOw0KK30NCisNCisNCisvKg0KKyAqIGh0bWw1IHNwZWNpZmljDQorICoNCisgKiAqLw0KKw0KK3RhYmxlLnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQordGhlYWQsIHAudGFibGVibG9jay5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2sgew0KKyAgYm9yZGVyLXdpZHRoOiAzcHg7DQorICBib3JkZXItc3BhY2luZzogMHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCisgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7DQorfQ0KK3RoLnRhYmxlYmxvY2ssIHRkLnRhYmxlYmxvY2sgew0KKyAgYm9yZGVyLXdpZHRoOiAxcHg7DQorICBwYWRkaW5nOiA0cHg7DQorICBib3JkZXItc3R5bGU6IHNvbGlkOw0KKyAgYm9yZGVyLWNvbG9yOiAjNTI3YmJkOw0KK30NCisNCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXRvcGJvdCB7DQorICBib3JkZXItbGVmdC1zdHlsZTogaGlkZGVuOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBoaWRkZW47DQorfQ0KK3RhYmxlLnRhYmxlYmxvY2suZnJhbWUtc2lkZXMgew0KKyAgYm9yZGVyLXRvcC1zdHlsZTogaGlkZGVuOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLW5vbmUgew0KKyAgYm9yZGVyLXN0eWxlOiBoaWRkZW47DQorfQ0KKw0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWxlZnQsIHRkLnRhYmxlYmxvY2suaGFsaWduLWxlZnQgew0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tY2VudGVyLCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1jZW50ZXIgew0KKyAgdGV4dC1hbGlnbjogY2VudGVyOw0KK30NCit0aC50YWJsZWJsb2NrLmhhbGlnbi1yaWdodCwgdGQudGFibGVibG9jay5oYWxpZ24tcmlnaHQgew0KKyAgdGV4dC1hbGlnbjogcmlnaHQ7DQorfQ0KKw0KK3RoLnRhYmxlYmxvY2sudmFsaWduLXRvcCwgdGQudGFibGVibG9jay52YWxpZ24tdG9wIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK3RoLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSwgdGQudGFibGVibG9jay52YWxpZ24tbWlkZGxlIHsNCisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQorfQ0KK3RoLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSwgdGQudGFibGVibG9jay52YWxpZ24tYm90dG9tIHsNCisgIHZlcnRpY2FsLWFsaWduOiBib3R0b207DQorfQ0KKw0KKw0KKy8qDQorICogbWFucGFnZSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCitib2R5Lm1hbnBhZ2UgaDEgew0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjsNCisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBzaWx2ZXI7DQorfQ0KK2JvZHkubWFucGFnZSBoMiB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2JvZHkubWFucGFnZSBkaXYuc2VjdGlvbmJvZHkgew0KKyAgbWFyZ2luLWxlZnQ6IDNlbTsNCit9DQorDQorQG1lZGlhIHByaW50IHsNCisgIGJvZHkubWFucGFnZSBkaXYjdG9jIHsgZGlzcGxheTogbm9uZTsgfQ0KK30NCisNCisNCis8L3N0eWxlPg0KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCisvKjwhW0NEQVRBWyovDQordmFyIGFzY2lpZG9jID0geyAgLy8gTmFtZXNwYWNlLg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIFRhYmxlIE9mIENvbnRlbnRzIGdlbmVyYXRvcg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qIEF1dGhvcjogTWloYWkgQmF6b24sIFNlcHRlbWJlciAyMDAyDQorICogaHR0cDovL3N0dWRlbnRzLmluZm9pYXNpLnJvL35taXNob28NCisgKg0KKyAqIFRhYmxlIE9mIENvbnRlbnQgZ2VuZXJhdG9yDQorICogVmVyc2lvbjogMC40DQorICoNCisgKiBGZWVsIGZyZWUgdG8gdXNlIHRoaXMgc2NyaXB0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljDQorICogTGljZW5zZSwgYXMgbG9uZyBhcyB5b3UgZG8gbm90IHJlbW92ZSBvciBhbHRlciB0aGlzIG5vdGljZS4NCisgKi8NCisNCisgLyogbW9kaWZpZWQgYnkgVHJveSBELiBIYW5zb24sIFNlcHRlbWJlciAyMDA2LiBMaWNlbnNlOiBHUEwgKi8NCisgLyogbW9kaWZpZWQgYnkgU3R1YXJ0IFJhY2toYW0sIDIwMDYsIDIwMDkuIExpY2Vuc2U6IEdQTCAqLw0KKw0KKy8vIHRvY2xldmVscyA9IDEuLjQuDQordG9jOiBmdW5jdGlvbiAodG9jbGV2ZWxzKSB7DQorDQorICBmdW5jdGlvbiBnZXRUZXh0KGVsKSB7DQorICAgIHZhciB0ZXh0ID0gIiI7DQorICAgIGZvciAodmFyIGkgPSBlbC5maXJzdENoaWxkOyBpICE9IG51bGw7IGkgPSBpLm5leHRTaWJsaW5nKSB7DQorICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykgLy8gSUUgZG9lc24ndCBzcGVhayBjb25zdGFudHMuDQorICAgICAgICB0ZXh0ICs9IGkuZGF0YTsNCisgICAgICBlbHNlIGlmIChpLmZpcnN0Q2hpbGQgIT0gbnVsbCkNCisgICAgICAgIHRleHQgKz0gZ2V0VGV4dChpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gdGV4dDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIFRvY0VudHJ5KGVsLCB0ZXh0LCB0b2NsZXZlbCkgew0KKyAgICB0aGlzLmVsZW1lbnQgPSBlbDsNCisgICAgdGhpcy50ZXh0ID0gdGV4dDsNCisgICAgdGhpcy50b2NsZXZlbCA9IHRvY2xldmVsOw0KKyAgfQ0KKw0KKyAgZnVuY3Rpb24gdG9jRW50cmllcyhlbCwgdG9jbGV2ZWxzKSB7DQorICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk7DQorICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1toSF0oWzEtJysodG9jbGV2ZWxzKzEpKyddKScpOw0KKyAgICAvLyBGdW5jdGlvbiB0aGF0IHNjYW5zIHRoZSBET00gdHJlZSBmb3IgaGVhZGVyIGVsZW1lbnRzICh0aGUgRE9NMg0KKyAgICAvLyBub2RlSXRlcmF0b3IgQVBJIHdvdWxkIGJlIGEgYmV0dGVyIHRlY2huaXF1ZSBidXQgbm90IHN1cHBvcnRlZCBieSBhbGwNCisgICAgLy8gYnJvd3NlcnMpLg0KKyAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uIChlbCkgew0KKyAgICAgIGZvciAodmFyIGkgPSBlbC5maXJzdENoaWxkOyBpICE9IG51bGw7IGkgPSBpLm5leHRTaWJsaW5nKSB7DQorICAgICAgICBpZiAoaS5ub2RlVHlwZSA9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7DQorICAgICAgICAgIHZhciBtbyA9IHJlLmV4ZWMoaS50YWdOYW1lKTsNCisgICAgICAgICAgaWYgKG1vICYmIChpLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSB8fCBpLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIikpICE9ICJmbG9hdCIpIHsNCisgICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBuZXcgVG9jRW50cnkoaSwgZ2V0VGV4dChpKSwgbW9bMV0tMSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaXRlcmF0ZShpKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgaXRlcmF0ZShlbCk7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorDQorICB2YXIgdG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvYyIpOw0KKyAgaWYgKCF0b2MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgLy8gRGVsZXRlIGV4aXN0aW5nIFRPQyBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBUT0MuDQorICB2YXIgdG9jRW50cmllc1RvUmVtb3ZlID0gW107DQorICB2YXIgaTsNCisgIGZvciAoaSA9IDA7IGkgPCB0b2MuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgew0KKyAgICB2YXIgZW50cnkgPSB0b2MuY2hpbGROb2Rlc1tpXTsNCisgICAgaWYgKGVudHJ5Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2RpdicNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKQ0KKyAgICAgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLm1hdGNoKC9edG9jbGV2ZWwvKSkNCisgICAgICB0b2NFbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jRW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIHRvYy5yZW1vdmVDaGlsZCh0b2NFbnRyaWVzVG9SZW1vdmVbaV0pOw0KKyAgfQ0KKw0KKyAgLy8gUmVidWlsZCBUT0MgZW50cmllcy4NCisgIHZhciBlbnRyaWVzID0gdG9jRW50cmllcyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGVudCIpLCB0b2NsZXZlbHMpOw0KKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7DQorICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaV07DQorICAgIGlmIChlbnRyeS5lbGVtZW50LmlkID09ICIiKQ0KKyAgICAgIGVudHJ5LmVsZW1lbnQuaWQgPSAiX3RvY18iICsgaTsNCisgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7DQorICAgIGEuaHJlZiA9ICIjIiArIGVudHJ5LmVsZW1lbnQuaWQ7DQorICAgIGEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZW50cnkudGV4dCkpOw0KKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQorICAgIGRpdi5hcHBlbmRDaGlsZChhKTsNCisgICAgZGl2LmNsYXNzTmFtZSA9ICJ0b2NsZXZlbCIgKyBlbnRyeS50b2NsZXZlbDsNCisgICAgdG9jLmFwcGVuZENoaWxkKGRpdik7DQorICB9DQorICBpZiAoZW50cmllcy5sZW5ndGggPT0gMCkNCisgICAgdG9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9jKTsNCit9LA0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEZvb3Rub3RlcyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBCYXNlZCBvbiBmb290bm90ZSBnZW5lcmF0aW9uIGNvZGUgZnJvbToNCisgKiBodHRwOi8vd3d3LmJyYW5kc3BhbmtpbmduZXcubmV0L2FyY2hpdmUvMjAwNS8wNy9mb3JtYXRfZm9vdG5vdGUuaHRtbA0KKyAqLw0KKw0KK2Zvb3Rub3RlczogZnVuY3Rpb24gKCkgew0KKyAgLy8gRGVsZXRlIGV4aXN0aW5nIGZvb3Rub3RlIGVudHJpZXMgaW4gY2FzZSB3ZSdyZSByZWxvYWRpbmcgdGhlIGZvb3Rub2Rlcy4NCisgIHZhciBpOw0KKyAgdmFyIG5vdGVob2xkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9vdG5vdGVzIik7DQorICBpZiAoIW5vdGVob2xkZXIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgdmFyIGVudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgZm9yIChpID0gMDsgaSA8IG5vdGVob2xkZXIuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgew0KKyAgICB2YXIgZW50cnkgPSBub3RlaG9sZGVyLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSA9PSAiZm9vdG5vdGUiKQ0KKyAgICAgIGVudHJpZXNUb1JlbW92ZS5wdXNoKGVudHJ5KTsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCisgICAgbm90ZWhvbGRlci5yZW1vdmVDaGlsZChlbnRyaWVzVG9SZW1vdmVbaV0pOw0KKyAgfQ0KKw0KKyAgLy8gUmVidWlsZCBmb290bm90ZSBlbnRyaWVzLg0KKyAgdmFyIGNvbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGVudCIpOw0KKyAgdmFyIHNwYW5zID0gY29udC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOw0KKyAgdmFyIHJlZnMgPSB7fTsNCisgIHZhciBuID0gMDsNCisgIGZvciAoaT0wOyBpPHNwYW5zLmxlbmd0aDsgaSsrKSB7DQorICAgIGlmIChzcGFuc1tpXS5jbGFzc05hbWUgPT0gImZvb3Rub3RlIikgew0KKyAgICAgIG4rKzsNCisgICAgICB2YXIgbm90ZSA9IHNwYW5zW2ldLmdldEF0dHJpYnV0ZSgiZGF0YS1ub3RlIik7DQorICAgICAgaWYgKCFub3RlKSB7DQorICAgICAgICAvLyBVc2UgW1xzXFNdIGluIHBsYWNlIG9mIC4gc28gbXVsdGktbGluZSBtYXRjaGVzIHdvcmsuDQorICAgICAgICAvLyBCZWNhdXNlIEphdmFTY3JpcHQgaGFzIG5vIHMgKGRvdGFsbCkgcmVnZXggZmxhZy4NCisgICAgICAgIG5vdGUgPSBzcGFuc1tpXS5pbm5lckhUTUwubWF0Y2goL1xzKlxbKFtcc1xTXSopXVxzKi8pWzFdOw0KKyAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0NCisgICAgICAgICAgIls8YSBpZD0nX2Zvb3Rub3RlcmVmXyIgKyBuICsgIicgaHJlZj0nI19mb290bm90ZV8iICsgbiArDQorICAgICAgICAgICInIHRpdGxlPSdWaWV3IGZvb3Rub3RlJyBjbGFzcz0nZm9vdG5vdGUnPiIgKyBuICsgIjwvYT5dIjsNCisgICAgICAgIHNwYW5zW2ldLnNldEF0dHJpYnV0ZSgiZGF0YS1ub3RlIiwgbm90ZSk7DQorICAgICAgfQ0KKyAgICAgIG5vdGVob2xkZXIuaW5uZXJIVE1MICs9DQorICAgICAgICAiPGRpdiBjbGFzcz0nZm9vdG5vdGUnIGlkPSdfZm9vdG5vdGVfIiArIG4gKyAiJz4iICsNCisgICAgICAgICI8YSBocmVmPScjX2Zvb3Rub3RlcmVmXyIgKyBuICsgIicgdGl0bGU9J1JldHVybiB0byB0ZXh0Jz4iICsNCisgICAgICAgIG4gKyAiPC9hPi4gIiArIG5vdGUgKyAiPC9kaXY+IjsNCisgICAgICB2YXIgaWQgPXNwYW5zW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsNCisgICAgICBpZiAoaWQgIT0gbnVsbCkgcmVmc1siIyIraWRdID0gbjsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG4gPT0gMCkNCisgICAgbm90ZWhvbGRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vdGVob2xkZXIpOw0KKyAgZWxzZSB7DQorICAgIC8vIFByb2Nlc3MgZm9vdG5vdGVyZWZzLg0KKyAgICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICAgIGlmIChzcGFuc1tpXS5jbGFzc05hbWUgPT0gImZvb3Rub3RlcmVmIikgew0KKyAgICAgICAgdmFyIGhyZWYgPSBzcGFuc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLmdldEF0dHJpYnV0ZSgiaHJlZiIpOw0KKyAgICAgICAgaHJlZiA9IGhyZWYubWF0Y2goLyMuKi8pWzBdOyAgLy8gQmVjYXVzZSBJRSByZXR1cm4gZnVsbCBVUkwuDQorICAgICAgICBuID0gcmVmc1tocmVmXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaHJlZj0nI19mb290bm90ZV8iICsgbiArDQorICAgICAgICAgICInIHRpdGxlPSdWaWV3IGZvb3Rub3RlJyBjbGFzcz0nZm9vdG5vdGUnPiIgKyBuICsgIjwvYT5dIjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9LA0KKw0KK2luc3RhbGw6IGZ1bmN0aW9uKHRvY2xldmVscykgew0KKyAgdmFyIHRpbWVySWQ7DQorDQorICBmdW5jdGlvbiByZWluc3RhbGwoKSB7DQorICAgIGFzY2lpZG9jLmZvb3Rub3RlcygpOw0KKyAgICBpZiAodG9jbGV2ZWxzKSB7DQorICAgICAgYXNjaWlkb2MudG9jKHRvY2xldmVscyk7DQorICAgIH0NCisgIH0NCisNCisgIGZ1bmN0aW9uIHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyKCkgew0KKyAgICBjbGVhckludGVydmFsKHRpbWVySWQpOw0KKyAgICByZWluc3RhbGwoKTsNCisgIH0NCisNCisgIHRpbWVySWQgPSBzZXRJbnRlcnZhbChyZWluc3RhbGwsIDUwMCk7DQorICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikNCisgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIHJlaW5zdGFsbEFuZFJlbW92ZVRpbWVyLCBmYWxzZSk7DQorICBlbHNlDQorICAgIHdpbmRvdy5vbmxvYWQgPSByZWluc3RhbGxBbmRSZW1vdmVUaW1lcjsNCit9DQorDQorfQ0KK2FzY2lpZG9jLmluc3RhbGwoKTsNCisvKl1dPiovDQorPC9zY3JpcHQ+DQorPC9oZWFkPg0KKzxib2R5IGNsYXNzPSJtYW5wYWdlIj4NCis8ZGl2IGlkPSJoZWFkZXIiPg0KKzxoMT4NCitzeXNsaW51eC5jZmcoNSkgTWFudWFsIFBhZ2UNCis8L2gxPg0KKzxoMj5OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPHA+c3lzbGludXguY2ZnIC0NCisgICAqU3lzbGludXgqIGNvbmZpZ3VyYXRpb24gZmlsZQ0KKzwvcD4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJjb250ZW50Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZGVzY3JpcHRpb24iPkRFU0NSSVBUSU9OPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Db25maWd1cmF0aW9uIGZvciB0aGUgYm9vdCBiZWhhdmlvciBhbmQgdXNlciBleHBlcmllbmNlIG9mIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4NCitib290IGxvYWRlcnMsIHRoZSBmb3JtYXQgb2YgZGlzcGxheSBmaWxlcyBhbmQgdGhlIGJvb3QgcHJvbXB0IGJlaGF2aW9yLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIG5vdCBjb21wbGV0ZWx5IGRlY29kZWQuICBTeW50YXgNCitkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGRlc2NyaWJlZCBhYm92ZSBtYXkgc3RpbGwgd29yayBjb3JyZWN0bHkgaW4gdGhpcw0KK3ZlcnNpb24gb2YgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiwgYnV0IG1heSBicmVhayBpbiBhIGZ1dHVyZSBvbmUuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9sb2NhdGlvbl9uYW1lIj5MT0NBVElPTi9OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IChiZWZvcmUgNC4wMCkgdXNlZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlbmFtZSBvZg0KK3N5c2xpbnV4LmNmZy4gIDxzdHJvbmc+RVhUTElOVVg8L3N0cm9uZz4gKG1lcmdlZCBpbnRvIDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gYXMgb2YgNC4wMCkgdXNlZCB0aGUNCitmaWxlbmFtZSBleHRsaW51eC5jb25mLiAgQm90aCBkZWZhdWx0IHRvIHNlYXJjaGluZyBmb3IgdGhlIGNvbmZpZyBmaWxlDQoraW4gdGhlIGluc3RhbGxlZCBkaXJlY3RvcnkgKGNvbnRhaW5pbmcgbGRsaW51eC5zeXMvZXh0bGludXguc3lzKS4gIEFzIG9mDQorNC4wMCwgPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiB3aWxsIHNlYXJjaCBmb3IgZXh0bGludXguY29uZiB0aGVuIHN5c2xpbnV4LmNmZyBpbiBlYWNoDQorZGlyZWN0b3J5IGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdGhlIG5leHQgZGlyZWN0b3J5LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkFzIG9mIDMuMzUsIDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4gYWxzbyBzZWFyY2hlcyAvYm9vdC9zeXNsaW51eCwgL3N5c2xpbnV4IGFuZCAvLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gKGJlZm9yZSA0LjAyKSB1c2VkIHRoZSBjb25maWd1cmF0aW9uIGZpbGVuYW1lIG9mDQoraXNvbGludXguY2ZnLCBzZWFyY2hpbmcgIC9ib290L2lzb2xpbnV4IChzdGFydGluZyAyLjAwKSwgdGhlbiAvaXNvbGludXgNCithbmQgLy4gIEFzIG9mIDQuMDIsIDxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gd2lsbCBzZWFyY2ggZm9yIGlzb2xpbnV4LmNmZyB0aGVuDQorc3lzbGludXguY2ZnIGluIC9ib290L2lzb2xpbnV4IGJlZm9yZSBzZWFyY2hpbmcgZm9yIHRoZSBzYW1lIGZpbGVzIGluDQorL2lzb2xpbnV4LCAvYm9vdC9zeXNsaW51eCwgL3N5c2xpbnV4LCBhbmQgLy48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2dsb2JhbF9kaXJlY3RpdmVzX21haW4iPkdMT0JBTCBESVJFQ1RJVkVTIC0gTUFJTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiM8L3N0cm9uZz4gY29tbWVudA0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0EgbGluZSBjb21tZW50LiAgQXMgb2YgdmVyc2lvbiAzLjEwLCB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgPHN0cm9uZz4jPC9zdHJvbmc+IGFuZCB0aGUNCitjb21tZW50IGlzIG5vIGxvbmdlciByZXF1aXJlZC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+TUVOVTwvc3Ryb25nPiBhbnkgc3RyaW5nDQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDMuMDArKSBBIGRpcmVjdGl2ZSBmb3IgdGhlIHNpbXBsZSBtZW51IHN5c3RlbSwgdHJlYXRlZCBhcyBhIGNvbW1lbnQNCitvdXRzaWRlIHRoZSBtZW51LiAgU2VlIG1lbnUudHh0Lg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5JTkNMVURFPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYW5vdGhlciBmaWxlIGF0IHRoaXMgcG9pbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24NCitmaWxlLiBGaWxlcyBjYW4gY3VycmVudGx5IGJlIG5lc3RlZCB1cCB0byAxNiBsZXZlbHMgZGVlcCwgYnV0IGl0IGlzIG5vdA0KK2d1YXJhbnRlZWQgdGhhdCBtb3JlIHRoYW4gOCBsZXZlbHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+REVGQVVMVDwvc3Ryb25nPiA8ZW0+a2VybmVsPC9lbT4gPGVtPm9wdGlvbnMmIzgyMzA7PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitTZXRzIHRoZSBkZWZhdWx0IGNvbW1hbmQgbGluZSAod2hpY2ggb2Z0ZW4gcmVmZXJlbmNlcyBhIExBQkVMKS4gIElmDQorPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBib290cyBhdXRvbWF0aWNhbGx5LCBpdCB3aWxsIGFjdCBqdXN0IGFzIGlmIHRoZSBlbnRyaWVzIGFmdGVyDQorPHN0cm9uZz5ERUZBVUxUPC9zdHJvbmc+IGhhZCBiZWVuIHR5cGVkIGluIGF0IHRoZSA8ZW0+Ym9vdDo8L2VtPiBwcm9tcHQuICBNdWx0aXBsZSB1c2VzIHdpbGwNCityZXN1bHQgaW4gYW4gb3ZlcnJpZGUuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgbm8gY29uZmlndXJhdGlvbiBmaWxlIGlzIHByZXNlbnQsIG9yIG5vIDxzdHJvbmc+REVGQVVMVDwvc3Ryb25nPiBvciA8c3Ryb25nPlVJPC9zdHJvbmc+IGVudHJ5IGlzDQorcHJlc2VudCBpbiB0aGUgY29uZmlnIGZpbGUsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGFuZCB0aGUNCis8ZW0+Ym9vdDo8L2VtPiBwcm9tcHQgaXMgc2hvd24gKDMuODUrKS48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+VUk8L3N0cm9uZz4gPGVtPm1vZHVsZTwvZW0+IDxlbT5vcHRpb25zJiM4MjMwOzwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorU2VsZWN0cyBhIHNwZWNpZmljIHVzZXIgaW50ZXJmYWNlIDxlbT5tb2R1bGU8L2VtPiAodHlwaWNhbGx5IG1lbnUuYzMyIG9yDQordmVzYW1lbnUuYzMyKS4gIFRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHRyZWF0cyB0aGlzIGFzIGEgZGlyZWN0aXZlDQordGhhdCBvdmVycmlkZXMgdGhlIDxzdHJvbmc+REVGQVVMVDwvc3Ryb25nPiBkaXJlY3RpdmUgdG8gbG9hZCB0aGlzIG1vZHVsZSBpbnN0ZWFkIGF0DQorc3RhcnR1cCwgZm9yIGFuIGVtcHR5IGNvbW1hbmQgbGluZSBhbmQgYXQgdGltZW91dCBhbmQgPHN0cm9uZz5QUk9NUFQ8L3N0cm9uZz4gZGlyZWN0aXZlDQordG8gbm90IHByb21wdCAoYnV0IHRoZXNlIGRpcmVjdGl2ZXMgbWF5IGhhdmUgZWZmZWN0cyBvbiBvdGhlcg0KK2NvbmZpZ3VyYXRpb24gcGFyc2VycykuICBNdWx0aXBsZSB1c2VzIHdpbGwgcmVzdWx0IGluIGFuIG92ZXJyaWRlLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5MQUJFTDwvc3Ryb25nPiA8ZW0+bXlsYWJlbDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorQmVnaW4gYSBuZXcgPHN0cm9uZz5MQUJFTDwvc3Ryb25nPiBjbGF1c2UuICBJZiA8ZW0+bXlsYWJlbDwvZW0+IGlzIGVudGVyZWQgYXMgdGhlIGtlcm5lbCB0bw0KK2Jvb3QsIDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gc2hvdWxkIGluc3RlYWQgYm9vdCAiaW1hZ2UiIChzcGVjaWZpZWQgYnkgYSBkaXJlY3RpdmUNCitmcm9tIDxzdHJvbmc+S0VSTkVMLUxJS0UgRElSRUNUSVZFUzwvc3Ryb25nPikgd2l0aCBhbnkgc3BlY2lmaWVkIDxzdHJvbmc+RFVBTC1QVVJQT1NFDQorRElSRUNUSVZFUzwvc3Ryb25nPiBiZWluZyB1c2VkIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBpbnN0YW5jZS4NCis8L3A+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48ZW0+bXlsYWJlbDwvZW0+IG11c3QgYmUgdW5pcXVlLiAgQ3VycmVudGx5IHRoZSBmaXJzdCBpbnN0YW5jZSBpcyB1c2VkIGJ1dCBtYXkNCityZXN1bHQgaW4gYW4gZXJyb3Igb3IgdW5kZXNpcmVkIGJlaGF2aW9yLiAgPGVtPm15bGFiZWw8L2VtPiBlbmRzIGF0IHRoZSBmaXJzdA0KK2NoYXJhY3RlciB0aGF0IGlzIG5vdCBhIG5vbi13aGl0ZS1zcGFjZSBwcmludGFibGUgY2hhcmFjdGVyIGFuZCBzaG91bGQNCitiZSByZXN0cmljdGVkIHRvIG5vbi13aGl0ZS1zcGFjZSB0eXBlYWJsZSBjaGFyYWN0ZXJzLiAgUHJpb3IgdG8gdmVyc2lvbg0KKzMuMzIsIHRoaXMgd291bGQgdHJhbnNmb3JtZWQgdG8gYSBET1MgY29tcGF0aWJsZSBmb3JtYXQgb2YgOC4zIHdpdGggYQ0KK3Jlc3RyaWN0ZWQgY2hhcmFjdGVyIHNldC4gIEEgPHN0cm9uZz5MQUJFTDwvc3Ryb25nPiBjbGF1c2UgbXVzdCBjb250YWluIGV4YWN0bHkgMSBvZg0KK3RoZSA8c3Ryb25nPktFUk5FTC1MSUtFIERJUkVDVElWRVM8L3N0cm9uZz4gYW5kIG1heSBjb250YWluIDEgZWFjaCBvZiB0aGUgPHN0cm9uZz5MQUJFTC1PTkxZDQorRElSRUNUSVZFUzwvc3Ryb25nPiBvciA8c3Ryb25nPkRVQUwtUFVSUE9TRSBESVJFQ1RJVkVTPC9zdHJvbmc+LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPldpdGhpbiBhIDxzdHJvbmc+TEFCRUw8L3N0cm9uZz4sIHVzaW5nIG11bHRpcGxlIDxzdHJvbmc+S0VSTkVMLUxJS0UgRElSRUNUSVZFUzwvc3Ryb25nPiBvciByZXVzZSBvZg0KKzxzdHJvbmc+TEFCRUwtT05MWSBESVJFQ1RJVkVTPC9zdHJvbmc+IG9yIDxzdHJvbmc+RFVBTC1QVVJQT1NFIERJUkVDVElWRVM8L3N0cm9uZz4gd2lsbCByZXN1bHQgaW4gYW4NCitvdmVycmlkZS4gIE90aGVyd2lzZSwgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGRpcmVjdGl2ZSB3aWxsDQorcmVzdWx0IGluIHRoZSBsYXN0IGJlaW5nIGVmZmVjdGl2ZS48L3A+PC9kaXY+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9kdWFsX3B1cnBvc2VfZGlyZWN0aXZlcyI+RFVBTC1QVVJQT1NFIERJUkVDVElWRVM8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlVzZSBvZiBhbnkgb2YgdGhlIDxzdHJvbmc+RFVBTC1QVVJQT1NFIERJUkVDVElWRVM8L3N0cm9uZz4gYXMgPHN0cm9uZz5HTE9CQUwgRElSRUNUSVZFUzwvc3Ryb25nPiBpcw0KK2Rpc2NvdXJhZ2VkIGlmIHRoZXJlIHdpbGwgYmUgYW55IG5vbi1MaW51eCBpbWFnZXMgbG9hZGVkIGFzIDxzdHJvbmc+QUxMPC9zdHJvbmc+IGltYWdlcw0KK3dpbGwgZ2V0IHRoZXNlLCBpbmNsdWRpbmcgdGhvc2UgbWFudWFsbHkgZW50ZXJlZCBhdCB0aGUgPGVtPmJvb3Q6PC9lbT4gcHJvbXB0LjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4gPGVtPm9wdGlvbnMmIzgyMzA7PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitBZGQgb25lIG9yIG1vcmUgb3B0aW9ucyB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4gIFRoZXNlIGFyZSBhZGRlZA0KK2JvdGggZm9yIGF1dG9tYXRpYyBhbmQgbWFudWFsIGJvb3RzLiAgVGhlIG9wdGlvbnMgYXJlIGFkZGVkIGF0IHRoZSB2ZXJ5DQorYmVnaW5uaW5nIG9mIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLCB1c3VhbGx5IHBlcm1pdHRpbmcgZXhwbGljaXRseQ0KK2VudGVyZWQga2VybmVsIG9wdGlvbnMgdG8gb3ZlcnJpZGUgdGhlbS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlDQorTElMTyAiYXBwZW5kIiBvcHRpb24uDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VXNlIG9mIHRoZSBwYXJhbWV0ZXIgPGVtPmluaXRyZD08L2VtPiBzdXBwb3J0cyBtdWx0aXBsZSBmaWxlbmFtZXMgc2VwYXJhdGVkIGJ5DQorY29tbWFzIChpZSA8ZW0+aW5pdHJkPWluaXRyZF9maWxlMSxpbml0cmRfZmlsZTI8L2VtPikgd2l0aGluIGEgc2luZ2xlIGluc3RhbmNlLg0KK1RoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgaW5pdHJhbWZzLCB3aGljaCBjYW4gYmUgY29tcG9zZWQgb2YgbXVsdGlwbGUNCitzZXBhcmF0ZSBjcGlvIG9yIGNwaW8uZ3ogYXJjaGl2ZXMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Tm90ZTogYWxsIGluaXRyZCBmaWxlcyBleGNlcHQgdGhlIGxhc3Qgb25lIGFyZSB6ZXJvLXBhZGRlZCB0byBhIDRLIHBhZ2UNCitib3VuZGFyeS4gIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgaW5pdHJhbWZzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk5vdGU6IE9ubHkgdGhlIGxhc3QgZWZmZWN0aXZlIDxlbT5pbml0cmQ9PC9lbT4gcGFyYW1ldGVyIGlzIHVzZWQgZm9yIGxvYWRpbmcNCitpbml0cmQgZmlsZXMuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkFQUEVORDwvc3Ryb25nPiAtDQorPC9kdD4NCis8ZGQ+DQorPHA+DQorQXBwZW5kIG5vdGhpbmcuICA8c3Ryb25nPkFQUEVORDwvc3Ryb25nPiB3aXRoIGEgc2luZ2xlIGh5cGhlbiBhcyBhcmd1bWVudCBpbiBhIDxzdHJvbmc+TEFCRUw8L3N0cm9uZz4NCitzZWN0aW9uIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIGEgZ2xvYmFsIDxzdHJvbmc+QVBQRU5EPC9zdHJvbmc+Lg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+U1lTQVBQRU5EPC9zdHJvbmc+IDxlbT5iaXRtYXNrPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5JUEFQUEVORDwvc3Ryb25nPiA8ZW0+Yml0bWFzazwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDxzdHJvbmc+U1lTQVBQRU5EPC9zdHJvbmc+OiA1LjEwKzsgPHN0cm9uZz5JUEFQUEVORDwvc3Ryb25nPjogPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiBvbmx5KQ0KK1RoZSA8c3Ryb25nPlNZU0FQUEVORDwvc3Ryb25nPiBvcHRpb24gd2FzIGludHJvZHVjZWQgaW4gPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiA1LjEwOyBpdCBpcyBhbg0KK2VuaGFuY2VtZW50IG9mIGEgcHJldmlvdXMgb3B0aW9uIDxzdHJvbmc+SVBBUFBFTkQ8L3N0cm9uZz4gd2hpY2ggd2FzIG9ubHkgYXZhaWxhYmxlIG9uDQorPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPi4gIDxlbT5iaXRtYXNrPC9lbT4gaXMgaW50ZXJwcmV0ZWQgYXMgZGVjaW1hbCBmb3JtYXQgdW5sZXNzIHByZWZpeGVkDQord2l0aCAiMHgiIGZvciBoZXhhZGVjaW1hbCBvciAiMCIgKHplcm8pIGZvciBvY3RhbC4gIFRoZSA8ZW0+Yml0bWFzazwvZW0+IGlzIGFuDQorT1IgKHN1bSkgb2YgdGhlIGZvbGxvd2luZyBpbnRlZ2VyIG9wdGlvbnM6DQorPC9wPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPjE8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitBbiBvcHRpb24gb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCwgYmFzZWQgb24NCit0aGUgaW5wdXQgZnJvbSB0aGUgREhDUC9CT09UUCBvciBQWEUgYm9vdCBzZXJ2ZXIgYW5kIGFkZGVkIHRvIHRoZSBrZXJuZWwNCitjb21tYW5kIGxpbmUoc2VlIG5vdGUgYmVsb3c7IGVtcHR5IGZvciBub24tUFhFTElOVVggdmFyaWFudHMpOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+aXA9Jmx0O2NsaWVudC1pcCZndDs6Jmx0O2Jvb3Qtc2VydmVyLWlwJmd0OzombHQ7Z3ctaXAmZ3Q7OiZsdDtuZXRtYXNrJmd0OzwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJhZG1vbml0aW9uYmxvY2siPg0KKzx0YWJsZT48dHI+DQorPHRkIGNsYXNzPSJpY29uIj4NCis8ZGl2IGNsYXNzPSJ0aXRsZSI+Tm90ZTwvZGl2Pg0KKzwvdGQ+DQorPHRkIGNsYXNzPSJjb250ZW50Ij5UaGUgdXNlIG9mIG9wdGlvbiAxIGlzIG5vIHN1YnN0aXR1dGUgZm9yIHJ1bm5pbmcgYSBESENQIGNsaWVudCBpbg0KK3RoZSBib290ZWQgc3lzdGVtIGFuZCBzaG91bGQgaW5zdGVhZCBvbmx5IGJlIHVzZWQgdG8gc2VlZCB0aGUgY2xpZW50IGZvcg0KK2EgcmVxdWVzdC4gIFdpdGhvdXQgcmVndWxhciByZW5ld2FscywgdGhlIGxlYXNlIGFjcXVpcmVkIGJ5IHRoZSBQWEUgQklPUw0KK3dpbGwgZXhwaXJlLCBtYWtpbmcgdGhlIElQIGFkZHJlc3MgYXZhaWxhYmxlIGZvciByZXVzZSBieSB0aGUgREhDUA0KK3NlcnZlci48L3RkPg0KKzwvdHI+PC90YWJsZT4NCis8L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4yPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorQW4gb3B0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0IHNob3VsZCBiZSBnZW5lcmF0ZWQsIGluDQorZGFzaC1zZXBhcmF0ZWQgaGV4YWRlY2ltYWwgd2l0aCBsZWFkaW5nIGhhcmR3YXJlIHR5cGUgKHNhbWUgYXMgZm9yIHRoZQ0KK2NvbmZpZ3VyYXRpb24gZmlsZTsgc2VlIHB4ZWxpbnV4LnR4dC4pIGFuZCBhZGRlZCB0byB0aGUga2VybmVsIGNvbW1hbmQNCitsaW5lLCBhbGxvd2luZyBhbiBpbml0cmQgcHJvZ3JhbSB0byBkZXRlcm1pbmUgZnJvbSB3aGljaCBpbnRlcmZhY2UgdGhlDQorc3lzdGVtIGJvb3RlZChlbXB0eSBmb3Igbm9uLVBYRUxJTlVYIHZhcmlhbnRzKToNCis8L3A+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPkJPT1RJRj0mbHQ7aGFyZHdhcmUtYWRkcmVzcy1vZi1ib290LWludGVyZmFjZSZndDs8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+NDwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0FuIG9wdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdCBzaG91bGQgYmUgZ2VuZXJhdGVkLCBpbiBsb3dlcg0KK2Nhc2UgaGV4YWRlY2ltYWwgaW4gdGhlIGZvcm1hdCBub3JtYWxseSB1c2VkIGZvciBVVUlEcyAoc2FtZSBhcyBmb3IgdGhlDQorY29uZmlndXJhdGlvbiBmaWxlOyBzZWUgcHhlbGludXgudHh0LikgYW5kIGFkZGVkIHRvIHRoZSBrZXJuZWwgY29tbWFuZA0KK2xpbmU6DQorPC9wPg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5TWVNVVUlEPSZsdDtzeXN0ZW0gdXVpZCZndDs8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+ODwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyg1LjEwKykgaW5kaWNhdGUgdGhlIENQVSBmYW1pbHkgYW5kIGNlcnRhaW4gcGFydGljdWxhcmx5DQorc2lnbmlmaWNhbnQgQ1BVIGZlYXR1cmUgYml0czoNCis8L3A+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPkNQVT0mbHQ7ZmFtaWx5Jmd0OyZsdDtmZWF0dXJlcyZndDs8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgJmx0O2ZhbWlseSZndDsgaXMgYSBzaW5nbGUgZGlnaXQgZnJvbSAzIChpMzg2KSB0byA2IChpNjg2IG9yIGhpZ2hlci4pICBUaGUNCitmb2xsb3dpbmcgQ1BVIGZlYXR1cmVzIGFyZSBjdXJyZW50bHkgcmVwb3J0ZWQ7IGFkZGl0aW9uYWwgZmxhZ3MgbWF5IGJlDQorYWRkZWQgaW4gdGhlIGZ1dHVyZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPlAgICAgICAgUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24gKFBBRSkNCitWICAgICAgIEludGVsIFZpcnR1YWxpemF0aW9uIFRlY2hub2xvZ3kgKFZUL1ZNWCkNCitUICAgICAgIEludGVsIFRydXN0ZWQgRXhlY3Rpb24gVGVjaG5vbG9neSAoVFhUL1NNWCkNCitYICAgICAgIEV4ZWN1dGlvbiBEaXNhYmxlIChYRC9OWCkNCitMICAgICAgIExvbmcgTW9kZSAoeDg2LTY0KQ0KK1MgICAgICAgQU1EIFNNWCB2aXJ0dWFsaXphdGlvbjwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5ETUk8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoNS4xMCspIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgZGVyaXZlZCBmcm9tIERNSS9TTUJJT1MNCitpbmZvcm1hdGlvbiBpZiBhdmFpbGFibGU6DQorPC9wPg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5CaXQgICAgIFN0cmluZyAgICAgICAgICBTaWduaWZpY2FuY2UNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorMHgwMDAxMCBTWVNWRU5ET1I9ICAgICAgU3lzdGVtIHZlbmRvciBuYW1lDQorMHgwMDAyMCBTWVNQUk9EVUNUPSAgICAgU3lzdGVtIHByb2R1Y3QgbmFtZQ0KKzB4MDAwNDAgU1lTVkVSU0lPTj0gICAgIFN5c3RlbSB2ZXJzaW9uDQorMHgwMDA4MCBTWVNTRVJJQUw9ICAgICAgU3lzdGVtIHNlcmlhbCBudW1iZXINCisweDAwMTAwIFNZU1NLVT0gICAgICAgICBTeXN0ZW0gU0tVDQorMHgwMDIwMCBTWVNGQU1JTFk9ICAgICAgU3lzdGVtIGZhbWlseQ0KKzB4MDA0MDAgTUJWRU5ET1I9ICAgICAgIE1vdGhlcmJvYXJkIHZlbmRvciBuYW1lDQorMHgwMDgwMCBNQlZFUlNJT049ICAgICAgTW90aGVyYm9hcmQgdmVyc2lvbg0KKzB4MDEwMDAgTUJTRVJJQUw9ICAgICAgIE1vdGhlcmJvYXJkIHNlcmlhbCBudW1iZXINCisweDAyMDAwIE1CQVNTRVQ9ICAgICAgICBNb3RoZXJib2FyZCBhc3NldCB0YWcNCisweDA0MDAwIEJJT1NWRU5ET1I9ICAgICBCSU9TIHZlbmRvciBuYW1lDQorMHgwODAwMCBCSU9TVkVSU0lPTj0gICAgQklPUyB2ZXJzaW9uDQorMHgxMDAwMCBTWVNGRj0gICAgICAgICAgU3lzdGVtIGZvcm0gZmFjdG9yPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgdGhlc2Ugc3RyaW5ncyBjb250YWluIHdoaXRlLXNwYWNlIGNoYXJhY3RlcnMsIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGgNCit1bmRlcnNjb3JlcyAoXykuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlIHN5c3RlbSBmb3JtIGZhY3RvciB2YWx1ZSBpcyBhIG51bWJlciBkZWZpbmVkIGluIHRoZSBTTUJJT1MNCitzcGVjaWZpY2F0aW9uLCBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5kbXRmLm9yZy8iPmh0dHA6Ly93d3cuZG10Zi5vcmcvPC9hPi4gIEFzIG9mIHZlcnNpb24gMi43LjENCitvZiB0aGUgc3BlY2lmaWNhdGlvbiwgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGRlZmluZWQ6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4gMSAgICAgT3RoZXINCisgMiAgICAgVW5rbm93bg0KKyAzICAgICBEZXNrdG9wDQorIDQgICAgIExvdyBwcm9maWxlIGRlc2t0b3ANCisgNSAgICAgUGl6emEgYm94DQorIDYgICAgIE1pbmkgdG93ZXINCisgNyAgICAgVG93ZXINCisgOCAgICAgUG9ydGJsZQ0KKyA5ICAgICBMYXB0b3ANCisxMCAgICAgTm90ZWJvb2sNCisxMSAgICAgSGFuZGhlbGQNCisxMiAgICAgRG9ja2luZyBzdGF0aW9uDQorMTMgICAgIEFsbC1pbi1vbmUNCisxNCAgICAgU3Vibm90ZWJvb2sNCisxNSAgICAgU3BhY2Utc2F2aW5nDQorMTYgICAgIEx1bmNoIGJveA0KKzE3ICAgICBNYWluIHNlcnZlciBjaGFzc2lzDQorMTggICAgIEV4cGFuc2lvbiBjaGFzc2lzDQorMTkgICAgIFN1YmNoYXNzaXMNCisyMCAgICAgQnVzIGV4cGFuc2lvbiBjaGFzc2lzDQorMjEgICAgIFBlcmlwaGVyYWwgY2hhc3Npcw0KKzIyICAgICBSQUlEIGNoYXNzaXMNCisyMyAgICAgUmFjayBtb3VudCBjaGFzc3MNCisyNCAgICAgU2VhbGVkLWNhc2UgUEMNCisyNSAgICAgTXVsdGktc3lzdGVtIGNoYXNzaXMNCisyNiAgICAgQ29tcGFjdCBQQ0kNCisyNyAgICAgQWR2YW5jZWQgVENJDQorMjggICAgIEJsYWRlDQorMjkgICAgIEJsYWRlIGVuY2xvc3VyZTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9rZXJuZWxfbGlrZV9kaXJlY3RpdmVzIj5LRVJORUwtTElLRSBESVJFQ1RJVkVTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+S0VSTkVMPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorTG9hZCBhIGtlcm5lbC1saWtlIGZpbGUgPGVtPmltYWdlPC9lbT4gd2l0aCBhdXRvbWF0aWMgZmlsZXR5cGUgZGV0ZWN0aW9uIGJhc2VkDQorb24gZmlsZSBleHRlbnNpb24sIGxpc3RlZCB1bmRlciB0aGUgbm9uLWF1dG8tZGV0ZWN0aW5nIGRpcmVjdGl2ZXMsDQorZGVmYXVsdGluZyB0byA8c3Ryb25nPkxJTlVYPC9zdHJvbmc+Lg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48c3Ryb25nPkxJTlVYPC9zdHJvbmc+IGlzIHVzZWQgYXMgYW4gZXhhbXBsZV0NCis8c3Ryb25nPkxJTlVYPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+OjoNCitMb2FkIDxlbT5pbWFnZTwvZW0+IGFzIGEgTGludXgtbGlrZSBrZXJuZWwuIE1FTURJU0sgaXMgYW4gZXhhbXBsZSBvZiBhDQorbm9uLUxpbnV4IGtlcm5lbCBsb2FkZWQgaW4gYSBMaW51eC1saWtlIGZhc2hpb24uPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkJPT1Q8L3N0cm9uZz4gPGVtPmltYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoPHN0cm9uZz5JU09MSU5VWDwvc3Ryb25nPiBvbmx5OiAuYmluOyA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IG9ubHk6IC5icykgTG9hZCBhIGJvb3Qgc2VjdG9yLiAgLmJpbg0KK2lzIGEgIkNEIGJvb3Qgc2VjdG9yIiBhbmQgLmJzIGlzIGEgcmVndWxhciBkaXNrIGJvb3Qgc2VjdG9yLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5CU1M8L3N0cm9uZz4gPGVtPmltYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBvbmx5OiAuYnNzKSBMb2FkIGEgQlNTIGltYWdlLCBhIC5icyBpbWFnZSB3aXRoIHRoZSBET1MNCitzdXBlcmJsb2NrIHBhdGNoZWQgaW4uDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkNPTUJPT1Q8L3N0cm9uZz4gPGVtPmltYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoLmNvbSwgLmNidDsgUmVtb3ZlZCBhcyBvZiA1LjAwKSBMb2FkIGEgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBDT01CT09UIGltYWdlLiAgLmNvbQ0KK2ltYWdlcyBtYXkgYWxzbyBiZSBydW5uYWJsZSBmcm9tIERPUyB3aGlsZSAuY2J0IGltYWdlcyBhcmUgbm90LiAgU2VlDQorYWxzbyA8c3Ryb25nPmNvbWJvb3QudHh0PC9zdHJvbmc+DQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkNPTTMyPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKC5jMzIpIExvYWQgYSA8c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+IENPTTMyICgzMi1iaXQgPHN0cm9uZz5DT01CT09UPC9zdHJvbmc+KSBpbWFnZS4gIFNlZSBhbHNvDQorPHN0cm9uZz5jb21ib290LnR4dDwvc3Ryb25nPg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5DT05GSUc8L3N0cm9uZz4gPGVtPmltYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitMb2FkIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgcmVhZCwgdGhlDQord29ya2luZyBkaXJlY3RvcnkgaXMgY2hhbmdlZCAoaWYgc3BlY2lmaWVkIHZpYSBhbiA8c3Ryb25nPkFQUEVORDwvc3Ryb25nPiksIHRoZW4gdGhlDQorY29uZmlndXJhdGlvbiBmaWxlIGlzIHBhcnNlZC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RkRJTUFHRTwvc3Ryb25nPiA8ZW0+aW1hZ2U8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyhSZW1vdmVkIGFzIG9mIDQuMDUsIGFkZGVkIDEuNjU7IDxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4gb25seTogLmltZykgTG9hZCBhIGRpc2sNCitpbWFnZS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+TE9DQUxCT09UPC9zdHJvbmc+IDxlbT50eXBlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoPHN0cm9uZz5QWEVMSU5VWDwvc3Ryb25nPiAxLjUzKzsgPHN0cm9uZz5JU09MSU5VWDwvc3Ryb25nPiA/PzMuMTArOyA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IDMuNzArKUF0dGVtcHQgYQ0KK2RpZmZlcmVudCBsb2NhbCBib290IG1ldGhvZC4gIFRoZSBzcGVjaWFsIHZhbHVlIC0xIGNhdXNlcyB0aGUgYm9vdA0KK2xvYWRlciB0byByZXBvcnQgZmFpbHVyZSB0byB0aGUgQklPUywgd2hpY2gsIG9uIHJlY2VudCBCSU9TZXMsIHNob3VsZA0KK21lYW4gdGhhdCB0aGUgbmV4dCBib290IGRldmljZSBpbiB0aGUgYm9vdCBzZXF1ZW5jZSBzaG91bGQgYmUgYWN0aXZhdGVkLg0KKyBWYWx1ZXMgb3RoZXIgdGhhbiB0aG9zZSBkb2N1bWVudGVkIG1heSBwcm9kdWNlIHVuZGVzaXJlZCByZXN1bHRzLg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk9uIDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4sIDxlbT50eXBlPC9lbT4gMCBtZWFucyBwZXJmb3JtIGEgbm9ybWFsIGJvb3QuICA8ZW0+dHlwZTwvZW0+IDQgd2lsbA0KK3BlcmZvcm0gYSBsb2NhbCBib290IHdpdGggdGhlIFVuaXZlcnNhbCBOZXR3b3JrIERyaXZlciBJbnRlcmZhY2UgKFVOREkpDQorZHJpdmVyIHN0aWxsIHJlc2lkZW50IGluIG1lbW9yeS4gIEZpbmFsbHksIDxlbT50eXBlPC9lbT4gNSB3aWxsIHBlcmZvcm0gYSBsb2NhbA0KK2Jvb3Qgd2l0aCB0aGUgZW50aXJlIFBYRSBzdGFjaywgaW5jbHVkaW5nIHRoZSBVTkRJIGRyaXZlciwgc3RpbGwNCityZXNpZGVudCBpbiBtZW1vcnkuIEFsbCBvdGhlciB2YWx1ZXMgYXJlIHVuZGVmaW5lZC4gIElmIHlvdSBkb24mIzgyMTc7dCBrbm93DQord2hhdCB0aGUgVU5ESSBvciBQWEUgc3RhY2tzIGFyZSwgZG9uJiM4MjE3O3Qgd29ycnkmIzgyMDE7JiM4MjEyOyYjODIwMTt5b3UgZG9uJiM4MjE3O3Qgd2FudCB0aGVtLA0KK2p1c3Qgc3BlY2lmeSAwLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPk9uIDxzdHJvbmc+SVNPTElOVVg8L3N0cm9uZz4vPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiwgdGhlIDxlbT50eXBlPC9lbT4gc3BlY2lmaWVzIHRoZSBsb2NhbCBkcml2ZSBudW1iZXIgdG8NCitib290IGZyb207IDB4MDAgaXMgdGhlIHByaW1hcnkgZmxvcHB5IGRyaXZlIGFuZCAweDgwIGlzIHRoZSBwcmltYXJ5IGhhcmQNCitkcml2ZS48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+UFhFPC9zdHJvbmc+IDxlbT5pbWFnZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gb25seTogLjApIExvYWQgYSBQWEUgTkJQIChOZXR3b3JrIEJvb3QgUHJvZ3JhbSkgaW1hZ2UuICBUaGUNCitQWEUgcHJvdG9jb2wgZG9lcyBub3QgcHJvdmlkZSBhbnkgbWVhbnMgZm9yIHNwZWNpZml5aW5nIG9yIHVzaW5nIGENCitjb21tYW5kIGxpbmUgb3IgaW5pdHJkLg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2xhYmVsX29ubHlfZGlyZWN0aXZlcyI+TEFCRUwtT05MWSBESVJFQ1RJVkVTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+SU5JVFJEPC9zdHJvbmc+IDxlbT5pbml0cmRfZmlsZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDMuNzErKSBBbiBpbml0cmQgY2FuIGJlIHNwZWNpZmllZCBpbiBhIHNlcGFyYXRlIHN0YXRlbWVudCAoSU5JVFJEKQ0KK2luc3RlYWQgb2YgYXMgcGFydCBvZiB0aGUgPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4gc3RhdGVtZW50OyB0aGlzIGZ1bmN0aW9uYWxseSBhcHBlbmRzDQorImluaXRyZD1pbml0cmRfZmlsZSIgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuICBMaWtlIDxlbT5pbml0cmQ9PC9lbT4sIHRoaXMNCithbHNvIHN1cHBvcnRzIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCBmaWxlIG5hbWVzIChzZWUgPHN0cm9uZz5BUFBFTkQ8L3N0cm9uZz4pLg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2dsb2JhbF9kaXJlY3RpdmVzX3NlY29uZGFyeSI+R0xPQkFMIERJUkVDVElWRVMgLSBTRUNPTkRBUlk8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZXNlIGFyZSBnbG9iYWwgZGlyZWN0aXZlcyB0aGF0IGFyZSBvZiBsZXNzZXIgaW1wb3J0YW5jZSwgb2Z0ZW4NCithZmZlY3RpbmcgdGhlIHVzZXIgZXhwZXJpZW5jZSBhbmQgbm90IHRoZSBib290IHByb2Nlc3MuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkFMTE9XT1BUSU9OUzwvc3Ryb25nPiA8ZW0+ZmxhZ192YWw8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0lmIDxlbT5mbGFnX3ZhbDwvZW0+IGlzIDAsIHRoZSB1c2VyIGlzIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgYW55IGFyZ3VtZW50cyBvbg0KK3RoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgVGhlIG9ubHkgb3B0aW9ucyByZWNvZ25pemVkIGFyZSB0aG9zZQ0KK3NwZWNpZmllZCBpbiBhbiA8c3Ryb25nPkFQUEVORDwvc3Ryb25nPikgc3RhdGVtZW50LiAgVGhlIGRlZmF1bHQgaXMgMS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+SU1QTElDSVQ8L3N0cm9uZz4gPGVtPmZsYWdfdmFsPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJZiA8ZW0+ZmxhZ192YWw8L2VtPiBpcyAwLCBkbyBub3QgbG9hZCBhIGtlcm5lbCBpbWFnZSB1bmxlc3MgaXQgaGFzIGJlZW4NCitleHBsaWNpdGx5IG5hbWVkIGluIGEgPHN0cm9uZz5MQUJFTDwvc3Ryb25nPiBzdGF0ZW1lbnQuICBUaGUgZGVmYXVsdCBpcyAxLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5USU1FT1VUPC9zdHJvbmc+IDxlbT50aW1lb3V0PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJbmRpY2F0ZXMgaG93IGxvbmcgdG8gd2FpdCBhdCB0aGUgPGVtPmJvb3Q6PC9lbT4gcHJvbXB0IHVudGlsIGJvb3RpbmcNCithdXRvbWF0aWNhbGx5LCBpbiB1bml0cyBvZiAxLzEwIHMuICBUaGUgdGltZW91dCBpcyBjYW5jZWxsZWQgYXMgc29vbiBhcw0KK3RoZSB1c2VyIHR5cGVzIGFueXRoaW5nIG9uIHRoZSBrZXlib2FyZCwgdGhlIGFzc3VtcHRpb24gYmVpbmcgdGhhdCB0aGUNCit1c2VyIHdpbGwgY29tcGxldGUgdGhlIGNvbW1hbmQgbGluZSBhbHJlYWR5IGJlZ3VuLiAgVGhlIHRpbWVyIGlzIHJlc2V0DQordG8gMCB1cG9uIHJldHVybiBmcm9tIGFuIHVuc3VjY2Vzc2Z1bCBhdHRlbXB0IHRvIGJvb3Qgb3IgZnJvbSBhIG1vZHVsZS4NCitBIHRpbWVvdXQgb2YgemVybyAodGhlIGRlZmF1bHQpIHdpbGwgZGlzYWJsZSB0aGUgdGltZW91dCBjb21wbGV0ZWx5Lg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5UT1RBTFRJTUVPVVQ8L3N0cm9uZz4gPGVtPnRpbWVvdXQ8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0luZGljYXRlcyBob3cgbG9uZyB0byB3YWl0IHVudGlsIGJvb3RpbmcgYXV0b21hdGljYWxseSwgaW4gdW5pdHMgb2YNCisxLzEwIHMuICBUaGlzIHRpbWVvdXQgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gY2FuY2VsbGVkIGJ5IHVzZXIgaW5wdXQsIGFuZCBjYW4gdGh1cyBiZQ0KK3VzZWQgdG8gZGVhbCB3aXRoIHNlcmlhbCBwb3J0IGdsaXRjaGVzIG9yICJ0aGUgdXNlciB3YWxrZWQgYXdheSIgdHlwZQ0KK3NpdHVhdGlvbnMuICBBIHRpbWVvdXQgb2YgemVybyAodGhlIGRlZmF1bHQpIHdpbGwgZGlzYWJsZSB0aGUgdGltZW91dA0KK2NvbXBsZXRlbHkuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Qm90aCA8c3Ryb25nPlRJTUVPVVQ8L3N0cm9uZz4gYW5kIDxzdHJvbmc+VE9UQUxUSU1FT1VUPC9zdHJvbmc+IGNhbiBiZSB1c2VkIHRvZ2V0aGVyLCBmb3IgZXhhbXBsZTo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiMgV2FpdCA1IHNlY29uZHMgdW5sZXNzIHRoZSB1c2VyIHR5cGVzIHNvbWV0aGluZywgYnV0DQorIyBhbHdheXMgYm9vdCBhZnRlciAxNSBtaW51dGVzLg0KK1RJTUVPVVQgNTANCitUT1RBTFRJTUVPVVQgOTAwMDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+T05USU1FT1VUPC9zdHJvbmc+IDxlbT5rZXJuZWwgb3B0aW9ucyYjODIzMDs8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK1NldHMgdGhlIGNvbW1hbmQgbGluZSBpbnZva2VkIG9uIGEgdGltZW91dCAod2hpY2ggb2Z0ZW4gcmVmZXJlbmNlcyBhDQorTEFCRUwpLiAgSWYgbm90IHNwZWNpZmllZCwgPGVtPlVJPC9lbT4gKGlmIHVzZWQpIG9yICdERUZBVUxUIGlzIHVzZWQuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk9ORVJST1I8L3N0cm9uZz4gPGVtPmtlcm5lbCBvcHRpb25zJiM4MjMwOzwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSWYgYSBrZXJuZWwgaW1hZ2UgaXMgbm90IGZvdW5kIChlaXRoZXIgZHVlIHRvIGl0IG5vdCBleGlzdGluZywgb3INCitiZWNhdXNlIDxzdHJvbmc+SU1QTElDSVQ8L3N0cm9uZz4gaXMgc2V0KSwgcnVuIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4gIFRoZSBmYXVsdHkNCitjb21tYW5kIGxpbmUgaXMgYXBwZW5kZWQgdG8gdGhlIHNwZWNpZmllZCBvcHRpb25zLCBzbyBpZiB0aGUgPHN0cm9uZz5PTkVSUk9SPC9zdHJvbmc+DQorZGlyZWN0aXZlIHJlYWRzIGFzOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+T05FUlJPUiB4eXp6eSBwbHVnaDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPmFuZCB0aGUgY29tbWFuZCBsaW5lIGFzIGVudGVyZWQgYnkgdGhlIHVzZXIgaXM6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9Imxpc3RpbmdibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5mb28gYmFyIGJhejwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gd2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgYXMgaWYgZW50ZXJlZCBieSB0aGUgdXNlcjo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGlzdGluZ2Jsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPnh5enp5IHBsdWdoIGZvbyBiYXIgYmF6PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPlNFUklBTDwvc3Ryb25nPiA8ZW0+cG9ydCBbYmF1ZHJhdGUgW2Zsb3djb250cm9sXV08L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0VuYWJsZXMgYSBzZXJpYWwgcG9ydCB0byBhY3QgYXMgdGhlIGNvbnNvbGUuICA8ZW0+cG9ydDwvZW0+IGlzIGEgbnVtYmVyICgwID0NCisvZGV2L3R0eVMwID0gQ09NMSwgZXRjLikgb3IgYW4gSS9PIHBvcnQgYWRkcmVzcyAoZS5nLiAweDNGOCk7IGlmDQorPGVtPmJhdWRyYXRlPC9lbT4gaXMgb21pdHRlZCwgdGhlIGJhdWQgcmF0ZSBkZWZhdWx0cyB0byA5NjAwIGJwcy4gIFRoZSBzZXJpYWwNCitwYXJhbWV0ZXJzIGFyZSBoYXJkY29kZWQgdG8gYmUgOCBiaXRzLCBubyBwYXJpdHksIDEgc3RvcCBiaXQuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PGVtPmZsb3djb250cm9sPC9lbT4gaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGJpdHM6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4weDAwMSAtIEFzc2VydCBEVFINCisweDAwMiAtIEFzc2VydCBSVFMNCisweDAwOCAtIEVuYWJsZSBpbnRlcnJ1cHRzDQorMHgwMTAgLSBXYWl0IGZvciBDVFMgYXNzZXJ0aW9uDQorMHgwMjAgLSBXYWl0IGZvciBEU1IgYXNzZXJ0aW9uDQorMHgwNDAgLSBXYWl0IGZvciBSSSBhc3NlcnRpb24NCisweDA4MCAtIFdhaXQgZm9yIERDRCBhc3NlcnRpb24NCisweDEwMCAtIElnbm9yZSBpbnB1dCB1bmxlc3MgQ1RTIGFzc2VydGVkDQorMHgyMDAgLSBJZ25vcmUgaW5wdXQgdW5sZXNzIERTUiBhc3NlcnRlZA0KKzB4NDAwIC0gSWdub3JlIGlucHV0IHVubGVzcyBSSSBhc3NlcnRlZA0KKzB4ODAwIC0gSWdub3JlIGlucHV0IHVubGVzcyBEQ0QgYXNzZXJ0ZWQ8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5BbGwgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VHlwaWNhbCB2YWx1ZXMgYXJlOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+ICAgIDAgLSBObyBmbG93IGNvbnRyb2wgKGRlZmF1bHQpDQorMHgzMDMgLSBOdWxsIG1vZGVtIGNhYmxlIGRldGVjdA0KKzB4MDEzIC0gUlRTL0NUUyBmbG93IGNvbnRyb2wNCisweDgxMyAtIFJUUy9DVFMgZmxvdyBjb250cm9sLCBtb2RlbSBpbnB1dA0KKzB4MDIzIC0gRFRSL0RTUiBmbG93IGNvbnRyb2wNCisweDA4MyAtIERUUi9EQ0QgZmxvdyBjb250cm9sPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Rm9yIHRoZSA8c3Ryb25nPlNFUklBTDwvc3Ryb25nPiBkaXJlY3RpdmUgdG8gYmUgZ3VhcmFudGVlZCB0byB3b3JrIHByb3Blcmx5LCBpdCBzaG91bGQNCitiZSB0aGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImFkbW9uaXRpb25ibG9jayI+DQorPHRhYmxlPjx0cj4NCis8dGQgY2xhc3M9Imljb24iPg0KKzxkaXYgY2xhc3M9InRpdGxlIj5Ob3RlPC9kaXY+DQorPC90ZD4NCis8dGQgY2xhc3M9ImNvbnRlbnQiPjxlbT5wb3J0PC9lbT4gdmFsdWVzIGZyb20gMCB0byAzIG1lYW5zIHRoZSBmaXJzdCBmb3VyIHNlcmlhbCBwb3J0cw0KK2RldGVjdGVkIGJ5IHRoZSBCSU9TLiAgVGhleSBtYXkgb3IgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZSBsZWdhY3kgcG9ydA0KK3ZhbHVlcyAweDNGOCwgMHgyRjgsIDB4M0U4LCAweDJFOC48L3RkPg0KKzwvdHI+PC90YWJsZT4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkVuYWJsaW5nIGludGVycnVwdHMgKHNldHRpbmcgdGhlIDB4MDA4IGJpdCkgbWF5IGdpdmUgYmV0dGVyDQorcmVzcG9uc2l2ZW5lc3Mgd2l0aG91dCBzZXR0aW5nIHRoZSA8c3Ryb25nPk5PSEFMVDwvc3Ryb25nPiBvcHRpb24sIGJ1dCBjb3VsZA0KK3BvdGVudGlhbGx5IGNhdXNlIHByb2JsZW1zIHdpdGggYnVnZ3kgQklPU2VzLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgb3B0aW9uIGlzICJzdGlja3kiIGFuZCBpcyBub3QgYXV0b21hdGljYWxseSByZXNldCB3aGVuIGxvYWRpbmcgYQ0KK25ldyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgQ09ORklHIGNvbW1hbmQuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk5PSEFMVDwvc3Ryb25nPiA8ZW0+ZmxhZ192YWw8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0lmIDxlbT5mbGFnX3ZhbDwvZW0+IGlzIDEsIGRvbiYjODIxNzt0IGhhbHQgdGhlIHByb2Nlc3NvciB3aGlsZSBpZGxlLiBIYWx0aW5nIHRoZQ0KK3Byb2Nlc3NvciB3aGlsZSBpZGxlIHNpZ25pZmljYW50bHkgcmVkdWNlcyB0aGUgcG93ZXIgY29uc3VtcHRpb24sIGJ1dA0KK2NhbiBjYXVzZSBwb29yIHJlc3BvbnNpdmVuZXNzIHRvIHRoZSBzZXJpYWwgY29uc29sZSwgZXNwZWNpYWxseSB3aGVuDQordXNpbmcgc2NyaXB0cyB0byBkcml2ZSB0aGUgc2VyaWFsIGNvbnNvbGUsIGFzIG9wcG9zZWQgdG8gaHVtYW4NCitpbnRlcmFjdGlvbi4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Q09OU09MRTwvc3Ryb25nPiA8ZW0+ZmxhZ192YWw8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0lmIDxlbT5mbGFnX3ZhbDwvZW0+IGlzIDAsIGRpc2FibGUgb3V0cHV0IHRvIHRoZSBub3JtYWwgdmlkZW8gY29uc29sZS4gSWYNCis8ZW0+ZmxhZ192YWw8L2VtPiBpcyAxLCBlbmFibGUgb3V0cHV0IHRvIHRoZSB2aWRlbyBjb25zb2xlICh0aGlzIGlzIHRoZQ0KK2RlZmF1bHQuKQ0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlNvbWUgQklPU2VzIHRyeSB0byBmb3J3YXJkIHRoaXMgdG8gdGhlIHNlcmlhbCBjb25zb2xlIGFuZCBzb21ldGltZXMgbWFrZQ0KK2EgdG90YWwgbWVzcyB0aGVyZW9mLCBzbyB0aGlzIG9wdGlvbiBsZXRzIHlvdSBkaXNhYmxlIHRoZSB2aWRlbyBjb25zb2xlDQorb24gdGhlc2Ugc3lzdGVtcy48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Rk9OVDwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0xvYWQgYSBmb250IGluIC5wc2YgZm9ybWF0IGJlZm9yZSBkaXNwbGF5aW5nIGFueSBvdXRwdXQgKGV4Y2VwdCB0aGUNCitjb3B5cmlnaHQgbGluZSwgd2hpY2ggaXMgb3V0cHV0IGFzIGxkbGludXguc3lzIGl0c2VsZiBpcyBsb2FkZWQuKQ0KKzxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gb25seSBsb2FkcyB0aGUgZm9udCBvbnRvIHRoZSB2aWRlbyBjYXJkOyBpZiB0aGUgLnBzZiBmaWxlDQorY29udGFpbnMgYSBVbmljb2RlIHRhYmxlIGl0IGlzIGlnbm9yZWQuICBUaGlzIG9ubHkgd29ya3Mgb24gRUdBIGFuZCBWR0ENCitjYXJkczsgaG9wZWZ1bGx5IGl0IHNob3VsZCBkbyBub3RoaW5nIG9uIG90aGVycy4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+S0JETUFQPC9zdHJvbmc+IDxlbT5rZXltYXA8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0luc3RhbGwgYSBzaW1wbGUga2V5Ym9hcmQgbWFwLiAgVGhlIGtleWJvYXJkIHJlbWFwcGVyIHVzZWQgaXMgPHN0cm9uZz52ZXJ5PC9zdHJvbmc+DQorc2ltcGxpc3RpYyAoaXQgc2ltcGx5IHJlbWFwcyB0aGUga2V5Y29kZXMgcmVjZWl2ZWQgZnJvbSB0aGUgQklPUywgd2hpY2gNCittZWFucyB0aGF0IG9ubHkgdGhlIGtleSBjb21iaW5hdGlvbnMgcmVsZXZhbnQgaW4gdGhlIGRlZmF1bHQgbGF5b3V0JiM4MjAxOyYjODIxMjsmIzgyMDE7dXN1YWxseSBVLlMuIEVuZ2xpc2gmIzgyMDE7JiM4MjEyOyYjODIwMTtjYW4gYmUgbWFwcGVkKSBidXQgc2hvdWxkIGF0IGxlYXN0IGhlbHAgcGVvcGxlDQord2l0aCBBWkVSVFkga2V5Ym9hcmQgbGF5b3V0IGFuZCB0aGUgbG9jYXRpb25zIG9mID0gYW5kICwgKHR3byBzcGVjaWFsDQorY2hhcmFjdGVycyB1c2VkIGhlYXZpbHkgb24gdGhlIExpbnV4IGtlcm5lbCBjb21tYW5kIGxpbmUuKQ0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZSBpbmNsdWRlZCBwcm9ncmFtIGtleXRhYi1saWxvLnBsIGZyb20gdGhlIExJTE8gZGlzdHJpYnV0aW9uIGNhbiBiZQ0KK3VzZWQgdG8gY3JlYXRlIHN1Y2gga2V5bWFwcy4gIFRoZSBmaWxlIGtleXRhYi1saWxvLnR4dCBjb250YWlucyB0aGUNCitkb2N1bWVudGF0aW9uIGZvciB0aGlzIHByb2dyYW0uPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkRJU1BMQVk8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitEaXNwbGF5cyB0aGUgaW5kaWNhdGVkIGZpbGUgb24gdGhlIHNjcmVlbiBhdCBib290IHRpbWUgKGJlZm9yZSB0aGUgYm9vdDoNCitwcm9tcHQsIGlmIGRpc3BsYXllZCkuICBQbGVhc2Ugc2VlIHRoZSBzZWN0aW9uIGJlbG93IG9uIDxzdHJvbmc+RElTUExBWTwvc3Ryb25nPiBmaWxlcy4NCis8L3A+DQorPGRpdiBjbGFzcz0iYWRtb25pdGlvbmJsb2NrIj4NCis8dGFibGU+PHRyPg0KKzx0ZCBjbGFzcz0iaWNvbiI+DQorPGRpdiBjbGFzcz0idGl0bGUiPk5vdGU8L2Rpdj4NCis8L3RkPg0KKzx0ZCBjbGFzcz0iY29udGVudCI+SWYgdGhlIGZpbGUgaXMgbWlzc2luZywgdGhpcyBvcHRpb24gaXMgc2ltcGx5IGlnbm9yZWQuPC90ZD4NCis8L3RyPjwvdGFibGU+DQorPC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+U0FZPC9zdHJvbmc+IDxlbT5tZXNzYWdlPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitQcmludHMgdGhlIG1lc3NhZ2Ugb24gdGhlIHNjcmVlbi4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+UFJPTVBUPC9zdHJvbmc+IDxlbT5mbGFnX3ZhbDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSWYgPGVtPmZsYWdfdmFsPC9lbT4gaXMgMCwgZGlzcGxheSB0aGUgYm9vdDogcHJvbXB0IG9ubHkgaWYgdGhlIFNoaWZ0IG9yIEFsdA0KK2tleSBpcyBwcmVzc2VkLCBvciBDYXBzIExvY2sgb3IgU2Nyb2xsIGxvY2sgaXMgc2V0ICh0aGlzIGlzIHRoZQ0KK2RlZmF1bHQpLiAgSWYgPGVtPmZsYWdfdmFsPC9lbT4gaXMgMSwgYWx3YXlzIGRpc3BsYXkgdGhlIGJvb3Q6IHByb21wdC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Tk9FU0NBUEU8L3N0cm9uZz4gPGVtPmZsYWdfdmFsPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJZiA8ZW0+ZmxhZ192YWw8L2VtPiBpcyBzZXQgdG8gMSwgaWdub3JlIHRoZSBTaGlmdC9BbHQvQ2FwcyBMb2NrL1Njcm9sbCBMb2NrDQorZXNjYXBlcy4gIFVzZSB0aGlzICh0b2dldGhlciB3aXRoIFBST01QVCAwKSB0byBmb3JjZSB0aGUgZGVmYXVsdCBib290DQorYWx0ZXJuYXRpdmUuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPk5PQ09NUExFVEU8L3N0cm9uZz4gPGVtPmZsYWdfdmFsPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitJZiA8ZW0+ZmxhZ192YWw8L2VtPiBpcyBzZXQgdG8gMSwgdGhlIFRhYiBrZXkgZG9lcyBub3QgZGlzcGxheSBsYWJlbHMgYXQgdGhlDQorYm9vdDogcHJvbXB0Lg0KKzwvcD4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjE8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5GMjwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkYzPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjQ8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5GNTwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkY2PC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Rjc8L3N0cm9uZz4gPGVtPmZpbGVuYW1lPC9lbT4NCis8L2R0Pg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5GODwvc3Ryb25nPiA8ZW0+ZmlsZW5hbWU8L2VtPg0KKzwvZHQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkY5PC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjEwPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjExPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RjEyPC9zdHJvbmc+IDxlbT5maWxlbmFtZTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorRGlzcGxheXMgdGhlIGluZGljYXRlZCBmaWxlIG9uIHRoZSBzY3JlZW4gd2hlbiBhIGZ1bmN0aW9uIGtleSBpcyBwcmVzc2VkDQorYXQgdGhlIGJvb3Q6IHByb21wdC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHByZS1ib290IG9ubGluZSBoZWxwDQorKHByZXN1bWFibHkgZm9yIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbnMuKSAgUGxlYXNlIHNlZSB0aGUNCitzZWN0aW9uIGJlbG93IG9uIERJU1BMQVkgZmlsZXMuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+V2hlbiB1c2luZyB0aGUgc2VyaWFsIGNvbnNvbGUsIHByZXNzICZsdDtDdHJsLUYmZ3Q7Jmx0O2RpZ2l0Jmd0OyB0byBnZXQgdG8gdGhlIGhlbHANCitzY3JlZW5zLCBlLmcuICZsdDtDdHJsLUYmZ3Q7Jmx0OzImZ3Q7IHRvIGdldCB0byB0aGUgRjIgc2NyZWVuLiBGb3IgRjEwLUYxMiwgaGl0DQorJmx0O0N0cmwtRiZndDsmbHQ7QSZndDssICZsdDtDdHJsLUYmZ3Q7QiwgJmx0O0N0cmwtRiZndDtDLiAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyDQordmVyc2lvbnMsIEYxMCBjYW4gYWxzbyBiZSBlbnRlcmVkIGFzICZsdDtDdHJsLUYmZ3Q7MC48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+UEFUSDwvc3Ryb25nPiA8ZW0+cGF0aDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDUuMDArKSBTcGVjaWZ5IGEgc3BhY2Utc2VwYXJhdGVkICgnIDxlbT47IDUuMDAtNS4xMCB3YXMgYSBjb2xvbiAnOjwvZW0+KSBsaXN0DQorb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIG1vZHVsZXMuIFRoaXMgZGlyZWN0aXZlDQoraXMgdXNlZnVsIGZvciBzcGVjaWZ5aW5nIHRoZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBsaWIqLmMzMiBsaWJyYXJ5DQorZmlsZXMgYXMgb3RoZXIgbW9kdWxlcyBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZXNlIGZpbGVzLCBidXQgbWF5IG5vdA0KK3Jlc2lkZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuICBNdWx0aXBsZSBpbnN0YW5jZXMgd2lsbCBhcHBlbmQgYWRkaXRpb25hbA0KK3BhdGhzLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5TRU5EQ09PS0lFUzwvc3Ryb25nPiA8ZW0+Yml0bWFzazwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDxzdHJvbmc+UFhFTElOVVg8L3N0cm9uZz4gNS4xMCspIFdoZW4gZG93bmxvYWRpbmcgZmlsZXMgb3ZlciBodHRwLCB0aGUgU1lTQVBQRU5EDQorc3RyaW5ncyBhcmUgcHJlcGVuZGVkIHdpdGggPGVtPlN5c2xpbnV4PC9lbT4gYW5kIHNlbnQgdG8gdGhlIHNlcnZlciBhcyBjb29raWVzLg0KK1RoZSBjb29raWVzIGFyZSBVUkwtZW5jb2RlZDsgd2hpdGVzcGFjZSBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiByZXBsYWNlZCB3aXRoDQordW5kZXJzY29yZXMuDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhpcyBjb21tYW5kIGxpbWl0cyB0aGUgY29va2llcyBzZW5kOyAwIG1lYW5zIG5vIGNvb2tpZXMuICBUaGUgZGVmYXVsdA0KK2lzIC0xLCBtZWFuaW5nIHNlbmQgYWxsIGNvb2tpZXMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhpcyBvcHRpb24gaXMgInN0aWNreSIgYW5kIGlzIG5vdCBhdXRvbWF0aWNhbGx5IHJlc2V0IHdoZW4gbG9hZGluZyBhDQorbmV3IGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoIHRoZSBDT05GSUcgY29tbWFuZC48L3A+PC9kaXY+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9kaXNwbGF5X2ZpbGVfZm9ybWF0Ij5ESVNQTEFZIEZJTEUgRk9STUFUPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5ESVNQTEFZIGFuZCBmdW5jdGlvbi1rZXkgaGVscCBmaWxlcyBhcmUgdGV4dCBmaWxlcyBpbiBlaXRoZXIgRE9TIG9yIFVOSVgNCitmb3JtYXQgKHdpdGggb3Igd2l0aG91dCAmbHQ7Q1ImZ3Q7KS4gIEluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIHNwZWNpYWwgY29kZXMNCithcmUgaW50ZXJwcmV0ZWQ6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+aWRlbnRpY2FsIHRvICMzPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtGRiZndDs8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAmbHQ7Q3RybC1MJmd0OyA9IEFTQ0lJIDEyPGJyIC8+DQorQ2xlYXIgdGhlIHNjcmVlbiwgaG9tZSB0aGUgY3Vyc29yLiAgTm90ZSB0aGF0IHRoZSBzY3JlZW4gaXMgZmlsbGVkIHdpdGgNCit0aGUgY3VycmVudCBkaXNwbGF5IGNvbG9yLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7RkYmZ3Q7PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorPSAmbHQ7Q3RybC1MJmd0OyA9IEFTQ0lJIDEyOyBDbGVhciB0aGUgc2NyZWVuLCBob21lIHRoZSBjdXJzb3IuICBOb3RlIHRoYXQgdGhlDQorc2NyZWVuIGlzIGZpbGxlZCB3aXRoIHRoZSBjdXJyZW50IGRpc3BsYXkgY29sb3IuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtGRiZndDs8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7RkYmZ3Q7ID0gJmx0O0N0cmwtTCZndDsgPSBBU0NJSSAxMg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkNsZWFyIHRoZSBzY3JlZW4sIGhvbWUgdGhlIGN1cnNvci4gIE5vdGUgdGhhdCB0aGUgc2NyZWVuIGlzIGZpbGxlZCB3aXRoDQordGhlIGN1cnJlbnQgZGlzcGxheSBjb2xvci48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Jmx0O0ZGJmd0Ozwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyZsdDtGRiZndDsgPSAmbHQ7Q3RybC1MJmd0OyA9IEFTQ0lJIDEyPGJyIC8+DQorQ2xlYXIgdGhlIHNjcmVlbiwgaG9tZSB0aGUgY3Vyc29yLiAgTm90ZSB0aGF0IHRoZSBzY3JlZW4gaXMgZmlsbGVkIHdpdGgNCit0aGUgY3VycmVudCBkaXNwbGF5IGNvbG9yLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7U0kmZ3Q7PC9zdHJvbmc+PGVtPiZsdDtiZyZndDsmbHQ7ZmcmZ3Q7PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7U0kmZ3Q7ID0gJmx0O0N0cmwtTyZndDsgPSBBU0NJSSAxNQ0KKzwvcD4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlNldCB0aGUgZGlzcGxheSBjb2xvcnMgdG8gdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kDQorY29sb3JzLCB3aGVyZSAmbHQ7YmcmZ3Q7IGFuZCAmbHQ7ZmcmZ3Q7IGFyZSB0aGUgMiBoZXggZGlnaXRzIHJlcHJlc2VudGluZyAxIGJ5dGUsDQorY29ycmVzcG9uZGluZyB0byB0aGUgc3RhbmRhcmQgUEMgZGlzcGxheSBhdHRyaWJ1dGVzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+MCA9IGJsYWNrICAgICAgICAgICAgICAgOCA9IGRhcmsgZ3JleQ0KKzEgPSBkYXJrIGJsdWUgICAgICAgICAgIDkgPSBicmlnaHQgYmx1ZQ0KKzIgPSBkYXJrIGdyZWVuICAgICAgICAgIGEgPSBicmlnaHQgZ3JlZW4NCiszID0gZGFyayBjeWFuICAgICAgICAgICBiID0gYnJpZ2h0IGN5YW4NCis0ID0gZGFyayByZWQgICAgICAgICAgICBjID0gYnJpZ2h0IHJlZA0KKzUgPSBkYXJrIHB1cnBsZSAgICAgICAgIGQgPSBicmlnaHQgcHVycGxlDQorNiA9IGJyb3duICAgICAgICAgICAgICAgZSA9IHllbGxvdw0KKzcgPSBsaWdodCBncmV5ICAgICAgICAgIGYgPSB3aGl0ZTwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlBpY2tpbmcgYSBicmlnaHQgY29sb3IgKDgtZikgZm9yIHRoZSBiYWNrZ3JvdW5kIHJlc3VsdHMgaW4gdGhlDQorY29ycmVzcG9uZGluZyBkYXJrIGNvbG9yICgwLTcpLCB3aXRoIHRoZSBmb3JlZ3JvdW5kIGZsYXNoaW5nLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkNvbG9ycyBhcmUgbm90IHZpc2libGUgb3ZlciB0aGUgc2VyaWFsIGNvbnNvbGUuPC9wPjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtDQU4mZ3Q7PC9zdHJvbmc+PGVtPmZpbGVuYW1lJmx0O25ld2xpbmUmZ3Q7PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7Q0FOJmd0OyA9ICZsdDtDdHJsLVgmZ3Q7ID0gQVNDSUkgMjQNCis8L3A+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JZiBhIFZHQSBkaXNwbGF5IGlzIHByZXNlbnQsIGVudGVyIGdyYXBoaWNzIG1vZGUgYW5kIGRpc3BsYXkgdGhlIGdyYXBoaWMNCitpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQgaXMgYW4gYWQgaG9jIGZvcm1hdA0KK2NhbGxlZCBMU1MxNjsgdGhlIGluY2x1ZGVkIFBlcmwgcHJvZ3JhbSAicHBtdG9sc3MxNiIgY2FuIGJlIHVzZWQgdG8NCitwcm9kdWNlIHRoZXNlIGltYWdlcy4gIFRoaXMgUGVybCBwcm9ncmFtIGFsc28gaW5jbHVkZXMgdGhlIGZpbGUgZm9ybWF0DQorc3BlY2lmaWNhdGlvbi48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgaW1hZ2UgaXMgZGlzcGxheWVkIGluIDY0MHg0ODAgMTYtY29sb3IgbW9kZS4gIE9uY2UgaW4gZ3JhcGhpY3MgbW9kZSwNCit0aGUgZGlzcGxheSBhdHRyaWJ1dGVzIChzZXQgYnkgJmx0O1NJJmd0OyBjb2RlIHNlcXVlbmNlcykgd29yayBzbGlnaHRseQ0KK2RpZmZlcmVudGx5OiB0aGUgYmFja2dyb3VuZCBjb2xvciBpcyBpZ25vcmVkLCBhbmQgdGhlIGZvcmVncm91bmQgY29sb3JzDQorYXJlIHRoZSAxNiBjb2xvcnMgc3BlY2lmaWVkIGluIHRoZSBpbWFnZSBmaWxlLiAgRm9yIHRoYXQgcmVhc29uLA0KK3BwbXRvbHNzMTYgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoYXQgY2VydGFpbiBjb2xvcnMgc2hvdWxkIGJlIGFzc2lnbmVkDQordG8gc3BlY2lmaWMgY29sb3IgaW5kaWNpZXMuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Q29sb3IgaW5kaWNpZXMgMCBhbmQgNywgaW4gcGFydGljdWxhciwgc2hvdWxkIGJlIGNob3NlbiB3aXRoIGNhcmU6IDAgaXMNCit0aGUgYmFja2dyb3VuZCBjb2xvciwgYW5kIDcgaXMgdGhlIGNvbG9yIHVzZWQgZm9yIHRoZSB0ZXh0IHByaW50ZWQgYnkNCis8c3Ryb25nPlN5c2xpbnV4PC9zdHJvbmc+IGl0c2VsZi48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Jmx0O0VNJmd0Ozwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyZsdDtFTSZndDsgPSAmbHQ7Q3RybC1ZJmd0OyA9IEFTQ0lJIDI1PGJyIC8+DQorSWYgd2UgYXJlIGN1cnJlbnRseSBpbiBncmFwaGljcyBtb2RlLCByZXR1cm4gdG8gdGV4dCBtb2RlLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4mbHQ7RExFJmd0Ozwvc3Ryb25nPi4uPHN0cm9uZz4mbHQ7RVRCJmd0Ozwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyZsdDtDdHJsLVAmZ3Q7Li4mbHQ7Q3RybC1XJmd0OyA9IEFTQ0lJIDE2LTIzDQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+VGhlc2UgY29kZXMgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG1vZGVzIHRvIHByaW50IGEgY2VydGFpbiBwYXJ0IG9mDQordGhlIG1lc3NhZ2UgZmlsZSBpbi4gIEVhY2ggb2YgdGhlc2UgY29udHJvbCBjaGFyYWN0ZXJzIHNlbGVjdCBhIHNwZWNpZmljDQorc2V0IG9mIG1vZGVzICh0ZXh0IHNjcmVlbiwgZ3JhcGhpY3Mgc2NyZWVuLCBzZXJpYWwgcG9ydCkgZm9yIHdoaWNoIHRoZQ0KK291dHB1dCBpcyBhY3R1YWxseSBkaXNwbGF5ZWQ6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5DaGFyYWN0ZXIgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgR3JhcGggICBTZXJpYWwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCismbHQ7RExFJmd0OyA9ICZsdDtDdHJsLVAmZ3Q7ID0gQVNDSUkgMTYgICAgIE5vICAgICAgTm8gICAgICBObw0KKyZsdDtEQzEmZ3Q7ID0gJmx0O0N0cmwtUSZndDsgPSBBU0NJSSAxNyAgICAgWWVzICAgICBObyAgICAgIE5vDQorJmx0O0RDMiZndDsgPSAmbHQ7Q3RybC1SJmd0OyA9IEFTQ0lJIDE4ICAgICBObyAgICAgIFllcyAgICAgTm8NCismbHQ7REMzJmd0OyA9ICZsdDtDdHJsLVMmZ3Q7ID0gQVNDSUkgMTkgICAgIFllcyAgICAgWWVzICAgICBObw0KKyZsdDtEQzQmZ3Q7ID0gJmx0O0N0cmwtVCZndDsgPSBBU0NJSSAyMCAgICAgTm8gICAgICBObyAgICAgIFllcw0KKyZsdDtOQUsmZ3Q7ID0gJmx0O0N0cmwtVSZndDsgPSBBU0NJSSAyMSAgICAgWWVzICAgICBObyAgICAgIFllcw0KKyZsdDtTWU4mZ3Q7ID0gJmx0O0N0cmwtViZndDsgPSBBU0NJSSAyMiAgICAgTm8gICAgICBZZXMgICAgIFllcw0KKyZsdDtFVEImZ3Q7ID0gJmx0O0N0cmwtVyZndDsgPSBBU0NJSSAyMyAgICAgWWVzICAgICBZZXMgICAgIFllczwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHdpbGwgYWN0dWFsbHkgcHJpbnQgb3V0IHdoaWNoIG1vZGUgdGhlDQorY29uc29sZSBpcyBpbjo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPiZsdDtEQzEmZ3Q7VGV4dCBtb2RlJmx0O0RDMiZndDtHcmFwaGljcyBtb2RlJmx0O0RDNCZndDtTZXJpYWwgcG9ydCZsdDtFVEImZ3Q7PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPiZsdDtTVUImZ3Q7PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorJmx0O1NVQiZndDsgPSAmbHQ7Q3RybC1aJmd0OyA9IEFTQ0lJIDI2DQorPC9wPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+RW5kIG9mIGZpbGUgKERPUyBjb252ZW50aW9uKS48L3A+PC9kaXY+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+Jmx0O0JFTCZndDs8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCismbHQ7QkVMJmd0OyA9ICZsdDtDdHJsLUcmZ3Q7ID0gQVNDSUkgNzxiciAvPg0KK0JlZXAgdGhlIHNwZWFrZXIuDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYm9vdF9sb2FkZXJfaWRzX3VzZWQiPkJPT1QgTE9BREVSIElEUyBVU0VEPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5UaGUgTGludXggYm9vdCBwcm90b2NvbCBzdXBwb3J0cyBhICJib290IGxvYWRlciBJRCIsIGEgc2luZ2xlIGJ5dGUgd2hlcmUNCit0aGUgdXBwZXIgbnliYmxlIHNwZWNpZmllcyBhIGJvb3QgbG9hZGVyIGZhbWlseSAoMyA9IDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4pIGFuZCB0aGUNCitsb3dlciBueWJibGUgaXMgdmVyc2lvbiBvciwgaW4gdGhlIGNhc2Ugb2YgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiwgbWVkaWE6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4weDMxICg0OSkgPSBTWVNMSU5VWA0KKzB4MzIgKDUwKSA9IFBYRUxJTlVYDQorMHgzMyAoNTEpID0gSVNPTElOVVgNCisweDM0ICg1MikgPSBFWFRMSU5VWDwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPkluIHJlY2VudCB2ZXJzaW9ucyBvZiBMaW51eCwgdGhpcyBJRCBpcyBhdmFpbGFibGUgYXMNCisvcHJvYy9zeXMva2VybmVsL2Jvb3Rsb2FkZXJfdHlwZS48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX25vdmljZV9wcm90ZWN0aW9uIj5OT1ZJQ0UgUFJPVEVDVElPTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IGJvb3Rpbmcgb24gYSBtYWNoaW5lIHdpdGggdG9vIGxpdHRsZQ0KK21lbW9yeSwgd2hpY2ggbWVhbnMgdGhlIExpbnV4IGJvb3Qgc2VxdWVuY2UgY2Fubm90IGNvbXBsZXRlLiAgSWYgc28sIGENCittZXNzYWdlIGlzIGRpc3BsYXllZCBhbmQgdGhlIGJvb3Qgc2VxdWVuY2UgYWJvcnRlZC4gIEhvbGRpbmcgZG93biB0aGUNCitDdHJsIGtleSB3aGlsZSBib290aW5nIGRpc2FibGVzIHRoaXMgZmVhdHVyZS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5BbnkgZmlsZSB0aGF0IDxzdHJvbmc+U3lzbGludXg8L3N0cm9uZz4gdXNlcyBjYW4gYmUgbWFya2VkIGhpZGRlbiwgc3lzdGVtIG9yIHJlYWRvbmx5DQoraWYgc28gaXMgY29udmVuaWVudDsgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBpZ25vcmVzIGFsbCBmaWxlIGF0dHJpYnV0ZXMuICBUaGUNCis8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IGluc3RhbGxlciBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIHJlYWRvbmx5L2hpZGRlbi9zeXN0ZW0NCithdHRyaWJ1dGVzIG9uIExETElOVVguU1lTLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfZXhhbXBsZSI+RVhBTVBMRTwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SGVyZSBhcmUgc29tZSBzYW1wbGUgY29uZmlnIGZpbGVzOjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJsaXN0aW5nYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+IyBTRVJJQUwgMCAxMTUyMDANCitERUZBVUxUIGxpbnV4DQorUFJPTVBUIDENCitUSU1FT1VUIDYwMA0KKw0KK0xBQkVMIGxpbnV4DQorICBMSU5VWCB2bWxpbnV6DQorICBBUFBFTkQgaW5pdHJkPWluaXRyZDEuZ3osaW5pdHJkMi5neg0KKw0KK0xBQkVMIG0NCisgIENPTTMyIG1lbnUuYzMyPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SW4gdGhpcyBleGFtcGxlLCBzZXJpYWwgcG9ydCB1c2UgaXMgZGlzYWJsZWQgYnV0IGNhbiBiZSBlbmFibGVkIGJ5DQordW5jb21tZW50aW5nIHRoZSBmaXJzdCBsaW5lIGFuZCB1dGlsaXplIHNlcmlhbCBwb3J0IDAgYXQgMTE1MjAwIGJwcy4gIElmDQorPGVtPmxpbnV4PC9lbT4gaXMgdHlwZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIGtlcm5lbC1saWtlIGZpbGUgPGVtPnZtbGludXo8L2VtPiBpcw0KK2V4ZWN1dGVkIGFzIGEgTGludXgga2VybmVsLCBpbml0cmQgZmlsZXMgaW5pdHJkMS5neiBhbmQgaW5pdHJkMi5neiBhcmUNCitsb2FkZWQgYXMgaW5pdGlhbCByYW1kaXNrIGZpbGVzIChsaWtlIGNwaW8uZ3ogZmlsZXMgZm9yIGluaXRyYW1mcykuICBJZg0KKzxlbT5tPC9lbT4gaXMgdHlwZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIENPTTMyIG1vZHVsZSA8ZW0+bWVudS5jMzI8L2VtPiBpcw0KK2V4ZWN1dGVkIHRvIGxhdW5jaCBhIG1lbnUgc3lzdGVtLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfa25vd25fYnVncyI+S05PV04gQlVHUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+U2V2ZXJhbCBrbm93biBidWdzL2NvbW1vbiBwcm9ibGVtcyBhcmUgbGlzdGVkIGF0DQorPGEgaHJlZj0iaHR0cDovL3d3dy5zeXNsaW51eC5vcmcvd2lraS9pbmRleC5waHAvQ29tbW9uX1Byb2JsZW1zIj5odHRwOi8vd3d3LnN5c2xpbnV4Lm9yZy93aWtpL2luZGV4LnBocC9Db21tb25fUHJvYmxlbXM8L2E+IGFuZCBrbm93bg0KK2hhcmR3YXJlIGNvbXBhdGliaWxpdHkgaXNzdWVzIGFyZSBsaXN0ZWQgYXQNCis8YSBocmVmPSJodHRwOi8vd3d3LnN5c2xpbnV4Lm9yZy93aWtpL2luZGV4LnBocC9IYXJkd2FyZV9Db21wYXRpYmlsaXR5Ij5odHRwOi8vd3d3LnN5c2xpbnV4Lm9yZy93aWtpL2luZGV4LnBocC9IYXJkd2FyZV9Db21wYXRpYmlsaXR5PC9hPiB3aXRoDQorZmlsZW5hbWUgdHJhbnNsYXRpb24gZGlmZmljdWx0eSBhbmQgZWFybHkgUFhFIHN0YWNrcyBiZWluZyBzb21lIG9mIHRoZQ0KK21vc3QgY29tbW9uLiAgUmVwb3J0aW5nIG9mIG90aGVyIGVuY291bnRlcmVkIGlzc3VlcyBpcyB3ZWxjb21lIGFuZA0KK2FwcHJlY2lhdGVkLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYnVnX3JlcG9ydHMiPkJVRyBSRVBPUlRTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5JIHdvdWxkIGFwcHJlY2lhdGUgaGVhcmluZyBvZiBhbnkgcHJvYmxlbXMgeW91IGhhdmUgd2l0aCBTeXNsaW51eC4gIEkNCit3b3VsZCBhbHNvIGxpa2UgdG8gaGVhciBmcm9tIHlvdSBpZiB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgdXNlZCBTeXNsaW51eCwNCis8c3Ryb25nPmVzcGVjaWFsbHk8L3N0cm9uZz4gaWYgeW91IGFyZSB1c2luZyBpdCBmb3IgYSBkaXN0cmlidXRpb24uPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYgeW91IGFyZSByZXBvcnRpbmcgcHJvYmxlbXMsIHBsZWFzZSBpbmNsdWRlIGFsbCBwb3NzaWJsZSBpbmZvcm1hdGlvbg0KK2Fib3V0IHlvdXIgc3lzdGVtIGFuZCB5b3VyIEJJT1M7IHRoZSB2YXN0IG1ham9yaXR5IG9mIGFsbCBwcm9ibGVtcw0KK3JlcG9ydGVkIHR1cm4gb3V0IHRvIGJlIEJJT1Mgb3IgaGFyZHdhcmUgYnVncywgYW5kIEkgbmVlZCBhcyBtdWNoDQoraW5mb3JtYXRpb24gYXMgcG9zc2libGUgaW4gb3JkZXIgdG8gZGlhZ25vc2UgdGhlIHByb2JsZW1zLjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoZXJlIGlzIGEgbWFpbGluZyBsaXN0IGZvciBkaXNjdXNzaW9uIGFtb25nIFN5c2xpbnV4IHVzZXJzIGFuZCBmb3INCithbm5vdW5jZW1lbnRzIG9mIG5ldyBhbmQgdGVzdCB2ZXJzaW9ucy4gIFRvIGpvaW4sIG9yIHRvIGJyb3dzZSB0aGUNCithcmNoaXZlLCBnbyB0bzo8L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD48YSBocmVmPSJodHRwOi8vd3d3Lnp5dG9yLmNvbS9tYWlsbWFuL2xpc3RpbmZvL3N5c2xpbnV4Ij5odHRwOi8vd3d3Lnp5dG9yLmNvbS9tYWlsbWFuL2xpc3RpbmZvL3N5c2xpbnV4PC9hPjwvcD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlBsZWFzZSBETyBOT1Qgc2VuZCBIVE1MIG1lc3NhZ2VzIG9yIGF0dGFjaG1lbnRzIHRvIHRoZSBtYWlsaW5nIGxpc3QNCisoaW5jbHVkaW5nIG11bHRpcGFydC9hbHRlcm5hdGl2ZSBvciBzaW1pbGFyLikgIEFsbCBzdWNoIG1lc3NhZ2VzIHdpbGwgYmUNCitib3VuY2VkLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYXV0aG9yIj5BVVRIT1I8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgQXNjaWlEb2MgZGVyaXZlZCBkb2N1bWVudCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsDQorPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBkb2N1bWVudGF0aW9uIGJ5IEguIFBldGVyIEFudmluICZsdDs8YSBocmVmPSJtYWlsdG86aHBhQHp5dG9yLmNvbSI+aHBhQHp5dG9yLmNvbTwvYT4mZ3Q7LiAgVGhlIGNvbnZlcnNpb24NCit0byBhbiBBc2NpaURvYyB3YXMgbWFkZSBieSBHZW5lIEN1bW0gJmx0OzxhIGhyZWY9Im1haWx0bzpnZW5lLmN1bW1AZ21haWwuY29tIj5nZW5lLmN1bW1AZ21haWwuY29tPC9hPiZndDs8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBpZD0iZm9vdG5vdGVzIj48aHIgLz48L2Rpdj4NCis8ZGl2IGlkPSJmb290ZXIiPg0KKzxkaXYgaWQ9ImZvb3Rlci10ZXh0Ij4NCitMYXN0IHVwZGF0ZWQgMjAxNC0wMS0xNyAxNjowOTo1NiBQU1QNCis8L2Rpdj4NCis8L2Rpdj4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2VmaTY0L3R4dC9odG1sL3N5c2xpbnV4Lmh0bWwgYi9lZmk2NC90eHQvaHRtbC9zeXNsaW51eC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDg0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC90eHQvaHRtbC9zeXNsaW51eC5odG1sCkBAIC0wLDAgKzEsMTEyMyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPg0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iYXBwbGljYXRpb24veGh0bWwreG1sOyBjaGFyc2V0PVVURi04IiAvPg0KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQXNjaWlEb2MgOC42LjgiIC8+DQorPHRpdGxlPnN5c2xpbnV4KDEpPC90aXRsZT4NCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KKy8qIFNoYXJlZCBDU1MgZm9yIEFzY2lpRG9jIHhodG1sMTEgYW5kIGh0bWw1IGJhY2tlbmRzICovDQorDQorLyogRGVmYXVsdCBmb250LiAqLw0KK2JvZHkgew0KKyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsc2VyaWY7DQorfQ0KKw0KKy8qIFRpdGxlIGZvbnQuICovDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiwNCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUsDQordGhlYWQsIHAudGFibGUuaGVhZGVyLA0KKyN0b2N0aXRsZSwNCisjYXV0aG9yLCAjcmV2bnVtYmVyLCAjcmV2ZGF0ZSwgI3JldnJlbWFyaywNCisjZm9vdGVyIHsNCisgIGZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjsNCit9DQorDQorYm9keSB7DQorICBtYXJnaW46IDFlbSA1JSAxZW0gNSU7DQorfQ0KKw0KK2Egew0KKyAgY29sb3I6IGJsdWU7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCit9DQorYTp2aXNpdGVkIHsNCisgIGNvbG9yOiBmdWNoc2lhOw0KK30NCisNCitlbSB7DQorICBmb250LXN0eWxlOiBpdGFsaWM7DQorICBjb2xvcjogbmF2eTsNCit9DQorDQorc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICMwODMxOTQ7DQorfQ0KKw0KK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBtYXJnaW4tdG9wOiAxLjJlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KKyAgbGluZS1oZWlnaHQ6IDEuMzsNCit9DQorDQoraDEsIGgyLCBoMyB7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitoMiB7DQorICBwYWRkaW5nLXRvcDogMC41ZW07DQorfQ0KK2gzIHsNCisgIGZsb2F0OiBsZWZ0Ow0KK30NCitoMyArICogew0KKyAgY2xlYXI6IGxlZnQ7DQorfQ0KK2g1IHsNCisgIGZvbnQtc2l6ZTogMS4wZW07DQorfQ0KKw0KK2Rpdi5zZWN0aW9uYm9keSB7DQorICBtYXJnaW4tbGVmdDogMDsNCit9DQorDQoraHIgew0KKyAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOw0KK30NCisNCitwIHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQorfQ0KKw0KK3VsLCBvbCwgbGkgPiBwIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KK3VsID4gbGkgICAgIHsgY29sb3I6ICNhYWE7IH0NCit1bCA+IGxpID4gKiB7IGNvbG9yOiBibGFjazsgfQ0KKw0KKy5tb25vc3BhY2VkLCBjb2RlLCBwcmUgew0KKyAgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTsNCisgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCisgIGNvbG9yOiBuYXZ5Ow0KKyAgcGFkZGluZzogMDsNCisgIG1hcmdpbjogMDsNCit9DQorDQorDQorI2F1dGhvciB7DQorICBjb2xvcjogIzUyN2JiZDsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCit9DQorI2VtYWlsIHsNCit9DQorI3Jldm51bWJlciwgI3JldmRhdGUsICNyZXZyZW1hcmsgew0KK30NCisNCisjZm9vdGVyIHsNCisgIGZvbnQtc2l6ZTogc21hbGw7DQorICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyOw0KKyAgcGFkZGluZy10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLXRvcDogNC4wZW07DQorfQ0KKyNmb290ZXItdGV4dCB7DQorICBmbG9hdDogbGVmdDsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCit9DQorI2Zvb3Rlci1iYWRnZXMgew0KKyAgZmxvYXQ6IHJpZ2h0Ow0KKyAgcGFkZGluZy1ib3R0b206IDAuNWVtOw0KK30NCisNCisjcHJlYW1ibGUgew0KKyAgbWFyZ2luLXRvcDogMS41ZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmltYWdlYmxvY2ssIGRpdi5leGFtcGxlYmxvY2ssIGRpdi52ZXJzZWJsb2NrLA0KK2Rpdi5xdW90ZWJsb2NrLCBkaXYubGl0ZXJhbGJsb2NrLCBkaXYubGlzdGluZ2Jsb2NrLCBkaXYuc2lkZWJhcmJsb2NrLA0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LmFkbW9uaXRpb25ibG9jayB7DQorICBtYXJnaW4tdG9wOiAyLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDIuMGVtOw0KKyAgbWFyZ2luLXJpZ2h0OiAxMCU7DQorICBjb2xvcjogIzYwNjA2MDsNCit9DQorDQorZGl2LmNvbnRlbnQgeyAvKiBCbG9jayBlbGVtZW50IGNvbnRlbnQuICovDQorICBwYWRkaW5nOiAwOw0KK30NCisNCisvKiBCbG9jayBlbGVtZW50IHRpdGxlcy4gKi8NCitkaXYudGl0bGUsIGNhcHRpb24udGl0bGUgew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tdG9wOiAxLjBlbTsNCisgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KK30NCitkaXYudGl0bGUgKyAqIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKw0KK3RkIGRpdi50aXRsZTpmaXJzdC1jaGlsZCB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorZGl2LmNvbnRlbnQgZGl2LnRpdGxlOmZpcnN0LWNoaWxkIHsNCisgIG1hcmdpbi10b3A6IDAuMGVtOw0KK30NCitkaXYuY29udGVudCArIGRpdi50aXRsZSB7DQorICBtYXJnaW4tdG9wOiAwLjBlbTsNCit9DQorDQorZGl2LnNpZGViYXJibG9jayA+IGRpdi5jb250ZW50IHsNCisgIGJhY2tncm91bmQ6ICNmZmZmZWU7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjBmMGYwOw0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KK2Rpdi5saXN0aW5nYmxvY2sgPiBkaXYuY29udGVudCB7DQorICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgYmFja2dyb3VuZDogI2Y4ZjhmODsNCisgIHBhZGRpbmc6IDAuNWVtOw0KK30NCisNCitkaXYucXVvdGVibG9jaywgZGl2LnZlcnNlYmxvY2sgew0KKyAgcGFkZGluZy1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1sZWZ0OiAxLjBlbTsNCisgIG1hcmdpbi1yaWdodDogMTAlOw0KKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZjBmMGYwOw0KKyAgY29sb3I6ICM4ODg7DQorfQ0KKw0KK2Rpdi5xdW90ZWJsb2NrID4gZGl2LmF0dHJpYnV0aW9uIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCitkaXYudmVyc2VibG9jayA+IHByZS5jb250ZW50IHsNCisgIGZvbnQtZmFtaWx5OiBpbmhlcml0Ow0KKyAgZm9udC1zaXplOiBpbmhlcml0Ow0KK30NCitkaXYudmVyc2VibG9jayA+IGRpdi5hdHRyaWJ1dGlvbiB7DQorICBwYWRkaW5nLXRvcDogMC43NWVtOw0KKyAgdGV4dC1hbGlnbjogbGVmdDsNCit9DQorLyogREVQUkVDQVRFRDogUHJlIHZlcnNpb24gOC4yLjcgdmVyc2Ugc3R5bGUgbGl0ZXJhbCBibG9jay4gKi8NCitkaXYudmVyc2VibG9jayArIGRpdi5hdHRyaWJ1dGlvbiB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KK30NCisNCitkaXYuYWRtb25pdGlvbmJsb2NrIC5pY29uIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXNpemU6IDEuMWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgcGFkZGluZy1yaWdodDogMC41ZW07DQorfQ0KK2Rpdi5hZG1vbml0aW9uYmxvY2sgdGQuY29udGVudCB7DQorICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KK30NCisNCitkaXYuZXhhbXBsZWJsb2NrID4gZGl2LmNvbnRlbnQgew0KKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZGRkZGRkOw0KKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCit9DQorDQorZGl2LmltYWdlYmxvY2sgZGl2LmNvbnRlbnQgeyBwYWRkaW5nLWxlZnQ6IDA7IH0NCitzcGFuLmltYWdlIGltZyB7IGJvcmRlci1zdHlsZTogbm9uZTsgfQ0KK2EuaW1hZ2U6dmlzaXRlZCB7IGNvbG9yOiB3aGl0ZTsgfQ0KKw0KK2RsIHsNCisgIG1hcmdpbi10b3A6IDAuOGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2R0IHsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCisgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCitkZCA+ICo6Zmlyc3QtY2hpbGQgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorfQ0KKw0KK3VsLCBvbCB7DQorICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7DQorfQ0KK29sLmFyYWJpYyB7DQorICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7DQorfQ0KK29sLmxvd2VyYWxwaGEgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYTsNCit9DQorb2wudXBwZXJhbHBoYSB7DQorICBsaXN0LXN0eWxlLXR5cGU6IHVwcGVyLWFscGhhOw0KK30NCitvbC5sb3dlcnJvbWFuIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItcm9tYW47DQorfQ0KK29sLnVwcGVycm9tYW4gew0KKyAgbGlzdC1zdHlsZS10eXBlOiB1cHBlci1yb21hbjsNCit9DQorDQorZGl2LmNvbXBhY3QgdWwsIGRpdi5jb21wYWN0IG9sLA0KK2Rpdi5jb21wYWN0IHAsIGRpdi5jb21wYWN0IHAsDQorZGl2LmNvbXBhY3QgZGl2LCBkaXYuY29tcGFjdCBkaXYgew0KKyAgbWFyZ2luLXRvcDogMC4xZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQordGZvb3Qgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KK3RkID4gZGl2LnZlcnNlIHsNCisgIHdoaXRlLXNwYWNlOiBwcmU7DQorfQ0KKw0KK2Rpdi5oZGxpc3Qgew0KKyAgbWFyZ2luLXRvcDogMC44ZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZGl2LmhkbGlzdCB0ciB7DQorICBwYWRkaW5nLWJvdHRvbTogMTVweDsNCit9DQorZHQuaGRsaXN0MS5zdHJvbmcsIHRkLmhkbGlzdDEuc3Ryb25nIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCit0ZC5oZGxpc3QxIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorICBwYWRkaW5nLXJpZ2h0OiAwLjhlbTsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCit0ZC5oZGxpc3QyIHsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5oZGxpc3QuY29tcGFjdCB0ciB7DQorICBtYXJnaW46IDA7DQorICBwYWRkaW5nLWJvdHRvbTogMDsNCit9DQorDQorLmNvbW1lbnQgew0KKyAgYmFja2dyb3VuZDogeWVsbG93Ow0KK30NCisNCisuZm9vdG5vdGUsIC5mb290bm90ZXJlZiB7DQorICBmb250LXNpemU6IDAuOGVtOw0KK30NCisNCitzcGFuLmZvb3Rub3RlLCBzcGFuLmZvb3Rub3RlcmVmIHsNCisgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjsNCit9DQorDQorI2Zvb3Rub3RlcyB7DQorICBtYXJnaW46IDIwcHggMCAyMHB4IDA7DQorICBwYWRkaW5nOiA3cHggMCAwIDA7DQorfQ0KKw0KKyNmb290bm90ZXMgZGl2LmZvb3Rub3RlIHsNCisgIG1hcmdpbjogMCAwIDVweCAwOw0KK30NCisNCisjZm9vdG5vdGVzIGhyIHsNCisgIGJvcmRlcjogbm9uZTsNCisgIGJvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7DQorICBoZWlnaHQ6IDFweDsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBtYXJnaW4tbGVmdDogMDsNCisgIHdpZHRoOiAyMCU7DQorICBtaW4td2lkdGg6IDEwMHB4Ow0KK30NCisNCitkaXYuY29saXN0IHRkIHsNCisgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KKyAgcGFkZGluZy1ib3R0b206IDAuM2VtOw0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorZGl2LmNvbGlzdCB0ZCBpbWcgew0KKyAgbWFyZ2luLXRvcDogMC4zZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICAjZm9vdGVyLWJhZGdlcyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorI3RvYyB7DQorICBtYXJnaW4tYm90dG9tOiAyLjVlbTsNCit9DQorDQorI3RvY3RpdGxlIHsNCisgIGNvbG9yOiAjNTI3YmJkOw0KKyAgZm9udC1zaXplOiAxLjFlbTsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAwLjFlbTsNCit9DQorDQorZGl2LnRvY2xldmVsMCwgZGl2LnRvY2xldmVsMSwgZGl2LnRvY2xldmVsMiwgZGl2LnRvY2xldmVsMywgZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tdG9wOiAwOw0KKyAgbWFyZ2luLWJvdHRvbTogMDsNCit9DQorZGl2LnRvY2xldmVsMiB7DQorICBtYXJnaW4tbGVmdDogMmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsMyB7DQorICBtYXJnaW4tbGVmdDogNGVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorZGl2LnRvY2xldmVsNCB7DQorICBtYXJnaW4tbGVmdDogNmVtOw0KKyAgZm9udC1zaXplOiAwLjllbTsNCit9DQorDQorc3Bhbi5hcXVhIHsgY29sb3I6IGFxdWE7IH0NCitzcGFuLmJsYWNrIHsgY29sb3I6IGJsYWNrOyB9DQorc3Bhbi5ibHVlIHsgY29sb3I6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEgeyBjb2xvcjogZnVjaHNpYTsgfQ0KK3NwYW4uZ3JheSB7IGNvbG9yOiBncmF5OyB9DQorc3Bhbi5ncmVlbiB7IGNvbG9yOiBncmVlbjsgfQ0KK3NwYW4ubGltZSB7IGNvbG9yOiBsaW1lOyB9DQorc3Bhbi5tYXJvb24geyBjb2xvcjogbWFyb29uOyB9DQorc3Bhbi5uYXZ5IHsgY29sb3I6IG5hdnk7IH0NCitzcGFuLm9saXZlIHsgY29sb3I6IG9saXZlOyB9DQorc3Bhbi5wdXJwbGUgeyBjb2xvcjogcHVycGxlOyB9DQorc3Bhbi5yZWQgeyBjb2xvcjogcmVkOyB9DQorc3Bhbi5zaWx2ZXIgeyBjb2xvcjogc2lsdmVyOyB9DQorc3Bhbi50ZWFsIHsgY29sb3I6IHRlYWw7IH0NCitzcGFuLndoaXRlIHsgY29sb3I6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3cgeyBjb2xvcjogeWVsbG93OyB9DQorDQorc3Bhbi5hcXVhLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBhcXVhOyB9DQorc3Bhbi5ibGFjay1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogYmxhY2s7IH0NCitzcGFuLmJsdWUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGJsdWU7IH0NCitzcGFuLmZ1Y2hzaWEtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGZ1Y2hzaWE7IH0NCitzcGFuLmdyYXktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IGdyYXk7IH0NCitzcGFuLmdyZWVuLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBncmVlbjsgfQ0KK3NwYW4ubGltZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogbGltZTsgfQ0KK3NwYW4ubWFyb29uLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBtYXJvb247IH0NCitzcGFuLm5hdnktYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IG5hdnk7IH0NCitzcGFuLm9saXZlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBvbGl2ZTsgfQ0KK3NwYW4ucHVycGxlLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiBwdXJwbGU7IH0NCitzcGFuLnJlZC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcmVkOyB9DQorc3Bhbi5zaWx2ZXItYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHNpbHZlcjsgfQ0KK3NwYW4udGVhbC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogdGVhbDsgfQ0KK3NwYW4ud2hpdGUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHdoaXRlOyB9DQorc3Bhbi55ZWxsb3ctYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHllbGxvdzsgfQ0KKw0KK3NwYW4uYmlnIHsgZm9udC1zaXplOiAyZW07IH0NCitzcGFuLnNtYWxsIHsgZm9udC1zaXplOiAwLjZlbTsgfQ0KKw0KK3NwYW4udW5kZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0NCitzcGFuLm92ZXJsaW5lIHsgdGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsgfQ0KK3NwYW4ubGluZS10aHJvdWdoIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IH0NCisNCitkaXYudW5icmVha2FibGUgeyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0NCisNCisNCisvKg0KKyAqIHhodG1sMTEgc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorZGl2LnRhYmxlYmxvY2sgew0KKyAgbWFyZ2luLXRvcDogMS4wZW07DQorICBtYXJnaW4tYm90dG9tOiAxLjVlbTsNCit9DQorZGl2LnRhYmxlYmxvY2sgPiB0YWJsZSB7DQorICBib3JkZXI6IDNweCBzb2xpZCAjNTI3YmJkOw0KK30NCit0aGVhZCwgcC50YWJsZS5oZWFkZXIgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorcC50YWJsZSB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCisvKiBCZWNhdXNlIHRoZSB0YWJsZSBmcmFtZSBhdHRyaWJ1dGUgaXMgb3ZlcnJpZGVuIGJ5IENTUyBpbiBtb3N0IGJyb3dzZXJzLiAqLw0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9InZvaWQiXSB7DQorICBib3JkZXItc3R5bGU6IG5vbmU7DQorfQ0KK2Rpdi50YWJsZWJsb2NrID4gdGFibGVbZnJhbWU9ImhzaWRlcyJdIHsNCisgIGJvcmRlci1sZWZ0LXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOw0KK30NCitkaXYudGFibGVibG9jayA+IHRhYmxlW2ZyYW1lPSJ2c2lkZXMiXSB7DQorICBib3JkZXItdG9wLXN0eWxlOiBub25lOw0KKyAgYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsNCit9DQorDQorDQorLyoNCisgKiBodG1sNSBzcGVjaWZpYw0KKyAqDQorICogKi8NCisNCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIG1hcmdpbi10b3A6IDEuMGVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07DQorfQ0KK3RoZWFkLCBwLnRhYmxlYmxvY2suaGVhZGVyIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorfQ0KK3AudGFibGVibG9jayB7DQorICBtYXJnaW4tdG9wOiAwOw0KK30NCit0YWJsZS50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogM3B4Ow0KKyAgYm9yZGVyLXNwYWNpbmc6IDBweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorICBib3JkZXItY29sb3I6ICM1MjdiYmQ7DQorICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KK30NCit0aC50YWJsZWJsb2NrLCB0ZC50YWJsZWJsb2NrIHsNCisgIGJvcmRlci13aWR0aDogMXB4Ow0KKyAgcGFkZGluZzogNHB4Ow0KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCisgIGJvcmRlci1jb2xvcjogIzUyN2JiZDsNCit9DQorDQordGFibGUudGFibGVibG9jay5mcmFtZS10b3Bib3Qgew0KKyAgYm9yZGVyLWxlZnQtc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1yaWdodC1zdHlsZTogaGlkZGVuOw0KK30NCit0YWJsZS50YWJsZWJsb2NrLmZyYW1lLXNpZGVzIHsNCisgIGJvcmRlci10b3Atc3R5bGU6IGhpZGRlbjsNCisgIGJvcmRlci1ib3R0b20tc3R5bGU6IGhpZGRlbjsNCit9DQordGFibGUudGFibGVibG9jay5mcmFtZS1ub25lIHsNCisgIGJvcmRlci1zdHlsZTogaGlkZGVuOw0KK30NCisNCit0aC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0LCB0ZC50YWJsZWJsb2NrLmhhbGlnbi1sZWZ0IHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KK3RoLnRhYmxlYmxvY2suaGFsaWduLWNlbnRlciwgdGQudGFibGVibG9jay5oYWxpZ24tY2VudGVyIHsNCisgIHRleHQtYWxpZ246IGNlbnRlcjsNCit9DQordGgudGFibGVibG9jay5oYWxpZ24tcmlnaHQsIHRkLnRhYmxlYmxvY2suaGFsaWduLXJpZ2h0IHsNCisgIHRleHQtYWxpZ246IHJpZ2h0Ow0KK30NCisNCit0aC50YWJsZWJsb2NrLnZhbGlnbi10b3AsIHRkLnRhYmxlYmxvY2sudmFsaWduLXRvcCB7DQorICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1taWRkbGUsIHRkLnRhYmxlYmxvY2sudmFsaWduLW1pZGRsZSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KK30NCit0aC50YWJsZWJsb2NrLnZhbGlnbi1ib3R0b20sIHRkLnRhYmxlYmxvY2sudmFsaWduLWJvdHRvbSB7DQorICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOw0KK30NCisNCisNCisvKg0KKyAqIG1hbnBhZ2Ugc3BlY2lmaWMNCisgKg0KKyAqICovDQorDQorYm9keS5tYW5wYWdlIGgxIHsNCisgIHBhZGRpbmctdG9wOiAwLjVlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsNCisgIGJvcmRlci10b3A6IDJweCBzb2xpZCBzaWx2ZXI7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCitib2R5Lm1hbnBhZ2UgaDIgew0KKyAgYm9yZGVyLXN0eWxlOiBub25lOw0KK30NCitib2R5Lm1hbnBhZ2UgZGl2LnNlY3Rpb25ib2R5IHsNCisgIG1hcmdpbi1sZWZ0OiAzZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICBib2R5Lm1hbnBhZ2UgZGl2I3RvYyB7IGRpc3BsYXk6IG5vbmU7IH0NCit9DQorDQorDQorPC9zdHlsZT4NCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQorLyo8IVtDREFUQVsqLw0KK3ZhciBhc2NpaWRvYyA9IHsgIC8vIE5hbWVzcGFjZS4NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBUYWJsZSBPZiBDb250ZW50cyBnZW5lcmF0b3INCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisvKiBBdXRob3I6IE1paGFpIEJhem9uLCBTZXB0ZW1iZXIgMjAwMg0KKyAqIGh0dHA6Ly9zdHVkZW50cy5pbmZvaWFzaS5yby9+bWlzaG9vDQorICoNCisgKiBUYWJsZSBPZiBDb250ZW50IGdlbmVyYXRvcg0KKyAqIFZlcnNpb246IDAuNA0KKyAqDQorICogRmVlbCBmcmVlIHRvIHVzZSB0aGlzIHNjcmlwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYw0KKyAqIExpY2Vuc2UsIGFzIGxvbmcgYXMgeW91IGRvIG5vdCByZW1vdmUgb3IgYWx0ZXIgdGhpcyBub3RpY2UuDQorICovDQorDQorIC8qIG1vZGlmaWVkIGJ5IFRyb3kgRC4gSGFuc29uLCBTZXB0ZW1iZXIgMjAwNi4gTGljZW5zZTogR1BMICovDQorIC8qIG1vZGlmaWVkIGJ5IFN0dWFydCBSYWNraGFtLCAyMDA2LCAyMDA5LiBMaWNlbnNlOiBHUEwgKi8NCisNCisvLyB0b2NsZXZlbHMgPSAxLi40Lg0KK3RvYzogZnVuY3Rpb24gKHRvY2xldmVscykgew0KKw0KKyAgZnVuY3Rpb24gZ2V0VGV4dChlbCkgew0KKyAgICB2YXIgdGV4dCA9ICIiOw0KKyAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgIGlmIChpLm5vZGVUeXBlID09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIC8vIElFIGRvZXNuJ3Qgc3BlYWsgY29uc3RhbnRzLg0KKyAgICAgICAgdGV4dCArPSBpLmRhdGE7DQorICAgICAgZWxzZSBpZiAoaS5maXJzdENoaWxkICE9IG51bGwpDQorICAgICAgICB0ZXh0ICs9IGdldFRleHQoaSk7DQorICAgIH0NCisgICAgcmV0dXJuIHRleHQ7DQorICB9DQorDQorICBmdW5jdGlvbiBUb2NFbnRyeShlbCwgdGV4dCwgdG9jbGV2ZWwpIHsNCisgICAgdGhpcy5lbGVtZW50ID0gZWw7DQorICAgIHRoaXMudGV4dCA9IHRleHQ7DQorICAgIHRoaXMudG9jbGV2ZWwgPSB0b2NsZXZlbDsNCisgIH0NCisNCisgIGZ1bmN0aW9uIHRvY0VudHJpZXMoZWwsIHRvY2xldmVscykgew0KKyAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5Ow0KKyAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdbaEhdKFsxLScrKHRvY2xldmVscysxKSsnXSknKTsNCisgICAgLy8gRnVuY3Rpb24gdGhhdCBzY2FucyB0aGUgRE9NIHRyZWUgZm9yIGhlYWRlciBlbGVtZW50cyAodGhlIERPTTINCisgICAgLy8gbm9kZUl0ZXJhdG9yIEFQSSB3b3VsZCBiZSBhIGJldHRlciB0ZWNobmlxdWUgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgYWxsDQorICAgIC8vIGJyb3dzZXJzKS4NCisgICAgdmFyIGl0ZXJhdGUgPSBmdW5jdGlvbiAoZWwpIHsNCisgICAgICBmb3IgKHZhciBpID0gZWwuZmlyc3RDaGlsZDsgaSAhPSBudWxsOyBpID0gaS5uZXh0U2libGluZykgew0KKyAgICAgICAgaWYgKGkubm9kZVR5cGUgPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykgew0KKyAgICAgICAgICB2YXIgbW8gPSByZS5leGVjKGkudGFnTmFtZSk7DQorICAgICAgICAgIGlmIChtbyAmJiAoaS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgaS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpKSAhPSAiZmxvYXQiKSB7DQorICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbmV3IFRvY0VudHJ5KGksIGdldFRleHQoaSksIG1vWzFdLTEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGl0ZXJhdGUoaSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGl0ZXJhdGUoZWwpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgdmFyIHRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b2MiKTsNCisgIGlmICghdG9jKSB7DQorICAgIHJldHVybjsNCisgIH0NCisNCisgIC8vIERlbGV0ZSBleGlzdGluZyBUT0MgZW50cmllcyBpbiBjYXNlIHdlJ3JlIHJlbG9hZGluZyB0aGUgVE9DLg0KKyAgdmFyIHRvY0VudHJpZXNUb1JlbW92ZSA9IFtdOw0KKyAgdmFyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgdG9jLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gdG9jLmNoaWxkTm9kZXNbaV07DQorICAgIGlmIChlbnRyeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdkaXYnDQorICAgICAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikNCisgICAgICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCgvXnRvY2xldmVsLykpDQorICAgICAgdG9jRW50cmllc1RvUmVtb3ZlLnB1c2goZW50cnkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IHRvY0VudHJpZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KKyAgICB0b2MucmVtb3ZlQ2hpbGQodG9jRW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgVE9DIGVudHJpZXMuDQorICB2YXIgZW50cmllcyA9IHRvY0VudHJpZXMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKSwgdG9jbGV2ZWxzKTsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KKyAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2ldOw0KKyAgICBpZiAoZW50cnkuZWxlbWVudC5pZCA9PSAiIikNCisgICAgICBlbnRyeS5lbGVtZW50LmlkID0gIl90b2NfIiArIGk7DQorICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOw0KKyAgICBhLmhyZWYgPSAiIyIgKyBlbnRyeS5lbGVtZW50LmlkOw0KKyAgICBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVudHJ5LnRleHQpKTsNCisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KKyAgICBkaXYuYXBwZW5kQ2hpbGQoYSk7DQorICAgIGRpdi5jbGFzc05hbWUgPSAidG9jbGV2ZWwiICsgZW50cnkudG9jbGV2ZWw7DQorICAgIHRvYy5hcHBlbmRDaGlsZChkaXYpOw0KKyAgfQ0KKyAgaWYgKGVudHJpZXMubGVuZ3RoID09IDApDQorICAgIHRvYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYyk7DQorfSwNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBGb290bm90ZXMgZ2VuZXJhdG9yDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyogQmFzZWQgb24gZm9vdG5vdGUgZ2VuZXJhdGlvbiBjb2RlIGZyb206DQorICogaHR0cDovL3d3dy5icmFuZHNwYW5raW5nbmV3Lm5ldC9hcmNoaXZlLzIwMDUvMDcvZm9ybWF0X2Zvb3Rub3RlLmh0bWwNCisgKi8NCisNCitmb290bm90ZXM6IGZ1bmN0aW9uICgpIHsNCisgIC8vIERlbGV0ZSBleGlzdGluZyBmb290bm90ZSBlbnRyaWVzIGluIGNhc2Ugd2UncmUgcmVsb2FkaW5nIHRoZSBmb290bm9kZXMuDQorICB2YXIgaTsNCisgIHZhciBub3RlaG9sZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvb3Rub3RlcyIpOw0KKyAgaWYgKCFub3RlaG9sZGVyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHZhciBlbnRyaWVzVG9SZW1vdmUgPSBbXTsNCisgIGZvciAoaSA9IDA7IGkgPCBub3RlaG9sZGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCisgICAgdmFyIGVudHJ5ID0gbm90ZWhvbGRlci5jaGlsZE5vZGVzW2ldOw0KKyAgICBpZiAoZW50cnkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZGl2JyAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gImZvb3Rub3RlIikNCisgICAgICBlbnRyaWVzVG9SZW1vdmUucHVzaChlbnRyeSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgZW50cmllc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQorICAgIG5vdGVob2xkZXIucmVtb3ZlQ2hpbGQoZW50cmllc1RvUmVtb3ZlW2ldKTsNCisgIH0NCisNCisgIC8vIFJlYnVpbGQgZm9vdG5vdGUgZW50cmllcy4NCisgIHZhciBjb250ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnQiKTsNCisgIHZhciBzcGFucyA9IGNvbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsNCisgIHZhciByZWZzID0ge307DQorICB2YXIgbiA9IDA7DQorICBmb3IgKGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgew0KKyAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZSIpIHsNCisgICAgICBuKys7DQorICAgICAgdmFyIG5vdGUgPSBzcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIpOw0KKyAgICAgIGlmICghbm90ZSkgew0KKyAgICAgICAgLy8gVXNlIFtcc1xTXSBpbiBwbGFjZSBvZiAuIHNvIG11bHRpLWxpbmUgbWF0Y2hlcyB3b3JrLg0KKyAgICAgICAgLy8gQmVjYXVzZSBKYXZhU2NyaXB0IGhhcyBubyBzIChkb3RhbGwpIHJlZ2V4IGZsYWcuDQorICAgICAgICBub3RlID0gc3BhbnNbaV0uaW5uZXJIVE1MLm1hdGNoKC9ccypcWyhbXHNcU10qKV1ccyovKVsxXTsNCisgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9DQorICAgICAgICAgICJbPGEgaWQ9J19mb290bm90ZXJlZl8iICsgbiArICInIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgICBzcGFuc1tpXS5zZXRBdHRyaWJ1dGUoImRhdGEtbm90ZSIsIG5vdGUpOw0KKyAgICAgIH0NCisgICAgICBub3RlaG9sZGVyLmlubmVySFRNTCArPQ0KKyAgICAgICAgIjxkaXYgY2xhc3M9J2Zvb3Rub3RlJyBpZD0nX2Zvb3Rub3RlXyIgKyBuICsgIic+IiArDQorICAgICAgICAiPGEgaHJlZj0nI19mb290bm90ZXJlZl8iICsgbiArICInIHRpdGxlPSdSZXR1cm4gdG8gdGV4dCc+IiArDQorICAgICAgICBuICsgIjwvYT4uICIgKyBub3RlICsgIjwvZGl2PiI7DQorICAgICAgdmFyIGlkID1zcGFuc1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7DQorICAgICAgaWYgKGlkICE9IG51bGwpIHJlZnNbIiMiK2lkXSA9IG47DQorICAgIH0NCisgIH0NCisgIGlmIChuID09IDApDQorICAgIG5vdGVob2xkZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub3RlaG9sZGVyKTsNCisgIGVsc2Ugew0KKyAgICAvLyBQcm9jZXNzIGZvb3Rub3RlcmVmcy4NCisgICAgZm9yIChpPTA7IGk8c3BhbnMubGVuZ3RoOyBpKyspIHsNCisgICAgICBpZiAoc3BhbnNbaV0uY2xhc3NOYW1lID09ICJmb290bm90ZXJlZiIpIHsNCisgICAgICAgIHZhciBocmVmID0gc3BhbnNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsNCisgICAgICAgIGhyZWYgPSBocmVmLm1hdGNoKC8jLiovKVswXTsgIC8vIEJlY2F1c2UgSUUgcmV0dXJuIGZ1bGwgVVJMLg0KKyAgICAgICAgbiA9IHJlZnNbaHJlZl07DQorICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPQ0KKyAgICAgICAgICAiWzxhIGhyZWY9JyNfZm9vdG5vdGVfIiArIG4gKw0KKyAgICAgICAgICAiJyB0aXRsZT0nVmlldyBmb290bm90ZScgY2xhc3M9J2Zvb3Rub3RlJz4iICsgbiArICI8L2E+XSI7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfSwNCisNCitpbnN0YWxsOiBmdW5jdGlvbih0b2NsZXZlbHMpIHsNCisgIHZhciB0aW1lcklkOw0KKw0KKyAgZnVuY3Rpb24gcmVpbnN0YWxsKCkgew0KKyAgICBhc2NpaWRvYy5mb290bm90ZXMoKTsNCisgICAgaWYgKHRvY2xldmVscykgew0KKyAgICAgIGFzY2lpZG9jLnRvYyh0b2NsZXZlbHMpOw0KKyAgICB9DQorICB9DQorDQorICBmdW5jdGlvbiByZWluc3RhbGxBbmRSZW1vdmVUaW1lcigpIHsNCisgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsNCisgICAgcmVpbnN0YWxsKCk7DQorICB9DQorDQorICB0aW1lcklkID0gc2V0SW50ZXJ2YWwocmVpbnN0YWxsLCA1MDApOw0KKyAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpDQorICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCByZWluc3RhbGxBbmRSZW1vdmVUaW1lciwgZmFsc2UpOw0KKyAgZWxzZQ0KKyAgICB3aW5kb3cub25sb2FkID0gcmVpbnN0YWxsQW5kUmVtb3ZlVGltZXI7DQorfQ0KKw0KK30NCithc2NpaWRvYy5pbnN0YWxsKCk7DQorLypdXT4qLw0KKzwvc2NyaXB0Pg0KKzwvaGVhZD4NCis8Ym9keSBjbGFzcz0ibWFucGFnZSI+DQorPGRpdiBpZD0iaGVhZGVyIj4NCis8aDE+DQorc3lzbGludXgoMSkgTWFudWFsIFBhZ2UNCis8L2gxPg0KKzxoMj5OQU1FPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPHA+c3lzbGludXggLQ0KKyAgIEluc3RhbGwgU1lTTElOVVggdG8gYSBmaWxlIHN5c3RlbQ0KKzwvcD4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGlkPSJjb250ZW50Ij4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfc3lub3BzaXMiPlNZTk9QU0lTPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0idmVyc2VibG9jayI+DQorPHByZSBjbGFzcz0iY29udGVudCI+PHN0cm9uZz5zeXNsaW51eDwvc3Ryb25nPiBbPGVtPk9QVElPTlM8L2VtPl0gPGVtPkRFVklDRTwvZW0+DQorPHN0cm9uZz5leHRsaW51eDwvc3Ryb25nPiBbPGVtPk9QVElPTlM8L2VtPl0gPGVtPlBBVEg8L2VtPg0KKzxzdHJvbmc+c3lzbGludXg8L3N0cm9uZz4gWy1oIHwgLS1oZWxwIHwgLXYgfCAtLXZlcnNpb25dDQorPHN0cm9uZz5leHRsaW51eDwvc3Ryb25nPiBbLWggfCAtLWhlbHAgfCAtdiB8IC0tdmVyc2lvbl08L3ByZT4NCis8ZGl2IGNsYXNzPSJhdHRyaWJ1dGlvbiI+DQorPC9kaXY+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2Rlc2NyaXB0aW9uIj5ERVNDUklQVElPTjwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SW5zdGFsbCA8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IHRvIHRoZSA8ZW0+REVWSUNFPC9lbT4vPGVtPlBBVEg8L2VtPiwgYWx0ZXJpbmcgdGhlIGJvb3Qgc2VjdG9yIGFuZA0KK2luc3RhbGxpbmcgdGhlIDxlbT5sZGxpbnV4LnN5czwvZW0+IGJvb3QgbG9hZGVyIGZpbGUuICBGb3IgdGhlIExpbnV4IGluc3RhbGxlcg0KK2V4dGxpbnV4LCA8ZW0+UEFUSDwvZW0+IGlzIHRoZSBkZXNpcmVkIHBhdGggZm9yIHRoZSBjb250cm9sIGZpbGVzIG9uIGEgbW91bnRlZCwNCitzdXBwb3J0ZWQgZmlsZSBzeXN0ZW0gYW5kIHNldHMgdGhlIGluc3RhbGwtdGltZSB3b3JraW5nIGRpcmVjdG9yeS4gIEZvcg0KK2FsbCBvdGhlcnMsIDxlbT5ERVZJQ0U8L2VtPiBtdXN0IHNwZWNpZnkgYSBGQVQxMi9GQVQxNi9GQVQzMiBmaWxlIHN5c3RlbS4gIEZvcg0KK3RoZSBMaW51eCBpbnN0YWxsZXJzIHN5c2xpbnV4IGFuZCBzeXNsaW51eC1tdG9vbHMsIDxlbT5ERVZJQ0U8L2VtPiBzaG91bGQgYmUgYW4NCit1bm1vdW50ZWQgZmlsZSBzeXN0ZW0uICBGb3IgdGhlIERPUy9XaW4zMi9XaW42NCBpbnN0YWxsZXJzLCA8ZW0+REVWSUNFPC9lbT4NCitzaG91bGQgYmUgYSBkcml2ZSBsaWtlIDxlbT5hOjwvZW0+IChjYXNlIGluc2Vuc2l0aXZlKS48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Gb3IgdmVyc2lvbnMgfjQuMDAgYW5kIGxhdGVyLCBlaXRoZXIgLWkvLS1pbnN0YWxsIG9yIC1VLy0tdXBkYXRlIG11c3QgYmUNCitzcGVjaWZpZWQgdW5sZXNzIG1vZGlmeWluZyB0aGUgQURWIG9mIGFuIGV4aXN0aW5nIGluc3RhbGwgKG9wdGlvbnMNCit0YWdnZWQgd2l0aCA8ZW0+QURWPC9lbT4pIG9yIHJlcXVlc3RpbmcgdGhlIGhlbHAvdXNhZ2Ugb3IgdmVyc2lvbiBpbmZvLCAuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SWYsIGR1cmluZyBib290LCB0aGUgU2hpZnQgb3IgQWx0IGtleXMgYXJlIGhlbGQgZG93biwgb3IgdGhlIENhcHMgb3INCitTY3JvbGwgbG9ja3MgYXJlIHNldCwgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiB3aWxsIGRpc3BsYXkgYSA8c3Ryb25nPmxpbG88L3N0cm9uZz4oOCkgLXN0eWxlICJib290OiINCitwcm9tcHQuIFRoZSB1c2VyIGNhbiB0aGVuIHR5cGUgYSBrZXJuZWwgZmlsZSBuYW1lIGZvbGxvd2VkIGJ5IGFueSBrZXJuZWwNCitwYXJhbWV0ZXJzLiBUaGUgPHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBib290bG9hZGVyIGRvZXMgbm90IG5lZWQgdG8ga25vdyBhYm91dCB0aGUNCitrZXJuZWwgb3IgY29uZmlnIGZpbGVzIGluIGFkdmFuY2UuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5TeXNsaW51eDwvc3Ryb25nPiBzdXBwb3J0cyB0aGUgbG9hZGluZyBvZiBpbml0aWFsIHJhbWRpc2tzIChpbml0cmQpIGFuZCB0aGUNCitiekltYWdlIGtlcm5lbCBmb3JtYXQuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+UGxlYXNlIG5vdGUsIHRoZSBsZGxpbnV4LnN5cyBib290IGxvYWRlciBmaWxlIGlzIGZsYWdnZWQgYXMgaW1tdXRhYmxlDQorKHdoZXJlIGFwcGxpY2FibGUpIGFuZCBpcyBtb2RpZmllZCBhZnRlciBjb3B5aW5nIGluIHRvIGhlbHAgZW5zdXJlDQorYm9vdC10aW1lIGludGVncml0eS4gIEZpbGUgc3lzdGVtcyB3aXRoIGEgc3VmZmljaWVudGx5IGxhcmdlIGJvb3QgbG9hZGVyDQorcmVzZXJ2ZWQgYXJlYSwgbGlrZSBidHJmcywgd2lsbCBoYXZlIGxkbGludXguc3lzIGluc3RhbGxlZCB0aGVyZSByYXRoZXINCit0aGFuIGFzIGEgbm9ybWFsIGZpbGUuICBQcmlvciB0byB2ZXJzaW9uIDQuMDAsIGV4dGxpbnV4IHdvdWxkIGluc3RhbGwgYQ0KK2ZpbGUgZXh0bGludXguc3lzIHdoaWNoIHZlcnNpb25zIDQuMDAgYW5kIGxhdGVyIGluc3RhbGxlcnMgd2lsbCByZXBsYWNlIHdpdGggbGRsaW51eC5zeXMuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgY2xhc3M9InNlY3QxIj4NCis8aDIgaWQ9Il9vcHRpb25zIj5PUFRJT05TPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0ic2VjdDIiPg0KKzxoMyBpZD0iX3N0YW5kYWxvbmVfb3B0aW9ucyI+U3RhbmRhbG9uZSBvcHRpb25zPC9oMz4NCis8ZGl2IGNsYXNzPSJkbGlzdCI+PGRsPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4taTwvc3Ryb25nPiwgPHN0cm9uZz4tLWluc3RhbGw8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisofjQuMDArKSBJbnN0YWxsIFNZU0xJTlVYLCByZWdhcmRsZXNzIG9mIGFuIGV4aXN0aW5nIGluc3RhbGwuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1VPC9zdHJvbmc+LCA8c3Ryb25nPi0tdXBkYXRlPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKH40LjAwKykgVXBkYXRlIGFuIGV4aXN0aW5nIFNZU0xJTlVYL0VYVExJTlVYIGluc3RhbGwuICBJZiBubyBTeXNsaW51eA0KK2Jvb3QgbG9hZGVyIGlzIHByZXNlbnQsIHJldHVybiBhbiBlcnJvci4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LWg8L3N0cm9uZz4sIDxzdHJvbmc+LS1oZWxwPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorRGlzcGxheSBoZWxwL3VzYWdlIGluZm9ybWF0aW9uLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tdjwvc3Ryb25nPiwgPHN0cm9uZz4tLXZlcnNpb248L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitEaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQgaW1tZWRpYXRlbHkuDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfcmVndWxhcl9vcHRpb25zIj5SZWd1bGFyIE9wdGlvbnM8L2gzPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1hPC9zdHJvbmc+LCA8c3Ryb25nPi0tYWN0aXZlPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKERPUy9XaW4zMi9XaW42NCBPTkxZKSBNYXJrIHRoZSBpbnN0YWxsIHRhcmdldCBmaWxlIHN5c3RlbSYjODIxNztzIHBhcnRpdGlvbg0KK2FjdGl2ZS4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LWQ8L3N0cm9uZz4sIDxzdHJvbmc+LS1kaXJlY3Rvcnk8L3N0cm9uZz4gPGVtPnN1YmRpcmVjdG9yeTwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKE5vdCBuZWNlc3NhcnkgZm9yIGV4dGxpbnV4IGFzIGl0IGlzIGltcGxpZWQgYnkgPGVtPlBBVEg8L2VtPikgSW5zdGFsbCB0aGUNCis8c3Ryb25nPlNZU0xJTlVYPC9zdHJvbmc+IGNvbnRyb2wgZmlsZXMgaW4gYSBzdWJkaXJlY3Rvcnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUNCisocmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IG9uIHRoZSBkZXZpY2UpLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tLWRldmljZTwvc3Ryb25nPiA8ZW0+REVWSUNFPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoZXh0bGludXggT05MWTsgNC4wNispIEZvcmNlIHVzZSBvZiBhIHNwZWNpZmljIGJsb2NrIGRldmljZSAoZXhwZXJ0cw0KK29ubHkpLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tZjwvc3Ryb25nPiwgPHN0cm9uZz4tLWZvcmNlPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorRm9yY2UgaW5zdGFsbCBldmVuIGlmIGl0IGFwcGVhcnMgdW5zYWZlLiAgQmVmb3JlIDQuMDAsIC1mIHdhcyB1c2VkIGZvcg0KKy0tb2Zmc2V0IGluIHRoZSBMaW51eCBpbnN0YWxsZXJzLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tSDwvc3Ryb25nPiwgPHN0cm9uZz4tLWhlYWRzPC9zdHJvbmc+IDxlbT5oZWFkLWNvdW50PC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitPdmVycmlkZSB0aGUgZGV0ZWN0ZWQgbnVtYmVyIG9mIGhlYWRzIGZvciB0aGUgZ2VvbWV0cnkuICBTZWUgYWxzbw0KKzxzdHJvbmc+LS1zZWN0b3I8L3N0cm9uZz4uDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+LW08L3N0cm9uZz4sIDxzdHJvbmc+LS1tYnI8L3N0cm9uZz46DQorKERPUy9XaW4zMi9XaW42NCBPTkxZKSBJbnN0YWxsIHRoZSByZWd1bGFyIFN5c2xpbnV4IE1CUiBjb2RlIHRvIHRoZSBNQlIuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi1NPC9zdHJvbmc+LCA8c3Ryb25nPi0tbWVudS1zYXZlPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKDQuMDArOyBBRFYpIFNldCB0aGUgbGFiZWwgdG8gc2VsZWN0IGFzIGRlZmF1bHQgb24gdGhlIG5leHQgYm9vdC4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LW88L3N0cm9uZz4sIDxzdHJvbmc+LS1vbmNlPC9zdHJvbmc+IDxlbT5jb21tYW5kPC9lbT4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoQURWKSBEZWNsYXJlIGEgYm9vdCBjb21tYW5kIHRvIGJlIHRyaWVkIG9uIHRoZSBmaXJzdCBib290IG9ubHkuICBUaGUNCit1c2Ugb2YgPHN0cm9uZz4tbzwvc3Ryb25nPiBmb3IgdGhlIExpbnV4IGluc3RhbGxlcnMgc3lzbGludXggb3Igc3lzbGludXgtbXRvb2xzIGhhcw0KK2JlZW4gZGVwcmVjYXRlZCBhcyBvZiB+NC4wMCBhbmQgaXMgbm8gbG9uZ2VyIHZhbGlkIGFzIG9mIH40LjAyLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tTzwvc3Ryb25nPiwgPHN0cm9uZz4tLWNsZWFyLW9uY2U8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCitDbGVhciB0aGUgYm9vdC1vbmNlIGNvbW1hbmQuICBTZWUgYWxzbyA8c3Ryb25nPi0tb25jZTwvc3Ryb25nPi4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LXI8L3N0cm9uZz4sIDxzdHJvbmc+LS1yYWlkPC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorKEFEVikgUkFJRCBtb2RlLiAgSWYgYm9vdCBmYWlscywgdGVsbCB0aGUgQklPUyB0byBib290IHRoZSBuZXh0IGRldmljZQ0KK2luIHRoZSBib290IHNlcXVlbmNlICh1c3VhbGx5IHRoZSBuZXh0IGhhcmQgZGlzaykgaW5zdGVhZCBvZiBzdG9wcGluZw0KK3dpdGggYW4gZXJyb3IgbWVzc2FnZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBSQUlELTEgYm9vdGluZy4NCis8L3A+DQorPC9kZD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+LS1yZXNldC1hZHY8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisoQURWKSBSZXNldCBhdXhpbGxpYXJ5IGRhdGEgdmVjdG9yLg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tUzwvc3Ryb25nPiwgPHN0cm9uZz4tLXNlY3RvcnM8L3N0cm9uZz4gPGVtPnNlY3Rvci1jb3VudDwvZW0+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorT3ZlcnJpZGUgdGhlIGRldGVjdGVkIG51bWJlciBvZiBzZWN0b3JzIGZvciB0aGUgZ2VvbWV0cnkuICBTZWUgYWxzbw0KKzxzdHJvbmc+LS1oZWFkPC9zdHJvbmc+Lg0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz4tczwvc3Ryb25nPiwgPHN0cm9uZz4tLXN0dXBpZDwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KK0luc3RhbGwgYSAic2FmZSwgc2xvdyBhbmQgc3R1cGlkIiB2ZXJzaW9uIG9mIDxzdHJvbmc+U1lTTElOVVg8L3N0cm9uZz4uIFRoaXMgdmVyc2lvbg0KK21heSB3b3JrIG9uIHNvbWUgdmVyeSBidWdneSBCSU9TZXMgb24gd2hpY2ggPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiB3b3VsZCBvdGhlcndpc2UNCitmYWlsLiBJZiB5b3UgZmluZCBhIG1hY2hpbmUgb24gd2hpY2ggdGhlIC1zIG9wdGlvbiBpcyByZXF1aXJlZCB0byBtYWtlDQoraXQgYm9vdCByZWxpYWJseSwgcGxlYXNlIHNlbmQgYXMgbXVjaCBpbmZvIGFib3V0IHlvdXIgbWFjaGluZSBhcyB5b3UNCitjYW4sIGFuZCBpbmNsdWRlIHRoZSBmYWlsdXJlIG1vZGUuDQorPC9wPg0KKzwvZGQ+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPi10PC9zdHJvbmc+LCA8c3Ryb25nPi0tb2Zmc2V0PC9zdHJvbmc+IDxlbT5vZmZzZXQ8L2VtPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyhMaW51eCBzeXNsaW51eC9zeXNsaW51eC1tdG9vbHMgT05MWSkgSW5kaWNhdGVzIHRoYXQgdGhlIGZpbGVzeXN0ZW0gaXMNCithdCBhbiBvZmZzZXQgZnJvbSB0aGUgYmFzZSBvZiB0aGUgZGV2aWNlIG9yIGZpbGUuDQorPC9wPg0KKzwvZGQ+DQorPC9kbD48L2Rpdj4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPjxzdHJvbmc+LXo8L3N0cm9uZz4sIDxzdHJvbmc+LS16aXBkcml2ZTwvc3Ryb25nPg0KK0Fzc3VtZSB6aXBkcml2ZSBnZW9tZXRyeSAoPGVtPi0taGVhZHMgNjQgLS1zZWN0b3JzIDMyPC9lbT4pLiAgU2VlIGFsc28gPHN0cm9uZz4tLWhlYWQ8L3N0cm9uZz4NCithbmQgPHN0cm9uZz4tLXNlY3Rvcjwvc3Ryb25nPi48L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2V4YW1wbGVzIj5FWEFNUExFUzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InNlY3QyIj4NCis8aDMgaWQ9Il9ib290aW5nX2RvcyI+Qm9vdGluZyBET1M8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Rm9yIGJvb3RpbmcgRE9TIGFuZCBvdGhlciBzaW1pbGFyIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVyZSBpcyBhbiBlYXN5DQorYW5kIGdlbmVyYWxseSByZWxpYWJsZSBzb2x1dGlvbiB0byBzdWJzdGl0dXRlIGluIFNZU0xJTlVYIGFzIHRoZSBwcmltYXJ5DQorYm9vdCBsb2FkZXIuPC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InVsaXN0Ij48dWw+DQorPGxpPg0KKzxwPg0KK01ha2UgYSBET1MtYm9vdGFibGUgZGlzazsgIFRoZSBmb2xsb3dpbmcgYXJlIHBvc3NpYmxlIGNvbW1hbmRzOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+Zm9ybWF0IGE6IC9zDQorc3lzIGE6PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0NvcHkgdGhlIERPUyBib290IHNlY3RvciBvZmYgdXNpbmcgTGludXggb3IgY29weWJzLmNvbToNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPmRkIGlmPS9kZXYvZmQwIG9mPWRvcy5ic3MgYnM9NTEyIGNvdW50PTENCitjb3B5YnMgYTogYTpkb3MuYnNzPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0luc3RhbGwgU1lTTElOVVggdXNpbmcgb25lIG9mOg0KKzwvcD4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+c3lzbGludXggYToNCitzeXNsaW51eCAvZGV2L2ZkMCAgICAgICAgICAgICAgIChiZWZvcmUgNC4wMCkNCitzeXNsaW51eCAtaSAvZGV2L2ZkMCAgICAgICAgICAgICg0LjAwKyk8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9saT4NCis8bGk+DQorPHA+DQorRm9yIExpbnV4LCBtb3VudCB0aGUgZGlzayBhbmQgY29weSB0aGUgZG9zLmJzcyB0byB0aGUgZGlzazoNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPm1vdW50IC10IG1zZG9zIC9kZXYvZmQwIC9tbnQNCitjcCBkb3MuYnNzIC9tbnQ8L2NvZGU+PC9wcmU+DQorPC9kaXY+PC9kaXY+DQorPC9saT4NCis8bGk+DQorPHA+DQorQ29weSBhIExpbnV4IGtlcm5lbCBpbWFnZSBhbmQgaW5pdHJkIHBheWxvYWQgZmlsZXM6DQorPC9wPg0KKzxkaXYgY2xhc3M9ImRsaXN0Ij48ZGw+DQorPGR0IGNsYXNzPSJoZGxpc3QxIj4NCis8c3Ryb25nPkxpbnV4Ojwvc3Ryb25nPg0KKzwvZHQ+DQorPGRkPg0KKzxwPg0KKyAgICAgICAgY3Agdm1saW51eCAvbW50DQorICAgICAgICBjcCBpbml0cmQuZ3ogL21udA0KKzwvcD4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5ET1MvV2luZG93czo8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8cD4NCisgICAgICAgIGNvcHkgdm1saW51eCBhOg0KKyAgICAgICAgY29weSBpbml0cmQuZ3ogYToNCis8L3A+DQorPC9kZD4NCis8L2RsPjwvZGl2Pg0KKzwvbGk+DQorPGxpPg0KKzxwPg0KK0ZvciBMaW51eCwgdW1vdW50IHRoZSBkaXNrIChpZiBhcHBsaWNhYmxlKToNCis8L3A+DQorPGRpdiBjbGFzcz0ibGl0ZXJhbGJsb2NrIj4NCis8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCis8cHJlPjxjb2RlPnVtb3VudCAvbW50PC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzwvbGk+DQorPC91bD48L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MiI+DQorPGgzIGlkPSJfbWJyIj5NQlI8L2gzPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+SW4gb3JkZXIgdG8gYm9vdCBmcm9tIGEgaGFyZCBkaXNrIChvciBoYXJkIGRpc2stbGlrZSBkZXZpY2UpIGluIEJJT1MNCittb2RlLCBhbiBhcHByb3ByaWF0ZSBNQlIgYm9vdCBibG9jayBtdXN0IGFsc28gYmUgaW5zdGFsbGVkIGluIHRoZSBNQlINCisoZmlyc3Qgc2VjdG9yIG9yIDUxMiBieXRlcyBvZiB0aGUgZGlzayksIG9jY3VweWluZyBhdCBtb3N0IDQ0MCBieXRlcy48L3A+PC9kaXY+DQorPGRpdiBjbGFzcz0iZGxpc3QiPjxkbD4NCis8ZHQgY2xhc3M9ImhkbGlzdDEiPg0KKzxzdHJvbmc+RE9TL1dpbmRvd3M6PC9zdHJvbmc+DQorPC9kdD4NCis8ZGQ+DQorPHA+DQorSWYgdXNpbmcgRkRJU0ssIEZESVNLIG9yIGEgc2ltaWxhciBhcHBsaWNhdGlvbiBtdXN0IGFsc28gYmUgdXNlZCB0byBtYXJrDQordGhlIHBhcnRpdGlvbiBhcyBhY3RpdmUuDQorPC9wPg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT4gICAgZmRpc2sgL21icg0KK09SDQorICAgIHN5c2xpbnV4IC1tYSBjOjwvY29kZT48L3ByZT4NCis8L2Rpdj48L2Rpdj4NCis8L2RkPg0KKzxkdCBjbGFzcz0iaGRsaXN0MSI+DQorPHN0cm9uZz5MaW51eDo8L3N0cm9uZz4NCis8L2R0Pg0KKzxkZD4NCis8ZGl2IGNsYXNzPSJsaXRlcmFsYmxvY2siPg0KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KKzxwcmU+PGNvZGU+ZGQgYnM9NDQwIGNvdW50PTEgY29udj1ub3RydW5jIGlmPW1ici9tYnIuYmluIG9mPS9kZXYvc2RhPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Rm9yIGFsdG1ici5iaW4sIGFuIGVhc3kgd2F5IHRvIG92ZXJ3cml0ZSB0aGUgTUJSIGJvb3QgYmxvY2sgYW5kIHNwZWNpZnkNCit0aGUgcGFydGlvbiBudW1iZXIgaXM6PC9wPjwvZGl2Pg0KKzxkaXYgY2xhc3M9ImxpdGVyYWxibG9jayI+DQorPGRpdiBjbGFzcz0iY29udGVudCI+DQorPHByZT48Y29kZT5wcmludGYgJ1wxJyB8IGNhdCBhbHRtYnIuYmluIC0gfCBkZCBicz00NDAgY291bnQ9MSBcDQorICBpZmxhZz1mdWxsYmxvY2sgY29udj1ub3RydW5jIG9mPS9kZXYvc2RhPC9jb2RlPjwvcHJlPg0KKzwvZGl2PjwvZGl2Pg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+Tm90ZTogdXNpbmcgPGVtPmNhdDwvZW0+IGZvciB3cml0aW5nIHRoZSBNQlIgY2FuIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyBjYXVzZQ0KK2RhdGEgbG9zcyBvciBvdmVyd3JpdHRpbmcuICBGb3IgdGhpcyByZWFzb24sIHVzaW5nIDxlbT5kZDwvZW0+IGlzIHJlY29tbWVuZGVkDQorZm9yIGFsbCBzaXR1YXRpb25zLjwvcD48L2Rpdj4NCis8L2RkPg0KKzwvZGw+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX3NlZV9hbHNvIj5TRUUgQUxTTzwvaDI+DQorPGRpdiBjbGFzcz0ic2VjdGlvbmJvZHkiPg0KKzxkaXYgY2xhc3M9InBhcmFncmFwaCI+PHA+PHN0cm9uZz5zeXNsaW51eC5jZmc8L3N0cm9uZz4oNSksIDxzdHJvbmc+c3lzbGludXgtY2xpPC9zdHJvbmc+KDEpLCA8c3Ryb25nPmxpbG88L3N0cm9uZz4oOCksIDxzdHJvbmc+a2V5dGFiLWxpbG8ucGw8L3N0cm9uZz4oOCksDQorPHN0cm9uZz5mZGlzazwvc3Ryb25nPig4KSwgPHN0cm9uZz5ta2ZzPC9zdHJvbmc+KDgpLCA8c3Ryb25nPnN1cGVyZm9ybWF0PC9zdHJvbmc+KDEpLjwvcD48L2Rpdj4NCis8L2Rpdj4NCis8L2Rpdj4NCis8ZGl2IGNsYXNzPSJzZWN0MSI+DQorPGgyIGlkPSJfYXV0aG9yIj5BVVRIT1I8L2gyPg0KKzxkaXYgY2xhc3M9InNlY3Rpb25ib2R5Ij4NCis8ZGl2IGNsYXNzPSJwYXJhZ3JhcGgiPjxwPlRoaXMgQXNjaWlEb2MgZGVyaXZlZCBkb2N1bWVudCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsDQorPHN0cm9uZz5TWVNMSU5VWDwvc3Ryb25nPiBkb2N1bWVudGF0aW9uIGJ5IEguIFBldGVyIEFudmluICZsdDs8YSBocmVmPSJtYWlsdG86aHBhQHp5dG9yLmNvbSI+aHBhQHp5dG9yLmNvbTwvYT4mZ3Q7LiBUaGUgY29udmVyc2lvbiB0bw0KK2EgbWFucGFnZSB3YXMgbWFkZSBieSBBcnRodXIgS29ybiAmbHQ7PGEgaHJlZj0ibWFpbHRvOmFydGh1ckBrb3JuLmNoIj5hcnRodXJAa29ybi5jaDwvYT4mZ3Q7LiAgVGhlIGNvbnZlcnNpb24gdG8NCithbiBBc2NpaURvYyB3YXMgbWFkZSBieSBHZW5lIEN1bW0gJmx0OzxhIGhyZWY9Im1haWx0bzpnZW5lLmN1bW1AZ21haWwuY29tIj5nZW5lLmN1bW1AZ21haWwuY29tPC9hPiZndDs8L3A+PC9kaXY+DQorPC9kaXY+DQorPC9kaXY+DQorPGRpdiBjbGFzcz0ic2VjdDEiPg0KKzxoMiBpZD0iX2NvcHlyaWdodCI+Q09QWVJJR0hUPC9oMj4NCis8ZGl2IGNsYXNzPSJzZWN0aW9uYm9keSI+DQorPGRpdiBjbGFzcz0icGFyYWdyYXBoIj48cD5Db3B5cmlnaHQgKEMpIDE5OTQtMjAxMiBILiBQZXRlciBBbnZpbi4gRnJlZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkDQordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdmVyc2lvbiAyDQorKEdQTHYyKSAob3IsIGF0IHlvdXIgb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbikuPC9wPjwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzwvZGl2Pg0KKzxkaXYgaWQ9ImZvb3Rub3RlcyI+PGhyIC8+PC9kaXY+DQorPGRpdiBpZD0iZm9vdGVyIj4NCis8ZGl2IGlkPSJmb290ZXItdGV4dCI+DQorTGFzdCB1cGRhdGVkIDIwMTQtMDEtMTcgMTY6MDk6NTYgUFNUDQorPC9kaXY+DQorPC9kaXY+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9lZmk2NC92ZXJzaW9uLmdlbiBiL2VmaTY0L3ZlcnNpb24uZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYTZkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9lZmk2NC92ZXJzaW9uLmdlbgpAQCAtMCwwICsxLDYgQEAKKyVkZWZpbmUgVkVSU0lPTiA2LjAzCislZGVmaW5lIFZFUlNJT05fU1RSICI2LjAzIgorJWRlZmluZSBWRVJTSU9OX01BSk9SIDYKKyVkZWZpbmUgVkVSU0lPTl9NSU5PUiAzCislZGVmaW5lIFlFQVIgMjAxNAorJWRlZmluZSBZRUFSX1NUUiAiMjAxNCIKZGlmZiAtLWdpdCBhL2VmaTY0L3ZlcnNpb24uaCBiL2VmaTY0L3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjE5Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZWZpNjQvdmVyc2lvbi5oCkBAIC0wLDAgKzEsNiBAQAorI2RlZmluZSBWRVJTSU9OIDYuMDMKKyNkZWZpbmUgVkVSU0lPTl9TVFIgIjYuMDMiCisjZGVmaW5lIFZFUlNJT05fTUFKT1IgNgorI2RlZmluZSBWRVJTSU9OX01JTk9SIDMKKyNkZWZpbmUgWUVBUiAyMDE0CisjZGVmaW5lIFlFQVJfU1RSICIyMDE0IgpkaWZmIC0tZ2l0IGEvZXh0bGludXgvTWFrZWZpbGUgYi9leHRsaW51eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQxZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0bGludXgvTWFrZWZpbGUKQEAgLTAsMCArMSw2NyBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMjIExpbnV4IHZmYXQsIG50ZnMsIGV4dDIvZXh0My9leHQ0IGFuZCBidHJmcyBpbnN0YWxsZXIKKyMjCisKK2luY2x1ZGUgJChNQUtFRElSKS9zeXNsaW51eC5taworCitPUFRGTEFHUyA9IC1nIC1PcworSU5DTFVERVMgPSAtSSQoU1JDKSAtSSQob2JqZGlyKSAtSSQoU1JDKS8uLi9saWJpbnN0YWxsZXIKK0NGTEFHUwkgPSAkKEdDQ1dBUk4pIC1Xbm8tc2lnbi1jb21wYXJlIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgXAorCSAgICQoT1BURkxBR1MpICQoSU5DTFVERVMpCitMREZMQUdTCSA9IAorCitTUkNTICAgICA9IG1haW4uYyBcCisJICAgbW91bnRpbmZvLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9zeXNseG1vZC5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvc3lzbHhvcHQuYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL3N5c2x4Y29tLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9zZXRhZHYuYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL2FkdmlvLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9ib290c2VjdF9iaW4uYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL2xkbGludXhjMzJfYmluLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9sZGxpbnV4X2Jpbi5jCitPQkpTCSA9ICQocGF0c3Vic3QgJS5jLCUubywkKG5vdGRpciAkKFNSQ1MpKSkKKworLlNVRkZJWEVTOiAuYyAubyAuaSAucyAuUworCitWUEFUSCA9ICQoU1JDKTokKFNSQykvLi4vbGliaW5zdGFsbGVyOiQoT0JKKS8uLi9saWJpbnN0YWxsZXIKKworYWxsOiBpbnN0YWxsZXIKKwordGlkeSBkaXN0OgorCS1ybSAtZiAqLm8gKi5pICoucyAqLmEgLiouZCAqLnRtcAorCitjbGVhbjogdGlkeQorCS1ybSAtZiBleHRsaW51eAorCitzcG90bGVzczogY2xlYW4KKwktcm0gLWYgKn4KKworaW5zdGFsbGVyOiBleHRsaW51eAorCitleHRsaW51eDogJChPQkpTKQorCSQoQ0MpICQoTERGTEFHUykgLW8gJEAgJF4KKworc3RyaXA6CisJJChTVFJJUCkgZXh0bGludXgKKworJS5vOiAlLmMKKwkkKENDKSAkKFVNQUtFREVQUykgJChDRkxBR1MpIC1jIC1vICRAICQ8CislLmk6ICUuYworCSQoQ0MpICQoVU1BS0VERVBTKSAkKENGTEFHUykgLUUgLW8gJEAgJDwKKyUuczogJS5jCisJJChDQykgJChVTUFLRURFUFMpICQoQ0ZMQUdTKSAtUyAtbyAkQCAkPAorCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS9leHRsaW51eC9idHJmcy5oIGIvZXh0bGludXgvYnRyZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ExMGJlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0bGludXgvYnRyZnMuaApAQCAtMCwwICsxLDE5MSBAQAorI2lmbmRlZiBfQlRSRlNfSF8KKyNkZWZpbmUgX0JUUkZTX0hfCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIEJUUkZTX1NVUEVSX01BR0lDIDB4OTEyMzY4M0UKKyNkZWZpbmUgQlRSRlNfU1VQRVJfSU5GT19PRkZTRVQgKDY0ICogMTAyNCkKKyNkZWZpbmUgQlRSRlNfU1VQRVJfSU5GT19TSVpFIDQwOTYKKyNkZWZpbmUgQlRSRlNfTUFHSUMgIl9CSFJmU19NIgorI2RlZmluZSBCVFJGU19NQUdJQ19MIDgKKyNkZWZpbmUgQlRSRlNfQ1NVTV9TSVpFIDMyCisjZGVmaW5lIEJUUkZTX0ZTSURfU0laRSAxNgorI2RlZmluZSBCVFJGU19VVUlEX1NJWkUgMTYKKworLyogRml4ZWQgYXJlYXMgcmVzZXJ2ZWQgZm9yIHRoZSBib290IGxvYWRlciAqLworI2RlZmluZSBCVFJGU19CT09UX0FSRUFfQV9PRkZTRVQJMAorI2RlZmluZSBCVFJGU19CT09UX0FSRUFfQV9TSVpFCQlCVFJGU19TVVBFUl9JTkZPX09GRlNFVAorI2RlZmluZSBCVFJGU19CT09UX0FSRUFfQl9PRkZTRVQJKDI1NiAqIDEwMjQpCisjZGVmaW5lIEJUUkZTX0JPT1RfQVJFQV9CX1NJWkUJCSgoMTAyNC0yNTYpICogMTAyNCkKKwordHlwZWRlZiBfX3U2NCB1NjQ7Cit0eXBlZGVmIF9fdTMyIHUzMjsKK3R5cGVkZWYgX191MTYgdTE2OwordHlwZWRlZiBfX3U4IHU4OwordHlwZWRlZiB1NjQgX19sZTY0OwordHlwZWRlZiB1MTYgX19sZTE2OworCisjZGVmaW5lIEJUUkZTX1JPT1RfQkFDS1JFRl9LRVkgIDE0NAorI2RlZmluZSBCVFJGU19ST09UX1RSRUVfRElSX09CSkVDVElEIDZVTEwKKyNkZWZpbmUgQlRSRlNfRElSX0lURU1fS0VZICAgICAgODQKKworLyoKKyAqICAqIHRoaXMgaXMgdXNlZCBmb3IgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZCByb290IHJlZnMKKyAqICAgKi8KK3N0cnVjdCBidHJmc19yb290X3JlZiB7CisgICAgICAgIF9fbGU2NCBkaXJpZDsKKyAgICAgICAgX19sZTY0IHNlcXVlbmNlOworICAgICAgICBfX2xlMTYgbmFtZV9sZW47Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19kaXNrX2tleSB7CisgICAgICAgIF9fbGU2NCBvYmplY3RpZDsKKyAgICAgICAgdTggdHlwZTsKKyAgICAgICAgX19sZTY0IG9mZnNldDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX2Rpcl9pdGVtIHsKKyAgICAgICAgc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGxvY2F0aW9uOworICAgICAgICBfX2xlNjQgdHJhbnNpZDsKKyAgICAgICAgX19sZTE2IGRhdGFfbGVuOworICAgICAgICBfX2xlMTYgbmFtZV9sZW47CisgICAgICAgIHU4IHR5cGU7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19zdXBlcl9ibG9jayB7CisgICAgICAgIHVpbnQ4X3QgY3N1bVszMl07CisgICAgICAgIHVpbnQ4X3QgZnNpZFsxNl07CisgICAgICAgIHVpbnQ2NF90IGJ5dGVucjsKKyAgICAgICAgdWludDY0X3QgZmxhZ3M7CisgICAgICAgIHVpbnQ4X3QgbWFnaWNbOF07CisgICAgICAgIHVpbnQ2NF90IGdlbmVyYXRpb247CisgICAgICAgIHVpbnQ2NF90IHJvb3Q7CisgICAgICAgIHVpbnQ2NF90IGNodW5rX3Jvb3Q7CisgICAgICAgIHVpbnQ2NF90IGxvZ19yb290OworICAgICAgICB1aW50NjRfdCBsb2dfcm9vdF90cmFuc2lkOworICAgICAgICB1aW50NjRfdCB0b3RhbF9ieXRlczsKKyAgICAgICAgdWludDY0X3QgYnl0ZXNfdXNlZDsKKyAgICAgICAgdWludDY0X3Qgcm9vdF9kaXJfb2JqZWN0aWQ7CisgICAgICAgIHVpbnQ2NF90IG51bV9kZXZpY2VzOworICAgICAgICB1aW50MzJfdCBzZWN0b3JzaXplOworICAgICAgICB1aW50MzJfdCBub2Rlc2l6ZTsKKyAgICAgICAgdWludDMyX3QgbGVhZnNpemU7CisgICAgICAgIHVpbnQzMl90IHN0cmlwZXNpemU7CisgICAgICAgIHVpbnQzMl90IHN5c19jaHVua19hcnJheV9zaXplOworICAgICAgICB1aW50NjRfdCBjaHVua19yb290X2dlbmVyYXRpb247CisgICAgICAgIHVpbnQ2NF90IGNvbXBhdF9mbGFnczsKKyAgICAgICAgdWludDY0X3QgY29tcGF0X3JvX2ZsYWdzOworICAgICAgICB1aW50NjRfdCBpbmNvbXBhdF9mbGFnczsKKyAgICAgICAgdWludDE2X3QgY3N1bV90eXBlOworICAgICAgICB1aW50OF90IHJvb3RfbGV2ZWw7CisgICAgICAgIHVpbnQ4X3QgY2h1bmtfcm9vdF9sZXZlbDsKKyAgICAgICAgdWludDhfdCBsb2dfcm9vdF9sZXZlbDsKKyAgICAgICAgc3RydWN0IGJ0cmZzX2Rldl9pdGVtIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBkZXZpZDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB0b3RhbF9ieXRlczsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBieXRlc191c2VkOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGlvX2FsaWduOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGlvX3dpZHRoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlY3Rvcl9zaXplOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHR5cGU7CisgICAgICAgICAgICAgICAgdWludDY0X3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBzdGFydF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2X2dyb3VwOworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Vla19zcGVlZDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJhbmR3aWR0aDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHV1aWRbMTZdOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZnNpZFsxNl07CisgICAgICAgIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBkZXZfaXRlbTsKKyAgICAgICAgdWludDhfdCBsYWJlbFsyNTZdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisjZGVmaW5lIEJUUkZTX0lPQ1RMX01BR0lDIDB4OTQKKyNkZWZpbmUgQlRSRlNfVk9MX05BTUVfTUFYIDI1NQorI2RlZmluZSBCVFJGU19QQVRIX05BTUVfTUFYIDQwODcKKworc3RydWN0IGJ0cmZzX2lvY3RsX3ZvbF9hcmdzIHsKKwlfX3M2NCBmZDsKKwljaGFyIG5hbWVbQlRSRlNfUEFUSF9OQU1FX01BWCArIDFdOworfTsKKworc3RydWN0IGJ0cmZzX2lvY3RsX3NlYXJjaF9rZXkgeworCS8qIHdoaWNoIHJvb3QgYXJlIHdlIHNlYXJjaGluZy4gIDAgaXMgdGhlIHRyZWUgb2YgdHJlZSByb290cyAqLworCV9fdTY0IHRyZWVfaWQ7CisKKwkvKiBrZXlzIHJldHVybmVkIHdpbGwgYmUgPj0gbWluIGFuZCA8PSBtYXggKi8KKwlfX3U2NCBtaW5fb2JqZWN0aWQ7CisJX191NjQgbWF4X29iamVjdGlkOworCisJLyoga2V5cyByZXR1cm5lZCB3aWxsIGJlID49IG1pbiBhbmQgPD0gbWF4ICovCisJX191NjQgbWluX29mZnNldDsKKwlfX3U2NCBtYXhfb2Zmc2V0OworCisJLyogbWF4IGFuZCBtaW4gdHJhbnNpZHMgdG8gc2VhcmNoIGZvciAqLworCV9fdTY0IG1pbl90cmFuc2lkOworCV9fdTY0IG1heF90cmFuc2lkOworCisJLyoga2V5cyByZXR1cm5lZCB3aWxsIGJlID49IG1pbiBhbmQgPD0gbWF4ICovCisJX191MzIgbWluX3R5cGU7CisJX191MzIgbWF4X3R5cGU7CisKKwkvKgorCSAqIGhvdyBtYW55IGl0ZW1zIGRpZCB1c2VybGFuZCBhc2sgZm9yLCBhbmQgaG93IG1hbnkgYXJlIHdlCisJICogcmV0dXJuaW5nCisJICovCisJX191MzIgbnJfaXRlbXM7CisKKwkvKiBhbGlnbiB0byA2NCBiaXRzICovCisJX191MzIgdW51c2VkOworCisJLyogc29tZSBleHRyYSBmb3IgbGF0ZXIgKi8KKwlfX3U2NCB1bnVzZWQxOworCV9fdTY0IHVudXNlZDI7CisJX191NjQgdW51c2VkMzsKKwlfX3U2NCB1bnVzZWQ0OworfTsKKworc3RydWN0IGJ0cmZzX2lvY3RsX3NlYXJjaF9oZWFkZXIgeworCV9fdTY0IHRyYW5zaWQ7CisJX191NjQgb2JqZWN0aWQ7CisJX191NjQgb2Zmc2V0OworCV9fdTMyIHR5cGU7CisJX191MzIgbGVuOworfSBfX2F0dHJpYnV0ZV9fKChtYXlfYWxpYXMpKTsKKworI2RlZmluZSBCVFJGU19ERVZJQ0VfUEFUSF9OQU1FX01BWCAxMDI0CitzdHJ1Y3QgYnRyZnNfaW9jdGxfZGV2X2luZm9fYXJncyB7CisJX191NjQgZGV2aWQ7CQkJCS8qIGluL291dCAqLworCV9fdTggdXVpZFtCVFJGU19VVUlEX1NJWkVdOwkJLyogaW4vb3V0ICovCisJX191NjQgYnl0ZXNfdXNlZDsJCQkvKiBvdXQgKi8KKwlfX3U2NCB0b3RhbF9ieXRlczsJCQkvKiBvdXQgKi8KKwlfX3U2NCB1bnVzZWRbMzc5XTsJCQkvKiBwYWQgdG8gNGsgKi8KKwlfX3U4IHBhdGhbQlRSRlNfREVWSUNFX1BBVEhfTkFNRV9NQVhdOwkvKiBvdXQgKi8KK307CisKK3N0cnVjdCBidHJmc19pb2N0bF9mc19pbmZvX2FyZ3MgeworCV9fdTY0IG1heF9pZDsJCQkJLyogb3V0ICovCisJX191NjQgbnVtX2RldmljZXM7CQkJLyogb3V0ICovCisJX191OCBmc2lkW0JUUkZTX0ZTSURfU0laRV07CQkvKiBvdXQgKi8KKwlfX3U2NCByZXNlcnZlZFsxMjRdOwkJCS8qIHBhZCB0byAxayAqLworfTsKKworI2RlZmluZSBCVFJGU19TRUFSQ0hfQVJHU19CVUZTSVpFICg0MDk2IC0gc2l6ZW9mKHN0cnVjdCBidHJmc19pb2N0bF9zZWFyY2hfa2V5KSkKKy8qCisgKiB0aGUgYnVmIGlzIGFuIGFycmF5IG9mIHNlYXJjaCBoZWFkZXJzIHdoZXJlCisgKiBlYWNoIGhlYWRlciBpcyBmb2xsb3dlZCBieSB0aGUgYWN0dWFsIGl0ZW0KKyAqIHRoZSB0eXBlIGZpZWxkIGlzIGV4cGFuZGVkIHRvIDMyIGJpdHMgZm9yIGFsaWdubWVudAorICovCitzdHJ1Y3QgYnRyZnNfaW9jdGxfc2VhcmNoX2FyZ3MgeworCXN0cnVjdCBidHJmc19pb2N0bF9zZWFyY2hfa2V5IGtleTsKKwljaGFyIGJ1ZltCVFJGU19TRUFSQ0hfQVJHU19CVUZTSVpFXTsKK307CisKKyNkZWZpbmUgQlRSRlNfSU9DX1RSRUVfU0VBUkNIIF9JT1dSKEJUUkZTX0lPQ1RMX01BR0lDLCAxNywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfc2VhcmNoX2FyZ3MpCisjZGVmaW5lIEJUUkZTX0lPQ19ERVZfSU5GTyBfSU9XUihCVFJGU19JT0NUTF9NQUdJQywgMzAsIFwKKwkJCQkgc3RydWN0IGJ0cmZzX2lvY3RsX2Rldl9pbmZvX2FyZ3MpCisjZGVmaW5lIEJUUkZTX0lPQ19GU19JTkZPIF9JT1IoQlRSRlNfSU9DVExfTUFHSUMsIDMxLCBcCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX2lvY3RsX2ZzX2luZm9fYXJncykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHRsaW51eC9mYXQuaCBiL2V4dGxpbnV4L2ZhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTM0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRsaW51eC9mYXQuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX0hfRkFUXworI2RlZmluZSBfSF9GQVRfCisKKyNkZWZpbmUgTVNET1NfU1VQRVJfTUFHSUMgICAgICAgMHg0ZDQ0ICAgICAgICAgIC8qIE1EICovCisvKiBUaGUgcmVzdCBpcyBkZWZpbmVkIGluIHN5c2x4aW50LmggKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHRsaW51eC9tYWluLmMgYi9leHRsaW51eC9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3NDBiZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGxpbnV4L21haW4uYwpAQCAtMCwwICsxLDE1NDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk4LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTQgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZXh0bGludXguYworICoKKyAqIEluc3RhbGwgdGhlIHN5c2xpbnV4IGJvb3QgYmxvY2sgb24gYW4gZmF0LCBudGZzLCBleHQyLzMvNCwgYnRyZnMsIHhmcywKKyAqIGFuZCB1ZnMxLzIgZmlsZXN5c3RlbS4KKyAqLworCisjZGVmaW5lICBfR05VX1NPVVJDRQkJLyogRW5hYmxlIGV2ZXJ5dGhpbmcgKi8KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorLyogVGhpcyBpcyBuZWVkZWQgdG8gZGVhbCB3aXRoIHRoZSBrZXJuZWwgaGVhZGVycyBpbXBvcnRlZCBpbnRvIGdsaWJjIDMuMy4zLiAqLworI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2lmbmRlZiBfX0tMSUJDX18KKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzeXNleGl0cy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCisjaW5jbHVkZSAibGludXhpb2N0bC5oIgorCisjaW5jbHVkZSAiYnRyZnMuaCIKKyNpbmNsdWRlICJmYXQuaCIKKyNpbmNsdWRlICJudGZzLmgiCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAidWZzLmgiCisjaW5jbHVkZSAidWZzX2ZzLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJzeXNseGludC5oIgorI2luY2x1ZGUgInN5c2x4Y29tLmgiIC8qIGNvbW1vbiBmdW5jdGlvbnMgc2hhcmVkIHdpdGggZXh0bGludXggYW5kIHN5c2xpbnV4ICovCisjaW5jbHVkZSAic3lzbHhmcy5oIgorI2luY2x1ZGUgInNldGFkdi5oIgorI2luY2x1ZGUgInN5c2x4b3B0LmgiIC8qIHVuaWZpZWQgb3B0aW9ucyAqLworI2luY2x1ZGUgIm1vdW50aW5mby5oIgorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIGRwcmludGYgcHJpbnRmCisjZWxzZQorIyBkZWZpbmUgZHByaW50ZiguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKyNpZm5kZWYgRVhUMl9TVVBFUl9PRkZTRVQKKyNkZWZpbmUgRVhUMl9TVVBFUl9PRkZTRVQgMTAyNAorI2VuZGlmCisKKy8qIFNpbmNlIHdlIGhhdmUgdW51c2VkIDIwNDggYnl0ZXMgaW4gdGhlIHByaW1hcnkgQUcgb2YgYW4gWEZTIHBhcnRpdGlvbiwKKyAqIHdlIHdpbGwgdXNlIHRoZSBmaXJzdCAwfjUxMiBieXRlcyBzdGFydGluZyBmcm9tIDIwNDggZm9yIHRoZSBTeXNsaW51eAorICogYm9vdCBzZWN0b3IuCisgKi8KKyNkZWZpbmUgWEZTX0JPT1RTRUNUX09GRlNFVAkoNCA8PCBTRUNUT1JfU0hJRlQpCisjZGVmaW5lIFhGU19TVVBQT1JURURfQkxPQ0tTSVpFIDQwOTYgLyogNCBLaUIgZmlsZXN5c3RlbSBibG9jayBzaXplICovCisKKy8qCisgKiBidHJmcyBoYXMgdHdvIGRpc2NvbnRpZ3VvdXMgYXJlYXMgcmVzZXJ2ZWQgZm9yIHRoZSBib290IGxvYWRlci4KKyAqIFVzZSB0aGUgZmlyc3Qgb25lIChCb290IEFyZWEgQSkgZm9yIHRoZSBib290IHNlY3RvciBhbmQgdGhlIEFEViwKKyAqIGFuZCB0aGUgc2Vjb25kIG9uZSBmb3IgImxkbGludXguc3lzIi4KKyAqLworI2RlZmluZSBCVFJGU19FWFRMSU5VWF9PRkZTRVQJQlRSRlNfQk9PVF9BUkVBX0JfT0ZGU0VUCisjZGVmaW5lIEJUUkZTX0VYVExJTlVYX1NJWkUJQlRSRlNfQk9PVF9BUkVBX0JfU0laRQorI2RlZmluZSBCVFJGU19TVUJWT0xfTUFYIDI1NgkvKiBCeSBidHJmcyBzcGVjaWZpY2F0aW9uICovCitzdGF0aWMgY2hhciBzdWJ2b2xbQlRSRlNfU1VCVk9MX01BWF07CisKKyNkZWZpbmUgQlRSRlNfQURWX09GRlNFVCAoQlRSRlNfQk9PVF9BUkVBX0FfT0ZGU0VUICsgQlRSRlNfQk9PVF9BUkVBX0FfU0laRSBcCisJCQkgIC0gMipBRFZfU0laRSkKKworLyoKKyAqIEdldCB0aGUgc2l6ZSBvZiBhIGJsb2NrIGRldmljZQorICovCitzdGF0aWMgdWludDY0X3QgZ2V0X3NpemUoaW50IGRldmZkKQoreworICAgIHVpbnQ2NF90IGJ5dGVzOworICAgIHVpbnQzMl90IHNlY3RzOworICAgIHN0cnVjdCBzdGF0IHN0OworCisjaWZkZWYgQkxLR0VUU0laRTY0CisgICAgaWYgKCFpb2N0bChkZXZmZCwgQkxLR0VUU0laRTY0LCAmYnl0ZXMpKQorCXJldHVybiBieXRlczsKKyNlbmRpZgorICAgIGlmICghaW9jdGwoZGV2ZmQsIEJMS0dFVFNJWkUsICZzZWN0cykpCisJcmV0dXJuICh1aW50NjRfdCkgc2VjdHMgPDwgOTsKKyAgICBlbHNlIGlmICghZnN0YXQoZGV2ZmQsICZzdCkgJiYgc3Quc3Rfc2l6ZSkKKwlyZXR1cm4gc3Quc3Rfc2l6ZTsKKyAgICBlbHNlCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgZGV2aWNlIGdlb21ldHJ5IGFuZCBwYXJ0aXRpb24gb2Zmc2V0CisgKi8KK3N0cnVjdCBnZW9tZXRyeV90YWJsZSB7CisgICAgdWludDY0X3QgYnl0ZXM7CisgICAgc3RydWN0IGhkX2dlb21ldHJ5IGc7Cit9OworCitzdGF0aWMgaW50IHN5c2ZzX2dldF9vZmZzZXQoaW50IGRldmZkLCB1bnNpZ25lZCBsb25nICpzdGFydCkKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBjaGFyIHN5c2ZzX25hbWVbMTI4XTsKKyAgICBGSUxFICpmOworICAgIGludCBydjsKKworICAgIGlmIChmc3RhdChkZXZmZCwgJnN0KSkKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAoKHNpemVfdClzbnByaW50ZihzeXNmc19uYW1lLCBzaXplb2Ygc3lzZnNfbmFtZSwKKwkJCSAiL3N5cy9kZXYvYmxvY2svJXU6JXUvc3RhcnQiLAorCQkJIG1ham9yKHN0LnN0X3JkZXYpLCBtaW5vcihzdC5zdF9yZGV2KSkKKwk+PSBzaXplb2Ygc3lzZnNfbmFtZSkKKwlyZXR1cm4gLTE7CisKKyAgICBmID0gZm9wZW4oc3lzZnNfbmFtZSwgInIiKTsKKyAgICBpZiAoIWYpCisJcmV0dXJuIC0xOworCisgICAgcnYgPSBmc2NhbmYoZiwgIiVsdSIsIHN0YXJ0KTsKKyAgICBmY2xvc2UoZik7CisKKyAgICByZXR1cm4gKHJ2ID09IDEpID8gMCA6IC0xOworfQorCisvKiBTdGFuZGFyZCBmbG9wcHkgZGlzayBnZW9tZXRyaWVzLCBwbHVzIExTLTEyMC4gIFppcGRpc2sgZ2VvbWV0cnkKKyAgICh4LzY0LzMyKSBpcyB0aGUgZmluYWwgZmFsbGJhY2suICBJIGRvbid0IGtub3cgd2hhdCBMUy0yNDAgaGFzCisgICBhcyBpdHMgZ2VvbWV0cnksIHNpbmNlIEkgZG9uJ3QgaGF2ZSBvbmUgYW5kIGRvbid0IGtub3cgYW55b25lIHRoYXQgZG9lcywKKyAgIGFuZCBHb29nbGUgd2Fzbid0IGhlbHBmdWwuLi4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VvbWV0cnlfdGFibGUgc3RhbmRhcmRfZ2VvbWV0cmllc1tdID0geworICAgIHszNjAgKiAxMDI0LCB7MiwgOSwgNDAsIDB9fSwKKyAgICB7NzIwICogMTAyNCwgezIsIDksIDgwLCAwfX0sCisgICAgezEyMDAgKiAxMDI0LCB7MiwgMTUsIDgwLCAwfX0sCisgICAgezE0NDAgKiAxMDI0LCB7MiwgMTgsIDgwLCAwfX0sCisgICAgezE2ODAgKiAxMDI0LCB7MiwgMjEsIDgwLCAwfX0sCisgICAgezE3MjIgKiAxMDI0LCB7MiwgMjEsIDgwLCAwfX0sCisgICAgezI4ODAgKiAxMDI0LCB7MiwgMzYsIDgwLCAwfX0sCisgICAgezM4NDAgKiAxMDI0LCB7MiwgNDgsIDgwLCAwfX0sCisgICAgezEyMzI2NCAqIDEwMjQsIHs4LCAzMiwgOTYzLCAwfX0sCS8qIExTMTIwICovCisgICAgezAsIHswLCAwLCAwLCAwfX0KK307CisKK2ludCBnZXRfZ2VvbWV0cnkoaW50IGRldmZkLCB1aW50NjRfdCB0b3RhbGJ5dGVzLCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKK3sKKyAgICBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCBmZF9zdHI7CisgICAgc3RydWN0IGxvb3BfaW5mbyBsaTsKKyAgICBzdHJ1Y3QgbG9vcF9pbmZvNjQgbGk2NDsKKyAgICBjb25zdCBzdHJ1Y3QgZ2VvbWV0cnlfdGFibGUgKmdwOworICAgIGludCBydiA9IDA7CisKKyAgICBtZW1zZXQoZ2VvLCAwLCBzaXplb2YgKmdlbyk7CisKKyAgICBpZiAoIWlvY3RsKGRldmZkLCBIRElPX0dFVEdFTywgZ2VvKSkgeworCWdvdG8gb2s7CisgICAgfSBlbHNlIGlmICghaW9jdGwoZGV2ZmQsIEZER0VUUFJNLCAmZmRfc3RyKSkgeworCWdlby0+aGVhZHMgPSBmZF9zdHIuaGVhZDsKKwlnZW8tPnNlY3RvcnMgPSBmZF9zdHIuc2VjdDsKKwlnZW8tPmN5bGluZGVycyA9IGZkX3N0ci50cmFjazsKKwlnZW8tPnN0YXJ0ID0gMDsKKwlnb3RvIG9rOworICAgIH0KKworICAgIC8qIERpZG4ndCB3b3JrLiAgTGV0J3Mgc2VlIGlmIHRoaXMgaXMgb25lIG9mIHRoZSBzdGFuZGFyZCBnZW9tZXRyaWVzICovCisgICAgZm9yIChncCA9IHN0YW5kYXJkX2dlb21ldHJpZXM7IGdwLT5ieXRlczsgZ3ArKykgeworCWlmIChncC0+Ynl0ZXMgPT0gdG90YWxieXRlcykgeworCSAgICBtZW1jcHkoZ2VvLCAmZ3AtPmcsIHNpemVvZiAqZ2VvKTsKKwkgICAgZ290byBvazsKKwl9CisgICAgfQorCisgICAgLyogRGlkbid0IHdvcmsgZWl0aGVyLi4uIGFzc2lnbiBhIGdlb21ldHJ5IG9mIDY0IGhlYWRzLCAzMiBzZWN0b3JzOyB0aGlzIGlzCisgICAgICAgd2hhdCB6aXBkaXNrcyB1c2UsIHNvIHRoaXMgd291bGQgaGVscCBpZiBzb21lb25lIGhhcyBhIFVTQiBrZXkgdGhhdAorICAgICAgIHRoZXkncmUgYm9vdGluZyBpbiBVU0ItWklQIG1vZGUuICovCisKKyAgICBnZW8tPmhlYWRzID0gb3B0LmhlYWRzID8gOiA2NDsKKyAgICBnZW8tPnNlY3RvcnMgPSBvcHQuc2VjdG9ycyA/IDogMzI7CisgICAgZ2VvLT5jeWxpbmRlcnMgPSB0b3RhbGJ5dGVzIC8gKGdlby0+aGVhZHMgKiBnZW8tPnNlY3RvcnMgPDwgU0VDVE9SX1NISUZUKTsKKyAgICBnZW8tPnN0YXJ0ID0gMDsKKworICAgIGlmICghb3B0LnNlY3RvcnMgJiYgIW9wdC5oZWFkcykgeworCWZwcmludGYoc3RkZXJyLAorCQkiV2FybmluZzogdW5hYmxlIHRvIG9idGFpbiBkZXZpY2UgZ2VvbWV0cnkgKGRlZmF1bHRpbmcgdG8gJWQgaGVhZHMsICVkIHNlY3RvcnMpXG4iCisJCSIgICAgICAgICAob24gaGFyZCBkaXNrcywgdGhpcyBpcyB1c3VhbGx5IGhhcm1sZXNzLilcbiIsCisJCWdlby0+aGVhZHMsIGdlby0+c2VjdG9ycyk7CisJcnYgPSAxOwkJCS8qIFN1Ym9wdGltYWwgcmVzdWx0ICovCisgICAgfQorCitvazoKKyAgICAvKiBJZiB0aGlzIGlzIGEgbG9vcGJhY2sgZGV2aWNlLCB0cnkgdG8gc2V0IHRoZSBzdGFydCAqLworICAgIGlmICghaW9jdGwoZGV2ZmQsIExPT1BfR0VUX1NUQVRVUzY0LCAmbGk2NCkpCisJZ2VvLT5zdGFydCA9IGxpNjQubG9fb2Zmc2V0ID4+IFNFQ1RPUl9TSElGVDsKKyAgICBlbHNlIGlmICghaW9jdGwoZGV2ZmQsIExPT1BfR0VUX1NUQVRVUywgJmxpKSkKKwlnZW8tPnN0YXJ0ID0gKHVuc2lnbmVkIGludClsaS5sb19vZmZzZXQgPj4gU0VDVE9SX1NISUZUOworICAgIGVsc2UgaWYgKCFzeXNmc19nZXRfb2Zmc2V0KGRldmZkLCAmZ2VvLT5zdGFydCkpIHsKKwkvKiBPSyAqLworICAgIH0KKworICAgIHJldHVybiBydjsKK30KKworLyoKKyAqIFF1ZXJ5IHRoZSBkZXZpY2UgZ2VvbWV0cnkgYW5kIHB1dCBpdCBpbnRvIHRoZSBib290IHNlY3Rvci4KKyAqIE1hcCB0aGUgZmlsZSBhbmQgcHV0IHRoZSBtYXAgaW4gdGhlIGJvb3Qgc2VjdG9yIGFuZCBmaWxlLgorICogU3RpY2sgdGhlICJjdXJyZW50IGRpcmVjdG9yeSIgaW5vZGUgbnVtYmVyIGludG8gdGhlIGZpbGUuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1vZGlmaWVkIGJ5dGVzIGluIHRoZSBib290IGZpbGUuCisgKi8KK3N0YXRpYyBpbnQgcGF0Y2hfZmlsZV9hbmRfYm9vdGJsb2NrKGludCBmZCwgY29uc3QgY2hhciAqZGlyLCBpbnQgZGV2ZmQpCit7CisgICAgc3RydWN0IHN0YXQgZGlyc3QsIHhkc3Q7CisgICAgc3RydWN0IGhkX2dlb21ldHJ5IGdlbzsKKyAgICBzZWN0b3JfdCAqc2VjdHA7CisgICAgdWludDY0X3QgdG90YWxieXRlcywgdG90YWxzZWN0b3JzOworICAgIGludCBuc2VjdDsKKyAgICBzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yICpzYnM7CisgICAgY2hhciAqZGlycGF0aCwgKnN1YnBhdGgsICp4ZGlycGF0aDsKKyAgICBpbnQgcnY7CisKKyAgICBkaXJwYXRoID0gcmVhbHBhdGgoZGlyLCBOVUxMKTsKKyAgICBpZiAoIWRpcnBhdGggfHwgc3RhdChkaXIsICZkaXJzdCkpIHsKKwlwZXJyb3IoImFjY2Vzc2luZyBpbnN0YWxsIGRpcmVjdG9yeSIpOworCWV4aXQoMjU1KTsJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworICAgIH0KKworICAgIGlmIChsc3RhdChkaXJwYXRoLCAmeGRzdCkgfHwKKwlkaXJzdC5zdF9pbm8gIT0geGRzdC5zdF9pbm8gfHwKKwlkaXJzdC5zdF9kZXYgIT0geGRzdC5zdF9kZXYpIHsKKwlwZXJyb3IoInJlYWxwYXRoIHJldHVybmVkIG5vbnNlbnNlIik7CisJZXhpdCgyNTUpOworICAgIH0KKworICAgIHN1YnBhdGggPSBzdHJjaHIoZGlycGF0aCwgJ1wwJyk7CisgICAgZm9yICg7OykgeworCWlmICgqc3VicGF0aCA9PSAnLycpIHsKKwkgICAgaWYgKHN1YnBhdGggPiBkaXJwYXRoKSB7CisJCSpzdWJwYXRoID0gJ1wwJzsKKwkJeGRpcnBhdGggPSBkaXJwYXRoOworCSAgICB9IGVsc2UgeworCQl4ZGlycGF0aCA9ICIvIjsKKwkgICAgfQorCSAgICBpZiAobHN0YXQoeGRpcnBhdGgsICZ4ZHN0KSB8fCBkaXJzdC5zdF9kZXYgIT0geGRzdC5zdF9kZXYpIHsKKwkJc3VicGF0aCA9IHN0cmNocihzdWJwYXRoKzEsICcvJyk7CisJCWlmICghc3VicGF0aCkKKwkJICAgIHN1YnBhdGggPSAiLyI7IC8qIEl0J3MgdGhlIHJvb3Qgb2YgdGhlIGZpbGVzeXN0ZW0gKi8KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgKnN1YnBhdGggPSAnLyc7CisJfQorCisJaWYgKHN1YnBhdGggPT0gZGlycGF0aCkKKwkgICAgYnJlYWs7CisKKwlzdWJwYXRoLS07CisgICAgfQorCisgICAgLyogTm93IHN1YnBhdGggc2hvdWxkIGNvbnRhaW4gdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGZzIGJhc2UgKi8KKyAgICBkcHJpbnRmKCJzdWJwYXRoID0gJXNcbiIsIHN1YnBhdGgpOworCisgICAgdG90YWxieXRlcyA9IGdldF9zaXplKGRldmZkKTsKKyAgICBnZXRfZ2VvbWV0cnkoZGV2ZmQsIHRvdGFsYnl0ZXMsICZnZW8pOworCisgICAgaWYgKG9wdC5oZWFkcykKKwlnZW8uaGVhZHMgPSBvcHQuaGVhZHM7CisgICAgaWYgKG9wdC5zZWN0b3JzKQorCWdlby5zZWN0b3JzID0gb3B0LnNlY3RvcnM7CisKKyAgICAvKiBQYXRjaCB0aGlzIGludG8gYSBmYWtlIEZBVCBzdXBlcmJsb2NrLiAgVGhpcyBpc24ndCBiZWNhdXNlCisgICAgICAgRkFUIGlzIGEgZ29vZCBmb3JtYXQgaW4gYW55IHdheSwgaXQncyBiZWNhdXNlIGl0IGxldHMgdGhlCisgICAgICAgZWFybHkgYm9vdHN0cmFwIHNoYXJlIGNvZGUgd2l0aCB0aGUgRkFUIHZlcnNpb24uICovCisgICAgZHByaW50ZigiaGVhZHMgPSAldSwgc2VjdCA9ICV1XG4iLCBnZW8uaGVhZHMsIGdlby5zZWN0b3JzKTsKKworICAgIHNicyA9IChzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yICopc3lzbGludXhfYm9vdHNlY3Q7CisKKyAgICB0b3RhbHNlY3RvcnMgPSB0b3RhbGJ5dGVzID4+IFNFQ1RPUl9TSElGVDsKKyAgICBpZiAodG90YWxzZWN0b3JzID49IDY1NTM2KSB7CisJc2V0XzE2KCZzYnMtPmJzU2VjdG9ycywgMCk7CisgICAgfSBlbHNlIHsKKwlzZXRfMTYoJnNicy0+YnNTZWN0b3JzLCB0b3RhbHNlY3RvcnMpOworICAgIH0KKyAgICBzZXRfMzIoJnNicy0+YnNIdWdlU2VjdG9ycywgdG90YWxzZWN0b3JzKTsKKworICAgIHNldF8xNigmc2JzLT5ic0J5dGVzUGVyU2VjLCBTRUNUT1JfU0laRSk7CisgICAgc2V0XzE2KCZzYnMtPmJzU2VjUGVyVHJhY2ssIGdlby5zZWN0b3JzKTsKKyAgICBzZXRfMTYoJnNicy0+YnNIZWFkcywgZ2VvLmhlYWRzKTsKKyAgICBzZXRfMzIoJnNicy0+YnNIaWRkZW5TZWNzLCBnZW8uc3RhcnQpOworCisgICAgLyogQ29uc3RydWN0IHRoZSBib290IGZpbGUgbWFwICovCisKKyAgICBkcHJpbnRmKCJkaXJlY3RvcnkgaW5vZGUgPSAlbHVcbiIsICh1bnNpZ25lZCBsb25nKWRpcnN0LnN0X2lubyk7CisgICAgbnNlY3QgPSAoYm9vdF9pbWFnZV9sZW4gKyBTRUNUT1JfU0laRSAtIDEpID4+IFNFQ1RPUl9TSElGVDsKKyAgICBuc2VjdCArPSAyOwkJCS8qIFR3byBzZWN0b3JzIGZvciB0aGUgQURWICovCisgICAgc2VjdHAgPSBhbGxvY2Eoc2l6ZW9mKHNlY3Rvcl90KSAqIG5zZWN0KTsKKyAgICBpZiAoZnNfdHlwZSA9PSBFWFQyIHx8IGZzX3R5cGUgPT0gVkZBVCB8fCBmc190eXBlID09IE5URlMgfHwKKwlmc190eXBlID09IFhGUyB8fCBmc190eXBlID09IFVGUzEgfHwgZnNfdHlwZSA9PSBVRlMyKSB7CisJaWYgKHNlY3RtYXAoZmQsIHNlY3RwLCBuc2VjdCkpIHsKKwkJcGVycm9yKCJibWFwIik7CisJCWV4aXQoMSk7CisJfQorICAgIH0gZWxzZSBpZiAoZnNfdHlwZSA9PSBCVFJGUykgeworCWludCBpOworCXNlY3Rvcl90ICpzcCA9IHNlY3RwOworCisJZm9yIChpID0gMDsgaSA8IG5zZWN0IC0gMjsgaSsrKQorCSAgICAqc3ArKyA9IEJUUkZTX0VYVExJTlVYX09GRlNFVC9TRUNUT1JfU0laRSArIGk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkgICAgKnNwKysgPSBCVFJGU19BRFZfT0ZGU0VUL1NFQ1RPUl9TSVpFICsgaTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgdGhlIG1vZGlmaWVkIGltYWdlIGluIG1lbW9yeSAqLworICAgIHJ2ID0gc3lzbGludXhfcGF0Y2goc2VjdHAsIG5zZWN0LCBvcHQuc3R1cGlkX21vZGUsCisJCQlvcHQucmFpZF9tb2RlLCBzdWJwYXRoLCBzdWJ2b2wpOworCisgICAgZnJlZShkaXJwYXRoKTsKKyAgICByZXR1cm4gcnY7Cit9CisKKy8qCisgKiBJbnN0YWxsIHRoZSBib290IGJsb2NrIG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorICogTXVzdCBiZSBydW4gQUZURVIgaW5zdGFsbF9maWxlKCkhCisgKi8KK2ludCBpbnN0YWxsX2Jvb3RibG9jayhpbnQgZmQsIGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKyAgICBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayBzYjsKKyAgICBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgc2IyOworICAgIHN0cnVjdCBmYXRfYm9vdF9zZWN0b3Igc2IzOworICAgIHN0cnVjdCBudGZzX2Jvb3Rfc2VjdG9yIHNiNDsKKyAgICB4ZnNfc2JfdCBzYjU7CisgICAgc3RydWN0IHVmc19zdXBlcl9ibG9jayBzYjY7CisgICAgYm9vbCBvayA9IGZhbHNlOworCisgICAgaWYgKGZzX3R5cGUgPT0gRVhUMikgeworCWlmICh4cHJlYWQoZmQsICZzYiwgc2l6ZW9mIHNiLCBFWFQyX1NVUEVSX09GRlNFVCkgIT0gc2l6ZW9mIHNiKSB7CisJCXBlcnJvcigicmVhZGluZyBzdXBlcmJsb2NrIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChzYi5zX21hZ2ljID09IEVYVDJfU1VQRVJfTUFHSUMpCisJCW9rID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGZzX3R5cGUgPT0gQlRSRlMpIHsKKwlpZiAoeHByZWFkKGZkLCAmc2IyLCBzaXplb2Ygc2IyLCBCVFJGU19TVVBFUl9JTkZPX09GRlNFVCkKKwkJCSE9IHNpemVvZiBzYjIpIHsKKwkJcGVycm9yKCJyZWFkaW5nIHN1cGVyYmxvY2siKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICghbWVtY21wKHNiMi5tYWdpYywgQlRSRlNfTUFHSUMsIEJUUkZTX01BR0lDX0wpKQorCQlvayA9IHRydWU7CisgICAgfSBlbHNlIGlmIChmc190eXBlID09IFZGQVQpIHsKKwlpZiAoeHByZWFkKGZkLCAmc2IzLCBzaXplb2Ygc2IzLCAwKSAhPSBzaXplb2Ygc2IzKSB7CisJCXBlcnJvcigicmVhZGluZyBmYXQgc3VwZXJibG9jayIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZmF0X2NoZWNrX3NiX2ZpZWxkcygmc2IzKSkKKwkJb2sgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoZnNfdHlwZSA9PSBOVEZTKSB7CisgICAgICAgIGlmICh4cHJlYWQoZmQsICZzYjQsIHNpemVvZihzYjQpLCAwKSAhPSBzaXplb2Yoc2I0KSkgeworICAgICAgICAgICAgcGVycm9yKCJyZWFkaW5nIG50ZnMgc3VwZXJibG9jayIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnRmc19jaGVja19zYl9maWVsZHMoJnNiNCkpCisgICAgICAgICAgICAgb2sgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoZnNfdHlwZSA9PSBYRlMpIHsKKwlpZiAoeHByZWFkKGZkLCAmc2I1LCBzaXplb2Ygc2I1LCAwKSAhPSBzaXplb2Ygc2I1KSB7CisJICAgIHBlcnJvcigicmVhZGluZyB4ZnMgc3VwZXJibG9jayIpOworCSAgICByZXR1cm4gMTsKKwl9CisKKwlpZiAoc2I1LnNiX21hZ2ljbnVtID09ICoodTMyICopWEZTX1NCX01BR0lDKSB7CisJICAgIGlmIChiZTMyX3RvX2NwdShzYjUuc2JfYmxvY2tzaXplKSAhPSBYRlNfU1VQUE9SVEVEX0JMT0NLU0laRSkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJZb3UgbmVlZCB0byBoYXZlIDQgS2lCIGZpbGVzeXN0ZW0gYmxvY2sgc2l6ZSBmb3IgIgorCQkJIiBiZWluZyBhYmxlIHRvIGluc3RhbGwgU3lzbGludXggaW4geW91ciBYRlMgIgorCQkJInBhcnRpdGlvbiAoYmVjYXVzZSB0aGVyZSBpcyBubyBlbm91Z2ggc3BhY2UgaW4gTUJSIHRvICIKKwkJCSJkZXRlcm1pbmUgd2hlcmUgU3lzbGludXggYm9vdHNlY3RvciBjYW4gYmUgaW5zdGFsbGVkICIKKwkJCSJyZWdhcmRsZXNzIHRoZSBmaWxlc3lzdGVtIGJsb2NrIHNpemUpXG4iKTsKKwkJcmV0dXJuIDE7CisJICAgIH0KKworCSAgICBvayA9IHRydWU7CisJfQorICAgIH0gZWxzZSBpZiAoZnNfdHlwZSA9PSBVRlMxIHx8IGZzX3R5cGUgPT0gVUZTMikgeworCXVpbnQzMl90IHNibG9ja19vZmYgPSAoZnNfdHlwZSA9PSBVRlMxKSA/CisJICAgIFNCTE9DS19VRlMxIDogU0JMT0NLX1VGUzI7CisJdWludDMyX3QgdWZzX3NtYWdpYyA9IChmc190eXBlID09IFVGUzEpID8KKwkgICAgVUZTMV9TVVBFUl9NQUdJQyA6IFVGUzJfU1VQRVJfTUFHSUM7CisKKwlpZiAoeHByZWFkKGZkLCAmc2I2LCBzaXplb2Ygc2I2LCBzYmxvY2tfb2ZmKSAhPSBzaXplb2Ygc2I2KSB7CisJCXBlcnJvcigicmVhZGluZyBzdXBlcmJsb2NrIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChzYjYuZnNfbWFnaWMgPT0gdWZzX3NtYWdpYykKKwkJb2sgPSB0cnVlOworICAgIH0KKworICAgIGlmICghb2spIHsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIm5vIGZhdCwgbnRmcywgZXh0Mi8zLzQsIGJ0cmZzLCB4ZnMgIgorCQkib3IgdWZzMS8yIHN1cGVyYmxvY2sgZm91bmQgb24gJXNcbiIsCisJCWRldmljZSk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGZzX3R5cGUgPT0gVkZBVCkgeworCXN0cnVjdCBmYXRfYm9vdF9zZWN0b3IgKnNicyA9IChzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yICopc3lzbGludXhfYm9vdHNlY3Q7CisgICAgICAgIGlmICh4cHdyaXRlKGZkLCAmc2JzLT5GQVRfYnNIZWFkLCBGQVRfYnNIZWFkTGVuLCAwKSAhPSBGQVRfYnNIZWFkTGVuIHx8CisJICAgIHhwd3JpdGUoZmQsICZzYnMtPkZBVF9ic0NvZGUsIEZBVF9ic0NvZGVMZW4sCisJCSAgICBvZmZzZXRvZihzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yLCBGQVRfYnNDb2RlKSkgIT0gRkFUX2JzQ29kZUxlbikgeworCSAgICBwZXJyb3IoIndyaXRpbmcgZmF0IGJvb3RibG9jayIpOworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfSBlbHNlIGlmIChmc190eXBlID09IE5URlMpIHsKKyAgICAgICAgc3RydWN0IG50ZnNfYm9vdF9zZWN0b3IgKnNicyA9CisgICAgICAgICAgICAgICAgKHN0cnVjdCBudGZzX2Jvb3Rfc2VjdG9yICopc3lzbGludXhfYm9vdHNlY3Q7CisgICAgICAgIGlmICh4cHdyaXRlKGZkLCAmc2JzLT5OVEZTX2JzSGVhZCwKKyAgICAgICAgICAgICAgICAgICAgTlRGU19ic0hlYWRMZW4sIDApICE9IE5URlNfYnNIZWFkTGVuIHx8CisgICAgICAgICAgICAgICAgICAgIHhwd3JpdGUoZmQsICZzYnMtPk5URlNfYnNDb2RlLCBOVEZTX2JzQ29kZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IG50ZnNfYm9vdF9zZWN0b3IsCisgICAgICAgICAgICAgICAgICAgIE5URlNfYnNDb2RlKSkgIT0gTlRGU19ic0NvZGVMZW4pIHsKKyAgICAgICAgICAgIHBlcnJvcigid3JpdGluZyBudGZzIGJvb3RibG9jayIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZzX3R5cGUgPT0gWEZTKSB7CisJaWYgKHhwd3JpdGUoZmQsIHN5c2xpbnV4X2Jvb3RzZWN0LCBzeXNsaW51eF9ib290c2VjdF9sZW4sCisJCSAgICBYRlNfQk9PVFNFQ1RfT0ZGU0VUKSAhPSBzeXNsaW51eF9ib290c2VjdF9sZW4pIHsKKwkgICAgcGVycm9yKCJ3cml0aW5nIHhmcyBib290YmxvY2siKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0gZWxzZSB7CisJaWYgKHhwd3JpdGUoZmQsIHN5c2xpbnV4X2Jvb3RzZWN0LCBzeXNsaW51eF9ib290c2VjdF9sZW4sIDApCisJICAgICE9IHN5c2xpbnV4X2Jvb3RzZWN0X2xlbikgeworCSAgICBwZXJyb3IoIndyaXRpbmcgYm9vdGJsb2NrIik7CisJICAgIHJldHVybiAxOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXdyaXRlX2Jvb3RfaW1hZ2UoaW50IGRldmZkLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBpbnQgZmQ7CisgICAgaW50IHJldDsKKyAgICBpbnQgbW9kYnl0ZXM7CisKKyAgICAvKiBMZXQncyBjcmVhdGUgTERMSU5VWC5TWVMgZmlsZSBhZ2FpbiAoaWYgaXQgYWxyZWFkeSBleGlzdHMsIG9mIGNvdXJzZSkgKi8KKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsICBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NSRUFUIHwgT19TWU5DLAorCSAgICAgIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgaWYgKGZkIDwgMCkgeworCXBlcnJvcihmaWxlbmFtZSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFdyaXRlIGJvb3QgaW1hZ2UgZGF0YSBpbnRvIExETElOVVguU1lTIGZpbGUgKi8KKyAgICByZXQgPSB4cHdyaXRlKGZkLCAoY29uc3QgY2hhciBfZm9yY2UgKilib290X2ltYWdlLCBib290X2ltYWdlX2xlbiwgMCk7CisgICAgaWYgKHJldCAhPSBib290X2ltYWdlX2xlbikgeworCXBlcnJvcigid3JpdGluZyBib290YmxvY2siKTsKKwlnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIFdyaXRlIEFEViAqLworICAgIHJldCA9IHhwd3JpdGUoZmQsIHN5c2xpbnV4X2FkdiwgMiAqIEFEVl9TSVpFLCBib290X2ltYWdlX2xlbik7CisgICAgaWYgKHJldCAhPSAyICogQURWX1NJWkUpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3cml0ZSBmYWlsdXJlIG9uICVzXG4iLCBwcm9ncmFtLCBmaWxlbmFtZSk7CisJZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBNYXAgdGhlIGZpbGUsIGFuZCBwYXRjaCB0aGUgaW5pdGlhbCBzZWN0b3IgYWNjb3JkaW5nbHkgKi8KKyAgICBtb2RieXRlcyA9IHBhdGNoX2ZpbGVfYW5kX2Jvb3RibG9jayhmZCwgcGF0aCwgZGV2ZmQpOworCisgICAgLyogV3JpdGUgdGhlIHBhdGNoIGFyZWEgYWdhaW4gLSB0aGlzIHJlbGllcyBvbiB0aGUgZmlsZSBiZWluZyBvdmVyd3JpdHRlbgorICAgICAqIGluIHBsYWNlISAqLworICAgIHJldCA9IHhwd3JpdGUoZmQsIChjb25zdCBjaGFyIF9mb3JjZSAqKWJvb3RfaW1hZ2UsIG1vZGJ5dGVzLCAwKTsKKyAgICBpZiAocmV0ICE9IG1vZGJ5dGVzKSB7CisJZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZmFpbHVyZSBvbiAlc1xuIiwgcHJvZ3JhbSwgZmlsZW5hbWUpOworCWdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0dXJuIGZkOworCitlcnJvcjoKKyAgICBjbG9zZShmZCk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBleHQyX2ZhdF9pbnN0YWxsX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgaW50IGRldmZkLCBzdHJ1Y3Qgc3RhdCAqcnN0KQoreworICAgIGNoYXIgKmZpbGUsICpvbGRmaWxlLCAqYzMyZmlsZTsKKyAgICBpbnQgZmQgPSAtMSwgZGlyZmQgPSAtMTsKKyAgICBpbnQgcjEsIHIyLCByMzsKKworICAgIHIxID0gYXNwcmludGYoJmZpbGUsICIlcyVzbGRsaW51eC5zeXMiLAorCQkgIHBhdGgsIHBhdGhbMF0gJiYgcGF0aFtzdHJsZW4ocGF0aCkgLSAxXSA9PSAnLycgPyAiIiA6ICIvIik7CisgICAgcjIgPSBhc3ByaW50Zigmb2xkZmlsZSwgIiVzJXNleHRsaW51eC5zeXMiLAorCQkgIHBhdGgsIHBhdGhbMF0gJiYgcGF0aFtzdHJsZW4ocGF0aCkgLSAxXSA9PSAnLycgPyAiIiA6ICIvIik7CisgICAgcjMgPSBhc3ByaW50ZigmYzMyZmlsZSwgIiVzJXNsZGxpbnV4LmMzMiIsCisJCSAgcGF0aCwgcGF0aFswXSAmJiBwYXRoW3N0cmxlbihwYXRoKSAtIDFdID09ICcvJyA/ICIiIDogIi8iKTsKKyAgICBpZiAocjEgPCAwIHx8ICFmaWxlIHx8IHIyIDwgMCB8fCAhb2xkZmlsZSB8fCByMyA8IDAgfHwgIWMzMmZpbGUpIHsKKwlwZXJyb3IocHJvZ3JhbSk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgZGlyZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkpOworICAgIGlmIChkaXJmZCA8IDApIHsKKwlwZXJyb3IocGF0aCk7CisJZ290byBiYWlsOworICAgIH0KKworICAgIGZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgeworCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkgICAgcGVycm9yKGZpbGUpOworCSAgICBnb3RvIGJhaWw7CisJfQorICAgIH0gZWxzZSB7CisJY2xlYXJfYXR0cmlidXRlcyhmZCk7CisgICAgfQorICAgIGNsb3NlKGZkKTsKKworICAgIGZkID0gcmV3cml0ZV9ib290X2ltYWdlKGRldmZkLCBwYXRoLCBmaWxlKTsKKyAgICBpZiAoZmQgPCAwKQorCWdvdG8gYmFpbDsKKworICAgIC8qIEF0dGVtcHQgdG8gc2V0IGltbXV0YWJsZSBmbGFnIGFuZCByZW1vdmUgYWxsIHdyaXRlIGFjY2VzcyAqLworICAgIC8qIE9ubHkgc2V0IGltbXV0YWJsZSBmbGFnIGlmIGZpbGUgaXMgb3duZWQgYnkgcm9vdCAqLworICAgIHNldF9hdHRyaWJ1dGVzKGZkKTsKKworICAgIGlmIChmc3RhdChmZCwgcnN0KSkgeworCXBlcnJvcihmaWxlKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgY2xvc2UoZGlyZmQpOworICAgIGNsb3NlKGZkKTsKKworICAgIC8qIExvb2sgaWYgd2UgaGF2ZSB0aGUgb2xkIGZpbGVuYW1lICovCisgICAgZmQgPSBvcGVuKG9sZGZpbGUsIE9fUkRPTkxZKTsKKyAgICBpZiAoZmQgPj0gMCkgeworCWNsZWFyX2F0dHJpYnV0ZXMoZmQpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsob2xkZmlsZSk7CisgICAgfQorCisgICAgZmQgPSBvcGVuKGMzMmZpbGUsIE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQ1JFQVQgfCBPX1NZTkMsCisJICAgICAgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKyAgICBpZiAoZmQgPCAwKSB7CisJcGVycm9yKGMzMmZpbGUpOworCWdvdG8gYmFpbDsKKyAgICB9CisKKyAgICByMyA9IHhwd3JpdGUoZmQsIChjb25zdCBjaGFyIF9mb3JjZSAqKXN5c2xpbnV4X2xkbGludXhjMzIsCisJCSBzeXNsaW51eF9sZGxpbnV4YzMyX2xlbiwgMCk7CisgICAgaWYgKHIzICE9IHN5c2xpbnV4X2xkbGludXhjMzJfbGVuKSB7CisJZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZmFpbHVyZSBvbiAlc1xuIiwgcHJvZ3JhbSwgYzMyZmlsZSk7CisJZ290byBiYWlsOworICAgIH0KKworICAgIGZyZWUoZmlsZSk7CisgICAgZnJlZShvbGRmaWxlKTsKKyAgICBmcmVlKGMzMmZpbGUpOworICAgIHJldHVybiAwOworCitiYWlsOgorICAgIGlmIChkaXJmZCA+PSAwKQorCWNsb3NlKGRpcmZkKTsKKyAgICBpZiAoZmQgPj0gMCkKKwljbG9zZShmZCk7CisKKyAgICBmcmVlKGZpbGUpOworICAgIGZyZWUob2xkZmlsZSk7CisgICAgZnJlZShjMzJmaWxlKTsKKyAgICByZXR1cm4gMTsKK30KKworLyogYnRyZnMgaGFzIHRvIGluc3RhbGwgdGhlIGxkbGludXguc3lzIGluIHRoZSBmaXJzdCA2NEsgYmxhbmsgYXJlYSwgd2hpY2gKKyAgIGlzIG5vdCBtYW5hZ2VyZWQgYnkgYnRyZnMgdHJlZSwgc28gYWN0dWFsbHkgdGhpcyBpcyBub3QgaW5zdGFsbGVkIGFzIGZpbGVzLgorICAgc2luY2UgdGhlIGNvdyBmZWF0dXJlIG9mIGJ0cmZzIHdpbGwgbW92ZSB0aGUgbGRsaW51eC5zeXMgZXZlcnkgd2hlcmUgKi8KK2ludCBidHJmc19pbnN0YWxsX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgaW50IGRldmZkLCBzdHJ1Y3Qgc3RhdCAqcnN0KQoreworICAgIGNoYXIgKmZpbGU7CisgICAgaW50IGZkLCBydjsKKworICAgIHBhdGNoX2ZpbGVfYW5kX2Jvb3RibG9jaygtMSwgcGF0aCwgZGV2ZmQpOworICAgIGlmICh4cHdyaXRlKGRldmZkLCAoY29uc3QgY2hhciBfZm9yY2UgKilib290X2ltYWdlLAorCQlib290X2ltYWdlX2xlbiwgQlRSRlNfRVhUTElOVVhfT0ZGU0VUKQorCQkhPSBib290X2ltYWdlX2xlbikgeworCXBlcnJvcigid3JpdGluZyBib290YmxvY2siKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZHByaW50Zigid3JpdGUgYm9vdF9pbWFnZSB0byAweCV4XG4iLCBCVFJGU19FWFRMSU5VWF9PRkZTRVQpOworICAgIGlmICh4cHdyaXRlKGRldmZkLCBzeXNsaW51eF9hZHYsIDIgKiBBRFZfU0laRSwgQlRSRlNfQURWX09GRlNFVCkKKwkhPSAyICogQURWX1NJWkUpIHsKKwlwZXJyb3IoIndyaXRpbmcgYWR2Iik7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGRwcmludGYoIndyaXRlIGFkdiB0byAweCV4XG4iLCBCVFJGU19BRFZfT0ZGU0VUKTsKKyAgICBpZiAoc3RhdChwYXRoLCByc3QpKSB7CisJcGVycm9yKHBhdGgpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qCisgICAgICogTm90ZSB0aGF0IHdlICpjYW4qIGluc3RhbGwgbGRpbnV4LmMzMiBhcyBhIHJlZ3VsYXIgZmlsZSBiZWNhdXNlCisgICAgICogaXQgZG9lc24ndCBuZWVkIHRvIGJlIHdpdGhpbiB0aGUgZmlyc3QgNjRLLiBUaGUgU3lzbGludXggY29yZQorICAgICAqIGhhcyBlbm91Z2ggc21hcnRzIHRvIHNlYXJjaCB0aGUgYnRyZnMgZGlycyBhbmQgZmluZCB0aGlzIGZpbGUuCisgICAgICovCisgICAgcnYgPSBhc3ByaW50ZigmZmlsZSwgIiVzJXNsZGxpbnV4LmMzMiIsCisJCSAgcGF0aCwgcGF0aFswXSAmJiBwYXRoW3N0cmxlbihwYXRoKSAtIDFdID09ICcvJyA/ICIiIDogIi8iKTsKKyAgICBpZiAocnYgPCAwIHx8ICFmaWxlKSB7CisJcGVycm9yKHByb2dyYW0pOworCXJldHVybiAxOworICAgIH0KKworICAgIGZkID0gb3BlbihmaWxlLCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NSRUFUIHwgT19TWU5DLAorCSAgICAgIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgaWYgKGZkIDwgMCkgeworCXBlcnJvcihmaWxlKTsKKwlmcmVlKGZpbGUpOworCXJldHVybiAxOworICAgIH0KKworICAgIHJ2ID0geHB3cml0ZShmZCwgKGNvbnN0IGNoYXIgX2ZvcmNlICopc3lzbGludXhfbGRsaW51eGMzMiwKKwkJIHN5c2xpbnV4X2xkbGludXhjMzJfbGVuLCAwKTsKKyAgICBpZiAocnYgIT0gKGludClzeXNsaW51eF9sZGxpbnV4YzMyX2xlbikgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IHdyaXRlIGZhaWx1cmUgb24gJXNcbiIsIHByb2dyYW0sIGZpbGUpOworCXJ2ID0gMTsKKyAgICB9IGVsc2UKKwlydiA9IDA7CisKKyAgICBjbG9zZShmZCk7CisgICAgZnJlZShmaWxlKTsKKyAgICByZXR1cm4gcnY7Cit9CisKKy8qCisgKiBEdWUgdG8gaGlzdG9yaWNhbCByZWFzb25zIChTR0kgSVJJWCdzIGRlc2lnbiBvZiBkaXNrIGxheW91dHMpLCB0aGUgZmlyc3QKKyAqIHNlY3RvciBpbiB0aGUgcHJpbWFyeSBBRyBvbiBYRlMgZmlsZXN5c3RlbXMgY29udGFpbnMgdGhlIHN1cGVyYmxvY2ssIHdoaWNoIGlzCisgKiBhIHByb2JsZW0gd2l0aCBib290bG9hZGVycyB0aGF0IHJlbHkgb24gQklPU2VzICh0aGF0IGxvYWQgVkJScyB3aGljaCBhcmUKKyAqIChsb2NhdGVkIGluIHRoZSBmaXJzdCBzZWN0b3Igb2YgdGhlIHBhcnRpdGlvbikuCisgKgorICogVGh1cywgd2UgbmVlZCB0byBoYW5kbGUgdGhpcyBpc3N1ZSwgb3RoZXJ3aXNlIFN5c2xpbnV4IHdpbGwgZGFtYWdlIHRoZSBYRlMncworICogc3VwZXJibG9jay4KKyAqLworc3RhdGljIGludCB4ZnNfaW5zdGFsbF9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIGludCBkZXZmZCwgc3RydWN0IHN0YXQgKnJzdCkKK3sKKyAgICBzdGF0aWMgY2hhciBmaWxlW1BBVEhfTUFYICsgMV07CisgICAgc3RhdGljIGNoYXIgYzMyZmlsZVtQQVRIX01BWCArIDFdOworICAgIGludCBkaXJmZCA9IC0xOworICAgIGludCBmZCA9IC0xOworICAgIGludCByZXR2YWw7CisKKyAgICBzbnByaW50ZihmaWxlLCBQQVRIX01BWCArIDEsICIlcyVzbGRsaW51eC5zeXMiLCBwYXRoLAorCSAgICAgcGF0aFswXSAmJiBwYXRoW3N0cmxlbihwYXRoKSAtIDFdID09ICcvJyA/ICIiIDogIi8iKTsKKyAgICBzbnByaW50ZihjMzJmaWxlLCBQQVRIX01BWCArIDEsICIlcyVzbGRsaW51eC5jMzIiLCBwYXRoLAorCSAgICAgcGF0aFswXSAmJiBwYXRoW3N0cmxlbihwYXRoKSAtIDFdID09ICcvJyA/ICIiIDogIi8iKTsKKworICAgIGRpcmZkID0gb3BlbihwYXRoLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTsKKyAgICBpZiAoZGlyZmQgPCAwKSB7CisJcGVycm9yKHBhdGgpOworCWdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOworICAgIGlmIChmZCA8IDApIHsKKwlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJICAgIHBlcnJvcihmaWxlKTsKKwkgICAgZ290byBiYWlsOworCX0KKyAgICB9IGVsc2UgeworCWNsZWFyX2F0dHJpYnV0ZXMoZmQpOworICAgIH0KKworICAgIGNsb3NlKGZkKTsKKworICAgIGZkID0gcmV3cml0ZV9ib290X2ltYWdlKGRldmZkLCBwYXRoLCBmaWxlKTsKKyAgICBpZiAoZmQgPCAwKQorCWdvdG8gYmFpbDsKKworICAgIC8qIEF0dGVtcHQgdG8gc2V0IGltbXV0YWJsZSBmbGFnIGFuZCByZW1vdmUgYWxsIHdyaXRlIGFjY2VzcyAqLworICAgIC8qIE9ubHkgc2V0IGltbXV0YWJsZSBmbGFnIGlmIGZpbGUgaXMgb3duZWQgYnkgcm9vdCAqLworICAgIHNldF9hdHRyaWJ1dGVzKGZkKTsKKworICAgIGlmIChmc3RhdChmZCwgcnN0KSkgeworCXBlcnJvcihmaWxlKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgY2xvc2UoZGlyZmQpOworICAgIGNsb3NlKGZkKTsKKworICAgIGRpcmZkID0gLTE7CisgICAgZmQgPSAtMTsKKworICAgIGZkID0gb3BlbihjMzJmaWxlLCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NSRUFUIHwgT19TWU5DLAorCSAgICAgIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgaWYgKGZkIDwgMCkgeworCXBlcnJvcihjMzJmaWxlKTsKKwlnb3RvIGJhaWw7CisgICAgfQorCisgICAgcmV0dmFsID0geHB3cml0ZShmZCwgKGNvbnN0IGNoYXIgX2ZvcmNlICopc3lzbGludXhfbGRsaW51eGMzMiwKKwkJICAgICBzeXNsaW51eF9sZGxpbnV4YzMyX2xlbiwgMCk7CisgICAgaWYgKHJldHZhbCAhPSAoaW50KXN5c2xpbnV4X2xkbGludXhjMzJfbGVuKSB7CisJZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZmFpbHVyZSBvbiAlc1xuIiwgcHJvZ3JhbSwgZmlsZSk7CisJZ290byBiYWlsOworICAgIH0KKworICAgIGNsb3NlKGZkKTsKKworICAgIHN5bmMoKTsKKworICAgIHJldHVybiAwOworCitiYWlsOgorICAgIGlmIChkaXJmZCA+PSAwKQorCWNsb3NlKGRpcmZkKTsKKworICAgIGlmIChmZCA+PSAwKQorCWNsb3NlKGZkKTsKKworICAgIHJldHVybiAxOworfQorCisvKgorICogICogdGVzdCBpZiBwYXRoIGlzIGEgc3Vidm9sdW1lOgorICogICAqIHRoaXMgZnVuY3Rpb24gcmV0dXJuCisgKiAgICAqIDAtPiBwYXRoIGV4aXN0cyBidXQgaXQgaXMgbm90IGEgc3Vidm9sdW1lCisgKiAgICAgKiAxLT4gcGF0aCBleGlzdHMgYW5kIGl0IGlzICBhIHN1YnZvbHVtZQorICogICAgICAqIC0xIC0+IHBhdGggaXMgdW5hY2Nlc3NpYmxlCisgKiAgICAgICAqLworc3RhdGljIGludCB0ZXN0X2lzc3Vidm9sdW1lKGNoYXIgKnBhdGgpCit7CisKKyAgICAgICAgc3RydWN0IHN0YXQgICAgIHN0OworICAgICAgICBpbnQgICAgICAgICAgICAgcmVzOworCisgICAgICAgIHJlcyA9IHN0YXQocGF0aCwgJnN0KTsKKyAgICAgICAgaWYocmVzIDwgMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHJldHVybiAoc3Quc3RfaW5vID09IDI1NikgJiYgU19JU0RJUihzdC5zdF9tb2RlKTsKKworfQorCisvKgorICogR2V0IHRoZSBkZWZhdWx0IHN1YnZvbHVtZSBvZiBhIGJ0cmZzIGZpbGVzeXN0ZW0KKyAqICAgcm9vdGRpcjogYnRyZnMgcm9vdCBkaXIKKyAqICAgc3Vidm9sOiAgdGhpcyBmdW5jdGlvbiB3aWxsIHNhdmUgdGhlIGRlZmF1bHQgc3Vidm9sdW1lIG5hbWUgaGVyZQorICovCitzdGF0aWMgY2hhciAqIGdldF9kZWZhdWx0X3N1YnZvbChjaGFyICogcm9vdGRpciwgY2hhciAqIHN1YnZvbCkKK3sKKyAgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfc2VhcmNoX2FyZ3MgYXJnczsKKyAgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfc2VhcmNoX2tleSAqc2sgPSAmYXJncy5rZXk7CisgICAgc3RydWN0IGJ0cmZzX2lvY3RsX3NlYXJjaF9oZWFkZXIgKnNoOworICAgIGludCByZXQsIGk7CisgICAgaW50IGZkOworICAgIHN0cnVjdCBidHJmc19yb290X3JlZiAqcmVmOworICAgIHN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGlyX2l0ZW07CisgICAgdW5zaWduZWQgbG9uZyBvZmYgPSAwOworICAgIGludCBuYW1lX2xlbjsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgZGlybmFtZVs0MDk2XTsKKyAgICB1NjQgZGVmYXVsdHN1YnZvbGlkID0gMDsKKworICAgIHJldCA9IHRlc3RfaXNzdWJ2b2x1bWUocm9vdGRpcik7CisgICAgaWYgKHJldCA9PSAxKSB7CisgICAgICAgIGZkID0gb3Blbihyb290ZGlyLCBPX1JET05MWSk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGZhaWxlZCB0byBvcGVuICVzXG4iLCByb290ZGlyKTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBmZDsKKyAgICB9CisgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICAgIHN1YnZvbFswXSA9ICdcMCc7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKworICAgLyogc2VhcmNoIGluIHRoZSB0cmVlIG9mIHRyZWUgcm9vdHMgKi8KKyAgIHNrLT50cmVlX2lkID0gMTsKKworICAgLyoKKyAgICAqIHNldCB0aGUgbWluIGFuZCBtYXggdG8gYmFja3JlZiBrZXlzLiAgVGhlIHNlYXJjaCB3aWxsCisgICAgKiBvbmx5IHNlbmQgYmFjayB0aGlzIHR5cGUgb2Yga2V5IG5vdy4KKyAgICAqLworICAgc2stPm1heF90eXBlID0gQlRSRlNfRElSX0lURU1fS0VZOworICAgc2stPm1pbl90eXBlID0gQlRSRlNfRElSX0lURU1fS0VZOworCisgICAvKgorICAgICogc2V0IGFsbCB0aGUgb3RoZXIgcGFyYW1zIHRvIHRoZSBtYXgsIHdlJ2xsIHRha2UgYW55IG9iamVjdGlkCisgICAgKiBhbmQgYW55IHRyYW5zCisgICAgKi8KKyAgIHNrLT5taW5fb2JqZWN0aWQgPSBCVFJGU19ST09UX1RSRUVfRElSX09CSkVDVElEOworICAgc2stPm1heF9vYmplY3RpZCA9IEJUUkZTX1JPT1RfVFJFRV9ESVJfT0JKRUNUSUQ7CisKKyAgIHNrLT5tYXhfb2Zmc2V0ID0gKHU2NCktMTsKKyAgIHNrLT5taW5fb2Zmc2V0ID0gMDsKKyAgIHNrLT5tYXhfdHJhbnNpZCA9ICh1NjQpLTE7CisKKyAgIC8qIGp1c3QgYSBiaWcgbnVtYmVyLCBkb2Vzbid0IG1hdHRlciBtdWNoICovCisgICBzay0+bnJfaXRlbXMgPSA0MDk2OworCisgICB3aGlsZSgxKSB7CisgICAgICAgcmV0ID0gaW9jdGwoZmQsIEJUUkZTX0lPQ19UUkVFX1NFQVJDSCwgJmFyZ3MpOworICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNhbid0IHBlcmZvcm0gdGhlIHNlYXJjaFxuIik7CisgICAgICAgICAgIHN1YnZvbFswXSA9ICdcMCc7CisgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgIH0KKyAgICAgICAvKiB0aGUgaW9jdGwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW0gaXQgZm91bmQgaW4gbnJfaXRlbXMgKi8KKyAgICAgICBpZiAoc2stPm5yX2l0ZW1zID09IDApIHsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgb2ZmID0gMDsKKworICAgICAgIC8qCisgICAgICAgICogZm9yIGVhY2ggaXRlbSwgcHVsbCB0aGUga2V5IG91dCBvZiB0aGUgaGVhZGVyIGFuZCB0aGVuCisgICAgICAgICogcmVhZCB0aGUgcm9vdF9yZWYgaXRlbSBpdCBjb250YWlucworICAgICAgICAqLworICAgICAgIGZvciAoaSA9IDA7IGkgPCBzay0+bnJfaXRlbXM7IGkrKykgeworICAgICAgICAgICBzaCA9IChzdHJ1Y3QgYnRyZnNfaW9jdGxfc2VhcmNoX2hlYWRlciAqKShhcmdzLmJ1ZiArIG9mZik7CisgICAgICAgICAgIG9mZiArPSBzaXplb2YoKnNoKTsKKyAgICAgICAgICAgaWYgKHNoLT50eXBlID09IEJUUkZTX0RJUl9JVEVNX0tFWSkgeworICAgICAgICAgICAgICAgZGlyX2l0ZW0gPSAoc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICopKGFyZ3MuYnVmICsgb2ZmKTsKKyAgICAgICAgICAgICAgIG5hbWVfbGVuID0gZGlyX2l0ZW0tPm5hbWVfbGVuOworICAgICAgICAgICAgICAgbmFtZSA9IChjaGFyICopKGRpcl9pdGVtICsgMSk7CisKKworICAgICAgICAgICAgICAgLyphZGRfcm9vdCgmcm9vdF9sb29rdXAsIHNoLT5vYmplY3RpZCwgc2gtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9pZCwgbmFtZSwgbmFtZV9sZW4pOyovCisgICAgICAgICAgICAgICBzdHJuY3B5KGRpcm5hbWUsIG5hbWUsIG5hbWVfbGVuKTsKKyAgICAgICAgICAgICAgIGRpcm5hbWVbbmFtZV9sZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgIGlmIChzdHJjbXAoZGlybmFtZSwgImRlZmF1bHQiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgZGVmYXVsdHN1YnZvbGlkID0gZGlyX2l0ZW0tPmxvY2F0aW9uLm9iamVjdGlkOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgICAgIG9mZiArPSBzaC0+bGVuOworCisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIHJlY29yZCB0aGUgbWlucyBpbiBzayBzbyB3ZSBjYW4gbWFrZSBzdXJlIHRoZQorICAgICAgICAgICAgKiBuZXh0IHNlYXJjaCBkb2Vzbid0IHJlcGVhdCB0aGlzIHJvb3QKKyAgICAgICAgICAgICovCisgICAgICAgICAgIHNrLT5taW5fb2JqZWN0aWQgPSBzaC0+b2JqZWN0aWQ7CisgICAgICAgICAgIHNrLT5taW5fdHlwZSA9IHNoLT50eXBlOworICAgICAgICAgICBzay0+bWF4X3R5cGUgPSBzaC0+dHlwZTsKKyAgICAgICAgICAgc2stPm1pbl9vZmZzZXQgPSBzaC0+b2Zmc2V0OworICAgICAgIH0KKyAgICAgICBpZiAoZGVmYXVsdHN1YnZvbGlkICE9IDApCisgICAgICAgICAgIGJyZWFrOworICAgICAgIHNrLT5ucl9pdGVtcyA9IDQwOTY7CisgICAgICAgLyogdGhpcyBpdGVyYXRpb24gaXMgZG9uZSwgc3RlcCBmb3J3YXJkIG9uZSByb290IGZvciB0aGUgbmV4dAorICAgICAgICAqIGlvY3RsCisgICAgICAgICovCisgICAgICAgaWYgKHNrLT5taW5fb2JqZWN0aWQgPCAodTY0KS0xKSB7CisgICAgICAgICAgIHNrLT5taW5fb2JqZWN0aWQgPSBCVFJGU19ST09UX1RSRUVfRElSX09CSkVDVElEOworICAgICAgICAgICBzay0+bWF4X29iamVjdGlkID0gQlRSRlNfUk9PVF9UUkVFX0RJUl9PQkpFQ1RJRDsKKyAgICAgICAgICAgc2stPm1heF90eXBlID0gQlRSRlNfUk9PVF9CQUNLUkVGX0tFWTsKKyAgICAgICAgICAgc2stPm1pbl90eXBlID0gQlRSRlNfUk9PVF9CQUNLUkVGX0tFWTsKKyAgICAgICAgICAgc2stPm1pbl9vZmZzZXQgPSAwOworICAgICAgIH0gZWxzZQorICAgICAgICAgICBicmVhazsKKyAgIH0KKworICAgaWYgKGRlZmF1bHRzdWJ2b2xpZCA9PSAwKSB7CisgICAgICAgc3Vidm9sWzBdID0gJ1wwJzsKKyAgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisgICAvKiBzZWFyY2ggaW4gdGhlIHRyZWUgb2YgdHJlZSByb290cyAqLworICAgc2stPnRyZWVfaWQgPSAxOworCisgICAvKgorICAgICogc2V0IHRoZSBtaW4gYW5kIG1heCB0byBiYWNrcmVmIGtleXMuICBUaGUgc2VhcmNoIHdpbGwKKyAgICAqIG9ubHkgc2VuZCBiYWNrIHRoaXMgdHlwZSBvZiBrZXkgbm93LgorICAgICovCisgICBzay0+bWF4X3R5cGUgPSBCVFJGU19ST09UX0JBQ0tSRUZfS0VZOworICAgc2stPm1pbl90eXBlID0gQlRSRlNfUk9PVF9CQUNLUkVGX0tFWTsKKworICAgLyoKKyAgICAqIHNldCBhbGwgdGhlIG90aGVyIHBhcmFtcyB0byB0aGUgbWF4LCB3ZSdsbCB0YWtlIGFueSBvYmplY3RpZAorICAgICogYW5kIGFueSB0cmFucworICAgICovCisgICBzay0+bWF4X29iamVjdGlkID0gKHU2NCktMTsKKyAgIHNrLT5tYXhfb2Zmc2V0ID0gKHU2NCktMTsKKyAgIHNrLT5tYXhfdHJhbnNpZCA9ICh1NjQpLTE7CisKKyAgIC8qIGp1c3QgYSBiaWcgbnVtYmVyLCBkb2Vzbid0IG1hdHRlciBtdWNoICovCisgICBzay0+bnJfaXRlbXMgPSA0MDk2OworCisgICB3aGlsZSgxKSB7CisgICAgICAgcmV0ID0gaW9jdGwoZmQsIEJUUkZTX0lPQ19UUkVFX1NFQVJDSCwgJmFyZ3MpOworICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNhbid0IHBlcmZvcm0gdGhlIHNlYXJjaFxuIik7CisgICAgICAgICAgIHN1YnZvbFswXSA9ICdcMCc7CisgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgIH0KKyAgICAgICAvKiB0aGUgaW9jdGwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW0gaXQgZm91bmQgaW4gbnJfaXRlbXMgKi8KKyAgICAgICBpZiAoc2stPm5yX2l0ZW1zID09IDApCisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgb2ZmID0gMDsKKworICAgICAgIC8qCisgICAgICAgICogZm9yIGVhY2ggaXRlbSwgcHVsbCB0aGUga2V5IG91dCBvZiB0aGUgaGVhZGVyIGFuZCB0aGVuCisgICAgICAgICogcmVhZCB0aGUgcm9vdF9yZWYgaXRlbSBpdCBjb250YWlucworICAgICAgICAqLworICAgICAgIGZvciAoaSA9IDA7IGkgPCBzay0+bnJfaXRlbXM7IGkrKykgeworICAgICAgICAgICBzaCA9IChzdHJ1Y3QgYnRyZnNfaW9jdGxfc2VhcmNoX2hlYWRlciAqKShhcmdzLmJ1ZiArIG9mZik7CisgICAgICAgICAgIG9mZiArPSBzaXplb2YoKnNoKTsKKyAgICAgICAgICAgaWYgKHNoLT50eXBlID09IEJUUkZTX1JPT1RfQkFDS1JFRl9LRVkpIHsKKyAgICAgICAgICAgICAgIHJlZiA9IChzdHJ1Y3QgYnRyZnNfcm9vdF9yZWYgKikoYXJncy5idWYgKyBvZmYpOworICAgICAgICAgICAgICAgbmFtZV9sZW4gPSByZWYtPm5hbWVfbGVuOworICAgICAgICAgICAgICAgbmFtZSA9IChjaGFyICopKHJlZiArIDEpOworCisgICAgICAgICAgICAgICBpZiAoc2gtPm9iamVjdGlkID09IGRlZmF1bHRzdWJ2b2xpZCkgeworICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoc3Vidm9sLCBuYW1lLCBuYW1lX2xlbik7CisgICAgICAgICAgICAgICAgICAgc3Vidm9sW25hbWVfbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgZHByaW50ZigiVGhlIGRlZmF1bHQgc3Vidm9sdW1lOiAlcywgSUQ6ICVsbHVcbiIsCisJCQkgICBzdWJ2b2wsIHNoLT5vYmplY3RpZCk7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIG9mZiArPSBzaC0+bGVuOworCisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIHJlY29yZCB0aGUgbWlucyBpbiBzayBzbyB3ZSBjYW4gbWFrZSBzdXJlIHRoZQorICAgICAgICAgICAgKiBuZXh0IHNlYXJjaCBkb2Vzbid0IHJlcGVhdCB0aGlzIHJvb3QKKyAgICAgICAgICAgICovCisgICAgICAgICAgIHNrLT5taW5fb2JqZWN0aWQgPSBzaC0+b2JqZWN0aWQ7CisgICAgICAgICAgIHNrLT5taW5fdHlwZSA9IHNoLT50eXBlOworICAgICAgICAgICBzay0+bWluX29mZnNldCA9IHNoLT5vZmZzZXQ7CisgICAgICAgfQorICAgICAgIGlmIChzdWJ2b2xbMF0gIT0gJ1wwJykKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgc2stPm5yX2l0ZW1zID0gNDA5NjsKKyAgICAgICAvKiB0aGlzIGl0ZXJhdGlvbiBpcyBkb25lLCBzdGVwIGZvcndhcmQgb25lIHJvb3QgZm9yIHRoZSBuZXh0CisgICAgICAgICogaW9jdGwKKyAgICAgICAgKi8KKyAgICAgICBpZiAoc2stPm1pbl9vYmplY3RpZCA8ICh1NjQpLTEpIHsKKyAgICAgICAgICAgc2stPm1pbl9vYmplY3RpZCsrOworICAgICAgICAgICBzay0+bWluX3R5cGUgPSBCVFJGU19ST09UX0JBQ0tSRUZfS0VZOworICAgICAgICAgICBzay0+bWluX29mZnNldCA9IDA7CisgICAgICAgfSBlbHNlCisgICAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIHN1YnZvbDsKK30KKworc3RhdGljIGludCBpbnN0YWxsX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgaW50IGRldmZkLCBzdHJ1Y3Qgc3RhdCAqcnN0KQoreworICAgIGlmIChmc190eXBlID09IEVYVDIgfHwgZnNfdHlwZSA9PSBWRkFUIHx8IGZzX3R5cGUgPT0gTlRGUworCXx8IGZzX3R5cGUgPT0gVUZTMSB8fCBmc190eXBlID09IFVGUzIpCisJcmV0dXJuIGV4dDJfZmF0X2luc3RhbGxfZmlsZShwYXRoLCBkZXZmZCwgcnN0KTsKKyAgICBlbHNlIGlmIChmc190eXBlID09IEJUUkZTKQorCXJldHVybiBidHJmc19pbnN0YWxsX2ZpbGUocGF0aCwgZGV2ZmQsIHJzdCk7CisgICAgZWxzZSBpZiAoZnNfdHlwZSA9PSBYRlMpCisJcmV0dXJuIHhmc19pbnN0YWxsX2ZpbGUocGF0aCwgZGV2ZmQsIHJzdCk7CisKKyAgICByZXR1cm4gMTsKK30KKworI2lmZGVmIF9fS0xJQkNfXworc3RhdGljIGNoYXIgZGV2bmFtZV9idWZbNjRdOworCitzdGF0aWMgdm9pZCBkZXZpY2VfY2xlYW51cCh2b2lkKQoreworICAgIHVubGluayhkZXZuYW1lX2J1Zik7Cit9CisjZW5kaWYKKworLyogVmVyaWZ5IHRoYXQgYSBkZXZpY2UgZmQgYW5kIGEgcGF0aG5hbWUgYWdyZWUuCisgICBSZXR1cm4gMCBvbiB2YWxpZCwgLTEgb24gZXJyb3IuICovCitzdGF0aWMgaW50IHZhbGlkYXRlX2RldmljZV9idHJmcyhpbnQgcGF0aGZkLCBpbnQgZGV2ZmQpOworc3RhdGljIGludCB2YWxpZGF0ZV9kZXZpY2UoY29uc3QgY2hhciAqcGF0aCwgaW50IGRldmZkKQoreworICAgIHN0cnVjdCBzdGF0IHBzdCwgZHN0OworICAgIHN0cnVjdCBzdGF0ZnMgc2ZzOworICAgIGludCBwZmQ7CisgICAgaW50IHJ2ID0gLTE7CisKKyAgICBwZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZfE9fRElSRUNUT1JZKTsKKyAgICBpZiAocGZkIDwgMCkKKwlnb3RvIGVycjsKKworICAgIGlmIChmc3RhdChwZmQsICZwc3QpIHx8IGZzdGF0KGRldmZkLCAmZHN0KSB8fCBzdGF0ZnMocGF0aCwgJnNmcykpCisJZ290byBlcnI7CisKKyAgICAvKiBidHJmcyBzdF9kZXYgaXMgbm90IG1hdGNoZWQgd2l0aCBtbnQgc3RfcmRldiwgaXQgaXMgYSBrbm93biBpc3N1ZSAqLworICAgIGlmIChmc190eXBlID09IEJUUkZTKSB7CisJaWYgKHNmcy5mX3R5cGUgPT0gQlRSRlNfU1VQRVJfTUFHSUMpCisJICAgIHJ2ID0gdmFsaWRhdGVfZGV2aWNlX2J0cmZzKHBmZCwgZGV2ZmQpOworICAgIH0gZWxzZSB7CisJcnYgPSAocHN0LnN0X2RldiA9PSBkc3Quc3RfcmRldikgPyAwIDogLTE7CisgICAgfQorCitlcnI6CisgICAgaWYgKHBmZCA+PSAwKQorCWNsb3NlKHBmZCk7CisgICAgcmV0dXJuIHJ2OworfQorCisjaWZuZGVmIF9fS0xJQkNfXworc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfZGV2aWNlKGNvbnN0IGNoYXIgKm10YWJfZmlsZSwgZGV2X3QgZGV2KQoreworICAgIHN0cnVjdCBtbnRlbnQgKm1udDsKKyAgICBzdHJ1Y3Qgc3RhdCBkc3Q7CisgICAgRklMRSAqbXRhYjsKKyAgICBjb25zdCBjaGFyICpkZXZuYW1lID0gTlVMTDsKKyAgICBib29sIGRvbmU7CisKKyAgICBtdGFiID0gc2V0bW50ZW50KG10YWJfZmlsZSwgInIiKTsKKyAgICBpZiAoIW10YWIpCisJcmV0dXJuIE5VTEw7CisKKyAgICBkb25lID0gZmFsc2U7CisgICAgd2hpbGUgKChtbnQgPSBnZXRtbnRlbnQobXRhYikpKSB7CisJLyogYnRyZnMgc3RfZGV2IGlzIG5vdCBtYXRjaGVkIHdpdGggbW50IHN0X3JkZXYsIGl0IGlzIGEga25vd24gaXNzdWUgKi8KKwlzd2l0Y2ggKGZzX3R5cGUpIHsKKwljYXNlIEJUUkZTOgorCSAgICBpZiAoIXN0cmNtcChtbnQtPm1udF90eXBlLCAiYnRyZnMiKSAmJgorCQkhc3RhdChtbnQtPm1udF9kaXIsICZkc3QpICYmCisJCWRzdC5zdF9kZXYgPT0gZGV2KSB7CisJCWlmICghc3Vidm9sWzBdKQorCQkgICAgZ2V0X2RlZmF1bHRfc3Vidm9sKG1udC0+bW50X2Rpciwgc3Vidm9sKTsKKwkJZG9uZSA9IHRydWU7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBFWFQyOgorCSAgICBpZiAoKCFzdHJjbXAobW50LT5tbnRfdHlwZSwgImV4dDIiKSB8fAorCQkgIXN0cmNtcChtbnQtPm1udF90eXBlLCAiZXh0MyIpIHx8CisJCSAhc3RyY21wKG1udC0+bW50X3R5cGUsICJleHQ0IikpICYmCisJCSFzdGF0KG1udC0+bW50X2ZzbmFtZSwgJmRzdCkgJiYKKwkJZHN0LnN0X3JkZXYgPT0gZGV2KSB7CisJCWRvbmUgPSB0cnVlOworCQlicmVhazsKKwkgICAgfQorCWNhc2UgVkZBVDoKKwkgICAgaWYgKCghc3RyY21wKG1udC0+bW50X3R5cGUsICJ2ZmF0IikpICYmCisJCSFzdGF0KG1udC0+bW50X2ZzbmFtZSwgJmRzdCkgJiYKKwkJZHN0LnN0X3JkZXYgPT0gZGV2KSB7CisJCWRvbmUgPSB0cnVlOworCQlicmVhazsKKwkgICAgfQorCWNhc2UgTlRGUzoKKwkgICAgaWYgKCghc3RyY21wKG1udC0+bW50X3R5cGUsICJmdXNlYmxrIikgLyogbnRmcy0zZyAqLyB8fAorCQkgIXN0cmNtcChtbnQtPm1udF90eXBlLCAibnRmcyIpKSAmJgorCQkhc3RhdChtbnQtPm1udF9mc25hbWUsICZkc3QpICYmCisJCWRzdC5zdF9yZGV2ID09IGRldikgeworCQlkb25lID0gdHJ1ZTsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICBicmVhazsKKwljYXNlIFhGUzoKKwkgICAgaWYgKCFzdHJjbXAobW50LT5tbnRfdHlwZSwgInhmcyIpICYmICFzdGF0KG1udC0+bW50X2ZzbmFtZSwgJmRzdCkgJiYKKwkJZHN0LnN0X3JkZXYgPT0gZGV2KSB7CisJCWRvbmUgPSB0cnVlOworCQlicmVhazsKKwkgICAgfQorCisJICAgIGJyZWFrOworCWNhc2UgVUZTMToKKwljYXNlIFVGUzI6CisJICAgIGlmICghc3RyY21wKG1udC0+bW50X3R5cGUsICJ1ZnMiKSAmJiAhc3RhdChtbnQtPm1udF9mc25hbWUsICZkc3QpICYmCisJCWRzdC5zdF9yZGV2ID09IGRldikgeworCQlkb25lID0gdHJ1ZTsKKwkgICAgfQorCisJICAgIGJyZWFrOworCWNhc2UgTk9ORToKKwkgICAgYnJlYWs7CisJfQorCisJaWYgKGRvbmUpIHsKKwkgICAgZGV2bmFtZSA9IHN0cmR1cChtbnQtPm1udF9mc25hbWUpOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgZW5kbW50ZW50KG10YWIpOworCisgICAgcmV0dXJuIGRldm5hbWU7Cit9CisjZW5kaWYKKworLyoKKyAqIE9uIG5ld2VyIExpbnV4IGtlcm5lbHMgd2UgY2FuIHVzZSBzeXNmcyB0byBnZXQgYSBiYWNrd2FyZHMgbWFwcGluZworICogZnJvbSBkZXZpY2UgbmFtZXMgdG8gc3RhbmRhcmQgZmlsZW5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX2RldmljZV9zeXNmcyhkZXZfdCBkZXYpCit7CisgICAgY2hhciBzeXNuYW1lWzY0XTsKKyAgICBjaGFyIGxpbmtuYW1lW1BBVEhfTUFYXTsKKyAgICBzc2l6ZV90IGxsZW47CisgICAgY2hhciAqcCwgKnE7CisgICAgY2hhciAqYnVmID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIHNucHJpbnRmKHN5c25hbWUsIHNpemVvZiBzeXNuYW1lLCAiL3N5cy9kZXYvYmxvY2svJXU6JXUiLAorCSAgICAgbWFqb3IoZGV2KSwgbWlub3IoZGV2KSk7CisKKyAgICBsbGVuID0gcmVhZGxpbmsoc3lzbmFtZSwgbGlua25hbWUsIHNpemVvZiBsaW5rbmFtZSk7CisgICAgaWYgKGxsZW4gPCAwIHx8IGxsZW4gPj0gc2l6ZW9mIGxpbmtuYW1lKQorCWdvdG8gZXJyOworCisgICAgbGlua25hbWVbbGxlbl0gPSAnXDAnOworCisgICAgcCA9IHN0cnJjaHIobGlua25hbWUsICcvJyk7CisgICAgcCA9IHAgPyBwKzEgOiBsaW5rbmFtZTsJLyogTGVhdmUgYmFzZW5hbWUgKi8KKworICAgIGJ1ZiA9IHEgPSBtYWxsb2Moc3RybGVuKHApICsgNik7CisgICAgaWYgKCFidWYpCisJZ290byBlcnI7CisKKyAgICBtZW1jcHkocSwgIi9kZXYvIiwgNSk7CisgICAgcSArPSA1OworCisgICAgd2hpbGUgKCpwKSB7CisJKnErKyA9ICgqcCA9PSAnIScpID8gJy8nIDogKnA7CisJcCsrOworICAgIH0KKworICAgICpxID0gJ1wwJzsKKworICAgIGlmICghc3RhdChidWYsICZzdCkgJiYgc3Quc3RfZGV2ID09IGRldikKKwlyZXR1cm4gYnVmOwkJLyogRm91bmQgaXQhICovCisKK2VycjoKKyAgICBpZiAoYnVmKQorCWZyZWUoYnVmKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfZGV2aWNlX21vdW50aW5mbyhjb25zdCBjaGFyICpwYXRoLCBkZXZfdCBkZXYpCit7CisgICAgY29uc3Qgc3RydWN0IG1vdW50aW5mbyAqbTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIG0gPSBmaW5kX21vdW50KHBhdGgsIE5VTEwpOworICAgIGlmICghbSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChtLT5kZXZwYXRoWzBdID09ICcvJyAmJiBtLT5kZXYgPT0gZGV2ICYmCisJIXN0YXQobS0+ZGV2cGF0aCwgJnN0KSAmJiBTX0lTQkxLKHN0LnN0X21vZGUpICYmIHN0LnN0X3JkZXYgPT0gZGV2KQorCXJldHVybiBtLT5kZXZwYXRoOworICAgIGVsc2UKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9kZXZpY2VfYnRyZnMoaW50IHBmZCwgaW50IGRmZCkKK3sKKyAgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfZnNfaW5mb19hcmdzIGZzaW5mbzsKKyAgICBzdGF0aWMgc3RydWN0IGJ0cmZzX2lvY3RsX2Rldl9pbmZvX2FyZ3MgZGV2aW5mbzsKKyAgICBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgc2IyOworCisgICAgaWYgKGlvY3RsKHBmZCwgQlRSRlNfSU9DX0ZTX0lORk8sICZmc2luZm8pKQorCXJldHVybiAtMTsKKworICAgIC8qIFdlIGRvIG5vdCBzdXBwb3J0IG11bHRpLWRldmljZSBidHJmcyB5ZXQgKi8KKyAgICBpZiAoZnNpbmZvLm51bV9kZXZpY2VzICE9IDEpCisJcmV0dXJuIC0xOworCisgICAgLyogVGhlIG9uZSBkZXZpY2Ugd2lsbCBoYXZlIHRoZSBtYXggZGV2aWQgKi8KKyAgICBtZW1zZXQoJmRldmluZm8sIDAsIHNpemVvZiBkZXZpbmZvKTsKKyAgICBkZXZpbmZvLmRldmlkID0gZnNpbmZvLm1heF9pZDsKKyAgICBpZiAoaW9jdGwocGZkLCBCVFJGU19JT0NfREVWX0lORk8sICZkZXZpbmZvKSkKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAoZGV2aW5mby5wYXRoWzBdICE9ICcvJykKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAoeHByZWFkKGRmZCwgJnNiMiwgc2l6ZW9mIHNiMiwgQlRSRlNfU1VQRVJfSU5GT19PRkZTRVQpICE9IHNpemVvZiBzYjIpCisJcmV0dXJuIC0xOworCisgICAgaWYgKG1lbWNtcChzYjIubWFnaWMsIEJUUkZTX01BR0lDLCBCVFJGU19NQUdJQ19MKSkKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAobWVtY21wKHNiMi5mc2lkLCBmc2luZm8uZnNpZCwgc2l6ZW9mIGZzaW5mby5mc2lkKSkKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAoc2IyLm51bV9kZXZpY2VzICE9IDEpCisJcmV0dXJuIC0xOworCisgICAgaWYgKHNiMi5kZXZfaXRlbS5kZXZpZCAhPSBkZXZpbmZvLmRldmlkKQorCXJldHVybiAtMTsKKworICAgIGlmIChtZW1jbXAoc2IyLmRldl9pdGVtLnV1aWQsIGRldmluZm8udXVpZCwgc2l6ZW9mIGRldmluZm8udXVpZCkpCisJcmV0dXJuIC0xOworCisgICAgaWYgKG1lbWNtcChzYjIuZGV2X2l0ZW0uZnNpZCwgZnNpbmZvLmZzaWQsIHNpemVvZiBmc2luZm8uZnNpZCkpCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7CQkJLyogSXQncyBnb29kISAqLworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF9kZXZpY2VfYnRyZnMoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBpbnQgcGZkLCBkZmQ7CisgICAgc3RydWN0IGJ0cmZzX2lvY3RsX2ZzX2luZm9fYXJncyBmc2luZm87CisgICAgc3RhdGljIHN0cnVjdCBidHJmc19pb2N0bF9kZXZfaW5mb19hcmdzIGRldmluZm87CisgICAgY29uc3QgY2hhciAqcnYgPSBOVUxMOworCisgICAgcGZkID0gZGZkID0gLTE7CisKKyAgICBwZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKyAgICBpZiAocGZkIDwgMCkKKwlnb3RvIGVycjsKKworICAgIGlmIChpb2N0bChwZmQsIEJUUkZTX0lPQ19GU19JTkZPLCAmZnNpbmZvKSkKKwlnb3RvIGVycjsKKworICAgIC8qIFdlIGRvIG5vdCBzdXBwb3J0IG11bHRpLWRldmljZSBidHJmcyB5ZXQgKi8KKyAgICBpZiAoZnNpbmZvLm51bV9kZXZpY2VzICE9IDEpCisJZ290byBlcnI7CisKKyAgICAvKiBUaGUgb25lIGRldmljZSB3aWxsIGhhdmUgdGhlIG1heCBkZXZpZCAqLworICAgIG1lbXNldCgmZGV2aW5mbywgMCwgc2l6ZW9mIGRldmluZm8pOworICAgIGRldmluZm8uZGV2aWQgPSBmc2luZm8ubWF4X2lkOworICAgIGlmIChpb2N0bChwZmQsIEJUUkZTX0lPQ19ERVZfSU5GTywgJmRldmluZm8pKQorCWdvdG8gZXJyOworCisgICAgaWYgKGRldmluZm8ucGF0aFswXSAhPSAnLycpCisJZ290byBlcnI7CisKKyAgICBkZmQgPSBvcGVuKChjb25zdCBjaGFyICopZGV2aW5mby5wYXRoLCBPX1JET05MWSk7CisgICAgaWYgKGRmZCA8IDApCisJZ290byBlcnI7CisKKyAgICBpZiAoIXZhbGlkYXRlX2RldmljZV9idHJmcyhwZmQsIGRmZCkpCisJcnYgPSAoY29uc3QgY2hhciAqKWRldmluZm8ucGF0aDsgLyogSXQncyBnb29kISAqLworCitlcnI6CisgICAgaWYgKHBmZCA+PSAwKQorCWNsb3NlKHBmZCk7CisgICAgaWYgKGRmZCA+PSAwKQorCWNsb3NlKGRmZCk7CisgICAgcmV0dXJuIHJ2OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2Rldm5hbWUoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjb25zdCBjaGFyICpkZXZuYW1lID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBzdHJ1Y3Qgc3RhdGZzIHNmczsKKworICAgIGlmIChzdGF0KHBhdGgsICZzdCkgfHwgIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBOb3QgYSBkaXJlY3Rvcnk6ICVzXG4iLCBwcm9ncmFtLCBwYXRoKTsKKwlyZXR1cm4gZGV2bmFtZTsKKyAgICB9CisgICAgaWYgKHN0YXRmcyhwYXRoLCAmc2ZzKSkgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IHN0YXRmcyAlczogJXNcbiIsIHByb2dyYW0sIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIGRldm5hbWU7CisgICAgfQorCisgICAgaWYgKG9wdC5kZXZpY2UpCisJZGV2bmFtZSA9IG9wdC5kZXZpY2U7CisKKyAgICBpZiAoIWRldm5hbWUpeworCWlmIChmc190eXBlID09IEJUUkZTKSB7CisJICAgIC8qIEZvciBidHJmcyB0cnkgdG8gZ2V0IHRoZSBkZXZpY2UgbmFtZSBmcm9tIGJ0cmZzIGl0c2VsZiAqLworCSAgICBkZXZuYW1lID0gZmluZF9kZXZpY2VfYnRyZnMocGF0aCk7CisJfQorICAgIH0KKworICAgIGlmICghZGV2bmFtZSkgeworCWRldm5hbWUgPSBmaW5kX2RldmljZV9tb3VudGluZm8ocGF0aCwgc3Quc3RfZGV2KTsKKyAgICB9CisKKyNpZmRlZiBfX0tMSUJDX18KKyAgICBpZiAoIWRldm5hbWUpIHsKKwlkZXZuYW1lID0gZmluZF9kZXZpY2Vfc3lzZnMoc3Quc3RfZGV2KTsKKyAgICB9CisgICAgaWYgKCFkZXZuYW1lKSB7CisJLyoga2xpYmMgZG9lc24ndCBoYXZlIGdldG1udGVudCBhbmQgZnJpZW5kczsgaW5zdGVhZCwganVzdCBjcmVhdGUKKwkgICBhIG5ldyBkZXZpY2Ugd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlIHR5cGUgKi8KKwlzbnByaW50ZihkZXZuYW1lX2J1Ziwgc2l6ZW9mIGRldm5hbWVfYnVmLCAiL3RtcC9kZXYtJXU6JXUiLAorCQkgbWFqb3Ioc3Quc3RfZGV2KSwgbWlub3Ioc3Quc3RfZGV2KSk7CisKKwlpZiAobWtub2QoZGV2bmFtZV9idWYsIFNfSUZCTEsgfCAwNjAwLCBzdC5zdF9kZXYpKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCBjcmVhdGUgZGV2aWNlICVzXG4iLCBwcm9ncmFtLCBkZXZuYW1lKTsKKwkgICAgcmV0dXJuIGRldm5hbWU7CisJfQorCisJYXRleGl0KGRldmljZV9jbGVhbnVwKTsJLyogdW5saW5rIHRoZSBkZXZpY2Ugbm9kZSBvbiBleGl0ICovCisJZGV2bmFtZSA9IGRldm5hbWVfYnVmOworICAgIH0KKworI2Vsc2UKKyAgICBpZiAoIWRldm5hbWUpIHsKKwlkZXZuYW1lID0gZmluZF9kZXZpY2UoIi9wcm9jL21vdW50cyIsIHN0LnN0X2Rldik7CisgICAgfQorICAgIGlmICghZGV2bmFtZSkgeworCS8qIERpZG4ndCBmaW5kIGl0IGluIC9wcm9jL21vdW50cywgdHJ5IC9ldGMvbXRhYiAqLworICAgICAgICBkZXZuYW1lID0gZmluZF9kZXZpY2UoIi9ldGMvbXRhYiIsIHN0LnN0X2Rldik7CisgICAgfQorICAgIGlmICghZGV2bmFtZSkgeworCWRldm5hbWUgPSBmaW5kX2RldmljZV9zeXNmcyhzdC5zdF9kZXYpOworCisJZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IGZpbmQgZGV2aWNlIGZvciBwYXRoICVzXG4iLCBwcm9ncmFtLCBwYXRoKTsKKwlyZXR1cm4gZGV2bmFtZTsKKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGlzIGRldmljZSAlc1xuIiwgcGF0aCwgZGV2bmFtZSk7CisKKyNlbmRpZgorICAgIHJldHVybiBkZXZuYW1lOworfQorCitzdGF0aWMgaW50IG9wZW5fZGV2aWNlKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpzdCwgY29uc3QgY2hhciAqKl9kZXZuYW1lKQoreworICAgIGludCBkZXZmZDsKKyAgICBjb25zdCBjaGFyICpkZXZuYW1lID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3RhdGZzIHNmczsKKworICAgIGlmIChzdCkKKwlpZiAoc3RhdChwYXRoLCBzdCkgfHwgIVNfSVNESVIoc3QtPnN0X21vZGUpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IE5vdCBhIGRpcmVjdG9yeTogJXNcbiIsIHByb2dyYW0sIHBhdGgpOworCQlyZXR1cm4gLTE7CisJfQorCisgICAgaWYgKHN0YXRmcyhwYXRoLCAmc2ZzKSkgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IHN0YXRmcyAlczogJXNcbiIsIHByb2dyYW0sIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzZnMuZl90eXBlID09IEVYVDJfU1VQRVJfTUFHSUMpCisJZnNfdHlwZSA9IEVYVDI7CisgICAgZWxzZSBpZiAoc2ZzLmZfdHlwZSA9PSBCVFJGU19TVVBFUl9NQUdJQykKKwlmc190eXBlID0gQlRSRlM7CisgICAgZWxzZSBpZiAoc2ZzLmZfdHlwZSA9PSBNU0RPU19TVVBFUl9NQUdJQykKKwlmc190eXBlID0gVkZBVDsKKyAgICBlbHNlIGlmIChzZnMuZl90eXBlID09IE5URlNfU0JfTUFHSUMgfHwKKyAgICAgICAgICAgICAgICBzZnMuZl90eXBlID09IEZVU0VfU1VQRVJfTUFHSUMgLyogbnRmcy0zZyAqLykKKwlmc190eXBlID0gTlRGUzsKKyAgICBlbHNlIGlmIChzZnMuZl90eXBlID09IFhGU19TVVBFUl9NQUdJQykKKwlmc190eXBlID0gWEZTOworICAgIGVsc2UgaWYgKHNmcy5mX3R5cGUgPT0gVUZTMV9TVVBFUl9NQUdJQykKKwlmc190eXBlID0gVUZTMTsKKyAgICBlbHNlIGlmIChzZnMuZl90eXBlID09IFVGUzJfU1VQRVJfTUFHSUMpCisJZnNfdHlwZSA9IFVGUzI7CisKKyAgICBpZiAoIWZzX3R5cGUpIHsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIiVzOiBub3QgYSBmYXQsIG50ZnMsIGV4dDIvMy80LCBidHJmcywgeGZzIG9yIgorCQkidWZzMS8yIGZpbGVzeXN0ZW06ICVzXG4iLAorCQlwcm9ncmFtLCBwYXRoKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgZGV2ZmQgPSAtMTsKKyAgICBkZXZuYW1lID0gZ2V0X2Rldm5hbWUocGF0aCk7CisgICAgaWYgKF9kZXZuYW1lKQorCSpfZGV2bmFtZSA9IGRldm5hbWU7CisKKyAgICBpZiAoKGRldmZkID0gb3BlbihkZXZuYW1lLCBPX1JEV1IgfCBPX1NZTkMpKSA8IDApIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3Qgb3BlbiBkZXZpY2UgJXNcbiIsIHByb2dyYW0sIGRldm5hbWUpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBWZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdlIG9wZW5lZCBpcyB0aGUgZGV2aWNlIGludGVuZGVkICovCisgICAgaWYgKHZhbGlkYXRlX2RldmljZShwYXRoLCBkZXZmZCkpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBwYXRoICVzIGRvZXNuJ3QgbWF0Y2ggZGV2aWNlICVzXG4iLAorCQlwcm9ncmFtLCBwYXRoLCBkZXZuYW1lKTsKKwljbG9zZShkZXZmZCk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gZGV2ZmQ7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfcmVhZF9hZHYoaW50IGRldmZkKQoreworICAgIGlmICh4cHJlYWQoZGV2ZmQsIHN5c2xpbnV4X2FkdiwgMiAqIEFEVl9TSVpFLCBCVFJGU19BRFZfT0ZGU0VUKQorCSE9IDIgKiBBRFZfU0laRSkKKwlyZXR1cm4gLTE7CisKKyAgICByZXR1cm4gc3lzbGludXhfdmFsaWRhdGVfYWR2KHN5c2xpbnV4X2FkdikgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGZzX3JlYWRfYWR2KGludCBkZXZmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgYWR2X3NpemUgPSAyICogQURWX1NJWkU7CisKKyAgICBpZiAoeHByZWFkKGRldmZkLCBzeXNsaW51eF9hZHYsIGFkdl9zaXplLCBib290X2ltYWdlX2xlbikgIT0gYWR2X3NpemUpCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHN5c2xpbnV4X3ZhbGlkYXRlX2FkdihzeXNsaW51eF9hZHYpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0X3JlYWRfYWR2KGNvbnN0IGNoYXIgKnBhdGgsIGludCBkZXZmZCwgY29uc3QgY2hhciAqKm5hbWVwKQoreworICAgIGludCBlcnI7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgIGlmIChmc190eXBlID09IEJUUkZTKSB7CisJLyogYnRyZnMgImxkbGludXguc3lzIiBpcyBpbiA2NGsgYmxhbmsgYXJlYSAqLworCXJldHVybiBidHJmc19yZWFkX2FkdihkZXZmZCk7CisgICAgfSBlbHNlIGlmIChmc190eXBlID09IFhGUykgeworCS8qIFhGUyAibGRsaW51eC5zeXMiIGlzIGluIHRoZSBmaXJzdCAyMDQ4IGJ5dGVzIG9mIHRoZSBwcmltYXJ5IEFHICovCisJcmV0dXJuIHhmc19yZWFkX2FkdihkZXZmZCk7CisgICAgfSBlbHNlIHsKKwllcnIgPSByZWFkX2FkdihwYXRoLCBuYW1lID0gImxkbGludXguc3lzIik7CisJaWYgKGVyciA9PSAyKQkJLyogbGRsaW51eC5zeXMgZG9lcyBub3QgZXhpc3QgKi8KKwkgICAgZXJyID0gcmVhZF9hZHYocGF0aCwgbmFtZSA9ICJleHRsaW51eC5zeXMiKTsKKwlpZiAobmFtZXApCisJICAgICpuYW1lcCA9IG5hbWU7CisJcmV0dXJuIGVycjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZXh0X3dyaXRlX2Fkdihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpjZmcsIGludCBkZXZmZCkKK3sKKyAgICBpZiAoZnNfdHlwZSA9PSBCVFJGUykgeyAvKiBidHJmcyAibGRsaW51eC5zeXMiIGlzIGluIDY0ayBibGFuayBhcmVhICovCisJaWYgKHhwd3JpdGUoZGV2ZmQsIHN5c2xpbnV4X2FkdiwgMiAqIEFEVl9TSVpFLAorCQlCVFJGU19BRFZfT0ZGU0VUKSAhPSAyICogQURWX1NJWkUpIHsKKwkJcGVycm9yKCJ3cml0aW5nIGFkdiIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiB3cml0ZV9hZHYocGF0aCwgY2ZnKTsKK30KKworc3RhdGljIGludCBpbnN0YWxsX2xvYWRlcihjb25zdCBjaGFyICpwYXRoLCBpbnQgdXBkYXRlX29ubHkpCit7CisgICAgc3RydWN0IHN0YXQgc3QsIGZzdDsKKyAgICBpbnQgZGV2ZmQsIHJ2OworICAgIGNvbnN0IGNoYXIgKmRldm5hbWU7CisKKyAgICBkZXZmZCA9IG9wZW5fZGV2aWNlKHBhdGgsICZzdCwgJmRldm5hbWUpOworICAgIGlmIChkZXZmZCA8IDApCisJcmV0dXJuIDE7CisKKyAgICBpZiAodXBkYXRlX29ubHkgJiYgIXN5c2xpbnV4X2FscmVhZHlfaW5zdGFsbGVkKGRldmZkKSkgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IG5vIHByZXZpb3VzIHN5c2xpbnV4IGJvb3Qgc2VjdG9yIGZvdW5kXG4iLAorCQlwcm9ncmFtKTsKKwljbG9zZShkZXZmZCk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogUmVhZCBhIHByZS1leGlzdGluZyBBRFYsIGlmIGFscmVhZHkgaW5zdGFsbGVkICovCisgICAgaWYgKG9wdC5yZXNldF9hZHYpIHsKKwlzeXNsaW51eF9yZXNldF9hZHYoc3lzbGludXhfYWR2KTsKKyAgICB9IGVsc2UgaWYgKGV4dF9yZWFkX2FkdihwYXRoLCBkZXZmZCwgTlVMTCkgPCAwKSB7CisJY2xvc2UoZGV2ZmQpOworCXJldHVybiAxOworICAgIH0KKworICAgIGlmIChtb2RpZnlfYWR2KCkgPCAwKSB7CisJY2xvc2UoZGV2ZmQpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qIEluc3RhbGwgbGRsaW51eC5zeXMgKi8KKyAgICBpZiAoaW5zdGFsbF9maWxlKHBhdGgsIGRldmZkLCAmZnN0KSkgeworCWNsb3NlKGRldmZkKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGZzdC5zdF9kZXYgIT0gc3Quc3RfZGV2KSB7CisJZnByaW50ZihzdGRlcnIsICIlczogZmlsZSBzeXN0ZW0gY2hhbmdlZCB1bmRlciB1cyAtIGFib3J0aW5nIVxuIiwKKwkJcHJvZ3JhbSk7CisJY2xvc2UoZGV2ZmQpOworCXJldHVybiAxOworICAgIH0KKworICAgIHN5bmMoKTsKKyAgICBydiA9IGluc3RhbGxfYm9vdGJsb2NrKGRldmZkLCBkZXZuYW1lKTsKKyAgICBjbG9zZShkZXZmZCk7CisgICAgc3luYygpOworCisgICAgcmV0dXJuIHJ2OworfQorCisvKgorICogTW9kaWZ5IHRoZSBBRFYgb2YgYW4gZXhpc3RpbmcgaW5zdGFsbGF0aW9uCisgKi8KK2ludCBtb2RpZnlfZXhpc3RpbmdfYWR2KGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgaW50IGRldmZkOworCisgICAgZGV2ZmQgPSBvcGVuX2RldmljZShwYXRoLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZGV2ZmQgPCAwKQorCXJldHVybiAxOworCisgICAgaWYgKGV4dF9yZWFkX2FkdihwYXRoLCBkZXZmZCwgJmZpbGVuYW1lKSA8IDApIHsKKwljbG9zZShkZXZmZCk7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChtb2RpZnlfYWR2KCkgPCAwKSB7CisJY2xvc2UoZGV2ZmQpOworCXJldHVybiAxOworICAgIH0KKyAgICBpZiAoZXh0X3dyaXRlX2FkdihwYXRoLCBmaWxlbmFtZSwgZGV2ZmQpIDwgMCkgeworCWNsb3NlKGRldmZkKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgY2xvc2UoZGV2ZmQpOworICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgTU9ERV9FWFRMSU5VWCk7CisKKyAgICBpZiAoIW9wdC5kaXJlY3RvcnkgfHwgb3B0Lmluc3RhbGxfbWJyIHx8IG9wdC5hY3RpdmF0ZV9wYXJ0aXRpb24pCisJdXNhZ2UoRVhfVVNBR0UsIDApOworCisgICAgaWYgKG9wdC51cGRhdGVfb25seSA9PSAtMSkgeworCWlmIChvcHQucmVzZXRfYWR2IHx8IG9wdC5zZXRfb25jZSB8fCBvcHQubWVudV9zYXZlKQorCSAgICByZXR1cm4gbW9kaWZ5X2V4aXN0aW5nX2FkdihvcHQuZGlyZWN0b3J5KTsKKwllbHNlCisJICAgIHVzYWdlKEVYX1VTQUdFLCBNT0RFX0VYVExJTlVYKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW5zdGFsbF9sb2FkZXIob3B0LmRpcmVjdG9yeSwgb3B0LnVwZGF0ZV9vbmx5KTsKK30KZGlmZiAtLWdpdCBhL2V4dGxpbnV4L21pc2MuaCBiL2V4dGxpbnV4L21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjJmMWIzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0bGludXgvbWlzYy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgUGF1bG8gQWxjYW50YXJhIDxwY2FjanJAenl0b3IuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgTUlTQ19IXworI2RlZmluZSBNSVNDX0hfCisKKy8qIFJldHVybiBhIDY0LWJpdCBsaXR0ZS1lbmRpYW4gdmFsdWUgZnJvbSBhIGdpdmVuIDY0LWJpdCBiaWctZW5kaWFuIG9uZSAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCBiZTY0X3RvX2NwdSh1aW50NjRfdCB2YWwpCit7CisgICAgcmV0dXJuICh1aW50NjRfdCkoKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwKKwkJICAgICAgKCgodWludDY0X3QpdmFsICYgKHVpbnQ2NF90KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpKTsKK30KKworLyogUmV0dXJuIGEgMzItYml0IGxpdHRlLWVuZGlhbiB2YWx1ZSBmcm9tIGEgZ2l2ZW4gMzItYml0IGJpZy1lbmRpYW4gb25lICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJlMzJfdG9fY3B1KHVpbnQzMl90IHZhbCkKK3sKKyAgICByZXR1cm4gKHVpbnQzMl90KSgoKCh1aW50MzJfdCl2YWwgJiAodWludDMyX3QpMHgwMDAwMDBmZlVMKSA8PCAyNCkgfAorCQkgICAgICAoKCh1aW50MzJfdCl2YWwgJiAodWludDMyX3QpMHgwMDAwZmYwMFVMKSA8PCAgOCkgfAorCQkgICAgICAoKCh1aW50MzJfdCl2YWwgJiAodWludDMyX3QpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfAorCQkgICAgICAoKCh1aW50MzJfdCl2YWwgJiAodWludDMyX3QpMHhmZjAwMDAwMFVMKSA+PiAyNCkpOworfQorCisvKiBSZXR1cm4gYSAxNi1iaXQgbGl0dGUtZW5kaWFuIHZhbHVlIGZyb20gYSBnaXZlbiAxNi1iaXQgYmlnLWVuZGlhbiBvbmUgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgYmUxNl90b19jcHUodWludDE2X3QgdmFsKQoreworICAgIHJldHVybiAodWludDE2X3QpKCgoKHVpbnQxNl90KXZhbCAmICh1aW50MTZfdCkweDAwZmZVKSA8PCA4KSB8CisJCSAgICAgICgoKHVpbnQxNl90KXZhbCAmICh1aW50MTZfdCkweGZmMDBVKSA+PiA4KSk7Cit9CisKKyNlbmRpZiAvKiBNSVNDX0hfICovCmRpZmYgLS1naXQgYS9leHRsaW51eC9tb3VudGluZm8uYyBiL2V4dGxpbnV4L21vdW50aW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTg3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRsaW51eC9tb3VudGluZm8uYwpAQCAtMCwwICsxLDI3NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTIgSW50ZWwgQ29ycG9yYXRpb247IEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlICJtb3VudGluZm8uaCIKKworLyoKKyAqIFBhcnNlIC9wcm9jL3NlbGYvbW91bnRpbmZvCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3N0cmluZyhGSUxFICpmLCBjaGFyICpzdHJpbmdfYnVmLCBzaXplX3Qgc3RyaW5nX2xlbiwgY2hhciAqZWMpCit7CisgICAgaW50IGNoOworICAgIGNoYXIgKnAgPSBzdHJpbmdfYnVmOworCisgICAgZm9yICg7OykgeworCWlmICghc3RyaW5nX2xlbikKKwkgICAgcmV0dXJuIC0yOwkJLyogU3RyaW5nIHRvbyBsb25nICovCisKKwljaCA9IGdldGMoZik7CisJaWYgKGNoID09IEVPRikgeworCSAgICByZXR1cm4gLTE7CQkvKiBHb3QgRU9GICovCisJfSBlbHNlIGlmIChjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nKSB7CisJICAgICplYyA9IGNoOworCSAgICAqcCA9ICdcMCc7CisJICAgIHJldHVybiBwIC0gc3RyaW5nX2J1ZjsKKwl9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsKKwkgICAgLyogU2hvdWxkIGFsd2F5cyBiZSBmb2xsb3dlZCBieSAzIG9jdGFsIGRpZ2l0cyBpbiAwMDAuLjM3NyAqLworCSAgICBpbnQgb2MgPSAwOworCSAgICBpbnQgaTsKKwkgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQljaCA9IGdldGMoZik7CisJCWlmIChjaCA8ICcwJyB8fCBjaCA+ICc3JyB8fCAoaSA9PSAwICYmIGNoID4gJzMnKSkKKwkJICAgIHJldHVybiAtMTsJLyogQmFkIGVzY2FwZSBzZXF1ZW5jZSAqLworCQlvYyA9IChvYyA8PCAzKSArIChjaCAtICcwJyk7CisJICAgIH0KKwkgICAgaWYgKCFvYykKKwkJcmV0dXJuIC0xOwkvKiBXZSBjYW4ndCBoYW5kbGUgXDAwMCAqLworCSAgICAqcCsrID0gb2M7CisJICAgIHN0cmluZ19sZW4tLTsKKwl9IGVsc2UgeworCSAgICAqcCsrID0gY2g7CisJICAgIHN0cmluZ19sZW4tLTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmcmVlX21vdW50aW5mbyhzdHJ1Y3QgbW91bnRpbmZvICptKQoreworICAgIHN0cnVjdCBtb3VudGluZm8gKm54OworCisgICAgd2hpbGUgKG0pIHsKKwlmcmVlKChjaGFyICopbS0+cm9vdCk7CisJZnJlZSgoY2hhciAqKW0tPnBhdGgpOworCWZyZWUoKGNoYXIgKiltLT5mc3R5cGUpOworCWZyZWUoKGNoYXIgKiltLT5kZXZwYXRoKTsKKwlmcmVlKChjaGFyICopbS0+bW91bnRvcHQpOworCW54ID0gbS0+bmV4dDsKKwlmcmVlKG0pOworCW0gPSBueDsKKyAgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbW91bnRpbmZvICpoZWFkID0gTlVMTCwgKip0YWlsID0gJmhlYWQ7CisKK3N0YXRpYyB2b2lkIHBhcnNlX21vdW50aW5mbyh2b2lkKQoreworICAgIEZJTEUgKmY7CisgICAgc3RydWN0IG1vdW50aW5mbyAqbSwgKm1tOworICAgIGNoYXIgc3RyaW5nX2J1ZltQQVRIX01BWCo4XTsKKyAgICBpbnQgbjsKKyAgICBjaGFyIGVjLCAqZXA7CisgICAgdW5zaWduZWQgaW50IG1hLCBtaTsKKworICAgIGYgPSBmb3BlbigiL3Byb2Mvc2VsZi9tb3VudGluZm8iLCAiciIpOworICAgIGlmICghZikKKwlyZXR1cm47CisKKyAgICBmb3IgKDs7KSB7CisJbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG1vdW50aW5mbykpOworCWlmICghbSkKKwkgICAgYnJlYWs7CisJbWVtc2V0KG0sIDAsIHNpemVvZiAqbSk7CisKKwluID0gZ2V0X3N0cmluZyhmLCBzdHJpbmdfYnVmLCBzaXplb2Ygc3RyaW5nX2J1ZiwgJmVjKTsKKwlpZiAobiA8IDAgfHwgZWMgPT0gJ1xuJykKKwkgICAgYnJlYWs7CisKKwltLT5tb3VudGlkID0gc3RydG91bChzdHJpbmdfYnVmLCAmZXAsIDEwKTsKKwlpZiAoKmVwKQorCSAgICBicmVhazsKKworCW4gPSBnZXRfc3RyaW5nKGYsIHN0cmluZ19idWYsIHNpemVvZiBzdHJpbmdfYnVmLCAmZWMpOworCWlmIChuIDwgMCB8fCBlYyA9PSAnXG4nKQorCSAgICBicmVhazsKKworCW0tPnBhcmVudGlkID0gc3RydG91bChzdHJpbmdfYnVmLCAmZXAsIDEwKTsKKwlpZiAoKmVwKQorCSAgICBicmVhazsKKworCW4gPSBnZXRfc3RyaW5nKGYsIHN0cmluZ19idWYsIHNpemVvZiBzdHJpbmdfYnVmLCAmZWMpOworCWlmIChuIDwgMCB8fCBlYyA9PSAnXG4nKQorCSAgICBicmVhazsKKworCWlmIChzc2NhbmYoc3RyaW5nX2J1ZiwgIiV1OiV1IiwgJm1hLCAmbWkpICE9IDIpCisJICAgIGJyZWFrOworCisJbS0+ZGV2ID0gbWFrZWRldihtYSwgbWkpOworCisJbiA9IGdldF9zdHJpbmcoZiwgc3RyaW5nX2J1Ziwgc2l6ZW9mIHN0cmluZ19idWYsICZlYyk7CisJaWYgKG4gPCAxIHx8IGVjID09ICdcbicgfHwgc3RyaW5nX2J1ZlswXSAhPSAnLycpCisJICAgIGJyZWFrOworCisJbS0+cm9vdCA9IHN0cmR1cChzdHJpbmdfYnVmKTsKKwlpZiAoIW0tPnJvb3QpCisJICAgIGJyZWFrOworCisJbiA9IGdldF9zdHJpbmcoZiwgc3RyaW5nX2J1Ziwgc2l6ZW9mIHN0cmluZ19idWYsICZlYyk7CisJaWYgKG4gPCAxIHx8IGVjID09ICdcbicgfHwgc3RyaW5nX2J1ZlswXSAhPSAnLycpCisJICAgIGJyZWFrOworCisJbS0+cGF0aCA9IHN0cmR1cChzdHJpbmdfYnVmKTsKKwltLT5wYXRobGVuID0gKG4gPT0gMSkgPyAwIDogbjsgLyogVHJlYXQgLyBhcyBlbXB0eSAqLworCisJLyogU2tpcCB0YWdnZWQgYXR0cmlidXRlcyAqLworCWRvIHsKKwkgICAgbiA9IGdldF9zdHJpbmcoZiwgc3RyaW5nX2J1Ziwgc2l6ZW9mIHN0cmluZ19idWYsICZlYyk7CisJICAgIGlmIChuIDwgMCB8fCBlYyA9PSAnXG4nKQorCQlnb3RvIHF1aXQ7CisJfSB3aGlsZSAobiAhPSAxIHx8IHN0cmluZ19idWZbMF0gIT0gJy0nKTsKKworCW4gPSBnZXRfc3RyaW5nKGYsIHN0cmluZ19idWYsIHNpemVvZiBzdHJpbmdfYnVmLCAmZWMpOworCWlmIChuIDwgMCB8fCBlYyA9PSAnXG4nKQorCSAgICBicmVhazsKKworCW0tPmZzdHlwZSA9IHN0cmR1cChzdHJpbmdfYnVmKTsKKwlpZiAoIW0tPmZzdHlwZSkKKwkgICAgYnJlYWs7CisKKwluID0gZ2V0X3N0cmluZyhmLCBzdHJpbmdfYnVmLCBzaXplb2Ygc3RyaW5nX2J1ZiwgJmVjKTsKKwlpZiAobiA8IDAgfHwgZWMgPT0gJ1xuJykKKwkgICAgYnJlYWs7CisKKwltLT5kZXZwYXRoID0gc3RyZHVwKHN0cmluZ19idWYpOworCWlmICghbS0+ZGV2cGF0aCkKKwkgICAgYnJlYWs7CisKKwluID0gZ2V0X3N0cmluZyhmLCBzdHJpbmdfYnVmLCBzaXplb2Ygc3RyaW5nX2J1ZiwgJmVjKTsKKwlpZiAobiA8IDApCisJICAgIGJyZWFrOworCisJbS0+bW91bnRvcHQgPSBzdHJkdXAoc3RyaW5nX2J1Zik7CisJaWYgKCFtLT5tb3VudG9wdCkKKwkgICAgYnJlYWs7CisKKwkvKiBTa2lwIGFueSBwcmV2aW91c2x5IHVua25vd24gZmllbGRzICovCisJd2hpbGUgKGVjICE9ICdcbicgJiYgZWMgIT0gRU9GKQorCSAgICBlYyA9IGdldGMoZik7CisKKwkqdGFpbCA9IG07CisJdGFpbCA9ICZtLT5uZXh0OworICAgIH0KK3F1aXQ6CisgICAgZmNsb3NlKGYpOworICAgIGZyZWVfbW91bnRpbmZvKG0pOworCisgICAgLyogQ3JlYXRlIHBhcmVudCBsaW5rcyAqLworICAgIGZvciAobSA9IGhlYWQ7IG07IG0gPSBtLT5uZXh0KSB7CisJZm9yIChtbSA9IGhlYWQ7IG1tOyBtbSA9IG1tLT5uZXh0KSB7CisJICAgIGlmIChtLT5wYXJlbnRpZCA9PSBtbS0+bW91bnRpZCkgeworCQltLT5wYXJlbnQgPSBtbTsKKwkJaWYgKCFzdHJjbXAobS0+cGF0aCwgbW0tPnBhdGgpKQorCQkgICAgbW0tPmhpZGRlbiA9IDE7IC8qIEhpZGRlbiB1bmRlciBhbm90aGVyIG1vdW50ICovCisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KK30KKworY29uc3Qgc3RydWN0IG1vdW50aW5mbyAqZmluZF9tb3VudChjb25zdCBjaGFyICpwYXRoLCBjaGFyICoqc3VicGF0aCkKK3sKKyAgICBzdGF0aWMgaW50IGRvbmVfaW5pdDsKKyAgICBjaGFyICpyZWFsX3BhdGg7CisgICAgY29uc3Qgc3RydWN0IG1vdW50aW5mbyAqbSwgKmJlc3Q7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaW50IGxlbiwgbWF0Y2hsZW47CisKKyAgICBpZiAoIWRvbmVfaW5pdCkgeworCXBhcnNlX21vdW50aW5mbygpOworCWRvbmVfaW5pdCA9IDE7CisgICAgfQorCisgICAgaWYgKHN0YXQocGF0aCwgJnN0KSkKKwlyZXR1cm4gTlVMTDsKKworICAgIHJlYWxfcGF0aCA9IHJlYWxwYXRoKHBhdGgsIE5VTEwpOworICAgIGlmICghcmVhbF9wYXRoKQorCXJldHVybiBOVUxMOworCisgICAgLyoKKyAgICAgKiBUcmlja3kgYnVzaW5lc3M6IHdlIG5lZWQgdGhlIGxvbmdlc3QgbWF0Y2hpbmcgc3VicGF0aAorICAgICAqIHdoaWNoIGlzbid0IGEgcGFyZW50IG9mIHRoZSBzYW1lIHN1YnBhdGguCisgICAgICovCisgICAgbGVuID0gc3RybGVuKHJlYWxfcGF0aCk7CisgICAgbWF0Y2hsZW4gPSAwOworICAgIGJlc3QgPSBOVUxMOworICAgIGZvciAobSA9IGhlYWQ7IG07IG0gPSBtLT5uZXh0KSB7CisJaWYgKG0tPmhpZGRlbikKKwkgICAgY29udGludWU7CQkvKiBIaWRkZW4gdW5kZXJuZWF0aCBhbm90aGVyIG1vdW50ICovCisKKwlpZiAobS0+cGF0aGxlbiA+IGxlbikKKwkgICAgY29udGludWU7CQkvKiBDYW5ub3QgcG9zc2libHkgbWF0Y2ggKi8KKworCWlmIChtLT5wYXRobGVuIDwgbWF0Y2hsZW4pCisJICAgIGNvbnRpbnVlOwkJLyogTm8gcG9pbnQgaW4gdGVzdGluZyB0aGlzIG9uZSAqLworCisJaWYgKHN0LnN0X2RldiA9PSBtLT5kZXYgJiYKKwkgICAgIW1lbWNtcChtLT5wYXRoLCByZWFsX3BhdGgsIG0tPnBhdGhsZW4pICYmCisJICAgIChyZWFsX3BhdGhbbS0+cGF0aGxlbl0gPT0gJy8nIHx8IHJlYWxfcGF0aFttLT5wYXRobGVuXSA9PSAnXDAnKSkgeworCSAgICBtYXRjaGxlbiA9IG0tPnBhdGhsZW47CisJICAgIGJlc3QgPSBtOworCX0KKyAgICB9CisKKyAgICBpZiAoYmVzdCAmJiBzdWJwYXRoKSB7CisJaWYgKHJlYWxfcGF0aFtiZXN0LT5wYXRobGVuXSA9PSAnXDAnKQorCSAgICAqc3VicGF0aCA9IHN0cmR1cCgiLyIpOworCWVsc2UKKwkgICAgKnN1YnBhdGggPSBzdHJkdXAocmVhbF9wYXRoICsgYmVzdC0+cGF0aGxlbik7CisgICAgfQorCisgICAgcmV0dXJuIGJlc3Q7Cit9CisKKyNpZmRlZiBURVNUCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgaW50IGk7CisgICAgY29uc3Qgc3RydWN0IG1vdW50aW5mbyAqbTsKKyAgICBjaGFyICpzdWJwYXRoOworCisgICAgcGFyc2VfbW91bnRpbmZvKCk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJbSA9IGZpbmRfbW91bnQoYXJndltpXSwgJnN1YnBhdGgpOworCWlmICghbSkgeworCSAgICBwcmludGYoIiVzOiAlc1xuIiwgYXJndltpXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkgICAgY29udGludWU7CisJfQorCisJcHJpbnRmKCIlcyAtPiAlcyBAICVzKCV1LCV1KTolcyAlcyAlc1xuIiwKKwkgICAgICAgYXJndltpXSwgc3VicGF0aCwgbS0+ZGV2cGF0aCwgbWFqb3IobS0+ZGV2KSwgbWlub3IobS0+ZGV2KSwKKwkgICAgICAgbS0+cm9vdCwgbS0+ZnN0eXBlLCBtLT5tb3VudG9wdCk7CisJcHJpbnRmKCJVc2FibGUgZGV2aWNlOiAlc1xuIiwgZmluZF9kZXZpY2UobS0+ZGV2LCBtLT5kZXZwYXRoKSk7CisJZnJlZShzdWJwYXRoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHRsaW51eC9tb3VudGluZm8uaCBiL2V4dGxpbnV4L21vdW50aW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmNhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRsaW51eC9tb3VudGluZm8uaApAQCAtMCwwICsxLDM1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbjsgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIFNZU0xJTlVYX01PVU5USU5GT19ICisjZGVmaW5lIFNZU0xJTlVYX01PVU5USU5GT19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworc3RydWN0IG1vdW50aW5mbyB7CisgICAgc3RydWN0IG1vdW50aW5mbyAqbmV4dDsKKyAgICBzdHJ1Y3QgbW91bnRpbmZvICpwYXJlbnQ7CisgICAgY29uc3QgY2hhciAqcm9vdDsKKyAgICBjb25zdCBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKmZzdHlwZTsKKyAgICBjb25zdCBjaGFyICpkZXZwYXRoOworICAgIGNvbnN0IGNoYXIgKm1vdW50b3B0OworICAgIGludCBtb3VudGlkOworICAgIGludCBwYXJlbnRpZDsKKyAgICBpbnQgcGF0aGxlbjsKKyAgICBpbnQgaGlkZGVuOworICAgIGRldl90IGRldjsKK307CisKK2NvbnN0IHN0cnVjdCBtb3VudGluZm8gKmZpbmRfbW91bnQoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqKnN1YnBhdGgpOworCisjZW5kaWYgLyogU1lTTElOVVhfTU9VTlRJTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2V4dGxpbnV4L250ZnMuaCBiL2V4dGxpbnV4L250ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA3ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0bGludXgvbnRmcy5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIFBhdWxvIEFsY2FudGFyYSA8cGNhY2pyQGdtYWlsLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9OVEZTX0hfCisjZGVmaW5lIF9OVEZTX0hfCisKKyNkZWZpbmUgTlRGU19TQl9NQUdJQyAweDUzNDY1NDRFCisjZGVmaW5lIEZVU0VfU1VQRVJfTUFHSUMgMHg2NTczNTU0NgorCisjZW5kaWYgLyogX05URlNfSF8gKi8KZGlmZiAtLWdpdCBhL2V4dGxpbnV4L3Vmcy5oIGIvZXh0bGludXgvdWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyNDY5OQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGxpbnV4L3Vmcy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUmFwaGFlbCBTLiBDYXJ2YWxobyA8cmFwaGFlbC5zY2FydkBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKyNpZm5kZWYgVUZTX0hfCisjZGVmaW5lIFVGU19IXworCisjZGVmaW5lIFVGUzFfU1VQRVJfTUFHSUMgMHgwMDAxMTk1NAorI2RlZmluZSBVRlMyX1NVUEVSX01BR0lDIDB4MTk1NDAxMTkKKworI2VuZGlmIC8qIFVGU19IXyAqLwpkaWZmIC0tZ2l0IGEvZXh0bGludXgvdWZzX2ZzLmggYi9leHRsaW51eC91ZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhhNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0bGludXgvdWZzX2ZzLmgKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBUYWtlbiBmcm9tIExpbnV4IGtlcm5lbCB0cmVlIChsaW51eC9mcy91ZnMpCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2CisgKiBBZHJpYW4gUm9kcmlndWV6IChhZHJpYW5AZnJhbmtsaW5zLXRvd2VyLnJ1dGdlcnMuZWR1KQorICogTGFib3JhdG9yeSBmb3IgQ29tcHV0ZXIgU2NpZW5jZSBSZXNlYXJjaCBDb21wdXRpbmcgRmFjaWxpdHkKKyAqIFJ1dGdlcnMsIFRoZSBTdGF0ZSBVbml2ZXJzaXR5IG9mIE5ldyBKZXJzZXkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUmFwaGFlbCBTLiBDYXJ2YWxobyA8cmFwaGFlbC5zY2FydkBnbWFpbC5jb20+CisgKgorICogQ2xlYW4gc3dhYiBzdXBwb3J0IGJ5IEZhcmUgPGZhcmVAdHVuZXMub3JnPgorICoganVzdCBob3BlIG5vIG9uZSBpcyB1c2luZyBOTlVVWFhJIG9uIF9fPzY0IHN0cnVjdHVyZSBlbGVtZW50cworICogNjQtYml0IGNsZWFuIHRoYW5rcyB0byBNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4KKyAqCisgKiA0LjRCU0QgKEZyZWVCU0QpIHN1cHBvcnQgYWRkZWQgb24gRmVicnVhcnkgMXN0IDE5OTggYnkKKyAqIE5pZWxzIEtyaXN0aWFuIEJlY2ggSmVuc2VuIDxua2JqQGltYWdlLmRrPiBwYXJ0aWFsbHkgYmFzZWQKKyAqIG9uIGNvZGUgYnkgTWFydGluIHZvbiBMb2V3aXMgPG1hcnRpbkBtaXJhLmlzZG4uY3MudHUtYmVybGluLmRlPi4KKyAqCisgKiBOZVhUc3RlcCBzdXBwb3J0IGFkZGVkIG9uIEZlYnJ1YXJ5IDV0aCAxOTk4IGJ5CisgKiBOaWVscyBLcmlzdGlhbiBCZWNoIEplbnNlbiA8bmtiakBpbWFnZS5kaz4uCisgKgorICogV3JpdGUgc3VwcG9ydCBieSBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqCisgKiBIUC9VWCBoZnMgZmlsZXN5c3RlbSBzdXBwb3J0IGFkZGVkIGJ5CisgKiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1rcEBta3AubmV0PiwgQXVndXN0IDE5OTkKKyAqCisgKiBVRlMyIChvZiBGcmVlQlNEIDUueCkgc3VwcG9ydCBhZGRlZCBieQorICogTmlyYWogS3VtYXIgPG5pcmFqMTdAaWl0Ym9tYmF5Lm9yZz4gICwgSmFuIDIwMDQKKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VGU19GU19ICisjZGVmaW5lIF9fTElOVVhfVUZTX0ZTX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3R5cGVkZWYgdWludDY0X3QgX19mczY0OwordHlwZWRlZiB1aW50MzJfdCBfX2ZzMzI7Cit0eXBlZGVmIHVpbnQxNl90IF9fZnMxNjsKKworI2RlZmluZSBVRlNfQkJMT0NLIDAKKyNkZWZpbmUgVUZTX0JCU0laRSA4MTkyCisjZGVmaW5lIFVGU19TQkxPQ0sgODE5MgorI2RlZmluZSBVRlNfU0JTSVpFIDgxOTIKKworI2RlZmluZSBVRlNfU0VDVE9SX1NJWkUgNTEyCisjZGVmaW5lIFVGU19TRUNUT1JfQklUUyA5CisjZGVmaW5lIFVGU19NQUdJQyAgMHgwMDAxMTk1NAorI2RlZmluZSBVRlNfTUFHSUNfQlcgMHgwZjI0MjY5NworI2RlZmluZSBVRlMyX01BR0lDIDB4MTk1NDAxMTkKKyNkZWZpbmUgVUZTX0NJR0FNICAweDU0MTkwMTAwIC8qIGJ5dGVzd2FwcGVkIE1BR0lDICovCisKKy8qIENvcGllZCBmcm9tIEZyZWVCU0QgKi8KKy8qCisgKiBFYWNoIGRpc2sgZHJpdmUgY29udGFpbnMgc29tZSBudW1iZXIgb2YgZmlsZXN5c3RlbXMuCisgKiBBIGZpbGVzeXN0ZW0gY29uc2lzdHMgb2YgYSBudW1iZXIgb2YgY3lsaW5kZXIgZ3JvdXBzLgorICogRWFjaCBjeWxpbmRlciBncm91cCBoYXMgaW5vZGVzIGFuZCBkYXRhLgorICoKKyAqIEEgZmlsZXN5c3RlbSBpcyBkZXNjcmliZWQgYnkgaXRzIHN1cGVyLWJsb2NrLCB3aGljaCBpbiB0dXJuCisgKiBkZXNjcmliZXMgdGhlIGN5bGluZGVyIGdyb3Vwcy4gIFRoZSBzdXBlci1ibG9jayBpcyBjcml0aWNhbAorICogZGF0YSBhbmQgaXMgcmVwbGljYXRlZCBpbiBlYWNoIGN5bGluZGVyIGdyb3VwIHRvIHByb3RlY3QgYWdhaW5zdAorICogY2F0YXN0cm9waGljIGxvc3MuICBUaGlzIGlzIGRvbmUgYXQgYG5ld2ZzJyB0aW1lIGFuZCB0aGUgY3JpdGljYWwKKyAqIHN1cGVyLWJsb2NrIGRhdGEgZG9lcyBub3QgY2hhbmdlLCBzbyB0aGUgY29waWVzIG5lZWQgbm90IGJlCisgKiByZWZlcmVuY2VkIGZ1cnRoZXIgdW5sZXNzIGRpc2FzdGVyIHN0cmlrZXMuCisgKgorICogRm9yIGZpbGVzeXN0ZW0gZnMsIHRoZSBvZmZzZXRzIG9mIHRoZSB2YXJpb3VzIGJsb2NrcyBvZiBpbnRlcmVzdAorICogYXJlIGdpdmVuIGluIHRoZSBzdXBlciBibG9jayBhczoKKyAqICAgICAgW2ZzLT5mc19zYmxrbm9dICAgICAgICAgU3VwZXItYmxvY2sKKyAqICAgICAgW2ZzLT5mc19jYmxrbm9dICAgICAgICAgQ3lsaW5kZXIgZ3JvdXAgYmxvY2sKKyAqICAgICAgW2ZzLT5mc19pYmxrbm9dICAgICAgICAgSW5vZGUgYmxvY2tzCisgKiAgICAgIFtmcy0+ZnNfZGJsa25vXSAgICAgICAgIERhdGEgYmxvY2tzCisgKiBUaGUgYmVnaW5uaW5nIG9mIGN5bGluZGVyIGdyb3VwIGNnIGluIGZzLCBpcyBnaXZlbiBieQorICogdGhlIGBgY2diYXNlKGZzLCBjZyknJyBtYWNyby4KKyAqCisgKiBEZXBlbmRpbmcgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgdGhlIG1lZGlhLCB0aGUgc3VwZXJibG9jayBtYXkKKyAqIHJlc2lkZSBpbiBhbnkgb25lIG9mIGZvdXIgcGxhY2VzLiBGb3IgdGlueSBtZWRpYSB3aGVyZSBldmVyeSBibG9jaworICogY291bnRzLCBpdCBpcyBwbGFjZWQgYXQgdGhlIHZlcnkgZnJvbnQgb2YgdGhlIHBhcnRpdGlvbi4gSGlzdG9yaWNhbGx5LAorICogVUZTMSBwbGFjZWQgaXQgOEsgZnJvbSB0aGUgZnJvbnQgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIGRpc2sgbGFiZWwgYW5kCisgKiBhIHNtYWxsIGJvb3RzdHJhcC4gRm9yIFVGUzIgaXQgZ290IG1vdmVkIHRvIDY0SyBmcm9tIHRoZSBmcm9udCB0byBsZWF2ZQorICogcm9vbSBmb3IgdGhlIGRpc2sgbGFiZWwgYW5kIGEgYmlnZ2VyIGJvb3RzdHJhcCwgYW5kIGZvciByZWFsbHkgcGlnZ3kKKyAqIHN5c3RlbXMgd2UgY2hlY2sgYXQgMjU2SyBmcm9tIHRoZSBmcm9udCBpZiB0aGUgZmlyc3QgdGhyZWUgZmFpbC4gSW4KKyAqIGFsbCBjYXNlcyB0aGUgc2l6ZSBvZiB0aGUgc3VwZXJibG9jayB3aWxsIGJlIFNCTE9DS1NJWkUuIEFsbCB2YWx1ZXMgYXJlCisgKiBnaXZlbiBpbiBieXRlLW9mZnNldCBmb3JtLCBzbyB0aGV5IGRvIG5vdCBpbXBseSBhIHNlY3RvciBzaXplLiBUaGUKKyAqIFNCTE9DS1NFQVJDSCBzcGVjaWZpZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBsb2NhdGlvbnMgc2hvdWxkIGJlIHNlYXJjaGVkLgorICovCisjZGVmaW5lIFNCTE9DS19GTE9QUFkgICAgICAgIDAKKyNkZWZpbmUgU0JMT0NLX1VGUzEgICAgICAgODE5MgorI2RlZmluZSBTQkxPQ0tfVUZTMiAgICAgIDY1NTM2CisjZGVmaW5lIFNCTE9DS19QSUdHWSAgICAyNjIxNDQKKyNkZWZpbmUgU0JMT0NLU0laRSAgICAgICAgODE5MgorI2RlZmluZSBTQkxPQ0tTRUFSQ0ggXAorICAgICAgICB7IFNCTE9DS19VRlMyLCBTQkxPQ0tfVUZTMSwgU0JMT0NLX0ZMT1BQWSwgU0JMT0NLX1BJR0dZLCAtMSB9CisKKyNkZWZpbmUJVUZTX01BWE5BTUxFTiAyNTUKKyNkZWZpbmUgVUZTX01BWE1OVExFTiA1MTIKKyNkZWZpbmUgVUZTMl9NQVhNTlRMRU4gNDY4CisjZGVmaW5lIFVGUzJfTUFYVk9MTEVOIDMyCisjZGVmaW5lIFVGU19NQVhDU0JVRlMgMzEKKyNkZWZpbmUgVUZTX0xJTktfTUFYIDMyMDAwCisvKgorI2RlZmluZQlVRlMyX05PQ1NQVFJTCSgoMTI4IC8gc2l6ZW9mKHZvaWQgKikpIC0gNCkKKyovCisjZGVmaW5lCVVGUzJfTk9DU1BUUlMJMjgKKworLyoKKyAqIFVGU19ESVJfUEFEIGRlZmluZXMgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGJvdW5kYXJpZXMKKyAqIChtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCkKKyAqLworI2RlZmluZSBVRlNfRElSX1BBRAkJCTQKKyNkZWZpbmUgVUZTX0RJUl9ST1VORAkJCShVRlNfRElSX1BBRCAtIDEpCisjZGVmaW5lIFVGU19ESVJfUkVDX0xFTihuYW1lX2xlbikJKCgobmFtZV9sZW4pICsgMSArIDggKyBVRlNfRElSX1JPVU5EKSAmIH5VRlNfRElSX1JPVU5EKQorCitzdHJ1Y3QgdWZzX3RpbWV2YWwgeworCV9fZnMzMgl0dl9zZWM7CisJX19mczMyCXR2X3VzZWM7Cit9OworCitzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSB7CisJX19mczMyICBkX2lubzsJCQkvKiBpbm9kZSBudW1iZXIgb2YgdGhpcyBlbnRyeSAqLworCV9fZnMxNiAgZF9yZWNsZW47CQkvKiBsZW5ndGggb2YgdGhpcyBlbnRyeSAqLworCXVuaW9uIHsKKwkJX19mczE2CWRfbmFtbGVuOwkJLyogYWN0dWFsIGxlbmd0aCBvZiBkX25hbWUgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTgJZF90eXBlOwkJLyogZmlsZSB0eXBlICovCisJCQlfX3U4CWRfbmFtbGVuOwkvKiBsZW5ndGggb2Ygc3RyaW5nIGluIGRfbmFtZSAqLworCQl9IGRfNDQ7CisJfSBkX3U7CisJX191OAlkX25hbWVbVUZTX01BWE5BTUxFTiArIDFdOwkvKiBmaWxlIG5hbWUgKi8KK307CisKK3N0cnVjdCB1ZnNfY3N1bSB7CisJX19mczMyCWNzX25kaXI7CS8qIG51bWJlciBvZiBkaXJlY3RvcmllcyAqLworCV9fZnMzMgljc19uYmZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyAqLworCV9fZnMzMgljc19uaWZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLworCV9fZnMzMgljc19uZmZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGZyYWdzICovCit9Oworc3RydWN0IHVmczJfY3N1bV90b3RhbCB7CisJX19mczY0CWNzX25kaXI7CS8qIG51bWJlciBvZiBkaXJlY3RvcmllcyAqLworCV9fZnM2NAljc19uYmZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyAqLworCV9fZnM2NAljc19uaWZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLworCV9fZnM2NAljc19uZmZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGZyYWdzICovCisJX19mczY0ICAgY3NfbnVtY2x1c3RlcnM7CS8qIG51bWJlciBvZiBmcmVlIGNsdXN0ZXJzICovCisJX19mczY0ICAgY3Nfc3BhcmVbM107CS8qIGZ1dHVyZSBleHBhbnNpb24gKi8KK307CisKK3N0cnVjdCB1ZnNfY3N1bV9jb3JlIHsKKwlfX3U2NAljc19uZGlyOwkvKiBudW1iZXIgb2YgZGlyZWN0b3JpZXMgKi8KKwlfX3U2NAljc19uYmZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyAqLworCV9fdTY0CWNzX25pZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCisJX191NjQJY3NfbmZmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBmcmFncyAqLworCV9fdTY0ICAgY3NfbnVtY2x1c3RlcnM7CS8qIG51bWJlciBvZiBmcmVlIGNsdXN0ZXJzICovCit9OworCitzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfbGluazsJLyogVU5VU0VEICovCisJCX0gZnNfNDI7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfc3RhdGU7CS8qIGZpbGUgc3lzdGVtIHN0YXRlIGZsYWcgKi8KKwkJfSBmc19zdW47CisJfSBmc191MDsKKwlfX2ZzMzIJZnNfcmxpbms7CS8qIFVOVVNFRCAqLworCV9fZnMzMglmc19zYmxrbm87CS8qIGFkZHIgb2Ygc3VwZXItYmxvY2sgaW4gZmlsZXN5cyAqLworCV9fZnMzMglmc19jYmxrbm87CS8qIG9mZnNldCBvZiBjeWwtYmxvY2sgaW4gZmlsZXN5cyAqLworCV9fZnMzMglmc19pYmxrbm87CS8qIG9mZnNldCBvZiBpbm9kZS1ibG9ja3MgaW4gZmlsZXN5cyAqLworCV9fZnMzMglmc19kYmxrbm87CS8qIG9mZnNldCBvZiBmaXJzdCBkYXRhIGFmdGVyIGNnICovCisJX19mczMyCWZzX2Nnb2Zmc2V0OwkvKiBjeWxpbmRlciBncm91cCBvZmZzZXQgaW4gY3lsaW5kZXIgKi8KKwlfX2ZzMzIJZnNfY2dtYXNrOwkvKiB1c2VkIHRvIGNhbGMgbW9kIGZzX250cmFrICovCisJX19mczMyCWZzX3RpbWU7CS8qIGxhc3QgdGltZSB3cml0dGVuIC0tIHRpbWVfdCAqLworCV9fZnMzMglmc19zaXplOwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGZzICovCisJX19mczMyCWZzX2RzaXplOwkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgaW4gZnMgKi8KKwlfX2ZzMzIJZnNfbmNnOwkJLyogbnVtYmVyIG9mIGN5bGluZGVyIGdyb3VwcyAqLworCV9fZnMzMglmc19ic2l6ZTsJLyogc2l6ZSBvZiBiYXNpYyBibG9ja3MgaW4gZnMgKi8KKwlfX2ZzMzIJZnNfZnNpemU7CS8qIHNpemUgb2YgZnJhZyBibG9ja3MgaW4gZnMgKi8KKwlfX2ZzMzIJZnNfZnJhZzsJLyogbnVtYmVyIG9mIGZyYWdzIGluIGEgYmxvY2sgaW4gZnMgKi8KKy8qIHRoZXNlIGFyZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KKwlfX2ZzMzIJZnNfbWluZnJlZTsJLyogbWluaW11bSBwZXJjZW50YWdlIG9mIGZyZWUgYmxvY2tzICovCisJX19mczMyCWZzX3JvdGRlbGF5OwkvKiBudW0gb2YgbXMgZm9yIG9wdGltYWwgbmV4dCBibG9jayAqLworCV9fZnMzMglmc19ycHM7CQkvKiBkaXNrIHJldm9sdXRpb25zIHBlciBzZWNvbmQgKi8KKy8qIHRoZXNlIGZpZWxkcyBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUgb3RoZXJzICovCisJX19mczMyCWZzX2JtYXNrOwkvKiBgYGJsa29mZicnIGNhbGMgb2YgYmxrIG9mZnNldHMgKi8KKwlfX2ZzMzIJZnNfZm1hc2s7CS8qIGBgZnJhZ29mZicnIGNhbGMgb2YgZnJhZyBvZmZzZXRzICovCisJX19mczMyCWZzX2JzaGlmdDsJLyogYGBsYmxrbm8nJyBjYWxjIG9mIGxvZ2ljYWwgYmxrbm8gKi8KKwlfX2ZzMzIJZnNfZnNoaWZ0OwkvKiBgYG51bWZyYWdzJycgY2FsYyBudW1iZXIgb2YgZnJhZ3MgKi8KKy8qIHRoZXNlIGFyZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KKwlfX2ZzMzIJZnNfbWF4Y29udGlnOwkvKiBtYXggbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYmxrcyAqLworCV9fZnMzMglmc19tYXhicGc7CS8qIG1heCBudW1iZXIgb2YgYmxrcyBwZXIgY3lsIGdyb3VwICovCisvKiB0aGVzZSBmaWVsZHMgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlIG90aGVycyAqLworCV9fZnMzMglmc19mcmFnc2hpZnQ7CS8qIGJsb2NrIHRvIGZyYWcgc2hpZnQgKi8KKwlfX2ZzMzIJZnNfZnNidG9kYjsJLyogZnNidG9kYiBhbmQgZGJ0b2ZzYiBzaGlmdCBjb25zdGFudCAqLworCV9fZnMzMglmc19zYnNpemU7CS8qIGFjdHVhbCBzaXplIG9mIHN1cGVyIGJsb2NrICovCisJX19mczMyCWZzX2NzbWFzazsJLyogY3N1bSBibG9jayBvZmZzZXQgKi8KKwlfX2ZzMzIJZnNfY3NzaGlmdDsJLyogY3N1bSBibG9jayBudW1iZXIgKi8KKwlfX2ZzMzIJZnNfbmluZGlyOwkvKiB2YWx1ZSBvZiBOSU5ESVIgKi8KKwlfX2ZzMzIJZnNfaW5vcGI7CS8qIHZhbHVlIG9mIElOT1BCICovCisJX19mczMyCWZzX25zcGY7CS8qIHZhbHVlIG9mIE5TUEYgKi8KKy8qIHlldCBhbm90aGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICovCisJX19mczMyCWZzX29wdGltOwkvKiBvcHRpbWl6YXRpb24gcHJlZmVyZW5jZSwgc2VlIGJlbG93ICovCisvKiB0aGVzZSBmaWVsZHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaGFyZHdhcmUgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfbnBzZWN0OwkvKiAjIHNlY3RvcnMvdHJhY2sgaW5jbHVkaW5nIHNwYXJlcyAqLworCQl9IGZzX3N1bjsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgdGltZSBzdGFtcCAqLworCQl9IGZzX3N1bng4NjsKKwl9IGZzX3UxOworCV9fZnMzMglmc19pbnRlcmxlYXZlOwkvKiBoYXJkd2FyZSBzZWN0b3IgaW50ZXJsZWF2ZSAqLworCV9fZnMzMglmc190cmFja3NrZXc7CS8qIHNlY3RvciAwIHNrZXcsIHBlciB0cmFjayAqLworLyogYSB1bmlxdWUgaWQgZm9yIHRoaXMgZmlsZXN5c3RlbSAoY3VycmVudGx5IHVudXNlZCBhbmQgdW5tYWludGFpbmVkKSAqLworLyogSW4gNC4zIFRhaG9lIHRoaXMgc3BhY2UgaXMgdXNlZCBieSBmc19oZWFkc3dpdGNoIGFuZCBmc190cmtzZWVrICovCisvKiBOZWl0aGVyIG9mIHRob3NlIGZpZWxkcyBpcyB1c2VkIGluIHRoZSBUYWhvZSBjb2RlIHJpZ2h0IG5vdyBidXQgKi8KKy8qIHRoZXJlIGNvdWxkIGJlIHByb2JsZW1zIGlmIHRoZXkgYXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCV9fZnMzMglmc19pZFsyXTsJLyogZmlsZSBzeXN0ZW0gaWQgKi8KKy8qIHNpemVzIGRldGVybWluZWQgYnkgbnVtYmVyIG9mIGN5bGluZGVyIGdyb3VwcyBhbmQgdGhlaXIgc2l6ZXMgKi8KKwlfX2ZzMzIJZnNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworCV9fZnMzMglmc19jc3NpemU7CS8qIHNpemUgb2YgY3lsIGdycCBzdW1tYXJ5IGFyZWEgKi8KKwlfX2ZzMzIJZnNfY2dzaXplOwkvKiBjeWxpbmRlciBncm91cCBzaXplICovCisvKiB0aGVzZSBmaWVsZHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaGFyZHdhcmUgKi8KKwlfX2ZzMzIJZnNfbnRyYWs7CS8qIHRyYWNrcyBwZXIgY3lsaW5kZXIgKi8KKwlfX2ZzMzIJZnNfbnNlY3Q7CS8qIHNlY3RvcnMgcGVyIHRyYWNrICovCisJX19mczMyCWZzX3NwYzsJCS8qIHNlY3RvcnMgcGVyIGN5bGluZGVyICovCisvKiB0aGlzIGNvbWVzIGZyb20gdGhlIGRpc2sgZHJpdmVyIHBhcnRpdGlvbmluZyAqLworCV9fZnMzMglmc19uY3lsOwkvKiBjeWxpbmRlcnMgaW4gZmlsZSBzeXN0ZW0gKi8KKy8qIHRoZXNlIGZpZWxkcyBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUgb3RoZXJzICovCisJX19mczMyCWZzX2NwZzsJCS8qIGN5bGluZGVycyBwZXIgZ3JvdXAgKi8KKwlfX2ZzMzIJZnNfaXBnOwkJLyogaW5vZGVzIHBlciBjeWxpbmRlciBncm91cCAqLworCV9fZnMzMglmc19mcGc7CQkvKiBibG9ja3MgcGVyIGdyb3VwICogZnNfZnJhZyAqLworLyogdGhpcyBkYXRhIG11c3QgYmUgcmUtY29tcHV0ZWQgYWZ0ZXIgY3Jhc2hlcyAqLworCXN0cnVjdCB1ZnNfY3N1bSBmc19jc3RvdGFsOwkvKiBjeWxpbmRlciBzdW1tYXJ5IGluZm9ybWF0aW9uICovCisvKiB0aGVzZSBmaWVsZHMgYXJlIGNsZWFyZWQgYXQgbW91bnQgdGltZSAqLworCV9fczgJZnNfZm1vZDsJLyogc3VwZXIgYmxvY2sgbW9kaWZpZWQgZmxhZyAqLworCV9fczgJZnNfY2xlYW47CS8qIGZpbGUgc3lzdGVtIGlzIGNsZWFuIGZsYWcgKi8KKwlfX3M4CWZzX3Jvbmx5OwkvKiBtb3VudGVkIHJlYWQtb25seSBmbGFnICovCisJX19zOAlmc19mbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3M4CWZzX2ZzbW50W1VGU19NQVhNTlRMRU5dOy8qIG5hbWUgbW91bnRlZCBvbiAqLworCQkJX19mczMyCWZzX2Nncm90b3I7CS8qIGxhc3QgY2cgc2VhcmNoZWQgKi8KKwkJCV9fZnMzMglmc19jc3BbVUZTX01BWENTQlVGU107LypsaXN0IG9mIGZzX2NzIGluZm8gYnVmZmVycyAqLworCQkJX19mczMyCWZzX21heGNsdXN0ZXI7CisJCQlfX2ZzMzIJZnNfY3BjOwkJLyogY3lsIHBlciBjeWNsZSBpbiBwb3N0YmwgKi8KKwkJCV9fZnMxNglmc19vcG9zdGJsWzE2XVs4XTsgLyogb2xkIHJvdGF0aW9uIGJsb2NrIGxpc3QgaGVhZCAqLworCQl9IGZzX3UxOworCQlzdHJ1Y3QgeworCQkJX19zOCAgZnNfZnNtbnRbVUZTMl9NQVhNTlRMRU5dOwkvKiBuYW1lIG1vdW50ZWQgb24gKi8KKwkJCV9fdTggICBmc192b2xuYW1lW1VGUzJfTUFYVk9MTEVOXTsgLyogdm9sdW1lIG5hbWUgKi8KKwkJCV9fZnM2NCAgZnNfc3d1aWQ7CQkvKiBzeXN0ZW0td2lkZSB1aWQgKi8KKwkJCV9fZnMzMiAgZnNfcGFkOwkvKiBkdWUgdG8gYWxpZ25tZW50IG9mIGZzX3N3dWlkICovCisJCQlfX2ZzMzIgICBmc19jZ3JvdG9yOyAgICAgLyogbGFzdCBjZyBzZWFyY2hlZCAqLworCQkJX19mczMyICAgZnNfb2NzcFtVRlMyX05PQ1NQVFJTXTsgLypsaXN0IG9mIGZzX2NzIGluZm8gYnVmZmVycyAqLworCQkJX19mczMyICAgZnNfY29udGlnZGlyczsvKiMgb2YgY29udGlndW91c2x5IGFsbG9jYXRlZCBkaXJzICovCisJCQlfX2ZzMzIgICBmc19jc3A7CS8qIGNnIHN1bW1hcnkgaW5mbyBidWZmZXIgZm9yIGZzX2NzICovCisJCQlfX2ZzMzIgICBmc19tYXhjbHVzdGVyOworCQkJX19mczMyICAgZnNfYWN0aXZlOy8qIHVzZWQgYnkgc25hcHNob3RzIHRvIHRyYWNrIGZzICovCisJCQlfX2ZzMzIgICBmc19vbGRfY3BjOwkvKiBjeWwgcGVyIGN5Y2xlIGluIHBvc3RibCAqLworCQkJX19mczMyICAgZnNfbWF4YnNpemU7LyptYXhpbXVtIGJsb2NraW5nIGZhY3RvciBwZXJtaXR0ZWQgKi8KKwkJCV9fZnM2NCAgIGZzX3NwYXJlY29uNjRbMTddOy8qb2xkIHJvdGF0aW9uIGJsb2NrIGxpc3QgaGVhZCAqLworCQkJX19mczY0ICAgZnNfc2Jsb2NrbG9jOyAvKiBieXRlIG9mZnNldCBvZiBzdGFuZGFyZCBzdXBlcmJsb2NrICovCisJCQlzdHJ1Y3QgIHVmczJfY3N1bV90b3RhbCBmc19jc3RvdGFsOy8qY3lsaW5kZXIgc3VtbWFyeSBpbmZvcm1hdGlvbiovCisJCQlzdHJ1Y3QgIHVmc190aW1ldmFsICAgIGZzX3RpbWU7CQkvKiBsYXN0IHRpbWUgd3JpdHRlbiAqLworCQkJX19mczY0ICAgIGZzX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGZzICovCisJCQlfX2ZzNjQgICAgZnNfZHNpemU7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiBmcyAqLworCQkJX19mczY0ICAgZnNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworCQkJX19mczY0ICAgIGZzX3BlbmRpbmdibG9ja3M7LyogYmxvY2tzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KKwkJCV9fZnMzMiAgICBmc19wZW5kaW5naW5vZGVzOy8qaW5vZGVzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KKwkJfSBmc191MjsKKwl9ICBmc191MTE7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19mczMyCWZzX3NwYXJlY29uWzUzXTsvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGNvbnN0YW50cyAqLworCQkJX19mczMyCWZzX3JlY2xhaW07CisJCQlfX2ZzMzIJZnNfc3BhcmVjb24yWzFdOworCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSB0aW1lIHN0YW1wICovCisJCQlfX2ZzMzIJZnNfcWJtYXNrWzJdOwkvKiB+dXNiX2JtYXNrICovCisJCQlfX2ZzMzIJZnNfcWZtYXNrWzJdOwkvKiB+dXNiX2ZtYXNrICovCisJCX0gZnNfc3VuOworCQlzdHJ1Y3QgeworCQkJX19mczMyCWZzX3NwYXJlY29uWzUzXTsvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGNvbnN0YW50cyAqLworCQkJX19mczMyCWZzX3JlY2xhaW07CisJCQlfX2ZzMzIJZnNfc3BhcmVjb24yWzFdOworCQkJX19mczMyCWZzX25wc2VjdDsJLyogIyBzZWN0b3JzL3RyYWNrIGluY2x1ZGluZyBzcGFyZXMgKi8KKwkJCV9fZnMzMglmc19xYm1hc2tbMl07CS8qIH51c2JfYm1hc2sgKi8KKwkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KKwkJfSBmc19zdW54ODY7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTBdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCisJCQlfX2ZzMzIJZnNfY29udGlnc3Vtc2l6ZTsvKiBzaXplIG9mIGNsdXN0ZXIgc3VtbWFyeSBhcnJheSAqLworCQkJX19mczMyCWZzX21heHN5bWxpbmtsZW47LyogbWF4IGxlbmd0aCBvZiBhbiBpbnRlcm5hbCBzeW1saW5rICovCisJCQlfX2ZzMzIJZnNfaW5vZGVmbXQ7CS8qIGZvcm1hdCBvZiBvbi1kaXNrIGlub2RlcyAqLworCQkJX19mczMyCWZzX21heGZpbGVzaXplWzJdOwkvKiBtYXggcmVwcmVzZW50YWJsZSBmaWxlIHNpemUgKi8KKwkJCV9fZnMzMglmc19xYm1hc2tbMl07CS8qIH51c2JfYm1hc2sgKi8KKwkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KKwkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgdGltZSBzdGFtcCAqLworCQl9IGZzXzQ0OworCX0gZnNfdTI7CisJX19mczMyCWZzX3Bvc3RibGZvcm1hdDsJLyogZm9ybWF0IG9mIHBvc2l0aW9uYWwgbGF5b3V0IHRhYmxlcyAqLworCV9fZnMzMglmc19ucnBvczsJCS8qIG51bWJlciBvZiByb3RhdGlvbmFsIHBvc2l0aW9ucyAqLworCV9fZnMzMglmc19wb3N0YmxvZmY7CQkvKiAoX19zMTYpIHJvdGF0aW9uIGJsb2NrIGxpc3QgaGVhZCAqLworCV9fZnMzMglmc19yb3RibG9mZjsJCS8qIChfX3U4KSBibG9ja3MgZm9yIGVhY2ggcm90YXRpb24gKi8KKwlfX2ZzMzIJZnNfbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKi8KKwlfX3U4CWZzX3NwYWNlWzFdOwkJLyogbGlzdCBvZiBibG9ja3MgZm9yIGVhY2ggcm90YXRpb24gKi8KK307IC8qc3RydWN0IHVmc19zdXBlcl9ibG9jayovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0bGludXgveGZzLmggYi9leHRsaW51eC94ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTJjMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0bGludXgveGZzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsbyBBbGNhbnRhcmEgPHBjYWNqckB6eXRvci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKyNpZm5kZWYgWEZTX0hfCisjZGVmaW5lIFhGU19IXworCisjZGVmaW5lIFhGU19TVVBFUl9NQUdJQyAweDU4NDY1MzQyCisKKyNlbmRpZiAvKiBYRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2V4dGxpbnV4L3hmc19mcy5oIGIvZXh0bGludXgveGZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3ODIwZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGxpbnV4L3hmc19mcy5oCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogVGFrZW4gZnJvbSBMaW51eCBrZXJuZWwgdHJlZSAobGludXgvZnMveGZzKQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NS0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWxvIEFsY2FudGFyYSA8cGNhY2pyQHp5dG9yLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFhGU19GU19IXworI2RlZmluZSBYRlNfRlNfSF8KKworLyoKKyAqIFNHSSdzIFhGUyBmaWxlc3lzdGVtJ3MgbWFqb3Igc3R1ZmYgKGNvbnN0YW50cywgc3RydWN0dXJlcykKKyAqLworCisvKgorICogRGlyZWN0IEkvTyBhdHRyaWJ1dGUgcmVjb3JkIHVzZWQgd2l0aCBYRlNfSU9DX0RJT0lORk8KKyAqIGRfbWluaW9zeiBpcyB0aGUgbWluIHhmZXIgc2l6ZSwgeGZlciBzaXplIG11bHRpcGxlIGFuZCBmaWxlIHNlZWsgb2Zmc2V0CisgKiBhbGlnbm1lbnQuCisgKi8KK3N0cnVjdCBkaW9hdHRyIHsKKwl1aW50MzJfdAkJZF9tZW07CQkvKiBkYXRhIGJ1ZmZlciBtZW1vcnkgYWxpZ25tZW50ICovCisJdWludDMyX3QJCWRfbWluaW9zejsJLyogbWluIHhmZXIgc2l6ZQkJKi8KKwl1aW50MzJfdAkJZF9tYXhpb3N6OwkvKiBtYXggeGZlciBzaXplCQkqLworfTsKKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgWEZTX0lPQ19GU0dFVFhBVFRSW0FdIGFuZCBYRlNfSU9DX0ZTU0VUWEFUVFIuCisgKi8KK3N0cnVjdCBmc3hhdHRyIHsKKwl1aW50MzJfdAkJZnN4X3hmbGFnczsJLyogeGZsYWdzIGZpZWxkIHZhbHVlIChnZXQvc2V0KSAqLworCXVpbnQzMl90CQlmc3hfZXh0c2l6ZTsJLyogZXh0c2l6ZSBmaWVsZCB2YWx1ZSAoZ2V0L3NldCkqLworCXVpbnQzMl90CQlmc3hfbmV4dGVudHM7CS8qIG5leHRlbnRzIGZpZWxkIHZhbHVlIChnZXQpCSovCisJdWludDMyX3QJCWZzeF9wcm9qaWQ7CS8qIHByb2plY3QgaWRlbnRpZmllciAoZ2V0L3NldCkgKi8KKwl1bnNpZ25lZCBjaGFyCWZzeF9wYWRbMTJdOworfTsKKworLyoKKyAqIEZsYWdzIGZvciB0aGUgYnNfeGZsYWdzL2ZzeF94ZmxhZ3MgZmllbGQKKyAqIFRoZXJlIHNob3VsZCBiZSBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGVzZSBmbGFncyBhbmQgdGhlCisgKiBYRlNfRElGTEFHX3MuCisgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX1JFQUxUSU1FCTB4MDAwMDAwMDEJLyogZGF0YSBpbiByZWFsdGltZSB2b2x1bWUgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX1BSRUFMTE9DCTB4MDAwMDAwMDIJLyogcHJlYWxsb2NhdGVkIGZpbGUgZXh0ZW50cyAqLworI2RlZmluZSBYRlNfWEZMQUdfSU1NVVRBQkxFCTB4MDAwMDAwMDgJLyogZmlsZSBjYW5ub3QgYmUgbW9kaWZpZWQgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0FQUEVORAkweDAwMDAwMDEwCS8qIGFsbCB3cml0ZXMgYXBwZW5kICovCisjZGVmaW5lIFhGU19YRkxBR19TWU5DCQkweDAwMDAwMDIwCS8qIGFsbCB3cml0ZXMgc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX05PQVRJTUUJMHgwMDAwMDA0MAkvKiBkbyBub3QgdXBkYXRlIGFjY2VzcyB0aW1lICovCisjZGVmaW5lIFhGU19YRkxBR19OT0RVTVAJMHgwMDAwMDA4MAkvKiBkbyBub3QgaW5jbHVkZSBpbiBiYWNrdXBzICovCisjZGVmaW5lIFhGU19YRkxBR19SVElOSEVSSVQJMHgwMDAwMDEwMAkvKiBjcmVhdGUgd2l0aCBydCBiaXQgc2V0ICovCisjZGVmaW5lIFhGU19YRkxBR19QUk9KSU5IRVJJVAkweDAwMDAwMjAwCS8qIGNyZWF0ZSB3aXRoIHBhcmVudHMgcHJvamlkICovCisjZGVmaW5lIFhGU19YRkxBR19OT1NZTUxJTktTCTB4MDAwMDA0MDAJLyogZGlzYWxsb3cgc3ltbGluayBjcmVhdGlvbiAqLworI2RlZmluZSBYRlNfWEZMQUdfRVhUU0laRQkweDAwMDAwODAwCS8qIGV4dGVudCBzaXplIGFsbG9jYXRvciBoaW50ICovCisjZGVmaW5lIFhGU19YRkxBR19FWFRTWklOSEVSSVQJMHgwMDAwMTAwMAkvKiBpbmhlcml0IGlub2RlIGV4dGVudCBzaXplICovCisjZGVmaW5lIFhGU19YRkxBR19OT0RFRlJBRwkweDAwMDAyMDAwICAJLyogZG8gbm90IGRlZnJhZ21lbnQgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0ZJTEVTVFJFQU0JMHgwMDAwNDAwMAkvKiB1c2UgZmlsZXN0cmVhbSBhbGxvY2F0b3IgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0hBU0FUVFIJMHg4MDAwMDAwMAkvKiBubyBESUZMQUcgZm9yIHRoaXMJKi8KKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgWEZTX0lPQ19HRVRCTUFQLgorICogT24gaW5wdXQsIGZpbGwgaW4gYm12X29mZnNldCBhbmQgYm12X2xlbmd0aCBvZiB0aGUgZmlyc3Qgc3RydWN0dXJlCisgKiB0byBpbmRpY2F0ZSB0aGUgYXJlYSBvZiBpbnRlcmVzdCBpbiB0aGUgZmlsZSwgYW5kIGJtdl9lbnRyaWVzIHdpdGgKKyAqIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgZ2l2ZW4gYmFjay4gIFRoZSBmaXJzdCBzdHJ1Y3R1cmUgaXMKKyAqIHVwZGF0ZWQgb24gcmV0dXJuIHRvIGdpdmUgdGhlIG9mZnNldCBhbmQgbGVuZ3RoIGZvciB0aGUgbmV4dCBjYWxsLgorICovCitzdHJ1Y3QgZ2V0Ym1hcCB7CisJaW50NjRfdAkJYm12X29mZnNldDsJLyogZmlsZSBvZmZzZXQgb2Ygc2VnbWVudCBpbiBibG9ja3MgKi8KKwlpbnQ2NF90CQlibXZfYmxvY2s7CS8qIHN0YXJ0aW5nIGJsb2NrICg2NC1iaXQgZGFkZHJfdCkgICovCisJaW50NjRfdAkJYm12X2xlbmd0aDsJLyogbGVuZ3RoIG9mIHNlZ21lbnQsIGJsb2NrcwkgICAgKi8KKwlpbnQzMl90CQlibXZfY291bnQ7CS8qICMgb2YgZW50cmllcyBpbiBhcnJheSBpbmNsLiAxc3QgICovCisJaW50MzJfdAkJYm12X2VudHJpZXM7CS8qICMgb2YgZW50cmllcyBmaWxsZWQgaW4gKG91dHB1dCkgICovCit9OworCisvKgorICoJU3RydWN0dXJlIGZvciBYRlNfSU9DX0dFVEJNQVBYLgkgRmllbGRzIGJtdl9vZmZzZXQgdGhyb3VnaCBibXZfZW50cmllcworICoJYXJlIHVzZWQgZXhhY3RseSBhcyBpbiB0aGUgZ2V0Ym1hcCBzdHJ1Y3R1cmUuICBUaGUgZ2V0Ym1hcHggc3RydWN0dXJlCisgKgloYXMgYWRkaXRpb25hbCBibXZfaWZsYWdzIGFuZCBibXZfb2ZsYWdzIGZpZWxkcy4gVGhlIGJtdl9pZmxhZ3MgZmllbGQKKyAqCWlzIG9ubHkgdXNlZCBmb3IgdGhlIGZpcnN0IHN0cnVjdHVyZS4gIEl0IGNvbnRhaW5zIGlucHV0IGZsYWdzCisgKglzcGVjaWZ5aW5nIFhGU19JT0NfR0VUQk1BUFggYWN0aW9ucy4gIFRoZSBibXZfb2ZsYWdzIGZpZWxkIGlzIGZpbGxlZAorICoJaW4gYnkgdGhlIFhGU19JT0NfR0VUQk1BUFggY29tbWFuZCBmb3IgZWFjaCByZXR1cm5lZCBzdHJ1Y3R1cmUgYWZ0ZXIKKyAqCXRoZSBmaXJzdC4KKyAqLworc3RydWN0IGdldGJtYXB4IHsKKwlpbnQ2NF90CQlibXZfb2Zmc2V0OwkvKiBmaWxlIG9mZnNldCBvZiBzZWdtZW50IGluIGJsb2NrcyAqLworCWludDY0X3QJCWJtdl9ibG9jazsJLyogc3RhcnRpbmcgYmxvY2sgKDY0LWJpdCBkYWRkcl90KSAgKi8KKwlpbnQ2NF90CQlibXZfbGVuZ3RoOwkvKiBsZW5ndGggb2Ygc2VnbWVudCwgYmxvY2tzCSAgICAqLworCWludDMyX3QJCWJtdl9jb3VudDsJLyogIyBvZiBlbnRyaWVzIGluIGFycmF5IGluY2wuIDFzdCAgKi8KKwlpbnQzMl90CQlibXZfZW50cmllczsJLyogIyBvZiBlbnRyaWVzIGZpbGxlZCBpbiAob3V0cHV0KS4gKi8KKwlpbnQzMl90CQlibXZfaWZsYWdzOwkvKiBpbnB1dCBmbGFncyAoMXN0IHN0cnVjdHVyZSkJICAgICovCisJaW50MzJfdAkJYm12X29mbGFnczsJLyogb3V0cHV0IGZsYWdzIChhZnRlciAxc3Qgc3RydWN0dXJlKSovCisJaW50MzJfdAkJYm12X3VudXNlZDE7CS8qIGZ1dHVyZSB1c2UJCQkgICAgKi8KKwlpbnQzMl90CQlibXZfdW51c2VkMjsJLyogZnV0dXJlIHVzZQkJCSAgICAqLworfTsKKworLyoJYm12X2lmbGFncyB2YWx1ZXMgLSBzZXQgYnkgWEZTX0lPQ19HRVRCTUFQWCBjYWxsZXIuCSovCisjZGVmaW5lIEJNVl9JRl9BVFRSRk9SSwkJMHgxCS8qIHJldHVybiBhdHRyIGZvcmsgcmF0aGVyIHRoYW4gZGF0YSAqLworI2RlZmluZSBCTVZfSUZfTk9fRE1BUElfUkVBRAkweDIJLyogRG8gbm90IGdlbmVyYXRlIERNQVBJIHJlYWQgZXZlbnQgICovCisjZGVmaW5lIEJNVl9JRl9QUkVBTExPQwkJMHg0CS8qIHJ0biBzdGF0dXMgQk1WX09GX1BSRUFMTE9DIGlmIHJlcSAqLworI2RlZmluZSBCTVZfSUZfREVMQUxMT0MJCTB4OAkvKiBydG4gc3RhdHVzIEJNVl9PRl9ERUxBTExPQyBpZiByZXEgKi8KKyNkZWZpbmUgQk1WX0lGX05PX0hPTEVTCQkweDEwCS8qIERvIG5vdCByZXR1cm4gaG9sZXMgKi8KKyNkZWZpbmUgQk1WX0lGX1ZBTElECVwKKwkoQk1WX0lGX0FUVFJGT1JLfEJNVl9JRl9OT19ETUFQSV9SRUFEfEJNVl9JRl9QUkVBTExPQ3wJXAorCSBCTVZfSUZfREVMQUxMT0N8Qk1WX0lGX05PX0hPTEVTKQorCisvKglibXZfb2ZsYWdzIHZhbHVlcyAtIHJldHVybmVkIGZvciBlYWNoIG5vbi1oZWFkZXIgc2VnbWVudCAqLworI2RlZmluZSBCTVZfT0ZfUFJFQUxMT0MJCTB4MQkvKiBzZWdtZW50ID0gdW53cml0dGVuIHByZS1hbGxvY2F0aW9uICovCisjZGVmaW5lIEJNVl9PRl9ERUxBTExPQwkJMHgyCS8qIHNlZ21lbnQgPSBkZWxheWVkIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgQk1WX09GX0xBU1QJCTB4NAkvKiBzZWdtZW50IGlzIHRoZSBsYXN0IGluIHRoZSBmaWxlICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIFhGU19JT0NfRlNTRVRETS4KKyAqIEZvciB1c2UgYnkgYmFja3VwIGFuZCByZXN0b3JlIHByb2dyYW1zIHRvIHNldCB0aGUgWEZTIG9uLWRpc2sgaW5vZGUKKyAqIGZpZWxkcyBkaV9kbWV2bWFzayBhbmQgZGlfZG1zdGF0ZS4gIFRoZXNlIG11c3QgYmUgc2V0IHRvIGV4YWN0bHkgYW5kCisgKiBvbmx5IHZhbHVlcyBwcmV2aW91c2x5IG9idGFpbmVkIHZpYSB4ZnNfYnVsa3N0YXQhICAoU3BlY2lmaWNhbGx5IHRoZQorICogeGZzX2JzdGF0X3QgZmllbGRzIGJzX2RtZXZtYXNrIGFuZCBic19kbXN0YXRlLikKKyAqLworc3RydWN0IGZzZG1pZGF0YSB7CisJdWludDMyX3QJCWZzZF9kbWV2bWFzazsJLyogY29ycmVzcG9uZHMgdG8gZGlfZG1ldm1hc2sgKi8KKwlfX3UxNgkJZnNkX3BhZGRpbmc7CisJX191MTYJCWZzZF9kbXN0YXRlOwkvKiBjb3JyZXNwb25kcyB0byBkaV9kbXN0YXRlICAqLworfTsKKworLyoKKyAqIEZpbGUgc2VnbWVudCBsb2NraW5nIHNldCBkYXRhIHR5cGUgZm9yIDY0IGJpdCBhY2Nlc3MuCisgKiBBbHNvIHVzZWQgZm9yIGFsbCB0aGUgUkVTVi9GUkVFIGludGVyZmFjZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mbG9jazY0IHsKKwlfX3MxNgkJbF90eXBlOworCV9fczE2CQlsX3doZW5jZTsKKwlpbnQ2NF90CQlsX3N0YXJ0OworCWludDY0X3QJCWxfbGVuOwkJLyogbGVuID09IDAgbWVhbnMgdW50aWwgZW5kIG9mIGZpbGUgKi8KKwlpbnQzMl90CQlsX3N5c2lkOworCXVpbnQzMl90CQlsX3BpZDsKKwlpbnQzMl90CQlsX3BhZFs0XTsJLyogcmVzZXJ2ZSBhcmVhCQkJICAgICovCit9IHhmc19mbG9jazY0X3Q7CisKKy8qCisgKiBPdXRwdXQgZm9yIFhGU19JT0NfRlNHRU9NRVRSWV9WMQorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9nZW9tX3YxIHsKKwl1aW50MzJfdAkJYmxvY2tzaXplOwkvKiBmaWxlc3lzdGVtIChkYXRhKSBibG9jayBzaXplICovCisJdWludDMyX3QJCXJ0ZXh0c2l6ZTsJLyogcmVhbHRpbWUgZXh0ZW50IHNpemUJCSovCisJdWludDMyX3QJCWFnYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiBhbiBBRwkJKi8KKwl1aW50MzJfdAkJYWdjb3VudDsJLyogbnVtYmVyIG9mIGFsbG9jYXRpb24gZ3JvdXBzCSovCisJdWludDMyX3QJCWxvZ2Jsb2NrczsJLyogZnNibG9ja3MgaW4gdGhlIGxvZwkJKi8KKwl1aW50MzJfdAkJc2VjdHNpemU7CS8qIChkYXRhKSBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwl1aW50MzJfdAkJaW5vZGVzaXplOwkvKiBpbm9kZSBzaXplIGluIGJ5dGVzCQkqLworCXVpbnQzMl90CQlpbWF4cGN0OwkvKiBtYXggYWxsb3dlZCBpbm9kZSBzcGFjZSglKQkqLworCXVpbnQ2NF90CQlkYXRhYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiBkYXRhIHN1YnZvbHVtZQkqLworCXVpbnQ2NF90CQlydGJsb2NrczsJLyogZnNibG9ja3MgaW4gcmVhbHRpbWUgc3Vidm9sCSovCisJdWludDY0X3QJCXJ0ZXh0ZW50czsJLyogcnQgZXh0ZW50cyBpbiByZWFsdGltZSBzdWJ2b2wqLworCXVpbnQ2NF90CQlsb2dzdGFydDsJLyogc3RhcnRpbmcgZnNibG9jayBvZiB0aGUgbG9nCSovCisJdW5zaWduZWQgY2hhcgl1dWlkWzE2XTsJLyogdW5pcXVlIGlkIG9mIHRoZSBmaWxlc3lzdGVtCSovCisJdWludDMyX3QJCXN1bml0OwkJLyogc3RyaXBlIHVuaXQsIGZzYmxvY2tzCSovCisJdWludDMyX3QJCXN3aWR0aDsJCS8qIHN0cmlwZSB3aWR0aCwgZnNibG9ja3MJKi8KKwlpbnQzMl90CQl2ZXJzaW9uOwkvKiBzdHJ1Y3R1cmUgdmVyc2lvbgkJKi8KKwl1aW50MzJfdAkJZmxhZ3M7CQkvKiBzdXBlcmJsb2NrIHZlcnNpb24gZmxhZ3MJKi8KKwl1aW50MzJfdAkJbG9nc2VjdHNpemU7CS8qIGxvZyBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwl1aW50MzJfdAkJcnRzZWN0c2l6ZTsJLyogcmVhbHRpbWUgc2VjdG9yIHNpemUsIGJ5dGVzCSovCisJdWludDMyX3QJCWRpcmJsb2Nrc2l6ZTsJLyogZGlyZWN0b3J5IGJsb2NrIHNpemUsIGJ5dGVzCSovCit9IHhmc19mc29wX2dlb21fdjFfdDsKKworLyoKKyAqIE91dHB1dCBmb3IgWEZTX0lPQ19GU0dFT01FVFJZCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2dlb20geworCXVpbnQzMl90CQlibG9ja3NpemU7CS8qIGZpbGVzeXN0ZW0gKGRhdGEpIGJsb2NrIHNpemUgKi8KKwl1aW50MzJfdAkJcnRleHRzaXplOwkvKiByZWFsdGltZSBleHRlbnQgc2l6ZQkJKi8KKwl1aW50MzJfdAkJYWdibG9ja3M7CS8qIGZzYmxvY2tzIGluIGFuIEFHCQkqLworCXVpbnQzMl90CQlhZ2NvdW50OwkvKiBudW1iZXIgb2YgYWxsb2NhdGlvbiBncm91cHMJKi8KKwl1aW50MzJfdAkJbG9nYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiB0aGUgbG9nCQkqLworCXVpbnQzMl90CQlzZWN0c2l6ZTsJLyogKGRhdGEpIHNlY3RvciBzaXplLCBieXRlcwkqLworCXVpbnQzMl90CQlpbm9kZXNpemU7CS8qIGlub2RlIHNpemUgaW4gYnl0ZXMJCSovCisJdWludDMyX3QJCWltYXhwY3Q7CS8qIG1heCBhbGxvd2VkIGlub2RlIHNwYWNlKCUpCSovCisJdWludDY0X3QJCWRhdGFibG9ja3M7CS8qIGZzYmxvY2tzIGluIGRhdGEgc3Vidm9sdW1lCSovCisJdWludDY0X3QJCXJ0YmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiByZWFsdGltZSBzdWJ2b2wJKi8KKwl1aW50NjRfdAkJcnRleHRlbnRzOwkvKiBydCBleHRlbnRzIGluIHJlYWx0aW1lIHN1YnZvbCovCisJdWludDY0X3QJCWxvZ3N0YXJ0OwkvKiBzdGFydGluZyBmc2Jsb2NrIG9mIHRoZSBsb2cJKi8KKwl1bnNpZ25lZCBjaGFyCXV1aWRbMTZdOwkvKiB1bmlxdWUgaWQgb2YgdGhlIGZpbGVzeXN0ZW0JKi8KKwl1aW50MzJfdAkJc3VuaXQ7CQkvKiBzdHJpcGUgdW5pdCwgZnNibG9ja3MJKi8KKwl1aW50MzJfdAkJc3dpZHRoOwkJLyogc3RyaXBlIHdpZHRoLCBmc2Jsb2NrcwkqLworCWludDMyX3QJCXZlcnNpb247CS8qIHN0cnVjdHVyZSB2ZXJzaW9uCQkqLworCXVpbnQzMl90CQlmbGFnczsJCS8qIHN1cGVyYmxvY2sgdmVyc2lvbiBmbGFncwkqLworCXVpbnQzMl90CQlsb2dzZWN0c2l6ZTsJLyogbG9nIHNlY3RvciBzaXplLCBieXRlcwkqLworCXVpbnQzMl90CQlydHNlY3RzaXplOwkvKiByZWFsdGltZSBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwl1aW50MzJfdAkJZGlyYmxvY2tzaXplOwkvKiBkaXJlY3RvcnkgYmxvY2sgc2l6ZSwgYnl0ZXMJKi8KKwl1aW50MzJfdAkJbG9nc3VuaXQ7CS8qIGxvZyBzdHJpcGUgdW5pdCwgYnl0ZXMgKi8KK30geGZzX2Zzb3BfZ2VvbV90OworCisvKiBPdXRwdXQgZm9yIFhGU19GU19DT1VOVFMgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2NvdW50cyB7CisJdWludDY0X3QJZnJlZWRhdGE7CS8qIGZyZWUgZGF0YSBzZWN0aW9uIGJsb2NrcyAqLworCXVpbnQ2NF90CWZyZWVydHg7CS8qIGZyZWUgcnQgZXh0ZW50cyAqLworCXVpbnQ2NF90CWZyZWVpbm87CS8qIGZyZWUgaW5vZGVzICovCisJdWludDY0X3QJYWxsb2Npbm87CS8qIHRvdGFsIGFsbG9jYXRlZCBpbm9kZXMgKi8KK30geGZzX2Zzb3BfY291bnRzX3Q7CisKKy8qIElucHV0L091dHB1dCBmb3IgWEZTX0dFVF9SRVNCTEtTIGFuZCBYRlNfU0VUX1JFU0JMS1MgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX3Jlc2Jsa3MgeworCXVpbnQ2NF90ICByZXNibGtzOworCXVpbnQ2NF90ICByZXNibGtzX2F2YWlsOworfSB4ZnNfZnNvcF9yZXNibGtzX3Q7CisKKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9WRVJTSU9OCTAKKworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0FUVFIJMHgwMDAxCS8qIGF0dHJpYnV0ZXMgaW4gdXNlCSovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfTkxJTksJMHgwMDAyCS8qIDMyLWJpdCBubGluayB2YWx1ZXMJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19RVU9UQQkweDAwMDQJLyogcXVvdGFzIGVuYWJsZWQJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19JQUxJR04JMHgwMDA4CS8qIGlub2RlIGFsaWdubWVudAkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0RBTElHTgkweDAwMTAJLyogbGFyZ2UgZGF0YSBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19TSEFSRUQJMHgwMDIwCS8qIHJlYWQtb25seSBzaGFyZWQJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19FWFRGTEcJMHgwMDQwCS8qIHNwZWNpYWwgZXh0ZW50IGZsYWcJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19ESVJWMgkweDAwODAJLyogZGlyZWN0b3J5IHZlcnNpb24gMgkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0xPR1YyCTB4MDEwMAkvKiBsb2cgZm9ybWF0IHZlcnNpb24gMgkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX1NFQ1RPUgkweDAyMDAJLyogc2VjdG9yIHNpemVzID4xQkIJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19BVFRSMgkweDA0MDAJLyogaW5saW5lIGF0dHJpYnV0ZXMgcmV3b3JrICovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfRElSVjJDSQkweDEwMDAJLyogQVNDSUkgb25seSBDSSBuYW1lcyAqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0xBWllTQgkweDQwMDAJLyogbGF6eSBzdXBlcmJsb2NrIGNvdW50ZXJzICovCisKKworLyoKKyAqIE1pbmltdW0gYW5kIG1heGltdW0gc2l6ZXMgbmVlZCBmb3IgZ3Jvd3RoIGNoZWNrcworICovCisjZGVmaW5lIFhGU19NSU5fQUdfQkxPQ0tTCTY0CisjZGVmaW5lIFhGU19NSU5fTE9HX0JMT0NLUwk1MTJVTEwKKyNkZWZpbmUgWEZTX01BWF9MT0dfQkxPQ0tTCSgxMDI0ICogMTAyNFVMTCkKKyNkZWZpbmUgWEZTX01JTl9MT0dfQllURVMJKDEwICogMTAyNCAqIDEwMjRVTEwpCisKKy8qIGtlZXAgdGhlIG1heGltdW0gc2l6ZSB1bmRlciAyXjMxIGJ5IGEgc21hbGwgYW1vdW50ICovCisjZGVmaW5lIFhGU19NQVhfTE9HX0JZVEVTIFwKKwkoKDIgKiAxMDI0ICogMTAyNCAqIDEwMjRVTEwpIC0gWEZTX01JTl9MT0dfQllURVMpCisKKy8qIFVzZWQgZm9yIHNhbml0eSBjaGVja3Mgb24gc3VwZXJibG9jayAqLworI2RlZmluZSBYRlNfTUFYX0RCTE9DS1MocykgKCh4ZnNfZHJmc2Jub190KShzKS0+c2JfYWdjb3VudCAqIChzKS0+c2JfYWdibG9ja3MpCisjZGVmaW5lIFhGU19NSU5fREJMT0NLUyhzKSAoKHhmc19kcmZzYm5vX3QpKChzKS0+c2JfYWdjb3VudCAtIDEpICoJXAorCQkJIChzKS0+c2JfYWdibG9ja3MgKyBYRlNfTUlOX0FHX0JMT0NLUykKKworLyoKKyAqIFN0cnVjdHVyZXMgZm9yIFhGU19JT0NfRlNHUk9XRlNEQVRBLCBYRlNfSU9DX0ZTR1JPV0ZTTE9HICYgWEZTX0lPQ19GU0dST1dGU1JUCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19ncm93ZnNfZGF0YSB7CisJdWludDY0X3QJCW5ld2Jsb2NrczsJLyogbmV3IGRhdGEgc3Vidm9sIHNpemUsIGZzYmxvY2tzICovCisJdWludDMyX3QJCWltYXhwY3Q7CS8qIG5ldyBpbm9kZSBzcGFjZSBwZXJjZW50YWdlIGxpbWl0ICovCit9IHhmc19ncm93ZnNfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZ3Jvd2ZzX2xvZyB7CisJdWludDMyX3QJCW5ld2Jsb2NrczsJLyogbmV3IGxvZyBzaXplLCBmc2Jsb2NrcyAqLworCXVpbnQzMl90CQlpc2ludDsJCS8qIDEgaWYgbmV3IGxvZyBpcyBpbnRlcm5hbCAqLworfSB4ZnNfZ3Jvd2ZzX2xvZ190OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZ3Jvd2ZzX3J0IHsKKwl1aW50NjRfdAkJbmV3YmxvY2tzOwkvKiBuZXcgcmVhbHRpbWUgc2l6ZSwgZnNibG9ja3MgKi8KKwl1aW50MzJfdAkJZXh0c2l6ZTsJLyogbmV3IHJlYWx0aW1lIGV4dGVudCBzaXplLCBmc2Jsb2NrcyAqLworfSB4ZnNfZ3Jvd2ZzX3J0X3Q7CisKKworLyoKKyAqIFN0cnVjdHVyZXMgcmV0dXJuZWQgZnJvbSBpb2N0bCBYRlNfSU9DX0ZTQlVMS1NUQVQgJiBYRlNfSU9DX0ZTQlVMS1NUQVRfU0lOR0xFCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19ic3RpbWUgeworCXRpbWVfdAkJdHZfc2VjOwkJLyogc2Vjb25kcwkJKi8KKwlpbnQzMl90CQl0dl9uc2VjOwkvKiBhbmQgbmFub3NlY29uZHMJKi8KK30geGZzX2JzdGltZV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnN0YXQgeworCXVpbnQ2NF90CQlic19pbm87CQkvKiBpbm9kZSBudW1iZXIJCQkqLworCV9fdTE2CQlic19tb2RlOwkvKiB0eXBlIGFuZCBtb2RlCQkqLworCV9fdTE2CQlic19ubGluazsJLyogbnVtYmVyIG9mIGxpbmtzCQkqLworCXVpbnQzMl90CQlic191aWQ7CQkvKiB1c2VyIGlkCQkJKi8KKwl1aW50MzJfdAkJYnNfZ2lkOwkJLyogZ3JvdXAgaWQJCQkqLworCXVpbnQzMl90CQlic19yZGV2OwkvKiBkZXZpY2UgdmFsdWUJCQkqLworCWludDMyX3QJCWJzX2Jsa3NpemU7CS8qIGJsb2NrIHNpemUJCQkqLworCWludDY0X3QJCWJzX3NpemU7CS8qIGZpbGUgc2l6ZQkJCSovCisJeGZzX2JzdGltZV90CWJzX2F0aW1lOwkvKiBhY2Nlc3MgdGltZQkJCSovCisJeGZzX2JzdGltZV90CWJzX210aW1lOwkvKiBtb2RpZnkgdGltZQkJCSovCisJeGZzX2JzdGltZV90CWJzX2N0aW1lOwkvKiBpbm9kZSBjaGFuZ2UgdGltZQkJKi8KKwlpbnQ2NF90CQlic19ibG9ja3M7CS8qIG51bWJlciBvZiBibG9ja3MJCSovCisJdWludDMyX3QJCWJzX3hmbGFnczsJLyogZXh0ZW5kZWQgZmxhZ3MJCSovCisJaW50MzJfdAkJYnNfZXh0c2l6ZTsJLyogZXh0ZW50IHNpemUJCQkqLworCWludDMyX3QJCWJzX2V4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzCQkqLworCXVpbnQzMl90CQlic19nZW47CQkvKiBnZW5lcmF0aW9uIGNvdW50CQkqLworCV9fdTE2CQlic19wcm9qaWRfbG87CS8qIGxvd2VyIHBhcnQgb2YgcHJvamVjdCBpZAkqLworI2RlZmluZQlic19wcm9qaWQJYnNfcHJvamlkX2xvCS8qIChwcmV2aW91c2x5IGp1c3QgYnNfcHJvamlkKQkqLworCV9fdTE2CQlic19mb3Jrb2ZmOwkvKiBpbm9kZSBmb3JrIG9mZnNldCBpbiBieXRlcwkqLworCV9fdTE2CQlic19wcm9qaWRfaGk7CS8qIGhpZ2hlciBwYXJ0IG9mIHByb2plY3QgaWQJKi8KKwl1bnNpZ25lZCBjaGFyCWJzX3BhZFsxMF07CS8qIHBhZCBzcGFjZSwgdW51c2VkCQkqLworCXVpbnQzMl90CQlic19kbWV2bWFzazsJLyogRE1JRyBldmVudCBtYXNrCQkqLworCV9fdTE2CQlic19kbXN0YXRlOwkvKiBETUlHIHN0YXRlIGluZm8JCSovCisJX191MTYJCWJzX2FleHRlbnRzOwkvKiBhdHRyaWJ1dGUgbnVtYmVyIG9mIGV4dGVudHMJKi8KK30geGZzX2JzdGF0X3Q7CisKKy8qCisgKiBUaGUgdXNlci1sZXZlbCBCdWxrU3RhdCBSZXF1ZXN0IGludGVyZmFjZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2J1bGtyZXEgeworCXVpbnQ2NF90CQlfX3VzZXIgKmxhc3RpcDsJLyogbGFzdCBpbm9kZSAjIHBvaW50ZXIJCSovCisJaW50MzJfdAkJaWNvdW50OwkJLyogY291bnQgb2YgZW50cmllcyBpbiBidWZmZXIJKi8KKwl2b2lkCQlfX3VzZXIgKnVidWZmZXI7LyogdXNlciBidWZmZXIgZm9yIGlub2RlIGRlc2MuCSovCisJaW50MzJfdAkJX191c2VyICpvY291bnQ7CS8qIG91dHB1dCBjb3VudCBwb2ludGVyCQkqLworfSB4ZnNfZnNvcF9idWxrcmVxX3Q7CisKKworLyoKKyAqIFN0cnVjdHVyZXMgcmV0dXJuZWQgZnJvbSB4ZnNfaW51bWJlcnMgcm91dGluZSAoWEZTX0lPQ19GU0lOVU1CRVJTKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2lub2dycCB7CisJdWludDY0X3QJCXhpX3N0YXJ0aW5vOwkvKiBzdGFydGluZyBpbm9kZSBudW1iZXIJKi8KKwlpbnQzMl90CQl4aV9hbGxvY2NvdW50OwkvKiAjIGJpdHMgc2V0IGluIGFsbG9jbWFzawkqLworCXVpbnQ2NF90CQl4aV9hbGxvY21hc2s7CS8qIG1hc2sgb2YgYWxsb2NhdGVkIGlub2RlcwkqLworfSB4ZnNfaW5vZ3JwX3Q7CisKKworLyoKKyAqIEVycm9yIGluamVjdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbiB7CisJaW50MzJfdAkJZmQ7CisJaW50MzJfdAkJZXJydGFnOworfSB4ZnNfZXJyb3JfaW5qZWN0aW9uX3Q7CisKKworLyoKKyAqIFRoZSB1c2VyLWxldmVsIEhhbmRsZSBSZXF1ZXN0IGludGVyZmFjZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSB7CisJdWludDMyX3QJCWZkOwkJLyogZmQgZm9yIEZEX1RPX0hBTkRMRQkJKi8KKwl2b2lkCQlfX3VzZXIgKnBhdGg7CS8qIHVzZXIgcGF0aG5hbWUJCSovCisJdWludDMyX3QJCW9mbGFnczsJCS8qIG9wZW4gZmxhZ3MJCQkqLworCXZvaWQJCV9fdXNlciAqaWhhbmRsZTsvKiB1c2VyIHN1cHBsaWVkIGhhbmRsZQkJKi8KKwl1aW50MzJfdAkJaWhhbmRsZW47CS8qIHVzZXIgc3VwcGxpZWQgbGVuZ3RoCQkqLworCXZvaWQJCV9fdXNlciAqb2hhbmRsZTsvKiB1c2VyIGJ1ZmZlciBmb3IgaGFuZGxlCSovCisJdWludDMyX3QJCV9fdXNlciAqb2hhbmRsZW47LyogdXNlciBidWZmZXIgbGVuZ3RoCQkqLworfSB4ZnNfZnNvcF9oYW5kbGVyZXFfdDsKKworLyoKKyAqIENvbXBvdW5kIHN0cnVjdHVyZXMgZm9yIHBhc3NpbmcgYXJncyB0aHJvdWdoIEhhbmRsZSBSZXF1ZXN0IGludGVyZmFjZXMKKyAqIHhmc19mc3NldGRtX2J5X2hhbmRsZSwgeGZzX2F0dHJsaXN0X2J5X2hhbmRsZSwgeGZzX2F0dHJtdWx0aV9ieV9oYW5kbGUKKyAqIC0gaW9jdGxzOiBYRlNfSU9DX0ZTU0VURE1fQllfSEFORExFLCBYRlNfSU9DX0FUVFJMSVNUX0JZX0hBTkRMRSwgYW5kCisgKgkgICAgIFhGU19JT0NfQVRUUk1VTFRJX0JZX0hBTkRMRQorICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX3NldGRtX2hhbmRsZXJlcSB7CisJc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcQlocmVxOwkvKiBoYW5kbGUgaW5mb3JtYXRpb24JKi8KKwlzdHJ1Y3QgZnNkbWlkYXRhCQlfX3VzZXIgKmRhdGE7CS8qIERNQVBJIGRhdGEJKi8KK30geGZzX2Zzb3Bfc2V0ZG1faGFuZGxlcmVxX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRybGlzdF9jdXJzb3IgeworCXVpbnQzMl90CQlvcGFxdWVbNF07Cit9IHhmc19hdHRybGlzdF9jdXJzb3JfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Zzb3BfYXR0cmxpc3RfaGFuZGxlcmVxIHsKKwlzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxCWhyZXE7IC8qIGhhbmRsZSBpbnRlcmZhY2Ugc3RydWN0dXJlICovCisJc3RydWN0IHhmc19hdHRybGlzdF9jdXJzb3IJcG9zOyAvKiBvcGFxdWUgY29va2llLCBsaXN0IG9mZnNldCAqLworCXVpbnQzMl90CQkJCWZsYWdzOwkvKiB3aGljaCBuYW1lc3BhY2UgdG8gdXNlICovCisJdWludDMyX3QJCQkJYnVmbGVuOwkvKiBsZW5ndGggb2YgYnVmZmVyIHN1cHBsaWVkICovCisJdm9pZAkJCQlfX3VzZXIgKmJ1ZmZlcjsJLyogcmV0dXJuZWQgbmFtZXMgKi8KK30geGZzX2Zzb3BfYXR0cmxpc3RfaGFuZGxlcmVxX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX211bHRpb3AgeworCXVpbnQzMl90CQlhbV9vcGNvZGU7CisjZGVmaW5lIEFUVFJfT1BfR0VUCTEJLyogcmV0dXJuIHRoZSBpbmRpY2F0ZWQgYXR0cidzIHZhbHVlICovCisjZGVmaW5lIEFUVFJfT1BfU0VUCTIJLyogc2V0L2NyZWF0ZSB0aGUgaW5kaWNhdGVkIGF0dHIvdmFsdWUgcGFpciAqLworI2RlZmluZSBBVFRSX09QX1JFTU9WRQkzCS8qIHJlbW92ZSB0aGUgaW5kaWNhdGVkIGF0dHIgKi8KKwlpbnQzMl90CQlhbV9lcnJvcjsKKwl2b2lkCQlfX3VzZXIgKmFtX2F0dHJuYW1lOworCXZvaWQJCV9fdXNlciAqYW1fYXR0cnZhbHVlOworCXVpbnQzMl90CQlhbV9sZW5ndGg7CisJdWludDMyX3QJCWFtX2ZsYWdzOworfSB4ZnNfYXR0cl9tdWx0aW9wX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXEgeworCXN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEJaHJlcTsgLyogaGFuZGxlIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KKwl1aW50MzJfdAkJCQlvcGNvdW50Oy8qIGNvdW50IG9mIGZvbGxvd2luZyBtdWx0aW9wICovCisJc3RydWN0IHhmc19hdHRyX211bHRpb3AJCV9fdXNlciAqb3BzOyAvKiBhdHRyX211bHRpIGRhdGEgKi8KK30geGZzX2Zzb3BfYXR0cm11bHRpX2hhbmRsZXJlcV90OworCisvKgorICogcGVyIG1hY2hpbmUgdW5pcXVlIGZpbGVzeXN0ZW0gaWRlbnRpZmllciB0eXBlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyB1aW50MzJfdCB2YWxbMl07IH0geGZzX2ZzaWRfdDsgLyogZmlsZSBzeXN0ZW0gaWQgdHlwZSAqLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZmlkIHsKKwlfX3UxNglmaWRfbGVuOwkJLyogbGVuZ3RoIG9mIHJlbWFpbmRlcgkqLworCV9fdTE2CWZpZF9wYWQ7CisJdWludDMyX3QJZmlkX2dlbjsJCS8qIGdlbmVyYXRpb24gbnVtYmVyCSovCisJdWludDY0X3QJZmlkX2lubzsJCS8qIDY0IGJpdHMgaW5vZGUgbnVtYmVyICovCit9IHhmc19maWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2hhbmRsZSB7CisJdW5pb24geworCQlpbnQ2NF90CSAgICBhbGlnbjsJLyogZm9yY2UgYWxpZ25tZW50IG9mIGhhX2ZpZAkgKi8KKwkJeGZzX2ZzaWRfdCAgX2hhX2ZzaWQ7CS8qIHVuaXF1ZSBmaWxlIHN5c3RlbSBpZGVudGlmaWVyICovCisJfSBoYV91OworCXhmc19maWRfdAloYV9maWQ7CQkvKiBmaWxlIHN5c3RlbSBzcGVjaWZpYyBmaWxlIElECSAqLworfSB4ZnNfaGFuZGxlX3Q7CisjZGVmaW5lIGhhX2ZzaWQgaGFfdS5faGFfZnNpZAorCisjZGVmaW5lIFhGU19IU0laRShoYW5kbGUpCSgoKGNoYXIgKikgJihoYW5kbGUpLmhhX2ZpZC5maWRfcGFkCSBcCisJCQkJIC0gKGNoYXIgKikgJihoYW5kbGUpKQkJCSAgXAorCQkJCSArIChoYW5kbGUpLmhhX2ZpZC5maWRfbGVuKQorCisvKgorICogRmxhZ3MgZm9yIGdvaW5nIGRvd24gb3BlcmF0aW9uCisgKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR09JTkdfRkxBR1NfREVGQVVMVAkJMHgwCS8qIGdvaW5nIGRvd24gKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR09JTkdfRkxBR1NfTE9HRkxVU0gJCTB4MQkvKiBmbHVzaCBsb2cgYnV0IG5vdCBkYXRhICovCisjZGVmaW5lIFhGU19GU09QX0dPSU5HX0ZMQUdTX05PTE9HRkxVU0gJCTB4MgkvKiBkb24ndCBmbHVzaCBsb2cgbm9yIGRhdGEgKi8KKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzIHRoYXQgYXJlIHVzZWQgYnkgTGludXggZmlsZXN5c3RlbXMKKyAqLworI2RlZmluZSBYRlNfSU9DX0dFVFhGTEFHUwlGU19JT0NfR0VURkxBR1MKKyNkZWZpbmUgWEZTX0lPQ19TRVRYRkxBR1MJRlNfSU9DX1NFVEZMQUdTCisjZGVmaW5lIFhGU19JT0NfR0VUVkVSU0lPTglGU19JT0NfR0VUVkVSU0lPTgorCisvKgorICogaW9jdGwgY29tbWFuZHMgdGhhdCByZXBsYWNlIElSSVggZmNudGwoKSdzCisgKiBGb3IgJ2RvY3VtZW50YXRpb24nIHB1cnBvc2VkIG1vcmUgdGhhbiBhbnl0aGluZyBlbHNlLAorICogdGhlICJjbWQgIyIgZmllbGQgcmVmbGVjdHMgdGhlIElSSVggZmNudGwgbnVtYmVyLgorICovCisjZGVmaW5lIFhGU19JT0NfQUxMT0NTUAkJX0lPVyAoJ1gnLCAxMCwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0ZSRUVTUAkJX0lPVyAoJ1gnLCAxMSwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0RJT0lORk8JCV9JT1IgKCdYJywgMzAsIHN0cnVjdCBkaW9hdHRyKQorI2RlZmluZSBYRlNfSU9DX0ZTR0VUWEFUVFIJX0lPUiAoJ1gnLCAzMSwgc3RydWN0IGZzeGF0dHIpCisjZGVmaW5lIFhGU19JT0NfRlNTRVRYQVRUUglfSU9XICgnWCcsIDMyLCBzdHJ1Y3QgZnN4YXR0cikKKyNkZWZpbmUgWEZTX0lPQ19BTExPQ1NQNjQJX0lPVyAoJ1gnLCAzNiwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0ZSRUVTUDY0CV9JT1cgKCdYJywgMzcsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19HRVRCTUFQCQlfSU9XUignWCcsIDM4LCBzdHJ1Y3QgZ2V0Ym1hcCkKKyNkZWZpbmUgWEZTX0lPQ19GU1NFVERNCQlfSU9XICgnWCcsIDM5LCBzdHJ1Y3QgZnNkbWlkYXRhKQorI2RlZmluZSBYRlNfSU9DX1JFU1ZTUAkJX0lPVyAoJ1gnLCA0MCwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX1VOUkVTVlNQCV9JT1cgKCdYJywgNDEsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19SRVNWU1A2NAlfSU9XICgnWCcsIDQyLCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfVU5SRVNWU1A2NAlfSU9XICgnWCcsIDQzLCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfR0VUQk1BUEEJX0lPV1IoJ1gnLCA0NCwgc3RydWN0IGdldGJtYXApCisjZGVmaW5lIFhGU19JT0NfRlNHRVRYQVRUUkEJX0lPUiAoJ1gnLCA0NSwgc3RydWN0IGZzeGF0dHIpCisvKglYRlNfSU9DX1NFVEJJT1NJWkUgLS0tLSBkZXByZWNhdGVkIDQ2CSAgICovCisvKglYRlNfSU9DX0dFVEJJT1NJWkUgLS0tLSBkZXByZWNhdGVkIDQ3CSAgICovCisjZGVmaW5lIFhGU19JT0NfR0VUQk1BUFgJX0lPV1IoJ1gnLCA1Niwgc3RydWN0IGdldGJtYXApCisjZGVmaW5lIFhGU19JT0NfWkVST19SQU5HRQlfSU9XICgnWCcsIDU3LCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcyB0aGF0IHJlcGxhY2UgSVJJWCBzeXNzZ2koKSdzCisgKi8KKyNkZWZpbmUgWEZTX0lPQ19GU0dFT01FVFJZX1YxCSAgICAgX0lPUiAoJ1gnLCAxMDAsIHN0cnVjdCB4ZnNfZnNvcF9nZW9tX3YxKQorI2RlZmluZSBYRlNfSU9DX0ZTQlVMS1NUQVQJICAgICBfSU9XUignWCcsIDEwMSwgc3RydWN0IHhmc19mc29wX2J1bGtyZXEpCisjZGVmaW5lIFhGU19JT0NfRlNCVUxLU1RBVF9TSU5HTEUgICAgX0lPV1IoJ1gnLCAxMDIsIHN0cnVjdCB4ZnNfZnNvcF9idWxrcmVxKQorI2RlZmluZSBYRlNfSU9DX0ZTSU5VTUJFUlMJICAgICBfSU9XUignWCcsIDEwMywgc3RydWN0IHhmc19mc29wX2J1bGtyZXEpCisjZGVmaW5lIFhGU19JT0NfUEFUSF9UT19GU0hBTkRMRSAgICAgX0lPV1IoJ1gnLCAxMDQsIHN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEpCisjZGVmaW5lIFhGU19JT0NfUEFUSF9UT19IQU5ETEUJICAgICBfSU9XUignWCcsIDEwNSwgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19GRF9UT19IQU5ETEUJICAgICBfSU9XUignWCcsIDEwNiwgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19PUEVOX0JZX0hBTkRMRQkgICAgIF9JT1dSKCdYJywgMTA3LCBzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX1JFQURMSU5LX0JZX0hBTkRMRSAgIF9JT1dSKCdYJywgMTA4LCBzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX1NXQVBFWFQJCSAgICAgX0lPV1IoJ1gnLCAxMDksIHN0cnVjdCB4ZnNfc3dhcGV4dCkKKyNkZWZpbmUgWEZTX0lPQ19GU0dST1dGU0RBVEEJICAgICBfSU9XICgnWCcsIDExMCwgc3RydWN0IHhmc19ncm93ZnNfZGF0YSkKKyNkZWZpbmUgWEZTX0lPQ19GU0dST1dGU0xPRwkgICAgIF9JT1cgKCdYJywgMTExLCBzdHJ1Y3QgeGZzX2dyb3dmc19sb2cpCisjZGVmaW5lIFhGU19JT0NfRlNHUk9XRlNSVAkgICAgIF9JT1cgKCdYJywgMTEyLCBzdHJ1Y3QgeGZzX2dyb3dmc19ydCkKKyNkZWZpbmUgWEZTX0lPQ19GU0NPVU5UUwkgICAgIF9JT1IgKCdYJywgMTEzLCBzdHJ1Y3QgeGZzX2Zzb3BfY291bnRzKQorI2RlZmluZSBYRlNfSU9DX1NFVF9SRVNCTEtTCSAgICAgX0lPV1IoJ1gnLCAxMTQsIHN0cnVjdCB4ZnNfZnNvcF9yZXNibGtzKQorI2RlZmluZSBYRlNfSU9DX0dFVF9SRVNCTEtTCSAgICAgX0lPUiAoJ1gnLCAxMTUsIHN0cnVjdCB4ZnNfZnNvcF9yZXNibGtzKQorI2RlZmluZSBYRlNfSU9DX0VSUk9SX0lOSkVDVElPTgkgICAgIF9JT1cgKCdYJywgMTE2LCBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbikKKyNkZWZpbmUgWEZTX0lPQ19FUlJPUl9DTEVBUkFMTAkgICAgIF9JT1cgKCdYJywgMTE3LCBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbikKKy8qCVhGU19JT0NfQVRUUkNUTF9CWV9IQU5ETEUgLS0gZGVwcmVjYXRlZCAxMTgJICovCisvKglYRlNfSU9DX0ZSRUVaRQkJICAtLSBGSUZSRUVaRSAgIDExOQkgKi8KKy8qCVhGU19JT0NfVEhBVwkJICAtLSBGSVRIQVcgICAgIDEyMAkgKi8KKyNkZWZpbmUgWEZTX0lPQ19GU1NFVERNX0JZX0hBTkRMRSAgICBfSU9XICgnWCcsIDEyMSwgc3RydWN0IHhmc19mc29wX3NldGRtX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19BVFRSTElTVF9CWV9IQU5ETEUgICBfSU9XICgnWCcsIDEyMiwgc3RydWN0IHhmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19BVFRSTVVMVElfQllfSEFORExFICBfSU9XICgnWCcsIDEyMywgc3RydWN0IHhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXEpCisjZGVmaW5lIFhGU19JT0NfRlNHRU9NRVRSWQkgICAgIF9JT1IgKCdYJywgMTI0LCBzdHJ1Y3QgeGZzX2Zzb3BfZ2VvbSkKKyNkZWZpbmUgWEZTX0lPQ19HT0lOR0RPV04JICAgICBfSU9SICgnWCcsIDEyNSwgX191aW50MzJfdCkKKy8qCVhGU19JT0NfR0VURlNVVUlEIC0tLS0tLS0tLS0gZGVwcmVjYXRlZCAxNDAJICovCisKKworI2lmbmRlZiBIQVZFX0JCTUFDUk9TCisvKgorICogQmxvY2sgSS9PIHBhcmFtZXRlcml6YXRpb24uCUEgYmFzaWMgYmxvY2sgKEJCKSBpcyB0aGUgbG93ZXN0IHNpemUgb2YKKyAqIGZpbGVzeXN0ZW0gYWxsb2NhdGlvbiwgYW5kIG11c3QgZXF1YWwgNTEyLiAgTGVuZ3RoIHVuaXRzIGdpdmVuIHRvIGJpbworICogcm91dGluZXMgYXJlIGluIEJCJ3MuCisgKi8KKyNkZWZpbmUgQkJTSElGVAkJOQorI2RlZmluZSBCQlNJWkUJCSgxPDxCQlNISUZUKQorI2RlZmluZSBCQk1BU0sJCShCQlNJWkUtMSkKKyNkZWZpbmUgQlRPQkIoYnl0ZXMpCSgoKHVpbnQ2NF90KShieXRlcykgKyBCQlNJWkUgLSAxKSA+PiBCQlNISUZUKQorI2RlZmluZSBCVE9CQlQoYnl0ZXMpCSgodWludDY0X3QpKGJ5dGVzKSA+PiBCQlNISUZUKQorI2RlZmluZSBCQlRPQihiYnMpCSgoYmJzKSA8PCBCQlNISUZUKQorI2VuZGlmCisKKyNlbmRpZgkvKiBYRlNfRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2V4dGxpbnV4L3hmc19zYi5oIGIvZXh0bGludXgveGZzX3NiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3MmQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGxpbnV4L3hmc19zYi5oCkBAIC0wLDAgKzEsNDc2IEBACisvKgorICogVGFrZW4gZnJvbSBMaW51eCBrZXJuZWwgdHJlZSAobGludXgvZnMveGZzKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWxvIEFsY2FudGFyYSA8cGNhY2pyQHp5dG9yLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2lmbmRlZiBYRlNfU0JfSF8KKyNkZWZpbmUJWEZTX1NCX0hfXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dWlkL3V1aWQuaD4KKworLyoKKyAqIFN1cGVyIGJsb2NrCisgKiBGaXRzIGludG8gYSBzZWN0b3Itc2l6ZWQgYnVmZmVyIGF0IGFkZHJlc3MgMCBvZiBlYWNoIGFsbG9jYXRpb24gZ3JvdXAuCisgKiBPbmx5IHRoZSBmaXJzdCBvZiB0aGVzZSBpcyBldmVyIHVwZGF0ZWQgZXhjZXB0IGR1cmluZyBncm93ZnMuCisgKi8KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX21vdW50OworCisjZGVmaW5lCVhGU19TQl9NQUdJQwkJIlhGU0IiCQkvKiAnWEZTQicgKi8KKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fMQkxCQkvKiA1LjMsIDYuMC4xLCA2LjEgKi8KKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fMgkyCQkvKiA2LjIgLSBhdHRyaWJ1dGVzICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OXzMJMwkJLyogNi4yIC0gbmV3IGlub2RlIHZlcnNpb24gKi8KKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fNAk0CQkvKiA2LjIrIC0gYml0bWFzayB2ZXJzaW9uICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX05VTUJJVFMJCTB4MDAwZgorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BTExGQklUUwkJMHhmZmYwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX1NBU0hGQklUUwkweGYwMDAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fUkVBTEZCSVRTCTB4MGZmMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BVFRSQklUCQkweDAwMTAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQJCTB4MDAyMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVAkJMHgwMDQwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FMSUdOQklUCQkweDAwODAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUCTB4MDEwMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQJMHgwMjAwCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0xPR1YyQklUCQkweDA0MDAKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fU0VDVE9SQklUCTB4MDgwMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9FWFRGTEdCSVQJMHgxMDAwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0RJUlYyQklUCQkweDIwMDAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQk9SR0JJVAkJMHg0MDAwCS8qIEFTQ0lJIG9ubHkgY2FzZS1pbnNlbnMuICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUCTB4ODAwMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9PS1NBU0hGQklUUwlcCisJKFhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fRElSVjJCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX0JPUkdCSVQpCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX09LUkVBTEZCSVRTCVwKKwkoWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX1FVT1RBQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9BTElHTkJJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX0xPR1YyQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9TRUNUT1JCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9PS1JFQUxCSVRTCVwKKwkoWEZTX1NCX1ZFUlNJT05fTlVNQklUUyB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fT0tSRUFMRkJJVFMgfCBcCisJIFhGU19TQl9WRVJTSU9OX09LU0FTSEZCSVRTKQorCisvKgorICogVGhlcmUgYXJlIHR3byB3b3JkcyB0byBob2xkIFhGUyAiZmVhdHVyZSIgYml0czogdGhlIG9yaWdpbmFsCisgKiB3b3JkLCBzYl92ZXJzaW9ubnVtLCBhbmQgc2JfZmVhdHVyZXMyLiAgV2hlbmV2ZXIgYSBiaXQgaXMgc2V0IGluCisgKiBzYl9mZWF0dXJlczIsIHRoZSBmZWF0dXJlIGJpdCBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCBtdXN0IGJlIHNldC4KKyAqCisgKiBUaGVzZSBkZWZpbmVzIHJlcHJlc2VudCBiaXRzIGluIHNiX2ZlYXR1cmVzMi4KKyAqLworI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfUkVBTEZCSVRTCTB4MDBmZmZmZmYJLyogTWFzazogZmVhdHVyZXMgKi8KKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX1JFU0VSVkVEMUJJVAkweDAwMDAwMDAxCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9MQVpZU0JDT1VOVEJJVAkweDAwMDAwMDAyCS8qIFN1cGVyYmxrIGNvdW50ZXJzICovCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9SRVNFUlZFRDRCSVQJMHgwMDAwMDAwNAorI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfQVRUUjJCSVQJMHgwMDAwMDAwOAkvKiBJbmxpbmUgYXR0ciByZXdvcmsgKi8KKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX1BBUkVOVEJJVAkweDAwMDAwMDEwCS8qIHBhcmVudCBwb2ludGVycyAqLworI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfUFJPSklEMzJCSVQJMHgwMDAwMDA4MAkvKiAzMiBiaXQgcHJvamVjdCBpZCAqLworCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OMl9PS1JFQUxGQklUUwlcCisJKFhGU19TQl9WRVJTSU9OMl9MQVpZU0JDT1VOVEJJVAl8IFwKKwkgWEZTX1NCX1ZFUlNJT04yX0FUVFIyQklUCXwgXAorCSBYRlNfU0JfVkVSU0lPTjJfUFJPSklEMzJCSVQpCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OMl9PS1NBU0hGQklUUwlcCisJKDApCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9PS1JFQUxCSVRTCVwKKwkoWEZTX1NCX1ZFUlNJT04yX09LUkVBTEZCSVRTIHwJXAorCSBYRlNfU0JfVkVSU0lPTjJfT0tTQVNIRkJJVFMgKQorCisvKgorICogU3VwZXJibG9jayAtIGluIGNvcmUgdmVyc2lvbi4gIE11c3QgbWF0Y2ggdGhlIG9uZGlzayB2ZXJzaW9uIGJlbG93LgorICogTXVzdCBiZSBwYWRkZWQgdG8gNjQgYml0IGFsaWdubWVudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX3NiIHsKKwl1aW50MzJfdAlzYl9tYWdpY251bTsJLyogbWFnaWMgbnVtYmVyID09IFhGU19TQl9NQUdJQyAqLworCXVpbnQzMl90CXNiX2Jsb2Nrc2l6ZTsJLyogbG9naWNhbCBibG9jayBzaXplLCBieXRlcyAqLworCXhmc19kcmZzYm5vX3QJc2JfZGJsb2NrczsJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzICovCisJeGZzX2RyZnNibm9fdAlzYl9yYmxvY2tzOwkvKiBudW1iZXIgb2YgcmVhbHRpbWUgYmxvY2tzICovCisJeGZzX2RydGJub190CXNiX3JleHRlbnRzOwkvKiBudW1iZXIgb2YgcmVhbHRpbWUgZXh0ZW50cyAqLworCXV1aWRfdAkJc2JfdXVpZDsJLyogZmlsZSBzeXN0ZW0gdW5pcXVlIGlkICovCisJeGZzX2Rmc2Jub190CXNiX2xvZ3N0YXJ0OwkvKiBzdGFydGluZyBibG9jayBvZiBsb2cgaWYgaW50ZXJuYWwgKi8KKwl4ZnNfaW5vX3QJc2Jfcm9vdGlubzsJLyogcm9vdCBpbm9kZSBudW1iZXIgKi8KKwl4ZnNfaW5vX3QJc2JfcmJtaW5vOwkvKiBiaXRtYXAgaW5vZGUgZm9yIHJlYWx0aW1lIGV4dGVudHMgKi8KKwl4ZnNfaW5vX3QJc2JfcnN1bWlubzsJLyogc3VtbWFyeSBpbm9kZSBmb3IgcnQgYml0bWFwICovCisJeGZzX2FnYmxvY2tfdAlzYl9yZXh0c2l6ZTsJLyogcmVhbHRpbWUgZXh0ZW50IHNpemUsIGJsb2NrcyAqLworCXhmc19hZ2Jsb2NrX3QJc2JfYWdibG9ja3M7CS8qIHNpemUgb2YgYW4gYWxsb2NhdGlvbiBncm91cCAqLworCXhmc19hZ251bWJlcl90CXNiX2FnY291bnQ7CS8qIG51bWJlciBvZiBhbGxvY2F0aW9uIGdyb3VwcyAqLworCXhmc19leHRsZW5fdAlzYl9yYm1ibG9ja3M7CS8qIG51bWJlciBvZiBydCBiaXRtYXAgYmxvY2tzICovCisJeGZzX2V4dGxlbl90CXNiX2xvZ2Jsb2NrczsJLyogbnVtYmVyIG9mIGxvZyBibG9ja3MgKi8KKwl1aW50MTZfdAlzYl92ZXJzaW9ubnVtOwkvKiBoZWFkZXIgdmVyc2lvbiA9PSBYRlNfU0JfVkVSU0lPTiAqLworCXVpbnQxNl90CXNiX3NlY3RzaXplOwkvKiB2b2x1bWUgc2VjdG9yIHNpemUsIGJ5dGVzICovCisJdWludDE2X3QJc2JfaW5vZGVzaXplOwkvKiBpbm9kZSBzaXplLCBieXRlcyAqLworCXVpbnQxNl90CXNiX2lub3BibG9jazsJLyogaW5vZGVzIHBlciBibG9jayAqLworCWNoYXIJCXNiX2ZuYW1lWzEyXTsJLyogZmlsZSBzeXN0ZW0gbmFtZSAqLworCXVpbnQ4X3QJc2JfYmxvY2tsb2c7CS8qIGxvZzIgb2Ygc2JfYmxvY2tzaXplICovCisJdWludDhfdAlzYl9zZWN0bG9nOwkvKiBsb2cyIG9mIHNiX3NlY3RzaXplICovCisJdWludDhfdAlzYl9pbm9kZWxvZzsJLyogbG9nMiBvZiBzYl9pbm9kZXNpemUgKi8KKwl1aW50OF90CXNiX2lub3BibG9nOwkvKiBsb2cyIG9mIHNiX2lub3BibG9jayAqLworCXVpbnQ4X3QJc2JfYWdibGtsb2c7CS8qIGxvZzIgb2Ygc2JfYWdibG9ja3MgKHJvdW5kZWQgdXApICovCisJdWludDhfdAlzYl9yZXh0c2xvZzsJLyogbG9nMiBvZiBzYl9yZXh0ZW50cyAqLworCXVpbnQ4X3QJc2JfaW5wcm9ncmVzczsJLyogbWtmcyBpcyBpbiBwcm9ncmVzcywgZG9uJ3QgbW91bnQgKi8KKwl1aW50OF90CXNiX2ltYXhfcGN0OwkvKiBtYXggJSBvZiBmcyBmb3IgaW5vZGUgc3BhY2UgKi8KKwkJCQkJLyogc3RhdGlzdGljcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIG11c3QgcmVtYWluIGNvbnRpZ3VvdXMuICBJZiB5b3UgcmVhbGx5CisJICogd2FudCB0byBjaGFuZ2UgdGhlaXIgbGF5b3V0LCBtYWtlIHN1cmUgeW91IGZpeCB0aGUKKwkgKiBjb2RlIGluIHhmc190cmFuc19hcHBseV9zYl9kZWx0YXMoKS4KKwkgKi8KKwl1aW50NjRfdAlzYl9pY291bnQ7CS8qIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwl1aW50NjRfdAlzYl9pZnJlZTsJLyogZnJlZSBpbm9kZXMgKi8KKwl1aW50NjRfdAlzYl9mZGJsb2NrczsJLyogZnJlZSBkYXRhIGJsb2NrcyAqLworCXVpbnQ2NF90CXNiX2ZyZXh0ZW50czsJLyogZnJlZSByZWFsdGltZSBleHRlbnRzICovCisJLyoKKwkgKiBFbmQgY29udGlndW91cyBmaWVsZHMuCisJICovCisJeGZzX2lub190CXNiX3VxdW90aW5vOwkvKiB1c2VyIHF1b3RhIGlub2RlICovCisJeGZzX2lub190CXNiX2dxdW90aW5vOwkvKiBncm91cCBxdW90YSBpbm9kZSAqLworCXVpbnQxNl90CXNiX3FmbGFnczsJLyogcXVvdGEgZmxhZ3MgKi8KKwl1aW50OF90CXNiX2ZsYWdzOwkvKiBtaXNjLiBmbGFncyAqLworCXVpbnQ4X3QJc2Jfc2hhcmVkX3ZuOwkvKiBzaGFyZWQgdmVyc2lvbiBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJc2JfaW5vYWxpZ25tdDsJLyogaW5vZGUgY2h1bmsgYWxpZ25tZW50LCBmc2Jsb2NrcyAqLworCXVpbnQzMl90CXNiX3VuaXQ7CS8qIHN0cmlwZSBvciByYWlkIHVuaXQgKi8KKwl1aW50MzJfdAlzYl93aWR0aDsJLyogc3RyaXBlIG9yIHJhaWQgd2lkdGggKi8KKwl1aW50OF90CXNiX2RpcmJsa2xvZzsJLyogbG9nMiBvZiBkaXIgYmxvY2sgc2l6ZSAoZnNicykgKi8KKwl1aW50OF90CXNiX2xvZ3NlY3Rsb2c7CS8qIGxvZzIgb2YgdGhlIGxvZyBzZWN0b3Igc2l6ZSAqLworCXVpbnQxNl90CXNiX2xvZ3NlY3RzaXplOwkvKiBzZWN0b3Igc2l6ZSBmb3IgdGhlIGxvZywgYnl0ZXMgKi8KKwl1aW50MzJfdAlzYl9sb2dzdW5pdDsJLyogc3RyaXBlIHVuaXQgc2l6ZSBmb3IgdGhlIGxvZyAqLworCXVpbnQzMl90CXNiX2ZlYXR1cmVzMjsJLyogYWRkaXRpb25hbCBmZWF0dXJlIGJpdHMgKi8KKworCS8qCisJICogYmFkIGZlYXR1cmVzMiBmaWVsZCBhcyBhIHJlc3VsdCBvZiBmYWlsaW5nIHRvIHBhZCB0aGUgc2IKKwkgKiBzdHJ1Y3R1cmUgdG8gNjQgYml0cy4gU29tZSBtYWNoaW5lcyB3aWxsIGJlIHVzaW5nIHRoaXMgZmllbGQKKwkgKiBmb3IgZmVhdHVyZXMyIGJpdHMuIEVhc2llc3QganVzdCB0byBtYXJrIGl0IGJhZCBhbmQgbm90IHVzZQorCSAqIGl0IGZvciBhbnl0aGluZyBlbHNlLgorCSAqLworCXVpbnQzMl90CXNiX2JhZF9mZWF0dXJlczI7CisKKwkvKiBtdXN0IGJlIHBhZGRlZCB0byA2NCBiaXQgYWxpZ25tZW50ICovCit9IHhmc19zYl90OworCisvKgorICogU2VxdWVuY2UgbnVtYmVyIHZhbHVlcyBmb3IgdGhlIGZpZWxkcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlYRlNfU0JTX01BR0lDTlVNLCBYRlNfU0JTX0JMT0NLU0laRSwgWEZTX1NCU19EQkxPQ0tTLCBYRlNfU0JTX1JCTE9DS1MsCisJWEZTX1NCU19SRVhURU5UUywgWEZTX1NCU19VVUlELCBYRlNfU0JTX0xPR1NUQVJULCBYRlNfU0JTX1JPT1RJTk8sCisJWEZTX1NCU19SQk1JTk8sIFhGU19TQlNfUlNVTUlOTywgWEZTX1NCU19SRVhUU0laRSwgWEZTX1NCU19BR0JMT0NLUywKKwlYRlNfU0JTX0FHQ09VTlQsIFhGU19TQlNfUkJNQkxPQ0tTLCBYRlNfU0JTX0xPR0JMT0NLUywKKwlYRlNfU0JTX1ZFUlNJT05OVU0sIFhGU19TQlNfU0VDVFNJWkUsIFhGU19TQlNfSU5PREVTSVpFLAorCVhGU19TQlNfSU5PUEJMT0NLLCBYRlNfU0JTX0ZOQU1FLCBYRlNfU0JTX0JMT0NLTE9HLAorCVhGU19TQlNfU0VDVExPRywgWEZTX1NCU19JTk9ERUxPRywgWEZTX1NCU19JTk9QQkxPRywgWEZTX1NCU19BR0JMS0xPRywKKwlYRlNfU0JTX1JFWFRTTE9HLCBYRlNfU0JTX0lOUFJPR1JFU1MsIFhGU19TQlNfSU1BWF9QQ1QsIFhGU19TQlNfSUNPVU5ULAorCVhGU19TQlNfSUZSRUUsIFhGU19TQlNfRkRCTE9DS1MsIFhGU19TQlNfRlJFWFRFTlRTLCBYRlNfU0JTX1VRVU9USU5PLAorCVhGU19TQlNfR1FVT1RJTk8sIFhGU19TQlNfUUZMQUdTLCBYRlNfU0JTX0ZMQUdTLCBYRlNfU0JTX1NIQVJFRF9WTiwKKwlYRlNfU0JTX0lOT0FMSUdOTVQsIFhGU19TQlNfVU5JVCwgWEZTX1NCU19XSURUSCwgWEZTX1NCU19ESVJCTEtMT0csCisJWEZTX1NCU19MT0dTRUNUTE9HLCBYRlNfU0JTX0xPR1NFQ1RTSVpFLCBYRlNfU0JTX0xPR1NVTklULAorCVhGU19TQlNfRkVBVFVSRVMyLCBYRlNfU0JTX0JBRF9GRUFUVVJFUzIsCisJWEZTX1NCU19GSUVMRENPVU5UCit9IHhmc19zYl9maWVsZF90OworCisvKgorICogTWFzayB2YWx1ZXMsIGRlZmluZWQgYmFzZWQgb24gdGhlIHhmc19zYl9maWVsZF90IHZhbHVlcy4KKyAqIE9ubHkgZGVmaW5lIHRoZSBvbmVzIHdlJ3JlIHVzaW5nLgorICovCisjZGVmaW5lCVhGU19TQl9NVkFMKHgpCQkoMUxMIDw8IFhGU19TQlNfICMjIHgpCisjZGVmaW5lCVhGU19TQl9VVUlECQlYRlNfU0JfTVZBTChVVUlEKQorI2RlZmluZQlYRlNfU0JfRk5BTUUJCVhGU19TQl9NVkFMKEZOQU1FKQorI2RlZmluZQlYRlNfU0JfUk9PVElOTwkJWEZTX1NCX01WQUwoUk9PVElOTykKKyNkZWZpbmUJWEZTX1NCX1JCTUlOTwkJWEZTX1NCX01WQUwoUkJNSU5PKQorI2RlZmluZQlYRlNfU0JfUlNVTUlOTwkJWEZTX1NCX01WQUwoUlNVTUlOTykKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05OVU0JWEZTX1NCX01WQUwoVkVSU0lPTk5VTSkKKyNkZWZpbmUgWEZTX1NCX1VRVU9USU5PCQlYRlNfU0JfTVZBTChVUVVPVElOTykKKyNkZWZpbmUgWEZTX1NCX0dRVU9USU5PCQlYRlNfU0JfTVZBTChHUVVPVElOTykKKyNkZWZpbmUgWEZTX1NCX1FGTEFHUwkJWEZTX1NCX01WQUwoUUZMQUdTKQorI2RlZmluZSBYRlNfU0JfU0hBUkVEX1ZOCVhGU19TQl9NVkFMKFNIQVJFRF9WTikKKyNkZWZpbmUgWEZTX1NCX1VOSVQJCVhGU19TQl9NVkFMKFVOSVQpCisjZGVmaW5lIFhGU19TQl9XSURUSAkJWEZTX1NCX01WQUwoV0lEVEgpCisjZGVmaW5lIFhGU19TQl9JQ09VTlQJCVhGU19TQl9NVkFMKElDT1VOVCkKKyNkZWZpbmUgWEZTX1NCX0lGUkVFCQlYRlNfU0JfTVZBTChJRlJFRSkKKyNkZWZpbmUgWEZTX1NCX0ZEQkxPQ0tTCQlYRlNfU0JfTVZBTChGREJMT0NLUykKKyNkZWZpbmUgWEZTX1NCX0ZFQVRVUkVTMglYRlNfU0JfTVZBTChGRUFUVVJFUzIpCisjZGVmaW5lIFhGU19TQl9CQURfRkVBVFVSRVMyCVhGU19TQl9NVkFMKEJBRF9GRUFUVVJFUzIpCisjZGVmaW5lCVhGU19TQl9OVU1fQklUUwkJKChpbnQpWEZTX1NCU19GSUVMRENPVU5UKQorI2RlZmluZQlYRlNfU0JfQUxMX0JJVFMJCSgoMUxMIDw8IFhGU19TQl9OVU1fQklUUykgLSAxKQorI2RlZmluZQlYRlNfU0JfTU9EX0JJVFMJCVwKKwkoWEZTX1NCX1VVSUQgfCBYRlNfU0JfUk9PVElOTyB8IFhGU19TQl9SQk1JTk8gfCBYRlNfU0JfUlNVTUlOTyB8IFwKKwkgWEZTX1NCX1ZFUlNJT05OVU0gfCBYRlNfU0JfVVFVT1RJTk8gfCBYRlNfU0JfR1FVT1RJTk8gfCBcCisJIFhGU19TQl9RRkxBR1MgfCBYRlNfU0JfU0hBUkVEX1ZOIHwgWEZTX1NCX1VOSVQgfCBYRlNfU0JfV0lEVEggfCBcCisJIFhGU19TQl9JQ09VTlQgfCBYRlNfU0JfSUZSRUUgfCBYRlNfU0JfRkRCTE9DS1MgfCBYRlNfU0JfRkVBVFVSRVMyIHwgXAorCSBYRlNfU0JfQkFEX0ZFQVRVUkVTMikKKworCisvKgorICogTWlzYy4gRmxhZ3MgLSB3YXJuaW5nIC0gdGhlc2Ugd2lsbCBiZSBjbGVhcmVkIGJ5IHhmc19yZXBhaXIgdW5sZXNzCisgKiBhIGZlYXR1cmUgYml0IGlzIHNldCB3aGVuIHRoZSBmbGFnIGlzIHVzZWQuCisgKi8KKyNkZWZpbmUgWEZTX1NCRl9OT0ZMQUdTCQkweDAwCS8qIG5vIGZsYWdzIHNldCAqLworI2RlZmluZSBYRlNfU0JGX1JFQURPTkxZCTB4MDEJLyogb25seSByZWFkLW9ubHkgbW91bnRzIGFsbG93ZWQgKi8KKworLyoKKyAqIGRlZmluZSBtYXguIHNoYXJlZCB2ZXJzaW9uIHdlIGNhbiBpbnRlcm9wZXJhdGUgd2l0aAorICovCisjZGVmaW5lIFhGU19TQl9NQVhfU0hBUkVEX1ZOCTAKKworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKQkoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9OVU1CSVRTKQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfZ29vZF92ZXJzaW9uKHhmc19zYl90ICpzYnApCit7CisJLyogV2UgYWx3YXlzIHN1cHBvcnQgdmVyc2lvbiAxLTMgKi8KKwlpZiAoc2JwLT5zYl92ZXJzaW9ubnVtID49IFhGU19TQl9WRVJTSU9OXzEgJiYKKwkgICAgc2JwLT5zYl92ZXJzaW9ubnVtIDw9IFhGU19TQl9WRVJTSU9OXzMpCisJCXJldHVybiAxOworCisJLyogV2Ugc3VwcG9ydCB2ZXJzaW9uIDQgaWYgYWxsIGZlYXR1cmUgYml0cyBhcmUgc3VwcG9ydGVkICovCisJaWYgKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpIHsKKwkJaWYgKChzYnAtPnNiX3ZlcnNpb25udW0gJiB+WEZTX1NCX1ZFUlNJT05fT0tSRUFMQklUUykgfHwKKwkJICAgICgoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fTU9SRUJJVFNCSVQpICYmCisJCSAgICAgKHNicC0+c2JfZmVhdHVyZXMyICYgflhGU19TQl9WRVJTSU9OMl9PS1JFQUxCSVRTKSkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCkgJiYKKwkJICAgIHNicC0+c2Jfc2hhcmVkX3ZuID4gWEZTX1NCX01BWF9TSEFSRURfVk4pCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERldGVjdCBhIG1pc21hdGNoZWQgZmVhdHVyZXMyIGZpZWxkLiAgT2xkZXIga2VybmVscyByZWFkL3dyb3RlCisgKiB0aGlzIGludG8gdGhlIHdyb25nIHNsb3QsIHNvIHRvIGJlIHNhZmUgd2Uga2VlcCB0aGVtIGluIHN5bmMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl9oYXNfbWlzbWF0Y2hlZF9mZWF0dXJlczIoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gKHNicC0+c2JfYmFkX2ZlYXR1cmVzMiAhPSBzYnAtPnNiX2ZlYXR1cmVzMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgeGZzX3NiX3ZlcnNpb25fdG9uZXcodW5zaWduZWQgdikKK3sKKwlpZiAodiA9PSBYRlNfU0JfVkVSU0lPTl8xKQorCQlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fNDsKKworCWlmICh2ID09IFhGU19TQl9WRVJTSU9OXzIpCisJCXJldHVybiBYRlNfU0JfVkVSU0lPTl80IHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVDsKKworCXJldHVybiBYRlNfU0JfVkVSU0lPTl80IHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCB8CisJCVhGU19TQl9WRVJTSU9OX05MSU5LQklUOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHhmc19zYl92ZXJzaW9uX3Rvb2xkKHVuc2lnbmVkIHYpCit7CisJaWYgKHYgJiAoWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQgfCBYRlNfU0JfVkVSU0lPTl9BTElHTkJJVCkpCisJCXJldHVybiAwOworCWlmICh2ICYgWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQpCisJCXJldHVybiBYRlNfU0JfVkVSU0lPTl8zOworCWlmICh2ICYgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCkKKwkJcmV0dXJuIFhGU19TQl9WRVJTSU9OXzI7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OXzE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc2F0dHIoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gc2JwLT5zYl92ZXJzaW9ubnVtID09IFhGU19TQl9WRVJTSU9OXzIgfHwKKwkJc2JwLT5zYl92ZXJzaW9ubnVtID09IFhGU19TQl9WRVJTSU9OXzMgfHwKKwkJKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgJiYKKwkJIChzYnAtPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9BVFRSQklUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfc2JfdmVyc2lvbl9hZGRhdHRyKHhmc19zYl90ICpzYnApCit7CisJaWYgKHNicC0+c2JfdmVyc2lvbm51bSA9PSBYRlNfU0JfVkVSU0lPTl8xKQorCQlzYnAtPnNiX3ZlcnNpb25udW0gPSBYRlNfU0JfVkVSU0lPTl8yOworCWVsc2UgaWYgKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpCisJCXNicC0+c2JfdmVyc2lvbm51bSB8PSBYRlNfU0JfVkVSU0lPTl9BVFRSQklUOworCWVsc2UKKwkJc2JwLT5zYl92ZXJzaW9ubnVtID0gWEZTX1NCX1ZFUlNJT05fNCB8IFhGU19TQl9WRVJTSU9OX0FUVFJCSVQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc25saW5rKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIHNicC0+c2JfdmVyc2lvbm51bSA9PSBYRlNfU0JfVkVSU0lPTl8zIHx8CisJCSAoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkgIChzYnAtPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeGZzX3NiX3ZlcnNpb25fYWRkbmxpbmsoeGZzX3NiX3QgKnNicCkKK3sKKwlpZiAoc2JwLT5zYl92ZXJzaW9ubnVtIDw9IFhGU19TQl9WRVJTSU9OXzIpCisJCXNicC0+c2JfdmVyc2lvbm51bSA9IFhGU19TQl9WRVJTSU9OXzM7CisJZWxzZQorCQlzYnAtPnNiX3ZlcnNpb25udW0gfD0gWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc3F1b3RhKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgJiYKKwkJKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1FVT1RBQklUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhmc19zYl92ZXJzaW9uX2FkZHF1b3RhKHhmc19zYl90ICpzYnApCit7CisJaWYgKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpCisJCXNicC0+c2JfdmVyc2lvbm51bSB8PSBYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVDsKKwllbHNlCisJCXNicC0+c2JfdmVyc2lvbm51bSA9IHhmc19zYl92ZXJzaW9uX3RvbmV3KHNicC0+c2JfdmVyc2lvbm51bSkgfAorCQkJCQlYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzYWxpZ24oeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQpOworfQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNkYWxpZ24oeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzc2hhcmVkKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgJiYKKwkJKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc2RpcnYyKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgJiYKKwkJKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0RJUlYyQklUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzbG9ndjIoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fTE9HVjJCSVQpOworfQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNleHRmbGdiaXQoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzc2VjdG9yKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgJiYKKwkJKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc2FzY2lpY2koeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fQk9SR0JJVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc21vcmViaXRzKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgJiYKKwkJKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKTsKK30KKworLyoKKyAqIHNiX2ZlYXR1cmVzMiBiaXQgdmVyc2lvbiBtYWNyb3MuCisgKgorICogRm9yIGV4YW1wbGUsIGZvciBhIGJpdCBkZWZpbmVkIGFzIFhGU19TQl9WRVJTSU9OMl9GVU5CSVQsIGhhcyBhIG1hY3JvOgorICoKKyAqIFNCX1ZFUlNJT05fSEFTRlVOQklUKHhmc19zYl90ICpzYnApCisgKgkoKHhmc19zYl92ZXJzaW9uX2hhc21vcmViaXRzKHNicCkgJiYKKyAqCSAoKHNicCktPnNiX2ZlYXR1cmVzMiAmIFhGU19TQl9WRVJTSU9OMl9GVU5CSVQpCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzbGF6eXNiY291bnQoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4geGZzX3NiX3ZlcnNpb25faGFzbW9yZWJpdHMoc2JwKSAmJgorCQkoc2JwLT5zYl9mZWF0dXJlczIgJiBYRlNfU0JfVkVSU0lPTjJfTEFaWVNCQ09VTlRCSVQpOworfQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNhdHRyMih4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiB4ZnNfc2JfdmVyc2lvbl9oYXNtb3JlYml0cyhzYnApICYmCisJCShzYnAtPnNiX2ZlYXR1cmVzMiAmIFhGU19TQl9WRVJTSU9OMl9BVFRSMkJJVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfc2JfdmVyc2lvbl9hZGRhdHRyMih4ZnNfc2JfdCAqc2JwKQoreworCXNicC0+c2JfdmVyc2lvbm51bSB8PSBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVDsKKwlzYnAtPnNiX2ZlYXR1cmVzMiB8PSBYRlNfU0JfVkVSU0lPTjJfQVRUUjJCSVQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfc2JfdmVyc2lvbl9yZW1vdmVhdHRyMih4ZnNfc2JfdCAqc2JwKQoreworCXNicC0+c2JfZmVhdHVyZXMyICY9IH5YRlNfU0JfVkVSU0lPTjJfQVRUUjJCSVQ7CisJaWYgKCFzYnAtPnNiX2ZlYXR1cmVzMikKKwkJc2JwLT5zYl92ZXJzaW9ubnVtICY9IH5YRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzcHJvamlkMzJiaXQoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4geGZzX3NiX3ZlcnNpb25faGFzbW9yZWJpdHMoc2JwKSAmJgorCQkoc2JwLT5zYl9mZWF0dXJlczIgJiBYRlNfU0JfVkVSU0lPTjJfUFJPSklEMzJCSVQpOworfQorCisvKgorICogZW5kIG9mIHN1cGVyYmxvY2sgdmVyc2lvbiBtYWNyb3MKKyAqLworCisjZGVmaW5lIFhGU19TQl9EQUREUgkJKCh4ZnNfZGFkZHJfdCkwKSAvKiBkYWRkciBpbiBmaWxlc3lzdGVtL2FnICovCisjZGVmaW5lCVhGU19TQl9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX1NCX0RBRERSKQorI2RlZmluZSBYRlNfQlVGX1RPX1NCUChicCkJKCh4ZnNfZHNiX3QgKikoKGJwKS0+Yl9hZGRyKSkKKworI2RlZmluZQlYRlNfSERSX0JMT0NLKG1wLGQpCSgoeGZzX2FnYmxvY2tfdClYRlNfQkJfVE9fRlNCVChtcCxkKSkKKyNkZWZpbmUJWEZTX0RBRERSX1RPX0ZTQihtcCxkKQlYRlNfQUdCX1RPX0ZTQihtcCwgXAorCQkJeGZzX2RhZGRyX3RvX2Fnbm8obXAsZCksIHhmc19kYWRkcl90b19hZ2JubyhtcCxkKSkKKyNkZWZpbmUJWEZTX0ZTQl9UT19EQUREUihtcCxmc2JubykJWEZTX0FHQl9UT19EQUREUihtcCwgXAorCQkJWEZTX0ZTQl9UT19BR05PKG1wLGZzYm5vKSwgWEZTX0ZTQl9UT19BR0JOTyhtcCxmc2JubykpCisKKy8qCisgKiBGaWxlIHN5c3RlbSBzZWN0b3IgdG8gYmFzaWMgYmxvY2sgY29udmVyc2lvbnMuCisgKi8KKyNkZWZpbmUgWEZTX0ZTU19UT19CQihtcCxzZWMpCSgoc2VjKSA8PCAobXApLT5tX3NlY3RiYl9sb2cpCisKKy8qCisgKiBGaWxlIHN5c3RlbSBibG9jayB0byBiYXNpYyBibG9jayBjb252ZXJzaW9ucy4KKyAqLworI2RlZmluZQlYRlNfRlNCX1RPX0JCKG1wLGZzYm5vKQkoKGZzYm5vKSA8PCAobXApLT5tX2Jsa2JiX2xvZykKKyNkZWZpbmUJWEZTX0JCX1RPX0ZTQihtcCxiYikJXAorCSgoKGJiKSArIChYRlNfRlNCX1RPX0JCKG1wLDEpIC0gMSkpID4+IChtcCktPm1fYmxrYmJfbG9nKQorI2RlZmluZQlYRlNfQkJfVE9fRlNCVChtcCxiYikJKChiYikgPj4gKG1wKS0+bV9ibGtiYl9sb2cpCisKKy8qCisgKiBGaWxlIHN5c3RlbSBibG9jayB0byBieXRlIGNvbnZlcnNpb25zLgorICovCisjZGVmaW5lIFhGU19GU0JfVE9fQihtcCxmc2JubykJKCh4ZnNfZnNpemVfdCkoZnNibm8pIDw8IChtcCktPm1fc2Iuc2JfYmxvY2tsb2cpCisjZGVmaW5lIFhGU19CX1RPX0ZTQihtcCxiKQlcCisJKCgoKHVpbnQ2NF90KShiKSkgKyAobXApLT5tX2Jsb2NrbWFzaykgPj4gKG1wKS0+bV9zYi5zYl9ibG9ja2xvZykKKyNkZWZpbmUgWEZTX0JfVE9fRlNCVChtcCxiKQkoKCh1aW50NjRfdCkoYikpID4+IChtcCktPm1fc2Iuc2JfYmxvY2tsb2cpCisjZGVmaW5lIFhGU19CX0ZTQl9PRkZTRVQobXAsYikJKChiKSAmIChtcCktPm1fYmxvY2ttYXNrKQorCisjZW5kaWYJLyogWEZTX1NCX0hfICovCmRpZmYgLS1naXQgYS9leHRsaW51eC94ZnNfdHlwZXMuaCBiL2V4dGxpbnV4L3hmc190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODA4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRsaW51eC94ZnNfdHlwZXMuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIFRha2VuIGZyb20gTGludXgga2VybmVsIHRyZWUgKGxpbnV4L2ZzL3hmcykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBQYXVsbyBBbGNhbnRhcmEgPHBjYWNqckB6eXRvci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpZm5kZWYgWEZTX1RZUEVTX0hfCisjZGVmaW5lCVhGU19UWVBFU19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwordHlwZWRlZiBlbnVtIHsgQl9GQUxTRSxCX1RSVUUgfQlib29sZWFuX3Q7Cit0eXBlZGVmIHVpbnQzMl90CQlwcmlkX3Q7CQkvKiBwcm9qZWN0IElEICovCit0eXBlZGVmIHVpbnQzMl90CQlpbnN0X3Q7CQkvKiBhbiBpbnN0cnVjdGlvbiAqLworCit0eXBlZGVmIGludDY0X3QJCQl4ZnNfb2ZmX3Q7CS8qIDxmaWxlIG9mZnNldD4gdHlwZSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJeGZzX2lub190OwkvKiA8aW5vZGU+IHR5cGUgKi8KK3R5cGVkZWYgaW50NjRfdAkJCXhmc19kYWRkcl90OwkvKiA8ZGlzayBhZGRyZXNzPiB0eXBlICovCit0eXBlZGVmIGNoYXIgKgkJCXhmc19jYWRkcl90OwkvKiA8Y29yZSBhZGRyZXNzPiB0eXBlICovCit0eXBlZGVmIHVpbnQzMl90CQkJeGZzX2Rldl90OwordHlwZWRlZiB1aW50MzJfdAkJCXhmc19ubGlua190OworCisvKiBfX3BzaW50X3QgaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHBvaW50ZXIgKi8KK3R5cGVkZWYgaW50MzJfdCBfX3BzaW50X3Q7Cit0eXBlZGVmIHVpbnQzMl90IF9fcHN1bnNpZ25lZF90OworCit0eXBlZGVmIHVpbnQzMl90CXhmc19hZ2Jsb2NrX3Q7CS8qIGJsb2Nrbm8gaW4gYWxsb2MuIGdyb3VwICovCit0eXBlZGVmCXVpbnQzMl90CXhmc19leHRsZW5fdDsJLyogZXh0ZW50IGxlbmd0aCBpbiBibG9ja3MgKi8KK3R5cGVkZWYJdWludDMyX3QJeGZzX2FnbnVtYmVyX3Q7CS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCit0eXBlZGVmIGludDMyX3QJeGZzX2V4dG51bV90OwkvKiAjIG9mIGV4dGVudHMgaW4gYSBmaWxlICovCit0eXBlZGVmIGludDE2X3QJeGZzX2FleHRudW1fdDsJLyogIyBleHRlbnRzIGluIGFuIGF0dHJpYnV0ZSBmb3JrICovCit0eXBlZGVmCWludDY0X3QJeGZzX2ZzaXplX3Q7CS8qIGJ5dGVzIGluIGEgZmlsZSAqLwordHlwZWRlZiB1aW50NjRfdAl4ZnNfdWZzaXplX3Q7CS8qIHVuc2lnbmVkIGJ5dGVzIGluIGEgZmlsZSAqLworCit0eXBlZGVmCWludDMyX3QJeGZzX3N1bWluZm9fdDsJLyogdHlwZSBvZiBiaXRtYXAgc3VtbWFyeSBpbmZvICovCit0eXBlZGVmCWludDMyX3QJeGZzX3J0d29yZF90OwkvKiB3b3JkIHR5cGUgZm9yIGJpdG1hcCBtYW5pcHVsYXRpb25zICovCisKK3R5cGVkZWYJaW50NjRfdAl4ZnNfbHNuX3Q7CS8qIGxvZyBzZXF1ZW5jZSBudW1iZXIgKi8KK3R5cGVkZWYJaW50MzJfdAl4ZnNfdGlkX3Q7CS8qIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIgKi8KKwordHlwZWRlZgl1aW50MzJfdAl4ZnNfZGFibGtfdDsJLyogZGlyL2F0dHIgYmxvY2sgbnVtYmVyIChpbiBmaWxlKSAqLwordHlwZWRlZgl1aW50MzJfdAl4ZnNfZGFoYXNoX3Q7CS8qIGRpci9hdHRyIGhhc2ggdmFsdWUgKi8KKworLyoKKyAqIFRoZXNlIHR5cGVzIGFyZSA2NCBiaXRzIG9uIGRpc2sgYnV0IGFyZSBlaXRoZXIgMzIgb3IgNjQgYml0cyBpbiBtZW1vcnkuCisgKiBEaXNrIGJhc2VkIHR5cGVzOgorICovCit0eXBlZGVmIHVpbnQ2NF90CXhmc19kZnNibm9fdDsJLyogYmxvY2tubyBpbiBmaWxlc3lzdGVtIChhZ25vfGFnYm5vKSAqLwordHlwZWRlZiB1aW50NjRfdAl4ZnNfZHJmc2Jub190OwkvKiBibG9ja25vIGluIGZpbGVzeXN0ZW0gKHJhdykgKi8KK3R5cGVkZWYJdWludDY0X3QJeGZzX2RydGJub190OwkvKiBleHRlbnQgKGJsb2NrKSBpbiByZWFsdGltZSBhcmVhICovCit0eXBlZGVmCXVpbnQ2NF90CXhmc19kZmlsb2ZmX3Q7CS8qIGJsb2NrIG51bWJlciBpbiBhIGZpbGUgKi8KK3R5cGVkZWYJdWludDY0X3QJeGZzX2RmaWxibGtzX3Q7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gYSBmaWxlICovCisKKy8qCisgKiBNZW1vcnkgYmFzZWQgdHlwZXMgYXJlIGNvbmRpdGlvbmFsLgorICovCit0eXBlZGVmCXVpbnQ2NF90CXhmc19mc2Jsb2NrX3Q7CS8qIGJsb2Nrbm8gaW4gZmlsZXN5c3RlbSAoYWdub3xhZ2JubykgKi8KK3R5cGVkZWYgdWludDY0X3QJeGZzX3Jmc2Jsb2NrX3Q7CS8qIGJsb2Nrbm8gaW4gZmlsZXN5c3RlbSAocmF3KSAqLwordHlwZWRlZiB1aW50NjRfdAl4ZnNfcnRibG9ja190OwkvKiBleHRlbnQgKGJsb2NrKSBpbiByZWFsdGltZSBhcmVhICovCit0eXBlZGVmCWludDY0X3QJeGZzX3NydGJsb2NrX3Q7CS8qIHNpZ25lZCB2ZXJzaW9uIG9mIHhmc19ydGJsb2NrX3QgKi8KKwordHlwZWRlZiB1aW50NjRfdAl4ZnNfZmlsZW9mZl90OwkvKiBibG9jayBudW1iZXIgaW4gYSBmaWxlICovCit0eXBlZGVmIGludDY0X3QJeGZzX3NmaWxvZmZfdDsJLyogc2lnbmVkIGJsb2NrIG51bWJlciBpbiBhIGZpbGUgKi8KK3R5cGVkZWYgdWludDY0X3QJeGZzX2ZpbGJsa3NfdDsJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBhIGZpbGUgKi8KKworLyoKKyAqIE51bGwgdmFsdWVzIGZvciB0aGUgdHlwZXMuCisgKi8KKyNkZWZpbmUJTlVMTERGU0JOTwkoKHhmc19kZnNibm9fdCktMSkKKyNkZWZpbmUJTlVMTERSRlNCTk8JKCh4ZnNfZHJmc2Jub190KS0xKQorI2RlZmluZQlOVUxMRFJUQk5PCSgoeGZzX2RydGJub190KS0xKQorI2RlZmluZQlOVUxMREZJTE9GRgkoKHhmc19kZmlsb2ZmX3QpLTEpCisKKyNkZWZpbmUJTlVMTEZTQkxPQ0sJKCh4ZnNfZnNibG9ja190KS0xKQorI2RlZmluZQlOVUxMUkZTQkxPQ0sJKCh4ZnNfcmZzYmxvY2tfdCktMSkKKyNkZWZpbmUJTlVMTFJUQkxPQ0sJKCh4ZnNfcnRibG9ja190KS0xKQorI2RlZmluZQlOVUxMRklMRU9GRgkoKHhmc19maWxlb2ZmX3QpLTEpCisKKyNkZWZpbmUJTlVMTEFHQkxPQ0sJKCh4ZnNfYWdibG9ja190KS0xKQorI2RlZmluZQlOVUxMQUdOVU1CRVIJKCh4ZnNfYWdudW1iZXJfdCktMSkKKyNkZWZpbmUJTlVMTEVYVE5VTQkoKHhmc19leHRudW1fdCktMSkKKworI2RlZmluZSBOVUxMQ09NTUlUTFNOCSgoeGZzX2xzbl90KS0xKQorCisvKgorICogTWF4IHZhbHVlcyBmb3IgZXh0bGVuLCBleHRudW0sIGFleHRudW0uCisgKi8KKyNkZWZpbmUJTUFYRVhUTEVOCSgoeGZzX2V4dGxlbl90KTB4MDAxZmZmZmYpCS8qIDIxIGJpdHMgKi8KKyNkZWZpbmUJTUFYRVhUTlVNCSgoeGZzX2V4dG51bV90KTB4N2ZmZmZmZmYpCS8qIHNpZ25lZCBpbnQgKi8KKyNkZWZpbmUJTUFYQUVYVE5VTQkoKHhmc19hZXh0bnVtX3QpMHg3ZmZmKQkJLyogc2lnbmVkIHNob3J0ICovCisKKy8qCisgKiBNaW4gbnVtYmVycyBvZiBkYXRhL2F0dHIgZm9yayBidHJlZSByb290IHBvaW50ZXJzLgorICovCisjZGVmaW5lIE1JTkRCVFBUUlMJMworI2RlZmluZSBNSU5BQlRQVFJTCTIKKworLyoKKyAqIE1BWE5BTUVMRU4gaXMgdGhlIGxlbmd0aCAoaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsKSBvZgorICogdGhlIGxvbmdlc3QgcGVybWlzc2libGUgZmlsZSAoY29tcG9uZW50KSBuYW1lLgorICovCisjZGVmaW5lIE1BWE5BTUVMRU4JMjU2CisKK3R5cGVkZWYgZW51bSB7CisJWEZTX0xPT0tVUF9FUWksIFhGU19MT09LVVBfTEVpLCBYRlNfTE9PS1VQX0dFaQorfSB4ZnNfbG9va3VwX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJWEZTX0JUTlVNX0JOT2ksIFhGU19CVE5VTV9DTlRpLCBYRlNfQlROVU1fQk1BUGksIFhGU19CVE5VTV9JTk9pLAorCVhGU19CVE5VTV9NQVgKK30geGZzX2J0bnVtX3Q7CisKK3N0cnVjdCB4ZnNfbmFtZSB7CisJY29uc3QgdW5zaWduZWQgY2hhcgkqbmFtZTsKKwlpbnQJCQlsZW47Cit9OworCisjZW5kaWYJLyogWEZTX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9nZW4taWQuc2ggYi9nZW4taWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzAxZWE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dlbi1pZC5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKyMKKyMgQ3JlYXRlIGEgYnVpbGQgSUQgZm9yIHRoaXMgYnVpbGQuICBJZiB3ZSdyZSB1c2luZyBhIGdpdCB0cmVlLAorIyBnZW5lcmF0ZSBhbiBJRCBmcm9tICJnaXQgZGVzY3JpYmUiLCBvdGhlcndpc2UgdXNlIHRoZSBwYXNzZWQtaW4KKyMgdGltZXN0YW1wLgorIworIyBVc2FnZTogZ2VuLWlkLnNoIHZlcnNpb24gdGltZXN0YW1wCisjCisKK3Zlcj0iJDEiCit0aW09IiQyIgordG9wPWBkaXJuYW1lICIkMCJgCisKK2lmIHRlc3QgLW4gIiRHSVRfRElSIiAtbyAtZCAiJHRvcCIvLmdpdCAtbyAtZiAiJHRvcCIvLmdpdDsgdGhlbgorICAgIGlkPSIkKGdpdCBkZXNjcmliZSkiCisgICAgaWYgdGVzdCAtbiAiJGlkIjsgdGhlbgorCWlmIHRlc3QgeCIkKGVjaG8gIiRpZCIgfCBjdXQgLWQtIC1mMSkiID0geHN5c2xpbnV4OyB0aGVuCisgICAgICAgICAgICBpZD0iJChlY2hvICIkaWQiIHwgY3V0IC1kLSAtZjItKSIKKyAgICAgICAgICAgIGlmIHRlc3QgeCIkKGVjaG8gIiRpZCIgfCBjdXQgLWQtIC1mMSkiID0geCIkdmVyIjsgdGhlbgorCQlpZD0iJChlY2hvICIkaWQiIHwgY3V0IC1kLSAtZjItKSIKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkaWQiOyB0aGVuCisJaWYgdGVzdCAtbiAiJChnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEKSI7IHRoZW4KKwkgICAgaWQ9IiR7aWR9IlwqCisJZmkKKyAgICBmaQorZmkKK2lmIHRlc3QgLXogIiRpZCI7IHRoZW4KKyAgaWQ9IiR0aW0iCitmaQorZWNobyAiJGlkIgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9DaGFuZ2VMb2cgYi9nbnUtZWZpL2dudS1lZmktMy4wL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2IyNDRjCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9DaGFuZ2VMb2cKQEAgLTAsMCArMSw2MDcgQEAKKzIwMTQtMDEtMTMgTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgSW1wbGVtZW50IFZTUHJpbnQgZnVuY3Rpb24sIHByaW50cyBhIGZvcm1hdHRlZCB1bmljb2RlIHN0cmluZyB0byBhIGJ1ZmZlci4KKyAgICAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBKZXJlbXkgQ29tcG9zdGVsbGEgPGplcmVteS5jb21wb3N0ZWxsYUBnbWFpbC5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorCisyMDE0LTAxLTEwIE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKyAgICBDcmVhdGVkIGxpYi9hcmdpZnkuYyBhbmQgaW5jL2FyZ2lmeS5oIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGFyZ2lmeS4KKyAgICBJdCBjb250YWlucyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBjb21tZW50IGF0IGJlZ2lubmluZyBvZiBmaWxlIGZyb20KKyAgICBlbGlsby4KKyAgICBUaGVyZSB3YXMgbm8gQ09QWUlORyBmaWxlIGluIHRoZSBlbGlsbyBzb3VyY2UgdGhhdCB0aGUgY29tbWVudCByZWZlcnMgdG8uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKZXJyeSBIb2VtYW5uIDxqZXJyeS5ob2VtYW5uQGhwLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisKKzIwMTQtMDEtMDggTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgIFRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgaXMgbm90IHJlYWxseSB0aGUgaG9zdCBhcmNoaXRlY3R1cmUgYXMgZ2l2ZW4gYnkKKyAgICB0aGUga2VybmVsIGFyY2guIFRoZSBpbmZvcm1hdGlvbiBhY3R1YWxseSBuZWVkZWQgaXMgdGhlIGRlZmF1bHQgdGFyZ2V0CisgICAgb2YgZ2NjLgorCSAgICAgICAgCisgICAgU2lnbmVkLW9mZi1ieTogU3lsdmFpbiBHYXVsdCA8c3lsdmFpbi5nYXVsdEBnbWFpbC5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorCisyMDEzLTEwLTExIE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKyAgICBBZGRlZCBzdXBwb3J0IGZvciBTZXRWYXJpYWJsZSB0byBzdG9yZSB2b2xhdGlsZSB2YXJpYWJsZSwKKyAgICBhbmQgU2V0TlZWYXJpYWJsZSB0byBzdG9yZSBub24gdm9sYXRpbGUgdmFyaWFibGUuCisJICAgIAorICAgIFNpZ25lZC1vZmYtYnk6IFN5bHZhaW4gQ2hvdWxldXIgPHN5bHZhaW4uY2hvdWxldXJAZ21haWwuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKworMjAxMy0xMC0wNyBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisKKyAgICBBdG9pIG5lZWRzIHRvIGhhdmUgY29uc2lzdGVudCBkZWNsYXJhdGlvbi9kZWZpbml0aW9uLgorICAgIAorICAgIFNpZ25lZC1vZmYtYnk6IE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKworMjAxMy0xMC0wNyBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisgICAgaWYgeW91IGhhdmUgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGNvbnN0IGFyZ3VtZW50cyBhbmQgdGhlbgorICAgIGUuZy4gdHJpZXMgdG8gY29weSBTdHJDbXAsIGdjYyB3aWxsIGdpdmUgeW91IHdhcm5pbmdzIGFib3V0IHRob3NlCisgICAgY2FsbHMsIGFuZCB0aGUgd2FybmluZ3MgYXJlIHJpZ2h0LiAgVGhlc2UgY2x1dHRlciB1cCBvdGhlciB0aGluZ3MKKyAgICB5b3UgbWlnaHQgbWlzcyB0aGF0IHlvdSBzaG91bGQgYmUgbW9yZSBjb25jZXJlZCBhYm91dC4KKworICAgIFlvdSBjb3VsZCB3b3JrIGFyb3VuZCBpdCB0aHJvdWdoIHZpZ29yb3VzIHR5cGVjYXN0aW5nCisgICAgdG8gbm9uLWNvbnN0IHR5cGVzLCBidXQgd2h5IHNob3VsZCB5b3UgaGF2ZSB0bz8gQWxsIG9mIHRoZXNlCisgICAgZnVuY3Rpb25zIGFyZSByZWdvcm91c2x5IGRlZmluZWQgYXMgbm90IGNoYW5naW5nIHRoZWlyIGlucHV0CisgICAgLSBpdCBpcyBjb25zdCwgYW5kIHNob3VsZCBiZSBtYXJrZWQgYXMgc3VjaC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFBldGVyIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KKworMjAxMy0xMC0wMiBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisKKyAgICBBZGRlZCB0d28gc2ltcGxlIGFwcGxpY2F0aW9ucyB0byBhbGxvY2F0ZS9mcmVlIG1lbW9yeSBhdCBFRkkuCisgICAgVXNlZCB0byB0ZXN0L2ZpbmQgbWVtb3J5IGZyYWdtZW50YXRpb24gaXNzdWVzIGxpbnV4LgorCSAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBKZXJyeSBIb2VtYW5uIDxqZXJyeS5ob2VtYW5uQGhwLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisKKzIwMTMtMDYtMjUgTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgIFNhbXBsZSBib290IHNlcnZpY2UgZHJpdmVyLgorICAgICAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBEZWNvdGlnbnkgPGRlY290QGdvb2dsZXJzLmNvbT4KKworMjAxMy0wNi0yNSBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CitEYXRlOiAgIFR1ZSBKdW4gMjUgMDg6NDc6MDMgMjAxMyAtMDQwMAorCisgICAgQmUgbW9yZSBwZWRhbnRpYyB3aGVuIGxpbmtpbmcsIGRvbid0IGFsbG93IGR1cGxpY2F0ZSBzeW1ib2xzLAorICAgIGFib3J0IHVwb24gZmlyc3QgZXJyb3IuIEFsc28gbWFrZSBzdXJlIGxpbmtlciBzY3JpcHQgY29tZXMgCisgICAgbGFzdCBmb3IgYXBwcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IERhdmlkIERlY290aWdueSA8ZGVjb3RAZ29vZ2xlcnMuY29tPgorCisyMDEzLTA2LTI1IE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKyAgICBGaXggY29tcGlsYXRpb24gb24geDg2XzY0IHdpdGhvdXQgSEFWRV9VU0VfTVNfQUJJCisgICAgbWFrZSAtQyBhcHBzIHdvdWxkIGZhaWwgb24gdGNjLmMgYmVjYXVzZSB1ZWZpX2NhbGxfd3JhcHBlcigpCisgICAgZG9lc24ndCBkZWFsIGNvcnJlY3RseSB3aXRoIGVmaV9jYWxsTy10eXBlIGludm9jYXRpb24uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBEZWNvdGlnbnkgPGRlY290QGdvb2dsZXJzLmNvbT4KKworMjAxMy0wNi0xMiBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisgICAgRml4IHR5cG8gd2hlbiBkaXNhYmxpbmcgbW5vLW1teAorICAgICAgICAKKyAgICBTaWduZWQtT2ZmLUJ5OiBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisKKzIwMTMtMDYtMTIgTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgIERpc2FibGUgTU1YIGFuZCBTU0UKKyAgICAKKyAgICBHQ0MgNC44LjAgYWRkcyBzb21lIG9wdGltaXphdGlvbnMgdGhhdCB3aWxsIHVzZSBtb3Z1cHMvbW92YXBzIChhbmQgdXNlCisgICAgJXhtbSogcmVnaXN0ZXJzKSB3aGVuIHRoZXkncmUgZmFzdGVyLCBhbmQgb2YgY291cnNlIHRoYXQgd29uJ3Qgd29yayBhdAorICAgIGFsbCBzaW5jZSBVRUZJIGZpcm13YXJlcyBhcmVuJ3QgZ3VhcmFudGVlZCB0byBpbml0aWFsaXplIHRoZSBtbXgvc3NlCisgICAgaW5zdHJ1Y3Rpb25zLgorICAgIAorICAgIFRoaXMgd2lsbCBiZSBldmVuIG1vcmUgYW5ub3lpbmcsIHNpbmNlIG1vc3QgVUVGSSBmaXJtd2FyZXMgZG9uJ3QKKyAgICBpbml0aWFsaXplIHRoZSAjREUgb3IgI1VEIHRyYXAgaGFuZGxlcnMsIGFuZCB5b3VyIGJhY2t0cmFjZSB3aWxsIGJlIGEKKyAgICByYW5kb20gcGF0aCB0aHJvdWdoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBvY2Nhc2lvbmFsbHkgaW5jbHVkaW5nCisgICAgd2hhdGV2ZXIgYWRkcmVzcyB0aGUgSURUIGhhcyBmb3IgI1VELCBidXQgYWxzbyBhZGRyZXNzZXMgbGlrZSAiMHg0IiBhbmQKKyAgICAiMHg1MDciIHRoYXQgeW91IGRvbid0IG5vcm1hbGx5IGV4cGVjdCB0byBzZWUgaW4geW91ciBjYWxsIHBhdGguCisgICAgCisgICAgU2lnbmVkLW9mZi1ieTogUGV0ZXIgSm9uZXMgPHBqb25lc0ByZWRoYXQuY29tPgorCisgICAgQXV0aG9yOiBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisgICAgRGF0ZTogICBXZWQgSnVuIDEyIDEwOjI5OjQwIDIwMTMgLTA0MDAKKworICAgIGJ1ZyBpbiBtYWtlIDMuODIgZXhwYW5kIHRvIG9kZCB2YWx1ZXMKKyAgICAKKyAgICBTb21lIE1ha2VmaWxlcyB0aWNrbGUgYSBidWcgaW4gbWFrZSAzLjgyIHRoYXQgY2F1c2UgbGliZWZpLmEKKyAgICBhbmQgbGliZ251ZWZpLmEgZGVwZW5kZW5jaWVzIHRvIGV4cGFuZCB0byB0aGUgb2RkIHZhbHVlczoKKyAgICAKKyAgICBsaWJlZmkuYTogYm94ZHJhdy5vKSBzbWJpb3MubykgLi4uCisgICAgbGliZ251ZWZpLmEocmVsb2NfeDg2XzY0Lm86CisgICAgCisgICAgVGhlIHBhdGNoIHJlcGxhY2VzIGxpYmdudWVmaS5hKCQoT0JKUykpICYgbGliZWZpLmEoJChPQkpTKSkKKyAgICB3aXRoIGFuIGVxdWl2YWxlbnQgZXhwYW5zaW9uIHRoYXQgc2hvdWxkIHdvcmsgd2l0aCBhbnkgbWFrZQorICAgIHRoYXQgc3VwcG9ydHMgJChwYXRzdWJzdCkuCisKKyAgICBBdXRob3I6IE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKyAgICBEYXRlOiAgIFdlZCBKdW4gMTIgMDk6NTM6MDEgMjAxMyAtMDQwMAorCisgICAgc3VwcG9ydCAudGV4dC4qIHNlY3Rpb25zIG9uIHg4Nl82NAorICAgIAorICAgIEdyb3VwIHRoZW0gaW4gLnRleHQuIEFsc28gYWRkIHZhZ3VlIGxpbmthZ2Ugc2VjdGlvbnMgaW4gLnRleHQuCisgICAgCisgICAgU2lnbmVkLW9mZi1ieTogRGF2aWQgRGVjb3RpZ255IDxkZWNvdEBnb29nbGVycy5jb20+CisKKyAgICBBdXRob3I6IE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKyAgICBEYXRlOiAgIFdlZCBKdW4gMTIgMDk6NTE6MzYgMjAxMyAtMDQwMAorCisgICAgY2xlYW51cCBhbmQgZml4IE1ha2UuZGVmYXVsdHMKKyAgICAKKyAgICBSZW9yZGVyIHZhcmlhYmxlcyBpbiBNYWtlLmRlZmF1bHRzIHNvIHRoYXQgdGhleSBhcmUgZ3JvdXBlZCBieQorICAgIGZ1bmN0aW9ucy4gQWxzbyBmaXhlZCBpZmVxICh4LHkpIHRvIGhhdmUgcmVxdWlyZWQgc3ludGF4IGFuZCBtYWtlIGl0CisgICAgd29yayBmb3IgQVJDSCBhbWQ2NC0+eDg2XzY0IHJlbmFtaW5nIG9uIEJTRC4gQWxzbyBwcm92aWRlcyB0b3AtbGV2ZWwKKyAgICBNYWtlZmlsZSB3aXRoIGEgIm1rdmFycyIgdGFyZ2V0IHRoYXQgZGlzcGxheXMgZWZmZWN0aXZlIHZhcmlhYmxlcy4KKyAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBEZWNvdGlnbnkgPGRlY290QGdvb2dsZXJzLmNvbT4KKworICAgIEF1dGhvcjogTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgIERhdGU6ICAgV2VkIEp1biAxMiAwOTo0NzoxNiAyMDEzIC0wNDAwCisKKyAgICBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBudW1iZXIgb2YgdWVmaV9jYWxsX3dyYXBwZXIoKSBhcmdzIG9uIHg4Nl82NAorICAgIAorICAgIEluc3RlYWQgb2YgYXNraW5nIGRldmVsb3BlcnMgdG8gZXhwbGljaXRseSBwYXNzIHRoZSBudW1iZXIgb2YKKyAgICBwYXJhbWV0ZXJzIHRvIHRoZSBmdW5jdGlvbnMgdGhhdCBnZXQgY2FsbGVkLCB3ZSBkZXRlcm1pbmUgdGhlbQorICAgIGF1dG9tYXRpY2FsbHkgYXQgcHJlcHJvY2Vzc2luZyB0aW1lLiBUaGlzIHNob3VsZCByZXN1bHQgaW4gbW9yZQorICAgIHJvYnVzdCBjb2RlLgorICAgIAorICAgIEFyZ3VtZW50IHZhX251bSBpcyBub3cgaWdub3JlZCBpbiB4ODZfNjQgY29kZSwgYm90aCB3aXRoIGFuZAorICAgIHdpdGhvdXQgSEFWRV9VU0VfTVNfQUJJLgorICAgIAorICAgIENyZWRpdHMgdG8gdGhlIG1hY3JvIG1hZ2ljIGdpdmVuIGluIHRoZSBjb21tZW50cy4KKyAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBEZWNvdGlnbnkgPGRlY290QGdvb2dsZXJzLmNvbT4KKworICAgIEF1dGhvcjogTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgIERhdGU6ICAgV2VkIEp1biAxMiAwOTozODoxMCAyMDEzIC0wNDAwCisKKyAgICBmaXggcGFyYW1ldGVyLXBhc3NpbmcgY29ycnVwdGlvbiBvbiB4ODZfNjQgZm9yID49IDUgYXJncworICAgIAorICAgIE9uIHg4Nl82NCB3aXRob3V0IEhBVkVfVVNFX01TX0FCSSBzdXBwb3J0LCB1ZWZpX2NhbGxfd3JhcHBlcigpIGlzIGEKKyAgICB2YXJpYWRpYyBmdW5jdGlvbi4gUGFyYW1ldGVycyA+PTUgYXJlIGNvcGllZCB0byB0aGUgc3RhY2sgYW5kLCB3aGVuCisgICAgcGFzc2VkIHNtYWxsIGltbWVkaWF0ZSB2YWx1ZXMgKGFuZCBwb3NzaWJseSBvdGhlciBwYXJhbWV0ZXJzKSwgZ2NjCisgICAgd291bGQgZW1pdCBhIG1vdmwgaW5zdHJ1Y3Rpb24gYmVmb3JlIGNhbGxpbmcgdWVmaV9jYWxsX3dyYXBwZXIoKS4gQXMgYQorICAgIHJlc3VsdCwgb25seSB0aGUgbG93ZXIgMzJiIG9mIHRoZXNlIHN0YWNrIHZhbHVlcyBhcmUgc2lnbmlmaWNhbnQsIHRoZQorICAgIHVwcGVyIDMyYiBwb3RlbnRpYWxseSBjb250YWluIGdhcmJhZ2UuIENvbnNpZGVyaW5nIHRoYXQKKyAgICB1ZWZpX2NhbGxfd3JhcHBlcigpIGFzc3VtZXMgdGhlc2UgYXJndW1lbnRzIGFyZSBjbGVhbiA2NGIgdmFsdWVzCisgICAgYmVmb3JlIGNhbGxpbmcgdGhlIGVmaV9jYWxsWCgpIHRyYW1wb2xpbmVzLCB0aGUgbGF0dGVyIG1heSBiZSBwYXNzZWQKKyAgICBnYXJiYWdlLiBUaGlzIG1ha2VzIGNhbGxpbmcgZnVuY3Rpb25zIGxpa2UKKyAgICBFRklfUENJX0lPX1BST1RPQ09MLk1lbS5SZWFkKCkvV3JpdGUoKSBvciBCUy0+T3BlblByb3RvY29sKCkgcXVpdGUKKyAgICB1bnJlbGlhYmxlLgorICAgIAorICAgIFRoaXMgcGF0Y2ggZml4ZXMgdGhpcyBieSB0dXJuaW5nIHVlZmlfY2FsbF93cmFwcGVyKCkgaW50byBhIG1hY3JvIHRoYXQKKyAgICBhbGxvd3MgdG8gZXhwb3NlIHRoZSBlZmlfY2FsbFgoKSB0cmFtcG9saW5lIHNpZ25hdHVyZXMgdG8gdGhlIGNhbGxlcnMsCisgICAgc28gdGhhdCBnY2MgY2FuIGtub3cgdXBmcm9udCB0aGF0IGl0IGhhcyB0byBwYXNzIGFsbCBhcmd1bWVudHMgdG8KKyAgICBlZmlfY2FsbFgoKSBhcyBjbGVhbiA2NGIgdmFsdWVzIChlZy4gbW92cSBmb3IgaW1tZWRpYXRlcykuIFRoZQorICAgIF9jYXN0NjRfZWZpX2NhbGxYIG1hY3JvcyBhcmUganVzdCBoZXJlIHRvIGF2b2lkIGEgZ2NjIHdhcm5pbmcsIHRoZXkgZG8KKyAgICBub3RoaW5nIG90aGVyd2lzZS4KKyAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBEZWNvdGlnbnkgPGRlY290QGdvb2dsZXJzLmNvbT4KKworICAgIEF1dGhvcjogbm94b3JjIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgIERhdGU6ICAgV2VkIE1heSAxNSAxNToyNjoxNiAyMDEzIC0wNDAwCisKKyAgICAtIFJlbW92ZXMgdGhlIEVsZlcoKSBtYWNybyB1c2FnZSBmcm9tIHJlbG9jX2lhMzIuYyBhbmQgcmVsb2NfeDg2XzY0LmMuIFRoZXNlCisgICAgbWFjcm9zIG9ubHkgZXhpc3QgaW4gbGluay5oIG9uIExpbnV4LiBPbiBGcmVlQlNELCB0aGUgZXF1aXZhbGVudCBtYWNybyBpcworICAgIF9fRWxmTigpLiBCdXQgdGhlIG1hY3JvIHVzYWdlIGlzIHJlZHVuZGFudC4gWW91J3JlIG9ubHkgZ29pbmcgdG8gY29tcGlsZSB0aGUKKyAgICBpYTMyIGZpbGUgZm9yIElBMzIgYmluYXJpZXMgYW5kIHRoZSB4ODZfNjQgZmlsZSBmb3IgWDY0IGJpbmFyaWVzLiBJZiB5b3UgaGFkCisgICAganVzdCBvbmUgZmlsZSBidWlsdCBmb3IgYm90aCBjYXNlcywgdGhlbiB1c2luZyB0aGUgbWFjcm8gbWlnaHQgbWFrZSBtb3JlCisgICAgc2Vuc2UuCisgICAgCisgICAgLSBSZW1vdmVzIHRoZSAiI2RlZmluZSBmb29fdCBlZmlfZm9vX3QiIG1hY3JvcyBmcm9tIHJlbG9jX2lhMzIuYyBhbmQKKyAgICByZWxvY194ODZfNjQuYy4KKyAgICAKKyAgICAtIE1vZGlmaWVzIGluYy94ODZfNjQvZWZpYmluZC5oIGFuZCBpbmMvaWEzMi9lZmliaW5kLmggdG8gdXNlIHRoZSBuZXcKKyAgICBkZWZpbml0aW9ucyBmb3IgdWludDY0X3QsIGludDY0X3QgYW5kIGludDhfdC4gVGhlIDY0LWJpdCB0eXBlcyBhcmUgbm93IGRlZmluZWQKKyAgICBhczoKKyAgICAKKyAgICAgICAgICAgIHR5cGVkZWYgaW50IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKSAgICAgICAgICAgaW50NjRfdDsKKyAgICAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKSAgdWludDY0X3Q7CisgICAgCisgICAgVGhpcyByZW1vdmVzIHRoZSBjb25mbGljdCBiZXR3ZWVuIHRoZSBob3N0IHR5cGVzIGRyYWdnZWQgaW4gYnkgZWxmLmggYW5kIHRoZQorICAgIHR5cGUgZGVmaW5pdGlvbnMgaW4gZWZpYmluZC5oIHRoYXQgbWFkZSB0aGUgI2RlZmluZSBmb29fdCBlZmlfZm9vX3QiIGhhY2sKKyAgICBuZWNlc3NhcnkuIEFsc28sIGludDhfdCBpcyBub3cgZGVmaW5lZCBhcyBzaWduZWQgY2hhciBpbnN0ZWFkIG9mIGp1c3QgY2hhcgorICAgIChhc3N1bWluZyBjaGFyID09IHNpZ25lZCBjaGFyIGlzIGFwcGFyZW50bHkgbm90IGdvb2QgZW5vdWdoKS4KKyAgICAKKyAgICAtIEFsc28gbW9kaWZpZXMgdGhlc2UgZmlsZXMgdG8gdXNlIHN0ZGludC5oIGluc3RlYWQgb2Ygc3RkaW50LWdjYy5oLiBJdCdzCisgICAgdW5jbGVhciBpZiB0aGlzIGlzIGNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IHN0ZGludC1nY2MuaCBpcyBub3QgcHJlc2VudCB3aXRoCisgICAgYWxsIEdDQyBpbnN0YWxscywgYW5kIGlmIHlvdSB1c2UgLXN0ZD1jOTkgb3IgbGF0ZXIgeW91IHdpbGwgZm9yY2UgdGhpcyBjYXNlIHRvCisgICAgYmUgaGl0LiBUaGlzIGFsc28gY2FuIGJyZWFrIGNsYW5nLCB3aGljaCBkb2Vzbid0IGhhdmUgYSBzdGRpbnQtZ2NjLmggYXQgYWxsLgorICAgIAorICAgIC0gUmVtb3ZlcyB0aGUgI2luY2x1ZGUgb2YgPGxpbmsuaD4gZnJvbSByZWxvY19pYTMyLmMgYW5kIHJlbG9jX3g4Nl82NC5jIChzaW5jZQorICAgIHdpdGggdGhlIHByZXZpb3VzIGNoYW5nZXMgaXQncyBub3QgbmVlZGVkIGFueW1vcmUpLgorICAgIAorICAgIC0gUGxhY2VzIHRoZSAjaW5jbHVkZSBvZiA8ZWxmLmg+IGFmdGVyICNpbmNsdWRlIDxlZmk+LyNpbmNsdWRlIDxlZmlsaWIuaD4gc28KKyAgICB0aGF0IHdlIGtub3cgdGhlIHR5cGVzIHdpbGwgYWx3YXlzIGJlIGRlZmluZWQgcHJvcGVybHksIGluIGNhc2UgeW91IGJ1aWxkIG9uIGEKKyAgICBzeXN0ZW0gd2hlcmUgPGVsZi5oPiBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgcHVsbCBpbiB0aGUgcmlnaHQgaGVhZGVyIGZpbGVzIHRvCisgICAgZGVmaW5lIGFsbCB0aGUgbmVlZGVkIHR5cGVzLiAoVGhpcyBhY3R1YWxseSBoYXBwZW5zIG9uIFZ4V29ya3MuIEl0J3MgaGFybWxlc3MKKyAgICBlbHNld2hlcmUuIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IFZ4V29ya3MsIHlvdSBjYW4gbGVhdmUgdGhpcyBvdXQuKQorICAgIAorICAgIC0gTW9kaWZpZXMgc2V0am1wX2lhMzIuUyBhbmQgc2V0am1wX3g4Nl82NC5TIHNvIHRvIGNoYW5nZSAiZnVuY3Rpb24iIHRvCisgICAgQGZ1bmN0aW9uLiBUaGUgY2xhbmcgY29tcGlsZXIgZG9lc24ndCBsaWtlIHRoZSBmb3JtZXIuIENsYW5nIGFuZCBHQ0MgYm90aCBsaWtlCisgICAgdGhlIGxhdHRlci4KKyAgICAKKyAgICAtIE1vZGlmbGVzIE1ha2UuZGVmYXVsdHMgc28gdGhhdCBpZiBBUkNIIGlzIGRldGVjdGVkIGFzICJhbWQ2NCwiIGl0J3MgY2hhbmdlZAorICAgIHRvICJ4ODZfNjQuIiBJdCBoYXBwZW5zIHRoYXQgdW5hbWUgLW0gb24gNjQtYml0IEZyZWVCU0QgcmVwb3J0cyB0aGUgZm9ybWVyCisgICAgcmF0aGVyIHRoYW4gdGhlIGxhdHRlciwgd2hpY2ggYnJlYWtzIHRoZSBidWlsZC4gVGhpcyBtYXkgYWxzbyBiZSB0aGUgY2FzZSBvbgorICAgIHNvbWUgb3RoZXIgT1Nlcy4gVGhlcmUncyBhIHdheSB0byBmb3JjZSB1bmFtZSgxKSB0byByZXR1cm4geDg2XzY0IGFzIHRoZQorICAgIG1hY2hpbmUgdHlwZSwgYnV0IHRoaXMgd2F5IGlzIGEgbGl0dGxlIGZyaWVuZGxpZXIuCisgICAgCisgICAgLSBDcmVhdGVzIGdudWVmaS9lbGZfaWEzMl9mYnNkX2VmaS5sZHMgd2hpY2ggc3BlY2lmaWVzIHRoZSBvYmplY3QgZmlsZSB0eXBlIGFzCisgICAgZWxmLWlhMzItZnJlZWJzZC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgYnVpbGRpbmcgb24gRnJlZUJTRC9pMzg2LCBub3QganVzdAorICAgIEZyZWVCU0QvYW1kNjQuCisgICAgCisgICAgLSBNb2RpZmllcyBhcHBzL01ha2VmaWxlIHRvIGFsd2F5cyB1c2UKKyAgICAkKFRPUERJUikvZ251ZWZpL2VsZl8kKEFSQ0gpX2Zic2RfZWZpLmxkcyB3aGVuIGJ1aWxkaW5nIG9uIGVpdGhlciAzMi1iaXQgb3IKKyAgICA2NC1iaXQgRnJlZUJTRCBpbnN0ZWFkIG9mIGp1c3QgZm9yIHRoZSB4ODZfNjQgY2FzZS4KKyAgICAKKyAgICAtIENoYW5nZWQgTERGTEFHUyBpbiBNYWtlLmRlZmF1bHRzIHRvIGluY2x1ZGUgLS1uby11bmRlZmluZWQuIFRoaXMgd2lsbCBjYXVzZQorICAgIGxpbmtpbmcgdG8gZmFpbCBpZiB0aGVyZSBhcmUgYW55IHVuc2F0aXNmaWVkIHN5bWJvbHMgd2hlbiBjcmVhdGluZyBmb28uc28KKyAgICBkdXJpbmcgYW55IG9mIHRoZSBhcHAgYnVpbGRzLCBhcyBvcHBvc2VkIHRvIGp1c3Qgc2lsZW50bHkgc3VjY2VlZGluZyBhbmQKKyAgICBwcm9kdWNpbmcgYW4gdW51c2FibGUgYmluYXJ5LgorICAgIAorICAgIC0gQ2hhbmdlZCBDRkxBR1MgdG8gaW5jbHVkZSAtZmZyZWVzdGFuZGluZyAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLXN0YWNrLQorICAgIGNoZWNrLiBUaGlzIHByZXZlbnRzIGNsYW5nIGZyb20gaW5zZXJ0aW5nIGEgY2FsbCB0byBtZW1zZXQoKSB3aGVuIGNvbXBpbGluZworICAgIHRoZSBSdFplcm9NZW0oKSBhbmQgUnRTZXRNZW0oKSByb3V0aW5lcyBpbiBsaWIvcnVudGltZS9lZmlydGxpYi5jIGFuZCBndWFyZHMKKyAgICBhZ2FpbnN0IHRoZSBuYXRpdmUgY29tcGlsZXIgaW4gc29tZSBMaW51eCBkaXN0cm9zIGZyb20gYWRkaW5nIGluIHN0YWNrCisgICAgY2hlY2tpbmcgY29kZSB3aGljaCByZWxpZXMgb24gbGliYyBoZWxwIHRoYXQgaXNuJ3QgcHJlc2VudCBpbiB0aGUgRUZJIHJ1bnRpbWUKKyAgICBlbnZpcm9ubWVudC4KKyAgICAKKyAgICBUaGlzIGRvZXMgdGhlIGZvbGxvd2luZzoKKyAgICAKKyAgICAtIENsZWFucyB1cCB0aGUgaWEzMiBhbmQgeDg2LTY0IHJlbG9jYXRpb24gY29kZSBhIGJpdCAodHJpZXMgdG8gYnJlYWsgdGhlCisgICAgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBob3N0IEVMRiBoZWFkZXJzIGFuZCB0aGUgRUZJIHJ1bnRpbWUgZW52aXJvbm1lbnQpCisgICAgLSBBdm9pZHMgdGhlIGRlcGVuZGVuY3kgb24gc3RkaW50LWdjYy5oIHdoaWNoIG1heSBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZQorICAgIC0gQWxsb3dzIEdOVSBFRkkgdG8gYnVpbGQgb3V0IG9mIHRoZSBib3ggb24gYm90aCBGcmVlQlNEL2kzODYgYW5kCisgICAgRnJlZUJTRC9hbWQ2NAorICAgIC0gQWxsb3dzIEdOVSBFRkkgdG8gYnVpbGQgb3V0IG9mIHRoZSBib3ggd2l0aCBlaXRoZXIgR0NDIG9yIGNsYW5nIG9uCisgICAgRnJlZUJTRC9pMzg2IGFuZCBGcmVlQlNEL2FtZDY0IDkuMCBhbmQgbGF0ZXIuCisgICAgLSBNYWtlcyB0aGluZ3MgYSBsaXR0bGUgZWFzaWVyIHRvIHBvcnQgdG8gVnhXb3JrcworICAgIC0gQXZvaWRzIGNyZWF0aW5nIHVuLXJ1bmFibGUgYmluYXJpZXMgd2l0aCB1bnJlc29sdmVkIHN5bWJvbCBkZWZpbml0aW9ucworICAgICh3aGljaCBjYW4gYmUgdmVyeSBjb25mdXNpbmcgdG8gZGVidWcpCisKKyAgICBBdXRob3I6IG5veG9yYyA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKyAgICBEYXRlOiAgIFdlZCBNYXkgOCAxNjoyOTo0NSAyMDEzIC0wNDAwCisKKyAgICBBZGQgdGhlIGRlZmluaXRpb25zIGZvciBUQ1AsIFVEUCBhbmQgSVAsIGZvciBib3RoIElQdjQgYW5kIElQdjYuCisKKworMjAxMy0wNS0wMiBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisJKiBDaG5hZ2UgZnJvbSBNYXR0IEZsZW1pbmcgPG1hdHQuZmxlbWluZ0BpbnRlbC5jb20+CisJICAtIFByZXBhcmF0aW9uIGZvciBhZGRpbmcgdGhlIG5ldHdvcmtpbmcgcHJvdG9jb2wgZGVmaW5pdGlvbnMuCisJICAgIEFkZCB0aGUgc2VydmljZSBiaW5kaW5nIHByb3RvY29sLgorCisyMDEzLTAyLTIxIE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKwkqIENoYW5nZSBmcm9tIFBldGVyIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KKwkgIC0gUHJldmlvdXNseSB3ZSB3ZXJlIGluY29ycmVjdGx5IHBhc3NpbmcgMyBmdW5jdGlvbnMgd2l0aAorICAgICAgICAgICAgdGhlIFN5c3RlbSBWIEFCSSB0byBVRUZJIGZ1bmN0aW9ucyBhcyBFRkkgQUJJIGZ1bmN0aW9ucy4KKyAgICAgICAgICAgIE1hcmsgdGhlbSBhcyBFRklBUEkgc28gdGhlIGNvbXBpbGVyIHdpbGwgKGluIG91ciBuZXcKKyAgICAgICAgICAgIEdOVV9FRklfVVNFX01TX0FCSSB3b3JsZCkgdXNlIHRoZSBjb3JyZWN0IEFCSS4KKyAgICAgICAgICAtIFRoZXNlIG5lZWQgdG8gYmUgRUZJQVBJIGZ1bmN0aW9ucyBiZWNhdXNlIGluIHNvbWUgY2FzZXMKKyAgICAgICAgICAgIHRoZXkgY2FsbCBTVC0+Q29uT3V0LT5PdXRwdXRTdHJpbmcoKSwgd2hpY2ggaXMgYW4gRUZJQVBJCisgICAgICAgICAgICBmdW5jdGlvbi4gKFdoaWNoIG1lYW5zIHRoYXQgcHJldmlvdXNseSBpbiBjYXNlcyB0aGF0IAorICAgICAgICAgICAgbmVlZGVkICJjZGVjbCIsIHRoZXNlIGRpZG4ndCB3b3JrIHJpZ2h0LikKKyAgICAgICAgICAtIElmIHRoZSBjb21waWxlciB2ZXJzaW9uIGlzIG5ldyBlbm91Z2gsIGFuZCBHTlVfRUZJX1VTRV9NU19BQkkKKyAgICAgICAgICAgIGlzIGRlZmluZWQsIHVzZSB0aGUgZnVuY3Rpb24gYXR0cmlidXRlIG1zX2FiaSBvbiBldmVyeXRoaW5nCisgICAgICAgICAgICBkZWZpbmVkIHdpdGggIkVGSUFQSSIuICBTdWNoIGNhbGxzIHdpbGwgbm8gbG9uZ2VyIGdvIHRocm91Z2gKKyAgICAgICAgICAgIGVmaV9jYWxsKiwgYW5kIGFzIHN1Y2ggd2lsbCBiZSBwcm9wZXJseSB0eXBlLWNoZWNrZWQuCisgICAgICAgICAgLSBIb25vciBQUkVGSVggYW5kIExJQkRJUiBjb3JyZWN0bHkgd2hlbiBwYXNzZWQgaW4gZHVyaW5nIHRoZSBidWlsZC4KKyAgICAgICAgICAtIEFkZCBtYWNoaW5lIHR5cGUgZGVmaW5lcyBmb3IgaTM4NiwgYXJtL3RodW1iLCBpYTY0LCBlYmMsIHg4Nl82NC4KKyAgICAgICAgICAtIF9fU1REQ19WRVJTSU9OX18gbmV2ZXIgYWN0dWFsbHkgZ2V0cyBkZWZpbmVkIHVubGVzcyB0aGVyZSdzIGEKKyAgICAgICAgICAgIC0tc3RkPS4uLiBsaW5lLiAgU28gd2Ugd2VyZSBhY2NpZGVudGFsbHkgZGVmaW5pbmcgbG90cyBvZiBjOTkKKyAgICAgICAgICAgIHR5cGVzIG91cnNlbGYuIFNpbmNlIGl0J3MgMjAxMiwgdXNlIC0tc3RkPWMxMSB3aGVyZSBhcHByb3ByaWF0ZSwKKyAgICAgICAgICAgIGFuZCBpZiBpdCdzIGRlZmluZWQgYW5kIHdlJ3JlIHVzaW5nIGdjYywgYWN0dWFsbHkgaW5jbHVkZSBnY2MncworICAgICAgICAgICAgc3RkaW50IGRlZmluaXRpb25zLgorICAgICAgICAgIC0gTmV3IHRlc3QgYXBwbGljYXRpb24gYWRkZWQ6IHJvdXRlODBoLiBUaGlzIGlzIGEgdGVzdCBwcm9ncmFtCisgICAgICAgICAgICBmb3IgUGNpSW8uICBJdCByb3V0ZXMgaW9wb3J0IDgwaCBvbiBJQ0gxMCB0byBQQ0kuIFRoaXMgaXMgYWxzbworICAgICAgICAgICAgdXNlZnVsIG9uIGEgdmVyeSBsaW1pdGVkIHNldCBvZiBoYXJkd2FyZSB0byBlbmFibGUgdXNlIG9mCisgICAgICAgICAgICBhIHBvcnQgODBoIGRlYnVnIGNhcmQuCisgICAgICAgICAgLSBOZXcgdGVzdCBhcHBsY2F0aW9uIGFkZGVkOiBtb2RlbGlzdC4gVGhpcyBsaXN0cyB2aWRlbyBtb2RlcworICAgICAgICAgICAgdGhlIEdPUCBkcml2ZXIgaXMgc2hvd2luZyB1cy4KKwkqIENoYW5nZSBmcm9tIEZpbm5iYXJyIE11cnBoeQorICAgICAgICAgIC0gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9nbnUtZWZpL2ZlYXR1cmUtcmVxdWVzdHMvMi8KKyAgICAgICAgICAgIFBsZWFzZSBhZGQgdGhlIGZvbGxvd2luZyBzdGF0dXMgY29kZXMgdG8gPGVmaWVyci5oPgorICAgICAgICAgICAgRUZJX0lOQ09NUEFUSUJMRV9WRVJTSU9OIDI1CisgICAgICAgICAgICBFRklfU0VDVVJJVFlfVklPTEFUSU9OIDI2IAorICAgICAgICAgICAgRUZJX0NSQ19FUlJPUiAyNyAKKyAgICAgICAgICAgIEVGSV9FTkRfT0ZfTUVESUEgMjggCisgICAgICAgICAgICBFRklfRU5EX09GX0ZJTEUgMzEgCisgICAgICAgICAgICBFRklfSU5WQUxJRF9MQU5HVUFHRSAzMiAKKyAgICAgICAgICAgIEVGSV9DT01QUk9NSVNFRF9EQVRBIDMzCisJKiBDaGFuZ2UgZnJvbSBTb3VyY2VGb3JnZS5uZXQgQnVnIHJlcG9ydAorICAgICAgICAgIC0gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9nbnUtZWZpL2J1Z3MvNS8KKyAgICAgICAgICAgIEJ1ZmZlclNpemUgaXMgYSBVSU5UNjQgKi4gVGhlIGZpbGUgc2hpcHBlZCB3aXRoIEdOVSBFRkkgaXMgZnJvbQorICAgICAgICAgICAgMTk5OCB3aGVyZWFzIHRoZSBsYXRlc3Qgb25lIGlzIGZyb20gMjAwNC4gSSBzdXNwZWN0IEludGVsIGNoYW5nZWQKKyAgICAgICAgICAgIHRoZSBBUEkgaW4gb3JkZXIgaGFuZGxlIDY0LWJpdCBzeXN0ZW1zLgorICAgICAgICAqIENoYW5nZSBmcm9tIEZlbGlwZSBDb250cmVyYXMgPGZlbGlwZS5jb250cmVyYXNAZ21haWwuY29tPgorICAgICAgICAgIC0gVGhlIGN1cnJlbnQgY29kZSBzZWVtcyB0byBzY3JldyB0aGUgc3RhY2sgYXQgY2VydGFpbiBwb2ludHMuCisgICAgICAgICAgICBNdWx0aXBsZSBwZW9wbGUgaGF2ZSBjb21wbGFpbmVkIHRoYXQgZ3VtbWlib290IGhhbmdzIHJpZ2h0IGF3YXksCisgICAgICAgICAgICB3aGljaCBpcyBpbiBwYXJ0IHRoZSBmYXVsdCBvZiBndW1taWJvb3QsIGJ1dCBoYXBwZW5zIG9ubHkKKyAgICAgICAgICAgIGJlY2F1c2UgdGhlIHN0YWNrIGdldHMgc2NyZXdlZC4geDg2XzY0IEVGSSBhbHJlYWR5IGFsaWducyB0aGUKKyAgICAgICAgICAgIHN0YWNrLCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIHNvIG11Y2ggY29kZSB0byBmaW5kIGEgcHJvcGVyCisgICAgICAgICAgICBhbGlnbm1lbnQsIHdlIGFsd2F5cyBuZWVkIHRvIHNoaWZ0IGJ5IDggYW55d2F5LgorICAgICAgICAqIENoYW5nZSBmcm9tIEEuIFN0ZWlubWV0egorICAgICAgICAgIC0gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9nbnUtZWZpL3BhdGNoZXMvMS8KKyAgICAgICAgICAgIFRoZSBwYXRjaCBwcmVwYXJlcyBmb3IgZWxpbG8gdG8gc3VwcG9ydCB1ZWZpIHB4ZSBvdmVyIGlwdjYKKyAgICAgICAgICAgIFNlZSB1ZWZpIHNwZWMgMi4zLjEgZXJyYXRhIGMgcGFnZSA5NjMgYXMgcmVmZXJlbmNlLgorICAgICAgICAgICAgVmVyZmllZCBvbiBhbiBBU1VTIFNhYmVydG9vdGggWDc5IEJJT1MgUmV2LiAyMTA0IHN5c3RlbSB3aGljaAorICAgICAgICAgICAgaXMgYWJsZSB0byBkbyBhbiBJUHY2IFVFRkkgUFhFIGJvb3QuCisJKiBSZWxlYXNlIDMuMHQKKworMjAxMi0wOS0yMSBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisJKiBDaGFuZ2UgZnJvbSBQZXRlciBKb25lcyA8cGpvbmVzQHJlZGhhdC5jb20+CisJICAtIEVGSSBCbG9jayBJL08gcHJvdG9jb2wgdmVyc2lvbnMgMiBhbmQgMyBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24KKwkgICAgcmVnYXJkaW5nIHBoeXNpY2FsIGRpc2sgbGF5b3V0LCBpbmNsdWRpbmcgYWxpbmdtZW50IG9mZnNldCBhdCB0aGUKKwkgICAgYmVnaW5uaW5nIG9mIHRoZSBkaXNrICgiTG93ZXN0QWxpZ25lZExiYSIpLCBsb2dpY2FsIGJsb2NrIHNpemUKKwkgICAgKCJMb2dpY2FsQmxvY2tzUGVyUGh5c2ljYWxCbG9jayIpLCBhbmQgb3B0aW1hbCBibG9jayB0cmFuc2ZlciBzaXplCisJICAgICgiT3B0aW1hbFRyYW5zZmVyTGVuZ3RoR3JhbnVsYXJpdHkiKS4KKwkqIFJlbGVhc2UgMy4wcgorCisyMDEyLTA0LTMwIE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKwkqIENoYW5nZSBmcm9tIE1hdHQgRmxlbWluZyA8bWF0dC5mbGVtaW5nQGludGVsLmNvbT4KKwkgIC0gIFRoZSAucmVsb2Mgc2VjdGlvbiBpcyBub3cgNDA5Ni1ieXRlIGJvdW5kYXJ5IGZvciB4ODZfNjQuCisJICAgICBXaXRob3V0IHRoaXMgcGF0Y2ggdGhlIC5yZWxvYyBzZWN0aW9uIHdpbGwgbm90IGFkaGVyZSB0bworCSAgICAgdGhlIGFsaWdubWVudCB2YWx1ZSBpbiB0aGUgRmlsZUFsaWdubWVudCBmaWVsZCAoNTEyIGJ5dGVzIGJ5CisJICAgICBkZWZhdWx0KSBvZiB0aGUgUEUvQ09GRiBoZWFkZXIuIFRoaXMgcmVzdWx0cyBpbiBhIHNpZ25lZAorCSAgICAgZXhlY3V0YWJsZSBmYWlsaW5nIHRvIGJvb3QgaW4gYSBzZWN1cmUgYm9vdCBlbnZpcm9ubWVudC4KKwkqIFJlbGVhc2UgMy4wcQorCisyMDExLTEyLTEyIE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKyAgICAgICAgKiBDaGFuZ2VzIGZyb20gRmVuZ2h1YSBZdSA8ZmVuZ2h1YS55dUBpbnRlbC5jb20+CisgICAgICAgICAgLSBUaGlzIGZpeGVzIHJlZGVmaW5lZCB0eXBlcyBjb21waWxhdGlvbiBmYWlsdXJlIGZvciB0Y2MuYyBvbiB4ODZfNjQgbWFjaGluZXMuCisgICAgICAgICogUmVsZWFzZSAzLjBwCisKKzIwMTEtMTEtMTUgTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgICAgICAqIENoYW5nZXMgZnJvbSBEYXJyZW4gSGFydCA8ZHZoYXJ0QGxpbnV4LmludGVsLmNvbT4KKyAgICAgICAgICAtIENvbmRpdGlvbmFsbHkgYXNzaWduIHRvb2xjaGFpbiBiaW5hcmllcyB0byBhbGxvdyBvdmVycmlkaW5nIHRoZW0uCisgICAgICAgICAgLSBGb3JjZSBhIGRlcGVuZGVuY3kgb24gbGliIGZvciBnbnVlZmkuCisgICAgICAgICogUmVsZWFzZSAzLjBuCisKKzIwMTEtMDgtMjMgTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgICAgICAqIENoYW5nZXMgZnJvbSBQZXRlciBKb25lcyA8cGpvbmVzQHJlZGhhdC5jb20+CisgICAgICAgICAgLSBBZGQgZ3VhcmFudGVlIDE2LWJ5dGUgc3RhY2sgYWxpZ25tZW50IG9uIHg4Nl82NC4KKyAgICAgICAgICAtIEFkZCByb3V0aW5lIHRvIG1ha2UgY2FsbGJhY2tzIHdvcmsuCisgICAgICAgICAgLSBBZGQgYXBwcy90Y2MuZWZpIHRvIHRlc3QgY2FsbGluZyBjb252ZW50aW9uLgorICAgICAgICAqIFJlbGVhc2UgMy4wbQorCisyMDExLTA3LTIyIE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKwkqIENoYW5nZWQgTWFrZWZpbGVzIGZyb20gR1BMIHRvIEJTRC4KKwkqIENoYW5nZXMgZnJvbSBQZXRlciBKb25lcyA8cGpvbmVzQHJlZGhhdC5jb20+CisJICAtIEFkZCBpZmRlZnMgZm9yIGlhNjQgdG8gbWlycm9yIGlhMzIgYW5kIHg4Ni02NCBzbyB0aGF0CisJICAgIG9uZSBjYW4gYnVpbGQgd2l0aCBHQ0MuCisJICAtIEFkZCBoZWFkZXJzIGZvciBQY2lJby4KKwkgIC0gQWRkIHRoZSBVRUZJIDIueCBiaXRzIGZvciBFRklfQk9PVF9TRVJWSUNFUworCSAgLSBBZGQgYW4gaWdub3JlIGZvciAubm90ZS5HTlUtc3RhY2sgc2VjdGlvbiBpbiBYODYtNjQgbGlua2VyIG1hcHMuCisgICAgICAgICogUmVsZWFzZSAzLjBsCisKKzIwMTEtMDQtMDcgIE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKyAgICAgICAgKiBDaGFuZ2UgbGljZW5zZSBmcm9tIEdQTCB0byBCU0QuCisgICAgICAgICogUmVsZWFzZSAzLjBqCisKKzIwMDktMDktMTIgIEp1bGllbiBCTEFDSEUgPGpiQGpibGFjaGUub3JnPgorCSogQWRkIHN1cHBvcnQgZm9yIEZyZWVCU0QuCisJKiBSZWxlYXNlIDMuMGkKKworMjAwOS0wOS0xMSAgSnVsaWVuIEJMQUNIRSA8amJAamJsYWNoZS5vcmc+CisJKiBGaXggZWxmX2lhMzJfZWZpLmxkcyBsaW5rZXIgc2NyaXB0IHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgbmV3CisgICAgICAgICAgbGlua2VyIGJlaGF2aW91ci4gUGF0Y2ggZnJvbSB0aGUgUmVkSGF0IGJ1Z3ppbGxhIDQ5MjE4My4KKworMjAwOS0wNi0xOCAgTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorICAgICAgICAqIFJlbGVhc2UgMy4waAorCisyMDA4LTExLTA2ICBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisgICAgICAgICogRml4IHRvIG5vdCBoYXZpbmcgYW55IHJlbG9jYXRpb25zIGF0IGFsbC4gCisKKzIwMDgtMDktMTggIE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4KKyAgICAgICAgKiBVc2UgTElCRElSIGluIG1ha2VmaWxlcworICAgICAgICAqIEFkZCBzZXRqbXAvbG9uZ2ptcAorICAgICAgICAqIEZpeGVzIGluY29ycmVjdCBzZWN0aW9uIGF0dHJpYnV0ZSBpbiBjcnQwLWVmaS1pYTMyLlMKKyAgICAgICAgKiBBZGRzIHZhbHVlIEVmaVJlc2V0U2h1dGRvd24gdG8gZW51bSBFRklfUkVTRVRfVFlQRQorICAgICAgICAqIEZpeGVzIGEgUkFXIHdhcm5pbmcgaW4gcmVsb2NfaWE2NC5TCisgICAgICAgICogQWRkcyB0aGUgVVNCIEhDSSBkZXZpY2UgcGF0aCBzdHJ1Y3R1cmUgaW4gdGhlIGhlYWRlcnMKKyAgICAgICAgICBwYXRjaGVzIHdlcmUgc3VwcGxpZWQgYnkgUGV0ZXIgSm9uZXMgQCBSZWRIYXQKKworMjAwOC0wMi0yMiAgTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorCSogQWRkZWQgJy1tbm8tcmVkLXpvbmUnIHRvIHg2OF82NCBjb21waWxlcy4KKwkgIFBhdGNoIHByb3ZpZGVkIGJ5IE1hdHMgQW5kZXJzc29uLgorCisyMDA4LTAxLTIzICBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisgICAgICAgICogcmVsZWFzZSAzLjBlIHRvIHN1cHBvcnQgeDg2XzY0CisgICAgICAgICAgRUZJIGNhbGxpbmcgY29udmVudGlvbiwgdGhlIHN0YWNrIHNob3VsZCBiZSBhbGlnbmVkIGluIDE2IGJ5dGVzCisgICAgICAgICAgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgU1NFMiBpbiBFRkkgYm9vdCBzZXJ2aWNlcy4KKyAgICAgICAgICBUaGlzIHBhdGNoIGZpeGVzIHRoaXMgaXNzdWUuIFBhdGNoIHByb3ZpZGVkIGJ5IEh1YW5nIFlpbmcgZnJvbSBJbnRlbC4KKworMjAwNy0wNS0xMSBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+CisgICAgICAgICogcmVsZWFzZSAzLjBkIHRvIHN1cHBvcnQgeDg2XzY0IGZyb20gQ2hhbmRyYW1vdWxpIE5hcmF5YW5hbgorICAgICAgICAgIGZyb20gSW50ZWwgYW5kIGJhc2VkIG9uIDMuMGMtMQorCisyMDA2LTAzLTIxICBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisJKiBtZXJnZWQgcGF0Y2ggdG8gc3VwcG9ydCBnY2MtNC4xIHN1Ym1pdHRlZCBieQorCSAgUmF5bXVuZCBXaWxsIGZyb20gTm92ZWxsL1N1U0UKKworMjAwNi0wMy0yMCAgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorCSogdXBkYXRlZCBpYS02NCBhbmQgaWEtMzIgbGlua2VyIHNjcmlwdHMgdG8KKwkgIG1hdGNoIGxhdGVzdCBnY2MuIFRoZSBuZXcgZ2NjIG1heSBwdXQgZnVuY3Rpb25zIGluCisJICAudGV4dCogc2VjdGlvbnMuIHBhdGNoIHN1Ym1pdHRlZCBieSBILkouIEx1IGZyb20gSW50ZWwuCisKKzIwMDQtMTEtMTkgIFN0ZXBoYW5lIEVyYW5pYW4gPGVyYW5pYW5AaHBsLmhwLmNvbT4KKwkqIGFkZGVkIHBhdGNoIHRvIGlnbm9yZSAuZWhfZnJhbWUgc2VjdGlvbiBmb3IgSUEtMzIuIFBhdGNoCisJICBzdWJtaXR0ZWQgYnkgSmltIFdpbHNvbgorCisyMDA0LTA5LTIzICBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisJKiBhZGRlZCBwYXRjaCB0byBkaXNjYXJkIHVud2luZCBzZWN0aW9ucywgbmV3ZXIgdG9vbGNoYWlucworCSAgY29tcGxhaW5lZCBhYm91dCB0aGVtLiBQYXRjaCBzdWJtaXR0ZWQgYnkgSmVzc2UgQmFybmVzIGZyb20gU0dJLgorCisyMDAzLTA5LTI5ICBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisJKiB1cGRhdGVkIGVsZl9pYTY0X2VmaS5sZHMgdG8gcmVmbGVjdCBuZXcgZGF0YSBzZWN0aW9ucyAKKwkgIGNyZWF0ZWQgYnkgZ2NjLTMuMy4gUGF0Y2ggcHJvdmlkZWQgYnkgQW5kcmVhcyBTY2h3YWIgZnJvbSBTdXNlLgorCisyMDAzLTA2LTIwICBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisJKiB1cGRhdGVkIGVsZl9pYTY0X2VmaS5sZHMgYW5kIGVsZl9pYTMyX2VmaS5sZHMgdG8gaW5jbHVkZQorCSAgbmV3IHR5cGVzIGRhdGEgc2VjdGlvbnMgcHJvZHVjZWQgYnkgcmVjZW50IHZlcnNpb24gb2YgZ2NjLTMueAorCisyMDAyLTAyLTIyICBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisJKiByZWxlYXNlIDMuMGEKKwkqIG1vZGlmaWVkIGJvdGggSUEtNjQgYW5kIElBLTMyIGxvYWRlciBzY3JpcHRzIHRvIGFkZCBzdXBwb3J0IGZvciB0aGUKKwkgIG5ldyAucm9kYXRhIHNlY3Rpb25zIG5hbWVzIChzdWNoIGFzIHJvZGF0YS5zdHIyLjgpLiBSZXF1aXJlZAorCSAgZm9yIG5ldyB2ZXJzaW9ucyBvZiBnY2MzLnguCisKKzIwMDEtMDYtMjAgIFN0ZXBoYW5lIEVyYW5pYW4gPGVyYW5pYW5AaHBsLmhwLmNvbT4KKwkqIHJlbGVhc2UgMy4wCisJKiBzcGxpdCBnbnUtZWZpIHBhY2thZ2UgaW4gdHdvIGRpZmZlcmVudCBwYWNrYWdlczogdGhlIGxpYmFyeStpbmNsdWRlK2NydCBhbmQgdGhlIGJvb3Rsb2FkZXIuCisJKiByZW1vdmVkIFcyVSgpIGhhY2sgYW5kIHJlbGF0ZWQgZmlsZXMgdG8gZ2V0IGZyb20gd2lkZS1jaGFyIHRvIHVuaWNvZGUuIAorCSogVXNlIC1mc2hvcnQtd2NoYXIgb3B0aW9uIGZvciB1bmljb2RlLgorCSogcmVzdHJ1Y3R1cmVkIE1ha2VmaWxlcyBub3cgaW5zdGFsbCB1bmRlciBJTlNUQUxMUk9PVC4KKworMjAwMS0wNC0wNiAgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorCisJKiBpbmNvcnBvcmF0ZWQgcGF0Y2hlcyBmcm9tIERhdmlkIGFuZCBNaWNoYWVsIEpvaG5zdG9uIGF0IEludGVsCisJICB0byBnZXQgdGhlIHBhY2thZ2UgdG8gY29tcGlsZSBmb3IgSUEtMzIgbGludXggdGFyZ2V0LgorCisJKiBGaXhlZCBFTElMTyB0byBjb21waWxlIGZvciBJYS0zMiAoZG9lcyBub3QgZXhlY3V0ZSB5ZXQsIHRob3VnaCk6CisJICBNYWtlZmlsZSBhbmQgc3RhcnRfa2VybmVsKCkgZnVuY3Rpb24uCisKKzIwMDEtMDQtMDYgIEFuZHJlYXMgU2Nod2FiIDxzY2h3YWJAc3VzZS5kZT4KKworCSogRml4ZWQgY29uZmlnLmMgIHRvCisJICBnZXQgdGhlIHRpbWVvdXQgZGlyZWN0aXZlIHRvIGRvIHNvbWV0aGluZy4gaW1wbGVtZW50ZWQgdGhlIGdsb2JhbAorCSAgcm9vdD0gZGlyZWN0aXZlLgorCisJKiBGaXggdGhlIGVmaV9tYWluKCkgdG8gZGVhbCB3aXRoIHRoZSAtQyBvcHRpb24gcHJvcGVybHkKKworMjAwMS0wNC0wNSAgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorCisJKiB1cGRhdGUgZWZpIGxpYnJhcnkgdG8gbGF0ZXN0IEVGSSB0b29sa2l0IDEuMDIgYXMgZGlzdHJpYnV0ZWQKKwkgIGJ5IEludGVsLiBGaXhlZCBoZWFkZXIgKyBsaWJyYXJ5IGZpbGVzIHRvIGNvbXBpbGUgd2l0aCBHQ0MKKworCSogbWVyZ2VkIEVMSSBhbmQgTElMTyAoYXMgb2YgZ251LWVmaS0xLjEpIHRvZ2V0aGVyLCBtb3N0bHkKKwkgIHRha2luZyB0aGUgY29uZmlnIGZpbGUgZmVhdHVyZSBvZiBFTEkuCisKKwkqIHJlbmFtZWQgTElMTyB0byBFTElMTyB0byBtYWtlIHRoZSBkaXN0aW5jdGlvbgorCisJKiByZXN0cnVjdHVyZWQgY29kZSB0byBtYWtlIGl0IGVhc2llciB0byB1bmRlcnN0YW5kIGFuZCBtYWludGFpbgorCisJKiBmaXhlZCBGUFNXQSBkcml2ZXIgY2hlY2tpbmcgYW5kIGxvYWRpbmc6IHdlIHRyeSBhbGwgcG9zc2libGUKKwkgIGZpbGVzIGFuZCBsZXQgdGhlIGRyaXZlciBpdHNlbGYgZmlndXJlIG91dCBpZiBpdCBpcyB0aGUgbW9zdAorCSAgcmVjZW50LgorCSogYWRkZWQgc3VwcG9ydCBmb3IgY29tcHJlc3Npb24gKGd6aXApIGJ1dCBrZWVwIHN1cHBvcnQgZm9yIHBsYWluCisJICBFTEYgaW1hZ2UuIEVMSUxPIGF1dG9kZXRlY3RzIHRoZSBmb3JtYXQKKworCSogY2hhbmdlIHRoZSB3YXkgdGhlIGtlcm5lbCBpcyBpbnZva2VkLiBOb3cgd2UgY2FsbCBpdCBpbiAKKwkgIHBoeXNpY2FsIG1lbW9yeSBtb2RlLiBUaGlzIGJyZWFrcyB0aGUgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZQorCSAga2VybmVsIGNvZGUgYW5kIHRoZSBsb2FkZXIuIE5vIG1vcmUgbGlsb19zdGFydC5jIG1hZG5lc3MuCisKKwkqIGNoYW5nZWQgdGhlIHdheSB0aGUgYm9vdF9wYXJhbXMgYXJlIHBhc3NlZC4gV2UgZG9uJ3QgdXNlIHRoZSAKKwkgIFpFUk9fUEFHRV9BRERSIHRyaWNrIGFueW1vcmUuIEluc3RlYWQgd2UgdXNlIEVGSSBydW50aW1lIG1lbW9yeS4KKwkgIFRoZSBhZGRyZXNzIG9mIHRoZSBzdHJ1Y3R1cmUgaXMgcGFzc2VkIHRvIHRoZSBrZXJuZWwgaW4gcjI4CisJICBieSBvdXIgY29udmVudGlvbi4KKworCSogcmVsZWFzZWQgYXMgZ251LWVmaS0yLjAKKworMjAwMS0wNC0wMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+CisKKwkqIGdudWVmaS9yZWxvY19pYTMyLmMgKF9yZWxvY2F0ZSk6IENoYW5nZSByZXR1cm4gdHlwZSBmcm9tICJ2b2lkIgorCXRvICJpbnQiLiAgUmV0dXJuIGVycm9yIHN0YXR1cyBpZiByZWxvY2F0aW9uIGZhaWxzIGZvciBzb21lCisJcmVhc29uLgorCisJKiBnbnVlZmkvZWxmX2lhMzJfZWZpLmxkczogRHJvcCB1bm5lZWRlZCAiLnJlbC5yZWxvYyIgc2VjdGlvbi4KKworCSogZ251ZWZpL2NydDAtZWZpLWlhMzIuUyAoX3N0YXJ0KTogRXhpdCBpZiBfcmVsb2NhdGUoKSByZXR1cm5zIHdpdGgKKwlub24temVybyBleGl0IHN0YXR1cy4KKworCSogaW5jL2lhMzIvZWZpYmluZC5oIFtfX0dOVUNfX106IEZvcmNlIDgtYnl0ZSBhbGlnbm1lbnQgZm9yIDY0LWJpdAorCXR5cGVzIGFzIHRoYXQgaXMgd2hhdCBFRkkgYXBwZWFycyB0byBiZSBleHBlY3RpbmcsIGRlc3BpdGUgdGhlCisJIiNwcmFnbWEgcGFjaygpIiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIQorCisyMDAxLTAzLTI5ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KKworCSogZ251ZWZpL3JlbG9jX2lhMzIuYzogQWRkIGEgY291cGxlIG9mIGRlZmluZXMgdG8gd29yayBhcm91bmQKKwlsaWJjL2VmaWxpYiBjb2xsaXNpb24gb24gdWludDY0X3QgZXQgYWwuCisJKF9yZWxvY2F0ZSk6IFVzZSBFTEYzMl9SX1RZUEUoKSBpbnN0ZWFkIG9mIEVMRlcoUl9UWVBFKSgpLgorCisJKiBnbnVlZmkvY3J0MC1lZmktaWEzMi5TIChkdW1teSk6IEFkZCBhIGR1bW15IHJlbG9jYXRpb24gZW50cnkuCisKKzIwMDEtMDMtMjkgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgorCisgICAgICAgICogZ251ZWZpL3JlbG9jX2lhMzIuYzogQWRkIGEgY291cGxlIG9mIGRlZmluZXMgdG8gd29yayBhcm91bmQKKyAgICAgICAgbGliYy9lZmlsaWIgY29sbGlzaW9uIG9uIHVpbnQ2NF90IGV0IGFsLgorICAgICAgICAoX3JlbG9jYXRlKTogVXNlIEVMRjMyX1JfVFlQRSgpIGluc3RlYWQgb2YgRUxGVyhSX1RZUEUpKCkuCisKKyAgICAgICAgKiBnbnVlZmkvY3J0MC1lZmktaWEzMi5TIChkdW1teSk6IEFkZCBhIGR1bW15IHJlbG9jYXRpb24gZW50cnkuCisKKzIwMDAtMTAtMjYgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgorIAorIAkqIGdudWVmaS9lbGZfaWE2NF9lZmkubGRzOiBNZW50aW9uIC5yZWxhLnNkYXRhLgorIAorIAkqIE1ha2UuZGVmYXVsdHMgKENGTEFHUyk6IFJlbW92ZSAtbm9zdGRpbmMgZmxhZ3Mgc28gd2UgY2FuIHBpY2sKKyAJdXAgdGhlIEMgY29tcGlsZXIncyBzdGRhcmcuaC4KKyAKKyAJKiBpbmMvc3RkYXJnLmg6IFJlbW92ZSB0aGlzIGZpbGUuICBJdCdzIG5vdCBjb3JyZWN0IGZvciBnY2MgKG5vcgorIAltb3N0IG90aGVyIG9wdGltaXppbmcgY29tcGlsZXJzKS4KKworMjAwMC0xMC0xMCAgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorCisJKiBjbGVhbmVkIHVwIHRoZSBlcnJvciBtZXNzYWdlIGFuZCBwcmludGluZyBvZiB0aG9zZS4KKwkqIGFkZGVkIHN1cHBvcnQgdG8gbG9hZCB0aGUgRlBTV0EgZnJvbSBhIGZpbGUgaW4gY2FzZSBzdXBwb3J0IGlzIG5vdAorCSAgcHJlc2VudCBpbiB0aGUgZmlybXdhcmUgYWxyZWFkeQorCSogZml4ZWQgc3BsaXRfYXJncygpIHRvIGRvIHRoZSByaWdodCB0aGluZyB3aGVuIHlvdSBoYXZlIGxlYWRpbmcgc3BhY2VzCisJICBiZWZvcmUga2VybmVsIG5hbWUKKwkqIGNoYW5nZWQgdGhlIGFyZ2lmeSgpIGZ1bmN0aW9uIHRvIHJlbHkgb24gXDAgaW5zdGVhZCBvZiBMb2FkT3B0aW9uU2l6ZQorCSAgYXMgdGhlIGZpZWxkIHNlZW1zIHRvIGJlIGJyb2tlbiB3aXRoIGN1cnJlbnQgZmlybXdhcmUKKwkqIGJ1bXBlZCB2ZXJzaW9uIHRvIDEuMAorCisyMDAwLTEwLTA0ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KKyAKKwkqIGdudWVmaS9yZWxvY19pYTY0LlM6IFJlc2VydmUgc3BhY2UgZm9yIHVwIHRvIDc1MCBmdW5jdGlvbiBkZXNjcmlwdG9ycy4KKworCSogZ251ZWZpL2VsZl9pYTY0X2VmaS5sZHM6IEFkZCAuc2RhdGEgc2VjdGlvbiBmb3Igc21hbGwgZGF0YSBhbmQKKwlwdXQgX19ncCBpbiB0aGUgIm1pZGRsZSIgb2YgaXQuCisKKwkqIGdudWVmaS9jcnQwLWVmaS1pYTY0LlMgKF9zdGFydCk6IFVzZSBtb3ZsL2FkZCB0byBsb2FkCisJZ3AtcmVsYXRpdmUgYWRkcmVzc2VzIHRoYXQgY291bGQgYmUgb3V0IG9mIHRoZSByYW5nZSBvZiB0aGUgYWRkbAorCW9mZnNldC4KKwkqIGdudWVmaS9yZWxvY19pYTY0LlMgKF9yZWxvY2F0ZSk6IERpdHRvLgorCisJKiBhcHBzL01ha2VmaWxlOiBSZW1vdmUgc3RhbmRhcmQgcnVsZXMgYW5kIGluY2x1ZGUgTWFrZS5ydWxlcyBpbnN0ZWFkLgorCSogbGlsby9NYWtlZmlsZTogRGl0dG8uCisKKwkqIE1ha2UucnVsZXM6IE5ldyBmaWxlLgorCisyMDAwLTA4LTA0ICBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisJKiByZWxlYXNlZCB2ZXJzaW9uIDAuOQorCSogaW5jb3Jwb3JhdGVkIEFDUEkgY2hhbmdlcyBmb3IgQXN1emEgYnkgTkVDIDwga291Y2hpQGhwYy5iczEuZmMubmVjLmNvLmpwPgorCSogYWRkZWQgc3VwcG9ydCBmb3IgaW5pdHJkICgtaSBvcHRpb24pIG9yaWdpbmFsIEVMSSBjb2RlIGZyb20gQmlsbCBOb3R0aW5naGFtIDxub3R0aW5nQHJlZGhhdC5jb20+KQorCSogbG90cyBvZiBjbGVhbnVwcyAKKwkqIGdvdCByaWQgb2YgI2lmZGVmIExJTE9fREVCVUcgYW5kIHVzZXMgbWFjcm8gaW5zdGVhZAorCSogZml4IGEgZmV3IGV4dHJhIG1lbW9yeSBsZWFrcyBpbiBjcmVhdGVfYm9vdF9wYXJhbXMoKQorCSogYWRkZWQgZXhpdCBjYXBhYmlsaXR5IGp1c3QgYmVmb3JlIHN0YXJ0aW5nIHRoZSBrZXJuZWwKKworMjAwMC0wNi0yMiAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+CisKKwkqIGdudWVmaS9lbGZfaWE2NF9lZmkubGRzOiBBZGQgLnNyb2RhdGEsIC5jdG9ycywgLklBNjQudW53aW5kLAorCS5JQTY0LnVud2luZF9pbmZvIHRvIC5kYXRhIHNlY3Rpb24gYW5kIC5yZWxhLmN0b3JzIHRvIC5yZWxhCisJc2VjdGlvbi4KKworMjAwMC0wNC0wMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+CisKKwkqIGxpbG8vbGlsby5jIChMSUxPX1ZFUlNJT04pOiBVcCB2ZXJzaW9uIG51bWJlciB0byAwLjkuCisKKwkqIGdudWVmaS9lbGZfaWE2NF9lZmkubGRzOiBJbmNsdWRlIC5JQV82NC51bndpbmQgYW5kCisJLklBXzY0LnVud2luZF9pbmZvIGluIC5kYXRhIHNlZ21lbnQgdG8gYXZvaWQgRUZJIGxvYWQgZXJyb3IKKwkiSW1hZ2VBZGRyZXNzOiBwb2ludGVyIG91dHNpZGUgb2YgaW1hZ2UiIGVycm9yIGR1ZSB0byB0aGUgLmR5bnN5bQorCXJlbG9jYXRpb25zIGFnYWluc3QgdGhlc2Ugc2VjdGlvbnMuCisKKwkqIENoYW5nZUxvZzogTW92ZWQgZnJvbSBsaWxvL0NoYW5nZUxvZ3MuCisKKwkqIGdudWVmaS9yZWxvY19pYTY0LlM6IGZpeGVkIHR5cG86IC5zcGFjZSBkaXJlY3RpdmUgaGFkIGNvbnN0YW50CisJMTAwIGhhcmRjb2RlZCBpbnN0ZWFkIG9mIHVzaW5nIE1BWF9GVU5DVElPTl9ERVNDUklQVE9SUworCW1hY3JvLiBEdWguCisKK0ZyaSBNYXIgMTcgMTU6MTk6MTggUFNUIDIwMDAgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorCisJKiBSZWxlYXNlZCAwLjgKKwkqIHJlcGxhY2UgdGhlICBnZXRvcHQuYyB3aXRoIG5ldyB2ZXJzaW9uIGZyZWUgd2l0aCBiZXR0ZXIgbGljZW5zZQorCSogY3JlYXRlZCBhIGRvY3VtZW50YXRpb24gZmlsZQorCSogZml4IGEgY291cGxlIG9mIG1lbW9yeSBsZWFrcworCSogY29kZSBjbGVhbnVwcworCSogY3JlYXRlZCBhIHNlcGFyYXRlIGRpcmVjdG9yeSBmb3IgbGlsbyBpbiB0aGUgZ251LWVmaSBwYWNrYWdlLgorCSogYWRkZWQgc3VwcG9ydCBmb3IgdGhlIEJPT1RfSU1BR0UgYXJndW1lbnQgdG8ga2VybmVsCisJKiBkZWZhdWx0IGlzIHRvIGJ1aWxkIG5hdGl2ZWx5IG5vdwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9NYWtlLmRlZmF1bHRzIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9NYWtlLmRlZmF1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MTIxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL01ha2UuZGVmYXVsdHMKQEAgLTAsMCArMSwxMTcgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorIwlDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXIgPGRhdmlkbUBocGwuaHAuY29tPgorIwlDb250cmlidXRlZCBieSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisjCisjICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgICAgYXJlIG1ldDoKKyMKKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyMgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyMgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgQ28uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisjICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyMgICAgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyMgICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyMgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgICAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyMgICAgQkUgTElBQkxFIEZPUiBBTllESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisjICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorIyAgICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgICAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyMgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GCisjICAgIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyAgICBTVUNIIERBTUFHRS4KKyMKKworVE9QRElSIDo9ICQoc2hlbGwgaWYgWyAiJCRQV0QiICE9ICIiIF07IHRoZW4gZWNobyAkJFBXRDsgZWxzZSBwd2Q7IGZpKQorCisjCisjIFZhcmlhYmxlcyBiZWxvdyBvdmVycmlkYWJsZSBmcm9tIGNvbW1hbmQtbGluZToKKyMgICBtYWtlIFZBUk5BTUU9dmFsdWUgLi4uCisjCisKKyMKKyMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgcGFja2FnZS4gR05VLUVGSSB3aWxsIGNyZWF0ZSBhbmQgYWNjZXNzCisjIGxpYiBhbmQgaW5jbHVkZSB1bmRlciB0aGUgcm9vdAorIworSU5TVEFMTFJPT1QgIDo9IC8KK1BSRUZJWCAgICAgICA6PSAvdXNyL2xvY2FsCitMSUJESVIgCSAgICAgOj0gJChQUkVGSVgpL2xpYgorSU5TVEFMTAkgICAgIDo9IGluc3RhbGwKKworIyBDb21waWxhdGlvbiB0b29scworcHJlZml4ICAgICAgIDo9IC91c3IvYmluLworQ0MgICAgICAgICAgIDo9ICQocHJlZml4KWdjYworQVMgICAgICAgICAgIDo9ICQocHJlZml4KWFzCitMRCAgICAgICAgICAgOj0gJChwcmVmaXgpbGQKK0FSICAgICAgICAgICA6PSAkKHByZWZpeClhcgorUkFOTElCICAgICAgIDo9ICQocHJlZml4KXJhbmxpYgorT0JKQ09QWSAgICAgIDo9ICQocHJlZml4KW9iamNvcHkKKworCisjIEhvc3QvdGFyZ2V0IGlkZW50aWZpY2F0aW9uCitPUwkgICAgIDo9ICQoc2hlbGwgdW5hbWUgLXMpCitIT1NUQVJDSCAgICAgOj0gJChzaGVsbCAkKENDKSAtZHVtcG1hY2hpbmUgfCBjdXQgLWYxIC1kLSB8IHNlZCBzLGlbMzQ1Njc4OV04NixpYTMyLCkKK0FSQ0gJICAgICA6PSAkKHNoZWxsIHVuYW1lIC1tIHwgc2VkIHMsaVszNDU2Nzg5XTg2LGlhMzIsKQorCisjIEZyZWVCU0QgKGFuZCBwb3NzaWJseSBvdGhlcnMpIHJlcG9ydHMgYW1kNjQgaW5zdGVhZCBvZiB4ODZfNjQKK2lmZXEgKCQoQVJDSCksYW1kNjQpCisgIG92ZXJyaWRlIEFSQ0ggOj0geDg2XzY0CitlbmRpZgorCisjCisjIFZhcmlhYmxlcyBiZWxvdyBkZXJpdmVkIGZyb20gdmFyaWFibGVzIGFib3ZlCisjCisKK0dDQ1ZFUlNJT04gICA6PSAkKHNoZWxsICQoQ0MpIC1kdW1wdmVyc2lvbiB8IGN1dCAtZjEgLWQuKQorR0NDTUlOT1IgICAgIDo9ICQoc2hlbGwgJChDQykgLWR1bXB2ZXJzaW9uIHwgY3V0IC1mMiAtZC4pCisKKyMgUmVseSBvbiBHQ0MgTVMgQUJJIHN1cHBvcnQ/CitHQ0NORVdFTk9VR0ggOj0gJChzaGVsbCAoIFsgJChHQ0NWRVJTSU9OKSAtZ3QgIjQiIF0gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCBbICQoR0NDVkVSU0lPTikgLWVxICI0IiBdICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFsgJChHQ0NNSU5PUikgLWdlICI3IiBdICkgKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBlY2hvIDEpCitpZmVxICgkKEdDQ05FV0VOT1VHSCksMSkKKyAgQ1BQRkxBR1MgKz0gLURHTlVfRUZJX1VTRV9NU19BQkkgLW1hY2N1bXVsYXRlLW91dGdvaW5nLWFyZ3MgLS1zdGQ9YzExCitlbmRpZgorCisjIEFyY2gtc3BlY2lmaWMgY29tcGlsYXRpb24gZmxhZ3MKK0NQUEZMQUdTICs9IC1EQ09ORklHXyQoQVJDSCkKKworaWZlcSAoJChBUkNIKSxpYTY0KQorICBDRkxBR1MgKz0gLW1maXhlZC1yYW5nZT1mMzItZjEyNworZW5kaWYKKworaWZlcSAoJChBUkNIKSxpYTMyKQorICBDRkxBR1MgKz0gLW1uby1tbXggLW1uby1zc2UKKyAgaWZlcSAoJChIT1NUQVJDSCkseDg2XzY0KQorICAgIEFSQ0gzMjY0ID0gLW0zMgorICBlbmRpZgorZW5kaWYKKworaWZlcSAoJChBUkNIKSx4ODZfNjQpCisgIENGTEFHUyArPSAtbW5vLXJlZC16b25lIC1tbm8tbW14IC1tbm8tc3NlCisgIGlmZXEgKCQoSE9TVEFSQ0gpLGlhMzIpCisgICAgQVJDSDMyNjQgPSAtbTY0CisgIGVuZGlmCitlbmRpZgorCisjIEdlbmVyaWMgY29tcGlsYXRpb24gZmxhZ3MKK0lOQ0RJUiAgKz0gLUkkKFNSQ0RJUikgLUkkKFRPUERJUikvaW5jIC1JJChUT1BESVIpL2luYy8kKEFSQ0gpIFwKKyAgICAgICAgICAgLUkkKFRPUERJUikvaW5jL3Byb3RvY29sCitDRkxBR1MgICs9ICQoQVJDSDMyNjQpIC1PMiAtZnBpYyAtV2FsbCAtZnNob3J0LXdjaGFyIC1mbm8tc3RyaWN0LWFsaWFzaW5nIFwKKyAgICAgICAgICAgLWZuby1tZXJnZS1jb25zdGFudHMgLWZmcmVlc3RhbmRpbmcgLWZuby1zdGFjay1wcm90ZWN0b3IgICAgICAgXAorICAgICAgICAgICAtZm5vLXN0YWNrLWNoZWNrCitBU0ZMQUdTICs9ICQoQVJDSDMyNjQpCitMREZMQUdTCSs9IC1ub3N0ZGxpYiAtLXdhcm4tY29tbW9uIC0tbm8tdW5kZWZpbmVkIC0tZmF0YWwtd2FybmluZ3MKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvTWFrZS5ydWxlcyBiL2dudS1lZmkvZ251LWVmaS0zLjAvTWFrZS5ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWZiNjEyCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9NYWtlLnJ1bGVzCkBAIC0wLDAgKzEsNTEgQEAKKyMKKyMgIENvcHlyaWdodCAoQykgMTk5OS0yMDA3IEhld2xldHQtUGFja2FyZCBDby4KKyMJQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyIDxkYXZpZG1AaHBsLmhwLmNvbT4KKyMJQ29udHJpYnV0ZWQgYnkgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorIworIyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjICAgIGFyZSBtZXQ6CisjCisjICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisjICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisjICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSGV3bGV0dC1QYWNrYXJkIENvLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorIyAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECisjICAgIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisjICAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisjICAgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjICAgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisjICAgIEJFIExJQUJMRSBGT1IgQU5ZRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAorIyAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyAgICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyMgICAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjICAgIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisjICAgIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRgorIyAgICBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgICAgU1VDSCBEQU1BR0UuCisjCisKKyUuZWZpOiAlLnNvCisJJChPQkpDT1BZKSAtaiAudGV4dCAtaiAuc2RhdGEgLWogLmRhdGEgLWogLmR5bmFtaWMgLWogLmR5bnN5bSAtaiAucmVsIFwKKwkJICAgLWogLnJlbGEgLWogLnJlbG9jIC0tdGFyZ2V0PSQoRk9STUFUKSAkKi5zbyAkQAorCislLnNvOiAlLm8KKwkkKExEKSAkKExERkxBR1MpICReIC1vICRAICQoTE9BRExJQkVTKQorCislLm86ICUuYworCSQoQ0MpICQoSU5DRElSKSAkKENGTEFHUykgJChDUFBGTEFHUykgLWMgJDwgLW8gJEAKKworJS5TOiAlLmMKKwkkKENDKSAkKElOQ0RJUikgJChDRkxBR1MpICQoQ1BQRkxBR1MpIC1TICQ8IC1vICRACisKKyUuRTogJS5jCisJJChDQykgJChJTkNESVIpICQoQ0ZMQUdTKSAkKENQUEZMQUdTKSAtRSAkPCAtbyAkQApkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9NYWtlZmlsZSBiL2dudS1lZmkvZ251LWVmaS0zLjAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjNGYyYgotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvTWFrZWZpbGUKQEAgLTAsMCArMSw5OSBAQAorIworIyAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgSGV3bGV0dC1QYWNrYXJkIENvLgorIwlDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXIgPGRhdmlkbUBocGwuaHAuY29tPgorIwlDb250cmlidXRlZCBieSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisjCisjICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgICAgYXJlIG1ldDoKKyMKKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyMgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyMgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgQ28uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisjICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyMgICAgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyMgICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyMgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgICAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyMgICAgQkUgTElBQkxFIEZPUiBBTllESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisjICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorIyAgICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgICAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyMgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GCisjICAgIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyAgICBTVUNIIERBTUFHRS4KKyMKKworU1JDRElSID0gJChzaGVsbCBwd2QpCisKK1ZQQVRIID0gJChTUkNESVIpCisKK2luY2x1ZGUgJChTUkNESVIpL01ha2UuZGVmYXVsdHMKKworU1VCRElSUyA9IGxpYiBnbnVlZmkgaW5jIGFwcHMKK2dudWVmaTogbGliCisKK2FsbDoJY2hlY2tfZ2NjICQoU1VCRElSUykKKworbWt2YXJzOgorCUBlY2hvIEFSPSQoQVIpCisJQGVjaG8gQVJDSD0kKEFSQ0gpCisJQGVjaG8gQVJDSDMyNjQ9JChBUkNIMzI2NCkKKwlAZWNobyBBUz0kKEFTKQorCUBlY2hvIEFTRkxBR1M9JChBU0ZMQUdTKQorCUBlY2hvIENDPSQoQ0MpCisJQGVjaG8gQ0ZMQUdTPSQoQ0ZMQUdTKQorCUBlY2hvIENQUEZMQUdTPSQoQ1BQRkxBR1MpCisJQGVjaG8gR0NDTUlOT1I9JChHQ0NNSU5PUikKKwlAZWNobyBHQ0NORVdFTk9VR0g9JChHQ0NORVdFTk9VR0gpCisJQGVjaG8gR0NDVkVSU0lPTj0kKEdDQ1ZFUlNJT04pCisJQGVjaG8gSE9TVEFSQ0g9JChIT1NUQVJDSCkKKwlAZWNobyBJTkNESVI9JChJTkNESVIpCisJQGVjaG8gSU5TVEFMTD0kKElOU1RBTEwpCisJQGVjaG8gSU5TVEFMTFJPT1Q9JChJTlNUQUxMUk9PVCkKKwlAZWNobyBMRD0kKExEKQorCUBlY2hvIExERkxBR1M9JChMREZMQUdTKQorCUBlY2hvIExJQkRJUj0kKExJQkRJUikKKwlAZWNobyBPQkpDT1BZPSQoT0JKQ09QWSkKKwlAZWNobyBPUz0kKE9TKQorCUBlY2hvIHByZWZpeD0kKHByZWZpeCkKKwlAZWNobyBQUkVGSVg9JChQUkVGSVgpCisJQGVjaG8gUkFOTElCPSQoUkFOTElCKQorCUBlY2hvIFNSQ0RJUj0kKFNSQ0RJUikKKwlAZWNobyBUT1BESVI9JChUT1BESVIpCisKKyQoU1VCRElSUyk6CisJbWtkaXIgLXAgJEAKKwkkKE1BS0UpIC1DICRAIC1mICQoU1JDRElSKS8kQC9NYWtlZmlsZSBTUkNESVI9JChTUkNESVIpLyRAIEFSQ0g9JChBUkNIKQorCitjbGVhbjoKKwlybSAtZiAqfgorCUBmb3IgZCBpbiAkKFNVQkRJUlMpOyBkbyAkKE1BS0UpIC1DICQkZCAtZiAkKFNSQ0RJUikvJCRkL01ha2VmaWxlIFNSQ0RJUj0kKFNSQ0RJUikvJCRkICBjbGVhbjsgZG9uZQorCitpbnN0YWxsOgorCUBmb3IgZCBpbiAkKFNVQkRJUlMpOyBkbyBcCisJCW1rZGlyIC1wICQkZDsgXAorCQkkKE1BS0UpIC1DICQkZCAtZiAkKFNSQ0RJUikvJCRkL01ha2VmaWxlIFNSQ0RJUj0kKFNSQ0RJUikvJCRkIGluc3RhbGw7IGRvbmUKKworLlBIT05ZOgkkKFNVQkRJUlMpIGNsZWFuIGRlcGVuZAorCisjCisjIG9uIGJvdGggcGxhdGZvcm1zIHlvdSBtdXN0IHVzZSBnY2MgMy4wIG9yIGhpZ2hlciAKKyMKK2NoZWNrX2djYzoKK2lmZXEgKCQoR0NDX1ZFUlNJT04pLDIpCisJQGVjaG8gInlvdSBuZWVkIHRvIHVzZSBhIHZlcnNpb24gb2YgZ2NjID49IDMuMCwgeW91IGFyZSB1c2luZyBgJChDQykgLS12ZXJzaW9uYCIKKwlAZXhpdCAxCitlbmRpZgorCitpbmNsdWRlICQoU1JDRElSKS9NYWtlLnJ1bGVzCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL1JFQURNRS5lZmlsaWIgYi9nbnUtZWZpL2dudS1lZmktMy4wL1JFQURNRS5lZmlsaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4NTdlYwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvUkVBRE1FLmVmaWxpYgpAQCAtMCwwICsxLDMwIEBACisKK1RoZSBmaWxlcyBpbiB0aGUgImxpYiIgYW5kICJpbmMiIHN1YmRpcmVjdG9yaWVzIGFyZSB1c2luZyB0aGUgRUZJIEFwcGxpY2F0aW9uIAorVG9vbGtpdCBkaXN0cmlidXRlZCBieSBJbnRlbCBhdCBodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS90ZWNobm9sb2d5L2VmaQorCitUaGlzIGNvZGUgaXMgY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGFncmVlbWVudDoKKworQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgSW50ZWwgQ29ycG9yYXRpb24KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZAorcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQKK3RoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucworYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgSU5URUwgQkUKK0xJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCitTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKK0lOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCitDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiBUSEUgRUZJIFNQRUNJRklDQVRJT04gQU5EIEFMTCBPVEhFUiBJTkZPUk1BVElPTgorT04gVEhJUyBXRUIgU0lURSBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIIE5PIFdBUlJBTlRJRVMsIEFORCBBUkUgU1VCSkVDVAorVE8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFLgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9SRUFETUUuZWxpbG8gYi9nbnUtZWZpL2dudS1lZmktMy4wL1JFQURNRS5lbGlsbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmE4MTcyCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9SRUFETUUuZWxpbG8KQEAgLTAsMCArMSwxOSBAQAorCisgICAgICAgICAgICAgSU1QT1JUQU5UIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGdudS1lZmkgcGFja2FnZQorICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnVuZSAyMDAxCisKK0FzIG9mIHZlcnNpb24gMy4wLCB0aGUgZ251LWVmaSBwYWNrYWdlIGlzIG5vdyBzcGxpdCBpbiB0d28gZGlmZmVyZW50IHBhY2thZ2VzOgorCisJLT4gZ251LWVmaS1YLnk6IGNvbnRhaW5zIHRoZSBFRkkgbGlicmFyeSwgaW5jbHVkZSBmaWxlcyBhbmQgY3J0MC4KKworCS0+IGVsaWxvLVgueSAgOiBjb250YWlucyB0aGUgRUxJTE8gYm9vdGxvYWRlci4gCisJCitOb3RlIHRoYXQgWC55IGRvbid0IG5lZWQgdG8gbWF0Y2ggZm9yIGJvdGggcGFja2FnZXMuIEhvd2V2ZXIgZWxpbG8tMy54CityZXF1aXJlcyBhdCBsZWFzdCBnbnUtZWZpLTMuMC4gRUZJIHN1cHBvcnQgZm9yIHg4Nl82NCBpcyBwcm92aWRlZCBpbgorZ251LWVmaS0zLjBkLgorCitCb3RoIHBhY2thZ2VzIGNhbiBiZSBkb3dubG9hZGVkIGZyb206CisKKwlodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9nbnUtZWZpCisJaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvZWxpbG8KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvUkVBRE1FLmdudWVmaSBiL2dudS1lZmkvZ251LWVmaS0zLjAvUkVBRE1FLmdudWVmaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTk2NmVmCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9SRUFETUUuZ251ZWZpCkBAIC0wLDAgKzEsMzk4IEBACisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUJ1aWxkaW5nIEVGSSBBcHBsaWNhdGlvbnMgVXNpbmcgdGhlIEdOVSBUb29sY2hhaW4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJRGF2aWQgTW9zYmVyZ2VyIDxkYXZpZG1AaHBsLmhwLmNvbT4KKworCQkJMjMgU2VwdGVtYmVyIDE5OTkKKworCisJCUNvcHlyaWdodCAoYykgMTk5OS0yMDA3IEhld2xldHQtUGFja2FyZCBDby4KKwkJQ29weXJpZ2h0IChjKSAyMDA2LTIwMTAgSW50ZWwgQ28uCisKK0xhc3QgdXBkYXRlOiAwNC8wOS8yMDA3CisKKyogSW50cm9kdWN0aW9uCisKK1RoaXMgZG9jdW1lbnQgaGFzIHR3byBwYXJ0czogdGhlIGZpcnN0IHBhcnQgZGVzY3JpYmVzIGhvdyB0byBkZXZlbG9wCitFRkkgYXBwbGljYXRpb25zIGZvciBJQS02NCx4ODYgYW5kIHg4Nl82NCB1c2luZyB0aGUgR05VIHRvb2xjaGFpbiBhbmQgdGhlIEVGSQorZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgY29udGFpbmVkIGluIHRoaXMgZGlyZWN0b3J5LiAgVGhlIHNlY29uZCBwYXJ0CitkZXNjcmliZXMgc29tZSBvZiB0aGUgbW9yZSBzdWJ0bGUgYXNwZWN0cyBvZiBob3cgdGhpcyBkZXZlbG9wbWVudAorZW52aXJvbm1lbnQgd29ya3MuCisKKworCisqIFBhcnQgMTogRGV2ZWxvcGluZyBFRkkgQXBwbGljYXRpb25zCisKKworKiogUHJlcmVxdWlzaXRlczoKKworIFRvIGRldmVsb3AgeDg2IGFuZCB4ODZfNjQgRUZJIGFwcGxpY2F0aW9ucywgdGhlIGZvbGxvd2luZyB0b29scyBhcmUgbmVlZGVkOgorCisJLSBnY2MtMy4wIG9yIG5ld2VyIChnY2MgMi43LjIgaXMgTk9UIHN1ZmZpY2llbnQhKQorCSAgQXMgb2YgZ251LWVmaS0zLjBiLCB0aGUgUmVkaGF0IDguMCB0b29sY2hhaW4gaXMga25vd24gdG8gd29yaywKKwkgIGJ1dCB0aGUgUmVkaGF0IDkuMCB0b29sY2hhaW4gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKKwktIEEgdmVyc2lvbiBvZiAib2JqY29weSIgdGhhdCBzdXBwb3J0cyBFRkkgYXBwbGljYXRpb25zLiAgVG8KKwkgIGNoZWNrIGlmIHlvdXIgdmVyc2lvbiBpbmNsdWRlcyBFRkkgc3VwcG9ydCwgaXNzdWUgdGhlCisJICBjb21tYW5kOgorCisJCW9iamNvcHkgLS1oZWxwCisKKwkgIGFuZCB2ZXJpZnkgdGhhdCB0aGUgbGluZSAic3VwcG9ydGVkIHRhcmdldHMiIGNvbnRhaW5zIHRoZQorCSAgc3RyaW5nICJlZmktYXBwLWlhMzIiIGFuZCAiZWZpLWFwcC14ODZfNjQiLiBUaGUgYmludXRpbHMgcmVsZWFzZQorCSAgYmludXRpbHMtMi4xNy41MC4wLjE0IHN1cHBvcnRzIEludGVsNjQgRUZJLgorCisJLSBGb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBpdCdzIHVzZWZ1bCB0byBoYXZlIGEgdmVyc2lvbiBvZgorCSAgIm9iamR1bXAiIHRoYXQgc3VwcG9ydHMgRUZJIGFwcGxpY2F0aW9ucyBhcyB3ZWxsLiAgVGhpcworCSAgYWxsb3dzIGluc3BlY3QgYW5kIGRpc2Fzc2VtYmxlIEVGSSBiaW5hcmllcy4KKworIFRvIGRldmVsb3AgSUEtNjQgRUZJIGFwcGxpY2F0aW9ucywgdGhlIGZvbGxvd2luZyB0b29scyBhcmUgbmVlZGVkOgorCisJLSBBIHZlcnNpb24gb2YgZ2NjIG5ld2VyIHRoYW4gSnVseSAzMHRoIDE5OTkgKG9sZGVyIHZlcnNpb25zCisJICBoYWQgcHJvYmxlbXMgd2l0aCBnZW5lcmF0aW5nIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUpLgorCSAgQXMgb2YgZ251LWVmaS0zLjBiLCBnY2MtMy4xIGlzIGtub3duIHRvIHdvcmsgd2VsbC4KKworCS0gQSB2ZXJzaW9uIG9mICJvYmpjb3B5IiB0aGF0IHN1cHBvcnRzIEVGSSBhcHBsaWNhdGlvbnMuICBUbworCSAgY2hlY2sgaWYgeW91ciB2ZXJzaW9uIGluY2x1ZGVzIEVGSSBzdXBwb3J0LCBpc3N1ZSB0aGUKKwkgIGNvbW1hbmQ6CisKKwkJb2JqY29weSAtLWhlbHAKKworCSAgYW5kIHZlcmlmeSB0aGF0IHRoZSBsaW5lICJzdXBwb3J0ZWQgdGFyZ2V0cyIgY29udGFpbnMgdGhlCisJICBzdHJpbmcgImVmaS1hcHAtaWE2NCIuCisKKwktIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGl0J3MgdXNlZnVsIHRvIGhhdmUgYSB2ZXJzaW9uIG9mCisJICAib2JqZHVtcCIgdGhhdCBzdXBwb3J0cyBFRkkgYXBwbGljYXRpb25zIGFzIHdlbGwuICBUaGlzCisJICBhbGxvd3MgaW5zcGVjdCBhbmQgZGlzYXNzZW1ibGUgRUZJIGJpbmFyaWVzLgorCisKKyoqIERpcmVjdG9yeSBTdHJ1Y3R1cmUKKworVGhpcyBFRkkgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgY29udGFpbnMgdGhlIGZvbGxvd2luZworc3ViZGlyZWN0b3JpZXM6CisKKyBpbmM6ICAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIEVGSS1yZWxhdGVkIGluY2x1ZGUgZmlsZXMuICBUaGUKKwlmaWxlcyBhcmUgdGFrZW4gZnJvbSBJbnRlbCdzIEVGSSBzb3VyY2UgZGlzdHJpYnV0aW9uLCBleGNlcHQKKwl0aGF0IHZhcmlvdXMgZml4ZXMgd2VyZSBhcHBsaWVkIHRvIG1ha2UgaXQgY29tcGlsZSB3aXRoIHRoZQorCUdOVSB0b29sY2hhaW4uCisKKyBsaWI6ICAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIGZvciBJbnRlbCdzIEVGSSBsaWJyYXJ5LgorCUFnYWluLCB0aGUgZmlsZXMgYXJlIHRha2VuIGZyb20gSW50ZWwncyBFRkkgc291cmNlCisJZGlzdHJpYnV0aW9uLCB3aXRoIGNoYW5nZXMgdG8gbWFrZSB0aGVtIGNvbXBpbGUgd2l0aCB0aGUgR05VCisJdG9vbGNoYWluLgorCisgZ251ZWZpOiBUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgZ2x1ZSBuZWNlc3NhcnkgdG8gY29udmVydCBFTEY2NAorCWJpbmFyaWVzIHRvIEVGSSBiaW5hcmllcy4gIFZhcmlvdXMgcnVudGltZSBjb2RlIGJpdHMsIHN1Y2ggYXMKKwlhIHNlbGYtcmVsb2NhdG9yIGFyZSBpbmNsdWRlZCBhcyB3ZWxsLiAgVGhpcyBjb2RlIGhhcyBiZWVuCisJY29udHJpYnV0ZWQgYnkgdGhlIEhld2xldHQtUGFja2FyZCBDb21wYW55IGFuZCBpcyBkaXN0cmlidXRlZAorCXVuZGVyIHRoZSBHTlUgR1BMLgorCisgYXBwczoJVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYSBmZXcgc2ltcGxlIEVGSSB0ZXN0IGFwcHMuCisKKyoqIFNldHVwCisKK0l0IGlzIG5lY2Vzc2FyeSB0byBlZGl0IHRoZSBNYWtlZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcworUkVBRE1FIGZpbGUgYmVmb3JlIEVGSSBhcHBsaWNhdGlvbnMgY2FuIGJlIGJ1aWx0LiAgU3BlY2lmaWNhbGx5LCB5b3UKK3Nob3VsZCB2ZXJpZnkgdGhhdCBtYWNyb3MgQ0MsIEFTLCBMRCwgQVIsIFJBTkxJQiwgYW5kIE9CSkNPUFkgcG9pbnQgdG8KK3RoZSBhcHByb3ByaWF0ZSBjb21waWxlciwgYXNzZW1ibGVyLCBsaW5rZXIsIGFyLCBhbmQgcmFubGliIGJpbmFyaWVzLAorcmVzcGVjdGl2ZWx5LgorCitJZiB5b3UncmUgd29ya2luZyBpbiBhIGNyb3NzLWRldmVsb3BtZW50IGVudmlyb25tZW50LCBiZSBzdXJlIHRvIHNldAorbWFjcm8gQVJDSCB0byB0aGUgZGVzaXJlZCB0YXJnZXQgYXJjaGl0ZWN0dXJlICgiaWEzMiIgZm9yIHg4NiwgIng4Nl82NCIgZm9yCit4ODZfNjQgYW5kICJpYTY0IiBmb3IgSUEtNjQpLiAgRm9yIGNvbnZlbmllbmNlLCB0aGlzIGNhbiBhbHNvIGJlIGRvbmUgZnJvbQordGhlIG1ha2UgY29tbWFuZCBsaW5lIChlLmcuLCAibWFrZSBBUkNIPWlhNjQiKS4KKworCisqKiBCdWlsZGluZworCitUbyBidWlsZCB0aGUgc2FtcGxlIEVGSSBhcHBsaWNhdGlvbnMgcHJvdmlkZWQgaW4gc3ViZGlyZWN0b3J5ICJhcHBzIiwKK3NpbXBseSBpbnZva2UgIm1ha2UiIGluIHRoZSB0b3BsZXZlbCBkaXJlY3RvcnkgKHRoZSBkaXJlY3RvcnkKK2NvbnRhaW5pbmcgdGhpcyBSRUFETUUgZmlsZSkuICBUaGlzIHNob3VsZCBidWlsZCBsaWIvbGliZWZpLmEgYW5kCitnbnVlZmkvbGliZ251ZWZpLmEgZmlyc3QgYW5kIHRoZW4gYWxsIHRoZSBFRkkgYXBwbGljYXRpb25zIHN1Y2ggYXMgYQorYXBwcy90Ni5lZmkuCisKKworKiogUnVubmluZworCitKdXN0IGNvcHkgdGhlIEVGSSBhcHBsaWNhdGlvbiAoZS5nLiwgYXBwcy90Ni5lZmkpIHRvIHRoZSBFRkkKK2ZpbGVzeXN0ZW0sIGJvb3QgRUZJLCBhbmQgdGhlbiBzZWxlY3QgIkludm9rZSBFRkkgYXBwbGljYXRpb24iIHRvIHJ1bgordGhlIGFwcGxpY2F0aW9uIHlvdSB3YW50IHRvIHRlc3QuICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGludm9rZSB0aGUKK0ludGVsLXByb3ZpZGVkICJuc2hlbGwiIGFwcGxpY2F0aW9uIGFuZCB0aGVuIGludm9rZSB5b3VyIHRlc3QgYmluYXJ5Cit2aWEgdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgdGhhdCAibnNoZWxsIiBwcm92aWRlcy4KKworCisqKiBXcml0aW5nIFlvdXIgT3duIEVGSSBBcHBsaWNhdGlvbgorCitTdXBwb3NlIHlvdSBoYXZlIHlvdXIgb3duIEVGSSBhcHBsaWNhdGlvbiBpbiBhIGZpbGUgY2FsbGVkCisiYXBwcy9teWVmaWFwcC5jIi4gIFRvIGdldCB0aGlzIGFwcGxpY2F0aW9uIGJ1aWx0IGJ5IHRoZSBHTlUgRUZJIGJ1aWxkCitlbnZpcm9ubWVudCwgc2ltcGx5IGFkZCAibXllZmlhcHAuZWZpIiB0byBtYWNybyBUQVJHRVRTIGluCithcHBzL01ha2VmaWxlLiAgT25jZSB0aGlzIGlzIGRvbmUsIGludm9rZSAibWFrZSIgaW4gdGhlIHRvcCBsZXZlbAorZGlyZWN0b3J5LiAgVGhpcyBzaG91bGQgcmVzdWx0IGluIEVGSSBhcHBsaWNhdGlvbiBhcHBzL215ZWZpYXBwLmVmaSwKK3JlYWR5IGZvciBleGVjdXRpb24uCisKK1RoZSBHTlUgRUZJIGJ1aWxkIGVudmlyb25tZW50IGFsbG93cyB0byB3cml0ZSBFRkkgYXBwbGljYXRpb25zIGFzCitkZXNjcmliZWQgaW4gSW50ZWwncyBFRkkgZG9jdW1lbnRhdGlvbiwgZXhjZXB0IGZvciB0d28gZGlmZmVyZW5jZXM6CisKKyAtIFRoZSBFRkkgYXBwbGljYXRpb24ncyBlbnRyeSBwb2ludCBpcyBhbHdheXMgY2FsbGVkICJlZmlfbWFpbiIuICBUaGUKKyAgIGRlY2xhcmF0aW9uIG9mIHRoaXMgcm91dGluZSBpczoKKworICAgIEVGSV9TVEFUVVMgZWZpX21haW4gKEVGSV9IQU5ETEUgaW1hZ2UsIEVGSV9TWVNURU1fVEFCTEUgKnN5c3RhYik7CisKKyAtIFVOSUNPREUgc3RyaW5nIGxpdGVyYWxzIG11c3QgYmUgd3JpdHRlbiBhcyBXMlUoTCJTYW1wbGUgU3RyaW5nIikKKyAgIGluc3RlYWQgb2YganVzdCBMIlNhbXBsZSBTdHJpbmciLiAgVGhlIFcyVSgpIG1hY3JvIGlzIGRlZmluZWQgaW4KKyAgIDxlZmlsaWIuaD4uICBUaGlzIGhlYWRlciBmaWxlIGFsc28gZGVjbGFyZXMgdGhlIGZ1bmN0aW9uIFcyVUNweSgpCisgICB3aGljaCBhbGxvd3MgdG8gY29udmVydCBhIHdpZGUgc3RyaW5nIGludG8gYSBVTklDT0RFIHN0cmluZyBhbmQKKyAgIHN0b3JlIHRoZSByZXN1bHQgaW4gYSBwcm9ncmFtbWVyLXN1cHBsaWVkIGJ1ZmZlci4KKworIC0gQ2FsbHMgdG8gRUZJIHNlcnZpY2VzIHNob3VsZCBiZSBtYWRlIHZpYSB1ZWZpX2NhbGxfd3JhcHBlcigpLiBUaGlzCisgICBlbnN1cmVzIGFwcHJvcHJpYXRlIHBhcmFtZXRlciBwYXNzaW5nIGZvciB0aGUgYXJjaGl0ZWN0dXJlLgorCisKKyogUGFydCAyOiBJbm5lciBXb3JraW5ncworCitXQVJOSU5HOiBUaGlzIHBhcnQgY29udGFpbnMgYWxsIHRoZSBnb3J5IGRldGFpbCBvZiBob3cgdGhlIEdOVSBFRkkKK3Rvb2xjaGFpbiB3b3Jrcy4gIE5vcm1hbCB1c2VycyBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzdWNoCitkZXRhaWxzLiAgUmVhZGluZyB0aGlzIHBhcnQgaW5jdXJzIGEgZGVmaW5pdGUgcmlzayBvZiBpbmR1Y2luZyBzZXZlcmUKK2hlYWRhY2hlcyBvciBvdGhlciBtYWxhZGllcy4KKworVGhlIGJhc2ljIGlkZWEgYmVoaW5kIHRoZSBHTlUgRUZJIGJ1aWxkIGVudmlyb25tZW50IGlzIHRvIHVzZSB0aGUgR05VCit0b29sY2hhaW4gdG8gYnVpbGQgYSBub3JtYWwgRUxGIGJpbmFyeSB0aGF0LCBhdCB0aGUgZW5kLCBpcyBjb252ZXJ0ZWQKK3RvIGFuIEVGSSBiaW5hcnkuICBFRkkgYmluYXJpZXMgYXJlIHJlYWxseSBqdXN0IFBFMzIrIGJpbmFyaWVzLiAgUEUKK3N0YW5kcyBmb3IgIlBvcnRhYmxlIEV4ZWN1dGFibGUiIGFuZCBpcyB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0CitNaWNyb3NvZnQgaXMgdXNpbmcgb24gaXRzIFdpbmRvd3MgcGxhdGZvcm1zLiAgUEUgaXMgYmFzaWNhbGx5IHRoZSBDT0ZGCitvYmplY3QgZmlsZSBmb3JtYXQgd2l0aCBhbiBNUy1ET1MyLjAgY29tcGF0aWJsZSBoZWFkZXIgc2xhcHBlZCBvbiBpbgorZnJvbnQgb2YgaXQuICBUaGUgIjMyIiBpbiBQRTMyKyBzdGFuZHMgZm9yIDMyIGJpdHMsIG1lYW5pbmcgdGhhdCBQRTMyCitpcyBhIDMyLWJpdCBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUgcGx1cyBpbiAiUEUzMisiIGluZGljYXRlcyB0aGF0Cit0aGlzIGZvcm1hdCBoYXMgYmVlbiBoYWNrZWQgdG8gYWxsb3cgbG9hZGluZyBhIDRHQiBiaW5hcnkgYW55d2hlcmUgaW4KK2EgNjQtYml0IGFkZHJlc3Mgc3BhY2UgKHVubGlrZSBFTEY2NCwgaG93ZXZlciwgdGhpcyBpcyBub3QgYSBmdWxsCis2NC1iaXQgb2JqZWN0IGZpbGUgZm9ybWF0IGJlY2F1c2UgdGhlIGVudGlyZSBiaW5hcnkgY2Fubm90IHNwYW4gbW9yZQordGhhbiA0R0Igb2YgYWRkcmVzcyBzcGFjZSkuICBFRkkgYmluYXJpZXMgYXJlIHBsYWluIFBFMzIrIGJpbmFyaWVzCitleGNlcHQgdGhhdCB0aGUgInN1YnN5c3RlbSBpZCIgZGlmZmVycyBmcm9tIG5vcm1hbCBXaW5kb3dzIGJpbmFyaWVzLgorVGhlcmUgYXJlIHR3byBmbGF2b3JzIG9mIEVGSSBiaW5hcmllczogImFwcGxpY2F0aW9ucyIgYW5kICJkcml2ZXJzIgorYW5kIGVhY2ggaGFzIHRoZXJlIG93biBzdWJzeXN0ZW0gaWQgYW5kIGFyZSBpZGVudGljYWwgb3RoZXJ3aXNlLiAgQXQKK3ByZXNlbnQsIHRoZSBHTlUgRUZJIGJ1aWxkIGVudmlyb25tZW50IHN1cHBvcnRzIHRoZSBidWlsZGluZyBvZiBFRkkKK2FwcGxpY2F0aW9ucyBvbmx5LCB0aG91Z2ggaXQgd291bGQgYmUgdHJpdmlhbCB0byBnZW5lcmF0ZSBkcml2ZXJzLCBhcwordGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgc3Vic3lzdGVtIGlkLiAgRm9yIG1vcmUgZGV0YWlscyBvbiBQRTMyKywKK3NlZSB0aGUgc3BlYyBhdAorCisJaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L3NwZWNzL21zZG5fcGVjb2ZmLmh0bS4KKworSW4gdGhlb3J5LCBjb252ZXJ0aW5nIGEgc3VpdGFibGUgRUxGNjQgYmluYXJ5IHRvIFBFMzIrIGlzIGVhc3kgYW5kCitjb3VsZCBiZSBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgIm9iamNvcHkiIHV0aWxpdHkgYnkgc3BlY2lmeWluZyBvcHRpb24KKy0tdGFyZ2V0PWVmaS1hcHAtaWEzMiAoeDg2KSBvciAtLXRhcmdldD1lZmktYXBwLWlhNjQgKElBLTY0KS4gIEJ1dAorbGlmZSBuZXZlciBpcyB0aGF0IGVhc3ksIHNvIGhlcmUgc29tZSBjb21wbGljYXRpbmcgZmFjdG9yczoKKworICgxKSBDT0ZGIHNlY3Rpb25zIGFyZSB2ZXJ5IGRpZmZlcmVudCBmcm9tIEVMRiBzZWN0aW9ucy4KKworCUVMRiBiaW5hcmllcyBkaXN0aW5ndWlzaCBiZXR3ZWVuIHByb2dyYW0gaGVhZGVycyBhbmQgc2VjdGlvbnMuCisJVGhlIHByb2dyYW0gaGVhZGVycyBkZXNjcmliZSB0aGUgbWVtb3J5IHNlZ21lbnRzIHRoYXQgbmVlZCB0bworCWJlIGxvYWRlZC9pbml0aWFsaXplZCwgd2hlcmVhcyB0aGUgc2VjdGlvbnMgZGVzY3JpYmUgd2hhdAorCWNvbnN0aXR1dGVzIHRob3NlIHNlZ21lbnRzLiAgSW4gQ09GRiAoYW5kIHRoZXJlZm9yZSBQRTMyKykgbm8KKwlzdWNoIGRpc3RpbmN0aW9uIGlzIG1hZGUuICBUaHVzLCBDT0ZGIHNlY3Rpb25zIG5lZWQgdG8gYmUgcGFnZQorCWFsaWduZWQgYW5kIGhhdmUgYSBzaXplIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgcGFnZSBzaXplCisJKDRLQiBmb3IgRUZJKSwgd2hlcmVhcyBFTEYgYWxsb3dzIHNlY3Rpb25zIGF0IGFyYml0cmFyeQorCWFkZHJlc3NlcyBhbmQgd2l0aCBhcmJpdHJhcnkgc2l6ZXMuCisKKyAoMikgRUZJIGJpbmFyaWVzIHNob3VsZCBiZSByZWxvY2F0YWJsZS4KKworCVNpbmNlIEVGSSBiaW5hcmllcyBhcmUgZXhlY3V0ZWQgaW4gcGh5c2ljYWwgbW9kZSwgRUZJIGNhbm5vdAorCWd1YXJhbnRlZSB0aGF0IGEgZ2l2ZW4gYmluYXJ5IGNhbiBiZSBsb2FkZWQgYXQgaXRzIHByZWZlcnJlZAorCWFkZHJlc3MuICBFRkkgZG9lcyBfdHJ5XyB0byBsb2FkIGEgYmluYXJ5IGF0IGl0J3MgcHJlZmVycmVkCisJYWRkcmVzcywgYnV0IGlmIGl0IGNhbid0IGRvIHNvLCBpdCB3aWxsIGxvYWQgaXQgYXQgYW5vdGhlcgorCWFkZHJlc3MgYW5kIHRoZW4gcmVsb2NhdGUgdGhlIGJpbmFyeSB1c2luZyB0aGUgY29udGVudHMgb2YgdGhlCisJLnJlbG9jIHNlY3Rpb24uCisKKyAoMykgT24gSUEtNjQsIHRoZSBFRkkgZW50cnkgcG9pbnQgbmVlZHMgdG8gcG9pbnQgdG8gYSBmdW5jdGlvbgorICAgICBkZXNjcmlwdG9yLCBub3QgdG8gdGhlIGNvZGUgYWRkcmVzcyBvZiB0aGUgZW50cnkgcG9pbnQuCisKKyAoNCkgVGhlIEVGSSBzcGVjaWZpY2F0aW9uIGFzc3VtZXMgdGhhdCB3aWRlIGNoYXJhY3RlcnMgdXNlIFVOSUNPREUKKyAgICAgZW5jb2RpbmcuCisKKwlBTlNJIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgc2l6ZSBvciBlbmNvZGluZyB0aGF0IGEgd2lkZQorCWNoYXJhY3RlciB1c2VzLiAgVGhlc2UgY2hvaWNlcyBhcmUgImltcGxlbWVudGF0aW9uIGRlZmluZWQiLgorCU9uIG1vc3QgVU5JWCBzeXN0ZW1zLCB0aGUgR05VIHRvb2xjaGFpbiB1c2VzIGEgd2NoYXJfdCB0aGF0IGlzCisJNCBieXRlcyBpbiBzaXplLiAgVGhlIGVuY29kaW5nIHVzZWQgZm9yIHN1Y2ggY2hhcmFjdGVycyBpcworCShtb3N0bHkpIFVDUzQuCisKK0luIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMsIHdlIGFkZHJlc3MgaG93IHRoZSBHTlUgRUZJIGJ1aWxkCitlbnZpcm9ubWVudCBhZGRyZXNzZXMgZWFjaCBvZiB0aGVzZSBpc3N1ZXMuCisKKworKiogKDEpIEFjY29tbW9kYXRpbmcgQ09GRiBTZWN0aW9ucworCitJbiBvcmRlciB0byBzYXRpc2Z5IHRoZSBDT0ZGIGNvbnN0cmFpbnQgb2YgcGFnZS1zaXplZCBhbmQgcGFnZS1hbGlnbmVkCitzZWN0aW9ucywgdGhlIEdOVSBFRkkgYnVpbGQgZW52aXJvbm1lbnQgdXNlcyB0aGUgc3BlY2lhbCBsaW5rZXIgc2NyaXB0CitpbiBnbnVlZmkvZWxmXyQoQVJDSClfZWZpLmxkcyB3aGVyZSAkKEFSQ0gpIGlzIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCisoImlhMzIiIGZvciB4ODYsICJ4ODZfNjQiIGZvciB4ODZfNjQgYW5kICJpYTY0IiBmb3IgSUEtNjQpLgorVGhpcyBzY3JpcHQgaXMgc2V0IHVwIHRvIGNyZWF0ZSBvbmx5IGVpZ2h0IENPRkYgc2VjdGlvbiwgZWFjaCBwYWdlIGFsaWduZWQKK2FuZCBwYWdlIHNpemVkLlRoZXNlIGVpZ2h0IHNlY3Rpb25zIGFyZSB1c2VkIHRvIGdyb3VwIHRvZ2V0aGVyIHRoZSBtdWNoCitncmVhdGVyIG51bWJlciBvZiBzZWN0aW9ucyB0aGF0IGFyZSB0eXBpY2FsbHkgcHJlc2VudCBpbiBFTEYgb2JqZWN0IGZpbGVzLgorU3BlY2lmaWNhbGx5OgorCisgLmhhc2gKKwlDb2xsZWN0cyB0aGUgRUxGIC5oYXNoIGluZm8gKHRoaXMgc2VjdGlvbiBfbXVzdF8gYmUgdGhlIGZpcnN0CisJc2VjdGlvbiBpbiBvcmRlciB0byBidWlsZCBhIHNoYXJlZCBvYmplY3QgZmlsZTsgdGhlIHNlY3Rpb24gaXMKKwlub3QgYWN0dWFsbHkgbG9hZGVkIG9yIHVzZWQgYXQgcnVudGltZSkuCisKKyAudGV4dAorCUNvbGxlY3RzIGFsbCBzZWN0aW9ucyBjb250YWluaW5nIGV4ZWN1dGFibGUgY29kZS4KKworIC5kYXRhCisJQ29sbGVjdHMgcmVhZC1vbmx5IGFuZCByZWFkLXdyaXRlIGRhdGEsIGxpdGVyYWwgc3RyaW5nIGRhdGEsCisJZ2xvYmFsIG9mZnNldCB0YWJsZXMsIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgc2VnbWVudCAoYnNzKSBhbmQKKwl2YXJpb3VzIG90aGVyIHNlY3Rpb25zIGNvbnRhaW5pbmcgZGF0YS4KKworCVRoZSByZWFzb24gcmVhZC1vbmx5IGRhdGEgaXMgcGxhY2VkIGhlcmUgaW5zdGVhZCBvZiB0aGUgaW4KKwkudGV4dCBpcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGRpc2Fzc2VtYmxlIHRoZSAudGV4dCBzZWN0aW9uCisJd2l0aG91dCBnZXR0aW5nIGdhcmJhZ2UgZHVlIHRvIHJlYWQtb25seSBkYXRhLiAgQmVzaWRlcywgc2luY2UKKwlFRkkgYmluYXJpZXMgZXhlY3V0ZSBpbiBwaHlzaWNhbCBtb2RlLCBkaWZmZXJlbmNlcyBpbiBwYWdlCisJcHJvdGVjdGlvbiBkbyBub3QgbWF0dGVyLgorCisJVGhlIHJlYXNvbiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIGlzIHBsYWNlZCBpbiB0aGlzIHNlY3Rpb24gaXMKKwl0aGF0IHRoZSBFRkkgbG9hZGVyIGFwcGVhcnMgdG8gYmUgdW5hYmxlIHRvIGhhbmRsZSBzZWN0aW9ucworCXRoYXQgYXJlIGFsbG9jYXRlZCBidXQgbm90IGxvYWRlZCBmcm9tIHRoZSBiaW5hcnkuCisKKyAuZHluYW1pYywgLmR5bnN5bSwgLnJlbGEsIC5yZWwsIC5yZWxvYworCVRoZXNlIHNlY3Rpb25zIGNvbnRhaW5zIHRoZSBkeW5hbWljIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0bworCXNlbGYtcmVsb2NhdGUgdGhlIGJpbmFyeSAoc2VlIGJlbG93KS4KKworQSBjb3VwbGUgb2YgbW9yZSBwb2ludHMgd29ydGggbm90aW5nIGFib3V0IHRoZSBsaW5rZXIgc2NyaXB0OgorCisgbyBPbiBJQS02NCwgdGhlIGdsb2JhbCBwb2ludGVyIHN5bWJvbCAoX19ncCkgbmVlZHMgdG8gYmUgcGxhY2VkIHN1Y2gKKyAgIHRoYXQgdGhlIF9lbnRpcmVfIEVGSSBiaW5hcnkgY2FuIGJlIGFkZHJlc3NlZCB1c2luZyB0aGUgc2lnbmVkCisgICAyMi1iaXQgb2Zmc2V0IHRoYXQgdGhlICJhZGRsIiBpbnN0cnVjdGlvbiBhZmZvcmRzLiAgU3BlY2lmaWNhbGx5LAorICAgdGhpcyBtZWFucyB0aGF0IF9fZ3Agc2hvdWxkIGJlIHBsYWNlZCBhdCBJbWFnZUJhc2UgKyAweDIwMDAwMC4KKyAgIFN0cmljdGx5IHNwZWFraW5nLCBvbmx5IGEgY291cGxlIG9mIHN5bWJvbHMgbmVlZCB0byBiZSBhZGRyZXNzYWJsZQorICAgaW4gdGhpcyBmYXNoaW9uLCBzbyB3aXRoIHNvbWUgY2FyZSBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYnVpbGQKKyAgIGJpbmFyaWVzIG11Y2ggbGFyZ2VyIHRoYW4gNE1CLiAgVG8gZ2V0IGEgbGlzdCBvZiBzeW1ib2xzIHRoYXQgbmVlZAorICAgdG8gYmUgYWRkcmVzc2FibGUgaW4gdGhpcyBmYXNoaW9uLCBncmVwIHRoZSBhc3NlbWJseSBmaWxlcyBpbgorICAgZGlyZWN0b3J5IGdudWVmaSBmb3IgdGhlIHN0cmluZyAiQGdwcmVsIi4KKworIG8gVGhlIGxpbmsgYWRkcmVzcyAoSW1hZ2VCYXNlKSBvZiB0aGUgYmluYXJ5IGlzIChhcmJpdHJhcmlseSkgc2V0IHRvCisgICB6ZXJvLiAgVGhpcyBjb3VsZCBiZSBzZXQgdG8gc29tZXRoaW5nIGxhcmdlciB0byBpbmNyZWFzZSB0aGUgY2hhbmNlCisgICBvZiBFRkkgYmVpbmcgYWJsZSB0byBsb2FkIHRoZSBiaW5hcnkgd2l0aG91dCByZXF1aXJpbmcgcmVsb2NhdGlvbi4KKyAgIEhvd2V2ZXIsIGEgc3RhcnQgYWRkcmVzcyBvZiAwIG1ha2VzIGRlYnVnZ2luZyBhIHdlZSBiaXQgZWFzaWVyCisgICAoZ3JlYXQgZm9yIHRob3NlIG9mIHVzIHdobyBjYW4gYWRkLCBidXQgbm90IHN1YnRyYWN0Li4uIDstKS4KKworIG8gVGhlIHJlbG9jYXRpb24gcmVsYXRlZCBzZWN0aW9ucyAoLmR5bmFtaWMsIC5yZWwsIC5yZWxhLCAucmVsb2MpCisgICBjYW5ub3QgYmUgcGxhY2VkIGluc2lkZSAuZGF0YSBiZWNhdXNlIHNvbWUgdG9vbHMgaW4gdGhlIEdOVQorICAgdG9vbGNoYWluIHJlbHkgb24gdGhlIGV4aXN0ZW5jZSBvZiB0aGVzZSBzZWN0aW9ucy4KKworIG8gU29tZSBzZWN0aW9ucyBpbiB0aGUgRUxGIGJpbmFyeSBpbnRlbnRpb25hbGx5IGdldCBkcm9wcGVkIHdoZW4KKyAgIGJ1aWxkaW5nIHRoZSBFRkkgYmluYXJ5LiAgUGFydGljdWxhcmx5IG5vdGV3b3J0aHkgYXJlIHRoZSBkeW5hbWljCisgICByZWxvY2F0aW9uIHNlY3Rpb25zIGZvciB0aGUgLnBsYWJlbCBhbmQgLnJlbG9jIHNlY3Rpb25zLiAgSXQgd291bGQKKyAgIGJlIF93cm9uZ18gdG8gaW5jbHVkZSB0aGVzZSBzZWN0aW9ucyBpbiB0aGUgRUZJIGJpbmFyeSBiZWNhdXNlIGl0CisgICB3b3VsZCByZXN1bHQgaW4gLnJlbG9jIGFuZCAucGxhYmVsIGJlaW5nIHJlbG9jYXRlZCB0d2ljZSAob25jZSBieQorICAgdGhlIEVGSSBsb2FkZXIgYW5kIG9uY2UgYnkgdGhlIHNlbGYtcmVsb2NhdG9yOyBzZWUgYmVsb3cgZm9yIGEKKyAgIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXR0ZXIpLiAgU3BlY2lmaWNhbGx5LCBvbmx5IHRoZSBzZWN0aW9ucworICAgbWVudGlvbmVkIHdpdGggdGhlIC1qIG9wdGlvbiBpbiB0aGUgZmluYWwgIm9iamNvcHkiIGNvbW1hbmQgYXJlCisgICByZXRhaW5lZCBpbiB0aGUgRUZJIGJpbmFyeSAoc2VlIGFwcHMvTWFrZWZpbGUpLgorCisKKyoqICgyKSBCdWlsZGluZyBSZWxvY2F0YWJsZSBCaW5hcmllcworCitFTEYgYmluYXJpZXMgYXJlIG5vcm1hbGx5IGxpbmtlZCBmb3IgYSBmaXhlZCBsb2FkIGFkZHJlc3MgYW5kIGFyZSB0aHVzCitub3QgcmVsb2NhdGFibGUuICBUaGUgb25seSBraW5kIG9mIEVMRiBvYmplY3QgdGhhdCBpcyByZWxvY2F0YWJsZSBhcmUKK3NoYXJlZCBvYmplY3RzICgic2hhcmVkIGxpYnJhcmllcyIpLiAgSG93ZXZlciwgZXZlbiB0aG9zZSBvYmplY3RzIGFyZQordXN1YWxseSBub3QgY29tcGxldGVseSBwb3NpdGlvbiBpbmRlcGVuZGVudCBhbmQgdGhlcmVmb3JlIHJlcXVpcmUKK3J1bnRpbWUgcmVsb2NhdGlvbiBieSB0aGUgZHluYW1pYyBsb2FkZXIuICBGb3IgZXhhbXBsZSwgSUEtNjQgYmluYXJpZXMKK25vcm1hbGx5IHJlcXVpcmUgcmVsb2NhdGlvbiBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KKworVGhlIGFwcHJvYWNoIHRvIGJ1aWxkaW5nIHJlbG9jYXRhYmxlIGJpbmFyaWVzIGluIHRoZSBHTlUgRUZJIGJ1aWxkCitlbnZpcm9ubWVudCBpcyB0bzoKKworIChhKSBidWlsZCBhbiBFTEYgc2hhcmVkIG9iamVjdAorCisgKGIpIGxpbmsgaXQgdG9nZXRoZXIgd2l0aCBhIHNlbGYtcmVsb2NhdG9yIHRoYXQgdGFrZXMgY2FyZSBvZgorICAgICBhcHBseWluZyB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyB0aGF0IG1heSBiZSBwcmVzZW50IGluIHRoZQorICAgICBFTEYgc2hhcmVkIG9iamVjdAorCisgKGMpIGNvbnZlcnQgdGhlIHJlc3VsdGluZyBpbWFnZSB0byBhbiBFRkkgYmluYXJ5CisKK1RoZSBzZWxmLXJlbG9jYXRvciBpcyBvZiBjb3Vyc2UgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudC4gIFRoZSB4ODYKK3ZlcnNpb24gY2FuIGJlIGZvdW5kIGluIGdudWVmaS9yZWxvY19pYTMyLmMsIHRoZSB4ODZfNjQgdmVyc2lvbgorY2FuIGJlIGZvdW5kIGluIGdudWVmaS9yZWxvY194ODZfNjQuYyBhbmQgdGhlIElBLTY0IHZlcnNpb24gY2FuIGJlCitmb3VuZCBpbiBnbnVlZmkvcmVsb2NfaWE2NC5TLgorCitUaGUgc2VsZi1yZWxvY2F0b3Igb3BlcmF0ZXMgYXMgZm9sbG93czogdGhlIHN0YXJ0dXAgY29kZSBpbnZva2VzIGl0CityaWdodCBhZnRlciBFRkkgaGFzIGhhbmRlZCBvZmYgY29udHJvbCB0byB0aGUgRUZJIGJpbmFyeSBhdCBzeW1ib2wKKyJfc3RhcnQiLiAgVXBvbiBhY3RpdmF0aW9uLCB0aGUgc2VsZi1yZWxvY2F0b3Igc2VhcmNoZXMgdGhlIC5keW5hbWljCitzZWN0aW9uICh3aG9zZSBzdGFydGluZyBhZGRyZXNzIGlzIGdpdmVuIGJ5IHN5bWJvbCBfRFlOQU1JQykgZm9yIHRoZQorZHluYW1pYyByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCB3aGljaCBjYW4gYmUgZm91bmQgaW4gdGhlIERUX1JFTCwKK0RUX1JFTFNaLCBhbmQgRFRfUkVMRU5UIGVudHJpZXMgb2YgdGhlIGR5bmFtaWMgdGFibGUgKERUX1JFTEEsCitEVF9SRUxBU1osIGFuZCBEVF9SRUxBRU5UIGluIHRoZSBjYXNlIG9mIHJlbGEgcmVsb2NhdGlvbnMsIGFzIGlzIHRoZQorY2FzZSBmb3IgSUEtNjQpLiAgVGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBwb2ludHMgdG8gdGhlIEVMRgorcmVsb2NhdGlvbiB0YWJsZS4gIE9uY2UgdGhpcyB0YWJsZSBpcyBmb3VuZCwgdGhlIHNlbGYtcmVsb2NhdG9yIHdhbGtzCit0aHJvdWdoIGl0LCBhcHBseWluZyBlYWNoIHJlbG9jYXRpb24gb25lIGJ5IG9uZS4gIFNpbmNlIHRoZSBFRkkKK2JpbmFyaWVzIGFyZSBmdWxseSByZXNvbHZlZCBzaGFyZWQgb2JqZWN0cywgb25seSBhIHN1YnNldCBvZiBhbGwKK3Bvc3NpYmxlIHJlbG9jYXRpb25zIG5lZWQgdG8gYmUgc3VwcG9ydGVkLiAgU3BlY2lmaWNhbGx5LCBvbiB4ODYgb25seQordGhlIFJfMzg2X1JFTEFUSVZFIHJlbG9jYXRpb24gaXMgbmVlZGVkLiAgT24gSUEtNjQsIHRoZSByZWxvY2F0aW9ucworUl9JQTY0X0RJUjY0TFNCLCBSX0lBNjRfUkVMNjRMU0IsIGFuZCBSX0lBNjRfRlBUUjY0TFNCIGFyZSBuZWVkZWQuCitOb3RlIHRoYXQgdGhlIFJfSUE2NF9GUFRSNjRMU0IgcmVsb2NhdGlvbiByZXF1aXJlcyBhY2Nlc3MgdG8gdGhlCitkeW5hbWljIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgd2h5IHRoZSAuZHluc3ltIHNlY3Rpb24gaXMgaW5jbHVkZWQgaW4KK3RoZSBFRkkgYmluYXJ5LiAgQW5vdGhlciBjb21wbGljYXRpb24gaXMgdGhhdCB0aGlzIHJlbG9jYXRpb24gcmVxdWlyZXMKK21lbW9yeSB0byBob2xkIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9ycyAoYWthICJwcm9jZWR1cmUgbGFiZWxzIiBvcgorInBsYWJlbHMiKS4gIEVhY2ggZnVuY3Rpb24gZGVzY3JpcHRvciB1c2VzIDE2IGJ5dGVzIG9mIG1lbW9yeS4gIFRoZQorSUEtNjQgc2VsZi1yZWxvY2F0b3IgY3VycmVudGx5IHJlc2VydmVzIGEgc3RhdGljIG1lbW9yeSBhcmVhIHRoYXQgY2FuCitob2xkIDEwMCBvZiB0aGVzZSBkZXNjcmlwdG9ycy4gIElmIHRoZSBzZWxmLXJlbG9jYXRvciBydW5zIG91dCBvZgorc3BhY2UsIGl0IGNhdXNlcyB0aGUgRUZJIGJpbmFyeSB0byBmYWlsIHdpdGggZXJyb3IgY29kZSA1CisoRUZJX0JVRkZFUl9UT09fU01BTEwpLiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBtYW5pZmVzdCBjb25zdGFudAorTUFYX0ZVTkNUSU9OX0RFU0NSSVBUT1JTIGluIGdudWVmaS9yZWxvY19pYTY0LlMgc2hvdWxkIGJlIGluY3JlYXNlZAorYW5kIHRoZSBhcHBsaWNhdGlvbiByZWNvbXBpbGVkLiAgQW4gZWFzeSB3YXkgdG8gY291bnQgdGhlIG51bWJlciBvZgorZnVuY3Rpb24gZGVzY3JpcHRvcnMgcmVxdWlyZWQgYnkgYW4gRUZJIGFwcGxpY2F0aW9uIGlzIHRvIHJ1biB0aGUKK2NvbW1hbmQ6CisKKyAgb2JqZHVtcCAtLWR5bmFtaWMtcmVsb2MgZXhhbXBsZS5zbyB8IGZncmVwIEZQVFI2NCB8IHdjIC1sCisKK2Fzc3VtaW5nICJleGFtcGxlIiBpcyB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBFRkkgYXBwbGljYXRpb24uCisKKworKiogKDMpIENyZWF0aW5nIHRoZSBGdW5jdGlvbiBEZXNjcmlwdG9yIGZvciB0aGUgSUEtNjQgRUZJIEJpbmFyaWVzCisKK0FzIG1lbnRpb25lZCBhYm92ZSwgdGhlIElBLTY0IFBFMzIrIGZvcm1hdCBhc3N1bWVzIHRoYXQgdGhlIGVudHJ5Citwb2ludCBvZiB0aGUgYmluYXJ5IGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gIEEgZnVuY3Rpb24gZGVzY3JpcHRvcnMKK2NvbnNpc3RzIG9mIHR3byBkb3VibGUgd29yZHM6IHRoZSBmaXJzdCBvbmUgaXMgdGhlIGNvZGUgZW50cnkgcG9pbnQKK2FuZCB0aGUgc2Vjb25kIGlzIHRoZSBnbG9iYWwgcG9pbnRlciB0aGF0IHNob3VsZCBiZSBsb2FkZWQgYmVmb3JlCitjYWxsaW5nIHRoZSBlbnRyeSBwb2ludC4gIFNpbmNlIHRoZSBFTEYgdG9vbGNoYWluIGRvZXNuJ3Qga25vdyBob3cgdG8KK2dlbmVyYXRlIGEgZnVuY3Rpb24gZGVzY3JpcHRvciBmb3IgdGhlIGVudHJ5IHBvaW50LCB0aGUgc3RhcnR1cCBjb2RlCitpbiBnbnVlZmkvY3J0MC1lZmktaWE2NC5TIGNyYWZ0cyBvbmUgbWFudWFsbHkgYnkgd2l0aCB0aGUgY29kZToKKworCSAgICAgICAgLnNlY3Rpb24gLnBsYWJlbCwgImEiCisJX3N0YXJ0X3BsYWJlbDoKKwkgICAgICAgIGRhdGE4ICAgX3N0YXJ0CisJICAgICAgICBkYXRhOCAgIF9fZ3AKKwordGhpcyBwbGFjZXMgdGhlIHByb2NlZHVyZSBsYWJlbCBmb3IgZW50cnkgcG9pbnQgX3N0YXJ0IGluIGEgc2VjdGlvbgorY2FsbGVkICIucGxhYmVsIi4gIE5vdywgdGhlIG9ubHkgcHJvYmxlbSBpcyB0aGF0IF9zdGFydCBhbmQgX19ncCBuZWVkCit0byBiZSByZWxvY2F0ZWQgX2JlZm9yZV8gRUZJIGhhbmRzIGNvbnRyb2wgb3ZlciB0byB0aGUgRUZJIGJpbmFyeS4KK0ZvcnR1bmF0ZWx5LCBQRTMyKyBkZWZpbmVzIGEgc2VjdGlvbiBjYWxsZWQgIi5yZWxvYyIgdGhhdCBjYW4gYWNoaWV2ZQordGhpcy4gIFRodXMsIGluIGFkZGl0aW9uIHRvIG1hbnVhbGx5IGNyYWZ0aW5nIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yLAordGhlIHN0YXJ0dXAgY29kZSBhbHNvIGNyYWZ0cyBhICIucmVsb2MiIHNlY3Rpb24gdGhhdCBoYXMgd2lsbCBjYXVzZQordGhlIEVGSSBsb2FkZXIgdG8gcmVsb2NhdGUgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IgYmVmb3JlIGhhbmRpbmcgb3ZlcgorY29udHJvbCB0byB0aGUgRUZJIGJpbmFyeSAoYWdhaW4sIHNlZSB0aGUgUEVDT0ZGIHNwZWMgbWVudGlvbmVkIGFib3ZlCitmb3IgZGV0YWlscykuCisKK0EgZmluYWwgcXVlc3Rpb24gbWF5IGJlIHdoeSAucGxhYmVsIGFuZCAucmVsb2MgbmVlZCB0byBnbyBpbiB0aGVpciBvd24KK0NPRkYgc2VjdGlvbnMuICBUaGUgYW5zd2VyIGlzIHNpbXBseTogd2UgbmVlZCB0byBiZSBhYmxlIHRvIGRpc2NhcmQKK3RoZSByZWxvY2F0aW9uIGVudHJpZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciB0aGVzZSBzZWN0aW9ucy4gIEJ5CitwbGFjaW5nIHRoZW0gaW4gdGhlc2Ugc2VjdGlvbnMsIHRoZSByZWxvY2F0aW9ucyBlbmQgdXAgaW4gc2VjdGlvbnMKKyIucmVsYS5wbGFiZWwiIGFuZCAiLnJlbGEucmVsb2MiIHdoaWNoIG1ha2VzIGl0IGVhc3kgdG8gZmlsdGVyIHRoZW0KK291dCBpbiB0aGUgZmlsdGVyIHNjcmlwdC4gIEFsc28sIHRoZSAiLnJlbG9jIiBzZWN0aW9uIG5lZWRzIHRvIGJlIGluCitpdHMgb3duIHNlY3Rpb24gc28gdGhhdCB0aGUgb2JqY29weSBwcm9ncmFtIGNhbiByZWNvZ25pemUgaXQgYW5kIGNhbgorY3JlYXRlIHRoZSBjb3JyZWN0IGRpcmVjdG9yeSBlbnRyaWVzIGluIHRoZSBQRTMyKyBiaW5hcnkuCisKKworKiogKDQpIENvbnZlbmllbnQgYW5kIFBvcnRhYmxlIEdlbmVyYXRpb24gb2YgVU5JQ09ERSBTdHJpbmcgTGl0ZXJhbHMKKworQXMgb2YgZ251LWVmaS0zLjAsIHdlIG1ha2UgdXNlIChhbmQgc29tZXdoYXQgYWJ1c2UpIHRoZSBnY2Mgb3B0aW9uCit0aGF0IGZvcmNlcyB3aWRlIGNoYXJhY3RlcnMgKFdDSEFSX1QpIHRvIHVzZSBzaG9ydCBpbnRlZ2VycyAoMiBieXRlcykgCitpbnN0ZWFkIG9mIGludGVnZXJzICg0IGJ5dGVzKS4gVGhpcyB3YXkgd2UgbWF0Y2ggdGhlIFVuaWNvZGUgY2hhcmFjdGVyCitzaXplLiBCeSBhYnVzZSwgd2UgbWVhbiB0aGF0IHdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0aGUgcmVndWxhciBBU0NJSQorY2hhcmFjdGVycyBhcmUgZW5jb2RlZCB0aGUgc2FtZSB3YXkgYmV0d2VlbiAoc2hvcnQpIHdpZGUgY2hhcmFjdGVycyAKK2FuZCBVbmljb2RlIGFuZCBiYXNpY2FsbHkgb25seSB1c2UgdGhlIGZpcnN0IGJ5dGUuIFRoaXMgYWxsb3dzIHVzCit0byBqdXN0IHVzZSB0aGVtIGludGVyY2hhbmdlYWJseS4KKworVGhlIGdjYyBvcHRpb24gdG8gZm9yY2Ugc2hvcnQgd2lkZSBjaGFyYWN0ZXJzIGlzIDogLWZzaG9ydC13Y2hhcgorCisJCQkqICogKiBUaGUgRW5kICogKiAqCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvQWxsb2NQYWdlcy5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL0FsbG9jUGFnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTUwOTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL0FsbG9jUGFnZXMuYwpAQCAtMCwwICsxLDIwNCBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEplcnJ5IEhvZW1hbm4gPGplcnJ5LmhvZW1hbm5AaHAuY29tPgorICoKKyAqCisgKiBBcHBsaWNhdGlvbiB0byBhbGxvY2F0ZSBtZW1vcnkgYXQgRUZJLiAgU3ludGF4IG9mIGNvbW1hbmQKKyAqIG1pbWljcyB0aGUgRUZJIEJvb3QgU2VydmljZSAiQWxsb2NhdGVQYWdlcy4iCisgKgorICogU2VlIFVFRkkgc3BlYyAyLjMsIFNlY3Rpb24gNi4yLgorICoKKyAqCisKKworCisKK0ZTMTpcPiBtZW1tYXAKK1R5cGUgICAgICBTdGFydCAgICAgICAgICAgIEVuZCAgICAgICAgICAgICAgI3BhZ2VzICAgICAgICAgICAgIEF0dHJpYnV0ZXMKK0JTX0NvZGUgICAwMDAwMDAwMDAwMDAwMDAwLTAwMDAwMDAwMDAwMDBGRkYgMDAwMDAwMDAwMDAwMDAwMSAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDAwMDAwMTAwMC0wMDAwMDAwMDAwMDhERkZGIDAwMDAwMDAwMDAwMDAwOEQgMDAwMDAwMDAwMDAwMDAwRgorUmVzZXJ2ZWQgIDAwMDAwMDAwMDAwOEUwMDAtMDAwMDAwMDAwMDA4RkZGRiAwMDAwMDAwMDAwMDAwMDAyIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDAwMDkwMDAwLTAwMDAwMDAwMDAwOUZGRkYgMDAwMDAwMDAwMDAwMDAxMCAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDAwMDEwMDAwMC0wMDAwMDAwMDBGRkZGRkZGIDAwMDAwMDAwMDAwMEZGMDAgMDAwMDAwMDAwMDAwMDAwRgorQlNfQ29kZSAgIDAwMDAwMDAwMTAwMDAwMDAtMDAwMDAwMDAxMDA2MUZGRiAwMDAwMDAwMDAwMDAwMDYyIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDEwMDYyMDAwLTAwMDAwMDAwNUNERkZGRkYgMDAwMDAwMDAwMDA0Q0Q5RSAwMDAwMDAwMDAwMDAwMDBGCitBQ1BJX05WUyAgMDAwMDAwMDA1Q0UwMDAwMC0wMDAwMDAwMDVEREZGRkZGIDAwMDAwMDAwMDAwMDEwMDAgMDAwMDAwMDAwMDAwMDAwRgorQlNfRGF0YSAgIDAwMDAwMDAwNURFMDAwMDAtMDAwMDAwMDA1REZGRkZGRiAwMDAwMDAwMDAwMDAwMjAwIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDVFMDAwMDAwLTAwMDAwMDAwNUVGMUNGRkYgMDAwMDAwMDAwMDAwMEYxRCAwMDAwMDAwMDAwMDAwMDBGCitCU19EYXRhICAgMDAwMDAwMDA1RUYxRDAwMC0wMDAwMDAwMDcwOUZCRkZGIDAwMDAwMDAwMDAwMTFBREYgMDAwMDAwMDAwMDAwMDAwRgorQXZhaWxhYmxlIDAwMDAwMDAwNzA5RkMwMDAtMDAwMDAwMDA3MTBFM0ZGRiAwMDAwMDAwMDAwMDAwNkU4IDAwMDAwMDAwMDAwMDAwMEYKK0xvYWRlckNvZGUgMDAwMDAwMDA3MTBFNDAwMC0wMDAwMDAwMDcxMUZFRkZGIDAwMDAwMDAwMDAwMDAxMUIgMDAwMDAwMDAwMDAwMDAwRgorQXZhaWxhYmxlIDAwMDAwMDAwNzExRkYwMDAtMDAwMDAwMDA3MTkwMUZGRiAwMDAwMDAwMDAwMDAwNzAzIDAwMDAwMDAwMDAwMDAwMEYKK0JTX0NvZGUgICAwMDAwMDAwMDcxOTAyMDAwLTAwMDAwMDAwNzIxRkVGRkYgMDAwMDAwMDAwMDAwMDhGRCAwMDAwMDAwMDAwMDAwMDBGCisKKworRXhhbXBsZSB0byBhbGxvY2F0IDUgcGFnZXMgdHlwZSBCb290Q29kZSBhdCBhZGRyZXNzIDIwMDAwMDAwIChoZXgpCisKKworRlMxOlw+IEFsbG9jUGFnZXMuZWZpIDIgMyA1IDIwMDAwMDAwCitBbGxvY2F0ZVBhZ2U6IF9fQWxsb2NUeXBlX18gX19NZW1UeXBlX18gX19OdW1QYWdlc19fIFtfX0FkZHJfX10KK19fQWxsb2NUeXBlX18gezAsMSwyfSAtLSBBbnksIE1heEFkZHIsIEFkZHIKK19fTWVtVHlwZV9fICAgezAuLjEzfSwgUmVzZXJ2ZWQgPT0wLCBMQ29kZT09MSwgTERhdGE9PTIsIEJTQ29kZT09MywgQlNEYXRhPT00LCAuLi4KK19fTnVtUGFnZXNfXyAgezAuLkYwMDAwMDB9CitbX19BZGRyX19dICAgICAwLi4uIDNGRkZGRkZGRkZGRgorQWxsIG51bWJlcnMgaW4gaGV4IG5vIGxlYWRpbmcgMHgKKworQWxsb2NhdFBhZ2UoMiwzLDUsMjAwMDAwMDApCisKKworRXhhbXBsZSB0byBhbGxvY2F0IDUgcGFnZXMgdHlwZSBCb290Q29kZSBhdCBhZGRyZXNzIDMwMDAwMDAwIChoZXgpCisKKworRlMxOlw+IEFsbG9jUGFnZXMuZWZpIDIgMyA1IDMwMDAwMDAwCitBbGxvY2F0ZVBhZ2U6IF9fQWxsb2NUeXBlX18gX19NZW1UeXBlX18gX19OdW1QYWdlc19fIFtfX0FkZHJfX10KK19fQWxsb2NUeXBlX18gezAsMSwyfSAtLSBBbnksIE1heEFkZHIsIEFkZHIKK19fTWVtVHlwZV9fICAgezAuLjEzfSwgUmVzZXJ2ZWQgPT0wLCBMQ29kZT09MSwgTERhdGE9PTIsIEJTQ29kZT09MywgQlNEYXRhPT00LCAuLi4KK19fTnVtUGFnZXNfXyAgezAuLkYwMDAwMDB9CitbX19BZGRyX19dICAgICAwLi4uIDNGRkZGRkZGRkZGRgorQWxsIG51bWJlcnMgaW4gaGV4IG5vIGxlYWRpbmcgMHgKKworCisKK0ZTMTpcPiBtZW1tYXAKK1R5cGUgICAgICBTdGFydCAgICAgICAgICAgIEVuZCAgICAgICAgICAgICAgI3BhZ2VzICAgICAgICAgICAgIEF0dHJpYnV0ZXMKK0JTX0NvZGUgICAwMDAwMDAwMDAwMDAwMDAwLTAwMDAwMDAwMDAwMDBGRkYgMDAwMDAwMDAwMDAwMDAwMSAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDAwMDAwMTAwMC0wMDAwMDAwMDAwMDhERkZGIDAwMDAwMDAwMDAwMDAwOEQgMDAwMDAwMDAwMDAwMDAwRgorUmVzZXJ2ZWQgIDAwMDAwMDAwMDAwOEUwMDAtMDAwMDAwMDAwMDA4RkZGRiAwMDAwMDAwMDAwMDAwMDAyIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDAwMDkwMDAwLTAwMDAwMDAwMDAwOUZGRkYgMDAwMDAwMDAwMDAwMDAxMCAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDAwMDEwMDAwMC0wMDAwMDAwMDBGRkZGRkZGIDAwMDAwMDAwMDAwMEZGMDAgMDAwMDAwMDAwMDAwMDAwRgorQlNfQ29kZSAgIDAwMDAwMDAwMTAwMDAwMDAtMDAwMDAwMDAxMDA2MUZGRiAwMDAwMDAwMDAwMDAwMDYyIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDEwMDYyMDAwLTAwMDAwMDAwMUZGRkZGRkYgMDAwMDAwMDAwMDAwRkY5RSAwMDAwMDAwMDAwMDAwMDBGCitCU19Db2RlICAgMDAwMDAwMDAyMDAwMDAwMC0wMDAwMDAwMDIwMDA0RkZGIDAwMDAwMDAwMDAwMDAwMDUgMDAwMDAwMDAwMDAwMDAwRgorQXZhaWxhYmxlIDAwMDAwMDAwMjAwMDUwMDAtMDAwMDAwMDAyRkZGRkZGRiAwMDAwMDAwMDAwMDBGRkZCIDAwMDAwMDAwMDAwMDAwMEYKK0JTX0NvZGUgICAwMDAwMDAwMDMwMDAwMDAwLTAwMDAwMDAwMzAwMDRGRkYgMDAwMDAwMDAwMDAwMDAwNSAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDAzMDAwNTAwMC0wMDAwMDAwMDVDREZGRkZGIDAwMDAwMDAwMDAwMkNERkIgMDAwMDAwMDAwMDAwMDAwRgorQUNQSV9OVlMgIDAwMDAwMDAwNUNFMDAwMDAtMDAwMDAwMDA1RERGRkZGRiAwMDAwMDAwMDAwMDAxMDAwIDAwMDAwMDAwMDAwMDAwMEYKK0JTX0RhdGEgICAwMDAwMDAwMDVERTAwMDAwLTAwMDAwMDAwNURGRkZGRkYgMDAwMDAwMDAwMDAwMDIwMCAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDA1RTAwMDAwMC0wMDAwMDAwMDVFRjFDRkZGIDAwMDAwMDAwMDAwMDBGMUQgMDAwMDAwMDAwMDAwMDAwRgorQlNfRGF0YSAgIDAwMDAwMDAwNUVGMUQwMDAtMDAwMDAwMDA3MDlGQkZGRiAwMDAwMDAwMDAwMDExQURGIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDcwOUZDMDAwLTAwMDAwMDAwNzEwRTNGRkYgMDAwMDAwMDAwMDAwMDZFOCAwMDAwMDAwMDAwMDAwMDBGCitMb2FkZXJDb2RlIDAwMDAwMDAwNzEwRTQwMDAtMDAwMDAwMDA3MTFGRUZGRiAwMDAwMDAwMDAwMDAwMTFCIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDcxMUZGMDAwLTAwMDAwMDAwNzE5MDFGRkYgMDAwMDAwMDAwMDAwMDcwMyAwMDAwMDAwMDAwMDAwMDBGCitCU19Db2RlICAgMDAwMDAwMDA3MTkwMjAwMC0wMDAwMDAwMDcyMUZFRkZGIDAwMDAwMDAwMDAwMDA4RkQgMDAwMDAwMDAwMDAwMDAwRgorCisKKworCisKKyAqLworCisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8ZWZpbGliLmg+CisjaW5jbHVkZSA8YXJnaWZ5Lmg+CisKKworI2RlZmluZSBNQVhfTlVNX1BBR0VTIDB4MDAwMDAwMDAwRjAwMDAwMAorI2RlZmluZSBNQVhfQUREUiAoKDFVTEwgPDwgNDYpIC0gMSkKKworCisjaWZkZWYgREVCVUcKKyN1bmRlZiBERUJVRworI2VuZGlmCisjZGVmaW5lIERFQlVHIDAKKworCisKK0VGSV9TVEFUVVMKK2VmaV9tYWluIChFRklfSEFORExFIGltYWdlLCBFRklfU1lTVEVNX1RBQkxFICpzeXN0YWIpCit7CisKKwlFRklfU1RBVFVTIGVmaV9zdGF0dXM7CisJRUZJX0dVSUQgTG9hZGVkSW1hZ2VQcm90b2NvbCA9IExPQURFRF9JTUFHRV9QUk9UT0NPTDsKKwlFRklfTE9BREVEX0lNQUdFICppbmZvOworCisJQ0hBUjE2IGFyZ2xpc3RbTUFYX0FSR1MrMV0gPSB7MH07CisJQ0hBUjE2ICphcmd2W01BWF9BUkdTXTsKKwlJTlROIGFyZ2MgPSAwOworCUlOVE4gZXJyID0gMDsKKworCUlOVE4gQWxsb2NUeXBlID0gLTE7CisJSU5UTiBNZW1UeXBlID0gLTE7CisJSU5UTiBOdW1QYWdlcyA9IC0xOworCVVJTlROIEFkZHIgPSAwOworCisJSW5pdGlhbGl6ZUxpYihpbWFnZSwgc3lzdGFiKTsKKworICAgICAgICBlZmlfc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoIEJTLT5IYW5kbGVQcm90b2NvbCwgMywgaW1hZ2UsCisgICAgICAgICAgICAgICAgJkxvYWRlZEltYWdlUHJvdG9jb2wsICZpbmZvKTsKKworCisJUHJpbnQoTCJBbGxvY2F0ZVBhZ2U6IF9fQWxsb2NUeXBlX18gX19NZW1UeXBlX18gX19OdW1QYWdlc19fIFtfX0FkZHJfX11cbiIpOworCVByaW50KEwiX19BbGxvY1R5cGVfXyB7MCwxLDJ9IC0tIEFueSwgTWF4QWRkciwgQWRkclxuIik7IAorCVByaW50KEwiX19NZW1UeXBlX18gICB7MC4uMTN9LCBSZXNlcnZlZCA9PTAsIExDb2RlPT0xLCBMRGF0YT09MiwgQlNDb2RlPT0zLCBCU0RhdGE9PTQsIC4uLlxuIik7CisJUHJpbnQoTCJfX051bVBhZ2VzX18gIHswLi4leH1cbiIsIE1BWF9OVU1fUEFHRVMpOworCVByaW50KEwiW19fQWRkcl9fXSAgICAgMC4uLiAlbGx4XG4iLCBNQVhfQUREUik7CisJUHJpbnQoTCJBbGwgbnVtYmVycyBpbiBoZXggbm8gbGVhZGluZyAweFxuIik7CisJUHJpbnQoTCJcbiIpOworCisjaWYgREVCVUcKKwlQcmludChMIiVzXG4iLCBpbmZvLT5Mb2FkT3B0aW9ucyk7CisjZW5kaWYKKworCisjaWYgREVCVUcKKwlQcmludChMIlNldCB1cCBhcmdsaXN0XG4iKTsKKyNlbmRpZgorCUNvcHlNZW0oYXJnbGlzdCwgaW5mby0+TG9hZE9wdGlvbnMsIGluZm8tPkxvYWRPcHRpb25zU2l6ZSk7CisjaWYgREVCVUcKKwlQcmludChMImFyZ2xpc3QgPSA8JXM+XG4iLCBhcmdsaXN0KTsKKyNlbmRpZgorCQorI2lmIERFQlVHCisJUHJpbnQoTCJOb3cgdHJ5IGFyZ2lmeVxuIik7CisjZW5kaWYKKwlhcmdjID0gYXJnaWZ5KGFyZ2xpc3QsIGluZm8tPkxvYWRPcHRpb25zU2l6ZSwgYXJndik7CisjaWYgREVCVUcKKwlQcmludChMImFyZ2MgPSAlZFxuIiwgYXJnYyk7CisjZW5kaWYKKworI2lmIERFQlVHCisJZm9yIChjID0gMDsgIGMgPCBhcmdjOyAgYysrICkgeworCQlQcmludChMImFyZ3ZbJWRdID0gPCVzPlxuIiwgYywgYXJndltjXSk7CisJfQorI2VuZGlmCisJaWYgKCAoYXJnYyA8IDMpIHx8IChhcmdjID4gNSkgKSB7CisJCVByaW50KEwiV3JvbmcgYXJndW1lbnQgY291bnRcbiIpOworCQlyZXR1cm4gRUZJX1NVQ0NFU1M7CisJfQorCisJQWxsb2NUeXBlID0geHRvaShhcmd2WzFdKTsKKwlNZW1UeXBlICAgPSB4dG9pKGFyZ3ZbMl0pOworCU51bVBhZ2VzICA9IHh0b2koYXJndlszXSk7CisJaWYgKCBhcmdjID09IDUgKSBBZGRyID0geHRvaShhcmd2WzRdKTsKKworCWlmICggKEFsbG9jVHlwZSA8IDApIHx8IChBbGxvY1R5cGUgPiAyKSkgeworCQlQcmludChMIkludmFsaWQgQWxsb2NUeXBlXG4iKTsKKwkJZXJyKys7CisJfQorCWlmICggKE1lbVR5cGUgPCAwKSB8fCAoTWVtVHlwZSA+IDEzKSApIHsKKwkJUHJpbnQoTCJJbnZhbGlkIE1lbVR5cGVcbiIpOworCQllcnIrKzsKKwl9CisJaWYgKCAoTnVtUGFnZXMgPCAwKSB8fCAoTnVtUGFnZXMgPiBNQVhfTlVNX1BBR0VTKSApIHsKKwkJUHJpbnQoTCJJbmF2bGlkIE51bVBhZ2VzXG4iKTsKKwkJZXJyKys7CisJfQorCWlmICggQWRkciA+IE1BWF9BRERSICkgeworCQlQcmludChMIkluYXZsaWQgQWRkcmVzc1xuIik7CisJCWVycisrOworCX0KKwlpZiAoIGVyciApIHsKKwkJcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisKKwlQcmludChMIkFsbG9jYXRQYWdlKCVkLCVkLCVkLCVseClcbiIsIEFsbG9jVHlwZSwgTWVtVHlwZSwgTnVtUGFnZXMsIEFkZHIpOworCisJZWZpX3N0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5BbGxvY2F0ZVBhZ2VzLCA0LCBBbGxvY1R5cGUsIE1lbVR5cGUsIE51bVBhZ2VzLCAmQWRkcik7CisKKwlpZiAoIEVGSV9FUlJPUihlZmlfc3RhdHVzKSApIHsKKwkJUHJpbnQoTCJBbGxvY2F0ZSBQYWdlcyBGYWlsZWQ6ICVkXG4iLCBlZmlfc3RhdHVzKTsKKwkJcmV0dXJuIGVmaV9zdGF0dXM7CisJfQorCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL0ZyZWVQYWdlcy5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL0ZyZWVQYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjYyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvRnJlZVBhZ2VzLmMKQEAgLTAsMCArMSwxNjQgQEAKKworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEplcnJ5IEhvZW1hbm4gPGplcnJ5LmhvZW1hbm5AaHAuY29tPgorICoKKyAqIEFwcGxpY2F0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBhdCBFRkkuICBTeW50YXggb2YgY29tbWFuZAorICogbWltaWNzIHRoZSBFRkkgQm9vdCBTZXJ2aWNlICJGcmVlUGFnZXMuIgorICoKKyAqIFNlZSBVRUZJIHNwZWMgMi4zLCBTZWN0aW9uIDYuMi4KKyAqCisKK0V4YW1wbGUgZnJlZWluZyBhIDUgcGFnZSBCU19Db2RlIHNldG1lbnQgYXQgYWRkcmVzczogMDAwMDAwMDAyMDAwMDAwMCAoaGV4KQorCisKK0ZTMTpcPiBtZW1tYXAKK1R5cGUgICAgICBTdGFydCAgICAgICAgICAgIEVuZCAgICAgICAgICAgICAgI3BhZ2VzICAgICAgICAgICAgIEF0dHJpYnV0ZXMKK0JTX0NvZGUgICAwMDAwMDAwMDAwMDAwMDAwLTAwMDAwMDAwMDAwMDBGRkYgMDAwMDAwMDAwMDAwMDAwMSAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDAwMDAwMTAwMC0wMDAwMDAwMDAwMDhERkZGIDAwMDAwMDAwMDAwMDAwOEQgMDAwMDAwMDAwMDAwMDAwRgorUmVzZXJ2ZWQgIDAwMDAwMDAwMDAwOEUwMDAtMDAwMDAwMDAwMDA4RkZGRiAwMDAwMDAwMDAwMDAwMDAyIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDAwMDkwMDAwLTAwMDAwMDAwMDAwOUZGRkYgMDAwMDAwMDAwMDAwMDAxMCAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDAwMDEwMDAwMC0wMDAwMDAwMDBGRkZGRkZGIDAwMDAwMDAwMDAwMEZGMDAgMDAwMDAwMDAwMDAwMDAwRgorQlNfQ29kZSAgIDAwMDAwMDAwMTAwMDAwMDAtMDAwMDAwMDAxMDA2MUZGRiAwMDAwMDAwMDAwMDAwMDYyIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDEwMDYyMDAwLTAwMDAwMDAwMUZGRkZGRkYgMDAwMDAwMDAwMDAwRkY5RSAwMDAwMDAwMDAwMDAwMDBGCitCU19Db2RlICAgMDAwMDAwMDAyMDAwMDAwMC0wMDAwMDAwMDIwMDA0RkZGIDAwMDAwMDAwMDAwMDAwMDUgMDAwMDAwMDAwMDAwMDAwRgorQXZhaWxhYmxlIDAwMDAwMDAwMjAwMDUwMDAtMDAwMDAwMDA1RERGRkZGRiAwMDAwMDAwMDAwMDNEREZCIDAwMDAwMDAwMDAwMDAwMEYKK0JTX0RhdGEgICAwMDAwMDAwMDVERTAwMDAwLTAwMDAwMDAwNURGRkZGRkYgMDAwMDAwMDAwMDAwMDIwMCAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDA1RTAwMDAwMC0wMDAwMDAwMDZERTdDRkZGIDAwMDAwMDAwMDAwMEZFN0QgMDAwMDAwMDAwMDAwMDAwRgorQUNQSV9OVlMgIDAwMDAwMDAwNkRFN0QwMDAtMDAwMDAwMDA2RUU3Q0ZGRiAwMDAwMDAwMDAwMDAxMDAwIDAwMDAwMDAwMDAwMDAwMEYKK0JTX0RhdGEgICAwMDAwMDAwMDZFRTdEMDAwLTAwMDAwMDAwNzA5RkJGRkYgMDAwMDAwMDAwMDAwMUI3RiAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDA3MDlGQzAwMC0wMDAwMDAwMDcxMEUzRkZGIDAwMDAwMDAwMDAwMDA2RTggMDAwMDAwMDAwMDAwMDAwRgorCisKK0ZTMTpcPiBGcmVlUGFnZXMgMDAwMDAwMDAyMDAwMDAwMCA1CitGcmVlUGFnZXM6IF9fUGh5c0FkZHJfXyBfX1BnQ250X18KK19fUGh5c0FkZHJfXyAgIDAuLi4gM0ZGRkZGRkZGRkZGCitfX1BnQ250X18gICAgIFswLi5GMDAwMDAwXQorQWxsIG51bWJlcnMgaGV4IHcvIG5vIGxlYWRpbmcgMHgKKworRnJlZVBhZ2VzKDIwMDAwMDAwLDUpCisKKworCitGUzE6XD4gbWVtbWFwCitUeXBlICAgICAgU3RhcnQgICAgICAgICAgICBFbmQgICAgICAgICAgICAgICNwYWdlcyAgICAgICAgICAgICBBdHRyaWJ1dGVzCitCU19Db2RlICAgMDAwMDAwMDAwMDAwMDAwMC0wMDAwMDAwMDAwMDAwRkZGIDAwMDAwMDAwMDAwMDAwMDEgMDAwMDAwMDAwMDAwMDAwRgorQXZhaWxhYmxlIDAwMDAwMDAwMDAwMDEwMDAtMDAwMDAwMDAwMDA4REZGRiAwMDAwMDAwMDAwMDAwMDhEIDAwMDAwMDAwMDAwMDAwMEYKK1Jlc2VydmVkICAwMDAwMDAwMDAwMDhFMDAwLTAwMDAwMDAwMDAwOEZGRkYgMDAwMDAwMDAwMDAwMDAwMiAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDAwMDA5MDAwMC0wMDAwMDAwMDAwMDlGRkZGIDAwMDAwMDAwMDAwMDAwMTAgMDAwMDAwMDAwMDAwMDAwRgorQXZhaWxhYmxlIDAwMDAwMDAwMDAxMDAwMDAtMDAwMDAwMDAwRkZGRkZGRiAwMDAwMDAwMDAwMDBGRjAwIDAwMDAwMDAwMDAwMDAwMEYKK0JTX0NvZGUgICAwMDAwMDAwMDEwMDAwMDAwLTAwMDAwMDAwMTAwNjFGRkYgMDAwMDAwMDAwMDAwMDA2MiAwMDAwMDAwMDAwMDAwMDBGCitBdmFpbGFibGUgMDAwMDAwMDAxMDA2MjAwMC0wMDAwMDAwMDVEREZGRkZGIDAwMDAwMDAwMDAwNEREOUUgMDAwMDAwMDAwMDAwMDAwRgorQlNfRGF0YSAgIDAwMDAwMDAwNURFMDAwMDAtMDAwMDAwMDA1REZGRkZGRiAwMDAwMDAwMDAwMDAwMjAwIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDVFMDAwMDAwLTAwMDAwMDAwNkRFN0NGRkYgMDAwMDAwMDAwMDAwRkU3RCAwMDAwMDAwMDAwMDAwMDBGCitBQ1BJX05WUyAgMDAwMDAwMDA2REU3RDAwMC0wMDAwMDAwMDZFRTdDRkZGIDAwMDAwMDAwMDAwMDEwMDAgMDAwMDAwMDAwMDAwMDAwRgorQlNfRGF0YSAgIDAwMDAwMDAwNkVFN0QwMDAtMDAwMDAwMDA3MDlGQkZGRiAwMDAwMDAwMDAwMDAxQjdGIDAwMDAwMDAwMDAwMDAwMEYKK0F2YWlsYWJsZSAwMDAwMDAwMDcwOUZDMDAwLTAwMDAwMDAwNzEwRTNGRkYgMDAwMDAwMDAwMDAwMDZFOCAwMDAwMDAwMDAwMDAwMDBGCisKKworICovCisKKyNpbmNsdWRlIDxlZmkuaD4KKyNpbmNsdWRlIDxlZmlsaWIuaD4KKyNpbmNsdWRlIDxhcmdpZnkuaD4KKworLyoKKyAqIEZyZWVQYWdlczogIF9fUGh5c0FkZHJfXyBfX1BnQ250X18KKyAqCisgKi8KKworI2RlZmluZSBNQVhfTlVNX1BBR0VTIDB4MDAwMDAwMDAwRjAwMDAwMAorCisjZGVmaW5lIE1BWF9BRERSICgoMVVMTCA8PCA0NikgLSAxKQorCisjaWZkZWYgREVCVUcKKyN1bmRlZiBERUJVRworI2VuZGlmCisjZGVmaW5lIERFQlVHIDAKKworCitFRklfU1RBVFVTCitlZmlfbWFpbiAoRUZJX0hBTkRMRSBpbWFnZSwgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiKQoreworCisJRUZJX1NUQVRVUyBlZmlfc3RhdHVzOworCUVGSV9HVUlEIExvYWRlZEltYWdlUHJvdG9jb2wgPSBMT0FERURfSU1BR0VfUFJPVE9DT0w7CisJRUZJX0xPQURFRF9JTUFHRSAqaW5mbzsKKworCUNIQVIxNiBhcmdsaXN0W01BWF9BUkdTKzFdID0gezB9OworCUNIQVIxNiAqYXJndltNQVhfQVJHU107CisJSU5UTiBhcmdjID0gMDsKKwlJTlROIGVyciA9IDA7CisKKwlJTlROIFBnQ250ID0gLTE7CisJVUlOVE4gUGh5c0FkZHIgPSAwOworCisJSW5pdGlhbGl6ZUxpYihpbWFnZSwgc3lzdGFiKTsKKworICAgICAgICBlZmlfc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoIEJTLT5IYW5kbGVQcm90b2NvbCwgMywgaW1hZ2UsCisgICAgICAgICAgICAgICAgJkxvYWRlZEltYWdlUHJvdG9jb2wsICZpbmZvKTsKKworCisJUHJpbnQoTCJGcmVlUGFnZXM6IF9fUGh5c0FkZHJfXyBfX1BnQ250X19cbiIpOworCVByaW50KEwiX19QaHlzQWRkcl9fICAgMC4uLiAlbGx4XG4iLCBNQVhfQUREUik7CisJUHJpbnQoTCJfX1BnQ250X18gICAgIFswLi4lbHhdXG4iLCBNQVhfTlVNX1BBR0VTKTsKKwlQcmludChMIkFsbCBudW1iZXJzIGhleCB3LyBubyBsZWFkaW5nIDB4XG4iKTsKKwlQcmludChMIlxuIik7CisKKyNpZiBERUJVRworCVByaW50KEwiJXNcbiIsIGluZm8tPkxvYWRPcHRpb25zKTsKKyNlbmRpZgorCisKKyNpZiBERUJVRworCVByaW50KEwiU2V0IHVwIGFyZ2xpc3RcbiIpOworI2VuZGlmCisJQ29weU1lbShhcmdsaXN0LCBpbmZvLT5Mb2FkT3B0aW9ucywgaW5mby0+TG9hZE9wdGlvbnNTaXplKTsKKyNpZiBERUJVRworCVByaW50KEwiYXJnbGlzdCA9IDwlcz5cbiIsIGFyZ2xpc3QpOworI2VuZGlmCisJCisjaWYgREVCVUcKKwlQcmludChMIk5vdyB0cnkgYXJnaWZ5XG4iKTsKKyNlbmRpZgorCWFyZ2MgPSBhcmdpZnkoYXJnbGlzdCwgaW5mby0+TG9hZE9wdGlvbnNTaXplLCBhcmd2KTsKKyNpZiBERUJVRworCVByaW50KEwiYXJnYyA9ICVkXG4iLCBhcmdjKTsKKyNlbmRpZgorCisjaWYgREVCVUcKKwlmb3IgKGMgPSAwOyAgYyA8IGFyZ2M7ICBjKysgKSB7CisJCVByaW50KEwiYXJndlslZF0gPSA8JXM+XG4iLCBjLCBhcmd2W2NdKTsKKwl9CisjZW5kaWYKKwlpZiAoYXJnYyAhPSAzKSB7CisJCVByaW50KEwiSW52YWxpZCBhcmd1bWVudCBjb3VudFxuIik7CisJCXJldHVybiBFRklfU1VDQ0VTUzsKKwl9CisKKwlQaHlzQWRkciA9IHh0b2koYXJndlsxXSk7CisJUGdDbnQJID0geHRvaShhcmd2WzJdKTsKKworCWlmICggKFBnQ250IDwgMCkgfHwgKFBnQ250ID4gTUFYX05VTV9QQUdFUykgKSB7CisJCVByaW50KEwiSW5hdmxpZCBQZ0NudFxuIik7CisJCWVycisrOworCX0KKwlpZiAoIFBoeXNBZGRyID4gTUFYX0FERFIgKSB7CisJCVByaW50KEwiSW5hdmxpZCBBZGRyZXNzXG4iKTsKKwkJZXJyKys7CisJfQorCWlmICggZXJyICkgeworCQlyZXR1cm4gRUZJX1NVQ0NFU1M7CisJfQorCisJUHJpbnQoTCJGcmVlUGFnZXMoJWx4LCVkKVxuIiwgUGh5c0FkZHIsIFBnQ250KTsKKworCWVmaV9zdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+RnJlZVBhZ2VzLCAyLCBQaHlzQWRkciwgUGdDbnQpOworCisJaWYgKCBFRklfRVJST1IoZWZpX3N0YXR1cykgKSB7CisJCVByaW50KEwiRnJlZSBQYWdlcyBGYWlsZWQ6ICVkXG4iLCBlZmlfc3RhdHVzKTsKKwkJcmV0dXJuIGVmaV9zdGF0dXM7CisJfQorCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL01ha2VmaWxlIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTEyODkKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvTWFrZWZpbGUKQEAgLTAsMCArMSw4MiBAQAorIworIyAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgSGV3bGV0dC1QYWNrYXJkIENvLgorIwlDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXIgPGRhdmlkbUBocGwuaHAuY29tPgorIwlDb250cmlidXRlZCBieSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisjCisjICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgICAgYXJlIG1ldDoKKyMKKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyMgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyMgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgQ28uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisjICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyMgICAgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyMgICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyMgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgICAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyMgICAgQkUgTElBQkxFIEZPUiBBTllESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisjICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorIyAgICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgICAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyMgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GCisjICAgIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyAgICBTVUNIIERBTUFHRS4KKyMKKworU1JDRElSID0gLgorCitWUEFUSCA9ICQoU1JDRElSKQorCitpbmNsdWRlICQoU1JDRElSKS8uLi9NYWtlLmRlZmF1bHRzCisKK1RPUERJUiA9ICQoU1JDRElSKS8uLgorCitDRElSPSQoVE9QRElSKS8uLgorTElOVVhfSEVBREVSUwk9IC91c3Ivc3JjL3N5cy9idWlsZAorQ1BQRkxBR1MJKz0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9IRUFERVJTKS9pbmNsdWRlCitDUlRPQkpTCQk9IC4uL2dudWVmaS9jcnQwLWVmaS0kKEFSQ0gpLm8KKworTERTQ1JJUFQJPSAkKFRPUERJUikvZ251ZWZpL2VsZl8kKEFSQ0gpX2VmaS5sZHMKK2lmbmVxICgsJChmaW5kc3RyaW5nIEZyZWVCU0QsJChPUykpKQorTERTQ1JJUFQJPSAkKFRPUERJUikvZ251ZWZpL2VsZl8kKEFSQ0gpX2Zic2RfZWZpLmxkcworZW5kaWYKKworTERGTEFHUwkJKz0gLXNoYXJlZCAtQnN5bWJvbGljIC1MLi4vbGliIC1MLi4vZ251ZWZpICQoQ1JUT0JKUykKKworTE9BRExJQkVTCSs9IC1sZWZpIC1sZ251ZWZpCitMT0FETElCRVMJKz0gJChzaGVsbCAkKENDKSAkKEFSQ0gzMjY0KSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSkKK0xPQURMSUJFUwkrPSAtVCAkKExEU0NSSVBUKQorCitGT1JNQVQJCT0gZWZpLWFwcC0kKEFSQ0gpCisKK1RBUkdFVF9BUFBTID0gdC5lZmkgdDIuZWZpIHQzLmVmaSB0NC5lZmkgdDUuZWZpIHQ2LmVmaSBcCisJICAgICAgcHJpbnRlbnYuZWZpIHQ3LmVmaSB0Y2MuZWZpIG1vZGVsaXN0LmVmaSBcCisJICAgICAgcm91dGU4MGguZWZpIGRydjBfdXNlLmVmaSBBbGxvY1BhZ2VzLmVmaSBcCisJICAgICAgRnJlZVBhZ2VzLmVmaQorVEFSR0VUX0JTRFJJVkVSUyA9IGRydjAuZWZpCitUQVJHRVRfUlREUklWRVJTID0KKworVEFSR0VUUyA9ICQoVEFSR0VUX0FQUFMpICQoVEFSR0VUX0JTRFJJVkVSUykgJChUQVJHRVRfUlREUklWRVJTKQorCithbGw6CSQoVEFSR0VUUykKKworJChUQVJHRVRfQlNEUklWRVJTKTogRk9STUFUPWVmaS1ic2Rydi0kKEFSQ0gpCiskKFRBUkdFVF9SVERSSVZFUlMpOiBGT1JNQVQ9ZWZpLXJ0ZHJ2LSQoQVJDSCkKKworY2xlYW46CisJcm0gLWYgJChUQVJHRVRTKSAqfiAqLm8gKi5zbworCisuUEhPTlk6IGluc3RhbGwKKworaW5jbHVkZSAkKFNSQ0RJUikvLi4vTWFrZS5ydWxlcwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL2RydjAuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9kcnYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2ZThlNwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9kcnYwLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgRGF2aWQgRGVjb3RpZ255IDxkZWNvdEBnb29nbGVycy5jb20+CisgKgorICogU2FtcGxlIEVGSSBzaGVsbCBzZXNzaW9uLCB0b2dldGhlciB3aXRoIGRydjBfdXNlLmVmaToKKyAqCisgKiAgIyBMb2FkaW5nIGZpcnN0IGluc3RhbmNlOgorICoKKyAqICAgIGZzMDpcPiBsb2FkIGRydjAuZWZpCisgKiAgICBEcml2ZXIgaW5zdGFuY2UgbG9hZGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgIGxvYWQ6IEltYWdlIGZzMDpcZHJ2MC5lZmkgbG9hZGVkIGF0IDJGRDdDMDAwIC0gU3VjY2VzcworICoKKyAqICAjIFRlc3RpbmcgMXN0IGluc3RhbmNlOgorICoKKyAqICAgIGZzMDpcPiBkcnYwX3VzZS5lZmkKKyAqICAgIFBsYXlpbmcgd2l0aCBkcml2ZXIgaW5zdGFuY2UgMC4uLgorICogICAgSGVsbG8gU2FtcGxlIFVFRkkgRHJpdmVyIQorICogICAgSGVsbG8gd2FzIGNhbGxlZCAxIHRpbWUocykuCisgKgorICogICAgZnMwOlw+IGRydjBfdXNlLmVmaQorICogICAgUGxheWluZyB3aXRoIGRyaXZlciBpbnN0YW5jZSAwLi4uCisgKiAgICBIZWxsbyBTYW1wbGUgVUVGSSBEcml2ZXIhCisgKiAgICBIZWxsbyB3YXMgY2FsbGVkIDIgdGltZShzKS4KKyAqCisgKiAgIyBMb2FkaW5nIGFub3RoZXIgaW5zdGFuY2U6CisgKgorICogICAgZnMwOlw+IGxvYWQgZHJ2MC5lZmkKKyAqICAgIERyaXZlciBpbnN0YW5jZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgbG9hZDogSW1hZ2UgZnMwOlxkcnYwLmVmaSBsb2FkZWQgYXQgMkZENkQwMDAgLSBTdWNjZXNzCisgKgorICogICMgVXNpbmcgYm90aCBpbnN0YW5jZXM6CisgKgorICogICAgZnMwOlw+IGRydjBfdXNlLmVmaQorICogICAgUGxheWluZyB3aXRoIGRyaXZlciBpbnN0YW5jZSAwLi4uCisgKiAgICBIZWxsbyBTYW1wbGUgVUVGSSBEcml2ZXIhCisgKiAgICBIZWxsbyB3YXMgY2FsbGVkIDMgdGltZShzKS4KKyAqICAgIFBsYXlpbmcgd2l0aCBkcml2ZXIgaW5zdGFuY2UgMS4uLgorICogICAgSGVsbG8gU2FtcGxlIFVFRkkgRHJpdmVyIQorICogICAgSGVsbG8gd2FzIGNhbGxlZCAxIHRpbWUocykuCisgKgorICogICAgZnMwOlw+IGRydjBfdXNlLmVmaQorICogICAgUGxheWluZyB3aXRoIGRyaXZlciBpbnN0YW5jZSAwLi4uCisgKiAgICBIZWxsbyBTYW1wbGUgVUVGSSBEcml2ZXIhCisgKiAgICBIZWxsbyB3YXMgY2FsbGVkIDQgdGltZShzKS4KKyAqICAgIFBsYXlpbmcgd2l0aCBkcml2ZXIgaW5zdGFuY2UgMS4uLgorICogICAgSGVsbG8gU2FtcGxlIFVFRkkgRHJpdmVyIQorICogICAgSGVsbG8gd2FzIGNhbGxlZCAyIHRpbWUocykuCisgKgorICogICMgUmVtb3ZpbmcgMXN0IGluc3RhbmNlOgorICoKKyAqICAgIGZzMDpcPiBkaAorICogICAgSGFuZGxlIGR1bXAKKyAqICAgICAgMTogSW1hZ2UoRHhlQ29yZSkKKyAqICAgIFsuLi5dCisgKiAgICAgNzk6IEltYWdlKFwvZHJ2MC5lZmkpIEltYWdlRGV2UGF0aCAoLi5BLDB4ODAwLDB4MTdGN0RGKS9cL2RydjAuZWZpKQorICogICAgIDdBOiBJbWFnZShcL2RydjAuZWZpKSBJbWFnZURldlBhdGggKC4uQSwweDgwMCwweDE3RjdERikvXC9kcnYwLmVmaSkKKyAqCisgKiAgICBmczA6XD4gdW5sb2FkIDc5CisgKiAgICAgNzk6IEltYWdlKFwvZHJ2MC5lZmkpIEltYWdlRGV2UGF0aCAoLi5BLDB4ODAwLDB4MTdGN0RGKS9cL2RydjAuZWZpKQorICogICAgVW5sb2FkIGRyaXZlciBpbWFnZSAoeS9uKT8geQorICogICAgRHJpdmVyIGluc3RhbmNlIHVubG9hZGVkLgorICogICAgdW5sb2FkOiBTdWNjZXNzCisgKgorICogICMgT25seSAybmQgaW5zdGFuY2UgcmVtYWluaW5nOgorICoKKyAqICAgIGZzMDpcPiBkcnYwX3VzZS5lZmkKKyAqICAgIFBsYXlpbmcgd2l0aCBkcml2ZXIgaW5zdGFuY2UgMC4uLgorICogICAgSGVsbG8gU2FtcGxlIFVFRkkgRHJpdmVyIQorICogICAgSGVsbG8gd2FzIGNhbGxlZCAzIHRpbWUocykuCisgKgorICogICMgUmVtb3ZpbmcgMm5kL2xhc3QgaW5zdGFuY2U6CisgKgorICogICAgZnMwOlw+IGRoCisgKiAgICBIYW5kbGUgZHVtcAorICogICAgICAxOiBJbWFnZShEeGVDb3JlKQorICogICAgWy4uLl0KKyAqICAgICA3OTogSW1hZ2UoXC9kcnYwLmVmaSkgSW1hZ2VEZXZQYXRoICguLkEsMHg4MDAsMHgxN0Y3REYpL1wvZHJ2MC5lZmkpCisgKgorICogICAgZnMwOlw+IHVubG9hZCA3OQorICogICAgIDc5OiBJbWFnZShcL2RydjAuZWZpKSBJbWFnZURldlBhdGggKC4uQSwweDgwMCwweDE3RjdERikvXC9kcnYwLmVmaSkKKyAqICAgIFVubG9hZCBkcml2ZXIgaW1hZ2UgKHkvbik/IHkKKyAqICAgIERyaXZlciBpbnN0YW5jZSB1bmxvYWRlZC4KKyAqICAgIHVubG9hZDogU3VjY2VzcworICoKKyAqICAjIEV4cGVjdCBlcnJvcjogbm8gb3RoZXIgZHJ2MCBpbnN0YW5jZSBsZWZ0CisgKgorICogICAgZnMwOlw+IGRydjBfdXNlLmVmaQorICogICAgRXJyb3IgbG9va2luZyB1cCBoYW5kbGVzIGZvciBwcm90bzogMTQKKyAqLworCisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8ZWZpbGliLmg+CisjaW5jbHVkZSAiZHJ2MC5oIgorCisKK3N0YXRpYyBjb25zdCBFRklfR1VJRCBHbnVFZmlBcHBzRHJ2MFByb3RvY29sR3VpZAorICA9IEdOVV9FRklfQVBQU19EUlYwX1BST1RPQ09MX0dVSUQ7CisKK3N0YXRpYyBzdHJ1Y3QgeworICBHTlVfRUZJX0FQUFNfRFJWMF9QUk9UT0NPTCBQcm90bzsKKyAgVUlOVE4gQ291bnRlcjsKK30gSW50ZXJuYWxHbnVFZmlBcHBzRHJ2MFByb3RvY29sRGF0YTsKKworCitzdGF0aWMKK0VGSV9TVEFUVVMKK0VGSV9GVU5DVElPTgorRHJ2MFNheUhlbGxvKAorICAgIElOIHN0cnVjdCBfR05VX0VGSV9BUFBTX0RSVjBfUFJPVE9DT0wgKlRoaXMsCisgICAgSU4gY29uc3QgQ0hBUjE2ICpIZWxsb1dobworICAgICkKK3sKKyAgaWYgKCEgSGVsbG9XaG8pCisgICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKworICBQcmludChMIkhlbGxvICVzIVxuIiwgSGVsbG9XaG8pOworICBJbnRlcm5hbEdudUVmaUFwcHNEcnYwUHJvdG9jb2xEYXRhLkNvdW50ZXIgKys7CisgIHJldHVybiBFRklfU1VDQ0VTUzsKK30KKworCitzdGF0aWMKK0VGSV9TVEFUVVMKK0VGSV9GVU5DVElPTgorRHJ2MEdldE51bWJlck9mSGVsbG8oCisgICAgSU4gc3RydWN0IF9HTlVfRUZJX0FQUFNfRFJWMF9QUk9UT0NPTCAqVGhpcywKKyAgICBPVVQgVUlOVE4gKk51bWJlck9mSGVsbG8KKyAgICApCit7CisgIGlmICghIE51bWJlck9mSGVsbG8pCisgICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKworICAqTnVtYmVyT2ZIZWxsbyA9IEludGVybmFsR251RWZpQXBwc0RydjBQcm90b2NvbERhdGEuQ291bnRlcjsKKyAgcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCisKK3N0YXRpYworRUZJX1NUQVRVUworRUZJX0ZVTkNUSU9OCitEcnYwVW5sb2FkKElOIEVGSV9IQU5ETEUgSW1hZ2VIYW5kbGUpCit7CisgIExpYlVuaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlcyhJbWFnZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZHbnVFZmlBcHBzRHJ2MFByb3RvY29sR3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnRlcm5hbEdudUVmaUFwcHNEcnYwUHJvdG9jb2xEYXRhLlByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIFByaW50KEwiRHJpdmVyIGluc3RhbmNlIHVubG9hZGVkLlxuIiwgSW1hZ2VIYW5kbGUpOworICByZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisKKworRUZJX1NUQVRVUworZWZpX21haW4gKEVGSV9IQU5ETEUgSW1hZ2VIYW5kbGUsIEVGSV9TWVNURU1fVEFCTEUgKlN5c1RhYikKK3sKKyAgRUZJX1NUQVRVUyBTdGF0dXM7CisgIEVGSV9MT0FERURfSU1BR0UgKkxvYWRlZEltYWdlID0gTlVMTDsKKworICBJbml0aWFsaXplTGliKEltYWdlSGFuZGxlLCBTeXNUYWIpOworCisgIC8qIEluaXRpYWxpemUgZ2xvYmFsIHByb3RvY29sIGRlZmluaXRpb24gKyBkYXRhICovCisgIEludGVybmFsR251RWZpQXBwc0RydjBQcm90b2NvbERhdGEuUHJvdG8uU2F5SGVsbG8KKyAgICAgID0gKEdOVV9FRklfQVBQU19EUlYwX1NBWV9IRUxMTykgRHJ2MFNheUhlbGxvOworICBJbnRlcm5hbEdudUVmaUFwcHNEcnYwUHJvdG9jb2xEYXRhLlByb3RvLkdldE51bWJlck9mSGVsbG8KKyAgICAgID0gKEdOVV9FRklfQVBQU19EUlYwX0dFVF9OVU1CRVJfT0ZfSEVMTE8pIERydjBHZXROdW1iZXJPZkhlbGxvOworICBJbnRlcm5hbEdudUVmaUFwcHNEcnYwUHJvdG9jb2xEYXRhLkNvdW50ZXIgPSAwOworCisgIC8qIEdyYWIgaGFuZGxlIHRvIHRoaXMgaW1hZ2U6IHdlJ2xsIGF0dGFjaCBvdXIgcHJvdG8gaW5zdGFuY2UgdG8gaXQgKi8KKyAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPk9wZW5Qcm90b2NvbCwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGUsICZMb2FkZWRJbWFnZVByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTG9hZGVkSW1hZ2UsIEltYWdlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBFRklfT1BFTl9QUk9UT0NPTF9HRVRfUFJPVE9DT0wpOworICBpZiAoRUZJX0VSUk9SKFN0YXR1cykpIHsKKyAgICBQcmludChMIkNvdWxkIG5vdCBvcGVuIGxvYWRlZCBpbWFnZSBwcm90b2NvbDogJWRcbiIsIFN0YXR1cyk7CisgICAgcmV0dXJuIFN0YXR1czsKKyAgfQorCisgIC8qIEF0dGFjaCBvdXIgcHJvdG8gdG8gdGhlIGN1cnJlbnQgZHJpdmVyIGltYWdlICovCisgIFN0YXR1cyA9IExpYkluc3RhbGxQcm90b2NvbEludGVyZmFjZXMoCisgICAgICAmSW1hZ2VIYW5kbGUsICZHbnVFZmlBcHBzRHJ2MFByb3RvY29sR3VpZCwKKyAgICAgICZJbnRlcm5hbEdudUVmaUFwcHNEcnYwUHJvdG9jb2xEYXRhLlByb3RvLCBOVUxMKTsKKyAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgUHJpbnQoTCJFcnJvciByZWdpc3RlcmluZyBkcml2ZXIgaW5zdGFuY2U6ICVkXG4iLCBTdGF0dXMpOworICAgIHJldHVybiBTdGF0dXM7CisgIH0KKworICAvKiBSZWdpc3RlciBVbmxvYWQgY2FsbGJhY2ssIHVzZWQgdG8gdW5yZWdpc3RlciBjdXJyZW50IHByb3RvY29sCisgICAqIGluc3RhbmNlIGZyb20gc3lzdGVtICovCisgIExvYWRlZEltYWdlLT5VbmxvYWQgPSAoRUZJX0lNQUdFX1VOTE9BRClEcnYwVW5sb2FkOworCisgIFByaW50KEwiRHJpdmVyIGluc3RhbmNlIGxvYWRlZCBzdWNjZXNzZnVsbHkuXG4iKTsKKyAgcmV0dXJuIEVGSV9TVUNDRVNTOyAgLyogYXQgdGhpcyBwb2ludCwgdGhpcyBpbnN0YW5jZSBzdGF5cyByZXNpZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgKiB1bnRpbCBpbWFnZSBpcyB1bmxvYWRlZCwgZWcuIHdpdGggc2hlbGwncyB1bmxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAqIEV4aXRCb290U2VydmljZXMoKSAqLworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL2RydjAuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9kcnYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkMmZmZAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9kcnYwLmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBfR05VX0VGSV9BUFBTX0RSVjBfSF8KKyNkZWZpbmUgX0dOVV9FRklfQVBQU19EUlYwX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogVUVGSSBuYW1pbmcgY29udmVudGlvbnMgKi8KKyNkZWZpbmUgR05VX0VGSV9BUFBTX0RSVjBfUFJPVE9DT0xfR1VJRCBcCit7IDB4ZTRkY2FmZDAsIDB4NTg2YywgMHg0YjNkLCB7MHg4NiwgMHhlNywgMHgyOCwgMHhkZSwgMHg3ZiwgMHhjYywgMHgwNCwgMHhiOH0gfQorCitJTlRFUkZBQ0VfREVDTChfR05VX0VGSV9BUFBTX0RSVjBfUFJPVE9DT0wpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpHTlVfRUZJX0FQUFNfRFJWMF9TQVlfSEVMTE8pICgKKyAgICBJTiBzdHJ1Y3QgX0dOVV9FRklfQVBQU19EUlYwX1BST1RPQ09MICpUaGlzLAorICAgIElOIGNvbnN0IENIQVIxNiAqSGVsbG9XaG8KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpHTlVfRUZJX0FQUFNfRFJWMF9HRVRfTlVNQkVSX09GX0hFTExPKSAoCisgICAgSU4gc3RydWN0IF9HTlVfRUZJX0FQUFNfRFJWMF9QUk9UT0NPTCAqVGhpcywKKyAgICBPVVQgVUlOVE4gKk51bWJlck9mSGVsbG8KKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfR05VX0VGSV9BUFBTX0RSVjBfUFJPVE9DT0wgeworICBHTlVfRUZJX0FQUFNfRFJWMF9TQVlfSEVMTE8gICAgICAgICAgIFNheUhlbGxvOworICBHTlVfRUZJX0FQUFNfRFJWMF9HRVRfTlVNQkVSX09GX0hFTExPIEdldE51bWJlck9mSGVsbG87Cit9IEdOVV9FRklfQVBQU19EUlYwX1BST1RPQ09MOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9kcnYwX3VzZS5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL2RydjBfdXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdjNTg2OQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9kcnYwX3VzZS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgRGF2aWQgRGVjb3RpZ255IDxkZWNvdEBnb29nbGVycy5jb20+CisgKgorICogU2VlIGRydjAuYyBmb3IgYW4gZXhhbXBsZSBzZXNzaW9uLgorICovCisKKyNpbmNsdWRlIDxlZmkuaD4KKyNpbmNsdWRlIDxlZmlsaWIuaD4KKyNpbmNsdWRlICJkcnYwLmgiCisKKworc3RhdGljIEVGSV9HVUlEIEdudUVmaUFwcHNEcnYwUHJvdG9jb2xHdWlkCisgID0gR05VX0VGSV9BUFBTX0RSVjBfUFJPVE9DT0xfR1VJRDsKKworCitzdGF0aWMKK0VGSV9TVEFUVVMKK1BsYXlXaXRoR251RWZpQXBwc0RydjBQcm90b2NvbChJTiBFRklfSEFORExFIERydkhhbmRsZSkgeworICBFRklfU1RBVFVTIFN0YXR1czsKKyAgR05VX0VGSV9BUFBTX0RSVjBfUFJPVE9DT0wgKmRydiA9IE5VTEw7CisgIFVJTlROIE51bWJlck9mSGVsbG8gPSAwOworCisgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5PcGVuUHJvdG9jb2wsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERydkhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkdudUVmaUFwcHNEcnYwUHJvdG9jb2xHdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcnZIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9PUEVOX1BST1RPQ09MX0dFVF9QUk9UT0NPTCk7CisgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgIFByaW50KEwiQ2Fubm90IG9wZW4gcHJvdG86ICVkXG4iLCBTdGF0dXMpOworICAgIHJldHVybiBTdGF0dXM7CisgIH0KKworICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihkcnYtPlNheUhlbGxvLCAyLCBkcnYsIEwiU2FtcGxlIFVFRkkgRHJpdmVyIik7CisgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgIFByaW50KEwiQ2Fubm90IGNhbGwgU2F5SGVsbG86ICVkXG4iLCBTdGF0dXMpOworICB9CisKKyAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoZHJ2LT5HZXROdW1iZXJPZkhlbGxvLCAyLCBkcnYsICZOdW1iZXJPZkhlbGxvKTsKKyAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgUHJpbnQoTCJDYW5ub3QgY2FsbCBHZXROdW1iZXJPZkhlbGxvOiAlZFxuIiwgU3RhdHVzKTsKKyAgfSBlbHNlIHsKKyAgICBQcmludChMIkhlbGxvIHdhcyBjYWxsZWQgJWQgdGltZShzKS5cbiIsIE51bWJlck9mSGVsbG8pOworICB9CisKKyAgcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCisKK0VGSV9TVEFUVVMKK2VmaV9tYWluIChFRklfSEFORExFIEltYWdlLCBFRklfU1lTVEVNX1RBQkxFICpTeXNUYWIpCit7CisgIEVGSV9TVEFUVVMgU3RhdHVzOworICBFRklfSEFORExFICpIYW5kbGVzID0gTlVMTDsKKyAgVUlOVE4gaSwgTm9IYW5kbGVzID0gMDsKKworICBJbml0aWFsaXplTGliKEltYWdlLCBTeXNUYWIpOworCisgIFN0YXR1cyA9IExpYkxvY2F0ZUhhbmRsZShCeVByb3RvY29sLCAmR251RWZpQXBwc0RydjBQcm90b2NvbEd1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmTm9IYW5kbGVzLCAmSGFuZGxlcyk7CisgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgIFByaW50KEwiRXJyb3IgbG9va2luZyB1cCBoYW5kbGVzIGZvciBwcm90bzogJWRcbiIsIFN0YXR1cyk7CisgICAgcmV0dXJuIFN0YXR1czsKKyAgfQorCisgIGZvciAoaSA9IDAgOyBpIDwgTm9IYW5kbGVzIDsgKytpKQorICB7CisgICAgUHJpbnQoTCJQbGF5aW5nIHdpdGggZHJpdmVyIGluc3RhbmNlICVkLi4uXG4iLCBpKTsKKyAgICBTdGF0dXMgPSBQbGF5V2l0aEdudUVmaUFwcHNEcnYwUHJvdG9jb2woSGFuZGxlc1tpXSk7CisgICAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKQorICAgICAgUHJpbnQoTCJFcnJvciBwbGF5aW5nIHdpdGggaW5zdGFuY2UgJWQsIHNraXBwaW5nXG4iLCBpKTsKKyAgfQorCisgIGlmIChIYW5kbGVzKQorICAgIEZyZWVQb29sKEhhbmRsZXMpOworCisgIHJldHVybiBFRklfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9tb2RlbGlzdC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL21vZGVsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4MTZkMQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9tb2RlbGlzdC5jCkBAIC0wLDAgKzEsMTE0IEBACisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8ZWZpbGliLmg+CisKK2V4dGVybiBFRklfR1VJRCBHcmFwaGljc091dHB1dFByb3RvY29sOworCitzdGF0aWMgaW50IG1lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIFVJTlROIG4pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYzEgPSBzMSwgKmMyID0gczI7CisJaW50IGQgPSAwOworCisJaWYgKCFzMSAmJiAhczIpCisJCXJldHVybiAwOworCWlmIChzMSAmJiAhczIpCisJCXJldHVybiAxOworCWlmICghczEgJiYgczIpCisJCXJldHVybiAtMTsKKworCXdoaWxlIChuLS0pIHsKKwkJZCA9IChpbnQpKmMxKysgLSAoaW50KSpjMisrOworCQlpZiAoZCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZDsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X21vZGVzKEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0wgKmdvcCkKK3sKKwlpbnQgaSwgaW1heDsKKwlFRklfU1RBVFVTIHJjOworCisJaW1heCA9IGdvcC0+TW9kZS0+TWF4TW9kZTsKKworCVByaW50KEwiR09QIHJlcG9ydHMgTWF4TW9kZSAlZFxuIiwgaW1heCk7CisJZm9yIChpID0gMDsgaSA8IGltYXg7IGkrKykgeworCQlFRklfR1JBUEhJQ1NfT1VUUFVUX01PREVfSU5GT1JNQVRJT04gKmluZm87CisJCVVJTlROIFNpemVPZkluZm87CisJCXJjID0gdWVmaV9jYWxsX3dyYXBwZXIoZ29wLT5RdWVyeU1vZGUsIDQsIGdvcCwgaSwgJlNpemVPZkluZm8sCisJCQkJCSZpbmZvKTsKKwkJaWYgKEVGSV9FUlJPUihyYykgJiYgcmMgPT0gRUZJX05PVF9TVEFSVEVEKSB7CisJCQlyYyA9IHVlZmlfY2FsbF93cmFwcGVyKGdvcC0+U2V0TW9kZSwgMiwgZ29wLAorCQkJCWdvcC0+TW9kZS0+TW9kZSk7CisJCQlyYyA9IHVlZmlfY2FsbF93cmFwcGVyKGdvcC0+UXVlcnlNb2RlLCA0LCBnb3AsIGksCisJCQkJJlNpemVPZkluZm8sICZpbmZvKTsKKwkJfQorCisJCWlmIChFRklfRVJST1IocmMpKSB7CisJCQlDSEFSMTYgQnVmZmVyWzY0XTsKKwkJCVN0YXR1c1RvU3RyaW5nKEJ1ZmZlciwgcmMpOworCQkJUHJpbnQoTCIlZDogQmFkIHJlc3BvbnNlIGZyb20gUXVlcnlNb2RlOiAlcyAoJWQpXG4iLAorCQkJCWksIEJ1ZmZlciwgcmMpOworCQkJY29udGludWU7CisJCX0KKwkJUHJpbnQoTCIlYyVkOiAlZHglZCAiLCBtZW1jbXAoaW5mbyxnb3AtPk1vZGUtPkluZm8sc2l6ZW9mKCppbmZvKSkgPT0gMCA/ICcqJyA6ICcgJywgaSwKKwkJCWluZm8tPkhvcml6b250YWxSZXNvbHV0aW9uLAorCQkJaW5mby0+VmVydGljYWxSZXNvbHV0aW9uKTsKKwkJc3dpdGNoKGluZm8tPlBpeGVsRm9ybWF0KSB7CisJCQljYXNlIFBpeGVsUmVkR3JlZW5CbHVlUmVzZXJ2ZWQ4Qml0UGVyQ29sb3I6CisJCQkJUHJpbnQoTCJSR0JSIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFBpeGVsQmx1ZUdyZWVuUmVkUmVzZXJ2ZWQ4Qml0UGVyQ29sb3I6CisJCQkJUHJpbnQoTCJCR1JSIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFBpeGVsQml0TWFzazoKKwkJCQlQcmludChMIlI6JTA4eCBHOiUwOHggQjolMDh4IFg6JTA4eCIsCisJCQkJCWluZm8tPlBpeGVsSW5mb3JtYXRpb24uUmVkTWFzaywKKwkJCQkJaW5mby0+UGl4ZWxJbmZvcm1hdGlvbi5HcmVlbk1hc2ssCisJCQkJCWluZm8tPlBpeGVsSW5mb3JtYXRpb24uQmx1ZU1hc2ssCisJCQkJCWluZm8tPlBpeGVsSW5mb3JtYXRpb24uUmVzZXJ2ZWRNYXNrKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUGl4ZWxCbHRPbmx5OgorCQkJCVByaW50KEwiKGJsdCBvbmx5KSIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlQcmludChMIihJbnZhbGlkIHBpeGVsIGZvcm1hdCkiKTsKKwkJCQlicmVhazsKKwkJfQorCQlQcmludChMIiBwaXRjaCAlZFxuIiwgaW5mby0+UGl4ZWxzUGVyU2NhbkxpbmUpOworCX0KK30KKworc3RhdGljIEVGSV9TVEFUVVMKK1NldFdhdGNoZG9nKFVJTlROIHNlY29uZHMpCit7CisJRUZJX1NUQVRVUyByYzsKKwlyYyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5TZXRXYXRjaGRvZ1RpbWVyLCA0LCBzZWNvbmRzLCAweDFmZmZmLAorCQkJCTAsIE5VTEwpOworCWlmIChFRklfRVJST1IocmMpKSB7CisJCUNIQVIxNiBCdWZmZXJbNjRdOworCQlTdGF0dXNUb1N0cmluZyhCdWZmZXIsIHJjKTsKKwkJUHJpbnQoTCJCYWQgcmVzcG9uc2UgZnJvbSBRdWVyeU1vZGU6ICVzICglZClcbiIsIEJ1ZmZlciwgcmMpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK0VGSV9TVEFUVVMKK2VmaV9tYWluIChFRklfSEFORExFIGltYWdlX2hhbmRsZSwgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiKQoreworCUVGSV9TVEFUVVMgcmM7CisJRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTCAqZ29wOworCisJSW5pdGlhbGl6ZUxpYihpbWFnZV9oYW5kbGUsIHN5c3RhYik7CisKKwlTZXRXYXRjaGRvZygxMCk7CisKKwlyYyA9IExpYkxvY2F0ZVByb3RvY29sKCZHcmFwaGljc091dHB1dFByb3RvY29sLCAodm9pZCAqKikmZ29wKTsKKwlpZiAoRUZJX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJcHJpbnRfbW9kZXMoZ29wKTsKKworCVNldFdhdGNoZG9nKDApOworCXJldHVybiBFRklfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9wcmludGVudi5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3ByaW50ZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0MWU0MAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9wcmludGVudi5jCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDxlZmkuaD4KKyNpbmNsdWRlIDxlZmlsaWIuaD4KKworRUZJX1NUQVRVUworZWZpX21haW4gKEVGSV9IQU5ETEUgaW1hZ2UsIEVGSV9TWVNURU1fVEFCTEUgKnN5c3RhYikKK3sKKwlFRklfU1RBVFVTIHN0YXR1czsKKwlDSEFSMTYgbmFtZVsyNTZdLCAqdmFsLCBmbXRbMjBdOworCUVGSV9HVUlEIHZlbmRvcjsKKwlVSU5UTiBzaXplOworCisJSW5pdGlhbGl6ZUxpYihpbWFnZSwgc3lzdGFiKTsKKworCW5hbWVbMF0gPSAwOworCXZlbmRvciA9IE51bGxHdWlkOworCisJUHJpbnQoTCJHVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZSBOYW1lICAgICAgICBWYWx1ZVxuIik7CisJUHJpbnQoTCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PSA9PT09PT09PVxuIik7CisKKwlTdHJDcHkoZm10LCBMIiUuLTM1ZyAlLi0yMHMgJXNcbiIpOworCXdoaWxlICgxKSB7CisJCXNpemUgPSBzaXplb2YobmFtZSk7CisJCXN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKFJULT5HZXROZXh0VmFyaWFibGVOYW1lLCAzLCAmc2l6ZSwgbmFtZSwgJnZlbmRvcik7CisJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQl2YWwgPSBMaWJHZXRWYXJpYWJsZShuYW1lLCAmdmVuZG9yKTsKKwkJUHJpbnQoZm10LCAmdmVuZG9yLCBuYW1lLCB2YWwpOworCQlGcmVlUG9vbCh2YWwpOworCX0KKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvcm91dGU4MGguYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy9yb3V0ZTgwaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZWEyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvcm91dGU4MGguYwpAQCAtMCwwICsxLDE0NiBAQAorI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorCisvKiB0aGlzIGV4YW1wbGUgcHJvZ3JhbSBjaGFuZ2VzIHRoZSBSZXNlcnZlZCBQYWdlIFJvdXRlIChSUFIpIGJpdCBvbiBJQ0gxMCdzIEdlbmVyYWwKKyAqIENvbnRyb2wgQW5kIFN0YXR1cyBSZWdpc3RlciAoR0NTKSBmcm9tIExQQyB0byBQQ0kuICBJbiBwcmFjdGljYWwgdGVybXMsIGl0IHJvdXRlcworICogb3V0YiB0byBwb3J0IDgwaCB0byB0aGUgUENJIGJ1cy4gKi8KKworI2RlZmluZSBHQ1NfT0ZGU0VUX0FERFIgMHgzNDEwCisjZGVmaW5lIEdDU19SUFJfU0hJRlQgMgorI2RlZmluZSBHQ1NfUlBSX1BDSSAxCisjZGVmaW5lIEdDU19SUFJfTFBDIDAKKworI2RlZmluZSBWRU5ET1JfSURfSU5URUwgMHg4MDg2CisjZGVmaW5lIERFVklDRV9JRF9MUENJRiAweDNhMTYKKyNkZWZpbmUgREVWSUNFX0lEX0NPVUdBUlBPSU5UX0xQQ0lGIDB4MWM1NgorCitzdGF0aWMgRUZJX0hBTkRMRSBJbWFnZUhhbmRsZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IHZlbmRvcl9pZDsJLyogMDAtMDEgKi8KKwl1aW50MTZfdCBkZXZpY2VfaWQ7CS8qIDAyLTAzICovCisJY2hhciBwYWRbMHhFQl07CQkvKiAwNC1FRiAqLworCXVpbnQzMl90IHJjYmE7CQkvKiBGMC1GMyAqLworCXVpbnQzMl90IHJlc2VydmVkWzNdOwkvKiBGNC1GRiAqLworfSBscGNpZl90OworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdCh2b2xhdGlsZSB1aW50MzJfdCAqZmxhZywgaW50IGJpdCwgaW50IHZhbHVlKQoreworCXVpbnQzMl90IHZhbCA9ICpmbGFnOworCVByaW50KEwiY3VycmVudCB2YWx1ZSBpcyAweCUyeFxuIiwgdmFsKTsKKworCWlmICh2YWx1ZSkgeworCQl2YWwgfD0gKDEgPDwgYml0KTsKKwl9IGVsc2UgeworCQl2YWwgJj0gfigxIDw8IGJpdCk7CisJfQorCVByaW50KEwic2V0dGluZyB2YWx1ZSB0byAweCUyeFxuIiwgdmFsKTsKKwkqZmxhZyA9IHZhbDsKKwl2YWwgPSAqZmxhZzsKKwlQcmludChMIm5ldyB2YWx1ZSBpcyAweCUyeFxuIiwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY29uZmlnc3BhY2VfbWF0Y2hlc19pZHModm9pZCAqY29uZmlnLCB1aW50MzJfdCB2ZW5kb3JfaWQsCisJCQkJdWludDMyX3QgZGV2aWNlX2lkKQoreworCXVpbnQzMl90ICpjZmcgPSBjb25maWc7CisJaWYgKGNmZ1swXSA9PSB2ZW5kb3JfaWQgJiYgY2ZnWzFdID09IGRldmljZV9pZCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfZGV2aWNlKEVGSV9QQ0lfSU8gKnBjaWlvLCB1aW50MTZfdCB2ZW5kb3JfaWQsIHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwlscGNpZl90IGxwY2lmOworCUVGSV9TVEFUVVMgcmM7CisKKwlyYyA9IHVlZmlfY2FsbF93cmFwcGVyKHBjaWlvLT5QY2kuUmVhZCwgNSwgcGNpaW8sIEVmaVBjaUlvV2lkdGhVaW50MTYsIDAsIDIsICZscGNpZik7CisJaWYgKEVGSV9FUlJPUihyYykpCisJCXJldHVybiAwOworCisJaWYgKHZlbmRvcl9pZCA9PSBscGNpZi52ZW5kb3JfaWQgJiYgZGV2aWNlX2lkID09IGxwY2lmLmRldmljZV9pZCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBFRklfU1RBVFVTIGZpbmRfcGNpX2RldmljZSh1aW50MTZfdCB2ZW5kb3JfaWQsIHVpbnQxNl90IGRldmljZV9pZCwKKwkJCQlFRklfUENJX0lPICoqcGNpaW8pCit7CisJRUZJX1NUQVRVUyByYzsKKwlFRklfSEFORExFICpIYW5kbGVzOworCVVJTlROIE5vSGFuZGxlczsKKwlpbnQgaTsKKworCWlmICghcGNpaW8pCisJCXJldHVybiBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisKKwlyYyA9IExpYkxvY2F0ZUhhbmRsZShCeVByb3RvY29sLCAmUGNpSW9Qcm90b2NvbCwgTlVMTCwgJk5vSGFuZGxlcywKKwkJCSAgICAgJkhhbmRsZXMpOworCWlmIChFRklfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgTm9IYW5kbGVzOyBpKyspIHsKKwkJdm9pZCAqcGNpaW9fdG1wID0gTlVMTDsKKwkJcmMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+T3BlblByb3RvY29sLCA2LCBIYW5kbGVzW2ldLAorCQkJCSAgICAmUGNpSW9Qcm90b2NvbCwgJnBjaWlvX3RtcCwgSW1hZ2VIYW5kbGUsCisJCQkJICAgIE5VTEwsIEVGSV9PUEVOX1BST1RPQ09MX0dFVF9QUk9UT0NPTCk7CisJCWlmIChFRklfRVJST1IocmMpKQorCQkJY29udGludWU7CisJCSpwY2lpbyA9IHBjaWlvX3RtcDsKKwkJaWYgKCFpc19kZXZpY2UoKnBjaWlvLCB2ZW5kb3JfaWQsIGRldmljZV9pZCkpIHsKKwkJCSpwY2lpbyA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldHVybiBFRklfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIEVGSV9OT1RfRk9VTkQ7Cit9CisKK0VGSV9TVEFUVVMKK2VmaV9tYWluIChFRklfSEFORExFIGltYWdlX2hhbmRsZSwgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiKQoreworCUluaXRpYWxpemVMaWIoaW1hZ2VfaGFuZGxlLCBzeXN0YWIpOworCUVGSV9QQ0lfSU8gKnBjaWlvID0gTlVMTDsKKwlscGNpZl90IGxwY2lmOworCUVGSV9TVEFUVVMgcmM7CisJc3RydWN0IHsKKwkJdWludDE2X3QgdmVuZG9yOworCQl1aW50MTZfdCBkZXZpY2U7CisJfSBkZXZpY2VzW10gPSB7CisJCXsgVkVORE9SX0lEX0lOVEVMLCBERVZJQ0VfSURfTFBDSUYgfSwKKwkJeyBWRU5ET1JfSURfSU5URUwsIERFVklDRV9JRF9DT1VHQVJQT0lOVF9MUENJRiB9LAorCQl7IDAsIDAgfQorCX07CisJaW50IGk7CisKKwlJbWFnZUhhbmRsZSA9IGltYWdlX2hhbmRsZTsKKwlmb3IgKGkgPSAwOyBkZXZpY2VzW2ldLnZlbmRvciAhPSAwOyBpKyspIHsKKwkJcmMgPSBmaW5kX3BjaV9kZXZpY2UoZGV2aWNlc1tpXS52ZW5kb3IsIGRldmljZXNbaV0uZGV2aWNlLCAmcGNpaW8pOworCQlpZiAoRUZJX0VSUk9SKHJjKSkKKwkJCWNvbnRpbnVlOworCX0KKworCWlmIChyYyA9PSBFRklfTk9UX0ZPVU5EKSB7CisJCVByaW50KEwiRGV2aWNlIG5vdCBmb3VuZC5cbiIpOworCQlyZXR1cm4gcmM7CisJfSBlbHNlIGlmIChFRklfRVJST1IocmMpKSB7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHVlZmlfY2FsbF93cmFwcGVyKHBjaWlvLT5QY2kuUmVhZCwgNSwgcGNpaW8sIEVmaVBjaUlvV2lkdGhVaW50MzIsCisJCUVGSV9GSUVMRF9PRkZTRVQobHBjaWZfdCwgcmNiYSksIDEsICZscGNpZi5yY2JhKTsKKwlpZiAoRUZJX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCWlmICghKGxwY2lmLnJjYmEgJiAxKSkgeworCQlQcmludChMInJjcmIgaXMgbm90IG1hcHBlZCwgY2Fubm90IHJvdXRlIHBvcnQgODBoXG4iKTsKKwkJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKKwl9CisJbHBjaWYucmNiYSAmPSB+MVVMOworCisJUHJpbnQoTCJyY2JhOiAweCU4eFxuIiwgbHBjaWYucmNiYSwgbHBjaWYucmNiYSk7CisJc2V0X2JpdCgodWludDMyX3QgKikodWludDY0X3QpKGxwY2lmLnJjYmEgKyBHQ1NfT0ZGU0VUX0FERFIpLAorCQkgICAgIEdDU19SUFJfU0hJRlQsIEdDU19SUFJfUENJKTsKKworCXJldHVybiBFRklfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy90LmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTNkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdC5jCkBAIC0wLDAgKzEsMjcgQEAKKyNpbmNsdWRlIDxlZmkuaD4KKyNpbmNsdWRlIDxlZmlsaWIuaD4KKworc3RhdGljIENIQVIxNiAqCithMnUgKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgQ0hBUjE2IG1lbVsyMDQ4XTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHN0cltpXTsgKytpKQorCQltZW1baV0gPSAoQ0hBUjE2KSBzdHJbaV07CisJbWVtW2ldID0gMDsKKwlyZXR1cm4gbWVtOworfQorCitFRklfU1RBVFVTCitlZmlfbWFpbiAoRUZJX0hBTkRMRSBpbWFnZV9oYW5kbGUsIEVGSV9TWVNURU1fVEFCTEUgKnN5c3RhYikKK3sKKwlTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICpjb25vdXQ7CisKKwlJbml0aWFsaXplTGliKGltYWdlX2hhbmRsZSwgc3lzdGFiKTsKKwljb25vdXQgPSBzeXN0YWItPkNvbk91dDsKKwl1ZWZpX2NhbGxfd3JhcHBlcihjb25vdXQtPk91dHB1dFN0cmluZywgMiwgY29ub3V0LCAoQ0hBUjE2ICopTCJIZWxsbyBXb3JsZCFcblxyIik7CisJdWVmaV9jYWxsX3dyYXBwZXIoY29ub3V0LT5PdXRwdXRTdHJpbmcsIDIsIGNvbm91dCwgYTJ1KCJIZWxsbyBXb3JsZCFcblxyIikpOworCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3QyLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTVkMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3QyLmMKQEAgLTAsMCArMSwxMyBAQAorI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorCitFRklfU1RBVFVTCitlZmlfbWFpbiAoRUZJX0hBTkRMRSBpbWFnZSwgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiKQoreworCVNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgKmNvbm91dDsKKworCWNvbm91dCA9IHN5c3RhYi0+Q29uT3V0OworCXVlZmlfY2FsbF93cmFwcGVyKGNvbm91dC0+T3V0cHV0U3RyaW5nLCAyLCBjb25vdXQsIEwiSGVsbG8gV29ybGQhXG5cciIpOworCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3QzLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjM4MzBhCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3QzLmMKQEAgLTAsMCArMSw5NSBAQAorI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorCitFRklfU1RBVFVTCitlZmlfbWFpbigKKwlFRklfSEFORExFIGltYWdlX2hhbmRsZSwKKwlFRklfU1lTVEVNX1RBQkxFICpzeXN0YWIKKykKK3sKKwlFRklfR1VJRCBsb2FkZWRfaW1hZ2VfcHJvdG9jb2wgPSBMT0FERURfSU1BR0VfUFJPVE9DT0w7CisJRUZJX1NUQVRVUyBlZmlfc3RhdHVzOworCUVGSV9MT0FERURfSU1BR0UgKmxpOworCVVJTlROIHBhdCA9IFBvb2xBbGxvY2F0aW9uVHlwZTsKKwlWT0lEICp2b2lkX2xpX3A7CisKKwlJbml0aWFsaXplTGliKGltYWdlX2hhbmRsZSwgc3lzdGFiKTsKKwlQb29sQWxsb2NhdGlvblR5cGUgPSAyOyAvKiBrbG9vaiAqLworCisJUHJpbnQoTCJIZWxsbyBXb3JsZCEgKDB4ZD0weCV4LCAxMz0lZClcbiIsIDEzLCAxMyk7CisKKwlQcmludChMImJlZm9yZSBJbml0aWFsaXplTGliKCk6IFBvb2xBbGxvY2F0aW9uVHlwZT0lZFxuIiwKKwkJcGF0KTsKKworCVByaW50KEwiIGFmdGVyIEluaXRpYWxpemVMaWIoKTogUG9vbEFsbG9jYXRpb25UeXBlPSVkXG4iLAorCQlQb29sQWxsb2NhdGlvblR5cGUpOworCisJLyoKKwkgKiBMb2NhdGUgbG9hZGVkX2ltYWdlX2hhbmRsZSBpbnN0YW5jZS4KKwkgKi8KKworCVByaW50KEwiQlMtPkhhbmRsZVByb3RvY29sKCkgICIpOworCisJZWZpX3N0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKAorCQlCUy0+SGFuZGxlUHJvdG9jb2wsCisJCTMsCisJCWltYWdlX2hhbmRsZSwKKwkJJmxvYWRlZF9pbWFnZV9wcm90b2NvbCwKKwkJJnZvaWRfbGlfcCk7CisJbGkgPSB2b2lkX2xpX3A7CisKKwlQcmludChMIiV4aCAoJXIpXG4iLCBlZmlfc3RhdHVzLCBlZmlfc3RhdHVzKTsKKworCWlmIChlZmlfc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCXJldHVybiBlZmlfc3RhdHVzOworCX0KKworCVByaW50KEwiICBsaTogJXhoXG4iLCBsaSk7CisKKwlpZiAoIWxpKSB7CisJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CisJfQorCisJUHJpbnQoTCIgIGxpLT5SZXZpc2lvbjogICAgICAgICV4aFxuIiwgbGktPlJldmlzaW9uKTsKKwlQcmludChMIiAgbGktPlBhcmVudEhhbmRsZTogICAgJXhoXG4iLCBsaS0+UGFyZW50SGFuZGxlKTsKKwlQcmludChMIiAgbGktPlN5c3RlbVRhYmxlOiAgICAgJXhoXG4iLCBsaS0+U3lzdGVtVGFibGUpOworCVByaW50KEwiICBsaS0+RGV2aWNlSGFuZGxlOiAgICAleGhcbiIsIGxpLT5EZXZpY2VIYW5kbGUpOworCVByaW50KEwiICBsaS0+RmlsZVBhdGg6ICAgICAgICAleGhcbiIsIGxpLT5GaWxlUGF0aCk7CisJUHJpbnQoTCIgIGxpLT5SZXNlcnZlZDogICAgICAgICV4aFxuIiwgbGktPlJlc2VydmVkKTsKKwlQcmludChMIiAgbGktPkxvYWRPcHRpb25zU2l6ZTogJXhoXG4iLCBsaS0+TG9hZE9wdGlvbnNTaXplKTsKKwlQcmludChMIiAgbGktPkxvYWRPcHRpb25zOiAgICAgJXhoXG4iLCBsaS0+TG9hZE9wdGlvbnMpOworCVByaW50KEwiICBsaS0+SW1hZ2VCYXNlOiAgICAgICAleGhcbiIsIGxpLT5JbWFnZUJhc2UpOworCVByaW50KEwiICBsaS0+SW1hZ2VTaXplOiAgICAgICAleGhcbiIsIGxpLT5JbWFnZVNpemUpOworCVByaW50KEwiICBsaS0+SW1hZ2VDb2RlVHlwZTogICAleGhcbiIsIGxpLT5JbWFnZUNvZGVUeXBlKTsKKwlQcmludChMIiAgbGktPkltYWdlRGF0YVR5cGU6ICAgJXhoXG4iLCBsaS0+SW1hZ2VEYXRhVHlwZSk7CisJUHJpbnQoTCIgIGxpLT5VbmxvYWQ6ICAgICAgICAgICV4aFxuIiwgbGktPlVubG9hZCk7CisKKyNpZiAwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgIFBhcmVudEhhbmRsZTsKKyAgICBzdHJ1Y3QgX0VGSV9TWVNURU1fVEFCTEUgICAgICAgICpTeXN0ZW1UYWJsZTsKKworICAgIC8vIFNvdXJjZSBsb2NhdGlvbiBvZiBpbWFnZQorICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSGFuZGxlOworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgKkZpbGVQYXRoOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlJlc2VydmVkOworCisgICAgLy8gSW1hZ2VzIGxvYWQgb3B0aW9ucworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZE9wdGlvbnNTaXplOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxvYWRPcHRpb25zOworCisgICAgLy8gTG9jYXRpb24gb2Ygd2hlcmUgaW1hZ2Ugd2FzIGxvYWRlZAorICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkltYWdlQmFzZTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlU2l6ZTsKKyAgICBFRklfTUVNT1JZX1RZUEUgICAgICAgICAgICAgICAgIEltYWdlQ29kZVR5cGU7CisgICAgRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgICAgICBJbWFnZURhdGFUeXBlOworCisgICAgLy8gSWYgdGhlIGRyaXZlciBpbWFnZSBzdXBwb3J0cyBhIGR5bmFtaWMgdW5sb2FkIHJlcXVlc3QKKyAgICBFRklfSU1BR0VfVU5MT0FEICAgICAgICAgICAgICAgIFVubG9hZDsKKworfSBFRklfTE9BREVEX0lNQUdFOworI2VuZGlmCisKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdDQuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy90NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDA0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdDQuYwpAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8ZWZpbGliLmg+CisKK0VGSV9TVEFUVVMKK2VmaV9tYWluIChFRklfSEFORExFICppbWFnZSwgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiKQoreworCVVJTlROIGluZGV4OworCisJdWVmaV9jYWxsX3dyYXBwZXIoc3lzdGFiLT5Db25PdXQtPk91dHB1dFN0cmluZywgMiwgc3lzdGFiLT5Db25PdXQsIEwiSGVsbG8gYXBwbGljYXRpb24gc3RhcnRlZFxyXG4iKTsKKwl1ZWZpX2NhbGxfd3JhcHBlcihzeXN0YWItPkNvbk91dC0+T3V0cHV0U3RyaW5nLCAyLCBzeXN0YWItPkNvbk91dCwgTCJcclxuXHJcblxyXG5IaXQgYW55IGtleSB0byBleGl0XHJcbiIpOworCXVlZmlfY2FsbF93cmFwcGVyKHN5c3RhYi0+Qm9vdFNlcnZpY2VzLT5XYWl0Rm9yRXZlbnQsIDMsIDEsICZzeXN0YWItPkNvbkluLT5XYWl0Rm9yS2V5LCAmaW5kZXgpOworCXJldHVybiBFRklfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy90NS5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3Q1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4NjhkMgotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy90NS5jCkBAIC0wLDAgKzEsMTMgQEAKKyNpbmNsdWRlIDxlZmkuaD4KKyNpbmNsdWRlIDxlZmlsaWIuaD4KKworRUZJX1NUQVRVUworZWZpX21haW4gKEVGSV9IQU5ETEUgaW1hZ2UsIEVGSV9TWVNURU1fVEFCTEUgKnN5c3RhYikKK3sKKwlJbml0aWFsaXplTGliKGltYWdlLCBzeXN0YWIpOworCVByaW50KEwiSGVsbG9MaWIgYXBwbGljYXRpb24gc3RhcnRlZFxuIik7CisJUHJpbnQoTCJcblxuXG5IaXQgYW55IGtleSB0byBleGl0IHRoaXMgaW1hZ2VcbiIpOworCVdhaXRGb3JTaW5nbGVFdmVudChTVC0+Q29uSW4tPldhaXRGb3JLZXksIDApOworCXVlZmlfY2FsbF93cmFwcGVyKFNULT5Db25PdXQtPk91dHB1dFN0cmluZywgMiwgU1QtPkNvbk91dCwgTCJcblxuIik7CisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3Q2LmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTVlYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3Q2LmMKQEAgLTAsMCArMSw0MyBAQAorI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorCit0eXBlZGVmIEVGSV9TVEFUVVMgKCpmb29fdCkoRUZJX0hBTkRMRSwgRUZJX0dVSUQgKiwgVk9JRCAqKik7Cit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgZ3A7Cit9IGZkZXNjX3Q7CisKK0VGSV9MT0FERURfSU1BR0UgbXlfbG9hZGVkOworCitFRklfU1RBVFVTCitlZmlfbWFpbiAoRUZJX0hBTkRMRSBpbWFnZSwgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiKQoreworCUVGSV9MT0FERURfSU1BR0UgKmxvYWRlZF9pbWFnZSA9IE5VTEw7CisjaWYgMAorCUVGSV9ERVZJQ0VfUEFUSCAqZGV2X3BhdGg7CisjZW5kaWYKKwlFRklfU1RBVFVTIHN0YXR1czsKKworCUluaXRpYWxpemVMaWIoaW1hZ2UsIHN5c3RhYik7CisJc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoc3lzdGFiLT5Cb290U2VydmljZXMtPkhhbmRsZVByb3RvY29sLAorCQkJCTMsCisJCQkJaW1hZ2UsIAorCQkJCSZMb2FkZWRJbWFnZVByb3RvY29sLCAKKwkJCQkodm9pZCAqKikgJmxvYWRlZF9pbWFnZSk7CisJaWYgKEVGSV9FUlJPUihzdGF0dXMpKSB7CisJCVByaW50KEwiaGFuZGxlcHJvdG9jb2w6ICVyXG4iLCBzdGF0dXMpOworCX0KKworI2lmIDAKKwlCUy0+SGFuZGxlUHJvdG9jb2wobG9hZGVkX2ltYWdlLT5EZXZpY2VIYW5kbGUsICZEZXZpY2VQYXRoUHJvdG9jb2wsICh2b2lkICoqKSAmZGV2X3BhdGgpOworCisJUHJpbnQoTCJJbWFnZSBkZXZpY2UgICAgICA6ICVzXG4iLCBEZXZpY2VQYXRoVG9TdHIoZGV2X3BhdGgpKTsKKwlQcmludChMIkltYWdlIGZpbGUgICAgICAgIDogJXNcbiIsIERldmljZVBhdGhUb1N0cihsb2FkZWRfaW1hZ2UtPkZpbGVQYXRoKSk7CisjZW5kaWYKKwlQcmludChMIkltYWdlIGJhc2UgICAgICAgIDogJWx4XG4iLCBsb2FkZWRfaW1hZ2UtPkltYWdlQmFzZSk7CisJUHJpbnQoTCJJbWFnZSBzaXplICAgICAgICA6ICVseFxuIiwgbG9hZGVkX2ltYWdlLT5JbWFnZVNpemUpOworCVByaW50KEwiTG9hZCBvcHRpb25zIHNpemUgOiAlbHhcbiIsIGxvYWRlZF9pbWFnZS0+TG9hZE9wdGlvbnNTaXplKTsKKwlQcmludChMIkxvYWQgb3B0aW9ucyAgICAgIDogJXNcbiIsIGxvYWRlZF9pbWFnZS0+TG9hZE9wdGlvbnMpOworCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3Q3LmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdDcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRmODE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3Q3LmMKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorCitFRklfU1RBVFVTCitlZmlfbWFpbiAoRUZJX0hBTkRMRSBpbWFnZSwgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiKQoreworCUVGSV9JTlBVVF9LRVkgZWZpX2lucHV0X2tleTsKKwlFRklfU1RBVFVTIGVmaV9zdGF0dXM7CisKKwlJbml0aWFsaXplTGliKGltYWdlLCBzeXN0YWIpOworCisJUHJpbnQoTCJIZWxsb0xpYiBhcHBsaWNhdGlvbiBzdGFydGVkXG4iKTsKKworCVByaW50KEwiXG5cblxuSGl0IGFueSBrZXkgdG8gZXhpdCB0aGlzIGltYWdlXG4iKTsKKwlXYWl0Rm9yU2luZ2xlRXZlbnQoU1QtPkNvbkluLT5XYWl0Rm9yS2V5LCAwKTsKKworCXVlZmlfY2FsbF93cmFwcGVyKFNULT5Db25PdXQtPk91dHB1dFN0cmluZywgMiwgU1QtPkNvbk91dCwgTCJcblxuIik7CisKKwllZmlfc3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoU1QtPkNvbkluLT5SZWFkS2V5U3Ryb2tlLCAyLCBTVC0+Q29uSW4sICZlZmlfaW5wdXRfa2V5KTsKKworCVByaW50KEwiU2NhbkNvZGU6ICV4aCAgVW5pY29kZUNoYXI6ICV4aFxuIiwKKwkJZWZpX2lucHV0X2tleS5TY2FuQ29kZSwgZWZpX2lucHV0X2tleS5Vbmljb2RlQ2hhcik7CisKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdGNjLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdGNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4NGE5OQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy90Y2MuYwpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIFRlc3QgaWYgb3VyIGNhbGxpbmcgY29udmVudGlvbiBneW1uYXN0aWNzIGFjdHVhbGx5IHdvcmsKKyAqLworCisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8ZWZpbGliLmg+CisKKyNpZmRlZiBfX3g4Nl82NF9fCisjaW5jbHVkZSA8eDg2XzY0L3BlLmg+CisjaW5jbHVkZSA8eDg2XzY0L2VmaWJpbmQuaD4KKyNlbmRpZgorCisjaWYgMAorCWFzbSB2b2xhdGlsZSgib3V0ICUwLCUxIiA6IDogImEiICgodWludDhfdClhKSwgImROIiAoMHg4MCkpOworCitleHRlcm4gdm9pZCBkdW1wX3N0YWNrKHZvaWQpOworYXNtKAkiLmdsb2JsCWR1bXBfc3RhY2tcbiIKKwkiZHVtcF9zdGFjazpcbiIKKwkiCW1vdnEgJXJzcCwgJXJkaVxuIgorCSIJam1wICpkdW1wX3N0YWNrX2hlbHBlckBHT1RQQ1JFTCglcmlwKVxuIgorCSIuc2l6ZQlkdW1wX3N0YWNrLCAuLWR1bXBfc3RhY2siKTsKKwordm9pZCBkdW1wX3N0YWNrX2hlbHBlcih1aW50NjRfdCByc3BfdmFsKQoreworCXVpbnQ2NF90ICpyc3AgPSAodWludDY0X3QgKilyc3BfdmFsOworCWludCB4OworCisJUHJpbnQoTCIlJXJzcDogMHglMDh4JTA4eCBzdGFjazpcclxuIiwKKwkJCQkJKHJzcF92YWwgJiAweGZmZmZmZmZmMDAwMDAwMDApID4+MzIsCisJCQkJCSByc3BfdmFsICYgMHhmZmZmZmZmZik7CisJZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgeworCQlQcmludChMIiUwOHg6ICIsICgodWludDY0X3QpcnNwKSAmIDB4ZmZmZmZmZmYpOworCQlQcmludChMIiUwMTZ4ICIsICpyc3ArKyk7CisJCVByaW50KEwiJTAxNnggIiwgKnJzcCsrKTsKKwkJUHJpbnQoTCIlMDE2eCAiLCAqcnNwKyspOworCQlQcmludChMIiUwMTZ4XHJcbiIsICpyc3ArKyk7CisJfQorfQorI2VuZGlmCisKK0VGSV9TVEFUVVMgRUZJX0ZVTkNUSU9OIHRlc3RfZmFpbHVyZV9jYWxsYmFjayh2b2lkKQoreworCXJldHVybiBFRklfVU5TVVBQT1JURUQ7Cit9CisKK0VGSV9TVEFUVVMgdGVzdF9mYWlsdXJlKHZvaWQpCit7CisJcmV0dXJuIHVlZmlfY2FsbF93cmFwcGVyKHRlc3RfZmFpbHVyZV9jYWxsYmFjaywgMCk7Cit9CisKK0VGSV9TVEFUVVMgRUZJX0ZVTkNUSU9OIHRlc3RfY2FsbDBfY2FsbGJhY2sodm9pZCkKK3sKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisKK0VGSV9TVEFUVVMgdGVzdF9jYWxsMCh2b2lkKQoreworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcih0ZXN0X2NhbGwwX2NhbGxiYWNrLCAwKTsKK30KKworRUZJX1NUQVRVUyBFRklfRlVOQ1RJT04gdGVzdF9jYWxsMV9jYWxsYmFjayhVSU5UMzIgYSkKK3sKKwlpZiAoYSAhPSAweDEyMzQ1Njc4KSB7CisJCXJldHVybiBFRklfTE9BRF9FUlJPUjsKKwl9CisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCitFRklfU1RBVFVTIHRlc3RfY2FsbDEodm9pZCkKK3sKKwlyZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIodGVzdF9jYWxsMV9jYWxsYmFjaywgMSwweDEyMzQ1Njc4KTsKK30KKworRUZJX1NUQVRVUyBFRklfRlVOQ1RJT04gdGVzdF9jYWxsMl9jYWxsYmFjayhVSU5UMzIgYSwgVUlOVDMyIGIpCit7CisJaWYgKGEgIT0gMHgxMjM0NTY3OCkgeworCQlyZXR1cm4gRUZJX0xPQURfRVJST1I7CisJfQorCWlmIChiICE9IDB4MjM0NTY3ODkpIHsKKwkJcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCitFRklfU1RBVFVTIHRlc3RfY2FsbDIodm9pZCkKK3sKKwlyZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIodGVzdF9jYWxsMl9jYWxsYmFjaywgMiwKKwkJMHgxMjM0NTY3OCwgMHgyMzQ1Njc4OSk7Cit9CisKK0VGSV9TVEFUVVMgRUZJX0ZVTkNUSU9OIHRlc3RfY2FsbDNfY2FsbGJhY2soVUlOVDMyIGEsIFVJTlQzMiBiLAorCVVJTlQzMiBjKQoreworCWlmIChhICE9IDB4MTIzNDU2NzgpCisJCXJldHVybiBFRklfTE9BRF9FUlJPUjsKKwlpZiAoYiAhPSAweDIzNDU2Nzg5KQorCQlyZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOworCWlmIChjICE9IDB4MzQ1Njc4OWEpCisJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCitFRklfU1RBVFVTIHRlc3RfY2FsbDModm9pZCkKK3sKKwlyZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIodGVzdF9jYWxsM19jYWxsYmFjaywgMywKKwkJMHgxMjM0NTY3OCwgMHgyMzQ1Njc4OSwgMHgzNDU2Nzg5YSk7Cit9CisKK0VGSV9TVEFUVVMgRUZJX0ZVTkNUSU9OIHRlc3RfY2FsbDRfY2FsbGJhY2soVUlOVDMyIGEsIFVJTlQzMiBiLAorCVVJTlQzMiBjLCBVSU5UMzIgZCkKK3sKKwlpZiAoYSAhPSAweDEyMzQ1Njc4KQorCQlyZXR1cm4gRUZJX0xPQURfRVJST1I7CisJaWYgKGIgIT0gMHgyMzQ1Njc4OSkKKwkJcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKwlpZiAoYyAhPSAweDM0NTY3ODlhKQorCQlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOworCWlmIChkICE9IDB4NDU2Nzg5YWIpCisJCXJldHVybiBFRklfQkFEX0JVRkZFUl9TSVpFOworCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCitFRklfU1RBVFVTIHRlc3RfY2FsbDQodm9pZCkKK3sKKwlyZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIodGVzdF9jYWxsNF9jYWxsYmFjaywgNCwKKwkJMHgxMjM0NTY3OCwgMHgyMzQ1Njc4OSwgMHgzNDU2Nzg5YSwgMHg0NTY3ODlhYik7Cit9CisKK0VGSV9TVEFUVVMgRUZJX0ZVTkNUSU9OIHRlc3RfY2FsbDVfY2FsbGJhY2soVUlOVDMyIGEsIFVJTlQzMiBiLAorCVVJTlQzMiBjLCBVSU5UMzIgZCwgVUlOVDMyIGUpCit7CisJaWYgKGEgIT0gMHgxMjM0NTY3OCkKKwkJcmV0dXJuIEVGSV9MT0FEX0VSUk9SOworCWlmIChiICE9IDB4MjM0NTY3ODkpCisJCXJldHVybiBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisJaWYgKGMgIT0gMHgzNDU2Nzg5YSkKKwkJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKKwlpZiAoZCAhPSAweDQ1Njc4OWFiKQorCQlyZXR1cm4gRUZJX0JBRF9CVUZGRVJfU0laRTsKKwlpZiAoZSAhPSAweDU2Nzg5YWJjKQorCQlyZXR1cm4gRUZJX0JVRkZFUl9UT09fU01BTEw7CisKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisKK0VGSV9TVEFUVVMgdGVzdF9jYWxsNSh2b2lkKQoreworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcih0ZXN0X2NhbGw1X2NhbGxiYWNrLCA1LAorCQkweDEyMzQ1Njc4LCAweDIzNDU2Nzg5LCAweDM0NTY3ODlhLCAweDQ1Njc4OWFiLCAweDU2Nzg5YWJjKTsKK30KKworRUZJX1NUQVRVUyBFRklfRlVOQ1RJT04gdGVzdF9jYWxsNl9jYWxsYmFjayhVSU5UMzIgYSwgVUlOVDMyIGIsCisJVUlOVDMyIGMsIFVJTlQzMiBkLCBVSU5UMzIgZSwgVUlOVDMyIGYpCit7CisJaWYgKGEgIT0gMHgxMjM0NTY3OCkKKwkJcmV0dXJuIEVGSV9MT0FEX0VSUk9SOworCWlmIChiICE9IDB4MjM0NTY3ODkpCisJCXJldHVybiBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisJaWYgKGMgIT0gMHgzNDU2Nzg5YSkKKwkJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKKwlpZiAoZCAhPSAweDQ1Njc4OWFiKQorCQlyZXR1cm4gRUZJX0JBRF9CVUZGRVJfU0laRTsKKwlpZiAoZSAhPSAweDU2Nzg5YWJjKQorCQlyZXR1cm4gRUZJX0JVRkZFUl9UT09fU01BTEw7CisJaWYgKGYgIT0gMHg2Nzg5YWJjZCkKKwkJcmV0dXJuIEVGSV9OT1RfUkVBRFk7CisKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisKK0VGSV9TVEFUVVMgdGVzdF9jYWxsNih2b2lkKQoreworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcih0ZXN0X2NhbGw2X2NhbGxiYWNrLCA2LAorCQkweDEyMzQ1Njc4LCAweDIzNDU2Nzg5LCAweDM0NTY3ODlhLCAweDQ1Njc4OWFiLCAweDU2Nzg5YWJjLAorCQkweDY3ODlhYmNkKTsKK30KKworRUZJX1NUQVRVUyBFRklfRlVOQ1RJT04gdGVzdF9jYWxsN19jYWxsYmFjayhVSU5UMzIgYSwgVUlOVDMyIGIsCisJVUlOVDMyIGMsIFVJTlQzMiBkLCBVSU5UMzIgZSwgVUlOVDMyIGYsIFVJTlQzMiBnKQoreworCWlmIChhICE9IDB4MTIzNDU2NzgpCisJCXJldHVybiBFRklfTE9BRF9FUlJPUjsKKwlpZiAoYiAhPSAweDIzNDU2Nzg5KQorCQlyZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOworCWlmIChjICE9IDB4MzQ1Njc4OWEpCisJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CisJaWYgKGQgIT0gMHg0NTY3ODlhYikKKwkJcmV0dXJuIEVGSV9CQURfQlVGRkVSX1NJWkU7CisJaWYgKGUgIT0gMHg1Njc4OWFiYykKKwkJcmV0dXJuIEVGSV9CVUZGRVJfVE9PX1NNQUxMOworCWlmIChmICE9IDB4Njc4OWFiY2QpCisJCXJldHVybiBFRklfTk9UX1JFQURZOworCWlmIChnICE9IDB4Nzg5YWJjZGUpCisJCXJldHVybiBFRklfREVWSUNFX0VSUk9SOworCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCitFRklfU1RBVFVTIHRlc3RfY2FsbDcodm9pZCkKK3sKKwlyZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIodGVzdF9jYWxsN19jYWxsYmFjaywgNywKKwkJMHgxMjM0NTY3OCwgMHgyMzQ1Njc4OSwgMHgzNDU2Nzg5YSwgMHg0NTY3ODlhYiwKKwkJMHg1Njc4OWFiYywgMHg2Nzg5YWJjZCwgMHg3ODlhYmNkZSk7Cit9CisKK0VGSV9TVEFUVVMgRUZJX0ZVTkNUSU9OIHRlc3RfY2FsbDhfY2FsbGJhY2soVUlOVDMyIGEsIFVJTlQzMiBiLAorCVVJTlQzMiBjLCBVSU5UMzIgZCwgVUlOVDMyIGUsIFVJTlQzMiBmLCBVSU5UMzIgZywgVUlOVDMyIGgpCit7CisJaWYgKGEgIT0gMHgxMjM0NTY3OCkKKwkJcmV0dXJuIEVGSV9MT0FEX0VSUk9SOworCWlmIChiICE9IDB4MjM0NTY3ODkpCisJCXJldHVybiBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisJaWYgKGMgIT0gMHgzNDU2Nzg5YSkKKwkJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKKwlpZiAoZCAhPSAweDQ1Njc4OWFiKQorCQlyZXR1cm4gRUZJX0JBRF9CVUZGRVJfU0laRTsKKwlpZiAoZSAhPSAweDU2Nzg5YWJjKQorCQlyZXR1cm4gRUZJX0JVRkZFUl9UT09fU01BTEw7CisJaWYgKGYgIT0gMHg2Nzg5YWJjZCkKKwkJcmV0dXJuIEVGSV9OT1RfUkVBRFk7CisJaWYgKGcgIT0gMHg3ODlhYmNkZSkKKwkJcmV0dXJuIEVGSV9ERVZJQ0VfRVJST1I7CisJaWYgKGggIT0gMHg4OWFiY2RlZikKKwkJcmV0dXJuIEVGSV9XUklURV9QUk9URUNURUQ7CisKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisKK0VGSV9TVEFUVVMgdGVzdF9jYWxsOCh2b2lkKQoreworCXJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcih0ZXN0X2NhbGw4X2NhbGxiYWNrLCA4LAorCQkweDEyMzQ1Njc4LAorCQkweDIzNDU2Nzg5LAorCQkweDM0NTY3ODlhLAorCQkweDQ1Njc4OWFiLAorCQkweDU2Nzg5YWJjLAorCQkweDY3ODlhYmNkLAorCQkweDc4OWFiY2RlLAorCQkweDg5YWJjZGVmKTsKK30KKworRUZJX1NUQVRVUyBFRklfRlVOQ1RJT04gdGVzdF9jYWxsOV9jYWxsYmFjayhVSU5UMzIgYSwgVUlOVDMyIGIsCisJVUlOVDMyIGMsIFVJTlQzMiBkLCBVSU5UMzIgZSwgVUlOVDMyIGYsIFVJTlQzMiBnLCBVSU5UMzIgaCwgVUlOVDMyIGkpCit7CisJaWYgKGEgIT0gMHgxMjM0NTY3OCkKKwkJcmV0dXJuIEVGSV9MT0FEX0VSUk9SOworCWlmIChiICE9IDB4MjM0NTY3ODkpCisJCXJldHVybiBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisJaWYgKGMgIT0gMHgzNDU2Nzg5YSkKKwkJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKKwlpZiAoZCAhPSAweDQ1Njc4OWFiKQorCQlyZXR1cm4gRUZJX0JBRF9CVUZGRVJfU0laRTsKKwlpZiAoZSAhPSAweDU2Nzg5YWJjKQorCQlyZXR1cm4gRUZJX0JVRkZFUl9UT09fU01BTEw7CisJaWYgKGYgIT0gMHg2Nzg5YWJjZCkKKwkJcmV0dXJuIEVGSV9OT1RfUkVBRFk7CisJaWYgKGcgIT0gMHg3ODlhYmNkZSkKKwkJcmV0dXJuIEVGSV9ERVZJQ0VfRVJST1I7CisJaWYgKGggIT0gMHg4OWFiY2RlZikKKwkJcmV0dXJuIEVGSV9XUklURV9QUk9URUNURUQ7CisJaWYgKGkgIT0gMHg5YWJjZGVmMCkKKwkJcmV0dXJuIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTOworCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCitFRklfU1RBVFVTIHRlc3RfY2FsbDkodm9pZCkKK3sKKwlyZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIodGVzdF9jYWxsOV9jYWxsYmFjaywgOSwKKwkJMHgxMjM0NTY3OCwKKwkJMHgyMzQ1Njc4OSwKKwkJMHgzNDU2Nzg5YSwKKwkJMHg0NTY3ODlhYiwKKwkJMHg1Njc4OWFiYywKKwkJMHg2Nzg5YWJjZCwKKwkJMHg3ODlhYmNkZSwKKwkJMHg4OWFiY2RlZiwKKwkJMHg5YWJjZGVmMCk7Cit9CisKK2V4dGVybiBFRklfU1RBVFVTIHRlc3RfY2FsbDEwKHZvaWQpOworRUZJX1NUQVRVUyBFRklfRlVOQ1RJT04gdGVzdF9jYWxsMTBfY2FsbGJhY2soVUlOVDMyIGEsIFVJTlQzMiBiLAorCVVJTlQzMiBjLCBVSU5UMzIgZCwgVUlOVDMyIGUsIFVJTlQzMiBmLCBVSU5UMzIgZywgVUlOVDMyIGgsIFVJTlQzMiBpLAorCVVJTlQzMiBqKQoreworCWlmIChhICE9IDB4MTIzNDU2NzgpCisJCXJldHVybiBFRklfTE9BRF9FUlJPUjsKKwlpZiAoYiAhPSAweDIzNDU2Nzg5KQorCQlyZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOworCWlmIChjICE9IDB4MzQ1Njc4OWEpCisJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CisJaWYgKGQgIT0gMHg0NTY3ODlhYikKKwkJcmV0dXJuIEVGSV9CQURfQlVGRkVSX1NJWkU7CisJaWYgKGUgIT0gMHg1Njc4OWFiYykKKwkJcmV0dXJuIEVGSV9CVUZGRVJfVE9PX1NNQUxMOworCWlmIChmICE9IDB4Njc4OWFiY2QpCisJCXJldHVybiBFRklfTk9UX1JFQURZOworCWlmIChnICE9IDB4Nzg5YWJjZGUpCisJCXJldHVybiBFRklfREVWSUNFX0VSUk9SOworCWlmIChoICE9IDB4ODlhYmNkZWYpCisJCXJldHVybiBFRklfV1JJVEVfUFJPVEVDVEVEOworCWlmIChpICE9IDB4OWFiY2RlZjApCisJCXJldHVybiBFRklfT1VUX09GX1JFU09VUkNFUzsKKwlpZiAoaiAhPSAweGFiY2RlZjAxKQorCQlyZXR1cm4gRUZJX1ZPTFVNRV9DT1JSVVBURUQ7CisKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisKK0VGSV9TVEFUVVMgdGVzdF9jYWxsMTAodm9pZCkKK3sKKwlyZXR1cm4gdWVmaV9jYWxsX3dyYXBwZXIodGVzdF9jYWxsMTBfY2FsbGJhY2ssIDEwLAorCQkweDEyMzQ1Njc4LAorCQkweDIzNDU2Nzg5LAorCQkweDM0NTY3ODlhLAorCQkweDQ1Njc4OWFiLAorCQkweDU2Nzg5YWJjLAorCQkweDY3ODlhYmNkLAorCQkweDc4OWFiY2RlLAorCQkweDg5YWJjZGVmLAorCQkweDlhYmNkZWYwLAorCQkweGFiY2RlZjAxKTsKK30KKworRUZJX1NUQVRVUworZWZpX21haW4gKEVGSV9IQU5ETEUgKmltYWdlLCBFRklfU1lTVEVNX1RBQkxFICpzeXN0YWIpCit7CisJRUZJX1NUQVRVUyByYyA9IEVGSV9TVUNDRVNTOworCisJSW5pdGlhbGl6ZUxpYihpbWFnZSwgc3lzdGFiKTsKKwlQb29sQWxsb2NhdGlvblR5cGUgPSAyOyAvKiBrbG9vaiAqLworCisjaWZuZGVmIF9feDg2XzY0X18KKwl1ZWZpX2NhbGxfd3JhcHBlcihzeXN0YWItPkNvbk91dC0+T3V0cHV0U3RyaW5nLCAyLCBzeXN0YWItPkNvbk91dCwKKwkJTCJUaGlzIHRlc3QgaXMgb25seSB2YWxpZCBvbiB4ODZfNjRcbiIpOworCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CisjZW5kaWYKKworCV9fYXNtX18gdm9sYXRpbGUoIm91dCAlMCwlMSIgOiA6ICJhIiAoKHVpbnQ4X3QpMHgxNCksICJkTiIgKDB4ODApKTsKKworCVByaW50KEwiSGVsbG9cclxuIik7CisJcmMgPSB0ZXN0X2ZhaWx1cmUoKTsKKwlpZiAoRUZJX0VSUk9SKHJjKSkgeworCQlQcmludChMIlJldHVybmluZyBGYWlsdXJlIHdvcmtzXG4iKTsKKwl9IGVsc2UgeworCQlQcmludChMIlJldHVybmluZyBmYWlsdXJlIGRvZXNuJ3Qgd29yay5cclxuIik7CisJCVByaW50KEwiJSVyYXggd2FzIDB4JTAxNngsIHNob3VsZCBoYXZlIGJlZW4gMHglMDE2eFxuIiwKKwkJCXJjLCBFRklfVU5TVVBQT1JURUQpOworCQlyZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOworCX0KKworCXJjID0gdGVzdF9jYWxsMCgpOworCWlmICghRUZJX0VSUk9SKHJjKSkgeworCQlQcmludChMIjAgYXJncyB3b3JrcyBqdXN0IGZpbmUgaGVyZS5cclxuIik7CisJfSBlbHNlIHsKKwkJUHJpbnQoTCIwIGFyZ3MgZmFpbGVkOiAweCUwMTZ4XG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHRlc3RfY2FsbDEoKTsKKwlpZiAoIUVGSV9FUlJPUihyYykpIHsKKwkJUHJpbnQoTCIxIGFyZyB3b3JrcyBqdXN0IGZpbmUgaGVyZS5cclxuIik7CisJfSBlbHNlIHsKKwkJUHJpbnQoTCIxIGFyZyBmYWlsZWQ6IDB4JTAxNnhcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gdGVzdF9jYWxsMigpOworCWlmICghRUZJX0VSUk9SKHJjKSkgeworCQlQcmludChMIjIgYXJncyB3b3JrcyBqdXN0IGZpbmUgaGVyZS5cclxuIik7CisJfSBlbHNlIHsKKwkJUHJpbnQoTCIyIGFyZ3MgZmFpbGVkOiAweCUwMTZ4XG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHRlc3RfY2FsbDMoKTsKKwlpZiAoIUVGSV9FUlJPUihyYykpIHsKKwkJUHJpbnQoTCIzIGFyZ3Mgd29ya3MganVzdCBmaW5lIGhlcmUuXHJcbiIpOworCX0gZWxzZSB7CisJCVByaW50KEwiMyBhcmdzIGZhaWxlZDogMHglMDE2eFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSB0ZXN0X2NhbGw0KCk7CisJaWYgKCFFRklfRVJST1IocmMpKSB7CisJCVByaW50KEwiNCBhcmdzIHdvcmtzIGp1c3QgZmluZSBoZXJlLlxyXG4iKTsKKwl9IGVsc2UgeworCQlQcmludChMIjQgYXJncyBmYWlsZWQ6IDB4JTAxNnhcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gdGVzdF9jYWxsNSgpOworCWlmICghRUZJX0VSUk9SKHJjKSkgeworCQlQcmludChMIjUgYXJncyB3b3JrcyBqdXN0IGZpbmUgaGVyZS5cclxuIik7CisJfSBlbHNlIHsKKwkJUHJpbnQoTCI1IGFyZ3MgZmFpbGVkOiAweCUwMTZ4XG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHRlc3RfY2FsbDYoKTsKKwlpZiAoIUVGSV9FUlJPUihyYykpIHsKKwkJUHJpbnQoTCI2IGFyZ3Mgd29ya3MganVzdCBmaW5lIGhlcmUuXHJcbiIpOworCX0gZWxzZSB7CisJCVByaW50KEwiNiBhcmdzIGZhaWxlZDogMHglMDE2eFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSB0ZXN0X2NhbGw3KCk7CisJaWYgKCFFRklfRVJST1IocmMpKSB7CisJCVByaW50KEwiNyBhcmdzIHdvcmtzIGp1c3QgZmluZSBoZXJlLlxyXG4iKTsKKwl9IGVsc2UgeworCQlQcmludChMIjcgYXJncyBmYWlsZWQ6IDB4JTAxNnhcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gdGVzdF9jYWxsOCgpOworCWlmICghRUZJX0VSUk9SKHJjKSkgeworCQlQcmludChMIjggYXJncyB3b3JrcyBqdXN0IGZpbmUgaGVyZS5cclxuIik7CisJfSBlbHNlIHsKKwkJUHJpbnQoTCI4IGFyZ3MgZmFpbGVkOiAweCUwMTZ4XG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHRlc3RfY2FsbDkoKTsKKwlpZiAoIUVGSV9FUlJPUihyYykpIHsKKwkJUHJpbnQoTCI5IGFyZ3Mgd29ya3MganVzdCBmaW5lIGhlcmUuXHJcbiIpOworCX0gZWxzZSB7CisJCVByaW50KEwiOSBhcmdzIGZhaWxlZDogMHglMDE2eFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSB0ZXN0X2NhbGwxMCgpOworCWlmICghRUZJX0VSUk9SKHJjKSkgeworCQlQcmludChMIjEwIGFyZ3Mgd29ya3MganVzdCBmaW5lIGhlcmUuXHJcbiIpOworCX0gZWxzZSB7CisJCVByaW50KEwiMTAgYXJncyBmYWlsZWQ6IDB4JTAxNnhcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy90cGF1c2UuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy90cGF1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM4NmRmCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9hcHBzL3RwYXVzZS5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorCitFRklfU1RBVFVTCitlZmlfbWFpbiAoRUZJX0hBTkRMRSBpbWFnZSwgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiKQoreworCVByaW50KEwiUHJlc3MgYHEnIHRvIHF1aXQsIGFueSBvdGhlciBrZXkgdG8gY29udGludWU6XG4iKTsKKwkKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvYXBwcy90cml2aWFsLlMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdHJpdmlhbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYmM2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2FwcHMvdHJpdmlhbC5TCkBAIC0wLDAgKzEsNDMgQEAKKwkudGV4dAorCS5hbGlnbiA0CisKKwkuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisjaWYgMAorICAgICAgICBwdXNobCAlZWJwCisgICAgICAgIG1vdmwgJWVzcCwlZWJwCisgICAgICAgIHB1c2hsICVlYngJCSMgc2F2ZSBlYngKKyAgICAgICAgbW92bCAxMiglZWJwKSwlZWF4CSMgZWF4IDwtIHN5c3RhYgorCW1vdmwgMjQoJWVheCksJWVieAkjIGVieCA8LSBzeXN0YWItPkZpcm13YXJlVmVuZG9yCisJcHVzaGwgJWVieAorICAgICAgICBtb3ZsIDQ0KCVlYXgpLCVlYngJIyBlYnggPC0gc3lzdGFiLT5Db25PdXQKKyAgICAgICAgcHVzaGwgJWVieAorICAgICAgICBtb3ZsIDQoJWVieCksJWVheAkjIGVheCA8LSBjb25vdXQtPk91dHB1dFN0cmluZworICAgICAgICBjYWxsIColZWF4CisgICAgICAgIG1vdmwgLTQoJWVicCksJWVieAkjIHJlc3RvcmUgZWJ4CisgICAgICAgIGxlYXZlCisgICAgICAgIHJldAorCisjZWxzZQorCisgICAgICAgIHB1c2hsICVlYnAKKyAgICAgICAgbW92bCAlZXNwLCVlYnAKKyAgICAgICAgcHVzaGwgJWVieAorCWNhbGwgMGYKKzA6CXBvcGwgJWVheAorCWFkZGwgJGhlbGxvLTBiLCVlYXgKKwlwdXNobCAlZWF4CisgICAgICAgIG1vdmwgMTIoJWVicCksJWVheAkjIGVheCA8LSBzeXN0YWIKKyAgICAgICAgbW92bCA0NCglZWF4KSwlZWJ4CSMgZWJ4IDwtIHN5c3RhYi0+Q29uT3V0CisgICAgICAgIHB1c2hsICVlYngKKyAgICAgICAgbW92bCA0KCVlYngpLCVlYXgJIyBlYXggPC0gY29ub3V0LT5PdXRwdXRTdHJpbmcKKyAgICAgICAgY2FsbCAqJWVheAorICAgICAgICBtb3ZsIC00KCVlYnApLCVlYngKKyAgICAgICAgbGVhdmUKKyAgICAgICAgcmV0CisKKwkuc2VjdGlvbiAucm9kYXRhCisJLmFsaWduIDIKK2hlbGxvOgkuYnl0ZSAnaCcsMCwnZScsMCwnbCcsMCwnbCcsMCwnbycsMCwnXG4nLDAsJ1xyJywwLDAsMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL2NoYW5nZWxvZyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL2NoYW5nZWxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjZiZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9kZWJpYW4vY2hhbmdlbG9nCkBAIC0wLDAgKzEsMTU1IEBACitnbnUtZWZpICgzLjBpLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCisgICAgKyBTdXBwb3J0IGZvciBGcmVlQlNEIChjbG9zZXM6ICM1MzU2OTYpLgorCisgICogZGViaWFuL2NvbnRyb2w6CisgICAgKyBNYWtlIGtmcmVlYnNkLWFtZDY0IGEgc3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4KKyAgICArIEJ1aWxkLWRlcGVuZCBvbiBnY2MtbXVsdGlsaWIgb24ga2ZyZWVic2QtYW1kNjQgdG9vLgorICAqIGRlYmlhbi9ydWxlczoKKyAgICArIEFkZCBzdXBwb3J0IGZvciBib3RoIGtmcmVlYnNkLXtpMzg2LGFtZDY0fS4KKyAgICArIEluc3RhbGwgRnJlZUJTRCB4ODZfNjQgbGlua2VyIHNjcmlwdCBvbiBrZnJlZWJzZC1hbWQ2NC4KKyAgICArIERvIG5vdCBpbnN0YWxsIGlhNjQtc3BlY2lmaWMgaGVhZGVycyBvbiBpMzg2L2FtZDY0LCBkbyBub3QgaW5zdGFsbAorICAgICAgaTM4Ni9hbWQ2NC1zcGVjaWZpYyBoZWFkZXJzIG9uIGlhNjQuCisKKyAtLSBKdWxpZW4gQkxBQ0hFIDxqYmxhY2hlQGRlYmlhbi5vcmc+ICBTYXQsIDEyIFNlcCAyMDA5IDExOjM4OjU3ICswMjAwCisKK2dudS1lZmkgKDMuMGgtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBDbGVhbiB1cCBhbmQgcmVjb3ZlciBmcm9tIGEgYnJva2VuIE5NVS4KKworICAqIGRlYmlhbi9jb250cm9sOgorICAgICsgQnVtcCBTdGFuZGFyZHMtVmVyc2lvbiB0byAzLjguMyAobm8gY2hhbmdlcykuCisgICAgKyBBZGRlZCBteXNlbGYgYXMgdXBsb2FkZXIuCisKKyAgKiBnbnVlZmkvZWxmX2lhMzJfZWZpLmxkczoKKyAgICArIEZpeCBsaW5rZXIgc2NyaXB0IGZvciBlbGYtaTM4NiAoY2xvc2VzOiAjNTQ1MjAyKS4KKworIC0tIEp1bGllbiBCTEFDSEUgPGpibGFjaGVAZGViaWFuLm9yZz4gIEZyaSwgMTEgU2VwIDIwMDkgMTg6MjY6MjIgKzAyMDAKKworZ251LWVmaSAoMy4waC0wLjEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTk1VCisgICogTmV3IHVwc3RyZWFtIHZlcnNpb24uCisgICogQnVtcCB0byBTdGFuZGFyZHMtVmVyc2lvbiAzLjguMi4KKyAgKiBBZGQgd2F0Y2ggZmlsZS4KKyAgKiBDb25mbGljdCB3aXRoIGxpYmM2LWkzODYgKDw9IDIuOS0xOCkuICBjbG9zZXM6ICM1MzMwMDMuCisKKyAtLSBDbGludCBBZGFtcyA8c2NoaXpvQGRlYmlhbi5vcmc+ICBTdW4sIDAyIEF1ZyAyMDA5IDEyOjA2OjQwIC0wNDAwCisKK2dudS1lZmkgKDMuMGUtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBOb24tbWFpbnRhaW5lciB1cGxvYWQgd2l0aCBtYWludGFpbmVyJ3MgY29uc2VudC4KKworICAqIGRlYmlhbi9ydWxlczoKKyAgICArIE1vdmUgZmlsZXMgZnJvbSAvZW11bC9pYTMyLWxpbnV4IHRvIC91c3IvbGliMzIgKGNsb3NlczogIzUzMzAwMykuCisKKyAgKiBkZWJpYW4vY29udHJvbDoKKyAgICArIEJ1bXAgU3RhbmRhcmRzLVZlcnNpb24gdG8gMy44LjEgKG5vIGNoYW5nZXMpLgorCisgLS0gSnVsaWVuIEJMQUNIRSA8amJsYWNoZUBkZWJpYW4ub3JnPiAgV2VkLCAxNyBKdW4gMjAwOSAxNjo0MToyNiArMDIwMAorCitnbnUtZWZpICgzLjBlLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogRml4ZXMgd3JvbmcgbGliIHdoZW4gY3Jvc3MtYnVpbGRpbmcsIENsb3NlczogIzQ4MjA3NworICAqIEZpeGVzIHg4Nl82NCBidWlsZHMgb24gaTM4NiwgQ2xvc2VzOiAjNDgyMDc4CisgICogQWNrbm93bGVkZ2UgTk1VLCBDbG9zZXM6ICM0NzM3MjEKKworIC0tIE5pZ2VsIENyb3hvbiA8bmlnZWwuY3JveG9uQGhwLmNvbT4gIFdlZCwgMDQgSnVuIDIwMDggMTU6MTE6MTIgLTA2MDAKKworZ251LWVmaSAoMy4wZS0xLjEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTm9uLW1haW50YWluZXIgdXBsb2FkLgorICAqIEZpeCBpbnN0YWxsaW5nIGJlbG93IC9lbXVsL2lhMzItbGludXgvdXNyL2xpYiAobm90IC91c3IvbGliMzIpIG9uCisgICAgQU1ENjQuIFRoaXMgY2xvc2VzOiBidWcjNDczNzIxLgorCisgLS0gSm9uYXMgU21lZGVnYWFyZCA8ZHJAam9uZXMuZGs+ICBXZWQsIDMwIEFwciAyMDA4IDAxOjIyOjM1ICswMjAwCisKK2dudS1lZmkgKDMuMGUtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBGaXhlcyB4ODZfNjQgY2xvYmJlcmluZyByZWdpc3RlcnMKKyAgKiBBZGRlZCBiaW51dGlscyA+PSAyLjE3LjUwLjAuMTQsIENsb3NlczogIzQ2MTY0MAorICAqIGZpeGVzIGluc3RhbGxzIHBhcnRzIG9mIGl0cyBidWlsZCBzeXN0ZW0sIENsb3NlczogIzQzOTA5MgorCisgLS0gTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPiAgTW9uLCAzMSBNYXIgMjAwOCAwOTozMTo1MiAtMDYwMAorCitnbnUtZWZpICgzLjBkLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogbmV3IChzcG9uc29yZWQpIG1haW50YWluZXIKKyAgKiBBZGQgcGF0Y2hlcyB0byBzdXBwb3J0IHg4Nl82NCBmcm9tIEMuTmFyYXlhbmFuIChJbnRlbCkKKyAgICB3aXRoIHN1cHBvcnQgb24gRUZJIDEuMTAgYW5kIFVFRkkgMi4wIGZpcm13YXJlLgorICAqIG5ldyB1cHN0cmVhbSB2ZXJzaW9uLCBDbG9zZXM6ICMzNzYwMDAKKyAgKiBmaXhlcyB4ODZfNjQgZWxpbG8gc3VwcG9ydCwgQ2xvc2VzOiAjNDM4OTU0CisgICogQWRkZWQgc3VwcG9ydCBmb3IgYW1kNjQsIENsb3NlczogIzM4MzgwMQorCisgLS0gTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPiAgV2VkLCAyMSBBdWcgMjAwNyAxNDoxMjowOSAtMDYwMAorCitnbnUtZWZpICgzLjBjLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogbmV3IHVwc3RyZWFtIHZlcnNpb24sIGRlc2NyaWJlZCBhcyBhIG1haW50ZW5hbmNlIHJlbGVhc2UgZm9yIAorICAgIGNvbXBhdGliaWxpdHkgd2l0aCBjdXJyZW50IGdjYyBhbmQgYmludXRpbHMgdmVyc2lvbnMKKworIC0tIEJkYWxlIEdhcmJlZSA8YmRhbGVAZ2FnLmNvbT4gIEZyaSwgMjQgTWFyIDIwMDYgMDU6MDI6MjggLTA3MDAKKworZ251LWVmaSAoMy4wYi0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIG5ldyB1cHN0cmVhbSB2ZXJzaW9uLCBjbG9zZXM6ICMzNDExMjQKKyAgKiBkb3duZ3JhZGUgcHJpb3JpdHkgdG8gb3B0aW9uYWwsIGNsb3NlczogIzI4MDY0NgorICAqIGZpeCBsaWIvcHJpbnQuYyB0byBwcmV2ZW50IHByaW50aW5nIGdhcmJhZ2Ugd2hlbiBpdGVtcyB3ZXJlIHBhc3NlZCBvbgorICAgIHNvZnR3YXJlIHN0YWNrLCBjbG9zZXM6ICMyODM4NDIKKworIC0tIEJkYWxlIEdhcmJlZSA8YmRhbGVAZ2FnLmNvbT4gIFdlZCwgIDcgRGVjIDIwMDUgMjA6NTU6NDYgLTA4MDAKKworZ251LWVmaSAoMy4wYS00KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIGZpeCBnY2MgcGF0aCBwcm9ibGVtIGluIE1ha2VmaWxlIGV4cG9zZWQgYnkgYnVpbGQgb24gaTM4NiwgY2xvc2VzOiAjMjE1MDUwCisgICogbWVyZ2UgcGF0Y2hlcyBmcm9tIHVwc3RyZWFtIHRvIGFkZHJlc3MgbGlua2VyIHByb2JsZW1zIG9uIGkzODYKKworIC0tIEJkYWxlIEdhcmJlZSA8YmRhbGVAZ2FnLmNvbT4gIFRodSwgMjMgT2N0IDIwMDMgMTk6NTM6MTkgLTA2MDAKKworZ251LWVmaSAoMy4wYS0zKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIGFkZCBpMzg2IHRvIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzCisKKyAtLSBCZGFsZSBHYXJiZWUgPGJkYWxlQGdhZy5jb20+ICBNb24sICA2IE9jdCAyMDAzIDEwOjA0OjEzIC0wNjAwCisKK2dudS1lZmkgKDMuMGEtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBwYXRjaCB0byBsaW5rZXIgc2NyaXB0cyBmcm9tIE1hdHRoZXcgV2lsY294IDx3aWxseUBkZWJpYW4ub3JnPiB0aGF0IAorICAgIGFsbG93cyBjb21waWxhdGlvbiB3aXRoIEdDQyAzLjMKKworIC0tIEJkYWxlIEdhcmJlZSA8YmRhbGVAZ2FnLmNvbT4gIFdlZCwgIDEgT2N0IDIwMDMgMTM6NTI6NTEgLTA2MDAKKworZ251LWVmaSAoMy4wYS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIG5ldyB1cHN0cmVhbSB2ZXJzaW9uLiAgZml4ZXMgbGlua2VyIHNjcmlwdHMgdG8gd29yayB3aXRoIHJlY2VudCBjb21waWxlcnMsCisgICAgc28gZ251LWVmaSBpcyBidWlsZGFibGUgZnJvbSBzb3VyY2UgYWdhaW4uCisKKyAtLSBCZGFsZSBHYXJiZWUgPGJkYWxlQGdhZy5jb20+ICBUdWUsIDI2IEZlYiAyMDAyIDIwOjUwOjM1IC0wNzAwCisKK2dudS1lZmkgKDMuMC0yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIGNoYW5nZSBzZWN0aW9uIHRvIGRldmVsLCBzaW5jZSBlbGlsbyBpcyBhIHNlcGFyYXRlIHBhY2thZ2Ugbm93IGFuZCB0aGlzCisgICAgcGFja2FnZSBvbmx5IHByb3ZpZGVzIGxpYnMgdGhhdCBFRkkgYXBwbGljYXRpb25zIGxpbmsKKworIC0tIEJkYWxlIEdhcmJlZSA8YmRhbGVAZ2FnLmNvbT4gIFRodSwgMjIgTm92IDIwMDEgMTA6Mjg6MTUgLTA3MDAKKworZ251LWVmaSAoMy4wLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogbmV3IHVwc3RyZWFtIHZlcnNpb24sIG5vIGxvbmdlciBpbmNsdWRlcyBlbGlsbyB3aGljaCBpcyBub3cgYSBzZXBhcmF0ZQorICAgIHBhY2thZ2UKKworIC0tIEJkYWxlIEdhcmJlZSA8YmRhbGVAZ2FnLmNvbT4gIFR1ZSwgMTAgSnVsIDIwMDEgMTM6MTg6NTAgLTA2MDAKKworZ251LWVmaSAoMi41LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogbmV3ZXIgdXBzdHJlYW0gcmVsZWFzZSwgcmVwYWNrYWdlcyB0byB1c2UgcmVhbCB1cHN0cmVhbSBzb3VyY2UKKworIC0tIEJkYWxlIEdhcmJlZSA8YmRhbGVAZ2FnLmNvbT4gIFR1ZSwgIDUgSnVuIDIwMDEgMjI6NTE6NTggLTA2MDAKKworZ251LWVmaSAoMS4xLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogSW5pdGlhbCBSZWxlYXNlLgorCisgLS0gUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+ICBNb24sIDE1IEphbiAyMDAxIDIxOjA1OjM0IC0wODAwCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL2NvbXBhdCBiL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL2NvbXBhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWQ2ZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9kZWJpYW4vY29tcGF0CkBAIC0wLDAgKzEgQEAKKzUKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL2NvbnRyb2wgYi9nbnUtZWZpL2dudS1lZmktMy4wL2RlYmlhbi9jb250cm9sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YzI0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2RlYmlhbi9jb250cm9sCkBAIC0wLDAgKzEsMTYgQEAKK1NvdXJjZTogZ251LWVmaQorU2VjdGlvbjogZGV2ZWwKK1ByaW9yaXR5OiBvcHRpb25hbAorTWFpbnRhaW5lcjogTmlnZWwgQ3JveG9uIDxuaWdlbC5jcm94b25AaHAuY29tPgorVXBsb2FkZXJzOiBCZGFsZSBHYXJiZWUgPGJkYWxlQGdhZy5jb20+LCBKdWxpZW4gQkxBQ0hFIDxqYmxhY2hlQGRlYmlhbi5vcmc+CitCdWlsZC1EZXBlbmRzOiBkZWJoZWxwZXIgKD4+IDUpLCBiaW51dGlscyAoPj0gMi4xNy41MC4wLjE0KSwgZ2NjLW11bHRpbGliIFtpMzg2IGFtZDY0IGtmcmVlYnNkLWFtZDY0XQorU3RhbmRhcmRzLVZlcnNpb246IDMuOC4zCisKK1BhY2thZ2U6IGdudS1lZmkKK0FyY2hpdGVjdHVyZTogaTM4NiBpYTY0IGFtZDY0IGtmcmVlYnNkLWFtZDY0CitTdWdnZXN0czogZWxpbG8KK0NvbmZsaWN0czogbGliYzYtaTM4NiAoPD0gMi45LTE4KQorRGVzY3JpcHRpb246IExpYnJhcnkgZm9yIGRldmVsb3BpbmcgRUZJIGFwcGxpY2F0aW9ucworIEdOVSB0b29sY2hhaW4gZm9yIGJ1aWxkaW5nIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBydW4gaW4gdGhlIGVudmlyb25tZW50CisgcHJlc2VudGVkIGJ5IEludGVsJ3MgRUZJIChFeHRlbnNpYmxlIEZpcm13YXJlIEludGVyZmFjZSkuICBFRkkgaXMgYSBmaXJtd2FyZQorIHNwZWNpZmljYXRpb24gZm9yIHRoZSAiQklPUyIgb24gaWE2NChJUEYpLCBJQS0zMih4ODYpIGFuZCB4ODZfNjQgc3lzdGVtcy4KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL2NvcHlyaWdodCBiL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL2NvcHlyaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDBlYTQwCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9kZWJpYW4vY29weXJpZ2h0CkBAIC0wLDAgKzEsNTggQEAKK1RoaXMgcGFja2FnZSB3YXMgZGViaWFuaXplZCBieSBOaWdlbCBDcm94b24gPG5pZ2VsLmNyb3hvbkBocC5jb20+IHVzaW5nIHNvdXJjZXMKK29idGFpbmVkIGZyb20KKworCWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZ251LWVmaQorCitDb3B5cmlnaHQ6CisKKyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorICAgICAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2JlcmdlciA8ZGF2aWRtQGhwbC5ocC5jb20+CisgICAgICAgQ29udHJpYnV0ZWQgYnkgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorCisgIEdOVS1FRkkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIEdOVS1FRkkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggR05VLUVGSTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSAKKyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAgTUEgMDIxMTAtMTMwMSwgVVNBLgorCitPbiBhIERlYmlhbiBzeXN0ZW0sIHRoZSBHUEwgY2FuIGJlIGZvdW5kIGluIC91c3Ivc2hhcmUvY29tbW9uLWxpY2Vuc2VzL0dQTC4KKworCitUaGUgZmlsZXMgaW4gdGhlICJsaWIiIGFuZCAiaW5jIiBzdWJkaXJlY3RvcmllcyBhcmUgdXNpbmcgdGhlIEVGSSBBcHBsaWNhdGlvbiAKK1Rvb2xraXQgZGlzdHJpYnV0ZWQgYnkgSW50ZWwgYXQgaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vdGVjaG5vbG9neS9lZmkKKworVGhpcyBjb2RlIGlzIGNvdmVyZWQgYnkgdGhlIGZvbGxvd2luZyBhZ3JlZW1lbnQ6CisKK0NvcHlyaWdodCAoYykgMTk5OS0yMDA3IEludGVsIENvcnBvcmF0aW9uCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCitSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCitsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKK3RoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK0lOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFTCBCRQorTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKK1NVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0NPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCitBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIFRIRSBFRkkgU1BFQ0lGSUNBVElPTiBBTkQgQUxMIE9USEVSIElORk9STUFUSU9OCitPTiBUSElTIFdFQiBTSVRFIEFSRSBQUk9WSURFRCAiQVMgSVMiIFdJVEggTk8gV0FSUkFOVElFUywgQU5EIEFSRSBTVUJKRUNUCitUTyBDSEFOR0UgV0lUSE9VVCBOT1RJQ0UuCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2RlYmlhbi9kaXJzIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9kZWJpYW4vZGlycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ2N2QyCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9kZWJpYW4vZGlycwpAQCAtMCwwICsxLDIgQEAKK3Vzci9pbmNsdWRlL2VmaQordXNyL2xpYgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9kZWJpYW4vZG9jcyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL2RvY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyNWRjYwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL2RvY3MKQEAgLTAsMCArMSwzIEBACitSRUFETUUuZWZpbGliCitSRUFETUUuZ251ZWZpICAKK1JFQURNRS5lbGlsbwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9kZWJpYW4vcnVsZXMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2RlYmlhbi9ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZDg0NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9kZWJpYW4vcnVsZXMKQEAgLTAsMCArMSwxMDkgQEAKKyMhL3Vzci9iaW4vbWFrZSAtZgorCitidWlsZGFyY2ggOj0gJChzaGVsbCBkcGtnLWFyY2hpdGVjdHVyZSAtcURFQl9CVUlMRF9BUkNIKQoraWZuZXEgKCwkKGZpbmRzdHJpbmcgaTM4NiwkKGJ1aWxkYXJjaCkpKQorCWVmaWFyY2ggOj0gaWEzMgorZWxzZSBpZm5lcSAoLCQoZmluZHN0cmluZyBhbWQ2NCwkKGJ1aWxkYXJjaCkpKQorCWVmaWFyY2ggOj0geDg2XzY0CitlbHNlCisJZWZpYXJjaCA6PSAkKGJ1aWxkYXJjaCkKK2VuZGlmCisKK2J1aWxkOiBidWlsZC1zdGFtcAorYnVpbGQtc3RhbXA6CisJZGhfdGVzdGRpcgorCitpZm5lcSAoLCQoZmluZHN0cmluZyBhbWQ2NCwkKGJ1aWxkYXJjaCkpKQorCW1rZGlyIGJ1aWxkLWlhMzIKKwkkKE1BS0UpIC1DIGJ1aWxkLWlhMzIgLWYgLi4vTWFrZWZpbGUgU1JDRElSPS4uIEFSQ0g9aWEzMgorZW5kaWYKKworaWZuZXEgKCwkKGZpbmRzdHJpbmcgaTM4NiwkKGJ1aWxkYXJjaCkpKQorCW1rZGlyIGJ1aWxkLXg4Nl82NAorCSQoTUFLRSkgLUMgYnVpbGQteDg2XzY0IC1mIC4uL01ha2VmaWxlIFNSQ0RJUj0uLiBBUkNIPXg4Nl82NAorZW5kaWYKKworCSQoTUFLRSkKKworCXRvdWNoIGJ1aWxkLXN0YW1wCisKK2NsZWFuOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCXJtIC1mIGJ1aWxkLXN0YW1wIGNvbmZpZ3VyZS1zdGFtcAorCVsgISAtZiBNYWtlZmlsZSBdIHx8ICQoTUFLRSkgY2xlYW4KKwlybSAtcmYgYnVpbGQtaWEzMiBidWlsZC14ODZfNjQKKwlkaF9jbGVhbgorCitpbnN0YWxsOiBidWlsZAorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCWRoX2NsZWFuIC1rCisJZGhfaW5zdGFsbGRpcnMgLUEKKworCSMgZ251LWVmaSBmaWxlcworCWNwIC1yIGluYy8qIGRlYmlhbi9nbnUtZWZpL3Vzci9pbmNsdWRlL2VmaS8KKwlybSBkZWJpYW4vZ251LWVmaS91c3IvaW5jbHVkZS9lZmkvTWFrZWZpbGUKKwlybSBkZWJpYW4vZ251LWVmaS91c3IvaW5jbHVkZS9lZmkvaW5jLm1haworCXJtIGRlYmlhbi9nbnUtZWZpL3Vzci9pbmNsdWRlL2VmaS9tYWtlLmluZgorCXJtIGRlYmlhbi9nbnUtZWZpL3Vzci9pbmNsdWRlL2VmaS9tYWtlZmlsZS5oZHIKKwlybSBkZWJpYW4vZ251LWVmaS91c3IvaW5jbHVkZS9lZmkvcHJvdG9jb2wvbWFrZS5pbmYKKwlybSBkZWJpYW4vZ251LWVmaS91c3IvaW5jbHVkZS9lZmkvcHJvdG9jb2wvbWFrZWZpbGUuaGRyCisJcm0gZGViaWFuL2dudS1lZmkvdXNyL2luY2x1ZGUvZWZpL3Byb3RvY29sL3JlYWRtZS50eHQKK2lmZXEgKCQoYnVpbGRhcmNoKSxpYTY0KQorCXJtIC1yZiBkZWJpYW4vZ251LWVmaS91c3IvaW5jbHVkZS9lZmkvaWEzMgorCXJtIC1yZiBkZWJpYW4vZ251LWVmaS91c3IvaW5jbHVkZS9lZmkveDg0XzY0CitlbHNlCisJcm0gLXJmIGRlYmlhbi9nbnUtZWZpL3Vzci9pbmNsdWRlL2VmaS9pYTY0CitlbmRpZgorCWNwIGdudWVmaS8qLmEgZGViaWFuL2dudS1lZmkvdXNyL2xpYi8KK2lmZXEgKCQoYnVpbGRhcmNoKSxrZnJlZWJzZC1hbWQ2NCkKKwljcCBnbnVlZmkvZWxmXyQoZWZpYXJjaClfZmJzZF9lZmkubGRzIGRlYmlhbi9nbnUtZWZpL3Vzci9saWIKK2Vsc2UKKwljcCBnbnVlZmkvZWxmXyQoZWZpYXJjaClfZWZpLmxkcyBkZWJpYW4vZ251LWVmaS91c3IvbGliCitlbmRpZgorCWNwIGdudWVmaS9jcnQwLWVmaS0kKGVmaWFyY2gpLm8gZGViaWFuL2dudS1lZmkvdXNyL2xpYgorCWNwIGxpYi8qLmEgZGViaWFuL2dudS1lZmkvdXNyL2xpYi8KKworaWZuZXEgKCwkKGZpbmRzdHJpbmcgYW1kNjQsJChidWlsZGFyY2gpKSkKKwlta2RpciAtcCBkZWJpYW4vZ251LWVmaS91c3IvbGliMzIKKwljcCBidWlsZC1pYTMyL2dudWVmaS8qLmEgZGViaWFuL2dudS1lZmkvdXNyL2xpYjMyLworCWNwIGdudWVmaS9lbGZfaWEzMl9lZmkubGRzIGRlYmlhbi9nbnUtZWZpL3Vzci9saWIzMi8KKwljcCBidWlsZC1pYTMyL2dudWVmaS9jcnQwLWVmaS1pYTMyLm8gZGViaWFuL2dudS1lZmkvdXNyL2xpYjMyLworCWNwIGJ1aWxkLWlhMzIvbGliLyouYSBkZWJpYW4vZ251LWVmaS91c3IvbGliMzIvCitlbmRpZgorCitpZm5lcSAoLCQoZmluZHN0cmluZyBpMzg2LCQoYnVpbGRhcmNoKSkpCisJbWtkaXIgLXAgZGViaWFuL2dudS1lZmkvdXNyL2xpYjY0CisJY3AgYnVpbGQteDg2XzY0L2dudWVmaS8qLmEgZGViaWFuL2dudS1lZmkvdXNyL2xpYjY0LworaWZlcSAoJChidWlsZGFyY2gpLGtmcmVlYnNkLWkzODYpCisJY3AgZ251ZWZpL2VsZl94ODZfNjRfZmJzZF9lZmkubGRzIGRlYmlhbi9nbnUtZWZpL3Vzci9saWI2NC8KK2Vsc2UKKwljcCBnbnVlZmkvZWxmX3g4Nl82NF9lZmkubGRzIGRlYmlhbi9nbnUtZWZpL3Vzci9saWI2NC8KK2VuZGlmCisJY3AgYnVpbGQteDg2XzY0L2dudWVmaS9jcnQwLWVmaS14ODZfNjQubyBkZWJpYW4vZ251LWVmaS91c3IvbGliNjQvCisJY3AgYnVpbGQteDg2XzY0L2xpYi8qLmEgZGViaWFuL2dudS1lZmkvdXNyL2xpYjY0LworZW5kaWYKKworIyBCdWlsZCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaGVyZS4KK2JpbmFyeS1pbmRlcDogYnVpbGQgaW5zdGFsbAorIyBXZSBoYXZlIG5vdGhpbmcgdG8gZG8gYnkgZGVmYXVsdC4KKworIyBCdWlsZCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGhlcmUuCitiaW5hcnktYXJjaDogYnVpbGQgaW5zdGFsbAorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCWRoX2luc3RhbGxkb2NzIC1hCisJZGhfaW5zdGFsbGNoYW5nZWxvZ3MgLWEgQ2hhbmdlTG9nCisJZGhfbGluaworCWRoX3N0cmlwCisJZGhfY29tcHJlc3MKKwlkaF9maXhwZXJtcworCWRoX2luc3RhbGxkZWIKKwlkaF9zaGxpYmRlcHMKKwlkaF9nZW5jb250cm9sCisJZGhfbWQ1c3VtcworCWRoX2J1aWxkZGViCisKK2JpbmFyeTogYmluYXJ5LWluZGVwIGJpbmFyeS1hcmNoCisuUEhPTlk6IGJ1aWxkIGNsZWFuIGJpbmFyeS1pbmRlcCBiaW5hcnktYXJjaCBiaW5hcnkgaW5zdGFsbCBjb25maWd1cmUKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL3dhdGNoIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9kZWJpYW4vd2F0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4Mjg2NwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZGViaWFuL3dhdGNoCkBAIC0wLDAgKzEsMiBAQAordmVyc2lvbj0zCitodHRwOi8vc2YubmV0L2dudS1lZmkvZ251LWVmaV8oLispXC5vcmlnXC50YXJcLmd6CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9NYWtlZmlsZSBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWFkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9NYWtlZmlsZQpAQCAtMCwwICsxLDcyIEBACisjCisjICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBIZXdsZXR0LVBhY2thcmQgQ28uCisjCUNvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2JlcmdlciA8ZGF2aWRtQGhwbC5ocC5jb20+CisjCUNvbnRyaWJ1dGVkIGJ5IFN0ZXBoYW5lIEVyYW5pYW4gPGVyYW5pYW5AaHBsLmhwLmNvbT4KKyMKKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyAgICBhcmUgbWV0OgorIworIyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworIyAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworIyAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBDby4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyMgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorIyAgICBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorIyAgICBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorIyAgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyAgICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworIyAgICBCRSBMSUFCTEUgRk9SIEFOWURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyMgICAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgICAgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisjICAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyAgICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorIyAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YKKyMgICAgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjICAgIFNVQ0ggREFNQUdFLgorIworCitTUkNESVIgPSAuCisKK1ZQQVRIID0gJChTUkNESVIpCisKK2luY2x1ZGUgJChTUkNESVIpLy4uL01ha2UuZGVmYXVsdHMKKworVE9QRElSID0gJChTUkNESVIpLy4uCisKK0NESVI9JChUT1BESVIpLy4uCitGSUxFUwk9IHJlbG9jXyQoQVJDSCkgc2V0am1wXyQoQVJDSCkKKworT0JKUwk9ICQoRklMRVM6JT0lLm8pCisKK1RBUkdFVFMJPSBjcnQwLWVmaS0kKEFSQ0gpLm8gbGliZ251ZWZpLmEKKworYWxsOgkkKFRBUkdFVFMpCisKK2xpYmdudWVmaS5hOiAkKHBhdHN1YnN0ICUsbGliZ251ZWZpLmEoJSksJChPQkpTKSkKKworY2xlYW46CisJcm0gLWYgJChUQVJHRVRTKSAqfiAqLm8gJChPQkpTKQorCitpbnN0YWxsOgorCW1rZGlyIC1wICQoSU5TVEFMTFJPT1QpLyQoTElCRElSKQorCSQoSU5TVEFMTCkgLW0gNjQ0ICQoVEFSR0VUUykgJChJTlNUQUxMUk9PVCkvJChMSUJESVIpCitpZm5lcSAoLCQoZmluZHN0cmluZyBGcmVlQlNELCQoT1MpKSkKKyBpZmVxICgkKEFSQ0gpLHg4Nl82NCkKKwkkKElOU1RBTEwpIC1tIDY0NCAkKFNSQ0RJUikvZWxmXyQoQVJDSClfZmJzZF9lZmkubGRzICQoSU5TVEFMTFJPT1QpLyQoTElCRElSKQorIGVsc2UKKwkkKElOU1RBTEwpIC1tIDY0NCAkKFNSQ0RJUikvZWxmXyQoQVJDSClfZWZpLmxkcyAkKElOU1RBTExST09UKS8kKExJQkRJUikKKyBlbmRpZgorZWxzZQorCSQoSU5TVEFMTCkgLW0gNjQ0ICQoU1JDRElSKS9lbGZfJChBUkNIKV9lZmkubGRzICQoSU5TVEFMTFJPT1QpLyQoTElCRElSKQorZW5kaWYKKworaW5jbHVkZSAkKFNSQ0RJUikvLi4vTWFrZS5ydWxlcwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvY3J0MC1lZmktaWEzMi5TIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvY3J0MC1lZmktaWEzMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZDUxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9jcnQwLWVmaS1pYTMyLlMKQEAgLTAsMCArMSw3NiBAQAorLyogY3J0MC1lZmktaWEzMi5TIC0geDg2IEVGSSBzdGFydHVwIGNvZGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvLgorCUNvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2JlcmdlciA8ZGF2aWRtQGhwbC5ocC5jb20+LgorCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBDby4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECisgICAgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAgICBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICAgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAgICBCRSBMSUFCTEUgRk9SIEFOWURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICAgIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GCisgICAgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgICAgU1VDSCBEQU1BR0UuCisqLworCisJLnRleHQKKwkuYWxpZ24gNAorCisJLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCisJcHVzaGwgMTIoJWVicCkJCQkjIGNvcHkgImltYWdlIiBhcmd1bWVudAorCXB1c2hsICA4KCVlYnApCQkJIyBjb3B5ICJzeXN0YWIiIGFyZ3VtZW50CisKKwljYWxsIDBmCiswOglwb3BsICVlYXgKKwltb3ZsICVlYXgsJWVieAorCisJYWRkbCAkSW1hZ2VCYXNlLTBiLCVlYXgJCSMgJWVheCA9IGxkYmFzZQorCWFkZGwgJF9EWU5BTUlDLTBiLCVlYngJCSMgJWVieCA9IF9EWU5BTUlDCisKKwlwdXNobCAlZWJ4CQkJIyBwYXNzIF9EWU5BTUlDIGFzIHNlY29uZCBhcmd1bWVudAorCXB1c2hsICVlYXgJCQkjIHBhc3MgbGRiYXNlIGFzIGZpcnN0IGFyZ3VtZW50CisJY2FsbCBfcmVsb2NhdGUKKwlwb3BsICVlYngKKwlwb3BsICVlYngKKyAJdGVzdGwgJWVheCwlZWF4CisgCWpuZSAuZXhpdAorICAKKyAgCWNhbGwgZWZpX21haW4JCQkjIGNhbGwgYXBwIHdpdGggImltYWdlIiBhbmQgInN5c3RhYiIgYXJndW1lbnQKKworLmV4aXQ6CWxlYXZlCisgIAlyZXQKKyAKKyAJLy8gaGFuZC1jcmFmdCBhIGR1bW15IC5yZWxvYyBzZWN0aW9uIHNvIEVGSSBrbm93cyBpdCdzIGEgcmVsb2NhdGFibGUgZXhlY3V0YWJsZToKKyAKKyAJLmRhdGEKK2R1bW15OgkubG9uZwkwCisKKyNkZWZpbmUgSU1BR0VfUkVMX0FCU09MVVRFCTAKKyAJLnNlY3Rpb24gLnJlbG9jCisgCS5sb25nCWR1bW15CQkJCQkvLyBQYWdlIFJWQQorIAkubG9uZwkxMAkJCQkJLy8gQmxvY2sgU2l6ZSAoMio0KzIpCisgCS53b3JkCShJTUFHRV9SRUxfQUJTT0xVVEU8PDEyKSArICAwCQkvLyByZWxvYyBmb3IgZHVtbXkKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL2NydDAtZWZpLWlhNjQuUyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL2NydDAtZWZpLWlhNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGMzYzgzCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvY3J0MC1lZmktaWE2NC5TCkBAIC0wLDAgKzEsODcgQEAKKy8qIGNydDAtZWZpLWlhNjQuUyAtIElBLTY0IEVGSSBzdGFydHVwIGNvZGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvLgorCUNvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2JlcmdlciA8ZGF2aWRtQGhwbC5ocC5jb20+LgorCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBDby4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECisgICAgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAgICBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICAgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAgICBCRSBMSUFCTEUgRk9SIEFOWURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICAgIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GCisgICAgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgICAgU1VDSCBEQU1BR0UuCisqLworCS50ZXh0CisJLnBzciBhYmk2NAorCS5wc3IgbHNiCisJLmxzYgorCisJLnByb2MgX3N0YXJ0Citfc3RhcnQ6CisJYWxsb2MgbG9jMD1hci5wZnMsMiwyLDIsMAorCW1vdiBsb2MxPXJwCisJbW92bCBvdXQwPUBncHJlbChJbWFnZUJhc2UpCS8vIG91dDAgPC0gSW1hZ2VCYXNlIChsZGJhc2UpCisJOzsKKwlhZGQgb3V0MD1vdXQwLGdwCisJbW92bCBvdXQxPUBncHJlbChfRFlOQU1JQykJLy8gb3V0MSA8LSBfRFlOQU1JQworCTs7CQkvLyBhdm9pZCBXQVcgb24gQ0ZNCisJYWRkIG91dDE9b3V0MSxncAorCWJyLmNhbGwuc3B0ay5mZXcgcnA9X3JlbG9jYXRlCisuTHJldDA6CQorCWNtcC5uZSBwNixwMD1yMCxyOAkJLy8gcjggPT0gRUZJX1NVQ0NFU1M/CisocDYpCWJyLmNvbmQuc3B0ay5mZXcgLmV4aXQJCS8vIG5vIC0+CisKKy5McmV0MToKKworCW1vdiBvdXQwPWluMAkJCS8vIGltYWdlIGhhbmRsZQorCW1vdiBvdXQxPWluMQkJCS8vIHN5c3RhYgorCWJyLmNhbGwuc3B0ay5mZXcgcnA9ZWZpX21haW4KKy5McmV0MjoKKy5leGl0OgorCW1vdiBhci5wZnM9bG9jMAorCW1vdiBycD1sb2MxCisJOzsKKwlici5yZXQuc3B0ay5mZXcgcnAKKworCS5lbmRwIF9zdGFydAorCisKKwkvLyBQRTMyKyB3YW50cyBhIFBMQUJFTCwgbm90IHRoZSBjb2RlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5IHBvaW50OgorCisJLmFsaWduIDE2CisJLmdsb2JhbCBfc3RhcnRfcGxhYmVsCisJLnNlY3Rpb24gLnBsYWJlbCwgImEiCitfc3RhcnRfcGxhYmVsOgorCWRhdGE4CV9zdGFydAorCWRhdGE4CV9fZ3AKKworCS8vIGhhbmQtY3JhZnQgYSAucmVsb2Mgc2VjdGlvbiBmb3IgdGhlIHBsYWJlbDoKKworI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfRElSNjQJMTAKKworCS5zZWN0aW9uIC5yZWxvYywgImEiCisJZGF0YTQJX3N0YXJ0X3BsYWJlbAkJCQkvLyBQYWdlIFJWQQorCWRhdGE0CTEyCQkJCQkvLyBCbG9jayBTaXplICgyKjQrMioyKQorCWRhdGEyCShJTUFHRV9SRUxfQkFTRURfRElSNjQ8PDEyKSArICAwCS8vIHJlbG9jIGZvciBwbGFiZWwncyBlbnRyeSBwb2ludAorCWRhdGEyCShJTUFHRV9SRUxfQkFTRURfRElSNjQ8PDEyKSArICA4CS8vIHJlbG9jIGZvciBwbGFiZWwncyBnbG9iYWwgcG9pbnRlcgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvY3J0MC1lZmkteDg2XzY0LlMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9jcnQwLWVmaS14ODZfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM5MTUwCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvY3J0MC1lZmkteDg2XzY0LlMKQEAgLTAsMCArMSw3NiBAQAorLyogY3J0MC1lZmkteDg2XzY0LlMgLSB4ODZfNjQgRUZJIHN0YXJ0dXAgY29kZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OSBIZXdsZXR0LVBhY2thcmQgQ28uCisJQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyIDxkYXZpZG1AaHBsLmhwLmNvbT4uCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgSW50ZWwgQ28uCisJQ29udHJpYnV0ZWQgYnkgRmVuZ2h1YSBZdSA8ZmVuZ2h1YS55dUBpbnRlbC5jb20+LgorCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBDby4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECisgICAgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAgICBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICAgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAgICBCRSBMSUFCTEUgRk9SIEFOWURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICAgIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GCisgICAgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgICAgU1VDSCBEQU1BR0UuCisqLworCS50ZXh0CisJLmFsaWduIDQKKworCS5nbG9ibCBfc3RhcnQKK19zdGFydDoKKwlzdWJxICQ4LCAlcnNwCisJcHVzaHEgJXJjeAorCXB1c2hxICVyZHgKKworMDoKKwlsZWEgSW1hZ2VCYXNlKCVyaXApLCAlcmRpCisJbGVhIF9EWU5BTUlDKCVyaXApLCAlcnNpCisKKwlwb3BxICVyY3gKKwlwb3BxICVyZHgKKwlwdXNocSAlcmN4CisJcHVzaHEgJXJkeAorCWNhbGwgX3JlbG9jYXRlCisKKwlwb3BxICVyZGkKKwlwb3BxICVyc2kKKworCWNhbGwgZWZpX21haW4KKwlhZGRxICQ4LCAlcnNwCisKKy5leGl0OgkKKyAgCXJldAorCisgCS8vIGhhbmQtY3JhZnQgYSBkdW1teSAucmVsb2Mgc2VjdGlvbiBzbyBFRkkga25vd3MgaXQncyBhIHJlbG9jYXRhYmxlIGV4ZWN1dGFibGU6CisgCisgCS5kYXRhCitkdW1teToJLmxvbmcJMAorCisjZGVmaW5lIElNQUdFX1JFTF9BQlNPTFVURQkwCisgCS5zZWN0aW9uIC5yZWxvYywgImEiCitsYWJlbDE6CisJLmxvbmcJZHVtbXktbGFiZWwxCQkJCS8vIFBhZ2UgUlZBCisgCS5sb25nCTEwCQkJCQkvLyBCbG9jayBTaXplICgyKjQrMikKKwkud29yZAkoSU1BR0VfUkVMX0FCU09MVVRFPDwxMikgKyAgMAkJLy8gcmVsb2MgZm9yIGR1bW15CisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL2VsZl9pYTMyX2VmaS5sZHMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9lbGZfaWEzMl9lZmkubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NWUzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9lbGZfaWEzMl9lZmkubGRzCkBAIC0wLDAgKzEsNzUgQEAKK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAuID0gMDsKKyAgSW1hZ2VCYXNlID0gLjsKKyAgLmhhc2ggOiB7ICooLmhhc2gpIH0JLyogdGhpcyBNVVNUIGNvbWUgZmlyc3QhICovCisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnRleHQgOgorICB7CisgICAqKC50ZXh0KQorICAgKigudGV4dC4qKQorICAgKiguZ251LmxpbmtvbmNlLnQuKikKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5zZGF0YSA6CisgIHsKKyAgICooLmdvdC5wbHQpCisgICAqKC5nb3QpCisgICAqKC5zcm9kYXRhKQorICAgKiguc2RhdGEpCisgICAqKC5zYnNzKQorICAgKiguc2NvbW1vbikKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhIDoKKyAgeworICAgKigucm9kYXRhKikKKyAgICooLmRhdGEpCisgICAqKC5kYXRhMSkKKyAgICooLmRhdGEuKikKKyAgICooLnNkYXRhKQorICAgKiguZ290LnBsdCkKKyAgICooLmdvdCkKKyAgIC8qIHRoZSBFRkkgbG9hZGVyIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIGEgLmJzcyBzZWN0aW9uLCBzbyB3ZSBzdGljaworICAgICAgaXQgYWxsIGludG8gLmRhdGE6ICovCisgICAqKC5zYnNzKQorICAgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmR5bmFtaWMgIDogeyAqKC5keW5hbWljKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnJlbCA6CisgIHsKKyAgICAqKC5yZWwuZGF0YSkKKyAgICAqKC5yZWwuZGF0YS4qKQorICAgICooLnJlbC5nb3QpCisgICAgKigucmVsLnN0YWIpCisgICAgKiguZGF0YS5yZWwucm8ubG9jYWwpCisgICAgKiguZGF0YS5yZWwubG9jYWwpCisgICAgKiguZGF0YS5yZWwucm8pCisgICAgKiguZGF0YS5yZWwqKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnJlbG9jIDoJCS8qIFRoaXMgaXMgdGhlIFBFQ09GRiAucmVsb2Mgc2VjdGlvbiEgKi8KKyAgeworICAgICooLnJlbG9jKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmR5bnN5bSAgIDogeyAqKC5keW5zeW0pIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZHluc3RyICAgOiB7ICooLmR5bnN0cikgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC9ESVNDQVJELyA6CisgIHsKKyAgICAqKC5yZWwucmVsb2MpCisgICAgKiguZWhfZnJhbWUpCisgICAgKigubm90ZS5HTlUtc3RhY2spCisgIH0KKyAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQorfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvZWxmX2lhMzJfZmJzZF9lZmkubGRzIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvZWxmX2lhMzJfZmJzZF9lZmkubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjViMWYKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9lbGZfaWEzMl9mYnNkX2VmaS5sZHMKQEAgLTAsMCArMSw3NSBAQAorT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4Ni1mcmVlYnNkIiwgImVsZjMyLWkzODYtZnJlZWJzZCIsICJlbGYzMi1pMzg2LWZyZWVic2QiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC4gPSAwOworICBJbWFnZUJhc2UgPSAuOworICAuaGFzaCA6IHsgKiguaGFzaCkgfQkvKiB0aGlzIE1VU1QgY29tZSBmaXJzdCEgKi8KKyAgLiA9IEFMSUdOKDQwOTYpOworICAudGV4dCA6CisgIHsKKyAgICooLnRleHQpCisgICAqKC50ZXh0LiopCisgICAqKC5nbnUubGlua29uY2UudC4qKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnNkYXRhIDoKKyAgeworICAgKiguZ290LnBsdCkKKyAgICooLmdvdCkKKyAgICooLnNyb2RhdGEpCisgICAqKC5zZGF0YSkKKyAgICooLnNic3MpCisgICAqKC5zY29tbW9uKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmRhdGEgOgorICB7CisgICAqKC5yb2RhdGEqKQorICAgKiguZGF0YSkKKyAgICooLmRhdGExKQorICAgKiguZGF0YS4qKQorICAgKiguc2RhdGEpCisgICAqKC5nb3QucGx0KQorICAgKiguZ290KQorICAgLyogdGhlIEVGSSBsb2FkZXIgZG9lc24ndCBzZWVtIHRvIGxpa2UgYSAuYnNzIHNlY3Rpb24sIHNvIHdlIHN0aWNrCisgICAgICBpdCBhbGwgaW50byAuZGF0YTogKi8KKyAgICooLnNic3MpCisgICAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZHluYW1pYyAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAucmVsIDoKKyAgeworICAgICooLnJlbC5kYXRhKQorICAgICooLnJlbC5kYXRhLiopCisgICAgKigucmVsLmdvdCkKKyAgICAqKC5yZWwuc3RhYikKKyAgICAqKC5kYXRhLnJlbC5yby5sb2NhbCkKKyAgICAqKC5kYXRhLnJlbC5sb2NhbCkKKyAgICAqKC5kYXRhLnJlbC5ybykKKyAgICAqKC5kYXRhLnJlbCopCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAucmVsb2MgOgkJLyogVGhpcyBpcyB0aGUgUEVDT0ZGIC5yZWxvYyBzZWN0aW9uISAqLworICB7CisgICAgKigucmVsb2MpCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZHluc3ltICAgOiB7ICooLmR5bnN5bSkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5keW5zdHIgICA6IHsgKiguZHluc3RyKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgL0RJU0NBUkQvIDoKKyAgeworICAgICooLnJlbC5yZWxvYykKKyAgICAqKC5laF9mcmFtZSkKKyAgICAqKC5ub3RlLkdOVS1zdGFjaykKKyAgfQorICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Cit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9lbGZfaWE2NF9lZmkubGRzIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvZWxmX2lhNjRfZWZpLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDlmZmMxCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvZWxmX2lhNjRfZWZpLmxkcwpAQCAtMCwwICsxLDcwIEBACitPVVRQVVRfRk9STUFUKCJlbGY2NC1pYTY0LWxpdHRsZSIpCitPVVRQVVRfQVJDSChpYTY0KQorRU5UUlkoX3N0YXJ0X3BsYWJlbCkKK1NFQ1RJT05TCit7CisgIC4gPSAwOworICBJbWFnZUJhc2UgPSAuOworICAuaGFzaCA6IHsgKiguaGFzaCkgfQkvKiB0aGlzIE1VU1QgY29tZSBmaXJzdCEgKi8KKyAgLiA9IEFMSUdOKDQwOTYpOworICAudGV4dCA6CisgIHsKKyAgICooLnRleHQpCisgICAqKC50ZXh0LiopCisgICAqKC5nbnUubGlua29uY2UudC4qKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ncCA9IEFMSUdOICg4KSArIDB4MjAwMDAwOworICAuc2RhdGEgOgorICB7CisgICAqKC5nb3QucGx0KQorICAgKiguZ290KQorICAgKiguc3JvZGF0YSkKKyAgICooLnNkYXRhKQorICAgKiguc2JzcykKKyAgICooLnNjb21tb24pCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZGF0YSA6CisgIHsKKyAgICooLnJvZGF0YSopCisgICAqKC5jdG9ycykKKyAgICooLmRhdGEqKQorICAgKiguZ251LmxpbmtvbmNlLmQqKQorICAgKigucGxhYmVsKQkvKiBkYXRhIHdob3NlIHJlbG9jcyB3ZSB3YW50IHRvIGlnbm9yZSAqLworICAgLyogdGhlIEVGSSBsb2FkZXIgZG9lc24ndCBzZWVtIHRvIGxpa2UgYSAuYnNzIHNlY3Rpb24sIHNvIHdlIHN0aWNrCisgICAgICBpdCBhbGwgaW50byAuZGF0YTogKi8KKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmR5bmFtaWMgIDogeyAqKC5keW5hbWljKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnJlbGEgOgorICB7CisgICAgKigucmVsYS50ZXh0KQorICAgICooLnJlbGEuZGF0YSopCisgICAgKigucmVsYS5zZGF0YSkKKyAgICAqKC5yZWxhLmdvdCkKKyAgICAqKC5yZWxhLmdudS5saW5rb25jZS5kKikKKyAgICAqKC5yZWxhLnN0YWIpCisgICAgKigucmVsYS5jdG9ycykKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5yZWxvYyA6CQkvKiBUaGlzIGlzIHRoZSBQRUNPRkYgLnJlbG9jIHNlY3Rpb24hICovCisgIHsKKyAgICAqKC5yZWxvYykKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5keW5zeW0gICA6IHsgKiguZHluc3ltKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmR5bnN0ciAgIDogeyAqKC5keW5zdHIpIH0KKyAgL0RJU0NBUkQvIDoKKyAgeworICAgICooLnJlbGEucGxhYmVsKQorICAgICooLnJlbGEucmVsb2MpCisgICAgKiguSUFfNjQudW53aW5kKikKKyAgICAqKC5JQTY0LnVud2luZCopCisgIH0KK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL2VsZl94ODZfNjRfZWZpLmxkcyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL2VsZl94ODZfNjRfZWZpLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGRmMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvZWxmX3g4Nl82NF9lZmkubGRzCkBAIC0wLDAgKzEsNjUgQEAKKy8qIFNhbWUgYXMgZWxmX3g4Nl82NF9mYnNkX2VmaS5sZHMsIGV4Y2VwdCBmb3IgT1VUUFVUX0ZPUk1BVCBiZWxvdyAtIEtFRVAgSU4gU1lOQyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAuID0gMDsKKyAgSW1hZ2VCYXNlID0gLjsKKyAgLmhhc2ggOiB7ICooLmhhc2gpIH0JLyogdGhpcyBNVVNUIGNvbWUgZmlyc3QhICovCisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmVoX2ZyYW1lIDogCisgIHsgCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAudGV4dCA6CisgIHsKKyAgICooLnRleHQpCisgICAqKC50ZXh0LiopCisgICAqKC5nbnUubGlua29uY2UudC4qKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnJlbG9jIDoKKyAgeworICAgKigucmVsb2MpCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZGF0YSA6CisgIHsKKyAgICooLnJvZGF0YSopCisgICAqKC5nb3QucGx0KQorICAgKiguZ290KQorICAgKiguZGF0YSopCisgICAqKC5zZGF0YSkKKyAgIC8qIHRoZSBFRkkgbG9hZGVyIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIGEgLmJzcyBzZWN0aW9uLCBzbyB3ZSBzdGljaworICAgICAgaXQgYWxsIGludG8gLmRhdGE6ICovCisgICAqKC5zYnNzKQorICAgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgKigucmVsLmxvY2FsKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmR5bmFtaWMgIDogeyAqKC5keW5hbWljKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLnJlbGEgOgorICB7CisgICAgKigucmVsYS5kYXRhKikKKyAgICAqKC5yZWxhLmdvdCkKKyAgICAqKC5yZWxhLnN0YWIpCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZHluc3ltICAgOiB7ICooLmR5bnN5bSkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5keW5zdHIgICA6IHsgKiguZHluc3RyKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmlnbm9yZWQucmVsb2MgOgorICB7CisgICAgKigucmVsYS5yZWxvYykKKyAgICAqKC5laF9mcmFtZSkKKyAgICAqKC5ub3RlLkdOVS1zdGFjaykKKyAgfQorICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Cit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9lbGZfeDg2XzY0X2Zic2RfZWZpLmxkcyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL2VsZl94ODZfNjRfZmJzZF9lZmkubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9lbGZfeDg2XzY0X2Zic2RfZWZpLmxkcwpAQCAtMCwwICsxLDU5IEBACisvKiBTYW1lIGFzIGVsZl94ODZfNjRfZWZpLmxkcywgZXhjZXB0IGZvciBPVVRQVVRfRk9STUFUIGJlbG93IC0gS0VFUCBJTiBTWU5DICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQtZnJlZWJzZCIsICJlbGY2NC14ODYtNjQtZnJlZWJzZCIsICJlbGY2NC14ODYtNjQtZnJlZWJzZCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC4gPSAwOworICBJbWFnZUJhc2UgPSAuOworICAuaGFzaCA6IHsgKiguaGFzaCkgfQkvKiB0aGlzIE1VU1QgY29tZSBmaXJzdCEgKi8KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZWhfZnJhbWUgOiAKKyAgeyAKKyAgICAqKC5laF9mcmFtZSkKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC50ZXh0IDoKKyAgeworICAgKigudGV4dCkKKyAgfQorICAucmVsb2MgOgorICB7CisgICAqKC5yZWxvYykKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhIDoKKyAgeworICAgKigucm9kYXRhKikKKyAgICooLmdvdC5wbHQpCisgICAqKC5nb3QpCisgICAqKC5kYXRhKikKKyAgICooLnNkYXRhKQorICAgLyogdGhlIEVGSSBsb2FkZXIgZG9lc24ndCBzZWVtIHRvIGxpa2UgYSAuYnNzIHNlY3Rpb24sIHNvIHdlIHN0aWNrCisgICAgICBpdCBhbGwgaW50byAuZGF0YTogKi8KKyAgICooLnNic3MpCisgICAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAqKC5yZWwubG9jYWwpCisgIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuZHluYW1pYyAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAucmVsYSA6CisgIHsKKyAgICAqKC5yZWxhLmRhdGEqKQorICAgICooLnJlbGEuZ290KQorICAgICooLnJlbGEuc3RhYikKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIC5keW5zeW0gICA6IHsgKiguZHluc3ltKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmR5bnN0ciAgIDogeyAqKC5keW5zdHIpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICAuaWdub3JlZC5yZWxvYyA6CisgIHsKKyAgICAqKC5yZWxhLnJlbG9jKQorICB9Cit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9yZWxvY19pYTMyLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9yZWxvY19pYTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1MGE3NQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL3JlbG9jX2lhMzIuYwpAQCAtMCwwICsxLDk3IEBACisvKiByZWxvY19pYTMyLmMgLSBwb3NpdGlvbiBpbmRlcGVuZGVudCB4ODYgRUxGIHNoYXJlZCBvYmplY3QgcmVsb2NhdG9yCisgICBDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvLgorCUNvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2JlcmdlciA8ZGF2aWRtQGhwbC5ocC5jb20+LgorCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBDby4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECisgICAgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAgICBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICAgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAgICBCRSBMSUFCTEUgRk9SIEFOWURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICAgIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GCisgICAgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgICAgU1VDSCBEQU1BR0UuCisqLworCisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8ZWZpbGliLmg+CisKKyNpbmNsdWRlIDxlbGYuaD4KKworRUZJX1NUQVRVUyBfcmVsb2NhdGUgKGxvbmcgbGRiYXNlLCBFbGYzMl9EeW4gKmR5biwgRUZJX0hBTkRMRSBpbWFnZSwgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiKQoreworCWxvbmcgcmVsc3ogPSAwLCByZWxlbnQgPSAwOworCUVsZjMyX1JlbCAqcmVsID0gMDsKKwl1bnNpZ25lZCBsb25nICphZGRyOworCWludCBpOworCisJZm9yIChpID0gMDsgZHluW2ldLmRfdGFnICE9IERUX05VTEw7ICsraSkgeworCQlzd2l0Y2ggKGR5bltpXS5kX3RhZykgeworCQkJY2FzZSBEVF9SRUw6CisJCQkJcmVsID0gKEVsZjMyX1JlbCopCisJCQkJCSgodW5zaWduZWQgbG9uZylkeW5baV0uZF91bi5kX3B0cgorCQkJCQkgKyBsZGJhc2UpOworCQkJCWJyZWFrOworCisJCQljYXNlIERUX1JFTFNaOgorCQkJCXJlbHN6ID0gZHluW2ldLmRfdW4uZF92YWw7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRFRfUkVMRU5UOgorCQkJCXJlbGVudCA9IGR5bltpXS5kX3VuLmRfdmFsOworCQkJCWJyZWFrOworCisJCQljYXNlIERUX1JFTEE6CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKyAgICAgICAgaWYgKCFyZWwgJiYgcmVsZW50ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEVGSV9TVUNDRVNTOworCisJaWYgKCFyZWwgfHwgcmVsZW50ID09IDApCisJCXJldHVybiBFRklfTE9BRF9FUlJPUjsKKworCXdoaWxlIChyZWxzeiA+IDApIHsKKwkJLyogYXBwbHkgdGhlIHJlbG9jcyAqLworCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKSB7CisJCQljYXNlIFJfMzg2X05PTkU6CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUl8zODZfUkVMQVRJVkU6CisJCQkJYWRkciA9ICh1bnNpZ25lZCBsb25nICopCisJCQkJCShsZGJhc2UgKyByZWwtPnJfb2Zmc2V0KTsKKwkJCQkqYWRkciArPSBsZGJhc2U7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJcmVsID0gKEVsZjMyX1JlbCopICgoY2hhciAqKSByZWwgKyByZWxlbnQpOworCQlyZWxzeiAtPSByZWxlbnQ7CisJfQorCXJldHVybiBFRklfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL3JlbG9jX2lhNjQuUyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL3JlbG9jX2lhNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDIwM2JmCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvcmVsb2NfaWE2NC5TCkBAIC0wLDAgKzEsMjI3IEBACisvKiByZWxvY19pYTY0LlMgLSBwb3NpdGlvbiBpbmRlcGVuZGVudCBJQS02NCBFTEYgc2hhcmVkIG9iamVjdCByZWxvY2F0b3IKKyAgIENvcHlyaWdodCAoQykgMTk5OSBIZXdsZXR0LVBhY2thcmQgQ28uCisJQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyIDxkYXZpZG1AaHBsLmhwLmNvbT4uCisKKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSGV3bGV0dC1QYWNrYXJkIENvLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyAgICBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICAgIEJFIExJQUJMRSBGT1IgQU5ZRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgICAgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgICAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgICAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YKKyAgICBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAgICBTVUNIIERBTUFHRS4KKyovCisKKy8qCisgKiBUaGlzIGlzIHdyaXR0ZW4gaW4gYXNzZW1ibHkgYmVjYXVzZSB0aGUgZW50aXJlIGNvZGUgbmVlZHMgdG8gYmUgcG9zaXRpb24KKyAqIGluZGVwZW5kZW50LiAgTm90ZSB0aGF0IHRoZSBjb21waWxlciBkb2VzIG5vdCBnZW5lcmF0ZSBjb2RlIHRoYXQncyBwb3NpdGlvbgorICogaW5kZXBlbmRlbnQgYnkgaXRzZWxmIGJlY2F1c2UgaXQgcmVsaWVzIG9uIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGJlaW5nCisgKiByZWxvY2F0ZWQuCisgKi8KKwkudGV4dAorCS5wc3IgYWJpNjQKKwkucHNyIGxzYgorCS5sc2IKKworLyoKKyAqIFRoaXMgY29uc3RhbnQgZGV0ZXJtaW5lcyBob3cgbWFueSBSX0lBNjRfRlBUUjY0TFNCIHJlbG9jYXRpb25zIHdlCisgKiBjYW4gZGVhbCB3aXRoLiAgSWYgeW91IGdldCBFRklfQlVGRkVSX1RPT19TTUFMTCBlcnJvcnMsIHlvdSBtYXkKKyAqIG5lZWQgdG8gaW5jcmVhc2UgdGhpcyBudW1iZXIuCisgKi8KKyNkZWZpbmUgTUFYX0ZVTkNUSU9OX0RFU0NSSVBUT1JTCTc1MAorCisjZGVmaW5lIFNUX1ZBTFVFX09GRgk4CQkvKiBvZmZzZXQgb2Ygc3RfdmFsdWUgaW4gZWxmIHN5bSAqLworCisjZGVmaW5lIEVGSV9TVUNDRVNTCQkwCisjZGVmaW5lIEVGSV9MT0FEX0VSUk9SCQkxCisjZGVmaW5lIEVGSV9CVUZGRVJfVE9PX1NNQUxMCTUKKworI2RlZmluZSBEVF9OVUxMCQkwCQkvKiBNYXJrcyBlbmQgb2YgZHluYW1pYyBzZWN0aW9uICovCisjZGVmaW5lIERUX1JFTEEJCTcJCS8qIEFkZHJlc3Mgb2YgUmVsYSByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUkVMQVNaCTgJCS8qIFRvdGFsIHNpemUgb2YgUmVsYSByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUkVMQUVOVAk5CQkvKiBTaXplIG9mIG9uZSBSZWxhIHJlbG9jICovCisjZGVmaW5lIERUX1NZTVRBQgk2CQkvKiBBZGRyZXNzIG9mIHN5bWJvbCB0YWJsZSAqLworI2RlZmluZSBEVF9TWU1FTlQJMTEJCS8qIFNpemUgb2Ygb25lIHN5bWJvbCB0YWJsZSBlbnRyeSAqLworCisjZGVmaW5lIFJfSUE2NF9OT05FCQkwCisjZGVmaW5lIFJfSUE2NF9SRUw2NE1TQgkJMHg2ZQorI2RlZmluZSBSX0lBNjRfUkVMNjRMU0IJCTB4NmYKKyNkZWZpbmUgUl9JQTY0X0RJUjY0TVNCCQkweDI2CisjZGVmaW5lIFJfSUE2NF9ESVI2NExTQgkJMHgyNworI2RlZmluZSBSX0lBNjRfRlBUUjY0TVNCCTB4NDYKKyNkZWZpbmUgUl9JQTY0X0ZQVFI2NExTQgkweDQ3CisKKyNkZWZpbmUJbGRiYXNlCWluMAkvKiBsb2FkIGFkZHJlc3MgKGFkZHJlc3Mgb2YgLnRleHQpICovCisjZGVmaW5lCWR5bglpbjEJLyogYWRkcmVzcyBvZiBfRFlOQU1JQyAqLworCisjZGVmaW5lIGRfdGFnCXIxNgorI2RlZmluZSBkX3ZhbAlyMTcKKyNkZWZpbmUgcmVsYQlyMTgKKyNkZWZpbmUgcmVsYXN6CXIxOQorI2RlZmluZSByZWxhZW50CXIyMAorI2RlZmluZSBhZGRyCXIyMQorI2RlZmluZSByX2luZm8JcjIyCisjZGVmaW5lIHJfb2Zmc2V0IHIyMworI2RlZmluZSByX2FkZGVuZCByMjQKKyNkZWZpbmUgcl90eXBlCXIyNQorI2RlZmluZSByX3N5bQlyMjUJLyogYWxpYXMgb2Ygcl90eXBlICEgKi8KKyNkZWZpbmUgZnB0cglyMjYKKyNkZWZpbmUgZnB0cl9saW1pdCByMjcKKyNkZWZpbmUgc3ltdGFiCWY4CisjZGVmaW5lIHN5bWVudAlmOQorI2RlZmluZSBmdG1wCWYxMAorCisjZGVmaW5lCXRhcmdldAlyMTYKKyNkZWZpbmUgdmFsCXIxNworCisjZGVmaW5lIE5MT0MJMAorCisjZGVmaW5lIFBudWxsCQlwNgorI2RlZmluZSBQcmVsYQkJcDcKKyNkZWZpbmUgUHJlbGFzegkJcDgKKyNkZWZpbmUgUHJlbGFlbnQJcDkKKyNkZWZpbmUgUHN5bXRhYgkJcDEwCisjZGVmaW5lIFBzeW1lbnQJCXAxMQorCisjZGVmaW5lIFBub25lCQlwNgorI2RlZmluZSBQcmVsCQlwNworI2RlZmluZSBQZnB0cgkJcDgKKworI2RlZmluZSBQbW9yZQkJcDYKKworI2RlZmluZSBQb29tCQlwNgkvKiBvdXQtb2YtbWVtb3J5ICovCisKKwkuZ2xvYmFsIF9yZWxvY2F0ZQorCS5wcm9jIF9yZWxvY2F0ZQorX3JlbG9jYXRlOgorCWFsbG9jIHIyPWFyLnBmcywyLDAsMCwwCisJbW92bAlmcHRyID0gQGdwcmVsKGZwdHJfbWVtX2Jhc2UpCisJOzsKKwlhZGQJZnB0ciA9IGZwdHIsIGdwCisJbW92bAlmcHRyX2xpbWl0ID0gQGdwcmVsKGZwdHJfbWVtX2xpbWl0KQorCTs7CisJYWRkCWZwdHJfbGltaXQgPSBmcHRyX2xpbWl0LCBncAorCitzZWFyY2hfZHluYW1pYzoKKwlsZDgJZF90YWcgPSBbZHluXSw4CisJOzsKKwlsZDgJZF92YWwgPSBbZHluXSw4CisJY21wLmVxCVBudWxsLHAwID0gRFRfTlVMTCxkX3RhZworKFBudWxsKQlici5jb25kLnNwdGsuZmV3IGFwcGx5X3JlbG9jcworCWNtcC5lcQlQcmVsYSxwMCA9IERUX1JFTEEsZF90YWcKKwljbXAuZXEJUHJlbGFzeixwMCA9IERUX1JFTEFTWixkX3RhZworCWNtcC5lcQlQc3ltdGFiLHAwID0gRFRfU1lNVEFCLGRfdGFnCisJY21wLmVxCVBzeW1lbnQscDAgPSBEVF9TWU1FTlQsZF90YWcKKwljbXAuZXEJUHJlbGFlbnQscDAgPSBEVF9SRUxBRU5ULGRfdGFnCisJOzsKKyhQcmVsYSkJYWRkIHJlbGEgPSBkX3ZhbCwgbGRiYXNlCisoUHJlbGFzeikgbW92IHJlbGFzeiA9IGRfdmFsCisoUHJlbGFlbnQpIG1vdiByZWxhZW50ID0gZF92YWwKKyhQc3ltdGFiKSBhZGQgdmFsID0gZF92YWwsIGxkYmFzZQorCTs7CisoUHN5bWVudCkgc2V0Zi5zaWcgc3ltZW50ID0gZF92YWwKKwk7OworKFBzeW10YWIpIHNldGYuc2lnIHN5bXRhYiA9IHZhbAorCWJyLnNwdGsuZmV3IHNlYXJjaF9keW5hbWljCisKK2FwcGx5X2xvb3A6CisJbGQ4CXJfb2Zmc2V0ID0gW3JlbGFdCisJYWRkCWFkZHIgPSA4LHJlbGEKKwlzdWIJcmVsYXN6ID0gcmVsYXN6LHJlbGFlbnQKKwk7OworCisJbGQ4CXJfaW5mbyA9IFthZGRyXSw4CisJOzsKKwlsZDgJcl9hZGRlbmQgPSBbYWRkcl0KKwlhZGQJdGFyZ2V0ID0gbGRiYXNlLCByX29mZnNldAorCisJYWRkCXJlbGEgPSByZWxhLHJlbGFlbnQKKwlleHRyLnUJcl90eXBlID0gcl9pbmZvLCAwLCAzMgorCTs7CisJY21wLmVxCVBub25lLHAwID0gUl9JQTY0X05PTkUscl90eXBlCisJY21wLmVxCVByZWwscDAgPSBSX0lBNjRfUkVMNjRMU0Iscl90eXBlCisJY21wLmVxCVBmcHRyLHAwID0gUl9JQTY0X0ZQVFI2NExTQixyX3R5cGUKKyhQcmVsKQlici5jb25kLnNwdGsuZmV3IGFwcGx5X1JFTDY0CisJOzsKKwljbXAuZXEJUHJlbCxwMCA9IFJfSUE2NF9ESVI2NExTQixyX3R5cGUgLy8gdHJlYXQgRElSNjQganVzdCBsaWtlIFJFTDY0CisKKyhQbm9uZSkJYnIuY29uZC5zcHRrLmZldyBhcHBseV9yZWxvY3MKKyhQcmVsKQlici5jb25kLnNwdGsuZmV3IGFwcGx5X1JFTDY0CisoUGZwdHIpCWJyLmNvbmQuc3B0ay5mZXcgYXBwbHlfRlBUUjY0CisKKwltb3YJcjggPSBFRklfTE9BRF9FUlJPUgorCWJyLnJldC5zcHRrLmZldyBycAorCithcHBseV9yZWxvY3M6CisJY21wLmx0dQlQbW9yZSxwMD0wLHJlbGFzegorKFBtb3JlKQlici5jb25kLnNwdGsuZmV3IGFwcGx5X2xvb3AKKworCW1vdglyOCA9IEVGSV9TVUNDRVNTCisJYnIucmV0LnNwdGsuZmV3IHJwCisKK2FwcGx5X1JFTDY0OgorCWxkOCB2YWwgPSBbdGFyZ2V0XQorCTs7CisJYWRkIHZhbCA9IHZhbCxsZGJhc2UKKwk7OworCXN0OCBbdGFyZ2V0XSA9IHZhbAorCWJyLmNvbmQuc3B0ay5mZXcgYXBwbHlfcmVsb2NzCisKKwkvLyBGUFRSIHJlbG9jcyBhcmUgYSBiaXQgbW9yZSBpbnRlcmVzdGluZzogd2UgbmVlZCB0byBsb29rdXAKKwkvLyB0aGUgc3ltYm9sJ3MgdmFsdWUgaW4gc3ltdGFiLCBhbGxvY2F0ZSAxNiBieXRlcyBvZiBtZW1vcnksCisJLy8gc3RvcmUgdGhlIHZhbHVlIGluIFt0YXJnZXRdIGluIHRoZSBmaXJzdCBhbmQgdGhlIGdwIGluIHRoZQorCS8vIHNlY29uZCBkd29yZC4KK2FwcGx5X0ZQVFI2NDoKKwlzdDgJW3RhcmdldF0gPSBmcHRyCisJZXh0ci51CXJfc3ltID0gcl9pbmZvLDMyLDMyCisJYWRkCXRhcmdldCA9IDgsZnB0cgorCTs7CisKKwlzZXRmLnNpZyBmdG1wID0gcl9zeW0KKwltb3YJcjg9RUZJX0JVRkZFUl9UT09fU01BTEwKKwk7OworCWNtcC5nZXUJUG9vbSxwMCA9IGZwdHIsZnB0cl9saW1pdAorCisJeG1hLmx1CWZ0bXAgPSBmdG1wLHN5bWVudCxzeW10YWIKKyhQb29tKQlici5yZXQuc3B0ay5mZXcgcnAKKwk7OworCWdldGYuc2lnIGFkZHIgPSBmdG1wCisJc3Q4CVt0YXJnZXRdID0gZ3AKKwk7OworCWFkZAlhZGRyID0gU1RfVkFMVUVfT0ZGLCBhZGRyCisJOzsKKwlsZDgJdmFsID0gW2FkZHJdCisJOzsKKwlhZGQJdmFsID0gdmFsLGxkYmFzZQorCTs7CisJc3Q4CVtmcHRyXSA9IHZhbCwxNgorCWJyLmNvbmQuc3B0ay5mZXcgYXBwbHlfcmVsb2NzCisKKwkuZW5kcCBfcmVsb2NhdGUKKworCS5kYXRhCisJLmFsaWduIDE2CitmcHRyX21lbV9iYXNlOgorCS5zcGFjZSAgTUFYX0ZVTkNUSU9OX0RFU0NSSVBUT1JTKjE2CitmcHRyX21lbV9saW1pdDoKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL3JlbG9jX3g4Nl82NC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvcmVsb2NfeDg2XzY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiNGRkYgotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL3JlbG9jX3g4Nl82NC5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIHJlbG9jX3g4Nl82NC5jIC0gcG9zaXRpb24gaW5kZXBlbmRlbnQgeDg2XzY0IEVMRiBzaGFyZWQgb2JqZWN0IHJlbG9jYXRvcgorICAgQ29weXJpZ2h0IChDKSAxOTk5IEhld2xldHQtUGFja2FyZCBDby4KKwlDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXIgPGRhdmlkbUBocGwuaHAuY29tPi4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBJbnRlbCBDby4KKwlDb250cmlidXRlZCBieSBGZW5naHVhIFl1IDxmZW5naHVhLnl1QGludGVsLmNvbT4uCisKKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSGV3bGV0dC1QYWNrYXJkIENvLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyAgICBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICAgIEJFIExJQUJMRSBGT1IgQU5ZRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgICAgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgICAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgICAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YKKyAgICBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAgICBTVUNIIERBTUFHRS4KKyovCisKKyNpbmNsdWRlIDxlZmkuaD4KKyNpbmNsdWRlIDxlZmlsaWIuaD4KKworI2luY2x1ZGUgPGVsZi5oPgorCitFRklfU1RBVFVTIF9yZWxvY2F0ZSAobG9uZyBsZGJhc2UsIEVsZjY0X0R5biAqZHluLCBFRklfSEFORExFIGltYWdlLCBFRklfU1lTVEVNX1RBQkxFICpzeXN0YWIpCit7CisJbG9uZyByZWxzeiA9IDAsIHJlbGVudCA9IDA7CisJRWxmNjRfUmVsICpyZWwgPSAwOworCXVuc2lnbmVkIGxvbmcgKmFkZHI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBkeW5baV0uZF90YWcgIT0gRFRfTlVMTDsgKytpKSB7CisJCXN3aXRjaCAoZHluW2ldLmRfdGFnKSB7CisJCQljYXNlIERUX1JFTEE6CisJCQkJcmVsID0gKEVsZjY0X1JlbCopCisJCQkJCSgodW5zaWduZWQgbG9uZylkeW5baV0uZF91bi5kX3B0cgorCQkJCQkgKyBsZGJhc2UpOworCQkJCWJyZWFrOworCisJCQljYXNlIERUX1JFTEFTWjoKKwkJCQlyZWxzeiA9IGR5bltpXS5kX3VuLmRfdmFsOworCQkJCWJyZWFrOworCisJCQljYXNlIERUX1JFTEFFTlQ6CisJCQkJcmVsZW50ID0gZHluW2ldLmRfdW4uZF92YWw7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKyAgICAgICAgaWYgKCFyZWwgJiYgcmVsZW50ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEVGSV9TVUNDRVNTOworCisgCWlmICghcmVsIHx8IHJlbGVudCA9PSAwKQorIAkJcmV0dXJuIEVGSV9MT0FEX0VSUk9SOworCisJd2hpbGUgKHJlbHN6ID4gMCkgeworCQkvKiBhcHBseSB0aGUgcmVsb2NzICovCisJCXN3aXRjaCAoRUxGNjRfUl9UWVBFIChyZWwtPnJfaW5mbykpIHsKKwkJCWNhc2UgUl9YODZfNjRfTk9ORToKKwkJCQlicmVhazsKKworCQkJY2FzZSBSX1g4Nl82NF9SRUxBVElWRToKKwkJCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcgKikKKwkJCQkJKGxkYmFzZSArIHJlbC0+cl9vZmZzZXQpOworCQkJCSphZGRyICs9IGxkYmFzZTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQlyZWwgPSAoRWxmNjRfUmVsKikgKChjaGFyICopIHJlbCArIHJlbGVudCk7CisJCXJlbHN6IC09IHJlbGVudDsKKwl9CisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvc2V0am1wX2lhMzIuUyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL3NldGptcF9pYTMyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3MWNhZgotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL3NldGptcF9pYTMyLlMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyogVGhpcyBpcyBzdG9sZW4gZnJvbSBsaWJjL3g4Ni9zZXRqbXAuUyBpbiB0aGUgT1NLaXQgKi8KKy8qIAorICogTWFjaCBPcGVyYXRpbmcgU3lzdGVtCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsMTk5MCwxOTg5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLCBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLCBhbmQgYW55IHBvcnRpb25zCisgKiB0aGVyZW9mLCBhbmQgdGhhdCBib3RoIG5vdGljZXMgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKyAqIAorICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUyAiQVMgSVMiCisgKiBDT05ESVRJT04uICBDQVJORUdJRSBNRUxMT04gRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgT0YgQU5ZIEtJTkQgRk9SCisgKiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqIAorICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCisgKiAKKyAqICBTb2Z0d2FyZSBEaXN0cmlidXRpb24gQ29vcmRpbmF0b3IgIG9yICBTb2Z0d2FyZS5EaXN0cmlidXRpb25AQ1MuQ01VLkVEVQorICogIFNjaG9vbCBvZiBDb21wdXRlciBTY2llbmNlCisgKiAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqICBQaXR0c2J1cmdoIFBBIDE1MjEzLTM4OTAKKyAqIAorICogYW55IGltcHJvdmVtZW50cyBvciBleHRlbnNpb25zIHRoYXQgdGhleSBtYWtlIGFuZCBncmFudCBDYXJuZWdpZSBNZWxsb24KKyAqIHRoZSByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCisgKi8KKy8qCisgKiBDIGxpYnJhcnkgLS0gX3NldGptcCwgX2xvbmdqbXAKKyAqCisgKiAgICAgIF9sb25nam1wKGEsdikKKyAqIHdpbGwgZ2VuZXJhdGUgYSAicmV0dXJuKHYpIiBmcm9tCisgKiB0aGUgbGFzdCBjYWxsIHRvCisgKiAgICAgIF9zZXRqbXAoYSkKKyAqIGJ5IHJlc3RvcmluZyByZWdpc3RlcnMgZnJvbSB0aGUgc3RhY2ssCisgKiBUaGUgcHJldmlvdXMgc2lnbmFsIHN0YXRlIGlzIE5PVCByZXN0b3JlZC4KKyAqCisgKi8KKworI2RlZmluZSBFWFRfQyhzeW0pIHN5bQorI2RlZmluZSBGVU5DVElPTih4KSAgICAgLmdsb2JsIEVYVF9DKHgpIDsgLnR5cGUgRVhUX0MoeCksIEBmdW5jdGlvbiA7IEVYVF9DKHgpOgorCisJLmZpbGUJInNldGptcC5TIgorCisJLnRleHQKKwkKK0ZVTkNUSU9OKHNldGptcCkKKwltb3ZsCTQoJWVzcCksICVlY3gJCS8qIGZldGNoIGJ1ZmZlciAqLworCW1vdmwJJWVieCwgMCglZWN4KQorCW1vdmwJJWVzaSwgNCglZWN4KQorCW1vdmwJJWVkaSwgOCglZWN4KQorCW1vdmwJJWVicCwgMTIoJWVjeCkJCS8qIHNhdmUgZnJhbWUgcG9pbnRlciBvZiBjYWxsZXIgKi8KKwlwb3BsCSVlZHgKKwltb3ZsCSVlc3AsIDE2KCVlY3gpCQkvKiBzYXZlIHN0YWNrIHBvaW50ZXIgb2YgY2FsbGVyICovCisJbW92bAklZWR4LCAyMCglZWN4KQkJLyogc2F2ZSBwYyBvZiBjYWxsZXIgKi8KKwl4b3JsCSVlYXgsICVlYXgKKyAgICAgICAgam1wICAgICAqJWVkeAorCitGVU5DVElPTihsb25nam1wKQorCW1vdmwJOCglZXNwKSwgJWVheAkJLyogcmV0dXJuKHYpICovCisJbW92bAk0KCVlc3ApLCAlZWN4CQkvKiBmZXRjaCBidWZmZXIgKi8KKwltb3ZsCTAoJWVjeCksICVlYngKKwltb3ZsCTQoJWVjeCksICVlc2kKKwltb3ZsCTgoJWVjeCksICVlZGkKKwltb3ZsCTEyKCVlY3gpLCAlZWJwCisJbW92bAkxNiglZWN4KSwgJWVzcAorCW9ybAklZWF4LCAlZWF4CisJam56CTBmCisJaW5jbAklZWF4CiswOglqbXAJKjIwKCVlY3gpCQkvKiBkb25lLCByZXR1cm4uLi4uICovCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9zZXRqbXBfaWE2NC5TIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvc2V0am1wX2lhNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTk3M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9nbnVlZmkvc2V0am1wX2lhNjQuUwpAQCAtMCwwICsxLDIgQEAKKworI3dhcm5pbmcgbm90IGltcGxlbWVudGVkCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9zZXRqbXBfeDg2XzY0LlMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2dudWVmaS9zZXRqbXBfeDg2XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmOTM3OAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvZ251ZWZpL3NldGptcF94ODZfNjQuUwpAQCAtMCwwICsxLDU2IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2RlZmluZSBFWFRfQyhzeW0pIHN5bQorI2RlZmluZSBGVU5DVElPTih4KSAgICAgLmdsb2JsIEVYVF9DKHgpIDsgLnR5cGUgRVhUX0MoeCksIEBmdW5jdGlvbiA7IEVYVF9DKHgpOgorCisJLmZpbGUJInNldGptcC5TIgorCisJLnRleHQKKworLyoKKyAqIGludCBzZXRqbXAgKGptcF9idWYgZW52KQorICovCitGVU5DVElPTihzZXRqbXApCisJcG9wCSVyc2kJCS8qIFJldHVybiBhZGRyZXNzLCBhbmQgYWRqdXN0IHRoZSBzdGFjayAqLworCXhvcgklcmF4LCAlcmF4CisJbW92cQklcmJ4LCAwKCVyZGkpCS8qIFJCWCAqLworCW1vdnEJJXJzcCwgOCglcmRpKSAgIC8qIFJTUCAqLworCXB1c2gJJXJzaQorCW1vdnEJJXJicCwgMTYoJXJkaSkJLyogUkJQICovCisJbW92cQklcjEyLCAyNCglcmRpKQkvKiBSMTIgKi8KKwltb3ZxCSVyMTMsIDMyKCVyZGkpCS8qIFIxMyAqLworCW1vdnEJJXIxNCwgNDAoJXJkaSkJLyogUjE0ICovCisJbW92cQklcjE1LCA0OCglcmRpKQkvKiBSMTUgKi8KKwltb3ZxCSVyc2ksIDU2KCVyZGkpCS8qIFJTSSAqLworCXJldAorCisvKgorICogaW50IGxvbmdqbXAgKGptcF9idWYgZW52LCBpbnQgdmFsKQorICovCitGVU5DVElPTihsb25nam1wKQorCW1vdmwJJWVzaSwgJWVheAorCW1vdnEJKCVyZGkpLCAlcmJ4CisJbW92cQk4KCVyZGkpLCAlcnNwCisJbW92cQkxNiglcmRpKSwgJXJicAorCW1vdnEJMjQoJXJkaSksICVyMTIKKwltb3ZxICAgIDMyKCVyZGkpLCAlcjEzCisJbW92cSAgICA0MCglcmRpKSwgJXIxNAorCW1vdnEgICAgNDgoJXJkaSksICVyMTUKKwlqbXAJKjU2KCVyZGkpCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL01ha2VmaWxlIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZDMwMwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL01ha2VmaWxlCkBAIC0wLDAgKzEsMjcgQEAKK1NSQ0RJUiA9IC4KKworVlBBVEggPSAkKFNSQ0RJUikKKworaW5jbHVkZSAkKFNSQ0RJUikvLi4vTWFrZS5kZWZhdWx0cworCitUT1BESVIgPSAkKFNSQ0RJUikvLi4KKworQ0RJUj0kKFRPUERJUikvLi4KKworYWxsOgorCitjbGVhbjoKKworaW5zdGFsbDoKKwlta2RpciAtcCAkKElOU1RBTExST09UKSQoUFJFRklYKS9pbmNsdWRlL2VmaQorCW1rZGlyIC1wICQoSU5TVEFMTFJPT1QpJChQUkVGSVgpL2luY2x1ZGUvZWZpL3Byb3RvY29sCisJbWtkaXIgLXAgJChJTlNUQUxMUk9PVCkkKFBSRUZJWCkvaW5jbHVkZS9lZmkvJChBUkNIKQorCSQoSU5TVEFMTCkgLW0gNjQ0ICQoU1JDRElSKS8qLmggJChJTlNUQUxMUk9PVCkkKFBSRUZJWCkvaW5jbHVkZS9lZmkKKwkkKElOU1RBTEwpIC1tIDY0NCAkKFNSQ0RJUikvcHJvdG9jb2wvKi5oICQoSU5TVEFMTFJPT1QpJChQUkVGSVgpL2luY2x1ZGUvZWZpL3Byb3RvY29sCisJJChJTlNUQUxMKSAtbSA2NDQgJChTUkNESVIpLyQoQVJDSCkvKi5oICQoSU5TVEFMTFJPT1QpJChQUkVGSVgpL2luY2x1ZGUvZWZpLyQoQVJDSCkKK2lmZXEgKCQoQVJDSCksaWE2NCkKKwlta2RpciAtcCAkKElOU1RBTExST09UKSQoUFJFRklYKS9pbmNsdWRlL2VmaS9wcm90b2NvbC9pYTY0CisJJChJTlNUQUxMKSAtbSA2NDQgJChTUkNESVIpL3Byb3RvY29sL2lhNjQvKi5oICQoSU5TVEFMTFJPT1QpJChQUkVGSVgpL2luY2x1ZGUvZWZpL3Byb3RvY29sL2lhNjQKK2VuZGlmCisKK2luY2x1ZGUgJChTUkNESVIpLy4uL01ha2UucnVsZXMKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2FyZ2lmeS5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvYXJnaWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmM2RjOAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2FyZ2lmeS5oCkBAIC0wLDAgKzEsNDEgQEAKKworCisvKgorICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEhld2xldHQtUGFja2FyZCBDby4KKyAqICAgICAgQ29udHJpYnV0ZWQgYnkgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogICAgICBDb250cmlidXRlZCBieSBCcmVudCBDYXNhdmFudCA8YmNhc2F2YW5Ac2dpLmNvbT4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgICAgQ29udHJpYnV0ZWQgYnkgRmVuZ2h1YSBZdSA8ZmVuZ2h1YS55dUBpbnRlbC5jb20+CisgKiAgICAgIENvbnRyaWJ1dGVkIGJ5IEJpYm8gTWFvIDxiaWJvLm1hb0BpbnRlbC5jb20+CisgKiAgICAgIENvbnRyaWJ1dGVkIGJ5IENoYW5kcmFtb3VsaSBOYXJheWFuYW4gPG1vdWxpQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRUxJTE8sIHRoZSBFRkkgTGludXggYm9vdCBsb2FkZXIuCisgKgorICogIEVMSUxPIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgRUxJTE8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggRUxJTE87IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2UgY2hlY2sgb3V0IHRoZSBlbGlsby50eHQgZm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gb24gaG93CisgKiB0byB1c2UgdGhpcyBwcm9ncmFtLgorICovCisKKworI2RlZmluZSBNQVhfQVJHUyAyNTYKKworSU5UTgorYXJnaWZ5KENIQVIxNiAqYnVmLCBVSU5UTiBsZW4sIENIQVIxNiAqKmFyZ3YpOworCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmkuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDI3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmkuaApAQCAtMCwwICsxLDUzIEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmkuaAorCitBYnN0cmFjdDoKKworICAgIFB1YmxpYyBFRkkgaGVhZGVyIGZpbGVzCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIEJ1aWxkIGZsYWdzIG9uIGlucHV0CisvLyAgRUZJMzIKKy8vICBFRklfREVCVUcgICAgICAgICAgICAgICAtIEVuYWJsZSBkZWJ1Z2dpbmcgY29kZQorLy8gIEVGSV9OVF9FTVVMQVRPUiAgICAgICAgIC0gQnVpbGRpbmcgZm9yIHJ1bm5pbmcgdW5kZXIgTlQKKy8vCisKKworI2lmbmRlZiBfRUZJX0lOQ0xVREVfCisjZGVmaW5lIF9FRklfSU5DTFVERV8KKworI2RlZmluZSBFRklfRklSTVdBUkVfVkVORE9SICAgICAgICAgTCJJTlRFTCIKKyNkZWZpbmUgRUZJX0ZJUk1XQVJFX01BSk9SX1JFVklTSU9OIDEyCisjZGVmaW5lIEVGSV9GSVJNV0FSRV9NSU5PUl9SRVZJU0lPTiAzMworI2RlZmluZSBFRklfRklSTVdBUkVfUkVWSVNJT04gKChFRklfRklSTVdBUkVfTUFKT1JfUkVWSVNJT04gPDwxNikgfCAoRUZJX0ZJUk1XQVJFX01JTk9SX1JFVklTSU9OKSkKKworI2luY2x1ZGUgImVmaWJpbmQuaCIKKyNpbmNsdWRlICJlZmlkZWYuaCIKKyNpbmNsdWRlICJlZmlkZXZwLmgiCisjaW5jbHVkZSAiZWZpcGNpaW8uaCIKKyNpbmNsdWRlICJlZmlwcm90LmgiCisjaW5jbHVkZSAiZWZpY29uLmgiCisjaW5jbHVkZSAiZWZpc2VyLmgiCisjaW5jbHVkZSAiZWZpX25paS5oIgorI2luY2x1ZGUgImVmaXB4ZWJjLmgiCisjaW5jbHVkZSAiZWZpbmV0LmgiCisjaW5jbHVkZSAiZWZpYXBpLmgiCisjaW5jbHVkZSAiZWZpZnMuaCIKKyNpbmNsdWRlICJlZmllcnIuaCIKKyNpbmNsdWRlICJlZml1aS5oIgorI2luY2x1ZGUgImVmaWlwLmgiCisjaW5jbHVkZSAiZWZpdWRwLmgiCisjaW5jbHVkZSAiZWZpdGNwLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpX25paS5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpX25paS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2E1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlfbmlpLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBfRUZJX05JSV9ICisjZGVmaW5lIF9FRklfTklJX0gKKworLyorKworQ29weXJpZ2h0IChjKSAyMDAwICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgbmFtZToKKyAgICBlZmlfbmlpLmgKKworQWJzdHJhY3Q6CisKK1JldmlzaW9uIGhpc3Rvcnk6CisgICAgMjAwMC1GZWItMTggTShmKUogICBHVUlEIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgU3RydWN0dXJlIG9yZGVyIGNoYW5nZWQgZm9yIG1hY2hpbmUgd29yZCBhbGlnbm1lbnQuCisgICAgICAgICAgICAgICAgQWRkZWQgU3RyaW5nSWRbNF0gdG8gc3RydWN0dXJlLgorICAgICAgICAgICAgICAgIAorICAgIDIwMDAtRmViLTE0IE0oZilKICAgR2VuZXNpcy4KKy0tKi8KKworI2RlZmluZSBFRklfTkVUV09SS19JTlRFUkZBQ0VfSURFTlRJRklFUl9QUk9UT0NPTCBcCisgICAgeyAweEUxODU0MUNELCAweEY3NTUsIDB4NGY3MywgezB4OTIsIDB4OEQsIDB4NjQsIDB4M0MsIDB4OEEsIDB4NzksIDB4QjIsIDB4Mjl9IH0KKworI2RlZmluZSBFRklfTkVUV09SS19JTlRFUkZBQ0VfSURFTlRJRklFUl9JTlRFUkZBQ0VfUkVWSVNJT04gMHgwMDAxMDAwMAorCit0eXBlZGVmIGVudW0geworICAgIEVmaU5ldHdvcmtJbnRlcmZhY2VVbmRpID0gMQorfSBFRklfTkVUV09SS19JTlRFUkZBQ0VfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgVUlOVDY0IFJldmlzaW9uOworICAgIC8vIFJldmlzaW9uIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpZGVudGlmaWVyIHByb3RvY29sIGludGVyZmFjZS4KKworICAgIFVJTlQ2NCBJRDsKKyAgICAvLyBBZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBpZGVudGlmeWluZyBzdHJ1Y3R1cmUgZm9yIHRoaXMKKyAgICAvLyBuZXR3b3JrIGludGVyZmFjZS4gIFRoaXMgaXMgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gc3RydWN0dXJlLgorICAgIC8vCisgICAgLy8gRm9yIFBYRS9VTkRJIHRoaXMgaXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlICFQWEUgc3RydWN0dXJlLgorCisgICAgVUlOVDY0IEltYWdlQWRkcjsKKyAgICAvLyBBZGRyZXNzIG9mIHRoZSBVTnJlbG9jYXRlZCBkcml2ZXIvUk9NIGltYWdlLiAgVGhpcyBpcyBzZXQKKyAgICAvLyB0byB6ZXJvIGlmIHRoZXJlIGlzIG5vIGRyaXZlci9ST00gaW1hZ2UuCisgICAgLy8KKyAgICAvLyBGb3IgMTYtYml0IFVOREksIHRoaXMgaXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG9wdGlvbiBST00gaW4KKyAgICAvLyB1cHBlciBtZW1vcnkuCisgICAgLy8KKyAgICAvLyBGb3IgMzIvNjQtYml0IFMvVyBVTkRJLCB0aGlzIGlzIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBFRkkgUk9NCisgICAgLy8gaW1hZ2UuCisgICAgLy8KKyAgICAvLyBGb3IgSC9XIFVOREksIHRoaXMgaXMgc2V0IHRvIHplcm8uCisKKyAgICBVSU5UMzIgSW1hZ2VTaXplOworICAgIC8vIFNpemUgb2YgdGhlIFVOcmVsb2NhdGVkIGRyaXZlci9ST00gaW1hZ2Ugb2YgdGhpcyBuZXR3b3JrIGludGVyZmFjZS4KKyAgICAvLyBUaGlzIGlzIHNldCB0byB6ZXJvIGlmIHRoZXJlIGlzIG5vIGRyaXZlci9ST00gaW1hZ2UuCisKKyAgICBDSEFSOCBTdHJpbmdJZFs0XTsKKyAgICAvLyA0IGNoYXIgQVNDSUkgc3RyaW5nIHRvIGdvIGluIGNsYXNzIGlkZW50aWZpZXIgKG9wdGlvbiA2MCkgaW4gREhDUAorICAgIC8vIGFuZCBCb290IFNlcnZlciBkaXNjb3ZlciBwYWNrZXRzLgorICAgIC8vIEZvciBFZmlOZXR3b3JrSW50ZXJmYWNlVW5kaSB0aGlzIGZpZWxkIGlzICJVTkRJIi4KKyAgICAvLyBGb3IgRWZpTmV0d29ya0ludGVyZmFjZVNucCB0aGlzIGZpZWxkIGlzICJTTlBOIi4KKworICAgIFVJTlQ4IFR5cGU7CisgICAgVUlOVDggTWFqb3JWZXI7CisgICAgVUlOVDggTWlub3JWZXI7CisgICAgLy8gSW5mb3JtYXRpb24gdG8gYmUgcGxhY2VkIGludG8gdGhlIFBYRSBESENQIGFuZCBEaXNjb3ZlciBwYWNrZXRzLgorICAgIC8vIFRoaXMgaXMgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHR5cGUgYW5kIHZlcnNpb24gbnVtYmVyIHRoYXQgd2lsbAorICAgIC8vIGJlIHBsYWNlZCBpbnRvIERIQ1Agb3B0aW9uIDk0IChjbGllbnQgbmV0d29yayBpbnRlcmZhY2UgaWRlbnRpZmllcikuCisgICAgQk9PTEVBTiBJcHY2U3VwcG9ydGVkOworCVVJTlQ4ICAgSWZOdW07CS8vIGludGVyZmFjZSBudW1iZXIgdG8gYmUgdXNlZCB3aXRoIHB4ZWlkIHN0cnVjdHVyZQorfSBFRklfTkVUV09SS19JTlRFUkZBQ0VfSURFTlRJRklFUl9JTlRFUkZBQ0U7CisKK2V4dGVybiBFRklfR1VJRCBOZXR3b3JrSW50ZXJmYWNlSWRlbnRpZmllclByb3RvY29sOworCisjZW5kaWYgLy8gX0VGSV9OSUlfSApkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpX3B4ZS5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpX3B4ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDI1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlfcHhlLmgKQEAgLTAsMCArMSwxNzQzIEBACisjaWZuZGVmIF9FRklfUFhFX0gKKyNkZWZpbmUgX0VGSV9QWEVfSAorCisKKy8qKysKK0NvcHlyaWdodCAoYykgSW50ZWwgIDE5OTkKKworTW9kdWxlIG5hbWU6CisgICAgZWZpX3B4ZS5oCisKKzMyLzY0LWJpdCBQWEUgc3BlY2lmaWNhdGlvbjoKKyAgICBhbHBoYS00LCA5OS1EZWMtMTcKKworQWJzdHJhY3Q6CisgICAgVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhbGwgb2YgdGhlIFBYRSB0eXBlIGRlZmluaXRpb25zLAorICAgIHN0cnVjdHVyZSBwcm90b3R5cGVzLCBnbG9iYWwgdmFyaWFibGVzIGFuZCBjb25zdGFudHMgdGhhdAorICAgIGFyZSBuZWVkZWQgZm9yIHBvcnRpbmcgUFhFIHRvIEVGSS4KKy0tKi8KKworI3ByYWdtYSBwYWNrKDEpCisKKyNkZWZpbmUgUFhFX0lOVEVMX09SREVSICAgICAgICAgMSAgIC8vIEludGVsIG9yZGVyCisvLyNkZWZpbmUgUFhFX05FVFdPUktfT1JERVIgICAgICAgICAxICAgLy8gbmV0d29yayBvcmRlcgorCisjZGVmaW5lIFBYRV9VSU5UNjRfU1VQUE9SVCAgICAgICAgICAxICAgLy8gVUlOVDY0IHN1cHBvcnRlZAorLy8jZGVmaW5lIFBYRV9OT19VSU5UNjRfU1VQUE9SVCAgICAgMSAgIC8vIFVJTlQ2NCBub3Qgc3VwcG9ydGVkCisKKyNkZWZpbmUgUFhFX0JVU1RZUEUoYSxiLGMsZCkgICAgICAgICAgICBcCisoKCgoUFhFX1VJTlQzMikoZCkgJiAweEZGKSA8PCAyNCkgfCBcCisoKChQWEVfVUlOVDMyKShjKSAmIDB4RkYpIDw8IDE2KSB8ICBcCisoKChQWEVfVUlOVDMyKShiKSAmIDB4RkYpIDw8IDgpIHwgICAgICAgXAorKChQWEVfVUlOVDMyKShhKSAmIDB4RkYpKQorCisvLworLy8gVU5ESSBST00gSUQgYW5kIGRldml2ZSBJRCBzaWduYXR1cmUKKy8vCisjZGVmaW5lIFBYRV9CVVNUWVBFX1BYRSAgICAgICAgIFBYRV9CVVNUWVBFKCchJywgJ1AnLCAnWCcsICdFJykKKworLy8KKy8vIEJVUyBST00gSUQgc2lnbmF0dXJlcworLy8KKyNkZWZpbmUgUFhFX0JVU1RZUEVfUENJICAgICAgICAgUFhFX0JVU1RZUEUoJ1AnLCAnQycsICdJJywgJ1InKQorI2RlZmluZSBQWEVfQlVTVFlQRV9QQ19DQVJEICAgICBQWEVfQlVTVFlQRSgnUCcsICdDJywgJ0MnLCAnUicpCisjZGVmaW5lIFBYRV9CVVNUWVBFX1VTQiAgICAgICAgIFBYRV9CVVNUWVBFKCdVJywgJ1MnLCAnQicsICdSJykKKyNkZWZpbmUgUFhFX0JVU1RZUEVfMTM5NCAgICAgICAgUFhFX0JVU1RZUEUoJzEnLCAnMycsICc5JywgJzQnKQorCisjZGVmaW5lIFBYRV9TV0FQX1VJTlQxNihuKSAgICAgICAgICBcCisoKCgoUFhFX1VJTlQxNikobikgJiAweDAwRkYpIDw8IDgpIHwgICAgXAorKCgoUFhFX1VJTlQxNikobikgJiAweEZGMDApID4+IDgpKQorCisjZGVmaW5lIFBYRV9TV0FQX1VJTlQzMihuKSAgICAgICAgICAgICAgXAorKCgoKFBYRV9VSU5UMzIpKG4pICYgMHgwMDAwMDBGRikgPDwgMjQpIHwgICBcCisoKChQWEVfVUlOVDMyKShuKSAmIDB4MDAwMEZGMDApIDw8IDgpIHwgICAgIFwKKygoKFBYRV9VSU5UMzIpKG4pICYgMHgwMEZGMDAwMCkgPj4gOCkgfCAgICAgXAorKCgoUFhFX1VJTlQzMikobikgJiAweEZGMDAwMDAwKSA+PiAyNCkpCisKKyNpZiBQWEVfVUlOVDY0X1NVUFBPUlQgIT0gMAorI2RlZmluZSBQWEVfU1dBUF9VSU5UNjQobikgICAgICAgICAgICAgICAgICBcCisoKCgoUFhFX1VJTlQ2NCkobikgJiAweDAwMDAwMDAwMDAwMDAwRkYpIDw8IDU2KSB8ICAgXAorKCgoUFhFX1VJTlQ2NCkobikgJiAweDAwMDAwMDAwMDAwMEZGMDApIDw8IDQwKSB8ICAgIFwKKygoKFBYRV9VSU5UNjQpKG4pICYgMHgwMDAwMDAwMDAwRkYwMDAwKSA8PCAyNCkgfCAgICBcCisoKChQWEVfVUlOVDY0KShuKSAmIDB4MDAwMDAwMDBGRjAwMDAwMCkgPDwgOCkgfCBcCisoKChQWEVfVUlOVDY0KShuKSAmIDB4MDAwMDAwRkYwMDAwMDAwMCkgPj4gOCkgfCBcCisoKChQWEVfVUlOVDY0KShuKSAmIDB4MDAwMEZGMDAwMDAwMDAwMCkgPj4gMjQpIHwgICAgXAorKCgoUFhFX1VJTlQ2NCkobikgJiAweDAwRkYwMDAwMDAwMDAwMDApID4+IDQwKSB8ICAgIFwKKygoKFBYRV9VSU5UNjQpKG4pICYgMHhGRjAwMDAwMDAwMDAwMDAwKSA+PiA1NikpCisjZW5kaWYgLy8gUFhFX1VJTlQ2NF9TVVBQT1JUCisKKyNpZiBQWEVfTk9fVUlOVDY0X1NVUFBPUlQgIT0gMAorI2RlZmluZSBQWEVfU1dBUF9VSU5UNjQobikgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1BYRV9VSU5UMzIgdG1wID0gKFBYRV9VSU5UNjQpKG4pWzFdOyAgICAgICAgICAgICAgICBcCisoUFhFX1VJTlQ2NCkobilbMV0gPSBQWEVfU1dBUF9VSU5UMzIoKFBYRV9VSU5UNjQpKG4pWzBdKTsgICBcCisoUFhFX1VJTlQ2NCkobilbMF0gPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gUFhFX05PX1VJTlQ2NF9TVVBQT1JUCisKKyNkZWZpbmUgUFhFX0NQQlNJWkVfTk9UX1VTRUQgICAgICAgICAgICAwICAgLy8gemVybworI2RlZmluZSBQWEVfREJTSVpFX05PVF9VU0VEICAgICAgICAgMCAgIC8vIHplcm8KKyNkZWZpbmUgUFhFX0NQQkFERFJfTk9UX1VTRUQgICAgICAgIChQWEVfVUlOVDY0KTAgICAgICAgLy8gemVybworI2RlZmluZSBQWEVfREJBRERSX05PVF9VU0VEICAgICAoUFhFX1VJTlQ2NCkwICAgICAgIC8vIHplcm8KKworI2RlZmluZSBQWEVfQ09OU1QgY29uc3QKKworI2RlZmluZSBQWEVfVk9MQVRJTEUgdm9sYXRpbGUKKwordHlwZWRlZiB2b2lkIFBYRV9WT0lEOworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgUFhFX1VJTlQ4OworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFBYRV9VSU5UMTY7CisKK3R5cGVkZWYgdW5zaWduZWQgUFhFX1VJTlQzMjsKKworI2lmIFBYRV9VSU5UNjRfU1VQUE9SVCAhPSAwCisvLyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgUFhFX1VJTlQ2NDsKK3R5cGVkZWYgVUlOVDY0IFBYRV9VSU5UNjQ7CisjZW5kaWYgLy8gUFhFX1VJTlQ2NF9TVVBQT1JUCisKKyNpZiBQWEVfTk9fVUlOVDY0X1NVUFBPUlQgIT0gMAordHlwZWRlZiBQWEVfVUlOVDMyIFBYRV9VSU5UNjRbMl07CisjZW5kaWYgLy8gUFhFX05PX1VJTlQ2NF9TVVBQT1JUCisKK3R5cGVkZWYgdW5zaWduZWQgUFhFX1VJTlROOworCit0eXBlZGVmIFBYRV9VSU5UOCBQWEVfQk9PTDsKKworI2RlZmluZSBQWEVfRkFMU0UgICAgICAgICAgICAgICAwICAgLy8gemVybworI2RlZmluZSBQWEVfVFJVRSAgICAgICAgICAgICAgICAgICAgKCFQWEVfRkFMU0UpCisKK3R5cGVkZWYgUFhFX1VJTlQxNiBQWEVfT1BDT0RFOworCisvLworLy8gUmV0dXJuIFVOREkgb3BlcmF0aW9uYWwgc3RhdGUuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0dFVF9TVEFURSAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisKKy8vCisvLyBDaGFuZ2UgVU5ESSBvcGVyYXRpb25hbCBzdGF0ZSBmcm9tIFN0b3BwZWQgdG8gU3RhcnRlZC4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfU1RBUlQgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvLworLy8gQ2hhbmdlIFVOREkgb3BlcmF0aW9uYWwgc3RhdGUgZnJvbSBTdGFydGVkIHRvIFN0b3BwZWQuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1NUT1AgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKworLy8KKy8vIEdldCBVTkRJIGluaXRpYWxpemF0aW9uIGluZm9ybWF0aW9uLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9HRVRfSU5JVF9JTkZPICAgICAgICAgICAgICAgIDB4MDAwMworCisvLworLy8gR2V0IE5JQyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9HRVRfQ09ORklHX0lORk8gICAgICAgICAgICAgIDB4MDAwNAorCisvLworLy8gQ2hhbmdlZCBVTkRJIG9wZXJhdGlvbmFsIHN0YXRlIGZyb20gU3RhcnRlZCB0byBJbml0aWFsaXplZC4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfSU5JVElBTElaRSAgICAgICAgICAgICAgICAgICAweDAwMDUKKworLy8KKy8vIFJlLWluaXRpYWxpemUgdGhlIE5JQyBIL1cuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAweDAwMDYKKworLy8KKy8vIENoYW5nZSB0aGUgVU5ESSBvcGVyYXRpb25hbCBzdGF0ZSBmcm9tIEluaXRpYWxpemVkIHRvIFN0YXJ0ZWQuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1NIVVRET1dOICAgICAgICAgICAgICAgICAweDAwMDcKKworLy8KKy8vIFJlYWQgJiBjaGFuZ2Ugc3RhdGUgb2YgZXh0ZXJuYWwgaW50ZXJydXB0IGVuYWJsZXMuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0lOVEVSUlVQVF9FTkFCTEVTICAgICAgICAgICAgICAgIDB4MDAwOAorCisvLworLy8gUmVhZCAmIGNoYW5nZSBzdGF0ZSBvZiBwYWNrZXQgcmVjZWl2ZSBmaWx0ZXJzLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9SRUNFSVZFX0ZJTFRFUlMgICAgICAgICAgICAgIDB4MDAwOQorCisvLworLy8gUmVhZCAmIGNoYW5nZSBzdGF0aW9uIE1BQyBhZGRyZXNzLgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9TVEFUSU9OX0FERFJFU1MgICAgICAgICAgICAgIDB4MDAwQQorCisvLworLy8gUmVhZCB0cmFmZmljIHN0YXRpc3RpY3MuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgMHgwMDBCCisKKy8vCisvLyBDb252ZXJ0IG11bHRpY2FzdCBJUCBhZGRyZXNzIHRvIG11bHRpY2FzdCBNQUMgYWRkcmVzcy4KKy8vCisjZGVmaW5lIFBYRV9PUENPREVfTUNBU1RfSVBfVE9fTUFDICAgICAgICAgICAgICAweDAwMEMKKworLy8KKy8vIFJlYWQgb3IgY2hhbmdlIG5vbi12b2xhdGlsZSBzdG9yYWdlIG9uIHRoZSBOSUMuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX05WREFUQSAgICAgICAgICAgICAgICAgICAweDAwMEQKKworLy8KKy8vIEdldCAmIGNsZWFyIGludGVycnVwdCBzdGF0dXMuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0dFVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMDBFCisKKy8vCisvLyBGaWxsIG1lZGlhIGhlYWRlciBpbiBwYWNrZXQgZm9yIHRyYW5zbWl0LgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9GSUxMX0hFQURFUiAgICAgICAgICAgICAgMHgwMDBGCisKKy8vCisvLyBUcmFuc21pdCBwYWNrZXQocykuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX1RSQU5TTUlUICAgICAgICAgICAgICAgICAweDAwMTAKKworLy8KKy8vIFJlY2VpdmUgcGFja2V0LgorLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9SRUNFSVZFICAgICAgICAgICAgICAgICAgMHgwMDExCisKKy8vIGxhc3QgdmFsaWQgb3Bjb2RlOgorI2RlZmluZSBQWEVfT1BDT0RFX1ZBTElEX01BWCAgICAgICAgICAgICAgICAgICAgMHgwMDExCisKKy8vCisvLyBMYXN0IHZhbGlkIFBYRSBVTkRJIE9wQ29kZSBudW1iZXIuCisvLworI2RlZmluZSBQWEVfT1BDT0RFX0xBU1RfVkFMSUQgICAgICAgICAgICAgICAgICAgMHgwMDExCisKK3R5cGVkZWYgUFhFX1VJTlQxNiBQWEVfT1BGTEFHUzsKKworI2RlZmluZSBQWEVfT1BGTEFHU19OT1RfVVNFRCAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IFN0YXRlCisvLworCisvLyBObyBPcEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU3RhcnQKKy8vCisKKy8vIE5vIE9wRmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBTdG9wCisvLworCisvLyBObyBPcEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IEluaXQgSW5mbworLy8KKworLy8gTm8gT3BmbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEdldCBDb25maWcgSW5mbworLy8KKworLy8gTm8gT3BmbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEluaXRpYWxpemUKKy8vCisKKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5JVElBTElaRV9DQUJMRV9ERVRFQ1RfTUFTSyAgICAweDAwMDEKKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5JVElBTElaRV9ERVRFQ1RfQ0FCTEUgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5JVElBTElaRV9ET19OT1RfREVURUNUX0NBQkxFICAweDAwMDEKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBSZXNldAorLy8KKworI2RlZmluZSBQWEVfT1BGTEFHU19SRVNFVF9ESVNBQkxFX0lOVEVSUlVQVFMgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19SRVNFVF9ESVNBQkxFX0ZJTFRFUlMgICAgICAgICAgIDB4MDAwMgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFNodXRkb3duCisvLworCisvLyBObyBPcEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgSW50ZXJydXB0IEVuYWJsZXMKKy8vCisKKy8vCisvLyBTZWxlY3Qgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBleHRlcm5hbCBpbnRlcnJ1cHQgc2lnbmFscy4KKy8vIFNldHRpbmcgYm90aCBlbmFibGUgYW5kIGRpc2FibGUgd2lsbCByZXR1cm4gUFhFX1NUQVRDT0RFX0lOVkFMSURfT1BGTEFHUy4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX0lOVEVSUlVQVF9PUE1BU0sgICAgICAgICAgICAgICAgMHhDMDAwCisjZGVmaW5lIFBYRV9PUEZMQUdTX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFBYRV9PUEZMQUdTX0lOVEVSUlVQVF9ESVNBQkxFICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX1JFQUQgICAgICAgICAgICAgIDB4MDAwMAorCisvLworLy8gRW5hYmxlIHJlY2VpdmUgaW50ZXJydXB0cy4gIEFuIGV4dGVybmFsIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZAorLy8gYWZ0ZXIgYSBjb21wbGV0ZSBub24tZXJyb3IgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX1JFQ0VJVkUgICAgICAgICAgIDB4MDAwMQorCisvLworLy8gRW5hYmxlIHRyYW5zbWl0IGludGVycnVwdHMuICBBbiBleHRlcm5hbCBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQKKy8vIGFmdGVyIGEgY29tcGxldGUgbm9uLWVycm9yIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZC4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX0lOVEVSUlVQVF9UUkFOU01JVCAgICAgICAgICAweDAwMDIKKworLy8KKy8vIEVuYWJsZSBjb21tYW5kIGludGVycnVwdHMuICBBbiBleHRlcm5hbCBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQKKy8vIHdoZW4gY29tbWFuZCBleGVjdXRpb24gc3RvcHMuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfQ09NTUFORCAgICAgICAgICAgMHgwMDA0CisKKy8vCisvLyBHZW5lcmF0ZSBzb2Z0d2FyZSBpbnRlcnJ1cHQuICBTZXR0aW5nIHRoaXMgYml0IGdlbmVyYXRlcyBhbiBleHRlcm5hbAorLy8gaW50ZXJydXB0LCBpZiBpdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX1NPRlRXQVJFICAgICAgICAgIDB4MDAwOAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFJlY2VpdmUgRmlsdGVycworLy8KKworLy8KKy8vIFNlbGVjdCB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHJlY2VpdmUgZmlsdGVycy4KKy8vIFNldHRpbmcgYm90aCBlbmFibGUgYW5kIGRpc2FibGUgd2lsbCByZXR1cm4gUFhFX1NUQVRDT0RFX0lOVkFMSURfT1BDT0RFLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfT1BNQVNLICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfRU5BQkxFICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfRElTQUJMRSAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfUkVBRCAgICAgICAgIDB4MDAwMAorCisvLworLy8gVG8gcmVzZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtdWx0aWNhc3QgTUFDIGFkZHJlc3MgZmlsdGVyIGxpc3QsCisvLyBzZXQgdGhpcyBPcEZsYWc6CisvLworI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9SRVNFVF9NQ0FTVF9MSVNUIDB4MjAwMAorCisvLworLy8gRW5hYmxlIHVuaWNhc3QgcGFja2V0IHJlY2VpdmluZy4gIFBhY2tldHMgc2VudCB0byB0aGUgY3VycmVudCBzdGF0aW9uCisvLyBNQUMgYWRkcmVzcyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfVU5JQ0FTVCAgICAgICAgICAweDAwMDEKKworLy8KKy8vIEVuYWJsZSBicm9hZGNhc3QgcGFja2V0IHJlY2VpdmluZy4gIFBhY2tldHMgc2VudCB0byB0aGUgYnJvYWRjYXN0IAorLy8gTUFDIGFkZHJlc3Mgd2lsbCBiZSByZWNlaXZlZC4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX0JST0FEQ0FTVCAgICAgICAgMHgwMDAyCisKKy8vCisvLyBFbmFibGUgZmlsdGVyZWQgbXVsdGljYXN0IHBhY2tldCByZWNlaXZpbmcuICBQYWNrZXRzIHNlbnQgdG8gYW55CisvLyBvZiB0aGUgbXVsdGljYXN0IE1BQyBhZGRyZXNzZXMgaW4gdGhlIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmaWx0ZXIKKy8vIGxpc3Qgd2lsbCBiZSByZWNlaXZlZC4gIElmIHRoZSBmaWx0ZXIgbGlzdCBpcyBlbXB0eSwgbm8gbXVsdGljYXN0CisvLworI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9GSUxURVJFRF9NVUxUSUNBU1QgICAweDAwMDQKKworLy8KKy8vIEVuYWJsZSBwcm9taXNjdW91cyBwYWNrZXQgcmVjZWl2aW5nLiAgQWxsIHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX1BST01JU0NVT1VTICAgICAgMHgwMDA4CisKKy8vCisvLyBFbmFibGUgcHJvbWlzY3VvdXMgbXVsdGljYXN0IHBhY2tldCByZWNlaXZpbmcuICBBbGwgbXVsdGljYXN0CisvLyBwYWNrZXRzIHdpbGwgYmUgcmVjZWl2ZWQuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9BTExfTVVMVElDQVNUICAgICAgICAweDAwMTAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBTdGF0aW9uIEFkZHJlc3MKKy8vCisKKyNkZWZpbmUgUFhFX09QRkxBR1NfU1RBVElPTl9BRERSRVNTX1JFQUQgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfU1RBVElPTl9BRERSRVNTX1JFU0VUICAgICAgICAgICAweDAwMDEKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBTdGF0aXN0aWNzCisvLworCisjZGVmaW5lIFBYRV9PUEZMQUdTX1NUQVRJU1RJQ1NfUkVBRCAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfU1RBVElTVElDU19SRVNFVCAgICAgICAgICAgICAgICAweDAwMDEKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBNQ2FzdCBJUCB0byBNQUMKKy8vCisKKy8vCisvLyBJZGVudGlmeSB0aGUgdHlwZSBvZiBJUCBhZGRyZXNzIGluIHRoZSBDUEIuCisvLworI2RlZmluZSBQWEVfT1BGTEFHU19NQ0FTVF9JUF9UT19NQUNfT1BNQVNLICAgICAgICAgIDB4MDAwMworI2RlZmluZSBQWEVfT1BGTEFHU19NQ0FTVF9JUFY0X1RPX01BQyAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFBYRV9PUEZMQUdTX01DQVNUX0lQVjZfVE9fTUFDICAgICAgICAgICAweDAwMDEKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBOdkRhdGEKKy8vCisKKy8vCisvLyBTZWxlY3QgdGhlIHR5cGUgb2Ygbm9uLXZvbGF0aWxlIGRhdGEgb3BlcmF0aW9uLgorLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfTlZEQVRBX09QTUFTSyAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19OVkRBVEFfUkVBRCAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfTlZEQVRBX1dSSVRFICAgICAgICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEdldCBTdGF0dXMKKy8vCisKKy8vCisvLyBSZXR1cm4gY3VycmVudCBpbnRlcnJ1cHQgc3RhdHVzLiAgVGhpcyB3aWxsIGFsc28gY2xlYXIgYW55IGludGVycnVwdHMKKy8vIHRoYXQgYXJlIGN1cnJlbnRseSBzZXQuICBUaGlzIGNhbiBiZSB1c2VkIGluIGEgcG9sbGluZyByb3V0aW5lLiAgVGhlCisvLyBpbnRlcnJ1cHQgZmxhZ3MgYXJlIHN0aWxsIHNldCBhbmQgY2xlYXJlZCBldmVuIHdoZW4gdGhlIGludGVycnVwdHMKKy8vIGFyZSBkaXNhYmxlZC4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX0dFVF9JTlRFUlJVUFRfU1RBVFVTICAgICAgICAgICAgMHgwMDAxCisKKy8vCisvLyBSZXR1cm4gbGlzdCBvZiB0cmFuc21pdHRlZCBidWZmZXJzIGZvciByZWN5Y2xpbmcuICBUcmFuc21pdCBidWZmZXJzCisvLyBtdXN0IG5vdCBiZSBjaGFuZ2VkIG9yIHVuYWxsb2NhdGVkIHVudGlsIHRoZXkgaGF2ZSByZWN5Y2xlZC4gIEFmdGVyCisvLyBpc3N1aW5nIGEgdHJhbnNtaXQgY29tbWFuZCwgd2FpdCBmb3IgYSB0cmFuc21pdCBjb21wbGV0ZSBpbnRlcnJ1cHQuCisvLyBXaGVuIGEgdHJhbnNtaXQgY29tcGxldGUgaW50ZXJydXB0IGlzIHJlY2VpdmVkLCByZWFkIHRoZSB0cmFuc21pdHRlZAorLy8gYnVmZmVycy4gIERvIG5vdCBwbGFuIG9uIGdldHRpbmcgb25lIGJ1ZmZlciBwZXIgaW50ZXJydXB0LiAgU29tZQorLy8gTklDcyBhbmQgVU5ESXMgbWF5IHRyYW5zbWl0IG11bHRpcGxlIGJ1ZmZlcnMgcGVyIGludGVycnVwdC4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX0dFVF9UUkFOU01JVFRFRF9CVUZGRVJTICAgICAgICAgMHgwMDAyCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgRmlsbCBIZWFkZXIKKy8vCisKKyNkZWZpbmUgUFhFX09QRkxBR1NfRklMTF9IRUFERVJfT1BNQVNLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19GSUxMX0hFQURFUl9GUkFHTUVOVEVEICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19GSUxMX0hFQURFUl9XSE9MRSAgICAgICAgICAgMHgwMDAwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgVHJhbnNtaXQKKy8vCisKKy8vCisvLyBTL1cgVU5ESSBvbmx5LiAgUmV0dXJuIGFmdGVyIHRoZSBwYWNrZXQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQuICBBCisvLyB0cmFuc21pdCBjb21wbGV0ZSBpbnRlcnJ1cHQgd2lsbCBzdGlsbCBiZSBnZW5lcmF0ZWQgYW5kIHRoZSB0cmFuc21pdAorLy8gYnVmZmVyIHdpbGwgaGF2ZSB0byBiZSByZWN5Y2xlZC4KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1NXVU5ESV9UUkFOU01JVF9PUE1BU0sgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX1RSQU5TTUlUX0JMT0NLICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX09QRkxBR1NfVFJBTlNNSVRfRE9OVF9CTE9DSyAgICAgICAgIDB4MDAwMAorCisvLworLy8KKy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1RSQU5TTUlUX09QTUFTSyAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUFhFX09QRkxBR1NfVFJBTlNNSVRfRlJBR01FTlRFRCAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQWEVfT1BGTEFHU19UUkFOU01JVF9XSE9MRSAgICAgICAgICAgICAgMHgwMDAwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgUmVjZWl2ZQorLy8KKworLy8gTm8gT3BGbGFncworCit0eXBlZGVmIFBYRV9VSU5UMTYgUFhFX1NUQVRGTEFHUzsKKworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOSVRJQUxJWkUgICAgICAgICAgICAgICAgMHgwMDAwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbW1vbiBTdGF0RmxhZ3MgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgYWxsIGNvbW1hbmRzLgorLy8KKworLy8KKy8vIFRoZSBDT01NQU5EX0NPTVBMRVRFIGFuZCBDT01NQU5EX0ZBSUxFRCBzdGF0dXMgZmxhZ3MgbXVzdCBiZQorLy8gaW1wbGVtZW50ZWQgYnkgYWxsIFVORElzLiAgQ09NTUFORF9RVUVVRUQgaXMgb25seSBuZWVkZWQgYnkgVU5ESXMKKy8vIHRoYXQgc3VwcG9ydCBjb21tYW5kIHF1ZXVpbmcuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX1NUQVRVU19NQVNLICAgICAgICAgICAgICAgMHhDMDAwCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfQ09NTUFORF9DT01QTEVURSAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19DT01NQU5EX0ZBSUxFRCAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19DT01NQU5EX1FVRVVFRCAgICAgICAgICAgICAgICAweDQwMDAKKy8vI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOSVRJQUxJWkUgICAgICAgICAgICAgIDB4MDAwMAorCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfREJfV1JJVEVfVFJVTkNBVEVEICAgICAgICAgICAgMHgyMDAwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IFN0YXRlCisvLworCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRFX01BU0sgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRFX0lOSVRJQUxJWkVEICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRFX1NUQVJURUQgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVEVfU1RPUFBFRCAgICAgICAgIDB4MDAwMAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFN0YXJ0CisvLworCisvLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEdldCBJbml0IEluZm8KKy8vCisKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19DQUJMRV9ERVRFQ1RfTUFTSyAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19DQUJMRV9ERVRFQ1RfTk9UX1NVUFBPUlRFRCAweDAwMDAKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19DQUJMRV9ERVRFQ1RfU1VQUE9SVEVEICAgICAweDAwMDEKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEluaXRpYWxpemUKKy8vCisKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19JTklUSUFMSVpFRF9OT19NRURJQSAgICAgICAgICAweDAwMDEKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBSZXNldAorLy8KKworI2RlZmluZSBQWEVfU1RBVEZMQUdTX1JFU0VUX05PX01FRElBICAgICAgICAgICAgICAgIDB4MDAwMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFNodXRkb3duCisvLworCisvLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEludGVycnVwdCBFbmFibGVzCisvLworCisvLworLy8gSWYgc2V0LCByZWNlaXZlIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOVEVSUlVQVF9SRUNFSVZFICAgICAgICAgMHgwMDAxCisKKy8vCisvLyBJZiBzZXQsIHRyYW5zbWl0IGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOVEVSUlVQVF9UUkFOU01JVCAgICAgICAgICAgIDB4MDAwMgorCisvLworLy8gSWYgc2V0LCBjb21tYW5kIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOVEVSUlVQVF9DT01NQU5EICAgICAgICAgMHgwMDA0CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBSZWNlaXZlIEZpbHRlcnMKKy8vCisKKy8vCisvLyBJZiBzZXQsIHVuaWNhc3QgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19SRUNFSVZFX0ZJTFRFUl9VTklDQVNUICAgICAgICAweDAwMDEKKworLy8KKy8vIElmIHNldCwgYnJvYWRjYXN0IHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVDRUlWRV9GSUxURVJfQlJPQURDQVNUICAgICAgMHgwMDAyCisKKy8vCisvLyBJZiBzZXQsIG11bHRpY2FzdCBwYWNrZXRzIHRoYXQgbWF0Y2ggdXAgd2l0aCB0aGUgbXVsdGljYXN0IGFkZHJlc3MKKy8vIGZpbHRlciBsaXN0IHdpbGwgYmUgcmVjZWl2ZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX1JFQ0VJVkVfRklMVEVSX0ZJTFRFUkVEX01VTFRJQ0FTVCAweDAwMDQKKworLy8KKy8vIElmIHNldCwgYWxsIHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVDRUlWRV9GSUxURVJfUFJPTUlTQ1VPVVMgICAgICAgIDB4MDAwOAorCisvLworLy8gSWYgc2V0LCBhbGwgbXVsdGljYXN0IHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVDRUlWRV9GSUxURVJfQUxMX01VTFRJQ0FTVCAgMHgwMDEwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgU3RhdGlvbiBBZGRyZXNzCisvLworCisvLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFN0YXRpc3RpY3MKKy8vCisKKy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgTUNhc3QgSVAgdG8gTUFDCisvLworCisvLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIE52RGF0YQorLy8KKworLy8gTm8gYWRkaXRpb25hbCBTdGF0RmxhZ3MKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEdldCBTdGF0dXMKKy8vCisKKy8vCisvLyBVc2UgdG8gZGV0ZXJtaW5lIGlmIGFuIGludGVycnVwdCBoYXMgb2NjdXJyZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfSU5URVJSVVBUX01BU0sgICAgIDB4MDAwRgorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfTk9fSU5URVJSVVBUUyAgICAgIDB4MDAwMAorCisvLworLy8gSWYgc2V0LCBhdCBsZWFzdCBvbmUgcmVjZWl2ZSBpbnRlcnJ1cHQgb2NjdXJyZWQuCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfUkVDRUlWRSAgICAgICAgICAgIDB4MDAwMQorCisvLworLy8gSWYgc2V0LCBhdCBsZWFzdCBvbmUgdHJhbnNtaXQgaW50ZXJydXB0IG9jY3VycmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVFVTX1RSQU5TTUlUICAgICAgICAgICAweDAwMDIKKworLy8KKy8vIElmIHNldCwgYXQgbGVhc3Qgb25lIGNvbW1hbmQgaW50ZXJydXB0IG9jY3VycmVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVFVTX0NPTU1BTkQgICAgICAgICAgICAweDAwMDQKKworLy8KKy8vIElmIHNldCwgYXQgbGVhc3Qgb25lIHNvZnR3YXJlIGludGVycnVwdCBvY2N1cnJlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19TT0ZUV0FSRSAgICAgICAgICAgMHgwMDA4CisKKy8vCisvLyBUaGlzIGZsYWcgaXMgc2V0IGlmIHRoZSB0cmFuc21pdHRlZCBidWZmZXIgcXVldWUgaXMgZW1wdHkuICBUaGlzIGZsYWcKKy8vIHdpbGwgYmUgc2V0IGlmIGFsbCB0cmFuc21pdHRlZCBidWZmZXIgYWRkcmVzc2VzIGdldCB3cml0dGVuIGludG8gdGhlIERCLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVFVTX1RYQlVGX1FVRVVFX0VNUFRZICAweDAwMTAKKworLy8KKy8vIFRoaXMgZmxhZyBpcyBzZXQgaWYgbm8gdHJhbnNtaXR0ZWQgYnVmZmVyIGFkZHJlc3NlcyB3ZXJlIHdyaXR0ZW4KKy8vIGludG8gdGhlIERCLiAgKFRoaXMgY291bGQgYmUgYmVjYXVzZSBEQnNpemUgd2FzIHRvbyBzbWFsbC4pCisvLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfTk9fVFhCVUZTX1dSSVRURU4gIDB4MDAyMAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEZpbGwgSGVhZGVyCisvLworCisvLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIFRyYW5zbWl0CisvLworCisvLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncy4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBSZWNlaXZlCisvLworCisvLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncy4KKwordHlwZWRlZiBQWEVfVUlOVDE2IFBYRV9TVEFUQ09ERTsKKworI2RlZmluZSBQWEVfU1RBVENPREVfSU5JVElBTElaRSAgICAgICAgICAgICAweDAwMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tbW9uIFN0YXRDb2RlcyByZXR1cm5lZCBieSBhbGwgVU5ESSBjb21tYW5kcywgVU5ESSBwcm90b2NvbCBmdW5jdGlvbnMKKy8vIGFuZCBCQyBwcm90b2NvbCBmdW5jdGlvbnMuCisvLworCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAweDAwMDAKKworI2RlZmluZSBQWEVfU1RBVENPREVfSU5WQUxJRF9DREIgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JTlZBTElEX0NQQiAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0JVU1kgICAgICAgICAgICAgICAgICAgCTB4MDAwMworI2RlZmluZSBQWEVfU1RBVENPREVfUVVFVUVfRlVMTCAgICAgICAgICAgICAJMHgwMDA0CisjZGVmaW5lIFBYRV9TVEFUQ09ERV9BTFJFQURZX1NUQVJURUQgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX05PVF9TVEFSVEVEICAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBQWEVfU1RBVENPREVfTk9UX1NIVVRET1dOICAgICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIFBYRV9TVEFUQ09ERV9BTFJFQURZX0lOSVRJQUxJWkVEICAgICAgICAweDAwMDgKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX05PVF9JTklUSUFMSVpFRCAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBQWEVfU1RBVENPREVfREVWSUNFX0ZBSUxVUkUgICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9OVkRBVEFfRkFJTFVSRSAgICAgICAgICAgICAweDAwMEIKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX1VOU1VQUE9SVEVEICAgICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBQWEVfU1RBVENPREVfQlVGRkVSX0ZVTEwgICAgICAgICAgICAgICAgMHgwMDBECisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JTlZBTElEX1BBUkFNRVRFUgkJMHgwMDBFCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JTlZBTElEX1VOREkJCTB4MDAwRgorI2RlZmluZSBQWEVfU1RBVENPREVfSVBWNF9OT1RfU1VQUE9SVEVECQkweDAwMTAKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lQVjZfTk9UX1NVUFBPUlRFRAkJMHgwMDExCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9OT1RfRU5PVUdIX01FTU9SWQkJMHgwMDEyCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9OT19EQVRBCQkJMHgwMDEzCisKKwordHlwZWRlZiBQWEVfVUlOVDE2IFBYRV9JRk5VTTsKKworLy8KKy8vIFRoaXMgaW50ZXJmYWNlIG51bWJlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgUy9XIFVOREkgU3RhcnQgY29tbWFuZC4KKy8vCisjZGVmaW5lIFBYRV9JRk5VTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorCisvLworLy8gVGhpcyBpbnRlcmZhY2UgbnVtYmVyIGlzIHJldHVybmVkIGJ5IHRoZSBTL1cgVU5ESSBHZXQgU3RhdGUgYW5kCisvLyBTdGFydCBjb21tYW5kcyBpZiBpbmZvcm1hdGlvbiBpbiB0aGUgQ0RCLCBDUEIgb3IgREIgaXMgaW52YWxpZC4KKy8vCisjZGVmaW5lIFBYRV9JRk5VTV9JTlZBTElEICAgICAgICAgICAgICAgICAgIDB4MDAwMAorCit0eXBlZGVmIFBYRV9VSU5UMTYgUFhFX0NPTlRST0w7CisKKy8vCisvLyBTZXR0aW5nIHRoaXMgZmxhZyBkaXJlY3RzIHRoZSBVTkRJIHRvIHF1ZXVlIHRoaXMgY29tbWFuZCBmb3IgbGF0ZXIKKy8vIGV4ZWN1dGlvbiBpZiB0aGUgVU5ESSBpcyBidXN5IGFuZCBpdCBzdXBwb3J0cyBjb21tYW5kIHF1ZXVpbmcuCisvLyBJZiBxdWV1aW5nIGlzIG5vdCBzdXBwb3J0ZWQsIGEgUFhFX1NUQVRDT0RFX0lOVkFMSURfQ09OVFJPTCBlcnJvcgorLy8gaXMgcmV0dXJuZWQuICBJZiB0aGUgcXVldWUgaXMgZnVsbCwgYSBQWEVfU1RBVENPREVfQ0RCX1FVRVVFX0ZVTEwgCisvLyBlcnJvciBpcyByZXR1cm5lZC4KKy8vCisjZGVmaW5lIFBYRV9DT05UUk9MX1FVRVVFX0lGX0JVU1kgICAgICAgICAgICAgICAweDAwMDIKKworLy8KKy8vIFRoZXNlIHR3byBiaXQgdmFsdWVzIGFyZSB1c2VkIHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUgbW9yZSBVTkRJCisvLyBDREIgc3RydWN0dXJlcyBmb2xsb3dpbmcgdGhpcyBvbmUuICBJZiB0aGUgbGluayBiaXQgaXMgc2V0LCB0aGVyZQorLy8gbXVzdCBiZSBhIENEQiBzdHJ1Y3R1cmUgZm9sbG93aW5nIHRoaXMgb25lLiAgRXhlY3V0aW9uIHdpbGwgc3RhcnQKKy8vIG9uIHRoZSBuZXh0IENEQiBzdHJ1Y3R1cmUgYXMgc29vbiBhcyB0aGlzIG9uZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LgorLy8gSWYgYW4gZXJyb3IgaXMgZ2VuZXJhdGVkIGJ5IHRoaXMgY29tbWFuZCwgZXhlY3V0aW9uIHdpbGwgc3RvcC4KKy8vCisjZGVmaW5lIFBYRV9DT05UUk9MX0xJTksgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfQ09OVFJPTF9MQVNUX0NEQl9JTl9MSVNUICAgICAgICAgICAgICAgIDB4MDAwMAorCit0eXBlZGVmIFBYRV9VSU5UOCBQWEVfRlJBTUVfVFlQRTsKKworI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9OT05FICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFBYRV9GUkFNRV9UWVBFX1VOSUNBU1QgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUFhFX0ZSQU1FX1RZUEVfQlJPQURDQVNUICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUFhFX0ZSQU1FX1RZUEVfTVVMVElDQVNUICAgICAgICAgICAgMHgwMworI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9QUk9NSVNDVU9VUyAgICAgICAgICAgICAgMHgwNAorCit0eXBlZGVmIFBYRV9VSU5UMzIgUFhFX0lQVjQ7CisKK3R5cGVkZWYgUFhFX1VJTlQzMiBQWEVfSVBWNls0XTsKKyNkZWZpbmUgUFhFX01BQ19MRU5HVEggMzIKKwordHlwZWRlZiBQWEVfVUlOVDggUFhFX01BQ19BRERSW1BYRV9NQUNfTEVOR1RIXTsKKwordHlwZWRlZiBQWEVfVUlOVDggUFhFX0lGVFlQRTsKK3R5cGVkZWYgUFhFX1VJTlQxNiBQWEVfTUVESUFfUFJPVE9DT0w7CisKKy8vCisvLyBUaGlzIGluZm9ybWF0aW9uIGlzIGZyb20gdGhlIEFSUCBzZWN0aW9uIG9mIFJGQyAxNzAwLgorLy8KKy8vICAgICAxIEV0aGVybmV0ICgxME1iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAgMiBFeHBlcmltZW50YWwgRXRoZXJuZXQgKDNNYikgICAgICAgICAgICAgICAgICAgICAgICBbSkJQXQorLy8gICAgIDMgQW1hdGV1ciBSYWRpbyBBWC4yNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1BYS10KKy8vICAgICA0IFByb3Rlb24gUHJvTkVUIFRva2VuIFJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAgNSBDaGFvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbR1hQXQorLy8gICAgIDYgSUVFRSA4MDIgTmV0d29ya3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0pCUF0KKy8vICAgICA3IEFSQ05FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLyAgICAgOCBIeXBlcmNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSkJQXQorLy8gICAgIDkgTGFuc3RhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUVV0KKy8vICAgIDEwIEF1dG9uZXQgU2hvcnQgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW01YQjFdCisvLyAgICAxMSBMb2NhbFRhbGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKS1IxXQorLy8gICAgMTIgTG9jYWxOZXQgKElCTSBQQ05ldCBvciBTWVRFSyBMb2NhbE5FVCkgICAgICAgICAgICAgW0pYTV0KKy8vICAgIDEzIFVsdHJhIGxpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JYRDJdCisvLyAgICAxNCBTTURTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHWEMxXQorLy8gICAgMTUgRnJhbWUgUmVsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FHTV0KKy8vICAgIDE2IEFzeW5jaHJvbm91cyBUcmFuc21pc3Npb24gTW9kZSAoQVRNKSAgICAgICAgICAgICAgW0pYQjJdCisvLyAgICAxNyBIRExDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSkJQXQorLy8gICAgMTggRmlicmUgQ2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWWFrb3YgUmVraHRlcl0KKy8vICAgIDE5IEFzeW5jaHJvbm91cyBUcmFuc21pc3Npb24gTW9kZSAoQVRNKSAgICAgIFtNYXJrIExhdWJhY2hdCisvLyAgICAyMCBTZXJpYWwgTGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSkJQXQorLy8gICAgMjEgQXN5bmNocm9ub3VzIFRyYW5zbWlzc2lvbiBNb2RlIChBVE0pICAgICAgICAgICAgICBbTVhCMV0KKy8vCisKKyNkZWZpbmUgUFhFX0lGVFlQRV9FVEhFUk5FVCAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBQWEVfSUZUWVBFX1RPS0VOUklORyAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBQWEVfSUZUWVBFX0ZJQlJFX0NIQU5ORUwgICAgICAgICAgICAgICAgMHgxMgorCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9od191bmRpIHsKK1BYRV9VSU5UMzIgU2lnbmF0dXJlOyAgICAgICAvLyBQWEVfUk9NSURfU0lHTkFUVVJFCitQWEVfVUlOVDggTGVuOyAgICAgICAgICAvLyBzaXplb2YoUFhFX0hXX1VOREkpCitQWEVfVUlOVDggRnVkZ2U7ICAgICAgICAgICAgLy8gbWFrZXMgOC1iaXQgY2tzdW0gZXF1YWwgemVybworUFhFX1VJTlQ4IFJldjsgICAgICAgICAgLy8gUFhFX1JPTUlEX1JFVgorUFhFX1VJTlQ4IElGY250OyAgICAgICAgICAgIC8vIHBoeXNpY2FsIGNvbm5lY3RvciBjb3VudAorUFhFX1VJTlQ4IE1ham9yVmVyOyAgICAgICAgIC8vIFBYRV9ST01JRF9NQUpPUlZFUgorUFhFX1VJTlQ4IE1pbm9yVmVyOyAgICAgICAgIC8vIFBYRV9ST01JRF9NSU5PUlZFUgorUFhFX1VJTlQxNiByZXNlcnZlZDsgICAgICAgIC8vIHplcm8sIG5vdCB1c2VkCitQWEVfVUlOVDMyIEltcGxlbWVudGF0aW9uOyAgICAgIC8vIGltcGxlbWVudGF0aW9uIGZsYWdzCisvLyByZXNlcnZlZCAgICAgICAgICAgICAvLyB2ZW5kb3IgdXNlCisvLyBQWEVfVUlOVDMyIFN0YXR1czsgICAgICAgLy8gc3RhdHVzIHBvcnQKKy8vIFBYRV9VSU5UMzIgQ29tbWFuZDsgICAgICAvLyBjb21tYW5kIHBvcnQKKy8vIFBYRV9VSU5UNjQgQ0RCYWRkcjsgICAgICAvLyBDREIgYWRkcmVzcyBwb3J0Cit9IFBYRV9IV19VTkRJOworCisvLworLy8gU3RhdHVzIHBvcnQgYml0IGRlZmluaXRpb25zCisvLworCisvLworLy8gVU5ESSBvcGVyYXRpb24gc3RhdGUKKy8vCisjZGVmaW5lIFBYRV9IV1NUQVRfU1RBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweEMwMDAwMDAwCisjZGVmaW5lIFBYRV9IV1NUQVRfQlVTWSAgICAgICAgICAgICAgICAgICAgIDB4QzAwMDAwMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9JTklUSUFMSVpFRCAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBQWEVfSFdTVEFUX1NUQVJURUQgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFBYRV9IV1NUQVRfU1RPUFBFRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKworLy8KKy8vIElmIHNldCwgbGFzdCBjb21tYW5kIGZhaWxlZAorLy8KKyNkZWZpbmUgUFhFX0hXU1RBVF9DT01NQU5EX0ZBSUxFRCAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKworLy8KKy8vIElmIHNldCwgaWRlbnRpZmllcyBlbmFibGVkIHJlY2VpdmUgZmlsdGVycworLy8KKyNkZWZpbmUgUFhFX0hXU1RBVF9QUk9NSVNDVU9VU19NVUxUSUNBU1RfUlhfRU5BQkxFRCAweDAwMDAxMDAwCisjZGVmaW5lIFBYRV9IV1NUQVRfUFJPTUlTQ1VPVVNfUlhfRU5BQkxFRCAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBQWEVfSFdTVEFUX0JST0FEQ0FTVF9SWF9FTkFCTEVEICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBQWEVfSFdTVEFUX01VTFRJQ0FTVF9SWF9FTkFCTEVEICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBQWEVfSFdTVEFUX1VOSUNBU1RfUlhfRU5BQkxFRCAgICAgICAgICAgMHgwMDAwMDEwMAorCisvLworLy8gSWYgc2V0LCBpZGVudGlmaWVzIGVuYWJsZWQgZXh0ZXJuYWwgaW50ZXJydXB0cworLy8KKyNkZWZpbmUgUFhFX0hXU1RBVF9TT0ZUV0FSRV9JTlRfRU5BQkxFRCAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUFhFX0hXU1RBVF9UWF9DT01QTEVURV9JTlRfRU5BQkxFRCAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFBYRV9IV1NUQVRfUEFDS0VUX1JYX0lOVF9FTkFCTEVEICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBQWEVfSFdTVEFUX0NNRF9DT01QTEVURV9JTlRfRU5BQkxFRCAgICAgICAgIDB4MDAwMDAwMTAKKworLy8KKy8vIElmIHNldCwgaWRlbnRpZmllcyBwZW5kaW5nIGludGVycnVwdHMKKy8vCisjZGVmaW5lIFBYRV9IV1NUQVRfU09GVFdBUkVfSU5UX1BFTkRJTkcgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBYRV9IV1NUQVRfVFhfQ09NUExFVEVfSU5UX1BFTkRJTkcgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBQWEVfSFdTVEFUX1BBQ0tFVF9SWF9JTlRfUEVORElORyAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUFhFX0hXU1RBVF9DTURfQ09NUExFVEVfSU5UX1BFTkRJTkcgICAgICAgICAweDAwMDAwMDAxCisKKy8vCisvLyBDb21tYW5kIHBvcnQgZGVmaW5pdGlvbnMKKy8vCisKKy8vCisvLyBJZiBzZXQsIENEQiBpZGVudGlmaWVkIGluIENEQmFkZHIgcG9ydCBpcyBnaXZlbiB0byBVTkRJLgorLy8gSWYgbm90IHNldCwgb3RoZXIgYml0cyBpbiB0aGlzIHdvcmQgd2lsbCBiZSBwcm9jZXNzZWQuCisvLworI2RlZmluZSBQWEVfSFdDTURfSVNTVUVfQ09NTUFORCAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFBYRV9IV0NNRF9JTlRTX0FORF9GSUxUUyAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisKKy8vCisvLyBVc2UgdGhlc2UgdG8gZW5hYmxlL2Rpc2FibGUgcmVjZWl2ZSBmaWx0ZXJzLgorLy8KKyNkZWZpbmUgUFhFX0hXQ01EX1BST01JU0NVT1VTX01VTFRJQ0FTVF9SWF9FTkFCTEUgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBQWEVfSFdDTURfUFJPTUlTQ1VPVVNfUlhfRU5BQkxFICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBQWEVfSFdDTURfQlJPQURDQVNUX1JYX0VOQUJMRSAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBQWEVfSFdDTURfTVVMVElDQVNUX1JYX0VOQUJMRSAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBQWEVfSFdDTURfVU5JQ0FTVF9SWF9FTkFCTEUgICAgICAgICAgICAgMHgwMDAwMDEwMAorCisvLworLy8gVXNlIHRoZXNlIHRvIGVuYWJsZS9kaXNhYmxlIGV4dGVybmFsIGludGVycnVwdHMKKy8vCisjZGVmaW5lIFBYRV9IV0NNRF9TT0ZUV0FSRV9JTlRfRU5BQkxFICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFBYRV9IV0NNRF9UWF9DT01QTEVURV9JTlRfRU5BQkxFICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBQWEVfSFdDTURfUEFDS0VUX1JYX0lOVF9FTkFCTEUgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBQWEVfSFdDTURfQ01EX0NPTVBMRVRFX0lOVF9FTkFCTEUgICAgICAgICAgIDB4MDAwMDAwMTAKKworLy8KKy8vIFVzZSB0aGVzZSB0byBjbGVhciBwZW5kaW5nIGV4dGVybmFsIGludGVycnVwdHMKKy8vCisjZGVmaW5lIFBYRV9IV0NNRF9DTEVBUl9TT0ZUV0FSRV9JTlQgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBQWEVfSFdDTURfQ0xFQVJfVFhfQ09NUExFVEVfSU5UICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBQWEVfSFdDTURfQ0xFQVJfUEFDS0VUX1JYX0lOVCAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQWEVfSFdDTURfQ0xFQVJfQ01EX0NPTVBMRVRFX0lOVCAgICAgICAgICAgIDB4MDAwMDAwMDEKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfc3dfdW5kaSB7CitQWEVfVUlOVDMyIFNpZ25hdHVyZTsgICAgICAgLy8gUFhFX1JPTUlEX1NJR05BVFVSRQorUFhFX1VJTlQ4IExlbjsgICAgICAgICAgLy8gc2l6ZW9mKFBYRV9TV19VTkRJKQorUFhFX1VJTlQ4IEZ1ZGdlOyAgICAgICAgICAgIC8vIG1ha2VzIDgtYml0IGNrc3VtIHplcm8KK1BYRV9VSU5UOCBSZXY7ICAgICAgICAgIC8vIFBYRV9ST01JRF9SRVYKK1BYRV9VSU5UOCBJRmNudDsgICAgICAgICAgICAvLyBwaHlzaWNhbCBjb25uZWN0b3IgY291bnQKK1BYRV9VSU5UOCBNYWpvclZlcjsgICAgICAgICAvLyBQWEVfUk9NSURfTUFKT1JWRVIKK1BYRV9VSU5UOCBNaW5vclZlcjsgICAgICAgICAvLyBQWEVfUk9NSURfTUlOT1JWRVIKK1BYRV9VSU5UMTYgcmVzZXJ2ZWQxOyAgICAgICAvLyB6ZXJvLCBub3QgdXNlZAorUFhFX1VJTlQzMiBJbXBsZW1lbnRhdGlvbjsgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBmbGFncworUFhFX1VJTlQ2NCBFbnRyeVBvaW50OyAgICAgIC8vIEFQSSBlbnRyeSBwb2ludAorUFhFX1VJTlQ4IHJlc2VydmVkMlszXTsgICAgIC8vIHplcm8sIG5vdCB1c2VkCitQWEVfVUlOVDggQnVzQ250OyAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJ1c3R5cGVzIHN1cHBvcnRlZAorUFhFX1VJTlQzMiBCdXNUeXBlWzFdOyAgICAgIC8vIGxpc3Qgb2Ygc3VwcG9ydGVkIGJ1c3R5cGVzCit9IFBYRV9TV19VTkRJOworCit0eXBlZGVmIHVuaW9uIHVfcHhlX3VuZGkgeworUFhFX0hXX1VOREkgaHc7CitQWEVfU1dfVU5ESSBzdzsKK30gUFhFX1VOREk7CisKKy8vCisvLyBTaWduYXR1cmUgb2YgIVBYRSBzdHJ1Y3R1cmUKKy8vCisjZGVmaW5lIFBYRV9ST01JRF9TSUdOQVRVUkUgICAgIFBYRV9CVVNUWVBFKCchJywgJ1AnLCAnWCcsICdFJykKKworLy8KKy8vICFQWEUgc3RydWN0dXJlIGZvcm1hdCByZXZpc2lvbgorLy8KKyNkZWZpbmUgUFhFX1JPTUlEX1JFViAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorCisvLworLy8gVU5ESSBjb21tYW5kIGludGVyZmFjZSByZXZpc2lvbi4gIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHRoYXQgZ2V0IHNlbnQKKy8vIGluIG9wdGlvbiA5NCAoQ2xpZW50IE5ldHdvcmsgSW50ZXJmYWNlIElkZW50aWZpZXIpIGluIHRoZSBESENQIERpc2NvdmVyCisvLyBhbmQgUFhFIEJvb3QgU2VydmVyIFJlcXVlc3QgcGFja2V0cy4KKy8vCisjZGVmaW5lIFBYRV9ST01JRF9NQUpPUlZFUiAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUFhFX1JPTUlEX01JTk9SVkVSICAgICAgICAgICAgICAgICAgMHgwMAorCisvLworLy8gSW1wbGVtZW50YXRpb24gZmxhZ3MKKy8vCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfSFdfVU5ESSAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfU1dfVklSVF9BRERSICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfNjRCSVRfREVWSUNFICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfRlJBR19TVVBQT1JURUQgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX0NNRF9MSU5LX1NVUFBPUlRFRCAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9DTURfUVVFVUVfU1VQUE9SVEVEICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTVVMVElfRlJBTUVfU1VQUE9SVEVEICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX05WREFUQV9TVVBQT1JUX01BU0sgICAgICAgICAgIDB4MDAwMDBDMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9OVkRBVEFfQlVMS19XUklUQUJMRSAgICAgICAgICAweDAwMDAwQzAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTlZEQVRBX1NQQVJTRV9XUklUQUJMRSAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX05WREFUQV9SRUFEX09OTFkgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX05WREFUQV9OT1RfQVZBSUxBQkxFICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9TVEFUSVNUSUNTX1NVUFBPUlRFRCAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfU1RBVElPTl9BRERSX1NFVFRBQkxFICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX1BST01JU0NVT1VTX01VTFRJQ0FTVF9SWF9TVVBQT1JURUQgICAgMHgwMDAwMDA4MAorI2RlZmluZSBQWEVfUk9NSURfSU1QX1BST01JU0NVT1VTX1JYX1NVUFBPUlRFRCAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9CUk9BRENBU1RfUlhfU1VQUE9SVEVEICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfRklMVEVSRURfTVVMVElDQVNUX1JYX1NVUFBPUlRFRCAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9TT0ZUV0FSRV9JTlRfU1VQUE9SVEVEICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBYRV9ST01JRF9JTVBfVFhfQ09NUExFVEVfSU5UX1NVUFBPUlRFRCAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBQWEVfUk9NSURfSU1QX1BBQ0tFVF9SWF9JTlRfU1VQUE9SVEVEICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9DTURfQ09NUExFVEVfSU5UX1NVUFBPUlRFRCAgICAgICAgMHgwMDAwMDAwMQorCisgCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jZGIgeworUFhFX09QQ09ERSBPcENvZGU7CitQWEVfT1BGTEFHUyBPcEZsYWdzOworUFhFX1VJTlQxNiBDUEJzaXplOworUFhFX1VJTlQxNiBEQnNpemU7CitVSU5UNjQgQ1BCYWRkcjsKK1VJTlQ2NCBEQmFkZHI7CitQWEVfU1RBVENPREUgU3RhdENvZGU7CitQWEVfU1RBVEZMQUdTIFN0YXRGbGFnczsKK1BYRV9VSU5UMTYgSUZudW07CitQWEVfQ09OVFJPTCBDb250cm9sOworfSBQWEVfQ0RCOworCisKK3R5cGVkZWYgdW5pb24gdV9weGVfaXBfYWRkciB7CitQWEVfSVBWNiBJUHY2OworUFhFX0lQVjQgSVB2NDsKK30gUFhFX0lQX0FERFI7CisKK3R5cGVkZWYgdW5pb24gcHhlX2RldmljZSB7CisvLworLy8gUENJIGFuZCBQQyBDYXJkIE5JQ3MgYXJlIGJvdGggaWRlbnRpZmllZCB1c2luZyBidXMsIGRldmljZQorLy8gYW5kIGZ1bmN0aW9uIG51bWJlcnMuICBGb3IgUEMgQ2FyZCwgdGhpcyBtYXkgcmVxdWlyZSBQQworLy8gQ2FyZCBzZXJ2aWNlcyB0byBiZSBsb2FkZWQgaW4gdGhlIEJJT1Mgb3IgcHJlYm9vdAorLy8gZW52aXJvbm1lbnQuCisvLworc3RydWN0IHsKKy8vCisvLyBTZWUgUy9XIFVOREkgUk9NSUQgc3RydWN0dXJlIGRlZmluaXRpb24gZm9yIFBDSSBhbmQKKy8vIFBDQyBCdXNUeXBlIGRlZmluaXRpb25zLgorLy8KK1BYRV9VSU5UMzIgQnVzVHlwZTsKKworLy8KKy8vIEJ1cywgZGV2aWNlICYgZnVuY3Rpb24gbnVtYmVycyB0aGF0IGxvY2F0ZSB0aGlzIGRldmljZS4KKy8vCitQWEVfVUlOVDE2IEJ1czsKK1BYRV9VSU5UOCBEZXZpY2U7CitQWEVfVUlOVDggRnVuY3Rpb247Cit9IFBDSSwgUENDOworCisvLworLy8gJSVUQkQgLSBNb3JlIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBhYm91dCBlbnVtZXJhdGluZworLy8gVVNCIGFuZCAxMzk0IGRldmljZXMuCisvLworc3RydWN0IHsKK1BYRV9VSU5UMzIgQnVzVHlwZTsKK1BYRV9VSU5UMzIgdGRiOworfSBVU0IsIF8xMzk0OworfSBQWEVfREVWSUNFOworCisvLyBjcGIgYW5kIGRiIGRlZmluaXRpb25zCisKKyNkZWZpbmUgTUFYX1BDSV9DT05GSUdfTEVOIDY0ICAgLy8gIyBvZiBkd29yZHMKKyNkZWZpbmUgTUFYX0VFUFJPTV9MRU4gMTI4ICAgICAgIC8vICNvZiBkd29yZHMKKyNkZWZpbmUgTUFYX1hNSVRfQlVGRkVSUyAgICAzMiAgLy8gcmVjeWNsaW5nIFEgbGVuZ3RoIGZvciB4bWl0X2RvbmUKKyNkZWZpbmUgTUFYX01DQVNUX0FERFJFU1NfQ05UIDgKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3N0YXJ0IHsKKyAgICAvLworICAgIC8vIFBYRV9WT0lEIERlbGF5KFBYRV9VSU5UNjQgbWljcm9zZWNvbmRzKTsKKyAgICAvLworICAgIC8vIFVOREkgd2lsbCBuZXZlciByZXF1ZXN0IGEgZGVsYXkgc21hbGxlciB0aGFuIDEwIG1pY3Jvc2Vjb25kcworICAgIC8vIGFuZCB3aWxsIGFsd2F5cyByZXF1ZXN0IGRlbGF5cyBpbiBpbmNyZW1lbnRzIG9mIDEwIG1pY3Jvc2Vjb25kcy4KKyAgICAvLyBUaGUgRGVsYXkoKSBDYWxsQmFjayByb3V0aW5lIG11c3QgZGVsYXkgYmV0d2VlbiBuIGFuZCBuICsgMTAgCisgICAgLy8gbWljcm9zZWNvbmRzIGJlZm9yZSByZXR1cm5pbmcgY29udHJvbCB0byB0aGUgVU5ESS4KKyAgICAvLworICAgIC8vIFRoaXMgZmllbGQgY2Fubm90IGJlIHNldCB0byB6ZXJvLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBEZWxheTsKKworICAgIC8vCisgICAgLy8gUFhFX1ZPSUQgQmxvY2soUFhFX1VJTlQzMiBlbmFibGUpOworICAgIC8vCisgICAgLy8gVU5ESSBtYXkgbmVlZCB0byBibG9jayBtdWx0aS10aHJlYWRlZC9tdWx0aS1wcm9jZXNzb3IgYWNjZXNzIHRvCisgICAgLy8gY3JpdGljYWwgY29kZSBzZWN0aW9ucyB3aGVuIHByb2dyYW1taW5nIG9yIGFjY2Vzc2luZyB0aGUgbmV0d29yaworICAgIC8vIGRldmljZS4gIFRvIHRoaXMgZW5kLCBhIGJsb2NraW5nIHNlcnZpY2UgaXMgbmVlZGVkIGJ5IHRoZSBVTkRJLgorICAgIC8vIFdoZW4gVU5ESSBuZWVkcyBhIGJsb2NrLCBpdCB3aWxsIGNhbGwgQmxvY2soKSBwYXNzaW5nIGEgbm9uLXplcm8KKyAgICAvLyB2YWx1ZS4gIFdoZW4gVU5ESSBubyBsb25nZXIgbmVlZHMgYSBibG9jaywgaXQgd2lsbCBjYWxsIEJsb2NrKCkKKyAgICAvLyB3aXRoIGEgemVybyB2YWx1ZS4gIFdoZW4gY2FsbGVkLCBpZiB0aGUgQmxvY2soKSBpcyBhbHJlYWR5IGVuYWJsZWQsCisgICAgLy8gZG8gbm90IHJldHVybiBjb250cm9sIHRvIHRoZSBVTkRJIHVudGlsIHRoZSBwcmV2aW91cyBCbG9jaygpIGlzCisgICAgLy8gZGlzYWJsZWQuCisgICAgLy8KKyAgICAvLyBUaGlzIGZpZWxkIGNhbm5vdCBiZSBzZXQgdG8gemVyby4KKyAgICAvLworICAgIFBYRV9VSU5UNjQgQmxvY2s7CisKKyAgICAvLworICAgIC8vIFBYRV9WT0lEIFZpcnQyUGh5cyhQWEVfVUlOVDY0IHZpcnR1YWwsIFBYRV9VSU5UNjQgcGh5c2ljYWxfcHRyKTsKKyAgICAvLworICAgIC8vIFVOREkgd2lsbCBwYXNzIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYSBidWZmZXIgYW5kIHRoZSB2aXJ0dWFsCisgICAgLy8gYWRkcmVzcyBvZiBhIDY0LWJpdCBwaHlzaWNhbCBidWZmZXIuICBDb252ZXJ0IHRoZSB2aXJ0dWFsIGFkZHJlc3MKKyAgICAvLyB0byBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHBoeXNpY2FsIGFkZHJlc3MKKyAgICAvLyBidWZmZXIuICBJZiB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBhZGRyZXNzZXMgYXJlIHRoZSBzYW1lLCBqdXN0CisgICAgLy8gY29weSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGJ1ZmZlci4KKyAgICAvLworICAgIC8vIFRoaXMgZmllbGQgY2FuIGJlIHNldCB0byB6ZXJvIGlmIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyAKKyAgICAvLyBhcmUgZXF1YWwuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IFZpcnQyUGh5czsKKyAgICAvLworICAgIC8vIFBYRV9WT0lEIE1lbV9JTyhQWEVfVUlOVDggcmVhZF93cml0ZSwgUFhFX1VJTlQ4IGxlbiwgUFhFX1VJTlQ2NCBwb3J0LCAKKyAgICAvLyAgICAgICAgICAgICAgUFhFX1VJTlQ2NCBidWZfYWRkcik7CisgICAgLy8KKyAgICAvLyBVTkRJIHdpbGwgcmVhZCBvciB3cml0ZSB0aGUgZGV2aWNlIGlvIHNwYWNlIHVzaW5nIHRoaXMgY2FsbCBiYWNrIAorICAgIC8vIGZ1bmN0aW9uLiBJdCBwYXNzZXMgdGhlIG51bWJlciBvZiBieXRlcyBhcyB0aGUgbGVuIHBhcmFtZXRlciBhbmQgaXQgCisgICAgLy8gd2lsbCBiZSBlaXRoZXIgMSwyLDQgb3IgOC4KKyAgICAvLworICAgIC8vIFRoaXMgZmllbGQgY2FuIG5vdCBiZSBzZXQgdG8gemVyby4KKyAgICAvLworICAgIFBYRV9VSU5UNjQgTWVtX0lPOworfSBQWEVfQ1BCX1NUQVJUOworCisjZGVmaW5lIFBYRV9ERUxBWV9NSUxMSVNFQ09ORCAgICAgICAgICAgICAgICAgICAxMDAwCisjZGVmaW5lIFBYRV9ERUxBWV9TRUNPTkQgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAKKyNkZWZpbmUgUFhFX0lPX1JFQUQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBYRV9JT19XUklURSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUFhFX01FTV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQWEVfTUVNX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICA0CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfZ2V0X2luaXRfaW5mbyB7CisgICAgLy8KKyAgICAvLyBNaW5pbXVtIGxlbmd0aCBvZiBsb2NrZWQgbWVtb3J5IGJ1ZmZlciB0aGF0IG11c3QgYmUgZ2l2ZW4gdG8KKyAgICAvLyB0aGUgSW5pdGlhbGl6ZSBjb21tYW5kLiBHaXZpbmcgVU5ESSBtb3JlIG1lbW9yeSB3aWxsIGdlbmVyYWxseQorICAgIC8vIGdpdmUgYmV0dGVyIHBlcmZvcm1hbmNlLgorICAgIC8vCisgICAgLy8gSWYgTWVtb3J5UmVxdWlyZWQgaXMgemVybywgdGhlIFVOREkgZG9lcyBub3QgbmVlZCBhbmQgd2lsbCBub3QKKyAgICAvLyB1c2Ugc3lzdGVtIG1lbW9yeSB0byByZWNlaXZlIGFuZCB0cmFuc21pdCBwYWNrZXRzLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBNZW1vcnlSZXF1aXJlZDsKKworICAgIC8vCisgICAgLy8gTWF4aW11bSBmcmFtZSBkYXRhIGxlbmd0aCBmb3IgVHgvUnggZXhjbHVkaW5nIHRoZSBtZWRpYSBoZWFkZXIuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIEZyYW1lRGF0YUxlbjsKKworICAgIC8vCisgICAgLy8gU3VwcG9ydGVkIGxpbmsgc3BlZWRzIGFyZSBpbiB1bml0cyBvZiBtZWdhIGJpdHMuICBDb21tb24gZXRoZXJuZXQKKyAgICAvLyB2YWx1ZXMgYXJlIDEwLCAxMDAgYW5kIDEwMDAuICBVbnVzZWQgTGlua1NwZWVkc1tdIGVudHJpZXMgYXJlIHplcm8KKyAgICAvLyBmaWxsZWQuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIExpbmtTcGVlZHNbNF07CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBub24tdm9sYXRpbGUgc3RvcmFnZSBpdGVtcy4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgTnZDb3VudDsKKworICAgIC8vCisgICAgLy8gV2lkdGggb2Ygbm9uLXZvbGF0aWxlIHN0b3JhZ2UgaXRlbSBpbiBieXRlcy4gIDAsIDEsIDIgb3IgNAorICAgIC8vCisgICAgUFhFX1VJTlQxNiBOdldpZHRoOworCisgICAgLy8KKyAgICAvLyBNZWRpYSBoZWFkZXIgbGVuZ3RoLiAgVGhpcyBpcyB0aGUgdHlwaWNhbCBtZWRpYSBoZWFkZXIgbGVuZ3RoIGZvcgorICAgIC8vIHRoaXMgVU5ESS4gIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHdoZW4gYWxsb2NhdGluZyByZWNlaXZlCisgICAgLy8gYW5kIHRyYW5zbWl0IGJ1ZmZlcnMuCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IE1lZGlhSGVhZGVyTGVuOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIE5JQyBoYXJkd2FyZSAoTUFDKSBhZGRyZXNzLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBIV2FkZHJMZW47CisKKyAgICAvLworICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBNQUMgYWRkcmVzc2VzIGluIHRoZSBtdWx0aWNhc3QKKyAgICAvLyBNQUMgYWRkcmVzcyBmaWx0ZXIgbGlzdC4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgTUNhc3RGaWx0ZXJDbnQ7CisKKyAgICAvLworICAgIC8vIERlZmF1bHQgbnVtYmVyIGFuZCBzaXplIG9mIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcnMgdGhhdCB3aWxsIAorICAgIC8vIGJlIGFsbG9jYXRlZCBieSB0aGUgVU5ESS4gIElmIE1lbW9yeVJlcXVpcmVkIGlzIG5vbi16ZXJvLCB0aGlzIAorICAgIC8vIGFsbG9jYXRpb24gd2lsbCBjb21lIG91dCBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBnaXZlbiB0byB0aGUgSW5pdGlhbGl6ZSAKKyAgICAvLyBjb21tYW5kLiAgSWYgTWVtb3J5UmVxdWlyZWQgaXMgemVybywgdGhpcyBhbGxvY2F0aW9uIHdpbGwgY29tZSBvdXQgb2YgCisgICAgLy8gbWVtb3J5IG9uIHRoZSBOSUMuCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IFR4QnVmQ250OworICAgIFBYRV9VSU5UMTYgVHhCdWZTaXplOworICAgIFBYRV9VSU5UMTYgUnhCdWZDbnQ7CisgICAgUFhFX1VJTlQxNiBSeEJ1ZlNpemU7CisKKyAgICAvLworICAgIC8vIEhhcmR3YXJlIGludGVyZmFjZSB0eXBlcyBkZWZpbmVkIGluIHRoZSBBc3NpZ25lZCBOdW1iZXJzIFJGQworICAgIC8vIGFuZCB1c2VkIGluIERIQ1AgYW5kIEFSUCBwYWNrZXRzLgorICAgIC8vIFNlZSB0aGUgUFhFX0lGVFlQRSB0eXBlZGVmIGFuZCBQWEVfSUZUWVBFX3h4eCBtYWNyb3MuCisgICAgLy8KKyAgICBQWEVfVUlOVDggSUZ0eXBlOworCisgICAgLy8KKyAgICAvLyBTdXBwb3J0ZWQgZHVwbGV4LiAgU2VlIFBYRV9EVVBMRVhfeHh4eHggI2RlZmluZXMgYmVsb3cuCisgICAgLy8KKyAgICBQWEVfVUlOVDggRHVwbGV4OworCisgICAgLy8KKyAgICAvLyBTdXBwb3J0ZWQgbG9vcGJhY2sgb3B0aW9ucy4gIFNlZSBQWEVfTE9PUEJBQ0tfeHh4eHggI2RlZmluZXMgYmVsb3cuCisgICAgLy8KKyAgICBQWEVfVUlOVDggTG9vcEJhY2s7Cit9IFBYRV9EQl9HRVRfSU5JVF9JTkZPOworCisjZGVmaW5lIFBYRV9NQVhfVFhSWF9VTklUX0VUSEVSICAgICAgICAgICAgIDE1MDAKKworI2RlZmluZSBQWEVfSFdBRERSX0xFTl9FVEhFUiAgICAgICAgICAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIFBYRV9NQUNfSEVBREVSX0xFTl9FVEhFUiAgICAgICAgICAgICAgICAweDAwMEUKKworI2RlZmluZSBQWEVfRFVQTEVYX0VOQUJMRV9GVUxMX1NVUFBPUlRFRCAgICAgICAgICAgIDEKKyNkZWZpbmUgUFhFX0RVUExFWF9GT1JDRV9GVUxMX1NVUFBPUlRFRCAgICAgICAgIDIKKworI2RlZmluZSBQWEVfTE9PUEJBQ0tfSU5URVJOQUxfU1VQUE9SVEVEICAgICAgICAgMQorI2RlZmluZSBQWEVfTE9PUEJBQ0tfRVhURVJOQUxfU1VQUE9SVEVEICAgICAgICAgMgorCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX3BjaV9jb25maWdfaW5mbyB7CisgICAgLy8KKyAgICAvLyBUaGlzIGlzIHRoZSBmbGFnIGZpZWxkIGZvciB0aGUgUFhFX0RCX0dFVF9DT05GSUdfSU5GTyB1bmlvbi4KKyAgICAvLyBGb3IgUENJIGJ1cyBkZXZpY2VzLCB0aGlzIGZpZWxkIGlzIHNldCB0byBQWEVfQlVTVFlQRV9QQ0kuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIEJ1c1R5cGU7CisKKyAgICAvLworICAgIC8vIFRoaXMgaWRlbnRpZmllcyB0aGUgUENJIG5ldHdvcmsgZGV2aWNlIHRoYXQgdGhpcyBVTkRJIGludGVyZmFjZQorICAgIC8vIGlzIGJvdW5kIHRvLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiBCdXM7CisgICAgUFhFX1VJTlQ4IERldmljZTsKKyAgICBQWEVfVUlOVDggRnVuY3Rpb247CisKKyAgICAvLworICAgIC8vIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBmb3IgdGhpcyAKKyAgICAvLyBuZXR3b3JrIGRldmljZS4KKyAgICAvLworICAgIHVuaW9uIHsKKyAgICAgICAgUFhFX1VJTlQ4IEJ5dGVbMjU2XTsKKyAgICAgICAgUFhFX1VJTlQxNiBXb3JkWzEyOF07CisgICAgICAgIFBYRV9VSU5UMzIgRHdvcmRbNjRdOworICAgIH0gQ29uZmlnOworfSBQWEVfUENJX0NPTkZJR19JTkZPOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX3BjY19jb25maWdfaW5mbyB7CisgICAgLy8KKyAgICAvLyBUaGlzIGlzIHRoZSBmbGFnIGZpZWxkIGZvciB0aGUgUFhFX0RCX0dFVF9DT05GSUdfSU5GTyB1bmlvbi4KKyAgICAvLyBGb3IgUENDIGJ1cyBkZXZpY2VzLCB0aGlzIGZpZWxkIGlzIHNldCB0byBQWEVfQlVTVFlQRV9QQ0MuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIEJ1c1R5cGU7CisgICAgCisgICAgLy8KKyAgICAvLyBUaGlzIGlkZW50aWZpZXMgdGhlIFBDQyBuZXR3b3JrIGRldmljZSB0aGF0IHRoaXMgVU5ESSBpbnRlcmZhY2UKKyAgICAvLyBpcyBib3VuZCB0by4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgQnVzOworICAgIFBYRV9VSU5UOCBEZXZpY2U7CisgICAgUFhFX1VJTlQ4IEZ1bmN0aW9uOworCisgICAgLy8KKyAgICAvLyBUaGlzIGlzIGEgY29weSBvZiB0aGUgUENDIGNvbmZpZ3VyYXRpb24gc3BhY2UgZm9yIHRoaXMgCisgICAgLy8gbmV0d29yayBkZXZpY2UuCisgICAgLy8KKyAgICB1bmlvbiB7CisgICAgICAgIFBYRV9VSU5UOCBCeXRlWzI1Nl07CisgICAgICAgIFBYRV9VSU5UMTYgV29yZFsxMjhdOworICAgICAgICBQWEVfVUlOVDMyIER3b3JkWzY0XTsKKyAgICB9IENvbmZpZzsKK30gUFhFX1BDQ19DT05GSUdfSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV91c2JfY29uZmlnX2luZm8geworICAgIFBYRV9VSU5UMzIgQnVzVHlwZTsKKyAgICAvLyAlJVRCRCBXaGF0IHNob3VsZCB3ZSByZXR1cm4gaGVyZS4uLgorfSBQWEVfVVNCX0NPTkZJR19JTkZPOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlXzEzOTRfY29uZmlnX2luZm8geworICAgIFBYRV9VSU5UMzIgQnVzVHlwZTsKKyAgICAvLyAlJVRCRCBXaGF0IHNob3VsZCB3ZSByZXR1cm4gaGVyZS4uLgorfSBQWEVfMTM5NF9DT05GSUdfSU5GTzsKKworCit0eXBlZGVmIHVuaW9uIHVfcHhlX2RiX2dldF9jb25maWdfaW5mbyB7CisgICAgUFhFX1BDSV9DT05GSUdfSU5GTyBwY2k7CisgICAgUFhFX1BDQ19DT05GSUdfSU5GTyBwY2M7CisgICAgUFhFX1VTQl9DT05GSUdfSU5GTyB1c2I7CisgICAgUFhFXzEzOTRfQ09ORklHX0lORk8gXzEzOTQ7Cit9IFBYRV9EQl9HRVRfQ09ORklHX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX2luaXRpYWxpemUgeworICAgIC8vCisgICAgLy8gQWRkcmVzcyBvZiBmaXJzdCAobG93ZXN0KSBieXRlIG9mIHRoZSBtZW1vcnkgYnVmZmVyLiAgVGhpcyBidWZmZXIgbXVzdAorICAgIC8vIGJlIGluIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5IGFuZCBjYW5ub3QgYmUgc3dhcHBlZCBvdXQuICBUaGUgVU5ESQorICAgIC8vIHdpbGwgYmUgdXNpbmcgdGhpcyBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVyaW5nLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBNZW1vcnlBZGRyOworCisgICAgLy8KKyAgICAvLyBNZW1vcnlMZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gTWVtb3J5UmVxdWlyZWQKKyAgICAvLyByZXR1cm5lZCBieSB0aGUgR2V0IEluaXQgSW5mbyBjb21tYW5kLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBNZW1vcnlMZW5ndGg7CisKKyAgICAvLworICAgIC8vIERlc2lyZWQgbGluayBzcGVlZCBpbiBNYml0L3NlYy4gIENvbW1vbiBldGhlcm5ldCB2YWx1ZXMgYXJlIDEwLCAxMDAKKyAgICAvLyBhbmQgMTAwMC4gIFNldHRpbmcgYSB2YWx1ZSBvZiB6ZXJvIHdpbGwgYXV0by1kZXRlY3QgYW5kL29yIHVzZSB0aGUKKyAgICAvLyBkZWZhdWx0IGxpbmsgc3BlZWQgKG9wZXJhdGlvbiBkZXBlbmRzIG9uIFVOREkvTklDIGZ1bmN0aW9uYWxpdHkpLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBMaW5rU3BlZWQ7CisKKyAgICAvLworICAgIC8vIFN1Z2dlc3RlZCBudW1iZXIgYW5kIHNpemUgb2YgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgYnVmZmVycyB0bworICAgIC8vIGFsbG9jYXRlLiAgSWYgTWVtb3J5QWRkciBhbmQgTWVtb3J5TGVuZ3RoIGFyZSBub24temVybywgdGhpcworICAgIC8vIGFsbG9jYXRpb24gY29tZXMgb3V0IG9mIHRoZSBzdXBwbGllZCBtZW1vcnkgYnVmZmVyLiAgSWYgTWVtb3J5QWRkciAKKyAgICAvLyBhbmQgTWVtb3J5TGVuZ3RoIGFyZSB6ZXJvLCB0aGlzIGFsbG9jYXRpb24gY29tZXMgb3V0IG9mIG1lbW9yeQorICAgIC8vIG9uIHRoZSBOSUMuCisgICAgLy8KKyAgICAvLyBJZiB0aGVzZSBmaWVsZHMgYXJlIHNldCB0byB6ZXJvLCB0aGUgVU5ESSB3aWxsIGFsbG9jYXRlIGJ1ZmZlcgorICAgIC8vIGNvdW50cyBhbmQgc2l6ZXMgYXMgaXQgc2VlcyBmaXQuCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IFR4QnVmQ250OworICAgIFBYRV9VSU5UMTYgVHhCdWZTaXplOworICAgIFBYRV9VSU5UMTYgUnhCdWZDbnQ7CisgICAgUFhFX1VJTlQxNiBSeEJ1ZlNpemU7CisKKyAgICAvLworICAgIC8vIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCBhbmQgbXVzdCBiZSB6ZXJvIAorICAgIC8vIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMuCisgICAgLy8KKyAgICBQWEVfVUlOVDggRHVwbGV4OyAKKworICAgIFBYRV9VSU5UOCBMb29wQmFjazsKK30gUFhFX0NQQl9JTklUSUFMSVpFOworCisKKyNkZWZpbmUgUFhFX0RVUExFWF9ERUZBVUxUICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBQWEVfRk9SQ0VfRlVMTF9EVVBMRVggICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBQWEVfRU5BQkxFX0ZVTExfRFVQTEVYICAgICAgICAgICAgICAweDAyCisKKyNkZWZpbmUgTE9PUEJBQ0tfTk9STUFMIDAKKyNkZWZpbmUgTE9PUEJBQ0tfSU5URVJOQUwgMQorI2RlZmluZSBMT09QQkFDS19FWFRFUk5BTCAyCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfaW5pdGlhbGl6ZSB7CisgICAgLy8KKyAgICAvLyBBY3R1YWwgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGZyb20gdGhlIHN1cHBsaWVkIG1lbW9yeSBidWZmZXIuICBUaGlzCisgICAgLy8gbWF5IGJlIGxlc3MgdGhhdCB0aGUgYW1vdW50IG9mIG1lbW9yeSBzdXBwbGxpZWQgYW5kIG1heSBiZSB6ZXJvIGlmCisgICAgLy8gdGhlIFVOREkgYW5kIG5ldHdvcmsgZGV2aWNlIGRvIG5vdCB1c2UgZXh0ZXJuYWwgbWVtb3J5IGJ1ZmZlcnMuCisgICAgLy8KKyAgICAvLyBNZW1vcnkgdXNlZCBieSB0aGUgVU5ESSBhbmQgbmV0d29yayBkZXZpY2UgaXMgYWxsb2NhdGVkIGZyb20gdGhlIAorICAgIC8vIGxvd2VzdCBtZW1vcnkgYnVmZmVyIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIE1lbW9yeVVzZWQ7CisKKyAgICAvLworICAgIC8vIEFjdHVhbCBudW1iZXIgYW5kIHNpemUgb2YgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgYnVmZmVycyB0aGF0IHdlcmUKKyAgICAvLyBhbGxvY2F0ZWQuCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IFR4QnVmQ250OworICAgIFBYRV9VSU5UMTYgVHhCdWZTaXplOworICAgIFBYRV9VSU5UMTYgUnhCdWZDbnQ7CisgICAgUFhFX1VJTlQxNiBSeEJ1ZlNpemU7Cit9IFBYRV9EQl9JTklUSUFMSVpFOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NwYl9yZWNlaXZlX2ZpbHRlcnMgeworICAgIC8vCisgICAgLy8gTGlzdCBvZiBtdWx0aWNhc3QgTUFDIGFkZHJlc3Nlcy4gIFRoaXMgbGlzdCwgaWYgcHJlc2VudCwgd2lsbAorICAgIC8vIHJlcGxhY2UgdGhlIGV4aXN0aW5nIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmaWx0ZXIgbGlzdC4KKyAgICAvLworICAgIFBYRV9NQUNfQUREUiBNQ2FzdExpc3RbTUFYX01DQVNUX0FERFJFU1NfQ05UXTsKK30gUFhFX0NQQl9SRUNFSVZFX0ZJTFRFUlM7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfcmVjZWl2ZV9maWx0ZXJzIHsKKyAgICAvLworICAgIC8vIEZpbHRlcmVkIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBsaXN0LgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIE1DYXN0TGlzdFtNQVhfTUNBU1RfQUREUkVTU19DTlRdOworfSBQWEVfREJfUkVDRUlWRV9GSUxURVJTOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NwYl9zdGF0aW9uX2FkZHJlc3MgeworICAgIC8vCisgICAgLy8gSWYgc3VwcGxpZWQgYW5kIHN1cHBvcnRlZCwgdGhlIGN1cnJlbnQgc3RhdGlvbiBNQUMgYWRkcmVzcworICAgIC8vIHdpbGwgYmUgY2hhbmdlZC4KKyAgICAvLworICAgIFBYRV9NQUNfQUREUiBTdGF0aW9uQWRkcjsKK30gUFhFX0NQQl9TVEFUSU9OX0FERFJFU1M7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZHBiX3N0YXRpb25fYWRkcmVzcyB7CisgICAgLy8KKyAgICAvLyBDdXJyZW50IHN0YXRpb24gTUFDIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgU3RhdGlvbkFkZHI7CisKKyAgICAvLworICAgIC8vIFN0YXRpb24gYnJvYWRjYXN0IE1BQyBhZGRyZXNzLgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIEJyb2FkY2FzdEFkZHI7CisKKyAgICAvLworICAgIC8vIFBlcm1hbmVudCBzdGF0aW9uIE1BQyBhZGRyZXNzLgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIFBlcm1hbmVudEFkZHI7Cit9IFBYRV9EQl9TVEFUSU9OX0FERFJFU1M7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfc3RhdGlzdGljcyB7CisgICAgLy8KKyAgICAvLyBCaXQgZmllbGQgaWRlbnRpZnlpbmcgd2hhdCBzdGF0aXN0aWMgZGF0YSBpcyBjb2xsZWN0ZWQgYnkgdGhlIAorICAgIC8vIFVOREkvTklDLgorICAgIC8vIElmIGJpdCAweDAwIGlzIHNldCwgRGF0YVsweDAwXSBpcyBjb2xsZWN0ZWQuCisgICAgLy8gSWYgYml0IDB4MDEgaXMgc2V0LCBEYXRhWzB4MDFdIGlzIGNvbGxlY3RlZC4KKyAgICAvLyBJZiBiaXQgMHgyMCBpcyBzZXQsIERhdGFbMHgyMF0gaXMgY29sbGVjdGVkLgorICAgIC8vIElmIGJpdCAweDIxIGlzIHNldCwgRGF0YVsweDIxXSBpcyBjb2xsZWN0ZWQuCisgICAgLy8gRXRjLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBTdXBwb3J0ZWQ7CisKKyAgICAvLworICAgIC8vIFN0YXRpc3RpYyBkYXRhLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBEYXRhWzY0XTsKK30gUFhFX0RCX1NUQVRJU1RJQ1M7CisKKy8vCisvLyBUb3RhbCBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkLiAgSW5jbHVkZXMgZnJhbWVzIHdpdGggZXJyb3JzIGFuZAorLy8gZHJvcHBlZCBmcmFtZXMuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9UT1RBTF9GUkFNRVMgICAgICAgICAgMHgwMAorCisvLworLy8gTnVtYmVyIG9mIHZhbGlkIGZyYW1lcyByZWNlaXZlZCBhbmQgY29waWVkIGludG8gcmVjZWl2ZSBidWZmZXJzLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfR09PRF9GUkFNRVMgICAgICAgICAgIDB4MDEKKworLy8KKy8vIE51bWJlciBvZiBmcmFtZXMgYmVsb3cgdGhlIG1pbmltdW0gbGVuZ3RoIGZvciB0aGUgbWVkaWEuCisvLyBUaGlzIHdvdWxkIGJlIDw2NCBmb3IgZXRoZXJuZXQuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9VTkRFUlNJWkVfRlJBTUVTICAgICAgICAgIDB4MDIKKworLy8KKy8vIE51bWJlciBvZiBmcmFtZXMgbG9uZ2VyIHRoYW4gdGhlIG1heG1pbnVtIGxlbmd0aCBmb3IgdGhlCisvLyBtZWRpYS4gIFRoaXMgd291bGQgYmUgPjE1MDAgZm9yIGV0aGVybmV0LgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfT1ZFUlNJWkVfRlJBTUVTICAgICAgICAgICAweDAzCisKKy8vCisvLyBWYWxpZCBmcmFtZXMgdGhhdCB3ZXJlIGRyb3BwZWQgYmVjYXVzZSByZWNlaXZlIGJ1ZmZlcnMgd2VyZSBmdWxsLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfRFJPUFBFRF9GUkFNRVMgICAgICAgICAgICAweDA0CisKKy8vCisvLyBOdW1iZXIgb2YgdmFsaWQgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgYW5kIG5vdCBkcm9wcGVkLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAweDA1CisKKy8vCisvLyBOdW1iZXIgb2YgdmFsaWQgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBhbmQgbm90IGRyb3BwZWQuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgIDB4MDYKKworLy8KKy8vIE51bWJlciBvZiB2YWxpZCBtdXRsaWNhc3QgZnJhbWVzIHJlY2VpdmVkIGFuZCBub3QgZHJvcHBlZC4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgMHgwNworCisvLworLy8gTnVtYmVyIG9mIGZyYW1lcyB3LyBDUkMgb3IgYWxpZ25tZW50IGVycm9ycy4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX0NSQ19FUlJPUl9GUkFNRVMgICAgICAgICAgMHgwOAorCisvLworLy8gVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLiAgSW5jbHVkZXMgZnJhbWVzIHdpdGggZXJyb3JzCisvLyBhbmQgZHJvcHBlZCBmcmFtZXMuCisvLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9UT1RBTF9CWVRFUyAgICAgICAgICAgMHgwOQorCisvLworLy8gVHJhbnNtaXQgc3RhdGlzdGljcy4KKy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX1RPVEFMX0ZSQU1FUyAgICAgICAgICAweDBBCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX0dPT0RfRlJBTUVTICAgICAgICAgICAweDBCCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX1VOREVSU0laRV9GUkFNRVMgICAgICAgICAgMHgwQworI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9PVkVSU0laRV9GUkFNRVMgICAgICAgICAgIDB4MEQKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfRFJPUFBFRF9GUkFNRVMgICAgICAgICAgICAweDBFCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgMHgwRgorI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAweDExCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX0NSQ19FUlJPUl9GUkFNRVMgICAgICAgICAgMHgxMgorI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9UT1RBTF9CWVRFUyAgICAgICAgICAgMHgxMworCisvLworLy8gTnVtYmVyIG9mIGNvbGxpc2lvbnMgZGV0ZWN0aW9uIG9uIHRoaXMgc3VibmV0LgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfQ09MTElTSU9OUyAgICAgICAgICAgICAgIDB4MTQKKworLy8KKy8vIE51bWJlciBvZiBmcmFtZXMgZGVzdGluZWQgZm9yIHVuc3VwcG9ydGVkIHByb3RvY29sLgorLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVU5TVVBQT1JURURfUFJPVE9DT0wgICAgICAgICAweDE1CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX21jYXN0X2lwX3RvX21hYyB7CisgICAgLy8KKyAgICAvLyBNdWx0aWNhc3QgSVAgYWRkcmVzcyB0byBiZSBjb252ZXJ0ZWQgdG8gbXVsdGljYXN0IE1BQyBhZGRyZXNzLgorICAgIC8vCisgICAgUFhFX0lQX0FERFIgSVA7Cit9IFBYRV9DUEJfTUNBU1RfSVBfVE9fTUFDOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2RiX21jYXN0X2lwX3RvX21hYyB7CisgICAgLy8KKyAgICAvLyBNdWx0aWNhc3QgTUFDIGFkZHJlc3MuCisgICAgLy8KKyAgICBQWEVfTUFDX0FERFIgTUFDOworfSBQWEVfREJfTUNBU1RfSVBfVE9fTUFDOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NwYl9udmRhdGFfc3BhcnNlIHsKKyAgICAvLworICAgIC8vIE52RGF0YSBpdGVtIGxpc3QuICBPbmx5IGl0ZW1zIGluIHRoaXMgbGlzdCB3aWxsIGJlIHVwZGF0ZWQuCisgICAgLy8KKyAgICBzdHJ1Y3QgeworICAgICAgICAvLyAgTm9uLXZvbGF0aWxlIHN0b3JhZ2UgYWRkcmVzcyB0byBiZSBjaGFuZ2VkLgorICAgICAgICBQWEVfVUlOVDMyIEFkZHI7CisKKyAgICAgICAgLy8gRGF0YSBpdGVtIHRvIHdyaXRlIGludG8gYWJvdmUgc3RvcmFnZSBhZGRyZXNzLgorICAgIAorICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBQWEVfVUlOVDggQnl0ZTsKKyAgICAgICAgICAgIFBYRV9VSU5UMTYgV29yZDsKKyAgICAgICAgICAgIFBYRV9VSU5UMzIgRHdvcmQ7CisgICAgICAgIH0gRGF0YTsKKyAgICB9IEl0ZW1bTUFYX0VFUFJPTV9MRU5dOworfSBQWEVfQ1BCX05WREFUQV9TUEFSU0U7CisKKworLy8KKy8vIFdoZW4gdXNpbmcgYnVsayB1cGRhdGUsIHRoZSBzaXplIG9mIHRoZSBDUEIgc3RydWN0dXJlIG11c3QgYmUKKy8vIHRoZSBzYW1lIHNpemUgYXMgdGhlIG5vbi12b2xhdGlsZSBOSUMgc3RvcmFnZS4KKy8vCit0eXBlZGVmIHVuaW9uIHVfcHhlX2NwYl9udmRhdGFfYnVsayB7CisgICAgLy8KKyAgICAvLyBBcnJheSBvZiBieXRlLXdpZGUgZGF0YSBpdGVtcy4KKyAgICAvLworICAgIFBYRV9VSU5UOCBCeXRlW01BWF9FRVBST01fTEVOIDw8IDJdOworCisgICAgLy8KKyAgICAvLyBBcnJheSBvZiB3b3JkLXdpZGUgZGF0YSBpdGVtcy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgV29yZFtNQVhfRUVQUk9NX0xFTiA8PCAxXTsKKworICAgIC8vCisgICAgLy8gQXJyYXkgb2YgZHdvcmQtd2lkZSBkYXRhIGl0ZW1zLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBEd29yZFtNQVhfRUVQUk9NX0xFTl07Cit9IFBYRV9DUEJfTlZEQVRBX0JVTEs7CisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2RiX252ZGF0YSB7CisKKyAgICAvLyBBcnJheXMgb2YgZGF0YSBpdGVtcyBmcm9tIG5vbi12b2xhdGlsZSBzdG9yYWdlLgorCisgICAgdW5pb24geworICAgICAgICAvLworICAgICAgICAvLyBBcnJheSBvZiBieXRlLXdpZGUgZGF0YSBpdGVtcy4KKyAgICAgICAgLy8KKyAgICAgICAgUFhFX1VJTlQ4IEJ5dGVbTUFYX0VFUFJPTV9MRU4gPDwgMl07CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXJyYXkgb2Ygd29yZC13aWRlIGRhdGEgaXRlbXMuCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UMTYgV29yZFtNQVhfRUVQUk9NX0xFTiA8PCAxXTsKKworICAgICAgICAvLyBBcnJheSBvZiBkd29yZC13aWRlIGRhdGEgaXRlbXMuCisKKyAgICAgICAgUFhFX1VJTlQzMiBEd29yZFtNQVhfRUVQUk9NX0xFTl07CisgICAgfSBEYXRhOworfSBQWEVfREJfTlZEQVRBOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2RiX2dldF9zdGF0dXMgeworICAgIC8vCisgICAgLy8gTGVuZ3RoIG9mIG5leHQgcmVjZWl2ZSBmcmFtZSAoaGVhZGVyICsgZGF0YSkuICBJZiB0aGlzIGlzIHplcm8sCisgICAgLy8gdGhlcmUgaXMgbm8gbmV4dCByZWNlaXZlIGZyYW1lIGF2YWlsYWJsZS4KKyAgICAvLworICAgIFBYRV9VSU5UMzIgUnhGcmFtZUxlbjsKKworICAgIC8vCisgICAgLy8gUmVzZXJ2ZWQsIHNldCB0byB6ZXJvLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiByZXNlcnZlZDsKKworICAgIC8vCisgICAgLy8gIEFkZHJlc3NlcyBvZiB0cmFuc21pdHRlZCBidWZmZXJzIHRoYXQgbmVlZCB0byBiZSByZWN5Y2xlZC4KKyAgICAvLworICAgIFBYRV9VSU5UNjQgVHhCdWZmZXJbTUFYX1hNSVRfQlVGRkVSU107Cit9IFBYRV9EQl9HRVRfU1RBVFVTOworCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX2ZpbGxfaGVhZGVyIHsKKyAgICAvLworICAgIC8vIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gTUFDIGFkZHJlc3Nlcy4gIFRoZXNlIHdpbGwgYmUgY29waWVkIGludG8KKyAgICAvLyB0aGUgbWVkaWEgaGVhZGVyIHdpdGhvdXQgZG9pbmcgYnl0ZSBzd2FwcGluZy4KKyAgICAvLworICAgIFBYRV9NQUNfQUREUiBTcmNBZGRyOworICAgIFBYRV9NQUNfQUREUiBEZXN0QWRkcjsKKworICAgIC8vCisgICAgLy8gQWRkcmVzcyBvZiBmaXJzdCBieXRlIG9mIG1lZGlhIGhlYWRlci4gIFRoZSBmaXJzdCBieXRlIG9mIHBhY2tldCBkYXRhCisgICAgLy8gZm9sbG93cyB0aGUgbGFzdCBieXRlIG9mIHRoZSBtZWRpYSBoZWFkZXIuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IE1lZGlhSGVhZGVyOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgcGFja2V0IGRhdGEgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgdGhlIG1lZGlhIGhlYWRlcikuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIFBhY2tldExlbjsKKworICAgIC8vCisgICAgLy8gUHJvdG9jb2wgdHlwZS4gIFRoaXMgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgbWVkaWEgaGVhZGVyIHdpdGhvdXQKKyAgICAvLyBkb2luZyBieXRlIHN3YXBwaW5nLiAgUHJvdG9jb2wgdHlwZSBudW1iZXJzIGNhbiBiZSBvYnRhaW5lZCBmcm9tCisgICAgLy8gdGhlIEFzc2lnbmVkIE51bWJlcnMgUkZDIDE3MDAuCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IFByb3RvY29sOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgdGhlIG1lZGlhIGhlYWRlciBpbiBieXRlcy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgTWVkaWFIZWFkZXJMZW47Cit9IFBYRV9DUEJfRklMTF9IRUFERVI7CisKKworI2RlZmluZSBQWEVfUFJPVE9DT0xfRVRIRVJORVRfSVAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFBYRV9QUk9UT0NPTF9FVEhFUk5FVF9BUlAgICAgICAgICAgICAgICAweDA4MDYKKyNkZWZpbmUgTUFYX1hNSVRfRlJBR01FTlRTIDE2CisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NwYl9maWxsX2hlYWRlcl9mcmFnbWVudGVkIHsKKyAgICAvLworICAgIC8vIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gTUFDIGFkZHJlc3Nlcy4gIFRoZXNlIHdpbGwgYmUgY29waWVkIGludG8KKyAgICAvLyB0aGUgbWVkaWEgaGVhZGVyIHdpdGhvdXQgZG9pbmcgYnl0ZSBzd2FwcGluZy4KKyAgICAvLworICAgIFBYRV9NQUNfQUREUiBTcmNBZGRyOworICAgIFBYRV9NQUNfQUREUiBEZXN0QWRkcjsKKworICAgIC8vCisgICAgLy8gTGVuZ3RoIG9mIHBhY2tldCBkYXRhIGluIGJ5dGVzIChub3QgaW5jbHVkaW5nIHRoZSBtZWRpYSBoZWFkZXIpLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBQYWNrZXRMZW47CisKKyAgICAvLworICAgIC8vIFByb3RvY29sIHR5cGUuICBUaGlzIHdpbGwgYmUgY29waWVkIGludG8gdGhlIG1lZGlhIGhlYWRlciB3aXRob3V0CisgICAgLy8gZG9pbmcgYnl0ZSBzd2FwcGluZy4gIFByb3RvY29sIHR5cGUgbnVtYmVycyBjYW4gYmUgb2J0YWluZWQgZnJvbQorICAgIC8vIHRoZSBBc3NpZ25lZCBOdW1iZXJzIFJGQyAxNzAwLgorICAgIC8vCisgICAgUFhFX01FRElBX1BST1RPQ09MIFByb3RvY29sOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgdGhlIG1lZGlhIGhlYWRlciBpbiBieXRlcy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgTWVkaWFIZWFkZXJMZW47CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBwYWNrZXQgZnJhZ21lbnQgZGVzY3JpcHRvcnMuCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IEZyYWdDbnQ7CisKKyAgICAvLworICAgIC8vIFJlc2VydmVkLCBtdXN0IGJlIHNldCB0byB6ZXJvLgorICAgIC8vCisgICAgUFhFX1VJTlQxNiByZXNlcnZlZDsKKworICAgIC8vCisgICAgLy8gQXJyYXkgb2YgcGFja2V0IGZyYWdtZW50IGRlc2NyaXB0b3JzLiAgVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lZGlhCisgICAgLy8gaGVhZGVyIGlzIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaXJzdCBmcmFnbWVudC4KKyAgICAvLworICAgIHN0cnVjdCB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEFkZHJlc3Mgb2YgdGhpcyBwYWNrZXQgZnJhZ21lbnQuCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UNjQgRnJhZ0FkZHI7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgcGFja2V0IGZyYWdtZW50LgorICAgICAgICAvLworICAgICAgICBQWEVfVUlOVDMyIEZyYWdMZW47CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIHplcm8uCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UMzIgcmVzZXJ2ZWQ7CisgICAgfSBGcmFnRGVzY1tNQVhfWE1JVF9GUkFHTUVOVFNdOworfSBQWEVfQ1BCX0ZJTExfSEVBREVSX0ZSQUdNRU5URUQ7CisKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfdHJhbnNtaXQgeworICAgIC8vCisgICAgLy8gQWRkcmVzcyBvZiBmaXJzdCBieXRlIG9mIGZyYW1lIGJ1ZmZlci4gIFRoaXMgaXMgYWxzbyB0aGUgZmlyc3QgYnl0ZQorICAgIC8vIG9mIHRoZSBtZWRpYSBoZWFkZXIuCisgICAgLy8KKyAgICBQWEVfVUlOVDY0IEZyYW1lQWRkcjsKKworICAgIC8vCisgICAgLy8gTGVuZ3RoIG9mIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIGZyYW1lIGJ1ZmZlciBpbiBieXRlcy4gIERvIG5vdAorICAgIC8vIGluY2x1ZGUgdGhlIGxlbmd0aCBvZiB0aGUgbWVkaWEgaGVhZGVyLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBEYXRhTGVuOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgdGhlIG1lZGlhIGhlYWRlciBpbiBieXRlcy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgTWVkaWFoZWFkZXJMZW47CisKKyAgICAvLworICAgIC8vIFJlc2VydmVkLCBtdXN0IGJlIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IHJlc2VydmVkOworfSBQWEVfQ1BCX1RSQU5TTUlUOworCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3RyYW5zbWl0X2ZyYWdtZW50cyB7CisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgcGFja2V0IGRhdGEgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgdGhlIG1lZGlhIGhlYWRlcikuCisgICAgLy8KKyAgICBQWEVfVUlOVDMyIEZyYW1lTGVuOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgdGhlIG1lZGlhIGhlYWRlciBpbiBieXRlcy4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgTWVkaWFoZWFkZXJMZW47CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBwYWNrZXQgZnJhZ21lbnQgZGVzY3JpcHRvcnMuCisgICAgLy8KKyAgICBQWEVfVUlOVDE2IEZyYWdDbnQ7CisKKyAgICAvLworICAgIC8vIEFycmF5IG9mIGZyYW1lIGZyYWdtZW50IGRlc2NyaXB0b3JzLiAgVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGZpcnN0CisgICAgLy8gZnJhZ21lbnQgaXMgYWxzbyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVkaWEgaGVhZGVyLgorICAgIC8vCisgICAgc3RydWN0IHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRkcmVzcyBvZiB0aGlzIGZyYW1lIGZyYWdtZW50LgorICAgICAgICAvLworICAgICAgICBQWEVfVUlOVDY0IEZyYWdBZGRyOworCisgICAgICAgIC8vCisgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIGZyYW1lIGZyYWdtZW50LgorICAgICAgICAvLworICAgICAgICBQWEVfVUlOVDMyIEZyYWdMZW47CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIHplcm8uCisgICAgICAgIC8vCisgICAgICAgIFBYRV9VSU5UMzIgcmVzZXJ2ZWQ7CisgICAgfSBGcmFnRGVzY1tNQVhfWE1JVF9GUkFHTUVOVFNdOworfSBQWEVfQ1BCX1RSQU5TTUlUX0ZSQUdNRU5UUzsKKworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfcmVjZWl2ZSB7CisgICAgLy8KKyAgICAvLyBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgcmVjZWl2ZSBidWZmZXIuICBUaGlzIGlzIGFsc28gdGhlIGZpcnN0IGJ5dGUKKyAgICAvLyBvZiB0aGUgZnJhbWUgaGVhZGVyLgorICAgIC8vCisgICAgUFhFX1VJTlQ2NCBCdWZmZXJBZGRyOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgcmVjZWl2ZSBidWZmZXIuICBUaGlzIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCisgICAgLy8gcmVjZWl2ZWQgZnJhbWUgKG1lZGlhIGhlYWRlciArIGRhdGEpLiAgSWYgdGhlIGxlbmd0aCBvZiBzbWFsbGVyIHRoYW4KKyAgICAvLyB0aGUgcmVjZWl2ZWQgZnJhbWUsIGRhdGEgd2lsbCBiZSBsb3N0LgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBCdWZmZXJMZW47CisKKyAgICAvLworICAgIC8vIFJlc2VydmVkLCBtdXN0IGJlIHNldCB0byB6ZXJvLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiByZXNlcnZlZDsKK30gUFhFX0NQQl9SRUNFSVZFOworCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2RiX3JlY2VpdmUgeworICAgIC8vCisgICAgLy8gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzc2VzIGZyb20gbWVkaWEgaGVhZGVyLgorICAgIC8vCisgICAgUFhFX01BQ19BRERSIFNyY0FkZHI7CisgICAgUFhFX01BQ19BRERSIERlc3RBZGRyOworCisgICAgLy8KKyAgICAvLyBMZW5ndGggb2YgcmVjZWl2ZWQgZnJhbWUuICBNYXkgYmUgbGFyZ2VyIHRoYW4gcmVjZWl2ZSBidWZmZXIgc2l6ZS4KKyAgICAvLyBUaGUgcmVjZWl2ZSBidWZmZXIgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4uICBUaGlzIGlzIGhvdyB0byB0ZWxsCisgICAgLy8gaWYgZGF0YSB3YXMgbG9zdCBiZWNhdXNlIHRoZSByZWNlaXZlIGJ1ZmZlciB3YXMgdG9vIHNtYWxsLgorICAgIC8vCisgICAgUFhFX1VJTlQzMiBGcmFtZUxlbjsKKworICAgIC8vCisgICAgLy8gUHJvdG9jb2wgdHlwZSBmcm9tIG1lZGlhIGhlYWRlci4KKyAgICAvLworICAgIFBYRV9NRURJQV9QUk9UT0NPTCBQcm90b2NvbDsKKworICAgIC8vCisgICAgLy8gTGVuZ3RoIG9mIG1lZGlhIGhlYWRlciBpbiByZWNlaXZlZCBmcmFtZS4KKyAgICAvLworICAgIFBYRV9VSU5UMTYgTWVkaWFIZWFkZXJMZW47CisKKyAgICAvLworICAgIC8vIFR5cGUgb2YgcmVjZWl2ZSBmcmFtZS4KKyAgICAvLworICAgIFBYRV9GUkFNRV9UWVBFIFR5cGU7CisKKyAgICAvLworICAgIC8vIFJlc2VydmVkLCBtdXN0IGJlIHplcm8uCisgICAgLy8KKyAgICBQWEVfVUlOVDggcmVzZXJ2ZWRbN107CisKK30gUFhFX0RCX1JFQ0VJVkU7CisKKyNwcmFnbWEgcGFjaygpCisKKy8qIEVPRiAtIGVmaV9weGUuaCAqLworI2VuZGlmIC8qIF9FRklfUFhFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpYXBpLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlhcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ3MzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpYXBpLmgKQEAgLTAsMCArMSw4OTAgQEAKKyNpZm5kZWYgX0VGSV9BUElfSAorI2RlZmluZSBfRUZJX0FQSV9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaWFwaS5oCisKK0Fic3RyYWN0OgorCisgICAgR2xvYmFsIEVGSSBydW50aW1lICYgYm9vdCBzZXJ2aWNlIGludGVyZmFjZXMKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBFRkkgU3BlY2lmaWNhdGlvbiBSZXZpc2lvbgorLy8KKworI2RlZmluZSBFRklfU1BFQ0lGSUNBVElPTl9NQUpPUl9SRVZJU0lPTiAxCisjZGVmaW5lIEVGSV9TUEVDSUZJQ0FUSU9OX01JTk9SX1JFVklTSU9OIDAyCisKKy8vCisvLyBEZWNsYXJlIGZvcndhcmQgcmVmZXJlbmNlZCBkYXRhIHN0cnVjdHVyZXMKKy8vCisKK0lOVEVSRkFDRV9ERUNMKF9FRklfU1lTVEVNX1RBQkxFKTsKKworLy8KKy8vIEVGSSBNZW1vcnkKKy8vCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9BTExPQ0FURV9QQUdFUykgKAorICAgIElOIEVGSV9BTExPQ0FURV9UWVBFICAgICAgICAgICAgVHlwZSwKKyAgICBJTiBFRklfTUVNT1JZX1RZUEUgICAgICAgICAgICAgIE1lbW9yeVR5cGUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBOb1BhZ2VzLAorICAgIE9VVCBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgKk1lbW9yeQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GUkVFX1BBR0VTKSAoCisgICAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICBNZW1vcnksCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBOb1BhZ2VzCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dFVF9NRU1PUllfTUFQKSAoCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqTWVtb3J5TWFwU2l6ZSwKKyAgICBJTiBPVVQgRUZJX01FTU9SWV9ERVNDUklQVE9SICAgICpNZW1vcnlNYXAsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqTWFwS2V5LAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKkRlc2NyaXB0b3JTaXplLAorICAgIE9VVCBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgKkRlc2NyaXB0b3JWZXJzaW9uCisgICAgKTsKKworI2RlZmluZSBOZXh0TWVtb3J5RGVzY3JpcHRvcihQdHIsU2l6ZSkgICgoRUZJX01FTU9SWV9ERVNDUklQVE9SICopICgoKFVJTlQ4ICopIFB0cikgKyBTaXplKSkKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQUxMT0NBVEVfUE9PTCkgKAorICAgIElOIEVGSV9NRU1PUllfVFlQRSAgICAgICAgICAgICAgUG9vbFR5cGUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBTaXplLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgKipCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRlJFRV9QT09MKSAoCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVRfVklSVFVBTF9BRERSRVNTX01BUCkgKAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5TWFwU2l6ZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JTaXplLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclZlcnNpb24sCisgICAgSU4gRUZJX01FTU9SWV9ERVNDUklQVE9SICAgICAgICAqVmlydHVhbE1hcAorICAgICk7CisKKworI2RlZmluZSBFRklfT1BUSU9OQUxfUFRSICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFRklfSU5URVJOQUxfRk5DICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8vIFBvaW50ZXIgdG8gaW50ZXJuYWwgcnVudGltZSBmbmMKKyNkZWZpbmUgRUZJX0lOVEVSTkFMX1BUUiAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgICAvLyBQb2ludGVyIHRvIGludGVybmFsIHJ1bnRpbWUgZGF0YQorCisKK3R5cGVkZWYgCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ09OVkVSVF9QT0lOVEVSKSAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0Rpc3Bvc2l0aW9uLAorICAgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgKipBZGRyZXNzCisgICAgKTsKKworCisvLworLy8gRUZJIEV2ZW50cworLy8KKworCisKKyNkZWZpbmUgRVZUX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBFVlRfUlVOVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEVWVF9SVU5USU1FX0NPTlRFWFQgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKworI2RlZmluZSBFVlRfTk9USUZZX1dBSVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEVWVF9OT1RJRllfU0lHTkFMICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKworI2RlZmluZSBFVlRfU0lHTkFMX0VYSVRfQk9PVF9TRVJWSUNFUyAgICAgICAweDAwMDAwMjAxCisjZGVmaW5lIEVWVF9TSUdOQUxfVklSVFVBTF9BRERSRVNTX0NIQU5HRSAgIDB4NjAwMDAyMDIKKworI2RlZmluZSBFVlRfRUZJX1NJR05BTF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCisjZGVmaW5lIEVWVF9FRklfU0lHTkFMX01BWCAgICAgICAgICAgICAgICAgIDIKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX0VWRU5UX05PVElGWSkgKAorICAgIElOIEVGSV9FVkVOVCAgICAgICAgICAgICAgICBFdmVudCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkNvbnRleHQKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ1JFQVRFX0VWRU5UKSAoCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBUeXBlLAorICAgIElOIEVGSV9UUEwgICAgICAgICAgICAgICAgICAgICAgTm90aWZ5VHBsLAorICAgIElOIEVGSV9FVkVOVF9OT1RJRlkgICAgICAgICAgICAgTm90aWZ5RnVuY3Rpb24sCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqTm90aWZ5Q29udGV4dCwKKyAgICBPVVQgRUZJX0VWRU5UICAgICAgICAgICAgICAgICAgICpFdmVudAorICAgICk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgVGltZXJDYW5jZWwsCisgICAgVGltZXJQZXJpb2RpYywKKyAgICBUaW1lclJlbGF0aXZlLAorICAgIFRpbWVyVHlwZU1heAorfSBFRklfVElNRVJfREVMQVk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVRfVElNRVIpICgKKyAgICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQsCisgICAgSU4gRUZJX1RJTUVSX0RFTEFZICAgICAgICAgIFR5cGUsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgIFRyaWdnZXJUaW1lCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NJR05BTF9FVkVOVCkgKAorICAgIElOIEVGSV9FVkVOVCAgICAgICAgICAgICAgICBFdmVudAorICAgICk7CisKK3R5cGVkZWYgCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfV0FJVF9GT1JfRVZFTlQpICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZFdmVudHMsCisgICAgSU4gRUZJX0VWRU5UICAgICAgICAgICAgICAgICpFdmVudCwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgKkluZGV4CisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0NMT1NFX0VWRU5UKSAoCisgICAgSU4gRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50CisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0NIRUNLX0VWRU5UKSAoCisgICAgSU4gRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50CisgICAgKTsKKworLy8KKy8vIFRhc2sgcHJpb3JpdHkgbGV2ZWwKKy8vCisKKyNkZWZpbmUgVFBMX0FQUExJQ0FUSU9OICAgIDQKKyNkZWZpbmUgVFBMX0NBTExCQUNLICAgICAgIDgKKyNkZWZpbmUgVFBMX05PVElGWSAgICAgICAgMTYgCisjZGVmaW5lIFRQTF9ISUdIX0xFVkVMICAgIDMxIAorCit0eXBlZGVmCitFRklfVFBMCisoRUZJQVBJICpFRklfUkFJU0VfVFBMKSAoCisgICAgSU4gRUZJX1RQTCAgICAgIE5ld1RwbAorICAgICk7CisKK3R5cGVkZWYKK1ZPSUQKKyhFRklBUEkgKkVGSV9SRVNUT1JFX1RQTCkgKAorICAgIElOIEVGSV9UUEwgICAgICBPbGRUcGwKKyAgICApOworCisKKy8vCisvLyBFRkkgcGxhdGZvcm0gdmFyaWJsZXMKKy8vCisKKyNkZWZpbmUgRUZJX0dMT0JBTF9WQVJJQUJMRSAgICAgXAorICAgIHsgMHg4QkU0REY2MSwgMHg5M0NBLCAweDExZDIsIHsweEFBLCAweDBELCAweDAwLCAweEUwLCAweDk4LCAweDAzLCAweDJCLCAweDhDfSB9CisKKy8vIFZhcmlhYmxlIGF0dHJpYnV0ZXMKKyNkZWZpbmUgRUZJX1ZBUklBQkxFX05PTl9WT0xBVElMRSAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFRklfVkFSSUFCTEVfQk9PVFNFUlZJQ0VfQUNDRVNTICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVGSV9WQVJJQUJMRV9SVU5USU1FX0FDQ0VTUyAgICAgICAgIDB4MDAwMDAwMDQKKworLy8gVmFyaWFibGUgc2l6ZSBsaW1pdGF0aW9uCisjZGVmaW5lIEVGSV9NQVhJTVVNX1ZBUklBQkxFX1NJWkUgICAgICAgICAgIDEwMjQKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dFVF9WQVJJQUJMRSkgKAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICpWZW5kb3JHdWlkLAorICAgIE9VVCBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgKkF0dHJpYnV0ZXMgT1BUSU9OQUwsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqRGF0YVNpemUsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqRGF0YQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfTkVYVF9WQVJJQUJMRV9OQU1FKSAoCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqVmFyaWFibGVOYW1lU2l6ZSwKKyAgICBJTiBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICpWYXJpYWJsZU5hbWUsCisgICAgSU4gT1VUIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqVmVuZG9yR3VpZAorICAgICk7CisKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9WQVJJQUJMRSkgKAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICpWZW5kb3JHdWlkLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKkRhdGEKKyAgICApOworCisKKy8vCisvLyBFRkkgVGltZQorLy8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbjsgICAgIC8vIDFlLTYgcGFydHMgcGVyIG1pbGxpb24KKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIEFjY3VyYWN5OyAgICAgICAvLyBoZXJ0egorICAgICAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgU2V0c1RvWmVybzsgICAgIC8vIFNldCBjbGVhcnMgc3ViLXNlY29uZCB0aW1lCit9IEVGSV9USU1FX0NBUEFCSUxJVElFUzsKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX1RJTUUpICgKKyAgICBPVVQgRUZJX1RJTUUgICAgICAgICAgICAgICAgICAgICpUaW1lLAorICAgIE9VVCBFRklfVElNRV9DQVBBQklMSVRJRVMgICAgICAgKkNhcGFiaWxpdGllcyBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVRfVElNRSkgKAorICAgIElOIEVGSV9USU1FICAgICAgICAgICAgICAgICAgICAgKlRpbWUKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX1dBS0VVUF9USU1FKSAoCisgICAgT1VUIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAqRW5hYmxlZCwKKyAgICBPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICpQZW5kaW5nLAorICAgIE9VVCBFRklfVElNRSAgICAgICAgICAgICAgICAgICAgKlRpbWUKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VUX1dBS0VVUF9USU1FKSAoCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBFbmFibGUsCisgICAgSU4gRUZJX1RJTUUgICAgICAgICAgICAgICAgICAgICAqVGltZSBPUFRJT05BTAorICAgICk7CisKKworLy8KKy8vIEltYWdlIGZ1bmN0aW9ucworLy8KKworCisvLyBQRTMyKyBTdWJzeXN0ZW0gdHlwZSBmb3IgRUZJIGltYWdlcworCisjaWYgIWRlZmluZWQoSU1BR0VfU1VCU1lTVEVNX0VGSV9BUFBMSUNBVElPTikKKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX0VGSV9BUFBMSUNBVElPTiAgICAgICAgICAgICAxMAorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fRUZJX0JPT1RfU0VSVklDRV9EUklWRVIgICAgIDExCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9FRklfUlVOVElNRV9EUklWRVIgICAgICAgICAgMTIKKyNlbmRpZgorCisvLyBQRTMyKyBNYWNoaW5lIHR5cGUgZm9yIEVGSSBpbWFnZXMKKworI2lmICFkZWZpbmVkKEVGSV9JTUFHRV9NQUNISU5FX0lBMzIpCisjZGVmaW5lIEVGSV9JTUFHRV9NQUNISU5FX0lBMzIgICAgICAweDAxNGMKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRUZJX0lNQUdFX01BQ0hJTkVfSUE2NCkKKyNkZWZpbmUgRUZJX0lNQUdFX01BQ0hJTkVfSUE2NCAgICAgIDB4MDIwMAorI2VuZGlmCisKKy8vIEltYWdlIEVudHJ5IHByb3RvdHlwZQorCit0eXBlZGVmIAorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lNQUdFX0VOVFJZX1BPSU5UKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TWVNURU1fVEFCTEUgICAgICpTeXN0ZW1UYWJsZQorICAgICk7CisKK3R5cGVkZWYgCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU1BR0VfTE9BRCkgKAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgQm9vdFBvbGljeSwKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIFBhcmVudEltYWdlSGFuZGxlLAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgKkZpbGVQYXRoLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKlNvdXJjZUJ1ZmZlciAgIE9QVElPTkFMLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlU2l6ZSwKKyAgICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICpJbWFnZUhhbmRsZQorICAgICk7CisKK3R5cGVkZWYgCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU1BR0VfU1RBUlQpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKkV4aXREYXRhU2l6ZSwKKyAgICBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICoqRXhpdERhdGEgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0VYSVQpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIElOIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgRXhpdFN0YXR1cywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEV4aXREYXRhU2l6ZSwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICpFeGl0RGF0YSBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYgCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU1BR0VfVU5MT0FEKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZQorICAgICk7CisKKworLy8gSW1hZ2UgaGFuZGxlCisjZGVmaW5lIExPQURFRF9JTUFHRV9QUk9UT0NPTCAgICAgIFwKKyAgICB7IDB4NUIxQjMxQTEsIDB4OTU2MiwgMHgxMWQyLCB7MHg4RSwgMHgzRiwgMHgwMCwgMHhBMCwgMHhDOSwgMHg2OSwgMHg3MiwgMHgzQn0gfQorCisjZGVmaW5lIEVGSV9JTUFHRV9JTkZPUk1BVElPTl9SRVZJU0lPTiAgICAgIDB4MTAwMAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2aXNpb247CisgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICBQYXJlbnRIYW5kbGU7CisgICAgc3RydWN0IF9FRklfU1lTVEVNX1RBQkxFICAgICAgICAqU3lzdGVtVGFibGU7CisKKyAgICAvLyBTb3VyY2UgbG9jYXRpb24gb2YgaW1hZ2UKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgIERldmljZUhhbmRsZTsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICpGaWxlUGF0aDsKKyAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSZXNlcnZlZDsKKworICAgIC8vIEltYWdlcyBsb2FkIG9wdGlvbnMKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRPcHRpb25zU2l6ZTsKKyAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICpMb2FkT3B0aW9uczsKKworICAgIC8vIExvY2F0aW9uIG9mIHdoZXJlIGltYWdlIHdhcyBsb2FkZWQKKyAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICpJbWFnZUJhc2U7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVNpemU7CisgICAgRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgICAgICBJbWFnZUNvZGVUeXBlOworICAgIEVGSV9NRU1PUllfVFlQRSAgICAgICAgICAgICAgICAgSW1hZ2VEYXRhVHlwZTsKKworICAgIC8vIElmIHRoZSBkcml2ZXIgaW1hZ2Ugc3VwcG9ydHMgYSBkeW5hbWljIHVubG9hZCByZXF1ZXN0CisgICAgRUZJX0lNQUdFX1VOTE9BRCAgICAgICAgICAgICAgICBVbmxvYWQ7CisKK30gRUZJX0xPQURFRF9JTUFHRTsKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRVhJVF9CT09UX1NFUlZJQ0VTKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE1hcEtleQorICAgICk7CisKKy8vCisvLyBNaXNjCisvLworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TVEFMTCkgKAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBNaWNyb3NlY29uZHMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VUX1dBVENIRE9HX1RJTUVSKSAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgIFdhdGNoZG9nQ29kZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgRGF0YVNpemUsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICpXYXRjaGRvZ0RhdGEgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ09OTkVDVF9DT05UUk9MTEVSKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUsCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgICpEcml2ZXJJbWFnZUhhbmRsZSBPUFRJT05BTCwKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAgICAgKlJlbWFpbmluZ0RldmljZVBhdGggT1BUSU9OQUwsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgIFJlY3Vyc2l2ZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9ESVNDT05ORUNUX0NPTlRST0xMRVIpICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZSwKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgRHJpdmVySW1hZ2VIYW5kbGUgT1BUSU9OQUwsCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIENoaWxkSGFuZGxlIE9QVElPTkFMCisgICAgKTsKKworI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9CWV9IQU5ETEVfUFJPVE9DT0wgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfR0VUX1BST1RPQ09MICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX1RFU1RfUFJPVE9DT0wgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9CWV9DSElMRF9DT05UUk9MTEVSIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfQllfRFJJVkVSICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX0VYQ0xVU0lWRSAgICAgICAgICAgMHgwMDAwMDAyMAorCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfT1BFTl9QUk9UT0NPTCkgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBIYW5kbGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgKipJbnRlcmZhY2UgT1BUSU9OQUwsCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEFnZW50SGFuZGxlLAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0NMT1NFX1BST1RPQ09MKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBBZ2VudEhhbmRsZSwKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZQorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgQWdlbnRIYW5kbGU7CisgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXM7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIE9wZW5Db3VudDsKK30gRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT05fRU5UUlk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9PUEVOX1BST1RPQ09MX0lORk9STUFUSU9OKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIE9VVCBFRklfT1BFTl9QUk9UT0NPTF9JTkZPUk1BVElPTl9FTlRSWSAqKkVudHJ5QnVmZmVyLAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAqRW50cnlDb3VudAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QUk9UT0NPTFNfUEVSX0hBTkRMRSkgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBIYW5kbGUsCisgICAgT1VUIEVGSV9HVUlEICAgICAgICAgICAgICAgICoqKlByb3RvY29sQnVmZmVyLAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAqUHJvdG9jb2xCdWZmZXJDb3VudAorICAgICk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQWxsSGFuZGxlcywKKyAgICBCeVJlZ2lzdGVyTm90aWZ5LAorICAgIEJ5UHJvdG9jb2wKK30gRUZJX0xPQ0FURV9TRUFSQ0hfVFlQRTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0xPQ0FURV9IQU5ETEVfQlVGRkVSKSAoCisgICAgSU4gRUZJX0xPQ0FURV9TRUFSQ0hfVFlQRSAgIFNlYXJjaFR5cGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCBPUFRJT05BTCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKlNlYXJjaEtleSBPUFRJT05BTCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgKk5vSGFuZGxlcywKKyAgICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgKipCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfTE9DQVRFX1BST1RPQ09MKSAoCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKlJlZ2lzdHJhdGlvbiBPUFRJT05BTCwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgKipJbnRlcmZhY2UKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU5TVEFMTF9NVUxUSVBMRV9QUk9UT0NPTF9JTlRFUkZBQ0VTKSAoCisgICAgSU4gT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICpIYW5kbGUsCisgICAgLi4uCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VOSU5TVEFMTF9NVUxUSVBMRV9QUk9UT0NPTF9JTlRFUkZBQ0VTKSAoCisgICAgSU4gT1VUIEVGSV9IQU5ETEUgICAgICAgICAgIEhhbmRsZSwKKyAgICAuLi4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ0FMQ1VMQVRFX0NSQzMyKSAoCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpEYXRhLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBEYXRhU2l6ZSwKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgKkNyYzMyCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX0NPUFlfTUVNKSAoCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpEZXN0aW5hdGlvbiwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKlNvdXJjZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgTGVuZ3RoCisgICAgKTsKKwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1NFVF9NRU0pICgKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlciwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgU2l6ZSwKKyAgICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgVmFsdWUKKyAgICApOworCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DUkVBVEVfRVZFTlRfRVgpICgKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgVHlwZSwKKyAgICBJTiBFRklfVFBMICAgICAgICAgICAgICAgICAgTm90aWZ5VHBsLAorICAgIElOIEVGSV9FVkVOVF9OT1RJRlkgICAgICAgICBOb3RpZnlGdW5jdGlvbiBPUFRJT05BTCwKKyAgICBJTiBjb25zdCBWT0lEICAgICAgICAgICAgICAgKk5vdGlmeUNvbnRleHQgT1BUSU9OQUwsCisgICAgSU4gY29uc3QgRUZJX0dVSUQgICAgICAgICAgIEV2ZW50R3JvdXAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9FVkVOVCAgICAgICAgICAgICAgICpFdmVudAorICAgICk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpUmVzZXRDb2xkLAorICAgIEVmaVJlc2V0V2FybSwKKyAgICBFZmlSZXNldFNodXRkb3duCit9IEVGSV9SRVNFVF9UWVBFOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUkVTRVRfU1lTVEVNKSAoCisgICAgSU4gRUZJX1JFU0VUX1RZUEUgICAgICAgICAgIFJlc2V0VHlwZSwKKyAgICBJTiBFRklfU1RBVFVTICAgICAgICAgICAgICAgUmVzZXRTdGF0dXMsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIERhdGFTaXplLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAqUmVzZXREYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dFVF9ORVhUX01PTk9UT05JQ19DT1VOVCkgKAorICAgIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAqQ291bnQKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX05FWFRfSElHSF9NT05PX0NPVU5UKSAoCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICpIaWdoQ291bnQKKyAgICApOworCisvLworLy8gUHJvdG9jb2wgaGFuZGxlciBmdW5jdGlvbnMKKy8vCisKK3R5cGVkZWYgZW51bSB7CisgICAgRUZJX05BVElWRV9JTlRFUkZBQ0UsCisgICAgRUZJX1BDT0RFX0lOVEVSRkFDRQorfSBFRklfSU5URVJGQUNFX1RZUEU7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTlNUQUxMX1BST1RPQ09MX0lOVEVSRkFDRSkgKAorICAgIElOIE9VVCBFRklfSEFORExFICAgICAgICAgICAqSGFuZGxlLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgSU4gRUZJX0lOVEVSRkFDRV9UWVBFICAgICAgIEludGVyZmFjZVR5cGUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpJbnRlcmZhY2UKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUkVJTlNUQUxMX1BST1RPQ09MX0lOVEVSRkFDRSkgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBIYW5kbGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKk9sZEludGVyZmFjZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKk5ld0ludGVyZmFjZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VTklOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFKSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqSW50ZXJmYWNlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0hBTkRMRV9QUk9UT0NPTCkgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBIYW5kbGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgKipJbnRlcmZhY2UKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1JFR0lTVEVSX1BST1RPQ09MX05PVElGWSkgKAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgSU4gRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50LAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqKlJlZ2lzdHJhdGlvbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9MT0NBVEVfSEFORExFKSAoCisgICAgSU4gRUZJX0xPQ0FURV9TRUFSQ0hfVFlQRSAgIFNlYXJjaFR5cGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCBPUFRJT05BTCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKlNlYXJjaEtleSBPUFRJT05BTCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfTE9DQVRFX0RFVklDRV9QQVRIKSAoCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgICBJTiBPVVQgRUZJX0RFVklDRV9QQVRIICAgICAgKipEZXZpY2VQYXRoLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAqRGV2aWNlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lOU1RBTExfQ09ORklHVVJBVElPTl9UQUJMRSkgKAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqR3VpZCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKlRhYmxlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1JFU0VSVkVEX1NFUlZJQ0UpICgKKyAgICApOworCisvLworLy8gU3RhbmRhcmQgRUZJIHRhYmxlIGhlYWRlcgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9UQUJMRV9IRUFSREVSIHsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgQ1JDMzI7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOworfSBFRklfVEFCTEVfSEVBREVSOworCisKKy8vCisvLyBFRkkgUnVudGltZSBTZXJpdmNlcyBUYWJsZQorLy8KKworI2RlZmluZSBFRklfUlVOVElNRV9TRVJWSUNFU19TSUdOQVRVUkUgIDB4NTY1MjQ1NTM1NDRlNTU1MgorI2RlZmluZSBFRklfUlVOVElNRV9TRVJWSUNFU19SRVZJU0lPTiAgIChFRklfU1BFQ0lGSUNBVElPTl9NQUpPUl9SRVZJU0lPTjw8MTYpIHwgKEVGSV9TUEVDSUZJQ0FUSU9OX01JTk9SX1JFVklTSU9OKQorCit0eXBlZGVmIHN0cnVjdCAgeworICAgIEVGSV9UQUJMRV9IRUFERVIgICAgICAgICAgICAgICAgSGRyOworCisgICAgLy8KKyAgICAvLyBUaW1lIHNlcnZpY2VzCisgICAgLy8KKworICAgIEVGSV9HRVRfVElNRSAgICAgICAgICAgICAgICAgICAgR2V0VGltZTsKKyAgICBFRklfU0VUX1RJTUUgICAgICAgICAgICAgICAgICAgIFNldFRpbWU7CisgICAgRUZJX0dFVF9XQUtFVVBfVElNRSAgICAgICAgICAgICBHZXRXYWtldXBUaW1lOworICAgIEVGSV9TRVRfV0FLRVVQX1RJTUUgICAgICAgICAgICAgU2V0V2FrZXVwVGltZTsKKworICAgIC8vCisgICAgLy8gVmlydHVhbCBtZW1vcnkgc2VydmljZXMKKyAgICAvLworCisgICAgRUZJX1NFVF9WSVJUVUFMX0FERFJFU1NfTUFQICAgICBTZXRWaXJ0dWFsQWRkcmVzc01hcDsKKyAgICBFRklfQ09OVkVSVF9QT0lOVEVSICAgICAgICAgICAgIENvbnZlcnRQb2ludGVyOworCisgICAgLy8KKyAgICAvLyBWYXJpYWJsZSBzZXJ2aWVycworICAgIC8vCisKKyAgICBFRklfR0VUX1ZBUklBQkxFICAgICAgICAgICAgICAgIEdldFZhcmlhYmxlOworICAgIEVGSV9HRVRfTkVYVF9WQVJJQUJMRV9OQU1FICAgICAgR2V0TmV4dFZhcmlhYmxlTmFtZTsKKyAgICBFRklfU0VUX1ZBUklBQkxFICAgICAgICAgICAgICAgIFNldFZhcmlhYmxlOworCisgICAgLy8KKyAgICAvLyBNaXNjCisgICAgLy8KKworICAgIEVGSV9HRVRfTkVYVF9ISUdIX01PTk9fQ09VTlQgICAgR2V0TmV4dEhpZ2hNb25vdG9uaWNDb3VudDsKKyAgICBFRklfUkVTRVRfU1lTVEVNICAgICAgICAgICAgICAgIFJlc2V0U3lzdGVtOworCit9IEVGSV9SVU5USU1FX1NFUlZJQ0VTOworCisKKy8vCisvLyBFRkkgQm9vdCBTZXJ2aWNlcyBUYWJsZQorLy8KKworI2RlZmluZSBFRklfQk9PVF9TRVJWSUNFU19TSUdOQVRVUkUgICAgIDB4NTY1MjQ1NTM1NDRmNGY0MgorI2RlZmluZSBFRklfQk9PVF9TRVJWSUNFU19SRVZJU0lPTiAgICAgIChFRklfU1BFQ0lGSUNBVElPTl9NQUpPUl9SRVZJU0lPTjw8MTYpIHwgKEVGSV9TUEVDSUZJQ0FUSU9OX01JTk9SX1JFVklTSU9OKQorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0JPT1RfU0VSVklDRVMgeworCisgICAgRUZJX1RBQkxFX0hFQURFUiAgICAgICAgICAgICAgICBIZHI7CisKKyAgICAvLworICAgIC8vIFRhc2sgcHJpb3JpdHkgZnVuY3Rpb25zCisgICAgLy8KKworICAgIEVGSV9SQUlTRV9UUEwgICAgICAgICAgICAgICAgICAgUmFpc2VUUEw7CisgICAgRUZJX1JFU1RPUkVfVFBMICAgICAgICAgICAgICAgICBSZXN0b3JlVFBMOworCisgICAgLy8KKyAgICAvLyBNZW1vcnkgZnVuY3Rpb25zCisgICAgLy8KKworICAgIEVGSV9BTExPQ0FURV9QQUdFUyAgICAgICAgICAgICAgQWxsb2NhdGVQYWdlczsKKyAgICBFRklfRlJFRV9QQUdFUyAgICAgICAgICAgICAgICAgIEZyZWVQYWdlczsKKyAgICBFRklfR0VUX01FTU9SWV9NQVAgICAgICAgICAgICAgIEdldE1lbW9yeU1hcDsKKyAgICBFRklfQUxMT0NBVEVfUE9PTCAgICAgICAgICAgICAgIEFsbG9jYXRlUG9vbDsKKyAgICBFRklfRlJFRV9QT09MICAgICAgICAgICAgICAgICAgIEZyZWVQb29sOworCisgICAgLy8KKyAgICAvLyBFdmVudCAmIHRpbWVyIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICBFRklfQ1JFQVRFX0VWRU5UICAgICAgICAgICAgICAgIENyZWF0ZUV2ZW50OworICAgIEVGSV9TRVRfVElNRVIgICAgICAgICAgICAgICAgICAgU2V0VGltZXI7CisgICAgRUZJX1dBSVRfRk9SX0VWRU5UICAgICAgICAgICAgICBXYWl0Rm9yRXZlbnQ7CisgICAgRUZJX1NJR05BTF9FVkVOVCAgICAgICAgICAgICAgICBTaWduYWxFdmVudDsKKyAgICBFRklfQ0xPU0VfRVZFTlQgICAgICAgICAgICAgICAgIENsb3NlRXZlbnQ7CisgICAgRUZJX0NIRUNLX0VWRU5UICAgICAgICAgICAgICAgICBDaGVja0V2ZW50OworCisgICAgLy8KKyAgICAvLyBQcm90b2NvbCBoYW5kbGVyIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICBFRklfSU5TVEFMTF9QUk9UT0NPTF9JTlRFUkZBQ0UgIEluc3RhbGxQcm90b2NvbEludGVyZmFjZTsKKyAgICBFRklfUkVJTlNUQUxMX1BST1RPQ09MX0lOVEVSRkFDRSBSZWluc3RhbGxQcm90b2NvbEludGVyZmFjZTsKKyAgICBFRklfVU5JTlNUQUxMX1BST1RPQ09MX0lOVEVSRkFDRSBVbmluc3RhbGxQcm90b2NvbEludGVyZmFjZTsKKyAgICBFRklfSEFORExFX1BST1RPQ09MICAgICAgICAgICAgIEhhbmRsZVByb3RvY29sOworICAgIEVGSV9IQU5ETEVfUFJPVE9DT0wgICAgICAgICAgICAgUENIYW5kbGVQcm90b2NvbDsKKyAgICBFRklfUkVHSVNURVJfUFJPVE9DT0xfTk9USUZZICAgIFJlZ2lzdGVyUHJvdG9jb2xOb3RpZnk7CisgICAgRUZJX0xPQ0FURV9IQU5ETEUgICAgICAgICAgICAgICBMb2NhdGVIYW5kbGU7CisgICAgRUZJX0xPQ0FURV9ERVZJQ0VfUEFUSCAgICAgICAgICBMb2NhdGVEZXZpY2VQYXRoOworICAgIEVGSV9JTlNUQUxMX0NPTkZJR1VSQVRJT05fVEFCTEUgSW5zdGFsbENvbmZpZ3VyYXRpb25UYWJsZTsKKworICAgIC8vCisgICAgLy8gSW1hZ2UgZnVuY3Rpb25zCisgICAgLy8KKworICAgIEVGSV9JTUFHRV9MT0FEICAgICAgICAgICAgICAgICAgTG9hZEltYWdlOworICAgIEVGSV9JTUFHRV9TVEFSVCAgICAgICAgICAgICAgICAgU3RhcnRJbWFnZTsKKyAgICBFRklfRVhJVCAgICAgICAgICAgICAgICAgICAgICAgIEV4aXQ7CisgICAgRUZJX0lNQUdFX1VOTE9BRCAgICAgICAgICAgICAgICBVbmxvYWRJbWFnZTsKKyAgICBFRklfRVhJVF9CT09UX1NFUlZJQ0VTICAgICAgICAgIEV4aXRCb290U2VydmljZXM7CisKKyAgICAvLworICAgIC8vIE1pc2MgZnVuY3Rpb25zCisgICAgLy8KKworICAgIEVGSV9HRVRfTkVYVF9NT05PVE9OSUNfQ09VTlQgICAgR2V0TmV4dE1vbm90b25pY0NvdW50OworICAgIEVGSV9TVEFMTCAgICAgICAgICAgICAgICAgICAgICAgU3RhbGw7CisgICAgRUZJX1NFVF9XQVRDSERPR19USU1FUiAgICAgICAgICBTZXRXYXRjaGRvZ1RpbWVyOworCisgICAgLy8KKyAgICAvLyBEcml2ZXJTdXBwb3J0IFNlcnZpY2VzCisgICAgLy8KKworICAgIEVGSV9DT05ORUNUX0NPTlRST0xMRVIgICAgICAgICAgQ29ubmVjdENvbnRyb2xsZXI7CisgICAgRUZJX0RJU0NPTk5FQ1RfQ09OVFJPTExFUiAgICAgICBEaXNjb25uZWN0Q29udHJvbGxlcjsKKworICAgIC8vCisgICAgLy8gT3BlbiBhbmQgQ2xvc2UgUHJvdG9jb2wgU2VydmljZXMKKyAgICAvLworICAgIEVGSV9PUEVOX1BST1RPQ09MICAgICAgICAgICAgICAgT3BlblByb3RvY29sOworICAgIEVGSV9DTE9TRV9QUk9UT0NPTCAgICAgICAgICAgICAgQ2xvc2VQcm90b2NvbDsKKyAgICBFRklfT1BFTl9QUk9UT0NPTF9JTkZPUk1BVElPTiAgIE9wZW5Qcm90b2NvbEluZm9ybWF0aW9uOworCisgICAgLy8KKyAgICAvLyBMaWJyYXJ5IFNlcnZpY2VzCisgICAgLy8KKyAgICBFRklfUFJPVE9DT0xTX1BFUl9IQU5ETEUgICAgICAgIFByb3RvY29sc1BlckhhbmRsZTsKKyAgICBFRklfTE9DQVRFX0hBTkRMRV9CVUZGRVIgICAgICAgIExvY2F0ZUhhbmRsZUJ1ZmZlcjsKKyAgICBFRklfTE9DQVRFX1BST1RPQ09MICAgICAgICAgICAgIExvY2F0ZVByb3RvY29sOworICAgIEVGSV9JTlNUQUxMX01VTFRJUExFX1BST1RPQ09MX0lOVEVSRkFDRVMgSW5zdGFsbE11bHRpcGxlUHJvdG9jb2xJbnRlcmZhY2VzOworICAgIEVGSV9VTklOU1RBTExfTVVMVElQTEVfUFJPVE9DT0xfSU5URVJGQUNFUyBVbmluc3RhbGxNdWx0aXBsZVByb3RvY29sSW50ZXJmYWNlczsKKworICAgIC8vCisgICAgLy8gMzItYml0IENSQyBTZXJ2aWNlcworICAgIC8vCisgICAgRUZJX0NBTENVTEFURV9DUkMzMiAgICAgICAgICAgICBDYWxjdWxhdGVDcmMzMjsKKworICAgIC8vCisgICAgLy8gTWlzYyBTZXJ2aWNlcworICAgIC8vCisgICAgRUZJX0NPUFlfTUVNICAgICAgICAgICAgICAgICAgICBDb3B5TWVtOworICAgIEVGSV9TRVRfTUVNICAgICAgICAgICAgICAgICAgICAgU2V0TWVtOworICAgIEVGSV9DUkVBVEVfRVZFTlRfRVggICAgICAgICAgICAgQ3JlYXRlRXZlbnRFeDsKK30gRUZJX0JPT1RfU0VSVklDRVM7CisKKworLy8KKy8vIEVGSSBDb25maWd1cmF0aW9uIFRhYmxlIGFuZCBHVUlEIGRlZmluaXRpb25zCisvLworCisjZGVmaW5lIE1QU19UQUJMRV9HVUlEICAgIFwKKyAgICB7IDB4ZWI5ZDJkMmYsIDB4MmQ4OCwgMHgxMWQzLCB7MHg5YSwgMHgxNiwgMHgwLCAweDkwLCAweDI3LCAweDNmLCAweGMxLCAweDRkfSB9CisKKyNkZWZpbmUgQUNQSV9UQUJMRV9HVUlEICAgIFwKKyAgICB7IDB4ZWI5ZDJkMzAsIDB4MmQ4OCwgMHgxMWQzLCB7MHg5YSwgMHgxNiwgMHgwLCAweDkwLCAweDI3LCAweDNmLCAweGMxLCAweDRkfSB9CisKKyNkZWZpbmUgQUNQSV8yMF9UQUJMRV9HVUlEICBcCisgICAgeyAweDg4NjhlODcxLCAweGU0ZjEsIDB4MTFkMywgezB4YmMsIDB4MjIsIDB4MCwgMHg4MCwgMHhjNywgMHgzYywgMHg4OCwgMHg4MX0gfQorCisjZGVmaW5lIFNNQklPU19UQUJMRV9HVUlEICAgIFwKKyAgICB7IDB4ZWI5ZDJkMzEsIDB4MmQ4OCwgMHgxMWQzLCB7MHg5YSwgMHgxNiwgMHgwLCAweDkwLCAweDI3LCAweDNmLCAweGMxLCAweDRkfSB9CisKKyNkZWZpbmUgU0FMX1NZU1RFTV9UQUJMRV9HVUlEICAgIFwKKyAgICB7IDB4ZWI5ZDJkMzIsIDB4MmQ4OCwgMHgxMWQzLCB7MHg5YSwgMHgxNiwgMHgwLCAweDkwLCAweDI3LCAweDNmLCAweGMxLCAweDRkfSB9CisKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9DT05GSUdVUkFUSU9OX1RBQkxFIHsKKyAgICBFRklfR1VJRCAgICAgICAgICAgICAgICBWZW5kb3JHdWlkOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICpWZW5kb3JUYWJsZTsKK30gRUZJX0NPTkZJR1VSQVRJT05fVEFCTEU7CisKKworLy8KKy8vIEVGSSBTeXN0ZW0gVGFibGUKKy8vCisKKworCisKKyNkZWZpbmUgRUZJX1NZU1RFTV9UQUJMRV9TSUdOQVRVUkUgICAgICAweDU0NTM1OTUzMjA0OTQyNDkKKyNkZWZpbmUgRUZJX1NZU1RFTV9UQUJMRV9SRVZJU0lPTiAgICAgIChFRklfU1BFQ0lGSUNBVElPTl9NQUpPUl9SRVZJU0lPTjw8MTYpIHwgKEVGSV9TUEVDSUZJQ0FUSU9OX01JTk9SX1JFVklTSU9OKQorCit0eXBlZGVmIHN0cnVjdCBfRUZJX1NZU1RFTV9UQUJMRSB7CisgICAgRUZJX1RBQkxFX0hFQURFUiAgICAgICAgICAgICAgICBIZHI7CisKKyAgICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICpGaXJtd2FyZVZlbmRvcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcm13YXJlUmV2aXNpb247CisKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVJbkhhbmRsZTsKKyAgICBTSU1QTEVfSU5QVVRfSU5URVJGQUNFICAgICAgICAgICpDb25JbjsKKworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZU91dEhhbmRsZTsKKyAgICBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICpDb25PdXQ7CisKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkRXJyb3JIYW5kbGU7CisgICAgU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAqU3RkRXJyOworCisgICAgRUZJX1JVTlRJTUVfU0VSVklDRVMgICAgICAgICAgICAqUnVudGltZVNlcnZpY2VzOworICAgIEVGSV9CT09UX1NFUlZJQ0VTICAgICAgICAgICAgICAgKkJvb3RTZXJ2aWNlczsKKworICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZUYWJsZUVudHJpZXM7CisgICAgRUZJX0NPTkZJR1VSQVRJT05fVEFCTEUgICAgICAgICAqQ29uZmlndXJhdGlvblRhYmxlOworCit9IEVGSV9TWVNURU1fVEFCTEU7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmljb24uaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaWNvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OWRiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmljb24uaApAQCAtMCwwICsxLDMwMiBAQAorI2lmbmRlZiBfRUZJX0NPTl9ICisjZGVmaW5lIF9FRklfQ09OX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpY29uLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgY29uc29sZSBwcm90b2NvbHMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisvLworLy8gVGV4dCBvdXRwdXQgcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgU0lNUExFX1RFWFRfT1VUUFVUX1BST1RPQ09MIFwKKyAgICB7IDB4Mzg3NDc3YzIsIDB4NjljNywgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKK0lOVEVSRkFDRV9ERUNMKF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RFWFRfUkVTRVQpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRWZXJpZmljYXRpb24KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9PVVRQVVRfU1RSSU5HKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICpTdHJpbmcKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9URVNUX1NUUklORykgKAorICAgIElOIHN0cnVjdCBfU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKlRoaXMsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RFWFRfUVVFUllfTU9ERSkgKAorICAgIElOIHN0cnVjdCBfU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKlRoaXMsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBNb2RlTnVtYmVyLAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKkNvbHVtbnMsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqUm93cworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX1NFVF9NT0RFKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVOdW1iZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9TRVRfQVRUUklCVVRFKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZQorICAgICk7CisKKyNkZWZpbmUgRUZJX0JMQUNLICAgMHgwMAorI2RlZmluZSBFRklfQkxVRSAgICAweDAxCisjZGVmaW5lIEVGSV9HUkVFTiAgIDB4MDIKKyNkZWZpbmUgRUZJX0NZQU4gICAgICAgICAgICAoRUZJX0JMVUUgfCBFRklfR1JFRU4pCisjZGVmaW5lIEVGSV9SRUQgICAgIDB4MDQKKyNkZWZpbmUgRUZJX01BR0VOVEEgICAgICAgICAoRUZJX0JMVUUgfCBFRklfUkVEKQorI2RlZmluZSBFRklfQlJPV04gICAgICAgICAgIChFRklfR1JFRU4gfCBFRklfUkVEKQorI2RlZmluZSBFRklfTElHSFRHUkFZICAgICAgIChFRklfQkxVRSB8IEVGSV9HUkVFTiB8IEVGSV9SRUQpCisjZGVmaW5lIEVGSV9CUklHSFQgIDB4MDgKKyNkZWZpbmUgRUZJX0RBUktHUkFZICAgICAgICAoRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX0xJR0hUQkxVRSAgICAgICAoRUZJX0JMVUUgfCBFRklfQlJJR0hUKQorI2RlZmluZSBFRklfTElHSFRHUkVFTiAgICAgIChFRklfR1JFRU4gfCBFRklfQlJJR0hUKQorI2RlZmluZSBFRklfTElHSFRDWUFOICAgICAgIChFRklfQ1lBTiB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVFJFRCAgICAgICAgKEVGSV9SRUQgfCBFRklfQlJJR0hUKQorI2RlZmluZSBFRklfTElHSFRNQUdFTlRBICAgIChFRklfTUFHRU5UQSB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9ZRUxMT1cgICAgICAgICAgKEVGSV9CUk9XTiB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9XSElURSAgICAgICAgICAgKEVGSV9CTFVFIHwgRUZJX0dSRUVOIHwgRUZJX1JFRCB8IEVGSV9CUklHSFQpCisKKyNkZWZpbmUgRUZJX1RFWFRfQVRUUihmLGIpICAoKGYpIHwgKChiKSA8PCA0KSkKKworI2RlZmluZSBFRklfQkFDS0dST1VORF9CTEFDSyAgICAgICAgMHgwMAorI2RlZmluZSBFRklfQkFDS0dST1VORF9CTFVFICAgICAgICAgMHgxMAorI2RlZmluZSBFRklfQkFDS0dST1VORF9HUkVFTiAgICAgICAgMHgyMAorI2RlZmluZSBFRklfQkFDS0dST1VORF9DWUFOICAgICAgICAgKEVGSV9CQUNLR1JPVU5EX0JMVUUgfCBFRklfQkFDS0dST1VORF9HUkVFTikKKyNkZWZpbmUgRUZJX0JBQ0tHUk9VTkRfUkVEICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRUZJX0JBQ0tHUk9VTkRfTUFHRU5UQSAgICAgIChFRklfQkFDS0dST1VORF9CTFVFIHwgRUZJX0JBQ0tHUk9VTkRfUkVEKQorI2RlZmluZSBFRklfQkFDS0dST1VORF9CUk9XTiAgICAgICAgKEVGSV9CQUNLR1JPVU5EX0dSRUVOIHwgRUZJX0JBQ0tHUk9VTkRfUkVEKQorI2RlZmluZSBFRklfQkFDS0dST1VORF9MSUdIVEdSQVkgICAgKEVGSV9CQUNLR1JPVU5EX0JMVUUgfCBFRklfQkFDS0dST1VORF9HUkVFTiB8IEVGSV9CQUNLR1JPVU5EX1JFRCkKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9DTEVBUl9TQ1JFRU4pICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpUaGlzCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RFWFRfU0VUX0NVUlNPUl9QT1NJVElPTikgKAorICAgIElOIHN0cnVjdCBfU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKlRoaXMsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW4sCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBSb3cKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9FTkFCTEVfQ1VSU09SKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZQorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heE1vZGU7CisgICAgLy8gY3VycmVudCBzZXR0aW5ncworICAgIElOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZTsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvckNvbHVtbjsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvclJvdzsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvclZpc2libGU7Cit9IFNJTVBMRV9URVhUX09VVFBVVF9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBfU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSB7CisgICAgRUZJX1RFWFRfUkVTRVQgICAgICAgICAgICAgICAgICBSZXNldDsKKworICAgIEVGSV9URVhUX09VVFBVVF9TVFJJTkcgICAgICAgICAgT3V0cHV0U3RyaW5nOworICAgIEVGSV9URVhUX1RFU1RfU1RSSU5HICAgICAgICAgICAgVGVzdFN0cmluZzsKKworICAgIEVGSV9URVhUX1FVRVJZX01PREUgICAgICAgICAgICAgUXVlcnlNb2RlOworICAgIEVGSV9URVhUX1NFVF9NT0RFICAgICAgICAgICAgICAgU2V0TW9kZTsKKyAgICBFRklfVEVYVF9TRVRfQVRUUklCVVRFICAgICAgICAgIFNldEF0dHJpYnV0ZTsKKworICAgIEVGSV9URVhUX0NMRUFSX1NDUkVFTiAgICAgICAgICAgQ2xlYXJTY3JlZW47CisgICAgRUZJX1RFWFRfU0VUX0NVUlNPUl9QT1NJVElPTiAgICBTZXRDdXJzb3JQb3NpdGlvbjsKKyAgICBFRklfVEVYVF9FTkFCTEVfQ1VSU09SICAgICAgICAgIEVuYWJsZUN1cnNvcjsKKworICAgIC8vIEN1cnJlbnQgbW9kZQorICAgIFNJTVBMRV9URVhUX09VVFBVVF9NT0RFICAgICAgICAgKk1vZGU7Cit9IFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0U7CisKKy8vCisvLyBEZWZpbmUncyBmb3IgcmVxdWlyZWQgRUZJIFVuaWNvZGUgQm94IERyYXcgY2hhcmFjdGVyCisvLworCisjZGVmaW5lIEJPWERSQVdfSE9SSVpPTlRBTCAgICAgICAgICAgICAgICAgIDB4MjUwMAorI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMICAgICAgICAgICAgICAgICAgICAweDI1MDIKKyNkZWZpbmUgQk9YRFJBV19ET1dOX1JJR0hUICAgICAgICAgICAgICAgICAgMHgyNTBjCisjZGVmaW5lIEJPWERSQVdfRE9XTl9MRUZUICAgICAgICAgICAgICAgICAgIDB4MjUxMAorI2RlZmluZSBCT1hEUkFXX1VQX1JJR0hUICAgICAgICAgICAgICAgICAgICAweDI1MTQKKyNkZWZpbmUgQk9YRFJBV19VUF9MRUZUICAgICAgICAgICAgICAgICAgICAgMHgyNTE4CisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfUklHSFQgICAgICAgICAgICAgIDB4MjUxYworI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX0xFRlQgICAgICAgICAgICAgICAweDI1MjQKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0hPUklaT05UQUwgICAgICAgICAgICAgMHgyNTJjCisjZGVmaW5lIEJPWERSQVdfVVBfSE9SSVpPTlRBTCAgICAgICAgICAgICAgIDB4MjUzNAorI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX0hPUklaT05UQUwgICAgICAgICAweDI1M2MKKworI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9IT1JJWk9OVEFMICAgICAgICAgICAweDI1NTAKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfVkVSVElDQUwgICAgICAgICAgICAgMHgyNTUxCisjZGVmaW5lIEJPWERSQVdfRE9XTl9SSUdIVF9ET1VCTEUgICAgICAgICAgIDB4MjU1MgorI2RlZmluZSBCT1hEUkFXX0RPV05fRE9VQkxFX1JJR0hUICAgICAgICAgICAweDI1NTMKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfRE9XTl9SSUdIVCAgICAgICAgICAgMHgyNTU0CisKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0xFRlRfRE9VQkxFICAgICAgICAgICAgMHgyNTU1CisjZGVmaW5lIEJPWERSQVdfRE9XTl9ET1VCTEVfTEVGVCAgICAgICAgICAgIDB4MjU1NgorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9ET1dOX0xFRlQgICAgICAgICAgICAweDI1NTcKKworI2RlZmluZSBCT1hEUkFXX1VQX1JJR0hUX0RPVUJMRSAgICAgICAgICAgICAweDI1NTgKKyNkZWZpbmUgQk9YRFJBV19VUF9ET1VCTEVfUklHSFQgICAgICAgICAgICAgMHgyNTU5CisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX1VQX1JJR0hUICAgICAgICAgICAgIDB4MjU1YQorCisjZGVmaW5lIEJPWERSQVdfVVBfTEVGVF9ET1VCTEUgICAgICAgICAgICAgIDB4MjU1YgorI2RlZmluZSBCT1hEUkFXX1VQX0RPVUJMRV9MRUZUICAgICAgICAgICAgICAweDI1NWMKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfVVBfTEVGVCAgICAgICAgICAgICAgMHgyNTVkCisKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9SSUdIVF9ET1VCTEUgICAgICAgMHgyNTVlCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfRE9VQkxFX1JJR0hUICAgICAgIDB4MjU1ZgorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9WRVJUSUNBTF9SSUdIVCAgICAgICAweDI1NjAKKworI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX0xFRlRfRE9VQkxFICAgICAgICAweDI1NjEKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9ET1VCTEVfTEVGVCAgICAgICAgMHgyNTYyCisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX1ZFUlRJQ0FMX0xFRlQgICAgICAgIDB4MjU2MworCisjZGVmaW5lIEJPWERSQVdfRE9XTl9IT1JJWk9OVEFMX0RPVUJMRSAgICAgIDB4MjU2NAorI2RlZmluZSBCT1hEUkFXX0RPV05fRE9VQkxFX0hPUklaT05UQUwgICAgICAweDI1NjUKKyNkZWZpbmUgQk9YRFJBV19ET1VCTEVfRE9XTl9IT1JJWk9OVEFMICAgICAgMHgyNTY2CisKKyNkZWZpbmUgQk9YRFJBV19VUF9IT1JJWk9OVEFMX0RPVUJMRSAgICAgICAgMHgyNTY3CisjZGVmaW5lIEJPWERSQVdfVVBfRE9VQkxFX0hPUklaT05UQUwgICAgICAgIDB4MjU2OAorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9VUF9IT1JJWk9OVEFMICAgICAgICAweDI1NjkKKworI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX0hPUklaT05UQUxfRE9VQkxFICAweDI1NmEKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9ET1VCTEVfSE9SSVpPTlRBTCAgMHgyNTZiCisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX1ZFUlRJQ0FMX0hPUklaT05UQUwgIDB4MjU2YworCisvLworLy8gRUZJIFJlcXVpcmVkIEJsb2NrIEVsZW1lbnRzIENvZGUgQ2hhcnQKKy8vCisKKyNkZWZpbmUgQkxPQ0tFTEVNRU5UX0ZVTExfQkxPQ0sgICAgICAgICAgICAgMHgyNTg4CisjZGVmaW5lIEJMT0NLRUxFTUVOVF9MSUdIVF9TSEFERSAgICAgICAgICAgIDB4MjU5MQorLy8KKy8vIEVGSSBSZXF1aXJlZCBHZW9tZXRyaWMgU2hhcGVzIENvZGUgQ2hhcnQKKy8vCisKKyNkZWZpbmUgR0VPTUVUUklDU0hBUEVfVVBfVFJJQU5HTEUgICAgICAgICAgIDB4MjViMgorI2RlZmluZSBHRU9NRVRSSUNTSEFQRV9SSUdIVF9UUklBTkdMRSAgICAgICAgMHgyNWJhCisjZGVmaW5lIEdFT01FVFJJQ1NIQVBFX0RPV05fVFJJQU5HTEUgICAgICAgICAweDI1YmMKKyNkZWZpbmUgR0VPTUVUUklDU0hBUEVfTEVGVF9UUklBTkdMRSAgICAgICAgIDB4MjVjNAorCisvLworLy8gRUZJIFJlcXVpcmVkIEFycm93IHNoYXBlcworLy8KKworI2RlZmluZSBBUlJPV19VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxOTEKKyNkZWZpbmUgQVJST1dfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTkzCisKKy8vCisvLyBUZXh0IGlucHV0IHByb3RvY29sCisvLworCisjZGVmaW5lIFNJTVBMRV9URVhUX0lOUFVUX1BST1RPQ09MICBcCisgICAgeyAweDM4NzQ3N2MxLCAweDY5YzcsIDB4MTFkMiwgezB4OGUsIDB4MzksIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCitJTlRFUkZBQ0VfREVDTChfU0lNUExFX0lOUFVUX0lOVEVSRkFDRSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FuQ29kZTsKKyAgICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlQ2hhcjsKK30gRUZJX0lOUFVUX0tFWTsKKworLy8KKy8vIEJhc2VsaW5lIHVuaWNvZGUgY29udHJvbCBjaGFycworLy8KKworI2RlZmluZSBDSEFSX05VTEwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBDSEFSX0JBQ0tTUEFDRSAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBDSEFSX1RBQiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBDSEFSX0xJTkVGRUVEICAgICAgICAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBDSEFSX0NBUlJJQUdFX1JFVFVSTiAgICAgICAgICAgIDB4MDAwRAorCisvLworLy8gU2NhbiBjb2RlcyBmb3IgYmFzZSBsaW5lIGtleXMKKy8vCisKKyNkZWZpbmUgU0NBTl9OVUxMICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgU0NBTl9VUCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgU0NBTl9ET1dOICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgU0NBTl9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgU0NBTl9MRUZUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgU0NBTl9IT01FICAgICAgICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgU0NBTl9FTkQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDYKKyNkZWZpbmUgU0NBTl9JTlNFUlQgICAgICAgICAgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgU0NBTl9ERUxFVEUgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgU0NBTl9QQUdFX1VQICAgICAgICAgICAgICAgICAgICAweDAwMDkKKyNkZWZpbmUgU0NBTl9QQUdFX0RPV04gICAgICAgICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgU0NBTl9GMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEIKKyNkZWZpbmUgU0NBTl9GMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgU0NBTl9GMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEQKKyNkZWZpbmUgU0NBTl9GNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEUKKyNkZWZpbmUgU0NBTl9GNSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgU0NBTl9GNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgU0NBTl9GNyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTEKKyNkZWZpbmUgU0NBTl9GOCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgU0NBTl9GOSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTMKKyNkZWZpbmUgU0NBTl9GMTAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQKKyNkZWZpbmUgU0NBTl9FU0MgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTcKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lOUFVUX1JFU0VUKSAoCisgICAgSU4gc3RydWN0IF9TSU1QTEVfSU5QVVRfSU5URVJGQUNFICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRWZXJpZmljYXRpb24KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU5QVVRfUkVBRF9LRVkpICgKKyAgICBJTiBzdHJ1Y3QgX1NJTVBMRV9JTlBVVF9JTlRFUkZBQ0UgICAqVGhpcywKKyAgICBPVVQgRUZJX0lOUFVUX0tFWSAgICAgICAgICAgICAgICAgICAqS2V5CisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NJTVBMRV9JTlBVVF9JTlRFUkZBQ0UgeworICAgIEVGSV9JTlBVVF9SRVNFVCAgICAgICAgICAgICAgICAgICAgIFJlc2V0OworICAgIEVGSV9JTlBVVF9SRUFEX0tFWSAgICAgICAgICAgICAgICAgIFJlYWRLZXlTdHJva2U7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FpdEZvcktleTsKK30gU0lNUExFX0lOUFVUX0lOVEVSRkFDRTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaWRlYnVnLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlkZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWQ0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlkZWJ1Zy5oCkBAIC0wLDAgKzEsMTEwIEBACisjaWZuZGVmIF9FRklfREVCVUdfSAorI2RlZmluZSBfRUZJX0RFQlVHX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpZGVidWcuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBsaWJyYXJ5IGRlYnVnIGZ1bmN0aW9ucworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKK2V4dGVybiBVSU5UTiAgICAgRUZJRGVidWc7CisKKyNpZiBFRklfREVCVUcKKworICAgICNkZWZpbmUgREJHQVNTRVJUKGEpICAgICAgICBEYmdBc3NlcnQoX19GSUxFX18sIF9fTElORV9fLCAjYSkKKyAgICAjZGVmaW5lIERFQlVHKGEpICAgICAgICAgICAgRGJnUHJpbnQgYQorICAgIAorI2Vsc2UKKworICAgICNkZWZpbmUgREJHQVNTRVJUKGEpCisgICAgI2RlZmluZSBERUJVRyhhKQorICAgIAorI2VuZGlmCisKKyNpZiBFRklfREVCVUdfQ0xFQVJfTUVNT1JZCisKKyAgICAjZGVmaW5lIERCR1NFVE1FTShhLGwpICAgICAgU2V0TWVtKGEsbCwoQ0hBUjgpQkFEX1BPSU5URVIpCisKKyNlbHNlCisKKyAgICAjZGVmaW5lIERCR1NFVE1FTShhLGwpCisKKyNlbmRpZgorCisjZGVmaW5lIERfSU5JVCAgICAgICAgMHgwMDAwMDAwMSAgICAgICAgICAvLyBJbml0aWFsaXphdGlvbiBzdHlsZSBtZXNzYWdlcworI2RlZmluZSBEX1dBUk4gICAgICAgIDB4MDAwMDAwMDIgICAgICAgICAgLy8gV2FybmluZ3MKKyNkZWZpbmUgRF9MT0FEICAgICAgICAweDAwMDAwMDA0ICAgICAgICAgIC8vIExvYWQgZXZlbnRzCisjZGVmaW5lIERfRlMgICAgICAgICAgMHgwMDAwMDAwOCAgICAgICAgICAvLyBFRkkgRmlsZSBzeXN0ZW0KKyNkZWZpbmUgRF9QT09MICAgICAgICAweDAwMDAwMDEwICAgICAgICAgIC8vIEFsbG9jICYgRnJlZSdzCisjZGVmaW5lIERfUEFHRSAgICAgICAgMHgwMDAwMDAyMCAgICAgICAgICAvLyBBbGxvYyAmIEZyZWUncworI2RlZmluZSBEX0lORk8gICAgICAgIDB4MDAwMDAwNDAgICAgICAgICAgLy8gVmVyYm9zZQorI2RlZmluZSBEX1ZBUiAgICAgICAgIDB4MDAwMDAxMDAgICAgICAgICAgLy8gVmFyaWFibGUKKyNkZWZpbmUgRF9QQVJTRSAgICAgICAweDAwMDAwMjAwICAgICAgICAgIC8vIENvbW1hbmQgcGFyc2luZworI2RlZmluZSBEX0JNICAgICAgICAgIDB4MDAwMDA0MDAgICAgICAgICAgLy8gQm9vdCBtYW5hZ2VyCisjZGVmaW5lIERfQkxLSU8gICAgICAgMHgwMDAwMTAwMCAgICAgICAgICAvLyBCbGtJbyBEcml2ZXIKKyNkZWZpbmUgRF9CTEtJT19VTFRSQSAweDAwMDAyMDAwICAgICAgICAgIC8vIEJsa0lvIERyaXZlcgorI2RlZmluZSBEX05FVCAgICAgICAgIDB4MDAwMDQwMDAgICAgICAgICAgLy8gU05JIERyaXZlcgorI2RlZmluZSBEX05FVF9VTFRSQSAgIDB4MDAwMDgwMDAgICAgICAgICAgLy8gU05JIERyaXZlcgorI2RlZmluZSBEX1RYVElOICAgICAgIDB4MDAwMTAwMDAgICAgICAgICAgLy8gU2ltcGxlIElucHV0IERyaXZlcgorI2RlZmluZSBEX1RYVE9VVCAgICAgIDB4MDAwMjAwMDAgICAgICAgICAgLy8gU2ltcGxlIFRleHQgT3V0cHV0IERyaXZlcgorI2RlZmluZSBEX0VSUk9SX0FUQQkgIDB4MDAwNDAwMDAJCSAgCQkvLyBBVEEgZXJyb3IgbWVzc2FnZXMgCisjZGVmaW5lIERfRVJST1IgICAgICAgMHg4MDAwMDAwMCAgICAgICAgICAvLyBFcnJvcgorCisjZGVmaW5lIERfUkVTRVJWRUQgICAgMHg3ZmZmQzg4MCAgICAgICAgICAvLyBCaXRzIG5vdCByZXNlcnZlZCBhYm92ZQorCisvLworLy8gQ3VycmVudCBEZWJ1ZyBsZXZlbCBvZiB0aGUgc3lzdGVtLCB2YWx1ZSBvZiBFRklEZWJ1ZworLy8KKy8vI2RlZmluZSBFRklfREJVR19NQVNLICAgKERfRVJST1IgfCBEX1dBUk4gfCBEX0xPQUQgfCBEX0JMS0lPIHwgRF9JTklUKQorI2RlZmluZSBFRklfREJVR19NQVNLICAgKERfRVJST1IpCisKKy8vCisvLworLy8KKworI2lmIEVGSV9ERUJVRworCisgICAgI2RlZmluZSBBU1NFUlQoYSkgICAgICAgICAgICAgICBpZighKGEpKSAgICAgICBEQkdBU1NFUlQoYSkKKyAgICAjZGVmaW5lIEFTU0VSVF9MT0NLRUQobCkgICAgICAgIGlmKCEobCktPkxvY2spIERCR0FTU0VSVChsIG5vdCBsb2NrZWQpCisgICAgI2RlZmluZSBBU1NFUlRfU1RSVUNUKHAsdCkgICAgICBEQkdBU1NFUlQodCBub3Qgc3RydWN0dXJlKSwgcAorCisjZWxzZQorCisgICAgI2RlZmluZSBBU1NFUlQoYSkgICAgICAgICAgICAgICAKKyAgICAjZGVmaW5lIEFTU0VSVF9MT0NLRUQobCkgICAgICAgIAorICAgICNkZWZpbmUgQVNTRVJUX1NUUlVDVChwLHQpICAgICAgCisKKyNlbmRpZgorCisvLworLy8gUHJvdG90eXBlcworLy8KKworSU5UTgorRGJnQXNzZXJ0ICgKKyAgICBDSEFSOCAgICpmaWxlLAorICAgIElOVE4gICAgbGluZW5vLAorICAgIENIQVI4ICAgKnN0cmluZworICAgICk7CisKK0lOVE4KK0RiZ1ByaW50ICgKKyAgICBJTlROICAgIG1hc2ssCisgICAgQ0hBUjggICAqZm9ybWF0LAorICAgIC4uLgorICAgICk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlkZWYuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaWRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NmIxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlkZWYuaApAQCAtMCwwICsxLDIxMSBAQAorI2lmbmRlZiBfRUZJX0RFRl9ICisjZGVmaW5lIF9FRklfREVGX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpZGVmLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgZGVmaW5pdGlvbnMKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKK3R5cGVkZWYgVUlOVDE2ICAgICAgICAgIENIQVIxNjsKK3R5cGVkZWYgVUlOVDggICAgICAgICAgIENIQVI4OwordHlwZWRlZiBVSU5UOCAgICAgICAgICAgQk9PTEVBTjsKKyNpZm5kZWYgQ09OU1QKKyAgICNkZWZpbmUgQ09OU1QgY29uc3QKKyNlbmRpZgorI2lmbmRlZiBUUlVFCisgICAgI2RlZmluZSBUUlVFICAgICgoQk9PTEVBTikgMSkKKyAgICAjZGVmaW5lIEZBTFNFICAgKChCT09MRUFOKSAwKQorI2VuZGlmCisKKyNpZm5kZWYgTlVMTAorICAgICNkZWZpbmUgTlVMTCAgICAoKFZPSUQgKikgMCkKKyNlbmRpZgorCit0eXBlZGVmIFVJTlROICAgICAgICAgICBFRklfU1RBVFVTOwordHlwZWRlZiBVSU5UNjQgICAgICAgICAgRUZJX0xCQTsKK3R5cGVkZWYgVUlOVE4gICAgICAgICAgIEVGSV9UUEw7Cit0eXBlZGVmIFZPSUQgICAgICAgICAgICAqRUZJX0hBTkRMRTsKK3R5cGVkZWYgVk9JRCAgICAgICAgICAgICpFRklfRVZFTlQ7CisKKworLy8KKy8vIFByb3RvdHlwZSBhcmd1bWVudCBkZWNvcmF0aW9uIGZvciBFRkkgcGFyYW1ldGVycyB0byBpbmRpY2F0ZQorLy8gdGhlaXIgZGlyZWN0aW9uCisvLworLy8gSU4gLSBhcmd1bWVudCBpcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb24KKy8vIE9VVCAtIGFyZ3VtZW50IChwb2ludGVyKSBpcyByZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbgorLy8gT1BUSU9OQUwgLSBhcmd1bWVudCBpcyBvcHRpb25hbAorLy8KKworI2lmbmRlZiBJTgorICAgICNkZWZpbmUgSU4KKyAgICAjZGVmaW5lIE9VVAorICAgICNkZWZpbmUgT1BUSU9OQUwKKyNlbmRpZgorCisKKy8vCisvLyBBIEdVSUQKKy8vCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgCisgICAgVUlOVDMyICBEYXRhMTsKKyAgICBVSU5UMTYgIERhdGEyOworICAgIFVJTlQxNiAgRGF0YTM7CisgICAgVUlOVDggICBEYXRhNFs4XTsgCit9IEVGSV9HVUlEOworCisKKy8vCisvLyBUaW1lCisvLworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgIAorICAgIFVJTlQxNiAgICAgIFllYXI7ICAgICAgIC8vIDE5OTggLSAyMFhYCisgICAgVUlOVDggICAgICAgTW9udGg7ICAgICAgLy8gMSAtIDEyCisgICAgVUlOVDggICAgICAgRGF5OyAgICAgICAgLy8gMSAtIDMxCisgICAgVUlOVDggICAgICAgSG91cjsgICAgICAgLy8gMCAtIDIzCisgICAgVUlOVDggICAgICAgTWludXRlOyAgICAgLy8gMCAtIDU5CisgICAgVUlOVDggICAgICAgU2Vjb25kOyAgICAgLy8gMCAtIDU5CisgICAgVUlOVDggICAgICAgUGFkMTsKKyAgICBVSU5UMzIgICAgICBOYW5vc2Vjb25kOyAvLyAwIC0gOTk5LDk5OSw5OTkKKyAgICBJTlQxNiAgICAgICBUaW1lWm9uZTsgICAvLyAtMTQ0MCB0byAxNDQwIG9yIDIwNDcKKyAgICBVSU5UOCAgICAgICBEYXlsaWdodDsKKyAgICBVSU5UOCAgICAgICBQYWQyOworfSBFRklfVElNRTsKKworLy8gQml0IGRlZmluaXRpb25zIGZvciBFRklfVElNRS5EYXlsaWdodAorI2RlZmluZSBFRklfVElNRV9BREpVU1RfREFZTElHSFQgICAgMHgwMQorI2RlZmluZSBFRklfVElNRV9JTl9EQVlMSUdIVCAgICAgICAgMHgwMgorCisvLyBWYWx1ZSBkZWZpbml0aW9uIGZvciBFRklfVElNRS5UaW1lWm9uZQorI2RlZmluZSBFRklfVU5TUEVDSUZJRURfVElNRVpPTkUgICAgMHgwN0ZGCisKKworCisvLworLy8gTmV0d29ya2luZworLy8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEFkZHJbNF07Cit9IEVGSV9JUHY0X0FERFJFU1M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBBZGRyWzE2XTsKK30gRUZJX0lQdjZfQUREUkVTUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEFkZHJbMzJdOworfSBFRklfTUFDX0FERFJFU1M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgUmVjZWl2ZWRRdWV1ZVRpbWVvdXRWYWx1ZTsKKyAgICBVSU5UMzIgVHJhbnNtaXRRdWV1ZVRpbWVvdXRWYWx1ZTsKKyAgICBVSU5UMTYgUHJvdG9jb2xUeXBlRmlsdGVyOworICAgIEJPT0xFQU4gRW5hYmxlVW5pY2FzdFJlY2VpdmU7CisgICAgQk9PTEVBTiBFbmFibGVNdWx0aWNhc3RSZWNlaXZlOworICAgIEJPT0xFQU4gRW5hYmxlQnJvYWRjYXN0UmVjZWl2ZTsKKyAgICBCT09MRUFOIEVuYWJsZVByb21pc2N1b3VzUmVjZWl2ZTsKKyAgICBCT09MRUFOIEZsdXNoUXVldWVzT25SZXNldDsKKyAgICBCT09MRUFOIEVuYWJsZVJlY2VpdmVUaW1lc3RhbXBzOworICAgIEJPT0xFQU4gRGlzYWJsZUJhY2tncm91bmRQb2xsaW5nOworfSBFRklfTUFOQUdFRF9ORVRXT1JLX0NPTkZJR19EQVRBOworCisvLworLy8gTWVtb3J5CisvLworCit0eXBlZGVmIFVJTlQ2NCAgICAgICAgICBFRklfUEhZU0lDQUxfQUREUkVTUzsKK3R5cGVkZWYgVUlOVDY0ICAgICAgICAgIEVGSV9WSVJUVUFMX0FERFJFU1M7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQWxsb2NhdGVBbnlQYWdlcywKKyAgICBBbGxvY2F0ZU1heEFkZHJlc3MsCisgICAgQWxsb2NhdGVBZGRyZXNzLAorICAgIE1heEFsbG9jYXRlVHlwZQorfSBFRklfQUxMT0NBVEVfVFlQRTsKKworLy9QcmVzZXZlIHRoZSBhdHRyIG9uIGFueSByYW5nZSBzdXBwbGllZC4KKy8vQ29udmVudGlhbE1lbW9yeSBtdXN0IGhhdmUgV0IsU1IsU1cgd2hlbiBzdXBwbGllZC4KKy8vV2hlbiBhbGxvY2F0aW5nIGZyb20gQ29udmVudGlhbE1lbW9yeSBhbHdheXMgbWFrZSBpdCBXQixTUixTVworLy9XaGVuIHJldHVybmluZyB0byBDb252ZW50aWFsTWVtb3J5IGFsd2F5cyBtYWtlIGl0IFdCLFNSLFNXCisvL1doZW4gZ2V0dGluZyB0aGUgbWVtb3J5IG1hcCwgb3Igb24gUlQgZm9yIHJ1bnRpbWUgdHlwZXMKKworCit0eXBlZGVmIGVudW0geworICAgIEVmaVJlc2VydmVkTWVtb3J5VHlwZSwKKyAgICBFZmlMb2FkZXJDb2RlLAorICAgIEVmaUxvYWRlckRhdGEsCisgICAgRWZpQm9vdFNlcnZpY2VzQ29kZSwKKyAgICBFZmlCb290U2VydmljZXNEYXRhLAorICAgIEVmaVJ1bnRpbWVTZXJ2aWNlc0NvZGUsCisgICAgRWZpUnVudGltZVNlcnZpY2VzRGF0YSwKKyAgICBFZmlDb252ZW50aW9uYWxNZW1vcnksCisgICAgRWZpVW51c2FibGVNZW1vcnksCisgICAgRWZpQUNQSVJlY2xhaW1NZW1vcnksCisgICAgRWZpQUNQSU1lbW9yeU5WUywKKyAgICBFZmlNZW1vcnlNYXBwZWRJTywKKyAgICBFZmlNZW1vcnlNYXBwZWRJT1BvcnRTcGFjZSwKKyAgICBFZmlQYWxDb2RlLAorICAgIEVmaU1heE1lbW9yeVR5cGUKK30gRUZJX01FTU9SWV9UWVBFOworCisvLyBwb3NzaWJsZSBjYWNoaW5nIHR5cGVzIGZvciB0aGUgbWVtb3J5IHJhbmdlCisjZGVmaW5lIEVGSV9NRU1PUllfVUMgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMQorI2RlZmluZSBFRklfTUVNT1JZX1dDICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDIKKyNkZWZpbmUgRUZJX01FTU9SWV9XVCAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDA0CisjZGVmaW5lIEVGSV9NRU1PUllfV0IgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwOAorI2RlZmluZSBFRklfTUVNT1JZX1VDRSAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMTAgIAorCisvLyBwaHlzaWNhbCBtZW1vcnkgcHJvdGVjdGlvbiBvbiByYW5nZSAKKyNkZWZpbmUgRUZJX01FTU9SWV9XUCAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAxMDAwCisjZGVmaW5lIEVGSV9NRU1PUllfUlAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMjAwMAorI2RlZmluZSBFRklfTUVNT1JZX1hQICAgICAgICAgICAweDAwMDAwMDAwMDAwMDQwMDAKKworLy8gcmFuZ2UgcmVxdWlyZXMgYSBydW50aW1lIG1hcHBpbmcKKyNkZWZpbmUgRUZJX01FTU9SWV9SVU5USU1FICAgICAgMHg4MDAwMDAwMDAwMDAwMDAwCisKKyNkZWZpbmUgRUZJX01FTU9SWV9ERVNDUklQVE9SX1ZFUlNJT04gIDEKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU7ICAgICAgICAgICAvLyBGaWVsZCBzaXplIGlzIDMyIGJpdHMgZm9sbG93ZWQgYnkgMzIgYml0IHBhZAorICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUGFkOworICAgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgUGh5c2ljYWxTdGFydDsgIC8vIEZpZWxkIHNpemUgaXMgNjQgYml0cworICAgIEVGSV9WSVJUVUFMX0FERFJFU1MgICAgICAgICAgICAgVmlydHVhbFN0YXJ0OyAgIC8vIEZpZWxkIHNpemUgaXMgNjQgYml0cworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZQYWdlczsgIC8vIEZpZWxkIHNpemUgaXMgNjQgYml0cworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOyAgICAgIC8vIEZpZWxkIHNpemUgaXMgNjQgYml0cworfSBFRklfTUVNT1JZX0RFU0NSSVBUT1I7CisKKy8vCisvLyBJbnRlcm5hdGlvbmFsIExhbmd1YWdlCisvLworCit0eXBlZGVmIFVJTlQ4ICAgSVNPXzYzOV8yOworI2RlZmluZSBJU09fNjM5XzJfRU5UUllfU0laRSAgICAzCisKKy8vCisvLworLy8KKworI2RlZmluZSBFRklfUEFHRV9TSVpFICAgNDA5NgorI2RlZmluZSBFRklfUEFHRV9NQVNLICAgMHhGRkYKKyNkZWZpbmUgRUZJX1BBR0VfU0hJRlQgIDEyCisKKyNkZWZpbmUgRUZJX1NJWkVfVE9fUEFHRVMoYSkgIFwKKyAgICAoICgoYSkgPj4gRUZJX1BBR0VfU0hJRlQpICsgKChhKSAmIEVGSV9QQUdFX01BU0sgPyAxIDogMCkgKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaWRldnAuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaWRldnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI1Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpZGV2cC5oCkBAIC0wLDAgKzEsNDAyIEBACisjaWZuZGVmIF9ERVZQQVRIX0gKKyNkZWZpbmUgX0RFVlBBVEhfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBkZXZwYXRoLmgKKworQWJzdHJhY3Q6CisKKyAgICBEZWZpbmVzIGZvciBwYXJzaW5nIHRoZSBFRkkgRGV2aWNlIFBhdGggc3RydWN0dXJlcworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKy8vCisvLyBEZXZpY2UgUGF0aCBzdHJ1Y3R1cmVzIC0gU2VjdGlvbiBDCisvLworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0RFVklDRV9QQVRIIHsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YlR5cGU7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoWzJdOworfSBFRklfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgRUZJX0RQX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg3RgorI2RlZmluZSBFRklfRFBfVFlQRV9VTlBBQ0tFRCAgICAgICAgICAgICAgICAweDgwCisKKy8vI2RlZmluZSBFTkRfREVWSUNFX1BBVEhfVFlQRSAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIEVORF9ERVZJQ0VfUEFUSF9UWVBFICAgICAgICAgICAgICAgIDB4N2YKKy8vI2RlZmluZSBFTkRfREVWSUNFX1BBVEhfVFlQRV9VTlBBQ0tFRCAgICAgICAweDdmCisKKyNkZWZpbmUgRU5EX0VOVElSRV9ERVZJQ0VfUEFUSF9TVUJUWVBFICAgICAgMHhmZgorI2RlZmluZSBFTkRfSU5TVEFOQ0VfREVWSUNFX1BBVEhfU1VCVFlQRSAgICAweDAxCisjZGVmaW5lIEVORF9ERVZJQ0VfUEFUSF9MRU5HVEggICAgICAgICAgICAgIChzaXplb2YoRUZJX0RFVklDRV9QQVRIKSkKKworCisjZGVmaW5lIERQX0lTX0VORF9UWVBFKGEpCisjZGVmaW5lIERQX0lTX0VORF9TVUJUWVBFKGEpICAgICAgICAoICgoYSktPlN1YlR5cGUgPT0gRU5EX0VOVElSRV9ERVZJQ0VfUEFUSF9TVUJUWVBFICkKKworI2RlZmluZSBEZXZpY2VQYXRoVHlwZShhKSAgICAgICAgICAgKCAoKGEpLT5UeXBlKSAmIEVGSV9EUF9UWVBFX01BU0sgKQorI2RlZmluZSBEZXZpY2VQYXRoU3ViVHlwZShhKSAgICAgICAgKCAoYSktPlN1YlR5cGUgKQorI2RlZmluZSBEZXZpY2VQYXRoTm9kZUxlbmd0aChhKSAgICAgKCAoKGEpLT5MZW5ndGhbMF0pIHwgKChhKS0+TGVuZ3RoWzFdIDw8IDgpICkKKyNkZWZpbmUgTmV4dERldmljZVBhdGhOb2RlKGEpICAgICAgICggKEVGSV9ERVZJQ0VfUEFUSCAqKSAoICgoVUlOVDggKikgKGEpKSArIERldmljZVBhdGhOb2RlTGVuZ3RoKGEpKSkKKy8vI2RlZmluZSBJc0RldmljZVBhdGhFbmRUeXBlKGEpICAgICAgKCBEZXZpY2VQYXRoVHlwZShhKSA9PSBFTkRfREVWSUNFX1BBVEhfVFlQRV9VTlBBQ0tFRCApCisjZGVmaW5lIElzRGV2aWNlUGF0aEVuZFR5cGUoYSkgICAgICAoIERldmljZVBhdGhUeXBlKGEpID09IEVORF9ERVZJQ0VfUEFUSF9UWVBFICkKKyNkZWZpbmUgSXNEZXZpY2VQYXRoRW5kU3ViVHlwZShhKSAgICggKGEpLT5TdWJUeXBlID09IEVORF9FTlRJUkVfREVWSUNFX1BBVEhfU1VCVFlQRSApCisjZGVmaW5lIElzRGV2aWNlUGF0aEVuZChhKSAgICAgICAgICAoIElzRGV2aWNlUGF0aEVuZFR5cGUoYSkgJiYgSXNEZXZpY2VQYXRoRW5kU3ViVHlwZShhKSApCisjZGVmaW5lIElzRGV2aWNlUGF0aFVucGFja2VkKGEpICAgICAoIChhKS0+VHlwZSAmIEVGSV9EUF9UWVBFX1VOUEFDS0VEICkKKworCisjZGVmaW5lIFNldERldmljZVBhdGhOb2RlTGVuZ3RoKGEsbCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChhKS0+TGVuZ3RoWzBdID0gKFVJTlQ4KSAobCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKGEpLT5MZW5ndGhbMV0gPSAoVUlOVDgpICgobCkgPj4gOCk7ICAgICAgICBcCisgICAgICAgICAgICB9CisKKyNkZWZpbmUgU2V0RGV2aWNlUGF0aEVuZE5vZGUoYSkgIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKGEpLT5UeXBlID0gRU5EX0RFVklDRV9QQVRIX1RZUEU7ICAgICAgICAgICBcCisgICAgICAgICAgICAoYSktPlN1YlR5cGUgPSBFTkRfRU5USVJFX0RFVklDRV9QQVRIX1NVQlRZUEU7ICAgICBcCisgICAgICAgICAgICAoYSktPkxlbmd0aFswXSA9IHNpemVvZihFRklfREVWSUNFX1BBVEgpOyAgIFwKKyAgICAgICAgICAgIChhKS0+TGVuZ3RoWzFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfQorCisKKworLyoKKyAqCisgKi8KKyNkZWZpbmUgSEFSRFdBUkVfREVWSUNFX1BBVEggICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgSFdfUENJX0RQICAgICAgICAgICAgICAgICAgICAgICAweDAxCit0eXBlZGVmIHN0cnVjdCBfUENJX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlOworfSBQQ0lfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgSFdfUENDQVJEX0RQICAgICAgICAgICAgICAgICAgICAweDAyCit0eXBlZGVmIHN0cnVjdCBfUENDQVJEX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0TnVtYmVyOworfSBQQ0NBUkRfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgSFdfTUVNTUFQX0RQICAgICAgICAgICAgICAgICAgICAweDAzCit0eXBlZGVmIHN0cnVjdCBfTUVNTUFQX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5VHlwZTsKKyAgICAgICAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICBTdGFydGluZ0FkZHJlc3M7CisgICAgICAgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgRW5kaW5nQWRkcmVzczsKK30gTUVNTUFQX0RFVklDRV9QQVRIOworCisjZGVmaW5lIEhXX1ZFTkRPUl9EUCAgICAgICAgICAgICAgICAgICAgMHgwNAordHlwZWRlZiBzdHJ1Y3QgX1ZFTkRPUl9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgIEd1aWQ7Cit9IFZFTkRPUl9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBVTktOT1dOX0RFVklDRV9HVUlEIFwKKyAgICB7IDB4Y2YzMWZhYzUsIDB4YzI0ZSwgMHgxMWQyLCAgezB4ODUsIDB4ZjMsIDB4MCwgMHhhMCwgMHhjOSwgMHgzZSwgMHhjOSwgMHgzYn0gIH0KKwordHlwZWRlZiBzdHJ1Y3QgX1VLTk9XTl9ERVZJQ0VfVkVORE9SX0RQIHsKKyAgICBWRU5ET1JfREVWSUNFX1BBVEggICAgICBEZXZpY2VQYXRoOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIExlZ2FjeURyaXZlTGV0dGVyOworfSBVTktOT1dOX0RFVklDRV9WRU5ET1JfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgSFdfQ09OVFJPTExFUl9EUCAgICAgICAgICAgIDB4MDUKK3R5cGVkZWYgc3RydWN0IF9DT05UUk9MTEVSX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgQ29udHJvbGxlcjsKK30gQ09OVFJPTExFUl9ERVZJQ0VfUEFUSDsKKworLyoKKyAqCisgKi8KKyNkZWZpbmUgQUNQSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgMHgwMgorCisjZGVmaW5lIEFDUElfRFAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQordHlwZWRlZiBzdHJ1Y3QgX0FDUElfSElEX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgSElEOworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFVJRDsKK30gQUNQSV9ISURfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgRVhQQU5ERURfQUNQSV9EUAkJMHgwMgordHlwZWRlZiBzdHJ1Y3QgX0VYUEFOREVEX0FDUElfSElEX0RFVklDRV9QQVRIIHsKKwlFRklfREVWSUNFX1BBVEgJCQlIZWFkZXI7CisJVUlOVDMyCQkJCUhJRDsKKwlVSU5UMzIJCQkJVUlEOworCVVJTlQzMgkJCQlDSUQ7CisJVUlOVDgJCQkJSGlkU3RyWzFdOworfSBFWFBBTkRFRF9BQ1BJX0hJRF9ERVZJQ0VfUEFUSDsKKworLy8KKy8vIEVJU0EgSUQgTWFjcm8KKy8vIEVJU0EgSUQgRGVmaW5pdGlvbiAzMi1iaXRzCisvLyAgYml0c1sxNTowXSAtIHRocmVlIGNoYXJhY3RlciBjb21wcmVzc2VkIEFTQ0lJIEVJU0EgSUQuCisvLyAgYml0c1szMToxNl0gLSBiaW5hcnkgbnVtYmVyCisvLyAgIENvbXByZXNzZWQgQVNDSUkgaXMgNSBiaXRzIHBlciBjaGFyYWN0ZXIgMGIwMDAwMSA9ICdBJyAwYjExMDEwID0gJ1onCisvLworI2RlZmluZSBQTlBfRUlTQV9JRF9DT05TVCAgICAgICAweDQxZDAgICAgCisjZGVmaW5lIEVJU0FfSUQoX05hbWUsIF9OdW0pICAgICgoVUlOVDMyKSAoKF9OYW1lKSB8IChfTnVtKSA8PCAxNikpICAgCisjZGVmaW5lIEVJU0FfUE5QX0lEKF9QTlBJZCkgICAgIChFSVNBX0lEKFBOUF9FSVNBX0lEX0NPTlNULCAoX1BOUElkKSkpCisKKyNkZWZpbmUgUE5QX0VJU0FfSURfTUFTSyAgICAgICAgMHhmZmZmCisjZGVmaW5lIEVJU0FfSURfVE9fTlVNKF9JZCkgICAgICgoX0lkKSA+PiAxNikKKy8qCisgKgorICovCisjZGVmaW5lIE1FU1NBR0lOR19ERVZJQ0VfUEFUSCAgICAgICAgICAgMHgwMyAKKworI2RlZmluZSBNU0dfQVRBUElfRFAgICAgICAgICAgICAgICAgICAgIDB4MDEKK3R5cGVkZWYgc3RydWN0IF9BVEFQSV9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlTZWNvbmRhcnk7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xhdmVNYXN0ZXI7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTHVuOworfSBBVEFQSV9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfU0NTSV9EUCAgICAgICAgICAgICAgICAgICAgIDB4MDIKK3R5cGVkZWYgc3RydWN0IF9TQ1NJX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUHVuOworICAgICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIEx1bjsgCit9IFNDU0lfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0ZJQlJFQ0hBTk5FTF9EUCAgICAgICAgICAgICAweDAzCit0eXBlZGVmIHN0cnVjdCBfRklCUkVDSEFOTkVMX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgV1dOOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEx1bjsKK30gRklCUkVDSEFOTkVMX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR18xMzk0X0RQICAgICAgICAgICAgICAgICAgICAgMHgwNAordHlwZWRlZiBzdHJ1Y3QgX0YxMzk0X0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgR3VpZDsKK30gRjEzOTRfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX1VTQl9EUCAgICAgICAgICAgICAgICAgICAgICAweDA1Cit0eXBlZGVmIHN0cnVjdCBfVVNCX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydDsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludDsKK30gVVNCX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19VU0JfQ0xBU1NfRFAgICAgICAgICAgICAgICAgMHgwRgordHlwZWRlZiBzdHJ1Y3QgX1VTQl9DTEFTU19ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFZlbmRvcklkOworICAgICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3RJZDsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VDbGFzczsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VTdWJjbGFzczsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQcm90b2NvbDsKK30gVVNCX0NMQVNTX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19JMk9fRFAgICAgICAgICAgICAgICAgICAgICAgMHgwNgordHlwZWRlZiBzdHJ1Y3QgX0kyT19ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFRpZDsKK30gSTJPX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19NQUNfQUREUl9EUCAgICAgICAgICAgICAgICAgMHgwYgordHlwZWRlZiBzdHJ1Y3QgX01BQ19BRERSX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgTWFjQWRkcmVzczsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBJZlR5cGU7Cit9IE1BQ19BRERSX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19JUHY0X0RQICAgICAgICAgICAgICAgICAgICAgMHgwYwordHlwZWRlZiBzdHJ1Y3QgX0lQdjRfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgRUZJX0lQdjRfQUREUkVTUyAgICAgICAgICAgICAgICBMb2NhbElwQWRkcmVzczsKKyAgICAgICAgRUZJX0lQdjRfQUREUkVTUyAgICAgICAgICAgICAgICBSZW1vdGVJcEFkZHJlc3M7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0OworICAgICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZVBvcnQ7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2w7CisgICAgICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljSXBBZGRyZXNzOworfSBJUHY0X0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19JUHY2X0RQICAgICAgICAgICAgICAgICAgICAgMHgwZAordHlwZWRlZiBzdHJ1Y3QgX0lQdjZfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgRUZJX0lQdjZfQUREUkVTUyAgICAgICAgICAgICAgICBMb2NhbElwQWRkcmVzczsKKyAgICAgICAgRUZJX0lQdjZfQUREUkVTUyAgICAgICAgICAgICAgICBSZW1vdGVJcEFkZHJlc3M7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0OworICAgICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZVBvcnQ7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2w7CisgICAgICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljSXBBZGRyZXNzOworfSBJUHY2X0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19JTkZJTklCQU5EX0RQICAgICAgICAgICAgICAgMHgwOQordHlwZWRlZiBzdHJ1Y3QgX0lORklOSUJBTkRfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlR3VpZDsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBJb2NHdWlkOworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUlkOworfSBJTkZJTklCQU5EX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19VQVJUX0RQICAgICAgICAgICAgICAgICAgICAgMHgwZQordHlwZWRlZiBzdHJ1Y3QgX1VBUlRfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsKKyAgICAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkUmF0ZTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQml0czsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJpdHk7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcEJpdHM7Cit9IFVBUlRfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX1ZFTkRPUl9EUCAgICAgICAgICAgICAgICAgICAweDBBCisvKiBVc2UgVkVORE9SX0RFVklDRV9QQVRIIHN0cnVjdCAqLworCisjZGVmaW5lIERFVklDRV9QQVRIX01FU1NBR0lOR19QQ19BTlNJIFwKKyAgICB7IDB4ZTBjMTQ3NTMsIDB4ZjliZSwgMHgxMWQyLCAgezB4OWEsIDB4MGMsIDB4MDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9ICB9CisKKyNkZWZpbmUgREVWSUNFX1BBVEhfTUVTU0FHSU5HX1ZUXzEwMCBcCisgICAgeyAweGRmYTY2MDY1LCAweGI0MTksIDB4MTFkMywgIHsweDlhLCAweDJkLCAweDAwLCAweDkwLCAweDI3LCAweDNmLCAweGMxLCAweDRkfSAgfQorCisKKworI2RlZmluZSBNRURJQV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgIDB4MDQKKworI2RlZmluZSBNRURJQV9IQVJERFJJVkVfRFAgICAgICAgICAgICAgIDB4MDEKK3R5cGVkZWYgc3RydWN0IF9IQVJERFJJVkVfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25OdW1iZXI7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RhcnQ7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU2l6ZTsKKyAgICAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVbMTZdOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CUlR5cGU7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlVHlwZTsKK30gSEFSRERSSVZFX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1CUl9UWVBFX1BDQVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTUJSX1RZUEVfRUZJX1BBUlRJVElPTl9UQUJMRV9IRUFERVIgMHgwMgorCisjZGVmaW5lIFNJR05BVFVSRV9UWVBFX01CUiAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU0lHTkFUVVJFX1RZUEVfR1VJRCAgICAgICAgICAgICAgICAgMHgwMgorCisjZGVmaW5lIE1FRElBX0NEUk9NX0RQICAgICAgICAgICAgICAgICAgMHgwMgordHlwZWRlZiBzdHJ1Y3QgX0NEUk9NX0RFVklDRV9QQVRIIHsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBIZWFkZXI7CisgICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdEVudHJ5OworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblN0YXJ0OworICAgICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblNpemU7Cit9IENEUk9NX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1FRElBX1ZFTkRPUl9EUCAgICAgICAgICAgICAgICAgMHgwMworLyogVXNlIFZFTkRPUl9ERVZJQ0VfUEFUSCBzdHJ1Y3QgKi8KKworI2RlZmluZSBNRURJQV9GSUxFUEFUSF9EUCAgICAgICAgICAgICAgIDB4MDQKK3R5cGVkZWYgc3RydWN0IF9GSUxFUEFUSF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhOYW1lWzFdOworfSBGSUxFUEFUSF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBTSVpFX09GX0ZJTEVQQVRIX0RFVklDRV9QQVRIIEVGSV9GSUVMRF9PRkZTRVQoRklMRVBBVEhfREVWSUNFX1BBVEgsUGF0aE5hbWUpCisKKyNkZWZpbmUgTUVESUFfUFJPVE9DT0xfRFAgICAgICAgICAgICAgICAweDA1Cit0eXBlZGVmIHN0cnVjdCBfTUVESUFfUFJPVE9DT0xfREVWSUNFX1BBVEggeworICAgICAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEhlYWRlcjsKKyAgICAgICAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbDsKK30gTUVESUFfUFJPVE9DT0xfREVWSUNFX1BBVEg7CisKKworI2RlZmluZSBCQlNfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQkJTX0JCU19EUCAgICAgICAgICAgICAgICAgICAgICAweDAxCit0eXBlZGVmIHN0cnVjdCBfQkJTX0JCU19ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVR5cGU7CisgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzRmxhZzsKKyAgICAgICAgQ0hBUjggICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbMV07Cit9IEJCU19CQlNfREVWSUNFX1BBVEg7CisKKy8qIERldmljZVR5cGUgZGVmaW5pdGlvbnMgLSBmcm9tIEJCUyBzcGVjaWZpY2F0aW9uICovCisjZGVmaW5lIEJCU19UWVBFX0ZMT1BQWSAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBCQlNfVFlQRV9IQVJERFJJVkUgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQkJTX1RZUEVfQ0RST00gICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEJCU19UWVBFX1BDTUNJQSAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBCQlNfVFlQRV9VU0IgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQkJTX1RZUEVfRU1CRURERURfTkVUV09SSyAgICAgICAweDA2CisjZGVmaW5lIEJCU19UWVBFX0RFViAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBCQlNfVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgIDB4RkYKKwordHlwZWRlZiB1bmlvbiB7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgIERldlBhdGg7CisgICAgUENJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgIFBjaTsKKyAgICBQQ0NBUkRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgUGNDYXJkOworICAgIE1FTU1BUF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICBNZW1NYXA7CisgICAgVkVORE9SX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgIFZlbmRvcjsKKyAgICBVTktOT1dOX0RFVklDRV9WRU5ET1JfREVWSUNFX1BBVEggICAgVW5rbm93blZlbmRvcjsgICAKKyAgICBDT05UUk9MTEVSX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgQ29udHJvbGxlcjsKKyAgICBBQ1BJX0hJRF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgQWNwaTsKKworICAgIEFUQVBJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICBBdGFwaTsKKyAgICBTQ1NJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgU2NzaTsKKyAgICBGSUJSRUNIQU5ORUxfREVWSUNFX1BBVEggICAgICAgICAgICAgRmlicmVDaGFubmVsOworCisgICAgRjEzOTRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgIEYxMzk0OworICAgIFVTQl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICBVc2I7CisgICAgVVNCX0NMQVNTX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgIFVzYkNsYXNzOworICAgIEkyT19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICBJMk87CisgICAgTUFDX0FERFJfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIE1hY0FkZHI7CisgICAgSVB2NF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgIElwdjQ7CisgICAgSVB2Nl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgIElwdjY7CisgICAgSU5GSU5JQkFORF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgIEluZmluaUJhbmQ7CisgICAgVUFSVF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgIFVhcnQ7CisKKyAgICBIQVJERFJJVkVfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgSGFyZERyaXZlOworICAgIENEUk9NX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICBDRDsKKworICAgIEZJTEVQQVRIX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBGaWxlUGF0aDsKKyAgICBNRURJQV9QUk9UT0NPTF9ERVZJQ0VfUEFUSCAgICAgICAgICAgTWVkaWFQcm90b2NvbDsKKworICAgIEJCU19CQlNfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICBCYnM7CisKK30gRUZJX0RFVl9QQVRIOworCit0eXBlZGVmIHVuaW9uIHsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKkRldlBhdGg7CisgICAgUENJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgICpQY2k7CisgICAgUENDQVJEX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICpQY0NhcmQ7CisgICAgTUVNTUFQX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICpNZW1NYXA7CisgICAgVkVORE9SX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICpWZW5kb3I7CisgICAgVU5LTk9XTl9ERVZJQ0VfVkVORE9SX0RFVklDRV9QQVRIICAgICpVbmtub3duVmVuZG9yOyAgIAorICAgIENPTlRST0xMRVJfREVWSUNFX1BBVEggICAgICAgICAgICAgICAqQ29udHJvbGxlcjsKKyAgICBBQ1BJX0hJRF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgKkFjcGk7CisKKyAgICBBVEFQSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgKkF0YXBpOworICAgIFNDU0lfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAqU2NzaTsKKyAgICBGSUJSRUNIQU5ORUxfREVWSUNFX1BBVEggICAgICAgICAgICAgKkZpYnJlQ2hhbm5lbDsKKworICAgIEYxMzk0X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAqRjEzOTQ7CisgICAgVVNCX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgICpVc2I7CisgICAgVVNCX0NMQVNTX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICpVc2JDbGFzczsKKyAgICBJMk9fREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKkkyTzsKKyAgICBNQUNfQUREUl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgKk1hY0FkZHI7CisgICAgSVB2NF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICpJcHY0OworICAgIElQdjZfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAqSXB2NjsKKyAgICBJTkZJTklCQU5EX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgKkluZmluaUJhbmQ7CisgICAgVUFSVF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICpVYXJ0OworCisgICAgSEFSRERSSVZFX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICpIYXJkRHJpdmU7CisKKyAgICBGSUxFUEFUSF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgKkZpbGVQYXRoOworICAgIE1FRElBX1BST1RPQ09MX0RFVklDRV9QQVRIICAgICAgICAgICAqTWVkaWFQcm90b2NvbDsKKworICAgIENEUk9NX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAqQ0Q7CisgICAgQkJTX0JCU19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICpCYnM7CisKK30gRUZJX0RFVl9QQVRIX1BUUjsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaWVyci5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpZXJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkM2QzYwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaWVyci5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgX0VGSV9FUlJfSAorI2RlZmluZSBfRUZJX0VSUl9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaWVyci5oCisKK0Fic3RyYWN0OgorCisgICAgRUZJIGVycm9yIGNvZGVzCisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisKKyNkZWZpbmUgRUZJV0FSTihhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSkKKyNkZWZpbmUgRUZJX0VSUk9SKGEpICAgICAgICAgICAgICAoKChJTlROKSBhKSA8IDApCisKKworI2RlZmluZSBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBFRklfTE9BRF9FUlJPUiAgICAgICAgICAgICAgICAgIEVGSUVSUigxKQorI2RlZmluZSBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgICAgIEVGSUVSUigyKQorI2RlZmluZSBFRklfVU5TVVBQT1JURUQgICAgICAgICAgICAgICAgIEVGSUVSUigzKQorI2RlZmluZSBFRklfQkFEX0JVRkZFUl9TSVpFICAgICAgICAgICAgIEVGSUVSUig0KQorI2RlZmluZSBFRklfQlVGRkVSX1RPT19TTUFMTCAgICAgICAgICAgIEVGSUVSUig1KQorI2RlZmluZSBFRklfTk9UX1JFQURZICAgICAgICAgICAgICAgICAgIEVGSUVSUig2KQorI2RlZmluZSBFRklfREVWSUNFX0VSUk9SICAgICAgICAgICAgICAgIEVGSUVSUig3KQorI2RlZmluZSBFRklfV1JJVEVfUFJPVEVDVEVEICAgICAgICAgICAgIEVGSUVSUig4KQorI2RlZmluZSBFRklfT1VUX09GX1JFU09VUkNFUyAgICAgICAgICAgIEVGSUVSUig5KQorI2RlZmluZSBFRklfVk9MVU1FX0NPUlJVUFRFRCAgICAgICAgICAgIEVGSUVSUigxMCkKKyNkZWZpbmUgRUZJX1ZPTFVNRV9GVUxMICAgICAgICAgICAgICAgICBFRklFUlIoMTEpCisjZGVmaW5lIEVGSV9OT19NRURJQSAgICAgICAgICAgICAgICAgICAgRUZJRVJSKDEyKQorI2RlZmluZSBFRklfTUVESUFfQ0hBTkdFRCAgICAgICAgICAgICAgIEVGSUVSUigxMykKKyNkZWZpbmUgRUZJX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICBFRklFUlIoMTQpCisjZGVmaW5lIEVGSV9BQ0NFU1NfREVOSUVEICAgICAgICAgICAgICAgRUZJRVJSKDE1KQorI2RlZmluZSBFRklfTk9fUkVTUE9OU0UgICAgICAgICAgICAgICAgIEVGSUVSUigxNikKKyNkZWZpbmUgRUZJX05PX01BUFBJTkcgICAgICAgICAgICAgICAgICBFRklFUlIoMTcpCisjZGVmaW5lIEVGSV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgRUZJRVJSKDE4KQorI2RlZmluZSBFRklfTk9UX1NUQVJURUQgICAgICAgICAgICAgICAgIEVGSUVSUigxOSkKKyNkZWZpbmUgRUZJX0FMUkVBRFlfU1RBUlRFRCAgICAgICAgICAgICBFRklFUlIoMjApCisjZGVmaW5lIEVGSV9BQk9SVEVEICAgICAgICAgICAgICAgICAgICAgRUZJRVJSKDIxKQorI2RlZmluZSBFRklfSUNNUF9FUlJPUiAgICAgICAgICAgICAgICAgIEVGSUVSUigyMikKKyNkZWZpbmUgRUZJX1RGVFBfRVJST1IgICAgICAgICAgICAgICAgICBFRklFUlIoMjMpCisjZGVmaW5lIEVGSV9QUk9UT0NPTF9FUlJPUiAgICAgICAgICAgICAgRUZJRVJSKDI0KQorI2RlZmluZSBFRklfSU5DT01QQVRJQkxFX1ZFUlNJT04gICAgICAgIEVGSUVSUigyNSkKKyNkZWZpbmUgRUZJX1NFQ1VSSVRZX1ZJT0xBVElPTiAgICAgICAgICBFRklFUlIoMjYpCisjZGVmaW5lIEVGSV9DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgRUZJRVJSKDI3KQorI2RlZmluZSBFRklfRU5EX09GX01FRElBICAgICAgICAgICAgICAgIEVGSUVSUigyOCkKKyNkZWZpbmUgRUZJX0VORF9PRl9GSUxFICAgICAgICAgICAgICAgICBFRklFUlIoMzEpCisjZGVmaW5lIEVGSV9JTlZBTElEX0xBTkdVQUdFICAgICAgICAgICAgRUZJRVJSKDMyKQorI2RlZmluZSBFRklfQ09NUFJPTUlTRURfREFUQSAgICAgICAgICAgIEVGSUVSUigzMykKKworI2RlZmluZSBFRklfV0FSTl9VTktPV05fR0xZUEggICAgICAgICAgIEVGSVdBUk4oMSkKKyNkZWZpbmUgRUZJX1dBUk5fREVMRVRFX0ZBSUxVUkUgICAgICAgICBFRklXQVJOKDIpCisjZGVmaW5lIEVGSV9XQVJOX1dSSVRFX0ZBSUxVUkUgICAgICAgICAgRUZJV0FSTigzKQorI2RlZmluZSBFRklfV0FSTl9CVUZGRVJfVE9PX1NNQUxMICAgICAgIEVGSVdBUk4oNCkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaWZzLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTk1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlmcy5oCkBAIC0wLDAgKzEsMTE2IEBACisjaWZuZGVmIF9FRklfRlNfSAorI2RlZmluZSBfRUZJX0ZTX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpZnMuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBGaWxlIFN5c3RlbSBzdHJ1Y3R1cmVzCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworCisvLworLy8gRUZJIFBhcnRpdGlvbiBoZWFkZXIgKG5vcm1hbHkgc3RhcnRzIGluIExCQSAxKQorLy8KKworI2RlZmluZSBFRklfUEFSVElUSU9OX1NJR05BVFVSRSAgICAgICAgIDB4NTA1MzU5NTMyMDQ5NDI0OQorI2RlZmluZSBFRklfUEFSVElUSU9OX1JFVklTSU9OICAgICAgICAgIDB4MDAwMTAwMDEKKyNkZWZpbmUgTUlOX0VGSV9QQVJUSVRJT05fQkxPQ0tfU0laRSAgICA1MTIKKyNkZWZpbmUgRUZJX1BBUlRJVElPTl9MQkEgICAgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IF9FRklfUEFSVElUSU9OX0hFQURFUiB7CisgICAgRUZJX1RBQkxFX0hFQURFUiAgICBIZHI7CisgICAgVUlOVDMyICAgICAgICAgICAgICBEaXJlY3RvcnlBbGxvY2F0aW9uTnVtYmVyOworICAgIFVJTlQzMiAgICAgICAgICAgICAgQmxvY2tTaXplOworICAgIEVGSV9MQkEgICAgICAgICAgICAgRmlyc3RVc2FibGVMYmE7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBMYXN0VXNhYmxlTGJhOworICAgIEVGSV9MQkEgICAgICAgICAgICAgVW51c2FibGVTcGFjZTsKKyAgICBFRklfTEJBICAgICAgICAgICAgIEZyZWVTcGFjZTsKKyAgICBFRklfTEJBICAgICAgICAgICAgIFJvb3RGaWxlOworICAgIEVGSV9MQkEgICAgICAgICAgICAgU2VjdXRpcnlGaWxlOworfSBFRklfUEFSVElUSU9OX0hFQURFUjsKKworCisvLworLy8gRmlsZSBoZWFkZXIKKy8vCisKKyNkZWZpbmUgRUZJX0ZJTEVfSEVBREVSX1NJR05BVFVSRSAgIDB4NDU0YzQ5NDYyMDQ5NDI0OQorI2RlZmluZSBFRklfRklMRV9IRUFERVJfUkVWSVNJT04gICAgMHgwMDAxMDAwMAorI2RlZmluZSBFRklfRklMRV9TVFJJTkdfU0laRSAgICAgICAgMjYwCisKK3R5cGVkZWYgc3RydWN0IF9FRklfRklMRV9IRUFERVIgeworICAgIEVGSV9UQUJMRV9IRUFERVIgICAgSGRyOworICAgIFVJTlQzMiAgICAgICAgICAgICAgQ2xhc3M7CisgICAgVUlOVDMyICAgICAgICAgICAgICBMQkFMT2Zmc2V0OworICAgIEVGSV9MQkEgICAgICAgICAgICAgUGFyZW50OworICAgIFVJTlQ2NCAgICAgICAgICAgICAgRmlsZVNpemU7CisgICAgVUlOVDY0ICAgICAgICAgICAgICBGaWxlQXR0cmlidXRlczsKKyAgICBFRklfVElNRSAgICAgICAgICAgIEZpbGVDcmVhdGVUaW1lOworICAgIEVGSV9USU1FICAgICAgICAgICAgRmlsZU1vZGlmaWNhdGlvblRpbWU7CisgICAgRUZJX0dVSUQgICAgICAgICAgICBWZW5kb3JHdWlkOworICAgIENIQVIxNiAgICAgICAgICAgICAgRmlsZVN0cmluZ1tFRklfRklMRV9TVFJJTkdfU0laRV07Cit9IEVGSV9GSUxFX0hFQURFUjsKKworCisvLworLy8gUmV0dXJuIHRoZSBmaWxlJ3MgZmlyc3QgTEJBTCB3aGljaCBpcyBpbiB0aGUgc2FtZQorLy8gbG9naWNhbCBibG9jayBhcyB0aGUgZmlsZSBoZWFkZXIKKy8vCisKKyNkZWZpbmUgRUZJX0ZJTEVfTEJBTChhKSAgICAoKEVGSV9MQkFMICopICgoKENIQVI4ICopIChhKSkgKyAoYSktPkxCQUxPZmZzZXQpKQorCisjZGVmaW5lIEVGSV9GSUxFX0NMQVNTX0ZSRUVfU1BBQ0UgICAxCisjZGVmaW5lIEVGSV9GSUxFX0NMQVNTX0VNUFRZICAgICAgICAyCisjZGVmaW5lIEVGSV9GSUxFX0NMQVNTX05PUk1BTCAgICAgICAzCisKKworLy8KKy8vIExvZ2ljYWwgQmxvY2sgQWRkcmVzcyBMaXN0IC0gdGhlIGZ1bmRlbWVudGFsIGJsb2NrCisvLyBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKy8vCisKKyNkZWZpbmUgRUZJX0xCQUxfU0lHTkFUVVJFICAgICAgMHg0YzQxNDI0YzIwNDk0MjQ5CisjZGVmaW5lIEVGSV9MQkFMX1JFVklTSU9OICAgICAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9MQkFMIHsKKyAgICBFRklfVEFCTEVfSEVBREVSICAgIEhkcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIENsYXNzOworICAgIEVGSV9MQkEgICAgICAgICAgICAgUGFyZW50OworICAgIEVGSV9MQkEgICAgICAgICAgICAgTmV4dDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIEFycmF5U2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIEFycmF5Q291bnQ7Cit9IEVGSV9MQkFMOworCisvLyBBcnJheSBzaXplIAorI2RlZmluZSBFRklfTEJBTF9BUlJBWV9TSVpFKGxiYWwsb2ZmcyxibGtzKSAgXAorICAgICAgICAoKChibGtzKSAtIChvZmZzKSAtIChsYmFsKS0+SGRyLkhlYWRlclNpemUpIC8gc2l6ZW9mKEVGSV9STCkpCisKKy8vCisvLyBMb2dpY2FsIEJsb2NrIHJ1bi1sZW5ndGgKKy8vCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfTEJBICAgICBTdGFydDsKKyAgICBVSU5UNjQgICAgICBMZW5ndGg7Cit9IEVGSV9STDsKKworLy8KKy8vIFJldHVybiB0aGUgcnVuLWxlbmd0aCBzdHJ1Y3R1cmUgZnJvbSBhbiBMQkFMIGhlYWRlcgorLy8KKworI2RlZmluZSBFRklfTEJBTF9STChhKSAgICAgICgoRUZJX1JMKikgKCgoQ0hBUjggKikgKGEpKSArIChhKS0+SGRyLkhlYWRlclNpemUpKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpZ3B0LmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlncHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTY5NGFlCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpZ3B0LmgKQEAgLTAsMCArMSw2OCBAQAorI2lmbmRlZiBfRUZJX0dQVF9ICisjZGVmaW5lIF9FRklfR1BUX0gKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIEVmaUdwdC5oCisgICAgCitBYnN0cmFjdDoKKyAgICBJbmNsdWRlIGZpbGUgZm9yIEVGSSBwYXJ0aXRpb25pbmcgc2NoZW1lCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2RlZmluZSBQUklNQVJZX1BBUlRfSEVBREVSX0xCQSAgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9UQUJMRV9IRUFERVIgICAgSGVhZGVyOworICAgIEVGSV9MQkEgICAgICAgICAgICAgTXlMQkE7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBBbHRlcm5hdGVMQkE7CisgICAgRUZJX0xCQSAgICAgICAgICAgICBGaXJzdFVzYWJsZUxCQTsKKyAgICBFRklfTEJBICAgICAgICAgICAgIExhc3RVc2FibGVMQkE7CisgICAgRUZJX0dVSUQgICAgICAgICAgICBEaXNrR1VJRDsKKyAgICBFRklfTEJBICAgICAgICAgICAgIFBhcnRpdGlvbkVudHJ5TEJBOworICAgIFVJTlQzMiAgICAgICAgICAgICAgTnVtYmVyT2ZQYXJ0aXRpb25FbnRyaWVzOworICAgIFVJTlQzMiAgICAgICAgICAgICAgU2l6ZU9mUGFydGl0aW9uRW50cnk7CisgICAgVUlOVDMyICAgICAgICAgICAgICBQYXJ0aXRpb25FbnRyeUFycmF5Q1JDMzI7Cit9IEVGSV9QQVJUSVRJT05fVEFCTEVfSEVBREVSOworCisjZGVmaW5lIEVGSV9QVEFCX0hFQURFUl9JRCAgIkVGSSBQQVJUIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0dVSUQgICAgUGFydGl0aW9uVHlwZUdVSUQ7CisgICAgRUZJX0dVSUQgICAgVW5pcXVlUGFydGl0aW9uR1VJRDsKKyAgICBFRklfTEJBICAgICBTdGFydGluZ0xCQTsKKyAgICBFRklfTEJBICAgICBFbmRpbmdMQkE7CisgICAgVUlOVDY0ICAgICAgQXR0cmlidXRlczsKKyAgICBDSEFSMTYgICAgICBQYXJ0aXRpb25OYW1lWzM2XTsKK30gRUZJX1BBUlRJVElPTl9FTlRSWTsKKworLy8KKy8vIEVGSSBQYXJ0aXRpb24gQXR0cmlidXRlcworLy8KKyNkZWZpbmUgRUZJX1BBUlRfVVNFRF9CWV9FRkkgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDEKKyNkZWZpbmUgRUZJX1BBUlRfUkVRVUlSRURfVE9fRlVOQ1RJT04gICAweDAwMDAwMDAwMDAwMDAwMDIKKyNkZWZpbmUgRUZJX1BBUlRfVVNFRF9CWV9PUyAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDQKKyNkZWZpbmUgRUZJX1BBUlRfUkVRVUlSRURfQllfT1MgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDgKKyNkZWZpbmUgRUZJX1BBUlRfQkFDS1VQX1JFUVVJUkVEICAgICAgICAweDAwMDAwMDAwMDAwMDAwMTAKKyNkZWZpbmUgRUZJX1BBUlRfVVNFUl9EQVRBICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMjAKKyNkZWZpbmUgRUZJX1BBUlRfQ1JJVElDQUxfVVNFUl9EQVRBICAgICAweDAwMDAwMDAwMDAwMDAwNDAKKyNkZWZpbmUgRUZJX1BBUlRfUkVEVU5EQU5UX1BBUlRJVElPTiAgICAweDAwMDAwMDAwMDAwMDAwODAKKworI2RlZmluZSBFRklfUEFSVF9UWVBFX1VOVVNFRF9HVUlEICAgXAorICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwLCAweDAwMDAsIHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSB9CisgICAgCisjZGVmaW5lIEVGSV9QQVJUX1RZUEVfRUZJX1NZU1RFTV9QQVJUX0dVSUQgIFwKKyAgICB7IDB4YzEyYTczMjgsIDB4ZjgxZiwgMHgxMWQyLCB7MHhiYSwgMHg0YiwgMHgwMCwgMHhhMCwgMHhjOSwgMHgzZSwgMHhjOSwgMHgzYn0gfQorCisjZGVmaW5lIEVGSV9QQVJUX1RZUEVfTEVHQUNZX01CUl9HVUlEICAgXAorICAgIHsgMHgwMjRkZWU0MSwgMHgzM2U3LCAweDExZDMsIHsweDlkLCAweDY5LCAweDAwLCAweDA4LCAweGM3LCAweDgxLCAweGYzLCAweDlmfSB9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlpcC5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzk1MDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpaXAuaApAQCAtMCwwICsxLDQ1OSBAQAorI2lmbmRlZiBfRUZJX0lQX0gKKyNkZWZpbmUgX0VGSV9JUF9ICisKKy8qKysKK0NvcHlyaWdodCAoYykgMjAxMyAgSW50ZWwgQ29ycG9yYXRpb24KKworLS0qLworCisjZGVmaW5lIEVGSV9JUDRfU0VSVklDRV9CSU5ESU5HX1BST1RPQ09MIFwKKyAgIHsweGM1MTcxMWU3LDB4YjRiZiwweDQwNGEsezB4YmYsMHhiOCwweDBhLDB4MDQsIDB4OGUsMHhmMSwweGZmLDB4ZTR9fQorCisjZGVmaW5lIEVGSV9JUDRfUFJPVE9DT0wgXAorICAgIHsweDQxZDk0Y2QyLDB4MzViNiwweDQ1NWEsezB4ODIsMHg1OCwweGQ0LDB4ZTUsMHgxMywweDM0LDB4YWEsMHhkZH19CisKKyNkZWZpbmUgRUZJX0lQNl9TRVJWSUNFX0JJTkRJTkdfUFJPVE9DT0wgXAorICAgIHsweGVjODM1ZGQzLDB4ZmUwZiwweDYxN2IsezB4YTYsMHgyMSwweGIzLDB4NTAsMHhjMywweGUxLDB4MzMsMHg4OH19CisKKyNkZWZpbmUgRUZJX0lQNl9QUk9UT0NPTCBcCisgICAgezB4MmM4NzU5ZDUsMHg1YzJkLDB4NjZlZix7MHg5MiwweDVmLDB4YjYsMHg2YywweDEwLDB4MTksMHg1NywweGUyfX0KKworSU5URVJGQUNFX0RFQ0woX0VGSV9JUDQpOworSU5URVJGQUNFX0RFQ0woX0VGSV9JUDYpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0hBTkRMRSAgICAgICBJbnN0YW5jZUhhbmRsZTsKKyAgICBFRklfSVB2NF9BRERSRVNTIElwNEFkZHJlc3M7CisgICAgRUZJX0lQdjRfQUREUkVTUyBTdWJuZXRNYXNrOworfSBFRklfSVA0X0FERFJFU1NfUEFJUjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9IQU5ETEUgICAgICAgICAgIERyaXZlckhhbmRsZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICBBZGRyZXNzQ291bnQ7CisgICAgRUZJX0lQNF9BRERSRVNTX1BBSVIgQWRkcmVzc1BhaXJzWzFdOworfSBFRklfSVA0X1ZBUklBQkxFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgIERlZmF1bHRQcm90b2NvbDsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdEFueVByb3RvY29sOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0SWNtcEVycm9yczsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdEJyb2FkY2FzdDsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdFByb21pc2N1b3VzOworICAgIEJPT0xFQU4gICAgICAgICAgVXNlRGVmYXVsdEFkZHJlc3M7CisgICAgRUZJX0lQdjRfQUREUkVTUyBTdGF0aW9uQWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN1Ym5ldE1hc2s7CisgICAgVUlOVDggICAgICAgICAgICBUeXBlT2ZTZXJ2aWNlOworICAgIFVJTlQ4ICAgICAgICAgICAgVGltZVRvTGl2ZTsKKyAgICBCT09MRUFOICAgICAgICAgIERvTm90RnJhZ21lbnQ7CisgICAgQk9PTEVBTiAgICAgICAgICBSYXdEYXRhOworICAgIFVJTlQzMiAgICAgICAgICAgUmVjZWl2ZVRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICBUcmFuc21pdFRpbWVvdXQ7Cit9IEVGSV9JUDRfQ09ORklHX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN1Ym5ldEFkZHJlc3M7CisgICAgRUZJX0lQdjRfQUREUkVTUyBTdWJuZXRNYXNrOworICAgIEVGSV9JUHY0X0FERFJFU1MgR2F0ZXdheUFkZHJlc3M7Cit9IEVGSV9JUDRfUk9VVEVfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCBUeXBlOworICAgIFVJTlQ4IENvZGU7Cit9IEVGSV9JUDRfSUNNUF9UWVBFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgICAgICAgICBJc1N0YXJ0ZWQ7CisgICAgVUlOVDMyICAgICAgICAgICAgICBNYXhQYWNrZXRTaXplOworICAgIEVGSV9JUDRfQ09ORklHX0RBVEEgQ29uZmlnRGF0YTsKKyAgICBCT09MRUFOICAgICAgICAgICAgIElzQ29uZmlndXJlZDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIEdyb3VwQ291bnQ7CisgICAgRUZJX0lQdjRfQUREUkVTUyAgICAqR3JvdXBUYWJsZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIFJvdXRlQ291bnQ7CisgICAgRUZJX0lQNF9ST1VURV9UQUJMRSAqUm91dGVUYWJsZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIEljbXBUeXBlQ291bnQ7CisgICAgRUZJX0lQNF9JQ01QX1RZUEUgICAqSWNtcFR5cGVMaXN0OworfSBFRklfSVA0X01PREVfREFUQTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNF9HRVRfTU9ERV9EQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA0ICAgICAgICAgICAgICAgICAgKlRoaXMsCisgICAgT1VUIEVGSV9JUDRfTU9ERV9EQVRBICAgICAgICAgICAgICAgKklwNE1vZGVEYXRhICAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9NQU5BR0VEX05FVFdPUktfQ09ORklHX0RBVEEgKk1ucENvbmZpZ0RhdGEgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9TSU1QTEVfTkVUV09SS19NT0RFICAgICAgICAgKlNucE1vZGVEYXRhICAgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA0X0NPTkZJR1VSRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQNF9DT05GSUdfREFUQSAqSXBDb25maWdEYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNF9HUk9VUFMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDQgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgSm9pbkZsYWcsCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqR3JvdXBBZGRyZXNzIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNF9ST1VURVMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDQgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgRGVsZXRlUm91dGUsCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqU3VibmV0QWRkcmVzcywKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpTdWJuZXRNYXNrLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKkdhdGV3YXlBZGRyZXNzCisgICAgKTsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgICAgICBIZWFkZXJMZW5ndGg6NDsKKyAgICBVSU5UOCAgICAgICAgICAgIFZlcnNpb246NDsKKyAgICBVSU5UOCAgICAgICAgICAgIFR5cGVPZlNlcnZpY2U7CisgICAgVUlOVDE2ICAgICAgICAgICBUb3RhbExlbmd0aDsKKyAgICBVSU5UMTYgICAgICAgICAgIElkZW50aWZpY2F0aW9uOworICAgIFVJTlQxNiAgICAgICAgICAgRnJhZ21lbnRhdGlvbjsKKyAgICBVSU5UOCAgICAgICAgICAgIFRpbWVUb0xpdmU7CisgICAgVUlOVDggICAgICAgICAgICBQcm90b2NvbDsKKyAgICBVSU5UMTYgICAgICAgICAgIENoZWNrc3VtOworICAgIEVGSV9JUHY0X0FERFJFU1MgU291cmNlQWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIERlc3RpbmF0aW9uQWRkcmVzczsKK30gRUZJX0lQNF9IRUFERVI7CisjcHJhZ21hIHBhY2soKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyIEZyYWdtZW50TGVuZ3RoOworICAgIFZPSUQgICAqRnJhZ21lbnRCdWZmZXI7Cit9IEVGSV9JUDRfRlJBR01FTlRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9USU1FICAgICAgICAgICAgICBUaW1lU3RhbXA7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgIFJlY3ljbGVTaWduYWw7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIEhlYWRlckxlbmd0aDsKKyAgICBFRklfSVA0X0hFQURFUiAgICAgICAgKkhlYWRlcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgT3B0aW9uc0xlbmd0aDsKKyAgICBWT0lEICAgICAgICAgICAgICAgICAgKk9wdGlvbnM7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX0lQNF9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9JUDRfUkVDRUlWRV9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjRfQUREUkVTUyBTb3VyY2VBZGRyZXNzOworICAgIEVGSV9JUHY0X0FERFJFU1MgR2F0ZXdheUFkZHJlc3M7CisgICAgVUlOVDggICAgICAgICAgICBQcm90b2NvbDsKKyAgICBVSU5UOCAgICAgICAgICAgIFR5cGVPZlNlcnZpY2U7CisgICAgVUlOVDggICAgICAgICAgICBUaW1lVG9MaXZlOworICAgIEJPT0xFQU4gICAgICAgICAgRG9Ob3RGcmFnbWVudDsKK30gRUZJX0lQNF9PVkVSUklERV9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjRfQUREUkVTUyAgICAgIERlc3RpbmF0aW9uQWRkcmVzczsKKyAgICBFRklfSVA0X09WRVJSSURFX0RBVEEgKk92ZXJyaWRlRGF0YTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgT3B0aW9uc0xlbmd0aDsKKyAgICBWT0lEICAgICAgICAgICAgICAgICAgKk9wdGlvbnNCdWZmZXI7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIFRvdGFsRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfSVA0X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX0lQNF9UUkFOU01JVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgICAgICBFdmVudDsKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICAgIFN0YXR1czsKKyAgICB1bmlvbiB7CisgICAgICAgIEVGSV9JUDRfUkVDRUlWRV9EQVRBICAqUnhEYXRhOworICAgICAgICBFRklfSVA0X1RSQU5TTUlUX0RBVEEgKlR4RGF0YTsKKyAgICB9IFBhY2tldDsKK30gRUZJX0lQNF9DT01QTEVUSU9OX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA0X1RSQU5TTUlUKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA0ICAgICAgICAgICpUaGlzLAorICAgIElOIEVGSV9JUDRfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA0X1JFQ0VJVkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDRfQ0FOQ0VMKSgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQNF9DT01QTEVUSU9OX1RPS0VOICpUb2tlbiBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDRfUE9MTCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNCAqVGhpcworICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSVA0IHsKKyAgICBFRklfSVA0X0dFVF9NT0RFX0RBVEEgR2V0TW9kZURhdGE7CisgICAgRUZJX0lQNF9DT05GSUdVUkUgICAgIENvbmZpZ3VyZTsKKyAgICBFRklfSVA0X0dST1VQUyAgICAgICAgR3JvdXBzOworICAgIEVGSV9JUDRfUk9VVEVTICAgICAgICBSb3V0ZXM7CisgICAgRUZJX0lQNF9UUkFOU01JVCAgICAgIFRyYW5zbWl0OworICAgIEVGSV9JUDRfUkVDRUlWRSAgICAgICBSZWNlaXZlOworICAgIEVGSV9JUDRfQ0FOQ0VMICAgICAgICBDYW5jZWw7CisgICAgRUZJX0lQNF9QT0xMICAgICAgICAgIFBvbGw7Cit9IEVGSV9JUDQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgIERlZmF1bHRQcm90b2NvbDsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdEFueVByb3RvY29sOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0SWNtcEVycm9yczsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdFByb21pc2N1b3VzOworICAgIEVGSV9JUHY2X0FERFJFU1MgRGVzdGluYXRpb25BZGRyZXNzOworICAgIEVGSV9JUHY2X0FERFJFU1MgU3RhdGlvbkFkZHJlc3M7CisgICAgVUlOVDggICAgICAgICAgICBUcmFmZmljQ2xhc3M7CisgICAgVUlOVDggICAgICAgICAgICBIb3BMaW1pdDsKKyAgICBVSU5UMzIgICAgICAgICAgIEZsb3dMYWJlbDsKKyAgICBVSU5UMzIgICAgICAgICAgIFJlY2VpdmVUaW1lb3V0OworICAgIFVJTlQzMiAgICAgICAgICAgVHJhbnNtaXRUaW1lb3V0OworfSBFRklfSVA2X0NPTkZJR19EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjZfQUREUkVTUyBBZGRyZXNzOworICAgIFVJTlQ4ICAgICAgICAgICAgUHJlZml4TGVuZ3RoOworfSBFRklfSVA2X0FERFJFU1NfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9JUHY2X0FERFJFU1MgR2F0ZXdheTsKKyAgICBFRklfSVB2Nl9BRERSRVNTIERlc3RpbmF0aW9uOworICAgIFVJTlQ4ICAgICAgICAgICAgUHJlZml4TGVuZ3RoOworfSBFRklfSVA2X1JPVVRFX1RBQkxFOworCit0eXBlZGVmIGVudW0geworICAgIEVmaU5laWdoYm9ySW5Db21wbGV0ZSwKKyAgICBFZmlOZWlnaGJvclJlYWNoYWJsZSwKKyAgICBFZmlOZWlnaGJvclN0YWxlLAorICAgIEVmaU5laWdoYm9yRGVsYXksCisgICAgRWZpTmVpZ2hib3JQcm9iZQorfSBFRklfSVA2X05FSUdIQk9SX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjZfQUREUkVTUyAgICAgICBOZWlnaGJvcjsKKyAgICBFRklfTUFDX0FERFJFU1MgICAgICAgIExpbmtBZGRyZXNzOworICAgIEVGSV9JUDZfTkVJR0hCT1JfU1RBVEUgU3RhdGU7Cit9IEVGSV9JUDZfTkVJR0hCT1JfQ0FDSEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCBUeXBlOworICAgIFVJTlQ4IENvZGU7Cit9IEVGSV9JUDZfSUNNUF9UWVBFOworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBJQ01QdjYgdHlwZSBkZWZpbml0aW9ucyBmb3IgZXJyb3IgbWVzc2FnZXMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSUNNUF9WNl9ERVNUX1VOUkVBQ0hBQkxFICAgICAweDEKKyNkZWZpbmUgSUNNUF9WNl9QQUNLRVRfVE9PX0JJRyAgICAgICAweDIKKyNkZWZpbmUgSUNNUF9WNl9USU1FX0VYQ0VFREVEICAgICAgICAweDMKKyNkZWZpbmUgSUNNUF9WNl9QQVJBTUVURVJfUFJPQkxFTSAgICAweDQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gSUNNUHY2IHR5cGUgZGVmaW5pdGlvbiBmb3IgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBJQ01QX1Y2X0VDSE9fUkVRVUVTVCAgICAgICAgIDB4ODAKKyNkZWZpbmUgSUNNUF9WNl9FQ0hPX1JFUExZICAgICAgICAgICAweDgxCisjZGVmaW5lIElDTVBfVjZfTElTVEVORVJfUVVFUlkgICAgICAgMHg4MgorI2RlZmluZSBJQ01QX1Y2X0xJU1RFTkVSX1JFUE9SVCAgICAgIDB4ODMKKyNkZWZpbmUgSUNNUF9WNl9MSVNURU5FUl9ET05FICAgICAgICAweDg0CisjZGVmaW5lIElDTVBfVjZfUk9VVEVSX1NPTElDSVQgICAgICAgMHg4NQorI2RlZmluZSBJQ01QX1Y2X1JPVVRFUl9BRFZFUlRJU0UgICAgIDB4ODYKKyNkZWZpbmUgSUNNUF9WNl9ORUlHSEJPUl9TT0xJQ0lUICAgICAweDg3CisjZGVmaW5lIElDTVBfVjZfTkVJR0hCT1JfQURWRVJUSVNFICAgMHg4OAorI2RlZmluZSBJQ01QX1Y2X1JFRElSRUNUICAgICAgICAgICAgIDB4ODkKKyNkZWZpbmUgSUNNUF9WNl9MSVNURU5FUl9SRVBPUlRfMiAgICAweDhGCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIElDTVB2NiBjb2RlIGRlZmluaXRpb25zIGZvciBJQ01QX1Y2X0RFU1RfVU5SRUFDSEFCTEUKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSUNNUF9WNl9OT19ST1VURV9UT19ERVNUICAgICAweDAKKyNkZWZpbmUgSUNNUF9WNl9DT01NX1BST0hJQklURUQgICAgICAweDEKKyNkZWZpbmUgSUNNUF9WNl9CRVlPTkRfU0NPUEUgICAgICAgICAweDIKKyNkZWZpbmUgSUNNUF9WNl9BRERSX1VOUkVBQ0hBQkxFICAgICAweDMKKyNkZWZpbmUgSUNNUF9WNl9QT1JUX1VOUkVBQ0hBQkxFICAgICAweDQKKyNkZWZpbmUgSUNNUF9WNl9TT1VSQ0VfQUREUl9GQUlMRUQgICAweDUKKyNkZWZpbmUgSUNNUF9WNl9ST1VURV9SRUpFQ1RFRCAgICAgICAweDYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gSUNNUHY2IGNvZGUgZGVmaW5pdGlvbnMgZm9yIElDTVBfVjZfVElNRV9FWENFRURFRAorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBJQ01QX1Y2X1RJTUVPVVRfSE9QX0xJTUlUICAgIDB4MAorI2RlZmluZSBJQ01QX1Y2X1RJTUVPVVRfUkVBU1NFTUJMRSAgIDB4MQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBJQ01QdjYgY29kZSBkZWZpbml0aW9ucyBmb3IgSUNNUF9WNl9QQVJBTUVURVJfUFJPQkxFTQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBJQ01QX1Y2X0VSUk9ORU9VU19IRUFERVIgICAgIDB4MAorI2RlZmluZSBJQ01QX1Y2X1VOUkVDT0dOSVpFX05FWFRfSERSIDB4MQorI2RlZmluZSBJQ01QX1Y2X1VOUkVDT0dOSVpFX09QVElPTiAgIDB4MgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICBJc1N0YXJ0ZWQ7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBNYXhQYWNrZXRTaXplOworICAgIEVGSV9JUDZfQ09ORklHX0RBVEEgICAgQ29uZmlnRGF0YTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIElzQ29uZmlndXJlZDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEFkZHJlc3NDb3VudDsKKyAgICBFRklfSVA2X0FERFJFU1NfSU5GTyAgICpBZGRyZXNzTGlzdDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEdyb3VwQ291bnQ7CisgICAgRUZJX0lQdjZfQUREUkVTUyAgICAgICAqR3JvdXBUYWJsZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIFJvdXRlQ291bnQ7CisgICAgRUZJX0lQNl9ST1VURV9UQUJMRSAgICAqUm91dGVUYWJsZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIE5laWdoYm9yQ291bnQ7CisgICAgRUZJX0lQNl9ORUlHSEJPUl9DQUNIRSAqTmVpZ2hib3JDYWNoZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIFByZWZpeENvdW50OworICAgIEVGSV9JUDZfQUREUkVTU19JTkZPICAgKlByZWZpeFRhYmxlOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgSWNtcFR5cGVDb3VudDsKKyAgICBFRklfSVA2X0lDTVBfVFlQRSAgICAgICpJY21wVHlwZUxpc3Q7Cit9IEVGSV9JUDZfTU9ERV9EQVRBOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA2X0dFVF9NT0RFX0RBVEEpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICAgICAgICAgICAgICAgICAqVGhpcywKKyAgICBPVVQgRUZJX0lQNl9NT0RFX0RBVEEgICAgICAgICAgICAgICAqSXA2TW9kZURhdGEgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BTkFHRURfTkVUV09SS19DT05GSUdfREFUQSAqTW5wQ29uZmlnRGF0YSBPUFRJT05BTCwKKyAgICBPVVQgRUZJX1NJTVBMRV9ORVRXT1JLX01PREUgICAgICAgICAqU25wTW9kZURhdGEgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfQ09ORklHVVJFKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA2ICAgICAqVGhpcywKKyAgICBJTiBFRklfSVA2X0NPTkZJR19EQVRBICpJcDZDb25maWdEYXRhIE9QVElPTkFMCisgICAgKTsKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfR1JPVVBTKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA2ICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgIEpvaW5GbGFnLAorICAgIElOIEVGSV9JUHY2X0FERFJFU1MgKkdyb3VwQWRkcmVzcyBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfUk9VVEVTKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA2ICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgIERlbGV0ZVJvdXRlLAorICAgIElOIEVGSV9JUHY2X0FERFJFU1MgKkRlc3RpbmF0aW9uICAgIE9QVElPTkFMLAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgUHJlZml4TGVuZ3RoLAorICAgIElOIEVGSV9JUHY2X0FERFJFU1MgKkdhdGV3YXlBZGRyZXNzIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQNl9ORUlHSEJPUlMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgRGVsZXRlRmxhZywKKyAgICBJTiBFRklfSVB2Nl9BRERSRVNTICpUYXJnZXRJcDZBZGRyZXNzLAorICAgIElOIEVGSV9NQUNfQUREUkVTUyAgKlRhcmdldExpbmtBZGRyZXNzIE9QVElPTkFMLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgVGltZW91dCwKKyAgICBJTiBCT09MRUFOICAgICAgICAgIE92ZXJyaWRlCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JUDZfRlJBR01FTlRfREFUQSB7CisgICAgVUlOVDMyIEZyYWdtZW50TGVuZ3RoOworICAgIFZPSUQgICAqRnJhZ21lbnRCdWZmZXI7Cit9IEVGSV9JUDZfRlJBR01FTlRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JUDZfT1ZFUlJJREVfREFUQSB7CisgICAgVUlOVDggIFByb3RvY29sOworICAgIFVJTlQ4ICBIb3BMaW1pdDsKKyAgICBVSU5UMzIgRmxvd0xhYmVsOworfSBFRklfSVA2X09WRVJSSURFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSVA2X1RSQU5TTUlUX0RBVEEgeworICAgIEVGSV9JUHY2X0FERFJFU1MgICAgICBEZXN0aW5hdGlvbkFkZHJlc3M7CisgICAgRUZJX0lQNl9PVkVSUklERV9EQVRBICpPdmVycmlkZURhdGE7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIEV4dEhkcnNMZW5ndGg7CisgICAgVk9JRCAgICAgICAgICAgICAgICAgICpFeHRIZHJzOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICBOZXh0SGVhZGVyOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9JUDZfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfSVA2X1RSQU5TTUlUX0RBVEE7CisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JUDZfSEVBREVSIHsKKyAgICBVSU5UOCAgICAgICAgICAgIFRyYWZmaWNDbGFzc0g6NDsKKyAgICBVSU5UOCAgICAgICAgICAgIFZlcnNpb246NDsKKyAgICBVSU5UOCAgICAgICAgICAgIEZsb3dMYWJlbEg6NDsKKyAgICBVSU5UOCAgICAgICAgICAgIFRyYWZmaWNDbGFzc0w6NDsKKyAgICBVSU5UMTYgICAgICAgICAgIEZsb3dMYWJlbEw7CisgICAgVUlOVDE2ICAgICAgICAgICBQYXlsb2FkTGVuZ3RoOworICAgIFVJTlQ4ICAgICAgICAgICAgTmV4dEhlYWRlcjsKKyAgICBVSU5UOCAgICAgICAgICAgIEhvcExpbWl0OworICAgIEVGSV9JUHY2X0FERFJFU1MgU291cmNlQWRkcmVzczsKKyAgICBFRklfSVB2Nl9BRERSRVNTIERlc3RpbmF0aW9uQWRkcmVzczsKK30gRUZJX0lQNl9IRUFERVI7CisjcHJhZ21hIHBhY2soKQorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lQNl9SRUNFSVZFX0RBVEEgeworICAgIEVGSV9USU1FICAgICAgICAgICAgICBUaW1lU3RhbXA7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgIFJlY3ljbGVTaWduYWw7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIEhlYWRlckxlbmd0aDsKKyAgICBFRklfSVA2X0hFQURFUiAgICAgICAgKkhlYWRlcjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfSVA2X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX0lQNl9SRUNFSVZFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgICAgIEV2ZW50OworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgU3RhdHVzOworICAgIHVuaW9uIHsKKwlFRklfSVA2X1JFQ0VJVkVfREFUQSAgKlJ4RGF0YTsKKwlFRklfSVA2X1RSQU5TTUlUX0RBVEEgKlR4RGF0YTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldDsKK30gRUZJX0lQNl9DT01QTEVUSU9OX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA2X1RSQU5TTUlUKSAoCisgICAgSU4gc3RydWN0IF9FRklfSVA2ICAgICAgICAgICpUaGlzLAorICAgIElOIEVGSV9JUDZfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSVA2X1JFQ0VJVkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQNl9DT01QTEVUSU9OX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfQ0FOQ0VMKSgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9JUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQNl9DT01QTEVUSU9OX1RPS0VOICpUb2tlbiBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JUDZfUE9MTCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0lQNiAqVGhpcworICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSVA2IHsKKyAgICBFRklfSVA2X0dFVF9NT0RFX0RBVEEgR2V0TW9kZURhdGE7CisgICAgRUZJX0lQNl9DT05GSUdVUkUgICAgIENvbmZpZ3VyZTsKKyAgICBFRklfSVA2X0dST1VQUyAgICAgICAgR3JvdXBzOworICAgIEVGSV9JUDZfUk9VVEVTICAgICAgICBSb3V0ZXM7CisgICAgRUZJX0lQNl9ORUlHSEJPUlMgICAgIE5laWdoYm9yczsKKyAgICBFRklfSVA2X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX0lQNl9SRUNFSVZFICAgICAgIFJlY2VpdmU7CisgICAgRUZJX0lQNl9DQU5DRUwgICAgICAgIENhbmNlbDsKKyAgICBFRklfSVA2X1BPTEwgICAgICAgICAgUG9sbDsKK30gRUZJX0lQNjsKKworI2VuZGlmIC8qIF9FRklfSVBfSCAqLwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpbGliLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2Q1NDBjCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpbGliLmgKQEAgLTAsMCArMSw5MTAgQEAKKyNpZm5kZWYgX0VGSUxJQl9JTkNMVURFXworI2RlZmluZSBfRUZJTElCX0lOQ0xVREVfCisKKy8qKysKKworQ29weXJpZ2h0IChjKSAyMDAwICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaWxpYi5oCisKK0Fic3RyYWN0OgorCisgICAgRUZJIGxpYnJhcnkgZnVuY3Rpb25zCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImVmaWRlYnVnLmgiCisjaW5jbHVkZSAiZWZpcGFydC5oIgorI2luY2x1ZGUgImVmaWxpYnBsYXQuaCIKKyNpbmNsdWRlICJlZmlsaW5rLmgiCisjaW5jbHVkZSAiZWZpcnRsaWIuaCIKKyNpbmNsdWRlICJlZmlzdGRhcmcuaCIKKyNpbmNsdWRlICJwY2kyMi5oIgorI2luY2x1ZGUgImxpYnNtYmlvcy5oIgorCisvLworLy8gUHVibGljIHJlYWQtb25seSBkYXRhIGluIHRoZSBFRkkgbGlicmFyeQorLy8KKworZXh0ZXJuIEVGSV9TWVNURU1fVEFCTEUgICAgICAgICAqU1Q7CitleHRlcm4gRUZJX0JPT1RfU0VSVklDRVMgICAgICAgICpCUzsKK2V4dGVybiBFRklfUlVOVElNRV9TRVJWSUNFUyAgICAgKlJUOworCitleHRlcm4gRUZJX0dVSUQgRGV2aWNlUGF0aFByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIExvYWRlZEltYWdlUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVGV4dEluUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVGV4dE91dFByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIEJsb2NrSW9Qcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBEaXNrSW9Qcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBGaWxlU3lzdGVtUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgTG9hZEZpbGVQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBEZXZpY2VJb1Byb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFZhcmlhYmxlU3RvcmVQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBMZWdhY3lCb290UHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVW5pY29kZUNvbGxhdGlvblByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFNlcmlhbElvUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVmdhQ2xhc3NQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBUZXh0T3V0U3BsaXRlclByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIEVycm9yT3V0U3BsaXRlclByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFRleHRJblNwbGl0ZXJQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBTaW1wbGVOZXR3b3JrUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgUHhlQmFzZUNvZGVQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBQeGVDYWxsYmFja1Byb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIE5ldHdvcmtJbnRlcmZhY2VJZGVudGlmaWVyUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgVWlQcm90b2NvbDsKK2V4dGVybiBFRklfR1VJRCBJbnRlcm5hbFNoZWxsUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgUGNpSW9Qcm90b2NvbDsKKworZXh0ZXJuIEVGSV9HVUlEIEVmaUdsb2JhbFZhcmlhYmxlOworZXh0ZXJuIEVGSV9HVUlEIEdlbmVyaWNGaWxlSW5mbzsKK2V4dGVybiBFRklfR1VJRCBGaWxlU3lzdGVtSW5mbzsKK2V4dGVybiBFRklfR1VJRCBGaWxlU3lzdGVtVm9sdW1lTGFiZWxJbmZvOworZXh0ZXJuIEVGSV9HVUlEIFBjQW5zaVByb3RvY29sOworZXh0ZXJuIEVGSV9HVUlEIFZ0MTAwUHJvdG9jb2w7CitleHRlcm4gRUZJX0dVSUQgTnVsbEd1aWQ7CitleHRlcm4gRUZJX0dVSUQgVW5rbm93bkRldmljZTsKKworZXh0ZXJuIEVGSV9HVUlEIEVmaVBhcnRUeXBlU3lzdGVtUGFydGl0aW9uR3VpZDsKK2V4dGVybiBFRklfR1VJRCBFZmlQYXJ0VHlwZUxlZ2FjeU1ickd1aWQ7CisKK2V4dGVybiBFRklfR1VJRCBNcHNUYWJsZUd1aWQ7CitleHRlcm4gRUZJX0dVSUQgQWNwaVRhYmxlR3VpZDsKK2V4dGVybiBFRklfR1VJRCBTTUJJT1NUYWJsZUd1aWQ7CitleHRlcm4gRUZJX0dVSUQgU2FsU3lzdGVtVGFibGVHdWlkOworCisvLworLy8gRUZJIFZhcmlhYmxlIHN0cmluZ3MKKy8vCisjZGVmaW5lIExPQURfT1BUSU9OX0FDVElWRSAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBWYXJMYW5ndWFnZUNvZGVzICAgICAgIEwiTGFuZ0NvZGVzIgorI2RlZmluZSBWYXJMYW5ndWFnZSAgICAgICAgICAgIEwiTGFuZyIKKyNkZWZpbmUgVmFyVGltZW91dCAgICAgICAgICAgICBMIlRpbWVvdXQiCisjZGVmaW5lIFZhckNvbnNvbGVJbnAgICAgICAgICAgTCJDb25JbiIKKyNkZWZpbmUgVmFyQ29uc29sZU91dCAgICAgICAgICBMIkNvbk91dCIKKyNkZWZpbmUgVmFyRXJyb3JPdXQgICAgICAgICAgICBMIkVyck91dCIKKyNkZWZpbmUgVmFyQm9vdE9wdGlvbiAgICAgICAgICBMIkJvb3QlMDR4IgorI2RlZmluZSBWYXJCb290T3JkZXIgICAgICAgICAgIEwiQm9vdE9yZGVyIgorI2RlZmluZSBWYXJCb290TmV4dCAgICAgICAgICAgIEwiQm9vdE5leHQiCisjZGVmaW5lIFZhckJvb3RDdXJyZW50ICAgICAgICAgTCJCb290Q3VycmVudCIKKyNkZWZpbmUgVmFyRHJpdmVyT3B0aW9uICAgICAgICBMIkRyaXZlciUwNHgiCisjZGVmaW5lIFZhckRyaXZlck9yZGVyICAgICAgICAgTCJEcml2ZXJPcmRlciIKKyNkZWZpbmUgVmFyQ29uc29sZUlucERldiAgICAgICBMIkNvbkluRGV2IgorI2RlZmluZSBWYXJDb25zb2xlT3V0RGV2ICAgICAgIEwiQ29uT3V0RGV2IgorI2RlZmluZSBWYXJFcnJvck91dERldiAgICAgICAgIEwiRXJyT3V0RGV2IgorCisjZGVmaW5lIExhbmd1YWdlQ29kZUVuZ2xpc2ggICAgImVuZyIKKworZXh0ZXJuIEVGSV9ERVZJQ0VfUEFUSCBSb290RGV2aWNlUGF0aFtdOworZXh0ZXJuIEVGSV9ERVZJQ0VfUEFUSCBFbmREZXZpY2VQYXRoW107CitleHRlcm4gRUZJX0RFVklDRV9QQVRIIEVuZEluc3RhbmNlRGV2aWNlUGF0aFtdOworCisvLworLy8gT3RoZXIgcHVibGljIGRhdGEgaW4gdGhlIEVGSSBsaWJyYXJ5CisvLworCitleHRlcm4gRUZJX01FTU9SWV9UWVBFIFBvb2xBbGxvY2F0aW9uVHlwZTsKKworLy8KKy8vIFNUQVRJQyAtIE5hbWUgaXMgaW50ZXJuYWwgdG8gdGhlIG1vZHVsZQorLy8gSU5URVJOQUwgLSBOYW1lIGlzIGludGVybmFsIHRvIHRoZSBjb21wb25lbnQgKGkuZS4sIGRpcmVjdG9yeSkKKy8vIEJPT1RTRVJWQ0UgLSBOYW1lIG9mIGEgYm9vdCBzZXJ2aWNlIGZ1bmN0aW9uCisvLworCisjZGVmaW5lIFNUQVRJQworI2RlZmluZSBJTlRFUk5BTAorI2RlZmluZSBCT09UU0VSVklDRQorCisvLworLy8gUHJvdG90eXBlcworLy8KKworVk9JRAorSW5pdGlhbGl6ZUxpYiAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgSW1hZ2VIYW5kbGUsCisgICAgSU4gRUZJX1NZU1RFTV9UQUJMRSAgICAgKlN5c3RlbVRhYmxlCisgICAgKTsKKworVk9JRAorSW5pdGlhbGl6ZVVuaWNvZGVTdXBwb3J0ICgKKyAgICBDSEFSOCAqTGFuZ0NvZGUKKyAgICApOworCitWT0lECitFRklEZWJ1Z1ZhcmlhYmxlICgKKyAgICBWT0lECisgICAgKTsKKworVk9JRAorU2V0Q3JjICgKKyAgICBJTiBPVVQgRUZJX1RBQkxFX0hFQURFUiAqSGRyCisgICAgKTsKKworVk9JRAorU2V0Q3JjQWx0U2l6ZSAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgIFNpemUsCisgICAgSU4gT1VUIEVGSV9UQUJMRV9IRUFERVIgKkhkcgorICAgICk7CisKK0JPT0xFQU4KK0NoZWNrQ3JjICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgTWF4U2l6ZSwKKyAgICBJTiBPVVQgRUZJX1RBQkxFX0hFQURFUiAqSGRyCisgICAgKTsKKworQk9PTEVBTgorQ2hlY2tDcmNBbHRTaXplICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgTWF4U2l6ZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgU2l6ZSwKKyAgICBJTiBPVVQgRUZJX1RBQkxFX0hFQURFUiAqSGRyCisgICAgKTsKKworVUlOVDMyCitDYWxjdWxhdGVDcmMgKAorICAgIFVJTlQ4ICpwdCwKKyAgICBVSU5UTiBTaXplCisgICAgKTsKKworVk9JRAorWmVyb01lbSAoCisgICAgSU4gVk9JRCAgICAgKkJ1ZmZlciwKKyAgICBJTiBVSU5UTiAgICAgU2l6ZQorICAgICk7CisKK1ZPSUQKK1NldE1lbSAoCisgICAgSU4gVk9JRCAgICAgKkJ1ZmZlciwKKyAgICBJTiBVSU5UTiAgICBTaXplLAorICAgIElOIFVJTlQ4ICAgIFZhbHVlICAgIAorICAgICk7CisKK1ZPSUQKK0NvcHlNZW0gKAorICAgIElOIFZPSUQgICAgICpEZXN0LAorICAgIElOIENPTlNUIFZPSUQgICAgICpTcmMsCisgICAgSU4gVUlOVE4gICAgbGVuCisgICAgKTsKKworSU5UTgorQ29tcGFyZU1lbSAoCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKkRlc3QsCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKlNyYywKKyAgICBJTiBVSU5UTiAgICBsZW4KKyAgICApOworCitJTlROCitTdHJDbXAgKAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczIKKyAgICApOworCitJTlROCitTdHJuQ21wICgKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczEsCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMyLAorICAgIElOIFVJTlROICAgIGxlbgorICAgICk7CisKK0lOVE4KK1N0cmlDbXAgKAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczIKKyAgICApOworCitWT0lECitTdHJMd3IgKAorICAgIElOIENIQVIxNiAgICpTdHIKKyAgICApOworCitWT0lECitTdHJVcHIgKAorICAgIElOIENIQVIxNiAgICpTdHIKKyAgICApOworCitWT0lECitTdHJDcHkgKAorICAgIElOIENIQVIxNiAgICpEZXN0LAorICAgIElOIENPTlNUIENIQVIxNiAgICAqU3JjCisgICAgKTsKKworVk9JRAorU3RyQ2F0ICgKKyAgICBJTiBDSEFSMTYgICAqRGVzdCwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqU3JjCisgICAgKTsKKworVUlOVE4KK1N0ckxlbiAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxCisgICAgKTsKKworVUlOVE4KK1N0clNpemUgKAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMQorICAgICk7CisKK0NIQVIxNiAqCitTdHJEdXBsaWNhdGUgKAorICAgIElOIENPTlNUIENIQVIxNiAgICpTcmMKKyAgICApOworCitVSU5UTgorc3RybGVuYSAoCisgICAgSU4gQ09OU1QgQ0hBUjggICAgKnMxCisgICAgKTsKKyAgICAKK1VJTlROCitzdHJjbXBhICgKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczEsCisgICAgSU4gQ09OU1QgQ0hBUjggICAgKnMyCisgICAgKTsKKworVUlOVE4KK3N0cm5jbXBhICgKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczEsCisgICAgSU4gQ09OU1QgQ0hBUjggICAgKnMyLAorICAgIElOIFVJTlROICAgIGxlbgorICAgICk7CisKK1VJTlROCit4dG9pICgKKyAgICBDT05TVCBDSEFSMTYgICAgICAqc3RyCisgICAgKTsKKworVUlOVE4KK0F0b2kgKAorICAgIENPTlNUIENIQVIxNiAgKnN0cgorICAgICk7CisKK0JPT0xFQU4gCitNZXRhTWF0Y2ggKAorICAgIElOIENIQVIxNiAgICpTdHJpbmcsCisgICAgSU4gQ0hBUjE2ICAgKlBhdHRlcm4KKyAgICApOworCitCT09MRUFOIAorTWV0YWlNYXRjaCAoCisgICAgSU4gQ0hBUjE2ICAgKlN0cmluZywKKyAgICBJTiBDSEFSMTYgICAqUGF0dGVybgorICAgICk7CisKK1VJTlQ2NAorTFNoaWZ0VTY0ICgKKyAgICBJTiBVSU5UNjQgICBPcGVyYW5kLAorICAgIElOIFVJTlROICAgIENvdW50CisgICAgKTsKKworVUlOVDY0CitSU2hpZnRVNjQgKAorICAgIElOIFVJTlQ2NCAgIE9wZXJhbmQsCisgICAgSU4gVUlOVE4gICAgQ291bnQKKyAgICApOworCitVSU5UNjQKK011bHRVNjR4MzIgKAorICAgIElOIFVJTlQ2NCAgIE11bHRpcGxpY2FuZCwKKyAgICBJTiBVSU5UTiAgICBNdWx0aXBsaWVyCisgICAgKTsKKworVUlOVDY0CitEaXZVNjR4MzIgKAorICAgIElOIFVJTlQ2NCAgIERpdmlkZW5kLAorICAgIElOIFVJTlROICAgIERpdmlzb3IsCisgICAgT1VUIFVJTlROICAgKlJlbWFpbmRlciBPUFRJT05BTAorICAgICk7CisKK1ZPSUQKK0luaXRpYWxpemVMb2NrICgKKyAgICBJTiBPVVQgRkxPQ0sgICAgKkxvY2ssCisgICAgSU4gRUZJX1RQTCAgUHJpb3JpdHkKKyAgICApOworCitWT0lECitBY3F1aXJlTG9jayAoCisgICAgSU4gRkxPQ0sgICAgKkxvY2sKKyAgICApOworCitWT0lECitSZWxlYXNlTG9jayAoCisgICAgSU4gRkxPQ0sgICAgKkxvY2sKKyAgICApOworCisKK0lOVE4KK0NvbXBhcmVHdWlkKAorICAgIElOIEVGSV9HVUlEICAgICAqR3VpZDEsCisgICAgSU4gRUZJX0dVSUQgICAgICpHdWlkMgorICAgICk7CisKK1ZPSUQgKgorQWxsb2NhdGVQb29sICgKKyAgICBJTiBVSU5UTiAgICAgU2l6ZQorICAgICk7CisKK1ZPSUQgKgorQWxsb2NhdGVaZXJvUG9vbCAoCisgICAgSU4gVUlOVE4gICAgIFNpemUKKyAgICApOworCitWT0lEICoKK1JlYWxsb2NhdGVQb29sICgKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqT2xkUG9vbCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICBPbGRTaXplLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgIE5ld1NpemUKKyAgICApOworCitWT0lECitGcmVlUG9vbCAoCisgICAgSU4gVk9JRCAgICAgKnAKKyAgICApOworCisKK1ZPSUQKK091dHB1dCAoCisgICAgSU4gQ0hBUjE2ICAgKlN0cgorICAgICk7CisKK1ZPSUQKK0lucHV0ICgKKyAgICBJTiBDSEFSMTYgICAqUHJvbXB0IE9QVElPTkFMLAorICAgIE9VVCBDSEFSMTYgICpJblN0ciwKKyAgICBJTiBVSU5UTiAgICBTdHJMZW4KKyAgICApOworCitWT0lECitJSW5wdXQgKAorICAgIElOIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpDb25PdXQsCisgICAgSU4gU0lNUExFX0lOUFVUX0lOVEVSRkFDRSAgICAgICAgICAgKkNvbkluLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICpQcm9tcHQgT1BUSU9OQUwsCisgICAgT1VUIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKkluU3RyLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ckxlbgorICAgICk7CisKK1VJTlROCitQcmludCAoCisgICAgSU4gQ0hBUjE2ICAgKmZtdCwKKyAgICAuLi4KKyAgICApOworCitVSU5UTgorVlByaW50ICgKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIHZhX2xpc3QgICAgIGFyZ3MKKyAgICApOworCitVSU5UTgorU1ByaW50ICgKKyAgICBPVVQgQ0hBUjE2ICAqU3RyLAorICAgIElOIFVJTlROICAgIFN0clNpemUsCisgICAgSU4gQ0hBUjE2ICAgKmZtdCwKKyAgICAuLi4KKyAgICApOworCitVSU5UTgorVlNQcmludCAoCisgICAgT1VUIENIQVIxNiAgKlN0ciwKKyAgICBJTiBVSU5UTiAgICBTdHJTaXplLAorICAgIElOIENIQVIxNiAgICpmbXQsCisgICAgdmFfbGlzdCAgICAgYXJncworICAgICk7CisKK0NIQVIxNiAqCitQb29sUHJpbnQgKAorICAgIElOIENIQVIxNiAgICAgICAgICAgKmZtdCwKKyAgICAuLi4KKyAgICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0hBUjE2ICAgICAgKnN0cjsKKyAgICBVSU5UTiAgICAgICBsZW47CisgICAgVUlOVE4gICAgICAgbWF4bGVuOworfSBQT09MX1BSSU5UOworCitDSEFSMTYgKgorQ2F0UHJpbnQgKAorICAgIElOIE9VVCBQT09MX1BSSU5UICAgKlN0ciwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICpmbXQsCisgICAgLi4uCisgICAgKTsKKworVUlOVE4KK1ByaW50QXQgKAorICAgIElOIFVJTlROICAgIENvbHVtbiwKKyAgICBJTiBVSU5UTiAgICBSb3csCisgICAgSU4gQ0hBUjE2ICAgKmZtdCwKKyAgICAuLi4KKyAgICApOworCitVSU5UTgorSVByaW50ICgKKyAgICBJTiBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICpPdXQsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqZm10LAorICAgIC4uLgorICAgICk7CisKK1VJTlROCitJUHJpbnRBdCAoCisgICAgSU4gU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAgKk91dCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW4sCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93LAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbXQsCisgICAgLi4uCisgICAgKTsKKworVUlOVE4KK0FQcmludCAoCisgICAgSU4gQ0hBUjggICAgKmZtdCwKKyAgICAuLi4KKyAgICApOworCitWT0lECitWYWx1ZVRvSGV4ICgKKyAgICBJTiBDSEFSMTYgICAqQnVmZmVyLAorICAgIElOIFVJTlQ2NCAgIHYKKyAgICApOworCitWT0lECitWYWx1ZVRvU3RyaW5nICgKKyAgICBJTiBDSEFSMTYgICAqQnVmZmVyLAorICAgIElOIEJPT0xFQU4gIENvbW1hLAorICAgIElOIElOVDY0ICAgIHYKKyAgICApOworCitWT0lECitUaW1lVG9TdHJpbmcgKAorICAgIE9VVCBDSEFSMTYgICAgICAqQnVmZmVyLAorICAgIElOIEVGSV9USU1FICAgICAqVGltZQorICAgICk7CisKK1ZPSUQKK0d1aWRUb1N0cmluZyAoCisgICAgT1VUIENIQVIxNiAgICAgICpCdWZmZXIsCisgICAgSU4gRUZJX0dVSUQgICAgICpHdWlkCisgICAgKTsKKworVk9JRAorU3RhdHVzVG9TdHJpbmcgKAorICAgIE9VVCBDSEFSMTYgICAgICAqQnVmZmVyLAorICAgIEVGSV9TVEFUVVMgICAgICBTdGF0dXMKKyAgICApOworCitWT0lECitEdW1wSGV4ICgKKyAgICBJTiBVSU5UTiAgICAgICAgSW5kZW50LAorICAgIElOIFVJTlROICAgICAgICBPZmZzZXQsCisgICAgSU4gVUlOVE4gICAgICAgIERhdGFTaXplLAorICAgIElOIFZPSUQgICAgICAgICAqVXNlckRhdGEKKyAgICApOworCitCT09MRUFOCitHcm93QnVmZmVyKAorICAgIElOIE9VVCBFRklfU1RBVFVTICAgKlN0YXR1cywKKyAgICBJTiBPVVQgVk9JRCAgICAgICAgICoqQnVmZmVyLAorICAgIElOIFVJTlROICAgICAgICAgICAgQnVmZmVyU2l6ZQorICAgICk7CisKK0VGSV9NRU1PUllfREVTQ1JJUFRPUiAqCitMaWJNZW1vcnlNYXAgKAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICpOb0VudHJpZXMsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgKk1hcEtleSwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAqRGVzY3JpcHRvclNpemUsCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgKkRlc2NyaXB0b3JWZXJzaW9uCisgICAgKTsKKworVk9JRCAqCitMaWJHZXRWYXJpYWJsZSAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgKk5hbWUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgKlZlbmRvckd1aWQKKyAgICApOworCitWT0lEICoKK0xpYkdldFZhcmlhYmxlQW5kU2l6ZSAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgKk5hbWUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgKlZlbmRvckd1aWQsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgKlZhclNpemUKKyAgICApOworCitFRklfU1RBVFVTCitMaWJEZWxldGVWYXJpYWJsZSAoCisgICAgSU4gQ0hBUjE2ICAgKlZhck5hbWUsCisgICAgSU4gRUZJX0dVSUQgKlZhckd1aWQKKyAgICApOworCitFRklfU1RBVFVTCitMaWJTZXROVlZhcmlhYmxlICgKKyAgICBJTiBDSEFSMTYgICAqVmFyTmFtZSwKKyAgICBJTiBFRklfR1VJRCAqVmFyR3VpZCwKKyAgICBJTiBVSU5UTgkgRGF0YVNpemUsCisgICAgSU4gVk9JRCAgICAgKkRhdGEKKyAgICApOworCitFRklfU1RBVFVTCitMaWJTZXRWYXJpYWJsZSAoCisgICAgSU4gQ0hBUjE2ICAgKlZhck5hbWUsCisgICAgSU4gRUZJX0dVSUQgKlZhckd1aWQsCisgICAgSU4gVUlOVE4JIERhdGFTaXplLAorICAgIElOIFZPSUQgICAgICpEYXRhCisgICAgKTsKK0VGSV9TVEFUVVMKK0xpYkluc2VydFRvVGFpbE9mQm9vdE9yZGVyICgKKyAgICBJTiAgVUlOVDE2ICBCb290T3B0aW9uLAorICAgIElOICBCT09MRUFOIE9ubHlJbnNlcnRJZkVtcHR5CisgICAgKTsKKworRUZJX1NUQVRVUworTGliTG9jYXRlUHJvdG9jb2wgKAorICAgIElOICBFRklfR1VJRCAgICAqUHJvdG9jb2xHdWlkLAorICAgIE9VVCBWT0lEICAgICAgICAqKkludGVyZmFjZQorICAgICk7CisKK0VGSV9TVEFUVVMKK0xpYkxvY2F0ZUhhbmRsZSAoCisgICAgSU4gRUZJX0xPQ0FURV9TRUFSQ0hfVFlQRSAgIFNlYXJjaFR5cGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCBPUFRJT05BTCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKlNlYXJjaEtleSBPUFRJT05BTCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgKk5vSGFuZGxlcywKKyAgICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgKipCdWZmZXIKKyAgICApOworCitFRklfU1RBVFVTCitMaWJMb2NhdGVIYW5kbGVCeURpc2tTaWduYXR1cmUgKAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgTUJSVHlwZSwKKyAgICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZVR5cGUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqU2lnbmF0dXJlLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKk5vSGFuZGxlcywKKyAgICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICoqQnVmZmVyCisgICAgKTsKKworRUZJX1NUQVRVUworTGliSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlcyAoCisgICAgSU4gT1VUIEVGSV9IQU5ETEUgICAgICAgKkhhbmRsZSwKKyAgICAuLi4KKyAgICApOworCitWT0lECitMaWJVbmluc3RhbGxQcm90b2NvbEludGVyZmFjZXMgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgIEhhbmRsZSwKKyAgICAuLi4KKyAgICApOworCitFRklfU1RBVFVTCitMaWJSZWluc3RhbGxQcm90b2NvbEludGVyZmFjZXMgKAorICAgIElOIE9VVCBFRklfSEFORExFICAgICAgICAgICAqSGFuZGxlLAorICAgIC4uLgorICAgICk7CisKK0VGSV9FVkVOVAorTGliQ3JlYXRlUHJvdG9jb2xOb3RpZnlFdmVudCAoCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgKlByb3RvY29sR3VpZCwKKyAgICBJTiBFRklfVFBMICAgICAgICAgICAgICBOb3RpZnlUcGwsCisgICAgSU4gRUZJX0VWRU5UX05PVElGWSAgICAgTm90aWZ5RnVuY3Rpb24sCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKk5vdGlmeUNvbnRleHQsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgKlJlZ2lzdHJhdGlvbgorICAgICk7CisKK0VGSV9TVEFUVVMKK1dhaXRGb3JTaW5nbGVFdmVudCAoCisgICAgSU4gRUZJX0VWRU5UICAgICAgICBFdmVudCwKKyAgICBJTiBVSU5UNjQgICAgICAgICAgIFRpbWVvdXQgT1BUSU9OQUwKKyAgICApOworCitWT0lECitXYWl0Rm9yRXZlbnRXaXRoVGltZW91dCAoCisgICAgSU4gIEVGSV9FVkVOVCAgICAgICBFdmVudCwKKyAgICBJTiAgVUlOVE4gICAgICAgICAgIFRpbWVvdXQsCisgICAgSU4gIFVJTlROICAgICAgICAgICBSb3csCisgICAgSU4gIFVJTlROICAgICAgICAgICBDb2x1bW4sCisgICAgSU4gIENIQVIxNiAgICAgICAgICAqU3RyaW5nLAorICAgIElOICBFRklfSU5QVVRfS0VZICAgVGltZW91dEtleSwKKyAgICBPVVQgRUZJX0lOUFVUX0tFWSAgICpLZXkKKyAgICApOworCitFRklfRklMRV9IQU5ETEUKK0xpYk9wZW5Sb290ICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBEZXZpY2VIYW5kbGUKKyAgICApOworCitFRklfRklMRV9JTkZPICoKK0xpYkZpbGVJbmZvICgKKyAgICBJTiBFRklfRklMRV9IQU5ETEUgICAgICBGSGFuZAorICAgICk7CisKK0VGSV9GSUxFX1NZU1RFTV9JTkZPICoKK0xpYkZpbGVTeXN0ZW1JbmZvICgKKyAgICBJTiBFRklfRklMRV9IQU5ETEUgICAgICBGSGFuZAorICAgICk7CisKK0VGSV9GSUxFX1NZU1RFTV9WT0xVTUVfTEFCRUxfSU5GTyAqCitMaWJGaWxlU3lzdGVtVm9sdW1lTGFiZWxJbmZvICgKKyAgICBJTiBFRklfRklMRV9IQU5ETEUgICAgICBGSGFuZAorICAgICk7CisKK0JPT0xFQU4KK1ZhbGlkTUJSKAorICAgIElOICBNQVNURVJfQk9PVF9SRUNPUkQgICpNYnIsCisgICAgSU4gIEVGSV9CTE9DS19JTyAgICAgICAgKkJsa0lvCisgICAgKTsKKworQk9PTEVBTgorTGliTWF0Y2hEZXZpY2VQYXRocyAoCisgICAgSU4gIEVGSV9ERVZJQ0VfUEFUSCAqTXVsdGksCisgICAgSU4gIEVGSV9ERVZJQ0VfUEFUSCAqU2luZ2xlCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0xpYkR1cGxpY2F0ZURldmljZVBhdGhJbnN0YW5jZSAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAqRGV2UGF0aAorICAgICk7CisKK0VGSV9ERVZJQ0VfUEFUSCAqCitEZXZpY2VQYXRoRnJvbUhhbmRsZSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgSGFuZGxlCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0RldmljZVBhdGhJbnN0YW5jZSAoCisgICAgSU4gT1VUIEVGSV9ERVZJQ0VfUEFUSCAgKipEZXZpY2VQYXRoLAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICpTaXplCisgICAgKTsKKworVUlOVE4KK0RldmljZVBhdGhJbnN0YW5jZUNvdW50ICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqRGV2aWNlUGF0aAorICAgICk7CisKK0VGSV9ERVZJQ0VfUEFUSCAqCitBcHBlbmREZXZpY2VQYXRoICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqU3JjMSwKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqU3JjMgorICAgICk7CisKK0VGSV9ERVZJQ0VfUEFUSCAqCitBcHBlbmREZXZpY2VQYXRoTm9kZSAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKlNyYzEsCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKlNyYzIKKyAgICApOworCitFRklfREVWSUNFX1BBVEgqCitBcHBlbmREZXZpY2VQYXRoSW5zdGFuY2UgKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgKlNyYywKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICpJbnN0YW5jZQorICAgICk7CisKK0VGSV9ERVZJQ0VfUEFUSCAqCitGaWxlRGV2aWNlUGF0aCAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgRGV2aWNlICBPUFRJT05BTCwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAqRmlsZU5hbWUKKyAgICApOworCitVSU5UTgorRGV2aWNlUGF0aFNpemUgKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICpEZXZQYXRoCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK0R1cGxpY2F0ZURldmljZVBhdGggKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICpEZXZQYXRoCisgICAgKTsKKworRUZJX0RFVklDRV9QQVRIICoKK1VucGFja0RldmljZVBhdGggKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgICAgICpEZXZQYXRoCisgICAgKTsKKworRUZJX1NUQVRVUworTGliRGV2aWNlUGF0aFRvSW50ZXJmYWNlICgKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKkZpbGVQYXRoLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICoqSW50ZXJmYWNlCisgICAgKTsKKworQ0hBUjE2ICoKK0RldmljZVBhdGhUb1N0ciAoCisgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgKkRldlBhdGgKKyAgICApOworCisvLworLy8gQnVnQnVnOiBJIG5lZWQgbXkgb3duIGluY2x1ZGUgZmlsZXMKKy8vCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICBSZWdpc3RlcjsKKyAgICBVSU5UOCAgIEZ1bmN0aW9uOworICAgIFVJTlQ4ICAgRGV2aWNlOworICAgIFVJTlQ4ICAgQnVzOworICAgIFVJTlQzMiAgUmVzZXJ2ZWQ7Cit9IEVGSV9BRERSRVNTOworCit0eXBlZGVmIHVuaW9uIHsKKyAgICBVSU5UNjQgICAgICAgICAgQWRkcmVzczsKKyAgICBFRklfQUREUkVTUyAgICAgRWZpQWRkcmVzczsKK30gRUZJX1BDSV9BRERSRVNTX1VOSU9OOworCisKK0VGSV9TVEFUVVMKK1BjaUZpbmREZXZpY2VDbGFzcyAoCisgICAgSU4gIE9VVCBFRklfUENJX0FERFJFU1NfVU5JT04gICAqQWRkcmVzcywKKyAgICBJTiAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcywKKyAgICBJTiAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIFN1YkNsYXNzCisgICAgKTsKKworRUZJX1NUQVRVUworUGNpRmluZERldmljZSAoCisgICAgSU4gIE9VVCBFRklfUENJX0FERFJFU1NfVU5JT04gICAqRGV2aWNlQWRkcmVzcywKKyAgICBJTiAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIFZlbmRvcklkLAorICAgIElOICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgRGV2aWNlSWQsCisgICAgSU4gT1VUICBQQ0lfVFlQRTAwICAgICAgICAgICAgICAqUGNpCisgICAgKTsKKworLy8KKy8vIFNJTVBMRV9SRUFEX0ZJTEUgb2JqZWN0IHVzZWQgdG8gYWNjZXNzIGZpbGVzCisvLworCit0eXBlZGVmIFZPSUQgICAgICAgICpTSU1QTEVfUkVBRF9GSUxFOworCitFRklfU1RBVFVTCitPcGVuU2ltcGxlUmVhZEZpbGUgKAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICBCb290UG9saWN5LAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU291cmNlQnVmZmVyICAgT1BUSU9OQUwsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIFNvdXJjZVNpemUsCisgICAgSU4gT1VUIEVGSV9ERVZJQ0VfUEFUSCAgICAgICoqRmlsZVBhdGgsCisgICAgT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICAgICpEZXZpY2VIYW5kbGUsICAgIAorICAgIE9VVCBTSU1QTEVfUkVBRF9GSUxFICAgICAgICAqU2ltcGxlUmVhZEhhbmRsZQorICAgICk7CisKK0VGSV9TVEFUVVMKK1JlYWRTaW1wbGVSZWFkRmlsZSAoCisgICAgSU4gU0lNUExFX1JFQURfRklMRSAgICAgU2ltcGxlUmVhZEhhbmRsZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICBPZmZzZXQsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgKlJlYWRTaXplLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCisKK1ZPSUQKK0Nsb3NlU2ltcGxlUmVhZEZpbGUgKAorICAgIElOIFNJTVBMRV9SRUFEX0ZJTEUgICAgIFNpbXBsZVJlYWRIYW5kbGUKKyAgICApOworCitWT0lECitJbml0aWFsaXplR3VpZCAoCisgICAgVk9JRAorICAgICk7CisKK1VJTlQ4CitEZWNpbWFsdG9CQ0QoCisgICAgSU4gIFVJTlQ4IERlY1ZhbHVlCisgICAgKTsKKworVUlOVDgKK0JDRHRvRGVjaW1hbCgKKyAgICBJTiAgVUlOVDggQmNkVmFsdWUKKyAgICApOworCitFRklfU1RBVFVTCitMaWJHZXRTeXN0ZW1Db25maWd1cmF0aW9uVGFibGUoCisgICAgSU4gRUZJX0dVSUQgKlRhYmxlR3VpZCwKKyAgICBJTiBPVVQgVk9JRCAqKlRhYmxlCisgICAgKTsKKworQk9PTEVBTgorTGliSXNWYWxpZFRleHRHcmFwaGljcyAoCisgICAgSU4gIENIQVIxNiAgR3JhcGhpYywgICAKKyAgICBPVVQgQ0hBUjggICAqUGNBbnNpLCAgICBPUFRJT05BTAorICAgIE9VVCBDSEFSOCAgICpBc2NpaSAgICAgIE9QVElPTkFMCisgICAgKTsKKworQk9PTEVBTgorSXNWYWxpZEFzY2lpICgKKyAgICBJTiAgQ0hBUjE2ICBBc2NpaQorICAgICk7CisKK0JPT0xFQU4KK0lzVmFsaWRFZmlDbnRsQ2hhciAoCisgICAgSU4gIENIQVIxNiAgYworICAgICk7CisKK0NIQVIxNiAqCitMaWJHZXRVaVN0cmluZyAoCisgICAgSU4gIEVGSV9IQU5ETEUgICAgICBIYW5kbGUsCisgICAgSU4gIFVJX1NUUklOR19UWVBFICBTdHJpbmdUeXBlLAorICAgIElOICBJU09fNjM5XzIgICAgICAgKkxhbmdDb2RlLAorICAgIElOICBCT09MRUFOICAgICAgICAgUmV0dXJuRGV2aWNlUGF0aFN0ck9uTWlzbWF0Y2gKKyAgICApOworCitDSEFSOCoKK0xpYkdldFNtYmlvc1N0cmluZyAoCisgICAgSU4gIFNNQklPU19TVFJVQ1RVUkVfUE9JTlRFUiAgICAqU21iaW9zLAorICAgIElOICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTnVtYmVyCisgICAgKTsKKworRUZJX1NUQVRVUworTGliR2V0U21iaW9zU3lzdGVtR3VpZEFuZFNlcmlhbE51bWJlciAoCisgICAgSU4gIEVGSV9HVUlEICAgICpTeXN0ZW1HdWlkLAorICAgIE9VVCBDSEFSOCAgICAgICAqKlN5c3RlbVNlcmlhbE51bWJlcgorICAgICk7CisKKworRUZJX1NUQVRVUworSW5pdGlhbGl6ZUdsb2JhbElvRGV2aWNlICgKKyAgICAgICAgSU4gIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAqRGV2aWNlUGF0aCwKKyAgICAgICAgSU4gIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgICAgIElOICBDSEFSOCAgICAgICAgICAgICAgICAgICAgICAgKkVycm9yU3RyLAorICAgICAgICBPVVQgRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICAgICoqR2xvYmFsSW9GbmNzIAorICAgICAgICApOworCitVSU5UMzIgCitSZWFkUG9ydCAoCisgICAgICAgIElOICBFRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgICAgKkdsb2JhbElvRm5jcywgCisgICAgICAgIElOICBFRklfSU9fV0lEVEggICAgICAgICAgICAgICAgV2lkdGgsCisgICAgICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgUG9ydAorICAgICAgICApOworCitVSU5UMzIgCitXcml0ZVBvcnQgKAorICAgICAgICBJTiAgRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICAgICpHbG9iYWxJb0ZuY3MsIAorICAgICAgICBJTiAgRUZJX0lPX1dJRFRIICAgICAgICAgICAgICAgIFdpZHRoLAorICAgICAgICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIFBvcnQsCisgICAgICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgRGF0YQorICAgICAgICApOworCitVSU5UMzIgCitSZWFkUGNpQ29uZmlnICgKKyAgICAgICAgSU4gIEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAgICAqR2xvYmFsSW9GbmNzLCAKKyAgICAgICAgSU4gIEVGSV9JT19XSURUSCAgICAgICAgICAgICAgICBXaWR0aCwKKyAgICAgICAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBQb3J0CisgICAgICAgICk7CisKK1VJTlQzMiAKK1dyaXRlUGNpQ29uZmlnICgKKyAgICAgICAgSU4gIEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAgICAqR2xvYmFsSW9GbmNzLCAKKyAgICAgICAgSU4gIEVGSV9JT19XSURUSCAgICAgICAgICAgICAgICBXaWR0aCwKKyAgICAgICAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBQb3J0LAorICAgICAgICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIERhdGEKKyAgICAgICAgKTsKKworZXh0ZXJuIEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAqR2xvYmFsSW9GbmNzOworCisjZGVmaW5lIG91dHAoX1BvcnQsIF9EYXRhQnl0ZSkgIChVSU5UOClXcml0ZVBvcnQoR2xvYmFsSW9GbmNzLCAgSU9fVUlOVDgsICAoVUlOVE4pX1BvcnQsIChVSU5UTilfRGF0YUJ5dGUpCisjZGVmaW5lIGlucChfUG9ydCkgICAgICAgICAgICAgIChVSU5UOClSZWFkUG9ydChHbG9iYWxJb0ZuY3MsICAgSU9fVUlOVDgsICAoVUlOVE4pX1BvcnQpCisjZGVmaW5lIG91dHB3KF9Qb3J0LCBfRGF0YUJ5dGUpIChVSU5UMTYpV3JpdGVQb3J0KEdsb2JhbElvRm5jcywgSU9fVUlOVDE2LCAoVUlOVE4pX1BvcnQsIChVSU5UTilfRGF0YUJ5dGUpCisjZGVmaW5lIGlucHcoX1BvcnQpICAgICAgICAgICAgIChVSU5UMTYpUmVhZFBvcnQoR2xvYmFsSW9GbmNzLCAgSU9fVUlOVDE2LCAoVUlOVE4pX1BvcnQpCisjZGVmaW5lIG91dHBkKF9Qb3J0LCBfRGF0YUJ5dGUpIChVSU5UMzIpV3JpdGVQb3J0KEdsb2JhbElvRm5jcywgSU9fVUlOVDMyLCAoVUlOVE4pX1BvcnQsIChVSU5UTilfRGF0YUJ5dGUpCisjZGVmaW5lIGlucGQoX1BvcnQpICAgICAgICAgICAgIChVSU5UMzIpUmVhZFBvcnQoR2xvYmFsSW9GbmNzLCAgSU9fVUlOVDMyLCAoVUlOVE4pX1BvcnQpCisKKyNkZWZpbmUgd3JpdGVwY2k4KF9BZGRyLCBfRGF0YUJ5dGUpICAoVUlOVDgpV3JpdGVQY2lDb25maWcoR2xvYmFsSW9GbmNzLCAgSU9fVUlOVDgsICAoVUlOVE4pX0FkZHIsIChVSU5UTilfRGF0YUJ5dGUpCisjZGVmaW5lIHJlYWRwY2k4KF9BZGRyKSAgICAgICAgICAgICAgKFVJTlQ4KVJlYWRQY2lDb25maWcoR2xvYmFsSW9GbmNzLCAgIElPX1VJTlQ4LCAgKFVJTlROKV9BZGRyKQorI2RlZmluZSB3cml0ZXBjaTE2KF9BZGRyLCBfRGF0YUJ5dGUpIChVSU5UMTYpV3JpdGVQY2lDb25maWcoR2xvYmFsSW9GbmNzLCBJT19VSU5UMTYsIChVSU5UTilfQWRkciwgKFVJTlROKV9EYXRhQnl0ZSkKKyNkZWZpbmUgcmVhZHBjaTE2KF9BZGRyKSAgICAgICAgICAgICAoVUlOVDE2KVJlYWRQY2lDb25maWcoR2xvYmFsSW9GbmNzLCAgSU9fVUlOVDE2LCAoVUlOVE4pX0FkZHIpCisjZGVmaW5lIHdyaXRlcGNpMzIoX0FkZHIsIF9EYXRhQnl0ZSkgKFVJTlQzMilXcml0ZVBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsIElPX1VJTlQzMiwgKFVJTlROKV9BZGRyLCAoVUlOVE4pX0RhdGFCeXRlKQorI2RlZmluZSByZWFkcGNpMzIoX0FkZHIpICAgICAgICAgICAgIChVSU5UMzIpUmVhZFBjaUNvbmZpZyhHbG9iYWxJb0ZuY3MsICBJT19VSU5UMzIsIChVSU5UTilfQWRkcikKKworI2RlZmluZSBQYXVzZSgpICAgICAgICAgICAgIFdhaXRGb3JTaW5nbGVFdmVudCAoU1QtPkNvbkluLT5XYWl0Rm9yS2V5LCAwKQorI2RlZmluZSBQb3J0ODAoX1Bvc3RDb2RlKSAgIEdsb2JhbElvRm5jcy0+SW8uV3JpdGUgKEdsb2JhbElvRm5jcywgSU9fVUlOVDE2LCAoVUlOVDY0KTB4ODAsIDEsICYoX1Bvc3RDb2RlKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlsaW5rLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmZjRmYQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaWxpbmsuaApAQCAtMCwwICsxLDE3NyBAQAorI2lmbmRlZiBfRUZJX0xJTktfSAorI2RlZmluZSBfRUZJX0xJTktfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBsaW5rLmggKHJlbmFtZWQgZWZpbGluay5oIHRvIGF2b2lkIGNvbmZsaWN0cykKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgbGluayBsaXN0IG1hY3JvJ3MKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaWZuZGVmIEVGSV9OVF9FTVVMCisKKy8vCisvLyBMaXN0IGVudHJ5IC0gZG91Ymx5IGxpbmtlZCBsaXN0CisvLworCit0eXBlZGVmIHN0cnVjdCBfTElTVF9FTlRSWSB7CisgICAgc3RydWN0IF9MSVNUX0VOVFJZICAqRmxpbms7CisgICAgc3RydWN0IF9MSVNUX0VOVFJZICAqQmxpbms7Cit9IExJU1RfRU5UUlk7CisKKyNlbmRpZiAKKworCisvLworLy8gIFZPSUQKKy8vICBJbml0aWFsaXplTGlzdEhlYWQoCisvLyAgICAgIExJU1RfRU5UUlkgKkxpc3RIZWFkCisvLyAgICAgICk7CisvLworCisjZGVmaW5lIEluaXRpYWxpemVMaXN0SGVhZChMaXN0SGVhZCkgXAorICAgIChMaXN0SGVhZCktPkZsaW5rID0gTGlzdEhlYWQ7ICAgIFwKKyAgICAoTGlzdEhlYWQpLT5CbGluayA9IExpc3RIZWFkOworCisvLworLy8gIEJPT0xFQU4KKy8vICBJc0xpc3RFbXB0eSgKKy8vICAgICAgUExJU1RfRU5UUlkgTGlzdEhlYWQKKy8vICAgICAgKTsKKy8vCisKKyNkZWZpbmUgSXNMaXN0RW1wdHkoTGlzdEhlYWQpIFwKKyAgICAoKExpc3RIZWFkKS0+RmxpbmsgPT0gKExpc3RIZWFkKSkKKworLy8KKy8vICBWT0lECisvLyAgUmVtb3ZlRW50cnlMaXN0KAorLy8gICAgICBQTElTVF9FTlRSWSBFbnRyeQorLy8gICAgICApOworLy8KKworI2RlZmluZSBfUmVtb3ZlRW50cnlMaXN0KEVudHJ5KSB7ICAgICAgIFwKKyAgICAgICAgTElTVF9FTlRSWSAqX0JsaW5rLCAqX0ZsaW5rOyAgICBcCisgICAgICAgIF9GbGluayA9IChFbnRyeSktPkZsaW5rOyAgICAgICAgXAorICAgICAgICBfQmxpbmsgPSAoRW50cnkpLT5CbGluazsgICAgICAgIFwKKyAgICAgICAgX0JsaW5rLT5GbGluayA9IF9GbGluazsgICAgICAgICBcCisgICAgICAgIF9GbGluay0+QmxpbmsgPSBfQmxpbms7ICAgICAgICAgXAorICAgICAgICB9CisKKyNpZiBFRklfREVCVUcKKyAgICAjZGVmaW5lIFJlbW92ZUVudHJ5TGlzdChFbnRyeSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfUmVtb3ZlRW50cnlMaXN0KEVudHJ5KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChFbnRyeSktPkZsaW5rID0gKExJU1RfRU5UUlkgKikgQkFEX1BPSU5URVI7ICAgIFwKKyAgICAgICAgKEVudHJ5KS0+QmxpbmsgPSAoTElTVF9FTlRSWSAqKSBCQURfUE9JTlRFUjsgCisjZWxzZQorICAgICNkZWZpbmUgUmVtb3ZlRW50cnlMaXN0KEVudHJ5KSAgICAgIFwKKyAgICAgICAgX1JlbW92ZUVudHJ5TGlzdChFbnRyeSk7CisjZW5kaWYKKworLy8KKy8vICBWT0lECisvLyAgSW5zZXJ0VGFpbExpc3QoCisvLyAgICAgIFBMSVNUX0VOVFJZIExpc3RIZWFkLAorLy8gICAgICBQTElTVF9FTlRSWSBFbnRyeQorLy8gICAgICApOworLy8KKworI2RlZmluZSBJbnNlcnRUYWlsTGlzdChMaXN0SGVhZCxFbnRyeSkge1wKKyAgICBMSVNUX0VOVFJZICpfTGlzdEhlYWQsICpfQmxpbms7ICAgICBcCisgICAgX0xpc3RIZWFkID0gKExpc3RIZWFkKTsgICAgICAgICAgICAgXAorICAgIF9CbGluayA9IF9MaXN0SGVhZC0+Qmxpbms7ICAgICAgICAgIFwKKyAgICAoRW50cnkpLT5GbGluayA9IF9MaXN0SGVhZDsgICAgICAgICBcCisgICAgKEVudHJ5KS0+QmxpbmsgPSBfQmxpbms7ICAgICAgICAgICAgXAorICAgIF9CbGluay0+RmxpbmsgPSAoRW50cnkpOyAgICAgICAgICAgIFwKKyAgICBfTGlzdEhlYWQtPkJsaW5rID0gKEVudHJ5KTsgICAgICAgICBcCisgICAgfQorCisvLworLy8gIFZPSUQKKy8vICBJbnNlcnRIZWFkTGlzdCgKKy8vICAgICAgUExJU1RfRU5UUlkgTGlzdEhlYWQsCisvLyAgICAgIFBMSVNUX0VOVFJZIEVudHJ5CisvLyAgICAgICk7CisvLworCisjZGVmaW5lIEluc2VydEhlYWRMaXN0KExpc3RIZWFkLEVudHJ5KSB7XAorICAgIExJU1RfRU5UUlkgKl9MaXN0SGVhZCwgKl9GbGluazsgICAgIFwKKyAgICBfTGlzdEhlYWQgPSAoTGlzdEhlYWQpOyAgICAgICAgICAgICBcCisgICAgX0ZsaW5rID0gX0xpc3RIZWFkLT5GbGluazsgICAgICAgICAgXAorICAgIChFbnRyeSktPkZsaW5rID0gX0ZsaW5rOyAgICAgICAgICAgIFwKKyAgICAoRW50cnkpLT5CbGluayA9IF9MaXN0SGVhZDsgICAgICAgICBcCisgICAgX0ZsaW5rLT5CbGluayA9IChFbnRyeSk7ICAgICAgICAgICAgXAorICAgIF9MaXN0SGVhZC0+RmxpbmsgPSAoRW50cnkpOyAgICAgICAgIFwKKyAgICB9CisKKy8vICBWT0lECisvLyAgU3dhcExpc3RFbnRyaWVzKAorLy8gICAgICBQTElTVF9FTlRSWSBFbnRyeTEsCisvLyAgICAgIFBMSVNUX0VOVFJZIEVudHJ5MgorLy8gICAgICApOworLy8KKy8vIFB1dCBFbnRyeTIgYmVmb3JlIEVudHJ5MQorLy8KKyNkZWZpbmUgU3dhcExpc3RFbnRyaWVzKEVudHJ5MSxFbnRyeTIpIHtcCisgICAgTElTVF9FTlRSWSAqRW50cnkxRmxpbmssICpFbnRyeTFCbGluazsgICAgIFwKKyAgICBMSVNUX0VOVFJZICpFbnRyeTJGbGluaywgKkVudHJ5MkJsaW5rOyAgICAgXAorICAgIEVudHJ5MkZsaW5rID0gKEVudHJ5MiktPkZsaW5rOyAgICAgICAgICAgICBcCisgICAgRW50cnkyQmxpbmsgPSAoRW50cnkyKS0+Qmxpbms7ICAgICAgICAgICAgIFwKKyAgICBFbnRyeTFGbGluayA9IChFbnRyeTEpLT5GbGluazsgICAgICAgICAgICAgXAorICAgIEVudHJ5MUJsaW5rID0gKEVudHJ5MSktPkJsaW5rOyAgICAgICAgICAgICBcCisgICAgRW50cnkyQmxpbmstPkZsaW5rID0gRW50cnkyRmxpbms7ICAgICAgIFwKKyAgICBFbnRyeTJGbGluay0+QmxpbmsgPSBFbnRyeTJCbGluazsgICAgICAgIFwKKyAgICAoRW50cnkyKS0+RmxpbmsgPSBFbnRyeTE7ICAgICAgICAgICAgICAgXAorICAgIChFbnRyeTIpLT5CbGluayA9IEVudHJ5MUJsaW5rOyAgICAgICAgICBcCisgICAgRW50cnkxQmxpbmstPkZsaW5rID0gKEVudHJ5Mik7ICAgICAgICAgICAgXAorICAgIChFbnRyeTEpLT5CbGluayA9IChFbnRyeTIpOyAgICAgICAgICAgICBcCisgICAgfQorCisvLworLy8gIEVGSV9GSUVMRF9PRkZTRVQgLSByZXR1cm5zIHRoZSBieXRlIG9mZnNldCB0byBhIGZpZWxkIHdpdGhpbiBhIHN0cnVjdHVyZQorLy8KKworI2RlZmluZSBFRklfRklFTERfT0ZGU0VUKFRZUEUsRmllbGQpICgoVUlOVE4pKCYoKChUWVBFICopIDApLT5GaWVsZCkpKQorCisvLworLy8gIENPTlRBSU5JTkdfUkVDT1JEIC0gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZQorLy8gICAgICBmcm9tIG9uZSBvZiBpdCdzIGVsZW1lbnRzLgorLy8KKworI2RlZmluZSBfQ1IoUmVjb3JkLCBUWVBFLCBGaWVsZCkgIFwKKyAgICAoKFRZUEUgKikgKCAoQ0hBUjggKikoUmVjb3JkKSAtIChDSEFSOCAqKSAmKCgoVFlQRSAqKSAwKS0+RmllbGQpKSkKKworI2lmIEVGSV9ERUJVRworICAgICNkZWZpbmUgQ1IoUmVjb3JkLCBUWVBFLCBGaWVsZCwgU2lnKSAgICAgXAorICAgICAgICBfQ1IoUmVjb3JkLCBUWVBFLCBGaWVsZCktPlNpZ25hdHVyZSAhPSBTaWcgPyAgICAgICAgXAorICAgICAgICAgICAgKFRZUEUgKikgQVNTRVJUX1NUUlVDVChfQ1IoUmVjb3JkLCBUWVBFLCBGaWVsZCksIFJlY29yZCkgOiBcCisgICAgICAgICAgICBfQ1IoUmVjb3JkLCBUWVBFLCBGaWVsZCkKKyNlbHNlCisgICAgI2RlZmluZSBDUihSZWNvcmQsIFRZUEUsIEZpZWxkLCBTaWduYXR1cmUpICAgXAorICAgICAgICBfQ1IoUmVjb3JkLCBUWVBFLCBGaWVsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZgorCisKKy8vCisvLyBBIGxvY2sgc3RydWN0dXJlCisvLworCit0eXBlZGVmIHN0cnVjdCBfRkxPQ0sgeworICAgIEVGSV9UUEwgICAgIFRwbDsKKyAgICBFRklfVFBMICAgICBPd25lclRwbDsKKyAgICBVSU5UTiAgICAgICBMb2NrOworfSBGTE9DSzsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaW5ldC5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlNWFhOAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaW5ldC5oCkBAIC0wLDAgKzEsMzQwIEBACisjaWZuZGVmIF9FRklORVRfSAorI2RlZmluZSBfRUZJTkVUX0gKKworCisvKisrCitDb3B5cmlnaHQgKGMpIDE5OTkgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorICAgIGVmaW5ldC5oCisKK0Fic3RyYWN0OgorICAgIEVGSSBTaW1wbGUgTmV0d29yayBwcm90b2NvbAorCitSZXZpc2lvbiBIaXN0b3J5CistLSovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICAgICAgU2ltcGxlIE5ldHdvcmsgUHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MIFwKKyAgICB7IDB4QTE5ODMyQjksIDB4QUMyNSwgMHgxMUQzLCB7MHg5QSwgMHgyRCwgMHgwMCwgMHg5MCwgMHgyNywgMHgzRiwgMHhDMSwgMHg0RH0gfQorCisKK0lOVEVSRkFDRV9ERUNMKF9FRklfU0lNUExFX05FVFdPUkspOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8KKyAgICAvLyBUb3RhbCBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkLiAgSW5jbHVkZXMgZnJhbWVzIHdpdGggZXJyb3JzIGFuZAorICAgIC8vIGRyb3BwZWQgZnJhbWVzLgorICAgIC8vCisgICAgVUlOVDY0ICBSeFRvdGFsRnJhbWVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgdmFsaWQgZnJhbWVzIHJlY2VpdmVkIGFuZCBjb3BpZWQgaW50byByZWNlaXZlIGJ1ZmZlcnMuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4R29vZEZyYW1lczsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBiZWxvdyB0aGUgbWluaW11bSBsZW5ndGggZm9yIHRoZSBtZWRpYS4KKyAgICAvLyBUaGlzIHdvdWxkIGJlIDw2NCBmb3IgZXRoZXJuZXQuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4VW5kZXJzaXplRnJhbWVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIGxvbmdlciB0aGFuIHRoZSBtYXhtaW51bSBsZW5ndGggZm9yIHRoZQorICAgIC8vIG1lZGlhLiAgVGhpcyB3b3VsZCBiZSA+MTUwMCBmb3IgZXRoZXJuZXQuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4T3ZlcnNpemVGcmFtZXM7CisKKyAgICAvLworICAgIC8vIFZhbGlkIGZyYW1lcyB0aGF0IHdlcmUgZHJvcHBlZCBiZWNhdXNlIHJlY2VpdmUgYnVmZmVycyB3ZXJlIGZ1bGwuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4RHJvcHBlZEZyYW1lczsKKworICAgIC8vCisgICAgLy8gTnVtYmVyIG9mIHZhbGlkIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIGFuZCBub3QgZHJvcHBlZC4KKyAgICAvLworICAgIFVJTlQ2NCAgUnhVbmljYXN0RnJhbWVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgdmFsaWQgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBhbmQgbm90IGRyb3BwZWQuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4QnJvYWRjYXN0RnJhbWVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgdmFsaWQgbXV0bGljYXN0IGZyYW1lcyByZWNlaXZlZCBhbmQgbm90IGRyb3BwZWQuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4TXVsdGljYXN0RnJhbWVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIHcvIENSQyBvciBhbGlnbm1lbnQgZXJyb3JzLgorICAgIC8vCisgICAgVUlOVDY0ICBSeENyY0Vycm9yRnJhbWVzOworCisgICAgLy8KKyAgICAvLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuICBJbmNsdWRlcyBmcmFtZXMgd2l0aCBlcnJvcnMKKyAgICAvLyBhbmQgZHJvcHBlZCBmcmFtZXMuCisgICAgLy8KKyAgICBVSU5UNjQgIFJ4VG90YWxCeXRlczsKKworICAgIC8vCisgICAgLy8gVHJhbnNtaXQgc3RhdGlzdGljcy4KKyAgICAvLworICAgIFVJTlQ2NCAgVHhUb3RhbEZyYW1lczsKKyAgICBVSU5UNjQgIFR4R29vZEZyYW1lczsKKyAgICBVSU5UNjQgIFR4VW5kZXJzaXplRnJhbWVzOworICAgIFVJTlQ2NCAgVHhPdmVyc2l6ZUZyYW1lczsKKyAgICBVSU5UNjQgIFR4RHJvcHBlZEZyYW1lczsKKyAgICBVSU5UNjQgIFR4VW5pY2FzdEZyYW1lczsKKyAgICBVSU5UNjQgIFR4QnJvYWRjYXN0RnJhbWVzOworICAgIFVJTlQ2NCAgVHhNdWx0aWNhc3RGcmFtZXM7CisgICAgVUlOVDY0ICBUeENyY0Vycm9yRnJhbWVzOworICAgIFVJTlQ2NCAgVHhUb3RhbEJ5dGVzOworCisgICAgLy8KKyAgICAvLyBOdW1iZXIgb2YgY29sbGlzaW9ucyBkZXRlY3Rpb24gb24gdGhpcyBzdWJuZXQuCisgICAgLy8KKyAgICBVSU5UNjQgIENvbGxpc2lvbnM7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBmcmFtZXMgZGVzdGluZWQgZm9yIHVuc3VwcG9ydGVkIHByb3RvY29sLgorICAgIC8vCisgICAgVUlOVDY0ICBVbnN1cHBvcnRlZFByb3RvY29sOworCit9IEVGSV9ORVRXT1JLX1NUQVRJU1RJQ1M7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpU2ltcGxlTmV0d29ya1N0b3BwZWQsCisgICAgRWZpU2ltcGxlTmV0d29ya1N0YXJ0ZWQsCisgICAgRWZpU2ltcGxlTmV0d29ya0luaXRpYWxpemVkLAorICAgIEVmaVNpbXBsZU5ldHdvcmtNYXhTdGF0ZQorfSBFRklfU0lNUExFX05FVFdPUktfU1RBVEU7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfVU5JQ0FTVCAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfTVVMVElDQVNUICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfQlJPQURDQVNUICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfUFJPTUlTQ1VPVVMgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfUFJPTUlTQ1VPVVNfTVVMVElDQVNUIDB4MTAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKworI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9JTlRFUlJVUFQgICAgICAgIDB4MDEKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1RSQU5TTUlUX0lOVEVSUlVQVCAgICAgICAweDAyCisjZGVmaW5lIEVGSV9TSU1QTEVfTkVUV09SS19DT01NQU5EX0lOVEVSUlVQVCAgICAgICAgMHgwNAorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfU09GVFdBUkVfSU5URVJSVVBUICAgICAgIDB4MDgKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKyNkZWZpbmUgTUFYX01DQVNUX0ZJTFRFUl9DTlQgICAgMTYKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgU3RhdGU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIEh3QWRkcmVzc1NpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSGVhZGVyU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgTWF4UGFja2V0U2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgTnZSYW1TaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBOdlJhbUFjY2Vzc1NpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVGaWx0ZXJNYXNrOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBSZWNlaXZlRmlsdGVyU2V0dGluZzsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgTWF4TUNhc3RGaWx0ZXJDb3VudDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgTUNhc3RGaWx0ZXJDb3VudDsKKyAgICBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgTUNhc3RGaWx0ZXJbTUFYX01DQVNUX0ZJTFRFUl9DTlRdOworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICBDdXJyZW50QWRkcmVzczsKKyAgICBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgQnJvYWRjYXN0QWRkcmVzczsKKyAgICBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgUGVybWFuZW50QWRkcmVzczsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgSWZUeXBlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBNYWNBZGRyZXNzQ2hhbmdlYWJsZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGVUeFN1cHBvcnRlZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgTWVkaWFQcmVzZW50U3VwcG9ydGVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBNZWRpYVByZXNlbnQ7Cit9IEVGSV9TSU1QTEVfTkVUV09SS19NT0RFOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19TVEFSVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAqVGhpcworKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfU1RPUCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAqVGhpcworKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfSU5JVElBTElaRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFSeEJ1ZmZlclNpemUgIE9QVElPTkFMLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBFeHRyYVR4QnVmZmVyU2l6ZSAgT1BUSU9OQUwKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1JFU0VUKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVmVyaWZpY2F0aW9uCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19TSFVURE9XTikgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAqVGhpcworKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9GSUxURVJTKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICAqVGhpcywKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSwKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGUsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBSZXNldE1DYXN0RmlsdGVyLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgTUNhc3RGaWx0ZXJDbnQgICAgIE9QVElPTkFMLAorICAgIElOIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgKk1DYXN0RmlsdGVyICAgICAgIE9QVElPTkFMCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19TVEFUSU9OX0FERFJFU1MpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgUmVzZXQsCisgICAgSU4gRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICAqTmV3ICAgICAgT1BUSU9OQUwKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1NUQVRJU1RJQ1MpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgUmVzZXQsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqU3RhdGlzdGljc1NpemUgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX05FVFdPUktfU1RBVElTVElDUyAgICAgICpTdGF0aXN0aWNzVGFibGUgIE9QVElPTkFMCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19NQ0FTVF9JUF9UT19NQUMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgSVB2NiwKKyAgICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICpJUCwKKyAgICBPVVQgRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICpNQUMKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX05WREFUQSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgUmVhZFdyaXRlLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK3R5cGVkZWYgCitFRklfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX0dFVF9TVEFUVVMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgKlRoaXMsCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICpJbnRlcnJ1cHRTdGF0dXMgIE9QVElPTkFMLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAqKlR4QnVmICAgICAgICAgICBPUFRJT05BTAorKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKwordHlwZWRlZiAKK0VGSV9TVEFUVVMgCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfVFJBTlNNSVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SSyAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyU2l6ZSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyLAorICAgIElOIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgKlNyY0FkZHIgICAgIE9QVElPTkFMLAorICAgIElOIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgKkRlc3RBZGRyICAgIE9QVElPTkFMLAorICAgIElOIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgKlByb3RvY29sICAgIE9QVElPTkFMCispOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFKSAoCisgICAgSU4gc3RydWN0IF9FRklfU0lNUExFX05FVFdPUksgICAqVGhpcywKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpIZWFkZXJTaXplICBPUFRJT05BTCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlciwKKyAgICBPVVQgRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICpTcmNBZGRyICAgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX01BQ19BRERSRVNTICAgICAgICAgICAgICpEZXN0QWRkciAgICBPUFRJT05BTCwKKyAgICBPVVQgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICpQcm90b2NvbCAgICBPUFRJT05BTAorKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKworI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfSU5URVJGQUNFX1JFVklTSU9OICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLIHsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfU0lNUExFX05FVFdPUktfU1RBUlQgICAgICAgICAgICBTdGFydDsKKyAgICBFRklfU0lNUExFX05FVFdPUktfU1RPUCAgICAgICAgICAgICBTdG9wOworICAgIEVGSV9TSU1QTEVfTkVUV09SS19JTklUSUFMSVpFICAgICAgIEluaXRpYWxpemU7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX1JFU0VUICAgICAgICAgICAgUmVzZXQ7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX1NIVVRET1dOICAgICAgICAgU2h1dGRvd247CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfRklMVEVSUyAgUmVjZWl2ZUZpbHRlcnM7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX1NUQVRJT05fQUREUkVTUyAgU3RhdGlvbkFkZHJlc3M7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX1NUQVRJU1RJQ1MgICAgICAgU3RhdGlzdGljczsKKyAgICBFRklfU0lNUExFX05FVFdPUktfTUNBU1RfSVBfVE9fTUFDICBNQ2FzdElwVG9NYWM7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX05WREFUQSAgICAgICAgICAgTnZEYXRhOworICAgIEVGSV9TSU1QTEVfTkVUV09SS19HRVRfU1RBVFVTICAgICAgIEdldFN0YXR1czsKKyAgICBFRklfU0lNUExFX05FVFdPUktfVFJBTlNNSVQgICAgICAgICBUcmFuc21pdDsKKyAgICBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRSAgICAgICAgICBSZWNlaXZlOworICAgIEVGSV9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhaXRGb3JQYWNrZXQ7CisgICAgRUZJX1NJTVBMRV9ORVRXT1JLX01PREUgICAgICAgICAgICAgKk1vZGU7Cit9IEVGSV9TSU1QTEVfTkVUV09SSzsKKworI2VuZGlmIC8qIF9FRklORVRfSCAqLwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpcGFydC5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpcGFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzU1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlwYXJ0LmgKQEAgLTAsMCArMSw2MSBAQAorI2lmbmRlZiBfRUZJX1BBUlRfSAorI2RlZmluZSBfRUZJX1BBUlRfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlwYXJ0LmgKKyAgICAKK0Fic3RyYWN0OiAgIAorICAgIEluZm8gYWJvdXQgZGlzayBwYXJ0aXRpb25zIGFuZCBNYXN0ZXIgQm9vdCBSZWNvcmRzCisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisvLworLy8KKy8vCisKKyNkZWZpbmUgRUZJX1BBUlRJVElPTiAgIDB4ZWYKKyNkZWZpbmUgTUJSX1NJWkUgICAgICAgIDUxMgorCisjcHJhZ21hIHBhY2soMSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgIEJvb3RJbmRpY2F0b3I7CisgICAgVUlOVDggICAgICAgU3RhcnRIZWFkOworICAgIFVJTlQ4ICAgICAgIFN0YXJ0U2VjdG9yOworICAgIFVJTlQ4ICAgICAgIFN0YXJ0VHJhY2s7CisgICAgVUlOVDggICAgICAgT1NJbmRpY2F0b3I7CisgICAgVUlOVDggICAgICAgRW5kSGVhZDsKKyAgICBVSU5UOCAgICAgICBFbmRTZWN0b3I7CisgICAgVUlOVDggICAgICAgRW5kVHJhY2s7CisgICAgVUlOVDggICAgICAgU3RhcnRpbmdMQkFbNF07CisgICAgVUlOVDggICAgICAgU2l6ZUluTEJBWzRdOworfSBNQlJfUEFSVElUSU9OX1JFQ09SRDsKKworI2RlZmluZSBFWFRSQUNUX1VJTlQzMihEKSAoVUlOVDMyKShEWzBdIHwgKERbMV0gPDwgOCkgfCAoRFsyXSA8PCAxNikgfCAoRFszXSA8PCAyNCkpCisKKyNkZWZpbmUgTUJSX1NJR05BVFVSRSAgICAgICAgICAgMHhhYTU1CisjZGVmaW5lIE1JTl9NQlJfREVWSUNFX1NJWkUgICAgIDB4ODAwMDAKKyNkZWZpbmUgTUJSX0VSUkFUQV9QQUQgICAgICAgICAgMHg0MDAwMCAvLyAxMjggTUIKKworI2RlZmluZSBNQVhfTUJSX1BBUlRJVElPTlMgIDQgICAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBCb290U3RyYXBDb2RlWzQ0MF07CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgVW5pcXVlTWJyU2lnbmF0dXJlWzRdOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIFVua25vd25bMl07CisgICAgTUJSX1BBUlRJVElPTl9SRUNPUkQgICAgUGFydGl0aW9uW01BWF9NQlJfUEFSVElUSU9OU107CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlOworfSBNQVNURVJfQk9PVF9SRUNPUkQ7CisjcHJhZ21hIHBhY2soKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpcGNpaW8uaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXBjaWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyNGY5NQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXBjaWlvLmgKQEAgLTAsMCArMSwyMTkgQEAKKyNpZm5kZWYgX0VGSV9QQ0lfSU9fSAorI2RlZmluZSBfRUZJX1BDSV9JT19ICisKKyNkZWZpbmUgRUZJX1BDSV9JT19QUk9UT0NPTCBcCisgICAgeyAweDRjZjViMjAwLCAweDY4YjgsIDB4NGNhNSwgezB4OWUsIDB4ZWMsIDB4YjIsIDB4M2UsIDB4M2YsIDB4NTAsIDB4MDIsIDB4OWF9IH0KKworSU5URVJGQUNFX0RFQ0woX0VGSV9QQ0lfSU8pOworCit0eXBlZGVmIGVudW0geworICAgIEVmaVBjaUlvV2lkdGhVaW50OCwKKyAgICBFZmlQY2lJb1dpZHRoVWludDE2LAorICAgIEVmaVBjaUlvV2lkdGhVaW50MzIsCisgICAgRWZpUGNpSW9XaWR0aFVpbnQ2NCwKKyAgICBFZmlQY2lJb1dpZHRoRmlmb1VpbnQ4LAorICAgIEVmaVBjaUlvV2lkdGhGaWZvVWludDE2LAorICAgIEVmaVBjaUlvV2lkdGhGaWZvVWludDMyLAorICAgIEVmaVBjaUlvV2lkdGhGaWZvVWludDY0LAorICAgIEVmaVBjaUlvV2lkdGhGaWxsVWludDgsCisgICAgRWZpUGNpSW9XaWR0aEZpbGxVaW50MTYsCisgICAgRWZpUGNpSW9XaWR0aEZpbGxVaW50MzIsCisgICAgRWZpUGNpSW9XaWR0aEZpbGxVaW50NjQsCisgICAgRWZpUGNpSW9XaWR0aE1heGltdW0KK30gRUZJX1BDSV9JT19QUk9UT0NPTF9XSURUSDsKKworI2RlZmluZSBFRklfUENJX0lPX1BBU1NfVEhST1VHSF9CQVIgMHhmZgorCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX1BPTExfSU9fTUVNKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTF9XSURUSCAgV2lkdGgsCisgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgIEJhckluZGV4LAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIE1hc2ssCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIFZhbHVlLAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICBEZWxheSwKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgKlJlc3VsdAorICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0lPX01FTSkgKAorICBJTiBzdHJ1Y3QgX0VGSV9QQ0lfSU8gKlRoaXMsCisgIElOIEVGSV9QQ0lfSU9fUFJPVE9DT0xfV0lEVEggIFdpZHRoLAorICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICBCYXJJbmRleCwKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICBDb3VudCwKKyAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfUENJX0lPX1BST1RPQ09MX0lPX01FTSAgICBSZWFkOworICBFRklfUENJX0lPX1BST1RPQ09MX0lPX01FTSAgICBXcml0ZTsKK30gRUZJX1BDSV9JT19QUk9UT0NPTF9BQ0NFU1M7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfQ09ORklHKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTF9XSURUSCAgV2lkdGgsCisgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgQ291bnQsCisgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUcgUmVhZDsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUcgV3JpdGU7Cit9IEVGSV9QQ0lfSU9fUFJPVE9DT0xfQ09ORklHX0FDQ0VTUzsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9DT1BZX01FTSkgKAorICBJTiBzdHJ1Y3QgX0VGSV9QQ0lfSU8gKlRoaXMsCisgIElOIEVGSV9QQ0lfSU9fUFJPVE9DT0xfV0lEVEggIFdpZHRoLAorICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICBEZXN0QmFySW5kZXgsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIERlc3RPZmZzZXQsCisgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgIFNyY0JhckluZGV4LAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICBTcmNPZmZzZXQsCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgIENvdW50CisgICk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJSZWFkLAorICAgIEVmaVBjaUlvT3BlcmF0aW9uQnVzTWFzdGVyV3JpdGUsCisgICAgRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJDb21tb25CdWZmZXIsCisgICAgRWZpUGNpSW9PcGVyYXRpb25NYXhpbXVtCit9IEVGSV9QQ0lfSU9fUFJPVE9DT0xfT1BFUkFUSU9OOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX01BUCkgKAorICBJTiBzdHJ1Y3QgX0VGSV9QQ0lfSU8gICAgKlRoaXMsCisgIElOIEVGSV9QQ0lfSU9fUFJPVE9DT0xfT1BFUkFUSU9OIE9wZXJhdGlvbiwKKyAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgKkhvc3RBZGRyZXNzLAorICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAqTnVtYmVyT2ZCeXRlcywKKyAgT1VUIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgKkRldmljZUFkZHJlc3MsCisgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICoqTWFwcGluZworICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX1VOTUFQKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgKk1hcHBpbmcKKyk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfQUxMT0NBVEVfQlVGRkVSKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gRUZJX0FMTE9DQVRFX1RZUEUgICAgICAgICAgVHlwZSwKKyAgSU4gRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgTWVtb3J5VHlwZSwKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgUGFnZXMsCisgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICoqSG9zdEFkZHJlc3MsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMKKyAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9GUkVFX0JVRkZFUikgKAorICBJTiBzdHJ1Y3QgX0VGSV9QQ0lfSU8gKlRoaXMsCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgIFBhZ2VzLAorICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAqSG9zdEFkZHJlc3MKKyAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9GTFVTSCkgKAorICBJTiBzdHJ1Y3QgX0VGSV9QQ0lfSU8gKlRoaXMKKyAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9HRVRfTE9DQVRJT04pICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAqU2VnbWVudE51bWJlciwKKyAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgKkJ1c051bWJlciwKKyAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgKkRldmljZU51bWJlciwKKyAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgKkZ1bmN0aW9uTnVtYmVyCisgICk7CisKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSVNBX0lPICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX1ZHQV9QQUxFVFRFX0lPICAgICAgIDB4MDAwNAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfTUVNT1JZICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX0lPICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0lERV9QUklNQVJZX0lPICAgICAgIDB4MDAyMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9JREVfU0VDT05EQVJZX0lPICAgICAweDAwNDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfTUVNT1JZX1dSSVRFX0NPTUJJTkUgMHgwMDgwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0lPICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUlkgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfQlVTX01BU1RFUiAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX01FTU9SWV9DQUNIRUQgICAgICAgIDB4MDgwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUllfRElTQUJMRSAgICAgICAweDEwMDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfRU1CRURERURfREVWSUNFICAgICAgMHgyMDAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0VNQkVEREVEX1JPTSAgICAgICAgIDB4NDAwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9EVUFMX0FERFJFU1NfQ1lDTEUgICAweDgwMDAKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSVNBX0lPXzE2ICAgICAgICAgICAgMHgxMDAwMAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfUEFMRVRURV9JT18xNiAgICAweDIwMDAwCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX1ZHQV9JT18xNiAgICAgICAgICAgIDB4NDAwMDAKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvbkdldCwKKyAgICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvblNldCwKKyAgICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvbkVuYWJsZSwKKyAgICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvbkRpc2FibGUsCisgICAgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25TdXBwb3J0ZWQsCisgICAgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25NYXhpbXVtCit9IEVGSV9QQ0lfSU9fUFJPVE9DT0xfQVRUUklCVVRFX09QRVJBVElPTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9BVFRSSUJVVEVTKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAgICAgICAgICAgICAqVGhpcywKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTF9BVFRSSUJVVEVfT1BFUkFUSU9OIE9wZXJhdGlvbiwKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMsCisgIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUmVzdWx0IE9QVElPTkFMCisgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfR0VUX0JBUl9BVFRSSUJVVEVTKSAoCisgIElOIHN0cnVjdCBfRUZJX1BDSV9JTyAqVGhpcywKKyAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgQmFySW5kZXgsCisgIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICpTdXBwb3J0cyBPUFRJT05BTCwKKyAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgKipSZXNvdXJjZXMgT1BUSU9OQUwKKyAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9TRVRfQkFSX0FUVFJJQlVURVMpICgKKyAgSU4gc3RydWN0IF9FRklfUENJX0lPICpUaGlzLAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzLAorICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICBCYXJJbmRleCwKKyAgSU4gT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgKk9mZnNldCwKKyAgSU4gT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgKkxlbmd0aAorICApOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1BDSV9JTyB7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfUE9MTF9JT19NRU0gICAgICAgIFBvbGxNZW07CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfUE9MTF9JT19NRU0gICAgICAgIFBvbGxJbzsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9BQ0NFU1MgICAgICAgICAgICAgTWVtOworICBFRklfUENJX0lPX1BST1RPQ09MX0FDQ0VTUyAgICAgICAgICAgICBJbzsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUdfQUNDRVNTICAgICAgUGNpOworICBFRklfUENJX0lPX1BST1RPQ09MX0NPUFlfTUVNICAgICAgICAgICBDb3B5TWVtOworICBFRklfUENJX0lPX1BST1RPQ09MX01BUCAgICAgICAgICAgICAgICBNYXA7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfVU5NQVAgICAgICAgICAgICAgIFVubWFwOworICBFRklfUENJX0lPX1BST1RPQ09MX0FMTE9DQVRFX0JVRkZFUiAgICBBbGxvY2F0ZUJ1ZmZlcjsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9GUkVFX0JVRkZFUiAgICAgICAgRnJlZUJ1ZmZlcjsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9GTFVTSCAgICAgICAgICAgICAgRmx1c2g7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfR0VUX0xPQ0FUSU9OICAgICAgIEdldExvY2F0aW9uOworICBFRklfUENJX0lPX1BST1RPQ09MX0FUVFJJQlVURVMgICAgICAgICBBdHRyaWJ1dGVzOworICBFRklfUENJX0lPX1BST1RPQ09MX0dFVF9CQVJfQVRUUklCVVRFUyBHZXRCYXJBdHRyaWJ1dGVzOworICBFRklfUENJX0lPX1BST1RPQ09MX1NFVF9CQVJfQVRUUklCVVRFUyBTZXRCYXJBdHRyaWJ1dGVzOworICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb21TaXplOworICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUm9tSW1hZ2U7Cit9IEVGSV9QQ0lfSU87CisKKyNlbmRpZiAvKiBfRUZJX1BDSV9JT19IICovCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlwcm90LmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlwcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3NmVjNQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXByb3QuaApAQCAtMCwwICsxLDc1NyBAQAorI2lmbmRlZiBfRUZJX1BST1RfSAorI2RlZmluZSBfRUZJX1BST1RfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlwcm90LmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgUHJvdG9jb2xzCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vICBGUFNXQSBsaWJyYXJ5IHByb3RvY29sCisvLworI2RlZmluZSBGUFNXQV9QUk9UT0NPTCAgICAgICAgICBcCisgICAgeyAweGM0MWI2NTMxLCAweDk3YjksIDB4MTFkMywgezB4OWEsIDB4MjksIDB4MCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZH0gfQorCisvLworLy8gRGV2aWNlIFBhdGggcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgXAorICAgIHsgMHg5NTc2ZTkxLCAweDZkM2YsIDB4MTFkMiwgezB4OGUsIDB4MzksIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCisKKy8vCisvLyBCbG9jayBJTyBwcm90b2NvbAorLy8KKworI2RlZmluZSBCTE9DS19JT19QUk9UT0NPTCBcCisgICAgeyAweDk2NGU1YjIxLCAweDY0NTksIDB4MTFkMiwgezB4OGUsIDB4MzksIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorI2RlZmluZSBFRklfQkxPQ0tfSU9fSU5URVJGQUNFX1JFVklTSU9OICAgMHgwMDAxMDAwMAorI2RlZmluZSBFRklfQkxPQ0tfSU9fSU5URVJGQUNFX1JFVklTSU9OMiAgMHgwMDAyMDAwMQorI2RlZmluZSBFRklfQkxPQ0tfSU9fSU5URVJGQUNFX1JFVklTSU9OMyAgKCgyPDwxNikgfCAzMSkKKworSU5URVJGQUNFX0RFQ0woX0VGSV9CTE9DS19JTyk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9CTE9DS19SRVNFVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0JMT0NLX0lPICAgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRWZXJpZmljYXRpb24KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQkxPQ0tfUkVBRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0JMT0NLX0lPICAgICAqVGhpcywKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgTWVkaWFJZCwKKyAgICBJTiBFRklfTEJBICAgICAgICAgICAgICAgICAgTEJBLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQkxPQ0tfV1JJVEUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9CTE9DS19JTyAgICAgKlRoaXMsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgIE1lZGlhSWQsCisgICAgSU4gRUZJX0xCQSAgICAgICAgICAgICAgICAgIExCQSwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0JMT0NLX0ZMVVNIKSAoCisgICAgSU4gc3RydWN0IF9FRklfQkxPQ0tfSU8gICAgICpUaGlzCisgICAgKTsKKworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIE1lZGlhSWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICBSZW1vdmFibGVNZWRpYTsKKyAgICBCT09MRUFOICAgICAgICAgICAgIE1lZGlhUHJlc2VudDsKKworICAgIEJPT0xFQU4gICAgICAgICAgICAgTG9naWNhbFBhcnRpdGlvbjsKKyAgICBCT09MRUFOICAgICAgICAgICAgIFJlYWRPbmx5OworICAgIEJPT0xFQU4gICAgICAgICAgICAgV3JpdGVDYWNoaW5nOworCisgICAgVUlOVDMyICAgICAgICAgICAgICBCbG9ja1NpemU7CisgICAgVUlOVDMyICAgICAgICAgICAgICBJb0FsaWduOworCisgICAgRUZJX0xCQSAgICAgICAgICAgICBMYXN0QmxvY2s7CisKKyAgICAvKiByZXZpc2lvbiAyICovCisgICAgRUZJX0xCQSAgICAgICAgICAgICBMb3dlc3RBbGlnbmVkTGJhOworICAgIFVJTlQzMiAgICAgICAgICAgICAgTG9naWNhbEJsb2Nrc1BlclBoeXNpY2FsQmxvY2s7CisgICAgLyogcmV2aXNpb24gMyAqLworICAgIFVJTlQzMiAgICAgICAgICAgICAgT3B0aW1hbFRyYW5zZmVyTGVuZ3RoR3JhbnVsYXJpdHk7Cit9IEVGSV9CTE9DS19JT19NRURJQTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9CTE9DS19JTyB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgUmV2aXNpb247CisKKyAgICBFRklfQkxPQ0tfSU9fTUVESUEgICAgICAqTWVkaWE7CisKKyAgICBFRklfQkxPQ0tfUkVTRVQgICAgICAgICBSZXNldDsKKyAgICBFRklfQkxPQ0tfUkVBRCAgICAgICAgICBSZWFkQmxvY2tzOworICAgIEVGSV9CTE9DS19XUklURSAgICAgICAgIFdyaXRlQmxvY2tzOworICAgIEVGSV9CTE9DS19GTFVTSCAgICAgICAgIEZsdXNoQmxvY2tzOworCit9IEVGSV9CTE9DS19JTzsKKworCisKKy8vCisvLyBEaXNrIEJsb2NrIElPIHByb3RvY29sCisvLworCisjZGVmaW5lIERJU0tfSU9fUFJPVE9DT0wgXAorICAgIHsgMHhjZTM0NTE3MSwgMHhiYTBiLCAweDExZDIsICB7MHg4ZSwgMHg0ZiwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisjZGVmaW5lIEVGSV9ESVNLX0lPX0lOVEVSRkFDRV9SRVZJU0lPTiAgIDB4MDAwMTAwMDAKKworSU5URVJGQUNFX0RFQ0woX0VGSV9ESVNLX0lPKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RJU0tfUkVBRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0RJU0tfSU8gICAgICAqVGhpcywKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgTWVkaWFJZCwKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgT2Zmc2V0LAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRElTS19XUklURSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0RJU0tfSU8gICAgICAqVGhpcywKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgTWVkaWFJZCwKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgT2Zmc2V0LAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0RJU0tfSU8geworICAgIFVJTlQ2NCAgICAgICAgICAgICAgUmV2aXNpb247CisgICAgRUZJX0RJU0tfUkVBRCAgICAgICBSZWFkRGlzazsKKyAgICBFRklfRElTS19XUklURSAgICAgIFdyaXRlRGlzazsKK30gRUZJX0RJU0tfSU87CisKKworLy8KKy8vIFNpbXBsZSBmaWxlIHN5c3RlbSBwcm90b2NvbAorLy8KKworI2RlZmluZSBTSU1QTEVfRklMRV9TWVNURU1fUFJPVE9DT0wgXAorICAgIHsgMHg5NjRlNWIyMiwgMHg2NDU5LCAweDExZDIsIHsweDhlLCAweDM5LCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworSU5URVJGQUNFX0RFQ0woX0VGSV9GSUxFX0lPX0lOVEVSRkFDRSk7CitJTlRFUkZBQ0VfREVDTChfRUZJX0ZJTEVfSEFORExFKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1ZPTFVNRV9PUEVOKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9JT19JTlRFUkZBQ0UgICAgKlRoaXMsCisgICAgT1VUIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAgICAgICAgKipSb290CisgICAgKTsKKworI2RlZmluZSBFRklfRklMRV9JT19JTlRFUkZBQ0VfUkVWSVNJT04gICAweDAwMDEwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9FRklfRklMRV9JT19JTlRFUkZBQ0UgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIEVGSV9WT0xVTUVfT1BFTiAgICAgICAgIE9wZW5Wb2x1bWU7Cit9IEVGSV9GSUxFX0lPX0lOVEVSRkFDRTsKKworLy8KKy8vCisvLworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9PUEVOKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlLAorICAgIE9VVCBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSAqKk5ld0hhbmRsZSwKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgKkZpbGVOYW1lLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICBPcGVuTW9kZSwKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcworICAgICk7CisKKy8vIE9wZW4gbW9kZXMKKyNkZWZpbmUgRUZJX0ZJTEVfTU9ERV9SRUFEICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCisjZGVmaW5lIEVGSV9GSUxFX01PREVfV1JJVEUgICAgIDB4MDAwMDAwMDAwMDAwMDAwMgorI2RlZmluZSBFRklfRklMRV9NT0RFX0NSRUFURSAgICAweDgwMDAwMDAwMDAwMDAwMDAKKworLy8gRmlsZSBhdHRyaWJ1dGVzCisjZGVmaW5lIEVGSV9GSUxFX1JFQURfT05MWSAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMQorI2RlZmluZSBFRklfRklMRV9ISURERU4gICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDIKKyNkZWZpbmUgRUZJX0ZJTEVfU1lTVEVNICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDA0CisjZGVmaW5lIEVGSV9GSUxFX1JFU0VSVklFRCAgICAgIDB4MDAwMDAwMDAwMDAwMDAwOAorI2RlZmluZSBFRklfRklMRV9ESVJFQ1RPUlkgICAgICAweDAwMDAwMDAwMDAwMDAwMTAKKyNkZWZpbmUgRUZJX0ZJTEVfQVJDSElWRSAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDIwCisjZGVmaW5lIEVGSV9GSUxFX1ZBTElEX0FUVFIgICAgIDB4MDAwMDAwMDAwMDAwMDAzNworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9DTE9TRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GSUxFX0RFTEVURSkgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GSUxFX1JFQUQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSAgKkZpbGUsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfV1JJVEUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSAgKkZpbGUsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfU0VUX1BPU0lUSU9OKSAoCisgICAgSU4gc3RydWN0IF9FRklfRklMRV9IQU5ETEUgICpGaWxlLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICBQb3NpdGlvbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GSUxFX0dFVF9QT1NJVElPTikgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZSwKKyAgICBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgKlBvc2l0aW9uCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfR0VUX0lORk8pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSAgKkZpbGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpJbmZvcm1hdGlvblR5cGUsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZJTEVfU0VUX0lORk8pICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9GSUxFX0hBTkRMRSAgKkZpbGUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpJbmZvcm1hdGlvblR5cGUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRklMRV9GTFVTSCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0ZJTEVfSEFORExFICAqRmlsZQorICAgICk7CisKKworCisjZGVmaW5lIEVGSV9GSUxFX0hBTkRMRV9SRVZJU0lPTiAgICAgICAgIDB4MDAwMTAwMDAKK3R5cGVkZWYgc3RydWN0IF9FRklfRklMRV9IQU5ETEUgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIFJldmlzaW9uOworICAgIEVGSV9GSUxFX09QRU4gICAgICAgICAgIE9wZW47CisgICAgRUZJX0ZJTEVfQ0xPU0UgICAgICAgICAgQ2xvc2U7CisgICAgRUZJX0ZJTEVfREVMRVRFICAgICAgICAgRGVsZXRlOworICAgIEVGSV9GSUxFX1JFQUQgICAgICAgICAgIFJlYWQ7CisgICAgRUZJX0ZJTEVfV1JJVEUgICAgICAgICAgV3JpdGU7CisgICAgRUZJX0ZJTEVfR0VUX1BPU0lUSU9OICAgR2V0UG9zaXRpb247CisgICAgRUZJX0ZJTEVfU0VUX1BPU0lUSU9OICAgU2V0UG9zaXRpb247CisgICAgRUZJX0ZJTEVfR0VUX0lORk8gICAgICAgR2V0SW5mbzsKKyAgICBFRklfRklMRV9TRVRfSU5GTyAgICAgICBTZXRJbmZvOworICAgIEVGSV9GSUxFX0ZMVVNIICAgICAgICAgIEZsdXNoOworfSBFRklfRklMRSwgKkVGSV9GSUxFX0hBTkRMRTsKKworCisvLworLy8gRmlsZSBpbmZvcm1hdGlvbiB0eXBlcworLy8KKworI2RlZmluZSBFRklfRklMRV9JTkZPX0lEICAgXAorICAgIHsgMHg5NTc2ZTkyLCAweDZkM2YsIDB4MTFkMiwgezB4OGUsIDB4MzksIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgU2l6ZTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBGaWxlU2l6ZTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBQaHlzaWNhbFNpemU7CisgICAgRUZJX1RJTUUgICAgICAgICAgICAgICAgQ3JlYXRlVGltZTsKKyAgICBFRklfVElNRSAgICAgICAgICAgICAgICBMYXN0QWNjZXNzVGltZTsKKyAgICBFRklfVElNRSAgICAgICAgICAgICAgICBNb2RpZmljYXRpb25UaW1lOworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTsKKyAgICBDSEFSMTYgICAgICAgICAgICAgICAgICBGaWxlTmFtZVsxXTsKK30gRUZJX0ZJTEVfSU5GTzsKKworLy8KKy8vIFRoZSBGaWxlTmFtZSBmaWVsZCBvZiB0aGUgRUZJX0ZJTEVfSU5GTyBkYXRhIHN0cnVjdHVyZSBpcyB2YXJpYWJsZSBsZW5ndGguCisvLyBXaGVuZXZlciBjb2RlIG5lZWRzIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIEVGSV9GSUxFX0lORk8gZGF0YSBzdHJ1Y3R1cmUsIGl0IG5lZWRzIHRvCisvLyBiZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgd2l0aG91dCB0aGUgRmlsZU5hbWUgZmllbGQuICBUaGUgZm9sbG93aW5nIG1hY3JvIAorLy8gY29tcHV0ZXMgdGhpcyBzaXplIGNvcnJlY3RseSBubyBtYXR0ZXIgaG93IGJpZyB0aGUgRmlsZU5hbWUgYXJyYXkgaXMgZGVjbGFyZWQuCisvLyBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgdGhlIEVGSV9GSUxFX0lORk8gZGF0YSBzdHJ1Y3R1cmUgQU5TSSBjb21waWxhbnQuIAorLy8KKworI2RlZmluZSBTSVpFX09GX0VGSV9GSUxFX0lORk8gRUZJX0ZJRUxEX09GRlNFVChFRklfRklMRV9JTkZPLEZpbGVOYW1lKQorCisjZGVmaW5lIEVGSV9GSUxFX1NZU1RFTV9JTkZPX0lEICAgIFwKKyAgICB7IDB4OTU3NmU5MywgMHg2ZDNmLCAweDExZDIsIHsweDhlLCAweDM5LCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgIFNpemU7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgUmVhZE9ubHk7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgVm9sdW1lU2l6ZTsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICBGcmVlU3BhY2U7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgQmxvY2tTaXplOworICAgIENIQVIxNiAgICAgICAgICAgICAgICAgIFZvbHVtZUxhYmVsWzFdOworfSBFRklfRklMRV9TWVNURU1fSU5GTzsKKworLy8KKy8vIFRoZSBWb2x1bWVMYWJlbCBmaWVsZCBvZiB0aGUgRUZJX0ZJTEVfU1lTVEVNX0lORk8gZGF0YSBzdHJ1Y3R1cmUgaXMgdmFyaWFibGUgbGVuZ3RoLgorLy8gV2hlbmV2ZXIgY29kZSBuZWVkcyB0byBrbm93IHRoZSBzaXplIG9mIHRoZSBFRklfRklMRV9TWVNURU1fSU5GTyBkYXRhIHN0cnVjdHVyZSwgaXQgbmVlZHMKKy8vIHRvIGJlIHRoZSBzaXplIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSB3aXRob3V0IHRoZSBWb2x1bWVMYWJsZSBmaWVsZC4gIFRoZSBmb2xsb3dpbmcgbWFjcm8gCisvLyBjb21wdXRlcyB0aGlzIHNpemUgY29ycmVjdGx5IG5vIG1hdHRlciBob3cgYmlnIHRoZSBWb2x1bWVMYWJsZSBhcnJheSBpcyBkZWNsYXJlZC4KKy8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSB0aGUgRUZJX0ZJTEVfU1lTVEVNX0lORk8gZGF0YSBzdHJ1Y3R1cmUgQU5TSSBjb21waWxhbnQuIAorLy8KKworI2RlZmluZSBTSVpFX09GX0VGSV9GSUxFX1NZU1RFTV9JTkZPIEVGSV9GSUVMRF9PRkZTRVQoRUZJX0ZJTEVfU1lTVEVNX0lORk8sVm9sdW1lTGFiZWwpCisKKyNkZWZpbmUgRUZJX0ZJTEVfU1lTVEVNX1ZPTFVNRV9MQUJFTF9JTkZPX0lEICAgIFwKKyAgICB7IDB4REI0N0Q3RDMsMHhGRTgxLCAweDExZDMsIHsweDlBLCAweDM1LCAweDAwLCAweDkwLCAweDI3LCAweDNGLCAweEMxLCAweDREfSB9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDSEFSMTYgICAgICAgICAgICAgICAgICBWb2x1bWVMYWJlbFsxXTsKK30gRUZJX0ZJTEVfU1lTVEVNX1ZPTFVNRV9MQUJFTF9JTkZPOworCisjZGVmaW5lIFNJWkVfT0ZfRUZJX0ZJTEVfU1lTVEVNX1ZPTFVNRV9MQUJFTF9JTkZPIEVGSV9GSUVMRF9PRkZTRVQoRUZJX0ZJTEVfU1lTVEVNX1ZPTFVNRV9MQUJFTF9JTkZPLFZvbHVtZUxhYmVsKQorCisvLworLy8gTG9hZCBmaWxlIHByb3RvY29sCisvLworCisKKyNkZWZpbmUgTE9BRF9GSUxFX1BST1RPQ09MIFwKKyAgICB7IDB4NTZFQzMwOTEsIDB4OTU0QywgMHgxMWQyLCB7MHg4RSwgMHgzRiwgMHgwMCwgMHhBMCwgMHhDOSwgMHg2OSwgMHg3MiwgMHgzQn0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX0xPQURfRklMRV9JTlRFUkZBQ0UpOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfTE9BRF9GSUxFKSAoCisgICAgSU4gc3RydWN0IF9FRklfTE9BRF9GSUxFX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgKkZpbGVQYXRoLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RQb2xpY3ksCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlciBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfTE9BRF9GSUxFX0lOVEVSRkFDRSB7CisgICAgRUZJX0xPQURfRklMRSAgICAgICAgICAgICAgICAgICAgICAgTG9hZEZpbGU7Cit9IEVGSV9MT0FEX0ZJTEVfSU5URVJGQUNFOworCisKKy8vCisvLyBEZXZpY2UgSU8gcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgREVWSUNFX0lPX1BST1RPQ09MIFwKKyAgICB7IDB4YWY2YWMzMTEsIDB4ODRjMywgMHgxMWQyLCB7MHg4ZSwgMHgzYywgMHgwMCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCitJTlRFUkZBQ0VfREVDTChfRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UpOworCit0eXBlZGVmIGVudW0geworICAgIElPX1VJTlQ4LAorICAgIElPX1VJTlQxNiwKKyAgICBJT19VSU5UMzIsCisgICAgSU9fVUlOVDY0LAorLy8KKy8vIFNwZWNpZmljYXRpb24gQ2hhbmdlOiBDb3B5IGZyb20gTU1JTyB0byBNTUlPIHZzLiBNTUlPIHRvIGJ1ZmZlciwgYnVmZmVyIHRvIE1NSU8KKy8vCisgICAgTU1JT19DT1BZX1VJTlQ4LAorICAgIE1NSU9fQ09QWV9VSU5UMTYsCisgICAgTU1JT19DT1BZX1VJTlQzMiwKKyAgICBNTUlPX0NPUFlfVUlOVDY0Cit9IEVGSV9JT19XSURUSDsKKworI2RlZmluZSBFRklfUENJX0FERFJFU1MoX2J1cyxfZGV2LF9mdW5jKSBcCisgICAgKCAoVUlOVDY0KSAoICgoKFVJTlROKV9idXMpIDw8IDI0KSArICgoKFVJTlROKV9kZXYpIDw8IDE2KSArICgoKFVJTlROKV9mdW5jKSA8PCA4KSApICkKKworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfREVWSUNFX0lPKSAoCisgICAgSU4gc3RydWN0IF9FRklfREVWSUNFX0lPX0lOVEVSRkFDRSAqVGhpcywKKyAgICBJTiBFRklfSU9fV0lEVEggICAgICAgICAgICAgICAgIFdpZHRoLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50LAorICAgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfREVWSUNFX0lPICAgICAgICAgICAgICAgICAgIFJlYWQ7CisgICAgRUZJX0RFVklDRV9JTyAgICAgICAgICAgICAgICAgICBXcml0ZTsKK30gRUZJX0lPX0FDQ0VTUzsKKwordHlwZWRlZiAKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfREVWSUNFX1BBVEgpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzLAorICAgIElOIE9VVCBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICoqUGNpRGV2aWNlUGF0aAorICAgICk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRWZpQnVzTWFzdGVyUmVhZCwKKyAgICBFZmlCdXNNYXN0ZXJXcml0ZSwKKyAgICBFZmlCdXNNYXN0ZXJDb21tb25CdWZmZXIKK30gRUZJX0lPX09QRVJBVElPTl9UWVBFOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU9fTUFQKSAoCisgICAgSU4gc3RydWN0IF9FRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gRUZJX0lPX09QRVJBVElPTl9UWVBFICAgICAgICAgICAgT3BlcmF0aW9uLAorICAgIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgICpIb3N0QWRkcmVzcywKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAqTnVtYmVyT2ZCeXRlcywKKyAgICBPVVQgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICAqRGV2aWNlQWRkcmVzcywKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKk1hcHBpbmcKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU9fVU5NQVApICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTWFwcGluZworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JT19BTExPQ0FURV9CVUZGRVIpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBFRklfQUxMT0NBVEVfVFlQRSAgICAgICAgICAgICAgICBUeXBlLAorICAgIElOIEVGSV9NRU1PUllfVFlQRSAgICAgICAgICAgICAgICAgIE1lbW9yeVR5cGUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZXMsCisgICAgSU4gT1VUIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgKkhvc3RBZGRyZXNzCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lPX0ZMVVNIKSAoCisgICAgSU4gc3RydWN0IF9FRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgKlRoaXMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU9fRlJFRV9CVUZGRVIpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlcywKKyAgICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgICBIb3N0QWRkcmVzcworICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfREVWSUNFX0lPX0lOVEVSRkFDRSB7CisgICAgRUZJX0lPX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgTWVtOworICAgIEVGSV9JT19BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgIElvOworICAgIEVGSV9JT19BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgIFBjaTsKKyAgICBFRklfSU9fTUFQICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA7CisgICAgRUZJX1BDSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgUGNpRGV2aWNlUGF0aDsKKyAgICBFRklfSU9fVU5NQVAgICAgICAgICAgICAgICAgICAgICAgICBVbm1hcDsKKyAgICBFRklfSU9fQUxMT0NBVEVfQlVGRkVSICAgICAgICAgICAgICBBbGxvY2F0ZUJ1ZmZlcjsKKyAgICBFRklfSU9fRkxVU0ggICAgICAgICAgICAgICAgICAgICAgICBGbHVzaDsKKyAgICBFRklfSU9fRlJFRV9CVUZGRVIgICAgICAgICAgICAgICAgICBGcmVlQnVmZmVyOworfSBFRklfREVWSUNFX0lPX0lOVEVSRkFDRTsKKworCisvLworLy8gVW5pY29kZSBDb2xsYXRpb24gcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgVU5JQ09ERV9DT0xMQVRJT05fUFJPVE9DT0wgXAorICAgIHsgMHgxZDg1Y2Q3ZiwgMHhmNDNkLCAweDExZDIsIHsweDlhLCAweGMsICAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworI2RlZmluZSBVTklDT0RFX0JZVEVfT1JERVJfTUFSSyAgICAgICAoQ0hBUjE2KSgweGZlZmYpCisKK0lOVEVSRkFDRV9ERUNMKF9FRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFKTsKKwordHlwZWRlZgorSU5UTgorKEVGSUFQSSAqRUZJX1VOSUNPREVfU1RSSUNPTEwpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAqczEsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICpzMgorICAgICk7CisKK3R5cGVkZWYKK0JPT0xFQU4KKyhFRklBUEkgKkVGSV9VTklDT0RFX01FVEFJTUFUQ0gpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAqUGF0dGVybgorICAgICk7CisKK3R5cGVkZWYKK1ZPSUQKKyhFRklBUEkgKkVGSV9VTklDT0RFX1NUUkxXUikgKAorICAgIElOIHN0cnVjdCBfRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gT1VUIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKlN0cgorICAgICk7CisKK3R5cGVkZWYKK1ZPSUQKKyhFRklBUEkgKkVGSV9VTklDT0RFX1NUUlVQUikgKAorICAgIElOIHN0cnVjdCBfRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gT1VUIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKlN0cgorICAgICk7CisKK3R5cGVkZWYKK1ZPSUQKKyhFRklBUEkgKkVGSV9VTklDT0RFX0ZBVFRPU1RSKSAoCisgICAgSU4gc3RydWN0IF9FRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXRTaXplLAorICAgIElOIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICpGYXQsCisgICAgT1VUIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKlN0cmluZworICAgICk7CisKK3R5cGVkZWYKK0JPT0xFQU4KKyhFRklBUEkgKkVGSV9VTklDT0RFX1NUUlRPRkFUKSAoCisgICAgSU4gc3RydWN0IF9FRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdFNpemUsCisgICAgT1VUIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgKkZhdAorICAgICk7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgeworCisgICAgLy8gZ2VuZXJhbAorICAgIEVGSV9VTklDT0RFX1NUUklDT0xMICAgICAgICAgICAgICAgIFN0cmlDb2xsOworICAgIEVGSV9VTklDT0RFX01FVEFJTUFUQ0ggICAgICAgICAgICAgIE1ldGFpTWF0Y2g7CisgICAgRUZJX1VOSUNPREVfU1RSTFdSICAgICAgICAgICAgICAgICAgU3RyTHdyOworICAgIEVGSV9VTklDT0RFX1NUUlVQUiAgICAgICAgICAgICAgICAgIFN0clVwcjsKKworICAgIC8vIGZvciBzdXBwb3J0aW5nIGZhdCB2b2x1bWVzCisgICAgRUZJX1VOSUNPREVfRkFUVE9TVFIgICAgICAgICAgICAgICAgRmF0VG9TdHI7CisgICAgRUZJX1VOSUNPREVfU1RSVE9GQVQgICAgICAgICAgICAgICAgU3RyVG9GYXQ7CisKKyAgICBDSEFSOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3VwcG9ydGVkTGFuZ3VhZ2VzOworfSBFRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFOworCisvKiBHcmFwaGljcyBvdXRwdXQgcHJvdG9jb2wgKi8KKyNkZWZpbmUgRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTF9HVUlEIFwKKyAgeyBcCisgICAgMHg5MDQyYTlkZSwgMHgyM2RjLCAweDRhMzgsIHsweDk2LCAweGZiLCAweDdhLCAweGRlLCAweGQwLCAweDgwLCAweDUxLCAweDZhIH0gXAorICB9CisKK3R5cGVkZWYgc3RydWN0IF9FRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0w7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICAgICAgICAgICAgUmVkTWFzazsKKyAgVUlOVDMyICAgICAgICAgICAgR3JlZW5NYXNrOworICBVSU5UMzIgICAgICAgICAgICBCbHVlTWFzazsKKyAgVUlOVDMyICAgICAgICAgICAgUmVzZXJ2ZWRNYXNrOworfSBFRklfUElYRUxfQklUTUFTSzsKKwordHlwZWRlZiBlbnVtIHsKKyAgUGl4ZWxSZWRHcmVlbkJsdWVSZXNlcnZlZDhCaXRQZXJDb2xvciwKKyAgUGl4ZWxCbHVlR3JlZW5SZWRSZXNlcnZlZDhCaXRQZXJDb2xvciwKKyAgUGl4ZWxCaXRNYXNrLAorICBQaXhlbEJsdE9ubHksCisgIFBpeGVsRm9ybWF0TWF4Cit9IEVGSV9HUkFQSElDU19QSVhFTF9GT1JNQVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgSG9yaXpvbnRhbFJlc29sdXRpb247CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgIFZlcnRpY2FsUmVzb2x1dGlvbjsKKyAgRUZJX0dSQVBISUNTX1BJWEVMX0ZPUk1BVCAgUGl4ZWxGb3JtYXQ7CisgIEVGSV9QSVhFTF9CSVRNQVNLICAgICAgICAgIFBpeGVsSW5mb3JtYXRpb247CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgIFBpeGVsc1BlclNjYW5MaW5lOworfSBFRklfR1JBUEhJQ1NfT1VUUFVUX01PREVfSU5GT1JNQVRJT047CisKKy8qKgorICBSZXR1cm4gdGhlIGN1cnJlbnQgdmlkZW8gbW9kZSBpbmZvcm1hdGlvbi4KKworICBAcGFyYW0gIFRoaXMgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBNb2RlTnVtYmVyIFRoZSBtb2RlIG51bWJlciB0byByZXR1cm4gaW5mb3JtYXRpb24gb24uCisgIEBwYXJhbSAgU2l6ZU9mSW5mbyBBIHBvaW50ZXIgdG8gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgSW5mbyBidWZmZXIuCisgIEBwYXJhbSAgSW5mbyAgICAgICBBIHBvaW50ZXIgdG8gY2FsbGVlIGFsbG9jYXRlZCBidWZmZXIgdGhhdCByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IE1vZGVOdW1iZXIuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgTW9kZSBpbmZvcm1hdGlvbiByZXR1cm5lZC4KKyAgQHJldHZhbCBFRklfQlVGRkVSX1RPT19TTUFMTCAgVGhlIEluZm8gYnVmZmVyIHdhcyB0b28gc21hbGwuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIEEgaGFyZHdhcmUgZXJyb3Igb2NjdXJyZWQgdHJ5aW5nIHRvIHJldHJpZXZlIHRoZSB2aWRlbyBtb2RlLgorICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBWaWRlbyBkaXNwbGF5IGlzIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBTZXRNb2RlICgpCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvZiB0aGUgaW5wdXQgYXJncyB3YXMgTlVMTC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX1FVRVJZX01PREUpICgKKyAgSU4gIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0wgICAgICAgICAgKlRoaXMsCisgIElOICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVOdW1iZXIsCisgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTaXplT2ZJbmZvLAorICBPVVQgRUZJX0dSQVBISUNTX09VVFBVVF9NT0RFX0lORk9STUFUSU9OICAqKkluZm8KKyAgKQorOworCisvKioKKyAgUmV0dXJuIHRoZSBjdXJyZW50IHZpZGVvIG1vZGUgaW5mb3JtYXRpb24uCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIE1vZGVOdW1iZXIgICAgICAgIFRoZSBtb2RlIG51bWJlciB0byBiZSBzZXQuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICBHcmFwaGljcyBtb2RlIHdhcyBjaGFuZ2VkLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgIFRoZSBkZXZpY2UgaGFkIGFuIGVycm9yIGFuZCBjb3VsZCBub3QgY29tcGxldGUgdGhlIHJlcXVlc3QuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgTW9kZU51bWJlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0xfU0VUX01PREUpICgKKyAgSU4gIEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0wgKlRoaXMsCisgIElOICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIE1vZGVOdW1iZXIKKyAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UOCBCbHVlOworICBVSU5UOCBHcmVlbjsKKyAgVUlOVDggUmVkOworICBVSU5UOCBSZXNlcnZlZDsKK30gRUZJX0dSQVBISUNTX09VVFBVVF9CTFRfUElYRUw7CisKK3R5cGVkZWYgdW5pb24geworICBFRklfR1JBUEhJQ1NfT1VUUFVUX0JMVF9QSVhFTCBQaXhlbDsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgUmF3OworfSBFRklfR1JBUEhJQ1NfT1VUUFVUX0JMVF9QSVhFTF9VTklPTjsKKwordHlwZWRlZiBlbnVtIHsKKyAgRWZpQmx0VmlkZW9GaWxsLAorICBFZmlCbHRWaWRlb1RvQmx0QnVmZmVyLAorICBFZmlCbHRCdWZmZXJUb1ZpZGVvLCAKKyAgRWZpQmx0VmlkZW9Ub1ZpZGVvLAorICBFZmlHcmFwaGljc091dHB1dEJsdE9wZXJhdGlvbk1heAorfSBFRklfR1JBUEhJQ1NfT1VUUFVUX0JMVF9PUEVSQVRJT047CisKKy8qKgorICBUaGUgZm9sbG93aW5nIHRhYmxlIGRlZmluZXMgYWN0aW9ucyBmb3IgQmx0T3BlcmF0aW9uczoKKworICA8Qj5FZmlCbHRWaWRlb0ZpbGw8L0I+IC0gV3JpdGUgZGF0YSBmcm9tIHRoZSAgQmx0QnVmZmVyIHBpeGVsIChTb3VyY2VYLCBTb3VyY2VZKSAKKyAgZGlyZWN0bHkgdG8gZXZlcnkgcGl4ZWwgb2YgdGhlIHZpZGVvIGRpc3BsYXkgcmVjdGFuZ2xlIAorICAoRGVzdGluYXRpb25YLCBEZXN0aW5hdGlvblkpIChEZXN0aW5hdGlvblggKyBXaWR0aCwgRGVzdGluYXRpb25ZICsgSGVpZ2h0KS4gCisgIE9ubHkgb25lIHBpeGVsIHdpbGwgYmUgdXNlZCBmcm9tIHRoZSBCbHRCdWZmZXIuIERlbHRhIGlzIE5PVCB1c2VkLgorCisgIDxCPkVmaUJsdFZpZGVvVG9CbHRCdWZmZXI8L0I+IC0gUmVhZCBkYXRhIGZyb20gdGhlIHZpZGVvIGRpc3BsYXkgcmVjdGFuZ2xlIAorICAoU291cmNlWCwgU291cmNlWSkgKFNvdXJjZVggKyBXaWR0aCwgU291cmNlWSArIEhlaWdodCkgYW5kIHBsYWNlIGl0IGluIAorICB0aGUgQmx0QnVmZmVyIHJlY3RhbmdsZSAoRGVzdGluYXRpb25YLCBEZXN0aW5hdGlvblkgKSAKKyAgKERlc3RpbmF0aW9uWCArIFdpZHRoLCBEZXN0aW5hdGlvblkgKyBIZWlnaHQpLiBJZiBEZXN0aW5hdGlvblggb3IgCisgIERlc3RpbmF0aW9uWSBpcyBub3QgemVybyB0aGVuIERlbHRhIG11c3QgYmUgc2V0IHRvIHRoZSBsZW5ndGggaW4gYnl0ZXMgCisgIG9mIGEgcm93IGluIHRoZSBCbHRCdWZmZXIuCisKKyAgPEI+RWZpQmx0QnVmZmVyVG9WaWRlbzwvQj4gLSBXcml0ZSBkYXRhIGZyb20gdGhlICBCbHRCdWZmZXIgcmVjdGFuZ2xlIAorICAoU291cmNlWCwgU291cmNlWSkgKFNvdXJjZVggKyBXaWR0aCwgU291cmNlWSArIEhlaWdodCkgZGlyZWN0bHkgdG8gdGhlIAorICB2aWRlbyBkaXNwbGF5IHJlY3RhbmdsZSAoRGVzdGluYXRpb25YLCBEZXN0aW5hdGlvblkpIAorICAoRGVzdGluYXRpb25YICsgV2lkdGgsIERlc3RpbmF0aW9uWSArIEhlaWdodCkuIElmIFNvdXJjZVggb3IgU291cmNlWSBpcyAKKyAgbm90IHplcm8gdGhlbiBEZWx0YSBtdXN0IGJlIHNldCB0byB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIGEgcm93IGluIHRoZSAKKyAgQmx0QnVmZmVyLgorCisgIDxCPkVmaUJsdFZpZGVvVG9WaWRlbzwvQj4gLSBDb3B5IGZyb20gdGhlIHZpZGVvIGRpc3BsYXkgcmVjdGFuZ2xlIChTb3VyY2VYLCBTb3VyY2VZKQorICAoU291cmNlWCArIFdpZHRoLCBTb3VyY2VZICsgSGVpZ2h0KSAudG8gdGhlIHZpZGVvIGRpc3BsYXkgcmVjdGFuZ2xlIAorICAoRGVzdGluYXRpb25YLCBEZXN0aW5hdGlvblkpIChEZXN0aW5hdGlvblggKyBXaWR0aCwgRGVzdGluYXRpb25ZICsgSGVpZ2h0KS4gCisgIFRoZSBCbHRCdWZmZXIgYW5kIERlbHRhICBhcmUgbm90IHVzZWQgaW4gdGhpcyBtb2RlLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgQmx0QnVmZmVyICAgIEJ1ZmZlciBjb250YWluaW5nIGRhdGEgdG8gYmxpdCBpbnRvIHZpZGVvIGJ1ZmZlci4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaGFzIGEgc2l6ZSBvZiBXaWR0aCpIZWlnaHQqc2l6ZW9mKEVGSV9HUkFQSElDU19PVVRQVVRfQkxUX1BJWEVMKQorICBAcGFyYW0gIEJsdE9wZXJhdGlvbiBPcGVyYXRpb24gdG8gcGVyZm9ybSBvbiBCbGl0QnVmZmVyIGFuZCB2aWRlbyBtZW1vcnkKKyAgQHBhcmFtICBTb3VyY2VYICAgICAgWCBjb29yZGluYXRlIG9mIHNvdXJjZSBmb3IgdGhlIEJsdEJ1ZmZlci4KKyAgQHBhcmFtICBTb3VyY2VZICAgICAgWSBjb29yZGluYXRlIG9mIHNvdXJjZSBmb3IgdGhlIEJsdEJ1ZmZlci4KKyAgQHBhcmFtICBEZXN0aW5hdGlvblggWCBjb29yZGluYXRlIG9mIGRlc3RpbmF0aW9uIGZvciB0aGUgQmx0QnVmZmVyLgorICBAcGFyYW0gIERlc3RpbmF0aW9uWSBZIGNvb3JkaW5hdGUgb2YgZGVzdGluYXRpb24gZm9yIHRoZSBCbHRCdWZmZXIuCisgIEBwYXJhbSAgV2lkdGggICAgICAgIFdpZHRoIG9mIHJlY3RhbmdsZSBpbiBCbHRCdWZmZXIgaW4gcGl4ZWxzLgorICBAcGFyYW0gIEhlaWdodCAgICAgICBIaWdodCBvZiByZWN0YW5nbGUgaW4gQmx0QnVmZmVyIGluIHBpeGVscy4KKyAgQHBhcmFtICBEZWx0YSAgICAgICAgT1BUSU9OQUwKKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgQmx0IG9wZXJhdGlvbiBjb21wbGV0ZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEJsdE9wZXJhdGlvbiBpcyBub3QgdmFsaWQuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIEEgaGFyZHdhcmUgZXJyb3Igb2NjdXJlZCB3cml0dGluZyB0byB0aGUgdmlkZW8gYnVmZmVyLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0xfQkxUKSAoCisgIElOICBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MICAgICAgICAgICAgKlRoaXMsCisgIElOICBFRklfR1JBUEhJQ1NfT1VUUFVUX0JMVF9QSVhFTCAgICAgICAgICAgKkJsdEJ1ZmZlciwgICBPUFRJT05BTAorICBJTiAgRUZJX0dSQVBISUNTX09VVFBVVF9CTFRfT1BFUkFUSU9OICAgICAgIEJsdE9wZXJhdGlvbiwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VYLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVksCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb25YLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uWSwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWR0aCwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWlnaHQsCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsdGEgICAgICAgICBPUFRJT05BTAorICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heE1vZGU7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGU7CisgIEVGSV9HUkFQSElDU19PVVRQVVRfTU9ERV9JTkZPUk1BVElPTiAgICpJbmZvOworICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplT2ZJbmZvOworICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgICAgICAgICBGcmFtZUJ1ZmZlckJhc2U7CisgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lQnVmZmVyU2l6ZTsKK30gRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTF9NT0RFOworCitzdHJ1Y3QgX0VGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0wgeworICBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX1FVRVJZX01PREUgIFF1ZXJ5TW9kZTsKKyAgRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTF9TRVRfTU9ERSAgICBTZXRNb2RlOworICBFRklfR1JBUEhJQ1NfT1VUUFVUX1BST1RPQ09MX0JMVCAgICAgICAgIEJsdDsKKyAgRUZJX0dSQVBISUNTX09VVFBVVF9QUk9UT0NPTF9NT0RFICAgICAgICAqTW9kZTsKK307CisKK0lOVEVSRkFDRV9ERUNMKF9FRklfU0VSVklDRV9CSU5ESU5HKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUlZJQ0VfQklORElOR19DUkVBVEVfQ0hJTEQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9TRVJWSUNFX0JJTkRJTkcgKlRoaXMsCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICpDaGlsZEhhbmRsZQorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVJWSUNFX0JJTkRJTkdfREVTVFJPWV9DSElMRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1NFUlZJQ0VfQklORElORyAqVGhpcywKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgQ2hpbGRIYW5kbGUKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1NFUlZJQ0VfQklORElORyB7CisgICAgRUZJX1NFUlZJQ0VfQklORElOR19DUkVBVEVfQ0hJTEQgIENyZWF0ZUNoaWxkOworICAgIEVGSV9TRVJWSUNFX0JJTkRJTkdfREVTVFJPWV9DSElMRCBEZXN0cm95Q2hpbGQ7Cit9IEVGSV9TRVJWSUNFX0JJTkRJTkc7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlweGViYy5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpcHhlYmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzIzODJhCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpcHhlYmMuaApAQCAtMCwwICsxLDQ2NCBAQAorI2lmbmRlZiBfRUZJUFhFQkNfSAorI2RlZmluZSBfRUZJUFhFQkNfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlweGViYy5oCisKK0Fic3RyYWN0OgorCisgICAgRUZJIFBYRSBCYXNlIENvZGUgUHJvdG9jb2wKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisvLworLy8gUFhFIEJhc2UgQ29kZSBwcm90b2NvbAorLy8KKworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCBcCisgICAgeyAweDAzYzRlNjAzLCAweGFjMjgsIDB4MTFkMywgezB4OWEsIDB4MmQsIDB4MDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGR9IH0KKworSU5URVJGQUNFX0RFQ0woX0VGSV9QWEVfQkFTRV9DT0RFKTsKKworI2RlZmluZSBERUZBVUxUX1RUTCA0CisjZGVmaW5lIERFRkFVTFRfVG9TIDAKKy8vCisvLyBBZGRyZXNzIGRlZmluaXRpb25zCisvLworCit0eXBlZGVmIHVuaW9uIHsKKyAgICBVSU5UMzIgICAgICBBZGRyWzRdOworICAgIEVGSV9JUHY0X0FERFJFU1MgICAgdjQ7CisgICAgRUZJX0lQdjZfQUREUkVTUyAgICB2NjsKK30gRUZJX0lQX0FERFJFU1M7CisKK3R5cGVkZWYgVUlOVDE2IEVGSV9QWEVfQkFTRV9DT0RFX1VEUF9QT1JUOworCisvLworLy8gUGFja2V0IGRlZmluaXRpb25zCisvLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cE9wY29kZTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwSHdUeXBlOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBId0FkZHJMZW47CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cEdhdGVIb3BzOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBJZGVudDsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwU2Vjb25kczsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwRmxhZ3M7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cENpQWRkcls0XTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwWWlBZGRyWzRdOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdHBTaUFkZHJbNF07CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cEdpQWRkcls0XTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwSHdBZGRyWzE2XTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RwU3J2TmFtZVs2NF07CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBCb290cEJvb3RGaWxlWzEyOF07CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBEaGNwTWFnaWs7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEaGNwT3B0aW9uc1s1Nl07Cit9IEVGSV9QWEVfQkFTRV9DT0RFX0RIQ1BWNF9QQUNLRVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlOjg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkOjI0OworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgRGhjcE9wdGlvbnNbMTAyNF07Cit9IEVGSV9QWEVfQkFTRV9DT0RFX0RIQ1BWNl9QQUNLRVQ7CisKK3R5cGVkZWYgdW5pb24geworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1sxNDcyXTsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9ESENQVjRfUEFDS0VUICAgICBEaGNwdjQ7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfREhDUFY2X1BBQ0tFVCAgICAgRGhjcHY2OworfSBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICBUeXBlOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIENvZGU7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgQ2hlY2tzdW07CisgICAgdW5pb24geworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgIHJlc2VydmVkOworICAgICAgICBVSU5UMzIgICAgICAgICAgICAgIE10dTsKKyAgICAgICAgVUlOVDMyICAgICAgICAgICAgICBQb2ludGVyOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgVUlOVDE2ICAgICAgICAgIElkZW50aWZpZXI7CisgICAgICAgICAgICBVSU5UMTYgICAgICAgICAgU2VxdWVuY2U7CisgICAgICAgIH0gRWNobzsKKyAgICB9IHU7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgRGF0YVs0OTRdOworfSBFRklfUFhFX0JBU0VfQ09ERV9JQ01QX0VSUk9SOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOworICAgIENIQVI4ICAgICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nWzEyN107Cit9IEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfRVJST1I7CisKKy8vCisvLyBJUCBSZWNlaXZlIEZpbHRlciBkZWZpbml0aW9ucworLy8KKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfTUFYX0lQQ05UICAgICAgICAgICAgIDgKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyczsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgSXBDbnQ7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworICAgIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICBJcExpc3RbRUZJX1BYRV9CQVNFX0NPREVfTUFYX0lQQ05UXTsKK30gRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSOworCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0lQX0ZJTFRFUl9TVEFUSU9OX0lQICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9JUF9GSUxURVJfQlJPQURDQVNUICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSX1BST01JU0NVT1VTICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0lQX0ZJTFRFUl9QUk9NSVNDVU9VU19NVUxUSUNBU1QgIDB4MDAwOAorCisvLworLy8gQVJQIENhY2hlIGRlZmluaXRpb25zCisvLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgSXBBZGRyOworICAgIEVGSV9NQUNfQUREUkVTUyAgICAgIE1hY0FkZHI7Cit9IEVGSV9QWEVfQkFTRV9DT0RFX0FSUF9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9JUF9BRERSRVNTICAgICAgIElwQWRkcjsKKyAgICBFRklfSVBfQUREUkVTUyAgICAgICBTdWJuZXRNYXNrOworICAgIEVGSV9JUF9BRERSRVNTICAgICAgIEd3QWRkcjsKK30gRUZJX1BYRV9CQVNFX0NPREVfUk9VVEVfRU5UUlk7CisKKy8vCisvLyBVRFAgZGVmaW5pdGlvbnMKKy8vCisKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfQU5ZX1NSQ19JUCAgICAweDAwMDEKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfQU5ZX1NSQ19QT1JUICAweDAwMDIKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfQU5ZX0RFU1RfSVAgICAweDAwMDQKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfQU5ZX0RFU1RfUE9SVCAweDAwMDgKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfVVNFX0ZJTFRFUiAgICAweDAwMTAKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfTUFZX0ZSQUdNRU5UICAweDAwMjAKKworLy8KKy8vIERpc2NvdmVyKCkgZGVmaW5pdGlvbnMKKy8vCisKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0JPT1RTVFJBUCAgICAgICAgICAgMCAgIAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfTVNfV0lOTlRfUklTICAgICAgICAxCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9JTlRFTF9MQ00gICAgICAgICAgIDIKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0RPU1VOREkgICAgICAgICAgICAgMworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfTkVDX0VTTVBSTyAgICAgICAgICA0CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9JQk1fV1NvRCAgICAgICAgICAgIDUKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0lCTV9MQ0NNICAgICAgICAgICAgNgorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfQ0FfVU5JQ0VOVEVSX1RORyAgICA3CisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9IUF9PUEVOVklFVyAgICAgICAgIDgKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX0FMVElSSVNfOSAgICAgICAgICAgOQorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfQUxUSVJJU18xMCAgICAgICAgICAxMAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfQUxUSVJJU18xMSAgICAgICAgICAxMQorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfTk9UX1VTRURfMTIgICAgICAgICAxMgorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfUkVESEFUX0lOU1RBTEwgICAgICAxMworI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfUkVESEFUX0JPT1QgICAgICAgICAxNAorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfUkVNQk8gICAgICAgICAgICAgICAxNQorI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfQkVPQk9PVCAgICAgICAgICAgICAxNgorLy8KKy8vIDE3IHRocm91Z2ggMzI3NjcgYXJlIHJlc2VydmVkCisvLyAzMjc2OCB0aHJvdWdoIDY1Mjc5IGFyZSBmb3IgdmVuZG9yIHVzZQorLy8gNjUyODAgdGhyb3VnaCA2NTUzNCBhcmUgcmVzZXJ2ZWQKKy8vCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9QWEVURVNUICAgICAgICAgICAgIDY1NTM1CisKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9MQVlFUl9NQVNLICAgICAgICAgICAgICAgMHg3RkZGCisjZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfTEFZRVJfSU5JVElBTCAgICAgICAgICAgIDB4MDAwMAorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgVHlwZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgQWNjZXB0QW55UmVzcG9uc2U7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOworICAgIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICBJcEFkZHI7Cit9IEVGSV9QWEVfQkFTRV9DT0RFX1NSVkxJU1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgVXNlTUNhc3Q7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIFVzZUJDYXN0OworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBVc2VVQ2FzdDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgTXVzdFVzZUxpc3Q7CisgICAgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgIFNlcnZlck1DYXN0SXA7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIElwQ250OworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1NSVkxJU1QgICBTcnZMaXN0WzFdOworfSBFRklfUFhFX0JBU0VfQ09ERV9ESVNDT1ZFUl9JTkZPOworCisvLworLy8gTXRmdHAoKSBkZWZpbml0aW9ucworLy8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9URlRQX0ZJUlNULAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfR0VUX0ZJTEVfU0laRSwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9URlRQX1JFQURfRklMRSwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9URlRQX1dSSVRFX0ZJTEUsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9SRUFEX0RJUkVDVE9SWSwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUF9HRVRfRklMRV9TSVpFLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX1JFQURfRklMRSwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUF9SRUFEX0RJUkVDVE9SWSwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUF9MQVNUCit9IEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfT1BDT0RFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQX0FERFJFU1MgICBNQ2FzdElwOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1VEUF9QT1JUICBDUG9ydDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUE9SVCAgU1BvcnQ7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIExpc3RlblRpbWVvdXQ7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbWl0VGltZW91dDsKK30gRUZJX1BYRV9CQVNFX0NPREVfTVRGVFBfSU5GTzsKKworLy8KKy8vIFBYRSBCYXNlIENvZGUgTW9kZSBzdHJ1Y3R1cmUKKy8vCisKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfTUFYX0FSUF9FTlRSSUVTICAgICAgIDgKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfTUFYX1JPVVRFX0VOVFJJRVMgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIElwdjZBdmFpbGFibGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBJcHY2U3VwcG9ydGVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmdJcHY2OworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgQmlzU3VwcG9ydGVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgQmlzRGV0ZWN0ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvQXJwOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgU2VuZEdVSUQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBEaGNwRGlzY292ZXJWYWxpZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIERoY3BBY2tSZWNlaXZlZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5T2ZmZXJSZWNlaXZlZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIFB4ZURpc2NvdmVyVmFsaWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBQeGVSZXBseVJlY2VpdmVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgUHhlQmlzUmVwbHlSZWNlaXZlZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIEljbXBFcnJvclJlY2VpdmVkOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgVGZ0cEVycm9yUmVjZWl2ZWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlQ2FsbGJhY2tzOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRMOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9TOworICAgIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgU3RhdGlvbklwOworICAgIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgU3VibmV0TWFzazsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICAgIERoY3BEaXNjb3ZlcjsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICAgIERoY3BBY2s7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICBQcm94eU9mZmVyOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgICAgUHhlRGlzY292ZXI7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICBQeGVSZXBseTsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICAgIFB4ZUJpc1JlcGx5OworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0lQX0ZJTFRFUiAgICAgSXBGaWx0ZXI7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBBcnBDYWNoZUVudHJpZXM7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfQVJQX0VOVFJZICAgICBBcnBDYWNoZVtFRklfUFhFX0JBU0VfQ09ERV9NQVhfQVJQX0VOVFJJRVNdOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVUYWJsZUVudHJpZXM7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfUk9VVEVfRU5UUlkgICBSb3V0ZVRhYmxlW0VGSV9QWEVfQkFTRV9DT0RFX01BWF9ST1VURV9FTlRSSUVTXTsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9JQ01QX0VSUk9SICAgIEljbXBFcnJvcjsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9URlRQX0VSUk9SICAgIFRmdHBFcnJvcjsKK30gRUZJX1BYRV9CQVNFX0NPREVfTU9ERTsKKworLy8KKy8vIFBYRSBCYXNlIENvZGUgSW50ZXJmYWNlIEZ1bmN0aW9uIGRlZmluaXRpb25zCisvLworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9TVEFSVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBVc2VJcHY2CisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BYRV9CQVNFX0NPREVfU1RPUCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgKlRoaXMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9ESENQKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIFNvcnRPZmZlcnMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9ESVNDT1ZFUikgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgICAgICAgICAqVGhpcywKKyAgICBJTiBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSwKKyAgICBJTiBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxheWVyLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VCaXMsCisgICAgSU4gT1VUIEVGSV9QWEVfQkFTRV9DT0RFX0RJU0NPVkVSX0lORk8gICpJbmZvICAgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9NVEZUUCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgICAgICpUaGlzLAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfT1BDT0RFICAgIE9wZXJhdGlvbiwKKyAgICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyUHRyICBPUFRJT05BTCwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyd3JpdGUsCisgICAgSU4gT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKkJsb2NrU2l6ZSAgT1BUSU9OQUwsCisgICAgSU4gRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgKlNlcnZlcklwLAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICpGaWxlbmFtZSwKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUF9JTkZPICAgICAqSW5mbyAgICAgICBPUFRJT05BTCwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICBEb250VXNlQnVmZmVyCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BYRV9CQVNFX0NPREVfVURQX1dSSVRFKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAgICAgKlRoaXMsCisgICAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BGbGFncywKKyAgICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqRGVzdElwLAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX1VEUF9QT1JUICAgICAgICpEZXN0UG9ydCwKKyAgICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqR2F0ZXdheUlwLCAgT1BUSU9OQUwKKyAgICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqU3JjSXAsICAgICAgT1BUSU9OQUwKKyAgICBJTiBPVVQgRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQgICAqU3JjUG9ydCwgICAgT1BUSU9OQUwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSGVhZGVyU2l6ZSwgT1BUSU9OQUwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSGVhZGVyUHRyLCAgT1BUSU9OQUwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyUHRyCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BYRV9CQVNFX0NPREVfVURQX1JFQUQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICAgICAqVGhpcywKKyAgICBJTiBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPcEZsYWdzLAorICAgIElOIE9VVCBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICpEZXN0SXAsICAgICAgT1BUSU9OQUwKKyAgICBJTiBPVVQgRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQgICAqRGVzdFBvcnQsICAgIE9QVElPTkFMCisgICAgSU4gT1VUIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgKlNyY0lwLCAgICAgICBPUFRJT05BTAorICAgIElOIE9VVCBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUE9SVCAgICpTcmNQb3J0LCAgICAgT1BUSU9OQUwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSGVhZGVyU2l6ZSwgIE9QVElPTkFMCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkhlYWRlclB0ciwgICBPUFRJT05BTAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJQdHIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9TRVRfSVBfRklMVEVSKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcywKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9JUF9GSUxURVIgICpOZXdGaWx0ZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9BUlApICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFICAgICpUaGlzLAorICAgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgKklwQWRkciwgICAgICAKKyAgICBJTiBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICpNYWNBZGRyICAgICAgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9TRVRfUEFSQU1FVEVSUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAqTmV3QXV0b0FycCwgICAgT1BUSU9OQUwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICpOZXdTZW5kR1VJRCwgICBPUFRJT05BTAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgKk5ld1RUTCwgICAgICAgIE9QVElPTkFMCisgICAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAqTmV3VG9TLCAgICAgICAgT1BUSU9OQUwKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICpOZXdNYWtlQ2FsbGJhY2sgICAgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9TRVRfU1RBVElPTl9JUCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREUgICAgKlRoaXMsCisgICAgSU4gRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAqTmV3U3RhdGlvbklwLCAgT1BUSU9OQUwKKyAgICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICpOZXdTdWJuZXRNYXNrICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NFVF9QQUNLRVRTKSAoCisgICAgSU4gc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERSAgICAqVGhpcywKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdEaGNwRGlzY292ZXJWYWxpZCwgIE9QVElPTkFMCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3RGhjcEFja1JlY2VpdmVkLCAgICBPUFRJT05BTAorICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgKk5ld1Byb3h5T2ZmZXJSZWNlaXZlZCwgT1BUSU9OQUwKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdQeGVEaXNjb3ZlclZhbGlkLCAgIE9QVElPTkFMCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3UHhlUmVwbHlSZWNlaXZlZCwgICBPUFRJT05BTAorICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgKk5ld1B4ZUJpc1JlcGx5UmVjZWl2ZWQsT1BUSU9OQUwKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICpOZXdEaGNwRGlzY292ZXIsIE9QVElPTkFMCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAqTmV3RGhjcEFjaywgICAgICBPUFRJT05BTAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgKk5ld1Byb3h5T2ZmZXIsICAgT1BUSU9OQUwKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICpOZXdQeGVEaXNjb3ZlciwgIE9QVElPTkFMCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAqTmV3UHhlUmVwbHksICAgICBPUFRJT05BTAorICAgIElOIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgKk5ld1B4ZUJpc1JlcGx5ICAgT1BUSU9OQUwKKyAgICApOworCisvLworLy8gUFhFIEJhc2UgQ29kZSBQcm90b2NvbCBzdHJ1Y3R1cmUKKy8vCisKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSU5URVJGQUNFX1JFVklTSU9OICAgIDB4MDAwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFIHsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9TVEFSVCAgICAgICAgICAgICBTdGFydDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9TVE9QICAgICAgICAgICAgICBTdG9wOworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0RIQ1AgICAgICAgICAgICAgIERoY3A7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfRElTQ09WRVIgICAgICAgICAgRGlzY292ZXI7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfTVRGVFAgICAgICAgICAgICAgTXRmdHA7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfVURQX1dSSVRFICAgICAgICAgVWRwV3JpdGU7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfVURQX1JFQUQgICAgICAgICAgVWRwUmVhZDsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9TRVRfSVBfRklMVEVSICAgICBTZXRJcEZpbHRlcjsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9BUlAgICAgICAgICAgICAgICBBcnA7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfU0VUX1BBUkFNRVRFUlMgICAgU2V0UGFyYW1ldGVyczsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9TRVRfU1RBVElPTl9JUCAgICBTZXRTdGF0aW9uSXA7CisgICAgRUZJX1BYRV9CQVNFX0NPREVfU0VUX1BBQ0tFVFMgICAgICAgU2V0UGFja2V0czsKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9NT0RFICAgICAgICAgICAgICAqTW9kZTsKK30gRUZJX1BYRV9CQVNFX0NPREU7CisKKy8vCisvLyBDYWxsIEJhY2sgRGVmaW5pdGlvbnMKKy8vCisKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfUFJPVE9DT0wgXAorICAgIHsgMHgyNDVkY2EyMSwgMHhmYjdiLCAweDExZDMsIHsweDhmLCAweDAxLCAweDAwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNifSB9CisKKy8vCisvLyBSZXZpc2lvbiBOdW1iZXIKKy8vCisKKyNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfSU5URVJGQUNFX1JFVklTSU9OICAgMHgwMDAxMDAwMAorCitJTlRFUkZBQ0VfREVDTChfRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0spOworCit0eXBlZGVmIGVudW0geworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0ZVTkNUSU9OX0ZJUlNULAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX0ZVTkNUSU9OX0RIQ1AsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fRElTQ09WRVIsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fTVRGVFAsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfRlVOQ1RJT05fVURQX1dSSVRFLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX0ZVTkNUSU9OX1VEUF9SRUFELAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX0ZVTkNUSU9OX0FSUCwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9GVU5DVElPTl9JR01QLAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX1BYRV9GVU5DVElPTl9MQVNUCit9IEVGSV9QWEVfQkFTRV9DT0RFX0ZVTkNUSU9OOworCit0eXBlZGVmIGVudW0geworICAgIEVGSV9QWEVfQkFTRV9DT0RFX0NBTExCQUNLX1NUQVRVU19GSVJTVCwKKyAgICBFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDS19TVEFUVVNfQ09OVElOVUUsCisgICAgRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfU1RBVFVTX0FCT1JULAorICAgIEVGSV9QWEVfQkFTRV9DT0RFX0NBTExCQUNLX1NUQVRVU19MQVNUCit9IEVGSV9QWEVfQkFTRV9DT0RFX0NBTExCQUNLX1NUQVRVUzsKKwordHlwZWRlZgorRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfU1RBVFVTIAorKEVGSUFQSSAqRUZJX1BYRV9DQUxMQkFDSykgKAorICAgIElOIHN0cnVjdCBfRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0sgICAqVGhpcywKKyAgICBJTiBFRklfUFhFX0JBU0VfQ09ERV9GVU5DVElPTiAgICAgICAgICAgRnVuY3Rpb24sCisgICAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVkLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXRMZW4sCisgICAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICAgICAgICpQYWNrZXQgICAgIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9QWEVfQkFTRV9DT0RFX0NBTExCQUNLIHsKKyAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgUmV2aXNpb247CisgICAgRUZJX1BYRV9DQUxMQkFDSyAgICAgICAgICAgIENhbGxiYWNrOworfSBFRklfUFhFX0JBU0VfQ09ERV9DQUxMQkFDSzsKKworI2VuZGlmIC8qIF9FRklQWEVCQ19IICovCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlydGxpYi5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpcnRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDczZWFkCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpcnRsaWIuaApAQCAtMCwwICsxLDE0MSBAQAorI2lmbmRlZiBfRUZJX1JUX0xJQl9JTkNMVURFXworI2RlZmluZSBfRUZJX1JUX0xJQl9JTkNMVURFXworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpbGliLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgUnVudGltZSBsaWJyYXJ5IGZ1bmN0aW9ucworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpbmNsdWRlICJlZmlkZWJ1Zy5oIgorI2luY2x1ZGUgImVmaXBhcnQuaCIKKyNpbmNsdWRlICJlZmlsaWJwbGF0LmgiCisKKworVk9JRAorUlVOVElNRUZVTkNUSU9OCitSdFplcm9NZW0gKAorICAgIElOIFZPSUQgICAgICpCdWZmZXIsCisgICAgSU4gVUlOVE4gICAgIFNpemUKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0U2V0TWVtICgKKyAgICBJTiBWT0lEICAgICAqQnVmZmVyLAorICAgIElOIFVJTlROICAgIFNpemUsCisgICAgSU4gVUlOVDggICAgVmFsdWUgICAgCisgICAgKTsKKworVk9JRAorUlVOVElNRUZVTkNUSU9OCitSdENvcHlNZW0gKAorICAgIElOIFZPSUQgICAgICpEZXN0LAorICAgIElOIENPTlNUIFZPSUQgICAgICpTcmMsCisgICAgSU4gVUlOVE4gICAgbGVuCisgICAgKTsKKworSU5UTgorUlVOVElNRUZVTkNUSU9OCitSdENvbXBhcmVNZW0gKAorICAgIElOIENPTlNUIFZPSUQgICAgICpEZXN0LAorICAgIElOIENPTlNUIFZPSUQgICAgICpTcmMsCisgICAgSU4gVUlOVE4gICAgbGVuCisgICAgKTsKKworSU5UTgorUlVOVElNRUZVTkNUSU9OCitSdFN0ckNtcCAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxLAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMgorICAgICk7CisKKworVk9JRAorUlVOVElNRUZVTkNUSU9OCitSdFN0ckNweSAoCisgICAgSU4gQ0hBUjE2ICAgKkRlc3QsCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgICpTcmMKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0U3RyQ2F0ICgKKyAgICBJTiBDSEFSMTYgICAqRGVzdCwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqU3JjCisgICAgKTsKKworVUlOVE4KK1JVTlRJTUVGVU5DVElPTgorUnRTdHJMZW4gKAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMQorICAgICk7CisKK1VJTlROCitSVU5USU1FRlVOQ1RJT04KK1J0U3RyU2l6ZSAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxCisgICAgKTsKKworSU5UTgorUlVOVElNRUZVTkNUSU9OCitSdENvbXBhcmVHdWlkICgKKyAgICBJTiBFRklfR1VJRCAgICAgKkd1aWQxLAorICAgIElOIEVGSV9HVUlEICAgICAqR3VpZDIKKyAgICApOworCitVSU5UOAorUlVOVElNRUZVTkNUSU9OCitSdERlY2ltYWx0b0JDRCgKKyAgICBJTiAgVUlOVDggQmNkVmFsdWUKKyAgICApOworCitVSU5UOAorUlVOVElNRUZVTkNUSU9OCitSdEJDRHRvRGVjaW1hbCgKKyAgICBJTiAgVUlOVDggQmNkVmFsdWUKKyAgICApOworCisvLworLy8gVmlydHVhbCBtYXBwaW5nIHRyYW5zaXRpb24gc3VwcG9ydC4gIChPbmx5IHVzZWQgZHVyaW5nCisvLyB0aGUgdmlydHVhbCBhZGRyZXNzIGNoYW5nZSB0cmFuc2lzaXRpb24pCisvLworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0TGliRW5hYmxlVmlydHVhbE1hcHBpbmdzICgKKyAgICBWT0lECisgICAgKTsKKworVk9JRAorUlVOVElNRUZVTkNUSU9OCitSdENvbnZlcnRMaXN0ICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgIERlYnVnRGlzcG9zaXRpb24sCisgICAgSU4gT1VUIExJU1RfRU5UUlkgICAqTGlzdEhlYWQKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0QWNxdWlyZUxvY2sgKAorICAgIElOIEZMT0NLICAgICpMb2NrCisgICAgKTsKKworVk9JRAorUlVOVElNRUZVTkNUSU9OCitSdFJlbGVhc2VMb2NrICgKKyAgICBJTiBGTE9DSyAgICAqTG9jaworICAgICk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlzZXIuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYzk3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZmlzZXIuaApAQCAtMCwwICsxLDEzMiBAQAorI2lmbmRlZiBfRUZJX1NFUl9ICisjZGVmaW5lIF9FRklfU0VSX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZWZpc2VyLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgc2VyaWFsIHByb3RvY29sCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisvLworLy8gU2VyaWFsIHByb3RvY29sCisvLworCisjZGVmaW5lIFNFUklBTF9JT19QUk9UT0NPTCBcCisgICAgeyAweEJCMjVDRjZGLCAweEYxRDQsIDB4MTFEMiwgezB4OUEsIDB4MEMsIDB4MDAsIDB4OTAsIDB4MjcsIDB4M0YsIDB4QzEsIDB4RkR9IH0KKworSU5URVJGQUNFX0RFQ0woX1NFUklBTF9JT19JTlRFUkZBQ0UpOworCit0eXBlZGVmIGVudW0geworICAgIERlZmF1bHRQYXJpdHksICAgICAgCisgICAgTm9QYXJpdHksICAgICAgICAgICAKKyAgICBFdmVuUGFyaXR5LAorICAgIE9kZFBhcml0eSwKKyAgICBNYXJrUGFyaXR5LAorICAgIFNwYWNlUGFyaXR5Cit9IEVGSV9QQVJJVFlfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBEZWZhdWx0U3RvcEJpdHMsICAgICAgICAKKyAgICBPbmVTdG9wQml0LCAgICAgICAgIC8vIDEgc3RvcCBiaXQKKyAgICBPbmVGaXZlU3RvcEJpdHMsICAgIC8vIDEuNSBzdG9wIGJpdHMKKyAgICBUd29TdG9wQml0cyAgICAgICAgIC8vIDIgc3RvcCBiaXRzCit9IEVGSV9TVE9QX0JJVFNfVFlQRTsKKworI2RlZmluZSBFRklfU0VSSUFMX0NMRUFSX1RPX1NFTkQgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvLyBSTworI2RlZmluZSBFRklfU0VSSUFMX0RBVEFfU0VUX1JFQURZICAgICAgICAgICAgICAgICAgMHgwMDIwICAvLyBSTworI2RlZmluZSBFRklfU0VSSUFMX1JJTkdfSU5ESUNBVEUgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvLyBSTworI2RlZmluZSBFRklfU0VSSUFMX0NBUlJJRVJfREVURUNUICAgICAgICAgICAgICAgICAgMHgwMDgwICAvLyBSTworI2RlZmluZSBFRklfU0VSSUFMX1JFUVVFU1RfVE9fU0VORCAgICAgICAgICAgICAgICAgMHgwMDAyICAvLyBXTworI2RlZmluZSBFRklfU0VSSUFMX0RBVEFfVEVSTUlOQUxfUkVBRFkgICAgICAgICAgICAgMHgwMDAxICAvLyBXTworI2RlZmluZSBFRklfU0VSSUFMX0lOUFVUX0JVRkZFUl9FTVBUWSAgICAgICAgICAgICAgMHgwMTAwICAvLyBSTworI2RlZmluZSBFRklfU0VSSUFMX09VVFBVVF9CVUZGRVJfRU1QVFkgICAgICAgICAgICAgMHgwMjAwICAvLyBSTworI2RlZmluZSBFRklfU0VSSUFMX0hBUkRXQVJFX0xPT1BCQUNLX0VOQUJMRSAgICAgICAgMHgxMDAwICAvLyBSVworI2RlZmluZSBFRklfU0VSSUFMX1NPRlRXQVJFX0xPT1BCQUNLX0VOQUJMRSAgICAgICAgMHgyMDAwICAvLyBSVworI2RlZmluZSBFRklfU0VSSUFMX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTF9FTkFCTEUgICAgMHg0MDAwICAvLyBSVworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VSSUFMX1JFU0VUKSAoCisgICAgSU4gc3RydWN0IF9TRVJJQUxfSU9fSU5URVJGQUNFICAqVGhpcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVJJQUxfU0VUX0FUVFJJQlVURVMpICgKKyAgICBJTiBzdHJ1Y3QgX1NFUklBTF9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgQmF1ZFJhdGUsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBSZWNlaXZlRmlmb0RlcHRoLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCwKKyAgICBJTiBFRklfUEFSSVRZX1RZUEUgICAgICAgICAgICAgIFBhcml0eSwKKyAgICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCaXRzLAorICAgIElOIEVGSV9TVE9QX0JJVFNfVFlQRSAgICAgICAgICAgU3RvcEJpdHMKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VSSUFMX1NFVF9DT05UUk9MX0JJVFMpICgKKyAgICBJTiBzdHJ1Y3QgX1NFUklBTF9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVJJQUxfR0VUX0NPTlRST0xfQklUUykgKAorICAgIElOIHN0cnVjdCBfU0VSSUFMX0lPX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAqQ29udHJvbAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVJJQUxfV1JJVEUpICgKKyAgICBJTiBzdHJ1Y3QgX1NFUklBTF9JT19JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFUklBTF9SRUFEKSAoCisgICAgSU4gc3RydWN0IF9TRVJJQUxfSU9fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBDb250cm9sTWFzazsKKworICAgIC8vIGN1cnJlbnQgQXR0cmlidXRlcworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIFRpbWVvdXQ7CisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgQmF1ZFJhdGU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgUmVjZWl2ZUZpZm9EZXB0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBEYXRhQml0czsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICBQYXJpdHk7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgU3RvcEJpdHM7Cit9IFNFUklBTF9JT19NT0RFOworCisjZGVmaW5lIFNFUklBTF9JT19JTlRFUkZBQ0VfUkVWSVNJT04gICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfU0VSSUFMX0lPX0lOVEVSRkFDRSB7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsKKyAgICBFRklfU0VSSUFMX1JFU0VUICAgICAgICAgICAgIFJlc2V0OworICAgIEVGSV9TRVJJQUxfU0VUX0FUVFJJQlVURVMgICAgU2V0QXR0cmlidXRlczsKKyAgICBFRklfU0VSSUFMX1NFVF9DT05UUk9MX0JJVFMgIFNldENvbnRyb2w7CisgICAgRUZJX1NFUklBTF9HRVRfQ09OVFJPTF9CSVRTICBHZXRDb250cm9sOworICAgIEVGSV9TRVJJQUxfV1JJVEUgICAgICAgICAgICAgV3JpdGU7CisgICAgRUZJX1NFUklBTF9SRUFEICAgICAgICAgICAgICBSZWFkOworCisgICAgU0VSSUFMX0lPX01PREUgICAgICAgICAgICAgICAqTW9kZTsKK30gU0VSSUFMX0lPX0lOVEVSRkFDRTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXN0ZGFyZy5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpc3RkYXJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5NmI5NAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXN0ZGFyZy5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX0VGSVNUREFSR19IXworI2RlZmluZSBfRUZJU1REQVJHX0hfCisKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGRldnBhdGguaAorCitBYnN0cmFjdDoKKworICAgIERlZmluZXMgZm9yIHBhcnNpbmcgdGhlIEVGSSBEZXZpY2UgUGF0aCBzdHJ1Y3R1cmVzCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKyNpZmRlZiBfX0dOVUNfXworI2luY2x1ZGUgInN0ZGFyZy5oIgorI2Vsc2UKKyNkZWZpbmUgX0lOVFNJWkVPRihuKSAgICggKHNpemVvZihuKSArIHNpemVvZihVSU5UTikgLSAxKSAmIH4oc2l6ZW9mKFVJTlROKSAtIDEpICkKKwordHlwZWRlZiBDSEFSOCAqIHZhX2xpc3Q7CisKKyNkZWZpbmUgdmFfc3RhcnQoYXAsdikgICggYXAgPSAodmFfbGlzdCkmdiArIF9JTlRTSVpFT0YodikgKQorI2RlZmluZSB2YV9hcmcoYXAsdCkgICAgKCAqKHQgKikoKGFwICs9IF9JTlRTSVpFT0YodCkpIC0gX0lOVFNJWkVPRih0KSkgKQorI2RlZmluZSB2YV9lbmQoYXApICAoIGFwID0gKHZhX2xpc3QpMCApCisjZW5kaWYKKworI2VuZGlmICAvKiBfSU5DX1NUREFSRyAqLwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpdGNwLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9lZml0Y3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVkZjdmCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpdGNwLmgKQEAgLTAsMCArMSwzOTEgQEAKKyNpZm5kZWYgX0VGSV9UQ1BfSAorI2RlZmluZSBfRUZJX1RDUF9ICisKKy8qKysKK0NvcHlyaWdodCAoYykgMjAxMyAgSW50ZWwgQ29ycG9yYXRpb24KKworLS0qLworCisjZGVmaW5lIEVGSV9UQ1A0X1NFUlZJQ0VfQklORElOR19QUk9UT0NPTCBcCisgICAgeyAweDAwNzIwNjY1LCAweDY3ZWIsIDB4NGE5OSwgezB4YmEsIDB4ZjcsIDB4ZDMsIDB4YzMsIDB4M2EsIDB4MWMsMHg3YywgMHhjOX19CisKKyNkZWZpbmUgRUZJX1RDUDRfUFJPVE9DT0wgXAorICAgIHsgMHg2NTUzMGJjNywgMHhhMzU5LCAweDQxMGYsIHsweGIwLCAweDEwLCAweDVhLCAweGFkLCAweGM3LCAweGVjLCAweDJiLCAweDYyfX0KKworI2RlZmluZSBFRklfVENQNl9TRVJWSUNFX0JJTkRJTkdfUFJPVE9DT0wgXAorICAgIHsgMHhlYzIwZWI3OSwgMHg2YzFhLCAweDQ2NjQsIHsweDlhLCAweGQsIDB4ZDIsIDB4ZTQsIDB4Y2MsIDB4MTYsIDB4ZDYsIDB4NjR9fQorCisjZGVmaW5lIEVGSV9UQ1A2X1BST1RPQ09MIFwKKyAgICB7IDB4NDZlNDQ4NTUsIDB4YmQ2MCwgMHg0YWI3LCB7MHhhYiwgMHhkLCAweGE2LCAweDc5LCAweGI5LCAweDQ0LCAweDdkLCAweDc3fX0KKworSU5URVJGQUNFX0RFQ0woX0VGSV9UQ1A0KTsKK0lOVEVSRkFDRV9ERUNMKF9FRklfVENQNik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgVXNlRGVmYXVsdEFkZHJlc3M7CisgICAgRUZJX0lQdjRfQUREUkVTUyAgIFN0YXRpb25BZGRyZXNzOworICAgIEVGSV9JUHY0X0FERFJFU1MgICBTdWJuZXRNYXNrOworICAgIFVJTlQxNiAgICAgICAgICAgICBTdGF0aW9uUG9ydDsKKyAgICBFRklfSVB2NF9BRERSRVNTICAgUmVtb3RlQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgICAgUmVtb3RlUG9ydDsKKyAgICBCT09MRUFOICAgICAgICAgICAgQWN0aXZlRmxhZzsKK30gRUZJX1RDUDRfQUNDRVNTX1BPSU5UOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICAgICAgICAgICAgIFJlY2VpdmVCdWZmZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICBTZW5kQnVmZmVyU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgTWF4U3luQmFja0xvZzsKKyAgICBVSU5UMzIgICAgICAgICAgICAgQ29ubmVjdGlvblRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICAgIERhdGFSZXRyaWVzOworICAgIFVJTlQzMiAgICAgICAgICAgICBGaW5UaW1lb3V0OworICAgIFVJTlQzMiAgICAgICAgICAgICBUaW1lV2FpdFRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICAgIEtlZXBBbGl2ZVByb2JlczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgS2VlcEFsaXZlVGltZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgS2VlcEFsaXZlSW50ZXJ2YWw7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZU5hZ2xlOworICAgIEJPT0xFQU4gICAgICAgICAgICBFbmFibGVUaW1lU3RhbXA7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVdpbmRvd1NjYWxpbmc7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVNlbGVjdGl2ZUFjazsKKyAgICBCT09MRUFOICAgICAgICAgICAgRW5hYmxlUEF0aE10dURpc2NvdmVyeTsKK30gRUZJX1RDUDRfT1BUSU9OOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8gUmVjZWl2aW5nIEZpbHRlcnMKKyAgICAvLyBJL08gcGFyYW1ldGVycworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICBUeXBlT2ZTZXJ2aWNlOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICBUaW1lVG9MaXZlOworCisgICAgLy8gQWNjZXNzIFBvaW50CisgICAgRUZJX1RDUDRfQUNDRVNTX1BPSU5UIEFjY2Vzc1BvaW50OworCisgICAgLy8gVENQIENvbnRyb2wgT3B0aW9ucworICAgIEVGSV9UQ1A0X09QVElPTiAgICAgICAqQ29udHJvbE9wdGlvbjsKK30gRUZJX1RDUDRfQ09ORklHX0RBVEE7CisKK3R5cGVkZWYgZW51bSB7CisgICAgVGNwNFN0YXRlQ2xvc2VkICAgICAgPSAwLAorICAgIFRjcDRTdGF0ZUxpc3RlbiAgICAgID0gMSwKKyAgICBUY3A0U3RhdGVTeW5TZW50ICAgICA9IDIsCisgICAgVGNwNFN0YXRlU3luUmVjZWl2ZWQgPSAzLAorICAgIFRjcDRTdGF0ZUVzdGFibGlzaGVkID0gNCwKKyAgICBUY3A0U3RhdGVGaW5XYWl0MSAgICA9IDUsCisgICAgVGNwNFN0YXRlRmluV2FpdDIgICAgPSA2LAorICAgIFRjcDRTdGF0ZUNsb3NpbmcgICAgID0gNywKKyAgICBUY3A0U3RhdGVUaW1lV2FpdCAgICA9IDgsCisgICAgVGNwNFN0YXRlQ2xvc2VXYWl0ICAgPSA5LAorICAgIFRjcDRTdGF0ZUxhc3RBY2sgICAgID0gMTAKK30gRUZJX1RDUDRfQ09OTkVDVElPTl9TVEFURTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDRfR0VUX01PREVfREFUQSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgICAgICAgICAgICAgICAgICpUaGlzLAorICAgIE9VVCBFRklfVENQNF9DT05ORUNUSU9OX1NUQVRFICAgICAgICpUY3A0U3RhdGUgICAgICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX1RDUDRfQ09ORklHX0RBVEEgICAgICAgICAgICAqVGNwNENvbmZpZ0RhdGEgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9JUDRfTU9ERV9EQVRBICAgICAgICAgICAgICAgKklwNE1vZGVEYXRhICAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfTUFOQUdFRF9ORVRXT1JLX0NPTkZJR19EQVRBICpNbnBDb25maWdEYXRhICBPUFRJT05BTCwKKyAgICBPVVQgRUZJX1NJTVBMRV9ORVRXT1JLX01PREUgICAgICAgICAqU25wTW9kZURhdGEgICAgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNF9DT05GSUdVUkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A0ICAgICAqVGhpcywKKyAgICBJTiBFRklfVENQNF9DT05GSUdfREFUQSAqVGNwQ29uZmlnRGF0YSBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X1JPVVRFUykgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgKlRoaXMsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBEZWxldGVSb3V0ZSwKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpTdWJuZXRBZGRyZXNzLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKlN1Ym5ldE1hc2ssCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqR2F0ZXdheUFkZHJlc3MKKyk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfRVZFTlQgIEV2ZW50OworICAgIEVGSV9TVEFUVVMgU3RhdHVzOworfSBFRklfVENQNF9DT01QTEVUSU9OX1RPS0VOOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RDUDRfQ09NUExFVElPTl9UT0tFTiBDb21wbGV0aW9uVG9rZW47Cit9IEVGSV9UQ1A0X0NPTk5FQ1RJT05fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X0NPTk5FQ1QpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A0ICAgICAgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A0X0NPTk5FQ1RJT05fVE9LRU4gKkNvbm5lY3Rpb25Ub2tlbgorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVENQNF9DT01QTEVUSU9OX1RPS0VOIENvbXBsZXRpb25Ub2tlbjsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgIE5ld0NoaWxkSGFuZGxlOworfSBFRklfVENQNF9MSVNURU5fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X0FDQ0VQVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgICAgICAqVGhpcywKKyAgICBJTiBFRklfVENQNF9MSVNURU5fVE9LRU4gKkxpc3RlblRva2VuCisgICAgKTsKKworI2RlZmluZSBFRklfQ09OTkVDVElPTl9GSU4gICAgIEVGSUVSUigxMDQpCisjZGVmaW5lIEVGSV9DT05ORUNUSU9OX1JFU0VUICAgRUZJRVJSKDEwNSkKKyNkZWZpbmUgRUZJX0NPTk5FQ1RJT05fUkVGVVNFRCBFRklFUlIoMTA2KQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyIEZyYWdtZW50TGVuZ3RoOworICAgIFZPSUQgICAqRnJhZ21lbnRCdWZmZXI7Cit9IEVGSV9UQ1A0X0ZSQUdNRU5UX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIFVyZ2VudEZsYWc7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfVENQNF9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9UQ1A0X1JFQ0VJVkVfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgUHVzaDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIFVyZ2VudDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9UQ1A0X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX1RDUDRfVFJBTlNNSVRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9UQ1A0X0NPTVBMRVRJT05fVE9LRU4gIENvbXBsZXRpb25Ub2tlbjsKKyAgICB1bmlvbiB7CisJRUZJX1RDUDRfUkVDRUlWRV9EQVRBICAqUnhEYXRhOworCUVGSV9UQ1A0X1RSQU5TTUlUX0RBVEEgKlR4RGF0YTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQ7Cit9IEVGSV9UQ1A0X0lPX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNF9UUkFOU01JVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgICpUaGlzLAorICAgIElOIEVGSV9UQ1A0X0lPX1RPS0VOICpUb2tlbgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X1JFQ0VJVkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A0ICAqVGhpcywKKyAgICBJTiBFRklfVENQNF9JT19UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RDUDRfQ09NUExFVElPTl9UT0tFTiBDb21wbGV0aW9uVG9rZW47CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICBBYm9ydE9uQ2xvc2U7Cit9IEVGSV9UQ1A0X0NMT1NFX1RPS0VOOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNF9DTE9TRSkoCisgICAgSU4gc3RydWN0IF9FRklfVENQNCAgICAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDRfQ0xPU0VfVE9LRU4gKkNsb3NlVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNF9DQU5DRUwpKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDQgKlRoaXMsCisgICAgSU4gRUZJX1RDUDRfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4gT1BUSU9OQUwKKyk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A0X1BPTEwpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A0ICpUaGlzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9UQ1A0IHsKKyAgICBFRklfVENQNF9HRVRfTU9ERV9EQVRBIEdldE1vZGVEYXRhOworICAgIEVGSV9UQ1A0X0NPTkZJR1VSRSAgICAgQ29uZmlndXJlOworICAgIEVGSV9UQ1A0X1JPVVRFUyAgICAgICAgUm91dGVzOworICAgIEVGSV9UQ1A0X0NPTk5FQ1QgICAgICAgQ29ubmVjdDsKKyAgICBFRklfVENQNF9BQ0NFUFQgICAgICAgIEFjY2VwdDsKKyAgICBFRklfVENQNF9UUkFOU01JVCAgICAgIFRyYW5zbWl0OworICAgIEVGSV9UQ1A0X1JFQ0VJVkUgICAgICAgUmVjZWl2ZTsKKyAgICBFRklfVENQNF9DTE9TRSAgICAgICAgIENsb3NlOworICAgIEVGSV9UQ1A0X0NBTkNFTCAgICAgICAgQ2FuY2VsOworICAgIEVGSV9UQ1A0X1BPTEwgICAgICAgICAgUG9sbDsKK30gRUZJX1RDUDQ7CisKK3R5cGVkZWYgZW51bSB7CisgICAgVGNwNlN0YXRlQ2xvc2VkICAgICAgPSAwLAorICAgIFRjcDZTdGF0ZUxpc3RlbiAgICAgID0gMSwKKyAgICBUY3A2U3RhdGVTeW5TZW50ICAgICA9IDIsCisgICAgVGNwNlN0YXRlU3luUmVjZWl2ZWQgPSAzLAorICAgIFRjcDZTdGF0ZUVzdGFibGlzaGVkID0gNCwKKyAgICBUY3A2U3RhdGVGaW5XYWl0MSAgICA9IDUsCisgICAgVGNwNlN0YXRlRmluV2FpdDIgICAgPSA2LAorICAgIFRjcDZTdGF0ZUNsb3NpbmcgICAgID0gNywKKyAgICBUY3A2U3RhdGVUaW1lV2FpdCAgICA9IDgsCisgICAgVGNwNlN0YXRlQ2xvc2VXYWl0ICAgPSA5LAorICAgIFRjcDZTdGF0ZUxhc3RBY2sgICAgID0gMTAKK30gRUZJX1RDUDZfQ09OTkVDVElPTl9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9JUHY2X0FERFJFU1MgU3RhdGlvbkFkZHJlc3M7CisgICAgVUlOVDE2ICAgICAgICAgICBTdGF0aW9uUG9ydDsKKyAgICBFRklfSVB2Nl9BRERSRVNTIFJlbW90ZUFkZHJlc3M7CisgICAgVUlOVDE2ICAgICAgICAgICBSZW1vdGVQb3J0OworICAgIEJPT0xFQU4gICAgICAgICAgQWN0aXZlRmxhZzsKK30gRUZJX1RDUDZfQUNDRVNTX1BPSU5UOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICAgICAgICAgICAgIFJlY2VpdmVCdWZmZXJTaXplOworICAgIFVJTlQzMiAgICAgICAgICAgICBTZW5kQnVmZmVyU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgTWF4U3luQmFja0xvZzsKKyAgICBVSU5UMzIgICAgICAgICAgICAgQ29ubmVjdGlvblRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICAgIERhdGFSZXRyaWVzOworICAgIFVJTlQzMiAgICAgICAgICAgICBGaW5UaW1lb3V0OworICAgIFVJTlQzMiAgICAgICAgICAgICBUaW1lV2FpdFRpbWVvdXQ7CisgICAgVUlOVDMyICAgICAgICAgICAgIEtlZXBBbGl2ZVByb2JlczsKKyAgICBVSU5UMzIgICAgICAgICAgICAgS2VlcEFsaXZlVGltZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgS2VlcEFsaXZlSW50ZXJ2YWw7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZU5hZ2xlOworICAgIEJPT0xFQU4gICAgICAgICAgICBFbmFibGVUaW1lU3RhbXA7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVdpbmRib3dTY2FsaW5nOworICAgIEJPT0xFQU4gICAgICAgICAgICBFbmFibGVTZWxlY3RpdmVBY2s7CisgICAgQk9PTEVBTiAgICAgICAgICAgIEVuYWJsZVBhdGhNdHVEaXNjb3Zlcnk7Cit9IEVGSV9UQ1A2X09QVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICBUcmFmZmljQ2xhc3M7CisgICAgVUlOVDggICAgICAgICAgICAgICAgIEhvcExpbWl0OworICAgIEVGSV9UQ1A2X0FDQ0VTU19QT0lOVCBBY2Nlc3NQb2ludDsKKyAgICBFRklfVENQNl9PUFRJT04gICAgICAgKkNvbnRyb2xPcHRpb247Cit9IEVGSV9UQ1A2X0NPTkZJR19EQVRBOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9HRVRfTU9ERV9EQVRBKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAgICAgICAgICAgICAgICAgKlRoaXMsCisgICAgT1VUIEVGSV9UQ1A2X0NPTk5FQ1RJT05fU1RBVEUgICAgICAgKlRjcDZTdGF0ZSAgICAgIE9QVElPTkFMLAorICAgIE9VVCBFRklfVENQNl9DT05GSUdfREFUQSAgICAgICAgICAgICpUY3A2Q29uZmlnRGF0YSBPUFRJT05BTCwKKyAgICBPVVQgRUZJX0lQNl9NT0RFX0RBVEEgICAgICAgICAgICAgICAqSXA2TW9kZURhdGEgICAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9NQU5BR0VEX05FVFdPUktfQ09ORklHX0RBVEEgKk1ucENvbmZpZ0RhdGEgIE9QVElPTkFMLAorICAgIE9VVCBFRklfU0lNUExFX05FVFdPUktfTU9ERSAgICAgICAgICpTbnBNb2RlRGF0YSAgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A2X0NPTkZJR1VSRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A2X0NPTkZJR19EQVRBICpUY3A2Q29uZmlnRGF0YSBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfRVZFTlQgIEV2ZW50OworICAgIEVGSV9TVEFUVVMgU3RhdHVzOworfSBFRklfVENQNl9DT01QTEVUSU9OX1RPS0VOOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RDUDZfQ09NUExFVElPTl9UT0tFTiBDb21wbGV0aW9uVG9rZW47Cit9IEVGSV9UQ1A2X0NPTk5FQ1RJT05fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A2X0NPTk5FQ1QpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A2ICAgICAgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A2X0NPTk5FQ1RJT05fVE9LRU4gKkNvbm5lY3Rpb25Ub2tlbgorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVENQNl9DT01QTEVUSU9OX1RPS0VOIENvbXBsZXRpb25Ub2tlbjsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgIE5ld0NoaWxkSGFuZGxlOworfSBFRklfVENQNl9MSVNURU5fVE9LRU47CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UQ1A2X0FDQ0VQVCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgICAgICAqVGhpcywKKyAgICBJTiBFRklfVENQNl9MSVNURU5fVE9LRU4gKkxpc3RlblRva2VuCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiBGcmFnbWVudExlbmd0aDsKKyAgICBWT0lEICAgKkZyYWdtZW50QnVmZmVyOworfSBFRklfVENQNl9GUkFHTUVOVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICBVcmdlbnRGbGFnOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX1RDUDZfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfVENQNl9SRUNFSVZFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgIFB1c2g7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICBVcmdlbnQ7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfVENQNl9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9UQ1A2X1RSQU5TTUlUX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVENQNl9DT01QTEVUSU9OX1RPS0VOICBDb21wbGV0aW9uVG9rZW47CisgICAgdW5pb24geworCUVGSV9UQ1A2X1JFQ0VJVkVfREFUQSAgKlJ4RGF0YTsKKwlFRklfVENQNl9UUkFOU01JVF9EQVRBICpUeERhdGE7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0OworfSBFRklfVENQNl9JT19UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfVFJBTlNNSVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A2ICAqVGhpcywKKyAgICBJTiBFRklfVENQNl9JT19UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVENQNl9SRUNFSVZFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVENQNiAgKlRoaXMsCisgICAgSU4gRUZJX1RDUDZfSU9fVE9LRU4gKlRva2VuCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9UQ1A2X0NPTVBMRVRJT05fVE9LRU4gQ29tcGxldGlvblRva2VuOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgQWJvcnRPbkNsb3NlOworfSBFRklfVENQNl9DTE9TRV9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfQ0xPU0UpKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A2X0NMT1NFX1RPS0VOICpDbG9zZVRva2VuCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfQ0FOQ0VMKSgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9UQ1A2ICAgICAgICAgICpUaGlzLAorICAgIElOIEVGSV9UQ1A2X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1RDUDZfUE9MTCkgKAorICAgIElOIHN0cnVjdCBfRUZJX1RDUDYgKlRoaXMKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX1RDUDYgeworICAgIEVGSV9UQ1A2X0dFVF9NT0RFX0RBVEEgR2V0TW9kZURhdGE7CisgICAgRUZJX1RDUDZfQ09ORklHVVJFICAgICBDb25maWd1cmU7CisgICAgRUZJX1RDUDZfQ09OTkVDVCAgICAgICBDb25uZWN0OworICAgIEVGSV9UQ1A2X0FDQ0VQVCAgICAgICAgQWNjZXB0OworICAgIEVGSV9UQ1A2X1RSQU5TTUlUICAgICAgVHJhbnNtaXQ7CisgICAgRUZJX1RDUDZfUkVDRUlWRSAgICAgICBSZWNlaXZlOworICAgIEVGSV9UQ1A2X0NMT1NFICAgICAgICAgQ2xvc2U7CisgICAgRUZJX1RDUDZfQ0FOQ0VMICAgICAgICBDYW5jZWw7CisgICAgRUZJX1RDUDZfUE9MTCAgICAgICAgICBQb2xsOworfSBFRklfVENQNjsKKworI2VuZGlmIC8qIF9FRklfVENQX0ggKi8KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXVkcC5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpdWRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4YjQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXVkcC5oCkBAIC0wLDAgKzEsMjcyIEBACisjaWZuZGVmIF9FRklfVURQX0gKKyNkZWZpbmUgX0VGSV9VRFBfSAorCisKKy8qKysKK0NvcHlyaWdodCAoYykgMjAxMyAgSW50ZWwgQ29ycG9yYXRpb24KKworLS0qLworCisjZGVmaW5lIEVGSV9VRFA0X1NFUlZJQ0VfQklORElOR19QUk9UT0NPTCBcCisgICAgeyAweDgzZjAxNDY0LCAweDk5YmQsIDB4NDVlNSwgezB4YjMsIDB4ODMsIDB4YWYsIDB4NjMsIDB4MDUsIDB4ZDgsIDB4ZTksIDB4ZTZ9IH0KKworI2RlZmluZSBFRklfVURQNF9QUk9UT0NPTCBcCisgICAgeyAweDNhZDlkZjI5LCAweDQ1MDEsIDB4NDc4ZCwgezB4YjEsIDB4ZjgsIDB4N2YsIDB4N2YsIDB4ZTcsIDB4MGUsIDB4NTAsIDB4ZjN9IH0KKworI2RlZmluZSBFRklfVURQNl9TRVJWSUNFX0JJTkRJTkdfUFJPVE9DT0wgXAorICAgIHsgMHg2NmVkNDcyMSwgMHgzYzk4LCAweDRkM2UsIHsweDgxLCAweGUzLCAweGQwLCAweDNkLCAweGQzLCAweDlhLCAweDcyLCAweDU0fSB9CisKKyNkZWZpbmUgRUZJX1VEUDZfUFJPVE9DT0wgXAorICAgIHsgMHg0Zjk0ODgxNSwgMHhiNGI5LCAweDQzY2IsIHsweDhhLCAweDMzLCAweDkwLCAweGUwLCAweDYwLCAweGIzLDB4NDksIDB4NTV9IH0KKworSU5URVJGQUNFX0RFQ0woX0VGSV9VRFA0KTsKK0lOVEVSRkFDRV9ERUNMKF9FRklfVURQNik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdEJyb2FkY2FzdDsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdFByb21pc2N1b3VzOworICAgIEJPT0xFQU4gICAgICAgICAgQWNjZXB0QW55UG9ydDsKKyAgICBCT09MRUFOICAgICAgICAgIEFsbG93RHVwbGljYXRlUG9ydDsKKyAgICBVSU5UOCAgICAgICAgICAgIFR5cGVPZlNlcnZpY2U7CisgICAgVUlOVDggICAgICAgICAgICBUaW1lVG9MaXZlOworICAgIEJPT0xFQU4gICAgICAgICAgRG9Ob3RGcmFnbWVudDsKKyAgICBVSU5UMzIgICAgICAgICAgIFJlY2VpdmVUaW1lb3V0OworICAgIFVJTlQzMiAgICAgICAgICAgVHJhbnNtaXRUaW1lb3V0OworICAgIEJPT0xFQU4gICAgICAgICAgVXNlRGVmYXVsdEFkZHJlc3M7CisgICAgRUZJX0lQdjRfQUREUkVTUyBTdGF0aW9uQWRkcmVzczsKKyAgICBFRklfSVB2NF9BRERSRVNTIFN1Ym5ldE1hc2s7CisgICAgVUlOVDE2ICAgICAgICAgICBTdGF0aW9uUG9ydDsKKyAgICBFRklfSVB2NF9BRERSRVNTIFJlbW90ZUFkZHJlc3M7CisgICAgVUlOVDE2ICAgICAgICAgICBSZW1vdGVQb3J0OworfSBFRklfVURQNF9DT05GSUdfREFUQTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDRfR0VUX01PREVfREFUQSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDQgICAgICAgICAgICAgICAgICpUaGlzLAorICAgIE9VVCBFRklfVURQNF9DT05GSUdfREFUQSAgICAgICAgICAgICpVZHA0Q29uZmlnRGF0YSBPUFRJT05BTCwKKyAgICBPVVQgRUZJX0lQNF9NT0RFX0RBVEEgICAgICAgICAgICAgICAqSXA0TW9kZURhdGEgICAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9NQU5BR0VEX05FVFdPUktfQ09ORklHX0RBVEEgKk1ucENvbmZpZ0RhdGEgIE9QVElPTkFMLAorICAgIE9VVCBFRklfU0lNUExFX05FVFdPUktfTU9ERSAgICAgICAgICpTbnBNb2RlRGF0YSAgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA0X0NPTkZJR1VSRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDQgICAgICpUaGlzLAorICAgIElOIEVGSV9VRFA0X0NPTkZJR19EQVRBICpVZHBDb25maWdEYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDRfR1JPVVBTKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgIEpvaW5GbGFnLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKk11bHRpY2FzdEFkZHJlc3MgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9ST1VURVMpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA0ICpUaGlzLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgRGVsZXRlUm91dGUsCisgICAgSU4gRUZJX0lQdjRfQUREUkVTUyAqU3VibmV0QWRkcmVzcywKKyAgICBJTiBFRklfSVB2NF9BRERSRVNTICpTdWJuZXRNYXNrLAorICAgIElOIEVGSV9JUHY0X0FERFJFU1MgKkdhdGV3YXlBZGRyZXNzCisgICAgKTsKKworI2RlZmluZSBFRklfTkVUV09SS19VTlJFQUNIQUJMRSAgRUZJRVJSKDEwMCkKKyNkZWZpbmUgRUZJX0hPU1RfVU5SRUFDSEFCTEUgICAgIEVGSUVSUigxMDEpCisjZGVmaW5lIEVGSV9QUk9UT0NPTF9VTlJFQUNIQUJMRSBFRklFUlIoMTAyKQorI2RlZmluZSBFRklfUE9SVF9VTlJFQUNIQUJMRSAgICAgRUZJRVJSKDEwMykKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9JUHY0X0FERFJFU1MgU291cmNlQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIFNvdXJjZVBvcnQ7CisgICAgRUZJX0lQdjRfQUREUkVTUyBEZXN0aW5hdGlvbkFkZHJlc3M7CisgICAgVUlOVDE2ICAgICAgICAgICBEZXN0aW5hdGlvblBvcnQ7Cit9IEVGSV9VRFA0X1NFU1NJT05fREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiBGcmFnbWVudExlbmd0aDsKKyAgICBWT0lEICAgKkZyYWdtZW50QnVmZmVyOworfSBFRklfVURQNF9GUkFHTUVOVF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1RJTUUgICAgICAgICAgICAgICBUaW1lU3RhbXA7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgICBSZWN5Y2xlU2lnbmFsOworICAgIEVGSV9VRFA0X1NFU1NJT05fREFUQSAgVWRwU2Vzc2lvbjsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9VRFA0X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX1VEUDRfUkVDRUlWRV9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX1VEUDRfU0VTU0lPTl9EQVRBICAqVWRwU2Vzc2lvbkRhdGE7CisgICAgRUZJX0lQdjRfQUREUkVTUyAgICAgICAqR2F0ZXdheUFkZHJlc3M7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRnJhZ21lbnRDb3VudDsKKyAgICBFRklfVURQNF9GUkFHTUVOVF9EQVRBIEZyYWdtZW50VGFibGVbMV07Cit9IEVGSV9VRFA0X1RSQU5TTUlUX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgICAgICBFdmVudDsKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICAgICBTdGF0dXM7CisgICAgdW5pb24geworICAgICAgICBFRklfVURQNF9SRUNFSVZFX0RBVEEgICpSeERhdGE7CisJRUZJX1VEUDRfVFJBTlNNSVRfREFUQSAqVHhEYXRhOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldDsKK30gRUZJX1VEUDRfQ09NUExFVElPTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDRfVFJBTlNNSVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA0ICAgICAgICAgICpUaGlzLAorICAgIElOIEVGSV9VRFA0X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDRfUkVDRUlWRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDRfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9DQU5DRUwpKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDQgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDRfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4gT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNF9QT0xMKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNCAqVGhpcworICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfVURQNCB7CisgICAgRUZJX1VEUDRfR0VUX01PREVfREFUQSBHZXRNb2RlRGF0YTsKKyAgICBFRklfVURQNF9DT05GSUdVUkUgICAgIENvbmZpZ3VyZTsKKyAgICBFRklfVURQNF9HUk9VUFMgICAgICAgIEdyb3VwczsKKyAgICBFRklfVURQNF9ST1VURVMgICAgICAgIFJvdXRlczsKKyAgICBFRklfVURQNF9UUkFOU01JVCAgICAgIFRyYW5zbWl0OworICAgIEVGSV9VRFA0X1JFQ0VJVkUgICAgICAgUmVjZWl2ZTsKKyAgICBFRklfVURQNF9DQU5DRUwgICAgICAgIENhbmNlbDsKKyAgICBFRklfVURQNF9QT0xMICAgICAgICAgIFBvbGw7Cit9IEVGSV9VRFA0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgICAgICBBY2NlcHRQcm9taXNjdW91czsKKyAgICBCT09MRUFOICAgICAgICAgIEFjY2VwdEFueVBvcnQ7CisgICAgQk9PTEVBTiAgICAgICAgICBBbGxvd0R1cGxpY2F0ZVBvcnQ7CisgICAgVUlOVDggICAgICAgICAgICBUcmFmZmljQ2xhc3M7CisgICAgVUlOVDggICAgICAgICAgICBIb3BMaW1pdDsKKyAgICBVSU5UMzIgICAgICAgICAgIFJlY2VpdmVUaW1lb3V0OworICAgIFVJTlQzMiAgICAgICAgICAgVHJhbnNtaXRUaW1lb3V0OworICAgIEVGSV9JUHY2X0FERFJFU1MgU3RhdGlvbkFkZHJlc3M7CisgICAgVUlOVDE2ICAgICAgICAgICBTdGF0aW9uUG9ydDsKKyAgICBFRklfSVB2Nl9BRERSRVNTIFJlbW90ZUFkZHJlc3M7CisgICAgVUlOVDE2ICAgICAgICAgICBSZW1vdGVQb3J0OworfSBFRklfVURQNl9DT05GSUdfREFUQTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDZfR0VUX01PREVfREFUQSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDYgICAgICAgICAgICAgICAgICpUaGlzLAorICAgIE9VVCBFRklfVURQNl9DT05GSUdfREFUQSAgICAgICAgICAgICpVZHA2Q29uZmlnRGF0YSBPUFRJT05BTCwKKyAgICBPVVQgRUZJX0lQNl9NT0RFX0RBVEEgICAgICAgICAgICAgICAqSXA2TW9kZURhdGEgICAgT1BUSU9OQUwsCisgICAgT1VUIEVGSV9NQU5BR0VEX05FVFdPUktfQ09ORklHX0RBVEEgKk1ucENvbmZpZ0RhdGEgIE9QVElPTkFMLAorICAgIE9VVCBFRklfU0lNUExFX05FVFdPUktfTU9ERSAgICAgICAgICpTbnBNb2RlRGF0YSAgICBPUFRJT05BTAorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VRFA2X0NPTkZJR1VSRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDYgICAgICpUaGlzLAorICAgIElOIEVGSV9VRFA2X0NPTkZJR19EQVRBICpVZHBDb25maWdEYXRhIE9QVElPTkFMCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDZfR1JPVVBTKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAqVGhpcywKKyAgICBJTiBCT09MRUFOICAgICAgICAgIEpvaW5GbGFnLAorICAgIElOIEVGSV9JUHY2X0FERFJFU1MgKk11bHRpY2FzdEFkZHJlc3MgT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0lQdjZfQUREUkVTUyBTb3VyY2VBZGRyZXNzOworICAgIFVJTlQxNiAgICAgICAgICAgU291cmNlUG9ydDsKKyAgICBFRklfSVB2Nl9BRERSRVNTIERlc3RpbmF0aW9uQWRkcmVzczsKKyAgICBVSU5UMTYgICAgICAgICAgIERlc3RpbmF0aW9uUG9ydDsKK30gRUZJX1VEUDZfU0VTU0lPTl9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyIEZyYWdtZW50TGVuZ3RoOworICAgIFZPSUQgICAqRnJhZ21lbnRCdWZmZXI7Cit9IEVGSV9VRFA2X0ZSQUdNRU5UX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVElNRSAgICAgICAgICAgICAgIFRpbWVTdGFtcDsKKyAgICBFRklfRVZFTlQgICAgICAgICAgICAgIFJlY3ljbGVTaWduYWw7CisgICAgRUZJX1VEUDZfU0VTU0lPTl9EQVRBICBVZHBTZXNzaW9uOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIEZyYWdtZW50Q291bnQ7CisgICAgRUZJX1VEUDZfRlJBR01FTlRfREFUQSBGcmFnbWVudFRhYmxlWzFdOworfSBFRklfVURQNl9SRUNFSVZFX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBFRklfVURQNl9TRVNTSU9OX0RBVEEgICpVZHBTZXNzaW9uRGF0YTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICBGcmFnbWVudENvdW50OworICAgIEVGSV9VRFA2X0ZSQUdNRU5UX0RBVEEgRnJhZ21lbnRUYWJsZVsxXTsKK30gRUZJX1VEUDZfVFJBTlNNSVRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9FVkVOVCAgICAgICAgICAgICAgICAgIEV2ZW50OworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgIFN0YXR1czsKKyAgICB1bmlvbiB7CisgICAgICAgIEVGSV9VRFA2X1JFQ0VJVkVfREFUQSAgKlJ4RGF0YTsKKyAgICAgICAgRUZJX1VEUDZfVFJBTlNNSVRfREFUQSAqVHhEYXRhOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldDsKK30gRUZJX1VEUDZfQ09NUExFVElPTl9UT0tFTjsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDZfVFJBTlNNSVQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9VRFA2ICAgICAgICAgICpUaGlzLAorICAgIElOIEVGSV9VRFA2X0NPTVBMRVRJT05fVE9LRU4gKlRva2VuCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VEUDZfUkVDRUlWRSkgKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDZfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4KKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9DQU5DRUwpKAorICAgIElOIHN0cnVjdCBfRUZJX1VEUDYgICAgICAgICAgKlRoaXMsCisgICAgSU4gRUZJX1VEUDZfQ09NUExFVElPTl9UT0tFTiAqVG9rZW4gT1BUSU9OQUwKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVURQNl9QT0xMKSAoCisgICAgSU4gc3RydWN0IF9FRklfVURQNiAqVGhpcworICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfVURQNiB7CisgICAgRUZJX1VEUDZfR0VUX01PREVfREFUQSBHZXRNb2RlRGF0YTsKKyAgICBFRklfVURQNl9DT05GSUdVUkUgICAgIENvbmZpZ3VyZTsKKyAgICBFRklfVURQNl9HUk9VUFMgICAgICAgIEdyb3VwczsKKyAgICBFRklfVURQNl9UUkFOU01JVCAgICAgIFRyYW5zbWl0OworICAgIEVGSV9VRFA2X1JFQ0VJVkUgICAgICAgUmVjZWl2ZTsKKyAgICBFRklfVURQNl9DQU5DRUwgICAgICAgIENhbmNlbDsKKyAgICBFRklfVURQNl9QT0xMICAgICAgICAgIFBvbGw7Cit9IEVGSV9VRFA2OworCisjZW5kaWYgLyogX0VGSV9VRFBfSCAqLwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvZWZpdWkuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXVpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0MTk0MwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2VmaXVpLmgKQEAgLTAsMCArMSw1NCBAQAorI2lmbmRlZiBfRUZJX1VJX0gKKyNkZWZpbmUgX0VGSV9VSV9ICisKKy8qKysKKworQ29weXJpZ2h0IChjKSAyMDAgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgRWZpVWkuaAorICAgIAorQWJzdHJhY3Q6ICAgCisgICAgUHJvdG9jb2wgdXNlZCB0byBidWlsZCBVc2VyIEludGVyZmFjZSAoVUkpIHN0dWZmLgorCisgICAgVGhpcyBwcm90b2NvbCBpcyBqdXN0IGRhdGEuIEl0IGlzIGEgbXVsdGkgZGltZW50aW9uYWwgYXJyYXkuCisgICAgRm9yIGVhY2ggc3RyaW5nIHRoZXJlIGlzIGFuIGFycmF5IG9mIFVJX1NUUklOR19FTlRSWS4gRWFjaCBzdHJpbmcKKyAgICBpcyBmb3IgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgdHJhbnNsYXRpb24gb2YgdGhlIHNhbWUgc3RyaW5nLiBUaGUgbGlzdCAKKyAgICBpcyB0ZXJtaW5hdGVkIGJ5IGEgTlVMTCBVaVN0cmluZy4gVGhlcmUgY2FuIGJlIGFueSBudW1iZXIgb2YgCisgICAgVUlfU1RSSU5HX0VOVFJZIGFycmF5cy4gQSBOVUxMIGFycmF5IHRlcm1pbmF0ZXMgdGhlIGxpc3QuIEEgTlVMTCBhcnJheQorICAgIGVudHJ5IGNvbnRhaW5zIGFsbCB6ZXJvcy4gIAorCisgICAgVGh1cyB0aGUgc2hvcnRlc3QgcG9zc2libGUgRUZJX1VJX1BST1RPQ09MIGhhcyB0aHJlZSBVSV9TVFJJTkdfRU5UUlkuCisgICAgVGhlIFN0cmluZywgaXQncyBOVUxMIHRlcm1pbmF0b3IsIGFuZCB0aGUgTlVMTCB0ZXJtaW5hdG9yIGZvciB0aGUgZW50aXJlIAorICAgIHRoaW5nLgorCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjZGVmaW5lIEVGSV9VSV9QUk9UT0NPTCBcCisgICAgeyAweDMyZGQ3OTgxLCAweDJkMjcsIDB4MTFkNCwgezB4YmMsIDB4OGIsIDB4MCwgMHg4MCwgMHhjNywgMHgzYywgMHg4OCwgMHg4MX0gfQorCisKK3R5cGVkZWYgZW51bSB7CisgICAgVWlEZXZpY2VTdHJpbmcsCisgICAgVWlWZW5kb3JTdHJpbmcsCisgICAgVWlNYXhTdHJpbmcKK30gVUlfU1RSSU5HX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBJU09fNjM5XzIgICAqTGFuZ0NvZGU7CisgICAgQ0hBUjE2ICAgICAgKlVpU3RyaW5nOworfSBVSV9TVFJJTkdfRU5UUlk7CisKKyNkZWZpbmUgRUZJX1VJX1ZFUlNJT04gICAgICAweDAwMDEwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9VSV9JTlRFUkZBQ0UgeworICAgIFVJTlQzMiAgICAgICAgICBWZXJzaW9uOworICAgIFVJX1NUUklOR19FTlRSWSAqRW50cnk7Cit9IFVJX0lOVEVSRkFDRTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhMzIvZWZpYmluZC5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvaWEzMi9lZmliaW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViOWQxNgotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhMzIvZWZpYmluZC5oCkBAIC0wLDAgKzEsMjg0IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmVmaW5kLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgdG8gY29tcGlsZSBiaW5kaW5ncworCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBwYWNrKCkKKyNlbmRpZgorCisvLworLy8gQmFzaWMgaW50IHR5cGVzIG9mIHZhcmlvdXMgd2lkdGhzCisvLworCisjaWYgIWRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgfHwgKF9fU1REQ19WRVJTSU9OX18gPCAxOTk5MDFMICkKKworICAgIC8vIE5vIEFOU0kgQyAxOTk5LzIwMDAgc3RkaW50LmggaW50ZWdlciB3aWR0aCBkZWNsYXJhdGlvbnMgCisKKyAgICAjaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpCisKKyAgICAgICAgLy8gVXNlIE1pY3Jvc29mdCBDIGNvbXBpbGVyIGludGVnZXIgd2lkdGggZGVjbGFyYXRpb25zIAorCisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICB1aW50NjRfdDsKKyAgICAgICAgdHlwZWRlZiBfX2ludDY0ICAgICAgICAgICAgIGludDY0X3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQzMiAgICB1aW50MzJfdDsKKyAgICAgICAgdHlwZWRlZiBfX2ludDMyICAgICAgICAgICAgIGludDMyX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1aW50MTZfdDsKKyAgICAgICAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAgIGludDE2X3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1aW50OF90OworICAgICAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgaW50OF90OworICAgICNlbGlmIGRlZmluZWQoX19HTlVDX18pCisgICAgICAgIHR5cGVkZWYgaW50IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKSAgICAgICAgICAgaW50NjRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpICB1aW50NjRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQzMl90OworICAgICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgaW50MzJfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVpbnQxNl90OworICAgICAgICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgaW50MTZfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVpbnQ4X3Q7CisgICAgICAgIHR5cGVkZWYgc2lnbmVkIGNoYXIgICAgICAgICBpbnQ4X3Q7CisgICAgI2VsaWYgZGVmaW5lZChVTklYX0xQNjQpCisKKyAgICAgICAgLyogIFVzZSBMUDY0IHByb2dyYW1taW5nIG1vZGVsIGZyb20gQ19GTEFHUyBmb3IgaW50ZWdlciB3aWR0aCBkZWNsYXJhdGlvbnMgKi8KKworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICB1aW50NjRfdDsKKyAgICAgICB0eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgaW50NjRfdDsKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdWludDMyX3Q7CisgICAgICAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgIGludDMyX3Q7CisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVpbnQxNl90OworICAgICAgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBpbnQxNl90OworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1aW50OF90OworICAgICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBpbnQ4X3Q7CisgICAgI2Vsc2UKKworICAgICAgIC8qICBBc3N1bWUgUDY0IHByb2dyYW1taW5nIG1vZGVsIGZyb20gQ19GTEFHUyBmb3IgaW50ZWdlciB3aWR0aCBkZWNsYXJhdGlvbnMgKi8KKworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1aW50NjRfdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworICAgICAgIHR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICBpbnQ2NF90IF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDgpKSk7CisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQzMl90OworICAgICAgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBpbnQzMl90OworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1aW50MTZfdDsKKyAgICAgICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgaW50MTZfdDsKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdWludDhfdDsKKyAgICAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgaW50OF90OworICAgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgICAjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworLy8KKy8vIEJhc2ljIEVGSSB0eXBlcyBvZiB2YXJpb3VzIHdpZHRocworLy8KKworI2lmbmRlZiBfX1dDSEFSX1RZUEVfXworIyBkZWZpbmUgX19XQ0hBUl9UWVBFX18gc2hvcnQKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQ2NF90ICAgVUlOVDY0OwordHlwZWRlZiBpbnQ2NF90ICAgIElOVDY0OworCisjaWZuZGVmIF9CQVNFVFNEX0hfCisgICAgdHlwZWRlZiB1aW50MzJfdCAgIFVJTlQzMjsKKyAgICB0eXBlZGVmIGludDMyX3QgICAgSU5UMzI7CisjZW5kaWYKKwordHlwZWRlZiB1aW50MTZfdCAgIFVJTlQxNjsKK3R5cGVkZWYgaW50MTZfdCAgICBJTlQxNjsKK3R5cGVkZWYgdWludDhfdCAgICBVSU5UODsKK3R5cGVkZWYgaW50OF90ICAgICBJTlQ4OwordHlwZWRlZiBfX1dDSEFSX1RZUEVfXyBXQ0hBUjsKKworI3VuZGVmIFZPSUQKKyNkZWZpbmUgVk9JRCAgICB2b2lkCisKKwordHlwZWRlZiBpbnQzMl90ICAgIElOVE47Cit0eXBlZGVmIHVpbnQzMl90ICAgVUlOVE47CisKKyNpZmRlZiBFRklfTlRfRU1VTEFUT1IKKyAgICAjZGVmaW5lIFBPU1RfQ09ERShfRGF0YSkKKyNlbHNlICAgIAorICAgICNpZmRlZiBFRklfREVCVUcKKyNkZWZpbmUgUE9TVF9DT0RFKF9EYXRhKSAgICBfX2FzbSBtb3YgZWF4LChfRGF0YSkgX19hc20gb3V0IDB4ODAsYWwKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIFBPU1RfQ09ERShfRGF0YSkKKyAgICAjZW5kaWYgIAorI2VuZGlmCisKKyNkZWZpbmUgRUZJRVJSKGEpICAgICAgICAgICAoMHg4MDAwMDAwMCB8IGEpCisjZGVmaW5lIEVGSV9FUlJPUl9NQVNLICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBFRklFUlJfT0VNKGEpICAgICAgICgweGMwMDAwMDAwIHwgYSkgICAgICAKKworCisjZGVmaW5lIEJBRF9QT0lOVEVSICAgICAgICAgMHhGQkZCRkJGQgorI2RlZmluZSBNQVhfQUREUkVTUyAgICAgICAgIDB4RkZGRkZGRkYKKworI2lmZGVmIEVGSV9OVF9FTVVMQVRPUgorICAgICNkZWZpbmUgQlJFQUtQT0lOVCgpICAgICAgICBfX2FzbSB7IGludCAzIH0KKyNlbHNlCisgICAgI2RlZmluZSBCUkVBS1BPSU5UKCkgICAgICAgIHdoaWxlIChUUlVFKTsgICAgLy8gTWFrZSBpdCBoYW5nIG9uIEJpb3NbRGJnXTMyCisjZW5kaWYKKworLy8KKy8vIFBvaW50ZXJzIG11c3QgYmUgYWxpZ25lZCB0byB0aGVzZSBhZGRyZXNzIHRvIGZ1bmN0aW9uCisvLworCisjZGVmaW5lIE1JTl9BTElHTk1FTlRfU0laRSAgNAorCisjZGVmaW5lIEFMSUdOX1ZBUklBQkxFKFZhbHVlICxBZGp1c3RtZW50KSBcCisgICAgICAgICAgICAoVUlOVE4pQWRqdXN0bWVudCA9IDA7IFwKKyAgICAgICAgICAgIGlmKChVSU5UTilWYWx1ZSAlIE1JTl9BTElHTk1FTlRfU0laRSkgXAorICAgICAgICAgICAgICAgIChVSU5UTilBZGp1c3RtZW50ID0gTUlOX0FMSUdOTUVOVF9TSVpFIC0gKChVSU5UTilWYWx1ZSAlIE1JTl9BTElHTk1FTlRfU0laRSk7IFwKKyAgICAgICAgICAgIFZhbHVlID0gKFVJTlROKVZhbHVlICsgKFVJTlROKUFkanVzdG1lbnQKKworCisvLworLy8gRGVmaW5lIG1hY3JvcyB0byBidWlsZCBkYXRhIHN0cnVjdHVyZSBzaWduYXR1cmVzIGZyb20gY2hhcmFjdGVycy4KKy8vCisKKyNkZWZpbmUgRUZJX1NJR05BVFVSRV8xNihBLEIpICAgICAgICAgICAgICgoQSkgfCAoQjw8OCkpCisjZGVmaW5lIEVGSV9TSUdOQVRVUkVfMzIoQSxCLEMsRCkgICAgICAgICAoRUZJX1NJR05BVFVSRV8xNihBLEIpICAgICB8IChFRklfU0lHTkFUVVJFXzE2KEMsRCkgICAgIDw8IDE2KSkKKyNkZWZpbmUgRUZJX1NJR05BVFVSRV82NChBLEIsQyxELEUsRixHLEgpIChFRklfU0lHTkFUVVJFXzMyKEEsQixDLEQpIHwgKChVSU5UNjQpKEVGSV9TSUdOQVRVUkVfMzIoRSxGLEcsSCkpIDw8IDMyKSkKKy8vCisvLyBUbyBleHBvcnQgJiBpbXBvcnQgZnVuY3Rpb25zIGluIHRoZSBFRkkgZW11bGF0b3IgZW52aXJvbm1lbnQKKy8vCisKKyNpZmRlZiBFRklfTlRfRU1VTEFUT1IKKyAgICAjZGVmaW5lIEVYUE9SVEFQSSAgICAgICAgICAgX19kZWNsc3BlYyggZGxsZXhwb3J0ICkKKyNlbHNlCisgICAgI2RlZmluZSBFWFBPUlRBUEkKKyNlbmRpZgorCisKKy8vCisvLyBFRklBUEkgLSBwcm90b3R5cGUgY2FsbGluZyBjb252ZW50aW9uIGZvciBFRkkgZnVuY3Rpb24gcG9pbnRlcnMKKy8vIEJPT1RTRVJWSUNFIC0gcHJvdG90eXBlIGZvciBpbXBsZW1lbnRhdGlvbiBvZiBhIGJvb3Qgc2VydmljZSBpbnRlcmZhY2UKKy8vIFJVTlRJTUVTRVJWSUNFIC0gcHJvdG90eXBlIGZvciBpbXBsZW1lbnRhdGlvbiBvZiBhIHJ1bnRpbWUgc2VydmljZSBpbnRlcmZhY2UKKy8vIFJVTlRJTUVGVU5DVElPTiAtIHByb3RvdHlwZSBmb3IgaW1wbGVtZW50YXRpb24gb2YgYSBydW50aW1lIGZ1bmN0aW9uIHRoYXQgaXMgbm90IGEgc2VydmljZQorLy8gUlVOVElNRV9DT0RFIC0gcHJhZ21hIG1hY3JvIGZvciBkZWNsYXJpbmcgcnVudGltZSBjb2RlICAgIAorLy8KKworI2lmbmRlZiBFRklBUEkgICAgICAgICAgICAgICAgICAvLyBGb3JjZXMgRUZJIGNhbGxpbmcgY29udmVudGlvbnMgcmVndWFyZGxlc3Mgb2YgY29tcGlsZXIgb3B0aW9ucyAKKyAgICAjaWZkZWYgX01TQ19FWFRFTlNJT05TCisgICAgICAgICNkZWZpbmUgRUZJQVBJIF9fY2RlY2wgIC8vIEZvcmNlIEMgY2FsbGluZyBjb252ZW50aW9uIGZvciBNaWNyb3NvZnQgQyBjb21waWxlciAKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIEVGSUFQSSAgICAgICAgICAvLyBTdWJzdGl0dXRlIGV4cHJlc2lvbiB0byBmb3JjZSBDIGNhbGxpbmcgY29udmVudGlvbiAKKyAgICAjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEJPT1RTRVJWSUNFCisvLyNkZWZpbmUgUlVOVElNRVNFUlZJQ0UocHJvdG8sYSkgICAgYWxsb2NfdGV4dCgicnRjb2RlIixhKTsgcHJvdG8gYQorLy8jZGVmaW5lIFJVTlRJTUVGVU5DVElPTihwcm90byxhKSAgIGFsbG9jX3RleHQoInJ0Y29kZSIsYSk7IHByb3RvIGEKKyNkZWZpbmUgUlVOVElNRVNFUlZJQ0UKKyNkZWZpbmUgUlVOVElNRUZVTkNUSU9OCisKKworI2RlZmluZSBSVU5USU1FX0NPREUoYSkgICAgICAgICBhbGxvY190ZXh0KCJydGNvZGUiLCBhKQorI2RlZmluZSBCRUdJTl9SVU5USU1FX0RBVEEoKSAgICBkYXRhX3NlZygicnRkYXRhIikKKyNkZWZpbmUgRU5EX1JVTlRJTUVfREFUQSgpICAgICAgZGF0YV9zZWcoIiIpCisKKyNkZWZpbmUgVk9MQVRJTEUgICAgdm9sYXRpbGUKKworI2RlZmluZSBNRU1PUllfRkVOQ0UoKSAgICAKKworI2lmZGVmIEVGSV9OVF9FTVVMQVRPUgorCisvLworLy8gVG8gaGVscCBlbnN1cmUgcHJvcGVyIGNvZGluZyBvZiBpbnRlZ3JhdGVkIGRyaXZlcnMsIHRoZXkgYXJlCisvLyBjb21waWxlZCBhcyBETExzLiAgSW4gTlQgdGhleSByZXF1aXJlIGEgZGxsIGluaXQgZW50cnkgcG9pbnRlci4KKy8vIFRoZSBtYWNybyBwdXRzIGEgc3R1YiBlbnRyeSBwb2ludCBpbnRvIHRoZSBETEwgc28gaXQgd2lsbCBsb2FkLgorLy8KKworI2RlZmluZSBFRklfRFJJVkVSX0VOVFJZX1BPSU5UKEluaXRGdW5jdGlvbikgICAgXAorICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fc3RkY2FsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9EbGxNYWluQ1JUU3RhcnR1cCAoICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBVSU5UTiAgICBJbnN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBVSU5UTiAgICByZWFzb25fZm9yX2NhbGwsICAgICAgICAgICAgICAgXAorICAgICAgICBWT0lEICAgICpyc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVYUE9SVEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fY2RlY2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEluaXRpYWxpemVEcml2ZXIgKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2b2lkICpJbWFnZUhhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2b2lkICpTeXN0ZW1UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gSW5pdEZ1bmN0aW9uKEltYWdlSGFuZGxlLCBTeXN0ZW1UYWJsZSk7ICAgICAgIFwKKyAgICB9CisKKworICAgICNkZWZpbmUgTE9BRF9JTlRFUk5BTF9EUklWRVIoX2lmLCB0eXBlLCBuYW1lLCBlbnRyeSkgICAgICBcCisgICAgICAgIChfaWYpLT5Mb2FkSW50ZXJuYWwodHlwZSwgbmFtZSwgTlVMTCkgICAgICAgICAgICAgCisKKyNlbHNlIC8vIEVGSV9OVF9FTVVMQVRPUiAKKworLy8KKy8vIFdoZW4gYnVpbGQgc2ltaWxpYXIgdG8gRlcsIHRoZW4gbGluayBldmVyeXRoaW5nIHRvZ2V0aGVyIGFzCisvLyBvbmUgYmlnIG1vZHVsZS4KKy8vCisKKyAgICAjZGVmaW5lIEVGSV9EUklWRVJfRU5UUllfUE9JTlQoSW5pdEZ1bmN0aW9uKSAgICBcCisgICAgICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJbml0aWFsaXplRHJpdmVyICggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFZPSUQgICAgKkltYWdlSGFuZGxlLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBWT0lEICAgICpTeXN0ZW1UYWJsZSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gSW5pdEZ1bmN0aW9uKEltYWdlSGFuZGxlLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UYWJsZSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBFRklfU1RBVFVTIGVmaV9tYWluKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEVGSV9IQU5ETEUgaW1hZ2UsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBFRklfU1lTVEVNX1RBQkxFICpzeXN0YWIgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYWxpYXMgKCJJbml0aWFsaXplRHJpdmVyIikpKTsKKworICAgICNkZWZpbmUgTE9BRF9JTlRFUk5BTF9EUklWRVIoX2lmLCB0eXBlLCBuYW1lLCBlbnRyeSkgICAgXAorICAgICAgICAgICAgKF9pZiktPkxvYWRJbnRlcm5hbCh0eXBlLCBuYW1lLCBlbnRyeSkKKworI2VuZGlmIC8vIEVGSV9GV19OVCAKKworLy8KKy8vIFNvbWUgY29tcGlsZXJzIGRvbid0IHN1cHBvcnQgdGhlIGZvcndhcmQgcmVmZXJlbmNlIGNvbnN0cnVjdDoKKy8vICB0eXBlZGVmIHN0cnVjdCBYWFhYWAorLy8KKy8vIFRoZSBmb2xsb3dpbmcgbWFjcm8gcHJvdmlkZSBhIHdvcmthcm91bmQgZm9yIHN1Y2ggY2FzZXMuCisvLworI2lmZGVmIE5PX0lOVEVSRkFDRV9ERUNMCisjZGVmaW5lIElOVEVSRkFDRV9ERUNMKHgpCisjZWxzZQorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIElOVEVSRkFDRV9ERUNMKHgpIHN0cnVjdCB4CisjZWxzZQorI2RlZmluZSBJTlRFUkZBQ0VfREVDTCh4KSB0eXBlZGVmIHN0cnVjdCB4CisjZW5kaWYKKyNlbmRpZgorCisvKiBObyBlZmkgY2FsbCB3cmFwcGVyIGZvciBJQTMyIGFyY2hpdGVjdHVyZSAqLworI2RlZmluZSB1ZWZpX2NhbGxfd3JhcHBlcihmdW5jLCB2YV9udW0sIC4uLikJZnVuYyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgRUZJX0ZVTkNUSU9OCisKKyNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiA0NzMxICkgIC8vIFN1cHByZXNzIHdhcm5pbmdzIGFib3V0IG1vZGlmaWNhdGlvbiBvZiBFQlAKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9pYTMyL2VmaWxpYnBsYXQuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhMzIvZWZpbGlicGxhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDQ1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9pYTMyL2VmaWxpYnBsYXQuaApAQCAtMCwwICsxLDI2IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmlsaWJwbGF0LmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgdG8gY29tcGlsZSBiaW5kaW5ncworCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworVk9JRAorSW5pdGlhbGl6ZUxpYlBsYXRmb3JtICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgICBJTiBFRklfU1lTVEVNX1RBQkxFICAgICAqU3lzdGVtVGFibGUKKyAgICApOworCisgICAKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhMzIvcGUuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhMzIvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzliOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvaWEzMi9wZS5oCkBAIC0wLDAgKzEsNTk1IEBACisvKiAKKyAgICBQRTMyKyBoZWFkZXIgZmlsZQorICovCisjaWZuZGVmIF9QRV9ICisjZGVmaW5lIF9QRV9ICisKKyNkZWZpbmUgSU1BR0VfRE9TX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgMHg1QTREICAgICAgLy8gTVoKKyNkZWZpbmUgSU1BR0VfT1MyX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgMHg0NTRFICAgICAgLy8gTkUKKyNkZWZpbmUgSU1BR0VfT1MyX1NJR05BVFVSRV9MRSAgICAgICAgICAgICAgMHg0NTRDICAgICAgLy8gTEUKKyNkZWZpbmUgSU1BR0VfTlRfU0lHTkFUVVJFICAgICAgICAgICAgICAgICAgMHgwMDAwNDU1MCAgLy8gUEUwMCAgCisjZGVmaW5lIElNQUdFX0VET1NfU0lHTkFUVVJFICAgICAgICAgICAgICAgIDB4NDQ0NTQ1NTAgIC8vIFBFRUQKKworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfRE9TX0hFQURFUiB7ICAgICAgLy8gRE9TIC5FWEUgaGVhZGVyCisgICAgVUlOVDE2ICAgZV9tYWdpYzsgICAgICAgICAgICAgICAgICAgICAvLyBNYWdpYyBudW1iZXIKKyAgICBVSU5UMTYgICBlX2NibHA7ICAgICAgICAgICAgICAgICAgICAgIC8vIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlCisgICAgVUlOVDE2ICAgZV9jcDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYWdlcyBpbiBmaWxlCisgICAgVUlOVDE2ICAgZV9jcmxjOyAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxvY2F0aW9ucworICAgIFVJTlQxNiAgIGVfY3BhcmhkcjsgICAgICAgICAgICAgICAgICAgLy8gU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocworICAgIFVJTlQxNiAgIGVfbWluYWxsb2M7ICAgICAgICAgICAgICAgICAgLy8gTWluaW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZAorICAgIFVJTlQxNiAgIGVfbWF4YWxsb2M7ICAgICAgICAgICAgICAgICAgLy8gTWF4aW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZAorICAgIFVJTlQxNiAgIGVfc3M7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCAocmVsYXRpdmUpIFNTIHZhbHVlCisgICAgVUlOVDE2ICAgZV9zcDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIFNQIHZhbHVlCisgICAgVUlOVDE2ICAgZV9jc3VtOyAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3N1bQorICAgIFVJTlQxNiAgIGVfaXA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBJUCB2YWx1ZQorICAgIFVJTlQxNiAgIGVfY3M7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCAocmVsYXRpdmUpIENTIHZhbHVlCisgICAgVUlOVDE2ICAgZV9sZmFybGM7ICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIGFkZHJlc3Mgb2YgcmVsb2NhdGlvbiB0YWJsZQorICAgIFVJTlQxNiAgIGVfb3ZubzsgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcmxheSBudW1iZXIKKyAgICBVSU5UMTYgICBlX3Jlc1s0XTsgICAgICAgICAgICAgICAgICAgIC8vIFJlc2VydmVkIHdvcmRzCisgICAgVUlOVDE2ICAgZV9vZW1pZDsgICAgICAgICAgICAgICAgICAgICAvLyBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbykKKyAgICBVSU5UMTYgICBlX29lbWluZm87ICAgICAgICAgICAgICAgICAgIC8vIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYworICAgIFVJTlQxNiAgIGVfcmVzMlsxMF07ICAgICAgICAgICAgICAgICAgLy8gUmVzZXJ2ZWQgd29yZHMKKyAgICBVSU5UMzIgICBlX2xmYW5ldzsgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgYWRkcmVzcyBvZiBuZXcgZXhlIGhlYWRlcgorICB9IElNQUdFX0RPU19IRUFERVIsICpQSU1BR0VfRE9TX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX09TMl9IRUFERVIgeyAgICAgIC8vIE9TLzIgLkVYRSBoZWFkZXIKKyAgICBVSU5UMTYgICBuZV9tYWdpYzsgICAgICAgICAgICAgICAgICAgIC8vIE1hZ2ljIG51bWJlcgorICAgIFVJTlQ4ICAgIG5lX3ZlcjsgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbiBudW1iZXIKKyAgICBVSU5UOCAgICBuZV9yZXY7ICAgICAgICAgICAgICAgICAgICAgIC8vIFJldmlzaW9uIG51bWJlcgorICAgIFVJTlQxNiAgIG5lX2VudHRhYjsgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIEVudHJ5IFRhYmxlCisgICAgVUlOVDE2ICAgbmVfY2JlbnR0YWI7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gRW50cnkgVGFibGUKKyAgICBVSU5UMzIgICBuZV9jcmM7ICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrc3VtIG9mIHdob2xlIGZpbGUKKyAgICBVSU5UMTYgICBuZV9mbGFnczsgICAgICAgICAgICAgICAgICAgIC8vIEZsYWcgVUlOVDE2CisgICAgVUlOVDE2ICAgbmVfYXV0b2RhdGE7ICAgICAgICAgICAgICAgICAvLyBBdXRvbWF0aWMgZGF0YSBzZWdtZW50IG51bWJlcgorICAgIFVJTlQxNiAgIG5lX2hlYXA7ICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBoZWFwIGFsbG9jYXRpb24KKyAgICBVSU5UMTYgICBuZV9zdGFjazsgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgc3RhY2sgYWxsb2NhdGlvbgorICAgIFVJTlQzMiAgIG5lX2NzaXA7ICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBDUzpJUCBzZXR0aW5nCisgICAgVUlOVDMyICAgbmVfc3NzcDsgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIFNTOlNQIHNldHRpbmcKKyAgICBVSU5UMTYgICBuZV9jc2VnOyAgICAgICAgICAgICAgICAgICAgIC8vIENvdW50IG9mIGZpbGUgc2VnbWVudHMKKyAgICBVSU5UMTYgICBuZV9jbW9kOyAgICAgICAgICAgICAgICAgICAgIC8vIEVudHJpZXMgaW4gTW9kdWxlIFJlZmVyZW5jZSBUYWJsZQorICAgIFVJTlQxNiAgIG5lX2NibnJlc3RhYjsgICAgICAgICAgICAgICAgLy8gU2l6ZSBvZiBub24tcmVzaWRlbnQgbmFtZSB0YWJsZQorICAgIFVJTlQxNiAgIG5lX3NlZ3RhYjsgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIFNlZ21lbnQgVGFibGUKKyAgICBVSU5UMTYgICBuZV9yc3JjdGFiOyAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBSZXNvdXJjZSBUYWJsZQorICAgIFVJTlQxNiAgIG5lX3Jlc3RhYjsgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIHJlc2lkZW50IG5hbWUgdGFibGUKKyAgICBVSU5UMTYgICBuZV9tb2R0YWI7ICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBNb2R1bGUgUmVmZXJlbmNlIFRhYmxlCisgICAgVUlOVDE2ICAgbmVfaW1wdGFiOyAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgSW1wb3J0ZWQgTmFtZXMgVGFibGUKKyAgICBVSU5UMzIgICBuZV9ucmVzdGFiOyAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBOb24tcmVzaWRlbnQgTmFtZXMgVGFibGUKKyAgICBVSU5UMTYgICBuZV9jbW92ZW50OyAgICAgICAgICAgICAgICAgIC8vIENvdW50IG9mIG1vdmFibGUgZW50cmllcworICAgIFVJTlQxNiAgIG5lX2FsaWduOyAgICAgICAgICAgICAgICAgICAgLy8gU2VnbWVudCBhbGlnbm1lbnQgc2hpZnQgY291bnQKKyAgICBVSU5UMTYgICBuZV9jcmVzOyAgICAgICAgICAgICAgICAgICAgIC8vIENvdW50IG9mIHJlc291cmNlIHNlZ21lbnRzCisgICAgVUlOVDggICAgbmVfZXhldHlwOyAgICAgICAgICAgICAgICAgICAvLyBUYXJnZXQgT3BlcmF0aW5nIHN5c3RlbQorICAgIFVJTlQ4ICAgIG5lX2ZsYWdzb3RoZXJzOyAgICAgICAgICAgICAgLy8gT3RoZXIgLkVYRSBmbGFncworICAgIFVJTlQxNiAgIG5lX3ByZXR0aHVua3M7ICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIHJldHVybiB0aHVua3MKKyAgICBVSU5UMTYgICBuZV9wc2VncmVmYnl0ZXM7ICAgICAgICAgICAgIC8vIG9mZnNldCB0byBzZWdtZW50IHJlZi4gYnl0ZXMKKyAgICBVSU5UMTYgICBuZV9zd2FwYXJlYTsgICAgICAgICAgICAgICAgIC8vIE1pbmltdW0gY29kZSBzd2FwIGFyZWEgc2l6ZQorICAgIFVJTlQxNiAgIG5lX2V4cHZlcjsgICAgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgV2luZG93cyB2ZXJzaW9uIG51bWJlcgorICB9IElNQUdFX09TMl9IRUFERVIsICpQSU1BR0VfT1MyX0hFQURFUjsKKworLy8KKy8vIEZpbGUgaGVhZGVyIGZvcm1hdC4KKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9GSUxFX0hFQURFUiB7CisgICAgVUlOVDE2ICAgTWFjaGluZTsKKyAgICBVSU5UMTYgICBOdW1iZXJPZlNlY3Rpb25zOworICAgIFVJTlQzMiAgIFRpbWVEYXRlU3RhbXA7CisgICAgVUlOVDMyICAgUG9pbnRlclRvU3ltYm9sVGFibGU7CisgICAgVUlOVDMyICAgTnVtYmVyT2ZTeW1ib2xzOworICAgIFVJTlQxNiAgIFNpemVPZk9wdGlvbmFsSGVhZGVyOworICAgIFVJTlQxNiAgIENoYXJhY3RlcmlzdGljczsKK30gSU1BR0VfRklMRV9IRUFERVIsICpQSU1BR0VfRklMRV9IRUFERVI7CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX0ZJTEVfSEVBREVSICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgSU1BR0VfRklMRV9SRUxPQ1NfU1RSSVBQRUQgICAgICAgICAgIDB4MDAwMSAgLy8gUmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9FWEVDVVRBQkxFX0lNQUdFICAgICAgICAgIDB4MDAwMiAgLy8gRmlsZSBpcyBleGVjdXRhYmxlICAoaS5lLiBubyB1bnJlc29sdmVkIGV4dGVybmVsIHJlZmVyZW5jZXMpLgorI2RlZmluZSBJTUFHRV9GSUxFX0xJTkVfTlVNU19TVFJJUFBFRCAgICAgICAgMHgwMDA0ICAvLyBMaW5lIG51bmJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlLgorI2RlZmluZSBJTUFHRV9GSUxFX0xPQ0FMX1NZTVNfU1RSSVBQRUQgICAgICAgMHgwMDA4ICAvLyBMb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9MTyAgICAgICAgIDB4MDA4MCAgLy8gQnl0ZXMgb2YgbWFjaGluZSB3b3JkIGFyZSByZXZlcnNlZC4KKyNkZWZpbmUgSU1BR0VfRklMRV8zMkJJVF9NQUNISU5FICAgICAgICAgICAgIDB4MDEwMCAgLy8gMzIgYml0IHdvcmQgbWFjaGluZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCAgICAgICAgICAgIDB4MDIwMCAgLy8gRGVidWdnaW5nIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlIGluIC5EQkcgZmlsZQorI2RlZmluZSBJTUFHRV9GSUxFX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvLyBTeXN0ZW0gRmlsZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9ETEwgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLy8gRmlsZSBpcyBhIERMTC4KKyNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9ISSAgICAgICAgIDB4ODAwMCAgLy8gQnl0ZXMgb2YgbWFjaGluZSB3b3JkIGFyZSByZXZlcnNlZC4KKworI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfVU5LTk9XTiAgICAgICAgICAgMAorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NiAgICAgICAgICAgICAgMHgxNGMgICAvLyBJbnRlbCAzODYuCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9SMzAwMCAgICAgICAgICAgICAweDE2MiAgIC8vIE1JUFMgbGl0dGxlLWVuZGlhbiwgMDU0MCBiaWctZW5kaWFuCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9SNDAwMCAgICAgICAgICAgICAweDE2NiAgIC8vIE1JUFMgbGl0dGxlLWVuZGlhbgorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfQUxQSEEgICAgICAgICAgICAgMHgxODQgICAvLyBBbHBoYV9BWFAKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0FSTVRIVU1CX01JWEVEICAgIDB4MWMyICAgLy8gQXJtL1RodW1iCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9QT1dFUlBDICAgICAgICAgICAweDFGMCAgIC8vIElCTSBQb3dlclBDIExpdHRsZS1FbmRpYW4KKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0lBNjQgICAgICAgICAgICAgIDB4MjAwICAgLy8gSUEtNjQKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1RBSE9FICAgICAgICAgICAgIDB4N2NjICAgLy8gSW50ZWwgRU0gbWFjaGluZQorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfRUJDICAgICAgICAgICAgICAgMHhlYmMgICAvLyBFRkkgQnl0ZSBDb2RlCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9YNjQgICAgICAgICAgICAgICAweDg2NjQgIC8vIHg4Nl82NAorLy8KKy8vIERpcmVjdG9yeSBmb3JtYXQuCisvLworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfREFUQV9ESVJFQ1RPUlkgeworICAgIFVJTlQzMiAgIFZpcnR1YWxBZGRyZXNzOworICAgIFVJTlQzMiAgIFNpemU7Cit9IElNQUdFX0RBVEFfRElSRUNUT1JZLCAqUElNQUdFX0RBVEFfRElSRUNUT1JZOworCisjZGVmaW5lIElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTICAgIDE2CisKKy8vCisvLyBPcHRpb25hbCBoZWFkZXIgZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX09QVElPTkFMX0hFQURFUiB7CisgICAgLy8KKyAgICAvLyBTdGFuZGFyZCBmaWVsZHMuCisgICAgLy8KKworICAgIFVJTlQxNiAgICBNYWdpYzsKKyAgICBVSU5UOCAgICAgTWFqb3JMaW5rZXJWZXJzaW9uOworICAgIFVJTlQ4ICAgICBNaW5vckxpbmtlclZlcnNpb247CisgICAgVUlOVDMyICAgIFNpemVPZkNvZGU7CisgICAgVUlOVDMyICAgIFNpemVPZkluaXRpYWxpemVkRGF0YTsKKyAgICBVSU5UMzIgICAgU2l6ZU9mVW5pbml0aWFsaXplZERhdGE7CisgICAgVUlOVDMyICAgIEFkZHJlc3NPZkVudHJ5UG9pbnQ7CisgICAgVUlOVDMyICAgIEJhc2VPZkNvZGU7CisgICAgVUlOVDMyICAgIEJhc2VPZkRhdGE7CisgICAgICAgICAgICAgICAgCisgICAgLy8KKyAgICAvLyBOVCBhZGRpdGlvbmFsIGZpZWxkcy4KKyAgICAvLworCisgICAgVUlOVDMyICAgSW1hZ2VCYXNlOworICAgIFVJTlQzMiAgIFNlY3Rpb25BbGlnbm1lbnQ7CisgICAgVUlOVDMyICAgRmlsZUFsaWdubWVudDsKKyAgICBVSU5UMTYgICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgICAgVUlOVDE2ICAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworICAgIFVJTlQxNiAgIE1ham9ySW1hZ2VWZXJzaW9uOworICAgIFVJTlQxNiAgIE1pbm9ySW1hZ2VWZXJzaW9uOworICAgIFVJTlQxNiAgIE1ham9yU3Vic3lzdGVtVmVyc2lvbjsKKyAgICBVSU5UMTYgICBNaW5vclN1YnN5c3RlbVZlcnNpb247CisgICAgVUlOVDMyICAgUmVzZXJ2ZWQxOworICAgIFVJTlQzMiAgIFNpemVPZkltYWdlOworICAgIFVJTlQzMiAgIFNpemVPZkhlYWRlcnM7CisgICAgVUlOVDMyICAgQ2hlY2tTdW07CisgICAgVUlOVDE2ICAgU3Vic3lzdGVtOworICAgIFVJTlQxNiAgIERsbENoYXJhY3RlcmlzdGljczsKKyAgICBVSU5UMzIgICBTaXplT2ZTdGFja1Jlc2VydmU7CisgICAgVUlOVDMyICAgU2l6ZU9mU3RhY2tDb21taXQ7CisgICAgVUlOVDMyICAgU2l6ZU9mSGVhcFJlc2VydmU7CisgICAgVUlOVDMyICAgU2l6ZU9mSGVhcENvbW1pdDsKKyAgICBVSU5UMzIgICBMb2FkZXJGbGFnczsKKyAgICBVSU5UMzIgICBOdW1iZXJPZlJ2YUFuZFNpemVzOworICAgIElNQUdFX0RBVEFfRElSRUNUT1JZIERhdGFEaXJlY3RvcnlbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdOworfSBJTUFHRV9PUFRJT05BTF9IRUFERVIsICpQSU1BR0VfT1BUSU9OQUxfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfUk9NX09QVElPTkFMX0hFQURFUiB7CisgICAgVUlOVDE2ICBNYWdpYzsKKyAgICBVSU5UOCAgIE1ham9yTGlua2VyVmVyc2lvbjsKKyAgICBVSU5UOCAgIE1pbm9yTGlua2VyVmVyc2lvbjsKKyAgICBVSU5UMzIgIFNpemVPZkNvZGU7CisgICAgVUlOVDMyICBTaXplT2ZJbml0aWFsaXplZERhdGE7CisgICAgVUlOVDMyICBTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsKKyAgICBVSU5UMzIgIEFkZHJlc3NPZkVudHJ5UG9pbnQ7CisgICAgVUlOVDMyICBCYXNlT2ZDb2RlOworICAgIFVJTlQzMiAgQmFzZU9mRGF0YTsKKyAgICBVSU5UMzIgIEJhc2VPZkJzczsKKyAgICBVSU5UMzIgIEdwck1hc2s7CisgICAgVUlOVDMyICBDcHJNYXNrWzRdOworICAgIFVJTlQzMiAgR3BWYWx1ZTsKK30gSU1BR0VfUk9NX09QVElPTkFMX0hFQURFUiwgKlBJTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9ST01fT1BUSU9OQUxfSEVBREVSICAgICAgNTYKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1NURF9PUFRJT05BTF9IRUFERVIgICAgICAyOAorI2RlZmluZSBJTUFHRV9TSVpFT0ZfTlRfT1BUSU9OQUxfSEVBREVSICAgICAgMjI0CisKKyNkZWZpbmUgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDICAgICAgICAweDEwYgorI2RlZmluZSBJTUFHRV9ST01fT1BUSU9OQUxfSERSX01BR0lDICAgICAgIDB4MTA3CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9OVF9IRUFERVJTIHsKKyAgICBVSU5UMzIgU2lnbmF0dXJlOworICAgIElNQUdFX0ZJTEVfSEVBREVSIEZpbGVIZWFkZXI7CisgICAgSU1BR0VfT1BUSU9OQUxfSEVBREVSIE9wdGlvbmFsSGVhZGVyOworfSBJTUFHRV9OVF9IRUFERVJTLCAqUElNQUdFX05UX0hFQURFUlM7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9ST01fSEVBREVSUyB7CisgICAgSU1BR0VfRklMRV9IRUFERVIgRmlsZUhlYWRlcjsKKyAgICBJTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSIE9wdGlvbmFsSGVhZGVyOworfSBJTUFHRV9ST01fSEVBREVSUywgKlBJTUFHRV9ST01fSEVBREVSUzsKKworI2RlZmluZSBJTUFHRV9GSVJTVF9TRUNUSU9OKCBudGhlYWRlciApICgoUElNQUdFX1NFQ1RJT05fSEVBREVSKSAgICAgICAgXAorICAgICgoVUlOVDMyKW50aGVhZGVyICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgRklFTERfT0ZGU0VUKCBJTUFHRV9OVF9IRUFERVJTLCBPcHRpb25hbEhlYWRlciApICsgICAgICAgICAgICAgICAgIFwKKyAgICAgKChQSU1BR0VfTlRfSEVBREVSUykobnRoZWFkZXIpKS0+RmlsZUhlYWRlci5TaXplT2ZPcHRpb25hbEhlYWRlciAgIFwKKyAgICApKQorCisKKy8vIFN1YnN5c3RlbSBWYWx1ZXMKKworI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fVU5LTk9XTiAgICAgICAgICAgICAgMCAgIC8vIFVua25vd24gc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fTkFUSVZFICAgICAgICAgICAgICAgMSAgIC8vIEltYWdlIGRvZXNuJ3QgcmVxdWlyZSBhIHN1YnN5c3RlbS4KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfR1VJICAgICAgICAgIDIgICAvLyBJbWFnZSBydW5zIGluIHRoZSBXaW5kb3dzIEdVSSBzdWJzeXN0ZW0uCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0NVSSAgICAgICAgICAzICAgLy8gSW1hZ2UgcnVucyBpbiB0aGUgV2luZG93cyBjaGFyYWN0ZXIgc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fT1MyX0NVSSAgICAgICAgICAgICAgNSAgIC8vIGltYWdlIHJ1bnMgaW4gdGhlIE9TLzIgY2hhcmFjdGVyIHN1YnN5c3RlbS4KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1BPU0lYX0NVSSAgICAgICAgICAgIDcgICAvLyBpbWFnZSBydW4gIGluIHRoZSBQb3NpeCBjaGFyYWN0ZXIgc3Vic3lzdGVtLgorCisKKy8vIERpcmVjdG9yeSBFbnRyaWVzCisKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0VYUE9SVCAgICAgICAgIDAgICAvLyBFeHBvcnQgRGlyZWN0b3J5CisjZGVmaW5lIElNQUdFX0RJUkVDVE9SWV9FTlRSWV9JTVBPUlQgICAgICAgICAxICAgLy8gSW1wb3J0IERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfUkVTT1VSQ0UgICAgICAgMiAgIC8vIFJlc291cmNlIERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfRVhDRVBUSU9OICAgICAgMyAgIC8vIEV4Y2VwdGlvbiBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX1NFQ1VSSVRZICAgICAgIDQgICAvLyBTZWN1cml0eSBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0JBU0VSRUxPQyAgICAgIDUgICAvLyBCYXNlIFJlbG9jYXRpb24gVGFibGUKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0RFQlVHICAgICAgICAgIDYgICAvLyBEZWJ1ZyBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0NPUFlSSUdIVCAgICAgIDcgICAvLyBEZXNjcmlwdGlvbiBTdHJpbmcKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0dMT0JBTFBUUiAgICAgIDggICAvLyBNYWNoaW5lIFZhbHVlIChNSVBTIEdQKQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfVExTICAgICAgICAgICAgOSAgIC8vIFRMUyBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0xPQURfQ09ORklHICAgMTAgICAvLyBMb2FkIENvbmZpZ3VyYXRpb24gRGlyZWN0b3J5CisKKy8vCisvLyBTZWN0aW9uIGhlYWRlciBmb3JtYXQuCisvLworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9TSE9SVF9OQU1FICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9TRUNUSU9OX0hFQURFUiB7CisgICAgVUlOVDggICBOYW1lW0lNQUdFX1NJWkVPRl9TSE9SVF9OQU1FXTsKKyAgICB1bmlvbiB7CisgICAgICAgICAgICBVSU5UMzIgICBQaHlzaWNhbEFkZHJlc3M7CisgICAgICAgICAgICBVSU5UMzIgICBWaXJ0dWFsU2l6ZTsKKyAgICB9IE1pc2M7CisgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7CisgICAgVUlOVDMyICAgU2l6ZU9mUmF3RGF0YTsKKyAgICBVSU5UMzIgICBQb2ludGVyVG9SYXdEYXRhOworICAgIFVJTlQzMiAgIFBvaW50ZXJUb1JlbG9jYXRpb25zOworICAgIFVJTlQzMiAgIFBvaW50ZXJUb0xpbmVudW1iZXJzOworICAgIFVJTlQxNiAgIE51bWJlck9mUmVsb2NhdGlvbnM7CisgICAgVUlOVDE2ICAgTnVtYmVyT2ZMaW5lbnVtYmVyczsKKyAgICBVSU5UMzIgICBDaGFyYWN0ZXJpc3RpY3M7Cit9IElNQUdFX1NFQ1RJT05fSEVBREVSLCAqUElNQUdFX1NFQ1RJT05fSEVBREVSOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9TRUNUSU9OX0hFQURFUiAgICAgICAgICA0MAorCisjZGVmaW5lIElNQUdFX1NDTl9UWVBFX05PX1BBRCAgICAgICAgICAgICAgICAweDAwMDAwMDA4ICAvLyBSZXNlcnZlZC4KKworI2RlZmluZSBJTUFHRV9TQ05fQ05UX0NPREUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgLy8gU2VjdGlvbiBjb250YWlucyBjb2RlLgorI2RlZmluZSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgICAgICAgMHgwMDAwMDA0MCAgLy8gU2VjdGlvbiBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLgorI2RlZmluZSBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSAgICAgMHgwMDAwMDA4MCAgLy8gU2VjdGlvbiBjb250YWlucyB1bmluaXRpYWxpemVkIGRhdGEuCisKKyNkZWZpbmUgSU1BR0VfU0NOX0xOS19PVEhFUiAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8vIFJlc2VydmVkLgorI2RlZmluZSBJTUFHRV9TQ05fTE5LX0lORk8gICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgLy8gU2VjdGlvbiBjb250YWlucyBjb21tZW50cyBvciBzb21lIG90aGVyIHR5cGUgb2YgaW5mb3JtYXRpb24uCisjZGVmaW5lIElNQUdFX1NDTl9MTktfUkVNT1ZFICAgICAgICAgICAgICAgICAweDAwMDAwODAwICAvLyBTZWN0aW9uIGNvbnRlbnRzIHdpbGwgbm90IGJlY29tZSBwYXJ0IG9mIGltYWdlLgorI2RlZmluZSBJTUFHRV9TQ05fTE5LX0NPTURBVCAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAgLy8gU2VjdGlvbiBjb250ZW50cyBjb21kYXQuCisKKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl8yQllURVMgICAgICAgICAgICAgICAweDAwMjAwMDAwICAvLworI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNEJZVEVTICAgICAgICAgICAgICAgMHgwMDMwMDAwMCAgLy8KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyAgICAgICAgICAgICAgIDB4MDA0MDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTICAgICAgICAgICAgICAweDAwNTAwMDAwICAvLyBEZWZhdWx0IGFsaWdubWVudCBpZiBubyBvdGhlcnMgYXJlIHNwZWNpZmllZC4KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzMyQllURVMgICAgICAgICAgICAgIDB4MDA2MDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl82NEJZVEVTICAgICAgICAgICAgICAweDAwNzAwMDAwICAvLworCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUgICAgICAgICAgICAweDAyMDAwMDAwICAvLyBTZWN0aW9uIGNhbiBiZSBkaXNjYXJkZWQuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCAgICAgICAgICAgICAweDA0MDAwMDAwICAvLyBTZWN0aW9uIGlzIG5vdCBjYWNoYWJsZS4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgICAgICAgICAgICAgIDB4MDgwMDAwMDAgIC8vIFNlY3Rpb24gaXMgbm90IHBhZ2VhYmxlLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX1NIQVJFRCAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMCAgLy8gU2VjdGlvbiBpcyBzaGFyZWFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fRVhFQ1VURSAgICAgICAgICAgICAgICAweDIwMDAwMDAwICAvLyBTZWN0aW9uIGlzIGV4ZWN1dGFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fUkVBRCAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwICAvLyBTZWN0aW9uIGlzIHJlYWRhYmxlLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX1dSSVRFICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgLy8gU2VjdGlvbiBpcyB3cml0ZWFibGUuCisKKy8vCisvLyBTeW1ib2wgZm9ybWF0LgorLy8KKworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9TWU1CT0wgICAgICAgICAgICAgICAgICAxOAorCisvLworLy8gU2VjdGlvbiB2YWx1ZXMuCisvLworLy8gU3ltYm9scyBoYXZlIGEgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhleSBhcmUKKy8vIGRlZmluZWQuIE90aGVyd2lzZSwgc2VjdGlvbiBudW1iZXJzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX1VOREVGSU5FRCAgICAgICAgICAgKFVJTlQxNikwICAgICAgICAgICAvLyBTeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGlzIGNvbW1vbi4KKyNkZWZpbmUgSU1BR0VfU1lNX0FCU09MVVRFICAgICAgICAgICAgKFVJTlQxNiktMSAgICAgICAgICAvLyBTeW1ib2wgaXMgYW4gYWJzb2x1dGUgdmFsdWUuCisjZGVmaW5lIElNQUdFX1NZTV9ERUJVRyAgICAgICAgICAgICAgIChVSU5UMTYpLTIgICAgICAgICAgLy8gU3ltYm9sIGlzIGEgc3BlY2lhbCBkZWJ1ZyBpdGVtLgorCisvLworLy8gVHlwZSAoZnVuZGFtZW50YWwpIHZhbHVlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfTlVMTCAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIC8vIG5vIHR5cGUuCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1ZPSUQgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9DSEFSICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgLy8gdHlwZSBjaGFyYWN0ZXIuCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1NIT1JUICAgICAgICAgICAgICAgICAzICAgICAgICAgICAvLyB0eXBlIHNob3J0IGludGVnZXIuCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0lOVCAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9MT05HICAgICAgICAgICAgICAgICAgNSAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRkxPQVQgICAgICAgICAgICAgICAgIDYgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0RPVUJMRSAgICAgICAgICAgICAgICA3ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9TVFJVQ1QgICAgICAgICAgICAgICAgOCAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfVU5JT04gICAgICAgICAgICAgICAgIDkgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0VOVU0gICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAvLyBlbnVtZXJhdGlvbi4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfTU9FICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgIC8vIG1lbWJlciBvZiBlbnVtZXJhdGlvbi4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfQllURSAgICAgICAgICAgICAgICAgIDEyICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1dPUkQgICAgICAgICAgICAgICAgICAxMyAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9VSU5UICAgICAgICAgICAgICAgICAgMTQgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRFdPUkQgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgIC8vCisKKy8vCisvLyBUeXBlIChkZXJpdmVkKSB2YWx1ZXMuCisvLworCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9OVUxMICAgICAgICAgICAgICAgICAwICAgICAgICAgICAvLyBubyBkZXJpdmVkIHR5cGUuCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9QT0lOVEVSICAgICAgICAgICAgICAxICAgICAgICAgICAvLyBwb2ludGVyLgorI2RlZmluZSBJTUFHRV9TWU1fRFRZUEVfRlVOQ1RJT04gICAgICAgICAgICAgMiAgICAgICAgICAgLy8gZnVuY3Rpb24uCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9BUlJBWSAgICAgICAgICAgICAgICAzICAgICAgICAgICAvLyBhcnJheS4KKworLy8KKy8vIFN0b3JhZ2UgY2xhc3Nlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0VORF9PRl9GVU5DVElPTiAgICAgIChCWVRFICktMQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTlVMTCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfQVVUT01BVElDICAgICAgICAgICAgMQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUwgICAgICAgICAgICAgMgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfU1RBVElDICAgICAgICAgICAgICAgMworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfUkVHSVNURVIgICAgICAgICAgICAgNAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUxfREVGICAgICAgICAgNQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTEFCRUwgICAgICAgICAgICAgICAgNgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfVU5ERUZJTkVEX0xBQkVMICAgICAgNworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX1NUUlVDVCAgICAgOAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfQVJHVU1FTlQgICAgICAgICAgICAgOQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfU1RSVUNUX1RBRyAgICAgICAgICAgMTAKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX01FTUJFUl9PRl9VTklPTiAgICAgIDExCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19VTklPTl9UQUcgICAgICAgICAgICAxMgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfVFlQRV9ERUZJTklUSU9OICAgICAgMTMKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1VOREVGSU5FRF9TVEFUSUMgICAgIDE0CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19FTlVNX1RBRyAgICAgICAgICAgICAxNQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX0VOVU0gICAgICAgMTYKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1JFR0lTVEVSX1BBUkFNICAgICAgIDE3CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19CSVRfRklFTEQgICAgICAgICAgICAxOAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfQkxPQ0sgICAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19GVU5DVElPTiAgICAgICAgICAgICAxMDEKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0VORF9PRl9TVFJVQ1QgICAgICAgIDEwMgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRklMRSAgICAgICAgICAgICAgICAgMTAzCisvLyBuZXcKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1NFQ1RJT04gICAgICAgICAgICAgIDEwNAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfV0VBS19FWFRFUk5BTCAgICAgICAgMTA1CisKKy8vIHR5cGUgcGFja2luZyBjb25zdGFudHMKKworI2RlZmluZSBOX0JUTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTcKKyNkZWZpbmUgTl9UTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDYwCisjZGVmaW5lIE5fVE1BU0sxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAzMDAKKyNkZWZpbmUgTl9UTUFTSzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDM2MAorI2RlZmluZSBOX0JUU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5fVFNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworLy8gTUFDUk9TCisKKy8vCisvLyBDb21tdW5hbCBzZWxlY3Rpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTICAgMQorI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWSAgICAgICAgICAgIDIKKyNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkUgICAgICAzCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0ggICAgNAorI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFICAgIDUKKworI2RlZmluZSBJTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfTk9MSUJSQVJZIDEKKyNkZWZpbmUgSU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX0xJQlJBUlkgICAyCisjZGVmaW5lIElNQUdFX1dFQUtfRVhURVJOX1NFQVJDSF9BTElBUyAgICAgMworCisKKy8vCisvLyBSZWxvY2F0aW9uIGZvcm1hdC4KKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9SRUxPQ0FUSU9OIHsKKyAgICBVSU5UMzIgICBWaXJ0dWFsQWRkcmVzczsKKyAgICBVSU5UMzIgICBTeW1ib2xUYWJsZUluZGV4OworICAgIFVJTlQxNiAgICBUeXBlOworfSBJTUFHRV9SRUxPQ0FUSU9OOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9SRUxPQ0FUSU9OICAgICAgICAgICAgICAxMAorCisvLworLy8gSTM4NiByZWxvY2F0aW9uIHR5cGVzLgorLy8KKworI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9BQlNPTFVURSAgICAgICAgICAgICAgMCAgICAgICAgICAgLy8gUmVmZXJlbmNlIGlzIGFic29sdXRlLCBubyByZWxvY2F0aW9uIGlzIG5lY2Vzc2FyeQorI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9ESVIxNiAgICAgICAgICAgICAgICAgMDEgICAgICAgICAgLy8gRGlyZWN0IDE2LWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X1JFTDE2ICAgICAgICAgICAgICAgICAwMiAgICAgICAgICAvLyBQQy1yZWxhdGl2ZSAxNi1iaXQgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2xzIHZpcnR1YWwgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9ESVIzMiAgICAgICAgICAgICAgICAgMDYgICAgICAgICAgLy8gRGlyZWN0IDMyLWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0RJUjMyTkIgICAgICAgICAgICAgICAwNyAgICAgICAgICAvLyBEaXJlY3QgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MsIGJhc2Ugbm90IGluY2x1ZGVkCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X1NFRzEyICAgICAgICAgICAgICAgICAwMTEgICAgICAgICAvLyBEaXJlY3QgMTYtYml0IHJlZmVyZW5jZSB0byB0aGUgc2VnbWVudC1zZWxlY3RvciBiaXRzIG9mIGEgMzItYml0IHZpcnR1YWwgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9TRUNUSU9OICAgICAgICAgICAgICAgMDEyCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X1NFQ1JFTCAgICAgICAgICAgICAgICAwMTMKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfUkVMMzIgICAgICAgICAgICAgICAgIDAyNCAgICAgICAgIC8vIFBDLXJlbGF0aXZlIDMyLWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisKKy8vCisvLyBNSVBTIHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX0FCU09MVVRFICAgICAgICAgICAgICAwICAgICAgICAgICAvLyBSZWZlcmVuY2UgaXMgYWJzb2x1dGUsIG5vIHJlbG9jYXRpb24gaXMgbmVjZXNzYXJ5CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRkhBTEYgICAgICAgICAgICAgICAwMQorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19SRUZXT1JEICAgICAgICAgICAgICAgMDIKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfSk1QQUREUiAgICAgICAgICAgICAgIDAzCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRkhJICAgICAgICAgICAgICAgICAwNAorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19SRUZMTyAgICAgICAgICAgICAgICAgMDUKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfR1BSRUwgICAgICAgICAgICAgICAgIDA2CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX0xJVEVSQUwgICAgICAgICAgICAgICAwNworI2RlZmluZSBJTUFHRV9SRUxfTUlQU19TRUNUSU9OICAgICAgICAgICAgICAgMDEyCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1NFQ1JFTCAgICAgICAgICAgICAgICAwMTMKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfUkVGV09SRE5CICAgICAgICAgICAgIDA0MgorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19QQUlSICAgICAgICAgICAgICAgICAgMDQ1CisKKy8vCisvLyBBbHBoYSBSZWxvY2F0aW9uIHR5cGVzLgorLy8KKworI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfQUJTT0xVVEUgICAgICAgICAgICAgMHgwCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9SRUZMT05HICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRlFVQUQgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfR1BSRUwzMiAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9MSVRFUkFMICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0xJVFVTRSAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfR1BESVNQICAgICAgICAgICAgICAgMHg2CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9CUkFERFIgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0hJTlQgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfSU5MSU5FX1JFRkxPTkcgICAgICAgMHg5CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9SRUZISSAgICAgICAgICAgICAgICAweEEKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkxPICAgICAgICAgICAgICAgIDB4QgorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfUEFJUiAgICAgICAgICAgICAgICAgMHhDCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9NQVRDSCAgICAgICAgICAgICAgICAweEQKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1NFQ1RJT04gICAgICAgICAgICAgIDB4RQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfU0VDUkVMICAgICAgICAgICAgICAgMHhGCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9SRUZMT05HTkIgICAgICAgICAgICAweDEwCisKKy8vCisvLyBJQk0gUG93ZXJQQyByZWxvY2F0aW9uIHR5cGVzLgorLy8KKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FCU09MVVRFIDB4MDAwMCAgLy8gTk9QCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjY0ICAgMHgwMDAxICAvLyA2NC1iaXQgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIzMiAgIDB4MDAwMiAgLy8gMzItYml0IGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMjQgICAweDAwMDMgIC8vIDI2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIGFic29sdXRlKQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNiAgIDB4MDAwNCAgLy8gMTYtYml0IGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMTQgICAweDAwMDUgIC8vIDE2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFTDI0ICAgIDB4MDAwNiAgLy8gMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUwxNCAgICAweDAwMDcgIC8vIDE2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChiciBjb25kIHJlbGF0aXZlKQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2IDB4MDAwOCAgLy8gMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgMHgwMDA5ICAvLyAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpCisKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMzJOQiAweDAwMEEgIC8vIDMyLWJpdCBhZGRyIHcvbyBpbWFnZSBiYXNlCisjZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDUkVMICAgMHgwMDBCICAvLyB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGFzIGluIGFuIGltYWdlIHNlY3Rpb25oZHIpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDVElPTiAgMHgwMDBDICAvLyBzZWN0aW9uaGVhZGVyIG51bWJlcgorI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lGR0xVRSAgIDB4MDAwRCAgLy8gc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lNR0xVRSAgIDB4MDAwRSAgLy8gc3ltYm9sIGlzIGdsdWUgY29kZTsgdmlydHVhbCBhZGRyZXNzIGlzIFRPQyByZXN0b3JlIGluc3RydWN0aW9uCisKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyAweDAwRkYgIC8vIG1hc2sgdG8gaXNvbGF0ZSBhYm92ZSB2YWx1ZXMgaW4gSU1BR0VfUkVMT0NBVElPTi5UeXBlCisKKy8vIEZsYWcgYml0cyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlRZUEUKKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX05FRyAgICAgIDB4MDEwMCAgLy8gc3VidHJhY3QgcmVsb2MgdmFsdWUgcmF0aGVyIHRoYW4gYWRkaW5nIGl0CisjZGVmaW5lIElNQUdFX1JFTF9QUENfQlJUQUtFTiAgMHgwMjAwICAvLyBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIHRha2VuCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gMHgwNDAwICAvLyBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIG5vdCB0YWtlbgorI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gIDB4MDgwMCAgLy8gdG9jIHNsb3QgZGVmaW5lZCBpbiBmaWxlIChvciwgZGF0YSBpbiB0b2MpCisKKy8vCisvLyBCYXNlZCByZWxvY2F0aW9uIGZvcm1hdC4KKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9CQVNFX1JFTE9DQVRJT04geworICAgIFVJTlQzMiAgIFZpcnR1YWxBZGRyZXNzOworICAgIFVJTlQzMiAgIFNpemVPZkJsb2NrOworLy8gIFVJTlQxNiAgICBUeXBlT2Zmc2V0WzFdOworfSBJTUFHRV9CQVNFX1JFTE9DQVRJT04sICpQSU1BR0VfQkFTRV9SRUxPQ0FUSU9OOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9CQVNFX1JFTE9DQVRJT04gICAgICAgICA4CisKKy8vCisvLyBCYXNlZCByZWxvY2F0aW9uIHR5cGVzLgorLy8KKworI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfQUJTT0xVVEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0hJR0ggICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9MT1cgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSExPVyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0hJR0hBREogICAgICAgICAgICAgICA0CisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9NSVBTX0pNUEFERFIgICAgICAgICAgNQorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSUE2NF9JTU02NCAgICAgICAgICAgIDkKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0RJUjY0ICAgICAgICAgICAgICAgICAxMAorCisvLworLy8gTGluZSBudW1iZXIgZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0xJTkVOVU1CRVIgeworICAgIHVuaW9uIHsKKyAgICAgICAgVUlOVDMyICAgU3ltYm9sVGFibGVJbmRleDsgICAgICAgICAgICAgICAvLyBTeW1ib2wgdGFibGUgaW5kZXggb2YgZnVuY3Rpb24gbmFtZSBpZiBMaW5lbnVtYmVyIGlzIDAuCisgICAgICAgIFVJTlQzMiAgIFZpcnR1YWxBZGRyZXNzOyAgICAgICAgICAgICAgICAgLy8gVmlydHVhbCBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyLgorICAgIH0gVHlwZTsKKyAgICBVSU5UMTYgICAgTGluZW51bWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGluZSBudW1iZXIuCit9IElNQUdFX0xJTkVOVU1CRVI7CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX0xJTkVOVU1CRVIgICAgICAgICAgICAgIDYKKworLy8KKy8vIEFyY2hpdmUgZm9ybWF0LgorLy8KKworI2RlZmluZSBJTUFHRV9BUkNISVZFX1NUQVJUX1NJWkUgICAgICAgICAgICAgOAorI2RlZmluZSBJTUFHRV9BUkNISVZFX1NUQVJUICAgICAgICAgICAgICAgICAgIiE8YXJjaD5cbiIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9FTkQgICAgICAgICAgICAgICAgICAgICJgXG4iCisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfUEFEICAgICAgICAgICAgICAgICAgICAiXG4iCisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfTElOS0VSX01FTUJFUiAgICAgICAgICAiLyAgICAgICAgICAgICAgICIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9MT05HTkFNRVNfTUVNQkVSICAgICAgICIvLyAgICAgICAgICAgICAgIgorCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfQVJDSElWRV9NRU1CRVJfSEVBREVSIHsKKyAgICBVSU5UOCAgICAgTmFtZVsxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBuYW1lIC0gYC8nIHRlcm1pbmF0ZWQuCisgICAgVUlOVDggICAgIERhdGVbMTJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBtZW1iZXIgZGF0ZSAtIGRlY2ltYWwuCisgICAgVUlOVDggICAgIFVzZXJJRFs2XTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBtZW1iZXIgdXNlciBpZCAtIGRlY2ltYWwuCisgICAgVUlOVDggICAgIEdyb3VwSURbNl07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBtZW1iZXIgZ3JvdXAgaWQgLSBkZWNpbWFsLgorICAgIFVJTlQ4ICAgICBNb2RlWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbWVtYmVyIG1vZGUgLSBvY3RhbC4KKyAgICBVSU5UOCAgICAgU2l6ZVsxMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBzaXplIC0gZGVjaW1hbC4KKyAgICBVSU5UOCAgICAgRW5kSGVhZGVyWzJdOyAgICAgICAgICAgICAgICAgICAgICAvLyBTdHJpbmcgdG8gZW5kIGhlYWRlci4KK30gSU1BR0VfQVJDSElWRV9NRU1CRVJfSEVBREVSLCAqUElNQUdFX0FSQ0hJVkVfTUVNQkVSX0hFQURFUjsKKworI2RlZmluZSBJTUFHRV9TSVpFT0ZfQVJDSElWRV9NRU1CRVJfSERSICAgICAgNjAKKworLy8KKy8vIERMTCBzdXBwb3J0LgorLy8KKworLy8KKy8vIEV4cG9ydCBGb3JtYXQKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9FWFBPUlRfRElSRUNUT1JZIHsKKyAgICBVSU5UMzIgICBDaGFyYWN0ZXJpc3RpY3M7CisgICAgVUlOVDMyICAgVGltZURhdGVTdGFtcDsKKyAgICBVSU5UMTYgICBNYWpvclZlcnNpb247CisgICAgVUlOVDE2ICAgTWlub3JWZXJzaW9uOworICAgIFVJTlQzMiAgIE5hbWU7CisgICAgVUlOVDMyICAgQmFzZTsKKyAgICBVSU5UMzIgICBOdW1iZXJPZkZ1bmN0aW9uczsKKyAgICBVSU5UMzIgICBOdW1iZXJPZk5hbWVzOworICAgIFVJTlQzMiAgICpBZGRyZXNzT2ZGdW5jdGlvbnM7CisgICAgVUlOVDMyICAgKkFkZHJlc3NPZk5hbWVzOworICAgIFVJTlQzMiAgICpBZGRyZXNzT2ZOYW1lT3JkaW5hbHM7Cit9IElNQUdFX0VYUE9SVF9ESVJFQ1RPUlksICpQSU1BR0VfRVhQT1JUX0RJUkVDVE9SWTsKKworLy8KKy8vIEltcG9ydCBGb3JtYXQKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9JTVBPUlRfQllfTkFNRSB7CisgICAgVUlOVDE2ICAgIEhpbnQ7CisgICAgVUlOVDggICAgIE5hbWVbMV07Cit9IElNQUdFX0lNUE9SVF9CWV9OQU1FLCAqUElNQUdFX0lNUE9SVF9CWV9OQU1FOworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfVEhVTktfREFUQSB7CisgICAgdW5pb24geworICAgICAgICBVSU5UMzIgRnVuY3Rpb247CisgICAgICAgIFVJTlQzMiBPcmRpbmFsOworICAgICAgICBQSU1BR0VfSU1QT1JUX0JZX05BTUUgQWRkcmVzc09mRGF0YTsKKyAgICB9IHUxOworfSBJTUFHRV9USFVOS19EQVRBLCAqUElNQUdFX1RIVU5LX0RBVEE7CisKKyNkZWZpbmUgSU1BR0VfT1JESU5BTF9GTEFHIDB4ODAwMDAwMDAKKyNkZWZpbmUgSU1BR0VfU05BUF9CWV9PUkRJTkFMKE9yZGluYWwpICgoT3JkaW5hbCAmIElNQUdFX09SRElOQUxfRkxBRykgIT0gMCkKKyNkZWZpbmUgSU1BR0VfT1JESU5BTChPcmRpbmFsKSAoT3JkaW5hbCAmIDB4ZmZmZikKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0lNUE9SVF9ERVNDUklQVE9SIHsKKyAgICBVSU5UMzIgICBDaGFyYWN0ZXJpc3RpY3M7CisgICAgVUlOVDMyICAgVGltZURhdGVTdGFtcDsKKyAgICBVSU5UMzIgICBGb3J3YXJkZXJDaGFpbjsKKyAgICBVSU5UMzIgICBOYW1lOworICAgIFBJTUFHRV9USFVOS19EQVRBIEZpcnN0VGh1bms7Cit9IElNQUdFX0lNUE9SVF9ERVNDUklQVE9SLCAqUElNQUdFX0lNUE9SVF9ERVNDUklQVE9SOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhNjQvZWZpYmluZC5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvaWE2NC9lZmliaW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyNjg3NgotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhNjQvZWZpYmluZC5oCkBAIC0wLDAgKzEsMjI1IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlZmVmaW5kLmgKKworQWJzdHJhY3Q6CisKKyAgICBFRkkgdG8gY29tcGlsZSBiaW5kaW5ncworCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI3ByYWdtYSBwYWNrKCkKKworCisvLworLy8gQmFzaWMgaW50IHR5cGVzIG9mIHZhcmlvdXMgd2lkdGhzCisvLworCisjaWYgIWRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgfHwgKF9fU1REQ19WRVJTSU9OX18gPCAxOTk5MDFMICkKKworICAgIC8vIE5vIEFOU0kgQyAxOTk5LzIwMDAgc3RkaW50LmggaW50ZWdlciB3aWR0aCBkZWNsYXJhdGlvbnMgCisKKyAgICAjaWZkZWYgX01TQ19FWFRFTlNJT05TCisgICAgICAgIC8vIFVzZSBNaWNyb3NvZnQgQyBjb21waWxlciBpbnRlZ2VyIHdpZHRoIGRlY2xhcmF0aW9ucyAKKworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgdWludDY0X3Q7CisgICAgICAgIHR5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgICBpbnQ2NF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgICAgdWludDMyX3Q7CisgICAgICAgIHR5cGVkZWYgX19pbnQzMiAgICAgICAgICAgICBpbnQzMl90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgICAgdWludDE2X3Q7CisgICAgICAgIHR5cGVkZWYgX19pbnQxNiAgICAgICAgICAgICBpbnQxNl90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50OCAgICAgdWludDhfdDsKKyAgICAgICAgdHlwZWRlZiBfX2ludDggICAgICAgICAgICAgIGludDhfdDsKKyAgICAjZWxpZiBkZWZpbmVkKFVOSVhfTFA2NCkKKyAgICAgICAgLy8gVXNlIExQNjQgcHJvZ3JhbW1pbmcgbW9kZWwgZnJvbSBDX0ZMQUdTIGZvciBpbnRlZ2VyIHdpZHRoIGRlY2xhcmF0aW9ucyAKKworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgdWludDY0X3Q7CisgICAgICAgIHR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICBpbnQ2NF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdWludDMyX3Q7CisgICAgICAgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBpbnQzMl90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdWludDE2X3Q7CisgICAgICAgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBpbnQxNl90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdWludDhfdDsKKyAgICAgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIGludDhfdDsKKyAgICAjZWxzZQorICAgICAgICAvLyBBc3N1bWUgUDY0IHByb2dyYW1taW5nIG1vZGVsIGZyb20gQ19GTEFHUyBmb3IgaW50ZWdlciB3aWR0aCBkZWNsYXJhdGlvbnMgCisKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHVpbnQ2NF90OworICAgICAgICB0eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICAgaW50NjRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQzMl90OworICAgICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgaW50MzJfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVpbnQxNl90OworICAgICAgICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgaW50MTZfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVpbnQ4X3Q7CisgICAgICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBpbnQ4X3Q7CisgICAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorICAgICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvLworLy8gQmFzaWMgRUZJIHR5cGVzIG9mIHZhcmlvdXMgd2lkdGhzCisvLworI2lmbmRlZiBfX1dDSEFSX1RZUEVfXworIyBkZWZpbmUgX19XQ0hBUl9UWVBFX18Jc2hvcnQKKyNlbmRpZgorCisKK3R5cGVkZWYgdWludDY0X3QgICBVSU5UNjQ7Cit0eXBlZGVmIGludDY0X3QgICAgSU5UNjQ7Cit0eXBlZGVmIHVpbnQzMl90ICAgVUlOVDMyOwordHlwZWRlZiBpbnQzMl90ICAgIElOVDMyOwordHlwZWRlZiB1aW50MTZfdCAgIFVJTlQxNjsKK3R5cGVkZWYgaW50MTZfdCAgICBJTlQxNjsKK3R5cGVkZWYgdWludDhfdCAgICBVSU5UODsKK3R5cGVkZWYgaW50OF90ICAgICBJTlQ4OwordHlwZWRlZiBfX1dDSEFSX1RZUEVfXyBXQ0hBUjsKKworCisjdW5kZWYgVk9JRAorI2RlZmluZSBWT0lEICAgIHZvaWQKKworCit0eXBlZGVmIGludDY0X3QgICAgSU5UTjsKK3R5cGVkZWYgdWludDY0X3QgICBVSU5UTjsKKworLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKy8vIEJ1Z0J1ZzogQ29kZSB0byBkZWJ1ZworLy8KKyNkZWZpbmUgQklUNjMgICAweDgwMDAwMDAwMDAwMDAwMDAKKworI2RlZmluZSBQTEFURk9STV9JT0JBU0VfQUREUkVTUyAgICgweGZmZmZjMDAwMDAwIHwgQklUNjMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgUE9SVF9UT19NRU1EKF9Qb3J0KSAoUExBVEZPUk1fSU9CQVNFX0FERFJFU1MgfCAoICggKCAoX1BvcnQpICYgMHhmZmZjKSA8PCAxMCApIHwgKCAoX1BvcnQpICYgMHgwZmZmKSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8vIE1hY3JvJ3Mgd2l0aCBjYXN0cyBtYWtlIHRoaXMgbXVjaCBlYXNpZXIgdG8gdXNlIGFuZCByZWFkLgorLy8KKyNkZWZpbmUgUE9SVF9UT19NRU04RChfUG9ydCkgICgqKFVJTlQ4ICAqKShQT1JUX1RPX01FTUQoX1BvcnQpKSkKKyNkZWZpbmUgUE9TVF9DT0RFKF9EYXRhKSAgKFBPUlRfVE9fTUVNOEQoMHg4MCkgPSAoX0RhdGEpKQorLy8KKy8vIEJ1Z0J1ZzogRW5kIERlYnVnIENvZGUhISEKKy8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworCisjZGVmaW5lIEVGSUVSUihhKSAgICAgICAgICAgKDB4ODAwMDAwMDAwMDAwMDAwMCB8IGEpCisjZGVmaW5lIEVGSV9FUlJPUl9NQVNLICAgICAgMHg4MDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIEVGSUVSUl9PRU0oYSkgICAgICAgKDB4YzAwMDAwMDAwMDAwMDAwMCB8IGEpICAgICAgCisKKyNkZWZpbmUgQkFEX1BPSU5URVIgICAgICAgICAweEZCRkJGQkZCRkJGQkZCRkIKKyNkZWZpbmUgTUFYX0FERFJFU1MgICAgICAgICAweEZGRkZGRkZGRkZGRkZGRkYKKworI2RlZmluZSBCUkVBS1BPSU5UKCkgICAgICAgIHdoaWxlIChUUlVFKQorCisvLworLy8gUG9pbnRlcnMgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZXNlIGFkZHJlc3MgdG8gZnVuY3Rpb24KKy8vICB5b3Ugd2lsbCBnZXQgYW4gYWxpZ25tZW50IGZhdWx0IGlmIHRoaXMgdmFsdWUgaXMgbGVzcyB0aGFuIDgKKy8vCisjZGVmaW5lIE1JTl9BTElHTk1FTlRfU0laRSAgOAorCisjZGVmaW5lIEFMSUdOX1ZBUklBQkxFKFZhbHVlICwgQWRqdXN0bWVudCkgXAorICAgICAgICAgICAgKFVJTlROKSBBZGp1c3RtZW50ID0gMDsgXAorICAgICAgICAgICAgaWYoKFVJTlROKVZhbHVlICUgTUlOX0FMSUdOTUVOVF9TSVpFKSBcCisgICAgICAgICAgICAgICAgKFVJTlROKUFkanVzdG1lbnQgPSBNSU5fQUxJR05NRU5UX1NJWkUgLSAoKFVJTlROKVZhbHVlICUgTUlOX0FMSUdOTUVOVF9TSVpFKTsgXAorICAgICAgICAgICAgVmFsdWUgPSAoVUlOVE4pVmFsdWUgKyAoVUlOVE4pQWRqdXN0bWVudAorCisvLworLy8gRGVmaW5lIG1hY3JvcyB0byBjcmVhdGUgZGF0YSBzdHJ1Y3R1cmUgc2lnbmF0dXJlcy4KKy8vCisKKyNkZWZpbmUgRUZJX1NJR05BVFVSRV8xNihBLEIpICAgICAgICAgICAgICgoQSkgfCAoQjw8OCkpCisjZGVmaW5lIEVGSV9TSUdOQVRVUkVfMzIoQSxCLEMsRCkgICAgICAgICAoRUZJX1NJR05BVFVSRV8xNihBLEIpICAgICB8IChFRklfU0lHTkFUVVJFXzE2KEMsRCkgICAgIDw8IDE2KSkKKyNkZWZpbmUgRUZJX1NJR05BVFVSRV82NChBLEIsQyxELEUsRixHLEgpIChFRklfU0lHTkFUVVJFXzMyKEEsQixDLEQpIHwgKChVSU5UNjQpKEVGSV9TSUdOQVRVUkVfMzIoRSxGLEcsSCkpIDw8IDMyKSkKKy8vCisvLyBUbyBleHBvcnQgJiBpbXBvcnQgZnVuY3Rpb25zIGluIHRoZSBFRkkgZW11bGF0b3IgZW52aXJvbm1lbnQKKy8vCisKKyAgICAjZGVmaW5lIEVYUE9SVEFQSQorCisvLworLy8gRUZJQVBJIC0gcHJvdG90eXBlIGNhbGxpbmcgY29udmVudGlvbiBmb3IgRUZJIGZ1bmN0aW9uIHBvaW50ZXJzCisvLyBCT09UU0VSVklDRSAtIHByb3RvdHlwZSBmb3IgaW1wbGVtZW50YXRpb24gb2YgYSBib290IHNlcnZpY2UgaW50ZXJmYWNlCisvLyBSVU5USU1FU0VSVklDRSAtIHByb3RvdHlwZSBmb3IgaW1wbGVtZW50YXRpb24gb2YgYSBydW50aW1lIHNlcnZpY2UgaW50ZXJmYWNlCisvLyBSVU5USU1FRlVOQ1RJT04gLSBwcm90b3R5cGUgZm9yIGltcGxlbWVudGF0aW9uIG9mIGEgcnVudGltZSBmdW5jdGlvbiB0aGF0IGlzIG5vdCBhIHNlcnZpY2UKKy8vIFJVTlRJTUVfQ09ERSAtIHByYWdtYSBtYWNybyBmb3IgZGVjbGFyaW5nIHJ1bnRpbWUgY29kZSAgICAKKy8vCisKKyNpZm5kZWYgRUZJQVBJICAgICAgICAgICAgICAgICAgLy8gRm9yY2VzIEVGSSBjYWxsaW5nIGNvbnZlbnRpb25zIHJlZ3VhcmRsZXNzIG9mIGNvbXBpbGVyIG9wdGlvbnMgCisgICAgI2lmZGVmIF9NU0NfRVhURU5TSU9OUworICAgICAgICAjZGVmaW5lIEVGSUFQSSBfX2NkZWNsICAvLyBGb3JjZSBDIGNhbGxpbmcgY29udmVudGlvbiBmb3IgTWljcm9zb2Z0IEMgY29tcGlsZXIgCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBFRklBUEkgICAgICAgICAgLy8gU3Vic3RpdHV0ZSBleHByZXNpb24gdG8gZm9yY2UgQyBjYWxsaW5nIGNvbnZlbnRpb24gCisgICAgI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBCT09UU0VSVklDRQorI2RlZmluZSBSVU5USU1FU0VSVklDRQorI2RlZmluZSBSVU5USU1FRlVOQ1RJT04KKworI2RlZmluZSBSVU5USU1FX0NPREUoYSkgICAgICAgICBhbGxvY190ZXh0KCJydGNvZGUiLCBhKQorI2RlZmluZSBCRUdJTl9SVU5USU1FX0RBVEEoKSAgICBkYXRhX3NlZygicnRkYXRhIikKKyNkZWZpbmUgRU5EX1JVTlRJTUVfREFUQSgpICAgICAgZGF0YV9zZWcoIiIpCisKKyNkZWZpbmUgVk9MQVRJTEUgICAgdm9sYXRpbGUKKworLy8KKy8vIEJ1Z0J1ZzogTmVlZCB0byBmaW5kIG91dCBpZiB0aGlzIGlzIHBvcnRhYmxlIGFjY3Jvc3MgY29tcGxpZXJzLgorLy8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBNRU1PUllfRkVOQ0UoKSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mLmEiIDo6OiAibWVtb3J5IikKKyNlbHNlCit2b2lkIF9fbWYgKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAgCisjcHJhZ21hIGludHJpbnNpYyAoX19tZikgIAorI2RlZmluZSBNRU1PUllfRkVOQ0UoKSAgICBfX21mKCkKKyNlbmRpZgorLy8KKy8vIFdoZW4gYnVpbGQgc2ltaWxpYXIgdG8gRlcsIHRoZW4gbGluayBldmVyeXRoaW5nIHRvZ2V0aGVyIGFzCisvLyBvbmUgYmlnIG1vZHVsZS4KKy8vCisKKyNkZWZpbmUgRUZJX0RSSVZFUl9FTlRSWV9QT0lOVChJbml0RnVuY3Rpb24pICAgIFwKKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJbml0aWFsaXplRHJpdmVyICggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVk9JRCAgICAqSW1hZ2VIYW5kbGUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVk9JRCAgICAqU3lzdGVtVGFibGUgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEluaXRGdW5jdGlvbihJbWFnZUhhbmRsZSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICBTeXN0ZW1UYWJsZSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFRklfU1RBVFVTIGVmaV9tYWluKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRUZJX0hBTkRMRSBpbWFnZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhbGlhcyAoIkluaXRpYWxpemVEcml2ZXIiKSkpOworCisjZGVmaW5lIExPQURfSU5URVJOQUxfRFJJVkVSKF9pZiwgdHlwZSwgbmFtZSwgZW50cnkpICAgIFwKKyAgICAgICAgKF9pZiktPkxvYWRJbnRlcm5hbCh0eXBlLCBuYW1lLCBlbnRyeSkKKworLy8KKy8vIFNvbWUgY29tcGlsZXJzIGRvbid0IHN1cHBvcnQgdGhlIGZvcndhcmQgcmVmZXJlbmNlIGNvbnN0cnVjdDoKKy8vICB0eXBlZGVmIHN0cnVjdCBYWFhYWAorLy8KKy8vIFRoZSBmb2xsb3dpbmcgbWFjcm8gcHJvdmlkZSBhIHdvcmthcm91bmQgZm9yIHN1Y2ggY2FzZXMuCisvLworI2lmZGVmIE5PX0lOVEVSRkFDRV9ERUNMCisjZGVmaW5lIElOVEVSRkFDRV9ERUNMKHgpCisjZWxzZQorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIElOVEVSRkFDRV9ERUNMKHgpIHN0cnVjdCB4CisjZWxzZQorI2RlZmluZSBJTlRFUkZBQ0VfREVDTCh4KSB0eXBlZGVmIHN0cnVjdCB4CisjZW5kaWYKKyNlbmRpZgorCisvKiBObyBlZmkgY2FsbCB3cmFwcGVyIGZvciBJQTMyIGFyY2hpdGVjdHVyZSAqLworI2RlZmluZSB1ZWZpX2NhbGxfd3JhcHBlcihmdW5jLCB2YV9udW0sIC4uLikJZnVuYyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgRUZJX0ZVTkNUSU9OCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9pYTY0L2VmaWxpYnBsYXQuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhNjQvZWZpbGlicGxhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwN2JlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9pYTY0L2VmaWxpYnBsYXQuaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9FRklfTElCX1BMQVRfSAorI2RlZmluZSBfRUZJX0xJQl9QTEFUX0gKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaWxpYnBsYXQuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSB0byBjb21waWxlIGJpbmRpbmdzCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgInNhbHByb2MuaCIKKworCitWT0lECitJbml0aWFsaXplTGliUGxhdGZvcm0gKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIElOIEVGSV9TWVNURU1fVEFCTEUgICAgICpTeXN0ZW1UYWJsZQorICAgICk7CisKK1ZPSUQKK0xpYkluaXRTYWxBbmRQYWxQcm9jKAorICAgIE9VVCBQTEFCRUwgICpTYWxQbGFiZWwsCisgICAgT1VUIFVJTlQ2NCAgKlBhbEVudHJ5CisgICAgKTsKKworRUZJX1NUQVRVUworTGliR2V0U2FsSW9Qb3J0TWFwcGluZyAoCisgICAgT1VUIFVJTlQ2NCAgKklvUG9ydE1hcHBpbmcKKyAgICApOworCitFRklfU1RBVFVTCitMaWJHZXRTYWxJcGlCbG9jayAoCisgICAgT1VUIFVJTlQ2NCAgKklwaUJsb2NrCisgICAgKTsKKworRUZJX1NUQVRVUworTGliR2V0U2FsV2FrZXVwVmVjdG9yICgKKyAgICBPVVQgVUlOVDY0ICAqV2FrZVZlY3RvcgorICAgICk7CisKK1ZPSUQgKgorTGliU2VhcmNoU2FsU3lzdGVtVGFibGUgKAorICAgIElOICBVSU5UOCAgIEVudHJ5VHlwZSAgCisgICAgKTsKKworCitWT0lECitMaWJTYWxQcm9jICgKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzEsCisgICAgSU4gIFVJTlQ2NCAgICBBcmcyLAorICAgIElOICBVSU5UNjQgICAgQXJnMywKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzQsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc1LAorICAgIElOICBVSU5UNjQgICAgQXJnNiwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzcsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc4LAorICAgIE9VVCByQXJnICAgICAgKlJlc3VsdHMgIE9QVElPTkFMCisgICAgKTsKKworVk9JRAorTGliUGFsUHJvYyAoCisgICAgSU4gIFVJTlQ2NCAgICBBcmcxLAorICAgIElOICBVSU5UNjQgICAgQXJnMiwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzMsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc0LAorICAgIE9VVCByQXJnICAgICAgKlJlc3VsdHMgIE9QVElPTkFMCisgICAgKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhNjQvcGUuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2lhNjQvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWNhZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvaWE2NC9wZS5oCkBAIC0wLDAgKzEsNjAxIEBACisvKiAKKyAgICBQRTMyKyBoZWFkZXIgZmlsZQorICovCisjaWZuZGVmIF9QRV9ICisjZGVmaW5lIF9QRV9ICisKKyNkZWZpbmUgSU1BR0VfRE9TX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgMHg1QTREICAgICAgLy8gTVoKKyNkZWZpbmUgSU1BR0VfT1MyX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgMHg0NTRFICAgICAgLy8gTkUKKyNkZWZpbmUgSU1BR0VfT1MyX1NJR05BVFVSRV9MRSAgICAgICAgICAgICAgMHg0NTRDICAgICAgLy8gTEUKKyNkZWZpbmUgSU1BR0VfTlRfU0lHTkFUVVJFICAgICAgICAgICAgICAgICAgMHgwMDAwNDU1MCAgLy8gUEUwMCAgCisjZGVmaW5lIElNQUdFX0VET1NfU0lHTkFUVVJFICAgICAgICAgICAgICAgIDB4NDQ0NTQ1NTAgIC8vIFBFRUQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgZm9sbG93aW5nIHN0dWZmIGNvbWVzIGZyb20gd2lubnQuaCBmcm9tIHRoZSBpYTY0c2RrLCBwbHVzIHRoZSBQbGFiZWwgZm9yCisgKiBsb2FkaW5nIEVNIGV4ZWN1dGFibGVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIEludGVsIElBNjQgc3BlY2lmaWMKKy8vCisKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0lBNjRfSU1NNjQgICAgICAgICAgICA5CisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9JQTY0X0RJUjY0ICAgICAgICAgICAgMTAKKworc3RydWN0IFBsYWJlbCB7IAorICAgIFVJTlQ2NCAgRW50cnlQb2ludDsKKyAgICBVSU5UNjQgIE5ld0dQOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0RPU19IRUFERVIgeyAgICAgIC8vIERPUyAuRVhFIGhlYWRlcgorICAgIFVJTlQxNiAgIGVfbWFnaWM7ICAgICAgICAgICAgICAgICAgICAgLy8gTWFnaWMgbnVtYmVyCisgICAgVUlOVDE2ICAgZV9jYmxwOyAgICAgICAgICAgICAgICAgICAgICAvLyBCeXRlcyBvbiBsYXN0IHBhZ2Ugb2YgZmlsZQorICAgIFVJTlQxNiAgIGVfY3A7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFnZXMgaW4gZmlsZQorICAgIFVJTlQxNiAgIGVfY3JsYzsgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2NhdGlvbnMKKyAgICBVSU5UMTYgICBlX2NwYXJoZHI7ICAgICAgICAgICAgICAgICAgIC8vIFNpemUgb2YgaGVhZGVyIGluIHBhcmFncmFwaHMKKyAgICBVSU5UMTYgICBlX21pbmFsbG9jOyAgICAgICAgICAgICAgICAgIC8vIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQKKyAgICBVSU5UMTYgICBlX21heGFsbG9jOyAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQKKyAgICBVSU5UMTYgICBlX3NzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZQorICAgIFVJTlQxNiAgIGVfc3A7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBTUCB2YWx1ZQorICAgIFVJTlQxNiAgIGVfY3N1bTsgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzdW0KKyAgICBVSU5UMTYgICBlX2lwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgSVAgdmFsdWUKKyAgICBVSU5UMTYgICBlX2NzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgKHJlbGF0aXZlKSBDUyB2YWx1ZQorICAgIFVJTlQxNiAgIGVfbGZhcmxjOyAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUKKyAgICBVSU5UMTYgICBlX292bm87ICAgICAgICAgICAgICAgICAgICAgIC8vIE92ZXJsYXkgbnVtYmVyCisgICAgVUlOVDE2ICAgZV9yZXNbNF07ICAgICAgICAgICAgICAgICAgICAvLyBSZXNlcnZlZCB3b3JkcworICAgIFVJTlQxNiAgIGVfb2VtaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gT0VNIGlkZW50aWZpZXIgKGZvciBlX29lbWluZm8pCisgICAgVUlOVDE2ICAgZV9vZW1pbmZvOyAgICAgICAgICAgICAgICAgICAvLyBPRU0gaW5mb3JtYXRpb247IGVfb2VtaWQgc3BlY2lmaWMKKyAgICBVSU5UMTYgICBlX3JlczJbMTBdOyAgICAgICAgICAgICAgICAgIC8vIFJlc2VydmVkIHdvcmRzCisgICAgVUlOVDMyICAgZV9sZmFuZXc7ICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIGFkZHJlc3Mgb2YgbmV3IGV4ZSBoZWFkZXIKKyAgfSBJTUFHRV9ET1NfSEVBREVSLCAqUElNQUdFX0RPU19IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9PUzJfSEVBREVSIHsgICAgICAvLyBPUy8yIC5FWEUgaGVhZGVyCisgICAgVUlOVDE2ICAgbmVfbWFnaWM7ICAgICAgICAgICAgICAgICAgICAvLyBNYWdpYyBudW1iZXIKKyAgICBVSU5UOCAgICBuZV92ZXI7ICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24gbnVtYmVyCisgICAgVUlOVDggICAgbmVfcmV2OyAgICAgICAgICAgICAgICAgICAgICAvLyBSZXZpc2lvbiBudW1iZXIKKyAgICBVSU5UMTYgICBuZV9lbnR0YWI7ICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBFbnRyeSBUYWJsZQorICAgIFVJTlQxNiAgIG5lX2NiZW50dGFiOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIEVudHJ5IFRhYmxlCisgICAgVUlOVDMyICAgbmVfY3JjOyAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVja3N1bSBvZiB3aG9sZSBmaWxlCisgICAgVUlOVDE2ICAgbmVfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAvLyBGbGFnIFVJTlQxNgorICAgIFVJTlQxNiAgIG5lX2F1dG9kYXRhOyAgICAgICAgICAgICAgICAgLy8gQXV0b21hdGljIGRhdGEgc2VnbWVudCBudW1iZXIKKyAgICBVSU5UMTYgICBuZV9oZWFwOyAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgaGVhcCBhbGxvY2F0aW9uCisgICAgVUlOVDE2ICAgbmVfc3RhY2s7ICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIHN0YWNrIGFsbG9jYXRpb24KKyAgICBVSU5UMzIgICBuZV9jc2lwOyAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgQ1M6SVAgc2V0dGluZworICAgIFVJTlQzMiAgIG5lX3Nzc3A7ICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBTUzpTUCBzZXR0aW5nCisgICAgVUlOVDE2ICAgbmVfY3NlZzsgICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBvZiBmaWxlIHNlZ21lbnRzCisgICAgVUlOVDE2ICAgbmVfY21vZDsgICAgICAgICAgICAgICAgICAgICAvLyBFbnRyaWVzIGluIE1vZHVsZSBSZWZlcmVuY2UgVGFibGUKKyAgICBVSU5UMTYgICBuZV9jYm5yZXN0YWI7ICAgICAgICAgICAgICAgIC8vIFNpemUgb2Ygbm9uLXJlc2lkZW50IG5hbWUgdGFibGUKKyAgICBVSU5UMTYgICBuZV9zZWd0YWI7ICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBTZWdtZW50IFRhYmxlCisgICAgVUlOVDE2ICAgbmVfcnNyY3RhYjsgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgUmVzb3VyY2UgVGFibGUKKyAgICBVSU5UMTYgICBuZV9yZXN0YWI7ICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiByZXNpZGVudCBuYW1lIHRhYmxlCisgICAgVUlOVDE2ICAgbmVfbW9kdGFiOyAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgTW9kdWxlIFJlZmVyZW5jZSBUYWJsZQorICAgIFVJTlQxNiAgIG5lX2ltcHRhYjsgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIEltcG9ydGVkIE5hbWVzIFRhYmxlCisgICAgVUlOVDMyICAgbmVfbnJlc3RhYjsgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgTm9uLXJlc2lkZW50IE5hbWVzIFRhYmxlCisgICAgVUlOVDE2ICAgbmVfY21vdmVudDsgICAgICAgICAgICAgICAgICAvLyBDb3VudCBvZiBtb3ZhYmxlIGVudHJpZXMKKyAgICBVSU5UMTYgICBuZV9hbGlnbjsgICAgICAgICAgICAgICAgICAgIC8vIFNlZ21lbnQgYWxpZ25tZW50IHNoaWZ0IGNvdW50CisgICAgVUlOVDE2ICAgbmVfY3JlczsgICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBvZiByZXNvdXJjZSBzZWdtZW50cworICAgIFVJTlQ4ICAgIG5lX2V4ZXR5cDsgICAgICAgICAgICAgICAgICAgLy8gVGFyZ2V0IE9wZXJhdGluZyBzeXN0ZW0KKyAgICBVSU5UOCAgICBuZV9mbGFnc290aGVyczsgICAgICAgICAgICAgIC8vIE90aGVyIC5FWEUgZmxhZ3MKKyAgICBVSU5UMTYgICBuZV9wcmV0dGh1bmtzOyAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byByZXR1cm4gdGh1bmtzCisgICAgVUlOVDE2ICAgbmVfcHNlZ3JlZmJ5dGVzOyAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gc2VnbWVudCByZWYuIGJ5dGVzCisgICAgVUlOVDE2ICAgbmVfc3dhcGFyZWE7ICAgICAgICAgICAgICAgICAvLyBNaW5pbXVtIGNvZGUgc3dhcCBhcmVhIHNpemUKKyAgICBVSU5UMTYgICBuZV9leHB2ZXI7ICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIFdpbmRvd3MgdmVyc2lvbiBudW1iZXIKKyAgfSBJTUFHRV9PUzJfSEVBREVSLCAqUElNQUdFX09TMl9IRUFERVI7CisKKy8vCisvLyBGaWxlIGhlYWRlciBmb3JtYXQuCisvLworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfRklMRV9IRUFERVIgeworICAgIFVJTlQxNiAgIE1hY2hpbmU7CisgICAgVUlOVDE2ICAgTnVtYmVyT2ZTZWN0aW9uczsKKyAgICBVSU5UMzIgICBUaW1lRGF0ZVN0YW1wOworICAgIFVJTlQzMiAgIFBvaW50ZXJUb1N5bWJvbFRhYmxlOworICAgIFVJTlQzMiAgIE51bWJlck9mU3ltYm9sczsKKyAgICBVSU5UMTYgICBTaXplT2ZPcHRpb25hbEhlYWRlcjsKKyAgICBVSU5UMTYgICBDaGFyYWN0ZXJpc3RpY3M7Cit9IElNQUdFX0ZJTEVfSEVBREVSLCAqUElNQUdFX0ZJTEVfSEVBREVSOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9GSUxFX0hFQURFUiAgICAgICAgICAgICAyMAorCisjZGVmaW5lIElNQUdFX0ZJTEVfUkVMT0NTX1NUUklQUEVEICAgICAgICAgICAweDAwMDEgIC8vIFJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUuCisjZGVmaW5lIElNQUdFX0ZJTEVfRVhFQ1VUQUJMRV9JTUFHRSAgICAgICAgICAweDAwMDIgIC8vIEZpbGUgaXMgZXhlY3V0YWJsZSAgKGkuZS4gbm8gdW5yZXNvbHZlZCBleHRlcm5lbCByZWZlcmVuY2VzKS4KKyNkZWZpbmUgSU1BR0VfRklMRV9MSU5FX05VTVNfU1RSSVBQRUQgICAgICAgIDB4MDAwNCAgLy8gTGluZSBudW5iZXJzIHN0cmlwcGVkIGZyb20gZmlsZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9MT0NBTF9TWU1TX1NUUklQUEVEICAgICAgIDB4MDAwOCAgLy8gTG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUuCisjZGVmaW5lIElNQUdFX0ZJTEVfQllURVNfUkVWRVJTRURfTE8gICAgICAgICAweDAwODAgIC8vIEJ5dGVzIG9mIG1hY2hpbmUgd29yZCBhcmUgcmV2ZXJzZWQuCisjZGVmaW5lIElNQUdFX0ZJTEVfMzJCSVRfTUFDSElORSAgICAgICAgICAgICAweDAxMDAgIC8vIDMyIGJpdCB3b3JkIG1hY2hpbmUuCisjZGVmaW5lIElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQgICAgICAgICAgICAweDAyMDAgIC8vIERlYnVnZ2luZyBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZSBpbiAuREJHIGZpbGUKKyNkZWZpbmUgSU1BR0VfRklMRV9TWVNURU0gICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLy8gU3lzdGVtIEZpbGUuCisjZGVmaW5lIElNQUdFX0ZJTEVfRExMICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8vIEZpbGUgaXMgYSBETEwuCisjZGVmaW5lIElNQUdFX0ZJTEVfQllURVNfUkVWRVJTRURfSEkgICAgICAgICAweDgwMDAgIC8vIEJ5dGVzIG9mIG1hY2hpbmUgd29yZCBhcmUgcmV2ZXJzZWQuCisKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1VOS05PV04gICAgICAgICAgIDAKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0kzODYgICAgICAgICAgICAgIDB4MTRjICAgLy8gSW50ZWwgMzg2LgorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfUjMwMDAgICAgICAgICAgICAgMHgxNjIgICAvLyBNSVBTIGxpdHRsZS1lbmRpYW4sIDA1NDAgYmlnLWVuZGlhbgorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfUjQwMDAgICAgICAgICAgICAgMHgxNjYgICAvLyBNSVBTIGxpdHRsZS1lbmRpYW4KKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0FMUEhBICAgICAgICAgICAgIDB4MTg0ICAgLy8gQWxwaGFfQVhQCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9BUk1USFVNQl9NSVhFRCAgICAweDFjMiAgIC8vIEFybS9UaHVtYgorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfUE9XRVJQQyAgICAgICAgICAgMHgxRjAgICAvLyBJQk0gUG93ZXJQQyBMaXR0bGUtRW5kaWFuCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9JQTY0ICAgICAgICAgICAgICAweDIwMCAgIC8vIElBLTY0CisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9UQUhPRSAgICAgICAgICAgICAweDdjYyAgIC8vIEludGVsIEVNIG1hY2hpbmUKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0VCQyAgICAgICAgICAgICAgIDB4ZWJjICAgLy8gRUZJIEJ5dGUgQ29kZQorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfWDY0ICAgICAgICAgICAgICAgMHg4NjY0ICAvLyB4ODZfNjQKKy8vCisvLyBEaXJlY3RvcnkgZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0RBVEFfRElSRUNUT1JZIHsKKyAgICBVSU5UMzIgICBWaXJ0dWFsQWRkcmVzczsKKyAgICBVSU5UMzIgICBTaXplOworfSBJTUFHRV9EQVRBX0RJUkVDVE9SWSwgKlBJTUFHRV9EQVRBX0RJUkVDVE9SWTsKKworI2RlZmluZSBJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFUyAgICAxNgorCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSIHsKKyAgICBVSU5UMTYgIE1hZ2ljOworICAgIFVJTlQ4ICAgTWFqb3JMaW5rZXJWZXJzaW9uOworICAgIFVJTlQ4ICAgTWlub3JMaW5rZXJWZXJzaW9uOworICAgIFVJTlQzMiAgU2l6ZU9mQ29kZTsKKyAgICBVSU5UMzIgIFNpemVPZkluaXRpYWxpemVkRGF0YTsKKyAgICBVSU5UMzIgIFNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOworICAgIFVJTlQzMiAgQWRkcmVzc09mRW50cnlQb2ludDsKKyAgICBVSU5UMzIgIEJhc2VPZkNvZGU7CisgICAgVUlOVDMyICBCYXNlT2ZEYXRhOworICAgIFVJTlQzMiAgQmFzZU9mQnNzOworICAgIFVJTlQzMiAgR3ByTWFzazsKKyAgICBVSU5UMzIgIENwck1hc2tbNF07CisgICAgVUlOVDMyICBHcFZhbHVlOworfSBJTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSLCAqUElNQUdFX1JPTV9PUFRJT05BTF9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9PUFRJT05BTF9IRUFERVIgeworICAgIFVJTlQxNiAgICAgIE1hZ2ljOworICAgIFVJTlQ4ICAgICAgIE1ham9yTGlua2VyVmVyc2lvbjsKKyAgICBVSU5UOCAgICAgICBNaW5vckxpbmtlclZlcnNpb247CisgICAgVUlOVDMyICAgICAgU2l6ZU9mQ29kZTsKKyAgICBVSU5UMzIgICAgICBTaXplT2ZJbml0aWFsaXplZERhdGE7CisgICAgVUlOVDMyICAgICAgU2l6ZU9mVW5pbml0aWFsaXplZERhdGE7CisgICAgVUlOVDMyICAgICAgQWRkcmVzc09mRW50cnlQb2ludDsKKyAgICBVSU5UMzIgICAgICBCYXNlT2ZDb2RlOworICAgIC8vIFVJTlQzMiAgICAgICBCYXNlT2ZEYXRhOworICAgIFVJTlQ2NCAgICAgIEltYWdlQmFzZTsKKyAgICBVSU5UMzIgICAgICBTZWN0aW9uQWxpZ25tZW50OworICAgIFVJTlQzMiAgICAgIEZpbGVBbGlnbm1lbnQ7CisgICAgVUlOVDE2ICAgICAgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworICAgIFVJTlQxNiAgICAgIE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKKyAgICBVSU5UMTYgICAgICBNYWpvckltYWdlVmVyc2lvbjsKKyAgICBVSU5UMTYgICAgICBNaW5vckltYWdlVmVyc2lvbjsKKyAgICBVSU5UMTYgICAgICBNYWpvclN1YnN5c3RlbVZlcnNpb247CisgICAgVUlOVDE2ICAgICAgTWlub3JTdWJzeXN0ZW1WZXJzaW9uOworICAgIFVJTlQzMiAgICAgIFdpbjMyVmVyc2lvblZhbHVlOworICAgIFVJTlQzMiAgICAgIFNpemVPZkltYWdlOworICAgIFVJTlQzMiAgICAgIFNpemVPZkhlYWRlcnM7CisgICAgVUlOVDMyICAgICAgQ2hlY2tTdW07CisgICAgVUlOVDE2ICAgICAgU3Vic3lzdGVtOworICAgIFVJTlQxNiAgICAgIERsbENoYXJhY3RlcmlzdGljczsKKyAgICBVSU5UNjQgICAgICBTaXplT2ZTdGFja1Jlc2VydmU7CisgICAgVUlOVDY0ICAgICAgU2l6ZU9mU3RhY2tDb21taXQ7CisgICAgVUlOVDY0ICAgICAgU2l6ZU9mSGVhcFJlc2VydmU7CisgICAgVUlOVDY0ICAgICAgU2l6ZU9mSGVhcENvbW1pdDsKKyAgICBVSU5UMzIgICAgICBMb2FkZXJGbGFnczsKKyAgICBVSU5UMzIgICAgICBOdW1iZXJPZlJ2YUFuZFNpemVzOworICAgIElNQUdFX0RBVEFfRElSRUNUT1JZIERhdGFEaXJlY3RvcnlbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdOworfSBJTUFHRV9PUFRJT05BTF9IRUFERVIsICpQSU1BR0VfT1BUSU9OQUxfSEVBREVSOworCisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1JPTV9PUFRJT05BTF9IRUFERVIgICAgICA1NgorI2RlZmluZSBJTUFHRV9TSVpFT0ZfU1REX09QVElPTkFMX0hFQURFUiAgICAgIDI4CisjZGVmaW5lIElNQUdFX1NJWkVPRl9OVF9PUFRJT05BTF9IRUFERVIgICAgICAyMjQKKyNkZWZpbmUgSU1BR0VfU0laRU9GX05UX09QVElPTkFMNjRfSEVBREVSICAgIDI0NAorCisjZGVmaW5lIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyAgICAgICAgMHgxMGIKKyNkZWZpbmUgSU1BR0VfTlRfT1BUSU9OQUxfSERSNjRfTUFHSUMgICAgICAweDIwYgorI2RlZmluZSBJTUFHRV9ST01fT1BUSU9OQUxfSERSX01BR0lDICAgICAgIDB4MTA3CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9OVF9IRUFERVJTIHsKKyAgICBVSU5UMzIgU2lnbmF0dXJlOworICAgIElNQUdFX0ZJTEVfSEVBREVSIEZpbGVIZWFkZXI7CisgICAgSU1BR0VfT1BUSU9OQUxfSEVBREVSIE9wdGlvbmFsSGVhZGVyOworfSBJTUFHRV9OVF9IRUFERVJTLCAqUElNQUdFX05UX0hFQURFUlM7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9ST01fSEVBREVSUyB7CisgICAgSU1BR0VfRklMRV9IRUFERVIgRmlsZUhlYWRlcjsKKyAgICBJTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSIE9wdGlvbmFsSGVhZGVyOworfSBJTUFHRV9ST01fSEVBREVSUywgKlBJTUFHRV9ST01fSEVBREVSUzsKKworI2RlZmluZSBJTUFHRV9GSVJTVF9TRUNUSU9OKCBudGhlYWRlciApICgoUElNQUdFX1NFQ1RJT05fSEVBREVSKSAgICAgICAgXAorICAgICgoVUlOVDMyKW50aGVhZGVyICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgRklFTERfT0ZGU0VUKCBJTUFHRV9OVF9IRUFERVJTLCBPcHRpb25hbEhlYWRlciApICsgICAgICAgICAgICAgICAgIFwKKyAgICAgKChQSU1BR0VfTlRfSEVBREVSUykobnRoZWFkZXIpKS0+RmlsZUhlYWRlci5TaXplT2ZPcHRpb25hbEhlYWRlciAgIFwKKyAgICApKQorCisKKy8vIFN1YnN5c3RlbSBWYWx1ZXMKKworI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fVU5LTk9XTiAgICAgICAgICAgICAgMCAgIC8vIFVua25vd24gc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fTkFUSVZFICAgICAgICAgICAgICAgMSAgIC8vIEltYWdlIGRvZXNuJ3QgcmVxdWlyZSBhIHN1YnN5c3RlbS4KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfR1VJICAgICAgICAgIDIgICAvLyBJbWFnZSBydW5zIGluIHRoZSBXaW5kb3dzIEdVSSBzdWJzeXN0ZW0uCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0NVSSAgICAgICAgICAzICAgLy8gSW1hZ2UgcnVucyBpbiB0aGUgV2luZG93cyBjaGFyYWN0ZXIgc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fT1MyX0NVSSAgICAgICAgICAgICAgNSAgIC8vIGltYWdlIHJ1bnMgaW4gdGhlIE9TLzIgY2hhcmFjdGVyIHN1YnN5c3RlbS4KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1BPU0lYX0NVSSAgICAgICAgICAgIDcgICAvLyBpbWFnZSBydW4gIGluIHRoZSBQb3NpeCBjaGFyYWN0ZXIgc3Vic3lzdGVtLgorCisKKy8vIERpcmVjdG9yeSBFbnRyaWVzCisKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0VYUE9SVCAgICAgICAgIDAgICAvLyBFeHBvcnQgRGlyZWN0b3J5CisjZGVmaW5lIElNQUdFX0RJUkVDVE9SWV9FTlRSWV9JTVBPUlQgICAgICAgICAxICAgLy8gSW1wb3J0IERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfUkVTT1VSQ0UgICAgICAgMiAgIC8vIFJlc291cmNlIERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfRVhDRVBUSU9OICAgICAgMyAgIC8vIEV4Y2VwdGlvbiBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX1NFQ1VSSVRZICAgICAgIDQgICAvLyBTZWN1cml0eSBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0JBU0VSRUxPQyAgICAgIDUgICAvLyBCYXNlIFJlbG9jYXRpb24gVGFibGUKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0RFQlVHICAgICAgICAgIDYgICAvLyBEZWJ1ZyBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0NPUFlSSUdIVCAgICAgIDcgICAvLyBEZXNjcmlwdGlvbiBTdHJpbmcKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0dMT0JBTFBUUiAgICAgIDggICAvLyBNYWNoaW5lIFZhbHVlIChNSVBTIEdQKQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfVExTICAgICAgICAgICAgOSAgIC8vIFRMUyBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0xPQURfQ09ORklHICAgMTAgICAvLyBMb2FkIENvbmZpZ3VyYXRpb24gRGlyZWN0b3J5CisKKy8vCisvLyBTZWN0aW9uIGhlYWRlciBmb3JtYXQuCisvLworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9TSE9SVF9OQU1FICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9TRUNUSU9OX0hFQURFUiB7CisgICAgVUlOVDggICBOYW1lW0lNQUdFX1NJWkVPRl9TSE9SVF9OQU1FXTsKKyAgICB1bmlvbiB7CisgICAgICAgICAgICBVSU5UMzIgICBQaHlzaWNhbEFkZHJlc3M7CisgICAgICAgICAgICBVSU5UMzIgICBWaXJ0dWFsU2l6ZTsKKyAgICB9IE1pc2M7CisgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7CisgICAgVUlOVDMyICAgU2l6ZU9mUmF3RGF0YTsKKyAgICBVSU5UMzIgICBQb2ludGVyVG9SYXdEYXRhOworICAgIFVJTlQzMiAgIFBvaW50ZXJUb1JlbG9jYXRpb25zOworICAgIFVJTlQzMiAgIFBvaW50ZXJUb0xpbmVudW1iZXJzOworICAgIFVJTlQxNiAgIE51bWJlck9mUmVsb2NhdGlvbnM7CisgICAgVUlOVDE2ICAgTnVtYmVyT2ZMaW5lbnVtYmVyczsKKyAgICBVSU5UMzIgICBDaGFyYWN0ZXJpc3RpY3M7Cit9IElNQUdFX1NFQ1RJT05fSEVBREVSLCAqUElNQUdFX1NFQ1RJT05fSEVBREVSOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9TRUNUSU9OX0hFQURFUiAgICAgICAgICA0MAorCisjZGVmaW5lIElNQUdFX1NDTl9UWVBFX05PX1BBRCAgICAgICAgICAgICAgICAweDAwMDAwMDA4ICAvLyBSZXNlcnZlZC4KKworI2RlZmluZSBJTUFHRV9TQ05fQ05UX0NPREUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgLy8gU2VjdGlvbiBjb250YWlucyBjb2RlLgorI2RlZmluZSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgICAgICAgMHgwMDAwMDA0MCAgLy8gU2VjdGlvbiBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLgorI2RlZmluZSBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSAgICAgMHgwMDAwMDA4MCAgLy8gU2VjdGlvbiBjb250YWlucyB1bmluaXRpYWxpemVkIGRhdGEuCisKKyNkZWZpbmUgSU1BR0VfU0NOX0xOS19PVEhFUiAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8vIFJlc2VydmVkLgorI2RlZmluZSBJTUFHRV9TQ05fTE5LX0lORk8gICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgLy8gU2VjdGlvbiBjb250YWlucyBjb21tZW50cyBvciBzb21lIG90aGVyIHR5cGUgb2YgaW5mb3JtYXRpb24uCisjZGVmaW5lIElNQUdFX1NDTl9MTktfUkVNT1ZFICAgICAgICAgICAgICAgICAweDAwMDAwODAwICAvLyBTZWN0aW9uIGNvbnRlbnRzIHdpbGwgbm90IGJlY29tZSBwYXJ0IG9mIGltYWdlLgorI2RlZmluZSBJTUFHRV9TQ05fTE5LX0NPTURBVCAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAgLy8gU2VjdGlvbiBjb250ZW50cyBjb21kYXQuCisKKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl8yQllURVMgICAgICAgICAgICAgICAweDAwMjAwMDAwICAvLworI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNEJZVEVTICAgICAgICAgICAgICAgMHgwMDMwMDAwMCAgLy8KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyAgICAgICAgICAgICAgIDB4MDA0MDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTICAgICAgICAgICAgICAweDAwNTAwMDAwICAvLyBEZWZhdWx0IGFsaWdubWVudCBpZiBubyBvdGhlcnMgYXJlIHNwZWNpZmllZC4KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzMyQllURVMgICAgICAgICAgICAgIDB4MDA2MDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl82NEJZVEVTICAgICAgICAgICAgICAweDAwNzAwMDAwICAvLworCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUgICAgICAgICAgICAweDAyMDAwMDAwICAvLyBTZWN0aW9uIGNhbiBiZSBkaXNjYXJkZWQuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCAgICAgICAgICAgICAweDA0MDAwMDAwICAvLyBTZWN0aW9uIGlzIG5vdCBjYWNoYWJsZS4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgICAgICAgICAgICAgIDB4MDgwMDAwMDAgIC8vIFNlY3Rpb24gaXMgbm90IHBhZ2VhYmxlLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX1NIQVJFRCAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMCAgLy8gU2VjdGlvbiBpcyBzaGFyZWFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fRVhFQ1VURSAgICAgICAgICAgICAgICAweDIwMDAwMDAwICAvLyBTZWN0aW9uIGlzIGV4ZWN1dGFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fUkVBRCAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwICAvLyBTZWN0aW9uIGlzIHJlYWRhYmxlLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX1dSSVRFICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgLy8gU2VjdGlvbiBpcyB3cml0ZWFibGUuCisKKy8vCisvLyBTeW1ib2wgZm9ybWF0LgorLy8KKworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9TWU1CT0wgICAgICAgICAgICAgICAgICAxOAorCisvLworLy8gU2VjdGlvbiB2YWx1ZXMuCisvLworLy8gU3ltYm9scyBoYXZlIGEgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhleSBhcmUKKy8vIGRlZmluZWQuIE90aGVyd2lzZSwgc2VjdGlvbiBudW1iZXJzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX1VOREVGSU5FRCAgICAgICAgICAgKFVJTlQxNikwICAgICAgICAgICAvLyBTeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGlzIGNvbW1vbi4KKyNkZWZpbmUgSU1BR0VfU1lNX0FCU09MVVRFICAgICAgICAgICAgKFVJTlQxNiktMSAgICAgICAgICAvLyBTeW1ib2wgaXMgYW4gYWJzb2x1dGUgdmFsdWUuCisjZGVmaW5lIElNQUdFX1NZTV9ERUJVRyAgICAgICAgICAgICAgIChVSU5UMTYpLTIgICAgICAgICAgLy8gU3ltYm9sIGlzIGEgc3BlY2lhbCBkZWJ1ZyBpdGVtLgorCisvLworLy8gVHlwZSAoZnVuZGFtZW50YWwpIHZhbHVlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfTlVMTCAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIC8vIG5vIHR5cGUuCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1ZPSUQgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9DSEFSICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgLy8gdHlwZSBjaGFyYWN0ZXIuCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1NIT1JUICAgICAgICAgICAgICAgICAzICAgICAgICAgICAvLyB0eXBlIHNob3J0IGludGVnZXIuCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0lOVCAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9MT05HICAgICAgICAgICAgICAgICAgNSAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRkxPQVQgICAgICAgICAgICAgICAgIDYgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0RPVUJMRSAgICAgICAgICAgICAgICA3ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9TVFJVQ1QgICAgICAgICAgICAgICAgOCAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfVU5JT04gICAgICAgICAgICAgICAgIDkgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0VOVU0gICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAvLyBlbnVtZXJhdGlvbi4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfTU9FICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgIC8vIG1lbWJlciBvZiBlbnVtZXJhdGlvbi4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfQllURSAgICAgICAgICAgICAgICAgIDEyICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1dPUkQgICAgICAgICAgICAgICAgICAxMyAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9VSU5UICAgICAgICAgICAgICAgICAgMTQgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRFdPUkQgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgIC8vCisKKy8vCisvLyBUeXBlIChkZXJpdmVkKSB2YWx1ZXMuCisvLworCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9OVUxMICAgICAgICAgICAgICAgICAwICAgICAgICAgICAvLyBubyBkZXJpdmVkIHR5cGUuCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9QT0lOVEVSICAgICAgICAgICAgICAxICAgICAgICAgICAvLyBwb2ludGVyLgorI2RlZmluZSBJTUFHRV9TWU1fRFRZUEVfRlVOQ1RJT04gICAgICAgICAgICAgMiAgICAgICAgICAgLy8gZnVuY3Rpb24uCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9BUlJBWSAgICAgICAgICAgICAgICAzICAgICAgICAgICAvLyBhcnJheS4KKworLy8KKy8vIFN0b3JhZ2UgY2xhc3Nlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0VORF9PRl9GVU5DVElPTiAgICAgIChCWVRFICktMQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTlVMTCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfQVVUT01BVElDICAgICAgICAgICAgMQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUwgICAgICAgICAgICAgMgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfU1RBVElDICAgICAgICAgICAgICAgMworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfUkVHSVNURVIgICAgICAgICAgICAgNAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRVhURVJOQUxfREVGICAgICAgICAgNQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTEFCRUwgICAgICAgICAgICAgICAgNgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfVU5ERUZJTkVEX0xBQkVMICAgICAgNworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX1NUUlVDVCAgICAgOAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfQVJHVU1FTlQgICAgICAgICAgICAgOQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfU1RSVUNUX1RBRyAgICAgICAgICAgMTAKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX01FTUJFUl9PRl9VTklPTiAgICAgIDExCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19VTklPTl9UQUcgICAgICAgICAgICAxMgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfVFlQRV9ERUZJTklUSU9OICAgICAgMTMKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1VOREVGSU5FRF9TVEFUSUMgICAgIDE0CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19FTlVNX1RBRyAgICAgICAgICAgICAxNQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX0VOVU0gICAgICAgMTYKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1JFR0lTVEVSX1BBUkFNICAgICAgIDE3CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19CSVRfRklFTEQgICAgICAgICAgICAxOAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfQkxPQ0sgICAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19GVU5DVElPTiAgICAgICAgICAgICAxMDEKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0VORF9PRl9TVFJVQ1QgICAgICAgIDEwMgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRklMRSAgICAgICAgICAgICAgICAgMTAzCisvLyBuZXcKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1NFQ1RJT04gICAgICAgICAgICAgIDEwNAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfV0VBS19FWFRFUk5BTCAgICAgICAgMTA1CisKKy8vIHR5cGUgcGFja2luZyBjb25zdGFudHMKKworI2RlZmluZSBOX0JUTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTcKKyNkZWZpbmUgTl9UTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDYwCisjZGVmaW5lIE5fVE1BU0sxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAzMDAKKyNkZWZpbmUgTl9UTUFTSzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDM2MAorI2RlZmluZSBOX0JUU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5fVFNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworLy8gTUFDUk9TCisKKy8vCisvLyBDb21tdW5hbCBzZWxlY3Rpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTICAgMQorI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWSAgICAgICAgICAgIDIKKyNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkUgICAgICAzCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0ggICAgNAorI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFICAgIDUKKworI2RlZmluZSBJTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfTk9MSUJSQVJZIDEKKyNkZWZpbmUgSU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX0xJQlJBUlkgICAyCisjZGVmaW5lIElNQUdFX1dFQUtfRVhURVJOX1NFQVJDSF9BTElBUyAgICAgMworCisKKy8vCisvLyBSZWxvY2F0aW9uIGZvcm1hdC4KKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9SRUxPQ0FUSU9OIHsKKyAgICBVSU5UMzIgICBWaXJ0dWFsQWRkcmVzczsKKyAgICBVSU5UMzIgICBTeW1ib2xUYWJsZUluZGV4OworICAgIFVJTlQxNiAgIFR5cGU7Cit9IElNQUdFX1JFTE9DQVRJT047CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1JFTE9DQVRJT04gICAgICAgICAgICAgIDEwCisKKy8vCisvLyBJMzg2IHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0FCU09MVVRFICAgICAgICAgICAgICAwICAgICAgICAgICAvLyBSZWZlcmVuY2UgaXMgYWJzb2x1dGUsIG5vIHJlbG9jYXRpb24gaXMgbmVjZXNzYXJ5CisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0RJUjE2ICAgICAgICAgICAgICAgICAwMSAgICAgICAgICAvLyBEaXJlY3QgMTYtYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfUkVMMTYgICAgICAgICAgICAgICAgIDAyICAgICAgICAgIC8vIFBDLXJlbGF0aXZlIDE2LWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0RJUjMyICAgICAgICAgICAgICAgICAwNiAgICAgICAgICAvLyBEaXJlY3QgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfRElSMzJOQiAgICAgICAgICAgICAgIDA3ICAgICAgICAgIC8vIERpcmVjdCAzMi1iaXQgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2xzIHZpcnR1YWwgYWRkcmVzcywgYmFzZSBub3QgaW5jbHVkZWQKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfU0VHMTIgICAgICAgICAgICAgICAgIDAxMSAgICAgICAgIC8vIERpcmVjdCAxNi1iaXQgcmVmZXJlbmNlIHRvIHRoZSBzZWdtZW50LXNlbGVjdG9yIGJpdHMgb2YgYSAzMi1iaXQgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X1NFQ1RJT04gICAgICAgICAgICAgICAwMTIKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfU0VDUkVMICAgICAgICAgICAgICAgIDAxMworI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9SRUwzMiAgICAgICAgICAgICAgICAgMDI0ICAgICAgICAgLy8gUEMtcmVsYXRpdmUgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKworLy8KKy8vIE1JUFMgcmVsb2NhdGlvbiB0eXBlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfQUJTT0xVVEUgICAgICAgICAgICAgIDAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBpcyBhYnNvbHV0ZSwgbm8gcmVsb2NhdGlvbiBpcyBuZWNlc3NhcnkKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfUkVGSEFMRiAgICAgICAgICAgICAgIDAxCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRldPUkQgICAgICAgICAgICAgICAwMgorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19KTVBBRERSICAgICAgICAgICAgICAgMDMKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfUkVGSEkgICAgICAgICAgICAgICAgIDA0CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRkxPICAgICAgICAgICAgICAgICAwNQorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19HUFJFTCAgICAgICAgICAgICAgICAgMDYKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfTElURVJBTCAgICAgICAgICAgICAgIDA3CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1NFQ1RJT04gICAgICAgICAgICAgICAwMTIKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfU0VDUkVMICAgICAgICAgICAgICAgIDAxMworI2RlZmluZSBJTUFHRV9SRUxfTUlQU19SRUZXT1JETkIgICAgICAgICAgICAgMDQyCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1BBSVIgICAgICAgICAgICAgICAgICAwNDUKKworLy8KKy8vIEFscGhhIFJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9BQlNPTFVURSAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkxPTkcgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfUkVGUVVBRCAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9HUFJFTDMyICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0xJVEVSQUwgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfTElUVVNFICAgICAgICAgICAgICAgMHg1CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9HUERJU1AgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0JSQUREUiAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfSElOVCAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9JTkxJTkVfUkVGTE9ORyAgICAgICAweDkKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkhJICAgICAgICAgICAgICAgIDB4QQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfUkVGTE8gICAgICAgICAgICAgICAgMHhCCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9QQUlSICAgICAgICAgICAgICAgICAweEMKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX01BVENIICAgICAgICAgICAgICAgIDB4RAorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfU0VDVElPTiAgICAgICAgICAgICAgMHhFCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9TRUNSRUwgICAgICAgICAgICAgICAweEYKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkxPTkdOQiAgICAgICAgICAgIDB4MTAKKworLy8KKy8vIElCTSBQb3dlclBDIHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgMHgwMDAwICAvLyBOT1AKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSNjQgICAweDAwMDEgIC8vIDY0LWJpdCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyICAgMHgwMDAyICAvLyAzMi1iaXQgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIyNCAgIDB4MDAwMyAgLy8gMjYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggYWJzb2x1dGUpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjE2ICAgMHgwMDA0ICAvLyAxNi1iaXQgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNCAgIDB4MDAwNSAgLy8gMTYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMjQgICAgMHgwMDA2ICAvLyAyNi1iaXQgUEMtcmVsYXRpdmUgb2Zmc2V0LCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIHJlbGF0aXZlKQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFTDE0ICAgIDB4MDAwNyAgLy8gMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTYgMHgwMDA4ICAvLyAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNCAweDAwMDkgIC8vIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSwgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkKKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5CIDB4MDAwQSAgLy8gMzItYml0IGFkZHIgdy9vIGltYWdlIGJhc2UKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNSRUwgICAweDAwMEIgIC8vIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNUSU9OICAweDAwMEMgIC8vIHNlY3Rpb25oZWFkZXIgbnVtYmVyCisjZGVmaW5lIElNQUdFX1JFTF9QUENfSUZHTFVFICAgMHgwMDBEICAvLyBzdWJzdGl0dXRlIFRPQyByZXN0b3JlIGluc3RydWN0aW9uIGlmZiBzeW1ib2wgaXMgZ2x1ZSBjb2RlCisjZGVmaW5lIElNQUdFX1JFTF9QUENfSU1HTFVFICAgMHgwMDBFICAvLyBzeW1ib2wgaXMgZ2x1ZSBjb2RlOyB2aXJ0dWFsIGFkZHJlc3MgaXMgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24KKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RZUEVNQVNLIDB4MDBGRiAgLy8gbWFzayB0byBpc29sYXRlIGFib3ZlIHZhbHVlcyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlR5cGUKKworLy8gRmxhZyBiaXRzIGluIElNQUdFX1JFTE9DQVRJT04uVFlQRQorCisjZGVmaW5lIElNQUdFX1JFTF9QUENfTkVHICAgICAgMHgwMTAwICAvLyBzdWJ0cmFjdCByZWxvYyB2YWx1ZSByYXRoZXIgdGhhbiBhZGRpbmcgaXQKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19CUlRBS0VOICAweDAyMDAgIC8vIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggdGFrZW4KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19CUk5UQUtFTiAweDA0MDAgIC8vIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggbm90IHRha2VuCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DREVGTiAgMHgwODAwICAvLyB0b2Mgc2xvdCBkZWZpbmVkIGluIGZpbGUgKG9yLCBkYXRhIGluIHRvYykKKworLy8KKy8vIEJhc2VkIHJlbG9jYXRpb24gZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0JBU0VfUkVMT0NBVElPTiB7CisgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7CisgICAgVUlOVDMyICAgU2l6ZU9mQmxvY2s7CisvLyAgVUlOVDE2ICAgIFR5cGVPZmZzZXRbMV07Cit9IElNQUdFX0JBU0VfUkVMT0NBVElPTiwgKlBJTUFHRV9CQVNFX1JFTE9DQVRJT047CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX0JBU0VfUkVMT0NBVElPTiAgICAgICAgIDgKKworLy8KKy8vIEJhc2VkIHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9BQlNPTFVURSAgICAgICAgICAgICAgMAorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0xPVyAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9ISUdITE9XICAgICAgICAgICAgICAgMworI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSEFESiAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX01JUFNfSk1QQUREUiAgICAgICAgICA1CisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9JQTY0X0lNTTY0ICAgICAgICAgICAgOQorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfRElSNjQgICAgICAgICAgICAgICAgIDEwCisKKy8vCisvLyBMaW5lIG51bWJlciBmb3JtYXQuCisvLworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfTElORU5VTUJFUiB7CisgICAgdW5pb24geworICAgICAgICBVSU5UMzIgICBTeW1ib2xUYWJsZUluZGV4OyAgICAgICAgICAgICAgIC8vIFN5bWJvbCB0YWJsZSBpbmRleCBvZiBmdW5jdGlvbiBuYW1lIGlmIExpbmVudW1iZXIgaXMgMC4KKyAgICAgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7ICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIuCisgICAgfSBUeXBlOworICAgIFVJTlQxNiAgICBMaW5lbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW5lIG51bWJlci4KK30gSU1BR0VfTElORU5VTUJFUjsKKworI2RlZmluZSBJTUFHRV9TSVpFT0ZfTElORU5VTUJFUiAgICAgICAgICAgICAgNgorCisvLworLy8gQXJjaGl2ZSBmb3JtYXQuCisvLworCisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfU1RBUlRfU0laRSAgICAgICAgICAgICA4CisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfU1RBUlQgICAgICAgICAgICAgICAgICAiITxhcmNoPlxuIgorI2RlZmluZSBJTUFHRV9BUkNISVZFX0VORCAgICAgICAgICAgICAgICAgICAgImBcbiIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9QQUQgICAgICAgICAgICAgICAgICAgICJcbiIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9MSU5LRVJfTUVNQkVSICAgICAgICAgICIvICAgICAgICAgICAgICAgIgorI2RlZmluZSBJTUFHRV9BUkNISVZFX0xPTkdOQU1FU19NRU1CRVIgICAgICAgIi8vICAgICAgICAgICAgICAiCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9BUkNISVZFX01FTUJFUl9IRUFERVIgeworICAgIFVJTlQ4ICAgICBOYW1lWzE2XTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbWVtYmVyIG5hbWUgLSBgLycgdGVybWluYXRlZC4KKyAgICBVSU5UOCAgICAgRGF0ZVsxMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBkYXRlIC0gZGVjaW1hbC4KKyAgICBVSU5UOCAgICAgVXNlcklEWzZdOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciB1c2VyIGlkIC0gZGVjaW1hbC4KKyAgICBVSU5UOCAgICAgR3JvdXBJRFs2XTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBncm91cCBpZCAtIGRlY2ltYWwuCisgICAgVUlOVDggICAgIE1vZGVbOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBtZW1iZXIgbW9kZSAtIG9jdGFsLgorICAgIFVJTlQ4ICAgICBTaXplWzEwXTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbWVtYmVyIHNpemUgLSBkZWNpbWFsLgorICAgIFVJTlQ4ICAgICBFbmRIZWFkZXJbMl07ICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmluZyB0byBlbmQgaGVhZGVyLgorfSBJTUFHRV9BUkNISVZFX01FTUJFUl9IRUFERVIsICpQSU1BR0VfQVJDSElWRV9NRU1CRVJfSEVBREVSOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9BUkNISVZFX01FTUJFUl9IRFIgICAgICA2MAorCisvLworLy8gRExMIHN1cHBvcnQuCisvLworCisvLworLy8gRXhwb3J0IEZvcm1hdAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgeworICAgIFVJTlQzMiAgIENoYXJhY3RlcmlzdGljczsKKyAgICBVSU5UMzIgICBUaW1lRGF0ZVN0YW1wOworICAgIFVJTlQxNiAgIE1ham9yVmVyc2lvbjsKKyAgICBVSU5UMTYgICBNaW5vclZlcnNpb247CisgICAgVUlOVDMyICAgTmFtZTsKKyAgICBVSU5UMzIgICBCYXNlOworICAgIFVJTlQzMiAgIE51bWJlck9mRnVuY3Rpb25zOworICAgIFVJTlQzMiAgIE51bWJlck9mTmFtZXM7CisgICAgVUlOVDMyICAgQWRkcmVzc09mRnVuY3Rpb25zOworICAgIFVJTlQzMiAgIEFkZHJlc3NPZk5hbWVzOworICAgIFVJTlQzMiAgIEFkZHJlc3NPZk5hbWVPcmRpbmFsczsKK30gSU1BR0VfRVhQT1JUX0RJUkVDVE9SWSwgKlBJTUFHRV9FWFBPUlRfRElSRUNUT1JZOworCisvLworLy8gSW1wb3J0IEZvcm1hdAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0lNUE9SVF9CWV9OQU1FIHsKKyAgICBVSU5UMTYgICAgSGludDsKKyAgICBVSU5UOCAgICAgTmFtZVsxXTsKK30gSU1BR0VfSU1QT1JUX0JZX05BTUUsICpQSU1BR0VfSU1QT1JUX0JZX05BTUU7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9USFVOS19EQVRBIHsKKyAgICB1bmlvbiB7CisgICAgICAgIFVJTlQzMiBGdW5jdGlvbjsKKyAgICAgICAgVUlOVDMyIE9yZGluYWw7CisgICAgICAgIFBJTUFHRV9JTVBPUlRfQllfTkFNRSBBZGRyZXNzT2ZEYXRhOworICAgIH0gdTE7Cit9IElNQUdFX1RIVU5LX0RBVEEsICpQSU1BR0VfVEhVTktfREFUQTsKKworI2RlZmluZSBJTUFHRV9PUkRJTkFMX0ZMQUcgMHg4MDAwMDAwMAorI2RlZmluZSBJTUFHRV9TTkFQX0JZX09SRElOQUwoT3JkaW5hbCkgKChPcmRpbmFsICYgSU1BR0VfT1JESU5BTF9GTEFHKSAhPSAwKQorI2RlZmluZSBJTUFHRV9PUkRJTkFMKE9yZGluYWwpIChPcmRpbmFsICYgMHhmZmZmKQorCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1IgeworICAgIFVJTlQzMiAgIENoYXJhY3RlcmlzdGljczsKKyAgICBVSU5UMzIgICBUaW1lRGF0ZVN0YW1wOworICAgIFVJTlQzMiAgIEZvcndhcmRlckNoYWluOworICAgIFVJTlQzMiAgIE5hbWU7CisgICAgUElNQUdFX1RIVU5LX0RBVEEgRmlyc3RUaHVuazsKK30gSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1IsICpQSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1I7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvaWE2NC9zYWxwcm9jLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9pYTY0L3NhbHByb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmE1ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvaWE2NC9zYWxwcm9jLmgKQEAgLTAsMCArMSwyNjQgQEAKKyNpZm5kZWYgX1NBTF9QUk9DX0gKKyNkZWZpbmUgX1NBTF9QUk9DX0gKKy8vCisvLworLy9Db3B5cmlnaHQgKGMpIDE5OTkgIEludGVsIENvcnBvcmF0aW9uCisvLworLy9Nb2R1bGUgTmFtZToKKy8vCisvLyAgICBTYWxQcm9jLmgKKy8vCisvL0Fic3RyYWN0OgorLy8KKy8vICAgIE1haW4gU0FMIGludGVyZmFjZSByb3V0aW5zIGZvciBJQS02NCBjYWxscy4gCisvLworLy8KKy8vUmV2aXNpb24gSGlzdG9yeQorLy8KKy8vCisKKy8vICByZXR1cm4gdmFsdWUgdGhhdCBtaW1pY2tzIHI4LHI5LHIxMCAmIHIxMSByZWdpc3RlcnMgCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDY0ICAgICBwMDsKKyAgICBVSU5UNjQgICAgIHAxOworICAgIFVJTlQ2NCAgICAgcDI7CisgICAgVUlOVDY0ICAgICBwMzsKK30gckFyZzsKKworI2RlZmluZSAgU0FMX1BDSV9DT05GSUdfUkVBRCAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAxMAorI2RlZmluZSAgU0FMX1BDSV9DT05GSUdfV1JJVEUgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAxMQorCit0eXBlZGVmIFZPSUQgKCpQRk4pKCk7Cit0eXBlZGVmIHJBcmcgKCpQRk5fU0FMX1BST0MpKFVJTlQ2NCxVSU5UNjQsVUlOVDY0LFVJTlQ2NCxVSU5UNjQsVUlOVDY0LFVJTlQ2NCxVSU5UNjQpOwordHlwZWRlZiByQXJnICgqUEZOX1NBTF9DQUxMQkFDSykoVUlOVDY0LFVJTlQ2NCxVSU5UNjQsVUlOVDY0LFVJTlQ2NCxVSU5UNjQsVUlOVDY0LFVJTlQ2NCk7CisKK3R5cGVkZWYgc3RydWN0IF9QTEFCRUwgeworICAgVUlOVDY0IFByb2NFbnRyeVBvaW50OworICAgVUlOVDY0IEdQOworfSBQTEFCRUw7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0lBMzJfQklPU19SRUdJU1RFUl9TVEFURSB7CisKKyAgICAvLyBnZW5lcmFsIHJlZ2lzdGVycworICAgIFVJTlQzMiBlYXg7CisgICAgVUlOVDMyIGVjeDsKKyAgICBVSU5UMzIgZWR4OworICAgIFVJTlQzMiBlYng7CisKKyAgICAvLyBzdGFjayByZWdpc3RlcnMKKyAgICBVSU5UMzIgZXNwOworICAgIFVJTlQzMiBlYnA7CisgICAgVUlOVDMyIGVzaTsKKyAgICBVSU5UMzIgZWRpOworCisgICAgLy8gZWZsYWdzCisgICAgVUlOVDMyIGVmbGFnczsKKworICAgIC8vIGluc3RydWN0aW9uIHBvaW50ZXIKKyAgICBVSU5UMzIgZWlwOworCisgICAgVUlOVDE2IGNzOworICAgIFVJTlQxNiBkczsKKyAgICBVSU5UMTYgZXM7CisgICAgVUlOVDE2IGZzOworICAgIFVJTlQxNiBnczsKKyAgICBVSU5UMTYgc3M7CisKKyAgICAvLyBSZXNlcnZlZAorICAgIFVJTlQzMiBSZXNlcnZlZDE7CisgICAgVUlOVDY0IFJlc2VydmVkMjsKK30gSUEzMl9CSU9TX1JFR0lTVEVSX1NUQVRFOworCitWT0lEIEVGSUluaXRNc2coVk9JRCk7CisKK0VGSV9TVEFUVVMKK1BsUmVnaXN0ZXJBbmRTdGFydFRpbWVyKAorICAgIElOIFVJTlROIFBlcmlvZAorICAgICk7CisKK0VGSV9TVEFUVVMKK1BsRGVSZWdpc3RlckFuZENhbmNlbFRpbWVyKFZPSUQpOworCitWT0lECitTYWxQcm9jICgKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzEsCisgICAgSU4gIFVJTlQ2NCAgICBBcmcyLAorICAgIElOICBVSU5UNjQgICAgQXJnMywKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzQsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc1LAorICAgIElOICBVSU5UNjQgICAgQXJnNiwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzcsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc4LAorICAgIE9VVCByQXJnICAgICAgKlJlc3VsdHMgIE9QVElPTkFMCisgICAgKTsKKworVk9JRAorU2FsQ2FsbEJhY2sgKAorICAgIElOICBVSU5UNjQgICAgQXJnMSwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzIsCisgICAgSU4gIFVJTlQ2NCAgICBBcmczLAorICAgIElOICBVSU5UNjQgICAgQXJnNCwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzUsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc2LAorICAgIElOICBVSU5UNjQgICAgQXJnNywKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzgsCisgICAgT1VUIHJBcmcgICAgICAqUmVzdWx0cyAgT1BUSU9OQUwKKyAgICApOworCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0U2FsQ2FsbEJhY2sgKAorICAgIElOICBVSU5UNjQgICAgQXJnMSwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzIsCisgICAgSU4gIFVJTlQ2NCAgICBBcmczLAorICAgIElOICBVSU5UNjQgICAgQXJnNCwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzUsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc2LAorICAgIElOICBVSU5UNjQgICAgQXJnNywKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzgsCisgICAgT1VUIHJBcmcgICAgICAqUmVzdWx0cyAgT1BUSU9OQUwKKyAgICApOworCisKK2V4dGVybiBQTEFCRUwgICBSdEdsb2JhbFNhbFByb2NFbnRyeTsKK2V4dGVybiBQTEFCRUwgICBSdEdsb2JhbFNBTENhbGxCYWNrOworCisjcHJhZ21hIHBhY2soMSkKKy8vCisvLyBTQUwgU3lzdGVtIFRhYmxlCisvLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiBTaWduYXR1cmU7CisgICAgVUlOVDMyIExlbmd0aDsKKyAgICBVSU5UMTYgUmV2aXNpb247CisgICAgVUlOVDE2IEVudHJ5Q291bnQ7CisgICAgVUlOVDggIENoZWNrU3VtOworICAgIFVJTlQ4ICBSZXNlcnZlZFs3XTsKKyAgICBVSU5UMTYgU0FMQV9WZXI7CisgICAgVUlOVDE2IFNBTEJfVmVyOworICAgIFVJTlQ4ICBPZW1JZFszMl07CisgICAgVUlOVDggIFByb2R1Y3RJRFszMl07CisgICAgVUlOVDggIFJlc2VydmVkMls4XTsKK30gU0FMX1NZU1RFTV9UQUJMRV9IRFI7CisKKyNkZWZpbmUgU0FMX1NUX0VOVFJZX1BPSU5UICAgICAgICAgIDAKKyNkZWZpbmUgU0FMX1NUX01FTU9SWV9ERVNDUklQVE9SICAgIDEKKyNkZWZpbmUgU0FMX1NUX1BMQVRGT1JNX0ZFQVRVUkVTICAgIDIKKyNkZWZpbmUgU0FMX1NUX1RSX1VTQUdFICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0FMX1NUX1BUQyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0FMX1NUX0FQX1dBS0VVUCAgICAgICAgICAgIDUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgVHlwZTsgICAvLyAgVHlwZSA9PSAwIAorICAgIFVJTlQ4ICAgUmVzZXJ2ZWRbN107CisgICAgVUlOVDY0ICBQYWxQcm9jRW50cnk7CisgICAgVUlOVDY0ICBTYWxQcm9jRW50cnk7CisgICAgVUlOVDY0ICBHbG9iYWxEYXRhUG9pbnRlcjsKKyAgICBVSU5UNjQgIFJlc2VydmVkMlsyXTsKK30gU0FMX1NUX0VOVFJZX1BPSU5UX0RFU0NSSVBUT1I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgIFR5cGU7ICAgLy8gIFR5cGUgPT0gMQorICAgIFVJTlQ4ICAgTmVlZFZpcnR1YWxSZWdpc3RyYXRpb247CisgICAgVUlOVDggICBNZW1vcnlBdHRyaWJ1dGVzOworICAgIFVJTlQ4ICAgUGFnZUFjY2Vzc1JpZ2h0czsKKyAgICBVSU5UOCAgIFN1cHBvcnRlZEF0dHJpYnV0ZXM7CisgICAgVUlOVDggICBSZXNlcnZlZDsKKyAgICBVSU5UMTYgIE1lbW9yeVR5cGU7CisgICAgVUlOVDY0ICBQaHlzaWNhbE1lbW9yeUFkZHJlc3M7CisgICAgVUlOVDMyICBMZW5ndGg7CisgICAgVUlOVDMyICBSZXNlcnZlZDE7CisgICAgVUlOVDY0ICBPZW1SZXNlcnZlZDsKK30gU0FMX1NUX01FTU9SWV9ERVNDUklQVE9SX0VOVFJZOworCisvLworLy8gTWVtb3J5VHlwZSBpbmZvCisvLworI2RlZmluZSBTQUxfU0FQSUNfSVBJX0JMT0NLIDB4MDAwMgorI2RlZmluZSBTQUxfSU9fUE9SVF9NQVBQSU5HIDB4MDAwMworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDggICBUeXBlOyAgIC8vIFR5cGUgPT0gMgorICAgIFVJTlQ4ICAgUGxhdGZvcm1GZWF0dXJlczsKKyAgICBVSU5UOCAgIFJlc2VydmVkWzE0XTsKK30gU0FMX1NUX01FTU9SWV9ERUNSSVBUT1I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgIFR5cGU7ICAgLy8gVHlwZSA9PSAzCisgICAgVUlOVDggICBUUlR5cGU7CisgICAgVUlOVDggICBUUk51bWJlcjsKKyAgICBVSU5UOCAgIFJlc2VydmVkWzVdOworICAgIFVJTlQ2NCAgVmlydHVhbEFkZHJlc3M7CisgICAgVUlOVDY0ICBFbmNvZGVkUGFnZVNpemU7CisgICAgVUlOVDY0ICBSZXNlcnZlZDE7Cit9IFNBTF9TVF9UUl9ERUNSSVBUT1I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UNjQgIE51bWJlck9mUHJvY2Vzc29yczsKKyAgICBVSU5UNjQgIExvY2FsSURSZWdpc3RlcjsKK30gU0FMX0NPSEVSRU5DRV9ET01BSU5fSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBUeXBlOyAgIC8vIFR5cGUgPT0gNAorICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFszXTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZEb21haW5zOworICAgIFNBTF9DT0hFUkVOQ0VfRE9NQUlOX0lORk8gICpEb21haW5JbmZvcm1hdGlvbjsKK30gU0FMX1NUX0NBQ0hFX0NPSEVSRU5DRV9ERUNSSVBUT1I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgIFR5cGU7ICAgLy8gVHlwZSA9PSA1CisgICAgVUlOVDggICBXYWtlVXBUeXBlOworICAgIFVJTlQ4ICAgUmVzZXJ2ZWRbNl07CisgICAgVUlOVDY0ICBFeHRlcm5hbEludGVycnVwdFZlY3RvcjsKK30gU0FMX1NUX0FQX1dBS0VVUF9ERUNSSVBUT1I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTQUxfU1lTVEVNX1RBQkxFX0hEUiAgICAgICAgICAgIEhlYWRlcjsKKyAgICBTQUxfU1RfRU5UUllfUE9JTlRfREVTQ1JJUFRPUiAgIEVudHJ5MDsKK30gU0FMX1NZU1RFTV9UQUJMRV9BU0NFTkRJTkdfT1JERVI7CisKKyNkZWZpbmUgICAgIEZJVF9FTlRSWV9QVFIgICAgICAgKDB4MTAwMDAwMDAwIC0gMzIpICAvLyA0R0IgLSAyNAorI2RlZmluZSAgICAgRklUX1BBTEFfRU5UUlkgICAgICAoMHgxMDAwMDAwMDAgLSA0OCkgIC8vIDRHQiAtIDMyCisjZGVmaW5lICAgICBGSVRfUEFMQl9UWVBFICAgICAgIDAxCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UNjQgIEFkZHJlc3M7CisgICAgVUlOVDggICBTaXplWzNdOworICAgIFVJTlQ4ICAgUmVzZXJ2ZWQ7CisgICAgVUlOVDE2ICBSZXZpc2lvbjsKKyAgICBVSU5UOCAgIFR5cGU6NzsKKyAgICBVSU5UOCAgIENoZWNrU3VtVmFsaWQ6MTsKKyAgICBVSU5UOCAgIENoZWNrU3VtOworfSBGSVRfRU5UUlk7CisKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYKKyByQXJnIAorKCpDQUxMX1NBTF9QUk9DKSgKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzEsCisgICAgSU4gIFVJTlQ2NCAgICBBcmcyLAorICAgIElOICBVSU5UNjQgICAgQXJnMywKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzQsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc1LAorICAgIElOICBVSU5UNjQgICAgQXJnNiwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzcsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc4CisgICAgKTsKKwordHlwZWRlZgorIHJBcmcgCisoKkNBTExfUEFMX1BST0MpKAorICAgIElOICBVSU5UNjQgICAgQXJnMSwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzIsCisgICAgSU4gIFVJTlQ2NCAgICBBcmczLAorICAgIElOICBVSU5UNjQgICAgQXJnNAorICAgICk7CisKK2V4dGVybiBDQUxMX1NBTF9QUk9DICAgR2xvYmFsU2FsUHJvYzsKK2V4dGVybiBDQUxMX1BBTF9QUk9DICAgR2xvYmFsUGFsUHJvYzsKK2V4dGVybiBQTEFCRUwgICBTYWxQcm9jUGxhYmVsOworZXh0ZXJuIFBMQUJFTCAgIFBhbFByb2NQbGFiZWw7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9pbmMubWFrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvaW5jLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTI5OTZiCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvaW5jLm1hawpAQCAtMCwwICsxLDIzIEBACisNCisNCitJTkNfREVQUyA9ICQoSU5DX0RFUFMpICAgICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpLmggICAgICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpYXBpLmggICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpYmluZC5oICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpY29uLmggICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpZGVidWcuaCAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpZGVmLmggICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpZGV2cC5oICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpZXJyLmggICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpZnMuaCAgICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpbGliLmggICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpcGFydC5oICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpcGNpaW8uaCAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpcHJvdC5oICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpcHhlLmggICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpdmFyLmggICAgICAgIFwNCisgICAgICAgICAgICAgICAgcGUuaCAgICAgICAgICAgIFwNCisgICAgICAgICAgICAgICAgZWZpaXAuaCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlZml1ZHAuaCAgICAgICAgXAorICAgICAgICAgICAgICAgIGVmaXRjcC5oICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RkYXJnLmgNCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9saWJzbWJpb3MuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL2xpYnNtYmlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMWEyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9saWJzbWJpb3MuaApAQCAtMCwwICsxLDEzMiBAQAorI2lmbmRlZiBfTElCX1NNQklPU19ICisjZGVmaW5lIF9MSUJfU01CSU9TX0gKKy8qKysKKworQ29weXJpZ2h0IChjKSAyMDAwICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIExpYlNtYmlvcy5oCisgICAgCitBYnN0cmFjdDoKKworICAgIExpYiBpbmNsdWRlICBmb3IgU01CSU9TIHNlcnZpY2VzLiBVc2VkIHRvIGdldCBzeXN0ZW0gc2VyaWFsIG51bWJlciBhbmQgR1VJRAorCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIERlZmluZSBTTUJJT1MgdGFibGVzLgorLy8KKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgQW5jaG9yU3RyaW5nWzRdOworICAgIFVJTlQ4ICAgRW50cnlQb2ludFN0cnVjdHVyZUNoZWNrc3VtOworICAgIFVJTlQ4ICAgRW50cnlQb2ludExlbmd0aDsKKyAgICBVSU5UOCAgIE1ham9yVmVyc2lvbjsKKyAgICBVSU5UOCAgIE1pbm9yVmVyc2lvbjsKKyAgICBVSU5UMTYgIE1heFN0cnVjdHVyZVNpemU7CisgICAgVUlOVDggICBFbnRyeVBvaW50UmV2aXNpb247CisgICAgVUlOVDggICBGb3JtYXR0ZWRBcmVhWzVdOworICAgIFVJTlQ4ICAgSW50ZXJtZWRpYXRlQW5jaG9yU3RyaW5nWzVdOworICAgIFVJTlQ4ICAgSW50ZXJtZWRpYXRlQ2hlY2tzdW07CisgICAgVUlOVDE2ICBUYWJsZUxlbmd0aDsKKyAgICBVSU5UMzIgIFRhYmxlQWRkcmVzczsKKyAgICBVSU5UMTYgIE51bWJlck9mU21iaW9zU3RydWN0dXJlczsKKyAgICBVSU5UOCAgIFNtYmlvc0JjZFJldmlzaW9uOworfSBTTUJJT1NfU1RSVUNUVVJFX1RBQkxFOworCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBTTUJJT1Mgc3RydWN0dXJlcyBjYW4gYmUgb2RkIGJ5dGUgYWxpZ25lZCBzaW5jZSB0aGUKKy8vICB1bmZvcm1hdGVkIHNlY3Rpb24gb2YgZWFjaCByZWNvcmQgaXMgYSBzZXQgb2YgYXJiaXRyYXJ5IHNpemUgc3RyaW5ncy4KKy8vCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgIFR5cGU7CisgICAgVUlOVDggICBMZW5ndGg7CisgICAgVUlOVDggICBIYW5kbGVbMl07Cit9IFNNQklPU19IRUFERVI7CisKK3R5cGVkZWYgVUlOVDggICBTTUJJT1NfU1RSSU5HOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU01CSU9TX0hFQURFUiAgIEhkcjsKKyAgICBTTUJJT1NfU1RSSU5HICAgVmVuZG9yOworICAgIFNNQklPU19TVFJJTkcgICBCaW9zVmVyc2lvbjsKKyAgICBVSU5UOCAgICAgICAgICAgQmlvc1NlZ21lbnRbMl07CisgICAgU01CSU9TX1NUUklORyAgIEJpb3NSZWxlYXNlRGF0ZTsKKyAgICBVSU5UOCAgICAgICAgICAgQmlvc1NpemU7CisgICAgVUlOVDggICAgICAgICAgIEJpb3NDaGFyYWN0ZXJpc3RpY3NbOF07Cit9IFNNQklPU19UWVBFMDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNNQklPU19IRUFERVIgICBIZHI7CisgICAgU01CSU9TX1NUUklORyAgIE1hbnVmYWN0dXJlcjsKKyAgICBTTUJJT1NfU1RSSU5HICAgUHJvZHVjdE5hbWU7CisgICAgU01CSU9TX1NUUklORyAgIFZlcnNpb247CisgICAgU01CSU9TX1NUUklORyAgIFNlcmlhbE51bWJlcjsKKworICAgIC8vCisgICAgLy8gYWx3YXlzIGJ5dGUgY29weSB0aGlzIGRhdGEgdG8gcHJldmVudCBhbGlnbm1lbnQgZmF1bHRzIQorICAgIC8vCisgICAgRUZJX0dVSUQgICAgICAgIFV1aWQ7CisgICAgCisgICAgVUlOVDggICAgICAgICAgIFdha2VVcFR5cGU7Cit9IFNNQklPU19UWVBFMTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNNQklPU19IRUFERVIgICBIZHI7CisgICAgU01CSU9TX1NUUklORyAgIE1hbnVmYWN0dXJlcjsKKyAgICBTTUJJT1NfU1RSSU5HICAgUHJvZHVjdE5hbWU7CisgICAgU01CSU9TX1NUUklORyAgIFZlcnNpb247CisgICAgU01CSU9TX1NUUklORyAgIFNlcmlhbE51bWJlcjsKK30gU01CSU9TX1RZUEUyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU01CSU9TX0hFQURFUiAgIEhkcjsKKyAgICBTTUJJT1NfU1RSSU5HICAgTWFudWZhY3R1cmVyOworICAgIFVJTlQ4ICAgICAgICAgICBUeXBlOworICAgIFNNQklPU19TVFJJTkcgICBWZXJzaW9uOworICAgIFNNQklPU19TVFJJTkcgICBTZXJpYWxOdW1iZXI7CisgICAgU01CSU9TX1NUUklORyAgIEFzc2V0VGFnOworICAgIFVJTlQ4ICAgICAgICAgICBCb290dXBTdGF0ZTsKKyAgICBVSU5UOCAgICAgICAgICAgUG93ZXJTdXBwbHlTdGF0ZTsKKyAgICBVSU5UOCAgICAgICAgICAgVGhlcm1hbFN0YXRlOworICAgIFVJTlQ4ICAgICAgICAgICBTZWN1cml0eVN0YXR1czsKKyAgICBVSU5UOCAgICAgICAgICAgT2VtRGVmaW5lZFs0XTsKK30gU01CSU9TX1RZUEUzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU01CSU9TX0hFQURFUiAgIEhkcjsKKyAgICBVSU5UOCAgICAgICAgICAgU29ja2V0OworICAgIFVJTlQ4ICAgICAgICAgICBQcm9jZXNzb3JUeXBlOworICAgIFVJTlQ4ICAgICAgICAgICBQcm9jZXNzb3JGYW1pbHk7CisgICAgU01CSU9TX1NUUklORyAgIFByb2Nlc3Nvck1hbnVmYWN0dXJlOworICAgIFVJTlQ4ICAgICAgICAgICBQcm9jZXNzb3JJZFs4XTsKKyAgICBTTUJJT1NfU1RSSU5HICAgUHJvY2Vzc29yVmVyc2lvbjsKKyAgICBVSU5UOCAgICAgICAgICAgVm9sdGFnZTsKKyAgICBVSU5UOCAgICAgICAgICAgRXh0ZXJuYWxDbG9ja1syXTsKKyAgICBVSU5UOCAgICAgICAgICAgTWF4U3BlZWRbMl07CisgICAgVUlOVDggICAgICAgICAgIEN1cnJlbnRTcGVlZFsyXTsKKyAgICBVSU5UOCAgICAgICAgICAgU3RhdHVzOworICAgIFVJTlQ4ICAgICAgICAgICBQcm9jZXNzb3JVcGdyYWRlOworICAgIFVJTlQ4ICAgICAgICAgICBMMUNhY2hlSGFuZGxlWzJdOworICAgIFVJTlQ4ICAgICAgICAgICBMMkNhY2hlSGFuZGxlWzJdOworICAgIFVJTlQ4ICAgICAgICAgICBMM0NhY2hlSGFuZGxlWzJdOworfSBTTUJJT1NfVFlQRTQ7CisKK3R5cGVkZWYgdW5pb24geworICAgIFNNQklPU19IRUFERVIgICAqSGRyOworICAgIFNNQklPU19UWVBFMCAgICAqVHlwZTA7CisgICAgU01CSU9TX1RZUEUxICAgICpUeXBlMTsKKyAgICBTTUJJT1NfVFlQRTIgICAgKlR5cGUyOworICAgIFNNQklPU19UWVBFMyAgICAqVHlwZTM7CisgICAgU01CSU9TX1RZUEU0ICAgICpUeXBlNDsKKyAgICBVSU5UOCAgICAgICAgICAgKlJhdzsKK30gU01CSU9TX1NUUlVDVFVSRV9QT0lOVEVSOworI3ByYWdtYSBwYWNrKCkKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvbWFrZS5pbmYgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9tYWtlLmluZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTczMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvbWFrZS5pbmYKQEAgLTAsMCArMSwzMyBAQAorIw0KKyMNCisjDQorDQorW3NvdXJjZXNdDQorICAgIGVmaS5oDQorICAgIGVmaWFwaS5oDQorICAgIGVmaWNvbi5oDQorICAgIGVmaWRlYnVnLmgNCisgICAgZWZpZGVmLmgNCisgICAgZWZpZGV2cC5oDQorICAgIGVmaWVyci5oDQorICAgIGVmaWZzLmgNCisgICAgZWZpbGliLmgNCisgICAgZWZpcGFydC5oDQorICAgIGVmaXBjaWlvLmgNCisgICAgZWZpcHJvdC5oDQorICAgIGVmaXB4ZWJjLmgNCisgICAgZWZpc3RkYXJnLmgNCisgICAgZWZpbmV0LmgNCisgICAgZWZpaXAuaAorICAgIGVmaXVkcC5oCisgICAgZWZpdGNwLmgKKw0KK1tpYTMyc291cmNlc10NCisgICAgZWZpYmluZC5oDQorICAgIHBlLmgNCisgICAgZWZpbGlicGxhdC5oDQorDQorW2lhNjRzb3VyY2VzXQ0KKyAgICBlZmliaW5kLmgNCisgICAgcGUuaA0KKyAgICBlZmlsaWJwbGF0LmgNCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9tYWtlZmlsZS5oZHIgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9tYWtlZmlsZS5oZHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlZjM4NwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL21ha2VmaWxlLmhkcgpAQCAtMCwwICsxLDQ4IEBACisNCisjDQorIyBUaGlzIGlzIGEgbWFjaGluZSBnZW5lcmF0ZWQgZmlsZSAtIERPIE5PVCBFRElUDQorIyAgICBHZW5lcmF0ZWQgYnkgZ2VubWFrZS5leGUNCisjICAgIEdlbmVyYXRlZCBmcm9tIG1ha2UuaW5mDQorIyAgICBDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uDQorIw0KKw0KK0lOQ19ERVBTID0gJChJTkNfREVQUykgXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcZWZpLmggXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcZWZpYXBpLmggXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcZWZpY29uLmggXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcZWZpZGVidWcuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxlZmlkZWYuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxlZmlkZXZwLmggXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcZWZpZXJyLmggXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcZWZpZnMuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxlZmlsaWIuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxlZmlwYXJ0LmggXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcZWZpcGNpaW8uaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxlZmlwcm90LmggXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcZWZpcHhlYmMuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxlZmlzdGRhcmcuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxlZmluZXQuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxlZmlpcC5oIFwKKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcZWZpdWRwLmggXAorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxlZml0Y3AuaCBcCisNCisNCishSUYgIiQoUFJPQ0VTU09SKSIgPT0gIklhMzIiDQorSU5DX0RFUFMgPSAkKElOQ19ERVBTKSBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxJYTMyXGVmaWJpbmQuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxJYTMyXHBlLmggXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlcSWEzMlxlZmlsaWJwbGF0LmggXA0KKw0KKw0KKyFFTkRJRg0KKw0KKw0KKyFJRiAiJChQUk9DRVNTT1IpIiA9PSAiSWE2NCINCitJTkNfREVQUyA9ICQoSU5DX0RFUFMpIFwNCisgICAgJChTREtfSU5TVEFMTF9ESVIpXGluY2x1ZGVcZWZpXElhNjRcZWZpYmluZC5oIFwNCisgICAgJChTREtfSU5TVEFMTF9ESVIpXGluY2x1ZGVcZWZpXElhNjRccGUuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxJYTY0XGVmaWxpYnBsYXQuaCBcDQorDQorDQorIUVORElGDQorDQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcGNpMjIuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3BjaTIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0ZjUxOQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3BjaTIyLmgKQEAgLTAsMCArMSwxOTMgQEAKKyNpZm5kZWYgX1BDSTIyX0gKKyNkZWZpbmUgX1BDSTIyX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTkgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgcGNpMjIuaAorICAgIAorQWJzdHJhY3Q6ICAgICAgCisgICAgU3VwcG9ydCBmb3IgUENJIDIuMiBzdGFuZGFyZC4KKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpZmRlZiBTT0ZUX1NEVgorI2RlZmluZSBQQ0lfTUFYX0JVUyAgICAgMQorI2Vsc2UKKyNkZWZpbmUgUENJX01BWF9CVVMgICAgIDI1NQorI2VuZGlmCisKKyNkZWZpbmUgUENJX01BWF9ERVZJQ0UgIDMxCisjZGVmaW5lIFBDSV9NQVhfRlVOQyAgICA3CisKKy8vCisvLyBDb21tYW5kCisvLworI2RlZmluZSBQQ0lfVkdBX1BBTEVUVEVfU05PT1BfRElTQUJMRUQgICAweDIwCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQxNiAgICAgIFZlbmRvcklkOworICAgIFVJTlQxNiAgICAgIERldmljZUlkOworICAgIFVJTlQxNiAgICAgIENvbW1hbmQ7CisgICAgVUlOVDE2ICAgICAgU3RhdHVzOworICAgIFVJTlQ4ICAgICAgIFJldmlzaW9uSUQ7CisgICAgVUlOVDggICAgICAgQ2xhc3NDb2RlWzNdOworICAgIFVJTlQ4ICAgICAgIENhY2hlTGluZVNpemU7CisgICAgVUlOVDggICAgICAgTGF5dGVuY3lUaW1lcjsKKyAgICBVSU5UOCAgICAgICBIZWFkZXJUeXBlOworICAgIFVJTlQ4ICAgICAgIEJJU1Q7Cit9IFBDSV9ERVZJQ0VfSU5ERVBFTkRFTlRfUkVHSU9OOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICAgICAgQmFyWzZdOworICAgIFVJTlQzMiAgICAgIENJU1B0cjsKKyAgICBVSU5UMTYgICAgICBTdWJzeXN0ZW1WZW5kb3JJRDsKKyAgICBVSU5UMTYgICAgICBTdWJzeXN0ZW1JRDsKKyAgICBVSU5UMzIgICAgICBFeHBhbnNpb25Sb21CYXI7CisgICAgVUlOVDMyICAgICAgUmVzZXJ2ZWRbMl07CisgICAgVUlOVDggICAgICAgSW50ZXJydXB0TGluZTsKKyAgICBVSU5UOCAgICAgICBJbnRlcnJ1cHRQaW47CisgICAgVUlOVDggICAgICAgTWluR250OworICAgIFVJTlQ4ICAgICAgIE1heExhdDsgICAgIAorfSBQQ0lfREVWSUNFX0hFQURFUl9UWVBFX1JFR0lPTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFBDSV9ERVZJQ0VfSU5ERVBFTkRFTlRfUkVHSU9OICAgSGRyOworICAgIFBDSV9ERVZJQ0VfSEVBREVSX1RZUEVfUkVHSU9OICAgRGV2aWNlOworfSBQQ0lfVFlQRTAwOworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAKKyAgICBVSU5UMzIgICAgICBCYXJbMl07CisgICAgVUlOVDggICAgICAgUHJpbWFyeUJ1czsKKyAgICBVSU5UOCAgICAgICBTZWNvbmRhcnlCdXM7CisgICAgVUlOVDggICAgICAgU3Vib3JkaW5hdGVCdXM7CisgICAgVUlOVDggICAgICAgU2Vjb25kYXJ5TGF0ZW5jeVRpbWVyOworICAgIFVJTlQ4ICAgICAgIElvQmFzZTsKKyAgICBVSU5UOCAgICAgICBJb0xpbWl0OworICAgIFVJTlQxNiAgICAgIFNlY29uZGFyeVN0YXR1czsKKyAgICBVSU5UMTYgICAgICBNZW1vcnlCYXNlOworICAgIFVJTlQxNiAgICAgIE1lbW9yeUxpbWl0OworICAgIFVJTlQxNiAgICAgIFByZWZldGNoYWJsZU1lbW9yeUJhc2U7CisgICAgVUlOVDE2ICAgICAgUHJlZmV0Y2hhYmxlTWVtb3J5TGltaXQ7CisgICAgVUlOVDMyICAgICAgUHJlZmV0Y2hhYmxlQmFzZVVwcGVyMzI7CisgICAgVUlOVDMyICAgICAgUHJlZmV0Y2hhYmxlTGltaXRVcHBlcjMyOworICAgIFVJTlQxNiAgICAgIElvQmFzZVVwcGVyMTY7CisgICAgVUlOVDE2ICAgICAgSW9MaW1pdFVwcGVyMTY7CisgICAgVUlOVDMyICAgICAgUmVzZXJ2ZWQ7CisgICAgVUlOVDMyICAgICAgRXhwYW5zaW9uUm9tQkFSOworICAgIFVJTlQ4ICAgICAgIEludGVycnVwdExpbmU7CisgICAgVUlOVDggICAgICAgSW50ZXJydXB0UGluOworICAgIFVJTlQxNiAgICAgIEJyaWRnZUNvbnRyb2w7Cit9IFBDSV9CUklER0VfQ09OVFJPTF9SRUdJU1RFUjsKKworI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWV9DVFJMICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUENJX0NMQVNTX1ZHQSAgICAgICAgICAgICAgICAgICAweDAwCisKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRSAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIFBDSV9DTEFTU19JU0EgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBQQ0lfQ0xBU1NfSVNBX1BPU0lUSVZFX0RFQ09ERSAgIDB4ODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SSyAgICAgICAgICAgICAgIDB4MDIgCisjZGVmaW5lIFBDSV9DTEFTU19FVEhFUk5FVCAgICAgICAgICAgICAgMHgwMAorICAgICAgICAKKyNkZWZpbmUgSEVBREVSX1RZUEVfREVWSUNFICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEhFQURFUl9UWVBFX1BDSV9UT19QQ0lfQlJJREdFICAgMHgwMQorI2RlZmluZSBIRUFERVJfVFlQRV9NVUxUSV9GVU5DVElPTiAgICAgIDB4ODAKKyNkZWZpbmUgSEVBREVSX0xBWU9VVF9DT0RFICAgICAgICAgICAgICAweDdmCisKKyNkZWZpbmUgSVNfUENJX0JSSURHRShfcCkgKCgoKF9wKS0+SGRyLkhlYWRlclR5cGUpICYgSEVBREVSX0xBWU9VVF9DT0RFKSA9PSBIRUFERVJfVFlQRV9QQ0lfVE9fUENJX0JSSURHRSkgICAgICAgIAorI2RlZmluZSBJU19QQ0lfTVVMVElfRlVOQyhfcCkgICAoKChfcCktPkhkci5IZWFkZXJUeXBlKSAmIEhFQURFUl9UWVBFX01VTFRJX0ZVTkNUSU9OKSAgICAgICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUENJX0RFVklDRV9JTkRFUEVOREVOVF9SRUdJT04gICBIZHI7CisgICAgUENJX0JSSURHRV9DT05UUk9MX1JFR0lTVEVSICAgICBCcmlkZ2U7Cit9IFBDSV9UWVBFMDE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UOCAgIFJlZ2lzdGVyOworICAgIFVJTlQ4ICAgRnVuY3Rpb247CisgICAgVUlOVDggICBEZXZpY2U7CisgICAgVUlOVDggICBCdXM7CisgICAgVUlOVDggICBSZXNlcnZlZFs0XTsKK30gREVGSU9fUENJX0FERFI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgIFJlZyAgICAgOiA4OworICAgIFVJTlQzMiAgRnVuYyAgICA6IDM7CisgICAgVUlOVDMyICBEZXYgICAgIDogNTsKKyAgICBVSU5UMzIgIEJ1cyAgICAgOiA4OworICAgIFVJTlQzMiAgUmVzZXJ2ZWQ6IDc7CisgICAgVUlOVDMyICBFbmFibGUgIDogMTsKK30gUENJX0NPTkZJR19BQ0NFU1NfQ0Y4OworCisjcHJhZ21hIHBhY2soKQorCisjZGVmaW5lIEVGSV9ST09UX0JSSURHRV9MSVNUICAgICdlcHJiJwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlROICAgICAgICAgICBTaWduYXR1cmU7CisKKyAgICBVSU5UMTYgICAgICAgICAgQnJpZGdlTnVtYmVyOworICAgIFVJTlQxNiAgICAgICAgICBQcmltYXJ5QnVzOworICAgIFVJTlQxNiAgICAgICAgICBTdWJvcmRpbmF0ZUJ1czsKKworICAgIEVGSV9ERVZJQ0VfUEFUSCAqRGV2aWNlUGF0aDsKKworICAgIExJU1RfRU5UUlkgICAgICBMaW5rOworfSBQQ0lfUk9PVF9CUklER0VfRU5UUlk7CisKKworI2RlZmluZSBQQ0lfRVhQQU5TSU9OX1JPTV9IRUFERVJfU0lHTkFUVVJFICAgICAgICAweGFhNTUKKyNkZWZpbmUgRUZJX1BDSV9FWFBBTlNJT05fUk9NX0hFQURFUl9FRklTSUdOQVRVUkUgMHgwRUYxCisjZGVmaW5lIFBDSV9EQVRBX1NUUlVDVFVSRV9TSUdOQVRVUkUgICAgICAgICAgICAgIEVGSV9TSUdOQVRVUkVfMzIoJ1AnLCdDJywnSScsJ1InKQorCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgICAgICAgICAgU2lnbmF0dXJlOyAgICAgICAgICAgICAgLy8gMHhhYTU1CisgICAgVUlOVDggICAgICAgICAgIFJlc2VydmVkWzB4MTZdOworICAgIFVJTlQxNiAgICAgICAgICBQY2lyT2Zmc2V0OworfSBQQ0lfRVhQQU5TSU9OX1JPTV9IRUFERVI7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQxNiAgICAgICAgICBTaWduYXR1cmU7ICAgICAgICAgICAgICAvLyAweGFhNTUKKyAgICBVSU5UMTYgICAgICAgICAgSW5pdGlhbGl6YXRpb25TaXplOworICAgIFVJTlQxNiAgICAgICAgICBFZmlTaWduYXR1cmU7ICAgICAgICAgICAvLyAweDBFRjEKKyAgICBVSU5UMTYgICAgICAgICAgRWZpU3Vic3lzdGVtOworICAgIFVJTlQxNiAgICAgICAgICBFZmlNYWNoaW5lVHlwZTsKKyAgICBVSU5UOCAgICAgICAgICAgUmVzZXJ2ZWRbMHgwQV07CisgICAgVUlOVDE2ICAgICAgICAgIEVmaUltYWdlSGVhZGVyT2Zmc2V0OworICAgIFVJTlQxNiAgICAgICAgICBQY2lyT2Zmc2V0OworfSBFRklfUENJX0VYUEFOU0lPTl9ST01fSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyICAgICAgICAgIFNpZ25hdHVyZTsgICAgICAgICAgICAgIC8vICJQQ0lSIiAKKyAgICBVSU5UMTYgICAgICAgICAgVmVuZG9ySWQ7CisgICAgVUlOVDE2ICAgICAgICAgIERldmljZUlkOworICAgIFVJTlQxNiAgICAgICAgICBSZXNlcnZlZDA7CisgICAgVUlOVDE2ICAgICAgICAgIExlbmd0aDsKKyAgICBVSU5UOCAgICAgICAgICAgUmV2aXNpb247CisgICAgVUlOVDggICAgICAgICAgIENsYXNzQ29kZVszXTsKKyAgICBVSU5UMTYgICAgICAgICAgSW1hZ2VMZW5ndGg7CisgICAgVUlOVDE2ICAgICAgICAgIENvZGVSZXZpc2lvbjsKKyAgICBVSU5UOCAgICAgICAgICAgQ29kZVR5cGU7CisgICAgVUlOVDggICAgICAgICAgIEluZGljYXRvcjsKKyAgICBVSU5UMTYgICAgICAgICAgUmVzZXJ2ZWQxOworfSBQQ0lfREFUQV9TVFJVQ1RVUkU7CisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYKKyAgICAKKworCisKKworICAgIApkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvYWRhcHRlcmRlYnVnLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9hZGFwdGVyZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzBhZjVkCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvYWRhcHRlcmRlYnVnLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfQURBUFRFUl9ERUJVR19ICisjZGVmaW5lIF9BREFQVEVSX0RFQlVHX0gKKworLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTkgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgQWRhcHRlckRlYnVnLmgKKyAgICAKK0Fic3RyYWN0OgorCisgICAgUHJvdG9jb2wgdG8gZGVidWcgdGhlIEVERCAzLjAgZW5hYmxlbWVudCBvZiBCSU9TIG9wdGlvbiBST01zCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8gezgyRjg2ODgxLTI4MkItMTFkNC1CQzdELTAwODBDNzNDODg4MX0KKyNkZWZpbmUgQURBUFRFUl9ERUJVR19QUk9UT0NPTCBcCit7IDB4ODJmODY4ODEsIDB4MjgyYiwgMHgxMWQ0LCB7MHhiYywgMHg3ZCwgMHgwLCAweDgwLCAweGM3LCAweDNjLCAweDg4LCAweDgxfSB9CisKKy8vCisvLyBUaGlzIHByb3RvY29sIHBvaW50cyB0byB0aGUgQklPU19MRUdBQ1lfRFJJVkUgZGF0YSBzdHJ1Y3R1cmUKKy8vICBzZWUgZWRkLmggZm9yIG1vcmUgZGV0YWlscworLy8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3Byb3RvY29sL2VmaWNvbnNwbGl0LmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9lZmljb25zcGxpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YWRiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9lZmljb25zcGxpdC5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX0VGSV9DT05GT1JLX0gKKyNkZWZpbmUgX0VGSV9DT05GT1JLX0gKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk5ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworQWJzdHJhY3Q6CisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworCisKKy8vCisvLyBDb25PdXQgRm9ya2VyIFByb3RvY29sCisvLworCisjZGVmaW5lIFRFWFRfT1VUX1NQTElURVJfUFJPVE9DT0wgICAgXAorICAgIHsgMHg1NmQ4MzBhMCwgMHg3ZTdhLCAweDExZDMsIHsweGJiLCAweGEwLCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworI2RlZmluZSBFUlJPUl9PVVRfU1BMSVRFUl9QUk9UT0NPTCAgICBcCisgICAgeyAweGYwYmE5MDM5LCAweDY4ZjEsIDB4NDI1ZSwgezB4YWEsIDB4N2YsIDB4ZDksIDB4YWEsIDB4ZjksIDB4MWIsIDB4ODIsIDB4YTF9fQorCisjZGVmaW5lIFRFWFRfSU5fU1BMSVRFUl9QUk9UT0NPTCAgICBcCisgICAgeyAweGY5YTNjNTUwLCAweDdmYjUsIDB4MTFkMywgezB4YmIsIDB4YTAsIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3Byb3RvY29sL2VmaWRiZy5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvZWZpZGJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5NWE3MAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3Byb3RvY29sL2VmaWRiZy5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwCisgKiBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgSW50ZWwgQ29ycG9yYXRpb24gYW5kCisgKiAgICBpdHMgY29udHJpYnV0b3JzLgorICogCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG9yIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisgKiAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSU5URUwgQ09SUE9SQVRJT04gQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElOVEVMIENPUlBPUkFUSU9OIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiAKKyAqLworCisKKyNpZm5kZWYgX0VGSURCR19IXworI2RlZmluZSBfRUZJREJHX0hfCisKKyNpbmNsdWRlICJlZmljb250ZXh0LmgiCisjaW5jbHVkZSAiZWZpc2VyLmgiCisKK3R5cGVkZWYgc3RydWN0IF9ERUJVR1BPUlRfMTY1NTBfQ09ORklHX0RBVEEgeworICAgICAgICBVSU5UMzIJCQkJCQkJUG9ydEFkZHJlc3M7CisgICAgICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZFJhdGU7CisgICAgCVVJTlQzMiAgICAgICAgICAgICAgIAkJCVJlY2VpdmVGaWZvRGVwdGg7CisgICAgCVVJTlQzMiAgICAgICAgICAgICAgIAkJCVRpbWVvdXQ7CisgICAgICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyaXR5OworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCaXRzOworICAgICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3BCaXRzOworCSAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIAlDb250cm9sTWFzazsKKyAgICAgICAgQk9PTEVBTgkJCQkJCQlSdHNDdHNFbmFibGU7CQkvLyBSVFMsIENUUyBjb250cm9sCit9IERFQlVHUE9SVF8xNjU1MF9DT05GSUdfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgX0RFQlVHUE9SVF8xNjU1MF9ERVZJQ0VfUEFUSCB7CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgSGVhZGVyOworICAgICAgICBERUJVR1BPUlRfMTY1NTBfQ09ORklHX0RBVEEJCUNvbmZpZ0RhdGE7Cit9IERFQlVHUE9SVF8xNjU1MF9ERVZJQ0VfUEFUSDsKKwordHlwZWRlZiB1bmlvbiB7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgRGV2UGF0aDsKKyAgICBERUJVR1BPUlRfMTY1NTBfREVWSUNFX1BBVEggICAgICAgICBVYXJ0OworICAgIC8vIGFkZCBuZXcgdHlwZXMgb2YgZGVidWdwb3J0IGRldmljZSBwYXRocyB0byB0aGlzIHVuaW9uLi4uCit9IERFQlVHUE9SVF9ERVZfUEFUSDsKKworCisvLworLy8gRGVidWcgU3VwcG9ydCBwcm90b2NvbCB7Mjc1NTU5MEMtNkYzQy00MkZBLTlFQTQtQTNCQTU0M0NEQTI1fQorLy8KKworI2RlZmluZSBERUJVR19TVVBQT1JUX1BST1RPQ09MIFwKK3sgMHgyNzU1NTkwQywgMHg2RjNDLCAweDQyZmEsIDB4OUUsIDB4QTQsIDB4QTMsIDB4QkEsIDB4NTQsIDB4M0MsIDB4REEsIDB4MjUgfQorCisKK3R5cGVkZWYgVUlOVE4gRVhDRVBUSU9OX1RZUEU7CisKK3R5cGVkZWYKK1ZPSUQKKygqRVhDRVBUSU9OX0hBTkRMRVIpICgKKwlJTiBFWENFUFRJT05fVFlQRSBFeGNlcHRpb25UeXBlLAorICAgIElOIFNZU1RFTV9DT05URVhUICpTeXN0ZW1Db250ZXh0CisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1JFR0lTVEVSX1RJTUVSX1RJQ0tfQ0FMTEJBQ0spICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9ERUJVR19TVVBQT1JUX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gRVhDRVBUSU9OX0hBTkRMRVIJICAgICAgICAgICAgICAgIFRpbWVyVGlja0NhbGxiYWNrCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1JFR0lTVEVSX0VYQ0VQVElPTl9IQU5ETEVSKSAoCisgICAgSU4gICAgIHN0cnVjdCBfRUZJX0RFQlVHX1NVUFBPUlRfSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiAgICAgRVhDRVBUSU9OX0hBTkRMRVIgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkhhbmRsZXIsCisgICAgSU4gICAgIEVYQ0VQVElPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25UeXBlCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lQX0NBTExfVFJBQ0UpICgKKyAgICBJTiAgICAgc3RydWN0IF9FRklfREVCVUdfU1VQUE9SVF9JTlRFUkZBQ0UgICpUaGlzCisgICAgKTsKKworCisjZGVmaW5lIEVGSV9ERUJVR19TVVBQT1JUX0lOVEVSRkFDRV9SRVZJU0lPTiAgICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0RFQlVHX1NVUFBPUlRfSU5URVJGQUNFIHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIAlSZXZpc2lvbjsKKyAgICBFRklfUkVHSVNURVJfVElNRVJfVElDS19DQUxMQkFDSwlSZWdpc3RlclRpbWVyVGlja0NhbGxiYWNrOworICAgIEVGSV9SRUdJU1RFUl9FWENFUFRJT05fSEFORExFUiAgCVJlZ2lzdGVyRXhjZXB0aW9uSGFuZGxlcjsKKyAgICBFRklfSVBfQ0FMTF9UUkFDRSAgICAgICAgICAgICAgIAlJcENhbGxUcmFjZTsKK30gRUZJX0RFQlVHX1NVUFBPUlRfSU5URVJGQUNFOworCisKKy8vCisvLyBEZWJ1Z3BvcnQgaW8gcHJvdG9jb2wge0VCQTRFOEQyLTM4NTgtNDFFQy1BMjgxLTI2NDdCQTk2NjBEMH0KKy8vCisKKyNkZWZpbmUgREVCVUdQT1JUX0lPX1BST1RPQ09MIFwKK3sgMFhFQkE0RThEMiwgMFgzODU4LCAwWDQxRUMsIDBYQTIsIDBYODEsIDBYMjYsIDBYNDcsIDBYQkEsIDBYOTYsIDBYNjAsIDBYRDAgfQorIAorCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfREVCVUdQT1JUX0lPX1JFU0VUKSAoCisgICAgSU4gc3RydWN0IF9FRklfREVCVUdQT1JUX0lPX0lOVEVSRkFDRSAgCSpUaGlzCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RFQlVHUE9SVF9JT19SRUFEKSAoCisgICAgSU4gICAgIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9JT19JTlRFUkZBQ0UJKlRoaXMsCisgICAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAJCSpCdWZmZXJTaXplLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgIAkJKkJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9ERUJVR1BPUlRfSU9fV1JJVEUpICgKKyAgICBJTiAgICAgc3RydWN0IF9FRklfREVCVUdQT1JUX0lPX0lOVEVSRkFDRSAqVGhpcywKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgIAkJKkJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAJCSpCdWZmZXIKKyAgICApOworCisjZGVmaW5lIEVGSV9ERUJVR1BPUlRfSU9fSU5URVJGQUNFX1JFVklTSU9OICAgMHgwMDAxMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9JT19JTlRFUkZBQ0UgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgCQlSZXZpc2lvbjsKKyAgICBFRklfREVCVUdQT1JUX0lPX1JFQUQJCQkJCVJlYWQ7CisgICAgRUZJX0RFQlVHUE9SVF9JT19XUklURQkJCQkJV3JpdGU7CisgICAgRUZJX0RFQlVHUE9SVF9JT19SRVNFVAkJCQkJUmVzZXQ7Cit9IEVGSV9ERUJVR1BPUlRfSU9fSU5URVJGQUNFOworCisKKy8vCisvLyBEZWJ1Z3BvcnQgVUFSVDE2NTUwIGNvbnRyb2wgcHJvdG9jb2wgezYyOEVBOTc4LTRDMjYtNDYwNS1CQzAyLUE0MkE0OTY5MTdERH0KKy8vCisKKyNkZWZpbmUgREVCVUdQT1JUX1VBUlQxNjU1MF9DT05UUk9MX1BST1RPQ09MIFwKK3sgMFg2MjhFQTk3OCwgMFg0QzI2LCAwWDQ2MDUsIDBYQkMsIDBYMiwgMFhBNCwgMFgyQSwgMFg0OSwgMFg2OSwgMFgxNywgMFhERCB9CisgCisvLyBOb3RlOiBUaGUgZGVmaW5pdGlvbnMgZm9yIEVGSV9QQVJJVFlfVFlQRSwgRUZJX1NUT1BfQklUU19UWVBFLCBhbmQgCisvLyBTRVJJQUxfSU9fTU9ERSBhcmUgaW5jbHVkZWQgZnJvbSBlZmlzZXIuaAorCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVUFSVDE2NTUwX1NFVF9BVFRSSUJVVEVTKSAoCisgICAgSU4gc3RydWN0IF9FRklfREVCVUdQT1JUX1VBUlQxNjU1MF9DT05UUk9MX0lOVEVSRkFDRSAgCSpUaGlzLAorICAgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgCUJhdWRSYXRlLAorICAgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgCVJlY2VpdmVGaWZvRGVwdGgsCisgICAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAJVGltZW91dCwKKyAgICBJTiBFRklfUEFSSVRZX1RZUEUgICAgICAgCQkJUGFyaXR5LAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgCURhdGFCaXRzLAorICAgIElOIEVGSV9TVE9QX0JJVFNfVFlQRSAgICAJCQlTdG9wQml0cworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VQVJUMTY1NTBfU0VUX0NPTlRST0xfQklUUykgKAorICAgIElOIHN0cnVjdCBfRUZJX0RFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9JTlRFUkZBQ0UgIAkqVGhpcywKKyAgICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIAlDb250cm9sCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VBUlQxNjU1MF9HRVRfQ09OVFJPTF9CSVRTKSAoCisgICAgSU4gc3RydWN0IF9FRklfREVCVUdQT1JUX1VBUlQxNjU1MF9DT05UUk9MX0lOVEVSRkFDRQkqVGhpcywKKyAgICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIAkqQ29udHJvbAorICAgICk7CisKKyNkZWZpbmUgRUZJX0RFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9JTlRFUkZBQ0VfUkVWSVNJT04gICAweDAwMDEwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9FRklfREVCVUdQT1JUX1VBUlQxNjU1MF9DT05UUk9MX0lOVEVSRkFDRSB7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAJUmV2aXNpb247CisJRUZJX1VBUlQxNjU1MF9TRVRfQVRUUklCVVRFUwkJU2V0QXR0cmlidXRlczsKKwlFRklfVUFSVDE2NTUwX1NFVF9DT05UUk9MX0JJVFMJCVNldENvbnRyb2w7CisJRUZJX1VBUlQxNjU1MF9HRVRfQ09OVFJPTF9CSVRTIAkJR2V0Q29udHJvbDsKKwlERUJVR1BPUlRfMTY1NTBfQ09ORklHX0RBVEEJCQkqTW9kZTsKK30gRUZJX0RFQlVHUE9SVF9VQVJUMTY1NTBfQ09OVFJPTF9JTlRFUkZBQ0U7CisgICAgICAgIAorCisjZGVmaW5lIERFVklDRV9QQVRIX0RFQlVHUE9SVCBERUJVR1BPUlRfSU9fUFJPVE9DT0wKKyAgICAgICAgCisjZW5kaWYgLyogX0VGSURCR19IXyAqLwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvZWZpdmFyLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9lZml2YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmRjNTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvZWZpdmFyLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworQWJzdHJhY3Q6CisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworCisKKy8vCisvLyBUaGUgdmFyaWFibGUgc3RvcmUgcHJvdG9jb2wgaW50ZXJmYWNlIGlzIHNwZWNpZmljIHRvIHRoZSByZWZlcmVuY2UKKy8vIGltcGxlbWVudGF0aW9uLiAgVGhlIGluaXRpYWxpemF0aW9uIGNvZGUgYWRkcyB2YXJpYWJsZSBzdG9yZSBkZXZpY2VzCisvLyB0byB0aGUgc3lzdGVtLCBhbmQgdGhlIEZXIGNvbm5lY3RzIHRvIHRoZSBkZXZpY2VzIHRvIHByb3ZpZGUgdGhlCisvLyB2YXJpYWJsZSBzdG9yZSBpbnRlcmZhY2VzIHRocm91Z2ggdGhlc2UgZGV2aWNlcy4KKy8vCisKKy8vCisvLyBWYXJpYWJsZSBTdG9yZSBEZXZpY2UgcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgVkFSSUFCTEVfU1RPUkVfUFJPVE9DT0wgICAgXAorICAgIHsgMHhmMDg4Y2Q5MSwgMHhhMDQ2LCAweDExZDIsIHsweDhlLCAweDQyLCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworSU5URVJGQUNFX0RFQ0woX0VGSV9WQVJJQUJMRV9TVE9SRSk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TVE9SRV9DTEVBUikgKAorICAgIElOIHN0cnVjdCBfRUZJX1ZBUklBQkxFX1NUT1JFICAgKlRoaXMsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBCYW5rTm8sCisgICAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU2NyYXRjaAorICAgICk7CisKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NUT1JFX1JFQUQpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9WQVJJQUJMRV9TVE9SRSAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQmFua05vLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZSwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgICApOworCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU1RPUkVfVVBEQVRFKSAoCisgICAgSU4gc3RydWN0IF9FRklfVkFSSUFCTEVfU1RPUkUgICAqVGhpcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJhbmtObywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NUT1JFX1NJWkUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9WQVJJQUJMRV9TVE9SRSAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgTm9CYW5rcworICAgICk7CisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9UUkFOU0FDVElPTl9VUERBVEUpICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9WQVJJQUJMRV9TVE9SRSAgICpUaGlzLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQmFua05vLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKk5ld0NvbnRlbnRzCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9WQVJJQUJMRV9TVE9SRSB7CisKKyAgICAvLworICAgIC8vIE51bWJlciBvZiBiYW5rcyBhbmQgYmFuayBzaXplCisgICAgLy8KKworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBCYW5rU2l6ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgTm9CYW5rczsKKworICAgIC8vCisgICAgLy8gRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgc3RvcmFnZSBiYW5rcworICAgIC8vCisKKyAgICBFRklfU1RPUkVfQ0xFQVIgICAgICAgICAgICAgQ2xlYXJTdG9yZTsKKyAgICBFRklfU1RPUkVfUkVBRCAgICAgICAgICAgICAgUmVhZFN0b3JlOworICAgIEVGSV9TVE9SRV9VUERBVEUgICAgICAgICAgICBVcGRhdGVTdG9yZTsKKyAgICBFRklfU1RPUkVfU0laRSAgICAgICAgICAgICAgU2l6ZVN0b3JlIE9QVElPTkFMOworICAgIEVGSV9UUkFOU0FDVElPTl9VUERBVEUgICAgICBUcmFuc2FjdGlvblVwZGF0ZSBPUFRJT05BTDsKKworfSBFRklfVkFSSUFCTEVfU1RPUkU7CisKKworLy8KKy8vCisvLyBDbGVhclN0b3JlKCkgICAgIC0gQSBmdW5jdGlvbiB0byBjbGVhciB0aGUgcmVxdWVzdGVkIHN0b3JhZ2UgYmFuay4gIEEgY2xlYXJlZAorLy8gICAgICBiYW5rIGNvbnRhaW5zIGFsbCAib24iIGJpdHMuCisvLworLy8gUmVhZFN0b3JlKCkgICAgICAtIFJlYWQgZGF0YSBmcm9tIHRoZSByZXF1ZXN0ZWQgc3RvcmUuCisvLworLy8gVXBkYXRlU3RvcmUoKSAgICAtIFVwZGF0ZXMgZGF0YSBvbiB0aGUgcmVxdWVzdGVkIHN0b3JlLiBUaGUgRlcgd2lsbCBvbmx5CisvLyAgICAgIGV2ZXIgaXNzdWUgdXBkYXRlcyB0byBjbGVhciBiaXRzIGluIHRoZSBzdG9yZS4gVXBkYXRlcyBtdXN0IGJlCisvLyAgICAgIHBlcmZvcm1lZCBpbiBMU2IgdG8gTVNiIG9yZGVyIG9mIHRoZSB1cGRhdGUgYnVmZmVyLgorLy8KKy8vIFNpemVTdG9yZSgpICAgICAgLSBBbiBvcHRpb25hbCBmdW5jdGlvbiBmb3Igbm9uLXJ1bnRpbWUgc3RvcmVzIHRoYXQgY2FuIGJlCisvLyAgICAgIGR5bmFtaWNhbGx5IHNpemVkLiAgVGhlIEZXIHdpbGwgb25seSBldmVyIGluY3JlYXNlIG9yIGRlY3JlYXNlIHRoZSBzdG9yZQorLy8gICAgICBieSAxIGJhbmtzaXplIGF0IGEgdGltZSwgYW5kIGl0IGlzIGFsd2F5cyBhZGRpbmcgb3IgcmVtb3ZpbmcgYSBiYW5rIGZyb20gCisvLyAgICAgIHRoZSBlbmQgb2YgdGhlIHN0b3JlLgorLy8KKy8vIEJ5IGRlZmF1bHQgdGhlIEZXIHdpbGwgdXBkYXRlIHZhcmlhYmxlcyBhbmQgc3RvcmFnZSBiYW5rcyBpbiBhbgorLy8gImF0b21pYyIgbWFubmVyIGJ5IGtlZXBpbmcgMSBvbGQgY29weSBvZiB0aGUgZGF0YSBkdXJpbmcgYW4gdXBkYXRlLAorLy8gYW5kIHJlY292ZXJpbmcgYXBwcm9waWF0ZWx5IGlmIHRoZSBwb3dlciBpcyBsb3N0IGR1cmluZyB0aGUgbWlkZGxlCisvLyBvZiBhbiBvcGVyYXRpb24uICBUbyBkbyB0aGlzIHRoZSBGVyBuZWVkcyB0byBoYXZlIG11bHRpcGxlIGJhbmtzCisvLyBvZiBzdG9yYWdlIGRlZGljYXRlZCB0byBpdHMgdXNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlLCB0aGUgZHJpdmVyIAorLy8gY2FuIGltcGxlbWVudCBhbiBhdG9taWMgYmFuayB1cGRhdGUgZnVuY3Rpb24gYW5kIHRoZSBGVyB3aWxsIGFsbG93IAorLy8gMSBiYW5rIGluIHRoaXMgY2FzZS4gIChJdCB3aWxsIGFsbG93IGFueSBudW1iZXIgb2YgYmFua3MsCisvLyBidXQgaXQgd29uJ3QgcmVxdWlyZSBhbiAiZXh0cmEiIGJhbmsgdG8gcHJvdmlkZSBpdHMgYmFuayB0cmFuc2FjdGlvbiAKKy8vIGZ1bmN0aW9uKS4KKy8vCisvLyBUcmFuc2FjdGlvblVwZGF0ZSgpICAtIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgY2FuIGNsZWFyICYgdXBkYXRlIGFuIAorLy8gICAgICBlbnRpcmUgYmFuayBpbiBhbiAiYXRvbWljIiBmYXNoaW9uLiAgSWYgdGhlIG9wZXJhdGlvbiBmYWlscyBpbiB0aGUgCisvLyAgICAgIG1pZGRsZSB0aGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBoYXZpbmcgZWl0aGVyIHRoZSBwcmV2aW91cyBjb3B5IAorLy8gICAgICBvZiB0aGUgYmFuaydzIGRhdGEgb3IgdGhlIG5ldyBjb3B5LiAgQSBjb3B5IHRoYXQncyBwYXJ0aWFsbHkgd3JpdHRlbgorLy8gICAgICBpcyBub3QgdmFsaWQgYXMgaW50ZXJuYWwgZGF0YSBzZXR0aW5ncyBtYXkgZ2V0IGxvc3QuICBTdXBwbHkgdGhpcworLy8gICAgICBmdW5jdGlvbiBvbmx5IHdoZW4gbmVlZGVkLgorLy8KKwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvaWE2NC9lZmljb250ZXh0LmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9pYTY0L2VmaWNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTM5YTZkCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvaWE2NC9lZmljb250ZXh0LmgKQEAgLTAsMCArMSwyMDggQEAKKy8qDQorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwDQorICogSW50ZWwgQ29ycG9yYXRpb24uDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKiANCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCisgKiBhcmUgbWV0Og0KKyAqIA0KKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqIA0KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQ0KKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQorICogDQorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlDQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50Og0KKyAqIA0KKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgSW50ZWwgQ29ycG9yYXRpb24gYW5kDQorICogICAgaXRzIGNvbnRyaWJ1dG9ycy4NCisgKiANCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG9yIGl0cyBjb250cmlidXRvcnMgbWF5IGJlDQorICogICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUNCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisgKiANCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIElOVEVMIENPUlBPUkFUSU9OIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnDQorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFTCBDT1JQT1JBVElPTiBPUiBDT05UUklCVVRPUlMgQkUNCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SDQorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YNCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MNCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTg0KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpDQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRg0KKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisgKiANCisgKi8NCisNCisNCisjaWZuZGVmIF9FRklDT05URVhUX0hfDQorI2RlZmluZSBfRUZJQ09OVEVYVF9IXw0KKw0KKw0KKy8vDQorLy8gIElBLTY0IHByb2Nlc3NvciBleGNlcHRpb24gdHlwZXMNCisvLw0KKyNkZWZpbmUgICAgRVhDUFRfQUxUX0RUTEIgICAgICAgICAgICA0DQorI2RlZmluZSAgICBFWENQVF9ETkVTVEVEX1RMQiAgICAgICAgIDUNCisjZGVmaW5lICAgIEVYQ1BUX0JSRUFLUE9JTlQgICAgICAgICAxMQ0KKyNkZWZpbmUgICAgRVhDUFRfRVhURVJOQUxfSU5URVJSVVBUCTEyDQorI2RlZmluZSAgICBFWENQVF9HRU5fRVhDRVBUICAgICAgICAgMjQNCisjZGVmaW5lICAgIEVYQ1BUX05BVF9DT05TVU1QVElPTiAgICAyNg0KKyNkZWZpbmUgICAgRVhDUFRfREVCVUdfRVhDRVBUICAgICAgIDI5DQorI2RlZmluZSAgICBFWENQVF9VTkFMSUdORURfQUNDRVNTICAgMzANCisjZGVmaW5lICAgIEVYQ1BUX0ZQX0ZBVUxUICAgICAgICAgICAzMg0KKyNkZWZpbmUgICAgRVhDUFRfRlBfVFJBUCAgICAgICAgICAgIDMzDQorI2RlZmluZSAgICBFWENQVF9UQUtFTl9CUkFOQ0ggICAgICAgMzUNCisjZGVmaW5lICAgIEVYQ1BUX1NJTkdMRV9TVEVQICAgICAgICAzNg0KKw0KKy8vDQorLy8gIElBLTY0IHByb2Nlc3NvciBjb250ZXh0IGRlZmluaXRpb24gLSBtdXN0IGJlIDUxMiBieXRlIGFsaWduZWQhISENCisvLw0KK3R5cGVkZWYNCitzdHJ1Y3Qgew0KKwlVSU5UNjQgcmVzZXJ2ZWQ7CS8vIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSBhbGlnbm1lbnQgZm9yIHRoZSBjb3JyZWN0IGJpdHMgaW4gVU5BVCBhbmQgdG8gaW5zdXJlIEYyIGlzIDE2IGJ5dGUgYWxpZ25lZC4uLg0KKyAgICANCisgICAgVUlOVDY0IHIxOw0KKyAgICBVSU5UNjQgcjI7DQorICAgIFVJTlQ2NCByMzsNCisgICAgVUlOVDY0IHI0Ow0KKyAgICBVSU5UNjQgcjU7DQorICAgIFVJTlQ2NCByNjsNCisgICAgVUlOVDY0IHI3Ow0KKyAgICBVSU5UNjQgcjg7DQorICAgIFVJTlQ2NCByOTsNCisgICAgVUlOVDY0IHIxMDsNCisgICAgVUlOVDY0IHIxMTsNCisgICAgVUlOVDY0IHIxMjsNCisgICAgVUlOVDY0IHIxMzsNCisgICAgVUlOVDY0IHIxNDsNCisgICAgVUlOVDY0IHIxNTsNCisgICAgVUlOVDY0IHIxNjsNCisgICAgVUlOVDY0IHIxNzsNCisgICAgVUlOVDY0IHIxODsNCisgICAgVUlOVDY0IHIxOTsNCisgICAgVUlOVDY0IHIyMDsNCisgICAgVUlOVDY0IHIyMTsNCisgICAgVUlOVDY0IHIyMjsNCisgICAgVUlOVDY0IHIyMzsNCisgICAgVUlOVDY0IHIyNDsNCisgICAgVUlOVDY0IHIyNTsNCisgICAgVUlOVDY0IHIyNjsNCisgICAgVUlOVDY0IHIyNzsNCisgICAgVUlOVDY0IHIyODsNCisgICAgVUlOVDY0IHIyOTsNCisgICAgVUlOVDY0IHIzMDsNCisgICAgVUlOVDY0IHIzMTsNCisgICAgDQorICAgIFVJTlQ2NCBmMlsyXTsNCisgICAgVUlOVDY0IGYzWzJdOw0KKyAgICBVSU5UNjQgZjRbMl07DQorICAgIFVJTlQ2NCBmNVsyXTsNCisgICAgVUlOVDY0IGY2WzJdOw0KKyAgICBVSU5UNjQgZjdbMl07DQorICAgIFVJTlQ2NCBmOFsyXTsNCisgICAgVUlOVDY0IGY5WzJdOw0KKyAgICBVSU5UNjQgZjEwWzJdOw0KKyAgICBVSU5UNjQgZjExWzJdOw0KKyAgICBVSU5UNjQgZjEyWzJdOw0KKyAgICBVSU5UNjQgZjEzWzJdOw0KKyAgICBVSU5UNjQgZjE0WzJdOw0KKyAgICBVSU5UNjQgZjE1WzJdOw0KKyAgICBVSU5UNjQgZjE2WzJdOw0KKyAgICBVSU5UNjQgZjE3WzJdOw0KKyAgICBVSU5UNjQgZjE4WzJdOw0KKyAgICBVSU5UNjQgZjE5WzJdOw0KKyAgICBVSU5UNjQgZjIwWzJdOw0KKyAgICBVSU5UNjQgZjIxWzJdOw0KKyAgICBVSU5UNjQgZjIyWzJdOw0KKyAgICBVSU5UNjQgZjIzWzJdOw0KKyAgICBVSU5UNjQgZjI0WzJdOw0KKyAgICBVSU5UNjQgZjI1WzJdOw0KKyAgICBVSU5UNjQgZjI2WzJdOw0KKyAgICBVSU5UNjQgZjI3WzJdOw0KKyAgICBVSU5UNjQgZjI4WzJdOw0KKyAgICBVSU5UNjQgZjI5WzJdOw0KKyAgICBVSU5UNjQgZjMwWzJdOw0KKyAgICBVSU5UNjQgZjMxWzJdOw0KKyAgICANCisgICAgVUlOVDY0IHByOw0KKyAgICANCisgICAgVUlOVDY0IGIwOw0KKyAgICBVSU5UNjQgYjE7DQorICAgIFVJTlQ2NCBiMjsNCisgICAgVUlOVDY0IGIzOw0KKyAgICBVSU5UNjQgYjQ7DQorICAgIFVJTlQ2NCBiNTsNCisgICAgVUlOVDY0IGI2Ow0KKyAgICBVSU5UNjQgYjc7DQorICAgIA0KKyAgICAvLyBhcHBsaWNhdGlvbiByZWdpc3RlcnMNCisgICAgVUlOVDY0IGFyX3JzYzsNCisgICAgVUlOVDY0IGFyX2JzcDsNCisgICAgVUlOVDY0IGFyX2JzcHN0b3JlOw0KKyAgICBVSU5UNjQgYXJfcm5hdDsNCisNCisgICAgVUlOVDY0IGFyX2ZjcjsNCisNCisgICAgVUlOVDY0IGFyX2VmbGFnOw0KKyAgICBVSU5UNjQgYXJfY3NkOw0KKyAgICBVSU5UNjQgYXJfc3NkOw0KKyAgICBVSU5UNjQgYXJfY2ZsZzsNCisgICAgVUlOVDY0IGFyX2ZzcjsNCisgICAgVUlOVDY0IGFyX2ZpcjsNCisgICAgVUlOVDY0IGFyX2ZkcjsNCisNCisgICAgVUlOVDY0IGFyX2NjdjsNCisNCisgICAgVUlOVDY0IGFyX3VuYXQ7DQorDQorICAgIFVJTlQ2NCBhcl9mcHNyOw0KKyAgICANCisgICAgVUlOVDY0IGFyX3BmczsNCisgICAgVUlOVDY0IGFyX2xjOw0KKyAgICBVSU5UNjQgYXJfZWM7DQorICAgIA0KKyAgICAvLyBjb250cm9sIHJlZ2lzdGVycw0KKyAgICBVSU5UNjQgY3JfZGNyOw0KKyAgICBVSU5UNjQgY3JfaXRtOw0KKyAgICBVSU5UNjQgY3JfaXZhOw0KKyAgICBVSU5UNjQgY3JfcHRhOw0KKyAgICBVSU5UNjQgY3JfaXBzcjsNCisgICAgVUlOVDY0IGNyX2lzcjsNCisgICAgVUlOVDY0IGNyX2lpcDsNCisgICAgVUlOVDY0IGNyX2lmYTsNCisgICAgVUlOVDY0IGNyX2l0aXI7DQorICAgIFVJTlQ2NCBjcl9paXBhOw0KKyAgICBVSU5UNjQgY3JfaWZzOw0KKyAgICBVSU5UNjQgY3JfaWltOw0KKyAgICBVSU5UNjQgY3JfaWhhOw0KKyAgICANCisgICAgLy8gZGVidWcgcmVnaXN0ZXJzDQorICAgIFVJTlQ2NCBkYnIwOw0KKyAgICBVSU5UNjQgZGJyMTsNCisgICAgVUlOVDY0IGRicjI7DQorICAgIFVJTlQ2NCBkYnIzOw0KKyAgICBVSU5UNjQgZGJyNDsNCisgICAgVUlOVDY0IGRicjU7DQorICAgIFVJTlQ2NCBkYnI2Ow0KKyAgICBVSU5UNjQgZGJyNzsNCisgICAgDQorICAgIFVJTlQ2NCBpYnIwOw0KKyAgICBVSU5UNjQgaWJyMTsNCisgICAgVUlOVDY0IGlicjI7DQorICAgIFVJTlQ2NCBpYnIzOw0KKyAgICBVSU5UNjQgaWJyNDsNCisgICAgVUlOVDY0IGlicjU7DQorICAgIFVJTlQ2NCBpYnI2Ow0KKyAgICBVSU5UNjQgaWJyNzsNCisgICAgDQorICAgIC8vIHZpcnR1YWwgcmVnaXN0ZXJzDQorICAgIFVJTlQ2NCBpbnRfbmF0OwkvLyBuYXQgYml0cyBmb3IgUjEtUjMxDQorICAgIA0KK30gU1lTVEVNX0NPTlRFWFQ7DQorDQorI2VuZGlmIC8qIF9FRklfQ09OVEVYVF9IXyAqLw0KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3Byb3RvY29sL2ludGxvYWQuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3Byb3RvY29sL2ludGxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI0ZTNmCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvaW50bG9hZC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk5IEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgaW50bG9hZAorCitBYnN0cmFjdDoKKworICAgIEVGSSBzdXBwb3J0IGZvciBsb2FkaW5nIGludGVybmFsbHkgbGlua2VkIGluIGFwcHMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaWZuZGVmIF9JTlRFUk5BTF9MT0FEX0lOQ0xVREVfCisjZGVmaW5lIF9JTlRFUk5BTF9MT0FEX0lOQ0xVREVfCisKKy8vIHtENjVBNkI4Qy03MUU1LTRkZjAtQTkwOS1GMEQyOTkyQjVBQTl9CisjZGVmaW5lIElOVEVSTkFMX1NIRUxMX0dVSUQgXAorICAgIHsgMHhkNjVhNmI4YywgMHg3MWU1LCAweDRkZjAsIHsweGE5LCAweDA5LCAweGYwLCAweGQyLCAweDk5LCAweDJiLCAweDVhLCAweGE5fSB9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9sZWdhY3lib290LmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9sZWdhY3lib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlOTRlNwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3Byb3RvY29sL2xlZ2FjeWJvb3QuaApAQCAtMCwwICsxLDExOSBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTkgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBsZWdhY3lib290CisKK0Fic3RyYWN0OgorCisgICAgRUZJIHN1cHBvcnQgZm9yIGxlZ2FjeSBib290CisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2lmbmRlZiBfTEVHQUNZX0JPT1RfSU5DTFVERV8KKyNkZWZpbmUgX0xFR0FDWV9CT09UX0lOQ0xVREVfCisKKyNkZWZpbmUgTEVHQUNZX0JPT1RfUFJPVE9DT0wgXAorICAgIHsgMHgzNzZlNWViMiwgMHgzMGU0LCAweDExZDMsIHsgMHhiYSwgMHhlNSwgMHgwLCAweDgwLCAweGM3LCAweDNjLCAweDg4LCAweDgxIH0gfQorCisjcHJhZ21hIHBhY2soMSkKKworLy8KKy8vIEJCUyAxLjAxIChTZWUgQXBwZW5kaXggQSkgSVBMIGFuZCBCQ1YgVGFibGUgRW50cnkgRGF0YSBzdHJ1Y3R1cmUuCisvLyAgU2VnOk9mZiBwb2ludGVycyBoYXZlIGJlZW4gY29udmVydGVkIHRvIEVGSSBwb2ludGVycyBpbiB0aGlzIGRhdGEgc3RydWN0dXJlCisvLyAgVGhpcyBpcyB0aGUgc3RydWN0dXJlIHRoYXQgYWxzbyBtYXBzIHRvIHRoZSBFRkkgZGV2aWNlIHBhdGggZm9yIHRoZSBib290IHNlbGVjdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMTYgIERldmljZVR5cGU7CisgICAgVUlOVDE2ICBTdGF0dXNGbGFnOworICAgIFVJTlQzMiAgUmVzZXJ2ZWQ7CisgICAgVk9JRCAgICAqQm9vdEhhbmRsZXI7ICAgLy8gTm90IGFuIEVGSSBlbnRyeSBwb2ludAorICAgIENIQVI4ICAgKkRlc2NTdHJpbmc7Cit9IEJCU19UQUJMRV9FTlRSWTsKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkxFR0FDWV9CT09UX0NBTEwpICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICAgICAqRGV2aWNlUGF0aAorICAgICk7CisKKworLy8KKy8vIEJCUyBzdXBwb3J0IGZ1bmN0aW9ucworLy8gIFBuUCBDYWxsIG51bWJlcnMgYW5kIEJpb3NTZWxlY3RvciBoaWRkZW4gaW4gaW1wbGVtZW50YXRpb24KKy8vCisKK3R5cGVkZWYgZW51bSB7CisgICAgSXBsUmVsYXRpdmUsCisgICAgQmN2UmVsYXRpdmUKK30gQkJTX1RZUEU7CisKK0lOVEVSRkFDRV9ERUNMKF9MRUdBQ1lfQk9PVF9JTlRFUkZBQ0UpOworCisvLworLy8gPT0gUG5QIEZ1bmN0aW9uIDB4NjAgdGhlbiBCYnNWZXJzaW9uID09IDB4MDEwMSBpZiB0aGlzIGNhbGwgZmFpbHMgdGhlbiBCYnNWZXJzaW9uID09IDB4MDAwMAorLy8KKworLy8KKy8vID09IFBuUCBGdW5jdGlvbiAweDYxCisvLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqR0VUX0RFVklDRV9DT1VOVCkgKAorICAgIElOICBzdHJ1Y3QgX0xFR0FDWV9CT09UX0lOVEVSRkFDRSAgICpUaGlzLAorICAgIElOICBCQlNfVFlQRSAgICAgICAgKlRhYmxlVHlwZSwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICpEZXZpY2VDb3VudCwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICpNYXhDb3VudAorICAgICk7CisKKy8vCisvLyA9PSBQblAgRnVuY3Rpb24gMHg2MgorLy8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkdFVF9QUklPUklUWV9BTkRfVEFCTEUpICgKKyAgICBJTiAgc3RydWN0IF9MRUdBQ1lfQk9PVF9JTlRFUkZBQ0UgICAqVGhpcywKKyAgICBJTiAgQkJTX1RZUEUgICAgICAgICpUYWJsZVR5cGUsCisgICAgSU4gT1VUICBVSU5UTiAgICAgICAqUHJpb3JpdHlTaXplLCAvLyBNYXhDb3VudCAqIHNpemVvZihVSU5UOCkKKyAgICBPVVQgICAgIFVJTlROICAgICAgICpQcmlvcml0eSwKKyAgICBJTiBPVVQgIFVJTlROICAgICAgICpUYWJsZVNpemUsICAgIC8vIE1heENvdW50ICogc2l6ZW9mKEJCU19UQUJMRV9FTlRSWSkKKyAgICBPVVQgQkJTX1RBQkxFX0VOVFJZICpUYWJsZUVudHJ5U2l6ZQorICAgICk7CisKKy8vCisvLyA9PSBQblAgRnVuY3Rpb24gMHg2MworLy8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKlNFVF9QUklPUklUWSkgKAorICAgIElOICBzdHJ1Y3QgX0xFR0FDWV9CT09UX0lOVEVSRkFDRSAgICpUaGlzLAorICAgIElOICBCQlNfVFlQRSAgICAgICAgKlRhYmxlVHlwZSwKKyAgICBJTiBPVVQgIFVJTlROICAgICAgICpQcmlvcml0eVNpemUsCisgICAgT1VUICAgICBVSU5UTiAgICAgICAqUHJpb3JpdHkKKyAgICApOworCit0eXBlZGVmIHN0cnVjdCBfTEVHQUNZX0JPT1RfSU5URVJGQUNFIHsKKyAgICBMRUdBQ1lfQk9PVF9DQUxMICAgIEJvb3RJdDsKKworICAgIC8vCisgICAgLy8gTmV3IGZ1bmN0aW9ucyB0byBhbGxvdyBCQlMgYm9vdGluZyB0byBiZSBjb25maWd1cmVkIGZyb20gRUZJCisgICAgLy8KKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICBCYnNWZXJzaW9uOyAgICAgLy8gQ3VycmVudGx5IDB4MDEwMQorICAgIEdFVF9ERVZJQ0VfQ09VTlQgICAgICAgIEdldERldmljZUNvdW50OworICAgIEdFVF9QUklPUklUWV9BTkRfVEFCTEUgIEdldFByaW9yaXR5QW5kVGFibGU7CisgICAgU0VUX1BSSU9SSVRZICAgICAgICAgICAgU2V0UHJpb3JpdHk7ICAgCit9IExFR0FDWV9CT09UX0lOVEVSRkFDRTsKKworRUZJX1NUQVRVUworUGxJbml0aWFsaXplTGVnYWN5Qm9vdCAoCisgICAgVk9JRAorICAgICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvbWFrZS5pbmYgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9tYWtlLmluZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2JiOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvbWFrZS5pbmYKQEAgLTAsMCArMSwxMyBAQAorIw0KKyMNCisjDQorDQorW3NvdXJjZXNdDQorICAgIGVmaXZhci5oDQorCWxlZ2FjeWJvb3QuaA0KKwlWZ2FDbGFzcy5oDQorICAgIGludGxvYWQuaA0KKw0KK1tpYTMyc291cmNlc10NCisNCitbaWE2NHNvdXJjZXNdDQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvbWFrZWZpbGUuaGRyIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvbWFrZWZpbGUuaGRyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGQ2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9tYWtlZmlsZS5oZHIKQEAgLTAsMCArMSwyOSBAQAorDQorIw0KKyMgVGhpcyBpcyBhIG1hY2hpbmUgZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVA0KKyMgICAgR2VuZXJhdGVkIGJ5IGdlbm1ha2UuZXhlDQorIyAgICBHZW5lcmF0ZWQgZnJvbSBtYWtlLmluZg0KKyMgICAgQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbg0KKyMNCisNCitJTkNfREVQUyA9ICQoSU5DX0RFUFMpIFwNCisgICAgJChTREtfSU5TVEFMTF9ESVIpXGluY2x1ZGVcZWZpXHByb3RvY29sXGVmaXZhci5oIFwNCisgICAgJChTREtfSU5TVEFMTF9ESVIpXGluY2x1ZGVcZWZpXHByb3RvY29sXGxlZ2FjeWJvb3QuaCBcDQorICAgICQoU0RLX0lOU1RBTExfRElSKVxpbmNsdWRlXGVmaVxwcm90b2NvbFx2Z2FjbGFzcy5oIFwNCisgICAgJChTREtfSU5TVEFMTF9ESVIpXGluY2x1ZGVcZWZpXHByb3RvY29sXGVmaWRiZy5oIFwNCisNCisNCishSUYgIiQoUFJPQ0VTU09SKSIgPT0gIklhMzIiDQorSU5DX0RFUFMgPSAkKElOQ19ERVBTKSBcDQorDQorDQorIUVORElGDQorDQorDQorIUlGICIkKFBST0NFU1NPUikiID09ICJJYTY0Ig0KK0lOQ19ERVBTID0gJChJTkNfREVQUykgXA0KKyAgICAkKFNES19JTlNUQUxMX0RJUilcaW5jbHVkZVxlZmlccHJvdG9jb2xcJChQUk9DRVNTT1IpXGVmaWNvbnRleHQuaCBcDQorDQorDQorIUVORElGDQorDQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvcGlmbGFzaDY0LmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9waWZsYXNoNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTIxZGZjCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvcGlmbGFzaDY0LmgKQEAgLTAsMCArMSwxMjEgQEAKKyNpZm5kZWYgX1BJRkxBU0g2NF9ICisjZGVmaW5lIF9QSUZMQVNINjRfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OSAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBQSWZsYXNoNjQuaAorICAgIAorQWJzdHJhY3Q6CisKKyAgICBJZmxhc2g2NC5lZmkgcHJvdG9jb2wgdG8gYWJzdHJhY3QgaWZsYXNoIGZyb20KKyAgICB0aGUgc3lzdGVtLgorCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworLy8KKy8vIEd1aWQgdGhhdCBpZGVudGlmaWVzIHRoZSBJRkxBU0ggcHJvdG9jb2wKKy8vCisjZGVmaW5lIElGTEFTSDY0X1BST1RPQ09MX1BST1RPQ09MIFwKKyAgICB7IDB4NjVjYmExMTAsIDB4NzRhYiwgMHgxMWQzLCAweGJiLCAweDg5LCAweDAsIDB4ODAsIDB4YzcsIDB4M2MsIDB4ODgsIDB4ODEgfTsKKworLy8KKy8vIFVubG9jayBGTEFTSCBmcm9tIFN0YXJ0QWRkcmVzcyB0byBFbmRBZGRyZXNzIGFuZCByZXR1cm4gYSBMb2NrS2V5CisvLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqVU5MT0NLX0ZMQVNIX0FQSSkoCisgICAgSU4gc3RydWN0IF9JRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0UgICpUaGlzCisgICAgKTsKKworLy8KKy8vIExvY2sgdGhlIGZsYXNoIHJlcHJlc2VudGVkIGJ5IHRoZSBMb2NrS2V5CisvLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqTE9DS19GTEFTSF9BUEkpKAorICAgIElOIHN0cnVjdCBfSUZMQVNINjRfUFJPVE9DT0xfSU5URVJGQUNFICAqVGhpcworICAgICk7CisKKy8vCisvLyBTdGF0dXMgY2FsbGJhY2sgZm9yIGEgdXRpbGl0eSBsaWtlIElGTEFTSDY0CisvLworLy8gIFRva2VuIHdvdWxkIG1hcCB0byBhIGxpc3QgbGlrZSBUZWQgcHJvcG9zZWQuIFRoZSB1dGlsaXR5IGhhcyBubyBpZGVhIHdoYXQgCisvLyAgICAgIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUuCisvLyAgRXJyb3JTdGF0dXMgLSBMZXZlbCBvZiBFcnJvciBvciBzdWNjZXNzLiBJbmRlcGVuZGVudCBvZiBUb2tlbi4gSWYgeW91IAorLy8gICAgICBkb24ndCBrbm93IHRoZSB0b2tlbiB5b3Ugd2lsbCBhdCBsZWFzdCBrbm93IHBhc3Mgb3IgZmFpbC4KKy8vICBTdHJpbmcgLSBPcHRpb25hbCBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuIENvdWxkIGJlIHVzZWQgZm9yIAorLy8gICAgICBkZWJ1ZyBvciBmdXR1cmUgZXhwYW5zaW9uCisvLworLy8gIEF0dHJpYnV0ZXMgLSBPcHRpb25zIHNjcmVlbiBhdHRyaWJ1dGVzIGZvciBTdHJpbmcuIENvdWxkIGFsbG93IHRoZSBzdHJpbmcgdG8gYmUgZGlmZmVyZW50IGNvbG9ycy4KKy8vCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpVVElMSVRZX1BST0dSRVNTX0FQSSkoCisgICAgSU4gc3RydWN0IF9JRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiwKKyAgICBJTiAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXMsIAorICAgIElOICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nLCAgICBPUFRJT05BTAorICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQXR0cmlidXRlcyBPUFRJT05BTAorICAgICk7CisKKy8vCisvLyBUb2tlbiBWYWx1ZXMKKy8vCisvLyBJRmxhc2g2NCBUb2tlbiBDb2RlcworI2RlZmluZSBJRkxBU0hfVE9LRU5fSUZMQVNIU1RBUlQgICAgMHhCMCAgICAgICAgICAgICAgICAvLyBJRmxhc2g2NCBoYXMgc3RhcnRlZAorI2RlZmluZSBJRkxBU0hfVE9LRU5fUkVBRElOR0ZJTEUgICAgMHhCMSAgICAgICAgICAgICAgICAvLyBSZWFkaW5nIEZpbGUKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0lOSVRWUFAgICAgICAgIDB4QjIgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6aW5nIFZwcAorI2RlZmluZSBJRkxBU0hfVE9LRU5fRElTQUJMRVZQUCAgICAgMHgxMCAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIFZwcAorI2RlZmluZSBJRkxBU0hfVE9LRU5fRkxBU0hVTkxPQ0sgICAgMHhCMyAgICAgICAgICAgICAgICAvLyBVbmxvY2tpbmcgRkxBU0ggRGV2aWNlcworI2RlZmluZSBJRkxBU0hfVE9LRU5fRkxBU0hFUkFTRSAgICAgMHhCNCAgICAgICAgICAgICAgICAvLyBFcmFzaW5nIEZMQVNIIERldmljZXMKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0ZMQVNIUFJPR1JBTSAgIDB4QjUgICAgICAgICAgICAgICAgLy8gUHJvZ3JhbW1pbmcgRkxBU0gKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0ZMQVNIVkVSSUZZICAgIDB4QjYgICAgICAgICAgICAgICAgLy8gVmVyaWZ5aW5nIEZMQVNICisjZGVmaW5lIElGTEFTSF9UT0tFTl9VUERBVEVTVUNDRVMgICAweEI3ICAgICAgICAgICAgICAgIC8vIEZMQVNIIFVwZGFnZSBTdWNjZXNzIQorCisjZGVmaW5lIElGTEFTSF9UT0tFTl9QUk9HUkVTU19SRUFESU5HRklMRSAgIDB4MTEgICAgICAgIC8vICUgUmVhZGluZyBGaWxlCisjZGVmaW5lIElGTEFTSF9UT0tFTl9QUk9HUkVTU19GTEFTSFVOTE9DSyAgIDB4MTMgICAgICAgIC8vICUgVW5sb2NraW5nIEZMQVNIIERldmljZXMKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX1BST0dSRVNTX0ZMQVNIRVJBU0UgICAgMHgxNCAgICAgICAgLy8gJSBFcmFzaW5nIEZMQVNIIERldmljZXMKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX1BST0dSRVNTX0ZMQVNIUFJPR1JBTSAgMHgxNSAgICAgICAgLy8gJSBQcm9ncmFtbWluZyBGTEFTSAorI2RlZmluZSBJRkxBU0hfVE9LRU5fUFJPR1JFU1NfRkxBU0hWRVJJRlkgICAweDE2ICAgICAgICAvLyAlIFZlcmlmeWluZyBGTEFTSAorCisjZGVmaW5lIElGTEFTSF9UT0tFTl9SRUFESU5HRklMRV9FUiAweEI4ICAgICAgICAgICAgICAgIC8vIEZpbGUgUmVhZCBFcnJvcgorI2RlZmluZSBJRkxBU0hfVE9LRU5fSU5JVFZQUF9FUiAgICAgMHhCOSAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXphdGlvbiBvZiBJRkIgRXJyb3IKKyNkZWZpbmUgSUZMQVNIX1RPS0VOX0ZMQVNIVU5MT0NLX0VSIDB4QkEgICAgICAgICAgICAgICAgLy8gRkxBU0ggVW5sb2NrIEVycm9yCisjZGVmaW5lIElGTEFTSF9UT0tFTl9GTEFTSEVSQVNFX0VSICAweEJCICAgICAgICAgICAgICAgIC8vIEZMQVNIIEVyYXNlIEVycm9yCisjZGVmaW5lIElGTEFTSF9UT0tFTl9GTEFTSFZFUklGWV9FUiAweEJDICAgICAgICAgICAgICAgIC8vIEZMQVNIIFZlcmlmeSBFcnJvcgorI2RlZmluZSBJRkxBU0hfVE9LRU5fRkxBU0hQUk9HX0VSICAgMHhCRCAgICAgICAgICAgICAgICAvLyBGTEFTSCBQcm9ncmFtIEVycm9yCisKKyNkZWZpbmUgSUZMQVNIX1RBQkxFX0VORCAgICAgICAgICAgIDB4MDAKKworLy8KKy8vIElmIHRoaXMgbnVtYmVyIGNoYW5nZXMgb25lIG9mIHRoZSBleGlzdGluZyBBUEkncyBoYXMgY2hhbmdlcworLy8KKyNkZWZpbmUgSUZMQVNIX1BJX01BSk9SX1ZFUlNJT04gMHgwMQorCisvLworLy8gVGhpcyBudW1iZXIgY2hhbmdlcyB3aGVuIG5ldyBBUElzIG9yIGRhdGEgdmFyaWFibGVzIGdldCBhZGRlZCB0byB0aGUgZW5kCisvLyAgb2YgdGhlIGRhdGEgc3RydWN0dXJlCisvLworI2RlZmluZSBJRkxBU0hfUElfTUlOT1JfVkVSU0lPTiAweDAxCisKK3R5cGVkZWYgc3RydWN0IF9JRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0UgeworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgIE1ham9yVmVyc2lvbjsgICAgICAgCisgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgTWlub3JWZXJzaW9uOyAgIAorICAgIFVOTE9DS19GTEFTSF9BUEkgICAgICAgIFVubG9ja0ZsYXNoOworICAgIExPQ0tfRkxBU0hfQVBJICAgICAgICAgIExvY2tGbGFzaDsKKyAgICBVVElMSVRZX1BST0dSRVNTX0FQSSAgICBQcm9ncmVzczsKKyAgICAKKyAgICAvLworICAgIC8vIEZ1dHVyZSBleHBhbnNpb24gZ29lcyBoZXJlCisgICAgLy8KKworfSBJRkxBU0g2NF9QUk9UT0NPTF9JTlRFUkZBQ0U7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC9yZWFkbWUudHh0IGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmUxNTVjCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcHJvdG9jb2wvcmVhZG1lLnR4dApAQCAtMCwwICsxLDMgQEAKK1RoZSBwcm90b2NvbCBkaXJlY3RvcnkgY29udGFpbnMgbm9uIEFyY2hpdGVjdHVyYWwgDQorUHJvdG9jb2xzIHRoYXQgc3BhbiB0aGUgRlcsIFBsYXRmb3JtLCBvciBhcHBsaWNhdGlvbg0KK3NwYWNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3Byb3RvY29sL3ZnYWNsYXNzLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC92Z2FjbGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGViNWMKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9wcm90b2NvbC92Z2FjbGFzcy5oCkBAIC0wLDAgKzEsOTUgQEAKKyNpZm5kZWYgX1ZHQV9DTEFTU19ICisjZGVmaW5lIF9WR0FfQ0xBU1NfSAorCisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OSAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBWZ2FDbGFzcy5oCisgICAgCitBYnN0cmFjdDoKKworICAgIFZnYSBNaW5pIHBvcnQgYmluZGluZyB0byBWZ2EgQ2xhc3MgcHJvdG9jb2wKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisvLworLy8gVkdBIERldmljZSBTdHJ1Y3R1cmUKKy8vCisKKy8vIHswRTNENjMxMC02RkU0LTExZDMtQkI4MS0wMDgwQzczQzg4ODF9CisjZGVmaW5lIFZHQV9DTEFTU19EUklWRVJfUFJPVE9DT0wgXAorICAgIHsgMHhlM2Q2MzEwLCAweDZmZTQsIDB4MTFkMywgezB4YmIsIDB4ODEsIDB4MCwgMHg4MCwgMHhjNywgMHgzYywgMHg4OCwgMHg4MX0gfQorCit0eXBlZGVmIAorRUZJX1NUQVRVUyAKKygqIElOSVRfVkdBX0NBUkQpICgKKyAgICBJTiAgVUlOVE4gICBWZ2FNb2RlLAorICAgIElOICBWT0lEICAgICpDb250ZXh0CisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlROICAgTWF4Q29sdW1uczsKKyAgICBVSU5UTiAgIE1heFJvd3M7Cit9IE1BWF9DT05TT0xFX0dFT01FVFJZOworCisjZGVmaW5lIFZHQV9DT05fT1VUX0RFVl9TSUdOQVRVUkUgICBFRklfU0lHTkFUVVJFXzMyKCdjJywndicsJ2cnLCdhJykKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZTsKKworICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlOworICAgIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgQ29uT3V0OworICAgIFNJTVBMRV9URVhUX09VVFBVVF9NT0RFICAgICAgICAgQ29uT3V0TW9kZTsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICpEZXZpY2VQYXRoOworCisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyOworICAgIEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAgICAgICAgKkRldmljZUlvOworCisgICAgLy8KKyAgICAvLyBWaWRlbyBDYXJkIENvbnRleHQKKyAgICAvLworICAgIElOSVRfVkdBX0NBUkQgICAgICAgICAgICAgICAgICAgSW5pdFZnYUNhcmQ7CisgICAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVmdhQ2FyZENvbnRleHQ7CisgICAgTUFYX0NPTlNPTEVfR0VPTUVUUlkgICAgICAgICAgICAqR2VvbWV0cnk7CisgICAgLy8KKyAgICAvLyBWaWRlbyBidWZmZXIgbm9ybWFsbHkgMHhiODAwMAorICAgIC8vCisgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0J1ZmZlcjsKKworICAgIC8vCisgICAgLy8gQ2xlYXIgU2NyZWVuICYgRGVmYXVsdCBBdHRyaWJ1dGUKKyAgICAvLworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOworCisgICAgLy8KKyAgICAvLyAtMSBtZWFucyBzZWFyY2ggZm9yIGFjdGl2ZSBWR0EgZGV2aWNlCisgICAgLy8KKyAgICBFRklfUENJX0FERFJFU1NfVU5JT04gICAgICAgICAgIFBjaTsKK30gVkdBX0NPTl9PVVRfREVWOworCisjZGVmaW5lIFZHQV9DT05fT1VUX0RFVl9GUk9NX1RISVMoYSkgQ1IoYSwgVkdBX0NPTl9PVVRfREVWLCBDb25PdXQsIFZHQV9DT05fT1VUX0RFVl9TSUdOQVRVUkUpCisKKy8vCisvLyBWZ2EgQ2xhc3MgRHJpdmVyIFByb3RvY29sLiAKKy8vIEdVSUQgZGVmaW5lZCBpbiBFRkkgTGliCisvLworCit0eXBlZGVmIAorRUZJX1NUQVRVUworKEVGSUFQSSAqSU5TVEFMTF9WR0FfRFJJVkVSKSAoCisgICAgSU4gIFZHQV9DT05fT1VUX0RFViAgICAqQ29uT3V0RGV2IAorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICBWZXJzaW9uOworICAgIElOU1RBTExfVkdBX0RSSVZFUiAgIEluc3RhbGxHZW5lcmljVmdhRHJpdmVyOworfSBJTlNUQUxMX1ZHQV9EUklWRVJfSU5URVJGQUNFOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcm9tbG9hZC5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMvcm9tbG9hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDYwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy9yb21sb2FkLmgKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBfRUZJX1JPTUxPQURfSAorI2RlZmluZSBfRUZJX1JPTUxPQURfSAorCisjZGVmaW5lIFJPTV9TSUdOQVRVUkUgMHhhYTU1CisjZGVmaW5lIFBDSURTX1NJR05BVFVSRSAiUENJUiIKKyNwcmFnbWEgcGFjayhwdXNoKQorI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICBVSU5UOCAgICBQY2lkc19TaWdbNF07CisgICAgVUlOVDE2ICBWZW5kSWQ7CisgICAgVUlOVDE2ICBEZXZJZDsKKyAgICBVSU5UMTYgIFZwZF9PZmY7CisgICAgVUlOVDE2ICBTaXplOworICAgIFVJTlQ4IFJldjsKKyAgICBVSU5UOCBDbGFzc19Db2RlWzNdOworICAgIFVJTlQxNiAgSW1hZ2VfTGVuOworICAgIFVJTlQxNiAgUmV2X0x2bDsKKyAgICBVSU5UOCBDb2RlX1R5cGU7CisgICAgVUlOVDggSW5kaTsKKyAgICBVSU5UMTYgIFJzdmQ7Cit9UGNpRGF0YVN0cnVjdHVyZTsKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDE2IFNpemU7CisgICAgVUlOVDMyIEhlYWRlcl9TaWc7CisgICAgVUlOVDE2IFN1YlN5c3RlbTsKKyAgICBVSU5UMTYgTWFjaGluZVR5cGU7CisgICAgVUlOVDggIFJlc3ZkWzEwXTsKKyAgICBVSU5UMTYgRWZpT2Zmc2V0OworfUFyY2hEYXRhOwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAgVUlOVDE2IFJvbV9TaWc7CisgICAgQXJjaERhdGEgQXJjaF9EYXRhOworICAgIFVJTlQxNiBQY2lkc19PZmY7CisgICAgVUlOVDggcmVzdmRbMzhdOworfVJvbUhlYWRlcjsKKyNwcmFnbWEgcGFjayhwb3ApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMveDg2XzY0L2VmaWJpbmQuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3g4Nl82NC9lZmliaW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzMzc5OAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3g4Nl82NC9lZmliaW5kLmgKQEAgLTAsMCArMSwzODAgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmZWZpbmQuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSB0byBjb21waWxlIGJpbmRpbmdzCisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworI2lmbmRlZiBYODZfNjRfRUZJX0JJTkQKKyNkZWZpbmUgWDg2XzY0X0VGSV9CSU5ECisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEdOVV9FRklfVVNFX01TX0FCSSkKKyAgICAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID4gNCB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3KSkKKyAgICAgICAgI2RlZmluZSBIQVZFX1VTRV9NU19BQkkgMQorICAgICNlbHNlCisgICAgICAgICNlcnJvciBDb21waWxlciBpcyB0b28gb2xkIGZvciBHTlVfRUZJX1VTRV9NU19BQkkKKyAgICAjZW5kaWYKKyNlbmRpZgorCisvLworLy8gQmFzaWMgaW50IHR5cGVzIG9mIHZhcmlvdXMgd2lkdGhzCisvLworCisjaWYgIWRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgfHwgKF9fU1REQ19WRVJTSU9OX18gPCAxOTk5MDFMICkKKworICAgIC8vIE5vIEFOU0kgQyAxOTk5LzIwMDAgc3RkaW50LmggaW50ZWdlciB3aWR0aCBkZWNsYXJhdGlvbnMgCisKKyAgICAjaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpCisKKyAgICAgICAgLy8gVXNlIE1pY3Jvc29mdCBDIGNvbXBpbGVyIGludGVnZXIgd2lkdGggZGVjbGFyYXRpb25zIAorCisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICB1aW50NjRfdDsKKyAgICAgICAgdHlwZWRlZiBfX2ludDY0ICAgICAgICAgICAgIGludDY0X3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQzMiAgICB1aW50MzJfdDsKKyAgICAgICAgdHlwZWRlZiBfX2ludDMyICAgICAgICAgICAgIGludDMyX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1aW50MTZfdDsKKyAgICAgICAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAgIGludDE2X3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1aW50OF90OworICAgICAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgaW50OF90OworICAgICNlbGlmIGRlZmluZWQoX19HTlVDX18pCisgICAgICAgIHR5cGVkZWYgaW50IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKSAgICAgICAgICAgaW50NjRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpICB1aW50NjRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQzMl90OworICAgICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgaW50MzJfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVpbnQxNl90OworICAgICAgICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgaW50MTZfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVpbnQ4X3Q7CisgICAgICAgIHR5cGVkZWYgc2lnbmVkIGNoYXIgICAgICAgICBpbnQ4X3Q7CisgICAgI2VsaWYgZGVmaW5lZChVTklYX0xQNjQpCisKKyAgICAgICAgLyogIFVzZSBMUDY0IHByb2dyYW1taW5nIG1vZGVsIGZyb20gQ19GTEFHUyBmb3IgaW50ZWdlciB3aWR0aCBkZWNsYXJhdGlvbnMgKi8KKworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICB1aW50NjRfdDsKKyAgICAgICB0eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgaW50NjRfdDsKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdWludDMyX3Q7CisgICAgICAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgIGludDMyX3Q7CisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVpbnQxNl90OworICAgICAgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBpbnQxNl90OworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1aW50OF90OworICAgICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBpbnQ4X3Q7CisgICAgI2Vsc2UKKworICAgICAgIC8qICBBc3N1bWUgUDY0IHByb2dyYW1taW5nIG1vZGVsIGZyb20gQ19GTEFHUyBmb3IgaW50ZWdlciB3aWR0aCBkZWNsYXJhdGlvbnMgKi8KKworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1aW50NjRfdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworICAgICAgIHR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICBpbnQ2NF90IF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDgpKSk7CisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQzMl90OworICAgICAgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBpbnQzMl90OworICAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1aW50MTZfdDsKKyAgICAgICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgaW50MTZfdDsKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdWludDhfdDsKKyAgICAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgaW50OF90OworICAgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgICAjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworLy8KKy8vIEJhc2ljIEVGSSB0eXBlcyBvZiB2YXJpb3VzIHdpZHRocworLy8KKworI2lmbmRlZiBfX1dDSEFSX1RZUEVfXworIyBkZWZpbmUgX19XQ0hBUl9UWVBFX18gc2hvcnQKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQ2NF90ICAgVUlOVDY0OwordHlwZWRlZiBpbnQ2NF90ICAgIElOVDY0OworCisjaWZuZGVmIF9CQVNFVFNEX0hfCisgICAgdHlwZWRlZiB1aW50MzJfdCAgIFVJTlQzMjsKKyAgICB0eXBlZGVmIGludDMyX3QgICAgSU5UMzI7CisjZW5kaWYKKwordHlwZWRlZiB1aW50MTZfdCAgIFVJTlQxNjsKK3R5cGVkZWYgaW50MTZfdCAgICBJTlQxNjsKK3R5cGVkZWYgdWludDhfdCAgICBVSU5UODsKK3R5cGVkZWYgaW50OF90ICAgICBJTlQ4OwordHlwZWRlZiBfX1dDSEFSX1RZUEVfXyBXQ0hBUjsKKworI3VuZGVmIFZPSUQKKyNkZWZpbmUgVk9JRCAgICB2b2lkCisKKwordHlwZWRlZiBpbnQ2NF90ICAgIElOVE47Cit0eXBlZGVmIHVpbnQ2NF90ICAgVUlOVE47CisKKyNpZmRlZiBFRklfTlRfRU1VTEFUT1IKKyAgICAjZGVmaW5lIFBPU1RfQ09ERShfRGF0YSkKKyNlbHNlICAgIAorICAgICNpZmRlZiBFRklfREVCVUcKKyNkZWZpbmUgUE9TVF9DT0RFKF9EYXRhKSAgICBfX2FzbSBtb3YgZWF4LChfRGF0YSkgX19hc20gb3V0IDB4ODAsYWwKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIFBPU1RfQ09ERShfRGF0YSkKKyAgICAjZW5kaWYgIAorI2VuZGlmCisKKyNkZWZpbmUgRUZJRVJSKGEpICAgICAgICAgICAoMHg4MDAwMDAwMDAwMDAwMDAwIHwgYSkKKyNkZWZpbmUgRUZJX0VSUk9SX01BU0sgICAgICAweDgwMDAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgRUZJRVJSX09FTShhKSAgICAgICAoMHhjMDAwMDAwMDAwMDAwMDAwIHwgYSkgICAgICAKKworCisjZGVmaW5lIEJBRF9QT0lOVEVSICAgICAgICAgMHhGQkZCRkJGQkZCRkJGQkZCCisjZGVmaW5lIE1BWF9BRERSRVNTICAgICAgICAgMHhGRkZGRkZGRkZGRkZGRkZGCisKKyNpZmRlZiBFRklfTlRfRU1VTEFUT1IKKyAgICAjZGVmaW5lIEJSRUFLUE9JTlQoKSAgICAgICAgX19hc20geyBpbnQgMyB9CisjZWxzZQorICAgICNkZWZpbmUgQlJFQUtQT0lOVCgpICAgICAgICB3aGlsZSAoVFJVRSk7ICAgIC8vIE1ha2UgaXQgaGFuZyBvbiBCaW9zW0RiZ10zMgorI2VuZGlmCisKKy8vCisvLyBQb2ludGVycyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlc2UgYWRkcmVzcyB0byBmdW5jdGlvbgorLy8KKworI2RlZmluZSBNSU5fQUxJR05NRU5UX1NJWkUgIDQKKworI2RlZmluZSBBTElHTl9WQVJJQUJMRShWYWx1ZSAsQWRqdXN0bWVudCkgXAorICAgICAgICAgICAgKFVJTlROKUFkanVzdG1lbnQgPSAwOyBcCisgICAgICAgICAgICBpZigoVUlOVE4pVmFsdWUgJSBNSU5fQUxJR05NRU5UX1NJWkUpIFwKKyAgICAgICAgICAgICAgICAoVUlOVE4pQWRqdXN0bWVudCA9IE1JTl9BTElHTk1FTlRfU0laRSAtICgoVUlOVE4pVmFsdWUgJSBNSU5fQUxJR05NRU5UX1NJWkUpOyBcCisgICAgICAgICAgICBWYWx1ZSA9IChVSU5UTilWYWx1ZSArIChVSU5UTilBZGp1c3RtZW50CisKKworLy8KKy8vIERlZmluZSBtYWNyb3MgdG8gYnVpbGQgZGF0YSBzdHJ1Y3R1cmUgc2lnbmF0dXJlcyBmcm9tIGNoYXJhY3RlcnMuCisvLworCisjZGVmaW5lIEVGSV9TSUdOQVRVUkVfMTYoQSxCKSAgICAgICAgICAgICAoKEEpIHwgKEI8PDgpKQorI2RlZmluZSBFRklfU0lHTkFUVVJFXzMyKEEsQixDLEQpICAgICAgICAgKEVGSV9TSUdOQVRVUkVfMTYoQSxCKSAgICAgfCAoRUZJX1NJR05BVFVSRV8xNihDLEQpICAgICA8PCAxNikpCisjZGVmaW5lIEVGSV9TSUdOQVRVUkVfNjQoQSxCLEMsRCxFLEYsRyxIKSAoRUZJX1NJR05BVFVSRV8zMihBLEIsQyxEKSB8ICgoVUlOVDY0KShFRklfU0lHTkFUVVJFXzMyKEUsRixHLEgpKSA8PCAzMikpCisvLworLy8gVG8gZXhwb3J0ICYgaW1wb3J0IGZ1bmN0aW9ucyBpbiB0aGUgRUZJIGVtdWxhdG9yIGVudmlyb25tZW50CisvLworCisjaWZkZWYgRUZJX05UX0VNVUxBVE9SCisgICAgI2RlZmluZSBFWFBPUlRBUEkgICAgICAgICAgIF9fZGVjbHNwZWMoIGRsbGV4cG9ydCApCisjZWxzZQorICAgICNkZWZpbmUgRVhQT1JUQVBJCisjZW5kaWYKKworCisvLworLy8gRUZJQVBJIC0gcHJvdG90eXBlIGNhbGxpbmcgY29udmVudGlvbiBmb3IgRUZJIGZ1bmN0aW9uIHBvaW50ZXJzCisvLyBCT09UU0VSVklDRSAtIHByb3RvdHlwZSBmb3IgaW1wbGVtZW50YXRpb24gb2YgYSBib290IHNlcnZpY2UgaW50ZXJmYWNlCisvLyBSVU5USU1FU0VSVklDRSAtIHByb3RvdHlwZSBmb3IgaW1wbGVtZW50YXRpb24gb2YgYSBydW50aW1lIHNlcnZpY2UgaW50ZXJmYWNlCisvLyBSVU5USU1FRlVOQ1RJT04gLSBwcm90b3R5cGUgZm9yIGltcGxlbWVudGF0aW9uIG9mIGEgcnVudGltZSBmdW5jdGlvbiB0aGF0IGlzIG5vdCBhIHNlcnZpY2UKKy8vIFJVTlRJTUVfQ09ERSAtIHByYWdtYSBtYWNybyBmb3IgZGVjbGFyaW5nIHJ1bnRpbWUgY29kZSAgICAKKy8vCisKKyNpZm5kZWYgRUZJQVBJICAgICAgICAgICAgICAgICAgLy8gRm9yY2VzIEVGSSBjYWxsaW5nIGNvbnZlbnRpb25zIHJlZ3VhcmRsZXNzIG9mIGNvbXBpbGVyIG9wdGlvbnMgCisgICAgI2lmZGVmIF9NU0NfRVhURU5TSU9OUworICAgICAgICAjZGVmaW5lIEVGSUFQSSBfX2NkZWNsICAvLyBGb3JjZSBDIGNhbGxpbmcgY29udmVudGlvbiBmb3IgTWljcm9zb2Z0IEMgY29tcGlsZXIgCisgICAgI2VsaWYgZGVmaW5lZChIQVZFX1VTRV9NU19BQkkpCisgICAgICAgIC8vIEZvcmNlIGFtZDY0L21zIGNhbGxpbmcgY29udmVudGlvbnMuCisgICAgICAgICNkZWZpbmUgRUZJQVBJIF9fYXR0cmlidXRlX18oKG1zX2FiaSkpCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBFRklBUEkgICAgICAgICAgLy8gU3Vic3RpdHV0ZSBleHByZXNpb24gdG8gZm9yY2UgQyBjYWxsaW5nIGNvbnZlbnRpb24gCisgICAgI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBCT09UU0VSVklDRQorLy8jZGVmaW5lIFJVTlRJTUVTRVJWSUNFKHByb3RvLGEpICAgIGFsbG9jX3RleHQoInJ0Y29kZSIsYSk7IHByb3RvIGEKKy8vI2RlZmluZSBSVU5USU1FRlVOQ1RJT04ocHJvdG8sYSkgICBhbGxvY190ZXh0KCJydGNvZGUiLGEpOyBwcm90byBhCisjZGVmaW5lIFJVTlRJTUVTRVJWSUNFCisjZGVmaW5lIFJVTlRJTUVGVU5DVElPTgorCisKKyNkZWZpbmUgUlVOVElNRV9DT0RFKGEpICAgICAgICAgYWxsb2NfdGV4dCgicnRjb2RlIiwgYSkKKyNkZWZpbmUgQkVHSU5fUlVOVElNRV9EQVRBKCkgICAgZGF0YV9zZWcoInJ0ZGF0YSIpCisjZGVmaW5lIEVORF9SVU5USU1FX0RBVEEoKSAgICAgIGRhdGFfc2VnKCIiKQorCisjZGVmaW5lIFZPTEFUSUxFICAgIHZvbGF0aWxlCisKKyNkZWZpbmUgTUVNT1JZX0ZFTkNFKCkgICAgCisKKyNpZmRlZiBFRklfTlRfRU1VTEFUT1IKKworLy8KKy8vIFRvIGhlbHAgZW5zdXJlIHByb3BlciBjb2Rpbmcgb2YgaW50ZWdyYXRlZCBkcml2ZXJzLCB0aGV5IGFyZQorLy8gY29tcGlsZWQgYXMgRExMcy4gIEluIE5UIHRoZXkgcmVxdWlyZSBhIGRsbCBpbml0IGVudHJ5IHBvaW50ZXIuCisvLyBUaGUgbWFjcm8gcHV0cyBhIHN0dWIgZW50cnkgcG9pbnQgaW50byB0aGUgRExMIHNvIGl0IHdpbGwgbG9hZC4KKy8vCisKKyNkZWZpbmUgRUZJX0RSSVZFUl9FTlRSWV9QT0lOVChJbml0RnVuY3Rpb24pICAgIFwKKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX3N0ZGNhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfRGxsTWFpbkNSVFN0YXJ0dXAgKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVUlOVE4gICAgSW5zdCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVUlOVE4gICAgcmVhc29uX2Zvcl9jYWxsLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgVk9JRCAgICAqcnNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBPUlRBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2NkZWNsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJbml0aWFsaXplRHJpdmVyICggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdm9pZCAqSW1hZ2VIYW5kbGUsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdm9pZCAqU3lzdGVtVGFibGUgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEluaXRGdW5jdGlvbihJbWFnZUhhbmRsZSwgU3lzdGVtVGFibGUpOyAgICAgICBcCisgICAgfQorCisKKyAgICAjZGVmaW5lIExPQURfSU5URVJOQUxfRFJJVkVSKF9pZiwgdHlwZSwgbmFtZSwgZW50cnkpICAgICAgXAorICAgICAgICAoX2lmKS0+TG9hZEludGVybmFsKHR5cGUsIG5hbWUsIE5VTEwpICAgICAgICAgICAgIAorCisjZWxzZSAvLyBFRklfTlRfRU1VTEFUT1IgCisKKy8vCisvLyBXaGVuIGJ1aWxkIHNpbWlsaWFyIHRvIEZXLCB0aGVuIGxpbmsgZXZlcnl0aGluZyB0b2dldGhlciBhcworLy8gb25lIGJpZyBtb2R1bGUuCisvLworCisgICAgI2RlZmluZSBFRklfRFJJVkVSX0VOVFJZX1BPSU5UKEluaXRGdW5jdGlvbikgICAgXAorICAgICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSW5pdGlhbGl6ZURyaXZlciAoICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBWT0lEICAgICpJbWFnZUhhbmRsZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVk9JRCAgICAqU3lzdGVtVGFibGUgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIEluaXRGdW5jdGlvbihJbWFnZUhhbmRsZSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGFibGUpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRUZJX1NUQVRVUyBlZmlfbWFpbiggICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBFRklfSEFORExFIGltYWdlLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICkgX19hdHRyaWJ1dGVfXygod2VhaywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGFsaWFzICgiSW5pdGlhbGl6ZURyaXZlciIpKSk7CisKKyAgICAjZGVmaW5lIExPQURfSU5URVJOQUxfRFJJVkVSKF9pZiwgdHlwZSwgbmFtZSwgZW50cnkpICAgIFwKKyAgICAgICAgICAgIChfaWYpLT5Mb2FkSW50ZXJuYWwodHlwZSwgbmFtZSwgZW50cnkpCisKKyNlbmRpZiAvLyBFRklfRldfTlQgCisKKy8vCisvLyBTb21lIGNvbXBpbGVycyBkb24ndCBzdXBwb3J0IHRoZSBmb3J3YXJkIHJlZmVyZW5jZSBjb25zdHJ1Y3Q6CisvLyAgdHlwZWRlZiBzdHJ1Y3QgWFhYWFgKKy8vCisvLyBUaGUgZm9sbG93aW5nIG1hY3JvIHByb3ZpZGUgYSB3b3JrYXJvdW5kIGZvciBzdWNoIGNhc2VzLgorLy8KKyNpZmRlZiBOT19JTlRFUkZBQ0VfREVDTAorI2RlZmluZSBJTlRFUkZBQ0VfREVDTCh4KQorI2Vsc2UKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBJTlRFUkZBQ0VfREVDTCh4KSBzdHJ1Y3QgeAorI2Vsc2UKKyNkZWZpbmUgSU5URVJGQUNFX0RFQ0woeCkgdHlwZWRlZiBzdHJ1Y3QgeAorI2VuZGlmCisjZW5kaWYKKworLyogZm9yIHg4Nl82NCwgRUZJX0ZVTkNUSU9OX1dSQVBQRVIgbXVzdCBiZSBkZWZpbmVkICovCisjaWYgZGVmaW5lZChIQVZFX1VTRV9NU19BQkkpCisjZGVmaW5lIHVlZmlfY2FsbF93cmFwcGVyKGZ1bmMsIHZhX251bSwgLi4uKSBmdW5jKF9fVkFfQVJHU19fKQorI2Vsc2UKKy8qCisgIENyZWRpdHMgZm9yIG1hY3JvLW1hZ2ljOgorICAgIGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vP2Zyb21ncm91cHMjIXRvcGljL2NvbXAuc3RkLmMvZC02TWo1TGtvX3MKKyAgICBodHRwOi8vZWZlc3guY29tLzIwMTAvMDgvMzEvb3ZlcmxvYWRpbmctbWFjcm9zLworKi8KKyNkZWZpbmUgX19WQV9OQVJHX18oLi4uKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19WQV9OQVJHXyhfMCwgIyMgX19WQV9BUkdTX18sIF9fUlNFUV9OKCkpCisjZGVmaW5lIF9fVkFfTkFSR18oLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fVkFfQVJHX04oX19WQV9BUkdTX18pCisjZGVmaW5lIF9fVkFfQVJHX04oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF8wLF8xLF8yLF8zLF80LF81LF82LF83LF84LF85LF8xMCxOLC4uLikgTgorI2RlZmluZSBfX1JTRVFfTigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAxMCwgOSwgIDgsICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgMAorCisjZGVmaW5lIF9fVkFfQVJHX05TVUZGSVhfXyhwcmVmaXgsLi4uKSAgICAgICAgICAgICAgICAgIFwKKyAgX19WQV9BUkdfTlNVRkZJWF9OKHByZWZpeCwgX19WQV9OQVJHX18oX19WQV9BUkdTX18pKQorI2RlZmluZSBfX1ZBX0FSR19OU1VGRklYX04ocHJlZml4LG5hcmdzKSAgICAgICAgXAorICBfX1ZBX0FSR19OU1VGRklYX05fKHByZWZpeCwgbmFyZ3MpCisjZGVmaW5lIF9fVkFfQVJHX05TVUZGSVhfTl8ocHJlZml4LG5hcmdzKSAgICAgICBcCisgIHByZWZpeCAjIyBuYXJncworCisvKiBQcm90b3R5cGVzIG9mIEVGSSBjZGVjbCAtPiBzdGRjYWxsIHRyYW1wb2xpbmVzICovCitVSU5UNjQgZWZpX2NhbGwwKHZvaWQgKmZ1bmMpOworVUlOVDY0IGVmaV9jYWxsMSh2b2lkICpmdW5jLCBVSU5UNjQgYXJnMSk7CitVSU5UNjQgZWZpX2NhbGwyKHZvaWQgKmZ1bmMsIFVJTlQ2NCBhcmcxLCBVSU5UNjQgYXJnMik7CitVSU5UNjQgZWZpX2NhbGwzKHZvaWQgKmZ1bmMsIFVJTlQ2NCBhcmcxLCBVSU5UNjQgYXJnMiwgVUlOVDY0IGFyZzMpOworVUlOVDY0IGVmaV9jYWxsNCh2b2lkICpmdW5jLCBVSU5UNjQgYXJnMSwgVUlOVDY0IGFyZzIsIFVJTlQ2NCBhcmczLAorICAgICAgICAgICAgICAgICBVSU5UNjQgYXJnNCk7CitVSU5UNjQgZWZpX2NhbGw1KHZvaWQgKmZ1bmMsIFVJTlQ2NCBhcmcxLCBVSU5UNjQgYXJnMiwgVUlOVDY0IGFyZzMsCisgICAgICAgICAgICAgICAgIFVJTlQ2NCBhcmc0LCBVSU5UNjQgYXJnNSk7CitVSU5UNjQgZWZpX2NhbGw2KHZvaWQgKmZ1bmMsIFVJTlQ2NCBhcmcxLCBVSU5UNjQgYXJnMiwgVUlOVDY0IGFyZzMsCisgICAgICAgICAgICAgICAgIFVJTlQ2NCBhcmc0LCBVSU5UNjQgYXJnNSwgVUlOVDY0IGFyZzYpOworVUlOVDY0IGVmaV9jYWxsNyh2b2lkICpmdW5jLCBVSU5UNjQgYXJnMSwgVUlOVDY0IGFyZzIsIFVJTlQ2NCBhcmczLAorICAgICAgICAgICAgICAgICBVSU5UNjQgYXJnNCwgVUlOVDY0IGFyZzUsIFVJTlQ2NCBhcmc2LCBVSU5UNjQgYXJnNyk7CitVSU5UNjQgZWZpX2NhbGw4KHZvaWQgKmZ1bmMsIFVJTlQ2NCBhcmcxLCBVSU5UNjQgYXJnMiwgVUlOVDY0IGFyZzMsCisgICAgICAgICAgICAgICAgIFVJTlQ2NCBhcmc0LCBVSU5UNjQgYXJnNSwgVUlOVDY0IGFyZzYsIFVJTlQ2NCBhcmc3LAorICAgICAgICAgICAgICAgICBVSU5UNjQgYXJnOCk7CitVSU5UNjQgZWZpX2NhbGw5KHZvaWQgKmZ1bmMsIFVJTlQ2NCBhcmcxLCBVSU5UNjQgYXJnMiwgVUlOVDY0IGFyZzMsCisgICAgICAgICAgICAgICAgIFVJTlQ2NCBhcmc0LCBVSU5UNjQgYXJnNSwgVUlOVDY0IGFyZzYsIFVJTlQ2NCBhcmc3LAorICAgICAgICAgICAgICAgICBVSU5UNjQgYXJnOCwgVUlOVDY0IGFyZzkpOworVUlOVDY0IGVmaV9jYWxsMTAodm9pZCAqZnVuYywgVUlOVDY0IGFyZzEsIFVJTlQ2NCBhcmcyLCBVSU5UNjQgYXJnMywKKyAgICAgICAgICAgICAgICAgIFVJTlQ2NCBhcmc0LCBVSU5UNjQgYXJnNSwgVUlOVDY0IGFyZzYsIFVJTlQ2NCBhcmc3LAorICAgICAgICAgICAgICAgICAgVUlOVDY0IGFyZzgsIFVJTlQ2NCBhcmc5LCBVSU5UNjQgYXJnMTApOworCisvKiBGcm9udC1lbmRzIHRvIGVmaV9jYWxsWCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyAqLworI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsMChmKSBcCisgIGVmaV9jYWxsMChmKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsMShmLGExKSBcCisgIGVmaV9jYWxsMShmLCAoVUlOVDY0KShhMSkpCisjZGVmaW5lIF9jYXN0NjRfZWZpX2NhbGwyKGYsYTEsYTIpIFwKKyAgZWZpX2NhbGwyKGYsIChVSU5UNjQpKGExKSwgKFVJTlQ2NCkoYTIpKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsMyhmLGExLGEyLGEzKSBcCisgIGVmaV9jYWxsMyhmLCAoVUlOVDY0KShhMSksIChVSU5UNjQpKGEyKSwgKFVJTlQ2NCkoYTMpKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsNChmLGExLGEyLGEzLGE0KSBcCisgIGVmaV9jYWxsNChmLCAoVUlOVDY0KShhMSksIChVSU5UNjQpKGEyKSwgKFVJTlQ2NCkoYTMpLCAoVUlOVDY0KShhNCkpCisjZGVmaW5lIF9jYXN0NjRfZWZpX2NhbGw1KGYsYTEsYTIsYTMsYTQsYTUpIFwKKyAgZWZpX2NhbGw1KGYsIChVSU5UNjQpKGExKSwgKFVJTlQ2NCkoYTIpLCAoVUlOVDY0KShhMyksIChVSU5UNjQpKGE0KSwgXAorICAgICAgICAgICAgKFVJTlQ2NCkoYTUpKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsNihmLGExLGEyLGEzLGE0LGE1LGE2KSBcCisgIGVmaV9jYWxsNihmLCAoVUlOVDY0KShhMSksIChVSU5UNjQpKGEyKSwgKFVJTlQ2NCkoYTMpLCAoVUlOVDY0KShhNCksIFwKKyAgICAgICAgICAgIChVSU5UNjQpKGE1KSwgKFVJTlQ2NCkoYTYpKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsNyhmLGExLGEyLGEzLGE0LGE1LGE2LGE3KSBcCisgIGVmaV9jYWxsNyhmLCAoVUlOVDY0KShhMSksIChVSU5UNjQpKGEyKSwgKFVJTlQ2NCkoYTMpLCAoVUlOVDY0KShhNCksIFwKKyAgICAgICAgICAgIChVSU5UNjQpKGE1KSwgKFVJTlQ2NCkoYTYpLCAoVUlOVDY0KShhNykpCisjZGVmaW5lIF9jYXN0NjRfZWZpX2NhbGw4KGYsYTEsYTIsYTMsYTQsYTUsYTYsYTcsYTgpIFwKKyAgZWZpX2NhbGw4KGYsIChVSU5UNjQpKGExKSwgKFVJTlQ2NCkoYTIpLCAoVUlOVDY0KShhMyksIChVSU5UNjQpKGE0KSwgXAorICAgICAgICAgICAgKFVJTlQ2NCkoYTUpLCAoVUlOVDY0KShhNiksIChVSU5UNjQpKGE3KSwgKFVJTlQ2NCkoYTgpKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsOShmLGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4LGE5KSBcCisgIGVmaV9jYWxsOShmLCAoVUlOVDY0KShhMSksIChVSU5UNjQpKGEyKSwgKFVJTlQ2NCkoYTMpLCAoVUlOVDY0KShhNCksIFwKKyAgICAgICAgICAgIChVSU5UNjQpKGE1KSwgKFVJTlQ2NCkoYTYpLCAoVUlOVDY0KShhNyksIChVSU5UNjQpKGE4KSwgXAorICAgICAgICAgICAgKFVJTlQ2NCkoYTkpKQorI2RlZmluZSBfY2FzdDY0X2VmaV9jYWxsMTAoZixhMSxhMixhMyxhNCxhNSxhNixhNyxhOCxhOSxhMTApIFwKKyAgZWZpX2NhbGwxMChmLCAoVUlOVDY0KShhMSksIChVSU5UNjQpKGEyKSwgKFVJTlQ2NCkoYTMpLCAoVUlOVDY0KShhNCksIFwKKyAgICAgICAgICAgICAoVUlOVDY0KShhNSksIChVSU5UNjQpKGE2KSwgKFVJTlQ2NCkoYTcpLCAoVUlOVDY0KShhOCksIFwKKyAgICAgICAgICAgICAoVUlOVDY0KShhOSksIChVSU5UNjQpKGExMCkpCisKKy8qIG1haW4gd3JhcHBlciAodmFfbnVtIGlnbm9yZWQpICovCisjZGVmaW5lIHVlZmlfY2FsbF93cmFwcGVyKGZ1bmMsdmFfbnVtLC4uLikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fVkFfQVJHX05TVUZGSVhfXyhfY2FzdDY0X2VmaV9jYWxsLCBfX1ZBX0FSR1NfXykgKGZ1bmMgLCAjI19fVkFfQVJHU19fKQorCisjZW5kaWYKKyNkZWZpbmUgRUZJX0ZVTkNUSU9OIF9fYXR0cmlidXRlX18oKG1zX2FiaSkpCisKKyNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiA0NzMxICkgIC8vIFN1cHByZXNzIHdhcm5pbmdzIGFib3V0IG1vZGlmaWNhdGlvbiBvZiBFQlAKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvaW5jL3g4Nl82NC9lZmlsaWJwbGF0LmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy94ODZfNjQvZWZpbGlicGxhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDQ1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy94ODZfNjQvZWZpbGlicGxhdC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGVmaWxpYnBsYXQuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSB0byBjb21waWxlIGJpbmRpbmdzCisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCitWT0lECitJbml0aWFsaXplTGliUGxhdGZvcm0gKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIElOIEVGSV9TWVNURU1fVEFCTEUgICAgICpTeXN0ZW1UYWJsZQorICAgICk7CisKKyAgIApkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMveDg2XzY0L3BlLmggYi9nbnUtZWZpL2dudS1lZmktMy4wL2luYy94ODZfNjQvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzliOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9pbmMveDg2XzY0L3BlLmgKQEAgLTAsMCArMSw1OTUgQEAKKy8qIAorICAgIFBFMzIrIGhlYWRlciBmaWxlCisgKi8KKyNpZm5kZWYgX1BFX0gKKyNkZWZpbmUgX1BFX0gKKworI2RlZmluZSBJTUFHRV9ET1NfU0lHTkFUVVJFICAgICAgICAgICAgICAgICAweDVBNEQgICAgICAvLyBNWgorI2RlZmluZSBJTUFHRV9PUzJfU0lHTkFUVVJFICAgICAgICAgICAgICAgICAweDQ1NEUgICAgICAvLyBORQorI2RlZmluZSBJTUFHRV9PUzJfU0lHTkFUVVJFX0xFICAgICAgICAgICAgICAweDQ1NEMgICAgICAvLyBMRQorI2RlZmluZSBJTUFHRV9OVF9TSUdOQVRVUkUgICAgICAgICAgICAgICAgICAweDAwMDA0NTUwICAvLyBQRTAwICAKKyNkZWZpbmUgSU1BR0VfRURPU19TSUdOQVRVUkUgICAgICAgICAgICAgICAgMHg0NDQ1NDU1MCAgLy8gUEVFRAorCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9ET1NfSEVBREVSIHsgICAgICAvLyBET1MgLkVYRSBoZWFkZXIKKyAgICBVSU5UMTYgICBlX21hZ2ljOyAgICAgICAgICAgICAgICAgICAgIC8vIE1hZ2ljIG51bWJlcgorICAgIFVJTlQxNiAgIGVfY2JscDsgICAgICAgICAgICAgICAgICAgICAgLy8gQnl0ZXMgb24gbGFzdCBwYWdlIG9mIGZpbGUKKyAgICBVSU5UMTYgICBlX2NwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhZ2VzIGluIGZpbGUKKyAgICBVSU5UMTYgICBlX2NybGM7ICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbG9jYXRpb25zCisgICAgVUlOVDE2ICAgZV9jcGFyaGRyOyAgICAgICAgICAgICAgICAgICAvLyBTaXplIG9mIGhlYWRlciBpbiBwYXJhZ3JhcGhzCisgICAgVUlOVDE2ICAgZV9taW5hbGxvYzsgICAgICAgICAgICAgICAgICAvLyBNaW5pbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkCisgICAgVUlOVDE2ICAgZV9tYXhhbGxvYzsgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkCisgICAgVUlOVDE2ICAgZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIChyZWxhdGl2ZSkgU1MgdmFsdWUKKyAgICBVSU5UMTYgICBlX3NwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgU1AgdmFsdWUKKyAgICBVSU5UMTYgICBlX2NzdW07ICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrc3VtCisgICAgVUlOVDE2ICAgZV9pcDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIElQIHZhbHVlCisgICAgVUlOVDE2ICAgZV9jczsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUKKyAgICBVSU5UMTYgICBlX2xmYXJsYzsgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgYWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlCisgICAgVUlOVDE2ICAgZV9vdm5vOyAgICAgICAgICAgICAgICAgICAgICAvLyBPdmVybGF5IG51bWJlcgorICAgIFVJTlQxNiAgIGVfcmVzWzRdOyAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXJ2ZWQgd29yZHMKKyAgICBVSU5UMTYgICBlX29lbWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIE9FTSBpZGVudGlmaWVyIChmb3IgZV9vZW1pbmZvKQorICAgIFVJTlQxNiAgIGVfb2VtaW5mbzsgICAgICAgICAgICAgICAgICAgLy8gT0VNIGluZm9ybWF0aW9uOyBlX29lbWlkIHNwZWNpZmljCisgICAgVUlOVDE2ICAgZV9yZXMyWzEwXTsgICAgICAgICAgICAgICAgICAvLyBSZXNlcnZlZCB3b3JkcworICAgIFVJTlQzMiAgIGVfbGZhbmV3OyAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBhZGRyZXNzIG9mIG5ldyBleGUgaGVhZGVyCisgIH0gSU1BR0VfRE9TX0hFQURFUiwgKlBJTUFHRV9ET1NfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfT1MyX0hFQURFUiB7ICAgICAgLy8gT1MvMiAuRVhFIGhlYWRlcgorICAgIFVJTlQxNiAgIG5lX21hZ2ljOyAgICAgICAgICAgICAgICAgICAgLy8gTWFnaWMgbnVtYmVyCisgICAgVUlOVDggICAgbmVfdmVyOyAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uIG51bWJlcgorICAgIFVJTlQ4ICAgIG5lX3JldjsgICAgICAgICAgICAgICAgICAgICAgLy8gUmV2aXNpb24gbnVtYmVyCisgICAgVUlOVDE2ICAgbmVfZW50dGFiOyAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgRW50cnkgVGFibGUKKyAgICBVSU5UMTYgICBuZV9jYmVudHRhYjsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBFbnRyeSBUYWJsZQorICAgIFVJTlQzMiAgIG5lX2NyYzsgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzdW0gb2Ygd2hvbGUgZmlsZQorICAgIFVJTlQxNiAgIG5lX2ZsYWdzOyAgICAgICAgICAgICAgICAgICAgLy8gRmxhZyBVSU5UMTYKKyAgICBVSU5UMTYgICBuZV9hdXRvZGF0YTsgICAgICAgICAgICAgICAgIC8vIEF1dG9tYXRpYyBkYXRhIHNlZ21lbnQgbnVtYmVyCisgICAgVUlOVDE2ICAgbmVfaGVhcDsgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIGhlYXAgYWxsb2NhdGlvbgorICAgIFVJTlQxNiAgIG5lX3N0YWNrOyAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbCBzdGFjayBhbGxvY2F0aW9uCisgICAgVUlOVDMyICAgbmVfY3NpcDsgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIENTOklQIHNldHRpbmcKKyAgICBVSU5UMzIgICBuZV9zc3NwOyAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgU1M6U1Agc2V0dGluZworICAgIFVJTlQxNiAgIG5lX2NzZWc7ICAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgb2YgZmlsZSBzZWdtZW50cworICAgIFVJTlQxNiAgIG5lX2Ntb2Q7ICAgICAgICAgICAgICAgICAgICAgLy8gRW50cmllcyBpbiBNb2R1bGUgUmVmZXJlbmNlIFRhYmxlCisgICAgVUlOVDE2ICAgbmVfY2JucmVzdGFiOyAgICAgICAgICAgICAgICAvLyBTaXplIG9mIG5vbi1yZXNpZGVudCBuYW1lIHRhYmxlCisgICAgVUlOVDE2ICAgbmVfc2VndGFiOyAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgU2VnbWVudCBUYWJsZQorICAgIFVJTlQxNiAgIG5lX3JzcmN0YWI7ICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIFJlc291cmNlIFRhYmxlCisgICAgVUlOVDE2ICAgbmVfcmVzdGFiOyAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2YgcmVzaWRlbnQgbmFtZSB0YWJsZQorICAgIFVJTlQxNiAgIG5lX21vZHRhYjsgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIE1vZHVsZSBSZWZlcmVuY2UgVGFibGUKKyAgICBVSU5UMTYgICBuZV9pbXB0YWI7ICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBvZiBJbXBvcnRlZCBOYW1lcyBUYWJsZQorICAgIFVJTlQzMiAgIG5lX25yZXN0YWI7ICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IG9mIE5vbi1yZXNpZGVudCBOYW1lcyBUYWJsZQorICAgIFVJTlQxNiAgIG5lX2Ntb3ZlbnQ7ICAgICAgICAgICAgICAgICAgLy8gQ291bnQgb2YgbW92YWJsZSBlbnRyaWVzCisgICAgVUlOVDE2ICAgbmVfYWxpZ247ICAgICAgICAgICAgICAgICAgICAvLyBTZWdtZW50IGFsaWdubWVudCBzaGlmdCBjb3VudAorICAgIFVJTlQxNiAgIG5lX2NyZXM7ICAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgb2YgcmVzb3VyY2Ugc2VnbWVudHMKKyAgICBVSU5UOCAgICBuZV9leGV0eXA7ICAgICAgICAgICAgICAgICAgIC8vIFRhcmdldCBPcGVyYXRpbmcgc3lzdGVtCisgICAgVUlOVDggICAgbmVfZmxhZ3NvdGhlcnM7ICAgICAgICAgICAgICAvLyBPdGhlciAuRVhFIGZsYWdzCisgICAgVUlOVDE2ICAgbmVfcHJldHRodW5rczsgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gcmV0dXJuIHRodW5rcworICAgIFVJTlQxNiAgIG5lX3BzZWdyZWZieXRlczsgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIHNlZ21lbnQgcmVmLiBieXRlcworICAgIFVJTlQxNiAgIG5lX3N3YXBhcmVhOyAgICAgICAgICAgICAgICAgLy8gTWluaW11bSBjb2RlIHN3YXAgYXJlYSBzaXplCisgICAgVUlOVDE2ICAgbmVfZXhwdmVyOyAgICAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBXaW5kb3dzIHZlcnNpb24gbnVtYmVyCisgIH0gSU1BR0VfT1MyX0hFQURFUiwgKlBJTUFHRV9PUzJfSEVBREVSOworCisvLworLy8gRmlsZSBoZWFkZXIgZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0ZJTEVfSEVBREVSIHsKKyAgICBVSU5UMTYgICBNYWNoaW5lOworICAgIFVJTlQxNiAgIE51bWJlck9mU2VjdGlvbnM7CisgICAgVUlOVDMyICAgVGltZURhdGVTdGFtcDsKKyAgICBVSU5UMzIgICBQb2ludGVyVG9TeW1ib2xUYWJsZTsKKyAgICBVSU5UMzIgICBOdW1iZXJPZlN5bWJvbHM7CisgICAgVUlOVDE2ICAgU2l6ZU9mT3B0aW9uYWxIZWFkZXI7CisgICAgVUlOVDE2ICAgQ2hhcmFjdGVyaXN0aWNzOworfSBJTUFHRV9GSUxFX0hFQURFUiwgKlBJTUFHRV9GSUxFX0hFQURFUjsKKworI2RlZmluZSBJTUFHRV9TSVpFT0ZfRklMRV9IRUFERVIgICAgICAgICAgICAgMjAKKworI2RlZmluZSBJTUFHRV9GSUxFX1JFTE9DU19TVFJJUFBFRCAgICAgICAgICAgMHgwMDAxICAvLyBSZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlLgorI2RlZmluZSBJTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UgICAgICAgICAgMHgwMDAyICAvLyBGaWxlIGlzIGV4ZWN1dGFibGUgIChpLmUuIG5vIHVucmVzb2x2ZWQgZXh0ZXJuZWwgcmVmZXJlbmNlcykuCisjZGVmaW5lIElNQUdFX0ZJTEVfTElORV9OVU1TX1NUUklQUEVEICAgICAgICAweDAwMDQgIC8vIExpbmUgbnVuYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUuCisjZGVmaW5lIElNQUdFX0ZJTEVfTE9DQUxfU1lNU19TVFJJUFBFRCAgICAgICAweDAwMDggIC8vIExvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlLgorI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0xPICAgICAgICAgMHgwMDgwICAvLyBCeXRlcyBvZiBtYWNoaW5lIHdvcmQgYXJlIHJldmVyc2VkLgorI2RlZmluZSBJTUFHRV9GSUxFXzMyQklUX01BQ0hJTkUgICAgICAgICAgICAgMHgwMTAwICAvLyAzMiBiaXQgd29yZCBtYWNoaW5lLgorI2RlZmluZSBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVEICAgICAgICAgICAgMHgwMjAwICAvLyBEZWJ1Z2dpbmcgaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUgaW4gLkRCRyBmaWxlCisjZGVmaW5lIElNQUdFX0ZJTEVfU1lTVEVNICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8vIFN5c3RlbSBGaWxlLgorI2RlZmluZSBJTUFHRV9GSUxFX0RMTCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvLyBGaWxlIGlzIGEgRExMLgorI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0hJICAgICAgICAgMHg4MDAwICAvLyBCeXRlcyBvZiBtYWNoaW5lIHdvcmQgYXJlIHJldmVyc2VkLgorCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9VTktOT1dOICAgICAgICAgICAwCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9JMzg2ICAgICAgICAgICAgICAweDE0YyAgIC8vIEludGVsIDM4Ni4KKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1IzMDAwICAgICAgICAgICAgIDB4MTYyICAgLy8gTUlQUyBsaXR0bGUtZW5kaWFuLCAwNTQwIGJpZy1lbmRpYW4KKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1I0MDAwICAgICAgICAgICAgIDB4MTY2ICAgLy8gTUlQUyBsaXR0bGUtZW5kaWFuCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9BTFBIQSAgICAgICAgICAgICAweDE4NCAgIC8vIEFscGhhX0FYUAorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfQVJNVEhVTUJfTUlYRUQgICAgMHgxYzIgICAvLyBBcm0vVGh1bWIKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1BPV0VSUEMgICAgICAgICAgIDB4MUYwICAgLy8gSUJNIFBvd2VyUEMgTGl0dGxlLUVuZGlhbgorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfSUE2NCAgICAgICAgICAgICAgMHgyMDAgICAvLyBJQS02NAorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfVEFIT0UgICAgICAgICAgICAgMHg3Y2MgICAvLyBJbnRlbCBFTSBtYWNoaW5lCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9FQkMgICAgICAgICAgICAgICAweGViYyAgIC8vIEVGSSBCeXRlIENvZGUKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1g2NCAgICAgICAgICAgICAgIDB4ODY2NCAgLy8geDg2XzY0CisvLworLy8gRGlyZWN0b3J5IGZvcm1hdC4KKy8vCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9EQVRBX0RJUkVDVE9SWSB7CisgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7CisgICAgVUlOVDMyICAgU2l6ZTsKK30gSU1BR0VfREFUQV9ESVJFQ1RPUlksICpQSU1BR0VfREFUQV9ESVJFQ1RPUlk7CisKKyNkZWZpbmUgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVMgICAgMTYKKworLy8KKy8vIE9wdGlvbmFsIGhlYWRlciBmb3JtYXQuCisvLworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfT1BUSU9OQUxfSEVBREVSIHsKKyAgICAvLworICAgIC8vIFN0YW5kYXJkIGZpZWxkcy4KKyAgICAvLworCisgICAgVUlOVDE2ICAgIE1hZ2ljOworICAgIFVJTlQ4ICAgICBNYWpvckxpbmtlclZlcnNpb247CisgICAgVUlOVDggICAgIE1pbm9yTGlua2VyVmVyc2lvbjsKKyAgICBVSU5UMzIgICAgU2l6ZU9mQ29kZTsKKyAgICBVSU5UMzIgICAgU2l6ZU9mSW5pdGlhbGl6ZWREYXRhOworICAgIFVJTlQzMiAgICBTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsKKyAgICBVSU5UMzIgICAgQWRkcmVzc09mRW50cnlQb2ludDsKKyAgICBVSU5UMzIgICAgQmFzZU9mQ29kZTsKKyAgICBVSU5UMzIgICAgQmFzZU9mRGF0YTsKKyAgICAgICAgICAgICAgICAKKyAgICAvLworICAgIC8vIE5UIGFkZGl0aW9uYWwgZmllbGRzLgorICAgIC8vCisKKyAgICBVSU5UMzIgICBJbWFnZUJhc2U7CisgICAgVUlOVDMyICAgU2VjdGlvbkFsaWdubWVudDsKKyAgICBVSU5UMzIgICBGaWxlQWxpZ25tZW50OworICAgIFVJTlQxNiAgIE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKKyAgICBVSU5UMTYgICBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgICAgVUlOVDE2ICAgTWFqb3JJbWFnZVZlcnNpb247CisgICAgVUlOVDE2ICAgTWlub3JJbWFnZVZlcnNpb247CisgICAgVUlOVDE2ICAgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOworICAgIFVJTlQxNiAgIE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsKKyAgICBVSU5UMzIgICBSZXNlcnZlZDE7CisgICAgVUlOVDMyICAgU2l6ZU9mSW1hZ2U7CisgICAgVUlOVDMyICAgU2l6ZU9mSGVhZGVyczsKKyAgICBVSU5UMzIgICBDaGVja1N1bTsKKyAgICBVSU5UMTYgICBTdWJzeXN0ZW07CisgICAgVUlOVDE2ICAgRGxsQ2hhcmFjdGVyaXN0aWNzOworICAgIFVJTlQzMiAgIFNpemVPZlN0YWNrUmVzZXJ2ZTsKKyAgICBVSU5UMzIgICBTaXplT2ZTdGFja0NvbW1pdDsKKyAgICBVSU5UMzIgICBTaXplT2ZIZWFwUmVzZXJ2ZTsKKyAgICBVSU5UMzIgICBTaXplT2ZIZWFwQ29tbWl0OworICAgIFVJTlQzMiAgIExvYWRlckZsYWdzOworICAgIFVJTlQzMiAgIE51bWJlck9mUnZhQW5kU2l6ZXM7CisgICAgSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107Cit9IElNQUdFX09QVElPTkFMX0hFQURFUiwgKlBJTUFHRV9PUFRJT05BTF9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSIHsKKyAgICBVSU5UMTYgIE1hZ2ljOworICAgIFVJTlQ4ICAgTWFqb3JMaW5rZXJWZXJzaW9uOworICAgIFVJTlQ4ICAgTWlub3JMaW5rZXJWZXJzaW9uOworICAgIFVJTlQzMiAgU2l6ZU9mQ29kZTsKKyAgICBVSU5UMzIgIFNpemVPZkluaXRpYWxpemVkRGF0YTsKKyAgICBVSU5UMzIgIFNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOworICAgIFVJTlQzMiAgQWRkcmVzc09mRW50cnlQb2ludDsKKyAgICBVSU5UMzIgIEJhc2VPZkNvZGU7CisgICAgVUlOVDMyICBCYXNlT2ZEYXRhOworICAgIFVJTlQzMiAgQmFzZU9mQnNzOworICAgIFVJTlQzMiAgR3ByTWFzazsKKyAgICBVSU5UMzIgIENwck1hc2tbNF07CisgICAgVUlOVDMyICBHcFZhbHVlOworfSBJTUFHRV9ST01fT1BUSU9OQUxfSEVBREVSLCAqUElNQUdFX1JPTV9PUFRJT05BTF9IRUFERVI7CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1JPTV9PUFRJT05BTF9IRUFERVIgICAgICA1NgorI2RlZmluZSBJTUFHRV9TSVpFT0ZfU1REX09QVElPTkFMX0hFQURFUiAgICAgIDI4CisjZGVmaW5lIElNQUdFX1NJWkVPRl9OVF9PUFRJT05BTF9IRUFERVIgICAgICAyMjQKKworI2RlZmluZSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMgICAgICAgIDB4MTBiCisjZGVmaW5lIElNQUdFX1JPTV9PUFRJT05BTF9IRFJfTUFHSUMgICAgICAgMHgxMDcKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX05UX0hFQURFUlMgeworICAgIFVJTlQzMiBTaWduYXR1cmU7CisgICAgSU1BR0VfRklMRV9IRUFERVIgRmlsZUhlYWRlcjsKKyAgICBJTUFHRV9PUFRJT05BTF9IRUFERVIgT3B0aW9uYWxIZWFkZXI7Cit9IElNQUdFX05UX0hFQURFUlMsICpQSU1BR0VfTlRfSEVBREVSUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1JPTV9IRUFERVJTIHsKKyAgICBJTUFHRV9GSUxFX0hFQURFUiBGaWxlSGVhZGVyOworICAgIElNQUdFX1JPTV9PUFRJT05BTF9IRUFERVIgT3B0aW9uYWxIZWFkZXI7Cit9IElNQUdFX1JPTV9IRUFERVJTLCAqUElNQUdFX1JPTV9IRUFERVJTOworCisjZGVmaW5lIElNQUdFX0ZJUlNUX1NFQ1RJT04oIG50aGVhZGVyICkgKChQSU1BR0VfU0VDVElPTl9IRUFERVIpICAgICAgICBcCisgICAgKChVSU5UMzIpbnRoZWFkZXIgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBGSUVMRF9PRkZTRVQoIElNQUdFX05UX0hFQURFUlMsIE9wdGlvbmFsSGVhZGVyICkgKyAgICAgICAgICAgICAgICAgXAorICAgICAoKFBJTUFHRV9OVF9IRUFERVJTKShudGhlYWRlcikpLT5GaWxlSGVhZGVyLlNpemVPZk9wdGlvbmFsSGVhZGVyICAgXAorICAgICkpCisKKworLy8gU3Vic3lzdGVtIFZhbHVlcworCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9VTktOT1dOICAgICAgICAgICAgICAwICAgLy8gVW5rbm93biBzdWJzeXN0ZW0uCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9OQVRJVkUgICAgICAgICAgICAgICAxICAgLy8gSW1hZ2UgZG9lc24ndCByZXF1aXJlIGEgc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fV0lORE9XU19HVUkgICAgICAgICAgMiAgIC8vIEltYWdlIHJ1bnMgaW4gdGhlIFdpbmRvd3MgR1VJIHN1YnN5c3RlbS4KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfQ1VJICAgICAgICAgIDMgICAvLyBJbWFnZSBydW5zIGluIHRoZSBXaW5kb3dzIGNoYXJhY3RlciBzdWJzeXN0ZW0uCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9PUzJfQ1VJICAgICAgICAgICAgICA1ICAgLy8gaW1hZ2UgcnVucyBpbiB0aGUgT1MvMiBjaGFyYWN0ZXIgc3Vic3lzdGVtLgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fUE9TSVhfQ1VJICAgICAgICAgICAgNyAgIC8vIGltYWdlIHJ1biAgaW4gdGhlIFBvc2l4IGNoYXJhY3RlciBzdWJzeXN0ZW0uCisKKworLy8gRGlyZWN0b3J5IEVudHJpZXMKKworI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfRVhQT1JUICAgICAgICAgMCAgIC8vIEV4cG9ydCBEaXJlY3RvcnkKKyNkZWZpbmUgSU1BR0VfRElSRUNUT1JZX0VOVFJZX0lNUE9SVCAgICAgICAgIDEgICAvLyBJbXBvcnQgRGlyZWN0b3J5CisjZGVmaW5lIElNQUdFX0RJUkVDVE9SWV9FTlRSWV9SRVNPVVJDRSAgICAgICAyICAgLy8gUmVzb3VyY2UgRGlyZWN0b3J5CisjZGVmaW5lIElNQUdFX0RJUkVDVE9SWV9FTlRSWV9FWENFUFRJT04gICAgICAzICAgLy8gRXhjZXB0aW9uIERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfU0VDVVJJVFkgICAgICAgNCAgIC8vIFNlY3VyaXR5IERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfQkFTRVJFTE9DICAgICAgNSAgIC8vIEJhc2UgUmVsb2NhdGlvbiBUYWJsZQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfREVCVUcgICAgICAgICAgNiAgIC8vIERlYnVnIERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfQ09QWVJJR0hUICAgICAgNyAgIC8vIERlc2NyaXB0aW9uIFN0cmluZworI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfR0xPQkFMUFRSICAgICAgOCAgIC8vIE1hY2hpbmUgVmFsdWUgKE1JUFMgR1ApCisjZGVmaW5lIElNQUdFX0RJUkVDVE9SWV9FTlRSWV9UTFMgICAgICAgICAgICA5ICAgLy8gVExTIERpcmVjdG9yeQorI2RlZmluZSBJTUFHRV9ESVJFQ1RPUllfRU5UUllfTE9BRF9DT05GSUcgICAxMCAgIC8vIExvYWQgQ29uZmlndXJhdGlvbiBEaXJlY3RvcnkKKworLy8KKy8vIFNlY3Rpb24gaGVhZGVyIGZvcm1hdC4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1NIT1JUX05BTUUgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1NFQ1RJT05fSEVBREVSIHsKKyAgICBVSU5UOCAgIE5hbWVbSU1BR0VfU0laRU9GX1NIT1JUX05BTUVdOworICAgIHVuaW9uIHsKKyAgICAgICAgICAgIFVJTlQzMiAgIFBoeXNpY2FsQWRkcmVzczsKKyAgICAgICAgICAgIFVJTlQzMiAgIFZpcnR1YWxTaXplOworICAgIH0gTWlzYzsKKyAgICBVSU5UMzIgICBWaXJ0dWFsQWRkcmVzczsKKyAgICBVSU5UMzIgICBTaXplT2ZSYXdEYXRhOworICAgIFVJTlQzMiAgIFBvaW50ZXJUb1Jhd0RhdGE7CisgICAgVUlOVDMyICAgUG9pbnRlclRvUmVsb2NhdGlvbnM7CisgICAgVUlOVDMyICAgUG9pbnRlclRvTGluZW51bWJlcnM7CisgICAgVUlOVDE2ICAgTnVtYmVyT2ZSZWxvY2F0aW9uczsKKyAgICBVSU5UMTYgICBOdW1iZXJPZkxpbmVudW1iZXJzOworICAgIFVJTlQzMiAgIENoYXJhY3RlcmlzdGljczsKK30gSU1BR0VfU0VDVElPTl9IRUFERVIsICpQSU1BR0VfU0VDVElPTl9IRUFERVI7CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1NFQ1RJT05fSEVBREVSICAgICAgICAgIDQwCisKKyNkZWZpbmUgSU1BR0VfU0NOX1RZUEVfTk9fUEFEICAgICAgICAgICAgICAgIDB4MDAwMDAwMDggIC8vIFJlc2VydmVkLgorCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvLyBTZWN0aW9uIGNvbnRhaW5zIGNvZGUuCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSAgICAgICAweDAwMDAwMDQwICAvLyBTZWN0aW9uIGNvbnRhaW5zIGluaXRpYWxpemVkIGRhdGEuCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBICAgICAweDAwMDAwMDgwICAvLyBTZWN0aW9uIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgZGF0YS4KKworI2RlZmluZSBJTUFHRV9TQ05fTE5LX09USEVSICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLy8gUmVzZXJ2ZWQuCisjZGVmaW5lIElNQUdFX1NDTl9MTktfSU5GTyAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvLyBTZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIG9yIHNvbWUgb3RoZXIgdHlwZSBvZiBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgSU1BR0VfU0NOX0xOS19SRU1PVkUgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgIC8vIFNlY3Rpb24gY29udGVudHMgd2lsbCBub3QgYmVjb21lIHBhcnQgb2YgaW1hZ2UuCisjZGVmaW5lIElNQUdFX1NDTl9MTktfQ09NREFUICAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAvLyBTZWN0aW9uIGNvbnRlbnRzIGNvbWRhdC4KKworI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMUJZVEVTICAgICAgICAgICAgICAgMHgwMDEwMDAwMCAgLy8KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzJCWVRFUyAgICAgICAgICAgICAgIDB4MDAyMDAwMDAgIC8vCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl80QllURVMgICAgICAgICAgICAgICAweDAwMzAwMDAwICAvLworI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fOEJZVEVTICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgLy8KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMgICAgICAgICAgICAgIDB4MDA1MDAwMDAgIC8vIERlZmF1bHQgYWxpZ25tZW50IGlmIG5vIG90aGVycyBhcmUgc3BlY2lmaWVkLgorI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUyAgICAgICAgICAgICAgMHgwMDYwMDAwMCAgLy8KKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMgICAgICAgICAgICAgIDB4MDA3MDAwMDAgIC8vCisKKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRSAgICAgICAgICAgIDB4MDIwMDAwMDAgIC8vIFNlY3Rpb24gY2FuIGJlIGRpc2NhcmRlZC4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9OT1RfQ0FDSEVEICAgICAgICAgICAgIDB4MDQwMDAwMDAgIC8vIFNlY3Rpb24gaXMgbm90IGNhY2hhYmxlLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9QQUdFRCAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLy8gU2VjdGlvbiBpcyBub3QgcGFnZWFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fU0hBUkVEICAgICAgICAgICAgICAgICAweDEwMDAwMDAwICAvLyBTZWN0aW9uIGlzIHNoYXJlYWJsZS4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9FWEVDVVRFICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAgIC8vIFNlY3Rpb24gaXMgZXhlY3V0YWJsZS4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFEICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAgIC8vIFNlY3Rpb24gaXMgcmVhZGFibGUuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fV1JJVEUgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwICAvLyBTZWN0aW9uIGlzIHdyaXRlYWJsZS4KKworLy8KKy8vIFN5bWJvbCBmb3JtYXQuCisvLworCisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1NZTUJPTCAgICAgICAgICAgICAgICAgIDE4CisKKy8vCisvLyBTZWN0aW9uIHZhbHVlcy4KKy8vCisvLyBTeW1ib2xzIGhhdmUgYSBzZWN0aW9uIG51bWJlciBvZiB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGV5IGFyZQorLy8gZGVmaW5lZC4gT3RoZXJ3aXNlLCBzZWN0aW9uIG51bWJlcnMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgorLy8KKworI2RlZmluZSBJTUFHRV9TWU1fVU5ERUZJTkVEICAgICAgICAgICAoVUlOVDE2KTAgICAgICAgICAgIC8vIFN5bWJvbCBpcyB1bmRlZmluZWQgb3IgaXMgY29tbW9uLgorI2RlZmluZSBJTUFHRV9TWU1fQUJTT0xVVEUgICAgICAgICAgICAoVUlOVDE2KS0xICAgICAgICAgIC8vIFN5bWJvbCBpcyBhbiBhYnNvbHV0ZSB2YWx1ZS4KKyNkZWZpbmUgSU1BR0VfU1lNX0RFQlVHICAgICAgICAgICAgICAgKFVJTlQxNiktMiAgICAgICAgICAvLyBTeW1ib2wgaXMgYSBzcGVjaWFsIGRlYnVnIGl0ZW0uCisKKy8vCisvLyBUeXBlIChmdW5kYW1lbnRhbCkgdmFsdWVzLgorLy8KKworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9OVUxMICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgLy8gbm8gdHlwZS4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfVk9JRCAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0NIQVIgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAvLyB0eXBlIGNoYXJhY3Rlci4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfU0hPUlQgICAgICAgICAgICAgICAgIDMgICAgICAgICAgIC8vIHR5cGUgc2hvcnQgaW50ZWdlci4KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfSU5UICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX0xPTkcgICAgICAgICAgICAgICAgICA1ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9GTE9BVCAgICAgICAgICAgICAgICAgNiAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRE9VQkxFICAgICAgICAgICAgICAgIDcgICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1NUUlVDVCAgICAgICAgICAgICAgICA4ICAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9VTklPTiAgICAgICAgICAgICAgICAgOSAgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfRU5VTSAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgIC8vIGVudW1lcmF0aW9uLgorI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9NT0UgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgLy8gbWVtYmVyIG9mIGVudW1lcmF0aW9uLgorI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9CWVRFICAgICAgICAgICAgICAgICAgMTIgICAgICAgICAgLy8KKyNkZWZpbmUgSU1BR0VfU1lNX1RZUEVfV09SRCAgICAgICAgICAgICAgICAgIDEzICAgICAgICAgIC8vCisjZGVmaW5lIElNQUdFX1NZTV9UWVBFX1VJTlQgICAgICAgICAgICAgICAgICAxNCAgICAgICAgICAvLworI2RlZmluZSBJTUFHRV9TWU1fVFlQRV9EV09SRCAgICAgICAgICAgICAgICAgMTUgICAgICAgICAgLy8KKworLy8KKy8vIFR5cGUgKGRlcml2ZWQpIHZhbHVlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfU1lNX0RUWVBFX05VTEwgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIC8vIG5vIGRlcml2ZWQgdHlwZS4KKyNkZWZpbmUgSU1BR0VfU1lNX0RUWVBFX1BPSU5URVIgICAgICAgICAgICAgIDEgICAgICAgICAgIC8vIHBvaW50ZXIuCisjZGVmaW5lIElNQUdFX1NZTV9EVFlQRV9GVU5DVElPTiAgICAgICAgICAgICAyICAgICAgICAgICAvLyBmdW5jdGlvbi4KKyNkZWZpbmUgSU1BR0VfU1lNX0RUWVBFX0FSUkFZICAgICAgICAgICAgICAgIDMgICAgICAgICAgIC8vIGFycmF5LgorCisvLworLy8gU3RvcmFnZSBjbGFzc2VzLgorLy8KKworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRU5EX09GX0ZVTkNUSU9OICAgICAgKEJZVEUgKS0xCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19OVUxMICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19BVVRPTUFUSUMgICAgICAgICAgICAxCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19FWFRFUk5BTCAgICAgICAgICAgICAyCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19TVEFUSUMgICAgICAgICAgICAgICAzCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19SRUdJU1RFUiAgICAgICAgICAgICA0CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19FWFRFUk5BTF9ERUYgICAgICAgICA1CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19MQUJFTCAgICAgICAgICAgICAgICA2CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19VTkRFRklORURfTEFCRUwgICAgICA3CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19NRU1CRVJfT0ZfU1RSVUNUICAgICA4CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19BUkdVTUVOVCAgICAgICAgICAgICA5CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19TVFJVQ1RfVEFHICAgICAgICAgICAxMAorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX1VOSU9OICAgICAgMTEKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX1VOSU9OX1RBRyAgICAgICAgICAgIDEyCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19UWVBFX0RFRklOSVRJT04gICAgICAxMworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfVU5ERUZJTkVEX1NUQVRJQyAgICAgMTQKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0VOVU1fVEFHICAgICAgICAgICAgIDE1CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19NRU1CRVJfT0ZfRU5VTSAgICAgICAxNgorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfUkVHSVNURVJfUEFSQU0gICAgICAgMTcKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0JJVF9GSUVMRCAgICAgICAgICAgIDE4CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19CTE9DSyAgICAgICAgICAgICAgICAxMDAKKyNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0ZVTkNUSU9OICAgICAgICAgICAgIDEwMQorI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfRU5EX09GX1NUUlVDVCAgICAgICAgMTAyCisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19GSUxFICAgICAgICAgICAgICAgICAxMDMKKy8vIG5ldworI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfU0VDVElPTiAgICAgICAgICAgICAgMTA0CisjZGVmaW5lIElNQUdFX1NZTV9DTEFTU19XRUFLX0VYVEVSTkFMICAgICAgICAxMDUKKworLy8gdHlwZSBwYWNraW5nIGNvbnN0YW50cworCisjZGVmaW5lIE5fQlRNQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxNworI2RlZmluZSBOX1RNQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNjAKKyNkZWZpbmUgTl9UTUFTSzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDMwMAorI2RlZmluZSBOX1RNQVNLMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMzYwCisjZGVmaW5lIE5fQlRTSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTl9UU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisvLyBNQUNST1MKKworLy8KKy8vIENvbW11bmFsIHNlbGVjdGlvbiB0eXBlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9OT0RVUExJQ0FURVMgICAxCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZICAgICAgICAgICAgMgorI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRSAgICAgIDMKKyNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSCAgICA0CisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkUgICAgNQorCisjZGVmaW5lIElNQUdFX1dFQUtfRVhURVJOX1NFQVJDSF9OT0xJQlJBUlkgMQorI2RlZmluZSBJTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfTElCUkFSWSAgIDIKKyNkZWZpbmUgSU1BR0VfV0VBS19FWFRFUk5fU0VBUkNIX0FMSUFTICAgICAzCisKKworLy8KKy8vIFJlbG9jYXRpb24gZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1JFTE9DQVRJT04geworICAgIFVJTlQzMiAgIFZpcnR1YWxBZGRyZXNzOworICAgIFVJTlQzMiAgIFN5bWJvbFRhYmxlSW5kZXg7CisgICAgVUlOVDE2ICAgIFR5cGU7Cit9IElNQUdFX1JFTE9DQVRJT047CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX1JFTE9DQVRJT04gICAgICAgICAgICAgIDEwCisKKy8vCisvLyBJMzg2IHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0FCU09MVVRFICAgICAgICAgICAgICAwICAgICAgICAgICAvLyBSZWZlcmVuY2UgaXMgYWJzb2x1dGUsIG5vIHJlbG9jYXRpb24gaXMgbmVjZXNzYXJ5CisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0RJUjE2ICAgICAgICAgICAgICAgICAwMSAgICAgICAgICAvLyBEaXJlY3QgMTYtYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfUkVMMTYgICAgICAgICAgICAgICAgIDAyICAgICAgICAgIC8vIFBDLXJlbGF0aXZlIDE2LWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X0RJUjMyICAgICAgICAgICAgICAgICAwNiAgICAgICAgICAvLyBEaXJlY3QgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfRElSMzJOQiAgICAgICAgICAgICAgIDA3ICAgICAgICAgIC8vIERpcmVjdCAzMi1iaXQgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2xzIHZpcnR1YWwgYWRkcmVzcywgYmFzZSBub3QgaW5jbHVkZWQKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfU0VHMTIgICAgICAgICAgICAgICAgIDAxMSAgICAgICAgIC8vIERpcmVjdCAxNi1iaXQgcmVmZXJlbmNlIHRvIHRoZSBzZWdtZW50LXNlbGVjdG9yIGJpdHMgb2YgYSAzMi1iaXQgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9JMzg2X1NFQ1RJT04gICAgICAgICAgICAgICAwMTIKKyNkZWZpbmUgSU1BR0VfUkVMX0kzODZfU0VDUkVMICAgICAgICAgICAgICAgIDAxMworI2RlZmluZSBJTUFHRV9SRUxfSTM4Nl9SRUwzMiAgICAgICAgICAgICAgICAgMDI0ICAgICAgICAgLy8gUEMtcmVsYXRpdmUgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKworLy8KKy8vIE1JUFMgcmVsb2NhdGlvbiB0eXBlcy4KKy8vCisKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfQUJTT0xVVEUgICAgICAgICAgICAgIDAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBpcyBhYnNvbHV0ZSwgbm8gcmVsb2NhdGlvbiBpcyBuZWNlc3NhcnkKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfUkVGSEFMRiAgICAgICAgICAgICAgIDAxCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRldPUkQgICAgICAgICAgICAgICAwMgorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19KTVBBRERSICAgICAgICAgICAgICAgMDMKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfUkVGSEkgICAgICAgICAgICAgICAgIDA0CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1JFRkxPICAgICAgICAgICAgICAgICAwNQorI2RlZmluZSBJTUFHRV9SRUxfTUlQU19HUFJFTCAgICAgICAgICAgICAgICAgMDYKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfTElURVJBTCAgICAgICAgICAgICAgIDA3CisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1NFQ1RJT04gICAgICAgICAgICAgICAwMTIKKyNkZWZpbmUgSU1BR0VfUkVMX01JUFNfU0VDUkVMICAgICAgICAgICAgICAgIDAxMworI2RlZmluZSBJTUFHRV9SRUxfTUlQU19SRUZXT1JETkIgICAgICAgICAgICAgMDQyCisjZGVmaW5lIElNQUdFX1JFTF9NSVBTX1BBSVIgICAgICAgICAgICAgICAgICAwNDUKKworLy8KKy8vIEFscGhhIFJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9BQlNPTFVURSAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkxPTkcgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfUkVGUVVBRCAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9HUFJFTDMyICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0xJVEVSQUwgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfTElUVVNFICAgICAgICAgICAgICAgMHg1CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9HUERJU1AgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX0JSQUREUiAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfSElOVCAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9JTkxJTkVfUkVGTE9ORyAgICAgICAweDkKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkhJICAgICAgICAgICAgICAgIDB4QQorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfUkVGTE8gICAgICAgICAgICAgICAgMHhCCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9QQUlSICAgICAgICAgICAgICAgICAweEMKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX01BVENIICAgICAgICAgICAgICAgIDB4RAorI2RlZmluZSBJTUFHRV9SRUxfQUxQSEFfU0VDVElPTiAgICAgICAgICAgICAgMHhFCisjZGVmaW5lIElNQUdFX1JFTF9BTFBIQV9TRUNSRUwgICAgICAgICAgICAgICAweEYKKyNkZWZpbmUgSU1BR0VfUkVMX0FMUEhBX1JFRkxPTkdOQiAgICAgICAgICAgIDB4MTAKKworLy8KKy8vIElCTSBQb3dlclBDIHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgMHgwMDAwICAvLyBOT1AKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSNjQgICAweDAwMDEgIC8vIDY0LWJpdCBhZGRyZXNzCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyICAgMHgwMDAyICAvLyAzMi1iaXQgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIyNCAgIDB4MDAwMyAgLy8gMjYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggYWJzb2x1dGUpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjE2ICAgMHgwMDA0ICAvLyAxNi1iaXQgYWRkcmVzcworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNCAgIDB4MDAwNSAgLy8gMTYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMjQgICAgMHgwMDA2ICAvLyAyNi1iaXQgUEMtcmVsYXRpdmUgb2Zmc2V0LCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIHJlbGF0aXZlKQorI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFTDE0ICAgIDB4MDAwNyAgLy8gMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTYgMHgwMDA4ICAvLyAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNCAweDAwMDkgIC8vIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSwgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkKKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5CIDB4MDAwQSAgLy8gMzItYml0IGFkZHIgdy9vIGltYWdlIGJhc2UKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNSRUwgICAweDAwMEIgIC8vIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNUSU9OICAweDAwMEMgIC8vIHNlY3Rpb25oZWFkZXIgbnVtYmVyCisjZGVmaW5lIElNQUdFX1JFTF9QUENfSUZHTFVFICAgMHgwMDBEICAvLyBzdWJzdGl0dXRlIFRPQyByZXN0b3JlIGluc3RydWN0aW9uIGlmZiBzeW1ib2wgaXMgZ2x1ZSBjb2RlCisjZGVmaW5lIElNQUdFX1JFTF9QUENfSU1HTFVFICAgMHgwMDBFICAvLyBzeW1ib2wgaXMgZ2x1ZSBjb2RlOyB2aXJ0dWFsIGFkZHJlc3MgaXMgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24KKworI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RZUEVNQVNLIDB4MDBGRiAgLy8gbWFzayB0byBpc29sYXRlIGFib3ZlIHZhbHVlcyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlR5cGUKKworLy8gRmxhZyBiaXRzIGluIElNQUdFX1JFTE9DQVRJT04uVFlQRQorCisjZGVmaW5lIElNQUdFX1JFTF9QUENfTkVHICAgICAgMHgwMTAwICAvLyBzdWJ0cmFjdCByZWxvYyB2YWx1ZSByYXRoZXIgdGhhbiBhZGRpbmcgaXQKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19CUlRBS0VOICAweDAyMDAgIC8vIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggdGFrZW4KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19CUk5UQUtFTiAweDA0MDAgIC8vIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggbm90IHRha2VuCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DREVGTiAgMHgwODAwICAvLyB0b2Mgc2xvdCBkZWZpbmVkIGluIGZpbGUgKG9yLCBkYXRhIGluIHRvYykKKworLy8KKy8vIEJhc2VkIHJlbG9jYXRpb24gZm9ybWF0LgorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0JBU0VfUkVMT0NBVElPTiB7CisgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7CisgICAgVUlOVDMyICAgU2l6ZU9mQmxvY2s7CisvLyAgVUlOVDE2ICAgIFR5cGVPZmZzZXRbMV07Cit9IElNQUdFX0JBU0VfUkVMT0NBVElPTiwgKlBJTUFHRV9CQVNFX1JFTE9DQVRJT047CisKKyNkZWZpbmUgSU1BR0VfU0laRU9GX0JBU0VfUkVMT0NBVElPTiAgICAgICAgIDgKKworLy8KKy8vIEJhc2VkIHJlbG9jYXRpb24gdHlwZXMuCisvLworCisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9BQlNPTFVURSAgICAgICAgICAgICAgMAorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0xPVyAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9ISUdITE9XICAgICAgICAgICAgICAgMworI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSEFESiAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX01JUFNfSk1QQUREUiAgICAgICAgICA1CisjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9JQTY0X0lNTTY0ICAgICAgICAgICAgOQorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfRElSNjQgICAgICAgICAgICAgICAgIDEwCisKKy8vCisvLyBMaW5lIG51bWJlciBmb3JtYXQuCisvLworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfTElORU5VTUJFUiB7CisgICAgdW5pb24geworICAgICAgICBVSU5UMzIgICBTeW1ib2xUYWJsZUluZGV4OyAgICAgICAgICAgICAgIC8vIFN5bWJvbCB0YWJsZSBpbmRleCBvZiBmdW5jdGlvbiBuYW1lIGlmIExpbmVudW1iZXIgaXMgMC4KKyAgICAgICAgVUlOVDMyICAgVmlydHVhbEFkZHJlc3M7ICAgICAgICAgICAgICAgICAvLyBWaXJ0dWFsIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIuCisgICAgfSBUeXBlOworICAgIFVJTlQxNiAgICBMaW5lbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW5lIG51bWJlci4KK30gSU1BR0VfTElORU5VTUJFUjsKKworI2RlZmluZSBJTUFHRV9TSVpFT0ZfTElORU5VTUJFUiAgICAgICAgICAgICAgNgorCisvLworLy8gQXJjaGl2ZSBmb3JtYXQuCisvLworCisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfU1RBUlRfU0laRSAgICAgICAgICAgICA4CisjZGVmaW5lIElNQUdFX0FSQ0hJVkVfU1RBUlQgICAgICAgICAgICAgICAgICAiITxhcmNoPlxuIgorI2RlZmluZSBJTUFHRV9BUkNISVZFX0VORCAgICAgICAgICAgICAgICAgICAgImBcbiIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9QQUQgICAgICAgICAgICAgICAgICAgICJcbiIKKyNkZWZpbmUgSU1BR0VfQVJDSElWRV9MSU5LRVJfTUVNQkVSICAgICAgICAgICIvICAgICAgICAgICAgICAgIgorI2RlZmluZSBJTUFHRV9BUkNISVZFX0xPTkdOQU1FU19NRU1CRVIgICAgICAgIi8vICAgICAgICAgICAgICAiCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9BUkNISVZFX01FTUJFUl9IRUFERVIgeworICAgIFVJTlQ4ICAgICBOYW1lWzE2XTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbWVtYmVyIG5hbWUgLSBgLycgdGVybWluYXRlZC4KKyAgICBVSU5UOCAgICAgRGF0ZVsxMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBkYXRlIC0gZGVjaW1hbC4KKyAgICBVSU5UOCAgICAgVXNlcklEWzZdOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciB1c2VyIGlkIC0gZGVjaW1hbC4KKyAgICBVSU5UOCAgICAgR3JvdXBJRFs2XTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG1lbWJlciBncm91cCBpZCAtIGRlY2ltYWwuCisgICAgVUlOVDggICAgIE1vZGVbOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBtZW1iZXIgbW9kZSAtIG9jdGFsLgorICAgIFVJTlQ4ICAgICBTaXplWzEwXTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbWVtYmVyIHNpemUgLSBkZWNpbWFsLgorICAgIFVJTlQ4ICAgICBFbmRIZWFkZXJbMl07ICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmluZyB0byBlbmQgaGVhZGVyLgorfSBJTUFHRV9BUkNISVZFX01FTUJFUl9IRUFERVIsICpQSU1BR0VfQVJDSElWRV9NRU1CRVJfSEVBREVSOworCisjZGVmaW5lIElNQUdFX1NJWkVPRl9BUkNISVZFX01FTUJFUl9IRFIgICAgICA2MAorCisvLworLy8gRExMIHN1cHBvcnQuCisvLworCisvLworLy8gRXhwb3J0IEZvcm1hdAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgeworICAgIFVJTlQzMiAgIENoYXJhY3RlcmlzdGljczsKKyAgICBVSU5UMzIgICBUaW1lRGF0ZVN0YW1wOworICAgIFVJTlQxNiAgIE1ham9yVmVyc2lvbjsKKyAgICBVSU5UMTYgICBNaW5vclZlcnNpb247CisgICAgVUlOVDMyICAgTmFtZTsKKyAgICBVSU5UMzIgICBCYXNlOworICAgIFVJTlQzMiAgIE51bWJlck9mRnVuY3Rpb25zOworICAgIFVJTlQzMiAgIE51bWJlck9mTmFtZXM7CisgICAgVUlOVDMyICAgKkFkZHJlc3NPZkZ1bmN0aW9uczsKKyAgICBVSU5UMzIgICAqQWRkcmVzc09mTmFtZXM7CisgICAgVUlOVDMyICAgKkFkZHJlc3NPZk5hbWVPcmRpbmFsczsKK30gSU1BR0VfRVhQT1JUX0RJUkVDVE9SWSwgKlBJTUFHRV9FWFBPUlRfRElSRUNUT1JZOworCisvLworLy8gSW1wb3J0IEZvcm1hdAorLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0lNUE9SVF9CWV9OQU1FIHsKKyAgICBVSU5UMTYgICAgSGludDsKKyAgICBVSU5UOCAgICAgTmFtZVsxXTsKK30gSU1BR0VfSU1QT1JUX0JZX05BTUUsICpQSU1BR0VfSU1QT1JUX0JZX05BTUU7CisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9USFVOS19EQVRBIHsKKyAgICB1bmlvbiB7CisgICAgICAgIFVJTlQzMiBGdW5jdGlvbjsKKyAgICAgICAgVUlOVDMyIE9yZGluYWw7CisgICAgICAgIFBJTUFHRV9JTVBPUlRfQllfTkFNRSBBZGRyZXNzT2ZEYXRhOworICAgIH0gdTE7Cit9IElNQUdFX1RIVU5LX0RBVEEsICpQSU1BR0VfVEhVTktfREFUQTsKKworI2RlZmluZSBJTUFHRV9PUkRJTkFMX0ZMQUcgMHg4MDAwMDAwMAorI2RlZmluZSBJTUFHRV9TTkFQX0JZX09SRElOQUwoT3JkaW5hbCkgKChPcmRpbmFsICYgSU1BR0VfT1JESU5BTF9GTEFHKSAhPSAwKQorI2RlZmluZSBJTUFHRV9PUkRJTkFMKE9yZGluYWwpIChPcmRpbmFsICYgMHhmZmZmKQorCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1IgeworICAgIFVJTlQzMiAgIENoYXJhY3RlcmlzdGljczsKKyAgICBVSU5UMzIgICBUaW1lRGF0ZVN0YW1wOworICAgIFVJTlQzMiAgIEZvcndhcmRlckNoYWluOworICAgIFVJTlQzMiAgIE5hbWU7CisgICAgUElNQUdFX1RIVU5LX0RBVEEgRmlyc3RUaHVuazsKK30gSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1IsICpQSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1I7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvTWFrZWZpbGUgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2RjZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvTWFrZWZpbGUKQEAgLTAsMCArMSw4MCBAQAorIworIyAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgSGV3bGV0dC1QYWNrYXJkIENvLgorIwlDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXIgPGRhdmlkbUBocGwuaHAuY29tPgorIwlDb250cmlidXRlZCBieSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisjCisjICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgICAgYXJlIG1ldDoKKyMKKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyMgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyMgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgQ28uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisjICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyMgICAgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyMgICAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyMgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgICAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyMgICAgQkUgTElBQkxFIEZPUiBBTllESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisjICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorIyAgICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgICAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyMgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GCisjICAgIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyAgICBTVUNIIERBTUFHRS4KKyMKKworU1JDRElSID0gLgorCitWUEFUSCA9ICQoU1JDRElSKQorCitpbmNsdWRlICQoU1JDRElSKS8uLi9NYWtlLmRlZmF1bHRzCisKK1RPUERJUiA9ICQoU1JDRElSKS8uLgorCitDRElSID0gJChUT1BESVIpLy4uCitGSUxFUyA9IGFyZ2lmeSBib3hkcmF3IHNtYmlvcyBjb25zb2xlIGNyYyBkYXRhIGRlYnVnIGRwYXRoICBcCisgICAgICAgIGVycm9yIGV2ZW50IGd1aWQgaGFuZCBodyBpbml0IGxvY2sgICBcCisgICAgICAgIG1pc2MgcHJpbnQgc3JlYWQgc3RyIFwKKwlydW50aW1lL3J0bG9jayBydW50aW1lL2VmaXJ0bGliIHJ1bnRpbWUvcnRzdHIgcnVudGltZS92bSBydW50aW1lL3J0ZGF0YSAgXAorCSQoQVJDSCkvaW5pdHBsYXQgJChBUkNIKS9tYXRoIAorCitpZmVxICgkKEFSQ0gpLGlhNjQpCitGSUxFUyArPSAkKEFSQ0gpL3NhbHBhbCAkKEFSQ0gpL3BhbHByb2MKK2VuZGlmCisKK2lmZXEgKCQoQVJDSCkseDg2XzY0KQorRklMRVMgKz0gJChBUkNIKS9jYWxsd3JhcCAkKEFSQ0gpL2VmaV9zdHViCitlbmRpZgorCitPQkpTICA9ICQoRklMRVM6JT0lLm8pCisKK1NVQkRJUlMgPSBpYTMyIHg4Nl82NCBpYTY0IHJ1bnRpbWUKKworYWxsOiBsaWJzdWJkaXJzIGxpYmVmaS5hCisKK2xpYnN1YmRpcnM6CisJZm9yIHNkaXIgaW4gJChTVUJESVJTKTsgZG8gbWtkaXIgLXAgJCRzZGlyOyBkb25lCisKK2xpYmVmaS5hOiAkKHBhdHN1YnN0ICUsbGliZWZpLmEoJSksJChPQkpTKSkKKworY2xlYW46CisJcm0gLWYgbGliZWZpLmEgKn4gJChPQkpTKSAqLyoubworCitpbnN0YWxsOiBsaWJlZmkuYQorCW1rZGlyIC1wICQoSU5TVEFMTFJPT1QpLyQoTElCRElSKQorCSQoSU5TVEFMTCkgLW0gNjQ0IGxpYmVmaS5hICQoSU5TVEFMTFJPT1QpLyQoTElCRElSKQorCitpbmNsdWRlICQoU1JDRElSKS8uLi9NYWtlLnJ1bGVzCisKKy5QSE9OWTogbGlic3ViZGlycwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvYXJnaWZ5LmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9hcmdpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjlhNDhiCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvYXJnaWZ5LmMKQEAgLTAsMCArMSw5NyBAQAorCisvKgorICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEhld2xldHQtUGFja2FyZCBDby4KKyAqICAgICAgQ29udHJpYnV0ZWQgYnkgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogICAgICBDb250cmlidXRlZCBieSBCcmVudCBDYXNhdmFudCA8YmNhc2F2YW5Ac2dpLmNvbT4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgICAgQ29udHJpYnV0ZWQgYnkgRmVuZ2h1YSBZdSA8ZmVuZ2h1YS55dUBpbnRlbC5jb20+CisgKiAgICAgIENvbnRyaWJ1dGVkIGJ5IEJpYm8gTWFvIDxiaWJvLm1hb0BpbnRlbC5jb20+CisgKiAgICAgIENvbnRyaWJ1dGVkIGJ5IENoYW5kcmFtb3VsaSBOYXJheWFuYW4gPG1vdWxpQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRUxJTE8sIHRoZSBFRkkgTGludXggYm9vdCBsb2FkZXIuCisgKgorICogIEVMSUxPIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgRUxJTE8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggRUxJTE87IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2UgY2hlY2sgb3V0IHRoZSBlbGlsby50eHQgZm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gb24gaG93CisgKiB0byB1c2UgdGhpcyBwcm9ncmFtLgorICovCisKKworI2luY2x1ZGUgPGVmaS5oPgorI2luY2x1ZGUgPGVmaWxpYi5oPgorI2luY2x1ZGUgPGFyZ2lmeS5oPgorCisKKworI2RlZmluZQlNQVhfQVJHUyAyNTYKKworI2RlZmluZSBDSEFSX1NQQUNFIEwnICcKKworI2RlZmluZSBERUJVRyAwCisKK0lOVE4KK2FyZ2lmeShDSEFSMTYgKmJ1ZiwgVUlOVE4gbGVuLCBDSEFSMTYgKiphcmd2KSAgIAoreworCisgICAgICAgIFVJTlROICAgICBpPTAsIGo9MDsKKyAgICAgICAgQ0hBUjE2ICAgKnAgPSBidWY7CisJCisgICAgICAgIGlmIChidWYgPT0gMCkgeyAKKwkJYXJndlswXSA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKwkvKiBsZW4gcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBub3QgdGhlIG51bWJlciBvZiAxNiBieXRlcyBjaGFycyAqLworCWxlbiA9IGxlbiA+PiAxOworCisJLyoKKwkgKiBIZXJlIHdlIHVzZSBDSEFSX05VTEwgYXMgdGhlIHRlcm1pbmF0b3IgcmF0aGVyIHRoYW4gdGhlIGxlbmd0aAorCSAqIGJlY2F1c2UgaXQgc2VlbXMgbGlrZSB0aGUgRUZJIHNoZWxsIHJldHVybiByYXRoZXIgYm9ndXMgdmFsdWVzIGZvciBpdC4KKwkgKiBBcHBhcmVudGx5LCB3ZSBhcmUgZ3VhcmFudGVlZCB0byBmaW5kIHRoZSAnXDAnIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyCisJICogd2hlcmUgdGhlIHJlYWwgaW5wdXQgYXJndW1lbnRzIHN0b3AsIHNvIHdlIHVzZSBpdCBpbnN0ZWFkLgorCSAqLworCWZvcig7OykgeworCQl3aGlsZSAoYnVmW2ldID09IENIQVJfU1BBQ0UgJiYgYnVmW2ldICE9IENIQVJfTlVMTCAmJiBpIDwgbGVuKSBpKys7CisKKwkJaWYgKGJ1ZltpXSA9PSBDSEFSX05VTEwgfHwgaSA9PSBsZW4pIGdvdG8gZW5kOworCisJCXAgPSBidWYraTsKKwkJaSsrOworCisJCXdoaWxlIChidWZbaV0gIT0gQ0hBUl9TUEFDRSAmJiBidWZbaV0gIT0gQ0hBUl9OVUxMICYmIGkgPCBsZW4pIGkrKzsKKworCQlhcmd2W2orK10gPSBwOworCisJCWlmIChidWZbaV0gPT0gQ0hBUl9OVUxMKSBnb3RvIGVuZDsKKworCQlidWZbaV0gID0gQ0hBUl9OVUxMOworCisJCWlmIChpID09IGxlbikgIGdvdG8gZW5kOworCisJCWkrKzsKKworCQlpZiAoaiA9PSBNQVhfQVJHUy0xKSB7CisJCQlQcmludChMInRvbyBtYW55IGFyZ3VtZW50cyAoJWQpIHRydW5jYXRpbmdcbiIsIGopOworCQkJZ290byBlbmQ7CisJCX0KKwl9CitlbmQ6CisgICAgICAgIGFyZ3Zbal0gPSBOVUxMOworCXJldHVybiBqOworfQorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9ib3hkcmF3LmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9ib3hkcmF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2NWZiOQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2JveGRyYXcuYwpAQCAtMCwwICsxLDE3MyBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgQm94RHJhdy5jCisKK0Fic3RyYWN0OgorICAgIExpYiBmdW5jdGlvbnMgdG8gc3VwcG9ydCBCb3ggRHJhdyBVbmljb2RlIGNvZGUgcGFnZXMuCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImxpYi5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0hBUjE2ICBVbmljb2RlOworICAgIENIQVI4ICAgUGNBbnNpOworICAgIENIQVI4ICAgQXNjaWk7Cit9IFVOSUNPREVfVE9fQ0hBUjsKKworCisvLworLy8gVGhpcyBsaXN0IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSB2YWxpZCBleHRlbmQgY2hhcnMuCisvLyBJdCBhbHNvIHByb3ZpZGVzIGEgbWFwcGluZyBmcm9tIFVuaWNvZGUgdG8gUENBTlNJIG9yCisvLyBBU0NJSS4gVGhlIEFTQ0lJIG1hcHBpbmcgd2UganVzdCBtYWRlIHVwLgorLy8KKy8vCisKK1NUQVRJQyBVTklDT0RFX1RPX0NIQVIgVW5pY29kZVRvUGNBbnNpT3JBc2NpaVtdID0geworICAgIHsgQk9YRFJBV19IT1JJWk9OVEFMLCAgICAgICAgICAgICAgICAgMHhjNCwgTCctJ30sIAorICAgIHsgQk9YRFJBV19WRVJUSUNBTCwgICAgICAgICAgICAgICAgICAgMHhiMywgTCd8J30sCisgICAgeyBCT1hEUkFXX0RPV05fUklHSFQsICAgICAgICAgICAgICAgICAweGRhLCBMJy8nfSwKKyAgICB7IEJPWERSQVdfRE9XTl9MRUZULCAgICAgICAgICAgICAgICAgIDB4YmYsIEwnXFwnfSwKKyAgICB7IEJPWERSQVdfVVBfUklHSFQsICAgICAgICAgICAgICAgICAgIDB4YzAsIEwnXFwnfSwKKyAgICB7IEJPWERSQVdfVVBfTEVGVCwgICAgICAgICAgICAgICAgICAgIDB4ZDksIEwnLyd9LAorICAgIHsgQk9YRFJBV19WRVJUSUNBTF9SSUdIVCwgICAgICAgICAgICAgMHhjMywgTCd8J30sCisgICAgeyBCT1hEUkFXX1ZFUlRJQ0FMX0xFRlQsICAgICAgICAgICAgICAweGI0LCBMJ3wnfSwKKyAgICB7IEJPWERSQVdfRE9XTl9IT1JJWk9OVEFMLCAgICAgICAgICAgIDB4YzIsIEwnKyd9LAorICAgIHsgQk9YRFJBV19VUF9IT1JJWk9OVEFMLCAgICAgICAgICAgICAgMHhjMSwgTCcrJ30sCisgICAgeyBCT1hEUkFXX1ZFUlRJQ0FMX0hPUklaT05UQUwsICAgICAgICAweGM1LCBMJysnfSwKKyAgICB7IEJPWERSQVdfRE9VQkxFX0hPUklaT05UQUwsICAgICAgICAgIDB4Y2QsIEwnLSd9LAorICAgIHsgQk9YRFJBV19ET1VCTEVfVkVSVElDQUwsICAgICAgICAgICAgMHhiYSwgTCd8J30sCisgICAgeyBCT1hEUkFXX0RPV05fUklHSFRfRE9VQkxFLCAgICAgICAgICAweGQ1LCBMJy8nfSwKKyAgICB7IEJPWERSQVdfRE9XTl9ET1VCTEVfUklHSFQsICAgICAgICAgIDB4ZDYsIEwnLyd9LAorICAgIHsgQk9YRFJBV19ET1VCTEVfRE9XTl9SSUdIVCwgICAgICAgICAgMHhjOSwgTCcvJ30sCisgICAgeyBCT1hEUkFXX0RPV05fTEVGVF9ET1VCTEUsICAgICAgICAgICAweGI4LCBMJ1xcJ30sCisgICAgeyBCT1hEUkFXX0RPV05fRE9VQkxFX0xFRlQsICAgICAgICAgICAweGI3LCBMJ1xcJ30sCisgICAgeyBCT1hEUkFXX0RPVUJMRV9ET1dOX0xFRlQsICAgICAgICAgICAweGJiLCBMJ1xcJ30sCisgICAgeyBCT1hEUkFXX1VQX1JJR0hUX0RPVUJMRSwgICAgICAgICAgICAweGQ0LCBMJ1xcJ30sCisgICAgeyBCT1hEUkFXX1VQX0RPVUJMRV9SSUdIVCwgICAgICAgICAgICAweGQzLCBMJ1xcJ30sCisgICAgeyBCT1hEUkFXX0RPVUJMRV9VUF9SSUdIVCwgICAgICAgICAgICAweGM4LCBMJ1xcJ30sCisgICAgeyBCT1hEUkFXX1VQX0xFRlRfRE9VQkxFLCAgICAgICAgICAgICAweGJlLCBMJy8nfSwKKyAgICB7IEJPWERSQVdfVVBfRE9VQkxFX0xFRlQsICAgICAgICAgICAgIDB4YmQsIEwnLyd9LAorICAgIHsgQk9YRFJBV19ET1VCTEVfVVBfTEVGVCwgICAgICAgICAgICAgMHhiYywgTCcvJ30sCisgICAgeyBCT1hEUkFXX1ZFUlRJQ0FMX1JJR0hUX0RPVUJMRSwgICAgICAweGM2LCBMJ3wnfSwKKyAgICB7IEJPWERSQVdfVkVSVElDQUxfRE9VQkxFX1JJR0hULCAgICAgIDB4YzcsIEwnfCd9LAorICAgIHsgQk9YRFJBV19ET1VCTEVfVkVSVElDQUxfUklHSFQsICAgICAgMHhjYywgTCd8J30sCisgICAgeyBCT1hEUkFXX1ZFUlRJQ0FMX0xFRlRfRE9VQkxFLCAgICAgICAweGI1LCBMJ3wnfSwKKyAgICB7IEJPWERSQVdfVkVSVElDQUxfRE9VQkxFX0xFRlQsICAgICAgIDB4YjYsIEwnfCd9LAorICAgIHsgQk9YRFJBV19ET1VCTEVfVkVSVElDQUxfTEVGVCwgICAgICAgMHhiOSwgTCd8J30sCisgICAgeyBCT1hEUkFXX0RPV05fSE9SSVpPTlRBTF9ET1VCTEUsICAgICAweGQxLCBMJysnfSwKKyAgICB7IEJPWERSQVdfRE9XTl9ET1VCTEVfSE9SSVpPTlRBTCwgICAgIDB4ZDIsIEwnKyd9LAorICAgIHsgQk9YRFJBV19ET1VCTEVfRE9XTl9IT1JJWk9OVEFMLCAgICAgMHhjYiwgTCcrJ30sCisgICAgeyBCT1hEUkFXX1VQX0hPUklaT05UQUxfRE9VQkxFLCAgICAgICAweGNmLCBMJysnfSwKKyAgICB7IEJPWERSQVdfVVBfRE9VQkxFX0hPUklaT05UQUwsICAgICAgIDB4ZDAsIEwnKyd9LAorICAgIHsgQk9YRFJBV19ET1VCTEVfVVBfSE9SSVpPTlRBTCwgICAgICAgMHhjYSwgTCcrJ30sCisgICAgeyBCT1hEUkFXX1ZFUlRJQ0FMX0hPUklaT05UQUxfRE9VQkxFLCAweGQ4LCBMJysnfSwKKyAgICB7IEJPWERSQVdfVkVSVElDQUxfRE9VQkxFX0hPUklaT05UQUwsIDB4ZDcsIEwnKyd9LAorICAgIHsgQk9YRFJBV19ET1VCTEVfVkVSVElDQUxfSE9SSVpPTlRBTCwgMHhjZSwgTCcrJ30sCisKKyAgICB7IEJMT0NLRUxFTUVOVF9GVUxMX0JMT0NLLCAgICAgICAgICAgIDB4ZGIsIEwnKid9LAorICAgIHsgQkxPQ0tFTEVNRU5UX0xJR0hUX1NIQURFLCAgICAgICAgICAgMHhiMCwgTCcrJ30sCisKKyAgICB7IEdFT01FVFJJQ1NIQVBFX1VQX1RSSUFOR0xFLCAgICAgICAgIDB4MWUsIEwnXid9LAorICAgIHsgR0VPTUVUUklDU0hBUEVfUklHSFRfVFJJQU5HTEUsICAgICAgMHgxMCwgTCc+J30sCisgICAgeyBHRU9NRVRSSUNTSEFQRV9ET1dOX1RSSUFOR0xFLCAgICAgICAweDFmLCBMJ3YnfSwKKyAgICB7IEdFT01FVFJJQ1NIQVBFX0xFRlRfVFJJQU5HTEUsICAgICAgIDB4MTEsIEwnPCd9LAorCisgICAgLyogQnVnQnVnOiBMZWZ0IEFycm93IGlzIGFuIEVTQy4gV2UgY2FuIG5vdCBtYWtlIGl0IHByaW50CisgICAgICAgICAgICAgICAgb24gYSBQQ0FOU0kgdGVybWluYWwuIElmIHdlIGNhbiBtYWtlIGxlZnQgYXJyb3cgCisgICAgICAgICAgICAgICAgY29tZSBvdXQgb24gUEMgQU5TSSB3ZSBjYW4gYWRkIGl0IGJhY2suCisKKyAgICB7IEFSUk9XX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWIsIEwnPCd9LAorICAgICovCisKKyAgICB7IEFSUk9XX1VQLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgsIEwnXid9LAorICAgIAorICAgIC8qIEJ1Z0J1dDogVG9vayBvdXQgbGVmdCBhcnJvdyBzbyByaWdodCBoYXMgdG8gZ28gdG9vLgorICAgICAgIHsgQVJST1dfUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgMHgxYSwgTCc+J30sCisgICAgKi8gICAgICAKKyAgICB7IEFSUk9XX0RPV04sICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTksIEwndid9LAorICAgIAorICAgIHsgMHgwMDAwLCAweDAwLCBMJ1wwJyB9Cit9OworCisKK0JPT0xFQU4KK0xpYklzVmFsaWRUZXh0R3JhcGhpY3MgKAorICAgIElOICBDSEFSMTYgIEdyYXBoaWMsCisgICAgT1VUIENIQVI4ICAgKlBjQW5zaSwgICAgT1BUSU9OQUwKKyAgICBPVVQgQ0hBUjggICAqQXNjaWkgICAgICBPUFRJT05BTAorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIERldGVjdHMgaWYgYSBVbmljb2RlIGNoYXIgaXMgZm9yIEJveCBEcmF3aW5nIHRleHQgZ3JhcGhpY3MuCisKK0FyZ3VtZW50czoKKworICAgIEdycGhpYyAgLSBVbmljb2RlIGNoYXIgdG8gdGVzdC4KKworICAgIFBjQW5zaSAgLSBPcHRpb25hbCBwb2ludGVyIHRvIHJldHVybiBQQ0FOU0kgZXF1aXZhbGVudCBvZiBHcmFwaGljLgorCisgICAgQXNjaSAgICAtIE9wdGlvbmFsIHBvaW50ZXIgdG8gcmV0dXJuIEFzY2lpIGVxdWl2YWxlbnQgb2YgR3JhcGhpYy4KKworUmV0dXJuczoKKworICAgIFRSVUUgaWYgR3BhcGhpYyBpcyBhIHN1cHBvcnRlZCBVbmljb2RlIEJveCBEcmF3aW5nIGNoYXJhY3Rlci4KKworLS0qL3sKKyAgICBVTklDT0RFX1RPX0NIQVIgICAgICpUYWJsZTsKKworICAgIGlmICgoKChHcmFwaGljICYgMHhmZjAwKSAhPSAweDI1MDApICYmICgoR3JhcGhpYyAmIDB4ZmYwMCkgIT0gMHgyMTAwKSkpIHsKKyAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIFVuaWNvZGUgZHJhd2luZyBjb2RlIGNoYXJ0cyBhcmUgYWxsIGluIHRoZSAweDI1eHggcmFuZ2UsIAorICAgICAgICAvLyAgYXJyb3dzIGFyZSAweDIxeHgKKyAgICAgICAgLy8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGZvciAoVGFibGUgPSBVbmljb2RlVG9QY0Fuc2lPckFzY2lpOyBUYWJsZS0+VW5pY29kZSAhPSAweDAwMDA7IFRhYmxlKyspIHsKKyAgICAgICAgaWYgKEdyYXBoaWMgPT0gVGFibGUtPlVuaWNvZGUpIHsKKyAgICAgICAgICAgIGlmIChQY0Fuc2kpIHsKKyAgICAgICAgICAgICAgICAqUGNBbnNpID0gVGFibGUtPlBjQW5zaTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQXNjaWkpIHsKKyAgICAgICAgICAgICAgICAqQXNjaWkgPSBUYWJsZS0+QXNjaWk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK0JPT0xFQU4KK0lzVmFsaWRBc2NpaSAoCisgICAgSU4gIENIQVIxNiAgQXNjaWkKKyAgICApCit7CisgICAgaWYgKChBc2NpaSA+PSAweDIwKSAmJiAoQXNjaWkgPD0gMHg3ZikpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSAgICAgICAgICAgICAgCisgICAgcmV0dXJuIEZBTFNFOworfQorCitCT09MRUFOCitJc1ZhbGlkRWZpQ250bENoYXIgKAorICAgIElOICBDSEFSMTYgIGMKKyAgICApCit7CisgICAgaWYgKGMgPT0gQ0hBUl9OVUxMIHx8IGMgPT0gQ0hBUl9CQUNLU1BBQ0UgfHwgYyA9PSBDSEFSX0xJTkVGRUVEIHx8IGMgPT0gQ0hBUl9DQVJSSUFHRV9SRVRVUk4pIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSAgICAgICAgICAgICAgCisgICAgcmV0dXJuIEZBTFNFOworfQorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9jb25zb2xlLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9jb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhNDdlZgotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2NvbnNvbGUuYwpAQCAtMCwwICsxLDEwNCBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgY29uc29sZS5jCisKK0Fic3RyYWN0OgorCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisKKworVk9JRAorT3V0cHV0ICgKKyAgICBJTiBDSEFSMTYgICAqU3RyCisgICAgKQorLy8gV3JpdGUgYSBzdHJpbmcgdG8gdGhlIGNvbnNvbGUgYXQgdGhlIGN1cnJlbnQgY3Vyc29yIGxvY2F0aW9uCit7CisgICAgdWVmaV9jYWxsX3dyYXBwZXIoU1QtPkNvbk91dC0+T3V0cHV0U3RyaW5nLCAyLCBTVC0+Q29uT3V0LCBTdHIpOworfQorCisKK1ZPSUQKK0lucHV0ICgKKyAgICBJTiBDSEFSMTYgICAgKlByb21wdCBPUFRJT05BTCwKKyAgICBPVVQgQ0hBUjE2ICAgKkluU3RyLAorICAgIElOIFVJTlROICAgICBTdHJMZW4KKyAgICApCisvLyBJbnB1dCBhIHN0cmluZyBhdCB0aGUgY3VycmVudCBjdXJzb3IgbG9jYXRpb24sIGZvciBTdHJMZW4KK3sKKyAgICBJSW5wdXQgKAorICAgICAgICBTVC0+Q29uT3V0LAorICAgICAgICBTVC0+Q29uSW4sCisgICAgICAgIFByb21wdCwKKyAgICAgICAgSW5TdHIsCisgICAgICAgIFN0ckxlbgorICAgICAgICApOworfQorCitWT0lECitJSW5wdXQgKAorICAgIElOIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpDb25PdXQsCisgICAgSU4gU0lNUExFX0lOUFVUX0lOVEVSRkFDRSAgICAgICAgICAgKkNvbkluLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICpQcm9tcHQgT1BUSU9OQUwsCisgICAgT1VUIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKkluU3RyLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ckxlbgorICAgICkKKy8vIElucHV0IGEgc3RyaW5nIGF0IHRoZSBjdXJyZW50IGN1cnNvciBsb2NhdGlvbiwgZm9yIFN0ckxlbgoreworICAgIEVGSV9JTlBVVF9LRVkgICAgICAgICAgICAgICAgICAgS2V5OworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzOworICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuOworCisgICAgaWYgKFByb21wdCkgeworICAgICAgICBDb25PdXQtPk91dHB1dFN0cmluZyAoQ29uT3V0LCBQcm9tcHQpOworICAgIH0KKworICAgIExlbiA9IDA7CisgICAgZm9yICg7IDspIHsKKyAgICAgICAgV2FpdEZvclNpbmdsZUV2ZW50IChDb25Jbi0+V2FpdEZvcktleSwgMCk7CisKKyAgICAgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoQ29uSW4tPlJlYWRLZXlTdHJva2UsIDIsIENvbkluLCAmS2V5KTsKKyAgICAgICAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgICAgICBERUJVRygoRF9FUlJPUiwgIklucHV0OiBlcnJvciByZXR1cm4gZnJvbSBSZWFkS2V5ICV4XG4iLCBTdGF0dXMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEtleS5Vbmljb2RlQ2hhciA9PSAnXG4nIHx8CisgICAgICAgICAgICBLZXkuVW5pY29kZUNoYXIgPT0gJ1xyJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChLZXkuVW5pY29kZUNoYXIgPT0gJ1xiJykgeworICAgICAgICAgICAgaWYgKExlbikgeworICAgICAgICAgICAgICAgIHVlZmlfY2FsbF93cmFwcGVyKENvbk91dC0+T3V0cHV0U3RyaW5nLCAyLCBDb25PdXQsIEwiXGIgXGIiKTsKKyAgICAgICAgICAgICAgICBMZW4gLT0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEtleS5Vbmljb2RlQ2hhciA+PSAnICcpIHsKKyAgICAgICAgICAgIGlmIChMZW4gPCBTdHJMZW4tMSkgeworICAgICAgICAgICAgICAgIEluU3RyW0xlbl0gPSBLZXkuVW5pY29kZUNoYXI7CisKKyAgICAgICAgICAgICAgICBJblN0cltMZW4rMV0gPSAwOworICAgICAgICAgICAgICAgIHVlZmlfY2FsbF93cmFwcGVyKENvbk91dC0+T3V0cHV0U3RyaW5nLCAyLCBDb25PdXQsICZJblN0cltMZW5dKTsKKworICAgICAgICAgICAgICAgIExlbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJblN0cltMZW5dID0gMDsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2NyYy5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2N2VkMQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2NyYy5jCkBAIC0wLDAgKzEsMjE4IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKyAgICAKK01vZHVsZSBOYW1lOgorCisgICAgY3JjLmMKKworQWJzdHJhY3Q6CisKKyAgICBDUkMzMiBmdW5jdGlvbnMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAibGliLmgiCisKKworVUlOVDMyIENSQ1RhYmxlWzI1Nl0gPSB7CisgICAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhFRTBFNjEyQywgMHg5OTA5NTFCQSwgMHgwNzZEQzQxOSwgMHg3MDZBRjQ4RiwKKyAgICAweEU5NjNBNTM1LCAweDlFNjQ5NUEzLCAweDBFREI4ODMyLCAweDc5RENCOEE0LCAweEUwRDVFOTFFLCAweDk3RDJEOTg4LAorICAgIDB4MDlCNjRDMkIsIDB4N0VCMTdDQkQsIDB4RTdCODJEMDcsIDB4OTBCRjFEOTEsIDB4MURCNzEwNjQsIDB4NkFCMDIwRjIsCisgICAgMHhGM0I5NzE0OCwgMHg4NEJFNDFERSwgMHgxQURBRDQ3RCwgMHg2RERERTRFQiwgMHhGNEQ0QjU1MSwgMHg4M0QzODVDNywKKyAgICAweDEzNkM5ODU2LCAweDY0NkJBOEMwLCAweEZENjJGOTdBLCAweDhBNjVDOUVDLCAweDE0MDE1QzRGLCAweDYzMDY2Q0Q5LAorICAgIDB4RkEwRjNENjMsIDB4OEQwODBERjUsIDB4M0I2RTIwQzgsIDB4NEM2OTEwNUUsIDB4RDU2MDQxRTQsIDB4QTI2NzcxNzIsCisgICAgMHgzQzAzRTREMSwgMHg0QjA0RDQ0NywgMHhEMjBEODVGRCwgMHhBNTBBQjU2QiwgMHgzNUI1QThGQSwgMHg0MkIyOTg2QywKKyAgICAweERCQkJDOUQ2LCAweEFDQkNGOTQwLCAweDMyRDg2Q0UzLCAweDQ1REY1Qzc1LCAweERDRDYwRENGLCAweEFCRDEzRDU5LAorICAgIDB4MjZEOTMwQUMsIDB4NTFERTAwM0EsIDB4QzhENzUxODAsIDB4QkZEMDYxMTYsIDB4MjFCNEY0QjUsIDB4NTZCM0M0MjMsCisgICAgMHhDRkJBOTU5OSwgMHhCOEJEQTUwRiwgMHgyODAyQjg5RSwgMHg1RjA1ODgwOCwgMHhDNjBDRDlCMiwgMHhCMTBCRTkyNCwKKyAgICAweDJGNkY3Qzg3LCAweDU4Njg0QzExLCAweEMxNjExREFCLCAweEI2NjYyRDNELCAweDc2REM0MTkwLCAweDAxREI3MTA2LAorICAgIDB4OThEMjIwQkMsIDB4RUZENTEwMkEsIDB4NzFCMTg1ODksIDB4MDZCNkI1MUYsIDB4OUZCRkU0QTUsIDB4RThCOEQ0MzMsCisgICAgMHg3ODA3QzlBMiwgMHgwRjAwRjkzNCwgMHg5NjA5QTg4RSwgMHhFMTBFOTgxOCwgMHg3RjZBMERCQiwgMHgwODZEM0QyRCwKKyAgICAweDkxNjQ2Qzk3LCAweEU2NjM1QzAxLCAweDZCNkI1MUY0LCAweDFDNkM2MTYyLCAweDg1NjUzMEQ4LCAweEYyNjIwMDRFLAorICAgIDB4NkMwNjk1RUQsIDB4MUIwMUE1N0IsIDB4ODIwOEY0QzEsIDB4RjUwRkM0NTcsIDB4NjVCMEQ5QzYsIDB4MTJCN0U5NTAsCisgICAgMHg4QkJFQjhFQSwgMHhGQ0I5ODg3QywgMHg2MkREMURERiwgMHgxNURBMkQ0OSwgMHg4Q0QzN0NGMywgMHhGQkQ0NEM2NSwKKyAgICAweDREQjI2MTU4LCAweDNBQjU1MUNFLCAweEEzQkMwMDc0LCAweEQ0QkIzMEUyLCAweDRBREZBNTQxLCAweDNERDg5NUQ3LAorICAgIDB4QTREMUM0NkQsIDB4RDNENkY0RkIsIDB4NDM2OUU5NkEsIDB4MzQ2RUQ5RkMsIDB4QUQ2Nzg4NDYsIDB4REE2MEI4RDAsCisgICAgMHg0NDA0MkQ3MywgMHgzMzAzMURFNSwgMHhBQTBBNEM1RiwgMHhERDBEN0NDOSwgMHg1MDA1NzEzQywgMHgyNzAyNDFBQSwKKyAgICAweEJFMEIxMDEwLCAweEM5MEMyMDg2LCAweDU3NjhCNTI1LCAweDIwNkY4NUIzLCAweEI5NjZENDA5LCAweENFNjFFNDlGLAorICAgIDB4NUVERUY5MEUsIDB4MjlEOUM5OTgsIDB4QjBEMDk4MjIsIDB4QzdEN0E4QjQsIDB4NTlCMzNEMTcsIDB4MkVCNDBEODEsCisgICAgMHhCN0JENUMzQiwgMHhDMEJBNkNBRCwgMHhFREI4ODMyMCwgMHg5QUJGQjNCNiwgMHgwM0I2RTIwQywgMHg3NEIxRDI5QSwKKyAgICAweEVBRDU0NzM5LCAweDlERDI3N0FGLCAweDA0REIyNjE1LCAweDczREMxNjgzLCAweEUzNjMwQjEyLCAweDk0NjQzQjg0LAorICAgIDB4MEQ2RDZBM0UsIDB4N0E2QTVBQTgsIDB4RTQwRUNGMEIsIDB4OTMwOUZGOUQsIDB4MEEwMEFFMjcsIDB4N0QwNzlFQjEsCisgICAgMHhGMDBGOTM0NCwgMHg4NzA4QTNEMiwgMHgxRTAxRjI2OCwgMHg2OTA2QzJGRSwgMHhGNzYyNTc1RCwgMHg4MDY1NjdDQiwKKyAgICAweDE5NkMzNjcxLCAweDZFNkIwNkU3LCAweEZFRDQxQjc2LCAweDg5RDMyQkUwLCAweDEwREE3QTVBLCAweDY3REQ0QUNDLAorICAgIDB4RjlCOURGNkYsIDB4OEVCRUVGRjksIDB4MTdCN0JFNDMsIDB4NjBCMDhFRDUsIDB4RDZENkEzRTgsIDB4QTFEMTkzN0UsCisgICAgMHgzOEQ4QzJDNCwgMHg0RkRGRjI1MiwgMHhEMUJCNjdGMSwgMHhBNkJDNTc2NywgMHgzRkI1MDZERCwgMHg0OEIyMzY0QiwKKyAgICAweEQ4MEQyQkRBLCAweEFGMEExQjRDLCAweDM2MDM0QUY2LCAweDQxMDQ3QTYwLCAweERGNjBFRkMzLCAweEE4NjdERjU1LAorICAgIDB4MzE2RThFRUYsIDB4NDY2OUJFNzksIDB4Q0I2MUIzOEMsIDB4QkM2NjgzMUEsIDB4MjU2RkQyQTAsIDB4NTI2OEUyMzYsCisgICAgMHhDQzBDNzc5NSwgMHhCQjBCNDcwMywgMHgyMjAyMTZCOSwgMHg1NTA1MjYyRiwgMHhDNUJBM0JCRSwgMHhCMkJEMEIyOCwKKyAgICAweDJCQjQ1QTkyLCAweDVDQjM2QTA0LCAweEMyRDdGRkE3LCAweEI1RDBDRjMxLCAweDJDRDk5RThCLCAweDVCREVBRTFELAorICAgIDB4OUI2NEMyQjAsIDB4RUM2M0YyMjYsIDB4NzU2QUEzOUMsIDB4MDI2RDkzMEEsIDB4OUMwOTA2QTksIDB4RUIwRTM2M0YsCisgICAgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywgMHg5NUJGNEE4MiwgMHhFMkI4N0ExNCwgMHg3QkIxMkJBRSwgMHgwQ0I2MUIzOCwKKyAgICAweDkyRDI4RTlCLCAweEU1RDVCRTBELCAweDdDRENFRkI3LCAweDBCREJERjIxLCAweDg2RDNEMkQ0LCAweEYxRDRFMjQyLAorICAgIDB4NjhEREIzRjgsIDB4MUZEQTgzNkUsIDB4ODFCRTE2Q0QsIDB4RjZCOTI2NUIsIDB4NkZCMDc3RTEsIDB4MThCNzQ3NzcsCisgICAgMHg4ODA4NUFFNiwgMHhGRjBGNkE3MCwgMHg2NjA2M0JDQSwgMHgxMTAxMEI1QywgMHg4RjY1OUVGRiwgMHhGODYyQUU2OSwKKyAgICAweDYxNkJGRkQzLCAweDE2NkNDRjQ1LCAweEEwMEFFMjc4LCAweEQ3MEREMkVFLCAweDRFMDQ4MzU0LCAweDM5MDNCM0MyLAorICAgIDB4QTc2NzI2NjEsIDB4RDA2MDE2RjcsIDB4NDk2OTQ3NEQsIDB4M0U2RTc3REIsIDB4QUVEMTZBNEEsIDB4RDlENjVBREMsCisgICAgMHg0MERGMEI2NiwgMHgzN0Q4M0JGMCwgMHhBOUJDQUU1MywgMHhERUJCOUVDNSwgMHg0N0IyQ0Y3RiwgMHgzMEI1RkZFOSwKKyAgICAweEJEQkRGMjFDLCAweENBQkFDMjhBLCAweDUzQjM5MzMwLCAweDI0QjRBM0E2LCAweEJBRDAzNjA1LCAweENERDcwNjkzLAorICAgIDB4NTRERTU3MjksIDB4MjNEOTY3QkYsIDB4QjM2NjdBMkUsIDB4QzQ2MTRBQjgsIDB4NUQ2ODFCMDIsIDB4MkE2RjJCOTQsCisgICAgMHhCNDBCQkUzNywgMHhDMzBDOEVBMSwgMHg1QTA1REYxQiwgMHgyRDAyRUY4RCAKKyAgICB9OworICAgIAorCisKK1ZPSUQKK1NldENyYyAoCisgICAgSU4gT1VUIEVGSV9UQUJMRV9IRUFERVIgKkhkcgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIFVwZGF0ZXMgdGhlIENSQzMyIHZhbHVlIGluIHRoZSB0YWJsZSBoZWFkZXIKKworQXJndW1lbnRzOgorCisgICAgSGRyICAgICAtIFRoZSB0YWJsZSB0byB1cGRhdGUKKworUmV0dXJuczoKKworICAgIE5vbmUKKworLS0qLworeworICAgIFNldENyY0FsdFNpemUgKEhkci0+SGVhZGVyU2l6ZSwgSGRyKTsKK30KKworVk9JRAorU2V0Q3JjQWx0U2l6ZSAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgIFNpemUsCisgICAgSU4gT1VUIEVGSV9UQUJMRV9IRUFERVIgKkhkcgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIFVwZGF0ZXMgdGhlIENSQzMyIHZhbHVlIGluIHRoZSB0YWJsZSBoZWFkZXIKKworQXJndW1lbnRzOgorCisgICAgSGRyICAgICAtIFRoZSB0YWJsZSB0byB1cGRhdGUKKworUmV0dXJuczoKKworICAgIE5vbmUKKworLS0qLworeworICAgIEhkci0+Q1JDMzIgPSAwOworICAgIEhkci0+Q1JDMzIgPSBDYWxjdWxhdGVDcmMoKFVJTlQ4ICopSGRyLCBTaXplKTsKK30KKworCitCT09MRUFOCitDaGVja0NyYyAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgIE1heFNpemUsCisgICAgSU4gT1VUIEVGSV9UQUJMRV9IRUFERVIgKkhkcgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIENoZWNrcyB0aGUgQ1JDMzIgdmFsdWUgaW4gdGhlIHRhYmxlIGhlYWRlcgorCitBcmd1bWVudHM6CisKKyAgICBIZHIgICAgIC0gVGhlIHRhYmxlIHRvIGNoZWNrCisKK1JldHVybnM6CisKKyAgICBUUlVFIGlmIHRoZSBDUkMgaXMgT0sgaW4gdGhlIHRhYmxlCisKKy0tKi8KK3sKKyAgICByZXR1cm4gQ2hlY2tDcmNBbHRTaXplIChNYXhTaXplLCBIZHItPkhlYWRlclNpemUsIEhkcik7Cit9CisKKworCisKK0JPT0xFQU4KK0NoZWNrQ3JjQWx0U2l6ZSAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgIE1heFNpemUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgIFNpemUsCisgICAgSU4gT1VUIEVGSV9UQUJMRV9IRUFERVIgKkhkcgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIENoZWNrcyB0aGUgQ1JDMzIgdmFsdWUgaW4gdGhlIHRhYmxlIGhlYWRlcgorCitBcmd1bWVudHM6CisKKyAgICBIZHIgICAgIC0gVGhlIHRhYmxlIHRvIGNoZWNrCisKK1JldHVybnM6CisKKyAgICBUUlVFIGlmIHRoZSBDUkMgaXMgT0sgaW4gdGhlIHRhYmxlCisKKy0tKi8KK3sKKyAgICBVSU5UMzIgICAgICBDcmM7CisgICAgVUlOVDMyICAgICAgT3JnQ3JjOworICAgIEJPT0xFQU4gICAgIGY7CisKKyAgICBpZiAoU2l6ZSA9PSAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIElmIGhlYWRlciBzaXplIGlzIDAgQ1JDIHdpbGwgcGFzcyBzbyByZXR1cm4gRkFMU0UgaGVyZQorICAgICAgICAvLworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChNYXhTaXplICYmIFNpemUgPiBNYXhTaXplKSB7CisgICAgICAgIERFQlVHKChEX0VSUk9SLCAiQ2hlY2tDcmMzMjogU2l6ZSA+IE1heFNpemVcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIGNsZWFyIG9sZCBjcmMgZnJvbSBoZWFkZXIKKyAgICBPcmdDcmMgPSBIZHItPkNSQzMyOworICAgIEhkci0+Q1JDMzIgPSAwOworICAgIENyYyA9IENhbGN1bGF0ZUNyYygoVUlOVDggKilIZHIsIFNpemUpOworCisgICAgLy8gc2V0IHJlc3R1bHRzCisgICAgSGRyLT5DUkMzMiA9IE9yZ0NyYzsKKworICAgIC8vIHJldHVybiBzdGF0dXMKKyAgICBmID0gT3JnQ3JjID09IChVSU5UMzIpIENyYzsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgREVCVUcoKERfRVJST1IsICJDaGVja0NyYzMyOiBDcmMgY2hlY2sgZmFpbGVkXG4iKSk7CisgICAgfQorCisgICAgcmV0dXJuIGY7Cit9CisKKworVUlOVDMyCitDYWxjdWxhdGVDcmMgKAorICAgIFVJTlQ4ICpwdCwKKyAgICBVSU5UTiBTaXplCisgICAgKQoreworICAgIFVJTlROIENyYzsKKworICAgIC8vIGNvbXB1dGUgY3JjCisgICAgQ3JjID0gMHhmZmZmZmZmZjsKKyAgICB3aGlsZSAoU2l6ZSkgeworICAgICAgICBDcmMgPSAoQ3JjID4+IDgpIF4gQ1JDVGFibGVbKFVJTlQ4KSBDcmMgXiAqcHRdOworICAgICAgICBwdCArPSAxOworICAgICAgICBTaXplIC09IDE7CisgICAgfQorICAgIENyYyA9IENyYyBeIDB4ZmZmZmZmZmY7CisgICAgcmV0dXJuIChVSU5UMzIpQ3JjOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvZGF0YS5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTZkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9kYXRhLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGRhdGEuYworCitBYnN0cmFjdDoKKworICAgIEVGSSBsaWJyYXJ5IGdsb2JhbCBkYXRhCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisvLworLy8gTGliSW5pdGlhbGl6ZWQgLSBUUlVFIG9uY2UgSW5pdGlhbGl6ZUxpYigpIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUKKy8vCisKK0JPT0xFQU4gIExpYkluaXRpYWxpemVkID0gRkFMU0U7CisKKy8vCisvLyBTVCAtIHBvaW50ZXIgdG8gdGhlIEVGSSBzeXN0ZW0gdGFibGUKKy8vCisKK0VGSV9TWVNURU1fVEFCTEUgICAgICAgICpTVDsKKworLy8KKy8vIEJTIC0gcG9pbnRlciB0byB0aGUgYm9vdCBzZXJ2aWNlcyB0YWJsZQorLy8KKworRUZJX0JPT1RfU0VSVklDRVMgICAgICAgKkJTOworCisKKy8vCisvLyBEZWZhdWx0IHBvb2wgYWxsb2NhdGlvbiB0eXBlCisvLworCitFRklfTUVNT1JZX1RZUEUgUG9vbEFsbG9jYXRpb25UeXBlID0gRWZpQm9vdFNlcnZpY2VzRGF0YTsKKworLy8KKy8vIFVuaWNvZGUgY29sbGF0aW9uIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbiB1c2UKKy8vCisKK0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgICBMaWJTdHViVW5pY29kZUludGVyZmFjZSA9IHsKKyAgICBMaWJTdHViU3RyaUNtcCwKKyAgICBMaWJTdHViTWV0YWlNYXRjaCwKKyAgICBMaWJTdHViU3RyTHdyVXByLAorICAgIExpYlN0dWJTdHJMd3JVcHIsCisgICAgTlVMTCwgICAvLyBGYXRUb1N0cgorICAgIE5VTEwsICAgLy8gU3RyVG9GYXQKKyAgICBOVUxMICAgIC8vIFN1cHBvcnRlZExhbmd1YWdlcworfTsgCisKK0VGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgICAqVW5pY29kZUludGVyZmFjZSA9ICZMaWJTdHViVW5pY29kZUludGVyZmFjZTsKKworLy8KKy8vIFJvb3QgZGV2aWNlIHBhdGgKKy8vCisKK0VGSV9ERVZJQ0VfUEFUSCBSb290RGV2aWNlUGF0aFtdID0geworICAge0VORF9ERVZJQ0VfUEFUSF9UWVBFLCBFTkRfRU5USVJFX0RFVklDRV9QQVRIX1NVQlRZUEUsIHtFTkRfREVWSUNFX1BBVEhfTEVOR1RILDB9fQorfTsKKworRUZJX0RFVklDRV9QQVRIIEVuZERldmljZVBhdGhbXSA9IHsKKyAgIHtFTkRfREVWSUNFX1BBVEhfVFlQRSwgRU5EX0VOVElSRV9ERVZJQ0VfUEFUSF9TVUJUWVBFLCB7RU5EX0RFVklDRV9QQVRIX0xFTkdUSCwgMH19Cit9OworCitFRklfREVWSUNFX1BBVEggRW5kSW5zdGFuY2VEZXZpY2VQYXRoW10gPSB7CisgICB7RU5EX0RFVklDRV9QQVRIX1RZUEUsIEVORF9JTlNUQU5DRV9ERVZJQ0VfUEFUSF9TVUJUWVBFLCB7RU5EX0RFVklDRV9QQVRIX0xFTkdUSCwgMH19Cit9OworCisKKy8vCisvLyBFRkkgSURzCisvLworCitFRklfR1VJRCBFZmlHbG9iYWxWYXJpYWJsZSAgPSBFRklfR0xPQkFMX1ZBUklBQkxFOworRUZJX0dVSUQgTnVsbEd1aWQgPSB7IDAsMCwwLHswLDAsMCwwLDAsMCwwLDB9IH07CisKKy8vCisvLyBQcm90b2NvbCBJRHMKKy8vCisKK0VGSV9HVUlEIERldmljZVBhdGhQcm90b2NvbCAgICAgICA9IERFVklDRV9QQVRIX1BST1RPQ09MOworRUZJX0dVSUQgTG9hZGVkSW1hZ2VQcm90b2NvbCAgICAgID0gTE9BREVEX0lNQUdFX1BST1RPQ09MOworRUZJX0dVSUQgVGV4dEluUHJvdG9jb2wgICAgICAgICAgID0gU0lNUExFX1RFWFRfSU5QVVRfUFJPVE9DT0w7CitFRklfR1VJRCBUZXh0T3V0UHJvdG9jb2wgICAgICAgICAgPSBTSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0w7CitFRklfR1VJRCBCbG9ja0lvUHJvdG9jb2wgICAgICAgICAgPSBCTE9DS19JT19QUk9UT0NPTDsKK0VGSV9HVUlEIERpc2tJb1Byb3RvY29sICAgICAgICAgICA9IERJU0tfSU9fUFJPVE9DT0w7CitFRklfR1VJRCBGaWxlU3lzdGVtUHJvdG9jb2wgICAgICAgPSBTSU1QTEVfRklMRV9TWVNURU1fUFJPVE9DT0w7CitFRklfR1VJRCBMb2FkRmlsZVByb3RvY29sICAgICAgICAgPSBMT0FEX0ZJTEVfUFJPVE9DT0w7CitFRklfR1VJRCBEZXZpY2VJb1Byb3RvY29sICAgICAgICAgPSBERVZJQ0VfSU9fUFJPVE9DT0w7CitFRklfR1VJRCBVbmljb2RlQ29sbGF0aW9uUHJvdG9jb2wgPSBVTklDT0RFX0NPTExBVElPTl9QUk9UT0NPTDsKK0VGSV9HVUlEIFNlcmlhbElvUHJvdG9jb2wgICAgICAgICA9IFNFUklBTF9JT19QUk9UT0NPTDsKK0VGSV9HVUlEIFNpbXBsZU5ldHdvcmtQcm90b2NvbCAgICA9IEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTDsKK0VGSV9HVUlEIFB4ZUJhc2VDb2RlUHJvdG9jb2wgICAgICA9IEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MOworRUZJX0dVSUQgUHhlQ2FsbGJhY2tQcm90b2NvbCAgICAgID0gRUZJX1BYRV9CQVNFX0NPREVfQ0FMTEJBQ0tfUFJPVE9DT0w7CitFRklfR1VJRCBOZXR3b3JrSW50ZXJmYWNlSWRlbnRpZmllclByb3RvY29sID0gRUZJX05FVFdPUktfSU5URVJGQUNFX0lERU5USUZJRVJfUFJPVE9DT0w7CitFRklfR1VJRCBVaVByb3RvY29sICAgICAgICAgICAgICAgPSBFRklfVUlfUFJPVE9DT0w7CitFRklfR1VJRCBQY2lJb1Byb3RvY29sICAgICAgICAgICAgPSBFRklfUENJX0lPX1BST1RPQ09MOworLy8KKy8vIEZpbGUgc3lzdGVtIGluZm9ybWF0aW9uIElEcworLy8KKworRUZJX0dVSUQgR2VuZXJpY0ZpbGVJbmZvICAgICAgICAgICA9IEVGSV9GSUxFX0lORk9fSUQ7CitFRklfR1VJRCBGaWxlU3lzdGVtSW5mbyAgICAgICAgICAgID0gRUZJX0ZJTEVfU1lTVEVNX0lORk9fSUQ7CitFRklfR1VJRCBGaWxlU3lzdGVtVm9sdW1lTGFiZWxJbmZvID0gRUZJX0ZJTEVfU1lTVEVNX1ZPTFVNRV9MQUJFTF9JTkZPX0lEOworCisvLworLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHB1YmxpYyBwcm90b2NvbCBJRHMKKy8vCisKK0VGSV9HVUlEIEludGVybmFsU2hlbGxQcm90b2NvbCA9IElOVEVSTkFMX1NIRUxMX0dVSUQ7CitFRklfR1VJRCBWYXJpYWJsZVN0b3JlUHJvdG9jb2wgPSBWQVJJQUJMRV9TVE9SRV9QUk9UT0NPTDsKK0VGSV9HVUlEIExlZ2FjeUJvb3RQcm90b2NvbCA9IExFR0FDWV9CT09UX1BST1RPQ09MOworRUZJX0dVSUQgVmdhQ2xhc3NQcm90b2NvbCA9IFZHQV9DTEFTU19EUklWRVJfUFJPVE9DT0w7CisKK0VGSV9HVUlEIFRleHRPdXRTcGxpdGVyUHJvdG9jb2wgPSBURVhUX09VVF9TUExJVEVSX1BST1RPQ09MOworRUZJX0dVSUQgRXJyb3JPdXRTcGxpdGVyUHJvdG9jb2wgPSBFUlJPUl9PVVRfU1BMSVRFUl9QUk9UT0NPTDsKK0VGSV9HVUlEIFRleHRJblNwbGl0ZXJQcm90b2NvbCA9IFRFWFRfSU5fU1BMSVRFUl9QUk9UT0NPTDsKKy8qIEFkZGVkIGZvciBHT1Agc3VwcG9ydCAqLworRUZJX0dVSUQgR3JhcGhpY3NPdXRwdXRQcm90b2NvbCA9IEVGSV9HUkFQSElDU19PVVRQVVRfUFJPVE9DT0xfR1VJRDsKKworRUZJX0dVSUQgQWRhcHRlckRlYnVnUHJvdG9jb2wgPSBBREFQVEVSX0RFQlVHX1BST1RPQ09MOworCisvLworLy8gRGV2aWNlIHBhdGggbWVkaWEgcHJvdG9jb2wgSURzCisvLworRUZJX0dVSUQgUGNBbnNpUHJvdG9jb2wgPSBERVZJQ0VfUEFUSF9NRVNTQUdJTkdfUENfQU5TSTsKK0VGSV9HVUlEIFZ0MTAwUHJvdG9jb2wgID0gREVWSUNFX1BBVEhfTUVTU0FHSU5HX1ZUXzEwMDsKKworLy8KKy8vIEVGSSBHUFQgUGFydGl0aW9uIFR5cGUgR1VJRHMKKy8vCitFRklfR1VJRCBFZmlQYXJ0VHlwZVN5c3RlbVBhcnRpdGlvbkd1aWQgPSBFRklfUEFSVF9UWVBFX0VGSV9TWVNURU1fUEFSVF9HVUlEOworRUZJX0dVSUQgRWZpUGFydFR5cGVMZWdhY3lNYnJHdWlkID0gRUZJX1BBUlRfVFlQRV9MRUdBQ1lfTUJSX0dVSUQ7CisKKworLy8KKy8vIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBWZW5kb3IgRGV2aWNlIFBhdGggR3VpZHMKKy8vCitFRklfR1VJRCBVbmtub3duRGV2aWNlICAgICAgPSBVTktOT1dOX0RFVklDRV9HVUlEOworCisvLworLy8gQ29uZmlndXJhdGlvbiBUYWJsZSBHVUlEcworLy8KKworRUZJX0dVSUQgTXBzVGFibGVHdWlkICAgICAgICAgICAgID0gTVBTX1RBQkxFX0dVSUQ7CitFRklfR1VJRCBBY3BpVGFibGVHdWlkICAgICAgICAgICAgPSBBQ1BJX1RBQkxFX0dVSUQ7CitFRklfR1VJRCBTTUJJT1NUYWJsZUd1aWQgICAgICAgICAgPSBTTUJJT1NfVEFCTEVfR1VJRDsKK0VGSV9HVUlEIFNhbFN5c3RlbVRhYmxlR3VpZCAgICAgICA9IFNBTF9TWVNURU1fVEFCTEVfR1VJRDsKKworLy8KKy8vIE5ldHdvcmsgcHJvdG9jb2wgR1VJRHMKKy8vCitFRklfR1VJRCBJcDRTZXJ2aWNlQmluZGluZ1Byb3RvY29sID0gRUZJX0lQNF9TRVJWSUNFX0JJTkRJTkdfUFJPVE9DT0w7CitFRklfR1VJRCBJcDRQcm90b2NvbCA9IEVGSV9JUDRfUFJPVE9DT0w7CitFRklfR1VJRCBVZHA0U2VydmljZUJpbmRpbmdQcm90b2NvbCA9IEVGSV9VRFA0X1NFUlZJQ0VfQklORElOR19QUk9UT0NPTDsKK0VGSV9HVUlEIFVkcDRQcm90b2NvbCA9IEVGSV9VRFA0X1BST1RPQ09MOworRUZJX0dVSUQgVGNwNFNlcnZpY2VCaW5kaW5nUHJvdG9jb2wgPSBFRklfVENQNF9TRVJWSUNFX0JJTkRJTkdfUFJPVE9DT0w7CitFRklfR1VJRCBUY3A0UHJvdG9jb2wgPSBFRklfVENQNF9QUk9UT0NPTDsKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2RlYnVnLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMWU4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9kZWJ1Zy5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGRlYnVnLmMKKworQWJzdHJhY3Q6CisKKyAgICBEZWJ1ZyBsaWJyYXJ5IGZ1bmN0aW9ucworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpbmNsdWRlICJsaWIuaCIKKworCisKKy8vCisvLyBEZWNsYXJlIHJ1bnRpbWUgZnVuY3Rpb25zCisvLworCisvLworLy8KKy8vCisKK0lOVE4KK0RiZ0Fzc2VydCAoCisgICAgSU4gQ0hBUjggICAgKkZpbGVOYW1lLAorICAgIElOIElOVE4gICAgIExpbmVObywKKyAgICBJTiBDSEFSOCAgICAqRGVzY3JpcHRpb24KKyAgICApCit7CisgICAgRGJnUHJpbnQgKERfRVJST1IsIChDSEFSOCAqKSIlRUFTU0VSVCBGQUlMRUQ6ICVhKCVkKTogJWElTlxuIiwgRmlsZU5hbWUsIExpbmVObywgRGVzY3JpcHRpb24pOworCisgICAgQlJFQUtQT0lOVCgpOworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9kcGF0aC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvZHBhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWMxYjIwCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvZHBhdGguYwpAQCAtMCwwICsxLDEwMzUgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGRwYXRoLmMKKworQWJzdHJhY3Q6CisgICAgTUJSICYgRGV2aWNlIFBhdGggZnVuY3Rpb25zCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisjZGVmaW5lIEFMSUdOX1NJWkUoYSkgICAoKGEgJSBNSU5fQUxJR05NRU5UX1NJWkUpID8gTUlOX0FMSUdOTUVOVF9TSVpFIC0gKGEgJSBNSU5fQUxJR05NRU5UX1NJWkUpIDogMCkKKworCisKK0VGSV9ERVZJQ0VfUEFUSCAqCitEZXZpY2VQYXRoRnJvbUhhbmRsZSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICBIYW5kbGUKKyAgICApCit7CisgICAgRUZJX1NUQVRVUyAgICAgICAgICBTdGF0dXM7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAqRGV2aWNlUGF0aDsKKworICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5IYW5kbGVQcm90b2NvbCwgMywgSGFuZGxlLCAmRGV2aWNlUGF0aFByb3RvY29sLCAoVk9JRCopJkRldmljZVBhdGgpOworICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICBEZXZpY2VQYXRoID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gRGV2aWNlUGF0aDsKK30KKworCitFRklfREVWSUNFX1BBVEggKgorRGV2aWNlUGF0aEluc3RhbmNlICgKKyAgICBJTiBPVVQgRUZJX0RFVklDRV9QQVRIICAqKkRldmljZVBhdGgsCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgKlNpemUKKyAgICApCit7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgKlN0YXJ0LCAqTmV4dCwgKkRldlBhdGg7CisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgQ291bnQ7CisKKyAgICBEZXZQYXRoID0gKkRldmljZVBhdGg7CisgICAgU3RhcnQgPSBEZXZQYXRoOworCisgICAgaWYgKCFEZXZQYXRoKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBkZXZpY2UgcGF0aCB0eXBlCisgICAgLy8gICAgCisKKyAgICBmb3IgKENvdW50ID0gMDsgOyBDb3VudCsrKSB7CisgICAgICAgIE5leHQgPSBOZXh0RGV2aWNlUGF0aE5vZGUoRGV2UGF0aCk7CisKKyAgICAgICAgaWYgKElzRGV2aWNlUGF0aEVuZFR5cGUoRGV2UGF0aCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENvdW50ID4gMDEwMDApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBCdWdCdWc6IERlYnVnIGNvZGUgdG8gY2F0Y2ggYm9ndXMgZGV2aWNlIHBhdGhzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgREVCVUcoKERfRVJST1IsICJEZXZpY2VQYXRoSW5zdGFuY2U6IERldmljZVBhdGggJXggU2l6ZSAlZCIsICpEZXZpY2VQYXRoLCAoKFVJTlQ4ICopIERldlBhdGgpIC0gKChVSU5UOCAqKSBTdGFydCkgKSk7CisgICAgICAgICAgICBEdW1wSGV4ICgwLCAwLCAoKFVJTlQ4ICopIERldlBhdGgpIC0gKChVSU5UOCAqKSBTdGFydCksIFN0YXJ0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgRGV2UGF0aCA9IE5leHQ7CisgICAgfQorCisgICAgQVNTRVJUIChEZXZpY2VQYXRoU3ViVHlwZShEZXZQYXRoKSA9PSBFTkRfRU5USVJFX0RFVklDRV9QQVRIX1NVQlRZUEUgfHwKKyAgICAgICAgICAgIERldmljZVBhdGhTdWJUeXBlKERldlBhdGgpID09IEVORF9JTlNUQU5DRV9ERVZJQ0VfUEFUSF9TVUJUWVBFKTsKKworICAgIC8vCisgICAgLy8gU2V0IG5leHQgcG9zaXRpb24KKyAgICAvLworCisgICAgaWYgKERldmljZVBhdGhTdWJUeXBlKERldlBhdGgpID09IEVORF9FTlRJUkVfREVWSUNFX1BBVEhfU1VCVFlQRSkgeworICAgICAgICBOZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICAqRGV2aWNlUGF0aCA9IE5leHQ7CisKKyAgICAvLworICAgIC8vIFJldHVybiBzaXplIGFuZCBzdGFydCBvZiBkZXZpY2UgcGF0aCBpbnN0YW5jZQorICAgIC8vCisKKyAgICAqU2l6ZSA9ICgoVUlOVDggKikgRGV2UGF0aCkgLSAoKFVJTlQ4ICopIFN0YXJ0KTsKKyAgICByZXR1cm4gU3RhcnQ7Cit9CisKK1VJTlROCitEZXZpY2VQYXRoSW5zdGFuY2VDb3VudCAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKkRldmljZVBhdGgKKyAgICApCit7CisgICAgVUlOVE4gICAgICAgQ291bnQsIFNpemU7CisKKyAgICBDb3VudCA9IDA7CisgICAgd2hpbGUgKERldmljZVBhdGhJbnN0YW5jZSgmRGV2aWNlUGF0aCwgJlNpemUpKSB7CisgICAgICAgIENvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIENvdW50OworfQorCisKK0VGSV9ERVZJQ0VfUEFUSCAqCitBcHBlbmREZXZpY2VQYXRoICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICpTcmMxLAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgKlNyYzIKKyAgICApCisvLyBTcmMxIG1heSBoYXZlIG11bHRpcGxlICJpbnN0YW5jZXMiIGFuZCBlYWNoIGluc3RhbmNlIGlzIGFwcGVuZGVkCisvLyBTcmMyIGlzIGFwcGVuZGVkIHRvIGVhY2ggaW5zdGFuY2UgaXMgU3JjMS4gIChFLmcuLCBpdCdzIHBvc3NpYmxlCisvLyB0byBhcHBlbmQgYSBuZXcgaW5zdGFuY2UgdG8gdGhlIGNvbXBsZXRlIGRldmljZSBwYXRoIGJ5IHBhc3NpbmcgCisvLyBpdCBpbiBTcmMyKQoreworICAgIFVJTlROICAgICAgICAgICAgICAgU3JjMVNpemUsIFNyYzFJbnN0LCBTcmMyU2l6ZSwgU2l6ZTsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICpEc3QsICpJbnN0OworICAgIFVJTlQ4ICAgICAgICAgICAgICAgKkRzdFBvczsKKworICAgIC8vCisgICAgLy8gSWYgdGhlcmUncyBvbmx5IDEgcGF0aCwganVzdCBkdXBsaWNhdGUgaXQKKyAgICAvLworCisgICAgaWYgKCFTcmMxKSB7CisgICAgICAgIEFTU0VSVCAoIUlzRGV2aWNlUGF0aFVucGFja2VkIChTcmMyKSk7CisgICAgICAgIHJldHVybiBEdXBsaWNhdGVEZXZpY2VQYXRoIChTcmMyKTsKKyAgICB9CisKKyAgICBpZiAoIVNyYzIpIHsKKyAgICAgICAgQVNTRVJUICghSXNEZXZpY2VQYXRoVW5wYWNrZWQgKFNyYzEpKTsKKyAgICAgICAgcmV0dXJuIER1cGxpY2F0ZURldmljZVBhdGggKFNyYzEpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVmVyaWZ5IHdlJ3JlIG5vdCB3b3JraW5nIHdpdGggdW5wYWNrZWQgcGF0aHMKKyAgICAvLworCisvLyAgICBBU1NFUlQgKCFJc0RldmljZVBhdGhVbnBhY2tlZCAoU3JjMSkpOworLy8gICAgQVNTRVJUICghSXNEZXZpY2VQYXRoVW5wYWNrZWQgKFNyYzIpKTsKKworICAgIC8vCisgICAgLy8gQXBwZW5kIFNyYzIgdG8gZXZlcnkgaW5zdGFuY2UgaW4gU3JjMQorICAgIC8vCisKKyAgICBTcmMxU2l6ZSA9IERldmljZVBhdGhTaXplKFNyYzEpOworICAgIFNyYzFJbnN0ID0gRGV2aWNlUGF0aEluc3RhbmNlQ291bnQoU3JjMSk7CisgICAgU3JjMlNpemUgPSBEZXZpY2VQYXRoU2l6ZShTcmMyKTsKKyAgICBTaXplID0gU3JjMVNpemUgKiBTcmMxSW5zdCArIFNyYzJTaXplOworICAgIAorICAgIERzdCA9IEFsbG9jYXRlUG9vbCAoU2l6ZSk7CisgICAgaWYgKERzdCkgeworICAgICAgICBEc3RQb3MgPSAoVUlOVDggKikgRHN0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIENvcHkgYWxsIGRldmljZSBwYXRoIGluc3RhbmNlcworICAgICAgICAvLworCisgICAgICAgIHdoaWxlICgoSW5zdCA9IERldmljZVBhdGhJbnN0YW5jZSAoJlNyYzEsICZTaXplKSkpIHsKKworICAgICAgICAgICAgQ29weU1lbShEc3RQb3MsIEluc3QsIFNpemUpOworICAgICAgICAgICAgRHN0UG9zICs9IFNpemU7CisKKyAgICAgICAgICAgIENvcHlNZW0oRHN0UG9zLCBTcmMyLCBTcmMyU2l6ZSk7CisgICAgICAgICAgICBEc3RQb3MgKz0gU3JjMlNpemU7CisKKyAgICAgICAgICAgIENvcHlNZW0oRHN0UG9zLCBFbmRJbnN0YW5jZURldmljZVBhdGgsIHNpemVvZihFRklfREVWSUNFX1BBVEgpKTsKKyAgICAgICAgICAgIERzdFBvcyArPSBzaXplb2YoRUZJX0RFVklDRV9QQVRIKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoYW5nZSBsYXN0IGVuZCBtYXJrZXIKKyAgICAgICAgRHN0UG9zIC09IHNpemVvZihFRklfREVWSUNFX1BBVEgpOworICAgICAgICBDb3B5TWVtKERzdFBvcywgRW5kRGV2aWNlUGF0aCwgc2l6ZW9mKEVGSV9ERVZJQ0VfUEFUSCkpOworICAgIH0KKworICAgIHJldHVybiBEc3Q7Cit9CisKKworRUZJX0RFVklDRV9QQVRIICoKK0FwcGVuZERldmljZVBhdGhOb2RlICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICpTcmMxLAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgKlNyYzIKKyAgICApCisvLyBTcmMxIG1heSBoYXZlIG11bHRpcGxlICJpbnN0YW5jZXMiIGFuZCBlYWNoIGluc3RhbmNlIGlzIGFwcGVuZGVkCisvLyBTcmMyIGlzIGEgc2lnbmFsIGRldmljZSBwYXRoIG5vZGUgKHdpdGhvdXQgYSB0ZXJtaW5hdG9yKSB0aGF0IGlzCisvLyBhcHBlbmRlZCB0byBlYWNoIGluc3RhbmNlIGlzIFNyYzEuCit7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAqVGVtcCwgKkVvcDsKKyAgICBVSU5UTiAgICAgICAgICAgICAgIExlbmd0aDsKKworICAgIC8vCisgICAgLy8gQnVpbGQgYSBTcmMyIHRoYXQgaGFzIGEgdGVybWluYXRvciBvbiBpdAorICAgIC8vCisKKyAgICBMZW5ndGggPSBEZXZpY2VQYXRoTm9kZUxlbmd0aChTcmMyKTsKKyAgICBUZW1wID0gQWxsb2NhdGVQb29sIChMZW5ndGggKyBzaXplb2YoRUZJX0RFVklDRV9QQVRIKSk7CisgICAgaWYgKCFUZW1wKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIENvcHlNZW0gKFRlbXAsIFNyYzIsIExlbmd0aCk7CisgICAgRW9wID0gTmV4dERldmljZVBhdGhOb2RlKFRlbXApOyAKKyAgICBTZXREZXZpY2VQYXRoRW5kTm9kZShFb3ApOworCisgICAgLy8KKyAgICAvLyBBcHBlbmQgZGV2aWNlIHBhdGhzCisgICAgLy8KKworICAgIFNyYzEgPSBBcHBlbmREZXZpY2VQYXRoIChTcmMxLCBUZW1wKTsKKyAgICBGcmVlUG9vbCAoVGVtcCk7CisgICAgcmV0dXJuIFNyYzE7Cit9CisKKworRUZJX0RFVklDRV9QQVRIICoKK0ZpbGVEZXZpY2VQYXRoICgKKyAgICBJTiBFRklfSEFORExFICAgICAgIERldmljZSAgT1BUSU9OQUwsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAqRmlsZU5hbWUKKyAgICApCisvKisrCisKKyAgICBOLkIuIFJlc3VsdHMgYXJlIGFsbG9jYXRlZCBmcm9tIHBvb2wuICBUaGUgY2FsbGVyIG11c3QgRnJlZVBvb2wKKyAgICB0aGUgcmVzdWx0aW5nIGRldmljZSBwYXRoIHN0cnVjdHVyZQorCistLSovCit7CisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgU2l6ZTsKKyAgICBGSUxFUEFUSF9ERVZJQ0VfUEFUSCAgICAqRmlsZVBhdGg7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICAgKkVvcCwgKkRldmljZVBhdGg7ICAgIAorCisgICAgU2l6ZSA9IFN0clNpemUoRmlsZU5hbWUpOworICAgIEZpbGVQYXRoID0gQWxsb2NhdGVaZXJvUG9vbCAoU2l6ZSArIFNJWkVfT0ZfRklMRVBBVEhfREVWSUNFX1BBVEggKyBzaXplb2YoRUZJX0RFVklDRV9QQVRIKSk7CisgICAgRGV2aWNlUGF0aCA9IE5VTEw7CisKKyAgICBpZiAoRmlsZVBhdGgpIHsKKworICAgICAgICAvLworICAgICAgICAvLyBCdWlsZCBhIGZpbGUgcGF0aAorICAgICAgICAvLworCisgICAgICAgIEZpbGVQYXRoLT5IZWFkZXIuVHlwZSA9IE1FRElBX0RFVklDRV9QQVRIOworICAgICAgICBGaWxlUGF0aC0+SGVhZGVyLlN1YlR5cGUgPSBNRURJQV9GSUxFUEFUSF9EUDsKKyAgICAgICAgU2V0RGV2aWNlUGF0aE5vZGVMZW5ndGggKCZGaWxlUGF0aC0+SGVhZGVyLCBTaXplICsgU0laRV9PRl9GSUxFUEFUSF9ERVZJQ0VfUEFUSCk7CisgICAgICAgIENvcHlNZW0gKEZpbGVQYXRoLT5QYXRoTmFtZSwgRmlsZU5hbWUsIFNpemUpOworICAgICAgICBFb3AgPSBOZXh0RGV2aWNlUGF0aE5vZGUoJkZpbGVQYXRoLT5IZWFkZXIpOworICAgICAgICBTZXREZXZpY2VQYXRoRW5kTm9kZShFb3ApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEFwcGVuZCBmaWxlIHBhdGggdG8gZGV2aWNlJ3MgZGV2aWNlIHBhdGgKKyAgICAgICAgLy8KKworICAgICAgICBEZXZpY2VQYXRoID0gKEVGSV9ERVZJQ0VfUEFUSCAqKSBGaWxlUGF0aDsKKyAgICAgICAgaWYgKERldmljZSkgeworICAgICAgICAgICAgRGV2aWNlUGF0aCA9IEFwcGVuZERldmljZVBhdGggKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBhdGhGcm9tSGFuZGxlKERldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIEZyZWVQb29sKEZpbGVQYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBEZXZpY2VQYXRoOworfQorCisKKworVUlOVE4KK0RldmljZVBhdGhTaXplICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICpEZXZQYXRoCisgICAgKQoreworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgKlN0YXJ0OworCisgICAgLy8KKyAgICAvLyBTZWFyY2ggZm9yIHRoZSBlbmQgb2YgdGhlIGRldmljZSBwYXRoIHN0cnVjdHVyZQorICAgIC8vICAgIAorCisgICAgU3RhcnQgPSBEZXZQYXRoOworICAgIHdoaWxlICghSXNEZXZpY2VQYXRoRW5kKERldlBhdGgpKSB7CisgICAgICAgIERldlBhdGggPSBOZXh0RGV2aWNlUGF0aE5vZGUoRGV2UGF0aCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb21wdXRlIHRoZSBzaXplCisgICAgLy8KKworICAgIHJldHVybiAoKFVJTlROKSBEZXZQYXRoIC0gKFVJTlROKSBTdGFydCkgKyBzaXplb2YoRUZJX0RFVklDRV9QQVRIKTsKK30KKworRUZJX0RFVklDRV9QQVRIICoKK0R1cGxpY2F0ZURldmljZVBhdGggKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgKkRldlBhdGgKKyAgICApCit7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAqTmV3RGV2UGF0aDsKKyAgICBVSU5UTiAgICAgICAgICAgICAgIFNpemU7ICAgIAorCisKKyAgICAvLworICAgIC8vIENvbXB1dGUgdGhlIHNpemUKKyAgICAvLworCisgICAgU2l6ZSA9IERldmljZVBhdGhTaXplIChEZXZQYXRoKTsKKworICAgIC8vCisgICAgLy8gTWFrZSBhIGNvcHkKKyAgICAvLworCisgICAgTmV3RGV2UGF0aCA9IEFsbG9jYXRlUG9vbCAoU2l6ZSk7CisgICAgaWYgKE5ld0RldlBhdGgpIHsKKyAgICAgICAgQ29weU1lbSAoTmV3RGV2UGF0aCwgRGV2UGF0aCwgU2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIE5ld0RldlBhdGg7Cit9CisKK0VGSV9ERVZJQ0VfUEFUSCAqCitVbnBhY2tEZXZpY2VQYXRoICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICpEZXZQYXRoCisgICAgKQoreworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgKlNyYywgKkRlc3QsICpOZXdQYXRoOworICAgIFVJTlROICAgICAgICAgICAgICAgU2l6ZTsKKyAgICAKKyAgICAvLworICAgIC8vIFdhbGsgZGV2aWNlIHBhdGggYW5kIHJvdW5kIHNpemVzIHRvIHZhbGlkIGJvdW5kcmllcworICAgIC8vICAgIAorCisgICAgU3JjID0gRGV2UGF0aDsKKyAgICBTaXplID0gMDsKKyAgICBmb3IgKDsgOykgeworICAgICAgICBTaXplICs9IERldmljZVBhdGhOb2RlTGVuZ3RoKFNyYyk7CisgICAgICAgIFNpemUgKz0gQUxJR05fU0laRShTaXplKTsKKworICAgICAgICBpZiAoSXNEZXZpY2VQYXRoRW5kKFNyYykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgU3JjID0gTmV4dERldmljZVBhdGhOb2RlKFNyYyk7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdW5wYWNrZWQgcGF0aAorICAgIC8vCisKKyAgICBOZXdQYXRoID0gQWxsb2NhdGVaZXJvUG9vbCAoU2l6ZSk7CisgICAgaWYgKE5ld1BhdGgpIHsKKworICAgICAgICBBU1NFUlQgKCgoVUlOVE4pTmV3UGF0aCkgJSBNSU5fQUxJR05NRU5UX1NJWkUgPT0gMCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ29weSBlYWNoIG5vZGUKKyAgICAgICAgLy8KKworICAgICAgICBTcmMgPSBEZXZQYXRoOworICAgICAgICBEZXN0ID0gTmV3UGF0aDsKKyAgICAgICAgZm9yICg7IDspIHsKKyAgICAgICAgICAgIFNpemUgPSBEZXZpY2VQYXRoTm9kZUxlbmd0aChTcmMpOworICAgICAgICAgICAgQ29weU1lbSAoRGVzdCwgU3JjLCBTaXplKTsKKyAgICAgICAgICAgIFNpemUgKz0gQUxJR05fU0laRShTaXplKTsKKyAgICAgICAgICAgIFNldERldmljZVBhdGhOb2RlTGVuZ3RoIChEZXN0LCBTaXplKTsKKyAgICAgICAgICAgIERlc3QtPlR5cGUgfD0gRUZJX0RQX1RZUEVfVU5QQUNLRUQ7CisgICAgICAgICAgICBEZXN0ID0gKEVGSV9ERVZJQ0VfUEFUSCAqKSAoKChVSU5UOCAqKSBEZXN0KSArIFNpemUpOworCisgICAgICAgICAgICBpZiAoSXNEZXZpY2VQYXRoRW5kKFNyYykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3JjID0gTmV4dERldmljZVBhdGhOb2RlKFNyYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTmV3UGF0aDsKK30KKworCitFRklfREVWSUNFX1BBVEgqCitBcHBlbmREZXZpY2VQYXRoSW5zdGFuY2UgKAorICAgIElOIEVGSV9ERVZJQ0VfUEFUSCAgKlNyYywKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICpJbnN0YW5jZQorICAgICkKK3sKKyAgICBVSU5UOCAgICAgICAgICAgKlB0cjsKKyAgICBFRklfREVWSUNFX1BBVEggKkRldlBhdGg7CisgICAgVUlOVE4gICAgICAgICAgIFNyY1NpemU7CisgICAgVUlOVE4gICAgICAgICAgIEluc3RhbmNlU2l6ZTsKKworICAgIGlmIChTcmMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRHVwbGljYXRlRGV2aWNlUGF0aCAoSW5zdGFuY2UpOworICAgIH0KKyAgICBTcmNTaXplID0gRGV2aWNlUGF0aFNpemUoU3JjKTsKKyAgICBJbnN0YW5jZVNpemUgPSBEZXZpY2VQYXRoU2l6ZShJbnN0YW5jZSk7CisgICAgUHRyID0gQWxsb2NhdGVQb29sIChTcmNTaXplICsgSW5zdGFuY2VTaXplKTsKKyAgICBEZXZQYXRoID0gKEVGSV9ERVZJQ0VfUEFUSCAqKVB0cjsKKyAgICBBU1NFUlQoRGV2UGF0aCk7CisKKyAgICBDb3B5TWVtIChQdHIsIFNyYywgU3JjU2l6ZSk7CisvLyAgICBGcmVlUG9vbCAoU3JjKTsKKyAgICAKKyAgICB3aGlsZSAoIUlzRGV2aWNlUGF0aEVuZChEZXZQYXRoKSkgeworICAgICAgICBEZXZQYXRoID0gTmV4dERldmljZVBhdGhOb2RlKERldlBhdGgpOworICAgIH0KKyAgICAvLworICAgIC8vIENvbnZlcnQgdGhlIEVuZCB0byBhbiBFbmQgSW5zdGFuY2UsIHNpbmNlIHdlIGFyZQorICAgIC8vICBhcHBlbmRpbmcgYW5vdGhlciBpbnN0YWNuZSBhZnRlciB0aGlzIG9uZSBpdHMgYSBnb29kCisgICAgLy8gIGlkZWEuCisgICAgLy8KKyAgICBEZXZQYXRoLT5TdWJUeXBlID0gRU5EX0lOU1RBTkNFX0RFVklDRV9QQVRIX1NVQlRZUEU7CisgICAgCisgICAgRGV2UGF0aCA9IE5leHREZXZpY2VQYXRoTm9kZShEZXZQYXRoKTsKKyAgICBDb3B5TWVtIChEZXZQYXRoLCBJbnN0YW5jZSwgSW5zdGFuY2VTaXplKTsKKyAgICByZXR1cm4gKEVGSV9ERVZJQ0VfUEFUSCAqKVB0cjsKK30KKworRUZJX1NUQVRVUworTGliRGV2aWNlUGF0aFRvSW50ZXJmYWNlICgKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAqUHJvdG9jb2wsCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAgICAgKkZpbGVQYXRoLAorICAgIE9VVCBWT0lEICAgICAgICAgICAgICAgICoqSW50ZXJmYWNlCisgICAgKQoreworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgIFN0YXR1czsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICBEZXZpY2U7CisKKyAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+TG9jYXRlRGV2aWNlUGF0aCwgMywgUHJvdG9jb2wsICZGaWxlUGF0aCwgJkRldmljZSk7CisKKyAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpKSB7CisKKyAgICAgICAgLy8gSWYgd2UgZGlkbid0IGdldCBhIGRpcmVjdCBtYXRjaCByZXR1cm4gbm90IGZvdW5kCisgICAgICAgIFN0YXR1cyA9IEVGSV9OT1RfRk9VTkQ7CisKKyAgICAgICAgaWYgKElzRGV2aWNlUGF0aEVuZChGaWxlUGF0aCkpIHsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEl0IHdhcyBhIGRpcmVjdCBtYXRjaCwgbG9va3VwIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIFN0YXR1cyA9dWVmaV9jYWxsX3dyYXBwZXIoQlMtPkhhbmRsZVByb3RvY29sLCAzLCBEZXZpY2UsIFByb3RvY29sLCBJbnRlcmZhY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIGRvIG5vdCByZXR1cm4gYW4gaW50ZXJmYWNlCisgICAgLy8KKworICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICAqSW50ZXJmYWNlID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCitWT0lECitfRGV2UGF0aFBjaSAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBQQ0lfREVWSUNFX1BBVEggICAgICAgICAqUGNpOworCisgICAgUGNpID0gRGV2UGF0aDsKKyAgICBDYXRQcmludChTdHIsIEwiUGNpKCV4fCV4KSIsIFBjaS0+RGV2aWNlLCBQY2ktPkZ1bmN0aW9uKTsKK30KKworVk9JRAorX0RldlBhdGhQY2NhcmQgKAorICAgIElOIE9VVCBQT09MX1BSSU5UICAgICAgICpTdHIsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKkRldlBhdGgKKyAgICApCit7CisgICAgUENDQVJEX0RFVklDRV9QQVRIICAgICAgKlBjY2FyZDsKKworICAgIFBjY2FyZCA9IERldlBhdGg7ICAgCisgICAgQ2F0UHJpbnQoU3RyLCBMIlBjY2FyZChTb2NrZXQleCkiLCBQY2NhcmQtPlNvY2tldE51bWJlcik7Cit9CisKK1ZPSUQKK19EZXZQYXRoTWVtTWFwICgKKyAgICBJTiBPVVQgUE9PTF9QUklOVCAgICAgICAqU3RyLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICpEZXZQYXRoCisgICAgKQoreworICAgIE1FTU1BUF9ERVZJQ0VfUEFUSCAgICAgICpNZW1NYXA7CisKKyAgICBNZW1NYXAgPSBEZXZQYXRoOyAgIAorICAgIENhdFByaW50KFN0ciwgTCJNZW1NYXAoJWQ6JXgtJXgpIiwKKyAgICAgICAgTWVtTWFwLT5NZW1vcnlUeXBlLAorICAgICAgICBNZW1NYXAtPlN0YXJ0aW5nQWRkcmVzcywKKyAgICAgICAgTWVtTWFwLT5FbmRpbmdBZGRyZXNzCisgICAgICAgICk7Cit9CisKK1ZPSUQKK19EZXZQYXRoQ29udHJvbGxlciAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBDT05UUk9MTEVSX0RFVklDRV9QQVRIICAqQ29udHJvbGxlcjsKKworICAgIENvbnRyb2xsZXIgPSBEZXZQYXRoOworICAgIENhdFByaW50KFN0ciwgTCJDdHJsKCVkKSIsCisgICAgICAgIENvbnRyb2xsZXItPkNvbnRyb2xsZXIKKyAgICAgICAgKTsKK30KKworVk9JRAorX0RldlBhdGhWZW5kb3IgKAorICAgIElOIE9VVCBQT09MX1BSSU5UICAgICAgICpTdHIsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKkRldlBhdGgKKyAgICApCit7CisgICAgVkVORE9SX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgKlZlbmRvcjsKKyAgICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVHlwZTsKKyAgICBVTktOT1dOX0RFVklDRV9WRU5ET1JfREVWSUNFX1BBVEggICAqVW5rbm93bkRldlBhdGg7CisKKyAgICBWZW5kb3IgPSBEZXZQYXRoOworICAgIHN3aXRjaCAoRGV2aWNlUGF0aFR5cGUoJlZlbmRvci0+SGVhZGVyKSkgeworICAgIGNhc2UgSEFSRFdBUkVfREVWSUNFX1BBVEg6ICBUeXBlID0gTCJIdyI7ICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FU1NBR0lOR19ERVZJQ0VfUEFUSDogVHlwZSA9IEwiTXNnIjsgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9ERVZJQ0VfUEFUSDogICAgIFR5cGUgPSBMIk1lZGlhIjsgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICBUeXBlID0gTCI/IjsgICAgICAgICBicmVhazsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgQ2F0UHJpbnQoU3RyLCBMIlZlbiVzKCVnIiwgVHlwZSwgJlZlbmRvci0+R3VpZCk7CisgICAgaWYgKENvbXBhcmVHdWlkICgmVmVuZG9yLT5HdWlkLCAmVW5rbm93bkRldmljZSkgPT0gMCkgeworICAgICAgICAvLworICAgICAgICAvLyBHVUlEIHVzZWQgYnkgRUZJIHRvIGVudW1lcmF0ZSBhbiBFREQgMS4xIGRldmljZQorICAgICAgICAvLworICAgICAgICBVbmtub3duRGV2UGF0aCA9IChVTktOT1dOX0RFVklDRV9WRU5ET1JfREVWSUNFX1BBVEggKilWZW5kb3I7CisgICAgICAgIENhdFByaW50KFN0ciwgTCI6JTAyeCkiLCBVbmtub3duRGV2UGF0aC0+TGVnYWN5RHJpdmVMZXR0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIENhdFByaW50KFN0ciwgTCIpIik7CisgICAgfQorfQorCisKK1ZPSUQKK19EZXZQYXRoQWNwaSAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBBQ1BJX0hJRF9ERVZJQ0VfUEFUSCAgICAgICAgKkFjcGk7CisKKyAgICBBY3BpID0gRGV2UGF0aDsKKyAgICBpZiAoKEFjcGktPkhJRCAmIFBOUF9FSVNBX0lEX01BU0spID09IFBOUF9FSVNBX0lEX0NPTlNUKSB7CisgICAgICAgIENhdFByaW50KFN0ciwgTCJBY3BpKFBOUCUwNHgsJXgpIiwgRUlTQV9JRF9UT19OVU0gKEFjcGktPkhJRCksIEFjcGktPlVJRCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ2F0UHJpbnQoU3RyLCBMIkFjcGkoJTA4eCwleCkiLCBBY3BpLT5ISUQsIEFjcGktPlVJRCk7CisgICAgfQorfQorCisKK1ZPSUQKK19EZXZQYXRoQXRhcGkgKAorICAgIElOIE9VVCBQT09MX1BSSU5UICAgICAgICpTdHIsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKkRldlBhdGgKKyAgICApCit7CisgICAgQVRBUElfREVWSUNFX1BBVEggICAgICAgKkF0YXBpOworCisgICAgQXRhcGkgPSBEZXZQYXRoOworICAgIENhdFByaW50KFN0ciwgTCJBdGEoJXMsJXMpIiwgCisgICAgICAgIEF0YXBpLT5QcmltYXJ5U2Vjb25kYXJ5ID8gTCJTZWNvbmRhcnkiIDogTCJQcmltYXJ5IiwKKyAgICAgICAgQXRhcGktPlNsYXZlTWFzdGVyID8gTCJTbGF2ZSIgOiBMIk1hc3RlciIKKyAgICAgICAgKTsKK30KKworVk9JRAorX0RldlBhdGhTY3NpICgKKyAgICBJTiBPVVQgUE9PTF9QUklOVCAgICAgICAqU3RyLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICpEZXZQYXRoCisgICAgKQoreworICAgIFNDU0lfREVWSUNFX1BBVEggICAgICAgICpTY3NpOworCisgICAgU2NzaSA9IERldlBhdGg7CisgICAgQ2F0UHJpbnQoU3RyLCBMIlNjc2koUHVuJXgsTHVuJXgpIiwgU2NzaS0+UHVuLCBTY3NpLT5MdW4pOworfQorCisKK1ZPSUQKK19EZXZQYXRoRmlicmUgKAorICAgIElOIE9VVCBQT09MX1BSSU5UICAgICAgICpTdHIsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKkRldlBhdGgKKyAgICApCit7CisgICAgRklCUkVDSEFOTkVMX0RFVklDRV9QQVRIICAgICpGaWJyZTsKKworICAgIEZpYnJlID0gRGV2UGF0aDsKKyAgICBDYXRQcmludChTdHIsIEwiRmlicmUoJWx4KSIsIEZpYnJlLT5XV04pOworfQorCitWT0lECitfRGV2UGF0aDEzOTQgKAorICAgIElOIE9VVCBQT09MX1BSSU5UICAgICAgICpTdHIsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKkRldlBhdGgKKyAgICApCit7CisgICAgRjEzOTRfREVWSUNFX1BBVEggICAgICAgKkYxMzk0OworCisgICAgRjEzOTQgPSBEZXZQYXRoOworICAgIENhdFByaW50KFN0ciwgTCIxMzk0KCVnKSIsICZGMTM5NC0+R3VpZCk7Cit9CisKKworCitWT0lECitfRGV2UGF0aFVzYiAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBVU0JfREVWSUNFX1BBVEggICAgICAgICAqVXNiOworCisgICAgVXNiID0gRGV2UGF0aDsKKyAgICBDYXRQcmludChTdHIsIEwiVXNiKCV4KSIsIFVzYi0+UG9ydCk7Cit9CisKKworVk9JRAorX0RldlBhdGhJMk8gKAorICAgIElOIE9VVCBQT09MX1BSSU5UICAgICAgICpTdHIsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKkRldlBhdGgKKyAgICApCit7CisgICAgSTJPX0RFVklDRV9QQVRIICAgICAgICAgKkkyTzsKKworICAgIEkyTyA9IERldlBhdGg7CisgICAgQ2F0UHJpbnQoU3RyLCBMIkkyTygleCkiLCBJMk8tPlRpZCk7Cit9CisKK1ZPSUQKK19EZXZQYXRoTWFjQWRkciAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBNQUNfQUREUl9ERVZJQ0VfUEFUSCAgICAqTUFDOworICAgIFVJTlROICAgICAgICAgICAgICAgICAgIEh3QWRkcmVzc1NpemU7CisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgSW5kZXg7CisKKyAgICBNQUMgPSBEZXZQYXRoOworCisgICAgSHdBZGRyZXNzU2l6ZSA9IHNpemVvZihFRklfTUFDX0FERFJFU1MpOworICAgIGlmIChNQUMtPklmVHlwZSA9PSAweDAxIHx8IE1BQy0+SWZUeXBlID09IDB4MDApIHsKKyAgICAgICAgSHdBZGRyZXNzU2l6ZSA9IDY7CisgICAgfQorICAgIAorICAgIENhdFByaW50KFN0ciwgTCJNYWMoIik7CisKKyAgICBmb3IoSW5kZXggPSAwOyBJbmRleCA8IEh3QWRkcmVzc1NpemU7IEluZGV4KyspIHsKKyAgICAgICAgQ2F0UHJpbnQoU3RyLCBMIiUwMngiLE1BQy0+TWFjQWRkcmVzcy5BZGRyW0luZGV4XSk7CisgICAgfQorICAgIENhdFByaW50KFN0ciwgTCIpIik7Cit9CisKK1ZPSUQKK19EZXZQYXRoSVB2NCAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBJUHY0X0RFVklDRV9QQVRIICAgICAqSVA7CisKKyAgICBJUCA9IERldlBhdGg7CisgICAgQ2F0UHJpbnQoU3RyLCBMIklQdjQobm90LWRvbmUpIik7Cit9CisKK1ZPSUQKK19EZXZQYXRoSVB2NiAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBJUHY2X0RFVklDRV9QQVRIICAgICAqSVA7CisKKyAgICBJUCA9IERldlBhdGg7CisgICAgQ2F0UHJpbnQoU3RyLCBMIklQLXY2KG5vdC1kb25lKSIpOworfQorCitWT0lECitfRGV2UGF0aEluZmluaUJhbmQgKAorICAgIElOIE9VVCBQT09MX1BSSU5UICAgICAgICpTdHIsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKkRldlBhdGgKKyAgICApCit7CisgICAgSU5GSU5JQkFORF9ERVZJQ0VfUEFUSCAgKkluZmluaUJhbmQ7CisKKyAgICBJbmZpbmlCYW5kID0gRGV2UGF0aDsKKyAgICBDYXRQcmludChTdHIsIEwiSW5maW5pQmFuZChub3QtZG9uZSkiKTsKK30KKworVk9JRAorX0RldlBhdGhVYXJ0ICgKKyAgICBJTiBPVVQgUE9PTF9QUklOVCAgICAgICAqU3RyLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICpEZXZQYXRoCisgICAgKQoreworICAgIFVBUlRfREVWSUNFX1BBVEggICpVYXJ0OworICAgIENIQVI4ICAgICAgICAgICAgIFBhcml0eTsKKworICAgIFVhcnQgPSBEZXZQYXRoOworICAgIHN3aXRjaCAoVWFydC0+UGFyaXR5KSB7CisgICAgICAgIGNhc2UgMCAgOiBQYXJpdHkgPSAnRCc7IGJyZWFrOworICAgICAgICBjYXNlIDEgIDogUGFyaXR5ID0gJ04nOyBicmVhazsKKyAgICAgICAgY2FzZSAyICA6IFBhcml0eSA9ICdFJzsgYnJlYWs7CisgICAgICAgIGNhc2UgMyAgOiBQYXJpdHkgPSAnTyc7IGJyZWFrOworICAgICAgICBjYXNlIDQgIDogUGFyaXR5ID0gJ00nOyBicmVhazsKKyAgICAgICAgY2FzZSA1ICA6IFBhcml0eSA9ICdTJzsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiBQYXJpdHkgPSAneCc7IGJyZWFrOworICAgIH0KKworICAgIGlmIChVYXJ0LT5CYXVkUmF0ZSA9PSAwKSB7CisgICAgICAgIENhdFByaW50KFN0ciwgTCJVYXJ0KERFRkFVTFQgJWMiLFVhcnQtPkJhdWRSYXRlLFBhcml0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ2F0UHJpbnQoU3RyLCBMIlVhcnQoJWQgJWMiLFVhcnQtPkJhdWRSYXRlLFBhcml0eSk7CisgICAgfQorCisgICAgaWYgKFVhcnQtPkRhdGFCaXRzID09IDApIHsKKyAgICAgICAgQ2F0UHJpbnQoU3RyLCBMIkQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDYXRQcmludChTdHIsIEwiJWQiLFVhcnQtPkRhdGFCaXRzKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKFVhcnQtPlN0b3BCaXRzKSB7CisgICAgICAgIGNhc2UgMCAgOiBDYXRQcmludChTdHIsIEwiRCkiKTsgICBicmVhazsKKyAgICAgICAgY2FzZSAxICA6IENhdFByaW50KFN0ciwgTCIxKSIpOyAgIGJyZWFrOworICAgICAgICBjYXNlIDIgIDogQ2F0UHJpbnQoU3RyLCBMIjEuNSkiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMyAgOiBDYXRQcmludChTdHIsIEwiMikiKTsgICBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6IENhdFByaW50KFN0ciwgTCJ4KSIpOyAgIGJyZWFrOworICAgIH0KK30KKworCitWT0lECitfRGV2UGF0aEhhcmREcml2ZSAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBIQVJERFJJVkVfREVWSUNFX1BBVEggICAqSGQ7CisKKyAgICBIZCA9IERldlBhdGg7CisgICAgc3dpdGNoIChIZC0+U2lnbmF0dXJlVHlwZSkgeworICAgICAgICBjYXNlIFNJR05BVFVSRV9UWVBFX01CUjoKKyAgICAgICAgICAgIENhdFByaW50KFN0ciwgTCJIRChQYXJ0JWQsU2lnJTA4WCkiLCAKKyAgICAgICAgICAgICAgICBIZC0+UGFydGl0aW9uTnVtYmVyLAorICAgICAgICAgICAgICAgICooKFVJTlQzMiAqKSgmKEhkLT5TaWduYXR1cmVbMF0pKSkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lHTkFUVVJFX1RZUEVfR1VJRDoKKyAgICAgICAgICAgIENhdFByaW50KFN0ciwgTCJIRChQYXJ0JWQsU2lnJWcpIiwgCisgICAgICAgICAgICAgICAgSGQtPlBhcnRpdGlvbk51bWJlciwKKyAgICAgICAgICAgICAgICAoRUZJX0dVSUQgKikgJihIZC0+U2lnbmF0dXJlWzBdKSAgICAgCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQ2F0UHJpbnQoU3RyLCBMIkhEKFBhcnQlZCxNQlJUeXBlPSUwMngsU2lnVHlwZT0lMDJ4KSIsIAorICAgICAgICAgICAgICAgIEhkLT5QYXJ0aXRpb25OdW1iZXIsCisgICAgICAgICAgICAgICAgSGQtPk1CUlR5cGUsCisgICAgICAgICAgICAgICAgSGQtPlNpZ25hdHVyZVR5cGUKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitWT0lECitfRGV2UGF0aENEUk9NICgKKyAgICBJTiBPVVQgUE9PTF9QUklOVCAgICAgICAqU3RyLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICpEZXZQYXRoCisgICAgKQoreworICAgIENEUk9NX0RFVklDRV9QQVRIICAgICAgICpDZDsKKworICAgIENkID0gRGV2UGF0aDsKKyAgICBDYXRQcmludChTdHIsIEwiQ0RST00oRW50cnkleCkiLCBDZC0+Qm9vdEVudHJ5KTsKK30KKworVk9JRAorX0RldlBhdGhGaWxlUGF0aCAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBGSUxFUEFUSF9ERVZJQ0VfUEFUSCAgICAqRnA7ICAgCisKKyAgICBGcCA9IERldlBhdGg7CisgICAgQ2F0UHJpbnQoU3RyLCBMIiVzIiwgRnAtPlBhdGhOYW1lKTsKK30KKworVk9JRAorX0RldlBhdGhNZWRpYVByb3RvY29sICgKKyAgICBJTiBPVVQgUE9PTF9QUklOVCAgICAgICAqU3RyLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICpEZXZQYXRoCisgICAgKQoreworICAgIE1FRElBX1BST1RPQ09MX0RFVklDRV9QQVRIICAqTWVkaWFQcm90OworCisgICAgTWVkaWFQcm90ID0gRGV2UGF0aDsKKyAgICBDYXRQcmludChTdHIsIEwiJWciLCAmTWVkaWFQcm90LT5Qcm90b2NvbCk7Cit9CisKK1ZPSUQKK19EZXZQYXRoQnNzQnNzICgKKyAgICBJTiBPVVQgUE9PTF9QUklOVCAgICAgICAqU3RyLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICpEZXZQYXRoCisgICAgKQoreworICAgIEJCU19CQlNfREVWSUNFX1BBVEggICAgICpCc3M7CisgICAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgKlR5cGU7CisKKyAgICBCc3MgPSBEZXZQYXRoOworICAgIHN3aXRjaCAoQnNzLT5EZXZpY2VUeXBlKSB7CisgICAgY2FzZSBCQlNfVFlQRV9GTE9QUFk6ICAgICAgICAgICAgICAgVHlwZSA9IEwiRmxvcHB5IjsgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVFlQRV9IQVJERFJJVkU6ICAgICAgICAgICAgVHlwZSA9IEwiSGFyZGRyaXZlIjsgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVFlQRV9DRFJPTTogICAgICAgICAgICAgICAgVHlwZSA9IEwiQ0RST00iOyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVFlQRV9QQ01DSUE6ICAgICAgICAgICAgICAgVHlwZSA9IEwiUENNQ0lBIjsgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVFlQRV9VU0I6ICAgICAgICAgICAgICAgICAgVHlwZSA9IEwiVXNiIjsgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVFlQRV9FTUJFRERFRF9ORVRXT1JLOiAgICAgVHlwZSA9IEwiTmV0IjsgICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IEwiPyI7ICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQ2F0UHJpbnQoU3RyLCBMIkJzcy0lcyglYSkiLCBUeXBlLCBCc3MtPlN0cmluZyk7Cit9CisKKworVk9JRAorX0RldlBhdGhFbmRJbnN0YW5jZSAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAgICAgKlN0ciwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBDYXRQcmludChTdHIsIEwiLCIpOworfQorCitWT0lECitfRGV2UGF0aE5vZGVVbmtub3duICgKKyAgICBJTiBPVVQgUE9PTF9QUklOVCAgICAgICAqU3RyLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICpEZXZQYXRoCisgICAgKQoreworICAgIENhdFByaW50KFN0ciwgTCI/Iik7Cit9CisKKworc3RydWN0IHsKKyAgICBVSU5UOCAgIFR5cGU7CisgICAgVUlOVDggICBTdWJUeXBlOworICAgIFZPSUQgICAgKCpGdW5jdGlvbikoUE9PTF9QUklOVCAqLCBWT0lEICopOyAgICAKK30gRGV2UGF0aFRhYmxlW10gPSB7CisJeyBIQVJEV0FSRV9ERVZJQ0VfUEFUSCwgICBIV19QQ0lfRFAsICAgICAgICAgICAgICAgICAgICAgICAgX0RldlBhdGhQY2l9LAorCXsgSEFSRFdBUkVfREVWSUNFX1BBVEgsICAgSFdfUENDQVJEX0RQLCAgICAgICAgICAgICAgICAgICAgIF9EZXZQYXRoUGNjYXJkfSwKKwl7IEhBUkRXQVJFX0RFVklDRV9QQVRILCAgIEhXX01FTU1BUF9EUCwgICAgICAgICAgICAgICAgICAgICBfRGV2UGF0aE1lbU1hcH0sCisJeyBIQVJEV0FSRV9ERVZJQ0VfUEFUSCwgICBIV19WRU5ET1JfRFAsICAgICAgICAgICAgICAgICAgICAgX0RldlBhdGhWZW5kb3J9LAorCXsgSEFSRFdBUkVfREVWSUNFX1BBVEgsICAgSFdfQ09OVFJPTExFUl9EUCwgICAgICAgICAgICAgICAgIF9EZXZQYXRoQ29udHJvbGxlcn0sCisJeyBBQ1BJX0RFVklDRV9QQVRILCAgICAgICBBQ1BJX0RQLCAgICAgICAgICAgICAgICAgICAgICAgICAgX0RldlBhdGhBY3BpfSwKKwl7IE1FU1NBR0lOR19ERVZJQ0VfUEFUSCwgIE1TR19BVEFQSV9EUCwgICAgICAgICAgICAgICAgICAgICBfRGV2UGF0aEF0YXBpfSwKKwl7IE1FU1NBR0lOR19ERVZJQ0VfUEFUSCwgIE1TR19TQ1NJX0RQLCAgICAgICAgICAgICAgICAgICAgICBfRGV2UGF0aFNjc2l9LAorCXsgTUVTU0FHSU5HX0RFVklDRV9QQVRILCAgTVNHX0ZJQlJFQ0hBTk5FTF9EUCwgICAgICAgICAgICAgIF9EZXZQYXRoRmlicmV9LAorCXsgTUVTU0FHSU5HX0RFVklDRV9QQVRILCAgTVNHXzEzOTRfRFAsICAgICAgICAgICAgICAgICAgICAgIF9EZXZQYXRoMTM5NH0sCisJeyBNRVNTQUdJTkdfREVWSUNFX1BBVEgsICBNU0dfVVNCX0RQLCAgICAgICAgICAgICAgICAgICAgICAgX0RldlBhdGhVc2J9LAorCXsgTUVTU0FHSU5HX0RFVklDRV9QQVRILCAgTVNHX0kyT19EUCwgICAgICAgICAgICAgICAgICAgICAgIF9EZXZQYXRoSTJPfSwKKwl7IE1FU1NBR0lOR19ERVZJQ0VfUEFUSCwgIE1TR19NQUNfQUREUl9EUCwgICAgICAgICAgICAgICAgICBfRGV2UGF0aE1hY0FkZHJ9LAorCXsgTUVTU0FHSU5HX0RFVklDRV9QQVRILCAgTVNHX0lQdjRfRFAsICAgICAgICAgICAgICAgICAgICAgIF9EZXZQYXRoSVB2NH0sCisJeyBNRVNTQUdJTkdfREVWSUNFX1BBVEgsICBNU0dfSVB2Nl9EUCwgICAgICAgICAgICAgICAgICAgICAgX0RldlBhdGhJUHY2fSwKKwl7IE1FU1NBR0lOR19ERVZJQ0VfUEFUSCwgIE1TR19JTkZJTklCQU5EX0RQLCAgICAgICAgICAgICAgICBfRGV2UGF0aEluZmluaUJhbmR9LAorCXsgTUVTU0FHSU5HX0RFVklDRV9QQVRILCAgTVNHX1VBUlRfRFAsICAgICAgICAgICAgICAgICAgICAgIF9EZXZQYXRoVWFydH0sCisJeyBNRVNTQUdJTkdfREVWSUNFX1BBVEgsICBNU0dfVkVORE9SX0RQLCAgICAgICAgICAgICAgICAgICAgX0RldlBhdGhWZW5kb3J9LAorCXsgTUVESUFfREVWSUNFX1BBVEgsICAgICAgTUVESUFfSEFSRERSSVZFX0RQLCAgICAgICAgICAgICAgIF9EZXZQYXRoSGFyZERyaXZlfSwKKwl7IE1FRElBX0RFVklDRV9QQVRILCAgICAgIE1FRElBX0NEUk9NX0RQLCAgICAgICAgICAgICAgICAgICBfRGV2UGF0aENEUk9NfSwKKwl7IE1FRElBX0RFVklDRV9QQVRILCAgICAgIE1FRElBX1ZFTkRPUl9EUCwgICAgICAgICAgICAgICAgICBfRGV2UGF0aFZlbmRvcn0sCisJeyBNRURJQV9ERVZJQ0VfUEFUSCwgICAgICBNRURJQV9GSUxFUEFUSF9EUCwgICAgICAgICAgICAgICAgX0RldlBhdGhGaWxlUGF0aH0sCisJeyBNRURJQV9ERVZJQ0VfUEFUSCwgICAgICBNRURJQV9QUk9UT0NPTF9EUCwgICAgICAgICAgICAgICAgX0RldlBhdGhNZWRpYVByb3RvY29sfSwKKwl7IEJCU19ERVZJQ0VfUEFUSCwgICAgICAgIEJCU19CQlNfRFAsICAgICAgICAgICAgICAgICAgICAgICBfRGV2UGF0aEJzc0Jzc30sCisJeyBFTkRfREVWSUNFX1BBVEhfVFlQRSwgICBFTkRfSU5TVEFOQ0VfREVWSUNFX1BBVEhfU1VCVFlQRSwgX0RldlBhdGhFbmRJbnN0YW5jZX0sCisJeyAwLCAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0KK307CisKKworQ0hBUjE2ICoKK0RldmljZVBhdGhUb1N0ciAoCisgICAgRUZJX0RFVklDRV9QQVRIICAgICAqRGV2UGF0aAorICAgICkKKy8qKysKKworICAgIFR1cm5zIHRoZSBEZXZpY2UgUGF0aCBpbnRvIGEgcHJpbnRhYmxlIHN0cmluZy4gIEFsbGNvYXRlcworICAgIHRoZSBzdHJpbmcgZnJvbSBwb29sLiAgVGhlIGNhbGxlciBtdXN0IEZyZWVQb29sIHRoZSByZXR1cm5lZAorICAgIHN0cmluZy4KKworLS0qLworeworICAgIFBPT0xfUFJJTlQgICAgICAgICAgU3RyOworICAgIEVGSV9ERVZJQ0VfUEFUSCAgICAgKkRldlBhdGhOb2RlOworICAgIFZPSUQgICAgICAgICAgICAgICAgKCpEdW1wTm9kZSkoUE9PTF9QUklOVCAqLCBWT0lEICopOyAgICAKKyAgICBVSU5UTiAgICAgICAgICAgICAgIEluZGV4LCBOZXdTaXplOworCisgICAgWmVyb01lbSgmU3RyLCBzaXplb2YoU3RyKSk7CisKKyAgICAvLworICAgIC8vIFVucGFja2VkIHRoZSBkZXZpY2UgcGF0aAorICAgIC8vCisKKyAgICBEZXZQYXRoID0gVW5wYWNrRGV2aWNlUGF0aChEZXZQYXRoKTsKKyAgICBBU1NFUlQgKERldlBhdGgpOworCisKKyAgICAvLworICAgIC8vIFByb2Nlc3MgZWFjaCBkZXZpY2UgcGF0aCBub2RlCisgICAgLy8gICAgCisKKyAgICBEZXZQYXRoTm9kZSA9IERldlBhdGg7CisgICAgd2hpbGUgKCFJc0RldmljZVBhdGhFbmQoRGV2UGF0aE5vZGUpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEZpbmQgdGhlIGhhbmRsZXIgdG8gZHVtcCB0aGlzIGRldmljZSBwYXRoIG5vZGUKKyAgICAgICAgLy8KKworICAgICAgICBEdW1wTm9kZSA9IE5VTEw7CisgICAgICAgIGZvciAoSW5kZXggPSAwOyBEZXZQYXRoVGFibGVbSW5kZXhdLkZ1bmN0aW9uOyBJbmRleCArPSAxKSB7CisKKyAgICAgICAgICAgIGlmIChEZXZpY2VQYXRoVHlwZShEZXZQYXRoTm9kZSkgPT0gRGV2UGF0aFRhYmxlW0luZGV4XS5UeXBlICYmCisgICAgICAgICAgICAgICAgRGV2aWNlUGF0aFN1YlR5cGUoRGV2UGF0aE5vZGUpID09IERldlBhdGhUYWJsZVtJbmRleF0uU3ViVHlwZSkgeworICAgICAgICAgICAgICAgIER1bXBOb2RlID0gRGV2UGF0aFRhYmxlW0luZGV4XS5GdW5jdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIG5vdCBmb3VuZCwgdXNlIGEgZ2VuZXJpYyBmdW5jdGlvbgorICAgICAgICAvLworCisgICAgICAgIGlmICghRHVtcE5vZGUpIHsKKyAgICAgICAgICAgIER1bXBOb2RlID0gX0RldlBhdGhOb2RlVW5rbm93bjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vICBQdXQgYSBwYXRoIHNlcGVyYXRvciBpbiBpZiBuZWVkZWQKKyAgICAgICAgLy8KKworICAgICAgICBpZiAoU3RyLmxlbiAgJiYgIER1bXBOb2RlICE9IF9EZXZQYXRoRW5kSW5zdGFuY2UpIHsKKyAgICAgICAgICAgIENhdFByaW50ICgmU3RyLCBMIi8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFByaW50IHRoaXMgbm9kZSBvZiB0aGUgZGV2aWNlIHBhdGgKKyAgICAgICAgLy8KKworICAgICAgICBEdW1wTm9kZSAoJlN0ciwgRGV2UGF0aE5vZGUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5leHQgZGV2aWNlIHBhdGggbm9kZQorICAgICAgICAvLworCisgICAgICAgIERldlBhdGhOb2RlID0gTmV4dERldmljZVBhdGhOb2RlKERldlBhdGhOb2RlKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNocmluayBwb29sIHVzZWQgZm9yIHN0cmluZyBhbGxvY2F0aW9uCisgICAgLy8KKworICAgIEZyZWVQb29sIChEZXZQYXRoKTsKKyAgICBOZXdTaXplID0gKFN0ci5sZW4gKyAxKSAqIHNpemVvZihDSEFSMTYpOworICAgIFN0ci5zdHIgPSBSZWFsbG9jYXRlUG9vbCAoU3RyLnN0ciwgTmV3U2l6ZSwgTmV3U2l6ZSk7CisgICAgU3RyLnN0cltTdHIubGVuXSA9IDA7CisgICAgcmV0dXJuIFN0ci5zdHI7Cit9CisKK0JPT0xFQU4KK0xpYk1hdGNoRGV2aWNlUGF0aHMgKAorICAgIElOICBFRklfREVWSUNFX1BBVEggKk11bHRpLAorICAgIElOICBFRklfREVWSUNFX1BBVEggKlNpbmdsZQorICAgICkKK3sKKyAgICBFRklfREVWSUNFX1BBVEggICAgICpEZXZpY2VQYXRoLCAqRGV2aWNlUGF0aEluc3Q7CisgICAgVUlOVE4gICAgICAgICAgICAgICBTaXplOworCisgICAgaWYgKCFNdWx0aSB8fCAhU2luZ2xlKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBEZXZpY2VQYXRoID0gTXVsdGk7CisgICAgd2hpbGUgKChEZXZpY2VQYXRoSW5zdCA9IERldmljZVBhdGhJbnN0YW5jZSAoJkRldmljZVBhdGgsICZTaXplKSkpIHsKKyAgICAgICAgaWYgKENvbXBhcmVNZW0gKFNpbmdsZSwgRGV2aWNlUGF0aEluc3QsIFNpemUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworRUZJX0RFVklDRV9QQVRIICoKK0xpYkR1cGxpY2F0ZURldmljZVBhdGhJbnN0YW5jZSAoCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICAqRGV2UGF0aAorICAgICkKK3sKKyAgICBFRklfREVWSUNFX1BBVEggICAgICpOZXdEZXZQYXRoLCpEZXZpY2VQYXRoSW5zdCwqVGVtcDsKKyAgICBVSU5UTiAgICAgICAgICAgICAgIFNpemUgPSAwOyAgICAKKworICAgIC8vCisgICAgLy8gZ2V0IHRoZSBzaXplIG9mIGFuIGluc3RhbmNlIGZyb20gdGhlIGlucHV0CisgICAgLy8KKworICAgIFRlbXAgPSBEZXZQYXRoOworICAgIERldmljZVBhdGhJbnN0ID0gRGV2aWNlUGF0aEluc3RhbmNlICgmVGVtcCwgJlNpemUpOworICAgIAorICAgIC8vCisgICAgLy8gTWFrZSBhIGNvcHkgYW5kIHNldCBwcm9wZXIgZW5kIHR5cGUKKyAgICAvLworICAgIE5ld0RldlBhdGggPSBOVUxMOworICAgIGlmIChTaXplKSB7IAorICAgICAgICBOZXdEZXZQYXRoID0gQWxsb2NhdGVQb29sIChTaXplICsgc2l6ZW9mKEVGSV9ERVZJQ0VfUEFUSCkpOworICAgIH0KKworICAgIGlmIChOZXdEZXZQYXRoKSB7CisgICAgICAgIENvcHlNZW0gKE5ld0RldlBhdGgsIERldmljZVBhdGhJbnN0LCBTaXplKTsKKyAgICAgICAgVGVtcCA9IE5leHREZXZpY2VQYXRoTm9kZShOZXdEZXZQYXRoKTsgCisgICAgICAgIFNldERldmljZVBhdGhFbmROb2RlKFRlbXApOworICAgIH0KKworICAgIHJldHVybiBOZXdEZXZQYXRoOworfQorCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9lcnJvci5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWQzMjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvZXJyb3IuYwpAQCAtMCwwICsxLDc2IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBlcnJvci5jCisKK0Fic3RyYWN0OgorCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisKK3N0cnVjdCB7CisgICAgRUZJX1NUQVRVUyAgICAgIENvZGU7CisgICAgV0NIQVIJICAgICpEZXNjOworfSBFcnJvckNvZGVUYWJsZVtdID0geworCXsgIEVGSV9TVUNDRVNTLCAgICAgICAgICAgICAgICBMIlN1Y2Nlc3MifSwKKwl7ICBFRklfTE9BRF9FUlJPUiwgICAgICAgICAgICAgTCJMb2FkIEVycm9yIn0sCisJeyAgRUZJX0lOVkFMSURfUEFSQU1FVEVSLCAgICAgIEwiSW52YWxpZCBQYXJhbWV0ZXIifSwKKwl7ICBFRklfVU5TVVBQT1JURUQsICAgICAgICAgICAgTCJVbnN1cHBvcnRlZCJ9LAorCXsgIEVGSV9CQURfQlVGRkVSX1NJWkUsICAgICAgICBMIkJhZCBCdWZmZXIgU2l6ZSJ9LAorCXsgIEVGSV9CVUZGRVJfVE9PX1NNQUxMLCAgICAgICBMIkJ1ZmZlciBUb28gU21hbGwifSwKKwl7ICBFRklfTk9UX1JFQURZLCAgICAgICAgICAgICAgTCJOb3QgUmVhZHkifSwKKwl7ICBFRklfREVWSUNFX0VSUk9SLCAgICAgICAgICAgTCJEZXZpY2UgRXJyb3IifSwKKwl7ICBFRklfV1JJVEVfUFJPVEVDVEVELCAgICAgICAgTCJXcml0ZSBQcm90ZWN0ZWQifSwKKwl7ICBFRklfT1VUX09GX1JFU09VUkNFUywgICAgICAgTCJPdXQgb2YgUmVzb3VyY2VzIn0sCisJeyAgRUZJX1ZPTFVNRV9DT1JSVVBURUQsICAgICAgIEwiVm9sdW1lIENvcnJ1cHQifSwKKwl7ICBFRklfVk9MVU1FX0ZVTEwsICAgICAgICAgICAgTCJWb2x1bWUgRnVsbCJ9LAorCXsgIEVGSV9OT19NRURJQSwgICAgICAgICAgICAgICBMIk5vIE1lZGlhIn0sCisJeyAgRUZJX01FRElBX0NIQU5HRUQsICAgICAgICAgIEwiTWVkaWEgY2hhbmdlZCJ9LAorCXsgIEVGSV9OT1RfRk9VTkQsICAgICAgICAgICAgICBMIk5vdCBGb3VuZCJ9LAorCXsgIEVGSV9BQ0NFU1NfREVOSUVELCAgICAgICAgICBMIkFjY2VzcyBEZW5pZWQifSwKKwl7ICBFRklfTk9fUkVTUE9OU0UsICAgICAgICAgICAgTCJObyBSZXNwb25zZSJ9LAorCXsgIEVGSV9OT19NQVBQSU5HLCAgICAgICAgICAgICBMIk5vIG1hcHBpbmcifSwKKwl7ICBFRklfVElNRU9VVCwgICAgICAgICAgICAgICAgTCJUaW1lIG91dCJ9LAorCXsgIEVGSV9OT1RfU1RBUlRFRCwgICAgICAgICAgICBMIk5vdCBzdGFydGVkIn0sCisJeyAgRUZJX0FMUkVBRFlfU1RBUlRFRCwgICAgICAgIEwiQWxyZWFkeSBzdGFydGVkIn0sCisJeyAgRUZJX0FCT1JURUQsICAgICAgICAgICAgICAgIEwiQWJvcnRlZCJ9LAorCXsgIEVGSV9JQ01QX0VSUk9SLCAgICAgICAgICAgICBMIklDTVAgRXJyb3IifSwKKwl7ICBFRklfVEZUUF9FUlJPUiwgICAgICAgICAgICAgTCJURlRQIEVycm9yIn0sCisJeyAgRUZJX1BST1RPQ09MX0VSUk9SLCAgICAgICAgIEwiUHJvdG9jb2wgRXJyb3IifSwKKworCS8vIHdhcm5pbmdzCisJeyAgRUZJX1dBUk5fVU5LT1dOX0dMWVBILCAgICAgIEwiV2FybmluZyBVbmtub3duIEdseXBoIn0sCisJeyAgRUZJX1dBUk5fREVMRVRFX0ZBSUxVUkUsICAgIEwiV2FybmluZyBEZWxldGUgRmFpbHVyZSJ9LAorCXsgIEVGSV9XQVJOX1dSSVRFX0ZBSUxVUkUsICAgICBMIldhcm5pbmcgV3JpdGUgRmFpbHVyZSJ9LAorCXsgIEVGSV9XQVJOX0JVRkZFUl9UT09fU01BTEwsICBMIldhcm5pbmcgQnVmZmVyIFRvbyBTbWFsbCJ9LAorCXsgIDAsIE5VTEx9Cit9IDsKKworCitWT0lECitTdGF0dXNUb1N0cmluZyAoCisgICAgT1VUIENIQVIxNiAgICAgICAgICAqQnVmZmVyLAorICAgIElOIEVGSV9TVEFUVVMgICAgICAgU3RhdHVzCisgICAgKQoreworICAgIFVJTlROICAgICAgICAgICBJbmRleDsKKworICAgIGZvciAoSW5kZXggPSAwOyBFcnJvckNvZGVUYWJsZVtJbmRleF0uRGVzYzsgSW5kZXggKz0xKSB7CisgICAgICAgIGlmIChFcnJvckNvZGVUYWJsZVtJbmRleF0uQ29kZSA9PSBTdGF0dXMpIHsKKwkgICAgU3RyQ3B5IChCdWZmZXIsIEVycm9yQ29kZVRhYmxlW0luZGV4XS5EZXNjKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNQcmludCAoQnVmZmVyLCAwLCBMIiVYIiwgU3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2V2ZW50LmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMTZjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9ldmVudC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBldmVudC5jCisKK0Fic3RyYWN0OgorCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisKK0VGSV9FVkVOVAorTGliQ3JlYXRlUHJvdG9jb2xOb3RpZnlFdmVudCAoCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgKlByb3RvY29sR3VpZCwKKyAgICBJTiBFRklfVFBMICAgICAgICAgICAgICBOb3RpZnlUcGwsCisgICAgSU4gRUZJX0VWRU5UX05PVElGWSAgICAgTm90aWZ5RnVuY3Rpb24sCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKk5vdGlmeUNvbnRleHQsCisgICAgT1VUIFZPSUQgICAgICAgICAgICAgICAgKlJlZ2lzdHJhdGlvbgorICAgICkKK3sKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICBTdGF0dXM7CisgICAgRUZJX0VWRU5UICAgICAgICAgICAgICAgRXZlbnQ7CisKKyAgICAvLworICAgIC8vIENyZWF0ZSB0aGUgZXZlbnQKKyAgICAvLworCisgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoCisJCSAgICBCUy0+Q3JlYXRlRXZlbnQsCisJCQk1LAorCQkgICAgRVZUX05PVElGWV9TSUdOQUwsCisJCSAgICBOb3RpZnlUcGwsCisJCSAgICBOb3RpZnlGdW5jdGlvbiwKKwkJICAgIE5vdGlmeUNvbnRleHQsCisJCSAgICAmRXZlbnQKKwkJICAgICk7CisgICAgQVNTRVJUICghRUZJX0VSUk9SKFN0YXR1cykpOworCisgICAgLy8KKyAgICAvLyBSZWdpc3RlciBmb3IgcHJvdG9jb2wgbm90aWZhY3Rpb25zIG9uIHRoaXMgZXZlbnQKKyAgICAvLworCisgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoCisJCSAgICBCUy0+UmVnaXN0ZXJQcm90b2NvbE5vdGlmeSwKKwkJCTMsCisgICAgICAgICAgICAgICAgICAgIFByb3RvY29sR3VpZCwgCisgICAgICAgICAgICAgICAgICAgIEV2ZW50LCAKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBBU1NFUlQgKCFFRklfRVJST1IoU3RhdHVzKSk7CisKKyAgICAvLworICAgIC8vIEtpY2sgdGhlIGV2ZW50IHNvIHdlIHdpbGwgcGVyZm9ybSBhbiBpbml0aWFsIHBhc3Mgb2YKKyAgICAvLyBjdXJyZW50IGluc3RhbGxlZCBkcml2ZXJzCisgICAgLy8KKworICAgIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5TaWduYWxFdmVudCwgMSwgRXZlbnQpOworICAgIHJldHVybiBFdmVudDsKK30KKworCitFRklfU1RBVFVTCitXYWl0Rm9yU2luZ2xlRXZlbnQgKAorICAgIElOIEVGSV9FVkVOVCAgICAgICAgRXZlbnQsCisgICAgSU4gVUlOVDY0ICAgICAgICAgICBUaW1lb3V0IE9QVElPTkFMCisgICAgKQoreworICAgIEVGSV9TVEFUVVMgICAgICAgICAgU3RhdHVzOworICAgIFVJTlROICAgICAgICAgICAgICAgSW5kZXg7CisgICAgRUZJX0VWRU5UICAgICAgICAgICBUaW1lckV2ZW50OworICAgIEVGSV9FVkVOVCAgICAgICAgICAgV2FpdExpc3RbMl07CisKKyAgICBpZiAoVGltZW91dCkgeworICAgICAgICAvLworICAgICAgICAvLyBDcmVhdGUgYSB0aW1lciBldmVudAorICAgICAgICAvLworCisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5DcmVhdGVFdmVudCwgNSwgRVZUX1RJTUVSLCAwLCBOVUxMLCBOVUxMLCAmVGltZXJFdmVudCk7CisgICAgICAgIGlmICghRUZJX0VSUk9SKFN0YXR1cykpIHsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNldCB0aGUgdGltZXIgZXZlbnQKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIHVlZmlfY2FsbF93cmFwcGVyKEJTLT5TZXRUaW1lciwgMywgVGltZXJFdmVudCwgVGltZXJSZWxhdGl2ZSwgVGltZW91dCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgb3JpZ2luYWwgZXZlbnQgb3IgdGhlIHRpbWVyCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBXYWl0TGlzdFswXSA9IEV2ZW50OworICAgICAgICAgICAgV2FpdExpc3RbMV0gPSBUaW1lckV2ZW50OworICAgICAgICAgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPldhaXRGb3JFdmVudCwgMywgMiwgV2FpdExpc3QsICZJbmRleCk7CisgICAgICAgICAgICB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+Q2xvc2VFdmVudCwgMSwgVGltZXJFdmVudCk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aGUgdGltZXIgZXhwaXJlZCwgY2hhbmdlIHRoZSByZXR1cm4gdG8gdGltZWQgb3V0CisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpICAmJiAgSW5kZXggPT0gMSkgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IEVGSV9USU1FT1VUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vIHRpbWVvdXQuLi4ganVzdCB3YWl0IG9uIHRoZSBldmVudAorICAgICAgICAvLworCisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5XYWl0Rm9yRXZlbnQsIDMsIDEsICZFdmVudCwgJkluZGV4KTsKKyAgICAgICAgQVNTRVJUICghRUZJX0VSUk9SKFN0YXR1cykpOworICAgICAgICBBU1NFUlQgKEluZGV4ID09IDApOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKK1ZPSUQKK1dhaXRGb3JFdmVudFdpdGhUaW1lb3V0ICgKKyAgICBJTiAgRUZJX0VWRU5UICAgICAgIEV2ZW50LAorICAgIElOICBVSU5UTiAgICAgICAgICAgVGltZW91dCwKKyAgICBJTiAgVUlOVE4gICAgICAgICAgIFJvdywKKyAgICBJTiAgVUlOVE4gICAgICAgICAgIENvbHVtbiwKKyAgICBJTiAgQ0hBUjE2ICAgICAgICAgICpTdHJpbmcsCisgICAgSU4gIEVGSV9JTlBVVF9LRVkgICBUaW1lb3V0S2V5LAorICAgIE9VVCBFRklfSU5QVVRfS0VZICAgKktleQorICAgICkKK3sKKyAgICBFRklfU1RBVFVTICAgICAgU3RhdHVzOworCisgICAgZG8geworICAgICAgICBQcmludEF0IChDb2x1bW4sIFJvdywgU3RyaW5nLCBUaW1lb3V0KTsKKyAgICAgICAgU3RhdHVzID0gV2FpdEZvclNpbmdsZUV2ZW50IChFdmVudCwgMTAwMDAwMDApOworICAgICAgICBpZiAoU3RhdHVzID09IEVGSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAoIUVGSV9FUlJPUih1ZWZpX2NhbGxfd3JhcHBlcihTVC0+Q29uSW4tPlJlYWRLZXlTdHJva2UsIDIsIFNULT5Db25JbiwgS2V5KSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChUaW1lb3V0ID4gMCk7CisgICAgKktleSA9IFRpbWVvdXRLZXk7Cit9CisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2d1aWQuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2d1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjYyMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvZ3VpZC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBtaXNjLmMKKworQWJzdHJhY3Q6CisKKyAgICBNaXNjIEVGSSBzdXBwb3J0IGZ1bmN0aW9ucworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpbmNsdWRlICJsaWIuaCIKKworCisvLworLy8gQWRkaXRpb25hbCBLbm93biBndWlkcworLy8KKworI2RlZmluZSBTSEVMTF9JTlRFUkZBQ0VfUFJPVE9DT0wgXAorICAgIHsgMHg0N2M3YjIyMywgMHhjNDJhLCAweDExZDIsIHsweDhlLCAweDU3LCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworI2RlZmluZSBFTlZJUk9OTUVOVF9WQVJJQUJMRV9JRCAgXAorICAgIHsgMHg0N2M3YjIyNCwgMHhjNDJhLCAweDExZDIsIHsweDhlLCAweDU3LCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2J9IH0KKworI2RlZmluZSBERVZJQ0VfUEFUSF9NQVBQSU5HX0lEICBcCisgICAgeyAweDQ3YzdiMjI1LCAweGM0MmEsIDB4MTFkMiwgezB4OGUsIDB4NTcsIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCisjZGVmaW5lIFBST1RPQ09MX0lEX0lEICBcCisgICAgeyAweDQ3YzdiMjI2LCAweGM0MmEsIDB4MTFkMiwgezB4OGUsIDB4NTcsIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCisjZGVmaW5lIEFMSUFTX0lEICBcCisgICAgeyAweDQ3YzdiMjI3LCAweGM0MmEsIDB4MTFkMiwgezB4OGUsIDB4NTcsIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYn0gfQorCitzdGF0aWMgRUZJX0dVSUQgU2hlbGxJbnRlcmZhY2VQcm90b2NvbCA9IFNIRUxMX0lOVEVSRkFDRV9QUk9UT0NPTDsKK3N0YXRpYyBFRklfR1VJRCBTRW52SWQgICAgICAgICAgICAgICAgID0gRU5WSVJPTk1FTlRfVkFSSUFCTEVfSUQ7CitzdGF0aWMgRUZJX0dVSUQgU01hcElkICAgICAgICAgICAgICAgICA9IERFVklDRV9QQVRIX01BUFBJTkdfSUQ7CitzdGF0aWMgRUZJX0dVSUQgU1Byb3RJZCAgICAgICAgICAgICAgICA9IFBST1RPQ09MX0lEX0lEOworc3RhdGljIEVGSV9HVUlEIFNBbGlhc0lkICAgICAgICAgICAgICAgPSBBTElBU19JRDsKKworc3RhdGljIHN0cnVjdCB7CisgICAgRUZJX0dVSUQgICAgICAgICpHdWlkOworICAgIFdDSEFSICAgICAgICAgICAqR3VpZE5hbWU7Cit9IEtub3duR3VpZHNbXSA9IHsKKwl7ICAmTnVsbEd1aWQsICAgICAgICAgICAgICAgICAgTCJHMCJ9LAorCXsgICZFZmlHbG9iYWxWYXJpYWJsZSwgICAgICAgICBMIkVmaSJ9LAorCisJeyAgJlZhcmlhYmxlU3RvcmVQcm90b2NvbCwgICAgIEwidmFyc3RvcmUifSwKKwl7ICAmRGV2aWNlUGF0aFByb3RvY29sLCAgICAgICAgTCJkcGF0aCJ9LAorCXsgICZMb2FkZWRJbWFnZVByb3RvY29sLCAgICAgICBMImltYWdlIn0sCisJeyAgJlRleHRJblByb3RvY29sLCAgICAgICAgICAgIEwidHh0aW4ifSwKKwl7ICAmVGV4dE91dFByb3RvY29sLCAgICAgICAgICAgTCJ0eHRvdXQifSwKKwl7ICAmQmxvY2tJb1Byb3RvY29sLCAgICAgICAgICAgTCJibGtpbyJ9LAorCXsgICZEaXNrSW9Qcm90b2NvbCwgICAgICAgICAgICBMImRpc2tpbyJ9LAorCXsgICZGaWxlU3lzdGVtUHJvdG9jb2wsICAgICAgICBMImZzIn0sCisJeyAgJkxvYWRGaWxlUHJvdG9jb2wsICAgICAgICAgIEwibG9hZCJ9LAorCXsgICZEZXZpY2VJb1Byb3RvY29sLCAgICAgICAgICBMIkRldklvIn0sCisKKwl7ICAmR2VuZXJpY0ZpbGVJbmZvLCAgICAgICAgICAgTCJHZW5GaWxlSW5mbyJ9LAorCXsgICZGaWxlU3lzdGVtSW5mbywgICAgICAgICAgICBMIkZpbGVTeXNJbmZvIn0sCisKKwl7ICAmVW5pY29kZUNvbGxhdGlvblByb3RvY29sLCAgTCJ1bmljb2RlIn0sCisJeyAgJkxlZ2FjeUJvb3RQcm90b2NvbCwgICAgICAgIEwiTGVnYWN5Qm9vdCJ9LAorCXsgICZTZXJpYWxJb1Byb3RvY29sLCAgICAgICAgICBMInNlcmlhbGlvIn0sCisJeyAgJlZnYUNsYXNzUHJvdG9jb2wsICAgICAgICAgIEwidmdhY2xhc3MifSwKKwl7ICAmU2ltcGxlTmV0d29ya1Byb3RvY29sLCAgICAgTCJuZXQifSwKKwl7ICAmTmV0d29ya0ludGVyZmFjZUlkZW50aWZpZXJQcm90b2NvbCwgICAgTCJuaWkifSwKKwl7ICAmUHhlQmFzZUNvZGVQcm90b2NvbCwgICAgICAgTCJweGViYyJ9LAorCXsgICZQeGVDYWxsYmFja1Byb3RvY29sLCAgICAgICBMInB4ZWNiIn0sCisKKwl7ICAmVmFyaWFibGVTdG9yZVByb3RvY29sLCAgICAgTCJ2YXJzdG9yZSJ9LAorCXsgICZMZWdhY3lCb290UHJvdG9jb2wsICAgICAgICBMIkxlZ2FjeUJvb3QifSwKKwl7ICAmVmdhQ2xhc3NQcm90b2NvbCwgICAgICAgICAgTCJWZ2FDbGFzcyJ9LAorCXsgICZUZXh0T3V0U3BsaXRlclByb3RvY29sLCAgICBMIlR4dE91dFNwbGl0In0sCisJeyAgJkVycm9yT3V0U3BsaXRlclByb3RvY29sLCAgIEwiRXJyT3V0U3BsaXQifSwKKwl7ICAmVGV4dEluU3BsaXRlclByb3RvY29sLCAgICAgTCJUeHRJblNwbGl0In0sCisJeyAgJlBjQW5zaVByb3RvY29sLCAgICAgICAgICAgIEwiUGNBbnNpIn0sCisJeyAgJlZ0MTAwUHJvdG9jb2wsICAgICAgICAgICAgIEwiVnQxMDAifSwKKwl7ICAmVW5rbm93bkRldmljZSwgICAgICAgICAgICAgTCJVbmtub3duIERldmljZSJ9LAorCisJeyAgJkVmaVBhcnRUeXBlU3lzdGVtUGFydGl0aW9uR3VpZCwgICAgTCJFU1AifSwKKwl7ICAmRWZpUGFydFR5cGVMZWdhY3lNYnJHdWlkLCAgICAgICAgICBMIkdQVCBNQlIifSwKKworCXsgICZTaGVsbEludGVyZmFjZVByb3RvY29sLCAgICBMIlNoZWxsSW50In0sCisJeyAgJlNFbnZJZCwgICAgICAgICAgICAgICAgICAgIEwiU0VudiJ9LAorCXsgICZTUHJvdElkLCAgICAgICAgICAgICAgICAgICBMIlNoZWxsUHJvdElkIn0sCisJeyAgJlNNYXBJZCwgICAgICAgICAgICAgICAgICAgIEwiU2hlbGxEZXZQYXRoTWFwIn0sCisJeyAgJlNBbGlhc0lkLCAgICAgICAgICAgICAgICAgIEwiU2hlbGxBbGlhcyJ9LAorCisJeyAgTlVMTCB9Cit9OworCisvLworLy8KKy8vCisKK0xJU1RfRU5UUlkgICAgICAgICAgR3VpZExpc3Q7CisKKworVk9JRAorSW5pdGlhbGl6ZUd1aWQgKAorICAgIFZPSUQKKyAgICApCit7Cit9CisKK0lOVE4KK0NvbXBhcmVHdWlkKAorICAgIElOIEVGSV9HVUlEICAgICAqR3VpZDEsCisgICAgSU4gRUZJX0dVSUQgICAgICpHdWlkMgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIENvbXBhcmVzIHRvIEdVSURzCisKK0FyZ3VtZW50czoKKworICAgIEd1aWQxICAgICAgIC0gZ3VpZCB0byBjb21wYXJlCisgICAgR3VpZDIgICAgICAgLSBndWlkIHRvIGNvbXBhcmUKKworUmV0dXJuczoKKyAgICA9IDAgICAgIGlmIEd1aWQxID09IEd1aWQyCisKKy0tKi8KK3sKKyAgICByZXR1cm4gUnRDb21wYXJlR3VpZCAoR3VpZDEsIEd1aWQyKTsKK30KKworCitWT0lECitHdWlkVG9TdHJpbmcgKAorICAgIE9VVCBDSEFSMTYgICAgICAqQnVmZmVyLAorICAgIElOIEVGSV9HVUlEICAgICAqR3VpZAorICAgICkKK3sKKworICAgIFVJTlROICAgICAgICAgICBJbmRleDsKKworICAgIC8vCisgICAgLy8gRWxzZSwgKGZvciBub3cpIHVzZSBhZGRpdGlvbmFsIGludGVybmFsIGZ1bmN0aW9uIGZvciBtYXBwaW5nIGd1aWRzCisgICAgLy8KKworICAgIGZvciAoSW5kZXg9MDsgS25vd25HdWlkc1tJbmRleF0uR3VpZDsgSW5kZXgrKykgeworICAgICAgICBpZiAoQ29tcGFyZUd1aWQoR3VpZCwgS25vd25HdWlkc1tJbmRleF0uR3VpZCkgPT0gMCkgeworICAgICAgICAgICAgU1ByaW50IChCdWZmZXIsIDAsIEtub3duR3VpZHNbSW5kZXhdLkd1aWROYW1lKTsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIEVsc2UgZHVtcCBpdAorICAgIC8vCisKKyAgICBTUHJpbnQgKEJ1ZmZlciwgMCwgTCIlMDh4LSUwNHgtJTA0eC0lMDJ4JTAyeC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICBHdWlkLT5EYXRhMSwgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBHdWlkLT5EYXRhMiwKKyAgICAgICAgR3VpZC0+RGF0YTMsCisgICAgICAgIEd1aWQtPkRhdGE0WzBdLAorICAgICAgICBHdWlkLT5EYXRhNFsxXSwKKyAgICAgICAgR3VpZC0+RGF0YTRbMl0sCisgICAgICAgIEd1aWQtPkRhdGE0WzNdLAorICAgICAgICBHdWlkLT5EYXRhNFs0XSwKKyAgICAgICAgR3VpZC0+RGF0YTRbNV0sCisgICAgICAgIEd1aWQtPkRhdGE0WzZdLAorICAgICAgICBHdWlkLT5EYXRhNFs3XQorICAgICAgICApOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaGFuZC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaGFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGU0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9oYW5kLmMKQEAgLTAsMCArMSw2MzcgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGhhbmQuYworCitBYnN0cmFjdDoKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJlZmlzdGRhcmcuaCIgICAgICAgICAgICAgICAgICAgICAgICAvLyAhISEKKworCitFRklfU1RBVFVTCitMaWJMb2NhdGVQcm90b2NvbCAoCisgICAgSU4gIEVGSV9HVUlEICAgICpQcm90b2NvbEd1aWQsCisgICAgT1VUIFZPSUQgICAgICAgICoqSW50ZXJmYWNlCisgICAgKQorLy8KKy8vIEZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoaXMgUHJvdG9jb2wgaW4gdGhlIHN5c3RlbSBhbmQgcmV0dXJuIGl0J3MgaW50ZXJmYWNlCisvLworeworICAgIEVGSV9TVEFUVVMgICAgICBTdGF0dXM7CisgICAgVUlOVE4gICAgICAgICAgIE51bWJlckhhbmRsZXMsIEluZGV4OworICAgIEVGSV9IQU5ETEUgICAgICAqSGFuZGxlczsKKworICAgIAorICAgICpJbnRlcmZhY2UgPSBOVUxMOworICAgIFN0YXR1cyA9IExpYkxvY2F0ZUhhbmRsZSAoQnlQcm90b2NvbCwgUHJvdG9jb2xHdWlkLCBOVUxMLCAmTnVtYmVySGFuZGxlcywgJkhhbmRsZXMpOworICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICBERUJVRygoRF9JTkZPLCAiTGliTG9jYXRlUHJvdG9jb2w6IEhhbmRsZSBub3QgZm91bmRcbiIpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czsKKyAgICB9CisKKyAgICBmb3IgKEluZGV4PTA7IEluZGV4IDwgTnVtYmVySGFuZGxlczsgSW5kZXgrKykgeworICAgICAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SGFuZGxlUHJvdG9jb2wsIDMsIEhhbmRsZXNbSW5kZXhdLCBQcm90b2NvbEd1aWQsIEludGVyZmFjZSk7CisgICAgICAgIGlmICghRUZJX0VSUk9SKFN0YXR1cykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKEhhbmRsZXMpIHsKKyAgICAgICAgRnJlZVBvb2wgKEhhbmRsZXMpOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0VGSV9TVEFUVVMKK0xpYkxvY2F0ZUhhbmRsZSAoCisgICAgSU4gRUZJX0xPQ0FURV9TRUFSQ0hfVFlQRSAgICAgICBTZWFyY2hUeXBlLAorICAgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgKlByb3RvY29sIE9QVElPTkFMLAorICAgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKlNlYXJjaEtleSBPUFRJT05BTCwKKyAgICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpOb0hhbmRsZXMsCisgICAgT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAqKkJ1ZmZlcgorICAgICkKKworeworICAgIEVGSV9TVEFUVVMgICAgICAgICAgU3RhdHVzOworICAgIFVJTlROICAgICAgICAgICAgICAgQnVmZmVyU2l6ZTsKKworICAgIC8vCisgICAgLy8gSW5pdGlhbGl6ZSBmb3IgR3Jvd0J1ZmZlciBsb29wCisgICAgLy8KKworICAgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOworICAgICpCdWZmZXIgPSBOVUxMOworICAgIEJ1ZmZlclNpemUgPSA1MCAqIHNpemVvZihFRklfSEFORExFKTsKKworICAgIC8vCisgICAgLy8gQ2FsbCB0aGUgcmVhbCBmdW5jdGlvbgorICAgIC8vCisKKyAgICB3aGlsZSAoR3Jvd0J1ZmZlciAoJlN0YXR1cywgKFZPSUQgKiopIEJ1ZmZlciwgQnVmZmVyU2l6ZSkpIHsKKworICAgICAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcigKKwkJCUJTLT5Mb2NhdGVIYW5kbGUsCisJCQk1LAorICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgJkJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgfQorCisgICAgKk5vSGFuZGxlcyA9IEJ1ZmZlclNpemUgLyBzaXplb2YgKEVGSV9IQU5ETEUpOworICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICAqTm9IYW5kbGVzID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCitFRklfU1RBVFVTCitMaWJMb2NhdGVIYW5kbGVCeURpc2tTaWduYXR1cmUgKAorICAgIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgTUJSVHlwZSwKKyAgICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZVR5cGUsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqU2lnbmF0dXJlLAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKk5vSGFuZGxlcywKKyAgICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICoqQnVmZmVyCisgICAgKQorCit7CisgICAgRUZJX1NUQVRVUyAgICAgICAgICAgIFN0YXR1czsKKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZTsKKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgTm9CbG9ja0lvSGFuZGxlczsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgKkJsb2NrSW9CdWZmZXI7CisgICAgRUZJX0RFVklDRV9QQVRIICAgICAgICpEZXZpY2VQYXRoOworICAgIFVJTlROICAgICAgICAgICAgICAgICBJbmRleDsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgKlN0YXJ0LCAqTmV4dCwgKkRldlBhdGg7CisgICAgSEFSRERSSVZFX0RFVklDRV9QQVRIICpIYXJkRHJpdmVEZXZpY2VQYXRoOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICBNYXRjaDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgUHJldmlvdXNOb2RlSXNIYXJkRHJpdmVEZXZpY2VQYXRoOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIGZvciBHcm93QnVmZmVyIGxvb3AKKyAgICAvLworCisgICAgU3RhdHVzID0gRUZJX1NVQ0NFU1M7CisgICAgQmxvY2tJb0J1ZmZlciA9IE5VTEw7CisgICAgQnVmZmVyU2l6ZSA9IDUwICogc2l6ZW9mKEVGSV9IQU5ETEUpOworCisgICAgLy8KKyAgICAvLyBDYWxsIHRoZSByZWFsIGZ1bmN0aW9uCisgICAgLy8KKworICAgIHdoaWxlIChHcm93QnVmZmVyICgmU3RhdHVzLCAoVk9JRCAqKikmQmxvY2tJb0J1ZmZlciwgQnVmZmVyU2l6ZSkpIHsKKworICAgICAgICAvLworICAgICAgICAvLyBHZXQgbGlzdCBvZiBkZXZpY2UgaGFuZGxlcyB0aGF0IHN1cHBvcnQgdGhlIEJMT0NLX0lPIFByb3RvY29sLgorICAgICAgICAvLworCisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKAorCQkJQlMtPkxvY2F0ZUhhbmRsZSwKKwkJCTUsCisgICAgICAgICAgICAgICAgICAgICAgICBCeVByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgJkJsb2NrSW9Qcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAmQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrSW9CdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICB9CisKKyAgICBOb0Jsb2NrSW9IYW5kbGVzID0gQnVmZmVyU2l6ZSAvIHNpemVvZiAoRUZJX0hBTkRMRSk7CisgICAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgIE5vQmxvY2tJb0hhbmRsZXMgPSAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgdGhlcmUgd2FzIGFuIGVycm9yIG9yIHRoZXJlIGFyZSBubyBkZXZpY2UgaGFuZGxlcyB0aGF0IHN1cHBvcnQgCisgICAgLy8gdGhlIEJMT0NLX0lPIFByb3RvY29sLCB0aGVuIHJldHVybi4KKyAgICAvLworCisgICAgaWYgKE5vQmxvY2tJb0hhbmRsZXMgPT0gMCkgeworICAgICAgICBGcmVlUG9vbChCbG9ja0lvQnVmZmVyKTsKKyAgICAgICAgKk5vSGFuZGxlcyA9IDA7CisgICAgICAgICpCdWZmZXIgPSBOVUxMOworICAgICAgICByZXR1cm4gU3RhdHVzOworICAgIH0KKworICAgIC8vCisgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgZGV2aWNlIGhhbmRsZXMgdGhhdCBzdXBwb3J0IHRoZSBCTE9DS19JTyBQcm90b2NvbAorICAgIC8vCisKKyAgICAqTm9IYW5kbGVzID0gMDsKKworICAgIGZvcihJbmRleD0wO0luZGV4PE5vQmxvY2tJb0hhbmRsZXM7SW5kZXgrKykgeworCisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKAorCQkJCSAgICAgQlMtPkhhbmRsZVByb3RvY29sLCAKKwkJCQkJMywKKwkJCQkgICAgIEJsb2NrSW9CdWZmZXJbSW5kZXhdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRGV2aWNlUGF0aFByb3RvY29sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9JRCopJkRldmljZVBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNlYXJjaCBEZXZpY2VQYXRoIGZvciBhIEhhcmQgRHJpdmUgTWVkaWEgRGV2aWNlIFBhdGggbm9kZS4KKyAgICAgICAgLy8gSWYgb25lIGlzIGZvdW5kLCB0aGVuIHNlZSBpZiBpdCBtYXRjaGVzIHRoZSBzaWduYXR1cmUgdGhhdCB3YXMKKyAgICAgICAgLy8gcGFzc2VkIGluLiAgSWYgaXQgZG9lcyBtYXRjaCwgYW5kIHRoZSBuZXh0IG5vZGUgaXMgdGhlIEVuZCBvZiB0aGUKKyAgICAgICAgLy8gZGV2aWNlIHBhdGgsIGFuZCB0aGUgcHJldmlvdXMgbm9kZSBpcyBub3QgYSBIYXJkIERyaXZlIE1lZGlhIERldmljZQorICAgICAgICAvLyBQYXRoLCB0aGVuIHdlIGhhdmUgZm91bmQgYSBtYXRjaC4KKyAgICAgICAgLy8KKworICAgICAgICBNYXRjaCA9IEZBTFNFOworCisgICAgICAgIGlmIChEZXZpY2VQYXRoICE9IE5VTEwpIHsKKworICAgICAgICAgICAgUHJldmlvdXNOb2RlSXNIYXJkRHJpdmVEZXZpY2VQYXRoID0gRkFMU0U7CisKKyAgICAgICAgICAgIERldlBhdGggPSBEZXZpY2VQYXRoOworICAgICAgICAgICAgU3RhcnQgPSBEZXZQYXRoOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBkZXZpY2UgcGF0aCB0eXBlCisgICAgICAgICAgICAvLyAgICAKKworICAgICAgICAgICAgZm9yICg7IDspIHsKKworICAgICAgICAgICAgICAgIGlmICgoRGV2aWNlUGF0aFR5cGUoRGV2UGF0aCkgPT0gTUVESUFfREVWSUNFX1BBVEgpICYmCisgICAgICAgICAgICAgICAgICAgIChEZXZpY2VQYXRoU3ViVHlwZShEZXZQYXRoKSA9PSBNRURJQV9IQVJERFJJVkVfRFApKSB7CisKKyAgICAgICAgICAgICAgICAgICAgSGFyZERyaXZlRGV2aWNlUGF0aCA9IChIQVJERFJJVkVfREVWSUNFX1BBVEggKikoRGV2UGF0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFByZXZpb3VzTm9kZUlzSGFyZERyaXZlRGV2aWNlUGF0aCA9PSBGQUxTRSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBOZXh0ID0gTmV4dERldmljZVBhdGhOb2RlKERldlBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzRGV2aWNlUGF0aEVuZFR5cGUoTmV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKEhhcmREcml2ZURldmljZVBhdGgtPk1CUlR5cGUgPT0gTUJSVHlwZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhhcmREcml2ZURldmljZVBhdGgtPlNpZ25hdHVyZVR5cGUgPT0gU2lnbmF0dXJlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChTaWduYXR1cmVUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTSUdOQVRVUkVfVFlQRV9NQlI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKChVSU5UMzIgKikoU2lnbmF0dXJlKSkgPT0gKihVSU5UMzIgKikoJihIYXJkRHJpdmVEZXZpY2VQYXRoLT5TaWduYXR1cmVbMF0pKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0lHTkFUVVJFX1RZUEVfR1VJRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbXBhcmVHdWlkKChFRklfR1VJRCAqKVNpZ25hdHVyZSwoRUZJX0dVSUQgKikoJihIYXJkRHJpdmVEZXZpY2VQYXRoLT5TaWduYXR1cmVbMF0pKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQcmV2aW91c05vZGVJc0hhcmREcml2ZURldmljZVBhdGggPSBUUlVFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByZXZpb3VzTm9kZUlzSGFyZERyaXZlRGV2aWNlUGF0aCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChJc0RldmljZVBhdGhFbmQoRGV2UGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRGV2UGF0aCA9IE5leHREZXZpY2VQYXRoTm9kZShEZXZQYXRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgaWYgKE1hdGNoID09IEZBTFNFKSB7CisgICAgICAgICAgICBCbG9ja0lvQnVmZmVyW0luZGV4XSA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqTm9IYW5kbGVzID0gKk5vSGFuZGxlcyArIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlIGFyZSBubyBtYXRjaGVzLCB0aGVuIHJldHVybgorICAgIC8vCisKKyAgICBpZiAoKk5vSGFuZGxlcyA9PSAwKSB7CisgICAgICAgIEZyZWVQb29sKEJsb2NrSW9CdWZmZXIpOworICAgICAgICAqTm9IYW5kbGVzID0gMDsKKyAgICAgICAgKkJ1ZmZlciA9IE5VTEw7CisgICAgICAgIHJldHVybiBFRklfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmV0dXJuIGJ1ZmZlciBvZiBkZXZpY2UgaGFuZGxlcy4KKyAgICAvLworCisgICAgKkJ1ZmZlciA9IEFsbG9jYXRlUG9vbCgqTm9IYW5kbGVzICogc2l6ZW9mKEVGSV9IQU5ETEUpKTsKKworICAgIGlmICgqQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgRnJlZVBvb2woQmxvY2tJb0J1ZmZlcik7CisgICAgICAgICpOb0hhbmRsZXMgPSAwOworICAgICAgICAqQnVmZmVyID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTOworICAgIH0KKworICAgIC8vCisgICAgLy8gQnVpbGQgbGlzdCBvZiBtYXRjaGluZyBkZXZpY2UgaGFuZGxlcy4KKyAgICAvLworCisgICAgKk5vSGFuZGxlcyA9IDA7CisgICAgZm9yKEluZGV4PTA7SW5kZXg8Tm9CbG9ja0lvSGFuZGxlcztJbmRleCsrKSB7CisgICAgICAgIGlmIChCbG9ja0lvQnVmZmVyW0luZGV4XSAhPSBOVUxMKSB7CisgICAgICAgICAgICAoKkJ1ZmZlcilbKk5vSGFuZGxlc10gPSBCbG9ja0lvQnVmZmVyW0luZGV4XTsKKyAgICAgICAgICAgICpOb0hhbmRsZXMgPSAqTm9IYW5kbGVzICsgMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZyZWVQb29sKEJsb2NrSW9CdWZmZXIpOworCisgICAgcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCitFRklfRklMRV9IQU5ETEUKK0xpYk9wZW5Sb290ICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgRGV2aWNlSGFuZGxlCisgICAgKQoreworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgICBTdGF0dXM7CisgICAgRUZJX0ZJTEVfSU9fSU5URVJGQUNFICAgICAgICpWb2x1bWU7CisgICAgRUZJX0ZJTEVfSEFORExFICAgICAgICAgICAgIEZpbGU7CisKKworICAgIC8vCisgICAgLy8gRmlsZSB0aGUgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIHRvIHRoZSBkZXZpY2UKKyAgICAvLworCisgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkhhbmRsZVByb3RvY29sLCAzLCBEZXZpY2VIYW5kbGUsICZGaWxlU3lzdGVtUHJvdG9jb2wsIChWT0lEKikmVm9sdW1lKTsKKworICAgIC8vCisgICAgLy8gT3BlbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHZvbHVtZSAKKyAgICAvLworCisgICAgaWYgKCFFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihWb2x1bWUtPk9wZW5Wb2x1bWUsIDIsIFZvbHVtZSwgJkZpbGUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gRG9uZQorICAgIC8vCisKKyAgICByZXR1cm4gRUZJX0VSUk9SKFN0YXR1cykgPyBOVUxMIDogRmlsZTsKK30KKworRUZJX0ZJTEVfSU5GTyAqCitMaWJGaWxlSW5mbyAoCisgICAgSU4gRUZJX0ZJTEVfSEFORExFICAgICAgRkhhbmQKKyAgICApCit7CisgICAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgU3RhdHVzOworICAgIEVGSV9GSUxFX0lORk8gICAgICAgICAgICpCdWZmZXI7CisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZTsKKworICAgIC8vCisgICAgLy8gSW5pdGlhbGl6ZSBmb3IgR3Jvd0J1ZmZlciBsb29wCisgICAgLy8KKworICAgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOworICAgIEJ1ZmZlciA9IE5VTEw7CisgICAgQnVmZmVyU2l6ZSA9IFNJWkVfT0ZfRUZJX0ZJTEVfSU5GTyArIDIwMDsKKworICAgIC8vCisgICAgLy8gQ2FsbCB0aGUgcmVhbCBmdW5jdGlvbgorICAgIC8vCisKKyAgICB3aGlsZSAoR3Jvd0J1ZmZlciAoJlN0YXR1cywgKFZPSUQgKiopICZCdWZmZXIsIEJ1ZmZlclNpemUpKSB7CisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKAorCQkgICAgRkhhbmQtPkdldEluZm8sCisJCQk0LAorICAgICAgICAgICAgICAgICAgICBGSGFuZCwKKyAgICAgICAgICAgICAgICAgICAgJkdlbmVyaWNGaWxlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgJkJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICApOworICAgIH0KKworICAgIHJldHVybiBCdWZmZXI7Cit9CisKKyAgICAKK0VGSV9GSUxFX1NZU1RFTV9JTkZPICoKK0xpYkZpbGVTeXN0ZW1JbmZvICgKKyAgICBJTiBFRklfRklMRV9IQU5ETEUgICAgICBGSGFuZAorICAgICkKK3sKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICBTdGF0dXM7CisgICAgRUZJX0ZJTEVfU1lTVEVNX0lORk8gICAgKkJ1ZmZlcjsKKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIGZvciBHcm93QnVmZmVyIGxvb3AKKyAgICAvLworCisgICAgU3RhdHVzID0gRUZJX1NVQ0NFU1M7CisgICAgQnVmZmVyID0gTlVMTDsKKyAgICBCdWZmZXJTaXplID0gU0laRV9PRl9FRklfRklMRV9TWVNURU1fSU5GTyArIDIwMDsKKworICAgIC8vCisgICAgLy8gQ2FsbCB0aGUgcmVhbCBmdW5jdGlvbgorICAgIC8vCisKKyAgICB3aGlsZSAoR3Jvd0J1ZmZlciAoJlN0YXR1cywgKFZPSUQgKiopICZCdWZmZXIsIEJ1ZmZlclNpemUpKSB7CisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKAorCQkgICAgRkhhbmQtPkdldEluZm8sCisJCQk0LAorICAgICAgICAgICAgICAgICAgICBGSGFuZCwKKyAgICAgICAgICAgICAgICAgICAgJkZpbGVTeXN0ZW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAmQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorCisgICAgcmV0dXJuIEJ1ZmZlcjsKK30KKworRUZJX0ZJTEVfU1lTVEVNX1ZPTFVNRV9MQUJFTF9JTkZPICoKK0xpYkZpbGVTeXN0ZW1Wb2x1bWVMYWJlbEluZm8gKAorICAgIElOIEVGSV9GSUxFX0hBTkRMRSAgICAgIEZIYW5kCisgICAgKQoreworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXM7CisgICAgRUZJX0ZJTEVfU1lTVEVNX1ZPTFVNRV9MQUJFTF9JTkZPICpCdWZmZXI7CisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemU7CisKKyAgICAvLworICAgIC8vIEluaXRpYWxpemUgZm9yIEdyb3dCdWZmZXIgbG9vcAorICAgIC8vCisKKyAgICBTdGF0dXMgPSBFRklfU1VDQ0VTUzsKKyAgICBCdWZmZXIgPSBOVUxMOworICAgIEJ1ZmZlclNpemUgPSBTSVpFX09GX0VGSV9GSUxFX1NZU1RFTV9WT0xVTUVfTEFCRUxfSU5GTyArIDIwMDsKKworICAgIC8vCisgICAgLy8gQ2FsbCB0aGUgcmVhbCBmdW5jdGlvbgorICAgIC8vCisKKyAgICB3aGlsZSAoR3Jvd0J1ZmZlciAoJlN0YXR1cywgKFZPSUQgKiopICZCdWZmZXIsIEJ1ZmZlclNpemUpKSB7CisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKAorCQkgICAgRkhhbmQtPkdldEluZm8sCisJCQk0LAorICAgICAgICAgICAgICAgICAgICBGSGFuZCwKKyAgICAgICAgICAgICAgICAgICAgJkZpbGVTeXN0ZW1Wb2x1bWVMYWJlbEluZm8sCisgICAgICAgICAgICAgICAgICAgICZCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICBCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CisKKyAgICByZXR1cm4gQnVmZmVyOworfQorCisgICAgCisKK0VGSV9TVEFUVVMKK0xpYkluc3RhbGxQcm90b2NvbEludGVyZmFjZXMgKAorICAgIElOIE9VVCBFRklfSEFORExFICAgICAgICAgICAqSGFuZGxlLAorICAgIC4uLgorICAgICkKK3sKKyAgICB2YV9saXN0ICAgICAgICAgYXJnczsKKyAgICBFRklfU1RBVFVTICAgICAgU3RhdHVzOworICAgIEVGSV9HVUlEICAgICAgICAqUHJvdG9jb2w7CisgICAgVk9JRCAgICAgICAgICAgICpJbnRlcmZhY2U7CisgICAgRUZJX1RQTCAgICAgICAgIE9sZFRwbDsKKyAgICBVSU5UTiAgICAgICAgICAgSW5kZXg7CisgICAgRUZJX0hBTkRMRSAgICAgIE9sZEhhbmRsZTsKKworICAgIC8vCisgICAgLy8gU3luY3Jvbml6ZSB3aXRoIG5vdGlmY2F0aW9ucworICAgIC8vIAorCisgICAgT2xkVHBsID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPlJhaXNlVFBMLCAxLCBUUExfTk9USUZZKTsKKyAgICBPbGRIYW5kbGUgPSAqSGFuZGxlOworCisgICAgLy8KKyAgICAvLyBJbnN0YWxsIHRoZSBwcm90b2NvbCBpbnRlcmZhY2VzCisgICAgLy8KKworICAgIEluZGV4ID0gMDsKKyAgICBTdGF0dXMgPSBFRklfU1VDQ0VTUzsKKyAgICB2YV9zdGFydCAoYXJncywgSGFuZGxlKTsKKworICAgIHdoaWxlICghRUZJX0VSUk9SKFN0YXR1cykpIHsKKworICAgICAgICAvLworICAgICAgICAvLyBJZiBwcm90b2NvbCBpcyBOVUxMLCB0aGVuIGl0J3MgdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgICAgICAvLworCisgICAgICAgIFByb3RvY29sID0gdmFfYXJnKGFyZ3MsIEVGSV9HVUlEICopOworICAgICAgICBpZiAoIVByb3RvY29sKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEludGVyZmFjZSA9IHZhX2FyZyhhcmdzLCBWT0lEICopOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEluc3RhbGwgaXQKKyAgICAgICAgLy8KKworICAgICAgICBERUJVRygoRF9JTkZPLCAiTGliSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlOiAlZCAleFxuIiwgUHJvdG9jb2wsIEludGVyZmFjZSkpOworICAgICAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SW5zdGFsbFByb3RvY29sSW50ZXJmYWNlLCA0LCBIYW5kbGUsIFByb3RvY29sLCBFRklfTkFUSVZFX0lOVEVSRkFDRSwgSW50ZXJmYWNlKTsKKyAgICAgICAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4ICs9IDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIHJlbW92ZSBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZXJlCisgICAgLy8gaW5zdGFsbGVkIHdpdGhvdXQgYW55IGVycm9ycworICAgIC8vCisKKyAgICBpZiAoRUZJX0VSUk9SKFN0YXR1cykpIHsKKyAgICAgICAgdmFfc3RhcnQgKGFyZ3MsIEhhbmRsZSk7CisgICAgICAgIHdoaWxlIChJbmRleCkgeworCisgICAgICAgICAgICBQcm90b2NvbCA9IHZhX2FyZyhhcmdzLCBFRklfR1VJRCAqKTsKKyAgICAgICAgICAgIEludGVyZmFjZSA9IHZhX2FyZyhhcmdzLCBWT0lEICopOworICAgICAgICAgICAgdWVmaV9jYWxsX3dyYXBwZXIoQlMtPlVuaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlLCAzLCAqSGFuZGxlLCBQcm90b2NvbCwgSW50ZXJmYWNlKTsKKworICAgICAgICAgICAgSW5kZXggLT0gMTsKKyAgICAgICAgfSAgICAgICAgCisKKyAgICAgICAgKkhhbmRsZSA9IE9sZEhhbmRsZTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIERvbmUKKyAgICAvLworCisgICAgdWVmaV9jYWxsX3dyYXBwZXIoQlMtPlJlc3RvcmVUUEwsIDEsIE9sZFRwbCk7CisgICAgcmV0dXJuIFN0YXR1czsKK30KKworCitWT0lECitMaWJVbmluc3RhbGxQcm90b2NvbEludGVyZmFjZXMgKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgIEhhbmRsZSwKKyAgICAuLi4KKyAgICApCit7CisgICAgdmFfbGlzdCAgICAgICAgIGFyZ3M7CisgICAgRUZJX1NUQVRVUyAgICAgIFN0YXR1czsKKyAgICBFRklfR1VJRCAgICAgICAgKlByb3RvY29sOworICAgIFZPSUQgICAgICAgICAgICAqSW50ZXJmYWNlOworCisgICAgCisgICAgdmFfc3RhcnQgKGFyZ3MsIEhhbmRsZSk7CisgICAgZm9yICg7IDspIHsKKworICAgICAgICAvLworICAgICAgICAvLyBJZiBwcm90b2NvbCBpcyBOVUxMLCB0aGVuIGl0J3MgdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgICAgICAvLworCisgICAgICAgIFByb3RvY29sID0gdmFfYXJnKGFyZ3MsIEVGSV9HVUlEICopOworICAgICAgICBpZiAoIVByb3RvY29sKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEludGVyZmFjZSA9IHZhX2FyZyhhcmdzLCBWT0lEICopOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFVuaW5zdGFsbCBpdAorICAgICAgICAvLworCisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5Vbmluc3RhbGxQcm90b2NvbEludGVyZmFjZSwgMywgSGFuZGxlLCBQcm90b2NvbCwgSW50ZXJmYWNlKTsKKyAgICAgICAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgICAgICBERUJVRygoRF9FUlJPUiwgIkxpYlVuaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlczogZmFpbGVkICVnLCAlclxuIiwgUHJvdG9jb2wsIEhhbmRsZSkpOworICAgICAgICB9CisgICAgfQorfSAgICAKKworCitFRklfU1RBVFVTCitMaWJSZWluc3RhbGxQcm90b2NvbEludGVyZmFjZXMgKAorICAgIElOIE9VVCBFRklfSEFORExFICAgICAgICAgICAqSGFuZGxlLAorICAgIC4uLgorICAgICkKK3sKKyAgICB2YV9saXN0ICAgICAgICAgYXJnczsKKyAgICBFRklfU1RBVFVTICAgICAgU3RhdHVzOworICAgIEVGSV9HVUlEICAgICAgICAqUHJvdG9jb2w7CisgICAgVk9JRCAgICAgICAgICAgICpPbGRJbnRlcmZhY2UsICpOZXdJbnRlcmZhY2U7CisgICAgRUZJX1RQTCAgICAgICAgIE9sZFRwbDsKKyAgICBVSU5UTiAgICAgICAgICAgSW5kZXg7CisKKyAgICAvLworICAgIC8vIFN5bmNyb25pemUgd2l0aCBub3RpZmNhdGlvbnMKKyAgICAvLyAKKworICAgIE9sZFRwbCA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5SYWlzZVRQTCwgMSwgVFBMX05PVElGWSk7CisKKyAgICAvLworICAgIC8vIEluc3RhbGwgdGhlIHByb3RvY29sIGludGVyZmFjZXMKKyAgICAvLworCisgICAgSW5kZXggPSAwOworICAgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOworICAgIHZhX3N0YXJ0IChhcmdzLCBIYW5kbGUpOworCisgICAgd2hpbGUgKCFFRklfRVJST1IoU3RhdHVzKSkgeworCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHByb3RvY29sIGlzIE5VTEwsIHRoZW4gaXQncyB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgICAgIC8vCisKKyAgICAgICAgUHJvdG9jb2wgPSB2YV9hcmcoYXJncywgRUZJX0dVSUQgKik7CisgICAgICAgIGlmICghUHJvdG9jb2wpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgT2xkSW50ZXJmYWNlID0gdmFfYXJnKGFyZ3MsIFZPSUQgKik7CisgICAgICAgIE5ld0ludGVyZmFjZSA9IHZhX2FyZyhhcmdzLCBWT0lEICopOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlaW5zdGFsbCBpdAorICAgICAgICAvLworCisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5SZWluc3RhbGxQcm90b2NvbEludGVyZmFjZSwgNCwgSGFuZGxlLCBQcm90b2NvbCwgT2xkSW50ZXJmYWNlLCBOZXdJbnRlcmZhY2UpOworICAgICAgICBpZiAoRUZJX0VSUk9SKFN0YXR1cykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXggKz0gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlIHdhcyBhbiBlcnJvciwgdW5kbyBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZXJlCisgICAgLy8gcmVpbnN0YWxsZWQgd2l0aG91dCBhbnkgZXJyb3JzCisgICAgLy8KKworICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICB2YV9zdGFydCAoYXJncywgSGFuZGxlKTsKKyAgICAgICAgd2hpbGUgKEluZGV4KSB7CisKKyAgICAgICAgICAgIFByb3RvY29sID0gdmFfYXJnKGFyZ3MsIEVGSV9HVUlEICopOworICAgICAgICAgICAgT2xkSW50ZXJmYWNlID0gdmFfYXJnKGFyZ3MsIFZPSUQgKik7CisgICAgICAgICAgICBOZXdJbnRlcmZhY2UgPSB2YV9hcmcoYXJncywgVk9JRCAqKTsKKworICAgICAgICAgICAgdWVmaV9jYWxsX3dyYXBwZXIoQlMtPlJlaW5zdGFsbFByb3RvY29sSW50ZXJmYWNlLCA0LCBIYW5kbGUsIFByb3RvY29sLCBOZXdJbnRlcmZhY2UsIE9sZEludGVyZmFjZSk7CisKKyAgICAgICAgICAgIEluZGV4IC09IDE7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKworICAgIC8vCisgICAgLy8gRG9uZQorICAgIC8vCisKKyAgICB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+UmVzdG9yZVRQTCwgMSwgT2xkVHBsKTsKKyAgICByZXR1cm4gU3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaHcuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2NTFhZAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2h3LmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGh3LmMKKworQWJzdHJhY3Q6CisKKyAgICBEZWJ1ZyBsaWJyYXJ5IGZ1bmN0aW9ucyBmb3IgSGFyZHdhcmUgSU8gYWNjZXNzCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisKK0VGSV9TVEFUVVMKK0luaXRpYWxpemVHbG9iYWxJb0RldmljZSAoCisgICAgICAgIElOICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgKkRldmljZVBhdGgsCisgICAgICAgIElOICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICAgICAgICBJTiAgQ0hBUjggICAgICAgICAgICAgICAgICAgICAgICpFcnJvclN0ciwKKyAgICAgICAgT1VUIEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAgICAqKkdsb2JhbElvRm5jcyAKKyAgICAgICAgKQorLyorKworCitSb3V0aW5lIERlc2NyaXB0aW9uOgorCisgICAgQ2hlY2sgdG8gc2VlIGlmIERldmljZVBhdGggZXhpc3RzIGZvciBhIGdpdmVuIFByb3RvY29sLiBSZXR1cm4gRXJyb3IgaWYgaXQgCisgICAgZXhpc3RzLiBSZXR1cm4gR2xvYmFsSW9GdW5jcyBzZXQgbWF0Y2ggdGhlIERldmljZVBhdGgKKworICBBcmd1bWVudHM6CisKKyAgICBEZXZpY2VQYXRoICAgICAgLSB0byBvcGVyYXRlIG9uCisgICAgUHJvdG9jb2wgICAgICAgIC0gdG8gY2hlY2sgdGhlIERldmljZVBhdGggYWdhaW5zdAorICAgIEVycm9yU3RyICAgICAgICAtIEFTQ0lJIHN0cmluZyB0byBkaXNwbGF5IG9uIGVycm9yCisgICAgR2xvYmFsSW9GbmNzICAgIC0gUmV0dXJuZWQgd2l0aCBEZXZpY2VJb1Byb3RvY29sIGZvciB0aGUgRGV2aWNlUGF0aAorCitSZXR1cm5zOgorCisgICAgUGFzcyBvciBGYWlsIGJhc2VkIG9uICB3ZXRoZXIgR2xvYmFsSW9GbmNzIHdoZXJlIGZvdW5kCisKKy0tKi8KK3sKKyAgICBFRklfU1RBVFVTICAgICAgU3RhdHVzOworICAgIEVGSV9IQU5ETEUgICAgICBIYW5kbGU7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGRldmljZSBwYXRoIGFscmVhZHkgaGFzIFByb3RvY29sIG9uIGl0LgorICAgIC8vICBpZiBzbyB3ZSBhcmUgbG9hZGluZyByZWN1cnNpdmx5IGFuZCBzaG91bGQgZXhpdCB3aXRoIGFuIGVycm9yCisgICAgLy8KKyAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+TG9jYXRlRGV2aWNlUGF0aCwgMywgUHJvdG9jb2wsICZEZXZpY2VQYXRoLCAmSGFuZGxlKTsKKyAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgIERFQlVHICgoRF9JTklULCAiRGV2aWNlIEFscmVhZHkgTG9hZGVkIGZvciAlYSBkZXZpY2VcbiIsIEVycm9yU3RyKSk7CisgICAgICAgIHJldHVybiBFRklfTE9BRF9FUlJPUjsKKyAgICB9CisKKyAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+TG9jYXRlRGV2aWNlUGF0aCwgMywgJkRldmljZUlvUHJvdG9jb2wsICZEZXZpY2VQYXRoLCAmSGFuZGxlKTsKKyAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5IYW5kbGVQcm90b2NvbCwgMywgSGFuZGxlLCAmRGV2aWNlSW9Qcm90b2NvbCwgKFZPSUQqKUdsb2JhbElvRm5jcyk7CisgICAgfQorCisgICAgQVNTRVJUICghRUZJX0VSUk9SKFN0YXR1cykpOworICAgIHJldHVybiBTdGF0dXM7Cit9CisKK1VJTlQzMiAKK1JlYWRQb3J0ICgKKyAgICAgICAgSU4gIEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAgICAqR2xvYmFsSW9GbmNzLCAKKyAgICAgICAgSU4gIEVGSV9JT19XSURUSCAgICAgICAgICAgICAgICBXaWR0aCwKKyAgICAgICAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBQb3J0CisgICAgICAgICkKK3sKKyAgICBVSU5UMzIgICAgICAgRGF0YTsKKyAgICBFRklfU1RBVFVTICBTdGF0dXM7CisKKyAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihHbG9iYWxJb0ZuY3MtPklvLlJlYWQsIDUsIEdsb2JhbElvRm5jcywgV2lkdGgsIChVSU5UNjQpUG9ydCwgMSwgJkRhdGEpOworICAgIEFTU0VSVCghRUZJX0VSUk9SKFN0YXR1cykpOworICAgIHJldHVybiBEYXRhOworfQorCitVSU5UMzIgCitXcml0ZVBvcnQgKAorICAgICAgICBJTiAgRUZJX0RFVklDRV9JT19JTlRFUkZBQ0UgICAgICpHbG9iYWxJb0ZuY3MsIAorICAgICAgICBJTiAgRUZJX0lPX1dJRFRIICAgICAgICAgICAgICAgIFdpZHRoLAorICAgICAgICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIFBvcnQsCisgICAgICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgRGF0YQorICAgICAgICApCit7CisgICAgRUZJX1NUQVRVUyAgU3RhdHVzOworCisgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoR2xvYmFsSW9GbmNzLT5Jby5Xcml0ZSwgNSwgR2xvYmFsSW9GbmNzLCBXaWR0aCwgKFVJTlQ2NClQb3J0LCAxLCAmRGF0YSk7CisgICAgQVNTRVJUKCFFRklfRVJST1IoU3RhdHVzKSk7CisgICAgcmV0dXJuIChVSU5UMzIpRGF0YTsKK30KKworVUlOVDMyIAorUmVhZFBjaUNvbmZpZyAoCisgICAgICAgIElOICBFRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgICAgKkdsb2JhbElvRm5jcywgCisgICAgICAgIElOICBFRklfSU9fV0lEVEggICAgICAgICAgICAgICAgV2lkdGgsCisgICAgICAgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcworICAgICAgICApCit7CisgICAgVUlOVDMyICAgICAgIERhdGE7CisgICAgRUZJX1NUQVRVUyAgU3RhdHVzOworCisgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoR2xvYmFsSW9GbmNzLT5QY2kuUmVhZCwgNSwgR2xvYmFsSW9GbmNzLCBXaWR0aCwgKFVJTlQ2NClBZGRyZXNzLCAxLCAmRGF0YSk7CisgICAgQVNTRVJUKCFFRklfRVJST1IoU3RhdHVzKSk7CisgICAgcmV0dXJuIERhdGE7Cit9CisKK1VJTlQzMiAKK1dyaXRlUGNpQ29uZmlnICgKKyAgICAgICAgSU4gIEVGSV9ERVZJQ0VfSU9fSU5URVJGQUNFICAgICAqR2xvYmFsSW9GbmNzLCAKKyAgICAgICAgSU4gIEVGSV9JT19XSURUSCAgICAgICAgICAgICAgICBXaWR0aCwKKyAgICAgICAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzLAorICAgICAgICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIERhdGEKKyAgICAgICAgKQoreworICAgIEVGSV9TVEFUVVMgIFN0YXR1czsKKworICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEdsb2JhbElvRm5jcy0+UGNpLldyaXRlLCA1LCBHbG9iYWxJb0ZuY3MsIFdpZHRoLCAoVUlOVDY0KUFkZHJlc3MsIDEsICZEYXRhKTsKKyAgICBBU1NFUlQoIUVGSV9FUlJPUihTdGF0dXMpKTsKKyAgICByZXR1cm4gKFVJTlQzMilEYXRhOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWEzMi9lZmlfc3R1Yi5TIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWEzMi9lZmlfc3R1Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGVhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9pYTMyL2VmaV9zdHViLlMKQEAgLTAsMCArMSBAQAorLyogVGhpcyBzdHViIGlzIGEgc3R1YiB0byBtYWtlIHRoZSBidWlsZCBoYXBweSAqLwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWEzMi9pbml0cGxhdC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWEzMi9pbml0cGxhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmVhODIKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9pYTMyL2luaXRwbGF0LmMKQEAgLTAsMCArMSwyOCBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgaW5pdHBsYXQuYworCitBYnN0cmFjdDoKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpbmNsdWRlICJsaWIuaCIKKworVk9JRAorSW5pdGlhbGl6ZUxpYlBsYXRmb3JtICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgICBJTiBFRklfU1lTVEVNX1RBQkxFICAgICAqU3lzdGVtVGFibGUKKyAgICApCisKK3sKK30KKwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWEzMi9tYXRoLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9pYTMyL21hdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQwMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWEzMi9tYXRoLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIG1hdGguYworCitBYnN0cmFjdDoKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpbmNsdWRlICJsaWIuaCIKKworCisvLworLy8gRGVjbGFyZSBydW50aW1lIGZ1bmN0aW9ucworLy8KKworI2lmZGVmIFJVTlRJTUVfQ09ERQorI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBSVU5USU1FX0NPREUoTFNoaWZ0VTY0KQorI3ByYWdtYSBSVU5USU1FX0NPREUoUlNoaWZ0VTY0KQorI3ByYWdtYSBSVU5USU1FX0NPREUoTXVsdFU2NHgzMikKKyNwcmFnbWEgUlVOVElNRV9DT0RFKERpdlU2NHgzMikKKyNlbmRpZgorI2VuZGlmCisKKy8vCisvLworLy8KKworVUlOVDY0CitMU2hpZnRVNjQgKAorICAgIElOIFVJTlQ2NCAgIE9wZXJhbmQsCisgICAgSU4gVUlOVE4gICAgQ291bnQKKyAgICApCisvLyBMZWZ0IHNoaWZ0IDY0Yml0IGJ5IDMyYml0IGFuZCBnZXQgYSA2NGJpdCByZXN1bHQKK3sKKyNpZmRlZiBfX0dOVUNfXworICAgIHJldHVybiBPcGVyYW5kIDw8IENvdW50OworI2Vsc2UKKyAgICBVSU5UNjQgICAgICBSZXN1bHQ7CisgICAgX2FzbSB7CisgICAgICAgIG1vdiAgICAgZWF4LCBkd29yZCBwdHIgT3BlcmFuZFswXQorICAgICAgICBtb3YgICAgIGVkeCwgZHdvcmQgcHRyIE9wZXJhbmRbNF0KKyAgICAgICAgbW92ICAgICBlY3gsIENvdW50CisgICAgICAgIGFuZCAgICAgZWN4LCA2MworCisgICAgICAgIHNobGQgICAgZWR4LCBlYXgsIGNsCisgICAgICAgIHNobCAgICAgZWF4LCBjbAorCisgICAgICAgIGNtcCAgICAgZWN4LCAzMgorICAgICAgICBqYyAgICAgIHNob3J0IGxzMTAKKworICAgICAgICBtb3YgICAgIGVkeCwgZWF4CisgICAgICAgIHhvciAgICAgZWF4LCBlYXgKKworbHMxMDoKKyAgICAgICAgbW92ICAgICBkd29yZCBwdHIgUmVzdWx0WzBdLCBlYXgKKyAgICAgICAgbW92ICAgICBkd29yZCBwdHIgUmVzdWx0WzRdLCBlZHgKKyAgICB9CisKKyAgICByZXR1cm4gUmVzdWx0OworI2VuZGlmCit9CisKK1VJTlQ2NAorUlNoaWZ0VTY0ICgKKyAgICBJTiBVSU5UNjQgICBPcGVyYW5kLAorICAgIElOIFVJTlROICAgIENvdW50CisgICAgKQorLy8gUmlnaHQgc2hpZnQgNjRiaXQgYnkgMzJiaXQgYW5kIGdldCBhIDY0Yml0IHJlc3VsdAoreworI2lmZGVmIF9fR05VQ19fCisgICAgcmV0dXJuIE9wZXJhbmQgPj4gQ291bnQ7CisjZWxzZQorICAgIFVJTlQ2NCAgICAgIFJlc3VsdDsKKyAgICBfYXNtIHsKKyAgICAgICAgbW92ICAgICBlYXgsIGR3b3JkIHB0ciBPcGVyYW5kWzBdCisgICAgICAgIG1vdiAgICAgZWR4LCBkd29yZCBwdHIgT3BlcmFuZFs0XQorICAgICAgICBtb3YgICAgIGVjeCwgQ291bnQKKyAgICAgICAgYW5kICAgICBlY3gsIDYzCisKKyAgICAgICAgc2hyZCAgICBlYXgsIGVkeCwgY2wKKyAgICAgICAgc2hyICAgICBlZHgsIGNsCisKKyAgICAgICAgY21wICAgICBlY3gsIDMyCisgICAgICAgIGpjICAgICAgc2hvcnQgcnMxMAorCisgICAgICAgIG1vdiAgICAgZWF4LCBlZHgKKyAgICAgICAgeG9yICAgICBlZHgsIGVkeAorCityczEwOgorICAgICAgICBtb3YgICAgIGR3b3JkIHB0ciBSZXN1bHRbMF0sIGVheAorICAgICAgICBtb3YgICAgIGR3b3JkIHB0ciBSZXN1bHRbNF0sIGVkeAorICAgIH0KKworICAgIHJldHVybiBSZXN1bHQ7CisjZW5kaWYKK30KKworCitVSU5UNjQKK011bHRVNjR4MzIgKAorICAgIElOIFVJTlQ2NCAgIE11bHRpcGxpY2FuZCwKKyAgICBJTiBVSU5UTiAgICBNdWx0aXBsaWVyCisgICAgKQorLy8gTXVsdGlwbGUgNjRiaXQgYnkgMzJiaXQgYW5kIGdldCBhIDY0Yml0IHJlc3VsdAoreworI2lmZGVmIF9fR05VQ19fCisgICAgcmV0dXJuIE11bHRpcGxpY2FuZCAqIE11bHRpcGxpZXI7CisjZWxzZQorICAgIFVJTlQ2NCAgICAgIFJlc3VsdDsKKyAgICBfYXNtIHsKKyAgICAgICAgbW92ICAgICBlYXgsIGR3b3JkIHB0ciBNdWx0aXBsaWNhbmRbMF0KKyAgICAgICAgbXVsICAgICBNdWx0aXBsaWVyCisgICAgICAgIG1vdiAgICAgZHdvcmQgcHRyIFJlc3VsdFswXSwgZWF4CisgICAgICAgIG1vdiAgICAgZHdvcmQgcHRyIFJlc3VsdFs0XSwgZWR4CisgICAgICAgIG1vdiAgICAgZWF4LCBkd29yZCBwdHIgTXVsdGlwbGljYW5kWzRdCisgICAgICAgIG11bCAgICAgTXVsdGlwbGllcgorICAgICAgICBhZGQgICAgIGR3b3JkIHB0ciBSZXN1bHRbNF0sIGVheAorICAgIH0KKworICAgIHJldHVybiBSZXN1bHQ7CisjZW5kaWYKK30KKworVUlOVDY0CitEaXZVNjR4MzIgKAorICAgIElOIFVJTlQ2NCAgIERpdmlkZW5kLAorICAgIElOIFVJTlROICAgIERpdmlzb3IsCisgICAgT1VUIFVJTlROICAgKlJlbWFpbmRlciBPUFRJT05BTAorICAgICkKKy8vIGRpdmlkZSA2NGJpdCBieSAzMmJpdCBhbmQgZ2V0IGEgNjRiaXQgcmVzdWx0CisvLyBOLkIuIG9ubHkgd29ya3MgZm9yIDMxYml0IGRpdmlzb3JzISEKK3sKKyNpZmRlZiBfX0dOVUNfXworICAgIGlmIChSZW1haW5kZXIpCisJKlJlbWFpbmRlciA9IERpdmlkZW5kICUgRGl2aXNvcjsKKyAgICByZXR1cm4gRGl2aWRlbmQgLyBEaXZpc29yOworI2Vsc2UKKyAgICBVSU5UMzIgICAgICBSZW07CisgICAgVUlOVDMyICAgICAgYml0OyAgICAgICAgCisKKyAgICBBU1NFUlQgKERpdmlzb3IgIT0gMCk7CisgICAgQVNTRVJUICgoRGl2aXNvciA+PiAzMSkgPT0gMCk7CisKKyAgICAvLworICAgIC8vIEZvciBlYWNoIGJpdCBpbiB0aGUgZGl2aWRlbmQKKyAgICAvLworCisgICAgUmVtID0gMDsKKyAgICBmb3IgKGJpdD0wOyBiaXQgPCA2NDsgYml0KyspIHsKKyAgICAgICAgX2FzbSB7CisgICAgICAgICAgICBzaGwgICAgIGR3b3JkIHB0ciBEaXZpZGVuZFswXSwgMSAgICA7IHNoaWZ0IHJlbTpkaXZpZGVuZCBsZWZ0IG9uZQorICAgICAgICAgICAgcmNsICAgICBkd29yZCBwdHIgRGl2aWRlbmRbNF0sIDEgICAgCisgICAgICAgICAgICByY2wgICAgIGR3b3JkIHB0ciBSZW0sIDEgICAgICAgICAgICAKKworICAgICAgICAgICAgbW92ICAgICBlYXgsIFJlbQorICAgICAgICAgICAgY21wICAgICBlYXgsIERpdmlzb3IgICAgICAgICAgICAgICAgOyBJcyBSZW0gPj0gRGl2aXNvcj8KKyAgICAgICAgICAgIGNtYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTm8gLSBkbyBub3RoaW5nCisgICAgICAgICAgICBzYmIgICAgIGVheCwgZWF4ICAgICAgICAgICAgICAgICAgICA7IEVsc2UsIAorICAgICAgICAgICAgc3ViICAgICBkd29yZCBwdHIgRGl2aWRlbmRbMF0sIGVheCAgOyAgIHNldCBsb3cgYml0IGluIGRpdmlkZW4KKyAgICAgICAgICAgIGFuZCAgICAgZWF4LCBEaXZpc29yICAgICAgICAgICAgICAgIDsgYW5kCisgICAgICAgICAgICBzdWIgICAgIFJlbSwgZWF4ICAgICAgICAgICAgICAgICAgICA7ICAgc3VidHJhY3QgZGl2aXNvciAKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChSZW1haW5kZXIpIHsKKyAgICAgICAgKlJlbWFpbmRlciA9IFJlbTsKKyAgICB9CisKKyAgICByZXR1cm4gRGl2aWRlbmQ7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2lhNjQvaW5pdHBsYXQuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2lhNjQvaW5pdHBsYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmEzMGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWE2NC9pbml0cGxhdC5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk5ICBJbnRlbCBDb3Jwb3JhdGlvbgorICAgIAorTW9kdWxlIE5hbWU6CisKKyAgICBpbml0cGxhdC5jCisKK0Fic3RyYWN0OgorCisgICAgRnVuY3Rpb25zIHRvIG1ha2UgU0FMIGFuZCBQQUwgcHJvYyBjYWxscworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKyNpbmNsdWRlICJsaWIuaCIKKworLy8jaW5jbHVkZSAicGFscHJvYy5oIgorCitWT0lECitJbml0aWFsaXplTGliUGxhdGZvcm0gKAorICAgIElOIEVGSV9IQU5ETEUgICAgICAgICAgIEltYWdlSGFuZGxlLAorICAgIElOIEVGSV9TWVNURU1fVEFCTEUgICAgICpTeXN0ZW1UYWJsZQorICAgICkKKworeworICAgIFBMQUJFTCAgU2FsUGxhYmVsOworICAgIFVJTlQ2NCAgUGFsRW50cnk7CisKKyAgICBMaWJJbml0U2FsQW5kUGFsUHJvYyAoJlNhbFBsYWJlbCwgJlBhbEVudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2lhNjQvbWF0aC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWE2NC9tYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjNGUxMgotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2lhNjQvbWF0aC5jCkBAIC0wLDAgKzEsODggQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIG1hdGguYworCitBYnN0cmFjdDoKKworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpbmNsdWRlICJsaWIuaCIKKworCisvLworLy8gRGVjbGFyZSBydW50aW1lIGZ1bmN0aW9ucworLy8KKworI2lmZGVmIFJVTlRJTUVfQ09ERQorI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBSVU5USU1FX0NPREUoTFNoaWZ0VTY0KQorI3ByYWdtYSBSVU5USU1FX0NPREUoUlNoaWZ0VTY0KQorI3ByYWdtYSBSVU5USU1FX0NPREUoTXVsdFU2NHgzMikKKyNwcmFnbWEgUlVOVElNRV9DT0RFKERpdlU2NHgzMikKKyNlbmRpZgorI2VuZGlmCisKKy8vCisvLworLy8KKworCisKKworVUlOVDY0CitMU2hpZnRVNjQgKAorICAgIElOIFVJTlQ2NCAgIE9wZXJhbmQsCisgICAgSU4gVUlOVE4gICAgQ291bnQKKyAgICApCisvLyBMZWZ0IHNoaWZ0IDY0Yml0IGJ5IDMyYml0IGFuZCBnZXQgYSA2NGJpdCByZXN1bHQKK3sKKyAgICByZXR1cm4gT3BlcmFuZCA8PCBDb3VudDsKK30KKworVUlOVDY0CitSU2hpZnRVNjQgKAorICAgIElOIFVJTlQ2NCAgIE9wZXJhbmQsCisgICAgSU4gVUlOVE4gICAgQ291bnQKKyAgICApCisvLyBSaWdodCBzaGlmdCA2NGJpdCBieSAzMmJpdCBhbmQgZ2V0IGEgNjRiaXQgcmVzdWx0Cit7CisgICAgcmV0dXJuIE9wZXJhbmQgPj4gQ291bnQ7Cit9CisKKworVUlOVDY0CitNdWx0VTY0eDMyICgKKyAgICBJTiBVSU5UNjQgICBNdWx0aXBsaWNhbmQsCisgICAgSU4gVUlOVE4gICAgTXVsdGlwbGllcgorICAgICkKKy8vIE11bHRpcGxlIDY0Yml0IGJ5IDMyYml0IGFuZCBnZXQgYSA2NGJpdCByZXN1bHQKK3sKKyAgICByZXR1cm4gTXVsdGlwbGljYW5kICogTXVsdGlwbGllcjsKK30KKworVUlOVDY0CitEaXZVNjR4MzIgKAorICAgIElOIFVJTlQ2NCAgIERpdmlkZW5kLAorICAgIElOIFVJTlROICAgIERpdmlzb3IsCisgICAgT1VUIFVJTlROICAgKlJlbWFpbmRlciBPUFRJT05BTAorICAgICkKKy8vIGRpdmlkZSA2NGJpdCBieSAzMmJpdCBhbmQgZ2V0IGEgNjRiaXQgcmVzdWx0CisvLyBOLkIuIG9ubHkgd29ya3MgZm9yIDMxYml0IGRpdmlzb3JzISEKK3sKKyAgICBBU1NFUlQgKERpdmlzb3IgIT0gMCk7CisKKyAgICBpZiAoUmVtYWluZGVyKSB7CisgICAgICAgICpSZW1haW5kZXIgPSBEaXZpZGVuZCAlIERpdmlzb3I7CisgICAgfQorCisgICAgcmV0dXJuIERpdmlkZW5kIC8gRGl2aXNvcjsKK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2lhNjQvcGFscHJvYy5TIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWE2NC9wYWxwcm9jLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwNGE3OAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2lhNjQvcGFscHJvYy5TCkBAIC0wLDAgKzEsMTYxIEBACisvLysrCisvLyAgICAgIENvcHlyaWdodCAoYykgMTk5Ni05OSBJbnRlbCBDb3JwLiAgICAgICAgICAgIAorLy8KKy8vCisvLyBNb2R1bGUgTmFtZToKKy8vCisvLyAgcGFscHJvYy5zCisvLworLy8gQWJzdHJhY3Q6CisvLworLy8gIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciBtYWtpbmcgUEFMIFBST0MgY2FsbHMgb24KKy8vICBJQS02NCBhcmNoaXRlY3R1cmUuCisvLworLy8KKy8vCisvLyBSZXZpc2lvbiBIaXN0b3J5OgorLy8KKy8vLS0KKworCS5maWxlCSJwYWxwcm9jLnMiCisKKyNpbmNsdWRlICJwYWxwcm9jLmgiCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8rKworLy8gTWFrZVN0YXRpY1BBTENhbGwKKy8vCisvLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGFyY2hpdGVjdGVkIHN0YXRpYyBjYWxsaW5nIGNvbnZlbnRpb24KKy8vIGJhc2VkIFBBTCBjYWxsIGlzIHRvIGJlIG1hZGUuIFRoaXMgY2FsbCBkb2VzIHVzZSBSU0UgYWN0dWFsbHksIGJ1dCBvdXIgcG9saWN5CisvLyBpbiBtYWtpbmcgc3RhdGljIFBBTCBjYWxscyBiZWZvcmUgbWVtb3J5IGlzIGF2YWlsYWJsZSBpcyB0byBtYWtlIHN1cmUgdGhhdCAKKy8vIHdlIGRvIG5vdCBuZXN0IHRvbyBkZWVwIGFuZCBhbGxvY2F0ZSBiZXlvbmQgOTYgYmFua2VkIHJlZ2lzdGVycy4gSW4gb3RoZXIKKy8vIHdvcmRzIHdlIGNhcmVmdWxseSBjb2RlIGNhbGxzIGFuZCBjb250cm9sIGZsb3cgYmVmb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUuCisvLworLy8gQXJndW1lbnRzIDogQWxsIHBhcmFtZXRlcnMgc2V0IHVwIHRvIGRvIHN0YXRpYyBQQUwgY2FsbC4KKy8vCisvLyBPbiBFbnRyeSA6CisvLworLy8gUmV0dXJuIFZhbHVlOiAKKy8vIAorLy8gQXMgcGVyIHN0YXRpYyBjYWxsaW5nIGNvbnZlbnRpb25zLiAKKy8vIAorLy8tLQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST0NFRFVSRV9FTlRSWShNYWtlU3RhdGljUEFMQ2FsbCkKKworICAgICAgICBORVNURURfU0VUVVAgKDUsOCwwLDApCisgICAgICAgIG1vdiAgICAgICAgIGxvYzMgPSBiNQorICAgICAgICBtb3YgICAgICAgICBsb2M0ID0gcjIKKyAgICAgICAgbW92ICAgICAgICAgbG9jNyA9IHIxOzsKKyAgICAgICAgCisgICAgICAgIG1vdmwgICAgICAgIGxvYzYgPSBQQUxfTUNfQ0xFQVJfTE9HCisgICAgICAgIG1vdiAgICAgICAgIHIyID0gcHNyOzsKKyAgICAgICAgbW92ICAgICAgICAgbG9jNSA9IHIyCisKKyAgICAgICAgY21wLmVxICAgICAgcDYscDcgPSByMjgsbG9jNjs7CisgICAgKHA3KW1vdmwgICAgICAgIGxvYzYgPSBQQUxfTUNfRFlOQU1JQ19TVEFURTs7CisgICAgKHA3KWNtcC5lcSAgICAgIHA2LHA3ID0gcjI4LGxvYzY7OyAgICAgICAgCisgICAgICAgIAorICAgIChwNyltb3ZsICAgICAgICBsb2M2ID0gUEFMX01DX0VSUk9SX0lORk87OworICAgIChwNyljbXAuZXEgICAgICBwNixwNyA9IHIyOCxsb2M2OzsgICAgICAgIAorICAgICAgICAgCisgICAgKHA3KW1vdmwgICAgICAgIGxvYzYgPSBQQUxfTUNfUkVTVU1FOzsKKyAgICAocDcpY21wLmVxICAgICAgcDYscDcgPSByMjgsbG9jNiAgICAgICAgCisKKyAgICAgICAgbW92ICAgICAgICAgbG9jNiA9IDB4MTs7CisgICAgKHA3KWRlcCAgICAgICAgIHIyID0gbG9jNixyMiwxMywxOzsgICAgICAgICAvLyBwc3IuaWMgPSAxCisKKy8vIHA2IHdpbGwgYmUgdHJ1ZSwgaWYgaXQgaXMgb25lIG9mIHRoZSBNQ0hLIGNhbGxzLiBUaGVyZSBoYXMgYmVlbiBsb3RzIG9mIGRlYmF0ZQorLy8gb24gcHNyLmljIGZvciB0aGVzZSB2YWx1ZXMuIEZvciBub3csIGRvIG5vdCBkbyBhbnkgdGhpbmcgdG8gcHNyLmljCisKKy8vICAgIChwNilkZXAgICAgICAgICByMiA9IHIwLHIyLDEzLDE7OyAgICAgICAgIC8vIHBzci5pYyA9IDAKKyAgICAgICAgZGVwICAgICAgICAgcjIgPSByMCxyMiwxNCwxOzsgICAgICAgICAgIC8vIHBzci5pID0gMAorCisgICAgICAgIG1vdiAgICAgICAgIHBzci5sID0gcjIKKyAgICAgICAgc3Jsei5kOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWRzIGRhdGEgc2VyYWlsaXphdGlvbi4KKyAgICAgICAgc3Jsei5pOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWRzIGluc3RydWN0aW9uIHNlcmFpbGl6YXRpb24uCisKK1N0YXRpY0dldFBBTExvY2FsSVA6CisgICAgICAgIG1vdiAgICAgICAgIGxvYzIgPSBpcDs7CisgICAgICAgIGFkZCAgICAgICAgIGxvYzIgPSBTdGF0aWNDb21lQmFja0Zyb21QQUxDYWxsIC0gU3RhdGljR2V0UEFMTG9jYWxJUCxsb2MyOzsKKyAgICAgICAgbW92ICAgICAgICAgYjAgPSBsb2MyICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBhZGRyZXNzIGFmdGVyIFBhbCBjYWxsCisgICAgICAgIG1vdiAgICAgICAgIHIyOCA9IGluMSAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGlucHV0IHBhcmFtZXRlcnMgdG8gUEFMIGNhbGwKKyAgICAgICAgbW92ICAgICAgICAgcjI5ID0gaW4yCisgICAgICAgIG1vdiAgICAgICAgIHIzMCA9IGluMzs7CisgICAgICAgIG1vdiAgICAgICAgIHIzMSA9IGluNAorICAgICAgICBtb3YgICAgICAgICBiNSA9ICBpbjA7OyAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBQYWxQcm9jRW50cnlwdCBmcm9tIGlucHV0CisgICAgICAgIGJyLnNwdGsgICAgIGI1ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWtlIHRoZSBwbHVuZ2UuCisKK1N0YXRpY0NvbWVCYWNrRnJvbVBBTENhbGw6CisKKyAgICAgICAgbW92ICAgICAgICAgcHNyLmwgPSBsb2M1OzsKKyAgICAgICAgc3Jsei5kOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWRzIGRhdGEgc2VyYWlsaXphdGlvbi4KKyAgICAgICAgc3Jsei5pOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWRzIGluc3RydWN0aW9uIHNlcmFpbGl6YXRpb24uCisKKyAgICAgICAgbW92ICAgICAgICAgYjUgPSBsb2MzCisgICAgICAgIG1vdiAgICAgICAgIHIyID0gbG9jNAorICAgICAgICBtb3YgICAgICAgICByMSA9IGxvYzcKKyAgICAgICAgCisgICAgICAgIE5FU1RFRF9SRVRVUk4KKworUFJPQ0VEVVJFX0VYSVQoTWFrZVN0YXRpY1BBTENhbGwpCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8rKworLy8gTWFrZVN0YWNrZWRQQUxDYWxsCisvLworLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBhcmNoaXRlY3RlZCBzdGFja2VkIGNhbGxpbmcgY29udmVudGlvbgorLy8gYmFzZWQgUEFMIGNhbGwgaXMgdG8gYmUgbWFkZS4gVGhpcyBjYWxsIGlzIG1hZGUgYWZ0ZXIgbWVtb3J5IGlzIGF2YWlsYWJsZS4KKy8vIEFsdGhvdWdoIHN0YWNrZWQgY2FsbHMgY291bGQgYmUgbWFkZSBkaXJlY3RseSBmcm9tICdDJywgdGhlcmUgaXMgYSBQQUwgCisvLyByZXF1aXJlbWVudCB3aGljaCBmb3JjZXMgdGhlIGluZGV4IHRvIGJlIGluIEdSMjggYW5kIGhlbmNlIHRoaXMgc3R1YiBpcworLy8gbmVlZGVkCisvLworLy8gQXJndW1lbnRzIDogQWxsIHBhcmFtZXRlcnMgc2V0IHVwIHRvIGRvIHN0YWN0ZWQgUEFMIGNhbGwuCisvLworLy8gT24gRW50cnkgOgorLy8gICAgICAgICAgaW4wOiAgUEFMX1BST0MgZW50cnlwb2ludCAKKy8vICAgICAgICAgIGluMS1pbjQgOiBQQUxfUFJPQyBhcmd1bWVudHMKKy8vCisvLyBSZXR1cm4gVmFsdWU6IAorLy8gCisvLyBBcyBwZXIgc3RhY2tlZCBjYWxsaW5nIGNvbnZlbnRpb25zLiAKKy8vIAorLy8tLQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST0NFRFVSRV9FTlRSWShNYWtlU3RhY2tlZFBBTENhbGwpCisKKyAgICAgICAgTkVTVEVEX1NFVFVQICg1LDgsNCwwKQorICAgICAgICBtb3YgICAgICAgICBsb2MzID0gYjUKKyAgICAgICAgbW92ICAgICAgICAgbG9jNCA9IHIyCisgICAgICAgIG1vdiAgICAgICAgIGxvYzcgPSByMSAgICAKKyAgICAgICAgbW92ICAgICAgICAgcjIgPSBwc3I7OworICAgICAgICBtb3YgICAgICAgICBsb2M1ID0gcjI7OworICAgICAgICBkZXAgICAgICAgICByMiA9IHIwLHIyLDE0LDE7OyAgICAgICAgICAgLy8gcHNyLmkgPSAwCisgICAgICAgIG1vdiAgICAgICAgIHBzci5sID0gcjIKKyAgICAgICAgc3Jsei5kOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWRzIGRhdGEgc2VyYWlsaXphdGlvbi4KKyAgICAgICAgc3Jsei5pOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWRzIGluc3RydWN0aW9uIHNlcmFpbGl6YXRpb24uCisKK1N0YWNrZWRHZXRQQUxMb2NhbElQOgorICAgICAgICBtb3YgICAgICAgICByMjggPSBpbjEgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHRvIFBBTCBjYWxsCisgICAgICAgIG1vdiAgICAgICAgIG91dDAgPSBpbjEKKyAgICAgICAgbW92ICAgICAgICAgb3V0MSA9IGluMjs7CisgICAgICAgIG1vdiAgICAgICAgIG91dDIgPSBpbjMKKyAgICAgICAgbW92ICAgICAgICAgb3V0MyA9IGluNAorICAgICAgICBtb3YgICAgICAgICBiNSA9ICBpbjA7OyAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBQYWxQcm9jRW50cnlwdCBmcm9tIGlucHV0CisgICAgICAgIGJyLmNhbGwuZHBudCBiMD1iNTs7ICAgICAgICAgICAgICAgICAgICAvLyBUYWtlIHRoZSBwbHVuZ2UuCisKK1N0YWNrZWRDb21lQmFja0Zyb21QQUxDYWxsOgorCisgICAgICAgIG1vdiAgICAgICAgIHBzci5sID0gbG9jNTs7CisgICAgICAgIHNybHouZDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkcyBkYXRhIHNlcmFpbGl6YXRpb24uCisgICAgICAgIHNybHouaTs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkcyBpbnN0cnVjdGlvbiBzZXJhaWxpemF0aW9uLgorICAgICAgICBtb3YgICAgICAgICBiNSA9IGxvYzMKKyAgICAgICAgbW92ICAgICAgICAgcjIgPSBsb2M0CisgICAgICAgIG1vdiAgICAgICAgIHIxID0gbG9jNworICAgICAgICAKKyAgICAgICAgTkVTVEVEX1JFVFVSTgorCitQUk9DRURVUkVfRVhJVChNYWtlU3RhY2tlZFBBTENhbGwpCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2lhNjQvcGFscHJvYy5oIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWE2NC9wYWxwcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwOTQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2lhNjQvcGFscHJvYy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vIAorLy8gCisvLyAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYtOTkgSW50ZWwgQ29ycC4gICAgICAgICAgICAKKy8vIAorLy8gCisvL01vZHVsZSBOYW1lOgorLy8gCisvLyAgIHBhbHByb2MuaAorLy8gCisvL0Fic3RyYWN0OgorLy8gCisvLyAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGdlbmVyaWMgbWFjcm9zIGZvciBhbiBJQTY0IGFzc2VtYmx5IHdyaXRlci4KKy8vIAorLy8gCisvL1JldmlzaW9uIEhpc3RvcnkKKy8vIAorIAorI2lmbmRlZiBfUEFMUFJPQ19ICisjZGVmaW5lIF9QQUxQUk9DX0gKKworI2RlZmluZSBQUk9DRURVUkVfRU5UUlkobmFtZSkgICAuIyN0ZXh0OyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAuIyN0eXBlIG5hbWUsIEBmdW5jdGlvbjsgICAgXAorICAgICAgICAgICAgICAgIC4jI2dsb2JhbCBuYW1lOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIC4jI3Byb2MgbmFtZTsgICAgICAgICAgIFwKK25hbWU6CisKKyNkZWZpbmUgUFJPQ0VEVVJFX0VYSVQobmFtZSkgICAgLiMjZW5kcCBuYW1lCisKKy8vIE5vdGU6IHVzZSBvZiBORVNURURfU0VUVVAgcmVxdWlyZXMgbnVtYmVyIG9mIGxvY2FscyAobCkgPj0gMworCisjZGVmaW5lIE5FU1RFRF9TRVRVUChpLGwsbyxyKSBcCisgICAgICAgICBhbGxvYyBsb2MxPWFyIyMuIyNwZnMsaSxsLG8sciA7XAorICAgICAgICAgbW92IGxvYzA9YjAKKworI2RlZmluZSBORVNURURfUkVUVVJOIFwKKyAgICAgICAgIG1vdiBiMD1sb2MwIDtcCisgICAgICAgICBtb3YgYXIjIy4jI3Bmcz1sb2MxIDs7XAorICAgICAgICAgYnIjIy4jI3JldCMjLiMjZHBudCAgYjA7OworCisKKy8vIGRlZmluZXMgbmVlZGVkIGluIHBhbHByb2MucworCisjZGVmaW5lIFBBTF9NQ19DTEVBUl9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNQorI2RlZmluZSBQQUxfTUNfRFJBSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTYKKyNkZWZpbmUgUEFMX01DX0VYUEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE3CisjZGVmaW5lIFBBTF9NQ19EWU5BTUlDX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxOAorI2RlZmluZSBQQUxfTUNfRVJST1JfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTkKKyNkZWZpbmUgUEFMX01DX1JFU1VNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFhCisjZGVmaW5lIFBBTF9NQ19SRUdJU1RFUl9NRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYgorCisjZW5kaWYgIC8vIF9QQUxQUk9DX0ggCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9pYTY0L3NhbHBhbC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWE2NC9zYWxwYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDgwOGYzCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaWE2NC9zYWxwYWwuYwpAQCAtMCwwICsxLDMzNSBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTkgIEludGVsIENvcnBvcmF0aW9uCisgICAgCitNb2R1bGUgTmFtZToKKworICAgIHNhbHBhbC5jCisKK0Fic3RyYWN0OgorCisgICAgRnVuY3Rpb25zIHRvIG1ha2UgU0FMIGFuZCBQQUwgcHJvYyBjYWxscworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJwYWxwcm9jLmgiCisjaW5jbHVkZSAic2FscHJvYy5oIgorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTkgIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgRWZpUnRMaWIuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBSdW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImVmaS5oIgorI2luY2x1ZGUgImVmaWxpYi5oIgorCityQXJnCitNYWtlU3RhdGljUEFMQ2FsbCAoCisgICAgSU4gVUlOVDY0ICAgUEFMUFJPQ1B0ciwKKyAgICBJTiBVSU5UNjQgICBBcmcxLAorICAgIElOIFVJTlQ2NCAgIEFyZzIsCisgICAgSU4gVUlOVDY0ICAgQXJnMywKKyAgICBJTiBVSU5UNjQgICBBcmc0CisgICAgKTsKKworckFyZworTWFrZVN0YWNrZWRQQUxDYWxsICgKKyAgICBJTiBVSU5UNjQgICBQQUxQUk9DUHRyLAorICAgIElOIFVJTlQ2NCAgIEFyZzEsCisgICAgSU4gVUlOVDY0ICAgQXJnMiwKKyAgICBJTiBVSU5UNjQgICBBcmczLAorICAgIElOIFVJTlQ2NCAgIEFyZzQKKyAgICApOworCisKK1BMQUJFTCAgIFNhbFByb2NQbGFiZWw7CitQTEFCRUwgICBQYWxQcm9jUGxhYmVsOworQ0FMTF9TQUxfUFJPQyAgIEdsb2JhbFNhbFByb2M7CitDQUxMX1BBTF9QUk9DICAgR2xvYmFsUGFsUHJvYzsKKworVk9JRAorTGliSW5pdFNhbEFuZFBhbFByb2MgKAorICAgIE9VVCBQTEFCRUwgICpTYWxQbGFiZWwsCisgICAgT1VUIFVJTlQ2NCAgKlBhbEVudHJ5CisgICAgKQoreworICAgIFNBTF9TWVNURU1fVEFCTEVfQVNDRU5ESU5HX09SREVSICAgICpTYWxTeXN0ZW1UYWJsZTsKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXM7CisKKyAgICBHbG9iYWxTYWxQcm9jID0gTlVMTDsKKyAgICBHbG9iYWxQYWxQcm9jID0gTlVMTDsKKworICAgIFN0YXR1cyA9IExpYkdldFN5c3RlbUNvbmZpZ3VyYXRpb25UYWJsZSgmU2FsU3lzdGVtVGFibGVHdWlkLCAoVk9JRCAqKikmU2FsU3lzdGVtVGFibGUpOworICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICByZXR1cm47IAorICAgIH0KKworICAgIC8vCisgICAgLy8gQnVnQnVnOiBBZGQgY29kZSB0byB0ZXN0IGNoZWNrc3VtIG9uIHRoZSBTYWwgU3lzdGVtIFRhYmxlCisgICAgLy8KKyAgICBpZiAoU2FsU3lzdGVtVGFibGUtPkVudHJ5MC5UeXBlICE9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNhbFByb2NQbGFiZWwuUHJvY0VudHJ5UG9pbnQgPSBTYWxTeXN0ZW1UYWJsZS0+RW50cnkwLlNhbFByb2NFbnRyeTsgCisgICAgU2FsUHJvY1BsYWJlbC5HUCAgICAgICAgICAgICA9IFNhbFN5c3RlbVRhYmxlLT5FbnRyeTAuR2xvYmFsRGF0YVBvaW50ZXI7CisgICAgR2xvYmFsU2FsUHJvYyAgICAgICAgICAgICAgICA9IChDQUxMX1NBTF9QUk9DKSZTYWxQcm9jUGxhYmVsLlByb2NFbnRyeVBvaW50OworCisgICAgLy8KKyAgICAvLyBOZWVkIHRvIGNoZWNrIHRoZSBQQUwgc3BlYyB0byBtYWtlIHN1cmUgSSdtIG5vdCByZXNwb25zaWJsZSBmb3IKKyAgICAvLyAgc3RvcmluZyBtb3JlIHN0YXRlLgorICAgIC8vIFdlIGFyZSBwYXNzaW5nIGluIGEgUGxhYmVsIHRoYXQgc2hvdWxkIGJlIGlnbm9ycmVkIGJ5IHRoZSBQQUwuIENhbGwKKyAgICAvLyAgdGhpcyB3YXkgd2lsbCBjYXVzZSB1c2UgdG8gcmV0b3JlIG91ciBncCBhZnRlciB0aGUgUEFMIHJldHVybnMuCisgICAgLy8KKyAgICBQYWxQcm9jUGxhYmVsLlByb2NFbnRyeVBvaW50ID0gU2FsU3lzdGVtVGFibGUtPkVudHJ5MC5QYWxQcm9jRW50cnk7IAorICAgIFBhbFByb2NQbGFiZWwuR1AgICAgICAgICAgICAgPSBTYWxTeXN0ZW1UYWJsZS0+RW50cnkwLkdsb2JhbERhdGFQb2ludGVyOworICAgIEdsb2JhbFBhbFByb2MgICAgICAgICAgICAgICAgPSAoQ0FMTF9QQUxfUFJPQylQYWxQcm9jUGxhYmVsLlByb2NFbnRyeVBvaW50OworCisgICAgKlBhbEVudHJ5ID0gUGFsUHJvY1BsYWJlbC5Qcm9jRW50cnlQb2ludDsKKyAgICAqU2FsUGxhYmVsID0gU2FsUHJvY1BsYWJlbDsKK30KKworRUZJX1NUQVRVUworTGliR2V0U2FsSW9Qb3J0TWFwcGluZyAoCisgICAgT1VUIFVJTlQ2NCAgKklvUG9ydE1hcHBpbmcKKyAgICApCisvKisrCisKKyAgR2V0IHRoZSBJTyBQb3J0IE1hcCBmcm9tIHRoZSBTQUwgU3lzdGVtIFRhYmxlLgorICBETyBOT1QgVVNFIFRISVMgVE8gRE8gWU9VIE9XTiBJTydzISEhISEhISEhISEhCisgIE9ubHkgdXNlIHRoaXMgZm9yIGdldHRpbmcgaW5mbywgb3IgaW5pdGluZyB0aGUgYnVpbHQgaW4gRUZJIElPIGFic3RyYWN0aW9uLgorICBBbHdheXMgdXNlIHRoZSBFRkkgRGV2aWNlIElPIHByb3Rvb2NsIHRvIGFjY2VzcyBJTyBzcGFjZS4KKyAgCistLSovCit7CisgICAgU0FMX1NZU1RFTV9UQUJMRV9BU0NFTkRJTkdfT1JERVIgICAgKlNhbFN5c3RlbVRhYmxlOworICAgIFNBTF9TVF9NRU1PUllfREVTQ1JJUFRPUl9FTlRSWSAgICAgICpTYWxNZW1EZXNjOworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czsKKworICAgIFN0YXR1cyA9IExpYkdldFN5c3RlbUNvbmZpZ3VyYXRpb25UYWJsZSgmU2FsU3lzdGVtVGFibGVHdWlkLCAoVk9JRCAqKikmU2FsU3lzdGVtVGFibGUpOworICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICByZXR1cm4gRUZJX1VOU1VQUE9SVEVEOyAKKyAgICB9CisKKyAgICAvLworICAgIC8vIEJ1Z0J1ZzogQWRkIGNvZGUgdG8gdGVzdCBjaGVja3N1bSBvbiB0aGUgU2FsIFN5c3RlbSBUYWJsZQorICAgIC8vCisgICAgaWYgKFNhbFN5c3RlbVRhYmxlLT5FbnRyeTAuVHlwZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBFRklfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUaGUgU2FsU3lzdGVtVGFibGUgcG9pbnRlciBpbmNsdWRlcyB0aGUgVHlwZSAwIGVudHJ5LgorICAgIC8vICBUaGUgU2FsTWVtRGVzYyBpcyBUeXBlIDEgc28gaXQgY29tZXMgbmV4dC4KKyAgICAvLworICAgIFNhbE1lbURlc2MgPSAoU0FMX1NUX01FTU9SWV9ERVNDUklQVE9SX0VOVFJZICopKFNhbFN5c3RlbVRhYmxlICsgMSk7CisgICAgd2hpbGUgKFNhbE1lbURlc2MtPlR5cGUgPT0gU0FMX1NUX01FTU9SWV9ERVNDUklQVE9SKSB7CisgICAgICAgIGlmIChTYWxNZW1EZXNjLT5NZW1vcnlUeXBlID09IFNBTF9JT19QT1JUX01BUFBJTkcpIHsKKyAgICAgICAgICAgICpJb1BvcnRNYXBwaW5nID0gU2FsTWVtRGVzYy0+UGh5c2ljYWxNZW1vcnlBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIEVGSV9TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIFNhbE1lbURlc2MrKzsKKyAgIH0gCisgICAgcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKK30KKworRUZJX1NUQVRVUworTGliR2V0U2FsSXBpQmxvY2sgKAorICAgIE9VVCBVSU5UNjQgICpJcGlCbG9jaworICAgICkKKy8qKysKKworICBHZXQgdGhlIElQSSBibG9jayBmcm9tIHRoZSBTQUwgc3lzdGVtIHRhYmxlCisgIAorLS0qLworeworICAgIFNBTF9TWVNURU1fVEFCTEVfQVNDRU5ESU5HX09SREVSICAgICpTYWxTeXN0ZW1UYWJsZTsKKyAgICBTQUxfU1RfTUVNT1JZX0RFU0NSSVBUT1JfRU5UUlkgICAgICAqU2FsTWVtRGVzYzsKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXM7CisKKyAgICBTdGF0dXMgPSBMaWJHZXRTeXN0ZW1Db25maWd1cmF0aW9uVGFibGUoJlNhbFN5c3RlbVRhYmxlR3VpZCwgKFZPSUQqKSZTYWxTeXN0ZW1UYWJsZSk7CisgICAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgIHJldHVybiBFRklfVU5TVVBQT1JURUQ7IAorICAgIH0KKworICAgIC8vCisgICAgLy8gQnVnQnVnOiBBZGQgY29kZSB0byB0ZXN0IGNoZWNrc3VtIG9uIHRoZSBTYWwgU3lzdGVtIFRhYmxlCisgICAgLy8KKyAgICBpZiAoU2FsU3lzdGVtVGFibGUtPkVudHJ5MC5UeXBlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRoZSBTYWxTeXN0ZW1UYWJsZSBwb2ludGVyIGluY2x1ZGVzIHRoZSBUeXBlIDAgZW50cnkuCisgICAgLy8gIFRoZSBTYWxNZW1EZXNjIGlzIFR5cGUgMSBzbyBpdCBjb21lcyBuZXh0LgorICAgIC8vCisgICAgU2FsTWVtRGVzYyA9IChTQUxfU1RfTUVNT1JZX0RFU0NSSVBUT1JfRU5UUlkgKikoU2FsU3lzdGVtVGFibGUgKyAxKTsKKyAgICB3aGlsZSAoU2FsTWVtRGVzYy0+VHlwZSA9PSBTQUxfU1RfTUVNT1JZX0RFU0NSSVBUT1IpIHsKKyAgICAgICAgaWYgKFNhbE1lbURlc2MtPk1lbW9yeVR5cGUgPT0gU0FMX1NBUElDX0lQSV9CTE9DSyApIHsKKyAgICAgICAgICAgICpJcGlCbG9jayA9IFNhbE1lbURlc2MtPlBoeXNpY2FsTWVtb3J5QWRkcmVzczsKKyAgICAgICAgICAgIHJldHVybiBFRklfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBTYWxNZW1EZXNjKys7CisgICAgfQorICAgIHJldHVybiBFRklfVU5TVVBQT1JURUQ7Cit9CisKK0VGSV9TVEFUVVMKK0xpYkdldFNhbFdha2V1cFZlY3RvciAoCisgICAgT1VUIFVJTlQ2NCAgKldha2VWZWN0b3IKKyAgICApCisvKisrCisKK0dldCB0aGUgd2FrZXVwIHZlY3RvciBmcm9tIHRoZSBTQUwgc3lzdGVtIHRhYmxlCisgIAorLS0qLworeworICAgIFNBTF9TVF9BUF9XQUtFVVBfREVDUklQVE9SICAgICAgKkFwV2FrZVVwOworCisgICAgQXBXYWtlVXAgPSBMaWJTZWFyY2hTYWxTeXN0ZW1UYWJsZSAoU0FMX1NUX0FQX1dBS0VVUCk7CisgICAgaWYgKCFBcFdha2VVcCkgeworICAgICAgICAqV2FrZVZlY3RvciA9IC0xOworICAgICAgICByZXR1cm4gRUZJX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICAqV2FrZVZlY3RvciA9IEFwV2FrZVVwLT5FeHRlcm5hbEludGVycnVwdFZlY3RvcjsKKyAgICByZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisKK1ZPSUQgKgorTGliU2VhcmNoU2FsU3lzdGVtVGFibGUgKAorICAgIElOICBVSU5UOCAgIEVudHJ5VHlwZSAgCisgICAgKQoreworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU2FsVGFibGVIYWNrOworICAgIFNBTF9TWVNURU1fVEFCTEVfQVNDRU5ESU5HX09SREVSICAgICpTYWxTeXN0ZW1UYWJsZTsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeUNvdW50OworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50OworCisgICAgU3RhdHVzID0gTGliR2V0U3lzdGVtQ29uZmlndXJhdGlvblRhYmxlKCZTYWxTeXN0ZW1UYWJsZUd1aWQsIChWT0lEKikmU2FsU3lzdGVtVGFibGUpOworICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgfQorCisgICAgRW50cnlDb3VudCA9IFNhbFN5c3RlbVRhYmxlLT5IZWFkZXIuRW50cnlDb3VudDsKKyAgICBpZiAoRW50cnlDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvLworICAgIC8vIEJ1Z0J1ZzogQWRkIGNvZGUgdG8gdGVzdCBjaGVja3N1bSBvbiB0aGUgU2FsIFN5c3RlbSBUYWJsZQorICAgIC8vCisKKyAgICBTYWxUYWJsZUhhY2sgPSAoVUlOVDggKikmU2FsU3lzdGVtVGFibGUtPkVudHJ5MDsKKyAgICBmb3IgKENvdW50ID0gMDsgQ291bnQgPCBFbnRyeUNvdW50IDtDb3VudCsrKSB7CisgICAgICAgIGlmICgqU2FsVGFibGVIYWNrID09IEVudHJ5VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIChWT0lEICopU2FsVGFibGVIYWNrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKlNhbFRhYmxlSGFjaykgeworICAgICAgICBjYXNlIFNBTF9TVF9FTlRSWV9QT0lOVDoKKyAgICAgICAgICAgIFNhbFRhYmxlSGFjayArPSA0ODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNBTF9TVF9NRU1PUllfREVTQ1JJUFRPUjoKKyAgICAgICAgICAgIFNhbFRhYmxlSGFjayArPSAzMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNBTF9TVF9QTEFURk9STV9GRUFUVVJFUzoKKyAgICAgICAgICAgIFNhbFRhYmxlSGFjayArPSAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNBTF9TVF9UUl9VU0FHRToKKyAgICAgICAgICAgIFNhbFRhYmxlSGFjayArPSAzMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNBTF9TVF9QVEM6CisgICAgICAgICAgICBTYWxUYWJsZUhhY2sgKz0gMTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQUxfU1RfQVBfV0FLRVVQOgorICAgICAgICAgICAgU2FsVGFibGVIYWNrICs9IDE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1ZPSUQKK0xpYlNhbFByb2MgKAorICAgIElOICBVSU5UNjQgICAgQXJnMSwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzIsCisgICAgSU4gIFVJTlQ2NCAgICBBcmczLAorICAgIElOICBVSU5UNjQgICAgQXJnNCwKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzUsCisgICAgSU4gIFVJTlQ2NCAgICBBcmc2LAorICAgIElOICBVSU5UNjQgICAgQXJnNywKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzgsCisgICAgT1VUIHJBcmcgICAgICAqUmVzdWx0cyAgT1BUSU9OQUwKKyAgICApCit7CisgICAgckFyZyAgICBSZXR1cm5WYWx1ZTsKKworICAgIFJldHVyblZhbHVlLnAwID0gLTM7ICAgIC8vIFNBTCBzdGF0dXMgcmV0dXJuIGNvbXBsZXRlZCB3aXRoIGVycm9yIAorICAgIGlmIChHbG9iYWxTYWxQcm9jKSB7CisgICAgICAgIFJldHVyblZhbHVlID0gR2xvYmFsU2FsUHJvYyhBcmcxLCBBcmcyLCBBcmczLCBBcmc0LCBBcmc1LCBBcmc2LCBBcmc3LCBBcmc4KTsKKyAgICB9CisKKyAgICBpZiAoUmVzdWx0cykgeworICAgICAgICBDb3B5TWVtIChSZXN1bHRzLCAmUmV0dXJuVmFsdWUsIHNpemVvZihyQXJnKSk7CisgICAgfQorfQorCitWT0lECitMaWJQYWxQcm9jICgKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzEsIC8vIFBhbCBQcm9jIGluZGV4CisgICAgSU4gIFVJTlQ2NCAgICBBcmcyLAorICAgIElOICBVSU5UNjQgICAgQXJnMywKKyAgICBJTiAgVUlOVDY0ICAgIEFyZzQsCisgICAgT1VUIHJBcmcgICAgICAqUmVzdWx0cyAgT1BUSU9OQUwKKyAgICApCit7CisgICAgCisgICAgckFyZyAgICBSZXR1cm5WYWx1ZTsKKworICAgIFJldHVyblZhbHVlLnAwID0gLTM7ICAgIC8vIFBBTCBzdGF0dXMgcmV0dXJuIGNvbXBsZXRlZCB3aXRoIGVycm9yIAorCisgICAgLy8KKyAgICAvLyBjaGVjayBmb3IgdmFsaWQgUGFsUHJvYyBlbnRyeSBwb2ludAorICAgIC8vCisgICAgCisgICAgaWYgKCFHbG9iYWxQYWxQcm9jKSB7CisgICAgICAgIGlmIChSZXN1bHRzKSAKKyAgICAgICAgICAgIENvcHlNZW0gKFJlc3VsdHMsICZSZXR1cm5WYWx1ZSwgc2l6ZW9mKHJBcmcpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgICAgCisgICAgLy8KKyAgICAvLyBjaGVjayBpZiBpbmRleCBmYWxscyB3aXRoaW4gc3RhY2tlZCBvciBzdGF0aWMgcmVnaXN0ZXIgY2FsbGluZyBjb252ZW50aW9ucworICAgIC8vIGFuZCBjYWxsIGFwcHJvcHJpYXRlIFBhbCBzdHViIGNhbGwKKyAgICAvLworCisgICAgaWYgKCgoQXJnMSA+PTI1NSkgJiYgKEFyZzEgPD01MTEpKSB8fAorICAgICAgICAoKEFyZzEgPj03NjgpICYmIChBcmcxIDw9MTAyMykpKSB7ICAgIAorICAgICAgICAgICAgUmV0dXJuVmFsdWUgPSBNYWtlU3RhY2tlZFBBTENhbGwoKFVJTlQ2NClHbG9iYWxQYWxQcm9jLEFyZzEsQXJnMixBcmczLEFyZzQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUmV0dXJuVmFsdWUgPSBNYWtlU3RhdGljUEFMQ2FsbCgoVUlOVDY0KUdsb2JhbFBhbFByb2MsQXJnMSxBcmcyLEFyZzMsQXJnNCk7CisgICAgfQorICAgICAgICAgIAorICAgIGlmIChSZXN1bHRzKSAKKyAgICAgICAgQ29weU1lbSAoUmVzdWx0cywgJlJldHVyblZhbHVlLCBzaXplb2YockFyZykpOworICAgICAgICAKKyAgICByZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2luaXQuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTZmODkzCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvaW5pdC5jCkBAIC0wLDAgKzEsMTgzIEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKworQWJzdHJhY3Q6CisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAibGliLmgiCisKK1ZPSUQKK0VGSURlYnVnVmFyaWFibGUgKAorICAgIFZPSUQKKyAgICApOworCitWT0lECitJbml0aWFsaXplTGliICgKKyAgICBJTiBFRklfSEFORExFICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgICBJTiBFRklfU1lTVEVNX1RBQkxFICAgICAqU3lzdGVtVGFibGUKKyAgICApCisvKisrCisKK1JvdXRpbmUgRGVzY3JpcHRpb246CisKKyAgICBJbml0aWFsaXplcyBFRkkgbGlicmFyeSBmb3IgdXNlCisgICAgCitBcmd1bWVudHM6CisKKyAgICBGaXJtd2FyZSdzIEVGSSBzeXN0ZW0gdGFibGUKKyAgICAKK1JldHVybnM6CisKKyAgICBOb25lCisKKy0tKi8gCit7CisgICAgRUZJX0xPQURFRF9JTUFHRSAgICAgICAgKkxvYWRlZEltYWdlOworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgIFN0YXR1czsKKyAgICBDSEFSOCAgICAgICAgICAgICAgICAgICAqTGFuZ0NvZGU7CisKKyAgICBpZiAoIUxpYkluaXRpYWxpemVkKSB7CisgICAgICAgIExpYkluaXRpYWxpemVkID0gVFJVRTsKKyAgICAgICAgTGliRndJbnN0YW5jZSA9IEZBTFNFOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNldCB1cCBnbG9iYWwgcG9pbnRlciB0byB0aGUgc3lzdGVtIHRhYmxlLCBib290IHNlcnZpY2VzIHRhYmxlLAorICAgICAgICAvLyBhbmQgcnVudGltZSBzZXJ2aWNlcyB0YWJsZQorICAgICAgICAvLworCisgICAgICAgIFNUID0gU3lzdGVtVGFibGU7CisgICAgICAgIEJTID0gU3lzdGVtVGFibGUtPkJvb3RTZXJ2aWNlczsKKyAgICAgICAgUlQgPSBTeXN0ZW1UYWJsZS0+UnVudGltZVNlcnZpY2VzOworLy8gICAgICAgIEFTU0VSVCAoQ2hlY2tDcmMoMCwgJlNULT5IZHIpKTsKKy8vICAgICAgICBBU1NFUlQgKENoZWNrQ3JjKDAsICZCUy0+SGRyKSk7CisvLyAgICAgICAgQVNTRVJUIChDaGVja0NyYygwLCAmUlQtPkhkcikpOworCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBwb29sIGFsbG9jYXRpb24gdHlwZQorICAgICAgICAvLworCisgICAgICAgIGlmIChJbWFnZUhhbmRsZSkgeworICAgICAgICAgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoCisJCQkgICAgQlMtPkhhbmRsZVByb3RvY29sLAorCQkJCTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMb2FkZWRJbWFnZVByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT0lEKikmTG9hZGVkSW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgUG9vbEFsbG9jYXRpb25UeXBlID0gTG9hZGVkSW1hZ2UtPkltYWdlRGF0YVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEVGSURlYnVnVmFyaWFibGUgKCk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBJbml0aWFsaXplIEd1aWQgdGFibGUKKyAgICAgICAgLy8KKworICAgICAgICBJbml0aWFsaXplR3VpZCgpOworCisgICAgICAgIEluaXRpYWxpemVMaWJQbGF0Zm9ybShJbWFnZUhhbmRsZSxTeXN0ZW1UYWJsZSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyAKKyAgICAvLworCisgICAgaWYgKEltYWdlSGFuZGxlICYmIFVuaWNvZGVJbnRlcmZhY2UgPT0gJkxpYlN0dWJVbmljb2RlSW50ZXJmYWNlKSB7CisgICAgICAgIExhbmdDb2RlID0gTGliR2V0VmFyaWFibGUgKFZhckxhbmd1YWdlLCAmRWZpR2xvYmFsVmFyaWFibGUpOworICAgICAgICBJbml0aWFsaXplVW5pY29kZVN1cHBvcnQgKExhbmdDb2RlKTsKKyAgICAgICAgaWYgKExhbmdDb2RlKSB7CisgICAgICAgICAgICBGcmVlUG9vbCAoTGFuZ0NvZGUpOworICAgICAgICB9CisgICAgfQorfQorCitWT0lECitJbml0aWFsaXplVW5pY29kZVN1cHBvcnQgKAorICAgIENIQVI4ICpMYW5nQ29kZQorICAgICkKK3sKKyAgICBFRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFICpVaTsKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czsKKyAgICBDSEFSOCAgICAgICAgICAgICAgICAgICAgICAgICAgICpMYW5ndWFnZXM7CisgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCwgUG9zaXRpb24sIExlbmd0aDsKKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vSGFuZGxlczsKKyAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICpIYW5kbGVzOworCisgICAgLy8KKyAgICAvLyBJZiB3ZSBkb24ndCBrbm93IGl0LCBsb29rdXAgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgY29kZQorICAgIC8vCisKKyAgICBMaWJMb2NhdGVIYW5kbGUgKEJ5UHJvdG9jb2wsICZVbmljb2RlQ29sbGF0aW9uUHJvdG9jb2wsIE5VTEwsICZOb0hhbmRsZXMsICZIYW5kbGVzKTsKKyAgICBpZiAoIUxhbmdDb2RlIHx8ICFOb0hhbmRsZXMpIHsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgYWxsIGRyaXZlcidzIGZvciBhIG1hdGNoaW5nIGxhbmd1YWdlIGNvZGUKKyAgICAvLworCisgICAgZm9yIChJbmRleD0wOyBJbmRleCA8IE5vSGFuZGxlczsgSW5kZXgrKykgeworICAgICAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SGFuZGxlUHJvdG9jb2wsIDMsIEhhbmRsZXNbSW5kZXhdLCAmVW5pY29kZUNvbGxhdGlvblByb3RvY29sLCAoVk9JRCopJlVpKTsKKyAgICAgICAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBhIG1hdGNoaW5nIGxhbmd1YWdlIGNvZGUKKyAgICAgICAgLy8KKworICAgICAgICBMYW5ndWFnZXMgPSBVaS0+U3VwcG9ydGVkTGFuZ3VhZ2VzOworICAgICAgICBMZW5ndGggPSBzdHJsZW5hKExhbmd1YWdlcyk7CisgICAgICAgIGZvciAoUG9zaXRpb249MDsgUG9zaXRpb24gPCBMZW5ndGg7IFBvc2l0aW9uICs9IElTT182MzlfMl9FTlRSWV9TSVpFKSB7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aGlzIGNvZGUgbWF0Y2hlcywgdXNlIHRoaXMgZHJpdmVyCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBpZiAoQ29tcGFyZU1lbSAoTGFuZ3VhZ2VzK1Bvc2l0aW9uLCBMYW5nQ29kZSwgSVNPXzYzOV8yX0VOVFJZX1NJWkUpID09IDApIHsKKyAgICAgICAgICAgICAgICBVbmljb2RlSW50ZXJmYWNlID0gVWk7CisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitEb25lOgorICAgIC8vCisgICAgLy8gQ2xlYW51cAorICAgIC8vCisKKyAgICBpZiAoSGFuZGxlcykgeworICAgICAgICBGcmVlUG9vbCAoSGFuZGxlcyk7CisgICAgfQorfQorCitWT0lECitFRklEZWJ1Z1ZhcmlhYmxlICgKKyAgICBWT0lECisgICAgKQoreworICAgIEVGSV9TVEFUVVMgICAgICBTdGF0dXM7CisgICAgVUlOVDMyICAgICAgICAgIEF0dHJpYnV0ZXM7CisgICAgVUlOVE4gICAgICAgICAgIERhdGFTaXplOworICAgIFVJTlROICAgICAgICAgICBOZXdFRklEZWJ1ZzsKKworICAgIERhdGFTaXplID0gc2l6ZW9mKEVGSURlYnVnKTsKKyAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihSVC0+R2V0VmFyaWFibGUsIDUsIEwiRUZJRGVidWciLCAmRWZpR2xvYmFsVmFyaWFibGUsICZBdHRyaWJ1dGVzLCAmRGF0YVNpemUsICZOZXdFRklEZWJ1Zyk7CisgICAgaWYgKCFFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICBFRklEZWJ1ZyA9IE5ld0VGSURlYnVnOworICAgIH0gCit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9saWIuaCBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTkzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9saWIuaApAQCAtMCwwICsxLDg4IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBsaWIuaAorCitBYnN0cmFjdDoKKworICAgIEVGSSBsaWJyYXJ5IGhlYWRlciBmaWxlcworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKworI2luY2x1ZGUgImVmaS5oIgorI2luY2x1ZGUgImVmaWxpYi5oIgorI2luY2x1ZGUgImVmaXJ0bGliLmgiCisKKy8vCisvLyBJbmNsdWRlIG5vbiBhcmNoaXRlY3R1cmFsIHByb3RvY29scworLy8KKyNpbmNsdWRlICJlZml2YXIuaCIKKyNpbmNsdWRlICJsZWdhY3lib290LmgiCisjaW5jbHVkZSAiaW50bG9hZC5oIgorI2luY2x1ZGUgInZnYWNsYXNzLmgiCisjaW5jbHVkZSAiZWZpY29uc3BsaXQuaCIKKyNpbmNsdWRlICJhZGFwdGVyZGVidWcuaCIKKyNpbmNsdWRlICJpbnRsb2FkLmgiCisKKyNpbmNsdWRlICJlZmlncHQuaCIKKyNpbmNsdWRlICJsaWJzbWJpb3MuaCIKKworLy8KKy8vIFByb3RvdHlwZXMKKy8vCisKK1ZPSUQKK0luaXRpYWxpemVHdWlkICgKKyAgICBWT0lECisgICAgKTsKKworSU5UTiBFRklBUEkKK0xpYlN0dWJTdHJpQ21wICgKKyAgICBJTiBFRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAqUzEsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKlMyCisgICAgKTsKKworQk9PTEVBTiBFRklBUEkKK0xpYlN0dWJNZXRhaU1hdGNoICgKKyAgICBJTiBFRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFICAqVGhpcywKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICpQYXR0ZXJuCisgICAgKTsKKworVk9JRCBFRklBUEkKK0xpYlN0dWJTdHJMd3JVcHIgKAorICAgIElOIEVGSV9VTklDT0RFX0NPTExBVElPTl9JTlRFUkZBQ0UgICpUaGlzLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdHIKKyAgICApOworCitCT09MRUFOCitMaWJNYXRjaERldmljZVBhdGhzICgKKyAgICBJTiAgRUZJX0RFVklDRV9QQVRIICpNdWx0aSwKKyAgICBJTiAgRUZJX0RFVklDRV9QQVRIICpTaW5nbGUKKyAgICApOworCitFRklfREVWSUNFX1BBVEggKgorTGliRHVwbGljYXRlRGV2aWNlUGF0aEluc3RhbmNlICgKKyAgICBJTiBFRklfREVWSUNFX1BBVEggICpEZXZQYXRoCisgICAgKTsKKworCisvLworLy8gR2xvYmFscworLy8KK2V4dGVybiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICBMaWJJbml0aWFsaXplZDsKK2V4dGVybiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICBMaWJGd0luc3RhbmNlOworZXh0ZXJuIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpMaWJSdW50aW1lRGVidWdPdXQ7CitleHRlcm4gRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlVuaWNvZGVJbnRlcmZhY2U7CitleHRlcm4gRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgTGliU3R1YlVuaWNvZGVJbnRlcmZhY2U7CitleHRlcm4gRUZJX1JBSVNFX1RQTCAgICAgICAgICAgICAgICAgICAgTGliUnVudGltZVJhaXNlVFBMOworZXh0ZXJuIEVGSV9SRVNUT1JFX1RQTCAgICAgICAgICAgICAgICAgIExpYlJ1bnRpbWVSZXN0b3JlVFBMOwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvbG9jay5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzM2JlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9sb2NrLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGxvY2suYworCitBYnN0cmFjdDoKKworICAgIEltcGxlbWVudHMgRkxPQ0sKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisKKyNpbmNsdWRlICJsaWIuaCIKKworCitWT0lECitJbml0aWFsaXplTG9jayAoCisgICAgSU4gT1VUIEZMT0NLICAgICpMb2NrLAorICAgIElOIEVGSV9UUEwgICAgICBQcmlvcml0eQorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIEluaXRpYWxpemUgYSBiYXNpYyBtdXR1YWwgZXhjbHVzaW9uIGxvY2suICAgRWFjaCBsb2NrCisgICAgcHJvdmlkZXMgbXV0dWFsIGV4Y2x1c2lvbiBhY2Nlc3MgYXQgaXQncyB0YXNrIHByaW9yaXR5CisgICAgbGV2ZWwuICBTaW5jZSB0aGVyZSBpcyBuby1wcmVtcHRpb24gKGF0IGFueSBUUEwpIG9yCisgICAgbXVsdGlwcm9jZXNzb3Igc3VwcG9ydCwgYWNxdWlyaW5nIHRoZSBsb2NrIG9ubHkgY29uc2lzdHMKKyAgICBvZiByYWlzaW5nIHRvIHRoZSBsb2NrcyBUUEwuCisKKyAgICBOb3RlIG9uIGEgZGVidWcgYnVpbGQgdGhlIGxvY2sgaXMgYWNxdWlyZWQgYW5kIHJlbGVhc2VkCisgICAgdG8gaGVscCBlbnN1cmUgcHJvcGVyIHVzYWdlLgorICAgIAorQXJndW1lbnRzOgorCisgICAgTG9jayAgICAgICAgLSBUaGUgRkxPQ0sgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKworICAgIFByaW9yaXR5ICAgIC0gVGhlIHRhc2sgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlIGxvY2sKKworICAgIAorUmV0dXJuczoKKworICAgIEFuIGluaXRpYWxpemVkIEYgTG9jayBzdHJ1Y3R1cmUuCisKKy0tKi8KK3sKKyAgICBMb2NrLT5UcGwgPSBQcmlvcml0eTsKKyAgICBMb2NrLT5Pd25lclRwbCA9IDA7CisgICAgTG9jay0+TG9jayA9IDA7Cit9CisKKworVk9JRAorQWNxdWlyZUxvY2sgKAorICAgIElOIEZMT0NLICAgICpMb2NrCisgICAgKQorLyorKworCitSb3V0aW5lIERlc2NyaXB0aW9uOgorCisgICAgUmFpc2luZyB0byB0aGUgdGFzayBwcmlvcml0eSBsZXZlbCBvZiB0aGUgbXV0dWFsIGV4Y2x1c2lvbgorICAgIGxvY2ssIGFuZCB0aGVuIGFjcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgbG9jay4KKyAgICAKK0FyZ3VtZW50czoKKworICAgIExvY2sgICAgICAgIC0gVGhlIGxvY2sgdG8gYWNxdWlyZQorICAgIAorUmV0dXJuczoKKworICAgIExvY2sgb3duZWQKKworLS0qLworeworICAgIFJ0QWNxdWlyZUxvY2sgKExvY2spOworfQorCisKK1ZPSUQKK1JlbGVhc2VMb2NrICgKKyAgICBJTiBGTE9DSyAgICAqTG9jaworICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIFJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgbXV0dWFsIGV4Y2x1c2lvbiBsb2NrLCBhbmQKKyAgICByZXN0b3JlcyB0aGUgcHJldmlvdXMgdGFzayBwcmlvcml0eSBsZXZlbC4KKyAgICAKK0FyZ3VtZW50czoKKworICAgIExvY2sgICAgICAgIC0gVGhlIGxvY2sgdG8gcmVsZWFzZQorICAgIAorUmV0dXJuczoKKworICAgIExvY2sgdW5vd25lZAorCistLSovCit7CisgICAgUnRSZWxlYXNlTG9jayAoTG9jayk7Cit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9taXNjLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjYzkzNAotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL21pc2MuYwpAQCAtMCwwICsxLDU2MyBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgbWlzYy5jCisKK0Fic3RyYWN0OgorCisKKworCitSZXZpc2lvbiBIaXN0b3J5CisKKy0tKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisKKy8vCisvLworLy8KKworVk9JRCAqCitBbGxvY2F0ZVBvb2wgKAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgIFNpemUKKyAgICApCit7CisgICAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgU3RhdHVzOworICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICpwOworCisgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkFsbG9jYXRlUG9vbCwgMywgUG9vbEFsbG9jYXRpb25UeXBlLCBTaXplLCAmcCk7CisgICAgaWYgKEVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgIERFQlVHKChEX0VSUk9SLCAiQWxsb2NhdGVQb29sOiBvdXQgb2YgcG9vbCAgJXhcbiIsIFN0YXR1cykpOworICAgICAgICBwID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHA7Cit9CisKK1ZPSUQgKgorQWxsb2NhdGVaZXJvUG9vbCAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgU2l6ZQorICAgICkKK3sKKyAgICBWT0lEICAgICAgICAgICAgICAgICAgICAqcDsKKworICAgIHAgPSBBbGxvY2F0ZVBvb2wgKFNpemUpOworICAgIGlmIChwKSB7CisgICAgICAgIFplcm9NZW0gKHAsIFNpemUpOworICAgIH0KKworICAgIHJldHVybiBwOworfQorCitWT0lEICoKK1JlYWxsb2NhdGVQb29sICgKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAqT2xkUG9vbCwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICBPbGRTaXplLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgIE5ld1NpemUKKyAgICApCit7CisgICAgVk9JRCAgICAgICAgICAgICAgICAgICAgKk5ld1Bvb2w7CisKKyAgICBOZXdQb29sID0gTlVMTDsKKyAgICBpZiAoTmV3U2l6ZSkgeworICAgICAgICBOZXdQb29sID0gQWxsb2NhdGVQb29sIChOZXdTaXplKTsKKyAgICB9CisKKyAgICBpZiAoT2xkUG9vbCkgeworICAgICAgICBpZiAoTmV3UG9vbCkgeworICAgICAgICAgICAgQ29weU1lbSAoTmV3UG9vbCwgT2xkUG9vbCwgT2xkU2l6ZSA8IE5ld1NpemUgPyBPbGRTaXplIDogTmV3U2l6ZSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgRnJlZVBvb2wgKE9sZFBvb2wpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gTmV3UG9vbDsKK30KKworCitWT0lECitGcmVlUG9vbCAoCisgICAgSU4gVk9JRCAgICAgICAgICAgICAgICAgKkJ1ZmZlcgorICAgICkKK3sKKyAgICB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+RnJlZVBvb2wsIDEsIEJ1ZmZlcik7Cit9CisKKworCitWT0lECitaZXJvTWVtICgKKyAgICBJTiBWT0lEICAgICAqQnVmZmVyLAorICAgIElOIFVJTlROICAgIFNpemUKKyAgICApCit7CisgICAgUnRaZXJvTWVtIChCdWZmZXIsIFNpemUpOworfQorCitWT0lECitTZXRNZW0gKAorICAgIElOIFZPSUQgICAgICpCdWZmZXIsCisgICAgSU4gVUlOVE4gICAgU2l6ZSwKKyAgICBJTiBVSU5UOCAgICBWYWx1ZSAgICAKKyAgICApCit7CisgICAgUnRTZXRNZW0gKEJ1ZmZlciwgU2l6ZSwgVmFsdWUpOworfQorCitWT0lECitDb3B5TWVtICgKKyAgICBJTiBWT0lEICAgICAqRGVzdCwKKyAgICBJTiBDT05TVCBWT0lEICAgICAqU3JjLAorICAgIElOIFVJTlROICAgIGxlbgorICAgICkKK3sKKyAgICBSdENvcHlNZW0gKERlc3QsIFNyYywgbGVuKTsKK30KKworSU5UTgorQ29tcGFyZU1lbSAoCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKkRlc3QsCisgICAgSU4gQ09OU1QgVk9JRCAgICAgKlNyYywKKyAgICBJTiBVSU5UTiAgICBsZW4KKyAgICApCit7CisgICAgcmV0dXJuIFJ0Q29tcGFyZU1lbSAoRGVzdCwgU3JjLCBsZW4pOworfQorCitCT09MRUFOCitHcm93QnVmZmVyKAorICAgIElOIE9VVCBFRklfU1RBVFVTICAgKlN0YXR1cywKKyAgICBJTiBPVVQgVk9JRCAgICAgICAgICoqQnVmZmVyLAorICAgIElOIFVJTlROICAgICAgICAgICAgQnVmZmVyU2l6ZQorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIEhlbHBlciBmdW5jdGlvbiBjYWxsZWQgYXMgcGFydCBvZiB0aGUgY29kZSBuZWVkZWQKKyAgICB0byBhbGxvY2F0ZSB0aGUgcHJvcGVyIHNpemVkIGJ1ZmZlciBmb3IgdmFyaW91cyAKKyAgICBFRkkgaW50ZXJmYWNlcy4KKworQXJndW1lbnRzOgorCisgICAgU3RhdHVzICAgICAgLSBDdXJyZW50IHN0YXR1cworCisgICAgQnVmZmVyICAgICAgLSBDdXJyZW50IGFsbG9jYXRlZCBidWZmZXIsIG9yIE5VTEwKKworICAgIEJ1ZmZlclNpemUgIC0gQ3VycmVudCBidWZmZXIgc2l6ZSBuZWVkZWQKKyAgICAKK1JldHVybnM6CisgICAgCisgICAgVFJVRSAtIGlmIHRoZSBidWZmZXIgd2FzIHJlYWxsb2NhdGVkIGFuZCB0aGUgY2FsbGVyIAorICAgIHNob3VsZCB0cnkgdGhlIEFQSSBhZ2Fpbi4KKworLS0qLworeworICAgIEJPT0xFQU4gICAgICAgICBUcnlBZ2FpbjsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyBhbiBpbml0aWFsIHJlcXVlc3QsIGJ1ZmZlciB3aWxsIGJlIG51bGwgd2l0aCBhIG5ldyBidWZmZXIgc2l6ZQorICAgIC8vCisKKyAgICBpZiAoISpCdWZmZXIgJiYgQnVmZmVyU2l6ZSkgeworICAgICAgICAqU3RhdHVzID0gRUZJX0JVRkZFUl9UT09fU01BTEw7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB0aGUgc3RhdHVzIGNvZGUgaXMgImJ1ZmZlciB0b28gc21hbGwiLCByZXNpemUgdGhlIGJ1ZmZlcgorICAgIC8vCisgICAgICAgIAorICAgIFRyeUFnYWluID0gRkFMU0U7CisgICAgaWYgKCpTdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKworICAgICAgICBpZiAoKkJ1ZmZlcikgeworICAgICAgICAgICAgRnJlZVBvb2wgKCpCdWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgKkJ1ZmZlciA9IEFsbG9jYXRlUG9vbCAoQnVmZmVyU2l6ZSk7CisKKyAgICAgICAgaWYgKCpCdWZmZXIpIHsKKyAgICAgICAgICAgIFRyeUFnYWluID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsgICAgCisgICAgICAgICAgICAqU3RhdHVzID0gRUZJX09VVF9PRl9SRVNPVVJDRVM7CisgICAgICAgIH0gCisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB0aGVyZSdzIGFuIGVycm9yLCBmcmVlIHRoZSBidWZmZXIKKyAgICAvLworCisgICAgaWYgKCFUcnlBZ2FpbiAmJiBFRklfRVJST1IoKlN0YXR1cykgJiYgKkJ1ZmZlcikgeworICAgICAgICBGcmVlUG9vbCAoKkJ1ZmZlcik7CisgICAgICAgICpCdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBUcnlBZ2FpbjsKK30KKworCitFRklfTUVNT1JZX0RFU0NSSVBUT1IgKgorTGliTWVtb3J5TWFwICgKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAqTm9FbnRyaWVzLAorICAgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICpNYXBLZXksCisgICAgT1VUIFVJTlROICAgICAgICAgICAgICAgKkRlc2NyaXB0b3JTaXplLAorICAgIE9VVCBVSU5UMzIgICAgICAgICAgICAgICpEZXNjcmlwdG9yVmVyc2lvbgorICAgICkKK3sKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICBTdGF0dXM7CisgICAgRUZJX01FTU9SWV9ERVNDUklQVE9SICAgKkJ1ZmZlcjsKKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIGZvciBHcm93QnVmZmVyIGxvb3AKKyAgICAvLworCisgICAgU3RhdHVzID0gRUZJX1NVQ0NFU1M7CisgICAgQnVmZmVyID0gTlVMTDsKKyAgICBCdWZmZXJTaXplID0gc2l6ZW9mKEVGSV9NRU1PUllfREVTQ1JJUFRPUik7CisKKyAgICAvLworICAgIC8vIENhbGwgdGhlIHJlYWwgZnVuY3Rpb24KKyAgICAvLworCisgICAgd2hpbGUgKEdyb3dCdWZmZXIgKCZTdGF0dXMsIChWT0lEICoqKSAmQnVmZmVyLCBCdWZmZXJTaXplKSkgeworICAgICAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+R2V0TWVtb3J5TWFwLCA1LCAmQnVmZmVyU2l6ZSwgQnVmZmVyLCBNYXBLZXksIERlc2NyaXB0b3JTaXplLCBEZXNjcmlwdG9yVmVyc2lvbik7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb252ZXJ0IGJ1ZmZlciBzaXplIHRvIE5vRW50cmllcworICAgIC8vCisKKyAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgICpOb0VudHJpZXMgPSBCdWZmZXJTaXplIC8gKkRlc2NyaXB0b3JTaXplOworICAgIH0KKworICAgIHJldHVybiBCdWZmZXI7Cit9CisKK1ZPSUQgKgorTGliR2V0VmFyaWFibGVBbmRTaXplICgKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAqTmFtZSwKKyAgICBJTiBFRklfR1VJRCAgICAgICAgICAgICAqVmVuZG9yR3VpZCwKKyAgICBPVVQgVUlOVE4gICAgICAgICAgICAgICAqVmFyU2l6ZQorICAgICkKK3sKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICBTdGF0dXM7CisgICAgVk9JRCAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcjsKKyAgICBVSU5UTiAgICAgICAgICAgICAgICAgICBCdWZmZXJTaXplOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIGZvciBHcm93QnVmZmVyIGxvb3AKKyAgICAvLworCisgICAgQnVmZmVyID0gTlVMTDsKKyAgICBCdWZmZXJTaXplID0gMTAwOworCisgICAgLy8KKyAgICAvLyBDYWxsIHRoZSByZWFsIGZ1bmN0aW9uCisgICAgLy8KKworICAgIHdoaWxlIChHcm93QnVmZmVyICgmU3RhdHVzLCAmQnVmZmVyLCBCdWZmZXJTaXplKSkgeworICAgICAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcigKKwkJICAgIFJULT5HZXRWYXJpYWJsZSwKKwkJCTUsCisgICAgICAgICAgICAgICAgICAgIE5hbWUsCisgICAgICAgICAgICAgICAgICAgIFZlbmRvckd1aWQsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICZCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICBCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgaWYgKEJ1ZmZlcikgeworICAgICAgICAqVmFyU2l6ZSA9IEJ1ZmZlclNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKlZhclNpemUgPSAwOworICAgIH0KKyAgICByZXR1cm4gQnVmZmVyOworfQorICAgIAorVk9JRCAqCitMaWJHZXRWYXJpYWJsZSAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgKk5hbWUsCisgICAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgKlZlbmRvckd1aWQKKyAgICApCit7CisgICAgVUlOVE4gICBWYXJTaXplOworCisgICAgcmV0dXJuIExpYkdldFZhcmlhYmxlQW5kU2l6ZSAoTmFtZSwgVmVuZG9yR3VpZCwgJlZhclNpemUpOworfQorCitFRklfU1RBVFVTCitMaWJEZWxldGVWYXJpYWJsZSAoCisgICAgSU4gQ0hBUjE2ICAgKlZhck5hbWUsCisgICAgSU4gRUZJX0dVSUQgKlZhckd1aWQKKyAgICApCit7CisgICAgVk9JRCAgICAgICAgKlZhckJ1ZjsKKyAgICBFRklfU1RBVFVTICBTdGF0dXM7CisKKyAgICBWYXJCdWYgPSBMaWJHZXRWYXJpYWJsZShWYXJOYW1lLFZhckd1aWQpOworCisgICAgU3RhdHVzID0gRUZJX05PVF9GT1VORDsKKworICAgIGlmIChWYXJCdWYpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVsZXRlIHZhcmlhYmxlIGZyb20gU3RvcmFnZQorICAgICAgICAvLworICAgICAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcigKKwkJICAgIFJULT5TZXRWYXJpYWJsZSwKKwkJCTUsCisgICAgICAgICAgICAgICAgICAgIFZhck5hbWUsIFZhckd1aWQsCisgICAgICAgICAgICAgICAgICAgIEVGSV9WQVJJQUJMRV9CT09UU0VSVklDRV9BQ0NFU1MgfCBFRklfVkFSSUFCTEVfUlVOVElNRV9BQ0NFU1MgfCBFRklfVkFSSUFCTEVfTk9OX1ZPTEFUSUxFLAorICAgICAgICAgICAgICAgICAgICAwLCBOVUxMCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgIEFTU0VSVCAoIUVGSV9FUlJPUihTdGF0dXMpKTsKKyAgICAgICAgRnJlZVBvb2woVmFyQnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gKFN0YXR1cyk7Cit9CisKK0VGSV9TVEFUVVMKK0xpYlNldE5WVmFyaWFibGUgKAorICAgIElOIENIQVIxNiAgICpWYXJOYW1lLAorICAgIElOIEVGSV9HVUlEICpWYXJHdWlkLAorICAgIElOIFVJTlROCSBEYXRhU2l6ZSwKKyAgICBJTiBWT0lEICAgICAqRGF0YQorICAgICkKK3sKKyAgICBFRklfU1RBVFVTICBTdGF0dXM7CisKKyAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcigKKwkgICAgUlQtPlNldFZhcmlhYmxlLAorCSAgICA1LAorCSAgICBWYXJOYW1lLCBWYXJHdWlkLAorCSAgICBFRklfVkFSSUFCTEVfQk9PVFNFUlZJQ0VfQUNDRVNTIHwgRUZJX1ZBUklBQkxFX1JVTlRJTUVfQUNDRVNTIHwgRUZJX1ZBUklBQkxFX05PTl9WT0xBVElMRSwKKwkgICAgRGF0YVNpemUsIERhdGEKKwkgICAgKTsKKyAgICBBU1NFUlQgKCFFRklfRVJST1IoU3RhdHVzKSk7CisgICAgcmV0dXJuIChTdGF0dXMpOworfQorCitFRklfU1RBVFVTCitMaWJTZXRWYXJpYWJsZSAoCisgICAgSU4gQ0hBUjE2ICAgKlZhck5hbWUsCisgICAgSU4gRUZJX0dVSUQgKlZhckd1aWQsCisgICAgSU4gVUlOVE4JIERhdGFTaXplLAorICAgIElOIFZPSUQgICAgICpEYXRhCisgICAgKQoreworICAgIEVGSV9TVEFUVVMgIFN0YXR1czsKKworICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKAorCSAgICBSVC0+U2V0VmFyaWFibGUsCisJICAgIDUsCisJICAgIFZhck5hbWUsIFZhckd1aWQsCisJICAgIEVGSV9WQVJJQUJMRV9CT09UU0VSVklDRV9BQ0NFU1MgfCBFRklfVkFSSUFCTEVfUlVOVElNRV9BQ0NFU1MsCisJICAgIERhdGFTaXplLCBEYXRhCisJICAgICk7CisgICAgQVNTRVJUICghRUZJX0VSUk9SKFN0YXR1cykpOworICAgIHJldHVybiAoU3RhdHVzKTsKK30KKworRUZJX1NUQVRVUworTGliSW5zZXJ0VG9UYWlsT2ZCb290T3JkZXIgKAorICAgIElOICBVSU5UMTYgIEJvb3RPcHRpb24sCisgICAgSU4gIEJPT0xFQU4gT25seUluc2VydElmRW1wdHkKKyAgICApCit7CisgICAgVUlOVDE2ICAgICAgKkJvb3RPcHRpb25BcnJheTsKKyAgICBVSU5UMTYgICAgICAqTmV3Qm9vdE9wdGlvbkFycmF5OworICAgIFVJTlROICAgICAgIFZhclNpemU7CisgICAgVUlOVE4gICAgICAgSW5kZXg7CisgICAgRUZJX1NUQVRVUyAgU3RhdHVzOworCisgICAgQm9vdE9wdGlvbkFycmF5ID0gTGliR2V0VmFyaWFibGVBbmRTaXplIChWYXJCb290T3JkZXIsICZFZmlHbG9iYWxWYXJpYWJsZSwgJlZhclNpemUpOyAgICAKKyAgICBpZiAoVmFyU2l6ZSAhPSAwICYmIE9ubHlJbnNlcnRJZkVtcHR5KSB7CisgICAgICAgIGlmIChCb290T3B0aW9uQXJyYXkpIHsKKyAgICAgICAgICAgIEZyZWVQb29sIChCb290T3B0aW9uQXJyYXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBFRklfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgVmFyU2l6ZSArPSBzaXplb2YoVUlOVDE2KTsKKyAgICBOZXdCb290T3B0aW9uQXJyYXkgPSBBbGxvY2F0ZVBvb2wgKFZhclNpemUpOworICAgIAorICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8ICgoVmFyU2l6ZS9zaXplb2YoVUlOVDE2KSkgLSAxKTsgSW5kZXgrKykgeworICAgICAgICBOZXdCb290T3B0aW9uQXJyYXlbSW5kZXhdID0gQm9vdE9wdGlvbkFycmF5W0luZGV4XTsKKyAgICB9CisgICAgLy8KKyAgICAvLyBJbnNlcnQgaW4gdGhlIHRhaWwgb2YgdGhlIGFycmF5CisgICAgLy8KKyAgICBOZXdCb290T3B0aW9uQXJyYXlbSW5kZXhdID0gQm9vdE9wdGlvbjsKKworICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKAorCQlSVC0+U2V0VmFyaWFibGUsCisJCTUsCisgICAgICAgICAgICAgICAgVmFyQm9vdE9yZGVyLCAmRWZpR2xvYmFsVmFyaWFibGUsCisgICAgICAgICAgICAgICAgRUZJX1ZBUklBQkxFX0JPT1RTRVJWSUNFX0FDQ0VTUyB8IEVGSV9WQVJJQUJMRV9SVU5USU1FX0FDQ0VTUyB8IEVGSV9WQVJJQUJMRV9OT05fVk9MQVRJTEUsCisgICAgICAgICAgICAgICAgVmFyU2l6ZSwgKFZPSUQqKSBOZXdCb290T3B0aW9uQXJyYXkKKyAgICAgICAgICAgICAgICApOworCisgICAgaWYgKE5ld0Jvb3RPcHRpb25BcnJheSkgeworICAgICAgICBGcmVlUG9vbCAoTmV3Qm9vdE9wdGlvbkFycmF5KTsKKyAgICB9CisgICAgaWYgKEJvb3RPcHRpb25BcnJheSkgeworICAgICAgICBGcmVlUG9vbCAoQm9vdE9wdGlvbkFycmF5KTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czsKK30KKworCitCT09MRUFOCitWYWxpZE1CUigKKyAgICBJTiAgTUFTVEVSX0JPT1RfUkVDT1JEICAqTWJyLAorICAgIElOICBFRklfQkxPQ0tfSU8gICAgICAgICpCbGtJbworICAgICkKK3sKKyAgICBVSU5UMzIgICAgICBTdGFydGluZ0xCQSwgRW5kaW5nTEJBOworICAgIFVJTlQzMiAgICAgIE5ld0VuZGluZ0xCQTsKKyAgICBJTlROICAgICAgICBpLCBqOworICAgIEJPT0xFQU4gICAgIFZhbGlkTWJyOworCisgICAgaWYgKE1ici0+U2lnbmF0dXJlICE9IE1CUl9TSUdOQVRVUkUpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIEJQQiBhbHNvIGhhcyB0aGlzIHNpZ25hdHVyZSwgc28gaXQgY2FuIG5vdCBiZSB1c2VkIGFsb25lLgorICAgICAgICAvLworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAKKworICAgIFZhbGlkTWJyID0gRkFMU0U7CisgICAgZm9yIChpPTA7IGk8TUFYX01CUl9QQVJUSVRJT05TOyBpKyspIHsKKyAgICAgICAgaWYgKCBNYnItPlBhcnRpdGlvbltpXS5PU0luZGljYXRvciA9PSAweDAwIHx8IEVYVFJBQ1RfVUlOVDMyKE1ici0+UGFydGl0aW9uW2ldLlNpemVJbkxCQSkgPT0gMCApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFZhbGlkTWJyID0gVFJVRTsKKyAgICAgICAgU3RhcnRpbmdMQkEgPSBFWFRSQUNUX1VJTlQzMihNYnItPlBhcnRpdGlvbltpXS5TdGFydGluZ0xCQSk7CisgICAgICAgIEVuZGluZ0xCQSA9IFN0YXJ0aW5nTEJBICsgRVhUUkFDVF9VSU5UMzIoTWJyLT5QYXJ0aXRpb25baV0uU2l6ZUluTEJBKSAtIDE7CisgICAgICAgIGlmIChFbmRpbmdMQkEgPiBCbGtJby0+TWVkaWEtPkxhc3RCbG9jaykgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENvbXBhdGFiaWxpdHkgRXJyYXRhOgorICAgICAgICAgICAgLy8gIFNvbWUgc3lzdGVtcyB0cnkgdG8gaGlkZSBkcml2ZSBzcGFjZSB3aXRoIHRoaWVyIElOVCAxM2ggZHJpdmVyCisgICAgICAgICAgICAvLyAgVGhpcyBkb2VzIG5vdCBoaWRlIHNwYWNlIGZyb20gdGhlIE9TIGRyaXZlci4gVGhpcyBtZWFucyB0aGUgTUJSCisgICAgICAgICAgICAvLyAgdGhhdCBnZXRzIGNyZWF0ZWQgZnJvbSBET1MgaXMgc21hbGxlciB0aGFuIHRoZSBNQlIgY3JlYXRlZCBmcm9tIAorICAgICAgICAgICAgLy8gIGEgcmVhbCBPUyAoTlQgJiBXaW45OCkuIFRoaXMgbGVhZHMgdG8gQmxrSW8tPkxhc3RCbG9jayBiZWluZyAKKyAgICAgICAgICAgIC8vICB3cm9uZyBvbiBzb21lIHN5c3RlbXMgRkRJU0tlZCBieSB0aGUgT1MuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmIChCbGtJby0+TWVkaWEtPkxhc3RCbG9jayA8IE1JTl9NQlJfREVWSUNFX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSB2ZXJ5IHNtYWxsIGRldmljZSB0aGVuIHRydXN0IHRoZSBCbGtJby0+TGFzdEJsb2NrCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChFbmRpbmdMQkEgPiAoQmxrSW8tPk1lZGlhLT5MYXN0QmxvY2sgKyBNQlJfRVJSQVRBX1BBRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBmb3IgKGo9aSsxOyBqPE1BWF9NQlJfUEFSVElUSU9OUzsgaisrKSB7CisgICAgICAgICAgICBpZiAoTWJyLT5QYXJ0aXRpb25bal0uT1NJbmRpY2F0b3IgPT0gMHgwMCB8fCBFWFRSQUNUX1VJTlQzMihNYnItPlBhcnRpdGlvbltqXS5TaXplSW5MQkEpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggICBFWFRSQUNUX1VJTlQzMihNYnItPlBhcnRpdGlvbltqXS5TdGFydGluZ0xCQSkgPj0gU3RhcnRpbmdMQkEgJiYgCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF9VSU5UMzIoTWJyLT5QYXJ0aXRpb25bal0uU3RhcnRpbmdMQkEpIDw9IEVuZGluZ0xCQSAgICAgICApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRoZSBTdGFydCBvZiB0aGlzIHJlZ2lvbiBvdmVybGFwcyB3aXRoIHRoZSBpJ3RoIHJlZ2lvbgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIE5ld0VuZGluZ0xCQSA9IEVYVFJBQ1RfVUlOVDMyKE1ici0+UGFydGl0aW9uW2pdLlN0YXJ0aW5nTEJBKSArIEVYVFJBQ1RfVUlOVDMyKE1ici0+UGFydGl0aW9uW2pdLlNpemVJbkxCQSkgLSAxOworICAgICAgICAgICAgaWYgKCBOZXdFbmRpbmdMQkEgPj0gU3RhcnRpbmdMQkEgJiYgTmV3RW5kaW5nTEJBIDw9IEVuZGluZ0xCQSApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRoZSBFbmQgb2YgdGhpcyByZWdpb24gb3ZlcmxhcHMgd2l0aCB0aGUgaSd0aCByZWdpb24KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLworICAgIC8vIE5vbiBvZiB0aGUgcmVnaW9ucyBvdmVybGFwcGVkIHNvIE1CUiBpcyBPLksuCisgICAgLy8KKyAgICByZXR1cm4gVmFsaWRNYnI7Cit9IAorICAgCisKK1VJTlQ4CitEZWNpbWFsdG9CQ0QoCisgICAgSU4gIFVJTlQ4IERlY1ZhbHVlCisgICAgKQoreworICAgIHJldHVybiBSdERlY2ltYWx0b0JDRCAoRGVjVmFsdWUpOworfQorCisKK1VJTlQ4CitCQ0R0b0RlY2ltYWwoCisgICAgSU4gIFVJTlQ4IEJjZFZhbHVlCisgICAgKQoreworICAgIHJldHVybiBSdEJDRHRvRGVjaW1hbCAoQmNkVmFsdWUpOworfQorCitFRklfU1RBVFVTCitMaWJHZXRTeXN0ZW1Db25maWd1cmF0aW9uVGFibGUoCisgICAgSU4gRUZJX0dVSUQgKlRhYmxlR3VpZCwKKyAgICBJTiBPVVQgVk9JRCAqKlRhYmxlCisgICAgKQorCit7CisgICAgVUlOVE4gSW5kZXg7CisKKyAgICBmb3IoSW5kZXg9MDtJbmRleDxTVC0+TnVtYmVyT2ZUYWJsZUVudHJpZXM7SW5kZXgrKykgeworICAgICAgICBpZiAoQ29tcGFyZUd1aWQoVGFibGVHdWlkLCYoU1QtPkNvbmZpZ3VyYXRpb25UYWJsZVtJbmRleF0uVmVuZG9yR3VpZCkpPT0wKSB7CisgICAgICAgICAgICAqVGFibGUgPSBTVC0+Q29uZmlndXJhdGlvblRhYmxlW0luZGV4XS5WZW5kb3JUYWJsZTsKKyAgICAgICAgICAgIHJldHVybiBFRklfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRUZJX05PVF9GT1VORDsKK30KKworCitDSEFSMTYgKgorTGliR2V0VWlTdHJpbmcgKAorICAgIElOICBFRklfSEFORExFICAgICAgSGFuZGxlLAorICAgIElOICBVSV9TVFJJTkdfVFlQRSAgU3RyaW5nVHlwZSwKKyAgICBJTiAgSVNPXzYzOV8yICAgICAgICpMYW5nQ29kZSwKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgIFJldHVybkRldmljZVBhdGhTdHJPbk1pc21hdGNoCisgICAgKQoreworICAgIFVJX0lOVEVSRkFDRSAgICAqVWk7CisgICAgVUlfU1RSSU5HX1RZUEUgIEluZGV4OworICAgIFVJX1NUUklOR19FTlRSWSAqQXJyYXk7CisgICAgRUZJX1NUQVRVUyAgICAgIFN0YXR1czsKKyAgICAKKyAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+SGFuZGxlUHJvdG9jb2wsIDMsIEhhbmRsZSwgJlVpUHJvdG9jb2wsIChWT0lEICopJlVpKTsKKyAgICBpZiAoRUZJX0VSUk9SKFN0YXR1cykpIHsKKyAgICAgICAgcmV0dXJuIChSZXR1cm5EZXZpY2VQYXRoU3RyT25NaXNtYXRjaCkgPyBEZXZpY2VQYXRoVG9TdHIoRGV2aWNlUGF0aEZyb21IYW5kbGUoSGFuZGxlKSkgOiBOVUxMOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2tpcCB0aGUgZmlyc3Qgc3RyaW5ncworICAgIC8vCisgICAgZm9yIChJbmRleCA9IFVpRGV2aWNlU3RyaW5nLCBBcnJheSA9IFVpLT5FbnRyeTsgSW5kZXggPCBTdHJpbmdUeXBlOyBJbmRleCsrLCBBcnJheSsrKSB7CisgICAgICAgIHdoaWxlIChBcnJheS0+TGFuZ0NvZGUpIHsKKyAgICAgICAgICAgIEFycmF5Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFNlYXJjaCBmb3IgdGhlIG1hdGNoCisgICAgLy8KKyAgICB3aGlsZSAoQXJyYXktPkxhbmdDb2RlKSB7CisgICAgICAgIGlmIChzdHJjbXBhIChBcnJheS0+TGFuZ0NvZGUsIExhbmdDb2RlKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXktPlVpU3RyaW5nOyAKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFJldHVybkRldmljZVBhdGhTdHJPbk1pc21hdGNoKSA/IERldmljZVBhdGhUb1N0cihEZXZpY2VQYXRoRnJvbUhhbmRsZShIYW5kbGUpKSA6IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9wcmludC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWVhOTBjCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvcHJpbnQuYwpAQCAtMCwwICsxLDEzNjYgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIHByaW50LmMKKworQWJzdHJhY3Q6CisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZWZpc3RkYXJnLmgiICAgICAgICAgICAgICAgICAgICAgICAgLy8gISEhCisKKy8vCisvLyBEZWNsYXJlIHJ1bnRpbWUgZnVuY3Rpb25zCisvLworCisjaWZkZWYgUlVOVElNRV9DT0RFCisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIFJVTlRJTUVfQ09ERShEYmdQcmludCkKKworLy8gRm9yIGRlYnVnZ2luZy4uCisKKy8qCisjcHJhZ21hIFJVTlRJTUVfQ09ERShfUHJpbnQpCisjcHJhZ21hIFJVTlRJTUVfQ09ERShQRkxVU0gpCisjcHJhZ21hIFJVTlRJTUVfQ09ERShQU0VUQVRUUikKKyNwcmFnbWEgUlVOVElNRV9DT0RFKFBQVVRDKQorI3ByYWdtYSBSVU5USU1FX0NPREUoUEdFVEMpCisjcHJhZ21hIFJVTlRJTUVfQ09ERShQSVRFTSkKKyNwcmFnbWEgUlVOVElNRV9DT0RFKFZhbHVlVG9IZXgpCisjcHJhZ21hIFJVTlRJTUVfQ09ERShWYWx1ZVRvU3RyaW5nKQorI3ByYWdtYSBSVU5USU1FX0NPREUoVGltZVRvU3RyaW5nKQorKi8KKworI2VuZGlmIC8qICFkZWZpbmVkKF9fR05VQ19fKSAqLworI2VuZGlmCisKKy8vCisvLworLy8KKworCisjZGVmaW5lIFBSSU5UX1NUUklOR19MRU4gICAgICAgICAgICAyMDAKKyNkZWZpbmUgUFJJTlRfSVRFTV9CVUZGRVJfTEVOICAgICAgIDEwMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgICAgICAgICBBc2NpaTsKKyAgICBVSU5UTiAgICAgICAgICAgICAgIEluZGV4OworICAgIHVuaW9uIHsKKyAgICAgICAgQ0hBUjE2ICAgICAgICAgICpwdzsKKyAgICAgICAgQ0hBUjggICAgICAgICAgICpwYzsKKyAgICB9IHVuOworfSBQT0lOVEVSOworCisjZGVmaW5lIHB3CXVuLnB3CisjZGVmaW5lIHBjCXVuLnBjCisKK3R5cGVkZWYgc3RydWN0IF9waXRlbSB7CisKKyAgICBQT0lOVEVSICAgICBJdGVtOworICAgIENIQVIxNiAgICAgIFNjcmF0Y2hbUFJJTlRfSVRFTV9CVUZGRVJfTEVOXTsKKyAgICBVSU5UTiAgICAgICBXaWR0aDsKKyAgICBVSU5UTiAgICAgICBGaWVsZFdpZHRoOworICAgIFVJTlROICAgICAgICpXaWR0aFBhcnNlOworICAgIENIQVIxNiAgICAgIFBhZDsKKyAgICBCT09MRUFOICAgICBQYWRCZWZvcmU7CisgICAgQk9PTEVBTiAgICAgQ29tbWE7CisgICAgQk9PTEVBTiAgICAgTG9uZzsKK30gUFJJTlRfSVRFTTsKKworCit0eXBlZGVmIHN0cnVjdCBfcHN0YXRlIHsKKyAgICAvLyBJbnB1dAorICAgIFBPSU5URVIgICAgIGZtdDsKKyAgICB2YV9saXN0ICAgICBhcmdzOworCisgICAgLy8gT3V0cHV0CisgICAgQ0hBUjE2ICAgICAgKkJ1ZmZlcjsKKyAgICBDSEFSMTYgICAgICAqRW5kOworICAgIENIQVIxNiAgICAgICpQb3M7CisgICAgVUlOVE4gICAgICAgTGVuOworCisgICAgVUlOVE4gICAgICAgQXR0cjsgICAgCisgICAgVUlOVE4gICAgICAgUmVzdG9yZUF0dHI7CisKKyAgICBVSU5UTiAgICAgICBBdHRyTm9ybTsKKyAgICBVSU5UTiAgICAgICBBdHRySGlnaGxpZ2h0OworICAgIFVJTlROICAgICAgIEF0dHJFcnJvcjsKKworICAgIElOVE4gRUZJQVBJICAgICAgICgqT3V0cHV0KShWT0lEICpjb250ZXh0LCBDSEFSMTYgKnN0cik7CisgICAgSU5UTiBFRklBUEkgICAgICAgKCpTZXRBdHRyKShWT0lEICpjb250ZXh0LCBVSU5UTiBhdHRyKTsKKyAgICBWT0lEICAgICAgICAqQ29udGV4dDsgICAgCisKKyAgICAvLyBDdXJyZW50IGl0ZW0gYmVpbmcgZm9ybWF0dGVkCisgICAgc3RydWN0IF9waXRlbSAgKkl0ZW07Cit9IFBSSU5UX1NUQVRFOworCisvLworLy8gSW50ZXJuYWwgZnVjbnRpb25zCisvLworCitTVEFUSUMKK1VJTlROCitfUHJpbnQgKAorICAgIElOIFBSSU5UX1NUQVRFICAgICAqcHMKKyAgICApOworCitTVEFUSUMKK1VJTlROCitfSVByaW50ICgKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW4sCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93LAorICAgIElOIFNJTVBMRV9URVhUX09VVFBVVF9JTlRFUkZBQ0UgICAgICpPdXQsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZtdCwKKyAgICBJTiBDSEFSOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm10YSwKKyAgICBJTiB2YV9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzCisgICAgKTsKKworU1RBVElDCitJTlROIEVGSUFQSQorX0RiZ091dCAoCisgICAgSU4gVk9JRCAgICAgKkNvbnRleHQsCisgICAgSU4gQ0hBUjE2ICAgKkJ1ZmZlcgorICAgICk7CisKK1NUQVRJQworVk9JRAorUEZMVVNIICgKKyAgICBJTiBPVVQgUFJJTlRfU1RBVEUgICAgICpwcworICAgICk7CisKK1NUQVRJQworVk9JRAorUFBVVEMgKAorICAgIElOIE9VVCBQUklOVF9TVEFURSAgICAgKnBzLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgYworICAgICk7CisKK1NUQVRJQworVk9JRAorUElURU0gKAorICAgIElOIE9VVCBQUklOVF9TVEFURSAgKnBzCisgICAgKTsKKworU1RBVElDCitDSEFSMTYKK1BHRVRDICgKKyAgICBJTiBQT0lOVEVSICAgICAgKnAKKyAgICApOworCitTVEFUSUMKK1ZPSUQKK1BTRVRBVFRSICgKKyAgICBJTiBPVVQgUFJJTlRfU1RBVEUgICpwcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICBBdHRyCisgICAgKTsKKworLy8KKy8vCisvLworCitJTlROIEVGSUFQSQorX1NQcmludCAoCisgICAgSU4gVk9JRCAgICAgKkNvbnRleHQsCisgICAgSU4gQ0hBUjE2ICAgKkJ1ZmZlcgorICAgICk7CisKK0lOVE4gRUZJQVBJCitfUG9vbFByaW50ICgKKyAgICBJTiBWT0lEICAgICAqQ29udGV4dCwKKyAgICBJTiBDSEFSMTYgICAqQnVmZmVyCisgICAgKTsKKworSU5UTgorRGJnUHJpbnQgKAorICAgIElOIElOVE4gICAgICBtYXNrLAorICAgIElOIENIQVI4ICAgICAqZm10LAorICAgIC4uLgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIFByaW50cyBhIGZvcm1hdHRlZCB1bmljb2RlIHN0cmluZyB0byB0aGUgZGVmYXVsdCBTdGFuZGFyZEVycm9yIGNvbnNvbGUKKworQXJndW1lbnRzOgorCisgICAgbWFzayAgICAgICAgLSBCaXQgbWFzayBvZiBkZWJ1ZyBzdHJpbmcuICBJZiBhIGJpdCBpcyBzZXQgaW4gdGhlCisgICAgICAgICAgICAgICAgICBtYXNrIHRoYXQgaXMgYWxzbyBzZXQgaW4gRUZJRGVidWcgdGhlIHN0cmluZyBpcyAKKyAgICAgICAgICAgICAgICAgIHByaW50ZWQ7IG90aGVyd2lzZSwgdGhlIHN0cmluZyBpcyBub3QgcHJpbnRlZAorCisgICAgZm10ICAgICAgICAgLSBGb3JtYXQgc3RyaW5nCisKK1JldHVybnM6CisKKyAgICBMZW5ndGggb2Ygc3RyaW5nIHByaW50ZWQgdG8gdGhlIFN0YW5kYXJkRXJyb3IgY29uc29sZQorCistLSovCit7CisgICAgU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAqRGJnT3V0OworICAgIFBSSU5UX1NUQVRFICAgICBwczsKKyAgICB2YV9saXN0ICAgICAgICAgYXJnczsKKyAgICBVSU5UTiAgICAgICAgICAgYmFjazsKKyAgICBVSU5UTiAgICAgICAgICAgYXR0cjsKKyAgICBVSU5UTiAgICAgICAgICAgU2F2ZWRBdHRyaWJ1dGU7CisKKworICAgIGlmICghKEVGSURlYnVnICYgbWFzaykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisgICAgWmVyb01lbSAoJnBzLCBzaXplb2YocHMpKTsKKworICAgIHBzLk91dHB1dCA9IF9EYmdPdXQ7IAorICAgIHBzLmZtdC5Bc2NpaSA9IFRSVUU7CisgICAgcHMuZm10LnBjID0gZm10OworICAgIHZhX2NvcHkocHMuYXJncywgYXJncyk7CisgICAgcHMuQXR0ciA9IEVGSV9URVhUX0FUVFIoRUZJX0xJR0hUR1JBWSwgRUZJX1JFRCk7IAorCisgICAgRGJnT3V0ID0gTGliUnVudGltZURlYnVnT3V0OworCisgICAgaWYgKCFEYmdPdXQpIHsKKyAgICAgICAgRGJnT3V0ID0gU1QtPlN0ZEVycjsKKyAgICB9CisKKyAgICBpZiAoRGJnT3V0KSB7CisgICAgICAgIHBzLkF0dHIgPSBEYmdPdXQtPk1vZGUtPkF0dHJpYnV0ZTsKKyAgICAgICAgcHMuQ29udGV4dCA9IERiZ091dDsKKyAgICAgICAgcHMuU2V0QXR0ciA9IChJTlROIEVGSUFQSSAoKikoVk9JRCAqLCBVSU5UTikpICBEYmdPdXQtPlNldEF0dHJpYnV0ZTsKKyAgICB9CisKKyAgICBTYXZlZEF0dHJpYnV0ZSA9IHBzLkF0dHI7CisKKyAgICBiYWNrID0gKHBzLkF0dHIgPj4gNCkgJiAweGY7CisgICAgcHMuQXR0ck5vcm0gPSBFRklfVEVYVF9BVFRSKEVGSV9MSUdIVEdSQVksIGJhY2spOworICAgIHBzLkF0dHJIaWdobGlnaHQgPSBFRklfVEVYVF9BVFRSKEVGSV9XSElURSwgYmFjayk7CisgICAgcHMuQXR0ckVycm9yID0gRUZJX1RFWFRfQVRUUihFRklfWUVMTE9XLCBiYWNrKTsKKworICAgIGF0dHIgPSBwcy5BdHRyTm9ybTsKKworICAgIGlmIChtYXNrICYgRF9XQVJOKSB7CisgICAgICAgIGF0dHIgPSBwcy5BdHRySGlnaGxpZ2h0OworICAgIH0KKworICAgIGlmIChtYXNrICYgRF9FUlJPUikgeworICAgICAgICBhdHRyID0gcHMuQXR0ckVycm9yOworICAgIH0KKworICAgIGlmIChwcy5TZXRBdHRyKSB7CisgICAgICAgIHBzLkF0dHIgPSBhdHRyOworICAgICAgICBwcy5TZXRBdHRyIChwcy5Db250ZXh0LCBhdHRyKTsKKyAgICB9CisKKyAgICBfUHJpbnQgKCZwcyk7CisKKyAgICB2YV9lbmQgKHBzLmFyZ3MpOworICAgIHZhX2VuZCAoYXJncyk7CisKKyAgICAvLworICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgYXR0cmlidXRlcworICAgIC8vCisKKyAgICBpZiAocHMuU2V0QXR0cikgeworICAgICAgICBwcy5TZXRBdHRyIChwcy5Db250ZXh0LCBTYXZlZEF0dHJpYnV0ZSk7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCitTVEFUSUMKK0lOVE4KK0lzTG9jYWxQcmludCh2b2lkICpmdW5jKQoreworCWlmIChmdW5jID09IF9EYmdPdXQgfHwgZnVuYyA9PSBfU1ByaW50IHx8IGZ1bmMgPT0gX1Bvb2xQcmludCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQworSU5UTiBFRklBUEkKK19EYmdPdXQgKAorICAgIElOIFZPSUQgICAgICpDb250ZXh0LAorICAgIElOIENIQVIxNiAgICpCdWZmZXIKKyAgICApCisvLyBBcHBlbmQgc3RyaW5nIHdvcmtlciBmb3IgRGJnUHJpbnQKK3sKKyAgICBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICpEYmdPdXQ7CisKKyAgICBEYmdPdXQgPSBDb250ZXh0OworLy8gICAgaWYgKCFEYmdPdXQgJiYgU1QgJiYgU1QtPkNvbk91dCkgeworLy8gICAgICAgIERiZ091dCA9IFNULT5Db25PdXQ7CisvLyAgICB9CisKKyAgICBpZiAoRGJnT3V0KSB7CisJaWYgKElzTG9jYWxQcmludChEYmdPdXQtPk91dHB1dFN0cmluZykpCisJCURiZ091dC0+T3V0cHV0U3RyaW5nKERiZ091dCwgQnVmZmVyKTsKKyAgICAgICAgZWxzZQorCQl1ZWZpX2NhbGxfd3JhcHBlcihEYmdPdXQtPk91dHB1dFN0cmluZywgMiwgRGJnT3V0LCBCdWZmZXIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitJTlROIEVGSUFQSQorX1NQcmludCAoCisgICAgSU4gVk9JRCAgICAgKkNvbnRleHQsCisgICAgSU4gQ0hBUjE2ICAgKkJ1ZmZlcgorICAgICkKKy8vIEFwcGVuZCBzdHJpbmcgd29ya2VyIGZvciBTUHJpbnQsIFBvb2xQcmludCBhbmQgQ2F0UHJpbnQKK3sKKyAgICBVSU5UTiAgICAgICAgICAgbGVuOworICAgIFBPT0xfUFJJTlQgICAgICAqc3BjOworCisgICAgc3BjID0gQ29udGV4dDsKKyAgICBsZW4gPSBTdHJMZW4oQnVmZmVyKTsKKworICAgIC8vCisgICAgLy8gSXMgdGhlIHN0cmluZyBpcyBvdmVyIHRoZSBtYXggdHJ1bmNhdGUgaXQKKyAgICAvLworCisgICAgaWYgKHNwYy0+bGVuICsgbGVuID4gc3BjLT5tYXhsZW4pIHsKKyAgICAgICAgbGVuID0gc3BjLT5tYXhsZW4gLSBzcGMtPmxlbjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEFwcGVuZCB0aGUgbmV3IHRleHQKKyAgICAvLworCisgICAgQ29weU1lbSAoc3BjLT5zdHIgKyBzcGMtPmxlbiwgQnVmZmVyLCBsZW4gKiBzaXplb2YoQ0hBUjE2KSk7CisgICAgc3BjLT5sZW4gKz0gbGVuOworCisgICAgLy8KKyAgICAvLyBOdWxsIHRlcm1pbmF0ZSBpdAorICAgIC8vCisKKyAgICBpZiAoc3BjLT5sZW4gPCBzcGMtPm1heGxlbikgeworICAgICAgICBzcGMtPnN0cltzcGMtPmxlbl0gPSAwOworICAgIH0gZWxzZSBpZiAoc3BjLT5tYXhsZW4pIHsKKyAgICAgICAgc3BjLT5zdHJbc3BjLT5tYXhsZW4tMV0gPSAwOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK0lOVE4gRUZJQVBJCitfUG9vbFByaW50ICgKKyAgICBJTiBWT0lEICAgICAqQ29udGV4dCwKKyAgICBJTiBDSEFSMTYgICAqQnVmZmVyCisgICAgKQorLy8gQXBwZW5kIHN0cmluZyB3b3JrZXIgZm9yIFBvb2xQcmludCBhbmQgQ2F0UHJpbnQKK3sKKyAgICBVSU5UTiAgICAgICAgICAgbmV3bGVuOworICAgIFBPT0xfUFJJTlQgICAgICAqc3BjOworCisgICAgc3BjID0gQ29udGV4dDsKKyAgICBuZXdsZW4gPSBzcGMtPmxlbiArIFN0ckxlbihCdWZmZXIpICsgMTsKKworICAgIC8vCisgICAgLy8gSXMgdGhlIHN0cmluZyBpcyBvdmVyIHRoZSBtYXgsIGdyb3cgdGhlIGJ1ZmZlcgorICAgIC8vCisKKyAgICBpZiAobmV3bGVuID4gc3BjLT5tYXhsZW4pIHsKKworICAgICAgICAvLworICAgICAgICAvLyBHcm93IHRoZSBwb29sIGJ1ZmZlcgorICAgICAgICAvLworCisgICAgICAgIG5ld2xlbiArPSBQUklOVF9TVFJJTkdfTEVOOworICAgICAgICBzcGMtPm1heGxlbiA9IG5ld2xlbjsKKyAgICAgICAgc3BjLT5zdHIgPSBSZWFsbG9jYXRlUG9vbCAoCisgICAgICAgICAgICAgICAgICAgICAgICBzcGMtPnN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICBzcGMtPmxlbiAqIHNpemVvZihDSEFSMTYpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYy0+bWF4bGVuICogc2l6ZW9mKENIQVIxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgaWYgKCFzcGMtPnN0cikgeworICAgICAgICAgICAgc3BjLT5sZW4gPSAwOworICAgICAgICAgICAgc3BjLT5tYXhsZW4gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBBcHBlbmQgdGhlIG5ldyB0ZXh0CisgICAgLy8KKworICAgIHJldHVybiBfU1ByaW50IChDb250ZXh0LCBCdWZmZXIpOworfQorCisKKworVk9JRAorX1Bvb2xDYXRQcmludCAoCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAqZm10LAorICAgIElOIHZhX2xpc3QgICAgICAgICAgYXJncywKKyAgICBJTiBPVVQgUE9PTF9QUklOVCAgICpzcGMsCisgICAgSU4gSU5UTiBFRklBUEkgICAgICAoKk91dHB1dCkoVk9JRCAqY29udGV4dCwgQ0hBUjE2ICpzdHIpCisgICAgKQorLy8gRGlzcGF0aCBmdW5jdGlvbiBmb3IgU1ByaW50LCBQb29sUHJpbnQsIGFuZCBDYXRQcmludAoreworICAgIFBSSU5UX1NUQVRFICAgICAgICAgcHM7CisKKyAgICBaZXJvTWVtICgmcHMsIHNpemVvZihwcykpOworICAgIHBzLk91dHB1dCAgPSBPdXRwdXQ7CisgICAgcHMuQ29udGV4dCA9IHNwYzsKKyAgICBwcy5mbXQucHcgPSBmbXQ7CisgICAgdmFfY29weShwcy5hcmdzLCBhcmdzKTsKKyAgICBfUHJpbnQgKCZwcyk7CisgICAgdmFfZW5kKHBzLmFyZ3MpOworfQorCisKKworVUlOVE4KK1ZTUHJpbnQgKAorICAgIE9VVCBDSEFSMTYgICpTdHIsCisgICAgSU4gVUlOVE4gICAgU3RyU2l6ZSwKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIHZhX2xpc3QgICAgIGFyZ3MKKyAgICApCisvKisrCisKK1JvdXRpbmUgRGVzY3JpcHRpb246CisKKyAgICBQcmludHMgYSBmb3JtYXR0ZWQgdW5pY29kZSBzdHJpbmcgdG8gYSBidWZmZXIgdXNpbmcgYSB2YV9saXN0CisKK0FyZ3VtZW50czoKKworICAgIFN0ciAgICAgICAgIC0gT3V0cHV0IGJ1ZmZlciB0byBwcmludCB0aGUgZm9ybWF0dGVkIHN0cmluZyBpbnRvCisKKyAgICBTdHJTaXplICAgICAtIFNpemUgb2YgU3RyLiAgU3RyaW5nIGlzIHRydW5jYXRlZCB0byB0aGlzIHNpemUuCisgICAgICAgICAgICAgICAgICBBIHNpemUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyBsaW1pdAorCisgICAgZm10ICAgICAgICAgLSBUaGUgZm9ybWF0IHN0cmluZworCisgICAgYXJncyAgICAgICAgLSB2YV9saXN0CisKKworUmV0dXJuczoKKworICAgIFN0cmluZyBsZW5ndGggcmV0dXJuZWQgaW4gYnVmZmVyCisKKy0tKi8KK3sKKyAgICBQT09MX1BSSU5UICAgICAgICAgIHNwYzsKKworICAgIHNwYy5zdHIgICAgPSBTdHI7CisgICAgc3BjLm1heGxlbiA9IFN0clNpemUgLyBzaXplb2YoQ0hBUjE2KSAtIDE7CisgICAgc3BjLmxlbiAgICA9IDA7CisKKyAgICBfUG9vbENhdFByaW50IChmbXQsIGFyZ3MsICZzcGMsIF9TUHJpbnQpOworCisgICAgcmV0dXJuIHNwYy5sZW47Cit9CisKK1VJTlROCitTUHJpbnQgKAorICAgIE9VVCBDSEFSMTYgICpTdHIsCisgICAgSU4gVUlOVE4gICAgU3RyU2l6ZSwKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIC4uLgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIFByaW50cyBhIGZvcm1hdHRlZCB1bmljb2RlIHN0cmluZyB0byBhIGJ1ZmZlcgorCitBcmd1bWVudHM6CisKKyAgICBTdHIgICAgICAgICAtIE91dHB1dCBidWZmZXIgdG8gcHJpbnQgdGhlIGZvcm1hdHRlZCBzdHJpbmcgaW50bworCisgICAgU3RyU2l6ZSAgICAgLSBTaXplIG9mIFN0ci4gIFN0cmluZyBpcyB0cnVuY2F0ZWQgdG8gdGhpcyBzaXplLgorICAgICAgICAgICAgICAgICAgQSBzaXplIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gbGltaXQKKworICAgIGZtdCAgICAgICAgIC0gVGhlIGZvcm1hdCBzdHJpbmcKKworUmV0dXJuczoKKworICAgIFN0cmluZyBsZW5ndGggcmV0dXJuZWQgaW4gYnVmZmVyCisKKy0tKi8KK3sKKyAgICB2YV9saXN0ICAgICAgICAgIGFyZ3M7CisgICAgVUlOVE4gICAgICAgICAgICBsZW47CisKKyAgICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgICBsZW4gPSBWU1ByaW50KFN0ciwgU3RyU2l6ZSwgZm10LCBhcmdzKTsKKyAgICB2YV9lbmQgKGFyZ3MpOworCisgICAgcmV0dXJuIGxlbjsKK30KKworCitDSEFSMTYgKgorUG9vbFByaW50ICgKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICpmbXQsCisgICAgLi4uCisgICAgKQorLyorKworCitSb3V0aW5lIERlc2NyaXB0aW9uOgorCisgICAgUHJpbnRzIGEgZm9ybWF0dGVkIHVuaWNvZGUgc3RyaW5nIHRvIGFsbG9jYXRlZCBwb29sLiAgVGhlIGNhbGxlcgorICAgIG11c3QgZnJlZSB0aGUgcmVzdWx0aW5nIGJ1ZmZlci4KKworQXJndW1lbnRzOgorCisgICAgZm10ICAgICAgICAgLSBUaGUgZm9ybWF0IHN0cmluZworCitSZXR1cm5zOgorCisgICAgQWxsb2NhdGVkIGJ1ZmZlciB3aXRoIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHByaW50ZWQgaW4gaXQuICAKKyAgICBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gICBUaGUgYnVmZmVyCisgICAgYWxsb2NhdGlvbiBpcyBub3QgcGFja2VkLgorCistLSovCit7CisgICAgUE9PTF9QUklOVCAgICAgICAgICBzcGM7CisgICAgdmFfbGlzdCAgICAgICAgICAgICBhcmdzOworCisgICAgWmVyb01lbSAoJnNwYywgc2l6ZW9mKHNwYykpOworICAgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOworICAgIF9Qb29sQ2F0UHJpbnQgKGZtdCwgYXJncywgJnNwYywgX1Bvb2xQcmludCk7CisgICAgdmFfZW5kIChhcmdzKTsKKyAgICByZXR1cm4gc3BjLnN0cjsKK30KKworCisKK0NIQVIxNiAqCitDYXRQcmludCAoCisgICAgSU4gT1VUIFBPT0xfUFJJTlQgICAqU3RyLAorICAgIElOIENIQVIxNiAgICAgICAgICAgKmZtdCwKKyAgICAuLi4KKyAgICApCisvKisrCisKK1JvdXRpbmUgRGVzY3JpcHRpb246CisKKyAgICBDb25jYXRlbmF0ZXMgYSBmb3JtYXR0ZWQgdW5pY29kZSBzdHJpbmcgdG8gYWxsb2NhdGVkIHBvb2wuICAKKyAgICBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgcmVzdWx0aW5nIGJ1ZmZlci4KKworQXJndW1lbnRzOgorCisgICAgU3RyICAgICAgICAgLSBUcmFja3MgdGhlIGFsbG9jYXRlZCBwb29sLCBzaXplIGluIHVzZSwgYW5kIAorICAgICAgICAgICAgICAgICAgYW1vdW50IG9mIHBvb2wgYWxsb2NhdGVkLgorCisgICAgZm10ICAgICAgICAgLSBUaGUgZm9ybWF0IHN0cmluZworCitSZXR1cm5zOgorCisgICAgQWxsb2NhdGVkIGJ1ZmZlciB3aXRoIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHByaW50ZWQgaW4gaXQuICAKKyAgICBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gICBUaGUgYnVmZmVyCisgICAgYWxsb2NhdGlvbiBpcyBub3QgcGFja2VkLgorCistLSovCit7CisgICAgdmFfbGlzdCAgICAgICAgICAgICBhcmdzOworCisgICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisgICAgX1Bvb2xDYXRQcmludCAoZm10LCBhcmdzLCBTdHIsIF9Qb29sUHJpbnQpOworICAgIHZhX2VuZCAoYXJncyk7CisgICAgcmV0dXJuIFN0ci0+c3RyOworfQorCisKKworVUlOVE4KK1ByaW50ICgKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIC4uLgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIFByaW50cyBhIGZvcm1hdHRlZCB1bmljb2RlIHN0cmluZyB0byB0aGUgZGVmYXVsdCBjb25zb2xlCisKK0FyZ3VtZW50czoKKworICAgIGZtdCAgICAgICAgIC0gRm9ybWF0IHN0cmluZworCitSZXR1cm5zOgorCisgICAgTGVuZ3RoIG9mIHN0cmluZyBwcmludGVkIHRvIHRoZSBjb25zb2xlCisKKy0tKi8KK3sKKyAgICB2YV9saXN0ICAgICBhcmdzOworICAgIFVJTlROICAgICAgIGJhY2s7CisKKyAgICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgICBiYWNrID0gX0lQcmludCAoKFVJTlROKSAtMSwgKFVJTlROKSAtMSwgU1QtPkNvbk91dCwgZm10LCBOVUxMLCBhcmdzKTsKKyAgICB2YV9lbmQgKGFyZ3MpOworICAgIHJldHVybiBiYWNrOworfQorCitVSU5UTgorVlByaW50ICgKKyAgICBJTiBDSEFSMTYgICAqZm10LAorICAgIHZhX2xpc3QgICAgIGFyZ3MKKyAgICApCisvKisrCisKK1JvdXRpbmUgRGVzY3JpcHRpb246CisKKyAgICBQcmludHMgYSBmb3JtYXR0ZWQgdW5pY29kZSBzdHJpbmcgdG8gdGhlIGRlZmF1bHQgY29uc29sZSB1c2luZyBhIHZhX2xpc3QKKworQXJndW1lbnRzOgorCisgICAgZm10ICAgICAgICAgLSBGb3JtYXQgc3RyaW5nCisgICAgYXJncyAgICAgICAgLSB2YV9saXN0CitSZXR1cm5zOgorCisgICAgTGVuZ3RoIG9mIHN0cmluZyBwcmludGVkIHRvIHRoZSBjb25zb2xlCisKKy0tKi8KK3sKKyAgICByZXR1cm4gX0lQcmludCAoKFVJTlROKSAtMSwgKFVJTlROKSAtMSwgU1QtPkNvbk91dCwgZm10LCBOVUxMLCBhcmdzKTsKK30KKworCitVSU5UTgorUHJpbnRBdCAoCisgICAgSU4gVUlOVE4gICAgIENvbHVtbiwKKyAgICBJTiBVSU5UTiAgICAgUm93LAorICAgIElOIENIQVIxNiAgICAqZm10LAorICAgIC4uLgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIFByaW50cyBhIGZvcm1hdHRlZCB1bmljb2RlIHN0cmluZyB0byB0aGUgZGVmYXVsdCBjb25zb2xlLCBhdCAKKyAgICB0aGUgc3VwcGxpZWQgY3Vyc29yIHBvc2l0aW9uCisKK0FyZ3VtZW50czoKKworICAgIENvbHVtbiwgUm93IC0gVGhlIGN1cnNvciBwb3NpdGlvbiB0byBwcmludCB0aGUgc3RyaW5nIGF0CisKKyAgICBmbXQgICAgICAgICAtIEZvcm1hdCBzdHJpbmcKKworUmV0dXJuczoKKworICAgIExlbmd0aCBvZiBzdHJpbmcgcHJpbnRlZCB0byB0aGUgY29uc29sZQorCistLSovCit7CisgICAgdmFfbGlzdCAgICAgYXJnczsKKyAgICBVSU5UTiAgICAgICBiYWNrOworCisgICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisgICAgYmFjayA9IF9JUHJpbnQgKENvbHVtbiwgUm93LCBTVC0+Q29uT3V0LCBmbXQsIE5VTEwsIGFyZ3MpOworICAgIHZhX2VuZCAoYXJncyk7CisgICAgcmV0dXJuIGJhY2s7Cit9CisKKworVUlOVE4KK0lQcmludCAoCisgICAgSU4gU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAqT3V0LAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKmZtdCwKKyAgICAuLi4KKyAgICApCisvKisrCisKK1JvdXRpbmUgRGVzY3JpcHRpb246CisKKyAgICBQcmludHMgYSBmb3JtYXR0ZWQgdW5pY29kZSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBjb25zb2xlCisKK0FyZ3VtZW50czoKKworICAgIE91dCAgICAgICAgIC0gVGhlIGNvbnNvbGUgdG8gcHJpbnQgdGhlIHN0cmluZyB0b28KKworICAgIGZtdCAgICAgICAgIC0gRm9ybWF0IHN0cmluZworCitSZXR1cm5zOgorCisgICAgTGVuZ3RoIG9mIHN0cmluZyBwcmludGVkIHRvIHRoZSBjb25zb2xlCisKKy0tKi8KK3sKKyAgICB2YV9saXN0ICAgICBhcmdzOworICAgIFVJTlROICAgICAgIGJhY2s7CisKKyAgICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgICBiYWNrID0gX0lQcmludCAoKFVJTlROKSAtMSwgKFVJTlROKSAtMSwgT3V0LCBmbXQsIE5VTEwsIGFyZ3MpOworICAgIHZhX2VuZCAoYXJncyk7CisgICAgcmV0dXJuIGJhY2s7Cit9CisKKworVUlOVE4KK0lQcmludEF0ICgKKyAgICBJTiBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqT3V0LAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbiwKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3csCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZtdCwKKyAgICAuLi4KKyAgICApCisvKisrCisKK1JvdXRpbmUgRGVzY3JpcHRpb246CisKKyAgICBQcmludHMgYSBmb3JtYXR0ZWQgdW5pY29kZSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBjb25zb2xlLCBhdAorICAgIHRoZSBzdXBwbGllZCBjdXJzb3IgcG9zaXRpb24KKworQXJndW1lbnRzOgorCisgICAgT3V0ICAgICAgICAgLSBUaGUgY29uc29sZSB0byBwcmludCB0aGUgc3RyaW5nIHRvbworCisgICAgQ29sdW1uLCBSb3cgLSBUaGUgY3Vyc29yIHBvc2l0aW9uIHRvIHByaW50IHRoZSBzdHJpbmcgYXQKKworICAgIGZtdCAgICAgICAgIC0gRm9ybWF0IHN0cmluZworCitSZXR1cm5zOgorCisgICAgTGVuZ3RoIG9mIHN0cmluZyBwcmludGVkIHRvIHRoZSBjb25zb2xlCisKKy0tKi8KK3sKKyAgICB2YV9saXN0ICAgICBhcmdzOworICAgIFVJTlROICAgICAgIGJhY2s7CisKKyAgICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgICBiYWNrID0gX0lQcmludCAoQ29sdW1uLCBSb3csIFNULT5Db25PdXQsIGZtdCwgTlVMTCwgYXJncyk7CisgICAgdmFfZW5kIChhcmdzKTsKKyAgICByZXR1cm4gYmFjazsKK30KKworCitVSU5UTgorX0lQcmludCAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdywKKyAgICBJTiBTSU1QTEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICAgICAqT3V0LAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbXQsCisgICAgSU4gQ0hBUjggICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZtdGEsCisgICAgSU4gdmFfbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncworICAgICkKKy8vIERpc3BsYXkgc3RyaW5nIHdvcmtlciBmb3I6IFByaW50LCBQcmludEF0LCBJUHJpbnQsIElQcmludEF0Cit7CisgICAgUFJJTlRfU1RBVEUgICAgIHBzOworICAgIFVJTlROICAgICAgICAgICAgYmFjazsKKworICAgIFplcm9NZW0gKCZwcywgc2l6ZW9mKHBzKSk7CisgICAgcHMuQ29udGV4dCA9IE91dDsKKyAgICBwcy5PdXRwdXQgID0gKElOVE4gRUZJQVBJICgqKShWT0lEICosIENIQVIxNiAqKSkgT3V0LT5PdXRwdXRTdHJpbmc7CisgICAgcHMuU2V0QXR0ciA9IChJTlROIEVGSUFQSSAoKikoVk9JRCAqLCBVSU5UTikpICBPdXQtPlNldEF0dHJpYnV0ZTsKKyAgICBwcy5BdHRyID0gT3V0LT5Nb2RlLT5BdHRyaWJ1dGU7CisgICAKKyAgICBiYWNrID0gKHBzLkF0dHIgPj4gNCkgJiAweEY7CisgICAgcHMuQXR0ck5vcm0gPSBFRklfVEVYVF9BVFRSKEVGSV9MSUdIVEdSQVksIGJhY2spOworICAgIHBzLkF0dHJIaWdobGlnaHQgPSBFRklfVEVYVF9BVFRSKEVGSV9XSElURSwgYmFjayk7CisgICAgcHMuQXR0ckVycm9yID0gRUZJX1RFWFRfQVRUUihFRklfWUVMTE9XLCBiYWNrKTsKKworICAgIGlmIChmbXQpIHsKKyAgICAgICAgcHMuZm10LnB3ID0gZm10OworICAgIH0gZWxzZSB7CisgICAgICAgIHBzLmZtdC5Bc2NpaSA9IFRSVUU7CisgICAgICAgIHBzLmZtdC5wYyA9IGZtdGE7CisgICAgfQorCisgICAgdmFfY29weShwcy5hcmdzLCBhcmdzKTsKKworICAgIGlmIChDb2x1bW4gIT0gKFVJTlROKSAtMSkgeworICAgICAgICB1ZWZpX2NhbGxfd3JhcHBlcihPdXQtPlNldEN1cnNvclBvc2l0aW9uLCAzLCBPdXQsIENvbHVtbiwgUm93KTsKKyAgICB9CisKKyAgICBiYWNrID0gX1ByaW50ICgmcHMpOworICAgIHZhX2VuZChwcy5hcmdzKTsKKyAgICByZXR1cm4gYmFjazsKK30KKworCitVSU5UTgorQVByaW50ICgKKyAgICBJTiBDSEFSOCAgICAqZm10LAorICAgIC4uLgorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIEZvciB0aG9zZSB3aG9tIHJlYWxseSBjYW4ndCBkZWFsIHdpdGggdW5pY29kZSwgYSBwcmludAorICAgIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gYXNjaWkgZm9ybWF0IHN0cmluZworCitBcmd1bWVudHM6CisKKyAgICBmbXQgICAgICAgICAtIGFzY2lpIGZvcm1hdCBzdHJpbmcKKworUmV0dXJuczoKKworICAgIExlbmd0aCBvZiBzdHJpbmcgcHJpbnRlZCB0byB0aGUgY29uc29sZQorCistLSovCisKK3sKKyAgICB2YV9saXN0ICAgICBhcmdzOworICAgIFVJTlROICAgICAgIGJhY2s7CisKKyAgICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgICBiYWNrID0gX0lQcmludCAoKFVJTlROKSAtMSwgKFVJTlROKSAtMSwgU1QtPkNvbk91dCwgTlVMTCwgZm10LCBhcmdzKTsKKyAgICB2YV9lbmQgKGFyZ3MpOworICAgIHJldHVybiBiYWNrOworfQorCisKK1NUQVRJQworVk9JRAorUEZMVVNIICgKKyAgICBJTiBPVVQgUFJJTlRfU1RBVEUgICAgICpwcworICAgICkKK3sKKyAgICAqcHMtPlBvcyA9IDA7CisgICAgaWYgKElzTG9jYWxQcmludChwcy0+T3V0cHV0KSkKKwlwcy0+T3V0cHV0KHBzLT5Db250ZXh0LCBwcy0+QnVmZmVyKTsJCQorICAgIGVsc2UKKyAgICAJdWVmaV9jYWxsX3dyYXBwZXIocHMtPk91dHB1dCwgMiwgcHMtPkNvbnRleHQsIHBzLT5CdWZmZXIpOworICAgIHBzLT5Qb3MgPSBwcy0+QnVmZmVyOworfQorCitTVEFUSUMKK1ZPSUQKK1BTRVRBVFRSICgKKyAgICBJTiBPVVQgUFJJTlRfU1RBVEUgICpwcywKKyAgICBJTiBVSU5UTiAgICAgICAgICAgICBBdHRyCisgICAgKQoreworICAgUEZMVVNIIChwcyk7CisKKyAgIHBzLT5SZXN0b3JlQXR0ciA9IHBzLT5BdHRyOworICAgaWYgKHBzLT5TZXRBdHRyKSB7CisJdWVmaV9jYWxsX3dyYXBwZXIocHMtPlNldEF0dHIsIDIsIHBzLT5Db250ZXh0LCBBdHRyKTsKKyAgIH0KKworICAgcHMtPkF0dHIgPSBBdHRyOworfSAgIAorCitTVEFUSUMKK1ZPSUQKK1BQVVRDICgKKyAgICBJTiBPVVQgUFJJTlRfU1RBVEUgICAgICpwcywKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgIGMKKyAgICApCit7CisgICAgLy8gaWYgdGhpcyBpcyBhIG5ld2xpbmUsIGFkZCBhIGNhcnJhaWdlIHJldHVybgorICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgUFBVVEMgKHBzLCAnXHInKTsKKyAgICB9CisKKyAgICAqcHMtPlBvcyA9IGM7CisgICAgcHMtPlBvcyArPSAxOworICAgIHBzLT5MZW4gKz0gMTsKKworICAgIC8vIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgZmx1c2ggaXQKKyAgICBpZiAocHMtPlBvcyA+PSBwcy0+RW5kKSB7CisgICAgICAgIFBGTFVTSChwcyk7CisgICAgfQorfQorCisKK1NUQVRJQworQ0hBUjE2CitQR0VUQyAoCisgICAgSU4gUE9JTlRFUiAgICAgICpwCisgICAgKQoreworICAgIENIQVIxNiAgICAgIGM7CisKKyAgICBjID0gcC0+QXNjaWkgPyBwLT5wY1twLT5JbmRleF0gOiBwLT5wd1twLT5JbmRleF07CisgICAgcC0+SW5kZXggKz0gMTsKKworICAgIHJldHVybiAgYzsKK30KKworCitTVEFUSUMKK1ZPSUQKK1BJVEVNICgKKyAgICBJTiBPVVQgUFJJTlRfU1RBVEUgICpwcworICAgICkKK3sKKyAgICBVSU5UTiAgICAgICAgICAgICAgIExlbiwgaTsKKyAgICBQUklOVF9JVEVNICAgICAgICAgICpJdGVtOworICAgIENIQVIxNiAgICAgICAgICAgICAgYzsKKworICAgIC8vIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBpdGVtCisgICAgSXRlbSA9IHBzLT5JdGVtOworICAgIEl0ZW0tPkl0ZW0uSW5kZXggPSAwOworICAgIHdoaWxlIChJdGVtLT5JdGVtLkluZGV4IDwgSXRlbS0+RmllbGRXaWR0aCkgeworICAgICAgICBjID0gUEdFVEMoJkl0ZW0tPkl0ZW0pOworICAgICAgICBpZiAoIWMpIHsKKyAgICAgICAgICAgIEl0ZW0tPkl0ZW0uSW5kZXggLT0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIExlbiA9IEl0ZW0tPkl0ZW0uSW5kZXg7CisKKyAgICAvLyBpZiB0aGVyZSBpcyBubyBpdGVtIGZpZWxkIHdpZHRoLCB1c2UgdGhlIGl0ZW1zIHdpZHRoCisgICAgaWYgKEl0ZW0tPkZpZWxkV2lkdGggPT0gKFVJTlROKSAtMSkgeworICAgICAgICBJdGVtLT5GaWVsZFdpZHRoID0gTGVuOworICAgIH0KKworICAgIC8vIGlmIGl0ZW0gaXMgbGFyZ2VyIHRoZW4gd2lkdGgsIHVwZGF0ZSB3aWR0aAorICAgIGlmIChMZW4gPiBJdGVtLT5XaWR0aCkgeworICAgICAgICBJdGVtLT5XaWR0aCA9IExlbjsKKyAgICB9CisKKworICAgIC8vIGlmIHBhZCBmaWVsZCBiZWZvcmUsIGFkZCBwYWQgY2hhcgorICAgIGlmIChJdGVtLT5QYWRCZWZvcmUpIHsKKyAgICAgICAgZm9yIChpPUl0ZW0tPldpZHRoOyBpIDwgSXRlbS0+RmllbGRXaWR0aDsgaSs9MSkgeworICAgICAgICAgICAgUFBVVEMgKHBzLCAnICcpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcGFkIGl0ZW0KKyAgICBmb3IgKGk9TGVuOyBpIDwgSXRlbS0+V2lkdGg7IGkrKykgeworICAgICAgICBQUFVUQyAocHMsIEl0ZW0tPlBhZCk7CisgICAgfQorCisgICAgLy8gYWRkIHRoZSBpdGVtCisgICAgSXRlbS0+SXRlbS5JbmRleD0wOyAKKyAgICB3aGlsZSAoSXRlbS0+SXRlbS5JbmRleCA8IExlbikgeworICAgICAgICBQUFVUQyAocHMsIFBHRVRDKCZJdGVtLT5JdGVtKSk7CisgICAgfQorCisgICAgLy8gSWYgcGFkIGF0IHRoZSBlbmQsIGFkZCBwYWQgY2hhcgorICAgIGlmICghSXRlbS0+UGFkQmVmb3JlKSB7CisgICAgICAgIGZvciAoaT1JdGVtLT5XaWR0aDsgaSA8IEl0ZW0tPkZpZWxkV2lkdGg7IGkrPTEpIHsKKyAgICAgICAgICAgIFBQVVRDIChwcywgJyAnKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitTVEFUSUMKK1VJTlROCitfUHJpbnQgKAorICAgIElOIFBSSU5UX1NUQVRFICAgICAqcHMKKyAgICApCisvKisrCisKK1JvdXRpbmUgRGVzY3JpcHRpb246CisKKyAgICAldy5sRiAgIC0gICB3ID0gd2lkdGgKKyAgICAgICAgICAgICAgICBsID0gZmllbGQgd2lkdGgKKyAgICAgICAgICAgICAgICBGID0gZm9ybWF0IG9mIGFyZworCisgIEFyZ3MgRjoKKyAgICAwICAgICAgIC0gICBwYWQgd2l0aCB6ZXJvcworICAgIC0gICAgICAgLSAgIGp1c3RpZnkgb24gbGVmdCAoZGVmYXVsdCBpcyBvbiByaWdodCkKKyAgICAsICAgICAgIC0gICBhZGQgY29tbWEncyB0byBmaWVsZCAgICAKKyAgICAqICAgICAgIC0gICB3aWR0aCBwcm92aWRlZCBvbiBzdGFjaworICAgIG4gICAgICAgLSAgIFNldCBvdXRwdXQgYXR0cmlidXRlIHRvIG5vcm1hbCAoZm9yIHRoaXMgZmllbGQgb25seSkKKyAgICBoICAgICAgIC0gICBTZXQgb3V0cHV0IGF0dHJpYnV0ZSB0byBoaWdobGlnaHQgKGZvciB0aGlzIGZpZWxkIG9ubHkpCisgICAgZSAgICAgICAtICAgU2V0IG91dHB1dCBhdHRyaWJ1dGUgdG8gZXJyb3IgKGZvciB0aGlzIGZpZWxkIG9ubHkpCisgICAgbCAgICAgICAtICAgVmFsdWUgaXMgNjQgYml0cworCisgICAgYSAgICAgICAtICAgYXNjaWkgc3RyaW5nCisgICAgcyAgICAgICAtICAgdW5pY29kZSBzdHJpbmcKKyAgICBYICAgICAgIC0gICBmaXhlZCA4IGJ5dGUgdmFsdWUgaW4gaGV4CisgICAgeCAgICAgICAtICAgaGV4IHZhbHVlCisgICAgZCAgICAgICAtICAgdmFsdWUgYXMgZGVjaW1hbCAgICAKKyAgICBjICAgICAgIC0gICBVbmljb2RlIGNoYXIKKyAgICB0ICAgICAgIC0gICBFRkkgdGltZSBzdHJ1Y3R1cmUKKyAgICBnICAgICAgIC0gICBQb2ludGVyIHRvIEdVSUQKKyAgICByICAgICAgIC0gICBFRkkgc3RhdHVzIGNvZGUgKHJlc3VsdCBjb2RlKQorCisgICAgTiAgICAgICAtICAgU2V0IG91dHB1dCBhdHRyaWJ1dGUgdG8gbm9ybWFsCisgICAgSCAgICAgICAtICAgU2V0IG91dHB1dCBhdHRyaWJ1dGUgdG8gaGlnaGxpZ2h0CisgICAgRSAgICAgICAtICAgU2V0IG91dHB1dCBhdHRyaWJ1dGUgdG8gZXJyb3IKKyAgICAlICAgICAgIC0gICBQcmludCBhICUKKyAgICAKK0FyZ3VtZW50czoKKworICAgIFN5c3RlbVRhYmxlICAgICAtIFRoZSBzeXN0ZW0gdGFibGUKKworUmV0dXJuczoKKworICAgIE51bWJlciBvZiBjaGFyYWN0b3JzIHdyaXR0ZW4gICAKKworLS0qLworeworICAgIENIQVIxNiAgICAgICAgICBjOworICAgIFVJTlROICAgICAgICAgICBBdHRyOworICAgIFBSSU5UX0lURU0gICAgICBJdGVtOworICAgIENIQVIxNiAgICAgICAgICBCdWZmZXJbUFJJTlRfU1RSSU5HX0xFTl07CisKKyAgICBwcy0+TGVuID0gMDsKKyAgICBwcy0+QnVmZmVyID0gQnVmZmVyOworICAgIHBzLT5Qb3MgPSBCdWZmZXI7CisgICAgcHMtPkVuZCA9IEJ1ZmZlciArIFBSSU5UX1NUUklOR19MRU4gLSAxOworICAgIHBzLT5JdGVtID0gJkl0ZW07CisKKyAgICBwcy0+Zm10LkluZGV4ID0gMDsKKyAgICB3aGlsZSAoKGMgPSBQR0VUQygmcHMtPmZtdCkpKSB7CisKKyAgICAgICAgaWYgKGMgIT0gJyUnKSB7CisgICAgICAgICAgICBQUFVUQyAoIHBzLCBjICk7CisgICAgICAgICAgICBjb250aW51ZTsgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldHVwIGZvciBuZXcgaXRlbQorICAgICAgICBJdGVtLkZpZWxkV2lkdGggPSAoVUlOVE4pIC0xOworICAgICAgICBJdGVtLldpZHRoID0gMDsKKyAgICAgICAgSXRlbS5XaWR0aFBhcnNlID0gJkl0ZW0uV2lkdGg7CisgICAgICAgIEl0ZW0uUGFkID0gJyAnOworICAgICAgICBJdGVtLlBhZEJlZm9yZSA9IFRSVUU7CisgICAgICAgIEl0ZW0uQ29tbWEgPSBGQUxTRTsKKyAgICAgICAgSXRlbS5Mb25nID0gRkFMU0U7CisgICAgICAgIEl0ZW0uSXRlbS5Bc2NpaSA9IEZBTFNFOworICAgICAgICBJdGVtLkl0ZW0ucHcgPSBOVUxMOworICAgICAgICBwcy0+UmVzdG9yZUF0dHIgPSAwOworICAgICAgICBBdHRyID0gMDsKKworICAgICAgICB3aGlsZSAoKGMgPSBQR0VUQygmcHMtPmZtdCkpKSB7CisKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICUlIC0+ICUKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEl0ZW0uSXRlbS5wdyA9IEl0ZW0uU2NyYXRjaDsKKyAgICAgICAgICAgICAgICBJdGVtLkl0ZW0ucHdbMF0gPSAnJSc7ICAKKyAgICAgICAgICAgICAgICBJdGVtLkl0ZW0ucHdbMV0gPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgICAgICBJdGVtLlBhZCA9ICcwJzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgSXRlbS5QYWRCZWZvcmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICAgICAgSXRlbS5Db21tYSA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgICAgIEl0ZW0uV2lkdGhQYXJzZSA9ICZJdGVtLkZpZWxkV2lkdGg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJyonOgorICAgICAgICAgICAgICAgICpJdGVtLldpZHRoUGFyc2UgPSB2YV9hcmcocHMtPmFyZ3MsIFVJTlROKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgY2FzZSAnNCc6CisgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgY2FzZSAnNyc6CisgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgICAgICpJdGVtLldpZHRoUGFyc2UgPSAwOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgKkl0ZW0uV2lkdGhQYXJzZSA9ICpJdGVtLldpZHRoUGFyc2UgKiAxMCArIGMgLSAnMCc7CisgICAgICAgICAgICAgICAgICAgIGMgPSBQR0VUQygmcHMtPmZtdCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoYyA+PSAnMCcgICYmICBjIDw9ICc5JykgOworICAgICAgICAgICAgICAgIHBzLT5mbXQuSW5kZXggLT0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnYSc6CisgICAgICAgICAgICAgICAgSXRlbS5JdGVtLnBjID0gdmFfYXJnKHBzLT5hcmdzLCBDSEFSOCAqKTsKKyAgICAgICAgICAgICAgICBJdGVtLkl0ZW0uQXNjaWkgPSBUUlVFOworICAgICAgICAgICAgICAgIGlmICghSXRlbS5JdGVtLnBjKSB7CisgICAgICAgICAgICAgICAgICAgIEl0ZW0uSXRlbS5wYyA9IChDSEFSOCAqKSIobnVsbCkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgSXRlbS5JdGVtLnB3ID0gdmFfYXJnKHBzLT5hcmdzLCBDSEFSMTYgKik7CisgICAgICAgICAgICAgICAgaWYgKCFJdGVtLkl0ZW0ucHcpIHsKKyAgICAgICAgICAgICAgICAgICAgSXRlbS5JdGVtLnB3ID0gTCIobnVsbCkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgSXRlbS5JdGVtLnB3ID0gSXRlbS5TY3JhdGNoOworICAgICAgICAgICAgICAgIEl0ZW0uSXRlbS5wd1swXSA9IChDSEFSMTYpIHZhX2FyZyhwcy0+YXJncywgVUlOVE4pOyAgCisgICAgICAgICAgICAgICAgSXRlbS5JdGVtLnB3WzFdID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgSXRlbS5Mb25nID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICAgICAgSXRlbS5XaWR0aCA9IEl0ZW0uTG9uZyA/IDE2IDogODsKKyAgICAgICAgICAgICAgICBJdGVtLlBhZCA9ICcwJzsKKyAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgIEl0ZW0uSXRlbS5wdyA9IEl0ZW0uU2NyYXRjaDsKKyAgICAgICAgICAgICAgICBWYWx1ZVRvSGV4ICgKKyAgICAgICAgICAgICAgICAgICAgSXRlbS5JdGVtLnB3LCAKKyAgICAgICAgICAgICAgICAgICAgSXRlbS5Mb25nID8gdmFfYXJnKHBzLT5hcmdzLCBVSU5UNjQpIDogdmFfYXJnKHBzLT5hcmdzLCBVSU5UMzIpCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisKKyAgICAgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgICAgICAgIEl0ZW0uSXRlbS5wdyA9IEl0ZW0uU2NyYXRjaDsKKyAgICAgICAgICAgICAgICBHdWlkVG9TdHJpbmcgKEl0ZW0uSXRlbS5wdywgdmFfYXJnKHBzLT5hcmdzLCBFRklfR1VJRCAqKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgIEl0ZW0uSXRlbS5wdyA9IEl0ZW0uU2NyYXRjaDsKKyAgICAgICAgICAgICAgICBWYWx1ZVRvU3RyaW5nICgKKyAgICAgICAgICAgICAgICAgICAgSXRlbS5JdGVtLnB3LCAKKyAgICAgICAgICAgICAgICAgICAgSXRlbS5Db21tYSwgCisgICAgICAgICAgICAgICAgICAgIEl0ZW0uTG9uZyA/IHZhX2FyZyhwcy0+YXJncywgVUlOVDY0KSA6IHZhX2FyZyhwcy0+YXJncywgVUlOVDMyKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgIEl0ZW0uSXRlbS5wdyA9IEl0ZW0uU2NyYXRjaDsKKyAgICAgICAgICAgICAgICBUaW1lVG9TdHJpbmcgKEl0ZW0uSXRlbS5wdywgdmFfYXJnKHBzLT5hcmdzLCBFRklfVElNRSAqKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgIEl0ZW0uSXRlbS5wdyA9IEl0ZW0uU2NyYXRjaDsKKyAgICAgICAgICAgICAgICBTdGF0dXNUb1N0cmluZyAoSXRlbS5JdGVtLnB3LCB2YV9hcmcocHMtPmFyZ3MsIEVGSV9TVEFUVVMpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgUFNFVEFUVFIocHMsIHBzLT5BdHRyTm9ybSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgIFBTRVRBVFRSKHBzLCBwcy0+QXR0ckhpZ2hsaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgICAgIFBTRVRBVFRSKHBzLCBwcy0+QXR0ckVycm9yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnTic6CisgICAgICAgICAgICAgICAgQXR0ciA9IHBzLT5BdHRyTm9ybTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICAgICAgQXR0ciA9IHBzLT5BdHRySGlnaGxpZ2h0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgICAgICBBdHRyID0gcHMtPkF0dHJFcnJvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBJdGVtLkl0ZW0ucHcgPSBJdGVtLlNjcmF0Y2g7CisgICAgICAgICAgICAgICAgSXRlbS5JdGVtLnB3WzBdID0gJz8nOworICAgICAgICAgICAgICAgIEl0ZW0uSXRlbS5wd1sxXSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gSXRlbQorICAgICAgICAgICAgaWYgKEl0ZW0uSXRlbS5wdykgeworICAgICAgICAgICAgICAgIFBJVEVNIChwcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gQXR0ciBzZXQKKyAgICAgICAgICAgIGlmIChBdHRyKSB7CisgICAgICAgICAgICAgICAgUFNFVEFUVFIocHMsIEF0dHIpOworICAgICAgICAgICAgICAgIHBzLT5SZXN0b3JlQXR0ciA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHMtPlJlc3RvcmVBdHRyKSB7CisgICAgICAgICAgICBQU0VUQVRUUihwcywgcHMtPlJlc3RvcmVBdHRyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZsdXNoIGJ1ZmZlcgorICAgIFBGTFVTSCAocHMpOworICAgIHJldHVybiBwcy0+TGVuOworfQorCitTVEFUSUMgQ0hBUjggSGV4W10gPSB7JzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywKKyAgICAgICAgICAgICAgICAgICAgICAnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnfTsKKworVk9JRAorVmFsdWVUb0hleCAoCisgICAgSU4gQ0hBUjE2ICAgKkJ1ZmZlciwKKyAgICBJTiBVSU5UNjQgICB2CisgICAgKQoreworICAgIENIQVI4ICAgICAgICAgICBzdHJbMzBdLCAqcDE7CisgICAgQ0hBUjE2ICAgICAgICAgICpwMjsKKworICAgIGlmICghdikgeworICAgICAgICBCdWZmZXJbMF0gPSAnMCc7CisgICAgICAgIEJ1ZmZlclsxXSA9IDA7CisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgcDEgPSBzdHI7CisgICAgcDIgPSBCdWZmZXI7CisKKyAgICB3aGlsZSAodikgeworICAgICAgICAqKHAxKyspID0gSGV4W3YgJiAweGZdOworICAgICAgICB2ID0gUlNoaWZ0VTY0ICh2LCA0KTsKKyAgICB9CisKKyAgICB3aGlsZSAocDEgIT0gc3RyKSB7CisgICAgICAgICoocDIrKykgPSAqKC0tcDEpOworICAgIH0KKyAgICAqcDIgPSAwOworfQorCisKK1ZPSUQKK1ZhbHVlVG9TdHJpbmcgKAorICAgIElOIENIQVIxNiAgICpCdWZmZXIsCisgICAgSU4gQk9PTEVBTiAgQ29tbWEsCisgICAgSU4gSU5UNjQgICAgdgorICAgICkKK3sKKyAgICBTVEFUSUMgQ0hBUjggY2FbXSA9IHsgIDMsIDEsIDIgfTsKKyAgICBDSEFSOCAgICAgICAgc3RyWzQwXSwgKnAxOworICAgIENIQVIxNiAgICAgICAqcDI7CisgICAgVUlOVE4gICAgICAgIGMsIHI7CisKKyAgICBpZiAoIXYpIHsKKyAgICAgICAgQnVmZmVyWzBdID0gJzAnOworICAgICAgICBCdWZmZXJbMV0gPSAwOworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHAxID0gc3RyOworICAgIHAyID0gQnVmZmVyOworCisgICAgaWYgKHYgPCAwKSB7CisgICAgICAgICoocDIrKykgPSAnLSc7CisgICAgICAgIHYgPSAtdjsKKyAgICB9CisKKyAgICB3aGlsZSAodikgeworICAgICAgICB2ID0gKElOVDY0KURpdlU2NHgzMiAoKFVJTlQ2NCl2LCAxMCwgJnIpOworICAgICAgICAqKHAxKyspID0gKENIQVI4KXIgKyAnMCc7CisgICAgfQorCisgICAgYyA9IChDb21tYSA/IGNhWyhwMSAtIHN0cikgJSAzXSA6IDk5OSkgKyAxOworICAgIHdoaWxlIChwMSAhPSBzdHIpIHsKKworICAgICAgICBjIC09IDE7CisgICAgICAgIGlmICghYykgeworICAgICAgICAgICAgKihwMisrKSA9ICcsJzsKKyAgICAgICAgICAgIGMgPSAzOworICAgICAgICB9CisKKyAgICAgICAgKihwMisrKSA9ICooLS1wMSk7CisgICAgfQorICAgICpwMiA9IDA7Cit9CisKK1ZPSUQKK1RpbWVUb1N0cmluZyAoCisgICAgT1VUIENIQVIxNiAgICAgICpCdWZmZXIsCisgICAgSU4gRUZJX1RJTUUgICAgICpUaW1lCisgICAgKQoreworICAgIFVJTlROICAgICAgIEhvdXIsIFllYXI7CisgICAgQ0hBUjE2ICAgICAgQW1QbTsKKworICAgIEFtUG0gPSAnYSc7CisgICAgSG91ciA9IFRpbWUtPkhvdXI7CisgICAgaWYgKFRpbWUtPkhvdXIgPT0gMCkgeworICAgICAgICBIb3VyID0gMTI7CisgICAgfSBlbHNlIGlmIChUaW1lLT5Ib3VyID49IDEyKSB7CisgICAgICAgIEFtUG0gPSAncCc7CisgICAgICAgIGlmIChUaW1lLT5Ib3VyID49IDEzKSB7CisgICAgICAgICAgICBIb3VyIC09IDEyOworICAgICAgICB9CisgICAgfQorCisgICAgWWVhciA9IFRpbWUtPlllYXIgJSAxMDA7CisgICAgCisgICAgLy8gYnVnYnVnOiBmb3Igbm93IGp1c3QgcHJpbnQgaXQgYW55IG9sZCB3YXkKKyAgICBTUHJpbnQgKEJ1ZmZlciwgMCwgTCIlMDJkLyUwMmQvJTAyZCAgJTAyZDolMDJkJWMiLAorICAgICAgICBUaW1lLT5Nb250aCwKKyAgICAgICAgVGltZS0+RGF5LAorICAgICAgICBZZWFyLAorICAgICAgICBIb3VyLAorICAgICAgICBUaW1lLT5NaW51dGUsCisgICAgICAgIEFtUG0KKyAgICAgICAgKTsKK30gCisKKworCisKK1ZPSUQKK0R1bXBIZXggKAorICAgIElOIFVJTlROICAgICAgICBJbmRlbnQsCisgICAgSU4gVUlOVE4gICAgICAgIE9mZnNldCwKKyAgICBJTiBVSU5UTiAgICAgICAgRGF0YVNpemUsCisgICAgSU4gVk9JRCAgICAgICAgICpVc2VyRGF0YQorICAgICkKK3sKKyAgICBDSEFSOCAgICAgICAgICAgKkRhdGEsIFZhbFs1MF0sIFN0clsyMF0sIGM7CisgICAgVUlOVE4gICAgICAgICAgIFNpemUsIEluZGV4OworICAgIAorICAgIFVJTlROICAgICAgICAgICBTY3JlZW5Db3VudDsKKyAgICBVSU5UTiAgICAgICAgICAgVGVtcENvbHVtbjsKKyAgICBVSU5UTiAgICAgICAgICAgU2NyZWVuU2l6ZTsKKyAgICBDSEFSMTYgICAgICAgICAgUmV0dXJuU3RyWzFdOworCisKKyAgICB1ZWZpX2NhbGxfd3JhcHBlcihTVC0+Q29uT3V0LT5RdWVyeU1vZGUsIDQsIFNULT5Db25PdXQsIFNULT5Db25PdXQtPk1vZGUtPk1vZGUsICZUZW1wQ29sdW1uLCAmU2NyZWVuU2l6ZSk7CisgICAgU2NyZWVuQ291bnQgPSAwOworICAgIFNjcmVlblNpemUgLT0gMjsKKworICAgIERhdGEgPSBVc2VyRGF0YTsKKyAgICB3aGlsZSAoRGF0YVNpemUpIHsKKyAgICAgICAgU2l6ZSA9IDE2OworICAgICAgICBpZiAoU2l6ZSA+IERhdGFTaXplKSB7CisgICAgICAgICAgICBTaXplID0gRGF0YVNpemU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEluZGV4PTA7IEluZGV4IDwgU2l6ZTsgSW5kZXggKz0gMSkgeworICAgICAgICAgICAgYyA9IERhdGFbSW5kZXhdOworICAgICAgICAgICAgVmFsW0luZGV4KjMrMF0gPSBIZXhbYz4+NF07CisgICAgICAgICAgICBWYWxbSW5kZXgqMysxXSA9IEhleFtjJjB4Rl07CisgICAgICAgICAgICBWYWxbSW5kZXgqMysyXSA9IChJbmRleCA9PSA3KT8nLSc6JyAnOworICAgICAgICAgICAgU3RyW0luZGV4XSA9IChjIDwgJyAnIHx8IGMgPiAneicpID8gJy4nIDogYzsKKyAgICAgICAgfQorCisgICAgICAgIFZhbFtJbmRleCozXSA9IDA7CisgICAgICAgIFN0cltJbmRleF0gPSAwOworICAgICAgICBQcmludCAoTCIlKmElWDogJS0uNDhhIColYSpcbiIsIEluZGVudCwgIiIsIE9mZnNldCwgVmFsLCBTdHIpOworCisgICAgICAgIERhdGEgKz0gU2l6ZTsKKyAgICAgICAgT2Zmc2V0ICs9IFNpemU7CisgICAgICAgIERhdGFTaXplIC09IFNpemU7CisKKyAgICAgICAgU2NyZWVuQ291bnQrKzsKKyAgICAgICAgaWYgKFNjcmVlbkNvdW50ID49IFNjcmVlblNpemUgJiYgU2NyZWVuU2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgU2NyZWVuU2l6ZSA9PSAwIHdlIGhhdmUgdGhlIGNvbnNvbGUgcmVkaXJlY3RlZCBzbyBkb24ndAorICAgICAgICAgICAgLy8gIGJsb2NrIHVwZGF0ZXMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBTY3JlZW5Db3VudCA9IDA7CisgICAgICAgICAgICBQcmludCAoTCJQcmVzcyBFbnRlciB0byBjb250aW51ZSA6Iik7CisgICAgICAgICAgICBJbnB1dCAoTCIiLCBSZXR1cm5TdHIsIHNpemVvZihSZXR1cm5TdHIpL3NpemVvZihDSEFSMTYpKTsKKyAgICAgICAgICAgIFByaW50IChMIlxuIik7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3J1bnRpbWUvZWZpcnRsaWIuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3J1bnRpbWUvZWZpcnRsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzgyZTRjCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvcnVudGltZS9lZmlydGxpYi5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OSAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBFZmlSdExpYi5oCisKK0Fic3RyYWN0OgorCisgICAgRUZJIFJ1bnRpbWUgbGlicmFyeSBmdW5jdGlvbnMKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAiZWZpLmgiCisjaW5jbHVkZSAiZWZpbGliLmgiCisjaW5jbHVkZSAiZWZpcnRsaWIuaCIKKworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBSVU5USU1FX0NPREUoUnRaZXJvTWVtKQorI2VuZGlmCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0WmVyb01lbSAoCisgICAgSU4gVk9JRCAgICAgKkJ1ZmZlciwKKyAgICBJTiBVSU5UTiAgICAgU2l6ZQorICAgICkKK3sKKyAgICBJTlQ4ICAgICAgICAqcHQ7CisKKyAgICBwdCA9IEJ1ZmZlcjsKKyAgICB3aGlsZSAoU2l6ZS0tKSB7CisgICAgICAgICoocHQrKykgPSAwOworICAgIH0KK30KKworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBSVU5USU1FX0NPREUoUnRTZXRNZW0pCisjZW5kaWYKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRTZXRNZW0gKAorICAgIElOIFZPSUQgICAgICpCdWZmZXIsCisgICAgSU4gVUlOVE4gICAgU2l6ZSwKKyAgICBJTiBVSU5UOCAgICBWYWx1ZSAgICAKKyAgICApCit7CisgICAgSU5UOCAgICAgICAgKnB0OworCisgICAgcHQgPSBCdWZmZXI7CisgICAgd2hpbGUgKFNpemUtLSkgeworICAgICAgICAqKHB0KyspID0gVmFsdWU7CisgICAgfQorfQorCisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIFJVTlRJTUVfQ09ERShSdENvcHlNZW0pCisjZW5kaWYKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRDb3B5TWVtICgKKyAgICBJTiBWT0lEICAgICAqRGVzdCwKKyAgICBJTiBDT05TVCBWT0lEICAgICAqU3JjLAorICAgIElOIFVJTlROICAgIGxlbgorICAgICkKK3sKKyAgICBDSEFSOCAgICpkOworICAgIENPTlNUIENIQVI4ICpzID0gU3JjOworICAgIGQgPSBEZXN0OworICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAqKGQrKykgPSAqKHMrKyk7CisgICAgfQorfQorCisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIFJVTlRJTUVfQ09ERShSdENvbXBhcmVNZW0pCisjZW5kaWYKK0lOVE4KK1JVTlRJTUVGVU5DVElPTgorUnRDb21wYXJlTWVtICgKKyAgICBJTiBDT05TVCBWT0lEICAgICAqRGVzdCwKKyAgICBJTiBDT05TVCBWT0lEICAgICAqU3JjLAorICAgIElOIFVJTlROICAgIGxlbgorICAgICkKK3sKKyAgICBDT05TVCBDSEFSOCAgICAqZCA9IERlc3QsICpzID0gU3JjOworICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICBpZiAoKmQgIT0gKnMpIHsKKyAgICAgICAgICAgIHJldHVybiAqZCAtICpzOworICAgICAgICB9CisKKyAgICAgICAgZCArPSAxOworICAgICAgICBzICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgX19HTlVDX18KKyNwcmFnbWEgUlVOVElNRV9DT0RFKFJ0Q29tcGFyZUd1aWQpCisjZW5kaWYKK0lOVE4KK1JVTlRJTUVGVU5DVElPTgorUnRDb21wYXJlR3VpZCAoCisgICAgSU4gRUZJX0dVSUQgICAgICpHdWlkMSwKKyAgICBJTiBFRklfR1VJRCAgICAgKkd1aWQyCisgICAgKQorLyorKworCitSb3V0aW5lIERlc2NyaXB0aW9uOgorCisgICAgQ29tcGFyZXMgdG8gR1VJRHMKKworQXJndW1lbnRzOgorCisgICAgR3VpZDEgICAgICAgLSBndWlkIHRvIGNvbXBhcmUKKyAgICBHdWlkMiAgICAgICAtIGd1aWQgdG8gY29tcGFyZQorCitSZXR1cm5zOgorICAgID0gMCAgICAgaWYgR3VpZDEgPT0gR3VpZDIKKworLS0qLworeworICAgIElOVDMyICAgICAgICpnMSwgKmcyLCByOworCisgICAgLy8KKyAgICAvLyBDb21wYXJlIDMyIGJpdHMgYXQgYSB0aW1lCisgICAgLy8KKworICAgIGcxID0gKElOVDMyICopIEd1aWQxOworICAgIGcyID0gKElOVDMyICopIEd1aWQyOworCisgICAgciAgPSBnMVswXSAtIGcyWzBdOworICAgIHIgfD0gZzFbMV0gLSBnMlsxXTsKKyAgICByIHw9IGcxWzJdIC0gZzJbMl07CisgICAgciB8PSBnMVszXSAtIGcyWzNdOworCisgICAgcmV0dXJuIHI7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvcnVudGltZS9ydGRhdGEuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3J1bnRpbWUvcnRkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmY2JmMwotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3J1bnRpbWUvcnRkYXRhLmMKQEAgLTAsMCArMSw2NSBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgZGF0YS5jCisKK0Fic3RyYWN0OgorCisgICAgRUZJIGxpYnJhcnkgZ2xvYmFsIGRhdGEKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAibGliLmgiCisKKworLy8KKy8vIFRoZXNlIGdsb2JhbHMgYXJlIHJ1bnRpbWUgZ2xvYmFscworLy8KKy8vIE4uQi4gVGhlIE1pY3Jvc29mdCBDIGNvbXBpbGVyIHdpbGwgb25seSBwdXQgdGhlIGRhdGEgaW4gdGhlCisvLyByaWdodCBkYXRhIHNlY3Rpb24gaWYgaXQgaXMgZXhwbGljaXRseSBpbml0aWFsaXplZC4uCisvLworCisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIEJFR0lOX1JVTlRJTUVfREFUQSgpCisjZW5kaWYKKworLy8KKy8vIFJUIC0gcG9pbnRlciB0byB0aGUgcnVudGltZSB0YWJsZQorLy8KKworRUZJX1JVTlRJTUVfU0VSVklDRVMgICAgKlJUOworCisvLworLy8gTGliU3RhbmRhbG9uZSAtIFRSVUUgaWYgbGliIGlzIGxpbmtlZCBpbiBhcyBwYXJ0IG9mIHRoZSBmaXJtd2FyZS4KKy8vIE4uQi4gVGhlIEVGSSBmdyBzZXRzIHRoaXMgdmFsdWUgZGlyZWN0bHkKKy8vCisKK0JPT0xFQU4gIExpYkZ3SW5zdGFuY2U7CisKKy8vCisvLyBFRklEZWJ1ZyAtIERlYnVnIG1hc2sKKy8vCisKK1VJTlROICAgIEVGSURlYnVnICAgID0gRUZJX0RCVUdfTUFTSzsKKworLy8KKy8vIExpYlJ1bnRpbWVEZWJ1Z091dCAtIFJ1bnRpbWUgRGVidWcgT3V0cHV0IGRldmljZQorLy8KKworU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRSAgICAqTGliUnVudGltZURlYnVnT3V0OworCisvLworLy8gTGliUnVudGltZVJhaXNlVFBMLCBMaWJSdW50aW1lUmVzdG9yZVRQTCAtIHBvaW50ZXJzIHRvIFJ1bnRpbWUgZnVuY3Rpb25zIGZyb20gdGhlIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3QgU2VydmljZXMgVGFibGUKKy8vCisKK0VGSV9SQUlTRV9UUEwgICBMaWJSdW50aW1lUmFpc2VUUEwgICA9IE5VTEw7CitFRklfUkVTVE9SRV9UUEwgTGliUnVudGltZVJlc3RvcmVUUEwgPSBOVUxMOworCmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9ydW50aW1lL3J0bG9jay5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvcnVudGltZS9ydGxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWFmZGNhCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvcnVudGltZS9ydGxvY2suYwpAQCAtMCwwICsxLDEwMiBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgbG9jay5jCisKK0Fic3RyYWN0OgorCisgICAgSW1wbGVtZW50cyBGTE9DSworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKworI2luY2x1ZGUgImxpYi5oIgorCisKKworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBSVU5USU1FX0NPREUoUnRBY3F1aXJlTG9jaykKKyNlbmRpZgorVk9JRAorUnRBY3F1aXJlTG9jayAoCisgICAgSU4gRkxPQ0sgICAgKkxvY2sKKyAgICApCisvKisrCisKK1JvdXRpbmUgRGVzY3JpcHRpb246CisKKyAgICBSYWlzaW5nIHRvIHRoZSB0YXNrIHByaW9yaXR5IGxldmVsIG9mIHRoZSBtdXR1YWwgZXhjbHVzaW9uCisgICAgbG9jaywgYW5kIHRoZW4gYWNxdWlyZXMgb3duZXJzaGlwIG9mIHRoZSBsb2NrLgorICAgIAorQXJndW1lbnRzOgorCisgICAgTG9jayAgICAgICAgLSBUaGUgbG9jayB0byBhY3F1aXJlCisgICAgCitSZXR1cm5zOgorCisgICAgTG9jayBvd25lZAorCistLSovCit7CisgICAgaWYgKEJTKSB7CisgICAgICAgIGlmIChCUy0+UmFpc2VUUEwgIT0gTlVMTCkgeworICAgICAgICAgICAgTG9jay0+T3duZXJUcGwgPSB1ZWZpX2NhbGxfd3JhcHBlcihCUy0+UmFpc2VUUEwsIDEsIExvY2stPlRwbCk7CisgICAgICAgIH0gCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoTGliUnVudGltZVJhaXNlVFBMICE9IE5VTEwpIHsKKyAgICAgICAgICAgIExvY2stPk93bmVyVHBsID0gTGliUnVudGltZVJhaXNlVFBMKExvY2stPlRwbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgTG9jay0+TG9jayArPSAxOworICAgIEFTU0VSVCAoTG9jay0+TG9jayA9PSAxKTsKK30KKworCisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIFJVTlRJTUVfQ09ERShSdEFjcXVpcmVMb2NrKQorI2VuZGlmCitWT0lECitSdFJlbGVhc2VMb2NrICgKKyAgICBJTiBGTE9DSyAgICAqTG9jaworICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIFJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgbXV0dWFsIGV4Y2x1c2lvbiBsb2NrLCBhbmQKKyAgICByZXN0b3JlcyB0aGUgcHJldmlvdXMgdGFzayBwcmlvcml0eSBsZXZlbC4KKyAgICAKK0FyZ3VtZW50czoKKworICAgIExvY2sgICAgICAgIC0gVGhlIGxvY2sgdG8gcmVsZWFzZQorICAgIAorUmV0dXJuczoKKworICAgIExvY2sgdW5vd25lZAorCistLSovCit7CisgICAgRUZJX1RQTCAgICAgVHBsOworCisgICAgVHBsID0gTG9jay0+T3duZXJUcGw7CisgICAgQVNTRVJUKExvY2stPkxvY2sgPT0gMSk7CisgICAgTG9jay0+TG9jayAtPSAxOworICAgIGlmIChCUykgeworICAgICAgICBpZiAoQlMtPlJlc3RvcmVUUEwgIT0gTlVMTCkgeworICAgICAgICAgICAgdWVmaV9jYWxsX3dyYXBwZXIoQlMtPlJlc3RvcmVUUEwsIDEsIFRwbCk7CisgICAgICAgIH0gCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoTGliUnVudGltZVJlc3RvcmVUUEwgIT0gTlVMTCkgeworICAgICAgICAgICAgTGliUnVudGltZVJlc3RvcmVUUEwoVHBsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3J1bnRpbWUvcnRzdHIuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3J1bnRpbWUvcnRzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjgzYzA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvcnVudGltZS9ydHN0ci5jCkBAIC0wLDAgKzEsMTQwIEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBzdHIuYworCitBYnN0cmFjdDoKKworICAgIFN0cmluZyBydW50aW1lIGZ1bmN0aW9ucworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAibGliLmgiCisKKyNpZm5kZWYgX19HTlVDX18KKyNwcmFnbWEgUlVOVElNRV9DT0RFKFJ0QWNxdWlyZUxvY2spCisjZW5kaWYKK0lOVE4KK1JVTlRJTUVGVU5DVElPTgorUnRTdHJDbXAgKAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczIKKyAgICApCisvLyBjb21wYXJlIHN0cmluZ3MKK3sKKyAgICB3aGlsZSAoKnMxKSB7CisgICAgICAgIGlmICgqczEgIT0gKnMyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHMxICs9IDE7CisgICAgICAgIHMyICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuICpzMSAtICpzMjsKK30KKworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBSVU5USU1FX0NPREUoUnRTdHJDcHkpCisjZW5kaWYKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRTdHJDcHkgKAorICAgIElOIENIQVIxNiAgICpEZXN0LAorICAgIElOIENPTlNUIENIQVIxNiAgICpTcmMKKyAgICApCisvLyBjb3B5IHN0cmluZ3MKK3sKKyAgICB3aGlsZSAoKlNyYykgeworICAgICAgICAqKERlc3QrKykgPSAqKFNyYysrKTsKKyAgICB9CisgICAgKkRlc3QgPSAwOworfQorCisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIFJVTlRJTUVfQ09ERShSdFN0ckNhdCkKKyNlbmRpZgorVk9JRAorUlVOVElNRUZVTkNUSU9OCitSdFN0ckNhdCAoCisgICAgSU4gQ0hBUjE2ICAgKkRlc3QsCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKlNyYworICAgICkKK3sgICAKKyAgICBSdFN0ckNweShEZXN0K1N0ckxlbihEZXN0KSwgU3JjKTsKK30KKworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBSVU5USU1FX0NPREUoUnRTdHJMZW4pCisjZW5kaWYKK1VJTlROCitSVU5USU1FRlVOQ1RJT04KK1J0U3RyTGVuICgKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczEKKyAgICApCisvLyBzdHJpbmcgbGVuZ3RoCit7CisgICAgVUlOVE4gICAgICAgIGxlbjsKKyAgICAKKyAgICBmb3IgKGxlbj0wOyAqczE7IHMxKz0xLCBsZW4rPTEpIDsKKyAgICByZXR1cm4gbGVuOworfQorCisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIFJVTlRJTUVfQ09ERShSdFN0clNpemUpCisjZW5kaWYKK1VJTlROCitSVU5USU1FRlVOQ1RJT04KK1J0U3RyU2l6ZSAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxCisgICAgKQorLy8gc3RyaW5nIHNpemUKK3sKKyAgICBVSU5UTiAgICAgICAgbGVuOworICAgIAorICAgIGZvciAobGVuPTA7ICpzMTsgczErPTEsIGxlbis9MSkgOworICAgIHJldHVybiAobGVuICsgMSkgKiBzaXplb2YoQ0hBUjE2KTsKK30KKworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBSVU5USU1FX0NPREUoUnRCQ0R0b0RlY2ltYWwpCisjZW5kaWYKK1VJTlQ4CitSVU5USU1FRlVOQ1RJT04KK1J0QkNEdG9EZWNpbWFsKAorICAgIElOICBVSU5UOCBCY2RWYWx1ZQorICAgICkKK3sKKyAgICBVSU5UTiAgIEhpZ2gsIExvdzsKKworICAgIEhpZ2ggICAgPSBCY2RWYWx1ZSA+PiA0OworICAgIExvdyAgICAgPSBCY2RWYWx1ZSAtIChIaWdoIDw8IDQpOworCisgICAgcmV0dXJuICgoVUlOVDgpKExvdyArIChIaWdoICogMTApKSk7Cit9CisKKworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBSVU5USU1FX0NPREUoUnREZWNpbWFsdG9CQ0QpCisjZW5kaWYKK1VJTlQ4CitSVU5USU1FRlVOQ1RJT04KK1J0RGVjaW1hbHRvQkNEICgKKyAgICBJTiAgVUlOVDggRGVjVmFsdWUKKyAgICApCit7CisgICAgVUlOVE4gICBIaWdoLCBMb3c7CisKKyAgICBIaWdoICAgID0gRGVjVmFsdWUgLyAxMDsKKyAgICBMb3cgICAgID0gRGVjVmFsdWUgLSAoSGlnaCAqIDEwKTsKKworICAgIHJldHVybiAoKFVJTlQ4KShMb3cgKyAoSGlnaCA8PCA0KSkpOworfQorCisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3J1bnRpbWUvdm0uYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3J1bnRpbWUvdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmUwYzhlCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvcnVudGltZS92bS5jCkBAIC0wLDAgKzEsMTA1IEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICB2bS5jCisKK0Fic3RyYWN0OgorCisgICAgRUZJIEhlbGwgdG8gcmVtYXAgcnVudGltZSBhZGRyZXNzIGludG8gdGhlIG5ldyB2aXJ1YWwgYWRkcmVzcyBzcGFjZSAKKyAgICB0aGF0IHdhcyByZWdpc3RlcmVkIGJ5IHRoZSBPUyBmb3IgUlQgY2FsbHMuCisKKyAgICBTbyB0aGUgY29kZSBpbWFnZSBuZWVkcyB0byBiZSByZWxvY2F0ZWQuIEFsbCBwb2ludGVycyBuZWVkIHRvIGJlIAorICAgIG1hbnVhbGx5IGZpeGVkIHVwIHNpbmNlIHRoZSBhZGRyZXNzIG1hcCBjaGFuZ2VzLiAKKworICAgIEdPT0QgTFVDSyBOT1QgSEFWSU5HIEJVR1MgSU4gWU9VUiBDT0RFISBQTEVBU0UgVEVTVCBBIExPVC4gTUFLRSBTVVJFCisgICAgRVhJVCBCT09UU0VSVklDRVMgT1ZFUiBXUklURVMgQUxMIEJPT1RTRVJWSUNFIE1FTU9SWSAmIERBVEEgU1BBQ0VTIFdIRU4gCisgICAgWU9VIFRFU1QuCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAibGliLmgiCisKKyNpZm5kZWYgX19HTlVDX18KKyNwcmFnbWEgUlVOVElNRV9DT0RFKFJ0TGliRW5hYmxlVmlydHVhbE1hcHBpbmdzKQorI2VuZGlmCitWT0lECitSVU5USU1FRlVOQ1RJT04KK1J0TGliRW5hYmxlVmlydHVhbE1hcHBpbmdzICgKKyAgICBWT0lECisgICAgKQoreworICAgIEVGSV9DT05WRVJUX1BPSU5URVIgICAgIENvbnZlcnRQb2ludGVyOworCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGNvcHkgb2YgdGhlIGxpYiBpcyBsaW5rZWQgaW50byB0aGUgZmlybXdhcmUsIHRoZW4KKyAgICAvLyBkbyBub3QgdXBkYXRlIHRoZSBwb2ludGVycyB5ZXQuCisgICAgLy8KKworICAgIGlmICghTGliRndJbnN0YW5jZSkgeworCisgICAgICAgIC8vCisgICAgICAgIC8vIERpZmZlcmVudCBjb21wb25lbnRzIGFyZSB1cGRhdGluZyB0byB0aGUgbmV3IHZpcnR1YWwKKyAgICAgICAgLy8gbWFwcGluZ3MgYXQgZGlmZmVybnQgdGltZXMuICBUaGUgb25seSBmdW5jdGlvbiB0aGF0CisgICAgICAgIC8vIGlzIHNhZmUgdG8gY2FsbCBhdCB0aGlzIG5vdGlmaWNhdGlvbiBpcyBDb252ZXJ0QWRkcmVzcworICAgICAgICAvLworCisgICAgICAgIENvbnZlcnRQb2ludGVyID0gUlQtPkNvbnZlcnRQb2ludGVyOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEZpeCBhbnkgcG9pbnRlcnMgdGhhdCB0aGUgbGliIGNyZWF0ZWQsIHRoYXQgbWF5IGJlIG5lZWRlZAorICAgICAgICAvLyBkdXJpbmcgcnVudGltZS4KKyAgICAgICAgLy8KKworICAgICAgICBDb252ZXJ0UG9pbnRlciAoRUZJX0lOVEVSTkFMX1BUUiwgKFZPSUQgKiopJlJUKTsKKyAgICAgICAgQ29udmVydFBvaW50ZXIgKEVGSV9PUFRJT05BTF9QVFIsIChWT0lEICoqKSZMaWJSdW50aW1lRGVidWdPdXQpOworCisgICAgICAgIENvbnZlcnRQb2ludGVyIChFRklfSU5URVJOQUxfUFRSLCAoVk9JRCAqKikmTGliUnVudGltZVJhaXNlVFBMKTsKKyAgICAgICAgQ29udmVydFBvaW50ZXIgKEVGSV9JTlRFUk5BTF9QVFIsIChWT0lEICoqKSZMaWJSdW50aW1lUmVzdG9yZVRQTCk7CisKKyAgICAgICAgLy8gdGhhdCB3YXMgaXQgOl4pCisgICAgfQorfQorCisKKyNpZm5kZWYgX19HTlVDX18KKyNwcmFnbWEgUlVOVElNRV9DT0RFKFJ0Q29udmVydExpc3QpCisjZW5kaWYKK1ZPSUQKK1JVTlRJTUVGVU5DVElPTgorUnRDb252ZXJ0TGlzdCAoCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgRGVidWdEaXNwb3NpdGlvbiwKKyAgICBJTiBPVVQgTElTVF9FTlRSWSAgICAgICAqTGlzdEhlYWQKKyAgICApCit7CisgICAgTElTVF9FTlRSWSAgICAgICAgICAgICAgKkxpbms7CisgICAgTElTVF9FTlRSWSAgICAgICAgICAgICAgKk5leHRMaW5rOworICAgIEVGSV9DT05WRVJUX1BPSU5URVIgICAgIENvbnZlcnRQb2ludGVyOworCisgICAgQ29udmVydFBvaW50ZXIgPSBSVC0+Q29udmVydFBvaW50ZXI7CisKKyAgICAvLworICAgIC8vIENvbnZlcnQgYWxsIHRoZSBGbGluayAmIEJsaW5rIHBvaW50ZXJzIGluIHRoZSBsaXN0CisgICAgLy8KKworICAgIExpbmsgPSBMaXN0SGVhZDsKKyAgICBkbyB7CisgICAgICAgIE5leHRMaW5rID0gTGluay0+Rmxpbms7CisKKyAgICAgICAgQ29udmVydFBvaW50ZXIgKAorICAgICAgICAgICAgTGluay0+RmxpbmsgPT0gTGlzdEhlYWQgPyBEZWJ1Z0Rpc3Bvc2l0aW9uIDogMCwgCisgICAgICAgICAgICAoVk9JRCAqKikmTGluay0+RmxpbmsKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgQ29udmVydFBvaW50ZXIgKAorICAgICAgICAgICAgTGluay0+QmxpbmsgPT0gTGlzdEhlYWQgPyBEZWJ1Z0Rpc3Bvc2l0aW9uIDogMCwgCisgICAgICAgICAgICAoVk9JRCAqKikmTGluay0+QmxpbmsKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgTGluayA9IE5leHRMaW5rOworICAgIH0gd2hpbGUgKExpbmsgIT0gTGlzdEhlYWQpOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvc21iaW9zLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9zbWJpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTg2ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvc21iaW9zLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAyMDAwICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIFNtYmlvcy5jCisgICAgCitBYnN0cmFjdDoKKworICAgIExpYiBmdWNudGlvbnMgZm9yIFNNQklPUy4gVXNlZCB0byBnZXQgc3lzdGVtIHNlcmlhbCBudW1iZXIgYW5kIEdVSUQKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpbmNsdWRlICJsaWIuaCIKKworCitFRklfU1RBVFVTCitMaWJHZXRTbWJpb3NTeXN0ZW1HdWlkQW5kU2VyaWFsTnVtYmVyICgKKyAgICBJTiAgRUZJX0dVSUQgICAgKlN5c3RlbUd1aWQsCisgICAgT1VUIENIQVI4ICAgICAgICoqU3lzdGVtU2VyaWFsTnVtYmVyCisgICAgKQoreworICAgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgICBTdGF0dXM7CisgICAgU01CSU9TX1NUUlVDVFVSRV9UQUJMRSAgICAgICpTbWJpb3NUYWJsZTsKKyAgICBTTUJJT1NfU1RSVUNUVVJFX1BPSU5URVIgICAgU21iaW9zOyAgCisgICAgU01CSU9TX1NUUlVDVFVSRV9QT0lOVEVSICAgIFNtYmlvc0VuZDsgIAorICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBJbmRleDsKKyAgICAKKyAgICBTdGF0dXMgPSBMaWJHZXRTeXN0ZW1Db25maWd1cmF0aW9uVGFibGUoJlNNQklPU1RhYmxlR3VpZCwgKFZPSUQqKikmU21iaW9zVGFibGUpOworICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICByZXR1cm4gRUZJX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBTbWJpb3MuSGRyID0gKFNNQklPU19IRUFERVIgKilTbWJpb3NUYWJsZS0+VGFibGVBZGRyZXNzOworICAgIFNtYmlvc0VuZC5SYXcgPSAoVUlOVDggKikoU21iaW9zVGFibGUtPlRhYmxlQWRkcmVzcyArIFNtYmlvc1RhYmxlLT5UYWJsZUxlbmd0aCk7CisgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgU21iaW9zVGFibGUtPlRhYmxlTGVuZ3RoIDsgSW5kZXgrKykgeworICAgICAgICBpZiAoU21iaW9zLkhkci0+VHlwZSA9PSAxKSB7CisgICAgICAgICAgICBpZiAoU21iaW9zLkhkci0+TGVuZ3RoIDwgMHgxOSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gT2xkZXIgdmVyc2lvbiBkaWQgbm90IHN1cHBvcnQgR3VpZCBhbmQgU2VyaWFsIG51bWJlcgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTTUJJT1MgdGFibGVzIGFyZSBieXRlIHBhY2tlZCBzbyB3ZSBuZWVkIHRvIGRvIGEgYnl0ZSBjb3B5IHRvCisgICAgICAgICAgICAvLyAgcHJldmVuZCBhbGlnbm1lbnQgZmF1bHRzIG9uIElBLTY0LgorICAgICAgICAgICAgCisgICAgICAgICAgICBDb3B5TWVtIChTeXN0ZW1HdWlkLCAmU21iaW9zLlR5cGUxLT5VdWlkLCBzaXplb2YoRUZJX0dVSUQpKTsKKyAgICAgICAgICAgICpTeXN0ZW1TZXJpYWxOdW1iZXIgPSBMaWJHZXRTbWJpb3NTdHJpbmcoJlNtYmlvcywgU21iaW9zLlR5cGUxLT5TZXJpYWxOdW1iZXIpOworICAgICAgICAgICAgcmV0dXJuIEVGSV9TVUNDRVNTOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTWFrZSBTbWJpb3MgcG9pbnQgdG8gdGhlIG5leHQgcmVjb3JkCisgICAgICAgIC8vCisgICAgICAgIExpYkdldFNtYmlvc1N0cmluZyAoJlNtYmlvcywgLTEpOworCisgICAgICAgIGlmIChTbWJpb3MuUmF3ID49IFNtYmlvc0VuZC5SYXcpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTTUJJT1MgMi4xIGluY29ycmVjdGx5IHN0YXRlZCB0aGUgbGVuZ3RoIG9mIFNtYmlvc1RhYmxlIGFzIDB4MWUuIAorICAgICAgICAgICAgLy8gIGdpdmVuIHRoaXMgd2UgbXVzdCBkb3VibGUgY2hlY2sgYWdhaW5zdCB0aGUgbGVuZ2h0IG9mCisgICAgICAgICAgICAvLy8gdGhlIHN0cnVjdHVyZS4gTXkgaG9tZSBQQyBoYXMgdGhpcyBidWcucnV0aGFyZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybiBFRklfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFRklfU1VDQ0VTUzsKK30KKworQ0hBUjgqCitMaWJHZXRTbWJpb3NTdHJpbmcgKAorICAgIElOICBTTUJJT1NfU1RSVUNUVVJFX1BPSU5URVIgICAgKlNtYmlvcywKKyAgICBJTiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ051bWJlcgorICAgICkKKy8qKysKKworICAgIFJldHVybiBTTUJJT1Mgc3RyaW5nIGdpdmVuIHRoZSBzdHJpbmcgbnVtYmVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBTbWJpb3MgLSBQb2ludGVyIHRvIFNNQklPUyBzdHJ1Y3R1cmUKKyAgICAgICAgU3RyaW5nTnVtYmVyIC0gU3RyaW5nIG51bWJlciB0byByZXR1cm4uIC0xIGlzIHVzZWQgdG8gc2tpcCBhbGwgc3RyaW5ncyBhbmQgCisgICAgICAgICAgICBwb2ludCB0byB0aGUgbmV4dCBTTUJJT1Mgc3RydWN0dXJlLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgUG9pbnRlciB0byBzdHJpbmcsIG9yIHBvaW50ZXIgdG8gbmV4dCBTTUJJT1Mgc3RyY3V0dXJlIGlmIFN0cmluZ051bWJlciA9PSAtMQorLS0qLworeworICAgIFVJTlQxNiAgSW5kZXg7CisgICAgQ0hBUjggICAqU3RyaW5nOworCisgICAgLy8KKyAgICAvLyBTa2lwIG92ZXIgZm9ybWF0dGVkIHNlY3Rpb24KKyAgICAvLworICAgIFN0cmluZyA9IChDSEFSOCAqKShTbWJpb3MtPlJhdyArIFNtYmlvcy0+SGRyLT5MZW5ndGgpOworCisgICAgLy8KKyAgICAvLyBMb29rIHRocm91Z2ggdW5mb3JtYXRlZCBzZWN0aW9uCisgICAgLy8KKyAgICBmb3IgKEluZGV4ID0gMTsgSW5kZXggPD0gU3RyaW5nTnVtYmVyOyBJbmRleCsrKSB7CisgICAgICAgIGlmIChTdHJpbmdOdW1iZXIgPT0gSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHN0cmluZworICAgICAgICAvLworICAgICAgICBmb3IgKDsgKlN0cmluZyAhPSAwOyBTdHJpbmcrKyk7CisgICAgICAgIFN0cmluZysrOworCisgICAgICAgIGlmICgqU3RyaW5nID09IDApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBkb3VibGUgTlVMTCB0aGVuIHdlIGFyZSBkb25lLgorICAgICAgICAgICAgLy8gIFJldHJ1biBwb2ludGVyIHRvIG5leHQgc3RydWN0dXJlIGluIFNtYmlvcy4KKyAgICAgICAgICAgIC8vICBpZiB5b3UgcGFzcyBpbiBhIC0xIHlvdSB3aWxsIGFsd2F5cyBnZXQgaGVyZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFNtYmlvcy0+UmF3ID0gKFVJTlQ4ICopKytTdHJpbmc7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOyAgICAgICAgCit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9zcmVhZC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvc3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODhmOTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIvc3JlYWQuYwpAQCAtMCwwICsxLDM1OCBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorICAgIAorICAgIHNyZWFkLmMKKworQWJzdHJhY3Q6CisKKyAgICBTaW1wbGUgcmVhZCBmaWxlIGFjY2VzcworCisKKworUmV2aXNpb24gSGlzdG9yeQorCistLSovCisKKyNpbmNsdWRlICJsaWIuaCIKKworI2RlZmluZSBTSU1QTEVfUkVBRF9TSUdOQVRVUkUgICAgICAgRUZJX1NJR05BVFVSRV8zMigncycsJ3InLCdkJywncicpCit0eXBlZGVmIHN0cnVjdCBfU0lNUExFX1JFQURfRklMRSB7CisgICAgVUlOVE4gICAgICAgICAgICAgICBTaWduYXR1cmU7CisgICAgQk9PTEVBTiAgICAgICAgICAgICBGcmVlQnVmZmVyOworICAgIFZPSUQgICAgICAgICAgICAgICAgKlNvdXJjZTsKKyAgICBVSU5UTiAgICAgICAgICAgICAgIFNvdXJjZVNpemU7CisgICAgRUZJX0ZJTEVfSEFORExFICAgICBGaWxlSGFuZGxlOworfSBTSU1QTEVfUkVBRF9IQU5ETEU7CisKKyAgICAgICAKKworRUZJX1NUQVRVUworT3BlblNpbXBsZVJlYWRGaWxlICgKKyAgICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgQm9vdFBvbGljeSwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKlNvdXJjZUJ1ZmZlciAgIE9QVElPTkFMLAorICAgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBTb3VyY2VTaXplLAorICAgIElOIE9VVCBFRklfREVWSUNFX1BBVEggICAgICAqKkZpbGVQYXRoLAorICAgIE9VVCBFRklfSEFORExFICAgICAgICAgICAgICAqRGV2aWNlSGFuZGxlLAorICAgIE9VVCBTSU1QTEVfUkVBRF9GSUxFICAgICAgICAqU2ltcGxlUmVhZEhhbmRsZQorICAgICkKKy8qKysKKworUm91dGluZSBEZXNjcmlwdGlvbjoKKworICAgIE9wZW5zIGEgZmlsZSBmb3IgKHNpbXBsZSkgcmVhZGluZy4gIFRoZSBzaW1wbGUgcmVhZCBhYnN0cmFjdGlvbgorICAgIHdpbGwgYWNjZXNzIHRoZSBmaWxlIGVpdGhlciBmcm9tIGEgbWVtb3J5IGNvcHksIGZyb20gYSBmaWxlCisgICAgc3lzdGVtIGludGVyZmFjZSwgb3IgZnJvbSB0aGUgbG9hZCBmaWxlIGludGVyZmFjZS4gCisKK0FyZ3VtZW50czoKKworUmV0dXJuczoKKworICAgIEEgaGFuZGxlIHRvIGFjY2VzcyB0aGUgZmlsZQorCistLSovCit7CisgICAgU0lNUExFX1JFQURfSEFORExFICAgICAgICAgICpGSGFuZDsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgKlVzZXJGaWxlUGF0aDsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgKlRlbXBGaWxlUGF0aDsKKyAgICBFRklfREVWSUNFX1BBVEggICAgICAgICAgICAgKlRlbXBGaWxlUGF0aFB0cjsKKyAgICBGSUxFUEFUSF9ERVZJQ0VfUEFUSCAgICAgICAgKkZpbGVQYXRoTm9kZTsKKyAgICBFRklfRklMRV9IQU5ETEUgICAgICAgICAgICAgRmlsZUhhbmRsZSwgTGFzdEhhbmRsZTsKKyAgICBFRklfU1RBVFVTICAgICAgICAgICAgICAgICAgU3RhdHVzOworICAgIEVGSV9MT0FEX0ZJTEVfSU5URVJGQUNFICAgICAqTG9hZEZpbGU7CisgIAorICAgIEZIYW5kID0gTlVMTDsKKyAgICBVc2VyRmlsZVBhdGggPSAqRmlsZVBhdGg7CisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIGEgbmV3IHNpbXBsZSByZWFkIGhhbmRsZSBzdHJ1Y3R1cmUKKyAgICAvLworCisgICAgRkhhbmQgPSBBbGxvY2F0ZVplcm9Qb29sIChzaXplb2YoU0lNUExFX1JFQURfSEFORExFKSk7CisgICAgaWYgKCFGSGFuZCkgeworICAgICAgICBTdGF0dXMgPSBFRklfT1VUX09GX1JFU09VUkNFUzsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KKworICAgICpTaW1wbGVSZWFkSGFuZGxlID0gKFNJTVBMRV9SRUFEX0ZJTEUpIEZIYW5kOworICAgIEZIYW5kLT5TaWduYXR1cmUgPSBTSU1QTEVfUkVBRF9TSUdOQVRVUkU7CisKKyAgICAvLworICAgIC8vIElmIHRoZSBjYWxsZXIgcGFzc2VkIGEgY29weSBvZiB0aGUgZmlsZSwgdGhlbiBqdXN0IHVzZSBpdAorICAgIC8vCisKKyAgICBpZiAoU291cmNlQnVmZmVyKSB7CisgICAgICAgIEZIYW5kLT5Tb3VyY2UgPSBTb3VyY2VCdWZmZXI7CisgICAgICAgIEZIYW5kLT5Tb3VyY2VTaXplID0gU291cmNlU2l6ZTsKKyAgICAgICAgKkRldmljZUhhbmRsZSA9IE5VTEw7CisgICAgICAgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOworICAgICAgICBnb3RvIERvbmU7CisgICAgfSAKKworICAgIC8vCisgICAgLy8gQXR0ZW1wdCB0byBhY2Nlc3MgdGhlIGZpbGUgdmlhIGEgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlCisgICAgLy8KKworICAgIEZpbGVIYW5kbGUgPSBOVUxMOworICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEJTLT5Mb2NhdGVEZXZpY2VQYXRoLCAzLCAmRmlsZVN5c3RlbVByb3RvY29sLCBGaWxlUGF0aCwgRGV2aWNlSGFuZGxlKTsKKyAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgIEZpbGVIYW5kbGUgPSBMaWJPcGVuUm9vdCAoKkRldmljZUhhbmRsZSk7CisgICAgfQorCisgICAgU3RhdHVzID0gRmlsZUhhbmRsZSA/IEVGSV9TVUNDRVNTIDogRUZJX1VOU1VQUE9SVEVEOworCisgICAgLy8KKyAgICAvLyBUbyBhY2Nlc3MgYXMgYSBmaWxlc3lzdGVtLCB0aGUgZmlsZXBhdGggc2hvdWxkIG9ubHkKKyAgICAvLyBjb250YWluIGZpbGVwYXRoIGNvbXBvbmVudHMuICBGb2xsb3cgdGhlIGZpbGVwYXRoIG5vZGVzCisgICAgLy8gYW5kIGZpbmQgdGhlIHRhcmdldCBmaWxlCisgICAgLy8KKworICAgIEZpbGVQYXRoTm9kZSA9IChGSUxFUEFUSF9ERVZJQ0VfUEFUSCAqKSAqRmlsZVBhdGg7CisgICAgd2hpbGUgKCFJc0RldmljZVBhdGhFbmQoJkZpbGVQYXRoTm9kZS0+SGVhZGVyKSkgeworCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvciBmaWxlc3lzdGVtIGFjY2VzcyBlYWNoIG5vZGUgc2hvdWxkIGJlIGEgZmlsZXBhdGggY29tcG9uZW50CisgICAgICAgIC8vCisKKyAgICAgICAgaWYgKERldmljZVBhdGhUeXBlKCZGaWxlUGF0aE5vZGUtPkhlYWRlcikgIT0gTUVESUFfREVWSUNFX1BBVEggfHwKKyAgICAgICAgICAgIERldmljZVBhdGhTdWJUeXBlKCZGaWxlUGF0aE5vZGUtPkhlYWRlcikgIT0gTUVESUFfRklMRVBBVEhfRFApIHsKKyAgICAgICAgICAgIFN0YXR1cyA9IEVGSV9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoZXJlJ3MgYmVlbiBhbiBlcnJvciwgc3RvcAorICAgICAgICAvLworCisgICAgICAgIGlmIChFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIE9wZW4gdGhpcyBmaWxlIHBhdGggbm9kZQorICAgICAgICAvLworCisgICAgICAgIExhc3RIYW5kbGUgPSBGaWxlSGFuZGxlOworICAgICAgICBGaWxlSGFuZGxlID0gTlVMTDsKKworICAgICAgICBTdGF0dXMgPSB1ZWZpX2NhbGxfd3JhcHBlcigKKwkJCUxhc3RIYW5kbGUtPk9wZW4sCisJCQk1LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIExhc3RIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmRmlsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoTm9kZS0+UGF0aE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBFRklfRklMRV9NT0RFX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2xvc2UgdGhlIGxhc3Qgbm9kZQorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgdWVmaV9jYWxsX3dyYXBwZXIoTGFzdEhhbmRsZS0+Q2xvc2UsIDEsIExhc3RIYW5kbGUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEdldCB0aGUgbmV4dCBub2RlCisgICAgICAgIC8vCisKKyAgICAgICAgRmlsZVBhdGhOb2RlID0gKEZJTEVQQVRIX0RFVklDRV9QQVRIICopIE5leHREZXZpY2VQYXRoTm9kZSgmRmlsZVBhdGhOb2RlLT5IZWFkZXIpOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgc3VjY2VzcywgcmV0dXJuIHRoZSBGSGFuZAorICAgIC8vCisKKyAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpKSB7CisgICAgICAgIEFTU0VSVChGaWxlSGFuZGxlKTsKKyAgICAgICAgRkhhbmQtPkZpbGVIYW5kbGUgPSBGaWxlSGFuZGxlOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDbGVhbnVwIGZyb20gZmlsZXN5c3RlbSBhY2Nlc3MKKyAgICAvLworCisgICAgaWYgKEZpbGVIYW5kbGUpIHsKKyAgICAgICAgdWVmaV9jYWxsX3dyYXBwZXIoRmlsZUhhbmRsZS0+Q2xvc2UsIDEsIEZpbGVIYW5kbGUpOworICAgICAgICBGaWxlSGFuZGxlID0gTlVMTDsKKyAgICAgICAgKkZpbGVQYXRoID0gVXNlckZpbGVQYXRoOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgdGhlIGVycm9yIGlzIHNvbWV0aGluZyBvdGhlciB0aGVuIHVuc3VwcG9ydGVkLCByZXR1cm4gaXQKKyAgICAvLworCisgICAgaWYgKFN0YXR1cyAhPSBFRklfVU5TVVBQT1JURUQpIHsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KKworICAgIC8vCisgICAgLy8gQXR0ZW1wdCB0byBhY2Nlc3MgdGhlIGZpbGUgdmlhIHRoZSBsb2FkIGZpbGUgcHJvdG9jb2wKKyAgICAvLworCisgICAgU3RhdHVzID0gTGliRGV2aWNlUGF0aFRvSW50ZXJmYWNlICgmTG9hZEZpbGVQcm90b2NvbCwgKkZpbGVQYXRoLCAoVk9JRCopJkxvYWRGaWxlKTsKKyAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpKSB7CisKKyAgICAgICAgVGVtcEZpbGVQYXRoID0gRHVwbGljYXRlRGV2aWNlUGF0aCAoKkZpbGVQYXRoKTsKKworICAgICAgICBUZW1wRmlsZVBhdGhQdHIgPSBUZW1wRmlsZVBhdGg7CisKKyAgICAgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoQlMtPkxvY2F0ZURldmljZVBhdGgsIDMsICZMb2FkRmlsZVByb3RvY29sLCAmVGVtcEZpbGVQYXRoLCBEZXZpY2VIYW5kbGUpOworCisgICAgICAgIEZyZWVQb29sIChUZW1wRmlsZVBhdGhQdHIpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIERldGVybWluZSB0aGUgc2l6ZSBvZiBidWZmZXIgbmVlZGVkIHRvIGhvbGQgdGhlIGZpbGUKKyAgICAgICAgLy8KKworICAgICAgICBTb3VyY2VTaXplID0gMDsKKyAgICAgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoCisJCSAgICBMb2FkRmlsZS0+TG9hZEZpbGUsCisJCQk1LAorICAgICAgICAgICAgICAgICAgICBMb2FkRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgKkZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICBCb290UG9saWN5LAorICAgICAgICAgICAgICAgICAgICAmU291cmNlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIGV4cGVjdCBhIGJ1ZmZlciB0b28gc21hbGwgZXJyb3IgdG8gaW5mb3JtIHVzIAorICAgICAgICAvLyBvZiB0aGUgYnVmZmVyIHNpemUgbmVlZGVkCisgICAgICAgIC8vCisKKyAgICAgICAgaWYgKFN0YXR1cyA9PSBFRklfQlVGRkVSX1RPT19TTUFMTCkgeworICAgICAgICAgICAgU291cmNlQnVmZmVyID0gQWxsb2NhdGVQb29sIChTb3VyY2VTaXplKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKFNvdXJjZUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIEZIYW5kLT5GcmVlQnVmZmVyID0gVFJVRTsKKyAgICAgICAgICAgICAgICBGSGFuZC0+U291cmNlID0gU291cmNlQnVmZmVyOworICAgICAgICAgICAgICAgIEZIYW5kLT5Tb3VyY2VTaXplID0gU291cmNlU2l6ZTsKKworICAgICAgICAgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKAorCQkJICAgIExvYWRGaWxlLT5Mb2FkRmlsZSwKKwkJCQk1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb290UG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTb3VyY2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7ICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHN1Y2Nlc3MsIHJldHVybiBGSGFuZAorICAgICAgICAvLworCisgICAgICAgIGlmICghRUZJX0VSUk9SKFN0YXR1cykgfHwgU3RhdHVzID09IEVGSV9BTFJFQURZX1NUQVJURUQpIHsKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gTm90aGluZyBlbHNlIHRvIHRyeQorICAgIC8vCisKKyAgICBERUJVRyAoKERfTE9BRHxEX1dBUk4sICJPcGVuU2ltcGxlUmVhZEZpbGU6IERldmljZSBkaWQgbm90IHN1cHBvcnQgYSBrbm93biBsb2FkIHByb3RvY29sXG4iKSk7CisgICAgU3RhdHVzID0gRUZJX1VOU1VQUE9SVEVEOworCitEb25lOgorCisgICAgLy8KKyAgICAvLyBJZiB0aGUgZmlsZSB3YXMgbm90IGFjY2Vzc2VkLCBjbGVhbiB1cAorICAgIC8vCisgICAgaWYgKEVGSV9FUlJPUihTdGF0dXMpICYmIChTdGF0dXMgIT0gRUZJX0FMUkVBRFlfU1RBUlRFRCkpIHsKKyAgICAgICAgaWYgKEZIYW5kKSB7CisgICAgICAgICAgICBpZiAoRkhhbmQtPkZyZWVCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBGcmVlUG9vbCAoRkhhbmQtPlNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZyZWVQb29sIChGSGFuZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCitFRklfU1RBVFVTCitSZWFkU2ltcGxlUmVhZEZpbGUgKAorICAgIElOIFNJTVBMRV9SRUFEX0ZJTEUgICAgIFVzZXJIYW5kbGUsCisgICAgSU4gVUlOVE4gICAgICAgICAgICAgICAgT2Zmc2V0LAorICAgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICpSZWFkU2l6ZSwKKyAgICBPVVQgVk9JRCAgICAgICAgICAgICAgICAqQnVmZmVyCisgICAgKQoreworICAgIFVJTlROICAgICAgICAgICAgICAgICAgIEVuZFBvczsKKyAgICBTSU1QTEVfUkVBRF9IQU5ETEUgICAgICAqRkhhbmQ7CisgICAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgU3RhdHVzOworCisgICAgRkhhbmQgPSBVc2VySGFuZGxlOworICAgIEFTU0VSVCAoRkhhbmQtPlNpZ25hdHVyZSA9PSBTSU1QTEVfUkVBRF9TSUdOQVRVUkUpOworICAgIGlmIChGSGFuZC0+U291cmNlKSB7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTW92ZSBkYXRhIGZyb20gb3VyIGxvY2FsIGNvcHkgb2YgdGhlIGZpbGUKKyAgICAgICAgLy8KKworICAgICAgICBFbmRQb3MgPSBPZmZzZXQgKyAqUmVhZFNpemU7CisgICAgICAgIGlmIChFbmRQb3MgPiBGSGFuZC0+U291cmNlU2l6ZSkgeworICAgICAgICAgICAgKlJlYWRTaXplID0gRkhhbmQtPlNvdXJjZVNpemUgLSBPZmZzZXQ7CisgICAgICAgICAgICBpZiAoT2Zmc2V0ID49IEZIYW5kLT5Tb3VyY2VTaXplKSB7CisgICAgICAgICAgICAgICAgKlJlYWRTaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENvcHlNZW0gKEJ1ZmZlciwgKENIQVI4ICopIEZIYW5kLT5Tb3VyY2UgKyBPZmZzZXQsICpSZWFkU2l6ZSk7CisgICAgICAgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGRhdGEgZnJvbSB0aGUgZmlsZQorICAgICAgICAvLworCisgICAgICAgIFN0YXR1cyA9IHVlZmlfY2FsbF93cmFwcGVyKEZIYW5kLT5GaWxlSGFuZGxlLT5TZXRQb3NpdGlvbiwgMiwgRkhhbmQtPkZpbGVIYW5kbGUsIE9mZnNldCk7CisKKyAgICAgICAgaWYgKCFFRklfRVJST1IoU3RhdHVzKSkgeworICAgICAgICAgICAgU3RhdHVzID0gdWVmaV9jYWxsX3dyYXBwZXIoRkhhbmQtPkZpbGVIYW5kbGUtPlJlYWQsIDMsIEZIYW5kLT5GaWxlSGFuZGxlLCBSZWFkU2l6ZSwgQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKworVk9JRAorQ2xvc2VTaW1wbGVSZWFkRmlsZSAoCisgICAgSU4gU0lNUExFX1JFQURfRklMRSAgICAgVXNlckhhbmRsZQorICAgICkKK3sKKyAgICBTSU1QTEVfUkVBRF9IQU5ETEUgICAgICAqRkhhbmQ7CisKKyAgICBGSGFuZCA9IFVzZXJIYW5kbGU7CisgICAgQVNTRVJUIChGSGFuZC0+U2lnbmF0dXJlID09IFNJTVBMRV9SRUFEX1NJR05BVFVSRSk7CisKKyAgICAvLworICAgIC8vIEZyZWUgYW55IGZpbGUgaGFuZGxlIHdlIG9wZW5lZAorICAgIC8vCisKKyAgICBpZiAoRkhhbmQtPkZpbGVIYW5kbGUpIHsKKyAgICAgICAgdWVmaV9jYWxsX3dyYXBwZXIoRkhhbmQtPkZpbGVIYW5kbGUtPkNsb3NlLCAxLCBGSGFuZC0+RmlsZUhhbmRsZSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB3ZSBhbGxvY2F0ZWQgdGhlIFNvdXJjZSBidWZmZXIsIGZyZWUgaXQKKyAgICAvLworCisgICAgaWYgKEZIYW5kLT5GcmVlQnVmZmVyKSB7CisgICAgICAgIEZyZWVQb29sIChGSGFuZC0+U291cmNlKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIERvbmUgd2l0aCB0aGlzIHNpbXBsZSByZWFkIGZpbGUgaGFuZGxlCisgICAgLy8KKworICAgIEZyZWVQb29sIChGSGFuZCk7Cit9CmRpZmYgLS1naXQgYS9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9zdHIuYyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OGU5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi9zdHIuYwpAQCAtMCwwICsxLDM3OSBAQAorLyorKworCitDb3B5cmlnaHQgKGMpIDE5OTggIEludGVsIENvcnBvcmF0aW9uCisKK01vZHVsZSBOYW1lOgorCisgICAgc3RyLmMKKworQWJzdHJhY3Q6CisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAibGliLmgiCisKKworSU5UTgorU3RyQ21wICgKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczEsCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMyCisgICAgKQorLy8gY29tcGFyZSBzdHJpbmdzCit7CisgICAgcmV0dXJuIFJ0U3RyQ21wKHMxLCBzMik7Cit9CisKK0lOVE4KK1N0cm5DbXAgKAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqczIsCisgICAgSU4gVUlOVE4gICAgbGVuCisgICAgKQorLy8gY29tcGFyZSBzdHJpbmdzCit7CisgICAgd2hpbGUgKCpzMSAgJiYgIGxlbikgeworICAgICAgICBpZiAoKnMxICE9ICpzMikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzMSAgKz0gMTsKKyAgICAgICAgczIgICs9IDE7CisgICAgICAgIGxlbiAtPSAxOworICAgIH0KKworICAgIHJldHVybiBsZW4gPyAqczEgLSAqczIgOiAwOworfQorCisKK0lOVE4gRUZJQVBJCitMaWJTdHViU3RyaUNtcCAoCisgICAgSU4gRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKnMxLAorICAgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICpzMgorICAgICkKK3sKKyAgICByZXR1cm4gU3RyQ21wIChzMSwgczIpOworfQorCitWT0lEIEVGSUFQSQorTGliU3R1YlN0ckx3clVwciAoCisgICAgSU4gRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKlN0cgorICAgICkKK3sKK30KKworSU5UTgorU3RyaUNtcCAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxLAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMgorICAgICkKKy8vIGNvbXBhcmUgc3RyaW5ncworeworICAgIGlmIChVbmljb2RlSW50ZXJmYWNlID09ICZMaWJTdHViVW5pY29kZUludGVyZmFjZSkKKyAgICAJcmV0dXJuIFVuaWNvZGVJbnRlcmZhY2UtPlN0cmlDb2xsKFVuaWNvZGVJbnRlcmZhY2UsIChDSEFSMTYgKilzMSwgKENIQVIxNiAqKXMyKTsKKyAgICBlbHNlCisJcmV0dXJuIHVlZmlfY2FsbF93cmFwcGVyKFVuaWNvZGVJbnRlcmZhY2UtPlN0cmlDb2xsLCAzLCBVbmljb2RlSW50ZXJmYWNlLCAoQ0hBUjE2ICopczEsIChDSEFSMTYgKilzMik7Cit9CisKK1ZPSUQKK1N0ckx3ciAoCisgICAgSU4gQ0hBUjE2ICAgKlN0cgorICAgICkKKy8vIGx3b2VyIGNhc2Ugc3RyaW5nCit7CisgICAgaWYgKFVuaWNvZGVJbnRlcmZhY2UgPT0gJkxpYlN0dWJVbmljb2RlSW50ZXJmYWNlKQorICAgIAlVbmljb2RlSW50ZXJmYWNlLT5TdHJMd3IoVW5pY29kZUludGVyZmFjZSwgU3RyKTsKKyAgICBlbHNlIHVlZmlfY2FsbF93cmFwcGVyKFVuaWNvZGVJbnRlcmZhY2UtPlN0ckx3ciwgMiwgVW5pY29kZUludGVyZmFjZSwgU3RyKTsKK30KKworVk9JRAorU3RyVXByICgKKyAgICBJTiBDSEFSMTYgICAqU3RyCisgICAgKQorLy8gdXBwZXIgY2FzZSBzdHJpbmcKK3sKKyAgICBpZiAoVW5pY29kZUludGVyZmFjZSA9PSAmTGliU3R1YlVuaWNvZGVJbnRlcmZhY2UpCisgICAgICAgIFVuaWNvZGVJbnRlcmZhY2UtPlN0clVwcihVbmljb2RlSW50ZXJmYWNlLCBTdHIpOworICAgIGVsc2UgdWVmaV9jYWxsX3dyYXBwZXIoVW5pY29kZUludGVyZmFjZS0+U3RyVXByLCAyLCBVbmljb2RlSW50ZXJmYWNlLCBTdHIpOworfQorCitWT0lECitTdHJDcHkgKAorICAgIElOIENIQVIxNiAgICpEZXN0LAorICAgIElOIENPTlNUIENIQVIxNiAgICpTcmMKKyAgICApCisvLyBjb3B5IHN0cmluZ3MKK3sKKyAgICBSdFN0ckNweSAoRGVzdCwgU3JjKTsKK30KKworVk9JRAorU3RyQ2F0ICgKKyAgICBJTiBDSEFSMTYgICAqRGVzdCwKKyAgICBJTiBDT05TVCBDSEFSMTYgICAqU3JjCisgICAgKQoreyAgIAorICAgIFJ0U3RyQ2F0KERlc3QsIFNyYyk7Cit9CisKK1VJTlROCitTdHJMZW4gKAorICAgIElOIENPTlNUIENIQVIxNiAgICpzMQorICAgICkKKy8vIHN0cmluZyBsZW5ndGgKK3sKKyAgICByZXR1cm4gUnRTdHJMZW4oczEpOworfQorCitVSU5UTgorU3RyU2l6ZSAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKnMxCisgICAgKQorLy8gc3RyaW5nIHNpemUKK3sKKyAgICByZXR1cm4gUnRTdHJTaXplKHMxKTsKK30KKworQ0hBUjE2ICoKK1N0ckR1cGxpY2F0ZSAoCisgICAgSU4gQ09OU1QgQ0hBUjE2ICAgKlNyYworICAgICkKKy8vIGR1cGxpY2F0ZSBhIHN0cmluZworeworICAgIENIQVIxNiAgICAgICpEZXN0OworICAgIFVJTlROICAgICAgIFNpemU7CisKKyAgICBTaXplID0gU3RyU2l6ZShTcmMpOworICAgIERlc3QgPSBBbGxvY2F0ZVBvb2wgKFNpemUpOworICAgIGlmIChEZXN0KSB7CisgICAgICAgIENvcHlNZW0gKERlc3QsIFNyYywgU2l6ZSk7CisgICAgfQorICAgIHJldHVybiBEZXN0OworfQorCitVSU5UTgorc3RybGVuYSAoCisgICAgSU4gQ09OU1QgQ0hBUjggICAgKnMxCisgICAgKQorLy8gc3RyaW5nIGxlbmd0aAoreworICAgIFVJTlROICAgICAgICBsZW47CisgICAgCisgICAgZm9yIChsZW49MDsgKnMxOyBzMSs9MSwgbGVuKz0xKSA7CisgICAgcmV0dXJuIGxlbjsKK30KKworVUlOVE4KK3N0cmNtcGEgKAorICAgIElOIENPTlNUIENIQVI4ICAgICpzMSwKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczIKKyAgICApCisvLyBjb21wYXJlIHN0cmluZ3MKK3sKKyAgICB3aGlsZSAoKnMxKSB7CisgICAgICAgIGlmICgqczEgIT0gKnMyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHMxICs9IDE7CisgICAgICAgIHMyICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuICpzMSAtICpzMjsKK30KKworVUlOVE4KK3N0cm5jbXBhICgKKyAgICBJTiBDT05TVCBDSEFSOCAgICAqczEsCisgICAgSU4gQ09OU1QgQ0hBUjggICAgKnMyLAorICAgIElOIFVJTlROICAgIGxlbgorICAgICkKKy8vIGNvbXBhcmUgc3RyaW5ncworeworICAgIHdoaWxlICgqczEgICYmICBsZW4pIHsKKyAgICAgICAgaWYgKCpzMSAhPSAqczIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgczEgICs9IDE7CisgICAgICAgIHMyICArPSAxOworICAgICAgICBsZW4gLT0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuID8gKnMxIC0gKnMyIDogMDsKK30KKworCisKK1VJTlROCit4dG9pICgKKyAgICBDT05TVCBDSEFSMTYgICpzdHIKKyAgICApCisvLyBjb252ZXJ0IGhleCBzdHJpbmcgdG8gdWludAoreworICAgIFVJTlROICAgICAgIHU7CisgICAgQ0hBUjE2ICAgICAgYzsKKworICAgIC8vIHNraXAgcHJlY2VlZGluZyB3aGl0ZSBzcGFjZQorICAgIHdoaWxlICgqc3RyICYmICpzdHIgPT0gJyAnKSB7CisgICAgICAgIHN0ciArPSAxOworICAgIH0KKworICAgIC8vIGNvbnZlcnQgaGV4IGRpZ2l0cworICAgIHUgPSAwOworICAgIHdoaWxlICgoYyA9ICooc3RyKyspKSkgeworICAgICAgICBpZiAoYyA+PSAnYScgICYmICBjIDw9ICdmJykgeworICAgICAgICAgICAgYyAtPSAnYScgLSAnQSc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGMgPj0gJzAnICAmJiAgYyA8PSAnOScpICB8fCAgKGMgPj0gJ0EnICAmJiAgYyA8PSAnRicpKSB7CisgICAgICAgICAgICB1ID0gKHUgPDwgNCkgIHwgIChjIC0gKGMgPj0gJ0EnID8gJ0EnLTEwIDogJzAnKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB1OworfQorCitVSU5UTgorQXRvaSAoCisgICAgQ09OU1QgQ0hBUjE2ICAqc3RyCisgICAgKQorLy8gY29udmVydCBoZXggc3RyaW5nIHRvIHVpbnQKK3sKKyAgICBVSU5UTiAgICAgICB1OworICAgIENIQVIxNiAgICAgIGM7CisKKyAgICAvLyBza2lwIHByZWNlZWRpbmcgd2hpdGUgc3BhY2UKKyAgICB3aGlsZSAoKnN0ciAmJiAqc3RyID09ICcgJykgeworICAgICAgICBzdHIgKz0gMTsKKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IGRpZ2l0cworICAgIHUgPSAwOworICAgIHdoaWxlICgoYyA9ICooc3RyKyspKSkgeworICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIHUgPSAodSAqIDEwKSArIGMgLSAnMCc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB1OworfQorCitCT09MRUFOIAorTWV0YU1hdGNoICgKKyAgICBJTiBDSEFSMTYgICAqU3RyaW5nLAorICAgIElOIENIQVIxNiAgICpQYXR0ZXJuCisgICAgKQoreworICAgIENIQVIxNiAgYywgcCwgbDsKKworICAgIGZvciAoOyA7KSB7CisgICAgICAgIHAgPSAqUGF0dGVybjsKKyAgICAgICAgUGF0dGVybiArPSAxOworCisgICAgICAgIHN3aXRjaCAocCkgeworICAgICAgICBjYXNlIDA6ICAgIAorICAgICAgICAgICAgLy8gRW5kIG9mIHBhdHRlcm4uICBJZiBlbmQgb2Ygc3RyaW5nLCBUUlVFIG1hdGNoCisgICAgICAgICAgICByZXR1cm4gKlN0cmluZyA/IEZBTFNFIDogVFJVRTsgICAgIAorCisgICAgICAgIGNhc2UgJyonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE1hdGNoIHplcm8gb3IgbW9yZSBjaGFycworICAgICAgICAgICAgd2hpbGUgKCpTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAoTWV0YU1hdGNoIChTdHJpbmcsIFBhdHRlcm4pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBNZXRhTWF0Y2ggKFN0cmluZywgUGF0dGVybik7CisKKyAgICAgICAgY2FzZSAnPyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTWF0Y2ggYW55IG9uZSBjaGFyCisgICAgICAgICAgICBpZiAoISpTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgKz0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ1snOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE1hdGNoIGNoYXIgc2V0CisgICAgICAgICAgICBjID0gKlN0cmluZzsKKyAgICAgICAgICAgIGlmICghYykgeworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bnRheCBwcm9ibGVtCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGwgPSAwOworICAgICAgICAgICAgd2hpbGUgKChwID0gKlBhdHRlcm4rKykpIHsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwID09ICctJykgeyAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHJhbmdlIG9mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICBwID0gKlBhdHRlcm47ICAgICAgICAgICAgICAgICAgIC8vIGdldCBoaWdoIHJhbmdlCisgICAgICAgICAgICAgICAgICAgIGlmIChwID09IDAgfHwgcCA9PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAvLyBzeW50YXggcHJvYmxlbQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gbCAmJiBjIDw9IHApIHsgICAgICAgICAvLyBpZiBpbiByYW5nZSwgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBhIG1hdGNoCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbCA9IHA7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gcCkgeyAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgY2hhciBtYXRjaGVzCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBvbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gc2tpcCB0byBlbmQgb2YgbWF0Y2ggY2hhciBzZXQKKyAgICAgICAgICAgIHdoaWxlIChwICYmIHAgIT0gJ10nKSB7CisgICAgICAgICAgICAgICAgcCA9ICpQYXR0ZXJuOworICAgICAgICAgICAgICAgIFBhdHRlcm4gKz0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nICs9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYyA9ICpTdHJpbmc7CisgICAgICAgICAgICBpZiAoYyAhPSBwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgKz0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisKK0JPT0xFQU4gRUZJQVBJCitMaWJTdHViTWV0YWlNYXRjaCAoCisgICAgSU4gRUZJX1VOSUNPREVfQ09MTEFUSU9OX0lOVEVSRkFDRSAgKlRoaXMsCisgICAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKlN0cmluZywKKyAgICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGF0dGVybgorICAgICkKK3sKKyAgICByZXR1cm4gTWV0YU1hdGNoIChTdHJpbmcsIFBhdHRlcm4pOworfQorCisKK0JPT0xFQU4gCitNZXRhaU1hdGNoICgKKyAgICBJTiBDSEFSMTYgICAqU3RyaW5nLAorICAgIElOIENIQVIxNiAgICpQYXR0ZXJuCisgICAgKQoreworICAgIGlmIChVbmljb2RlSW50ZXJmYWNlID09ICZMaWJTdHViVW5pY29kZUludGVyZmFjZSkKKyAgICAJcmV0dXJuIFVuaWNvZGVJbnRlcmZhY2UtPk1ldGFpTWF0Y2goVW5pY29kZUludGVyZmFjZSwgU3RyaW5nLCBQYXR0ZXJuKTsKKyAgICBlbHNlIHJldHVybiB1ZWZpX2NhbGxfd3JhcHBlcihVbmljb2RlSW50ZXJmYWNlLT5NZXRhaU1hdGNoLCAzLCBVbmljb2RlSW50ZXJmYWNlLCBTdHJpbmcsIFBhdHRlcm4pOworfQpkaWZmIC0tZ2l0IGEvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIveDg2XzY0L2NhbGx3cmFwLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi94ODZfNjQvY2FsbHdyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE1MzIyCi0tLSAvZGV2L251bGwKKysrIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIveDg2XzY0L2NhbGx3cmFwLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvbnZlcnQgU3lzViBjYWxsaW5nIGNvbnZlbnRpb24gdG8gRUZJIHg4Nl82NCBjYWxsaW5nIGNvbnZlbnRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSW50ZWwgQ29ycAorICoJQmlibyBNYW8gPGJpYm8ubWFvQGludGVsLmNvbT4KKyAqCUNoYW5kcmFtb3VsaSBOYXJheWFuYW48bW91bGlAbGludXguaW50ZWwuY29tPgorICoJSHVhbmcgWWluZyA8eWluZy5odWFuZ0BpbnRlbC5jb20+CisgKgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgQ28uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICogIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiAgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiAgQkUgTElBQkxFIEZPUiBBTllESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisgKiAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICogIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRgorICogIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogIFNVQ0ggREFNQUdFLgorICovCisKKy8qIHVlZmlfY2FsbF93cmFwcGVyKCkgaXMgYSBtYWNybyBpbiBlZmliaW5kLmggKi8KZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3g4Nl82NC9lZmlfc3R1Yi5TIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIveDg2XzY0L2VmaV9zdHViLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzMTI1NQotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3g4Nl82NC9lZmlfc3R1Yi5TCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogRnVuY3Rpb24gY2FsbGluZyBBQkkgY29udmVyc2lvbiBmcm9tIExpbnV4IHRvIEVGSSBmb3IgeDg2XzY0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEludGVsIENvcnAKKyAqCUJpYm8gTWFvIDxiaWJvLm1hb0BpbnRlbC5jb20+CisgKglIdWFuZyBZaW5nIDx5aW5nLmh1YW5nQGludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBGZWxpcGUgQ29udHJlcmFzIDxmZWxpcGUuY29udHJlcmFzQGdtYWlsLmNvbT4KKyAqLworCisjaWYgIWRlZmluZWQoSEFWRV9VU0VfTVNfQUJJKQorLyoKKyAqIEVGSSBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSBkb2N1bWVudGVkIGF0OgorICogICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMyMzUyODYlMjh2PXZzLjgwJTI5LmFzcHgKKyAqIEVMRiBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSBkb2N1bWVudGVkIGF0OgorICogICBodHRwOi8vd3d3Lng4Ni02NC5vcmcvZG9jdW1lbnRhdGlvbi9hYmkucGRmCisgKgorICogQmFzaWNhbGx5IGhlcmUgYXJlIHRoZSBjb252ZXJzaW9uIHJ1bGVzOgorICogYSkgb3VyIGZ1bmN0aW9uIHBvaW50ZXIgaXMgaW4gJXJkaQorICogYikgcnNpIHRocm91Z2ggcjggKGVsZikgYWthIHJjeCB0aHJvdWdoIHI5IChtcykgcmVxdWlyZSBzdGFjayBzcGFjZQorICogICAgb24gdGhlIE1TIHNpZGUgZXZlbiB0aG91Z2ggaXQncyBub3QgZ2V0dGluZyB1c2VkIGF0IGFsbC4KKyAqIGMpIDgoJXJzcCkgaXMgYWx3YXlzIGFsaWduZWQgdG8gMTYgaW4gRUxGLCBzbyAlcnNwIGlzIHNoaWZ0ZWQgOCBieXRlcyBleHRyYQorICogZCkgYXJndW1lbnRzIGFyZSBhcyBmb2xsb3dzOiAoZWxmIC0+IG1zKQorICogICAxKSByZGkgLT4gcmN4ICgzMiBzYXZlZCkKKyAqICAgMikgcnNpIC0+IHJkeCAoMzIgc2F2ZWQpCisgKiAgIDMpIHJkeCAtPiByOCAoMzIgc2F2ZWQpCisgKiAgIDQpIHJjeCAtPiByOSAoMzIgc2F2ZWQpCisgKiAgIDUpIHI4IC0+IDMyKCVyc3ApICgzMiBzYXZlZCkKKyAqICAgNikgcjkgLT4gNDAoJXJzcCkgKDQ4IHNhdmVkKQorICogICA3KSA4KCVyc3ApIC0+IDQ4KCVyc3ApICg0OCBzYXZlZCkKKyAqICAgOCkgMTYoJXJzcCkgLT4gNTYoJXJzcCkgKDY0IHNhdmVkKQorICogICA5KSAyNCglcnNwKSAtPiA2NCglcnNwKSAoNjQgc2F2ZWQpCisgKiAgMTApIDMyKCVyc3ApIC0+IDcyKCVyc3ApICg4MCBzYXZlZCkKKyAqIGUpIGJlY2F1c2UgdGhlIGZpcnN0IGFyZ3VtZW50IHdlIHJlY2lldmUgaW4gYSB0aHVua2VyIGlzIGFjdHVhbGx5IHRoZQorICogICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLCBhcmd1bWVudHMgYXJlIG9mZnNldCBhcyBzdWNoOgorICogICAwKSByZGkgLT4gY2FsbGVyCisgKiAgIDEpIHJzaSAtPiByY3ggKDMyIHNhdmVkKQorICogICAyKSByZHggLT4gcmR4ICgzMiBzYXZlZCkKKyAqICAgMykgcmN4IC0+IHI4ICgzMiBzYXZlZCkKKyAqICAgNCkgcjggLT4gcjkgKDMyIHNhdmVkKQorICogICA1KSByOSAtPiAzMiglcnNwKSAoMzIgc2F2ZWQpCisgKiAgIDYpIDgoJXJzcCkgLT4gNDAoJXJzcCkgKDQ4IHNhdmVkKQorICogICA3KSAxNiglcnNwKSAtPiA0OCglcnNwKSAoNDggc2F2ZWQpCisgKiAgIDgpIDI0KCVyc3ApIC0+IDU2KCVyc3ApICg2NCBzYXZlZCkKKyAqICAgOSkgMzIoJXJzcCkgLT4gNjQoJXJzcCkgKDY0IHNhdmVkKQorICogIDEwKSA0MCglcnNwKSAtPiA3MiglcnNwKSAoODAgc2F2ZWQpCisgKiBmKSBhcmd1bWVudHMgbmVlZCB0byBiZSBtb3ZlZCBpbiBvcHBvc2l0ZSBvcmRlciB0byBhdm9pZCBjbG9iYmVyaW5nCisgKi8KKworI2RlZmluZSBFTlRSWShuYW1lKQlcCisJLmdsb2JsIG5hbWU7CVwKKwluYW1lOgorCitFTlRSWShlZmlfY2FsbDApCisJc3VicSAkNDAsICVyc3AKKwljYWxsIColcmRpCisJYWRkcSAkNDAsICVyc3AKKwlyZXQKKworRU5UUlkoZWZpX2NhbGwxKQorCXN1YnEgJDQwLCAlcnNwCisJbW92ICAlcnNpLCAlcmN4CisJY2FsbCAqJXJkaQorCWFkZHEgJDQwLCAlcnNwCisJcmV0CisKK0VOVFJZKGVmaV9jYWxsMikKKwlzdWJxICQ0MCwgJXJzcAorCS8qIG1vdiAlcmR4LCAlcmR4ICovCisJbW92ICAlcnNpLCAlcmN4CisJY2FsbCAqJXJkaQorCWFkZHEgJDQwLCAlcnNwCisJcmV0CisKK0VOVFJZKGVmaV9jYWxsMykKKwlzdWJxICQ0MCwgJXJzcAorCW1vdiAgJXJjeCwgJXI4CisJLyogbW92ICVyZHgsICVyZHggKi8KKwltb3YgICVyc2ksICVyY3gKKwljYWxsIColcmRpCisJYWRkcSAkNDAsICVyc3AKKwlyZXQKKworRU5UUlkoZWZpX2NhbGw0KQorCXN1YnEgJDQwLCAlcnNwCisJbW92ICVyOCwgJXI5CisJbW92ICVyY3gsICVyOAorCS8qIG1vdiAlcmR4LCAlcmR4ICovCisJbW92ICVyc2ksICVyY3gKKwljYWxsIColcmRpCisJYWRkcSAkNDAsICVyc3AKKwlyZXQKKworRU5UUlkoZWZpX2NhbGw1KQorCXN1YnEgJDQwLCAlcnNwCisJbW92ICVyOSwgMzIoJXJzcCkKKwltb3YgJXI4LCAlcjkKKwltb3YgJXJjeCwgJXI4CisJLyogbW92ICVyZHgsICVyZHggKi8KKwltb3YgJXJzaSwgJXJjeAorCWNhbGwgKiVyZGkKKwlhZGRxICQ0MCwgJXJzcAorCXJldAorCitFTlRSWShlZmlfY2FsbDYpCisJc3VicSAkNTYsICVyc3AKKwltb3YgNTYrOCglcnNwKSwgJXJheAorCW1vdiAlcmF4LCA0MCglcnNwKQorCW1vdiAlcjksIDMyKCVyc3ApCisJbW92ICVyOCwgJXI5CisJbW92ICVyY3gsICVyOAorCS8qIG1vdiAlcmR4LCAlcmR4ICovCisJbW92ICVyc2ksICVyY3gKKwljYWxsIColcmRpCisJYWRkcSAkNTYsICVyc3AKKwlyZXQKKworRU5UUlkoZWZpX2NhbGw3KQorCXN1YnEgJDU2LCAlcnNwCisJbW92IDU2KzE2KCVyc3ApLCAlcmF4CisJbW92ICVyYXgsIDQ4KCVyc3ApCisJbW92IDU2KzgoJXJzcCksICVyYXgKKwltb3YgJXJheCwgNDAoJXJzcCkKKwltb3YgJXI5LCAzMiglcnNwKQorCW1vdiAlcjgsICVyOQorCW1vdiAlcmN4LCAlcjgKKwkvKiBtb3YgJXJkeCwgJXJkeCAqLworCW1vdiAlcnNpLCAlcmN4CisJY2FsbCAqJXJkaQorCWFkZHEgJDU2LCAlcnNwCisJcmV0CisKK0VOVFJZKGVmaV9jYWxsOCkKKwlzdWJxICQ3MiwgJXJzcAorCW1vdiA3MisyNCglcnNwKSwgJXJheAorCW1vdiAlcmF4LCA1NiglcnNwKQorCW1vdiA3MisxNiglcnNwKSwgJXJheAorCW1vdiAlcmF4LCA0OCglcnNwKQorCW1vdiA3Mis4KCVyc3ApLCAlcmF4CisJbW92ICVyYXgsIDQwKCVyc3ApCisJbW92ICVyOSwgMzIoJXJzcCkKKwltb3YgJXI4LCAlcjkKKwltb3YgJXJjeCwgJXI4CisJLyogbW92ICVyZHgsICVyZHggKi8KKwltb3YgJXJzaSwgJXJjeAorCWNhbGwgKiVyZGkKKwlhZGRxICQ3MiwgJXJzcAorCXJldAorCitFTlRSWShlZmlfY2FsbDkpCisJc3VicSAkNzIsICVyc3AKKwltb3YgNzIrMzIoJXJzcCksICVyYXgKKwltb3YgJXJheCwgNjQoJXJzcCkKKwltb3YgNzIrMjQoJXJzcCksICVyYXgKKwltb3YgJXJheCwgNTYoJXJzcCkKKwltb3YgNzIrMTYoJXJzcCksICVyYXgKKwltb3YgJXJheCwgNDgoJXJzcCkKKwltb3YgNzIrOCglcnNwKSwgJXJheAorCW1vdiAlcmF4LCA0MCglcnNwKQorCW1vdiAlcjksIDMyKCVyc3ApCisJbW92ICVyOCwgJXI5CisJbW92ICVyY3gsICVyOAorCS8qIG1vdiAlcmR4LCAlcmR4ICovCisJbW92ICVyc2ksICVyY3gKKwljYWxsIColcmRpCisJYWRkcSAkNzIsICVyc3AKKwlyZXQKKworRU5UUlkoZWZpX2NhbGwxMCkKKwlzdWJxICQ4OCwgJXJzcAorCW1vdiA4OCs0MCglcnNwKSwgJXJheAorCW1vdiAlcmF4LCA3MiglcnNwKQorCW1vdiA4OCszMiglcnNwKSwgJXJheAorCW1vdiAlcmF4LCA2NCglcnNwKQorCW1vdiA4OCsyNCglcnNwKSwgJXJheAorCW1vdiAlcmF4LCA1NiglcnNwKQorCW1vdiA4OCsxNiglcnNwKSwgJXJheAorCW1vdiAlcmF4LCA0OCglcnNwKQorCW1vdiA4OCs4KCVyc3ApLCAlcmF4CisJbW92ICVyYXgsIDQwKCVyc3ApCisJbW92ICVyOSwgMzIoJXJzcCkKKwltb3YgJXI4LCAlcjkKKwltb3YgJXJjeCwgJXI4CisJLyogbW92ICVyZHgsICVyZHggKi8KKwltb3YgJXJzaSwgJXJjeAorCWNhbGwgKiVyZGkKKwlhZGRxICQ4OCwgJXJzcAorCXJldAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3g4Nl82NC9pbml0cGxhdC5jIGIvZ251LWVmaS9nbnUtZWZpLTMuMC9saWIveDg2XzY0L2luaXRwbGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2ZWE4MgotLS0gL2Rldi9udWxsCisrKyBiL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3g4Nl82NC9pbml0cGxhdC5jCkBAIC0wLDAgKzEsMjggQEAKKy8qKysKKworQ29weXJpZ2h0IChjKSAxOTk4ICBJbnRlbCBDb3Jwb3JhdGlvbgorCitNb2R1bGUgTmFtZToKKworICAgIGluaXRwbGF0LmMKKworQWJzdHJhY3Q6CisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAibGliLmgiCisKK1ZPSUQKK0luaXRpYWxpemVMaWJQbGF0Zm9ybSAoCisgICAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgSW1hZ2VIYW5kbGUsCisgICAgSU4gRUZJX1NZU1RFTV9UQUJMRSAgICAgKlN5c3RlbVRhYmxlCisgICAgKQorCit7Cit9CisKZGlmZiAtLWdpdCBhL2dudS1lZmkvZ251LWVmaS0zLjAvbGliL3g4Nl82NC9tYXRoLmMgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi94ODZfNjQvbWF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDAzODgKLS0tIC9kZXYvbnVsbAorKysgYi9nbnUtZWZpL2dudS1lZmktMy4wL2xpYi94ODZfNjQvbWF0aC5jCkBAIC0wLDAgKzEsMTgxIEBACisvKisrCisKK0NvcHlyaWdodCAoYykgMTk5OCAgSW50ZWwgQ29ycG9yYXRpb24KKworTW9kdWxlIE5hbWU6CisKKyAgICBtYXRoLmMKKworQWJzdHJhY3Q6CisKKworCisKK1JldmlzaW9uIEhpc3RvcnkKKworLS0qLworCisjaW5jbHVkZSAibGliLmgiCisKKworLy8KKy8vIERlY2xhcmUgcnVudGltZSBmdW5jdGlvbnMKKy8vCisKKyNpZmRlZiBSVU5USU1FX0NPREUKKyNpZm5kZWYgX19HTlVDX18KKyNwcmFnbWEgUlVOVElNRV9DT0RFKExTaGlmdFU2NCkKKyNwcmFnbWEgUlVOVElNRV9DT0RFKFJTaGlmdFU2NCkKKyNwcmFnbWEgUlVOVElNRV9DT0RFKE11bHRVNjR4MzIpCisjcHJhZ21hIFJVTlRJTUVfQ09ERShEaXZVNjR4MzIpCisjZW5kaWYKKyNlbmRpZgorCisvLworLy8KKy8vCisKK1VJTlQ2NAorTFNoaWZ0VTY0ICgKKyAgICBJTiBVSU5UNjQgICBPcGVyYW5kLAorICAgIElOIFVJTlROICAgIENvdW50CisgICAgKQorLy8gTGVmdCBzaGlmdCA2NGJpdCBieSAzMmJpdCBhbmQgZ2V0IGEgNjRiaXQgcmVzdWx0Cit7CisjaWZkZWYgX19HTlVDX18KKyAgICByZXR1cm4gT3BlcmFuZCA8PCBDb3VudDsKKyNlbHNlCisgICAgVUlOVDY0ICAgICAgUmVzdWx0OworICAgIF9hc20geworICAgICAgICBtb3YgICAgIGVheCwgZHdvcmQgcHRyIE9wZXJhbmRbMF0KKyAgICAgICAgbW92ICAgICBlZHgsIGR3b3JkIHB0ciBPcGVyYW5kWzRdCisgICAgICAgIG1vdiAgICAgZWN4LCBDb3VudAorICAgICAgICBhbmQgICAgIGVjeCwgNjMKKworICAgICAgICBzaGxkICAgIGVkeCwgZWF4LCBjbAorICAgICAgICBzaGwgICAgIGVheCwgY2wKKworICAgICAgICBjbXAgICAgIGVjeCwgMzIKKyAgICAgICAgamMgICAgICBzaG9ydCBsczEwCisKKyAgICAgICAgbW92ICAgICBlZHgsIGVheAorICAgICAgICB4b3IgICAgIGVheCwgZWF4CisKK2xzMTA6CisgICAgICAgIG1vdiAgICAgZHdvcmQgcHRyIFJlc3VsdFswXSwgZWF4CisgICAgICAgIG1vdiAgICAgZHdvcmQgcHRyIFJlc3VsdFs0XSwgZWR4CisgICAgfQorCisgICAgcmV0dXJuIFJlc3VsdDsKKyNlbmRpZgorfQorCitVSU5UNjQKK1JTaGlmdFU2NCAoCisgICAgSU4gVUlOVDY0ICAgT3BlcmFuZCwKKyAgICBJTiBVSU5UTiAgICBDb3VudAorICAgICkKKy8vIFJpZ2h0IHNoaWZ0IDY0Yml0IGJ5IDMyYml0IGFuZCBnZXQgYSA2NGJpdCByZXN1bHQKK3sKKyNpZmRlZiBfX0dOVUNfXworICAgIHJldHVybiBPcGVyYW5kID4+IENvdW50OworI2Vsc2UKKyAgICBVSU5UNjQgICAgICBSZXN1bHQ7CisgICAgX2FzbSB7CisgICAgICAgIG1vdiAgICAgZWF4LCBkd29yZCBwdHIgT3BlcmFuZFswXQorICAgICAgICBtb3YgICAgIGVkeCwgZHdvcmQgcHRyIE9wZXJhbmRbNF0KKyAgICAgICAgbW92ICAgICBlY3gsIENvdW50CisgICAgICAgIGFuZCAgICAgZWN4LCA2MworCisgICAgICAgIHNocmQgICAgZWF4LCBlZHgsIGNsCisgICAgICAgIHNociAgICAgZWR4LCBjbAorCisgICAgICAgIGNtcCAgICAgZWN4LCAzMgorICAgICAgICBqYyAgICAgIHNob3J0IHJzMTAKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4CisgICAgICAgIHhvciAgICAgZWR4LCBlZHgKKworcnMxMDoKKyAgICAgICAgbW92ICAgICBkd29yZCBwdHIgUmVzdWx0WzBdLCBlYXgKKyAgICAgICAgbW92ICAgICBkd29yZCBwdHIgUmVzdWx0WzRdLCBlZHgKKyAgICB9CisKKyAgICByZXR1cm4gUmVzdWx0OworI2VuZGlmCit9CisKKworVUlOVDY0CitNdWx0VTY0eDMyICgKKyAgICBJTiBVSU5UNjQgICBNdWx0aXBsaWNhbmQsCisgICAgSU4gVUlOVE4gICAgTXVsdGlwbGllcgorICAgICkKKy8vIE11bHRpcGxlIDY0Yml0IGJ5IDMyYml0IGFuZCBnZXQgYSA2NGJpdCByZXN1bHQKK3sKKyNpZmRlZiBfX0dOVUNfXworICAgIHJldHVybiBNdWx0aXBsaWNhbmQgKiBNdWx0aXBsaWVyOworI2Vsc2UKKyAgICBVSU5UNjQgICAgICBSZXN1bHQ7CisgICAgX2FzbSB7CisgICAgICAgIG1vdiAgICAgZWF4LCBkd29yZCBwdHIgTXVsdGlwbGljYW5kWzBdCisgICAgICAgIG11bCAgICAgTXVsdGlwbGllcgorICAgICAgICBtb3YgICAgIGR3b3JkIHB0ciBSZXN1bHRbMF0sIGVheAorICAgICAgICBtb3YgICAgIGR3b3JkIHB0ciBSZXN1bHRbNF0sIGVkeAorICAgICAgICBtb3YgICAgIGVheCwgZHdvcmQgcHRyIE11bHRpcGxpY2FuZFs0XQorICAgICAgICBtdWwgICAgIE11bHRpcGxpZXIKKyAgICAgICAgYWRkICAgICBkd29yZCBwdHIgUmVzdWx0WzRdLCBlYXgKKyAgICB9CisKKyAgICByZXR1cm4gUmVzdWx0OworI2VuZGlmCit9CisKK1VJTlQ2NAorRGl2VTY0eDMyICgKKyAgICBJTiBVSU5UNjQgICBEaXZpZGVuZCwKKyAgICBJTiBVSU5UTiAgICBEaXZpc29yLAorICAgIE9VVCBVSU5UTiAgICpSZW1haW5kZXIgT1BUSU9OQUwKKyAgICApCisvLyBkaXZpZGUgNjRiaXQgYnkgMzJiaXQgYW5kIGdldCBhIDY0Yml0IHJlc3VsdAorLy8gTi5CLiBvbmx5IHdvcmtzIGZvciAzMWJpdCBkaXZpc29ycyEhCit7CisjaWZkZWYgX19HTlVDX18KKyAgICBpZiAoUmVtYWluZGVyKQorCSpSZW1haW5kZXIgPSBEaXZpZGVuZCAlIERpdmlzb3I7CisgICAgcmV0dXJuIERpdmlkZW5kIC8gRGl2aXNvcjsKKyNlbHNlCisgICAgVUlOVDMyICAgICAgUmVtOworICAgIFVJTlQzMiAgICAgIGJpdDsgICAgICAgIAorCisgICAgQVNTRVJUIChEaXZpc29yICE9IDApOworICAgIEFTU0VSVCAoKERpdmlzb3IgPj4gMzEpID09IDApOworCisgICAgLy8KKyAgICAvLyBGb3IgZWFjaCBiaXQgaW4gdGhlIGRpdmlkZW5kCisgICAgLy8KKworICAgIFJlbSA9IDA7CisgICAgZm9yIChiaXQ9MDsgYml0IDwgNjQ7IGJpdCsrKSB7CisgICAgICAgIF9hc20geworICAgICAgICAgICAgc2hsICAgICBkd29yZCBwdHIgRGl2aWRlbmRbMF0sIDEgICAgOyBzaGlmdCByZW06ZGl2aWRlbmQgbGVmdCBvbmUKKyAgICAgICAgICAgIHJjbCAgICAgZHdvcmQgcHRyIERpdmlkZW5kWzRdLCAxICAgIAorICAgICAgICAgICAgcmNsICAgICBkd29yZCBwdHIgUmVtLCAxICAgICAgICAgICAgCisKKyAgICAgICAgICAgIG1vdiAgICAgZWF4LCBSZW0KKyAgICAgICAgICAgIGNtcCAgICAgZWF4LCBEaXZpc29yICAgICAgICAgICAgICAgIDsgSXMgUmVtID49IERpdmlzb3I/CisgICAgICAgICAgICBjbWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IE5vIC0gZG8gbm90aGluZworICAgICAgICAgICAgc2JiICAgICBlYXgsIGVheCAgICAgICAgICAgICAgICAgICAgOyBFbHNlLCAKKyAgICAgICAgICAgIHN1YiAgICAgZHdvcmQgcHRyIERpdmlkZW5kWzBdLCBlYXggIDsgICBzZXQgbG93IGJpdCBpbiBkaXZpZGVuCisgICAgICAgICAgICBhbmQgICAgIGVheCwgRGl2aXNvciAgICAgICAgICAgICAgICA7IGFuZAorICAgICAgICAgICAgc3ViICAgICBSZW0sIGVheCAgICAgICAgICAgICAgICAgICAgOyAgIHN1YnRyYWN0IGRpdmlzb3IgCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUmVtYWluZGVyKSB7CisgICAgICAgICpSZW1haW5kZXIgPSBSZW07CisgICAgfQorCisgICAgcmV0dXJuIERpdmlkZW5kOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9ncHhlL0NPUFlJTkcgYi9ncHhlL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzZWEyMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvQ09QWUlORwpAQCAtMCwwICsxLDMzOSBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCUFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZ3B4ZS9DT1BZUklHSFRTIGIvZ3B4ZS9DT1BZUklHSFRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ODZiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL0NPUFlSSUdIVFMKQEAgLTAsMCArMSwyNiBAQAorCitJbiBnZW5lcmFsIGdQWEUgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuICBHUExlZCBmaWxlcyBhcmUgaW4KK2dlbmVyYWwgZWl0aGVyIGZyb20gTGludXggb3IgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgcHV0IHVuZGVyIEdQTCBieSB0aGUKK2F1dGhvcnMuICBUaGUgbGljZW5zZSBmb3IgYSBmaWxlIGlzIHVzdWFsbHkgZG9jdW1lbnRlZCBhdCB0aGUgdG9wIG9mCit0aGUgZmlsZS4gIAorCitBIGZldyBmaWxlcyBhcmUgaW5oZXJpdGVkIGZyb20gRnJlZUJTRCBuZXRib290IGFuZCB0aGVyZWZvcmUgY2FuIGJlCit1c2VkIHVuZGVyIEJTRCBvciBHUEwuICBEb2N1bWVudGVkIGluIHRoaXMgZmlsZSBhcmUgc29tZSBvZiB0aGUKK25vbi1HUEwnZWQgZmlsZXMuICBJZiB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiBmb3IgYSBmaWxlIGRpc2FncmVlcword2l0aCB3aGF0IGlzIGRvY3VtZW50ZWQgaW4gdGhpcyBmaWxlLCB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiBmb3IKK3RoZSBmaWxlIHNoYWxsIGJlIG92ZXJyaWRlIHRoaXMgZmlsZS4KKworRmlsZQkJCQkJQ29weXJpZ2h0IHN0YXR1cworCitzcmMvY29yZS9taXNjLmMJCQkJQlNECitzcmMvZHJpdmVycy9uZXQvM2M1MDkuYwkJCUJTRAorc3JjL2RyaXZlcnMvbmV0LzNjNTA5LmgJCQlCU0QKK3NyYy9kcml2ZXJzL25ldC8zYzU5NS5jCQkJQlNECitzcmMvZHJpdmVycy9uZXQvM2M1OTUuaAkJCUJTRAorc3JjL2RyaXZlcnMvbmV0LzNjOTB4LmMJCQlPcGVuIFNvdXJjZQorc3JjL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwkJTm9uZQorc3JjL2RyaXZlcnMvbmV0L2VwaWMxMDAuaAkJTm9uZQorc3JjL2RyaXZlcnMvbmV0L25zODM5MC5jCQlCU0QKK3NyYy9kcml2ZXJzL25ldC9uczgzOTAuaAkJQlNECitzcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9zdHJpbmcuaAlOb25lCisKZGlmZiAtLWdpdCBhL2dweGUvTE9HIGIvZ3B4ZS9MT0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5YzhlYgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvTE9HCkBAIC0wLDAgKzEsMTIgQEAKK2dQWEUgTE9HIGZpbGUKKworKyBEZXZlbG9wbWVudCBmb3IgZ1BYRSB3YXMgbW92ZWQgZnJvbSBTb3VyY2VGb3JnZSBDVlMgdG8gYSBnaXQKKyAgcmVwb3NpdG9yeSBvbiBnaXQuZXRoZXJib290Lm9yZyBpbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgeWVhciAyMDA3LgorCisrIFRoZSBnaXR3ZWIgaW50ZXJmYWNlIGZvciBnUFhFIGlzIGF2YWlsYWJsZSBhdDoKKworICAgIGh0dHA6Ly9naXQuZXRoZXJib290Lm9yZy8/cD1ncHhlLmdpdAorCisrIFRoZSBnaXR3ZWIgaW50ZXJmYWNlIGxhcmdlbHkgb2Jzb2xldGVzIHRoZSBMT0cgZmlsZSB0aGF0IHVzZWQgdG8gYmUKKyAgZGlzdHJpYnV0ZWQgd2l0aCBFdGhlcmJvb3QuCisKZGlmZiAtLWdpdCBhL2dweGUvTWFrZWZpbGUgYi9ncHhlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjVlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL01ha2VmaWxlCkBAIC0wLDAgKzEsNTYgQEAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyAgIAorIyMgICBDb3B5cmlnaHQgMjAwOC0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMgICBDb3B5cmlnaHQgMjAwOS0yMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisjIyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyMgTWFrZWZpbGUgZm9yIGdweGUvZ3B4ZWxpbnV4LjAKKyMKKyMgVmVyeSBzaW1wbGUsIHJlYWxseS4uLgorIworCitWUEFUSCA9ICQoU1JDKQorVEFSR0VUUwk9IGdweGVsaW51eC4wIGdweGVsaW51eGsuMAorCitQWEVNQUtFID0gJChNQUtFKSAtQyAkKFNSQykvc3JjIE5PX1dFUlJPUj0xCisKK2FsbDogJChUQVJHRVRTKQorCit0aWR5OgorCitjbGVhbjogdGlkeQorCitkaXN0OgorCSQoTUFLRSkgLUMgJChTUkMpL3NyYyB2ZXJ5Y2xlYW4gPiAvZGV2L251bGwgMj4mMQorCisjc3BvdGxlc3M6IGNsZWFuIGRpc3QKKyNJbmNsdWRpbmcgJ2Rpc3QnIGVycm9ycyBvdXQgZm9yIG1ha2UgQVJDSD14ODZfNjQgc3BvdGxlc3MKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mICQoVEFSR0VUUykKKworaW5zdGFsbGVyOgorCisuTk9UUEFSQUxMRUw6CisKK3NyYy9iaW4vYmxpYi5hOgorCSQoUFhFTUFLRSkgYmluL2JsaWIuYQorCitzcmMvYmluL3VuZGlvbmx5LmtrcHhlOiBzcmMvYmluL2JsaWIuYSBweGVsaW51eC5ncHhlICQob2JqZGlyKS9jb3JlL3B4ZWxpbnV4LjAKKwkkKFBYRU1BS0UpIGJpbi91bmRpb25seS5ra3B4ZSBFTUJFRERFRF9JTUFHRT0kKFNSQykvcHhlbGludXguZ3B4ZSwkKG9iamRpcikvY29yZS9weGVsaW51eC4wCisKK2dweGVsaW51eC4wOiBzcmMvYmluL3VuZGlvbmx5LmtrcHhlCisJY3AgLWYgJChTUkMpLyQ8ICRACisKK3NyYy9iaW4vdW5kaW9ubHkua3B4ZTogc3JjL2Jpbi9ibGliLmEgcHhlbGludXhrLmdweGUgJChvYmpkaXIpL2NvcmUvcHhlbGludXguMAorCSQoUFhFTUFLRSkgYmluL3VuZGlvbmx5LmtweGUgRU1CRURERURfSU1BR0U9JChTUkMpL3B4ZWxpbnV4ay5ncHhlLCQob2JqZGlyKS9jb3JlL3B4ZWxpbnV4LjAKKworZ3B4ZWxpbnV4ay4wOiBzcmMvYmluL3VuZGlvbmx5LmtweGUKKwljcCAtZiAkKFNSQykvJDwgJEAKZGlmZiAtLWdpdCBhL2dweGUvUkVBRE1FIGIvZ3B4ZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhZTIxNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvUkVBRE1FCkBAIC0wLDAgKzEsNTMgQEAKK2dQWEUgUkVBRE1FIEZpbGUKKworZ1BYRSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUFhFIHNwZWNpZmljYXRpb24gZm9yIG5ldHdvcmsKK2Jvb3RpbmcsIHdpdGggZXh0ZW5zaW9ucyB0byBhbGxvdyBhZGRpdGlvbmFsIGZlYXR1cmVzIHN1Y2ggYXMgYm9vdGluZwordmlhIEhUVFAsIGlTQ1NJLCBhbmQgQW9FLiAgCisKK0luIGdlbmVyYWxseSwgZ1BYRSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGluZHVzdHJ5LXN0YW5kYXJkIFBYRQorc3BlY2lmaWNhdGlvbiwgYW5kIGFsc28gc3VwcG9ydHMgRXRoZXJib290IC5uYmkgZmlsZSBsb2FkaW5nIGFuZCBzb21lCithZGRpdGlvbmFsIHByb3RvY29scyBhbmQgZmVhdHVyZXMuCisKK0ZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGdQWEUsIHBsZWFzZSB2aXNpdCBvdXIgcHJvamVjdAord2Vic2l0ZSBhdDogaHR0cDovL2V0aGVyYm9vdC5vcmcvCisKK0JVSUxESU5HIGdQWEUgSU1BR0UgRlJPTSBTT1VSQ0UKKworSWYgeW91IGRvbid0IHdhbnQgdG8gaW5zdGFsbCBkZXZlbG9wbWVudCB0b29scywgYW5kIGhhdmUgYWNjZXNzIHRvIHRoZQorV2ViLCB5b3UgY2FuIGdldCBnUFhFIGFuZCBFdGhlcmJvb3QgUk9NIGltYWdlcyBtYWRlIG9uIGRlbWFuZCBmcm9tCitodHRwOi8vcm9tLW8tbWF0aWMubmV0LworCitJZiB5b3Ugd291bGQgbGlrZSB0byBjb21waWxlIGdQWEUgaW1hZ2VzIGZyb20gc291cmNlLCBoZXJlIGFyZSBzb21lIHRpcHMuCisKK1dlIG5vcm1hbGx5IGNvbXBpbGUgZ1BYRSBpbWFnZXMgb24geDg2LCAzMi1iaXQgTGludXggbWFjaGluZXMuIEl0IGlzCitwb3NzaWJsZSB0byBhbHNvIHVzZSB4ODYtNjQgbWFjaGluZXMuIFdlIHVzZSBnY2MgY29tcGlsZXIgb3B0aW9ucyB0bworY3JlYXRlIDMyLWJpdCBvdXRwdXQuCisKK0l0IGlzIGltcG9ydGFudCB0byBoYXZlIHRoZSBuZWNlc3Nhcnkgc29mdHdhcmUgIHBhY2thZ2VzIGluc3RhbGxlZC4gIEEgZ2NjLWJhc2VkCit0b29sY2hhaW4gaXMgcmVxdWlyZWQuCisKK1RoZSBmb2xsb3dpbmcgcGFja2FnZXMgKGF0IGxlYXN0KSBhcmUgcmVxdWlyZWQ6CisKKyAgLSBhIGdjYyB0b29sIGNoYWluIChnY2MgMy54IG9yIGdjYyA0LngpCisgIC0gYmludXRpbHMKKyAgLSBwZXJsCisgIC0gc3lzbGludXgKKyAgLSBtdG9vbHMKKyAgCitUbyB0ZXN0IHlvdXIgZW52aXJvbm1lbnQsIGNkIHRvIHRoZSAic3JjIiBkaXJlY3RvcnkgYW5kIHR5cGU6CisKKyAgIG1ha2UKKworWW91IHNob3VsZCBzZWUgYSBsb3Qgb2Ygb3V0cHV0LCBhbmQgd2hlbiBpdCBzdG9wcywgdGhlICJiaW4iIGRpcmVjdG9yeQorc2hvdWxkIGJlIHBvcHVsYXRlZCB3aXRoIGdQWEUgaW1hZ2VzIGFuZCBvYmplY3QgZmlsZXMuCisKK1RvIGxlYXJuIG1vcmUgYWJvdXQgd2hhdCB0byBidWlsZCBhbmQgaG93IHRvIHVzZSBnUFhFLCBwbGVhc2UgdmlzaXQgb3VyCitwcm9qZWN0IHdlYnNpdGUgYXQgaHR0cDovL2V0aGVyYm9vdC5vcmcvICwgcGFydGljdWxhcmx5IHRoZSAiaG93dG8iIHNlY3Rpb24uCisKK0NPTlRBQ1RJTkcgVVMKKworUG9pbnRlcnMgdG8gb3VyIHByb2plY3QgbWFpbGluZyBsaXN0cyBhcmUgb24gaHR0cDovL2V0aGVyYm9vdC5vcmcvCisKK1JlYWwtdGltZSBoZWxwIGlzIG9mdGVuIGF2YWlsYWJsZSBvbiBJUkMgb24gdGhlICNldGhlcmJvb3QgY2hhbm5lbCBvZgoraXJjLmZyZWVub2RlLm5ldC4KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9WRVJTSU9OIGIvZ3B4ZS9WRVJTSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjUxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL1ZFUlNJT04KQEAgLTAsMCArMSBAQAorMC45LjYrIDIwMDgtMTEtMjMKZGlmZiAtLWdpdCBhL2dweGUvZ3B4ZS5kaWZmIGIvZ3B4ZS9ncHhlLmRpZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlNWY0MQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvZ3B4ZS5kaWZmCkBAIC0wLDAgKzEsNzMgQEAKK2RpZmYgLS1naXQgYS9ncHhlL3NyYy9jb25maWcvZ2VuZXJhbC5oIGIvZ3B4ZS9zcmMvY29uZmlnL2dlbmVyYWwuaAoraW5kZXggMGE5ZTYyNS4uZGU1MWY5ZiAxMDA2NDQKKy0tLSBhL2dweGUvc3JjL2NvbmZpZy9nZW5lcmFsLmgKKysrKyBiL2dweGUvc3JjL2NvbmZpZy9nZW5lcmFsLmgKK0BAIC01NSw4ICs1NSw4IEBAIEZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKyAKKyAjZGVmaW5lCURPV05MT0FEX1BST1RPX1RGVFAJLyogVHJpdmlhbCBGaWxlIFRyYW5zZmVyIFByb3RvY29sICovCisgI2RlZmluZQlET1dOTE9BRF9QUk9UT19IVFRQCS8qIEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCAqLworLSN1bmRlZglET1dOTE9BRF9QUk9UT19IVFRQUwkvKiBTZWN1cmUgSHlwZXJ0ZXh0IFRyYW5zZmVyIFByb3RvY29sICovCistI3VuZGVmCURPV05MT0FEX1BST1RPX0ZUUAkvKiBGaWxlIFRyYW5zZmVyIFByb3RvY29sICovCisrI2RlZmluZQlET1dOTE9BRF9QUk9UT19IVFRQUwkvKiBTZWN1cmUgSHlwZXJ0ZXh0IFRyYW5zZmVyIFByb3RvY29sICovCisrI2RlZmluZQlET1dOTE9BRF9QUk9UT19GVFAJLyogRmlsZSBUcmFuc2ZlciBQcm90b2NvbCAqLworICN1bmRlZglET1dOTE9BRF9QUk9UT19URlRNCS8qIE11bHRpY2FzdCBUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wgKi8KKyAjdW5kZWYJRE9XTkxPQURfUFJPVE9fU0xBTQkvKiBTY2FsYWJsZSBMb2NhbCBBcmVhIE11bHRpY2FzdCAqLworIAorZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvbmZpZy9nZW5lcmFsLmggYi9ncHhlL3NyYy9jb25maWcvZ2VuZXJhbC5oCitpbmRleCBkZTUxZjlmLi4yZjVhOTM4IDEwMDY0NAorLS0tIGEvZ3B4ZS9zcmMvY29uZmlnL2dlbmVyYWwuaAorKysrIGIvZ3B4ZS9zcmMvY29uZmlnL2dlbmVyYWwuaAorQEAgLTMxLDcgKzMxLDcgQEAgRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworICAqIFRpbWVyIGNvbmZpZ3VyYXRpb24KKyAgKgorICAqLworLSNkZWZpbmUgQkFOTkVSX1RJTUVPVVQJMjAJLyogVGVudGhzIG9mIGEgc2Vjb25kIGZvciB3aGljaCB0aGUgc2hlbGwKKysjZGVmaW5lIEJBTk5FUl9USU1FT1VUCTAJLyogVGVudGhzIG9mIGEgc2Vjb25kIGZvciB3aGljaCB0aGUgc2hlbGwKKyAJCQkJICAgYmFubmVyIHNob3VsZCBhcHBlYXIgKi8KKyAKKyAvKgorZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9zaGVsbF9iYW5uZXIuYyBiL2dweGUvc3JjL2hjaS9zaGVsbF9iYW5uZXIuYworaW5kZXggOGFmZWZlMy4uYjkyZTA4ZSAxMDA2NDQKKy0tLSBhL2dweGUvc3JjL2hjaS9zaGVsbF9iYW5uZXIuYworKysrIGIvZ3B4ZS9zcmMvaGNpL3NoZWxsX2Jhbm5lci5jCitAQCAtNDEsNiArNDEsOSBAQCBpbnQgc2hlbGxfYmFubmVyICggdm9pZCApIHsKKyAJaW50IHdhaXRfY291bnQ7CisgCWludCBrZXk7CisgCisrCWlmICggQkFOTkVSX1RJTUVPVVQgPD0gMCApCisrCQlyZXR1cm4gZW50ZXJfc2hlbGw7CisrCisgCXByaW50ZiAoICJcblByZXNzIEN0cmwtQiBmb3IgdGhlIGdQWEUgY29tbWFuZCBsaW5lLi4uIiApOworIAorIAkvKiBXYWl0IGZvciBrZXkgKi8KK2RpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGNwLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGNwLmgKK2luZGV4IDdhZTdlYWIuLjlkYzM5ZmMgMTAwNjQ0CistLS0gYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGNwLmgKKysrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90Y3AuaAorQEAgLTI4Niw4ICsyODYsOCBAQCBzdHJ1Y3QgdGNwX29wdGlvbnMgeworICAqIGFjdHVhbGx5IHVzZSA2NTUzNiwgd2UgdXNlIGEgd2luZG93IHNpemUgb2YgKDY1NTM2LTQpIHRvIGVuc3VyZQorICAqIHRoYXQgcGF5bG9hZHMgcmVtYWluIGR3b3JkLWFsaWduZWQuCisgICovCistLy8jZGVmaW5lIFRDUF9NQVhfV0lORE9XX1NJWkUJKCA2NTUzNiAtIDQgKQorLSNkZWZpbmUgVENQX01BWF9XSU5ET1dfU0laRQk0MDk2CisrI2RlZmluZSBUQ1BfTUFYX1dJTkRPV19TSVpFCSggNjU1MzYgLSA0ICkKKysvLyNkZWZpbmUgVENQX01BWF9XSU5ET1dfU0laRQk0MDk2CisgCisgLyoqCisgICogUGF0aCBNVFUKK2RpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL21hbGxvYy5jIGIvZ3B4ZS9zcmMvY29yZS9tYWxsb2MuYworaW5kZXggOGIwYmMyNC4uMDE1Mzc0OCAxMDA2NDQKKy0tLSBhL2dweGUvc3JjL2NvcmUvbWFsbG9jLmMKKysrKyBiL2dweGUvc3JjL2NvcmUvbWFsbG9jLmMKK0BAIC03OCw5ICs3OCw5IEBAIHNpemVfdCBmcmVlbWVtOworIC8qKgorICAqIEhlYXAgc2l6ZQorICAqCistICogQ3VycmVudGx5IGZpeGVkIGF0IDEyOGtCLgorKyAqIEN1cnJlbnRseSBmaXhlZCBhdCA1MTJrQi4KKyAgKi8KKy0jZGVmaW5lIEhFQVBfU0laRSAoIDEyOCAqIDEwMjQgKQorKyNkZWZpbmUgSEVBUF9TSVpFICggNTEyICogMTAyNCApCisKKyAvKiogVGhlIGhlYXAgaXRzZWxmICovCisgc3RhdGljIGNoYXIgaGVhcFtIRUFQX1NJWkVdIF9fYXR0cmlidXRlX18gKCggYWxpZ25lZCAoIF9fYWxpZ25vZl9fKHZvaWQgKikgKSkpOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9weGVsaW51eC5ncHhlIGIvZ3B4ZS9weGVsaW51eC5ncHhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjdkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3B4ZWxpbnV4LmdweGUKQEAgLTAsMCArMSw1IEBACisjIWdweGUKK3NldCB1c2UtY2FjaGVkIDEKK2RoY3AgbmV0MAoraW1nbG9hZCBweGVsaW51eC4wCitib290IHB4ZWxpbnV4LjAKZGlmZiAtLWdpdCBhL2dweGUvcHhlbGludXhrLmdweGUgYi9ncHhlL3B4ZWxpbnV4ay5ncHhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWU1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3B4ZWxpbnV4ay5ncHhlCkBAIC0wLDAgKzEsNSBAQAorIyFncHhlCitzZXQgdXNlLWNhY2hlZCAwCitkaGNwIG5ldDAKK2ltZ2xvYWQgcHhlbGludXguMAorYm9vdCBweGVsaW51eC4wCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9NYWtlZmlsZSBiL2dweGUvc3JjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTFkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9NYWtlZmlsZQpAQCAtMCwwICsxLDE1MCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBJbml0aWFsaXNlIHZhcmlvdXMgdmFyaWFibGVzCisjCisKK0NMRUFOVVAJCTo9CitDRkxBR1MJCTo9CitBU0ZMQUdTCQk6PQorTERGTEFHUwkJOj0KK01BS0VERVBTCTo9IE1ha2VmaWxlCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTG9jYXRpb25zIG9mIHRvb2xzCisjCitIT1NUX0NDCQk6PSBnY2MKK1JNCQk6PSBybSAtZgorVE9VQ0gJCTo9IHRvdWNoCitNS0RJUgkJOj0gbWtkaXIKK0NQCQk6PSBjcAorRUNITwkJOj0gZWNobworUFJJTlRGCQk6PSBwcmludGYKK1BFUkwJCTo9IC91c3IvYmluL3BlcmwKK0NDCQk6PSAkKENST1NTX0NPTVBJTEUpZ2NjCitDUFAJCTo9ICQoQ0MpIC1FCitBUwkJOj0gJChDUk9TU19DT01QSUxFKWFzCitMRAkJOj0gJChDUk9TU19DT01QSUxFKWxkCitTSVpFCQk6PSAkKENST1NTX0NPTVBJTEUpc2l6ZQorQVIJCTo9ICQoQ1JPU1NfQ09NUElMRSlhcgorUkFOTElCCQk6PSAkKENST1NTX0NPTVBJTEUpcmFubGliCitPQkpDT1BZCQk6PSAkKENST1NTX0NPTVBJTEUpb2JqY29weQorTk0JCTo9ICQoQ1JPU1NfQ09NUElMRSlubQorT0JKRFVNUAkJOj0gJChDUk9TU19DT01QSUxFKW9iamR1bXAKK1BBUlNFUk9NCTo9ICQoUEVSTCkgLi91dGlsL3BhcnNlcm9tLnBsCitNQUtFUk9NCQk6PSAkKFBFUkwpIC4vdXRpbC9tYWtlcm9tLnBsCitTWU1DSEVDSwk6PSAkKFBFUkwpIC4vdXRpbC9zeW1jaGVjay5wbAorU09SVE9CSkRVTVAJOj0gJChQRVJMKSAuL3V0aWwvc29ydG9iamR1bXAucGwKK1BBRElNRwkJOj0gJChQRVJMKSAuL3V0aWwvcGFkaW1nLnBsCitMSUNFTkNFCQk6PSAkKFBFUkwpIC4vdXRpbC9saWNlbmNlLnBsCitOUlYyQgkJOj0gLi91dGlsL25ydjJiCitaQklOCQk6PSAuL3V0aWwvemJpbgorRUxGMkVGSTMyCTo9IC4vdXRpbC9lbGYyZWZpMzIKK0VMRjJFRkk2NAk6PSAuL3V0aWwvZWxmMmVmaTY0CitFRklST00JCTo9IC4vdXRpbC9lZmlyb20KK0lDQ0ZJWAkJOj0gLi91dGlsL2ljY2ZpeAorRE9YWUdFTgkJOj0gZG94eWdlbgorQklOVVRJTFNfRElSCTo9IC91c3IKK0JGRF9ESVIJCTo9ICQoQklOVVRJTFNfRElSKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNSQ0RJUlMgbGlzdHMgYWxsIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgc291cmNlIGZpbGVzLgorIworU1JDRElSUwkJOj0KK1NSQ0RJUlMJCSs9IGxpYmdjYworU1JDRElSUwkJKz0gY29yZQorU1JDRElSUwkJKz0gbmV0IG5ldC90Y3AgbmV0L3VkcCBuZXQvaW5maW5pYmFuZCBuZXQvODAyMTEKK1NSQ0RJUlMJCSs9IGltYWdlCitTUkNESVJTCQkrPSBkcml2ZXJzL2J1cworU1JDRElSUwkJKz0gZHJpdmVycy9uZXQKK1NSQ0RJUlMJCSs9IGRyaXZlcnMvbmV0L2UxMDAwCitTUkNESVJTCQkrPSBkcml2ZXJzL25ldC9waGFudG9tCitTUkNESVJTCQkrPSBkcml2ZXJzL25ldC9ydGw4MTh4CitTUkNESVJTCQkrPSBkcml2ZXJzL25ldC9hdGg1aworU1JDRElSUwkJKz0gZHJpdmVycy9ibG9jaworU1JDRElSUwkJKz0gZHJpdmVycy9udnMKK1NSQ0RJUlMJCSs9IGRyaXZlcnMvYml0YmFzaAorU1JDRElSUwkJKz0gZHJpdmVycy9pbmZpbmliYW5kCitTUkNESVJTCQkrPSBpbnRlcmZhY2UvcHhlIGludGVyZmFjZS9lZmkgaW50ZXJmYWNlL3NtYmlvcworU1JDRElSUwkJKz0gdGVzdHMKK1NSQ0RJUlMJCSs9IGNyeXB0byBjcnlwdG8vYXh0bHMgY3J5cHRvL21hdHJpeHNzbAorU1JDRElSUwkJKz0gaGNpIGhjaS9jb21tYW5kcyBoY2kvdHVpCitTUkNESVJTCQkrPSBoY2kvbXVjdXJzZXMgaGNpL211Y3Vyc2VzL3dpZGdldHMKK1NSQ0RJUlMJCSs9IHVzcgorU1JDRElSUwkJKz0gY29uZmlnCisKKyMgTk9OX0FVVE9fU1JDUyBsaXN0cyBmaWxlcyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHRoZSBub3JtYWwKKyMgYXV0b21hdGljIGJ1aWxkIHN5c3RlbS4KKyMKK05PTl9BVVRPX1NSQ1MJOj0KK05PTl9BVVRPX1NSQ1MJKz0gZHJpdmVycy9uZXQvcHJpc20yLmMKKworIyBJTkNESVJTIGxpc3RzIHRoZSBpbmNsdWRlIHBhdGgKKyMKK0lOQ0RJUlMJCTo9CitJTkNESVJTCQkrPSBpbmNsdWRlIC4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBEZWZhdWx0IGJ1aWxkIHRhcmdldDogYnVpbGQgdGhlIG1vc3QgY29tbW9uIHRhcmdldHMgYW5kIHByaW50IG91dCBhCisjIGhlbHBmdWxseSBzdWdnZXN0aXZlIG1lc3NhZ2UKKyMKK2FsbCA6IGJpbi9ibGliLmEgYmluL2dweGUuZHNrIGJpbi9ncHhlLmlzbyBiaW4vZ3B4ZS51c2IgYmluL3VuZGlvbmx5LmtweGUKKwlAJChFQ0hPKSAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nCisJQCQoRUNITykKKwlAJChFQ0hPKSAnVG8gY3JlYXRlIGEgYm9vdGFibGUgZmxvcHB5LCB0eXBlJworCUAkKEVDSE8pICcgICAgY2F0IGJpbi9ncHhlLmRzayA+IC9kZXYvZmQwJworCUAkKEVDSE8pICd3aGVyZSAvZGV2L2ZkMCBpcyB5b3VyIGZsb3BweSBkcml2ZS4gIFRoaXMgd2lsbCBlcmFzZSBhbnknCisJQCQoRUNITykgJ2RhdGEgYWxyZWFkeSBvbiB0aGUgZGlzay4nCisJQCQoRUNITykKKwlAJChFQ0hPKSAnVG8gY3JlYXRlIGEgYm9vdGFibGUgVVNCIGtleSwgdHlwZScKKwlAJChFQ0hPKSAnICAgIGNhdCBiaW4vZ3B4ZS51c2IgPiAvZGV2L3NkWCcKKwlAJChFQ0hPKSAnd2hlcmUgL2Rldi9zZFggaXMgeW91ciBVU0Iga2V5LCBhbmQgaXMgKm5vdCogYSByZWFsIGhhcmQnCisJQCQoRUNITykgJ2Rpc2sgb24geW91ciBzeXN0ZW0uICBUaGlzIHdpbGwgZXJhc2UgYW55IGRhdGEgYWxyZWFkeSBvbicKKwlAJChFQ0hPKSAndGhlIFVTQiBrZXkuJworCUAkKEVDSE8pCisJQCQoRUNITykgJ1RvIGNyZWF0ZSBhIGJvb3RhYmxlIENELVJPTSwgYnVybiB0aGUgSVNPIGltYWdlICcKKwlAJChFQ0hPKSAnYmluL2dweGUuaXNvIHRvIGEgYmxhbmsgQ0QtUk9NLicKKwlAJChFQ0hPKQorCUAkKEVDSE8pICdUaGVzZSBpbWFnZXMgY29udGFpbiBkcml2ZXJzIGZvciBhbGwgc3VwcG9ydGVkIGNhcmRzLiAgWW91JworCUAkKEVDSE8pICdjYW4gYnVpbGQgbW9yZSBjdXN0b21pc2VkIGltYWdlcywgYW5kIFJPTSBpbWFnZXMsIHVzaW5nJworCUAkKEVDSE8pICcgICAgbWFrZSBiaW4vPHJvbS1uYW1lPi48b3V0cHV0LWZvcm1hdD4nCisJQCQoRUNITykKKwlAJChFQ0hPKSAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQnVpbGQgdGFyZ2V0cyB0aGF0IGRvIG5vdGhpbmcgYnV0IG1pZ2h0IGJlIHRyaWVkIGJ5IHVzZXJzCisjCitjb25maWd1cmUgOgorCUAkKEVDSE8pICJObyBjb25maWd1cmF0aW9uIG5lZWRlZC4iCisKK2luc3RhbGwgOgorCUAkKEVDSE8pICJObyBpbnN0YWxsYXRpb24gcmVxdWlyZWQuIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFZlcnNpb24gbnVtYmVyIGNhbGN1bGF0aW9ucworIworVkVSU0lPTl9NQUpPUgk9IDEKK1ZFUlNJT05fTUlOT1IJPSAwCitWRVJTSU9OX1BBVENICT0gMAorRVhUUkFWRVJTSU9OCT0KK01NX1ZFUlNJT04JPSAkKFZFUlNJT05fTUFKT1IpLiQoVkVSU0lPTl9NSU5PUikKK1ZFUlNJT04JCT0gJChNTV9WRVJTSU9OKS4kKFZFUlNJT05fUEFUQ0gpJChFWFRSQVZFUlNJT04pCitDRkxBR1MJCSs9IC1EVkVSU0lPTl9NQUpPUj0kKFZFUlNJT05fTUFKT1IpIFwKKwkJICAgLURWRVJTSU9OX01JTk9SPSQoVkVSU0lPTl9NSU5PUikgXAorCQkgICAtRFZFUlNJT05fUEFUQ0g9JChWRVJTSU9OX1BBVENIKSBcCisJCSAgIC1EVkVSU0lPTj1cIiQoVkVSU0lPTilcIgorSURFTlQJCT0gJyQoQEYpICQoVkVSU0lPTikgKEdQTCkgZXRoZXJib290Lm9yZycKK3ZlcnNpb24gOgorCUAkKEVDSE8pICQoVkVSU0lPTikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBEcmFnIGluIHRoZSBidWxrIG9mIHRoZSBidWlsZCBzeXN0ZW0KKyMKKworTUFLRURFUFMJKz0gTWFrZWZpbGUuaG91c2VrZWVwaW5nCitpbmNsdWRlIE1ha2VmaWxlLmhvdXNla2VlcGluZwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvTWFrZWZpbGUuaG91c2VrZWVwaW5nIGIvZ3B4ZS9zcmMvTWFrZWZpbGUuaG91c2VrZWVwaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNWUxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9NYWtlZmlsZS5ob3VzZWtlZXBpbmcKQEAgLTAsMCArMSwxMDA0IEBACisjIC0qLSBtYWtlZmlsZSAtKi0gOiBGb3JjZSBlbWFjcyB0byB1c2UgTWFrZWZpbGUgbW9kZQorIworIyBUaGlzIGZpbGUgY29udGFpbnMgdmFyaW91cyBib3JpbmcgaG91c2VrZWVwaW5nIGZ1bmN0aW9ucyB0aGF0IHdvdWxkCisjIG90aGVyd2lzZSBzZXJpb3VzbHkgY2x1dHRlciB1cCB0aGUgbWFpbiBNYWtlZmlsZS4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBGaW5kIGEgdXNhYmxlICJlY2hvIC1lIiBzdWJzdGl0dXRlLgorIworVEFCIAkJCTo9ICQoc2hlbGwgJChQUklOVEYpICdcdCcpCitFQ0hPX0VfRUNITwkJOj0gJChFQ0hPKQorRUNIT19FX0VDSE9fRQkJOj0gJChFQ0hPKSAtZQorRUNIT19FX0JJTl9FQ0hPIAk6PSAvYmluL2VjaG8KK0VDSE9fRV9CSU5fRUNIT19FIAk6PSAvYmluL2VjaG8gLWUKK0VDSE9fRV9FQ0hPX1RBQgkJOj0gJChzaGVsbCAkKEVDSE9fRV9FQ0hPKSAnXHQnIHwgY2F0KQorRUNIT19FX0VDSE9fRV9UQUIJOj0gJChzaGVsbCAkKEVDSE9fRV9FQ0hPX0UpICdcdCcgfCBjYXQpCitFQ0hPX0VfQklOX0VDSE9fVEFCIAk6PSAkKHNoZWxsICQoRUNIT19FX0JJTl9FQ0hPKSAnXHQnKQorRUNIT19FX0JJTl9FQ0hPX0VfVEFCIAk6PSAkKHNoZWxsICQoRUNIT19FX0JJTl9FQ0hPX0UpICdcdCcpCisKK2lmZXEgKCQoRUNIT19FX0VDSE9fVEFCKSwkKFRBQikpCitFQ0hPX0UJCTo9ICQoRUNIT19FX0VDSE8pCitlbmRpZgoraWZlcSAoJChFQ0hPX0VfRUNIT19FX1RBQiksJChUQUIpKQorRUNIT19FCQk6PSAkKEVDSE9fRV9FQ0hPX0UpCitlbmRpZgoraWZlcSAoJChFQ0hPX0VfQklOX0VDSE9fVEFCKSwkKFRBQikpCitFQ0hPX0UJCTo9ICQoRUNIT19FX0JJTl9FQ0hPKQorZW5kaWYKK2lmZXEgKCQoRUNIT19FX0JJTl9FQ0hPX0VfVEFCKSwkKFRBQikpCitFQ0hPX0UJCTo9ICQoRUNIT19FX0JJTl9FQ0hPX0UpCitlbmRpZgorCisuZWNob2NoZWNrIDoKK2lmZGVmIEVDSE9fRQorCUAkKFRPVUNIKSAkQAorZWxzZQorCUAkKFBSSU5URikgJyUyNHMgOiB4JXN4XG4nICd0YWInICckKFRBQiknCisJQCQoUFJJTlRGKSAnJTI0cyA6IHglc3hcbicgJyIkKEVDSE9fRV9FQ0hPKSBcdCInIFwKKwkJCQkgICAgJyQoRUNIT19FX0VDSE9fVEFCKScKKwlAJChQUklOVEYpICclMjRzIDogeCVzeFxuJyAnIiQoRUNIT19FX0VDSE9fRSkgXHQiJyBcCisJCQkJICAgICckKEVDSE9fRV9FQ0hPX0VfVEFCKScKKwlAJChQUklOVEYpICclMjRzIDogeCVzeFxuJyAnIiQoRUNIT19FX0JJTl9FQ0hPKSBcdCInIFwKKwkJCQkgICAgJyQoRUNIT19FX0JJTl9FQ0hPX1RBQiknCisJQCQoUFJJTlRGKSAnJTI0cyA6IHglc3hcbicgJyIkKEVDSE9fRV9CSU5fRUNIT19FKSBcdCInIFwKKwkJCQkgICAgJyQoRUNIT19FX0JJTl9FQ0hPX0VfVEFCKScKKwlAJChFQ0hPKSAiTm8gdXNhYmxlIFwiZWNobyAtZVwiIHN1YnN0aXR1dGUgZm91bmQiCisJQGV4aXQgMQorZW5kaWYKK01BS0VERVBTCSs9IC5lY2hvY2hlY2sKK1ZFUllDTEVBTlVQCSs9IC5lY2hvY2hlY2sKKworZWNobyA6CisJQCQoRUNITykgIlVzaW5nIFwiJChFQ0hPX0UpXCIgZm9yIFwiZWNobyAtZVwiIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEdlbmVyYXRlIGEgdXNhYmxlICJzZXEiIHN1YnN0aXR1dGUKKyMKK2RlZmluZSBzZXEKKwkkKHNoZWxsIGF3ayAnQkVHSU4geyBmb3IgKCBpID0gJCgxKSA7IGkgPD0gJCgyKSA7IGkrKyApIHByaW50IGkgfScpCitlbmRlZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIERldGVybWluZSBob3N0IE9TCisjCitIT1NUX09TCQk6PSAkKHNoZWxsIHVuYW1lIC1zKQoraG9zdG9zIDoKKwlAJChFQ0hPKSAkKEhPU1RfT1MpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRGV0ZXJtaW5lIGNvbXBpbGVyCisKK0NDREVGUwkJOj0gJChzaGVsbCAkKENDKSAtRSAteCBjIC1jIC9kZXYvbnVsbCAtZE0gfCBjdXQgLWQiICIgLWYyKQorY2NkZWZzOgorCUAkKEVDSE8pICQoQ0NERUZTKQorCitpZmVxICgkKGZpbHRlciBfX0lDQywkKENDREVGUykpLF9fSUNDKQorQ0NUWVBFCQk6PSBpY2MKK2Vsc2UKK0NDVFlQRQkJOj0gZ2NjCitlbmRpZgorY2N0eXBlOgorCUAkKEVDSE8pICQoQ0NUWVBFKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENoZWNrIGZvciB0b29scyB0aGF0IGNhbiBjYXVzZSBmYWlsZWQgYnVpbGRzCisjCisudG9vbGNoZWNrIDoKKwlAaWYgJChDQykgLXYgMj4mMSB8IGdyZXAgLWlzICdnY2MgdmVyc2lvbiAyXC45NicgPiAvZGV2L251bGw7IHRoZW4gXAorCQkkKEVDSE8pICdnY2MgMi45NiBpcyB1bnN1aXRhYmxlIGZvciBjb21waWxpbmcgRXRoZXJib290JzsgXAorCQkkKEVDSE8pICdVc2UgZ2NjIDIuOTUgb3IgZ2NjIDMueCBpbnN0ZWFkJzsgXAorCQlleGl0IDE7IFwKKwlmaQorCUBpZiBbIGBwZXJsIC1lICd1c2UgYnl0ZXM7IHByaW50IGNocigyNTUpJyB8IHdjIC1jYCA9IDIgXTsgdGhlbiBcCisJCSQoRUNITykgJ1lvdXIgUGVybCB2ZXJzaW9uIGhhcyBhIFVuaWNvZGUgaGFuZGxpbmcgYnVnJzsgXAorCQkkKEVDSE8pICdFeGVjdXRlIHRoaXMgY29tbWFuZCBiZWZvcmUgY29tcGlsaW5nIEV0aGVyYm9vdDonOyBcCisJCSQoRUNITykgJ2V4cG9ydCBMQU5HPSQke0xBTkclLlVURi04fSc7IFwKKwkJZXhpdCAxOyBcCisJZmkKKwlAJChUT1VDSCkgJEAKK01BS0VERVBTCSs9IC50b29sY2hlY2sKK1ZFUllDTEVBTlVQCSs9IC50b29sY2hlY2sKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDaGVjayBmb3IgdmFyaW91cyB0b29sIHdvcmthcm91bmRzCisjCisKKyMgTWFrZSBzeW50YXggZG9lcyBub3QgYWxsb3cgdXNlIG9mIGNvbW1hIG9yIHNwYWNlIGluIGNlcnRhaW4gcGxhY2VzLgorIyBUaGlzIHVnbHkgd29ya2Fyb3VuZCBpcyBzdWdnZXN0ZWQgaW4gdGhlIG1hbnVhbC4KKyMKK0NPTU1BCTo9ICwKK0VNUFRZCTo9CitTUEFDRQk6PSAkKEVNUFRZKSAkKEVNUFRZKQorCisjIENoZWNrIGZvciBhbiBvbGQgdmVyc2lvbiBvZiBnYXMgKGJpbnV0aWxzIDIuOS4xKQorIworT0xER0FTCTo9ICQoc2hlbGwgJChBUykgLS12ZXJzaW9uIHwgZ3JlcCAtcSAnMlwuOVwuMScgJiYgJChFQ0hPKSAtREdBUzI5MSkKK0NGTEFHUwkrPSAkKE9MREdBUykKK29sZGdhcyA6CisJQCQoRUNITykgJChvbGRnYXMpCisKKyMgU29tZSB3aWRlc3ByZWFkIHBhdGNoZWQgdmVyc2lvbnMgb2YgZ2NjIGluY2x1ZGUgLWZzdGFjay1wcm90ZWN0b3IgYnkKKyMgZGVmYXVsdCwgZXZlbiB3aGVuIC1mZnJlZXN0YW5kaW5nIGlzIHNwZWNpZmllZC4gIFdlIHRoZXJlZm9yZSBuZWVkCisjIHRvIGRpc2FibGUgLWZzdGFjay1wcm90ZWN0b3IgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGl0LgorIworaWZlcSAoJChDQ1RZUEUpLGdjYykKK1NQX1RFU1QgPSAkKENDKSAtZm5vLXN0YWNrLXByb3RlY3RvciAteCBjIC1jIC9kZXYvbnVsbCBcCisJCS1vIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEKK1NQX0ZMQUdTIDo9ICQoc2hlbGwgJChTUF9URVNUKSAmJiAkKEVDSE8pICctZm5vLXN0YWNrLXByb3RlY3RvcicpCitDRkxBR1MJKz0gJChTUF9GTEFHUykKK2VuZGlmCisKKyMgZ2NjIDQuNCBnZW5lcmF0ZXMgLmVoX2ZyYW1lIHNlY3Rpb25zIGJ5IGRlZmF1bHQsIHdoaWNoIGRpc3RvcnQgdGhlCisjIG91dHB1dCBvZiAic2l6ZSIuICBJbmhpYml0IHRoaXMuCisjCitpZmVxICgkKENDVFlQRSksZ2NjKQorQ0ZJX1RFU1QgPSAkKENDKSAtZm5vLWR3YXJmMi1jZmktYXNtIC14IGMgLWMgL2Rldi9udWxsIFwKKwkJIC1vIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEKK0NGSV9GTEFHUyA6PSAkKHNoZWxsICQoQ0ZJX1RFU1QpICYmICQoRUNITykgJy1mbm8tZHdhcmYyLWNmaS1hc20nKQorQ0ZMQUdTCSs9ICQoQ0ZJX0ZMQUdTKQorZW5kaWYKKworIyBTb21lIHZlcnNpb25zIG9mIGdhcyBjaG9rZSBvbiBkaXZpc2lvbiBvcGVyYXRvcnMsIHRyZWF0aW5nIHRoZW0gYXMKKyMgY29tbWVudCBtYXJrZXJzLiAgU3BlY2lmeWluZyAtLWRpdmlkZSB3aWxsIHdvcmsgYXJvdW5kIHRoaXMgcHJvYmxlbSwKKyMgYnV0IGlzbid0IGF2YWlsYWJsZSBvbiBvbGRlciBnYXMgdmVyc2lvbnMuCisjCitESVZJREVfVEVTVCA9ICQoQVMpIC0tZGl2aWRlIC9kZXYvbnVsbCAtbyAvZGV2L251bGwgMj4vZGV2L251bGwKK0RJVklERV9GTEFHUyA6PSAkKHNoZWxsICQoRElWSURFX1RFU1QpICYmICQoRUNITykgJy0tZGl2aWRlJykKK0FTRkxBR1MJKz0gJChESVZJREVfRkxBR1MpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQnVpbGQgdmVyYm9zaXR5CisjCitpZmVxICgkKFYpLDEpCitRIDo9CitRTSA6PSBAXCMKK2Vsc2UKK1EgOj0gQAorUU0gOj0gQAorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTZXQgQklOIGFjY29yZGluZyB0byB3aGF0ZXZlciB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYXMKKyMgdGhlIGJ1aWxkIHRhcmdldC4KKyMKKworIyBEZXRlcm1pbmUgaG93IG1hbnkgZGlmZmVyZW50IEJJTiBkaXJlY3RvcmllcyBhcmUgbWVudGlvbmVkIGluIHRoZQorIyBtYWtlIGdvYWxzLgorIworQklOX0dPQUxTCTo9ICQoZmlsdGVyIGJpbi8lIGJpbi0lLCQoTUFLRUNNREdPQUxTKSkKK0JJTl9HT0FMX0JJTlMJOj0gJChmb3JlYWNoIEJHLCQoQklOX0dPQUxTKSwkKGZpcnN0d29yZCAkKHN1YnN0IC8sICwkKEJHKSkpKQorTlVNX0JJTlMJOj0gJCh3b3JkcyAkKHNvcnQgJChCSU5fR09BTF9CSU5TKSkpCisKK2lmZXEgKCQoTlVNX0JJTlMpLDApCisKKyMgTm8gQklOIGRpcmVjdG9yeSB3YXMgc3BlY2lmaWVkLiAgU2V0IEJJTiB0byAiYmluIiBhcyBhIHNlbnNpYmxlCisjIGRlZmF1bHQuCisKK0JJTgkJOj0gYmluCisKK2Vsc2UgIyBOVU1fQklOUyA9PSAwCisKK2lmZXEgKCQoTlVNX0JJTlMpLDEpCisKKyMgSWYgZXhhY3RseSBvbmUgQklOIGRpcmVjdG9yeSB3YXMgc3BlY2lmaWVkLCBzZXQgQklOIHRvIG1hdGNoIHRoaXMKKyMgZGlyZWN0b3J5LgorIworQklOCQk6PSAkKGZpcnN0d29yZCAkKEJJTl9HT0FMX0JJTlMpKQorCitlbHNlICMgTlVNX0JJTlMgPT0gMQorCisjIE1vcmUgdGhhbiBvbmUgQklOIGRpcmVjdG9yeSB3YXMgc3BlY2lmaWVkLiAgV2UgY2Fubm90IGhhbmRsZSB0aGUKKyMgbGF0dGVyIGNhc2Ugd2l0aGluIGEgc2luZ2xlIG1ha2UgaW52b2NhdGlvbiwgc28gc2V0IHVwIHJlY3Vyc2l2ZQorIyB0YXJnZXRzIGZvciBlYWNoIEJJTiBkaXJlY3RvcnkuCisjCisjIExlYXZlICQoQklOKSB1bmRlZmluZWQuICBUaGlzIGhhcyBpbXBsaWNhdGlvbnMgZm9yIGFueSB0YXJnZXQgdGhhdAorIyBkZXBlbmRzIG9uICQoQklOKTsgc3VjaCB0YXJnZXRzIHNob3VsZCBiZSBtYWRlIGNvbmRpdGlvbmFsIHVwb24gdGhlCisjIGV4aXN0ZW5jZSBvZiAkKEJJTikuCisjCiskKEJJTl9HT0FMUykgOiAlIDogQklOX1JFQ1VSU0UKKwkkKFEpJChNQUtFKSAtLW5vLXByaW50LWRpcmVjdG9yeSBCSU49JChmaXJzdHdvcmQgJChzdWJzdCAvLCAsJEApKSAkQAorLlBIT05ZIDogQklOX1JFQ1VSU0UKKworZW5kaWYgIyBOVU1fQklOUyA9PSAxCitlbmRpZiAjIE5VTV9CSU5TID09IDAKKworaWZkZWYgQklOCisKKyMgQ3JlYXRlICQoQklOKSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQKKyMKK2lmZXEgKCQod2lsZGNhcmQgJChCSU4pKSwpCiskKHNoZWxsICQoTUtESVIpIC1wICQoQklOKSkKK2VuZGlmCisKKyMgVGFyZ2V0IHRvIGFsbG93IGUuZy4gIm1ha2UgYmluLWVmaSBhcmNoIgorIworJChCSU4pIDoKKwlAIyBEbyBub3RoaW5nLCBzaWxlbnRseQorLlBIT05ZIDogJChCSU4pCisKKyMgUmVtb3ZlIGV2ZXJ5dGhpbmcgaW4gJChCSU4pIGZvciBhICJtYWtlIGNsZWFuIgorIworQ0xFQU5VUAkrPSAkKEJJTikvKi4qICMgQXZvaWQgcGlja2luZyB1cCBkaXJlY3RvcmllcworCitlbmRpZiAjIGRlZmluZWQoQklOKQorCisjIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGRlcGVuZGVuY3kgZmlsZXMKKyMKK05PX0RFUF9UQVJHRVRTCTo9ICQoQklOKSBjbGVhbiB2ZXJ5Y2xlYW4KK2lmZXEgKCQoTUFLRUNNREdPQUxTKSwpCitORUVEX0RFUFMJOj0gMQorZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoZmlsdGVyLW91dCAkKE5PX0RFUF9UQVJHRVRTKSwkKE1BS0VDTURHT0FMUykpKSwpCitORUVEX0RFUFMJOj0gMQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTZWxlY3QgYnVpbGQgYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSBiYXNlZCBvbiAkKEJJTikKKyMKKyMgQklOIGhhcyB0aGUgZm9ybSBiaW5bLVthcmNoLV1wbGF0Zm9ybV0KKworQVJDSFMJCTo9ICQocGF0c3Vic3QgYXJjaC8lLCUsJCh3aWxkY2FyZCBhcmNoLyopKQorUExBVEZPUk1TCTo9ICQocGF0c3Vic3QgY29uZmlnL2RlZmF1bHRzLyUuaCwlLFwKKwkJICAgICAkKHdpbGRjYXJkIGNvbmZpZy9kZWZhdWx0cy8qLmgpKQorYXJjaHMgOgorCUAkKEVDSE8pICQoQVJDSFMpCisKK3BsYXRmb3JtcyA6CisJQCQoRUNITykgJChQTEFURk9STVMpCisKK2lmZGVmIEJJTgorCisjIERldGVybWluZSBhcmNoaXRlY3R1cmUgcG9ydGlvbiBvZiAkKEJJTiksIGlmIHByZXNlbnQKK0JJTl9BUkNICTo9ICQoc3RyaXAgJChmb3JlYWNoIEEsJChBUkNIUyksXAorCQkJICAgICAkKHBhdHN1YnN0IGJpbi0kKEEpLSUsJChBKSxcCisJCQkgICAgICAgJChmaWx0ZXIgYmluLSQoQSktJSwkKEJJTikpKSkpCisKKyMgRGV0ZXJtaW5lIHBsYXRmb3JtIHBvcnRpb24gb2YgJChCSU4pLCBpZiBwcmVzZW50CitpZmVxICgkKEJJTl9BUkNIKSwpCitCSU5fUExBVEZPUk0JOj0gJChwYXRzdWJzdCBiaW4tJSwlLCQoZmlsdGVyIGJpbi0lLCQoQklOKSkpCitlbHNlCitCSU5fUExBVEZPUk0JOj0gJChwYXRzdWJzdCBiaW4tJChCSU5fQVJDSCktJSwlLCQoQklOKSkKK2VuZGlmCisKKyMgRGV0ZXJtaW5lIGJ1aWxkIGFyY2hpdGVjdHVyZQorREVGQVVMVF9BUkNICTo9IGkzODYKK0FSQ0gJCTo9ICQoZmlyc3R3b3JkICQoQklOX0FSQ0gpICQoREVGQVVMVF9BUkNIKSkKK0NGTEFHUwkJKz0gLURBUkNIPSQoQVJDSCkKK2FyY2ggOgorCUAkKEVDSE8pICQoQVJDSCkKKy5QSE9OWSA6IGFyY2gKKworIyBEZXRlcm1pbmUgYnVpbGQgcGxhdGZvcm0KK0RFRkFVTFRfUExBVEZPUk0gOj0gcGNiaW9zCitQTEFURk9STQk6PSAkKGZpcnN0d29yZCAkKEJJTl9QTEFURk9STSkgJChERUZBVUxUX1BMQVRGT1JNKSkKK0NGTEFHUwkJKz0gLURQTEFURk9STT0kKFBMQVRGT1JNKQorcGxhdGZvcm0gOgorCUAkKEVDSE8pICQoUExBVEZPUk0pCisKK2VuZGlmICMgZGVmaW5lZChCSU4pCisKKyMgSW5jbHVkZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgTWFrZWZpbGUKK2lmZGVmIEFSQ0gKK01BS0VERVBTCSs9IGFyY2gvJChBUkNIKS9NYWtlZmlsZQoraW5jbHVkZSBhcmNoLyQoQVJDSCkvTWFrZWZpbGUKK2VuZGlmCisKKyMgSW5jbHVkZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgaW5jbHVkZSBwYXRoCitpZmRlZiBBUkNICitJTkNESVJTCQkrPSBhcmNoLyQoQVJDSCkvaW5jbHVkZQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTb3VyY2UgZmlsZSBoYW5kbGluZworCisjIFNSQ0RJUlMgbGlzdHMgYWxsIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgc291cmNlIGZpbGVzLgorc3JjZGlycyA6CisJQCQoRUNITykgJChTUkNESVJTKQorCisjIFNSQ1MgbGlzdHMgYWxsIC5jIG9yIC5TIGZpbGVzIGZvdW5kIGluIGFueSBTUkNESVIKKyMKK1NSQ1MJKz0gJCh3aWxkY2FyZCAkKHBhdHN1YnN0ICUsJS8qLmMsJChTUkNESVJTKSkpCitTUkNTCSs9ICQod2lsZGNhcmQgJChwYXRzdWJzdCAlLCUvKi5TLCQoU1JDRElSUykpKQorc3JjcyA6CisJQCQoRUNITykgJChTUkNTKQorCisjIEFVVE9fU1JDUyBsaXN0cyBhbGwgZmlsZXMgaW4gU1JDUyB0aGF0IGFyZSBub3QgbWVudGlvbmVkIGluCisjIE5PTl9BVVRPX1NSQ1MuICBGaWxlcyBzaG91bGQgYmUgYWRkZWQgdG8gTk9OX0FVVE9fU1JDUyBpZiB0aGV5CisjIGNhbm5vdCBiZSBidWlsdCB1c2luZyB0aGUgc3RhbmRhcmQgYnVpbGQgdGVtcGxhdGUuCisjCitBVVRPX1NSQ1MgPSAkKGZpbHRlci1vdXQgJChOT05fQVVUT19TUkNTKSwkKFNSQ1MpKQorYXV0b3NyY3MgOgorCUAkKEVDSE8pICQoQVVUT19TUkNTKQorCisjIEp1c3QgYWJvdXQgZXZlcnl0aGluZyBlbHNlIGluIHRoaXMgc2VjdGlvbiBkZXBlbmRzIHVwb24gaGF2aW5nCisjICQoQklOKSBzZXQKKworaWZkZWYgQklOCisKKyMgSU5DRElSUyBsaXN0cyB0aGUgaW5jbHVkZSBwYXRoCitpbmNkaXJzIDoKKwlAJChFQ0hPKSAkKElOQ0RJUlMpCisKKyMgQ29tbW9uIGZsYWdzCisjCitDRkxBR1MJCSs9ICQoZm9yZWFjaCBJTkMsJChJTkNESVJTKSwtSSQoSU5DKSkKK0NGTEFHUwkJKz0gLU9zCitDRkxBR1MJCSs9IC1nCitpZmVxICgkKENDVFlQRSksZ2NjKQorQ0ZMQUdTCQkrPSAtZmZyZWVzdGFuZGluZworQ0ZMQUdTCQkrPSAtV2FsbCAtVyAtV2Zvcm1hdC1ub25saXRlcmFsCitlbmRpZgoraWZlcSAoJChDQ1RZUEUpLGljYykKK0NGTEFHUwkJKz0gLWZuby1idWlsdGluCitDRkxBR1MJCSs9IC1uby1pcAorQ0ZMQUdTCQkrPSAtbm8tZ2NjCitDRkxBR1MJCSs9IC1kaWFnLWRpc2FibGUgMTExICMgVW5yZWFjaGFibGUgY29kZQorQ0ZMQUdTCQkrPSAtZGlhZy1kaXNhYmxlIDEyOCAjIFVucmVhY2hhYmxlIGxvb3AKK0NGTEFHUwkJKz0gLWRpYWctZGlzYWJsZSAxNzAgIyBBcnJheSBib3VuZGFyeSBjaGVja3MKK0NGTEFHUwkJKz0gLWRpYWctZGlzYWJsZSAxNzcgIyBVbnVzZWQgZnVuY3Rpb25zCitDRkxBR1MJCSs9IC1kaWFnLWRpc2FibGUgMTgxICMgcHJpbnRmKCkgZm9ybWF0IGNoZWNrcworQ0ZMQUdTCQkrPSAtZGlhZy1kaXNhYmxlIDE4OCAjIGVudW0gc3RyaWN0bmVzcworQ0ZMQUdTCQkrPSAtZGlhZy1kaXNhYmxlIDE5MyAjIFVuZGVmaW5lZCBwcmVwcm9jZXNzb3IgaWRlbnRpZmllcnMKK0NGTEFHUwkJKz0gLWRpYWctZGlzYWJsZSAyODAgIyBzd2l0Y2ggKCBjb25zdGFudCApCitDRkxBR1MJCSs9IC1kaWFnLWRpc2FibGUgMzEwICMgSyZSIHBhcmFtZXRlciBsaXN0cworQ0ZMQUdTCQkrPSAtZGlhZy1kaXNhYmxlIDQyNCAjIEV4dHJhIHNlbWljb2xvbgorQ0ZMQUdTCQkrPSAtZGlhZy1kaXNhYmxlIDU4OSAjIERlY2xhcmF0aW9ucyBtaWQtY29kZQorQ0ZMQUdTCQkrPSAtZGlhZy1kaXNhYmxlIDU5MyAjIFVudXNlZCB2YXJpYWJsZXMKK0NGTEFHUwkJKz0gLWRpYWctZGlzYWJsZSA4MTAgIyBDYXN0aW5nIGludHMgdG8gc21hbGxlciBpbnRzCitDRkxBR1MJCSs9IC1kaWFnLWRpc2FibGUgOTgxICMgU2VxdWVuY2UgcG9pbnQgdmlvbGF0aW9ucworQ0ZMQUdTCQkrPSAtZGlhZy1kaXNhYmxlIDEyOTIgIyBJZ25vcmVkIGF0dHJpYnV0ZXMKK0NGTEFHUwkJKz0gLWRpYWctZGlzYWJsZSAxMzM4ICMgdm9pZCBwb2ludGVyIGFyaXRobWV0aWMKK0NGTEFHUwkJKz0gLWRpYWctZGlzYWJsZSAxMzYxICMgVmFyaWFibGUtbGVuZ3RoIGFycmF5cworQ0ZMQUdTCQkrPSAtZGlhZy1kaXNhYmxlIDE0MTggIyBNaXNzaW5nIHByb3RvdHlwZXMKK0NGTEFHUwkJKz0gLWRpYWctZGlzYWJsZSAxNDE5ICMgTWlzc2luZyBwcm90b3R5cGVzCitDRkxBR1MJCSs9IC1kaWFnLWRpc2FibGUgMTU5OSAjIEhpZGRlbiB2YXJpYWJsZXMKK0NGTEFHUwkJKz0gLVdhbGwgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucworZW5kaWYKK0NGTEFHUwkJKz0gJChFWFRSQV9DRkxBR1MpCitBU0ZMQUdTCQkrPSAkKEVYVFJBX0FTRkxBR1MpCitMREZMQUdTCQkrPSAkKEVYVFJBX0xERkxBR1MpCisKKyMgSW5oaWJpdCAtV2Vycm9yIGlmIE5PX1dFUlJPUiBpcyBzcGVjaWZpZWQgb24gbWFrZSBjb21tYW5kIGxpbmUKKyMKK2lmbmVxICgkKE5PX1dFUlJPUiksMSkKK0NGTEFHUwkJKz0gLVdlcnJvcgorQVNGTEFHUwkJKz0gLS1mYXRhbC13YXJuaW5ncworZW5kaWYKKworIyBjb21waWxlci5oIGlzIG5lZWRlZCBmb3Igb3VyIGxpbmtpbmcgYW5kIGRlYnVnZ2luZyBzeXN0ZW0KKyMKK0NGTEFHUwkJKz0gLWluY2x1ZGUgY29tcGlsZXIuaAorCisjIENGTEFHUyBmb3Igc3BlY2lmaWMgb2JqZWN0IHR5cGVzCisjCitDRkxBR1NfYwkrPQorQ0ZMQUdTX1MgCSs9IC1EQVNTRU1CTFkKKworIyBCYXNlIG9iamVjdCBuYW1lIG9mIHRoZSBjdXJyZW50IHRhcmdldAorIworT0JKRUNUCQk9ICQoZmlyc3R3b3JkICQoc3Vic3QgLiwgLCQoQEYpKSkKKworIyBDRkxBR1MgZm9yIHNwZWNpZmljIG9iamVjdCBmaWxlcy4gIFlvdSBjYW4gZGVmaW5lCisjIGUuZy4gQ0ZMQUdTX3J0bDgxMzksIGFuZCBoYXZlIHRob3NlIGZsYWdzIGF1dG9tYXRpY2FsbHkgdXNlZCB3aGVuCisjIGNvbXBpbGluZyBiaW4vcnRsODEzOS5vLgorIworT0JKX0NGTEFHUwk9ICQoQ0ZMQUdTXyQoT0JKRUNUKSkgLURPQkpFQ1Q9JChzdWJzdCAtLF8sJChPQkpFQ1QpKQorJChCSU4pLyUuZmxhZ3MgOgorCUAkKEVDSE8pICQoT0JKX0NGTEFHUykKKworIyBJQ0MgcmVxdWlyZXMgcG9zdHByb2Nlc3Npbmcgb2JqZWN0cyB0byBmaXggdXAgdGFibGUgYWxpZ25tZW50cworIworaWZlcSAoJChDQ1RZUEUpLGljYykKK1BPU1RfTwkJPSAmJiAkKElDQ0ZJWCkgJEAKK1BPU1RfT19ERVBTCTo9ICQoSUNDRklYKQorZWxzZQorUE9TVF9PCQk6PQorUE9TVF9PX0RFUFMJOj0KK2VuZGlmCisKKyMgUnVsZXMgZm9yIHNwZWNpZmljIG9iamVjdCB0eXBlcy4KKyMKK0NPTVBJTEVfYwk9ICQoQ0MpICQoQ0ZMQUdTKSAkKENGTEFHU19jKSAkKE9CSl9DRkxBR1MpCitSVUxFX2MJCT0gJChRKSQoQ09NUElMRV9jKSAtYyAkPCAtbyAkQCAkKFBPU1RfTykKK1JVTEVfY190b19kYmclLm8gPSAkKFEpJChDT01QSUxFX2MpIC1EZGVidWdfJChzdWJzdCAtLF8sJChPQkpFQ1QpKT0kKiAtYyAkPCAtbyAkQCAkKFBPU1RfTykKK1JVTEVfY190b19jCT0gJChRKSQoQ09NUElMRV9jKSAtRSAtYyAkPCA+ICRACitSVUxFX2NfdG9fcwk9ICQoUSkkKENPTVBJTEVfYykgLVMgLWcwIC1jICQ8IC1vICRACisKK1BSRVBST0NFU1NfUwk9ICQoQ1BQKSAkKENGTEFHUykgJChDRkxBR1NfUykgJChPQkpfQ0ZMQUdTKQorQVNTRU1CTEVfUwk9ICQoQVMpICQoQVNGTEFHUykKK1JVTEVfUwkJPSAkKFEpJChQUkVQUk9DRVNTX1MpICQ8IHwgJChBU1NFTUJMRV9TKSAtbyAkQAorUlVMRV9TX3RvX3MJPSAkKFEpJChQUkVQUk9DRVNTX1MpICQ8ID4gJEAKKworREVCVUdfVEFSR0VUUwkrPSBkYmclLm8gYyBzCisKKyMgV2UgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBydWxlcyBmb3IgYW55IGZpbGUgbWVudGlvbmVkIGluIEFVVE9fU1JDUworIyB1c2luZyB0aGUgZm9sbG93aW5nIHNldCBvZiB0ZW1wbGF0ZXMuICBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvIHVzZQorIyAkKGV2YWwgLi4uKSwgYnV0IHRoaXMgZnVuY3Rpb24gZXhpc3RzIG9ubHkgaW4gR05VIG1ha2UgPj0gMy44MC4KKworIyBzcmNfdGVtcGxhdGUgOiBnZW5lcmF0ZSBNYWtlZmlsZSBydWxlcyBmb3IgYSBnaXZlbiBzb3VyY2UgZmlsZQorIworIyAkKDEpIGlzIHRoZSBmdWxsIHBhdGggdG8gdGhlIHNvdXJjZSBmaWxlIChlLmcuICJkcml2ZXJzL25ldC9ydGw4MTM5LmMiKQorIyAkKDIpIGlzIHRoZSBmdWxsIHBhdGggdG8gdGhlIC5kIGZpbGUgKGUuZy4gImJpbi9kZXBzL2RyaXZlcnMvbmV0L3J0bDgxMzkuZCIpCisjICQoMykgaXMgdGhlIHNvdXJjZSB0eXBlIChlLmcuICJjIikKKyMgJCg0KSBpcyB0aGUgc291cmNlIGJhc2UgbmFtZSAoZS5nLiAicnRsODEzOSIpCisjCitkZWZpbmUgc3JjX3RlbXBsYXRlCisKKwlAJChFQ0hPKSAiICBbREVQU10gJCgxKSIKKwlAJChNS0RJUikgLXAgJChkaXIgJCgyKSkKKwlAJChSTSkgJCgyKQorCUAkKFRPVUNIKSAkKDIpCisJQCQoQ1BQKSAkKENGTEFHUykgJChDRkxBR1NfJCgzKSkgJChDRkxBR1NfJCg0KSkgLURPQkpFQ1Q9JCg0KSBcCisJCS1Xbm8tZXJyb3IgLU1NICQoMSkgLU1HIC1NUCB8IFwKKwkJc2VkICdzL1wub1xzKjovX0RFUFMgPS8nID4+ICQoMikKKwlAJChFQ0hPX0UpICdcbiQkKEJJTikvJCg0KS5vIDonIFwKKwkJICckKDEpICQkKE1BS0VERVBTKSAkJChQT1NUX09fREVQUykgJCQoJCg0KV9ERVBTKScgXAorCQkgJ1xuXHQkJChRTSkkKEVDSE8pICIgIFtCVUlMRF0gJCRAIicgXAorCQkgJ1xuXHQkJChSVUxFXyQoMykpXG4nIFwKKwkJICdcbkJPQkpTICs9ICQkKEJJTikvJCg0KS5vXG4nIFwKKwkJICQoZm9yZWFjaCBUR1QsJChERUJVR19UQVJHRVRTKSwgXAorCQkgICAgJChpZiAkKFJVTEVfJCgzKV90b18kKFRHVCkpLCBcCisJCSAgICAnXG4kJChCSU4pLyQoNCkuJChUR1QpIDonIFwKKwkJICAgICckKDEpICQkKE1BS0VERVBTKSAkJChQT1NUX09fREVQUykgJCQoJCg0KV9ERVBTKScgXAorCQkgICAgJ1xuXHQkJChRTSkkKEVDSE8pICIgIFtCVUlMRF0gJCRAIicgXAorCQkgICAgJ1xuXHQkJChSVUxFXyQoMylfdG9fJChUR1QpKVxuJyBcCisJCSAgICAnXG4kKFRHVClfT0JKUyArPSAkJChCSU4pLyQoNCkuJChUR1QpXG4nICkgKSBcCisJCSAnXG4kKDIpIDogJCQoJCg0KV9ERVBTKVxuJyBcCisJCSAnXG5UQUdTIDogJCQoJCg0KV9ERVBTKVxuJyBcCisJCT4+ICQoMikKKwlAJChQQVJTRVJPTSkgJCgxKSA+PiAkKDIpCisKK2VuZGVmCisKKyMgUnVsZSB0byBnZW5lcmF0ZSB0aGUgTWFrZWZpbGUgcnVsZXMgZmlsZXMgdG8gYmUgaW5jbHVkZWQKKyMKKyQoQklOKS9kZXBzLyUuZCA6ICUgJChNQUtFREVQUykgJChQQVJTRVJPTSkKKwkkKGlmICQoZmlsdGVyICQoQVVUT19TUkNTKSwkPCksJChjYWxsIHNyY190ZW1wbGF0ZSwkPCwkQCwkKHN1YnN0IC4sLCQoc3VmZml4ICQ8KSksJChiYXNlbmFtZSAkKG5vdGRpciAkPCkpKSxAJChFQ0hPKSAnRVJST1I6ICQ8IGlzIG5vdCBhbiBBVVRPX1NSQycgOyBleGl0IDEpCisKKyMgQ2FsY3VsYXRlIGFuZCBpbmNsdWRlIHRoZSBsaXN0IG9mIE1ha2VmaWxlIHJ1bGVzIGZpbGVzCisjCitBVVRPX0RFUFMJPSAkKHBhdHN1YnN0ICUsJChCSU4pL2RlcHMvJS5kLCQoQVVUT19TUkNTKSkKK2lmZGVmIE5FRURfREVQUworaWZuZXEgKCQoQVVUT19ERVBTKSwpCistaW5jbHVkZSAkKEFVVE9fREVQUykKK2VuZGlmCitlbmRpZgorYXV0b2RlcHMgOgorCUAkKEVDSE8pICQoQVVUT19ERVBTKQorVkVSWUNMRUFOVVAJKz0gJChCSU4pL2RlcHMKKworIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgY3JlYXRlZCBieSB0aGUgTWFrZWZpbGUgcnVsZXMgZmlsZXMKKyMKK2JvYmpzIDoKKwlAJChFQ0hPKSAkKEJPQkpTKQorZHJpdmVycyA6CisJQCQoRUNITykgJChEUklWRVJTKQorLlBIT05ZIDogZHJpdmVycworcm9tcyA6CisJQCQoRUNITykgJChST01TKQorCisjIExpc3Qgb2YgZW1iZWRkZWQgaW1hZ2VzIGluY2x1ZGVkIGluIHRoZSBsYXN0IGJ1aWxkIG9mIGVtYmVkZGVkLm8uCisjIFRoaXMgaXMgbmVlZGVkIGluIG9yZGVyIHRvIGNvcnJlY3RseSByZWJ1aWxkIGVtYmVkZGVkLm8gd2hlbmV2ZXIgdGhlCisjIGxpc3Qgb2Ygb2JqZWN0cyBjaGFuZ2VzLgorIworRU1CRURERURfTElTVAk6PSAkKEJJTikvLmVtYmVkZGVkLmxpc3QKK2lmZXEgKCQod2lsZGNhcmQgJChFTUJFRERFRF9MSVNUKSksKQorRU1CRURERURfTElTVF9JTUFHRSA6PSA8aW52YWxpZD4KK2Vsc2UKK0VNQkVEREVEX0xJU1RfSU1BR0UgOj0gJChzaGVsbCBjYXQgJChFTUJFRERFRF9MSVNUKSkKK2VuZGlmCitpZm5lcSAoJChFTUJFRERFRF9MSVNUX0lNQUdFKSwkKEVNQkVEREVEX0lNQUdFKSkKKyQoc2hlbGwgJChFQ0hPKSAiJChFTUJFRERFRF9JTUFHRSkiID4gJChFTUJFRERFRF9MSVNUKSkKK2VuZGlmCisKKyQoRU1CRURERURfTElTVCkgOgorCitWRVJZQ0xFQU5VUAkrPSAkKEVNQkVEREVEX0xJU1QpCisKK0VNQkVEREVEX0ZJTEVTCTo9ICQoc3Vic3QgJChDT01NQSksICwkKEVNQkVEREVEX0lNQUdFKSkKK0VNQkVEX0FMTAk6PSAkKGZvcmVhY2ggaSwkKGNhbGwgc2VxLDEsJCh3b3JkcyAkKEVNQkVEREVEX0ZJTEVTKSkpLFwKKwkJICAgICBFTUJFRCAoICQoaSksIFwiJCh3b3JkICQoaSksICQoRU1CRURERURfRklMRVMpKVwiLFwKKwkJCSAgICAgXCIkKG5vdGRpciAkKHdvcmQgJChpKSwkKEVNQkVEREVEX0ZJTEVTKSkpXCIgKSkKKworJChCSU4pL2VtYmVkZGVkLm8gOiAkKEVNQkVEREVEX0ZJTEVTKSAkKEVNQkVEREVEX0xJU1QpCitDRkxBR1NfZW1iZWRkZWQgPSAtREVNQkVEX0FMTD0iJChFTUJFRF9BTEwpIgorCisjIEdlbmVyYXRlIHRoZSBOSUMgZmlsZSBmcm9tIHRoZSBwYXJzZWQgc291cmNlIGZpbGVzLiAgVGhlIE5JQyBmaWxlIGlzCisjIG9ubHkgZm9yIHJvbS1vLW1hdGljLgorIworJChCSU4pL05JQyA6ICQoQVVUT19ERVBTKQorCUAkKEVDSE8pICcjIFRoaXMgaXMgYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZSwgZG8gbm90IGVkaXQnID4gJEAKKwlAJChFQ0hPKSAnIyBJdCBkb2VzIG5vdCBhZmZlY3QgYW55dGhpbmcgaW4gdGhlIGJ1aWxkLCAnIFwKKwkgICAgICdpdCBpcyBvbmx5IGZvciByb20tby1tYXRpYycgPj4gJEAKKwlAJChFQ0hPKSA+PiAkQAorCUBwZXJsIC1uZSAnY2hvbXA7IHByaW50ICIkJDFcbiIgaWYgL1wjIE5JQ1x0KC4qKSQkLycgJF4gPj4gJEAKK0NMRUFOVVAJCSs9ICQoQklOKS9OSUMJIyBEb2Vzbid0IG1hdGNoIHRoZSAkKEJJTikvKi4qIHBhdHRlcm4KKworIyBBbmFseXNlIGEgdGFyZ2V0IG5hbWUgKGUuZy4gImJpbi9kZmU1MzgtLXByaXNtMl9wY2kuenJvbS50bXAiKSBhbmQKKyMgZGVyaXZlIHRoZSB2YXJpYWJsZXM6CisjIAorIyBUR1RfRUxFTUVOVFMgOiB0aGUgZWxlbWVudHMgb2YgdGhlIHRhcmdldCAoZS5nLiAiZGZlNTM4IHByaXNtMl9wY2kiKQorIyBUR1RfUFJFRklYICAgOiB0aGUgcHJlZml4IHR5cGUgKGUuZy4gInpyb20iKQorIyBUR1RfRFJJVkVSUyAgOiB0aGUgZHJpdmVyIGZvciBlYWNoIGVsZW1lbnQgKGUuZy4gInJ0bDgxMzkgcHJpc20yX3BjaSIpCisjIFRHVF9ST01fTkFNRSA6IHRoZSBST00gbmFtZSAoZS5nLiAiZGZlNTM4IikKKyMgVEdUX01FRElBICAgIDogdGhlIG1lZGlhIHR5cGUgKGUuZy4gInJvbSIpCisjCitEUklWRVJTX2dweGUJPSAkKERSSVZFUlMpCitDQVJEX0RSSVZFUgk9ICQoZmlyc3R3b3JkICQoRFJJVkVSXyQoMSkpICQoMSkpCitUR1RfRUxFTUVOVFMJPSAkKHN1YnN0IC0tLCAsJChmaXJzdHdvcmQgJChzdWJzdCAuLCAsJChub3RkaXIgJEApKSkpCitUR1RfUFJFRklYCT0gJCh3b3JkIDIsJChzdWJzdCAuLCAsJChub3RkaXIgJEApKSkKK1RHVF9ST01fTkFNRQk9ICQoZmlyc3R3b3JkICQoVEdUX0VMRU1FTlRTKSkKK1RHVF9EUklWRVJTCT0gJChzdHJpcCAkKGlmICQoRFJJVkVSU18kKFRHVF9ST01fTkFNRSkpLCBcCisJCQkgICAgICAgJChEUklWRVJTXyQoVEdUX1JPTV9OQU1FKSksIFwKKwkJCSAgICAgICAkKGZvcmVhY2ggVEdUX0VMRU1FTlQsJChUR1RfRUxFTUVOVFMpLCBcCisJCQkgICAgICAgICAkKGNhbGwgQ0FSRF9EUklWRVIsJChUR1RfRUxFTUVOVCkpKSApKQorVEdUX01FRElBCT0gJChzdWJzdCB6LCwkKFRHVF9QUkVGSVgpKQorCisjIExvb2sgdXAgUk9NIElEcyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0CisjIChlLmcuICJiaW4vZGZlNTM4LS1wcmlzbTJfcGNpLnpyb20udG1wIikgYW5kIGRlcml2ZSB0aGUgdmFyaWFibGVzOgorIworIyBUR1RfUENJX1ZFTkRPUiA6IHRoZSBQQ0kgdmVuZG9yIElEIChlLmcuICIweDExODYiKQorIyBUR1RfUENJX0RFVklDRSA6IHRoZSBQQ0kgZGV2aWNlIElEIChlLmcuICIweDEzMDAiKQorIworVEdUX1BDSV9WRU5ET1IJPSAkKFBDSV9WRU5ET1JfJChUR1RfUk9NX05BTUUpKQorVEdUX1BDSV9ERVZJQ0UJPSAkKFBDSV9ERVZJQ0VfJChUR1RfUk9NX05BTUUpKQorCisjIENhbGN1bGF0ZSBsaW5rLXRpbWUgb3B0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0CisjIChlLmcuICJiaW4vZGZlNTM4LS1wcmlzbTJfcGNpLnpyb20udG1wIikgYW5kIGRlcml2ZSB0aGUgdmFyaWFibGVzOgorIworIyBUR1RfTERfRFJJVkVSUyA6IHN5bWJvbHMgdG8gcmVxdWlyZSBpbiBvcmRlciB0byBkcmFnIGluIHRoZSByZWxldmFudCBkcml2ZXJzCisjCQkgICAoZS5nLiAib2JqX3J0bDgxMzkgb2JqX3ByaXNtMl9wY2kiKQorIyBUR1RfTERfSURTIDogICAgIHN5bWJvbHMgdG8gZGVmaW5lIGluIG9yZGVyIHRvIGZpbGwgaW4gSUQgc3RydWN0dXJlcyBpbiB0aGUKKyMJCSAgIFJPTSBoZWFkZXIgKGUuZy4icGNpX3ZlbmRvcl9pZD0weDExODYgcGNpX2RldmljZV9pZD0weDEzMDAiKQorIworVEdUX0xEX0RSSVZFUlMJPSAkKHN1YnN0IC0sXywkKHBhdHN1YnN0ICUsb2JqXyUsJChUR1RfRFJJVkVSUykpKQorVEdUX0xEX1BSRUZJWAk9IG9ial8kKFRHVF9QUkVGSVgpcHJlZml4CitUR1RfTERfSURTCT0gcGNpX3ZlbmRvcl9pZD0kKGZpcnN0d29yZCAkKFRHVF9QQ0lfVkVORE9SKSAwKSBcCisJCSAgcGNpX2RldmljZV9pZD0kKGZpcnN0d29yZCAkKFRHVF9QQ0lfREVWSUNFKSAwKQorCisjIENhbGN1bGF0ZSBsaW5rZXIgZmxhZ3MgYmFzZWQgb24gbGluay10aW1lIG9wdGlvbnMgZm9yIHRoZSBjdXJyZW50CisjIHRhcmdldCB0eXBlIChlLmcuICJiaW4vZGZlNTM4LS1wcmlzbTJfcGNpLnpyb20udG1wIikgYW5kIGRlcml2ZSB0aGUKKyMgdmFyaWFibGVzOgorIworIyBUR1RfTERfRkxBR1MgOiB0YXJnZXQtc3BlY2lmaWMgZmxhZ3MgdG8gcGFzcyB0byBsaW5rZXIgKGUuZy4KKyMJCSAiLXUgb2JqX3pwY2lwcmVmaXggLXUgb2JqX3J0bDgxMzkgLXUgb2JqX3ByaXNtMl9wY2kKKyMJCSAgLS1kZWZzeW0gcGNpX3ZlbmRvcj0weDExODYgLS1kZWZzeW0gcGNpX2RldmljZT0weDEzMDAiKQorIworVEdUX0xEX0ZMQUdTCT0gJChmb3JlYWNoIFNZTSwkKFRHVF9MRF9QUkVGSVgpICQoVEdUX0xEX0RSSVZFUlMpIG9ial9jb25maWcsXAorCQkgICAgLXUgJChTWU0pIC0tZGVmc3ltIGNoZWNrXyQoU1lNKT0kKFNZTSkgKSBcCisJCSAgJChwYXRzdWJzdCAlLC0tZGVmc3ltICUsJChUR1RfTERfSURTKSkKKworIyBDYWxjdWxhdGUgbWFrZXJvbSBmbGFncyBmb3IgdGhlIHNwZWNpZmljIHRhcmdldAorIyAoZS5nLiAiYmluL2RmZTUzOC0tcHJpc20yX3BjaS56cm9tLnRtcCIpIGFuZCBkZXJpdmUgdGhlIHZhcmlhYmxlczoKKyMKKyMgVEdUX01BS0VST01fRkxBR1MgOiB0YXJnZXQtc3BlY2lmaWMgZmxhZ3MgZm9yIG1ha2Vyb20gKGUuZy4KKyMJCSAgICAgICItcCAweDExODYsMHgxMzAwIikKKyMKK1RHVF9NQUtFUk9NX0ZMQUdTID0gJChzdHJpcCAkKE1BS0VST01fRkxBR1NfJChUR1RfUk9NX05BTUUpKSBcCisgICAgICAgJChpZiAkKFRHVF9QQ0lfVkVORE9SKSwkKHN0cmlwIC1wICQoVEdUX1BDSV9WRU5ET1IpLCQoVEdUX1BDSV9ERVZJQ0UpKSkpCisKKyMgQ2FsY3VsYXRlIGxpc3Qgb2YgZGVidWdnaW5nIHZlcnNpb25zIG9mIG9iamVjdHMgdG8gYmUgaW5jbHVkZWQgaW4KKyMgdGhlIHRhcmdldC4KKyMKK0RFQlVHX0xJU1QJPSAkKHN1YnN0ICQoQ09NTUEpLCAsJChERUJVRykpCitERUJVR19PQkpfTEVWRUwJPSAkKGZpcnN0d29yZCAkKHdvcmQgMiwkKHN1YnN0IDosICwkKDEpKSkgMSkKK0RFQlVHX09CSl9CQVNFCT0gJCh3b3JkIDEsJChzdWJzdCA6LCAsJCgxKSkpLmRiZyQoY2FsbCBERUJVR19PQkpfTEVWRUwsJCgxKSkKK0RFQlVHX09CSgk9ICQoQklOKS8kKGNhbGwgREVCVUdfT0JKX0JBU0UsJCgxKSkubworREVCVUdfT1JJR19PQkoJPSAkKEJJTikvJCh3b3JkIDEsJChzdWJzdCA6LCAsJCgxKSkpLm8KK0RFQlVHX09CSlMJPSAkKGZvcmVhY2ggRCwkKERFQlVHX0xJU1QpLCQoY2FsbCBERUJVR19PQkosJChEKSkpCitERUJVR19PUklHX09CSlMJPSAkKGZvcmVhY2ggRCwkKERFQlVHX0xJU1QpLCQoY2FsbCBERUJVR19PUklHX09CSiwkKEQpKSkKK0JMSUJfT0JKUwk9ICQoREVCVUdfT0JKUykgJChmaWx0ZXItb3V0ICQoREVCVUdfT1JJR19PQkpTKSwkKEJPQkpTKSkKKworIyBQcmludCBvdXQgYWxsIGRlcml2ZWQgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gdGFyZ2V0LgorIworJChCSU4pLyUuaW5mbyA6CisJQCQoRUNITykgJ0VsZW1lbnRzICAgICAgICAgICAgIDogJChUR1RfRUxFTUVOVFMpJworCUAkKEVDSE8pICdQcmVmaXggICAgICAgICAgICAgICA6ICQoVEdUX1BSRUZJWCknCisJQCQoRUNITykgJ0RyaXZlcnMgICAgICAgICAgICAgIDogJChUR1RfRFJJVkVSUyknCisJQCQoRUNITykgJ1JPTSBuYW1lICAgICAgICAgICAgIDogJChUR1RfUk9NX05BTUUpJworCUAkKEVDSE8pICdNZWRpYSAgICAgICAgICAgICAgICA6ICQoVEdUX01FRElBKScKKwlAJChFQ0hPKQorCUAkKEVDSE8pICdQQ0kgdmVuZG9yICAgICAgICAgICA6ICQoVEdUX1BDSV9WRU5ET1IpJworCUAkKEVDSE8pICdQQ0kgZGV2aWNlICAgICAgICAgICA6ICQoVEdUX1BDSV9ERVZJQ0UpJworCUAkKEVDSE8pCisJQCQoRUNITykgJ0xEIGRyaXZlciBzeW1ib2xzICAgIDogJChUR1RfTERfRFJJVkVSUyknCisJQCQoRUNITykgJ0xEIHByZWZpeCBzeW1ib2xzICAgIDogJChUR1RfTERfUFJFRklYKScKKwlAJChFQ0hPKSAnTEQgSUQgc3ltYm9scyAgICAgICAgOiAkKFRHVF9MRF9JRFMpJworCUAkKEVDSE8pCisJQCQoRUNITykgJ0xEIHRhcmdldCBmbGFncyAgICAgIDogJChUR1RfTERfRkxBR1MpJworCUAkKEVDSE8pCisJQCQoRUNITykgJ21ha2Vyb20gdGFyZ2V0IGZsYWdzIDogJChUR1RfTUFLRVJPTV9GTEFHUyknCisJQCQoRUNITykKKwlAJChFQ0hPKSAnRGVidWdnaW5nIG9iamVjdHMgICAgOiAkKERFQlVHX09CSlMpJworCUAkKEVDSE8pICdSZXBsYWNlZCBvYmplY3RzICAgICA6ICQoREVCVUdfT1JJR19PQkpTKScKKworIyBMaXN0IG9mIG9iamVjdHMgaW5jbHVkZWQgaW4gdGhlIGxhc3QgYnVpbGQgb2YgYmxpYi4gIFRoaXMgaXMgbmVlZGVkCisjIGluIG9yZGVyIHRvIGNvcnJlY3RseSByZWJ1aWxkIGJsaWIgd2hlbmV2ZXIgdGhlIGxpc3Qgb2Ygb2JqZWN0cworIyBjaGFuZ2VzLgorIworQkxJQl9MSVNUCTo9ICQoQklOKS8uYmxpYi5saXN0CitpZmVxICgkKHdpbGRjYXJkICQoQkxJQl9MSVNUKSksKQorQkxJQl9MSVNUX09CSlMJOj0gPGludmFsaWQ+CitlbHNlCitCTElCX0xJU1RfT0JKUwk6PSAkKHNoZWxsIGNhdCAkKEJMSUJfTElTVCkpCitlbmRpZgoraWZuZXEgKCQoQkxJQl9MSVNUX09CSlMpLCQoQkxJQl9PQkpTKSkKKyQoc2hlbGwgJChFQ0hPKSAiJChCTElCX09CSlMpIiA+ICQoQkxJQl9MSVNUKSkKK2VuZGlmCisKKyQoQkxJQl9MSVNUKSA6CisKK1ZFUllDTEVBTlVQCSs9ICQoQkxJQl9MSVNUKQorCisjIExpYnJhcnkgb2YgYWxsIG9iamVjdHMKKyMKK0JMSUIJCT0gJChCSU4pL2JsaWIuYQorJChCTElCKSA6ICQoQkxJQl9PQkpTKSAkKEJMSUJfTElTVCkgJChNQUtFREVQUykKKwkkKFEpJChSTSkgJChCTElCKQorCSQoUU0pJChFQ0hPKSAiICBbQVJdICRAIgorCSQoUSkkKEFSKSByICRAICQoQkxJQl9PQkpTKQorCSQoUSkkKFJBTkxJQikgJEAKK2JsaWIgOiAkKEJMSUIpCisKKyMgQnVpbGQgYW4gaW50ZXJtZWRpYXRlIG9iamVjdCBmaWxlIGZyb20gdGhlIG9iamVjdHMgcmVxdWlyZWQgZm9yIHRoZQorIyBzcGVjaWZpZWQgdGFyZ2V0LgorIworJChCSU4pLyUudG1wIDogJChCTElCKSAkKE1BS0VERVBTKSAkKExEU0NSSVBUKSAKKwkkKFFNKSQoRUNITykgIiAgW0xEXSAkQCIKKwkkKFEpJChMRCkgJChMREZMQUdTKSAtVCAkKExEU0NSSVBUKSAkKFRHVF9MRF9GTEFHUykgJChCTElCKSAtbyAkQCBcCisJCS1NYXAgJChCSU4pLyQqLnRtcC5tYXAKKwkkKFEpJChPQkpEVU1QKSAtaHQgJEAgfCAkKFNPUlRPQkpEVU1QKSA+PiAkKEJJTikvJCoudG1wLm1hcAorCisjIEtlZXAgaW50ZXJtZWRpYXRlIG9iamVjdCBmaWxlICh1c2VmdWwgZm9yIGRlYnVnZ2luZykKKy5QUkVDSU9VUyA6ICQoQklOKS8lLnRtcAorCisjIFNob3cgYSBsaW5rZXIgbWFwIGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldAorIworJChCSU4pLyUubWFwIDogJChCSU4pLyUudG1wCisJQGxlc3MgJChCSU4pLyQqLnRtcC5tYXAKKworIyBHZXQgb2JqZWN0cyBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldAorIworZGVmaW5lIG9ianNfbGlzdAorCSQoc29ydCAkKGZvcmVhY2ggT0JKX1NZTUJPTCxcCisJCSAkKGZpbHRlciBvYmpfJSwkKHNoZWxsICQoTk0pICQoMSkgfCBjdXQgLWQiICIgLWYzKSksXAorCQkgJChwYXRzdWJzdCBvYmpfJSwlLCQoT0JKX1NZTUJPTCkpKSkKK2VuZGVmCiskKEJJTikvJS5vYmpzIDogJChCSU4pLyUudG1wCisJJChRKSQoRUNITykgJChjYWxsIG9ianNfbGlzdCwkPCkKKyQoQklOKS8lLnNpemVzIDogJChCSU4pLyUudG1wCisJJChRKSQoU0laRSkgLXQgJChmb3JlYWNoIE9CSiwkKGNhbGwgb2Jqc19saXN0LCQ8KSwkKHdpbGRjYXJkICQoQklOKS8kKHN1YnN0IF8sPywkKE9CSikpLm8pKSB8IFwKKwkJc29ydCAtZworCisjIEdldCBkZXBlbmRlbmN5IGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgdGFyZ2V0CisjCitkZWZpbmUgZGVwc19saXN0CisJJChzb3J0ICQoZm9yZWFjaCBPQkosJChjYWxsIG9ianNfbGlzdCwkKDEpKSwkKCQoT0JKKV9ERVBTKSkpCitlbmRlZgorJChCSU4pLyUuZGVwcyA6ICQoQklOKS8lLnRtcAorCSQoUSkkKEVDSE8pICQoY2FsbCBkZXBzX2xpc3QsJDwpCisKKyMgR2V0IHVubmVlZGVkIHNvdXJjZSBmaWxlcyBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQKKyMKK2RlZmluZSBub2RlcHNfbGlzdAorCSQoc29ydCAkKGZpbHRlci1vdXQgJChjYWxsIGRlcHNfbGlzdCwkKDEpKSxcCisJCSAkKGZvcmVhY2ggQk9CSiwkKEJPQkpTKSxcCisJCSAgICQoJChiYXNlbmFtZSAkKG5vdGRpciAkKEJPQkopKSlfREVQUykpKSkKK2VuZGVmCiskKEJJTikvJS5ub2RlcHMgOiAkKEJJTikvJS50bXAKKwkkKFEpJChFQ0hPKSAkKGNhbGwgbm9kZXBzX2xpc3QsJDwpCisKKyMgR2V0IGxpY2Vuc2luZyB2ZXJkaWN0IGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldAorIworZGVmaW5lIHVubGljZW5zZWRfZGVwc19saXN0CisJJChzaGVsbCBncmVwIC1MIEZJTEVfTElDRU5DRSAkKGNhbGwgZGVwc19saXN0LCQoMSkpKQorZW5kZWYKK2RlZmluZSBsaWNlbmNlX2xpc3QKKwkkKHBhdHN1YnN0IF9fbGljZW5jZV8lLCUsXAorCSAgJChmaWx0ZXIgX19saWNlbmNlXyUsJChzaGVsbCAkKE5NKSAkKDEpIHwgY3V0IC1kIiAiIC1mMykpKQorZW5kZWYKKyQoQklOKS8lLmxpY2VuY2UgOiAkKEJJTikvJS50bXAKKwkkKFFNKSQoRUNITykgIiAgW0xJQ0VOQ0VdICRAIgorCSQoUSkkKGlmICQoc3RyaXAgJChjYWxsIHVubGljZW5zZWRfZGVwc19saXN0LCQ8KSksXAorCQllY2hvIC1uICJVbmFibGUgdG8gZGV0ZXJtaW5lIGxpY2VuY2UgYmVjYXVzZSB0aGUgZm9sbG93aW5nICIgO1wKKwkJZWNobyAiZmlsZXMgYXJlIG1pc3NpbmcgYSBsaWNlbmNlIGRlY2xhcmF0aW9uOiIgO1wKKwkJZWNobyAkKGNhbGwgdW5saWNlbnNlZF9kZXBzX2xpc3QsJDwpO1wKKwkJZXhpdCAxLFwKKwkJJChMSUNFTkNFKSAkKGNhbGwgbGljZW5jZV9saXN0LCQ8KSkKKworIyBFeHRyYWN0IGNvbXByZXNzaW9uIGluZm9ybWF0aW9uIGZyb20gaW50ZXJtZWRpYXRlIG9iamVjdCBmaWxlCisjCiskKEJJTikvJS56aW5mbyA6ICQoQklOKS8lLnRtcAorCSQoUU0pJChFQ0hPKSAiICBbWklORk9dICRAIgorCSQoUSkkKE9CSkNPUFkpIC1PIGJpbmFyeSAtaiAuemluZm8gJDwgJEAKKworIyBCdWlsZCByYXcgYmluYXJ5IGZpbGUgZnJvbSBpbnRlcm1lZGlhdGUgb2JqZWN0IGZpbGUKKyMKKyQoQklOKS8lLmJpbiA6ICQoQklOKS8lLnRtcAorCSQoUU0pJChFQ0hPKSAiICBbQklOXSAkQCIKKwkkKFEpJChPQkpDT1BZKSAtTyBiaW5hcnkgLVIgLnppbmZvICQ8ICRACisKKyMgQ29tcHJlc3MgcmF3IGJpbmFyeSBmaWxlCisjCiskKEJJTikvJS56YmluIDogJChCSU4pLyUuYmluICQoQklOKS8lLnppbmZvICQoWkJJTikKKwkkKFFNKSQoRUNITykgIiAgW1pCSU5dICRAIgorCSQoUSkkKFpCSU4pICQoQklOKS8kKi5iaW4gJChCSU4pLyQqLnppbmZvID4gJEAKKworIyBSdWxlcyBmb3IgZWFjaCBtZWRpYSBmb3JtYXQuICBUaGVzZSBhcmUgZ2VuZXJhdGVkIGFuZCBwbGFjZWQgaW4gYW4KKyMgZXh0ZXJuYWwgTWFrZWZpbGUgZnJhZ21lbnQuICBXZSBjb3VsZCBkbyB0aGlzIHZpYSAkKGV2YWwgLi4uKSwgYnV0CisjIHRoYXQgd291bGQgcmVxdWlyZSBtYWtlID49IDMuODAuCisjIAorIyBOb3RlIHRoYXQgdGhlcmUncyBhbiBhbHRlcm5hdGl2ZSB3YXkgdG8gZ2VuZXJhdGUgbW9zdCAucm9tIGltYWdlczoKKyMgdGhleSBjYW4gYmUgY29waWVkIGZyb20gdGhlaXIgJ21hc3RlcicgUk9NIGltYWdlIHVzaW5nIGNwIGFuZAorIyByZXByb2Nlc3NlZCB3aXRoIG1ha2Vyb20gdG8gYWRkIHRoZSBQQ0kgSURzIGFuZCBpZGVudCBzdHJpbmcuICBUaGUKKyMgcmVsZXZhbnQgcnVsZSB3b3VsZCBsb29rIHNvbWV0aGluZyBsaWtlOgorIworIyAgICQoQklOKS9kZmU1Mzglcm9tIDogJChCSU4pL3J0bDgxMzklcm9tCisjCWNhdCAkPCAkQAorIwkkKEZJTkFMSVNFX3JvbSkKKyMgCisjIFlvdSBjYW4gZGVyaXZlIHRoZSBST00vZHJpdmVyIHJlbGF0aW9uc2hpcHMgdXNpbmcgdGhlIHZhcmlhYmxlcworIyBEUklWRVJfPHJvbT4gYW5kL29yIFJPTVNfPGRyaXZlcj4uCisjIAorIyBXZSBkb24ndCBjdXJyZW50bHkgZG8gdGhpcywgYmVjYXVzZSAoYSkgaXQgd291bGQgcmVxdWlyZSBnZW5lcmF0aW5nCisjIHlldCBtb3JlIE1ha2VmaWxlIGZyYWdtZW50cyAoc2luY2UgeW91IG5lZWQgYSBydWxlIGZvciBlYWNoIFJPTSBpbgorIyBST01TKSwgYW5kIChiKSB0aGUgbGlua2VyIGlzIHNvIGZhc3QgdGhhdCBpdCBwcm9iYWJseSB3b3VsZG4ndCBtYWtlCisjIG11Y2ggZGlmZmVyZW5jZSB0byB0aGUgb3ZlcmFsbCBidWlsZCB0aW1lLgorCittZWRpYSA6CisJQCQoRUNITykgJChNRURJQSkKKworQVVUT19NRURJQQk9ICQoZmlsdGVyLW91dCAkKE5PTl9BVVRPX01FRElBKSwkKE1FRElBKSkKK2F1dG9tZWRpYSA6CisJQCQoRUNITykgJChBVVRPX01FRElBKQorCisjIG1lZGlhX3RlbXBsYXRlIDogY3JlYXRlIE1ha2VmaWxlIHJ1bGVzIGZvciBzcGVjaWZpZWQgbWVkaWEKKyMKKyMgJCgxKSBpcyB0aGUgbWVkaWEgbmFtZSAoZS5nLiAicm9tIikKKyMgJCgyKSBpcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSAuZCBmaWxlIChlLmcuICJiaW4vZGVwcy9yb20ubWVkaWEuZCIpCisjCitkZWZpbmUgbWVkaWFfdGVtcGxhdGUKKworCUAkKEVDSE8pICIgIFtNRURJQURFUFNdICQoMSkiCisJQCQoTUtESVIpIC1wICQoZGlyICQoMikpCisJQCQoUk0pICQoMikKKwlAJChUT1VDSCkgJCgyKQorCUAkKEVDSE9fRSkgJyQkKEJJTikvJS4kKDEpIDogJCQoQklOKS8lLiQoMSkuemJpbicgXAorCQkgICdcblx0JCQoUU0pJChFQ0hPKSAiICBbRklOSVNIXSAkJEAiJyBcCisJCSAgJ1xuXHQkJChRKSQkKENQKSAkJDwgJCRAJyBcCisJCSAgJ1xuXHQkJChRKSQkKFBBRF8kKDEpKScgXAorCQkgICdcblx0JCQoUSkkJChGSU5BTElTRV8kKDEpKScgXAorCQk+ICQoMikKKworZW5kZWYKKworIyBSdWxlIHRvIGdlbmVyYXRlIHRoZSBNYWtlZmlsZSBydWxlcyB0byBiZSBpbmNsdWRlZAorIworJChCSU4pL2RlcHMvJS5tZWRpYS5kIDogJChNQUtFREVQUykKKwkkKGlmICQoZmlsdGVyICQoQVVUT19NRURJQSksJCopLCBcCisJCSQoY2FsbCBtZWRpYV90ZW1wbGF0ZSwkKiwkQCksIFwKKwkJQCQoRUNITykgJ0VSUk9SOiAkKiBpcyBub3QgYW4gQVVUT19NRURJQScgOyBleGl0IDEpCisKKyMgQ2FsY3VsYXRlIGFuZCBpbmNsdWRlIHRoZSBsaXN0IG9mIE1ha2VmaWxlIHJ1bGVzIGZpbGVzCisjCitNRURJQV9ERVBTCQk9ICQocGF0c3Vic3QgJSwkKEJJTikvZGVwcy8lLm1lZGlhLmQsJChBVVRPX01FRElBKSkKK21lZGlhZGVwcyA6CisJQCQoRUNITykgJChNRURJQV9ERVBTKQoraWZkZWYgTkVFRF9ERVBTCitpZm5lcSAoJChNRURJQV9ERVBTKSwpCistaW5jbHVkZSAkKE1FRElBX0RFUFMpCitlbmRpZgorZW5kaWYKKworIyBXcmFwIHVwIGJpbmFyeSBibG9icyAoZm9yIGVtYmVkZGVkIGltYWdlcykKKyMKKyQoQklOKS8lLm8gOiBwYXlsb2FkLyUuaW1nCisJJChRTSllY2hvICIgIFtXUkFQXSAkQCIKKwkkKFEpJChMRCkgLWIgYmluYXJ5IC1yIC1vICRAICQ8IC0tdW5kZWZpbmVkIG9ial9wYXlsb2FkIFwKKwkJLS1kZWZzeW0gb2JqXyQqPTAKKworQk9CSlMgKz0gJChwYXRzdWJzdCBwYXlsb2FkLyUuaW1nLCQoQklOKS8lLm8sJCh3aWxkY2FyZCBwYXlsb2FkLyouaW1nKSkKKworIyBUaGUgImFsbFhYWHMiIHRhcmdldHMgZm9yIGVhY2ggc3VmZml4CisjCithbGxhbGw6IGFsbHJvbXMgYWxsenJvbXMgYWxscHhlcyBhbGxpc29zIGFsbGRza3MKK2FsbHJvbXMgYWxsenJvbXMgOiBhbGwlcyA6ICQoZm9yZWFjaCBST00sJChST01TKSwkKEJJTikvJChST00pLiUpCithbGxweGVzIGFsbGlzb3MgYWxsZHNrcyA6IGFsbCVzIDogJChmb3JlYWNoIERSSVZFUiwkKERSSVZFUlMpLCQoQklOKS8kKERSSVZFUikuJSkKKworIyBBbGlhcyBmb3IgZ3B4ZS4lCisjCiskKEJJTikvZXRoZXJib290LiUgOiAkKEJJTikvZ3B4ZS4lCisJbG4gLXNmICQobm90ZGlyICQ8KSAkQAorCitlbmRpZiAjIGRlZmluZWQoQklOKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFJ1bGVzIGZvciBmaW5hbGlzaW5nIGZpbGVzLiAgVEdUX01BS0VST01fRkxBR1MgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mCisjIHRoZSBhdXRvbWF0aWMgYnVpbGQgc3lzdGVtIGFuZCB2YXJpZXMgYnkgdGFyZ2V0OyBpdCBpbmNsdWRlcyB0aGUKKyMgIi1wIDB4MTIzNCwweDU2NzgiIHN0cmluZyB0byBzZXQgdGhlIFBDSSBJRHMuCisjCitGSU5BTElTRV9yb20JPSAkKE1BS0VST00pICQoTUFLRVJPTV9GTEFHUykgJChUR1RfTUFLRVJPTV9GTEFHUykgXAorCQkgIC1pJChJREVOVCkgLXMgMCAkQAorRklOQUxJU0VfaHJvbQk9ICQoRklOQUxJU0Vfcm9tKQorRklOQUxJU0VfeHJvbQk9ICQoTUFLRVJPTSkgJChNQUtFUk9NX0ZMQUdTKSAkKFRHVF9NQUtFUk9NX0ZMQUdTKSBcCisJCSAgLWkkKElERU5UKSAtbiAtcyAwICRACisKKyMgU29tZSBST01zIHJlcXVpcmUgc3BlY2lmaWMgZmxhZ3MgdG8gYmUgcGFzc2VkIHRvIG1ha2Vyb20ucGwKKyMKK01BS0VST01fRkxBR1NfM2M1MDMgPSAtMworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoZSBjb21wcmVzc2lvbiB1dGlsaXRpZXMKKyMKKyQoTlJWMkIpIDogdXRpbC9ucnYyYi5jICQoTUFLRURFUFMpCisJJChRTSkkKEVDSE8pICIgIFtIT1NUQ0NdICRAIgorCSQoUSkkKEhPU1RfQ0MpIC1PMiAtREVOQ09ERSAtRERFQ09ERSAtRE1BSU4gLURWRVJCT1NFIC1ETkRFQlVHIFwKKwkJICAgICAgIC1EQklUU0laRT0zMiAtREVORElBTj0wIC1vICRAICQ8CitDTEVBTlVQCSs9ICQoTlJWMkIpCisKKyQoWkJJTikgOiB1dGlsL3piaW4uYyB1dGlsL25ydjJiLmMgJChNQUtFREVQUykKKwkkKFFNKSQoRUNITykgIiAgW0hPU1RDQ10gJEAiCisJJChRKSQoSE9TVF9DQykgLU8yIC1vICRAICQ8CitDTEVBTlVQICs9ICQoWkJJTikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaGUgRUZJIGltYWdlIGNvbnZlcnRlcgorIworRUxGMkVGSV9DRkxBR1MJOj0gLUkkKEJJTlVUSUxTX0RJUikvaW5jbHVkZSAtSSQoQkZEX0RJUikvaW5jbHVkZSBcCisJCSAgIC1pZGlyYWZ0ZXIgaW5jbHVkZSAtTCQoQklOVVRJTFNfRElSKS9saWIgLUwkKEJGRF9ESVIpL2xpYiBcCisJCSAgIC1sYmZkIC1saWJlcnR5IC1segorCiskKEVMRjJFRkkzMikgOiB1dGlsL2VsZjJlZmkuYyAkKE1BS0VERVBTKQorCSQoUU0pJChFQ0hPKSAiICBbSE9TVENDXSAkQCIKKwkkKFEpJChIT1NUX0NDKSAkKEVMRjJFRklfQ0ZMQUdTKSAtRE1ERV9DUFVfSUEzMiAtTzIgLW8gJEAgJDwKK0NMRUFOVVAgKz0gJChFTEYyRUZJMzIpCisKKyQoRUxGMkVGSTY0KSA6IHV0aWwvZWxmMmVmaS5jICQoTUFLRURFUFMpCisJJChRTSkkKEVDSE8pICIgIFtIT1NUQ0NdICRAIgorCSQoUSkkKEhPU1RfQ0MpICQoRUxGMkVGSV9DRkxBR1MpIC1ETURFX0NQVV9YNjQgLU8yIC1vICRAICQ8CitDTEVBTlVQICs9ICQoRUxGMkVGSTY0KQorCiskKEVGSVJPTSkgOiB1dGlsL2VmaXJvbS5jICQoTUFLRURFUFMpCisJJChRTSkkKEVDSE8pICIgIFtIT1NUQ0NdICRAIgorCSQoUSkkKEhPU1RfQ0MpIC1pZGlyYWZ0ZXIgaW5jbHVkZSAtTzIgLW8gJEAgJDwKK0NMRUFOVVAgKz0gJChFRklST00pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVGhlIElDQyBmaXh1cCB1dGlsaXR5CisjCiskKElDQ0ZJWCkgOiB1dGlsL2ljY2ZpeC5jICQoTUFLRURFUFMpCisJJChRTSkkKEVDSE8pICIgIFtIT1NUQ0NdICRAIgorCSQoUSkkKEhPU1RfQ0MpIC1pZGlyYWZ0ZXIgaW5jbHVkZSAtTzIgLW8gJEAgJDwKK0NMRUFOVVAgKz0gJChJQ0NGSVgpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQXV0by1pbmNyZW1lbnRpbmcgYnVpbGQgc2VyaWFsIG51bWJlci4gIEFwcGVuZCAiYnMiIHRvIHlvdXIgbGlzdCBvZgorIyBidWlsZCB0YXJnZXRzIHRvIGdldCBhIHNlcmlhbCBudW1iZXIgcHJpbnRlZCBhdCB0aGUgZW5kIG9mIHRoZQorIyBidWlsZC4gIEVuYWJsZSAtREJVSUxEX1NFUklBTCBpbiBvcmRlciB0byBzZWUgaXQgd2hlbiB0aGUgY29kZSBydW5zLgorIworQlVJTERTRVJJQUxfSAkJPSBjb25maWcvLmJ1aWxkc2VyaWFsLmgKK0JVSUxEU0VSSUFMX05PVwkJPSBjb25maWcvLmJ1aWxkc2VyaWFsLm5vdworQlVJTERTRVJJQUxfTkVYVAk9IGNvbmZpZy8uYnVpbGRzZXJpYWwubmV4dAorCiskKEJVSUxEU0VSSUFMX05PVykgJChCVUlMRFNFUklBTF9ORVhUKSA6CisJJChFQ0hPKSAxID4gJEAKKworJChCVUlMRFNFUklBTF9IKSA6ICQoQlVJTERTRVJJQUxfTk9XKSAkKEJVSUxEU0VSSUFMX05FWFQpCisJJChFQ0hPKSAnI2RlZmluZSBCVUlMRF9TRVJJQUxfTlVNICQoc2hlbGwgY2F0ICQ8KScgPiAkQAorCitpZmVxICgkKGZpbHRlciBicywkKE1BS0VDTURHT0FMUykpLGJzKQorJChzaGVsbCBkaWZmIC1xICQoQlVJTERTRVJJQUxfTk9XKSAkKEJVSUxEU0VSSUFMX05FWFQpID4gL2Rldi9udWxsIHx8IFwKKwljcCAtZiAkKEJVSUxEU0VSSUFMX05FWFQpICQoQlVJTERTRVJJQUxfTk9XKSkKK2VuZGlmCisKK2JzIDogJChCVUlMRFNFUklBTF9OT1cpCisJQCQoRUNITykgJCQoKCAkKHNoZWxsIGNhdCAkPCkgKyAxICkpID4gJChCVUlMRFNFUklBTF9ORVhUKQorCUAkKEVDSE8pICJCdWlsZCBzZXJpYWwgbnVtYmVyIGlzICQoc2hlbGwgY2F0ICQ8KSIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBCdWlsZCB0aGUgVEFHUyBmaWxlKHMpIGZvciBlbWFjcworIworVEFHUyA6CisJY3RhZ3MgLWUgLVIgLWYgJEAgLS1leGNsdWRlPWJpbgorCitDTEVBTlVQCSs9IFRBR1MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBGb3JjZSByZWJ1aWxkIGZvciBhbnkgZ2l2ZW4gdGFyZ2V0CisjCislLnJlYnVpbGQgOgorCXJtIC1mICQqCisJJChRKSQoTUFLRSkgJCoKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTeW1ib2wgdGFibGUgY2hlY2tzCisjCisKK2lmZGVmIEJJTgorCitTWU1UQUIJPSAkKEJJTikvc3ltdGFiCiskKFNZTVRBQikgOiAkKEJMSUIpCisJJChPQkpEVU1QKSAtdyAtdCAkPCA+ICRACisKK0NMRUFOVVAJKz0gJChCSU4pL3N5bXRhYgorCitzeW1jaGVjayA6ICQoU1lNVEFCKQorCSQoU1lNQ0hFQ0spICQ8CisKK2VuZGlmICMgZGVmaW5lZChCSU4pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQnVpbGQgYm9jaHMgc3ltYm9sIHRhYmxlCisjCisKK2lmZGVmIEJJTgorCiskKEJJTikvJS5ieHMgOiAkKEJJTikvJS50bXAKKwkkKE5NKSAkPCB8IGN1dCAtZCIgIiAtZjEsMyA+ICRACisKK2VuZGlmICMgZGVmaW5lZChCSU4pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRG9jdW1lbnRhdGlvbgorIworCitpZmRlZiBCSU4KKworJChCSU4pL2RveHlnZW4uY2ZnIDogZG94eWdlbi5jZmcgJChNQUtFREVQUykKKwkkKFEpJChQRVJMKSAtcGUgJ3N7XEBTUkNESVJTXEB9eyQoU1JDRElSUyl9OyAnIFwKKwkJLWUgICdze1xASU5DRElSU1xAfXskKGZpbHRlci1vdXQgLiwkKElOQ0RJUlMpKX07ICcgXAorCQktZSAgJ3N7XEBCSU5cQH17JChCSU4pfTsgJyBcCisJCS1lICAnc3tcQEFSQ0hcQH17JChBUkNIKX07ICcgXAorCQkkPCA+ICRACisKKyQoQklOKS9kb2MgOiAkKEJJTikvZG94eWdlbi5jZmcKKwkkKFEpJChET1hZR0VOKSAkPAorCisuUEhPTlkgOiAkKEJJTikvZG9jCisKK2RvYyA6ICQoQklOKS9kb2MKKworZG9jLWNsZWFuIDoKKwkkKFEpJChSTSkgLXIgJChCSU4pL2RvYworCitWRVJZQ0xFQU5VUAkrPSAkKEJJTikvZG9jCisKK2RvY3ZpZXcgOgorCUBbIC1mICQoQklOKS9kb2MvaHRtbC9pbmRleC5odG1sIF0gfHwgJChNQUtFKSAkKEJJTikvZG9jCisJQGlmIFsgLW4gIiQkQlJPV1NFUiIgXSA7IHRoZW4gXAorCQkoICQkQlJPV1NFUiAkKEJJTikvZG9jL2h0bWwvaW5kZXguaHRtbCAmICkgOyBcCisJZWxzZSBcCisJCSQoRUNITykgIkRvY3VtZW50YXRpb24gaW5kZXggaW4gJChCSU4pL2RvYy9odG1sL2luZGV4Lmh0bWwiIDsgXAorCWZpCisKK2VuZGlmICMgZGVmaW5lZChCSU4pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ2xlYW4tdXAKKyMKK2NsZWFuIDoKKwkkKFJNKSAkKENMRUFOVVApCisKK3ZlcnljbGVhbiA6IGNsZWFuCisJJChSTSkgLXIgJChWRVJZQ0xFQU5VUCkKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9NYWtlZmlsZSBiL2dweGUvc3JjL2FyY2gvaTM4Ni9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhkYTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L01ha2VmaWxlCkBAIC0wLDAgKzEsMTE3IEBACisjIEZvcmNlIGkzODYtb25seSBpbnN0cnVjdGlvbnMKKyMKK0NGTEFHUwkJKz0gLW1hcmNoPWkzODYKKworIyBDb2RlIHNpemUgcmVkdWN0aW9uLgorIworQ0ZMQUdTCQkrPSAtZm9taXQtZnJhbWUtcG9pbnRlcgorCisjIENvZGUgc2l6ZSByZWR1Y3Rpb24uCisjCitpZmVxICgkKENDVFlQRSksZ2NjKQorQ0ZMQUdTCQkrPSAtZnN0cmVuZ3RoLXJlZHVjZQorZW5kaWYKKworIyBDb2RlIHNpemUgcmVkdWN0aW9uLiAgZ2NjMyBuZWVkcyBhIGRpZmZlcmVudCBzeW50YXggdG8gZ2NjMiBpZiB5b3UKKyMgd2FudCB0byBhdm9pZCBzcHVyaW91cyB3YXJuaW5ncy4KKyMKK2lmZXEgKCQoQ0NUWVBFKSxnY2MpCitHQ0NfVkVSU0lPTgk6PSAkKHN1YnN0IC4sICwkKHNoZWxsICQoQ0MpIC1kdW1wdmVyc2lvbikpCitHQ0NfTUFKT1IJOj0gJChmaXJzdHdvcmQgJChHQ0NfVkVSU0lPTikpCitpZmVxICgkKEdDQ19NQUpPUiksMikKK0NGTEFHUwkJKz0gLW1hbGlnbi1qdW1wcz0xIC1tYWxpZ24tbG9vcHM9MSAtbWFsaWduLWZ1bmN0aW9ucz0xCitlbHNlCitDRkxBR1MJCSs9IC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1mdW5jdGlvbnM9MQorZW5kaWYgIyBnY2MyCitlbmRpZiAjIGdjYworCisjIENvZGUgc2l6ZSByZWR1Y3Rpb24uICBUaGlzIGlzIGFsbW9zdCBhbHdheXMgYSB3aW4uICBUaGUga2VybmVsIHVzZXMKKyMgaXQsIHRvby4KKyMKK2lmZXEgKCQoQ0NUWVBFKSxnY2MpCitDRkxBR1MJCSs9IC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIKK2VuZGlmCisKKyMgQ29kZSBzaXplIHJlZHVjdGlvbi4gIFVzZSByZWdwYXJtIGZvciBhbGwgZnVuY3Rpb25zIC0gQyBmdW5jdGlvbnMKKyMgY2FsbGVkIGZyb20gYXNzZW1ibHkgKG9yIHZpY2UgdmVyc2EpIG5lZWQgX19hc21jYWxsIG5vdworIworQ0ZMQUdTCQkrPSAtbXJlZ3Bhcm09MworCisjIENvZGUgc2l6ZSByZWR1Y3Rpb24uICBVc2UgLW1ydGQgKHNhbWUgX19hc21jYWxsIHJlcXVpcmVtZW50cyBhcyBhYm92ZSkKK2lmZXEgKCQoQ0NUWVBFKSxnY2MpCitDRkxBR1MJCSs9IC1tcnRkCitlbmRpZgorCisjIENvZGUgc2l6ZSByZWR1Y3Rpb24uICBUaGlzIGlzIHRoZSBsb2dpY2FsIGNvbXBsZW1lbnQgdG8gLW1yZWdwYXJtPTMuCisjIEl0IGRvZXNuJ3QgY3VycmVudGx5IGJ1eSB1cyBhbnl0aGluZywgYnV0IGlmIGFueXRoaW5nIGV2ZXIgdHJpZXMgdG8KKyMgcmV0dXJuIHNtYWxsIHN0cnVjdHVyZXMsIGxldCdzIGJlIHByZXBhcmVkCisjCitDRkxBR1MJCSs9IC1mcmVnLXN0cnVjdC1yZXR1cm4KKworIyBGb3JjZSAzMi1iaXQgY29kZSBldmVuIG9uIGFuIHg4Ni02NCBtYWNoaW5lCisjCitDRkxBR1MJCSs9IC1tMzIKK0FTRkxBR1MJCSs9IC0tMzIKK2lmZXEgKCQoSE9TVF9PUyksRnJlZUJTRCkKK0xERkxBR1MJCSs9IC1tIGVsZl9pMzg2X2Zic2QKK2Vsc2UKK0xERkxBR1MJCSs9IC1tIGVsZl9pMzg2CitlbmRpZgorCisjIEVGSSByZXF1aXJlcyAtZnNob3J0LXdjaGFyLCBhbmQgbm90aGluZyBlbHNlIGN1cnJlbnRseSB1c2VzIHdjaGFyX3QKKyMKK0NGTEFHUwkJKz0gLWZzaG9ydC13Y2hhcgorCisjIFdlIG5lZWQgdG8gdW5kZWZpbmUgdGhlIGRlZmF1bHQgbWFjcm8gImkzODYiIHdoZW4gY29tcGlsaW5nIC5TCisjIGZpbGVzLCBvdGhlcndpc2UgIi5hcmNoIGkzODYiIHRyYW5zbGF0ZXMgdG8gIi5hcmNoIDEiLi4uCisjCitDRkxBR1MJCQkrPSAtVWkzODYKKworIyBMb2NhdGlvbnMgb2YgdXRpbGl0aWVzCisjCitJU09MSU5VWF9CSU4JPSAvdXNyL2xpYi9zeXNsaW51eC9pc29saW51eC5iaW4KKworIyBpMzg2LXNwZWNpZmljIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgc291cmNlIGZpbGVzCisjCitTUkNESVJTCQkrPSBhcmNoL2kzODYvY29yZSBhcmNoL2kzODYvdHJhbnNpdGlvbnMgYXJjaC9pMzg2L3ByZWZpeAorU1JDRElSUwkJKz0gYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcworU1JDRElSUwkJKz0gYXJjaC9pMzg2L2ltYWdlCitTUkNESVJTCQkrPSBhcmNoL2kzODYvZHJpdmVycworU1JDRElSUwkJKz0gYXJjaC9pMzg2L2RyaXZlcnMvbmV0CitTUkNESVJTCQkrPSBhcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcworU1JDRElSUwkJKz0gYXJjaC9pMzg2L2ludGVyZmFjZS9weGUKK1NSQ0RJUlMJCSs9IGFyY2gvaTM4Ni9pbnRlcmZhY2UvcHhlcGFyZW50CitTUkNESVJTIAkrPSBhcmNoL2kzODYvaW50ZXJmYWNlL3N5c2xpbnV4CitTUkNESVJTCQkrPSBhcmNoL2kzODYvaGNpL2NvbW1hbmRzCisKKyMgVGhlIHZhcmlvdXMgeHh4X2xvYWRlci5jIGZpbGVzIGFyZSAjaW5jbHVkZWQgaW50byBjb3JlL2xvYWRlci5jIGFuZAorIyBzaG91bGQgbm90IGJlIGNvbXBpbGVkIGRpcmVjdGx5LgorIworTk9OX0FVVE9fU1JDUwkrPSBhcmNoL2kzODYvY29yZS9hb3V0X2xvYWRlci5jCitOT05fQVVUT19TUkNTCSs9IGFyY2gvaTM4Ni9jb3JlL2ZyZWVic2RfbG9hZGVyLmMKK05PTl9BVVRPX1NSQ1MJKz0gYXJjaC9pMzg2L2NvcmUvd2luY2VfbG9hZGVyLmMKKworIyBJbmNsdWRlIGNvbW1vbiB4ODYgTWFrZWZpbGUKKyMKK01BS0VERVBTCSs9IGFyY2gveDg2L01ha2VmaWxlCitpbmNsdWRlIGFyY2gveDg2L01ha2VmaWxlCisKKyMgSW5jbHVkZSBwbGF0Zm9ybS1zcGVjaWZpYyBNYWtlZmlsZQorIworTUFLRURFUFMJKz0gYXJjaC9pMzg2L01ha2VmaWxlLiQoUExBVEZPUk0pCitpbmNsdWRlIGFyY2gvaTM4Ni9NYWtlZmlsZS4kKFBMQVRGT1JNKQorCisjIFNvbWUgc3VmZml4ZXMgKGUuZy4gJS5mZDApIGFyZSBnZW5lcmF0ZWQgZGlyZWN0bHkgZnJvbSBvdGhlcgorIyBmaW5pc2hlZCBmaWxlcyAoZS5nLiAlLmRzayksIHJhdGhlciB0aGFuIGhhdmluZyB0aGVpciBvd24gcHJlZml4LgorCisjIHJ1bGUgdG8gd3JpdGUgZGlzayBpbWFnZXMgdG8gL2Rldi9mZDAKK05PTl9BVVRPX01FRElBCSs9IGZkMAorJWZkMCA6ICVkc2sKKwkkKFFNKSQoRUNITykgIiAgW0REXSAkQCIKKwkkKFEpZGQgaWY9JDwgYnM9NTEyIGNvbnY9c3luYyBvZj0vZGV2L2ZkMAorCSQoUSlzeW5jCisKKyMgQWRkIE5PTl9BVVRPX01FRElBIHRvIHRoZSBtZWRpYSBsaXN0LCBzbyB0aGF0IHRoZXkgc2hvdyB1cCBpbiB0aGUKKyMgb3V0cHV0IG9mICJtYWtlIgorIworTUVESUEJCSs9ICQoTk9OX0FVVE9fTUVESUEpCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvTWFrZWZpbGUuZWZpIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L01ha2VmaWxlLmVmaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDY1MWIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L01ha2VmaWxlLmVmaQpAQCAtMCwwICsxLDEwIEBACisjIC0qLSBtYWtlZmlsZSAtKi0gOiBGb3JjZSBlbWFjcyB0byB1c2UgTWFrZWZpbGUgbW9kZQorCisjIFNwZWNpZnkgRUZJIGltYWdlIGJ1aWxkZXIKKyMKK0VMRjJFRkkJCT0gJChFTEYyRUZJMzIpCisKKyMgSW5jbHVkZSBnZW5lcmljIEVGSSBNYWtlZmlsZQorIworTUFLRURFUFMJKz0gYXJjaC94ODYvTWFrZWZpbGUuZWZpCitpbmNsdWRlIGFyY2gveDg2L01ha2VmaWxlLmVmaQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L01ha2VmaWxlLnBjYmlvcyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9NYWtlZmlsZS5wY2Jpb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4ZmJjYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9NYWtlZmlsZS5wY2Jpb3MKQEAgLTAsMCArMSw3MCBAQAorIyAtKi0gbWFrZWZpbGUgLSotIDogRm9yY2UgZW1hY3MgdG8gdXNlIE1ha2VmaWxlIG1vZGUKKworIyBUaGUgaTM4NiBsaW5rZXIgc2NyaXB0CisjCitMRFNDUklQVAk9IGFyY2gvaTM4Ni9zY3JpcHRzL2kzODYubGRzCisKKyMgU3RvcCBsZCBmcm9tIGNvbXBsYWluaW5nIGFib3V0IG91ciBjdXN0b21pc2VkIGxpbmtlciBzY3JpcHQKKyMKK0xERkxBR1MJCSs9IC1OIC0tbm8tY2hlY2stc2VjdGlvbnMKKworIyBNZWRpYSB0eXBlcy4KKyMKK01FRElBCQkrPSByb20KK01FRElBCQkrPSBocm9tCitNRURJQQkJKz0geHJvbQorTUVESUEJCSs9IHB4ZQorTUVESUEJCSs9IGtweGUKK01FRElBCQkrPSBra3B4ZQorTUVESUEJCSs9IGxrcm4KK01FRElBCQkrPSBkc2sKK01FRElBCQkrPSBuYmkKK01FRElBCQkrPSBoZAorTUVESUEJCSs9IHJhdworCisjIFBhZGRpbmcgcnVsZXMKKyMKK1BBRF9yb20JCT0gJChQQURJTUcpIC0tYmxrc2l6ZT01MTIgLS1ieXRlPTB4ZmYgJEAKK1BBRF9ocm9tCT0gJChQQURfcm9tKQorUEFEX3hyb20JPSAkKFBBRF9yb20pCitQQURfZHNrCQk9ICQoUEFESU1HKSAtLWJsa3NpemU9NTEyICRACitQQURfaGQJCT0gJChQQURJTUcpIC0tYmxrc2l6ZT0zMjc2OCAkQAorCisjIHJ1bGUgdG8gbWFrZSBhIG5vbi1lbXVsYXRpb24gSVNPIGJvb3QgaW1hZ2UKK05PTl9BVVRPX01FRElBCSs9IGlzbworJWlzbzoJJWxrcm4gdXRpbC9nZW5pc28KKwkkKFFNKSQoRUNITykgIiAgW0dFTklTT10gJEAiCisJJChRKUlTT0xJTlVYX0JJTj0kKElTT0xJTlVYX0JJTikgYmFzaCB1dGlsL2dlbmlzbyAkQCAkPAorCisjIHJ1bGUgdG8gbWFrZSBhIGZsb3BweSBlbXVsYXRpb24gSVNPIGJvb3QgaW1hZ2UKK05PTl9BVVRPX01FRElBCSs9IGxpc28KKyVsaXNvOgklbGtybiB1dGlsL2dlbmxpc28KKwkkKFFNKSQoRUNITykgIiAgW0dFTkxJU09dICRAIgorCSQoUSliYXNoIHV0aWwvZ2VubGlzbyAkQCAkPAorCisjIHJ1bGUgdG8gbWFrZSBhIHN5c2xpbnV4IGZsb3BweSBpbWFnZSAobW91bnRhYmxlLCBib290YWJsZSkKK05PTl9BVVRPX01FRElBCSs9IHNkc2sKKyVzZHNrOgklbGtybiB1dGlsL2dlbnNkc2sKKwkkKFFNKSQoRUNITykgIiAgW0dFTlNEU0tdICRAIgorCSQoUSliYXNoIHV0aWwvZ2Vuc2RzayAkQCAkPAorCisjIFNwZWNpYWwgdGFyZ2V0IGZvciBidWlsZGluZyBNYXN0ZXIgQm9vdCBSZWNvcmQgYmluYXJ5CiskKEJJTikvbWJyLmJpbiA6ICQoQklOKS9tYnIubworCSQoUU0pJChFQ0hPKSAiICBbT0JKQ09QWV0gJEAiCisJJChRKSQoT0JKQ09QWSkgLU8gYmluYXJ5ICQ8ICRACisKKyMgcnVsZSB0byBtYWtlIGEgVVNCIGRpc2sgaW1hZ2UKKyQoQklOKS91c2JkaXNrLmJpbiA6ICQoQklOKS91c2JkaXNrLm8KKwkkKFFNKSQoRUNITykgIiAgW09CSkNPUFldICRAIgorCSQoUSkkKE9CSkNPUFkpIC1PIGJpbmFyeSAkPCAkQAorCitOT05fQVVUT19NRURJQQkrPSB1c2IKKyV1c2I6ICQoQklOKS91c2JkaXNrLmJpbiAlaGQKKwkkKFFNKSQoRUNITykgIiAgW0ZJTklTSF0gJEAiCisJJChRKWNhdCAkXiA+ICRACisKKyMgUGFkZGVkIGZsb3BweSBpbWFnZSAoZS5nLiBmb3IgaUxPKQorTk9OX0FVVE9fTUVESUEgKz0gcGRzaworJXBkc2sgOiAlZHNrCisJJChRKWNwICQ8ICRACisJJChRKSQoUEFESU1HKSAtLWJsa3NpemU9MTQ3NDU2MCAkQApkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L1JFQURNRS5pMzg2IGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L1JFQURNRS5pMzg2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Yjc5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvUkVBRE1FLmkzODYKQEAgLTAsMCArMSwxOTcgQEAKK0V0aGVyYm9vdC9OSUxPIGkzODYgaW5pdGlhbGlzYXRpb24gcGF0aCBhbmQgZXh0ZXJuYWwgY2FsbCBpbnRlcmZhY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMS4gQmFja2dyb3VuZAorCitHQ0MgY29tcGlsZXMgMzItYml0IGNvZGUuICBJdCBpcyBjYXBhYmxlIG9mIHByb2R1Y2luZworcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSwgYnV0IHRoZSByZXN1bHRpbmcgYmluYXJ5IGlzIGFib3V0IDI1JQorYmlnZ2VyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgZml4ZWQtcG9zaXRpb24gY29kZS4gIFNpbmNlIG9uZSBtYWluIHVzZQorb2YgRXRoZXJib290IGlzIGFzIGZpcm13YXJlIHRvIGJlIGJ1cm5lZCBpbnRvIGFuIEVQUk9NLCBjb2RlIHNpemUgbXVzdAorYmUga2VwdCBhcyBzbWFsbCBhcyBwb3NzaWJsZS4KKworVGhpcyBtZWFucyB0aGF0IHdlIHdhbnQgdG8gY29tcGlsZSBmaXhlZC1wb3NpdGlvbiBjb2RlIHdpdGggR0NDLCBhbmQKK2xpbmsgaXQgdG8gaGF2ZSBhIHByZWRldGVybWluZWQgc3RhcnQgYWRkcmVzcy4gIFRoZSBwcm9ibGVtIHRoZW4gaXMKK3RoYXQgd2UgbXVzdCBrbm93IHRoZSBhZGRyZXNzIHRoYXQgdGhlIGNvZGUgd2lsbCBiZSBsb2FkZWQgdG8gd2hlbiBpdAorcnVucy4gIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gc29sdmUgdGhpczoKKworMS4gUGljayBhbiBhZGRyZXNzLCBsaW5rIHRoZSBjb2RlIHdpdGggdGhpcyBzdGFydCBhZGRyZXNzLCB0aGVuIG1ha2UKKyAgIHN1cmUgdGhhdCB0aGUgY29kZSBnZXRzIGxvYWRlZCBhdCB0aGF0IGxvY2F0aW9uLiAgVGhpcyBpcworICAgcHJvYmxlbWF0aWMsIGJlY2F1c2Ugd2UgbWF5IHBpY2sgYW4gYWRkcmVzcyB0aGF0IHdlIGxhdGVyIGVuZCB1cAorICAgd2FudGluZyB0byB1c2UgdG8gbG9hZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHdlJ3JlIGJvb3RpbmcuCisKKzIuIFBpY2sgYW4gYWRkcmVzcywgbGluayB0aGUgY29kZSB3aXRoIHRoaXMgc3RhcnQgYWRkcmVzcywgdGhlbiBzZXQgdXAKKyAgIHZpcnR1YWwgYWRkcmVzc2luZyBzbyB0aGF0IHRoZSB2aXJ0dWFsIGFkZHJlc3NlcyBtYXRjaCB0aGUKKyAgIGxpbmstdGltZSBhZGRyZXNzZXMgcmVnYXJkbGVzcyBvZiB0aGUgcmVhbCBwaHlzaWNhbCBhZGRyZXNzIHRoYXQKKyAgIHRoZSBjb2RlIGlzIGxvYWRlZCB0by4gIFRoaXMgZW5hYmxlcyB1cyB0byByZWxvY2F0ZSBFdGhlcmJvb3QgdG8KKyAgIHRoZSB0b3Agb2YgaGlnaCBtZW1vcnksIHdoZXJlIGl0IHdpbGwgYmUgb3V0IG9mIHRoZSB3YXkgb2YgYW55CisgICBsb2FkaW5nIG9wZXJhdGluZyBzeXN0ZW0uCisKKzMuIExpbmsgdGhlIGNvZGUgd2l0aCBhIHRleHQgc3RhcnQgYWRkcmVzcyBvZiB6ZXJvIGFuZCBhIGRhdGEgc3RhcnQKKyAgIGFkZHJlc3MgYWxzbyBvZiB6ZXJvLiAgVXNlIDE2LWJpdCByZWFsIG1vZGUgYW5kIHRoZQorICAgcXVhc2ktcG9zaXRpb24taW5kZXBlbmRlbmNlIGl0IGdpdmVzIHlvdSB2aWEgc2VnbWVudCBhZGRyZXNzaW5nLgorICAgRG9pbmcgdGhpcyByZXF1aXJlcyB0aGF0IHdlIGdlbmVyYXRlIDE2LWJpdCBjb2RlLCByYXRoZXIgdGhhbgorICAgMzItYml0IGNvZGUsIGFuZCByZXN0cmljdHMgdXMgdG8gYSBtYXhpbXVtIG9mIDY0a0IgaW4gZWFjaCBzZWdtZW50LgorCitUaGVyZSBhcmUgb3RoZXIgcG9zc2libGUgYXBwcm9hY2hlcyAoZS5nLiBpbmNsdWRpbmcgYSByZWxvY2F0aW9uIHRhYmxlCithbmQgY29kZSB0aGF0IHBlcmZvcm1zIHN0YW5kYXJkIGR5bmFtaWMgcmVsb2NhdGlvbiksIGJ1dCB0aGUgdGhyZWUKK29wdGlvbnMgbGlzdGVkIGFib3ZlIGFyZSBwcm9iYWJseSB0aGUgYmVzdCBhdmFpbGFibGUuCisKK0V0aGVyYm9vdCBjYW4gYmUgaW52b2tlZCBpbiBhIHZhcmlldHkgb2Ygd2F5cyAoUk9NLCBmbG9wcHksIGFzIGEgUFhFCitOQlAsIGV0YykuICBTZXZlcmFsIG9mIHRoZXNlIHdheXMgaW52b2x2ZSBjb250cm9sIGJlaW5nIHBhc3NlZCB0bworRXRoZXJib290IHdpdGggdGhlIENQVSBpbiAxNi1iaXQgcmVhbCBtb2RlLiAgU29tZSB3aWxsIGludm9sdmUgdGhlIENQVQorYmVpbmcgaW4gMzItYml0IHByb3RlY3RlZCBtb2RlLCBhbmQgdGhlcmUncyBhbiBvdXRzaWRlIGNoYW5jZSB0aGF0Citzb21lIG1heSBpbnZvbHZlIHRoZSBDUFUgYmVpbmcgaW4gMTYtYml0IHByb3RlY3RlZCBtb2RlLiAgV2Ugd2lsbAorYWxtb3N0IGNlcnRhaW5seSBoYXZlIHRvIGVmZmVjdCBhIENQVSBtb2RlIGNoYW5nZSBpbiBvcmRlciB0byByZWFjaAordGhlIG1vZGUgd2Ugd2FudCB0byBiZSBpbiB0byBleGVjdXRlIHRoZSBDIGNvZGUuCisKK0FkZGl0aW9uYWxseSwgRXRoZXJib290IG1heSB3aXNoIHRvIGNhbGwgZXh0ZXJuYWwgcm91dGluZXMsIHN1Y2ggYXMKK0JJT1MgaW50ZXJydXB0cywgd2hpY2ggbXVzdCBiZSBjYWxsZWQgaW4gMTYtYml0IHJlYWwgbW9kZS4gIFdoZW4KK3Byb3ZpZGluZyBhIFBYRSBBUEksIEV0aGVyYm9vdCBtdXN0IHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGV4dGVybmFsCitjb2RlIHRvIGNhbGwgaXQgZnJvbSAxNi1iaXQgcmVhbCBtb2RlLgorCitOb3QgYWxsIGkzODYgYnVpbGRzIG9mIEV0aGVyYm9vdCB3aWxsIHdhbnQgdG8gbWFrZSByZWFsLW1vZGUgY2FsbHMuCitGb3IgZXhhbXBsZSwgd2hlbiBidWlsdCBmb3IgTGludXhCSU9TIHJhdGhlciB0aGFuIHRoZSBzdGFuZGFyZCBQQ0JJT1MsCitubyByZWFsLW1vZGUgY2FsbHMgYXJlIG5lY2Vzc2FyeS4KKworRm9yIHRoZSB1bHRpbWF0ZSBpbiBQWEUgY29tcGF0aWJpbGl0eSwgd2UgbWF5IHdhbnQgdG8gYnVpbGQgRXRoZXJib290Cit0byBydW4gcGVybWFuZW50bHkgaW4gcmVhbCBtb2RlLgorCitUaGVyZSBpcyBhIHdpZGUgdmFyaWV0eSBvZiBwb3RlbnRpYWwgY29tYmluYXRpb25zIG9mIG1vZGUgc3dpdGNoZXMKK3RoYXQgd2UgbWF5IHdpc2ggdG8gaW1wbGVtZW50LiAgVGhlcmUgYXJlIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9ucywKK3N1Y2ggYXMgdGhlIGluYWJpbGl0eSB0byBhY2Nlc3MgYSBoaWdoLW1lbW9yeSBzdGFjayB3aGVuIHJ1bm5pbmcgaW4KK3JlYWwgbW9kZS4KKworMi4gVHJhbnNpdGlvbiBsaWJyYXJpZXMKKworVG8gaGFuZGxlIGFsbCB0aGVzZSB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBtb2RlIHN3aXRjaGVzLCB3ZSBoYXZlCitzZXZlcmFsICJ0cmFuc2l0aW9uIiBsaWJyYXJpZXMgaW4gRXRoZXJib290LiAgV2UgYWxzbyBoYXZlIHRoZSBjb25jZXB0CitvZiBhbiAiaW50ZXJuYWwiIGFuZCBhbiAiZXh0ZXJuYWwiIGVudmlyb25tZW50LiAgVGhlIGludGVybmFsCitlbnZpcm9ubWVudCBpcyB0aGUgZW52aXJvbm1lbnQgd2l0aGluIHdoaWNoIHdlIGNhbiBleGVjdXRlIEMgY29kZS4KK1RoZSBleHRlcm5hbCBlbnZpcm9ubWVudCBpcyB0aGUgZW52aXJvbm1lbnQgb2Ygd2hhdGV2ZXIgZXh0ZXJuYWwgY29kZQord2UncmUgdHJ5aW5nIHRvIGludGVyZmFjZSB0bywgc3VjaCBhcyB0aGUgc3lzdGVtIEJJT1Mgb3IgYSBQWEUgTkJQLgorCitBcyB3ZWxsIGFzIGhhdmluZyBhIHNlcGFyYXRlIGFkZHJlc3Npbmcgc2NoZW1lLCB0aGUgaW50ZXJuYWwKK2Vudmlyb25tZW50IGFsc28gaGFzIGEgc2VwYXJhdGUgc3RhY2suCisKK1RoZSB0cmFuc2l0aW9uIGxpYnJhcmllcyBhcmU6CisKK2EpIGxpYnJtCisKK2xpYnJtIGhhbmRsZXMgdHJhbnNpdGlvbnMgYmV0d2VlbiBhbiBleHRlcm5hbCAxNi1iaXQgcmVhbC1tb2RlCitlbnZpcm9ubWVudCBhbmQgYW4gaW50ZXJuYWwgMzItYml0IHByb3RlY3RlZC1tb2RlIGVudmlyb25tZW50IHdpdGgKK3ZpcnR1YWwgYWRkcmVzc2VzLgorCitiKSBsaWJraXIKKworbGlia2lyIGhhbmRsZXMgdHJhbnNpdGlvbnMgYmV0d2VlbiBhbiBleHRlcm5hbCAxNi1iaXQgcmVhbC1tb2RlIChvcgorMTY6MTYgb3IgMTY6MzIgcHJvdGVjdGVkLW1vZGUpIGVudmlyb25tZW50IGFuZCBhbiBpbnRlcm5hbCAxNi1iaXQKK3JlYWwtbW9kZSAob3IgMTY6MTYgcHJvdGVjdGVkLW1vZGUpIGVudmlyb25tZW50LgorCitjKSBsaWJwbQorCitsaWJwbSBoYW5kbGVzIHRyYW5zaXRpb25zIGJldHdlZW4gYW4gZXh0ZXJuYWwgMzItYml0IHByb3RlY3RlZC1tb2RlCitlbnZpcm9ubWVudCB3aXRoIGZsYXQgcGh5c2ljYWwgYWRkcmVzc2VzIGFuZCBhbiBpbnRlcm5hbCAzMi1iaXQKK3Byb3RlY3RlZC1tb2RlIGVudmlyb25tZW50IHdpdGggdmlydHVhbCBhZGRyZXNzZXMuCisKK1RoZSB0cmFuc2l0aW9uIGxpYnJhcmllcyBoYW5kbGUgdGhlIHRyYW5zaXRpb25zIHJlcXVpcmVkIHdoZW4KK0V0aGVyYm9vdCBpcyBzdGFydGVkIHVwIGZvciB0aGUgZmlyc3QgdGltZSwgdGhlIHRyYW5zaXRpb25zIHJlcXVpcmVkCit0byBleGVjdXRlIGFueSBleHRlcm5hbCBjb2RlLCBhbmQgdGhlIHRyYW5zaXRpb25zIHJlcXVpcmVkIHdoZW4KK0V0aGVyYm9vdCBleGl0cyAoaWYgaXQgZXhpdHMpLiAgV2hlbiBFdGhlcmJvb3QgcHJvdmlkZXMgYSBQWEUgQVBJLAordGhleSBhbHNvIGhhbmRsZSB0aGUgdHJhbnNpdGlvbnMgcmVxdWlyZWQgd2hlbiBhIFBYRSBjbGllbnQgbWFrZXMgYQorUFhFIEFQSSBjYWxsIHRvIEV0aGVyYm9vdC4KKworRXRoZXJib290IG1heSB1c2UgbXVsdGlwbGUgdHJhbnNpdGlvbiBsaWJyYXJpZXMuICBGb3IgZXhhbXBsZSwgYW4KK0V0aGVyYm9vdCBFTEYgaW1hZ2UgZG9lcyBub3QgcmVxdWlyZSBsaWJybSBmb3IgaXRzIGluaXRpYWwgdHJhbnNpdGlvbnMKK2Zyb20gcHJlZml4IHRvIHJ1bnRpbWUsIGJ1dCBtYXkgcmVxdWlyZSBsaWJybSBmb3IgY2FsbGluZyBleHRlcm5hbAorcmVhbC1tb2RlIGZ1bmN0aW9ucy4KKworMy4gU2V0dXAgYW5kIGluaXRpYWxpc2F0aW9uCisKK0V0aGVyYm9vdCBpcyBjb25jZXB0dWFsbHkgZGl2aWRlZCBpbnRvIHRoZSBwcmVmaXgsIHRoZSBkZWNvbXByZXNzb3IsCithbmQgdGhlIHJ1bnRpbWUgaW1hZ2UuICAoRm9yIG5vbi1jb21wcmVzc2VkIGltYWdlcywgdGhlIGRlY29tcHJlc3NvcgoraXMgYSBuby1vcC4pICBUaGUgY29tcGxldGUgaW1hZ2UgY29tcHJpc2VzIGFsbCB0aHJlZSBwYXJ0cyBhbmQgaXMKK2Rpc3RpbmN0IGZyb20gdGhlIHJ1bnRpbWUgaW1hZ2UsIHdoaWNoIGV4Y2x1ZGUgdGhlIHByZWZpeCBhbmQgdGhlCitkZWNvbXByZXNzb3IuCisKK1RoZSBwcmVmaXggZG9lcyBzZXZlcmFsIHRhc2tzOgorCisgIExvYWQgdGhlIGNvbXBsZXRlIGltYWdlIGludG8gbWVtb3J5LiAgKEZvciBleGFtcGxlLCB0aGUgZmxvcHB5CisgIHByZWZpeCBpc3N1ZXMgQklPUyBjYWxscyB0byBsb2FkIHRoZSByZW1haW5kZXIgb2YgdGhlIGNvbXBsZXRlIGltYWdlCisgIGZyb20gdGhlIGZsb3BweSBkaXNrIGludG8gUkFNLCBhbmQgdGhlIElTQSBST00gcHJlZml4IGNvcGllcyB0aGUgUk9NCisgIGNvbnRlbnRzIGludG8gUkFNIGZvciBmYXN0ZXIgYWNjZXNzLikKKworICBDYWxsIHRoZSBkZWNvbXByZXNzb3IsIGlmIHRoZSBydW50aW1lIGltYWdlIGlzIGNvbXByZXNzZWQuICBUaGlzCisgIGRlY29tcHJlc3NlcyB0aGUgcnVudGltZSBpbWFnZS4KKworICBDYWxsIHRoZSBydW50aW1lIGltYWdlJ3Mgc2V0dXAoKSByb3V0aW5lLiAgVGhpcyBpcyBhIHJvdXRpbmUKKyAgaW1wbGVtZW50ZWQgaW4gYXNzZW1ibHkgY29kZSB3aGljaCBzZXRzIHVwIHRoZSBpbnRlcm5hbCBlbnZpcm9ubWVudAorICBzbyB0aGF0IEMgY29kZSBjYW4gZXhlY3V0ZS4KKworICBDYWxsIHRoZSBydW50aW1lIGltYWdlJ3MgYXJjaF9pbml0aWFsaXNlKCkgcm91dGluZS4gIFRoaXMgaXMgYQorICByb3V0aW5lIGltcGxlbWVudGVkIGluIEMgd2hpY2ggZG9lcyBzb21lIGJhc2ljIHN0YXJ0dXAgdGFza3MsIHN1Y2gKKyAgYXMgaW5pdGlhbGlzaW5nIHRoZSBjb25zb2xlIGRldmljZSwgb2J0YWluaW5nIGEgbWVtb3J5IG1hcCBhbmQKKyAgcmVsb2NhdGluZyB0aGUgcnVudGltZSBpbWFnZSB0byBoaWdoIG1lbW9yeS4KKworICBDYWxsIHRoZSBydW50aW1lIGltYWdlJ3MgYXJjaF9tYWluKCkgcm91dGluZS4gIFRoaXMgcmVjb3JkcyB0aGUgZXhpdAorICBtZWNoYW5pc20gcmVxdWVzdGVkIGJ5IHRoZSBwcmVmaXggYW5kIGNhbGxzIG1haW4oKS4gIChUaGUgcHJlZml4CisgIG5lZWRzIHRvIHJlZ2lzdGVyIGFuIGV4aXQgbWVjaGFuaXNtIGJlY2F1c2UgYnkgdGhlIHRpbWUgbWFpbigpCisgIHJldHVybnMsIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHByZWZpeCBoYXMgbW9zdCBsaWtlbHkgYmVlbgorICBvdmVyd3JpdHRlbi4pCisKK1doZW4gYWN0aW5nIGFzIGEgUFhFIFJPTSwgdGhlIFJPTSBwcmVmaXggY29udGFpbnMgYW4gVU5ESSBsb2FkZXIKK3JvdXRpbmUgaW4gYWRkaXRpb24gdG8gaXRzIHVzdWFsIGNvZGUuICBUaGUgVU5ESSBsb2FkZXIgcGVyZm9ybXMgYQorc2ltaWxhciBzZXF1ZW5jZSBvZiBzdGVwczoKKworICBMb2FkIHRoZSBjb21wbGV0ZSBpbWFnZSBpbnRvIG1lbW9yeS4KKworICBDYWxsIHRoZSBkZWNvbXByZXNzb3IuCisKKyAgQ2FsbCB0aGUgcnVudGltZSBpbWFnZSdzIHNldHVwKCkgcm91dGluZS4KKworICBDYWxsIHRoZSBydW50aW1lIGltYWdlJ3MgYXJjaF9pbml0aWFsaXNlKCkgcm91dGluZS4KKworICBDYWxsIHRoZSBydW50aW1lIGltYWdlJ3MgaW5zdGFsbF9weGVfc3RhY2soKSByb3V0aW5lLgorCisgIFJldHVybiB0byBjYWxsZXIuCisKK1RoZSBydW50aW1lIGltYWdlJ3Mgc2V0dXAoKSByb3V0aW5lIHdpbGwgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCisgIFN3aXRjaCB0byB0aGUgaW50ZXJuYWwgZW52aXJvbm1lbnQgdXNpbmcgYW4gYXBwcm9wcmlhdGUgdHJhbnNpdGlvbgorICBsaWJyYXJ5LiAgVGhpcyB3aWxsIHJlY29yZCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZXh0ZXJuYWwKKyAgZW52aXJvbm1lbnQuCisKKyAgU2V0IHVwIHRoZSBpbnRlcm5hbCBlbnZpcm9ubWVudDogbG9hZCBhIHN0YWNrLCBhbmQgc2V0IHVwIGEgR0RUIGZvcgorICB2aXJ0dWFsIGFkZHJlc3NpbmcgaWYgdmlydHVhbCBhZGRyZXNzaW5nIGlzIHRvIGJlIHVzZWQuCisKKyAgU3dpdGNoIGJhY2sgdG8gdGhlIGV4dGVybmFsIGVudmlyb25tZW50IHVzaW5nIHRoZSB0cmFuc2l0aW9uCisgIGxpYnJhcnkuICBUaGlzIHdpbGwgcmVjb3JkIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBpbnRlcm5hbAorICBlbnZpcm9ubWVudC4KKworT25jZSB0aGUgc2V0dXAoKSByb3V0aW5lIGhhcyByZXR1cm5lZCwgdGhlIGludGVybmFsIGVudmlyb25tZW50IGhhcyBiZWVuCitzZXQgdXAgcmVhZHkgZm9yIEMgY29kZSB0byBydW4uICBUaGUgcHJlZml4IGNhbiBjYWxsIEMgcm91dGluZXMgdXNpbmcKK2EgZnVuY3Rpb24gZnJvbSB0aGUgdHJhbnNpdGlvbiBsaWJyYXJ5LgorCitUaGUgcnVudGltZSBpbWFnZSdzIGFyY2hfaW5pdGlhbGlzZSgpIHJvdXRpbmUgd2lsbCBwZXJmb3JtIHRoZQorZm9sbG93aW5nIHN0ZXBzOgorCisgIFplcm8gdGhlIGJzcworCisgIEluaXRpYWxpc2UgdGhlIGNvbnNvbGUgZGV2aWNlKHMpIGFuZCBwcmludCBhIHdlbGNvbWUgbWVzc2FnZS4KKworICBPYnRhaW4gYSBtZW1vcnkgbWFwIHZpYSB0aGUgSU5UIDE1LEU4MjAgQklPUyBjYWxsIG9yIHN1aXRhYmxlCisgIGZhbGxiYWNrIG1lY2hhbmlzbS4gW25vdCBkb25lIGlmIGxpYmtpciBpcyBiZWluZyB1c2VkXQorCisgIFJlbG9jYXRlIHRoZSBydW50aW1lIGltYWdlIHRvIHRoZSB0b3Agb2YgaGlnaCBtZW1vcnkuIFtub3QgZG9uZSBpZgorICBsaWJraXIgaXMgYmVpbmcgdXNlZF0KKworICBJbnN0YWxsIGxpYnJtIHRvIGJhc2UgbWVtb3J5LiBbZG9uZSBvbmx5IGlmIGxpYnJtIGlzIGJlaW5nIHVzZWRdCisKKyAgQ2FsbCBpbml0aWFsaXNlKCkuCisKKyAgUmV0dXJuIHRvIHRoZSBwcmVmaXgsIHNldHRpbmcgcmVnaXN0ZXJzIHRvIGluZGljYXRlIHRvIHRoZSBwcmVmaXgKKyAgdGhlIG5ldyBsb2NhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBsaWJyYXJ5LCBpZiBhcHBsaWNhYmxlLiAgV2hpY2gKKyAgcmVnaXN0ZXJzIHRoZXNlIGFyZSBpcyBzcGVjaWZpYyB0byB0aGUgdHJhbnNpdGlvbiBsaWJyYXJ5IGJlaW5nCisgIHVzZWQuCisKK09uY2UgdGhlIGFyY2hfaW5pdGlhbGlzZSgpIHJvdXRpbmUgaGFzIHJldHVybmVkLCB0aGUgcHJlZml4IHdpbGwKK3Byb2JhYmx5IGNhbGwgYXJjaF9tYWluKCkuCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9hb3V0X2xvYWRlci5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvYW91dF9sb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODU2MjBlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvYW91dF9sb2FkZXIuYwpAQCAtMCwwICsxLDE0NCBAQAorLyogYS5vdXQgKi8KK3N0cnVjdCBleGVjIHsKKwl1bnNpZ25lZCBsb25nICAgICAgYV9taWRtYWc7CS8qIGZsYWdzPDwyNiB8IG1pZDw8MTYgfCBtYWdpYyAqLworCXVuc2lnbmVkIGxvbmcgICAgICBhX3RleHQ7CS8qIHRleHQgc2VnbWVudCBzaXplICovCisJdW5zaWduZWQgbG9uZyAgICAgIGFfZGF0YTsJLyogaW5pdGlhbGl6ZWQgZGF0YSBzaXplICovCisJdW5zaWduZWQgbG9uZyAgICAgIGFfYnNzOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgICAgICBhX3N5bXM7CS8qIHN5bWJvbCB0YWJsZSBzaXplICovCisJdW5zaWduZWQgbG9uZyAgICAgIGFfZW50cnk7CS8qIGVudHJ5IHBvaW50ICovCisJdW5zaWduZWQgbG9uZyAgICAgIGFfdHJzaXplOwkvKiB0ZXh0IHJlbG9jYXRpb24gc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgICAgICBhX2Ryc2l6ZTsJLyogZGF0YSByZWxvY2F0aW9uIHNpemUgKi8KK307CisKK3N0cnVjdCBhb3V0X3N0YXRlIHsKKwlzdHJ1Y3QgZXhlYyBoZWFkOworCXVuc2lnbmVkIGxvbmcgY3VyYWRkcjsKKwlpbnQgc2VnbWVudDsJCQkvKiBjdXJyZW50IHNlZ21lbnQgbnVtYmVyLCAtMSBmb3Igbm9uZSAqLworCXVuc2lnbmVkIGxvbmcgbG9jOwkJLyogc3RhcnQgb2Zmc2V0IG9mIGN1cnJlbnQgYmxvY2sgKi8KKwl1bnNpZ25lZCBsb25nIHNraXA7CQkvKiBwYWRkaW5nIHRvIGJlIHNraXBwZWQgdG8gY3VycmVudCBzZWdtZW50ICovCisJdW5zaWduZWQgbG9uZyB0b3JlYWQ7CQkvKiByZW1haW5pbmcgZGF0YSB0byBiZSByZWFkIGluIHRoZSBzZWdtZW50ICovCit9OworCitzdGF0aWMgc3RydWN0IGFvdXRfc3RhdGUgYXN0YXRlOworCitzdGF0aWMgc2VjdG9yX3QgYW91dF9kb3dubG9hZCh1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgZW9mKTsKK3N0YXRpYyBpbmxpbmUgb3NfZG93bmxvYWRfdCBhb3V0X3Byb2JlKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgbWlkLCBlbmQsIGlzdGFydCwgaWVuZDsKKwlpZiAobGVuIDwgc2l6ZW9mKGFzdGF0ZS5oZWFkKSkgeworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KCZhc3RhdGUuaGVhZCwgZGF0YSwgc2l6ZW9mKGFzdGF0ZS5oZWFkKSk7CisJaWYgKChhc3RhdGUuaGVhZC5hX21pZG1hZyAmIDB4ZmZmZikgIT0gMHgwMTBCTCkgeworCQlyZXR1cm4gMDsKKwl9CisJCisJcHJpbnRmKCIoYS5vdXQiKTsKKwlhb3V0X2ZyZWVic2RfcHJvYmUoKTsKKwlwcmludGYoIikuLi4gIik7CisJLyogQ2hlY2sgdGhlIGFvdXQgaW1hZ2UgKi8KKwlzdGFydCAgPSBhc3RhdGUuaGVhZC5hX2VudHJ5OworCW1pZCAgICA9ICgoKHN0YXJ0ICsgYXN0YXRlLmhlYWQuYV90ZXh0KSArIDQwOTUpICYgfjQwOTUpICsgYXN0YXRlLmhlYWQuYV9kYXRhOworCWVuZCAgICA9ICgobWlkICsgNDA5NSkgJiB+NDA5NSkgKyBhc3RhdGUuaGVhZC5hX2JzczsKKwlpc3RhcnQgPSA0MDk2OworCWllbmQgICA9IGlzdGFydCArIChtaWQgLSBzdGFydCk7CisJaWYgKCFwcmVwX3NlZ21lbnQoc3RhcnQsIG1pZCwgZW5kLCBpc3RhcnQsIGllbmQpKQorCQlyZXR1cm4gZGVhZF9kb3dubG9hZDsKKwlhc3RhdGUuc2VnbWVudCA9IC0xOworCWFzdGF0ZS5sb2MgPSAwOworCWFzdGF0ZS5za2lwID0gMDsKKwlhc3RhdGUudG9yZWFkID0gMDsKKwlyZXR1cm4gYW91dF9kb3dubG9hZDsKK30KKworc3RhdGljIHNlY3Rvcl90IGFvdXRfZG93bmxvYWQodW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwgaW50IGVvZikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwkvKiB3b3JraW5nIG9mZnNldCBpbiB0aGUgY3VycmVudCBkYXRhIGJsb2NrICovCisKKwlvZmZzZXQgPSAwOworCisjaWZkZWYgQU9VVF9MWU5YX0tESQorCWFzdGF0ZS5zZWdtZW50Kys7CisJaWYgKGFzdGF0ZS5zZWdtZW50ID09IDApIHsKKwkJYXN0YXRlLmN1cmFkZHIgPSAweDEwMDAwMDsKKwkJYXN0YXRlLmhlYWQuYV9lbnRyeSA9IGFzdGF0ZS5jdXJhZGRyICsgMHgyMDsKKwl9CisJbWVtY3B5KHBoeXNfdG9fdmlydChhc3RhdGUuY3VyYWRkciksIGRhdGEsIGxlbik7CisJYXN0YXRlLmN1cmFkZHIgKz0gbGVuOworCXJldHVybiAwOworI2VuZGlmCisKKwlkbyB7CisJCWlmIChhc3RhdGUuc2VnbWVudCAhPSAtMSkgeworCQkJaWYgKGFzdGF0ZS5za2lwKSB7CisJCQkJaWYgKGFzdGF0ZS5za2lwID49IGxlbiAtIG9mZnNldCkgeworCQkJCQlhc3RhdGUuc2tpcCAtPSBsZW4gLSBvZmZzZXQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlvZmZzZXQgKz0gYXN0YXRlLnNraXA7CisJCQkJYXN0YXRlLnNraXAgPSAwOworCQkJfQorCisJCQlpZiAoYXN0YXRlLnRvcmVhZCkgeworCQkJCWlmIChhc3RhdGUudG9yZWFkID49IGxlbiAtIG9mZnNldCkgeworCQkJCQltZW1jcHkocGh5c190b192aXJ0KGFzdGF0ZS5jdXJhZGRyKSwgZGF0YStvZmZzZXQsCisJCQkJCQlsZW4gLSBvZmZzZXQpOworCQkJCQlhc3RhdGUuY3VyYWRkciArPSBsZW4gLSBvZmZzZXQ7CisJCQkJCWFzdGF0ZS50b3JlYWQgLT0gbGVuIC0gb2Zmc2V0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbWVtY3B5KHBoeXNfdG9fdmlydChhc3RhdGUuY3VyYWRkciksIGRhdGErb2Zmc2V0LCBhc3RhdGUudG9yZWFkKTsKKwkJCQlvZmZzZXQgKz0gYXN0YXRlLnRvcmVhZDsKKwkJCQlhc3RhdGUudG9yZWFkID0gMDsKKwkJCX0KKwkJfQorCisJCS8qIERhdGEgbGVmdCwgYnV0IGN1cnJlbnQgc2VnbWVudCBmaW5pc2hlZCAtIGxvb2sgZm9yIHRoZSBuZXh0CisJCSAqIHNlZ21lbnQuICBUaGlzIGlzIHF1aXRlIHNpbXBsZSBmb3IgYS5vdXQgZmlsZXMuICAqLworCQlhc3RhdGUuc2VnbWVudCsrOworCQlzd2l0Y2ggKGFzdGF0ZS5zZWdtZW50KSB7CisJCWNhc2UgMDoKKwkJCS8qIHJlYWQgdGV4dCAqLworCQkJYXN0YXRlLmN1cmFkZHIgPSBhc3RhdGUuaGVhZC5hX2VudHJ5OworCQkJYXN0YXRlLnNraXAgPSA0MDk2OworCQkJYXN0YXRlLnRvcmVhZCA9IGFzdGF0ZS5oZWFkLmFfdGV4dDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkvKiByZWFkIGRhdGEgKi8KKwkJCS8qIHNraXAgYW5kIGN1cmFkZHIgbWF5IGJlIHdyb25nLCBidXQgSSBjb3VsZG4ndCBmaW5kCisJCQkgKiBleGFtcGxlcyB3aGVyZSB0aGlzIGZhaWxlZC4gIFRoZXJlIGlzIG5vIHJlYXNvbmFibGUKKwkJCSAqIGRvY3VtZW50YXRpb24gZm9yIGEub3V0IGF2YWlsYWJsZS4gICovCisJCQlhc3RhdGUuc2tpcCA9ICgoYXN0YXRlLmN1cmFkZHIgKyA0MDk1KSAmIH40MDk1KSAtIGFzdGF0ZS5jdXJhZGRyOworCQkJYXN0YXRlLmN1cmFkZHIgPSAoYXN0YXRlLmN1cmFkZHIgKyA0MDk1KSAmIH40MDk1OworCQkJYXN0YXRlLnRvcmVhZCA9IGFzdGF0ZS5oZWFkLmFfZGF0YTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkvKiBpbml0aWFsaXplIGJzcyBhbmQgc3RhcnQga2VybmVsICovCisJCQlhc3RhdGUuY3VyYWRkciA9IChhc3RhdGUuY3VyYWRkciArIDQwOTUpICYgfjQwOTU7CisJCQlhc3RhdGUuc2tpcCA9IDA7CisJCQlhc3RhdGUudG9yZWFkID0gMDsKKwkJCW1lbXNldChwaHlzX3RvX3ZpcnQoYXN0YXRlLmN1cmFkZHIpLCAnXDAnLCBhc3RhdGUuaGVhZC5hX2Jzcyk7CisJCQlnb3RvIGFvdXRfc3RhcnRrZXJuZWw7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKG9mZnNldCA8IGxlbik7CisKKwlhc3RhdGUubG9jICs9IGxlbjsKKworCWlmIChlb2YpIHsKKwkJdW5zaWduZWQgbG9uZyBlbnRyeTsKKworYW91dF9zdGFydGtlcm5lbDoKKwkJZW50cnkgPSBhc3RhdGUuaGVhZC5hX2VudHJ5OworCQlkb25lKDEpOworCisJCWFvdXRfZnJlZWJzZF9ib290KCk7CisjaWZkZWYgQU9VVF9MWU5YX0tESQorCQl4c3RhcnQzMihlbnRyeSk7CisjZW5kaWYKKwkJcHJpbnRmKCJ1bmV4cGVjdGVkIGEub3V0IHZhcmlhbnRcbiIpOworCQlsb25nam1wKHJlc3RhcnRfZXRoZXJib290LCAtMik7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvYmFzZW1lbV9wYWNrZXQuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL2Jhc2VtZW1fcGFja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4N2NjZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL2Jhc2VtZW1fcGFja2V0LmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFBhY2tldCBidWZmZXIgaW4gYmFzZSBtZW1vcnkuICBVc2VkIGJ5IHZhcmlvdXMgY29tcG9uZW50cyB3aGljaAorICogbmVlZCB0byBwYXNzIHBhY2tldHMgdG8gYW5kIGZyb20gZXh0ZXJuYWwgcmVhbC1tb2RlIGNvZGUuCisgKgorICovCisKKyNpbmNsdWRlIDxiYXNlbWVtX3BhY2tldC5oPgorCisjdW5kZWYgYmFzZW1lbV9wYWNrZXQKK2NoYXIgX19ic3MxNl9hcnJheSAoIGJhc2VtZW1fcGFja2V0LCBbQkFTRU1FTV9QQUNLRVRfTEVOXSApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvY3B1LmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjRmYTRlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvY3B1LmMKQEAgLTAsMCArMSw3MyBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNwdS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBDUFUgaWRlbnRpZmljYXRpb24KKyAqCisgKi8KKworLyoqCisgKiBUZXN0IHRvIHNlZSBpZiBDUFUgZmxhZyBpcyBjaGFuZ2VhYmxlCisgKgorICogQHYgZmxhZwkJRmxhZyB0byB0ZXN0CisgKiBAcmV0IGNhbl9jaGFuZ2UJRmxhZyBpcyBjaGFuZ2VhYmxlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZsYWdfaXNfY2hhbmdlYWJsZSAoIHVuc2lnbmVkIGludCBmbGFnICkgeworCXVpbnQzMl90IGYxLCBmMjsKKworCV9fYXNtX18gKCAicHVzaGZsXG5cdCIKKwkJICAicHVzaGZsXG5cdCIKKwkJICAicG9wbCAlMFxuXHQiCisJCSAgIm1vdmwgJTAsJTFcblx0IgorCQkgICJ4b3JsICUyLCUwXG5cdCIKKwkJICAicHVzaGwgJTBcblx0IgorCQkgICJwb3BmbFxuXHQiCisJCSAgInB1c2hmbFxuXHQiCisJCSAgInBvcGwgJTBcblx0IgorCQkgICJwb3BmbFxuXHQiCisJCSAgOiAiPSZyIiAoIGYxICksICI9JnIiICggZjIgKQorCQkgIDogImlyIiAoIGZsYWcgKSApOworCisJcmV0dXJuICggKCAoIGYxIF4gZjIgKSAmIGZsYWcgKSAhPSAwICk7Cit9CisKKy8qKgorICogR2V0IENQVSBpbmZvcm1hdGlvbgorICoKKyAqIEB2IGNwdQkJQ1BVIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB0byBmaWxsIGluCisgKi8KK3ZvaWQgZ2V0X2NwdWluZm8gKCBzdHJ1Y3QgY3B1aW5mb194ODYgKmNwdSApIHsKKwl1bnNpZ25lZCBpbnQgY3B1aWRfbGV2ZWw7CisJdW5zaWduZWQgaW50IGNwdWlkX2V4dGxldmVsOworCXVuc2lnbmVkIGludCBkaXNjYXJkXzEsIGRpc2NhcmRfMiwgZGlzY2FyZF8zOworCisJbWVtc2V0ICggY3B1LCAwLCBzaXplb2YgKCAqY3B1ICkgKTsKKworCS8qIENoZWNrIGZvciBDUFVJRCBpbnN0cnVjdGlvbiAqLworCWlmICggISBmbGFnX2lzX2NoYW5nZWFibGUgKCBYODZfRUZMQUdTX0lEICkgKSB7CisJCURCRyAoICJDUFVJRCBub3Qgc3VwcG9ydGVkXG4iICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgZmVhdHVyZXMsIGlmIHByZXNlbnQgKi8KKwljcHVpZCAoIDB4MDAwMDAwMDAsICZjcHVpZF9sZXZlbCwgJmRpc2NhcmRfMSwKKwkJJmRpc2NhcmRfMiwgJmRpc2NhcmRfMyApOworCWlmICggY3B1aWRfbGV2ZWwgPj0gMHgwMDAwMDAwMSApIHsKKwkJY3B1aWQgKCAweDAwMDAwMDAxLCAmZGlzY2FyZF8xLCAmZGlzY2FyZF8yLAorCQkJJmRpc2NhcmRfMywgJmNwdS0+ZmVhdHVyZXMgKTsKKwl9IGVsc2UgeworCQlEQkcgKCAiQ1BVSUQgY2Fubm90IHJldHVybiBjYXBhYmlsaXRpZXNcbiIgKTsKKwl9CisKKwkvKiBHZXQgNjQtYml0IGZlYXR1cmVzLCBpZiBwcmVzZW50ICovCisJY3B1aWQgKCAweDgwMDAwMDAwLCAmY3B1aWRfZXh0bGV2ZWwsICZkaXNjYXJkXzEsCisJCSZkaXNjYXJkXzIsICZkaXNjYXJkXzMgKTsKKwlpZiAoICggY3B1aWRfZXh0bGV2ZWwgJiAweGZmZmYwMDAwICkgPT0gMHg4MDAwMDAwMCApIHsKKwkJaWYgKCBjcHVpZF9leHRsZXZlbCA+PSAweDgwMDAwMDAxICkgeworCQkJY3B1aWQgKCAweDgwMDAwMDAxLCAmZGlzY2FyZF8xLCAmZGlzY2FyZF8yLAorCQkJCSZkaXNjYXJkXzMsICZjcHUtPmFtZF9mZWF0dXJlcyApOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvZHVtcHJlZ3MuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL2R1bXByZWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkYzIxOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL2R1bXByZWdzLmMKQEAgLTAsMCArMSwyMyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKwordm9pZCBfX2FzbWNhbGwgX2R1bXBfcmVncyAoIHN0cnVjdCBpMzg2X2FsbF9yZWdzICppeDg2ICkgeworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQlURVhUMTZfQ09ERSAoICIuZ2xvYmwgZHVtcF9yZWdzXG5cdCIKKwkJCSAgICAgICJcbmR1bXBfcmVnczpcblx0IgorCQkJICAgICAgInB1c2hsICRfZHVtcF9yZWdzXG5cdCIKKwkJCSAgICAgICJwdXNodyAlJWNzXG5cdCIKKwkJCSAgICAgICJjYWxsIHByb3RfY2FsbFxuXHQiCisJCQkgICAgICAiYWRkcjMyIGxlYWwgNCglJWVzcCksICUlZXNwXG5cdCIKKwkJCSAgICAgICJyZXRcblx0IiApIDogOiApOworCisJcHJpbnRmICggIkVBWD0lMDh4IEVCWD0lMDh4IEVDWD0lMDh4IEVEWD0lMDh4XG4iCisJCSAiRVNJPSUwOHggRURJPSUwOHggRUJQPSUwOHggRVNQPSUwOHhcbiIKKwkJICJDUz0lMDR4IFNTPSUwNHggRFM9JTA0eCBFUz0lMDR4IEZTPSUwNHggR1M9JTA0eFxuIiwKKwkJIGl4ODYtPnJlZ3MuZWF4LCBpeDg2LT5yZWdzLmVieCwgaXg4Ni0+cmVncy5lY3gsCisJCSBpeDg2LT5yZWdzLmVkeCwgaXg4Ni0+cmVncy5lc2ksIGl4ODYtPnJlZ3MuZWRpLAorCQkgaXg4Ni0+cmVncy5lYnAsIGl4ODYtPnJlZ3MuZXNwLAorCQkgaXg4Ni0+c2Vncy5jcywgaXg4Ni0+c2Vncy5zcywgaXg4Ni0+c2Vncy5kcywKKwkJIGl4ODYtPnNlZ3MuZXMsIGl4ODYtPnNlZ3MuZnMsIGl4ODYtPnNlZ3MuZ3MgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL2ZyZWVic2RfbG9hZGVyLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9mcmVlYnNkX2xvYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGY2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9mcmVlYnNkX2xvYWRlci5jCkBAIC0wLDAgKzEsMzc3IEBACisvKiBib290aW5mbyAqLworI2RlZmluZSBCT09USU5GT19WRVJTSU9OIDEKKyNkZWZpbmUgTk9ERVYgICAgICAgICAgICgtMSkgICAgLyogbm9uLWV4aXN0ZW50IGRldmljZSAqLworI2RlZmluZSBQQUdFX1NISUZUICAgICAgMTIgICAgICAgICAgICAgIC8qIExPRzIoUEFHRV9TSVpFKSAqLworI2RlZmluZSBQQUdFX1NJWkUgICAgICAgKDE8PFBBR0VfU0hJRlQpIC8qIGJ5dGVzL3BhZ2UgKi8KKyNkZWZpbmUgUEFHRV9NQVNLICAgICAgIChQQUdFX1NJWkUtMSkKKyNkZWZpbmUgTl9CSU9TX0dFT00gICAgIDgKKworc3RydWN0IGJvb3RpbmZvIHsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgYmlfdmVyc2lvbjsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAgICAgKmJpX2tlcm5lbG5hbWU7CisgICAgICAgIHN0cnVjdCBuZnNfZGlza2xlc3MgICAgICpiaV9uZnNfZGlza2xlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBmaWVsZHMgdGhhdCBhcmUgYWx3YXlzIHByZXNlbnQuICovCisjZGVmaW5lIGJpX2VuZGNvbW1vbiAgICAgICAgICAgIGJpX25fYmlvc191c2VkCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGJpX25fYmlvc191c2VkOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBiaV9iaW9zX2dlb21bTl9CSU9TX0dFT01dOworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBiaV9zaXplOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICBiaV9tZW1zaXplc192YWxpZDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgYmlfcGFkWzNdOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBiaV9iYXNlbWVtOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBiaV9leHRtZW07CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGJpX3N5bXRhYjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgYmlfZXN5bXRhYjsKKwkvKiBOb3RlIHRoYXQgdGhlc2UgYXJlIGluIHRoZSBGcmVlQlNEIGhlYWRlcnMgYnV0IHdlcmUgbm90IGhlcmUuLi4gKi8KKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBiaV9rZXJuZW5kOwkJLyogZW5kIG9mIGtlcm5lbCBzcGFjZSAqLworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGJpX2VudnA7CQkvKiBlbnZpcm9ubWVudCAqLworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGJpX21vZHVsZXA7CQkvKiBwcmVsb2FkZWQgbW9kdWxlcyAqLworfTsKKworc3RhdGljIHN0cnVjdCBib290aW5mbyBic2RpbmZvOworCisjaWZkZWYgRUxGX0lNQUdFCitzdGF0aWMgRWxmMzJfU2hkciAqc2hkcjsJLyogVG8gc3VwcG9ydCB0aGUgRnJlZUJTRCBrbHVkZ2UhICovCitzdGF0aWMgQWRkcmVzcyBzeW10YWJfbG9hZDsKK3N0YXRpYyBBZGRyZXNzIHN5bXN0cl9sb2FkOworc3RhdGljIGludCBzeW10YWJpbmRleDsKK3N0YXRpYyBpbnQgc3ltc3RyaW5kZXg7CisjZW5kaWYKKworc3RhdGljIGVudW0geworCVVua25vd24sIFRhZ2dlZCwgQW91dCwgRWxmLCBBb3V0X0ZyZWVCU0QsIEVsZl9GcmVlQlNELAorfSBpbWFnZV90eXBlID0gVW5rbm93bjsKKworc3RhdGljIHVuc2lnbmVkIGludCBvZmY7CisKKworI2lmZGVmIEVMRl9JTUFHRQorc3RhdGljIHZvaWQgZWxmX2ZyZWVic2RfcHJvYmUodm9pZCkKK3sKKwlpbWFnZV90eXBlID0gRWxmOworCWlmICgJKGVzdGF0ZS5lLmVsZjMyLmVfZW50cnkgJiAweGYwMDAwMDAwKSAmJiAKKwkJKGVzdGF0ZS5lLmVsZjMyLmVfdHlwZSA9PSBFVF9FWEVDKSkKKwl7CisJCWltYWdlX3R5cGUgPSBFbGZfRnJlZUJTRDsKKwkJcHJpbnRmKCIvRnJlZUJTRCIpOworCQlvZmYgPSAtKGVzdGF0ZS5lLmVsZjMyLmVfZW50cnkgJiAweGZmMDAwMDAwKTsKKwkJZXN0YXRlLmUuZWxmMzIuZV9lbnRyeSArPSBvZmY7CisJfQorCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbnVsbCB0byBzdGFydCB3aXRoLi4uICovCisJc2hkciA9IDA7CisJCisJLyogQ2xlYXIgdGhlIHN5bWJvbCBpbmRleCB2YWx1ZXMuLi4gKi8KKwlzeW10YWJpbmRleCA9IC0xOworCXN5bXN0cmluZGV4ID0gLTE7CisJCisJLyogLi4uYW5kIHRoZSBsb2FkIGFkZHJlc3NlcyBvZiB0aGUgc3ltYm9scyAgKi8KKwlzeW10YWJfbG9hZCA9IDA7CisJc3ltc3RyX2xvYWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBlbGZfZnJlZWJzZF9maXh1cF9zZWdtZW50KHZvaWQpCit7CisJaWYgKGltYWdlX3R5cGUgPT0gRWxmX0ZyZWVCU0QpIHsKKwkJZXN0YXRlLnAucGhkcjMyW2VzdGF0ZS5zZWdtZW50XS5wX3BhZGRyICs9IG9mZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVsZl9mcmVlYnNkX2ZpbmRfc2VnbWVudF9lbmQodm9pZCkKK3sKKwkvKiBDb3VudCB0aGUgYnl0ZXMgcmVhZCBldmVuIGZvciB0aGUgbGFzdCBibG9jaworCSAqIGFzIHdlIHdpbGwgbmVlZCB0byBrbm93IHdoZXJlIHRoZSBsYXN0IGJsb2NrCisJICogZW5kcyBpbiBvcmRlciB0byBsb2FkIHRoZSBzeW1ib2xzIGNvcnJlY3RseS4KKwkgKiAocGx1cyBpdCBjb3VsZCBiZSB1c2VmdWwgZWxzZXdoZXJlLi4uKQorCSAqIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGNvdW50IHRoZSBhY3R1YWwgc2l6ZSwKKwkgKiBub3QganVzdCB0aGUgZW5kIG9mIHRoZSBkaXNrIGltYWdlIHNpemUuCisJICovCisJZXN0YXRlLmN1cmFkZHIgKz0gCisJCShlc3RhdGUucC5waGRyMzJbZXN0YXRlLnNlZ21lbnRdLnBfbWVtc3ogLSAKKwkJZXN0YXRlLnAucGhkcjMyW2VzdGF0ZS5zZWdtZW50XS5wX2ZpbGVzeik7Cit9CisKK3N0YXRpYyBpbnQgZWxmX2ZyZWVic2RfZGVidWdfbG9hZGVyKHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJLyogTm8gbW9yZSBzZWdtZW50cyB0byBiZSBsb2FkZWQgLSB0aW1lIHRvIHN0YXJ0IHRoZQorCSAqIG5hc3R5IHN0YXRlIG1hY2hpbmUgdG8gc3VwcG9ydCB0aGUgbG9hZGluZyBvZgorCSAqIEZyZWVCU0QgZGVidWcgc3ltYm9scyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBGcmVlQlNECisJICogdXNlcy9leHBvcnRzIHRoZSBrZXJuZWwncyBkZWJ1ZyBzeW1ib2xzIGluIG9yZGVyCisJICogdG8gbWFrZSBtdWNoIG9mIHRoZSBzeXN0ZW0gd29yayEgIEFtYXppbmcgKGFyZyEpCisJICoKKwkgKiBXZSBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCBmb3IgdGhlIEZyZWVCU0Qga2VybmVsLAorCSAqIHRoZXJlIGlzIG9ubHkgb25lIHNlY3Rpb24gb2YgZGVidWcgc3ltYm9scyBhbmQgdGhhdAorCSAqIHRoZSBzZWN0aW9uIGlzIGFmdGVyIGFsbCBvZiB0aGUgbG9hZGVkIHNlY3Rpb25zIGluCisJICogdGhlIGZpbGUuICBUaGlzIGFzc3VtZXMgYSBsb3QgYnV0IGlzIHNvbWV3aGF0IHJlcXVpcmVkCisJICogdG8gbWFrZSB0aGlzIGNvZGUgbm90IGJlIHRvbyBhbm5veWluZy4gIChXaGVyZSBkbyB5b3UKKwkgKiBsb2FkIHN5bWJvbHMgd2hlbiB0aGUgY29kZSBoYXMgbm90IGxvYWRlZCB5ZXQ/KQorCSAqIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkganVzdCBhIGNhbGxiYWNrIGZyb20KKwkgKiB0aGUgbmV0d29yayBkYXRhIHRyYW5zZmVyIGNvZGUsIHdlIG5lZWQgdG8gYmUgYWJsZSB0bworCSAqIHdvcmsgd2l0aCB0aGUgZGF0YSBhcyBpdCBjb21lcyBpbi4gIFRoZXJlIGlzIG5vIGNoYW5jZQorCSAqIGZvciBkb2luZyBhIHNlZWsgb3RoZXIgdGhhbiBmb3J3YXJkcy4KKwkgKgorCSAqIFRoZSBwcm9jZXNzIHdlIHVzZSBpcyB0byBmaXJzdCBsb2FkIHRoZSBzZWN0aW9uCisJICogaGVhZGVycy4gIE9uY2UgdGhleSBhcmUgbG9hZGVkIChzaGRyICE9IDApIHdlIHRoZW4KKwkgKiBsb29rIGZvciB3aGVyZSB0aGUgc3ltYm9sIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUKKwkgKiBzdHJpbmdzIGFyZSBhbmQgc2V0dXAgc29tZSBzdGF0ZSB0aGF0IHdlIGZvdW5kCisJICogdGhlbSBhbmQgZmFsbCBpbnRvIHByb2Nlc3NpbmcgdGhlIGZpcnN0IG9uZSAod2hpY2gKKwkgKiBpcyB0aGUgc3ltYm9sIHRhYmxlKSBhbmQgYWZ0ZXIgdGhhdCBoYXMgYmVlbiBsb2FkZWQsCisJICogd2UgdHJ5IHRoZSBzeW1ib2wgc3RyaW5ncy4gIE5vdGUgdGhhdCB0aGUgb3JkZXIgaXMKKwkgKiBhY3R1YWxseSByZXF1aXJlZCBhcyB0aGUgbWVtb3J5IGltYWdlIGRlcGVuZHMgb24KKwkgKiB0aGUgc3ltYm9sIHN0cmluZ3MgYmVpbmcgbG9hZGVkIHN0YXJ0aW5nIGF0IHRoZQorCSAqIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIGtlcm5lbCBhc3N1bWVzIHRoaXMKKwkgKiBsYXlvdXQgb2YgdGhlIGltYWdlLgorCSAqCisJICogQXQgYW55IHBvaW50LCBpZiB3ZSBnZXQgdG8gdGhlIGVuZCBvZiB0aGUgbG9hZCBmaWxlCisJICogb3IgdGhlIHNlY3Rpb24gcmVxdWVzdGVkIGlzIGVhcmxpZXIgaW4gdGhlIGZpbGUgdGhhbgorCSAqIHRoZSBjdXJyZW50IGZpbGUgcG9pbnRlciwgd2UganVzdCBlbmQgdXAgZmFsbGluZworCSAqIG91dCBvZiB0aGlzIGFuZCBib290aW5nIHRoZSBrZXJuZWwgd2l0aG91dCB0aGlzCisJICogaW5mb3JtYXRpb24uCisJICovCisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBhZGRyZXNzIGlzIGxvbmcgYWxpZ25lZC4uLiAqLworCS8qIEFzc3VtZXMgc2l6ZSBvZiBsb25nIGlzIGEgcG93ZXIgb2YgMi4uLiAqLworCWVzdGF0ZS5jdXJhZGRyID0gKGVzdGF0ZS5jdXJhZGRyICsgc2l6ZW9mKGxvbmcpIC0gMSkgJiB+KHNpemVvZihsb25nKSAtIDEpOworCQorCS8qIElmIHdlIGhhdmUgbm90IHlldCBnb3R0ZW4gdGhlIHNoZHIgbG9hZGVkLCB0cnkgdGhhdCAqLworCWlmIChzaGRyID09IDApCisJeworCQllc3RhdGUudG9yZWFkID0gZXN0YXRlLmUuZWxmMzIuZV9zaG51bSAqIGVzdGF0ZS5lLmVsZjMyLmVfc2hlbnRzaXplOworCQllc3RhdGUuc2tpcCA9IGVzdGF0ZS5lLmVsZjMyLmVfc2hvZmYgLSAoZXN0YXRlLmxvYyArIG9mZnNldCk7CisJCWlmIChlc3RhdGUudG9yZWFkKQorCQl7CisjaWYgRUxGX0RFQlVHCisJCQlwcmludGYoInNoZHIgKiwgc2l6ZSAlbFgsIGN1cmFkZHIgJWxYXG4iLCAKKwkJCQllc3RhdGUudG9yZWFkLCBlc3RhdGUuY3VyYWRkcik7CisjZW5kaWYKKwkJCQorCQkJLyogU3RhcnQgcmVhZGluZyBhdCB0aGUgY3VyYWRkciBhbmQgbWFrZSB0aGF0IHRoZSBzaGRyICovCisJCQlzaGRyID0gKEVsZjMyX1NoZHIgKilwaHlzX3RvX3ZpcnQoZXN0YXRlLmN1cmFkZHIpOworCQkJCisJCQkvKiBTdGFydCB0byByZWFkLi4uICovCisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvKiBXZSBoYXZlIHRoZSBzaGRyIGxvYWRlZCwgY2hlY2sgaWYgd2UgaGF2ZSBmb3VuZAorCQkgKiB0aGUgaW5kZXhzIHdoZXJlIHRoZSBzeW1ib2xzIGFyZSBzdXBwb3NlZCB0byBiZSAqLworCQlpZiAoKHN5bXRhYmluZGV4ID09IC0xKSAmJiAoc3ltc3RyaW5kZXggPT0gLTEpKQorCQl7CisJCQlpbnQgaTsKKwkJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBhZGRyZXNzIGlzIHBhZ2UgYWxpZ25lZC4uLiAqLworCQkJLyogU3ltYm9scyBuZWVkIHRvIHN0YXJ0IGluIHRoZWlyIG93biBwYWdlKHMpLi4uICovCisJCQllc3RhdGUuY3VyYWRkciA9IChlc3RhdGUuY3VyYWRkciArIDQwOTUpICYgfjQwOTU7CisJCQkKKwkJCS8qIE5lZWQgdG8gbWFrZSBuZXcgaW5kZXhlcy4uLiAqLworCQkJZm9yIChpPTA7IGkgPCBlc3RhdGUuZS5lbGYzMi5lX3NobnVtOyBpKyspCisJCQl7CisJCQkJaWYgKHNoZHJbaV0uc2hfdHlwZSA9PSBTSFRfU1lNVEFCKQorCQkJCXsKKwkJCQkJaW50IGo7CisJCQkJCWZvciAoaj0wOyBqIDwgZXN0YXRlLmUuZWxmMzIuZV9waG51bTsgaisrKQorCQkJCQl7CisJCQkJCQkvKiBDaGVjayBvbmx5IGZvciBsb2FkZWQgc2VjdGlvbnMgKi8KKwkJCQkJCWlmICgoZXN0YXRlLnAucGhkcjMyW2pdLnBfdHlwZSB8IDB4ODApID09IChQVF9MT0FEIHwgMHg4MCkpCisJCQkJCQl7CisJCQkJCQkJLyogT25seSB0aGUgZXh0cmEgc3ltYm9scyAqLworCQkJCQkJCWlmICgoc2hkcltpXS5zaF9vZmZzZXQgPj0gZXN0YXRlLnAucGhkcjMyW2pdLnBfb2Zmc2V0KSAmJgorCQkJCQkJCQkoKHNoZHJbaV0uc2hfb2Zmc2V0ICsgc2hkcltpXS5zaF9zaXplKSA8PQorCQkJCQkJCQkJKGVzdGF0ZS5wLnBoZHIzMltqXS5wX29mZnNldCArIGVzdGF0ZS5wLnBoZHIzMltqXS5wX2ZpbGVzeikpKQorCQkJCQkJCXsKKwkJCQkJCQkJc2hkcltpXS5zaF9vZmZzZXQ9MDsKKwkJCQkJCQkJc2hkcltpXS5zaF9zaXplPTA7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoKHNoZHJbaV0uc2hfb2Zmc2V0ICE9IDApICYmIChzaGRyW2ldLnNoX3NpemUgIT0gMCkpCisJCQkJCXsKKwkJCQkJCXN5bXRhYmluZGV4ID0gaTsKKwkJCQkJCXN5bXN0cmluZGV4ID0gc2hkcltpXS5zaF9saW5rOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgc3ltYm9sIHRhYmxlIGluZGV4IGFuZCBoYXZlIG5vdCBsb2FkZWQgaXQgKi8KKwkJaWYgKChzeW10YWJfbG9hZCA9PSAwKSAmJiAoc3ltdGFiaW5kZXggPj0gMCkpCisJCXsKKwkJCS8qIE5vIHN5bWJvbCB0YWJsZSB5ZXQ/ICBMb2FkIGl0IGZpcnN0Li4uICovCisJCQkKKwkJCS8qIFRoaXMgaGFwcGVucyB0byB3b3JrIG91dCBpbiBhIHN0cmFuZ2Ugd2F5LgorCQkJICogSWYgd2UgYXJlIHBhc3QgdGhlIHBvaW50IGluIHRoZSBmaWxlIGFscmVhZHksCisJCQkgKiB3ZSB3aWxsIHNraXAgYSAqbGFyZ2UqIG51bWJlciBvZiBieXRlcyB3aGljaAorCQkJICogZW5kcyB1cCBicmluZ2luZyB1cyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZAorCQkJICogYW4gb2xkIChkZWZhdWx0KSBib290LiAgTGVzcyBjb2RlIGFuZCBsZXRzCisJCQkgKiB0aGUgc3RhdGUgbWFjaGluZSB3b3JrIGluIGEgY2xlYW5lciB3YXkgYnV0IHRoaXMKKwkJCSAqIGlzIGEgbmFzdHkgc2lkZS1lZmZlY3QgdHJpY2suLi4gKi8KKwkJCWVzdGF0ZS5za2lwID0gc2hkcltzeW10YWJpbmRleF0uc2hfb2Zmc2V0IC0gKGVzdGF0ZS5sb2MgKyBvZmZzZXQpOworCQkJCisJCQkvKiBBbmQgd2UgbmVlZCB0byByZWFkIHRoaXMgbWFueSBieXRlcy4uLiAqLworCQkJZXN0YXRlLnRvcmVhZCA9IHNoZHJbc3ltdGFiaW5kZXhdLnNoX3NpemU7CisJCQkKKwkJCWlmIChlc3RhdGUudG9yZWFkKQorCQkJeworI2lmIEVMRl9ERUJVRworCQkJCXByaW50ZigiZGIgc3ltLCBzaXplICVsWCwgY3VyYWRkciAlbFhcbiIsIAorCQkJCQllc3RhdGUudG9yZWFkLCBlc3RhdGUuY3VyYWRkcik7CisjZW5kaWYKKwkJCQkvKiBTYXZlIHdoZXJlIHdlIGFyZSBsb2FkaW5nIHRoaXMuLi4gKi8KKwkJCQlzeW10YWJfbG9hZCA9IGVzdGF0ZS5jdXJhZGRyOworCQkJCQorCQkJCSooKGxvbmcgKilwaHlzX3RvX3ZpcnQoZXN0YXRlLmN1cmFkZHIpKSA9IGVzdGF0ZS50b3JlYWQ7CisJCQkJZXN0YXRlLmN1cmFkZHIgKz0gc2l6ZW9mKGxvbmcpOworCQkJCQorCQkJCS8qIFN0YXJ0IHRvIHJlYWQuLi4gKi8KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICgoc3ltc3RyX2xvYWQgPT0gMCkgJiYgKHN5bXN0cmluZGV4ID49IDApKQorCQl7CisJCQkvKiBXZSBoYXZlIGFscmVhZHkgbG9hZGVkIHRoZSBzeW1ib2wgdGFibGUsIHNvCisJCQkgKiBub3cgb24gdG8gdGhlIHN5bWJvbCBzdHJpbmdzLi4uICovCisJCQkKKwkJCQorCQkJLyogU2FtZSBuYXN0eSB0cmljayBhcyBhYm92ZS4uLiAqLworCQkJZXN0YXRlLnNraXAgPSBzaGRyW3N5bXN0cmluZGV4XS5zaF9vZmZzZXQgLSAoZXN0YXRlLmxvYyArIG9mZnNldCk7CisJCQkKKwkJCS8qIEFuZCB3ZSBuZWVkIHRvIHJlYWQgdGhpcyBtYW55IGJ5dGVzLi4uICovCisJCQllc3RhdGUudG9yZWFkID0gc2hkcltzeW1zdHJpbmRleF0uc2hfc2l6ZTsKKwkJCQorCQkJaWYgKGVzdGF0ZS50b3JlYWQpCisJCQl7CisjaWYgRUxGX0RFQlVHCisJCQkJcHJpbnRmKCJkYiBzdHIsIHNpemUgJWxYLCBjdXJhZGRyICVsWFxuIiwgCisJCQkJCWVzdGF0ZS50b3JlYWQsIGVzdGF0ZS5jdXJhZGRyKTsKKyNlbmRpZgorCQkJCS8qIFNhdmUgd2hlcmUgd2UgYXJlIGxvYWRpbmcgdGhpcy4uLiAqLworCQkJCXN5bXN0cl9sb2FkID0gZXN0YXRlLmN1cmFkZHI7CisJCQkJCisJCQkJKigobG9uZyAqKXBoeXNfdG9fdmlydChlc3RhdGUuY3VyYWRkcikpID0gZXN0YXRlLnRvcmVhZDsKKwkJCQllc3RhdGUuY3VyYWRkciArPSBzaXplb2YobG9uZyk7CisJCQkJCisJCQkJLyogU3RhcnQgdG8gcmVhZC4uLiAqLworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCS8qIGFsbCBkb25lICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVsZl9mcmVlYnNkX2Jvb3QodW5zaWduZWQgbG9uZyBlbnRyeSkgCit7CisJaWYgKGltYWdlX3R5cGUgIT0gRWxmX0ZyZWVCU0QpCisJCXJldHVybjsKKworCW1lbXNldCgmYnNkaW5mbywgMCwgc2l6ZW9mKGJzZGluZm8pKTsKKwlic2RpbmZvLmJpX2Jhc2VtZW0gPSBtZW1pbmZvLmJhc2VtZW1zaXplOworCWJzZGluZm8uYmlfZXh0bWVtID0gbWVtaW5mby5tZW1zaXplOworCWJzZGluZm8uYmlfbWVtc2l6ZXNfdmFsaWQgPSAxOworCWJzZGluZm8uYmlfdmVyc2lvbiA9IEJPT1RJTkZPX1ZFUlNJT047CisJYnNkaW5mby5iaV9rZXJuZWxuYW1lID0gdmlydF90b19waHlzKEtFUk5FTF9CVUYpOworCWJzZGluZm8uYmlfbmZzX2Rpc2tsZXNzID0gTlVMTDsKKwlic2RpbmZvLmJpX3NpemUgPSBzaXplb2YoYnNkaW5mbyk7CisjZGVmaW5lIFJCX0JPT1RJTkZPICAgICAweDgwMDAwMDAwICAgICAgLyogaGF2ZSBgc3RydWN0IGJvb3RpbmZvIConIGFyZyAqLyAgCisJaWYoZnJlZWJzZF9rZXJuZWxfZW52WzBdICE9ICdcMCcpeworCQlmcmVlYnNkX2hvd3RvIHw9IFJCX0JPT1RJTkZPOworCQlic2RpbmZvLmJpX2VudnAgPSAodW5zaWduZWQgbG9uZylmcmVlYnNkX2tlcm5lbF9lbnY7CisJfQorCQorCS8qIENoZWNrIGlmIHdlIGhhdmUgc3ltYm9scyBsb2FkZWQsIGFuZCBpZiBzbywKKwkgKiBtYWRlIHRoZSBtZXRhX2RhdGEgbmVlZGVkIHRvIHBhc3MgdGhvc2UgdG8KKwkgKiB0aGUga2VybmVsLiAqLworCWlmICgoc3ltdGFiX2xvYWQgIT0wKSAmJiAoc3ltc3RyX2xvYWQgIT0gMCkpCisJeworCQl1bnNpZ25lZCBsb25nICp0OworCQkKKwkJYnNkaW5mby5iaV9zeW10YWIgPSBzeW10YWJfbG9hZDsKKwkJCisJCS8qIEVuZCBvZiBzeW1ib2xzIChsb25nIGFsaWduZWQuLi4pICovCisJCS8qIEFzc3VtZXMgc2l6ZSBvZiBsb25nIGlzIGEgcG93ZXIgb2YgMi4uLiAqLworCQlic2RpbmZvLmJpX2VzeW10YWIgPSAoc3ltc3RyX2xvYWQgKworCQkJc2l6ZW9mKGxvbmcpICsKKwkJCSooKGxvbmcgKilwaHlzX3RvX3ZpcnQoc3ltc3RyX2xvYWQpKSArCisJCQlzaXplb2YobG9uZykgLSAxKSAmIH4oc2l6ZW9mKGxvbmcpIC0gMSk7CisJCQorCQkvKiBXaGVyZSB3ZSB3aWxsIGJ1aWxkIHRoZSBtZXRhIGRhdGEuLi4gKi8KKwkJdCA9IHBoeXNfdG9fdmlydChic2RpbmZvLmJpX2VzeW10YWIpOworCQkKKyNpZiBFTEZfREVCVUcKKwkJcHJpbnRmKCJNZXRhZGF0YSBhdCAlbFhcbiIsdCk7CisjZW5kaWYKKwkJCisJCS8qIFNldCB1cCB0aGUgcG9pbnRlciB0byB0aGUgbWVtb3J5Li4uICovCisJCWJzZGluZm8uYmlfbW9kdWxlcCA9IHZpcnRfdG9fcGh5cyh0KTsKKwkJCisJCS8qIFRoZSBtZXRhZGF0YSBzdHJ1Y3R1cmUgaXMgYW4gYXJyYXkgb2YgMzItYml0CisJCSAqIHdvcmRzIHdoZXJlIHdlIHN0b3JlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisJCSAqIHN5c3RlbS4gIFRoaXMgaXMgY3JpdGljYWwsIGFzIEZyZWVCU0Qgbm93IGxvb2tzCisJCSAqIG9ubHkgZm9yIHRoZSBtZXRhZGF0YSBmb3IgdGhlIGV4dGVuZGVkIHN5bWJvbAorCQkgKiBpbmZvcm1hdGlvbiByYXRoZXIgdGhhbiBpbiB0aGUgYm9vdGluZm8uCisJCSAqLworCQkvKiBGaXJzdCwgZG8gdGhlIGtlcm5lbCBuYW1lIGFuZCB0aGUga2VybmVsIHR5cGUgKi8KKwkJLyogTm90ZSB0aGF0IHRoaXMgYXNzdW1lZCB4ODYgYnl0ZSBvcmRlci4uLiAqLworCQkKKwkJLyogJ2tlcm5lbFwwXDAnICovCisJCSp0Kys9TU9ESU5GT19OQU1FOyAqdCsrPSA3OyAqdCsrPTB4NkU3MjY1NkI7ICp0Kys9MHgwMDAwNkM2NTsKKwkJCisJCS8qICdlbGYga2VybmVsXDBcMCcgKi8KKwkJKnQrKz1NT0RJTkZPX1RZUEU7ICp0Kys9MTE7ICp0Kys9MHgyMDY2NkM2NTsgKnQrKz0weDZFNzI2NTZCOyAqdCsrID0gMHgwMDAwNkM2NTsKKwkJCisJCS8qIE5vdyB0aGUgc3ltYm9sIHN0YXJ0L2VuZCAtIG5vdGUgdGhhdCB0aGV5IGFyZQorCQkgKiBoZXJlIGluIGxvY2FsL3BoeXNpY2FsIGFkZHJlc3MgLSB0aGUgS2VybmVsCisJCSAqIGJvb3QgcHJvY2VzcyB3aWxsIHJlbG9jYXRlIHRoZSBhZGRyZXNzZXMuICovCisJCSp0Kys9TU9ESU5GT01EX1NTWU0gfCBNT0RJTkZPX01FVEFEQVRBOyAqdCsrPXNpemVvZigqdCk7ICp0Kys9YnNkaW5mby5iaV9zeW10YWI7CisJCSp0Kys9TU9ESU5GT01EX0VTWU0gfCBNT0RJTkZPX01FVEFEQVRBOyAqdCsrPXNpemVvZigqdCk7ICp0Kys9YnNkaW5mby5iaV9lc3ltdGFiOworCQkKKwkJKnQrKz1NT0RJTkZPX0VORDsgKnQrKz0wOyAvKiBlbmQgb2YgbWV0YWRhdGEgKi8KKwkJCisJCS8qIFNpbmNlIHdlIGhhdmUgc3ltYm9scyB3ZSBuZWVkIHRvIG1ha2UKKwkJICogc3VyZSB0aGF0IHRoZSBrZXJuZWwga25vd3MgaXRzIG93biBlbmQKKwkJICogb2YgbWVtb3J5Li4uICBJdCBpcyBub3QgX2VuZCBidXQgYWZ0ZXIKKwkJICogdGhlIHN5bWJvbHMgYW5kIHRoZSBtZXRhZGF0YS4uLiAqLworCQlic2RpbmZvLmJpX2tlcm5lbmQgPSB2aXJ0X3RvX3BoeXModCk7CisJCQorCQkvKiBTaWduYWwgbG9jb3JlLnMgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgYm9vdGluZm8KKwkJICogc3RydWN0dXJlIHRoYXQgd2FzIGNvbXBsZXRlbHkgZmlsbGVkIGluLiAqLworCQlmcmVlYnNkX2hvd3RvIHw9IDB4ODAwMDAwMDA7CisJfQorCQorCXhzdGFydDMyKGVudHJ5LCBmcmVlYnNkX2hvd3RvLCBOT0RFViwgMCwgMCwgMCwgCisJCXZpcnRfdG9fcGh5cygmYnNkaW5mbyksIDAsIDAsIDApOworCWxvbmdqbXAocmVzdGFydF9ldGhlcmJvb3QsIC0yKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQU9VVF9JTUFHRQorc3RhdGljIHZvaWQgYW91dF9mcmVlYnNkX3Byb2JlKHZvaWQpCit7CisJaW1hZ2VfdHlwZSA9IEFvdXQ7CisJaWYgKCgoYXN0YXRlLmhlYWQuYV9taWRtYWcgPj4gMTYpICYgMHhmZmZmKSA9PSAwKSB7CisJCS8qIFNvbWUgb3RoZXIgYS5vdXQgdmFyaWFudHMgaGF2ZSBhIGRpZmZlcmVudAorCQkgKiB2YWx1ZSwgYW5kIHVzZSBvdGhlciBhbGlnbm1lbnRzIChlLmcuIDFLKSwKKwkJICogbm90IHRoZSA0SyB1c2VkIGJ5IEZyZWVCU0QuICAqLworCQlpbWFnZV90eXBlID0gQW91dF9GcmVlQlNEOworCQlwcmludGYoIi9GcmVlQlNEIik7CisJCW9mZiA9IC0oYXN0YXRlLmhlYWQuYV9lbnRyeSAmIDB4ZmYwMDAwMDApOworCQlhc3RhdGUuaGVhZC5hX2VudHJ5ICs9IG9mZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFvdXRfZnJlZWJzZF9ib290KHZvaWQpCit7CisJaWYgKGltYWdlX3R5cGUgPT0gQW91dF9GcmVlQlNEKSB7CisJCW1lbXNldCgmYnNkaW5mbywgMCwgc2l6ZW9mKGJzZGluZm8pKTsKKwkJYnNkaW5mby5iaV9iYXNlbWVtID0gbWVtaW5mby5iYXNlbWVtc2l6ZTsKKwkJYnNkaW5mby5iaV9leHRtZW0gPSBtZW1pbmZvLm1lbXNpemU7CisJCWJzZGluZm8uYmlfbWVtc2l6ZXNfdmFsaWQgPSAxOworCQlic2RpbmZvLmJpX3ZlcnNpb24gPSBCT09USU5GT19WRVJTSU9OOworCQlic2RpbmZvLmJpX2tlcm5lbG5hbWUgPSB2aXJ0X3RvX3BoeXMoS0VSTkVMX0JVRik7CisJCWJzZGluZm8uYmlfbmZzX2Rpc2tsZXNzID0gTlVMTDsKKwkJYnNkaW5mby5iaV9zaXplID0gc2l6ZW9mKGJzZGluZm8pOworCQl4c3RhcnQzMihhc3RhdGUuaGVhZC5hX2VudHJ5LCBmcmVlYnNkX2hvd3RvLCBOT0RFViwgMCwgMCwgMCwgCisJCQl2aXJ0X3RvX3BoeXMoJmJzZGluZm8pLCAwLCAwLCAwKTsKKwkJbG9uZ2ptcChyZXN0YXJ0X2V0aGVyYm9vdCwgLTIpOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvZ2RiaWR0LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9nZGJpZHQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhiMzhhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvZ2RiaWR0LlMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBJbnRlcnJ1cHQgRGVzY3JpcHRvciBUYWJsZSAoSURUKSBzZXR1cCBhbmQgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBHREIgc3R1Yi4KKyAqLworCisjaW5jbHVkZSA8bGlicm0uaD4KKworI2RlZmluZSBTSVpFT0ZfSTM4Nl9SRUdTCTMyCisjZGVmaW5lIFNJWkVPRl9JMzg2X0ZMQUdTCTQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVycnVwdCBEZXNjcmlwdG9yIFRhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi5kYXRhMTYiLCAiYXciLCBAcHJvZ2JpdHMKKwkuZ2xvYmwgaWR0cgoraWR0cjoKK2lkdF9saW1pdDoKKwkud29yZAlpZHRfbGVuZ3RoIC0gMQoraWR0X2Jhc2U6CisJLmxvbmcJMAorCisvKiBJRFQgZW50cmllcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICogb2Zmc2V0X2xvLCBzZWdtZW50IHNlbGVjdG9yLCBmbGFncywgb2Zmc2V0X2hpCisgKgorICogU2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNwZWNpZnkgcmVsb2NhdGlvbnMgaW4gYXJiaXRyYXJ5CisgKiBleHByZXNzaW9ucyBsaWtlIChpbnRfb3ZlcmZsb3cgJiAweGZmZmYpLCB3ZSBpbml0aWFsaXNlIHRoZQorICogSURUIHdpdGggZW50cmllcyBpbiBhbiBpbmNvcnJlY3QgZm9ybWF0LgorICoKKyAqIFRoZSBlbnRyaWVzIGFyZSBzaHVmZmxlZCBpbnRvIHRoZSBjb3JyZWN0IGZvcm1hdCBpbiBpbml0X2xpYnJtKCkuCisgKi8KKyNkZWZpbmUgSURUX0VOVFJZX0VNUFRZKG5hbWUpIC53b3JkIDAsIDAsIDAsIDAKKyNkZWZpbmUgSURUX0VOVFJZX1BSRVNFTlQobmFtZSkgXAorCS5sb25nCWludF8jI25hbWU7IFwKKwkud29yZAkweDhlMDAsIFZJUlRVQUxfQ1MKKworLmFsaWduIDE2CitpZHQ6CisJSURUX0VOVFJZX1BSRVNFTlQoZGl2aWRlX2Vycm9yKQorCUlEVF9FTlRSWV9QUkVTRU5UKGRlYnVnX3RyYXApCisJSURUX0VOVFJZX0VNUFRZKG5vbl9tYXNrYWJsZV9pbnRlcnJ1cHQpCisJSURUX0VOVFJZX1BSRVNFTlQoYnJlYWtwb2ludCkKKwlJRFRfRU5UUllfUFJFU0VOVChvdmVyZmxvdykKKwlJRFRfRU5UUllfUFJFU0VOVChib3VuZF9yYW5nZV9leGNlZWRlZCkKKwlJRFRfRU5UUllfUFJFU0VOVChpbnZhbGlkX29wY29kZSkKKwlJRFRfRU5UUllfRU1QVFkoZGV2aWNlX25vdF9hdmFpbGFibGUpCisJSURUX0VOVFJZX1BSRVNFTlQoZG91YmxlX2ZhdWx0KQorCUlEVF9FTlRSWV9FTVBUWShjb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4pCisJSURUX0VOVFJZX1BSRVNFTlQoaW52YWxpZF90c3MpCisJSURUX0VOVFJZX1BSRVNFTlQoc2VnbWVudF9ub3RfcHJlc2VudCkKKwlJRFRfRU5UUllfUFJFU0VOVChzdGFja19zZWdtZW50X2ZhdWx0KQorCUlEVF9FTlRSWV9QUkVTRU5UKGdlbmVyYWxfcHJvdGVjdGlvbikKKwlJRFRfRU5UUllfUFJFU0VOVChwYWdlX2ZhdWx0KQoraWR0X2VuZDoKKwkuZXF1CWlkdF9sZW5ndGgsIGlkdF9lbmQgLSBpZHQKKworLyogVGhlIElEVCBlbnRyaWVzIGFyZSBmaXhlZCB1cCAob25jZSkgaW4gaW5pdF9saWJybSgpICovCitpZHRfZml4ZWQ6CisJLmJ5dGUJMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaWR0X2luaXQgKHJlYWwtbW9kZSBuZWFyIGNhbGwsIDE2LWJpdCByZWFsLW1vZGUgbmVhciByZXR1cm4gYWRkcmVzcykKKyAqCisgKiBJbml0aWFsaXNlIHRoZSBJRFQsIGNhbGxlZCBmcm9tIGluaXRfbGlicm0uCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWVheCA6IElEVCBiYXNlIGFkZHJlc3MKKyAqCisgKiBEZXN0cm95cyAlYXgsICVieCwgYW5kICVkaS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworCS5jb2RlMTYKKwkuZ2xvYmwgaWR0X2luaXQKK2lkdF9pbml0OgorCW1vdmwJJWVheCwgaWR0X2Jhc2UKKwlhZGRsCSRpZHQsIGlkdF9iYXNlCisKKwkvKiBJRFQgZW50cmllcyBhcmUgb25seSBmaXhlZCB1cCBvbmNlICovCisJbW92YglpZHRfZml4ZWQsICVhbAorCW9yYgklYWwsICVhbAorCWpuegkyZgorCW1vdmIJJDEsIGlkdF9maXhlZAorCisJLyogU2h1ZmZsZSBJRFQgZW50cmllcyBpbnRvIHRoZSBjb3JyZWN0IGZvcm1hdCAqLworCW1vdmIJJChpZHRfbGVuZ3RoIC8gOCksICVhbAorCW1vdncJJGlkdCwgJWJ4CisJb3IJJWFsLCAlYWwKKwlqegkyZgorMToKKwltb3Z3CTIoJWJ4KSwgJWRpCisJeGNoZwklZGksIDYoJWJ4KQorCW1vdncJJWRpLCAyKCVieCkKKwlhZGR3CSQ4LCAlYngKKwlkZWMJJWFsCisJam56CTFiCisyOgorCXJldAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW50ZXJydXB0IGhhbmRsZXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi50ZXh0IiwgImF4IiwgQHByb2diaXRzCisJLmNvZGUzMgorCisvKiBQT1NJWCBzaWduYWwgbnVtYmVycyBmb3IgcmVwb3J0aW5nIHRyYXBzIHRvIEdEQiAqLworI2RlZmluZSBTSUdJTEwgNAorI2RlZmluZSBTSUdUUkFQIDUKKyNkZWZpbmUgU0lHQlVTIDcKKyNkZWZpbmUgU0lHRlBFIDgKKyNkZWZpbmUgU0lHU0VHViAxMQorI2RlZmluZSBTSUdTVEtGTFQgMTYKKworaW50X2RpdmlkZV9lcnJvcjoKKwlwdXNobAkkU0lHRlBFCisJam1wCWRvX2ludGVycnVwdAorCitpbnRfZGVidWdfdHJhcDoKK2ludF9icmVha3BvaW50OgorCXB1c2hsCSRTSUdUUkFQCisJam1wCWRvX2ludGVycnVwdAorCitpbnRfb3ZlcmZsb3c6CitpbnRfYm91bmRfcmFuZ2VfZXhjZWVkZWQ6CisJcHVzaGwJJFNJR1NUS0ZMVAorCWptcAlkb19pbnRlcnJ1cHQKKworaW50X2ludmFsaWRfb3Bjb2RlOgorCXB1c2hsCSRTSUdJTEwKKwlqbXAJZG9faW50ZXJydXB0CisKK2ludF9kb3VibGVfZmF1bHQ6CisJbW92bAkkU0lHQlVTLCAoJWVzcCkKKwlqbXAJZG9faW50ZXJydXB0CisKK2ludF9pbnZhbGlkX3RzczoKK2ludF9zZWdtZW50X25vdF9wcmVzZW50OgoraW50X3N0YWNrX3NlZ21lbnRfZmF1bHQ6CitpbnRfZ2VuZXJhbF9wcm90ZWN0aW9uOgoraW50X3BhZ2VfZmF1bHQ6CisJbW92bAkkU0lHU0VHViwgKCVlc3ApCisJam1wCWRvX2ludGVycnVwdAorCisvKiBXaGVuIGludm9rZWQsIHRoZSBzdGFjayBjb250YWluczogZWZsYWdzLCBjcywgZWlwLCBzaWduby4gKi8KKyNkZWZpbmUgSUhfT0ZGU0VUX0dEQl9SRUdTICggMCApCisjZGVmaW5lIElIX09GRlNFVF9HREJfRUlQICggSUhfT0ZGU0VUX0dEQl9SRUdTICsgU0laRU9GX0kzODZfUkVHUyApCisjZGVmaW5lIElIX09GRlNFVF9HREJfRUZMQUdTICggSUhfT0ZGU0VUX0dEQl9FSVAgKyA0ICkKKyNkZWZpbmUgSUhfT0ZGU0VUX0dEQl9TRUdfUkVHUyAoIElIX09GRlNFVF9HREJfRUZMQUdTICsgU0laRU9GX0kzODZfRkxBR1MgKQorI2RlZmluZSBJSF9PRkZTRVRfR0RCX0VORCAoIElIX09GRlNFVF9HREJfU0VHX1JFR1MgKyA2ICogNCApCisjZGVmaW5lIElIX09GRlNFVF9TSUdOTyAoIElIX09GRlNFVF9HREJfRU5EICkKKyNkZWZpbmUgSUhfT0ZGU0VUX09MRF9FSVAgKCBJSF9PRkZTRVRfU0lHTk8gKyA0ICkKKyNkZWZpbmUgSUhfT0ZGU0VUX09MRF9DUyAoIElIX09GRlNFVF9PTERfRUlQICsgNCApCisjZGVmaW5lIElIX09GRlNFVF9PTERfRUZMQUdTICggSUhfT0ZGU0VUX09MRF9DUyArIDQgKQorI2RlZmluZSBJSF9PRkZTRVRfRU5EICggSUhfT0ZGU0VUX09MRF9FRkxBR1MgKyA0ICkKKworLyogV2UgYWxzbyBhY2Nlc3MgdGhlIHN0YWNrIHdoaWxzdCBzdGlsbCBzdG9yaW5nIG9yIHJlc3RvcmluZworICogdGhlIHJlZ2lzdGVyIHNuYXBzaG90LiAgU2luY2UgRVNQIGlzIGluIGZsdXgsIHdlIG5lZWQKKyAqIHNwZWNpYWwgb2Zmc2V0cy4KKyAqLworI2RlZmluZSBJSF9PRkZTRVRfRkxVWF9PTERfQ1MgKCBJSF9PRkZTRVRfT0xEX0NTIC0gNDQgKQorI2RlZmluZSBJSF9PRkZTRVRfRkxVWF9PTERfRUZMQUdTICggSUhfT0ZGU0VUX09MRF9FRkxBR1MgLSA0MCApCisjZGVmaW5lIElIX09GRlNFVF9GTFVYX09MRF9FSVAgKCBJSF9PRkZTRVRfT0xEX0VJUCAtIDM2ICkKKyNkZWZpbmUgSUhfT0ZGU0VUX0ZMVVhfRU5EICggSUhfT0ZGU0VUX0VORCAtIDIwICkKK2RvX2ludGVycnVwdDoKKwkvKiBTdG9yZSBDUFUgc3RhdGUgaW4gR0RCIHJlZ2lzdGVyIHNuYXBzaG90ICovCisJcHVzaHcJJDAKKwlwdXNodwklZ3MKKwlwdXNodwkkMAorCXB1c2h3CSVmcworCXB1c2h3CSQwCisJcHVzaHcJJWVzCisJcHVzaHcJJDAKKwlwdXNodwklZHMKKwlwdXNodwkkMAorCXB1c2h3CSVzcworCXB1c2h3CSQwCisJcHVzaHcJSUhfT0ZGU0VUX0ZMVVhfT0xEX0NTICsgMiglZXNwKQorCXB1c2hsCUlIX09GRlNFVF9GTFVYX09MRF9FRkxBR1MoJWVzcCkKKwlwdXNobAlJSF9PRkZTRVRfRkxVWF9PTERfRUlQKCVlc3ApCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJwCisJbGVhbAlJSF9PRkZTRVRfRkxVWF9FTkQoJWVzcCksICVlZGkKKwlwdXNobAklZWRpIC8qIG9sZCBFU1AgKi8KKwlwdXNobAklZWJ4CisJcHVzaGwJJWVkeAorCXB1c2hsCSVlY3gKKwlwdXNobAklZWF4CisKKwkvKiBDYWxsIEdEQiBzdHViIGV4Y2VwdGlvbiBoYW5kbGVyICovCisJcHVzaGwJJWVzcAorCXB1c2hsCShJSF9PRkZTRVRfU0lHTk8gKyA0KSglZXNwKQorCWNhbGwJZ2RibWFjaF9oYW5kbGVyCisJYWRkbAkkOCwgJWVzcAorCisJLyogUmVzdG9yZSBDUFUgc3RhdGUgZnJvbSBHREIgcmVnaXN0ZXIgc25hcHNob3QgKi8KKwlwb3BsCSVlYXgKKwlwb3BsCSVlY3gKKwlwb3BsCSVlZHgKKwlwb3BsCSVlYngKKwlhZGRsCSQ0LCAlZXNwIC8qIENoYW5naW5nIEVTUCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCAqLworCXBvcGwJJWVicAorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXBvcGwJSUhfT0ZGU0VUX0ZMVVhfT0xEX0VJUCglZXNwKQorCXBvcGwJSUhfT0ZGU0VUX0ZMVVhfT0xEX0VGTEFHUyglZXNwKQorCXBvcGwJSUhfT0ZGU0VUX0ZMVVhfT0xEX0NTKCVlc3ApCisJcG9wbAklc3MKKwlwb3BsCSVkcworCXBvcGwJJWVzCisJcG9wbAklZnMKKwlwb3BsCSVncworCisJYWRkbAkkNCwgJWVzcCAvKiBkcm9wIHNpZ25vICovCisJaXJldApkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvZ2RibWFjaC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvZ2RibWFjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODI3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9nZGJtYWNoLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU3RlZmFuIEhham5vY3ppIDxzdGVmYW5oYUBnbWFpbC5jb20+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2dkYnN0dWIuaD4KKyNpbmNsdWRlIDxnZGJtYWNoLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEdEQiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgYml0cyBmb3IgaTM4NgorICoKKyAqLworCitlbnVtIHsKKwlEUjdfQ0xFQVIgPSAweDAwMDAwNDAwLCAgICAvKiBkaXNhYmxlIGhhcmR3YXJlIGJyZWFrcG9pbnRzICovCisJRFI2X0NMRUFSID0gMHhmZmZmMGZmMCwgICAgLyogY2xlYXIgYnJlYWtwb2ludCBzdGF0dXMgKi8KK307CisKKy8qKiBIYXJkd2FyZSBicmVha3BvaW50LCBmaWVsZHMgc3RvcmVkIGluIHg4NiBiaXQgcGF0dGVybiBmb3JtICovCitzdHJ1Y3QgaHdicCB7CisJaW50IHR5cGU7ICAgICAgICAgICAvKiB0eXBlICgxPXdyaXRlIHdhdGNocG9pbnQsIDM9YWNjZXNzIHdhdGNocG9pbnQpICovCisJdW5zaWduZWQgbG9uZyBhZGRyOyAvKiBsaW5lYXIgYWRkcmVzcyAqLworCXNpemVfdCBsZW47ICAgICAgICAgLyogbGVuZ3RoICgwPTEtYnl0ZSwgMT0yLWJ5dGUsIDM9NC1ieXRlKSAqLworCWludCBlbmFibGVkOworfTsKKworc3RhdGljIHN0cnVjdCBod2JwIGh3YnBzIFsgNCBdOworc3RhdGljIGdkYnJlZ190IGRyNyA9IERSN19DTEVBUjsKKworc3RhdGljIHN0cnVjdCBod2JwICpnZGJtYWNoX2ZpbmRfaHdicCAoIGludCB0eXBlLCB1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGh3YnAgKmF2YWlsYWJsZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGk7CisJZm9yICggaSA9IDA7IGkgPCBzaXplb2YgaHdicHMgLyBzaXplb2YgaHdicHMgWyAwIF07IGkrKyApIHsKKwkJaWYgKCBod2JwcyBbIGkgXS50eXBlID09IHR5cGUgJiYgaHdicHMgWyBpIF0uYWRkciA9PSBhZGRyICYmIGh3YnBzIFsgaSBdLmxlbiA9PSBsZW4gKSB7CisJCQlyZXR1cm4gJmh3YnBzIFsgaSBdOworCQl9CisJCWlmICggIWh3YnBzIFsgaSBdLmVuYWJsZWQgKSB7CisJCQlhdmFpbGFibGUgPSAmaHdicHMgWyBpIF07CisJCX0KKwl9CisJcmV0dXJuIGF2YWlsYWJsZTsKK30KKworc3RhdGljIHZvaWQgZ2RibWFjaF9jb21taXRfaHdicCAoIHN0cnVjdCBod2JwICpicCApIHsKKwl1bnNpZ25lZCBpbnQgcmVnbnVtID0gYnAgLSBod2JwczsKKworCS8qIFNldCBicmVha3BvaW50IGFkZHJlc3MgKi8KKwlhc3NlcnQgKCByZWdudW0gPCAoIHNpemVvZiBod2JwcyAvIHNpemVvZiBod2JwcyBbIDAgXSApICk7CisJc3dpdGNoICggcmVnbnVtICkgeworCQljYXNlIDA6CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJtb3ZsICUwLCAlJWRyMFxuIiA6IDogInIiICggYnAtPmFkZHIgKSApOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICggIm1vdmwgJTAsICUlZHIxXG4iIDogOiAiciIgKCBicC0+YWRkciApICk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92bCAlMCwgJSVkcjJcbiIgOiA6ICJyIiAoIGJwLT5hZGRyICkgKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJtb3ZsICUwLCAlJWRyM1xuIiA6IDogInIiICggYnAtPmFkZHIgKSApOworCQkJYnJlYWs7CisJfQorCisJLyogU2V0IHR5cGUgKi8KKwlkcjcgJj0gfiggMHgzIDw8ICggMTYgKyA0ICogcmVnbnVtICkgKTsKKwlkcjcgfD0gYnAtPnR5cGUgPDwgKCAxNiArIDQgKiByZWdudW0gKTsKKworCS8qIFNldCBsZW5ndGggKi8KKwlkcjcgJj0gfiggMHgzIDw8ICggMTggKyA0ICogcmVnbnVtICkgKTsKKwlkcjcgfD0gYnAtPmxlbiA8PCAoIDE4ICsgNCAqIHJlZ251bSApOworCisJLyogU2V0L2NsZWFyIGxvY2FsIGVuYWJsZSBiaXQgKi8KKwlkcjcgJj0gfiggMHgzIDw8IDIgKiByZWdudW0gKTsKKyAJZHI3IHw9IGJwLT5lbmFibGVkIDw8IDIgKiByZWdudW07Cit9CisKK2ludCBnZGJtYWNoX3NldF9icmVha3BvaW50ICggaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbiwgaW50IGVuYWJsZSApIHsKKwlzdHJ1Y3QgaHdicCAqYnA7CisJCisJLyogQ2hlY2sgYW5kIGNvbnZlcnQgYnJlYWtwb2ludCB0eXBlIHRvIHg4NiB0eXBlICovCisJc3dpdGNoICggdHlwZSApIHsKKwkJY2FzZSBHREJNQUNIX1dBVENIOgorCQkJdHlwZSA9IDB4MTsKKwkJCWJyZWFrOworCQljYXNlIEdEQk1BQ0hfQVdBVENIOgorCQkJdHlwZSA9IDB4MzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7IC8qIHVuc3VwcG9ydGVkIGJyZWFrcG9pbnQgdHlwZSAqLworCX0KKworCS8qIE9ubHkgbGVuZ3RocyAxLCAyLCBhbmQgNCBhcmUgc3VwcG9ydGVkICovCisJaWYgKCBsZW4gIT0gMiAmJiBsZW4gIT0gNCApIHsKKwkJbGVuID0gMTsKKwl9CisJbGVuLS07IC8qIGNvbnZlcnQgdG8geDg2IGJyZWFrcG9pbnQgbGVuZ3RoIGJpdCBwYXR0ZXJuICovCisKKwkvKiBDYWxjdWxhdGUgbGluZWFyIGFkZHJlc3MgYnkgYWRkaW5nIHNlZ21lbnQgYmFzZSAqLworCWFkZHIgKz0gdmlydF9vZmZzZXQ7CisKKwkvKiBTZXQgdXAgdGhlIGJyZWFrcG9pbnQgKi8KKwlicCA9IGdkYm1hY2hfZmluZF9od2JwICggdHlwZSwgYWRkciwgbGVuICk7CisJaWYgKCAhYnAgKSB7CisJCXJldHVybiAwOyAvKiByYW4gb3V0IG9mIGhhcmR3YXJlIGJyZWFrcG9pbnRzICovCisJfQorCWJwLT50eXBlID0gdHlwZTsKKwlicC0+YWRkciA9IGFkZHI7CisJYnAtPmxlbiA9IGxlbjsKKwlicC0+ZW5hYmxlZCA9IGVuYWJsZTsKKwlnZGJtYWNoX2NvbW1pdF9od2JwICggYnAgKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZ2RibWFjaF9kaXNhYmxlX2h3YnBzICggdm9pZCApIHsKKwkvKiBTdG9yZSBhbmQgY2xlYXIgaGFyZHdhcmUgYnJlYWtwb2ludHMgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJtb3ZsICUwLCAlJWRyN1xuIiA6IDogInIiICggRFI3X0NMRUFSICkgKTsKK30KKworc3RhdGljIHZvaWQgZ2RibWFjaF9lbmFibGVfaHdicHMgKCB2b2lkICkgeworCS8qIENsZWFyIGJyZWFrcG9pbnQgc3RhdHVzIHJlZ2lzdGVyICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92bCAlMCwgJSVkcjZcbiIgOiA6ICJyIiAoIERSNl9DTEVBUiApICk7CisKKwkvKiBSZXN0b3JlIGhhcmR3YXJlIGJyZWFrcG9pbnRzICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92bCAlMCwgJSVkcjdcbiIgOiA6ICJyIiAoIGRyNyApICk7Cit9CisKK19fYXNtY2FsbCB2b2lkIGdkYm1hY2hfaGFuZGxlciAoIGludCBzaWdubywgZ2RicmVnX3QgKnJlZ3MgKSB7CisJZ2RibWFjaF9kaXNhYmxlX2h3YnBzKCk7CisJZ2Ric3R1Yl9oYW5kbGVyICggc2lnbm8sIHJlZ3MgKTsKKwlnZGJtYWNoX2VuYWJsZV9od2JwcygpOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvbnVsbHRyYXAuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL251bGx0cmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0NmZiZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL251bGx0cmFwLmMKQEAgLTAsMCArMSw1MSBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK19fYXR0cmlidXRlX18gKCggbm9yZXR1cm4sIHNlY3Rpb24gKCAiLnRleHQubnVsbF90cmFwIiApICkpCit2b2lkIG51bGxfZnVuY3Rpb25fdHJhcCAoIHZvaWQgKSB7CisJdm9pZCAqc3RhY2s7CisKKwkvKiAxMjggYnl0ZXMgb2YgTk9QczsgdGhlIGlkZWEgb2YgdGhpcyBpcyB0aGF0IGlmIHNvbWV0aGluZworCSAqIGRlcmVmZXJlbmNlcyBhIE5VTEwgcG9pbnRlciBhbmQgb3ZlcndyaXRlcyB1cywgd2UgYXQgbGVhc3QKKwkgKiBoYXZlIHNvbWUgY2hhbmNlIG9mIHN0aWxsIGdldHRpbmcgdG8gZXhlY3V0ZSB0aGUgcHJpbnRmKCkKKwkgKiBzdGF0ZW1lbnQuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJub3AgOyBub3AgOyBub3AgOyBub3AiICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibm9wIDsgbm9wIDsgbm9wIDsgbm9wIiApOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm5vcCA7IG5vcCA7IG5vcCA7IG5vcCIgKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm1vdmwgJSVlc3AsICUwIiA6ICI9ciIgKCBzdGFjayApICk7CisJcHJpbnRmICggIk5VTEwgbWV0aG9kIGNhbGxlZCBmcm9tICVwIChzdGFjayAlcClcbiIsIAorCQkgX19idWlsdGluX3JldHVybl9hZGRyZXNzICggMCApLCBzdGFjayApOworCURCR19IRCAoIHN0YWNrLCAyNTYgKTsKKwl3aGlsZSAoIDEgKSB7fQorfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvcGljODI1OS5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvcGljODI1OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmQyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9waWM4MjU5LmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxwaWM4MjU5Lmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE1pbmltYWwgc3VwcG9ydCBmb3IgdGhlIDgyNTkgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyCisgKgorICovCisKKy8qKgorICogU2VuZCBub24tc3BlY2lmaWMgRU9JKHMpCisgKgorICogQHYgaXJxCQlJUlEgbnVtYmVyCisgKgorICogVGhpcyBzZWVtcyB0byBiZSBpbmhlcmVudGx5IHVuc2FmZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNlbmRfbm9uc3BlY2lmaWNfZW9pICggdW5zaWduZWQgaW50IGlycSApIHsKKwlEQkcgKCAiU2VuZGluZyBub24tc3BlY2lmaWMgRU9JIGZvciBJUlEgJWRcbiIsIGlycSApOworCWlmICggaXJxID49IElSUV9QSUNfQ1VUT0ZGICkgeworCQlvdXRiICggSUNSX0VPSV9OT05fU1BFQ0lGSUMsIFBJQzJfSUNSICk7CisJfQkJCisJb3V0YiAoIElDUl9FT0lfTk9OX1NQRUNJRklDLCBQSUMxX0lDUiApOworfQorCisvKioKKyAqIFNlbmQgc3BlY2lmaWMgRU9JKHMpCisgKgorICogQHYgaXJxCQlJUlEgbnVtYmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX3NwZWNpZmljX2VvaSAoIHVuc2lnbmVkIGludCBpcnEgKSB7CisJREJHICggIlNlbmRpbmcgc3BlY2lmaWMgRU9JIGZvciBJUlEgJWRcbiIsIGlycSApOworCWlmICggaXJxID49IElSUV9QSUNfQ1VUT0ZGICkgeworCQlvdXRiICggKCBJQ1JfRU9JX1NQRUNJRklDIHwgSUNSX1ZBTFVFICggQ0hBSU5FRF9JUlEgKSApLAorCQkgICAgICAgSUNSX1JFRyAoIENIQUlORURfSVJRICkgKTsKKwl9CisJb3V0YiAoICggSUNSX0VPSV9TUEVDSUZJQyB8IElDUl9WQUxVRSAoIGlycSApICksIElDUl9SRUcgKCBpcnEgKSApOworfQorCisvKioKKyAqIFNlbmQgRW5kLU9mLUludGVycnVwdCB0byB0aGUgUElDCisgKgorICogQHYgaXJxCQlJUlEgbnVtYmVyCisgKi8KK3ZvaWQgc2VuZF9lb2kgKCB1bnNpZ25lZCBpbnQgaXJxICkgeworCXNlbmRfc3BlY2lmaWNfZW9pICggaXJxICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9yZHRzY190aW1lci5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvcmR0c2NfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjY3OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvcmR0c2NfdGltZXIuYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogQGZpbGUKKyAqCisgKiBSRFRTQyB0aW1lcgorICoKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorI2luY2x1ZGUgPGdweGUvdGltZXIyLmg+CisKKy8qKgorICogTnVtYmVyIG9mIFRTQyB0aWNrcyBwZXIgbWljcm9zZWNvbmQKKyAqCisgKiBUaGlzIGlzIGNhbGlicmF0ZWQgb24gdGhlIGZpcnN0IHVzZSBvZiB0aGUgdGltZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJkdHNjX3RpY2tzX3Blcl91c2VjOworCisvKioKKyAqIERlbGF5IGZvciBhIGZpeGVkIG51bWJlciBvZiBtaWNyb3NlY29uZHMKKyAqCisgKiBAdiB1c2VjcwkJTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBmb3Igd2hpY2ggdG8gZGVsYXkKKyAqLworc3RhdGljIHZvaWQgcmR0c2NfdWRlbGF5ICggdW5zaWduZWQgbG9uZyB1c2VjcyApIHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZDsKKworCS8qIFNhbml0eSBndWFyZCwgc2luY2Ugd2UgbWF5IGRpdmlkZSBieSB0aGlzICovCisJaWYgKCAhIHVzZWNzICkKKwkJdXNlY3MgPSAxOworCisJc3RhcnQgPSBjdXJydGlja3MoKTsKKwlpZiAoIHJkdHNjX3RpY2tzX3Blcl91c2VjICkgeworCQkvKiBBbHJlYWR5IGNhbGlicmF0ZWQ7IGJ1c3ktd2FpdCB1bnRpbCBkb25lICovCisJCWRvIHsKKwkJCWVsYXBzZWQgPSAoIGN1cnJ0aWNrcygpIC0gc3RhcnQgKTsKKwkJfSB3aGlsZSAoIGVsYXBzZWQgPCAoIHVzZWNzICogcmR0c2NfdGlja3NfcGVyX3VzZWMgKSApOworCX0gZWxzZSB7CisJCS8qIE5vdCB5ZXQgY2FsaWJyYXRlZDsgdXNlIHRpbWVyMiBhbmQgY2FsaWJyYXRlCisJCSAqIGJhc2VkIG9uIHJlc3VsdC4KKwkJICovCisJCXRpbWVyMl91ZGVsYXkgKCB1c2VjcyApOworCQllbGFwc2VkID0gKCBjdXJydGlja3MoKSAtIHN0YXJ0ICk7CisJCXJkdHNjX3RpY2tzX3Blcl91c2VjID0gKCBlbGFwc2VkIC8gdXNlY3MgKTsKKwkJREJHICggIlJEVFNDIHRpbWVyIGNhbGlicmF0ZWQ6ICVsZCB0aWNrcyBpbiAlbGQgdXNlY3MgIgorCQkgICAgICAiKCVsZCBNSHopXG4iLCBlbGFwc2VkLCB1c2VjcywKKwkJICAgICAgKCByZHRzY190aWNrc19wZXJfdXNlYyA8PCBUU0NfU0hJRlQgKSApOworCX0KK30KKworLyoqCisgKiBHZXQgbnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQKKyAqCisgKiBAcmV0IHRpY2tzX3Blcl9zZWMJTnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmR0c2NfdGlja3NfcGVyX3NlYyAoIHZvaWQgKSB7CisKKwkvKiBDYWxpYnJhdGUgdGltZXIsIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKwlpZiAoICEgcmR0c2NfdGlja3NfcGVyX3VzZWMgKQorCQl1ZGVsYXkgKCAxICk7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlhc3NlcnQgKCByZHRzY190aWNrc19wZXJfdXNlYyAhPSAwICk7CisKKwlyZXR1cm4gKCByZHRzY190aWNrc19wZXJfdXNlYyAqIDEwMDAgKiAxMDAwICk7Cit9CisKK1BST1ZJREVfVElNRVIgKCByZHRzYywgdWRlbGF5LCByZHRzY191ZGVsYXkgKTsKK1BST1ZJREVfVElNRVJfSU5MSU5FICggcmR0c2MsIGN1cnJ0aWNrcyApOworUFJPVklERV9USU1FUiAoIHJkdHNjLCB0aWNrc19wZXJfc2VjLCByZHRzY190aWNrc19wZXJfc2VjICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9yZWxvY2F0ZS5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvcmVsb2NhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGU3NjRmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvcmVsb2NhdGUuYwpAQCAtMCwwICsxLDE3MCBAQAorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxyZWdpc3RlcnMuaD4KKyNpbmNsdWRlIDxncHhlL21lbW1hcC5oPgorCisvKgorICogT3JpZ2luYWxseSBieSBFcmljIEJpZWRlcm1hbgorICoKKyAqIEhlYXZpbHkgbW9kaWZpZWQgYnkgTWljaGFlbCBCcm93biAKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKgorICogVGhlIGxpbmtlciBwYXNzZXMgaW4gdGhlIHN5bWJvbCBfbWF4X2FsaWduLCB3aGljaCBpcyB0aGUgYWxpZ25tZW50CisgKiB0aGF0IHdlIG11c3QgcHJlc2VydmUsIGluIGJ5dGVzLgorICoKKyAqLworZXh0ZXJuIGNoYXIgX21heF9hbGlnbltdOworI2RlZmluZSBtYXhfYWxpZ24gKCAoIHVuc2lnbmVkIGludCApIF9tYXhfYWxpZ24gKQorCisvKiBMaW5rZXIgc3ltYm9scyAqLworZXh0ZXJuIGNoYXIgX3RleHRkYXRhW107CitleHRlcm4gY2hhciBfZXRleHRkYXRhW107CisKKy8qIHdpdGhpbiAxTUIgb2YgNEdCIGlzIHRvbyBjbG9zZS4gCisgKiBNQVhfQUREUiBpcyB0aGUgbWF4aW11bSBhZGRyZXNzIHdlIGNhbiBlYXNpbHkgZG8gRE1BIHRvLgorICoKKyAqIE5vdCBzdXJlIHdoZXJlIHRoaXMgY29uc3RyYWludCBjb21lcyBmcm9tLCBidXQga2VwdCBpdCBmcm9tIEVyaWMncworICogb2xkIGNvZGUgLSBtY2IzMAorICovCisjZGVmaW5lIE1BWF9BRERSICgweGZmZjAwMDAwVUwpCisKKy8qKgorICogUmVsb2NhdGUgRXRoZXJib290CisgKgorICogQHYgaXg4NgkJeDg2IHJlZ2lzdGVyIGR1bXAgZnJvbSBwcmVmaXgKKyAqIEByZXQgaXg4NgkJeDg2IHJlZ2lzdGVycyB0byByZXR1cm4gdG8gcHJlZml4CisgKgorICogVGhpcyBmaW5kcyBhIHN1aXRhYmxlIGxvY2F0aW9uIGZvciBFdGhlcmJvb3QgbmVhciB0aGUgdG9wIG9mIDMyLWJpdAorICogYWRkcmVzcyBzcGFjZSwgYW5kIHJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG5ldyBsb2NhdGlvbgorICogdG8gdGhlIHByZWZpeCBpbiAlZWRpLgorICovCitfX2FzbWNhbGwgdm9pZCByZWxvY2F0ZSAoIHN0cnVjdCBpMzg2X2FsbF9yZWdzICppeDg2ICkgeworCXN0cnVjdCBtZW1vcnlfbWFwIG1lbW1hcDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQsIHNpemUsIHBhZGRlZF9zaXplOworCXVuc2lnbmVkIGxvbmcgbmV3X3N0YXJ0LCBuZXdfZW5kOworCXVuc2lnbmVkIGk7CisKKwkvKiBHZXQgbWVtb3J5IG1hcCBhbmQgY3VycmVudCBsb2NhdGlvbiAqLworCWdldF9tZW1tYXAgKCAmbWVtbWFwICk7CisJc3RhcnQgPSB2aXJ0X3RvX3BoeXMgKCBfdGV4dGRhdGEgKTsKKwllbmQgPSB2aXJ0X3RvX3BoeXMgKCBfZXRleHRkYXRhICk7CisJc2l6ZSA9ICggZW5kIC0gc3RhcnQgKTsKKwlwYWRkZWRfc2l6ZSA9ICggc2l6ZSArIG1heF9hbGlnbiAtIDEgKTsKKworCURCRyAoICJSZWxvY2F0ZTogY3VycmVudGx5IGF0IFslbHgsJWx4KVxuIgorCSAgICAgICIuLi5uZWVkICVseCBieXRlcyBmb3IgJWQtYnl0ZSBhbGlnbm1lbnRcbiIsCisJICAgICAgc3RhcnQsIGVuZCwgcGFkZGVkX3NpemUsIG1heF9hbGlnbiApOworCisJLyogV2FsayB0aHJvdWdoIHRoZSBtZW1vcnkgbWFwIGFuZCBmaW5kIHRoZSBoaWdoZXN0IGFkZHJlc3MKKwkgKiBiZWxvdyA0R0IgdGhhdCBldGhlcmJvb3Qgd2lsbCBmaXQgaW50by4gIEVuc3VyZSBldGhlcmJvb3QKKwkgKiBsaWVzIGVudGlyZWx5IHdpdGhpbiBhIHJhbmdlIHdpdGggQTIwPTAuICBUaGlzIG1lYW5zIHRoYXQKKwkgKiBldmVuIGlmIHNvbWV0aGluZyBzY3Jld3MgdXAgdGhlIHN0YXRlIG9mIHRoZSBBMjAgbGluZSwgdGhlCisJICogZXRoZXJib290IGNvZGUgaXMgc3RpbGwgdmlzaWJsZSBhbmQgd2UgaGF2ZSBhIGNoYW5jZSB0bworCSAqIGRpYWdub3NlIHRoZSBwcm9ibGVtLgorCSAqLworCW5ld19lbmQgPSBlbmQ7CisJZm9yICggaSA9IDAgOyBpIDwgbWVtbWFwLmNvdW50IDsgaSsrICkgeworCQlzdHJ1Y3QgbWVtb3J5X3JlZ2lvbiAqcmVnaW9uID0gJm1lbW1hcC5yZWdpb25zW2ldOworCQl1bnNpZ25lZCBsb25nIHJfc3RhcnQsIHJfZW5kOworCisJCURCRyAoICJDb25zaWRlcmluZyBbJWxseCwlbGx4KVxuIiwgcmVnaW9uLT5zdGFydCwgcmVnaW9uLT5lbmQpOworCQkKKwkJLyogVHJ1bmNhdGUgYmxvY2sgdG8gTUFYX0FERFIuICBUaGlzIHdpbGwgYmUgbGVzcyB0aGFuCisJCSAqIDRHQiwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCB1c2luZworCQkgKiBqdXN0IDMyLWJpdCBhcml0aG1ldGljIGFmdGVyIHRoaXMgc3RhZ2UuCisJCSAqLworCQlpZiAoIHJlZ2lvbi0+c3RhcnQgPiBNQVhfQUREUiApIHsKKwkJCURCRyAoICIuLi5zdGFydHMgYWZ0ZXIgTUFYX0FERFI9JWx4XG4iLCBNQVhfQUREUiApOworCQkJY29udGludWU7CisJCX0KKwkJcl9zdGFydCA9IHJlZ2lvbi0+c3RhcnQ7CisJCWlmICggcmVnaW9uLT5lbmQgPiBNQVhfQUREUiApIHsKKwkJCURCRyAoICIuLi5lbmQgdHJ1bmNhdGVkIHRvIE1BWF9BRERSPSVseFxuIiwgTUFYX0FERFIgKTsKKwkJCXJfZW5kID0gTUFYX0FERFI7CisJCX0gZWxzZSB7CisJCQlyX2VuZCA9IHJlZ2lvbi0+ZW5kOworCQl9CisJCQorCQkvKiBTaHJpbmsgdGhlIHJhbmdlIGRvd24gdG8gdXNlIG9ubHkgZXZlbiBtZWdhYnl0ZXMKKwkJICogKGkuZS4gQTIwPTApLgorCQkgKi8KKwkJaWYgKCAoIHJfZW5kIC0gMSApICYgMHgxMDAwMDAgKSB7CisJCQkvKiBJZiBsYXN0IGJ5dGUgdGhhdCBtaWdodCBiZSB1c2VkIChyX2VuZC0xKQorCQkJICogaXMgaW4gYW4gb2RkIG1lZ2FieXRlLCByb3VuZCBkb3duIHJfZW5kIHRvCisJCQkgKiB0aGUgdG9wIG9mIHRoZSBuZXh0IGV2ZW4gbWVnYWJ5dGUuCisJCQkgKgorCQkJICogTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IHdyYXAKKwkJCSAqIHJfZW5kIGJlbG93IDAuCisJCQkgKi8KKwkJCWlmICggcl9lbmQgPj0gMSApIHsKKwkJCQlyX2VuZCA9ICggcl9lbmQgLSAxICkgJiB+MHhmZmZmZjsKKwkJCQlEQkcgKCAiLi4uZW5kIHRydW5jYXRlZCB0byAlbHggIgorCQkJCSAgICAgICIoYXZvaWQgZW5kaW5nIGluIG9kZCBtZWdhYnl0ZSlcbiIsCisJCQkJICAgICAgcl9lbmQgKTsKKwkJCX0KKwkJfSBlbHNlIGlmICggKCByX2VuZCAtIHNpemUgKSAmIDB4MTAwMDAwICkgeworCQkJLyogSWYgdGhlIGxhc3QgYnl0ZSB0aGF0IG1pZ2h0IGJlIHVzZWQKKwkJCSAqIChyX2VuZC0xKSBpcyBpbiBhbiBldmVuIG1lZ2FieXRlLCBidXQgdGhlCisJCQkgKiBmaXJzdCBieXRlIHRoYXQgbWlnaHQgYmUgdXNlZCAocl9lbmQtc2l6ZSkKKwkJCSAqIGlzIGFuIG9kZCBtZWdhYnl0ZSwgcm91bmQgZG93biB0byB0aGUgdG9wCisJCQkgKiBvZiB0aGUgbmV4dCBldmVuIG1lZ2FieXRlLgorCQkJICogCisJCQkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBhY2NpZGVudGFsbHkgd3JhcAorCQkJICogcl9lbmQgYmVsb3cgMC4KKwkJCSAqLworCQkJaWYgKCByX2VuZCA+PSAweDEwMDAwMCApIHsKKwkJCQlyX2VuZCA9ICggcl9lbmQgLSAweDEwMDAwMCApICYgfjB4ZmZmZmY7CisJCQkJREJHICggIi4uLmVuZCB0cnVuY2F0ZWQgdG8gJWx4ICIKKwkJCQkgICAgICAiKGF2b2lkIHN0YXJ0aW5nIGluIG9kZCBtZWdhYnl0ZSlcbiIsCisJCQkJICAgICAgcl9lbmQgKTsKKwkJCX0KKwkJfQorCisJCURCRyAoICIuLi51c2FibGUgcG9ydGlvbiBpcyBbJWx4LCVseClcbiIsIHJfc3RhcnQsIHJfZW5kICk7CisKKwkJLyogSWYgd2UgaGF2ZSByb3VuZGVkIGRvd24gcl9lbmQgYmVsb3cgcl8gc3RhcnQsIHNraXAKKwkJICogdGhpcyBibG9jay4KKwkJICovCisJCWlmICggcl9lbmQgPCByX3N0YXJ0ICkgeworCQkJREJHICggIi4uLnRydW5jYXRlZCB0byBuZWdhdGl2ZSBzaXplXG4iICk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIGZpdCBpbiBFdGhlcmJvb3QgKi8KKwkJaWYgKCAoIHJfZW5kIC0gcl9zdGFydCApIDwgc2l6ZSApIHsKKwkJCURCRyAoICIuLi50b28gc21hbGwgKG5lZWQgJWx4IGJ5dGVzKVxuIiwgc2l6ZSApOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZiB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgRXRoZXJib290IHdlIHdvdWxkCisJCSAqIHBsYWNlIGluIHRoaXMgYmxvY2sgaXMgaGlnaGVyIHRoYW4gdGhlIGVuZCBhZGRyZXNzCisJCSAqIG9mIHRoZSBjdXJyZW50IGhpZ2hlc3QgYmxvY2ssIHVzZSB0aGlzIGJsb2NrLgorCQkgKgorCQkgKiBOb3RlIHRoYXQgdGhpcyBhdm9pZHMgb3ZlcmxhcHMgd2l0aCB0aGUgY3VycmVudAorCQkgKiBFdGhlcmJvb3QsIGFzIHdlbGwgYXMgY2hvb3NpbmcgdGhlIGhpZ2hlc3Qgb2YgYWxsCisJCSAqIHZpYWJsZSBibG9ja3MuCisJCSAqLworCQlpZiAoICggcl9lbmQgLSBzaXplICkgPiBuZXdfZW5kICkgeworCQkJbmV3X2VuZCA9IHJfZW5kOworCQkJREJHICggIi4uLm5ldyBiZXN0IGJsb2NrIGZvdW5kLlxuIiApOworCQl9CisJfQorCisJLyogQ2FsY3VsYXRlIG5ldyBsb2NhdGlvbiBvZiBFdGhlcmJvb3QsIGFuZCBhbGlnbiBpdCB0byB0aGUKKwkgKiByZXF1aXJlZCBhbGlnbmVtbnQuCisJICovCisJbmV3X3N0YXJ0ID0gbmV3X2VuZCAtIHBhZGRlZF9zaXplOworCW5ld19zdGFydCArPSAoIHN0YXJ0IC0gbmV3X3N0YXJ0ICkgJiAoIG1heF9hbGlnbiAtIDEgKTsKKwluZXdfZW5kID0gbmV3X3N0YXJ0ICsgc2l6ZTsKKworCURCRyAoICJSZWxvY2F0aW5nIGZyb20gWyVseCwlbHgpIHRvIFslbHgsJWx4KVxuIiwKKwkgICAgICBzdGFydCwgZW5kLCBuZXdfc3RhcnQsIG5ld19lbmQgKTsKKwkKKwkvKiBMZXQgcHJlZml4IGtub3cgd2hhdCB0byBjb3B5ICovCisJaXg4Ni0+cmVncy5lc2kgPSBzdGFydDsKKwlpeDg2LT5yZWdzLmVkaSA9IG5ld19zdGFydDsKKwlpeDg2LT5yZWdzLmVjeCA9IHNpemU7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9zZXRqbXAuUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNzI3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS9zZXRqbXAuUwpAQCAtMCwwICsxLDQyIEBACisvKiBzZXRqbXAgYW5kIGxvbmdqbXAuIFVzZSBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgZGVwcmVjYXRlZC4gKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApCisKKwkudGV4dAorCS5hcmNoIGkzODYKKwkuY29kZTMyCisJCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1NFVEpNUCAtIFNhdmUgc3RhY2sgY29udGV4dCBmb3Igbm9uLWxvY2FsIGdvdG8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS5nbG9ibAlzZXRqbXAKK3NldGptcDoKKwltb3ZsCTQoJWVzcCksJWVjeAkJLyogam1wYnVmICovCisJbW92bAkwKCVlc3ApLCVlZHgJCS8qIHJldHVybiBhZGRyZXNzICovCisJbW92bAklZWR4LDAoJWVjeCkKKwltb3ZsCSVlYngsNCglZWN4KQorCW1vdmwJJWVzcCw4KCVlY3gpCisJbW92bAklZWJwLDEyKCVlY3gpCisJbW92bAklZXNpLDE2KCVlY3gpCisJbW92bAklZWRpLDIwKCVlY3gpCisJbW92bAkkMCwlZWF4CisJcmV0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTE9OR0pNUCAtIE5vbi1sb2NhbCBqdW1wIHRvIGEgc2F2ZWQgc3RhY2sgY29udGV4dAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLmdsb2JsCWxvbmdqbXAKK2xvbmdqbXA6CisJbW92bAk0KCVlc3ApLCVlZHgJCS8qIGp1bXBidWYgKi8KKwltb3ZsCTgoJWVzcCksJWVheAkJLyogcmVzdWx0ICovCisJbW92bAkwKCVlZHgpLCVlY3gKKwltb3ZsCTQoJWVkeCksJWVieAorCW1vdmwJOCglZWR4KSwlZXNwCisJbW92bAkxMiglZWR4KSwlZWJwCisJbW92bAkxNiglZWR4KSwlZXNpCisJbW92bAkyMCglZWR4KSwlZWRpCisJY21wbAkkMCwlZWF4CisJam5lCTFmCisJbW92bAkkMSwlZWF4CisxOgltb3ZsCSVlY3gsMCglZXNwKQorCXJldApkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvc3RhY2suUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL3N0YWNrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3ZWMwZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL3N0YWNrLlMKQEAgLTAsMCArMSwxNSBAQAorRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApCisKKwkuYXJjaCBpMzg2CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnRlcm5hbCBzdGFjaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIuc3RhY2siLCAiYXciLCBAbm9iaXRzCisJLmFsaWduIDgKKwkuZ2xvYmwgX3N0YWNrCitfc3RhY2s6CisJLnNwYWNlIDQwOTYKKwkuZ2xvYmwgX2VzdGFjaworX2VzdGFjazoKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL3N0YWNrMTYuUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL3N0YWNrMTYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjNmMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvc3RhY2sxNi5TCkBAIC0wLDAgKzEsMTUgQEAKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKQorCisJLmFyY2ggaTM4NgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW50ZXJuYWwgc3RhY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnN0YWNrMTYiLCAiYXciLCBAbm9iaXRzCisJLmFsaWduIDgKKwkuZ2xvYmwgX3N0YWNrMTYKK19zdGFjazE2OgorCS5zcGFjZSA0MDk2CisJLmdsb2JsIF9lc3RhY2sxNgorX2VzdGFjazE2OgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvdGltZXIyLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS90aW1lcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc2YjJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvdGltZXIyLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIGFyY2gvaTM4Ni9jb3JlL2kzODZfdGltZXIuYworICoKKyAqIFVzZSB0aGUgIlN5c3RlbSBUaW1lciAyIiB0byBpbXBsZW1lbnQgdGhlIHVkZWxheSBjYWxsYmFjayBpbgorICogdGhlIEJJT1MgdGltZXIgZHJpdmVyLiBBbHNvIHVzZWQgdG8gY2FsaWJyYXRlIHRoZSBjbG9jayByYXRlCisgKiBpbiB0aGUgUlREU0MgdGltZXIgZHJpdmVyLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGdweGUvdGltZXIyLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorCisvKiBUaW1lcnMgdGljayBvdmVyIGF0IHRoaXMgcmF0ZSAqLworI2RlZmluZSBUSU1FUjJfVElDS1NfUEVSX1NFQwkxMTkzMTgwVQorCisvKiBQYXJhbGxlbCBQZXJpcGhlcmFsIENvbnRyb2xsZXIgUG9ydCBCICovCisjZGVmaW5lCVBQQ19QT1JUQgkweDYxCisKKy8qIE1lYW5pbmcgb2YgdGhlIHBvcnQgYml0cyAqLworI2RlZmluZQlQUENCX1QyT1VUCTB4MjAJLyogQml0IDUgKi8KKyNkZWZpbmUJUFBDQl9TUEtSCTB4MDIJLyogQml0IDEgKi8KKyNkZWZpbmUJUFBDQl9UMkdBVEUJMHgwMQkvKiBCaXQgMCAqLworCisvKiBQb3J0cyBmb3IgdGhlIDgyNTQgdGltZXIgY2hpcCAqLworI2RlZmluZQlUSU1FUjJfUE9SVAkweDQyCisjZGVmaW5lCVRJTUVSX01PREVfUE9SVAkweDQzCisKKy8qIE1lYW5pbmcgb2YgdGhlIG1vZGUgYml0cyAqLworI2RlZmluZQlUSU1FUjBfU0VMCTB4MDAKKyNkZWZpbmUJVElNRVIxX1NFTAkweDQwCisjZGVmaW5lCVRJTUVSMl9TRUwJMHg4MAorI2RlZmluZQlSRUFEQkFDS19TRUwJMHhDMAorCisjZGVmaW5lCUxBVENIX0NPVU5UCTB4MDAKKyNkZWZpbmUJTE9CWVRFX0FDQ0VTUwkweDEwCisjZGVmaW5lCUhJQllURV9BQ0NFU1MJMHgyMAorI2RlZmluZQlXT1JEX0FDQ0VTUwkweDMwCisKKyNkZWZpbmUJTU9ERTAJCTB4MDAKKyNkZWZpbmUJTU9ERTEJCTB4MDIKKyNkZWZpbmUJTU9ERTIJCTB4MDQKKyNkZWZpbmUJTU9ERTMJCTB4MDYKKyNkZWZpbmUJTU9ERTQJCTB4MDgKKyNkZWZpbmUJTU9ERTUJCTB4MEEKKworI2RlZmluZQlCSU5BUllfQ09VTlQJMHgwMAorI2RlZmluZQlCQ0RfQ09VTlQJMHgwMQorCitzdGF0aWMgdm9pZCBsb2FkX3RpbWVyMiAoIHVuc2lnbmVkIGludCB0aWNrcyApIHsKKwkvKgorCSAqIE5vdyBsZXQncyB0YWtlIGNhcmUgb2YgUFBDIGNoYW5uZWwgMgorCSAqCisJICogU2V0IHRoZSBHYXRlIGhpZ2gsIHByb2dyYW0gUFBDIGNoYW5uZWwgMiBmb3IgbW9kZSAwLAorCSAqIChpbnRlcnJ1cHQgb24gdGVybWluYWwgY291bnQgbW9kZSksIGJpbmFyeSBjb3VudCwKKwkgKiBsb2FkIDUgKiBMQVRDSCBjb3VudCwgKExTQiBhbmQgTVNCKSB0byBiZWdpbiBjb3VudGRvd24uCisJICoKKwkgKiBOb3RlIHNvbWUgaW1wbGVtZW50YXRpb25zIGhhdmUgYSBidWcgd2hlcmUgdGhlIGhpZ2ggYml0cyBieXRlCisJICogb2YgY2hhbm5lbCAyIGlzIGlnbm9yZWQuCisJICovCisJLyogU2V0IHVwIHRoZSB0aW1lciBnYXRlLCB0dXJuIG9mZiB0aGUgc3BlYWtlciAqLworCS8qIFNldCB0aGUgR2F0ZSBoaWdoLCBkaXNhYmxlIHNwZWFrZXIgKi8KKwlvdXRiKChpbmIoUFBDX1BPUlRCKSAmIH5QUENCX1NQS1IpIHwgUFBDQl9UMkdBVEUsIFBQQ19QT1JUQik7CisJLyogYmluYXJ5LCBtb2RlIDAsIExTQi9NU0IsIENoIDIgKi8KKwlvdXRiKFRJTUVSMl9TRUx8V09SRF9BQ0NFU1N8TU9ERTB8QklOQVJZX0NPVU5ULCBUSU1FUl9NT0RFX1BPUlQpOworCS8qIExTQiBvZiB0aWNrcyAqLworCW91dGIodGlja3MgJiAweEZGLCBUSU1FUjJfUE9SVCk7CisJLyogTVNCIG9mIHRpY2tzICovCisJb3V0Yih0aWNrcyA+PiA4LCBUSU1FUjJfUE9SVCk7Cit9CisKK3N0YXRpYyBpbnQgdGltZXIyX3J1bm5pbmcgKCB2b2lkICkgeworCXJldHVybiAoKGluYihQUENfUE9SVEIpICYgUFBDQl9UMk9VVCkgPT0gMCk7Cit9CisKK3ZvaWQgdGltZXIyX3VkZWxheSAoIHVuc2lnbmVkIGxvbmcgdXNlY3MgKSB7CisJbG9hZF90aW1lcjIgKCAoIHVzZWNzICogVElNRVIyX1RJQ0tTX1BFUl9TRUMgKSAvICggMTAwMCAqIDEwMDAgKSApOworCXdoaWxlICh0aW1lcjJfcnVubmluZygpKSB7CisJCS8qIERvIG5vdGhpbmcgKi8KKwl9Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS92aWRlb19zdWJyLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS92aWRlb19zdWJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyMWNkMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL3ZpZGVvX3N1YnIuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqCisgKiBtb2RpZmllZCBmcm9tIGxpbnV4YmlvcyBjb2RlCisgKiBieSBDYWkgUWlhbmcgPHJpbXkyMDAwQGhvdG1haWwuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAic3RkZGVmLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorI2luY2x1ZGUgImNvbnNvbGUuaCIKKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKyNpbmNsdWRlICJ2Z2EuaCIKKworc3RydWN0IGNvbnNvbGVfZHJpdmVyIHZnYV9jb25zb2xlOworCitzdGF0aWMgY2hhciAqdmlkbWVtOwkJLyogVGhlIHZpZGVvIGJ1ZmZlciAqLworc3RhdGljIGludCB2aWRlb19saW5lLCB2aWRlb19jb2w7CisKKyNkZWZpbmUgVklEQlVGRkVSIDB4QjgwMDAJCisKK3N0YXRpYyB2b2lkIG1lbXNldHcodm9pZCAqcywgaW50IGMsIHVuc2lnbmVkIGludCBuKQoreworCXVuc2lnbmVkIGludCBpOworCXUxNiAqc3MgPSAodTE2ICopIHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXNzW2ldID0gKCB1MTYgKSBjOworCX0KK30KKworc3RhdGljIHZvaWQgdmlkZW9faW5pdCh2b2lkKQoreworCXN0YXRpYyBpbnQgaW5pdGVkPTA7CisKKwl2aWRtZW0gPSAoY2hhciAqKXBoeXNfdG9fdmlydChWSURCVUZGRVIpOworCisJaWYgKCFpbml0ZWQpIHsKKwkJdmlkZW9fbGluZSA9IDA7CisJCXZpZGVvX2NvbCA9IDA7CisJCisJIAltZW1zZXR3KHZpZG1lbSwgVkdBX0FUVFJfQ0xSX1dIVCwgMioxMDI0KTsgLy8KKworCQlpbml0ZWQ9MTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZpZGVvX3Njcm9sbCh2b2lkKQoreworCWludCBpOworCisJbWVtY3B5KHZpZG1lbSwgdmlkbWVtICsgQ09MUyAqIDIsIChMSU5FUyAtIDEpICogQ09MUyAqIDIpOworCWZvciAoaSA9IChMSU5FUyAtIDEpICogQ09MUyAqIDI7IGkgPCBMSU5FUyAqIENPTFMgKiAyOyBpICs9IDIpCisJCXZpZG1lbVtpXSA9ICcgJzsKK30KKworc3RhdGljIHZvaWQgdmdhX3B1dGMoaW50IGJ5dGUpCit7CisJaWYgKGJ5dGUgPT0gJ1xuJykgeworCQl2aWRlb19saW5lKys7CisJCXZpZGVvX2NvbCA9IDA7CisKKwl9IGVsc2UgaWYgKGJ5dGUgPT0gJ1xyJykgeworCQl2aWRlb19jb2wgPSAwOworCisJfSBlbHNlIGlmIChieXRlID09ICdcYicpIHsKKwkJdmlkZW9fY29sLS07CisKKwl9IGVsc2UgaWYgKGJ5dGUgPT0gJ1x0JykgeworCQl2aWRlb19jb2wgKz0gNDsKKworCX0gZWxzZSBpZiAoYnl0ZSA9PSAnXGEnKSB7CisJCS8vYmVlcAorCQkvL2JlZXAoNTAwKTsKKworCX0gZWxzZSB7CisJCXZpZG1lbVsoKHZpZGVvX2NvbCArICh2aWRlb19saW5lICpDT0xTKSkgKiAyKV0gPSBieXRlOworCQl2aWRtZW1bKCh2aWRlb19jb2wgKyAodmlkZW9fbGluZSAqQ09MUykpICogMikgKzFdID0gVkdBX0FUVFJfQ0xSX1dIVDsKKwkJdmlkZW9fY29sKys7CisJfQorCWlmICh2aWRlb19jb2wgPCAwKSB7CisJCXZpZGVvX2NvbCA9IDA7CisJfQorCWlmICh2aWRlb19jb2wgPj0gQ09MUykgeworCQl2aWRlb19saW5lKys7CisJCXZpZGVvX2NvbCA9IDA7CisJfQorCWlmICh2aWRlb19saW5lID49IExJTkVTKSB7CisJCXZpZGVvX3Njcm9sbCgpOworCQl2aWRlb19saW5lLS07CisJfQorCS8vIG1vdmUgdGhlIGN1cnNvcgorCXdyaXRlX2NydGMoKHZpZGVvX2NvbCArICh2aWRlb19saW5lICpDT0xTKSkgPj4gOCwgQ1JUQ19DVVJTT1JfSEkpOworCXdyaXRlX2NydGMoKHZpZGVvX2NvbCArICh2aWRlb19saW5lICpDT0xTKSkgJiAweDBmZiwgQ1JUQ19DVVJTT1JfTE8pOworfQorCitzdHJ1Y3QgY29uc29sZV9kcml2ZXIgdmdhX2NvbnNvbGUgX19jb25zb2xlX2RyaXZlciA9IHsKKwkucHV0Y2hhciA9IHZnYV9wdXRjLAorCS5kaXNhYmxlZCA9IDEsCit9OworCitzdHJ1Y3QgaW5pdF9mbiB2aWRlb19pbml0X2ZuIF9faW5pdF9mbiAoIElOSVRfRUFSTFkgKSA9IHsKKwkuaW5pdGlhbGlzZSA9IHZpZGVvX2luaXQsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvdmlydGFkZHIuUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL3ZpcnRhZGRyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlMWUxZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9jb3JlL3ZpcnRhZGRyLlMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBGdW5jdGlvbnMgdG8gc3VwcG9ydCB0aGUgdmlydHVhbCBhZGRyZXNzaW5nIG1ldGhvZCBvZiByZWxvY2F0aW9uCisgKiB0aGF0IEV0aGVyYm9vdCB1c2VzLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICkKKworI2luY2x1ZGUgImxpYnJtLmgiCisJCQorCS5hcmNoIGkzODYKKwkudGV4dAorCS5jb2RlMzIKKwkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBfdmlydF90b19waHlzICh2aXJ0dWFsIGFkZHJlc3NpbmcpCisgKgorICogU3dpdGNoIGZyb20gdmlydHVhbCB0byBmbGF0IHBoeXNpY2FsIGFkZHJlc3Nlcy4gICVlc3AgaXMgYWRqdXN0ZWQKKyAqIHRvIGEgcGh5c2ljYWwgdmFsdWUuICBTZWdtZW50IHJlZ2lzdGVycyBhcmUgc2V0IHRvIGZsYXQgcGh5c2ljYWwKKyAqIHNlbGVjdG9ycy4gIEFsbCBvdGhlciByZWdpc3RlcnMgYXJlIHByZXNlcnZlZC4gIEZsYWdzIGFyZQorICogcHJlc2VydmVkLgorICoKKyAqIFBhcmFtZXRlcnM6IG5vbmUKKyAqIFJldHVybnM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuZ2xvYmwgX3ZpcnRfdG9fcGh5cworX3ZpcnRfdG9fcGh5czoKKwkvKiBQcmVzZXJ2ZSByZWdpc3RlcnMgYW5kIGZsYWdzICovCisJcHVzaGZsCisJcHVzaGwJJWVheAorCXB1c2hsCSVlYnAKKworCS8qIENoYW5nZSByZXR1cm4gYWRkcmVzcyB0byBhIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwltb3ZsCXZpcnRfb2Zmc2V0LCAlZWJwCisJYWRkbAklZWJwLCAxMiglZXNwKQorCisJLyogU3dpdGNoIHRvIHBoeXNpY2FsIGNvZGUgc2VnbWVudCAqLworCXB1c2hsCSRQSFlTSUNBTF9DUworCWxlYWwJMWYoJWVicCksICVlYXgKKwlwdXNobAklZWF4CisJbHJldAorMToKKwkvKiBSZWxvYWQgb3RoZXIgc2VnbWVudCByZWdpc3RlcnMgYW5kIGFkanVzdCAlZXNwICovCisJbW92bAkkUEhZU0lDQUxfRFMsICVlYXgKKwltb3ZsCSVlYXgsICVkcworCW1vdmwJJWVheCwgJWVzCQorCW1vdmwJJWVheCwgJWZzCQorCW1vdmwJJWVheCwgJWdzCisJbW92bAklZWF4LCAlc3MJCisJYWRkbAklZWJwLCAlZXNwCisKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgZmxhZ3MsIGFuZCByZXR1cm4gKi8KKwlwb3BsCSVlYnAKKwlwb3BsCSVlYXgKKwlwb3BmbAorCXJldAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogX3BoeXNfdG9fdmlydCAoZmxhdCBwaHlzaWNhbCBhZGRyZXNzaW5nKQorICoKKyAqIFN3aXRjaCBmcm9tIGZsYXQgcGh5c2ljYWwgdG8gdmlydHVhbCBhZGRyZXNzZXMuICAlZXNwIGlzIGFkanVzdGVkCisgKiB0byBhIHZpcnR1YWwgdmFsdWUuICBTZWdtZW50IHJlZ2lzdGVycyBhcmUgc2V0IHRvIHZpcnR1YWwKKyAqIHNlbGVjdG9ycy4gIEFsbCBvdGhlciByZWdpc3RlcnMgYXJlIHByZXNlcnZlZC4gIEZsYWdzIGFyZQorICogcHJlc2VydmVkLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGRlcGVuZHMgb24gdGhlIEdEVCBhbHJlYWR5IGJlaW5nIGNvcnJlY3RseSBzZXQgdXAKKyAqIChlLmcuIGJ5IGEgY2FsbCB0byBydW5faGVyZSgpKS4KKyAqCisgKiBQYXJhbWV0ZXJzOiBub25lCisgKiBSZXR1cm5zOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLmdsb2JsIF9waHlzX3RvX3ZpcnQKK19waHlzX3RvX3ZpcnQ6CisJLyogUHJlc2VydmUgcmVnaXN0ZXJzIGFuZCBmbGFncyAqLworCXB1c2hmbAorCXB1c2hsCSVlYXgKKwlwdXNobAklZWJwCisKKwkvKiBTd2l0Y2ggdG8gdmlydHVhbCBjb2RlIHNlZ21lbnQgKi8KKwlsam1wCSRWSVJUVUFMX0NTLCAkMWYKKzE6CQorCS8qIFJlbG9hZCBkYXRhIHNlZ21lbnQgcmVnaXN0ZXJzICovCisJbW92bAkkVklSVFVBTF9EUywgJWVheAorCW1vdmwJJWVheCwgJWRzCisJbW92bAklZWF4LCAlZXMJCisJbW92bAklZWF4LCAlZnMJCisJbW92bAklZWF4LCAlZ3MKKworCS8qIFJlbG9hZCBzdGFjayBzZWdtZW50IGFuZCBhZGp1c3QgJWVzcCAqLworCW1vdmwJdmlydF9vZmZzZXQsICVlYnAKKwltb3ZsCSVlYXgsICVzcwkKKwlzdWJsCSVlYnAsICVlc3AKKworCS8qIENoYW5nZSB0aGUgcmV0dXJuIGFkZHJlc3MgdG8gYSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlzdWJsCSVlYnAsIDEyKCVlc3ApCisKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgZmxhZ3MsIGFuZCByZXR1cm4gKi8KKwlwb3BsCSVlYnAKKwlwb3BsCSVlYXgKKwlwb3BmbAorCXJldApkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvd2luY2VfbG9hZGVyLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS93aW5jZV9sb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDUyYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUvd2luY2VfbG9hZGVyLmMKQEAgLTAsMCArMSwyNzMgQEAKKyNkZWZpbmUgTE9BRF9ERUJVRwkwCisKK3N0YXRpYyBpbnQgZ2V0X3hfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbm93KTsKK3N0YXRpYyB2b2lkIGp1bXBfMmVwKCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBjZV9zaWduYXR1cmVbXSA9IHsnQicsICcwJywgJzAnLCAnMCcsICdGJywgJ0YnLCAnXG4nLH07CitzdGF0aWMgY2hhciAqKiBlcDsKKworI2RlZmluZSBCT09UX0FSR19QVFJfTE9DQVRJT04gMHgwMDFGRkZGQworCit0eXBlZGVmIHN0cnVjdCBfQk9PVF9BUkdTeworCXVuc2lnbmVkIGNoYXIgdWNWaWRlb01vZGU7CisJdW5zaWduZWQgY2hhciB1Y0NvbVBvcnQ7CisJdW5zaWduZWQgY2hhciB1Y0JhdWREaXZpc29yOworCXVuc2lnbmVkIGNoYXIgdWNQQ0lDb25maWdUeXBlOworCQorCXVuc2lnbmVkIGxvbmcgZHdTaWc7CisJI2RlZmluZSBCT09UQVJHX1NJRyAweDU0NEY0RjQyCisJdW5zaWduZWQgbG9uZyBkd0xlbjsKKwkKKwl1bnNpZ25lZCBjaGFyIHVjTG9hZGVyRmxhZ3M7CisJdW5zaWduZWQgY2hhciB1Y0VzaGVsbEZsYWdzOworCXVuc2lnbmVkIGNoYXIgdWNFZGJnQWRhcHRlclR5cGU7CisJdW5zaWduZWQgY2hhciB1Y0VkYmdJUlE7CisJCisJdW5zaWduZWQgbG9uZyBkd0VkYmdCYXNlQWRkcjsKKwl1bnNpZ25lZCBsb25nIGR3RWRiZ0RlYnVnWm9uZTsJCisJdW5zaWduZWQgbG9uZyBkd0RIQ1BMZWFzZVRpbWU7CisJdW5zaWduZWQgbG9uZyBkd0VkYmdGbGFnczsKKwkKKwl1bnNpZ25lZCBsb25nIGR3RUJvb3RGbGFnOworCXVuc2lnbmVkIGxvbmcgZHdFQm9vdEFkZHI7CisJdW5zaWduZWQgbG9uZyBkd0xhdW5jaEFkZHI7CisJCisJdW5zaWduZWQgbG9uZyBwdkZsYXRGcmFtZUJ1ZmZlcjsKKwl1bnNpZ25lZCBzaG9ydCB2ZXNhTW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBjeERpc3BsYXlTY3JlZW47CisJdW5zaWduZWQgc2hvcnQgY3lEaXNwbGF5U2NyZWVuOworCXVuc2lnbmVkIHNob3J0IGN4UGh5c2ljYWxTY3JlZW47CisJdW5zaWduZWQgc2hvcnQgY3lQaHlzaWNhbFNjcmVlbjsKKwl1bnNpZ25lZCBzaG9ydCBjYlNjYW5MaW5lTGVuZ3RoOworCXVuc2lnbmVkIHNob3J0IGJwcFNjcmVlbjsKKwkKKwl1bnNpZ25lZCBjaGFyIFJlZE1hc2tTaXplOworCXVuc2lnbmVkIGNoYXIgUkVkTWFza1Bvc2l0aW9uOworCXVuc2lnbmVkIGNoYXIgR3JlZW5NYXNrU2l6ZTsKKwl1bnNpZ25lZCBjaGFyIEdyZWVuTWFza1Bvc2l0aW9uOworCXVuc2lnbmVkIGNoYXIgQmx1ZU1hc2tTaXplOworCXVuc2lnbmVkIGNoYXIgQmx1ZU1hc2tQb3NpdGlvbjsKK30gQk9PVF9BUkdTOworCitCT09UX0FSR1MgQm9vdEFyZ3M7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VnbWVudF9pbmZveworCXVuc2lnbmVkIGxvbmcgYWRkcjsJCS8vIFNlY3Rpb24gQWRkcmVzcworCXVuc2lnbmVkIGxvbmcgc2l6ZTsJCS8vIFNlY3Rpb24gU2l6ZQorCXVuc2lnbmVkIGxvbmcgY2hlY2tzdW07CQkvLyBTZWN0aW9uIENoZWNrU3VtCit9IFg7CisKKyNkZWZpbmUgUFNJWkUJKDE1MDApCQkJLy9NYXggUGFja2V0IFNpemUKKyNkZWZpbmUgRFNJWkUgIChQU0laRSsxMikKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRidWZmZXJfYXZhaWxhYmxlID0wOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbm90X2xvYWRpbiA9MDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRfbm93ID0wOworCit1bnNpZ25lZCBsb25nIGVudHJ5Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2VfY3VyYWRkcjsKKworCitzdGF0aWMgc2VjdG9yX3QgY2VfbG9hZGVyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIGludCBlb2YpOworc3RhdGljIG9zX2Rvd25sb2FkX3Qgd2luY2VfcHJvYmUodW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpZiAoc3RybmNtcChjZV9zaWduYXR1cmUsIGRhdGEsIHNpemVvZihjZV9zaWduYXR1cmUpKSAhPSAwKSB7CisJCXJldHVybiAwOworCX0KKwlwcmludGYoIihXSU5DRSkiKTsKKwlyZXR1cm4gY2VfbG9hZGVyOworfQorCitzdGF0aWMgc2VjdG9yX3QgY2VfbG9hZGVyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIGludCBlb2YpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgZGJ1ZmZlcltEU0laRV07CisJaW50IHRoaXNfd3JpdGUgPSAwOworCXN0YXRpYyBpbnQgZmlyc3R0aW1lID0gMTsKKworCS8qCisJICoJbmV3IHBhY2tldCBpbiwgd2UgaGF2ZSB0byAKKwkgKglbMV0gY29weSBkYXRhIHRvIGRidWZmZXIsCisJICoKKwkgKgl1cGRhdGUuLi4KKwkgKglbMl0gIGRidWZmZXJfYXZhaWxhYmxlCisJICovCisJbWVtY3B5KCAoZGJ1ZmZlcitkYnVmZmVyX2F2YWlsYWJsZSksIGRhdGEsIGxlbik7CS8vWzFdCisJZGJ1ZmZlcl9hdmFpbGFibGUgKz0gbGVuOwkvLyBbMl0KKwlsZW4gPSAwOworCisJZF9ub3cgPSAwOworCQorI2lmIDAKKwlwcmludGYoImRidWZmZXJfYXZhaWxhYmxlID0lbGQgXG4iLCBkYnVmZmVyX2F2YWlsYWJsZSk7CisjZW5kaWYgCisJCisJaWYgKGZpcnN0dGltZSkgCisJeworCQlkX25vdyA9IHNpemVvZihjZV9zaWduYXR1cmUpOworCQlwcmludGYoIlN0cmluZyBQaHlzaWNhbCBBZGRyZXNzID0gJWx4IFxuIiwgCisJCQkqKHVuc2lnbmVkIGxvbmcgKikoZGJ1ZmZlcitkX25vdykpOworCQkKKwkJZF9ub3cgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQlwcmludGYoIkltYWdlIFNpemUgPSAlbGQgWyVseF1cbiIsIAorCQkJKih1bnNpZ25lZCBsb25nICopKGRidWZmZXIrZF9ub3cpLCAKKwkJCSoodW5zaWduZWQgbG9uZyAqKShkYnVmZmVyK2Rfbm93KSk7CisJCQorCQlkX25vdyArPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCWRidWZmZXJfYXZhaWxhYmxlIC09IGRfbm93OwkJCQorCQkKKwkJZF9ub3cgPSAodW5zaWduZWQgbG9uZylnZXRfeF9oZWFkZXIoZGJ1ZmZlciwgZF9ub3cpOworCQlmaXJzdHRpbWUgPSAwOworCX0KKwkKKwlpZiAobm90X2xvYWRpbiA9PSAwKQorCXsKKwkJZF9ub3cgPSBnZXRfeF9oZWFkZXIoZGJ1ZmZlciwgZF9ub3cpOworCX0KKwkKKwl3aGlsZSAoIG5vdF9sb2FkaW4gPiAwICkKKwl7CisJCS8qIGRidWZmZXIgZG8gbm90IGhhdmUgZW5vdWdoIGRhdGEgdG8gbG9hZGluZywgY29weSBhbGwgKi8KKyNpZiBMT0FEX0RFQlVHCisJCXByaW50ZigiWzBdIG5vdF9sb2FkaW4gPSBbJWxkXSwgZGJ1ZmZlcl9hdmFpbGFibGUgPSBbJWxkXSBcbiIsIAorCQkJbm90X2xvYWRpbiwgZGJ1ZmZlcl9hdmFpbGFibGUpOworCQlwcmludGYoIlswXSBkX25vdyA9IFslbGRdIFxuIiwgZF9ub3cpOworI2VuZGlmCisJCQorCQlpZiggZGJ1ZmZlcl9hdmFpbGFibGUgPD0gbm90X2xvYWRpbikKKwkJeworCQkJdGhpc193cml0ZSA9IGRidWZmZXJfYXZhaWxhYmxlIDsKKwkJCW1lbWNweShwaHlzX3RvX3ZpcnQoY2VfY3VyYWRkciksIChkYnVmZmVyK2Rfbm93KSwgdGhpc193cml0ZSApOworCQkJY2VfY3VyYWRkciArPSB0aGlzX3dyaXRlOworCQkJbm90X2xvYWRpbiAtPSB0aGlzX3dyaXRlOworCQkJCisJCQkvKiByZXNldCBpbmRleCBhbmQgYXZhaWxhYmxlIGluIHRoZSBkYnVmZmVyICovCisJCQlkYnVmZmVyX2F2YWlsYWJsZSA9IDA7CisJCQlkX25vdyA9IDA7CisjaWYgTE9BRF9ERUJVRworCQkJcHJpbnRmKCJbMV0gbm90X2xvYWRpbiA9IFslbGRdLCBkYnVmZmVyX2F2YWlsYWJsZSA9IFslbGRdIFxuIiwgCisJCQkJbm90X2xvYWRpbiwgZGJ1ZmZlcl9hdmFpbGFibGUpOworCQkJcHJpbnRmKCJbMV0gZF9ub3cgPSBbJWxkXSwgdGhpc193cml0ZSA9IFslZF0gXG4iLCAKKwkJCQlkX25vdywgdGhpc193cml0ZSk7CisjZW5kaWYKKwkJCQkKKwkJCS8vIGdldCB0aGUgbmV4dCBwYWNrZXQuLi4KKwkJCXJldHVybiAoMCk7CisJCX0KKwkJCQorCQkvKiBkYnVmZmVyIGhhdmUgbW9yZSBkYXRhIHRoZW4gbG9hZGluZyAuLi4gLCBjb3B5IHBhcnRpdGFsLi4uLiAqLworCQllbHNlCisJCXsKKwkJCXRoaXNfd3JpdGUgPSBub3RfbG9hZGluOworCQkJbWVtY3B5KHBoeXNfdG9fdmlydChjZV9jdXJhZGRyKSwgKGRidWZmZXIrZF9ub3cpLCB0aGlzX3dyaXRlKTsKKwkJCWNlX2N1cmFkZHIgKz0gdGhpc193cml0ZTsKKwkJCW5vdF9sb2FkaW4gPSAwOworCQkJCisJCQkvKiByZXNldCBpbmRleCBhbmQgYXZhaWxhYmxlIGluIHRoZSBkYnVmZmVyICovCisJCQlkYnVmZmVyX2F2YWlsYWJsZSAtPSB0aGlzX3dyaXRlOworCQkJZF9ub3cgKz0gdGhpc193cml0ZTsKKyNpZiBMT0FEX0RFQlVHCisJCQlwcmludGYoIlsyXSBub3RfbG9hZGluID0gWyVsZF0sIGRidWZmZXJfYXZhaWxhYmxlID0gWyVsZF0gXG4iLCAKKwkJCQlub3RfbG9hZGluLCBkYnVmZmVyX2F2YWlsYWJsZSk7CisJCQlwcmludGYoIlsyXSBkX25vdyA9IFslbGRdLCB0aGlzX3dyaXRlID0gWyVkXSBcblxuIiwgCisJCQkJZF9ub3csIHRoaXNfd3JpdGUpOworI2VuZGlmCisJCQkKKwkJCS8qIGRidWZmZXIgbm90IGVtcHR5LCBwcm9jZWVkIHByb2Nlc3NpbmcuLi4gKi8KKwkJCQorCQkJLy8gZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSB0byBnZXRfeF9oZWFkZXIuLgorCQkJaWYgKCBkYnVmZmVyX2F2YWlsYWJsZSA8IChzaXplb2YodW5zaWduZWQgbG9uZykgKiAzKSApCisJCQl7CisvLwkJCQlwcmludGYoIndlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgcmVtYWluaW5nIHRvIGNhbGwgZ2V0X3guIFxuIik7CisJCQkJbWVtY3B5KCAoZGJ1ZmZlciswKSwgKGRidWZmZXIrZF9ub3cpLCBkYnVmZmVyX2F2YWlsYWJsZSk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZiBMT0FEX0RFQlVHCQkJCQorCQkJCXByaW50Zigid2l0aCByZW1haW5pbmcgZGF0YSB0byBjYWxsIGdldF94IFxuIik7CisJCQkJcHJpbnRmKCJkYnVmZmVyIGF2YWlsYWJsZSA9ICVsZCAsIGRfbm93ID0gJWxkXG4iLCAKKwkJCQkJZGJ1ZmZlcl9hdmFpbGFibGUsIGRfbm93KTsKKyNlbmRpZgkJCQkJCisJCQkJZF9ub3cgPSBnZXRfeF9oZWFkZXIoZGJ1ZmZlciwgZF9ub3cpOworCQkJfQorCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3hfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKmRidWZmZXIsIHVuc2lnbmVkIGxvbmcgbm93KQoreworCVguYWRkciA9ICoodW5zaWduZWQgbG9uZyAqKShkYnVmZmVyICsgbm93KTsKKwlYLnNpemUgPSAqKHVuc2lnbmVkIGxvbmcgKikoZGJ1ZmZlciArIG5vdyArIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJWC5jaGVja3N1bSA9ICoodW5zaWduZWQgbG9uZyAqKShkYnVmZmVyICsgbm93ICsgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjIpOworCisJaWYgKFguYWRkciA9PSAwKQorCXsKKwkJZW50cnkgPSBYLnNpemU7CisJCWRvbmUoMSk7CisJCXByaW50ZigiRW50cnkgUG9pbnQgQWRkcmVzcyA9IFslbHhdIFxuIiwgZW50cnkpOworCQlqdW1wXzJlcCgpOwkJCisJfQorCisJaWYgKCFwcmVwX3NlZ21lbnQoWC5hZGRyLCBYLmFkZHIgKyBYLnNpemUsIFguYWRkciArIFguc2l6ZSwgMCwgMCkpIHsKKwkJbG9uZ2ptcChyZXN0YXJ0X2V0aGVyYm9vdCwgLTIpOworCX0KKworCWNlX2N1cmFkZHIgPSBYLmFkZHI7CisJbm93ICs9IHNpemVvZih1bnNpZ25lZCBsb25nKSozOworCisJLyogcmUtY2FsY3VsYXRlIGRidWZmZXIgYXZhaWxhYmxlLi4uICovCisJZGJ1ZmZlcl9hdmFpbGFibGUgLT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjM7CisKKwkvKiByZXNldCBpbmRleCBvZiB0aGlzIHNlY3Rpb24gKi8KKwlub3RfbG9hZGluID0gWC5zaXplOworCQorI2lmIDEKKwlwcmludGYoIlxuIik7CisJcHJpbnRmKCJcdCBTZWN0aW9uIEFkZHJlc3MgPSBbJWx4XSBcbiIsIFguYWRkcik7CisJcHJpbnRmKCJcdCBTaXplID0gJWQgWyVseF1cbiIsIFguc2l6ZSwgWC5zaXplKTsKKwlwcmludGYoIlx0IENoZWNrc3VtID0gJWxkIFslbHhdXG4iLCBYLmNoZWNrc3VtLCBYLmNoZWNrc3VtKTsKKyNlbmRpZgorI2lmIExPQURfREVCVUcKKwlwcmludGYoIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG4iKTsKKwlwcmludGYoIlx0IGRidWZmZXJfbm93ID0gJWxkIFxuIiwgbm93KTsKKwlwcmludGYoIlx0IGRidWZmZXIgYXZhaWxhYmxlID0gJWxkIFxuIiwgZGJ1ZmZlcl9hdmFpbGFibGUpOworCXByaW50ZigiXHQgbm90X2xvYWRpbiA9ICVsZCBcbiIsIG5vdF9sb2FkaW4pOworI2VuZGlmCisKKwlyZXR1cm4gbm93OworfQorCitzdGF0aWMgdm9pZCBqdW1wXzJlcCgpCit7CisJQm9vdEFyZ3MudWNWaWRlb01vZGUgPSAxOworCUJvb3RBcmdzLnVjQ29tUG9ydCA9IDE7CisJQm9vdEFyZ3MudWNCYXVkRGl2aXNvciA9IDE7CisJQm9vdEFyZ3MudWNQQ0lDb25maWdUeXBlID0gMTsJLy8gZG8gbm90IGZpbGwgd2l0aCAwCisJCisJQm9vdEFyZ3MuZHdTaWcgPSBCT09UQVJHX1NJRzsKKwlCb290QXJncy5kd0xlbiA9IHNpemVvZihCb290QXJncyk7CisJCisJaWYoQm9vdEFyZ3MudWNWaWRlb01vZGUgPT0gMCkKKwl7CisJCUJvb3RBcmdzLmN4RGlzcGxheVNjcmVlbiA9IDY0MDsKKwkJQm9vdEFyZ3MuY3lEaXNwbGF5U2NyZWVuID0gNDgwOworCQlCb290QXJncy5jeFBoeXNpY2FsU2NyZWVuID0gNjQwOworCQlCb290QXJncy5jeVBoeXNpY2FsU2NyZWVuID0gNDgwOworCQlCb290QXJncy5icHBTY3JlZW4gPSAxNjsKKwkJQm9vdEFyZ3MuY2JTY2FuTGluZUxlbmd0aCAgPSAxMDI0OworCQlCb290QXJncy5wdkZsYXRGcmFtZUJ1ZmZlciA9IDB4ODAwYTAwMDA7CS8vIG9sbGllIHNheSAweDk4MDAwMDAwCisJfQkKKwllbHNlIGlmKEJvb3RBcmdzLnVjVmlkZW9Nb2RlICE9IDB4RkYpCisJeworCQlCb290QXJncy5jeERpc3BsYXlTY3JlZW4gPSAwOworCQlCb290QXJncy5jeURpc3BsYXlTY3JlZW4gPSAwOworCQlCb290QXJncy5jeFBoeXNpY2FsU2NyZWVuID0gMDsKKwkJQm9vdEFyZ3MuY3lQaHlzaWNhbFNjcmVlbiA9IDA7CisJCUJvb3RBcmdzLmJwcFNjcmVlbiA9IDA7CisJCUJvb3RBcmdzLmNiU2NhbkxpbmVMZW5ndGggID0gMDsKKwkJQm9vdEFyZ3MucHZGbGF0RnJhbWVCdWZmZXIgPSAwOwkKKwl9CisKKwllcCA9IHBoeXNfdG9fdmlydChCT09UX0FSR19QVFJfTE9DQVRJT04pOworCSplcD0gdmlydF90b19waHlzKCZCb290QXJncyk7CisJeHN0YXJ0MzIoZW50cnkpOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUveDg2X2lvLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvY29yZS94ODZfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMzNjNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2NvcmUveDg2X2lvLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxncHhlL3g4Nl9pby5oPgorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIEkvTyBBUEkgZm9yIHg4NgorICoKKyAqLworCisvKioKKyAqIFJlYWQgNjQtYml0IHF3b3JkIGZyb20gbWVtb3J5LW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHJldCBkYXRhCQlWYWx1ZSByZWFkCisgKgorICogVGhpcyByb3V0aW5lIHVzZXMgTU1YIGluc3RydWN0aW9ucy4KKyAqLworc3RhdGljIHVpbnQ2NF90IHg4Nl9yZWFkcSAoIHZvbGF0aWxlIHVpbnQ2NF90ICppb19hZGRyICkgeworCXVpbnQ2NF90IGRhdGE7CisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICggInB1c2hsICUlZWR4XG5cdCIKKwkJCSAgICAgICAicHVzaGwgJSVlYXhcblx0IgorCQkJICAgICAgICJtb3ZxICglMSksICUlbW0wXG5cdCIKKwkJCSAgICAgICAibW92cSAlJW1tMCwgKCUlZXNwKVxuXHQiCisJCQkgICAgICAgInBvcGwgJSVlYXhcblx0IgorCQkJICAgICAgICJwb3BsICUlZWR4XG5cdCIKKwkJCSAgICAgICAiZW1tc1xuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPUEiICggZGF0YSApIDogInIiICggaW9fYWRkciApICk7CisJcmV0dXJuIGRhdGE7Cit9CisKKy8qKgorICogV3JpdGUgNjQtYml0IHF3b3JkIHRvIG1lbW9yeS1tYXBwZWQgZGV2aWNlCisgKgorICogQHYgZGF0YQkJVmFsdWUgdG8gd3JpdGUKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKgorICogVGhpcyByb3V0aW5lIHVzZXMgTU1YIGluc3RydWN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgeDg2X3dyaXRlcSAoIHVpbnQ2NF90IGRhdGEsIHZvbGF0aWxlIHVpbnQ2NF90ICppb19hZGRyICkgeworCV9fYXNtX18gX192b2xhdGlsZV9fICggInB1c2hsICUlZWR4XG5cdCIKKwkJCSAgICAgICAicHVzaGwgJSVlYXhcblx0IgorCQkJICAgICAgICJtb3ZxICglJWVzcCksICUlbW0wXG5cdCIKKwkJCSAgICAgICAibW92cSAlJW1tMCwgKCUxKVxuXHQiCisJCQkgICAgICAgInBvcGwgJSVlYXhcblx0IgorCQkJICAgICAgICJwb3BsICUlZWR4XG5cdCIKKwkJCSAgICAgICAiZW1tc1xuXHQiCisJCQkgICAgICAgOiA6ICJBIiAoIGRhdGEgKSwgInIiICggaW9fYWRkciApICk7Cit9CisKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCBwaHlzX3RvX2J1cyApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIGJ1c190b19waHlzICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIHg4NiwgaW9yZW1hcCApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIGlvdW5tYXAgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCBpb190b19idXMgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCByZWFkYiApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIHJlYWR3ICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIHg4NiwgcmVhZGwgKTsKK1BST1ZJREVfSU9BUEkgKCB4ODYsIHJlYWRxLCB4ODZfcmVhZHEgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCB3cml0ZWIgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCB3cml0ZXcgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCB3cml0ZWwgKTsKK1BST1ZJREVfSU9BUEkgKCB4ODYsIHdyaXRlcSwgeDg2X3dyaXRlcSApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIGluYiApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIGludyApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIGlubCApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIG91dGIgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCBvdXR3ICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIHg4Niwgb3V0bCApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIGluc2IgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCBpbnN3ICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIHg4NiwgaW5zbCApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIG91dHNiICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIHg4Niwgb3V0c3cgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCBvdXRzbCApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCB4ODYsIGlvZGVsYXkgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggeDg2LCBtYiApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2RyaXZlcnMvbmV0L3VuZGkuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlMjUzYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8dW5kaS5oPgorI2luY2x1ZGUgPHVuZGlyb20uaD4KKyNpbmNsdWRlIDx1bmRpbG9hZC5oPgorI2luY2x1ZGUgPHVuZGluZXQuaD4KKyNpbmNsdWRlIDx1bmRpcHJlbG9hZC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBVTkRJIFBDSSBkcml2ZXIKKyAqCisgKi8KKworLyoqCisgKiBGaW5kIFVOREkgUk9NIGZvciBQQ0kgZGV2aWNlCisgKgorICogQHYgcGNpCQlQQ0kgZGV2aWNlCisgKiBAcmV0IHVuZGlyb20JCVVOREkgUk9NLCBvciBOVUxMCisgKgorICogVHJ5IHRvIGZpbmQgYSBkcml2ZXIgZm9yIHRoaXMgZGV2aWNlLiAgVHJ5IGFuIGV4YWN0IG1hdGNoIG9uIHRoZQorICogUk9NIGFkZHJlc3MgZmlyc3QsIHRoZW4gZmFsbCBiYWNrIHRvIGEgdmVuZG9yL2RldmljZSBJRCBtYXRjaCBvbmx5CisgKi8KK3N0YXRpYyBzdHJ1Y3QgdW5kaV9yb20gKiB1bmRpcGNpX2ZpbmRfcm9tICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKwlzdHJ1Y3QgdW5kaV9yb20gKnVuZGlyb207CisJdW5zaWduZWQgbG9uZyByb21iYXNlOworCQorCXJvbWJhc2UgPSBwY2lfYmFyX3N0YXJ0ICggcGNpLCBQQ0lfUk9NX0FERFJFU1MgKTsKKwl1bmRpcm9tID0gdW5kaXJvbV9maW5kX3BjaSAoIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSwgcm9tYmFzZSApOworCWlmICggISB1bmRpcm9tICkKKwkJdW5kaXJvbSA9IHVuZGlyb21fZmluZF9wY2kgKCBwY2ktPnZlbmRvciwgcGNpLT5kZXZpY2UsIDAgKTsKKwlyZXR1cm4gdW5kaXJvbTsKK30KKworLyoqCisgKiBQcm9iZSBQQ0kgZGV2aWNlCisgKgorICogQHYgcGNpCQlQQ0kgZGV2aWNlCisgKiBAdiBpZAkJUENJIElECisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB1bmRpcGNpX3Byb2JlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgdW5kaV9kZXZpY2UgKnVuZGk7CisJc3RydWN0IHVuZGlfcm9tICp1bmRpcm9tOworCXVuc2lnbmVkIGludCBidXNkZXZmbiA9IFBDSV9CVVNERVZGTiAoIHBjaS0+YnVzLCBwY2ktPmRldmZuICk7CisJaW50IHJjOworCisJLyogSWdub3JlIG5vbi1uZXR3b3JrIGRldmljZXMgKi8KKwlpZiAoIFBDSV9CQVNFX0NMQVNTICggcGNpLT5jbGFzcyApICE9IFBDSV9CQVNFX0NMQVNTX05FVFdPUksgKQorCQlyZXR1cm4gLUVOT1RUWTsKKworCS8qIEFsbG9jYXRlIFVOREkgZGV2aWNlIHN0cnVjdHVyZSAqLworCXVuZGkgPSB6YWxsb2MgKCBzaXplb2YgKCAqdW5kaSApICk7CisJaWYgKCAhIHVuZGkgKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwY2lfc2V0X2RydmRhdGEgKCBwY2ksIHVuZGkgKTsKKworCS8qIEZpbmQvY3JlYXRlIG91ciBwaXhpZSAqLworCWlmICggcHJlbG9hZGVkX3VuZGkucGNpX2J1c2RldmZuID09IGJ1c2RldmZuICkgeworCQkvKiBDbGFpbSBwcmVsb2FkZWQgVU5ESSBkZXZpY2UgKi8KKwkJREJHQyAoIHVuZGksICJVTkRJICVwIHVzaW5nIHByZWxvYWRlZCBVTkRJIGRldmljZVxuIiwgdW5kaSApOworCQltZW1jcHkgKCB1bmRpLCAmcHJlbG9hZGVkX3VuZGksIHNpemVvZiAoICp1bmRpICkgKTsKKwkJbWVtc2V0ICggJnByZWxvYWRlZF91bmRpLCAwLCBzaXplb2YgKCBwcmVsb2FkZWRfdW5kaSApICk7CisJfSBlbHNlIHsKKwkJLyogRmluZCBVTkRJIFJPTSBmb3IgUENJIGRldmljZSAqLworCQlpZiAoICEgKCB1bmRpcm9tID0gdW5kaXBjaV9maW5kX3JvbSAoIHBjaSApICkgKSB7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGVycl9maW5kX3JvbTsKKwkJfQorCisJCS8qIENhbGwgVU5ESSBST00gbG9hZGVyIHRvIGNyZWF0ZSBwaXhpZSAqLworCQlpZiAoICggcmMgPSB1bmRpX2xvYWRfcGNpICggdW5kaSwgdW5kaXJvbSwgYnVzZGV2Zm4gKSApICE9IDAgKQorCQkJZ290byBlcnJfbG9hZF9wY2k7CisJfQorCisJLyogQWRkIHRvIGRldmljZSBoaWVyYXJjaHkgKi8KKwlzbnByaW50ZiAoIHVuZGktPmRldi5uYW1lLCBzaXplb2YgKCB1bmRpLT5kZXYubmFtZSApLAorCQkgICAiVU5ESS0lcyIsIHBjaS0+ZGV2Lm5hbWUgKTsKKwltZW1jcHkgKCAmdW5kaS0+ZGV2LmRlc2MsICZwY2ktPmRldi5kZXNjLCBzaXplb2YgKCB1bmRpLT5kZXYuZGVzYyApICk7CisJdW5kaS0+ZGV2LnBhcmVudCA9ICZwY2ktPmRldjsKKwlJTklUX0xJU1RfSEVBRCAoICZ1bmRpLT5kZXYuY2hpbGRyZW4gKTsKKwlsaXN0X2FkZCAoICZ1bmRpLT5kZXYuc2libGluZ3MsICZwY2ktPmRldi5jaGlsZHJlbiApOworCisJLyogQ3JlYXRlIG5ldHdvcmsgZGV2aWNlICovCisJaWYgKCAoIHJjID0gdW5kaW5ldF9wcm9iZSAoIHVuZGkgKSApICE9IDAgKQorCQlnb3RvIGVycl91bmRpbmV0X3Byb2JlOworCQorCXJldHVybiAwOworCisgZXJyX3VuZGluZXRfcHJvYmU6CisJdW5kaV91bmxvYWQgKCB1bmRpICk7CisJbGlzdF9kZWwgKCAmdW5kaS0+ZGV2LnNpYmxpbmdzICk7CisgZXJyX2ZpbmRfcm9tOgorIGVycl9sb2FkX3BjaToKKwlmcmVlICggdW5kaSApOworCXBjaV9zZXRfZHJ2ZGF0YSAoIHBjaSwgTlVMTCApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZW1vdmUgUENJIGRldmljZQorICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHVuZGlwY2lfcmVtb3ZlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKwlzdHJ1Y3QgdW5kaV9kZXZpY2UgKnVuZGkgPSBwY2lfZ2V0X2RydmRhdGEgKCBwY2kgKTsKKworCXVuZGluZXRfcmVtb3ZlICggdW5kaSApOworCXVuZGlfdW5sb2FkICggdW5kaSApOworCWxpc3RfZGVsICggJnVuZGktPmRldi5zaWJsaW5ncyApOworCWZyZWUgKCB1bmRpICk7CisJcGNpX3NldF9kcnZkYXRhICggcGNpLCBOVUxMICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB1bmRpcGNpX25pY3NbXSA9IHsKK1BDSV9ST00gKCAweGZmZmYsIDB4ZmZmZiwgInVuZGlwY2kiLCAiVU5ESSAoUENJKSIsIDAgKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHVuZGlwY2lfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzID0gdW5kaXBjaV9uaWNzLAorCS5pZF9jb3VudCA9ICggc2l6ZW9mICggdW5kaXBjaV9uaWNzICkgLyBzaXplb2YgKCB1bmRpcGNpX25pY3NbMF0gKSApLAorCS5wcm9iZSA9IHVuZGlwY2lfcHJvYmUsCisJLnJlbW92ZSA9IHVuZGlwY2lfcmVtb3ZlLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpaXNyLlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvZHJpdmVycy9uZXQvdW5kaWlzci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyN2VmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvZHJpdmVycy9uZXQvdW5kaWlzci5TCkBAIC0wLDAgKzEsODcgQEAKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKQorCisjZGVmaW5lIFBYRU5WX1VORElfSVNSIDB4MDAxNAorI2RlZmluZSBQWEVOVl9VTkRJX0lTUl9JTl9TVEFSVCAxCisjZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9PVVJTIDAKKyNkZWZpbmUgUFhFTlZfVU5ESV9JU1JfT1VUX05PVF9PVVJTIDEKKworI2RlZmluZSBJUlFfUElDX0NVVE9GRiA4CisjZGVmaW5lIElDUl9FT0lfTk9OX1NQRUNJRklDIDB4MjAKKyNkZWZpbmUgUElDMV9JQ1IgMHgyMAorI2RlZmluZSBQSUMyX0lDUiAweGEwCisJCisJLnRleHQKKwkuYXJjaCBpMzg2CisJLmNvZGUxNgorCisJLnNlY3Rpb24gIi50ZXh0MTYiLCAiYXgiLCBAcHJvZ2JpdHMKKwkuZ2xvYmwgdW5kaWlzcgordW5kaWlzcjoKKwkKKwkvKiBQcmVzZXJ2ZSByZWdpc3RlcnMgKi8KKwlwdXNodwklZHMKKwlwdXNodwklZXMKKwlwdXNodwklZnMKKwlwdXNodwklZ3MKKwlwdXNoZmwKKwlwdXNoYWwKKworCS8qIFNldCB1cCBvdXIgc2VnbWVudCByZWdpc3RlcnMgKi8KKwltb3Z3CSVjczpybV9kcywgJWF4CisJbW92dwklYXgsICVkcworCisJLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGFuIFVOREkgZW50cnkgcG9pbnQgKi8KKwljbXB3CSQwLCBweGVwYXJlbnRfZW50cnlfcG9pbnQKKwlqZQljaGFpbgorCQorCS8qIElzc3VlIFVOREkgQVBJIGNhbGwgKi8KKwltb3Z3CSVheCwgJWVzCisJbW92dwkkdW5kaW5ldF9wYXJhbXMsICVkaQorCW1vdncJJFBYRU5WX1VORElfSVNSLCAlYngKKwltb3Z3CSRQWEVOVl9VTkRJX0lTUl9JTl9TVEFSVCwgZnVuY2ZsYWcKKwlwdXNodwklZXMKKwlwdXNodwklZGkKKwlwdXNodwklYngKKwlsY2FsbAkqcHhlcGFyZW50X2VudHJ5X3BvaW50CisJY2xpCS8qIEp1c3QgaW4gY2FzZSAqLworCWFkZHcJJDYsICVzcAorCWNtcHcJJFBYRU5WX1VORElfSVNSX09VVF9PVVJTLCBmdW5jZmxhZworCWpuZQllb2kKKwkKK3RyaWc6CS8qIFJlY29yZCBpbnRlcnJ1cHQgb2NjdXJlbmNlICovCisJaW5jYgl1bmRpaXNyX3RyaWdnZXJfY291bnQKKworZW9pOgkvKiBTZW5kIEVPSSAqLworCW1vdmIJJElDUl9FT0lfTk9OX1NQRUNJRklDLCAlYWwKKwljbXBiCSRJUlFfUElDX0NVVE9GRiwgdW5kaWlzcl9pcnEKKwlqYgkxZgorCW91dGIJJWFsLCAkUElDMl9JQ1IKKzE6CW91dGIJJWFsLCAkUElDMV9JQ1IKKwlqbXAJZXhpdAorCQorY2hhaW46CS8qIENoYWluIHRvIG5leHQgaGFuZGxlciAqLworCXB1c2hmdworCWxjYWxsCSp1bmRpaXNyX25leHRfaGFuZGxlcgorCQorZXhpdDoJLyogUmVzdG9yZSByZWdpc3RlcnMgYW5kIHJldHVybiAqLworCWNsaQorCXBvcGFsCisJbW92endsCSVzcCwgJWVzcAorCWFkZHIzMgltb3ZsIC0yMCglZXNwKSwgJWVzcAkvKiAlZXNwIGlzbid0IHJlc3RvcmVkIGJ5IHBvcGFsICovCisJcG9wZmwKKwlwb3B3CSVncworCXBvcHcJJWZzCisJcG9wdwklZXMKKwlwb3B3CSVkcworCWlyZXQKKworCS5zZWN0aW9uICIuZGF0YTE2IiwgImF3IiwgQHByb2diaXRzCit1bmRpbmV0X3BhcmFtczoKK3N0YXR1czoJCQkud29yZAkwCitmdW5jZmxhZzoJCS53b3JkCTAKK2J1ZmZlcmxlbmd0aDoJCS53b3JkCTAKK2ZyYW1lbGVuZ3RoOgkJLndvcmQJMAorZnJhbWVoZWFkZXJsZW5ndGg6CS53b3JkCTAKK2ZyYW1lOgkJCS53b3JkCTAsIDAKK3Byb3R0eXBlOgkJLmJ5dGUJMAorcGt0dHlwZToJCS5ieXRlCTAKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpbG9hZC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2RyaXZlcnMvbmV0L3VuZGlsb2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0ZTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpbG9hZC5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHhlLmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxiaW9zLmg+CisjaW5jbHVkZSA8cG5wYmlvcy5oPgorI2luY2x1ZGUgPGJhc2VtZW0uaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPHVuZGkuaD4KKyNpbmNsdWRlIDx1bmRpcm9tLmg+CisjaW5jbHVkZSA8dW5kaWxvYWQuaD4KKworLyoqIEBmaWxlCisgKgorICogVU5ESSBsb2FkL3VubG9hZAorICoKKyAqLworCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBjYWxsaW5nIFVOREkgbG9hZGVyICovCitzdGF0aWMgc3RydWN0IHNfVU5ESV9MT0FERVIgX19ic3MxNiAoIHVuZGlfbG9hZGVyICk7CisjZGVmaW5lIHVuZGlfbG9hZGVyIF9fdXNlX2RhdGExNiAoIHVuZGlfbG9hZGVyICkKKworLyoqIFVOREkgbG9hZGVyIGVudHJ5IHBvaW50ICovCitzdGF0aWMgU0VHT0ZGMTZfdCBfX2JzczE2ICggdW5kaV9sb2FkZXJfZW50cnkgKTsKKyNkZWZpbmUgdW5kaV9sb2FkZXJfZW50cnkgX191c2VfZGF0YTE2ICggdW5kaV9sb2FkZXJfZW50cnkgKQorCisvKioKKyAqIENhbGwgVU5ESSBsb2FkZXIgdG8gY3JlYXRlIGEgcGl4aWUKKyAqCisgKiBAdiB1bmRpCQlVTkRJIGRldmljZQorICogQHYgdW5kaXJvbQkJVU5ESSBST00KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgdW5kaV9sb2FkICggc3RydWN0IHVuZGlfZGV2aWNlICp1bmRpLCBzdHJ1Y3QgdW5kaV9yb20gKnVuZGlyb20gKSB7CisJc3RydWN0IHNfUFhFIHBweGU7CisJdW5zaWduZWQgaW50IGZibXNfc2VnOworCXVpbnQxNl90IGV4aXQ7CisJaW50IHJjOworCisJLyogU2V0IHVwIFNUQVJUX1VOREkgcGFyYW1ldGVycyAqLworCW1lbXNldCAoICZ1bmRpX2xvYWRlciwgMCwgc2l6ZW9mICggdW5kaV9sb2FkZXIgKSApOworCXVuZGlfbG9hZGVyLkFYID0gdW5kaS0+cGNpX2J1c2RldmZuOworCXVuZGlfbG9hZGVyLkJYID0gdW5kaS0+aXNhcG5wX2NzbjsKKwl1bmRpX2xvYWRlci5EWCA9IHVuZGktPmlzYXBucF9yZWFkX3BvcnQ7CisJdW5kaV9sb2FkZXIuRVMgPSBCSU9TX1NFRzsKKwl1bmRpX2xvYWRlci5ESSA9IGZpbmRfcG5wX2Jpb3MoKTsKKworCS8qIEFsbG9jYXRlIGJhc2UgbWVtb3J5IGZvciBQWEUgc3RhY2sgKi8KKwl1bmRpLT5yZXN0b3JlX2ZibXMgPSBnZXRfZmJtcygpOworCWZibXNfc2VnID0gKCB1bmRpLT5yZXN0b3JlX2ZibXMgPDwgNiApOworCWZibXNfc2VnIC09ICggKCB1bmRpcm9tLT5jb2RlX3NpemUgKyAweDBmICkgPj4gNCApOworCXVuZGlfbG9hZGVyLlVORElfQ1MgPSBmYm1zX3NlZzsKKwlmYm1zX3NlZyAtPSAoICggdW5kaXJvbS0+ZGF0YV9zaXplICsgMHgwZiApID4+IDQgKTsKKwl1bmRpX2xvYWRlci5VTkRJX0RTID0gZmJtc19zZWc7CisKKwkvKiBEZWJ1ZyBpbmZvICovCisJREJHQyAoIHVuZGksICJVTkRJICVwIGxvYWRpbmcgVU5ESSBST00gJXAgdG8gQ1MgJTA0eCBEUyAlMDR4IGZvciAiLAorCSAgICAgICB1bmRpLCB1bmRpcm9tLCB1bmRpX2xvYWRlci5VTkRJX0NTLCB1bmRpX2xvYWRlci5VTkRJX0RTICk7CisJaWYgKCB1bmRpLT5wY2lfYnVzZGV2Zm4gIT0gVU5ESV9OT19QQ0lfQlVTREVWRk4gKSB7CisJCXVuc2lnbmVkIGludCBidXMgPSAoIHVuZGktPnBjaV9idXNkZXZmbiA+PiA4ICk7CisJCXVuc2lnbmVkIGludCBkZXZmbiA9ICggdW5kaS0+cGNpX2J1c2RldmZuICYgMHhmZiApOworCQlEQkdDICggdW5kaSwgIlBDSSAlMDJ4OiUwMnguJXhcbiIsCisJCSAgICAgICBidXMsIFBDSV9TTE9UICggZGV2Zm4gKSwgUENJX0ZVTkMgKCBkZXZmbiApICk7CisJfQorCWlmICggdW5kaS0+aXNhcG5wX2NzbiAhPSBVTkRJX05PX0lTQVBOUF9DU04gKSB7CisJCURCR0MgKCB1bmRpLCAiSVNBUG5QKCUwNHgpIENTTiAlMDR4XG4iLAorCQkgICAgICAgdW5kaS0+aXNhcG5wX3JlYWRfcG9ydCwgdW5kaS0+aXNhcG5wX2NzbiApOworCX0KKworCS8qIENhbGwgbG9hZGVyICovCisJdW5kaV9sb2FkZXJfZW50cnkgPSB1bmRpcm9tLT5sb2FkZXJfZW50cnk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBSRUFMX0NPREUgKCAicHVzaHcgJSVkc1xuXHQiCisJCQkJCSAgICJwdXNodyAlJWF4XG5cdCIKKwkJCQkJICAgImxjYWxsICp1bmRpX2xvYWRlcl9lbnRyeVxuXHQiCisJCQkJCSAgICJhZGR3ICQ0LCAlJXNwXG5cdCIgKQorCQkJICAgICAgIDogIj1hIiAoIGV4aXQgKQorCQkJICAgICAgIDogImEiICggX19mcm9tX2RhdGExNiAoICZ1bmRpX2xvYWRlciApICkKKwkJCSAgICAgICA6ICJlYngiLCAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIiwgImVicCIgKTsKKworCS8qIFVOREkgQVBJIGNhbGxzIG1heSBydWRlbHkgY2hhbmdlIHRoZSBzdGF0dXMgb2YgQTIwIGFuZCBub3QKKwkgKiBib3RoZXIgdG8gcmVzdG9yZSBpdCBhZnRlcndhcmRzLiAgSW50ZWwgaXMga25vd24gdG8gYmUKKwkgKiBndWlsdHkgb2YgdGhpcy4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSB3aWxsIHJldHVybiB0byB0aGlzIHBvaW50IGV2ZW4gaWYgQTIwIGdldHMKKwkgKiBzY3Jld2VkIHVwIGJ5IHRoZSBVTkRJIGRyaXZlciwgYmVjYXVzZSBFdGhlcmJvb3QgYWx3YXlzCisJICogcmVzaWRlcyBpbiBhbiBldmVuIG1lZ2FieXRlIG9mIFJBTS4KKwkgKi8JCisJZ2F0ZUEyMF9zZXQoKTsKKworCWlmICggZXhpdCAhPSBQWEVOVl9FWElUX1NVQ0NFU1MgKSB7CisJCXJjID0gLXVuZGlfbG9hZGVyLlN0YXR1czsKKwkJaWYgKCByYyA9PSAwICkgLyogUGFyYW5vaWEgKi8KKwkJCXJjID0gLUVJTzsKKwkJREJHQyAoIHVuZGksICJVTkRJICVwIGxvYWRlciBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICAgdW5kaSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBQb3B1bGF0ZSBQWEUgZGV2aWNlIHN0cnVjdHVyZSAqLworCXVuZGktPnB4ZW52ID0gdW5kaV9sb2FkZXIuUFhFTlZwdHI7CisJdW5kaS0+cHB4ZSA9IHVuZGlfbG9hZGVyLlBYRXB0cjsKKwljb3B5X2Zyb21fcmVhbCAoICZwcHhlLCB1bmRpLT5wcHhlLnNlZ21lbnQsIHVuZGktPnBweGUub2Zmc2V0LAorCQkJIHNpemVvZiAoIHBweGUgKSApOworCXVuZGktPmVudHJ5ID0gcHB4ZS5FbnRyeVBvaW50U1A7CisJREJHQyAoIHVuZGksICJVTkRJICVwIGxvYWRlZCBQWEVOVisgJTA0eDolMDR4ICFQWEUgJTA0eDolMDR4ICIKKwkgICAgICAgImVudHJ5ICUwNHg6JTA0eFxuIiwgdW5kaSwgdW5kaS0+cHhlbnYuc2VnbWVudCwKKwkgICAgICAgdW5kaS0+cHhlbnYub2Zmc2V0LCB1bmRpLT5wcHhlLnNlZ21lbnQsIHVuZGktPnBweGUub2Zmc2V0LAorCSAgICAgICB1bmRpLT5lbnRyeS5zZWdtZW50LCB1bmRpLT5lbnRyeS5vZmZzZXQgKTsKKworCS8qIFVwZGF0ZSBmcmVlIGJhc2UgbWVtb3J5IGNvdW50ZXIgKi8KKwl1bmRpLT5mYm1zID0gKCBmYm1zX3NlZyA+PiA2ICk7CisJc2V0X2ZibXMgKCB1bmRpLT5mYm1zICk7CisJREJHQyAoIHVuZGksICJVTkRJICVwIHVzaW5nIFslZCwlZCkga0Igb2YgYmFzZSBtZW1vcnlcbiIsCisJICAgICAgIHVuZGksIHVuZGktPmZibXMsIHVuZGktPnJlc3RvcmVfZmJtcyApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVW5sb2FkIGEgcGl4aWUKKyAqCisgKiBAdiB1bmRpCQlVTkRJIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogRXJhc2VzIHRoZSBQWEVOVisgYW5kICFQWEUgc2lnbmF0dXJlcywgYW5kIGZyZWVzIHRoZSB1c2VkIGJhc2UKKyAqIG1lbW9yeSAoaWYgcG9zc2libGUpLgorICovCitpbnQgdW5kaV91bmxvYWQgKCBzdHJ1Y3QgdW5kaV9kZXZpY2UgKnVuZGkgKSB7CisJc3RhdGljIHVpbnQzMl90IGRlYWQgPSAweGRlYWRkZWFkOworCisJREJHQyAoIHVuZGksICJVTkRJICVwIHVubG9hZGluZ1xuIiwgdW5kaSApOworCisJLyogRXJhc2Ugc2lnbmF0dXJlcyAqLworCWlmICggdW5kaS0+cHhlbnYuc2VnbWVudCApCisJCXB1dF9yZWFsICggZGVhZCwgdW5kaS0+cHhlbnYuc2VnbWVudCwgdW5kaS0+cHhlbnYub2Zmc2V0ICk7CisJaWYgKCB1bmRpLT5wcHhlLnNlZ21lbnQgKQorCQlwdXRfcmVhbCAoIGRlYWQsIHVuZGktPnBweGUuc2VnbWVudCwgdW5kaS0+cHB4ZS5vZmZzZXQgKTsKKworCS8qIEZyZWUgYmFzZSBtZW1vcnksIGlmIHBvc3NpYmxlICovCisJaWYgKCB1bmRpLT5mYm1zID09IGdldF9mYm1zKCkgKSB7CisJCURCR0MgKCB1bmRpLCAiVU5ESSAlcCBmcmVlaW5nIFslZCwlZCkga0Igb2YgYmFzZSBtZW1vcnlcbiIsCisJCSAgICAgICB1bmRpLCB1bmRpLT5mYm1zLCB1bmRpLT5yZXN0b3JlX2ZibXMgKTsKKwkJc2V0X2ZibXMgKCB1bmRpLT5yZXN0b3JlX2ZibXMgKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJREJHQyAoIHVuZGksICJVTkRJICVwIGxlYWtpbmcgWyVkLCVkKSBrQiBvZiBiYXNlIG1lbW9yeVxuIiwKKwkJICAgICAgIHVuZGksIHVuZGktPmZibXMsIHVuZGktPnJlc3RvcmVfZmJtcyApOworCQlyZXR1cm4gLUVCVVNZOworCX0KK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpbmV0LmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvZHJpdmVycy9uZXQvdW5kaW5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjc5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvZHJpdmVycy9uZXQvdW5kaW5ldC5jCkBAIC0wLDAgKzEsNjMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHhlLmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxwaWM4MjU5Lmg+CisjaW5jbHVkZSA8Ymlvc2ludC5oPgorI2luY2x1ZGUgPHBucGJpb3MuaD4KKyNpbmNsdWRlIDxiYXNlbWVtX3BhY2tldC5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPHVuZGkuaD4KKyNpbmNsdWRlIDx1bmRpbmV0Lmg+CisjaW5jbHVkZSA8cHhlcGFyZW50Lmg+CisKKworLyoqIEBmaWxlCisgKgorICogVU5ESSBuZXR3b3JrIGRldmljZSBkcml2ZXIKKyAqCisgKi8KKworLyoqIEFuIFVOREkgTklDICovCitzdHJ1Y3QgdW5kaV9uaWMgeworCS8qKiBBc3NpZ25lZCBJUlEgbnVtYmVyICovCisJdW5zaWduZWQgaW50IGlycTsKKwkvKiogQ3VycmVudGx5IHByb2Nlc3NpbmcgSVNSICovCisJaW50IGlzcl9wcm9jZXNzaW5nOworCS8qKiBCdWcgd29ya2Fyb3VuZHMgKi8KKwlpbnQgaGFja3M7Cit9OworCisvKioKKyAqIEBkZWZncm91cCB1bmRpX2hhY2tzIFVOREkgd29ya2Fyb3VuZHMKKyAqIEB7CisgKi8KKworLyoqIFdvcmsgYXJvdW5kIEV0aGVyYm9vdCA1LjQgYnVncyAqLworI2RlZmluZSBVTkRJX0hBQ0tfRUI1NAkJMHgwMDAxCisKKy8qKiBAfSAqLworCitzdGF0aWMgdm9pZCB1bmRpbmV0X2Nsb3NlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworCisvKiogQWRkcmVzcyBvZiBVTkRJIGVudHJ5IHBvaW50ICovCitzdGF0aWMgU0VHT0ZGMTZfdCB1bmRpbmV0X2VudHJ5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBVTkRJIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFVOREkgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICoKKyAqIFRoZSBVTkRJIElTUiBpbmNyZW1lbnRzIGEgY291bnRlciAoQGMgdHJpZ2dlcl9jb3VudCkgYW5kIGV4aXRzLgorICovCitleHRlcm4gdm9pZCB1bmRpaXNyICggdm9pZCApOworCisvKiogSVJRIG51bWJlciAqLwordWludDhfdCBfX2RhdGExNiAoIHVuZGlpc3JfaXJxICk7CisjZGVmaW5lIHVuZGlpc3JfaXJxIF9fdXNlX2RhdGExNiAoIHVuZGlpc3JfaXJxICkKKworLyoqIElSUSBjaGFpbiB2ZWN0b3IgKi8KK3N0cnVjdCBzZWdvZmYgX19kYXRhMTYgKCB1bmRpaXNyX25leHRfaGFuZGxlciApOworI2RlZmluZSB1bmRpaXNyX25leHRfaGFuZGxlciBfX3VzZV9kYXRhMTYgKCB1bmRpaXNyX25leHRfaGFuZGxlciApCisKKy8qKiBJUlEgdHJpZ2dlciBjb3VudCAqLwordm9sYXRpbGUgdWludDhfdCBfX2RhdGExNiAoIHVuZGlpc3JfdHJpZ2dlcl9jb3VudCApID0gMDsKKyNkZWZpbmUgdW5kaWlzcl90cmlnZ2VyX2NvdW50IF9fdXNlX2RhdGExNiAoIHVuZGlpc3JfdHJpZ2dlcl9jb3VudCApCisKKy8qKiBMYXN0IG9ic2VydmVkIHRyaWdnZXIgY291bnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF90cmlnZ2VyX2NvdW50ID0gMDsKKworLyoqCisgKiBIb29rIFVOREkgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICoKKyAqIEB2IGlycQkJSVJRIG51bWJlcgorICovCitzdGF0aWMgdm9pZCB1bmRpbmV0X2hvb2tfaXNyICggdW5zaWduZWQgaW50IGlycSApIHsKKworCWFzc2VydCAoIGlycSA8PSBJUlFfTUFYICk7CisJYXNzZXJ0ICggdW5kaWlzcl9pcnEgPT0gMCApOworCisJdW5kaWlzcl9pcnEgPSBpcnE7CisJaG9va19iaW9zX2ludGVycnVwdCAoIElSUV9JTlQgKCBpcnEgKSwKKwkJCSAgICAgICggKCB1bnNpZ25lZCBpbnQgKSB1bmRpaXNyICksCisJCQkgICAgICAmdW5kaWlzcl9uZXh0X2hhbmRsZXIgKTsKK30KKworLyoqCisgKiBVbmhvb2sgVU5ESSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisgKgorICogQHYgaXJxCQlJUlEgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkIHVuZGluZXRfdW5ob29rX2lzciAoIHVuc2lnbmVkIGludCBpcnEgKSB7CisKKwlhc3NlcnQgKCBpcnEgPD0gSVJRX01BWCApOworCisJdW5ob29rX2Jpb3NfaW50ZXJydXB0ICggSVJRX0lOVCAoIGlycSApLAorCQkJCSggKCB1bnNpZ25lZCBpbnQgKSB1bmRpaXNyICksCisJCQkJJnVuZGlpc3JfbmV4dF9oYW5kbGVyICk7CisJdW5kaWlzcl9pcnEgPSAwOworfQorCisvKioKKyAqIFRlc3QgdG8gc2VlIGlmIFVOREkgSVNSIGhhcyBiZWVuIHRyaWdnZXJlZAorICoKKyAqIEByZXQgdHJpZ2dlcmVkCUlTUiBoYXMgYmVlbiB0cmlnZ2VyZWQgc2luY2UgbGFzdCBjaGVjaworICovCitzdGF0aWMgaW50IHVuZGluZXRfaXNyX3RyaWdnZXJlZCAoIHZvaWQgKSB7CisJdW5zaWduZWQgaW50IHRoaXNfdHJpZ2dlcl9jb3VudDsKKworCS8qIFJlYWQgdHJpZ2dlcl9jb3VudC4gIERvIHRoaXMgb25seSBvbmNlOyBpdCBpcyB2b2xhdGlsZSAqLworCXRoaXNfdHJpZ2dlcl9jb3VudCA9IHVuZGlpc3JfdHJpZ2dlcl9jb3VudDsKKworCWlmICggdGhpc190cmlnZ2VyX2NvdW50ID09IGxhc3RfdHJpZ2dlcl9jb3VudCApIHsKKwkJLyogTm90IHRyaWdnZXJlZCAqLworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBUcmlnZ2VyZWQgKi8KKwkJbGFzdF90cmlnZ2VyX2NvdW50ID0gdGhpc190cmlnZ2VyX2NvdW50OworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFVOREkgbmV0d29yayBkZXZpY2UgaW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIFVOREkgdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1RCRCBfX2RhdGExNiAoIHVuZGluZXRfdGJkICk7CisjZGVmaW5lIHVuZGluZXRfdGJkIF9fdXNlX2RhdGExNiAoIHVuZGluZXRfdGJkICkKKworLyoqCisgKiBUcmFuc21pdCBwYWNrZXQKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdW5kaW5ldF90cmFuc21pdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApIHsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkRJX1RSQU5TTUlUIHVuZGlfdHJhbnNtaXQ7CisJc2l6ZV90IGxlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCWludCByYzsKKworCS8qIFRlY2huaWNhbGx5LCB3ZSBvdWdodCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcHJldmlvdXMKKwkgKiB0cmFuc21pc3Npb24gaGFzIGNvbXBsZXRlZCBiZWZvcmUgd2UgcmUtdXNlIHRoZSBidWZmZXIuCisJICogSG93ZXZlciwgbWFueSBQWEUgc3RhY2tzIChpbmNsdWRpbmcgYXQgbGVhc3Qgc29tZSBJbnRlbCBQWEUKKwkgKiBzdGFja3MgYW5kIEV0aGVyYm9vdCA1LjQpIGZhaWwgdG8gZ2VuZXJhdGUgVFggY29tcGxldGlvbnMuCisJICogSW4gcHJhY3RpY2UgdGhpcyB3b24ndCBiZSBhIHByb2JsZW0sIHNpbmNlIG91ciBUWCBkYXRhcGF0aAorCSAqIGhhcyBhIHZlcnkgbG93IHBhY2tldCB2b2x1bWUgYW5kIHdlIGNhbiBnZXQgYXdheSB3aXRoCisJICogYXNzdW1pbmcgdGhhdCBhIFRYIHdpbGwgYmUgY29tcGxldGUgYnkgdGhlIHRpbWUgd2Ugd2FudCB0bworCSAqIHRyYW5zbWl0IHRoZSBuZXh0IHBhY2tldC4KKwkgKi8KKworCS8qIENvcHkgcGFja2V0IHRvIFVOREkgSS9PIGJ1ZmZlciAqLworCWlmICggbGVuID4gc2l6ZW9mICggYmFzZW1lbV9wYWNrZXQgKSApCisJCWxlbiA9IHNpemVvZiAoIGJhc2VtZW1fcGFja2V0ICk7CisJbWVtY3B5ICggJmJhc2VtZW1fcGFja2V0LCBpb2J1Zi0+ZGF0YSwgbGVuICk7CisKKwkvKiBDcmVhdGUgUFhFTlZfVU5ESV9UUkFOU01JVCBkYXRhIHN0cnVjdHVyZSAqLworCW1lbXNldCAoICZ1bmRpX3RyYW5zbWl0LCAwLCBzaXplb2YgKCB1bmRpX3RyYW5zbWl0ICkgKTsKKwl1bmRpX3RyYW5zbWl0LkRlc3RBZGRyLnNlZ21lbnQgPSBybV9kczsKKwl1bmRpX3RyYW5zbWl0LkRlc3RBZGRyLm9mZnNldCA9IF9fZnJvbV9kYXRhMTYgKCAmdW5kaW5ldF90YmQgKTsKKwl1bmRpX3RyYW5zbWl0LlRCRC5zZWdtZW50ID0gcm1fZHM7CisJdW5kaV90cmFuc21pdC5UQkQub2Zmc2V0ID0gX19mcm9tX2RhdGExNiAoICZ1bmRpbmV0X3RiZCApOworCisJLyogQ3JlYXRlIFBYRU5WX1VORElfVEJEIGRhdGEgc3RydWN0dXJlICovCisJdW5kaW5ldF90YmQuSW1tZWRMZW5ndGggPSBsZW47CisJdW5kaW5ldF90YmQuWG1pdC5zZWdtZW50ID0gcm1fZHM7CisJdW5kaW5ldF90YmQuWG1pdC5vZmZzZXQgPSBfX2Zyb21fZGF0YTE2ICggYmFzZW1lbV9wYWNrZXQgKTsKKworCS8qIElzc3VlIFBYRSBBUEkgY2FsbCAqLworCWlmICggKCByYyA9IHB4ZXBhcmVudF9jYWxsICggdW5kaW5ldF9lbnRyeSwgUFhFTlZfVU5ESV9UUkFOU01JVCwKKwkJCQkgICAgICZ1bmRpX3RyYW5zbWl0LAorCQkJCSAgICAgc2l6ZW9mICggdW5kaV90cmFuc21pdCApICkgKSAhPSAwICkKKwkJZ290byBkb25lOworCisJLyogRnJlZSBJL08gYnVmZmVyICovCisJbmV0ZGV2X3R4X2NvbXBsZXRlICggbmV0ZGV2LCBpb2J1ZiApOworCisgZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKKy8qKiAKKyAqIFBvbGwgZm9yIHJlY2VpdmVkIHBhY2tldHMKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKgorICogRnVuLCBmdW4sIGZ1bi4gIFVOREkgZHJpdmVycyBkb24ndCB1c2UgcG9sbGluZzsgdGhleSB1c2UKKyAqIGludGVycnVwdHMuICBXZSB0aGVyZWZvcmUgY2hlYXQgYW5kIHByZXRlbmQgdGhhdCBhbiBpbnRlcnJ1cHQgaGFzCisgKiBvY2N1cnJlZCBldmVyeSB0aW1lIHVuZGluZXRfcG9sbCgpIGlzIGNhbGxlZC4gIFRoaXMgaXNuJ3QgdG9vIG11Y2gKKyAqIG9mIGEgaGFjazsgUENJIGRldmljZXMgc2hhcmUgSVJRcyBhbmQgc28gdGhlIGZpcnN0IHRoaW5nIHRoYXQgYQorICogcHJvcGVyIElTUiBzaG91bGQgZG8gaXMgY2FsbCBQWEVOVl9VTkRJX0lTUiB0byBkZXRlcm1pbmUgd2hldGhlciBvcgorICogbm90IHRoZSBVTkRJIE5JQyBnZW5lcmF0ZWQgdGhlIGludGVycnVwdDsgdGhlcmUgaXMgbm8gaGFybSBkb25lIGJ5CisgKiBzcHVyaW91cyBjYWxscyB0byBQWEVOVl9VTkRJX0lTUi4gIFNpbWlsYXJseSwgd2Ugd291bGRuJ3QgYmUKKyAqIGhhbmRsaW5nIHRoZW0gYW55IG1vcmUgcmFwaWRseSB0aGFuIHRoZSB1c3VhbCByYXRlIG9mCisgKiB1bmRpbmV0X3BvbGwoKSBiZWluZyBjYWxsZWQgZXZlbiBpZiB3ZSBkaWQgaW1wbGVtZW50IGEgZnVsbCBJU1IuCisgKiBTbyBpdCBzaG91bGQgd29yay4gIEhhIQorICoKKyAqIEFkZGVuZHVtICgyMS8xMC8wMykuICBTb21lIGNhcmRzIGRvbid0IHBsYXkgbmljZWx5IHdpdGggdGhpcyB0cmljaywKKyAqIHNvIGluc3RlYWQgb2YgZG9pbmcgaXQgdGhlIGVhc3kgd2F5IHdlIGhhdmUgdG8gZ28gdG8gYWxsIHRoZSBoYXNzbGUKKyAqIG9mIGluc3RhbGxpbmcgYSBnZW51aW5lIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgYW5kIGRlYWxpbmcgd2l0aAorICogdGhlIHdvbmRlcmZ1bCA4MjU5IFByb2dyYW1tYWJsZSBJbnRlcnJ1cHQgQ29udHJvbGxlci4gIEpveS4KKyAqCisgKiBBZGRlbmR1bSAoMTAvMDcvMDcpLiAgV2hlbiBkb2luZyB0aGluZ3Mgc3VjaCBhcyBpU0NTSSBib290LCBpbgorICogd2hpY2ggd2UgaGF2ZSB0byBjby1vcGVyYXRlIHdpdGggYSBydW5uaW5nIE9TLCB3ZSBjYW4ndCBnZXQgYXdheQorICogd2l0aCB0aGUgIklTUi1qdXN0LWluY3JlbWVudHMtYS1jb3VudGVyLWFuZC1yZXR1cm5zIiB0cmljayBhdCBhbGwsCisgKiBiZWNhdXNlIGl0IGludm9sdmVzIHR5aW5nIHVwIHRoZSBQSUMgZm9yIGZhciB0b28gbG9uZywgYW5kIG90aGVyCisgKiBpbnRlcnJ1cHQtZGVwZW5kZW50IGNvbXBvbmVudHMgKGUuZy4gbG9jYWwgZGlza3MpIHN0YXJ0IGJyZWFraW5nLgorICogV2UgdGhlcmVmb3JlIGltcGxlbWVudCBhICJwcm9wZXIiIElTUiB3aGljaCBjYWxscyBQWEVOVl9VTkRJX0lTUgorICogZnJvbSB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQgaW4gb3JkZXIgdG8gZGVhc3NlcnQgdGhlIGRldmljZQorICogaW50ZXJydXB0LCBhbmQgc2VuZHMgRU9JIGlmIGFwcGxpY2FibGUuCisgKi8KK3N0YXRpYyB2b2lkIHVuZGluZXRfcG9sbCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IHVuZGlfbmljICp1bmRpbmljID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBzX1BYRU5WX1VORElfSVNSIHVuZGlfaXNyOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmID0gTlVMTDsKKwlzaXplX3QgbGVuOworCXNpemVfdCBmcmFnX2xlbjsKKwlzaXplX3QgbWF4X2ZyYWdfbGVuOworCWludCByYzsKKworCWlmICggISB1bmRpbmljLT5pc3JfcHJvY2Vzc2luZyApIHsKKwkJLyogRG8gbm90aGluZyB1bmxlc3MgSVNSIGhhcyBiZWVuIHRyaWdnZXJlZCAqLworCQlpZiAoICEgdW5kaW5ldF9pc3JfdHJpZ2dlcmVkKCkgKSB7CisJCQkvKiBBbGxvdyBpbnRlcnJ1cHQgdG8gb2NjdXIgKi8KKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggInN0aVxuXHQiCisJCQkJCQkJICAgIm5vcFxuXHQiCisJCQkJCQkJICAgIm5vcFxuXHQiCisJCQkJCQkJICAgImNsaVxuXHQiICkgOiA6ICk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBTdGFydCBJU1IgcHJvY2Vzc2luZyAqLworCQl1bmRpbmljLT5pc3JfcHJvY2Vzc2luZyA9IDE7CisJCXVuZGlfaXNyLkZ1bmNGbGFnID0gUFhFTlZfVU5ESV9JU1JfSU5fUFJPQ0VTUzsKKwl9IGVsc2UgeworCQkvKiBDb250aW51ZSBJU1IgcHJvY2Vzc2luZyAqLworCQl1bmRpX2lzci5GdW5jRmxhZyA9IFBYRU5WX1VORElfSVNSX0lOX0dFVF9ORVhUOworCX0KKworCS8qIFJ1biB0aHJvdWdoIHRoZSBJU1IgbG9vcCAqLworCXdoaWxlICggMSApIHsKKwkJaWYgKCAoIHJjID0gcHhlcGFyZW50X2NhbGwgKCB1bmRpbmV0X2VudHJ5LCBQWEVOVl9VTkRJX0lTUiwKKwkJCQkJICAgICAmdW5kaV9pc3IsCisJCQkJCSAgICAgc2l6ZW9mICggdW5kaV9pc3IgKSApICkgIT0gMCApCisJCQlicmVhazsKKwkJc3dpdGNoICggdW5kaV9pc3IuRnVuY0ZsYWcgKSB7CisJCWNhc2UgUFhFTlZfVU5ESV9JU1JfT1VUX1RSQU5TTUlUOgorCQkJLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0cmFuc21pdCBjb21wbGV0aW9ucyAqLworCQkJYnJlYWs7CisJCWNhc2UgUFhFTlZfVU5ESV9JU1JfT1VUX1JFQ0VJVkU6CisJCQkvKiBQYWNrZXQgZnJhZ21lbnQgcmVjZWl2ZWQgKi8KKwkJCWxlbiA9IHVuZGlfaXNyLkZyYW1lTGVuZ3RoOworCQkJZnJhZ19sZW4gPSB1bmRpX2lzci5CdWZmZXJMZW5ndGg7CisJCQlpZiAoICggbGVuID09IDAgKSB8fCAoIGxlbiA8IGZyYWdfbGVuICkgKSB7CisJCQkJLyogRG9uJ3QgbGF1Z2guICBWTVdhcmUgZG9lcyBpdC4gKi8KKwkJCQlEQkdDICggdW5kaW5pYywgIlVORElOSUMgJXAgcmVwb3J0ZWQgaW5zYW5lICIKKwkJCQkgICAgICAgImZyYWdtZW50ICglemQgb2YgJXpkIGJ5dGVzKVxuIiwKKwkJCQkgICAgICAgdW5kaW5pYywgZnJhZ19sZW4sIGxlbiApOworCQkJCW5ldGRldl9yeF9lcnIgKCBuZXRkZXYsIE5VTEwsIC1FSU5WQUwgKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICggISBpb2J1ZiApCisJCQkJaW9idWYgPSBhbGxvY19pb2IgKCBsZW4gKTsKKwkJCWlmICggISBpb2J1ZiApIHsKKwkJCQlEQkdDICggdW5kaW5pYywgIlVORElOSUMgJXAgY291bGQgbm90ICIKKwkJCQkgICAgICAgImFsbG9jYXRlICV6ZCBieXRlcyBmb3IgUlggYnVmZmVyXG4iLAorCQkJCSAgICAgICB1bmRpbmljLCBsZW4gKTsKKwkJCQkvKiBGcmFnbWVudCB3aWxsIGJlIGRyb3BwZWQgKi8KKwkJCQluZXRkZXZfcnhfZXJyICggbmV0ZGV2LCBOVUxMLCAtRU5PTUVNICk7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJbWF4X2ZyYWdfbGVuID0gaW9iX3RhaWxyb29tICggaW9idWYgKTsKKwkJCWlmICggZnJhZ19sZW4gPiBtYXhfZnJhZ19sZW4gKSB7CisJCQkJREJHQyAoIHVuZGluaWMsICJVTkRJTklDICVwIGZyYWdtZW50IHRvbyBiaWcgIgorCQkJCSAgICAgICAiKCV6ZCslemQgZG9lcyBub3QgZml0IGludG8gJXpkKVxuIiwKKwkJCQkgICAgICAgdW5kaW5pYywgaW9iX2xlbiAoIGlvYnVmICksIGZyYWdfbGVuLAorCQkJCSAgICAgICAoIGlvYl9sZW4gKCBpb2J1ZiApICsgbWF4X2ZyYWdfbGVuICkgKTsKKwkJCQlmcmFnX2xlbiA9IG1heF9mcmFnX2xlbjsKKwkJCX0KKwkJCWNvcHlfZnJvbV9yZWFsICggaW9iX3B1dCAoIGlvYnVmLCBmcmFnX2xlbiApLAorCQkJCQkgdW5kaV9pc3IuRnJhbWUuc2VnbWVudCwKKwkJCQkJIHVuZGlfaXNyLkZyYW1lLm9mZnNldCwgZnJhZ19sZW4gKTsKKwkJCWlmICggaW9iX2xlbiAoIGlvYnVmICkgPT0gbGVuICkgeworCQkJCS8qIFdob2xlIHBhY2tldCByZWNlaXZlZDsgZGVsaXZlciBpdCAqLworCQkJCW5ldGRldl9yeCAoIG5ldGRldiwgaW9iX2Rpc293biAoIGlvYnVmICkgKTsKKwkJCQkvKiBFdGhlcmJvb3QgNS40IGZhaWxzIHRvIHJldHVybiBhbGwgcGFja2V0cworCQkJCSAqIHVuZGVyIG1pbGQgbG9hZDsgcHJldGVuZCBpdCByZXRyaWdnZXJlZC4KKwkJCQkgKi8KKwkJCQlpZiAoIHVuZGluaWMtPmhhY2tzICYgVU5ESV9IQUNLX0VCNTQgKQorCQkJCQktLWxhc3RfdHJpZ2dlcl9jb3VudDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBYRU5WX1VORElfSVNSX09VVF9ET05FOgorCQkJLyogUHJvY2Vzc2luZyBjb21wbGV0ZSAqLworCQkJdW5kaW5pYy0+aXNyX3Byb2Nlc3NpbmcgPSAwOworCQkJZ290byBkb25lOworCQlkZWZhdWx0OgorCQkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gIFZNV2FyZSBkb2VzIGl0IHJvdXRpbmVseS4gKi8KKwkJCURCR0MgKCB1bmRpbmljLCAiVU5ESU5JQyAlcCBJU1IgcmV0dXJuZWQgaW52YWxpZCAiCisJCQkgICAgICAgIkZ1bmNGbGFnICUwNHhcbiIsIHVuZGluaWMsIHVuZGlfaXNyLkZ1bmNGbGFnICk7CisJCQl1bmRpbmljLT5pc3JfcHJvY2Vzc2luZyA9IDA7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJdW5kaV9pc3IuRnVuY0ZsYWcgPSBQWEVOVl9VTkRJX0lTUl9JTl9HRVRfTkVYVDsKKwl9CisKKyBkb25lOgorCWlmICggaW9idWYgKSB7CisJCURCR0MgKCB1bmRpbmljLCAiVU5ESU5JQyAlcCByZXR1cm5lZCBpbmNvbXBsZXRlIHBhY2tldCAiCisJCSAgICAgICAiKCV6ZCBvZiAlemQpXG4iLCB1bmRpbmljLCBpb2JfbGVuICggaW9idWYgKSwKKwkJICAgICAgICggaW9iX2xlbiAoIGlvYnVmICkgKyBpb2JfdGFpbHJvb20gKCBpb2J1ZiApICkgKTsKKwkJbmV0ZGV2X3J4X2VyciAoIG5ldGRldiwgaW9idWYsIC1FSU5WQUwgKTsKKwl9Cit9CisKKy8qKgorICogT3BlbiBOSUMKKyAqCisgKiBAdiBuZXRkZXYJCU5ldCBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHVuZGluZXRfb3BlbiAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IHVuZGlfbmljICp1bmRpbmljID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBzX1BYRU5WX1VORElfU0VUX1NUQVRJT05fQUREUkVTUyB1bmRpX3NldF9hZGRyZXNzOworCXN0cnVjdCBzX1BYRU5WX1VORElfT1BFTiB1bmRpX29wZW47CisJaW50IHJjOworCisJLyogSG9vayBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGFuZCBlbmFibGUgaW50ZXJydXB0ICovCisJdW5kaW5ldF9ob29rX2lzciAoIHVuZGluaWMtPmlycSApOworCWVuYWJsZV9pcnEgKCB1bmRpbmljLT5pcnEgKTsKKwlzZW5kX2VvaSAoIHVuZGluaWMtPmlycSApOworCisJLyogU2V0IHN0YXRpb24gYWRkcmVzcy4gIFJlcXVpcmVkIGZvciBzb21lIFBYRSBzdGFja3M7IHdpbGwKKwkgKiBzcHVyaW91c2x5IGZhaWwgb24gb3RoZXJzLiAgSWdub3JlIGZhaWx1cmVzLiAgV2Ugb25seSBldmVyCisJICogdXNlIGl0IHRvIHNldCB0aGUgTUFDIGFkZHJlc3MgdG8gdGhlIGNhcmQncyBwZXJtYW5lbnQgdmFsdWUKKwkgKiBhbnl3YXkuCisJICovCisJbWVtY3B5ICggdW5kaV9zZXRfYWRkcmVzcy5TdGF0aW9uQWRkcmVzcywgbmV0ZGV2LT5sbF9hZGRyLAorCQkgc2l6ZW9mICggdW5kaV9zZXRfYWRkcmVzcy5TdGF0aW9uQWRkcmVzcyApICk7CisJcHhlcGFyZW50X2NhbGwgKCB1bmRpbmV0X2VudHJ5LCBQWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFJFU1MsCisJCQkgJnVuZGlfc2V0X2FkZHJlc3MsIHNpemVvZiAoIHVuZGlfc2V0X2FkZHJlc3MgKSApOworCisJLyogT3BlbiBOSUMuICBXZSBhc2sgZm9yIHByb21pc2N1b3VzIG9wZXJhdGlvbiwgc2luY2UgaXQncyB0aGUKKwkgKiBvbmx5IHdheSB0byBhc2sgZm9yIGFsbCBtdWx0aWNhc3QgYWRkcmVzc2VzLiAgT24gYW55CisJICogc3dpdGNoZWQgbmV0d29yaywgaXQgc2hvdWxkbid0IHJlYWxseSBtYWtlIGEgZGlmZmVyZW5jZSB0bworCSAqIHBlcmZvcm1hbmNlLgorCSAqLworCW1lbXNldCAoICZ1bmRpX29wZW4sIDAsIHNpemVvZiAoIHVuZGlfb3BlbiApICk7CisJdW5kaV9vcGVuLlBrdEZpbHRlciA9ICggRkxUUl9ESVJFQ1RFRCB8IEZMVFJfQlJEQ1NUIHwgRkxUUl9QUk1TQ1MgKTsKKwlpZiAoICggcmMgPSBweGVwYXJlbnRfY2FsbCAoIHVuZGluZXRfZW50cnksIFBYRU5WX1VORElfT1BFTiwKKwkJCQkgICAgICZ1bmRpX29wZW4sIHNpemVvZiAoIHVuZGlfb3BlbiApICkgKSAhPSAwICkKKwkJZ290byBlcnI7CisKKwlEQkdDICggdW5kaW5pYywgIlVORElOSUMgJXAgb3BlbmVkXG4iLCB1bmRpbmljICk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJdW5kaW5ldF9jbG9zZSAoIG5ldGRldiApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBDbG9zZSBOSUMKKyAqCisgKiBAdiBuZXRkZXYJCU5ldCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgdW5kaW5ldF9jbG9zZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IHVuZGlfbmljICp1bmRpbmljID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBzX1BYRU5WX1VORElfSVNSIHVuZGlfaXNyOworCXN0cnVjdCBzX1BYRU5WX1VORElfQ0xPU0UgdW5kaV9jbG9zZTsKKwlpbnQgcmM7CisKKwkvKiBFbnN1cmUgSVNSIGhhcyBleGl0ZWQgY2xlYW5seSAqLworCXdoaWxlICggdW5kaW5pYy0+aXNyX3Byb2Nlc3NpbmcgKSB7CisJCXVuZGlfaXNyLkZ1bmNGbGFnID0gUFhFTlZfVU5ESV9JU1JfSU5fR0VUX05FWFQ7CisJCWlmICggKCByYyA9IHB4ZXBhcmVudF9jYWxsICggdW5kaW5ldF9lbnRyeSwgUFhFTlZfVU5ESV9JU1IsCisJCQkJCSAgICAgJnVuZGlfaXNyLAorCQkJCQkgICAgIHNpemVvZiAoIHVuZGlfaXNyICkgKSApICE9IDAgKQorCQkJYnJlYWs7CisJCXN3aXRjaCAoIHVuZGlfaXNyLkZ1bmNGbGFnICkgeworCQljYXNlIFBYRU5WX1VORElfSVNSX09VVF9UUkFOU01JVDoKKwkJY2FzZSBQWEVOVl9VTkRJX0lTUl9PVVRfUkVDRUlWRToKKwkJCS8qIENvbnRpbnVlIGRyYWluaW5nICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFN0b3AgcHJvY2Vzc2luZyAqLworCQkJdW5kaW5pYy0+aXNyX3Byb2Nlc3NpbmcgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDbG9zZSBOSUMgKi8KKwlweGVwYXJlbnRfY2FsbCAoIHVuZGluZXRfZW50cnksIFBYRU5WX1VORElfQ0xPU0UsCisJCQkgJnVuZGlfY2xvc2UsIHNpemVvZiAoIHVuZGlfY2xvc2UgKSApOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHQgYW5kIHVuaG9vayBJU1IgKi8KKwlkaXNhYmxlX2lycSAoIHVuZGluaWMtPmlycSApOworCXVuZGluZXRfdW5ob29rX2lzciAoIHVuZGluaWMtPmlycSApOworCisJREJHQyAoIHVuZGluaWMsICJVTkRJTklDICVwIGNsb3NlZFxuIiwgdW5kaW5pYyApOworfQorCisvKioKKyAqIEVuYWJsZS9kaXNhYmxlIGludGVycnVwdHMKKyAqCisgKiBAdiBuZXRkZXYJCU5ldCBkZXZpY2UKKyAqIEB2IGVuYWJsZQkJSW50ZXJydXB0cyBzaG91bGQgYmUgZW5hYmxlZAorICovCitzdGF0aWMgdm9pZCB1bmRpbmV0X2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBlbmFibGUgKSB7CisJc3RydWN0IHVuZGlfbmljICp1bmRpbmljID0gbmV0ZGV2LT5wcml2OworCisJLyogQ2Fubm90IHN1cHBvcnQgaW50ZXJydXB0cyB5ZXQgKi8KKwlEQkdDICggdW5kaW5pYywgIlVORElOSUMgJXAgY2Fubm90ICVzIGludGVycnVwdHNcbiIsCisJICAgICAgIHVuZGluaWMsICggZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIgKSApOworfQorCisvKiogVU5ESSBuZXR3b3JrIGRldmljZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BlcmF0aW9ucyB1bmRpbmV0X29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gdW5kaW5ldF9vcGVuLAorCS5jbG9zZQkJPSB1bmRpbmV0X2Nsb3NlLAorCS50cmFuc21pdAk9IHVuZGluZXRfdHJhbnNtaXQsCisJLnBvbGwJCT0gdW5kaW5ldF9wb2xsLAorCS5pcnEgICAJCT0gdW5kaW5ldF9pcnEsCit9OworCisvKioKKyAqIFByb2JlIFVOREkgZGV2aWNlCisgKgorICogQHYgdW5kaQkJVU5ESSBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgdW5kaW5ldF9wcm9iZSAoIHN0cnVjdCB1bmRpX2RldmljZSAqdW5kaSApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCB1bmRpX25pYyAqdW5kaW5pYzsKKwlzdHJ1Y3Qgc19QWEVOVl9TVEFSVF9VTkRJIHN0YXJ0X3VuZGk7CisJc3RydWN0IHNfUFhFTlZfVU5ESV9TVEFSVFVQIHVuZGlfc3RhcnR1cDsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkRJX0lOSVRJQUxJWkUgdW5kaV9pbml0aWFsaXplOworCXN0cnVjdCBzX1BYRU5WX1VORElfR0VUX0lORk9STUFUSU9OIHVuZGlfaW5mbzsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPIHVuZGlfaWZhY2U7CisJc3RydWN0IHNfUFhFTlZfVU5ESV9TSFVURE9XTiB1bmRpX3NodXRkb3duOworCXN0cnVjdCBzX1BYRU5WX1VORElfQ0xFQU5VUCB1bmRpX2NsZWFudXA7CisJc3RydWN0IHNfUFhFTlZfU1RPUF9VTkRJIHN0b3BfdW5kaTsKKwlpbnQgcmM7CisKKwkvKiBBbGxvY2F0ZSBuZXQgZGV2aWNlICovCisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYgKCBzaXplb2YgKCAqdW5kaW5pYyApICk7CisJaWYgKCAhIG5ldGRldiApCisJCXJldHVybiAtRU5PTUVNOworCW5ldGRldl9pbml0ICggbmV0ZGV2LCAmdW5kaW5ldF9vcGVyYXRpb25zICk7CisJdW5kaW5pYyA9IG5ldGRldi0+cHJpdjsKKwl1bmRpX3NldF9kcnZkYXRhICggdW5kaSwgbmV0ZGV2ICk7CisJbmV0ZGV2LT5kZXYgPSAmdW5kaS0+ZGV2OworCW1lbXNldCAoIHVuZGluaWMsIDAsIHNpemVvZiAoICp1bmRpbmljICkgKTsKKwl1bmRpbmV0X2VudHJ5ID0gdW5kaS0+ZW50cnk7CisJREJHQyAoIHVuZGluaWMsICJVTkRJTklDICVwIHVzaW5nIFVOREkgJXBcbiIsIHVuZGluaWMsIHVuZGkgKTsKKworCS8qIEhvb2sgaW4gVU5ESSBzdGFjayAqLworCWlmICggISAoIHVuZGktPmZsYWdzICYgVU5ESV9GTF9TVEFSVEVEICkgKSB7CisJCW1lbXNldCAoICZzdGFydF91bmRpLCAwLCBzaXplb2YgKCBzdGFydF91bmRpICkgKTsKKwkJc3RhcnRfdW5kaS5BWCA9IHVuZGktPnBjaV9idXNkZXZmbjsKKwkJc3RhcnRfdW5kaS5CWCA9IHVuZGktPmlzYXBucF9jc247CisJCXN0YXJ0X3VuZGkuRFggPSB1bmRpLT5pc2FwbnBfcmVhZF9wb3J0OworCQlzdGFydF91bmRpLkVTID0gQklPU19TRUc7CisJCXN0YXJ0X3VuZGkuREkgPSBmaW5kX3BucF9iaW9zKCk7CisJCWlmICggKCByYyA9IHB4ZXBhcmVudF9jYWxsICggdW5kaW5ldF9lbnRyeSwgUFhFTlZfU1RBUlRfVU5ESSwKKwkJCQkJICAgICAmc3RhcnRfdW5kaSwKKwkJCQkJICAgICBzaXplb2YgKCBzdGFydF91bmRpICkgKSApICE9IDAgKQorCQkJZ290byBlcnJfc3RhcnRfdW5kaTsKKwl9CisJdW5kaS0+ZmxhZ3MgfD0gVU5ESV9GTF9TVEFSVEVEOworCisJLyogQnJpbmcgdXAgVU5ESSBzdGFjayAqLworCWlmICggISAoIHVuZGktPmZsYWdzICYgVU5ESV9GTF9JTklUSUFMSVpFRCApICkgeworCQltZW1zZXQgKCAmdW5kaV9zdGFydHVwLCAwLCBzaXplb2YgKCB1bmRpX3N0YXJ0dXAgKSApOworCQlpZiAoICggcmMgPSBweGVwYXJlbnRfY2FsbCAoIHVuZGluZXRfZW50cnksIFBYRU5WX1VORElfU1RBUlRVUCwKKwkJCQkJICAgICAmdW5kaV9zdGFydHVwLAorCQkJCQkgICAgIHNpemVvZiAoIHVuZGlfc3RhcnR1cCApICkgKSAhPSAwICkKKwkJCWdvdG8gZXJyX3VuZGlfc3RhcnR1cDsKKwkJbWVtc2V0ICggJnVuZGlfaW5pdGlhbGl6ZSwgMCwgc2l6ZW9mICggdW5kaV9pbml0aWFsaXplICkgKTsKKwkJaWYgKCAoIHJjID0gcHhlcGFyZW50X2NhbGwgKCB1bmRpbmV0X2VudHJ5LAorCQkJCQkgICAgIFBYRU5WX1VORElfSU5JVElBTElaRSwKKwkJCQkJICAgICAmdW5kaV9pbml0aWFsaXplLAorCQkJCQkgICAgIHNpemVvZiAoIHVuZGlfaW5pdGlhbGl6ZSApKSkgIT0gMCApCisJCQlnb3RvIGVycl91bmRpX2luaXRpYWxpemU7CisJfQorCXVuZGktPmZsYWdzIHw9IFVORElfRkxfSU5JVElBTElaRUQ7CisKKwkvKiBHZXQgZGV2aWNlIGluZm9ybWF0aW9uICovCisJbWVtc2V0ICggJnVuZGlfaW5mbywgMCwgc2l6ZW9mICggdW5kaV9pbmZvICkgKTsKKwlpZiAoICggcmMgPSBweGVwYXJlbnRfY2FsbCAoIHVuZGluZXRfZW50cnksIFBYRU5WX1VORElfR0VUX0lORk9STUFUSU9OLAorCQkJCSAgICAgJnVuZGlfaW5mbywgc2l6ZW9mICggdW5kaV9pbmZvICkgKSApICE9IDAgKQorCQlnb3RvIGVycl91bmRpX2dldF9pbmZvcm1hdGlvbjsKKwltZW1jcHkgKCBuZXRkZXYtPmh3X2FkZHIsIHVuZGlfaW5mby5QZXJtTm9kZUFkZHJlc3MsIEVUSF9BTEVOICk7CisJdW5kaW5pYy0+aXJxID0gdW5kaV9pbmZvLkludE51bWJlcjsKKwlpZiAoIHVuZGluaWMtPmlycSA+IElSUV9NQVggKSB7CisJCURCR0MgKCB1bmRpbmljLCAiVU5ESU5JQyAlcCBpbnZhbGlkIElSUSAlZFxuIiwKKwkJICAgICAgIHVuZGluaWMsIHVuZGluaWMtPmlycSApOworCQlnb3RvIGVycl9iYWRfaXJxOworCX0KKwlEQkdDICggdW5kaW5pYywgIlVORElOSUMgJXAgaXMgJXMgb24gSVJRICVkXG4iLAorCSAgICAgICB1bmRpbmljLCBldGhfbnRvYSAoIG5ldGRldi0+aHdfYWRkciApLCB1bmRpbmljLT5pcnEgKTsKKworCS8qIEdldCBpbnRlcmZhY2UgaW5mb3JtYXRpb24gKi8KKwltZW1zZXQgKCAmdW5kaV9pZmFjZSwgMCwgc2l6ZW9mICggdW5kaV9pZmFjZSApICk7CisJaWYgKCAoIHJjID0gcHhlcGFyZW50X2NhbGwgKCB1bmRpbmV0X2VudHJ5LCBQWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPLAorCQkJCSAgICAgJnVuZGlfaWZhY2UsCisJCQkJICAgICBzaXplb2YgKCB1bmRpX2lmYWNlICkgKSApICE9IDAgKQorCQlnb3RvIGVycl91bmRpX2dldF9pZmFjZV9pbmZvOworCURCR0MgKCB1bmRpbmljLCAiVU5ESU5JQyAlcCBoYXMgdHlwZSAlcywgc3BlZWQgJWQsIGZsYWdzICUwOHhcbiIsCisJICAgICAgIHVuZGluaWMsIHVuZGlfaWZhY2UuSWZhY2VUeXBlLCB1bmRpX2lmYWNlLkxpbmtTcGVlZCwKKwkgICAgICAgdW5kaV9pZmFjZS5TZXJ2aWNlRmxhZ3MgKTsKKwlpZiAoIHN0cm5jbXAgKCAoICggY2hhciAqICkgdW5kaV9pZmFjZS5JZmFjZVR5cGUgKSwgIkV0aGVyYm9vdCIsCisJCSAgICAgICBzaXplb2YgKCB1bmRpX2lmYWNlLklmYWNlVHlwZSApICkgPT0gMCApIHsKKwkJREJHQyAoIHVuZGluaWMsICJVTkRJTklDICVwIEV0aGVyYm9vdCA1LjQgd29ya2Fyb3VuZCBlbmFibGVkXG4iLAorCQkgICAgICAgdW5kaW5pYyApOworCQl1bmRpbmljLT5oYWNrcyB8PSBVTkRJX0hBQ0tfRUI1NDsKKwl9CisKKwkvKiBNYXJrIGFzIGxpbmsgdXA7IHdlIGRvbid0IGhhbmRsZSBsaW5rIHN0YXRlICovCisJbmV0ZGV2X2xpbmtfdXAgKCBuZXRkZXYgKTsKKworCS8qIFJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlICovCisJaWYgKCAoIHJjID0gcmVnaXN0ZXJfbmV0ZGV2ICggbmV0ZGV2ICkgKSAhPSAwICkKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisKKwlEQkdDICggdW5kaW5pYywgIlVORElOSUMgJXAgYWRkZWRcbiIsIHVuZGluaWMgKTsKKwlyZXR1cm4gMDsKKworIGVycl9yZWdpc3RlcjoKKyBlcnJfdW5kaV9nZXRfaWZhY2VfaW5mbzoKKyBlcnJfYmFkX2lycToKKyBlcnJfdW5kaV9nZXRfaW5mb3JtYXRpb246CisgZXJyX3VuZGlfaW5pdGlhbGl6ZToKKwkvKiBTaHV0IGRvd24gVU5ESSBzdGFjayAqLworCW1lbXNldCAoICZ1bmRpX3NodXRkb3duLCAwLCBzaXplb2YgKCB1bmRpX3NodXRkb3duICkgKTsKKwlweGVwYXJlbnRfY2FsbCAoIHVuZGluZXRfZW50cnksIFBYRU5WX1VORElfU0hVVERPV04sICZ1bmRpX3NodXRkb3duLAorCQkJIHNpemVvZiAoIHVuZGlfc2h1dGRvd24gKSApOworCW1lbXNldCAoICZ1bmRpX2NsZWFudXAsIDAsIHNpemVvZiAoIHVuZGlfY2xlYW51cCApICk7CisJcHhlcGFyZW50X2NhbGwgKCB1bmRpbmV0X2VudHJ5LCBQWEVOVl9VTkRJX0NMRUFOVVAsICZ1bmRpX2NsZWFudXAsCisJCQkgc2l6ZW9mICggdW5kaV9jbGVhbnVwICkgKTsKKwl1bmRpLT5mbGFncyAmPSB+VU5ESV9GTF9JTklUSUFMSVpFRDsKKyBlcnJfdW5kaV9zdGFydHVwOgorCS8qIFVuaG9vayBVTkRJIHN0YWNrICovCisJbWVtc2V0ICggJnN0b3BfdW5kaSwgMCwgc2l6ZW9mICggc3RvcF91bmRpICkgKTsKKwlweGVwYXJlbnRfY2FsbCAoIHVuZGluZXRfZW50cnksIFBYRU5WX1NUT1BfVU5ESSwgJnN0b3BfdW5kaSwKKwkJCSBzaXplb2YgKCBzdG9wX3VuZGkgKSApOworCXVuZGktPmZsYWdzICY9IH5VTkRJX0ZMX1NUQVJURUQ7CisgZXJyX3N0YXJ0X3VuZGk6CisJbmV0ZGV2X251bGxpZnkgKCBuZXRkZXYgKTsKKwluZXRkZXZfcHV0ICggbmV0ZGV2ICk7CisJdW5kaV9zZXRfZHJ2ZGF0YSAoIHVuZGksIE5VTEwgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVtb3ZlIFVOREkgZGV2aWNlCisgKgorICogQHYgdW5kaQkJVU5ESSBkZXZpY2UKKyAqLwordm9pZCB1bmRpbmV0X3JlbW92ZSAoIHN0cnVjdCB1bmRpX2RldmljZSAqdW5kaSApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gdW5kaV9nZXRfZHJ2ZGF0YSAoIHVuZGkgKTsKKwlzdHJ1Y3QgdW5kaV9uaWMgKnVuZGluaWMgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IHNfUFhFTlZfVU5ESV9TSFVURE9XTiB1bmRpX3NodXRkb3duOworCXN0cnVjdCBzX1BYRU5WX1VORElfQ0xFQU5VUCB1bmRpX2NsZWFudXA7CisJc3RydWN0IHNfUFhFTlZfU1RPUF9VTkRJIHN0b3BfdW5kaTsKKworCS8qIFVucmVnaXN0ZXIgbmV0IGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2ICggbmV0ZGV2ICk7CisKKwkvKiBJZiB3ZSBhcmUgcHJlcGFyaW5nIGZvciBhbiBPUyBib290LCBvciBpZiB3ZSBjYW5ub3QgZXhpdAorCSAqIHZpYSB0aGUgUFhFIHN0YWNrLCB0aGVuIHNodXQgZG93biB0aGUgUFhFIHN0YWNrLgorCSAqLworCWlmICggISAoIHVuZGktPmZsYWdzICYgVU5ESV9GTF9LRUVQX0FMTCApICkgeworCisJCS8qIFNodXQgZG93biBVTkRJIHN0YWNrICovCisJCW1lbXNldCAoICZ1bmRpX3NodXRkb3duLCAwLCBzaXplb2YgKCB1bmRpX3NodXRkb3duICkgKTsKKwkJcHhlcGFyZW50X2NhbGwgKCB1bmRpbmV0X2VudHJ5LCBQWEVOVl9VTkRJX1NIVVRET1dOLAorCQkJCSAmdW5kaV9zaHV0ZG93biwgc2l6ZW9mICggdW5kaV9zaHV0ZG93biApICk7CisJCW1lbXNldCAoICZ1bmRpX2NsZWFudXAsIDAsIHNpemVvZiAoIHVuZGlfY2xlYW51cCApICk7CisJCXB4ZXBhcmVudF9jYWxsICggdW5kaW5ldF9lbnRyeSwgUFhFTlZfVU5ESV9DTEVBTlVQLAorCQkJCSAmdW5kaV9jbGVhbnVwLCBzaXplb2YgKCB1bmRpX2NsZWFudXAgKSApOworCQl1bmRpLT5mbGFncyAmPSB+VU5ESV9GTF9JTklUSUFMSVpFRDsKKworCQkvKiBVbmhvb2sgVU5ESSBzdGFjayAqLworCQltZW1zZXQgKCAmc3RvcF91bmRpLCAwLCBzaXplb2YgKCBzdG9wX3VuZGkgKSApOworCQlweGVwYXJlbnRfY2FsbCAoIHVuZGluZXRfZW50cnksIFBYRU5WX1NUT1BfVU5ESSwgJnN0b3BfdW5kaSwKKwkJCQkgc2l6ZW9mICggc3RvcF91bmRpICkgKTsKKwkJdW5kaS0+ZmxhZ3MgJj0gflVORElfRkxfU1RBUlRFRDsKKwl9CisKKwkvKiBDbGVhciBlbnRyeSBwb2ludCAqLworCW1lbXNldCAoICZ1bmRpbmV0X2VudHJ5LCAwLCBzaXplb2YgKCB1bmRpbmV0X2VudHJ5ICkgKTsKKworCS8qIEZyZWUgbmV0d29yayBkZXZpY2UgKi8KKwluZXRkZXZfbnVsbGlmeSAoIG5ldGRldiApOworCW5ldGRldl9wdXQgKCBuZXRkZXYgKTsKKworCURCR0MgKCB1bmRpbmljLCAiVU5ESU5JQyAlcCByZW1vdmVkXG4iLCB1bmRpbmljICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvZHJpdmVycy9uZXQvdW5kaW9ubHkuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpb25seS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmI1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvZHJpdmVycy9uZXQvdW5kaW9ubHkuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbml0Lmg+CisjaW5jbHVkZSA8dW5kaS5oPgorI2luY2x1ZGUgPHVuZGluZXQuaD4KKyNpbmNsdWRlIDx1bmRpcHJlbG9hZC5oPgorCisvKiogQGZpbGUKKyAqCisgKiAiUHVyZSIgVU5ESSBkcml2ZXIKKyAqCisgKiBUaGlzIGlzIHRoZSBVTkRJIGRyaXZlciB3aXRob3V0IGV4cGxpY2l0IHN1cHBvcnQgZm9yIFBDSSBvciBhbnkKKyAqIG90aGVyIGJ1cyB0eXBlLiAgSXQgaXMgY2FwYWJsZSBvbmx5IG9mIHVzaW5nIHRoZSBwcmVsb2FkZWQgVU5ESQorICogZGV2aWNlLiAgSXQgbXVzdCBub3QgYmUgY29tYmluZWQgaW4gYW4gaW1hZ2Ugd2l0aCBhbnkgb3RoZXIKKyAqIGRyaXZlcnMuCisgKgorICogSWYgeW91IHdhbnQgYSBQWEUtbG9hZGFibGUgaW1hZ2UgdGhhdCBjb250YWlucyBvbmx5IHRoZSBVTkRJCisgKiBkcml2ZXIsIGJ1aWxkICJiaW4vdW5kaW9ubHkua3B4ZSIuCisgKgorICogSWYgeW91IHdhbnQgYW55IG90aGVyIGltYWdlIGZvcm1hdCwgb3IgYW55IG90aGVyIGRyaXZlcnMgaW4KKyAqIGFkZGl0aW9uIHRvIHRoZSBVTkRJIGRyaXZlciwgYnVpbGQgZS5nLiAiYmluL3VuZGkuZHNrIi4KKyAqLworCisvKioKKyAqIFByb2JlIFVOREkgcm9vdCBidXMKKyAqCisgKiBAdiByb290ZGV2CQlVTkRJIGJ1cyByb290IGRldmljZQorICoKKyAqIFNjYW5zIHRoZSBVTkRJIGJ1cyBmb3IgZGV2aWNlcyBhbmQgcmVnaXN0ZXJzIGFsbCBkZXZpY2VzIGl0IGNhbgorICogZmluZC4KKyAqLworc3RhdGljIGludCB1bmRpYnVzX3Byb2JlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICkgeworCXN0cnVjdCB1bmRpX2RldmljZSAqdW5kaSA9ICZwcmVsb2FkZWRfdW5kaTsKKwlpbnQgcmM7CisKKwkvKiBDaGVjayBmb3IgYSB2YWxpZSBwcmVsb2FkZWQgVU5ESSBkZXZpY2UgKi8KKwlpZiAoICEgdW5kaS0+ZW50cnkuc2VnbWVudCApIHsKKwkJREJHICggIk5vIHByZWxvYWRlZCBVTkRJIGRldmljZSBmb3VuZCFcbiIgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQWRkIHRvIGRldmljZSBoaWVyYXJjaHkgKi8KKwlzdHJuY3B5ICggdW5kaS0+ZGV2Lm5hbWUsICJVTkRJIiwKKwkJICAoIHNpemVvZiAoIHVuZGktPmRldi5uYW1lICkgLSAxICkgKTsKKwlpZiAoIHVuZGktPnBjaV9idXNkZXZmbiAhPSBVTkRJX05PX1BDSV9CVVNERVZGTiApIHsKKwkJdW5kaS0+ZGV2LmRlc2MuYnVzX3R5cGUgPSBCVVNfVFlQRV9QQ0k7CisJCXVuZGktPmRldi5kZXNjLmxvY2F0aW9uID0gdW5kaS0+cGNpX2J1c2RldmZuOworCQl1bmRpLT5kZXYuZGVzYy52ZW5kb3IgPSB1bmRpLT5wY2lfdmVuZG9yOworCQl1bmRpLT5kZXYuZGVzYy5kZXZpY2UgPSB1bmRpLT5wY2lfZGV2aWNlOworCX0gZWxzZSBpZiAoIHVuZGktPmlzYXBucF9jc24gIT0gVU5ESV9OT19JU0FQTlBfQ1NOICkgeworCQl1bmRpLT5kZXYuZGVzYy5idXNfdHlwZSA9IEJVU19UWVBFX0lTQVBOUDsKKwl9CisJdW5kaS0+ZGV2LnBhcmVudCA9ICZyb290ZGV2LT5kZXY7CisJbGlzdF9hZGQgKCAmdW5kaS0+ZGV2LnNpYmxpbmdzLCAmcm9vdGRldi0+ZGV2LmNoaWxkcmVuKTsKKwlJTklUX0xJU1RfSEVBRCAoICZ1bmRpLT5kZXYuY2hpbGRyZW4gKTsKKworCS8qIENyZWF0ZSBuZXR3b3JrIGRldmljZSAqLworCWlmICggKCByYyA9IHVuZGluZXRfcHJvYmUgKCB1bmRpICkgKSAhPSAwICkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKKworIGVycjoKKwlsaXN0X2RlbCAoICZ1bmRpLT5kZXYuc2libGluZ3MgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVtb3ZlIFVOREkgcm9vdCBidXMKKyAqCisgKiBAdiByb290ZGV2CQlVTkRJIGJ1cyByb290IGRldmljZQorICovCitzdGF0aWMgdm9pZCB1bmRpYnVzX3JlbW92ZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgdW5kaV9kZXZpY2UgKnVuZGkgPSAmcHJlbG9hZGVkX3VuZGk7CisKKwl1bmRpbmV0X3JlbW92ZSAoIHVuZGkgKTsKKwlsaXN0X2RlbCAoICZ1bmRpLT5kZXYuc2libGluZ3MgKTsKK30KKworLyoqIFVOREkgYnVzIHJvb3QgZGV2aWNlIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCByb290X2RyaXZlciB1bmRpX3Jvb3RfZHJpdmVyID0geworCS5wcm9iZSA9IHVuZGlidXNfcHJvYmUsCisJLnJlbW92ZSA9IHVuZGlidXNfcmVtb3ZlLAorfTsKKworLyoqIFVOREkgYnVzIHJvb3QgZGV2aWNlICovCitzdHJ1Y3Qgcm9vdF9kZXZpY2UgdW5kaV9yb290X2RldmljZSBfX3Jvb3RfZGV2aWNlID0geworCS5kZXYgPSB7IC5uYW1lID0gIlVOREkiIH0sCisJLmRyaXZlciA9ICZ1bmRpX3Jvb3RfZHJpdmVyLAorfTsKKworLyoqCisgKiBQcmVwYXJlIGZvciBleGl0CisgKgorICogQHYgZmxhZ3MJCVNodXRkb3duIGZsYWdzCisgKi8KK3N0YXRpYyB2b2lkIHVuZGlvbmx5X3NodXRkb3duICggaW50IGZsYWdzICkgeworCS8qIElmIHdlIGFyZSBzaHV0dGluZyBkb3duIHRvIGJvb3QgYW4gT1MsIGNsZWFyIHRoZSAia2VlcCBQWEUKKwkgKiBzdGFjayIgZmxhZy4KKwkgKi8KKwlpZiAoIGZsYWdzICYgU0hVVERPV05fQk9PVCApCisJCXByZWxvYWRlZF91bmRpLmZsYWdzICY9IH5VTkRJX0ZMX0tFRVBfQUxMOworfQorCitzdHJ1Y3Qgc3RhcnR1cF9mbiBzdGFydHVwX3VuZGlvbmx5IF9fc3RhcnR1cF9mbiAoIFNUQVJUVVBfTEFURSApID0geworCS5zaHV0ZG93biA9IHVuZGlvbmx5X3NodXRkb3duLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpcHJlbG9hZC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2RyaXZlcnMvbmV0L3VuZGlwcmVsb2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiMmY0YQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpcHJlbG9hZC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxyZWFsbW9kZS5oPgorI2luY2x1ZGUgPHVuZGlwcmVsb2FkLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFByZWxvYWRlZCBVTkRJIHN0YWNrCisgKgorICovCisKKy8qKgorICogUHJlbG9hZGVkIFVOREkgZGV2aWNlCisgKgorICogVGhpcyBpcyB0aGUgVU5ESSBkZXZpY2UgdGhhdCB3YXMgcHJlc2VudCB3aGVuIEV0aGVyYm9vdCBzdGFydGVkCisgKiBleGVjdXRpb24gKGkuZS4gd2hlbiBsb2FkaW5nIGEgLmtweGUgaW1hZ2UpLiAgVGhlIGZpcnN0IGRyaXZlciB0bworICogY2xhaW0gdGhpcyBkZXZpY2UgbXVzdCB6ZXJvIG91dCB0aGlzIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgdW5kaV9kZXZpY2UgX19kYXRhMTYgKCBwcmVsb2FkZWRfdW5kaSApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2RyaXZlcnMvbmV0L3VuZGlyb20uYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2M2Q5NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9kcml2ZXJzL25ldC91bmRpcm9tLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxweGUuaD4KKyNpbmNsdWRlIDxyZWFsbW9kZS5oPgorI2luY2x1ZGUgPHVuZGlyb20uaD4KKworLyoqIEBmaWxlCisgKgorICogVU5ESSBleHBhbnNpb24gUk9NcworICoKKyAqLworCisvKiogTGlzdCBvZiBhbGwgVU5ESSBST01zICovCitzdGF0aWMgTElTVF9IRUFEICggdW5kaXJvbXMgKTsKKworLyoqCisgKiBQYXJzZSBQWEUgUk9NIElEIHN0cnVjdHVyZQorICoKKyAqIEB2IHVuZGlyb20JCVVOREkgUk9NCisgKiBAdiBweGVyb21pZAkJT2Zmc2V0IHdpdGhpbiBST00gdG8gUFhFIFJPTSBJRCBzdHJ1Y3R1cmUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHVuZGlyb21fcGFyc2VfcHhlcm9taWQgKCBzdHJ1Y3QgdW5kaV9yb20gKnVuZGlyb20sCisJCQkJICAgdW5zaWduZWQgaW50IHB4ZXJvbWlkICkgeworCXN0cnVjdCB1bmRpX3JvbV9pZCB1bmRpX3JvbV9pZDsKKwl1bnNpZ25lZCBpbnQgdW5kaWxvYWRlcjsKKworCURCR0MgKCB1bmRpcm9tLCAiVU5ESVJPTSAlcCBoYXMgUFhFIFJPTSBJRCBhdCAlMDR4OiUwNHhcbiIsIHVuZGlyb20sCisJICAgICAgIHVuZGlyb20tPnJvbV9zZWdtZW50LCBweGVyb21pZCApOworCisJLyogUmVhZCBQWEUgUk9NIElEIHN0cnVjdHVyZSBhbmQgdmVyaWZ5ICovCisJY29weV9mcm9tX3JlYWwgKCAmdW5kaV9yb21faWQsIHVuZGlyb20tPnJvbV9zZWdtZW50LCBweGVyb21pZCwKKwkJCSBzaXplb2YgKCB1bmRpX3JvbV9pZCApICk7CisJaWYgKCB1bmRpX3JvbV9pZC5TaWduYXR1cmUgIT0gVU5ESV9ST01fSURfU0lHTkFUVVJFICkgeworCQlEQkdDICggdW5kaXJvbSwgIlVORElST00gJXAgaGFzIGJhZCBQWEUgUk9NIElEIHNpZ25hdHVyZSAiCisJCSAgICAgICAiJTA4eFxuIiwgdW5kaXJvbSwgdW5kaV9yb21faWQuU2lnbmF0dXJlICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGZvciBVTkRJIGxvYWRlciAqLworCXVuZGlsb2FkZXIgPSB1bmRpX3JvbV9pZC5VTkRJTG9hZGVyOworCWlmICggISB1bmRpbG9hZGVyICkgeworCQlEQkdDICggdW5kaXJvbSwgIlVORElST00gJXAgaGFzIG5vIFVOREkgbG9hZGVyXG4iLCB1bmRpcm9tICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpbGwgaW4gVU5ESSBST00gbG9hZGVyIGZpZWxkcyAqLworCXVuZGlyb20tPmxvYWRlcl9lbnRyeS5zZWdtZW50ID0gdW5kaXJvbS0+cm9tX3NlZ21lbnQ7CisJdW5kaXJvbS0+bG9hZGVyX2VudHJ5Lm9mZnNldCA9IHVuZGlsb2FkZXI7CisJdW5kaXJvbS0+Y29kZV9zaXplID0gdW5kaV9yb21faWQuQ29kZVNpemU7CisJdW5kaXJvbS0+ZGF0YV9zaXplID0gdW5kaV9yb21faWQuRGF0YVNpemU7CisKKwlEQkdDICggdW5kaXJvbSwgIlVORElST00gJXAgaGFzIFVOREkgbG9hZGVyIGF0ICUwNHg6JTA0eCAiCisJICAgICAgICIoY29kZSAlMDR6eCBkYXRhICUwNHp4KVxuIiwgdW5kaXJvbSwKKwkgICAgICAgdW5kaXJvbS0+bG9hZGVyX2VudHJ5LnNlZ21lbnQsIHVuZGlyb20tPmxvYWRlcl9lbnRyeS5vZmZzZXQsCisJICAgICAgIHVuZGlyb20tPmNvZGVfc2l6ZSwgdW5kaXJvbS0+ZGF0YV9zaXplICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgUENJIGV4cGFuc2lvbiBoZWFkZXIKKyAqCisgKiBAdiB1bmRpcm9tCQlVTkRJIFJPTQorICogQHYgcGNpcmhlYWRlcglPZmZzZXQgd2l0aGluIFJPTSB0byBQQ0kgZXhwYW5zaW9uIGhlYWRlcgorICovCitzdGF0aWMgaW50IHVuZGlyb21fcGFyc2VfcGNpcmhlYWRlciAoIHN0cnVjdCB1bmRpX3JvbSAqdW5kaXJvbSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBwY2lyaGVhZGVyICkgeworCXN0cnVjdCBwY2lyX2hlYWRlciBwY2lyX2hlYWRlcjsKKworCURCR0MgKCB1bmRpcm9tLCAiVU5ESVJPTSAlcCBoYXMgUENJIGV4cGFuc2lvbiBoZWFkZXIgYXQgJTA0eDolMDR4XG4iLAorCSAgICAgICB1bmRpcm9tLCB1bmRpcm9tLT5yb21fc2VnbWVudCwgcGNpcmhlYWRlciApOworCisJLyogUmVhZCBQQ0kgZXhwYW5zaW9uIGhlYWRlciBhbmQgdmVyaWZ5ICovCisJY29weV9mcm9tX3JlYWwgKCAmcGNpcl9oZWFkZXIsIHVuZGlyb20tPnJvbV9zZWdtZW50LCBwY2lyaGVhZGVyLAorCQkJIHNpemVvZiAoIHBjaXJfaGVhZGVyICkgKTsKKwlpZiAoIHBjaXJfaGVhZGVyLnNpZ25hdHVyZSAhPSBQQ0lSX1NJR05BVFVSRSApIHsKKwkJREJHQyAoIHVuZGlyb20sICJVTkRJUk9NICVwIGhhcyBiYWQgUENJIGV4cGFuc2lvbiBoZWFkZXIgIgorCQkgICAgICAgInNpZ25hdHVyZSAlMDh4XG4iLCB1bmRpcm9tLCBwY2lyX2hlYWRlci5zaWduYXR1cmUgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRmlsbCBpbiBVTkRJIFJPTSBQQ0kgZGV2aWNlIGZpZWxkcyAqLworCXVuZGlyb20tPmJ1c190eXBlID0gUENJX05JQzsKKwl1bmRpcm9tLT5idXNfaWQucGNpLnZlbmRvcl9pZCA9IHBjaXJfaGVhZGVyLnZlbmRvcl9pZDsKKwl1bmRpcm9tLT5idXNfaWQucGNpLmRldmljZV9pZCA9IHBjaXJfaGVhZGVyLmRldmljZV9pZDsKKworCURCR0MgKCB1bmRpcm9tLCAiVU5ESVJPTSAlcCBpcyBmb3IgUENJIGRldmljZXMgJTA0eDolMDR4XG4iLCB1bmRpcm9tLAorCSAgICAgICB1bmRpcm9tLT5idXNfaWQucGNpLnZlbmRvcl9pZCwgdW5kaXJvbS0+YnVzX2lkLnBjaS5kZXZpY2VfaWQgKTsKKwlyZXR1cm4gMDsKKwkKK30KKworLyoqCisgKiBQcm9iZSBVTkRJIFJPTQorICoKKyAqIEB2IHJvbV9zZWdtZW50CVJPTSBzZWdtZW50IGFkZHJlc3MKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHVuZGlyb21fcHJvYmUgKCB1bnNpZ25lZCBpbnQgcm9tX3NlZ21lbnQgKSB7CisJc3RydWN0IHVuZGlfcm9tICp1bmRpcm9tID0gTlVMTDsKKwlzdHJ1Y3QgdW5kaV9yb21faGVhZGVyIHJvbWhlYWRlcjsKKwlzaXplX3Qgcm9tX2xlbjsKKwl1bnNpZ25lZCBpbnQgcHhlcm9taWQ7CisJdW5zaWduZWQgaW50IHBjaXJoZWFkZXI7CisJaW50IHJjOworCisJLyogUmVhZCBleHBhbnNpb24gUk9NIGhlYWRlciBhbmQgdmVyaWZ5ICovCisJY29weV9mcm9tX3JlYWwgKCAmcm9taGVhZGVyLCByb21fc2VnbWVudCwgMCwgc2l6ZW9mICggcm9taGVhZGVyICkgKTsKKwlpZiAoIHJvbWhlYWRlci5TaWduYXR1cmUgIT0gUk9NX1NJR05BVFVSRSApIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJcm9tX2xlbiA9ICggcm9taGVhZGVyLlJPTUxlbmd0aCAqIDUxMiApOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBVTkRJIFJPTSAqLworCXVuZGlyb20gPSB6YWxsb2MgKCBzaXplb2YgKCAqdW5kaXJvbSApICk7CisJaWYgKCAhIHVuZGlyb20gKSB7CisJCURCRyAoICJDb3VsZCBub3QgYWxsb2NhdGUgVU5ESSBST00gc3RydWN0dXJlXG4iICk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCURCR0MgKCB1bmRpcm9tLCAiVU5ESVJPTSAlcCB0cnlpbmcgZXhwYW5zaW9uIFJPTSBhdCAlMDR4OjAwMDAgIgorCSAgICAgICAiKCV6ZGtCKVxuIiwgdW5kaXJvbSwgcm9tX3NlZ21lbnQsICggcm9tX2xlbiAvIDEwMjQgKSApOworCXVuZGlyb20tPnJvbV9zZWdtZW50ID0gcm9tX3NlZ21lbnQ7CisKKwkvKiBDaGVjayBmb3IgYW5kIHBhcnNlIFBYRSBST00gSUQgKi8KKwlweGVyb21pZCA9IHJvbWhlYWRlci5QWEVST01JRDsKKwlpZiAoICEgcHhlcm9taWQgKSB7CisJCURCR0MgKCB1bmRpcm9tLCAiVU5ESVJPTSAlcCBoYXMgbm8gUFhFIFJPTSBJRFxuIiwgdW5kaXJvbSApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoIHB4ZXJvbWlkID4gcm9tX2xlbiApIHsKKwkJREJHQyAoIHVuZGlyb20sICJVTkRJUk9NICVwIFBYRSBST00gSUQgb3V0c2lkZSBST01cbiIsCisJCSAgICAgICB1bmRpcm9tICk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCWlmICggKCByYyA9IHVuZGlyb21fcGFyc2VfcHhlcm9taWQgKCB1bmRpcm9tLCBweGVyb21pZCApICkgIT0gMCApCisJCWdvdG8gZXJyOworCisJLyogUGFyc2UgUENJUiBoZWFkZXIsIGlmIHByZXNlbnQgKi8KKwlwY2lyaGVhZGVyID0gcm9taGVhZGVyLlBDSVJIZWFkZXI7CisJaWYgKCBwY2lyaGVhZGVyICkKKwkJdW5kaXJvbV9wYXJzZV9wY2lyaGVhZGVyICggdW5kaXJvbSwgcGNpcmhlYWRlciApOworCisJLyogQWRkIHRvIFVOREkgUk9NIGxpc3QgYW5kIHJldHVybiAqLworCURCR0MgKCB1bmRpcm9tLCAiVU5ESVJPTSAlcCByZWdpc3RlcmVkXG4iLCB1bmRpcm9tICk7CisJbGlzdF9hZGQgKCAmdW5kaXJvbS0+bGlzdCwgJnVuZGlyb21zICk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJZnJlZSAoIHVuZGlyb20gKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogQ3JlYXRlIFVOREkgUk9NcyBmb3IgYWxsIHBvc3NpYmxlIGV4cGFuc2lvbiBST01zCisgKgorICogQHJldCAKKyAqLworc3RhdGljIHZvaWQgdW5kaXJvbV9wcm9iZV9hbGxfcm9tcyAoIHZvaWQgKSB7CisJc3RhdGljIGludCBwcm9iZWQgPSAwOworCXVuc2lnbmVkIGludCByb21fc2VnbWVudDsKKworCS8qIFBlcmZvcm0gcHJvYmUgb25seSBvbmNlICovCisJaWYgKCBwcm9iZWQgKQorCQlyZXR1cm47CisKKwlEQkcgKCAiU2Nhbm5pbmcgZm9yIFBYRSBleHBhbnNpb24gUk9Nc1xuIiApOworCisJLyogU2NhbiB0aHJvdWdoIGV4cGFuc2lvbiBST00gcmVnaW9uIGF0IDUxMiBieXRlIGludGVydmFscyAqLworCWZvciAoIHJvbV9zZWdtZW50ID0gMHhjMDAwIDsgcm9tX3NlZ21lbnQgPCAweDEwMDAwIDsKKwkgICAgICByb21fc2VnbWVudCArPSAweDIwICkgeworCQl1bmRpcm9tX3Byb2JlICggcm9tX3NlZ21lbnQgKTsKKwl9CisKKwlwcm9iZWQgPSAxOworfQorCisvKioKKyAqIEZpbmQgVU5ESSBST00gZm9yIFBDSSBkZXZpY2UKKyAqCisgKiBAdiB2ZW5kb3JfaWQJCVBDSSB2ZW5kb3IgSUQKKyAqIEB2IGRldmljZV9pZAkJUENJIGRldmljZSBJRAorICogQHYgcm9tYmFzZQkJUk9NIGJhc2UgYWRkcmVzcywgb3IgMCBmb3IgYW55CisgKiBAcmV0IHVuZGlyb20JCVVOREkgUk9NLCBvciBOVUxMCisgKi8KK3N0cnVjdCB1bmRpX3JvbSAqIHVuZGlyb21fZmluZF9wY2kgKCB1bnNpZ25lZCBpbnQgdmVuZG9yX2lkLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGRldmljZV9pZCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByb21iYXNlICkgeworCXN0cnVjdCB1bmRpX3JvbSAqdW5kaXJvbTsKKworCXVuZGlyb21fcHJvYmVfYWxsX3JvbXMoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCB1bmRpcm9tLCAmdW5kaXJvbXMsIGxpc3QgKSB7CisJCWlmICggdW5kaXJvbS0+YnVzX3R5cGUgIT0gUENJX05JQyApCisJCQljb250aW51ZTsKKwkJaWYgKCB1bmRpcm9tLT5idXNfaWQucGNpLnZlbmRvcl9pZCAhPSB2ZW5kb3JfaWQgKQorCQkJY29udGludWU7CisJCWlmICggdW5kaXJvbS0+YnVzX2lkLnBjaS5kZXZpY2VfaWQgIT0gZGV2aWNlX2lkICkKKwkJCWNvbnRpbnVlOworCQlpZiAoIHJvbWJhc2UgJiYgKCAoIHVuZGlyb20tPnJvbV9zZWdtZW50IDw8IDQgKSAhPSByb21iYXNlICkgKQorCQkJY29udGludWU7CisJCURCR0MgKCB1bmRpcm9tLCAiVU5ESVJPTSAlcCBtYXRjaGVkIFBDSSAlMDR4OiUwNHggKCUwOHgpXG4iLAorCQkgICAgICAgdW5kaXJvbSwgdmVuZG9yX2lkLCBkZXZpY2VfaWQsIHJvbWJhc2UgKTsKKwkJcmV0dXJuIHVuZGlyb207CisJfQorCisJREJHICggIk5vIFVOREkgUk9NIG1hdGNoZWQgUENJICUwNHg6JTA0eCAoJTA4eClcbiIsCisJICAgICAgdmVuZG9yX2lkLCBkZXZpY2VfaWQsIHJvbWJhc2UgKTsKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvYmFzZW1lbS5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9iYXNlbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhN2QxZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvYmFzZW1lbS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxyZWFsbW9kZS5oPgorI2luY2x1ZGUgPGJpb3MuaD4KKyNpbmNsdWRlIDxiYXNlbWVtLmg+CisjaW5jbHVkZSA8Z3B4ZS9oaWRlbWVtLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEJhc2UgbWVtb3J5IGFsbG9jYXRpb24KKyAqCisgKi8KKworLyoqCisgKiBTZXQgdGhlIEJJT1MgZnJlZSBiYXNlIG1lbW9yeSBjb3VudGVyCisgKgorICogQHYgbmV3X2ZibXMJCU5ldyBmcmVlIGJhc2UgbWVtb3J5IGNvdW50ZXIgKGluIGtCKQorICovCit2b2lkIHNldF9mYm1zICggdW5zaWduZWQgaW50IG5ld19mYm1zICkgeworCXVpbnQxNl90IGZibXMgPSBuZXdfZmJtczsKKworCS8qIFVwZGF0ZSB0aGUgQklPUyBtZW1vcnkgY291bnRlciAqLworCXB1dF9yZWFsICggZmJtcywgQkRBX1NFRywgQkRBX0ZCTVMgKTsKKworCS8qIFVwZGF0ZSBvdXIgaGlkZGVuIG1lbW9yeSByZWdpb24gbWFwICovCisJaGlkZV9iYXNlbWVtKCk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvZmlybXdhcmUvcGNiaW9zL2Jpb3NfY29uc29sZS5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9iaW9zX2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE4ZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9iaW9zX2NvbnNvbGUuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGdweGUvYW5zaWVzYy5oPgorCisjZGVmaW5lIEFUVFJfQk9MRAkJMHgwOAorCisjZGVmaW5lIEFUVFJfRkNPTF9NQVNLCQkweDA3CisjZGVmaW5lIEFUVFJfRkNPTF9CTEFDSwkJMHgwMAorI2RlZmluZSBBVFRSX0ZDT0xfQkxVRQkJMHgwMQorI2RlZmluZSBBVFRSX0ZDT0xfR1JFRU4JCTB4MDIKKyNkZWZpbmUgQVRUUl9GQ09MX0NZQU4JCTB4MDMKKyNkZWZpbmUgQVRUUl9GQ09MX1JFRAkJMHgwNAorI2RlZmluZSBBVFRSX0ZDT0xfTUFHRU5UQQkweDA1CisjZGVmaW5lIEFUVFJfRkNPTF9ZRUxMT1cJMHgwNgorI2RlZmluZSBBVFRSX0ZDT0xfV0hJVEUJCTB4MDcKKworI2RlZmluZSBBVFRSX0JDT0xfTUFTSwkJMHg3MAorI2RlZmluZSBBVFRSX0JDT0xfQkxBQ0sJCTB4MDAKKyNkZWZpbmUgQVRUUl9CQ09MX0JMVUUJCTB4MTAKKyNkZWZpbmUgQVRUUl9CQ09MX0dSRUVOCQkweDIwCisjZGVmaW5lIEFUVFJfQkNPTF9DWUFOCQkweDMwCisjZGVmaW5lIEFUVFJfQkNPTF9SRUQJCTB4NDAKKyNkZWZpbmUgQVRUUl9CQ09MX01BR0VOVEEJMHg1MAorI2RlZmluZSBBVFRSX0JDT0xfWUVMTE9XCTB4NjAKKyNkZWZpbmUgQVRUUl9CQ09MX1dISVRFCQkweDcwCisKKyNkZWZpbmUgQVRUUl9ERUZBVUxUCQlBVFRSX0ZDT0xfV0hJVEUKKworLyoqIEN1cnJlbnQgY2hhcmFjdGVyIGF0dHJpYnV0ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBiaW9zX2F0dHIgPSBBVFRSX0RFRkFVTFQ7CisKKy8qKgorICogSGFuZGxlIEFOU0kgQ1VQIChjdXJzb3IgcG9zaXRpb24pCisgKgorICogQHYgY291bnQJCVBhcmFtZXRlciBjb3VudAorICogQHYgcGFyYW1zWzBdCQlSb3cgKDEgaXMgdG9wKQorICogQHYgcGFyYW1zWzFdCQlDb2x1bW4gKDEgaXMgbGVmdCkKKyAqLworc3RhdGljIHZvaWQgYmlvc19oYW5kbGVfY3VwICggdW5zaWduZWQgaW50IGNvdW50IF9fdW51c2VkLCBpbnQgcGFyYW1zW10gKSB7CisJaW50IGN4ID0gKCBwYXJhbXNbMV0gLSAxICk7CisJaW50IGN5ID0gKCBwYXJhbXNbMF0gLSAxICk7CisKKwlpZiAoIGN4IDwgMCApCisJCWN4ID0gMDsKKwlpZiAoIGN5IDwgMCApCisJCWN5ID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggInN0aVxuXHQiCisJCQkJCSAgICJpbnQgJDB4MTBcblx0IgorCQkJCQkgICAiY2xpXG5cdCIgKQorCQkJICAgICAgIDogOiAiYSIgKCAweDAyMDAgKSwgImIiICggMSApLAorCQkJICAgICAgICAgICAiZCIgKCAoIGN5IDw8IDggKSB8IGN4ICkgKTsKK30KKworLyoqCisgKiBIYW5kbGUgQU5TSSBFRCAoZXJhc2UgaW4gcGFnZSkKKyAqCisgKiBAdiBjb3VudAkJUGFyYW1ldGVyIGNvdW50CisgKiBAdiBwYXJhbXNbMF0JCVJlZ2lvbiB0byBlcmFzZQorICovCitzdGF0aWMgdm9pZCBiaW9zX2hhbmRsZV9lZCAoIHVuc2lnbmVkIGludCBjb3VudCBfX3VudXNlZCwKKwkJCSAgICAgaW50IHBhcmFtc1tdIF9fdW51c2VkICkgeworCS8qIFdlIGFzc3VtZSB0aGF0IHdlIGFsd2F5cyBjbGVhciB0aGUgd2hvbGUgc2NyZWVuICovCisJYXNzZXJ0ICggcGFyYW1zWzBdID09IEFOU0lFU0NfRURfQUxMICk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFJFQUxfQ09ERSAoICJzdGlcblx0IgorCQkJCQkgICAiaW50ICQweDEwXG5cdCIKKwkJCQkJICAgImNsaVxuXHQiICkKKwkJCSAgICAgICA6IDogImEiICggMHgwNjAwICksICJiIiAoIGJpb3NfYXR0ciA8PCA4ICksCisJCQkgICAgICAgICAgICJjIiAoIDAgKSwgImQiICggMHhmZmZmICkgKTsKK30KKworLyoqCisgKiBIYW5kbGUgQU5TSSBTR1IgKHNldCBncmFwaGljcyByZW5kaXRpb24pCisgKgorICogQHYgY291bnQJCVBhcmFtZXRlciBjb3VudAorICogQHYgcGFyYW1zCQlMaXN0IG9mIGdyYXBoaWMgcmVuZGl0aW9uIGFzcGVjdHMKKyAqLworc3RhdGljIHZvaWQgYmlvc19oYW5kbGVfc2dyICggdW5zaWduZWQgaW50IGNvdW50LCBpbnQgcGFyYW1zW10gKSB7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmlvc19hdHRyX2Zjb2xzWzEwXSA9IHsKKwkJQVRUUl9GQ09MX0JMQUNLLCBBVFRSX0ZDT0xfUkVELCBBVFRSX0ZDT0xfR1JFRU4sCisJCUFUVFJfRkNPTF9ZRUxMT1csIEFUVFJfRkNPTF9CTFVFLCBBVFRSX0ZDT0xfTUFHRU5UQSwKKwkJQVRUUl9GQ09MX0NZQU4sIEFUVFJfRkNPTF9XSElURSwKKwkJQVRUUl9GQ09MX1dISVRFLCBBVFRSX0ZDT0xfV0hJVEUgLyogZGVmYXVsdHMgKi8KKwl9OworCXN0YXRpYyBjb25zdCB1aW50OF90IGJpb3NfYXR0cl9iY29sc1sxMF0gPSB7CisJCUFUVFJfQkNPTF9CTEFDSywgQVRUUl9CQ09MX1JFRCwgQVRUUl9CQ09MX0dSRUVOLAorCQlBVFRSX0JDT0xfWUVMTE9XLCBBVFRSX0JDT0xfQkxVRSwgQVRUUl9CQ09MX01BR0VOVEEsCisJCUFUVFJfQkNPTF9DWUFOLCBBVFRSX0JDT0xfV0hJVEUsCisJCUFUVFJfQkNPTF9CTEFDSywgQVRUUl9CQ09MX0JMQUNLIC8qIGRlZmF1bHRzICovCisJfTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgYXNwZWN0OworCisJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKysgKSB7CisJCWFzcGVjdCA9IHBhcmFtc1tpXTsKKwkJaWYgKCBhc3BlY3QgPT0gMCApIHsKKwkJCWJpb3NfYXR0ciA9IEFUVFJfREVGQVVMVDsKKwkJfSBlbHNlIGlmICggYXNwZWN0ID09IDEgKSB7CisJCQliaW9zX2F0dHIgfD0gQVRUUl9CT0xEOworCQl9IGVsc2UgaWYgKCBhc3BlY3QgPT0gMjIgKSB7CisJCQliaW9zX2F0dHIgJj0gfkFUVFJfQk9MRDsKKwkJfSBlbHNlIGlmICggKCBhc3BlY3QgPj0gMzAgKSAmJiAoIGFzcGVjdCA8PSAzOSApICkgeworCQkJYmlvc19hdHRyICY9IH5BVFRSX0ZDT0xfTUFTSzsKKwkJCWJpb3NfYXR0ciB8PSBiaW9zX2F0dHJfZmNvbHNbIGFzcGVjdCAtIDMwIF07CisJCX0gZWxzZSBpZiAoICggYXNwZWN0ID49IDQwICkgJiYgKCBhc3BlY3QgPD0gNDkgKSApIHsKKwkJCWJpb3NfYXR0ciAmPSB+QVRUUl9CQ09MX01BU0s7CisJCQliaW9zX2F0dHIgfD0gYmlvc19hdHRyX2Jjb2xzWyBhc3BlY3QgLSA0MCBdOworCQl9CisJfQorfQorCisvKiogQklPUyBjb25zb2xlIEFOU0kgZXNjYXBlIHNlcXVlbmNlIGhhbmRsZXJzICovCitzdGF0aWMgc3RydWN0IGFuc2llc2NfaGFuZGxlciBiaW9zX2Fuc2llc2NfaGFuZGxlcnNbXSA9IHsKKwl7IEFOU0lFU0NfQ1VQLCBiaW9zX2hhbmRsZV9jdXAgfSwKKwl7IEFOU0lFU0NfRUQsIGJpb3NfaGFuZGxlX2VkIH0sCisJeyBBTlNJRVNDX1NHUiwgYmlvc19oYW5kbGVfc2dyIH0sCisJeyAwLCBOVUxMIH0KK307CisKKy8qKiBCSU9TIGNvbnNvbGUgQU5TSSBlc2NhcGUgc2VxdWVuY2UgY29udGV4dCAqLworc3RhdGljIHN0cnVjdCBhbnNpZXNjX2NvbnRleHQgYmlvc19hbnNpZXNjX2N0eCA9IHsKKwkuaGFuZGxlcnMgPSBiaW9zX2Fuc2llc2NfaGFuZGxlcnMsCit9OworCisvKioKKyAqIFByaW50IGEgY2hhcmFjdGVyIHRvIEJJT1MgY29uc29sZQorICoKKyAqIEB2IGNoYXJhY3RlcgkJQ2hhcmFjdGVyIHRvIGJlIHByaW50ZWQKKyAqLworc3RhdGljIHZvaWQgYmlvc19wdXRjaGFyICggaW50IGNoYXJhY3RlciApIHsKKwlpbnQgZGlzY2FyZF9hLCBkaXNjYXJkX2IsIGRpc2NhcmRfYzsKKworCS8qIEludGVyY2VwdCBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgKi8KKwljaGFyYWN0ZXIgPSBhbnNpZXNjX3Byb2Nlc3MgKCAmYmlvc19hbnNpZXNjX2N0eCwgY2hhcmFjdGVyICk7CisJaWYgKCBjaGFyYWN0ZXIgPCAwICkKKwkJcmV0dXJuOworCisJLyogUHJpbnQgY2hhcmFjdGVyIHdpdGggYXR0cmlidXRlICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBSRUFMX0NPREUgKCAic3RpXG5cdCIKKwkJCQkJICAgLyogU2tpcCBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgKi8KKwkJCQkJICAgImNtcGIgJDB4MjAsICUlYWxcblx0IgorCQkJCQkgICAiamIgMWZcblx0IgorCQkJCQkgICAvKiBTZXQgYXR0cmlidXRlICovCisJCQkJCSAgICJtb3Z3ICQweDAwMDEsICUlY3hcblx0IgorCQkJCQkgICAibW92YiAkMHgwOSwgJSVhaFxuXHQiCisJCQkJCSAgICJpbnQgJDB4MTBcblx0IgorCQkJCQkgICAiXG4xOlxuXHQiCisJCQkJCSAgIC8qIFByaW50IGNoYXJhY3RlciAqLworCQkJCQkgICAieG9ydyAlJWJ4LCAlJWJ4XG5cdCIKKwkJCQkJICAgIm1vdmIgJDB4MGUsICUlYWhcblx0IgorCQkJCQkgICAiaW50ICQweDEwXG5cdCIKKwkJCQkJICAgImNsaVxuXHQiICkKKwkJCSAgICAgICA6ICI9YSIgKCBkaXNjYXJkX2EgKSwgIj1iIiAoIGRpc2NhcmRfYiApLAorCQkJICAgICAgICAgIj1jIiAoIGRpc2NhcmRfYyApCisJCQkgICAgICAgOiAiYSIgKCBjaGFyYWN0ZXIgKSwgImIiICggYmlvc19hdHRyICkKKwkJCSAgICAgICA6ICJlYnAiICk7Cit9CisKKy8qKgorICogUG9pbnRlciB0byBjdXJyZW50IEFOU0kgb3V0cHV0IHNlcXVlbmNlCisgKgorICogV2hpbGUgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgcmV0dXJuaW5nIGFuIEFOU0kgc2VxdWVuY2UgZm9yIGEKKyAqIHNwZWNpYWwga2V5LCB0aGlzIHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRvIHJldHVybi4gIFdoZW4KKyAqIG5vdCBpbiB0aGUgbWlkZGxlIG9mIHN1Y2ggYSBzZXF1ZW5jZSwgdGhpcyB3aWxsIHBvaW50IHRvIGEgTlVMCisgKiAobm90ZTogbm90ICJ3aWxsIGJlIE5VTEwiKS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFuc2lfaW5wdXQgPSAiIjsKKworLyoqCisgKiBMb3dlc3QgQklPUyBzY2FuY29kZSBvZiBpbnRlcmVzdAorICoKKyAqIE1vc3Qgb2YgdGhlIEJJT1Mga2V5IHNjYW5jb2RlcyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluIGFyZSBpbiBhCisgKiBkZW5zZSByYW5nZSwgc28gc3VidHJhY3RpbmcgYSBjb25zdGFudCBhbmQgdHJlYXRpbmcgdGhlbSBhcyBvZmZzZXRzCisgKiBpbnRvIGFuIGFycmF5IHdvcmtzIGVmZmljaWVudGx5LgorICovCisjZGVmaW5lIEJJT1NfS0VZX01JTiAweDQyCisKKy8qKiBPZmZzZXQgaW50byBsaXN0IG9mIGludGVyZXN0aW5nIEJJT1Mgc2NhbmNvZGVzICovCisjZGVmaW5lIEJJT1NfS0VZKHNjYW5jb2RlKSAoIChzY2FuY29kZSkgLSBCSU9TX0tFWV9NSU4gKQorCisvKiogTWFwcGluZyBmcm9tIEJJT1Mgc2NhbiBjb2RlcyB0byBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICphbnNpX3NlcXVlbmNlc1tdID0geworCVsgQklPU19LRVkgKCAweDQyICkgXSA9ICJbMTl+IiwJLyogRjggKHJlcXVpcmVkIGZvciBQWEUpICovCisJWyBCSU9TX0tFWSAoIDB4NDcgKSBdID0gIltIIiwJLyogSG9tZSAqLworCVsgQklPU19LRVkgKCAweDQ4ICkgXSA9ICJbQSIsCS8qIFVwIGFycm93ICovCisJWyBCSU9TX0tFWSAoIDB4NGIgKSBdID0gIltEIiwJLyogTGVmdCBhcnJvdyAqLworCVsgQklPU19LRVkgKCAweDRkICkgXSA9ICJbQyIsCS8qIFJpZ2h0IGFycm93ICovCisJWyBCSU9TX0tFWSAoIDB4NGYgKSBdID0gIltGIiwJLyogRW5kICovCisJWyBCSU9TX0tFWSAoIDB4NTAgKSBdID0gIltCIiwJLyogRG93biBhcnJvdyAqLworCVsgQklPU19LRVkgKCAweDUzICkgXSA9ICJbM34iLAkvKiBEZWxldGUgKi8KK307CisKKy8qKgorICogR2V0IEFOU0kgZXNjYXBlIHNlcXVlbmNlIGNvcnJlc3BvbmRpbmcgdG8gQklPUyBzY2FuY29kZQorICoKKyAqIEB2IHNjYW5jb2RlCQlCSU9TIHNjYW5jb2RlCisgKiBAcmV0IGFuc2lfc2VxCUFOU0kgZXNjYXBlIHNlcXVlbmNlLCBpZiBhbnksIG90aGVyd2lzZSBOVUxMCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogc2NhbmNvZGVfdG9fYW5zaV9zZXEgKCB1bnNpZ25lZCBpbnQgc2NhbmNvZGUgKSB7CisJdW5zaWduZWQgaW50IGJpb3Nfa2V5ID0gQklPU19LRVkgKCBzY2FuY29kZSApOworCQorCWlmICggYmlvc19rZXkgPCAoIHNpemVvZiAoIGFuc2lfc2VxdWVuY2VzICkgLworCQkJICBzaXplb2YgKCBhbnNpX3NlcXVlbmNlc1swXSApICkgKSB7CisJCXJldHVybiBhbnNpX3NlcXVlbmNlc1tiaW9zX2tleV07CisJfQorCURCRyAoICJVbnJlY29nbmlzZWQgQklPUyBzY2FuY29kZSAlMDJ4XG4iLCBzY2FuY29kZSApOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIEdldCBjaGFyYWN0ZXIgZnJvbSBCSU9TIGNvbnNvbGUKKyAqCisgKiBAcmV0IGNoYXJhY3RlcglDaGFyYWN0ZXIgcmVhZCBmcm9tIGNvbnNvbGUKKyAqLworc3RhdGljIGludCBiaW9zX2dldGNoYXIgKCB2b2lkICkgeworCXVpbnQxNl90IGtleXByZXNzOworCXVuc2lnbmVkIGludCBjaGFyYWN0ZXI7CisJY29uc3QgY2hhciAqYW5zaV9zZXE7CisKKwkvKiBJZiB3ZSBhcmUgbWlkLXNlcXVlbmNlLCBwYXNzIG91dCB0aGUgbmV4dCBieXRlICovCisJaWYgKCAoIGNoYXJhY3RlciA9ICphbnNpX2lucHV0ICkgKSB7CisJCWFuc2lfaW5wdXQrKzsKKwkJcmV0dXJuIGNoYXJhY3RlcjsKKwl9CisKKwkvKiBSZWFkIGNoYXJhY3RlciBmcm9tIHJlYWwgQklPUyBjb25zb2xlICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBSRUFMX0NPREUgKCAic3RpXG5cdCIKKwkJCQkJICAgImludCAkMHgxNlxuXHQiCisJCQkJCSAgICJjbGlcblx0IiApCisJCQkgICAgICAgOiAiPWEiICgga2V5cHJlc3MgKSA6ICJhIiAoIDB4MTAwMCApICk7CisJY2hhcmFjdGVyID0gKCBrZXlwcmVzcyAmIDB4ZmYgKTsKKworCS8qIElmIGl0J3MgYSBub3JtYWwgY2hhcmFjdGVyLCBqdXN0IHJldHVybiBpdCAqLworCWlmICggY2hhcmFjdGVyICYmICggY2hhcmFjdGVyIDwgMHg4MCApICkKKwkJcmV0dXJuIGNoYXJhY3RlcjsKKworCS8qIE90aGVyd2lzZSwgY2hlY2sgZm9yIGEgc3BlY2lhbCBrZXkgdGhhdCB3ZSBrbm93IGFib3V0ICovCisJaWYgKCAoIGFuc2lfc2VxID0gc2NhbmNvZGVfdG9fYW5zaV9zZXEgKCBrZXlwcmVzcyA+PiA4ICkgKSApIHsKKwkJLyogU3RhcnQgb2YgZXNjYXBlIHNlcXVlbmNlOiByZXR1cm4gRVNDICgweDFiKSAqLworCQlhbnNpX2lucHV0ID0gYW5zaV9zZXE7CisJCXJldHVybiAweDFiOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIENoZWNrIGZvciBjaGFyYWN0ZXIgcmVhZHkgdG8gcmVhZCBmcm9tIEJJT1MgY29uc29sZQorICoKKyAqIEByZXQgVHJ1ZQkJQ2hhcmFjdGVyIGF2YWlsYWJsZSB0byByZWFkCisgKiBAcmV0IEZhbHNlCQlObyBjaGFyYWN0ZXIgYXZhaWxhYmxlIHRvIHJlYWQKKyAqLworc3RhdGljIGludCBiaW9zX2lza2V5ICggdm9pZCApIHsKKwl1bnNpZ25lZCBpbnQgZGlzY2FyZF9hOworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qIElmIHdlIGFyZSBtaWQtc2VxdWVuY2UsIHdlIGFyZSBhbHdheXMgcmVhZHkgKi8KKwlpZiAoICphbnNpX2lucHV0ICkKKwkJcmV0dXJuIDE7CisKKwkvKiBPdGhlcndpc2UgY2hlY2sgdGhlIHJlYWwgQklPUyBjb25zb2xlICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBSRUFMX0NPREUgKCAic3RpXG5cdCIKKwkJCQkJICAgImludCAkMHgxNlxuXHQiCisJCQkJCSAgICJwdXNoZndcblx0IgorCQkJCQkgICAicG9wdyAldzBcblx0IgorCQkJCQkgICAiY2xpXG5cdCIgKQorCQkJICAgICAgIDogIj1yIiAoIGZsYWdzICksICI9YSIgKCBkaXNjYXJkX2EgKQorCQkJICAgICAgIDogImEiICggMHgwMTAwICkgKTsKKwlyZXR1cm4gKCAhICggZmxhZ3MgJiBaRiApICk7Cit9CisKK3N0cnVjdCBjb25zb2xlX2RyaXZlciBiaW9zX2NvbnNvbGUgX19jb25zb2xlX2RyaXZlciA9IHsKKwkucHV0Y2hhciA9IGJpb3NfcHV0Y2hhciwKKwkuZ2V0Y2hhciA9IGJpb3NfZ2V0Y2hhciwKKwkuaXNrZXkgPSBiaW9zX2lza2V5LAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvZTgyMG1hbmdsZXIuUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvZTgyMG1hbmdsZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWNhNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9lODIwbWFuZ2xlci5TCkBAIC0wLDAgKzEsNTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApCisKKwkudGV4dAorCS5hcmNoIGkzODYKKwkuY29kZTE2CisKKyNkZWZpbmUgU01BUCAweDUzNGQ0MTUwCisKKy8qIE1vc3QgZG9jdW1lbnRhdGlvbiByZWZlcnMgdG8gdGhlIEU4MjAgYnVmZmVyIGFzIGJlaW5nIDIwIGJ5dGVzLCBhbmQKKyAqIHRoZSBBUEkgbWFrZXMgaXQgcGVyZmVjdGx5IGxlZ2l0aW1hdGUgdG8gcGFzcyBvbmx5IGEgMjAtYnl0ZSBidWZmZXIKKyAqIGFuZCBleHBlY3QgdG8gZ2V0IHZhbGlkIGRhdGEuICBIb3dldmVyLCBzb21lIG1vcm9ucyBhdCBBQ1BJIGRlY2lkZWQKKyAqIHRvIGV4dGVuZCB0aGUgZGF0YSBzdHJ1Y3R1cmUgYnkgYWRkaW5nIGFuIGV4dHJhICJleHRlbmRlZAorICogYXR0cmlidXRlcyIgZmllbGQgYW5kIGJ5IGluY2x1ZGluZyBjcml0aWNhbCBpbmZvcm1hdGlvbiB3aXRoaW4gdGhpcworICogZmllbGQsIHN1Y2ggYXMgd2hldGhlciBvciBub3QgdGhlIHJlZ2lvbiBpcyBlbmFibGVkLiAgQSBjYWxsZXIgd2hvCisgKiBwYXNzZXMgaW4gb25seSBhIDIwLWJ5dGUgYnVmZmVyIHRoZXJlZm9yZSByaXNrcyBnZXR0aW5nIHZlcnksIHZlcnkKKyAqIG1pc2xlYWRpbmcgaW5mb3JtYXRpb24uCisgKgorICogSSBoYXZlIHBlcnNvbmFsbHkgd2l0bmVzc2VkIGFuIEhQIEJJT1MgdGhhdCByZXR1cm5zIGEgdmFsdWUgb2YKKyAqIDB4MDAwOSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcyBmaWVsZC4gIElmIHdlIGRvbid0IHBhc3MgdGhpcworICogdmFsdWUgdGhyb3VnaCB0byB0aGUgY2FsbGVyLCAzMi1iaXQgV2luUEUgd2lsbCBkaWUsIHVzdWFsbHkgd2l0aCBhCisgKiBQQUdFX0ZBVUxUX0lOX05PTlBBR0VEX0FSRUEgYmx1ZSBzY3JlZW4gb2YgZGVhdGguCisgKgorICogQWxsb3cgYSByaWRpY3Vsb3VzbHkgbGFyZ2UgbWF4aW11bSB2YWx1ZSAoNjQgYnl0ZXMpIGZvciB0aGUgRTgyMAorICogYnVmZmVyIGFzIGEgZ3VhcmQgYWdhaW5zdCBpbnN1ZmZpY2llbnRseSBjcmVhdGl2ZSBpZGlvdHMgaW4gdGhlCisgKiBmdXR1cmUuCisgKi8KKyNkZWZpbmUgRTgyME1BWFNJWkUJNjQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBbGxvd2VkIG1lbW9yeSB3aW5kb3dzCisgKgorICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIHZpZXcgdGhpcyBsaXN0LiAgVGhlIGZpcnN0IGlzIGFzIGEgbGlzdCBvZgorICogKG5vbi1vdmVybGFwcGluZykgYWxsb3dlZCBtZW1vcnkgcmVnaW9ucywgc29ydGVkIGJ5IGluY3JlYXNpbmcKKyAqIGFkZHJlc3MuICBUaGUgc2Vjb25kIGlzIGFzIGEgbGlzdCBvZiAobm9uLW92ZXJsYXBwaW5nKSBoaWRkZW4KKyAqIG1lbW9yeSByZWdpb25zLCBhZ2FpbiBzb3J0ZWQgYnkgaW5jcmVhc2luZyBhZGRyZXNzLiAgVGhlIHNlY29uZAorICogdmlldyBpcyBvZmZzZXQgYnkgaGFsZiBhbiBlbnRyeSBmcm9tIHRoZSBmaXJzdDogdGhpbmsgYWJvdXQgdGhpcworICogZm9yIGEgbW9tZW50IGFuZCBpdCBzaG91bGQgbWFrZSBzZW5zZS4KKyAqCisgKiB4eHhfbWVtb3J5X3dpbmRvdyBpcyB1c2VkIHRvIGluZGljYXRlIGFuICJhbGxvd2VkIHJlZ2lvbiIKKyAqIHN0cnVjdHVyZSwgaGlkZGVuX3h4eF9tZW1vcnkgaXMgdXNlZCB0byBpbmRpY2F0ZSBhICJoaWRkZW4gcmVnaW9uIgorICogc3RydWN0dXJlLiAgRWFjaCBzdHJ1Y3R1cmUgaXMgMTYgYnl0ZXMgaW4gbGVuZ3RoLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLmRhdGExNiIsICJhdyIsIEBwcm9nYml0cworCS5hbGlnbiAxNgorCS5nbG9ibCBoaWRlbWVtX2Jhc2UKKwkuZ2xvYmwgaGlkZW1lbV91bWFsbG9jCisJLmdsb2JsIGhpZGVtZW1fdGV4dGRhdGEKK21lbW9yeV93aW5kb3dzOgorYmFzZV9tZW1vcnlfd2luZG93OgkubG9uZyAweDAwMDAwMDAwLCAweDAwMDAwMDAwIC8qIFN0YXJ0IG9mIG1lbW9yeSAqLworCitoaWRlbWVtX2Jhc2U6CQkubG9uZyAweDAwMGEwMDAwLCAweDAwMDAwMDAwIC8qIENoYW5nZXMgYXQgcnVudGltZSAqLworZXh0X21lbW9yeV93aW5kb3c6CS5sb25nIDB4MDAwYTAwMDAsIDB4MDAwMDAwMDAgLyogNjQwa0IgbWFyayAqLworCitoaWRlbWVtX3VtYWxsb2M6CS5sb25nIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYgLyogQ2hhbmdlcyBhdCBydW50aW1lICovCisJCQkubG9uZyAweGZmZmZmZmZmLCAweGZmZmZmZmZmIC8qIENoYW5nZXMgYXQgcnVudGltZSAqLworCitoaWRlbWVtX3RleHRkYXRhOgkubG9uZyAweGZmZmZmZmZmLCAweGZmZmZmZmZmIC8qIENoYW5nZXMgYXQgcnVudGltZSAqLworCQkJLmxvbmcgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiAvKiBDaGFuZ2VzIGF0IHJ1bnRpbWUgKi8KKworCQkJLmxvbmcgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiAvKiBFbmQgb2YgbWVtb3J5ICovCittZW1vcnlfd2luZG93c19lbmQ6CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUcnVuY2F0ZSByZWdpb24gdG8gbWVtb3J5IHdpbmRvdworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgJWVkeDolZWF4CVN0YXJ0IG9mIHJlZ2lvbgorICogICVlY3g6JWVieAlMZW5ndGggb2YgcmVnaW9uCisgKiAgJXNpCQlNZW1vcnkgd2luZG93CisgKiBSZXR1cm5zOgorICogICVlZHg6JWVheAlTdGFydCBvZiB3aW5kb3dlZCByZWdpb24KKyAqICAlZWN4OiVlYngJTGVuZ3RoIG9mIHdpbmRvd2VkIHJlZ2lvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCit3aW5kb3dfcmVnaW9uOgorCS8qIENvbnZlcnQgKHN0YXJ0LGxlbikgdG8gKHN0YXJ0LCBlbmQpICovCisJYWRkbAklZWF4LCAlZWJ4CisJYWRjbAklZWR4LCAlZWN4CisJLyogVHJ1bmNhdGUgdG8gd2luZG93IHN0YXJ0ICovCisJY21wbAk0KCVzaSksICVlZHgKKwlqbmUJMWYKKwljbXBsCTAoJXNpKSwgJWVheAorMToJamFlCTJmCisJbW92bAk0KCVzaSksICVlZHgKKwltb3ZsCTAoJXNpKSwgJWVheAorMjoJLyogVHJ1bmNhdGUgdG8gd2luZG93IGVuZCAqLworCWNtcGwJMTIoJXNpKSwgJWVjeAorCWpuZQkxZgorCWNtcGwJOCglc2kpLCAlZWJ4CisxOglqYmUJMmYKKwltb3ZsCTEyKCVzaSksICVlY3gKKwltb3ZsCTgoJXNpKSwgJWVieAorMjoJLyogQ29udmVydCAoc3RhcnQsIGVuZCkgYmFjayB0byAoc3RhcnQsIGxlbikgKi8KKwlzdWJsCSVlYXgsICVlYngKKwlzYmJsCSVlZHgsICVlY3gKKwkvKiBJZiBsZW5ndGggaXMgPDAsIHNldCBsZW5ndGggdG8gMCAqLworCWphZQkxZgorCXhvcmwJJWVieCwgJWVieAorCXhvcmwJJWVjeCwgJWVjeAorCXJldAorCS5zaXplCXdpbmRvd19yZWdpb24sIC4gLSB3aW5kb3dfcmVnaW9uCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQYXRjaCAibWVtb3J5IGFib3ZlIDFNQiIgZmlndXJlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAlYXgJCU1lbW9yeSBhYm92ZSAxTUIsIGluIDFrQiBibG9ja3MKKyAqIFJldHVybnM6CisgKiAgJWF4CQlNb2RpZmllZCBtZW1vcnkgYWJvdmUgMU0gaW4gMWtCIGJsb2NrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCitwYXRjaF8xbToKKwlwdXNoYWwKKwkvKiBDb252ZXJ0IHRvIChzdGFydCxsZW4pIGZvcm1hdCBhbmQgY2FsbCB0cnVuY2F0ZSAqLworCXhvcmwJJWVjeCwgJWVjeAorCW1vdnp3bAklYXgsICVlYngKKwlzaGxsCSQxMCwgJWVieAorCXhvcmwJJWVkeCwgJWVkeAorCW1vdmwJJDB4MTAwMDAwLCAlZWF4CisJbW92dwkkZXh0X21lbW9yeV93aW5kb3csICVzaQorCWNhbGwJd2luZG93X3JlZ2lvbgorCS8qIENvbnZlcnQgYmFjayB0byAibWVtb3J5IGFib3ZlIDFNQiIgZm9ybWF0IGFuZCByZXR1cm4gdmlhICVheCAqLworCXB1c2hmdworCXNocmwJJDEwLCAlZWJ4CisJcG9wZncKKwltb3Z3CSVzcCwgJWJwCisJbW92dwklYngsIDI4KCVicCkKKwlwb3BhbAorCXJldAorCS5zaXplIHBhdGNoXzFtLCAuIC0gcGF0Y2hfMW0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBhdGNoICJtZW1vcnkgYWJvdmUgMTZNQiIgZmlndXJlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAlYngJCU1lbW9yeSBhYm92ZSAxNk1CLCBpbiA2NGtCIGJsb2NrcworICogUmV0dXJuczoKKyAqICAlYngJCU1vZGlmaWVkIG1lbW9yeSBhYm92ZSAxNk0gaW4gNjRrQiBibG9ja3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworcGF0Y2hfMTZtOgorCXB1c2hhbAorCS8qIENvbnZlcnQgdG8gKHN0YXJ0LGxlbikgZm9ybWF0IGFuZCBjYWxsIHRydW5jYXRlICovCisJeG9ybAklZWN4LCAlZWN4CisJc2hsbAkkMTYsICVlYngKKwl4b3JsCSVlZHgsICVlZHgKKwltb3ZsCSQweDEwMDAwMDAsICVlYXgKKwltb3Z3CSRleHRfbWVtb3J5X3dpbmRvdywgJXNpCisJY2FsbAl3aW5kb3dfcmVnaW9uCisJLyogQ29udmVydCBiYWNrIHRvICJtZW1vcnkgYWJvdmUgMTZNQiIgZm9ybWF0IGFuZCByZXR1cm4gdmlhICVieCAqLworCXB1c2hmdworCXNocmwJJDE2LCAlZWJ4CisJcG9wZncKKwltb3Z3CSVzcCwgJWJwCisJbW92dwklYngsIDE2KCVicCkKKwlwb3BhbAorCXJldAorCS5zaXplIHBhdGNoXzE2bSwgLiAtIHBhdGNoXzE2bQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGF0Y2ggIm1lbW9yeSBiZXR3ZWVuIDFNQiBhbmQgMTZNQiIgYW5kICJtZW1vcnkgYWJvdmUgMTZNQiIgZmlndXJlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgJWF4CQlNZW1vcnkgYmV0d2VlbiAxTUIgYW5kIDE2TUIsIGluIDFrQiBibG9ja3MKKyAqICAlYngJCU1lbW9yeSBhYm92ZSAxNk1CLCBpbiA2NGtCIGJsb2NrcworICogUmV0dXJuczoKKyAqICAlYXgJCU1vZGlmaWVkIG1lbW9yeSBiZXR3ZWVuIDFNQiBhbmQgMTZNQiwgaW4gMWtCIGJsb2NrcworICogICVieAkJTW9kaWZpZWQgbWVtb3J5IGFib3ZlIDE2TUIsIGluIDY0a0IgYmxvY2tzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi50ZXh0MTYiLCAiYXgiLCBAcHJvZ2JpdHMKK3BhdGNoXzFtXzE2bToKKwljYWxsCXBhdGNoXzFtCisJY2FsbAlwYXRjaF8xNm0KKwkvKiBJZiAxTSByZWdpb24gaXMgbm8gbG9uZ2VyIGZ1bGwtbGVuZ3RoLCBraWxsIG9mZiB0aGUgMTZNIHJlZ2lvbiAqLworCWNtcHcJJCggMTUgKiAxMDI0ICksICVheAorCWplCTFmCisJeG9ydwklYngsICVieAorMToJcmV0CisJLnNpemUgcGF0Y2hfMW1fMTZtLCAuIC0gcGF0Y2hfMW1fMTZtCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZXQgdW5kZXJseWluZyBlODIwIG1lbW9yeSByZWdpb24gdG8gdW5kZXJseWluZ19lODIwIGJ1ZmZlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIEFzIGZvciBJTlQgMTUsZTgyMAorICogUmV0dXJuczoKKyAqICAgQXMgZm9yIElOVCAxNSxlODIwCisgKgorICogV3JhcHMgdGhlIHVuZGVybHlpbmcgSU5UIDE1LGU4MjAgY2FsbCBzbyB0aGF0IHRoZSBjb250aW51YXRpb24KKyAqIHZhbHVlICglZWJ4KSBpcyBhIDE2LWJpdCBzaW1wbGUgc2VxdWVuY2UgY291bnRlciAod2l0aCB0aGUgaGlnaCAxNgorICogYml0cyBpZ25vcmVkKSwgYW5kIHRlcm1pbmF0aW9uIGlzIGFsd2F5cyB2aWEgQ0Y9MSByYXRoZXIgdGhhbgorICogJWVieD0wLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworZ2V0X3VuZGVybHlpbmdfZTgyMDoKKworCS8qIElmIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGlzIGluIHRoZSBjYWNoZSwgcmV0dXJuIGl0ICovCisJY21wdwklYngsIHVuZGVybHlpbmdfZTgyMF9pbmRleAorCWpuZQkyZgorCXB1c2h3CSVkaQorCXB1c2h3CSVzaQorCW1vdncJJHVuZGVybHlpbmdfZTgyMF9jYWNoZSwgJXNpCisJY21wbAl1bmRlcmx5aW5nX2U4MjBfY2FjaGVfc2l6ZSwgJWVjeAorCWpiZQkxZgorCW1vdmwJdW5kZXJseWluZ19lODIwX2NhY2hlX3NpemUsICVlY3gKKzE6CXB1c2hsCSVlY3gKKwlyZXAgbW92c2IKKwlwb3BsCSVlY3gKKwlwb3B3CSVzaQorCXBvcHcJJWRpCisJaW5jdwklYngKKwltb3ZsCSVlZHgsICVlYXgKKwljbGMKKwlyZXQKKzI6CQorCS8qIElmIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGlzIGVhcmxpZXIgdGhhbiB0aGUgY2FjaGVkIHJlZ2lvbiwKKwkgKiBpbnZhbGlkYXRlIHRoZSBjYWNoZS4KKwkgKi8KKwljbXB3CSVieCwgdW5kZXJseWluZ19lODIwX2luZGV4CisJamJlCTFmCisJbW92dwkkMHhmZmZmLCB1bmRlcmx5aW5nX2U4MjBfaW5kZXgKKzE6CisJLyogSWYgdGhlIGNhY2hlIGlzIGludmFsaWQsIHJlc2V0IHRoZSB1bmRlcmx5aW5nICVlYnggKi8KKwljbXB3CSQweGZmZmYsIHVuZGVybHlpbmdfZTgyMF9pbmRleAorCWpuZQkxZgorCWFuZGwJJDAsIHVuZGVybHlpbmdfZTgyMF9lYngKKzE6CQorCS8qIElmIHRoZSBjYWNoZSBpcyB2YWxpZCBidXQgdGhlIGNvbnRpbnVhdGlvbiB2YWx1ZSBpcyB6ZXJvLAorCSAqIHRoaXMgbWVhbnMgdGhhdCB0aGUgcHJldmlvdXMgdW5kZXJseWluZyBjYWxsIHJldHVybmVkIHdpdGgKKwkgKiAlZWJ4PTAuICBSZXR1cm4gd2l0aCBDRj0xIGluIHRoaXMgY2FzZS4KKwkgKi8KKwljbXB3CSQweGZmZmYsIHVuZGVybHlpbmdfZTgyMF9pbmRleAorCWplCTFmCisJY21wbAkkMCwgdW5kZXJseWluZ19lODIwX2VieAorCWpuZQkxZgorCXN0YworCXJldAorMToJCisJLyogR2V0IHRoZSBuZXh0IHJlZ2lvbiBpbnRvIHRoZSBjYWNoZSAqLworCXB1c2hsCSVlYXgKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwlwdXNobAklZXNpCS8qIFNvbWUgaW1wbGVtZW50YXRpb25zIGNvcnJ1cHQgJWVzaSwgc28gd2UJKi8KKwlwdXNobAklZWRpCS8qIHByZXNlcnZlICVlc2ksICVlZGkgYW5kICVlYnAgdG8gYmUgcGFyYW5vaWQJKi8KKwlwdXNobAklZWJwCisJcHVzaHcJJWVzCisJcHVzaHcJJWRzCisJcG9wdwklZXMKKwltb3Z3CSR1bmRlcmx5aW5nX2U4MjBfY2FjaGUsICVkaQorCWNtcGwJJEU4MjBNQVhTSVpFLCAlZWN4CisJamJlCTFmCisJbW92bAkkRTgyME1BWFNJWkUsICVlY3gKKzE6CW1vdmwJdW5kZXJseWluZ19lODIwX2VieCwgJWVieAorCXN0YworCXB1c2hmdworCWxjYWxsCSolY3M6aW50MTVfdmVjdG9yCisJcG9wdwklZXMKKwlwb3BsCSVlYnAKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwkvKiBDaGVjayBmb3IgZXJyb3IgcmV0dXJuIGZyb20gdW5kZXJseWluZyBlODIwIGNhbGwgKi8KKwlqYwkyZiAvKiBDRiBzZXQ6IGVycm9yICovCisJY21wbAkkU01BUCwgJWVheAorCWplCTNmIC8qICdTTUFQJyBtaXNzaW5nOiBlcnJvciAqLworMjoJLyogQW4gZXJyb3Igb2NjdXJyZWQ6IHJldHVybiB2YWx1ZXMgcmV0dXJuZWQgYnkgdW5kZXJseWluZyBlODIwIGNhbGwgKi8KKwlzdGMJLyogRm9yY2UgQ0Ygc2V0IGlmIFNNQVAgd2FzIG1pc3NpbmcgKi8KKwlhZGRyMzIgbGVhbCAxNiglZXNwKSwgJWVzcCAvKiBhdm9pZCBjaGFuZ2luZyBvdGhlciBmbGFncyAqLworCXJldAorMzoJLyogTm8gZXJyb3Igb2NjdXJyZWQgKi8KKwltb3ZsCSVlYngsIHVuZGVybHlpbmdfZTgyMF9lYngKKwltb3ZsCSVlY3gsIHVuZGVybHlpbmdfZTgyMF9jYWNoZV9zaXplCisJcG9wbAklZWR4CisJcG9wbAklZWN4CisJcG9wbAklZWJ4CisJcG9wbAklZWF4CisJLyogTWFyayBjYWNoZSBhcyBjb250YWluaW5nIHRoaXMgcmVzdWx0ICovCisJaW5jdwl1bmRlcmx5aW5nX2U4MjBfaW5kZXgKKworCS8qIExvb3AgdW50aWwgZm91bmQgKi8KKwlqbXAJZ2V0X3VuZGVybHlpbmdfZTgyMAorCS5zaXplCWdldF91bmRlcmx5aW5nX2U4MjAsIC4gLSBnZXRfdW5kZXJseWluZ19lODIwCisKKwkuc2VjdGlvbiAiLmRhdGExNiIsICJhdyIsIEBwcm9nYml0cwordW5kZXJseWluZ19lODIwX2luZGV4OgorCS53b3JkCTB4ZmZmZiAvKiBJbml0aWFsaXNlIHRvIGFuIGludmFsaWQgdmFsdWUgKi8KKwkuc2l6ZSB1bmRlcmx5aW5nX2U4MjBfaW5kZXgsIC4gLSB1bmRlcmx5aW5nX2U4MjBfaW5kZXgKKworCS5zZWN0aW9uICIuYnNzMTYiLCAiYXciLCBAbm9iaXRzCit1bmRlcmx5aW5nX2U4MjBfZWJ4OgorCS5sb25nCTAKKwkuc2l6ZSB1bmRlcmx5aW5nX2U4MjBfZWJ4LCAuIC0gdW5kZXJseWluZ19lODIwX2VieAorCisJLnNlY3Rpb24gIi5ic3MxNiIsICJhdyIsIEBub2JpdHMKK3VuZGVybHlpbmdfZTgyMF9jYWNoZToKKwkuc3BhY2UJRTgyME1BWFNJWkUKKwkuc2l6ZSB1bmRlcmx5aW5nX2U4MjBfY2FjaGUsIC4gLSB1bmRlcmx5aW5nX2U4MjBfY2FjaGUKKworCS5zZWN0aW9uICIuYnNzMTYiLCAiYXciLCBAbm9iaXRzCit1bmRlcmx5aW5nX2U4MjBfY2FjaGVfc2l6ZToKKwkubG9uZwkwCisJLnNpemUJdW5kZXJseWluZ19lODIwX2NhY2hlX3NpemUsIC4gLSB1bmRlcmx5aW5nX2U4MjBfY2FjaGVfc2l6ZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2V0IHdpbmRvd2VkIGU4MjAgcmVnaW9uLCB3aXRob3V0IGVtcHR5IHJlZ2lvbiBzdHJpcHBpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBBcyBmb3IgSU5UIDE1LGU4MjAKKyAqIFJldHVybnM6CisgKiAgIEFzIGZvciBJTlQgMTUsZTgyMAorICoKKyAqIFdyYXBzIHRoZSB1bmRlcmx5aW5nIElOVCAxNSxlODIwIGNhbGwgc28gdGhhdCBlYWNoIHVuZGVybHlpbmcKKyAqIHJlZ2lvbiBpcyByZXR1cm5lZCBOIHRpbWVzLCB3aW5kb3dlZCB0byBmaXQgd2l0aGluIE4gdmlzaWJsZS1tZW1vcnkKKyAqIHdpbmRvd3MuICBUZXJtaW5hdGlvbiBpcyBhbHdheXMgdmlhIENGPTEuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCitnZXRfd2luZG93ZWRfZTgyMDoKKworCS8qIFByZXNlcnZlIHJlZ2lzdGVycyAqLworCXB1c2hsCSVlc2kKKwlwdXNodwklYnAKKworCS8qIFNwbGl0ICVlYnggaW50byAlc2k6JWJ4LCBzdG9yZSBvcmlnaW5hbCAlYnggaW4gJWJwICovCisJcHVzaGwJJWVieAorCXBvcHcJJWJwCisJcG9wdwklc2kKKworCS8qICVzaSA9PSAwID0+IHN0YXJ0IG9mIG1lbW9yeV93aW5kb3dzIGxpc3QgKi8KKwl0ZXN0dwklc2ksICVzaQorCWpuZQkxZgorCW1vdncJJG1lbW9yeV93aW5kb3dzLCAlc2kKKzE6CQorCS8qIEdldCAoY2FjaGVkKSB1bmRlcmx5aW5nIGU4MjAgcmVnaW9uIHRvIGJ1ZmZlciAqLworCWNhbGwJZ2V0X3VuZGVybHlpbmdfZTgyMAorCWpjCTk5ZiAvKiBBYm9ydCBvbiBlcnJvciAqLworCisJLyogUHJlc2VydmUgcmVnaXN0ZXJzICovCisJcHVzaGFsCisJLyogc3RhcnQgPT4gJWVkeDolZWF4LCBsZW4gPT4gJWVjeDolZWJ4ICovCisJbW92bAklZXM6MCglZGkpLCAlZWF4CisJbW92bAklZXM6NCglZGkpLCAlZWR4CisJbW92bAklZXM6OCglZGkpLCAlZWJ4CisJbW92bAklZXM6MTIoJWRpKSwgJWVjeAorCS8qIFRydW5jYXRlIHJlZ2lvbiB0byBjdXJyZW50IHdpbmRvdyAqLworCWNhbGwJd2luZG93X3JlZ2lvbgorMToJLyogU3RvcmUgbW9kaWZpZWQgdmFsdWVzIGluIGU4MjAgbWFwIGVudHJ5ICovCisJbW92bAklZWF4LCAlZXM6MCglZGkpCisJbW92bAklZWR4LCAlZXM6NCglZGkpCisJbW92bAklZWJ4LCAlZXM6OCglZGkpCisJbW92bAklZWN4LCAlZXM6MTIoJWRpKQorCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJcG9wYWwKKworCS8qIERlcml2ZSBjb250aW51YXRpb24gdmFsdWUgZm9yIG5leHQgY2FsbCAqLworCWFkZHcJJDE2LCAlc2kKKwljbXB3CSRtZW1vcnlfd2luZG93c19lbmQsICVzaQorCWpuZQkxZgorCS8qIEVuZCBvZiBtZW1vcnkgd2luZG93czogcmVzZXQgJXNpIGFuZCBhbGxvdyAlYnggdG8gY29udGludWUgKi8KKwl4b3J3CSVzaSwgJXNpCisJam1wCTJmCisxOgkvKiBNb3JlIG1lbW9yeSB3aW5kb3dzIHRvIGdvOiByZXN0b3JlIG9yaWdpbmFsICVieCAqLworCW1vdncJJWJwLCAlYngKKzI6CS8qIENvbnN0cnVjdCAlZWJ4IGZyb20gJXNpOiVieCAqLworCXB1c2h3CSVzaQorCXB1c2h3CSVieAorCXBvcGwJJWVieAorCis5ODoJLyogQ2xlYXIgQ0YgKi8KKwljbGMKKzk5OgkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgcmV0dXJuICovCisJcG9wdwklYnAKKwlwb3BsCSVlc2kKKwlyZXQKKwkuc2l6ZSBnZXRfd2luZG93ZWRfZTgyMCwgLiAtIGdldF93aW5kb3dlZF9lODIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZXQgd2luZG93ZWQgZTgyMCByZWdpb24sIHdpdGggZW1wdHkgcmVnaW9uIHN0cmlwcGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIEFzIGZvciBJTlQgMTUsZTgyMAorICogUmV0dXJuczoKKyAqICAgQXMgZm9yIElOVCAxNSxlODIwCisgKgorICogV3JhcHMgdGhlIHVuZGVybHlpbmcgSU5UIDE1LGU4MjAgY2FsbCBzbyB0aGF0IGVhY2ggdW5kZXJseWluZworICogcmVnaW9uIGlzIHJldHVybmVkIHVwIHRvIE4gdGltZXMsIHdpbmRvd2VkIHRvIGZpdCB3aXRoaW4gTgorICogdmlzaWJsZS1tZW1vcnkgd2luZG93cy4gIEVtcHR5IHdpbmRvd3MgYXJlIG5ldmVyIHJldHVybmVkLgorICogVGVybWluYXRpb24gaXMgYWx3YXlzIHZpYSBDRj0xLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworZ2V0X25vbmVtcHR5X2U4MjA6CisKKwkvKiBSZWNvcmQgZW50cnkgcGFyYW1ldGVycyAqLworCXB1c2hsCSVlYXgKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkeAorCisJLyogR2V0IG5leHQgd2luZG93ZWQgcmVnaW9uICovCisJY2FsbAlnZXRfd2luZG93ZWRfZTgyMAorCWpjCTk5ZiAvKiBhYm9ydCBvbiBlcnJvciAqLworCisJLyogSWYgcmVnaW9uIGlzIG5vbi1lbXB0eSwgZmluaXNoIGhlcmUgKi8KKwljbXBsCSQwLCAlZXM6OCglZGkpCisJam5lCTk4ZgorCWNtcGwJJDAsICVlczoxMiglZGkpCisJam5lCTk4ZgorCisJLyogUmVnaW9uIHdhcyBlbXB0eTogcmVzdG9yZSBlbnRyeSBwYXJhbWV0ZXJzIGFuZCBnbyB0byBuZXh0IHJlZ2lvbiAqLworCXBvcGwJJWVkeAorCXBvcGwJJWVjeAorCXBvcGwJJWVheAorCWptcAlnZXRfbm9uZW1wdHlfZTgyMAorCis5ODoJLyogQ2xlYXIgQ0YgKi8KKwljbGMKKzk5OgkvKiBSZXR1cm4gdmFsdWVzIGZyb20gdW5kZXJseWluZyBjYWxsICovCisJYWRkcjMyIGxlYWwgMTIoJWVzcCksICVlc3AgLyogYXZvaWQgY2hhbmdpbmcgZmxhZ3MgKi8KKwlyZXQKKwkuc2l6ZSBnZXRfbm9uZW1wdHlfZTgyMCwgLiAtIGdldF9ub25lbXB0eV9lODIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZXQgbWFuZ2xlZCBlODIwIHJlZ2lvbiwgd2l0aCBlbXB0eSByZWdpb24gc3RyaXBwaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgQXMgZm9yIElOVCAxNSxlODIwCisgKiBSZXR1cm5zOgorICogICBBcyBmb3IgSU5UIDE1LGU4MjAKKyAqCisgKiBXcmFwcyB0aGUgdW5kZXJseWluZyBJTlQgMTUsZTgyMCBjYWxsIHNvIHRoYXQgdW5kZXJseWluZyByZWdpb25zCisgKiBhcmUgd2luZG93ZWQgdG8gdGhlIGFsbG93ZWQgbWVtb3J5IHJlZ2lvbnMuICBFbXB0eSByZWdpb25zIGFyZQorICogc3RyaXBwZWQgZnJvbSB0aGUgbWFwLiAgVGVybWluYXRpb24gaXMgYWx3YXlzIHZpYSAlZWJ4PTAuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCitnZXRfbWFuZ2xlZF9lODIwOgorCisJLyogR2V0IGEgbm9uZW1wdHkgcmVnaW9uICovCisJY2FsbAlnZXRfbm9uZW1wdHlfZTgyMAorCWpjCTk5ZiAvKiBBYm9ydCBvbiBlcnJvciAqLworCisJLyogUGVlayBhaGVhZCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBmdXJ0aGVyIG5vbmVtcHR5IHJlZ2lvbnMgKi8KKwlwdXNoYWwKKwlwdXNodwklZXMKKwltb3Z3CSVzcCwgJWJwCisJc3VidwklY3gsICVzcAorCW1vdmwJJDB4ZTgyMCwgJWVheAorCW1vdmwJJFNNQVAsICVlZHgKKwlwdXNodwklc3MKKwlwb3B3CSVlcworCW1vdncJJXNwLCAlZGkKKwljYWxsCWdldF9ub25lbXB0eV9lODIwCisJbW92dwklYnAsICVzcAorCXBvcHcJJWVzCisJcG9wYWwKKwlqbmMJOTlmIC8qIFRoZXJlIGFyZSBmdXJ0aGVyIG5vbmVtcHR5IHJlZ2lvbnMgKi8KKworCS8qIE5vIGZ1dGhlciBub25lbXB0eSByZWdpb25zOiB6ZXJvICVlYnggYW5kIGNsZWFyIENGICovCisJeG9ybAklZWJ4LCAlZWJ4CisJCis5OToJLyogUmV0dXJuICovCisJcmV0CisJLnNpemUgZ2V0X21hbmdsZWRfZTgyMCwgLiAtIGdldF9tYW5nbGVkX2U4MjAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldC9jbGVhciBDRiBvbiB0aGUgc3RhY2sgYXMgYXBwcm9wcmlhdGUsIGFzc3VtZXMgc3RhY2sgaXMgYXMgaXQgc2hvdWxkCisgKiBiZSBpbW1lZGlhdGVseSBiZWZvcmUgSVJFVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGF0Y2hfY2Y6CisJcHVzaHcJJWJwCisJbW92dwklc3AsICVicAorCXNldGMJOCglYnApCS8qIFNldC9yZXNldCBDRjsgY2xlYXJzIFBGLCBBRiwgWkYsIFNGICovCisJcG9wdwklYnAKKwlyZXQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOVCAxNSxlODIwIGhhbmRsZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworaW50MTVfZTgyMDoKKwlwdXNodwklZHMKKwlwdXNodwklY3M6cm1fZHMKKwlwb3B3CSVkcworCWNhbGwJZ2V0X21hbmdsZWRfZTgyMAorCXBvcHcJJWRzCisJY2FsbAlwYXRjaF9jZgorCWlyZXQKKwkuc2l6ZSBpbnQxNV9lODIwLCAuIC0gaW50MTVfZTgyMAorCQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOVCAxNSxlODAxIGhhbmRsZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworaW50MTVfZTgwMToKKwkvKiBDYWxsIHByZXZpb3VzIGhhbmRsZXIgKi8KKwlwdXNoZncKKwlsY2FsbAkqJWNzOmludDE1X3ZlY3RvcgorCWNhbGwJcGF0Y2hfY2YKKwkvKiBFZGl0IHJlc3VsdCAqLworCXB1c2h3CSVkcworCXB1c2h3CSVjczpybV9kcworCXBvcHcJJWRzCisJY2FsbAlwYXRjaF8xbV8xNm0KKwl4Y2hndwklYXgsICVjeAorCXhjaGd3CSVieCwgJWR4CisJY2FsbAlwYXRjaF8xbV8xNm0KKwl4Y2hndwklYXgsICVjeAorCXhjaGd3CSVieCwgJWR4CisJcG9wdwklZHMKKwlpcmV0CisJLnNpemUgaW50MTVfZTgwMSwgLiAtIGludDE1X2U4MDEKKwkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTlQgMTUsODggaGFuZGxlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCitpbnQxNV84ODoKKwkvKiBDYWxsIHByZXZpb3VzIGhhbmRsZXIgKi8KKwlwdXNoZncKKwlsY2FsbAkqJWNzOmludDE1X3ZlY3RvcgorCWNhbGwJcGF0Y2hfY2YKKwkvKiBFZGl0IHJlc3VsdCAqLworCXB1c2h3CSVkcworCXB1c2h3CSVjczpybV9kcworCXBvcHcJJWRzCisJY2FsbAlwYXRjaF8xbQorCXBvcHcJJWRzCisJaXJldAorCS5zaXplIGludDE1Xzg4LCAuIC0gaW50MTVfODgKKwkJCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5UIDE1IGhhbmRsZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworCS5nbG9ibCBpbnQxNQoraW50MTU6CisJLyogU2VlIGlmIHdlIHdhbnQgdG8gaW50ZXJjZXB0IHRoaXMgY2FsbCAqLworCXB1c2hmdworCWNtcHcJJDB4ZTgyMCwgJWF4CisJam5lCTFmCisJY21wbAkkU01BUCwgJWVkeAorCWpuZQkxZgorCXBvcGZ3CisJam1wCWludDE1X2U4MjAKKzE6CWNtcHcJJDB4ZTgwMSwgJWF4CisJam5lCTJmCisJcG9wZncKKwlqbXAJaW50MTVfZTgwMQorMjoJY21wYgkkMHg4OCwgJWFoCisJam5lCTNmCisJcG9wZncKKwlqbXAJaW50MTVfODgKKzM6CXBvcGZ3CisJbGptcAkqJWNzOmludDE1X3ZlY3RvcgorCS5zaXplIGludDE1LCAuIC0gaW50MTUKKwkKKwkuc2VjdGlvbiAiLnRleHQxNi5kYXRhIiwgImF3IiwgQHByb2diaXRzCisJLmdsb2JsIGludDE1X3ZlY3RvcgoraW50MTVfdmVjdG9yOgorCS5sb25nIDAKKwkuc2l6ZSBpbnQxNV92ZWN0b3IsIC4gLSBpbnQxNV92ZWN0b3IKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvZmFrZWU4MjAuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvZmFrZWU4MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTExNmZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9mYWtlZTgyMC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Ymlvc2ludC5oPgorCisvKiogQXNzZW1ibHkgcm91dGluZSBpbiBpbmxpbmUgYXNtICovCitleHRlcm4gdm9pZCBpbnQxNV9mYWtlZTgyMCgpOworCisvKiogT3JpZ2luYWwgSU5UIDE1IGhhbmRsZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vnb2ZmIF9fdGV4dDE2ICggcmVhbF9pbnQxNV92ZWN0b3IgKTsKKyNkZWZpbmUgcmVhbF9pbnQxNV92ZWN0b3IgX191c2VfdGV4dDE2ICggcmVhbF9pbnQxNV92ZWN0b3IgKQorCisvKiogQW4gSU5UIDE1LGU4MjAgbWVtb3J5IG1hcCBlbnRyeSAqLworc3RydWN0IGU4MjBfZW50cnkgeworCS8qKiBTdGFydCBvZiByZWdpb24gKi8KKwl1aW50NjRfdCBzdGFydDsKKwkvKiogTGVuZ3RoIG9mIHJlZ2lvbiAqLworCXVpbnQ2NF90IGxlbjsKKwkvKiogVHlwZSBvZiByZWdpb24gKi8KKwl1aW50MzJfdCB0eXBlOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworI2RlZmluZSBFODIwX1RZUEVfUkFNCQkxIC8qKjwgTm9ybWFsIG1lbW9yeSAqLworI2RlZmluZSBFODIwX1RZUEVfUlNWRAkJMiAvKio8IFJlc2VydmVkIGFuZCB1bmF2YWlsYWJsZSAqLworI2RlZmluZSBFODIwX1RZUEVfQUNQSQkJMyAvKio8IEFDUEkgcmVjbGFpbSBtZW1vcnkgKi8KKyNkZWZpbmUgRTgyMF9UWVBFX05WUwkJNCAvKio8IEFDUEkgTlZTIG1lbW9yeSAqLworCisvKiogRmFrZSBlODIwIG1hcCAqLworc3RhdGljIHN0cnVjdCBlODIwX2VudHJ5IF9fdGV4dDE2X2FycmF5ICggZTgyMG1hcCwgW10gKSBfX3VzZWQgPSB7CisJeyAweDAwMDAwMDAwVUxMLCAoIDB4MDAwYTAwMDBVTEwgLSAweDAwMDAwMDAwVUxMICksIEU4MjBfVFlQRV9SQU0gfSwKKwl7IDB4MDAxMDAwMDBVTEwsICggMHhjZmI1MDAwMFVMTCAtIDB4MDAxMDAwMDBVTEwgKSwgRTgyMF9UWVBFX1JBTSB9LAorCXsgMHhjZmI1MDAwMFVMTCwgKCAweGNmYjY0MDAwVUxMIC0gMHhjZmI1MDAwMFVMTCApLCBFODIwX1RZUEVfUlNWRCB9LAorCXsgMHhjZmI2NDAwMFVMTCwgKCAweGNmYjY2MDAwVUxMIC0gMHhjZmI2NDAwMFVMTCApLCBFODIwX1RZUEVfUlNWRCB9LAorCXsgMHhjZmI2NjAwMFVMTCwgKCAweGNmYjg1YzAwVUxMIC0gMHhjZmI2NjAwMFVMTCApLCBFODIwX1RZUEVfQUNQSSB9LAorCXsgMHhjZmI4NWMwMFVMTCwgKCAweGQwMDAwMDAwVUxMIC0gMHhjZmI4NWMwMFVMTCApLCBFODIwX1RZUEVfUlNWRCB9LAorCXsgMHhlMDAwMDAwMFVMTCwgKCAweGYwMDAwMDAwVUxMIC0gMHhlMDAwMDAwMFVMTCApLCBFODIwX1RZUEVfUlNWRCB9LAorCXsgMHhmZTAwMDAwMFVMTCwgKDB4MTAwMDAwMDAwVUxMIC0gMHhmZTAwMDAwMFVMTCApLCBFODIwX1RZUEVfUlNWRCB9LAorCXsweDEwMDAwMDAwMFVMTCwgKDB4MjMwMDAwMDAwVUxMIC0weDEwMDAwMDAwMFVMTCApLCBFODIwX1RZUEVfUkFNIH0sCit9OworI2RlZmluZSBlODIwbWFwIF9fdXNlX3RleHQxNiAoIGU4MjBtYXAgKQorCit2b2lkIGZha2VfZTgyMCAoIHZvaWQgKSB7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQlURVhUMTZfQ09ERSAoICJcbmludDE1X2Zha2VlODIwOlxuXHQiCisJCQkgICAgICAicHVzaGZ3XG5cdCIKKwkJCSAgICAgICJjbXBsICQweGU4MjAsICUlZWF4XG5cdCIKKwkJCSAgICAgICJqbmUgOTlmXG5cdCIKKwkJCSAgICAgICJjbXBsICQweDUzNGQ0MTUwLCAlJWVkeFxuXHQiCisJCQkgICAgICAiam5lIDk5ZlxuXHQiCisJCQkgICAgICAicHVzaGF3XG5cdCIKKwkJCSAgICAgICJtb3Z3ICUlc3AsICUlYnBcblx0IgorCQkJICAgICAgImFuZGIgJH4weDAxLCAyMiglJWJwKVxuXHQiIC8qIENsZWFyIHJldHVybiBDRiAqLworCQkJICAgICAgImxlYXcgZTgyMG1hcCglJWJ4KSwgJSVzaVxuXHQiCisJCQkgICAgICAiY3MgcmVwIG1vdnNiXG5cdCIKKwkJCSAgICAgICJwb3Bhd1xuXHQiCisJCQkgICAgICAibW92bCAlJWVkeCwgJSVlYXhcblx0IgorCQkJICAgICAgImFkZGwgJDIwLCAlJWVieFxuXHQiCisJCQkgICAgICAiY21wbCAlMCwgJSVlYnhcblx0IgorCQkJICAgICAgImpuZSAxZlxuXHQiCisJCQkgICAgICAieG9ybCAlJWVieCwlJWVieFxuXHQiCisJCQkgICAgICAiXG4xOlxuXHQiCisJCQkgICAgICAicG9wZndcblx0IgorCQkJICAgICAgImlyZXRcblx0IgorCQkJICAgICAgIlxuOTk6XG5cdCIKKwkJCSAgICAgICJwb3Bmd1xuXHQiCisJCQkgICAgICAibGptcCAqJSVjczpyZWFsX2ludDE1X3ZlY3RvclxuXHQiICkKKwkJOiA6ICJpIiAoIHNpemVvZiAoIGU4MjBtYXAgKSApICk7CisKKwlob29rX2Jpb3NfaW50ZXJydXB0ICggMHgxNSwgKCB1bnNpZ25lZCBpbnQgKSBpbnQxNV9mYWtlZTgyMCwKKwkJCSAgICAgICZyZWFsX2ludDE1X3ZlY3RvciApOworfQorCit2b2lkIHVuZmFrZV9lODIwICggdm9pZCApIHsKKwl1bmhvb2tfYmlvc19pbnRlcnJ1cHQgKCAweDE1LCAoIHVuc2lnbmVkIGludCApIGludDE1X2Zha2VlODIwLAorCQkJCSZyZWFsX2ludDE1X3ZlY3RvciApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9nYXRlQTIwLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvZmlybXdhcmUvcGNiaW9zL2dhdGVBMjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTcxNDcyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9nYXRlQTIwLmMKQEAgLTAsMCArMSwxNzYgQEAKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxiaW9zLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorI2luY2x1ZGUgPGdweGUvdGltZXIuaD4KKworI2RlZmluZSBLX1JEV1IJCTB4NjAJCS8qIGtleWJvYXJkIGRhdGEgJiBjbWRzIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBLX1NUQVRVUwkweDY0CQkvKiBrZXlib2FyZCBzdGF0dXMgKi8KKyNkZWZpbmUgS19DTUQJCTB4NjQJCS8qIGtleWJkIGN0bHIgY29tbWFuZCAod3JpdGUtb25seSkgKi8KKworI2RlZmluZSBLX09CVUZfRlVMCTB4MDEJCS8qIG91dHB1dCBidWZmZXIgZnVsbCAqLworI2RlZmluZSBLX0lCVUZfRlVMCTB4MDIJCS8qIGlucHV0IGJ1ZmZlciBmdWxsICovCisKKyNkZWZpbmUgS0NfQ01EX1dJTgkweGQwCQkvKiByZWFkICBvdXRwdXQgcG9ydCAqLworI2RlZmluZSBLQ19DTURfV09VVAkweGQxCQkvKiB3cml0ZSBvdXRwdXQgcG9ydCAqLworI2RlZmluZSBLQ19DTURfTlVMTAkweGZmCQkvKiBudWxsIGNvbW1hbmQgKCJwdWxzZSBub3RoaW5nIikgKi8KKyNkZWZpbmUgS0JfU0VUX0EyMAkweGRmCQkvKiBlbmFibGUgQTIwLAorCQkJCQkgICBlbmFibGUgb3V0cHV0IGJ1ZmZlciBmdWxsIGludGVycnVwdAorCQkJCQkgICBlbmFibGUgZGF0YSBsaW5lCisJCQkJCSAgIGRpc2FibGUgY2xvY2sgbGluZSAqLworI2RlZmluZSBLQl9VTlNFVF9BMjAJMHhkZAkJLyogZW5hYmxlIEEyMCwKKwkJCQkJICAgZW5hYmxlIG91dHB1dCBidWZmZXIgZnVsbCBpbnRlcnJ1cHQKKwkJCQkJICAgZW5hYmxlIGRhdGEgbGluZQorCQkJCQkgICBkaXNhYmxlIGNsb2NrIGxpbmUgKi8KKworI2RlZmluZSBTQ1BfQQkJMHg5MgkJLyogU3lzdGVtIENvbnRyb2wgUG9ydCBBICovCisKK2VudW0geyBEaXNhYmxlX0EyMCA9IDB4MjQwMCwgRW5hYmxlX0EyMCA9IDB4MjQwMSwgUXVlcnlfQTIwX1N0YXR1cyA9IDB4MjQwMiwKKwlRdWVyeV9BMjBfU3VwcG9ydCA9IDB4MjQwMyB9OworCitlbnVtIGEyMF9tZXRob2RzIHsKKwlBMjBfVU5LTk9XTiA9IDAsCisJQTIwX0lOVDE1LAorCUEyMF9LQkMsCisJQTIwX1NDUEEsCit9OworCisjZGVmaW5lIEEyMF9NQVhfUkVUUklFUwkJMzIKKyNkZWZpbmUgQTIwX0lOVDE1X1JFVFJJRVMJMzIKKyNkZWZpbmUgQTIwX0tCQ19SRVRSSUVTCQkoMl4yMSkKKyNkZWZpbmUgQTIwX1NDUEFfUkVUUklFUwkoMl4yMSkKKworLyoqCisgKiBEcmFpbiBrZXlib2FyZCBjb250cm9sbGVyCisgKi8KK3N0YXRpYyB2b2lkIGVtcHR5XzgwNDIgKCB2b2lkICkgeworCXVuc2lnbmVkIGxvbmcgdGltZTsKKworCXRpbWUgPSBjdXJydGlja3MoKSArIFRJQ0tTX1BFUl9TRUM7CS8qIG1heCB3YWl0IG9mIDEgc2Vjb25kICovCisJd2hpbGUgKCAoIGluYiAoIEtfQ01EICkgJiAoIEtfSUJVRl9GVUwgfCBLX09CVUZfRlVMICkgKSAmJgorCQljdXJydGlja3MoKSA8IHRpbWUgKSB7CisJCWlvZGVsYXkoKTsKKwkJKCB2b2lkICkgaW5iX3AgKCBLX1JEV1IgKTsKKwkJaW9kZWxheSgpOworCX0KK30KKworLyoqCisgKiBGYXN0IHRlc3QgdG8gc2VlIGlmIGdhdGUgQTIwIGlzIGFscmVhZHkgc2V0CisgKgorICogQHYgcmV0cmllcwkJTnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGJlZm9yZSBnaXZpbmcgdXAKKyAqIEByZXQgc2V0CQlHYXRlIEEyMCBpcyBzZXQKKyAqLworc3RhdGljIGludCBnYXRlQTIwX2lzX3NldCAoIGludCByZXRyaWVzICkgeworCXN0YXRpYyB1aW50MzJfdCB0ZXN0X3BhdHRlcm4gPSAweGRlYWRiZWVmOworCXBoeXNhZGRyX3QgdGVzdF9wYXR0ZXJuX3BoeXMgPSB2aXJ0X3RvX3BoeXMgKCAmdGVzdF9wYXR0ZXJuICk7CisJcGh5c2FkZHJfdCB2ZXJpZnlfcGF0dGVybl9waHlzID0gKCB0ZXN0X3BhdHRlcm5fcGh5cyBeIDB4MTAwMDAwICk7CisJdXNlcnB0cl90IHZlcmlmeV9wYXR0ZXJuX3VzZXIgPSBwaHlzX3RvX3VzZXIgKCB2ZXJpZnlfcGF0dGVybl9waHlzICk7CisJdWludDMyX3QgdmVyaWZ5X3BhdHRlcm47CisKKwlkbyB7CisJCS8qIENoZWNrIGZvciBkaWZmZXJlbmNlICovCisJCWNvcHlfZnJvbV91c2VyICggJnZlcmlmeV9wYXR0ZXJuLCB2ZXJpZnlfcGF0dGVybl91c2VyLCAwLAorCQkJCSBzaXplb2YgKCB2ZXJpZnlfcGF0dGVybiApICk7CisJCWlmICggdmVyaWZ5X3BhdHRlcm4gIT0gdGVzdF9wYXR0ZXJuICkKKwkJCXJldHVybiAxOworCisJCS8qIEF2b2lkIGZhbHNlIG5lZ2F0aXZlcyAqLworCQl0ZXN0X3BhdHRlcm4rKzsKKworCQlpb2RlbGF5KCk7CisKKwkJLyogQWx3YXlzIHJldHJ5IGF0IGxlYXN0IG9uY2UsIHRvIGF2b2lkIGZhbHNlIG5lZ2F0aXZlcyAqLworCX0gd2hpbGUgKCByZXRyaWVzLS0gPj0gMCApOworCisJLyogUGF0dGVybiBtYXRjaGVkIGV2ZXJ5IHRpbWU7IGdhdGUgQTIwIGlzIG5vdCBzZXQgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdhdGUgQTIwIGZvciBoaWdoIG1lbW9yeQorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIHJldHVybiBwYXRoIGZyb20KKyAqIGxpYnJtJ3MgcmVhbF9jYWxsLCB3aGljaCBpcyB1c2VkIHRvIG1ha2UgdGhlIGludDE1IGNhbGwgaWYgbGlicm0gaXMKKyAqIGJlaW5nIHVzZWQuICBUbyBhdm9pZCBhbiBpbmZpbml0ZSByZWN1cnNpb24sIHdlIG1ha2UgZ2F0ZUEyMF9zZXQKKyAqIHJldHVybiBpbW1lZGlhdGVseSBpZiBpdCBpcyBhbHJlYWR5IHBhcnQgb2YgdGhlIGNhbGwgc3RhY2suCisgKi8KK3ZvaWQgZ2F0ZUEyMF9zZXQgKCB2b2lkICkgeworCXN0YXRpYyBjaGFyIHJlZW50cnlfZ3VhcmQgPSAwOworCXN0YXRpYyBpbnQgYTIwX21ldGhvZCA9IEEyMF9VTktOT1dOOworCXVuc2lnbmVkIGludCBkaXNjYXJkX2E7CisJdW5zaWduZWQgaW50IHNjcF9hOworCWludCByZXRyaWVzID0gMDsKKworCS8qIEF2b2lkIHBvdGVudGlhbCBpbmZpbml0ZSByZWN1cnNpb24gKi8KKwlpZiAoIHJlZW50cnlfZ3VhcmQgKQorCQlyZXR1cm47CisJcmVlbnRyeV9ndWFyZCA9IDE7CisKKwkvKiBGYXN0IGNoZWNrIHRvIHNlZSBpZiBnYXRlIEEyMCBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKwlpZiAoIGdhdGVBMjBfaXNfc2V0ICggMCApICkKKwkJZ290byBvdXQ7CisKKwlmb3IgKCA7IHJldHJpZXMgPCBBMjBfTUFYX1JFVFJJRVMgOyByZXRyaWVzKysgKSB7CisJCXN3aXRjaCAoIGEyMF9tZXRob2QgKSB7CisJCWNhc2UgQTIwX1VOS05PV046CisJCWNhc2UgQTIwX0lOVDE1OgorCQkJLyogVHJ5IElOVCAxNSBtZXRob2QgKi8KKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggImludCAkMHgxNSIgKQorCQkJCQkgICAgICAgOiAiPWEiICggZGlzY2FyZF9hICkKKwkJCQkJICAgICAgIDogImEiICggRW5hYmxlX0EyMCApICk7CisJCQlpZiAoIGdhdGVBMjBfaXNfc2V0ICggQTIwX0lOVDE1X1JFVFJJRVMgKSApIHsKKwkJCQlEQkcgKCAiRW5hYmxlZCBnYXRlIEEyMCB1c2luZyBCSU9TXG4iICk7CisJCQkJYTIwX21ldGhvZCA9IEEyMF9JTlQxNTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIEEyMF9LQkM6CisJCQkvKiBUcnkga2V5Ym9hcmQgY29udHJvbGxlciBtZXRob2QgKi8KKwkJCWVtcHR5XzgwNDIoKTsKKwkJCW91dGIgKCBLQ19DTURfV09VVCwgS19DTUQgKTsKKwkJCWVtcHR5XzgwNDIoKTsKKwkJCW91dGIgKCBLQl9TRVRfQTIwLCBLX1JEV1IgKTsKKwkJCWVtcHR5XzgwNDIoKTsKKwkJCW91dGIgKCBLQ19DTURfTlVMTCwgS19DTUQgKTsKKwkJCWVtcHR5XzgwNDIoKTsKKwkJCWlmICggZ2F0ZUEyMF9pc19zZXQgKCBBMjBfS0JDX1JFVFJJRVMgKSApIHsKKwkJCQlEQkcgKCAiRW5hYmxlZCBnYXRlIEEyMCB1c2luZyAiCisJCQkJICAgICAgImtleWJvYXJkIGNvbnRyb2xsZXJcbiIgKTsKKwkJCQlhMjBfbWV0aG9kID0gQTIwX0tCQzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIEEyMF9TQ1BBOgorCQkJLyogVHJ5ICJGYXN0IGdhdGUgQTIwIiBtZXRob2QgKi8KKwkJCXNjcF9hID0gaW5iICggU0NQX0EgKTsKKwkJCXNjcF9hICY9IH4weDAxOyAvKiBBdm9pZCB0cmlnZ2VyaW5nIGEgcmVzZXQgKi8KKwkJCXNjcF9hIHw9IDB4MDI7IC8qIEVuYWJsZSBBMjAgKi8KKwkJCWlvZGVsYXkoKTsKKwkJCW91dGIgKCBzY3BfYSwgU0NQX0EgKTsKKwkJCWlvZGVsYXkoKTsKKwkJCWlmICggZ2F0ZUEyMF9pc19zZXQgKCBBMjBfU0NQQV9SRVRSSUVTICkgKSB7CisJCQkJREJHICggIkVuYWJsZWQgZ2F0ZSBBMjAgdXNpbmcgIgorCQkJCSAgICAgICJGYXN0IEdhdGUgQTIwXG4iICk7CisJCQkJYTIwX21ldGhvZCA9IEEyMF9TQ1BBOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCisJLyogQmV0dGVyIHRvIGRpZSBub3cgdGhhbiBjb3JydXB0IG1lbW9yeSBsYXRlciAqLworCXByaW50ZiAoICJGQVRBTDogR2F0ZSBBMjAgc3R1Y2tcbiIgKTsKKwl3aGlsZSAoIDEgKSB7fQorCisgb3V0OgorCWlmICggcmV0cmllcyApCisJCURCRyAoICIlZCBhdHRlbXB0cyB3ZXJlIHJlcXVpcmVkIHRvIGVuYWJsZSBBMjBcbiIsCisJCSAgICAgICggcmV0cmllcyArIDEgKSApOworCXJlZW50cnlfZ3VhcmQgPSAwOworfQorCit2b2lkIGdhdGVBMjBfdW5zZXQgKCB2b2lkICkgeworCS8qIE5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKi8KK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvaGlkZW1lbS5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9oaWRlbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwODJjMwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvaGlkZW1lbS5jCkBAIC0wLDAgKzEsMjIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxyZWFsbW9kZS5oPgorI2luY2x1ZGUgPGJpb3NpbnQuaD4KKyNpbmNsdWRlIDxiYXNlbWVtLmg+CisjaW5jbHVkZSA8ZmFrZWU4MjAuaD4KKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKyNpbmNsdWRlIDxncHhlL21lbW1hcC5oPgorI2luY2x1ZGUgPGdweGUvaGlkZW1lbS5oPgorCisvKiogU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gdGVzdCBhIGZha2UgRTgyMCBtYXAgKi8KKyNkZWZpbmUgRkFLRV9FODIwIDAKKworLyoqIEFsaWdubWVudCBmb3IgaGlkZGVuIG1lbW9yeSByZWdpb25zICovCisjZGVmaW5lIEFMSUdOX0hJRERFTiA0MDk2ICAgLyogNGtCIHBhZ2UgYWxpZ25tZW50IHNob3VsZCBiZSBlbm91Z2ggKi8KKworLyoqCisgKiBBIGhpZGRlbiByZWdpb24gb2YgZ1BYRQorICoKKyAqIFRoaXMgcmVwcmVzZW50cyBhIHJlZ2lvbiB0aGF0IHdpbGwgYmUgZWRpdGVkIG91dCBvZiB0aGUgc3lzdGVtJ3MKKyAqIG1lbW9yeSBtYXAuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgYWNjZXNzZWQgYnkgYXNzZW1ibHkgY29kZSwgc28gbXVzdCBub3QgYmUKKyAqIGNoYW5nZWQuCisgKi8KK3N0cnVjdCBoaWRkZW5fcmVnaW9uIHsKKwkvKiogUGh5c2ljYWwgc3RhcnQgYWRkcmVzcyAqLworCXVpbnQ2NF90IHN0YXJ0OworCS8qKiBQaHlzaWNhbCBlbmQgYWRkcmVzcyAqLworCXVpbnQ2NF90IGVuZDsKK307CisKKy8qKiBIaWRkZW4gYmFzZSBtZW1vcnkgKi8KK2V4dGVybiBzdHJ1Y3QgaGlkZGVuX3JlZ2lvbiBfX2RhdGExNiAoIGhpZGVtZW1fYmFzZSApOworI2RlZmluZSBoaWRlbWVtX2Jhc2UgX191c2VfZGF0YTE2ICggaGlkZW1lbV9iYXNlICkKKworLyoqIEhpZGRlbiB1bWFsbG9jIG1lbW9yeSAqLworZXh0ZXJuIHN0cnVjdCBoaWRkZW5fcmVnaW9uIF9fZGF0YTE2ICggaGlkZW1lbV91bWFsbG9jICk7CisjZGVmaW5lIGhpZGVtZW1fdW1hbGxvYyBfX3VzZV9kYXRhMTYgKCBoaWRlbWVtX3VtYWxsb2MgKQorCisvKiogSGlkZGVuIHRleHQgbWVtb3J5ICovCitleHRlcm4gc3RydWN0IGhpZGRlbl9yZWdpb24gX19kYXRhMTYgKCBoaWRlbWVtX3RleHRkYXRhICk7CisjZGVmaW5lIGhpZGVtZW1fdGV4dGRhdGEgX191c2VfZGF0YTE2ICggaGlkZW1lbV90ZXh0ZGF0YSApCisKKy8qKiBBc3NlbWJseSByb3V0aW5lIGluIGU4MjBtYW5nbGVyLlMgKi8KK2V4dGVybiB2b2lkIGludDE1KCk7CisKKy8qKiBWZWN0b3IgZm9yIHN0b3Jpbmcgb3JpZ2luYWwgSU5UIDE1IGhhbmRsZXIgKi8KK2V4dGVybiBzdHJ1Y3Qgc2Vnb2ZmIF9fdGV4dDE2ICggaW50MTVfdmVjdG9yICk7CisjZGVmaW5lIGludDE1X3ZlY3RvciBfX3VzZV90ZXh0MTYgKCBpbnQxNV92ZWN0b3IgKQorCisvKiBUaGUgbGlua2VyIGRlZmluZXMgdGhlc2Ugc3ltYm9scyBmb3IgdXMgKi8KK2V4dGVybiBjaGFyIF90ZXh0ZGF0YVtdOworZXh0ZXJuIGNoYXIgX2V0ZXh0ZGF0YVtdOworZXh0ZXJuIGNoYXIgX3RleHQxNl9tZW1zeltdOworI2RlZmluZSBfdGV4dDE2X21lbXN6ICggKCB1bnNpZ25lZCBpbnQgKSBfdGV4dDE2X21lbXN6ICkKK2V4dGVybiBjaGFyIF9kYXRhMTZfbWVtc3pbXTsKKyNkZWZpbmUgX2RhdGExNl9tZW1zeiAoICggdW5zaWduZWQgaW50ICkgX2RhdGExNl9tZW1zeiApCisKKy8qKgorICogSGlkZSByZWdpb24gb2YgbWVtb3J5IGZyb20gc3lzdGVtIG1lbW9yeSBtYXAKKyAqCisgKiBAdiByZWdpb24JCUhpZGRlbiBtZW1vcnkgcmVnaW9uCisgKiBAdiBzdGFydAkJU3RhcnQgb2YgcmVnaW9uCisgKiBAdiBlbmQJCUVuZCBvZiByZWdpb24KKyAqLworc3RhdGljIHZvaWQgaGlkZV9yZWdpb24gKCBzdHJ1Y3QgaGlkZGVuX3JlZ2lvbiAqcmVnaW9uLAorCQkJICBwaHlzYWRkcl90IHN0YXJ0LCBwaHlzYWRkcl90IGVuZCApIHsKKworCS8qIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgZ2V0IGEgbmFzdHkgc2hvY2sgaWYgYSByZWdpb24gb2YgdGhlCisJICogRTgyMCBtYXAgc2VlbXMgdG8gc3RhcnQgb24gYSBub24tcGFnZSBib3VuZGFyeS4gIE1ha2UgbGlmZQorCSAqIHNhZmVyIGJ5IHJvdW5kaW5nIG91dCBvdXIgZWRpdGVkIHJlZ2lvbi4KKwkgKi8KKwlyZWdpb24tPnN0YXJ0ID0gKCBzdGFydCAmIH4oIEFMSUdOX0hJRERFTiAtIDEgKSApOworCXJlZ2lvbi0+ZW5kID0gKCAoIGVuZCArIEFMSUdOX0hJRERFTiAtIDEgKSAmIH4oIEFMSUdOX0hJRERFTiAtIDEgKSApOworCisJREJHICggIkhpZGluZyByZWdpb24gWyVsbHgsJWxseClcbiIsIHJlZ2lvbi0+c3RhcnQsIHJlZ2lvbi0+ZW5kICk7Cit9CisKKy8qKgorICogSGlkZSB1c2VkIGJhc2UgbWVtb3J5CisgKgorICovCit2b2lkIGhpZGVfYmFzZW1lbSAoIHZvaWQgKSB7CisJLyogSGlkZSBmcm9tIHRoZSB0b3Agb2YgZnJlZSBiYXNlIG1lbW9yeSB0byA2NDBrQi4gIERvbid0IHVzZQorCSAqIGhpZGVfcmVnaW9uKCksIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGlzIHJvdW5kZWQgdG8gdGhlCisJICogbmVhcmVzdCBwYWdlIGJvdW5kYXJ5LgorCSAqLworCWhpZGVtZW1fYmFzZS5zdGFydCA9ICggZ2V0X2ZibXMoKSAqIDEwMjQgKTsKK30KKworLyoqCisgKiBIaWRlIHVtYWxsb2MoKSByZWdpb24KKyAqCisgKi8KK3ZvaWQgaGlkZV91bWFsbG9jICggcGh5c2FkZHJfdCBzdGFydCwgcGh5c2FkZHJfdCBlbmQgKSB7CisJYXNzZXJ0ICggZW5kIDw9IHZpcnRfdG9fcGh5cyAoIF90ZXh0ZGF0YSApICk7CisJaGlkZV9yZWdpb24gKCAmaGlkZW1lbV91bWFsbG9jLCBzdGFydCwgZW5kICk7Cit9CisKKy8qKgorICogSGlkZSAudGV4dCBhbmQgLmRhdGEKKyAqCisgKi8KK3ZvaWQgaGlkZV90ZXh0ZGF0YSAoIHZvaWQgKSB7CisJaGlkZV9yZWdpb24gKCAmaGlkZW1lbV90ZXh0ZGF0YSwgdmlydF90b19waHlzICggX3RleHRkYXRhICksCisJCSAgICAgIHZpcnRfdG9fcGh5cyAoIF9ldGV4dGRhdGEgKSApOworfQorCisvKioKKyAqIEhpZGUgRXRoZXJib290CisgKgorICogSW5zdGFsbHMgYW4gSU5UIDE1IGhhbmRsZXIgdG8gZWRpdCBFdGhlcmJvb3Qgb3V0IG9mIHRoZSBtZW1vcnkgbWFwCisgKiByZXR1cm5lZCBieSB0aGUgQklPUy4KKyAqLworc3RhdGljIHZvaWQgaGlkZV9ldGhlcmJvb3QgKCB2b2lkICkgeworCXN0cnVjdCBtZW1vcnlfbWFwIG1lbW1hcDsKKwl1bnNpZ25lZCBpbnQgcm1fZHNfdG9wOworCXVuc2lnbmVkIGludCBybV9jc190b3A7CisJdW5zaWduZWQgaW50IGZibXM7CisKKwkvKiBEdW1wIG1lbW9yeSBtYXAgYmVmb3JlIG1hbmdsaW5nICovCisJREJHICggIkhpZGluZyBnUFhFIGZyb20gc3lzdGVtIG1lbW9yeSBtYXBcbiIgKTsKKwlnZXRfbWVtbWFwICggJm1lbW1hcCApOworCisJLyogSG9vayBpbiBmYWtlIEU4MjAgbWFwLCBpZiB3ZSdyZSB0ZXN0aW5nIG9uZSAqLworCWlmICggRkFLRV9FODIwICkgeworCQlEQkcgKCAiSG9va2luZyBpbiBmYWtlIEU4MjAgbWFwXG4iICk7CisJCWZha2VfZTgyMCgpOworCQlnZXRfbWVtbWFwICggJm1lbW1hcCApOworCX0KKworCS8qIEluaXRpYWxpc2UgdGhlIGhpZGRlbiByZWdpb25zICovCisJaGlkZV9iYXNlbWVtKCk7CisJaGlkZV91bWFsbG9jICggdmlydF90b19waHlzICggX3RleHRkYXRhICksIHZpcnRfdG9fcGh5cyAoIF90ZXh0ZGF0YSApICk7CisJaGlkZV90ZXh0ZGF0YSgpOworCisJLyogU29tZSByZWFsbHkgbW9yb25pYyBCSU9TZXMgYnJpbmcgdXAgdGhlIFBYRSBzdGFjayB2aWEgdGhlCisJICogVU5ESSBsb2FkZXIgZW50cnkgcG9pbnQgYW5kIHRoZW4gZG9uJ3QgYm90aGVyIHRvIHVubG9hZCBpdAorCSAqIGJlZm9yZSBvdmVyd3JpdGluZyB0aGUgY29kZSBhbmQgZGF0YSBzZWdtZW50cy4gIElmIHRoaXMKKwkgKiBoYXBwZW5zLCB3ZSByZWFsbHkgZG9uJ3Qgd2FudCB0byBsZWF2ZSBJTlQgMTUgaG9va2VkLAorCSAqIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlIGFueSBsb2FkZWQgT1MgdG8gZGllIGhvcnJpYmx5IGFzCisJICogc29vbiBhcyBpdCBhdHRlbXB0cyB0byBmZXRjaCB0aGUgc3lzdGVtIG1lbW9yeSBtYXAuCisJICoKKwkgKiBXZSB1c2UgYSBoZXVyaXN0aWMgdG8gZ3Vlc3Mgd2hldGhlciBvciBub3Qgd2UgYXJlIGJlaW5nCisJICogbG9hZGVkIHNlbnNpYmx5LgorCSAqLworCXJtX2NzX3RvcCA9ICggKCAoIHJtX2NzIDw8IDQgKSArIF90ZXh0MTZfbWVtc3ogKyAxMDI0IC0gMSApID4+IDEwICk7CisJcm1fZHNfdG9wID0gKCAoICggcm1fZHMgPDwgNCApICsgX2RhdGExNl9tZW1zeiArIDEwMjQgLSAxICkgPj4gMTAgKTsKKwlmYm1zID0gZ2V0X2ZibXMoKTsKKwlpZiAoICggcm1fY3NfdG9wIDwgZmJtcyApICYmICggcm1fZHNfdG9wIDwgZmJtcyApICkgeworCQlEQkcgKCAiRGV0ZWN0ZWQgcG90ZW50aWFsbHkgdW5zYWZlIFVOREkgbG9hZCBhdCBDUz0lMDR4ICIKKwkJICAgICAgIkRTPSUwNHggRkJNUz0lZGtCXG4iLCBybV9jcywgcm1fZHMsIGZibXMgKTsKKwkJREJHICggIkRpc2FibGluZyBJTlQgMTUgbWVtb3J5IGhpZGluZ1xuIiApOworCQlyZXR1cm47CisJfQorCisJLyogSG9vayBJTlQgMTUgKi8KKwlob29rX2Jpb3NfaW50ZXJydXB0ICggMHgxNSwgKCB1bnNpZ25lZCBpbnQgKSBpbnQxNSwKKwkJCSAgICAgICZpbnQxNV92ZWN0b3IgKTsKKworCS8qIER1bXAgbWVtb3J5IG1hcCBhZnRlciBtYW5nbGluZyAqLworCURCRyAoICJIaWRkZW4gZ1BYRSBmcm9tIHN5c3RlbSBtZW1vcnkgbWFwXG4iICk7CisJZ2V0X21lbW1hcCAoICZtZW1tYXAgKTsKK30KKworLyoqCisgKiBVbmhpZGUgRXRoZXJib290CisgKgorICogVW5pbnN0YWxscyB0aGUgSU5UIDE1IGhhbmRsZXIgaW5zdGFsbGVkIGJ5IGhpZGVfZXRoZXJib290KCksIGlmCisgKiBwb3NzaWJsZS4KKyAqLworc3RhdGljIHZvaWQgdW5oaWRlX2V0aGVyYm9vdCAoIGludCBmbGFncyBfX3VudXNlZCApIHsKKworCS8qIElmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBob29rZWQgaW50ZXJydXB0IGF0IHRoaXMgcG9pbnQsIGl0CisJICogbWVhbnMgdGhhdCBzb21lIG90aGVyIHZlY3RvciBpcyBzdGlsbCBob29rZWQsIGluIHdoaWNoIGNhc2UKKwkgKiB3ZSBjYW4ndCBzYWZlbHkgdW5ob29rIElOVCAxNSBiZWNhdXNlIHdlIG5lZWQgdG8ga2VlcCBvdXIKKwkgKiBtZW1vcnkgcHJvdGVjdGVkLiAgKFdlIGV4cGVjdCB0aGVyZSB0byBiZSBhdCBsZWFzdCBvbmUKKwkgKiBob29rZWQgaW50ZXJydXB0LCBiZWNhdXNlIElOVCAxNSBpdHNlbGYgaXMgc3RpbGwgaG9va2VkKS4KKwkgKi8KKwlpZiAoIGhvb2tlZF9iaW9zX2ludGVycnVwdHMgPiAxICkgeworCQlEQkcgKCAiQ2Fubm90IHVuaGlkZTogJWQgaW50ZXJydXB0IHZlY3RvcnMgc3RpbGwgaG9va2VkXG4iLAorCQkgICAgICBob29rZWRfYmlvc19pbnRlcnJ1cHRzICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUcnkgdG8gdW5ob29rIElOVCAxNS4gIElmIGl0IGZhaWxzLCB0aGVuIGp1c3QgbGVhdmUgaXQKKwkgKiBob29rZWQ7IGl0IHRha2VzIGNhcmUgb2YgcHJvdGVjdGluZyBpdHNlbGYuICA6KQorCSAqLworCXVuaG9va19iaW9zX2ludGVycnVwdCAoIDB4MTUsICggdW5zaWduZWQgaW50ICkgaW50MTUsCisJCQkJJmludDE1X3ZlY3RvciApOworCisJLyogVW5ob29rIGZha2UgRTgyMCBtYXAsIGlmIHVzZWQgKi8KKwlpZiAoIEZBS0VfRTgyMCApCisJCXVuZmFrZV9lODIwKCk7Cit9CisKKy8qKiBIaWRlIEV0aGVyYm9vdCBzdGFydHVwIGZ1bmN0aW9uICovCitzdHJ1Y3Qgc3RhcnR1cF9mbiBoaWRlX2V0aGVyYm9vdF9zdGFydHVwX2ZuIF9fc3RhcnR1cF9mbiAoIFNUQVJUVVBfRUFSTFkgKSA9IHsKKwkuc3RhcnR1cCA9IGhpZGVfZXRoZXJib290LAorCS5zaHV0ZG93biA9IHVuaGlkZV9ldGhlcmJvb3QsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9tZW1tYXAuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvbWVtbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzMGRiYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9maXJtd2FyZS9wY2Jpb3MvbWVtbWFwLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Ymlvcy5oPgorI2luY2x1ZGUgPG1lbXNpemVzLmg+CisjaW5jbHVkZSA8Z3B4ZS9tZW1tYXAuaD4KKworLyoqCisgKiBAZmlsZQorICoKKyAqIE1lbW9yeSBtYXBwaW5nCisgKgorICovCisKKy8qKiBNYWdpYyB2YWx1ZSBmb3IgSU5UIDE1LGU4MjAgY2FsbHMgKi8KKyNkZWZpbmUgU01BUCAoIDB4NTM0ZDQxNTAgKQorCisvKiogQW4gSU5UIDE1LGU4MjAgbWVtb3J5IG1hcCBlbnRyeSAqLworc3RydWN0IGU4MjBfZW50cnkgeworCS8qKiBTdGFydCBvZiByZWdpb24gKi8KKwl1aW50NjRfdCBzdGFydDsKKwkvKiogTGVuZ3RoIG9mIHJlZ2lvbiAqLworCXVpbnQ2NF90IGxlbjsKKwkvKiogVHlwZSBvZiByZWdpb24gKi8KKwl1aW50MzJfdCB0eXBlOworCS8qKiBFeHRlbmRlZCBhdHRyaWJ1dGVzIChvcHRpb25hbCkgKi8KKwl1aW50MzJfdCBhdHRyczsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKyNkZWZpbmUgRTgyMF9UWVBFX1JBTQkJMSAvKio8IE5vcm1hbCBtZW1vcnkgKi8KKyNkZWZpbmUgRTgyMF9UWVBFX1JFU0VSVkVECTIgLyoqPCBSZXNlcnZlZCBhbmQgdW5hdmFpbGFibGUgKi8KKyNkZWZpbmUgRTgyMF9UWVBFX0FDUEkJCTMgLyoqPCBBQ1BJIHJlY2xhaW0gbWVtb3J5ICovCisjZGVmaW5lIEU4MjBfVFlQRV9OVlMJCTQgLyoqPCBBQ1BJIE5WUyBtZW1vcnkgKi8KKworI2RlZmluZSBFODIwX0FUVFJfRU5BQkxFRAkweDAwMDAwMDAxVUwKKyNkZWZpbmUgRTgyMF9BVFRSX05PTlZPTEFUSUxFCTB4MDAwMDAwMDJVTAorI2RlZmluZSBFODIwX0FUVFJfVU5LTk9XTgkweGZmZmZmZmZjVUwKKworI2RlZmluZSBFODIwX01JTl9TSVpFCQkyMAorCisvKiogQnVmZmVyIGZvciBJTlQgMTUsZTgyMCBjYWxscyAqLworc3RhdGljIHN0cnVjdCBlODIwX2VudHJ5IF9fYnNzMTYgKCBlODIwYnVmICk7CisjZGVmaW5lIGU4MjBidWYgX191c2VfZGF0YTE2ICggZTgyMGJ1ZiApCisKKy8qKgorICogR2V0IHNpemUgb2YgZXh0ZW5kZWQgbWVtb3J5IHZpYSBJTlQgMTUsZTgwMQorICoKKyAqIEByZXQgZXh0bWVtCQlFeHRlbmRlZCBtZW1vcnkgc2l6ZSwgaW4ga0IsIG9yIDAKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBleHRtZW1zaXplX2U4MDEgKCB2b2lkICkgeworCXVpbnQxNl90IGV4dG1lbV8xbV90b18xNm1faywgZXh0bWVtXzE2bV9wbHVzXzY0azsKKwl1aW50MTZfdCBjb25mbWVtXzFtX3RvXzE2bV9rLCBjb25mbWVtXzE2bV9wbHVzXzY0azsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGV4dG1lbTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggInN0Y1xuXHQiCisJCQkJCSAgICJpbnQgJDB4MTVcblx0IgorCQkJCQkgICAicHVzaGZ3XG5cdCIKKwkJCQkJICAgInBvcHcgJXcwXG5cdCIgKQorCQkJICAgICAgIDogIj1yIiAoIGZsYWdzICksCisJCQkJICI9YSIgKCBleHRtZW1fMW1fdG9fMTZtX2sgKSwKKwkJCQkgIj1iIiAoIGV4dG1lbV8xNm1fcGx1c182NGsgKSwKKwkJCQkgIj1jIiAoIGNvbmZtZW1fMW1fdG9fMTZtX2sgKSwKKwkJCQkgIj1kIiAoIGNvbmZtZW1fMTZtX3BsdXNfNjRrICkKKwkJCSAgICAgICA6ICJhIiAoIDB4ZTgwMSApICk7CisKKwlpZiAoIGZsYWdzICYgQ0YgKSB7CisJCURCRyAoICJJTlQgMTUsZTgwMSBmYWlsZWQgd2l0aCBDRiBzZXRcbiIgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCAhICggZXh0bWVtXzFtX3RvXzE2bV9rIHwgZXh0bWVtXzE2bV9wbHVzXzY0ayApICkgeworCQlEQkcgKCAiSU5UIDE1LGU4MDEgZXh0bWVtPTAsIHVzaW5nIGNvbmZtZW1cbiIgKTsKKwkJZXh0bWVtXzFtX3RvXzE2bV9rID0gY29uZm1lbV8xbV90b18xNm1fazsKKwkJZXh0bWVtXzE2bV9wbHVzXzY0ayA9IGNvbmZtZW1fMTZtX3BsdXNfNjRrOworCX0KKworCWV4dG1lbSA9ICggZXh0bWVtXzFtX3RvXzE2bV9rICsgKCBleHRtZW1fMTZtX3BsdXNfNjRrICogNjQgKSApOworCURCRyAoICJJTlQgMTUsZTgwMSBleHRlbmRlZCBtZW1vcnkgc2l6ZSAlZCs2NColZD0lZCBrQiAiCisJICAgICAgIlsxMDAwMDAsJWxseClcbiIsIGV4dG1lbV8xbV90b18xNm1faywgZXh0bWVtXzE2bV9wbHVzXzY0aywKKwkgICAgICBleHRtZW0sICggMHgxMDAwMDAgKyAoICggKCB1aW50NjRfdCApIGV4dG1lbSApICogMTAyNCApICkgKTsKKworCS8qIFNhbml0eSBjaGVjay4gIFNvbWUgQklPU2VzIHJlcG9ydCB0aGUgZW50aXJlIDRHQiBhZGRyZXNzCisJICogc3BhY2UgYXMgYXZhaWxhYmxlLCB3aGljaCBjYW5ub3QgYmUgY29ycmVjdCAoc2luY2UgdGhhdAorCSAqIHdvdWxkIGxlYXZlIG5vIGFkZHJlc3Mgc3BhY2UgYXZhaWxhYmxlIGZvciAzMi1iaXQgUENJCisJICogQkFScykuCisJICovCisJaWYgKCBleHRtZW0gPT0gKCAweDQwMDAwMCAtIDB4NDAwICkgKSB7CisJCURCRyAoICJJTlQgMTUsZTgwMSByZXBvcnRlZCB3aG9sZSA0R0I7IGFzc3VtaW5nIGluc2FuZVxuIiApOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZXh0bWVtOworfQorCisvKioKKyAqIEdldCBzaXplIG9mIGV4dGVuZGVkIG1lbW9yeSB2aWEgSU5UIDE1LDg4CisgKgorICogQHJldCBleHRtZW0JCUV4dGVuZGVkIG1lbW9yeSBzaXplLCBpbiBrQgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGV4dG1lbXNpemVfODggKCB2b2lkICkgeworCXVpbnQxNl90IGV4dG1lbTsKKworCS8qIElnbm9yZSBDRjsgaXQgaXMgbm90IHJlbGlhYmxlIGZvciB0aGlzIGNhbGwgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFJFQUxfQ09ERSAoICJpbnQgJDB4MTUiICkKKwkJCSAgICAgICA6ICI9YSIgKCBleHRtZW0gKSA6ICJhIiAoIDB4ODgwMCApICk7CisKKwlEQkcgKCAiSU5UIDE1LDg4IGV4dGVuZGVkIG1lbW9yeSBzaXplICVkIGtCIFsxMDAwMDAsICV4KVxuIiwKKwkgICAgICBleHRtZW0sICggMHgxMDAwMDAgKyAoIGV4dG1lbSAqIDEwMjQgKSApICk7CisJcmV0dXJuIGV4dG1lbTsKK30KKworLyoqCisgKiBHZXQgc2l6ZSBvZiBleHRlbmRlZCBtZW1vcnkKKyAqCisgKiBAcmV0IGV4dG1lbQkJRXh0ZW5kZWQgbWVtb3J5IHNpemUsIGluIGtCCisgKgorICogTm90ZSB0aGF0IHRoaXMgaXMgb25seSBhbiBhcHByb3hpbWF0aW9uOyBmb3IgYW4gYWNjdXJhdGUgcGljdHVyZSwKKyAqIHVzZSB0aGUgRTgyMCBtZW1vcnkgbWFwIG9idGFpbmVkIHZpYSBnZXRfbWVtbWFwKCk7CisgKi8KK3Vuc2lnbmVkIGludCBleHRtZW1zaXplICggdm9pZCApIHsKKwl1bnNpZ25lZCBpbnQgZXh0bWVtOworCisJLyogVHJ5IElOVCAxNSxlODAxIGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byBJTlQgMTUsODggKi8KKwlleHRtZW0gPSBleHRtZW1zaXplX2U4MDEoKTsKKwlpZiAoICEgZXh0bWVtICkKKwkJZXh0bWVtID0gZXh0bWVtc2l6ZV84OCgpOworCXJldHVybiBleHRtZW07Cit9CisKKy8qKgorICogR2V0IGU4MjAgbWVtb3J5IG1hcAorICoKKyAqIEB2IG1lbW1hcAkJTWVtb3J5IG1hcCB0byBmaWxsIGluCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBtZW1lODIwICggc3RydWN0IG1lbW9yeV9tYXAgKm1lbW1hcCApIHsKKwlzdHJ1Y3QgbWVtb3J5X3JlZ2lvbiAqcmVnaW9uID0gbWVtbWFwLT5yZWdpb25zOworCXVpbnQzMl90IG5leHQgPSAwOworCXVpbnQzMl90IHNtYXA7CisJc2l6ZV90IHNpemU7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBkaXNjYXJkX0Q7CisKKwkvKiBDbGVhciB0aGUgRTgyMCBidWZmZXIuICBEbyB0aGlzIG9uY2UgYmVmb3JlIHN0YXJ0aW5nLAorCSAqIHJhdGhlciB0aGFuIG9uIGVhY2ggY2FsbDsgc29tZSBCSU9TZXMgcmVseSBvbiB0aGUgY29udGVudHMKKwkgKiBiZWluZyBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscy4KKwkgKi8KKwltZW1zZXQgKCAmZTgyMGJ1ZiwgMCwgc2l6ZW9mICggZTgyMGJ1ZiApICk7CisKKwlkbyB7CisJCS8qIFNvbWUgQklPU2VzIGNvcnJ1cHQgJWVzaSBmb3IgZnVuLiBHdWFyZCBhZ2FpbnN0CisJCSAqIHRoaXMgYnkgdGVsbGluZyBnY2MgdGhhdCBhbGwgbm9uLW91dHB1dCByZWdpc3RlcnMKKwkJICogbWF5IGJlIGNvcnJ1cHRlZC4KKwkJICovCisJCV9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggInB1c2hsICUlZWJwXG5cdCIKKwkJCQkJCSAgICJzdGNcblx0IgorCQkJCQkJICAgImludCAkMHgxNVxuXHQiCisJCQkJCQkgICAicHVzaGZ3XG5cdCIKKwkJCQkJCSAgICJwb3B3ICUlZHhcblx0IgorCQkJCQkJICAgInBvcGwgJSVlYnBcblx0IiApCisJCQkJICAgICAgIDogIj1hIiAoIHNtYXAgKSwgIj1iIiAoIG5leHQgKSwKKwkJCQkJICI9YyIgKCBzaXplICksICI9ZCIgKCBmbGFncyApLAorCQkJCQkgIj1EIiAoIGRpc2NhcmRfRCApCisJCQkJICAgICAgIDogImEiICggMHhlODIwICksICJiIiAoIG5leHQgKSwKKwkJCQkJICJEIiAoIF9fZnJvbV9kYXRhMTYgKCAmZTgyMGJ1ZiApICksCisJCQkJCSAiYyIgKCBzaXplb2YgKCBlODIwYnVmICkgKSwKKwkJCQkJICJkIiAoIFNNQVAgKQorCQkJCSAgICAgICA6ICJlc2kiLCAibWVtb3J5IiApOworCisJCWlmICggc21hcCAhPSBTTUFQICkgeworCQkJREJHICggIklOVCAxNSxlODIwIGZhaWxlZCBTTUFQIHNpZ25hdHVyZSBjaGVja1xuIiApOworCQkJcmV0dXJuIC1FTk9UU1VQOworCQl9CisKKwkJaWYgKCBzaXplIDwgRTgyMF9NSU5fU0laRSApIHsKKwkJCURCRyAoICJJTlQgMTUsZTgyMCByZXR1cm5lZCBvbmx5ICV6ZCBieXRlc1xuIiwgc2l6ZSApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoIGZsYWdzICYgQ0YgKSB7CisJCQlEQkcgKCAiSU5UIDE1LGU4MjAgdGVybWluYXRlZCBvbiBDRiBzZXRcbiIgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSWYgZmlyc3QgcmVnaW9uIGlzIG5vdCBSQU0sIGFzc3VtZSBtYXAgaXMgaW52YWxpZCAqLworCQlpZiAoICggbWVtbWFwLT5jb3VudCA9PSAwICkgJiYKKwkJICAgICAoIGU4MjBidWYudHlwZSAhPSBFODIwX1RZUEVfUkFNICkgKSB7CisJCSAgICAgICBEQkcgKCAiSU5UIDE1LGU4MjAgZmFpbGVkLCBmaXJzdCBlbnRyeSBub3QgUkFNXG4iICk7CisJCSAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCURCRyAoICJJTlQgMTUsZTgyMCByZWdpb24gWyVsbHgsJWxseCkgdHlwZSAlZCIsCisJCSAgICAgIGU4MjBidWYuc3RhcnQsICggZTgyMGJ1Zi5zdGFydCArIGU4MjBidWYubGVuICksCisJCSAgICAgICggaW50ICkgZTgyMGJ1Zi50eXBlICk7CisJCWlmICggc2l6ZSA+IG9mZnNldG9mICggdHlwZW9mICggZTgyMGJ1ZiApLCBhdHRycyApICkgeworCQkJREJHICggIiAoJXMiLCAoICggZTgyMGJ1Zi5hdHRycyAmIEU4MjBfQVRUUl9FTkFCTEVEICkKKwkJCQkJPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiICkgKTsKKwkJCWlmICggZTgyMGJ1Zi5hdHRycyAmIEU4MjBfQVRUUl9OT05WT0xBVElMRSApCisJCQkJREJHICggIiwgbm9uLXZvbGF0aWxlIiApOworCQkJaWYgKCBlODIwYnVmLmF0dHJzICYgRTgyMF9BVFRSX1VOS05PV04gKQorCQkJCURCRyAoICIsIG90aGVyIFslMDh4XSIsIGU4MjBidWYuYXR0cnMgKTsKKwkJCURCRyAoICIpIiApOworCQl9CisJCURCRyAoICJcbiIgKTsKKworCQkvKiBEaXNjYXJkIG5vbi1SQU0gcmVnaW9ucyAqLworCQlpZiAoIGU4MjBidWYudHlwZSAhPSBFODIwX1RZUEVfUkFNICkKKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIGV4dGVuZGVkIGF0dHJpYnV0ZXMsIGlmIHByZXNlbnQgKi8KKwkJaWYgKCBzaXplID4gb2Zmc2V0b2YgKCB0eXBlb2YgKCBlODIwYnVmICksIGF0dHJzICkgKSB7CisJCQlpZiAoICEgKCBlODIwYnVmLmF0dHJzICYgRTgyMF9BVFRSX0VOQUJMRUQgKSApCisJCQkJY29udGludWU7CisJCQlpZiAoIGU4MjBidWYuYXR0cnMgJiBFODIwX0FUVFJfTk9OVk9MQVRJTEUgKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJcmVnaW9uLT5zdGFydCA9IGU4MjBidWYuc3RhcnQ7CisJCXJlZ2lvbi0+ZW5kID0gZTgyMGJ1Zi5zdGFydCArIGU4MjBidWYubGVuOworCQlyZWdpb24rKzsKKwkJbWVtbWFwLT5jb3VudCsrOworCisJCWlmICggbWVtbWFwLT5jb3VudCA+PSAoIHNpemVvZiAoIG1lbW1hcC0+cmVnaW9ucyApIC8KKwkJCQkJc2l6ZW9mICggbWVtbWFwLT5yZWdpb25zWzBdICkgKSApIHsKKwkJCURCRyAoICJJTlQgMTUsZTgyMCB0b28gbWFueSByZWdpb25zIHJldHVybmVkXG4iICk7CisJCQkvKiBOb3QgYSBmYXRhbCBlcnJvcjsgd2hhdCB3ZSd2ZSBnb3Qgc28gZmFyIGF0CisJCQkgKiBsZWFzdCByZXByZXNlbnRzIHZhbGlkIHJlZ2lvbnMgb2YgbWVtb3J5LAorCQkJICogZXZlbiBpZiB3ZSBjb3VsZG4ndCBnZXQgdGhlbSBhbGwuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoIG5leHQgIT0gMCApOworCisJLyogU2FuaXR5IGNoZWNrcy4gIFNvbWUgQklPU2VzIHJlcG9ydCBjb21wbGV0ZSBnYXJiYWdlIHZpYSBJTlQKKwkgKiAxNSxlODIwIChlc3BlY2lhbGx5IGF0IFBPU1QgdGltZSksIGRlc3BpdGUgcGFzc2luZyB0aGUKKwkgKiBzaWduYXR1cmUgY2hlY2tzLiAgV2UgY3VycmVudGx5IGNoZWNrIGZvciBhIGJhc2UgbWVtb3J5CisJICogcmVnaW9uIChzdGFydGluZyBhdCAwKSBhbmQgYXQgbGVhc3Qgb25lIGhpZ2ggbWVtb3J5IHJlZ2lvbgorCSAqIChzdGFydGluZyBhdCAweDEwMDAwMCkuCisJICovCisJaWYgKCBtZW1tYXAtPmNvdW50IDwgMiApIHsKKwkJREJHICggIklOVCAxNSxlODIwIHJldHVybmVkIG9ubHkgJWQgcmVnaW9uczsgYXNzdW1pbmcgIgorCQkgICAgICAiaW5zYW5lXG4iLCBtZW1tYXAtPmNvdW50ICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIG1lbW1hcC0+cmVnaW9uc1swXS5zdGFydCAhPSAwICkgeworCQlEQkcgKCAiSU5UIDE1LGU4MjAgcmVnaW9uIDAgc3RhcnRzIGF0ICVsbHggKGV4cGVjdGVkIDApOyAiCisJCSAgICAgICJhc3N1bWluZyBpbnNhbmVcbiIsIG1lbW1hcC0+cmVnaW9uc1swXS5zdGFydCApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCBtZW1tYXAtPnJlZ2lvbnNbMV0uc3RhcnQgIT0gMHgxMDAwMDAgKSB7CisJCURCRyAoICJJTlQgMTUsZTgyMCByZWdpb24gMSBzdGFydHMgYXQgJWxseCAoZXhwZWN0ZWQgMTAwMDAwKTsgIgorCQkgICAgICAiYXNzdW1pbmcgaW5zYW5lXG4iLCBtZW1tYXAtPnJlZ2lvbnNbMF0uc3RhcnQgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogR2V0IG1lbW9yeSBtYXAKKyAqCisgKiBAdiBtZW1tYXAJCU1lbW9yeSBtYXAgdG8gZmlsbCBpbgorICovCit2b2lkIGdldF9tZW1tYXAgKCBzdHJ1Y3QgbWVtb3J5X21hcCAqbWVtbWFwICkgeworCXVuc2lnbmVkIGludCBiYXNlbWVtLCBleHRtZW07CisJaW50IHJjOworCisJREJHICggIkZldGNoaW5nIHN5c3RlbSBtZW1vcnkgbWFwXG4iICk7CisKKwkvKiBDbGVhciBtZW1vcnkgbWFwICovCisJbWVtc2V0ICggbWVtbWFwLCAwLCBzaXplb2YgKCAqbWVtbWFwICkgKTsKKworCS8qIEdldCBiYXNlIGFuZCBleHRlbmRlZCBtZW1vcnkgc2l6ZXMgKi8KKwliYXNlbWVtID0gYmFzZW1lbXNpemUoKTsKKwlEQkcgKCAiRkJNUyBiYXNlIG1lbW9yeSBzaXplICVkIGtCIFswLCV4KVxuIiwKKwkgICAgICBiYXNlbWVtLCAoIGJhc2VtZW0gKiAxMDI0ICkgKTsKKwlleHRtZW0gPSBleHRtZW1zaXplKCk7CisJCisJLyogVHJ5IElOVCAxNSxlODIwIGZpcnN0ICovCisJaWYgKCAoIHJjID0gbWVtZTgyMCAoIG1lbW1hcCApICkgPT0gMCApIHsKKwkJREJHICggIk9idGFpbmVkIHN5c3RlbSBtZW1vcnkgbWFwIHZpYSBJTlQgMTUsZTgyMFxuIiApOworCQlyZXR1cm47CisJfQorCisJLyogRmFsbCBiYWNrIHRvIGNvbnN0cnVjdGluZyBhIG1hcCBmcm9tIGJhc2VtZW0gYW5kIGV4dG1lbSBzaXplcyAqLworCURCRyAoICJJTlQgMTUsZTgyMCBmYWlsZWQ7IGNvbnN0cnVjdGluZyBtYXBcbiIgKTsKKwltZW1tYXAtPnJlZ2lvbnNbMF0uZW5kID0gKCBiYXNlbWVtICogMTAyNCApOworCW1lbW1hcC0+cmVnaW9uc1sxXS5zdGFydCA9IDB4MTAwMDAwOworCW1lbW1hcC0+cmVnaW9uc1sxXS5lbmQgPSAweDEwMDAwMCArICggZXh0bWVtICogMTAyNCApOworCW1lbW1hcC0+Y291bnQgPSAyOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9wbnBiaW9zLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvZmlybXdhcmUvcGNiaW9zL3BucGJpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTcyOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2Zpcm13YXJlL3BjYmlvcy9wbnBiaW9zLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8cG5wYmlvcy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBQblAgQklPUworICoKKyAqLworCisvKiogUG5QIEJJT1Mgc3RydWN0dXJlICovCitzdHJ1Y3QgcG5wX2Jpb3MgeworCS8qKiBTaWduYXR1cmUKKwkgKgorCSAqIE11c3QgYmUgZXF1YWwgdG8gQGMgUE5QX0JJT1NfU0lHTkFUVVJFCisJICovCisJdWludDMyX3Qgc2lnbmF0dXJlOworCS8qKiBWZXJzaW9uIGFzIEJDRCAoZS5nLiAxLjAgaXMgMHgxMCkgKi8KKwl1aW50OF90IHZlcnNpb247CisJLyoqIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZSAqLworCXVpbnQ4X3QgbGVuZ3RoOworCS8qKiBTeXN0ZW0gY2FwYWJpbGl0aWVzICovCisJdWludDE2X3QgY29udHJvbDsKKwkvKiogQ2hlY2tzdW0gKi8KKwl1aW50OF90IGNoZWNrc3VtOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFNpZ25hdHVyZSBmb3IgYSBQblAgQklPUyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUE5QX0JJT1NfU0lHTkFUVVJFIFwKKwkoICggJyQnIDw8IDAgKSArICggJ1AnIDw8IDggKSArICggJ24nIDw8IDE2ICkgKyAoICdQJyA8PCAyNCApICkKKworLyoqCisgKiBUZXN0IGFkZHJlc3MgZm9yIFBuUCBCSU9TIHN0cnVjdHVyZQorICoKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IHdpdGhpbiBCSU9TIHNlZ21lbnQgdG8gdGVzdAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNfcG5wX2Jpb3MgKCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICkgeworCXVuaW9uIHsKKwkJc3RydWN0IHBucF9iaW9zIHBucF9iaW9zOworCQl1aW50OF90IGJ5dGVzWzI1Nl07IC8qIDI1NiBpcyBtYXhpbXVtIGxlbmd0aCBwb3NzaWJsZSAqLworCX0gdTsKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGludCBpOworCXVpbnQ4X3Qgc3VtID0gMDsKKworCS8qIFJlYWQgc3RhcnQgb2YgaGVhZGVyIGFuZCB2ZXJpZnkgc2lnbmF0dXJlICovCisJY29weV9mcm9tX3JlYWwgKCAmdS5wbnBfYmlvcywgQklPU19TRUcsIG9mZnNldCwgc2l6ZW9mICggdS5wbnBfYmlvcyApKTsKKwlpZiAoIHUucG5wX2Jpb3Muc2lnbmF0dXJlICE9IFBOUF9CSU9TX1NJR05BVFVSRSApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUmVhZCB3aG9sZSBoZWFkZXIgYW5kIHZlcmlmeSBjaGVja3N1bSAqLworCWxlbiA9IHUucG5wX2Jpb3MubGVuZ3RoOworCWNvcHlfZnJvbV9yZWFsICggJnUuYnl0ZXMsIEJJT1NfU0VHLCBvZmZzZXQsIGxlbiApOworCWZvciAoIGkgPSAwIDsgaSA8IGxlbiA7IGkrKyApIHsKKwkJc3VtICs9IHUuYnl0ZXNbaV07CisJfQorCWlmICggc3VtICE9IDAgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURCRyAoICJGb3VuZCBQblAgQklPUyBhdCAlMDR4OiUwNHhcbiIsIEJJT1NfU0VHLCBvZmZzZXQgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIExvY2F0ZSBQbHVnLWFuZC1QbGF5IEJJT1MKKyAqCisgKiBAcmV0IHBucF9vZmZzZXQJT2Zmc2V0IG9mIFBuUCBCSU9TIHN0cnVjdHVyZSB3aXRoaW4gQklPUyBzZWdtZW50CisgKgorICogVGhlIFBuUCBCSU9TIHN0cnVjdHVyZSB3aWxsIGJlIGF0IEJJT1NfU0VHOnBucF9vZmZzZXQuICBJZiBubyBQblAKKyAqIEJJT1MgaXMgZm91bmQsIC0xIGlzIHJldHVybmVkLgorICovCitpbnQgZmluZF9wbnBfYmlvcyAoIHZvaWQgKSB7CisJc3RhdGljIGludCBwbnBfb2Zmc2V0ID0gMDsKKworCWlmICggcG5wX29mZnNldCApCisJCXJldHVybiBwbnBfb2Zmc2V0OworCisJZm9yICggcG5wX29mZnNldCA9IDAgOyBwbnBfb2Zmc2V0IDwgMHgxMDAwMCA7IHBucF9vZmZzZXQgKz0gMHgxMCApIHsKKwkJaWYgKCBpc19wbnBfYmlvcyAoIHBucF9vZmZzZXQgKSA9PSAwICkKKwkJCXJldHVybiBwbnBfb2Zmc2V0OworCX0KKworCXBucF9vZmZzZXQgPSAtMTsKKwlyZXR1cm4gcG5wX29mZnNldDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9oY2kvY29tbWFuZHMvcHhlX2NtZC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2hjaS9jb21tYW5kcy9weGVfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkZjJkMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9oY2kvY29tbWFuZHMvcHhlX2NtZC5jCkBAIC0wLDAgKzEsMzMgQEAKKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvY29tbWFuZC5oPgorI2luY2x1ZGUgPGhjaS9pZm1nbXRfY21kLmg+CisjaW5jbHVkZSA8cHhlX2NhbGwuaD4KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitzdGF0aWMgaW50IHN0YXJ0cHhlX3BheWxvYWQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCWlmICggbmV0ZGV2LT5zdGF0ZSAmIE5FVERFVl9PUEVOICkKKwkJcHhlX2FjdGl2YXRlICggbmV0ZGV2ICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRweGVfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlyZXR1cm4gaWZjb21tb25fZXhlYyAoIGFyZ2MsIGFyZ3YsIHN0YXJ0cHhlX3BheWxvYWQsCisJCQkgICAgICAgIkFjdGl2YXRlIFBYRSBvbiIgKTsKK30KKworc3RhdGljIGludCBzdG9wcHhlX2V4ZWMgKCBpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YgX191bnVzZWQgKSB7CisJcHhlX2RlYWN0aXZhdGUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNvbW1hbmQgcHhlX2NvbW1hbmRzW10gX19jb21tYW5kID0geworCXsKKwkJLm5hbWUgPSAic3RhcnRweGUiLAorCQkuZXhlYyA9IHN0YXJ0cHhlX2V4ZWMsCisJfSwKKwl7CisJCS5uYW1lID0gInN0b3BweGUiLAorCQkuZXhlYyA9IHN0b3BweGVfZXhlYywKKwl9LAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9ib290c2VjdG9yLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvYm9vdHNlY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NmNmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvYm9vdHNlY3Rvci5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEBmaWxlCisgKgorICogeDg2IGJvb3RzZWN0b3IgaW1hZ2UgZm9ybWF0CisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Ymlvc2ludC5oPgorI2luY2x1ZGUgPGJvb3RzZWN0b3IuaD4KKworLyoqIFZlY3RvciBmb3Igc3RvcmluZyBvcmlnaW5hbCBJTlQgMTggaGFuZGxlcgorICoKKyAqIFdlIGRvIG5vdCBjaGFpbiB0byB0aGlzIHZlY3Rvciwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwbGFjZSBpdCBpbgorICogLnRleHQxNi4KKyAqLworc3RhdGljIHN0cnVjdCBzZWdvZmYgaW50MThfdmVjdG9yOworCisvKiogVmVjdG9yIGZvciBzdG9yaW5nIG9yaWdpbmFsIElOVCAxOSBoYW5kbGVyCisgKgorICogV2UgZG8gbm90IGNoYWluIHRvIHRoaXMgdmVjdG9yLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHBsYWNlIGl0IGluCisgKiAudGV4dDE2LgorICovCitzdGF0aWMgc3RydWN0IHNlZ29mZiBpbnQxOV92ZWN0b3I7CisKKy8qKiBSZXN0YXJ0IHBvaW50IGZvciBJTlQgMTggb3IgMTkgKi8KK2V4dGVybiB2b2lkIGJvb3RzZWN0b3JfZXhlY19mYWlsICggdm9pZCApOworCisvKioKKyAqIEp1bXAgdG8gcHJlbG9hZGVkIGJvb3RzZWN0b3IKKyAqCisgKiBAdiBzZWdtZW50CQlSZWFsLW1vZGUgc2VnbWVudAorICogQHYgb2Zmc2V0CQlSZWFsLW1vZGUgb2Zmc2V0CisgKiBAdiBkcml2ZQkJRHJpdmUgbnVtYmVyIHRvIHBhc3MgdG8gYm9vdCBzZWN0b3IKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgY2FsbF9ib290c2VjdG9yICggdW5zaWduZWQgaW50IHNlZ21lbnQsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSAgICAgIHVuc2lnbmVkIGludCBkcml2ZSApIHsKKwlpbnQgZGlzY2FyZF9iLCBkaXNjYXJkX0QsIGRpc2NhcmRfZDsKKworCURCRyAoICJCb290aW5nIGZyb20gYm9vdCBzZWN0b3IgYXQgJTA0eDolMDR4XG4iLCBzZWdtZW50LCBvZmZzZXQgKTsKKworCS8qIEhvb2sgSU5UcyAxOCBhbmQgMTkgdG8gY2FwdHVyZSBmYWlsdXJlIHBhdGhzICovCisJaG9va19iaW9zX2ludGVycnVwdCAoIDB4MTgsICggdW5zaWduZWQgaW50ICkgYm9vdHNlY3Rvcl9leGVjX2ZhaWwsCisJCQkgICAgICAmaW50MThfdmVjdG9yICk7CisJaG9va19iaW9zX2ludGVycnVwdCAoIDB4MTksICggdW5zaWduZWQgaW50ICkgYm9vdHNlY3Rvcl9leGVjX2ZhaWwsCisJCQkgICAgICAmaW50MTlfdmVjdG9yICk7CisKKwkvKiBCb290IHRoZSBsb2FkZWQgc2VjdG9yCisJICoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgYm9vdCBzZWN0b3IgbWF5IGNvbXBsZXRlbHkgZGVzdHJveSBvdXIKKwkgKiByZWFsLW1vZGUgc3RhY2ssIHNvIHdlIHByZXNlcnZlIGV2ZXJ5dGhpbmcgd2UgbmVlZCBpbgorCSAqIHN0YXRpYyBzdG9yYWdlLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggLyogU2F2ZSByZXR1cm4gYWRkcmVzcyBvZmYtc3RhY2sgKi8KKwkJCQkJICAgInBvcHcgJSVjczpzYXZlZF9yZXRhZGRyXG5cdCIKKwkJCQkJICAgLyogU2F2ZSBzdGFjayBwb2ludGVyICovCisJCQkJCSAgICJtb3Z3ICUlc3MsICUlYXhcblx0IgorCQkJCQkgICAibW92dyAlJWF4LCAlJWNzOnNhdmVkX3NzXG5cdCIKKwkJCQkJICAgIm1vdncgJSVzcCwgJSVjczpzYXZlZF9zcFxuXHQiCisJCQkJCSAgIC8qIEp1bXAgdG8gYm9vdCBzZWN0b3IgKi8KKwkJCQkJICAgInB1c2h3ICUlYnhcblx0IgorCQkJCQkgICAicHVzaHcgJSVkaVxuXHQiCisJCQkJCSAgICJzdGlcblx0IgorCQkJCQkgICAibHJldFxuXHQiCisJCQkJCSAgIC8qIFByZXNlcnZlZCB2YXJpYWJsZXMgKi8KKwkJCQkJICAgIlxuc2F2ZWRfc3M6IC53b3JkIDBcblx0IgorCQkJCQkgICAiXG5zYXZlZF9zcDogLndvcmQgMFxuXHQiCisJCQkJCSAgICJcbnNhdmVkX3JldGFkZHI6IC53b3JkIDBcblx0IgorCQkJCQkgICAvKiBCb290IGZhaWx1cmUgcmV0dXJuIHBvaW50ICovCisJCQkJCSAgICJcbmJvb3RzZWN0b3JfZXhlY19mYWlsOlxuXHQiCisJCQkJCSAgIC8qIFJlc3RvcmUgc3RhY2sgcG9pbnRlciAqLworCQkJCQkgICAibW92dyAlJWNzOnNhdmVkX3NzLCAlJWF4XG5cdCIKKwkJCQkJICAgIm1vdncgJSVheCwgJSVzc1xuXHQiCisJCQkJCSAgICJtb3Z3ICUlY3M6c2F2ZWRfc3AsICUlc3Bcblx0IgorCQkJCQkgICAvKiBSZXR1cm4gdmlhIHNhdmVkIGFkZHJlc3MgKi8KKwkJCQkJICAgImptcCAqJSVjczpzYXZlZF9yZXRhZGRyXG5cdCIgKQorCQkJICAgICAgIDogIj1iIiAoIGRpc2NhcmRfYiApLCAiPUQiICggZGlzY2FyZF9EICksCisJCQkgICAgICAgICAiPWQiICggZGlzY2FyZF9kICkKKwkJCSAgICAgICA6ICJiIiAoIHNlZ21lbnQgKSwgIkQiICggb2Zmc2V0ICksCisJCQkgICAgICAgICAiZCIgKCBkcml2ZSApCisJCQkgICAgICAgOiAiZWF4IiwgImVjeCIsICJlc2kiLCAiZWJwIiApOworCisJREJHICggIkJvb3RlZCBkaXNrIHJldHVybmVkIHZpYSBJTlQgMTggb3IgMTlcbiIgKTsKKworCS8qIFVuaG9vayBJTlRzIDE4IGFuZCAxOSAqLworCXVuaG9va19iaW9zX2ludGVycnVwdCAoIDB4MTgsICggdW5zaWduZWQgaW50ICkgYm9vdHNlY3Rvcl9leGVjX2ZhaWwsCisJCQkJJmludDE4X3ZlY3RvciApOworCXVuaG9va19iaW9zX2ludGVycnVwdCAoIDB4MTksICggdW5zaWduZWQgaW50ICkgYm9vdHNlY3Rvcl9leGVjX2ZhaWwsCisJCQkJJmludDE5X3ZlY3RvciApOworCQorCXJldHVybiAtRUNBTkNFTEVEOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ltYWdlL2J6aW1hZ2UuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9iemltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0NTA5OQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9iemltYWdlLmMKQEAgLTAsMCArMSw1NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBMaW51eCBiekltYWdlIGltYWdlIGZvcm1hdAorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxyZWFsbW9kZS5oPgorI2luY2x1ZGUgPGJ6aW1hZ2UuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2ltYWdlLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pbml0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9jcGlvLmg+CisjaW5jbHVkZSA8Z3B4ZS9mZWF0dXJlcy5oPgorCitGRUFUVVJFICggRkVBVFVSRV9JTUFHRSwgImJ6SW1hZ2UiLCBESENQX0VCX0ZFQVRVUkVfQlpJTUFHRSwgMSApOworCitzdHJ1Y3QgaW1hZ2VfdHlwZSBiemltYWdlX2ltYWdlX3R5cGUgX19pbWFnZV90eXBlICggUFJPQkVfTk9STUFMICk7CisKKy8qKgorICogYnpJbWFnZSBjb250ZXh0CisgKi8KK3N0cnVjdCBiemltYWdlX2NvbnRleHQgeworCS8qKiBCb290IHByb3RvY29sIHZlcnNpb24gKi8KKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKwkvKiogUmVhbC1tb2RlIGtlcm5lbCBwb3J0aW9uIGxvYWQgc2VnbWVudCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IHJtX2tlcm5lbF9zZWc7CisJLyoqIFJlYWwtbW9kZSBrZXJuZWwgcG9ydGlvbiBsb2FkIGFkZHJlc3MgKi8KKwl1c2VycHRyX3Qgcm1fa2VybmVsOworCS8qKiBSZWFsLW1vZGUga2VybmVsIHBvcnRpb24gZmlsZSBzaXplICovCisJc2l6ZV90IHJtX2ZpbGVzejsKKwkvKiogUmVhbC1tb2RlIGhlYXAgdG9wIChvZmZzZXQgZnJvbSBybV9rZXJuZWwpICovCisJc2l6ZV90IHJtX2hlYXA7CisJLyoqIENvbW1hbmQgbGluZSAob2Zmc2V0IGZyb20gcm1fa2VybmVsKSAqLworCXNpemVfdCBybV9jbWRsaW5lOworCS8qKiBDb21tYW5kIGxpbmUgbWF4aW11bSBsZW5ndGggKi8KKwlzaXplX3QgY21kbGluZV9zaXplOworCS8qKiBSZWFsLW1vZGUga2VybmVsIHBvcnRpb24gdG90YWwgbWVtb3J5IHNpemUgKi8KKwlzaXplX3Qgcm1fbWVtc3o7CisJLyoqIE5vbi1yZWFsLW1vZGUga2VybmVsIHBvcnRpb24gbG9hZCBhZGRyZXNzICovCisJdXNlcnB0cl90IHBtX2tlcm5lbDsKKwkvKiogTm9uLXJlYWwtbW9kZSBrZXJuZWwgcG9ydGlvbiBmaWxlIGFuZCBtZW1vcnkgc2l6ZSAqLworCXNpemVfdCBwbV9zejsKKwkvKiogVmlkZW8gbW9kZSAqLworCXVuc2lnbmVkIGludCB2aWRfbW9kZTsKKwkvKiogTWVtb3J5IGxpbWl0ICovCisJdWludDY0X3QgbWVtX2xpbWl0OworCS8qKiBJbml0cmQgYWRkcmVzcyAqLworCXBoeXNhZGRyX3QgcmFtZGlza19pbWFnZTsKKwkvKiogSW5pdHJkIHNpemUgKi8KKwlwaHlzYWRkcl90IHJhbWRpc2tfc2l6ZTsKKworCS8qKiBDb21tYW5kIGxpbmUgbWFnaWMgYmxvY2sgKi8KKwlzdHJ1Y3QgYnppbWFnZV9jbWRsaW5lIGNtZGxpbmVfbWFnaWM7CisJLyoqIGJ6SW1hZ2UgaGVhZGVyICovCisJc3RydWN0IGJ6aW1hZ2VfaGVhZGVyIGJ6aGRyOworfTsKKworLyoqCisgKiBQYXJzZSBiekltYWdlIGhlYWRlcgorICoKKyAqIEB2IGltYWdlCQliekltYWdlIGZpbGUKKyAqIEB2IGJ6aW1nCQliekltYWdlIGNvbnRleHQKKyAqIEB2IHNyYwkJYnpJbWFnZSB0byBwYXJzZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYnppbWFnZV9wYXJzZV9oZWFkZXIgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLAorCQkJCSAgc3RydWN0IGJ6aW1hZ2VfY29udGV4dCAqYnppbWcsCisJCQkJICB1c2VycHRyX3Qgc3JjICkgeworCXVuc2lnbmVkIGludCBzeXNzaXplOworCWludCBpc19iemltYWdlOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCBpbWFnZS0+bGVuIDwgKCBCWklfSERSX09GRlNFVCArIHNpemVvZiAoIGJ6aW1nLT5iemhkciApICkgKSB7CisJCURCR0MgKCBpbWFnZSwgImJ6SW1hZ2UgJXAgdG9vIHNob3J0IGZvciBrZXJuZWwgaGVhZGVyXG4iLAorCQkgICAgICAgaW1hZ2UgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCS8qIFJlYWQgaW4gaGVhZGVyIHN0cnVjdHVyZXMgKi8KKwltZW1zZXQgKCBiemltZywgMCwgc2l6ZW9mICggKmJ6aW1nICkgKTsKKwljb3B5X2Zyb21fdXNlciAoICZiemltZy0+Y21kbGluZV9tYWdpYywgc3JjLCBCWklfQ01ETElORV9PRkZTRVQsCisJCQkgc2l6ZW9mICggYnppbWctPmNtZGxpbmVfbWFnaWMgKSApOworCWNvcHlfZnJvbV91c2VyICggJmJ6aW1nLT5iemhkciwgc3JjLCBCWklfSERSX09GRlNFVCwKKwkJCSBzaXplb2YgKCBiemltZy0+YnpoZHIgKSApOworCisJLyogQ2FsY3VsYXRlIHNpemUgb2YgcmVhbC1tb2RlIHBvcnRpb24gKi8KKwliemltZy0+cm1fZmlsZXN6ID0KKwkJKCAoIGJ6aW1nLT5iemhkci5zZXR1cF9zZWN0cyA/IGJ6aW1nLT5iemhkci5zZXR1cF9zZWN0cyA6IDQgKSArIDEgKSA8PCA5OworCWlmICggYnppbWctPnJtX2ZpbGVzeiA+IGltYWdlLT5sZW4gKSB7CisJCURCR0MgKCBpbWFnZSwgImJ6SW1hZ2UgJXAgdG9vIHNob3J0IGZvciAlemQgYnl0ZSBvZiBzZXR1cFxuIiwKKwkJICAgICAgIGltYWdlLCBiemltZy0+cm1fZmlsZXN6ICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisJYnppbWctPnJtX21lbXN6ID0gQlpJX0FTU1VNRURfUk1fU0laRTsKKworCS8qIENhbGN1bGF0ZSBzaXplIG9mIHByb3RlY3RlZC1tb2RlIHBvcnRpb24gKi8KKwliemltZy0+cG1fc3ogPSAoIGltYWdlLT5sZW4gLSBiemltZy0+cm1fZmlsZXN6ICk7CisJc3lzc2l6ZSA9ICggKCBiemltZy0+cG1fc3ogKyAxNSApIC8gMTYgKTsKKworCS8qIENoZWNrIGZvciBzaWduYXR1cmVzIGFuZCBkZXRlcm1pbmUgdmVyc2lvbiAqLworCWlmICggYnppbWctPmJ6aGRyLmJvb3RfZmxhZyAhPSBCWklfQk9PVF9GTEFHICkgeworCQlEQkdDICggaW1hZ2UsICJiekltYWdlICVwIG1pc3NpbmcgNTVBQSBzaWduYXR1cmVcbiIsIGltYWdlICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisJaWYgKCBiemltZy0+YnpoZHIuaGVhZGVyID09IEJaSV9TSUdOQVRVUkUgKSB7CisJCS8qIDIuMDArICovCisJCWJ6aW1nLT52ZXJzaW9uID0gYnppbWctPmJ6aGRyLnZlcnNpb247CisJfSBlbHNlIHsKKwkJLyogUHJlLTIuMDAuICBDaGVjayB0aGF0IHRoZSBzeXNzaXplIGZpZWxkIGlzIGNvcnJlY3QsCisJCSAqIGFzIGEgZ3VhcmQgYWdhaW5zdCBhY2NlcHRpbmcgYXJiaXRyYXJ5IGJpbmFyeSBkYXRhLAorCQkgKiBzaW5jZSB0aGUgNTVBQSBjaGVjayBpcyBwcmV0dHkgbGF4LiAgTm90ZSB0aGF0IHRoZQorCQkgKiBzeXNzaXplIGZpZWxkIGlzIHVucmVsaWFibGUgZm9yIHByb3RvY29scyBiZXR3ZWVuCisJCSAqIDIuMDAgYW5kIDIuMDMgaW5jbHVzaXZlLCBzbyB3ZSBzaG91bGQgbm90IGFsd2F5cworCQkgKiBjaGVjayB0aGlzIGZpZWxkLgorCQkgKi8KKwkJYnppbWctPnZlcnNpb24gPSAweDAxMDA7CisJCWlmICggYnppbWctPmJ6aGRyLnN5c3NpemUgIT0gc3lzc2l6ZSApIHsKKwkJCURCR0MgKCBpbWFnZSwgImJ6SW1hZ2UgJXAgYmFkIHN5c3NpemUgJXggKGV4cGVjdGVkICIKKwkJCSAgICAgICAiJXgpXG4iLCBpbWFnZSwgYnppbWctPmJ6aGRyLnN5c3NpemUsIHN5c3NpemUgKTsKKwkJCXJldHVybiAtRU5PRVhFQzsKKwkJfQorCX0KKworCS8qIERldGVybWluZSBpbWFnZSB0eXBlICovCisJaXNfYnppbWFnZSA9ICggKCBiemltZy0+dmVyc2lvbiA+PSAweDAyMDAgKSA/CisJCSAgICAgICAoIGJ6aW1nLT5iemhkci5sb2FkZmxhZ3MgJiBCWklfTE9BRF9ISUdIICkgOiAwICk7CisKKwkvKiBDYWxjdWxhdGUgbG9hZCBhZGRyZXNzIG9mIHJlYWwtbW9kZSBwb3J0aW9uICovCisJYnppbWctPnJtX2tlcm5lbF9zZWcgPSAoIGlzX2J6aW1hZ2UgPyAweDEwMDAgOiAweDkwMDAgKTsKKwliemltZy0+cm1fa2VybmVsID0gcmVhbF90b191c2VyICggYnppbWctPnJtX2tlcm5lbF9zZWcsIDAgKTsKKworCS8qIEFsbG93IHNwYWNlIGZvciB0aGUgc3RhY2sgYW5kIGhlYXAgKi8KKwliemltZy0+cm1fbWVtc3ogKz0gQlpJX1NUQUNLX1NJWkU7CisJYnppbWctPnJtX2hlYXAgPSBiemltZy0+cm1fbWVtc3o7CisKKwkvKiBBbGxvdyBzcGFjZSBmb3IgdGhlIGNvbW1hbmQgbGluZSAqLworCWJ6aW1nLT5ybV9jbWRsaW5lID0gYnppbWctPnJtX21lbXN6OworCWJ6aW1nLT5ybV9tZW1zeiArPSBCWklfQ01ETElORV9TSVpFOworCisJLyogQ2FsY3VsYXRlIGxvYWQgYWRkcmVzcyBvZiBwcm90ZWN0ZWQtbW9kZSBwb3J0aW9uICovCisJYnppbWctPnBtX2tlcm5lbCA9IHBoeXNfdG9fdXNlciAoIGlzX2J6aW1hZ2UgPyBCWklfTE9BRF9ISUdIX0FERFIKKwkJCQkJOiBCWklfTE9BRF9MT1dfQUREUiApOworCisJLyogRXh0cmFjdCB2aWRlbyBtb2RlICovCisJYnppbWctPnZpZF9tb2RlID0gYnppbWctPmJ6aGRyLnZpZF9tb2RlOworCisJLyogRXh0cmFjdCBtZW1vcnkgbGltaXQgKi8KKwliemltZy0+bWVtX2xpbWl0ID0gKCAoIGJ6aW1nLT52ZXJzaW9uID49IDB4MDIwMyApID8KKwkJCSAgICAgYnppbWctPmJ6aGRyLmluaXRyZF9hZGRyX21heCA6IEJaSV9JTklUUkRfTUFYICk7CisKKwkvKiBFeHRyYWN0IGNvbW1hbmQgbGluZSBzaXplICovCisJYnppbWctPmNtZGxpbmVfc2l6ZSA9ICggKCBiemltZy0+dmVyc2lvbiA+PSAweDAyMDYgKSA/CisJCQkJYnppbWctPmJ6aGRyLmNtZGxpbmVfc2l6ZSA6IEJaSV9DTURMSU5FX1NJWkUgKTsKKworCURCR0MgKCBpbWFnZSwgImJ6SW1hZ2UgJXAgdmVyc2lvbiAlMDR4IFJNICUjbHgrJSN6eCBQTSAlI2x4KyUjenggIgorCSAgICAgICAiY21kbGVuICV6ZFxuIiwgaW1hZ2UsIGJ6aW1nLT52ZXJzaW9uLAorCSAgICAgICB1c2VyX3RvX3BoeXMgKCBiemltZy0+cm1fa2VybmVsLCAwICksIGJ6aW1nLT5ybV9maWxlc3osCisJICAgICAgIHVzZXJfdG9fcGh5cyAoIGJ6aW1nLT5wbV9rZXJuZWwsIDAgKSwgYnppbWctPnBtX3N6LAorCSAgICAgICBiemltZy0+Y21kbGluZV9zaXplICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBVcGRhdGUgYnpJbWFnZSBoZWFkZXIgaW4gbG9hZGVkIGtlcm5lbAorICoKKyAqIEB2IGltYWdlCQliekltYWdlIGZpbGUKKyAqIEB2IGJ6aW1nCQliekltYWdlIGNvbnRleHQKKyAqIEB2IGRzdAkJYnpJbWFnZSB0byB1cGRhdGUKKyAqLworc3RhdGljIHZvaWQgYnppbWFnZV91cGRhdGVfaGVhZGVyICggc3RydWN0IGltYWdlICppbWFnZSwKKwkJCQkgICAgc3RydWN0IGJ6aW1hZ2VfY29udGV4dCAqYnppbWcsCisJCQkJICAgIHVzZXJwdHJfdCBkc3QgKSB7CisKKwkvKiBTZXQgbG9hZGVyIHR5cGUgKi8KKwlpZiAoIGJ6aW1nLT52ZXJzaW9uID49IDB4MDIwMCApCisJCWJ6aW1nLT5iemhkci50eXBlX29mX2xvYWRlciA9IEJaSV9MT0FERVJfVFlQRV9HUFhFOworCisJLyogU2V0IGhlYXAgZW5kIHBvaW50ZXIgKi8KKwlpZiAoIGJ6aW1nLT52ZXJzaW9uID49IDB4MDIwMSApIHsKKwkJYnppbWctPmJ6aGRyLmhlYXBfZW5kX3B0ciA9ICggYnppbWctPnJtX2hlYXAgLSAweDIwMCApOworCQliemltZy0+YnpoZHIubG9hZGZsYWdzIHw9IEJaSV9DQU5fVVNFX0hFQVA7CisJfQorCisJLyogU2V0IGNvbW1hbmQgbGluZSAqLworCWlmICggYnppbWctPnZlcnNpb24gPj0gMHgwMjAyICkgeworCQliemltZy0+YnpoZHIuY21kX2xpbmVfcHRyID0gdXNlcl90b19waHlzICggYnppbWctPnJtX2tlcm5lbCwKKwkJCQkJCQkgICBiemltZy0+cm1fY21kbGluZSApOworCX0gZWxzZSB7CisJCWJ6aW1nLT5jbWRsaW5lX21hZ2ljLm1hZ2ljID0gQlpJX0NNRExJTkVfTUFHSUM7CisJCWJ6aW1nLT5jbWRsaW5lX21hZ2ljLm9mZnNldCA9IGJ6aW1nLT5ybV9jbWRsaW5lOworCQliemltZy0+YnpoZHIuc2V0dXBfbW92ZV9zaXplID0gYnppbWctPnJtX21lbXN6OworCX0KKworCS8qIFNldCB2aWRlbyBtb2RlICovCisJYnppbWctPmJ6aGRyLnZpZF9tb2RlID0gYnppbWctPnZpZF9tb2RlOworCisJLyogU2V0IGluaXRyZCBhZGRyZXNzICovCisJaWYgKCBiemltZy0+dmVyc2lvbiA+PSAweDAyMDAgKSB7CisJCWJ6aW1nLT5iemhkci5yYW1kaXNrX2ltYWdlID0gYnppbWctPnJhbWRpc2tfaW1hZ2U7CisJCWJ6aW1nLT5iemhkci5yYW1kaXNrX3NpemUgPSBiemltZy0+cmFtZGlza19zaXplOworCX0KKworCS8qIFdyaXRlIG91dCBoZWFkZXIgc3RydWN0dXJlcyAqLworCWNvcHlfdG9fdXNlciAoIGRzdCwgQlpJX0NNRExJTkVfT0ZGU0VULCAmYnppbWctPmNtZGxpbmVfbWFnaWMsCisJCSAgICAgICBzaXplb2YgKCBiemltZy0+Y21kbGluZV9tYWdpYyApICk7CisJY29weV90b191c2VyICggZHN0LCBCWklfSERSX09GRlNFVCwgJmJ6aW1nLT5iemhkciwKKwkJICAgICAgIHNpemVvZiAoIGJ6aW1nLT5iemhkciApICk7CisKKwlEQkdDICggaW1hZ2UsICJiekltYWdlICVwIHZpZG1vZGUgJWRcbiIsIGltYWdlLCBiemltZy0+dmlkX21vZGUgKTsKK30KKworLyoqCisgKiBQYXJzZSBrZXJuZWwgY29tbWFuZCBsaW5lIGZvciBib290bG9hZGVyIHBhcmFtZXRlcnMKKyAqCisgKiBAdiBpbWFnZQkJYnpJbWFnZSBmaWxlCisgKiBAdiBiemltZwkJYnpJbWFnZSBjb250ZXh0CisgKiBAdiBjbWRsaW5lCQlLZXJuZWwgY29tbWFuZCBsaW5lCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBiemltYWdlX3BhcnNlX2NtZGxpbmUgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLAorCQkJCSAgIHN0cnVjdCBiemltYWdlX2NvbnRleHQgKmJ6aW1nLAorCQkJCSAgIGNvbnN0IGNoYXIgKmNtZGxpbmUgKSB7CisJY2hhciAqdmdhOworCWNoYXIgKm1lbTsKKworCS8qIExvb2sgZm9yICJ2Z2E9IiAqLworCWlmICggKCB2Z2EgPSBzdHJzdHIgKCBjbWRsaW5lLCAidmdhPSIgKSApICkgeworCQl2Z2EgKz0gNDsKKwkJaWYgKCBzdHJjbXAgKCB2Z2EsICJub3JtYWwiICkgPT0gMCApIHsKKwkJCWJ6aW1nLT52aWRfbW9kZSA9IEJaSV9WSURfTU9ERV9OT1JNQUw7CisJCX0gZWxzZSBpZiAoIHN0cmNtcCAoIHZnYSwgImV4dCIgKSA9PSAwICkgeworCQkJYnppbWctPnZpZF9tb2RlID0gQlpJX1ZJRF9NT0RFX0VYVDsKKwkJfSBlbHNlIGlmICggc3RyY21wICggdmdhLCAiYXNrIiApID09IDAgKSB7CisJCQliemltZy0+dmlkX21vZGUgPSBCWklfVklEX01PREVfQVNLOworCQl9IGVsc2UgeworCQkJYnppbWctPnZpZF9tb2RlID0gc3RydG91bCAoIHZnYSwgJnZnYSwgMCApOworCQkJaWYgKCAqdmdhICYmICggKnZnYSAhPSAnICcgKSApIHsKKwkJCQlEQkdDICggaW1hZ2UsICJiekltYWdlICVwIHN0cmFuZ2UgXCJ2Z2E9XCIiCisJCQkJICAgICAgICJ0ZXJtaW5hdG9yICclYydcbiIsIGltYWdlLCAqdmdhICk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBMb29rIGZvciAibWVtPSIgKi8KKwlpZiAoICggbWVtID0gc3Ryc3RyICggY21kbGluZSwgIm1lbT0iICkgKSApIHsKKwkJbWVtICs9IDQ7CisJCWJ6aW1nLT5tZW1fbGltaXQgPSBzdHJ0b3VsICggbWVtLCAmbWVtLCAwICk7CisJCXN3aXRjaCAoICptZW0gKSB7CisJCWNhc2UgJ0cnOgorCQljYXNlICdnJzoKKwkJCWJ6aW1nLT5tZW1fbGltaXQgPDw9IDEwOworCQljYXNlICdNJzoKKwkJY2FzZSAnbSc6CisJCQliemltZy0+bWVtX2xpbWl0IDw8PSAxMDsKKwkJY2FzZSAnSyc6CisJCWNhc2UgJ2snOgorCQkJYnppbWctPm1lbV9saW1pdCA8PD0gMTA7CisJCQlicmVhazsKKwkJY2FzZSAnXDAnOgorCQljYXNlICcgJzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHQyAoIGltYWdlLCAiYnpJbWFnZSAlcCBzdHJhbmdlIFwibWVtPVwiICIKKwkJCSAgICAgICAidGVybWluYXRvciAnJWMnXG4iLCBpbWFnZSwgKm1lbSApOworCQkJYnJlYWs7CisJCX0KKwkJYnppbWctPm1lbV9saW1pdCAtPSAxOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFNldCBjb21tYW5kIGxpbmUKKyAqCisgKiBAdiBpbWFnZQkJYnpJbWFnZSBpbWFnZQorICogQHYgYnppbWcJCWJ6SW1hZ2UgY29udGV4dAorICogQHYgY21kbGluZQkJS2VybmVsIGNvbW1hbmQgbGluZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYnppbWFnZV9zZXRfY21kbGluZSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsCisJCQkJIHN0cnVjdCBiemltYWdlX2NvbnRleHQgKmJ6aW1nLAorCQkJCSBjb25zdCBjaGFyICpjbWRsaW5lICkgeworCXNpemVfdCBjbWRsaW5lX2xlbjsKKworCS8qIENvcHkgY29tbWFuZCBsaW5lIGRvd24gdG8gcmVhbC1tb2RlIHBvcnRpb24gKi8KKwljbWRsaW5lX2xlbiA9ICggc3RybGVuICggY21kbGluZSApICsgMSApOworCWlmICggY21kbGluZV9sZW4gPiBiemltZy0+Y21kbGluZV9zaXplICkKKwkJY21kbGluZV9sZW4gPSBiemltZy0+Y21kbGluZV9zaXplOworCWNvcHlfdG9fdXNlciAoIGJ6aW1nLT5ybV9rZXJuZWwsIGJ6aW1nLT5ybV9jbWRsaW5lLAorCQkgICAgICAgY21kbGluZSwgY21kbGluZV9sZW4gKTsKKwlEQkdDICggaW1hZ2UsICJiekltYWdlICVwIGNvbW1hbmQgbGluZSBcIiVzXCJcbiIsIGltYWdlLCBjbWRsaW5lICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBMb2FkIGluaXRyZAorICoKKyAqIEB2IGltYWdlCQliekltYWdlIGltYWdlCisgKiBAdiBpbml0cmQJCWluaXRyZCBpbWFnZQorICogQHYgYWRkcmVzcwkJQWRkcmVzcyBhdCB3aGljaCB0byBsb2FkLCBvciBVTlVMTAorICogQHJldCBsZW4JCUxlbmd0aCBvZiBsb2FkZWQgaW1hZ2UsIHJvdW5kZWQgdXAgdG8gNCBieXRlcworICovCitzdGF0aWMgc2l6ZV90IGJ6aW1hZ2VfbG9hZF9pbml0cmQgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLAorCQkJCSAgICBzdHJ1Y3QgaW1hZ2UgKmluaXRyZCwKKwkJCQkgICAgdXNlcnB0cl90IGFkZHJlc3MgKSB7CisJY2hhciAqZmlsZW5hbWUgPSBpbml0cmQtPmNtZGxpbmU7CisJc3RydWN0IGNwaW9faGVhZGVyIGNwaW87CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworCisJLyogRG8gbm90IGluY2x1ZGUga2VybmVsIGltYWdlIGl0c2VsZiBhcyBhbiBpbml0cmQgKi8KKwlpZiAoIGluaXRyZCA9PSBpbWFnZSApCisJCXJldHVybiAwOworCisJLyogQ3JlYXRlIGNwaW8gaGVhZGVyIGJlZm9yZSBub24tcHJlYnVpbHQgaW1hZ2VzICovCisJaWYgKCBmaWxlbmFtZSAmJiBmaWxlbmFtZVswXSApIHsKKwkJc2l6ZV90IG5hbWVfbGVuID0gKCBzdHJsZW4gKCBmaWxlbmFtZSApICsgMSApOworCisJCURCR0MgKCBpbWFnZSwgImJ6SW1hZ2UgJXAgaW5zZXJ0aW5nIGluaXRyZCAlcCBhcyAlc1xuIiwKKwkJICAgICAgIGltYWdlLCBpbml0cmQsIGZpbGVuYW1lICk7CisJCW1lbXNldCAoICZjcGlvLCAnMCcsIHNpemVvZiAoIGNwaW8gKSApOworCQltZW1jcHkgKCBjcGlvLmNfbWFnaWMsIENQSU9fTUFHSUMsIHNpemVvZiAoIGNwaW8uY19tYWdpYyApICk7CisJCWNwaW9fc2V0X2ZpZWxkICggY3Bpby5jX21vZGUsIDAxMDA2NDQgKTsKKwkJY3Bpb19zZXRfZmllbGQgKCBjcGlvLmNfbmxpbmssIDEgKTsKKwkJY3Bpb19zZXRfZmllbGQgKCBjcGlvLmNfZmlsZXNpemUsIGluaXRyZC0+bGVuICk7CisJCWNwaW9fc2V0X2ZpZWxkICggY3Bpby5jX25hbWVzaXplLCBuYW1lX2xlbiApOworCQlpZiAoIGFkZHJlc3MgKSB7CisJCQljb3B5X3RvX3VzZXIgKCBhZGRyZXNzLCBvZmZzZXQsICZjcGlvLAorCQkJCSAgICAgICBzaXplb2YgKCBjcGlvICkgKTsKKwkJfQorCQlvZmZzZXQgKz0gc2l6ZW9mICggY3BpbyApOworCQlpZiAoIGFkZHJlc3MgKSB7CisJCQljb3B5X3RvX3VzZXIgKCBhZGRyZXNzLCBvZmZzZXQsIGZpbGVuYW1lLAorCQkJCSAgICAgICBuYW1lX2xlbiApOworCQl9CisJCW9mZnNldCArPSBuYW1lX2xlbjsKKwkJb2Zmc2V0ID0gKCAoIG9mZnNldCArIDB4MDMgKSAmIH4weDAzICk7CisJfQorCisJLyogQ29weSBpbiBpbml0cmQgaW1hZ2UgYm9keSAqLworCWlmICggYWRkcmVzcyApCisJCW1lbWNweV91c2VyICggYWRkcmVzcywgb2Zmc2V0LCBpbml0cmQtPmRhdGEsIDAsIGluaXRyZC0+bGVuICk7CisJb2Zmc2V0ICs9IGluaXRyZC0+bGVuOworCWlmICggYWRkcmVzcyApIHsKKwkJREJHQyAoIGltYWdlLCAiYnpJbWFnZSAlcCBoYXMgaW5pdHJkICVwIGF0IFslbHgsJWx4KVxuIiwKKwkJICAgICAgIGltYWdlLCBpbml0cmQsIHVzZXJfdG9fcGh5cyAoIGFkZHJlc3MsIDAgKSwKKwkJICAgICAgIHVzZXJfdG9fcGh5cyAoIGFkZHJlc3MsIG9mZnNldCApICk7CisJfQorCisJLyogUm91bmQgdXAgdG8gNC1ieXRlIGJvdW5kYXJ5ICovCisJb2Zmc2V0ID0gKCAoIG9mZnNldCArIDB4MDMgKSAmIH4weDAzICk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyoqCisgKiBMb2FkIGluaXRyZHMsIGlmIGFueQorICoKKyAqIEB2IGltYWdlCQliekltYWdlIGltYWdlCisgKiBAdiBiemltZwkJYnpJbWFnZSBjb250ZXh0CisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBiemltYWdlX2xvYWRfaW5pdHJkcyAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsCisJCQkJICBzdHJ1Y3QgYnppbWFnZV9jb250ZXh0ICpiemltZyApIHsKKwlzdHJ1Y3QgaW1hZ2UgKmluaXRyZDsKKwlzaXplX3QgdG90YWxfbGVuID0gMDsKKwlwaHlzYWRkcl90IGFkZHJlc3M7CisJaW50IHJjOworCisJLyogQWRkIHVwIGxlbmd0aCBvZiBhbGwgaW5pdHJkIGltYWdlcyAqLworCWZvcl9lYWNoX2ltYWdlICggaW5pdHJkICkKKwkJdG90YWxfbGVuICs9IGJ6aW1hZ2VfbG9hZF9pbml0cmQgKCBpbWFnZSwgaW5pdHJkLCBVTlVMTCApOworCisJLyogR2l2ZSB1cCBpZiBubyBpbml0cmQgaW1hZ2VzIGZvdW5kICovCisJaWYgKCAhIHRvdGFsX2xlbiApCisJCXJldHVybiAwOworCisJLyogRmluZCBhIHN1aXRhYmxlIHN0YXJ0IGFkZHJlc3MuICBUcnkgMU1CIGJvdW5kYXJpZXMsCisJICogc3RhcnRpbmcgZnJvbSB0aGUgZG93bmxvYWRlZCBrZXJuZWwgaW1hZ2UgaXRzZWxmIGFuZAorCSAqIHdvcmtpbmcgZG93bndhcmRzIHVudGlsIHdlIGhpdCBhbiBhdmFpbGFibGUgcmVnaW9uLgorCSAqLworCWZvciAoIGFkZHJlc3MgPSAoIHVzZXJfdG9fcGh5cyAoIGltYWdlLT5kYXRhLCAwICkgJiB+MHhmZmZmZiApIDsgOworCSAgICAgIGFkZHJlc3MgLT0gMHgxMDAwMDAgKSB7CisJCS8qIENoZWNrIHRoYXQgd2UncmUgbm90IGdvaW5nIHRvIG92ZXJ3cml0ZSB0aGUKKwkJICoga2VybmVsIGl0c2VsZi4gIFRoaXMgY2hlY2sgaXNuJ3QgdG90YWxseQorCQkgKiBhY2N1cmF0ZSwgYnV0IGVycnMgb24gdGhlIHNpZGUgb2YgY2F1dGlvbi4KKwkJICovCisJCWlmICggYWRkcmVzcyA8PSAoIEJaSV9MT0FEX0hJR0hfQUREUiArIGltYWdlLT5sZW4gKSApIHsKKwkJCURCR0MgKCBpbWFnZSwgImJ6SW1hZ2UgJXAgY291bGQgbm90IGZpbmQgYSBsb2NhdGlvbiAiCisJCQkgICAgICAgImZvciBpbml0cmRcbiIsIGltYWdlICk7CisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJLyogQ2hlY2sgdGhhdCB3ZSBhcmUgd2l0aGluIHRoZSBrZXJuZWwncyByYW5nZSAqLworCQlpZiAoICggYWRkcmVzcyArIHRvdGFsX2xlbiAtIDEgKSA+IGJ6aW1nLT5tZW1fbGltaXQgKQorCQkJY29udGludWU7CisJCS8qIFByZXBhcmUgYW5kIHZlcmlmeSBzZWdtZW50ICovCisJCWlmICggKCByYyA9IHByZXBfc2VnbWVudCAoIHBoeXNfdG9fdXNlciAoIGFkZHJlc3MgKSwgMCwKKwkJCQkJICAgdG90YWxfbGVuICkgKSAhPSAwICkKKwkJCWNvbnRpbnVlOworCQkvKiBVc2UgdGhpcyBhZGRyZXNzICovCisJCWJyZWFrOworCX0KKworCS8qIFJlY29yZCBpbml0cmQgbG9jYXRpb24gKi8KKwliemltZy0+cmFtZGlza19pbWFnZSA9IGFkZHJlc3M7CisJYnppbWctPnJhbWRpc2tfc2l6ZSA9IHRvdGFsX2xlbjsKKworCS8qIENvbnN0cnVjdCBpbml0cmQgKi8KKwlEQkdDICggaW1hZ2UsICJiekltYWdlICVwIGNvbnN0cnVjdGluZyBpbml0cmQgYXQgWyVseCwlbHgpXG4iLAorCSAgICAgICBpbWFnZSwgYWRkcmVzcywgKCBhZGRyZXNzICsgdG90YWxfbGVuICkgKTsKKwlmb3JfZWFjaF9pbWFnZSAoIGluaXRyZCApIHsKKwkJYWRkcmVzcyArPSBiemltYWdlX2xvYWRfaW5pdHJkICggaW1hZ2UsIGluaXRyZCwKKwkJCQkJCSBwaHlzX3RvX3VzZXIgKCBhZGRyZXNzICkgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBFeGVjdXRlIGJ6SW1hZ2UgaW1hZ2UKKyAqCisgKiBAdiBpbWFnZQkJYnpJbWFnZSBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYnppbWFnZV9leGVjICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwlzdHJ1Y3QgYnppbWFnZV9jb250ZXh0IGJ6aW1nOworCWNvbnN0IGNoYXIgKmNtZGxpbmUgPSAoIGltYWdlLT5jbWRsaW5lID8gaW1hZ2UtPmNtZGxpbmUgOiAiIiApOworCWludCByYzsKKworCS8qIFJlYWQgYW5kIHBhcnNlIGhlYWRlciBmcm9tIGxvYWRlZCBrZXJuZWwgKi8KKwlpZiAoICggcmMgPSBiemltYWdlX3BhcnNlX2hlYWRlciAoIGltYWdlLCAmYnppbWcsCisJCQkJCSAgIGltYWdlLT5wcml2LnVzZXIgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJYXNzZXJ0ICggYnppbWcucm1fa2VybmVsID09IGltYWdlLT5wcml2LnVzZXIgKTsKKworCS8qIFBhcnNlIGNvbW1hbmQgbGluZSBmb3IgYm9vdGxvYWRlciBwYXJhbWV0ZXJzICovCisJaWYgKCAoIHJjID0gYnppbWFnZV9wYXJzZV9jbWRsaW5lICggaW1hZ2UsICZiemltZywgY21kbGluZSApICkgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJLyogU3RvcmUgY29tbWFuZCBsaW5lICovCisJaWYgKCAoIHJjID0gYnppbWFnZV9zZXRfY21kbGluZSAoIGltYWdlLCAmYnppbWcsIGNtZGxpbmUgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBMb2FkIGFueSBpbml0cmRzICovCisJaWYgKCAoIHJjID0gYnppbWFnZV9sb2FkX2luaXRyZHMgKCBpbWFnZSwgJmJ6aW1nICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogVXBkYXRlIGtlcm5lbCBoZWFkZXIgKi8KKwliemltYWdlX3VwZGF0ZV9oZWFkZXIgKCBpbWFnZSwgJmJ6aW1nLCBiemltZy5ybV9rZXJuZWwgKTsKKworCS8qIFByZXBhcmUgZm9yIGV4aXRpbmcgKi8KKwlzaHV0ZG93biAoIFNIVVRET1dOX0JPT1QgKTsKKworCURCR0MgKCBpbWFnZSwgImJ6SW1hZ2UgJXAganVtcGluZyB0byBSTSBrZXJuZWwgYXQgJTA0eDowMDAwICIKKwkgICAgICAgIihzdGFjayAlMDR4OiUwNHp4KVxuIiwgaW1hZ2UsICggYnppbWcucm1fa2VybmVsX3NlZyArIDB4MjAgKSwKKwkgICAgICAgYnppbWcucm1fa2VybmVsX3NlZywgYnppbWcucm1faGVhcCApOworCisJLyogSnVtcCB0byB0aGUga2VybmVsICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBSRUFMX0NPREUgKCAibW92dyAldzAsICUlZHNcblx0IgorCQkJCQkgICAibW92dyAldzAsICUlZXNcblx0IgorCQkJCQkgICAibW92dyAldzAsICUlZnNcblx0IgorCQkJCQkgICAibW92dyAldzAsICUlZ3Ncblx0IgorCQkJCQkgICAibW92dyAldzAsICUlc3Ncblx0IgorCQkJCQkgICAibW92dyAldzEsICUlc3Bcblx0IgorCQkJCQkgICAicHVzaHcgJXcyXG5cdCIKKwkJCQkJICAgInB1c2h3ICQwXG5cdCIKKwkJCQkJICAgImxyZXRcblx0IiApCisJCQkgICAgICAgOiA6ICJyIiAoIGJ6aW1nLnJtX2tlcm5lbF9zZWcgKSwKKwkJCSAgICAgICAgICAgInIiICggYnppbWcucm1faGVhcCApLAorCQkJICAgICAgICAgICAiciIgKCBiemltZy5ybV9rZXJuZWxfc2VnICsgMHgyMCApICk7CisKKwkvKiBUaGVyZSBpcyBubyB3YXkgZm9yIHRoZSBpbWFnZSB0byByZXR1cm4sIHNpbmNlIHdlIHByb3ZpZGUKKwkgKiBubyByZXR1cm4gYWRkcmVzcy4KKwkgKi8KKwlhc3NlcnQgKCAwICk7CisKKwlyZXR1cm4gLUVDQU5DRUxFRDsgLyogLUVJTVBPU1NJQkxFICovCit9CisKKy8qKgorICogTG9hZCBiekltYWdlIGltYWdlIGludG8gbWVtb3J5CisgKgorICogQHYgaW1hZ2UJCWJ6SW1hZ2UgZmlsZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBiemltYWdlX2xvYWQgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXN0cnVjdCBiemltYWdlX2NvbnRleHQgYnppbWc7CisJaW50IHJjOworCisJLyogUmVhZCBhbmQgcGFyc2UgaGVhZGVyIGZyb20gaW1hZ2UgKi8KKwlpZiAoICggcmMgPSBiemltYWdlX3BhcnNlX2hlYWRlciAoIGltYWdlLCAmYnppbWcsCisJCQkJCSAgIGltYWdlLT5kYXRhICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogVGhpcyBpcyBhIGJ6SW1hZ2UgaW1hZ2UsIHZhbGlkIG9yIG90aGVyd2lzZSAqLworCWlmICggISBpbWFnZS0+dHlwZSApCisJCWltYWdlLT50eXBlID0gJmJ6aW1hZ2VfaW1hZ2VfdHlwZTsKKworCS8qIFByZXBhcmUgc2VnbWVudHMgKi8KKwlpZiAoICggcmMgPSBwcmVwX3NlZ21lbnQgKCBiemltZy5ybV9rZXJuZWwsIGJ6aW1nLnJtX2ZpbGVzeiwKKwkJCQkgICBiemltZy5ybV9tZW1zeiApICkgIT0gMCApIHsKKwkJREJHQyAoIGltYWdlLCAiYnpJbWFnZSAlcCBjb3VsZCBub3QgcHJlcGFyZSBSTSBzZWdtZW50OiAlc1xuIiwKKwkJICAgICAgIGltYWdlLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKwlpZiAoICggcmMgPSBwcmVwX3NlZ21lbnQgKCBiemltZy5wbV9rZXJuZWwsIGJ6aW1nLnBtX3N6LAorCQkJCSAgIGJ6aW1nLnBtX3N6ICkgKSAhPSAwICkgeworCQlEQkdDICggaW1hZ2UsICJiekltYWdlICVwIGNvdWxkIG5vdCBwcmVwYXJlIFBNIHNlZ21lbnQ6ICVzXG4iLAorCQkgICAgICAgaW1hZ2UsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogTG9hZCBzZWdtZW50cyAqLworCW1lbWNweV91c2VyICggYnppbWcucm1fa2VybmVsLCAwLCBpbWFnZS0+ZGF0YSwKKwkJICAgICAgMCwgYnppbWcucm1fZmlsZXN6ICk7CisJbWVtY3B5X3VzZXIgKCBiemltZy5wbV9rZXJuZWwsIDAsIGltYWdlLT5kYXRhLAorCQkgICAgICBiemltZy5ybV9maWxlc3osIGJ6aW1nLnBtX3N6ICk7CisKKwkvKiBVcGRhdGUgYW5kIHdyaXRlIG91dCBoZWFkZXIgKi8KKwliemltYWdlX3VwZGF0ZV9oZWFkZXIgKCBpbWFnZSwgJmJ6aW1nLCBiemltZy5ybV9rZXJuZWwgKTsKKworCS8qIFJlY29yZCByZWFsLW1vZGUgc2VnbWVudCBpbiBpbWFnZSBwcml2YXRlIGRhdGEgZmllbGQgKi8KKwlpbWFnZS0+cHJpdi51c2VyID0gYnppbWcucm1fa2VybmVsOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBMaW51eCBiekltYWdlIGltYWdlIHR5cGUgKi8KK3N0cnVjdCBpbWFnZV90eXBlIGJ6aW1hZ2VfaW1hZ2VfdHlwZSBfX2ltYWdlX3R5cGUgKCBQUk9CRV9OT1JNQUwgKSA9IHsKKwkubmFtZSA9ICJiekltYWdlIiwKKwkubG9hZCA9IGJ6aW1hZ2VfbG9hZCwKKwkuZXhlYyA9IGJ6aW1hZ2VfZXhlYywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvY29tMzIuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9jb20zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjM0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvY29tMzIuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYW5pZWwgVmVya2FtcCA8ZGFuaWVsQGRydi5udT4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qKgorICogQGZpbGUKKyAqCisgKiBTWVNMSU5VWCBDT00zMiBpbWFnZSBmb3JtYXQKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxiYXNlbWVtLmg+CisjaW5jbHVkZSA8Y29tYm9vdC5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvaW1hZ2UuaD4KKyNpbmNsdWRlIDxncHhlL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKyNpbmNsdWRlIDxncHhlL21lbW1hcC5oPgorCitzdHJ1Y3QgaW1hZ2VfdHlwZSBjb20zMl9pbWFnZV90eXBlIF9faW1hZ2VfdHlwZSAoIFBST0JFX05PUk1BTCApOworCisvKioKKyAqIEV4ZWN1dGUgQ09NQk9PVCBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlDT00zMiBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgY29tMzJfZXhlYyAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJc3RydWN0IG1lbW9yeV9tYXAgbWVtbWFwOworCXVuc2lnbmVkIGludCBpOworCWludCBzdGF0ZTsKKwl1aW50MzJfdCBhdmFpbF9tZW1fdG9wOworCisJc3RhdGUgPSBybXNldGptcCAoIGNvbWJvb3RfcmV0dXJuICk7CisKKwlzd2l0Y2ggKCBzdGF0ZSApIHsKKwljYXNlIDA6IC8qIEZpcnN0IHRpbWUgdGhyb3VnaDsgaW52b2tlIENPTTMyIHByb2dyYW0gKi8KKworCQkvKiBHZXQgbWVtb3J5IG1hcCAqLworCQlnZXRfbWVtbWFwICggJm1lbW1hcCApOworCisJCS8qIEZpbmQgZW5kIG9mIGJsb2NrIGNvdmVyaW5nIENPTTMyIGltYWdlIGxvYWRpbmcgYXJlYSAqLworCQlmb3IgKCBpID0gMCwgYXZhaWxfbWVtX3RvcCA9IDAgOyBpIDwgbWVtbWFwLmNvdW50IDsgaSsrICkgeworCQkJaWYgKCAobWVtbWFwLnJlZ2lvbnNbaV0uc3RhcnQgPD0gQ09NMzJfU1RBUlRfUEhZUykgJiYKKwkJCSAgICAgKG1lbW1hcC5yZWdpb25zW2ldLmVuZCA+IENPTTMyX1NUQVJUX1BIWVMgKyBpbWFnZS0+bGVuKSApIHsKKwkJCQlhdmFpbF9tZW1fdG9wID0gbWVtbWFwLnJlZ2lvbnNbaV0uZW5kOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJREJHQyAoIGltYWdlLCAiQ09NMzIgJXA6IGF2YWlsYWJsZSBtZW1vcnkgdG9wID0gMHgleFxuIiwKKwkJICAgICAgIGltYWdlLCBhdmFpbF9tZW1fdG9wICk7CisKKwkJYXNzZXJ0ICggYXZhaWxfbWVtX3RvcCAhPSAwICk7CisKKwkJY29tMzJfZXh0ZXJuYWxfZXNwID0gcGh5c190b192aXJ0ICggYXZhaWxfbWVtX3RvcCApOworCisJCS8qIEhvb2sgQ09NQk9PVCBBUEkgaW50ZXJydXB0cyAqLworCQlob29rX2NvbWJvb3RfaW50ZXJydXB0cygpOworCisJCS8qIFVucmVnaXN0ZXIgaW1hZ2UsIHNvIHRoYXQgYSAiYm9vdCIgY29tbWFuZCBkb2Vzbid0CisJCSAqIHRocm93IHVzIGludG8gYW4gZXhlY3V0aW9uIGxvb3AuICBXZSBuZXZlcgorCQkgKiByZXJlZ2lzdGVyIG91cnNlbHZlczsgQ09NQk9PVCBpbWFnZXMgZXhwZWN0IHRvIGJlCisJCSAqIHJlbW92ZWQgb24gZXhpdC4KKwkJICovCisJCXVucmVnaXN0ZXJfaW1hZ2UgKCBpbWFnZSApOworCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJCSJtb3ZsICUlZXNwLCAoY29tMzJfaW50ZXJuYWxfZXNwKVxuXHQiIC8qIFNhdmUgaW50ZXJuYWwgdmlydHVhbCBhZGRyZXNzIHNwYWNlIEVTUCAqLworCQkJIm1vdmwgKGNvbTMyX2V4dGVybmFsX2VzcCksICUlZXNwXG5cdCIgLyogU3dpdGNoIHRvIENPTTMyIEVTUCAodG9wIG9mIGF2YWlsYWJsZSBtZW1vcnkpICovCisJCQkiY2FsbCBfdmlydF90b19waHlzXG5cdCIgICAgICAgICAgICAgICAvKiBTd2l0Y2ggdG8gZmxhdCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlICovCisJCQkicHVzaGwgJTBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIENERUNMIGhlbHBlciBmdW5jdGlvbiAqLworCQkJInB1c2hsICUxXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBGQVIgY2FsbCBoZWxwZXIgZnVuY3Rpb24gKi8KKwkJCSJwdXNobCAlMlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpemUgb2YgbG93IG1lbW9yeSBib3VuY2UgYnVmZmVyICovCisJCQkicHVzaGwgJTNcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGxvdyBtZW1vcnkgYm91bmNlIGJ1ZmZlciAqLworCQkJInB1c2hsICU0XG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBJTlQgY2FsbCBoZWxwZXIgZnVuY3Rpb24gKi8KKwkJCSJwdXNobCAlNVxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KKwkJCSJwdXNobCAkNlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyAqLworCQkJImNhbGwgKiU2XG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBpbWFnZSAqLworCQkJImNhbGwgX3BoeXNfdG9fdmlydFxuXHQiICAgICAgICAgICAgICAgLyogU3dpdGNoIGJhY2sgdG8gaW50ZXJuYWwgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCisJCQkibW92bCAoY29tMzJfaW50ZXJuYWxfZXNwKSwgJSVlc3Bcblx0IiAvKiBTd2l0Y2ggYmFjayB0byBpbnRlcm5hbCBzdGFjayAqLworCQk6CisJCToKKwkJCS8qICUwICovICJyIiAoIHZpcnRfdG9fcGh5cyAoIGNvbTMyX2NmYXJjYWxsX3dyYXBwZXIgKSApLAorCQkJLyogJTEgKi8gInIiICggdmlydF90b19waHlzICggY29tMzJfZmFyY2FsbF93cmFwcGVyICkgKSwKKwkJCS8qICUyICovICJyIiAoIGdldF9mYm1zKCkgKiAxMDI0IC0gKENPTTMyX0JPVU5DRV9TRUcgPDwgNCkgKSwKKwkJCS8qICUzICovICJpIiAoIENPTTMyX0JPVU5DRV9TRUcgPDwgNCApLAorCQkJLyogJTQgKi8gInIiICggdmlydF90b19waHlzICggY29tMzJfaW50Y2FsbF93cmFwcGVyICkgKSwKKwkJCS8qICU1ICovICJyIiAoIHZpcnRfdG9fcGh5cyAoIGltYWdlLT5jbWRsaW5lICkgKSwKKwkJCS8qICU2ICovICJyIiAoIENPTTMyX1NUQVJUX1BIWVMgKQorCQk6CisJCQkibWVtb3J5IiApOworCQlEQkdDICggaW1hZ2UsICJDT00zMiAlcDogcmV0dXJuZWRcbiIsIGltYWdlICk7CisJCWJyZWFrOworCisJY2FzZSBDT01CT09UX0VYSVQ6CisJCURCR0MgKCBpbWFnZSwgIkNPTTMyICVwOiBleGl0ZWRcbiIsIGltYWdlICk7CisJCWJyZWFrOworCisJY2FzZSBDT01CT09UX0VYSVRfUlVOX0tFUk5FTDoKKwkJREJHQyAoIGltYWdlLCAiQ09NMzIgJXA6IGV4aXRlZCB0byBydW4ga2VybmVsICVwXG4iLAorCQkgICAgICAgaW1hZ2UsIGNvbWJvb3RfcmVwbGFjZW1lbnRfaW1hZ2UgKTsKKwkJaW1hZ2UtPnJlcGxhY2VtZW50ID0gY29tYm9vdF9yZXBsYWNlbWVudF9pbWFnZTsKKwkJY29tYm9vdF9yZXBsYWNlbWVudF9pbWFnZSA9IE5VTEw7CisJCWltYWdlX2F1dG9sb2FkICggaW1hZ2UtPnJlcGxhY2VtZW50ICk7CisJCWJyZWFrOworCisJY2FzZSBDT01CT09UX0VYSVRfQ09NTUFORDoKKwkJREJHQyAoIGltYWdlLCAiQ09NMzIgJXA6IGV4aXRlZCBhZnRlciBleGVjdXRpbmcgY29tbWFuZFxuIiwKKwkJICAgICAgIGltYWdlICk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYXNzZXJ0ICggMCApOworCQlicmVhazsKKwl9CisKKwl1bmhvb2tfY29tYm9vdF9pbnRlcnJ1cHRzKCk7CisJY29tYm9vdF9mb3JjZV90ZXh0X21vZGUoKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIENoZWNrIGltYWdlIG5hbWUgZXh0ZW5zaW9uCisgKiAKKyAqIEB2IGltYWdlCQlDT00zMiBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgY29tMzJfaWRlbnRpZnkgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCWNvbnN0IGNoYXIgKmV4dDsKKwlzdGF0aWMgY29uc3QgdWludDhfdCBtYWdpY1tdID0geyAweEI4LCAweEZGLCAweDRDLCAweENELCAweDIxIH07CisJdWludDhfdCBidWZbNV07CisJCisJaWYgKCBpbWFnZS0+bGVuID49IDUgKSB7CisJCS8qIENoZWNrIGZvciBtYWdpYyBudW1iZXIKKwkJICogbW92IGVheCwyMWNkNGNmZmgKKwkJICogQjggRkYgNEMgQ0QgMjEKKwkJICovCisJCWNvcHlfZnJvbV91c2VyICggYnVmLCBpbWFnZS0+ZGF0YSwgMCwgc2l6ZW9mKGJ1ZikgKTsKKwkJaWYgKCAhIG1lbWNtcCAoIGJ1ZiwgbWFnaWMsIHNpemVvZihidWYpICkgKSB7CisJCQlEQkdDICggaW1hZ2UsICJDT00zMiAlcDogZm91bmQgbWFnaWMgbnVtYmVyXG4iLAorCQkJICAgICAgIGltYWdlICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIE1hZ2ljIG51bWJlciBub3QgZm91bmQ7IGNoZWNrIGZpbGVuYW1lIGV4dGVuc2lvbiAqLworCisJZXh0ID0gc3RycmNociggaW1hZ2UtPm5hbWUsICcuJyApOworCisJaWYgKCAhIGV4dCApIHsKKwkJREJHQyAoIGltYWdlLCAiQ09NMzIgJXA6IG5vIGV4dGVuc2lvblxuIiwKKwkJICAgICAgIGltYWdlICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkrK2V4dDsKKworCWlmICggc3RyY2FzZWNtcCggZXh0LCAiYzMyIiApICkgeworCQlEQkdDICggaW1hZ2UsICJDT00zMiAlcDogdW5yZWNvZ25pemVkIGV4dGVuc2lvbiAlc1xuIiwKKwkJICAgICAgIGltYWdlLCBleHQgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogTG9hZCBDT00zMiBpbWFnZSBpbnRvIG1lbW9yeQorICogQHYgaW1hZ2UJCUNPTTMyIGltYWdlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBjb21ib290X2xvYWRfaW1hZ2UgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXNpemVfdCBmaWxlc3osIG1lbXN6OworCXVzZXJwdHJfdCBidWZmZXI7CisJaW50IHJjOworCisJZmlsZXN6ID0gaW1hZ2UtPmxlbjsKKwltZW1zeiA9IGZpbGVzejsKKwlidWZmZXIgPSBwaHlzX3RvX3VzZXIgKCBDT00zMl9TVEFSVF9QSFlTICk7CisJaWYgKCAoIHJjID0gcHJlcF9zZWdtZW50ICggYnVmZmVyLCBmaWxlc3osIG1lbXN6ICkgKSAhPSAwICkgeworCQlEQkdDICggaW1hZ2UsICJDT00zMiAlcDogY291bGQgbm90IHByZXBhcmUgc2VnbWVudDogJXNcbiIsCisJCSAgICAgICBpbWFnZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBDb3B5IGltYWdlIHRvIHNlZ21lbnQgKi8KKwltZW1jcHlfdXNlciAoIGJ1ZmZlciwgMCwgaW1hZ2UtPmRhdGEsIDAsIGZpbGVzeiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUHJlcGFyZSBDT00zMiBsb3cgbWVtb3J5IGJvdW5jZSBidWZmZXIKKyAqIEB2IGltYWdlCQlDT00zMiBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgY29tYm9vdF9wcmVwYXJlX2JvdW5jZV9idWZmZXIgKCBzdHJ1Y3QgaW1hZ2UgKiBpbWFnZSApIHsKKwl1bnNpZ25lZCBpbnQgc2VnOworCXVzZXJwdHJfdCBzZWdfdXNlcnB0cjsKKwlzaXplX3QgZmlsZXN6LCBtZW1zejsKKwlpbnQgcmM7CisKKwlzZWcgPSBDT00zMl9CT1VOQ0VfU0VHOworCXNlZ191c2VycHRyID0gcmVhbF90b191c2VyICggc2VnLCAwICk7CisKKwkvKiBFbnN1cmUgdGhlIGVudGlyZSA2NGsgc2VnbWVudCBpcyBmcmVlICovCisJbWVtc3ogPSAweEZGRkY7CisJZmlsZXN6ID0gMDsKKworCS8qIFByZXBhcmUsIHZlcmlmeSwgYW5kIGxvYWQgdGhlIHJlYWwtbW9kZSBzZWdtZW50ICovCisJaWYgKCAoIHJjID0gcHJlcF9zZWdtZW50ICggc2VnX3VzZXJwdHIsIGZpbGVzeiwgbWVtc3ogKSApICE9IDAgKSB7CisJCURCR0MgKCBpbWFnZSwgIkNPTTMyICVwOiBjb3VsZCBub3QgcHJlcGFyZSBib3VuY2UgYnVmZmVyIHNlZ21lbnQ6ICVzXG4iLAorCQkgICAgICAgaW1hZ2UsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogTG9hZCBDT00zMiBpbWFnZSBpbnRvIG1lbW9yeQorICoKKyAqIEB2IGltYWdlCQlDT00zMiBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgY29tMzJfbG9hZCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJaW50IHJjOworCisJREJHQyAoIGltYWdlLCAiQ09NMzIgJXA6IG5hbWUgJyVzJywgY21kbGluZSAnJXMnXG4iLAorCSAgICAgICBpbWFnZSwgaW1hZ2UtPm5hbWUsIGltYWdlLT5jbWRsaW5lICk7CisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGEgQ09NQk9PVCBpbWFnZSAqLworCWlmICggKCByYyA9IGNvbTMyX2lkZW50aWZ5ICggaW1hZ2UgKSApICE9IDAgKSB7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBUaGlzIGlzIGEgQ09NMzIgaW1hZ2UsIHZhbGlkIG9yIG90aGVyd2lzZSAqLworCWlmICggISBpbWFnZS0+dHlwZSApCisJCWltYWdlLT50eXBlID0gJmNvbTMyX2ltYWdlX3R5cGU7CisKKwkvKiBMb2FkIGltYWdlICovCisJaWYgKCAoIHJjID0gY29tYm9vdF9sb2FkX2ltYWdlICggaW1hZ2UgKSApICE9IDAgKSB7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBQcmVwYXJlIGJvdW5jZSBidWZmZXIgc2VnbWVudCAqLworCWlmICggKCByYyA9IGNvbWJvb3RfcHJlcGFyZV9ib3VuY2VfYnVmZmVyICggaW1hZ2UgKSApICE9IDAgKSB7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqIFNZU0xJTlVYIENPTTMyIGltYWdlIHR5cGUgKi8KK3N0cnVjdCBpbWFnZV90eXBlIGNvbTMyX2ltYWdlX3R5cGUgX19pbWFnZV90eXBlICggUFJPQkVfTk9STUFMICkgPSB7CisJLm5hbWUgPSAiQ09NMzIiLAorCS5sb2FkID0gY29tMzJfbG9hZCwKKwkuZXhlYyA9IGNvbTMyX2V4ZWMsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ltYWdlL2NvbWJvb3QuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9jb21ib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwYjJiOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9jb21ib290LmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGFuaWVsIFZlcmthbXAgPGRhbmllbEBkcnYubnU+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKgorICogU1lTTElOVVggQ09NQk9PVCAoMTYtYml0KSBpbWFnZSBmb3JtYXQKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxiYXNlbWVtLmg+CisjaW5jbHVkZSA8Y29tYm9vdC5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvaW1hZ2UuaD4KKyNpbmNsdWRlIDxncHhlL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKyNpbmNsdWRlIDxncHhlL2ZlYXR1cmVzLmg+CisKK0ZFQVRVUkUgKCBGRUFUVVJFX0lNQUdFLCAiQ09NQk9PVCIsIERIQ1BfRUJfRkVBVFVSRV9DT01CT09ULCAxICk7CisKK3N0cnVjdCBpbWFnZV90eXBlIGNvbWJvb3RfaW1hZ2VfdHlwZSBfX2ltYWdlX3R5cGUgKCBQUk9CRV9OT1JNQUwgKTsKKworLyoqCisgKiBDT01CT09UIFBTUCwgY29waWVkIHRvIG9mZnNldCAwIG9mIGNvZGUgc2VnbWVudAorICovCitzdHJ1Y3QgY29tYm9vdF9wc3AgeworCS8qKiBJTlQgMjAgaW5zdHJ1Y3Rpb24sIGV4ZWN1dGVkIGlmIENPTUJPT1QgaW1hZ2UgcmV0dXJucyB3aXRoIFJFVCAqLworCXVpbnQxNl90IGludDIwOworCS8qKiBTZWdtZW50IG9mIGZpcnN0IG5vbi1mcmVlIHBhcmFncmFwaCBvZiBtZW1vcnkgKi8KKwl1aW50MTZfdCBmaXJzdF9ub25fZnJlZV9wYXJhOworfTsKKworLyoqIE9mZnNldCBpbiBQU1Agb2YgY29tbWFuZCBsaW5lICovCisjZGVmaW5lIENPTUJPT1RfUFNQX0NNRExJTkVfT0ZGU0VUIDB4ODEKKworLyoqIE1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBpbiBQU1AKKyAqICgxMjcgYnl0ZXMgbWludXMgc3BhY2UgYW5kIENSKSAqLworI2RlZmluZSBDT01CT09UX01BWF9DTURMSU5FX0xFTiAgICAxMjUKKworCisvKioKKyAqIENvcHkgY29tbWFuZCBsaW5lIHRvIFBTUAorICogCisgKiBAdiBpbWFnZQkJQ09NQk9PVCBpbWFnZQorICovCitzdGF0aWMgdm9pZCBjb21ib290X2NvcHlfY21kbGluZSAoIHN0cnVjdCBpbWFnZSAqIGltYWdlLCB1c2VycHRyX3Qgc2VnX3VzZXJwdHIgKSB7CisJY29uc3QgY2hhciAqY21kbGluZSA9ICggaW1hZ2UtPmNtZGxpbmUgPyBpbWFnZS0+Y21kbGluZSA6ICIiICk7CisJaW50IGNtZGxpbmVfbGVuID0gc3RybGVuICggY21kbGluZSApOworCWlmKCBjbWRsaW5lX2xlbiA+IENPTUJPT1RfTUFYX0NNRExJTkVfTEVOICkKKwkJY21kbGluZV9sZW4gPSBDT01CT09UX01BWF9DTURMSU5FX0xFTjsKKwl1aW50OF90IGxlbl9ieXRlID0gY21kbGluZV9sZW47CisJY2hhciBzcGMgPSAnICcsIGNyID0gJ1xyJzsKKworCS8qIENvcHkgbGVuZ3RoIHRvIGJ5dGUgYmVmb3JlIGNvbW1hbmQgbGluZSAqLworCWNvcHlfdG9fdXNlciAoIHNlZ191c2VycHRyLCBDT01CT09UX1BTUF9DTURMSU5FX09GRlNFVCAtIDEsCisJICAgICAgICAgICAgICAgJmxlbl9ieXRlLCAxICk7CisKKwkvKiBDb21tYW5kIGxpbmUgc3RhcnRzIHdpdGggc3BhY2UgKi8KKwljb3B5X3RvX3VzZXIgKCBzZWdfdXNlcnB0ciwKKwkgICAgICAgICAgICAgICBDT01CT09UX1BTUF9DTURMSU5FX09GRlNFVCwKKwkgICAgICAgICAgICAgICAmc3BjLCAxICk7CisKKwkvKiBDb3B5IGNvbW1hbmQgbGluZSAqLworCWNvcHlfdG9fdXNlciAoIHNlZ191c2VycHRyLAorCSAgICAgICAgICAgICAgIENPTUJPT1RfUFNQX0NNRExJTkVfT0ZGU0VUICsgMSwKKwkgICAgICAgICAgICAgICBjbWRsaW5lLCBjbWRsaW5lX2xlbiApOworCisJLyogQ29tbWFuZCBsaW5lIGVuZHMgd2l0aCBDUiAqLworCWNvcHlfdG9fdXNlciAoIHNlZ191c2VycHRyLAorCSAgICAgICAgICAgICAgIENPTUJPT1RfUFNQX0NNRExJTkVfT0ZGU0VUICsgY21kbGluZV9sZW4gKyAxLAorCSAgICAgICAgICAgICAgICZjciwgMSApOworfQorCisvKioKKyAqIEluaXRpYWxpemUgUFNQCisgKiAKKyAqIEB2IGltYWdlCQlDT01CT09UIGltYWdlCisgKiBAdiBzZWdfdXNlcnB0cglzZWdtZW50IHRvIGluaXRpYWxpemUKKyAqLworc3RhdGljIHZvaWQgY29tYm9vdF9pbml0X3BzcCAoIHN0cnVjdCBpbWFnZSAqIGltYWdlLCB1c2VycHRyX3Qgc2VnX3VzZXJwdHIgKSB7CisJc3RydWN0IGNvbWJvb3RfcHNwIHBzcDsKKworCS8qIEZpbGwgUFNQICovCisKKwkvKiBJTlQgMjBoIGluc3RydWN0aW9uLCBieXRlIG9yZGVyIHJldmVyc2VkICovCisJcHNwLmludDIwID0gMHgyMENEOworCisJLyogZ2V0X2ZibXMoKSByZXR1cm5zIEJJT1MgZnJlZSBiYXNlIG1lbW9yeSBjb3VudGVyLCB3aGljaCBpcyBpbgorCSAqIGtpbG9ieXRlczsgeCAqIDEwMjQgLyAxNiA9PSB4ICogNjQgPT0geCA8PCA2ICovCisJcHNwLmZpcnN0X25vbl9mcmVlX3BhcmEgPSBnZXRfZmJtcygpIDw8IDY7CisKKwlEQkdDICggaW1hZ2UsICJDT01CT09UICVwOiBmaXJzdCBub24tZnJlZSBwYXJhZ3JhcGggPSAweCV4XG4iLAorCSAgICAgICBpbWFnZSwgcHNwLmZpcnN0X25vbl9mcmVlX3BhcmEgKTsKKworCS8qIENvcHkgdGhlIFBTUCB0byBvZmZzZXQgMCBvZiBzZWdtZW50LgorCSAqIFRoZSByZXN0IG9mIHRoZSBQU1Agd2FzIGFscmVhZHkgemVyb2VkIGJ5CisJICogY29tYm9vdF9wcmVwYXJlX3NlZ21lbnQuICovCisJY29weV90b191c2VyICggc2VnX3VzZXJwdHIsIDAsICZwc3AsIHNpemVvZiggcHNwICkgKTsKKworCS8qIENvcHkgdGhlIGNvbW1hbmQgbGluZSB0byB0aGUgUFNQICovCisJY29tYm9vdF9jb3B5X2NtZGxpbmUgKCBpbWFnZSwgc2VnX3VzZXJwdHIgKTsKK30KKworLyoqCisgKiBFeGVjdXRlIENPTUJPT1QgaW1hZ2UKKyAqCisgKiBAdiBpbWFnZQkJQ09NQk9PVCBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgY29tYm9vdF9leGVjICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwl1c2VycHRyX3Qgc2VnX3VzZXJwdHIgPSByZWFsX3RvX3VzZXIgKCBDT01CT09UX1BTUF9TRUcsIDAgKTsKKwlpbnQgc3RhdGU7CisKKwlzdGF0ZSA9IHJtc2V0am1wICggY29tYm9vdF9yZXR1cm4gKTsKKworCXN3aXRjaCAoIHN0YXRlICkgeworCWNhc2UgMDogLyogRmlyc3QgdGltZSB0aHJvdWdoOyBpbnZva2UgQ09NQk9PVCBwcm9ncmFtICovCisKKwkJLyogSW5pdGlhbGl6ZSBQU1AgKi8KKwkJY29tYm9vdF9pbml0X3BzcCAoIGltYWdlLCBzZWdfdXNlcnB0ciApOworCisJCS8qIEhvb2sgQ09NQk9PVCBBUEkgaW50ZXJydXB0cyAqLworCQlob29rX2NvbWJvb3RfaW50ZXJydXB0cygpOworCisJCURCR0MgKCBpbWFnZSwgImV4ZWN1dGluZyAxNi1iaXQgQ09NQk9PVCBpbWFnZSBhdCAlNHg6MDEwMFxuIiwKKwkJICAgICAgIENPTUJPT1RfUFNQX1NFRyApOworCisJCS8qIFVucmVnaXN0ZXIgaW1hZ2UsIHNvIHRoYXQgYSAiYm9vdCIgY29tbWFuZCBkb2Vzbid0CisJCSAqIHRocm93IHVzIGludG8gYW4gZXhlY3V0aW9uIGxvb3AuICBXZSBuZXZlcgorCQkgKiByZXJlZ2lzdGVyIG91cnNlbHZlczsgQ09NQk9PVCBpbWFnZXMgZXhwZWN0IHRvIGJlCisJCSAqIHJlbW92ZWQgb24gZXhpdC4KKwkJICovCisJCXVucmVnaXN0ZXJfaW1hZ2UgKCBpbWFnZSApOworCisJCS8qIFN0b3JlIHN0YWNrIHNlZ21lbnQgYXQgMHgzOCBhbmQgc3RhY2sgcG9pbnRlciBhdCAweDNBCisJCSAqIGluIHRoZSBQU1AgYW5kIGp1bXAgdG8gdGhlIGltYWdlICovCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJICAgIFJFQUxfQ09ERSAoIC8qIFNhdmUgcmV0dXJuIGFkZHJlc3Mgd2l0aCBzZWdtZW50IG9uIG9sZCBzdGFjayAqLworCQkJCSAgICAicG9wdyAlJWF4XG5cdCIKKwkJCQkgICAgInB1c2h3ICUlY3Ncblx0IgorCQkJCSAgICAicHVzaHcgJSVheFxuXHQiCisJCQkJICAgIC8qIFNldCBEUz1FUz1zZWdtZW50IHdpdGggaW1hZ2UgKi8KKwkJCQkgICAgIm1vdncgJXcwLCAlJWRzXG5cdCIKKwkJCQkgICAgIm1vdncgJXcwLCAlJWVzXG5cdCIKKwkJCQkgICAgLyogU2V0IFNTOlNQIHRvIG5ldyBzdGFjayAoZW5kIG9mIGltYWdlIHNlZ21lbnQpICovCisJCQkJICAgICJtb3Z3ICV3MCwgJSVzc1xuXHQiCisJCQkJICAgICJ4b3IgJSVzcCwgJSVzcFxuXHQiCisJCQkJICAgICJwdXNodyAkMFxuXHQiCisJCQkJICAgICJwdXNodyAldzBcblx0IgorCQkJCSAgICAicHVzaHcgJDB4MTAwXG5cdCIKKwkJCQkgICAgLyogWmVybyByZWdpc3RlcnMgKHNvbWUgQ09NIGZpbGVzIGFzc3VtZSBHUCByZWdzIGFyZSAwKSAqLworCQkJCSAgICAieG9ydyAlJWF4LCAlJWF4XG5cdCIKKwkJCQkgICAgInhvcncgJSVieCwgJSVieFxuXHQiCisJCQkJICAgICJ4b3J3ICUlY3gsICUlY3hcblx0IgorCQkJCSAgICAieG9ydyAlJWR4LCAlJWR4XG5cdCIKKwkJCQkgICAgInhvcncgJSVzaSwgJSVzaVxuXHQiCisJCQkJICAgICJ4b3J3ICUlZGksICUlZGlcblx0IgorCQkJCSAgICAieG9ydyAlJWJwLCAlJWJwXG5cdCIKKwkJCQkgICAgImxyZXRcblx0IiApCisJCQkJCSA6IDogInIiICggQ09NQk9PVF9QU1BfU0VHICkgOiAiZWF4IiApOworCQlEQkdDICggaW1hZ2UsICJDT01CT09UICVwOiByZXR1cm5lZFxuIiwgaW1hZ2UgKTsKKwkJYnJlYWs7CisKKwljYXNlIENPTUJPT1RfRVhJVDoKKwkJREJHQyAoIGltYWdlLCAiQ09NQk9PVCAlcDogZXhpdGVkXG4iLCBpbWFnZSApOworCQlicmVhazsKKworCWNhc2UgQ09NQk9PVF9FWElUX1JVTl9LRVJORUw6CisJCURCR0MgKCBpbWFnZSwgIkNPTUJPT1QgJXA6IGV4aXRlZCB0byBydW4ga2VybmVsICVwXG4iLAorCQkgICAgICAgaW1hZ2UsIGNvbWJvb3RfcmVwbGFjZW1lbnRfaW1hZ2UgKTsKKwkJaW1hZ2UtPnJlcGxhY2VtZW50ID0gY29tYm9vdF9yZXBsYWNlbWVudF9pbWFnZTsKKwkJY29tYm9vdF9yZXBsYWNlbWVudF9pbWFnZSA9IE5VTEw7CisJCWltYWdlX2F1dG9sb2FkICggaW1hZ2UtPnJlcGxhY2VtZW50ICk7CisJCWJyZWFrOworCisJY2FzZSBDT01CT09UX0VYSVRfQ09NTUFORDoKKwkJREJHQyAoIGltYWdlLCAiQ09NQk9PVCAlcDogZXhpdGVkIGFmdGVyIGV4ZWN1dGluZyBjb21tYW5kXG4iLAorCQkgICAgICAgaW1hZ2UgKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhc3NlcnQgKCAwICk7CisJCWJyZWFrOworCX0KKworCXVuaG9va19jb21ib290X2ludGVycnVwdHMoKTsKKwljb21ib290X2ZvcmNlX3RleHRfbW9kZSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2hlY2sgaW1hZ2UgbmFtZSBleHRlbnNpb24KKyAqIAorICogQHYgaW1hZ2UJCUNPTUJPT1QgaW1hZ2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGNvbWJvb3RfaWRlbnRpZnkgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCWNvbnN0IGNoYXIgKmV4dDsKKworCWV4dCA9IHN0cnJjaHIoIGltYWdlLT5uYW1lLCAnLicgKTsKKworCWlmICggISBleHQgKSB7CisJCURCR0MgKCBpbWFnZSwgIkNPTUJPT1QgJXA6IG5vIGV4dGVuc2lvblxuIiwKKwkJICAgICAgIGltYWdlICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkrK2V4dDsKKworCWlmICggc3RyY2FzZWNtcCggZXh0LCAiY29tIiApICYmIHN0cmNhc2VjbXAoIGV4dCwgImNidCIgKSApIHsKKwkJREJHQyAoIGltYWdlLCAiQ09NQk9PVCAlcDogdW5yZWNvZ25pemVkIGV4dGVuc2lvbiAlc1xuIiwKKwkJICAgICAgIGltYWdlLCBleHQgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIExvYWQgQ09NQk9PVCBpbWFnZSBpbnRvIG1lbW9yeSwgcHJlcGFyaW5nIGEgc2VnbWVudCBhbmQgcmV0dXJuaW5nIGl0CisgKiBAdiBpbWFnZQkJQ09NQk9PVCBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgY29tYm9vdF9wcmVwYXJlX3NlZ21lbnQgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkKK3sKKwl1c2VycHRyX3Qgc2VnX3VzZXJwdHI7CisJc2l6ZV90IGZpbGVzeiwgbWVtc3o7CisJaW50IHJjOworCisJLyogTG9hZCBpbWFnZSBpbiBzZWdtZW50ICovCisJc2VnX3VzZXJwdHIgPSByZWFsX3RvX3VzZXIgKCBDT01CT09UX1BTUF9TRUcsIDAgKTsKKworCS8qIEFsbG93IGV0cmEgMHgxMDAgYnl0ZXMgYmVmb3JlIGltYWdlIGZvciBQU1AgKi8KKwlmaWxlc3ogPSBpbWFnZS0+bGVuICsgMHgxMDA7IAorCisJLyogRW5zdXJlIHRoZSBlbnRpcmUgNjRrIHNlZ21lbnQgaXMgZnJlZSAqLworCW1lbXN6ID0gMHhGRkZGOworCisJLyogUHJlcGFyZSwgdmVyaWZ5LCBhbmQgbG9hZCB0aGUgcmVhbC1tb2RlIHNlZ21lbnQgKi8KKwlpZiAoICggcmMgPSBwcmVwX3NlZ21lbnQgKCBzZWdfdXNlcnB0ciwgZmlsZXN6LCBtZW1zeiApICkgIT0gMCApIHsKKwkJREJHQyAoIGltYWdlLCAiQ09NQk9PVCAlcDogY291bGQgbm90IHByZXBhcmUgc2VnbWVudDogJXNcbiIsCisJCSAgICAgICBpbWFnZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBaZXJvIFBTUCAqLworCW1lbXNldF91c2VyICggc2VnX3VzZXJwdHIsIDAsIDAsIDB4MTAwICk7CisKKwkvKiBDb3B5IGltYWdlIHRvIHNlZ21lbnQ6MDEwMCAqLworCW1lbWNweV91c2VyICggc2VnX3VzZXJwdHIsIDB4MTAwLCBpbWFnZS0+ZGF0YSwgMCwgaW1hZ2UtPmxlbiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogTG9hZCBDT01CT09UIGltYWdlIGludG8gbWVtb3J5CisgKgorICogQHYgaW1hZ2UJCUNPTUJPT1QgaW1hZ2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGNvbWJvb3RfbG9hZCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJaW50IHJjOworCisJREJHQyAoIGltYWdlLCAiQ09NQk9PVCAlcDogbmFtZSAnJXMnXG4iLAorCSAgICAgICBpbWFnZSwgaW1hZ2UtPm5hbWUgKTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBDT01CT09UIGltYWdlICovCisJaWYgKCAoIHJjID0gY29tYm9vdF9pZGVudGlmeSAoIGltYWdlICkgKSAhPSAwICkgeworCQkKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFRoaXMgaXMgYSAxNi1iaXQgQ09NQk9PVCBpbWFnZSwgdmFsaWQgb3Igb3RoZXJ3aXNlICovCisJaWYgKCAhIGltYWdlLT50eXBlICkKKwkJaW1hZ2UtPnR5cGUgPSAmY29tYm9vdF9pbWFnZV90eXBlOworCQorCS8qIFNhbml0eSBjaGVjayBmb3IgZmlsZXNpemUgKi8KKwlpZiggaW1hZ2UtPmxlbiA+PSAweEZGMDAgKSB7CisJCURCR0MoIGltYWdlLCAiQ09NQk9PVCAlcDogaW1hZ2UgdG9vIGxhcmdlXG4iLAorCQkgICAgICBpbWFnZSApOworCQlyZXR1cm4gLUVOT0VYRUM7CisJfQorCisJLyogUHJlcGFyZSBzZWdtZW50IGFuZCBsb2FkIGltYWdlICovCisJaWYgKCAoIHJjID0gY29tYm9vdF9wcmVwYXJlX3NlZ21lbnQgKCBpbWFnZSApICkgIT0gMCApIHsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKiogU1lTTElOVVggQ09NQk9PVCAoMTYtYml0KSBpbWFnZSB0eXBlICovCitzdHJ1Y3QgaW1hZ2VfdHlwZSBjb21ib290X2ltYWdlX3R5cGUgX19pbWFnZV90eXBlICggUFJPQkVfTk9STUFMICkgPSB7CisJLm5hbWUgPSAiQ09NQk9PVCIsCisJLmxvYWQgPSBjb21ib290X2xvYWQsCisJLmV4ZWMgPSBjb21ib290X2V4ZWMsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ltYWdlL2VsZmJvb3QuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9lbGZib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxMDQwZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9lbGZib290LmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGdweGUvaW1hZ2UuaD4KKyNpbmNsdWRlIDxncHhlL2VsZi5oPgorI2luY2x1ZGUgPGdweGUvZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKworLyoqCisgKiBAZmlsZQorICoKKyAqIEVMRiBib290YWJsZSBpbWFnZQorICoKKyAqLworCitGRUFUVVJFICggRkVBVFVSRV9JTUFHRSwgIkVMRiIsIERIQ1BfRUJfRkVBVFVSRV9FTEYsIDEgKTsKKworc3RydWN0IGltYWdlX3R5cGUgZWxmYm9vdF9pbWFnZV90eXBlIF9faW1hZ2VfdHlwZSAoIFBST0JFX05PUk1BTCApOworCisvKioKKyAqIEV4ZWN1dGUgRUxGIGltYWdlCisgKgorICogQHYgaW1hZ2UJCUVMRiBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZWxmYm9vdF9leGVjICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwlwaHlzYWRkcl90IGVudHJ5ID0gaW1hZ2UtPnByaXYucGh5czsKKworCS8qIEFuIEVMRiBpbWFnZSBoYXMgbm8gY2FsbGJhY2sgaW50ZXJmYWNlLCBzbyB3ZSBuZWVkIHRvIHNodXQKKwkgKiBkb3duIGJlZm9yZSBpbnZva2luZyBpdC4KKwkgKi8KKwlzaHV0ZG93biAoIFNIVVRET1dOX0JPT1QgKTsKKworCS8qIEp1bXAgdG8gT1Mgd2l0aCBmbGF0IHBoeXNpY2FsIGFkZHJlc3NpbmcgKi8KKwlEQkdDICggaW1hZ2UsICJFTEYgJXAgc3RhcnRpbmcgZXhlY3V0aW9uIGF0ICVseFxuIiwgaW1hZ2UsIGVudHJ5ICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBQSFlTX0NPREUgKCAiY2FsbCAqJSVlZGlcblx0IiApCisJCQkgICAgICAgOiA6ICJEIiAoIGVudHJ5ICkKKwkJCSAgICAgICA6ICJlYXgiLCAiZWJ4IiwgImVjeCIsICJlZHgiLCAiZXNpIiwgImVicCIsCisJCQkgICAgICAgICAibWVtb3J5IiApOworCisJREJHQyAoIGltYWdlLCAiRUxGICVwIHJldHVybmVkXG4iLCBpbWFnZSApOworCisJLyogSXQgaXNuJ3Qgc2FmZSB0byBjb250aW51ZSBhZnRlciBjYWxsaW5nIHNodXRkb3duKCkgKi8KKwl3aGlsZSAoIDEgKSB7fQorCisJcmV0dXJuIC1FQ0FOQ0VMRUQ7ICAvKiAtRUlNUE9TU0lCTEUsIGFueW9uZT8gKi8KK30KKworLyoqCisgKiBMb2FkIEVMRiBpbWFnZSBpbnRvIG1lbW9yeQorICoKKyAqIEB2IGltYWdlCQlFTEYgZmlsZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZWxmYm9vdF9sb2FkICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwlFbGYzMl9FaGRyIGVoZHI7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgZV9pZGVudFtdID0geworCQlbRUlfTUFHMF0JPSBFTEZNQUcwLAorCQlbRUlfTUFHMV0JPSBFTEZNQUcxLAorCQlbRUlfTUFHMl0JPSBFTEZNQUcyLAorCQlbRUlfTUFHM10JPSBFTEZNQUczLAorCQlbRUlfQ0xBU1NdCT0gRUxGQ0xBU1MzMiwKKwkJW0VJX0RBVEFdCT0gRUxGREFUQTJMU0IsCisJCVtFSV9WRVJTSU9OXQk9IEVWX0NVUlJFTlQsCisJfTsKKwlpbnQgcmM7CisKKwkvKiBSZWFkIEVMRiBoZWFkZXIgKi8KKwljb3B5X2Zyb21fdXNlciAoICZlaGRyLCBpbWFnZS0+ZGF0YSwgMCwgc2l6ZW9mICggZWhkciApICk7CisJaWYgKCBtZW1jbXAgKCBlaGRyLmVfaWRlbnQsIGVfaWRlbnQsIHNpemVvZiAoIGVfaWRlbnQgKSApICE9IDAgKSB7CisJCURCRyAoICJJbnZhbGlkIEVMRiBpZGVudGlmaWVyXG4iICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkvKiBUaGlzIGlzIGFuIEVMRiBpbWFnZSwgdmFsaWQgb3Igb3RoZXJ3aXNlICovCisJaWYgKCAhIGltYWdlLT50eXBlICkKKwkJaW1hZ2UtPnR5cGUgPSAmZWxmYm9vdF9pbWFnZV90eXBlOworCisJLyogTG9hZCB0aGUgaW1hZ2UgdXNpbmcgY29yZSBFTEYgc3VwcG9ydCAqLworCWlmICggKCByYyA9IGVsZl9sb2FkICggaW1hZ2UgKSApICE9IDAgKSB7CisJCURCR0MgKCBpbWFnZSwgIkVMRiAlcCBjb3VsZCBub3QgbG9hZDogJXNcbiIsCisJCSAgICAgICBpbWFnZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqIEVMRiBpbWFnZSB0eXBlICovCitzdHJ1Y3QgaW1hZ2VfdHlwZSBlbGZib290X2ltYWdlX3R5cGUgX19pbWFnZV90eXBlICggUFJPQkVfTk9STUFMICkgPSB7CisJLm5hbWUgPSAiRUxGIiwKKwkubG9hZCA9IGVsZmJvb3RfbG9hZCwKKwkuZXhlYyA9IGVsZmJvb3RfZXhlYywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvZWx0b3JpdG8uYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9lbHRvcml0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZWIyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvZWx0b3JpdG8uYwpAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZmlsZQorICoKKyAqIEVsIFRvcml0byBib290YWJsZSBJU08gaW1hZ2UgZm9ybWF0CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Ym9vdHNlY3Rvci5oPgorI2luY2x1ZGUgPGludDEzLmg+CisjaW5jbHVkZSA8Z3B4ZS91YWNjZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbWFnZS5oPgorI2luY2x1ZGUgPGdweGUvc2VnbWVudC5oPgorI2luY2x1ZGUgPGdweGUvcmFtZGlzay5oPgorI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorCisjZGVmaW5lIElTTzk2NjBfQkxLU0laRSAyMDQ4CisjZGVmaW5lIEVMVE9SSVRPX1ZPTF9ERVNDX09GRlNFVCAoIDE3ICogSVNPOTY2MF9CTEtTSVpFICkKKworLyoqIEFuIEVsIFRvcml0byBCb290IFJlY29yZCBWb2x1bWUgRGVzY3JpcHRvciAqLworc3RydWN0IGVsdG9yaXRvX3ZvbF9kZXNjIHsKKwkvKiogQm9vdCByZWNvcmQgaW5kaWNhdG9yOyBtdXN0IGJlIDAgKi8KKwl1aW50OF90IHJlY29yZF9pbmRpY2F0b3I7CisJLyoqIElTTy05NjYwIGlkZW50aWZpZXI7IG11c3QgYmUgIkNEMDAxIiAqLworCXVpbnQ4X3QgaXNvOTY2MF9pZFs1XTsKKwkvKiogVmVyc2lvbiwgbXVzdCBiZSAxICovCisJdWludDhfdCB2ZXJzaW9uOworCS8qKiBCb290IHN5c3RlbSBpbmRpY2F0b3I7IG11c3QgYmUgIkVMIFRPUklUTyBTUEVDSUZJQ0FUSU9OIiAqLworCXVpbnQ4X3Qgc3lzdGVtX2luZGljYXRvclszMl07CisJLyoqIFVudXNlZCAqLworCXVpbnQ4X3QgdW51c2VkWzMyXTsKKwkvKiogQm9vdCBjYXRhbG9nIHNlY3RvciAqLworCXVpbnQzMl90IHNlY3RvcjsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBbiBFbCBUb3JpdG8gQm9vdCBDYXRhbG9nIFZhbGlkYXRpb24gRW50cnkgKi8KK3N0cnVjdCBlbHRvcml0b192YWxpZGF0aW9uX2VudHJ5IHsKKwkvKiogSGVhZGVyIElEOyBtdXN0IGJlIDEgKi8KKwl1aW50OF90IGhlYWRlcl9pZDsKKwkvKiogUGxhdGZvcm0gSUQKKwkgKgorCSAqIDAgPSA4MHg4NgorCSAqIDEgPSBQb3dlclBDCisJICogMiA9IE1hYworCSAqLworCXVpbnQ4X3QgcGxhdGZvcm1faWQ7CisJLyoqIFJlc2VydmVkICovCisJdWludDE2X3QgcmVzZXJ2ZWQ7CisJLyoqIElEIHN0cmluZyAqLworCXVpbnQ4X3QgaWRfc3RyaW5nWzI0XTsKKwkvKiogQ2hlY2tzdW0gd29yZCAqLworCXVpbnQxNl90IGNoZWNrc3VtOworCS8qKiBTaWduYXR1cmU7IG11c3QgYmUgMHhhYTU1ICovCisJdWludDE2X3Qgc2lnbmF0dXJlOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgYm9vdGFibGUgZW50cnkgaW4gdGhlIEVsIFRvcml0byBCb290IENhdGFsb2cgKi8KK3N0cnVjdCBlbHRvcml0b19ib290X2VudHJ5IHsKKwkvKiogQm9vdCBpbmRpY2F0b3IKKwkgKgorCSAqIE11c3QgYmUgQGMgRUxUT1JJVE9fQk9PVEFCTEUgZm9yIGEgYm9vdGFibGUgSVNPIGltYWdlCisJICovCisJdWludDhfdCBpbmRpY2F0b3I7CisJLyoqIE1lZGlhIHR5cGUKKwkgKgorCSAqLworCXVpbnQ4X3QgbWVkaWFfdHlwZTsKKwkvKiogTG9hZCBzZWdtZW50ICovCisJdWludDE2X3QgbG9hZF9zZWdtZW50OworCS8qKiBTeXN0ZW0gdHlwZSAqLworCXVpbnQ4X3QgZmlsZXN5c3RlbTsKKwkvKiogVW51c2VkICovCisJdWludDhfdCByZXNlcnZlZF9hOworCS8qKiBTZWN0b3IgY291bnQgKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJLyoqIFN0YXJ0aW5nIHNlY3RvciAqLworCXVpbnQzMl90IHN0YXJ0OworCS8qKiBVbnVzZWQgKi8KKwl1aW50OF90IHJlc2VydmVkX2JbMjBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEJvb3QgaW5kaWNhdG9yIGZvciBhIGJvb3RhYmxlIElTTyBpbWFnZSAqLworI2RlZmluZSBFTFRPUklUT19CT09UQUJMRSAweDg4CisKKy8qKiBFbCBUb3JpdG8gbWVkaWEgdHlwZXMgKi8KK2VudW0gZWx0b3JpdG9fbWVkaWFfdHlwZSB7CisJLyoqIE5vIGVtdWxhdGlvbiAqLworCUVMVE9SSVRPX05PX0VNVUxBVElPTiA9IDAsCit9OworCitzdHJ1Y3QgaW1hZ2VfdHlwZSBlbHRvcml0b19pbWFnZV90eXBlIF9faW1hZ2VfdHlwZSAoIFBST0JFX05PUk1BTCApOworCisvKioKKyAqIENhbGN1bGF0ZSAxNi1iaXQgd29yZCBjaGVja3N1bQorICoKKyAqIEB2IGRhdGEJCURhdGEgdG8gY2hlY2tzdW0KKyAqIEB2IGxlbgkJTGVuZ3RoIChpbiBieXRlcywgbXVzdCBiZSBldmVuKQorICogQHJldCBzdW0JCUNoZWNrc3VtCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgd29yZF9jaGVja3N1bSAoIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJdWludDE2X3QgKndvcmRzOworCXVpbnQxNl90IHN1bSA9IDA7CisKKwlmb3IgKCB3b3JkcyA9IGRhdGEgOyBsZW4gOyB3b3JkcysrLCBsZW4gLT0gMiApIHsKKwkJc3VtICs9ICp3b3JkczsKKwl9CisJcmV0dXJuIHN1bTsKK30KKworLyoqCisgKiBFeGVjdXRlIEVsIFRvcml0byBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlFbCBUb3JpdG8gaW1hZ2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGVsdG9yaXRvX2V4ZWMgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXN0cnVjdCByYW1kaXNrIHJhbWRpc2s7CisJc3RydWN0IGludDEzX2RyaXZlIGludDEzX2RyaXZlOworCXVuc2lnbmVkIGludCBsb2FkX3NlZ21lbnQgPSBpbWFnZS0+cHJpdi51bDsKKwl1bnNpZ25lZCBpbnQgbG9hZF9vZmZzZXQgPSAoIGxvYWRfc2VnbWVudCA/IDAgOiAweDdjMDAgKTsKKwlpbnQgcmM7CisKKwltZW1zZXQgKCAmcmFtZGlzaywgMCwgc2l6ZW9mICggcmFtZGlzayApICk7CisJaW5pdF9yYW1kaXNrICggJnJhbWRpc2ssIGltYWdlLT5kYXRhLCBpbWFnZS0+bGVuLCBJU085NjYwX0JMS1NJWkUgKTsKKwkKKwltZW1zZXQgKCAmaW50MTNfZHJpdmUsIDAsIHNpemVvZiAoIGludDEzX2RyaXZlICkgKTsKKwlpbnQxM19kcml2ZS5ibG9ja2RldiA9ICZyYW1kaXNrLmJsb2NrZGV2OworCXJlZ2lzdGVyX2ludDEzX2RyaXZlICggJmludDEzX2RyaXZlICk7CisKKwlpZiAoICggcmMgPSBjYWxsX2Jvb3RzZWN0b3IgKCBsb2FkX3NlZ21lbnQsIGxvYWRfb2Zmc2V0LCAKKwkJCQkgICAgICBpbnQxM19kcml2ZS5kcml2ZSApICkgIT0gMCApIHsKKwkJREJHQyAoIGltYWdlLCAiRWxUb3JpdG8gJXAgYm9vdCBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICAgaW1hZ2UsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycjsKKwl9CisJCisJcmMgPSAtRUNBTkNFTEVEOyAvKiAtRUlNUE9TU0lCTEUgKi8KKyBlcnI6CisJdW5yZWdpc3Rlcl9pbnQxM19kcml2ZSAoICZpbnQxM19kcml2ZSApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZWFkIGFuZCB2ZXJpZnkgRWwgVG9yaXRvIEJvb3QgUmVjb3JkIFZvbHVtZSBEZXNjcmlwdG9yCisgKgorICogQHYgaW1hZ2UJCUVsIFRvcml0byBmaWxlCisgKiBAcmV0IGNhdGFsb2dfb2Zmc2V0CU9mZnNldCBvZiBCb290IENhdGFsb2cKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGVsdG9yaXRvX3JlYWRfdm9sZGVzYyAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsCisJCQkJICAgdW5zaWduZWQgbG9uZyAqY2F0YWxvZ19vZmZzZXQgKSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBlbHRvcml0b192b2xfZGVzYyB2b2xfZGVzY19zaWduYXR1cmUgPSB7CisJCS5yZWNvcmRfaW5kaWNhdG9yID0gMCwKKwkJLmlzbzk2NjBfaWQgPSAiQ0QwMDEiLAorCQkudmVyc2lvbiA9IDEsCisJCS5zeXN0ZW1faW5kaWNhdG9yID0gIkVMIFRPUklUTyBTUEVDSUZJQ0FUSU9OIiwKKwl9OworCXN0cnVjdCBlbHRvcml0b192b2xfZGVzYyB2b2xfZGVzYzsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggaW1hZ2UtPmxlbiA8ICggRUxUT1JJVE9fVk9MX0RFU0NfT0ZGU0VUICsgSVNPOTY2MF9CTEtTSVpFICkgKSB7CisJCURCR0MgKCBpbWFnZSwgIkVsVG9yaXRvICVwIHRvbyBzaG9ydFxuIiwgaW1hZ2UgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCS8qIFJlYWQgYW5kIHZlcmlmeSBCb290IFJlY29yZCBWb2x1bWUgRGVzY3JpcHRvciAqLworCWNvcHlfZnJvbV91c2VyICggJnZvbF9kZXNjLCBpbWFnZS0+ZGF0YSwgRUxUT1JJVE9fVk9MX0RFU0NfT0ZGU0VULAorCQkJIHNpemVvZiAoIHZvbF9kZXNjICkgKTsKKwlpZiAoIG1lbWNtcCAoICZ2b2xfZGVzYywgJnZvbF9kZXNjX3NpZ25hdHVyZSwKKwkJICAgICAgb2Zmc2V0b2YgKCB0eXBlb2YgKCB2b2xfZGVzYyApLCBzZWN0b3IgKSApICE9IDAgKSB7CisJCURCR0MgKCBpbWFnZSwgIkVsVG9yaXRvICVwIGludmFsaWQgQm9vdCBSZWNvcmQgVm9sdW1lICIKKwkJICAgICAgICJEZXNjcmlwdG9yXG4iLCBpbWFnZSApOworCQlyZXR1cm4gLUVOT0VYRUM7CisJfQorCSpjYXRhbG9nX29mZnNldCA9ICggdm9sX2Rlc2Muc2VjdG9yICogSVNPOTY2MF9CTEtTSVpFICk7CisKKwlEQkdDICggaW1hZ2UsICJFbFRvcml0byAlcCBib290IGNhdGFsb2cgYXQgb2Zmc2V0ICUjbHhcbiIsCisJICAgICAgIGltYWdlLCAqY2F0YWxvZ19vZmZzZXQgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlYWQgYW5kIHZlcmlmeSBFbCBUb3JpdG8gQm9vdCBDYXRhbG9nCisgKgorICogQHYgaW1hZ2UJCUVsIFRvcml0byBmaWxlCisgKiBAdiBjYXRhbG9nX29mZnNldAlPZmZzZXQgb2YgQm9vdCBDYXRhbG9nCisgKiBAcmV0IGJvb3RfZW50cnkJRWwgVG9yaXRvIGJvb3QgZW50cnkKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGVsdG9yaXRvX3JlYWRfY2F0YWxvZyAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsCisJCQkJICAgdW5zaWduZWQgbG9uZyBjYXRhbG9nX29mZnNldCwKKwkJCQkgICBzdHJ1Y3QgZWx0b3JpdG9fYm9vdF9lbnRyeSAqYm9vdF9lbnRyeSApIHsKKwlzdHJ1Y3QgZWx0b3JpdG9fdmFsaWRhdGlvbl9lbnRyeSB2YWxpZGF0aW9uX2VudHJ5OworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCBpbWFnZS0+bGVuIDwgKCBjYXRhbG9nX29mZnNldCArIElTTzk2NjBfQkxLU0laRSApICkgeworCQlEQkdDICggaW1hZ2UsICJFbFRvcml0byAlcCBiYWQgYm9vdCBjYXRhbG9nIG9mZnNldCAlI2x4XG4iLAorCQkgICAgICAgaW1hZ2UsIGNhdGFsb2dfb2Zmc2V0ICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkvKiBSZWFkIGFuZCB2ZXJpZnkgdGhlIFZhbGlkYXRpb24gRW50cnkgb2YgdGhlIEJvb3QgQ2F0YWxvZyAqLworCWNvcHlfZnJvbV91c2VyICggJnZhbGlkYXRpb25fZW50cnksIGltYWdlLT5kYXRhLCBjYXRhbG9nX29mZnNldCwKKwkJCSBzaXplb2YgKCB2YWxpZGF0aW9uX2VudHJ5ICkgKTsKKwlpZiAoIHdvcmRfY2hlY2tzdW0gKCAmdmFsaWRhdGlvbl9lbnRyeSwKKwkJCSAgICAgc2l6ZW9mICggdmFsaWRhdGlvbl9lbnRyeSApICkgIT0gMCApIHsKKwkJREJHQyAoIGltYWdlLCAiRWxUb3JpdG8gJXAgYmFkIFZhbGlkYXRpb24gRW50cnkgY2hlY2tzdW1cbiIsCisJCSAgICAgICBpbWFnZSApOworCQlyZXR1cm4gLUVOT0VYRUM7CisJfQorCisJLyogUmVhZCBhbmQgdmVyaWZ5IHRoZSBJbml0aWFsL0RlZmF1bHQgZW50cnkgKi8KKwljb3B5X2Zyb21fdXNlciAoIGJvb3RfZW50cnksIGltYWdlLT5kYXRhLAorCQkJICggY2F0YWxvZ19vZmZzZXQgKyBzaXplb2YgKCB2YWxpZGF0aW9uX2VudHJ5ICkgKSwKKwkJCSBzaXplb2YgKCAqYm9vdF9lbnRyeSApICk7CisJaWYgKCBib290X2VudHJ5LT5pbmRpY2F0b3IgIT0gRUxUT1JJVE9fQk9PVEFCTEUgKSB7CisJCURCR0MgKCBpbWFnZSwgIkVsVG9yaXRvICVwIG5vdCBib290YWJsZVxuIiwgaW1hZ2UgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKwlpZiAoIGJvb3RfZW50cnktPm1lZGlhX3R5cGUgIT0gRUxUT1JJVE9fTk9fRU1VTEFUSU9OICkgeworCQlEQkdDICggaW1hZ2UsICJFbFRvcml0byAlcCBjYW5ub3Qgc3VwcG9ydCBtZWRpYSB0eXBlICVkXG4iLAorCQkgICAgICAgaW1hZ2UsIGJvb3RfZW50cnktPm1lZGlhX3R5cGUgKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KKworCURCR0MgKCBpbWFnZSwgIkVsVG9yaXRvICVwIG1lZGlhIHR5cGUgJWQgc2VnbWVudCAlMDR4XG4iLAorCSAgICAgICBpbWFnZSwgYm9vdF9lbnRyeS0+bWVkaWFfdHlwZSwgYm9vdF9lbnRyeS0+bG9hZF9zZWdtZW50ICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBMb2FkIEVsIFRvcml0byB2aXJ0dWFsIGRpc2sgaW1hZ2UgaW50byBtZW1vcnkKKyAqCisgKiBAdiBpbWFnZQkJRWwgVG9yaXRvIGZpbGUKKyAqIEB2IGJvb3RfZW50cnkJRWwgVG9yaXRvIGJvb3QgZW50cnkKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGVsdG9yaXRvX2xvYWRfZGlzayAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsCisJCQkJc3RydWN0IGVsdG9yaXRvX2Jvb3RfZW50cnkgKmJvb3RfZW50cnkgKSB7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9ICggYm9vdF9lbnRyeS0+c3RhcnQgKiBJU085NjYwX0JMS1NJWkUgKTsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aCA9ICggYm9vdF9lbnRyeS0+bGVuZ3RoICogSVNPOTY2MF9CTEtTSVpFICk7CisJdW5zaWduZWQgaW50IGxvYWRfc2VnbWVudDsKKwl1c2VycHRyX3QgYnVmZmVyOworCWludCByYzsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggaW1hZ2UtPmxlbiA8ICggc3RhcnQgKyBsZW5ndGggKSApIHsKKwkJREJHQyAoIGltYWdlLCAiRWxUb3JpdG8gJXAgdmlydHVhbCBkaXNrIGxpZXMgb3V0c2lkZSBpbWFnZVxuIiwKKwkJICAgICAgIGltYWdlICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisJREJHQyAoIGltYWdlLCAiRWxUb3JpdG8gJXAgdmlydHVhbCBkaXNrIGF0ICUjbHgrJSNseFxuIiwKKwkgICAgICAgaW1hZ2UsIHN0YXJ0LCBsZW5ndGggKTsKKworCS8qIENhbGN1bGF0ZSBsb2FkIGFkZHJlc3MgKi8KKwlsb2FkX3NlZ21lbnQgPSBib290X2VudHJ5LT5sb2FkX3NlZ21lbnQ7CisJYnVmZmVyID0gcmVhbF90b191c2VyICggbG9hZF9zZWdtZW50LCAoIGxvYWRfc2VnbWVudCA/IDAgOiAweDdjMDAgKSApOworCisJLyogVmVyaWZ5IGFuZCBwcmVwYXJlIHNlZ21lbnQgKi8KKwlpZiAoICggcmMgPSBwcmVwX3NlZ21lbnQgKCBidWZmZXIsIGxlbmd0aCwgbGVuZ3RoICkgKSAhPSAwICkgeworCQlEQkdDICggaW1hZ2UsICJFbFRvcml0byAlcCBjb3VsZCBub3QgcHJlcGFyZSBzZWdtZW50OiAlc1xuIiwKKwkJICAgICAgIGltYWdlLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIENvcHkgaW1hZ2UgdG8gc2VnbWVudCAqLworCW1lbWNweV91c2VyICggYnVmZmVyLCAwLCBpbWFnZS0+ZGF0YSwgc3RhcnQsIGxlbmd0aCApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogTG9hZCBFbCBUb3JpdG8gaW1hZ2UgaW50byBtZW1vcnkKKyAqCisgKiBAdiBpbWFnZQkJRWwgVG9yaXRvIGZpbGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGVsdG9yaXRvX2xvYWQgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXN0cnVjdCBlbHRvcml0b19ib290X2VudHJ5IGJvb3RfZW50cnk7CisJdW5zaWduZWQgbG9uZyBib290Y2F0X29mZnNldDsKKwlpbnQgcmM7CisKKwkvKiBSZWFkIEJvb3QgUmVjb3JkIFZvbHVtZSBEZXNjcmlwdG9yLCBpZiBwcmVzZW50ICovCisJaWYgKCAoIHJjID0gZWx0b3JpdG9fcmVhZF92b2xkZXNjICggaW1hZ2UsICZib290Y2F0X29mZnNldCApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIFRoaXMgaXMgYW4gRWwgVG9yaXRvIGltYWdlLCB2YWxpZCBvciBvdGhlcndpc2UgKi8KKwlpZiAoICEgaW1hZ2UtPnR5cGUgKQorCQlpbWFnZS0+dHlwZSA9ICZlbHRvcml0b19pbWFnZV90eXBlOworCisJLyogUmVhZCBCb290IENhdGFsb2cgKi8KKwlpZiAoICggcmMgPSBlbHRvcml0b19yZWFkX2NhdGFsb2cgKCBpbWFnZSwgYm9vdGNhdF9vZmZzZXQsCisJCQkJCSAgICAmYm9vdF9lbnRyeSApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIExvYWQgVmlydHVhbCBEaXNrIGltYWdlICovCisJaWYgKCAoIHJjID0gZWx0b3JpdG9fbG9hZF9kaXNrICggaW1hZ2UsICZib290X2VudHJ5ICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogUmVjb3JkIGxvYWQgc2VnbWVudCBpbiBpbWFnZSBwcml2YXRlIGRhdGEgZmllbGQgKi8KKwlpbWFnZS0+cHJpdi51bCA9IGJvb3RfZW50cnkubG9hZF9zZWdtZW50OworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBFbCBUb3JpdG8gaW1hZ2UgdHlwZSAqLworc3RydWN0IGltYWdlX3R5cGUgZWx0b3JpdG9faW1hZ2VfdHlwZSBfX2ltYWdlX3R5cGUgKCBQUk9CRV9OT1JNQUwgKSA9IHsKKwkubmFtZSA9ICJFbCBUb3JpdG8iLAorCS5sb2FkID0gZWx0b3JpdG9fbG9hZCwKKwkuZXhlYyA9IGVsdG9yaXRvX2V4ZWMsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ltYWdlL211bHRpYm9vdC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ltYWdlL211bHRpYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjIwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvbXVsdGlib290LmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBNdWx0aWJvb3QgaW1hZ2UgZm9ybWF0CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxtdWx0aWJvb3QuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2ltYWdlLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9tZW1tYXAuaD4KKyNpbmNsdWRlIDxncHhlL2VsZi5oPgorI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorI2luY2x1ZGUgPGdweGUvZmVhdHVyZXMuaD4KKworRkVBVFVSRSAoIEZFQVRVUkVfSU1BR0UsICJNdWx0aWJvb3QiLCBESENQX0VCX0ZFQVRVUkVfTVVMVElCT09ULCAxICk7CisKK3N0cnVjdCBpbWFnZV90eXBlIG11bHRpYm9vdF9pbWFnZV90eXBlIF9faW1hZ2VfdHlwZSAoIFBST0JFX01VTFRJQk9PVCApOworCisvKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIG1vZHVsZXMgd2Ugd2lsbCBhbGxvdyBmb3IKKyAqCisgKiBJZiB0aGlzIGhhcyBiaXR0ZW4geW91OiBzb3JyeS4gIEkgZGlkIGhhdmUgYSBwZXJmZWN0IHNjaGVtZSB3aXRoIGEKKyAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBsaXN0IG9mIG1vZHVsZXMgb24gdGhlIHByb3RlY3RlZC1tb2RlIHN0YWNrLAorICogYnV0IGl0IHdhcyBpbmNvbXBhdGlibGUgd2l0aCBzb21lIGJyb2tlbiBPU2VzIHRoYXQgY2FuIG9ubHkgYWNjZXNzCisgKiBsb3cgbWVtb3J5IGF0IGJvb3QgdGltZSAoZXZlbiB0aG91Z2ggd2Uga2luZGx5IHNldCB1cCA0R0IgZmxhdAorICogcGh5c2ljYWwgYWRkcmVzc2luZyBhcyBwZXIgdGhlIG11bHRpYm9vdCBzcGVjaWZpY2F0aW9uLgorICoKKyAqLworI2RlZmluZSBNQVhfTU9EVUxFUyA4CisKKy8qKgorICogTWF4aW11bSBjb21iaW5lZCBsZW5ndGggb2YgY29tbWFuZCBsaW5lcworICoKKyAqIEFnYWluOyBzb3JyeS4gIFNvbWUgYnJva2VuIE9TZXMgemVybyBvdXQgYW55IG5vbi1iYXNlIG1lbW9yeSB0aGF0CisgKiBpc24ndCBwYXJ0IG9mIHRoZSBsb2FkZWQgbW9kdWxlIHNldCwgc28gd2UgY2FuJ3QganVzdCB1c2UKKyAqIHZpcnRfdG9fcGh5cyhjbWRsaW5lKSB0byBwb2ludCB0byB0aGUgY29tbWFuZCBsaW5lcywgZXZlbiB0aG91Z2gKKyAqIHRoaXMgd291bGQgY29tcGx5IHdpdGggdGhlIE11bHRpYm9vdCBzcGVjLgorICovCisjZGVmaW5lIE1CX01BWF9DTURMSU5FIDUxMgorCisvKiogTXVsdGlib290IGZsYWdzIHRoYXQgd2Ugc3VwcG9ydCAqLworI2RlZmluZSBNQl9TVVBQT1JURURfRkxBR1MgKCBNQl9GTEFHX1BHQUxJR04gfCBNQl9GTEFHX01FTU1BUCB8IFwKKwkJCSAgICAgTUJfRkxBR19WSURNT0RFIHwgTUJfRkxBR19SQVcgKQorCisvKiogQ29tcHVsc29yeSBmZWF0dXJlIG11bHRpYm9vdCBmbGFncyAqLworI2RlZmluZSBNQl9DT01QVUxTT1JZX0ZMQUdTIDB4MDAwMGZmZmYKKworLyoqIE9wdGlvbmFsIGZlYXR1cmUgbXVsdGlib290IGZsYWdzICovCisjZGVmaW5lIE1CX09QVElPTkFMX0ZMQUdTIDB4ZmZmZjAwMDAKKworLyoqCisgKiBNdWx0aWJvb3QgZmxhZ3MgdGhhdCB3ZSBkb24ndCBzdXBwb3J0CisgKgorICogV2Ugb25seSBjYXJlIGFib3V0IHRoZSBjb21wdWxzb3J5IGZlYXR1cmUgZmxhZ3MgKGJpdHMgMC0xNSk7IHdlIGFyZQorICogYWxsb3dlZCB0byBpZ25vcmUgdGhlIG9wdGlvbmFsIGZlYXR1cmUgZmxhZ3MuCisgKi8KKyNkZWZpbmUgTUJfVU5TVVBQT1JURURfRkxBR1MgKCBNQl9DT01QVUxTT1JZX0ZMQUdTICYgfk1CX1NVUFBPUlRFRF9GTEFHUyApCisKKy8qKiBBIG11bHRpYm9vdCBoZWFkZXIgZGVzY3JpcHRvciAqLworc3RydWN0IG11bHRpYm9vdF9oZWFkZXJfaW5mbyB7CisJLyoqIFRoZSBhY3R1YWwgbXVsdGlib290IGhlYWRlciAqLworCXN0cnVjdCBtdWx0aWJvb3RfaGVhZGVyIG1iOworCS8qKiBPZmZzZXQgb2YgaGVhZGVyIHdpdGhpbiB0aGUgbXVsdGlib290IGltYWdlICovCisJc2l6ZV90IG9mZnNldDsKK307CisKKy8qKiBNdWx0aWJvb3QgbW9kdWxlIGNvbW1hbmQgbGluZXMgKi8KK3N0YXRpYyBjaGFyIF9fYnNzMTZfYXJyYXkgKCBtYl9jbWRsaW5lcywgW01CX01BWF9DTURMSU5FXSApOworI2RlZmluZSBtYl9jbWRsaW5lcyBfX3VzZV9kYXRhMTYgKCBtYl9jbWRsaW5lcyApCisKKy8qKiBPZmZzZXQgd2l0aGluIG1vZHVsZSBjb21tYW5kIGxpbmVzICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1iX2NtZGxpbmVfb2Zmc2V0OworCisvKioKKyAqIEJ1aWxkIG11bHRpYm9vdCBtZW1vcnkgbWFwCisgKgorICogQHYgaW1hZ2UJCU11bHRpYm9vdCBpbWFnZQorICogQHYgbWJpbmZvCQlNdWx0aWJvb3QgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiBAdiBtYm1lbW1hcAkJTXVsdGlib290IG1lbW9yeSBtYXAKKyAqIEB2IGxpbWl0CQlNYXhtaW11bSBudW1iZXIgb2YgbWVtb3J5IG1hcCBlbnRyaWVzCisgKi8KK3N0YXRpYyB2b2lkIG11bHRpYm9vdF9idWlsZF9tZW1tYXAgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLAorCQkJCSAgICAgc3RydWN0IG11bHRpYm9vdF9pbmZvICptYmluZm8sCisJCQkJICAgICBzdHJ1Y3QgbXVsdGlib290X21lbW9yeV9tYXAgKm1ibWVtbWFwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGxpbWl0ICkgeworCXN0cnVjdCBtZW1vcnlfbWFwIG1lbW1hcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEdldCBtZW1vcnkgbWFwICovCisJZ2V0X21lbW1hcCAoICZtZW1tYXAgKTsKKworCS8qIFRyYW5zbGF0ZSBpbnRvIG11bHRpYm9vdCBmb3JtYXQgKi8KKwltZW1zZXQgKCBtYm1lbW1hcCwgMCwgc2l6ZW9mICggKm1ibWVtbWFwICkgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBtZW1tYXAuY291bnQgOyBpKysgKSB7CisJCWlmICggaSA+PSBsaW1pdCApIHsKKwkJCURCR0MgKCBpbWFnZSwgIk1VTFRJQk9PVCAlcCBsaW1pdCBvZiAlZCBtZW1tYXAgIgorCQkJICAgICAgICJlbnRyaWVzIHJlYWNoZWRcbiIsIGltYWdlLCBsaW1pdCApOworCQkJYnJlYWs7CisJCX0KKwkJbWJtZW1tYXBbaV0uc2l6ZSA9ICggc2l6ZW9mICggbWJtZW1tYXBbaV0gKSAtCisJCQkJICAgICBzaXplb2YgKCBtYm1lbW1hcFtpXS5zaXplICkgKTsKKwkJbWJtZW1tYXBbaV0uYmFzZV9hZGRyID0gbWVtbWFwLnJlZ2lvbnNbaV0uc3RhcnQ7CisJCW1ibWVtbWFwW2ldLmxlbmd0aCA9ICggbWVtbWFwLnJlZ2lvbnNbaV0uZW5kIC0KKwkJCQkgICAgICAgbWVtbWFwLnJlZ2lvbnNbaV0uc3RhcnQgKTsKKwkJbWJtZW1tYXBbaV0udHlwZSA9IE1CTUVNX1JBTTsKKwkJbWJpbmZvLT5tbWFwX2xlbmd0aCArPSBzaXplb2YgKCBtYm1lbW1hcFtpXSApOworCQlpZiAoIG1lbW1hcC5yZWdpb25zW2ldLnN0YXJ0ID09IDAgKQorCQkJbWJpbmZvLT5tZW1fbG93ZXIgPSAoIG1lbW1hcC5yZWdpb25zW2ldLmVuZCAvIDEwMjQgKTsKKwkJaWYgKCBtZW1tYXAucmVnaW9uc1tpXS5zdGFydCA9PSAweDEwMDAwMCApCisJCQltYmluZm8tPm1lbV91cHBlciA9ICggKCBtZW1tYXAucmVnaW9uc1tpXS5lbmQgLQorCQkJCQkJMHgxMDAwMDAgKSAvIDEwMjQgKTsKKwl9Cit9CisKKy8qKgorICogQWRkIGNvbW1hbmQgbGluZSBpbiBiYXNlIG1lbW9yeQorICoKKyAqIEB2IGltZ25hbWUJCUltYWdlIG5hbWUKKyAqIEB2IGNtZGxpbmUJCUNvbW1hbmQgbGluZQorICogQHJldCBwaHlzYWRkcglQaHlzaWNhbCBhZGRyZXNzIG9mIGNvbW1hbmQgbGluZQorICovCitwaHlzYWRkcl90IG11bHRpYm9vdF9hZGRfY21kbGluZSAoIGNvbnN0IGNoYXIgKmltZ25hbWUsIGNvbnN0IGNoYXIgKmNtZGxpbmUgKSB7CisJY2hhciAqbWJfY21kbGluZTsKKworCWlmICggISBjbWRsaW5lICkKKwkJY21kbGluZSA9ICIiOworCisJLyogQ29weSBjb21tYW5kIGxpbmUgdG8gYmFzZSBtZW1vcnkgYnVmZmVyICovCisJbWJfY21kbGluZSA9ICggbWJfY21kbGluZXMgKyBtYl9jbWRsaW5lX29mZnNldCApOworCW1iX2NtZGxpbmVfb2Zmc2V0ICs9CisJCSggc25wcmludGYgKCBtYl9jbWRsaW5lLAorCQkJICAgICAoIHNpemVvZiAoIG1iX2NtZGxpbmVzICkgLSBtYl9jbWRsaW5lX29mZnNldCApLAorCQkJICAgICAiJXMgJXMiLCBpbWduYW1lLCBjbWRsaW5lICkgKyAxICk7CisKKwkvKiBUcnVuY2F0ZSB0byB0ZXJtaW5hdGluZyBOVUwgaW4gYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworCWlmICggbWJfY21kbGluZV9vZmZzZXQgPiBzaXplb2YgKCBtYl9jbWRsaW5lcyApICkKKwkJbWJfY21kbGluZV9vZmZzZXQgPSAoIHNpemVvZiAoIG1iX2NtZGxpbmVzICkgLSAxICk7CisKKwlyZXR1cm4gdmlydF90b19waHlzICggbWJfY21kbGluZSApOworfQorCisvKioKKyAqIEJ1aWxkIG11bHRpYm9vdCBtb2R1bGUgbGlzdAorICoKKyAqIEB2IGltYWdlCQlNdWx0aWJvb3QgaW1hZ2UKKyAqIEB2IG1vZHVsZXMJCU1vZHVsZSBsaXN0IHRvIGZpbGwsIG9yIE5VTEwKKyAqIEByZXQgY291bnQJCU51bWJlciBvZiBtb2R1bGVzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK211bHRpYm9vdF9idWlsZF9tb2R1bGVfbGlzdCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsCisJCQkgICAgICBzdHJ1Y3QgbXVsdGlib290X21vZHVsZSAqbW9kdWxlcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBsaW1pdCApIHsKKwlzdHJ1Y3QgaW1hZ2UgKm1vZHVsZV9pbWFnZTsKKwlzdHJ1Y3QgbXVsdGlib290X21vZHVsZSAqbW9kdWxlOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJdW5zaWduZWQgaW50IGluc2VydDsKKwlwaHlzYWRkcl90IHN0YXJ0OworCXBoeXNhZGRyX3QgZW5kOworCXVuc2lnbmVkIGludCBpOworCisJLyogQWRkIGVhY2ggaW1hZ2UgYXMgYSBtdWx0aWJvb3QgbW9kdWxlICovCisJZm9yX2VhY2hfaW1hZ2UgKCBtb2R1bGVfaW1hZ2UgKSB7CisKKwkJaWYgKCBjb3VudCA+PSBsaW1pdCApIHsKKwkJCURCR0MgKCBpbWFnZSwgIk1VTFRJQk9PVCAlcCBsaW1pdCBvZiAlZCBtb2R1bGVzICIKKwkJCSAgICAgICAicmVhY2hlZFxuIiwgaW1hZ2UsIGxpbWl0ICk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIERvIG5vdCBpbmNsdWRlIGtlcm5lbCBpbWFnZSBpdHNlbGYgYXMgYSBtb2R1bGUgKi8KKwkJaWYgKCBtb2R1bGVfaW1hZ2UgPT0gaW1hZ2UgKQorCQkJY29udGludWU7CisKKwkJLyogQXQgbGVhc3Qgc29tZSBPU2VzIGV4cGVjdCB0aGUgbXVsdGlib290IG1vZHVsZXMgdG8KKwkJICogYmUgaW4gYXNjZW5kaW5nIG9yZGVyLCBzbyB3ZSBoYXZlIHRvIHN1cHBvcnQgaXQuCisJCSAqLworCQlzdGFydCA9IHVzZXJfdG9fcGh5cyAoIG1vZHVsZV9pbWFnZS0+ZGF0YSwgMCApOworCQllbmQgPSB1c2VyX3RvX3BoeXMgKCBtb2R1bGVfaW1hZ2UtPmRhdGEsIG1vZHVsZV9pbWFnZS0+bGVuICk7CisJCWZvciAoIGluc2VydCA9IDAgOyBpbnNlcnQgPCBjb3VudCA7IGluc2VydCsrICkgeworCQkJaWYgKCBzdGFydCA8IG1vZHVsZXNbaW5zZXJ0XS5tb2Rfc3RhcnQgKQorCQkJCWJyZWFrOworCQl9CisJCW1vZHVsZSA9ICZtb2R1bGVzW2luc2VydF07CisJCW1lbW1vdmUgKCAoIG1vZHVsZSArIDEgKSwgbW9kdWxlLAorCQkJICAoICggY291bnQgLSBpbnNlcnQgKSAqIHNpemVvZiAoICptb2R1bGUgKSApICk7CisJCW1vZHVsZS0+bW9kX3N0YXJ0ID0gc3RhcnQ7CisJCW1vZHVsZS0+bW9kX2VuZCA9IGVuZDsKKwkJbW9kdWxlLT5zdHJpbmcgPSBtdWx0aWJvb3RfYWRkX2NtZGxpbmUgKCBtb2R1bGVfaW1hZ2UtPm5hbWUsCisJCQkJCQkgICAgICAgbW9kdWxlX2ltYWdlLT5jbWRsaW5lICk7CisJCW1vZHVsZS0+cmVzZXJ2ZWQgPSAwOworCQkKKwkJLyogV2UgcHJvbWlzZSB0byBwYWdlLWFsaWduIG1vZHVsZXMgKi8KKwkJYXNzZXJ0ICggKCBtb2R1bGUtPm1vZF9zdGFydCAmIDB4ZmZmICkgPT0gMCApOworCisJCWNvdW50Kys7CisJfQorCisJLyogRHVtcCBtb2R1bGUgY29uZmlndXJhdGlvbiAqLworCWZvciAoIGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrICkgeworCQlEQkdDICggaW1hZ2UsICJNVUxUSUJPT1QgJXAgbW9kdWxlICVkIGlzIFsleCwleClcbiIsCisJCSAgICAgICBpbWFnZSwgaSwgbW9kdWxlc1tpXS5tb2Rfc3RhcnQsCisJCSAgICAgICBtb2R1bGVzW2ldLm1vZF9lbmQgKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogVGhlIG11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKiBLZXB0IGluIGJhc2UgbWVtb3J5IGJlY2F1c2Ugc29tZSBPU2VzIHdvbid0IGZpbmQgaXQgZWxzZXdoZXJlLAorICogYWxvbmcgd2l0aCB0aGUgb3RoZXIgc3RydWN0dXJlcyBiZWxvbmdpbmcgdG8gdGhlIE11bHRpYm9vdAorICogaW5mb3JtYXRpb24gdGFibGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXVsdGlib290X2luZm8gX19ic3MxNiAoIG1iaW5mbyApOworI2RlZmluZSBtYmluZm8gX191c2VfZGF0YTE2ICggbWJpbmZvICkKKworLyoqIFRoZSBtdWx0aWJvb3QgYm9vdGxvYWRlciBuYW1lICovCitzdGF0aWMgY2hhciBfX2RhdGExNl9hcnJheSAoIG1iX2Jvb3Rsb2FkZXJfbmFtZSwgW10gKSA9ICJnUFhFICIgVkVSU0lPTjsKKyNkZWZpbmUgbWJfYm9vdGxvYWRlcl9uYW1lIF9fdXNlX2RhdGExNiAoIG1iX2Jvb3Rsb2FkZXJfbmFtZSApCisKKy8qKiBUaGUgbXVsdGlib290IG1lbW9yeSBtYXAgKi8KK3N0YXRpYyBzdHJ1Y3QgbXVsdGlib290X21lbW9yeV9tYXAKKwlfX2JzczE2X2FycmF5ICggbWJtZW1tYXAsIFtNQVhfTUVNT1JZX1JFR0lPTlNdICk7CisjZGVmaW5lIG1ibWVtbWFwIF9fdXNlX2RhdGExNiAoIG1ibWVtbWFwICkKKworLyoqIFRoZSBtdWx0aWJvb3QgbW9kdWxlIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgbXVsdGlib290X21vZHVsZSBfX2JzczE2X2FycmF5ICggbWJtb2R1bGVzLCBbTUFYX01PRFVMRVNdICk7CisjZGVmaW5lIG1ibW9kdWxlcyBfX3VzZV9kYXRhMTYgKCBtYm1vZHVsZXMgKQorCisvKioKKyAqIEV4ZWN1dGUgbXVsdGlib290IGltYWdlCisgKgorICogQHYgaW1hZ2UJCU11bHRpYm9vdCBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbXVsdGlib290X2V4ZWMgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXBoeXNhZGRyX3QgZW50cnkgPSBpbWFnZS0+cHJpdi5waHlzOworCisJLyogUG9wdWxhdGUgbXVsdGlib290IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLworCW1lbXNldCAoICZtYmluZm8sIDAsIHNpemVvZiAoIG1iaW5mbyApICk7CisJbWJpbmZvLmZsYWdzID0gKCBNQklfRkxBR19MT0FERVIgfCBNQklfRkxBR19NRU0gfCBNQklfRkxBR19NTUFQIHwKKwkJCSBNQklfRkxBR19DTURMSU5FIHwgTUJJX0ZMQUdfTU9EUyApOworCW1iX2NtZGxpbmVfb2Zmc2V0ID0gMDsKKwltYmluZm8uY21kbGluZSA9IG11bHRpYm9vdF9hZGRfY21kbGluZSAoIGltYWdlLT5uYW1lLCBpbWFnZS0+Y21kbGluZSApOworCW1iaW5mby5tb2RzX2NvdW50ID0gbXVsdGlib290X2J1aWxkX21vZHVsZV9saXN0ICggaW1hZ2UsIG1ibW9kdWxlcywKKwkJCQkoIHNpemVvZihtYm1vZHVsZXMpIC8gc2l6ZW9mKG1ibW9kdWxlc1swXSkgKSApOworCW1iaW5mby5tb2RzX2FkZHIgPSB2aXJ0X3RvX3BoeXMgKCBtYm1vZHVsZXMgKTsKKwltYmluZm8ubW1hcF9hZGRyID0gdmlydF90b19waHlzICggbWJtZW1tYXAgKTsKKwltYmluZm8uYm9vdF9sb2FkZXJfbmFtZSA9IHZpcnRfdG9fcGh5cyAoIG1iX2Jvb3Rsb2FkZXJfbmFtZSApOworCisJLyogTXVsdGlib290IGltYWdlcyBtYXkgbm90IHJldHVybiBhbmQgaGF2ZSBubyBjYWxsYmFjaworCSAqIGludGVyZmFjZSwgc28gc2h1dCBldmVyeXRoaW5nIGRvd24gcHJpb3IgdG8gYm9vdGluZyB0aGUgT1MuCisJICovCisJc2h1dGRvd24gKCBTSFVURE9XTl9CT09UICk7CisKKwkvKiBCdWlsZCBtZW1vcnkgbWFwIGFmdGVyIHVuaGlkaW5nIGJvb3Rsb2FkZXIgbWVtb3J5IHJlZ2lvbnMgYXMgcGFydCBvZgorCSAqIHNodXR0aW5nIGV2ZXJ5dGhpbmcgZG93bi4KKwkgKi8KKwltdWx0aWJvb3RfYnVpbGRfbWVtbWFwICggaW1hZ2UsICZtYmluZm8sIG1ibWVtbWFwLAorCQkJCSAoIHNpemVvZihtYm1lbW1hcCkgLyBzaXplb2YobWJtZW1tYXBbMF0pICkgKTsKKworCS8qIEp1bXAgdG8gT1Mgd2l0aCBmbGF0IHBoeXNpY2FsIGFkZHJlc3NpbmcgKi8KKwlEQkdDICggaW1hZ2UsICJNVUxUSUJPT1QgJXAgc3RhcnRpbmcgZXhlY3V0aW9uIGF0ICVseFxuIiwKKwkgICAgICAgaW1hZ2UsIGVudHJ5ICk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBQSFlTX0NPREUgKCAicHVzaGwgJSVlYnBcblx0IgorCQkJCQkgICAiY2FsbCAqJSVlZGlcblx0IgorCQkJCQkgICAicG9wbCAlJWVicFxuXHQiICkKKwkJCSAgICAgICA6IDogImEiICggTVVMVElCT09UX0JPT1RMT0FERVJfTUFHSUMgKSwKKwkJCSAgICAgICAgICAgImIiICggdmlydF90b19waHlzICggJm1iaW5mbyApICksCisJCQkgICAgICAgICAgICJEIiAoIGVudHJ5ICkKKwkJCSAgICAgICA6ICJlY3giLCAiZWR4IiwgImVzaSIsICJtZW1vcnkiICk7CisKKwlEQkdDICggaW1hZ2UsICJNVUxUSUJPT1QgJXAgcmV0dXJuZWRcbiIsIGltYWdlICk7CisKKwkvKiBJdCBpc24ndCBzYWZlIHRvIGNvbnRpbnVlIGFmdGVyIGNhbGxpbmcgc2h1dGRvd24oKSAqLworCXdoaWxlICggMSApIHt9CisKKwlyZXR1cm4gLUVDQU5DRUxFRDsgIC8qIC1FSU1QT1NTSUJMRSwgYW55b25lPyAqLworfQorCisvKioKKyAqIEZpbmQgbXVsdGlib290IGhlYWRlcgorICoKKyAqIEB2IGltYWdlCQlNdWx0aWJvb3QgZmlsZQorICogQHYgaGRyCQlNdWx0aWJvb3QgaGVhZGVyIGRlc2NyaXB0b3IgdG8gZmlsbCBpbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbXVsdGlib290X2ZpbmRfaGVhZGVyICggc3RydWN0IGltYWdlICppbWFnZSwKKwkJCQkgICBzdHJ1Y3QgbXVsdGlib290X2hlYWRlcl9pbmZvICpoZHIgKSB7CisJdWludDMyX3QgYnVmWzY0XTsKKwlzaXplX3Qgb2Zmc2V0OworCXVuc2lnbmVkIGludCBidWZfaWR4OworCXVpbnQzMl90IGNoZWNrc3VtOworCisJLyogU2NhbiB0aHJvdWdoIGZpcnN0IDhrQiBvZiBpbWFnZSBmaWxlIDI1NiBieXRlcyBhdCBhIHRpbWUuCisJICogKFVzZSB0aGUgYnVmZmVyaW5nIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBhCisJICogY29weV9mcm9tX3VzZXIoKSBmb3IgZXZlcnkgZHdvcmQuKQorCSAqLworCWZvciAoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCA4MTkyIDsgb2Zmc2V0ICs9IHNpemVvZiAoIGJ1ZlswXSApICkgeworCQkvKiBDaGVjayBmb3IgZW5kIG9mIGltYWdlICovCisJCWlmICggb2Zmc2V0ID4gaW1hZ2UtPmxlbiApCisJCQlicmVhazsKKwkJLyogUmVmaWxsIGJ1ZmZlciBpZiBhcHBsaWNhYmxlICovCisJCWJ1Zl9pZHggPSAoICggb2Zmc2V0ICUgc2l6ZW9mICggYnVmICkgKSAvIHNpemVvZiAoIGJ1ZlswXSApICk7CisJCWlmICggYnVmX2lkeCA9PSAwICkgeworCQkJY29weV9mcm9tX3VzZXIgKCBidWYsIGltYWdlLT5kYXRhLCBvZmZzZXQsCisJCQkJCSBzaXplb2YgKCBidWYgKSApOworCQl9CisJCS8qIENoZWNrIHNpZ25hdHVyZSAqLworCQlpZiAoIGJ1ZltidWZfaWR4XSAhPSBNVUxUSUJPT1RfSEVBREVSX01BR0lDICkKKwkJCWNvbnRpbnVlOworCQkvKiBDb3B5IGhlYWRlciBhbmQgdmVyaWZ5IGNoZWNrc3VtICovCisJCWNvcHlfZnJvbV91c2VyICggJmhkci0+bWIsIGltYWdlLT5kYXRhLCBvZmZzZXQsCisJCQkJIHNpemVvZiAoIGhkci0+bWIgKSApOworCQljaGVja3N1bSA9ICggaGRyLT5tYi5tYWdpYyArIGhkci0+bWIuZmxhZ3MgKworCQkJICAgICBoZHItPm1iLmNoZWNrc3VtICk7CisJCWlmICggY2hlY2tzdW0gIT0gMCApCisJCQljb250aW51ZTsKKwkJLyogUmVjb3JkIG9mZnNldCBvZiBtdWx0aWJvb3QgaGVhZGVyIGFuZCByZXR1cm4gKi8KKwkJaGRyLT5vZmZzZXQgPSBvZmZzZXQ7CisJCXJldHVybiAwOworCX0KKworCS8qIE5vIG11bHRpYm9vdCBoZWFkZXIgZm91bmQgKi8KKwlyZXR1cm4gLUVOT0VYRUM7Cit9CisKKy8qKgorICogTG9hZCByYXcgbXVsdGlib290IGltYWdlIGludG8gbWVtb3J5CisgKgorICogQHYgaW1hZ2UJCU11bHRpYm9vdCBmaWxlCisgKiBAdiBoZHIJCU11bHRpYm9vdCBoZWFkZXIgZGVzY3JpcHRvcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbXVsdGlib290X2xvYWRfcmF3ICggc3RydWN0IGltYWdlICppbWFnZSwKKwkJCQlzdHJ1Y3QgbXVsdGlib290X2hlYWRlcl9pbmZvICpoZHIgKSB7CisJc2l6ZV90IG9mZnNldDsKKwlzaXplX3QgZmlsZXN6OworCXNpemVfdCBtZW1zejsKKwl1c2VycHRyX3QgYnVmZmVyOworCWludCByYzsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggISAoIGhkci0+bWIuZmxhZ3MgJiBNQl9GTEFHX1JBVyApICkgeworCQlEQkdDICggaW1hZ2UsICJNVUxUSUJPT1QgJXAgaXMgbm90IGZsYWdnZWQgYXMgYSByYXcgaW1hZ2VcbiIsCisJCSAgICAgICBpbWFnZSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgYW5kIHByZXBhcmUgc2VnbWVudCAqLworCW9mZnNldCA9ICggaGRyLT5vZmZzZXQgLSBoZHItPm1iLmhlYWRlcl9hZGRyICsgaGRyLT5tYi5sb2FkX2FkZHIgKTsKKwlmaWxlc3ogPSAoIGhkci0+bWIubG9hZF9lbmRfYWRkciA/CisJCSAgICggaGRyLT5tYi5sb2FkX2VuZF9hZGRyIC0gaGRyLT5tYi5sb2FkX2FkZHIgKSA6CisJCSAgICggaW1hZ2UtPmxlbiAtIG9mZnNldCApICk7CisJbWVtc3ogPSAoIGhkci0+bWIuYnNzX2VuZF9hZGRyID8KKwkJICAoIGhkci0+bWIuYnNzX2VuZF9hZGRyIC0gaGRyLT5tYi5sb2FkX2FkZHIgKSA6IGZpbGVzeiApOworCWJ1ZmZlciA9IHBoeXNfdG9fdXNlciAoIGhkci0+bWIubG9hZF9hZGRyICk7CisJaWYgKCAoIHJjID0gcHJlcF9zZWdtZW50ICggYnVmZmVyLCBmaWxlc3osIG1lbXN6ICkgKSAhPSAwICkgeworCQlEQkdDICggaW1hZ2UsICJNVUxUSUJPT1QgJXAgY291bGQgbm90IHByZXBhcmUgc2VnbWVudDogJXNcbiIsCisJCSAgICAgICBpbWFnZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBDb3B5IGltYWdlIHRvIHNlZ21lbnQgKi8KKwltZW1jcHlfdXNlciAoIGJ1ZmZlciwgMCwgaW1hZ2UtPmRhdGEsIG9mZnNldCwgZmlsZXN6ICk7CisKKwkvKiBSZWNvcmQgZXhlY3V0aW9uIGVudHJ5IHBvaW50IGluIGltYWdlIHByaXZhdGUgZGF0YSBmaWVsZCAqLworCWltYWdlLT5wcml2LnBoeXMgPSBoZHItPm1iLmVudHJ5X2FkZHI7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBMb2FkIEVMRiBtdWx0aWJvb3QgaW1hZ2UgaW50byBtZW1vcnkKKyAqCisgKiBAdiBpbWFnZQkJTXVsdGlib290IGZpbGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IG11bHRpYm9vdF9sb2FkX2VsZiAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJaW50IHJjOworCisJLyogTG9hZCBFTEYgaW1hZ2UqLworCWlmICggKCByYyA9IGVsZl9sb2FkICggaW1hZ2UgKSApICE9IDAgKSB7CisJCURCR0MgKCBpbWFnZSwgIk1VTFRJQk9PVCAlcCBFTEYgaW1hZ2UgZmFpbGVkIHRvIGxvYWQ6ICVzXG4iLAorCQkgICAgICAgaW1hZ2UsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogTG9hZCBtdWx0aWJvb3QgaW1hZ2UgaW50byBtZW1vcnkKKyAqCisgKiBAdiBpbWFnZQkJTXVsdGlib290IGZpbGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IG11bHRpYm9vdF9sb2FkICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwlzdHJ1Y3QgbXVsdGlib290X2hlYWRlcl9pbmZvIGhkcjsKKwlpbnQgcmM7CisKKwkvKiBMb2NhdGUgbXVsdGlib290IGhlYWRlciwgaWYgcHJlc2VudCAqLworCWlmICggKCByYyA9IG11bHRpYm9vdF9maW5kX2hlYWRlciAoIGltYWdlLCAmaGRyICkgKSAhPSAwICkgeworCQlEQkdDICggaW1hZ2UsICJNVUxUSUJPT1QgJXAgaGFzIG5vIG11bHRpYm9vdCBoZWFkZXJcbiIsCisJCSAgICAgICBpbWFnZSApOworCQlyZXR1cm4gcmM7CisJfQorCURCR0MgKCBpbWFnZSwgIk1VTFRJQk9PVCAlcCBmb3VuZCBoZWFkZXIgd2l0aCBmbGFncyAlMDh4XG4iLAorCSAgICAgICBpbWFnZSwgaGRyLm1iLmZsYWdzICk7CisKKwkvKiBUaGlzIGlzIGEgbXVsdGlib290IGltYWdlLCB2YWxpZCBvciBvdGhlcndpc2UgKi8KKwlpZiAoICEgaW1hZ2UtPnR5cGUgKQorCQlpbWFnZS0+dHlwZSA9ICZtdWx0aWJvb3RfaW1hZ2VfdHlwZTsKKworCS8qIEFib3J0IGlmIHdlIGRldGVjdCBmbGFncyB0aGF0IHdlIGNhbm5vdCBzdXBwb3J0ICovCisJaWYgKCBoZHIubWIuZmxhZ3MgJiBNQl9VTlNVUFBPUlRFRF9GTEFHUyApIHsKKwkJREJHQyAoIGltYWdlLCAiTVVMVElCT09UICVwIGZsYWdzICUwOHggbm90IHN1cHBvcnRlZFxuIiwKKwkJICAgICAgIGltYWdlLCAoIGhkci5tYi5mbGFncyAmIE1CX1VOU1VQUE9SVEVEX0ZMQUdTICkgKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KKworCS8qIFRoZXJlIGlzIHRlY2huaWNhbGx5IGEgYml0IE1CX0ZMQUdfUkFXIHRvIGluZGljYXRlIHdoZXRoZXIKKwkgKiB0aGlzIGlzIGFuIEVMRiBvciBhIHJhdyBpbWFnZS4gIEluIHByYWN0aWNlLCBncnViIHdpbGwgdXNlCisJICogdGhlIEVMRiBoZWFkZXIgaWYgcHJlc2VudCwgYW5kIFNvbGFyaXMgcmVsaWVzIG9uIHRoaXMKKwkgKiBiZWhhdmlvdXIuCisJICovCisJaWYgKCAoICggcmMgPSBtdWx0aWJvb3RfbG9hZF9lbGYgKCBpbWFnZSApICkgIT0gMCApICYmCisJICAgICAoICggcmMgPSBtdWx0aWJvb3RfbG9hZF9yYXcgKCBpbWFnZSwgJmhkciApICkgIT0gMCApICkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBNdWx0aWJvb3QgaW1hZ2UgdHlwZSAqLworc3RydWN0IGltYWdlX3R5cGUgbXVsdGlib290X2ltYWdlX3R5cGUgX19pbWFnZV90eXBlICggUFJPQkVfTVVMVElCT09UICkgPSB7CisJLm5hbWUgPSAiTXVsdGlib290IiwKKwkubG9hZCA9IG11bHRpYm9vdF9sb2FkLAorCS5leGVjID0gbXVsdGlib290X2V4ZWMsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ltYWdlL25iaS5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ltYWdlL25iaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZWU0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvbmJpLmMKQEAgLTAsMCArMSw0NDIgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Z2F0ZUEyMC5oPgorI2luY2x1ZGUgPG1lbXNpemVzLmg+CisjaW5jbHVkZSA8YmFzZW1lbV9wYWNrZXQuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvZmFrZWRoY3AuaD4KKyNpbmNsdWRlIDxncHhlL2ltYWdlLmg+CisjaW5jbHVkZSA8Z3B4ZS9mZWF0dXJlcy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBOQkkgaW1hZ2UgZm9ybWF0LgorICoKKyAqIFRoZSBOZXQgQm9vdCBJbWFnZSBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgIkRyYWZ0IE5ldCBCb290IEltYWdlCisgKiBQcm9wb3NhbCAwLjMiIGJ5IEphbWllIEhvbmFuLCBHZXJvIEt1aGxtYW5uIGFuZCBLZW4gWWFwLiAgSXQgaXMgbm93CisgKiBjb25zaWRlcmVkIHRvIGJlIGEgbGVnYWN5IGZvcm1hdCwgYnV0IGl0IHN0aWxsIGluY2x1ZGVkIGJlY2F1c2UgYQorICogbGFyZ2UgYW1vdW50IG9mIHNvZnR3YXJlIChlLmcuIG55bXBoLCBMVFNQKSBtYWtlcyB1c2Ugb2YgTkJJIGZpbGVzLgorICoKKyAqIEV0aGVyYm9vdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIElOVCA3OCBjYWxsYmFjayBpbnRlcmZhY2UKKyAqIGRlc2NyaWJlZCBieSB0aGUgTkJJIHNwZWNpZmljYXRpb24uICBGb3IgYSBjYWxsYmFjayBpbnRlcmZhY2Ugb24KKyAqIHg4NiBhcmNoaXRlY3R1cmUsIHVzZSBQWEUuCisgKgorICovCisKK0ZFQVRVUkUgKCBGRUFUVVJFX0lNQUdFLCAiTkJJIiwgREhDUF9FQl9GRUFUVVJFX05CSSwgMSApOworCitzdHJ1Y3QgaW1hZ2VfdHlwZSBuYmlfaW1hZ2VfdHlwZSBfX2ltYWdlX3R5cGUgKCBQUk9CRV9OT1JNQUwgKTsKKworLyoqCisgKiBBbiBOQkkgaW1hZ2UgaGVhZGVyCisgKgorICogTm90ZSB0aGF0IHRoZSBsZW5ndGggZmllbGQgdXNlcyBhIHBlY3VsaWFyIGVuY29kaW5nOyB1c2UgdGhlCisgKiBOQklfTEVOR1RIKCkgbWFjcm8gdG8gZGVjb2RlIHRoZSBhY3R1YWwgaGVhZGVyIGxlbmd0aC4KKyAqCisgKi8KK3N0cnVjdCBpbWdoZWFkZXIgeworCXVuc2lnbmVkIGxvbmcgbWFnaWM7CQkvKio8IE1hZ2ljIG51bWJlciAoTkJJX01BR0lDKSAqLworCXVuaW9uIHsKKwkJdW5zaWduZWQgY2hhciBsZW5ndGg7CS8qKjwgTmliYmxlLWNvZGVkIGhlYWRlciBsZW5ndGggKi8KKwkJdW5zaWduZWQgbG9uZyBmbGFnczsJLyoqPCBJbWFnZSBmbGFncyAqLworCX07CisJc2Vnb2ZmX3QgbG9jYXRpb247CQkvKio8IDE2LWJpdCBzZWc6b2ZmIGhlYWRlciBsb2NhdGlvbiAqLworCXVuaW9uIHsKKwkJc2Vnb2ZmX3Qgc2Vnb2ZmOwkvKio8IDE2LWJpdCBzZWc6b2ZmIGVudHJ5IHBvaW50ICovCisJCXVuc2lnbmVkIGxvbmcgbGluZWFyOwkvKio8IDMyLWJpdCBlbnRyeSBwb2ludCAqLworCX0gZXhlY2FkZHI7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogTkJJIG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBOQklfTUFHSUMgMHgxQjAzMTMzNlVMCisKKy8qIEludGVycHJldGF0aW9uIG9mIHRoZSAibGVuZ3RoIiBmaWVsZHMgKi8KKyNkZWZpbmUgTkJJX05PTlZFTkRPUl9MRU5HVEgobGVuKQkoICggKGxlbikgJiAweDBmICkgPDwgMiApCisjZGVmaW5lIE5CSV9WRU5ET1JfTEVOR1RIKGxlbikJCSggKCAobGVuKSAmIDB4ZjAgKSA+PiAyICkKKyNkZWZpbmUgTkJJX0xFTkdUSChsZW4pICggTkJJX05PTlZFTkRPUl9MRU5HVEgobGVuKSArIE5CSV9WRU5ET1JfTEVOR1RIKGxlbikgKQorCisvKiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgImZsYWdzIiBmaWVsZHMgKi8KKyNkZWZpbmUJTkJJX1BST0dSQU1fUkVUVVJOUyhmbGFncykJKCAoZmxhZ3MpICYgKCAxIDw8IDggKSApCisjZGVmaW5lCU5CSV9MSU5FQVJfRVhFQ19BRERSKGZsYWdzKQkoIChmbGFncykgJiAoIDEgPDwgMzEgKSApCisKKy8qKiBOQkkgaGVhZGVyIGxlbmd0aCAqLworI2RlZmluZSBOQklfSEVBREVSX0xFTkdUSAk1MTIKKworLyoqCisgKiBBbiBOQkkgc2VnbWVudCBoZWFkZXIKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCBmaWVsZCB1c2VzIGEgcGVjdWxpYXIgZW5jb2Rpbmc7IHVzZSB0aGUKKyAqIE5CSV9MRU5HVEgoKSBtYWNybyB0byBkZWNvZGUgdGhlIGFjdHVhbCBoZWFkZXIgbGVuZ3RoLgorICoKKyAqLworc3RydWN0IHNlZ2hlYWRlciB7CisJdW5zaWduZWQgY2hhciBsZW5ndGg7CQkvKio8IE5pYmJsZS1jb2RlZCBoZWFkZXIgbGVuZ3RoICovCisJdW5zaWduZWQgY2hhciB2ZW5kb3J0YWc7CS8qKjwgVmVuZG9yLWRlZmluZWQgcHJpdmF0ZSB0YWcgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkOworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CQkvKio8IFNlZ21lbnQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBsb25nIGxvYWRhZGRyOwkJLyoqPCBMb2FkIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nIGltZ2xlbmd0aDsJLyoqPCBTZWdtZW50IGxlbmd0aCBpbiBOQkkgZmlsZSAqLworCXVuc2lnbmVkIGxvbmcgbWVtbGVuZ3RoOwkvKio8IFNlZ21lbnQgbGVuZ3RoIGluIG1lbW9yeSAqLworfTsKKworLyogSW50ZXJwcmV0YXRpb24gb2YgdGhlICJmbGFncyIgZmllbGRzICovCisjZGVmaW5lIE5CSV9MT0FEQUREUl9GTEFHUyhmbGFncykJKCAoZmxhZ3MpICYgMHgwMyApCisjZGVmaW5lIE5CSV9MT0FEQUREUl9BQlMJCTB4MDAKKyNkZWZpbmUgTkJJX0xPQURBRERSX0FGVEVSCQkweDAxCisjZGVmaW5lIE5CSV9MT0FEQUREUl9FTkQJCTB4MDIKKyNkZWZpbmUgTkJJX0xPQURBRERSX0JFRk9SRQkJMHgwMworI2RlZmluZSBOQklfTEFTVF9TRUdIRUFERVIoZmxhZ3MpCSggKGZsYWdzKSAmICggMSA8PCAyICkgKQorCisvKiBEZWZpbmUgYSB0eXBlIGZvciBwYXNzaW5nIGluZm8gdG8gYSBsb2FkZWQgcHJvZ3JhbSAqLworc3RydWN0IGViaW5mbyB7CisJdWludDhfdCAgbWFqb3IsIG1pbm9yOyAgLyogVmVyc2lvbiAqLworCXVpbnQxNl90IGZsYWdzOyAgICAgICAgIC8qIEJpdCBmbGFncyAqLworfTsKKworLyoqIEluZm8gcGFzc2VkIHRvIE5CSSBpbWFnZSAqLworc3RhdGljIHN0cnVjdCBlYmluZm8gbG9hZGVyaW5mbyA9IHsKKwlWRVJTSU9OX01BSk9SLCBWRVJTSU9OX01JTk9SLAorCTAKK307CisKKy8qKgorICogUHJlcGFyZSBhIHNlZ21lbnQgZm9yIGFuIE5CSSBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlOQkkgaW1hZ2UKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IHdpdGhpbiBOQkkgaW1hZ2UKKyAqIEB2IGZpbGVzegkJTGVuZ3RoIG9mIGluaXRpYWxpc2VkLWRhdGEgcG9ydGlvbiBvZiB0aGUgc2VnbWVudAorICogQHYgbWVtc3oJCVRvdGFsIGxlbmd0aCBvZiB0aGUgc2VnbWVudAorICogQHYgc3JjCQlTb3VyY2UgZm9yIGluaXRpYWxpc2VkIGRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IG5iaV9wcmVwYXJlX3NlZ21lbnQgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLCBzaXplX3Qgb2Zmc2V0IF9fdW51c2VkLAorCQkJCSB1c2VycHRyX3QgZGVzdCwgc2l6ZV90IGZpbGVzeiwgc2l6ZV90IG1lbXN6ICl7CisJaW50IHJjOworCisJaWYgKCAoIHJjID0gcHJlcF9zZWdtZW50ICggZGVzdCwgZmlsZXN6LCBtZW1zeiApICkgIT0gMCApIHsKKwkJREJHQyAoIGltYWdlLCAiTkJJICVwIGNvdWxkIG5vdCBwcmVwYXJlIHNlZ21lbnQ6ICVzXG4iLAorCQkgICAgICAgaW1hZ2UsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogTG9hZCBhIHNlZ21lbnQgZm9yIGFuIE5CSSBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlOQkkgaW1hZ2UKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IHdpdGhpbiBOQkkgaW1hZ2UKKyAqIEB2IGZpbGVzegkJTGVuZ3RoIG9mIGluaXRpYWxpc2VkLWRhdGEgcG9ydGlvbiBvZiB0aGUgc2VnbWVudAorICogQHYgbWVtc3oJCVRvdGFsIGxlbmd0aCBvZiB0aGUgc2VnbWVudAorICogQHYgc3JjCQlTb3VyY2UgZm9yIGluaXRpYWxpc2VkIGRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IG5iaV9sb2FkX3NlZ21lbnQgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLCBzaXplX3Qgb2Zmc2V0LAorCQkJICAgICAgdXNlcnB0cl90IGRlc3QsIHNpemVfdCBmaWxlc3osCisJCQkgICAgICBzaXplX3QgbWVtc3ogX191bnVzZWQgKSB7CisJbWVtY3B5X3VzZXIgKCBkZXN0LCAwLCBpbWFnZS0+ZGF0YSwgb2Zmc2V0LCBmaWxlc3ogKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQcm9jZXNzIHNlZ21lbnRzIG9mIGFuIE5CSSBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlOQkkgaW1hZ2UKKyAqIEB2IGltZ2hlYWRlcgkJSW1hZ2UgaGVhZGVyIGluZm9ybWF0aW9uCisgKiBAdiBwcm9jZXNzCQlGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHNlZ21lbnQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IG5iaV9wcm9jZXNzX3NlZ21lbnRzICggc3RydWN0IGltYWdlICppbWFnZSwKKwkJCQkgIHN0cnVjdCBpbWdoZWFkZXIgKmltZ2hlYWRlciwKKwkJCQkgIGludCAoICogcHJvY2VzcyApICggc3RydWN0IGltYWdlICppbWFnZSwKKwkJCQkJCSAgICAgIHNpemVfdCBvZmZzZXQsCisJCQkJCQkgICAgICB1c2VycHRyX3QgZGVzdCwKKwkJCQkJCSAgICAgIHNpemVfdCBmaWxlc3osCisJCQkJCQkgICAgICBzaXplX3QgbWVtc3ogKSApIHsKKwlzdHJ1Y3Qgc2VnaGVhZGVyIHNoOworCXNpemVfdCBvZmZzZXQgPSAwOworCXNpemVfdCBzaF9vZmY7CisJdXNlcnB0cl90IGRlc3Q7CisJc2l6ZV90IGZpbGVzejsKKwlzaXplX3QgbWVtc3o7CisJaW50IHJjOworCQorCS8qIENvcHkgaW1hZ2UgaGVhZGVyIHRvIHRhcmdldCBsb2NhdGlvbiAqLworCWRlc3QgPSByZWFsX3RvX3VzZXIgKCBpbWdoZWFkZXItPmxvY2F0aW9uLnNlZ21lbnQsCisJCQkgICAgICBpbWdoZWFkZXItPmxvY2F0aW9uLm9mZnNldCApOworCWZpbGVzeiA9IG1lbXN6ID0gTkJJX0hFQURFUl9MRU5HVEg7CisJaWYgKCAoIHJjID0gcHJvY2VzcyAoIGltYWdlLCBvZmZzZXQsIGRlc3QsIGZpbGVzeiwgbWVtc3ogKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJb2Zmc2V0ICs9IGZpbGVzejsKKworCS8qIFByb2Nlc3Mgc2VnbWVudHMgaW4gdHVybiAqLworCXNoX29mZiA9IE5CSV9MRU5HVEggKCBpbWdoZWFkZXItPmxlbmd0aCApOworCWRvIHsKKwkJLyogUmVhZCBzZWdtZW50IGhlYWRlciAqLworCQljb3B5X2Zyb21fdXNlciAoICZzaCwgaW1hZ2UtPmRhdGEsIHNoX29mZiwgc2l6ZW9mICggc2ggKSApOworCQlpZiAoIHNoLmxlbmd0aCA9PSAwICkgeworCQkJLyogQXZvaWQgaW5maW5pdGUgbG9vcD8gKi8KKwkJCURCR0MgKCBpbWFnZSwgIk5CSSAlcCBpbnZhbGlkIHNlZ2hlYWRlciBsZW5ndGggMFxuIiwKKwkJCSAgICAgICBpbWFnZSApOworCQkJcmV0dXJuIC1FTk9FWEVDOworCQl9CisJCQorCQkvKiBDYWxjdWxhdGUgc2VnbWVudCBsb2FkIGFkZHJlc3MgKi8KKwkJc3dpdGNoICggTkJJX0xPQURBRERSX0ZMQUdTICggc2guZmxhZ3MgKSApIHsKKwkJY2FzZSBOQklfTE9BREFERFJfQUJTOgorCQkJZGVzdCA9IHBoeXNfdG9fdXNlciAoIHNoLmxvYWRhZGRyICk7CisJCQlicmVhazsKKwkJY2FzZSBOQklfTE9BREFERFJfQUZURVI6CisJCQlkZXN0ID0gdXNlcnB0cl9hZGQgKCBkZXN0LCBtZW1zeiArIHNoLmxvYWRhZGRyICk7CisJCQlicmVhazsKKwkJY2FzZSBOQklfTE9BREFERFJfQkVGT1JFOgorCQkJZGVzdCA9IHVzZXJwdHJfYWRkICggZGVzdCwgLXNoLmxvYWRhZGRyICk7CisJCQlicmVhazsKKwkJY2FzZSBOQklfTE9BREFERFJfRU5EOgorCQkJLyogTm90IGNvcnJlY3QgYWNjb3JkaW5nIHRvIHRoZSBzcGVjLCBidXQKKwkJCSAqIG1haW50YWlucyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCisJCQkgKiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBFdGhlcmJvb3QuCisJCQkgKi8KKwkJCWRlc3QgPSBwaHlzX3RvX3VzZXIgKCAoIGV4dG1lbXNpemUoKSArIDEwMjQgKSAqIDEwMjQKKwkJCQkJICAgICAgLSBzaC5sb2FkYWRkciApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBDYW5ub3QgYmUgcmVhY2hlZCAqLworCQkJYXNzZXJ0ICggMCApOworCQl9CisKKwkJLyogUHJvY2VzcyB0aGlzIHNlZ21lbnQgKi8KKwkJZmlsZXN6ID0gc2guaW1nbGVuZ3RoOworCQltZW1zeiA9IHNoLm1lbWxlbmd0aDsKKwkJaWYgKCAoIG9mZnNldCArIGZpbGVzeiApID4gaW1hZ2UtPmxlbiApIHsKKwkJCURCR0MgKCBpbWFnZSwgIk5CSSAlcCBzZWdtZW50IG91dHNpZGUgZmlsZVxuIiwgaW1hZ2UgKTsKKwkJCXJldHVybiAtRU5PRVhFQzsKKwkJfQorCQlpZiAoICggcmMgPSBwcm9jZXNzICggaW1hZ2UsIG9mZnNldCwgZGVzdCwKKwkJCQkgICAgICBmaWxlc3osIG1lbXN6ICkgKSAhPSAwICkgeworCQkJcmV0dXJuIHJjOworCQl9CisJCW9mZnNldCArPSBmaWxlc3o7CisKKwkJLyogTmV4dCBzZWdoZWFkZXIgKi8KKwkJc2hfb2ZmICs9IE5CSV9MRU5HVEggKCBzaC5sZW5ndGggKTsKKwkJaWYgKCBzaF9vZmYgPj0gTkJJX0hFQURFUl9MRU5HVEggKSB7CisJCQlEQkdDICggaW1hZ2UsICJOQkkgJXAgaGVhZGVyIG92ZXJmbG93XG4iLCBpbWFnZSApOworCQkJcmV0dXJuIC1FTk9FWEVDOworCQl9CisKKwl9IHdoaWxlICggISBOQklfTEFTVF9TRUdIRUFERVIgKCBzaC5mbGFncyApICk7CisKKwlpZiAoIG9mZnNldCAhPSBpbWFnZS0+bGVuICkgeworCQlEQkdDICggaW1hZ2UsICJOQkkgJXAgbGVuZ3RoIHdyb25nIChmaWxlICV6ZCwgbWV0YWRhdGEgJXpkKVxuIiwKKwkJICAgICAgIGltYWdlLCBpbWFnZS0+bGVuLCBvZmZzZXQgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIExvYWQgYW4gTkJJIGltYWdlIGludG8gbWVtb3J5CisgKgorICogQHYgaW1hZ2UJCU5CSSBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbmJpX2xvYWQgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXN0cnVjdCBpbWdoZWFkZXIgaW1naGVhZGVyOworCWludCByYzsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgZ2l2ZSB1cCAqLworCWlmICggaW1hZ2UtPmxlbiA8IE5CSV9IRUFERVJfTEVOR1RIICkgeworCQlEQkdDICggaW1hZ2UsICJOQkkgJXAgdG9vIHNob3J0IGZvciBhbiBOQkkgaW1hZ2VcbiIsIGltYWdlICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkvKiBDaGVjayBpbWFnZSBoZWFkZXIgKi8KKwljb3B5X2Zyb21fdXNlciAoICZpbWdoZWFkZXIsIGltYWdlLT5kYXRhLCAwLCBzaXplb2YgKCBpbWdoZWFkZXIgKSApOworCWlmICggaW1naGVhZGVyLm1hZ2ljICE9IE5CSV9NQUdJQyApIHsKKwkJREJHQyAoIGltYWdlLCAiTkJJICVwIGhhcyBubyBOQkkgc2lnbmF0dXJlXG4iLCBpbWFnZSApOworCQlyZXR1cm4gLUVOT0VYRUM7CisJfQorCisJLyogVGhpcyBpcyBhbiBOQkkgaW1hZ2UsIHZhbGlkIG9yIG90aGVyd2lzZSAqLworCWlmICggISBpbWFnZS0+dHlwZSApCisJCWltYWdlLT50eXBlID0gJm5iaV9pbWFnZV90eXBlOworCisJREJHQyAoIGltYWdlLCAiTkJJICVwIHBsYWNpbmcgaGVhZGVyIGF0ICVoeDolaHhcbiIsIGltYWdlLAorCSAgICAgICBpbWdoZWFkZXIubG9jYXRpb24uc2VnbWVudCwgaW1naGVhZGVyLmxvY2F0aW9uLm9mZnNldCApOworCisJLyogTkJJIGZpbGVzIGNhbiBoYXZlIG92ZXJsYXBzIGJldHdlZW4gc2VnbWVudHM7IHRoZSBic3Mgb2YKKwkgKiBvbmUgc2VnbWVudCBtYXkgb3ZlcmxhcCB0aGUgaW5pdGlhbGlzZWQgZGF0YSBvZiBhbm90aGVyLiAgSQorCSAqIGFzc3VtZSB0aGlzIGlzIGEgZGVzaWduIGZsYXcsIGJ1dCB0aGVyZSBhcmUgaW1hZ2VzIG91dAorCSAqIHRoZXJlIHRoYXQgd2UgbmVlZCB0byB3b3JrIHdpdGguICBXZSB0aGVyZWZvcmUgZG8gdHdvCisJICogcGFzc2VzOiBmaXJzdCB0byBpbml0aWFsaXNlIHRoZSBzZWdtZW50cywgdGhlbiB0byBjb3B5IHRoZQorCSAqIGRhdGEuICBUaGlzIGF2b2lkcyB6ZXJvaW5nIG91dCBhbHJlYWR5LWNvcGllZCBkYXRhLgorCSAqLworCWlmICggKCByYyA9IG5iaV9wcm9jZXNzX3NlZ21lbnRzICggaW1hZ2UsICZpbWdoZWFkZXIsCisJCQkJCSAgIG5iaV9wcmVwYXJlX3NlZ21lbnQgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJaWYgKCAoIHJjID0gbmJpX3Byb2Nlc3Nfc2VnbWVudHMgKCBpbWFnZSwgJmltZ2hlYWRlciwKKwkJCQkJICAgbmJpX2xvYWRfc2VnbWVudCApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIFJlY29yZCBoZWFkZXIgYWRkcmVzcyBpbiBpbWFnZSBwcml2YXRlIGRhdGEgZmllbGQgKi8KKwlpbWFnZS0+cHJpdi51c2VyID0gcmVhbF90b191c2VyICggaW1naGVhZGVyLmxvY2F0aW9uLnNlZ21lbnQsCisJCQkJCSAgaW1naGVhZGVyLmxvY2F0aW9uLm9mZnNldCApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQm9vdCBhIDE2LWJpdCBOQkkgaW1hZ2UKKyAqCisgKiBAdiBpbWdoZWFkZXIJCUltYWdlIGhlYWRlciBpbmZvcm1hdGlvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlLCBpZiBpbWFnZSByZXR1cm5zCisgKi8KK3N0YXRpYyBpbnQgbmJpX2Jvb3QxNiAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsIHN0cnVjdCBpbWdoZWFkZXIgKmltZ2hlYWRlciApIHsKKwlpbnQgZGlzY2FyZF9ELCBkaXNjYXJkX1MsIGRpc2NhcmRfYjsKKwlpbnQgcmM7CisKKwlEQkdDICggaW1hZ2UsICJOQkkgJXAgZXhlY3V0aW5nIDE2LWJpdCBpbWFnZSBhdCAlMDR4OiUwNHhcbiIsIGltYWdlLAorCSAgICAgICBpbWdoZWFkZXItPmV4ZWNhZGRyLnNlZ29mZi5zZWdtZW50LAorCSAgICAgICBpbWdoZWFkZXItPmV4ZWNhZGRyLnNlZ29mZi5vZmZzZXQgKTsKKworCWdhdGVBMjBfdW5zZXQoKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJUkVBTF9DT0RFICggInB1c2h3ICUlZHNcblx0IgkvKiBmYXIgcG9pbnRlciB0byBib290cCBkYXRhICovCisJCQkgICAgInB1c2h3ICUlYnhcblx0IgorCQkJICAgICJwdXNobCAlJWVzaVxuXHQiCS8qIGxvY2F0aW9uICovCisJCQkgICAgInB1c2h3ICUlY3Ncblx0IgkvKiBsY2FsbCBleGVjYWRkciAqLworCQkJICAgICJjYWxsIDFmXG5cdCIKKwkJCSAgICAiam1wIDJmXG5cdCIKKwkJCSAgICAiXG4xOlxuXHQiCisJCQkgICAgInB1c2hsICUlZWRpXG5cdCIKKwkJCSAgICAibHJldFxuXHQiCisJCQkgICAgIlxuMjpcblx0IgorCQkJICAgICJhZGR3ICQ4LCUlc3Bcblx0IgkvKiBjbGVhbiB1cCBzdGFjayAqLyApCisJCTogIj1hIiAoIHJjICksICI9RCIgKCBkaXNjYXJkX0QgKSwgIj1TIiAoIGRpc2NhcmRfUyApLAorCQkgICI9YiIgKCBkaXNjYXJkX2IgKQorCQk6ICJEIiAoIGltZ2hlYWRlci0+ZXhlY2FkZHIuc2Vnb2ZmICksCisJCSAgIlMiICggaW1naGVhZGVyLT5sb2NhdGlvbiApLAorCQkgICJiIiAoIF9fZnJvbV9kYXRhMTYgKCBiYXNlbWVtX3BhY2tldCApICkKKwkJOiAiZWN4IiwgImVkeCIsICJlYnAiICk7CisKKwlnYXRlQTIwX3NldCgpOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEJvb3QgYSAzMi1iaXQgTkJJIGltYWdlCisgKgorICogQHYgaW1naGVhZGVyCQlJbWFnZSBoZWFkZXIgaW5mb3JtYXRpb24KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZSwgaWYgaW1hZ2UgcmV0dXJucworICovCitzdGF0aWMgaW50IG5iaV9ib290MzIgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLCBzdHJ1Y3QgaW1naGVhZGVyICppbWdoZWFkZXIgKSB7CisJaW50IGRpc2NhcmRfRCwgZGlzY2FyZF9TLCBkaXNjYXJkX2I7CisJaW50IHJjOworCisJREJHQyAoIGltYWdlLCAiTkJJICVwIGV4ZWN1dGluZyAzMi1iaXQgaW1hZ2UgYXQgJWx4XG4iLAorCSAgICAgICBpbWFnZSwgaW1naGVhZGVyLT5leGVjYWRkci5saW5lYXIgKTsKKworCS8qIG5vIGdhdGVBMjBfdW5zZXQgZm9yIFBNIGNhbGwgKi8KKworCS8qIEp1bXAgdG8gT1Mgd2l0aCBmbGF0IHBoeXNpY2FsIGFkZHJlc3NpbmcgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCVBIWVNfQ09ERSAoICJwdXNobCAlJWVieFxuXHQiIC8qIGJvb3RwIGRhdGEgKi8KKwkJCSAgICAicHVzaGwgJSVlc2lcblx0IiAvKiBpbWdoZWFkZXIgKi8KKwkJCSAgICAicHVzaGwgJSVlYXhcblx0IiAvKiBsb2FkZXJpbmZvICovCisJCQkgICAgImNhbGwgKiUlZWRpXG5cdCIKKwkJCSAgICAiYWRkbCAkMTIsICUlZXNwXG5cdCIgLyogY2xlYW4gdXAgc3RhY2sgKi8gKQorCQk6ICI9YSIgKCByYyApLCAiPUQiICggZGlzY2FyZF9EICksICI9UyIgKCBkaXNjYXJkX1MgKSwKKwkJICAiPWIiICggZGlzY2FyZF9iICkKKwkJOiAiRCIgKCBpbWdoZWFkZXItPmV4ZWNhZGRyLmxpbmVhciApLAorCQkgICJTIiAoICggaW1naGVhZGVyLT5sb2NhdGlvbi5zZWdtZW50IDw8IDQgKSArCisJCQlpbWdoZWFkZXItPmxvY2F0aW9uLm9mZnNldCApLAorCQkgICJiIiAoIHZpcnRfdG9fcGh5cyAoIGJhc2VtZW1fcGFja2V0ICkgKSwKKwkJICAiYSIgKCB2aXJ0X3RvX3BoeXMgKCAmbG9hZGVyaW5mbyApICkKKwkJOiAiZWN4IiwgImVkeCIsICJlYnAiLCAibWVtb3J5IiApOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFByZXBhcmUgREhDUCBwYXJhbWV0ZXIgYmxvY2sgZm9yIE5CSSBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlOQkkgaW1hZ2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IG5iaV9wcmVwYXJlX2RoY3AgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpib290X25ldGRldjsKKwlpbnQgcmM7CisKKwlib290X25ldGRldiA9IGxhc3Rfb3BlbmVkX25ldGRldigpOworCWlmICggISBib290X25ldGRldiApIHsKKwkJREJHQyAoIGltYWdlLCAiTkJJICVwIGNvdWxkIG5vdCBpZGVudGlmeSBhIG5ldHdvcmsgZGV2aWNlXG4iLAorCQkgICAgICAgaW1hZ2UgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCAoIHJjID0gY3JlYXRlX2Zha2VkaGNwYWNrICggYm9vdF9uZXRkZXYsIGJhc2VtZW1fcGFja2V0LAorCQkJCQkgc2l6ZW9mICggYmFzZW1lbV9wYWNrZXQgKSApICkgIT0gMCApIHsKKwkJREJHQyAoIGltYWdlLCAiTkJJICVwIGZhaWxlZCB0byBidWlsZCBESENQIHBhY2tldFxuIiwgaW1hZ2UgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEV4ZWN1dGUgYSBsb2FkZWQgTkJJIGltYWdlCisgKgorICogQHYgaW1hZ2UJCU5CSSBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbmJpX2V4ZWMgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXN0cnVjdCBpbWdoZWFkZXIgaW1naGVhZGVyOworCWludCBtYXlfcmV0dXJuOworCWludCByYzsKKworCWNvcHlfZnJvbV91c2VyICggJmltZ2hlYWRlciwgaW1hZ2UtPnByaXYudXNlciwgMCwKKwkJCSBzaXplb2YgKCBpbWdoZWFkZXIgKSApOworCisJLyogUHJlcGFyZSBESENQIG9wdGlvbiBibG9jayAqLworCWlmICggKCByYyA9IG5iaV9wcmVwYXJlX2RoY3AgKCBpbWFnZSApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIFNodXQgZG93biBub3cgaWYgTkJJIGltYWdlIHdpbGwgbm90IHJldHVybiAqLworCW1heV9yZXR1cm4gPSBOQklfUFJPR1JBTV9SRVRVUk5TICggaW1naGVhZGVyLmZsYWdzICk7CisJaWYgKCAhIG1heV9yZXR1cm4gKQorCQlzaHV0ZG93biAoIFNIVVRET1dOX0JPT1QgKTsKKworCS8qIEV4ZWN1dGUgTkJJIGltYWdlICovCisJaWYgKCBOQklfTElORUFSX0VYRUNfQUREUiAoIGltZ2hlYWRlci5mbGFncyApICkgeworCQlyYyA9IG5iaV9ib290MzIgKCBpbWFnZSwgJmltZ2hlYWRlciApOworCX0gZWxzZSB7CisJICAgICAgICByYyA9IG5iaV9ib290MTYgKCBpbWFnZSwgJmltZ2hlYWRlciApOworCX0KKworCWlmICggISBtYXlfcmV0dXJuICkgeworCQkvKiBDYW5ub3QgY29udGludWUgYWZ0ZXIgc2h1dGRvd24oKSBjYWxsZWQgKi8KKwkJREJHQyAoIGltYWdlLCAiTkJJICVwIHJldHVybmVkICVkIGZyb20gbm9uLXJldHVybmFibGUgaW1hZ2VcbiIsCisJCSAgICAgICBpbWFnZSwgcmMgICk7CisJCXdoaWxlICggMSApIHt9CisJfQorCisJREJHQyAoIGltYWdlLCAiTkJJICVwIHJldHVybmVkICVkXG4iLCBpbWFnZSwgcmMgKTsKKworCXJldHVybiByYzsKK30KKworLyoqIE5CSSBpbWFnZSB0eXBlICovCitzdHJ1Y3QgaW1hZ2VfdHlwZSBuYmlfaW1hZ2VfdHlwZSBfX2ltYWdlX3R5cGUgKCBQUk9CRV9OT1JNQUwgKSA9IHsKKwkubmFtZSA9ICJOQkkiLAorCS5sb2FkID0gbmJpX2xvYWQsCisJLmV4ZWMgPSBuYmlfZXhlYywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvcHhlX2ltYWdlLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW1hZ2UvcHhlX2ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0MjlmOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbWFnZS9weGVfaW1hZ2UuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFBYRSBpbWFnZSBmb3JtYXQKKyAqCisgKi8KKworI2luY2x1ZGUgPHB4ZS5oPgorI2luY2x1ZGUgPHB4ZV9jYWxsLmg+CisjaW5jbHVkZSA8Z3B4ZS91YWNjZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbWFnZS5oPgorI2luY2x1ZGUgPGdweGUvc2VnbWVudC5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9mZWF0dXJlcy5oPgorCitGRUFUVVJFICggRkVBVFVSRV9JTUFHRSwgIlBYRSIsIERIQ1BfRUJfRkVBVFVSRV9QWEUsIDEgKTsKKworc3RydWN0IGltYWdlX3R5cGUgcHhlX2ltYWdlX3R5cGUgX19pbWFnZV90eXBlICggUFJPQkVfUFhFICk7CisKKy8qKgorICogRXhlY3V0ZSBQWEUgaW1hZ2UKKyAqCisgKiBAdiBpbWFnZQkJUFhFIGltYWdlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBweGVfZXhlYyAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlpbnQgcmM7CisKKwkvKiBBcmJpdHJhcmlseSBwaWNrIHRoZSBtb3N0IHJlY2VudGx5IG9wZW5lZCBuZXR3b3JrIGRldmljZSAqLworCWlmICggKCBuZXRkZXYgPSBsYXN0X29wZW5lZF9uZXRkZXYoKSApID09IE5VTEwgKSB7CisJCURCR0MgKCBpbWFnZSwgIklNQUdFICVwIGNvdWxkIG5vdCBsb2NhdGUgUFhFIG5ldCBkZXZpY2VcbiIsCisJCSAgICAgICBpbWFnZSApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBBY3RpdmF0ZSBQWEUgKi8KKwlweGVfYWN0aXZhdGUgKCBuZXRkZXYgKTsKKworCS8qIFN0YXJ0IFBYRSBOQlAgKi8KKwlyYyA9IHB4ZV9zdGFydF9uYnAoKTsKKworCS8qIERlYWN0aXZhdGUgUFhFICovCisJcHhlX2RlYWN0aXZhdGUoKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBMb2FkIFBYRSBpbWFnZSBpbnRvIG1lbW9yeQorICoKKyAqIEB2IGltYWdlCQlQWEUgZmlsZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBweGVfbG9hZCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJdXNlcnB0cl90IGJ1ZmZlciA9IHJlYWxfdG9fdXNlciAoIDAsIDB4N2MwMCApOworCXNpemVfdCBmaWxlc3ogPSBpbWFnZS0+bGVuOworCXNpemVfdCBtZW1zeiA9IGltYWdlLT5sZW47CisJaW50IHJjOworCisJLyogSW1hZ2VzIHRvbyBsYXJnZSB0byBmaXQgaW4gYmFzZSBtZW1vcnkgY2Fubm90IGJlIFBYRQorCSAqIGltYWdlcy4gIFdlIGluY2x1ZGUgdGhpcyBjaGVjayB0byBoZWxwIHByZXZlbnQgdW5yZWNvZ25pc2VkCisJICogaW1hZ2VzIGZyb20gYmVpbmcgbWFya2VkIGFzIFBYRSBpbWFnZXMsIHNpbmNlIFBYRSBpbWFnZXMKKwkgKiBoYXZlIG5vIHNpZ25hdHVyZSB3ZSBjYW4gY2hlY2sgYWdhaW5zdC4KKwkgKi8KKwlpZiAoIGZpbGVzeiA+ICggMHhhMDAwMCAtIDB4N2MwMCApICkKKwkJcmV0dXJuIC1FTk9FWEVDOworCisJLyogUmVqZWN0aW5nIHplcm8tbGVuZ3RoIGltYWdlcyBpcyBhbHNvIHVzZWZ1bCwgc2luY2UgdGhlc2UKKwkgKiBlbmQgdXAgbG9va2luZyB0byB0aGUgdXNlciBsaWtlIGJ1Z3MgaW4gZ1BYRS4KKwkgKi8KKwlpZiAoICEgZmlsZXN6ICkKKwkJcmV0dXJuIC1FTk9FWEVDOworCisJLyogVGhlcmUgYXJlIG5vIHNpZ25hdHVyZSBjaGVja3MgZm9yIFBYRTsgd2Ugd2lsbCBhY2NlcHQgYW55dGhpbmcgKi8KKwlpZiAoICEgaW1hZ2UtPnR5cGUgKQorCQlpbWFnZS0+dHlwZSA9ICZweGVfaW1hZ2VfdHlwZTsKKworCS8qIFZlcmlmeSBhbmQgcHJlcGFyZSBzZWdtZW50ICovCisJaWYgKCAoIHJjID0gcHJlcF9zZWdtZW50ICggYnVmZmVyLCBmaWxlc3osIG1lbXN6ICkgKSAhPSAwICkgeworCQlEQkdDICggaW1hZ2UsICJJTUFHRSAlcCBjb3VsZCBub3QgcHJlcGFyZSBzZWdtZW50OiAlc1xuIiwKKwkJICAgICAgIGltYWdlLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIENvcHkgaW1hZ2UgdG8gc2VnbWVudCAqLworCW1lbWNweV91c2VyICggYnVmZmVyLCAwLCBpbWFnZS0+ZGF0YSwgMCwgZmlsZXN6ICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqIFBYRSBpbWFnZSB0eXBlICovCitzdHJ1Y3QgaW1hZ2VfdHlwZSBweGVfaW1hZ2VfdHlwZSBfX2ltYWdlX3R5cGUgKCBQUk9CRV9QWEUgKSA9IHsKKwkubmFtZSA9ICJQWEUiLAorCS5sb2FkID0gcHhlX2xvYWQsCisJLmV4ZWMgPSBweGVfZXhlYywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iYXNlbWVtLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iYXNlbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3N2M3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2Jhc2VtZW0uaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIF9CQVNFTUVNX0gKKyNkZWZpbmUgX0JBU0VNRU1fSAorCisvKiogQGZpbGUKKyAqCisgKiBCYXNlIG1lbW9yeSBhbGxvY2F0aW9uCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Ymlvcy5oPgorCisvKioKKyAqIFJlYWQgdGhlIEJJT1MgZnJlZSBiYXNlIG1lbW9yeSBjb3VudGVyCisgKgorICogQHJldCBmYm1zCQlGcmVlIGJhc2UgbWVtb3J5IGNvdW50ZXIgKGluIGtCKQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfZmJtcyAoIHZvaWQgKSB7CisJdWludDE2X3QgZmJtczsKKworCWdldF9yZWFsICggZmJtcywgQkRBX1NFRywgQkRBX0ZCTVMgKTsKKwlyZXR1cm4gZmJtczsKK30KKworZXh0ZXJuIHZvaWQgc2V0X2ZibXMgKCB1bnNpZ25lZCBpbnQgbmV3X2ZibXMgKTsKKworLyogQWN0dWFsbHkgaW4gaGlkZW1lbS5jLCBidXQgcHV0dGluZyBpdCBoZXJlIGF2b2lkcyBwb2xsdXRpbmcgdGhlCisgKiBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgaW5jbHVkZS9oaWRlbWVtLmguCisgKi8KK2V4dGVybiB2b2lkIGhpZGVfYmFzZW1lbSAoIHZvaWQgKTsKKworI2VuZGlmIC8qIF9CQVNFTUVNX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2Jhc2VtZW1fcGFja2V0LmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iYXNlbWVtX3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjQ3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iYXNlbWVtX3BhY2tldC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgQkFTRU1FTV9QQUNLRVRfSAorI2RlZmluZSBCQVNFTUVNX1BBQ0tFVF9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiBiYXNlIG1lbW9yeSBwYWNrZXQgYnVmZmVyICovCisjZGVmaW5lIEJBU0VNRU1fUEFDS0VUX0xFTiAxNTE0CisKKy8qKiBCYXNlIG1lbW9yeSBwYWNrZXQgYnVmZmVyICovCitleHRlcm4gY2hhciBfX2JzczE2X2FycmF5ICggYmFzZW1lbV9wYWNrZXQsIFtCQVNFTUVNX1BBQ0tFVF9MRU5dICk7CisjZGVmaW5lIGJhc2VtZW1fcGFja2V0IF9fdXNlX2RhdGExNiAoIGJhc2VtZW1fcGFja2V0ICkKKworI2VuZGlmIC8qIEJBU0VNRU1fUEFDS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2Jpb3MuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2Jpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGJiNzNkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYmlvcy5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgQklPU19ICisjZGVmaW5lIEJJT1NfSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNkZWZpbmUgQkRBX1NFRyAweDAwNDAKKyNkZWZpbmUgQkRBX0ZCTVMgMHgwMDEzCisjZGVmaW5lIEJEQV9OVU1fRFJJVkVTIDB4MDA3NQorCisjZW5kaWYgLyogQklPU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaW9zX2Rpc2tzLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaW9zX2Rpc2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkN2M0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2Jpb3NfZGlza3MuaApAQCAtMCwwICsxLDY5IEBACisjaWZuZGVmIEJJT1NfRElTS1NfSAorI2RlZmluZSBCSU9TX0RJU0tTX0gKKworI2luY2x1ZGUgImRldi5oIgorCisvKgorICogQ29uc3RhbnRzCisgKgorICovCisKKyNkZWZpbmUJQklPU19ESVNLX01BWF9OQU1FX0xFTgk2CisKK3N0cnVjdCBiaW9zX2Rpc2tfc2VjdG9yIHsKKwljaGFyIGRhdGFbNTEyXTsKK307CisKKy8qCisgKiBUaGUgbG9jYXRpb24gb2YgYSBCSU9TIGRpc2sKKyAqCisgKi8KK3N0cnVjdCBiaW9zX2Rpc2tfbG9jIHsKKwl1aW50OF90IGRyaXZlOworfTsKKworLyoKKyAqIEEgcGh5c2ljYWwgQklPUyBkaXNrIGRldmljZQorICoKKyAqLworc3RydWN0IGJpb3NfZGlza19kZXZpY2UgeworCWNoYXIgbmFtZVtCSU9TX0RJU0tfTUFYX05BTUVfTEVOXTsKKwl1aW50OF90IGRyaXZlOworCXVpbnQ4X3QgdHlwZTsKK307CisKKy8qCisgKiBBIEJJT1MgZGlzayBkcml2ZXIsIHdpdGggYSB2YWxpZCBkZXZpY2UgSUQgcmFuZ2UgYW5kIG5hbWluZworICogZnVuY3Rpb24uCisgKgorICovCitzdHJ1Y3QgYmlvc19kaXNrX2RyaXZlciB7CisJdm9pZCAoICpmaWxsX2RyaXZlX25hbWUgKSAoIGNoYXIgKmJ1ZiwgdWludDhfdCBkcml2ZSApOworCXVpbnQ4X3QgbWluX2RyaXZlOworCXVpbnQ4X3QgbWF4X2RyaXZlOworfTsKKworLyoKKyAqIERlZmluZSBhIEJJT1MgZGlzayBkcml2ZXIKKyAqCisgKi8KKyNkZWZpbmUgQklPU19ESVNLX0RSSVZFUiggX25hbWUsIF9maWxsX2RyaXZlX25hbWUsIF9taW5fZHJpdmUsIF9tYXhfZHJpdmUgKSAgIFwKKwlzdGF0aWMgc3RydWN0IGJpb3NfZGlza19kcml2ZXIgX25hbWUgPSB7CQkJICAgICAgXAorCQkuZmlsbF9kcml2ZV9uYW1lID0gX2ZpbGxfZHJpdmVfbmFtZSwJCQkgICAgICBcCisJCS5taW5fZHJpdmUgPSBfbWluX2RyaXZlLAkJCQkgICAgICBcCisJCS5tYXhfZHJpdmUgPSBfbWF4X2RyaXZlLAkJCQkgICAgICBcCisJfQorCisvKgorICogRnVuY3Rpb25zIGluIGJpb3NfZGlza3MuYworICoKKyAqLworCisKKy8qCisgKiBiaW9zX2Rpc2sgYnVzIGdsb2JhbCBkZWZpbml0aW9uCisgKgorICovCitleHRlcm4gc3RydWN0IGJ1c19kcml2ZXIgYmlvc19kaXNrX2RyaXZlcjsKKworI2VuZGlmIC8qIEJJT1NfRElTS1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYmlvc2ludC5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYmlvc2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDY2YWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaW9zaW50LmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBCSU9TSU5UX0gKKyNkZWZpbmUgQklPU0lOVF9ICisKKy8qKgorICogQGZpbGUgQklPUyBpbnRlcnJ1cHRzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisKK3N0cnVjdCBzZWdvZmY7CisKKy8qKgorICogSG9va2VkIGludGVycnVwdCBjb3VudAorICoKKyAqIEF0IGV4aXQsIGFmdGVyIHVuaG9va2luZyBhbGwgcG9zc2libGUgaW50ZXJydXB0cywgdGhpcyBjb3VudGVyCisgKiBzaG91bGQgYmUgZXhhbWluZWQuICBJZiBpdCBpcyBub24temVybywgaXQgbWVhbnMgdGhhdCB3ZSBmYWlsZWQgdG8KKyAqIHVuaG9vayBhdCBsZWFzdCBvbmUgaW50ZXJydXB0IHZlY3RvciwgYW5kIHNvIG11c3Qgbm90IGZyZWUgdXAgdGhlCisgKiBtZW1vcnkgd2UgYXJlIHVzaW5nLiAgKE5vdGUgdGhhdCB0aGlzIGFsc28gaW1wbGllcyB0aGF0IHdlIHNob3VsZAorICogcmUtaG9vayBJTlQgMTUgaW4gb3JkZXIgdG8gaGlkZSBvdXJzZWx2ZXMgZnJvbSB0aGUgbWVtb3J5IG1hcCkuCisgKi8KK2V4dGVybiB1aW50MTZfdCBfX3RleHQxNiAoIGhvb2tlZF9iaW9zX2ludGVycnVwdHMgKTsKKyNkZWZpbmUgaG9va2VkX2Jpb3NfaW50ZXJydXB0cyBfX3VzZV90ZXh0MTYgKCBob29rZWRfYmlvc19pbnRlcnJ1cHRzICkKKworZXh0ZXJuIHZvaWQgaG9va19iaW9zX2ludGVycnVwdCAoIHVuc2lnbmVkIGludCBpbnRlcnJ1cHQsIHVuc2lnbmVkIGludCBoYW5kbGVyLAorCQkJCSAgc3RydWN0IHNlZ29mZiAqY2hhaW5fdmVjdG9yICk7CitleHRlcm4gaW50IHVuaG9va19iaW9zX2ludGVycnVwdCAoIHVuc2lnbmVkIGludCBpbnRlcnJ1cHQsCisJCQkJICAgdW5zaWduZWQgaW50IGhhbmRsZXIsCisJCQkJICAgc3RydWN0IHNlZ29mZiAqY2hhaW5fdmVjdG9yICk7CisKKyNlbmRpZiAvKiBCSU9TSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvYnl0ZXN3YXAuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvYnl0ZXN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGJkNDBlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9ieXRlc3dhcC5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgRVRIRVJCT09UX0JJVFNfQllURVNXQVBfSAorI2RlZmluZSBFVEhFUkJPT1RfQklUU19CWVRFU1dBUF9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSwgY29uc3QpKSB1aW50MTZfdAorX19ic3dhcF92YXJpYWJsZV8xNih1aW50MTZfdCB4KQoreworCV9fYXNtX18oInhjaGdiICViMCwlaDBcblx0IgorCQk6ICI9cSIgKHgpCisJCTogIjAiICh4KSk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUsIGNvbnN0KSkgdWludDMyX3QKK19fYnN3YXBfdmFyaWFibGVfMzIodWludDMyX3QgeCkKK3sKKwlfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwXG5cdCIKKwkJInJvcmwgJDE2LCUwXG5cdCIKKwkJInhjaGdiICViMCwlaDAiCisJCTogIj1xIiAoeCkKKwkJOiAiMCIgKHgpKTsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSwgY29uc3QpKSB1aW50NjRfdAorX19ic3dhcF92YXJpYWJsZV82NCh1aW50NjRfdCB4KQoreworCXVuaW9uIHsKKwkJdWludDY0X3QgcXdvcmQ7CisJCXVpbnQzMl90IGR3b3JkWzJdOyAKKwl9IHU7CisKKwl1LnF3b3JkID0geDsKKwl1LmR3b3JkWzBdID0gX19ic3dhcF92YXJpYWJsZV8zMih1LmR3b3JkWzBdKTsKKwl1LmR3b3JkWzFdID0gX19ic3dhcF92YXJpYWJsZV8zMih1LmR3b3JkWzFdKTsKKwlfX2FzbV9fKCJ4Y2hnbCAlMCwlMSIKKwkJOiAiPXIiICggdS5kd29yZFswXSApLCAiPXIiICggdS5kd29yZFsxXSApCisJCTogIjAiICggdS5kd29yZFswXSApLCAiMSIgKCB1LmR3b3JkWzFdICkgKTsKKwlyZXR1cm4gdS5xd29yZDsKK30KKworI2VuZGlmIC8qIEVUSEVSQk9PVF9CSVRTX0JZVEVTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvY29tcGlsZXIuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvY29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDBkYjBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9jb21waWxlci5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX0JJVFNfQ09NUElMRVJfSAorI2RlZmluZSBfQklUU19DT01QSUxFUl9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2lmbmRlZiBBU1NFTUJMWQorCisvKiogRGVjbGFyZSBhIGZ1bmN0aW9uIHdpdGggc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9ucyAqLworI2RlZmluZSBfX2FzbWNhbGwgX19hdHRyaWJ1dGVfXyAoKCBjZGVjbCwgcmVncGFybSgwKSApKQorCisvKioKKyAqIERlY2xhcmUgYSBmdW5jdGlvbiB3aXRoIGxpYmdjYyBpbXBsaWNpdCBsaW5rYWdlCisgKgorICogSXQgc2VlbXMgYXMgdGhvdWdoIGdjYyBleHBlY3RzIGl0cyBpbXBsaWNpdCBhcml0aG1ldGljIGZ1bmN0aW9ucyB0bworICogYmUgY2RlY2wsIGV2ZW4gaWYgLW1ydGQgaXMgc3BlY2lmaWVkLiAgVGhpcyBpcyBzb21ld2hhdAorICogaW5jb25zaXN0ZW50OyBmb3IgZXhhbXBsZSwgaWYgLW1yZWdwYXJtPTMgaXMgdXNlZCB0aGVuIHRoZSBpbXBsaWNpdAorICogZnVuY3Rpb25zIGRvIGJlY29tZSByZWdwYXJtKDMpLgorICoKKyAqIFRoZSBpbXBsaWNpdCBjYWxscyB0byBtZW1jcHkoKSBhbmQgbWVtc2V0KCkgd2hpY2ggZ2NjIGNhbiBnZW5lcmF0ZQorICogZG8gbm90IHNlZW0gdG8gaGF2ZSB0aGlzIGluY29uc2lzdGVuY3k7IC1tcmVncGFybSBhbmQgLW1ydGQgYWZmZWN0CisgKiB0aGVtIGluIHRoZSBzYW1lIHdheSBhcyBhbnkgb3RoZXIgZnVuY3Rpb24uCisgKi8KKyNkZWZpbmUgX19saWJnY2MgX19hdHRyaWJ1dGVfXyAoKCBjZGVjbCApKQorCisjZW5kaWYgLyogQVNTRU1CTFkgKi8KKworI2VuZGlmIC8qIF9CSVRTX0NPTVBJTEVSX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvY3B1LmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL2NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzM5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL2NwdS5oCkBAIC0wLDAgKzEsODYgQEAKKyNpZm5kZWYgSTM4Nl9CSVRTX0NQVV9ICisjZGVmaW5lIEkzODZfQklUU19DUFVfSAorCisvKiBJbnRlbC1kZWZpbmVkIENQVSBmZWF0dXJlcywgQ1BVSUQgbGV2ZWwgMHgwMDAwMDAwMSwgd29yZCAwICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZQVQkJMCAvKiBPbmJvYXJkIEZQVSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9WTUUJCTEgLyogVmlydHVhbCBNb2RlIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfREUJCTIgLyogRGVidWdnaW5nIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUFNFIAkzIC8qIFBhZ2UgU2l6ZSBFeHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1RTQwkJNCAvKiBUaW1lIFN0YW1wIENvdW50ZXIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTVNSCQk1IC8qIE1vZGVsLVNwZWNpZmljIFJlZ2lzdGVycywgUkRNU1IsIFdSTVNSICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1BBRQkJNiAvKiBQaHlzaWNhbCBBZGRyZXNzIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTUNFCQk3IC8qIE1hY2hpbmUgQ2hlY2sgQXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYOAkJOCAvKiBDTVBYQ0hHOCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BUElDCTkgLyogT25ib2FyZCBBUElDICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NFUAkJMTEgLyogU1lTRU5URVIvU1lTRVhJVCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NVFJSCTEyIC8qIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QR0UJCTEzIC8qIFBhZ2UgR2xvYmFsIEVuYWJsZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NQ0EJCTE0IC8qIE1hY2hpbmUgQ2hlY2sgQXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NNT1YJMTUgLyogQ01PViBpbnN0cnVjdGlvbiAoRkNNT1ZDQyBhbmQgRkNPTUkgdG9vIGlmIEZQVSBwcmVzZW50KSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QQVQJCTE2IC8qIFBhZ2UgQXR0cmlidXRlIFRhYmxlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1BTRTM2CTE3IC8qIDM2LWJpdCBQU0VzICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1BOCQkxOCAvKiBQcm9jZXNzb3Igc2VyaWFsIG51bWJlciAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DTEZMU0gJMTkgLyogU3VwcG9ydHMgdGhlIENMRkxVU0ggaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRFRFUwkyMSAvKiBEZWJ1ZyBUcmFjZSBTdG9yZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BQ1BJCTIyIC8qIEFDUEkgdmlhIE1TUiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NTVgJCTIzIC8qIE11bHRpbWVkaWEgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9GWFNSCTI0IC8qIEZYU0FWRSBhbmQgRlhSU1RPUiBpbnN0cnVjdGlvbnMgKGZhc3Qgc2F2ZSBhbmQgcmVzdG9yZSAqLworCQkJCSAgICAgICAgICAvKiBvZiBGUFUgY29udGV4dCksIGFuZCBDUjQuT1NGWFNSIGF2YWlsYWJsZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9YTU0JCTI1IC8qIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NMgkyNiAvKiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zLTIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfU0VMRlNOT09QCTI3IC8qIENQVSBzZWxmIHNub29wICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0hUCQkyOCAvKiBIeXBlci1UaHJlYWRpbmcgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQUNDCQkyOSAvKiBBdXRvbWF0aWMgY2xvY2sgY29udHJvbCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9JQTY0CTMwIC8qIElBLTY0IHByb2Nlc3NvciAqLworCisvKiBBTUQtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4ODAwMDAwMDEsIHdvcmQgMSAqLworLyogRG9uJ3QgZHVwbGljYXRlIGZlYXR1cmUgZmxhZ3Mgd2hpY2ggYXJlIHJlZHVuZGFudCB3aXRoIEludGVsISAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TWVNDQUxMCTExIC8qIFNZU0NBTEwvU1lTUkVUICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01NWEVYVAkyMiAvKiBBTUQgTU1YIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTE0JCTI5IC8qIExvbmcgTW9kZSAoeDg2LTY0KSAqLworI2RlZmluZSBYODZfRkVBVFVSRV8zRE5PV0VYVAkzMCAvKiBBTUQgM0ROb3chIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfM0ROT1cJMzEgLyogM0ROb3chICovCisKKy8qKiB4ODYgQ1BVIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgY3B1aW5mb194ODYgeworCS8qKiBDUFUgZmVhdHVyZXMgKi8KKwl1bnNpZ25lZCBpbnQgZmVhdHVyZXM7CisJLyoqIDY0LWJpdCBDUFUgZmVhdHVyZXMgKi8KKwl1bnNpZ25lZCBpbnQgYW1kX2ZlYXR1cmVzOworfTsKKworLyoKKyAqIEVGTEFHUyBiaXRzCisgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19DRgkweDAwMDAwMDAxIC8qIENhcnJ5IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19QRgkweDAwMDAwMDA0IC8qIFBhcml0eSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfQUYJMHgwMDAwMDAxMCAvKiBBdXhpbGxhcnkgY2FycnkgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1pGCTB4MDAwMDAwNDAgLyogWmVybyBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfU0YJMHgwMDAwMDA4MCAvKiBTaWduIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19URgkweDAwMDAwMTAwIC8qIFRyYXAgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0lGCTB4MDAwMDAyMDAgLyogSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19ERgkweDAwMDAwNDAwIC8qIERpcmVjdGlvbiBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfT0YJMHgwMDAwMDgwMCAvKiBPdmVyZmxvdyBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfSU9QTAkweDAwMDAzMDAwIC8qIElPUEwgbWFzayAqLworI2RlZmluZSBYODZfRUZMQUdTX05UCTB4MDAwMDQwMDAgLyogTmVzdGVkIFRhc2sgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19SRgkweDAwMDEwMDAwIC8qIFJlc3VtZSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVk0JMHgwMDAyMDAwMCAvKiBWaXJ0dWFsIE1vZGUgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19BQwkweDAwMDQwMDAwIC8qIEFsaWdubWVudCBDaGVjayAqLworI2RlZmluZSBYODZfRUZMQUdTX1ZJRgkweDAwMDgwMDAwIC8qIFZpcnR1YWwgSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19WSVAJMHgwMDEwMDAwMCAvKiBWaXJ0dWFsIEludGVycnVwdCBQZW5kaW5nICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfSUQJMHgwMDIwMDAwMCAvKiBDUFVJRCBkZXRlY3Rpb24gZmxhZyAqLworCisvKgorICogR2VuZXJpYyBDUFVJRCBmdW5jdGlvbgorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitjcHVpZCAoIGludCBvcCwgdW5zaWduZWQgaW50ICplYXgsIHVuc2lnbmVkIGludCAqZWJ4LAorCXVuc2lnbmVkIGludCAqZWN4LCB1bnNpZ25lZCBpbnQgKmVkeCApIHsKKwlfX2FzbV9fICggImNwdWlkIiA6CisJCSAgIj1hIiAoICplYXggKSwgIj1iIiAoICplYnggKSwgIj1jIiAoICplY3ggKSwgIj1kIiAoICplZHggKQorCQk6ICIwIiAoIG9wICkgKTsKK30KKworZXh0ZXJuIHZvaWQgZ2V0X2NwdWluZm8gKCBzdHJ1Y3QgY3B1aW5mb194ODYgKmNwdSApOworCisjZW5kaWYgLyogSTM4Nl9CSVRTX0NQVV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL2VsdG9yaXRvLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL2VsdG9yaXRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzZTlhYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvZWx0b3JpdG8uaApAQCAtMCwwICsxLDMgQEAKKyNpZm5kZWYgRUxUT1JJVE9fUExBVEZPUk0KKyNkZWZpbmUgRUxUT1JJVE9fUExBVEZPUk0gRUxUT1JJVE9fUExBVEZPUk1fWDg2CisjZW5kaWYgLyogRUxUT1JJVE9fUExBVEZPUk0gKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvZW5kaWFuLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MTg4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL2VuZGlhbi5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBFVEhFUkJPT1RfQklUU19FTkRJQU5fSAorI2RlZmluZSBFVEhFUkJPT1RfQklUU19FTkRJQU5fSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorCisjZW5kaWYgLyogRVRIRVJCT09UX0JJVFNfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvZXJyZmlsZS5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9lcnJmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiOGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvZXJyZmlsZS5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgX0JJVFNfRVJSRklMRV9ICisjZGVmaW5lIF9CSVRTX0VSUkZJTEVfSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGFkZHRvZ3JvdXAgZXJyZmlsZSBFcnJvciBmaWxlIGlkZW50aWZpZXJzCisgKiBAeworICovCisKKyNkZWZpbmUgRVJSRklMRV9tZW10b3BfdW1hbGxvYwkoIEVSUkZJTEVfQVJDSCB8IEVSUkZJTEVfQ09SRSB8IDB4MDAwMDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX21lbW1hcAkJKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0NPUkUgfCAweDAwMDEwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9wbnBiaW9zCQkoIEVSUkZJTEVfQVJDSCB8IEVSUkZJTEVfQ09SRSB8IDB4MDAwMjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2Jpb3Nfc21iaW9zCSggRVJSRklMRV9BUkNIIHwgRVJSRklMRV9DT1JFIHwgMHgwMDAzMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfYmlvc2ludAkJKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0NPUkUgfCAweDAwMDQwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pbnQxMwkJKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0NPUkUgfCAweDAwMDUwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9weGVwYXJlbnQJKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0NPUkUgfCAweDAwMDYwMDAwICkKKworI2RlZmluZSBFUlJGSUxFX2Jvb3RzZWN0b3IgICAgICggRVJSRklMRV9BUkNIIHwgRVJSRklMRV9JTUFHRSB8IDB4MDAwMDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2J6aW1hZ2UJICAgICAgICggRVJSRklMRV9BUkNIIHwgRVJSRklMRV9JTUFHRSB8IDB4MDAwMTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2VsdG9yaXRvICAgICAgICggRVJSRklMRV9BUkNIIHwgRVJSRklMRV9JTUFHRSB8IDB4MDAwMjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX211bHRpYm9vdCAgICAgICggRVJSRklMRV9BUkNIIHwgRVJSRklMRV9JTUFHRSB8IDB4MDAwMzAwMDAgKQorI2RlZmluZSBFUlJGSUxFX25iaQkgICAgICAgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0lNQUdFIHwgMHgwMDA0MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfcHhlX2ltYWdlICAgICAgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0lNQUdFIHwgMHgwMDA1MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZWxmYm9vdAkgICAgICAgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0lNQUdFIHwgMHgwMDA2MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfY29tYm9vdCAgICAgICAgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0lNQUdFIHwgMHgwMDA3MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfY29tMzIgICAgICAgICAgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0lNQUdFIHwgMHgwMDA4MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfY29tYm9vdF9yZXNvbHYgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0lNQUdFIHwgMHgwMDA5MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfY29tYm9vdF9jYWxsICAgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0lNQUdFIHwgMHgwMDBhMDAwMCApCisKKyNkZWZpbmUgRVJSRklMRV91bmRpCQkgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX05FVCB8IDB4MDAwMDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3VuZGlsb2FkCSAoIEVSUkZJTEVfQVJDSCB8IEVSUkZJTEVfTkVUIHwgMHgwMDAxMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfdW5kaW5ldAkJICggRVJSRklMRV9BUkNIIHwgRVJSRklMRV9ORVQgfCAweDAwMDIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV91bmRpb25seQkgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX05FVCB8IDB4MDAwMzAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3VuZGlyb20JCSAoIEVSUkZJTEVfQVJDSCB8IEVSUkZJTEVfTkVUIHwgMHgwMDA0MDAwMCApCisKKyNkZWZpbmUgRVJSRklMRV90aW1lcl9yZHRzYyAgICAoIEVSUkZJTEVfQVJDSCB8IEVSUkZJTEVfRFJJVkVSIHwgMHgwMDAwMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfdGltZXJfYmlvcyAgICAgKCBFUlJGSUxFX0FSQ0ggfCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAwMTAwMDAgKQorCisvKiogQH0gKi8KKworI2VuZGlmIC8qIF9CSVRTX0VSUkZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9pby5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZWQ5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL2lvLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfQklUU19JT19ICisjZGVmaW5lIF9CSVRTX0lPX0gKKworLyoqIEBmaWxlCisgKgorICogaTM4Ni1zcGVjaWZpYyBJL08gQVBJIGltcGxlbWVudGF0aW9ucworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL3g4Nl9pby5oPgorCisjZW5kaWYgLyogX0JJVFNfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9uYXAuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvbmFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1NGY2YgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvbmFwLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfQklUU19OQVBfSAorI2RlZmluZSBfQklUU19OQVBfSAorCisvKiogQGZpbGUKKyAqCisgKiBpMzg2LXNwZWNpZmljIENQVSBzbGVlcGluZyBBUEkgaW1wbGVtZW50YXRpb25zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvYmlvc19uYXAuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9lZml4ODZfbmFwLmg+CisKKyNlbmRpZiAvKiBfQklUU19NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9zbWJpb3MuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvc21iaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4NDEzYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvc21iaW9zLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfQklUU19TTUJJT1NfSAorI2RlZmluZSBfQklUU19TTUJJT1NfSAorCisvKiogQGZpbGUKKyAqCisgKiBpMzg2LXNwZWNpZmljIFNNQklPUyBBUEkgaW1wbGVtZW50YXRpb25zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvYmlvc19zbWJpb3MuaD4KKworI2VuZGlmIC8qIF9CSVRTX1NNQklPU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL3N0ZGludC5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRmMTMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy9zdGRpbnQuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9CSVRTX1NURElOVF9ICisjZGVmaW5lIF9CSVRTX1NURElOVF9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKwordHlwZWRlZiBfX1NJWkVfVFlQRV9fCQlzaXplX3Q7Cit0eXBlZGVmIHNpZ25lZCBsb25nCQlzc2l6ZV90OwordHlwZWRlZiBzaWduZWQgbG9uZwkJb2ZmX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXVpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJdWludDY0X3Q7CisKK3R5cGVkZWYgc2lnbmVkIGNoYXIJCWludDhfdDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0CQlpbnQxNl90OwordHlwZWRlZiBzaWduZWQgaW50CQlpbnQzMl90OwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nCWludDY0X3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJcGh5c2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJaW50cHRyX3Q7CisKKyNlbmRpZiAvKiBfQklUU19TVERJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy90aW1lci5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTZiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL3RpbWVyLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfQklUU19USU1FUl9ICisjZGVmaW5lIF9CSVRTX1RJTUVSX0gKKworLyoqIEBmaWxlCisgKgorICogaTM4Ni1zcGVjaWZpYyB0aW1lciBBUEkgaW1wbGVtZW50YXRpb25zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvYmlvc190aW1lci5oPgorI2luY2x1ZGUgPGdweGUvcmR0c2NfdGltZXIuaD4KKworI2VuZGlmIC8qIF9CSVRTX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvdWFjY2Vzcy5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy91YWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNTJlMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JpdHMvdWFjY2Vzcy5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0JJVFNfVUFDQ0VTU19ICisjZGVmaW5lIF9CSVRTX1VBQ0NFU1NfSAorCisvKiogQGZpbGUKKyAqCisgKiBpMzg2LXNwZWNpZmljIHVzZXIgYWNjZXNzIEFQSSBpbXBsZW1lbnRhdGlvbnMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8bGlicm0uaD4KKworI2VuZGlmIC8qIF9CSVRTX1VBQ0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy91bWFsbG9jLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iaXRzL3VtYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2JhMmNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYml0cy91bWFsbG9jLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfQklUU19VTUFMTE9DX0gKKyNkZWZpbmUgX0JJVFNfVU1BTExPQ19ICisKKy8qKiBAZmlsZQorICoKKyAqIGkzODYtc3BlY2lmaWMgdXNlciBtZW1vcnkgYWxsb2NhdGlvbiBBUEkgaW1wbGVtZW50YXRpb25zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvbWVtdG9wX3VtYWxsb2MuaD4KKworI2VuZGlmIC8qIF9CSVRTX1VNQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYm9jaHMuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JvY2hzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwOTBmYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2JvY2hzLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBCT0NIU19ICisjZGVmaW5lIEJPQ0hTX0gKKworLyoqIEBmaWxlCisgKgorICogYm9jaHMgYnJlYWtwb2ludHMKKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBAYyBib2Noc2JwLCB0aGUgbWFnaWMgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB0aGF0CisgKiBpcyBpbmNyZWRpYmx5IHVzZWZ1bCB3aGVuIGRlYnVnZ2luZyB1bmRlciBib2Nocy4gIFRoaXMgZmlsZSBzaG91bGQKKyAqIG5ldmVyIGJlIGluY2x1ZGVkIGluIHByb2R1Y3Rpb24gY29kZS4KKyAqCisgKiBVc2UgdGhlIHBzZXVkby1pbnN0cnVjdGlvbiBAYyBib2Noc2JwIGluIGFzc2VtYmx5IGNvZGUsIG9yIHRoZQorICogYm9jaHNicCgpIGZ1bmN0aW9uIGluIEMgY29kZS4KKyAqCisgKi8KKworI2lmZGVmIEFTU0VNQkxZCisKKy8qIEJyZWFrcG9pbnQgZm9yIHdoZW4gZGVidWdnaW5nIHVuZGVyIGJvY2hzICovCisjZGVmaW5lIGJvY2hzYnAgeGNoZ3cgJWJ4LCAlYngKKyNkZWZpbmUgQk9DSFNCUCBib2Noc2JwCisKKyNlbHNlIC8qIEFTU0VNQkxZICovCisKKy8qKiBCcmVha3BvaW50IGZvciB3aGVuIGRlYnVnZ2luZyB1bmRlciBib2NocyAqLworc3RhdGljIGlubGluZSB2b2lkIGJvY2hzYnAgKCB2b2lkICkgeworCV9fYXNtX18gX192b2xhdGlsZV9fICggInhjaGd3ICVieCwgJWJ4IiApOworfQorCisjZW5kaWYgLyogQVNTRU1CTFkgKi8KKworI3dhcm5pbmcgImJvY2hzLmggc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbnRvIHByb2R1Y3Rpb24gY29kZSIKKworI2VuZGlmIC8qIEJPQ0hTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2Jvb3RzZWN0b3IuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2Jvb3RzZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzMwZmJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvYm9vdHNlY3Rvci5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0JPT1RTRUNUT1JfSAorI2RlZmluZSBfQk9PVFNFQ1RPUl9ICisKKy8qKiBAZmlsZQorICoKKyAqIHg4NiBib290c2VjdG9yIGltYWdlIGZvcm1hdAorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworZXh0ZXJuIGludCBjYWxsX2Jvb3RzZWN0b3IgKCB1bnNpZ25lZCBpbnQgc2VnbWVudCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGRyaXZlICk7CisKKyNlbmRpZiAvKiBfQk9PVFNFQ1RPUl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iemltYWdlLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9iemltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiMzFmZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2J6aW1hZ2UuaApAQCAtMCwwICsxLDE0MiBAQAorI2lmbmRlZiBfQlpJTUFHRV9ICisjZGVmaW5lIF9CWklNQUdFX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogQSBiekltYWdlIGhlYWRlcgorICoKKyAqIEFzIGRvY3VtZW50ZWQgaW4gRG9jdW1lbnRhdGlvbi9pMzg2L2Jvb3QudHh0CisgKi8KK3N0cnVjdCBiemltYWdlX2hlYWRlciB7CisJLyoqIFRoZSBzaXplIG9mIHRoZSBzZXR1cCBpbiBzZWN0b3JzCisJICoKKwkgKiBJZiB0aGlzIGZpZWxkIGNvbnRhaW5zIDAsIGFzc3VtZSBpdCBjb250YWlucyA0LgorCSAqLworCXVpbnQ4X3Qgc2V0dXBfc2VjdHM7CisJLyoqIElmIHNldCwgdGhlIHJvb3QgaXMgbW91bnRlZCByZWFkb25seSAqLworCXVpbnQxNl90IHJvb3RfZmxhZ3M7CisJLyoqIERPIE5PVCBVU0UgLSBmb3IgYm9vdHNlY3QuUyB1c2Ugb25seSAqLworCXVpbnQxNl90IHN5c3NpemU7CisJLyoqIERPIE5PVCBVU0UgLSBvYnNvbGV0ZSAqLworCXVpbnQxNl90IHN3YXBfZGV2OworCS8qKiBETyBOT1QgVVNFIC0gZm9yIGJvb3RzZWN0LlMgdXNlIG9ubHkgKi8KKwl1aW50MTZfdCByYW1fc2l6ZTsKKwkvKiogVmlkZW8gbW9kZSBjb250cm9sICovCisJdWludDE2X3QgdmlkX21vZGU7CisJLyoqIERlZmF1bHQgcm9vdCBkZXZpY2UgbnVtYmVyICovCisJdWludDE2X3Qgcm9vdF9kZXY7CisJLyoqIDB4QUE1NSBtYWdpYyBudW1iZXIgKi8KKwl1aW50MTZfdCBib290X2ZsYWc7CisJLyoqIEp1bXAgaW5zdHJ1Y3Rpb24gKi8KKwl1aW50MTZfdCBqdW1wOworCS8qKiBNYWdpYyBzaWduYXR1cmUgIkhkclMiICovCisJdWludDMyX3QgaGVhZGVyOworCS8qKiBCb290IHByb3RvY29sIHZlcnNpb24gc3VwcG9ydGVkICovCisJdWludDE2X3QgdmVyc2lvbjsKKwkvKiogQm9vdCBsb2FkZXIgaG9vayAoc2VlIGJlbG93KSAqLworCXVpbnQzMl90IHJlYWxtb2RlX3N3dGNoOworCS8qKiBUaGUgbG9hZC1sb3cgc2VnbWVudCAoMHgxMDAwKSAob2Jzb2xldGUpICovCisJdWludDE2X3Qgc3RhcnRfc3lzOworCS8qKiBQb2ludGVyIHRvIGtlcm5lbCB2ZXJzaW9uIHN0cmluZyAqLworCXVpbnQxNl90IGtlcm5lbF92ZXJzaW9uOworCS8qKiBCb290IGxvYWRlciBpZGVudGlmaWVyICovCisJdWludDhfdCB0eXBlX29mX2xvYWRlcjsKKwkvKiogQm9vdCBwcm90b2NvbCBvcHRpb24gZmxhZ3MgKi8KKwl1aW50OF90IGxvYWRmbGFnczsKKwkvKiogTW92ZSB0byBoaWdoIG1lbW9yeSBzaXplICh1c2VkIHdpdGggaG9va3MpICovCisJdWludDE2X3Qgc2V0dXBfbW92ZV9zaXplOworCS8qKiBCb290IGxvYWRlciBob29rIChzZWUgYmVsb3cpICovCisJdWludDMyX3QgY29kZTMyX3N0YXJ0OworCS8qKiBpbml0cmQgbG9hZCBhZGRyZXNzIChzZXQgYnkgYm9vdCBsb2FkZXIpICovCisJdWludDMyX3QgcmFtZGlza19pbWFnZTsKKwkvKiogaW5pdHJkIHNpemUgKHNldCBieSBib290IGxvYWRlcikgKi8KKwl1aW50MzJfdCByYW1kaXNrX3NpemU7CisJLyoqIERPIE5PVCBVU0UgLSBmb3IgYm9vdHNlY3QuUyB1c2Ugb25seSAqLworCXVpbnQzMl90IGJvb3RzZWN0X2tsdWRnZTsKKwkvKiogRnJlZSBtZW1vcnkgYWZ0ZXIgc2V0dXAgZW5kICovCisJdWludDE2X3QgaGVhcF9lbmRfcHRyOworCS8qKiBVbnVzZWQgKi8KKwl1aW50MTZfdCBwYWQxOworCS8qKiAzMi1iaXQgcG9pbnRlciB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZSAqLworCXVpbnQzMl90IGNtZF9saW5lX3B0cjsKKwkvKiogSGlnaGVzdCBsZWdhbCBpbml0cmQgYWRkcmVzcyAqLworCXVpbnQzMl90IGluaXRyZF9hZGRyX21heDsKKwkvKiogUGh5c2ljYWwgYWRkciBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIGtlcm5lbAkqLworCXVpbnQzMl90IGtlcm5lbF9hbGlnbm1lbnQ7CisJLyoqIFdoZXRoZXIga2VybmVsIGlzIHJlbG9jYXRhYmxlIG9yIG5vdCAqLworCXVpbnQ4X3QgcmVsb2NhdGFibGVfa2VybmVsOworCS8qKiBVbnVzZWQgKi8KKwl1aW50OF90IHBhZDJbM107CisJLyoqIE1heGltdW0gc2l6ZSBvZiB0aGUga2VybmVsIGNvbW1hbmQgbGluZSAqLworCXVpbnQzMl90IGNtZGxpbmVfc2l6ZTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBPZmZzZXQgb2YgYnpJbWFnZSBoZWFkZXIgd2l0aGluIGtlcm5lbCBpbWFnZSAqLworI2RlZmluZSBCWklfSERSX09GRlNFVCAweDFmMQorCisvKiogYnpJbWFnZSBib290IGZsYWcgdmFsdWUgKi8KKyNkZWZpbmUgQlpJX0JPT1RfRkxBRyAweGFhNTUKKworLyoqIGJ6SW1hZ2UgbWFnaWMgc2lnbmF0dXJlIHZhbHVlICovCisjZGVmaW5lIEJaSV9TSUdOQVRVUkUgMHg1MzcyNjQ0OAorCisvKiogYnpJbWFnZSBib290IGxvYWRlciBpZGVudGlmaWVyIGZvciBFdGhlcmJvb3QgKi8KKyNkZWZpbmUgQlpJX0xPQURFUl9UWVBFX0VUSEVSQk9PVCAweDQwCisKKy8qKiBiekltYWdlIGJvb3QgbG9hZGVyIGlkZW50aWZpZXIgZm9yIGdQWEUKKyAqCisgKiBXZSBhZHZlcnRpc2Ugb3Vyc2VsdmVzIGFzIEV0aGVyYm9vdCB2ZXJzaW9uIDYuCisgKi8KKyNkZWZpbmUgQlpJX0xPQURFUl9UWVBFX0dQWEUgKCBCWklfTE9BREVSX1RZUEVfRVRIRVJCT09UIHwgMHgwNiApCisKKy8qKiBiekltYWdlICJsb2FkIGhpZ2giIGZsYWcgKi8KKyNkZWZpbmUgQlpJX0xPQURfSElHSCAweDAxCisKKy8qKiBMb2FkIGFkZHJlc3MgZm9yIGhpZ2gtbG9hZGVkIGtlcm5lbHMgKi8KKyNkZWZpbmUgQlpJX0xPQURfSElHSF9BRERSIDB4MTAwMDAwCisKKy8qKiBMb2FkIGFkZHJlc3MgZm9yIGxvdy1sb2FkZWQga2VybmVscyAqLworI2RlZmluZSBCWklfTE9BRF9MT1dfQUREUiAweDEwMDAwCisKKy8qKiBiekltYWdlICJrZXJuZWwgY2FuIHVzZSBoZWFwIiBmbGFnICovCisjZGVmaW5lIEJaSV9DQU5fVVNFX0hFQVAgMHg4MAorCisvKiogYnpJbWFnZSBzcGVjaWFsIHZpZGVvIG1vZGUgIm5vcm1hbCIgKi8KKyNkZWZpbmUgQlpJX1ZJRF9NT0RFX05PUk1BTCAweGZmZmYKKworLyoqIGJ6SW1hZ2Ugc3BlY2lhbCB2aWRlbyBtb2RlICJleHQiICovCisjZGVmaW5lIEJaSV9WSURfTU9ERV9FWFQgMHhmZmZlCisKKy8qKiBiekltYWdlIHNwZWNpYWwgdmlkZW8gbW9kZSAiYXNrIiAqLworI2RlZmluZSBCWklfVklEX01PREVfQVNLIDB4ZmZmZAorCisvKiogYnpJbWFnZSBtYXhpbXVtIGluaXRyZCBhZGRyZXNzIGZvciB2ZXJzaW9ucyA8IDIuMDMgKi8KKyNkZWZpbmUgQlpJX0lOSVRSRF9NQVggMHgzN2ZmZmZmZgorCisvKiogYnpJbWFnZSBjb21tYW5kLWxpbmUgc3RydWN0dXJlIHVzZWQgYnkgb2xkZXIga2VybmVscyAqLworc3RydWN0IGJ6aW1hZ2VfY21kbGluZSB7CisJLyoqIE1hZ2ljIHNpZ25hdHVyZSAqLworCXVpbnQxNl90IG1hZ2ljOworCS8qKiBPZmZzZXQgdG8gY29tbWFuZCBsaW5lICovCisJdWludDE2X3Qgb2Zmc2V0OworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIE9mZnNldCBvZiBiekltYWdlIGNvbW1hbmQtbGluZSBzdHJ1Y3R1cmUgd2l0aGluIGtlcm5lbCBpbWFnZSAqLworI2RlZmluZSBCWklfQ01ETElORV9PRkZTRVQgMHgyMAorCisvKiogYnpJbWFnZSBjb21tYW5kIGxpbmUgcHJlc2VudCBtYWdpYyBtYXJrZXIgdmFsdWUgKi8KKyNkZWZpbmUgQlpJX0NNRExJTkVfTUFHSUMgMHhhMzNmCisKKy8qKiBBc3N1bWVkIHNpemUgb2YgcmVhbC1tb2RlIHBvcnRpb24gKGluY2x1ZGluZyAuYnNzKSAqLworI2RlZmluZSBCWklfQVNTVU1FRF9STV9TSVpFIDB4ODAwMAorCisvKiogQW1vdW50IG9mIHN0YWNrIHNwYWNlIHRvIHByb3ZpZGUgKi8KKyNkZWZpbmUgQlpJX1NUQUNLX1NJWkUgMHgxMDAwCisKKy8qKiBNYXhpbXVtIHNpemUgb2YgY29tbWFuZCBsaW5lICovCisjZGVmaW5lIEJaSV9DTURMSU5FX1NJWkUgMHgxMDAKKworI2VuZGlmIC8qIF9CWklNQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2NvbWJvb3QuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2NvbWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjMyZjBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvY29tYm9vdC5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIENPTUJPT1RfSAorI2RlZmluZSBDT01CT09UX0gKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFNZU0xJTlVYIENPTUJPT1QKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisKKy8qKiBTZWdtZW50IHVzZWQgZm9yIENPTUJPT1QgUFNQIGFuZCBpbWFnZSAqLworI2RlZmluZSBDT01CT09UX1BTUF9TRUcgMHgwN0MwCisKKy8qKiBFbnRyeSBwb2ludCBhZGRyZXNzIG9mIENPTTMyIGltYWdlcyAqLworI2RlZmluZSBDT00zMl9TVEFSVF9QSFlTIDB4MTAxMDAwCisKKy8qKiBDT00zMiBib3VuY2UgYnVmZmVyIHNlZ21lbnQgKi8KKyNkZWZpbmUgQ09NMzJfQk9VTkNFX1NFRyAweDA3QzAKKworLyoqIFNpemUgb2YgU1lTTElOVVggZmlsZSBibG9jayBpbiBieXRlcyAqLworI2RlZmluZSBDT01CT09UX0ZJTEVfQkxPQ0tTWiA1MTIKKworLyoqIENPTUJPT1QgZmVhdHVyZSBmbGFncyAoSU5UIDIyaCBBWD0xNWgpICovCisjZGVmaW5lIENPTUJPT1RfRkVBVFVSRV9MT0NBTF9CT09UICgxIDw8IDApCisjZGVmaW5lIENPTUJPT1RfRkVBVFVSRV9JRExFX0xPT1AgICgxIDw8IDEpCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBzaHVmZmxlIGRlc2NyaXB0b3JzIGZvciAKKyAqIHNodWZmbGUgYW5kIGJvb3QgZnVuY3Rpb25zCisgKiAoSU5UIDIyaCBBWD0wMDEyaCwgMDAxQWgsIDAwMUJoKQorICovCisjZGVmaW5lIENPTUJPT1RfTUFYX1NIVUZGTEVfREVTQ1JJUFRPUlMgNjgyCisKK3R5cGVkZWYgdW5pb24geworCXVpbnQzMl90IGw7CisJdWludDE2X3Qgd1syXTsKKwl1aW50OF90ICBiWzRdOworfSBjb20zMl9yZWczMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgZ3M7ICAgICAgICAgICAgICAgIC8qIE9mZnNldCAgMCAqLworCXVpbnQxNl90IGZzOyAgICAgICAgICAgICAgICAvKiBPZmZzZXQgIDIgKi8KKwl1aW50MTZfdCBlczsgICAgICAgICAgICAgICAgLyogT2Zmc2V0ICA0ICovCisJdWludDE2X3QgZHM7ICAgICAgICAgICAgICAgIC8qIE9mZnNldCAgNiAqLworCisJY29tMzJfcmVnMzJfdCBlZGk7ICAgICAgICAgIC8qIE9mZnNldCAgOCAqLworCWNvbTMyX3JlZzMyX3QgZXNpOyAgICAgICAgICAvKiBPZmZzZXQgMTIgKi8KKwljb20zMl9yZWczMl90IGVicDsgICAgICAgICAgLyogT2Zmc2V0IDE2ICovCisJY29tMzJfcmVnMzJfdCBfdW51c2VkX2VzcDsgIC8qIE9mZnNldCAyMCAqLworCWNvbTMyX3JlZzMyX3QgZWJ4OyAgICAgICAgICAvKiBPZmZzZXQgMjQgKi8KKwljb20zMl9yZWczMl90IGVkeDsgICAgICAgICAgLyogT2Zmc2V0IDI4ICovCisJY29tMzJfcmVnMzJfdCBlY3g7ICAgICAgICAgIC8qIE9mZnNldCAzMiAqLworCWNvbTMyX3JlZzMyX3QgZWF4OyAgICAgICAgICAvKiBPZmZzZXQgMzYgKi8KKworCWNvbTMyX3JlZzMyX3QgZWZsYWdzOyAgICAgICAvKiBPZmZzZXQgNDAgKi8KK30gY29tMzJzeXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGVheDsgICAgICAgICAgICAgICAvKiBPZmZzZXQgIDAgKi8KKwl1aW50MzJfdCBlY3g7ICAgICAgICAgICAgICAgLyogT2Zmc2V0ICA0ICovCisJdWludDMyX3QgZWR4OyAgICAgICAgICAgICAgIC8qIE9mZnNldCAgOCAqLworCXVpbnQzMl90IGVieDsgICAgICAgICAgICAgICAvKiBPZmZzZXQgMTIgKi8KKwl1aW50MzJfdCBlc3A7ICAgICAgICAgICAgICAgLyogT2Zmc2V0IDE2ICovCisJdWludDMyX3QgZWJwOyAgICAgICAgICAgICAgIC8qIE9mZnNldCAyMCAqLworCXVpbnQzMl90IGVzaTsgICAgICAgICAgICAgICAvKiBPZmZzZXQgMjQgKi8KKwl1aW50MzJfdCBlZGk7ICAgICAgICAgICAgICAgLyogT2Zmc2V0IDI4ICovCisKKwl1aW50MzJfdCBlaXA7ICAgICAgICAgICAgICAgLyogT2Zmc2V0IDMyICovCit9IHN5c2xpbnV4X3BtX3JlZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBlczsgICAgICAgICAgICAgICAgLyogT2Zmc2V0ICAwICovCisJdWludDE2X3QgX3VudXNlZF9jczsgICAgICAgIC8qIE9mZnNldCAgMiAqLworCXVpbnQxNl90IGRzOyAgICAgICAgICAgICAgICAvKiBPZmZzZXQgIDQgKi8KKwl1aW50MTZfdCBzczsgICAgICAgICAgICAgICAgLyogT2Zmc2V0ICA2ICovCisJdWludDE2X3QgZnM7ICAgICAgICAgICAgICAgIC8qIE9mZnNldCAgOCAqLworCXVpbnQxNl90IGdzOyAgICAgICAgICAgICAgICAvKiBPZmZzZXQgMTAgKi8KKworCXVpbnQzMl90IGVheDsgICAgICAgICAgICAgICAgLyogT2Zmc2V0IDEyICovCisJdWludDMyX3QgZWN4OyAgICAgICAgICAgICAgICAvKiBPZmZzZXQgMTYgKi8KKwl1aW50MzJfdCBlZHg7ICAgICAgICAgICAgICAgIC8qIE9mZnNldCAyMCAqLworCXVpbnQzMl90IGVieDsgICAgICAgICAgICAgICAgLyogT2Zmc2V0IDI0ICovCisJdWludDMyX3QgZXNwOyAgICAgICAgICAgICAgICAvKiBPZmZzZXQgMjggKi8KKwl1aW50MzJfdCBlYnA7ICAgICAgICAgICAgICAgIC8qIE9mZnNldCAzMiAqLworCXVpbnQzMl90IGVzaTsgICAgICAgICAgICAgICAgLyogT2Zmc2V0IDM2ICovCisJdWludDMyX3QgZWRpOyAgICAgICAgICAgICAgICAvKiBPZmZzZXQgNDAgKi8KKworCXVpbnQxNl90IGlwOyAgICAgICAgICAgICAgICAvKiBPZmZzZXQgNDQgKi8KKwl1aW50MTZfdCBjczsgICAgICAgICAgICAgICAgLyogT2Zmc2V0IDQ2ICovCit9IHN5c2xpbnV4X3JtX3JlZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBkZXN0OworCXVpbnQzMl90IHNyYzsKKwl1aW50MzJfdCBsZW47Cit9IGNvbWJvb3Rfc2h1ZmZsZV9kZXNjcmlwdG9yOworCitleHRlcm4gdm9pZCBob29rX2NvbWJvb3RfaW50ZXJydXB0cyAoICk7CitleHRlcm4gdm9pZCB1bmhvb2tfY29tYm9vdF9pbnRlcnJ1cHRzICggKTsKKworLyogVGhlc2UgYXJlIG5vdCB0aGUgY29ycmVjdCBwcm90b3R5cGVzLCBidXQgaXQgZG9lbnMndCBtYXR0ZXIsIAorICogYXMgd2Ugb25seSBldmVyIGdldCB0aGUgYWRkcmVzcyBvZiB0aGVzZSBmdW5jdGlvbnM7CisgKiB0aGV5IGFyZSBvbmx5IGNhbGxlZCBmcm9tIENPTTMyIGNvZGUgcnVubmluZyBpbiBQSFlTX0NPREUKKyAqLworZXh0ZXJuIHZvaWQgY29tMzJfaW50Y2FsbF93cmFwcGVyICggKTsKK2V4dGVybiB2b2lkIGNvbTMyX2ZhcmNhbGxfd3JhcHBlciAoICk7CitleHRlcm4gdm9pZCBjb20zMl9jZmFyY2FsbF93cmFwcGVyICggKTsKKworLyogUmVzb2x2ZSBhIGhvc3RuYW1lIHRvIGFuIChJUHY0KSBhZGRyZXNzICovCitleHRlcm4gaW50IGNvbWJvb3RfcmVzb2x2ICggY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGluX2FkZHIgKmFkZHJlc3MgKTsKKworLyogc2V0am1wL2xvbmdqbXAgY29udGV4dCBidWZmZXIgdXNlZCB0byByZXR1cm4gYWZ0ZXIgbG9hZGluZyBhbiBpbWFnZSAqLworZXh0ZXJuIHJtam1wX2J1ZiBjb21ib290X3JldHVybjsKKworLyogUmVwbGFjZW1lbnQgaW1hZ2Ugd2hlbiBleGl0aW5nIHdpdGggQ09NQk9PVF9FWElUX1JVTl9LRVJORUwgKi8KK2V4dGVybiBzdHJ1Y3QgaW1hZ2UgKmNvbWJvb3RfcmVwbGFjZW1lbnRfaW1hZ2U7CisKK2V4dGVybiB2b2lkICpjb20zMl9leHRlcm5hbF9lc3A7CisKKyNkZWZpbmUgQ09NQk9PVF9FWElUIDEKKyNkZWZpbmUgQ09NQk9PVF9FWElUX1JVTl9LRVJORUwgMgorI2RlZmluZSBDT01CT09UX0VYSVRfQ09NTUFORCAzCisKK2V4dGVybiB2b2lkIGNvbWJvb3RfZm9yY2VfdGV4dF9tb2RlICggdm9pZCApOworCisjZGVmaW5lIENPTUJPT1RfVklERU9fR1JBUEhJQ1MgICAgMHgwMQorI2RlZmluZSBDT01CT09UX1ZJREVPX05PTlNUQU5EQVJEIDB4MDIKKyNkZWZpbmUgQ09NQk9PVF9WSURFT19WRVNBICAgICAgICAweDA0CisjZGVmaW5lIENPTUJPT1RfVklERU9fTk9URVhUICAgICAgMHgwOAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2Zha2VlODIwLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9mYWtlZTgyMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDBmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9mYWtlZTgyMC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfRkFLRUU4MjBfSAorI2RlZmluZSBfRkFLRUU4MjBfSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK2V4dGVybiB2b2lkIGZha2VfZTgyMCAoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHVuZmFrZV9lODIwICggdm9pZCApOworCisjZW5kaWYgLyogX0ZBS0VFODIwX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dhdGVBMjAuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dhdGVBMjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdhZDZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ2F0ZUEyMC5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBHQVRFQTIwX0gKKyNkZWZpbmUgR0FURUEyMF9ICisKK2V4dGVybiB2b2lkIGdhdGVBMjBfc2V0ICggdm9pZCApOworZXh0ZXJuIHZvaWQgZ2F0ZUEyMF91bnNldCAoIHZvaWQgKTsKKworI2VuZGlmIC8qIEdBVEVBMjBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ2RibWFjaC5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ2RibWFjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NGRhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9nZGJtYWNoLmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBHREJNQUNIX0gKKyNkZWZpbmUgR0RCTUFDSF9ICisKKy8qKiBAZmlsZQorICoKKyAqIEdEQiBhcmNoaXRlY3R1cmUgc3BlY2lmaWNzCisgKgorICogVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBtYWNoaW5lIHN0YXRlIGFuZAorICogZGVidWdnaW5nIGNvbnRleHQuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGdkYnJlZ190OworCisvKiBUaGUgcmVnaXN0ZXIgc25hcHNob3QsIHRoaXMgbXVzdCBiZSBpbiBzeW5jIHdpdGggaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRoZQorICogR0RCIHByb3RvY29sLiAqLworZW51bSB7CisJR0RCTUFDSF9FQVgsCisJR0RCTUFDSF9FQ1gsCisJR0RCTUFDSF9FRFgsCisJR0RCTUFDSF9FQlgsCisJR0RCTUFDSF9FU1AsCisJR0RCTUFDSF9FQlAsCisJR0RCTUFDSF9FU0ksCisJR0RCTUFDSF9FREksCisJR0RCTUFDSF9FSVAsCisJR0RCTUFDSF9FRkxBR1MsCisJR0RCTUFDSF9DUywKKwlHREJNQUNIX1NTLAorCUdEQk1BQ0hfRFMsCisJR0RCTUFDSF9FUywKKwlHREJNQUNIX0ZTLAorCUdEQk1BQ0hfR1MsCisJR0RCTUFDSF9OUkVHUywKKwlHREJNQUNIX1NJWkVPRl9SRUdTID0gR0RCTUFDSF9OUkVHUyAqIHNpemVvZiAoIGdkYnJlZ190ICkKK307CisKKy8qIEJyZWFrcG9pbnQgdHlwZXMgKi8KK2VudW0geworCUdEQk1BQ0hfQlBNRU0sCisJR0RCTUFDSF9CUEhXLAorCUdEQk1BQ0hfV0FUQ0gsCisJR0RCTUFDSF9SV0FUQ0gsCisJR0RCTUFDSF9BV0FUQ0gsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2RibWFjaF9zZXRfcGMgKCBnZGJyZWdfdCAqcmVncywgZ2RicmVnX3QgcGMgKSB7CisJcmVncyBbIEdEQk1BQ0hfRUlQIF0gPSBwYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdkYm1hY2hfc2V0X3NpbmdsZV9zdGVwICggZ2RicmVnX3QgKnJlZ3MsIGludCBzdGVwICkgeworCXJlZ3MgWyBHREJNQUNIX0VGTEFHUyBdICY9IH4oIDEgPDwgOCApOyAvKiBUcmFjZSBGbGFnIChURikgKi8KKwlyZWdzIFsgR0RCTUFDSF9FRkxBR1MgXSB8PSAoIHN0ZXAgPDwgOCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2RibWFjaF9icmVha3BvaW50ICggdm9pZCApIHsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJpbnQgJDNcbiIgKTsKK30KKworZXh0ZXJuIGludCBnZGJtYWNoX3NldF9icmVha3BvaW50ICggaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbiwgaW50IGVuYWJsZSApOworCisjZW5kaWYgLyogR0RCTUFDSF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL2FiZnQuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dweGUvYWJmdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNjVlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL2FiZnQuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9HUFhFX0FCRlRfSAorI2RlZmluZSBfR1BYRV9BQkZUX0gKKworLyoqIEBmaWxlCisgKgorICogQW9FIGJvb3QgZmlybXdhcmUgdGFibGUKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9hY3BpLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorCisvKiogQW9FIGJvb3QgZmlybXdhcmUgdGFibGUgc2lnbmF0dXJlICovCisjZGVmaW5lIEFCRlRfU0lHICJhQkZUIgorCisvKioKKyAqIEFvRSBCb290IEZpcm13YXJlIFRhYmxlIChhQkZUKQorICovCitzdHJ1Y3QgYWJmdF90YWJsZSB7CisJLyoqIEFDUEkgaGVhZGVyICovCisJc3RydWN0IGFjcGlfZGVzY3JpcHRpb25faGVhZGVyIGFjcGk7CisJLyoqIEFvRSBzaGVsZiAqLworCXVpbnQxNl90IHNoZWxmOworCS8qKiBBb0Ugc2xvdCAqLworCXVpbnQ4X3Qgc2xvdDsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkX2E7CisJLyoqIE1BQyBhZGRyZXNzICovCisJdWludDhfdCBtYWNbRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworZXh0ZXJuIHZvaWQgYWJmdF9maWxsX2RhdGEgKCBzdHJ1Y3QgYW9lX3Nlc3Npb24gKmFvZSApOworCisjZW5kaWYgLyogX0dQWEVfQUJGVF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL2Jpb3NfbmFwLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL2Jpb3NfbmFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyNDI5YgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dweGUvYmlvc19uYXAuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9HUFhFX0JJT1NfTkFQX0gKKyNkZWZpbmUgX0dQWEVfQklPU19OQVBfSAorCisvKiogQGZpbGUKKyAqCisgKiBCSU9TIENQVSBzbGVlcGluZworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZmRlZiBOQVBfUENCSU9TCisjZGVmaW5lIE5BUF9QUkVGSVhfcGNiaW9zCisjZWxzZQorI2RlZmluZSBOQVBfUFJFRklYX3BjYmlvcyBfX3BjYmlvc18KKyNlbmRpZgorCisjZW5kaWYgLyogX0dQWEVfQklPU19OQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ3B4ZS9iaW9zX3NtYmlvcy5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ3B4ZS9iaW9zX3NtYmlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzI2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL2Jpb3Nfc21iaW9zLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfR1BYRV9CSU9TX1NNQklPU19ICisjZGVmaW5lIF9HUFhFX0JJT1NfU01CSU9TX0gKKworLyoqIEBmaWxlCisgKgorICogU3RhbmRhcmQgUEMtQklPUyBTTUJJT1MgaW50ZXJmYWNlCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2lmZGVmIFNNQklPU19QQ0JJT1MKKyNkZWZpbmUgU01CSU9TX1BSRUZJWF9wY2Jpb3MKKyNlbHNlCisjZGVmaW5lIFNNQklPU19QUkVGSVhfcGNiaW9zIF9fcGNiaW9zXworI2VuZGlmCisKKyNlbmRpZiAvKiBfR1BYRV9CSU9TX1NNQklPU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL2Jpb3NfdGltZXIuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dweGUvYmlvc190aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWRmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL2Jpb3NfdGltZXIuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9HUFhFX0JJT1NfVElNRVJfSAorI2RlZmluZSBfR1BYRV9CSU9TX1RJTUVSX0gKKworLyoqIEBmaWxlCisgKgorICogQklPUyB0aW1lcgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZmRlZiBUSU1FUl9QQ0JJT1MKKyNkZWZpbmUgVElNRVJfUFJFRklYX3BjYmlvcworI2Vsc2UKKyNkZWZpbmUgVElNRVJfUFJFRklYX3BjYmlvcyBfX3BjYmlvc18KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3B4ZS90aW1lcjIuaD4KKworLyoqCisgKiBEZWxheSBmb3IgYSBmaXhlZCBudW1iZXIgb2YgbWljcm9zZWNvbmRzCisgKgorICogQHYgdXNlY3MJCU51bWJlciBvZiBtaWNyb3NlY29uZHMgZm9yIHdoaWNoIHRvIGRlbGF5CisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK1RJTUVSX0lOTElORSAoIHBjYmlvcywgdWRlbGF5ICkgKCB1bnNpZ25lZCBsb25nIHVzZWNzICkgeworCS8qIEJJT1MgdGltZXIgaXMgbm90IGhpZ2gtcmVzb2x1dGlvbiBlbm91Z2ggZm9yIHVkZWxheSgpLCBzbworCSAqIHdlIHVzZSB0aW1lcjIKKwkgKi8KKwl0aW1lcjJfdWRlbGF5ICggdXNlY3MgKTsKK30KKworLyoqCisgKiBHZXQgbnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQKKyAqCisgKiBAcmV0IHRpY2tzX3Blcl9zZWMJTnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZworVElNRVJfSU5MSU5FICggcGNiaW9zLCB0aWNrc19wZXJfc2VjICkgKCB2b2lkICkgeworCS8qIEJJT1MgdGltZXIgdGlja3Mgb3ZlciBhdCAxOC4yIHRpY2tzIHBlciBzZWNvbmQgKi8KKwlyZXR1cm4gMTg7Cit9CisKKyNlbmRpZiAvKiBfR1BYRV9CSU9TX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dweGUvaWJmdC5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ3B4ZS9pYmZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxZTJlNAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dweGUvaWJmdC5oCkBAIC0wLDAgKzEsMzAyIEBACisjaWZuZGVmIF9HUFhFX0lCRlRfSAorI2RlZmluZSBfR1BYRV9JQkZUX0gKKworLyoKKyAqIENvcHlyaWdodCBGZW4gU3lzdGVtcyBMdGQuIDIwMDcuICBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYXJlIGRlcml2ZWQKKyAqIGZyb20gSUJNIENvcnBvcmF0aW9uIFNhbXBsZSBQcm9ncmFtcy4gIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24KKyAqIDIwMDQsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBCU0QyICk7CisKKy8qKiBAZmlsZQorICoKKyAqIGlTQ1NJIGJvb3QgZmlybXdhcmUgdGFibGUKKyAqCisgKiBUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZG9jdW1lbnQgImlTQ1NJCisgKiBCb290IEZpcm13YXJlIFRhYmxlIChpQkZUKSIgYXMgcHVibGlzaGVkIGJ5IElCTSBhdAorICoKKyAqIGZ0cDovL2Z0cC5zb2Z0d2FyZS5pYm0uY29tL3N5c3RlbXMvc3VwcG9ydC9zeXN0ZW1feF9wZGYvaWJtX2lzY3NpX2Jvb3RfZmlybXdhcmVfdGFibGVfdjEuMDIucGRmCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL2FjcGkuaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisKKy8qKiBpU0NTSSBCb290IEZpcm13YXJlIFRhYmxlIHNpZ25hdHVyZSAqLworI2RlZmluZSBJQkZUX1NJRyAiaUJGVCIKKworLyoqIEFuIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaUJGVCAqLwordHlwZWRlZiB1aW50MTZfdCBpYmZ0X29mZl90OworCisvKiogTGVuZ3RoIG9mIGEgc3RyaW5nIHdpdGhpbiB0aGUgaUJGVCAoZXhjbHVkaW5nIHRlcm1pbmF0aW5nIE5VTCkgKi8KK3R5cGVkZWYgdWludDE2X3QgaWJmdF9zaXplX3Q7CisKKy8qKiBBIHN0cmluZyB3aXRoaW4gdGhlIGlCRlQgKi8KK3N0cnVjdCBpYmZ0X3N0cmluZyB7CisJLyoqIExlbmd0aCBvZiBzdHJpbmcgKi8KKwlpYmZ0X3NpemVfdCBsZW5ndGg7CisJLyoqIE9mZnNldCB0byBzdHJpbmcgKi8KKwlpYmZ0X29mZl90IG9mZnNldDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBbiBJUCBhZGRyZXNzIHdpdGhpbiB0aGUgaUJGVCAqLworc3RydWN0IGliZnRfaXBhZGRyIHsKKwkvKiogUmVzZXJ2ZWQ7IG11c3QgYmUgemVybyAqLworCXVpbnQxNl90IHplcm9lc1s1XTsKKwkvKiogTXVzdCBiZSAweGZmZmYgaWYgSVB2NCBhZGRyZXNzIGlzIHByZXNlbnQsIG90aGVyd2lzZSB6ZXJvICovCisJdWludDE2X3Qgb25lczsKKwkvKiogVGhlIElQdjQgYWRkcmVzcywgb3IgemVybyBpZiBub3QgcHJlc2VudCAqLworCXN0cnVjdCBpbl9hZGRyIGluOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqCisgKiBpQkZUIHN0cnVjdHVyZSBoZWFkZXIKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBjb21tb24gdG8gc2V2ZXJhbCBzZWN0aW9ucyB3aXRoaW4gdGhlIGlCRlQuCisgKi8KK3N0cnVjdCBpYmZ0X2hlYWRlciB7CisJLyoqIFN0cnVjdHVyZSBJRAorCSAqCisJICogVGhpcyBpcyBhbiBJQkZUX1NUUlVDVFVSRV9JRF9YWFggY29uc3RhbnQKKwkgKi8KKwl1aW50OF90IHN0cnVjdHVyZV9pZDsKKwkvKiogVmVyc2lvbiAoYWx3YXlzIDEpICovCisJdWludDhfdCB2ZXJzaW9uOworCS8qKiBMZW5ndGgsIGluY2x1ZGluZyB0aGlzIGhlYWRlciAqLworCXVpbnQxNl90IGxlbmd0aDsKKwkvKiogSW5kZXggCisJICoKKwkgKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGhlIE5JQyBvciBUYXJnZXQsIHdoZW4gYXBwbGljYWJsZS4KKwkgKi8KKwl1aW50OF90IGluZGV4OworCS8qKiBGbGFncyAqLworCXVpbnQ4X3QgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKioKKyAqIGlCRlQgQ29udHJvbCBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0cnVjdCBpYmZ0X2NvbnRyb2wgeworCS8qKiBDb21tb24gaGVhZGVyICovCisJc3RydWN0IGliZnRfaGVhZGVyIGhlYWRlcjsKKwkvKiogRXh0ZW5zaW9ucyAqLworCXVpbnQxNl90IGV4dGVuc2lvbnM7CisJLyoqIE9mZnNldCB0byBJbml0aWF0b3Igc3RydWN0dXJlICovCisJaWJmdF9vZmZfdCBpbml0aWF0b3I7CisJLyoqIE9mZnNldCB0byBOSUMgc3RydWN0dXJlIGZvciBOSUMgMCAqLworCWliZnRfb2ZmX3QgbmljXzA7CisJLyoqIE9mZnNldCB0byBUYXJnZXQgc3RydWN0dXJlIGZvciB0YXJnZXQgMCAqLworCWliZnRfb2ZmX3QgdGFyZ2V0XzA7CisJLyoqIE9mZnNldCB0byBOSUMgc3RydWN0dXJlIGZvciBOSUMgMSAqLworCWliZnRfb2ZmX3QgbmljXzE7CisJLyoqIE9mZnNldCB0byBUYXJnZXQgc3RydWN0dXJlIGZvciB0YXJnZXQgMSAqLworCWliZnRfb2ZmX3QgdGFyZ2V0XzE7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogU3RydWN0dXJlIElEIGZvciBDb250cm9sIHNlY3Rpb24gKi8KKyNkZWZpbmUgSUJGVF9TVFJVQ1RVUkVfSURfQ09OVFJPTCAweDAxCisKKy8qKiBBdHRlbXB0IGxvZ2luIG9ubHkgdG8gc3BlY2lmaWVkIHRhcmdldAorICoKKyAqIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBhbGwgdGFyZ2V0cyB3aWxsIGJlIGxvZ2dlZCBpbiB0by4KKyAqLworI2RlZmluZSBJQkZUX0ZMX0NPTlRST0xfU0lOR0xFX0xPR0lOX09OTFkgMHgwMQorCisvKioKKyAqIGlCRlQgSW5pdGlhdG9yIHN0cnVjdHVyZQorICoKKyAqLworc3RydWN0IGliZnRfaW5pdGlhdG9yIHsKKwkvKiogQ29tbW9uIGhlYWRlciAqLworCXN0cnVjdCBpYmZ0X2hlYWRlciBoZWFkZXI7CisJLyoqIGlTTlMgc2VydmVyICovCisJc3RydWN0IGliZnRfaXBhZGRyIGlzbnNfc2VydmVyOworCS8qKiBTTFAgc2VydmVyICovCisJc3RydWN0IGliZnRfaXBhZGRyIHNscF9zZXJ2ZXI7CisJLyoqIFByaW1hcnkgYW5kIHNlY29uZGFyeSBSYWRpdXMgc2VydmVycyAqLworCXN0cnVjdCBpYmZ0X2lwYWRkciByYWRpdXNbMl07CisJLyoqIEluaXRpYXRvciBuYW1lICovCisJc3RydWN0IGliZnRfc3RyaW5nIGluaXRpYXRvcl9uYW1lOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFN0cnVjdHVyZSBJRCBmb3IgSW5pdGlhdG9yIHNlY3Rpb24gKi8KKyNkZWZpbmUgSUJGVF9TVFJVQ1RVUkVfSURfSU5JVElBVE9SIDB4MDIKKworLyoqIEluaXRpYXRvciBibG9jayB2YWxpZCAqLworI2RlZmluZSBJQkZUX0ZMX0lOSVRJQVRPUl9CTE9DS19WQUxJRCAweDAxCisKKy8qKiBJbml0aWF0b3IgZmlybXdhcmUgYm9vdCBzZWxlY3RlZCAqLworI2RlZmluZSBJQkZUX0ZMX0lOSVRJQVRPUl9GSVJNV0FSRV9CT09UX1NFTEVDVEVEIDB4MDIKKworLyoqCisgKiBpQkZUIE5JQyBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0cnVjdCBpYmZ0X25pYyB7CisJLyoqIENvbW1vbiBoZWFkZXIgKi8KKwlzdHJ1Y3QgaWJmdF9oZWFkZXIgaGVhZGVyOworCS8qKiBJUCBhZGRyZXNzICovCisJc3RydWN0IGliZnRfaXBhZGRyIGlwX2FkZHJlc3M7CisJLyoqIFN1Ym5ldCBtYXNrCisJICoKKwkgKiBUaGlzIGlzIHRoZSBsZW5ndGggb2YgdGhlIHN1Ym5ldCBtYXNrIGluIGJpdHMgKGUuZy4gLzI0KS4KKwkgKi8KKwl1aW50OF90IHN1Ym5ldF9tYXNrX3ByZWZpeDsKKwkvKiogT3JpZ2luICovCisJdWludDhfdCBvcmlnaW47CisJLyoqIERlZmF1bHQgZ2F0ZXdheSAqLworCXN0cnVjdCBpYmZ0X2lwYWRkciBnYXRld2F5OworCS8qKiBQcmltYXJ5IGFuZCBzZWNvbmRhcnkgRE5TIHNlcnZlcnMgKi8KKwlzdHJ1Y3QgaWJmdF9pcGFkZHIgZG5zWzJdOworCS8qKiBESENQIHNlcnZlciAqLworCXN0cnVjdCBpYmZ0X2lwYWRkciBkaGNwOworCS8qKiBWTEFOIHRhZyAqLworCXVpbnQxNl90IHZsYW47CisJLyoqIE1BQyBhZGRyZXNzICovCisJdWludDhfdCBtYWNfYWRkcmVzc1s2XTsKKwkvKiogUENJIGJ1czpkZXY6Zm4gKi8KKwl1aW50MTZfdCBwY2lfYnVzX2Rldl9mdW5jOworCS8qKiBIb3N0bmFtZSAqLworCXN0cnVjdCBpYmZ0X3N0cmluZyBob3N0bmFtZTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBTdHJ1Y3R1cmUgSUQgZm9yIE5JQyBzZWN0aW9uICovCisjZGVmaW5lIElCRlRfU1RSVUNUVVJFX0lEX05JQyAweDAzCisKKy8qKiBOSUMgYmxvY2sgdmFsaWQgKi8KKyNkZWZpbmUgSUJGVF9GTF9OSUNfQkxPQ0tfVkFMSUQgMHgwMQorCisvKiogTklDIGZpcm13YXJlIGJvb3Qgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgSUJGVF9GTF9OSUNfRklSTVdBUkVfQk9PVF9TRUxFQ1RFRCAweDAyCisKKy8qKiBOSUMgZ2xvYmFsIC8gbGluayBsb2NhbCAqLworI2RlZmluZSBJQkZUX0ZMX05JQ19HTE9CQUwgMHgwNAorCisvKioKKyAqIGlCRlQgVGFyZ2V0IHN0cnVjdHVyZQorICoKKyAqLworc3RydWN0IGliZnRfdGFyZ2V0IHsKKwkvKiogQ29tbW9uIGhlYWRlciAqLworCXN0cnVjdCBpYmZ0X2hlYWRlciBoZWFkZXI7CisJLyoqIElQIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaWJmdF9pcGFkZHIgaXBfYWRkcmVzczsKKwkvKiogVENQIHBvcnQgKi8KKwl1aW50MTZfdCBzb2NrZXQ7CisJLyoqIEJvb3QgTFVOICovCisJdWludDY0X3QgYm9vdF9sdW47CisJLyoqIENIQVAgdHlwZQorCSAqCisJICogVGhpcyBpcyBhbiBJQkZUX0NIQVBfWFhYIGNvbnN0YW50LgorCSAqLworCXVpbnQ4X3QgY2hhcF90eXBlOworCS8qKiBOSUMgYXNzb2NpYXRpb24gKi8KKwl1aW50OF90IG5pY19hc3NvY2lhdGlvbjsKKwkvKiogVGFyZ2V0IG5hbWUgKi8KKwlzdHJ1Y3QgaWJmdF9zdHJpbmcgdGFyZ2V0X25hbWU7CisJLyoqIENIQVAgbmFtZSAqLworCXN0cnVjdCBpYmZ0X3N0cmluZyBjaGFwX25hbWU7CisJLyoqIENIQVAgc2VjcmV0ICovCisJc3RydWN0IGliZnRfc3RyaW5nIGNoYXBfc2VjcmV0OworCS8qKiBSZXZlcnNlIENIQVAgbmFtZSAqLworCXN0cnVjdCBpYmZ0X3N0cmluZyByZXZlcnNlX2NoYXBfbmFtZTsKKwkvKiogUmV2ZXJzZSBDSEFQIHNlY3JldCAqLworCXN0cnVjdCBpYmZ0X3N0cmluZyByZXZlcnNlX2NoYXBfc2VjcmV0OworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFN0cnVjdHVyZSBJRCBmb3IgVGFyZ2V0IHNlY3Rpb24gKi8KKyNkZWZpbmUgSUJGVF9TVFJVQ1RVUkVfSURfVEFSR0VUIDB4MDQKKworLyoqIFRhcmdldCBibG9jayB2YWxpZCAqLworI2RlZmluZSBJQkZUX0ZMX1RBUkdFVF9CTE9DS19WQUxJRCAweDAxCisKKy8qKiBUYXJnZXQgZmlybXdhcmUgYm9vdCBzZWxlY3RlZCAqLworI2RlZmluZSBJQkZUX0ZMX1RBUkdFVF9GSVJNV0FSRV9CT09UX1NFTEVDVEVEIDB4MDIKKworLyoqIFRhcmdldCB1c2UgUmFkaXVzIENIQVAgKi8KKyNkZWZpbmUgSUJGVF9GTF9UQVJHRVRfVVNFX0NIQVAgMHgwNAorCisvKiogVGFyZ2V0IHVzZSBSYWRpdXMgckNIQVAgKi8KKyNkZWZpbmUgSUJGVF9GTF9UQVJHRVRfVVNFX1JDSEFQIDB4MDgKKworLyogVmFsdWVzIGZvciBjaGFwX3R5cGUgKi8KKyNkZWZpbmUgSUJGVF9DSEFQX05PTkUJCTAJLyoqPCBObyBDSEFQIGF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lIElCRlRfQ0hBUF9PTkVfV0FZCTEJLyoqPCBPbmUtd2F5IENIQVAgKi8KKyNkZWZpbmUgSUJGVF9DSEFQX01VVFVBTAkyCS8qKjwgTXV0dWFsIENIQVAgKi8KKworLyoqCisgKiBpU0NTSSBCb290IEZpcm13YXJlIFRhYmxlIChpQkZUKQorICovCitzdHJ1Y3QgaWJmdF90YWJsZSB7CisJLyoqIEFDUEkgaGVhZGVyICovCisJc3RydWN0IGFjcGlfZGVzY3JpcHRpb25faGVhZGVyIGFjcGk7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZFsxMl07CisJLyoqIENvbnRyb2wgc3RydWN0dXJlICovCisJc3RydWN0IGliZnRfY29udHJvbCBjb250cm9sOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqCisgKiBpU0NTSSBzdHJpbmcgYmxvY2sgZGVzY3JpcHRvcgorICoKKyAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgc3RydWN0dXJlIHRoYXQgd2UgdXNlIHRvIGtlZXAgdHJhY2sgb2YgdGhlCisgKiBhbGxvY2F0aW9uIG9mIHN0cmluZyBkYXRhLgorICovCitzdHJ1Y3QgaWJmdF9zdHJpbmdfYmxvY2sgeworCS8qKiBUaGUgaUJGVCBjb250YWluaW5nIHRoZXNlIHN0cmluZ3MgKi8KKwlzdHJ1Y3QgaWJmdF90YWJsZSAqdGFibGU7CisJLyoqIE9mZnNldCBvZiBmaXJzdCBmcmVlIGJ5dGUgd2l0aGluIGlCRlQgKi8KKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworfTsKKworLyoqIEFtb3VudCBvZiBzcGFjZSByZXNlcnZlZCBmb3Igc3RyaW5ncyBpbiBhIGdQWEUgaUJGVCAqLworI2RlZmluZSBJQkZUX1NUUklOR1NfU0laRSAzODQKKworLyoqCisgKiBBbiBpQkZUIGNyZWF0ZWQgYnkgZ1BYRQorICoKKyAqLworc3RydWN0IGdweGVfaWJmdCB7CisJLyoqIFRoZSBmaXhlZCBzZWN0aW9uICovCisJc3RydWN0IGliZnRfdGFibGUgdGFibGU7CisJLyoqIFRoZSBJbml0aWF0b3Igc2VjdGlvbiAqLworCXN0cnVjdCBpYmZ0X2luaXRpYXRvciBpbml0aWF0b3IgX19hdHRyaWJ1dGVfXyAoKCBhbGlnbmVkICggMTYgKSApKTsKKwkvKiogVGhlIE5JQyBzZWN0aW9uICovCisJc3RydWN0IGliZnRfbmljIG5pYyBfX2F0dHJpYnV0ZV9fICgoIGFsaWduZWQgKCAxNiApICkpOworCS8qKiBUaGUgVGFyZ2V0IHNlY3Rpb24gKi8KKwlzdHJ1Y3QgaWJmdF90YXJnZXQgdGFyZ2V0IF9fYXR0cmlidXRlX18gKCggYWxpZ25lZCAoIDE2ICkgKSk7CisJLyoqIFN0cmluZ3MgYmxvY2sgKi8KKwljaGFyIHN0cmluZ3NbSUJGVF9TVFJJTkdTX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCwgYWxpZ25lZCAoIDE2ICkgKSk7CisKK3N0cnVjdCBuZXRfZGV2aWNlOworc3RydWN0IGlzY3NpX3Nlc3Npb247CisKK2V4dGVybiBpbnQgaWJmdF9maWxsX2RhdGEgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSApOworCisjZW5kaWYgLyogX0dQWEVfSUJGVF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL21lbXRvcF91bWFsbG9jLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL21lbXRvcF91bWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmNzAyNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dweGUvbWVtdG9wX3VtYWxsb2MuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9HUFhFX01FTVRPUF9VTUFMTE9DX0gKKyNkZWZpbmUgX0dQWEVfTUVNVE9QX1VNQUxMT0NfSAorCisvKiogQGZpbGUKKyAqCisgKiBFeHRlcm5hbCBtZW1vcnkgYWxsb2NhdGlvbgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZmRlZiBVTUFMTE9DX01FTVRPUAorI2RlZmluZSBVTUFMTE9DX1BSRUZJWF9tZW10b3AKKyNlbHNlCisjZGVmaW5lIFVNQUxMT0NfUFJFRklYX21lbXRvcCBfX21lbXRvcF8KKyNlbmRpZgorCisjZW5kaWYgLyogX0dQWEVfTUVNVE9QX1VNQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ3B4ZS9yZHRzY190aW1lci5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ3B4ZS9yZHRzY190aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YmEyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL3JkdHNjX3RpbWVyLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfR1BYRV9SRFRTQ19USU1FUl9ICisjZGVmaW5lIF9HUFhFX1JEVFNDX1RJTUVSX0gKKworLyoqIEBmaWxlCisgKgorICogUkRUU0MgdGltZXIKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaWZkZWYgVElNRVJfUkRUU0MKKyNkZWZpbmUgVElNRVJfUFJFRklYX3JkdHNjCisjZWxzZQorI2RlZmluZSBUSU1FUl9QUkVGSVhfcmR0c2MgX19yZHRzY18KKyNlbmRpZgorCisvKioKKyAqIFJEVFNDIHZhbHVlcyBjYW4gZWFzaWx5IG92ZXJmbG93IGFuIHVuc2lnbmVkIGxvbmcuICBXZSBkaXNjYXJkIHRoZQorICogbG93LW9yZGVyIGJpdHMgaW4gb3JkZXIgdG8gb2J0YWluIHNlbnNpYmx5LXNjYWxlZCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgVFNDX1NISUZUIDgKKworLyoqCisgKiBHZXQgY3VycmVudCBzeXN0ZW0gdGltZSBpbiB0aWNrcworICoKKyAqIEByZXQgdGlja3MJCUN1cnJlbnQgdGltZSwgaW4gdGlja3MKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZworVElNRVJfSU5MSU5FICggcmR0c2MsIGN1cnJ0aWNrcyApICggdm9pZCApIHsKKwl1bnNpZ25lZCBsb25nIHRpY2tzOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAicmR0c2Ncblx0IgorCQkJICAgICAgICJzaHJkbCAlMSwgJSVlZHgsICUlZWF4XG5cdCIKKwkJCSAgICAgICA6ICI9YSIgKCB0aWNrcyApIDogImkiICggVFNDX1NISUZUICkgOiAiZWR4IiApOworCXJldHVybiB0aWNrczsKK30KKworI2VuZGlmIC8qIF9HUFhFX1JEVFNDX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dweGUvc2JmdC5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ3B4ZS9zYmZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwMzg0MwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dweGUvc2JmdC5oCkBAIC0wLDAgKzEsMTI1IEBACisjaWZuZGVmIF9HUFhFX1NCRlRfSAorI2RlZmluZSBfR1BYRV9TQkZUX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGZW4gU3lzdGVtcyBMdGQgPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEJTRDIgKTsKKworLyoqIEBmaWxlCisgKgorICogU1JQIGJvb3QgZmlybXdhcmUgdGFibGUKKyAqCisgKiBUaGUgd29ya2luZyBkcmFmdCBzcGVjaWZpY2F0aW9uIGZvciB0aGUgU1JQIGJvb3QgZmlybXdhcmUgdGFibGUgY2FuCisgKiBiZSBmb3VuZCBhdAorICoKKyAqICAgaHR0cDovL2V0aGVyYm9vdC5vcmcvd2lraS9zcnAvc2JmdAorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9hY3BpLmg+CisjaW5jbHVkZSA8Z3B4ZS9zY3NpLmg+CisjaW5jbHVkZSA8Z3B4ZS9zcnAuaD4KKyNpbmNsdWRlIDxncHhlL2liX3NycC5oPgorCisvKiogU1JQIEJvb3QgRmlybXdhcmUgVGFibGUgc2lnbmF0dXJlICovCisjZGVmaW5lIFNCRlRfU0lHICJzQkZUIgorCisvKiogQW4gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzQkZUICovCit0eXBlZGVmIHVpbnQxNl90IHNiZnRfb2ZmX3Q7CisKKy8qKgorICogU1JQIEJvb3QgRmlybXdhcmUgVGFibGUKKyAqLworc3RydWN0IHNiZnRfdGFibGUgeworCS8qKiBBQ1BJIGhlYWRlciAqLworCXN0cnVjdCBhY3BpX2Rlc2NyaXB0aW9uX2hlYWRlciBhY3BpOworCS8qKiBPZmZzZXQgdG8gU0NTSSBzdWJ0YWJsZSAqLworCXNiZnRfb2ZmX3Qgc2NzaV9vZmZzZXQ7CisJLyoqIE9mZnNldCB0byBTUlAgc3VidGFibGUgKi8KKwlzYmZ0X29mZl90IHNycF9vZmZzZXQ7CisJLyoqIE9mZnNldCB0byBJQiBzdWJ0YWJsZSwgaWYgcHJlc2VudCAqLworCXNiZnRfb2ZmX3QgaWJfb2Zmc2V0OworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRbNl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKioKKyAqIHNCRlQgU0NTSSBzdWJ0YWJsZQorICovCitzdHJ1Y3Qgc2JmdF9zY3NpX3N1YnRhYmxlIHsKKwkvKiogTFVOICovCisJc3RydWN0IHNjc2lfbHVuIGx1bjsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKgorICogc0JGVCBTUlAgc3VidGFibGUKKyAqLworc3RydWN0IHNiZnRfc3JwX3N1YnRhYmxlIHsKKwkvKiogSW5pdGlhdG9yIGFuZCB0YXJnZXQgcG9ydHMgKi8KKwlzdHJ1Y3Qgc3JwX3BvcnRfaWRzIHBvcnRfaWRzOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqCisgKiBzQkZUIElCIHN1YnRhYmxlCisgKi8KK3N0cnVjdCBzYmZ0X2liX3N1YnRhYmxlIHsKKwkvKiogU291cmNlIEdJRCAqLworCXN0cnVjdCBpYl9naWQgc2dpZDsKKwkvKiogRGVzdGluYXRpb24gR0lEICovCisJc3RydWN0IGliX2dpZCBkZ2lkOworCS8qKiBTZXJ2aWNlIElEICovCisJc3RydWN0IGliX2dpZF9oYWxmIHNlcnZpY2VfaWQ7CisJLyoqIFBhcnRpdGlvbiBrZXkgKi8KKwl1aW50MTZfdCBwa2V5OworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRbNl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKioKKyAqIEFuIHNCRlQgY3JlYXRlZCBieSBnUFhFCisgKi8KK3N0cnVjdCBncHhlX3NiZnQgeworCS8qKiBUaGUgdGFibGUgaGVhZGVyICovCisJc3RydWN0IHNiZnRfdGFibGUgdGFibGU7CisJLyoqIFRoZSBTQ1NJIHN1YnRhYmxlICovCisJc3RydWN0IHNiZnRfc2NzaV9zdWJ0YWJsZSBzY3NpOworCS8qKiBUaGUgU1JQIHN1YnRhYmxlICovCisJc3RydWN0IHNiZnRfc3JwX3N1YnRhYmxlIHNycDsKKwkvKiogVGhlIElCIHN1YnRhYmxlICovCisJc3RydWN0IHNiZnRfaWJfc3VidGFibGUgaWI7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkLCBhbGlnbmVkICggMTYgKSApKTsKKworc3RydWN0IHNycF9kZXZpY2U7CisKK2V4dGVybiBpbnQgc2JmdF9maWxsX2RhdGEgKCBzdHJ1Y3Qgc3JwX2RldmljZSAqc3JwICk7CisKKyNlbmRpZiAvKiBfR1BYRV9TQkZUX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2dweGUvdGltZXIyLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL3RpbWVyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTE5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL3RpbWVyMi5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0dQWEVfVElNRVIyX0gKKyNkZWZpbmUgX0dQWEVfVElNRVIyX0gKKworLyoqIEBmaWxlCisgKgorICogVGltZXIgY2hpcCBjb250cm9sCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworZXh0ZXJuIHZvaWQgdGltZXIyX3VkZWxheSAoIHVuc2lnbmVkIGxvbmcgdXNlY3MgKTsKKworI2VuZGlmIC8qIF9HUFhFX1RJTUVSMl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9ncHhlL3g4Nl9pby5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ3B4ZS94ODZfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI1YjIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvZ3B4ZS94ODZfaW8uaApAQCAtMCwwICsxLDE1MyBAQAorI2lmbmRlZiBfR1BYRV9YODZfSU9fSAorI2RlZmluZSBfR1BYRV9YODZfSU9fSAorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIEkvTyBBUEkgZm9yIHg4NgorICoKKyAqIGkzODYgdXNlcyBkaXJlY3QgcG9pbnRlciBkZXJlZmVyZW5jZXMgZm9yIGFjY2Vzc2VzIHRvIG1lbW9yeS1tYXBwZWQKKyAqIEkvTyBzcGFjZSwgYW5kIHRoZSBpblgvb3V0WCBpbnN0cnVjdGlvbnMgZm9yIGFjY2Vzc2VzIHRvCisgKiBwb3J0LW1hcHBlZCBJL08gc3BhY2UuCisgKgorICogNjQtYml0IGF0b21pYyBhY2Nlc3NlcyAocmVhZHEoKSBhbmQgd3JpdGVxKCkpIHVzZSBNTVggaW5zdHJ1Y3Rpb25zLAorICogYW5kIHdpbGwgY3Jhc2ggb3JpZ2luYWwgUGVudGl1bSBhbmQgZWFybGllciBDUFVzLiAgRm9ydHVuYXRlbHksIG5vCisgKiBoYXJkd2FyZSB0aGF0IHJlcXVpcmVzIGF0b21pYyA2NC1iaXQgYWNjZXNzZXMgd2lsbCBwaHlzaWNhbGx5IGZpdAorICogaW50byBhIG1hY2hpbmUgd2l0aCBzdWNoIGFuIG9sZCBDUFUgYW55d2F5LgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2lmZGVmIElPQVBJX1g4NgorI2RlZmluZSBJT0FQSV9QUkVGSVhfeDg2CisjZWxzZQorI2RlZmluZSBJT0FQSV9QUkVGSVhfeDg2IF9feDg2XworI2VuZGlmCisKKy8qCisgKiBNZW1vcnkgc3BhY2UgbWFwcGluZ3MKKyAqCisgKi8KKworLyoKKyAqIFBoeXNpY2FsPC0+QnVzIGFuZCBCdXM8LT5JL08gYWRkcmVzcyBtYXBwaW5ncworICoKKyAqLworCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCitJT0FQSV9JTkxJTkUgKCB4ODYsIHBoeXNfdG9fYnVzICkgKCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciApIHsKKwlyZXR1cm4gcGh5c19hZGRyOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCitJT0FQSV9JTkxJTkUgKCB4ODYsIGJ1c190b19waHlzICkgKCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyICkgeworCXJldHVybiBidXNfYWRkcjsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitJT0FQSV9JTkxJTkUgKCB4ODYsIGlvcmVtYXAgKSAoIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIHNpemVfdCBsZW4gX191bnVzZWQgKSB7CisJcmV0dXJuIHBoeXNfdG9fdmlydCAoIGJ1c19hZGRyICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK0lPQVBJX0lOTElORSAoIHg4NiwgaW91bm1hcCApICggdm9sYXRpbGUgY29uc3Qgdm9pZCAqaW9fYWRkciBfX3VudXNlZCApIHsKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKK0lPQVBJX0lOTElORSAoIHg4NiwgaW9fdG9fYnVzICkgKCB2b2xhdGlsZSBjb25zdCB2b2lkICppb19hZGRyICkgeworCXJldHVybiB2aXJ0X3RvX3BoeXMgKCBpb19hZGRyICk7Cit9CisKKy8qCisgKiBNTUlPIHJlYWRzIGFuZCB3cml0ZXMgdXAgdG8gMzIgYml0cworICoKKyAqLworCisjZGVmaW5lIFg4Nl9SRUFEWCggX2FwaV9mdW5jLCBfdHlwZSApCQkJCQkgICAgICBcCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBfdHlwZQkJCQkJICAgICAgXAorSU9BUElfSU5MSU5FICggeDg2LCBfYXBpX2Z1bmMgKSAoIHZvbGF0aWxlIF90eXBlICppb19hZGRyICkgewkJICAgICAgXAorCXJldHVybiAqaW9fYWRkcjsJCQkJCQkgICAgICBcCit9CitYODZfUkVBRFggKCByZWFkYiwgdWludDhfdCApOworWDg2X1JFQURYICggcmVhZHcsIHVpbnQxNl90ICk7CitYODZfUkVBRFggKCByZWFkbCwgdWludDMyX3QgKTsKKworI2RlZmluZSBYODZfV1JJVEVYKCBfYXBpX2Z1bmMsIF90eXBlICkJCQkJCSAgICAgIFwKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQJCQkJCSAgICAgIFwKK0lPQVBJX0lOTElORSAoIHg4NiwgX2FwaV9mdW5jICkgKCBfdHlwZSBkYXRhLAkJCQkgICAgICBcCisJCQkJICB2b2xhdGlsZSBfdHlwZSAqaW9fYWRkciApIHsJCSAgICAgIFwKKwkqaW9fYWRkciA9IGRhdGE7CQkJCQkJICAgICAgXAorfQorWDg2X1dSSVRFWCAoIHdyaXRlYiwgdWludDhfdCApOworWDg2X1dSSVRFWCAoIHdyaXRldywgdWludDE2X3QgKTsKK1g4Nl9XUklURVggKCB3cml0ZWwsIHVpbnQzMl90ICk7CisKKy8qCisgKiBQSU8gcmVhZHMgYW5kIHdyaXRlcyB1cCB0byAzMiBiaXRzCisgKgorICovCisKKyNkZWZpbmUgWDg2X0lOWCggX2luc25fc3VmZml4LCBfdHlwZSwgX3JlZ19wcmVmaXggKQkJCSAgICAgIFwKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIF90eXBlCQkJCQkgICAgICBcCitJT0FQSV9JTkxJTkUgKCB4ODYsIGluICMjIF9pbnNuX3N1ZmZpeCApICggdm9sYXRpbGUgX3R5cGUgKmlvX2FkZHIgKSB7CSAgICAgIFwKKwlfdHlwZSBkYXRhOwkJCQkJCQkgICAgICBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAiaW4iICNfaW5zbl9zdWZmaXggIiAldzEsICUiIF9yZWdfcHJlZml4ICIwIiAgIFwKKwkJCSAgICAgICA6ICI9YSIgKCBkYXRhICkgOiAiTmQiICggaW9fYWRkciApICk7CSAgICAgIFwKKwlyZXR1cm4gZGF0YTsJCQkJCQkJICAgICAgXAorfQkJCQkJCQkJCSAgICAgIFwKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQJCQkJCSAgICAgIFwKK0lPQVBJX0lOTElORSAoIHg4NiwgaW5zICMjIF9pbnNuX3N1ZmZpeCApICggdm9sYXRpbGUgX3R5cGUgKmlvX2FkZHIsCSAgICAgIFwKKwkJCQkJICAgIF90eXBlICpkYXRhLAkJICAgICAgXAorCQkJCQkgICAgdW5zaWduZWQgaW50IGNvdW50ICkgewkgICAgICBcCisJdW5zaWduZWQgaW50IGRpc2NhcmRfRDsJCQkJCQkgICAgICBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAicmVwIGlucyIgI19pbnNuX3N1ZmZpeAkJCSAgICAgIFwKKwkJCSAgICAgICA6ICI9RCIgKCBkaXNjYXJkX0QgKQkJCSAgICAgIFwKKwkJCSAgICAgICA6ICJkIiAoIGlvX2FkZHIgKSwgImMiICggY291bnQgKSwJICAgICAgXAorCQkJCSAiMCIgKCBkYXRhICkgKTsJCQkgICAgICBcCit9CitYODZfSU5YICggYiwgdWludDhfdCwgImIiICk7CitYODZfSU5YICggdywgdWludDE2X3QsICJ3IiApOworWDg2X0lOWCAoIGwsIHVpbnQzMl90LCAiayIgKTsKKworI2RlZmluZSBYODZfT1VUWCggX2luc25fc3VmZml4LCBfdHlwZSwgX3JlZ19wcmVmaXggKQkJCSAgICAgIFwKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQJCQkJCSAgICAgIFwKK0lPQVBJX0lOTElORSAoIHg4Niwgb3V0ICMjIF9pbnNuX3N1ZmZpeCApICggX3R5cGUgZGF0YSwJCQkgICAgICBcCisJCQkJCSAgICB2b2xhdGlsZSBfdHlwZSAqaW9fYWRkciApIHsJICAgICAgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICggIm91dCIgI19pbnNuX3N1ZmZpeCAiICUiIF9yZWdfcHJlZml4ICIwLCAldzEiICBcCisJCQkgICAgICAgOiA6ICJhIiAoIGRhdGEgKSwgIk5kIiAoIGlvX2FkZHIgKSApOwkgICAgICBcCit9CQkJCQkJCQkJICAgICAgXAorc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAkJCQkJICAgICAgXAorSU9BUElfSU5MSU5FICggeDg2LCBvdXRzICMjIF9pbnNuX3N1ZmZpeCApICggdm9sYXRpbGUgX3R5cGUgKmlvX2FkZHIsCSAgICAgIFwKKwkJCQkJICAgICBjb25zdCBfdHlwZSAqZGF0YSwJCSAgICAgIFwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnQgKSB7CSAgICAgIFwKKwl1bnNpZ25lZCBpbnQgZGlzY2FyZF9TOwkJCQkJCSAgICAgIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJyZXAgb3V0cyIgI19pbnNuX3N1ZmZpeAkJCSAgICAgIFwKKwkJCSAgICAgICA6ICI9UyIgKCBkaXNjYXJkX1MgKQkJCSAgICAgIFwKKwkJCSAgICAgICA6ICJkIiAoIGlvX2FkZHIgKSwgImMiICggY291bnQgKSwJICAgICAgXAorCQkJCSAiMCIgKCBkYXRhICkgKTsJCQkgICAgICBcCit9CitYODZfT1VUWCAoIGIsIHVpbnQ4X3QsICJiIiApOworWDg2X09VVFggKCB3LCB1aW50MTZfdCwgInciICk7CitYODZfT1VUWCAoIGwsIHVpbnQzMl90LCAiayIgKTsKKworLyoKKyAqIFNsb3cgZG93biBJL08KKyAqCisgKi8KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAorSU9BUElfSU5MSU5FICggeDg2LCBpb2RlbGF5ICkgKCB2b2lkICkgeworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm91dGIgJWFsLCAkMHg4MCIgKTsKK30KKworLyoKKyAqIE1lbW9yeSBiYXJyaWVyCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK0lPQVBJX0lOTElORSAoIHg4NiwgbWIgKSAoIHZvaWQgKSB7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibG9jazsgYWRkbCAkMCwgMCglJWVzcCkiIDogOiA6ICJtZW1vcnkiICk7Cit9CisKKyNlbmRpZiAvKiBfR1BYRV9YODZfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvaW50MTMuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2ludDEzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ODRkOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2ludDEzLmgKQEAgLTAsMCArMSwyOTIgQEAKKyNpZm5kZWYgSU5UMTNfSAorI2RlZmluZSBJTlQxM19ICisKKy8qKiBAZmlsZQorICoKKyAqIElOVCAxMyBlbXVsYXRpb24KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9saXN0Lmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKworc3RydWN0IGJsb2NrX2RldmljZTsKKworLyoqCisgKiBAZGVmZ3JvdXAgaW50MTNvcHMgSU5UIDEzIG9wZXJhdGlvbiBjb2RlcworICogQHsKKyAqLworCisvKiogUmVzZXQgZGlzayBzeXN0ZW0gKi8KKyNkZWZpbmUgSU5UMTNfUkVTRVQJCQkweDAwCisvKiogR2V0IHN0YXR1cyBvZiBsYXN0IG9wZXJhdGlvbiAqLworI2RlZmluZSBJTlQxM19HRVRfTEFTVF9TVEFUVVMJCTB4MDEKKy8qKiBSZWFkIHNlY3RvcnMgKi8KKyNkZWZpbmUgSU5UMTNfUkVBRF9TRUNUT1JTCQkweDAyCisvKiogV3JpdGUgc2VjdG9ycyAqLworI2RlZmluZSBJTlQxM19XUklURV9TRUNUT1JTCQkweDAzCisvKiogR2V0IGRyaXZlIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgSU5UMTNfR0VUX1BBUkFNRVRFUlMJCTB4MDgKKy8qKiBHZXQgZGlzayB0eXBlICovCisjZGVmaW5lIElOVDEzX0dFVF9ESVNLX1RZUEUJCTB4MTUKKy8qKiBFeHRlbnNpb25zIGluc3RhbGxhdGlvbiBjaGVjayAqLworI2RlZmluZSBJTlQxM19FWFRFTlNJT05fQ0hFQ0sJCTB4NDEKKy8qKiBFeHRlbmRlZCByZWFkICovCisjZGVmaW5lIElOVDEzX0VYVEVOREVEX1JFQUQJCTB4NDIKKy8qKiBFeHRlbmRlZCB3cml0ZSAqLworI2RlZmluZSBJTlQxM19FWFRFTkRFRF9XUklURQkJMHg0MworLyoqIEdldCBleHRlbmRlZCBkcml2ZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIElOVDEzX0dFVF9FWFRFTkRFRF9QQVJBTUVURVJTCTB4NDgKKy8qKiBHZXQgQ0QtUk9NIHN0YXR1cyAvIHRlcm1pbmF0ZSBlbXVsYXRpb24gKi8KKyNkZWZpbmUgSU5UMTNfQ0RST01fU1RBVFVTX1RFUk1JTkFURQkweDRiCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBpbnQxM3N0YXR1cyBJTlQgMTMgc3RhdHVzIGNvZGVzCisgKiBAeworICovCisKKy8qKiBPcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworI2RlZmluZSBJTlQxM19TVEFUVVNfU1VDQ0VTUwkJMHgwMAorLyoqIEludmFsaWQgZnVuY3Rpb24gb3IgcGFyYW1ldGVyICovCisjZGVmaW5lIElOVDEzX1NUQVRVU19JTlZBTElECQkweDAxCisvKiogUmVhZCBlcnJvciAqLworI2RlZmluZSBJTlQxM19TVEFUVVNfUkVBRF9FUlJPUgkJMHgwNAorLyoqIFdyaXRlIGVycm9yICovCisjZGVmaW5lIElOVDEzX1NUQVRVU19XUklURV9FUlJPUgkweGNjCisKKy8qKiBAfSAqLworCisvKiogQmxvY2sgc2l6ZSBmb3Igbm9uLWV4dGVuZGVkIElOVCAxMyBjYWxscyAqLworI2RlZmluZSBJTlQxM19CTEtTSVpFIDUxMgorCisvKiogQW4gSU5UIDEzIGVtdWxhdGVkIGRyaXZlICovCitzdHJ1Y3QgaW50MTNfZHJpdmUgeworCS8qKiBMaXN0IG9mIGFsbCByZWdpc3RlcmVkIGRyaXZlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qKiBVbmRlcmx5aW5nIGJsb2NrIGRldmljZSAqLworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJsb2NrZGV2OworCisJLyoqIEJJT1MgaW4tdXNlIGRyaXZlIG51bWJlciAoMHg4MC0weGZmKSAqLworCXVuc2lnbmVkIGludCBkcml2ZTsKKwkvKiogQklPUyBuYXR1cmFsIGRyaXZlIG51bWJlciAoMHg4MC0weGZmKQorCSAqCisJICogVGhpcyBpcyB0aGUgZHJpdmUgbnVtYmVyIHRoYXQgd291bGQgaGF2ZSBiZWVuIGFzc2lnbmVkIGJ5CisJICogJ25hdHVyYWxseScgYXBwZW5kaW5nIHRoZSBkcml2ZSB0byB0aGUgZW5kIG9mIHRoZSBCSU9TCisJICogZHJpdmUgbGlzdC4KKwkgKgorCSAqIElmIHRoZSBlbXVsYXRlZCBkcml2ZSByZXBsYWNlcyBhIHByZWV4aXN0aW5nIGRyaXZlLCB0aGlzIGlzCisJICogdGhlIGRyaXZlIG51bWJlciB0aGF0IHRoZSBwcmVleGlzdGluZyBkcml2ZSBnZXRzIHJlbWFwcGVkCisJICogdG8uCisJICovCisJdW5zaWduZWQgaW50IG5hdHVyYWxfZHJpdmU7CisKKwkvKiogTnVtYmVyIG9mIGN5bGluZGVycworCSAqCisJICogVGhlIGN5bGluZGVyIG51bWJlciBmaWVsZCBpbiBhbiBJTlQgMTMgY2FsbCBpcyB0ZW4gYml0cworCSAqIHdpZGUsIGdpdmluZyBhIG1heGltdW0gb2YgMTAyNCBjeWxpbmRlcnMuICBDb252ZW50aW9uYWxseSwKKwkgKiB3aGVuIHRoZSA3LjhHQiBsaW1pdCBvZiBhIENIUyBhZGRyZXNzIGlzIGV4Y2VlZGVkLCBpdCBpcworCSAqIHRoZSBudW1iZXIgb2YgY3lsaW5kZXJzIHRoYXQgaXMgaW5jcmVhc2VkIGJleW9uZCB0aGUKKwkgKiBhZGRyZXNzYWJsZSBsaW1pdC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgY3lsaW5kZXJzOworCS8qKiBOdW1iZXIgb2YgaGVhZHMKKwkgKgorCSAqIFRoZSBoZWFkIG51bWJlciBmaWVsZCBpbiBhbiBJTlQgMTMgY2FsbCBpcyBlaWdodCBiaXRzIHdpZGUsCisJICogZ2l2aW5nIGEgbWF4aW11bSBvZiAyNTYgaGVhZHMuICBIb3dldmVyLCBhcHBhcmVudGx5IGFsbAorCSAqIHZlcnNpb25zIG9mIE1TLURPUyB1cCB0byBhbmQgaW5jbHVkaW5nIFdpbjk1IGZhaWwgd2l0aCAyNTYKKwkgKiBoZWFkcywgc28gdGhlIG1heGltdW0gZW5jb3VudGVyZWQgaW4gcHJhY3RpY2UgaXMgMjU1LgorCSAqLworCXVuc2lnbmVkIGludCBoZWFkczsKKwkvKiogTnVtYmVyIG9mIHNlY3RvcnMgcGVyIHRyYWNrCisJICoKKwkgKiBUaGUgc2VjdG9yIG51bWJlciBmaWVsZCBpbiBhbiBJTlQgMTMgY2FsbCBpcyBzaXggYml0cyB3aWRlLAorCSAqIGdpdmluZyBhIG1heGltdW0gb2YgNjMgc2VjdG9ycywgc2luY2Ugc2VjdG9yIG51bWJlcmluZworCSAqICh1bmxpa2UgaGVhZCBhbmQgY3lsaW5kZXIgbnVtYmVyaW5nKSBzdGFydHMgYXQgMSwgbm90IDAuCisJICovCisJdW5zaWduZWQgaW50IHNlY3RvcnNfcGVyX3RyYWNrOworCisJLyoqIFN0YXR1cyBvZiBsYXN0IG9wZXJhdGlvbiAqLworCWludCBsYXN0X3N0YXR1czsKK307CisKKy8qKiBBbiBJTlQgMTMgZGlzayBhZGRyZXNzIHBhY2tldCAqLworc3RydWN0IGludDEzX2Rpc2tfYWRkcmVzcyB7CisJLyoqIFNpemUgb2YgdGhlIHBhY2tldCwgaW4gYnl0ZXMgKi8KKwl1aW50OF90IGJ1ZnNpemU7CisJLyoqIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1aW50OF90IHJlc2VydmVkOworCS8qKiBCbG9jayBjb3VudCAqLworCXVpbnQxNl90IGNvdW50OworCS8qKiBEYXRhIGJ1ZmZlciAqLworCXN0cnVjdCBzZWdvZmYgYnVmZmVyOworCS8qKiBTdGFydGluZyBibG9jayBudW1iZXIgKi8KKwl1aW50NjRfdCBsYmE7CisJLyoqIERhdGEgYnVmZmVyIChFREQtMy4wIG9ubHkpICovCisJdWludDY0X3QgYnVmZmVyX3BoeXM7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogSU5UIDEzIGRpc2sgcGFyYW1ldGVycyAqLworc3RydWN0IGludDEzX2Rpc2tfcGFyYW1ldGVycyB7CisJLyoqIFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwl1aW50MTZfdCBidWZzaXplOworCS8qKiBGbGFncyAqLworCXVpbnQxNl90IGZsYWdzOworCS8qKiBOdW1iZXIgb2YgY3lsaW5kZXJzICovCisJdWludDMyX3QgY3lsaW5kZXJzOworCS8qKiBOdW1iZXIgb2YgaGVhZHMgKi8KKwl1aW50MzJfdCBoZWFkczsKKwkvKiogTnVtYmVyIG9mIHNlY3RvcnMgcGVyIHRyYWNrICovCisJdWludDMyX3Qgc2VjdG9yc19wZXJfdHJhY2s7CisJLyoqIFRvdGFsIG51bWJlciBvZiBzZWN0b3JzIG9uIGRyaXZlICovCisJdWludDY0X3Qgc2VjdG9yczsKKwkvKiogQnl0ZXMgcGVyIHNlY3RvciAqLworCXVpbnQxNl90IHNlY3Rvcl9zaXplOworCQorfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqCisgKiBAZGVmZ3JvdXAgaW50MTN0eXBlcyBJTlQgMTMgZGlzayB0eXBlcworICogQHsKKyAqLworCisvKiogTm8gc3VjaCBkcml2ZSAqLworI2RlZmluZSBJTlQxM19ESVNLX1RZUEVfTk9ORQkweDAwCisvKiogRmxvcHB5IHdpdGhvdXQgY2hhbmdlLWxpbmUgc3VwcG9ydCAqLworI2RlZmluZSBJTlQxM19ESVNLX1RZUEVfRkRECTB4MDEKKy8qKiBGbG9wcHkgd2l0aCBjaGFuZ2UtbGluZSBzdXBwb3J0ICovCisjZGVmaW5lIElOVDEzX0RJU0tfVFlQRV9GRERfQ0wJMHgwMgorLyoqIEhhcmQgZGlzayAqLworI2RlZmluZSBJTlQxM19ESVNLX1RZUEVfSERECTB4MDMKKworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIGludDEzZmxhZ3MgSU5UIDEzIGRpc2sgcGFyYW1ldGVyIGZsYWdzCisgKiBAeworICovCisKKy8qKiBETUEgYm91bmRhcnkgZXJyb3JzIGhhbmRsZWQgdHJhbnNwYXJlbnRseSAqLworI2RlZmluZSBJTlQxM19GTF9ETUFfVFJBTlNQQVJFTlQgMHgwMQorLyoqIENIUyBpbmZvcm1hdGlvbiBpcyB2YWxpZCAqLworI2RlZmluZSBJTlQxM19GTF9DSFNfVkFMSUQJIDB4MDIKKy8qKiBSZW1vdmFibGUgZHJpdmUgKi8KKyNkZWZpbmUgSU5UMTNfRkxfUkVNT1ZBQkxFCSAweDA0CisvKiogV3JpdGUgd2l0aCB2ZXJpZnkgc3VwcG9ydGVkICovCisjZGVmaW5lIElOVDEzX0ZMX1ZFUklGSUFCTEUJIDB4MDgKKy8qKiBIYXMgY2hhbmdlLWxpbmUgc3VwcG9ydGVkICh2YWxpZCBvbmx5IGZvciByZW1vdmFibGUgZHJpdmVzKSAqLworI2RlZmluZSBJTlQxM19GTF9DSEFOR0VfTElORQkgMHgxMAorLyoqIERyaXZlIGNhbiBiZSBsb2NrZWQgKHZhbGlkIG9ubHkgZm9yIHJlbW92YWJsZSBkcml2ZXMpICovCisjZGVmaW5lIElOVDEzX0ZMX0xPQ0tBQkxFCSAweDIwCisvKiogQ0hTIGlzIG1heCBwb3NzaWJsZSwgbm90IGN1cnJlbnQgbWVkaWEgKHZhbGlkIG9ubHkgZm9yIHJlbW92YWJsZSBkcml2ZXMpICovCisjZGVmaW5lIElOVDEzX0ZMX0NIU19NQVgJIDB4NDAKKworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIGludDEzZXh0cyBJTlQgMTMgZXh0ZW5zaW9uIGZsYWdzCisgKiBAeworICovCisKKy8qKiBFeHRlbmRlZCBkaXNrIGFjY2VzcyBmdW5jdGlvbnMgc3VwcG9ydGVkICovCisjZGVmaW5lIElOVDEzX0VYVEVOU0lPTl9MSU5FQVIJCTB4MDEKKy8qKiBSZW1vdmFibGUgZHJpdmUgZnVuY3Rpb25zIHN1cHBvcnRlZCAqLworI2RlZmluZSBJTlQxM19FWFRFTlNJT05fUkVNT1ZBQkxFCTB4MDIKKy8qKiBFREQgZnVuY3Rpb25zIHN1cHBvcnRlZCAqLworI2RlZmluZSBJTlQxM19FWFRFTlNJT05fRURECQkweDA0CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBpbnQxM3ZlcnMgSU5UIDEzIGV4dGVuc2lvbiB2ZXJzaW9ucworICogQHsKKyAqLworCisvKiogSU5UMTMgZXh0ZW5zaW9ucyB2ZXJzaW9uIDEueCAqLworI2RlZmluZSBJTlQxM19FWFRFTlNJT05fVkVSXzFfWAkJMHgwMQorLyoqIElOVDEzIGV4dGVuc2lvbnMgdmVyc2lvbiAyLjAgKEVERC0xLjApICovCisjZGVmaW5lIElOVDEzX0VYVEVOU0lPTl9WRVJfMl8wCQkweDIwCisvKiogSU5UMTMgZXh0ZW5zaW9ucyB2ZXJzaW9uIDIuMSAoRURELTEuMSkgKi8KKyNkZWZpbmUgSU5UMTNfRVhURU5TSU9OX1ZFUl8yXzEJCTB4MjEKKy8qKiBJTlQxMyBleHRlbnNpb25zIHZlcnNpb24gMy4wIChFREQtMy4wKSAqLworI2RlZmluZSBJTlQxM19FWFRFTlNJT05fVkVSXzNfMAkJMHgzMAorCisvKiogQH0gKi8gCisKKy8qKiBCb290YWJsZSBDRC1ST00gc3BlY2lmaWNhdGlvbiBwYWNrZXQgKi8KK3N0cnVjdCBpbnQxM19jZHJvbV9zcGVjaWZpY2F0aW9uIHsKKwkvKiogU2l6ZSBvZiBwYWNrZXQgaW4gYnl0ZXMgKi8KKwl1aW50OF90IHNpemU7CisJLyoqIEJvb3QgbWVkaWEgdHlwZSAqLworCXVpbnQ4X3QgbWVkaWFfdHlwZTsKKwkvKiogRHJpdmUgbnVtYmVyICovCisJdWludDhfdCBkcml2ZTsKKwkvKiogQ0QtUk9NIGNvbnRyb2xsZXIgbnVtYmVyICovCisJdWludDhfdCBjb250cm9sbGVyOworCS8qKiBMQkEgb2YgZGlzayBpbWFnZSB0byBlbXVsYXRlICovCisJdWludDMyX3QgbGJhOworCS8qKiBEZXZpY2Ugc3BlY2lmaWNhdGlvbiAqLworCXVpbnQxNl90IGRldmljZTsKKwkvKiogU2VnbWVudCBvZiAzSyBidWZmZXIgZm9yIGNhY2hpbmcgQ0QtUk9NIHJlYWRzICovCisJdWludDE2X3QgY2FjaGVfc2VnbWVudDsKKwkvKiogTG9hZCBzZWdtZW50IGZvciBpbml0aWFsIGJvb3QgaW1hZ2UgKi8KKwl1aW50MTZfdCBsb2FkX3NlZ21lbnQ7CisJLyoqIE51bWJlciBvZiA1MTItYnl0ZSBzZWN0b3JzIHRvIGxvYWQgKi8KKwl1aW50MTZfdCBsb2FkX3NlY3RvcnM7CisJLyoqIExvdyA4IGJpdHMgb2YgY3lsaW5kZXIgbnVtYmVyICovCisJdWludDhfdCBjeWw7CisJLyoqIFNlY3RvciBudW1iZXIsIHBsdXMgaGlnaCAyIGJpdHMgb2YgY3lsaW5kZXIgbnVtYmVyICovCisJdWludDhfdCBjeWxfc2VjdG9yOworCS8qKiBIZWFkIG51bWJlciAqLworCXVpbnQ4X3QgaGVhZDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBIEMvSC9TIGFkZHJlc3Mgd2l0aGluIGEgcGFydGl0aW9uIHRhYmxlIGVudHJ5ICovCitzdHJ1Y3QgcGFydGl0aW9uX2NocyB7CisJLyoqIEhlYWQgbnVtYmVyICovCisJdWludDhfdCBoZWFkOworCS8qKiBTZWN0b3IgbnVtYmVyLCBwbHVzIGhpZ2ggMiBiaXRzIG9mIGN5bGluZGVyIG51bWJlciAqLworCXVpbnQ4X3QgY3lsX3NlY3RvcjsKKwkvKiogTG93IDggYml0cyBvZiBjeWxpbmRlciBudW1iZXIgKi8KKwl1aW50OF90IGN5bDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKyNkZWZpbmUgUEFSVF9IRUFEKGNocykgKCAoY2hzKS5oZWFkICkKKyNkZWZpbmUgUEFSVF9TRUNUT1IoY2hzKSAoIChjaHMpLmN5bF9zZWN0b3IgJiAweDNmICkKKyNkZWZpbmUgUEFSVF9DWUxJTkRFUihjaHMpICggKGNocykuY3lsIHwgKCAoIChjaHMpLmN5bF9zZWN0b3IgJiAweGMwICkgPDwgMiApICkKKworLyoqIEEgcGFydGl0aW9uIHRhYmxlIGVudHJ5IHdpdGhpbiB0aGUgTUJSICovCitzdHJ1Y3QgcGFydGl0aW9uX3RhYmxlX2VudHJ5IHsKKwkvKiogQm9vdGFibGUgZmxhZyAqLworCXVpbnQ4X3QgYm9vdGFibGU7CisJLyoqIEMvSC9TIHN0YXJ0IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcGFydGl0aW9uX2NocyBjaHNfc3RhcnQ7CisJLyoqIFN5c3RlbSBpbmRpY2F0b3IgKHBhcnRpdGlvbiB0eXBlKSAqLworCXVpbnQ4X3QgdHlwZTsKKwkvKiogQy9IL1MgZW5kIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcGFydGl0aW9uX2NocyBjaHNfZW5kOworCS8qKiBMaW5lYXIgc3RhcnQgYWRkcmVzcyAqLworCXVpbnQzMl90IHN0YXJ0OworCS8qKiBMaW5lYXIgbGVuZ3RoICovCisJdWludDMyX3QgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgTWFzdGVyIEJvb3QgUmVjb3JkICovCitzdHJ1Y3QgbWFzdGVyX2Jvb3RfcmVjb3JkIHsKKwl1aW50OF90IHBhZFs0NDZdOworCS8qKiBQYXJ0aXRpb24gdGFibGUgKi8KKwlzdHJ1Y3QgcGFydGl0aW9uX3RhYmxlX2VudHJ5IHBhcnRpdGlvbnNbNF07CisJLyoqIDB4NTVhYSBNQlIgc2lnbmF0dXJlICovCisJdWludDE2X3Qgc2lnbmF0dXJlOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfaW50MTNfZHJpdmUgKCBzdHJ1Y3QgaW50MTNfZHJpdmUgKmRyaXZlICk7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2ludDEzX2RyaXZlICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSApOworZXh0ZXJuIGludCBpbnQxM19ib290ICggdW5zaWduZWQgaW50IGRyaXZlICk7CisKKyNlbmRpZiAvKiBJTlQxM19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9raXIuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2tpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjMzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9raXIuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIEtJUl9ICisjZGVmaW5lIEtJUl9ICisKKyNpZm5kZWYgS0VFUF9JVF9SRUFMCisjZXJyb3IgImtpci5oIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCAtREtFRVBfSVRfUkVBTCIKKyNlbmRpZgorCisjaWZkZWYgQVNTRU1CTFkKKworI2RlZmluZSBjb2RlMzIgY29kZTE2Z2NjCisKKyNlbHNlIC8qIEFTU0VNQkxZICovCisKK19fYXNtX18gKCAiLmNvZGUxNmdjYyIgKTsKKworI2VuZGlmIC8qIEFTU0VNQkxZICovCisKKyNlbmRpZiAvKiBLSVJfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvbGlia2lyLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9saWJraXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjViMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvbGlia2lyLmgKQEAgLTAsMCArMSwyMzMgQEAKKyNpZm5kZWYgTElCS0lSX0gKKyNkZWZpbmUgTElCS0lSX0gKKworI2luY2x1ZGUgInJlYWxtb2RlLmgiCisKKyNpZm5kZWYgQVNTRU1CTFkKKworLyoKKyAqIEZ1bGwgQVBJIGRvY3VtZW50YXRpb24gZm9yIHRoZXNlIGZ1bmN0aW9ucyBpcyBpbiByZWFsbW9kZS5oLgorICoKKyAqLworCisvKiBBY2Nlc3MgdG8gdmFyaWFibGVzIGluIC5kYXRhMTYgYW5kIC50ZXh0MTYgaW4gYSB3YXkgY29tcGF0aWJsZSB3aXRoIGxpYnJtICovCisjZGVmaW5lIF9fZGF0YTE2KCB2YXJpYWJsZSApIHZhcmlhYmxlCisjZGVmaW5lIF9fZGF0YTE2X2FycmF5KCB2YXJpYWJsZSwgYXJyYXkgKSB2YXJpYWJsZSBhcnJheQorI2RlZmluZSBfX2JzczE2KCB2YXJpYWJsZSApIHZhcmlhYmxlCisjZGVmaW5lIF9fYnNzMTZfYXJyYXkoIHZhcmlhYmxlLCBhcnJheSApIHZhcmlhYmxlIGFycmF5CisjZGVmaW5lIF9fdGV4dDE2KCB2YXJpYWJsZSApIHZhcmlhYmxlCisjZGVmaW5lIF9fdGV4dDE2X2FycmF5KCB2YXJpYWJsZSxhcnJheSApIHZhcmlhYmxlIGFycmF5CisjZGVmaW5lIF9fdXNlX2RhdGExNiggdmFyaWFibGUgKSB2YXJpYWJsZQorI2RlZmluZSBfX3VzZV90ZXh0MTYoIHZhcmlhYmxlICkgdmFyaWFibGUKKyNkZWZpbmUgX19mcm9tX2RhdGExNiggcG9pbnRlciApIHBvaW50ZXIKKyNkZWZpbmUgX19mcm9tX3RleHQxNiggcG9pbnRlciApIHBvaW50ZXIKKworLyogUmVhbC1tb2RlIGRhdGEgYW5kIGNvZGUgc2VnbWVudHMgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHVuc2lnbmVkIGludCBfcm1fY3MgKCB2b2lkICkgeworCXVpbnQxNl90IGNzOworCV9fYXNtX18gX192b2xhdGlsZV9fICggIm1vdncgJSVjcywgJXcwIiA6ICI9ciIgKCBjcyApICk7CisJcmV0dXJuIGNzOworfQorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB1bnNpZ25lZCBpbnQgX3JtX2RzICggdm9pZCApIHsKKwl1aW50MTZfdCBkczsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJtb3Z3ICUlZHMsICV3MCIgOiAiPXIiICggZHMgKSApOworCXJldHVybiBkczsKK30KKworI2RlZmluZSBybV9jcyAoIF9ybV9jcygpICkKKyNkZWZpbmUgcm1fZHMgKCBfcm1fZHMoKSApCisKKy8qIENvcHkgdG8vZnJvbSBiYXNlIG1lbW9yeSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV90b19yZWFsX2xpYmtpciAoIHVuc2lnbmVkIGludCBkZXN0X3NlZywKKwkJCQkJIHVuc2lnbmVkIGludCBkZXN0X29mZiwKKwkJCQkJIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4gKSB7CisJdW5zaWduZWQgaW50IGRpc2NhcmRfRCwgZGlzY2FyZF9TLCBkaXNjYXJkX2M7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJwdXNodyAlJWVzXG5cdCIKKwkJCSAgICAgICAibW92dyAlMywgJSVlc1xuXHQiCisJCQkgICAgICAgInJlcCBtb3ZzYlxuXHQiCisJCQkgICAgICAgInBvcHcgJSVlc1xuXHQiCisJCQkgICAgICAgOiAiPUQiICggZGlzY2FyZF9EICksICI9UyIgKCBkaXNjYXJkX1MgKSwKKwkJCSAgICAgICAgICI9YyIgKCBkaXNjYXJkX2MgKQorCQkJICAgICAgIDogInIiICggZGVzdF9zZWcgKSwgIkQiICggZGVzdF9vZmYgKSwKKwkJCSAgICAgICAgICJTIiAoIHNyYyApLAorCQkJICAgICAgICAgImMiICggbiApCisJCQkgICAgICAgOiAibWVtb3J5IiApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9mcm9tX3JlYWxfbGlia2lyICggdm9pZCAqZGVzdCwKKwkJCQkJICAgdW5zaWduZWQgaW50IHNyY19zZWcsCisJCQkJCSAgIHVuc2lnbmVkIGludCBzcmNfb2ZmLAorCQkJCQkgICBzaXplX3QgbiApIHsKKwl1bnNpZ25lZCBpbnQgZGlzY2FyZF9ELCBkaXNjYXJkX1MsIGRpc2NhcmRfYzsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICggInB1c2h3ICUlZHNcblx0IgorCQkJICAgICAgICJtb3Z3ICU0LCAlJWRzXG5cdCIKKwkJCSAgICAgICAicmVwIG1vdnNiXG5cdCIKKwkJCSAgICAgICAicG9wdyAlJWRzXG5cdCIKKwkJCSAgICAgICA6ICI9RCIgKCBkaXNjYXJkX0QgKSwgIj1TIiAoIGRpc2NhcmRfUyApLAorCQkJICAgICAgICAgIj1jIiAoIGRpc2NhcmRfYyApCisJCQkgICAgICAgOiAiRCIgKCBkZXN0ICksCisJCQkgICAgICAgICAiciIgKCBzcmNfc2VnICksICJTIiAoIHNyY19vZmYgKSwKKwkJCSAgICAgICAgICJjIiAoIG4gKQorCQkJICAgICAgIDogIm1lbW9yeSIgKTsKK30KKworI2RlZmluZSBjb3B5X3RvX3JlYWwgY29weV90b19yZWFsX2xpYmtpcgorI2RlZmluZSBjb3B5X2Zyb21fcmVhbCBjb3B5X2Zyb21fcmVhbF9saWJraXIKKworLyoKKyAqIFRyYW5zZmVyIGluZGl2aWR1YWwgdmFsdWVzIHRvL2Zyb20gYmFzZSBtZW1vcnkuICBUaGVyZSBtYXkgd2VsbCBiZQorICogYSBuZWF0ZXIgd2F5IHRvIGRvIHRoaXMuICBXZSBoYXZlIHR3byB2ZXJzaW9uczogb25lIGZvciBjb25zdGFudAorICogb2Zmc2V0cyAod2hlcmUgdGhlIG1vdiBpbnN0cnVjdGlvbiBtdXN0IGJlIG9mIHRoZSBmb3JtICJtb3YKKyAqICVlczoxMjMsICV4eCIpIGFuZCBvbmUgZm9yIG5vbi1jb25zdGFudCBvZmZzZXRzICh3aGVyZSB0aGUgbW92CisgKiBpbnN0cnVjdGlvbiBtdXN0IGJlIG9mIHRoZSBmb3JtICJtb3YgJWVzOigleHgpLCAleXgiLiAgSWYgaXQncworICogcG9zc2libGUgdG8gaW5jb3Jwb3JhdGUgYm90aCBmb3JtcyBpbnRvIG9uZSBfX2FzbV9fIGluc3RydWN0aW9uLCBJCisgKiBkb24ndCBrbm93IGhvdyB0byBkbyBpdC4KKyAqCisgKiBJZGVhbGx5LCB0aGUgbW92IGluc3RydWN0aW9uIHNob3VsZCBiZSAibW92JXowIjsgdGhlICIlejAiIGlzIG1lYW50CisgKiB0byBleHBhbmQgdG8gZWl0aGVyICJiIiwgInciIG9yICJsIiBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YKKyAqIG9wZXJhbmQgMC4gIFRoaXMgd291bGQgcmVtb3ZlIHRoZSAobWlub3IpIGFtYmlndWl0eSBpbiB0aGUgbW92CisgKiBpbnN0cnVjdGlvbi4gIEhvd2V2ZXIsIGdjYyBvbiBhdCBsZWFzdCBteSBzeXN0ZW0gYmFyZnMgd2l0aCBhbgorICogImludGVybmFsIGNvbXBpbGVyIGVycm9yIiB3aGVuIGNvbmZyb250ZWQgd2l0aCAlejAuCisgKgorICovCisKKyNkZWZpbmUgcHV0X3JlYWxfa2lyX2NvbnN0X29mZiggdmFyLCBzZWcsIG9mZiApCQkgIAkJICAgICBcCisJX19hc21fXyAoICJtb3Z3ICV3MSwgJSVlc1xuXHQiCQkJCQkgICAgIFwKKwkJICAibW92ICUwLCAlJWVzOiVjMlxuXHQiCQkJCSAgICAgXAorCQkgICJwdXNodyAlJWRzXG5cdCIgLyogcmVzdG9yZSAlZXMgKi8JCQkgICAgIFwKKwkJICAicG9wdyAlJWVzXG5cdCIJCQkJCSAgICAgXAorCQkgIDoJCQkJCQkJICAgICBcCisJCSAgOiAicixyIiAoIHZhciApLCAicm0scm0iICggc2VnICksICJpLCFyIiAoIG9mZiApCSAgICAgXAorCQkgICkKKworI2RlZmluZSBwdXRfcmVhbF9raXJfbm9uY29uc3Rfb2ZmKCB2YXIsIHNlZywgb2ZmICkJICAJCSAgICAgXAorCV9fYXNtX18gKCAibW92dyAldzEsICUlZXNcblx0IgkJCQkJICAgICBcCisJCSAgIm1vdiAlMCwgJSVlczooJTIpXG5cdCIJCQkJICAgICBcCisJCSAgInB1c2h3ICUlZHNcblx0IiAvKiByZXN0b3JlICVlcyAqLwkJCSAgICAgXAorCQkgICJwb3B3ICUlZXNcblx0IgkJCQkJICAgICBcCisJCSAgOgkJCQkJCQkgICAgIFwKKwkJICA6ICJyIiAoIHZhciApLCAicm0iICggc2VnICksICJyIiAoIG9mZiApCQkgICAgIFwKKwkJICApCisKKyNkZWZpbmUgcHV0X3JlYWxfa2lyKCB2YXIsIHNlZywgb2ZmICkJCQkJCSAgICAgXAorCWRvIHsJCQkJCQkJCSAgICAgXAorCSAgaWYgKCBfX2J1aWx0aW5fY29uc3RhbnRfcCAoIG9mZiApICkJCQkJICAgICBcCisJCSAgcHV0X3JlYWxfa2lyX2NvbnN0X29mZiAoIHZhciwgc2VnLCBvZmYgKTsJCSAgICAgXAorCSAgZWxzZQkJCQkJCQkJICAgICBcCisJCSAgcHV0X3JlYWxfa2lyX25vbmNvbnN0X29mZiAoIHZhciwgc2VnLCBvZmYgKTsJCSAgICAgXAorCX0gd2hpbGUgKCAwICkKKworI2RlZmluZSBnZXRfcmVhbF9raXJfY29uc3Rfb2ZmKCB2YXIsIHNlZywgb2ZmICkJCSAgCQkgICAgIFwKKwlfX2FzbV9fICggIm1vdncgJXcxLCAlJWVzXG5cdCIJCQkJCSAgICAgXAorCQkgICJtb3YgJSVlczolYzIsICUwXG5cdCIJCQkJICAgICBcCisJCSAgInB1c2h3ICUlZHNcblx0IiAvKiByZXN0b3JlICVlcyAqLwkJCSAgICAgXAorCQkgICJwb3B3ICUlZXNcblx0IgkJCQkJICAgICBcCisJCSAgOiAiPXIsciIgKCB2YXIgKQkJCQkJICAgICBcCisJCSAgOiAicm0scm0iICggc2VnICksICJpLCFyIiAoIG9mZiApCQkJICAgICBcCisJCSAgKQorCisjZGVmaW5lIGdldF9yZWFsX2tpcl9ub25jb25zdF9vZmYoIHZhciwgc2VnLCBvZmYgKQkJCSAgICAgXAorCV9fYXNtX18gKCAibW92dyAldzEsICUlZXNcblx0IgkJCQkJICAgICBcCisJCSAgIm1vdiAlJWVzOiglMiksICUwXG5cdCIJCQkJICAgICBcCisJCSAgInB1c2h3ICUlZHNcblx0IiAvKiByZXN0b3JlICVlcyAqLwkJCSAgICAgXAorCQkgICJwb3B3ICUlZXNcblx0IgkJCQkJICAgICBcCisJCSAgOiAiPXIiICggdmFyICkJCQkJCSAgICAgXAorCQkgIDogInJtIiAoIHNlZyApLCAiciIgKCBvZmYgKQkJCQkgICAgIFwKKwkJICApCisKKyNkZWZpbmUgZ2V0X3JlYWxfa2lyKCB2YXIsIHNlZywgb2ZmICkJCQkJCSAgICAgXAorCWRvIHsJCQkJCQkJCSAgICAgXAorCSAgaWYgKCBfX2J1aWx0aW5fY29uc3RhbnRfcCAoIG9mZiApICkJCQkJICAgICBcCisJCSAgZ2V0X3JlYWxfa2lyX2NvbnN0X29mZiAoIHZhciwgc2VnLCBvZmYgKTsJCSAgICAgXAorCSAgZWxzZQkJCQkJCQkJICAgICBcCisJCSAgZ2V0X3JlYWxfa2lyX25vbmNvbnN0X29mZiAoIHZhciwgc2VnLCBvZmYgKTsJCSAgICAgXAorCX0gd2hpbGUgKCAwICkKKworI2RlZmluZSBwdXRfcmVhbCBwdXRfcmVhbF9raXIKKyNkZWZpbmUgZ2V0X3JlYWwgZ2V0X3JlYWxfa2lyCisKKy8qKgorICogQSBwb2ludGVyIHRvIGEgdXNlciBidWZmZXIKKyAqCisgKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RydWN0IHNlZ29mZiwgYnV0IGVuY29kZWQgYXMgYSB1aW50MzJfdCB0bworICogZW5zdXJlIHRoYXQgZ2NjIHBhc3NlcyBpdCBhcm91bmQgZWZmaWNpZW50bHkuCisgKi8KK3R5cGVkZWYgdWludDMyX3QgdXNlcnB0cl90OworCisvKioKKyAqIENvcHkgZGF0YSB0byB1c2VyIGJ1ZmZlcgorICoKKyAqIEB2IGJ1ZmZlcglVc2VyIGJ1ZmZlcgorICogQHYgb2Zmc2V0CU9mZnNldCB3aXRoaW4gdXNlciBidWZmZXIKKyAqIEB2IHNyYwlTb3VyY2UKKyAqIEB2IGxlbglMZW5ndGgKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZAorY29weV90b191c2VyICggdXNlcnB0cl90IGJ1ZmZlciwgb2ZmX3Qgb2Zmc2V0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4gKSB7CisJY29weV90b19yZWFsICggKCBidWZmZXIgPj4gMTYgKSwgKCAoIGJ1ZmZlciAmIDB4ZmZmZiApICsgb2Zmc2V0ICksCisJCSAgICAgICBzcmMsIGxlbiApOworfQorCisvKioKKyAqIENvcHkgZGF0YSBmcm9tIHVzZXIgYnVmZmVyCisgKgorICogQHYgZGVzdAlEZXN0aW5hdGlvbgorICogQHYgYnVmZmVyCVVzZXIgYnVmZmVyCisgKiBAdiBvZmZzZXQJT2Zmc2V0IHdpdGhpbiB1c2VyIGJ1ZmZlcgorICogQHYgbGVuCUxlbmd0aAorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitjb3B5X2Zyb21fdXNlciAoIHZvaWQgKmRlc3QsIHVzZXJwdHJfdCBidWZmZXIsIG9mZl90IG9mZnNldCwgc2l6ZV90IGxlbiApIHsKKwljb3B5X2Zyb21fcmVhbCAoIGRlc3QsICggYnVmZmVyID4+IDE2ICksCisJCQkgKCAoIGJ1ZmZlciAmIDB4ZmZmZiApICsgb2Zmc2V0ICksIGxlbiApOworfQorCisvKioKKyAqIENvbnZlcnQgc2VnbWVudDpvZmZzZXQgYWRkcmVzcyB0byB1c2VyIGJ1ZmZlcgorICoKKyAqIEB2IHNlZ21lbnQJUmVhbC1tb2RlIHNlZ21lbnQKKyAqIEB2IG9mZnNldAlSZWFsLW1vZGUgb2Zmc2V0CisgKiBAcmV0IGJ1ZmZlcglVc2VyIGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB1c2VycHRyX3QKK3JlYWxfdG9fdXNlciAoIHVuc2lnbmVkIGludCBzZWdtZW50LCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICkgeworCXJldHVybiAoICggc2VnbWVudCA8PCAxNiApIHwgb2Zmc2V0ICk7Cit9CisKKy8qKgorICogQ29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gdXNlciBidWZmZXIKKyAqCisgKiBAdiB2aXJ0dWFsCVZpcnR1YWwgYWRkcmVzcworICogQHJldCBidWZmZXIJVXNlciBidWZmZXIKKyAqCisgKiBUaGlzIGNvbnN0cnVjdHMgYSB1c2VyIGJ1ZmZlciBmcm9tIGFuIG9yZGluYXJ5IHBvaW50ZXIuICBVc2UgaXQKKyAqIHdoZW4geW91IG5lZWQgdG8gcGFzcyBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgYnVmZmVyIHRvIGEgZnVuY3Rpb24KKyAqIHRoYXQgZXhwZWN0cyBhIEBjIHVzZXJwdHJfdC4KKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdXNlcnB0cl90Cit2aXJ0X3RvX3VzZXIgKCB2b2lkICogdmlydHVhbCApIHsKKwlyZXR1cm4gcmVhbF90b191c2VyICggcm1fZHMsICggaW50cHRyX3QgKSB2aXJ0dWFsICk7Cit9CisKKy8qIFRFWFQxNl9DT0RFOiBkZWNsYXJlIGEgZnJhZ21lbnQgb2YgY29kZSB0aGF0IHJlc2lkZXMgaW4gLnRleHQxNiAqLworI2RlZmluZSBURVhUMTZfQ09ERSggYXNtX2NvZGVfc3RyICkJCQlcCisJIi5zZWN0aW9uIFwiLnRleHQxNlwiLCBcImF4XCIsIEBwcm9nYml0c1xuXHQiCVwKKwkiLmNvZGUxNlxuXHQiCQkJCQlcCisJIi5hcmNoIGkzODZcblx0IgkJCQlcCisJYXNtX2NvZGVfc3RyICJcblx0IgkJCQlcCisJIi5jb2RlMTZnY2Ncblx0IgkJCQlcCisJIi5wcmV2aW91c1xuXHQiCisKKy8qIFJFQUxfQ09ERTogZGVjbGFyZSBhIGZyYWdtZW50IG9mIGNvZGUgdGhhdCBleGVjdXRlcyBpbiByZWFsIG1vZGUgKi8KKyNkZWZpbmUgUkVBTF9DT0RFKCBhc21fY29kZV9zdHIgKQlcCisJIi5jb2RlMTZcblx0IgkJCVwKKwlhc21fY29kZV9zdHIgIlxuXHQiCQlcCisJIi5jb2RlMTZnY2Ncblx0IgorCisjZW5kaWYgLyogQVNTRU1CTFkgKi8KKworI2VuZGlmIC8qIExJQktJUl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9saWJybS5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvbGlicm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTkzZjVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvbGlicm0uaApAQCAtMCwwICsxLDIwNiBAQAorI2lmbmRlZiBMSUJSTV9ICisjZGVmaW5lIExJQlJNX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiBTZWdtZW50IHNlbGVjdG9ycyBhcyB1c2VkIGluIG91ciBwcm90ZWN0ZWQtbW9kZSBHRFRzLgorICoKKyAqIERvbid0IGNoYW5nZSB0aGVzZSB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLgorICovCisKKyNkZWZpbmUgVklSVFVBTF9DUyAweDA4CisjZGVmaW5lIFZJUlRVQUxfRFMgMHgxMAorI2RlZmluZSBQSFlTSUNBTF9DUyAweDE4CisjZGVmaW5lIFBIWVNJQ0FMX0RTIDB4MjAKKyNkZWZpbmUgUkVBTF9DUyAweDI4CisjZGVmaW5lIFJFQUxfRFMgMHgzMAorI2lmIDAKKyNkZWZpbmUgTE9OR19DUyAweDM4CisjZGVmaW5lIExPTkdfRFMgMHg0MAorI2VuZGlmCisKKyNpZm5kZWYgQVNTRU1CTFkKKworI2lmZGVmIFVBQ0NFU1NfTElCUk0KKyNkZWZpbmUgVUFDQ0VTU19QUkVGSVhfbGlicm0KKyNlbHNlCisjZGVmaW5lIFVBQ0NFU1NfUFJFRklYX2xpYnJtIF9fbGlicm1fCisjZW5kaWYKKworLyogVmFyaWFibGVzIGluIGxpYnJtLlMgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHZpcnRfb2Zmc2V0OworCisvKioKKyAqIENvbnZlcnQgcGh5c2ljYWwgYWRkcmVzcyB0byB1c2VyIHBvaW50ZXIKKyAqCisgKiBAdiBwaHlzX2FkZHIJCVBoeXNpY2FsIGFkZHJlc3MKKyAqIEByZXQgdXNlcnB0cgkJVXNlciBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHVzZXJwdHJfdAorVUFDQ0VTU19JTkxJTkUgKCBsaWJybSwgcGh5c190b191c2VyICkgKCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciApIHsKKwlyZXR1cm4gKCBwaHlzX2FkZHIgLSB2aXJ0X29mZnNldCApOworfQorCisvKioKKyAqIENvbnZlcnQgdXNlciBidWZmZXIgdG8gcGh5c2ljYWwgYWRkcmVzcworICoKKyAqIEB2IHVzZXJwdHIJCVVzZXIgcG9pbnRlcgorICogQHYgb2Zmc2V0CQlPZmZzZXQgZnJvbSB1c2VyIHBvaW50ZXIKKyAqIEByZXQgcGh5c19hZGRyCVBoeXNpY2FsIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZworVUFDQ0VTU19JTkxJTkUgKCBsaWJybSwgdXNlcl90b19waHlzICkgKCB1c2VycHRyX3QgdXNlcnB0ciwgb2ZmX3Qgb2Zmc2V0ICkgeworCXJldHVybiAoIHVzZXJwdHIgKyBvZmZzZXQgKyB2aXJ0X29mZnNldCApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1c2VycHRyX3QKK1VBQ0NFU1NfSU5MSU5FICggbGlicm0sIHZpcnRfdG9fdXNlciApICggdm9sYXRpbGUgY29uc3Qgdm9pZCAqYWRkciApIHsKKwlyZXR1cm4gdHJpdmlhbF92aXJ0X3RvX3VzZXIgKCBhZGRyICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQgKgorVUFDQ0VTU19JTkxJTkUgKCBsaWJybSwgdXNlcl90b192aXJ0ICkgKCB1c2VycHRyX3QgdXNlcnB0ciwgb2ZmX3Qgb2Zmc2V0ICkgeworCXJldHVybiB0cml2aWFsX3VzZXJfdG9fdmlydCAoIHVzZXJwdHIsIG9mZnNldCApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1c2VycHRyX3QKK1VBQ0NFU1NfSU5MSU5FICggbGlicm0sIHVzZXJwdHJfYWRkICkgKCB1c2VycHRyX3QgdXNlcnB0ciwgb2ZmX3Qgb2Zmc2V0ICkgeworCXJldHVybiB0cml2aWFsX3VzZXJwdHJfYWRkICggdXNlcnB0ciwgb2Zmc2V0ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK1VBQ0NFU1NfSU5MSU5FICggbGlicm0sIG1lbWNweV91c2VyICkgKCB1c2VycHRyX3QgZGVzdCwgb2ZmX3QgZGVzdF9vZmYsCisJCQkJCXVzZXJwdHJfdCBzcmMsIG9mZl90IHNyY19vZmYsCisJCQkJCXNpemVfdCBsZW4gKSB7CisJdHJpdmlhbF9tZW1jcHlfdXNlciAoIGRlc3QsIGRlc3Rfb2ZmLCBzcmMsIHNyY19vZmYsIGxlbiApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitVQUNDRVNTX0lOTElORSAoIGxpYnJtLCBtZW1tb3ZlX3VzZXIgKSAoIHVzZXJwdHJfdCBkZXN0LCBvZmZfdCBkZXN0X29mZiwKKwkJCQkJIHVzZXJwdHJfdCBzcmMsIG9mZl90IHNyY19vZmYsCisJCQkJCSBzaXplX3QgbGVuICkgeworCXRyaXZpYWxfbWVtbW92ZV91c2VyICggZGVzdCwgZGVzdF9vZmYsIHNyYywgc3JjX29mZiwgbGVuICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK1VBQ0NFU1NfSU5MSU5FICggbGlicm0sIG1lbXNldF91c2VyICkgKCB1c2VycHRyX3QgYnVmZmVyLCBvZmZfdCBvZmZzZXQsCisJCQkJCWludCBjLCBzaXplX3QgbGVuICkgeworCXRyaXZpYWxfbWVtc2V0X3VzZXIgKCBidWZmZXIsIG9mZnNldCwgYywgbGVuICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHNpemVfdAorVUFDQ0VTU19JTkxJTkUgKCBsaWJybSwgc3RybGVuX3VzZXIgKSAoIHVzZXJwdHJfdCBidWZmZXIsIG9mZl90IG9mZnNldCApIHsKKwlyZXR1cm4gdHJpdmlhbF9zdHJsZW5fdXNlciAoIGJ1ZmZlciwgb2Zmc2V0ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIG9mZl90CitVQUNDRVNTX0lOTElORSAoIGxpYnJtLCBtZW1jaHJfdXNlciApICggdXNlcnB0cl90IGJ1ZmZlciwgb2ZmX3Qgb2Zmc2V0LAorCQkJCQlpbnQgYywgc2l6ZV90IGxlbiApIHsKKwlyZXR1cm4gdHJpdmlhbF9tZW1jaHJfdXNlciAoIGJ1ZmZlciwgb2Zmc2V0LCBjLCBsZW4gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQWNjZXNzIHRvIHZhcmlhYmxlcyBpbiAuZGF0YTE2IGFuZCAudGV4dDE2CisgKgorICovCisKK2V4dGVybiBjaGFyICpkYXRhMTY7CitleHRlcm4gY2hhciAqdGV4dDE2OworCisjZGVmaW5lIF9fZGF0YTE2KCB2YXJpYWJsZSApCQkJCQkJXAorCV9fYXR0cmlidXRlX18gKCggc2VjdGlvbiAoICIuZGF0YTE2IiApICkpCQkJXAorCV9kYXRhMTZfICMjIHZhcmlhYmxlIF9fYXNtX18gKCAjdmFyaWFibGUgKQorCisjZGVmaW5lIF9fZGF0YTE2X2FycmF5KCB2YXJpYWJsZSwgYXJyYXkgKQkJCQlcCisJX19hdHRyaWJ1dGVfXyAoKCBzZWN0aW9uICggIi5kYXRhMTYiICkgKSkJCQlcCisJX2RhdGExNl8gIyMgdmFyaWFibGUgYXJyYXkgX19hc21fXyAoICN2YXJpYWJsZSApCisKKyNkZWZpbmUgX19ic3MxNiggdmFyaWFibGUgKQkJCQkJCVwKKwlfX2F0dHJpYnV0ZV9fICgoIHNlY3Rpb24gKCAiLmJzczE2IiApICkpCQkJXAorCV9kYXRhMTZfICMjIHZhcmlhYmxlIF9fYXNtX18gKCAjdmFyaWFibGUgKQorCisjZGVmaW5lIF9fYnNzMTZfYXJyYXkoIHZhcmlhYmxlLCBhcnJheSApCQkJCVwKKwlfX2F0dHJpYnV0ZV9fICgoIHNlY3Rpb24gKCAiLmJzczE2IiApICkpCQkJXAorCV9kYXRhMTZfICMjIHZhcmlhYmxlIGFycmF5IF9fYXNtX18gKCAjdmFyaWFibGUgKQorCisjZGVmaW5lIF9fdGV4dDE2KCB2YXJpYWJsZSApCQkJCQkJXAorCV9fYXR0cmlidXRlX18gKCggc2VjdGlvbiAoICIudGV4dDE2LmRhdGEiICkgKSkJCQlcCisJX3RleHQxNl8gIyMgdmFyaWFibGUgX19hc21fXyAoICN2YXJpYWJsZSApCisKKyNkZWZpbmUgX190ZXh0MTZfYXJyYXkoIHZhcmlhYmxlLCBhcnJheSApCQkJCVwKKwlfX2F0dHJpYnV0ZV9fICgoIHNlY3Rpb24gKCAiLnRleHQxNi5kYXRhIiApICkpCQkJXAorCV90ZXh0MTZfICMjIHZhcmlhYmxlIGFycmF5IF9fYXNtX18gKCAjdmFyaWFibGUgKQorCisjZGVmaW5lIF9fdXNlX2RhdGExNiggdmFyaWFibGUgKQkJCQkJXAorCSggKiAoICggdHlwZW9mICggX2RhdGExNl8gIyMgdmFyaWFibGUgKSAqICkJCQlcCisJICAgICAgJiAoIGRhdGExNiBbICggc2l6ZV90ICkgJiAoIF9kYXRhMTZfICMjIHZhcmlhYmxlICkgXSApICkgKQorCisjZGVmaW5lIF9fdXNlX3RleHQxNiggdmFyaWFibGUgKQkJCQkJXAorCSggKiAoICggdHlwZW9mICggX3RleHQxNl8gIyMgdmFyaWFibGUgKSAqICkJCQlcCisJICAgICAgJiAoIHRleHQxNiBbICggc2l6ZV90ICkgJiAoIF90ZXh0MTZfICMjIHZhcmlhYmxlICkgXSApICkgKQorCisjZGVmaW5lIF9fZnJvbV9kYXRhMTYoIHBvaW50ZXIgKQkJCQkJXAorCSggKCB1bnNpZ25lZCBpbnQgKQkJCQkJCVwKKwkgICggKCAoIHZvaWQgKiApIChwb2ludGVyKSApIC0gKCAoIHZvaWQgKiApIGRhdGExNiApICkgKQorCisjZGVmaW5lIF9fZnJvbV90ZXh0MTYoIHBvaW50ZXIgKQkJCQkJXAorCSggKCB1bnNpZ25lZCBpbnQgKQkJCQkJCVwKKwkgICggKCAoIHZvaWQgKiApIChwb2ludGVyKSApIC0gKCAoIHZvaWQgKiApIHRleHQxNiApICkgKQorCisvKiBWYXJpYWJsZXMgaW4gbGlicm0uUywgcHJlc2VudCBpbiB0aGUgbm9ybWFsIGRhdGEgc2VnbWVudCAqLworZXh0ZXJuIHVpbnQxNl90IHJtX3NwOworZXh0ZXJuIHVpbnQxNl90IHJtX3NzOworZXh0ZXJuIHVpbnQxNl90IF9fZGF0YTE2ICggcm1fY3MgKTsKKyNkZWZpbmUgcm1fY3MgX191c2VfZGF0YTE2ICggcm1fY3MgKQorZXh0ZXJuIHVpbnQxNl90IF9fdGV4dDE2ICggcm1fZHMgKTsKKyNkZWZpbmUgcm1fZHMgX191c2VfdGV4dDE2ICggcm1fZHMgKQorCisvKiBGdW5jdGlvbnMgdGhhdCBsaWJybSBleHBlY3RzIHRvIGJlIGFibGUgdG8gbGluayB0by4gIEluY2x1ZGVkIGhlcmUKKyAqIHNvIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgY2F0Y2ggcHJvdG90eXBlIG1pc21hdGNoZXMuCisgKi8KK2V4dGVybiB2b2lkIGdhdGVBMjBfc2V0ICggdm9pZCApOworCisvKioKKyAqIENvbnZlcnQgc2VnbWVudDpvZmZzZXQgYWRkcmVzcyB0byB1c2VyIGJ1ZmZlcgorICoKKyAqIEB2IHNlZ21lbnQJCVJlYWwtbW9kZSBzZWdtZW50CisgKiBAdiBvZmZzZXQJCVJlYWwtbW9kZSBvZmZzZXQKKyAqIEByZXQgYnVmZmVyCQlVc2VyIGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1c2VycHRyX3QKK3JlYWxfdG9fdXNlciAoIHVuc2lnbmVkIGludCBzZWdtZW50LCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICkgeworCXJldHVybiAoIHBoeXNfdG9fdXNlciAoICggc2VnbWVudCA8PCA0ICkgKyBvZmZzZXQgKSApOworfQorCitleHRlcm4gdWludDE2X3QgY29weV91c2VyX3RvX3JtX3N0YWNrICggdXNlcnB0cl90IGRhdGEsIHNpemVfdCBzaXplICk7CitleHRlcm4gdm9pZCByZW1vdmVfdXNlcl9mcm9tX3JtX3N0YWNrICggdXNlcnB0cl90IGRhdGEsIHNpemVfdCBzaXplICk7CisKKy8qIFRFWFQxNl9DT0RFOiBkZWNsYXJlIGEgZnJhZ21lbnQgb2YgY29kZSB0aGF0IHJlc2lkZXMgaW4gLnRleHQxNiAqLworI2RlZmluZSBURVhUMTZfQ09ERSggYXNtX2NvZGVfc3RyICkJCQlcCisJIi5zZWN0aW9uIFwiLnRleHQxNlwiLCBcImF4XCIsIEBwcm9nYml0c1xuXHQiCVwKKwkiLmNvZGUxNlxuXHQiCQkJCQlcCisJYXNtX2NvZGVfc3RyICJcblx0IgkJCQlcCisJIi5jb2RlMzJcblx0IgkJCQkJXAorCSIucHJldmlvdXNcblx0IgorCisvKiBSRUFMX0NPREU6IGRlY2xhcmUgYSBmcmFnbWVudCBvZiBjb2RlIHRoYXQgZXhlY3V0ZXMgaW4gcmVhbCBtb2RlICovCisjZGVmaW5lIFJFQUxfQ09ERSggYXNtX2NvZGVfc3RyICkJCQlcCisJInB1c2hsICQxZlxuXHQiCQkJCQlcCisJImNhbGwgcmVhbF9jYWxsXG5cdCIJCQkJXAorCSJhZGRsICQ0LCAlJWVzcFxuXHQiCQkJCVwKKwlURVhUMTZfQ09ERSAoICJcbjE6XG5cdCIJCQlcCisJCSAgICAgIGFzbV9jb2RlX3N0cgkJCVwKKwkJICAgICAgIlxuXHQiCQkJCVwKKwkJICAgICAgInJldFxuXHQiICkKKworLyogUEhZU19DT0RFOiBkZWNsYXJlIGEgZnJhZ21lbnQgb2YgY29kZSB0aGF0IGV4ZWN1dGVzIGluIGZsYXQgcGh5c2ljYWwgbW9kZSAqLworI2RlZmluZSBQSFlTX0NPREUoIGFzbV9jb2RlX3N0ciApCQkJXAorCSJjYWxsIF92aXJ0X3RvX3BoeXNcblx0IgkJCVwKKwlhc21fY29kZV9zdHIJCQkJCVwKKwkiY2FsbCBfcGh5c190b192aXJ0XG5cdCIKKworI2VuZGlmIC8qIEFTU0VNQkxZICovCisKKyNlbmRpZiAvKiBMSUJSTV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9saW1pdHMuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMWI2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9saW1pdHMuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIExJTUlUU19ICisjZGVmaW5lIExJTUlUU19ICTEKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGBjaGFyJyAqLworI2RlZmluZSBDSEFSX0JJVAk4CisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBjaGFyJyBjYW4gaG9sZCAqLworI2RlZmluZSBTQ0hBUl9NSU4JKC0xMjgpCisjZGVmaW5lIFNDSEFSX01BWAkxMjcKKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgY2hhcicgY2FuIGhvbGQuIChNaW5pbXVtIGlzIDAuKSAqLworI2RlZmluZSBVQ0hBUl9NQVgJMjU1CisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYGNoYXInIGNhbiBob2xkICovCisjZGVmaW5lIENIQVJfTUlOCVNDSEFSX01JTgorI2RlZmluZSBDSEFSX01BWAlTQ0hBUl9NQVgKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIHNob3J0IGludCcgY2FuIGhvbGQgKi8KKyNkZWZpbmUgU0hSVF9NSU4JKC0zMjc2OCkKKyNkZWZpbmUgU0hSVF9NQVgJMzI3NjcKKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgc2hvcnQnIGNhbiBob2xkLiAoTWluaW11bSBpcyAwLikgKi8KKyNkZWZpbmUgVVNIUlRfTUFYCTY1NTM1CisKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGludCcgY2FuIGhvbGQgKi8KKyNkZWZpbmUgSU5UX01JTgkJKC1JTlRfTUFYIC0gMSkKKyNkZWZpbmUgSU5UX01BWAkJMjE0NzQ4MzY0NworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBpbnQnIGNhbiBob2xkLiAoTWluaW11bSBpcyAwLikgKi8KKyNkZWZpbmUgVUlOVF9NQVgJNDI5NDk2NzI5NVUKKworCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgaW50JyBjYW4gaG9sZCAqLworI2RlZmluZSBJTlRfTUFYCQkyMTQ3NDgzNjQ3CisjZGVmaW5lIElOVF9NSU4JCSgtSU5UX01BWCAtIDEpCisKKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgaW50JyBjYW4gaG9sZC4gKE1pbmltdW0gaXMgMC4pICovCisjZGVmaW5lIFVJTlRfTUFYCTQyOTQ5NjcyOTVVCisKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcnIGNhbiBob2xkICovCisjZGVmaW5lIExPTkdfTUFYCTIxNDc0ODM2NDcKKyNkZWZpbmUgTE9OR19NSU4JKC1MT05HX01BWCAtIDFMKQorCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nJyBjYW4gaG9sZC4gKE1pbmltdW0gaXMgMC4pICovCisjZGVmaW5lIFVMT05HX01BWAk0Mjk0OTY3Mjk1VUwKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZycgY2FuIGhvbGQgKi8KKyNkZWZpbmUgTExPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorI2RlZmluZSBMTE9OR19NSU4JKC1MT05HX01BWCAtIDFMTCkKKworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGxvbmcnIGNhbiBob2xkLiAoTWluaW11bSBpcyAwLikgKi8KKyNkZWZpbmUgVUxMT05HX01BWAkxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTAorCisKKyNlbmRpZiAvKiBMSU1JVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvbWVtc2l6ZXMuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL21lbXNpemVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyMTc0OQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL21lbXNpemVzLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfTUVNU0laRVNfSAorI2RlZmluZSBfTUVNU0laRVNfSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxiYXNlbWVtLmg+CisKKy8qKgorICogR2V0IHNpemUgb2YgYmFzZSBtZW1vcnkgZnJvbSBCSU9TIGZyZWUgYmFzZSBtZW1vcnkgY291bnRlcgorICoKKyAqIEByZXQgYmFzZW1lbQkJQmFzZSBtZW1vcnkgc2l6ZSwgaW4ga0IKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmFzZW1lbXNpemUgKCB2b2lkICkgeworCXJldHVybiBnZXRfZmJtcygpOworfQorCitleHRlcm4gdW5zaWduZWQgaW50IGV4dG1lbXNpemUgKCB2b2lkICk7CisKKyNlbmRpZiAvKiBfTUVNU0laRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvbXVsdGlib290LmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9tdWx0aWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDYxNGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvbXVsdGlib290LmgKQEAgLTAsMCArMSwxNDkgQEAKKyNpZm5kZWYgX01VTFRJQk9PVF9ICisjZGVmaW5lIF9NVUxUSUJPT1RfSAorCisvKioKKyAqIEBmaWxlCisgKgorICogTXVsdGlib290IG9wZXJhdGluZyBzeXN0ZW1zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiogVGhlIG1hZ2ljIG51bWJlciBmb3IgdGhlIE11bHRpYm9vdCBoZWFkZXIgKi8KKyNkZWZpbmUgTVVMVElCT09UX0hFQURFUl9NQUdJQyAweDFCQURCMDAyCisKKy8qKiBCb290IG1vZHVsZXMgbXVzdCBiZSBwYWdlIGFsaWduZWQgKi8KKyNkZWZpbmUgTUJfRkxBR19QR0FMSUdOIDB4MDAwMDAwMDEKKworLyoqIE1lbW9yeSBtYXAgbXVzdCBiZSBwcm92aWRlZCAqLworI2RlZmluZSBNQl9GTEFHX01FTU1BUCAweDAwMDAwMDAyCisKKy8qKiBWaWRlbyBtb2RlIGluZm9ybWF0aW9uIG11c3QgYmUgcHJvdmlkZWQgKi8KKyNkZWZpbmUgTUJfRkxBR19WSURNT0RFIDB4MDAwMDAwMDQKKworLyoqIEltYWdlIGlzIGEgcmF3IG11bHRpYm9vdCBpbWFnZSAobm90IEVMRikgKi8KKyNkZWZpbmUgTUJfRkxBR19SQVcgMHgwMDAxMDAwMAorCisvKioKKyAqIFRoZSBtYWdpYyBudW1iZXIgcGFzc2VkIGJ5IGEgTXVsdGlib290LWNvbXBsaWFudCBib290IGxvYWRlcgorICoKKyAqIE11c3QgYmUgcGFzc2VkIGluIHJlZ2lzdGVyICVlYXggd2hlbiBqdW1waW5nIHRvIHRoZSBNdWx0aWJvb3QgT1MKKyAqIGltYWdlLgorICovCisjZGVmaW5lIE1VTFRJQk9PVF9CT09UTE9BREVSX01BR0lDIDB4MkJBREIwMDIKKworLyoqIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgbWVtXyogZmllbGRzIGFyZSB2YWxpZCAqLworI2RlZmluZSBNQklfRkxBR19NRU0gMHgwMDAwMDAwMQorCisvKiogTXVsdGlib290IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBib290X2RldmljZSBmaWVsZCBpcyB2YWxpZCAqLworI2RlZmluZSBNQklfRkxBR19CT09UREVWIDB4MDAwMDAwMDIKKworLyoqIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgY21kbGluZSBmaWVsZCBpcyB2YWxpZCAqLworI2RlZmluZSBNQklfRkxBR19DTURMSU5FIDB4MDAwMDAwMDQKKworLyoqIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgbW9kdWxlIGZpZWxkcyBhcmUgdmFsaWQgKi8KKyNkZWZpbmUgTUJJX0ZMQUdfTU9EUyAweDAwMDAwMDA4CisKKy8qKiBNdWx0aWJvb3QgaW5mb3JtYXRpb24gc3RydWN0dXJlIGEub3V0IHN5bWJvbCB0YWJsZSBpcyB2YWxpZCAqLworI2RlZmluZSBNQklfRkxBR19BT1VUIDB4MDAwMDAwMTAKKworLyoqIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1dHVyZSBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgaXMgdmFsaWQgKi8KKyNkZWZpbmUgTUJJX0ZMQUdfRUxGIDB4MDAwMDAwMjAKKworLyoqIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgbWVtb3J5IG1hcCBpcyB2YWxpZCAqLworI2RlZmluZSBNQklfRkxBR19NTUFQIDB4MDAwMDAwNDAKKworLyoqIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZHJpdmUgbGlzdCBpcyB2YWxpZCAqLworI2RlZmluZSBNQklfRkxBR19EUklWRVMgMHgwMDAwMDA4MAorCisvKiogTXVsdGlib290IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBST00gY29uZmlndXJhdGlvbiBmaWVsZCBpcyB2YWxpZCAqLworI2RlZmluZSBNQklfRkxBR19DRkdUQkwgMHgwMDAwMDEwMAorCisvKiogTXVsdGlib290IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBib290IGxvYWRlciBuYW1lIGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIE1CSV9GTEFHX0xPQURFUiAweDAwMDAwMjAwCisKKy8qKiBNdWx0aWJvb3QgaW5mb3JtYXRpb24gc3RydWN0dXJlIEFQTSB0YWJsZSBpcyB2YWxpZCAqLworI2RlZmluZSBNQklfRkxBR19BUE0gMHgwMDAwMDQwMAorCisvKiogTXVsdGlib290IGluZm9ybWF0aW9uIHN0cnVjdHVyZSB2aWRlbyBpbmZvcm1hdGlvbiBpcyB2YWxpZCAqLworI2RlZmluZSBNQklfRkxBR19WQkUgMHgwMDAwMDgwMAorCisvKiogQSBtdWx0aWJvb3QgaGVhZGVyICovCitzdHJ1Y3QgbXVsdGlib290X2hlYWRlciB7CisJdWludDMyX3QgbWFnaWM7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgY2hlY2tzdW07CisJdWludDMyX3QgaGVhZGVyX2FkZHI7CisJdWludDMyX3QgbG9hZF9hZGRyOworCXVpbnQzMl90IGxvYWRfZW5kX2FkZHI7CisJdWludDMyX3QgYnNzX2VuZF9hZGRyOworCXVpbnQzMl90IGVudHJ5X2FkZHI7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkLCBtYXlfYWxpYXMgKSk7CisKKy8qKiBBIG11bHRpYm9vdCBhLm91dCBzeW1ib2wgdGFibGUgKi8KK3N0cnVjdCBtdWx0aWJvb3RfYW91dF9zeW1ib2xfdGFibGUgeworCXVpbnQzMl90IHRhYnNpemU7CisJdWludDMyX3Qgc3Ryc2l6ZTsKKwl1aW50MzJfdCBhZGRyOworCXVpbnQzMl90IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCwgbWF5X2FsaWFzICkpOworCisvKiogQSBtdWx0aWJvb3QgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlICovCitzdHJ1Y3QgbXVsdGlib290X2VsZl9zZWN0aW9uX2hlYWRlcl90YWJsZSB7CisJdWludDMyX3QgbnVtOworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3QgYWRkcjsKKwl1aW50MzJfdCBzaG5keDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQsIG1heV9hbGlhcyApKTsKKworLyoqIEEgbXVsdGlib290IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLworc3RydWN0IG11bHRpYm9vdF9pbmZvIHsKKwl1aW50MzJfdCBmbGFnczsKKwl1aW50MzJfdCBtZW1fbG93ZXI7CisJdWludDMyX3QgbWVtX3VwcGVyOworCXVpbnQzMl90IGJvb3RfZGV2aWNlOworCXVpbnQzMl90IGNtZGxpbmU7CisJdWludDMyX3QgbW9kc19jb3VudDsKKwl1aW50MzJfdCBtb2RzX2FkZHI7CisJdW5pb24geworCQlzdHJ1Y3QgbXVsdGlib290X2FvdXRfc3ltYm9sX3RhYmxlIGFvdXRfc3ltczsKKwkJc3RydWN0IG11bHRpYm9vdF9lbGZfc2VjdGlvbl9oZWFkZXJfdGFibGUgZWxmX3NlY3Rpb25zOworCX0gc3ltczsKKwl1aW50MzJfdCBtbWFwX2xlbmd0aDsKKwl1aW50MzJfdCBtbWFwX2FkZHI7CisJdWludDMyX3QgZHJpdmVzX2xlbmd0aDsKKwl1aW50MzJfdCBkcml2ZXNfYWRkcjsKKwl1aW50MzJfdCBjb25maWdfdGFibGU7CisJdWludDMyX3QgYm9vdF9sb2FkZXJfbmFtZTsKKwl1aW50MzJfdCBhcG1fdGFibGU7CisJdWludDMyX3QgdmJlX2NvbnRyb2xfaW5mbzsKKwl1aW50MzJfdCB2YmVfbW9kZV9pbmZvOworCXVpbnQxNl90IHZiZV9tb2RlOworCXVpbnQxNl90IHZiZV9pbnRlcmZhY2Vfc2VnOworCXVpbnQxNl90IHZiZV9pbnRlcmZhY2Vfb2ZmOworCXVpbnQxNl90IHZiZV9pbnRlcmZhY2VfbGVuOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCwgbWF5X2FsaWFzICkpOworCisvKiogQSBtdWx0aWJvb3QgbW9kdWxlIHN0cnVjdHVyZSAqLworc3RydWN0IG11bHRpYm9vdF9tb2R1bGUgeworCXVpbnQzMl90IG1vZF9zdGFydDsKKwl1aW50MzJfdCBtb2RfZW5kOworCXVpbnQzMl90IHN0cmluZzsKKwl1aW50MzJfdCByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQsIG1heV9hbGlhcyApKTsKKworLyoqIEEgbXVsdGlib290IG1lbW9yeSBtYXAgZW50cnkgKi8KK3N0cnVjdCBtdWx0aWJvb3RfbWVtb3J5X21hcCB7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50NjRfdCBiYXNlX2FkZHI7CisJdWludDY0X3QgbGVuZ3RoOworCXVpbnQzMl90IHR5cGU7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkLCBtYXlfYWxpYXMgKSk7CisKKy8qKiBVc2FibGUgUkFNICovCisjZGVmaW5lIE1CTUVNX1JBTSAxCisKKyNlbmRpZiAvKiBfTVVMVElCT09UX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3BpYzgyNTkuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3BpYzgyNTkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGUyMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvcGljODI1OS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBCYXNpYyBzdXBwb3J0IGZvciBjb250cm9sbGluZyB0aGUgODI1OSBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXJzLgorICoKKyAqIEluaXRpYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgQnJvd24gKG1jYjMwKS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZm5kZWYgUElDODI1OV9ICisjZGVmaW5lIFBJQzgyNTlfSAorCisvKiBGb3Igc2Vnb2ZmX3QgKi8KKyNpbmNsdWRlICJyZWFsbW9kZS5oIgorCisjZGVmaW5lIElSUV9QSUNfQ1VUT0ZGIDgKKworLyogODI1OSByZWdpc3RlciBsb2NhdGlvbnMgKi8KKyNkZWZpbmUgUElDMV9JQ1cxIDB4MjAKKyNkZWZpbmUgUElDMV9PQ1cyIDB4MjAKKyNkZWZpbmUgUElDMV9PQ1czIDB4MjAKKyNkZWZpbmUgUElDMV9JQ1IgMHgyMAorI2RlZmluZSBQSUMxX0lSUiAweDIwCisjZGVmaW5lIFBJQzFfSVNSIDB4MjAKKyNkZWZpbmUgUElDMV9JQ1cyIDB4MjEKKyNkZWZpbmUgUElDMV9JQ1czIDB4MjEKKyNkZWZpbmUgUElDMV9JQ1c0IDB4MjEKKyNkZWZpbmUgUElDMV9JTVIgMHgyMQorI2RlZmluZSBQSUMyX0lDVzEgMHhhMAorI2RlZmluZSBQSUMyX09DVzIgMHhhMAorI2RlZmluZSBQSUMyX09DVzMgMHhhMAorI2RlZmluZSBQSUMyX0lDUiAweGEwCisjZGVmaW5lIFBJQzJfSVJSIDB4YTAKKyNkZWZpbmUgUElDMl9JU1IgMHhhMAorI2RlZmluZSBQSUMyX0lDVzIgMHhhMQorI2RlZmluZSBQSUMyX0lDVzMgMHhhMQorI2RlZmluZSBQSUMyX0lDVzQgMHhhMQorI2RlZmluZSBQSUMyX0lNUiAweGExCisKKy8qIFJlZ2lzdGVyIGNvbW1hbmQgdmFsdWVzICovCisjZGVmaW5lIE9DVzNfSUQgMHgwOAorI2RlZmluZSBPQ1czX1JFQURfSVJSIDB4MDMKKyNkZWZpbmUgT0NXM19SRUFEX0lTUiAweDAyCisjZGVmaW5lIElDUl9FT0lfTk9OX1NQRUNJRklDIDB4MjAKKyNkZWZpbmUgSUNSX0VPSV9OT1AgMHg0MAorI2RlZmluZSBJQ1JfRU9JX1NQRUNJRklDIDB4NjAKKyNkZWZpbmUgSUNSX0VPSV9TRVRfUFJJT1JJVFkgMHhjMAorCisvKiBNYWNyb3MgdG8gZW5hYmxlL2Rpc2FibGUgSVJRcyAqLworI2RlZmluZSBJTVJfUkVHKHgpICggKHgpIDwgSVJRX1BJQ19DVVRPRkYgPyBQSUMxX0lNUiA6IFBJQzJfSU1SICkKKyNkZWZpbmUgSU1SX0JJVCh4KSAoIDEgPDwgKCAoeCkgJSBJUlFfUElDX0NVVE9GRiApICkKKyNkZWZpbmUgaXJxX2VuYWJsZWQoeCkgKCAoIGluYiAoIElNUl9SRUcoeCkgKSAmIElNUl9CSVQoeCkgKSA9PSAwICkKKyNkZWZpbmUgZW5hYmxlX2lycSh4KSBvdXRiICggaW5iKCBJTVJfUkVHKHgpICkgJiB+SU1SX0JJVCh4KSwgSU1SX1JFRyh4KSApCisjZGVmaW5lIGRpc2FibGVfaXJxKHgpIG91dGIgKCBpbmIoIElNUl9SRUcoeCkgKSB8IElNUl9CSVQoeCksIElNUl9SRUcoeCkgKQorCisvKiBNYWNyb3MgZm9yIGFja25vd2xlZGdpbmcgSVJRcyAqLworI2RlZmluZSBJQ1JfUkVHKCBpcnEgKSAoIChpcnEpIDwgSVJRX1BJQ19DVVRPRkYgPyBQSUMxX0lDUiA6IFBJQzJfSUNSICkKKyNkZWZpbmUgSUNSX1ZBTFVFKCBpcnEgKSAoIChpcnEpICUgSVJRX1BJQ19DVVRPRkYgKQorI2RlZmluZSBDSEFJTkVEX0lSUSAyCisKKy8qIFV0aWxpdHkgbWFjcm9zIHRvIGNvbnZlcnQgSVJRIG51bWJlcnMgdG8gSU5UIG51bWJlcnMgYW5kIElOVCB2ZWN0b3JzICAqLworI2RlZmluZSBJUlFfSU5UKCBpcnEgKSAoICggKCAoaXJxKSAtIElSUV9QSUNfQ1VUT0ZGICkgXiAweDcwICkgJiAweDdmICkKKworLyogT3RoZXIgY29uc3RhbnRzICovCisjZGVmaW5lIElSUV9NQVggMTUKKyNkZWZpbmUgSVJRX05PTkUgLTFVCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLwordm9pZCBzZW5kX2VvaSAoIHVuc2lnbmVkIGludCBpcnEgKTsKKworI2VuZGlmIC8qIFBJQzgyNTlfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvcG5wYmlvcy5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvcG5wYmlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMjBlNzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9wbnBiaW9zLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfUE5QQklPU19ICisjZGVmaW5lIF9QTlBCSU9TX0gKKworLyoqIEBmaWxlCisgKgorICogUG5QIEJJT1MKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiBCSU9TIHNlZ21lbnQgYWRkcmVzcyAqLworI2RlZmluZSBCSU9TX1NFRyAweGYwMDAKKworZXh0ZXJuIGludCBmaW5kX3BucF9iaW9zICggdm9pZCApOworCisjZW5kaWYgLyogX1BOUEJJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvcHhlLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9weGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFlZTdiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvcHhlLmgKQEAgLTAsMCArMSwxNTQgQEAKKyNpZm5kZWYgUFhFX0gKKyNkZWZpbmUgUFhFX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSAicHhlX3R5cGVzLmgiCisjaW5jbHVkZSAicHhlX2FwaS5oIgorI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisKKy8qIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5rbm93bigpICovCitzdHJ1Y3Qgc19QWEVOVl9VTktOT1dOIHsKKwlQWEVOVl9TVEFUVVNfdCBTdGF0dXM7CQkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VOS05PV04gUFhFTlZfVU5LTk9XTl90OworCisvKiBVbmlvbiB1c2VkIGZvciBQWEUgQVBJIGNhbGxzOyB3ZSBkb24ndCBrbm93IHRoZSB0eXBlIG9mIHRoZQorICogc3RydWN0dXJlIHVudGlsIHdlIGludGVycHJldCB0aGUgb3Bjb2RlLiAgQWxzbywgU3RhdHVzIGlzIGF2YWlsYWJsZQorICogaW4gdGhlIHNhbWUgbG9jYXRpb24gZm9yIGFueSBvcGNvZGUsIGFuZCBpdCdzIGNvbnZlbmllbnQgdG8gaGF2ZQorICogbm9uLXNwZWNpZmljIGFjY2VzcyB0byBpdC4KKyAqLwordW5pb24gdV9QWEVOVl9BTlkgeworCS8qIE1ha2UgaXQgZWFzeSB0byByZWFkIHN0YXR1cyBmb3IgYW55IG9wZXJhdGlvbiAqLworCVBYRU5WX1NUQVRVU190CQkJCVN0YXR1czsKKwlzdHJ1Y3Qgc19QWEVOVl9VTktOT1dOCQkJdW5rbm93bjsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkxPQURfU1RBQ0sJCXVubG9hZF9zdGFjazsKKwlzdHJ1Y3Qgc19QWEVOVl9HRVRfQ0FDSEVEX0lORk8JCWdldF9jYWNoZWRfaW5mbzsKKwlzdHJ1Y3Qgc19QWEVOVl9URlRQX1JFQURfRklMRQkJcmVzdGFydF90ZnRwOworCXN0cnVjdCBzX1BYRU5WX1NUQVJUX1VOREkJCXN0YXJ0X3VuZGk7CisJc3RydWN0IHNfUFhFTlZfU1RPUF9VTkRJCQlzdG9wX3VuZGk7CisJc3RydWN0IHNfUFhFTlZfU1RBUlRfQkFTRQkJc3RhcnRfYmFzZTsKKwlzdHJ1Y3Qgc19QWEVOVl9TVE9QX0JBU0UJCXN0b3BfYmFzZTsKKwlzdHJ1Y3Qgc19QWEVOVl9URlRQX09QRU4JCXRmdHBfb3BlbjsKKwlzdHJ1Y3Qgc19QWEVOVl9URlRQX0NMT1NFCQl0ZnRwX2Nsb3NlOworCXN0cnVjdCBzX1BYRU5WX1RGVFBfUkVBRAkJdGZ0cF9yZWFkOworCXN0cnVjdCBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFCQl0ZnRwX3JlYWRfZmlsZTsKKwlzdHJ1Y3Qgc19QWEVOVl9URlRQX0dFVF9GU0laRQkJdGZ0cF9nZXRfZnNpemU7CisJc3RydWN0IHNfUFhFTlZfVURQX09QRU4JCQl1ZHBfb3BlbjsKKwlzdHJ1Y3Qgc19QWEVOVl9VRFBfQ0xPU0UJCXVkcF9jbG9zZTsKKwlzdHJ1Y3Qgc19QWEVOVl9VRFBfV1JJVEUJCXVkcF93cml0ZTsKKwlzdHJ1Y3Qgc19QWEVOVl9VRFBfUkVBRAkJCXVkcF9yZWFkOworCXN0cnVjdCBzX1BYRU5WX1VORElfU1RBUlRVUAkJdW5kaV9zdGFydHVwOworCXN0cnVjdCBzX1BYRU5WX1VORElfQ0xFQU5VUAkJdW5kaV9jbGVhbnVwOworCXN0cnVjdCBzX1BYRU5WX1VORElfSU5JVElBTElaRQkJdW5kaV9pbml0aWFsaXplOworCXN0cnVjdCBzX1BYRU5WX1VORElfUkVTRVQJCXVuZGlfcmVzZXRfYWRhcHRlcjsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NIVVRET1dOCQl1bmRpX3NodXRkb3duOworCXN0cnVjdCBzX1BYRU5WX1VORElfT1BFTgkJdW5kaV9vcGVuOworCXN0cnVjdCBzX1BYRU5WX1VORElfQ0xPU0UJCXVuZGlfY2xvc2U7CisJc3RydWN0IHNfUFhFTlZfVU5ESV9UUkFOU01JVAkJdW5kaV90cmFuc21pdDsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9NQ0FTVF9BRERSRVNTCXVuZGlfc2V0X21jYXN0X2FkZHJlc3M7CisJc3RydWN0IHNfUFhFTlZfVU5ESV9TRVRfU1RBVElPTl9BRERSRVNTIHVuZGlfc2V0X3N0YXRpb25fYWRkcmVzczsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSCXVuZGlfc2V0X3BhY2tldF9maWx0ZXI7CisJc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT04JdW5kaV9nZXRfaW5mb3JtYXRpb247CisJc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUwl1bmRpX2dldF9zdGF0aXN0aWNzOworCXN0cnVjdCBzX1BYRU5WX1VORElfQ0xFQVJfU1RBVElTVElDUwl1bmRpX2NsZWFyX3N0YXRpc3RpY3M7CisJc3RydWN0IHNfUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUwl1bmRpX2luaXRpYXRlX2RpYWdzOworCXN0cnVjdCBzX1BYRU5WX1VORElfRk9SQ0VfSU5URVJSVVBUCXVuZGlfZm9yY2VfaW50ZXJydXB0OworCXN0cnVjdCBzX1BYRU5WX1VORElfR0VUX01DQVNUX0FERFJFU1MJdW5kaV9nZXRfbWNhc3RfYWRkcmVzczsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9OSUNfVFlQRQl1bmRpX2dldF9uaWNfdHlwZTsKKwlzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPCXVuZGlfZ2V0X2lmYWNlX2luZm87CisJc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfU1RBVEUJCXVuZGlfZ2V0X3N0YXRlOworCXN0cnVjdCBzX1BYRU5WX1VORElfSVNSCQkJdW5kaV9pc3I7CisJc3RydWN0IHNfUFhFTlZfRklMRV9PUEVOCQlmaWxlX29wZW47CisJc3RydWN0IHNfUFhFTlZfRklMRV9DTE9TRQkJZmlsZV9jbG9zZTsKKwlzdHJ1Y3Qgc19QWEVOVl9GSUxFX1NFTEVDVAkJZmlsZV9zZWxlY3Q7CisJc3RydWN0IHNfUFhFTlZfRklMRV9SRUFECQlmaWxlX3JlYWQ7CisJc3RydWN0IHNfUFhFTlZfR0VUX0ZJTEVfU0laRQkJZ2V0X2ZpbGVfc2l6ZTsKKwlzdHJ1Y3Qgc19QWEVOVl9GSUxFX0VYRUMJCWZpbGVfZXhlYzsKKwlzdHJ1Y3Qgc19QWEVOVl9GSUxFX0FQSV9DSEVDSwkJZmlsZV9hcGlfY2hlY2s7CisJc3RydWN0IHNfUFhFTlZfRklMRV9FWElUX0hPT0sJCWZpbGVfZXhpdF9ob29rOworfTsKKwordHlwZWRlZiB1bmlvbiB1X1BYRU5WX0FOWSBQWEVOVl9BTllfdDsKKworLyoqIEFuIFVOREkgZXhwYW5zaW9uIFJPTSBoZWFkZXIgKi8KK3N0cnVjdCB1bmRpX3JvbV9oZWFkZXIgeworCS8qKiBTaWduYXR1cmUKKwkgKgorCSAqIE11c3QgYmUgZXF1YWwgdG8gQGMgUk9NX1NJR05BVFVSRQorCSAqLworCVVJTlQxNl90IFNpZ25hdHVyZTsKKwkvKiogUk9NIGxlbmd0aCBpbiA1MTItYnl0ZSBibG9ja3MgKi8KKwlVSU5UOF90IFJPTUxlbmd0aDsKKwkvKiogVW51c2VkICovCisJVUlOVDhfdCB1bnVzZWRbMHgxM107CisJLyoqIE9mZnNldCBvZiB0aGUgUFhFIFJPTSBJRCBzdHJ1Y3R1cmUgKi8KKwlVSU5UMTZfdCBQWEVST01JRDsKKwkvKiogT2Zmc2V0IG9mIHRoZSBQQ0kgUk9NIHN0cnVjdHVyZSAqLworCVVJTlQxNl90IFBDSVJIZWFkZXI7Cit9IFBBQ0tFRDsKKworLyoqIFNpZ25hdHVyZSBmb3IgYW4gZXhwYW5zaW9uIFJPTSAqLworI2RlZmluZSBST01fU0lHTkFUVVJFIDB4YWE1NQorCisvKiogQW4gVU5ESSBST00gSUQgc3RydWN0dXJlICovCitzdHJ1Y3QgdW5kaV9yb21faWQgeworCS8qKiBTaWduYXR1cmUKKwkgKgorCSAqIE11c3QgYmUgZXF1YWwgdG8gQGMgVU5ESV9ST01fSURfU0lHTkFUVVJFCisJICovCisJVUlOVDMyX3QgU2lnbmF0dXJlOworCS8qKiBMZW5ndGggb2Ygc3RydWN0dXJlICovCisJVUlOVDhfdCBTdHJ1Y3RMZW5ndGg7CisJLyoqIENoZWNrc3VtICovCisJVUlOVDhfdCBTdHJ1Y3RDa3N1bTsKKwkvKiogU3RydWN0dXJlIHJldmlzaW9uCisJICoKKwkgKiBNdXN0IGJlIHplcm8uCisJICovCisJVUlOVDhfdCBTdHJ1Y3RSZXY7CisJLyoqIFVOREkgcmV2aXNpb24KKwkgKgorCSAqIFZlcnNpb24gMi4xLjAgaXMgZW5jb2RlZCBhcyB0aGUgYnl0ZSBzZXF1ZW5jZSAweDAwLCAweDAxLCAweDAyLgorCSAqLworCVVJTlQ4X3QgVU5ESVJldlszXTsKKwkvKiogT2Zmc2V0IHRvIFVOREkgbG9hZGVyICovCisJVUlOVDE2X3QgVU5ESUxvYWRlcjsKKwkvKiogTWluaW11bSByZXF1aXJlZCBzdGFjayBzZWdtZW50IHNpemUgKi8KKwlVSU5UMTZfdCBTdGFja1NpemU7CisJLyoqIE1pbmltdW0gcmVxdWlyZWQgZGF0YSBzZWdtZW50IHNpemUgKi8KKwlVSU5UMTZfdCBEYXRhU2l6ZTsKKwkvKiogTWluaW11bSByZXF1aXJlZCBjb2RlIHNlZ21lbnQgc2l6ZSAqLworCVVJTlQxNl90IENvZGVTaXplOworfSBQQUNLRUQ7CisKKy8qKiBTaWduYXR1cmUgZm9yIGFuIFVOREkgUk9NIElEIHN0cnVjdHVyZSAqLworI2RlZmluZSBVTkRJX1JPTV9JRF9TSUdOQVRVUkUgXAorCSggKCAnVScgPDwgMCApICsgKCAnTicgPDwgOCApICsgKCAnRCcgPDwgMTYgKSArICggJ0knIDw8IDI0ICkgKQorCisvKiogQSBQQ0kgZXhwYW5zaW9uIGhlYWRlciAqLworc3RydWN0IHBjaXJfaGVhZGVyIHsKKwkvKiogU2lnbmF0dXJlCisJICoKKwkgKiBNdXN0IGJlIGVxdWFsIHRvIEBjIFBDSVJfU0lHTkFUVVJFCisJICovCisJdWludDMyX3Qgc2lnbmF0dXJlOworCS8qKiBQQ0kgdmVuZG9yIElEICovCisJdWludDE2X3QgdmVuZG9yX2lkOworCS8qKiBQQ0kgZGV2aWNlIElEICovCisJdWludDE2X3QgZGV2aWNlX2lkOworfSBQQUNLRUQ7CisKKy8qKiBTaWduYXR1cmUgZm9yIGFuIFVOREkgUk9NIElEIHN0cnVjdHVyZSAqLworI2RlZmluZSBQQ0lSX1NJR05BVFVSRSBcCisJKCAoICdQJyA8PCAwICkgKyAoICdDJyA8PCA4ICkgKyAoICdJJyA8PCAxNiApICsgKCAnUicgPDwgMjQgKSApCisKKworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpweGVfbmV0ZGV2OworCitleHRlcm4gdm9pZCBweGVfc2V0X25ldGRldiAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKTsKKworZXh0ZXJuIHZvaWQgcHhlX3NldF9jYWNoZWRfZmlsZW5hbWUgKCBjb25zdCB1bnNpZ25lZCBjaGFyICpmaWxlbmFtZSApOworCisjZW5kaWYgLyogUFhFX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3B4ZV9hcGkuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3B4ZV9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmYwNDZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvcHhlX2FwaS5oCkBAIC0wLDAgKzEsMTkwOSBAQAorI2lmbmRlZiBQWEVfQVBJX0gKKyNkZWZpbmUgUFhFX0FQSV9ICisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogQXMgYW4gYWx0ZXJuYXRpdmUsIGF0IHlvdXIgb3B0aW9uLCB5b3UgbWF5IHVzZSB0aGlzIGZpbGUgdW5kZXIgdGhlCisgKiBmb2xsb3dpbmcgdGVybXMsIGtub3duIGFzIHRoZSAiTUlUIGxpY2Vuc2UiOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qKiBAZmlsZQorICoKKyAqIFByZWJvb3QgZVhlY3V0aW9uIEVudmlyb25tZW50IChQWEUpIEFQSQorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlICJweGVfdHlwZXMuaCIKKworLyoqIEBhZGR0b2dyb3VwIHB4ZSBQcmVib290IGVYZWN1dGlvbiBFbnZpcm9ubWVudCAoUFhFKSBBUEkKKyAqICBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlX2FwaV9jYWxsIFBYRSBlbnRyeSBwb2ludHMKKyAqCisgKiBQWEUgZW50cnkgcG9pbnRzIGFuZCBjYWxsaW5nIGNvbnZlbnRpb25zCisgKgorICogIEB7CisgKi8KKworLyoqIFRoZSBQWEVOVisgc3RydWN0dXJlICovCitzdHJ1Y3Qgc19QWEVOViB7CisJLyoqIFNpZ25hdHVyZQorCSAqCisJICogQ29udGFpbnMgdGhlIGJ5dGVzICdQJywgJ1gnLCAnRScsICdOJywgJ1YnLCAnKycuCisJICovCisJVUlOVDhfdAkJU2lnbmF0dXJlWzZdOworCS8qKiBQWEUgQVBJIHZlcnNpb24KKwkgKgorCSAqIE1TQiBpcyBtYWpvciB2ZXJzaW9uIG51bWJlciwgTFNCIGlzIG1pbm9yIHZlcnNpb24gbnVtYmVyLgorCSAqIElmIHRoZSBBUEkgdmVyc2lvbiBudW1iZXIgaXMgMHgwMjAxIG9yIGdyZWF0ZXIsIHRoZSAhUFhFCisJICogc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgI1BYRVB0ciBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCisJICogdGhpcyBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKwlVSU5UMTZfdAlWZXJzaW9uOworCVVJTlQ4X3QJCUxlbmd0aDsJCS8qKjwgTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCisJLyoqIENoZWNrc3VtCisJICoKKwkgKiBUaGUgYnl0ZSBjaGVja3N1bSBvZiB0aGlzIHN0cnVjdHVyZSAodXNpbmcgdGhlIGxlbmd0aCBpbgorCSAqICNMZW5ndGgpIG11c3QgYmUgemVyby4KKwkgKi8KKwlVSU5UOF90CQlDaGVja3N1bTsKKwlTRUdPRkYxNl90CVJNRW50cnk7CS8qKjwgUmVhbC1tb2RlIFBYRU5WKyBlbnRyeSBwb2ludCAqLworCS8qKiBQcm90ZWN0ZWQtbW9kZSBQWEVOVisgZW50cnkgcG9pbnQgb2Zmc2V0CisJICoKKwkgKiBQWEUgMi4xIGRlcHJlY2F0ZXMgdGhpcyBlbnRyeSBwb2ludC4gIEZvciBwcm90ZWN0ZWQtbW9kZQorCSAqIEFQSSBjYWxscywgdXNlIHRoZSAhUFhFIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5ICNQWEVQdHIKKwkgKiBpbnN0ZWFkLgorCSAqLworCVVJTlQzMl90CVBNT2Zmc2V0OworCS8qKiBQcm90ZWN0ZWQtbW9kZSBQWEVOVisgZW50cnkgcG9pbnQgc2VnbWVudCBzZWxlY3RvcgorCSAqCisJICogUFhFIDIuMSBkZXByZWNhdGVzIHRoaXMgZW50cnkgcG9pbnQuICBGb3IgcHJvdGVjdGVkLW1vZGUKKwkgKiBBUEkgY2FsbHMsIHVzZSB0aGUgIVBYRSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSAjUFhFUHRyCisJICogaW5zdGVhZC4KKwkgKi8KKwlTRUdTRUxfdAlQTVNlbGVjdG9yOworCVNFR1NFTF90CVN0YWNrU2VnOwkvKio8IFN0YWNrIHNlZ21lbnQgc2VsZWN0b3IgKi8KKwlVSU5UMTZfdAlTdGFja1NpemU7CS8qKjwgU3RhY2sgc2VnbWVudCBzaXplICovCisJU0VHU0VMX3QJQkNfQ29kZVNlZzsJLyoqPCBCYXNlLWNvZGUgY29kZSBzZWdtZW50IHNlbGVjdG9yICovCisJVUlOVDE2X3QJQkNfQ29kZVNpemU7CS8qKjwgQmFzZS1jb2RlIGNvZGUgc2VnbWVudCBzaXplICovCisJU0VHU0VMX3QJQkNfRGF0YVNlZzsJLyoqPCBCYXNlLWNvZGUgZGF0YSBzZWdtZW50IHNlbGVjdG9yICovCisJVUlOVDE2X3QJQkNfRGF0YVNpemU7CS8qKjwgQmFzZS1jb2RlIGRhdGEgc2VnbWVudCBzaXplICovCisJU0VHU0VMX3QJVU5ESURhdGFTZWc7CS8qKjwgVU5ESSBkYXRhIHNlZ21lbnQgc2VsZWN0b3IgKi8KKwlVSU5UMTZfdAlVTkRJRGF0YVNpemU7CS8qKjwgVU5ESSBkYXRhIHNlZ21lbnQgc2l6ZSAqLworCVNFR1NFTF90CVVORElDb2RlU2VnOwkvKio8IFVOREkgY29kZSBzZWdtZW50IHNlbGVjdG9yICovCisJVUlOVDE2X3QJVU5ESUNvZGVTaXplOwkvKio8IFVOREkgY29kZSBzZWdtZW50IHNpemUgKi8KKwkvKiogQWRkcmVzcyBvZiB0aGUgIVBYRSBzdHJ1Y3R1cmUKKwkgKgorCSAqIFRoaXMgZmllbGQgaXMgcHJlc2VudCBvbmx5IGlmICNWZXJzaW9uIGlzIDB4MDIwMSBvcgorCSAqIGdyZWF0ZXIuICBJZiBwcmVzZW50LCBpdCBwb2ludHMgdG8gYSBzdHJ1Y3Qgc19QWEUuCisJICovCisJU0VHT0ZGMTZfdAlQWEVQdHI7Cit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOViBQWEVOVl90OworCisvKiogVGhlICFQWEUgc3RydWN0dXJlICovCitzdHJ1Y3Qgc19QWEUgeworCS8qKiBTaWduYXR1cmUKKwkgKgorCSAqIENvbnRhaW5zIHRoZSBieXRlcyAnIScsICdQJywgJ1gnLCAnRScuCisJICovCisJVUlOVDhfdAkJU2lnbmF0dXJlWzRdOworCVVJTlQ4X3QJCVN0cnVjdExlbmd0aDsJLyoqPCBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwkvKiogQ2hlY2tzdW0KKwkgKgorCSAqIFRoZSBieXRlIGNoZWNrc3VtIG9mIHRoaXMgc3RydWN0dXJlICh1c2luZyB0aGUgbGVuZ3RoIGluCisJICogI1N0cnVjdExlbmd0aCkgbXVzdCBiZSB6ZXJvLgorCSAqLworCVVJTlQ4X3QJCVN0cnVjdENrc3VtOworCS8qKiBSZXZpc2lvbiBvZiB0aGlzIHN0cnVjdHVyZQorCSAqCisJICogRm9yIFBYRSB2ZXJzaW9uIDIuMSwgdGhpcyBmaWVsZCBtdXN0IGJlIHplcm8uCisJICovCisJVUlOVDhfdAkJU3RydWN0UmV2OworCVVJTlQ4X3QJCXJlc2VydmVkXzE7CS8qKjwgTXVzdCBiZSB6ZXJvICovCisJLyoqIEFkZHJlc3Mgb2YgdGhlIFVOREkgUk9NIElEIHN0cnVjdHVyZQorCSAqCisJICogVGhpcyBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3Qgc19VTkRJX1JPTV9JRC4KKwkgKi8KKwlTRUdPRkYxNl90CVVORElST01JRDsKKwkvKiogQWRkcmVzcyBvZiB0aGUgQmFzZSBDb2RlIFJPTSBJRCBzdHJ1Y3R1cmUKKwkgKgorCSAqIFRoaXMgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IHNfQkNfUk9NX0lELgorCSAqLworCVNFR09GRjE2X3QJQmFzZVJPTUlEOworCS8qKiAxNi1iaXQgIVBYRSBlbnRyeSBwb2ludAorCSAqCisJICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGVpdGhlciByZWFsIG1vZGUsIG9yIHByb3RlY3RlZAorCSAqIG1vZGUgd2l0aCBhIDE2LWJpdCBzdGFjayBzZWdtZW50LgorCSAqLworCVNFR09GRjE2X3QJRW50cnlQb2ludFNQOworCS8qKiAzMi1iaXQgIVBYRSBlbnRyeSBwb2ludAorCSAqCisJICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHByb3RlY3RlZCBtb2RlIHdpdGggYSAzMi1iaXQKKwkgKiBzdGFjayBzZWdtZW50LgorCSAqLworCVNFR09GRjE2X3QJRW50cnlQb2ludEVTUDsKKwkvKiogU3RhdHVzIGNhbGwtb3V0IGZ1bmN0aW9uCisJICoKKwkgKiBAdiAwCQkoaWYgaW4gYSB0aW1lLW91dCBsb29wKQorCSAqIEB2IG4JCU51bWJlciBvZiBhIHJlY2VpdmVkIFRGVFAgcGFja2V0CisJICogQHJldCAwCUNvbnRpbnVlIG9wZXJhdGlvbgorCSAqIEByZXQgMQlDYW5jZWwgb3BlcmF0aW9uCisJICoKKwkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBQWEUgc3RhY2sgaXMgaW4KKwkgKiBwcm90ZWN0ZWQgbW9kZSwgaXMgd2FpdGluZyBmb3IgYW4gZXZlbnQgKGUuZy4gYSBESENQIHJlcGx5KQorCSAqIGFuZCB3aXNoZXMgdG8gYWxsb3cgdGhlIHVzZXIgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24uCisJICogUGFyYW1ldGVycyBhcmUgcGFzc2VkIGluIHJlZ2lzdGVyICVheDsgdGhlIHJldHVybiB2YWx1ZQorCSAqIG11c3QgYWxzbyBiZSBwbGFjZWQgaW4gcmVnaXN0ZXIgJWF4LiAgQWxsIG90aGVyIHJlZ2lzdGVycworCSAqIGFuZCBmbGFncyBAYiBtdXN0IGJlIHByZXNlcnZlZC4KKwkgKgorCSAqIEluIHJlYWwgbW9kZSwgYW4gaW50ZXJuYWwgZnVuY3Rpb24gKHRoYXQgY2hlY2tzIGZvciBhCisJICoga2V5cHJlc3MpIHdpbGwgYmUgdXNlZC4KKwkgKgorCSAqIElmIHRoaXMgZmllbGQgaXMgc2V0IHRvIC0xLCBubyBzdGF0dXMgY2FsbC1vdXQgZnVuY3Rpb24KKwkgKiB3aWxsIGJlIHVzZWQgYW5kIGNvbnNlcXVlbnRseSB0aGUgdXNlciB3aWxsIG5vdCBiZSBhbGxvd2VkCisJICogdG8gaW50ZXJydXB0IG9wZXJhdGlvbnMuCisJICoKKwkgKiBAbm90ZSBUaGUgUFhFIHNwZWNpZmljYXRpb24gdmVyc2lvbiAyLjEgZGVmaW5lcyB0aGUKKwkgKiBTdGF0dXNDYWxsb3V0IGZpZWxkLCBtZW50aW9ucyBpdCAxMSB0aW1lcywgYnV0IG5vd2hlcmUKKwkgKiBkZWZpbmVzIHdoYXQgaXQgYWN0dWFsbHkgZG9lcyBvciBob3cgaXQgZ2V0cyBjYWxsZWQuCisJICogRm9ydHVuYXRlbHksIHRoZSBXZk0gc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMWEgZGVpZ25zIHRvCisJICogaW5mb3JtIHVzIG9mIHN1Y2ggcGV0dHkgZGV0YWlscy4KKwkgKi8KKwlTRUdPRkYxNl90CVN0YXR1c0NhbGxvdXQ7CisJVUlOVDhfdAkJcmVzZXJ2ZWRfMjsJLyoqPCBNdXN0IGJlIHplcm8gKi8KKwkvKiogTnVtYmVyIG9mIHNlZ21lbnQgZGVzY3JpcHRvcnMKKwkgKgorCSAqIElmIHRoaXMgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiA3LCB0aGUgcmVtYWluaW5nIGRlc2NyaXB0b3JzCisJICogZm9sbG93IGltbWVkaWF0ZWx5IGFmdGVyICNCQ19Db2RlV3JpdGUuCisJICovCisJVUlOVDhfdAkJU2VnRGVzY0NudDsKKwkvKiogRmlyc3QgcHJvdGVjdGVkLW1vZGUgc2VsZWN0b3IKKwkgKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgc2VsZWN0b3IgdmFsdWUgZm9yIHRoZSBmaXJzdCBzZWdtZW50CisJICogYXNzaWduZWQgdG8gUFhFLiAgUHJvdGVjdGVkLW1vZGUgc2VsZWN0b3JzIG11c3QgYmUKKwkgKiBjb25zZWN1dGl2ZSwgYWNjb3JkaW5nIHRvIHRoZSBQWEUgMi4xIHNwZWNpZmljYXRpb24sIHRob3VnaAorCSAqIG5vIHJlYXNvbiBpcyBnaXZlbi4gIEVhY2ggI1NFR0RFU0NfdCBpbmNsdWRlcyBhIGZpZWxkIGZvcgorCSAqIHRoZSBzZWdtZW50IHNlbGVjdG9yLCBzbyB0aGlzIGluZm9ybWF0aW9uIGlzIGVudGlyZWx5CisJICogcmVkdW5kYW50LgorCSAqLworCVNFR1NFTF90CUZpcnN0U2VsZWN0b3I7CisJLyoqIFN0YWNrIHNlZ21lbnQgZGVzY3JpcHRvciAqLworCVNFR0RFU0NfdAlTdGFjazsKKwkvKiogVU5ESSBkYXRhIHNlZ21lbnQgZGVzY3JpcHRvciAqLworCVNFR0RFU0NfdAlVTkRJRGF0YTsKKwkvKiogVU5ESSBjb2RlIHNlZ21lbnQgZGVzY3JpcHRvciAqLworCVNFR0RFU0NfdAlVTkRJQ29kZTsKKwkvKiogVU5ESSB3cml0YWJsZSBjb2RlIHNlZ21lbnQgZGVzY3JpcHRvciAqLworCVNFR0RFU0NfdAlVTkRJQ29kZVdyaXRlOworCS8qKiBCYXNlLWNvZGUgZGF0YSBzZWdtZW50IGRlc2NyaXB0b3IgKi8KKwlTRUdERVNDX3QJQkNfRGF0YTsKKwkvKiogQmFzZS1jb2RlIGNvZGUgc2VnbWVudCBkZXNjcmlwdG9yICovCisJU0VHREVTQ190CUJDX0NvZGU7CisJLyoqIEJhc2UtY29kZSB3cml0YWJsZSBjb2RlIHNlZ21lbnQgZGVzY3JpcHRvciAqLworCVNFR0RFU0NfdAlCQ19Db2RlV3JpdGU7Cit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEUgUFhFX3Q7CisKKy8qKiBAfSAqLyAvKiBweGVfYXBpX2NhbGwgKi8KKworLyoqIEBkZWZncm91cCBweGVfcHJlYm9vdF9hcGkgUFhFIFByZWJvb3QgQVBJCisgKgorICogR2VuZXJhbCBoaWdoLWxldmVsIGZ1bmN0aW9uczogI1BYRU5WX1VOTE9BRF9TVEFDSywgI1BYRU5WX1NUQVJUX1VOREkgZXRjLgorICoKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBweGVudl91bmxvYWRfc3RhY2sgUFhFTlZfVU5MT0FEX1NUQUNLCisgKgorICogIFVOTE9BRCBCQVNFIENPREUgU1RBQ0sKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmxvYWRfc3RhY2soKSAqLworI2RlZmluZQlQWEVOVl9VTkxPQURfU1RBQ0sJCTB4MDA3MAorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmxvYWRfc3RhY2soKSAqLworc3RydWN0IHNfUFhFTlZfVU5MT0FEX1NUQUNLIHsKKwlQWEVOVl9TVEFUVVNfdCBTdGF0dXM7CQkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwlVSU5UOF90IHJlc2VydmVkWzEwXTsJCQkvKio8IE11c3QgYmUgemVybyAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5MT0FEX1NUQUNLIFBYRU5WX1VOTE9BRF9TVEFDS190OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VubG9hZF9zdGFjayAoIHN0cnVjdCBzX1BYRU5WX1VOTE9BRF9TVEFDSworCQkJCQkgKnVubG9hZF9zdGFjayApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5sb2FkX3N0YWNrICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfZ2V0X2NhY2hlZF9pbmZvIFBYRU5WX0dFVF9DQUNIRURfSU5GTworICoKKyAqICBHRVQgQ0FDSEVEIElORk8KKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl9nZXRfY2FjaGVkX2luZm8oKSAqLworI2RlZmluZQlQWEVOVl9HRVRfQ0FDSEVEX0lORk8JCTB4MDA3MQorCisvKiogVGhlIGNsaWVudCdzIERIQ1BESVNDT1ZFUiBwYWNrZXQgKi8KKyNkZWZpbmUgUFhFTlZfUEFDS0VUX1RZUEVfREhDUF9ESVNDT1ZFUgkxCisKKy8qKiBUaGUgREhDUCBzZXJ2ZXIncyBESENQQUNLIHBhY2tldCAqLworI2RlZmluZSBQWEVOVl9QQUNLRVRfVFlQRV9ESENQX0FDSwkyCisKKy8qKiBUaGUgQm9vdCBTZXJ2ZXIncyBEaXNjb3ZlciBSZXBseSBwYWNrZXQKKyAqCisgKiBUaGlzIHBhY2tldCBjb250YWlucyBESENQIG9wdGlvbiA2MCBzZXQgdG8gIlBYRUNsaWVudCIsIGEgdmFsaWQKKyAqIGJvb3QgZmlsZSBuYW1lLCBhbmQgbWF5IG9yIG1heSBub3QgY29udGFpbiBNVEZUUCBvcHRpb25zLgorICovCisjZGVmaW5lIFBYRU5WX1BBQ0tFVF9UWVBFX0NBQ0hFRF9SRVBMWQkzCisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X2dldF9jYWNoZWRfaW5mbygpICovCitzdHJ1Y3Qgc19QWEVOVl9HRVRfQ0FDSEVEX0lORk8geworCVBYRU5WX1NUQVRVU190IFN0YXR1czsJCQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCS8qKiBQYWNrZXQgdHlwZS4KKwkgKgorCSAqIFZhbGlkIHZhbHVlcyBhcmUgI1BYRU5WX1BBQ0tFVF9UWVBFX0RIQ1BfRElTQ09WRVIsCisJICogI1BYRU5WX1BBQ0tFVF9UWVBFX0RIQ1BfQUNLIG9yICNQWEVOVl9QQUNLRVRfVFlQRV9DQUNIRURfUkVQTFkKKwkgKi8KKwlVSU5UMTZfdCBQYWNrZXRUeXBlOworCVVJTlQxNl90IEJ1ZmZlclNpemU7CQkJLyoqPCBCdWZmZXIgc2l6ZSAqLworCVNFR09GRjE2X3QgQnVmZmVyOwkJCS8qKjwgQnVmZmVyIGFkZHJlc3MgKi8KKwlVSU5UMTZfdCBCdWZmZXJMaW1pdDsJCQkvKio8IE1heGltdW0gYnVmZmVyIHNpemUgKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX0dFVF9DQUNIRURfSU5GTyBQWEVOVl9HRVRfQ0FDSEVEX0lORk9fdDsKKworI2RlZmluZSBCT09UUF9SRVEJMQkvKio8IEEgQk9PVFAgcmVxdWVzdCBwYWNrZXQgKi8KKyNkZWZpbmUgQk9PVFBfUkVQCTIJLyoqPCBBIEJPT1RQIHJlcGx5IHBhY2tldCAqLworCisvKiogREhDUCBicm9hZGNhc3QgZmxhZworICoKKyAqIFJlcXVlc3QgYSBicm9hZGNhc3QgcmVzcG9uc2UgKERIQ1BPRkZFUiBvciBESENQQUNLKSBmcm9tIHRoZSBESENQCisgKiBzZXJ2ZXIuCisgKi8KKyNkZWZpbmUgQk9PVFBfQkNBU1QJMHg4MDAwCisKKyNkZWZpbmUgVk1fUkZDMTA0OAkweDYzODI1MzYzTAkvKio8IERIQ1AgbWFnaWMgY29va2llICovCisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiBESENQIG9wdGlvbnMgKi8KKyNkZWZpbmUgQk9PVFBfREhDUFZFTkQJMTAyNAorCisvKiogRm9ybWF0IG9mIGJ1ZmZlciBmaWxsZWQgaW4gYnkgcHhlbnZfZ2V0X2NhY2hlZF9pbmZvKCkKKyAqCisgKiBUaGlzIHNvbWV3aGF0IGNvbnZvbHV0ZWQgZGF0YSBzdHJ1Y3R1cmUgc2ltcGx5IGRlc2NyaWJlcyB0aGUgbGF5b3V0CisgKiBvZiBhIERIQ1AgcGFja2V0LiAgUmVmZXIgdG8gUkZDMjEzMSBzZWN0aW9uIDIgZm9yIGEgZnVsbAorICogZGVzY3JpcHRpb24uCisgKi8KK3N0cnVjdCBib290cGggeworCS8qKiBNZXNzYWdlIG9wY29kZS4KKwkgKgorCSAqIFZhbGlkIHZhbHVlcyBhcmUgI0JPT1RQX1JFUSBhbmQgI0JPT1RQX1JFUC4KKwkgKi8KKwlVSU5UOF90IG9wY29kZTsKKwkvKiogTklDIGhhcmR3YXJlIHR5cGUuCisJICoKKwkgKiBWYWxpZCB2YWx1ZXMgYXJlIGFzIGZvciBzX1BYRU5WX1VORElfR0VUX0lORk9STUFUSU9OOjpId1R5cGUuCisJICovCisJVUlOVDhfdCBIYXJkd2FyZTsKKwlVSU5UOF90IEhhcmRsZW47CQkvKio8IE1BQyBhZGRyZXNzIGxlbmd0aCAqLworCS8qKiBHYXRld2F5IGhvcHMKKwkgKgorCSAqIFplcm8gaW4gcGFja2V0cyBzZW50IGJ5IHRoZSBjbGllbnQuICBNYXkgYmUgbm9uLXplcm8gaW4KKwkgKiByZXBsaWVzIGZyb20gdGhlIERIQ1Agc2VydmVyLCBpZiB0aGUgcmVwbHkgY29tZXMgdmlhIGEgREhDUAorCSAqIHJlbGF5IGFnZW50LgorCSAqLworCVVJTlQ4X3QgR2F0ZWhvcHM7CisJVUlOVDMyX3QgaWRlbnQ7CQkJLyoqPCBESENQIHRyYW5zYWN0aW9uIGlkICh4aWQpICovCisJLyoqIEVsYXBzZWQgdGltZQorCSAqCisJICogTnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIGNsaWVudCBiZWdhbiB0aGUgREhDUAorCSAqIHRyYW5zYWN0aW9uLgorCSAqLworCVVJTlQxNl90IHNlY29uZHM7CisJLyoqIEZsYWdzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBiaXR3aXNlLU9SIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKwkgKiAjQk9PVFBfQkNBU1QuCisJICovCisJVUlOVDE2X3QgRmxhZ3M7CisJLyoqIENsaWVudCBJUCBhZGRyZXNzCisJICoKKwkgKiBTZXQgb25seSBpZiB0aGUgY2xpZW50IGFscmVhZHkgaGFzIGFuIElQIGFkZHJlc3MuCisJICovCisJSVA0X3QgY2lwOworCS8qKiBZb3VyIElQIGFkZHJlc3MKKwkgKgorCSAqIFRoaXMgaXMgdGhlIElQIGFkZHJlc3MgdGhhdCB0aGUgc2VydmVyIGFzc2lnbnMgdG8gdGhlCisJICogY2xpZW50LgorCSAqLworCUlQNF90IHlpcDsKKwkvKiogU2VydmVyIElQIGFkZHJlc3MKKwkgKgorCSAqIFRoaXMgaXMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIEJPT1RQL0RIQ1Agc2VydmVyLgorCSAqLworCUlQNF90IHNpcDsKKwkvKiogR2F0ZXdheSBJUCBhZGRyZXNzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBCT09UUC9ESENQIHJlbGF5IGFnZW50LCBpZgorCSAqIGFueS4gIEl0IGlzIEBiIG5vdCAobmVjZXNzYXJpbHkpIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWZhdWx0CisJICogZ2F0ZXdheSBmb3Igcm91dGluZyBwdXJwb3Nlcy4KKwkgKi8KKwlJUDRfdCBnaXA7CisJTUFDX0FERFJfdCBDQWRkcjsJCS8qKjwgQ2xpZW50IE1BQyBhZGRyZXNzICovCisJVUlOVDhfdCBTbmFtZVs2NF07CQkvKio8IFNlcnZlciBob3N0IG5hbWUgKi8KKwlVSU5UOF90IGJvb3RmaWxlWzEyOF07CQkvKio8IEJvb3QgZmlsZSBuYW1lICovCisJLyoqIERIQ1Agb3B0aW9ucworCSAqCisJICogRG9uJ3QgYXNrLiAgSnVzdCBsYXVnaC4gIFRoZW4gYnVybiBhIGNvcHkgb2YgdGhlIFBYRQorCSAqIHNwZWNpZmljYXRpb24gYW5kIHNlbmQgSW50ZWwgYW4gZS1tYWlsIGFza2luZyB0aGVtIGlmCisJICogdGhleSd2ZSBmaWd1cmVkIG91dCB3aGF0IGEgInVuaW9uIiBkb2VzIGluIEMgeWV0LgorCSAqLworCXVuaW9uIGJvb3RwaF92ZW5kb3IgeworCQlVSU5UOF90IGRbQk9PVFBfREhDUFZFTkRdOyAvKio8IERIQ1Agb3B0aW9ucyAqLworCQkvKiogREhDUCBvcHRpb25zICovCisJCXN0cnVjdCBib290cGhfdmVuZG9yX3YgeworCQkJLyoqIERIQ1AgbWFnaWMgY29va2llCisJCQkgKgorCQkJICogU2hvdWxkIGhhdmUgdGhlIHZhbHVlICNWTV9SRkMxMDQ4LgorCQkJICovCisJCQlVSU5UOF90IG1hZ2ljWzRdOworCQkJVUlOVDMyX3QgZmxhZ3M7CS8qKjwgQk9PVFAgZmxhZ3Mvb3Bjb2RlcyAqLworCQkJLyoqICJFbmQgb2YgQk9PVFAgdmVuZG9yIGV4dGVuc2lvbnMiCisJCQkgKgorCQkJICogQWJhbmRvbiBob3BlLCBhbGwgeWUgd2hvIGNvbnNpZGVyIHRoZQorCQkJICogcHVycG9zZSBvZiB0aGlzIGZpZWxkLgorCQkJICovCisJCQlVSU5UOF90IHBhZFs1Nl07CisJCX0gdjsKKwl9IHZlbmRvcjsKK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBib290cGggQk9PVFBMQVlFUl90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X2dldF9jYWNoZWRfaW5mbyAoIHN0cnVjdCBzX1BYRU5WX0dFVF9DQUNIRURfSU5GTworCQkJCQkgICAgKmdldF9jYWNoZWRfaW5mbyApOworCisvKiogQH0gKi8gLyogcHhlbnZfZ2V0X2NhY2hlZF9pbmZvICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfcmVzdGFydF90ZnRwIFBYRU5WX1JFU1RBUlRfVEZUUAorICoKKyAqICBSRVNUQVJUIFRGVFAKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl9yZXN0YXJ0X3RmdHAoKSAqLworI2RlZmluZQlQWEVOVl9SRVNUQVJUX1RGVFAJCTB4MDA3MworCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl9yZXN0YXJ0X3RmdHAoKSAqLworc3RydWN0IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEU7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfUkVTVEFSVF9URlRQIFBYRU5WX1JFU1RBUlRfVEZUUF90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3Jlc3RhcnRfdGZ0cCAoIHN0cnVjdCBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFCisJCQkJCSAqcmVzdGFydF90ZnRwICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl9yZXN0YXJ0X3RmdHAgKi8KKworLyoqIEBkZWZncm91cCBweGVudl9zdGFydF91bmRpIFBYRU5WX1NUQVJUX1VOREkKKyAqCisgKiAgU1RBUlQgVU5ESQorICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3N0YXJ0X3VuZGkoKSAqLworI2RlZmluZQlQWEVOVl9TVEFSVF9VTkRJCQkweDAwMDAKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfc3RhcnRfdW5kaSgpICovCitzdHJ1Y3Qgc19QWEVOVl9TVEFSVF9VTkRJIHsKKwlQWEVOVl9TVEFUVVNfdCBTdGF0dXM7CQkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwkvKiogJWF4IHJlZ2lzdGVyIGFzIHBhc3NlZCB0byB0aGUgT3B0aW9uIFJPTSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLgorCSAqCisJICogRm9yIGEgUENJIGRldmljZSwgdGhpcyBzaG91bGQgY29udGFpbiB0aGUgYnVzOmRldjpmbiB2YWx1ZQorCSAqIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgUENJIGRldmljZSBpbiB0aGUgc3lzdGVtLiAgRm9yCisJICogYSBub24tUENJIGRldmljZSwgdGhpcyBmaWVsZCBpcyBub3QgZGVmaW5lZC4KKwkgKi8KKwlVSU5UMTZfdCBBWDsKKwkvKiogJWJ4IHJlZ2lzdGVyIGFzIHBhc3NlZCB0byB0aGUgT3B0aW9uIFJPTSBpbml0aWFsaXNhdGlvbiByb3V0aW5lLgorCSAqCisJICogRm9yIGFuIElTQVBuUCBkZXZpY2UsIHRoaXMgc2hvdWxkIGNvbnRhaW4gdGhlIENhcmQgU2VsZWN0CisJICogTnVtYmVyIGFzc2lnbmVkIHRvIHRoZSBJU0FQblAgY2FyZC4gIEZvciBub24tSVNBUG5QCisJICogZGV2aWNlcywgdGhpcyBzaG91bGQgY29udGFpbiAweGZmZmYuCisJICovCisJVUlOVDE2X3QgQlg7CisJLyoqICVkeCByZWdpc3RlciBhcyBwYXNzZWQgdG8gdGhlIE9wdGlvbiBST00gaW5pdGlhbGlzYXRpb24gcm91dGluZS4KKwkgKgorCSAqIEZvciBhbiBJU0FQblAgZGV2aWNlLCB0aGlzIHNob3VsZCBjb250YWluIHRoZSBJU0FQblAgUmVhZAorCSAqIFBvcnQgYWRkcmVzcyBhcyBjdXJyZW50bHkgc2V0IGluIGFsbCBJU0FQblAgY2FyZHMuICBJZgorCSAqIHRoZXJlIGFyZSBubyBJU0FQblAgY2FyZHMsIHRoaXMgc2hvdWxkIGNvbnRhaW4gMHhmZmZmLiAgKElmCisJICogdGhpcyBpcyBhIG5vbi1JU0FQblAgZGV2aWNlLCBidXQgdGhlcmUgYXJlIElTQVBuUCBjYXJkcyBpbgorCSAqIHRoZSBzeXN0ZW0sIHRoaXMgdmFsdWUgaXMgbm90IHdlbGwgZGVmaW5lZC4pCisJICovCisJVUlOVDE2X3QgRFg7CisJLyoqICVkaSByZWdpc3RlciBhcyBwYXNzZWQgdG8gdGhlIE9wdGlvbiBST00gaW5pdGlhbGlzYXRpb24gcm91dGluZS4KKwkgKgorCSAqIFRoaXMgY29udGFpbnMgdGhlICNPRkYxNl90IHBvcnRpb24gb2YgYSBzdHJ1Y3QgI3NfU0VHT0ZGMTYKKwkgKiB0aGF0IHBvaW50cyB0byB0aGUgU3lzdGVtIEJJT1MgUGx1ZyBhbmQgUGxheSBJbnN0YWxsYXRpb24KKwkgKiBDaGVjayBTdHJ1Y3R1cmUuICAoUmVmZXIgdG8gc2VjdGlvbiA0LjQgb2YgdGhlIFBsdWcgYW5kCisJICogUGxheSBCSU9TIHNwZWNpZmljYXRpb24gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhpcworCSAqIHN0cnVjdHVyZS4pCisJICoKKwkgKiBAbm90ZSBUaGUgUFhFIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkCisJICogYXMgI1VJTlQxNl90LiAgRm9yIHg4NiwgI09GRjE2X3QgYW5kICNVSU5UMTZfdCBhcmUKKwkgKiBlcXVpdmFsZW50IGFueXdheTsgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgI09GRjE2X3QgbWFrZXMKKwkgKiBtb3JlIHNlbnNlLgorCSAqLworCU9GRjE2X3QgREk7CisJLyoqICVlcyByZWdpc3RlciBhcyBwYXNzZWQgdG8gdGhlIE9wdGlvbiBST00gaW5pdGlhbGlzYXRpb24gcm91dGluZS4KKwkgKgorCSAqIFRoaXMgY29udGFpbnMgdGhlICNTRUdTRUxfdCBwb3J0aW9uIG9mIGEgc3RydWN0ICNzX1NFR09GRjE2CisJICogdGhhdCBwb2ludHMgdG8gdGhlIFN5c3RlbSBCSU9TIFBsdWcgYW5kIFBsYXkgSW5zdGFsbGF0aW9uCisJICogQ2hlY2sgU3RydWN0dXJlLiAgKFJlZmVyIHRvIHNlY3Rpb24gNC40IG9mIHRoZSBQbHVnIGFuZAorCSAqIFBsYXkgQklPUyBzcGVjaWZpY2F0aW9uIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoaXMKKwkgKiBzdHJ1Y3R1cmUuKQorCSAqCisJICogQG5vdGUgVGhlIFBYRSBzcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorCSAqIGFzICNVSU5UMTZfdC4gIEZvciB4ODYsICNTRUdTRUxfdCBhbmQgI1VJTlQxNl90IGFyZQorCSAqIGVxdWl2YWxlbnQgYW55d2F5OyBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyAjU0VHU0VMX3QgbWFrZXMKKwkgKiBtb3JlIHNlbnNlLgorCSAqLworCVNFR1NFTF90IEVTOworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfU1RBUlRfVU5ESSBQWEVOVl9TVEFSVF9VTkRJX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfc3RhcnRfdW5kaSAoIHN0cnVjdCBzX1BYRU5WX1NUQVJUX1VOREkgKnN0YXJ0X3VuZGkgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3N0YXJ0X3VuZGkgKi8KKworLyoqIEBkZWZncm91cCBweGVudl9zdG9wX3VuZGkgUFhFTlZfU1RPUF9VTkRJCisgKgorICogIFNUT1AgVU5ESQorICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3N0b3BfdW5kaSgpICovCisjZGVmaW5lCVBYRU5WX1NUT1BfVU5ESQkJCTB4MDAxNQorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl9zdG9wX3VuZGkoKSAqLworc3RydWN0IHNfUFhFTlZfU1RPUF9VTkRJIHsKKwlQWEVOVl9TVEFUVVNfdCBTdGF0dXM7CQkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1NUT1BfVU5ESSBQWEVOVl9TVE9QX1VORElfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl9zdG9wX3VuZGkgKCBzdHJ1Y3Qgc19QWEVOVl9TVE9QX1VOREkgKnN0b3BfdW5kaSApOworCisvKiogQH0gKi8gLyogcHhlbnZfc3RvcF91bmRpICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfc3RhcnRfYmFzZSBQWEVOVl9TVEFSVF9CQVNFCisgKgorICogIFNUQVJUIEJBU0UKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl9zdGFydF9iYXNlKCkgKi8KKyNkZWZpbmUJUFhFTlZfU1RBUlRfQkFTRQkJMHgwMDc1CisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X3N0YXJ0X2Jhc2UoKSAqLworc3RydWN0IHNfUFhFTlZfU1RBUlRfQkFTRSB7CisJUFhFTlZfU1RBVFVTX3QgU3RhdHVzOwkJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9TVEFSVF9CQVNFIFBYRU5WX1NUQVJUX0JBU0VfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl9zdGFydF9iYXNlICggc3RydWN0IHNfUFhFTlZfU1RBUlRfQkFTRSAqc3RhcnRfYmFzZSApOworCisvKiogQH0gKi8gLyogcHhlbnZfc3RhcnRfYmFzZSAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3N0b3BfYmFzZSBQWEVOVl9TVE9QX0JBU0UKKyAqCisgKiAgU1RPUCBCQVNFCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfc3RvcF9iYXNlKCkgKi8KKyNkZWZpbmUJUFhFTlZfU1RPUF9CQVNFCQkJMHgwMDc2CisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X3N0b3BfYmFzZSgpICovCitzdHJ1Y3Qgc19QWEVOVl9TVE9QX0JBU0UgeworCVBYRU5WX1NUQVRVU190IFN0YXR1czsJCQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfU1RPUF9CQVNFIFBYRU5WX1NUT1BfQkFTRV90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3N0b3BfYmFzZSAoIHN0cnVjdCBzX1BYRU5WX1NUT1BfQkFTRSAqc3RvcF9iYXNlICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl9zdG9wX2Jhc2UgKi8KKworLyoqIEB9ICovIC8qIHB4ZV9wcmVib290X2FwaSAqLworCisvKiogQGRlZmdyb3VwIHB4ZV90ZnRwX2FwaSBQWEUgVEZUUCBBUEkKKyAqCisgKiBEb3dubG9hZCBmaWxlcyB2aWEgVEZUUCBvciBNVEZUUAorICoKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBweGVudl90ZnRwX29wZW4gUFhFTlZfVEZUUF9PUEVOCisgKgorICogIFRGVFAgT1BFTgorICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3RmdHBfb3BlbigpICovCisjZGVmaW5lCVBYRU5WX1RGVFBfT1BFTgkJCTB4MDAyMAorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl90ZnRwX29wZW4oKSAqLworc3RydWN0IHNfUFhFTlZfVEZUUF9PUEVOIHsKKwlQWEVOVl9TVEFUVVNfdCBTdGF0dXM7CQkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwlJUDRfdCBTZXJ2ZXJJUEFkZHJlc3M7CQkJLyoqPCBURlRQIHNlcnZlciBJUCBhZGRyZXNzICovCisJSVA0X3QgR2F0ZXdheUlQQWRkcmVzczsJCQkvKio8IFJlbGF5IGFnZW50IElQIGFkZHJlc3MgKi8KKwlVSU5UOF90IEZpbGVOYW1lWzEyOF07CQkJLyoqPCBGaWxlIG5hbWUgKi8KKwlVRFBfUE9SVF90IFRGVFBQb3J0OwkJCS8qKjwgVEZUUCBzZXJ2ZXIgVURQIHBvcnQgKi8KKwkvKiogUmVxdWVzdGVkIHNpemUgb2YgVEZUUCBwYWNrZXRzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBURlRQICJibGtzaXplIiBvcHRpb24uICBUaGlzIG11c3QgYmUgYXQgbGVhc3QKKwkgKiA1MTIsIHNpbmNlIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBURlRQIG9wdGlvbnMgY2Fubm90CisJICogbmVnb3RpYXRlIGJsb2Nrc2l6ZXMgc21hbGxlciB0aGFuIHRoaXMuCisJICovCisJVUlOVDE2X3QgUGFja2V0U2l6ZTsKK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1RGVFBfT1BFTiBQWEVOVl9URlRQX09QRU5fdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl90ZnRwX29wZW4gKCBzdHJ1Y3Qgc19QWEVOVl9URlRQX09QRU4gKnRmdHBfb3BlbiApOworCisvKiogQH0gKi8gLyogcHhlbnZfdGZ0cF9vcGVuICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdGZ0cF9jbG9zZSBQWEVOVl9URlRQX0NMT1NFCisgKgorICogIFRGVFAgQ0xPU0UKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl90ZnRwX2Nsb3NlKCkgKi8KKyNkZWZpbmUJUFhFTlZfVEZUUF9DTE9TRQkJMHgwMDIxCisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X3RmdHBfY2xvc2UoKSAqLworc3RydWN0IHNfUFhFTlZfVEZUUF9DTE9TRSB7CisJUFhFTlZfU1RBVFVTX3QgU3RhdHVzOwkJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9URlRQX0NMT1NFIFBYRU5WX1RGVFBfQ0xPU0VfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl90ZnRwX2Nsb3NlICggc3RydWN0IHNfUFhFTlZfVEZUUF9DTE9TRSAqdGZ0cF9jbG9zZSApOworCisvKiogQH0gKi8gLyogcHhlbnZfdGZ0cF9jbG9zZSAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3RmdHBfcmVhZCBQWEVOVl9URlRQX1JFQUQKKyAqCisgKiAgVEZUUCBSRUFECisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdGZ0cF9yZWFkKCkgKi8KKyNkZWZpbmUJUFhFTlZfVEZUUF9SRUFECQkJMHgwMDIyCisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X3RmdHBfcmVhZCgpICovCitzdHJ1Y3Qgc19QWEVOVl9URlRQX1JFQUQgeworCVBYRU5WX1NUQVRVU190IFN0YXR1czsJCQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCVVJTlQxNl90IFBhY2tldE51bWJlcjsJCQkvKio8IFRGVFAgcGFja2V0IG51bWJlciAqLworCVVJTlQxNl90IEJ1ZmZlclNpemU7CQkJLyoqPCBTaXplIG9mIGRhdGEgYnVmZmVyICovCisJU0VHT0ZGMTZfdCBCdWZmZXI7CQkJLyoqPCBBZGRyZXNzIG9mIGRhdGEgYnVmZmVyICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9URlRQX1JFQUQgUFhFTlZfVEZUUF9SRUFEX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdGZ0cF9yZWFkICggc3RydWN0IHNfUFhFTlZfVEZUUF9SRUFEICp0ZnRwX3JlYWQgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3RmdHBfcmVhZCAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3RmdHBfcmVhZF9maWxlIFBYRU5WX1RGVFBfUkVBRF9GSUxFCisgKgorICogIFRGVFAvTVRGVFAgUkVBRCBGSUxFCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdGZ0cF9yZWFkX2ZpbGUoKSAqLworI2RlZmluZQlQWEVOVl9URlRQX1JFQURfRklMRQkJMHgwMDIzCisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X3RmdHBfcmVhZF9maWxlKCkgKi8KK3N0cnVjdCBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFIHsKKwlQWEVOVl9TVEFUVVNfdCBTdGF0dXM7CQkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwlVSU5UOF90IEZpbGVOYW1lWzEyOF07CQkJLyoqPCBGaWxlIG5hbWUgKi8KKwlVSU5UMzJfdCBCdWZmZXJTaXplOwkJCS8qKjwgU2l6ZSBvZiBkYXRhIGJ1ZmZlciAqLworCUFERFIzMl90IEJ1ZmZlcjsJCQkvKio8IEFkZHJlc3Mgb2YgZGF0YSBidWZmZXIgKi8KKwlJUDRfdCBTZXJ2ZXJJUEFkZHJlc3M7CQkJLyoqPCBURlRQIHNlcnZlciBJUCBhZGRyZXNzICovCisJSVA0X3QgR2F0ZXdheUlQQWRkcmVzczsJCQkvKio8IFJlbGF5IGFnZW50IElQIGFkZHJlc3MgKi8KKwkvKiogRmlsZSBtdWx0aWNhc3QgSVAgYWRkcmVzcyAqLworCUlQNF90IE1jYXN0SVBBZGRyZXNzOworCS8qKiBDbGllbnQgbXVsdGljYXN0IGxpc3RlbmluZyBwb3J0ICovCisJVURQX1BPUlRfdCBURlRQQ2xudFBvcnQ7CisJLyoqIFNlcnZlciBtdWx0aWNhc3QgbGlzdGVuaW5nIHBvcnQgKi8KKwlVRFBfUE9SVF90IFRGVFBTcnZQb3J0OworCS8qKiBURlRQIG9wZW4gdGltZW91dC4KKwkgKgorCSAqIFRoaXMgaXMgdGhlIHRpbWVvdXQgZm9yIHJlY2VpdmluZyB0aGUgZmlyc3QgREFUQSBvciBBQ0sKKwkgKiBwYWNrZXRzIGR1cmluZyB0aGUgTVRGVFAgTGlzdGVuIHBoYXNlLgorCSAqLworCVVJTlQxNl90IFRGVFBPcGVuVGltZU91dDsKKwkvKiogVEZUUCByZW9wZW4gdGltZW91dC4KKwkgKgorCSAqIFRoaXMgaXMgdGhlIHRpbWVvdXQgZm9yIHJlY2VpdmluZyBhbiBBQ0sgcGFja2V0IHdoaWxlIGluCisJICogdGhlIE1URlRQIExpc3RlbiBwaGFzZSAod2hlbiBhdCBsZWFzdCBvbmUgQUNLIHBhY2tldCBoYXMKKwkgKiBhbHJlYWR5IGJlZW4gc2VlbikuCisJICovCisJVUlOVDE2X3QgVEZUUFJlb3BlbkRlbGF5OworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEUgUFhFTlZfVEZUUF9SRUFEX0ZJTEVfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl90ZnRwX3JlYWRfZmlsZSAoIHN0cnVjdCBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFCisJCQkJCSAgICp0ZnRwX3JlYWRfZmlsZSApOworCisvKiogQH0gKi8gLyogcHhlbnZfdGZ0cF9yZWFkX2ZpbGUgKi8KKworLyoqIEBkZWZncm91cCBweGVudl90ZnRwX2dldF9mc2l6ZSBQWEVOVl9URlRQX0dFVF9GU0laRQorICoKKyAqICBURlRQIEdFVCBGSUxFIFNJWkUKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl90ZnRwX2dldF9mc2l6ZSgpICovCisjZGVmaW5lCVBYRU5WX1RGVFBfR0VUX0ZTSVpFCQkweDAwMjUKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdGZ0cF9nZXRfZnNpemUoKSAqLworc3RydWN0IHNfUFhFTlZfVEZUUF9HRVRfRlNJWkUgeworCVBYRU5WX1NUQVRVU190IFN0YXR1czsJCQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCUlQNF90IFNlcnZlcklQQWRkcmVzczsJCQkvKio8IFRGVFAgc2VydmVyIElQIGFkZHJlc3MgKi8KKwlJUDRfdCBHYXRld2F5SVBBZGRyZXNzOwkJCS8qKjwgUmVsYXkgYWdlbnQgSVAgYWRkcmVzcyAqLworCVVJTlQ4X3QgRmlsZU5hbWVbMTI4XTsJCQkvKio8IEZpbGUgbmFtZSAqLworCVVJTlQzMl90IEZpbGVTaXplOwkJCS8qKjwgU2l6ZSBvZiB0aGUgZmlsZSAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVEZUUF9HRVRfRlNJWkUgUFhFTlZfVEZUUF9HRVRfRlNJWkVfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl90ZnRwX2dldF9mc2l6ZSAoIHN0cnVjdCBzX1BYRU5WX1RGVFBfR0VUX0ZTSVpFCisJCQkJCSAgICpnZXRfZnNpemUgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3RmdHBfZ2V0X2ZzaXplICovCisKKy8qKiBAfSAqLyAvKiBweGVfdGZ0cF9hcGkgKi8KKworLyoqIEBkZWZncm91cCBweGVfdWRwX2FwaSBQWEUgVURQIEFQSQorICoKKyAqIFRyYW5zbWl0IGFuZCByZWNlaXZlIFVEUCBwYWNrZXRzCisgKgorICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VkcF9vcGVuIFBYRU5WX1VEUF9PUEVOCisgKgorICogIFVEUCBPUEVOCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdWRwX29wZW4oKSAqLworI2RlZmluZQlQWEVOVl9VRFBfT1BFTgkJCTB4MDAzMAorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91ZHBfb3BlbigpICovCitzdHJ1Y3Qgc19QWEVOVl9VRFBfT1BFTiB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwlJUDRfdAkJc3JjX2lwOwkJLyoqPCBJUCBhZGRyZXNzIG9mIHRoaXMgc3RhdGlvbiAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVURQX09QRU4gUFhFTlZfVURQX09QRU5fdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl91ZHBfb3BlbiAoIHN0cnVjdCBzX1BYRU5WX1VEUF9PUEVOICp1ZHBfb3BlbiApOworCisvKiogQH0gKi8gLyogcHhlbnZfdWRwX29wZW4gKi8KKworLyoqIEBkZWZncm91cCBweGVudl91ZHBfY2xvc2UgUFhFTlZfVURQX0NMT1NFCisgKgorICogIFVEUCBDTE9TRQorICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3VkcF9jbG9zZSgpICovCisjZGVmaW5lCVBYRU5WX1VEUF9DTE9TRQkJCTB4MDAzMQorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91ZHBfY2xvc2UoKSAqLworc3RydWN0IHNfUFhFTlZfVURQX0NMT1NFIHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVURQX0NMT1NFIFBYRU5WX1VEUF9DTE9TRV90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VkcF9jbG9zZSAoIHN0cnVjdCBzX1BYRU5WX1VEUF9DTE9TRSAqdWRwX2Nsb3NlICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl91ZHBfY2xvc2UgKi8KKworLyoqIEBkZWZncm91cCBweGVudl91ZHBfd3JpdGUgUFhFTlZfVURQX1dSSVRFCisgKgorICogIFVEUCBXUklURQorICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3VkcF93cml0ZSgpICovCisjZGVmaW5lCVBYRU5WX1VEUF9XUklURQkJCTB4MDAzMworCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91ZHBfd3JpdGUoKSAqLworc3RydWN0IHNfUFhFTlZfVURQX1dSSVRFIHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCUlQNF90CQlpcDsJCS8qKjwgRGVzdGluYXRpb24gSVAgYWRkcmVzcyAqLworCUlQNF90CQlndzsJCS8qKjwgUmVsYXkgYWdlbnQgSVAgYWRkcmVzcyAqLworCVVEUF9QT1JUX3QJc3JjX3BvcnQ7CS8qKjwgU291cmNlIFVEUCBwb3J0ICovCisJVURQX1BPUlRfdAlkc3RfcG9ydDsJLyoqPCBEZXN0aW5hdGlvbiBVRFAgcG9ydCAqLworCVVJTlQxNl90CWJ1ZmZlcl9zaXplOwkvKio8IFVEUCBwYXlsb2FkIGJ1ZmZlciBzaXplICovCisJU0VHT0ZGMTZfdAlidWZmZXI7CQkvKio8IFVEUCBwYXlsb2FkIGJ1ZmZlciBhZGRyZXNzICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VRFBfV1JJVEUgUFhFTlZfVURQX1dSSVRFX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdWRwX3dyaXRlICggc3RydWN0IHNfUFhFTlZfVURQX1dSSVRFICp1ZHBfd3JpdGUgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3VkcF93cml0ZSAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VkcF9yZWFkIFBYRU5WX1VEUF9SRUFECisgKgorICogIFVEUCBSRUFECisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdWRwX3JlYWQoKSAqLworI2RlZmluZQlQWEVOVl9VRFBfUkVBRAkJCTB4MDAzMgorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91ZHBfcmVhZCgpICovCitzdHJ1Y3Qgc19QWEVOVl9VRFBfUkVBRCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwlJUDRfdAkJc3JjX2lwOwkJLyoqPCBTb3VyY2UgSVAgYWRkcmVzcyAqLworCUlQNF90CQlkZXN0X2lwOwkvKio8IERlc3RpbmF0aW9uIElQIGFkZHJlc3MgKi8KKwlVRFBfUE9SVF90CXNfcG9ydDsJCS8qKjwgU291cmNlIFVEUCBwb3J0ICovCisJVURQX1BPUlRfdAlkX3BvcnQ7CQkvKio8IERlc3RpbmF0aW9uIFVEUCBwb3J0ICovCisJVUlOVDE2X3QJYnVmZmVyX3NpemU7CS8qKjwgVURQIHBheWxvYWQgYnVmZmVyIHNpemUgKi8KKwlTRUdPRkYxNl90CWJ1ZmZlcjsJCS8qKjwgVURQIHBheWxvYWQgYnVmZmVyIGFkZHJlc3MgKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VEUF9SRUFEIFBYRU5WX1VEUF9SRUFEX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdWRwX3JlYWQgKCBzdHJ1Y3Qgc19QWEVOVl9VRFBfUkVBRCAqdWRwX3JlYWQgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3VkcF9yZWFkICovCisKKy8qKiBAfSAqLyAvKiBweGVfdWRwX2FwaSAqLworCisvKiogQGRlZmdyb3VwIHB4ZV91bmRpX2FwaSBQWEUgVU5ESSBBUEkKKyAqCisgKiBEaXJlY3QgY29udHJvbCBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgY2FyZAorICoKKyAqIEB7CisgKi8KKworLyoqIEBkZWZncm91cCBweGVudl91bmRpX3N0YXJ0dXAgUFhFTlZfVU5ESV9TVEFSVFVQCisgKgorICogIFVOREkgU1RBUlRVUAorICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3VuZGlfc3RhcnR1cCgpICovCisjZGVmaW5lCVBYRU5WX1VORElfU1RBUlRVUAkJMHgwMDAxCisKKyNkZWZpbmUgUFhFTlZfQlVTX0lTQQkJMAkvKio8IElTQSBidXMgdHlwZSAqLworI2RlZmluZSBQWEVOVl9CVVNfRUlTQQkJMQkvKio8IEVJU0EgYnVzIHR5cGUgKi8KKyNkZWZpbmUgUFhFTlZfQlVTX01DQQkJMgkvKio8IE1DQSBidXMgdHlwZSAqLworI2RlZmluZSBQWEVOVl9CVVNfUENJCQkzCS8qKjwgUENJIGJ1cyB0eXBlICovCisjZGVmaW5lIFBYRU5WX0JVU19WRVNBCQk0CS8qKjwgVkVTQSBidXMgdHlwZSAqLworI2RlZmluZSBQWEVOVl9CVVNfUENNQ0lBCTUJLyoqPCBQQ01DSUEgYnVzIHR5cGUgKi8KKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5kaV9zdGFydHVwKCkgKi8KK3N0cnVjdCBzX1BYRU5WX1VORElfU1RBUlRVUCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfU1RBUlRVUCBQWEVOVl9VTkRJX1NUQVJUVVBfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl91bmRpX3N0YXJ0dXAgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NUQVJUVVAKKwkJCQkJICp1bmRpX3N0YXJ0dXAgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3VuZGlfc3RhcnR1cCAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VuZGlfY2xlYW51cCBQWEVOVl9VTkRJX0NMRUFOVVAKKyAqCisgKiAgVU5ESSBDTEVBTlVQCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdW5kaV9jbGVhbnVwKCkgKi8KKyNkZWZpbmUJUFhFTlZfVU5ESV9DTEVBTlVQCQkweDAwMDIKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5kaV9jbGVhbnVwKCkgKi8KK3N0cnVjdCBzX1BYRU5WX1VORElfQ0xFQU5VUCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfQ0xFQU5VUCBQWEVOVl9VTkRJX0NMRUFOVVBfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl91bmRpX2NsZWFudXAgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0NMRUFOVVAKKwkJCQkJICp1bmRpX2NsZWFudXAgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3VuZGlfY2xlYW51cCAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VuZGlfaW5pdGlhbGl6ZSBQWEVOVl9VTkRJX0lOSVRJQUxJWkUKKyAqCisgKiAgVU5ESSBJTklUSUFMSVpFCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdW5kaV9pbml0aWFsaXplKCkgKi8KKyNkZWZpbmUJUFhFTlZfVU5ESV9JTklUSUFMSVpFCQkweDAwMDMKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5kaV9pbml0aWFsaXplKCkgKi8KK3N0cnVjdCBzX1BYRU5WX1VORElfSU5JVElBTElaRSB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwkvKiogTkRJUyAyLjAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiwgb3IgTlVMTAorCSAqCisJICogVGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgc3RydWN0dXJlIHJldHVybmVkIGJ5IHRoZQorCSAqIE5ESVMgMi4wIEdldFByb3RvY29sTWFuYWdlckluZm8oKSBBUEkgY2FsbC4gIFRoZSBkYXRhCisJICogc3RydWN0dXJlIGlzIGRvY3VtZW50ZWQsIGluIGEgcmF0aGVyIGhhcGhhemFyZCB3YXksIGluCisJICogc2VjdGlvbiA0LTE3IG9mIHRoZSBORElTIDIuMCBzcGVjaWZpY2F0aW9uLgorCSAqLworCUFERFIzMl90IFByb3RvY29sSW5pOworCVVJTlQ4X3QgcmVzZXJ2ZWRbOF07CQkvKio8IE11c3QgYmUgemVybyAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9JTklUSUFMSVpFIFBYRU5WX1VORElfSU5JVElBTElaRV90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfaW5pdGlhbGl6ZSAoIHN0cnVjdCBzX1BYRU5WX1VORElfSU5JVElBTElaRQorCQkJCQkgICAgKnVuZGlfaW5pdGlhbGl6ZSApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5kaV9pbml0aWFsaXplICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV9yZXNldF9hZGFwdGVyIFBYRU5WX1VORElfUkVTRVRfQURBUFRFUgorICoKKyAqICBVTkRJIFJFU0VUIEFEQVBURVIKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmRpX3Jlc2V0X2FkYXB0ZXIoKSAqLworI2RlZmluZQlQWEVOVl9VTkRJX1JFU0VUX0FEQVBURVIJMHgwMDA0CisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgTUFDIGFkZHJlc3NlcyAqLworI2RlZmluZSBNQVhOVU1fTUNBRERSCTgKKworLyoqIExpc3Qgb2YgbXVsdGljYXN0IE1BQyBhZGRyZXNzZXMgKi8KK3N0cnVjdCBzX1BYRU5WX1VORElfTUNBU1RfQUREUkVTUyB7CisJLyoqIE51bWJlciBvZiBtdWx0aWNhc3QgTUFDIGFkZHJlc3NlcyAqLworCVVJTlQxNl90IE1DYXN0QWRkckNvdW50OworCS8qKiBMaXN0IG9mIHVwIHRvICNNQVhOVU1fTUNBRERSIG11bHRpY2FzdCBNQUMgYWRkcmVzc2VzICovCisJTUFDX0FERFJfdCBNY2FzdEFkZHJbTUFYTlVNX01DQUREUl07Cit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX01DQVNUX0FERFJFU1MgUFhFTlZfVU5ESV9NQ0FTVF9BRERSRVNTX3Q7CisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X3VuZGlfcmVzZXRfYWRhcHRlcigpICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX1JFU0VUIHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCS8qKiBNdWx0aWNhc3QgTUFDIGFkZHJlc3NlcyAqLworCXN0cnVjdCBzX1BYRU5WX1VORElfTUNBU1RfQUREUkVTUyBSX01jYXN0X0J1ZjsKK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfUkVTRVQgUFhFTlZfVU5ESV9SRVNFVF90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfcmVzZXRfYWRhcHRlciAoIHN0cnVjdCBzX1BYRU5WX1VORElfUkVTRVQKKwkJCQkJICAgICAgICp1bmRpX3Jlc2V0X2FkYXB0ZXIgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3VuZGlfcmVzZXRfYWRhcHRlciAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VuZGlfc2h1dGRvd24gUFhFTlZfVU5ESV9TSFVURE9XTgorICoKKyAqICBVTkRJIFNIVVRET1dOCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdW5kaV9zaHV0ZG93bigpICovCisjZGVmaW5lCVBYRU5WX1VORElfU0hVVERPV04JCTB4MDAwNQorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmRpX3NodXRkb3duKCkgKi8KK3N0cnVjdCBzX1BYRU5WX1VORElfU0hVVERPV04geworCVBYRU5WX1NUQVRVU190CVN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NIVVRET1dOIFBYRU5WX1VORElfU0hVVERPV05fdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl91bmRpX3NodXRkb3duICggc3RydWN0IHNfUFhFTlZfVU5ESV9TSFVURE9XTgorCQkJCQkgICp1bmRpX3NodXRkb3duICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl91bmRpX3NodXRkb3duICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV9vcGVuIFBYRU5WX1VORElfT1BFTgorICoKKyAqICBVTkRJIE9QRU4KKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmRpX29wZW4oKSAqLworI2RlZmluZQlQWEVOVl9VTkRJX09QRU4JCQkweDAwMDYKKworLyoqIEFjY2VwdCAiZGlyZWN0ZWQiIHBhY2tldHMKKyAqCisgKiBUaGVzZSBhcmUgcGFja2V0cyBhZGRyZXNzZXMgdG8gZWl0aGVyIHRoaXMgYWRhcHRlcidzIE1BQyBhZGRyZXNzIG9yCisgKiB0byBhbnkgb2YgdGhlIGNvbmZpZ3VyZWQgbXVsdGljYXN0IE1BQyBhZGRyZXNzZXMgKHNlZQorICogI3NfUFhFTlZfVU5ESV9NQ0FTVF9BRERSRVNTKS4KKyAqLworI2RlZmluZSBGTFRSX0RJUkVDVEVECTB4MDAwMQorLyoqIEFjY2VwdCBicm9hZGNhc3QgcGFja2V0cyAqLworI2RlZmluZSBGTFRSX0JSRENTVAkweDAwMDIKKy8qKiBBY2NlcHQgYWxsIHBhY2tldHM7IGxpc3RlbiBpbiBwcm9taXNjdW91cyBtb2RlICovCisjZGVmaW5lIEZMVFJfUFJNU0NTCTB4MDAwNAorLyoqIEFjY2VwdCBzb3VyY2Utcm91dGVkIHBhY2tldHMgKi8KKyNkZWZpbmUgRkxUUl9TUkNfUlRHCTB4MDAwOAorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmRpX29wZW4oKSAqLworc3RydWN0IHNfUFhFTlZfVU5ESV9PUEVOIHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCS8qKiBPcGVuIGZsYWdzIGFzIGRlZmluZWQgaW4gTkRJUyAyLjAKKwkgKgorCSAqIFRoaXMgaXMgdGhlIE9wZW5PcHRpb25zIGZpZWxkIGFzIHBhc3NlZCB0byB0aGUgTkRJUyAyLjAKKwkgKiBPcGVuQWRhcHRlcigpIEFQSSBjYWxsLiAgSXQgaXMgZGVmaW5lZCB0byBiZSAiYWRhcHRlcgorCSAqIHNwZWNpZmljIiwgdGhvdWdoIDAgaXMgZ3VhcmFudGVlZCB0byBiZSBhIHZhbGlkIHZhbHVlLgorCSAqLworCVVJTlQxNl90IE9wZW5GbGFnOworCS8qKiBSZWNlaXZlIHBhY2tldCBmaWx0ZXIKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGJpdHdpc2UtT1Igb2YgYW55IG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisJICogI0ZMVFJfRElSRUNURUQsICNGTFRSX0JSRENTVCwgI0ZMVFJfUFJNU0NTIGFuZAorCSAqICNGTFRSX1NSQ19SVEcuCisJICovCisJVUlOVDE2X3QgUGt0RmlsdGVyOworCS8qKiBNdWx0aWNhc3QgTUFDIGFkZHJlc3NlcyAqLworCXN0cnVjdCBzX1BYRU5WX1VORElfTUNBU1RfQUREUkVTUyBSX01jYXN0X0J1ZjsKK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfT1BFTiBQWEVOVl9VTkRJX09QRU5fdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl91bmRpX29wZW4gKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX09QRU4gKnVuZGlfb3BlbiApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5kaV9vcGVuICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV9jbG9zZSBQWEVOVl9VTkRJX0NMT1NFCisgKgorICogIFVOREkgQ0xPU0UKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmRpX2Nsb3NlKCkgKi8KKyNkZWZpbmUJUFhFTlZfVU5ESV9DTE9TRQkJMHgwMDA3CisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X3VuZGlfY2xvc2UoKSAqLworc3RydWN0IHNfUFhFTlZfVU5ESV9DTE9TRSB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfQ0xPU0UgUFhFTlZfVU5ESV9DTE9TRV90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfY2xvc2UgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0NMT1NFICp1bmRpX2Nsb3NlICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl91bmRpX2Nsb3NlICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV90cmFuc21pdCBQWEVOVl9VTkRJX1RSQU5TTUlUCisgKgorICogIFVOREkgVFJBTlNNSVQgUEFDS0VUCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdW5kaV90cmFuc21pdCgpICovCisjZGVmaW5lCVBYRU5WX1VORElfVFJBTlNNSVQJCTB4MDAwOAorCisjZGVmaW5lIFBfVU5LTk9XTgkwCQkvKio8IE1lZGlhIGhlYWRlciBhbHJlYWR5IGZpbGxlZCBpbiAqLworI2RlZmluZSBQX0lQCQkxCQkvKio8IElQIHByb3RvY29sICovCisjZGVmaW5lIFBfQVJQCQkyCQkvKio8IEFSUCBwcm90b2NvbCAqLworI2RlZmluZSBQX1JBUlAJCTMJCS8qKjwgUkFSUCBwcm90b2NvbCAqLworI2RlZmluZSBQX09USEVSCQk0CQkvKio8IE90aGVyIHByb3RvY29sICovCisKKyNkZWZpbmUgWE1UX0RFU1RBRERSCTB4MDAwMAkJLyoqPCBVbmljYXN0IHBhY2tldCAqLworI2RlZmluZSBYTVRfQlJPQURDQVNUCTB4MDAwMQkJLyoqPCBCcm9hZGNhc3QgcGFja2V0ICovCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiBhIHRyYW5zbWl0IGJ1ZmZlciBkZXNjcmlwdG9yICovCisjZGVmaW5lIE1BWF9EQVRBX0JMS1MJOAorCisvKiogQSB0cmFuc21pdCBidWZmZXIgZGVzY3JpcHRvciwgYXMgcG9pbnRlZCB0byBieSBzX1BYRU5WX1VORElfVFJBTlNNSVQ6OlRCRAorICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX1RCRCB7CisJVUlOVDE2X3QgSW1tZWRMZW5ndGg7CQkvKio8IExlbmd0aCBvZiB0aGUgdHJhbnNtaXQgYnVmZmVyICovCisJU0VHT0ZGMTZfdCBYbWl0OwkJLyoqPCBBZGRyZXNzIG9mIHRoZSB0cmFuc21pdCBidWZmZXIgKi8KKwlVSU5UMTZfdCBEYXRhQmxrQ291bnQ7CisJLyoqIEFycmF5IG9mIHVwIHRvICNNQVhfREFUQV9CTEtTIGFkZGl0aW9uYWwgdHJhbnNtaXQgYnVmZmVycyAqLworCXN0cnVjdCBEYXRhQmxrIHsKKwkJLyoqIEFsd2F5cyAxCisJCSAqCisJCSAqIEEgdmFsdWUgb2YgMCB3b3VsZCBpbmRpY2F0ZSB0aGF0ICNURERhdGFQdHIgd2VyZSBhbgorCQkgKiAjQUREUjMyX3QgcmF0aGVyIHRoYW4gYSAjU0VHT0ZGMTZfdC4gIFRoZSBQWEUKKwkJICogc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDIuMSBleHBsaWNpdGx5IHN0YXRlcyB0aGF0CisJCSAqIHRoaXMgaXMgbm90IHN1cHBvcnRlZDsgI1RERGF0YVB0ciB3aWxsIGFsd2F5cyBiZSBhCisJCSAqICNTRUdPRkYxNl90LgorCQkgKi8KKwkJVUlOVDhfdCBURFB0clR5cGU7CisJCVVJTlQ4X3QgVERSc3ZkQnl0ZTsJLyoqPCBNdXN0IGJlIHplcm8gKi8KKwkJVUlOVDE2X3QgVEREYXRhTGVuOwkvKio8IExlbmd0aCBvZiB0aGlzIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlTRUdPRkYxNl90IFRERGF0YVB0cjsJLyoqPCBBZGRyZXNzIG9mIHRoaXMgdHJhbnNtaXQgYnVmZmVyICovCisJfSBEYXRhQmxvY2tbTUFYX0RBVEFfQkxLU107Cit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1RCRCBQWEVOVl9VTkRJX1RCRF90OworCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmRpX3RyYW5zbWl0KCkgKi8KK3N0cnVjdCBzX1BYRU5WX1VORElfVFJBTlNNSVQgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCisJLyoqIFByb3RvY29sCisJICoKKwkgKiBWYWxpZCB2YWx1ZXMgYXJlICNQX1VOS05PV04sICNQX0lQLCAjUF9BUlAgb3IgI1BfUkFSUC4gIElmCisJICogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBmaWxsZWQgaW4gdGhlIG1lZGlhIGhlYWRlciwgdGhpcworCSAqIGZpZWxkIG11c3QgYmUgc2V0IHRvICNQX1VOS05PV04uCisJICovCisJVUlOVDhfdCBQcm90b2NvbDsKKwkvKiogVW5pY2FzdC9icm9hZGNhc3QgZmxhZworCSAqCisJICogVmFsaWQgdmFsdWVzIGFyZSAjWE1UX0RFU1RBRERSIG9yICNYTVRfQlJPQURDQVNULgorCSAqLworCVVJTlQ4X3QgWG1pdEZsYWc7CisJU0VHT0ZGMTZfdCBEZXN0QWRkcjsJCS8qKjwgRGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KKwkvKiogQWRkcmVzcyBvZiB0aGUgVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IKKwkgKgorCSAqIFRoaXMgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IHNfUFhFTlZfVU5ESV9UQkQuCisJICovCisJU0VHT0ZGMTZfdCBUQkQ7CisJVUlOVDMyX3QgUmVzZXJ2ZWRbMl07CQkvKio8IE11c3QgYmUgemVybyAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9UUkFOU01JVCBQWEVOVl9VTkRJX1RSQU5TTUlUX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV90cmFuc21pdCAoIHN0cnVjdCBzX1BYRU5WX1VORElfVFJBTlNNSVQKKwkJCQkJICAqdW5kaV90cmFuc21pdCApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5kaV90cmFuc21pdCAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VuZGlfc2V0X21jYXN0X2FkZHJlc3MgUFhFTlZfVU5ESV9TRVRfTUNBU1RfQUREUkVTUworICoKKyAqICBVTkRJIFNFVCBNVUxUSUNBU1QgQUREUkVTUworICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3VuZGlfc2V0X21jYXN0X2FkZHJlc3MoKSAqLworI2RlZmluZQlQWEVOVl9VTkRJX1NFVF9NQ0FTVF9BRERSRVNTCTB4MDAwOQorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmRpX3NldF9tY2FzdF9hZGRyZXNzKCkgKi8KK3N0cnVjdCBzX1BYRU5WX1VORElfU0VUX01DQVNUX0FERFJFU1MgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCisJLyoqIExpc3Qgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCXN0cnVjdCBzX1BYRU5WX1VORElfTUNBU1RfQUREUkVTUyBSX01jYXN0X0J1ZjsKK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfU0VUX01DQVNUX0FERFJFU1MgUFhFTlZfVU5ESV9TRVRfTUNBU1RfQUREUkVTU190OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfc2V0X21jYXN0X2FkZHJlc3MgKAorCSAgICAgICBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9NQ0FTVF9BRERSRVNTICp1bmRpX3NldF9tY2FzdF9hZGRyZXNzICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl91bmRpX3NldF9tY2FzdF9hZGRyZXNzICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV9zZXRfc3RhdGlvbl9hZGRyZXNzIFBYRU5WX1VORElfU0VUX1NUQVRJT05fQUREUkVTUworICoKKyAqICBVTkRJIFNFVCBTVEFUSU9OIEFERFJFU1MKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmRpX3NldF9zdGF0aW9uX2FkZHJlc3MoKSAqLworI2RlZmluZQlQWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFJFU1MJMHgwMDBhCisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X3VuZGlfc2V0X3N0YXRpb25fYWRkcmVzcygpICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFJFU1MgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCisJTUFDX0FERFJfdCBTdGF0aW9uQWRkcmVzczsJLyoqPCBTdGF0aW9uIE1BQyBhZGRyZXNzICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFJFU1MgUFhFTlZfVU5ESV9TRVRfU1RBVElPTl9BRERSRVNTX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9zZXRfc3RhdGlvbl9hZGRyZXNzICgKKwkgICBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFJFU1MgKnVuZGlfc2V0X3N0YXRpb25fYWRkcmVzcyApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5kaV9zZXRfc3RhdGlvbl9hZGRyZXNzICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV9zZXRfcGFja2V0X2ZpbHRlciBQWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSCisgKgorICogIFVOREkgU0VUIFBBQ0tFVCBGSUxURVIKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmRpX3NldF9wYWNrZXRfZmlsdGVyKCkgKi8KKyNkZWZpbmUJUFhFTlZfVU5ESV9TRVRfUEFDS0VUX0ZJTFRFUgkweDAwMGIKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5kaV9zZXRfcGFja2V0X2ZpbHRlcigpICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSIHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCS8qKiBSZWNlaXZlIHBhY2tldCBmaWx0ZXIKKwkgKgorCSAqIFRoaXMgZmllbGQgdGFrZXMgdGhlIHNhbWUgdmFsdWVzIGFzCisJICogc19QWEVOVl9VTkRJX09QRU46OlBrdEZpbHRlci4KKwkgKgorCSAqIEBub3RlIFllcywgdGhpcyBmaWVsZCBpcyBhIGRpZmZlcmVudCBzaXplIHRvCisJICogc19QWEVOVl9VTkRJX09QRU46OlBrdEZpbHRlci4gIEJsYW1lICJ0aGUgbWFuYWdlcnMgYXQgSW50ZWwKKwkgKiB3aG8gYXBwYXJlbnRseSBsZXQgYSBjb25zdWx0YW50IGNvbWUgdXAgd2l0aCB0aGUgc3BlYworCSAqIHdpdGhvdXQgYW55IGtpbmQgb2YgYWR1bHQgc3VwZXJ2aXNpb24iIChxdW90ZSBmcm9tIGhwYSkuCisJICovCisJVUlOVDhfdCBmaWx0ZXI7Cit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSIFBYRU5WX1VORElfU0VUX1BBQ0tFVF9GSUxURVJfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl91bmRpX3NldF9wYWNrZXRfZmlsdGVyICgKKwkgICAgICAgc3RydWN0IHNfUFhFTlZfVU5ESV9TRVRfUEFDS0VUX0ZJTFRFUiAqdW5kaV9zZXRfcGFja2V0X2ZpbHRlciApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5kaV9zZXRfcGFja2V0X2ZpbHRlciAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VuZGlfZ2V0X2luZm9ybWF0aW9uIFBYRU5WX1VORElfR0VUX0lORk9STUFUSU9OCisgKgorICogIFVOREkgR0VUIElORk9STUFUSU9OCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdW5kaV9nZXRfaW5mb3JtYXRpb24oKSAqLworI2RlZmluZQlQWEVOVl9VTkRJX0dFVF9JTkZPUk1BVElPTgkweDAwMGMKKworI2RlZmluZSBFVEhFUl9UWVBFCQkxCS8qKjwgRXRoZXJuZXQgKDEwTWIpICovCisjZGVmaW5lIEVYUF9FVEhFUl9UWVBFCQkyCS8qKjwgRXhwZXJpbWVudGFsIEV0aGVybmV0ICgzTWIpICovCisjZGVmaW5lIEFYMjVfVFlQRQkJMwkvKio8IEFtYXRldXIgUmFkaW8gQVguMjUgKi8KKyNkZWZpbmUgVE9LRU5fUklOR19UWVBFCQk0CS8qKjwgUHJvdGVvbiBQcm9ORVQgVG9rZW4gUmluZyAqLworI2RlZmluZSBDSEFPU19UWVBFCQk1CS8qKjwgQ2hhb3MgKi8KKyNkZWZpbmUgSUVFRV9UWVBFCQk2CS8qKjwgSUVFRSA4MDIgTmV0d29ya3MgKi8KKyNkZWZpbmUgQVJDTkVUX1RZUEUJCTcJLyoqPCBBUkNORVQgKi8KKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5kaV9nZXRfaW5mb3JtYXRpb24oKSAqLworc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT04geworCVBYRU5WX1NUQVRVU190CVN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCisJVUlOVDE2X3QgQmFzZUlvOwkJLyoqPCBJL08gYmFzZSBhZGRyZXNzICovCisJVUlOVDE2X3QgSW50TnVtYmVyOwkJLyoqPCBJUlEgbnVtYmVyICovCisJVUlOVDE2X3QgTWF4VHJhblVuaXQ7CQkvKio8IEFkYXB0ZXIgTVRVICovCisJLyoqIEhhcmR3YXJlIHR5cGUKKwkgKgorCSAqIFZhbGlkIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBSRkMxMDEwICgiQXNzaWduZWQgbnVtYmVycyIpLAorCSAqIGFuZCBhcmUgI0VUSEVSX1RZUEUsICNFWFBfRVRIRVJfVFlQRSwgI0FYMjVfVFlQRSwKKwkgKiAjVE9LRU5fUklOR19UWVBFLCAjQ0hBT1NfVFlQRSwgI0lFRUVfVFlQRSBvciAjQVJDTkVUX1RZUEUuCisJICovCisJVUlOVDE2X3QgSHdUeXBlOworCVVJTlQxNl90IEh3QWRkckxlbjsJCS8qKjwgTUFDIGFkZHJlc3MgbGVuZ3RoICovCisJTUFDX0FERFJfdCBDdXJyZW50Tm9kZUFkZHJlc3M7CS8qKjwgQ3VycmVudCBNQUMgYWRkcmVzcyAqLworCU1BQ19BRERSX3QgUGVybU5vZGVBZGRyZXNzOwkvKio8IFBlcm1hbmVudCAoRUVQUk9NKSBNQUMgYWRkcmVzcyAqLworCVNFR1NFTF90IFJPTUFkZHJlc3M7CQkvKio8IFJlYWwtbW9kZSBST00gc2VnbWVudCBhZGRyZXNzICovCisJVUlOVDE2X3QgUnhCdWZDdDsJCS8qKjwgUmVjZWl2ZSBxdWV1ZSBsZW5ndGggKi8KKwlVSU5UMTZfdCBUeEJ1ZkN0OwkJLyoqPCBUcmFuc21pdCBxdWV1ZSBsZW5ndGggKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX0lORk9STUFUSU9OIFBYRU5WX1VORElfR0VUX0lORk9STUFUSU9OX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9nZXRfaW5mb3JtYXRpb24gKAorCQkgICBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9JTkZPUk1BVElPTiAqdW5kaV9nZXRfaW5mb3JtYXRpb24gKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3VuZGlfZ2V0X2luZm9ybWF0aW9uICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV9nZXRfc3RhdGlzdGljcyBQWEVOVl9VTkRJX0dFVF9TVEFUSVNUSUNTCisgKgorICogIFVOREkgR0VUIFNUQVRJU1RJQ1MKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmRpX2dldF9zdGF0aXN0aWNzKCkgKi8KKyNkZWZpbmUJUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUwkweDAwMGQKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5kaV9nZXRfc3RhdGlzdGljcygpICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9TVEFUSVNUSUNTIHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCVVJTlQzMl90IFhtdEdvb2RGcmFtZXM7CQkvKio8IFN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIGNvdW50ICovCisJVUlOVDMyX3QgUmN2R29vZEZyYW1lczsJCS8qKjwgU3VjY2Vzc2Z1bCByZWNlcHRpb24gY291bnQgKi8KKwlVSU5UMzJfdCBSY3ZDUkNFcnJvcnM7CQkvKio8IFJlY2VpdmUgQ1JDIGVycm9yIGNvdW50ICovCisJVUlOVDMyX3QgUmN2UmVzb3VyY2VFcnJvcnM7CS8qKjwgUmVjZWl2ZSBxdWV1ZSBvdmVyZmxvdyBjb3VudCAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUyBQWEVOVl9VTkRJX0dFVF9TVEFUSVNUSUNTX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9nZXRfc3RhdGlzdGljcyAoCisJCSAgICAgc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUyAqdW5kaV9nZXRfc3RhdGlzdGljcyApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5kaV9nZXRfc3RhdGlzdGljcyAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VuZGlfY2xlYXJfc3RhdGlzdGljcyBQWEVOVl9VTkRJX0NMRUFSX1NUQVRJU1RJQ1MKKyAqCisgKiAgVU5ESSBDTEVBUiBTVEFUSVNUSUNTCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdW5kaV9jbGVhcl9zdGF0aXN0aWNzKCkgKi8KKyNkZWZpbmUJUFhFTlZfVU5ESV9DTEVBUl9TVEFUSVNUSUNTCTB4MDAwZQorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmRpX2NsZWFyX3N0YXRpc3RpY3MoKSAqLworc3RydWN0IHNfUFhFTlZfVU5ESV9DTEVBUl9TVEFUSVNUSUNTIHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9DTEVBUl9TVEFUSVNUSUNTIFBYRU5WX1VORElfQ0xFQVJfU1RBVElTVElDU190OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfY2xlYXJfc3RhdGlzdGljcyAoCisJCSBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0NMRUFSX1NUQVRJU1RJQ1MgKnVuZGlfY2xlYXJfc3RhdGlzdGljcyApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5kaV9jbGVhcl9zdGF0aXN0aWNzICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV9pbml0aWF0ZV9kaWFncyBQWEVOVl9VTkRJX0lOSVRJQVRFX0RJQUdTCisgKgorICogIFVOREkgSU5JVElBVEUgRElBR1MKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmRpX2luaXRpYXRlX2RpYWdzKCkgKi8KKyNkZWZpbmUJUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUwkweDAwMGYKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5kaV9pbml0aWF0ZV9kaWFncygpICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX0lOSVRJQVRFX0RJQUdTIHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUyBQWEVOVl9VTkRJX0lOSVRJQVRFX0RJQUdTX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9pbml0aWF0ZV9kaWFncyAoCisJCSAgICAgc3RydWN0IHNfUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUyAqdW5kaV9pbml0aWF0ZV9kaWFncyApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5kaV9pbml0aWF0ZV9kaWFncyAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VuZGlfZm9yY2VfaW50ZXJydXB0IFBYRU5WX1VORElfRk9SQ0VfSU5URVJSVVBUCisgKgorICogIFVOREkgRk9SQ0UgSU5URVJSVVBUCisgKgorICogIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfdW5kaV9mb3JjZV9pbnRlcnJ1cHQoKSAqLworI2RlZmluZQlQWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVAkweDAwMTAKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5kaV9mb3JjZV9pbnRlcnJ1cHQoKSAqLworc3RydWN0IHNfUFhFTlZfVU5ESV9GT1JDRV9JTlRFUlJVUFQgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVCBQWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVF90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfZm9yY2VfaW50ZXJydXB0ICgKKwkJICAgc3RydWN0IHNfUFhFTlZfVU5ESV9GT1JDRV9JTlRFUlJVUFQgKnVuZGlfZm9yY2VfaW50ZXJydXB0ICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl91bmRpX2ZvcmNlX2ludGVycnVwdCAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X3VuZGlfZ2V0X21jYXN0X2FkZHJlc3MgUFhFTlZfVU5ESV9HRVRfTUNBU1RfQUREUkVTUworICoKKyAqICBVTkRJIEdFVCBNVUxUSUNBU1QgQUREUkVTUworICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3VuZGlfZ2V0X21jYXN0X2FkZHJlc3MoKSAqLworI2RlZmluZQlQWEVOVl9VTkRJX0dFVF9NQ0FTVF9BRERSRVNTCTB4MDAxMQorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmRpX2dldF9tY2FzdF9hZGRyZXNzKCkgKi8KK3N0cnVjdCBzX1BYRU5WX1VORElfR0VUX01DQVNUX0FERFJFU1MgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCisJSVA0X3QgSW5ldEFkZHI7CQkJLyoqPCBNdWx0aWNhc3QgSVAgYWRkcmVzcyAqLworCU1BQ19BRERSX3QgTWVkaWFBZGRyOwkJLyoqPCBNdWx0aWNhc3QgTUFDIGFkZHJlc3MgKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX01DQVNUX0FERFJFU1MgUFhFTlZfVU5ESV9HRVRfTUNBU1RfQUREUkVTU190OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfZ2V0X21jYXN0X2FkZHJlc3MgKAorCSAgICAgICBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9NQ0FTVF9BRERSRVNTICp1bmRpX2dldF9tY2FzdF9hZGRyZXNzICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl91bmRpX2dldF9tY2FzdF9hZGRyZXNzICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV9nZXRfbmljX3R5cGUgUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUKKyAqCisgKiAgVU5ESSBHRVQgTklDIFRZUEUKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmRpX2dldF9uaWNfdHlwZSgpICovCisjZGVmaW5lCVBYRU5WX1VORElfR0VUX05JQ19UWVBFCQkweDAwMTIKKworI2RlZmluZSBQQ0lfTklDCQkyCQkvKio8IFBDSSBuZXR3b3JrIGNhcmQgKi8KKyNkZWZpbmUgUG5QX05JQwkJMwkJLyoqPCBJU0FQblAgbmV0d29yayBjYXJkICovCisjZGVmaW5lIENhcmRCdXNfTklDCTQJCS8qKjwgQ2FyZEJ1cyBuZXR3b3JrIGNhcmQgKi8KKworLyoqIEluZm9ybWF0aW9uIGZvciBhIFBDSSBvciBlcXVpdmFsZW50IE5JQyAqLworc3RydWN0IHBjaV9uaWNfaW5mbyB7CisJVUlOVDE2X3QgVmVuZG9yX0lEOwkJLyoqPCBQQ0kgdmVuZG9yIElEICovCisJVUlOVDE2X3QgRGV2X0lEOwkJLyoqPCBQQ0kgZGV2aWNlIElEICovCisJVUlOVDhfdCBCYXNlX0NsYXNzOwkJLyoqPCBQQ0kgYmFzZSBjbGFzcyAqLworCVVJTlQ4X3QgU3ViX0NsYXNzOwkJLyoqPCBQQ0kgc3ViIGNsYXNzICovCisJVUlOVDhfdCBQcm9nX0ludGY7CQkvKio8IFBDSSBwcm9ncmFtbWluZyBpbnRlcmZhY2UgKi8KKwlVSU5UOF90IFJldjsJCQkvKio8IFBDSSByZXZpc2lvbiAqLworCVVJTlQxNl90IEJ1c0RldkZ1bmM7CQkvKio8IFBDSSBidXM6ZGV2OmZuIGFkZHJlc3MgKi8KKwlVSU5UMTZfdCBTdWJWZW5kb3JfSUQ7CQkvKio8IFBDSSBzdWJ2ZW5kb3IgSUQgKi8KKwlVSU5UMTZfdCBTdWJEZXZpY2VfSUQ7CQkvKio8IFBDSSBzdWJkZXZpY2UgSUQgKi8KK30gUEFDS0VEOworIAorLyoqIEluZm9ybWF0aW9uIGZvciBhbiBJU0FQblAgb3IgZXF1aXZhbGVudCBOSUMgKi8KK3N0cnVjdCBwbnBfbmljX2luZm8geworCVVJTlQzMl90IEVJU0FfRGV2X0lEOwkJLyoqPCBFSVNBIGRldmljZSBJRCAqLworCVVJTlQ4X3QgQmFzZV9DbGFzczsJCS8qKjwgQmFzZSBjbGFzcyAqLworCVVJTlQ4X3QgU3ViX0NsYXNzOwkJLyoqPCBTdWIgY2xhc3MgKi8KKwlVSU5UOF90IFByb2dfSW50ZjsJCS8qKjwgUHJvZ3JhbW1pbmcgaW50ZXJmYWNlICovCisJLyoqIENhcmQgU2VsZWN0IE51bWJlciBhc3NpZ25lZCB0byBjYXJkICovCisJVUlOVDE2X3QgQ2FyZFNlbE51bTsKK30gUEFDS0VEOworCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmRpX2dldF9uaWNfdHlwZSgpICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9OSUNfVFlQRSB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwkvKiogTklDIHR5cGUKKwkgKgorCSAqIFZhbGlkIHZhbHVlcyBhcmUgI1BDSV9OSUMsICNQblBfTklDIG9yICNDYXJkQnVzX05JQy4KKwkgKi8KKwlVSU5UOF90IE5pY1R5cGU7CisJLyoqIE5JQyBpbmZvcm1hdGlvbiAqLworCXVuaW9uIG5pY190eXBlX2luZm8geworCQkvKiogTklDIGluZm9ybWF0aW9uIChpZiAjTmljVHlwZT09I1BDSV9OSUMpICovCisJCXN0cnVjdCBwY2lfbmljX2luZm8gcGNpOworCQkvKiogTklDIGluZm9ybWF0aW9uIChpZiAjTmljVHlwZT09I0NhcmRCdXNfTklDKSAqLworCQlzdHJ1Y3QgcGNpX25pY19pbmZvIGNhcmRidXM7CisJCS8qKiBOSUMgaW5mb3JtYXRpb24gKGlmICNOaWNUeXBlPT0jUG5QX05JQykgKi8KKwkJc3RydWN0IHBucF9uaWNfaW5mbyBwbnA7CisJfSBpbmZvOworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUgUFhFTlZfVU5ESV9HRVRfTklDX1RZUEVfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl91bmRpX2dldF9uaWNfdHlwZSAoIAorCQkJIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX05JQ19UWVBFICp1bmRpX2dldF9uaWNfdHlwZSApOworCisvKiogQH0gKi8gLyogcHhlbnZfdW5kaV9nZXRfbmljX3R5cGUgKi8KKworLyoqIEBkZWZncm91cCBweGVudl91bmRpX2dldF9pZmFjZV9pbmZvIFBYRU5WX1VORElfR0VUX0lGQUNFX0lORk8KKyAqCisgKiAgVU5ESSBHRVQgSUZBQ0UgSU5GTworICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3VuZGlfZ2V0X2lmYWNlX2luZm8oKSAqLworI2RlZmluZQlQWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPCTB4MDAxMworCisvKiogQnJvYWRjYXN0IHN1cHBvcnRlZCAqLworI2RlZmluZSBTVVBQT1JURURfQlJPQURDQVNUCQkweDAwMDEKKy8qKiBNdWx0aWNhc3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFNVUFBPUlRFRF9NVUxUSUNBU1QJCTB4MDAwMgorLyoqIEZ1bmN0aW9uYWwvZ3JvdXAgYWRkcmVzc2luZyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1VQUE9SVEVEX0dST1VQCQkJMHgwMDA0CisvKiogUHJvbWlzY3VvdXMgbW9kZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1VQUE9SVEVEX1BST01JU0NVT1VTCQkweDAwMDgKKy8qKiBTb2Z0d2FyZSBzZXR0YWJsZSBzdGF0aW9uIGFkZHJlc3MgKi8KKyNkZWZpbmUgU1VQUE9SVEVEX1NFVF9TVEFUSU9OX0FERFJFU1MJMHgwMDEwCisvKiogSW5pdGlhdGVEaWFnbm9zdGljcyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1VQUE9SVEVEX0RJQUdOT1NUSUNTCQkweDAwNDAKKy8qKiBSZXNldCBNQUMgc3VwcG9ydGVkICovCisjZGVmaW5lIFNVUFBPUlRFRF9SRVNFVAkJCTB4MDQwMAorLyoqIE9wZW4gLyBDbG9zZSBBZGFwdGVyIHN1cHBvcnRlZCAqLworI2RlZmluZSBTVVBQT1JURURfT1BFTl9DTE9TRQkJMHgwODAwCisvKiogSW50ZXJydXB0IFJlcXVlc3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFNVUFBPUlRFRF9JUlEJCQkweDEwMDAKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfdW5kaV9nZXRfaWZhY2VfaW5mbygpICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPIHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCS8qKiBJbnRlcmZhY2UgdHlwZQorCSAqCisJICogVGhpcyBpcyBkZWZpbmVkIGluIHRoZSBORElTIDIuMCBzcGVjaWZpY2F0aW9uIHRvIGJlIG9uZSBvZgorCSAqIHRoZSBzdHJpbmdzICI4MDIuMyIsICI4MDIuNCIsICI4MDIuNSIsICI4MDIuNiIsICJESVgiLAorCSAqICJESVgrODAyLjMiLCAiQVBQTEVUQUxLIiwgIkFSQ05FVCIsICJGRERJIiwgIlNETEMiLCAiQlNDIiwKKwkgKiAiSERMQyIsIG9yICJJU0ROIi4KKwkgKgorCSAqICJOb3JtYWwiIEV0aGVybmV0LCBmb3IgdmFyaW91cyBoaXN0b3JpY2FsIHJlYXNvbnMsIGlzCisJICogIkRJWCs4MDIuMyIuCisJICovCisJVUlOVDhfdCBJZmFjZVR5cGVbMTZdOworCVVJTlQzMl90IExpbmtTcGVlZDsJCS8qKjwgTGluayBzcGVlZCwgaW4gYml0cyBwZXIgc2Vjb25kICovCisJLyoqIFNlcnZpY2UgZmxhZ3MKKwkgKgorCSAqIFRoZXNlIGFyZSB0aGUgInNlcnZpY2UgZmxhZ3MiIGRlZmluZWQgaW4gdGhlICJNQUMKKwkgKiBTZXJ2aWNlLVNwZWNpZmljIENoYXJhY3RlcmlzdGljcyIgdGFibGUgaW4gdGhlIE5ESVMgMi4wCisJICogc3BlY2lmaWNhdGlvbi4gIEFsbW9zdCBhbGwgb2YgdGhlbSBhcmUgaXJyZWxldmFudCB0byBQWEUuCisJICovCisJVUlOVDMyX3QgU2VydmljZUZsYWdzOworCVVJTlQzMl90IFJlc2VydmVkWzRdOwkJLyoqPCBNdXN0IGJlIHplcm8gKi8KK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX0lGQUNFX0lORk8gUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GT190OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfZ2V0X2lmYWNlX2luZm8gKAorCQkgICAgIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX0lGQUNFX0lORk8gKnVuZGlfZ2V0X2lmYWNlX2luZm8gKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3VuZGlfZ2V0X2lmYWNlX2luZm8gKi8KKworLyoqIEBkZWZncm91cCBweGVudl91bmRpX2dldF9zdGF0ZSBQWEVOVl9VTkRJX0dFVF9TVEFURQorICoKKyAqICBVTkRJIEdFVCBTVEFURQorICoKKyAqICBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X3VuZGlfZ2V0X3N0YXRlKCkgKi8KKyNkZWZpbmUgUFhFTlZfVU5ESV9HRVRfU1RBVEUJCTB4MDAxNQorCisvKiogcHhlbnZfc3RhcnRfdW5kaSgpIGhhcyBiZWVuIGNhbGxlZCAqLworI2RlZmluZSBQWEVfVU5ESV9HRVRfU1RBVEVfU1RBUlRFRAkxCisvKiogcHhlbnZfdW5kaV9pbml0aWFsaXplKCkgaGFzIGJlZW4gY2FsbGVkICovCisjZGVmaW5lIFBYRV9VTkRJX0dFVF9TVEFURV9JTklUSUFMSVpFRAkyCisvKiogcHhlbnZfdW5kaV9vcGVuKCkgaGFzIGJlZW4gY2FsbGVkICovCisjZGVmaW5lIFBYRV9VTkRJX0dFVF9TVEFURV9PUEVORUQJMworCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmRpX2dldF9zdGF0ZSgpICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9TVEFURSB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwkvKiogQ3VycmVudCBzdGF0ZSBvZiB0aGUgVU5ESSBkcml2ZXIKKwkgKgorCSAqIFZhbGlkIHZhbHVlcyBhcmUgI1BYRV9VTkRJX0dFVF9TVEFURV9TVEFSVEVELAorCSAqICNQWEVfVU5ESV9HRVRfU1RBVEVfSU5JVElBTElaRUQgb3IKKwkgKiAjUFhFX1VORElfR0VUX1NUQVRFX09QRU5FRC4KKwkgKi8KKwlVSU5UOF90IFVORElzdGF0ZTsKK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX1NUQVRFIFBYRU5WX1VORElfR0VUX1NUQVRFX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9nZXRfc3RhdGUgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9TVEFURQorCQkJCQkgICAqdW5kaV9nZXRfc3RhdGUgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3VuZGlfZ2V0X3N0YXRlICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfdW5kaV9pc3IgUFhFTlZfVU5ESV9JU1IKKyAqCisgKiAgVU5ESSBJU1IKKyAqCisgKiAgQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl91bmRpX2lzcigpICovCisjZGVmaW5lCVBYRU5WX1VORElfSVNSCQkJMHgwMDE0CisKKy8qKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhpcyBpcyBvdXIgaW50ZXJydXB0ICovCisjZGVmaW5lIFBYRU5WX1VORElfSVNSX0lOX1NUQVJUCQkxCisvKiogU3RhcnQgcHJvY2Vzc2luZyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUFhFTlZfVU5ESV9JU1JfSU5fUFJPQ0VTUwkyCisvKiogQ29udGludWUgcHJvY2Vzc2luZyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUFhFTlZfVU5ESV9JU1JfSU5fR0VUX05FWFQJMworLyoqIFRoaXMgaW50ZXJydXB0IHdhcyBvdXJzICovCisjZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9PVVJTCQkwCisvKiogVGhpcyBpbnRlcnJ1cHQgd2FzIG5vdCBvdXJzICovCisjZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9OT1RfT1VSUwkxCisvKiogRmluaXNoZWQgcHJvY2Vzc2luZyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUFhFTlZfVU5ESV9JU1JfT1VUX0RPTkUJCTAKKy8qKiBBIHBhY2tldCB0cmFuc21pc3Npb24gaGFzIGNvbXBsZXRlZCAqLworI2RlZmluZSBQWEVOVl9VTkRJX0lTUl9PVVRfVFJBTlNNSVQJMgorLyoqIEEgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkICovCisjZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9SRUNFSVZFCTMKKy8qKiBXZSBhcmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIHByb2Nlc3NpbmcgYW4gaW50ZXJydXB0ICovCisjZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9CVVNZCQk0CisKKy8qKiBVbmljYXN0IHBhY2tldCAob3IgcGFja2V0IGNhcHR1cmVkIGluIHByb21pc2N1b3VzIG1vZGUpICovCisjZGVmaW5lIFBfRElSRUNURUQJMAorLyoqIEJyb2FkY2FzdCBwYWNrZXQgKi8KKyNkZWZpbmUgUF9CUk9BRENBU1QJMQorLyoqIE11bHRpY2FzdCBwYWNrZXQgKi8KKyNkZWZpbmUgUF9NVUxUSUNBU1QJMgorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl91bmRpX2lzcigpICovCitzdHJ1Y3Qgc19QWEVOVl9VTkRJX0lTUiB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwkvKiogRnVuY3Rpb24gZmxhZworCSAqCisJICogVmFsaWQgdmFsdWVzIGFyZSAjUFhFTlZfVU5ESV9JU1JfSU5fU1RBUlQsCisJICogI1BYRU5WX1VORElfSVNSX0lOX1BST0NFU1MsICNQWEVOVl9VTkRJX0lTUl9JTl9HRVRfTkVYVCwKKwkgKiAjUFhFTlZfVU5ESV9JU1JfT1VUX09VUlMsICNQWEVOVl9VTkRJX0lTUl9PVVRfTk9UX09VUlMsCisJICogI1BYRU5WX1VORElfSVNSX09VVF9ET05FLCAjUFhFTlZfVU5ESV9JU1JfT1VUX1RSQU5TTUlULAorCSAqICNQWEVOVl9VTkRJX0lTUl9PVVRfUkVDRUlWRSBvciAjUFhFTlZfVU5ESV9JU1JfT1VUX0JVU1kuCisJICovCisJVUlOVDE2X3QgRnVuY0ZsYWc7CisJVUlOVDE2X3QgQnVmZmVyTGVuZ3RoOwkJLyoqPCBEYXRhIGJ1ZmZlciBsZW5ndGggKi8KKwlVSU5UMTZfdCBGcmFtZUxlbmd0aDsJCS8qKjwgVG90YWwgZnJhbWUgbGVuZ3RoICovCisJVUlOVDE2X3QgRnJhbWVIZWFkZXJMZW5ndGg7CS8qKjwgRnJhbWUgaGVhZGVyIGxlbmd0aCAqLworCVNFR09GRjE2X3QgRnJhbWU7CQkvKio8IERhdGEgYnVmZmVyIGFkZHJlc3MgKi8KKwkvKiogUHJvdG9jb2wgdHlwZQorCSAqCisJICogVmFsaWQgdmFsdWVzIGFyZSAjUF9JUCwgI1BfQVJQLCAjUF9SQVJQIG9yICNQX09USEVSLgorCSAqLworCVVJTlQ4X3QgUHJvdFR5cGU7CisJLyoqIFBhY2tldCB0eXBlCisJICoKKwkgKiBWYWxpZCB2YWx1ZXMgYXJlICNQX0RJUkVDVEVELCAjUF9CUk9BRENBU1Qgb3IgI1BfTVVMVElDQVNULgorCSAqLworCVVJTlQ4X3QgUGt0VHlwZTsKK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX1VORElfSVNSIFBYRU5WX1VORElfSVNSX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9pc3IgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0lTUiAqdW5kaV9pc3IgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X3VuZGlfaXNyICovCisKKy8qKiBAfSAqLyAvKiBweGVfdW5kaV9hcGkgKi8KKworLyoqIEBkZWZncm91cCBweGVfZmlsZV9hcGkgUFhFIEZJTEUgQVBJCisgKgorICogUE9TSVgtbGlrZSBmaWxlIG9wZXJhdGlvbnMKKyAqCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgcHhlbnZfZmlsZV9vcGVuIFBYRU5WX0ZJTEVfT1BFTgorICoKKyAqIEZJTEUgT1BFTgorICoKKyAqIEB7CisgKi8KKworLyoqIFBYRSBBUEkgZnVuY3Rpb24gY29kZSBmb3IgcHhlbnZfZmlsZV9vcGVuKCkgKi8KKyNkZWZpbmUgUFhFTlZfRklMRV9PUEVOCQkJMHgwMGUwCisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X2ZpbGVfb3BlbigpICovCitzdHJ1Y3Qgc19QWEVOVl9GSUxFX09QRU4geworCVBYRU5WX1NUQVRVU190IFN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCisJVUlOVDE2X3QgRmlsZUhhbmRsZTsJCS8qKjwgRmlsZSBoYW5kbGUgKi8KKwlTRUdPRkYxNl90IEZpbGVOYW1lOwkJLyoqPCBGaWxlIFVSTCAqLworCVVJTlQzMl90IFJlc2VydmVkOwkJLyoqPCBSZXNlcnZlZCAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfRklMRV9PUEVOIFBYRU5WX0ZJTEVfT1BFTl90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X2ZpbGVfb3BlbiAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfT1BFTiAqZmlsZV9vcGVuICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl9maWxlX29wZW4gKi8KKworLyoqIEBkZWZncm91cCBweGVudl9maWxlX2Nsb3NlIFBYRU5WX0ZJTEVfQ0xPU0UKKyAqCisgKiBGSUxFIENMT1NFCisgKgorICogQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl9maWxlX2Nsb3NlKCkgKi8KKyNkZWZpbmUgUFhFTlZfRklMRV9DTE9TRQkJMHgwMGUxCisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X2ZpbGVfY2xvc2UoKSAqLworc3RydWN0IHNfUFhFTlZfRklMRV9DTE9TRSB7CisJUFhFTlZfU1RBVFVTX3QgU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwlVSU5UMTZfdCBGaWxlSGFuZGxlOwkJLyoqPCBGaWxlIGhhbmRsZSAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfRklMRV9DTE9TRSBQWEVOVl9GSUxFX0NMT1NFX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfZmlsZV9jbG9zZSAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfQ0xPU0UKKwkJCQkgICAgICAgKmZpbGVfY2xvc2UgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X2ZpbGVfY2xvc2UgKi8KKworLyoqIEBkZWZncm91cCBweGVudl9maWxlX3NlbGVjdCBQWEVOVl9GSUxFX1NFTEVDVAorICoKKyAqIEZJTEUgU0VMRUNUCisgKgorICogQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl9maWxlX3NlbGVjdCgpICovCisjZGVmaW5lIFBYRU5WX0ZJTEVfU0VMRUNUCQkweDAwZTIKKworLyoqIEZpbGUgaXMgcmVhZHkgZm9yIHJlYWRpbmcgKi8KKyNkZWZpbmUgUkRZX1JFQUQJCQkweDAwMDEKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfZmlsZV9zZWxlY3QoKSAqLworc3RydWN0IHNfUFhFTlZfRklMRV9TRUxFQ1QgeworCVBYRU5WX1NUQVRVU190IFN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCisJVUlOVDE2X3QgRmlsZUhhbmRsZTsJCS8qKjwgRmlsZSBoYW5kbGUgKi8KKwlVSU5UMTZfdCBSZWFkeTsJCQkvKio8IEluZGljYXRpb24gb2YgcmVhZGluZXNzICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9GSUxFX1NFTEVDVCBQWEVOVl9GSUxFX1NFTEVDVF90OworCitleHRlcm4gUFhFTlZfRVhJVF90IHB4ZW52X2ZpbGVfc2VsZWN0ICggc3RydWN0IHNfUFhFTlZfRklMRV9TRUxFQ1QKKwkJCQkJKmZpbGVfc2VsZWN0ICk7CisKKy8qKiBAfSAqLyAvKiBweGVudl9maWxlX3NlbGVjdCAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X2ZpbGVfcmVhZCBQWEVOVl9GSUxFX1JFQUQKKyAqCisgKiBGSUxFIFJFQUQKKyAqCisgKiBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X2ZpbGVfcmVhZCgpICovCisjZGVmaW5lIFBYRU5WX0ZJTEVfUkVBRAkJMHgwMGUzCisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X2ZpbGVfcmVhZCgpICovCitzdHJ1Y3Qgc19QWEVOVl9GSUxFX1JFQUQgeworCVBYRU5WX1NUQVRVU190IFN0YXR1czsJCS8qKjwgUFhFIHN0YXR1cyBjb2RlICovCisJVUlOVDE2X3QgRmlsZUhhbmRsZTsJCS8qKjwgRmlsZSBoYW5kbGUgKi8KKwlVSU5UMTZfdCBCdWZmZXJTaXplOwkJLyoqPCBEYXRhIGJ1ZmZlciBzaXplICovCisJU0VHT0ZGMTZfdCBCdWZmZXI7CQkvKio8IERhdGEgYnVmZmVyICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9GSUxFX1JFQUQgUFhFTlZfRklMRV9SRUFEX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfZmlsZV9yZWFkICggc3RydWN0IHNfUFhFTlZfRklMRV9SRUFEICpmaWxlX3JlYWQgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X2ZpbGVfcmVhZCAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X2dldF9maWxlX3NpemUgUFhFTlZfR0VUX0ZJTEVfU0laRQorICoKKyAqIEdFVCBGSUxFIFNJWkUKKyAqCisgKiBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X2dldF9maWxlX3NpemUoKSAqLworI2RlZmluZSBQWEVOVl9HRVRfRklMRV9TSVpFCQkweDAwZTQKKworLyoqIFBhcmFtZXRlciBibG9jayBmb3IgcHhlbnZfZ2V0X2ZpbGVfc2l6ZSgpICovCitzdHJ1Y3Qgc19QWEVOVl9HRVRfRklMRV9TSVpFIHsKKwlQWEVOVl9TVEFUVVNfdCBTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCVVJTlQxNl90IEZpbGVIYW5kbGU7CQkvKio8IEZpbGUgaGFuZGxlICovCisJVUlOVDMyX3QgRmlsZVNpemU7CQkvKio8IEZpbGUgc2l6ZSAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfR0VUX0ZJTEVfU0laRSBQWEVOVl9HRVRfRklMRV9TSVpFX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfZ2V0X2ZpbGVfc2l6ZSAoIHN0cnVjdCBzX1BYRU5WX0dFVF9GSUxFX1NJWkUKKwkJCQkJICAqZ2V0X2ZpbGVfc2l6ZSApOworCisvKiogQH0gKi8gLyogcHhlbnZfZ2V0X2ZpbGVfc2l6ZSAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X2ZpbGVfZXhlYyBQWEVOVl9GSUxFX0VYRUMKKyAqCisgKiBGSUxFIEVYRUMKKyAqCisgKiBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X2ZpbGVfZXhlYygpICovCisjZGVmaW5lIFBYRU5WX0ZJTEVfRVhFQwkJCTB4MDBlNQorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl9maWxlX2V4ZWMoKSAqLworc3RydWN0IHNfUFhFTlZfRklMRV9FWEVDIHsKKwlQWEVOVl9TVEFUVVNfdCBTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCVNFR09GRjE2X3QgQ29tbWFuZDsJCS8qKjwgQ29tbWFuZCB0byBleGVjdXRlICovCit9IFBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0VYRUMgUFhFTlZfRklMRV9FWEVDX3Q7CisKK2V4dGVybiBQWEVOVl9FWElUX3QgcHhlbnZfZmlsZV9leGVjICggc3RydWN0IHNfUFhFTlZfRklMRV9FWEVDICpmaWxlX2V4ZWMgKTsKKworLyoqIEB9ICovIC8qIHB4ZW52X2ZpbGVfZXhlYyAqLworCisvKiogQGRlZmdyb3VwIHB4ZW52X2ZpbGVfYXBpX2NoZWNrIFBYRU5WX0ZJTEVfQVBJX0NIRUNLCisgKgorICogRklMRSBBUEkgQ0hFQ0sKKyAqCisgKiBAeworICovCisKKy8qKiBQWEUgQVBJIGZ1bmN0aW9uIGNvZGUgZm9yIHB4ZW52X2ZpbGVfYXBpX2NoZWNrKCkgKi8KKyNkZWZpbmUgUFhFTlZfRklMRV9BUElfQ0hFQ0sJCTB4MDBlNgorCisvKiogUGFyYW1ldGVyIGJsb2NrIGZvciBweGVudl9maWxlX2FwaV9jaGVjaygpICovCitzdHJ1Y3Qgc19QWEVOVl9GSUxFX0FQSV9DSEVDSyB7CisJUFhFTlZfU1RBVFVTX3QgU3RhdHVzOwkJLyoqPCBQWEUgc3RhdHVzIGNvZGUgKi8KKwlVSU5UMTZfdCBTaXplOwkJCS8qKjwgU2l6ZSBvZiBzdHJ1Y3R1cmUgICovCisJVUlOVDMyX3QgTWFnaWM7CQkJLyoqPCBNYWdpYyBudW1iZXIgKi8KKwlVSU5UMzJfdCBQcm92aWRlcjsJCS8qKjwgSW1wbGVtZW50YXRpb24gaWRlbnRpZmllciAqLworCVVJTlQzMl90IEFQSU1hc2s7CQkvKio8IFN1cHBvcnRlZCBBUEkgZnVuY3Rpb25zICovCisJVUlOVDMyX3QgRmxhZ3M7CQkJLyoqPCBSZXNlcnZlZCBmb3IgdGhlIGZ1dHVyZSAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfRklMRV9BUElfQ0hFQ0sgUFhFTlZfRklMRV9BUElfQ0hFQ0tfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl9maWxlX2FwaV9jaGVjayAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfQVBJX0NIRUNLICpmaWxlX2FwaV9jaGVjayApOworCisvKiogQH0gKi8gLyogcHhlbnZfZmlsZV9hcGlfY2hlY2sgKi8KKworLyoqIEBkZWZncm91cCBweGVudl9maWxlX2V4aXRfaG9vayBQWEVOVl9GSUxFX0VYSVRfSE9PSworICoKKyAqIEZJTEUgRVhJVCBIT09LCisgKgorICogQHsKKyAqLworCisvKiogUFhFIEFQSSBmdW5jdGlvbiBjb2RlIGZvciBweGVudl9maWxlX2V4aXRfaG9vaygpICovCisjZGVmaW5lIFBYRU5WX0ZJTEVfRVhJVF9IT09LCQkJMHgwMGU3CisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHB4ZW52X2ZpbGVfZXhpdF9ob29rKCkgKi8KK3N0cnVjdCBzX1BYRU5WX0ZJTEVfRVhJVF9IT09LIHsKKwlQWEVOVl9TVEFUVVNfdCBTdGF0dXM7CQkvKio8IFBYRSBzdGF0dXMgY29kZSAqLworCVNFR09GRjE2X3QgSG9vazsJCS8qKjwgU0VHMTY6T0ZGMTYgdG8ganVtcCB0byAqLworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfRklMRV9FWElUX0hPT0sgUFhFTlZfRklMRV9FWElUX0hPT0tfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCBweGVudl9maWxlX2V4aXRfaG9vayAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfRVhJVF9IT09LICpmaWxlX2V4aXRfaG9vayApOworCisvKiogQH0gKi8gLyogcHhlbnZfZmlsZV9leGl0X2hvb2sgKi8KKworLyoqIEB9ICovIC8qIHB4ZV9maWxlX2FwaSAqLworCisvKiogQGRlZmdyb3VwIHB4ZV9sb2FkZXJfYXBpIFBYRSBMb2FkZXIgQVBJCisgKgorICogVGhlIFVOREkgUk9NIGxvYWRlciBBUEkKKyAqCisgKiBAeworICovCisKKy8qKiBQYXJhbWV0ZXIgYmxvY2sgZm9yIHVuZGlfbG9hZGVyKCkgKi8KK3N0cnVjdCBzX1VORElfTE9BREVSIHsKKwkvKiogUFhFIHN0YXR1cyBjb2RlICovCisJUFhFTlZfU1RBVFVTX3QgU3RhdHVzOworCS8qKiAlYXggcmVnaXN0ZXIgYXMgZm9yIFBYRU5WX1NUQVJUX1VOREkgKi8KKwlVSU5UMTZfdCBBWDsKKwkvKiogJWJ4IHJlZ2lzdGVyIGFzIGZvciBQWEVOVl9TVEFSVF9VTkRJICovCisJVUlOVDE2X3QgQlg7CisJLyoqICVkeCByZWdpc3RlciBhcyBmb3IgUFhFTlZfU1RBUlRfVU5ESSAqLworCVVJTlQxNl90IERYOworCS8qKiAlZGkgcmVnaXN0ZXIgYXMgZm9yIFBYRU5WX1NUQVJUX1VOREkgKi8KKwlPRkYxNl90IERJOworCS8qKiAlZXMgcmVnaXN0ZXIgYXMgZm9yIFBYRU5WX1NUQVJUX1VOREkgKi8KKwlTRUdTRUxfdCBFUzsKKwkvKiogVU5ESSBkYXRhIHNlZ21lbnQKKwkgKgorCSAqIEBub3RlIFRoZSBQWEUgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQKKwkgKiBhcyAjVUlOVDE2X3QuICBGb3IgeDg2LCAjU0VHU0VMX3QgYW5kICNVSU5UMTZfdCBhcmUKKwkgKiBlcXVpdmFsZW50IGFueXdheTsgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgI1NFR1NFTF90IG1ha2VzCisJICogbW9yZSBzZW5zZS4KKwkgKi8KKwlTRUdTRUxfdCBVTkRJX0RTOworCS8qKiBVTkRJIGNvZGUgc2VnbWVudAorCSAqCisJICogQG5vdGUgVGhlIFBYRSBzcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorCSAqIGFzICNVSU5UMTZfdC4gIEZvciB4ODYsICNTRUdTRUxfdCBhbmQgI1VJTlQxNl90IGFyZQorCSAqIGVxdWl2YWxlbnQgYW55d2F5OyBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyAjU0VHU0VMX3QgbWFrZXMKKwkgKiBtb3JlIHNlbnNlLgorCSAqLworCVNFR1NFTF90IFVORElfQ1M7CisJLyoqIEFkZHJlc3Mgb2YgdGhlICFQWEUgc3RydWN0dXJlIChhIHN0cnVjdCBzX1BYRSkgKi8KKwlTRUdPRkYxNl90IFBYRXB0cjsKKwkvKiogQWRkcmVzcyBvZiB0aGUgUFhFTlYrIHN0cnVjdHVyZSAoYSBzdHJ1Y3Qgc19QWEVOVikgKi8KKwlTRUdPRkYxNl90IFBYRU5WcHRyOworfSBQQUNLRUQ7CisKK3R5cGVkZWYgc3RydWN0IHNfVU5ESV9MT0FERVIgVU5ESV9MT0FERVJfdDsKKworZXh0ZXJuIFBYRU5WX0VYSVRfdCB1bmRpX2xvYWRlciAoIHN0cnVjdCBzX1VORElfTE9BREVSICp1bmRpX2xvYWRlciApOworCisvKiogQH0gKi8gLyogcHhlX2xvYWRlcl9hcGkgKi8KKworLyoqIEB9ICovIC8qIHB4ZSAqLworCisvKiogQHBhZ2UgcHhlX25vdGVzIEV0aGVyYm9vdCBQWEUgaW1wbGVtZW50YXRpb24gbm90ZXMKKworQHNlY3Rpb24gcHhlX3JvdXRpbmcgSVAgcm91dGluZworCitTZXZlcmFsIFBYRSBBUEkgY2FsbHMgKGUuZy4gcHhlbnZfdGZ0cF9vcGVuKCkgYW5kIHB4ZW52X3VkcF93cml0ZSgpKQorYWxsb3cgZm9yIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSBhICJyZWxheSBhZ2VudCBJUCBhZGRyZXNzIiwgb2Z0ZW4gaW4gYQorZmllbGQgY2FsbGVkICJnYXRld2F5IiBvciBzaW1pbGFyLiAgVGhlIFBYRSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0CisiVGhlIElQIGxheWVyIHNob3VsZCBwcm92aWRlIHNwYWNlIGZvciBhIG1pbmltdW0gb2YgZm91ciByb3V0aW5nCitlbnRyaWVzIG9idGFpbmVkIGZyb20gdGhlIGRlZmF1bHQgcm91dGVyIGFuZCBzdGF0aWMgcm91dGUgREhDUCBvcHRpb24KK3RhZ3MgaW4gdGhlIERIQ1BBQ0sgbWVzc2FnZSwgcGx1cyBhbnkgbm9uLXplcm8gZ2lhZGRyIGZpZWxkIGZyb20gdGhlCitESENQT0ZGRVIgbWVzc2FnZShzKSBhY2NlcHRlZCBieSB0aGUgY2xpZW50Ii4KKworVGhlIERIQ1Agc3RhdGljIHJvdXRlIG9wdGlvbiAoIm9wdGlvbiBzdGF0aWMtcm91dGVzIiBpbiBkaGNwZC5jb25mKQord29ya3Mgb25seSBmb3IgY2xhc3NlZCBJUCByb3V0aW5nIChpLmUuIGl0IHByb3ZpZGVzIG5vIHdheSB0byBzcGVjaWZ5CithIHN1Ym5ldCBtYXNrKS4gIFNpbmNlIHZpcnR1YWxseSBldmVyeXRoaW5nIG5vdyB1c2VzIGNsYXNzbGVzcyBJUAorcm91dGluZywgdGhlIERIQ1Agc3RhdGljIHJvdXRlIG9wdGlvbiBpcyBhbG1vc3QgdG90YWxseSB1c2VsZXNzLCBhbmQKK2lzIChhY2NvcmRpbmcgdG8gdGhlIGRoY3Atb3B0aW9ucyBtYW4gcGFnZSkgbm90IGltcGxlbWVudGVkIGJ5IGFueSBvZgordGhlIHBvcHVsYXIgREhDUCBjbGllbnRzLgorCitUaGlzIGxlYXZlcyB0aGUgY2FsbGVyLXNwZWNpZmllZCAicmVsYXkgYWdlbnQgSVAgYWRkcmVzcyIsIHRoZSBnaWFkZHIKK2ZpZWxkIGZyb20gdGhlIERIQ1BPRkZFUiBtZXNzYWdlKHMpIGFuZCB0aGUgZGVmYXVsdCBnYXRld2F5KHMpCitwcm92aWRlZCB2aWEgdGhlIHJvdXRlcnMgb3B0aW9uICgib3B0aW9uIHJvdXRlcnMiIGluIGRoY3BkLmNvbmYpIGluCit0aGUgREhDUEFDSyBtZXNzYWdlLiAgRWFjaCBvZiB0aGVzZSBpcyBhIGRlZmF1bHQgZ2F0ZXdheSBhZGRyZXNzLgorSXQncyBhIGZhaXIgYmV0IHRoYXQgdGhlIHJvdXRlcnMgb3B0aW9uIHNob3VsZCB0YWtlIHByaW9yaXR5IG92ZXIgdGhlCitnaWFkZHIgZmllbGQsIHNpbmNlIHRoZSByb3V0ZXJzIG9wdGlvbiBoYXMgdG8gYmUgZXhwbGljaXRseSBzcGVjaWZpZWQKK2J5IHRoZSBESENQIHNlcnZlciBvcGVyYXRvci4gIFNpbWlsYXJseSwgaXQncyBmYWlyIHRvIGFzc3VtZSB0aGF0IHRoZQorY2FsbGVyLXNwZWNpZmllZCAicmVsYXkgYWdlbnQgSVAgYWRkcmVzcyIsIGlmIHByZXNlbnQsIHNob3VsZCB0YWtlCitwcmlvcml0eSBvdmVyIGFueSBvdGhlciByb3V0aW5nIHRhYmxlIGVudHJpZXMuCisKK0BidWcgRXRoZXJib290IGN1cnJlbnRseSBpZ25vcmVzIGFsbCBwb3RlbnRpYWwgc291cmNlcyBvZiByb3V0aW5nCitpbmZvcm1hdGlvbiBvdGhlciB0aGFuIHRoZSBmaXJzdCByb3V0ZXIgcHJvdmlkZWQgdG8gaXQgYnkgYSBESENQCityb3V0ZXJzIG9wdGlvbi4KKworQHNlY3Rpb24gcHhlX3g4Nl9tb2RlcyB4ODYgcHJvY2Vzc29yIG1vZGUgcmVzdHJpY3Rpb25zCisKK09uIHRoZSB4ODYgcGxhdGZvcm0sIGRpZmZlcmVudCBQWEUgQVBJIGNhbGxzIGhhdmUgZGlmZmVyZW50CityZXN0cmljdGlvbnMgb24gdGhlIHByb2Nlc3NvciBtb2RlcyAocmVhbCBvciBwcm90ZWN0ZWQpIHRoYXQgY2FuIGJlCit1c2VkLiAgU2VlIHRoZSBpbmRpdmlkdWFsIEFQSSBjYWxsIGRlc2NyaXB0aW9ucyBmb3IgdGhlIHJlc3RyaWN0aW9ucwordGhhdCBhcHBseSB0byBhbnkgcGFydGljdWxhciBjYWxsLgorCitAc3Vic2VjdGlvbiBweGVfeDg2X3Btb2RlMTYgUmVhbCBtb2RlLCBvciBwcm90ZWN0ZWQtbW9kZSB3aXRoIDE2LWJpdCBzdGFjaworCitUaGUgUFhFIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgdGhlIEFQSSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluCitwcm90ZWN0ZWQgbW9kZSBvbmx5IGlmIHRoZSBzX1BYRTo6U3RhdHVzQ2FsbG91dCBmaWVsZCBpcyBzZXQgdG8gYQorbm9uLXplcm8gdmFsdWUsIGFuZCB0aGF0IHRoZSBBUEkgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIGEKKzMyLWJpdCBzdGFjayBzZWdtZW50LgorCitFdGhlcmJvb3QgZG9lcyBub3QgZW5mb3JjZSBlaXRoZXIgb2YgdGhlc2UgcmVzdHJpY3Rpb25zOyB0aGV5IHNlZW0gKGFzCit3aXRoIHNvIG11Y2ggb2YgdGhlIFBYRSBzcGVjaWZpY2F0aW9uKSB0byBiZSBhcnRpZmFjdHMgb2YgdGhlIEludGVsCitpbXBsZW1lbnRhdGlvbi4KKworKi8KKworI2VuZGlmIC8qIFBYRV9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvcHhlX2NhbGwuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3B4ZV9jYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyNDU2MQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3B4ZV9jYWxsLmgKQEAgLTAsMCArMSw1NyBAQAorI2lmbmRlZiBfUFhFX0NBTExfSAorI2RlZmluZSBfUFhFX0NBTExfSAorCisvKiogQGZpbGUKKyAqCisgKiBQWEUgQVBJIGVudHJ5IHBvaW50CisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8cHhlX2FwaS5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisKK3N0cnVjdCBuZXRfZGV2aWNlOworCisvKiogUFhFIGxvYWQgYWRkcmVzcyBzZWdtZW50ICovCisjZGVmaW5lIFBYRV9MT0FEX1NFR01FTlQgMAorCisvKiogUFhFIGxvYWQgYWRkcmVzcyBvZmZzZXQgKi8KKyNkZWZpbmUgUFhFX0xPQURfT0ZGU0VUIDB4N2MwMAorCisvKiogUFhFIHBoeXNpY2FsIGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBQWEVfTE9BRF9QSFlTICggKCBQWEVfTE9BRF9TRUdNRU5UIDw8IDQgKSArIFBYRV9MT0FEX09GRlNFVCApCisKKy8qKiAhUFhFIHN0cnVjdHVyZSAqLworZXh0ZXJuIHN0cnVjdCBzX1BYRSBfX3RleHQxNiAoIHBweGUgKTsKKyNkZWZpbmUgcHB4ZSBfX3VzZV90ZXh0MTYgKCBwcHhlICkKKworLyoqIFBYRU5WKyBzdHJ1Y3R1cmUgKi8KK2V4dGVybiBzdHJ1Y3Qgc19QWEVOViBfX3RleHQxNiAoIHB4ZW52ICk7CisjZGVmaW5lIHB4ZW52IF9fdXNlX3RleHQxNiAoIHB4ZW52ICkKKworZXh0ZXJuIHZvaWQgcHhlX2FjdGl2YXRlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworZXh0ZXJuIGludCBweGVfZGVhY3RpdmF0ZSAoIHZvaWQgKTsKK2V4dGVybiBpbnQgcHhlX3N0YXJ0X25icCAoIHZvaWQgKTsKK2V4dGVybiBfX2FzbWNhbGwgdm9pZCBweGVfYXBpX2NhbGwgKCBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiApOworZXh0ZXJuIGludCBfcHhlX2FwaV9jYWxsX3dlYWsgKCBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiApCisJX19hdHRyaWJ1dGVfXyAoKCB3ZWFrICkpOworCisvKioKKyAqIERpc3BhdGNoIFBYRSBBUEkgY2FsbCB3ZWFrbHkKKyAqCisgKiBAdiBpeDg2CQlSZWdpc3RlcnMgZm9yIFBYRSBjYWxsCisgKiBAcmV0IHByZXNlbnQJCVplcm8gaWYgdGhlIFBYRSBzdGFjayBpcyBwcmVzZW50LCBub256ZXJvIGlmIG5vdAorICoKKyAqIEEgc3VjY2Vzc2Z1bCByZXR1cm4gb25seSBpbmRpY2F0ZXMgdGhhdCB0aGUgUFhFIHN0YWNrIHdhcyBhdmFpbGFibGUKKyAqIGZvciBkaXNwYXRjaGluZyB0aGUgY2FsbDsgaXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBzdWNjZXNzIG9mCisgKiB3aGF0ZXZlciB0aGUgY2FsbCBhc2tlZCBmb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB4ZV9hcGlfY2FsbF93ZWFrICggc3RydWN0IGkzODZfYWxsX3JlZ3MgKml4ODYgKQoreworCWlmICggX3B4ZV9hcGlfY2FsbF93ZWFrICE9IE5VTEwgKQorCQlyZXR1cm4gX3B4ZV9hcGlfY2FsbF93ZWFrICggaXg4NiApOworCXJldHVybiAtMTsKK30KKworI2VuZGlmIC8qIF9QWEVfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9weGVfdHlwZXMuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3B4ZV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NTE2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9weGVfdHlwZXMuaApAQCAtMCwwICsxLDEyNyBAQAorI2lmbmRlZiBQWEVfVFlQRVNfSAorI2RlZmluZSBQWEVfVFlQRVNfSAorCisvKiogQGZpbGUKKyAqCisgKiBQWEUgZGF0YSB0eXBlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPiAvKiBQWEUgc3RhdHVzIGNvZGVzICovCisKKy8qKiBAYWRkdG9ncm91cCBweGUgUHJlYm9vdCBlWGVjdXRpb24gRW52aXJvbm1lbnQgKFBYRSkgQVBJCisgKiAgQHsKKyAqLworCisvKiogQGRlZmdyb3VwIHB4ZV90eXBlcyBQWEUgZGF0YSB0eXBlcworICoKKyAqIEJhc2ljIFBYRSBkYXRhIHR5cGVzIHN1Y2ggYXMgI1VJTlQxNl90LCAjQUREUjMyX3QsICNTRUdTRUxfdCBldGMuCisgKgorICogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGJhc2VkIG9uIFRhYmxlIDEtMSAoIkRhdGEgVHlwZSBEZWZpbml0aW9ucyIpCisgKiBpbiB0aGUgSW50ZWwgUFhFIHNwZWNpZmljYXRpb24gdmVyc2lvbiAyLjEuICBUaGV5IGhhdmUgYmVlbgorICogZ2VuZXJhbGlzZWQgdG8gbm9uLXg4NiBhcmNoaXRlY3R1cmVzIHdoZXJlIHBvc3NpYmxlLgorICoKKyAqIEB7CisgKi8KKworLyoqIEFuIDgtYml0IHVuc2lnbmVkIGludGVnZXIgKi8KK3R5cGVkZWYgdWludDhfdCBVSU5UOF90OworCisvKiogQSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciAqLwordHlwZWRlZiB1aW50MTZfdCBVSU5UMTZfdDsKKworLyoqIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKi8KK3R5cGVkZWYgdWludDMyX3QgVUlOVDMyX3Q7CisKKy8qKiBBIFBYRSBleGl0IGNvZGUuCisgKgorICogUGVybWl0dGVkIHZhbHVlcyBhcmUgI1BYRU5WX0VYSVRfU1VDQ0VTUyBhbmQgI1BYRU5WX0VYSVRfRkFJTFVSRS4KKyAqCisgKi8KK3R5cGVkZWYgVUlOVDE2X3QgUFhFTlZfRVhJVF90OworI2RlZmluZSBQWEVOVl9FWElUX1NVQ0NFU1MJMHgwMDAwCS8qKjwgTm8gZXJyb3Igb2NjdXJyZWQgKi8KKyNkZWZpbmUgUFhFTlZfRVhJVF9GQUlMVVJFCTB4MDAwMQkvKio8IEFuIGVycm9yIG9jY3VycmVkICovCisKKy8qKiBBIFBYRSBzdGF0dXMgY29kZS4KKyAqCisgKiBTdGF0dXMgY29kZXMgYXJlIGRlZmluZWQgaW4gZXJybm8uaC4KKyAqCisgKi8KK3R5cGVkZWYgVUlOVDE2X3QgUFhFTlZfU1RBVFVTX3Q7CisKKy8qKiBBbiBJUHY0IGFkZHJlc3MuCisgKgorICogQG5vdGUgVGhpcyBkYXRhIHR5cGUgaXMgaW4gbmV0d29yayAoYmlnLWVuZGlhbikgYnl0ZSBvcmRlci4KKyAqCisgKi8KK3R5cGVkZWYgVUlOVDMyX3QgSVA0X3Q7CisKKy8qKiBBIFVEUCBwb3J0LgorICoKKyAqIEBub3RlIFRoaXMgZGF0YSB0eXBlIGlzIGluIG5ldHdvcmsgKGJpZy1lbmRpYW4pIGJ5dGUgb3JkZXIuCisgKgorICovCit0eXBlZGVmIFVJTlQxNl90IFVEUF9QT1JUX3Q7CisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiBhIE1BQyBhZGRyZXNzICovCisjZGVmaW5lIE1BQ19BRERSX0xFTiAxNgorCisvKiogQSBNQUMgYWRkcmVzcyAqLwordHlwZWRlZiBVSU5UOF90IE1BQ19BRERSX3RbTUFDX0FERFJfTEVOXTsKKworI2lmbmRlZiBIQVZFX0FSQ0hfQUREUjMyCisvKiogQSBwaHlzaWNhbCBhZGRyZXNzLgorICoKKyAqIEZvciB4ODYsIHRoaXMgaXMgYSAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcywgYW5kIGlzIHRoZXJlZm9yZQorICogbGltaXRlZCB0byB0aGUgbG93IDRHQi4KKyAqCisgKi8KK3R5cGVkZWYgVUlOVDMyX3QgQUREUjMyX3Q7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0FSQ0hfU0VHU0VMCisvKiogQSBzZWdtZW50IHNlbGVjdG9yLgorICoKKyAqIEZvciB4ODYsIHRoaXMgaXMgYSByZWFsIG1vZGUgc2VnbWVudCAoMHgwMDAwLTB4ZmZmZiksIG9yIGEKKyAqIHByb3RlY3RlZC1tb2RlIHNlZ21lbnQgc2VsZWN0b3IsIHN1Y2ggYXMgY291bGQgYmUgbG9hZGVkIGludG8gYQorICogc2VnbWVudCByZWdpc3Rlci4KKyAqCisgKi8KK3R5cGVkZWYgVUlOVDE2X3QgU0VHU0VMX3Q7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0FSQ0hfT0ZGMTYKKy8qKiBBbiBvZmZzZXQgd2l0aGluIGEgc2VnbWVudCBpZGVudGlmaWVkIGJ5ICNTRUdTRUwKKyAqCisgKiBGb3IgeDg2LCB0aGlzIGlzIGEgMTYtYml0IG9mZnNldC4KKyAqCisgKi8KK3R5cGVkZWYgVUlOVDE2X3QgT0ZGMTZfdDsKKyNlbmRpZgorCisvKiogQSBzZWdtZW50Om9mZnNldCBhZGRyZXNzCisgKgorICogRm9yIHg4NiwgdGhpcyBpcyBhIDE2LWJpdCByZWFsLW1vZGUgb3IgcHJvdGVjdGVkLW1vZGUKKyAqIHNlZ21lbnQ6b2Zmc2V0IGFkZHJlc3MuCisgKgorICovCit0eXBlZGVmIHN0cnVjdCBzX1NFR09GRjE2IHsKKwlPRkYxNl90CQlvZmZzZXQ7CQkvKio8IE9mZnNldCB3aXRoaW4gdGhlIHNlZ21lbnQgKi8KKwlTRUdTRUxfdAlzZWdtZW50OwkvKio8IFNlZ21lbnQgc2VsZWN0b3IgKi8KK30gUEFDS0VEIFNFR09GRjE2X3Q7CisKKy8qKiBBIHNlZ21lbnQgZGVzY3JpcHRvciAqLwordHlwZWRlZiBzdHJ1Y3Qgc19TRUdERVNDIHsKKwlTRUdTRUxfdAlzZWdtZW50X2FkZHJlc3M7CS8qKjwgU2VnbWVudCBzZWxlY3RvciAqLworCUFERFIzMl90CVBoeXNpY2FsX2FkZHJlc3M7CS8qKjwgU2VnbWVudCBiYXNlIGFkZHJlc3MgKi8KKwlPRkYxNl90CQlTZWdfc2l6ZTsJCS8qKjwgU2l6ZSBvZiB0aGUgc2VnbWVudCAqLworfSBQQUNLRUQgU0VHREVTQ190OworCisvKiogQH0gKi8gLyogcHhlX3R5cGVzICovCisKKy8qKiBAfSAqLyAvKiBweGUgKi8KKworI2VuZGlmIC8qIFBYRV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9weGVwYXJlbnQuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3B4ZXBhcmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMWUyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9weGVwYXJlbnQuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIFBYRVBBUkVOVF9ICisjZGVmaW5lIFBYRVBBUkVOVF9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHB4ZV90eXBlcy5oPgorCitleHRlcm4gaW50IHB4ZXBhcmVudF9jYWxsICggU0VHT0ZGMTZfdCBlbnRyeSwgdW5zaWduZWQgaW50IGZ1bmN0aW9uLAorCQkJICAgIHZvaWQgKnBhcmFtcywgc2l6ZV90IHBhcmFtc19sZW4gKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9yZWFsbW9kZS5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvcmVhbG1vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGE4MzBiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvcmVhbG1vZGUuaApAQCAtMCwwICsxLDEyNyBAQAorI2lmbmRlZiBSRUFMTU9ERV9ICisjZGVmaW5lIFJFQUxNT0RFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHJlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorCisvKgorICogRGF0YSBzdHJ1Y3R1cmVzIGFuZCB0eXBlIGRlZmluaXRpb25zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoKKyAqIERlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcyBpbiAuZGF0YTE2CisgKgorICogVG8gcGxhY2UgYSB2YXJpYWJsZSBpbiB0aGUgLmRhdGExNiBzZWdtZW50LCBkZWNsYXJlIGl0IHVzaW5nIHRoZQorICogcGF0dGVybjoKKyAqCisgKiAgIGludCBfX2RhdGExNiAoIGZvbyApOworICogICAjZGVmaW5lIGZvbyBfX3VzZV9kYXRhMTYgKCBmb28gKTsKKyAqCisgKiAgIGV4dGVybiB1aW50MzJfdCBfX2RhdGExNiAoIGJhciApOworICogICAjZGVmaW5lIGJhciBfX3VzZV9kYXRhMTYgKCBiYXIgKTsKKyAqCisgKiAgIHN0YXRpYyBsb25nIF9fZGF0YTE2ICggYmF6ICkgPSAweGZmMDAwMDAwVUw7CisgKiAgICNkZWZpbmUgYmF6IF9fdXNlX2RhdGExNiAoIGJheiApOworICoKKyAqIGkuZS4gdGFrZSBhIG5vcm1hbCBkZWNsYXJhdGlvbiwgYWRkIF9fZGF0YTE2KCkgYXJvdW5kIHRoZSB2YXJpYWJsZQorICogbmFtZSwgYW5kIGFkZCBhIGxpbmUgc2F5aW5nICIjZGVmaW5lIDxuYW1lPiBfX3VzZV9kYXRhMTYgKCA8bmFtZT4gKQorICoKKyAqIFlvdSBjYW4gdGhlbiBhY2Nlc3MgdGhlbSBqdXN0IGxpa2UgYW55IG90aGVyIHZhcmlhYmxlLCBmb3IgZXhhbXBsZQorICoKKyAqICAgaW50IHggPSBmb28gKyBiYXI7CisgKgorICogVGhpcyBtYWdpYyBpcyBhY2hpZXZlZCBhdCBhIGNvc3Qgb2Ygb25seSBhcm91bmQgNyBleHRyYSBieXRlcyBwZXIKKyAqIGdyb3VwIG9mIGFjY2Vzc2VzIHRvIC5kYXRhMTYgdmFyaWFibGVzLiAgV2hlbiB1c2luZyBLRUVQX0lUX1JFQUwsCisgKiB0aGVyZSBpcyBubyBleHRyYSBjb3N0LgorICoKKyAqIFlvdSBzaG91bGQgcGxhY2UgdmFyaWFibGVzIGluIC5kYXRhMTYgd2hlbiB0aGV5IG5lZWQgdG8gYmUgYWNjZXNzZWQKKyAqIGJ5IHJlYWwtbW9kZSBjb2RlLiAgUmVhbC1tb2RlIGFzc2VtYmx5IChlLmcuIGFzIGNyZWF0ZWQgYnkKKyAqIFJFQUxfQ09ERSgpKSBjYW4gYWNjZXNzIHRoZXNlIHZhcmlhYmxlcyB2aWEgdGhlIHVzdWFsIGRhdGEgc2VnbWVudC4KKyAqIFlvdSBjYW4gdGhlcmVmb3JlIHdyaXRlIHNvbWV0aGluZyBsaWtlCisgKgorICogICBzdGF0aWMgdWludDE2X3QgX19kYXRhMTYgKCBmb28gKTsKKyAqICAgI2RlZmluZSBmb28gX191c2VfZGF0YTE2ICggZm9vICkKKyAqCisgKiAgIGludCBiYXIgKCB2b2lkICkgeworICogICAgIF9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggImludCAkMHhmZlxuXHQiCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW92dyAlYXgsIGZvbyIgKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA6ICk7CisgKiAgICAgcmV0dXJuIGZvbzsKKyAqICAgfQorICoKKyAqIFZhcmlhYmxlcyBtYXkgYWxzbyBiZSBwbGFjZWQgaW4gLnRleHQxNiB1c2luZyBfX3RleHQxNiBhbmQKKyAqIF9fdXNlX3RleHQxNi4gIFNvbWUgdmFyaWFibGVzIChlLmcuIGNoYWluZWQgaW50ZXJydXB0IHZlY3RvcnMpIGZpdAorICogbW9zdCBuYXR1cmFsbHkgaW4gLnRleHQxNjsgbW9zdCBzaG91bGQgYmUgaW4gLmRhdGExNi4KKyAqCisgKiBJZiB5b3UgaGF2ZSBvbmx5IGEgcG9pbnRlciB0byBhIG1hZ2ljIHN5bWJvbCB3aXRoaW4gLmRhdGExNiBvcgorICogLnRleHQxNiwgcmF0aGVyIHRoYW4gdGhlIHN5bWJvbCBpdHNlbGYsIHlvdSBjYW4gYXR0ZW1wdCB0byBleHRyYWN0CisgKiB0aGUgdW5kZXJseWluZyBzeW1ib2wgbmFtZSB1c2luZyBfX2Zyb21fZGF0YTE2KCkgb3IKKyAqIF9fZnJvbV90ZXh0MTYoKS4gIFRoaXMgaXMgbm90IGZvciB0aGUgZmFpbnQtaGVhcnRlZDsgY2hlY2sgdGhlCisgKiBhc3NlbWJsZXIgb3V0cHV0IHRvIG1ha2Ugc3VyZSB0aGF0IGl0J3MgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nLgorICovCisKKy8qKgorICogQ29weSBkYXRhIHRvIGJhc2UgbWVtb3J5CisgKgorICogQHYgZGVzdF9zZWcJCURlc3RpbmF0aW9uIHNlZ21lbnQKKyAqIEB2IGRlc3Rfb2ZmCQlEZXN0aW5hdGlvbiBvZmZzZXQKKyAqIEB2IHNyYwkJU291cmNlCisgKiBAdiBsZW4JCUxlbmd0aAorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitjb3B5X3RvX3JlYWwgKCB1bnNpZ25lZCBpbnQgZGVzdF9zZWcsIHVuc2lnbmVkIGludCBkZXN0X29mZiwKKwkgICAgICAgdm9pZCAqc3JjLCBzaXplX3QgbiApIHsKKwljb3B5X3RvX3VzZXIgKCByZWFsX3RvX3VzZXIgKCBkZXN0X3NlZywgZGVzdF9vZmYgKSwgMCwgc3JjLCBuICk7Cit9CisKKy8qKgorICogQ29weSBkYXRhIHRvIGJhc2UgbWVtb3J5CisgKgorICogQHYgZGVzdAkJRGVzdGluYXRpb24KKyAqIEB2IHNyY19zZWcJCVNvdXJjZSBzZWdtZW50CisgKiBAdiBzcmNfb2ZmCQlTb3VyY2Ugb2Zmc2V0CisgKiBAdiBsZW4JCUxlbmd0aAorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitjb3B5X2Zyb21fcmVhbCAoIHZvaWQgKmRlc3QsIHVuc2lnbmVkIGludCBzcmNfc2VnLAorCQkgdW5zaWduZWQgaW50IHNyY19vZmYsIHNpemVfdCBuICkgeworCWNvcHlfZnJvbV91c2VyICggZGVzdCwgcmVhbF90b191c2VyICggc3JjX3NlZywgc3JjX29mZiApLCAwLCBuICk7Cit9CisKKy8qKgorICogV3JpdGUgYSBzaW5nbGUgdmFyaWFibGUgdG8gYmFzZSBtZW1vcnkKKyAqCisgKiBAdiB2YXIJCVZhcmlhYmxlIHRvIHdyaXRlCisgKiBAdiBkZXN0X3NlZwkJRGVzdGluYXRpb24gc2VnbWVudAorICogQHYgZGVzdF9vZmYJCURlc3RpbmF0aW9uIG9mZnNldAorICovCisjZGVmaW5lIHB1dF9yZWFsKCB2YXIsIGRlc3Rfc2VnLCBkZXN0X29mZiApIFwKKwljb3B5X3RvX3JlYWwgKCAoZGVzdF9zZWcpLCAoZGVzdF9vZmYpLCAmKHZhciksIHNpemVvZiAodmFyKSApCisKKy8qKgorICogUmVhZCBhIHNpbmdsZSB2YXJpYWJsZSBmcm9tIGJhc2UgbWVtb3J5CisgKgorICogQHYgdmFyCQlWYXJpYWJsZSB0byByZWFkCisgKiBAdiBzcmNfc2VnCQlTb3VyY2Ugc2VnbWVudAorICogQHYgc3JjX29mZgkJU291cmNlIG9mZnNldAorICovCisjZGVmaW5lIGdldF9yZWFsKCB2YXIsIHNyY19zZWcsIHNyY19vZmYgKSBcCisJY29weV9mcm9tX3JlYWwgKCAmKHZhciksIChzcmNfc2VnKSwgKHNyY19vZmYpLCBzaXplb2YgKHZhcikgKQorCisvKgorICogUkVBTF9DT0RFICggYXNtX2NvZGVfc3RyICkKKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGlubGluZSBhc3NlbWJseSB0byBjcmVhdGUgYSBmcmFnbWVudCBvZiBjb2RlCisgKiB0aGF0IHdpbGwgZXhlY3V0ZSBpbiByZWFsIG1vZGUuICBGb3IgZXhhbXBsZTogdG8gd3JpdGUgYSBjaGFyYWN0ZXIKKyAqIHRvIHRoZSBCSU9TIGNvbnNvbGUgdXNpbmcgSU5UIDEwLCB5b3Ugd291bGQgZG8gc29tZXRoaW5nIGxpa2U6CisgKgorICogICAgIF9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggImludCAkMHgxNiIgKQorICoJCQkgICAgICA6ICI9YSIgKCBjaGFyYWN0ZXIgKSA6ICJhIiAoIDB4MDAwMCApICk7CisgKgorICovCisKKyNlbmRpZiAvKiBSRUFMTU9ERV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9yZWdpc3RlcnMuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3JlZ2lzdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzllMmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9yZWdpc3RlcnMuaApAQCAtMCwwICsxLDE5OCBAQAorI2lmbmRlZiBSRUdJU1RFUlNfSAorI2RlZmluZSBSRUdJU1RFUlNfSAorCisvKiogQGZpbGUKKyAqCisgKiBpMzg2IHJlZ2lzdGVycy4KKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBkYXRhIHN0cnVjdHVyZXMgdGhhdCBhbGxvdyBlYXN5IGFjY2VzcyB0byBpMzg2CisgKiByZWdpc3RlciBkdW1wcy4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogQSAxNi1iaXQgZ2VuZXJhbCByZWdpc3Rlci4KKyAqCisgKiBUaGlzIHR5cGUgZW5jYXBzdWxhdGVzIGEgMTYtYml0IHJlZ2lzdGVyIHN1Y2ggYXMgJWF4LCAlYngsICVjeCwKKyAqICVkeCwgJXNpLCAlZGksICVicCBvciAlc3AuCisgKgorICovCit0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3QgeworCQl1bmlvbiB7CisJCQl1aW50OF90IGw7CisJCQl1aW50OF90IGJ5dGU7CisJCX07CisJCXVpbnQ4X3QgaDsKKwl9IFBBQ0tFRDsKKwl1aW50MTZfdCB3b3JkOworfSBQQUNLRUQgcmVnMTZfdDsKKworLyoqCisgKiBBIDMyLWJpdCBnZW5lcmFsIHJlZ2lzdGVyLgorICoKKyAqIFRoaXMgdHlwZSBlbmNhcHN1bGF0ZXMgYSAzMi1iaXQgcmVnaXN0ZXIgc3VjaCBhcyAlZWF4LCAlZWJ4LCAlZWN4LAorICogJWVkeCwgJWVzaSwgJWVkaSwgJWVicCBvciAlZXNwLgorICoKKyAqLwordHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IHsKKwkJdW5pb24geworCQkJdWludDhfdCBsOworCQkJdWludDhfdCBieXRlOworCQl9OworCQl1aW50OF90IGg7CisJfSBQQUNLRUQ7CisJdWludDE2X3Qgd29yZDsKKwl1aW50MzJfdCBkd29yZDsKK30gUEFDS0VEIHJlZzMyX3Q7CisKKy8qKgorICogQSAzMi1iaXQgZ2VuZXJhbCByZWdpc3RlciBkdW1wLgorICoKKyAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRoYXQgaXMgY3JlYXRlZCBvbiB0aGUgc3RhY2sgYnkgdGhlIEBjCisgKiBwdXNoYWwgaW5zdHJ1Y3Rpb24sIGFuZCBjYW4gYmUgcmVhZCBiYWNrIHVzaW5nIHRoZSBAYyBwb3BhbAorICogaW5zdHJ1Y3Rpb24uCisgKgorICovCitzdHJ1Y3QgaTM4Nl9yZWdzIHsKKwl1bmlvbiB7CisJCXVpbnQxNl90IGRpOworCQl1aW50MzJfdCBlZGk7CisJfTsKKwl1bmlvbiB7CisJCXVpbnQxNl90IHNpOworCQl1aW50MzJfdCBlc2k7CisJfTsKKwl1bmlvbiB7CisJCXVpbnQxNl90IGJwOworCQl1aW50MzJfdCBlYnA7CisJfTsKKwl1bmlvbiB7CisJCXVpbnQxNl90IHNwOworCQl1aW50MzJfdCBlc3A7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IGJsOworCQkJdWludDhfdCBiaDsKKwkJfSBQQUNLRUQ7CisJCXVpbnQxNl90IGJ4OworCQl1aW50MzJfdCBlYng7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IGRsOworCQkJdWludDhfdCBkaDsKKwkJfSBQQUNLRUQ7CisJCXVpbnQxNl90IGR4OworCQl1aW50MzJfdCBlZHg7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IGNsOworCQkJdWludDhfdCBjaDsKKwkJfSBQQUNLRUQ7CisJCXVpbnQxNl90IGN4OworCQl1aW50MzJfdCBlY3g7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IGFsOworCQkJdWludDhfdCBhaDsKKwkJfSBQQUNLRUQ7CisJCXVpbnQxNl90IGF4OworCQl1aW50MzJfdCBlYXg7CisJfTsKK30gUEFDS0VEOworCisvKioKKyAqIEEgc2VnbWVudCByZWdpc3RlciBkdW1wLgorICoKKyAqIFRoZSBpMzg2IGhhcyBubyBlcXVpdmFsZW50IG9mIHRoZSBAYyBwdXNoYWwgb3IgQGMgcG9wYWwKKyAqIGluc3RydWN0aW9ucyBmb3IgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzLiAgV2UgYWRvcHQgdGhlIGNvbnZlbnRpb24gb2YKKyAqIGFsd2F5cyB1c2luZyB0aGUgc2VxdWVuY2VzCisgKgorICogQGNvZGUKKyAqCisgKiAgIHB1c2h3ICVncyA7IHB1c2h3ICVmcyA7IHB1c2h3ICVlcyA7IHB1c2h3ICVkcyA7IHB1c2h3ICVzcyA7IHB1c2h3ICVjcworICoKKyAqIEBlbmRjb2RlCisgKgorICogYW5kCisgKgorICogQGNvZGUKKyAqCisgKiAgIGFkZHcgJDQsICVzcCA7IHBvcHcgJWRzIDsgcG9wdyAlZXMgOyBwb3B3ICVmcyA7IHBvcHcgJWdzCisgKgorICogQGVuZGNvZGUKKyAqCisgKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIGNyZWF0ZWQgYW5kIHJlYWQgYmFjayBieSB0aGVzZQorICogaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzLgorICoKKyAqLworc3RydWN0IGkzODZfc2VnX3JlZ3MgeworCXVpbnQxNl90IGNzOworCXVpbnQxNl90IHNzOworCXVpbnQxNl90IGRzOworCXVpbnQxNl90IGVzOworCXVpbnQxNl90IGZzOworCXVpbnQxNl90IGdzOworfSBQQUNLRUQ7CisKKy8qKgorICogQSBmdWxsIHJlZ2lzdGVyIGR1bXAuCisgKgorICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBjcmVhdGVkIGJ5IHRoZSBpbnN0cnVjdGlvbnMKKyAqCisgKiBAY29kZQorICoKKyAqICAgcHVzaGZsCisgKiAgIHB1c2hhbAorICogICBwdXNodyAlZ3MgOyBwdXNodyAlZnMgOyBwdXNodyAlZXMgOyBwdXNodyAlZHMgOyBwdXNodyAlc3MgOyBwdXNodyAlY3MKKyAqCisgKiBAZW5kY29kZQorICoKKyAqIGFuZCBjYW4gYmUgcmVhZCBiYWNrIHVzaW5nIHRoZSBpbnN0cnVjdGlvbnMKKyAqCisgKiBAY29kZQorICoKKyAqICAgYWRkdyAkNCwgJXNwIDsgcG9wdyAlZHMgOyBwb3B3ICVlcyA7IHBvcHcgJWZzIDsgcG9wdyAlZ3MKKyAqICAgcG9wYWwKKyAqICAgcG9wZmwKKyAqCisgKiBAZW5kY29kZQorICoKKyAqIHByb3RfY2FsbCgpIGFuZCBraXJfY2FsbCgpIGNyZWF0ZSB0aGlzIGRhdGEgc3RydWN0dXJlIG9uIHRoZSBzdGFjaworICogYW5kIHBhc3MgaW4gYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLgorICoKKyAqLworc3RydWN0IGkzODZfYWxsX3JlZ3MgeworCXN0cnVjdCBpMzg2X3NlZ19yZWdzIHNlZ3M7CisJc3RydWN0IGkzODZfcmVncyByZWdzOworCXVpbnQzMl90IGZsYWdzOworfSBQQUNLRUQ7CisKKy8qIEZsYWdzICovCisjZGVmaW5lIENGICggMSA8PCAgMCApCisjZGVmaW5lIFBGICggMSA8PCAgMiApCisjZGVmaW5lIEFGICggMSA8PCAgNCApCisjZGVmaW5lIFpGICggMSA8PCAgNiApCisjZGVmaW5lIFNGICggMSA8PCAgNyApCisjZGVmaW5lIE9GICggMSA8PCAxMSApCisKKy8qIFNlZ21lbnQ6b2Zmc2V0IHN0cnVjdHVyZS4gIE5vdGUgdGhhdCB0aGUgb3JkZXIgd2l0aGluIHRoZSBzdHJ1Y3R1cmUKKyAqIGlzIG9mZnNldDpzZWdtZW50LgorICovCitzdHJ1Y3Qgc2Vnb2ZmIHsKKwl1aW50MTZfdCBvZmZzZXQ7CisJdWludDE2X3Qgc2VnbWVudDsKK30gUEFDS0VEOworCit0eXBlZGVmIHN0cnVjdCBzZWdvZmYgc2Vnb2ZmX3Q7CisKKyNlbmRpZiAvKiBSRUdJU1RFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvc2V0am1wLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS9zZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDNjMTFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvc2V0am1wLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBFVEhFUkJPT1RfU0VUSk1QX0gKKyNkZWZpbmUgRVRIRVJCT09UX1NFVEpNUF9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisKKy8qKiBBIGp1bXAgYnVmZmVyICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgcmV0YWRkcjsKKwl1aW50MzJfdCBlYng7CisJdWludDMyX3QgZXNwOworCXVpbnQzMl90IGVicDsKKwl1aW50MzJfdCBlc2k7CisJdWludDMyX3QgZWRpOworfSBqbXBfYnVmWzFdOworCisvKiogQSByZWFsLW1vZGUtZXh0ZW5kZWQganVtcCBidWZmZXIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlqbXBfYnVmIGVudjsKKwl1aW50MTZfdCBybV9zczsKKwl1aW50MTZfdCBybV9zcDsKK30gcm1qbXBfYnVmWzFdOworCitleHRlcm4gaW50IF9fYXNtY2FsbCBzZXRqbXAgKCBqbXBfYnVmIGVudiApOworZXh0ZXJuIHZvaWQgX19hc21jYWxsIGxvbmdqbXAgKCBqbXBfYnVmIGVudiwgaW50IHZhbCApOworCisjZGVmaW5lIHJtc2V0am1wKCBfZW52ICkgKCB7CQkJXAorCShfZW52KS0+cm1fc3MgPSBybV9zczsJCQlcCisJKF9lbnYpLT5ybV9zcCA9IHJtX3NwOwkJCVwKKwlzZXRqbXAgKCAoX2VudiktPmVudiApOyB9ICkJCVwKKworI2RlZmluZSBybWxvbmdqbXAoIF9lbnYsIF92YWwgKSBkbyB7CQlcCisJcm1fc3MgPSAoX2VudiktPnJtX3NzOwkJCVwKKwlybV9zcCA9IChfZW52KS0+cm1fc3A7CQkJXAorCWxvbmdqbXAgKCAoX2VudiktPmVudiwgKF92YWwpICk7CVwKKwl9IHdoaWxlICggMCApCisKKyNlbmRpZiAvKiBFVEhFUkJPT1RfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3VuZGkuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3VuZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTY5MjViCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvdW5kaS5oCkBAIC0wLDAgKzEsMTA2IEBACisjaWZuZGVmIF9VTkRJX0gKKyNkZWZpbmUgX1VORElfSAorCisvKiogQGZpbGUKKyAqCisgKiBVTkRJIGRyaXZlcgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZm5kZWYgQVNTRU1CTFkKKworI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisjaW5jbHVkZSA8cHhlX3R5cGVzLmg+CisKKy8qKiBBbiBVTkRJIGRldmljZQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgYXNzZW1ibHkgY29kZSBhcyB3ZWxsIGFzIEM7IGRvIG5vdCBhbHRlcgorICogdGhpcyBzdHJ1Y3R1cmUgd2l0aG91dCBlZGl0aW5nIHB4ZXByZWZpeC5TIHRvIG1hdGNoLgorICovCitzdHJ1Y3QgdW5kaV9kZXZpY2UgeworCS8qKiBQWEVOVisgc3RydWN0dXJlIGFkZHJlc3MgKi8KKwlTRUdPRkYxNl90IHB4ZW52OworCS8qKiAhUFhFIHN0cnVjdHVyZSBhZGRyZXNzICovCisJU0VHT0ZGMTZfdCBwcHhlOworCS8qKiBFbnRyeSBwb2ludCAqLworCVNFR09GRjE2X3QgZW50cnk7CisJLyoqIEZyZWUgYmFzZSBtZW1vcnkgYWZ0ZXIgbG9hZCAqLworCVVJTlQxNl90IGZibXM7CisJLyoqIEZyZWUgYmFzZSBtZW1vcnkgcHJpb3IgdG8gbG9hZCAqLworCVVJTlQxNl90IHJlc3RvcmVfZmJtczsKKwkvKiogUENJIGJ1czpkZXYuZm4sIG9yIEBjIFVORElfTk9fUENJX0JVU0RFVkZOICovCisJVUlOVDE2X3QgcGNpX2J1c2RldmZuOworCS8qKiBJU0FQblAgY2FyZCBzZWxlY3QgbnVtYmVyLCBvciBAYyBVTkRJX05PX0lTQVBOUF9DU04gKi8KKwlVSU5UMTZfdCBpc2FwbnBfY3NuOworCS8qKiBJU0FQblAgcmVhZCBwb3J0LCBvciBAYyBVTkRJX05PX0lTQVBOUF9SRUFEX1BPUlQgKi8KKwlVSU5UMTZfdCBpc2FwbnBfcmVhZF9wb3J0OworCS8qKiBQQ0kgdmVuZG9yIElECisJICoKKwkgKiBGaWxsZWQgaW4gb25seSBmb3IgdGhlIHByZWxvYWRlZCBVTkRJIGRldmljZSBieSBweGVwcmVmaXguUworCSAqLworCVVJTlQxNl90IHBjaV92ZW5kb3I7CisJLyoqIFBDSSBkZXZpY2UgSUQgCisJICoKKwkgKiBGaWxsZWQgaW4gb25seSBmb3IgdGhlIHByZWxvYWRlZCBVTkRJIGRldmljZSBieSBweGVwcmVmaXguUworCSAqLworCVVJTlQxNl90IHBjaV9kZXZpY2U7CisJLyoqIEZsYWdzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBiaXR3aXNlIE9SIG9mIHplcm8gb3IgbW9yZSBVTkRJX0ZMX1hYWAorCSAqIGNvbnN0YW50cy4KKwkgKi8KKwlVSU5UMTZfdCBmbGFnczsKKworCS8qKiBHZW5lcmljIGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UgZGV2OworCS8qKiBEcml2ZXItcHJpdmF0ZSBkYXRhCisJICoKKwkgKiBVc2UgdW5kaV9zZXRfZHJ2ZGF0YSgpIGFuZCB1bmRpX2dldF9kcnZkYXRhKCkgdG8gYWNjZXNzIHRoaXMKKwkgKiBmaWVsZC4KKwkgKi8KKwl2b2lkICpwcml2OworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqCisgKiBTZXQgVU5ESSBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgdW5kaQkJVU5ESSBkZXZpY2UKKyAqIEB2IHByaXYJCVByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdW5kaV9zZXRfZHJ2ZGF0YSAoIHN0cnVjdCB1bmRpX2RldmljZSAqdW5kaSwgdm9pZCAqcHJpdiApIHsKKwl1bmRpLT5wcml2ID0gcHJpdjsKK30KKworLyoqCisgKiBHZXQgVU5ESSBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgdW5kaQkJVU5ESSBkZXZpY2UKKyAqIEByZXQgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqIHVuZGlfZ2V0X2RydmRhdGEgKCBzdHJ1Y3QgdW5kaV9kZXZpY2UgKnVuZGkgKSB7CisJcmV0dXJuIHVuZGktPnByaXY7Cit9CisKKyNlbmRpZiAvKiBBU1NFTUJMWSAqLworCisvKiogUENJIGJ1czpkZXYuZm4gZmllbGQgaXMgaW52YWxpZCAqLworI2RlZmluZSBVTkRJX05PX1BDSV9CVVNERVZGTiAweGZmZmYKKworLyoqIElTQVBuUCBjYXJkIHNlbGVjdCBudW1iZXIgZmllbGQgaXMgaW52YWxpZCAqLworI2RlZmluZSBVTkRJX05PX0lTQVBOUF9DU04gMHhmZmZmCisKKy8qKiBJU0FQblAgcmVhZCBwb3J0IGZpZWxkIGlzIGludmFsaWQgKi8KKyNkZWZpbmUgVU5ESV9OT19JU0FQTlBfUkVBRF9QT1JUIDB4ZmZmZgorCisvKiogVU5ESSBmbGFnOiBTVEFSVF9VTkRJIGhhcyBiZWVuIGNhbGxlZCAqLworI2RlZmluZSBVTkRJX0ZMX1NUQVJURUQgMHgwMDAxCisKKy8qKiBVTkRJIGZsYWc6IFVORElfU1RBUlRVUCBhbmQgVU5ESV9JTklUSUFMSVpFIGhhdmUgYmVlbiBjYWxsZWQgKi8KKyNkZWZpbmUgVU5ESV9GTF9JTklUSUFMSVpFRCAweDAwMDIKKworLyoqIFVOREkgZmxhZzoga2VlcCBzdGFjayByZXNpZGVudCAqLworI2RlZmluZSBVTkRJX0ZMX0tFRVBfQUxMIDB4MDAwNAorCisjZW5kaWYgLyogX1VORElfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvdW5kaWxvYWQuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3VuZGlsb2FkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2ODMwZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3VuZGlsb2FkLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBfVU5ESUxPQURfSAorI2RlZmluZSBfVU5ESUxPQURfSAorCisvKiogQGZpbGUKKyAqCisgKiBVTkRJIGxvYWQvdW5sb2FkCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RydWN0IHVuZGlfZGV2aWNlOworc3RydWN0IHVuZGlfcm9tOworCitleHRlcm4gaW50IHVuZGlfbG9hZCAoIHN0cnVjdCB1bmRpX2RldmljZSAqdW5kaSwgc3RydWN0IHVuZGlfcm9tICp1bmRpcm9tICk7CitleHRlcm4gaW50IHVuZGlfdW5sb2FkICggc3RydWN0IHVuZGlfZGV2aWNlICp1bmRpICk7CisKKy8qKgorICogQ2FsbCBVTkRJIGxvYWRlciB0byBjcmVhdGUgYSBwaXhpZQorICoKKyAqIEB2IHVuZGkJCVVOREkgZGV2aWNlCisgKiBAdiB1bmRpcm9tCQlVTkRJIFJPTQorICogQHYgcGNpX2J1c2RldmZuCVBDSSBidXM6ZGV2LmZuCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBpbnQgdW5kaV9sb2FkX3BjaSAoIHN0cnVjdCB1bmRpX2RldmljZSAqdW5kaSwKKwkJCQkgIHN0cnVjdCB1bmRpX3JvbSAqdW5kaXJvbSwKKwkJCQkgIHVuc2lnbmVkIGludCBwY2lfYnVzZGV2Zm4gKSB7CisJdW5kaS0+cGNpX2J1c2RldmZuID0gcGNpX2J1c2RldmZuOworCXVuZGktPmlzYXBucF9jc24gPSBVTkRJX05PX0lTQVBOUF9DU047CisJdW5kaS0+aXNhcG5wX3JlYWRfcG9ydCA9IFVORElfTk9fSVNBUE5QX1JFQURfUE9SVDsKKwlyZXR1cm4gdW5kaV9sb2FkICggdW5kaSwgdW5kaXJvbSApOworfQorCisjZW5kaWYgLyogX1VORElMT0FEX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3VuZGluZXQuaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3VuZGluZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2MxN2MxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvdW5kaW5ldC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX1VORElORVRfSAorI2RlZmluZSBfVU5ESU5FVF9ICisKKy8qKiBAZmlsZQorICoKKyAqIFVOREkgbmV0d29yayBkZXZpY2UgZHJpdmVyCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RydWN0IHVuZGlfZGV2aWNlOworCitleHRlcm4gaW50IHVuZGluZXRfcHJvYmUgKCBzdHJ1Y3QgdW5kaV9kZXZpY2UgKnVuZGkgKTsKK2V4dGVybiB2b2lkIHVuZGluZXRfcmVtb3ZlICggc3RydWN0IHVuZGlfZGV2aWNlICp1bmRpICk7CisKKyNlbmRpZiAvKiBfVU5ESU5FVF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS91bmRpcHJlbG9hZC5oIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvdW5kaXByZWxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTliOGZiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvdW5kaXByZWxvYWQuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9VTkRJUFJFTE9BRF9ICisjZGVmaW5lIF9VTkRJUFJFTE9BRF9ICisKKy8qKiBAZmlsZQorICoKKyAqIFByZWxvYWRlZCBVTkRJIHN0YWNrCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8dW5kaS5oPgorCitleHRlcm4gc3RydWN0IHVuZGlfZGV2aWNlIF9fZGF0YTE2ICggcHJlbG9hZGVkX3VuZGkgKTsKKyNkZWZpbmUgcHJlbG9hZGVkX3VuZGkgX191c2VfZGF0YTE2ICggcHJlbG9hZGVkX3VuZGkgKQorCisjZW5kaWYgLyogX1VORElQUkVMT0FEX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3VuZGlyb20uaCBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbmNsdWRlL3VuZGlyb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQ3MDc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvdW5kaXJvbS5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX1VORElST01fSAorI2RlZmluZSBfVU5ESVJPTV9ICisKKy8qKiBAZmlsZQorICoKKyAqIFVOREkgZXhwYW5zaW9uIFJPTXMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8cHhlX3R5cGVzLmg+CisKKy8qKiBBbiBVTkRJIFBDSSBkZXZpY2UgSUQgKi8KK3N0cnVjdCB1bmRpX3BjaV9kZXZpY2VfaWQgeworCS8qKiBQQ0kgdmVuZG9yIElEICovCisJdW5zaWduZWQgaW50IHZlbmRvcl9pZDsKKwkvKiogUENJIGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludCBkZXZpY2VfaWQ7Cit9OworCisvKiogQW4gVU5ESSBkZXZpY2UgSUQgKi8KK3VuaW9uIHVuZGlfZGV2aWNlX2lkIHsKKwkvKiogUENJIGRldmljZSBJRCAqLworCXN0cnVjdCB1bmRpX3BjaV9kZXZpY2VfaWQgcGNpOworfTsKKworLyoqIEFuIFVOREkgUk9NICovCitzdHJ1Y3QgdW5kaV9yb20geworCS8qKiBMaXN0IG9mIFVOREkgUk9NcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwkvKiogUk9NIHNlZ21lbnQgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCByb21fc2VnbWVudDsKKwkvKiogVU5ESSBsb2FkZXIgZW50cnkgcG9pbnQgKi8KKwlTRUdPRkYxNl90IGxvYWRlcl9lbnRyeTsKKwkvKiogQ29kZSBzZWdtZW50IHNpemUgKi8KKwlzaXplX3QgY29kZV9zaXplOworCS8qKiBEYXRhIHNlZ21lbnQgc2l6ZSAqLworCXNpemVfdCBkYXRhX3NpemU7CisJLyoqIEJ1cyB0eXBlCisJICoKKwkgKiBWYWx1ZXMgYXJlIGFzIHVzZWQgYnkgQGMgUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUKKwkgKi8KKwl1bnNpZ25lZCBpbnQgYnVzX3R5cGU7CisJLyoqIERldmljZSBJRCAqLworCXVuaW9uIHVuZGlfZGV2aWNlX2lkIGJ1c19pZDsKK307CisKK2V4dGVybiBzdHJ1Y3QgdW5kaV9yb20gKiB1bmRpcm9tX2ZpbmRfcGNpICggdW5zaWduZWQgaW50IHZlbmRvcl9pZCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCBkZXZpY2VfaWQsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgcm9tYmFzZSApOworCisjZW5kaWYgLyogX1VORElST01fSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvdmdhLmggYi9ncHhlL3NyYy9hcmNoL2kzODYvaW5jbHVkZS92Z2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZjMzlkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2luY2x1ZGUvdmdhLmgKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKgorICogbW9kaWZpZWQKKyAqIGJ5IFN0ZXZlIE0uIEdlaGxiYWNoIDxzdGV2ZUBrZXNhLmNvbT4KKyAqCisgKiBPcmlnaW5hbGx5ICBmcm9tIGxpbnV4L2RyaXZlcnMvdmlkZW8vdmdhMTYuYyBieQorICogQmVuIFBmYWZmIDxwZmFmZmJlbkBkZWJpYW4ub3JnPiBhbmQgUGV0ciBWYW5kcm92ZWMgPFZBTkRST1ZFQHZjLmN2dXQuY3o+CisgKiBDb3B5cmlnaHQgMTk5OSBCZW4gUGZhZmYgPHBmYWZmYmVuQGRlYmlhbi5vcmc+IGFuZCBQZXRyIFZhbmRyb3ZlYyA8VkFORFJPVkVAdmMuY3Z1dC5jej4KKyAqIEJhc2VkIG9uIFZHQSBpbmZvIGF0IGh0dHA6Ly93d3cuZ29vZG5ldC5jb20vfnRpbmFyYS9GcmVlVkdBL2hvbWUuaHRtCisgKiBCYXNlZCBvbiBWRVNBIGZyYW1lYnVmZmVyIChjKSAxOTk4IEdlcmQgS25vcnIgPGtyYXhlbEBnb2xkYmFjaC5pbi1iZXJsaW4uZGU+CisgKgorICovIAorCisjaWZuZGVmIFZHQV9IX0lOQ0wKKyNkZWZpbmUgVkdBX0hfSU5DTCAxCisKKy8vI2luY2x1ZGUgPGNwdS9wNS9pby5oPgorCisjZGVmaW5lIHU4IHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgdTE2IHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIHUzMiB1bnNpZ25lZCBpbnQKKyNkZWZpbmUgX191MzIgdTMyCisKKyNkZWZpbmUgVkVSUk9SIC0xCisjZGVmaW5lIENIQVJfSEVJR0hUIDE2CisjZGVmaW5lIExJTkVTIDI1CisjZGVmaW5lIENPTFMgODAKKworLy8gbWFjcm9zIGZvciB3cml0aW5nIHRvIHZnYSByZWdzCisjZGVmaW5lIHdyaXRlX2NydGMoZGF0YSxhZGRyKSBvdXRiKGFkZHIsQ1JUX0lDKTsgb3V0YihkYXRhLENSVF9EQykKKyNkZWZpbmUgd3JpdGVfYXR0KGRhdGEsYWRkcikgaW5iKElTMV9SQyk7IGluYigweDgwKTsgb3V0YihhZGRyLEFUVF9JVyk7IGluYigweDgwKTsgb3V0YihkYXRhLEFUVF9JVyk7IGluYigweDgwKQorI2RlZmluZSB3cml0ZV9zZXEoZGF0YSxhZGRyKSBvdXRiKGFkZHIsU0VRX0kpOyBvdXRiKGRhdGEsU0VRX0QpCisjZGVmaW5lIHdyaXRlX2dyYShkYXRhLGFkZHIpIG91dGIoYWRkcixHUkFfSSk7IG91dGIoZGF0YSxHUkFfRCkKK3U4IHJlYWRfc2VxX2IodTE2IGFkZHIpOwordTggcmVhZF9ncmFfYih1MTYgYWRkcik7Cit1OCByZWFkX2NydGNfYih1MTYgYWRkcik7Cit1OCByZWFkX2F0dF9iKHUxNiBhZGRyKTsKKworCisjaWZkZWYgVkdBX0hBUkRXQVJFX0ZJWFVQCit2b2lkIHZnYV9oYXJkd2FyZV9maXh1cCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHZnYV9oYXJkd2FyZV9maXh1cCgpIGRve30gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIFNZTkNfSE9SX0hJR0hfQUNUICAgIDEgICAgICAgLyogaG9yaXpvbnRhbCBzeW5jIGhpZ2ggYWN0aXZlICAqLworI2RlZmluZSBTWU5DX1ZFUlRfSElHSF9BQ1QgICAyICAgICAgIC8qIHZlcnRpY2FsIHN5bmMgaGlnaCBhY3RpdmUgICAgKi8KKyNkZWZpbmUgU1lOQ19FWFQgICAgICAgICAgICAgNCAgICAgICAvKiBleHRlcm5hbCBzeW5jICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZTkNfQ09NUF9ISUdIX0FDVCAgIDggICAgICAgLyogY29tcG9zaXRlIHN5bmMgaGlnaCBhY3RpdmUgICAqLworI2RlZmluZSBTWU5DX0JST0FEQ0FTVCAgICAgICAxNiAgICAgIC8qIGJyb2FkY2FzdCB2aWRlbyB0aW1pbmdzICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2dG90YWwgPSAxNDRkLzI4OG4vNTc2aSA9PiBQQUwgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnRvdGFsID0gMTIxZC8yNDJuLzQ4NGkgPT4gTlRTQyAqLworCisjZGVmaW5lIFNZTkNfT05fR1JFRU4gICAgICAgIDMyICAgICAgLyogc3luYyBvbiBncmVlbiAqLworCisjZGVmaW5lIFZNT0RFX05PTklOVEVSTEFDRUQgIDAgICAgICAgLyogbm9uIGludGVybGFjZWQgKi8KKyNkZWZpbmUgVk1PREVfSU5URVJMQUNFRCAgICAgMSAgICAgICAvKiBpbnRlcmxhY2VkICAgKi8KKyNkZWZpbmUgVk1PREVfRE9VQkxFICAgICAgICAgMiAgICAgICAvKiBkb3VibGUgc2NhbiAqLworI2RlZmluZSBWTU9ERV9NQVNLICAgICAgICAgICAyNTUKKworI2RlZmluZSBWTU9ERV9ZV1JBUCAgICAgICAgICAyNTYgICAgIC8qIHl3cmFwIGluc3RlYWQgb2YgcGFubmluZyAgICAgKi8KKyNkZWZpbmUgVk1PREVfU01PT1RIX1hQQU4gICAgNTEyICAgICAvKiBzbW9vdGggeHBhbiBwb3NzaWJsZSAoaW50ZXJuYWxseSB1c2VkKSAqLworI2RlZmluZSBWTU9ERV9DT05VUERBVEUgICAgICA1MTIgICAgIC8qIGRvbid0IHVwZGF0ZSB4L3lvZmZzZXQgICAgICAgKi8KKworLyogVkdBIGRhdGEgcmVnaXN0ZXIgcG9ydHMgKi8KKyNkZWZpbmUgQ1JUX0RDICAweDNENSAgICAgICAgICAgLyogQ1JUIENvbnRyb2xsZXIgRGF0YSBSZWdpc3RlciAtIGNvbG9yIGVtdWxhdGlvbiAqLworI2RlZmluZSBDUlRfRE0gIDB4M0I1ICAgICAgICAgICAvKiBDUlQgQ29udHJvbGxlciBEYXRhIFJlZ2lzdGVyIC0gbW9ubyBlbXVsYXRpb24gKi8KKyNkZWZpbmUgQVRUX1IgICAweDNDMSAgICAgICAgICAgLyogQXR0cmlidXRlIENvbnRyb2xsZXIgRGF0YSBSZWFkIFJlZ2lzdGVyICovCisjZGVmaW5lIEdSQV9EICAgMHgzQ0YgICAgICAgICAgIC8qIEdyYXBoaWNzIENvbnRyb2xsZXIgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBTRVFfRCAgIDB4M0M1ICAgICAgICAgICAvKiBTZXF1ZW5jZXIgRGF0YSBSZWdpc3RlciAqLworCisjZGVmaW5lIE1JU19SICAgMHgzQ0MgICAgICAgICAgIC8vIE1pc2MgT3V0cHV0IFJlYWQgUmVnaXN0ZXIKKyNkZWZpbmUgTUlTX1cgICAweDNDMiAgICAgICAgICAgLy8gTWlzYyBPdXRwdXQgV3JpdGUgUmVnaXN0ZXIKKworI2RlZmluZSBJUzFfUkMgIDB4M0RBICAgICAgICAgICAvKiBJbnB1dCBTdGF0dXMgUmVnaXN0ZXIgMSAtIGNvbG9yIGVtdWxhdGlvbiAqLworI2RlZmluZSBJUzFfUk0gIDB4M0JBICAgICAgICAgICAvKiBJbnB1dCBTdGF0dXMgUmVnaXN0ZXIgMSAtIG1vbm8gZW11bGF0aW9uICovCisjZGVmaW5lIFBFTF9EICAgMHgzQzkgICAgICAgICAgIC8qIFBFTCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIFBFTF9NU0sgMHgzQzYgICAgICAgICAgIC8qIFBFTCBtYXNrIHJlZ2lzdGVyICovCisKKy8qIEVHQS1zcGVjaWZpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1JBX0UwICAweDNDQyAgICAgICAgICAgLyogR3JhcGhpY3MgZW5hYmxlIHByb2Nlc3NvciAwICovCisjZGVmaW5lIEdSQV9FMSAgMHgzQ0EgICAgICAgICAgIC8qIEdyYXBoaWNzIGVuYWJsZSBwcm9jZXNzb3IgMSAqLworCisKKy8qIFZHQSBpbmRleCByZWdpc3RlciBwb3J0cyAqLworI2RlZmluZSBDUlRfSUMgIDB4M0Q0ICAgICAgICAgICAvKiBDUlQgQ29udHJvbGxlciBJbmRleCAtIGNvbG9yIGVtdWxhdGlvbiAqLworI2RlZmluZSBDUlRfSU0gIDB4M0I0ICAgICAgICAgICAvKiBDUlQgQ29udHJvbGxlciBJbmRleCAtIG1vbm8gZW11bGF0aW9uICovCisjZGVmaW5lIEFUVF9JVyAgMHgzQzAgICAgICAgICAgIC8qIEF0dHJpYnV0ZSBDb250cm9sbGVyIEluZGV4ICYgRGF0YSBXcml0ZSBSZWdpc3RlciAqLworI2RlZmluZSBHUkFfSSAgIDB4M0NFICAgICAgICAgICAvKiBHcmFwaGljcyBDb250cm9sbGVyIEluZGV4ICovCisjZGVmaW5lIFNFUV9JICAgMHgzQzQgICAgICAgICAgIC8qIFNlcXVlbmNlciBJbmRleCAqLworI2RlZmluZSBQRUxfSVcgIDB4M0M4ICAgICAgICAgICAvKiBQRUwgV3JpdGUgSW5kZXggKi8KKyNkZWZpbmUgUEVMX0lSICAweDNDNyAgICAgICAgICAgLyogUEVMIFJlYWQgSW5kZXggKi8KKworLyogc3RhbmRhcmQgVkdBIGluZGV4ZXMgbWF4IGNvdW50cyAqLworI2RlZmluZSBDUlRDX0MgICAyNSAgICAgICAgICAgICAgLyogMjUgQ1JUIENvbnRyb2xsZXIgUmVnaXN0ZXJzIHNlcXVlbnRpYWxseSBzZXQqLworCQkJCQkJCQkgLy8gdGhlIHJlbWFpbmRlciBhcmUgbm90IGluIHRoZSBwYXIgYXJyYXkKKyNkZWZpbmUgQVRUX0MgICAyMSAgICAgICAgICAgICAgLyogMjEgQXR0cmlidXRlIENvbnRyb2xsZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdSQV9DICAgOSAgICAgICAgICAgICAgIC8qIDkgIEdyYXBoaWNzIENvbnRyb2xsZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIFNFUV9DICAgNSAgICAgICAgICAgICAgIC8qIDUgIFNlcXVlbmNlciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUlTX0MgICAxICAgICAgICAgICAgICAgLyogMSAgTWlzYyBPdXRwdXQgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBDUlRDX0hfVE9UQUwgICAgICAgICAgICAwCisjZGVmaW5lIENSVENfSF9ESVNQICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUQ19IX0JMQU5LX1NUQVJUICAgICAgMgorI2RlZmluZSBDUlRDX0hfQkxBTktfRU5EICAgICAgICAzCisjZGVmaW5lIENSVENfSF9TWU5DX1NUQVJUICAgICAgIDQKKyNkZWZpbmUgQ1JUQ19IX1NZTkNfRU5EICAgICAgICAgNQorI2RlZmluZSBDUlRDX1ZfVE9UQUwgICAgICAgICAgICA2CisjZGVmaW5lIENSVENfT1ZFUkZMT1cgICAgICAgICAgIDcKKyNkZWZpbmUgQ1JUQ19QUkVTRVRfUk9XICAgICAgICAgOAorI2RlZmluZSBDUlRDX01BWF9TQ0FOICAgICAgICAgICA5CisjZGVmaW5lIENSVENfQ1VSU09SX1NUQVJUICAgICAgIDB4MEEKKyNkZWZpbmUgQ1JUQ19DVVJTT1JfRU5EICAgICAgICAgMHgwQgorI2RlZmluZSBDUlRDX1NUQVJUX0hJICAgICAgICAgICAweDBDCisjZGVmaW5lIENSVENfU1RBUlRfTE8gICAgICAgICAgIDB4MEQKKyNkZWZpbmUgQ1JUQ19DVVJTT1JfSEkgICAgICAgICAgMHgwRQorI2RlZmluZSBDUlRDX0NVUlNPUl9MTyAgICAgICAgICAweDBGCisjZGVmaW5lIENSVENfVl9TWU5DX1NUQVJUICAgICAgIDB4MTAKKyNkZWZpbmUgQ1JUQ19WX1NZTkNfRU5EICAgICAgICAgMHgxMQorI2RlZmluZSBDUlRDX1ZfRElTUF9FTkQgICAgICAgICAweDEyCisjZGVmaW5lIENSVENfT0ZGU0VUICAgICAgICAgICAgIDB4MTMKKyNkZWZpbmUgQ1JUQ19VTkRFUkxJTkUgICAgICAgICAgMHgxNAorI2RlZmluZSBDUlRDX1ZfQkxBTktfU1RBUlQgICAgICAweDE1CisjZGVmaW5lIENSVENfVl9CTEFOS19FTkQgICAgICAgIDB4MTYKKyNkZWZpbmUgQ1JUQ19NT0RFICAgICAgICAgICAgICAgMHgxNworI2RlZmluZSBDUlRDX0xJTkVfQ09NUEFSRSAgICAgICAweDE4CisKKyNkZWZpbmUgQVRDX01PREUgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBBVENfT1ZFUlNDQU4gICAgICAgICAgICAweDExCisjZGVmaW5lIEFUQ19QTEFORV9FTkFCTEUgICAgICAgIDB4MTIKKyNkZWZpbmUgQVRDX1BFTCAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBBVENfQ09MT1JfUEFHRSAgICAgICAgICAweDE0CisKKyNkZWZpbmUgU0VRX0NMT0NLX01PREUgICAgICAgICAgMHgwMQorI2RlZmluZSBTRVFfUExBTkVfV1JJVEUgICAgICAgICAweDAyCisjZGVmaW5lIFNFUV9DSEFSQUNURVJfTUFQICAgICAgIDB4MDMKKyNkZWZpbmUgU0VRX01FTU9SWV9NT0RFICAgICAgICAgMHgwNAorCisjZGVmaW5lIEdEQ19TUl9WQUxVRSAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgR0RDX1NSX0VOQUJMRSAgICAgICAgICAgMHgwMQorI2RlZmluZSBHRENfQ09NUEFSRV9WQUxVRSAgICAgICAweDAyCisjZGVmaW5lIEdEQ19EQVRBX1JPVEFURSAgICAgICAgIDB4MDMKKyNkZWZpbmUgR0RDX1BMQU5FX1JFQUQgICAgICAgICAgMHgwNAorI2RlZmluZSBHRENfTU9ERSAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEdEQ19NSVNDICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgR0RDX0NPTVBBUkVfTUFTSyAgICAgICAgMHgwNworI2RlZmluZSBHRENfQklUX01BU0sgICAgICAgICAgICAweDA4CisKKy8vIHRleHQgYXR0cmlidXRlcworI2RlZmluZSBWR0FfQVRUUl9DTFJfUkVEIDB4NAorI2RlZmluZSBWR0FfQVRUUl9DTFJfR1JOIDB4MgorI2RlZmluZSBWR0FfQVRUUl9DTFJfQkxVIDB4MQorI2RlZmluZSBWR0FfQVRUUl9DTFJfWUVMIChWR0FfQVRUUl9DTFJfUkVEIHwgVkdBX0FUVFJfQ0xSX0dSTikKKyNkZWZpbmUgVkdBX0FUVFJfQ0xSX0NZTiAoVkdBX0FUVFJfQ0xSX0dSTiB8IFZHQV9BVFRSX0NMUl9CTFUpCisjZGVmaW5lIFZHQV9BVFRSX0NMUl9NQUcgKFZHQV9BVFRSX0NMUl9CTFUgfCBWR0FfQVRUUl9DTFJfUkVEKQorI2RlZmluZSBWR0FfQVRUUl9DTFJfQkxLIDAKKyNkZWZpbmUgVkdBX0FUVFJfQ0xSX1dIVCAoVkdBX0FUVFJfQ0xSX1JFRCB8IFZHQV9BVFRSX0NMUl9HUk4gfCBWR0FfQVRUUl9DTFJfQkxVKQorI2RlZmluZSBWR0FfQVRUUl9CTksgICAgIDB4ODAKKyNkZWZpbmUgVkdBX0FUVFJfSVROICAgICAweDA4CisKKy8qCisgKiB2Z2EgcmVnaXN0ZXIgcGFyYW1ldGVycworICogdGhlc2UgYXJlIGNvcGllZCB0byB0aGUgCisgKiByZWdpc3RlcnMuCisgKgorICovCitzdHJ1Y3QgdmdhX3BhciB7CisgICAgICAgIHU4IGNydGNbQ1JUQ19DXTsKKyAgICAgICAgdTggYXRjW0FUVF9DXTsKKyAgICAgICAgdTggZ2RjW0dSQV9DXTsKKyAgICAgICAgdTggc2VxW1NFUV9DXTsKKyAgICAgICAgdTggbWlzYzsgLy8gdGhlIG1pc2MgcmVnaXN0ZXIsIE1JU19XCisgICAgICAgIHU4IHZzczsKK307CisKKworLyogSW50ZXJwcmV0YXRpb24gb2Ygb2Zmc2V0IGZvciBjb2xvciBmaWVsZHM6IEFsbCBvZmZzZXRzIGFyZSBmcm9tIHRoZSByaWdodCwKKyAqIGluc2lkZSBhICJwaXhlbCIgdmFsdWUsIHdoaWNoIGlzIGV4YWN0bHkgJ2JpdHNfcGVyX3BpeGVsJyB3aWRlIChtZWFuczogeW91CisgKiBjYW4gdXNlIHRoZSBvZmZzZXQgYXMgcmlnaHQgYXJndW1lbnQgdG8gPDwpLiBBIHBpeGVsIGFmdGVyd2FyZHMgaXMgYSBiaXQKKyAqIHN0cmVhbSBhbmQgaXMgd3JpdHRlbiB0byB2aWRlbyBtZW1vcnkgYXMgdGhhdCB1bm1vZGlmaWVkLiBUaGlzIGltcGxpZXMKKyAqIGJpZy1lbmRpYW4gYnl0ZSBvcmRlciBpZiBiaXRzX3Blcl9waXhlbCBpcyBncmVhdGVyIHRoYW4gOC4KKyAqLworc3RydWN0IGZiX2JpdGZpZWxkIHsKKyAgICAgICAgX191MzIgb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAvKiBiZWdpbm5pbmcgb2YgYml0ZmllbGQgICAgICAgICovCisgICAgICAgIF9fdTMyIGxlbmd0aDsgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGJpdGZpZWxkICAgICAgICAgICAqLworICAgICAgICBfX3UzMiBtc2JfcmlnaHQ7ICAgICAgICAgICAgICAgIC8qICE9IDAgOiBNb3N0IHNpZ25pZmljYW50IGJpdCBpcyAqLyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByaWdodCAqLyAKK307CisKK3N0cnVjdCBzY3JlZW5pbmZvIHsKKyAgICAgICAgX191MzIgeHJlczsgICAgICAgICAgICAgICAgICAgICAvKiB2aXNpYmxlIHJlc29sdXRpb24gICAgICAgICAgICovCisgICAgICAgIF9fdTMyIHlyZXM7CisgICAgICAgIF9fdTMyIHhyZXNfdmlydHVhbDsgICAgICAgICAgICAgLyogdmlydHVhbCByZXNvbHV0aW9uICAgICAgICAgICAqLworICAgICAgICBfX3UzMiB5cmVzX3ZpcnR1YWw7CisgICAgICAgIF9fdTMyIHhvZmZzZXQ7ICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IGZyb20gdmlydHVhbCB0byB2aXNpYmxlICovCisgICAgICAgIF9fdTMyIHlvZmZzZXQ7ICAgICAgICAgICAgICAgICAgLyogcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIF9fdTMyIGJpdHNfcGVyX3BpeGVsOyAgICAgICAgICAgLyogZ3Vlc3Mgd2hhdCAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBfX3UzMiBncmF5c2NhbGU7ICAgICAgICAgICAgICAgIC8qICE9IDAgR3JheWxldmVscyBpbnN0ZWFkIG9mIGNvbG9ycyAqLworCisgICAgICAgIHN0cnVjdCBmYl9iaXRmaWVsZCByZWQ7ICAgICAgICAgLyogYml0ZmllbGQgaW4gZmIgbWVtIGlmIHRydWUgY29sb3IsICovCisgICAgICAgIHN0cnVjdCBmYl9iaXRmaWVsZCBncmVlbjsgICAgICAgLyogZWxzZSBvbmx5IGxlbmd0aCBpcyBzaWduaWZpY2FudCAqLworICAgICAgICBzdHJ1Y3QgZmJfYml0ZmllbGQgYmx1ZTsKKyAgICAgICAgc3RydWN0IGZiX2JpdGZpZWxkIHRyYW5zcDsgICAgICAvKiB0cmFuc3BhcmVuY3kgICAgICAgICAgICAgICAgICovICAgICAgCisKKyAgICAgICAgX191MzIgbm9uc3RkOyAgICAgICAgICAgICAgICAgICAvKiAhPSAwIE5vbiBzdGFuZGFyZCBwaXhlbCBmb3JtYXQgKi8KKworICAgICAgICBfX3UzMiBhY3RpdmF0ZTsgICAgICAgICAgICAgICAgIC8qIHNlZSBGQl9BQ1RJVkFURV8qICAgICAgICAgICAgKi8KKworICAgICAgICBfX3UzMiBoZWlnaHQ7ICAgICAgICAgICAgICAgICAgIC8qIGhlaWdodCBvZiBwaWN0dXJlIGluIG1tICAgICovCisgICAgICAgIF9fdTMyIHdpZHRoOyAgICAgICAgICAgICAgICAgICAgLyogd2lkdGggb2YgcGljdHVyZSBpbiBtbSAgICAgKi8KKworICAgICAgICBfX3UzMiBhY2NlbF9mbGFnczsgICAgICAgICAgICAgIC8qIGFjY2VsZXJhdGlvbiBmbGFncyAoaGludHMpICAgKi8KKworICAgICAgICAvKiBUaW1pbmc6IEFsbCB2YWx1ZXMgaW4gcGl4Y2xvY2tzLCBleGNlcHQgcGl4Y2xvY2sgKG9mIGNvdXJzZSkgKi8KKyAgICAgICAgX191MzIgcGl4Y2xvY2s7ICAgICAgICAgICAgICAgICAvKiBwaXhlbCBjbG9jayBpbiBwcyAocGljbyBzZWNvbmRzKSAqLworICAgICAgICBfX3UzMiBsZWZ0X21hcmdpbjsgICAgICAgICAgICAgIC8qIHRpbWUgZnJvbSBzeW5jIHRvIHBpY3R1cmUgICAgKi8KKyAgICAgICAgX191MzIgcmlnaHRfbWFyZ2luOyAgICAgICAgICAgICAvKiB0aW1lIGZyb20gcGljdHVyZSB0byBzeW5jICAgICovCisgICAgICAgIF9fdTMyIHVwcGVyX21hcmdpbjsgICAgICAgICAgICAgLyogdGltZSBmcm9tIHN5bmMgdG8gcGljdHVyZSAgICAqLworICAgICAgICBfX3UzMiBsb3dlcl9tYXJnaW47CisgICAgICAgIF9fdTMyIGhzeW5jX2xlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGhvcml6b250YWwgc3luYyAgICAqLworICAgICAgICBfX3UzMiB2c3luY19sZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiB2ZXJ0aWNhbCBzeW5jICAgICAgKi8KKyAgICAgICAgX191MzIgc3luYzsgICAgICAgICAgICAgICAgICAgICAvKiBzeW5jIHBvbGFyaXR5ICAgICAgICAgICAgICAgICovCisgICAgICAgIF9fdTMyIHZtb2RlOyAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJsYWNlZCBldGMJCQkJKi8KKyAgICAgICAgX191MzIgcmVzZXJ2ZWRbNl07ICAgICAgICAgICAgICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHkgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvYWJmdC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvYWJmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTQxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9hYmZ0LmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Z3B4ZS9hb2UuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvYWJmdC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBBb0UgQm9vdCBGaXJtd2FyZSBUYWJsZQorICoKKyAqLworCisjZGVmaW5lIGFiZnRhYiBfX3VzZV9kYXRhMTYgKCBhYmZ0YWIgKQorLyoqIFRoZSBhQkZUIHVzZWQgYnkgZ1BYRSAqLworc3RydWN0IGFiZnRfdGFibGUgX19kYXRhMTYgKCBhYmZ0YWIgKSBfX2F0dHJpYnV0ZV9fICgoIGFsaWduZWQgKCAxNiApICkpID0geworCS8qIEFDUEkgaGVhZGVyICovCisJLmFjcGkgPSB7CisJCS5zaWduYXR1cmUgPSBBQkZUX1NJRywKKwkJLmxlbmd0aCA9IHNpemVvZiAoIGFiZnRhYiApLAorCQkucmV2aXNpb24gPSAxLAorCQkub2VtX2lkID0gIkZFTlNZUyIsCisJCS5vZW1fdGFibGVfaWQgPSAiZ1BYRSIsCisJfSwKK307CisKKy8qKgorICogRmlsbCBpbiBhbGwgdmFyaWFibGUgcG9ydGlvbnMgb2YgYUJGVAorICoKKyAqIEB2IGFvZQkJQW9FIHNlc3Npb24KKyAqLwordm9pZCBhYmZ0X2ZpbGxfZGF0YSAoIHN0cnVjdCBhb2Vfc2Vzc2lvbiAqYW9lICkgeworCisJLyogRmlsbCBpbiBib290IHBhcmFtZXRlcnMgKi8KKwlhYmZ0YWIuc2hlbGYgPSBhb2UtPm1ham9yOworCWFiZnRhYi5zbG90ID0gYW9lLT5taW5vcjsKKwltZW1jcHkgKCBhYmZ0YWIubWFjLCBhb2UtPm5ldGRldi0+bGxfYWRkciwgc2l6ZW9mICggYWJmdGFiLm1hYyApICk7CisKKwkvKiBVcGRhdGUgY2hlY2tzdW0gKi8KKwlhY3BpX2ZpeF9jaGVja3N1bSAoICZhYmZ0YWIuYWNwaSApOworCisJREJHICggIkFvRSBib290IGZpcm13YXJlIHRhYmxlOlxuIiApOworCURCR19IRCAoICZhYmZ0YWIsIHNpemVvZiAoIGFiZnRhYiApICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9hb2Vib290LmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9hb2Vib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3MGIxNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcGNiaW9zL2FvZWJvb3QuYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvYW9lLmg+CisjaW5jbHVkZSA8Z3B4ZS9hdGEuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvc2FuYm9vdC5oPgorI2luY2x1ZGUgPGdweGUvYWJmdC5oPgorI2luY2x1ZGUgPGludDEzLmg+CisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RhdGljIGludCBhb2Vib290ICggY29uc3QgY2hhciAqcm9vdF9wYXRoICkgeworCXN0cnVjdCBhdGFfZGV2aWNlICphdGE7CisJc3RydWN0IGludDEzX2RyaXZlICpkcml2ZTsKKwlpbnQgcmM7CisKKwlhdGEgPSB6YWxsb2MgKCBzaXplb2YgKCAqYXRhICkgKTsKKwlpZiAoICEgYXRhICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2F0YTsKKwl9CisJZHJpdmUgPSB6YWxsb2MgKCBzaXplb2YgKCAqZHJpdmUgKSApOworCWlmICggISBkcml2ZSApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19kcml2ZTsKKwl9CisKKwkvKiBGSVhNRTogdWdseSwgdWdseSBoYWNrICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGxhc3Rfb3BlbmVkX25ldGRldigpOworCisJaWYgKCAoIHJjID0gYW9lX2F0dGFjaCAoIGF0YSwgbmV0ZGV2LCByb290X3BhdGggKSApICE9IDAgKSB7CisJCXByaW50ZiAoICJDb3VsZCBub3QgYXR0YWNoIEFvRSBkZXZpY2U6ICVzXG4iLAorCQkJIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9hdHRhY2g7CisJfQorCWlmICggKCByYyA9IGluaXRfYXRhZGV2ICggYXRhICkgKSAhPSAwICkgeworCQlwcmludGYgKCAiQ291bGQgbm90IGluaXRpYWxpc2UgQW9FIGRldmljZTogJXNcbiIsCisJCQkgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX2luaXQ7CisJfQorCisJLyogRklYTUU6IHVnbHksIHVnbHkgaGFjayAqLworCXN0cnVjdCBhb2Vfc2Vzc2lvbiAqYW9lID0KKwkJY29udGFpbmVyX29mICggYXRhLT5iYWNrZW5kLCBzdHJ1Y3QgYW9lX3Nlc3Npb24sIHJlZmNudCApOworCWFiZnRfZmlsbF9kYXRhICggYW9lICk7CisKKwlkcml2ZS0+YmxvY2tkZXYgPSAmYXRhLT5ibG9ja2RldjsKKworCXJlZ2lzdGVyX2ludDEzX2RyaXZlICggZHJpdmUgKTsKKwlwcmludGYgKCAiUmVnaXN0ZXJlZCBhcyBCSU9TIGRyaXZlICUjMDJ4XG4iLCBkcml2ZS0+ZHJpdmUgKTsKKwlwcmludGYgKCAiQm9vdGluZyBmcm9tIEJJT1MgZHJpdmUgJSMwMnhcbiIsIGRyaXZlLT5kcml2ZSApOworCXJjID0gaW50MTNfYm9vdCAoIGRyaXZlLT5kcml2ZSApOworCXByaW50ZiAoICJCb290IGZhaWxlZFxuIiApOworCisJLyogTGVhdmUgZHJpdmUgcmVnaXN0ZXJlZCwgaWYgaW5zdHJ1Y3RlZCB0byBkbyBzbyAqLworCWlmICgga2VlcF9zYW4oKSApCisJCXJldHVybiByYzsKKworCXByaW50ZiAoICJVbnJlZ2lzdGVyaW5nIEJJT1MgZHJpdmUgJSMwMnhcbiIsIGRyaXZlLT5kcml2ZSApOworCXVucmVnaXN0ZXJfaW50MTNfZHJpdmUgKCBkcml2ZSApOworCisgZXJyX2luaXQ6CisJYW9lX2RldGFjaCAoIGF0YSApOworIGVycl9hdHRhY2g6CisJZnJlZSAoIGRyaXZlICk7CisgZXJyX2FsbG9jX2RyaXZlOgorCWZyZWUgKCBhdGEgKTsKKyBlcnJfYWxsb2NfYXRhOgorCXJldHVybiByYzsKK30KKworc3RydWN0IHNhbmJvb3RfcHJvdG9jb2wgYW9lX3NhbmJvb3RfcHJvdG9jb2wgX19zYW5ib290X3Byb3RvY29sID0geworCS5wcmVmaXggPSAiYW9lOiIsCisJLmJvb3QgPSBhb2Vib290LAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcGNiaW9zL2Jpb3NfbmFwLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9iaW9zX25hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGNhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9iaW9zX25hcC5jCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxncHhlL25hcC5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBTYXZlIHBvd2VyIGJ5IGhhbHRpbmcgdGhlIENQVSB1bnRpbCB0aGUgbmV4dCBpbnRlcnJ1cHQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGJpb3NfY3B1X25hcCAoIHZvaWQgKSB7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBSRUFMX0NPREUgKCAic3RpXG5cdCIKKwkJCQkJICAgImhsdFxuXHQiCisJCQkJCSAgICJjbGlcblx0IiApIDogOiApOworfQorCitQUk9WSURFX05BUCAoIHBjYmlvcywgY3B1X25hcCwgYmlvc19jcHVfbmFwICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9iaW9zX3NtYmlvcy5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvYmlvc19zbWJpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTQyMTRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvYmlvc19zbWJpb3MuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3NtYmlvcy5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8cG5wYmlvcy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBTeXN0ZW0gTWFuYWdlbWVudCBCSU9TCisgKgorICovCisKKy8qKgorICogRmluZCBTTUJJT1MKKyAqCisgKiBAdiBzbWJpb3MJCVNNQklPUyBlbnRyeSBwb2ludCBkZXNjcmlwdG9yIHN0cnVjdHVyZSB0byBmaWxsIGluCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBiaW9zX2ZpbmRfc21iaW9zICggc3RydWN0IHNtYmlvcyAqc21iaW9zICkgeworCXVuaW9uIHsKKwkJc3RydWN0IHNtYmlvc19lbnRyeSBlbnRyeTsKKwkJdWludDhfdCBieXRlc1syNTZdOyAvKiAyNTYgaXMgbWF4aW11bSBsZW5ndGggcG9zc2libGUgKi8KKwl9IHU7CisJc3RhdGljIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCXNpemVfdCBsZW47CisJdW5zaWduZWQgaW50IGk7CisJdWludDhfdCBzdW07CisKKwkvKiBUcnkgdG8gZmluZCBTTUJJT1MgKi8KKwlmb3IgKCA7IG9mZnNldCA8IDB4MTAwMDAgOyBvZmZzZXQgKz0gMHgxMCApIHsKKworCQkvKiBSZWFkIHN0YXJ0IG9mIGhlYWRlciBhbmQgdmVyaWZ5IHNpZ25hdHVyZSAqLworCQljb3B5X2Zyb21fcmVhbCAoICZ1LmVudHJ5LCBCSU9TX1NFRywgb2Zmc2V0LAorCQkJCSBzaXplb2YgKCB1LmVudHJ5ICkpOworCQlpZiAoIHUuZW50cnkuc2lnbmF0dXJlICE9IFNNQklPU19TSUdOQVRVUkUgKQorCQkJY29udGludWU7CisKKwkJLyogUmVhZCB3aG9sZSBoZWFkZXIgYW5kIHZlcmlmeSBjaGVja3N1bSAqLworCQlsZW4gPSB1LmVudHJ5LmxlbjsKKwkJY29weV9mcm9tX3JlYWwgKCAmdS5ieXRlcywgQklPU19TRUcsIG9mZnNldCwgbGVuICk7CisJCWZvciAoIGkgPSAwICwgc3VtID0gMCA7IGkgPCBsZW4gOyBpKysgKSB7CisJCQlzdW0gKz0gdS5ieXRlc1tpXTsKKwkJfQorCQlpZiAoIHN1bSAhPSAwICkgeworCQkJREJHICggIlNNQklPUyBhdCAlMDR4OiUwNHggaGFzIGJhZCBjaGVja3N1bSAlMDJ4XG4iLAorCQkJICAgICAgQklPU19TRUcsIG9mZnNldCwgc3VtICk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEZpbGwgcmVzdWx0IHN0cnVjdHVyZSAqLworCQlEQkcgKCAiRm91bmQgU01CSU9TIHYlZC4lZCBlbnRyeSBwb2ludCBhdCAlMDR4OiUwNHhcbiIsCisJCSAgICAgIHUuZW50cnkubWFqb3IsIHUuZW50cnkubWlub3IsIEJJT1NfU0VHLCBvZmZzZXQgKTsKKwkJc21iaW9zLT5hZGRyZXNzID0gcGh5c190b191c2VyICggdS5lbnRyeS5zbWJpb3NfYWRkcmVzcyApOworCQlzbWJpb3MtPmxlbiA9IHUuZW50cnkuc21iaW9zX2xlbjsKKwkJc21iaW9zLT5jb3VudCA9IHUuZW50cnkuc21iaW9zX2NvdW50OworCQlyZXR1cm4gMDsKKwl9CisKKwlEQkcgKCAiTm8gU01CSU9TIGZvdW5kXG4iICk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK1BST1ZJREVfU01CSU9TICggcGNiaW9zLCBmaW5kX3NtYmlvcywgYmlvc19maW5kX3NtYmlvcyApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvYmlvc190aW1lci5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvYmlvc190aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2Y3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9iaW9zX3RpbWVyLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqIEBmaWxlCisgKgorICogQklPUyB0aW1lcgorICoKKyAqLworCisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Ymlvcy5oPgorCisvKioKKyAqIEdldCBjdXJyZW50IHN5c3RlbSB0aW1lIGluIHRpY2tzCisgKgorICogQHJldCB0aWNrcwkJQ3VycmVudCB0aW1lLCBpbiB0aWNrcworICoKKyAqIFVzZSBkaXJlY3QgbWVtb3J5IGFjY2VzcyB0byBCSU9TIHZhcmlhYmxlcywgbG9uZ3dvcmQgMDA0MDowMDZDCisgKiAodGlja3MgdG9kYXkpIGFuZCBieXRlIDAwNDA6MDA3MCAobWlkbmlnaHQgY3Jvc3NvdmVyIGZsYWcpIGluc3RlYWQKKyAqIG9mIGNhbGxpbmcgdGltZW9mZGF5IEJJT1MgaW50ZXJydXB0LgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiaW9zX2N1cnJ0aWNrcyAoIHZvaWQgKSB7CisJc3RhdGljIGludCBkYXlzID0gMDsKKwl1aW50MzJfdCB0aWNrczsKKwl1aW50OF90IG1pZG5pZ2h0OworCisJLyogUmUtZW5hYmxlIGludGVycnVwdHMgc28gdGhhdCB0aGUgdGltZXIgaW50ZXJydXB0IGNhbiBvY2N1ciAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggInN0aVxuXHQiCisJCQkJCSAgICJub3Bcblx0IgorCQkJCQkgICAibm9wXG5cdCIKKwkJCQkJICAgImNsaVxuXHQiICkgOiA6ICk7CisKKwlnZXRfcmVhbCAoIHRpY2tzLCBCREFfU0VHLCAweDAwNmMgKTsKKwlnZXRfcmVhbCAoIG1pZG5pZ2h0LCBCREFfU0VHLCAweDAwNzAgKTsKKworCWlmICggbWlkbmlnaHQgKSB7CisJCW1pZG5pZ2h0ID0gMDsKKwkJcHV0X3JlYWwgKCBtaWRuaWdodCwgQkRBX1NFRywgMHgwMDcwICk7CisJCWRheXMgKz0gMHgxODAwYjA7CisJfQorCisJcmV0dXJuICggZGF5cyArIHRpY2tzICk7Cit9CisKK1BST1ZJREVfVElNRVJfSU5MSU5FICggcGNiaW9zLCB1ZGVsYXkgKTsKK1BST1ZJREVfVElNRVIgKCBwY2Jpb3MsIGN1cnJ0aWNrcywgYmlvc19jdXJydGlja3MgKTsKK1BST1ZJREVfVElNRVJfSU5MSU5FICggcGNiaW9zLCB0aWNrc19wZXJfc2VjICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9iaW9zaW50LmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9iaW9zaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5M2RlZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcGNiaW9zL2Jpb3NpbnQuYwpAQCAtMCwwICsxLDkyIEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxyZWFsbW9kZS5oPgorI2luY2x1ZGUgPGJpb3NpbnQuaD4KKworLyoqCisgKiBAZmlsZSBCSU9TIGludGVycnVwdHMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEhvb2sgSU5UIHZlY3RvcgorICoKKyAqIEB2IGludGVycnVwdAkJSU5UIG51bWJlcgorICogQHYgaGFuZGxlcgkJT2Zmc2V0IHdpdGhpbiAudGV4dDE2IHRvIGludGVycnVwdCBoYW5kbGVyCisgKiBAdiBjaGFpbl92ZWN0b3IJVmVjdG9yIGZvciBjaGFpbmluZyB0byBwcmV2aW91cyBoYW5kbGVyCisgKgorICogSG9va3MgaW4gYW4gaTM4NiBJTlQgaGFuZGxlci4gIFRoZSBoYW5kbGVyIGl0c2VsZiBtdXN0IHJlc2lkZQorICogd2l0aGluIHRoZSAudGV4dDE2IHNlZ21lbnQuICBAYyBjaGFpbl92ZWN0b3Igd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAorICogdGhlIGFkZHJlc3Mgb2YgdGhlIHByZXZpb3VzbHktaW5zdGFsbGVkIGhhbmRsZXIgZm9yIHRoaXMgaW50ZXJydXB0OworICogdGhlIGhhbmRsZXIgc2hvdWxkIHByb2JhYmx5IGV4aXQgYnkgbGptcGluZyB2aWEgdGhpcyB2ZWN0b3IuCisgKi8KK3ZvaWQgaG9va19iaW9zX2ludGVycnVwdCAoIHVuc2lnbmVkIGludCBpbnRlcnJ1cHQsIHVuc2lnbmVkIGludCBoYW5kbGVyLAorCQkJICAgc3RydWN0IHNlZ29mZiAqY2hhaW5fdmVjdG9yICkgeworCXN0cnVjdCBzZWdvZmYgdmVjdG9yID0geworCQkuc2VnbWVudCA9IHJtX2NzLAorCQkub2Zmc2V0ID0gaGFuZGxlciwKKwl9OworCisJREJHICggIkhvb2tpbmcgSU5UICUjMDJ4IHRvICUwNHg6JTA0eFxuIiwKKwkgICAgICBpbnRlcnJ1cHQsIHJtX2NzLCBoYW5kbGVyICk7CisKKwlpZiAoICggY2hhaW5fdmVjdG9yLT5zZWdtZW50ICE9IDAgKSB8fAorCSAgICAgKCBjaGFpbl92ZWN0b3ItPm9mZnNldCAhPSAwICkgKSB7CisJCS8qIEFscmVhZHkgaG9va2VkOyBkbyBub3RoaW5nICovCisJCURCRyAoICIuLi5hbHJlYWR5IGhvb2tlZFxuIiApOworCQlyZXR1cm47CisJfQorCisJY29weV9mcm9tX3JlYWwgKCBjaGFpbl92ZWN0b3IsIDAsICggaW50ZXJydXB0ICogNCApLAorCQkJIHNpemVvZiAoICpjaGFpbl92ZWN0b3IgKSApOworCURCRyAoICIuLi5jaGFpbmluZyB0byAlMDR4OiUwNHhcbiIsCisJICAgICAgY2hhaW5fdmVjdG9yLT5zZWdtZW50LCBjaGFpbl92ZWN0b3ItPm9mZnNldCApOworCWlmICggREJHX0xPRyApIHsKKwkJY2hhciBjb2RlWzY0XTsKKwkJY29weV9mcm9tX3JlYWwgKCBjb2RlLCBjaGFpbl92ZWN0b3ItPnNlZ21lbnQsCisJCQkJIGNoYWluX3ZlY3Rvci0+b2Zmc2V0LCBzaXplb2YgKCBjb2RlICkgKTsKKwkJREJHX0hEQSAoICpjaGFpbl92ZWN0b3IsIGNvZGUsIHNpemVvZiAoIGNvZGUgKSApOworCX0KKworCWNvcHlfdG9fcmVhbCAoIDAsICggaW50ZXJydXB0ICogNCApLCAmdmVjdG9yLCBzaXplb2YgKCB2ZWN0b3IgKSApOworCWhvb2tlZF9iaW9zX2ludGVycnVwdHMrKzsKK30KKworLyoqCisgKiBVbmhvb2sgSU5UIHZlY3RvcgorICoKKyAqIEB2IGludGVycnVwdAkJSU5UIG51bWJlcgorICogQHYgaGFuZGxlcgkJT2Zmc2V0IHdpdGhpbiAudGV4dDE2IHRvIGludGVycnVwdCBoYW5kbGVyCisgKiBAdiBjaGFpbl92ZWN0b3IJVmVjdG9yIGNvbnRhaW5pbmcgYWRkcmVzcyBvZiBwcmV2aW91cyBoYW5kbGVyCisgKgorICogVW5ob29rcyBhbiBpMzg2IGludGVycnVwdCBoYW5kbGVyIGhvb2tlZCBieSBob29rX2kzODZfdmVjdG9yKCkuCisgKiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gbWF5IGZhaWwsIGlmIHNvbWUgZXh0ZXJuYWwgY29kZSBoYXMgaG9va2VkCisgKiB0aGUgdmVjdG9yIHNpbmNlIHdlIGhvb2tlZCBpbiBvdXIgaGFuZGxlci4gIElmIGl0IGZhaWxzLCBpdCBtZWFucworICogdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gdW5ob29rIG91ciBoYW5kbGVyLCBhbmQgd2UgbXVzdCBsZWF2ZSBpdAorICogKGFuZCBpdHMgY2hhaW5pbmcgdmVjdG9yKSByZXNpZGVudCBpbiBtZW1vcnkuCisgKi8KK2ludCB1bmhvb2tfYmlvc19pbnRlcnJ1cHQgKCB1bnNpZ25lZCBpbnQgaW50ZXJydXB0LCB1bnNpZ25lZCBpbnQgaGFuZGxlciwKKwkJCSAgICBzdHJ1Y3Qgc2Vnb2ZmICpjaGFpbl92ZWN0b3IgKSB7CisJc3RydWN0IHNlZ29mZiB2ZWN0b3I7CisKKwlEQkcgKCAiVW5ob29raW5nIElOVCAlIzAyeCBmcm9tICUwNHg6JTA0eFxuIiwKKwkgICAgICBpbnRlcnJ1cHQsIHJtX2NzLCBoYW5kbGVyICk7CisKKwljb3B5X2Zyb21fcmVhbCAoICZ2ZWN0b3IsIDAsICggaW50ZXJydXB0ICogNCApLCBzaXplb2YgKCB2ZWN0b3IgKSApOworCWlmICggKCB2ZWN0b3Iuc2VnbWVudCAhPSBybV9jcyApIHx8ICggdmVjdG9yLm9mZnNldCAhPSBoYW5kbGVyICkgKSB7CisJCURCRyAoICIuLi5jYW5ub3QgdW5ob29rOyB2ZWN0b3IgcG9pbnRzIHRvICUwNHg6JTA0eFxuIiwKKwkJICAgICAgdmVjdG9yLnNlZ21lbnQsIHZlY3Rvci5vZmZzZXQgKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlEQkcgKCAiLi4ucmVzdG9yaW5nIHRvICUwNHg6JTA0eFxuIiwKKwkgICAgICBjaGFpbl92ZWN0b3ItPnNlZ21lbnQsIGNoYWluX3ZlY3Rvci0+b2Zmc2V0ICk7CisJY29weV90b19yZWFsICggMCwgKCBpbnRlcnJ1cHQgKiA0ICksIGNoYWluX3ZlY3RvciwKKwkJICAgICAgIHNpemVvZiAoICpjaGFpbl92ZWN0b3IgKSApOworCisJY2hhaW5fdmVjdG9yLT5zZWdtZW50ID0gMDsKKwljaGFpbl92ZWN0b3ItPm9mZnNldCA9IDA7CisJaG9va2VkX2Jpb3NfaW50ZXJydXB0cy0tOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvaWJfc3JwYm9vdC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvaWJfc3JwYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxY2JjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9pYl9zcnBib290LmMKQEAgLTAsMCArMSw3MyBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL3NhbmJvb3QuaD4KKyNpbmNsdWRlIDxpbnQxMy5oPgorI2luY2x1ZGUgPGdweGUvc3JwLmg+CisjaW5jbHVkZSA8Z3B4ZS9zYmZ0Lmg+CisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RhdGljIGludCBpYl9zcnBib290ICggY29uc3QgY2hhciAqcm9vdF9wYXRoICkgeworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaTsKKwlzdHJ1Y3QgaW50MTNfZHJpdmUgKmRyaXZlOworCWludCByYzsKKworCXNjc2kgPSB6YWxsb2MgKCBzaXplb2YgKCAqc2NzaSApICk7CisJaWYgKCAhIHNjc2kgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2Nfc2NzaTsKKwl9CisJZHJpdmUgPSB6YWxsb2MgKCBzaXplb2YgKCAqZHJpdmUgKSApOworCWlmICggISBkcml2ZSApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19kcml2ZTsKKwl9CisKKwlpZiAoICggcmMgPSBzcnBfYXR0YWNoICggc2NzaSwgcm9vdF9wYXRoICkgKSAhPSAwICkgeworCQlwcmludGYgKCAiQ291bGQgbm90IGF0dGFjaCBJQl9TUlAgZGV2aWNlOiAlc1xuIiwKKwkJCSBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfYXR0YWNoOworCX0KKwlpZiAoICggcmMgPSBpbml0X3Njc2lkZXYgKCBzY3NpICkgKSAhPSAwICkgeworCQlwcmludGYgKCAiQ291bGQgbm90IGluaXRpYWxpc2UgSUJfU1JQIGRldmljZTogJXNcbiIsCisJCQkgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX2luaXQ7CisJfQorCisJZHJpdmUtPmJsb2NrZGV2ID0gJnNjc2ktPmJsb2NrZGV2OworCisJLyogRklYTUU6IHVnbHksIHVnbHkgaGFjayAqLworCXN0cnVjdCBzcnBfZGV2aWNlICpzcnAgPQorCQljb250YWluZXJfb2YgKCBzY3NpLT5iYWNrZW5kLCBzdHJ1Y3Qgc3JwX2RldmljZSwgcmVmY250ICk7CisJc2JmdF9maWxsX2RhdGEgKCBzcnAgKTsKKworCXJlZ2lzdGVyX2ludDEzX2RyaXZlICggZHJpdmUgKTsKKwlwcmludGYgKCAiUmVnaXN0ZXJlZCBhcyBCSU9TIGRyaXZlICUjMDJ4XG4iLCBkcml2ZS0+ZHJpdmUgKTsKKwlwcmludGYgKCAiQm9vdGluZyBmcm9tIEJJT1MgZHJpdmUgJSMwMnhcbiIsIGRyaXZlLT5kcml2ZSApOworCXJjID0gaW50MTNfYm9vdCAoIGRyaXZlLT5kcml2ZSApOworCXByaW50ZiAoICJCb290IGZhaWxlZFxuIiApOworCisJLyogTGVhdmUgZHJpdmUgcmVnaXN0ZXJlZCwgaWYgaW5zdHJ1Y3RlZCB0byBkbyBzbyAqLworCWlmICgga2VlcF9zYW4oKSApCisJCXJldHVybiByYzsKKworCXByaW50ZiAoICJVbnJlZ2lzdGVyaW5nIEJJT1MgZHJpdmUgJSMwMnhcbiIsIGRyaXZlLT5kcml2ZSApOworCXVucmVnaXN0ZXJfaW50MTNfZHJpdmUgKCBkcml2ZSApOworCisgZXJyX2luaXQ6CisJc3JwX2RldGFjaCAoIHNjc2kgKTsKKyBlcnJfYXR0YWNoOgorCWZyZWUgKCBkcml2ZSApOworIGVycl9hbGxvY19kcml2ZToKKwlmcmVlICggc2NzaSApOworIGVycl9hbGxvY19zY3NpOgorCXJldHVybiByYzsKK30KKworc3RydWN0IHNhbmJvb3RfcHJvdG9jb2wgaWJfc3JwX3NhbmJvb3RfcHJvdG9jb2wgX19zYW5ib290X3Byb3RvY29sID0geworCS5wcmVmaXggPSAiaWJfc3JwOiIsCisJLmJvb3QgPSBpYl9zcnBib290LAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcGNiaW9zL2liZnQuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcGNiaW9zL2liZnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGY4ZTZiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvaWJmdC5jCkBAIC0wLDAgKzEsNDUxIEBACisvKgorICogQ29weXJpZ2h0IEZlbiBTeXN0ZW1zIEx0ZC4gMjAwNy4gIFBvcnRpb25zIG9mIHRoaXMgY29kZSBhcmUgZGVyaXZlZAorICogZnJvbSBJQk0gQ29ycG9yYXRpb24gU2FtcGxlIFByb2dyYW1zLiAgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbgorICogMjAwNCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEJTRDIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2FjcGkuaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9kaGNwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pc2NzaS5oPgorI2luY2x1ZGUgPGdweGUvaWJmdC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBpU0NTSSBib290IGZpcm13YXJlIHRhYmxlCisgKgorICogVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIGRvY3VtZW50ICJpU0NTSQorICogQm9vdCBGaXJtd2FyZSBUYWJsZSAoaUJGVCkiIGFzIHB1Ymxpc2hlZCBieSBJQk0gYXQKKyAqCisgKiBmdHA6Ly9mdHAuc29mdHdhcmUuaWJtLmNvbS9zeXN0ZW1zL3N1cHBvcnQvc3lzdGVtX3hfcGRmL2libV9pc2NzaV9ib290X2Zpcm13YXJlX3RhYmxlX3YxLjAyLnBkZgorICoKKyAqLworCisjZGVmaW5lIGliZnRhYiBfX3VzZV9kYXRhMTYgKCBpYmZ0YWIgKQorLyoqIFRoZSBpQkZUIHVzZWQgYnkgZ1BYRSAqLworc3RydWN0IGdweGVfaWJmdCBfX2RhdGExNiAoIGliZnRhYiApID0geworCS8qIFRhYmxlIGhlYWRlciAqLworCS50YWJsZSA9IHsKKwkJLyogQUNQSSBoZWFkZXIgKi8KKwkJLmFjcGkgPSB7CisJCQkuc2lnbmF0dXJlID0gSUJGVF9TSUcsCisJCQkubGVuZ3RoID0gc2l6ZW9mICggaWJmdGFiICksCisJCQkucmV2aXNpb24gPSAxLAorCQkJLm9lbV9pZCA9ICJGRU5TWVMiLAorCQkJLm9lbV90YWJsZV9pZCA9ICJnUFhFIiwKKwkJfSwKKwkJLyogQ29udHJvbCBibG9jayAqLworCQkuY29udHJvbCA9IHsKKwkJCS5oZWFkZXIgPSB7CisJCQkJLnN0cnVjdHVyZV9pZCA9IElCRlRfU1RSVUNUVVJFX0lEX0NPTlRST0wsCisJCQkJLnZlcnNpb24gPSAxLAorCQkJCS5sZW5ndGggPSBzaXplb2YgKCBpYmZ0YWIudGFibGUuY29udHJvbCApLAorCQkJCS5mbGFncyA9IDAsCisJCQl9LAorCQkJLmluaXRpYXRvciA9IG9mZnNldG9mICggdHlwZW9mICggaWJmdGFiICksIGluaXRpYXRvciApLAorCQkJLm5pY18wID0gb2Zmc2V0b2YgKCB0eXBlb2YgKCBpYmZ0YWIgKSwgbmljICksCisJCQkudGFyZ2V0XzAgPSBvZmZzZXRvZiAoIHR5cGVvZiAoIGliZnRhYiApLCB0YXJnZXQgKSwKKwkJfSwKKwl9LAorCS8qIGlTQ1NJIGluaXRpYXRvciBpbmZvcm1hdGlvbiAqLworCS5pbml0aWF0b3IgPSB7CisJCS5oZWFkZXIgPSB7CisJCQkuc3RydWN0dXJlX2lkID0gSUJGVF9TVFJVQ1RVUkVfSURfSU5JVElBVE9SLAorCQkJLnZlcnNpb24gPSAxLAorCQkJLmxlbmd0aCA9IHNpemVvZiAoIGliZnRhYi5pbml0aWF0b3IgKSwKKwkJCS5mbGFncyA9ICggSUJGVF9GTF9JTklUSUFUT1JfQkxPQ0tfVkFMSUQgfAorCQkJCSAgIElCRlRfRkxfSU5JVElBVE9SX0ZJUk1XQVJFX0JPT1RfU0VMRUNURUQgKSwKKwkJfSwKKwl9LAorCS8qIE5JQyBpbmZvcm1hdGlvbiAqLworCS5uaWMgPSB7CisJCS5oZWFkZXIgPSB7CisJCQkuc3RydWN0dXJlX2lkID0gSUJGVF9TVFJVQ1RVUkVfSURfTklDLAorCQkJLnZlcnNpb24gPSAxLAorCQkJLmxlbmd0aCA9IHNpemVvZiAoIGliZnRhYi5uaWMgKSwKKwkJCS5mbGFncyA9ICggSUJGVF9GTF9OSUNfQkxPQ0tfVkFMSUQgfAorCQkJCSAgIElCRlRfRkxfTklDX0ZJUk1XQVJFX0JPT1RfU0VMRUNURUQgKSwKKwkJfSwKKwl9LAorCS8qIGlTQ1NJIHRhcmdldCBpbmZvcm1hdGlvbiAqLworCS50YXJnZXQgPSB7CisJCS5oZWFkZXIgPSB7CisJCQkuc3RydWN0dXJlX2lkID0gSUJGVF9TVFJVQ1RVUkVfSURfVEFSR0VULAorCQkJLnZlcnNpb24gPSAxLAorCQkJLmxlbmd0aCA9IHNpemVvZiAoIGliZnRhYi50YXJnZXQgKSwKKwkJCS5mbGFncyA9ICggSUJGVF9GTF9UQVJHRVRfQkxPQ0tfVkFMSUQgfAorCQkJCSAgIElCRlRfRkxfVEFSR0VUX0ZJUk1XQVJFX0JPT1RfU0VMRUNURUQgKSwKKwkJfSwKKwl9LAorfTsKKworLyoqCisgKiBGaWxsIGluIGFuIElQIGFkZHJlc3MgZmllbGQgd2l0aGluIGlCRlQKKyAqCisgKiBAdiBpcGFkZHIJCUlQIGFkZHJlc3MgZmllbGQKKyAqIEB2IGluCQlJUHY0IGFkZHJlc3MKKyAqLworc3RhdGljIHZvaWQgaWJmdF9zZXRfaXBhZGRyICggc3RydWN0IGliZnRfaXBhZGRyICppcGFkZHIsIHN0cnVjdCBpbl9hZGRyIGluICkgeworCW1lbXNldCAoIGlwYWRkciwgMCwgc2l6ZW9mICggaXBhZGRyICkgKTsKKwlpZiAoIGluLnNfYWRkciApIHsKKwkJaXBhZGRyLT5pbiA9IGluOworCQlpcGFkZHItPm9uZXMgPSAweGZmZmY7CisJfQorfQorCisvKioKKyAqIEZpbGwgaW4gYW4gSVAgYWRkcmVzcyB3aXRoaW4gaUJGVCBmcm9tIGNvbmZpZ3VyYXRpb24gc2V0dGluZworICoKKyAqIEB2IGlwYWRkcgkJSVAgYWRkcmVzcyBmaWVsZAorICogQHYgc2V0dGluZwkJQ29uZmlndXJhdGlvbiBzZXR0aW5nCisgKiBAdiB0YWcJCURIQ1Agb3B0aW9uIHRhZworICovCitzdGF0aWMgdm9pZCBpYmZ0X3NldF9pcGFkZHJfb3B0aW9uICggc3RydWN0IGliZnRfaXBhZGRyICppcGFkZHIsCisJCQkJICAgICBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZyApIHsKKwlzdHJ1Y3QgaW5fYWRkciBpbiA9IHsgMCB9OworCWZldGNoX2lwdjRfc2V0dGluZyAoIE5VTEwsIHNldHRpbmcsICZpbiApOworCWliZnRfc2V0X2lwYWRkciAoIGlwYWRkciwgaW4gKTsKK30KKworLyoqCisgKiBSZWFkIElQIGFkZHJlc3MgZnJvbSBpQkZUIChmb3IgZGVidWdnaW5nKQorICoKKyAqIEB2IHN0cmluZ3MJCWlCRlQgc3RyaW5nIGJsb2NrIGRlc2NyaXB0b3IKKyAqIEB2IHN0cmluZwkJU3RyaW5nIGZpZWxkCisgKiBAcmV0IGlwYWRkcgkJSVAgYWRkcmVzcyBzdHJpbmcKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBpYmZ0X2lwYWRkciAoIHN0cnVjdCBpYmZ0X2lwYWRkciAqaXBhZGRyICkgeworCXJldHVybiBpbmV0X250b2EgKCBpcGFkZHItPmluICk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBzdHJpbmcgd2l0aGluIGlCRlQKKyAqCisgKiBAdiBzdHJpbmdzCQlpQkZUIHN0cmluZyBibG9jayBkZXNjcmlwdG9yCisgKiBAdiBzdHJpbmcJCVN0cmluZyBmaWVsZCB0byBmaWxsIGluCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBzdHJpbmcgdG8gYWxsb2NhdGUgKGV4Y2x1ZGluZyBOVUwpCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpYmZ0X2FsbG9jX3N0cmluZyAoIHN0cnVjdCBpYmZ0X3N0cmluZ19ibG9jayAqc3RyaW5ncywKKwkJCSAgICAgICBzdHJ1Y3QgaWJmdF9zdHJpbmcgKnN0cmluZywgc2l6ZV90IGxlbiApIHsKKwljaGFyICpkZXN0OworCXVuc2lnbmVkIGludCByZW1haW5pbmc7CisKKwlkZXN0ID0gKCAoICggY2hhciAqICkgc3RyaW5ncy0+dGFibGUgKSArIHN0cmluZ3MtPm9mZnNldCApOworCXJlbWFpbmluZyA9ICggc3RyaW5ncy0+dGFibGUtPmFjcGkubGVuZ3RoIC0gc3RyaW5ncy0+b2Zmc2V0ICk7CisJaWYgKCBsZW4gPj0gcmVtYWluaW5nICkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdHJpbmctPm9mZnNldCA9IHN0cmluZ3MtPm9mZnNldDsKKwlzdHJpbmctPmxlbmd0aCA9IGxlbjsKKwlzdHJpbmdzLT5vZmZzZXQgKz0gKCBsZW4gKyAxICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmlsbCBpbiBhIHN0cmluZyBmaWVsZCB3aXRoaW4gaUJGVAorICoKKyAqIEB2IHN0cmluZ3MJCWlCRlQgc3RyaW5nIGJsb2NrIGRlc2NyaXB0b3IKKyAqIEB2IHN0cmluZwkJU3RyaW5nIGZpZWxkCisgKiBAdiBkYXRhCQlTdHJpbmcgdG8gZmlsbCBpbiwgb3IgTlVMTAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJmdF9zZXRfc3RyaW5nICggc3RydWN0IGliZnRfc3RyaW5nX2Jsb2NrICpzdHJpbmdzLAorCQkJICAgICBzdHJ1Y3QgaWJmdF9zdHJpbmcgKnN0cmluZywgY29uc3QgY2hhciAqZGF0YSApIHsKKwljaGFyICpkZXN0OworCWludCByYzsKKworCWlmICggISBkYXRhICkKKwkJcmV0dXJuIDA7CisKKwlpZiAoICggcmMgPSBpYmZ0X2FsbG9jX3N0cmluZyAoIHN0cmluZ3MsIHN0cmluZywKKwkJCQkJc3RybGVuICggZGF0YSApICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCWRlc3QgPSAoICggKCBjaGFyICogKSBzdHJpbmdzLT50YWJsZSApICsgc3RyaW5nLT5vZmZzZXQgKTsKKwlzdHJjcHkgKCBkZXN0LCBkYXRhICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBGaWxsIGluIGEgc3RyaW5nIGZpZWxkIHdpdGhpbiBpQkZUIGZyb20gY29uZmlndXJhdGlvbiBzZXR0aW5nCisgKgorICogQHYgc3RyaW5ncwkJaUJGVCBzdHJpbmcgYmxvY2sgZGVzY3JpcHRvcgorICogQHYgc3RyaW5nCQlTdHJpbmcgZmllbGQKKyAqIEB2IHNldHRpbmcJCUNvbmZpZ3VyYXRpb24gc2V0dGluZworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJmdF9zZXRfc3RyaW5nX29wdGlvbiAoIHN0cnVjdCBpYmZ0X3N0cmluZ19ibG9jayAqc3RyaW5ncywKKwkJCQkgICAgc3RydWN0IGliZnRfc3RyaW5nICpzdHJpbmcsCisJCQkJICAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nICkgeworCWludCBsZW47CisJY2hhciAqZGVzdDsKKwlpbnQgcmM7CisKKwlsZW4gPSBmZXRjaF9zZXR0aW5nX2xlbiAoIE5VTEwsIHNldHRpbmcgKTsKKwlpZiAoIGxlbiA8IDAgKSB7CisJCXN0cmluZy0+b2Zmc2V0ID0gMDsKKwkJc3RyaW5nLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoICggcmMgPSBpYmZ0X2FsbG9jX3N0cmluZyAoIHN0cmluZ3MsIHN0cmluZywgbGVuICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCWRlc3QgPSAoICggKCBjaGFyICogKSBzdHJpbmdzLT50YWJsZSApICsgc3RyaW5nLT5vZmZzZXQgKTsKKwlmZXRjaF9zdHJpbmdfc2V0dGluZyAoIE5VTEwsIHNldHRpbmcsIGRlc3QsICggbGVuICsgMSApICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBzdHJpbmcgZnJvbSBpQkZUIChmb3IgZGVidWdnaW5nKQorICoKKyAqIEB2IHN0cmluZ3MJCWlCRlQgc3RyaW5nIGJsb2NrIGRlc2NyaXB0b3IKKyAqIEB2IHN0cmluZwkJU3RyaW5nIGZpZWxkCisgKiBAcmV0IGRhdGEJCVN0cmluZyBjb250ZW50IChvciAiPGVtcHR5PiIpCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogaWJmdF9zdHJpbmcgKCBzdHJ1Y3QgaWJmdF9zdHJpbmdfYmxvY2sgKnN0cmluZ3MsCisJCQkJICBzdHJ1Y3QgaWJmdF9zdHJpbmcgKnN0cmluZyApIHsKKwlyZXR1cm4gKCBzdHJpbmctPm9mZnNldCA/CisJCSAoICggKCBjaGFyICogKSBzdHJpbmdzLT50YWJsZSApICsgc3RyaW5nLT5vZmZzZXQgKSA6IE5VTEwgKTsKK30KKworLyoqCisgKiBGaWxsIGluIE5JQyBwb3J0aW9uIG9mIGlCRlQKKyAqCisgKiBAdiBuaWMJCU5JQyBwb3J0aW9uIG9mIGlCRlQKKyAqIEB2IHN0cmluZ3MJCWlCRlQgc3RyaW5nIGJsb2NrIGRlc2NyaXB0b3IKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliZnRfZmlsbF9uaWMgKCBzdHJ1Y3QgaWJmdF9uaWMgKm5pYywKKwkJCSAgIHN0cnVjdCBpYmZ0X3N0cmluZ19ibG9jayAqc3RyaW5ncywKKwkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IGxsX3Byb3RvY29sICpsbF9wcm90b2NvbCA9IG5ldGRldi0+bGxfcHJvdG9jb2w7CisJc3RydWN0IGluX2FkZHIgbmV0bWFza19hZGRyID0geyAwIH07CisJdW5zaWduZWQgaW50IG5ldG1hc2tfY291bnQgPSAwOworCWludCByYzsKKworCS8qIEV4dHJhY3QgdmFsdWVzIGZyb20gREhDUCBjb25maWd1cmF0aW9uICovCisJaWJmdF9zZXRfaXBhZGRyX29wdGlvbiAoICZuaWMtPmlwX2FkZHJlc3MsICZpcF9zZXR0aW5nICk7CisJREJHICggImlCRlQgTklDIElQID0gJXNcbiIsIGliZnRfaXBhZGRyICggJm5pYy0+aXBfYWRkcmVzcyApICk7CisJaWJmdF9zZXRfaXBhZGRyX29wdGlvbiAoICZuaWMtPmdhdGV3YXksICZnYXRld2F5X3NldHRpbmcgKTsKKwlEQkcgKCAiaUJGVCBOSUMgZ2F0ZXdheSA9ICVzXG4iLCBpYmZ0X2lwYWRkciAoICZuaWMtPmdhdGV3YXkgKSApOworCWliZnRfc2V0X2lwYWRkcl9vcHRpb24gKCAmbmljLT5kbnNbMF0sICZkbnNfc2V0dGluZyApOworCURCRyAoICJpQkZUIE5JQyBETlMgPSAlc1xuIiwgaWJmdF9pcGFkZHIgKCAmbmljLT5kbnNbMF0gKSApOworCWlmICggKCByYyA9IGliZnRfc2V0X3N0cmluZ19vcHRpb24gKCBzdHJpbmdzLCAmbmljLT5ob3N0bmFtZSwKKwkJCQkJICAgICAmaG9zdG5hbWVfc2V0dGluZyApICkgIT0gMCApCisJCXJldHVybiByYzsKKwlEQkcgKCAiaUJGVCBOSUMgaG9zdG5hbWUgPSAlc1xuIiwKKwkgICAgICBpYmZ0X3N0cmluZyAoIHN0cmluZ3MsICZuaWMtPmhvc3RuYW1lICkgKTsKKworCS8qIERlcml2ZSBzdWJuZXQgbWFzayBwcmVmaXggZnJvbSBzdWJuZXQgbWFzayAqLworCWZldGNoX2lwdjRfc2V0dGluZyAoIE5VTEwsICZuZXRtYXNrX3NldHRpbmcsICZuZXRtYXNrX2FkZHIgKTsKKwl3aGlsZSAoIG5ldG1hc2tfYWRkci5zX2FkZHIgKSB7CisJCWlmICggbmV0bWFza19hZGRyLnNfYWRkciAmIDB4MSApCisJCQluZXRtYXNrX2NvdW50Kys7CisJCW5ldG1hc2tfYWRkci5zX2FkZHIgPj49IDE7CisJfQorCW5pYy0+c3VibmV0X21hc2tfcHJlZml4ID0gbmV0bWFza19jb3VudDsKKwlEQkcgKCAiaUJGVCBOSUMgc3VibmV0ID0gLyVkXG4iLCBuaWMtPnN1Ym5ldF9tYXNrX3ByZWZpeCApOworCisJLyogRXh0cmFjdCB2YWx1ZXMgZnJvbSBuZXQtZGV2aWNlIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoICggcmMgPSBsbF9wcm90b2NvbC0+ZXRoX2FkZHIgKCBuZXRkZXYtPmxsX2FkZHIsCisJCQkJCSAgICBuaWMtPm1hY19hZGRyZXNzICkgKSAhPSAwICkgeworCQlEQkcgKCAiQ291bGQgbm90IGRldGVybWluZSBpQkZUIE1BQzogJXNcbiIsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCURCRyAoICJpQkZUIE5JQyBNQUMgPSAlc1xuIiwgZXRoX250b2EgKCBuaWMtPm1hY19hZGRyZXNzICkgKTsKKwluaWMtPnBjaV9idXNfZGV2X2Z1bmMgPSBuZXRkZXYtPmRldi0+ZGVzYy5sb2NhdGlvbjsKKwlEQkcgKCAiaUJGVCBOSUMgUENJID0gJTA0eFxuIiwgbmljLT5wY2lfYnVzX2Rldl9mdW5jICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBGaWxsIGluIEluaXRpYXRvciBwb3J0aW9uIG9mIGlCRlQKKyAqCisgKiBAdiBpbml0aWF0b3IJCUluaXRpYXRvciBwb3J0aW9uIG9mIGlCRlQKKyAqIEB2IHN0cmluZ3MJCWlCRlQgc3RyaW5nIGJsb2NrIGRlc2NyaXB0b3IKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliZnRfZmlsbF9pbml0aWF0b3IgKCBzdHJ1Y3QgaWJmdF9pbml0aWF0b3IgKmluaXRpYXRvciwKKwkJCQkgc3RydWN0IGliZnRfc3RyaW5nX2Jsb2NrICpzdHJpbmdzICkgeworCWNvbnN0IGNoYXIgKmluaXRpYXRvcl9pcW4gPSBpc2NzaV9pbml0aWF0b3JfaXFuKCk7CisJaW50IHJjOworCisJaWYgKCAoIHJjID0gaWJmdF9zZXRfc3RyaW5nICggc3RyaW5ncywgJmluaXRpYXRvci0+aW5pdGlhdG9yX25hbWUsCisJCQkJICAgICAgaW5pdGlhdG9yX2lxbiApICkgIT0gMCApCisJCXJldHVybiByYzsKKwlEQkcgKCAiaUJGVCBpbml0aWF0b3IgaG9zdG5hbWUgPSAlc1xuIiwKKwkgICAgICBpYmZ0X3N0cmluZyAoIHN0cmluZ3MsICZpbml0aWF0b3ItPmluaXRpYXRvcl9uYW1lICkgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEZpbGwgaW4gVGFyZ2V0IENIQVAgcG9ydGlvbiBvZiBpQkZUCisgKgorICogQHYgdGFyZ2V0CQlUYXJnZXQgcG9ydGlvbiBvZiBpQkZUCisgKiBAdiBzdHJpbmdzCQlpQkZUIHN0cmluZyBibG9jayBkZXNjcmlwdG9yCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJmdF9maWxsX3RhcmdldF9jaGFwICggc3RydWN0IGliZnRfdGFyZ2V0ICp0YXJnZXQsCisJCQkJICAgc3RydWN0IGliZnRfc3RyaW5nX2Jsb2NrICpzdHJpbmdzLAorCQkJCSAgIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSApIHsKKwlpbnQgcmM7CisKKwlpZiAoICEgKCBpc2NzaS0+c3RhdHVzICYgSVNDU0lfU1RBVFVTX0FVVEhfRk9SV0FSRF9SRVFVSVJFRCApICkKKwkJcmV0dXJuIDA7CisKKwlhc3NlcnQgKCBpc2NzaS0+aW5pdGlhdG9yX3VzZXJuYW1lICk7CisJYXNzZXJ0ICggaXNjc2ktPmluaXRpYXRvcl9wYXNzd29yZCApOworCisJdGFyZ2V0LT5jaGFwX3R5cGUgPSBJQkZUX0NIQVBfT05FX1dBWTsKKwlpZiAoICggcmMgPSBpYmZ0X3NldF9zdHJpbmcgKCBzdHJpbmdzLCAmdGFyZ2V0LT5jaGFwX25hbWUsCisJCQkJICAgICAgaXNjc2ktPmluaXRpYXRvcl91c2VybmFtZSApICkgIT0gMCApCisJCXJldHVybiByYzsKKwlEQkcgKCAiaUJGVCB0YXJnZXQgdXNlcm5hbWUgPSAlc1xuIiwKKwkgICAgICBpYmZ0X3N0cmluZyAoIHN0cmluZ3MsICZ0YXJnZXQtPmNoYXBfbmFtZSApICk7CisJaWYgKCAoIHJjID0gaWJmdF9zZXRfc3RyaW5nICggc3RyaW5ncywgJnRhcmdldC0+Y2hhcF9zZWNyZXQsCisJCQkJICAgICAgaXNjc2ktPmluaXRpYXRvcl9wYXNzd29yZCApICkgIT0gMCApCisJCXJldHVybiByYzsKKwlEQkcgKCAiaUJGVCB0YXJnZXQgcGFzc3dvcmQgPSA8cmVkYWN0ZWQ+XG4iICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBGaWxsIGluIFRhcmdldCBSZXZlcnNlIENIQVAgcG9ydGlvbiBvZiBpQkZUCisgKgorICogQHYgdGFyZ2V0CQlUYXJnZXQgcG9ydGlvbiBvZiBpQkZUCisgKiBAdiBzdHJpbmdzCQlpQkZUIHN0cmluZyBibG9jayBkZXNjcmlwdG9yCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJmdF9maWxsX3RhcmdldF9yZXZlcnNlX2NoYXAgKCBzdHJ1Y3QgaWJmdF90YXJnZXQgKnRhcmdldCwKKwkJCQkJICAgc3RydWN0IGliZnRfc3RyaW5nX2Jsb2NrICpzdHJpbmdzLAorCQkJCQkgICBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2kgKSB7CisJaW50IHJjOworCisJaWYgKCAhICggaXNjc2ktPnN0YXR1cyAmIElTQ1NJX1NUQVRVU19BVVRIX1JFVkVSU0VfUkVRVUlSRUQgKSApCisJCXJldHVybiAwOworCisJYXNzZXJ0ICggaXNjc2ktPmluaXRpYXRvcl91c2VybmFtZSApOworCWFzc2VydCAoIGlzY3NpLT5pbml0aWF0b3JfcGFzc3dvcmQgKTsKKwlhc3NlcnQgKCBpc2NzaS0+dGFyZ2V0X3VzZXJuYW1lICk7CisJYXNzZXJ0ICggaXNjc2ktPnRhcmdldF9wYXNzd29yZCApOworCisJdGFyZ2V0LT5jaGFwX3R5cGUgPSBJQkZUX0NIQVBfTVVUVUFMOworCWlmICggKCByYyA9IGliZnRfc2V0X3N0cmluZyAoIHN0cmluZ3MsICZ0YXJnZXQtPnJldmVyc2VfY2hhcF9uYW1lLAorCQkJCSAgICAgIGlzY3NpLT50YXJnZXRfdXNlcm5hbWUgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJREJHICggImlCRlQgdGFyZ2V0IHJldmVyc2UgdXNlcm5hbWUgPSAlc1xuIiwKKwkgICAgICBpYmZ0X3N0cmluZyAoIHN0cmluZ3MsICZ0YXJnZXQtPmNoYXBfbmFtZSApICk7CisJaWYgKCAoIHJjID0gaWJmdF9zZXRfc3RyaW5nICggc3RyaW5ncywgJnRhcmdldC0+cmV2ZXJzZV9jaGFwX3NlY3JldCwKKwkJCQkgICAgICBpc2NzaS0+dGFyZ2V0X3Bhc3N3b3JkICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCURCRyAoICJpQkZUIHRhcmdldCByZXZlcnNlIHBhc3N3b3JkID0gPHJlZGFjdGVkPlxuIiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmlsbCBpbiBUYXJnZXQgcG9ydGlvbiBvZiBpQkZUCisgKgorICogQHYgdGFyZ2V0CQlUYXJnZXQgcG9ydGlvbiBvZiBpQkZUCisgKiBAdiBzdHJpbmdzCQlpQkZUIHN0cmluZyBibG9jayBkZXNjcmlwdG9yCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJmdF9maWxsX3RhcmdldCAoIHN0cnVjdCBpYmZ0X3RhcmdldCAqdGFyZ2V0LAorCQkJICAgICAgc3RydWN0IGliZnRfc3RyaW5nX2Jsb2NrICpzdHJpbmdzLAorCQkJICAgICAgc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpICkgeworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luX3RhcmdldCA9CisJCSggc3RydWN0IHNvY2thZGRyX2luICogKSAmaXNjc2ktPnRhcmdldF9zb2NrYWRkcjsKKwlpbnQgcmM7CisKKwkvKiBGaWxsIGluIFRhcmdldCB2YWx1ZXMgKi8KKwlpYmZ0X3NldF9pcGFkZHIgKCAmdGFyZ2V0LT5pcF9hZGRyZXNzLCBzaW5fdGFyZ2V0LT5zaW5fYWRkciApOworCURCRyAoICJpQkZUIHRhcmdldCBJUCA9ICVzXG4iLCBpYmZ0X2lwYWRkciAoICZ0YXJnZXQtPmlwX2FkZHJlc3MgKSApOworCXRhcmdldC0+c29ja2V0ID0gbnRvaHMgKCBzaW5fdGFyZ2V0LT5zaW5fcG9ydCApOworCURCRyAoICJpQkZUIHRhcmdldCBwb3J0ID0gJWRcbiIsIHRhcmdldC0+c29ja2V0ICk7CisJaWYgKCAoIHJjID0gaWJmdF9zZXRfc3RyaW5nICggc3RyaW5ncywgJnRhcmdldC0+dGFyZ2V0X25hbWUsCisJCQkJICAgICAgaXNjc2ktPnRhcmdldF9pcW4gKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJREJHICggImlCRlQgdGFyZ2V0IG5hbWUgPSAlc1xuIiwKKwkgICAgICBpYmZ0X3N0cmluZyAoIHN0cmluZ3MsICZ0YXJnZXQtPnRhcmdldF9uYW1lICkgKTsKKwlpZiAoICggcmMgPSBpYmZ0X2ZpbGxfdGFyZ2V0X2NoYXAgKCB0YXJnZXQsIHN0cmluZ3MsIGlzY3NpICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCWlmICggKCByYyA9IGliZnRfZmlsbF90YXJnZXRfcmV2ZXJzZV9jaGFwICggdGFyZ2V0LCBzdHJpbmdzLAorCQkJCQkJICAgIGlzY3NpICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmlsbCBpbiBhbGwgdmFyaWFibGUgcG9ydGlvbnMgb2YgaUJGVAorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IGluaXRpYXRvcl9pcW4JSW5pdGlhdG9yIElRTgorICogQHYgc3RfdGFyZ2V0CQlUYXJnZXQgc29ja2V0IGFkZHJlc3MKKyAqIEB2IHRhcmdldF9pcW4JVGFyZ2V0IElRTgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICovCitpbnQgaWJmdF9maWxsX2RhdGEgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSApIHsKKwlzdHJ1Y3QgaWJmdF9zdHJpbmdfYmxvY2sgc3RyaW5ncyA9IHsKKwkJLnRhYmxlID0gJmliZnRhYi50YWJsZSwKKwkJLm9mZnNldCA9IG9mZnNldG9mICggdHlwZW9mICggaWJmdGFiICksIHN0cmluZ3MgKSwKKwl9OworCWludCByYzsKKworCS8qIEZpbGwgaW4gTklDLCBJbml0aWF0b3IgYW5kIFRhcmdldCBwb3J0aW9ucyAqLworCWlmICggKCByYyA9IGliZnRfZmlsbF9uaWMgKCAmaWJmdGFiLm5pYywgJnN0cmluZ3MsIG5ldGRldiApICkgIT0gMCApCisJCXJldHVybiByYzsKKwlpZiAoICggcmMgPSBpYmZ0X2ZpbGxfaW5pdGlhdG9yICggJmliZnRhYi5pbml0aWF0b3IsCisJCQkJCSAgJnN0cmluZ3MgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJaWYgKCAoIHJjID0gaWJmdF9maWxsX3RhcmdldCAoICZpYmZ0YWIudGFyZ2V0LCAmc3RyaW5ncywKKwkJCQkgICAgICAgaXNjc2kgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBVcGRhdGUgY2hlY2tzdW0gKi8KKwlhY3BpX2ZpeF9jaGVja3N1bSAoICZpYmZ0YWIudGFibGUuYWNwaSApOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9pbnQxMy5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvaW50MTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2I2MTNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvaW50MTMuYwpAQCAtMCwwICsxLDcxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL2Jsb2NrZGV2Lmg+CisjaW5jbHVkZSA8Z3B4ZS9tZW1tYXAuaD4KKyNpbmNsdWRlIDxyZWFsbW9kZS5oPgorI2luY2x1ZGUgPGJpb3MuaD4KKyNpbmNsdWRlIDxiaW9zaW50Lmg+CisjaW5jbHVkZSA8Ym9vdHNlY3Rvci5oPgorI2luY2x1ZGUgPGludDEzLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIElOVCAxMyBlbXVsYXRpb24KKyAqCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZXhwb3J0aW5nIGJsb2NrIGRldmljZXMgdmlhCisgKiB0aGUgQklPUyBJTlQgMTMgZGlzayBpbnRlcnJ1cHQgaW50ZXJmYWNlLiAgCisgKgorICovCisKKy8qKiBWZWN0b3IgZm9yIGNoYWluaW5nIHRvIG90aGVyIElOVCAxMyBoYW5kbGVycyAqLworc3RhdGljIHN0cnVjdCBzZWdvZmYgX190ZXh0MTYgKCBpbnQxM192ZWN0b3IgKTsKKyNkZWZpbmUgaW50MTNfdmVjdG9yIF9fdXNlX3RleHQxNiAoIGludDEzX3ZlY3RvciApCisKKy8qKiBBc3NlbWJseSB3cmFwcGVyICovCitleHRlcm4gdm9pZCBpbnQxM193cmFwcGVyICggdm9pZCApOworCisvKiogTGlzdCBvZiByZWdpc3RlcmVkIGVtdWxhdGVkIGRyaXZlcyAqLworc3RhdGljIExJU1RfSEVBRCAoIGRyaXZlcyApOworCisvKioKKyAqIE51bWJlciBvZiBCSU9TIGRyaXZlcworICoKKyAqIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgZHJpdmVzIGluIHRoZSBzeXN0ZW0gYXMgYSB3aG9sZQorICogKGkuZS4gYSBtaXJyb3Igb2YgdGhlIGNvdW50ZXIgYXQgNDA6NzUpLCByYXRoZXIgdGhhbiBhIGNvdW50IG9mIHRoZQorICogbnVtYmVyIG9mIGVtdWxhdGVkIGRyaXZlcy4KKyAqLworc3RhdGljIHVpbnQ4X3QgbnVtX2RyaXZlczsKKworLyoqCisgKiBVcGRhdGUgQklPUyBkcml2ZSBjb3VudAorICovCitzdGF0aWMgdm9pZCBpbnQxM19zZXRfbnVtX2RyaXZlcyAoIHZvaWQgKSB7CisJc3RydWN0IGludDEzX2RyaXZlICpkcml2ZTsKKworCS8qIEdldCBjdXJyZW50IGRyaXZlIGNvdW50ICovCisJZ2V0X3JlYWwgKCBudW1fZHJpdmVzLCBCREFfU0VHLCBCREFfTlVNX0RSSVZFUyApOworCisJLyogRW5zdXJlIGNvdW50IGlzIGxhcmdlIGVub3VnaCB0byBjb3ZlciBhbGwgb2Ygb3VyIGVtdWxhdGVkIGRyaXZlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBkcml2ZSwgJmRyaXZlcywgbGlzdCApIHsKKwkJaWYgKCBudW1fZHJpdmVzIDw9ICggZHJpdmUtPmRyaXZlICYgMHg3ZiApICkKKwkJCW51bV9kcml2ZXMgPSAoICggZHJpdmUtPmRyaXZlICYgMHg3ZiApICsgMSApOworCX0KKworCS8qIFVwZGF0ZSBjdXJyZW50IGRyaXZlIGNvdW50ICovCisJcHV0X3JlYWwgKCBudW1fZHJpdmVzLCBCREFfU0VHLCBCREFfTlVNX0RSSVZFUyApOworfQorCisvKioKKyAqIENoZWNrIG51bWJlciBvZiBkcml2ZXMKKyAqLworc3RhdGljIHZvaWQgaW50MTNfY2hlY2tfbnVtX2RyaXZlcyAoIHZvaWQgKSB7CisJdWludDhfdCBjaGVja19udW1fZHJpdmVzOworCisJZ2V0X3JlYWwgKCBjaGVja19udW1fZHJpdmVzLCBCREFfU0VHLCBCREFfTlVNX0RSSVZFUyApOworCWlmICggY2hlY2tfbnVtX2RyaXZlcyAhPSBudW1fZHJpdmVzICkgeworCQlpbnQxM19zZXRfbnVtX2RyaXZlcygpOworCQlEQkcgKCAiSU5UMTMgZml4aW5nIHVwIG51bWJlciBvZiBkcml2ZXMgZnJvbSAlZCB0byAlZFxuIiwKKwkJICAgICAgY2hlY2tfbnVtX2RyaXZlcywgbnVtX2RyaXZlcyApOworCX0KK30KKworLyoqCisgKiBJTlQgMTMsIDAwIC0gUmVzZXQgZGlzayBzeXN0ZW0KKyAqCisgKiBAdiBkcml2ZQkJRW11bGF0ZWQgZHJpdmUKKyAqIEByZXQgc3RhdHVzCQlTdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGludDEzX3Jlc2V0ICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSBfX3VudXNlZCwKKwkJCSBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiBfX3VudXNlZCApIHsKKwlEQkcgKCAiUmVzZXQgZHJpdmVcbiIgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBJTlQgMTMsIDAxIC0gR2V0IHN0YXR1cyBvZiBsYXN0IG9wZXJhdGlvbgorICoKKyAqIEB2IGRyaXZlCQlFbXVsYXRlZCBkcml2ZQorICogQHJldCBzdGF0dXMJCVN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaW50MTNfZ2V0X2xhc3Rfc3RhdHVzICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSwKKwkJCQkgICBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiBfX3VudXNlZCApIHsKKwlEQkcgKCAiR2V0IHN0YXR1cyBvZiBsYXN0IG9wZXJhdGlvblxuIiApOworCXJldHVybiBkcml2ZS0+bGFzdF9zdGF0dXM7Cit9CisKKy8qKgorICogUmVhZCAvIHdyaXRlIHNlY3RvcnMKKyAqCisgKiBAdiBkcml2ZQkJRW11bGF0ZWQgZHJpdmUKKyAqIEB2IGFsCQlOdW1iZXIgb2Ygc2VjdG9ycyB0byByZWFkIG9yIHdyaXRlIChtdXN0IGJlIG5vbnplcm8pCisgKiBAdiBjaAkJTG93IGJpdHMgb2YgY3lsaW5kZXIgbnVtYmVyCisgKiBAdiBjbCAoYml0cyA3OjYpCUhpZ2ggYml0cyBvZiBjeWxpbmRlciBudW1iZXIKKyAqIEB2IGNsIChiaXRzIDU6MCkJU2VjdG9yIG51bWJlcgorICogQHYgZGgJCUhlYWQgbnVtYmVyCisgKiBAdiBlczpieAkJRGF0YSBidWZmZXIKKyAqIEB2IGlvCQlSZWFkIC8gd3JpdGUgbWV0aG9kCisgKiBAcmV0IHN0YXR1cwkJU3RhdHVzIGNvZGUKKyAqIEByZXQgYWwJCU51bWJlciBvZiBzZWN0b3JzIHJlYWQgb3Igd3JpdHRlbgorICovCitzdGF0aWMgaW50IGludDEzX3J3X3NlY3RvcnMgKCBzdHJ1Y3QgaW50MTNfZHJpdmUgKmRyaXZlLAorCQkJICAgICAgc3RydWN0IGkzODZfYWxsX3JlZ3MgKml4ODYsCisJCQkgICAgICBpbnQgKCAqIGlvICkgKCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiwKKwkJCQkJICAgICB1aW50NjRfdCBibG9jaywKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LAorCQkJCQkgICAgIHVzZXJwdHJfdCBidWZmZXIgKSApIHsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiA9IGRyaXZlLT5ibG9ja2RldjsKKwl1bnNpZ25lZCBpbnQgY3lsaW5kZXIsIGhlYWQsIHNlY3RvcjsKKwl1bnNpZ25lZCBsb25nIGxiYTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdXNlcnB0cl90IGJ1ZmZlcjsKKwlpbnQgcmM7CisKKwkvKiBWYWxpZGF0ZSBibG9ja3NpemUgKi8KKwlpZiAoIGJsb2NrZGV2LT5ibGtzaXplICE9IElOVDEzX0JMS1NJWkUgKSB7CisJCURCRyAoICJJbnZhbGlkIGJsb2Nrc2l6ZSAoJXpkKSBmb3Igbm9uLWV4dGVuZGVkIHJlYWQvd3JpdGVcbiIsCisJCSAgICAgIGJsb2NrZGV2LT5ibGtzaXplICk7CisJCXJldHVybiAtSU5UMTNfU1RBVFVTX0lOVkFMSUQ7CisJfQorCQorCS8qIENhbGN1bGF0ZSBwYXJhbWV0ZXJzICovCisJY3lsaW5kZXIgPSAoICggKCBpeDg2LT5yZWdzLmNsICYgMHhjMCApIDw8IDIgKSB8IGl4ODYtPnJlZ3MuY2ggKTsKKwlhc3NlcnQgKCBjeWxpbmRlciA8IGRyaXZlLT5jeWxpbmRlcnMgKTsKKwloZWFkID0gaXg4Ni0+cmVncy5kaDsKKwlhc3NlcnQgKCBoZWFkIDwgZHJpdmUtPmhlYWRzICk7CisJc2VjdG9yID0gKCBpeDg2LT5yZWdzLmNsICYgMHgzZiApOworCWFzc2VydCAoICggc2VjdG9yID49IDEgKSAmJiAoIHNlY3RvciA8PSBkcml2ZS0+c2VjdG9yc19wZXJfdHJhY2sgKSApOworCWxiYSA9ICggKCAoICggY3lsaW5kZXIgKiBkcml2ZS0+aGVhZHMgKSArIGhlYWQgKQorCQkgICogZHJpdmUtPnNlY3RvcnNfcGVyX3RyYWNrICkgKyBzZWN0b3IgLSAxICk7CisJY291bnQgPSBpeDg2LT5yZWdzLmFsOworCWJ1ZmZlciA9IHJlYWxfdG9fdXNlciAoIGl4ODYtPnNlZ3MuZXMsIGl4ODYtPnJlZ3MuYnggKTsKKworCURCRyAoICJDL0gvUyAlZC8lZC8lZCA9IExCQSAlI2x4IDwtPiAlMDR4OiUwNHggKGNvdW50ICVkKVxuIiwgY3lsaW5kZXIsCisJICAgICAgaGVhZCwgc2VjdG9yLCBsYmEsIGl4ODYtPnNlZ3MuZXMsIGl4ODYtPnJlZ3MuYngsIGNvdW50ICk7CisKKwkvKiBSZWFkIGZyb20gLyB3cml0ZSB0byBibG9jayBkZXZpY2UgKi8KKwlpZiAoICggcmMgPSBpbyAoIGJsb2NrZGV2LCBsYmEsIGNvdW50LCBidWZmZXIgKSApICE9IDAgKSB7CisJCURCRyAoICJJTlQgMTMgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiAtSU5UMTNfU1RBVFVTX1JFQURfRVJST1I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSU5UIDEzLCAwMiAtIFJlYWQgc2VjdG9ycworICoKKyAqIEB2IGRyaXZlCQlFbXVsYXRlZCBkcml2ZQorICogQHYgYWwJCU51bWJlciBvZiBzZWN0b3JzIHRvIHJlYWQgKG11c3QgYmUgbm9uemVybykKKyAqIEB2IGNoCQlMb3cgYml0cyBvZiBjeWxpbmRlciBudW1iZXIKKyAqIEB2IGNsIChiaXRzIDc6NikJSGlnaCBiaXRzIG9mIGN5bGluZGVyIG51bWJlcgorICogQHYgY2wgKGJpdHMgNTowKQlTZWN0b3IgbnVtYmVyCisgKiBAdiBkaAkJSGVhZCBudW1iZXIKKyAqIEB2IGVzOmJ4CQlEYXRhIGJ1ZmZlcgorICogQHJldCBzdGF0dXMJCVN0YXR1cyBjb2RlCisgKiBAcmV0IGFsCQlOdW1iZXIgb2Ygc2VjdG9ycyByZWFkCisgKi8KK3N0YXRpYyBpbnQgaW50MTNfcmVhZF9zZWN0b3JzICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSwKKwkJCQlzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiApIHsKKwlEQkcgKCAiUmVhZDogIiApOworCXJldHVybiBpbnQxM19yd19zZWN0b3JzICggZHJpdmUsIGl4ODYsIGRyaXZlLT5ibG9ja2Rldi0+b3AtPnJlYWQgKTsKK30KKworLyoqCisgKiBJTlQgMTMsIDAzIC0gV3JpdGUgc2VjdG9ycworICoKKyAqIEB2IGRyaXZlCQlFbXVsYXRlZCBkcml2ZQorICogQHYgYWwJCU51bWJlciBvZiBzZWN0b3JzIHRvIHdyaXRlIChtdXN0IGJlIG5vbnplcm8pCisgKiBAdiBjaAkJTG93IGJpdHMgb2YgY3lsaW5kZXIgbnVtYmVyCisgKiBAdiBjbCAoYml0cyA3OjYpCUhpZ2ggYml0cyBvZiBjeWxpbmRlciBudW1iZXIKKyAqIEB2IGNsIChiaXRzIDU6MCkJU2VjdG9yIG51bWJlcgorICogQHYgZGgJCUhlYWQgbnVtYmVyCisgKiBAdiBlczpieAkJRGF0YSBidWZmZXIKKyAqIEByZXQgc3RhdHVzCQlTdGF0dXMgY29kZQorICogQHJldCBhbAkJTnVtYmVyIG9mIHNlY3RvcnMgd3JpdHRlbgorICovCitzdGF0aWMgaW50IGludDEzX3dyaXRlX3NlY3RvcnMgKCBzdHJ1Y3QgaW50MTNfZHJpdmUgKmRyaXZlLAorCQkJCSBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiApIHsKKwlEQkcgKCAiV3JpdGU6ICIgKTsKKwlyZXR1cm4gaW50MTNfcndfc2VjdG9ycyAoIGRyaXZlLCBpeDg2LCBkcml2ZS0+YmxvY2tkZXYtPm9wLT53cml0ZSApOworfQorCisvKioKKyAqIElOVCAxMywgMDggLSBHZXQgZHJpdmUgcGFyYW1ldGVycworICoKKyAqIEB2IGRyaXZlCQlFbXVsYXRlZCBkcml2ZQorICogQHJldCBzdGF0dXMJCVN0YXR1cyBjb2RlCisgKiBAcmV0IGNoCQlMb3cgYml0cyBvZiBtYXhpbXVtIGN5bGluZGVyIG51bWJlcgorICogQHJldCBjbCAoYml0cyA3OjYpCUhpZ2ggYml0cyBvZiBtYXhpbXVtIGN5bGluZGVyIG51bWJlcgorICogQHJldCBjbCAoYml0cyA1OjApCU1heGltdW0gc2VjdG9yIG51bWJlcgorICogQHJldCBkaAkJTWF4aW11bSBoZWFkIG51bWJlcgorICogQHJldCBkbAkJTnVtYmVyIG9mIGRyaXZlcworICovCitzdGF0aWMgaW50IGludDEzX2dldF9wYXJhbWV0ZXJzICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSwKKwkJCQkgIHN0cnVjdCBpMzg2X2FsbF9yZWdzICppeDg2ICkgeworCXVuc2lnbmVkIGludCBtYXhfY3lsaW5kZXIgPSBkcml2ZS0+Y3lsaW5kZXJzIC0gMTsKKwl1bnNpZ25lZCBpbnQgbWF4X2hlYWQgPSBkcml2ZS0+aGVhZHMgLSAxOworCXVuc2lnbmVkIGludCBtYXhfc2VjdG9yID0gZHJpdmUtPnNlY3RvcnNfcGVyX3RyYWNrOyAvKiBzaWMgKi8KKworCURCRyAoICJHZXQgZHJpdmUgcGFyYW1ldGVyc1xuIiApOworCisJaXg4Ni0+cmVncy5jaCA9ICggbWF4X2N5bGluZGVyICYgMHhmZiApOworCWl4ODYtPnJlZ3MuY2wgPSAoICggKCBtYXhfY3lsaW5kZXIgPj4gOCApIDw8IDYgKSB8IG1heF9zZWN0b3IgKTsKKwlpeDg2LT5yZWdzLmRoID0gbWF4X2hlYWQ7CisJZ2V0X3JlYWwgKCBpeDg2LT5yZWdzLmRsLCBCREFfU0VHLCBCREFfTlVNX0RSSVZFUyApOworCXJldHVybiAwOworfQorCisvKioKKyAqIElOVCAxMywgMTUgLSBHZXQgZGlzayB0eXBlCisgKgorICogQHYgZHJpdmUJCUVtdWxhdGVkIGRyaXZlCisgKiBAcmV0IGFoCQlUeXBlIGNvZGUKKyAqIEByZXQgY3g6ZHgJCVNlY3RvciBjb3VudAorICogQHJldCBzdGF0dXMJCVN0YXR1cyBjb2RlIC8gZGlzayB0eXBlCisgKi8KK3N0YXRpYyBpbnQgaW50MTNfZ2V0X2Rpc2tfdHlwZSAoIHN0cnVjdCBpbnQxM19kcml2ZSAqZHJpdmUsCisJCQkJIHN0cnVjdCBpMzg2X2FsbF9yZWdzICppeDg2ICkgeworCXVpbnQzMl90IGJsb2NrczsKKworCURCRyAoICJHZXQgZGlzayB0eXBlXG4iICk7CisJYmxvY2tzID0gKCAoIGRyaXZlLT5ibG9ja2Rldi0+YmxvY2tzIDw9IDB4ZmZmZmZmZmZVTCApID8KKwkJICAgZHJpdmUtPmJsb2NrZGV2LT5ibG9ja3MgOiAweGZmZmZmZmZmVUwgKTsKKwlpeDg2LT5yZWdzLmN4ID0gKCBibG9ja3MgPj4gMTYgKTsKKwlpeDg2LT5yZWdzLmR4ID0gKCBibG9ja3MgJiAweGZmZmYgKTsKKwlyZXR1cm4gSU5UMTNfRElTS19UWVBFX0hERDsKK30KKworLyoqCisgKiBJTlQgMTMsIDQxIC0gRXh0ZW5zaW9ucyBpbnN0YWxsYXRpb24gY2hlY2sKKyAqCisgKiBAdiBkcml2ZQkJRW11bGF0ZWQgZHJpdmUKKyAqIEB2IGJ4CQkweDU1YWEKKyAqIEByZXQgYngJCTB4YWE1NQorICogQHJldCBjeAkJRXh0ZW5zaW9ucyBBUEkgc3VwcG9ydCBiaXRtYXAKKyAqIEByZXQgc3RhdHVzCQlTdGF0dXMgY29kZSAvIEFQSSB2ZXJzaW9uCisgKi8KK3N0YXRpYyBpbnQgaW50MTNfZXh0ZW5zaW9uX2NoZWNrICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSBfX3VudXNlZCwKKwkJCQkgICBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiApIHsKKwlpZiAoIGl4ODYtPnJlZ3MuYnggPT0gMHg1NWFhICkgeworCQlEQkcgKCAiSU5UIDEzIGV4dGVuc2lvbnMgaW5zdGFsbGF0aW9uIGNoZWNrXG4iICk7CisJCWl4ODYtPnJlZ3MuYnggPSAweGFhNTU7CisJCWl4ODYtPnJlZ3MuY3ggPSBJTlQxM19FWFRFTlNJT05fTElORUFSOworCQlyZXR1cm4gSU5UMTNfRVhURU5TSU9OX1ZFUl8xX1g7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1JTlQxM19TVEFUVVNfSU5WQUxJRDsKKwl9Cit9CisKKy8qKgorICogRXh0ZW5kZWQgcmVhZCAvIHdyaXRlCisgKgorICogQHYgZHJpdmUJCUVtdWxhdGVkIGRyaXZlCisgKiBAdiBkczpzaQkJRGlzayBhZGRyZXNzIHBhY2tldAorICogQHYgaW8JCVJlYWQgLyB3cml0ZSBtZXRob2QKKyAqIEByZXQgc3RhdHVzCQlTdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGludDEzX2V4dGVuZGVkX3J3ICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSwKKwkJCSAgICAgICBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiwKKwkJCSAgICAgICBpbnQgKCAqIGlvICkgKCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiwKKwkJCQkJICAgICAgdWludDY0X3QgYmxvY2ssCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCQkJCSAgICAgIHVzZXJwdHJfdCBidWZmZXIgKSApIHsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiA9IGRyaXZlLT5ibG9ja2RldjsKKwlzdHJ1Y3QgaW50MTNfZGlza19hZGRyZXNzIGFkZHI7CisJdWludDY0X3QgbGJhOworCXVuc2lnbmVkIGxvbmcgY291bnQ7CisJdXNlcnB0cl90IGJ1ZmZlcjsKKwlpbnQgcmM7CisKKwkvKiBSZWFkIHBhcmFtZXRlcnMgZnJvbSBkaXNrIGFkZHJlc3Mgc3RydWN0dXJlICovCisJY29weV9mcm9tX3JlYWwgKCAmYWRkciwgaXg4Ni0+c2Vncy5kcywgaXg4Ni0+cmVncy5zaSwgc2l6ZW9mICggYWRkciApKTsKKwlsYmEgPSBhZGRyLmxiYTsKKwljb3VudCA9IGFkZHIuY291bnQ7CisJYnVmZmVyID0gcmVhbF90b191c2VyICggYWRkci5idWZmZXIuc2VnbWVudCwgYWRkci5idWZmZXIub2Zmc2V0ICk7CisKKwlEQkcgKCAiTEJBICUjbGx4IDwtPiAlMDR4OiUwNHggKGNvdW50ICVsZClcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpbGJhLAorCSAgICAgIGFkZHIuYnVmZmVyLnNlZ21lbnQsIGFkZHIuYnVmZmVyLm9mZnNldCwgY291bnQgKTsKKwkKKwkvKiBSZWFkIGZyb20gLyB3cml0ZSB0byBibG9jayBkZXZpY2UgKi8KKwlpZiAoICggcmMgPSBpbyAoIGJsb2NrZGV2LCBsYmEsIGNvdW50LCBidWZmZXIgKSApICE9IDAgKSB7CisJCURCRyAoICJJTlQgMTMgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiAtSU5UMTNfU1RBVFVTX1JFQURfRVJST1I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSU5UIDEzLCA0MiAtIEV4dGVuZGVkIHJlYWQKKyAqCisgKiBAdiBkcml2ZQkJRW11bGF0ZWQgZHJpdmUKKyAqIEB2IGRzOnNpCQlEaXNrIGFkZHJlc3MgcGFja2V0CisgKiBAcmV0IHN0YXR1cwkJU3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpbnQxM19leHRlbmRlZF9yZWFkICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSwKKwkJCQkgc3RydWN0IGkzODZfYWxsX3JlZ3MgKml4ODYgKSB7CisJREJHICggIkV4dGVuZGVkIHJlYWQ6ICIgKTsKKwlyZXR1cm4gaW50MTNfZXh0ZW5kZWRfcncgKCBkcml2ZSwgaXg4NiwgZHJpdmUtPmJsb2NrZGV2LT5vcC0+cmVhZCApOworfQorCisvKioKKyAqIElOVCAxMywgNDMgLSBFeHRlbmRlZCB3cml0ZQorICoKKyAqIEB2IGRyaXZlCQlFbXVsYXRlZCBkcml2ZQorICogQHYgZHM6c2kJCURpc2sgYWRkcmVzcyBwYWNrZXQKKyAqIEByZXQgc3RhdHVzCQlTdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGludDEzX2V4dGVuZGVkX3dyaXRlICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSwKKwkJCQkgIHN0cnVjdCBpMzg2X2FsbF9yZWdzICppeDg2ICkgeworCURCRyAoICJFeHRlbmRlZCB3cml0ZTogIiApOworCXJldHVybiBpbnQxM19leHRlbmRlZF9ydyAoIGRyaXZlLCBpeDg2LCBkcml2ZS0+YmxvY2tkZXYtPm9wLT53cml0ZSApOworfQorCisvKioKKyAqIElOVCAxMywgNDggLSBHZXQgZXh0ZW5kZWQgcGFyYW1ldGVycworICoKKyAqIEB2IGRyaXZlCQlFbXVsYXRlZCBkcml2ZQorICogQHYgZHM6c2kJCURyaXZlIHBhcmFtZXRlciB0YWJsZQorICogQHJldCBzdGF0dXMJCVN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaW50MTNfZ2V0X2V4dGVuZGVkX3BhcmFtZXRlcnMgKCBzdHJ1Y3QgaW50MTNfZHJpdmUgKmRyaXZlLAorCQkJCQkgICBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiApIHsKKwlzdHJ1Y3QgaW50MTNfZGlza19wYXJhbWV0ZXJzIHBhcmFtcyA9IHsKKwkJLmJ1ZnNpemUgPSBzaXplb2YgKCBwYXJhbXMgKSwKKwkJLmZsYWdzID0gSU5UMTNfRkxfRE1BX1RSQU5TUEFSRU5ULAorCQkuY3lsaW5kZXJzID0gZHJpdmUtPmN5bGluZGVycywKKwkJLmhlYWRzID0gZHJpdmUtPmhlYWRzLAorCQkuc2VjdG9yc19wZXJfdHJhY2sgPSBkcml2ZS0+c2VjdG9yc19wZXJfdHJhY2ssCisJCS5zZWN0b3JzID0gZHJpdmUtPmJsb2NrZGV2LT5ibG9ja3MsCisJCS5zZWN0b3Jfc2l6ZSA9IGRyaXZlLT5ibG9ja2Rldi0+Ymxrc2l6ZSwKKwl9OworCQorCURCRyAoICJHZXQgZXh0ZW5kZWQgZHJpdmUgcGFyYW1ldGVycyB0byAlMDR4OiUwNHhcbiIsCisJICAgICAgaXg4Ni0+c2Vncy5kcywgaXg4Ni0+cmVncy5zaSApOworCisJY29weV90b19yZWFsICggaXg4Ni0+c2Vncy5kcywgaXg4Ni0+cmVncy5zaSwgJnBhcmFtcywKKwkJICAgICAgIHNpemVvZiAoIHBhcmFtcyApICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSU5UIDEzIGhhbmRsZXIKKyAqCisgKi8KK3N0YXRpYyBfX2FzbWNhbGwgdm9pZCBpbnQxMyAoIHN0cnVjdCBpMzg2X2FsbF9yZWdzICppeDg2ICkgeworCWludCBjb21tYW5kID0gaXg4Ni0+cmVncy5haDsKKwl1bnNpZ25lZCBpbnQgYmlvc19kcml2ZSA9IGl4ODYtPnJlZ3MuZGw7CisJc3RydWN0IGludDEzX2RyaXZlICpkcml2ZTsKKwlpbnQgc3RhdHVzOworCisJLyogQ2hlY2sgQklPUyBoYXNuJ3Qga2lsbGVkIG9mZiBvdXIgZHJpdmUgKi8KKwlpbnQxM19jaGVja19udW1fZHJpdmVzKCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggZHJpdmUsICZkcml2ZXMsIGxpc3QgKSB7CisKKwkJaWYgKCBiaW9zX2RyaXZlICE9IGRyaXZlLT5kcml2ZSApIHsKKwkJCS8qIFJlbWFwIGFueSBhY2Nlc3NlcyB0byB0aGlzIGRyaXZlJ3MgbmF0dXJhbCBudW1iZXIgKi8KKwkJCWlmICggYmlvc19kcml2ZSA9PSBkcml2ZS0+bmF0dXJhbF9kcml2ZSApIHsKKwkJCQlEQkcgKCAiSU5UIDEzLCUwNHggKCUwMngpIHJlbWFwcGVkIHRvICIKKwkJCQkgICAgICAiKCUwMngpXG4iLCBpeDg2LT5yZWdzLmF4LAorCQkJCSAgICAgIGJpb3NfZHJpdmUsIGRyaXZlLT5kcml2ZSApOworCQkJCWl4ODYtPnJlZ3MuZGwgPSBkcml2ZS0+ZHJpdmU7CisJCQkJcmV0dXJuOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJCisJCURCRyAoICJJTlQgMTMsJTA0eCAoJTAyeCk6ICIsIGl4ODYtPnJlZ3MuYXgsIGRyaXZlLT5kcml2ZSApOworCisJCXN3aXRjaCAoIGNvbW1hbmQgKSB7CisJCWNhc2UgSU5UMTNfUkVTRVQ6CisJCQlzdGF0dXMgPSBpbnQxM19yZXNldCAoIGRyaXZlLCBpeDg2ICk7CisJCQlicmVhazsKKwkJY2FzZSBJTlQxM19HRVRfTEFTVF9TVEFUVVM6CisJCQlzdGF0dXMgPSBpbnQxM19nZXRfbGFzdF9zdGF0dXMgKCBkcml2ZSwgaXg4NiApOworCQkJYnJlYWs7CisJCWNhc2UgSU5UMTNfUkVBRF9TRUNUT1JTOgorCQkJc3RhdHVzID0gaW50MTNfcmVhZF9zZWN0b3JzICggZHJpdmUsIGl4ODYgKTsKKwkJCWJyZWFrOworCQljYXNlIElOVDEzX1dSSVRFX1NFQ1RPUlM6CisJCQlzdGF0dXMgPSBpbnQxM193cml0ZV9zZWN0b3JzICggZHJpdmUsIGl4ODYgKTsKKwkJCWJyZWFrOworCQljYXNlIElOVDEzX0dFVF9QQVJBTUVURVJTOgorCQkJc3RhdHVzID0gaW50MTNfZ2V0X3BhcmFtZXRlcnMgKCBkcml2ZSwgaXg4NiApOworCQkJYnJlYWs7CisJCWNhc2UgSU5UMTNfR0VUX0RJU0tfVFlQRToKKwkJCXN0YXR1cyA9IGludDEzX2dldF9kaXNrX3R5cGUgKCBkcml2ZSwgaXg4NiApOworCQkJYnJlYWs7CisJCWNhc2UgSU5UMTNfRVhURU5TSU9OX0NIRUNLOgorCQkJc3RhdHVzID0gaW50MTNfZXh0ZW5zaW9uX2NoZWNrICggZHJpdmUsIGl4ODYgKTsKKwkJCWJyZWFrOworCQljYXNlIElOVDEzX0VYVEVOREVEX1JFQUQ6CisJCQlzdGF0dXMgPSBpbnQxM19leHRlbmRlZF9yZWFkICggZHJpdmUsIGl4ODYgKTsKKwkJCWJyZWFrOworCQljYXNlIElOVDEzX0VYVEVOREVEX1dSSVRFOgorCQkJc3RhdHVzID0gaW50MTNfZXh0ZW5kZWRfd3JpdGUgKCBkcml2ZSwgaXg4NiApOworCQkJYnJlYWs7CisJCWNhc2UgSU5UMTNfR0VUX0VYVEVOREVEX1BBUkFNRVRFUlM6CisJCQlzdGF0dXMgPSBpbnQxM19nZXRfZXh0ZW5kZWRfcGFyYW1ldGVycyAoIGRyaXZlLCBpeDg2ICk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCRyAoICIqKiogVW5yZWNvZ25pc2VkIElOVCAxMyAqKipcbiIgKTsKKwkJCXN0YXR1cyA9IC1JTlQxM19TVEFUVVNfSU5WQUxJRDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogU3RvcmUgc3RhdHVzIGZvciBJTlQgMTMsMDEgKi8KKwkJZHJpdmUtPmxhc3Rfc3RhdHVzID0gc3RhdHVzOworCisJCS8qIE5lZ2F0aXZlIHN0YXR1cyBpbmRpY2F0ZXMgYW4gZXJyb3IgKi8KKwkJaWYgKCBzdGF0dXMgPCAwICkgeworCQkJc3RhdHVzID0gLXN0YXR1czsKKwkJCURCRyAoICJJTlQgMTMgcmV0dXJuaW5nIGZhaWx1cmUgc3RhdHVzICV4XG4iLCBzdGF0dXMgKTsKKwkJfSBlbHNlIHsKKwkJCWl4ODYtPmZsYWdzICY9IH5DRjsKKwkJfQorCQlpeDg2LT5yZWdzLmFoID0gc3RhdHVzOworCisJCS8qIFNldCBPRiB0byBpbmRpY2F0ZSB0byB3cmFwcGVyIG5vdCB0byBjaGFpbiB0aGlzIGNhbGwgKi8KKwkJaXg4Ni0+ZmxhZ3MgfD0gT0Y7CisKKwkJcmV0dXJuOworCX0KK30KKworLyoqCisgKiBIb29rIElOVCAxMyBoYW5kbGVyCisgKgorICovCitzdGF0aWMgdm9pZCBob29rX2ludDEzICggdm9pZCApIHsKKwkvKiBBc3NlbWJseSB3cmFwcGVyIHRvIGNhbGwgaW50MTMoKS4gIGludDEzKCkgc2V0cyBPRiBpZiB3ZQorCSAqIHNob3VsZCBub3QgY2hhaW4gdG8gdGhlIHByZXZpb3VzIGhhbmRsZXIuICAoVGhlIHdyYXBwZXIKKwkgKiBjbGVhcnMgQ0YgYW5kIE9GIGJlZm9yZSBjYWxsaW5nIGludDEzKCkpLgorCSAqLworCV9fYXNtX18gIF9fdm9sYXRpbGVfXyAoCisJICAgICAgIFRFWFQxNl9DT0RFICggIlxuaW50MTNfd3JhcHBlcjpcblx0IgorCQkJICAgICAvKiBQcmVzZXJ2ZSAlYXggYW5kICVkeCBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLworCQkJICAgICAicHVzaHcgJSVicFxuXHQiCisJCQkgICAgICJtb3Z3ICUlc3AsICUlYnBcblx0IgkJCSAgICAgCisJCQkgICAgICJwdXNodyAlJWF4XG5cdCIKKwkJCSAgICAgInB1c2h3ICUlZHhcblx0IgorCQkJICAgICAvKiBDbGVhciBPRiwgc2V0IENGLCBjYWxsIGludDEzKCkgKi8KKwkJCSAgICAgIm9yYiAkMCwgJSVhbFxuXHQiIAorCQkJICAgICAic3RjXG5cdCIKKwkJCSAgICAgInB1c2hsICUwXG5cdCIKKwkJCSAgICAgInB1c2h3ICUlY3Ncblx0IgorCQkJICAgICAiY2FsbCBwcm90X2NhbGxcblx0IgorCQkJICAgICAvKiBDaGFpbiBpZiBPRiBub3Qgc2V0ICovCisJCQkgICAgICJqbyAxZlxuXHQiCisJCQkgICAgICJwdXNoZndcblx0IgorCQkJICAgICAibGNhbGwgKiUlY3M6aW50MTNfdmVjdG9yXG5cdCIKKwkJCSAgICAgIlxuMTpcblx0IgorCQkJICAgICAvKiBPdmVyd3JpdGUgZmxhZ3MgZm9yIGlyZXQgKi8KKwkJCSAgICAgInB1c2hmd1xuXHQiCisJCQkgICAgICJwb3B3IDYoJSVicClcblx0IgorCQkJICAgICAvKiBGaXggdXAgJWRsOgorCQkJICAgICAgKgorCQkJICAgICAgKiBJTlQgMTMsMTUgOiBkbyBub3RoaW5nCisJCQkgICAgICAqIElOVCAxMywwOCA6IGxvYWQgd2l0aCBudW1iZXIgb2YgZHJpdmVzCisJCQkgICAgICAqIGFsbCBvdGhlcnM6IHJlc3RvcmUgb3JpZ2luYWwgdmFsdWUKKwkJCSAgICAgICovCisJCQkgICAgICJjbXBiICQweDE1LCAtMSglJWJwKVxuXHQiCisJCQkgICAgICJqZSAyZlxuXHQiCisJCQkgICAgICJtb3ZiIC00KCUlYnApLCAlJWRsXG5cdCIKKwkJCSAgICAgImNtcGIgJDB4MDgsIC0xKCUlYnApXG5cdCIKKwkJCSAgICAgImpuZSAyZlxuXHQiCisJCQkgICAgICJwdXNodyAlJWRzXG5cdCIKKwkJCSAgICAgInB1c2h3ICUxXG5cdCIKKwkJCSAgICAgInBvcHcgJSVkc1xuXHQiCisJCQkgICAgICJtb3ZiICVjMiwgJSVkbFxuXHQiCisJCQkgICAgICJwb3B3ICUlZHNcblx0IgorCQkJICAgICAvKiBSZXR1cm4gKi8KKwkJCSAgICAgIlxuMjpcblx0IgorCQkJICAgICAibW92dyAlJWJwLCAlJXNwXG5cdCIKKwkJCSAgICAgInBvcHcgJSVicFxuXHQiCisJCQkgICAgICJpcmV0XG5cdCIgKQorCSAgICAgICA6IDogImkiICggaW50MTMgKSwgImkiICggQkRBX1NFRyApLCAiaSIgKCBCREFfTlVNX0RSSVZFUyApICk7CisKKwlob29rX2Jpb3NfaW50ZXJydXB0ICggMHgxMywgKCB1bnNpZ25lZCBpbnQgKSBpbnQxM193cmFwcGVyLAorCQkJICAgICAgJmludDEzX3ZlY3RvciApOworfQorCisvKioKKyAqIFVuaG9vayBJTlQgMTMgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZCB1bmhvb2tfaW50MTMgKCB2b2lkICkgeworCXVuaG9va19iaW9zX2ludGVycnVwdCAoIDB4MTMsICggdW5zaWduZWQgaW50ICkgaW50MTNfd3JhcHBlciwKKwkJCQkmaW50MTNfdmVjdG9yICk7Cit9CisKKy8qKgorICogR3Vlc3MgSU5UIDEzIGRyaXZlIGdlb21ldHJ5CisgKgorICogQHYgZHJpdmUJCUVtdWxhdGVkIGRyaXZlCisgKgorICogR3Vlc3NlcyB0aGUgZHJpdmUgZ2VvbWV0cnkgYnkgaW5zcGVjdGluZyB0aGUgcGFydGl0aW9uIHRhYmxlLgorICovCitzdGF0aWMgdm9pZCBndWVzc19pbnQxM19nZW9tZXRyeSAoIHN0cnVjdCBpbnQxM19kcml2ZSAqZHJpdmUgKSB7CisJc3RydWN0IG1hc3Rlcl9ib290X3JlY29yZCBtYnI7CisJc3RydWN0IHBhcnRpdGlvbl90YWJsZV9lbnRyeSAqcGFydGl0aW9uOworCXVuc2lnbmVkIGludCBndWVzc2VkX2hlYWRzID0gMjU1OworCXVuc2lnbmVkIGludCBndWVzc2VkX3NlY3RvcnNfcGVyX3RyYWNrID0gNjM7CisJdW5zaWduZWQgbG9uZyBibG9ja3M7CisJdW5zaWduZWQgbG9uZyBibG9ja3NfcGVyX2N5bDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIERvbid0IGV2ZW4gdHJ5IHdoZW4gdGhlIGJsa3NpemUgaXMgaW52YWxpZCBmb3IgQy9IL1MgYWNjZXNzICovCisJaWYgKCBkcml2ZS0+YmxvY2tkZXYtPmJsa3NpemUgIT0gSU5UMTNfQkxLU0laRSApCisJCXJldHVybjsKKworCS8qIFNjYW4gdGhyb3VnaCBwYXJ0aXRpb24gdGFibGUgYW5kIG1vZGlmeSBndWVzc2VzIGZvciBoZWFkcworCSAqIGFuZCBzZWN0b3JzX3Blcl90cmFjayBpZiB3ZSBmaW5kIGFueSB1c2VkIHBhcnRpdGlvbnMuCisJICovCisJaWYgKCBkcml2ZS0+YmxvY2tkZXYtPm9wLT5yZWFkICggZHJpdmUtPmJsb2NrZGV2LCAwLCAxLAorCQkJCSAgICAgICAgIHZpcnRfdG9fdXNlciAoICZtYnIgKSApID09IDAgKSB7CisJCWZvciAoIGkgPSAwIDsgaSA8IDQgOyBpKysgKSB7CisJCQlwYXJ0aXRpb24gPSAmbWJyLnBhcnRpdGlvbnNbaV07CisJCQlpZiAoICEgcGFydGl0aW9uLT50eXBlICkKKwkJCQljb250aW51ZTsKKwkJCWd1ZXNzZWRfaGVhZHMgPQorCQkJCSggUEFSVF9IRUFEICggcGFydGl0aW9uLT5jaHNfZW5kICkgKyAxICk7CisJCQlndWVzc2VkX3NlY3RvcnNfcGVyX3RyYWNrID0gCisJCQkJUEFSVF9TRUNUT1IgKCBwYXJ0aXRpb24tPmNoc19lbmQgKTsKKwkJCURCRyAoICJHdWVzc2luZyBDL0gvUyB4eC8lZC8lZCBiYXNlZCBvbiBwYXJ0aXRpb24gIgorCQkJICAgICAgIiVkXG4iLCBndWVzc2VkX2hlYWRzLAorCQkJICAgICAgZ3Vlc3NlZF9zZWN0b3JzX3Blcl90cmFjaywgKCBpICsgMSApICk7CisJCX0KKwl9IGVsc2UgeworCQlEQkcgKCAiQ291bGQgbm90IHJlYWQgcGFydGl0aW9uIHRhYmxlIHRvIGd1ZXNzIGdlb21ldHJ5XG4iICk7CisJfQorCisJLyogQXBwbHkgZ3Vlc3NlcyBpZiBubyBnZW9tZXRyeSBhbHJlYWR5IHNwZWNpZmllZCAqLworCWlmICggISBkcml2ZS0+aGVhZHMgKQorCQlkcml2ZS0+aGVhZHMgPSBndWVzc2VkX2hlYWRzOworCWlmICggISBkcml2ZS0+c2VjdG9yc19wZXJfdHJhY2sgKQorCQlkcml2ZS0+c2VjdG9yc19wZXJfdHJhY2sgPSBndWVzc2VkX3NlY3RvcnNfcGVyX3RyYWNrOworCWlmICggISBkcml2ZS0+Y3lsaW5kZXJzICkgeworCQkvKiBBdm9pZCBhdHRlbXB0aW5nIGEgNjQtYml0IGRpdmlkZSBvbiBhIDMyLWJpdCBzeXN0ZW0gKi8KKwkJYmxvY2tzID0gKCAoIGRyaXZlLT5ibG9ja2Rldi0+YmxvY2tzIDw9IFVMT05HX01BWCApID8KKwkJCSAgIGRyaXZlLT5ibG9ja2Rldi0+YmxvY2tzIDogVUxPTkdfTUFYICk7CisJCWJsb2Nrc19wZXJfY3lsID0gKCBkcml2ZS0+aGVhZHMgKiBkcml2ZS0+c2VjdG9yc19wZXJfdHJhY2sgKTsKKwkJYXNzZXJ0ICggYmxvY2tzX3Blcl9jeWwgIT0gMCApOworCQlkcml2ZS0+Y3lsaW5kZXJzID0gKCBibG9ja3MgLyBibG9ja3NfcGVyX2N5bCApOworCQlpZiAoIGRyaXZlLT5jeWxpbmRlcnMgPiAxMDI0ICkKKwkJCWRyaXZlLT5jeWxpbmRlcnMgPSAxMDI0OworCX0KK30KKworLyoqCisgKiBSZWdpc3RlciBJTlQgMTMgZW11bGF0ZWQgZHJpdmUKKyAqCisgKiBAdiBkcml2ZQkJRW11bGF0ZWQgZHJpdmUKKyAqCisgKiBSZWdpc3RlcnMgdGhlIGRyaXZlIHdpdGggdGhlIElOVCAxMyBlbXVsYXRpb24gc3Vic3lzdGVtLCBhbmQgaG9va3MKKyAqIHRoZSBJTlQgMTMgaW50ZXJydXB0IHZlY3RvciAoaWYgbm90IGFscmVhZHkgaG9va2VkKS4KKyAqCisgKiBUaGUgdW5kZXJseWluZyBibG9jayBkZXZpY2UgbXVzdCBiZSB2YWxpZC4gIEEgZHJpdmUgbnVtYmVyIGFuZAorICogZ2VvbWV0cnkgd2lsbCBiZSBhc3NpZ25lZCBpZiBsZWZ0IGJsYW5rLgorICovCit2b2lkIHJlZ2lzdGVyX2ludDEzX2RyaXZlICggc3RydWN0IGludDEzX2RyaXZlICpkcml2ZSApIHsKKwl1aW50OF90IG51bV9kcml2ZXM7CisKKwkvKiBHaXZlIGRyaXZlIGEgZGVmYXVsdCBnZW9tZXRyeSBpZiBub25lIHNwZWNpZmllZCAqLworCWd1ZXNzX2ludDEzX2dlb21ldHJ5ICggZHJpdmUgKTsKKworCS8qIEFzc2lnbiBuYXR1cmFsIGRyaXZlIG51bWJlciAqLworCWdldF9yZWFsICggbnVtX2RyaXZlcywgQkRBX1NFRywgQkRBX05VTV9EUklWRVMgKTsKKwlkcml2ZS0+bmF0dXJhbF9kcml2ZSA9ICggbnVtX2RyaXZlcyB8IDB4ODAgKTsKKworCS8qIEFzc2lnbiBkcml2ZSBudW1iZXIgKi8KKwlpZiAoICggZHJpdmUtPmRyaXZlICYgMHhmZiApID09IDB4ZmYgKSB7CisJCS8qIERyaXZlIG51bWJlciA9PSAtMSA9PiB1c2UgbmF0dXJhbCBkcml2ZSBudW1iZXIgKi8KKwkJZHJpdmUtPmRyaXZlID0gZHJpdmUtPm5hdHVyYWxfZHJpdmU7CisJfSBlbHNlIHsKKwkJLyogVXNlIHNwZWNpZmllZCBkcml2ZSBudW1iZXIgKCsweDgwIGlmIG5lY2Vzc2FyeSkgKi8KKwkJZHJpdmUtPmRyaXZlIHw9IDB4ODA7CisJfQorCisJREJHICggIlJlZ2lzdGVyZWQgSU5UMTMgZHJpdmUgJTAyeCAobmF0dXJhbGx5ICUwMngpIHdpdGggQy9IL1MgIgorCSAgICAgICJnZW9tZXRyeSAlZC8lZC8lZFxuIiwgZHJpdmUtPmRyaXZlLCBkcml2ZS0+bmF0dXJhbF9kcml2ZSwKKwkgICAgICBkcml2ZS0+Y3lsaW5kZXJzLCBkcml2ZS0+aGVhZHMsIGRyaXZlLT5zZWN0b3JzX3Blcl90cmFjayApOworCisJLyogSG9vayBJTlQgMTMgdmVjdG9yIGlmIG5vdCBhbHJlYWR5IGhvb2tlZCAqLworCWlmICggbGlzdF9lbXB0eSAoICZkcml2ZXMgKSApCisJCWhvb2tfaW50MTMoKTsKKworCS8qIEFkZCB0byBsaXN0IG9mIGVtdWxhdGVkIGRyaXZlcyAqLworCWxpc3RfYWRkICggJmRyaXZlLT5saXN0LCAmZHJpdmVzICk7CisKKwkvKiBVcGRhdGUgQklPUyBkcml2ZSBjb3VudCAqLworCWludDEzX3NldF9udW1fZHJpdmVzKCk7Cit9CisKKy8qKgorICogVW5yZWdpc3RlciBJTlQgMTMgZW11bGF0ZWQgZHJpdmUKKyAqCisgKiBAdiBkcml2ZQkJRW11bGF0ZWQgZHJpdmUKKyAqCisgKiBVbnJlZ2lzdGVycyB0aGUgZHJpdmUgZnJvbSB0aGUgSU5UIDEzIGVtdWxhdGlvbiBzdWJzeXN0ZW0uICBJZiB0aGlzCisgKiBpcyB0aGUgbGFzdCBlbXVsYXRlZCBkcml2ZSwgdGhlIElOVCAxMyB2ZWN0b3IgaXMgdW5ob29rZWQgKGlmCisgKiBwb3NzaWJsZSkuCisgKi8KK3ZvaWQgdW5yZWdpc3Rlcl9pbnQxM19kcml2ZSAoIHN0cnVjdCBpbnQxM19kcml2ZSAqZHJpdmUgKSB7CisJLyogUmVtb3ZlIGZyb20gbGlzdCBvZiBlbXVsYXRlZCBkcml2ZXMgKi8KKwlsaXN0X2RlbCAoICZkcml2ZS0+bGlzdCApOworCisJLyogU2hvdWxkIGFkanVzdCBCSU9TIGRyaXZlIGNvdW50LCBidXQgaXQncyBkaWZmaWN1bHQgdG8gZG8gc28KKwkgKiByZWxpYWJseS4KKwkgKi8KKworCURCRyAoICJVbnJlZ2lzdGVyZWQgSU5UMTMgZHJpdmUgJTAyeFxuIiwgZHJpdmUtPmRyaXZlICk7CisKKwkvKiBVbmhvb2sgSU5UIDEzIHZlY3RvciBpZiBubyBtb3JlIGRyaXZlcyAqLworCWlmICggbGlzdF9lbXB0eSAoICZkcml2ZXMgKSApCisJCXVuaG9va19pbnQxMygpOworfQorCisvKioKKyAqIEF0dGVtcHQgdG8gYm9vdCBmcm9tIGFuIElOVCAxMyBkcml2ZQorICoKKyAqIEB2IGRyaXZlCQlEcml2ZSBudW1iZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgYm9vdHMgZnJvbSB0aGUgc3BlY2lmaWVkIElOVCAxMyBkcml2ZSBieSBsb2FkaW5nIHRoZSBNYXN0ZXIKKyAqIEJvb3QgUmVjb3JkIHRvIDAwMDA6N2MwMCBhbmQganVtcGluZyB0byBpdC4gIElOVCAxOCBpcyBob29rZWQgdG8KKyAqIGNhcHR1cmUgYW4gYXR0ZW1wdCBieSB0aGUgTUJSIHRvIGJvb3QgdGhlIG5leHQgZGV2aWNlLiAgKFRoaXMgaXMKKyAqIHRoZSBjbG9zZXN0IHRoaW5nIHRvIGEgcmV0dXJuIHBhdGggZnJvbSBhbiBNQlIpLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiBuZXZlciByZXR1cm4gc3VjY2VzcywgYnkgZGVmaW5pdGlvbi4KKyAqLworaW50IGludDEzX2Jvb3QgKCB1bnNpZ25lZCBpbnQgZHJpdmUgKSB7CisJc3RydWN0IG1lbW9yeV9tYXAgbWVtbWFwOworCWludCBzdGF0dXMsIHNpZ25hdHVyZTsKKwlpbnQgZGlzY2FyZF9jLCBkaXNjYXJkX2Q7CisJaW50IHJjOworCisJREJHICggIkJvb3RpbmcgZnJvbSBJTlQgMTMgZHJpdmUgJTAyeFxuIiwgZHJpdmUgKTsKKworCS8qIFVzZSBJTlQgMTMgdG8gcmVhZCB0aGUgYm9vdCBzZWN0b3IgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFJFQUxfQ09ERSAoICJwdXNodyAlJWVzXG5cdCIKKwkJCQkJICAgInB1c2h3ICQwXG5cdCIKKwkJCQkJICAgInBvcHcgJSVlc1xuXHQiCisJCQkJCSAgICJzdGNcblx0IgorCQkJCQkgICAic3RpXG5cdCIKKwkJCQkJICAgImludCAkMHgxM1xuXHQiCisJCQkJCSAgICJzdGlcblx0IiAvKiBCSU9TIGJ1Z3MgKi8KKwkJCQkJICAgImpjIDFmXG5cdCIKKwkJCQkJICAgInhvcmwgJSVlYXgsICUlZWF4XG5cdCIKKwkJCQkJICAgIlxuMTpcblx0IgorCQkJCQkgICAibW92endsICUlZXM6MHg3ZGZlLCAlJWVieFxuXHQiCisJCQkJCSAgICJwb3B3ICUlZXNcblx0IiApCisJCQkgICAgICAgOiAiPWEiICggc3RhdHVzICksICI9YiIgKCBzaWduYXR1cmUgKSwKKwkJCQkgIj1jIiAoIGRpc2NhcmRfYyApLCAiPWQiICggZGlzY2FyZF9kICkKKwkJCSAgICAgICA6ICJhIiAoIDB4MDIwMSApLCAiYiIgKCAweDdjMDAgKSwKKwkJCQkgImMiICggMSApLCAiZCIgKCBkcml2ZSApICk7CisJaWYgKCBzdGF0dXMgKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIENoZWNrIHNpZ25hdHVyZSBpcyBjb3JyZWN0ICovCisJaWYgKCBzaWduYXR1cmUgIT0gYmUxNl90b19jcHUgKCAweDU1YWEgKSApIHsKKwkJREJHICggIkludmFsaWQgZGlzayBzaWduYXR1cmUgJSMwNHggKHNob3VsZCBiZSAweDU1YWEpXG4iLAorCQkgICAgICBjcHVfdG9fYmUxNiAoIHNpZ25hdHVyZSApICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkvKiBEdW1wIG91dCBtZW1vcnkgbWFwIHByaW9yIHRvIGJvb3QsIGlmIG1lbW1hcCBkZWJ1Z2dpbmcgaXMKKwkgKiBlbmFibGVkLiAgTm90IHJlcXVpcmVkIGZvciBwcm9ncmFtIGZsb3csIGJ1dCB3ZSBoYXZlIHNvCisJICogbWFueSBwcm9ibGVtcyB0aGF0IHR1cm4gb3V0IHRvIGJlIG1lbW9yeS1tYXAgcmVsYXRlZCB0aGF0CisJICogaXQncyB3b3J0aCBkb2luZy4KKwkgKi8KKwlnZXRfbWVtbWFwICggJm1lbW1hcCApOworCisJLyogSnVtcCB0byBib290IHNlY3RvciAqLworCWlmICggKCByYyA9IGNhbGxfYm9vdHNlY3RvciAoIDB4MCwgMHg3YzAwLCBkcml2ZSApICkgIT0gMCApIHsKKwkJREJHICggIklOVCAxMyBkcml2ZSAlMDJ4IGJvb3QgcmV0dXJuZWQ6ICVzXG4iLAorCQkgICAgICBkcml2ZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gLUVDQU5DRUxFRDsgLyogLUVJTVBPU1NJQkxFICovCit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9pc2NzaWJvb3QuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcGNiaW9zL2lzY3NpYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWZkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9pc2NzaWJvb3QuYwpAQCAtMCwwICsxLDc1IEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvaXNjc2kuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvaWJmdC5oPgorI2luY2x1ZGUgPGdweGUvc2FuYm9vdC5oPgorI2luY2x1ZGUgPGludDEzLmg+CisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RhdGljIGludCBpc2NzaWJvb3QgKCBjb25zdCBjaGFyICpyb290X3BhdGggKSB7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpOworCXN0cnVjdCBpbnQxM19kcml2ZSAqZHJpdmU7CisJaW50IHJjOworCisJc2NzaSA9IHphbGxvYyAoIHNpemVvZiAoICpzY3NpICkgKTsKKwlpZiAoICEgc2NzaSApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19zY3NpOworCX0KKwlkcml2ZSA9IHphbGxvYyAoIHNpemVvZiAoICpkcml2ZSApICk7CisJaWYgKCAhIGRyaXZlICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2RyaXZlOworCX0KKworCWlmICggKCByYyA9IGlzY3NpX2F0dGFjaCAoIHNjc2ksIHJvb3RfcGF0aCApICkgIT0gMCApIHsKKwkJcHJpbnRmICggIkNvdWxkIG5vdCBhdHRhY2ggaVNDU0kgZGV2aWNlOiAlc1xuIiwKKwkJCSBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfYXR0YWNoOworCX0KKwlpZiAoICggcmMgPSBpbml0X3Njc2lkZXYgKCBzY3NpICkgKSAhPSAwICkgeworCQlwcmludGYgKCAiQ291bGQgbm90IGluaXRpYWxpc2UgaVNDU0kgZGV2aWNlOiAlc1xuIiwKKwkJCSBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfaW5pdDsKKwl9CisKKwlkcml2ZS0+YmxvY2tkZXYgPSAmc2NzaS0+YmxvY2tkZXY7CisKKwkvKiBGSVhNRTogdWdseSwgdWdseSBoYWNrICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGxhc3Rfb3BlbmVkX25ldGRldigpOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSA9CisJCWNvbnRhaW5lcl9vZiAoIHNjc2ktPmJhY2tlbmQsIHN0cnVjdCBpc2NzaV9zZXNzaW9uLCByZWZjbnQgKTsKKwlpYmZ0X2ZpbGxfZGF0YSAoIG5ldGRldiwgaXNjc2kgKTsKKworCXJlZ2lzdGVyX2ludDEzX2RyaXZlICggZHJpdmUgKTsKKwlwcmludGYgKCAiUmVnaXN0ZXJlZCBhcyBCSU9TIGRyaXZlICUjMDJ4XG4iLCBkcml2ZS0+ZHJpdmUgKTsKKwlwcmludGYgKCAiQm9vdGluZyBmcm9tIEJJT1MgZHJpdmUgJSMwMnhcbiIsIGRyaXZlLT5kcml2ZSApOworCXJjID0gaW50MTNfYm9vdCAoIGRyaXZlLT5kcml2ZSApOworCXByaW50ZiAoICJCb290IGZhaWxlZFxuIiApOworCisJLyogTGVhdmUgZHJpdmUgcmVnaXN0ZXJlZCwgaWYgaW5zdHJ1Y3RlZCB0byBkbyBzbyAqLworCWlmICgga2VlcF9zYW4oKSApCisJCXJldHVybiByYzsKKworCXByaW50ZiAoICJVbnJlZ2lzdGVyaW5nIEJJT1MgZHJpdmUgJSMwMnhcbiIsIGRyaXZlLT5kcml2ZSApOworCXVucmVnaXN0ZXJfaW50MTNfZHJpdmUgKCBkcml2ZSApOworCisgZXJyX2luaXQ6CisJaXNjc2lfZGV0YWNoICggc2NzaSApOworIGVycl9hdHRhY2g6CisJZnJlZSAoIGRyaXZlICk7CisgZXJyX2FsbG9jX2RyaXZlOgorCWZyZWUgKCBzY3NpICk7CisgZXJyX2FsbG9jX3Njc2k6CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3Qgc2FuYm9vdF9wcm90b2NvbCBpc2NzaV9zYW5ib290X3Byb3RvY29sIF9fc2FuYm9vdF9wcm90b2NvbCA9IHsKKwkucHJlZml4ID0gImlzY3NpOiIsCisJLmJvb3QgPSBpc2NzaWJvb3QsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3Mva2VlcHNhbi5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3Mva2VlcHNhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNGUwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9rZWVwc2FuLmMKQEAgLTAsMCArMSwyNiBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPGdweGUvZGhjcC5oPgorI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorI2luY2x1ZGUgPGdweGUvc2FuYm9vdC5oPgorI2luY2x1ZGUgPHVzci9hdXRvYm9vdC5oPgorCitzdHJ1Y3Qgc2V0dGluZyBrZWVwX3Nhbl9zZXR0aW5nIF9fc2V0dGluZyA9IHsKKwkubmFtZSA9ICJrZWVwLXNhbiIsCisJLmRlc2NyaXB0aW9uID0gIlByZXNlcnZlIFNBTiBjb25uZWN0aW9uIiwKKwkudGFnID0gREhDUF9FQl9LRUVQX1NBTiwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfaW50OCwKK307CisKK2ludCBrZWVwX3NhbiAoIHZvaWQgKSB7CisJaW50IGtlZXBfc2FuOworCisJa2VlcF9zYW4gPSBmZXRjaF9pbnR6X3NldHRpbmcgKCBOVUxMLCAma2VlcF9zYW5fc2V0dGluZyApOworCWlmICggISBrZWVwX3NhbiApCisJCXJldHVybiAwOworCisJcHJpbnRmICggIlByZXNlcnZpbmcgY29ubmVjdGlvbiB0byBTQU4gZGlza1xuIiApOworCXNodXRkb3duX2V4aXRfZmxhZ3MgfD0gU0hVVERPV05fS0VFUF9ERVZJQ0VTOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvbWVtdG9wX3VtYWxsb2MuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcGNiaW9zL21lbXRvcF91bWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0NWZlNgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcGNiaW9zL21lbXRvcF91bWFsbG9jLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBFeHRlcm5hbCBtZW1vcnkgYWxsb2NhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2hpZGVtZW0uaD4KKyNpbmNsdWRlIDxncHhlL21lbW1hcC5oPgorI2luY2x1ZGUgPGdweGUvdW1hbGxvYy5oPgorCisvKiogQWxpZ25tZW50IG9mIGV4dGVybmFsIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyNkZWZpbmUgRU1fQUxJR04gKCA0ICogMTAyNCApCisKKy8qKiBFcXVpdmFsZW50IG9mIE5PV0hFUkUgZm9yIHVzZXIgcG9pbnRlcnMgKi8KKyNkZWZpbmUgVU5PV0hFUkUgKCB+VU5VTEwgKQorCisvKiogQW4gZXh0ZXJuYWwgbWVtb3J5IGJsb2NrICovCitzdHJ1Y3QgZXh0ZXJuYWxfbWVtb3J5IHsKKwkvKiogU2l6ZSBvZiB0aGlzIG1lbW9yeSBibG9jayAoZXhjbHVkaW5nIHRoaXMgaGVhZGVyKSAqLworCXNpemVfdCBzaXplOworCS8qKiBCbG9jayBpcyBjdXJyZW50bHkgaW4gdXNlICovCisJaW50IHVzZWQ7Cit9OworCisvKiogVG9wIG9mIGhlYXAgKi8KK3N0YXRpYyB1c2VycHRyX3QgdG9wID0gVU5VTEw7CisKKy8qKiBCb3R0b20gb2YgaGVhcCAoY3VycmVudCBsb3dlc3QgYWxsb2NhdGVkIGJsb2NrKSAqLworc3RhdGljIHVzZXJwdHJfdCBib3R0b20gPSBVTlVMTDsKKworLyoqCisgKiBJbml0aWFsaXNlIGV4dGVybmFsIGhlYXAKKyAqCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpbml0X2VoZWFwICggdm9pZCApIHsKKwlzdHJ1Y3QgbWVtb3J5X21hcCBtZW1tYXA7CisJdW5zaWduZWQgbG9uZyBoZWFwX3NpemUgPSAwOworCXVuc2lnbmVkIGludCBpOworCisJREJHICggIkFsbG9jYXRpbmcgZXh0ZXJuYWwgaGVhcFxuIiApOworCisJZ2V0X21lbW1hcCAoICZtZW1tYXAgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBtZW1tYXAuY291bnQgOyBpKysgKSB7CisJCXN0cnVjdCBtZW1vcnlfcmVnaW9uICpyZWdpb24gPSAmbWVtbWFwLnJlZ2lvbnNbaV07CisJCXVuc2lnbmVkIGxvbmcgcl9zdGFydCwgcl9lbmQ7CisJCXVuc2lnbmVkIGxvbmcgcl9zaXplOworCisJCURCRyAoICJDb25zaWRlcmluZyBbJWxseCwlbGx4KVxuIiwgcmVnaW9uLT5zdGFydCwgcmVnaW9uLT5lbmQpOworCisJCS8qIFRydW5jYXRlIGJsb2NrIHRvIDRHQiAqLworCQlpZiAoIHJlZ2lvbi0+c3RhcnQgPiBVSU5UX01BWCApIHsKKwkJCURCRyAoICIuLi5zdGFydHMgYWZ0ZXIgNEdCXG4iICk7CisJCQljb250aW51ZTsKKwkJfQorCQlyX3N0YXJ0ID0gcmVnaW9uLT5zdGFydDsKKwkJaWYgKCByZWdpb24tPmVuZCA+IFVJTlRfTUFYICkgeworCQkJREJHICggIi4uLmVuZCB0cnVuY2F0ZWQgdG8gNEdCXG4iICk7CisJCQlyX2VuZCA9IDA7IC8qID00R0IsIGdpdmVuIHRoZSB3cmFwYXJvdW5kICovCisJCX0gZWxzZSB7CisJCQlyX2VuZCA9IHJlZ2lvbi0+ZW5kOworCQl9CisKKwkJLyogVXNlIGxhcmdlc3QgYmxvY2sgKi8KKwkJcl9zaXplID0gKCByX2VuZCAtIHJfc3RhcnQgKTsKKwkJaWYgKCByX3NpemUgPiBoZWFwX3NpemUgKSB7CisJCQlEQkcgKCAiLi4ubmV3IGJlc3QgYmxvY2sgZm91bmRcbiIgKTsKKwkJCXRvcCA9IGJvdHRvbSA9IHBoeXNfdG9fdXNlciAoIHJfZW5kICk7CisJCQloZWFwX3NpemUgPSByX3NpemU7CisJCX0KKwl9CisKKwlpZiAoICEgaGVhcF9zaXplICkgeworCQlEQkcgKCAiTm8gZXh0ZXJuYWwgaGVhcCBhdmFpbGFibGVcbiIgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJREJHICggIkV4dGVybmFsIGhlYXAgZ3Jvd3MgZG93bndhcmRzIGZyb20gJWx4XG4iLAorCSAgICAgIHVzZXJfdG9fcGh5cyAoIHRvcCwgMCApICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29sbGVjdCBmcmVlIGJsb2NrcworICoKKyAqLworc3RhdGljIHZvaWQgZWNvbGxlY3RfZnJlZSAoIHZvaWQgKSB7CisJc3RydWN0IGV4dGVybmFsX21lbW9yeSBleHRtZW07CisKKwkvKiBXYWxrIHRoZSBmcmVlIGxpc3QgYW5kIGNvbGxlY3QgZW1wdHkgYmxvY2tzICovCisJd2hpbGUgKCBib3R0b20gIT0gdG9wICkgeworCQljb3B5X2Zyb21fdXNlciAoICZleHRtZW0sIGJvdHRvbSwgLXNpemVvZiAoIGV4dG1lbSApLAorCQkJCSBzaXplb2YgKCBleHRtZW0gKSApOworCQlpZiAoIGV4dG1lbS51c2VkICkKKwkJCWJyZWFrOworCQlEQkcgKCAiRVhUTUVNIGZyZWVpbmcgWyVseCwlbHgpXG4iLCB1c2VyX3RvX3BoeXMgKCBib3R0b20sIDAgKSwKKwkJICAgICAgdXNlcl90b19waHlzICggYm90dG9tLCBleHRtZW0uc2l6ZSApICk7CisJCWJvdHRvbSA9IHVzZXJwdHJfYWRkICggYm90dG9tLAorCQkJCSAgICAgICAoIGV4dG1lbS5zaXplICsgc2l6ZW9mICggZXh0bWVtICkgKSApOworCX0KK30KKworLyoqCisgKiBSZWFsbG9jYXRlIGV4dGVybmFsIG1lbW9yeQorICoKKyAqIEB2IG9sZF9wdHIJCU1lbW9yeSBwcmV2aW91c2x5IGFsbG9jYXRlZCBieSB1bWFsbG9jKCksIG9yIFVOVUxMCisgKiBAdiBuZXdfc2l6ZQkJUmVxdWVzdGVkIHNpemUKKyAqIEByZXQgbmV3X3B0cgkJQWxsb2NhdGVkIG1lbW9yeSwgb3IgVU5VTEwKKyAqCisgKiBDYWxsaW5nIHJlYWxsb2MoKSB3aXRoIGEgbmV3IHNpemUgb2YgemVybyBpcyBhIHZhbGlkIHdheSB0byBmcmVlIGEKKyAqIG1lbW9yeSBibG9jay4KKyAqLworc3RhdGljIHVzZXJwdHJfdCBtZW10b3BfdXJlYWxsb2MgKCB1c2VycHRyX3QgcHRyLCBzaXplX3QgbmV3X3NpemUgKSB7CisJc3RydWN0IGV4dGVybmFsX21lbW9yeSBleHRtZW07CisJdXNlcnB0cl90IG5ldyA9IHB0cjsKKwlzaXplX3QgYWxpZ247CisJaW50IHJjOworCisJLyogSW5pdGlhbGlzZSBleHRlcm5hbCBtZW1vcnkgYWxsb2NhdG9yIGlmIG5lY2Vzc2FyeSAqLworCWlmICggYm90dG9tID09IHRvcCApIHsKKwkJaWYgKCAoIHJjID0gaW5pdF9laGVhcCgpICkgIT0gMCApCisJCQlyZXR1cm4gVU5VTEw7CisJfQorCisJLyogR2V0IGJsb2NrIHByb3BlcnRpZXMgaW50byBleHRtZW0gKi8KKwlpZiAoIHB0ciAmJiAoIHB0ciAhPSBVTk9XSEVSRSApICkgeworCQkvKiBEZXRlcm1pbmUgb2xkIHNpemUgKi8KKwkJY29weV9mcm9tX3VzZXIgKCAmZXh0bWVtLCBwdHIsIC1zaXplb2YgKCBleHRtZW0gKSwKKwkJCQkgc2l6ZW9mICggZXh0bWVtICkgKTsKKwl9IGVsc2UgeworCQkvKiBDcmVhdGUgYSB6ZXJvLWxlbmd0aCBibG9jayAqLworCQlwdHIgPSBib3R0b20gPSB1c2VycHRyX2FkZCAoIGJvdHRvbSwgLXNpemVvZiAoIGV4dG1lbSApICk7CisJCURCRyAoICJFWFRNRU0gYWxsb2NhdGluZyBbJWx4LCVseClcbiIsCisJCSAgICAgIHVzZXJfdG9fcGh5cyAoIHB0ciwgMCApLCB1c2VyX3RvX3BoeXMgKCBwdHIsIDAgKSApOworCQlleHRtZW0uc2l6ZSA9IDA7CisJfQorCWV4dG1lbS51c2VkID0gKCBuZXdfc2l6ZSA+IDAgKTsKKworCS8qIEV4cGFuZC9zaHJpbmsgYmxvY2sgaWYgcG9zc2libGUgKi8KKwlpZiAoIHB0ciA9PSBib3R0b20gKSB7CisJCS8qIFVwZGF0ZSBibG9jayAqLworCQluZXcgPSB1c2VycHRyX2FkZCAoIHB0ciwgLSAoIG5ld19zaXplIC0gZXh0bWVtLnNpemUgKSApOworCQlhbGlnbiA9ICggdXNlcl90b19waHlzICggbmV3LCAwICkgJiAoIEVNX0FMSUdOIC0gMSApICk7CisJCW5ld19zaXplICs9IGFsaWduOworCQluZXcgPSB1c2VycHRyX2FkZCAoIG5ldywgLWFsaWduICk7CisJCURCRyAoICJFWFRNRU0gZXhwYW5kaW5nIFslbHgsJWx4KSB0byBbJWx4LCVseClcbiIsCisJCSAgICAgIHVzZXJfdG9fcGh5cyAoIHB0ciwgMCApLAorCQkgICAgICB1c2VyX3RvX3BoeXMgKCBwdHIsIGV4dG1lbS5zaXplICksCisJCSAgICAgIHVzZXJfdG9fcGh5cyAoIG5ldywgMCApLAorCQkgICAgICB1c2VyX3RvX3BoeXMgKCBuZXcsIG5ld19zaXplICkpOworCQltZW1tb3ZlX3VzZXIgKCBuZXcsIDAsIHB0ciwgMCwgKCAoIGV4dG1lbS5zaXplIDwgbmV3X3NpemUgKSA/CisJCQkJCQkgZXh0bWVtLnNpemUgOiBuZXdfc2l6ZSApICk7CisJCWV4dG1lbS5zaXplID0gbmV3X3NpemU7CisJCWJvdHRvbSA9IG5ldzsKKwl9IGVsc2UgeworCQkvKiBDYW5ub3QgZXhwYW5kOyBjYW4gb25seSBwcmV0ZW5kIHRvIHNocmluayAqLworCQlpZiAoIG5ld19zaXplID4gZXh0bWVtLnNpemUgKSB7CisJCQkvKiBSZWZ1c2UgdG8gZXhwYW5kICovCisJCQlEQkcgKCAiRVhUTUVNIGNhbm5vdCBleHBhbmQgWyVseCwlbHgpXG4iLAorCQkJICAgICAgdXNlcl90b19waHlzICggcHRyLCAwICksCisJCQkgICAgICB1c2VyX3RvX3BoeXMgKCBwdHIsIGV4dG1lbS5zaXplICkgKTsKKwkJCXJldHVybiBVTlVMTDsKKwkJfQorCX0KKworCS8qIFdyaXRlIGJhY2sgYmxvY2sgcHJvcGVydGllcyAqLworCWNvcHlfdG9fdXNlciAoIG5ldywgLXNpemVvZiAoIGV4dG1lbSApLCAmZXh0bWVtLAorCQkgICAgICAgc2l6ZW9mICggZXh0bWVtICkgKTsKKworCS8qIENvbGxlY3QgYW55IGZyZWUgYmxvY2tzIGFuZCB1cGRhdGUgaGlkZGVuIG1lbW9yeSByZWdpb24gKi8KKwllY29sbGVjdF9mcmVlKCk7CisJaGlkZV91bWFsbG9jICggdXNlcl90b19waHlzICggYm90dG9tLCAtc2l6ZW9mICggZXh0bWVtICkgKSwKKwkJICAgICAgIHVzZXJfdG9fcGh5cyAoIHRvcCwgMCApICk7CisKKwlyZXR1cm4gKCBuZXdfc2l6ZSA/IG5ldyA6IFVOT1dIRVJFICk7Cit9CisKK1BST1ZJREVfVU1BTExPQyAoIG1lbXRvcCwgdXJlYWxsb2MsIG1lbXRvcF91cmVhbGxvYyApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvcGNpYmlvcy5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9wY2Jpb3MvcGNpYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzM4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9wY2liaW9zLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcyB2aWEgUENJIEJJT1MKKyAqCisgKi8KKworLyoqCisgKiBEZXRlcm1pbmUgbWF4aW11bSBQQ0kgYnVzIG51bWJlciB3aXRoaW4gc3lzdGVtCisgKgorICogQHJldCBtYXhfYnVzCQlNYXhpbXVtIGJ1cyBudW1iZXIKKyAqLworc3RhdGljIGludCBwY2liaW9zX21heF9idXMgKCB2b2lkICkgeworCWludCBkaXNjYXJkX2EsIGRpc2NhcmRfRDsKKwl1aW50OF90IG1heF9idXM7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFJFQUxfQ09ERSAoICJzdGNcblx0IgorCQkJCQkgICAiaW50ICQweDFhXG5cdCIKKwkJCQkJICAgImpuYyAxZlxuXHQiCisJCQkJCSAgICJ4b3J3ICUlY3gsICUlY3hcblx0IgorCQkJCQkgICAiXG4xOlxuXHQiICkKKwkJCSAgICAgICA6ICI9YyIgKCBtYXhfYnVzICksICI9YSIgKCBkaXNjYXJkX2EgKSwKKwkJCQkgIj1EIiAoIGRpc2NhcmRfRCApCisJCQkgICAgICAgOiAiYSIgKCBQQ0lCSU9TX0lOU1RBTExBVElPTl9DSEVDSyA+PiAxNiApLAorCQkJCSAiRCIgKCAwICkKKwkJCSAgICAgICA6ICJlYngiLCAiZWR4IiApOworCisJcmV0dXJuIG1heF9idXM7Cit9CisKKy8qKgorICogUmVhZCBjb25maWd1cmF0aW9uIHNwYWNlIHZpYSBQQ0kgQklPUworICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiBjb21tYW5kCVBDSSBCSU9TIGNvbW1hbmQKKyAqIEB2IHZhbHVlCVZhbHVlIHJlYWQKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBwY2liaW9zX3JlYWQgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCB1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCAqdmFsdWUgKXsKKwlpbnQgZGlzY2FyZF9iLCBkaXNjYXJkX0Q7CisJaW50IHN0YXR1czsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggInN0Y1xuXHQiCisJCQkJCSAgICJpbnQgJDB4MWFcblx0IgorCQkJCQkgICAiam5jIDFmXG5cdCIKKwkJCQkJICAgInhvcmwgJSVlYXgsICUlZWF4XG5cdCIKKwkJCQkJICAgImRlY2wgJSVlYXhcblx0IgorCQkJCQkgICAibW92bCAlJWVheCwgJSVlY3hcblx0IgorCQkJCQkgICAiXG4xOlxuXHQiICkKKwkJCSAgICAgICA6ICI9YSIgKCBzdGF0dXMgKSwgIj1iIiAoIGRpc2NhcmRfYiApLAorCQkJCSAiPWMiICggKnZhbHVlICksICI9RCIgKCBkaXNjYXJkX0QgKQorCQkJICAgICAgIDogImEiICggY29tbWFuZCA+PiAxNiApLCAiRCIgKCBjb21tYW5kICksCisJCQkgICAgICAgICAiYiIgKCBQQ0lfQlVTREVWRk4gKCBwY2ktPmJ1cywgcGNpLT5kZXZmbiApICkKKwkJCSAgICAgICA6ICJlZHgiICk7CisKKwlyZXR1cm4gKCAoIHN0YXR1cyA+PiA4ICkgJiAweGZmICk7Cit9CisKKy8qKgorICogV3JpdGUgY29uZmlndXJhdGlvbiBzcGFjZSB2aWEgUENJIEJJT1MKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgY29tbWFuZAlQQ0kgQklPUyBjb21tYW5kCisgKiBAdiB2YWx1ZQlWYWx1ZSB0byBiZSB3cml0dGVuCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgcGNpYmlvc193cml0ZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIHVpbnQzMl90IGNvbW1hbmQsIHVpbnQzMl90IHZhbHVlICl7CisJaW50IGRpc2NhcmRfYiwgZGlzY2FyZF9jLCBkaXNjYXJkX0Q7CisJaW50IHN0YXR1czsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICggUkVBTF9DT0RFICggInN0Y1xuXHQiCisJCQkJCSAgICJpbnQgJDB4MWFcblx0IgorCQkJCQkgICAiam5jIDFmXG5cdCIKKwkJCQkJICAgIm1vdmIgJDB4ZmYsICUlYWhcblx0IgorCQkJCQkgICAiXG4xOlxuXHQiICkKKwkJCSAgICAgICA6ICI9YSIgKCBzdGF0dXMgKSwgIj1iIiAoIGRpc2NhcmRfYiApLAorCQkJCSAiPWMiICggZGlzY2FyZF9jICksICI9RCIgKCBkaXNjYXJkX0QgKQorCQkJICAgICAgIDogImEiICggY29tbWFuZCA+PiAxNiApLAkiRCIgKCBjb21tYW5kICksCisJCQkgICAgICAgICAiYiIgKCBQQ0lfQlVTREVWRk4gKCBwY2ktPmJ1cywgcGNpLT5kZXZmbiApICksCisJCQkJICJjIiAoIHZhbHVlICkKKwkJCSAgICAgICA6ICJlZHgiICk7CisJCisJcmV0dXJuICggKCBzdGF0dXMgPj4gOCApICYgMHhmZiApOworfQorCitQUk9WSURFX1BDSUFQSSAoIHBjYmlvcywgcGNpX21heF9idXMsIHBjaWJpb3NfbWF4X2J1cyApOworUFJPVklERV9QQ0lBUElfSU5MSU5FICggcGNiaW9zLCBwY2lfcmVhZF9jb25maWdfYnl0ZSApOworUFJPVklERV9QQ0lBUElfSU5MSU5FICggcGNiaW9zLCBwY2lfcmVhZF9jb25maWdfd29yZCApOworUFJPVklERV9QQ0lBUElfSU5MSU5FICggcGNiaW9zLCBwY2lfcmVhZF9jb25maWdfZHdvcmQgKTsKK1BST1ZJREVfUENJQVBJX0lOTElORSAoIHBjYmlvcywgcGNpX3dyaXRlX2NvbmZpZ19ieXRlICk7CitQUk9WSURFX1BDSUFQSV9JTkxJTkUgKCBwY2Jpb3MsIHBjaV93cml0ZV9jb25maWdfd29yZCApOworUFJPVklERV9QQ0lBUElfSU5MSU5FICggcGNiaW9zLCBwY2lfd3JpdGVfY29uZmlnX2R3b3JkICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9zYmZ0LmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3BjYmlvcy9zYmZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5MjdjNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcGNiaW9zL3NiZnQuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGZW4gU3lzdGVtcyBMdGQgPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEJTRDIgKTsKKworLyoqIEBmaWxlCisgKgorICogU1JQIGJvb3QgZmlybXdhcmUgdGFibGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Z3B4ZS9zcnAuaD4KKyNpbmNsdWRlIDxncHhlL2liX3NycC5oPgorI2luY2x1ZGUgPGdweGUvYWNwaS5oPgorI2luY2x1ZGUgPGdweGUvc2JmdC5oPgorCisjZGVmaW5lIHNiZnRhYiBfX3VzZV9kYXRhMTYgKCBzYmZ0YWIgKQorLyoqIFRoZSBzQkZUIHVzZWQgYnkgZ1BYRSAqLworc3RydWN0IGdweGVfc2JmdCBfX2RhdGExNiAoIHNiZnRhYiApID0geworCS8qIFRhYmxlIGhlYWRlciAqLworCS50YWJsZSA9IHsKKwkJLyogQUNQSSBoZWFkZXIgKi8KKwkJLmFjcGkgPSB7CisJCQkuc2lnbmF0dXJlID0gU0JGVF9TSUcsCisJCQkubGVuZ3RoID0gc2l6ZW9mICggc2JmdGFiICksCisJCQkucmV2aXNpb24gPSAxLAorCQkJLm9lbV9pZCA9ICJGRU5TWVMiLAorCQkJLm9lbV90YWJsZV9pZCA9ICJnUFhFIiwKKwkJfSwKKwkJLnNjc2lfb2Zmc2V0ID0gb2Zmc2V0b2YgKCB0eXBlb2YgKCBzYmZ0YWIgKSwgc2NzaSApLAorCQkuc3JwX29mZnNldCA9IG9mZnNldG9mICggdHlwZW9mICggc2JmdGFiICksIHNycCApLAorCQkuaWJfb2Zmc2V0ID0gb2Zmc2V0b2YgKCB0eXBlb2YgKCBzYmZ0YWIgKSwgaWIgKSwKKwl9LAorfTsKKworLyoqCisgKiBGaWxsIGluIGFsbCB2YXJpYWJsZSBwb3J0aW9ucyBvZiBzQkZUCisgKgorICogQHYgc3JwCQlTUlAgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHNiZnRfZmlsbF9kYXRhICggc3RydWN0IHNycF9kZXZpY2UgKnNycCApIHsKKwlzdHJ1Y3Qgc2JmdF9zY3NpX3N1YnRhYmxlICpzYmZ0X3Njc2kgPSAmc2JmdGFiLnNjc2k7CisJc3RydWN0IHNiZnRfc3JwX3N1YnRhYmxlICpzYmZ0X3NycCA9ICZzYmZ0YWIuc3JwOworCXN0cnVjdCBzYmZ0X2liX3N1YnRhYmxlICpzYmZ0X2liID0gJnNiZnRhYi5pYjsKKwlzdHJ1Y3QgaWJfc3JwX3BhcmFtZXRlcnMgKmliX3BhcmFtczsKKwlzdHJ1Y3Qgc2Vnb2ZmIHJtX3NiZnRhYiA9IHsKKwkJLnNlZ21lbnQgPSBybV9kcywKKwkJLm9mZnNldCA9IF9fZnJvbV9kYXRhMTYgKCAmc2JmdGFiICksCisJfTsKKworCS8qIEZpbGwgaW4gdGhlIFNDU0kgc3VidGFibGUgKi8KKwltZW1jcHkgKCAmc2JmdF9zY3NpLT5sdW4sICZzcnAtPmx1biwgc2l6ZW9mICggc2JmdF9zY3NpLT5sdW4gKSApOworCisJLyogRmlsbCBpbiB0aGUgU1JQIHN1YnRhYmxlICovCisJbWVtY3B5ICggJnNiZnRfc3JwLT5wb3J0X2lkcywgJnNycC0+cG9ydF9pZHMsCisJCSBzaXplb2YgKCBzYmZ0X3NycC0+cG9ydF9pZHMgKSApOworCisJLyogRmlsbCBpbiB0aGUgSUIgc3VidGFibGUgKi8KKwlhc3NlcnQgKCBzcnAtPnRyYW5zcG9ydCA9PSAmaWJfc3JwX3RyYW5zcG9ydCApOworCWliX3BhcmFtcyA9IGliX3NycF9wYXJhbXMgKCBzcnAgKTsKKwltZW1jcHkgKCAmc2JmdF9pYi0+c2dpZCwgJmliX3BhcmFtcy0+c2dpZCwgc2l6ZW9mICggc2JmdF9pYi0+c2dpZCApICk7CisJbWVtY3B5ICggJnNiZnRfaWItPmRnaWQsICZpYl9wYXJhbXMtPmRnaWQsIHNpemVvZiAoIHNiZnRfaWItPmRnaWQgKSApOworCW1lbWNweSAoICZzYmZ0X2liLT5zZXJ2aWNlX2lkLCAmaWJfcGFyYW1zLT5zZXJ2aWNlX2lkLAorCQkgc2l6ZW9mICggc2JmdF9pYi0+c2VydmljZV9pZCApICk7CisJc2JmdF9pYi0+cGtleSA9IGliX3BhcmFtcy0+cGtleTsKKworCS8qIFVwZGF0ZSBjaGVja3N1bSAqLworCWFjcGlfZml4X2NoZWNrc3VtICggJnNiZnRhYi50YWJsZS5hY3BpICk7CisKKwlEQkdDICggJnNiZnRhYiwgIlNSUCBCb290IEZpcm13YXJlIFRhYmxlIGF0ICUwNHg6JTA0eDpcbiIsCisJICAgICAgIHJtX3NiZnRhYi5zZWdtZW50LCBybV9zYmZ0YWIub2Zmc2V0ICk7CisJREJHQ19IREEgKCAmc2JmdGFiLCBybV9zYmZ0YWIsICZzYmZ0YWIsIHNpemVvZiAoIHNiZnRhYiApICk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcHhlL3B4ZV9jYWxsLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTliMWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfY2FsbC5jCkBAIC0wLDAgKzEsNTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS91YWNjZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbml0Lmg+CisjaW5jbHVkZSA8cmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8Ymlvc2ludC5oPgorI2luY2x1ZGUgPHB4ZS5oPgorI2luY2x1ZGUgPHB4ZV9jYWxsLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFBYRSBBUEkgZW50cnkgcG9pbnQKKyAqLworCisvKiogVmVjdG9yIGZvciBjaGFpbmluZyBJTlQgMUEgKi8KK2V4dGVybiBzdHJ1Y3Qgc2Vnb2ZmIF9fdGV4dDE2ICggcHhlX2ludF8xYV92ZWN0b3IgKTsKKyNkZWZpbmUgcHhlX2ludF8xYV92ZWN0b3IgX191c2VfdGV4dDE2ICggcHhlX2ludF8xYV92ZWN0b3IgKQorCisvKiogSU5UIDFBIGhhbmRsZXIgKi8KK2V4dGVybiB2b2lkIHB4ZV9pbnRfMWEgKCB2b2lkICk7CisKKy8qKiBJTlQgMUEgaG9va2VkIGZsYWcgKi8KK3N0YXRpYyBpbnQgaW50XzFhX2hvb2tlZCA9IDA7CisKKy8qKiBBIGZ1bmN0aW9uIHBvaW50ZXIgdG8gaG9sZCBhbnkgUFhFIEFQSSBjYWxsCisgKgorICogVXNlZCBieSBweGVfYXBpX2NhbGwoKSB0byBhdm9pZCBsYXJnZSBzd2F0aGVzIG9mIGR1cGxpY2F0ZWQgY29kZS4KKyAqLwordW5pb24gcHhlbnZfY2FsbCB7CisJUFhFTlZfRVhJVF90ICggKiBhbnkgKSAoIHVuaW9uIHVfUFhFTlZfQU5ZICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHVua25vd24gKSAoIHN0cnVjdCBzX1BYRU5WX1VOS05PV04gKiApOworCVBYRU5WX0VYSVRfdCAoICogdW5sb2FkX3N0YWNrICkgKCBzdHJ1Y3Qgc19QWEVOVl9VTkxPQURfU1RBQ0sgKiApOworCVBYRU5WX0VYSVRfdCAoICogZ2V0X2NhY2hlZF9pbmZvICkKKwkJCSggc3RydWN0IHNfUFhFTlZfR0VUX0NBQ0hFRF9JTkZPICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHJlc3RhcnRfdGZ0cCApICggc3RydWN0IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEUgKiApOworCVBYRU5WX0VYSVRfdCAoICogc3RhcnRfdW5kaSApICggc3RydWN0IHNfUFhFTlZfU1RBUlRfVU5ESSAqICk7CisJUFhFTlZfRVhJVF90ICggKiBzdG9wX3VuZGkgKSAoIHN0cnVjdCBzX1BYRU5WX1NUT1BfVU5ESSAqICk7CisJUFhFTlZfRVhJVF90ICggKiBzdGFydF9iYXNlICkgKCBzdHJ1Y3Qgc19QWEVOVl9TVEFSVF9CQVNFICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHN0b3BfYmFzZSApICggc3RydWN0IHNfUFhFTlZfU1RPUF9CQVNFICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHRmdHBfb3BlbiApICggc3RydWN0IHNfUFhFTlZfVEZUUF9PUEVOICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHRmdHBfY2xvc2UgKSAoIHN0cnVjdCBzX1BYRU5WX1RGVFBfQ0xPU0UgKiApOworCVBYRU5WX0VYSVRfdCAoICogdGZ0cF9yZWFkICkgKCBzdHJ1Y3Qgc19QWEVOVl9URlRQX1JFQUQgKiApOworCVBYRU5WX0VYSVRfdCAoICogdGZ0cF9yZWFkX2ZpbGUgKSAoIHN0cnVjdCBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHRmdHBfZ2V0X2ZzaXplICkgKCBzdHJ1Y3Qgc19QWEVOVl9URlRQX0dFVF9GU0laRSAqICk7CisJUFhFTlZfRVhJVF90ICggKiB1ZHBfb3BlbiApICggc3RydWN0IHNfUFhFTlZfVURQX09QRU4gKiApOworCVBYRU5WX0VYSVRfdCAoICogdWRwX2Nsb3NlICkgKCBzdHJ1Y3Qgc19QWEVOVl9VRFBfQ0xPU0UgKiApOworCVBYRU5WX0VYSVRfdCAoICogdWRwX3dyaXRlICkgKCBzdHJ1Y3Qgc19QWEVOVl9VRFBfV1JJVEUgKiApOworCVBYRU5WX0VYSVRfdCAoICogdWRwX3JlYWQgKSAoIHN0cnVjdCBzX1BYRU5WX1VEUF9SRUFEICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHVuZGlfc3RhcnR1cCApICggc3RydWN0IHNfUFhFTlZfVU5ESV9TVEFSVFVQICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHVuZGlfY2xlYW51cCApICggc3RydWN0IHNfUFhFTlZfVU5ESV9DTEVBTlVQICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHVuZGlfaW5pdGlhbGl6ZSApCisJCQkoIHN0cnVjdCBzX1BYRU5WX1VORElfSU5JVElBTElaRSAqICk7CisJUFhFTlZfRVhJVF90ICggKiB1bmRpX3Jlc2V0X2FkYXB0ZXIgKSAoIHN0cnVjdCBzX1BYRU5WX1VORElfUkVTRVQgKiApOworCVBYRU5WX0VYSVRfdCAoICogdW5kaV9zaHV0ZG93biApICggc3RydWN0IHNfUFhFTlZfVU5ESV9TSFVURE9XTiAqICk7CisJUFhFTlZfRVhJVF90ICggKiB1bmRpX29wZW4gKSAoIHN0cnVjdCBzX1BYRU5WX1VORElfT1BFTiAqICk7CisJUFhFTlZfRVhJVF90ICggKiB1bmRpX2Nsb3NlICkgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0NMT1NFICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHVuZGlfdHJhbnNtaXQgKSAoIHN0cnVjdCBzX1BYRU5WX1VORElfVFJBTlNNSVQgKiApOworCVBYRU5WX0VYSVRfdCAoICogdW5kaV9zZXRfbWNhc3RfYWRkcmVzcyApCisJCQkoIHN0cnVjdCBzX1BYRU5WX1VORElfU0VUX01DQVNUX0FERFJFU1MgKiApOworCVBYRU5WX0VYSVRfdCAoICogdW5kaV9zZXRfc3RhdGlvbl9hZGRyZXNzICkKKwkJCSggc3RydWN0IHNfUFhFTlZfVU5ESV9TRVRfU1RBVElPTl9BRERSRVNTICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHVuZGlfc2V0X3BhY2tldF9maWx0ZXIgKQorCQkJKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHVuZGlfZ2V0X2luZm9ybWF0aW9uICkKKwkJCSggc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT04gKiApOworCVBYRU5WX0VYSVRfdCAoICogdW5kaV9nZXRfc3RhdGlzdGljcyApCisJCQkoIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX1NUQVRJU1RJQ1MgKiApOworCVBYRU5WX0VYSVRfdCAoICogdW5kaV9jbGVhcl9zdGF0aXN0aWNzICkKKwkJCSggc3RydWN0IHNfUFhFTlZfVU5ESV9DTEVBUl9TVEFUSVNUSUNTICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHVuZGlfaW5pdGlhdGVfZGlhZ3MgKQorCQkJKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0lOSVRJQVRFX0RJQUdTICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIHVuZGlfZm9yY2VfaW50ZXJydXB0ICkKKwkJCSggc3RydWN0IHNfUFhFTlZfVU5ESV9GT1JDRV9JTlRFUlJVUFQgKiApOworCVBYRU5WX0VYSVRfdCAoICogdW5kaV9nZXRfbWNhc3RfYWRkcmVzcyApCisJCQkoIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX01DQVNUX0FERFJFU1MgKiApOworCVBYRU5WX0VYSVRfdCAoICogdW5kaV9nZXRfbmljX3R5cGUgKQorCQkJKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9OSUNfVFlQRSAqICk7CisJUFhFTlZfRVhJVF90ICggKiB1bmRpX2dldF9pZmFjZV9pbmZvICkKKwkJCSggc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GTyAqICk7CisJUFhFTlZfRVhJVF90ICggKiB1bmRpX2dldF9zdGF0ZSApICggc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfU1RBVEUgKiApOworCVBYRU5WX0VYSVRfdCAoICogdW5kaV9pc3IgKSAoIHN0cnVjdCBzX1BYRU5WX1VORElfSVNSICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIGZpbGVfb3BlbiApICggc3RydWN0IHNfUFhFTlZfRklMRV9PUEVOICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIGZpbGVfY2xvc2UgKSAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfQ0xPU0UgKiApOworCVBYRU5WX0VYSVRfdCAoICogZmlsZV9zZWxlY3QgKSAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfU0VMRUNUICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIGZpbGVfcmVhZCApICggc3RydWN0IHNfUFhFTlZfRklMRV9SRUFEICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIGdldF9maWxlX3NpemUgKSAoIHN0cnVjdCBzX1BYRU5WX0dFVF9GSUxFX1NJWkUgKiApOworCVBYRU5WX0VYSVRfdCAoICogZmlsZV9leGVjICkgKCBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0VYRUMgKiApOworCVBYRU5WX0VYSVRfdCAoICogZmlsZV9hcGlfY2hlY2sgKSAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfQVBJX0NIRUNLICogKTsKKwlQWEVOVl9FWElUX3QgKCAqIGZpbGVfZXhpdF9ob29rICkgKCBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0VYSVRfSE9PSyAqICk7Cit9OworCisvKioKKyAqIEhhbmRsZSBhbiB1bmtub3duIFBYRSBBUEkgY2FsbAorICoKKyAqIEB2IHB4ZW52X3Vua25vd24gCQkJUG9pbnRlciB0byBhIHN0cnVjdCBzX1BYRU5WX1VOS05PV04KKyAqIEByZXQgI1BYRU5WX0VYSVRfRkFJTFVSRQkJQWx3YXlzCisgKiBAZXJyICNQWEVOVl9TVEFUVVNfVU5TVVBQT1JURUQJQWx3YXlzCisgKi8KK3N0YXRpYyBQWEVOVl9FWElUX3QgcHhlbnZfdW5rbm93biAoIHN0cnVjdCBzX1BYRU5WX1VOS05PV04gKnB4ZW52X3Vua25vd24gKSB7CisJcHhlbnZfdW5rbm93bi0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1VOU1VQUE9SVEVEOworCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7Cit9CisKKy8qKgorICogRGlzcGF0Y2ggUFhFIEFQSSBjYWxsCisgKgorICogQHYgYngJCVBYRSBvcGNvZGUKKyAqIEB2IGVzOmRpCQlBZGRyZXNzIG9mIFBYRSBwYXJhbWV0ZXIgYmxvY2sKKyAqIEByZXQgYXgJCVBYRSBleGl0IGNvZGUKKyAqLworX19hc21jYWxsIHZvaWQgcHhlX2FwaV9jYWxsICggc3RydWN0IGkzODZfYWxsX3JlZ3MgKml4ODYgKSB7CisJaW50IG9wY29kZSA9IGl4ODYtPnJlZ3MuYng7CisJdXNlcnB0cl90IHBhcmFtZXRlcnMgPSByZWFsX3RvX3VzZXIgKCBpeDg2LT5zZWdzLmVzLCBpeDg2LT5yZWdzLmRpICk7CisJc2l6ZV90IHBhcmFtX2xlbjsKKwl1bmlvbiB1X1BYRU5WX0FOWSBweGVudl9hbnk7CisJdW5pb24gcHhlbnZfY2FsbCBweGVudl9jYWxsOworCVBYRU5WX0VYSVRfdCByZXQ7CisKKwlzd2l0Y2ggKCBvcGNvZGUgKSB7CisJY2FzZSBQWEVOVl9VTkxPQURfU1RBQ0s6CisJCXB4ZW52X2NhbGwudW5sb2FkX3N0YWNrID0gcHhlbnZfdW5sb2FkX3N0YWNrOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5sb2FkX3N0YWNrICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfR0VUX0NBQ0hFRF9JTkZPOgorCQlweGVudl9jYWxsLmdldF9jYWNoZWRfaW5mbyA9IHB4ZW52X2dldF9jYWNoZWRfaW5mbzsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LmdldF9jYWNoZWRfaW5mbyApOworCQlicmVhazsKKwljYXNlIFBYRU5WX1JFU1RBUlRfVEZUUDoKKwkJcHhlbnZfY2FsbC5yZXN0YXJ0X3RmdHAgPSBweGVudl9yZXN0YXJ0X3RmdHA7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS5yZXN0YXJ0X3RmdHAgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9TVEFSVF9VTkRJOgorCQlweGVudl9jYWxsLnN0YXJ0X3VuZGkgPSBweGVudl9zdGFydF91bmRpOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkuc3RhcnRfdW5kaSApOworCQlicmVhazsKKwljYXNlIFBYRU5WX1NUT1BfVU5ESToKKwkJcHhlbnZfY2FsbC5zdG9wX3VuZGkgPSBweGVudl9zdG9wX3VuZGk7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS5zdG9wX3VuZGkgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9TVEFSVF9CQVNFOgorCQlweGVudl9jYWxsLnN0YXJ0X2Jhc2UgPSBweGVudl9zdGFydF9iYXNlOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkuc3RhcnRfYmFzZSApOworCQlicmVhazsKKwljYXNlIFBYRU5WX1NUT1BfQkFTRToKKwkJcHhlbnZfY2FsbC5zdG9wX2Jhc2UgPSBweGVudl9zdG9wX2Jhc2U7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS5zdG9wX2Jhc2UgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9URlRQX09QRU46CisJCXB4ZW52X2NhbGwudGZ0cF9vcGVuID0gcHhlbnZfdGZ0cF9vcGVuOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudGZ0cF9vcGVuICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVEZUUF9DTE9TRToKKwkJcHhlbnZfY2FsbC50ZnRwX2Nsb3NlID0gcHhlbnZfdGZ0cF9jbG9zZTsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnRmdHBfY2xvc2UgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9URlRQX1JFQUQ6CisJCXB4ZW52X2NhbGwudGZ0cF9yZWFkID0gcHhlbnZfdGZ0cF9yZWFkOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudGZ0cF9yZWFkICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVEZUUF9SRUFEX0ZJTEU6CisJCXB4ZW52X2NhbGwudGZ0cF9yZWFkX2ZpbGUgPSBweGVudl90ZnRwX3JlYWRfZmlsZTsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnRmdHBfcmVhZF9maWxlICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVEZUUF9HRVRfRlNJWkU6CisJCXB4ZW52X2NhbGwudGZ0cF9nZXRfZnNpemUgPSBweGVudl90ZnRwX2dldF9mc2l6ZTsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnRmdHBfZ2V0X2ZzaXplICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVURQX09QRU46CisJCXB4ZW52X2NhbGwudWRwX29wZW4gPSBweGVudl91ZHBfb3BlbjsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnVkcF9vcGVuICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVURQX0NMT1NFOgorCQlweGVudl9jYWxsLnVkcF9jbG9zZSA9IHB4ZW52X3VkcF9jbG9zZTsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnVkcF9jbG9zZSApOworCQlicmVhazsKKwljYXNlIFBYRU5WX1VEUF9XUklURToKKwkJcHhlbnZfY2FsbC51ZHBfd3JpdGUgPSBweGVudl91ZHBfd3JpdGU7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS51ZHBfd3JpdGUgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VRFBfUkVBRDoKKwkJcHhlbnZfY2FsbC51ZHBfcmVhZCA9IHB4ZW52X3VkcF9yZWFkOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudWRwX3JlYWQgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VTkRJX1NUQVJUVVA6CisJCXB4ZW52X2NhbGwudW5kaV9zdGFydHVwID0gcHhlbnZfdW5kaV9zdGFydHVwOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV9zdGFydHVwICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVU5ESV9DTEVBTlVQOgorCQlweGVudl9jYWxsLnVuZGlfY2xlYW51cCA9IHB4ZW52X3VuZGlfY2xlYW51cDsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnVuZGlfY2xlYW51cCApOworCQlicmVhazsKKwljYXNlIFBYRU5WX1VORElfSU5JVElBTElaRToKKwkJcHhlbnZfY2FsbC51bmRpX2luaXRpYWxpemUgPSBweGVudl91bmRpX2luaXRpYWxpemU7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS51bmRpX2luaXRpYWxpemUgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VTkRJX1JFU0VUX0FEQVBURVI6CisJCXB4ZW52X2NhbGwudW5kaV9yZXNldF9hZGFwdGVyID0gcHhlbnZfdW5kaV9yZXNldF9hZGFwdGVyOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV9yZXNldF9hZGFwdGVyICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVU5ESV9TSFVURE9XTjoKKwkJcHhlbnZfY2FsbC51bmRpX3NodXRkb3duID0gcHhlbnZfdW5kaV9zaHV0ZG93bjsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnVuZGlfc2h1dGRvd24gKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VTkRJX09QRU46CisJCXB4ZW52X2NhbGwudW5kaV9vcGVuID0gcHhlbnZfdW5kaV9vcGVuOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV9vcGVuICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVU5ESV9DTE9TRToKKwkJcHhlbnZfY2FsbC51bmRpX2Nsb3NlID0gcHhlbnZfdW5kaV9jbG9zZTsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnVuZGlfY2xvc2UgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VTkRJX1RSQU5TTUlUOgorCQlweGVudl9jYWxsLnVuZGlfdHJhbnNtaXQgPSBweGVudl91bmRpX3RyYW5zbWl0OworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV90cmFuc21pdCApOworCQlicmVhazsKKwljYXNlIFBYRU5WX1VORElfU0VUX01DQVNUX0FERFJFU1M6CisJCXB4ZW52X2NhbGwudW5kaV9zZXRfbWNhc3RfYWRkcmVzcyA9CisJCQlweGVudl91bmRpX3NldF9tY2FzdF9hZGRyZXNzOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV9zZXRfbWNhc3RfYWRkcmVzcyApOworCQlicmVhazsKKwljYXNlIFBYRU5WX1VORElfU0VUX1NUQVRJT05fQUREUkVTUzoKKwkJcHhlbnZfY2FsbC51bmRpX3NldF9zdGF0aW9uX2FkZHJlc3MgPQorCQkJcHhlbnZfdW5kaV9zZXRfc3RhdGlvbl9hZGRyZXNzOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV9zZXRfc3RhdGlvbl9hZGRyZXNzICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVU5ESV9TRVRfUEFDS0VUX0ZJTFRFUjoKKwkJcHhlbnZfY2FsbC51bmRpX3NldF9wYWNrZXRfZmlsdGVyID0KKwkJCXB4ZW52X3VuZGlfc2V0X3BhY2tldF9maWx0ZXI7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS51bmRpX3NldF9wYWNrZXRfZmlsdGVyICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT046CisJCXB4ZW52X2NhbGwudW5kaV9nZXRfaW5mb3JtYXRpb24gPSBweGVudl91bmRpX2dldF9pbmZvcm1hdGlvbjsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnVuZGlfZ2V0X2luZm9ybWF0aW9uICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUzoKKwkJcHhlbnZfY2FsbC51bmRpX2dldF9zdGF0aXN0aWNzID0gcHhlbnZfdW5kaV9nZXRfc3RhdGlzdGljczsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnVuZGlfZ2V0X3N0YXRpc3RpY3MgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VTkRJX0NMRUFSX1NUQVRJU1RJQ1M6CisJCXB4ZW52X2NhbGwudW5kaV9jbGVhcl9zdGF0aXN0aWNzID0gcHhlbnZfdW5kaV9jbGVhcl9zdGF0aXN0aWNzOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV9jbGVhcl9zdGF0aXN0aWNzICk7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUzoKKwkJcHhlbnZfY2FsbC51bmRpX2luaXRpYXRlX2RpYWdzID0gcHhlbnZfdW5kaV9pbml0aWF0ZV9kaWFnczsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnVuZGlfaW5pdGlhdGVfZGlhZ3MgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVDoKKwkJcHhlbnZfY2FsbC51bmRpX2ZvcmNlX2ludGVycnVwdCA9IHB4ZW52X3VuZGlfZm9yY2VfaW50ZXJydXB0OworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV9mb3JjZV9pbnRlcnJ1cHQgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VTkRJX0dFVF9NQ0FTVF9BRERSRVNTOgorCQlweGVudl9jYWxsLnVuZGlfZ2V0X21jYXN0X2FkZHJlc3MgPQorCQkJcHhlbnZfdW5kaV9nZXRfbWNhc3RfYWRkcmVzczsKKwkJcGFyYW1fbGVuID0gc2l6ZW9mICggcHhlbnZfYW55LnVuZGlfZ2V0X21jYXN0X2FkZHJlc3MgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VTkRJX0dFVF9OSUNfVFlQRToKKwkJcHhlbnZfY2FsbC51bmRpX2dldF9uaWNfdHlwZSA9IHB4ZW52X3VuZGlfZ2V0X25pY190eXBlOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV9nZXRfbmljX3R5cGUgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPOgorCQlweGVudl9jYWxsLnVuZGlfZ2V0X2lmYWNlX2luZm8gPSBweGVudl91bmRpX2dldF9pZmFjZV9pbmZvOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkudW5kaV9nZXRfaWZhY2VfaW5mbyApOworCQlicmVhazsKKwljYXNlIFBYRU5WX1VORElfSVNSOgorCQlweGVudl9jYWxsLnVuZGlfaXNyID0gcHhlbnZfdW5kaV9pc3I7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS51bmRpX2lzciApOworCQlicmVhazsKKwljYXNlIFBYRU5WX0ZJTEVfT1BFTjoKKwkJcHhlbnZfY2FsbC5maWxlX29wZW4gPSBweGVudl9maWxlX29wZW47CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS5maWxlX29wZW4gKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9GSUxFX0NMT1NFOgorCQlweGVudl9jYWxsLmZpbGVfY2xvc2UgPSBweGVudl9maWxlX2Nsb3NlOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkuZmlsZV9jbG9zZSApOworCQlicmVhazsKKwljYXNlIFBYRU5WX0ZJTEVfU0VMRUNUOgorCQlweGVudl9jYWxsLmZpbGVfc2VsZWN0ID0gcHhlbnZfZmlsZV9zZWxlY3Q7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS5maWxlX3NlbGVjdCApOworCQlicmVhazsKKwljYXNlIFBYRU5WX0ZJTEVfUkVBRDoKKwkJcHhlbnZfY2FsbC5maWxlX3JlYWQgPSBweGVudl9maWxlX3JlYWQ7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS5maWxlX3JlYWQgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9HRVRfRklMRV9TSVpFOgorCQlweGVudl9jYWxsLmdldF9maWxlX3NpemUgPSBweGVudl9nZXRfZmlsZV9zaXplOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkuZ2V0X2ZpbGVfc2l6ZSApOworCQlicmVhazsKKwljYXNlIFBYRU5WX0ZJTEVfRVhFQzoKKwkJcHhlbnZfY2FsbC5maWxlX2V4ZWMgPSBweGVudl9maWxlX2V4ZWM7CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS5maWxlX2V4ZWMgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9GSUxFX0FQSV9DSEVDSzoKKwkJcHhlbnZfY2FsbC5maWxlX2FwaV9jaGVjayA9IHB4ZW52X2ZpbGVfYXBpX2NoZWNrOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkuZmlsZV9hcGlfY2hlY2sgKTsKKwkJYnJlYWs7CisJY2FzZSBQWEVOVl9GSUxFX0VYSVRfSE9PSzoKKwkJcHhlbnZfY2FsbC5maWxlX2V4aXRfaG9vayA9IHB4ZW52X2ZpbGVfZXhpdF9ob29rOworCQlwYXJhbV9sZW4gPSBzaXplb2YgKCBweGVudl9hbnkuZmlsZV9leGl0X2hvb2sgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJHICggIlBYRU5WX1VOS05PV05fJWh4Iiwgb3Bjb2RlICk7CisJCXB4ZW52X2NhbGwudW5rbm93biA9IHB4ZW52X3Vua25vd247CisJCXBhcmFtX2xlbiA9IHNpemVvZiAoIHB4ZW52X2FueS51bmtub3duICk7CisJCWJyZWFrOworCX0KKworCS8qIENvcHkgcGFyYW1ldGVyIGJsb2NrIGZyb20gY2FsbGVyICovCisJY29weV9mcm9tX3VzZXIgKCAmcHhlbnZfYW55LCBwYXJhbWV0ZXJzLCAwLCBwYXJhbV9sZW4gKTsKKworCS8qIFNldCBkZWZhdWx0IHN0YXR1cyBpbiBjYXNlIGNoaWxkIHJvdXRpbmUgZmFpbHMgdG8gZG8gc28gKi8KKwlweGVudl9hbnkuU3RhdHVzID0gUFhFTlZfU1RBVFVTX0ZBSUxVUkU7CisKKwkvKiBIYW5kIG9mZiB0byByZWxldmFudCBBUEkgcm91dGluZSAqLworCURCRyAoICJbIiApOworCXJldCA9IHB4ZW52X2NhbGwuYW55ICggJnB4ZW52X2FueSApOworCWlmICggcHhlbnZfYW55LlN0YXR1cyAhPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUyApIHsKKwkJREJHICggIiAlMDJ4IiwgcHhlbnZfYW55LlN0YXR1cyApOworCX0KKwlpZiAoIHJldCAhPSBQWEVOVl9FWElUX1NVQ0NFU1MgKSB7CisJCURCRyAoIHJldCA9PSBQWEVOVl9FWElUX0ZBSUxVUkUgPyAiIGVyciIgOiAiID8/IiApOworCX0KKwlEQkcgKCAiXSIgKTsKKwkKKwkvKiBDb3B5IG1vZGlmaWVkIHBhcmFtZXRlciBibG9jayBiYWNrIHRvIGNhbGxlciBhbmQgcmV0dXJuICovCisJY29weV90b191c2VyICggcGFyYW1ldGVycywgMCwgJnB4ZW52X2FueSwgcGFyYW1fbGVuICk7CisJaXg4Ni0+cmVncy5heCA9IHJldDsKK30KKworLyoqCisgKiBEaXNwYXRjaCB3ZWFrIFBYRSBBUEkgY2FsbCB3aXRoIFBYRSBzdGFjayBhdmFpbGFibGUKKyAqCisgKiBAdiBpeDg2CQlSZWdpc3RlcnMgZm9yIFBYRSBjYWxsCisgKiBAcmV0IHByZXNlbnQJCVplcm8gKFBYRSBzdGFjayBwcmVzZW50KQorICovCitpbnQgX3B4ZV9hcGlfY2FsbF93ZWFrICggc3RydWN0IGkzODZfYWxsX3JlZ3MgKml4ODYgKQoreworCXB4ZV9hcGlfY2FsbCAoIGl4ODYgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBEaXNwYXRjaCBQWEUgbG9hZGVyIGNhbGwKKyAqCisgKiBAdiBlczpkaQkJQWRkcmVzcyBvZiBQWEUgcGFyYW1ldGVyIGJsb2NrCisgKiBAcmV0IGF4CQlQWEUgZXhpdCBjb2RlCisgKi8KK19fYXNtY2FsbCB2b2lkIHB4ZV9sb2FkZXJfY2FsbCAoIHN0cnVjdCBpMzg2X2FsbF9yZWdzICppeDg2ICkgeworCXVzZXJwdHJfdCB1cGFyYW1zID0gcmVhbF90b191c2VyICggaXg4Ni0+c2Vncy5lcywgaXg4Ni0+cmVncy5kaSApOworCXN0cnVjdCBzX1VORElfTE9BREVSIHBhcmFtczsKKwlQWEVOVl9FWElUX3QgcmV0OworCisJLyogQ29weSBwYXJhbWV0ZXIgYmxvY2sgZnJvbSBjYWxsZXIgKi8KKwljb3B5X2Zyb21fdXNlciAoICZwYXJhbXMsIHVwYXJhbXMsIDAsIHNpemVvZiAoIHBhcmFtcyApICk7CisKKwkvKiBGaWxsIGluIFJPTSBzZWdtZW50IGFkZHJlc3MgKi8KKwlwcHhlLlVORElST01JRC5zZWdtZW50ID0gaXg4Ni0+c2Vncy5kczsKKworCS8qIFNldCBkZWZhdWx0IHN0YXR1cyBpbiBjYXNlIGNoaWxkIHJvdXRpbmUgZmFpbHMgdG8gZG8gc28gKi8KKwlwYXJhbXMuU3RhdHVzID0gUFhFTlZfU1RBVFVTX0ZBSUxVUkU7CisKKwkvKiBDYWxsIFVOREkgbG9hZGVyICovCisJcmV0ID0gdW5kaV9sb2FkZXIgKCAmcGFyYW1zICk7CisKKwkvKiBDb3B5IG1vZGlmaWVkIHBhcmFtZXRlciBibG9jayBiYWNrIHRvIGNhbGxlciBhbmQgcmV0dXJuICovCisJY29weV90b191c2VyICggdXBhcmFtcywgMCwgJnBhcmFtcywgc2l6ZW9mICggcGFyYW1zICkgKTsKKwlpeDg2LT5yZWdzLmF4ID0gcmV0OworfQorCisvKioKKyAqIENhbGN1bGF0ZSBieXRlIGNoZWNrc3VtIGFzIHVzZWQgYnkgUFhFCisgKgorICogQHYgZGF0YQkJRGF0YQorICogQHYgc2l6ZQkJTGVuZ3RoIG9mIGRhdGEKKyAqIEByZXQgc3VtCQlDaGVja3N1bQorICovCitzdGF0aWMgdWludDhfdCBweGVfY2hlY2tzdW0gKCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSApIHsKKwl1aW50OF90ICpieXRlcyA9IGRhdGE7CisJdWludDhfdCBzdW0gPSAwOworCisJd2hpbGUgKCBzaXplLS0gKSB7CisJCXN1bSArPSAqYnl0ZXMrKzsKKwl9CisJcmV0dXJuIHN1bTsKK30KKworLyoqCisgKiBJbml0aWFsaXNlICFQWEUgYW5kIFBYRU5WKyBzdHJ1Y3R1cmVzCisgKgorICovCitzdGF0aWMgdm9pZCBweGVfaW5pdF9zdHJ1Y3R1cmVzICggdm9pZCApIHsKKwl1aW50MzJfdCBybV9jc19waHlzID0gKCBybV9jcyA8PCA0ICk7CisJdWludDMyX3Qgcm1fZHNfcGh5cyA9ICggcm1fZHMgPDwgNCApOworCisJLyogRmlsbCBpbiBtaXNzaW5nIHNlZ21lbnQgZmllbGRzICovCisJcHB4ZS5FbnRyeVBvaW50U1Auc2VnbWVudCA9IHJtX2NzOworCXBweGUuRW50cnlQb2ludEVTUC5zZWdtZW50ID0gcm1fY3M7CisJcHB4ZS5TdGFjay5zZWdtZW50X2FkZHJlc3MgPSBybV9kczsKKwlwcHhlLlN0YWNrLlBoeXNpY2FsX2FkZHJlc3MgPSBybV9kc19waHlzOworCXBweGUuVU5ESURhdGEuc2VnbWVudF9hZGRyZXNzID0gcm1fZHM7CisJcHB4ZS5VTkRJRGF0YS5QaHlzaWNhbF9hZGRyZXNzID0gcm1fZHNfcGh5czsKKwlwcHhlLlVORElDb2RlLnNlZ21lbnRfYWRkcmVzcyA9IHJtX2NzOworCXBweGUuVU5ESUNvZGUuUGh5c2ljYWxfYWRkcmVzcyA9IHJtX2NzX3BoeXM7CisJcHB4ZS5VTkRJQ29kZVdyaXRlLnNlZ21lbnRfYWRkcmVzcyA9IHJtX2NzOworCXBweGUuVU5ESUNvZGVXcml0ZS5QaHlzaWNhbF9hZGRyZXNzID0gcm1fY3NfcGh5czsKKwlweGVudi5STUVudHJ5LnNlZ21lbnQgPSBybV9jczsKKwlweGVudi5TdGFja1NlZyA9IHJtX2RzOworCXB4ZW52LlVORElEYXRhU2VnID0gcm1fZHM7CisJcHhlbnYuVU5ESUNvZGVTZWcgPSBybV9jczsKKwlweGVudi5QWEVQdHIuc2VnbWVudCA9IHJtX2NzOworCisJLyogVXBkYXRlIGNoZWNrc3VtcyAqLworCXBweGUuU3RydWN0Q2tzdW0gLT0gcHhlX2NoZWNrc3VtICggJnBweGUsIHNpemVvZiAoIHBweGUgKSApOworCXB4ZW52LkNoZWNrc3VtIC09IHB4ZV9jaGVja3N1bSAoICZweGVudiwgc2l6ZW9mICggcHhlbnYgKSApOworfQorCisvKiogUFhFIHN0cnVjdHVyZSBpbml0aWFsaXNlciAqLworc3RydWN0IGluaXRfZm4gcHhlX2luaXRfZm4gX19pbml0X2ZuICggSU5JVF9OT1JNQUwgKSA9IHsKKwkuaW5pdGlhbGlzZSA9IHB4ZV9pbml0X3N0cnVjdHVyZXMsCit9OworCisvKioKKyAqIEFjdGl2YXRlIFBYRSBzdGFjaworICoKKyAqIEB2IG5ldGRldgkJTmV0IGRldmljZSB0byB1c2UgYXMgUFhFIG5ldCBkZXZpY2UKKyAqLwordm9pZCBweGVfYWN0aXZhdGUgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCisJLyogRW5zdXJlIElOVCAxQSBpcyBob29rZWQgKi8KKwlpZiAoICEgaW50XzFhX2hvb2tlZCApIHsKKwkJaG9va19iaW9zX2ludGVycnVwdCAoIDB4MWEsICggdW5zaWduZWQgaW50ICkgcHhlX2ludF8xYSwKKwkJCQkgICAgICAmcHhlX2ludF8xYV92ZWN0b3IgKTsKKwkJaW50XzFhX2hvb2tlZCA9IDE7CisJfQorCisJLyogU2V0IFBYRSBuZXR3b3JrIGRldmljZSAqLworCXB4ZV9zZXRfbmV0ZGV2ICggbmV0ZGV2ICk7Cit9CisKKy8qKgorICogRGVhY3RpdmF0ZSBQWEUgc3RhY2sKKyAqCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHB4ZV9kZWFjdGl2YXRlICggdm9pZCApIHsKKwlpbnQgcmM7CisKKwkvKiBDbGVhciBQWEUgbmV0d29yayBkZXZpY2UgKi8KKwlweGVfc2V0X25ldGRldiAoIE5VTEwgKTsKKworCS8qIEVuc3VyZSBJTlQgMUEgaXMgdW5ob29rZWQsIGlmIHBvc3NpYmxlICovCisJaWYgKCBpbnRfMWFfaG9va2VkICkgeworCQlpZiAoICggcmMgPSB1bmhvb2tfYmlvc19pbnRlcnJ1cHQgKCAweDFhLAorCQkJCQkJICAgICh1bnNpZ25lZCBpbnQpIHB4ZV9pbnRfMWEsCisJCQkJCQkgICAgJnB4ZV9pbnRfMWFfdmVjdG9yICkpIT0gMCl7CisJCQlEQkcgKCAiQ291bGQgbm90IHVuaG9vayBJTlQgMUE6ICVzXG4iLAorCQkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJaW50XzFhX2hvb2tlZCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU3RhcnQgUFhFIE5CUCBhdCAwMDAwOjdjMDAKKyAqCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHB4ZV9zdGFydF9uYnAgKCB2b2lkICkgeworCWludCBkaXNjYXJkX2IsIGRpc2NhcmRfYywgZGlzY2FyZF9kLCBkaXNjYXJkX0Q7CisJdWludDE2X3QgcmM7CisKKwkvKiBGYXIgY2FsbCB0byBQWEUgTkJQICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBSRUFMX0NPREUgKCAibW92dyAlJWN4LCAlJWVzXG5cdCIKKwkJCQkJICAgInB1c2h3ICUlZXNcblx0IgorCQkJCQkgICAicHVzaHcgJSVkaVxuXHQiCisJCQkJCSAgICJzdGlcblx0IgorCQkJCQkgICAibGNhbGwgJDAsICQweDdjMDBcblx0IgorCQkJCQkgICAiYWRkdyAkNCwgJSVzcFxuXHQiICkKKwkJCSAgICAgICA6ICI9YSIgKCByYyApLCAiPWIiICggZGlzY2FyZF9iICksCisJCQkJICI9YyIgKCBkaXNjYXJkX2MgKSwgIj1kIiAoIGRpc2NhcmRfZCApLAorCQkJCSAiPUQiICggZGlzY2FyZF9EICkKKwkJCSAgICAgICA6ICJhIiAoIDAgKSwgImIiICggX19mcm9tX3RleHQxNiAoICZweGVudiApICksCisJCQkgICAgICAgICAiYyIgKCBybV9jcyApLAorCQkJICAgICAgICAgImQiICggdmlydF90b19waHlzICggJnB4ZW52ICkgKSwKKwkJCQkgIkQiICggX19mcm9tX3RleHQxNiAoICZwcHhlICkgKQorCQkJICAgICAgIDogImVzaSIsICJlYnAiLCAibWVtb3J5IiApOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGUvcHhlX2VudHJ5LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfZW50cnkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDNhNTdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGUvcHhlX2VudHJ5LlMKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApCisKKwkuYXJjaCBpMzg2CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAhUFhFIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2LmRhdGEiLCAiYXciLCBAcHJvZ2JpdHMKKwkuZ2xvYmwgcHB4ZQorCS5hbGlnbiAxNgorcHB4ZToKKwkuYXNjaWkgIiFQWEUiCQkJLyogU2lnbmF0dXJlICovCisJLmJ5dGUgcHhlX2xlbmd0aAkJLyogU3RydWN0TGVuZ3RoICovCisJLmJ5dGUgMAkJCQkvKiBTdHJ1Y3RDa3N1bSAqLworCS5ieXRlIDAJCQkJLyogU3RydWN0UmV2ICovCisJLmJ5dGUgMAkJCQkvKiByZXNlcnZlZF8xICovCisJLndvcmQgdW5kaWhlYWRlciwgMAkJLyogVU5ESVJPTUlEICovCisJLndvcmQgMCwgMAkJCS8qIEJhc2VST01JRCAqLworCS53b3JkIHB4ZV9lbnRyeV9zcCwgMAkJLyogRW50cnlQb2ludFNQICovCisJLndvcmQgcHhlX2VudHJ5X2VzcCwgMAkJLyogRW50cnlQb2ludEVTUCAqLworCS53b3JkIC0xLCAtMQkJCS8qIFN0YXR1c0NhbGxvdXQgKi8KKwkuYnl0ZSAwCQkJCS8qIHJlc2VydmVkXzIgKi8KKwkuYnl0ZSBTZWdEZXNjQ250CQkvKiBTZWdEZXNjQ250ICovCisJLndvcmQgMAkJCQkvKiBGaXJzdFNlbGVjdG9yICovCitweGVfc2VnbWVudHM6CisJLndvcmQgMCwgMCwgMCwgX2RhdGExNl9tZW1zegkvKiBTdGFjayAqLworCS53b3JkIDAsIDAsIDAsIF9kYXRhMTZfbWVtc3oJLyogVU5ESURhdGEgKi8KKwkud29yZCAwLCAwLCAwLCBfdGV4dDE2X21lbXN6CS8qIFVORElDb2RlICovCisJLndvcmQgMCwgMCwgMCwgX3RleHQxNl9tZW1zegkvKiBVTkRJQ29kZVdyaXRlICovCisJLndvcmQgMCwgMCwgMCwgMAkJLyogQkNfRGF0YSAqLworCS53b3JkIDAsIDAsIDAsIDAJCS8qIEJDX0NvZGUgKi8KKwkud29yZCAwLCAwLCAwLCAwCQkvKiBCQ19Db2RlV3JpdGUgKi8KKwkuZXF1CVNlZ0Rlc2NDbnQsICggKCAuIC0gcHhlX3NlZ21lbnRzICkgLyA4ICkKKwkuZXF1CXB4ZV9sZW5ndGgsIC4gLSBwcHhlCisJLnNpemUJcHB4ZSwgLiAtIHBweGUKKworCS8qIERlZmluZSB1bmRpaGVhZGVyPTAgYXMgYSB3ZWFrIHN5bWJvbCBmb3Igbm9uLVJPTSBidWlsZHMgKi8KKwkuc2VjdGlvbiAiLndlYWsiLCAiYSIsIEBub2JpdHMKKwkud2Vhawl1bmRpaGVhZGVyCit1bmRpaGVhZGVyOgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFhFTlYrIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2LmRhdGEiLCAiYXciLCBAcHJvZ2JpdHMKKwkuZ2xvYmwgcHhlbnYKKwkuYWxpZ24gMTYKK3B4ZW52OgorCS5hc2NpaSAiUFhFTlYrIgkJCS8qIFNpZ25hdHVyZSAqLworCS53b3JkIDB4MDIwMQkJCS8qIFZlcnNpb24gKi8KKwkuYnl0ZSBweGVudl9sZW5ndGgJCS8qIExlbmd0aCAqLworCS5ieXRlIDAJCQkJLyogQ2hlY2tzdW0gKi8KKwkud29yZCBweGVudl9lbnRyeSwgMAkJLyogUk1FbnRyeSAqLworCS5sb25nIDAJCQkJLyogUE1FbnRyeSAqLworCS53b3JkIDAJCQkJLyogUE1TZWxlY3RvciAqLworCS53b3JkIDAJCQkJLyogU3RhY2tTZWcgKi8KKwkud29yZCBfZGF0YTE2X21lbXN6CQkvKiBTdGFja1NpemUgKi8KKwkud29yZCAwCQkJCS8qIEJDX0NvZGVTZWcgKi8KKwkud29yZCAwCQkJCS8qIEJDX0NvZGVTaXplICovCisJLndvcmQgMAkJCQkvKiBCQ19EYXRhU2VnICovCisJLndvcmQgMAkJCQkvKiBCQ19EYXRhU2l6ZSAqLworCS53b3JkIDAJCQkJLyogVU5ESURhdGFTZWcgKi8KKwkud29yZCBfZGF0YTE2X21lbXN6CQkvKiBVTkRJRGF0YVNpemUgKi8KKwkud29yZCAwCQkJCS8qIFVORElDb2RlU2VnICovCisJLndvcmQgX3RleHQxNl9tZW1zegkJLyogVU5ESUNvZGVTaXplICovCisJLndvcmQgcHB4ZSwgMAkJCS8qIFBYRVB0ciAqLworCS5lcXUJcHhlbnZfbGVuZ3RoLCAuIC0gcHhlbnYKKwkuc2l6ZQlweGVudiwgLiAtIHB4ZW52CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHhlbnZfZW50cnkgKDE2LWJpdCBmYXIgY2FsbCkKKyAqCisgKiBQWEUgQVBJIGNhbGwgUFhFTlYrIGVudHJ5IHBvaW50CisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWVzOmRpIDogRmFyIHBvaW50ZXIgdG8gUFhFIHBhcmFtZXRlciBzdHJ1Y3R1cmUKKyAqICAgJWJ4IDogUFhFIEFQSSBjYWxsCisgKiBSZXR1cm5zOgorICogICAlYXggOiBQWEUgZXhpdCBzdGF0dXMKKyAqIENvcnJ1cHRzOgorICogICBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLyogV3lzZSBTdHJlYW1pbmcgTWFuYWdlciBzZXJ2ZXIgKFdMRFJNMTMuQklOKSBhc3N1bWVzIHRoYXQKKwkgKiB0aGUgUFhFTlYrIGVudHJ5IHBvaW50IGlzIGF0IFVORElfQ1M6MDAwMDsgYXBwYXJlbnRseSwKKwkgKiBzb21lYm9keSBhdCBXeXNlIGhhcyBkaWZmaWN1bHR5IGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4gdGhlCisJICogd29yZHMgIm1heSIgYW5kICJtdXN0Ii4uLgorCSAqLworCS5zZWN0aW9uICIudGV4dDE2Lm51bGwiLCAiYXgiLCBAcHJvZ2JpdHMKKwkuY29kZTE2CitweGVudl9udWxsX2VudHJ5OgorCWptcAlweGVudl9lbnRyeQorCisJLnNlY3Rpb24gIi50ZXh0MTYiLCAiYXgiLCBAcHJvZ2JpdHMKKwkuY29kZTE2CitweGVudl9lbnRyeToKKwlwdXNobAkkcHhlX2FwaV9jYWxsCisJcHVzaHcJJWNzCisJY2FsbAlwcm90X2NhbGwKKwlhZGRsCSQ0LCAlZXNwCisJbHJldAorCS5zaXplCXB4ZW52X2VudHJ5LCAuIC0gcHhlbnZfZW50cnkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHB4ZV9lbnRyeQorICoKKyAqIFBYRSBBUEkgY2FsbCAhUFhFIGVudHJ5IHBvaW50CisgKgorICogUGFyYW1ldGVyczoKKyAqICAgc3RhY2sgOiBGYXIgcG9pbnRlciB0byBQWEUgcGFyYW1ldGVyIHN0cnVjdHVyZQorICogICBzdGFjayA6IFBYRSBBUEkgY2FsbAorICogUmV0dXJuczoKKyAqICAgJWF4IDogUFhFIGV4aXQgc3RhdHVzCisgKiBDb3JydXB0czoKKyAqICAgbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCisJLmNvZGUxNgorcHhlX2VudHJ5OgorcHhlX2VudHJ5X3NwOgorCS8qIFByZXNlcnZlIG9yaWdpbmFsICVlc3AgKi8KKwlwdXNobAklZXNwCisJLyogWmVybyBoaWdoIHdvcmQgb2YgJWVzcCB0byBhbGxvdyB1c2Ugb2YgY29tbW9uIGNvZGUgKi8KKwltb3Z6d2wJJXNwLCAlZXNwCisJam1wCXB4ZV9lbnRyeV9jb21tb24KK3B4ZV9lbnRyeV9lc3A6CisJLyogUHJlc2VydmUgJWVzcCB0byBtYXRjaCBiZWhhdmlvdXIgb2YgcHhlX2VudHJ5X3NwICovCisJcHVzaGwJJWVzcAorcHhlX2VudHJ5X2NvbW1vbjoKKwkvKiBTYXZlIFBYRU5WKyBBUEkgY2FsbCByZWdpc3RlcnMgKi8KKwlwdXNodwklZXMKKwlwdXNodwklZGkKKwlwdXNodwklYngKKwkvKiBMb2FkICFQWEUgcGFyYW1ldGVycyBmcm9tIHN0YWNrIGludG8gUFhFTlYrIHJlZ2lzdGVycyAqLworCWFkZHIzMiBtb3Z3CTE4KCVlc3ApLCAlYngKKwltb3Z3CSVieCwgJWVzCisJYWRkcjMyIG1vdncJMTYoJWVzcCksICVkaQorCWFkZHIzMiBtb3Z3CTE0KCVlc3ApLCAlYngKKwkvKiBNYWtlIGNhbGwgYXMgZm9yIFBYRU5WKyAqLworCXB1c2h3CSVjcworCWNhbGwJcHhlbnZfZW50cnkKKwkvKiBSZXN0b3JlIFBYRU5WKyByZWdpc3RlcnMgKi8KKwlwb3B3CSVieAorCXBvcHcJJWRpCisJcG9wdwklZXMKKwkvKiBSZXN0b3JlIG9yaWdpbmFsICVlc3AgYW5kIHJldHVybiAqLworCXBvcGwJJWVzcAorCWxyZXQKKwkuc2l6ZQlweGVfZW50cnksIC4gLSBweGVfZW50cnkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHB4ZV9pbnRfMWEKKyAqCisgKiBQWEUgSU5UIDFBIGhhbmRsZXIKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlYXggOiAweDU2NTAKKyAqIFJldHVybnM6CisgKiAgICVheCA6IDB4NTY0ZQorICogICAlZXM6YnggOiBGYXIgcG9pbnRlciB0byB0aGUgUFhFTlYrIHN0cnVjdHVyZQorICogICAlZWR4IDogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUFhFTlYrIHN0cnVjdHVyZQorICogICBDRiBjbGVhcmVkCisgKiBDb3JydXB0czoKKyAqICAgbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCisJLmNvZGUxNgorCS5nbG9ibAlweGVfaW50XzFhCitweGVfaW50XzFhOgorCXB1c2hmdworCWNtcHcJJDB4NTY1MCwgJWF4CisJam5lCTFmCisJLyogSU5UIDFBLDU2NTAgLSBQWEUgaW5zdGFsbGF0aW9uIGNoZWNrICovCisJeG9ybAklZWR4LCAlZWR4CisJbW92dwklY3MsICVkeAorCW1vdncJJWR4LCAlZXMKKwltb3Z3CSRweGVudiwgJWJ4CisJc2hsbAkkNCwgJWVkeAorCWFkZGwJJHB4ZW52LCAlZWR4CisJbW92dwkkMHg1NjRlLCAlYXgKKwlwdXNodwklYnAKKwltb3Z3CSVzcCwgJWJwCisJYW5kYgkkfjB4MDEsIDgoJWJwKQkvKiBDbGVhciBDRiBvbiByZXR1cm4gKi8KKwlwb3B3CSVicAorCXBvcGZ3CisJaXJldAorMToJLyogSU5UIDFBLG90aGVyIC0gcGFzcyB0aHJvdWdoICovCisJcG9wZncKKwlsam1wCSolY3M6cHhlX2ludF8xYV92ZWN0b3IKKworCS5zZWN0aW9uICIudGV4dDE2LmRhdGEiLCAiYXciLCBAcHJvZ2JpdHMKKwkuZ2xvYmwJcHhlX2ludF8xYV92ZWN0b3IKK3B4ZV9pbnRfMWFfdmVjdG9yOgkubG9uZyAwCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfZXJyb3JzLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfZXJyb3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4NGVmOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcHhlL3B4ZV9lcnJvcnMuYwpAQCAtMCwwICsxLDEwMyBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9lcnJvcnRhYi5oPgorCisvKgorICogVGhpcyB0YWJsZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlbGV2YW50IHNlY3Rpb24gb2YgZXJybm8uaCB1c2luZworICoKKyAqIHBlcmwgLW5lICdpZiAoIC8oUFhFTlZfU1RBVFVTXyhcUyspKS8gKSB7CisgKgkkY29kZSA9ICQxOyAkbXNnID0gJDI7CisgKgkkbXNnID1+IHMvXy8gL2c7ICRtc2cgPSB1Y2ZpcnN0IGxjICRtc2c7CisgKgkkbXNnID1+IHMvKHRmdHB8dWRwfGFycHx1bmRpfGJpc3xiaW5sfHB4ZW52fHB4ZXxkaGNwKS91YyAkMS9pZWc7CisgKglwcmludCAiXHR7ICRjb2RlLCBcIiRtc2dcIiB9LFxuIjsKKyAqCX0nCisgKgorICogZm9sbG93ZWQgYnkgYSBsaXR0bGUgbWFudWFsIHR3ZWFraW5nLgorICoKKyAqLworc3RydWN0IGVycm9ydGFiIHB4ZV9lcnJvcnRhYltdIF9fZXJyb3J0YWIgPSB7CisJeyBQWEVOVl9TVEFUVVNfU1VDQ0VTUywgIlN1Y2Nlc3MiIH0sCisJeyBQWEVOVl9TVEFUVVNfRkFJTFVSRSwgIkZhaWx1cmUiIH0sCisJeyBQWEVOVl9TVEFUVVNfQkFEX0ZVTkMsICJCYWQgZnVuY3Rpb24iIH0sCisJeyBQWEVOVl9TVEFUVVNfVU5TVVBQT1JURUQsICJVbnN1cHBvcnRlZCBmdW5jdGlvbiIgfSwKKwl7IFBYRU5WX1NUQVRVU19LRUVQX1VOREksICJLZWVwIFVOREkiIH0sCisJeyBQWEVOVl9TVEFUVVNfS0VFUF9BTEwsICJLZWVwIGFsbCIgfSwKKwl7IFBYRU5WX1NUQVRVU19PVVRfT0ZfUkVTT1VSQ0VTLCAiT3V0IG9mIHJlc291cmNlcyIgfSwKKwl7IFBYRU5WX1NUQVRVU19BUlBfVElNRU9VVCwgIkFSUCB0aW1lb3V0IiB9LAorCXsgUFhFTlZfU1RBVFVTX1VEUF9DTE9TRUQsICJVRFAgY2xvc2VkIiB9LAorCXsgUFhFTlZfU1RBVFVTX1VEUF9PUEVOLCAiVURQIG9wZW4iIH0sCisJeyBQWEVOVl9TVEFUVVNfVEZUUF9DTE9TRUQsICJURlRQIGNsb3NlZCIgfSwKKwl7IFBYRU5WX1NUQVRVU19URlRQX09QRU4sICJURlRQIG9wZW4iIH0sCisJeyBQWEVOVl9TVEFUVVNfTUNPUFlfUFJPQkxFTSwgIk1lbW9yeSBjb3B5IHByb2JsZW0iIH0sCisJeyBQWEVOVl9TVEFUVVNfQklTX0lOVEVHUklUWV9GQUlMVVJFLCAiQklTIGludGVncml0eSBmYWlsdXJlIiB9LAorCXsgUFhFTlZfU1RBVFVTX0JJU19WQUxJREFURV9GQUlMVVJFLCAiQklTIHZhbGlkYXRpb24gZmFpbHVyZSIgfSwKKwl7IFBYRU5WX1NUQVRVU19CSVNfSU5JVF9GQUlMVVJFLCAiQklTIGluaXQgZmFpbHVyZSIgfSwKKwl7IFBYRU5WX1NUQVRVU19CSVNfU0hVVERPV05fRkFJTFVSRSwgIkJJUyBzaHV0ZG93biBmYWlsdXJlIiB9LAorCXsgUFhFTlZfU1RBVFVTX0JJU19HQk9BX0ZBSUxVUkUsICJCSVMgR0JPQSBmYWlsdXJlIiB9LAorCXsgUFhFTlZfU1RBVFVTX0JJU19GUkVFX0ZBSUxVUkUsICJCSVMgZnJlZSBmYWlsdXJlIiB9LAorCXsgUFhFTlZfU1RBVFVTX0JJU19HU0lfRkFJTFVSRSwgIkJJUyBHU0kgZmFpbHVyZSIgfSwKKwl7IFBYRU5WX1NUQVRVU19CSVNfQkFEX0NLU1VNLCAiQklTIGJhZCBjaGVja3N1bSIgfSwKKwl7IFBYRU5WX1NUQVRVU19URlRQX0NBTk5PVF9BUlBfQUREUkVTUywgIlRGVFAgY2Fubm90IEFSUCBhZGRyZXNzIiB9LAorCXsgUFhFTlZfU1RBVFVTX1RGVFBfT1BFTl9USU1FT1VULCAiVEZUUCBvcGVuIHRpbWVvdXQiIH0sCisJeyBQWEVOVl9TVEFUVVNfVEZUUF9VTktOT1dOX09QQ09ERSwgIlRGVFAgdW5rbm93biBvcGNvZGUiIH0sCisJeyBQWEVOVl9TVEFUVVNfVEZUUF9SRUFEX1RJTUVPVVQsICJURlRQIHJlYWQgdGltZW91dCIgfSwKKwl7IFBYRU5WX1NUQVRVU19URlRQX0VSUk9SX09QQ09ERSwgIlRGVFAgZXJyb3Igb3Bjb2RlIiB9LAorCXsgUFhFTlZfU1RBVFVTX1RGVFBfQ0FOTk9UX09QRU5fQ09OTkVDVElPTiwKKwkgICJURlRQIGNhbm5vdCBvcGVuIGNvbm5lY3Rpb24iIH0sCisJeyBQWEVOVl9TVEFUVVNfVEZUUF9DQU5OT1RfUkVBRF9GUk9NX0NPTk5FQ1RJT04sCisJICAiVEZUUCBjYW5ub3QgcmVhZCBmcm9tIGNvbm5lY3Rpb24iIH0sCisJeyBQWEVOVl9TVEFUVVNfVEZUUF9UT09fTUFOWV9QQUNLQUdFUywgIlRGVFAgdG9vIG1hbnkgcGFja2FnZXMiIH0sCisJeyBQWEVOVl9TVEFUVVNfVEZUUF9GSUxFX05PVF9GT1VORCwgIlRGVFAgZmlsZSBub3QgZm91bmQiIH0sCisJeyBQWEVOVl9TVEFUVVNfVEZUUF9BQ0NFU1NfVklPTEFUSU9OLCAiVEZUUCBhY2Nlc3MgdmlvbGF0aW9uIiB9LAorCXsgUFhFTlZfU1RBVFVTX1RGVFBfTk9fTUNBU1RfQUREUkVTUywgIlRGVFAgbm8gbWNhc3QgYWRkcmVzcyIgfSwKKwl7IFBYRU5WX1NUQVRVU19URlRQX05PX0ZJTEVTSVpFLCAiVEZUUCBubyBmaWxlc2l6ZSIgfSwKKwl7IFBYRU5WX1NUQVRVU19URlRQX0lOVkFMSURfUEFDS0VUX1NJWkUsICJURlRQIGludmFsaWQgcGFja2V0IHNpemUiIH0sCisJeyBQWEVOVl9TVEFUVVNfREhDUF9USU1FT1VULCAiREhDUCB0aW1lb3V0IiB9LAorCXsgUFhFTlZfU1RBVFVTX0RIQ1BfTk9fSVBfQUREUkVTUywgIkRIQ1Agbm8gaXAgYWRkcmVzcyIgfSwKKwl7IFBYRU5WX1NUQVRVU19ESENQX05PX0JPT1RGSUxFX05BTUUsICJESENQIG5vIGJvb3RmaWxlIG5hbWUiIH0sCisJeyBQWEVOVl9TVEFUVVNfREhDUF9CQURfSVBfQUREUkVTUywgIkRIQ1AgYmFkIGlwIGFkZHJlc3MiIH0sCisJeyBQWEVOVl9TVEFUVVNfVU5ESV9JTlZBTElEX0ZVTkNUSU9OLCAiVU5ESSBpbnZhbGlkIGZ1bmN0aW9uIiB9LAorCXsgUFhFTlZfU1RBVFVTX1VORElfTUVESUFURVNUX0ZBSUxFRCwgIlVOREkgbWVkaWF0ZXN0IGZhaWxlZCIgfSwKKwl7IFBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9JTklUX05JQ19GT1JfTUNBU1QsCisJICAiVU5ESSBjYW5ub3QgaW5pdGlhbGlzZSBOSUMgZm9yIG11bHRpY2FzdCIgfSwKKwl7IFBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9JTklUSUFMSVpFX05JQywKKwkgICJVTkRJIGNhbm5vdCBpbml0aWFsaXNlIE5JQyIgfSwKKwl7IFBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9JTklUSUFMSVpFX1BIWSwKKwkgICJVTkRJIGNhbm5vdCBpbml0aWFsaXNlIFBIWSIgfSwKKwl7IFBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9SRUFEX0NPTkZJR19EQVRBLAorCSAgIlVOREkgY2Fubm90IHJlYWQgY29uZmlnIGRhdGEiIH0sCisJeyBQWEVOVl9TVEFUVVNfVU5ESV9DQU5OT1RfUkVBRF9JTklUX0RBVEEsCisJICAiVU5ESSBjYW5ub3QgcmVhZCBpbml0IGRhdGEiIH0sCisJeyBQWEVOVl9TVEFUVVNfVU5ESV9CQURfTUFDX0FERFJFU1MsICJVTkRJIGJhZCBNQUMgYWRkcmVzcyIgfSwKKwl7IFBYRU5WX1NUQVRVU19VTkRJX0JBRF9FRVBST01fQ0hFQ0tTVU0sICJVTkRJIGJhZCBFRVBST00gY2hlY2tzdW0iIH0sCisJeyBQWEVOVl9TVEFUVVNfVU5ESV9FUlJPUl9TRVRUSU5HX0lTUiwgIlVOREkgZXJyb3Igc2V0dGluZyBJU1IiIH0sCisJeyBQWEVOVl9TVEFUVVNfVU5ESV9JTlZBTElEX1NUQVRFLCAiVU5ESSBpbnZhbGlkIHN0YXRlIiB9LAorCXsgUFhFTlZfU1RBVFVTX1VORElfVFJBTlNNSVRfRVJST1IsICJVTkRJIHRyYW5zbWl0IGVycm9yIiB9LAorCXsgUFhFTlZfU1RBVFVTX1VORElfSU5WQUxJRF9QQVJBTUVURVIsICJVTkRJIGludmFsaWQgcGFyYW1ldGVyIiB9LAorCXsgUFhFTlZfU1RBVFVTX0JTVFJBUF9QUk9NUFRfTUVOVSwgIkJvb3RzdHJhcCBwcm9tcHQgbWVudSIgfSwKKwl7IFBYRU5WX1NUQVRVU19CU1RSQVBfTUNBU1RfQUREUiwgIkJvb3RzdHJhcCBtY2FzdCBhZGRyIiB9LAorCXsgUFhFTlZfU1RBVFVTX0JTVFJBUF9NSVNTSU5HX0xJU1QsICJCb290c3RyYXAgbWlzc2luZyBsaXN0IiB9LAorCXsgUFhFTlZfU1RBVFVTX0JTVFJBUF9OT19SRVNQT05TRSwgIkJvb3RzdHJhcCBubyByZXNwb25zZSIgfSwKKwl7IFBYRU5WX1NUQVRVU19CU1RSQVBfRklMRV9UT09fQklHLCAiQm9vdHN0cmFwIGZpbGUgdG9vIGJpZyIgfSwKKwl7IFBYRU5WX1NUQVRVU19CSU5MX0NBTkNFTEVEX0JZX0tFWVNUUk9LRSwKKwkgICJCSU5MIGNhbmNlbGVkIGJ5IGtleXN0cm9rZSIgfSwKKwl7IFBYRU5WX1NUQVRVU19CSU5MX05PX1BYRV9TRVJWRVIsICJCSU5MIG5vIFBYRSBzZXJ2ZXIiIH0sCisJeyBQWEVOVl9TVEFUVVNfTk9UX0FWQUlMQUJMRV9JTl9QTU9ERSwKKwkgICJOb3QgYXZhaWxhYmxlIGluIHByb3RlY3RlZCBtb2RlIiB9LAorCXsgUFhFTlZfU1RBVFVTX05PVF9BVkFJTEFCTEVfSU5fUk1PREUsICJOb3QgYXZhaWxhYmxlIGluIHJlYWwgbW9kZSIgfSwKKwl7IFBYRU5WX1NUQVRVU19CVVNEX0RFVklDRV9OT1RfU1VQUE9SVEVELAorCSAgIkJVU0QgZGV2aWNlIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBQWEVOVl9TVEFUVVNfTE9BREVSX05PX0ZSRUVfQkFTRV9NRU1PUlksCisJICAiTG9hZGVyIG5vIGZyZWUgYmFzZSBtZW1vcnkiIH0sCisJeyBQWEVOVl9TVEFUVVNfTE9BREVSX05PX0JDX1JPTUlELCAiTG9hZGVyIG5vIEJhc2UgQ29kZSBST00gSUQiIH0sCisJeyBQWEVOVl9TVEFUVVNfTE9BREVSX0JBRF9CQ19ST01JRCwgIkxvYWRlciBiYWQgQmFzZSBDb2RlIFJPTSBJRCIgfSwKKwl7IFBYRU5WX1NUQVRVU19MT0FERVJfQkFEX0JDX1JVTlRJTUVfSU1BR0UsCisJICAiTG9hZGVyIGJhZCBCYXNlIENvZGUgcnVudGltZSBpbWFnZSIgfSwKKwl7IFBYRU5WX1NUQVRVU19MT0FERVJfTk9fVU5ESV9ST01JRCwgIkxvYWRlciBubyBVTkRJIFJPTSBJRCIgfSwKKwl7IFBYRU5WX1NUQVRVU19MT0FERVJfQkFEX1VORElfUk9NSUQsICJMb2FkZXIgYmFkIFVOREkgUk9NIElEIiB9LAorCXsgUFhFTlZfU1RBVFVTX0xPQURFUl9CQURfVU5ESV9EUklWRVJfSU1BR0UsCisJICAiTG9hZGVyIGJhZCBVTkRJIGRyaXZlciBpbWFnZSIgfSwKKwl7IFBYRU5WX1NUQVRVU19MT0FERVJfTk9fUFhFX1NUUlVDVCwgIkxvYWRlciBubyAhUFhFIHN0cnVjdCIgfSwKKwl7IFBYRU5WX1NUQVRVU19MT0FERVJfTk9fUFhFTlZfU1RSVUNULCAiTG9hZGVyIG5vIFBYRU5WKyBzdHJ1Y3QiIH0sCisJeyBQWEVOVl9TVEFUVVNfTE9BREVSX1VORElfU1RBUlQsICJMb2FkZXIgVU5ESSBzdGFydCIgfSwKKwl7IFBYRU5WX1NUQVRVU19MT0FERVJfQkNfU1RBUlQsICJMb2FkZXIgQmFzZSBDb2RlIHN0YXJ0IiB9LAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcHhlL3B4ZV9maWxlLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODMyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfZmlsZS5jCkBAIC0wLDAgKzEsMzA2IEBACisvKiogQGZpbGUKKyAqCisgKiBQWEUgRklMRSBBUEkKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvcG9zaXhfaW8uaD4KKyNpbmNsdWRlIDxncHhlL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cHhlLmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKiBQb3J0aW9ucyAoQykgMjAxMCBTaGFvIE1pbGxlciA8c2hhby5taWxsZXJAeXJkc2IuZWR1Lm9uLmNhPi4KKyAqICAgICAgICAgICAgICBbUFhFIGV4aXQgaG9vayBsb2dpY10KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitGRUFUVVJFICggRkVBVFVSRV9NSVNDLCAiUFhFWFQiLCBESENQX0VCX0ZFQVRVUkVfUFhFX0VYVCwgMiApOworCisvKioKKyAqIEZJTEUgT1BFTgorICoKKyAqIEB2IGZpbGVfb3BlbgkJCQlQb2ludGVyIHRvIGEgc3RydWN0IHNfUFhFTlZfRklMRV9PUEVOCisgKiBAdiBzX1BYRU5WX0ZJTEVfT1BFTjo6RmlsZU5hbWUJVVJMIG9mIGZpbGUgdG8gb3BlbgorICogQHJldCAjUFhFTlZfRVhJVF9TVUNDRVNTCQlGaWxlIHdhcyBvcGVuZWQKKyAqIEByZXQgI1BYRU5WX0VYSVRfRkFJTFVSRQkJRmlsZSB3YXMgbm90IG9wZW5lZAorICogQHJldCBzX1BYRU5WX0ZJTEVfT1BFTjo6U3RhdHVzCVBYRSBzdGF0dXMgY29kZQorICogQHJldCBzX1BYRU5WX0ZJTEVfT1BFTjo6RmlsZUhhbmRsZQlIYW5kbGUgb2Ygb3BlbmVkIGZpbGUKKyAqCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl9maWxlX29wZW4gKCBzdHJ1Y3Qgc19QWEVOVl9GSUxFX09QRU4gKmZpbGVfb3BlbiApIHsKKwl1c2VycHRyX3QgZmlsZW5hbWU7CisJc2l6ZV90IGZpbGVuYW1lX2xlbjsKKwlpbnQgZmQ7CisKKwlEQkcgKCAiUFhFTlZfRklMRV9PUEVOIiApOworCisJLyogQ29weSBuYW1lIGZyb20gZXh0ZXJuYWwgcHJvZ3JhbSwgYW5kIG9wZW4gaXQgKi8KKwlmaWxlbmFtZSA9IHJlYWxfdG9fdXNlciAoIGZpbGVfb3Blbi0+RmlsZU5hbWUuc2VnbWVudCwKKwkJCSAgICAgIGZpbGVfb3Blbi0+RmlsZU5hbWUub2Zmc2V0ICk7CisJZmlsZW5hbWVfbGVuID0gc3RybGVuX3VzZXIgKCBmaWxlbmFtZSwgMCApOworCXsKKwkJY2hhciB1cmlfc3RyaW5nWyBmaWxlbmFtZV9sZW4gKyAxIF07CisKKwkJY29weV9mcm9tX3VzZXIgKCB1cmlfc3RyaW5nLCBmaWxlbmFtZSwgMCwKKwkJCQkgc2l6ZW9mICggdXJpX3N0cmluZyApICk7CisJCURCRyAoICIgJXMiLCB1cmlfc3RyaW5nICk7CisJCWZkID0gb3BlbiAoIHVyaV9zdHJpbmcgKTsKKwl9CisKKwlpZiAoIGZkIDwgMCApIHsKKwkJZmlsZV9vcGVuLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVMgKCBmZCApOworCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCX0KKworCURCRyAoICIgYXMgZmlsZSAlZCIsIGZkICk7CisKKwlmaWxlX29wZW4tPkZpbGVIYW5kbGUgPSBmZDsKKwlmaWxlX29wZW4tPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CisKKy8qKgorICogRklMRSBDTE9TRQorICoKKyAqIEB2IGZpbGVfY2xvc2UJCQlQb2ludGVyIHRvIGEgc3RydWN0IHNfUFhFTlZfRklMRV9DTE9TRQorICogQHYgc19QWEVOVl9GSUxFX0NMT1NFOjpGaWxlSGFuZGxlCUZpbGUgaGFuZGxlCisgKiBAcmV0ICNQWEVOVl9FWElUX1NVQ0NFU1MJCUZpbGUgd2FzIGNsb3NlZAorICogQHJldCAjUFhFTlZfRVhJVF9GQUlMVVJFCQlGaWxlIHdhcyBub3QgY2xvc2VkCisgKiBAcmV0IHNfUFhFTlZfRklMRV9DTE9TRTo6U3RhdHVzCVBYRSBzdGF0dXMgY29kZQorICoKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X2ZpbGVfY2xvc2UgKCBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0NMT1NFICpmaWxlX2Nsb3NlICkgeworCisJREJHICggIlBYRU5WX0ZJTEVfQ0xPU0UgJWQiLCBmaWxlX2Nsb3NlLT5GaWxlSGFuZGxlICk7CisKKwljbG9zZSAoIGZpbGVfY2xvc2UtPkZpbGVIYW5kbGUgKTsKKwlmaWxlX2Nsb3NlLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKioKKyAqIEZJTEUgU0VMRUNUCisgKgorICogQHYgZmlsZV9zZWxlY3QJCQlQb2ludGVyIHRvIGEgc3RydWN0IHNfUFhFTlZfRklMRV9TRUxFQ1QKKyAqIEB2IHNfUFhFTlZfRklMRV9TRUxFQ1Q6OkZpbGVIYW5kbGUJRmlsZSBoYW5kbGUKKyAqIEByZXQgI1BYRU5WX0VYSVRfU1VDQ0VTUwkJRmlsZSBoYXMgYmVlbiBjaGVja2VkIGZvciByZWFkaW5lc3MKKyAqIEByZXQgI1BYRU5WX0VYSVRfRkFJTFVSRQkJRmlsZSBoYXMgbm90IGJlZW4gY2hlY2tlZCBmb3IgcmVhZGluZXNzCisgKiBAcmV0IHNfUFhFTlZfRklMRV9TRUxFQ1Q6OlN0YXR1cwlQWEUgc3RhdHVzIGNvZGUKKyAqIEByZXQgc19QWEVOVl9GSUxFX1NFTEVDVDo6UmVhZHkJSW5kaWNhdGlvbiBvZiByZWFkaW5lc3MKKyAqCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl9maWxlX3NlbGVjdCAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfU0VMRUNUICpmaWxlX3NlbGVjdCApIHsKKwlmZF9zZXQgZmRzZXQ7CisJaW50IHJlYWR5OworCisJREJHICggIlBYRU5WX0ZJTEVfU0VMRUNUICVkIiwgZmlsZV9zZWxlY3QtPkZpbGVIYW5kbGUgKTsKKworCUZEX1pFUk8gKCAmZmRzZXQgKTsKKwlGRF9TRVQgKCBmaWxlX3NlbGVjdC0+RmlsZUhhbmRsZSwgJmZkc2V0ICk7CisJaWYgKCAoIHJlYWR5ID0gc2VsZWN0ICggJmZkc2V0LCAwICkgKSA8IDAgKSB7CisJCWZpbGVfc2VsZWN0LT5TdGF0dXMgPSBQWEVOVl9TVEFUVVMgKCByZWFkeSApOworCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCX0KKworCWZpbGVfc2VsZWN0LT5SZWFkeSA9ICggcmVhZHkgPyBSRFlfUkVBRCA6IDAgKTsKKwlmaWxlX3NlbGVjdC0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyoqCisgKiBGSUxFIFJFQUQKKyAqCisgKiBAdiBmaWxlX3JlYWQJCQkJUG9pbnRlciB0byBhIHN0cnVjdCBzX1BYRU5WX0ZJTEVfUkVBRAorICogQHYgc19QWEVOVl9GSUxFX1JFQUQ6OkZpbGVIYW5kbGUJRmlsZSBoYW5kbGUKKyAqIEB2IHNfUFhFTlZfRklMRV9SRUFEOjpCdWZmZXJTaXplCVNpemUgb2YgZGF0YSBidWZmZXIKKyAqIEB2IHNfUFhFTlZfRklMRV9SRUFEOjpCdWZmZXIJCURhdGEgYnVmZmVyCisgKiBAcmV0ICNQWEVOVl9FWElUX1NVQ0NFU1MJCURhdGEgaGFzIGJlZW4gcmVhZCBmcm9tIGZpbGUKKyAqIEByZXQgI1BYRU5WX0VYSVRfRkFJTFVSRQkJRGF0YSBoYXMgbm90IGJlZW4gcmVhZCBmcm9tIGZpbGUKKyAqIEByZXQgc19QWEVOVl9GSUxFX1JFQUQ6OlN0YXR1cwlQWEUgc3RhdHVzIGNvZGUKKyAqIEByZXQgc19QWEVOVl9GSUxFX1JFQUQ6OlJlYWR5CUluZGljYXRpb24gb2YgcmVhZGluZXNzCisgKiBAcmV0IHNfUFhFTlZfRklMRV9SRUFEOjpCdWZmZXJTaXplCUxlbmd0aCBvZiBkYXRhIHJlYWQKKyAqCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl9maWxlX3JlYWQgKCBzdHJ1Y3Qgc19QWEVOVl9GSUxFX1JFQUQgKmZpbGVfcmVhZCApIHsKKwl1c2VycHRyX3QgYnVmZmVyOworCXNzaXplX3QgbGVuOworCisJREJHICggIlBYRU5WX0ZJTEVfUkVBRCAlZCB0byAlMDR4OiUwNHgrJTA0eCIsIGZpbGVfcmVhZC0+RmlsZUhhbmRsZSwKKwkgICAgICBmaWxlX3JlYWQtPkJ1ZmZlci5zZWdtZW50LCBmaWxlX3JlYWQtPkJ1ZmZlci5vZmZzZXQsCisJICAgICAgZmlsZV9yZWFkLT5CdWZmZXJTaXplICk7CisKKwlidWZmZXIgPSByZWFsX3RvX3VzZXIgKCBmaWxlX3JlYWQtPkJ1ZmZlci5zZWdtZW50LAorCQkJCWZpbGVfcmVhZC0+QnVmZmVyLm9mZnNldCApOworCWlmICggKCBsZW4gPSByZWFkX3VzZXIgKCBmaWxlX3JlYWQtPkZpbGVIYW5kbGUsIGJ1ZmZlciwgMCwKKwkJCQlmaWxlX3JlYWQtPkJ1ZmZlclNpemUgKSApIDwgMCApIHsKKwkJZmlsZV9yZWFkLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVMgKCBsZW4gKTsKKwkJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKKwl9CisKKwlEQkcgKCAiIHJlYWQgJTA0engiLCAoICggc2l6ZV90ICkgbGVuICkgKTsKKworCWZpbGVfcmVhZC0+QnVmZmVyU2l6ZSA9IGxlbjsKKwlmaWxlX3JlYWQtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CisKKy8qKgorICogR0VUIEZJTEUgU0laRQorICoKKyAqIEB2IGdldF9maWxlX3NpemUJCQlQb2ludGVyIHRvIGEgc3RydWN0IHNfUFhFTlZfR0VUX0ZJTEVfU0laRQorICogQHYgc19QWEVOVl9HRVRfRklMRV9TSVpFOjpGaWxlSGFuZGxlCUZpbGUgaGFuZGxlCisgKiBAcmV0ICNQWEVOVl9FWElUX1NVQ0NFU1MJCUZpbGUgc2l6ZSBoYXMgYmVlbiBkZXRlcm1pbmVkCisgKiBAcmV0ICNQWEVOVl9FWElUX0ZBSUxVUkUJCUZpbGUgc2l6ZSBoYXMgbm90IGJlZW4gZGV0ZXJtaW5lZAorICogQHJldCBzX1BYRU5WX0dFVF9GSUxFX1NJWkU6OlN0YXR1cwlQWEUgc3RhdHVzIGNvZGUKKyAqIEByZXQgc19QWEVOVl9HRVRfRklMRV9TSVpFOjpGaWxlU2l6ZQlTaXplIG9mIGZpbGUKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X2dldF9maWxlX3NpemUgKCBzdHJ1Y3Qgc19QWEVOVl9HRVRfRklMRV9TSVpFCisJCQkJICAgKmdldF9maWxlX3NpemUgKSB7CisJc3NpemVfdCBmaWxlc2l6ZTsKKworCURCRyAoICJQWEVOVl9HRVRfRklMRV9TSVpFICVkIiwgZ2V0X2ZpbGVfc2l6ZS0+RmlsZUhhbmRsZSApOworCisJZmlsZXNpemUgPSBmc2l6ZSAoIGdldF9maWxlX3NpemUtPkZpbGVIYW5kbGUgKTsKKwlpZiAoIGZpbGVzaXplIDwgMCApIHsKKwkJZ2V0X2ZpbGVfc2l6ZS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTICggZmlsZXNpemUgKTsKKwkJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKKwl9CisKKwlEQkcgKCAiIGlzICV6ZCIsICggKCBzaXplX3QgKSBmaWxlc2l6ZSApICk7CisKKwlnZXRfZmlsZV9zaXplLT5GaWxlU2l6ZSA9IGZpbGVzaXplOworCWdldF9maWxlX3NpemUtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CisKKy8qKgorICogRklMRSBFWEVDCisgKgorICogQHYgZmlsZV9leGVjCQkJCVBvaW50ZXIgdG8gYSBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0VYRUMKKyAqIEB2IHNfUFhFTlZfRklMRV9FWEVDOjpDb21tYW5kCUNvbW1hbmQgdG8gZXhlY3V0ZQorICogQHJldCAjUFhFTlZfRVhJVF9TVUNDRVNTCQlDb21tYW5kIHdhcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkKKyAqIEByZXQgI1BYRU5WX0VYSVRfRkFJTFVSRQkJQ29tbWFuZCB3YXMgbm90IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseQorICogQHJldCBzX1BYRU5WX0ZJTEVfRVhFQzo6U3RhdHVzCVBYRSBzdGF0dXMgY29kZQorICoKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X2ZpbGVfZXhlYyAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfRVhFQyAqZmlsZV9leGVjICkgeworCXVzZXJwdHJfdCBjb21tYW5kOworCXNpemVfdCBjb21tYW5kX2xlbjsKKwlpbnQgcmM7CisKKwlEQkcgKCAiUFhFTlZfRklMRV9FWEVDIiApOworCisJLyogQ29weSBuYW1lIGZyb20gZXh0ZXJuYWwgcHJvZ3JhbSwgYW5kIGV4ZWMgaXQgKi8KKwljb21tYW5kID0gcmVhbF90b191c2VyICggZmlsZV9leGVjLT5Db21tYW5kLnNlZ21lbnQsCisJCQkJIGZpbGVfZXhlYy0+Q29tbWFuZC5vZmZzZXQgKTsKKwljb21tYW5kX2xlbiA9IHN0cmxlbl91c2VyICggY29tbWFuZCwgMCApOworCXsKKwkJY2hhciBjb21tYW5kX3N0cmluZ1sgY29tbWFuZF9sZW4gKyAxIF07CisKKwkJY29weV9mcm9tX3VzZXIgKCBjb21tYW5kX3N0cmluZywgY29tbWFuZCwgMCwKKwkJCQkgc2l6ZW9mICggY29tbWFuZF9zdHJpbmcgKSApOworCQlEQkcgKCAiICVzIiwgY29tbWFuZF9zdHJpbmcgKTsKKworCQlpZiAoICggcmMgPSBzeXN0ZW0gKCBjb21tYW5kX3N0cmluZyApICkgIT0gMCApIHsKKwkJCWZpbGVfZXhlYy0+U3RhdHVzID0gUFhFTlZfU1RBVFVTICggcmMgKTsKKwkJCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7CisJCX0KKwl9CisKKwlmaWxlX2V4ZWMtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CisKK3NlZ29mZl90IF9fZGF0YTE2ICggcHhlX2V4aXRfaG9vayApID0geyAwLCAwIH07CisjZGVmaW5lIHB4ZV9leGl0X2hvb2sgX191c2VfZGF0YTE2ICggcHhlX2V4aXRfaG9vayApCisKKy8qKgorICogRklMRSBBUEkgQ0hFQ0sKKyAqCisgKiBAdiBmaWxlX2V4ZWMJCQkJUG9pbnRlciB0byBhIHN0cnVjdCBzX1BYRU5WX0ZJTEVfQVBJX0NIRUNLCisgKiBAdiBzX1BYRU5WX0ZJTEVfQVBJX0NIRUNLOjpNYWdpYyAgICAgSW5ib3VuZCBtYWdpYyBudW1iZXIgKDB4OTFkNDQ3YjIpCisgKiBAcmV0ICNQWEVOVl9FWElUX1NVQ0NFU1MJCUNvbW1hbmQgd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseQorICogQHJldCAjUFhFTlZfRVhJVF9GQUlMVVJFCQlDb21tYW5kIHdhcyBub3QgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5CisgKiBAcmV0IHNfUFhFTlZfRklMRV9BUElfQ0hFQ0s6OlN0YXR1cwlQWEUgc3RhdHVzIGNvZGUKKyAqIEByZXQgc19QWEVOVl9GSUxFX0FQSV9DSEVDSzo6TWFnaWMJT3V0Ym91bmQgbWFnaWMgbnVtYmVyICgweGU5YzE3YjIwKQorICogQHJldCBzX1BYRU5WX0ZJTEVfQVBJX0NIRUNLOjpQcm92aWRlciAiZ1BYRSIgKDB4NDU1ODUwNjcpCisgKiBAcmV0IHNfUFhFTlZfRklMRV9BUElfQ0hFQ0s6OkFQSU1hc2sgQVBJIGZ1bmN0aW9uIGJpdG1hc2sKKyAqIEByZXQgc19QWEVOVl9GSUxFX0FQSV9DSEVDSzo6RmxhZ3MJUmVzZXJ2ZWQKKyAqCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl9maWxlX2FwaV9jaGVjayAoIHN0cnVjdCBzX1BYRU5WX0ZJTEVfQVBJX0NIRUNLICpmaWxlX2FwaV9jaGVjayApIHsKKwlEQkcgKCAiUFhFTlZfRklMRV9BUElfQ0hFQ0siICk7CisKKwlpZiAoIGZpbGVfYXBpX2NoZWNrLT5NYWdpYyAhPSAweDkxZDQ0N2IyICkgeworCQlmaWxlX2FwaV9jaGVjay0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX0JBRF9GVU5DOworCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCX0gZWxzZSBpZiAoIGZpbGVfYXBpX2NoZWNrLT5TaXplIDwKKwkJICAgIHNpemVvZihzdHJ1Y3Qgc19QWEVOVl9GSUxFX0FQSV9DSEVDSykgKSB7CisJCWZpbGVfYXBpX2NoZWNrLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfT1VUX09GX1JFU09VUkNFUzsKKwkJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKKwl9IGVsc2UgeworCQlmaWxlX2FwaV9jaGVjay0+U3RhdHVzICAgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwkJZmlsZV9hcGlfY2hlY2stPlNpemUgICAgID0gc2l6ZW9mKHN0cnVjdCBzX1BYRU5WX0ZJTEVfQVBJX0NIRUNLKTsKKwkJZmlsZV9hcGlfY2hlY2stPk1hZ2ljICAgID0gMHhlOWMxN2IyMDsKKwkJZmlsZV9hcGlfY2hlY2stPlByb3ZpZGVyID0gMHg0NTU4NTA2NzsgLyogImdQWEUiICovCisJCWZpbGVfYXBpX2NoZWNrLT5BUElNYXNrICA9IDB4MDAwMDAwN2Y7IC8qIEZ1bmN0aW9ucyBlMC1lNiAqLworCQkvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIFBYRSBleGl0IGhvb2sgKi8KKwkJaWYgKCBweGVfZXhpdF9ob29rLnNlZ21lbnQgfCBweGVfZXhpdF9ob29rLm9mZnNldCApCisJCQkvKiBGdW5jdGlvbiBlNywgYWxzbyAqLworCQkJZmlsZV9hcGlfY2hlY2stPkFQSU1hc2sgfD0gMHgwMDAwMDA4MDsKKwkJZmlsZV9hcGlfY2hlY2stPkZsYWdzICAgID0gMDsJICAgICAgIC8qIE5vbmUgZGVmaW5lZCAqLworCQlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworCX0KK30KKworLyoqCisgKiBGSUxFIEVYSVQgSE9PSworICoKKyAqIEB2IGZpbGVfZXhpdF9ob29rCQkJUG9pbnRlciB0byBhIHN0cnVjdAorICoJCQkJCXNfUFhFTlZfRklMRV9FWElUX0hPT0sKKyAqIEB2IHNfUFhFTlZfRklMRV9FWElUX0hPT0s6Okhvb2sJU0VHMTY6T0ZGMTYgdG8ganVtcCB0bworICogQHJldCAjUFhFTlZfRVhJVF9TVUNDRVNTCQlTdWNjZXNzZnVsbHkgc2V0IGhvb2sKKyAqIEByZXQgI1BYRU5WX0VYSVRfRkFJTFVSRQkJV2UncmUgbm90IGFuIE5CUCBidWlsZAorICogQHJldCBzX1BYRU5WX0ZJTEVfRVhJVF9IT09LOjpTdGF0dXMJUFhFIHN0YXR1cyBjb2RlCisgKgorICovCitQWEVOVl9FWElUX3QgcHhlbnZfZmlsZV9leGl0X2hvb2sgKCBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0VYSVRfSE9PSworCQkJCQkqZmlsZV9leGl0X2hvb2sgKSB7CisJREJHICggIlBYRU5WX0ZJTEVfRVhJVF9IT09LIiApOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBQWEUgZXhpdCBob29rICovCisJaWYgKCBweGVfZXhpdF9ob29rLnNlZ21lbnQgfCBweGVfZXhpdF9ob29rLm9mZnNldCApIHsKKwkJLyogV2UnbGwganVtcCB0byB0aGUgc3BlY2lmaWVkIFNFRzE2Ok9GRjE2IGR1cmluZyBleGl0ICovCisJCXB4ZV9leGl0X2hvb2suc2VnbWVudCA9IGZpbGVfZXhpdF9ob29rLT5Ib29rLnNlZ21lbnQ7CisJCXB4ZV9leGl0X2hvb2sub2Zmc2V0ID0gZmlsZV9leGl0X2hvb2stPkhvb2sub2Zmc2V0OworCQlmaWxlX2V4aXRfaG9vay0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7CisJfQorCisJREJHICggIiBub3QgTkJQIiApOworCWZpbGVfZXhpdF9ob29rLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfVU5TVVBQT1JURUQ7CisJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKK30KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGUvcHhlX2xvYWRlci5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGUvcHhlX2xvYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNWNhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfbG9hZGVyLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorI2luY2x1ZGUgInB4ZS5oIgorI2luY2x1ZGUgInB4ZV9jYWxsLmgiCisKKy8qKiBAZmlsZQorICoKKyAqIFBYRSBVTkRJIGxvYWRlcgorICoKKyAqLworCisvKiBQWEVOVl9VTkRJX0xPQURFUgorICoKKyAqLworUFhFTlZfRVhJVF90IHVuZGlfbG9hZGVyICggc3RydWN0IHNfVU5ESV9MT0FERVIgKnVuZGlfbG9hZGVyICkgeworCisJLyogUGVyZm9ybSBvbmUtdGltZSBpbml0aWFsaXNhdGlvbiAoZS5nLiBoZWFwKSAqLworCWluaXRpYWxpc2UoKTsKKworCURCRyAoICJbUFhFTlZfVU5ESV9MT0FERVIgdG8gQ1MgJTA0eCBEUyAlMDR4XSIsCisJICAgICAgdW5kaV9sb2FkZXItPlVORElfQ1MsIHVuZGlfbG9hZGVyLT5VTkRJX0RTICk7CisKKwkvKiBGaWxsIGluIFVOREkgbG9hZGVyIHN0cnVjdHVyZSAqLworCXVuZGlfbG9hZGVyLT5QWEVwdHIuc2VnbWVudCA9IHJtX2NzOworCXVuZGlfbG9hZGVyLT5QWEVwdHIub2Zmc2V0ID0gX19mcm9tX3RleHQxNiAoICZwcHhlICk7CisJdW5kaV9sb2FkZXItPlBYRU5WcHRyLnNlZ21lbnQgPSBybV9jczsKKwl1bmRpX2xvYWRlci0+UFhFTlZwdHIub2Zmc2V0ID0gX19mcm9tX3RleHQxNiAoICZweGVudiApOworCisJdW5kaV9sb2FkZXItPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfcHJlYm9vdC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGUvcHhlX3ByZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTM5YzdiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGUvcHhlX3ByZWJvb3QuYwpAQCAtMCwwICsxLDM1NyBAQAorLyoqIEBmaWxlCisgKgorICogUFhFIFByZWJvb3QgQVBJCisgKgorICovCisKKy8qIFBYRSBBUEkgaW50ZXJmYWNlIGZvciBFdGhlcmJvb3QuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z3B4ZS91YWNjZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9kaGNwLmg+CisjaW5jbHVkZSA8Z3B4ZS9mYWtlZGhjcC5oPgorI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2lzYXBucC5oPgorI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxiYXNlbWVtX3BhY2tldC5oPgorI2luY2x1ZGUgPGJpb3NpbnQuaD4KKyNpbmNsdWRlICJweGUuaCIKKyNpbmNsdWRlICJweGVfY2FsbC5oIgorCisvKiBBdm9pZCBkcmFnZ2luZyBpbiBpc2FwbnAubyB1bm5lY2Vzc2FyaWx5ICovCit1aW50MTZfdCBpc2FwbnBfcmVhZF9wb3J0OworCisvKiogWmVyby1iYXNlZCB2ZXJzaW9ucyBvZiBQWEVOVl9HRVRfQ0FDSEVEX0lORk86OlBhY2tldFR5cGUgKi8KK2VudW0gcHhlX2NhY2hlZF9pbmZvX2luZGljZXMgeworCUNBQ0hFRF9JTkZPX0RIQ1BESVNDT1ZFUiA9ICggUFhFTlZfUEFDS0VUX1RZUEVfREhDUF9ESVNDT1ZFUiAtIDEgKSwKKwlDQUNIRURfSU5GT19ESENQQUNLID0gKCBQWEVOVl9QQUNLRVRfVFlQRV9ESENQX0FDSyAtIDEgKSwKKwlDQUNIRURfSU5GT19CSU5MID0gKCBQWEVOVl9QQUNLRVRfVFlQRV9DQUNIRURfUkVQTFkgLSAxICksCisJTlVNX0NBQ0hFRF9JTkZPUworfTsKKworLyoqIEEgY2FjaGVkIERIQ1AgcGFja2V0ICovCit1bmlvbiBweGVfY2FjaGVkX2luZm8geworCXN0cnVjdCBkaGNwaGRyIGRoY3BoZHI7CisJLyogVGhpcyBidWZmZXIgbXVzdCBiZSAqZXhhY3RseSogdGhlIHNpemUgb2YgYSBCT09UUExBWUVSX3QKKwkgKiBzdHJ1Y3R1cmUsIG90aGVyd2lzZSBXaW5QRSB3aWxsIGRpZSBob3JyaWJseS4gIEl0IHRha2VzIHRoZQorCSAqIHNpemUgb2YgKm91ciogYnVmZmVyIGFuZCBmZWVkcyBpdCBpbiB0byB1cyBhcyB0aGUgc2l6ZSBvZgorCSAqIG9uZSBvZiAqaXRzKiBidWZmZXJzLiAgSWYgb3VyIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiBpdAorCSAqIGV4cGVjdHMsIHdlIHRoZXJlZm9yZSBlbmQgdXAgb3ZlcndyaXRpbmcgcGFydCBvZiBpdHMgZGF0YQorCSAqIHNlZ21lbnQsIHNpbmNlIGl0IHRlbGxzIHVzIHRvIGRvIHNvLiAgKEQnb2ghKQorCSAqCisJICogTm90ZSB0aGF0IGEgQk9PVFBMQVlFUl90IGlzIG5vdCBuZWNlc3NhcmlseSBsYXJnZSBlbm91Z2ggdG8KKwkgKiBob2xkIGEgREhDUCBwYWNrZXQ7IHRoaXMgaXMgYSBmbGF3IGluIHRoZSBQWEUgc3BlYy4KKwkgKi8KKwlCT09UUExBWUVSX3QgcGFja2V0OworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgUFhFIERIQ1AgcGFja2V0IGNyZWF0b3IgKi8KK3N0cnVjdCBweGVfZGhjcF9wYWNrZXRfY3JlYXRvciB7CisJLyoqIENyZWF0ZSBESENQIHBhY2tldAorCSAqCisJICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorCSAqIEB2IGRhdGEJCUJ1ZmZlciBmb3IgREhDUCBwYWNrZXQKKwkgKiBAdiBtYXhfbGVuCQlTaXplIG9mIERIQ1AgcGFja2V0IGJ1ZmZlcgorCSAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorCSAqLworCWludCAoICogY3JlYXRlICkgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpkYXRhLAorCQkJICAgc2l6ZV90IG1heF9sZW4gKTsKK307CisKKy8qKiBQWEUgREhDUCBwYWNrZXQgY3JlYXRvcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgcHhlX2RoY3BfcGFja2V0X2NyZWF0b3IgcHhlX2RoY3BfcGFja2V0X2NyZWF0b3JzW10gPSB7CisJW0NBQ0hFRF9JTkZPX0RIQ1BESVNDT1ZFUl0gPSB7IGNyZWF0ZV9mYWtlZGhjcGRpc2NvdmVyIH0sCisJW0NBQ0hFRF9JTkZPX0RIQ1BBQ0tdID0geyBjcmVhdGVfZmFrZWRoY3BhY2sgfSwKKwlbQ0FDSEVEX0lORk9fQklOTF0gPSB7IGNyZWF0ZV9mYWtlcHhlYnNhY2sgfSwKK307CisKKy8qIFRoZSBjYXNlIGluIHdoaWNoIHRoZSBjYWxsZXIgZG9lc24ndCBzdXBwbHkgYSBidWZmZXIgaXMgcmVhbGx5CisgKiBhd2t3YXJkIHRvIHN1cHBvcnQgZ2l2ZW4gdGhhdCB3ZSBoYXZlIG11bHRpcGxlIHNvdXJjZXMgb2Ygb3B0aW9ucywKKyAqIGFuZCB0aGF0IHdlIGRvbid0IGFjdHVhbGx5IHN0b3JlIHRoZSBESENQIHBhY2tldHMuICAoV2UgbWF5IG5vdAorICogZXZlbiBoYXZlIHBlcmZvcm1lZCBESENQOyB3ZSBtYXkgaGF2ZSBvYnRhaW5lZCBhbGwgY29uZmlndXJhdGlvbgorICogZnJvbSBub24tdm9sYXRpbGUgc3RvcmVkIG9wdGlvbnMgb3IgZnJvbSB0aGUgY29tbWFuZCBsaW5lLikKKyAqCisgKiBTb21lIE5CUHMgcmVseSBvbiB0aGUgYnVmZmVycyB3ZSBwcm92aWRlIGJlaW5nIHBlcnNpc3RlbnQsIHNvIHdlCisgKiBjYW4ndCBqdXN0IHVzZSB0aGUgdGVtcG9yYXJ5IHBhY2tldCBidWZmZXIuICA0LjVrQiBvZiBiYXNlIG1lbW9yeQorICogYWx3YXlzIHdhc3RlZCBqdXN0IGJlY2F1c2Ugc29tZSBjbGllbnRzIGFyZSB0b28gbGF6eSB0byBwcm92aWRlCisgKiB0aGVpciBvd24gYnVmZmVycy4uLgorICovCitzdGF0aWMgdW5pb24gcHhlX2NhY2hlZF9pbmZvIF9fYnNzMTZfYXJyYXkgKCBjYWNoZWRfaW5mbywgW05VTV9DQUNIRURfSU5GT1NdICk7CisjZGVmaW5lIGNhY2hlZF9pbmZvIF9fdXNlX2RhdGExNiAoIGNhY2hlZF9pbmZvICkKKworLyoqCisgKiBTZXQgUFhFIGNhY2hlZCBURlRQIGZpbGVuYW1lCisgKgorICogQHYgZmlsZW5hbWUJCVRGVFAgZmlsZW5hbWUKKyAqCisgKiBUaGlzIGlzIGEgYnVnLWZvci1idWcgY29tcGF0aWJpbGl0eSBoYWNrIG5lZWRlZCBpbiBvcmRlciB0byB3b3JrCisgKiB3aXRoIE1pY3Jvc29mdCBSZW1vdGUgSW5zdGFsbGF0aW9uIFNlcnZpY2VzIChSSVMpLiAgVGhlIGZpbGVuYW1lCisgKiB1c2VkIGluIGEgY2FsbCB0byBQWEVOVl9SRVNUQVJUX1RGVFAgb3IgUFhFTlZfVEZUUF9SRUFEX0ZJTEUgbXVzdAorICogYmUgcmV0dXJuZWQgYXMgdGhlIERIQ1AgZmlsZW5hbWUgaW4gc3Vic2VxdWVudCBjYWxscyB0bworICogUFhFTlZfR0VUX0NBQ0hFRF9JTkZPLgorICovCit2b2lkIHB4ZV9zZXRfY2FjaGVkX2ZpbGVuYW1lICggY29uc3QgdW5zaWduZWQgY2hhciAqZmlsZW5hbWUgKSB7CisJbWVtY3B5ICggY2FjaGVkX2luZm9bQ0FDSEVEX0lORk9fREhDUEFDS10uZGhjcGhkci5maWxlLCBmaWxlbmFtZSwKKwkJIHNpemVvZiAoIGNhY2hlZF9pbmZvW0NBQ0hFRF9JTkZPX0RIQ1BBQ0tdLmRoY3BoZHIuZmlsZSApICk7CisJbWVtY3B5ICggY2FjaGVkX2luZm9bQ0FDSEVEX0lORk9fQklOTF0uZGhjcGhkci5maWxlLCBmaWxlbmFtZSwKKwkJIHNpemVvZiAoIGNhY2hlZF9pbmZvW0NBQ0hFRF9JTkZPX0JJTkxdLmRoY3BoZHIuZmlsZSApICk7Cit9CisKKy8qKgorICogVU5MT0FEIEJBU0UgQ09ERSBTVEFDSworICoKKyAqIEB2IE5vbmUJCQkJLQorICogQHJldCAuLi4KKyAqCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91bmxvYWRfc3RhY2sgKCBzdHJ1Y3Qgc19QWEVOVl9VTkxPQURfU1RBQ0sgKnVubG9hZF9zdGFjayApIHsKKwlEQkcgKCAiUFhFTlZfVU5MT0FEX1NUQUNLIiApOworCisJdW5sb2FkX3N0YWNrLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKiBQWEVOVl9HRVRfQ0FDSEVEX0lORk8KKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X2dldF9jYWNoZWRfaW5mbyAoIHN0cnVjdCBzX1BYRU5WX0dFVF9DQUNIRURfSU5GTworCQkJCSAgICAgKmdldF9jYWNoZWRfaW5mbyApIHsKKwlzdHJ1Y3QgcHhlX2RoY3BfcGFja2V0X2NyZWF0b3IgKmNyZWF0b3I7CisJdW5pb24gcHhlX2NhY2hlZF9pbmZvICppbmZvOworCXVuc2lnbmVkIGludCBpZHg7CisJc2l6ZV90IGxlbjsKKwl1c2VycHRyX3QgYnVmZmVyOworCWludCByYzsKKworCURCRyAoICJQWEVOVl9HRVRfQ0FDSEVEX0lORk8gJWQiLCBnZXRfY2FjaGVkX2luZm8tPlBhY2tldFR5cGUgKTsKKworCURCRyAoICIgdG8gJTA0eDolMDR4KyV4IiwgZ2V0X2NhY2hlZF9pbmZvLT5CdWZmZXIuc2VnbWVudCwKKwkgICAgICBnZXRfY2FjaGVkX2luZm8tPkJ1ZmZlci5vZmZzZXQsIGdldF9jYWNoZWRfaW5mby0+QnVmZmVyU2l6ZSApOworCisJLyogU2FuaXR5IGNoZWNrICovCisgICAgICAgIGlkeCA9ICggZ2V0X2NhY2hlZF9pbmZvLT5QYWNrZXRUeXBlIC0gMSApOworCWlmICggaWR4ID49IE5VTV9DQUNIRURfSU5GT1MgKSB7CisJCURCRyAoICIgYmFkIFBhY2tldFR5cGUiICk7CisJCWdvdG8gZXJyOworCX0KKwlpbmZvID0gJmNhY2hlZF9pbmZvW2lkeF07CisKKwkvKiBDb25zdHJ1Y3QgY2FjaGVkIHZlcnNpb24gb2YgcGFja2V0LCBpZiBub3QgYWxyZWFkeSBjb25zdHJ1Y3RlZC4gKi8KKwlpZiAoICEgaW5mby0+ZGhjcGhkci5vcCApIHsKKwkJLyogQ29uc3RydWN0IERIQ1AgcGFja2V0ICovCisJCWNyZWF0b3IgPSAmcHhlX2RoY3BfcGFja2V0X2NyZWF0b3JzW2lkeF07CisJCWlmICggKCByYyA9IGNyZWF0b3ItPmNyZWF0ZSAoIHB4ZV9uZXRkZXYsIGluZm8sCisJCQkJCSAgICAgIHNpemVvZiAoICppbmZvICkgKSApICE9IDAgKSB7CisJCQlEQkcgKCAiIGZhaWxlZCB0byBidWlsZCBwYWNrZXQiICk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCWxlbiA9IGdldF9jYWNoZWRfaW5mby0+QnVmZmVyU2l6ZTsKKwlpZiAoIGxlbiA9PSAwICkgeworCQkvKiBQb2ludCBjbGllbnQgYXQgb3VyIGNhY2hlZCBidWZmZXIuCisJCSAqCisJCSAqIFRvIGFkZCB0byB0aGUgZnVuLCBJbnRlbCBkZWNpZGVkIGF0IHNvbWUgcG9pbnQgaW4KKwkJICogdGhlIGV2b2x1dGlvbiBvZiB0aGUgUFhFIHNwZWNpZmljYXRpb24gdG8gYWRkIHRoZQorCQkgKiBCdWZmZXJMaW1pdCBmaWVsZCwgd2hpY2ggd2UgYXJlIG1lYW50IHRvIGZpbGwgaW4KKwkJICogd2l0aCB0aGUgbGVuZ3RoIG9mIG91ciBwYWNrZXQgYnVmZmVyLCBzbyB0aGF0IHRoZQorCQkgKiBjYWxsZXIgY2FuIHNhZmVseSBtb2RpZnkgdGhlIGJvb3Qgc2VydmVyIHJlcGx5CisJCSAqIHBhY2tldCBzdG9yZWQgdGhlcmVpbi4gIEhvd2V2ZXIsIHRoaXMgZmllbGQgd2FzIG5vdAorCQkgKiBwcmVzZW50IGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIFBYRSBzcGVjLCBhbmQKKwkJICogdGhlcmUgaXMgYXQgbGVhc3Qgb25lIFBYRSBOQlAgKEFsdGlyaXMpIHdoaWNoCisJCSAqIGFsbG9jYXRlcyBvbmx5IGV4YWN0bHkgZW5vdWdoIHNwYWNlIGZvciB0aGlzCisJCSAqIGVhcmxpZXIsIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlLiAgSWYgd2UKKwkJICogYWN0dWFsbHkgZmlsbCBpbiB0aGUgQnVmZmVyTGltaXQgZmllbGQsIHdlCisJCSAqIHRoZXJlZm9yZSByaXNrIHRyYXNoaW5nIHJhbmRvbSBhcmVhcyBvZiB0aGUKKwkJICogY2FsbGVyJ3MgbWVtb3J5LiAgSWYgd2UgKmRvbid0KiBmaWxsIGl0IGluLCB0aGVuCisJCSAqIHRoZSBjYWxsZXIgaXMgYXQgbGliZXJ0eSB0byBhc3N1bWUgdGhhdCB3aGF0ZXZlcgorCQkgKiByYW5kb20gdmFsdWUgaGFwcGVuZWQgdG8gYmUgaW4gdGhhdCBsb2NhdGlvbgorCQkgKiByZXByZXNlbnRzIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB3ZSd2ZSBqdXN0CisJCSAqIHBhc3NlZCBiYWNrIHRvIGl0LgorCQkgKgorCQkgKiBTaW5jZSBvbGRlciBQWEUgc3RhY2tzIHdvbid0IGZpbGwgdGhpcyBmaWVsZCBpbgorCQkgKiBhbnl3YXksIGl0J3MgcHJvYmFibHkgc2FmZSB0byBhc3N1bWUgdGhhdCBubworCQkgKiBjYWxsZXJzIGFjdHVhbGx5IHJlbHkgb24gaXQsIHNvIHdlIGNob29zZSB0byBub3QKKwkJICogZmlsbCBpdCBpbi4KKwkJICovCisJCWdldF9jYWNoZWRfaW5mby0+QnVmZmVyLnNlZ21lbnQgPSBybV9kczsKKwkJZ2V0X2NhY2hlZF9pbmZvLT5CdWZmZXIub2Zmc2V0ID0gX19mcm9tX2RhdGExNiAoIGluZm8gKTsKKwkJZ2V0X2NhY2hlZF9pbmZvLT5CdWZmZXJTaXplID0gc2l6ZW9mICggKmluZm8gKTsKKwkJREJHICggIiByZXR1cm5pbmcgJTA0eDolMDR4KyUwNHhbJyV4J10iLAorCQkgICAgICBnZXRfY2FjaGVkX2luZm8tPkJ1ZmZlci5zZWdtZW50LAorCQkgICAgICBnZXRfY2FjaGVkX2luZm8tPkJ1ZmZlci5vZmZzZXQsCisJCSAgICAgIGdldF9jYWNoZWRfaW5mby0+QnVmZmVyU2l6ZSwKKwkJICAgICAgZ2V0X2NhY2hlZF9pbmZvLT5CdWZmZXJMaW1pdCApOworCX0gZWxzZSB7CisJCS8qIENvcHkgcGFja2V0IHRvIGNsaWVudCBidWZmZXIgKi8KKwkJaWYgKCBsZW4gPiBzaXplb2YgKCAqaW5mbyApICkKKwkJCWxlbiA9IHNpemVvZiAoICppbmZvICk7CisJCWlmICggbGVuIDwgc2l6ZW9mICggKmluZm8gKSApCisJCQlEQkcgKCAiIGJ1ZmZlciBtYXkgYmUgdG9vIHNob3J0IiApOworCQlidWZmZXIgPSByZWFsX3RvX3VzZXIgKCBnZXRfY2FjaGVkX2luZm8tPkJ1ZmZlci5zZWdtZW50LAorCQkJCQlnZXRfY2FjaGVkX2luZm8tPkJ1ZmZlci5vZmZzZXQgKTsKKwkJY29weV90b191c2VyICggYnVmZmVyLCAwLCBpbmZvLCBsZW4gKTsKKwkJZ2V0X2NhY2hlZF9pbmZvLT5CdWZmZXJTaXplID0gbGVuOworCX0KKworCWdldF9jYWNoZWRfaW5mby0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKKworIGVycjoKKwlnZXRfY2FjaGVkX2luZm8tPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19PVVRfT0ZfUkVTT1VSQ0VTOworCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7Cit9CisKKy8qIFBYRU5WX1JFU1RBUlRfVEZUUAorICoKKyAqIFN0YXR1czogd29ya2luZworICovCitQWEVOVl9FWElUX3QgcHhlbnZfcmVzdGFydF90ZnRwICggc3RydWN0IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEUKKwkJCQkgICpyZXN0YXJ0X3RmdHAgKSB7CisJUFhFTlZfRVhJVF90IHRmdHBfZXhpdDsKKworCURCRyAoICJQWEVOVl9SRVNUQVJUX1RGVFAgIiApOworCisJLyogSW50ZWwgYnVnLWZvci1idWcgaGFjayAqLworCXB4ZV9zZXRfY2FjaGVkX2ZpbGVuYW1lICggcmVzdGFydF90ZnRwLT5GaWxlTmFtZSApOworCisJLyogV29yZHMgY2Fubm90IGRlc2NyaWJlIHRoZSBjb21wbGV0ZSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSBQWEUKKwkgKiBzcGVjaWZpY2F0aW9uIGFuZCBhbnkgcG9zc2libGUgdmVyc2lvbiBvZiByZWFsaXR5Li4uCisJICovCisJcmVzdGFydF90ZnRwLT5CdWZmZXIgPSBQWEVfTE9BRF9QSFlTOyAvKiBGaXhlZCBieSBzcGVjLCBhcHBhcmVudGx5ICovCisJcmVzdGFydF90ZnRwLT5CdWZmZXJTaXplID0gKCAweGEwMDAwIC0gUFhFX0xPQURfUEhZUyApOyAvKiBOZWFyIGVub3VnaCAqLworCXRmdHBfZXhpdCA9IHB4ZW52X3RmdHBfcmVhZF9maWxlICggcmVzdGFydF90ZnRwICk7CisJaWYgKCB0ZnRwX2V4aXQgIT0gUFhFTlZfRVhJVF9TVUNDRVNTICkKKwkJcmV0dXJuIHRmdHBfZXhpdDsKKworCS8qIEZpcmUgdXAgdGhlIG5ldyBOQlAgKi8KKwlyZXN0YXJ0X3RmdHAtPlN0YXR1cyA9IHB4ZV9zdGFydF9uYnAoKTsKKworCS8qIE5vdCBzdXJlIHdoYXQgIlNVQ0NFU1MiIGFjdHVhbGx5IG1lYW5zLCBzaW5jZSB3ZSBjYW4gb25seQorCSAqIHJldHVybiBpZiB0aGUgbmV3IE5CUCBmYWlsZWQgdG8gYm9vdC4uLgorCSAqLworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CisKKy8qIFBYRU5WX1NUQVJUX1VOREkKKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3N0YXJ0X3VuZGkgKCBzdHJ1Y3Qgc19QWEVOVl9TVEFSVF9VTkRJICpzdGFydF91bmRpICkgeworCXVuc2lnbmVkIGludCBidXNfdHlwZTsKKwl1bnNpZ25lZCBpbnQgbG9jYXRpb247CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCURCRyAoICJQWEVOVl9TVEFSVF9VTkRJICUwNHg6JTA0eDolMDR4IiwKKwkgICAgICBzdGFydF91bmRpLT5BWCwgc3RhcnRfdW5kaS0+QlgsIHN0YXJ0X3VuZGktPkRYICk7CisKKwkvKiBEZXRlcm1pbmUgYnVzIHR5cGUgYW5kIGxvY2F0aW9uLiAgVXNlIGEgaGV1cmlzdGljIHRvIGRlY2lkZQorCSAqIHdoZXRoZXIgd2UgYXJlIFBDSSBvciBJU0FQblAKKwkgKi8KKwlpZiAoICggc3RhcnRfdW5kaS0+RFggPj0gSVNBUE5QX1JFQURfUE9SVF9NSU4gKSAmJgorCSAgICAgKCBzdGFydF91bmRpLT5EWCA8PSBJU0FQTlBfUkVBRF9QT1JUX01BWCApICYmCisJICAgICAoIHN0YXJ0X3VuZGktPkJYID49IElTQVBOUF9DU05fTUlOICkgJiYKKwkgICAgICggc3RhcnRfdW5kaS0+QlggPD0gSVNBUE5QX0NTTl9NQVggKSApIHsKKwkJYnVzX3R5cGUgPSBCVVNfVFlQRV9JU0FQTlA7CisJCWxvY2F0aW9uID0gc3RhcnRfdW5kaS0+Qlg7CisJCS8qIFJlY29yZCBJU0FQblAgcmVhZCBwb3J0IGZvciB1c2UgYnkgaXNhcG5wLmMgKi8KKwkJaXNhcG5wX3JlYWRfcG9ydCA9IHN0YXJ0X3VuZGktPkRYOworCX0gZWxzZSB7CisJCWJ1c190eXBlID0gQlVTX1RZUEVfUENJOworCQlsb2NhdGlvbiA9IHN0YXJ0X3VuZGktPkFYOworCX0KKworCS8qIFByb2JlIGZvciBkZXZpY2VzLCBldGMuICovCisJc3RhcnR1cCgpOworCisJLyogTG9vayBmb3IgYSBtYXRjaGluZyBuZXQgZGV2aWNlICovCisJbmV0ZGV2ID0gZmluZF9uZXRkZXZfYnlfbG9jYXRpb24gKCBidXNfdHlwZSwgbG9jYXRpb24gKTsKKwlpZiAoICEgbmV0ZGV2ICkgeworCQlEQkcgKCAiIG5vIG5ldCBkZXZpY2UgZm91bmQiICk7CisJCXN0YXJ0X3VuZGktPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9JTklUSUFMSVpFX05JQzsKKwkJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKKwl9CisJREJHICggIiB1c2luZyBuZXRkZXYgJXMiLCBuZXRkZXYtPm5hbWUgKTsKKworCS8qIEFjdGl2YXRlIFBYRSAqLworCXB4ZV9hY3RpdmF0ZSAoIG5ldGRldiApOworCisJc3RhcnRfdW5kaS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyogUFhFTlZfU1RPUF9VTkRJCisgKgorICogU3RhdHVzOiB3b3JraW5nCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl9zdG9wX3VuZGkgKCBzdHJ1Y3Qgc19QWEVOVl9TVE9QX1VOREkgKnN0b3BfdW5kaSApIHsKKwlEQkcgKCAiUFhFTlZfU1RPUF9VTkRJIiApOworCisJLyogRGVhY3RpdmF0ZSBQWEUgKi8KKwlweGVfZGVhY3RpdmF0ZSgpOworCisJLyogUHJlcGFyZSBmb3IgdW5sb2FkICovCisJc2h1dGRvd24gKCBTSFVURE9XTl9CT09UICk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2Ugc3RpbGwgaGF2ZSBhbnkgaG9va2VkIGludGVycnVwdHMgKi8KKwlpZiAoIGhvb2tlZF9iaW9zX2ludGVycnVwdHMgIT0gMCApIHsKKwkJREJHICggIlBYRU5WX1NUT1BfVU5ESSBmYWlsZWQ6ICVkIGludGVycnVwdHMgc3RpbGwgaG9va2VkXG4iLAorCQkgICAgICBob29rZWRfYmlvc19pbnRlcnJ1cHRzICk7CisJCXN0b3BfdW5kaS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX0tFRVBfVU5ESTsKKwkJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKKwl9CisKKwlzdG9wX3VuZGktPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CisKKy8qIFBYRU5WX1NUQVJUX0JBU0UKKyAqCisgKiBTdGF0dXM6IHdvbid0IGltcGxlbWVudCAocmVxdWlyZXMgbWFqb3Igc3RydWN0dXJhbCBjaGFuZ2VzKQorICovCitQWEVOVl9FWElUX3QgcHhlbnZfc3RhcnRfYmFzZSAoIHN0cnVjdCBzX1BYRU5WX1NUQVJUX0JBU0UgKnN0YXJ0X2Jhc2UgKSB7CisJREJHICggIlBYRU5WX1NUQVJUX0JBU0UiICk7CisKKwlzdGFydF9iYXNlLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfVU5TVVBQT1JURUQ7CisJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKK30KKworLyogUFhFTlZfU1RPUF9CQVNFCisgKgorICogU3RhdHVzOiB3b3JraW5nCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl9zdG9wX2Jhc2UgKCBzdHJ1Y3Qgc19QWEVOVl9TVE9QX0JBU0UgKnN0b3BfYmFzZSApIHsKKwlEQkcgKCAiUFhFTlZfU1RPUF9CQVNFIiApOworCisJLyogVGhlIG9ubHkgdGltZSB3ZSB3aWxsIGJlIGNhbGxlZCBpcyB3aGVuIHRoZSBOQlAgaXMgdHJ5aW5nCisJICogdG8gc2h1dCBkb3duIHRoZSBQWEUgc3RhY2suICBUaGVyZSdzIG5vdGhpbmcgd2UgbmVlZCB0byBkbworCSAqIGluIHRoaXMgY2FsbC4KKwkgKi8KKworCXN0b3BfYmFzZS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcHhlL3B4ZV90ZnRwLmMgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfdGZ0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlM2NhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfdGZ0cC5jCkBAIC0wLDAgKzEsNTg2IEBACisvKiogQGZpbGUKKyAqCisgKiBQWEUgVEZUUCBBUEkKKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvaW4uaD4KKyNpbmNsdWRlIDxncHhlL3RmdHAuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKyNpbmNsdWRlIDxncHhlL29wZW4uaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxweGUuaD4KKworLyoqIEEgUFhFIFRGVFAgY29ubmVjdGlvbiAqLworc3RydWN0IHB4ZV90ZnRwX2Nvbm5lY3Rpb24geworCS8qKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZSAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSB4ZmVyOworCS8qKiBEYXRhIGJ1ZmZlciAqLworCXVzZXJwdHJfdCBidWZmZXI7CisJLyoqIFNpemUgb2YgZGF0YSBidWZmZXIgKi8KKwlzaXplX3Qgc2l6ZTsKKwkvKiogU3RhcnRpbmcgb2Zmc2V0IG9mIGRhdGEgYnVmZmVyICovCisJc2l6ZV90IHN0YXJ0OworCS8qKiBGaWxlIHBvc2l0aW9uICovCisJc2l6ZV90IG9mZnNldDsKKwkvKiogTWF4aW11bSBmaWxlIHBvc2l0aW9uICovCisJc2l6ZV90IG1heF9vZmZzZXQ7CisJLyoqIEJsb2NrIHNpemUgKi8KKwlzaXplX3QgYmxrc2l6ZTsKKwkvKiogQmxvY2sgaW5kZXggKi8KKwl1bnNpZ25lZCBpbnQgYmxraWR4OworCS8qKiBPdmVyYWxsIHJldHVybiBzdGF0dXMgY29kZSAqLworCWludCByYzsKK307CisKKy8qKiBUaGUgUFhFIFRGVFAgY29ubmVjdGlvbiAqLworc3RhdGljIHN0cnVjdCBweGVfdGZ0cF9jb25uZWN0aW9uIHB4ZV90ZnRwID0geworCS54ZmVyID0gWEZFUl9JTklUICggJm51bGxfeGZlcl9vcHMgKSwKK307CisKKy8qKgorICogQ2xvc2UgUFhFIFRGVFAgY29ubmVjdGlvbgorICoKKyAqIEB2IHJjCQlGaW5hbCBzdGF0dXMgY29kZQorICovCitzdGF0aWMgdm9pZCBweGVfdGZ0cF9jbG9zZSAoIGludCByYyApIHsKKwl4ZmVyX251bGxpZnkgKCAmcHhlX3RmdHAueGZlciApOworCXhmZXJfY2xvc2UgKCAmcHhlX3RmdHAueGZlciwgcmMgKTsKKwlweGVfdGZ0cC5yYyA9IHJjOworfQorCisvKioKKyAqIFJlY2VpdmUgbmV3IGRhdGEKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEB2IG1ldGEJCVRyYW5zZmVyIG1ldGFkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBweGVfdGZ0cF94ZmVyX2RlbGl2ZXJfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyIF9fdW51c2VkLAorCQkJCSAgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCQkgICAgICAgc3RydWN0IHhmZXJfbWV0YWRhdGEgKm1ldGEgKSB7CisJc2l6ZV90IGxlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCWludCByYyA9IDA7CisKKwkvKiBDYWxjdWxhdGUgbmV3IGJ1ZmZlciBwb3NpdGlvbiAqLworCWlmICggbWV0YS0+d2hlbmNlICE9IFNFRUtfQ1VSICkKKwkJcHhlX3RmdHAub2Zmc2V0ID0gMDsKKwlweGVfdGZ0cC5vZmZzZXQgKz0gbWV0YS0+b2Zmc2V0OworCisJLyogQ29weSBkYXRhIGJsb2NrIHRvIGJ1ZmZlciAqLworCWlmICggbGVuID09IDAgKSB7CisJCS8qIE5vIGRhdGEgKHB1cmUgc2Vlayk7IHRyZWF0IGFzIHN1Y2Nlc3MgKi8KKwl9IGVsc2UgaWYgKCBweGVfdGZ0cC5vZmZzZXQgPCBweGVfdGZ0cC5zdGFydCApIHsKKwkJREJHICggIiBidWZmZXIgdW5kZXJydW4gYXQgJXp4IChtaW4gJXp4KSIsCisJCSAgICAgIHB4ZV90ZnRwLm9mZnNldCwgcHhlX3RmdHAuc3RhcnQgKTsKKwkJcmMgPSAtRU5PQlVGUzsKKwl9IGVsc2UgaWYgKCAoIHB4ZV90ZnRwLm9mZnNldCArIGxlbiApID4KKwkJICAgICggcHhlX3RmdHAuc3RhcnQgKyBweGVfdGZ0cC5zaXplICkgKSB7CisJCURCRyAoICIgYnVmZmVyIG92ZXJydW4gYXQgJXp4IChtYXggJXp4KSIsCisJCSAgICAgICggcHhlX3RmdHAub2Zmc2V0ICsgbGVuICksCisJCSAgICAgICggcHhlX3RmdHAuc3RhcnQgKyBweGVfdGZ0cC5zaXplICkgKTsKKwkJcmMgPSAtRU5PQlVGUzsKKwl9IGVsc2UgeworCQljb3B5X3RvX3VzZXIgKCBweGVfdGZ0cC5idWZmZXIsCisJCQkgICAgICAgKCBweGVfdGZ0cC5vZmZzZXQgLSBweGVfdGZ0cC5zdGFydCApLAorCQkJICAgICAgIGlvYnVmLT5kYXRhLCBsZW4gKTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgbmV3IGJ1ZmZlciBwb3NpdGlvbiAqLworCXB4ZV90ZnRwLm9mZnNldCArPSBsZW47CisKKwkvKiBSZWNvcmQgbWF4aW11bSBvZmZzZXQgYXMgdGhlIGZpbGUgc2l6ZSAqLworCWlmICggcHhlX3RmdHAubWF4X29mZnNldCA8IHB4ZV90ZnRwLm9mZnNldCApCisJCXB4ZV90ZnRwLm1heF9vZmZzZXQgPSBweGVfdGZ0cC5vZmZzZXQ7CisKKwkvKiBUZXJtaW5hdGUgdHJhbnNmZXIgb24gZXJyb3IgKi8KKwlpZiAoIHJjICE9IDAgKQorCQlweGVfdGZ0cF9jbG9zZSAoIHJjICk7CisKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEhhbmRsZSBjbG9zZSgpIGV2ZW50CisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIHB4ZV90ZnRwX3hmZXJfY2xvc2UgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIgX191bnVzZWQsCisJCQkJICBpbnQgcmMgKSB7CisJcHhlX3RmdHBfY2xvc2UgKCByYyApOworfQorCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgcHhlX3RmdHBfeGZlcl9vcHMgPSB7CisJLmNsb3NlCQk9IHB4ZV90ZnRwX3hmZXJfY2xvc2UsCisJLnZyZWRpcmVjdAk9IHhmZXJfdnJlb3BlbiwKKwkud2luZG93CQk9IHVubGltaXRlZF94ZmVyX3dpbmRvdywKKwkuYWxsb2NfaW9iCT0gZGVmYXVsdF94ZmVyX2FsbG9jX2lvYiwKKwkuZGVsaXZlcl9pb2IJPSBweGVfdGZ0cF94ZmVyX2RlbGl2ZXJfaW9iLAorCS5kZWxpdmVyX3Jhdwk9IHhmZXJfZGVsaXZlcl9hc19pb2IsCit9OworCisvKioKKyAqIE1heGltdW0gbGVuZ3RoIG9mIGEgUFhFIFRGVFAgVVJJCisgKgorICogVGhlIFBYRSBURlRQIEFQSSBwcm92aWRlcyAxMjggY2hhcmFjdGVycyBmb3IgdGhlIGZpbGVuYW1lOyB0aGUKKyAqIGV4dHJhIDEyOCBieXRlcyBhbGxvdyBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgVVJJLgorICovCisjZGVmaW5lIFBYRV9URlRQX1VSSV9MRU4gMjU2CisKKy8qKgorICogT3BlbiBQWEUgVEZUUCBjb25uZWN0aW9uCisgKgorICogQHYgaXBhZGRyZXNzCQlJUCBhZGRyZXNzCisgKiBAdiBwb3J0CQlURlRQIHNlcnZlciBwb3J0CisgKiBAdiBmaWxlbmFtZQkJRmlsZSBuYW1lCisgKiBAdiBibGtzaXplCQlSZXF1ZXN0ZWQgYmxvY2sgc2l6ZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcHhlX3RmdHBfb3BlbiAoIHVpbnQzMl90IGlwYWRkcmVzcywgdW5zaWduZWQgaW50IHBvcnQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90IGJsa3NpemUsCisJCQkgICBpbnQgc2l6ZW9ubHkgKSB7CisJY2hhciB1cmlfc3RyaW5nW1BYRV9URlRQX1VSSV9MRU5dOworCXN0cnVjdCBpbl9hZGRyIGFkZHJlc3M7CisJaW50IHJjOworCisJLyogSW50ZWwgYnVnLWZvci1idWcgaGFjayAqLworCXB4ZV9zZXRfY2FjaGVkX2ZpbGVuYW1lICggZmlsZW5hbWUgKTsKKworCS8qIFJlc2V0IFBYRSBURlRQIGNvbm5lY3Rpb24gc3RydWN0dXJlICovCisJbWVtc2V0ICggJnB4ZV90ZnRwLCAwLCBzaXplb2YgKCBweGVfdGZ0cCApICk7CisJeGZlcl9pbml0ICggJnB4ZV90ZnRwLnhmZXIsICZweGVfdGZ0cF94ZmVyX29wcywgTlVMTCApOworCXB4ZV90ZnRwLnJjID0gLUVJTlBST0dSRVNTOworCisJLyogQ29uc3RydWN0IFVSSSBzdHJpbmcgKi8KKwlhZGRyZXNzLnNfYWRkciA9IGlwYWRkcmVzczsKKwlpZiAoICEgcG9ydCApCisJCXBvcnQgPSBodG9ucyAoIFRGVFBfUE9SVCApOworCWlmICggYmxrc2l6ZSA8IFRGVFBfREVGQVVMVF9CTEtTSVpFICkKKwkJYmxrc2l6ZSA9IFRGVFBfREVGQVVMVF9CTEtTSVpFOworCXNucHJpbnRmICggdXJpX3N0cmluZywgc2l6ZW9mICggdXJpX3N0cmluZyApLAorCQkgICAidGZ0cCVzOi8vJXM6JWQlcyVzP2Jsa3NpemU9JXpkIiwKKwkJICAgc2l6ZW9ubHkgPyAic2l6ZSIgOiAiIiwKKwkJICAgaW5ldF9udG9hICggYWRkcmVzcyApLCBudG9ocyAoIHBvcnQgKSwKKwkJICAgKCAoIGZpbGVuYW1lWzBdID09ICcvJyApID8gIiIgOiAiLyIgKSwgZmlsZW5hbWUsIGJsa3NpemUgKTsKKwlEQkcgKCAiICVzIiwgdXJpX3N0cmluZyApOworCisJLyogT3BlbiBQWEUgVEZUUCBjb25uZWN0aW9uICovCisJaWYgKCAoIHJjID0geGZlcl9vcGVuX3VyaV9zdHJpbmcgKCAmcHhlX3RmdHAueGZlciwKKwkJCQkJICAgdXJpX3N0cmluZyApICkgIT0gMCApIHsKKwkJREJHICggIiBjb3VsZCBub3Qgb3BlbiAoJXMpXG4iLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFRGVFAgT1BFTgorICoKKyAqIEB2IHRmdHBfb3BlbgkJCQlQb2ludGVyIHRvIGEgc3RydWN0IHNfUFhFTlZfVEZUUF9PUEVOCisgKiBAdiBzX1BYRU5WX1RGVFBfT1BFTjo6U2VydmVySVBBZGRyZXNzIFRGVFAgc2VydmVyIElQIGFkZHJlc3MKKyAqIEB2IHNfUFhFTlZfVEZUUF9PUEVOOjpHYXRld2F5SVBBZGRyZXNzIFJlbGF5IGFnZW50IElQIGFkZHJlc3MsIG9yIDAuMC4wLjAKKyAqIEB2IHNfUFhFTlZfVEZUUF9PUEVOOjpGaWxlTmFtZQlOYW1lIG9mIGZpbGUgdG8gb3BlbgorICogQHYgc19QWEVOVl9URlRQX09QRU46OlRGVFBQb3J0CVRGVFAgc2VydmVyIFVEUCBwb3J0CisgKiBAdiBzX1BYRU5WX1RGVFBfT1BFTjo6UGFja2V0U2l6ZQlURlRQIGJsa3NpemUgb3B0aW9uIHRvIHJlcXVlc3QKKyAqIEByZXQgI1BYRU5WX0VYSVRfU1VDQ0VTUwkJRmlsZSB3YXMgb3BlbmVkCisgKiBAcmV0ICNQWEVOVl9FWElUX0ZBSUxVUkUJCUZpbGUgd2FzIG5vdCBvcGVuZWQKKyAqIEByZXQgc19QWEVOVl9URlRQX09QRU46OlN0YXR1cwlQWEUgc3RhdHVzIGNvZGUKKyAqIEByZXQgc19QWEVOVl9URlRQX09QRU46OlBhY2tldFNpemUJTmVnb3RpYXRlZCBibGtzaXplCisgKiBAZXJyICNQWEVOVl9TVEFUVVNfVEZUUF9JTlZBTElEX1BBQ0tFVF9TSVpFIFJlcXVlc3RlZCBibGtzaXplIHRvbyBzbWFsbAorICoKKyAqIE9wZW5zIGEgVEZUUCBjb25uZWN0aW9uIGZvciBkb3dubG9hZGluZyBhIGZpbGUgYSBibG9jayBhdCBhIHRpbWUKKyAqIHVzaW5nIHB4ZW52X3RmdHBfcmVhZCgpLgorICoKKyAqIElmIHNfUFhFTlZfVEZUUF9PUEVOOjpHYXRld2F5SVBBZGRyZXNzIGlzIDAuMC4wLjAsIG5vcm1hbCBJUAorICogcm91dGluZyB3aWxsIHRha2UgcGxhY2UuICBTZWUgdGhlIHJlbGV2YW50CisgKiBAcmVmIHB4ZV9yb3V0aW5nICJpbXBsZW1lbnRhdGlvbiBub3RlIiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE9uIHg4NiwgeW91IG11c3Qgc2V0IHRoZSBzX1BYRTo6U3RhdHVzQ2FsbG91dCBmaWVsZCB0byBhIG5vbnplcm8KKyAqIHZhbHVlIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW4gcHJvdGVjdGVkIG1vZGUuICBZb3UgY2Fubm90CisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIDMyLWJpdCBzdGFjayBzZWdtZW50LiAgKFNlZSB0aGUgcmVsZXZhbnQKKyAqIEByZWYgcHhlX3g4Nl9wbW9kZTE2ICJpbXBsZW1lbnRhdGlvbiBub3RlIiBmb3IgbW9yZSBkZXRhaWxzLikKKyAqIAorICogQG5vdGUgQWNjb3JkaW5nIHRvIHRoZSBQWEUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDIuMSwgdGhpcyBjYWxsCisgKiAib3BlbnMgYSBmaWxlIGZvciByZWFkaW5nL3dyaXRpbmciLCB0aG91Z2ggaG93IHdyaXRpbmcgaXMgdG8gYmUKKyAqIGFjaGlldmVkIHdpdGhvdXQgdGhlIGV4aXN0ZW5jZSBvZiBhbiBBUEkgY2FsbCAlcHhlbnZfdGZ0cF93cml0ZSgpCisgKiBpcyBub3QgbWFkZSBjbGVhci4KKyAqCisgKiBAbm90ZSBEZXNwaXRlIHRoZSBleGlzdGVuY2Ugb2YgdGhlIG51bWVyb3VzIHN0YXRlbWVudHMgd2l0aGluIHRoZQorICogUFhFIHNwZWNpZmljYXRpb24gb2YgdGhlIGZvcm0gIi4uLmlmIGEgVEZUUC9NVEZUUCBvciBVRFAgY29ubmVjdGlvbgorICogaXMgYWN0aXZlLi4uIiwgeW91IGNhbm5vdCB1c2UgcHhlbnZfdGZ0cF9vcGVuKCkgYW5kCisgKiBweGVudl90ZnRwX3JlYWQoKSB0byByZWFkIGEgZmlsZSB2aWEgTVRGVFA7IG9ubHkgdmlhIHBsYWluIG9sZAorICogVEZUUC4gIElmIHlvdSB3YW50IHRvIHVzZSBNVEZUUCwgdXNlIHB4ZW52X3RmdHBfcmVhZF9maWxlKCkKKyAqIGluc3RlYWQuICBBc3R1dGUgcmVhZGVycyB3aWxsIG5vdGUgdGhhdCwgc2luY2UKKyAqIHB4ZW52X3RmdHBfcmVhZF9maWxlKCkgaXMgYW4gYXRvbWljIG9wZXJhdGlvbiBmcm9tIHRoZSBwb2ludCBvZgorICogdmlldyBvZiB0aGUgUFhFIEFQSSwgaXQgaXMgY29uY2VwdHVhbGx5IGltcG9zc2libGUgdG8gaXNzdWUgYW55CisgKiBvdGhlciBQWEUgQVBJIGNhbGwgImlmIGFuIE1URlRQIGNvbm5lY3Rpb24gaXMgYWN0aXZlIi4KKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3RmdHBfb3BlbiAoIHN0cnVjdCBzX1BYRU5WX1RGVFBfT1BFTiAqdGZ0cF9vcGVuICkgeworCWludCByYzsKKworCURCRyAoICJQWEVOVl9URlRQX09QRU4iICk7CisKKwkvKiBHdWFyZCBhZ2FpbnN0IGNhbGxlcnMgdGhhdCBmYWlsIHRvIGNsb3NlIGJlZm9yZSByZS1vcGVuaW5nICovCisJcHhlX3RmdHBfY2xvc2UgKCAwICk7CisKKwkvKiBPcGVuIGNvbm5lY3Rpb24gKi8KKwlpZiAoICggcmMgPSBweGVfdGZ0cF9vcGVuICggdGZ0cF9vcGVuLT5TZXJ2ZXJJUEFkZHJlc3MsCisJCQkJICAgIHRmdHBfb3Blbi0+VEZUUFBvcnQsCisJCQkJICAgIHRmdHBfb3Blbi0+RmlsZU5hbWUsCisJCQkJICAgIHRmdHBfb3Blbi0+UGFja2V0U2l6ZSwKKwkJCQkgICAgMCkgKSAhPSAwICkgeworCQl0ZnRwX29wZW4tPlN0YXR1cyA9IFBYRU5WX1NUQVRVUyAoIHJjICk7CisJCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7CisJfQorCisJLyogV2FpdCBmb3IgT0FDSyB0byBhcnJpdmUgc28gdGhhdCB3ZSBoYXZlIHRoZSBibG9jayBzaXplICovCisJd2hpbGUgKCAoICggcmMgPSBweGVfdGZ0cC5yYyApID09IC1FSU5QUk9HUkVTUyApICYmCisJCSggcHhlX3RmdHAubWF4X29mZnNldCA9PSAwICkgKSB7CisJCXN0ZXAoKTsKKwl9CisJcHhlX3RmdHAuYmxrc2l6ZSA9IHhmZXJfd2luZG93ICggJnB4ZV90ZnRwLnhmZXIgKTsKKwl0ZnRwX29wZW4tPlBhY2tldFNpemUgPSBweGVfdGZ0cC5ibGtzaXplOworCURCRyAoICIgYmxrc2l6ZT0lZCIsIHRmdHBfb3Blbi0+UGFja2V0U2l6ZSApOworCisJLyogRUlOUFJPR1JFU1MgaXMgbm9ybWFsOyB3ZSBkb24ndCB3YWl0IGZvciB0aGUgd2hvbGUgdHJhbnNmZXIgKi8KKwlpZiAoIHJjID09IC1FSU5QUk9HUkVTUyApCisJCXJjID0gMDsKKworCXRmdHBfb3Blbi0+U3RhdHVzID0gUFhFTlZfU1RBVFVTICggcmMgKTsKKwlyZXR1cm4gKCByYyA/IFBYRU5WX0VYSVRfRkFJTFVSRSA6IFBYRU5WX0VYSVRfU1VDQ0VTUyApOworfQorCisvKioKKyAqIFRGVFAgQ0xPU0UKKyAqCisgKiBAdiB0ZnRwX2Nsb3NlCQkJUG9pbnRlciB0byBhIHN0cnVjdCBzX1BYRU5WX1RGVFBfQ0xPU0UKKyAqIEByZXQgI1BYRU5WX0VYSVRfU1VDQ0VTUwkJRmlsZSB3YXMgY2xvc2VkIHN1Y2Nlc3NmdWxseQorICogQHJldCAjUFhFTlZfRVhJVF9GQUlMVVJFCQlGaWxlIHdhcyBub3QgY2xvc2VkCisgKiBAcmV0IHNfUFhFTlZfVEZUUF9DTE9TRTo6U3RhdHVzCVBYRSBzdGF0dXMgY29kZQorICogQGVyciBOb25lCQkJCS0KKyAqCisgKiBDbG9zZSBhIGNvbm5lY3Rpb24gcHJldmlvdXNseSBvcGVuZWQgd2l0aCBweGVudl90ZnRwX29wZW4oKS4gIFlvdQorICogbXVzdCBoYXZlIHByZXZpb3VzbHkgb3BlbmVkIGEgY29ubmVjdGlvbiB3aXRoIHB4ZW52X3RmdHBfb3BlbigpLgorICoKKyAqIE9uIHg4NiwgeW91IG11c3Qgc2V0IHRoZSBzX1BYRTo6U3RhdHVzQ2FsbG91dCBmaWVsZCB0byBhIG5vbnplcm8KKyAqIHZhbHVlIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW4gcHJvdGVjdGVkIG1vZGUuICBZb3UgY2Fubm90CisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIDMyLWJpdCBzdGFjayBzZWdtZW50LiAgKFNlZSB0aGUgcmVsZXZhbnQKKyAqIEByZWYgcHhlX3g4Nl9wbW9kZTE2ICJpbXBsZW1lbnRhdGlvbiBub3RlIiBmb3IgbW9yZSBkZXRhaWxzLikKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3RmdHBfY2xvc2UgKCBzdHJ1Y3Qgc19QWEVOVl9URlRQX0NMT1NFICp0ZnRwX2Nsb3NlICkgeworCURCRyAoICJQWEVOVl9URlRQX0NMT1NFIiApOworCisJcHhlX3RmdHBfY2xvc2UgKCAwICk7CisJdGZ0cF9jbG9zZS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyoqCisgKiBURlRQIFJFQUQKKyAqCisgKiBAdiB0ZnRwX3JlYWQJCQkJUG9pbnRlciB0byBhIHN0cnVjdCBzX1BYRU5WX1RGVFBfUkVBRAorICogQHYgc19QWEVOVl9URlRQX1JFQUQ6OkJ1ZmZlcgkJQWRkcmVzcyBvZiBkYXRhIGJ1ZmZlcgorICogQHJldCAjUFhFTlZfRVhJVF9TVUNDRVNTCQlEYXRhIHdhcyByZWFkIHN1Y2Nlc3NmdWxseQorICogQHJldCAjUFhFTlZfRVhJVF9GQUlMVVJFCQlEYXRhIHdhcyBub3QgcmVhZAorICogQHJldCBzX1BYRU5WX1RGVFBfUkVBRDo6U3RhdHVzCVBYRSBzdGF0dXMgY29kZQorICogQHJldCBzX1BYRU5WX1RGVFBfUkVBRDo6UGFja2V0TnVtYmVyCVRGVFAgcGFja2V0IG51bWJlcgorICogQHJldCBzX1BYRU5WX1RGVFBfUkVBRDo6QnVmZmVyU2l6ZQlMZW5ndGggb2YgZGF0YSB3cml0dGVuIGludG8gYnVmZmVyCisgKgorICogUmVhZHMgYSBzaW5nbGUgcGFja2V0IGZyb20gYSBjb25uZWN0aW9uIHByZXZpb3VzbHkgb3BlbmVkIHdpdGgKKyAqIHB4ZW52X3RmdHBfb3BlbigpIGludG8gdGhlIGRhdGEgYnVmZmVyIHBvaW50ZWQgdG8gYnkKKyAqIHNfUFhFTlZfVEZUUF9SRUFEOjpCdWZmZXIuICBZb3UgbXVzdCBoYXZlIHByZXZpb3VzbHkgb3BlbmVkIGEKKyAqIGNvbm5lY3Rpb24gd2l0aCBweGVudl90ZnRwX29wZW4oKS4gIFRoZSBkYXRhIHdyaXR0ZW4gaW50bworICogc19QWEVOVl9URlRQX1JFQUQ6OkJ1ZmZlciBpcyBqdXN0IHRoZSBmaWxlIGRhdGE7IHRoZSB2YXJpb3VzCisgKiBuZXR3b3JrIGhlYWRlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZC4KKyAqCisgKiBUaGUgYnVmZmVyIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gYSBwYWNrZXQgb2YgdGhlIHNpemUKKyAqIG5lZ290aWF0ZWQgdmlhIHRoZSBzX1BYRU5WX1RGVFBfT1BFTjo6UGFja2V0U2l6ZSBmaWVsZCBpbiB0aGUKKyAqIHB4ZW52X3RmdHBfb3BlbigpIGNhbGwuICBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgUFhFCisgKiBzcGVjaWZpY2F0aW9uIGRvZXMgQGIgbm90IHJlcXVpcmUgdGhlIGNhbGxlciB0byBmaWxsIGluCisgKiBzX1BYRU5WX1RGVFBfUkVBRDo6QnVmZmVyU2l6ZSBiZWZvcmUgY2FsbGluZyBweGVudl90ZnRwX3JlYWQoKSwgc28KKyAqIHRoZSBQWEUgc3RhY2sgaXMgZnJlZSB0byBpZ25vcmUgd2hhdGV2ZXIgdmFsdWUgdGhlIGNhbGxlciBtaWdodAorICogcGxhY2UgdGhlcmUgYW5kIGp1c3QgYXNzdW1lIHRoYXQgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2guICBUaGF0CisgKiBzYWlkLCBpdCBtYXkgYmUgd29ydGggdGhlIGNhbGxlciBhbHdheXMgZmlsbGluZyBpbgorICogc19QWEVOVl9URlRQX1JFQUQ6OkJ1ZmZlclNpemUgdG8gZ3VhcmQgYWdhaW5zdCBQWEUgc3RhY2tzIHRoYXQKKyAqIG1pc3Rha2UgaXQgZm9yIGFuIGlucHV0IHBhcmFtZXRlci4KKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBURlRQIGRhdGEgcGFja2V0IHdpbGwgYmUgcmV0dXJuZWQgdmlhCisgKiBzX1BYRU5WX1RGVFBfUkVBRDo6QnVmZmVyU2l6ZS4gIElmIHRoaXMgbGVuZ3RoIGlzIGxlc3MgdGhhbiB0aGUKKyAqIGJsa3NpemUgbmVnb3RpYXRlZCB2aWEgc19QWEVOVl9URlRQX09QRU46OlBhY2tldFNpemUgaW4gdGhlIGNhbGwgdG8KKyAqIHB4ZW52X3RmdHBfb3BlbigpLCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBibG9jayBpcyB0aGUgbGFzdCBibG9jaworICogaW4gdGhlIGZpbGUuICBOb3RlIHRoYXQgemVybyBpcyBhIHZhbGlkIGxlbmd0aCBmb3IKKyAqIHNfUFhFTlZfVEZUUF9SRUFEOjpCdWZmZXJTaXplLCBhbmQgd2lsbCBvY2N1ciB3aGVuIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBmaWxlIGlzIGEgbXVsdGlwbGUgb2YgdGhlIGJsa3NpemUuCisgKgorICogVGhlIFBYRSBzcGVjaWZpY2F0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgc3RhdGUgdGhhdCBjYWxscyB0bworICogcHhlbnZfdGZ0cF9yZWFkKCkgd2lsbCByZXR1cm4gdGhlIGRhdGEgcGFja2V0cyBpbiBzdHJpY3Qgc2VxdWVudGlhbAorICogb3JkZXIsIHRob3VnaCBtb3N0IFBYRSBzdGFja3Mgd2lsbCBwcm9iYWJseSBkbyBzby4gIFRoZSBzZXF1ZW5jZQorICogbnVtYmVyIG9mIHRoZSBwYWNrZXQgd2lsbCBiZSByZXR1cm5lZCBpbgorICogc19QWEVOVl9URlRQX1JFQUQ6OlBhY2tldE51bWJlci4gIFRoZSBmaXJzdCBwYWNrZXQgaW4gdGhlIGZpbGUgaGFzCisgKiBhIHNlcXVlbmNlIG51bWJlciBvZiBvbmUsIG5vdCB6ZXJvLgorICoKKyAqIFRvIGd1YXJkIGFnYWluc3QgZmxhd2VkIFBYRSBzdGFja3MsIHRoZSBjYWxsZXIgc2hvdWxkIHByb2JhYmx5IHNldAorICogc19QWEVOVl9URlRQX1JFQUQ6OlBhY2tldE51bWJlciB0byBvbmUgbGVzcyB0aGFuIHRoZSBleHBlY3RlZAorICogcmV0dXJuZWQgdmFsdWUgKGkuZS4gc2V0IGl0IHRvIHplcm8gZm9yIHRoZSBmaXJzdCBjYWxsIHRvCisgKiBweGVudl90ZnRwX3JlYWQoKSBhbmQgdGhlbiByZS11c2UgdGhlIHJldHVybmVkIHNfUFhFTlZfVEZUUF9SRUFECisgKiBwYXJhbWV0ZXIgYmxvY2sgZm9yIHN1YnNlcXVlbnQgY2FsbHMgd2l0aG91dCBtb2RpZnlpbmcKKyAqIHNfUFhFTlZfVEZUUF9SRUFEOjpQYWNrZXROdW1iZXIgYmV0d2VlbiBjYWxscykuICBUaGUgY2FsbGVyIHNob3VsZAorICogYWxzbyBndWFyZCBhZ2FpbnN0IHBvdGVudGlhbCBwcm9ibGVtcyBjYXVzZWQgYnkgZmxhd2VkCisgKiBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuaW5nIHRoZSBvY2Nhc2lvbmFsIGR1cGxpY2F0ZSBwYWNrZXQsIGJ5CisgKiBjaGVja2luZyB0aGF0IHRoZSB2YWx1ZSByZXR1cm5lZCBpbiBzX1BYRU5WX1RGVFBfUkVBRDo6UGFja2V0TnVtYmVyCisgKiBpcyBhcyBleHBlY3RlZCAoaS5lLiBvbmUgZ3JlYXRlciB0aGFuIHRoYXQgcmV0dXJuZWQgZnJvbSB0aGUKKyAqIHByZXZpb3VzIGNhbGwgdG8gcHhlbnZfdGZ0cF9yZWFkKCkpLgorICoKKyAqIE9uIHg4NiwgeW91IG11c3Qgc2V0IHRoZSBzX1BYRTo6U3RhdHVzQ2FsbG91dCBmaWVsZCB0byBhIG5vbnplcm8KKyAqIHZhbHVlIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW4gcHJvdGVjdGVkIG1vZGUuICBZb3UgY2Fubm90CisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIDMyLWJpdCBzdGFjayBzZWdtZW50LiAgKFNlZSB0aGUgcmVsZXZhbnQKKyAqIEByZWYgcHhlX3g4Nl9wbW9kZTE2ICJpbXBsZW1lbnRhdGlvbiBub3RlIiBmb3IgbW9yZSBkZXRhaWxzLikKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3RmdHBfcmVhZCAoIHN0cnVjdCBzX1BYRU5WX1RGVFBfUkVBRCAqdGZ0cF9yZWFkICkgeworCWludCByYzsKKworCURCRyAoICJQWEVOVl9URlRQX1JFQUQgdG8gJTA0eDolMDR4IiwKKwkgICAgICB0ZnRwX3JlYWQtPkJ1ZmZlci5zZWdtZW50LCB0ZnRwX3JlYWQtPkJ1ZmZlci5vZmZzZXQgKTsKKworCS8qIFJlYWQgc2luZ2xlIGJsb2NrIGludG8gYnVmZmVyICovCisJcHhlX3RmdHAuYnVmZmVyID0gcmVhbF90b191c2VyICggdGZ0cF9yZWFkLT5CdWZmZXIuc2VnbWVudCwKKwkJCQkJIHRmdHBfcmVhZC0+QnVmZmVyLm9mZnNldCApOworCXB4ZV90ZnRwLnNpemUgPSBweGVfdGZ0cC5ibGtzaXplOworCXB4ZV90ZnRwLnN0YXJ0ID0gcHhlX3RmdHAub2Zmc2V0OworCXdoaWxlICggKCAoIHJjID0gcHhlX3RmdHAucmMgKSA9PSAtRUlOUFJPR1JFU1MgKSAmJgorCQkoIHB4ZV90ZnRwLm9mZnNldCA9PSBweGVfdGZ0cC5zdGFydCApICkKKwkJc3RlcCgpOworCXB4ZV90ZnRwLmJ1ZmZlciA9IFVOVUxMOworCXRmdHBfcmVhZC0+QnVmZmVyU2l6ZSA9ICggcHhlX3RmdHAub2Zmc2V0IC0gcHhlX3RmdHAuc3RhcnQgKTsKKwl0ZnRwX3JlYWQtPlBhY2tldE51bWJlciA9ICsrcHhlX3RmdHAuYmxraWR4OworCisJLyogRUlOUFJPR1JFU1MgaXMgbm9ybWFsIGlmIHdlIGhhdmVuJ3QgcmVhY2hlZCBFT0YgeWV0ICovCisJaWYgKCByYyA9PSAtRUlOUFJPR1JFU1MgKQorCQlyYyA9IDA7CisKKwl0ZnRwX3JlYWQtPlN0YXR1cyA9IFBYRU5WX1NUQVRVUyAoIHJjICk7CisJcmV0dXJuICggcmMgPyBQWEVOVl9FWElUX0ZBSUxVUkUgOiBQWEVOVl9FWElUX1NVQ0NFU1MgKTsKK30KKworLyoqCisgKiBURlRQL01URlRQIHJlYWQgZmlsZQorICoKKyAqIEB2IHRmdHBfcmVhZF9maWxlCQkgICAgIFBvaW50ZXIgdG8gYSBzdHJ1Y3Qgc19QWEVOVl9URlRQX1JFQURfRklMRQorICogQHYgc19QWEVOVl9URlRQX1JFQURfRklMRTo6RmlsZU5hbWUJCUZpbGUgbmFtZQorICogQHYgc19QWEVOVl9URlRQX1JFQURfRklMRTo6QnVmZmVyU2l6ZSAJU2l6ZSBvZiB0aGUgcmVjZWl2ZSBidWZmZXIKKyAqIEB2IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEU6OkJ1ZmZlcgkJQWRkcmVzcyBvZiB0aGUgcmVjZWl2ZSBidWZmZXIKKyAqIEB2IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEU6OlNlcnZlcklQQWRkcmVzcwlURlRQIHNlcnZlciBJUCBhZGRyZXNzCisgKiBAdiBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFOjpHYXRld2F5SVBBZGRyZXNzCVJlbGF5IGFnZW50IElQIGFkZHJlc3MKKyAqIEB2IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEU6Ok1jYXN0SVBBZGRyZXNzCUZpbGUncyBtdWx0aWNhc3QgSVAgYWRkcmVzcworICogQHYgc19QWEVOVl9URlRQX1JFQURfRklMRTo6VEZUUENsbnRQb3J0CUNsaWVudCBtdWx0aWNhc3QgVURQIHBvcnQKKyAqIEB2IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEU6OlRGVFBTcnZQb3J0CVNlcnZlciBtdWx0aWNhc3QgVURQIHBvcnQKKyAqIEB2IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEU6OlRGVFBPcGVuVGltZU91dAlUaW1lIHRvIHdhaXQgZm9yIGZpcnN0IHBhY2tldAorICogQHYgc19QWEVOVl9URlRQX1JFQURfRklMRTo6VEZUUFJlb3BlbkRlbGF5CU1URlRQIGluYWN0aXZpdHkgdGltZW91dAorICogQHJldCAjUFhFTlZfRVhJVF9TVUNDRVNTCQkJRmlsZSBkb3dubG9hZGVkIHN1Y2Nlc3NmdWxseQorICogQHJldCAjUFhFTlZfRVhJVF9GQUlMVVJFCQkJRmlsZSBub3QgZG93bmxvYWRlZAorICogQHJldCBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFOjpTdGF0dXMJCVBYRSBzdGF0dXMgY29kZQorICogQHJldCBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFOjpCdWZmZXJTaXplCUxlbmd0aCBvZiBkb3dubG9hZGVkIGZpbGUKKyAqCisgKiBEb3dubG9hZHMgYW4gZW50aXJlIGZpbGUgdmlhIGVpdGhlciBURlRQIG9yIE1URlRQIGludG8gdGhlIGJ1ZmZlcgorICogcG9pbnRlZCB0byBieSBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFOjpCdWZmZXIuCisgKgorICogVGhlIFBYRSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IG1ha2UgaXQgY2xlYXIgaG93IHRoZSBjYWxsZXIKKyAqIHJlcXVlc3RzIHRoYXQgTVRGVFAgYmUgdXNlZCByYXRoZXIgdGhhbiBURlRQIChvciB2aWNlIHZlcnNhKS4gIE9uZQorICogcmVhc29uYWJsZSBndWVzcyBpcyB0aGF0IHNldHRpbmcKKyAqIHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEU6Ok1jYXN0SVBBZGRyZXNzIHRvIDAuMC4wLjAgd291bGQgY2F1c2UgVEZUUAorICogdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIE1URlRQLCB0aG91Z2ggaXQgaXMgY29uY2VpdmFibGUgdGhhdCBzb21lIFBYRQorICogc3RhY2tzIHdvdWxkIGludGVycHJldCB0aGF0IGFzICJ1c2UgdGhlIERIQ1AtcHJvdmlkZWQgbXVsdGljYXN0IElQCisgKiBhZGRyZXNzIiBpbnN0ZWFkLiAgU29tZSBQWEUgc3RhY2tzIHdpbGwgbm90IGltcGxlbWVudCBNVEZUUCBhdCBhbGwsCisgKiBhbmQgd2lsbCBhbHdheXMgdXNlIFRGVFAuCisgKgorICogSXQgaXMgbm90IHNwZWNpZmllZCB3aGV0aGVyIG9yIG5vdAorICogc19QWEVOVl9URlRQX1JFQURfRklMRTo6VEZUUFNydlBvcnQgd2lsbCBiZSB1c2VkIGFzIHRoZSBURlRQIHNlcnZlcgorICogcG9ydCBmb3IgVEZUUCAocmF0aGVyIHRoYW4gTVRGVFApIGRvd25sb2Fkcy4gIENhbGxlcnMgc2hvdWxkIGFzc3VtZQorICogdGhhdCB0aGUgb25seSB3YXkgdG8gYWNjZXNzIGEgVEZUUCBzZXJ2ZXIgb24gYSBub24tc3RhbmRhcmQgcG9ydCBpcworICogdG8gdXNlIHB4ZW52X3RmdHBfb3BlbigpIGFuZCBweGVudl90ZnRwX3JlYWQoKS4KKyAqCisgKiBJZiBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFOjpHYXRld2F5SVBBZGRyZXNzIGlzIDAuMC4wLjAsIG5vcm1hbCBJUAorICogcm91dGluZyB3aWxsIHRha2UgcGxhY2UuICBTZWUgdGhlIHJlbGV2YW50CisgKiBAcmVmIHB4ZV9yb3V0aW5nICJpbXBsZW1lbnRhdGlvbiBub3RlIiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEl0IGlzIGludGVyZXN0aW5nIHRvIG5vdGUgdGhhdCBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFOjpCdWZmZXIgaXMgYW4KKyAqICNBRERSMzJfdCB0eXBlLCBpLmUuIG5vbWluYWxseSBhIGZsYXQgcGh5c2ljYWwgYWRkcmVzcy4gIFNvbWUgUFhFCisgKiBOQlBzIChlLmcuIE5UTERSKSBhcmUga25vd24gdG8gY2FsbCBweGVudl90ZnRwX3JlYWRfZmlsZSgpIGluIHJlYWwKKyAqIG1vZGUgd2l0aCBzX1BYRU5WX1RGVFBfUkVBRF9GSUxFOjpCdWZmZXIgc2V0IHRvIGFuIGFkZHJlc3MgYWJvdmUKKyAqIDFNQi4gIFRoaXMgbWVhbnMgdGhhdCBQWEUgc3RhY2tzIG11c3QgYmUgcHJlcGFyZWQgdG8gd3JpdGUgdG8gYXJlYXMKKyAqIG91dHNpZGUgYmFzZSBtZW1vcnkuICBFeGFjdGx5IGhvdyB0aGlzIGlzIHRvIGJlIGFjaGlldmVkIGlzIG5vdAorICogc3BlY2lmaWVkLCB0aG91Z2ggdXNpbmcgSU5UIDE1LDg3IGlzIGFzIGNsb3NlIHRvIGEgc3RhbmRhcmQgbWV0aG9kCisgKiBhcyBhbnksIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgdXNlZC4gIFN3aXRjaGluZyB0byBwcm90ZWN0ZWQtbW9kZQorICogaW4gb3JkZXIgdG8gYWNjZXNzIGhpZ2ggbWVtb3J5IHdpbGwgZmFpbCBpZiBweGVudl90ZnRwX3JlYWRfZmlsZSgpCisgKiBpcyBjYWxsZWQgaW4gVjg2IG1vZGU7IGl0IGlzIHJlYXNvbmFibHkgdG8gZXhwZWN0IHRoYXQgYSBWODYKKyAqIG1vbml0b3Igd291bGQgaW50ZXJjZXB0IHRoZSByZWxhdGl2ZWx5IHdlbGwtZGVmaW5lZCBJTlQgMTUsODcgaWYgaXQKKyAqIHdhbnRzIHRoZSBQWEUgc3RhY2sgdG8gYmUgYWJsZSB0byB3cml0ZSB0byBoaWdoIG1lbW9yeS4KKyAqCisgKiBUaGluZ3MgZ2V0IGV2ZW4gbW9yZSBpbnRlcmVzdGluZyBpZiBweGVudl90ZnRwX3JlYWRfZmlsZSgpIGlzCisgKiBjYWxsZWQgaW4gcHJvdGVjdGVkIG1vZGUsIGJlY2F1c2UgdGhlcmUgaXMgdGhlbiBhYnNvbHV0ZWx5IG5vIHdheQorICogZm9yIHRoZSBQWEUgc3RhY2sgdG8gd3JpdGUgdG8gYW4gYWJzb2x1dGUgcGh5c2ljYWwgYWRkcmVzcy4gIFlvdQorICogY2FuJ3QgZXZlbiBnZXQgYXJvdW5kIHRoZSBwcm9ibGVtIGJ5IGNyZWF0aW5nIGEgc3BlY2lhbCAiYWNjZXNzCisgKiBldmVyeXRoaW5nIiBzZWdtZW50IGluIHRoZSBzX1BYRSBkYXRhIHN0cnVjdHVyZSwgYmVjYXVzZSB0aGUKKyAqICNTRUdERVNDX3QgZGVzY3JpcHRvcnMgYXJlIGxpbWl0ZWQgdG8gNjRrQiBpbiBzaXplLgorICoKKyAqIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBQWEUgc3BlY2lmaWNhdGlvbiAoZS5nLiBXZk0gMS4xYSkgcHJvdmlkZQorICogYSBzZXBhcmF0ZSBBUEkgY2FsbCwgJXB4ZW52X3RmdHBfcmVhZF9maWxlX3Btb2RlKCksIHNwZWNpZmljYWxseSB0bworICogd29yayBhcm91bmQgdGhpcyBwcm9ibGVtLiAgVGhlIHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEVfUE1PREUKKyAqIHBhcmFtZXRlciBibG9jayBzcGxpdHMgc19QWEVOVl9URlRQX1JFQURfRklMRTo6QnVmZmVyIGludG8KKyAqIHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEVfUE1PREU6OkJ1ZmZlclNlbGVjdG9yIGFuZAorICogc19QWEVOVl9URlRQX1JFQURfRklMRV9QTU9ERTo6QnVmZmVyT2Zmc2V0LCBpLmUuIGl0IHByb3ZpZGVzIGEKKyAqIHByb3RlY3RlZC1tb2RlIHNlZ21lbnQ6b2Zmc2V0IGFkZHJlc3MgZm9yIHRoZSBkYXRhIGJ1ZmZlci4gIFRoaXMKKyAqIEFQSSBjYWxsIGlzIG5vIGxvbmdlciBwcmVzZW50IGluIHZlcnNpb24gMi4xIG9mIHRoZSBQWEUKKyAqIHNwZWNpZmljYXRpb24uCisgKgorICogRXRoZXJib290IG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgc19QWEVOVl9URlRQX1JFQURfRklMRTo6QnVmZmVyCisgKiBpcyBhbiBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGNhbGxlcidzIGRhdGEgc2VnbWVudCwgd2hlbgorICogcHhlbnZfdGZ0cF9yZWFkX2ZpbGUoKSBpcyBjYWxsZWQgaW4gcHJvdGVjdGVkIG1vZGUuCisgKgorICogT24geDg2LCB5b3UgbXVzdCBzZXQgdGhlIHNfUFhFOjpTdGF0dXNDYWxsb3V0IGZpZWxkIHRvIGEgbm9uemVybworICogdmFsdWUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbiBwcm90ZWN0ZWQgbW9kZS4gIFlvdSBjYW5ub3QKKyAqIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGEgMzItYml0IHN0YWNrIHNlZ21lbnQuICAoU2VlIHRoZSByZWxldmFudAorICogQHJlZiBweGVfeDg2X3Btb2RlMTYgImltcGxlbWVudGF0aW9uIG5vdGUiIGZvciBtb3JlIGRldGFpbHMuKQorICoKKyAqIEBub3RlIE1pY3Jvc29mdCdzIE5UTERSIGFzc3VtZXMgdGhhdCB0aGUgZmlsZW5hbWUgcGFzc2VkIGluIHZpYQorICogc19QWEVOVl9URlRQX1JFQURfRklMRTo6RmlsZU5hbWUgd2lsbCBiZSBzdG9yZWQgaW4gdGhlICJmaWxlIiBmaWVsZAorICogb2YgdGhlIHN0b3JlZCBESENQQUNLIHBhY2tldCwgd2hlbmNlIGl0IHdpbGwgYmUgcmV0dXJuZWQgdmlhIGFueQorICogc3Vic2VxdWVudCBjYWxscyB0byBweGVudl9nZXRfY2FjaGVkX2luZm8oKS4gIFRob3VnaCB0aGlzIGlzCisgKiBlc3NlbnRpYWxseSBhIGJ1ZyBpbiB0aGUgSW50ZWwgUFhFIGltcGxlbWVudGF0aW9uIChub3QsIGZvciBvbmNlLAorICogaW4gdGhlIHNwZWNpZmljYXRpb24hKSwgaXQgaXMgYSBidWcgdGhhdCBNaWNyb3NvZnQgcmVsaWVzIHVwb24sIGFuZAorICogc28gd2UgaW1wbGVtZW50IHRoaXMgYnVnLWZvci1idWcgY29tcGF0aWJpbGl0eSBieSBvdmVyd3JpdGluZyB0aGUKKyAqIGZpbGVuYW1lIHN0b3JlZCBESENQQUNLIHBhY2tldCB3aXRoIHRoZSBmaWxlbmFtZSBwYXNzZWQgaW4KKyAqIHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEU6OkZpbGVOYW1lLgorICoKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3RmdHBfcmVhZF9maWxlICggc3RydWN0IHNfUFhFTlZfVEZUUF9SRUFEX0ZJTEUKKwkJCQkgICAgKnRmdHBfcmVhZF9maWxlICkgeworCWludCByYzsKKworCURCRyAoICJQWEVOVl9URlRQX1JFQURfRklMRSB0byAlMDh4KyV4IiwgdGZ0cF9yZWFkX2ZpbGUtPkJ1ZmZlciwKKwkgICAgICB0ZnRwX3JlYWRfZmlsZS0+QnVmZmVyU2l6ZSApOworCisJLyogT3BlbiBURlRQIGZpbGUgKi8KKwlpZiAoICggcmMgPSBweGVfdGZ0cF9vcGVuICggdGZ0cF9yZWFkX2ZpbGUtPlNlcnZlcklQQWRkcmVzcywgMCwKKwkJCQkgICAgdGZ0cF9yZWFkX2ZpbGUtPkZpbGVOYW1lLCAwLCAwICkgKSAhPSAwICkgeworCQl0ZnRwX3JlYWRfZmlsZS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTICggcmMgKTsKKwkJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKKwl9CisKKwkvKiBSZWFkIGVudGlyZSBmaWxlICovCisJcHhlX3RmdHAuYnVmZmVyID0gcGh5c190b191c2VyICggdGZ0cF9yZWFkX2ZpbGUtPkJ1ZmZlciApOworCXB4ZV90ZnRwLnNpemUgPSB0ZnRwX3JlYWRfZmlsZS0+QnVmZmVyU2l6ZTsKKwl3aGlsZSAoICggcmMgPSBweGVfdGZ0cC5yYyApID09IC1FSU5QUk9HUkVTUyApCisJCXN0ZXAoKTsKKwlweGVfdGZ0cC5idWZmZXIgPSBVTlVMTDsKKwl0ZnRwX3JlYWRfZmlsZS0+QnVmZmVyU2l6ZSA9IHB4ZV90ZnRwLm1heF9vZmZzZXQ7CisKKwkvKiBDbG9zZSBURlRQIGZpbGUgKi8KKwlweGVfdGZ0cF9jbG9zZSAoIHJjICk7CisKKwl0ZnRwX3JlYWRfZmlsZS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTICggcmMgKTsKKwlyZXR1cm4gKCByYyA/IFBYRU5WX0VYSVRfRkFJTFVSRSA6IFBYRU5WX0VYSVRfU1VDQ0VTUyApOworfQorCisvKioKKyAqIFRGVFAgR0VUIEZJTEUgU0laRQorICoKKyAqIEB2IHRmdHBfZ2V0X2ZzaXplCQkgICAgIFBvaW50ZXIgdG8gYSBzdHJ1Y3Qgc19QWEVOVl9URlRQX0dFVF9GU0laRQorICogQHYgc19QWEVOVl9URlRQX0dFVF9GU0laRTo6U2VydmVySVBBZGRyZXNzCVRGVFAgc2VydmVyIElQIGFkZHJlc3MKKyAqIEB2IHNfUFhFTlZfVEZUUF9HRVRfRlNJWkU6OkdhdGV3YXlJUEFkZHJlc3MJUmVsYXkgYWdlbnQgSVAgYWRkcmVzcworICogQHYgc19QWEVOVl9URlRQX0dFVF9GU0laRTo6RmlsZU5hbWUJRmlsZSBuYW1lCisgKiBAcmV0ICNQWEVOVl9FWElUX1NVQ0NFU1MJCUZpbGUgc2l6ZSB3YXMgZGV0ZXJtaW5lZCBzdWNjZXNzZnVsbHkKKyAqIEByZXQgI1BYRU5WX0VYSVRfRkFJTFVSRQkJRmlsZSBzaXplIHdhcyBub3QgZGV0ZXJtaW5lZAorICogQHJldCBzX1BYRU5WX1RGVFBfR0VUX0ZTSVpFOjpTdGF0dXMJUFhFIHN0YXR1cyBjb2RlCisgKiBAcmV0IHNfUFhFTlZfVEZUUF9HRVRfRlNJWkU6OkZpbGVTaXplCUZpbGUgc2l6ZQorICoKKyAqIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIGZpbGUgb24gYSBURlRQIHNlcnZlci4gIFRoaXMgdXNlcyB0aGUKKyAqICJ0c2l6ZSIgVEZUUCBvcHRpb24sIGFuZCBzbyB3aWxsIG5vdCB3b3JrIHdpdGggYSBURlRQIHNlcnZlciB0aGF0CisgKiBkb2VzIG5vdCBzdXBwb3J0IFRGVFAgb3B0aW9ucywgb3IgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSAidHNpemUiCisgKiBvcHRpb24uCisgKgorICogVGhlIFBYRSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IHRoaXMgQVBJIGNhbGwgd2lsbCBAYiBub3Qgb3BlbiBhCisgKiBURlRQIGNvbm5lY3Rpb24gZm9yIHN1YnNlcXVlbnQgdXNlIHdpdGggcHhlbnZfdGZ0cF9yZWFkKCkuICAoVGhpcworICogaXMgc29tZXdoYXQgZGFmdCwgc2luY2UgdGhlIG9ubHkgd2F5IHRvIG9idGFpbiB0aGUgZmlsZSBzaXplIHZpYQorICogdGhlICJ0c2l6ZSIgb3B0aW9uIGludm9sdmVzIGlzc3VpbmcgYSBURlRQIG9wZW4gcmVxdWVzdCwgYnV0IHRoYXQncworICogbGlmZS4pCisgKgorICogWW91IGNhbm5vdCBjYWxsIHB4ZW52X3RmdHBfZ2V0X2ZzaXplKCkgd2hpbGUgYSBURlRQIG9yIFVEUAorICogY29ubmVjdGlvbiBpcyBvcGVuLgorICoKKyAqIElmIHNfUFhFTlZfVEZUUF9HRVRfRlNJWkU6OkdhdGV3YXlJUEFkZHJlc3MgaXMgMC4wLjAuMCwgbm9ybWFsIElQCisgKiByb3V0aW5nIHdpbGwgdGFrZSBwbGFjZS4gIFNlZSB0aGUgcmVsZXZhbnQKKyAqIEByZWYgcHhlX3JvdXRpbmcgImltcGxlbWVudGF0aW9uIG5vdGUiIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogT24geDg2LCB5b3UgbXVzdCBzZXQgdGhlIHNfUFhFOjpTdGF0dXNDYWxsb3V0IGZpZWxkIHRvIGEgbm9uemVybworICogdmFsdWUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbiBwcm90ZWN0ZWQgbW9kZS4gIFlvdSBjYW5ub3QKKyAqIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGEgMzItYml0IHN0YWNrIHNlZ21lbnQuICAoU2VlIHRoZSByZWxldmFudAorICogQHJlZiBweGVfeDg2X3Btb2RlMTYgImltcGxlbWVudGF0aW9uIG5vdGUiIGZvciBtb3JlIGRldGFpbHMuKQorICogCisgKiBAbm90ZSBUaGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSB0aGUgVEZUUCBzZXJ2ZXIgcG9ydCB3aXRoIHRoaXMgQVBJCisgKiBjYWxsLiAgVGhvdWdoIHlvdSBjYW4gb3BlbiBhIGZpbGUgdXNpbmcgYSBub24tc3RhbmRhcmQgVEZUUCBzZXJ2ZXIKKyAqIHBvcnQgKHZpYSBzX1BYRU5WX1RGVFBfT1BFTjo6VEZUUFBvcnQgb3IsIHBvdGVudGlhbGx5LAorICogc19QWEVOVl9URlRQX1JFQURfRklMRTo6VEZUUFNydlBvcnQpLCB5b3UgY2FuIG9ubHkgZ2V0IHRoZSBzaXplIG9mCisgKiBhIGZpbGUgZnJvbSBhIFRGVFAgc2VydmVyIGxpc3RlbmluZyBvbiB0aGUgc3RhbmRhcmQgVEZUUCBwb3J0LgorICogIkNvbnNpc3RlbmN5IiBpcyBub3QgYSB3b3JkIGluIEludGVsJ3Mgdm9jYWJ1bGFyeS4KKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3RmdHBfZ2V0X2ZzaXplICggc3RydWN0IHNfUFhFTlZfVEZUUF9HRVRfRlNJWkUKKwkJCQkgICAgKnRmdHBfZ2V0X2ZzaXplICkgeworCWludCByYzsKKworCURCRyAoICJQWEVOVl9URlRQX0dFVF9GU0laRSIgKTsKKworCS8qIE9wZW4gVEZUUCBmaWxlICovCisJaWYgKCAoIHJjID0gcHhlX3RmdHBfb3BlbiAoIHRmdHBfZ2V0X2ZzaXplLT5TZXJ2ZXJJUEFkZHJlc3MsIDAsCisJCQkJICAgIHRmdHBfZ2V0X2ZzaXplLT5GaWxlTmFtZSwgMCwgMSApICkgIT0gMCApIHsKKwkJdGZ0cF9nZXRfZnNpemUtPlN0YXR1cyA9IFBYRU5WX1NUQVRVUyAoIHJjICk7CisJCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7CisJfQorCisJLyogV2FpdCBmb3IgaW5pdGlhbCBzZWVrIHRvIGFycml2ZSwgYW5kIHJlY29yZCBzaXplICovCisJd2hpbGUgKCAoICggcmMgPSBweGVfdGZ0cC5yYyApID09IC1FSU5QUk9HUkVTUyApICYmCisJCSggcHhlX3RmdHAubWF4X29mZnNldCA9PSAwICkgKSB7CisJCXN0ZXAoKTsKKwl9CisJdGZ0cF9nZXRfZnNpemUtPkZpbGVTaXplID0gcHhlX3RmdHAubWF4X29mZnNldDsKKwlEQkcgKCAiIGZzaXplPSVkIiwgdGZ0cF9nZXRfZnNpemUtPkZpbGVTaXplICk7CisKKwkvKiBFSU5QUk9HUkVTUyBpcyBub3JtYWw7IHdlIGRvbid0IHdhaXQgZm9yIHRoZSB3aG9sZSB0cmFuc2ZlciAqLworCWlmICggcmMgPT0gLUVJTlBST0dSRVNTICkKKwkJcmMgPSAwOworCisJLyogQ2xvc2UgVEZUUCBmaWxlICovCisJcHhlX3RmdHBfY2xvc2UgKCByYyApOworCisJdGZ0cF9nZXRfZnNpemUtPlN0YXR1cyA9IFBYRU5WX1NUQVRVUyAoIHJjICk7CisJcmV0dXJuICggcmMgPyBQWEVOVl9FWElUX0ZBSUxVUkUgOiBQWEVOVl9FWElUX1NVQ0NFU1MgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcHhlL3B4ZV91ZHAuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcHhlL3B4ZV91ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDcwMjIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGUvcHhlX3VkcC5jCkBAIC0wLDAgKzEsNDA1IEBACisvKiogQGZpbGUKKyAqCisgKiBQWEUgVURQIEFQSQorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKyNpbmNsdWRlIDxncHhlL3VkcC5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvcHJvY2Vzcy5oPgorI2luY2x1ZGUgPHB4ZS5oPgorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogQSBQWEUgVURQIGNvbm5lY3Rpb24gKi8KK3N0cnVjdCBweGVfdWRwX2Nvbm5lY3Rpb24geworCS8qKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZSB0byBVRFAgc3RhY2sgKi8KKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgeGZlcjsKKwkvKiogTG9jYWwgYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbDsKKwkvKiogQ3VycmVudCBQWEVOVl9VRFBfUkVBRCBwYXJhbWV0ZXIgYmxvY2sgKi8KKwlzdHJ1Y3Qgc19QWEVOVl9VRFBfUkVBRCAqcHhlbnZfdWRwX3JlYWQ7Cit9OworCisvKioKKyAqIFJlY2VpdmUgUFhFIFVEUCBkYXRhCisgKgorICogQHYgeGZlcgkJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiBpb2J1ZgkJCUkvTyBidWZmZXIKKyAqIEB2IG1ldGEJCQlEYXRhIHRyYW5zZmVyIG1ldGFkYXRhCisgKiBAcmV0IHJjCQkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogUmVjZWl2ZXMgYSBwYWNrZXQgYXMgcGFydCBvZiB0aGUgY3VycmVudCBweGVudl91ZHBfcmVhZCgpCisgKiBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgcHhlX3VkcF9kZWxpdmVyX2lvYiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCQkgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCQkJIHN0cnVjdCB4ZmVyX21ldGFkYXRhICptZXRhICkgeworCXN0cnVjdCBweGVfdWRwX2Nvbm5lY3Rpb24gKnB4ZV91ZHAgPSAKKwkJY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IHB4ZV91ZHBfY29ubmVjdGlvbiwgeGZlciApOworCXN0cnVjdCBzX1BYRU5WX1VEUF9SRUFEICpweGVudl91ZHBfcmVhZCA9IHB4ZV91ZHAtPnB4ZW52X3VkcF9yZWFkOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luX3NyYzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbl9kZXN0OworCXVzZXJwdHJfdCBidWZmZXI7CisJc2l6ZV90IGxlbjsKKwlpbnQgcmMgPSAwOworCisJaWYgKCAhIHB4ZW52X3VkcF9yZWFkICkgeworCQlEQkcgKCAiUFhFIGRpc2NhcmRlZCBVRFAgcGFja2V0XG4iICk7CisJCXJjID0gLUVOT0JVRlM7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBDb3B5IHBhY2tldCB0byBidWZmZXIgYW5kIHJlY29yZCBsZW5ndGggKi8KKwlidWZmZXIgPSByZWFsX3RvX3VzZXIgKCBweGVudl91ZHBfcmVhZC0+YnVmZmVyLnNlZ21lbnQsCisJCQkJcHhlbnZfdWRwX3JlYWQtPmJ1ZmZlci5vZmZzZXQgKTsKKwlsZW4gPSBpb2JfbGVuICggaW9idWYgKTsKKwlpZiAoIGxlbiA+IHB4ZW52X3VkcF9yZWFkLT5idWZmZXJfc2l6ZSApCisJCWxlbiA9IHB4ZW52X3VkcF9yZWFkLT5idWZmZXJfc2l6ZTsKKwljb3B5X3RvX3VzZXIgKCBidWZmZXIsIDAsIGlvYnVmLT5kYXRhLCBsZW4gKTsKKwlweGVudl91ZHBfcmVhZC0+YnVmZmVyX3NpemUgPSBsZW47CisKKwkvKiBGaWxsIGluIHNvdXJjZS9kZXN0IGluZm9ybWF0aW9uICovCisJYXNzZXJ0ICggbWV0YSApOworCXNpbl9zcmMgPSAoIHN0cnVjdCBzb2NrYWRkcl9pbiAqICkgbWV0YS0+c3JjOworCWFzc2VydCAoIHNpbl9zcmMgKTsKKwlhc3NlcnQgKCBzaW5fc3JjLT5zaW5fZmFtaWx5ID09IEFGX0lORVQgKTsKKwlweGVudl91ZHBfcmVhZC0+c3JjX2lwID0gc2luX3NyYy0+c2luX2FkZHIuc19hZGRyOworCXB4ZW52X3VkcF9yZWFkLT5zX3BvcnQgPSBzaW5fc3JjLT5zaW5fcG9ydDsKKwlzaW5fZGVzdCA9ICggc3RydWN0IHNvY2thZGRyX2luICogKSBtZXRhLT5kZXN0OworCWFzc2VydCAoIHNpbl9kZXN0ICk7CisJYXNzZXJ0ICggc2luX2Rlc3QtPnNpbl9mYW1pbHkgPT0gQUZfSU5FVCApOworCXB4ZW52X3VkcF9yZWFkLT5kZXN0X2lwID0gc2luX2Rlc3QtPnNpbl9hZGRyLnNfYWRkcjsKKwlweGVudl91ZHBfcmVhZC0+ZF9wb3J0ID0gc2luX2Rlc3QtPnNpbl9wb3J0OworCisJLyogTWFyayBhcyByZWNlaXZlZCAqLworCXB4ZV91ZHAtPnB4ZW52X3VkcF9yZWFkID0gTlVMTDsKKworIGRvbmU6CisJZnJlZV9pb2IgKCBpb2J1ZiApOworCXJldHVybiByYzsKK30KKworLyoqIFBYRSBVRFAgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2Ugb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCB4ZmVyX2ludGVyZmFjZV9vcGVyYXRpb25zIHB4ZV91ZHBfeGZlcl9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSBpZ25vcmVfeGZlcl9jbG9zZSwKKwkudnJlZGlyZWN0CT0gaWdub3JlX3hmZXJfdnJlZGlyZWN0LAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHB4ZV91ZHBfZGVsaXZlcl9pb2IsCisJLmRlbGl2ZXJfcmF3CT0geGZlcl9kZWxpdmVyX2FzX2lvYiwKK307CisKKy8qKiBUaGUgUFhFIFVEUCBjb25uZWN0aW9uICovCitzdGF0aWMgc3RydWN0IHB4ZV91ZHBfY29ubmVjdGlvbiBweGVfdWRwID0geworCS54ZmVyID0gWEZFUl9JTklUICggJnB4ZV91ZHBfeGZlcl9vcGVyYXRpb25zICksCisJLmxvY2FsID0geworCQkuc2luX2ZhbWlseSA9IEFGX0lORVQsCisJfSwKK307CisKKy8qKgorICogVURQIE9QRU4KKyAqCisgKiBAdiBweGVudl91ZHBfb3BlbgkJCVBvaW50ZXIgdG8gYSBzdHJ1Y3Qgc19QWEVOVl9VRFBfT1BFTgorICogQHYgc19QWEVOVl9VRFBfT1BFTjo6c3JjX2lwCQlJUCBhZGRyZXNzIG9mIHRoaXMgc3RhdGlvbiwgb3IgMC4wLjAuMAorICogQHJldCAjUFhFTlZfRVhJVF9TVUNDRVNTCQlBbHdheXMKKyAqIEByZXQgc19QWEVOVl9VRFBfT1BFTjo6U3RhdHVzCVBYRSBzdGF0dXMgY29kZQorICogQGVyciAjUFhFTlZfU1RBVFVTX1VEUF9PUEVOCQlVRFAgY29ubmVjdGlvbiBhbHJlYWR5IG9wZW4KKyAqIEBlcnIgI1BYRU5WX1NUQVRVU19PVVRfT0ZfUkVTT1VSQ0VTCUNvdWxkIG5vdCBvcGVuIGNvbm5lY3Rpb24KKyAqCisgKiBQcmVwYXJlcyB0aGUgUFhFIHN0YWNrIGZvciBjb21tdW5pY2F0aW9uIHVzaW5nIHB4ZW52X3VkcF93cml0ZSgpCisgKiBhbmQgcHhlbnZfdWRwX3JlYWQoKS4KKyAqCisgKiBUaGUgSVAgYWRkcmVzcyBzdXBwbGllZCBpbiBzX1BYRU5WX1VEUF9PUEVOOjpzcmNfaXAgd2lsbCBiZQorICogcmVjb3JkZWQgYW5kIHVzZWQgYXMgdGhlIGxvY2FsIHN0YXRpb24ncyBJUCBhZGRyZXNzIGZvciBhbGwgZnVydGhlcgorICogY29tbXVuaWNhdGlvbiwgaW5jbHVkaW5nIGNvbW11bmljYXRpb24gYnkgbWVhbnMgb3RoZXIgdGhhbgorICogcHhlbnZfdWRwX3dyaXRlKCkgYW5kIHB4ZW52X3VkcF9yZWFkKCkuICAoSWYKKyAqIHNfUFhFTlZfVURQX09QRU46OnNyY19pcCBpcyAwLjAuMC4wLCB0aGUgbG9jYWwgc3RhdGlvbidzIElQIGFkZHJlc3MKKyAqIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4pCisgKgorICogWW91IGNhbiBvbmx5IGhhdmUgb25lIG9wZW4gVURQIGNvbm5lY3Rpb24gYXQgYSB0aW1lLiAgVGhpcyBpcyBub3QgYQorICogbWVhbmluZ2Z1bCByZXN0cmljdGlvbiwgc2luY2UgcHhlbnZfdWRwX3dyaXRlKCkgYW5kCisgKiBweGVudl91ZHBfcmVhZCgpIGFsbG93IHlvdSB0byBzcGVjaWZ5IGFyYml0cmFyeSBsb2NhbCBhbmQgcmVtb3RlCisgKiBwb3J0cyBhbmQgYW4gYXJiaXRyYXJ5IHJlbW90ZSBhZGRyZXNzIGZvciBlYWNoIHBhY2tldC4gIEFjY29yZGluZworICogdG8gdGhlIFBYRSBzcGVjaWZpYXRpb24sIHlvdSBjYW5ub3QgaGF2ZSBhIFVEUCBjb25uZWN0aW9uIG9wZW4gYXQKKyAqIHRoZSBzYW1lIHRpbWUgYXMgYSBURlRQIGNvbm5lY3Rpb247IHRoaXMgcmVzdHJpY3Rpb24gZG9lcyBub3QgYXBwbHkKKyAqIHRvIEV0aGVyYm9vdC4KKyAqCisgKiBPbiB4ODYsIHlvdSBtdXN0IHNldCB0aGUgc19QWEU6OlN0YXR1c0NhbGxvdXQgZmllbGQgdG8gYSBub256ZXJvCisgKiB2YWx1ZSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGluIHByb3RlY3RlZCBtb2RlLiAgWW91IGNhbm5vdAorICogY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSAzMi1iaXQgc3RhY2sgc2VnbWVudC4gIChTZWUgdGhlIHJlbGV2YW50CisgKiBAcmVmIHB4ZV94ODZfcG1vZGUxNiAiaW1wbGVtZW50YXRpb24gbm90ZSIgZm9yIG1vcmUgZGV0YWlscy4pCisgKgorICogQG5vdGUgVGhlIFBYRSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IG1ha2UgaXQgY2xlYXIgd2hldGhlciB0aGUgSVAKKyAqIGFkZHJlc3Mgc3VwcGxpZWQgaW4gc19QWEVOVl9VRFBfT1BFTjo6c3JjX2lwIHNob3VsZCBiZSB1c2VkIG9ubHkKKyAqIGZvciB0aGlzIFVEUCBjb25uZWN0aW9uLCBvciByZXRhaW5lZCBmb3IgYWxsIGZ1dHVyZSBjb21tdW5pY2F0aW9uLgorICogVGhlIGxhdHRlciBzZWVtcyBtb3JlIGNvbnNpc3RlbnQgd2l0aCB0eXBpY2FsIFBYRSBzdGFjayBiZWhhdmlvdXIuCisgKgorICogQG5vdGUgRXRoZXJib290IGN1cnJlbnRseSBpZ25vcmVzIHRoZSBzX1BYRU5WX1VEUF9PUEVOOjpzcmNfaXAKKyAqIHBhcmFtZXRlci4KKyAqCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91ZHBfb3BlbiAoIHN0cnVjdCBzX1BYRU5WX1VEUF9PUEVOICpweGVudl91ZHBfb3BlbiApIHsKKwlpbnQgcmM7CisKKwlEQkcgKCAiUFhFTlZfVURQX09QRU4iICk7CisKKwkvKiBSZWNvcmQgc291cmNlIElQIGFkZHJlc3MgKi8KKwlweGVfdWRwLmxvY2FsLnNpbl9hZGRyLnNfYWRkciA9IHB4ZW52X3VkcF9vcGVuLT5zcmNfaXA7CisJREJHICggIiAlcyIsIGluZXRfbnRvYSAoIHB4ZV91ZHAubG9jYWwuc2luX2FkZHIgKSApOworCisJLyogT3BlbiBwcm9taXNjdW91cyBVRFAgY29ubmVjdGlvbiAqLworCXhmZXJfY2xvc2UgKCAmcHhlX3VkcC54ZmVyLCAwICk7CisJaWYgKCAoIHJjID0gdWRwX29wZW5fcHJvbWlzYyAoICZweGVfdWRwLnhmZXIgKSApICE9IDAgKSB7CisJCXB4ZW52X3VkcF9vcGVuLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVMgKCByYyApOworCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCX0KKworCXB4ZW52X3VkcF9vcGVuLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKioKKyAqIFVEUCBDTE9TRQorICoKKyAqIEB2IHB4ZW52X3VkcF9jbG9zZQkJCVBvaW50ZXIgdG8gYSBzdHJ1Y3Qgc19QWEVOVl9VRFBfQ0xPU0UKKyAqIEByZXQgI1BYRU5WX0VYSVRfU1VDQ0VTUwkJQWx3YXlzCisgKiBAcmV0IHNfUFhFTlZfVURQX0NMT1NFOjpTdGF0dXMJUFhFIHN0YXR1cyBjb2RlCisgKiBAZXJyIE5vbmUJCQkJLQorICoKKyAqIENsb3NlcyBhIFVEUCBjb25uZWN0aW9uIG9wZW5lZCB3aXRoIHB4ZW52X3VkcF9vcGVuKCkuCisgKgorICogWW91IGNhbiBvbmx5IGhhdmUgb25lIG9wZW4gVURQIGNvbm5lY3Rpb24gYXQgYSB0aW1lLiAgWW91IGNhbm5vdAorICogaGF2ZSBhIFVEUCBjb25uZWN0aW9uIG9wZW4gYXQgdGhlIHNhbWUgdGltZSBhcyBhIFRGVFAgY29ubmVjdGlvbi4KKyAqIFlvdSBjYW5ub3QgdXNlIHB4ZW52X3VkcF9jbG9zZSgpIHRvIGNsb3NlIGEgVEZUUCBjb25uZWN0aW9uOyB1c2UKKyAqIHB4ZW52X3RmdHBfY2xvc2UoKSBpbnN0ZWFkLgorICoKKyAqIE9uIHg4NiwgeW91IG11c3Qgc2V0IHRoZSBzX1BYRTo6U3RhdHVzQ2FsbG91dCBmaWVsZCB0byBhIG5vbnplcm8KKyAqIHZhbHVlIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW4gcHJvdGVjdGVkIG1vZGUuICBZb3UgY2Fubm90CisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIDMyLWJpdCBzdGFjayBzZWdtZW50LiAgKFNlZSB0aGUgcmVsZXZhbnQKKyAqIEByZWYgcHhlX3g4Nl9wbW9kZTE2ICJpbXBsZW1lbnRhdGlvbiBub3RlIiBmb3IgbW9yZSBkZXRhaWxzLikKKyAqCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91ZHBfY2xvc2UgKCBzdHJ1Y3Qgc19QWEVOVl9VRFBfQ0xPU0UgKnB4ZW52X3VkcF9jbG9zZSApIHsKKwlEQkcgKCAiUFhFTlZfVURQX0NMT1NFIiApOworCisJLyogQ2xvc2UgVURQIGNvbm5lY3Rpb24gKi8KKwl4ZmVyX2Nsb3NlICggJnB4ZV91ZHAueGZlciwgMCApOworCisJcHhlbnZfdWRwX2Nsb3NlLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKioKKyAqIFVEUCBXUklURQorICoKKyAqIEB2IHB4ZW52X3VkcF93cml0ZQkJCVBvaW50ZXIgdG8gYSBzdHJ1Y3Qgc19QWEVOVl9VRFBfV1JJVEUKKyAqIEB2IHNfUFhFTlZfVURQX1dSSVRFOjppcAkJRGVzdGluYXRpb24gSVAgYWRkcmVzcworICogQHYgc19QWEVOVl9VRFBfV1JJVEU6Omd3CQlSZWxheSBhZ2VudCBJUCBhZGRyZXNzLCBvciAwLjAuMC4wCisgKiBAdiBzX1BYRU5WX1VEUF9XUklURTo6c3JjX3BvcnQJU291cmNlIFVEUCBwb3J0LCBvciAwCisgKiBAdiBzX1BYRU5WX1VEUF9XUklURTo6ZHN0X3BvcnQJRGVzdGluYXRpb24gVURQIHBvcnQKKyAqIEB2IHNfUFhFTlZfVURQX1dSSVRFOjpidWZmZXJfc2l6ZQlMZW5ndGggb2YgdGhlIFVEUCBwYXlsb2FkCisgKiBAdiBzX1BYRU5WX1VEUF9XUklURTo6YnVmZmVyCQlBZGRyZXNzIG9mIHRoZSBVRFAgcGF5bG9hZAorICogQHJldCAjUFhFTlZfRVhJVF9TVUNDRVNTCQlQYWNrZXQgd2FzIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseQorICogQHJldCAjUFhFTlZfRVhJVF9GQUlMVVJFCQlQYWNrZXQgY291bGQgbm90IGJlIHRyYW5zbWl0dGVkCisgKiBAcmV0IHNfUFhFTlZfVURQX1dSSVRFOjpTdGF0dXMJUFhFIHN0YXR1cyBjb2RlCisgKiBAZXJyICNQWEVOVl9TVEFUVVNfVURQX0NMT1NFRAlVRFAgY29ubmVjdGlvbiBpcyBub3Qgb3BlbgorICogQGVyciAjUFhFTlZfU1RBVFVTX1VORElfVFJBTlNNSVRfRVJST1IgQ291bGQgbm90IHRyYW5zbWl0IHBhY2tldAorICoKKyAqIFRyYW5zbWl0cyBhIHNpbmdsZSBVRFAgcGFja2V0LiAgQSB2YWxpZCBJUCBhbmQgVURQIGhlYWRlciB3aWxsIGJlCisgKiBwcmVwZW5kZWQgdG8gdGhlIHBheWxvYWQgaW4gc19QWEVOVl9VRFBfV1JJVEU6OmJ1ZmZlcjsgdGhlIGJ1ZmZlcgorICogc2hvdWxkIG5vdCBjb250YWluIHByZWNvbXB1dGVkIElQIGFuZCBVRFAgaGVhZGVycywgbm9yIHNob3VsZCBpdAorICogY29udGFpbiBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZXNlIGhlYWRlcnMuICBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUKKyAqIGJ1ZmZlciB3aWxsIGJlIHRyYW5zbWl0dGVkIGFzIHRoZSBmaXJzdCBieXRlIGZvbGxvd2luZyB0aGUgVURQCisgKiBoZWFkZXIuCisgKgorICogSWYgc19QWEVOVl9VRFBfV1JJVEU6Omd3IGlzIDAuMC4wLjAsIG5vcm1hbCBJUCByb3V0aW5nIHdpbGwgdGFrZQorICogcGxhY2UuICBTZWUgdGhlIHJlbGV2YW50IEByZWYgcHhlX3JvdXRpbmcgImltcGxlbWVudGF0aW9uIG5vdGUiIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIElmIHNfUFhFTlZfVURQX1dSSVRFOjpzcmNfcG9ydCBpcyAwLCBwb3J0IDIwNjkgd2lsbCBiZSB1c2VkLgorICoKKyAqIFlvdSBtdXN0IGhhdmUgb3BlbmVkIGEgVURQIGNvbm5lY3Rpb24gd2l0aCBweGVudl91ZHBfb3BlbigpIGJlZm9yZQorICogY2FsbGluZyBweGVudl91ZHBfd3JpdGUoKS4KKyAqCisgKiBPbiB4ODYsIHlvdSBtdXN0IHNldCB0aGUgc19QWEU6OlN0YXR1c0NhbGxvdXQgZmllbGQgdG8gYSBub256ZXJvCisgKiB2YWx1ZSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGluIHByb3RlY3RlZCBtb2RlLiAgWW91IGNhbm5vdAorICogY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSAzMi1iaXQgc3RhY2sgc2VnbWVudC4gIChTZWUgdGhlIHJlbGV2YW50CisgKiBAcmVmIHB4ZV94ODZfcG1vZGUxNiAiaW1wbGVtZW50YXRpb24gbm90ZSIgZm9yIG1vcmUgZGV0YWlscy4pCisgKgorICogQG5vdGUgRXRoZXJib290IGN1cnJlbnRseSBpZ25vcmVzIHRoZSBzX1BYRU5WX1VEUF9XUklURTo6Z3cKKyAqIHBhcmFtZXRlci4KKyAqCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91ZHBfd3JpdGUgKCBzdHJ1Y3Qgc19QWEVOVl9VRFBfV1JJVEUgKnB4ZW52X3VkcF93cml0ZSApIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gZGVzdDsKKwlzdHJ1Y3QgeGZlcl9tZXRhZGF0YSBtZXRhID0geworCQkuc3JjID0gKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZweGVfdWRwLmxvY2FsLAorCQkuZGVzdCA9ICggc3RydWN0IHNvY2thZGRyICogKSAmZGVzdCwKKwkJLm5ldGRldiA9IHB4ZV9uZXRkZXYsCisJfTsKKwlzaXplX3QgbGVuOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXVzZXJwdHJfdCBidWZmZXI7CisJaW50IHJjOworCisJREJHICggIlBYRU5WX1VEUF9XUklURSIgKTsKKworCS8qIENvbnN0cnVjdCBkZXN0aW5hdGlvbiBzb2NrZXQgYWRkcmVzcyAqLworCW1lbXNldCAoICZkZXN0LCAwLCBzaXplb2YgKCBkZXN0ICkgKTsKKwlkZXN0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWRlc3Quc2luX2FkZHIuc19hZGRyID0gcHhlbnZfdWRwX3dyaXRlLT5pcDsKKwlkZXN0LnNpbl9wb3J0ID0gcHhlbnZfdWRwX3dyaXRlLT5kc3RfcG9ydDsKKworCS8qIFNldCBsb2NhbCAoc291cmNlKSBwb3J0LiAgUFhFIHNwZWMgc2F5cyBzb3VyY2UgcG9ydCBpcyAyMDY5CisJICogaWYgbm90IHNwZWNpZmllZC4gIFJlYWxseSwgdGhpcyBvdWdodCB0byBiZSBzZXQgYXQgVURQIG9wZW4KKwkgKiB0aW1lIGJ1dCBoZXksIHdlIGRpZG4ndCBkZXNpZ24gdGhpcyBBUEkuCisJICovCisJcHhlX3VkcC5sb2NhbC5zaW5fcG9ydCA9IHB4ZW52X3VkcF93cml0ZS0+c3JjX3BvcnQ7CisJaWYgKCAhIHB4ZV91ZHAubG9jYWwuc2luX3BvcnQgKQorCQlweGVfdWRwLmxvY2FsLnNpbl9wb3J0ID0gaHRvbnMgKCAyMDY5ICk7CisKKwkvKiBGSVhNRTogd2UgaWdub3JlIHRoZSBnYXRld2F5IHNwZWNpZmllZCwgc2luY2Ugd2UncmUKKwkgKiBjb25maWRlbnQgb2YgYmVpbmcgYWJsZSB0byBkbyBvdXIgb3duIHJvdXRpbmcuICBXZSBzaG91bGQKKwkgKiBwcm9iYWJseSBhbGxvdyBmb3IgbXVsdGlwbGUgZ2F0ZXdheXMuCisJICovCisKKwkvKiBBbGxvY2F0ZSBhbmQgZmlsbCBkYXRhIGJ1ZmZlciAqLworCWxlbiA9IHB4ZW52X3VkcF93cml0ZS0+YnVmZmVyX3NpemU7CisJaW9idWYgPSB4ZmVyX2FsbG9jX2lvYiAoICZweGVfdWRwLnhmZXIsIGxlbiApOworCWlmICggISBpb2J1ZiApIHsKKwkJcHhlbnZfdWRwX3dyaXRlLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfT1VUX09GX1JFU09VUkNFUzsKKwkJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKKwl9CisJYnVmZmVyID0gcmVhbF90b191c2VyICggcHhlbnZfdWRwX3dyaXRlLT5idWZmZXIuc2VnbWVudCwKKwkJCQlweGVudl91ZHBfd3JpdGUtPmJ1ZmZlci5vZmZzZXQgKTsKKwljb3B5X2Zyb21fdXNlciAoIGlvYl9wdXQgKCBpb2J1ZiwgbGVuICksIGJ1ZmZlciwgMCwgbGVuICk7CisKKwlEQkcgKCAiICUwNHg6JTA0eCsleCAlZC0+JXM6JWQiLCBweGVudl91ZHBfd3JpdGUtPmJ1ZmZlci5zZWdtZW50LAorCSAgICAgIHB4ZW52X3VkcF93cml0ZS0+YnVmZmVyLm9mZnNldCwgcHhlbnZfdWRwX3dyaXRlLT5idWZmZXJfc2l6ZSwKKwkgICAgICBudG9ocyAoIHB4ZW52X3VkcF93cml0ZS0+c3JjX3BvcnQgKSwKKwkgICAgICBpbmV0X250b2EgKCBkZXN0LnNpbl9hZGRyICksCisJICAgICAgbnRvaHMgKCBweGVudl91ZHBfd3JpdGUtPmRzdF9wb3J0ICkgKTsKKwkKKwkvKiBUcmFuc21pdCBwYWNrZXQgKi8KKwlpZiAoICggcmMgPSB4ZmVyX2RlbGl2ZXJfaW9iX21ldGEgKCAmcHhlX3VkcC54ZmVyLCBpb2J1ZiwKKwkJCQkJICAgICZtZXRhICkgKSAhPSAwICkgeworCQlweGVudl91ZHBfd3JpdGUtPlN0YXR1cyA9IFBYRU5WX1NUQVRVUyAoIHJjICk7CisJCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7CisJfQorCisJcHhlbnZfdWRwX3dyaXRlLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKioKKyAqIFVEUCBSRUFECisgKgorICogQHYgcHhlbnZfdWRwX3JlYWQJCQlQb2ludGVyIHRvIGEgc3RydWN0IHNfUFhFTlZfVURQX1JFQUQKKyAqIEB2IHNfUFhFTlZfVURQX1JFQUQ6OmRlc3RfaXAJCURlc3RpbmF0aW9uIElQIGFkZHJlc3MsIG9yIDAuMC4wLjAKKyAqIEB2IHNfUFhFTlZfVURQX1JFQUQ6OmRfcG9ydAkJRGVzdGluYXRpb24gVURQIHBvcnQsIG9yIDAKKyAqIEB2IHNfUFhFTlZfVURQX1JFQUQ6OmJ1ZmZlcl9zaXplCVNpemUgb2YgdGhlIFVEUCBwYXlsb2FkIGJ1ZmZlcgorICogQHYgc19QWEVOVl9VRFBfUkVBRDo6YnVmZmVyCQlBZGRyZXNzIG9mIHRoZSBVRFAgcGF5bG9hZCBidWZmZXIKKyAqIEByZXQgI1BYRU5WX0VYSVRfU1VDQ0VTUwkJQSBwYWNrZXQgaGFzIGJlZW4gcmVjZWl2ZWQKKyAqIEByZXQgI1BYRU5WX0VYSVRfRkFJTFVSRQkJTm8gcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkCisgKiBAcmV0IHNfUFhFTlZfVURQX1JFQUQ6OlN0YXR1cwlQWEUgc3RhdHVzIGNvZGUKKyAqIEByZXQgc19QWEVOVl9VRFBfUkVBRDo6c3JjX2lwCVNvdXJjZSBJUCBhZGRyZXNzCisgKiBAcmV0IHNfUFhFTlZfVURQX1JFQUQ6OmRlc3RfaXAJRGVzdGluYXRpb24gSVAgYWRkcmVzcworICogQHJldCBzX1BYRU5WX1VEUF9SRUFEOjpzX3BvcnQJU291cmNlIFVEUCBwb3J0CisgKiBAcmV0IHNfUFhFTlZfVURQX1JFQUQ6OmRfcG9ydAlEZXN0aW5hdGlvbiBVRFAgcG9ydAorICogQHJldCBzX1BYRU5WX1VEUF9SRUFEOjpidWZmZXJfc2l6ZQlMZW5ndGggb2YgVURQIHBheWxvYWQKKyAqIEBlcnIgI1BYRU5WX1NUQVRVU19VRFBfQ0xPU0VECVVEUCBjb25uZWN0aW9uIGlzIG5vdCBvcGVuCisgKiBAZXJyICNQWEVOVl9TVEFUVVNfRkFJTFVSRQkJTm8gcGFja2V0IHdhcyByZWFkeSB0byByZWFkCisgKgorICogUmVjZWl2ZSBhIHNpbmdsZSBVRFAgcGFja2V0LiAgVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsOyBpZiBubworICogcGFja2V0IGlzIHJlYWR5IHRvIHJlYWQsIHRoZSBjYWxsIHdpbGwgcmV0dXJuIGluc3RhbnRseSB3aXRoCisgKiBzX1BYRU5WX1VEUF9SRUFEOjpTdGF0dXM9PVBYRU5WX1NUQVRVU19GQUlMVVJFLgorICoKKyAqIElmIHNfUFhFTlZfVURQX1JFQUQ6OmRlc3RfaXAgaXMgMC4wLjAuMCwgVURQIHBhY2tldHMgYWRkcmVzc2VkIHRvCisgKiBhbnkgSVAgYWRkcmVzcyB3aWxsIGJlIGFjY2VwdGVkIGFuZCBtYXkgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiBJZiBzX1BYRU5WX1VEUF9SRUFEOjpkX3BvcnQgaXMgMCwgVURQIHBhY2tldHMgYWRkcmVzc2VkIHRvIGFueSBVRFAKKyAqIHBvcnQgd2lsbCBiZSBhY2NlcHRlZCBhbmQgbWF5IGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogWW91IG11c3QgaGF2ZSBvcGVuZWQgYSBVRFAgY29ubmVjdGlvbiB3aXRoIHB4ZW52X3VkcF9vcGVuKCkgYmVmb3JlCisgKiBjYWxsaW5nIHB4ZW52X3VkcF9yZWFkKCkuCisgKgorICogT24geDg2LCB5b3UgbXVzdCBzZXQgdGhlIHNfUFhFOjpTdGF0dXNDYWxsb3V0IGZpZWxkIHRvIGEgbm9uemVybworICogdmFsdWUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbiBwcm90ZWN0ZWQgbW9kZS4gIFlvdSBjYW5ub3QKKyAqIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGEgMzItYml0IHN0YWNrIHNlZ21lbnQuICAoU2VlIHRoZSByZWxldmFudAorICogQHJlZiBweGVfeDg2X3Btb2RlMTYgImltcGxlbWVudGF0aW9uIG5vdGUiIGZvciBtb3JlIGRldGFpbHMuKQorICoKKyAqIEBub3RlIFRoZSBQWEUgc3BlY2lmaWNhdGlvbiAodmVyc2lvbiAyLjEpIGRvZXMgbm90IHN0YXRlIHRoYXQgd2UKKyAqIHNob3VsZCBmaWxsIGluIHNfUFhFTlZfVURQX1JFQUQ6OmRlc3RfaXAgYW5kCisgKiBzX1BYRU5WX1VEUF9SRUFEOjpkX3BvcnQsIGJ1dCBNaWNyb3NvZnQgV2luZG93cycgTlRMRFIgcHJvZ3JhbQorICogZXhwZWN0cyB1cyB0byBkbyBzbywgYW5kIHdpbGwgZmFpbCBpZiB3ZSBkb24ndC4KKyAqCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91ZHBfcmVhZCAoIHN0cnVjdCBzX1BYRU5WX1VEUF9SRUFEICpweGVudl91ZHBfcmVhZCApIHsKKwlzdHJ1Y3QgaW5fYWRkciBkZXN0X2lwX3dhbnRlZCA9IHsgLnNfYWRkciA9IHB4ZW52X3VkcF9yZWFkLT5kZXN0X2lwIH07CisJc3RydWN0IGluX2FkZHIgZGVzdF9pcDsKKwl1aW50MTZfdCBkX3BvcnRfd2FudGVkID0gcHhlbnZfdWRwX3JlYWQtPmRfcG9ydDsKKwl1aW50MTZfdCBkX3BvcnQ7CisKKwlEQkcgKCAiUFhFTlZfVURQX1JFQUQiICk7CisKKwkvKiBUcnkgcmVjZWl2aW5nIGEgcGFja2V0ICovCisJcHhlX3VkcC5weGVudl91ZHBfcmVhZCA9IHB4ZW52X3VkcF9yZWFkOworCXN0ZXAoKTsKKwlpZiAoIHB4ZV91ZHAucHhlbnZfdWRwX3JlYWQgKSB7CisJCS8qIE5vIHBhY2tldCByZWNlaXZlZCAqLworCQlweGVfdWRwLnB4ZW52X3VkcF9yZWFkID0gTlVMTDsKKwkJZ290byBub19wYWNrZXQ7CisJfQorCWRlc3RfaXAuc19hZGRyID0gcHhlbnZfdWRwX3JlYWQtPmRlc3RfaXA7CisJZF9wb3J0ID0gcHhlbnZfdWRwX3JlYWQtPmRfcG9ydDsKKworCS8qIEZpbHRlciBvbiBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZC9vciBwb3J0ICovCisJaWYgKCBkZXN0X2lwX3dhbnRlZC5zX2FkZHIgJiYKKwkgICAgICggZGVzdF9pcF93YW50ZWQuc19hZGRyICE9IGRlc3RfaXAuc19hZGRyICkgKSB7CisJCURCRyAoICIgd3JvbmcgSVAgJXMiLCBpbmV0X250b2EgKCBkZXN0X2lwICkgKTsKKwkJREJHICggIiAod2FudGVkICVzKSIsIGluZXRfbnRvYSAoIGRlc3RfaXBfd2FudGVkICkgKTsKKwkJZ290byBub19wYWNrZXQ7CisJfQorCWlmICggZF9wb3J0X3dhbnRlZCAmJiAoIGRfcG9ydF93YW50ZWQgIT0gZF9wb3J0ICkgKSB7CisJCURCRyAoICIgd3JvbmcgcG9ydCAlZCAiLCBodG9ucyAoIGRfcG9ydCApICk7CisJCURCRyAoICIgKHdhbnRlZCAlZCkiLCBodG9ucyAoIGRfcG9ydF93YW50ZWQgKSApOworCQlnb3RvIG5vX3BhY2tldDsKKwl9CisKKwlEQkcgKCAiICUwNHg6JTA0eCsleCAlczoiLCBweGVudl91ZHBfcmVhZC0+YnVmZmVyLnNlZ21lbnQsCisJICAgICAgcHhlbnZfdWRwX3JlYWQtPmJ1ZmZlci5vZmZzZXQsIHB4ZW52X3VkcF9yZWFkLT5idWZmZXJfc2l6ZSwKKwkgICAgICBpbmV0X250b2EgKCAqKCAoIHN0cnVjdCBpbl9hZGRyICogKSAmcHhlbnZfdWRwX3JlYWQtPnNyY19pcCApICkpOworCURCRyAoICIlZDwtJXM6JWQiLCAgbnRvaHMgKCBweGVudl91ZHBfcmVhZC0+c19wb3J0ICksCisJICAgICAgaW5ldF9udG9hICggKiggKCBzdHJ1Y3QgaW5fYWRkciAqICkgJnB4ZW52X3VkcF9yZWFkLT5kZXN0X2lwICkgKSwKKwkgICAgICBudG9ocyAoIHB4ZW52X3VkcF9yZWFkLT5kX3BvcnQgKSApOworCisJcHhlbnZfdWRwX3JlYWQtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7CisKKyBub19wYWNrZXQ6CisJcHhlbnZfdWRwX3JlYWQtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19GQUlMVVJFOworCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZS9weGVfdW5kaS5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGUvcHhlX3VuZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWI2N2MwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGUvcHhlX3VuZGkuYwpAQCAtMCwwICsxLDc5MSBAQAorLyoqIEBmaWxlCisgKgorICogUFhFIFVOREkgQVBJCisgKgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8YmFzZW1lbV9wYWNrZXQuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL2RldmljZS5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGdweGUvaXAuaD4KKyNpbmNsdWRlIDxncHhlL2FycC5oPgorI2luY2x1ZGUgPGdweGUvcmFycC5oPgorI2luY2x1ZGUgInB4ZS5oIgorCisvKioKKyAqIENvdW50IG9mIG91dHN0YW5kaW5nIHRyYW5zbWl0dGVkIHBhY2tldHMKKyAqCisgKiBUaGlzIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBQWEVOVl9VTkRJX1RSQU5TTUlUIGlzIGNhbGxlZCwgYW5kCisgKiBkZWNyZW1lbnRlZCBlYWNoIHRpbWUgdGhhdCBQWEVOVl9VTkRJX0lTUiBpcyBjYWxsZWQgd2l0aCB0aGUgVFgKKyAqIHF1ZXVlIGVtcHR5LCBzdG9wcGluZyB3aGVuIHRoZSBjb3VudCByZWFjaGVzIHplcm8uICBUaGlzIGFsbG93cyB1cworICogdG8gcHJvdmlkZSBhIHBlc3NpbWlzdGljIGFwcHJveGltYXRpb24gb2YgVFggY29tcGxldGlvbiBldmVudHMgdG8KKyAqIHRoZSBQWEUgTkJQIHNpbXBseSBieSBtb25pdG9yaW5nIHRoZSBuZXRkZXYncyBUWCBxdWV1ZS4KKyAqLworc3RhdGljIGludCB1bmRpX3R4X2NvdW50ID0gMDsKKworc3RydWN0IG5ldF9kZXZpY2UgKnB4ZV9uZXRkZXYgPSBOVUxMOworCisvKioKKyAqIFNldCBuZXR3b3JrIGRldmljZSBhcyBjdXJyZW50IFBYRSBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UsIG9yIE5VTEwKKyAqLwordm9pZCBweGVfc2V0X25ldGRldiAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJaWYgKCBweGVfbmV0ZGV2ICkKKwkJbmV0ZGV2X3B1dCAoIHB4ZV9uZXRkZXYgKTsKKwlweGVfbmV0ZGV2ID0gTlVMTDsKKwlpZiAoIG5ldGRldiApCisJCXB4ZV9uZXRkZXYgPSBuZXRkZXZfZ2V0ICggbmV0ZGV2ICk7Cit9CisKKy8qKgorICogT3BlbiBQWEUgbmV0d29yayBkZXZpY2UKKyAqCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBweGVfbmV0ZGV2X29wZW4gKCB2b2lkICkgeworCWludCByYzsKKworCWlmICggKCByYyA9IG5ldGRldl9vcGVuICggcHhlX25ldGRldiApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCW5ldGRldl9pcnEgKCBweGVfbmV0ZGV2LCAxICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2xvc2UgUFhFIG5ldHdvcmsgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZCBweGVfbmV0ZGV2X2Nsb3NlICggdm9pZCApIHsKKwluZXRkZXZfaXJxICggcHhlX25ldGRldiwgMCApOworCW5ldGRldl9jbG9zZSAoIHB4ZV9uZXRkZXYgKTsKKwl1bmRpX3R4X2NvdW50ID0gMDsKK30KKworLyoqCisgKiBEdW1wIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QKKyAqCisgKiBAdiBtY2FzdAkJUFhFIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgcHhlX2R1bXBfbWNhc3RfbGlzdCAoIHN0cnVjdCBzX1BYRU5WX1VORElfTUNBU1RfQUREUkVTUyAqbWNhc3QgKSB7CisJc3RydWN0IGxsX3Byb3RvY29sICpsbF9wcm90b2NvbCA9IHB4ZV9uZXRkZXYtPmxsX3Byb3RvY29sOworCXVuc2lnbmVkIGludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgbWNhc3QtPk1DYXN0QWRkckNvdW50IDsgaSsrICkgeworCQlEQkcgKCAiICVzIiwgbGxfcHJvdG9jb2wtPm50b2EgKCBtY2FzdC0+TWNhc3RBZGRyW2ldICkgKTsKKwl9Cit9CisKKy8qIFBYRU5WX1VORElfU1RBUlRVUAorICoKKyAqIFN0YXR1czogd29ya2luZworICovCitQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9zdGFydHVwICggc3RydWN0IHNfUFhFTlZfVU5ESV9TVEFSVFVQICp1bmRpX3N0YXJ0dXAgKSB7CisJREJHICggIlBYRU5WX1VORElfU1RBUlRVUFxuIiApOworCisJdW5kaV9zdGFydHVwLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKiBQWEVOVl9VTkRJX0NMRUFOVVAKKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfY2xlYW51cCAoIHN0cnVjdCBzX1BYRU5WX1VORElfQ0xFQU5VUCAqdW5kaV9jbGVhbnVwICkgeworCURCRyAoICJQWEVOVl9VTkRJX0NMRUFOVVBcbiIgKTsKKworCXB4ZV9uZXRkZXZfY2xvc2UoKTsKKworCXVuZGlfY2xlYW51cC0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyogUFhFTlZfVU5ESV9JTklUSUFMSVpFCisgKgorICogU3RhdHVzOiB3b3JraW5nCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91bmRpX2luaXRpYWxpemUgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0lOSVRJQUxJWkUKKwkJCQkgICAgICp1bmRpX2luaXRpYWxpemUgKSB7CisJREJHICggIlBYRU5WX1VORElfSU5JVElBTElaRSBwcm90b2NvbGluaSAlMDh4XG4iLAorCSAgICAgIHVuZGlfaW5pdGlhbGl6ZS0+UHJvdG9jb2xJbmkgKTsKKworCXVuZGlfaW5pdGlhbGl6ZS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyogUFhFTlZfVU5ESV9SRVNFVF9BREFQVEVSCisgKgorICogU3RhdHVzOiB3b3JraW5nCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91bmRpX3Jlc2V0X2FkYXB0ZXIgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1JFU0VUCisJCQkJCSp1bmRpX3Jlc2V0X2FkYXB0ZXIgKSB7CisJaW50IHJjOworCisJREJHICggIlBYRU5WX1VORElfUkVTRVRfQURBUFRFUiIgKTsKKwlweGVfZHVtcF9tY2FzdF9saXN0ICggJnVuZGlfcmVzZXRfYWRhcHRlci0+Ul9NY2FzdF9CdWYgKTsKKwlEQkcgKCAiXG4iICk7CisKKwlweGVfbmV0ZGV2X2Nsb3NlKCk7CisJaWYgKCAoIHJjID0gcHhlX25ldGRldl9vcGVuKCkgKSAhPSAwICkgeworCQlEQkcgKCAiUFhFTlZfVU5ESV9SRVNFVF9BREFQVEVSIGNvdWxkIG5vdCByZW9wZW4gJXM6ICVzXG4iLAorCQkgICAgICBweGVfbmV0ZGV2LT5uYW1lLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJdW5kaV9yZXNldF9hZGFwdGVyLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVMgKCByYyApOworCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCX0KKworCXVuZGlfcmVzZXRfYWRhcHRlci0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyogUFhFTlZfVU5ESV9TSFVURE9XTgorICoKKyAqIFN0YXR1czogd29ya2luZworICovCitQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9zaHV0ZG93biAoIHN0cnVjdCBzX1BYRU5WX1VORElfU0hVVERPV04KKwkJCQkgICAqdW5kaV9zaHV0ZG93biApIHsKKwlEQkcgKCAiUFhFTlZfVU5ESV9TSFVURE9XTlxuIiApOworCisJcHhlX25ldGRldl9jbG9zZSgpOworCisJdW5kaV9zaHV0ZG93bi0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyogUFhFTlZfVU5ESV9PUEVOCisgKgorICogU3RhdHVzOiB3b3JraW5nCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91bmRpX29wZW4gKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX09QRU4gKnVuZGlfb3BlbiApIHsKKwlpbnQgcmM7CisKKwlEQkcgKCAiUFhFTlZfVU5ESV9PUEVOIGZsYWcgJTA0eCBmaWx0ZXIgJTA0eCIsCisJICAgICAgdW5kaV9vcGVuLT5PcGVuRmxhZywgdW5kaV9vcGVuLT5Qa3RGaWx0ZXIgKTsKKwlweGVfZHVtcF9tY2FzdF9saXN0ICggJnVuZGlfb3Blbi0+Ul9NY2FzdF9CdWYgKTsKKwlEQkcgKCAiXG4iICk7CisKKwlpZiAoICggcmMgPSBweGVfbmV0ZGV2X29wZW4oKSApICE9IDAgKSB7CisJCURCRyAoICJQWEVOVl9VTkRJX09QRU4gY291bGQgbm90IG9wZW4gJXM6ICVzXG4iLAorCQkgICAgICBweGVfbmV0ZGV2LT5uYW1lLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJdW5kaV9vcGVuLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVMgKCByYyApOworCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCX0KKworCXVuZGlfb3Blbi0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyogUFhFTlZfVU5ESV9DTE9TRQorICoKKyAqIFN0YXR1czogd29ya2luZworICovCitQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9jbG9zZSAoIHN0cnVjdCBzX1BYRU5WX1VORElfQ0xPU0UgKnVuZGlfY2xvc2UgKSB7CisJREJHICggIlBYRU5WX1VORElfQ0xPU0VcbiIgKTsKKworCXB4ZV9uZXRkZXZfY2xvc2UoKTsKKworCXVuZGlfY2xvc2UtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CisKKy8qIFBYRU5WX1VORElfVFJBTlNNSVQKKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfdHJhbnNtaXQgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1RSQU5TTUlUCisJCQkJICAgKnVuZGlfdHJhbnNtaXQgKSB7CisJc3RydWN0IHNfUFhFTlZfVU5ESV9UQkQgdGJkOworCXN0cnVjdCBEYXRhQmxrICpkYXRhYmxrOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXN0cnVjdCBuZXRfcHJvdG9jb2wgKm5ldF9wcm90b2NvbDsKKwlzdHJ1Y3QgbGxfcHJvdG9jb2wgKmxsX3Byb3RvY29sID0gcHhlX25ldGRldi0+bGxfcHJvdG9jb2w7CisJY2hhciBkZXN0YWRkcltNQVhfTExfQUREUl9MRU5dOworCWNvbnN0IHZvaWQgKmxsX2Rlc3Q7CisJc2l6ZV90IGxsX2hsZW4gPSBsbF9wcm90b2NvbC0+bGxfaGVhZGVyX2xlbjsKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCURCRzIgKCAiUFhFTlZfVU5ESV9UUkFOU01JVCIgKTsKKworCS8qIEZvcmNpYmx5IGVuYWJsZSBpbnRlcnJ1cHRzIGF0IHRoaXMgcG9pbnQsIHRvIHdvcmsgYXJvdW5kCisJICogY2FsbGVycyB0aGF0IG5ldmVyIGNhbGwgUFhFTlZfVU5ESV9PUEVOIGJlZm9yZSBhdHRlbXB0aW5nCisJICogdG8gdXNlIHRoZSBVTkRJIEFQSS4KKwkgKi8KKwluZXRkZXZfaXJxICggcHhlX25ldGRldiwgMSApOworCisJLyogSWRlbnRpZnkgbmV0d29yay1sYXllciBwcm90b2NvbCAqLworCXN3aXRjaCAoIHVuZGlfdHJhbnNtaXQtPlByb3RvY29sICkgeworCWNhc2UgUF9JUDoJbmV0X3Byb3RvY29sID0gJmlwdjRfcHJvdG9jb2w7CWJyZWFrOworCWNhc2UgUF9BUlA6CW5ldF9wcm90b2NvbCA9ICZhcnBfcHJvdG9jb2w7CWJyZWFrOworCWNhc2UgUF9SQVJQOgluZXRfcHJvdG9jb2wgPSAmcmFycF9wcm90b2NvbDsJYnJlYWs7CisJY2FzZSBQX1VOS05PV046CisJCW5ldF9wcm90b2NvbCA9IE5VTEw7CisJCWxsX2hsZW4gPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkcyICggIiAlMDJ4IGludmFsaWQgcHJvdG9jb2xcbiIsIHVuZGlfdHJhbnNtaXQtPlByb3RvY29sICk7CisJCXVuZGlfdHJhbnNtaXQtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19VTkRJX0lOVkFMSURfUEFSQU1FVEVSOworCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCX0KKwlEQkcyICggIiAlcyIsICggbmV0X3Byb3RvY29sID8gbmV0X3Byb3RvY29sLT5uYW1lIDogIlJBVyIgKSApOworCisJLyogQ2FsY3VsYXRlIHRvdGFsIHBhY2tldCBsZW5ndGggKi8KKwljb3B5X2Zyb21fcmVhbCAoICZ0YmQsIHVuZGlfdHJhbnNtaXQtPlRCRC5zZWdtZW50LAorCQkJIHVuZGlfdHJhbnNtaXQtPlRCRC5vZmZzZXQsIHNpemVvZiAoIHRiZCApICk7CisJbGVuID0gdGJkLkltbWVkTGVuZ3RoOworCURCRzIgKCAiICUwNHg6JTA0eCsleCIsIHRiZC5YbWl0LnNlZ21lbnQsIHRiZC5YbWl0Lm9mZnNldCwKKwkgICAgICAgdGJkLkltbWVkTGVuZ3RoICk7CisJZm9yICggaSA9IDAgOyBpIDwgdGJkLkRhdGFCbGtDb3VudCA7IGkrKyApIHsKKwkJZGF0YWJsayA9ICZ0YmQuRGF0YUJsb2NrW2ldOworCQlsZW4gKz0gZGF0YWJsay0+VEREYXRhTGVuOworCQlEQkcyICggIiAlMDR4OiUwNHgrJXgiLCBkYXRhYmxrLT5URERhdGFQdHIuc2VnbWVudCwKKwkJICAgICAgIGRhdGFibGstPlRERGF0YVB0ci5vZmZzZXQsIGRhdGFibGstPlRERGF0YUxlbiApOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBmaWxsIEkvTyBidWZmZXIgKi8KKwlpb2J1ZiA9IGFsbG9jX2lvYiAoIGxsX2hsZW4gKyBsZW4gKTsKKwlpZiAoICEgaW9idWYgKSB7CisJCURCRzIgKCAiIGNvdWxkIG5vdCBhbGxvY2F0ZSBpb2J1ZlxuIiApOworCQl1bmRpX3RyYW5zbWl0LT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfT1VUX09GX1JFU09VUkNFUzsKKwkJcmV0dXJuIFBYRU5WX0VYSVRfRkFJTFVSRTsKKwl9CisJaW9iX3Jlc2VydmUgKCBpb2J1ZiwgbGxfaGxlbiApOworCWNvcHlfZnJvbV9yZWFsICggaW9iX3B1dCAoIGlvYnVmLCB0YmQuSW1tZWRMZW5ndGggKSwgdGJkLlhtaXQuc2VnbWVudCwKKwkJCSB0YmQuWG1pdC5vZmZzZXQsIHRiZC5JbW1lZExlbmd0aCApOworCWZvciAoIGkgPSAwIDsgaSA8IHRiZC5EYXRhQmxrQ291bnQgOyBpKysgKSB7CisJCWRhdGFibGsgPSAmdGJkLkRhdGFCbG9ja1tpXTsKKwkJY29weV9mcm9tX3JlYWwgKCBpb2JfcHV0ICggaW9idWYsIGRhdGFibGstPlRERGF0YUxlbiApLAorCQkJCSBkYXRhYmxrLT5URERhdGFQdHIuc2VnbWVudCwKKwkJCQkgZGF0YWJsay0+VEREYXRhUHRyLm9mZnNldCwKKwkJCQkgZGF0YWJsay0+VEREYXRhTGVuICk7CisJfQorCisJLyogQWRkIGxpbmstbGF5ZXIgaGVhZGVyLCBpZiByZXF1aXJlZCB0byBkbyBzbyAqLworCWlmICggbmV0X3Byb3RvY29sICE9IE5VTEwgKSB7CisKKwkJLyogQ2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwkJaWYgKCB1bmRpX3RyYW5zbWl0LT5YbWl0RmxhZyA9PSBYTVRfREVTVEFERFIgKSB7CisJCQljb3B5X2Zyb21fcmVhbCAoIGRlc3RhZGRyLAorCQkJCQkgdW5kaV90cmFuc21pdC0+RGVzdEFkZHIuc2VnbWVudCwKKwkJCQkJIHVuZGlfdHJhbnNtaXQtPkRlc3RBZGRyLm9mZnNldCwKKwkJCQkJIGxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApOworCQkJbGxfZGVzdCA9IGRlc3RhZGRyOworCQkJREJHMiAoICIgREVTVCAlcyIsIGxsX3Byb3RvY29sLT5udG9hICggbGxfZGVzdCApICk7CisJCX0gZWxzZSB7CisJCQlsbF9kZXN0ID0gcHhlX25ldGRldi0+bGxfYnJvYWRjYXN0OworCQkJREJHMiAoICIgQkNBU1QiICk7CisJCX0KKworCQkvKiBBZGQgbGluay1sYXllciBoZWFkZXIgKi8KKwkJaWYgKCAoIHJjID0gbGxfcHJvdG9jb2wtPnB1c2ggKCBweGVfbmV0ZGV2LCBpb2J1ZiwgbGxfZGVzdCwKKwkJCQkJCXB4ZV9uZXRkZXYtPmxsX2FkZHIsCisJCQkJCQluZXRfcHJvdG9jb2wtPm5ldF9wcm90byApKSE9MCl7CisJCQlEQkcyICggIiBjb3VsZCBub3QgYWRkIGxpbmstbGF5ZXIgaGVhZGVyOiAlc1xuIiwKKwkJCSAgICAgICBzdHJlcnJvciAoIHJjICkgKTsKKwkJCWZyZWVfaW9iICggaW9idWYgKTsKKwkJCXVuZGlfdHJhbnNtaXQtPlN0YXR1cyA9IFBYRU5WX1NUQVRVUyAoIHJjICk7CisJCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCQl9CisJfQorCisJLyogRmxhZyB0cmFuc21pc3Npb24gYXMgaW4tcHJvZ3Jlc3MuICBEbyB0aGlzIGJlZm9yZSBzdGFydGluZworCSAqIHRvIHRyYW5zbWl0IHRoZSBwYWNrZXQsIGJlY2F1c2UgdGhlIElTUiBtYXkgdHJpZ2dlciBiZWZvcmUKKwkgKiB3ZSByZXR1cm4gZnJvbSBuZXRkZXZfdHgoKS4KKwkgKi8KKwl1bmRpX3R4X2NvdW50Kys7CisKKwkvKiBUcmFuc21pdCBwYWNrZXQgKi8KKwlEQkcyICggIlxuIiApOworCWlmICggKCByYyA9IG5ldGRldl90eCAoIHB4ZV9uZXRkZXYsIGlvYnVmICkgKSAhPSAwICkgeworCQlEQkcyICggIlBYRU5WX1VORElfVFJBTlNNSVQgY291bGQgbm90IHRyYW5zbWl0OiAlc1xuIiwKKwkJICAgICAgIHN0cmVycm9yICggcmMgKSApOworCQl1bmRpX3R4X2NvdW50LS07CisJCXVuZGlfdHJhbnNtaXQtPlN0YXR1cyA9IFBYRU5WX1NUQVRVUyAoIHJjICk7CisJCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7CisJfQorCisJdW5kaV90cmFuc21pdC0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyogUFhFTlZfVU5ESV9TRVRfTUNBU1RfQUREUkVTUworICoKKyAqIFN0YXR1czogd29ya2luZyAoZm9yIE5JQ3MgdGhhdCBzdXBwb3J0IHJlY2VpdmUtYWxsLW11bHRpY2FzdCkKKyAqLworUFhFTlZfRVhJVF90CitweGVudl91bmRpX3NldF9tY2FzdF9hZGRyZXNzICggc3RydWN0IHNfUFhFTlZfVU5ESV9TRVRfTUNBU1RfQUREUkVTUworCQkJICAgICAgICp1bmRpX3NldF9tY2FzdF9hZGRyZXNzICkgeworCURCRyAoICJQWEVOVl9VTkRJX1NFVF9NQ0FTVF9BRERSRVNTIiApOworCXB4ZV9kdW1wX21jYXN0X2xpc3QgKCAmdW5kaV9zZXRfbWNhc3RfYWRkcmVzcy0+Ul9NY2FzdF9CdWYgKTsKKwlEQkcgKCAiXG4iICk7CisKKwl1bmRpX3NldF9tY2FzdF9hZGRyZXNzLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKiBQWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFJFU1MKKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90IAorcHhlbnZfdW5kaV9zZXRfc3RhdGlvbl9hZGRyZXNzICggc3RydWN0IHNfUFhFTlZfVU5ESV9TRVRfU1RBVElPTl9BRERSRVNTCisJCQkJICp1bmRpX3NldF9zdGF0aW9uX2FkZHJlc3MgKSB7CisJc3RydWN0IGxsX3Byb3RvY29sICpsbF9wcm90b2NvbCA9IHB4ZV9uZXRkZXYtPmxsX3Byb3RvY29sOworCisJREJHICggIlBYRU5WX1VORElfU0VUX1NUQVRJT05fQUREUkVTUyAlcyIsCisJICAgICAgbGxfcHJvdG9jb2wtPm50b2EgKCB1bmRpX3NldF9zdGF0aW9uX2FkZHJlc3MtPlN0YXRpb25BZGRyZXNzICkgKTsKKworCS8qIElmIGFkYXB0ZXIgaXMgb3BlbiwgdGhlIGNoYW5nZSB3aWxsIGhhdmUgbm8gZWZmZWN0OyByZXR1cm4KKwkgKiBhbiBlcnJvcgorCSAqLworCWlmICggcHhlX25ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApIHsKKwkJREJHICggIiBmYWlsZWQ6IG5ldGRldiBpcyBvcGVuXG4iICk7CisJCXVuZGlfc2V0X3N0YXRpb25fYWRkcmVzcy0+U3RhdHVzID0KKwkJCVBYRU5WX1NUQVRVU19VTkRJX0lOVkFMSURfU1RBVEU7CisJCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7CisJfQorCisJLyogVXBkYXRlIE1BQyBhZGRyZXNzICovCisJbWVtY3B5ICggcHhlX25ldGRldi0+bGxfYWRkciwKKwkJICZ1bmRpX3NldF9zdGF0aW9uX2FkZHJlc3MtPlN0YXRpb25BZGRyZXNzLAorCQkgbGxfcHJvdG9jb2wtPmxsX2FkZHJfbGVuICk7CisKKwlEQkcgKCAiXG4iICk7CisJdW5kaV9zZXRfc3RhdGlvbl9hZGRyZXNzLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKiBQWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSCisgKgorICogU3RhdHVzOiB3b24ndCBpbXBsZW1lbnQgKHdvdWxkIHJlcXVpcmUgZHJpdmVyIEFQSSBjaGFuZ2VzIGZvciBubworICogcmVhbCBiZW5lZml0KQorICovCitQWEVOVl9FWElUX3QKK3B4ZW52X3VuZGlfc2V0X3BhY2tldF9maWx0ZXIgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSCisJCQkgICAgICAgKnVuZGlfc2V0X3BhY2tldF9maWx0ZXIgKSB7CisKKwlEQkcgKCAiUFhFTlZfVU5ESV9TRVRfUEFDS0VUX0ZJTFRFUiAlMDJ4XG4iLAorCSAgICAgIHVuZGlfc2V0X3BhY2tldF9maWx0ZXItPmZpbHRlciApOworCisJLyogUHJldGVuZCB0aGF0IHdlIHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIHRoZSAzQ29tIERPUyBVTkRJCisJICogZHJpdmVyIHJlZnVzZXMgdG8gbG9hZC4gIChXZSBpZ25vcmUgdGhlIGZpbHRlciB2YWx1ZSBpbiB0aGUKKwkgKiBQWEVOVl9VTkRJX09QRU4gY2FsbCBhbnl3YXkuKQorCSAqLworCXVuZGlfc2V0X3BhY2tldF9maWx0ZXItPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyogUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT04KKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfZ2V0X2luZm9ybWF0aW9uICggc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT04KKwkJCQkJICAqdW5kaV9nZXRfaW5mb3JtYXRpb24gKSB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcHhlX25ldGRldi0+ZGV2OworCXN0cnVjdCBsbF9wcm90b2NvbCAqbGxfcHJvdG9jb2wgPSBweGVfbmV0ZGV2LT5sbF9wcm90b2NvbDsKKwlzaXplX3QgbGxfYWRkcl9sZW4gPSBsbF9wcm90b2NvbC0+bGxfYWRkcl9sZW47CisKKwlEQkcgKCAiUFhFTlZfVU5ESV9HRVRfSU5GT1JNQVRJT04iICk7CisKKwl1bmRpX2dldF9pbmZvcm1hdGlvbi0+QmFzZUlvID0gZGV2LT5kZXNjLmlvYWRkcjsKKwl1bmRpX2dldF9pbmZvcm1hdGlvbi0+SW50TnVtYmVyID0gZGV2LT5kZXNjLmlycTsKKwkvKiBDaGVhdDogYXNzdW1lIGFsbCBjYXJkcyBjYW4gY29wZSB3aXRoIHRoaXMgKi8KKwl1bmRpX2dldF9pbmZvcm1hdGlvbi0+TWF4VHJhblVuaXQgPSBFVEhfTUFYX01UVTsKKwl1bmRpX2dldF9pbmZvcm1hdGlvbi0+SHdUeXBlID0gbnRvaHMgKCBsbF9wcm90b2NvbC0+bGxfcHJvdG8gKTsKKwl1bmRpX2dldF9pbmZvcm1hdGlvbi0+SHdBZGRyTGVuID0gbGxfYWRkcl9sZW47CisJYXNzZXJ0ICggbGxfYWRkcl9sZW4gPD0KKwkJIHNpemVvZiAoIHVuZGlfZ2V0X2luZm9ybWF0aW9uLT5DdXJyZW50Tm9kZUFkZHJlc3MgKSApOworCW1lbWNweSAoICZ1bmRpX2dldF9pbmZvcm1hdGlvbi0+Q3VycmVudE5vZGVBZGRyZXNzLAorCQkgcHhlX25ldGRldi0+bGxfYWRkciwKKwkJIHNpemVvZiAoIHVuZGlfZ2V0X2luZm9ybWF0aW9uLT5DdXJyZW50Tm9kZUFkZHJlc3MgKSApOworCWxsX3Byb3RvY29sLT5pbml0X2FkZHIgKCBweGVfbmV0ZGV2LT5od19hZGRyLAorCQkJCSAmdW5kaV9nZXRfaW5mb3JtYXRpb24tPlBlcm1Ob2RlQWRkcmVzcyApOworCXVuZGlfZ2V0X2luZm9ybWF0aW9uLT5ST01BZGRyZXNzID0gMDsKKwkJLyogbmljLnJvbV9pbmZvLT5yb21fc2VnbWVudDsgKi8KKwkvKiBXZSBvbmx5IHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gcmVjZWl2ZSBvciB0cmFuc21pdCBhIHNpbmdsZQorCSAqIHBhY2tldCBhdCBhIHRpbWUuICBUaGlzIGlzIGEgYm9vdGxvYWRlciwgbm90IGFuIE9TLgorCSAqLworCXVuZGlfZ2V0X2luZm9ybWF0aW9uLT5SeEJ1ZkN0ID0gMTsKKwl1bmRpX2dldF9pbmZvcm1hdGlvbi0+VHhCdWZDdCA9IDE7CisKKwlEQkcgKCAiIGlvICUwNHggaXJxICVkIG10dSAlZCAlcyAlc1xuIiwKKwkgICAgICB1bmRpX2dldF9pbmZvcm1hdGlvbi0+QmFzZUlvLCB1bmRpX2dldF9pbmZvcm1hdGlvbi0+SW50TnVtYmVyLAorCSAgICAgIHVuZGlfZ2V0X2luZm9ybWF0aW9uLT5NYXhUcmFuVW5pdCwgbGxfcHJvdG9jb2wtPm5hbWUsCisJICAgICAgbGxfcHJvdG9jb2wtPm50b2EgKCAmdW5kaV9nZXRfaW5mb3JtYXRpb24tPkN1cnJlbnROb2RlQWRkcmVzcyApKTsKKwl1bmRpX2dldF9pbmZvcm1hdGlvbi0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIFBYRU5WX0VYSVRfU1VDQ0VTUzsKK30KKworLyogUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUworICoKKyAqIFN0YXR1czogd29ya2luZworICovCitQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9nZXRfc3RhdGlzdGljcyAoIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX1NUQVRJU1RJQ1MKKwkJCQkJICp1bmRpX2dldF9zdGF0aXN0aWNzICkgeworCURCRyAoICJQWEVOVl9VTkRJX0dFVF9TVEFUSVNUSUNTIiApOworCisJdW5kaV9nZXRfc3RhdGlzdGljcy0+WG10R29vZEZyYW1lcyA9IHB4ZV9uZXRkZXYtPnR4X3N0YXRzLmdvb2Q7CisJdW5kaV9nZXRfc3RhdGlzdGljcy0+UmN2R29vZEZyYW1lcyA9IHB4ZV9uZXRkZXYtPnJ4X3N0YXRzLmdvb2Q7CisJdW5kaV9nZXRfc3RhdGlzdGljcy0+UmN2Q1JDRXJyb3JzID0gcHhlX25ldGRldi0+cnhfc3RhdHMuYmFkOworCXVuZGlfZ2V0X3N0YXRpc3RpY3MtPlJjdlJlc291cmNlRXJyb3JzID0gcHhlX25ldGRldi0+cnhfc3RhdHMuYmFkOworCisJREJHICggIiB0eG9rICVkIHJ4b2sgJWQgcnhjcmMgJWQgcnhyc3JjICVkXG4iLAorCSAgICAgIHVuZGlfZ2V0X3N0YXRpc3RpY3MtPlhtdEdvb2RGcmFtZXMsCisJICAgICAgdW5kaV9nZXRfc3RhdGlzdGljcy0+UmN2R29vZEZyYW1lcywKKwkgICAgICB1bmRpX2dldF9zdGF0aXN0aWNzLT5SY3ZDUkNFcnJvcnMsCisJICAgICAgdW5kaV9nZXRfc3RhdGlzdGljcy0+UmN2UmVzb3VyY2VFcnJvcnMgKTsKKwl1bmRpX2dldF9zdGF0aXN0aWNzLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKiBQWEVOVl9VTkRJX0NMRUFSX1NUQVRJU1RJQ1MKKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfY2xlYXJfc3RhdGlzdGljcyAoIHN0cnVjdCBzX1BYRU5WX1VORElfQ0xFQVJfU1RBVElTVElDUworCQkJCQkgICAqdW5kaV9jbGVhcl9zdGF0aXN0aWNzICkgeworCURCRyAoICJQWEVOVl9VTkRJX0NMRUFSX1NUQVRJU1RJQ1NcbiIgKTsKKworCW1lbXNldCAoICZweGVfbmV0ZGV2LT50eF9zdGF0cywgMCwgc2l6ZW9mICggcHhlX25ldGRldi0+dHhfc3RhdHMgKSApOworCW1lbXNldCAoICZweGVfbmV0ZGV2LT5yeF9zdGF0cywgMCwgc2l6ZW9mICggcHhlX25ldGRldi0+cnhfc3RhdHMgKSApOworCisJdW5kaV9jbGVhcl9zdGF0aXN0aWNzLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKiBQWEVOVl9VTkRJX0lOSVRJQVRFX0RJQUdTCisgKgorICogU3RhdHVzOiB3b24ndCBpbXBsZW1lbnQgKHdvdWxkIHJlcXVpcmUgZHJpdmVyIEFQSSBjaGFuZ2VzIGZvciBubworICogcmVhbCBiZW5lZml0KQorICovCitQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9pbml0aWF0ZV9kaWFncyAoIHN0cnVjdCBzX1BYRU5WX1VORElfSU5JVElBVEVfRElBR1MKKwkJCQkJICp1bmRpX2luaXRpYXRlX2RpYWdzICkgeworCURCRyAoICJQWEVOVl9VTkRJX0lOSVRJQVRFX0RJQUdTIGZhaWxlZDogdW5zdXBwb3J0ZWRcbiIgKTsKKworCXVuZGlfaW5pdGlhdGVfZGlhZ3MtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19VTlNVUFBPUlRFRDsKKwlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworfQorCisvKiBQWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVAorICoKKyAqIFN0YXR1czogd29uJ3QgaW1wbGVtZW50ICh3b3VsZCByZXF1aXJlIGRyaXZlciBBUEkgY2hhbmdlcyBmb3Igbm8KKyAqIHBlcmNlcHRpYmxlIGJlbmVmaXQpCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91bmRpX2ZvcmNlX2ludGVycnVwdCAoIHN0cnVjdCBzX1BYRU5WX1VORElfRk9SQ0VfSU5URVJSVVBUCisJCQkJCSAgKnVuZGlfZm9yY2VfaW50ZXJydXB0ICkgeworCURCRyAoICJQWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVCBmYWlsZWQ6IHVuc3VwcG9ydGVkXG4iICk7CisKKwl1bmRpX2ZvcmNlX2ludGVycnVwdC0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX1VOU1VQUE9SVEVEOworCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7Cit9CisKKy8qIFBYRU5WX1VORElfR0VUX01DQVNUX0FERFJFU1MKKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90CitweGVudl91bmRpX2dldF9tY2FzdF9hZGRyZXNzICggc3RydWN0IHNfUFhFTlZfVU5ESV9HRVRfTUNBU1RfQUREUkVTUworCQkJICAgICAgICp1bmRpX2dldF9tY2FzdF9hZGRyZXNzICkgeworCXN0cnVjdCBsbF9wcm90b2NvbCAqbGxfcHJvdG9jb2wgPSBweGVfbmV0ZGV2LT5sbF9wcm90b2NvbDsKKwlzdHJ1Y3QgaW5fYWRkciBpcCA9IHsgLnNfYWRkciA9IHVuZGlfZ2V0X21jYXN0X2FkZHJlc3MtPkluZXRBZGRyIH07CisJaW50IHJjOworCisJREJHICggIlBYRU5WX1VORElfR0VUX01DQVNUX0FERFJFU1MgJXMiLCBpbmV0X250b2EgKCBpcCApICk7CisKKwlpZiAoICggcmMgPSBsbF9wcm90b2NvbC0+bWNfaGFzaCAoIEFGX0lORVQsICZpcCwKKwkJCQkgICAgICB1bmRpX2dldF9tY2FzdF9hZGRyZXNzLT5NZWRpYUFkZHIgKSkhPTApeworCQlEQkcgKCAiIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yICggcmMgKSApOworCQl1bmRpX2dldF9tY2FzdF9hZGRyZXNzLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVMgKCByYyApOworCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCX0KKwlEQkcgKCAiPT4lc1xuIiwKKwkgICAgICBsbF9wcm90b2NvbC0+bnRvYSAoIHVuZGlfZ2V0X21jYXN0X2FkZHJlc3MtPk1lZGlhQWRkciApICk7CisKKwl1bmRpX2dldF9tY2FzdF9hZGRyZXNzLT5TdGF0dXMgPSBQWEVOVl9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gUFhFTlZfRVhJVF9TVUNDRVNTOworfQorCisvKiBQWEVOVl9VTkRJX0dFVF9OSUNfVFlQRQorICoKKyAqIFN0YXR1czogd29ya2luZworICovCitQWEVOVl9FWElUX3QgcHhlbnZfdW5kaV9nZXRfbmljX3R5cGUgKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9OSUNfVFlQRQorCQkJCSAgICAgICAqdW5kaV9nZXRfbmljX3R5cGUgKSB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcHhlX25ldGRldi0+ZGV2OworCisJREJHICggIlBYRU5WX1VORElfR0VUX05JQ19UWVBFIiApOworCisJbWVtc2V0ICggJnVuZGlfZ2V0X25pY190eXBlLT5pbmZvLCAwLAorCQkgc2l6ZW9mICggdW5kaV9nZXRfbmljX3R5cGUtPmluZm8gKSApOworCisJc3dpdGNoICggZGV2LT5kZXNjLmJ1c190eXBlICkgeworCWNhc2UgQlVTX1RZUEVfUENJOiB7CisJCXN0cnVjdCBwY2lfbmljX2luZm8gKmluZm8gPSAmdW5kaV9nZXRfbmljX3R5cGUtPmluZm8ucGNpOworCisJCXVuZGlfZ2V0X25pY190eXBlLT5OaWNUeXBlID0gUENJX05JQzsKKwkJaW5mby0+VmVuZG9yX0lEID0gZGV2LT5kZXNjLnZlbmRvcjsKKwkJaW5mby0+RGV2X0lEID0gZGV2LT5kZXNjLmRldmljZTsKKwkJaW5mby0+QmFzZV9DbGFzcyA9IFBDSV9CQVNFX0NMQVNTICggZGV2LT5kZXNjLmNsYXNzICk7CisJCWluZm8tPlN1Yl9DbGFzcyA9IFBDSV9TVUJfQ0xBU1MgKCBkZXYtPmRlc2MuY2xhc3MgKTsKKwkJaW5mby0+UHJvZ19JbnRmID0gUENJX1BST0dfSU5URiAoIGRldi0+ZGVzYy5jbGFzcyApOworCQlpbmZvLT5CdXNEZXZGdW5jID0gZGV2LT5kZXNjLmxvY2F0aW9uOworCQkvKiBDaGVhdDogcmVtYWluaW5nIGZpZWxkcyBhcmUgcHJvYmFibHkgdW5uZWNlc3NhcnksCisJCSAqIGFuZCB3b3VsZCByZXF1aXJlIGFkZGluZyBleHRyYSBjb2RlIHRvIHBjaS5jLgorCQkgKi8KKwkJdW5kaV9nZXRfbmljX3R5cGUtPmluZm8ucGNpLlN1YlZlbmRvcl9JRCA9IDB4ZmZmZjsKKwkJdW5kaV9nZXRfbmljX3R5cGUtPmluZm8ucGNpLlN1YkRldmljZV9JRCA9IDB4ZmZmZjsKKwkJREJHICggIiBQQ0kgJTAyeDolMDJ4LiV4ICUwNHg6JTA0eCAoJTA0eDolMDR4KSAlMDJ4JTAyeCUwMnggIgorCQkgICAgICAicmV2ICUwMnhcbiIsIFBDSV9CVVMgKCBpbmZvLT5CdXNEZXZGdW5jICksCisJCSAgICAgIFBDSV9TTE9UICggaW5mby0+QnVzRGV2RnVuYyApLAorCQkgICAgICBQQ0lfRlVOQyAoIGluZm8tPkJ1c0RldkZ1bmMgKSwgaW5mby0+VmVuZG9yX0lELAorCQkgICAgICBpbmZvLT5EZXZfSUQsIGluZm8tPlN1YlZlbmRvcl9JRCwgaW5mby0+U3ViRGV2aWNlX0lELAorCQkgICAgICBpbmZvLT5CYXNlX0NsYXNzLCBpbmZvLT5TdWJfQ2xhc3MsIGluZm8tPlByb2dfSW50ZiwKKwkJICAgICAgaW5mby0+UmV2ICk7CisJCWJyZWFrOyB9CisJY2FzZSBCVVNfVFlQRV9JU0FQTlA6IHsKKwkJc3RydWN0IHBucF9uaWNfaW5mbyAqaW5mbyA9ICZ1bmRpX2dldF9uaWNfdHlwZS0+aW5mby5wbnA7CisKKwkJdW5kaV9nZXRfbmljX3R5cGUtPk5pY1R5cGUgPSBQblBfTklDOworCQlpbmZvLT5FSVNBX0Rldl9JRCA9ICggKCBkZXYtPmRlc2MudmVuZG9yIDw8IDE2ICkgfAorCQkJCSAgICAgIGRldi0+ZGVzYy5kZXZpY2UgKTsKKwkJaW5mby0+Q2FyZFNlbE51bSA9IGRldi0+ZGVzYy5sb2NhdGlvbjsKKwkJLyogQ2hlYXQ6IHJlbWFpbmluZyBmaWVsZHMgYXJlIHByb2JhYmx5IHVubmVjZXNzYXJ5LAorCQkgKiBhbmQgd291bGQgcmVxdWlyZSBhZGRpbmcgZXh0cmEgY29kZSB0byBpc2FwbnAuYy4KKwkJICovCisJCURCRyAoICIgSVNBUG5QIENTTiAlMDR4ICUwOHggJTAyeCUwMnglMDJ4XG4iLAorCQkgICAgICBpbmZvLT5DYXJkU2VsTnVtLCBpbmZvLT5FSVNBX0Rldl9JRCwKKwkJICAgICAgaW5mby0+QmFzZV9DbGFzcywgaW5mby0+U3ViX0NsYXNzLCBpbmZvLT5Qcm9nX0ludGYgKTsKKwkJYnJlYWs7IH0KKwlkZWZhdWx0OgorCQlEQkcgKCAiIGZhaWxlZDogdW5rbm93biBidXMgdHlwZVxuIiApOworCQl1bmRpX2dldF9uaWNfdHlwZS0+U3RhdHVzID0gUFhFTlZfU1RBVFVTX0ZBSUxVUkU7CisJCXJldHVybiBQWEVOVl9FWElUX0ZBSUxVUkU7CisJfQorCisJdW5kaV9nZXRfbmljX3R5cGUtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CisKKy8qIFBYRU5WX1VORElfR0VUX0lGQUNFX0lORk8KKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfZ2V0X2lmYWNlX2luZm8gKCBzdHJ1Y3Qgc19QWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPCisJCQkJCSAqdW5kaV9nZXRfaWZhY2VfaW5mbyApIHsKKwlEQkcgKCAiUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GTyIgKTsKKworCS8qIEp1c3QgaGFuZCBiYWNrIHNvbWUgaW5mbywgZG9lc24ndCByZWFsbHkgbWF0dGVyIHdoYXQgaXQgaXMuCisJICogTW9zdCBQWEUgc3RhY2tzIHNlZW0gdG8gdGFrZSB0aGlzIGFwcHJvYWNoLgorCSAqLworCXNucHJpbnRmICggKCBjaGFyICogKSB1bmRpX2dldF9pZmFjZV9pbmZvLT5JZmFjZVR5cGUsCisJCSAgIHNpemVvZiAoIHVuZGlfZ2V0X2lmYWNlX2luZm8tPklmYWNlVHlwZSApLCAiRElYKzgwMi4zIiApOworCXVuZGlfZ2V0X2lmYWNlX2luZm8tPkxpbmtTcGVlZCA9IDEwMDAwMDAwOyAvKiAxMCBNYnBzICovCisJdW5kaV9nZXRfaWZhY2VfaW5mby0+U2VydmljZUZsYWdzID0KKwkJKCBTVVBQT1JURURfQlJPQURDQVNUIHwgU1VQUE9SVEVEX01VTFRJQ0FTVCB8CisJCSAgU1VQUE9SVEVEX1NFVF9TVEFUSU9OX0FERFJFU1MgfCBTVVBQT1JURURfUkVTRVQgfAorCQkgIFNVUFBPUlRFRF9PUEVOX0NMT1NFIHwgU1VQUE9SVEVEX0lSUSApOworCW1lbXNldCAoIHVuZGlfZ2V0X2lmYWNlX2luZm8tPlJlc2VydmVkLCAwLAorCQkgc2l6ZW9mKHVuZGlfZ2V0X2lmYWNlX2luZm8tPlJlc2VydmVkKSApOworCisJREJHICggIiAlcyAlZGJwcyBmbGFncyAlMDh4XG4iLCB1bmRpX2dldF9pZmFjZV9pbmZvLT5JZmFjZVR5cGUsCisJICAgICAgdW5kaV9nZXRfaWZhY2VfaW5mby0+TGlua1NwZWVkLAorCSAgICAgIHVuZGlfZ2V0X2lmYWNlX2luZm8tPlNlcnZpY2VGbGFncyApOworCXVuZGlfZ2V0X2lmYWNlX2luZm8tPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CisKKy8qIFBYRU5WX1VORElfR0VUX1NUQVRFCisgKgorICogU3RhdHVzOiBpbXBvc3NpYmxlCisgKi8KK1BYRU5WX0VYSVRfdCBweGVudl91bmRpX2dldF9zdGF0ZSAoIHN0cnVjdCBzX1BYRU5WX1VORElfR0VUX1NUQVRFCisJCQkJICAgICp1bmRpX2dldF9zdGF0ZSApIHsKKwlEQkcgKCAiUFhFTlZfVU5ESV9HRVRfU1RBVEUgZmFpbGVkOiB1bnN1cHBvcnRlZFxuIiApOworCisJdW5kaV9nZXRfc3RhdGUtPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19VTlNVUFBPUlRFRDsKKwlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworfTsKKworLyogUFhFTlZfVU5ESV9JU1IKKyAqCisgKiBTdGF0dXM6IHdvcmtpbmcKKyAqLworUFhFTlZfRVhJVF90IHB4ZW52X3VuZGlfaXNyICggc3RydWN0IHNfUFhFTlZfVU5ESV9JU1IgKnVuZGlfaXNyICkgeworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXNpemVfdCBsZW47CisJc3RydWN0IGxsX3Byb3RvY29sICpsbF9wcm90b2NvbDsKKwljb25zdCB2b2lkICpsbF9kZXN0OworCWNvbnN0IHZvaWQgKmxsX3NvdXJjZTsKKwl1aW50MTZfdCBuZXRfcHJvdG87CisJc2l6ZV90IGxsX2hsZW47CisJc3RydWN0IG5ldF9wcm90b2NvbCAqbmV0X3Byb3RvY29sOworCXVuc2lnbmVkIGludCBwcm90dHlwZTsKKwlpbnQgcmM7CisKKwkvKiBVc2UgY29sb3VyZWQgZGVidWcsIHNpbmNlIFVOREkgSVNSIG1lc3NhZ2VzIGFyZSBsaWtlbHkgdG8KKwkgKiBiZSBpbnRlcnNwZXJzZWQgYW1vbmdzdCBvdGhlciBVTkRJIG1lc3NhZ2VzLgorCSAqLworCURCR0MyICggJnB4ZW52X3VuZGlfaXNyLCAiUFhFTlZfVU5ESV9JU1IiICk7CisKKwkvKiBKdXN0IGluIGNhc2Ugc29tZSBpZGlvdCBhY3R1YWxseSBsb29rcyBhdCB0aGVzZSBmaWVsZHMgd2hlbgorCSAqIHdlIHdlcmVuJ3QgbWVhbnQgdG8gZmlsbCB0aGVtIGluLi4uCisJICovCisJdW5kaV9pc3ItPkJ1ZmZlckxlbmd0aCA9IDA7CisJdW5kaV9pc3ItPkZyYW1lTGVuZ3RoID0gMDsKKwl1bmRpX2lzci0+RnJhbWVIZWFkZXJMZW5ndGggPSAwOworCXVuZGlfaXNyLT5Qcm90VHlwZSA9IDA7CisJdW5kaV9pc3ItPlBrdFR5cGUgPSAwOworCisJc3dpdGNoICggdW5kaV9pc3ItPkZ1bmNGbGFnICkgeworCWNhc2UgUFhFTlZfVU5ESV9JU1JfSU5fU1RBUlQgOgorCQlEQkdDMiAoICZweGVudl91bmRpX2lzciwgIiBTVEFSVCIgKTsKKworCQkvKiBDYWxsIHBvbGwoKS4gIFRoaXMgc2hvdWxkIGFja25vd2xlZGdlIHRoZSBkZXZpY2UKKwkJICogaW50ZXJydXB0IGFuZCBxdWV1ZSB1cCBhbnkgcmVjZWl2ZWQgcGFja2V0LgorCQkgKi8KKwkJbmV0ZGV2X3BvbGwgKCBweGVfbmV0ZGV2ICk7CisKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHRvIGF2b2lkIGludGVycnVwdCBzdG9ybSAqLworCQluZXRkZXZfaXJxICggcHhlX25ldGRldiwgMCApOworCisJCS8qIEFsd2F5cyBzYXkgaXQgd2FzIG91cnMgZm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHkgKi8KKwkJREJHQzIgKCAmcHhlbnZfdW5kaV9pc3IsICIgT1VSUyIgKTsKKwkJdW5kaV9pc3ItPkZ1bmNGbGFnID0gUFhFTlZfVU5ESV9JU1JfT1VUX09VUlM7CisJCWJyZWFrOworCWNhc2UgUFhFTlZfVU5ESV9JU1JfSU5fUFJPQ0VTUyA6CisJY2FzZSBQWEVOVl9VTkRJX0lTUl9JTl9HRVRfTkVYVCA6CisJCURCR0MyICggJnB4ZW52X3VuZGlfaXNyLCAiICVzIiwKKwkJCSggKCB1bmRpX2lzci0+RnVuY0ZsYWcgPT0gUFhFTlZfVU5ESV9JU1JfSU5fUFJPQ0VTUyApID8KKwkJCSAgIlBST0NFU1MiIDogIkdFVF9ORVhUIiApICk7CisKKwkJLyogU29tZSBkdW1iIE5CUHMgKGUuZy4gZW1Cb290J3Mgd2luQm9vdC9pKSBuZXZlciBjYWxsCisJCSAqIFBYRU5WX1VORElfSVNSIHdpdGggRnVuY0ZsYWc9UFhFTlZfVU5ESV9JU1JfU1RBUlQ7CisJCSAqIHRoZXkganVzdCBzaXQgaW4gYSB0aWdodCBwb2xsaW5nIGxvb3AgbWVycmlseQorCQkgKiB2aW9sYXRpbmcgdGhlIFBYRSBzcGVjIHdpdGggcmVwZWF0ZWQgY2FsbHMgdG8KKwkJICogUFhFTlZfVU5ESV9JU1JfSU5fUFJPQ0VTUy4gIEZvcmNlIGV4dHJhIHBvbGxzIHRvCisJCSAqIGNvcGUgd2l0aCB0aGVzZSBvdXQtb2Ytc3BlYyBjbGllbnRzLgorCQkgKi8KKwkJbmV0ZGV2X3BvbGwgKCBweGVfbmV0ZGV2ICk7CisKKwkJLyogSWYgd2UgaGF2ZSBub3QgeWV0IG1hcmtlZCBhIFRYIGFzIGNvbXBsZXRlLCBhbmQgdGhlCisJCSAqIG5ldGRldiBUWCBxdWV1ZSBpcyBlbXB0eSwgcmVwb3J0IHRoZSBUWCBjb21wbGV0aW9uLgorCQkgKi8KKwkJaWYgKCB1bmRpX3R4X2NvdW50ICYmIGxpc3RfZW1wdHkgKCAmcHhlX25ldGRldi0+dHhfcXVldWUgKSApIHsKKwkJCURCR0MyICggJnB4ZW52X3VuZGlfaXNyLCAiIFRYQyIgKTsKKwkJCXVuZGlfdHhfY291bnQtLTsKKwkJCXVuZGlfaXNyLT5GdW5jRmxhZyA9IFBYRU5WX1VORElfSVNSX09VVF9UUkFOU01JVDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmVtb3ZlIGZpcnN0IHBhY2tldCBmcm9tIG5ldGRldiBSWCBxdWV1ZSAqLworCQlpb2J1ZiA9IG5ldGRldl9yeF9kZXF1ZXVlICggcHhlX25ldGRldiApOworCQlpZiAoICEgaW9idWYgKSB7CisJCQlEQkdDMiAoICZweGVudl91bmRpX2lzciwgIiBET05FIiApOworCQkJLyogTm8gbW9yZSBwYWNrZXRzIHJlbWFpbmluZyAqLworCQkJdW5kaV9pc3ItPkZ1bmNGbGFnID0gUFhFTlZfVU5ESV9JU1JfT1VUX0RPTkU7CisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAqLworCQkJbmV0ZGV2X2lycSAoIHB4ZV9uZXRkZXYsIDEgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQ29weSBwYWNrZXQgdG8gYmFzZSBtZW1vcnkgYnVmZmVyICovCisJCWxlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCQlEQkdDMiAoICZweGVudl91bmRpX2lzciwgIiBSWCIgKTsKKwkJaWYgKCBsZW4gPiBzaXplb2YgKCBiYXNlbWVtX3BhY2tldCApICkgeworCQkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJREJHQzIgKCAmcHhlbnZfdW5kaV9pc3IsICIgb3Zlcmxlbmd0aCAoJXp4KSIsIGxlbiApOworCQkJbGVuID0gc2l6ZW9mICggYmFzZW1lbV9wYWNrZXQgKTsKKwkJfQorCQltZW1jcHkgKCBiYXNlbWVtX3BhY2tldCwgaW9idWYtPmRhdGEsIGxlbiApOworCisJCS8qIFN0cmlwIGxpbmstbGF5ZXIgaGVhZGVyICovCisJCWxsX3Byb3RvY29sID0gcHhlX25ldGRldi0+bGxfcHJvdG9jb2w7CisJCWlmICggKCByYyA9IGxsX3Byb3RvY29sLT5wdWxsICggcHhlX25ldGRldiwgaW9idWYsICZsbF9kZXN0LAorCQkJCQkJJmxsX3NvdXJjZSwgJm5ldF9wcm90byApKSAhPTApeworCQkJLyogQXNzdW1lIHVua25vd24gbmV0X3Byb3RvIGFuZCBubyBsbF9zb3VyY2UgKi8KKwkJCW5ldF9wcm90byA9IDA7CisJCQlsbF9zb3VyY2UgPSBOVUxMOworCQl9CisJCWxsX2hsZW4gPSAoIGxlbiAtIGlvYl9sZW4gKCBpb2J1ZiApICk7CisKKwkJLyogRGV0ZXJtaW5lIG5ldHdvcmstbGF5ZXIgcHJvdG9jb2wgKi8KKwkJc3dpdGNoICggbmV0X3Byb3RvICkgeworCQljYXNlIGh0b25zICggRVRIX1BfSVAgKToKKwkJCW5ldF9wcm90b2NvbCA9ICZpcHY0X3Byb3RvY29sOworCQkJcHJvdHR5cGUgPSBQX0lQOworCQkJYnJlYWs7CisJCWNhc2UgaHRvbnMgKCBFVEhfUF9BUlAgKToKKwkJCW5ldF9wcm90b2NvbCA9ICZhcnBfcHJvdG9jb2w7CisJCQlwcm90dHlwZSA9IFBfQVJQOworCQkJYnJlYWs7CisJCWNhc2UgaHRvbnMgKCBFVEhfUF9SQVJQICk6CisJCQluZXRfcHJvdG9jb2wgPSAmcmFycF9wcm90b2NvbDsKKwkJCXByb3R0eXBlID0gUF9SQVJQOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQluZXRfcHJvdG9jb2wgPSBOVUxMOworCQkJcHJvdHR5cGUgPSBQX1VOS05PV047CisJCQlicmVhazsKKwkJfQorCisJCS8qIEZpbGwgaW4gVU5ESV9JU1Igc3RydWN0dXJlICovCisJCXVuZGlfaXNyLT5GdW5jRmxhZyA9IFBYRU5WX1VORElfSVNSX09VVF9SRUNFSVZFOworCQl1bmRpX2lzci0+QnVmZmVyTGVuZ3RoID0gbGVuOworCQl1bmRpX2lzci0+RnJhbWVMZW5ndGggPSBsZW47CisJCXVuZGlfaXNyLT5GcmFtZUhlYWRlckxlbmd0aCA9IGxsX2hsZW47CisJCXVuZGlfaXNyLT5GcmFtZS5zZWdtZW50ID0gcm1fZHM7CisJCXVuZGlfaXNyLT5GcmFtZS5vZmZzZXQgPSBfX2Zyb21fZGF0YTE2ICggYmFzZW1lbV9wYWNrZXQgKTsKKwkJdW5kaV9pc3ItPlByb3RUeXBlID0gcHJvdHR5cGU7CisJCXVuZGlfaXNyLT5Qa3RUeXBlID0gWE1UX0RFU1RBRERSOworCQlEQkdDMiAoICZweGVudl91bmRpX2lzciwgIiAlMDR4OiUwNHgrJXgoJXgpICVzIGhsZW4gJWQiLAorCQkJdW5kaV9pc3ItPkZyYW1lLnNlZ21lbnQsIHVuZGlfaXNyLT5GcmFtZS5vZmZzZXQsCisJCQl1bmRpX2lzci0+QnVmZmVyTGVuZ3RoLCB1bmRpX2lzci0+RnJhbWVMZW5ndGgsCisJCQkoIG5ldF9wcm90b2NvbCA/IG5ldF9wcm90b2NvbC0+bmFtZSA6ICJSQVciICksCisJCQl1bmRpX2lzci0+RnJhbWVIZWFkZXJMZW5ndGggKTsKKworCQkvKiBGcmVlIHBhY2tldCAqLworCQlmcmVlX2lvYiAoIGlvYnVmICk7CisJCWJyZWFrOworCWRlZmF1bHQgOgorCQlEQkdDMiAoICZweGVudl91bmRpX2lzciwgIiBJTlZBTElEKCUwNHgpXG4iLAorCQkJdW5kaV9pc3ItPkZ1bmNGbGFnICk7CisKKwkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQl1bmRpX2lzci0+RnVuY0ZsYWcgPSBQWEVOVl9VTkRJX0lTUl9PVVRfRE9ORTsKKwkJdW5kaV9pc3ItPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19VTkRJX0lOVkFMSURfUEFSQU1FVEVSOworCQlyZXR1cm4gUFhFTlZfRVhJVF9GQUlMVVJFOworCX0KKworCURCR0MyICggJnB4ZW52X3VuZGlfaXNyLCAiXG4iICk7CisJdW5kaV9pc3ItPlN0YXR1cyA9IFBYRU5WX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBQWEVOVl9FWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZXBhcmVudC9weGVwYXJlbnQuYyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2UvcHhlcGFyZW50L3B4ZXBhcmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MmRiNWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZXBhcmVudC9weGVwYXJlbnQuYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvZGhjcC5oPgorI2luY2x1ZGUgPHB4ZXBhcmVudC5oPgorI2luY2x1ZGUgPHB4ZV9hcGkuaD4KKyNpbmNsdWRlIDxweGVfdHlwZXMuaD4KKyNpbmNsdWRlIDxweGUuaD4KKworLyoqIEBmaWxlCisgKgorICogQ2FsbCBpbnRlcmZhY2UgdG8gcGFyZW50IFBYRSBzdGFjaworICoKKyAqLworCisvKioKKyAqIE5hbWUgUFhFIEFQSSBjYWxsCisgKgorICogQHYgZnVuY3Rpb24JCUFQSSBjYWxsIG51bWJlcgorICogQHJldCBuYW1lCQlBUEkgY2FsbCBuYW1lCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIGNvbnN0IGNoYXIgKgorcHhlcGFyZW50X2Z1bmN0aW9uX25hbWUgKCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24gKSB7CisJc3dpdGNoICggZnVuY3Rpb24gKSB7CisJY2FzZSBQWEVOVl9TVEFSVF9VTkRJOgorCQlyZXR1cm4gIlBYRU5WX1NUQVJUX1VOREkiOworCWNhc2UgUFhFTlZfU1RPUF9VTkRJOgorCQlyZXR1cm4gIlBYRU5WX1NUT1BfVU5ESSI7CisJY2FzZSBQWEVOVl9VTkRJX1NUQVJUVVA6CisJCXJldHVybiAiUFhFTlZfVU5ESV9TVEFSVFVQIjsKKwljYXNlIFBYRU5WX1VORElfQ0xFQU5VUDoKKwkJcmV0dXJuICJQWEVOVl9VTkRJX0NMRUFOVVAiOworCWNhc2UgUFhFTlZfVU5ESV9JTklUSUFMSVpFOgorCQlyZXR1cm4gIlBYRU5WX1VORElfSU5JVElBTElaRSI7CisJY2FzZSBQWEVOVl9VTkRJX1JFU0VUX0FEQVBURVI6CisJCXJldHVybiAiUFhFTlZfVU5ESV9SRVNFVF9BREFQVEVSIjsKKwljYXNlIFBYRU5WX1VORElfU0hVVERPV046CisJCXJldHVybiAiUFhFTlZfVU5ESV9TSFVURE9XTiI7CisJY2FzZSBQWEVOVl9VTkRJX09QRU46CisJCXJldHVybiAiUFhFTlZfVU5ESV9PUEVOIjsKKwljYXNlIFBYRU5WX1VORElfQ0xPU0U6CisJCXJldHVybiAiUFhFTlZfVU5ESV9DTE9TRSI7CisJY2FzZSBQWEVOVl9VTkRJX1RSQU5TTUlUOgorCQlyZXR1cm4gIlBYRU5WX1VORElfVFJBTlNNSVQiOworCWNhc2UgUFhFTlZfVU5ESV9TRVRfTUNBU1RfQUREUkVTUzoKKwkJcmV0dXJuICJQWEVOVl9VTkRJX1NFVF9NQ0FTVF9BRERSRVNTIjsKKwljYXNlIFBYRU5WX1VORElfU0VUX1NUQVRJT05fQUREUkVTUzoKKwkJcmV0dXJuICJQWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFJFU1MiOworCWNhc2UgUFhFTlZfVU5ESV9TRVRfUEFDS0VUX0ZJTFRFUjoKKwkJcmV0dXJuICJQWEVOVl9VTkRJX1NFVF9QQUNLRVRfRklMVEVSIjsKKwljYXNlIFBYRU5WX1VORElfR0VUX0lORk9STUFUSU9OOgorCQlyZXR1cm4gIlBYRU5WX1VORElfR0VUX0lORk9STUFUSU9OIjsKKwljYXNlIFBYRU5WX1VORElfR0VUX1NUQVRJU1RJQ1M6CisJCXJldHVybiAiUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUyI7CisJY2FzZSBQWEVOVl9VTkRJX0NMRUFSX1NUQVRJU1RJQ1M6CisJCXJldHVybiAiUFhFTlZfVU5ESV9DTEVBUl9TVEFUSVNUSUNTIjsKKwljYXNlIFBYRU5WX1VORElfSU5JVElBVEVfRElBR1M6CisJCXJldHVybiAiUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUyI7CisJY2FzZSBQWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVDoKKwkJcmV0dXJuICJQWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVCI7CisJY2FzZSBQWEVOVl9VTkRJX0dFVF9NQ0FTVF9BRERSRVNTOgorCQlyZXR1cm4gIlBYRU5WX1VORElfR0VUX01DQVNUX0FERFJFU1MiOworCWNhc2UgUFhFTlZfVU5ESV9HRVRfTklDX1RZUEU6CisJCXJldHVybiAiUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUiOworCWNhc2UgUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GTzoKKwkJcmV0dXJuICJQWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPIjsKKwkvKgorCSAqIER1cGxpY2F0ZSBjYXNlIHZhbHVlOyB0aGlzIGlzIGEgYnVnIGluIHRoZSBQWEUgc3BlY2lmaWNhdGlvbi4KKwkgKgorCSAqCWNhc2UgUFhFTlZfVU5ESV9HRVRfU1RBVEU6CisJICoJCXJldHVybiAiUFhFTlZfVU5ESV9HRVRfU1RBVEUiOworCSAqLworCWNhc2UgUFhFTlZfVU5ESV9JU1I6CisJCXJldHVybiAiUFhFTlZfVU5ESV9JU1IiOworCWNhc2UgUFhFTlZfR0VUX0NBQ0hFRF9JTkZPOgorCQlyZXR1cm4gIlBYRU5WX0dFVF9DQUNIRURfSU5GTyI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIEFQSSBDQUxMIjsKKwl9Cit9CisKKy8qKgorICogUFhFIHBhcmVudCBwYXJhbWV0ZXIgYmxvY2sKKyAqCisgKiBVc2VkIGFzIHRoZSBwYXJhbXRlciBibG9jayBmb3IgYWxsIHBhcmVudCBQWEUgQVBJIGNhbGxzLiAgUmVzaWRlcyBpbiBiYXNlCisgKiBtZW1vcnkuCisgKi8KK3N0YXRpYyB1bmlvbiB1X1BYRU5WX0FOWSBfX2JzczE2ICggcHhlcGFyZW50X3BhcmFtcyApOworI2RlZmluZSBweGVwYXJlbnRfcGFyYW1zIF9fdXNlX2RhdGExNiAoIHB4ZXBhcmVudF9wYXJhbXMgKQorCisvKiogUFhFIHBhcmVudCBlbnRyeSBwb2ludAorICoKKyAqIFVzZWQgYXMgdGhlIGluZGlyZWN0aW9uIHZlY3RvciBmb3IgYWxsIHBhcmVudCBQWEUgQVBJIGNhbGxzLiAgUmVzaWRlcyBpbgorICogYmFzZSBtZW1vcnkuCisgKi8KK1NFR09GRjE2X3QgX19ic3MxNiAoIHB4ZXBhcmVudF9lbnRyeV9wb2ludCApOworI2RlZmluZSBweGVwYXJlbnRfZW50cnlfcG9pbnQgX191c2VfZGF0YTE2ICggcHhlcGFyZW50X2VudHJ5X3BvaW50ICkKKworLyoqCisgKiBJc3N1ZSBwYXJlbnQgUFhFIEFQSSBjYWxsCisgKgorICogQHYgZW50cnkJCVBhcmVudCBQWEUgc3RhY2sgZW50cnkgcG9pbnQKKyAqIEB2IGZ1bmN0aW9uCQlBUEkgY2FsbCBudW1iZXIKKyAqIEB2IHBhcmFtcwkJUFhFIHBhcmFtZXRlciBibG9jaworICogQHYgcGFyYW1zX2xlbglMZW5ndGggb2YgUFhFIHBhcmFtZXRlciBibG9jaworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBweGVwYXJlbnRfY2FsbCAoIFNFR09GRjE2X3QgZW50cnksIHVuc2lnbmVkIGludCBmdW5jdGlvbiwKKwkJICAgICB2b2lkICpwYXJhbXMsIHNpemVfdCBwYXJhbXNfbGVuICkgeworCVBYRU5WX0VYSVRfdCBleGl0OworCWludCBkaXNjYXJkX2IsIGRpc2NhcmRfRDsKKwlpbnQgcmM7CisKKwkvKiBDb3B5IHBhcmFtZXRlciBibG9jayBhbmQgZW50cnkgcG9pbnQgKi8KKwlhc3NlcnQgKCBwYXJhbXNfbGVuIDw9IHNpemVvZiAoIHB4ZXBhcmVudF9wYXJhbXMgKSApOworCW1lbWNweSAoICZweGVwYXJlbnRfcGFyYW1zLCBwYXJhbXMsIHBhcmFtc19sZW4gKTsKKwltZW1jcHkgKCAmcHhlcGFyZW50X2VudHJ5X3BvaW50LCAmZW50cnksIHNpemVvZiAoIGVudHJ5ICkgKTsKKworCS8qIENhbGwgcmVhbC1tb2RlIGVudHJ5IHBvaW50LiAgVGhpcyBjYWxsaW5nIGNvbnZlbnRpb24gd2lsbAorCSAqIHdvcmsgd2l0aCBib3RoIHRoZSAhUFhFIGFuZCB0aGUgUFhFTlYrIGVudHJ5IHBvaW50cy4KKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFJFQUxfQ09ERSAoICJwdXNodyAlJWVzXG5cdCIKKwkJCQkJICAgInB1c2h3ICUlZGlcblx0IgorCQkJCQkgICAicHVzaHcgJSVieFxuXHQiCisJCQkJCSAgICJsY2FsbCAqcHhlcGFyZW50X2VudHJ5X3BvaW50XG5cdCIKKwkJCQkJICAgImFkZHcgJDYsICUlc3Bcblx0IiApCisJCQkgICAgICAgOiAiPWEiICggZXhpdCApLCAiPWIiICggZGlzY2FyZF9iICksCisJCQkgICAgICAgICAiPUQiICggZGlzY2FyZF9EICkKKwkJCSAgICAgICA6ICJiIiAoIGZ1bmN0aW9uICksCisJCQkgICAgICAgICAiRCIgKCBfX2Zyb21fZGF0YTE2ICggJnB4ZXBhcmVudF9wYXJhbXMgKSApCisJCQkgICAgICAgOiAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWJwIiApOworCisJLyogUFhFIEFQSSBjYWxscyBtYXkgcnVkZWx5IGNoYW5nZSB0aGUgc3RhdHVzIG9mIEEyMCBhbmQgbm90CisJICogYm90aGVyIHRvIHJlc3RvcmUgaXQgYWZ0ZXJ3YXJkcy4gIEludGVsIGlzIGtub3duIHRvIGJlCisJICogZ3VpbHR5IG9mIHRoaXMuCisJICoKKwkgKiBOb3RlIHRoYXQgd2Ugd2lsbCByZXR1cm4gdG8gdGhpcyBwb2ludCBldmVuIGlmIEEyMCBnZXRzCisJICogc2NyZXdlZCB1cCBieSB0aGUgcGFyZW50IFBYRSBzdGFjaywgYmVjYXVzZSBFdGhlcmJvb3QgYWx3YXlzCisJICogcmVzaWRlcyBpbiBhbiBldmVuIG1lZ2FieXRlIG9mIFJBTS4KKwkgKi8KKwlnYXRlQTIwX3NldCgpOworCisJLyogRGV0ZXJtaW5lIHJldHVybiBzdGF0dXMgY29kZSBiYXNlZCBvbiBQWEVOVl9FWElUIGFuZAorCSAqIFBYRU5WX1NUQVRVUworCSAqLworCWlmICggZXhpdCA9PSBQWEVOVl9FWElUX1NVQ0NFU1MgKSB7CisJCXJjID0gMDsKKwl9IGVsc2UgeworCQlyYyA9IC1weGVwYXJlbnRfcGFyYW1zLlN0YXR1czsKKwkJLyogUGFyYW5vaWE7IGRvbid0IHJldHVybiBzdWNjZXNzIGZvciB0aGUgY29tYmluYXRpb24KKwkJICogb2YgUFhFTlZfRVhJVF9GQUlMVVJFIGJ1dCBQWEVOVl9TVEFUVVNfU1VDQ0VTUworCQkgKi8KKwkJaWYgKCByYyA9PSAwICkKKwkJCXJjID0gLUVJTzsKKwl9CisKKwkvKiBJZiBhbnl0aGluZyBnb2VzIHdyb25nLCBwcmludCBhcyBtdWNoIGRlYnVnIGluZm9ybWF0aW9uIGFzCisJICogaXQncyBwb3NzaWJsZSB0byBnaXZlLgorCSAqLworCWlmICggcmMgIT0gMCApIHsKKwkJU0VHT0ZGMTZfdCBybV9wYXJhbXMgPSB7CisJCQkuc2VnbWVudCA9IHJtX2RzLAorCQkJLm9mZnNldCA9IF9fZnJvbV9kYXRhMTYgKCAmcHhlcGFyZW50X3BhcmFtcyApLAorCQl9OworCisJCURCRyAoICJQWEVQQVJFTlQgJXMgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIHB4ZXBhcmVudF9mdW5jdGlvbl9uYW1lICggZnVuY3Rpb24gKSwgc3RyZXJyb3IgKCByYyApICk7CisJCURCRyAoICJQWEVQQVJFTlQgcGFyYW1ldGVycyBhdCAlMDR4OiUwNHggbGVuZ3RoICIKKwkJICAgICAgICIlIzAyengsIGVudHJ5IHBvaW50IGF0ICUwNHg6JTA0eFxuIiwKKwkJICAgICAgIHJtX3BhcmFtcy5zZWdtZW50LCBybV9wYXJhbXMub2Zmc2V0LCBwYXJhbXNfbGVuLAorCQkgICAgICAgcHhlcGFyZW50X2VudHJ5X3BvaW50LnNlZ21lbnQsCisJCSAgICAgICBweGVwYXJlbnRfZW50cnlfcG9pbnQub2Zmc2V0ICk7CisJCURCRyAoICJQWEVQQVJFTlQgcGFyYW1ldGVycyBwcm92aWRlZDpcbiIgKTsKKwkJREJHX0hEQSAoIHJtX3BhcmFtcywgcGFyYW1zLCBwYXJhbXNfbGVuICk7CisJCURCRyAoICJQWEVQQVJFTlQgcGFyYW1ldGVycyByZXR1cm5lZDpcbiIgKTsKKwkJREJHX0hEQSAoIHJtX3BhcmFtcywgJnB4ZXBhcmVudF9wYXJhbXMsIHBhcmFtc19sZW4gKTsKKwl9CisKKwkvKiBDb3B5IHBhcmFtZXRlciBibG9jayBiYWNrICovCisJbWVtY3B5ICggcGFyYW1zLCAmcHhlcGFyZW50X3BhcmFtcywgcGFyYW1zX2xlbiApOworCisJcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3B4ZXBhcmVudC9weGVwYXJlbnRfZGhjcC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGVwYXJlbnQvcHhlcGFyZW50X2RoY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjA1OTQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9weGVwYXJlbnQvcHhlcGFyZW50X2RoY3AuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3AuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPHVuZGlwcmVsb2FkLmg+CisjaW5jbHVkZSA8cHhlcGFyZW50Lmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxweGVfYXBpLmg+CisKKy8qKgorICogUHJlc2VudCBjYWNoZWQgREhDUCBwYWNrZXQgaWYgaXQgZXhpc3RzCisgKi8KK3ZvaWQgX193ZWFrX2ltcGwgKCBnZXRfY2FjaGVkX2RoY3BhY2sgKSAoIHZvaWQgKSB7CisJc3RydWN0IHVuZGlfZGV2aWNlICp1bmRpOworCXN0cnVjdCBzX1BYRU5WX0dFVF9DQUNIRURfSU5GTyBnZXRfY2FjaGVkX2luZm87CisJaW50IHJjOworCisJLyogVXNlIHByZWxvYWRlZCBVTkRJIGRldmljZSB0byBnZXQgYXQgUFhFIGVudHJ5IHBvaW50ICovCisJdW5kaSA9ICZwcmVsb2FkZWRfdW5kaTsKKwlpZiAoICEgdW5kaS0+ZW50cnkuc2VnbWVudCApIHsKKwkJREJHICggIlBYRURIQ1Agbm8gcHJlbG9hZGVkIFVOREkgZGV2aWNlIGZvdW5kXG4iICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayB0aGF0IHN0YWNrIGlzIGF2YWlsYWJsZSB0byBnZXQgY2FjaGVkIGluZm8gKi8KKwlpZiAoICEgKCB1bmRpLT5mbGFncyAmIFVORElfRkxfS0VFUF9BTEwgKSApIHsKKwkJREJHICggIlBYRURIQ1Agc3RhY2sgd2FzIHVubG9hZGVkLCBubyBjYWNoZSBhdmFpbGFibGVcbiIgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE9idGFpbiBjYWNoZWQgREhDUCBwYWNrZXQgKi8KKwltZW1zZXQgKCAmZ2V0X2NhY2hlZF9pbmZvLCAwLCBzaXplb2YgKCBnZXRfY2FjaGVkX2luZm8gKSApOworCWdldF9jYWNoZWRfaW5mby5QYWNrZXRUeXBlID0gUFhFTlZfUEFDS0VUX1RZUEVfREhDUF9BQ0s7CisKKwlpZiAoICggcmMgPSBweGVwYXJlbnRfY2FsbCAoIHVuZGktPmVudHJ5LCBQWEVOVl9HRVRfQ0FDSEVEX0lORk8sCisJCQkJICAgICAmZ2V0X2NhY2hlZF9pbmZvLAorCQkJCSAgICAgc2l6ZW9mICggZ2V0X2NhY2hlZF9pbmZvICkgKSApICE9IDAgKSB7CisJCURCRyAoICJQWEVESENQIEdFVF9DQUNIRURfSU5GTyBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuOworCX0KKworCURCRyAoICJQWEVESENQIGdvdCBjYWNoZWQgaW5mbyBhdCAlMDR4OiUwNHggbGVuZ3RoICVkXG4iLAorCSAgICAgIGdldF9jYWNoZWRfaW5mby5CdWZmZXIuc2VnbWVudCwgZ2V0X2NhY2hlZF9pbmZvLkJ1ZmZlci5vZmZzZXQsCisJICAgICAgZ2V0X2NhY2hlZF9pbmZvLkJ1ZmZlclNpemUgKTsKKworCS8qIFByZXNlbnQgY2FjaGVkIERIQ1AgcGFja2V0ICovCisJc3RvcmVfY2FjaGVkX2RoY3BhY2sgKCByZWFsX3RvX3VzZXIgKCBnZXRfY2FjaGVkX2luZm8uQnVmZmVyLnNlZ21lbnQsCisJCQkJCSAgICAgIGdldF9jYWNoZWRfaW5mby5CdWZmZXIub2Zmc2V0ICksCisJCQkgICAgICAgZ2V0X2NhY2hlZF9pbmZvLkJ1ZmZlclNpemUgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2Uvc3lzbGludXgvY29tMzJfY2FsbC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9zeXNsaW51eC9jb20zMl9jYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjM2Y5MQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2Uvc3lzbGludXgvY29tMzJfY2FsbC5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERhbmllbCBWZXJrYW1wIDxkYW5pZWxAZHJ2Lm51Pi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZSBTWVNMSU5VWCBDT00zMiBoZWxwZXJzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHJlYWxtb2RlLmg+CisjaW5jbHVkZSA8Y29tYm9vdC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorCitzdGF0aWMgY29tMzJzeXNfdCBfX2JzczE2ICggY29tMzJfcmVncyApOworI2RlZmluZSBjb20zMl9yZWdzIF9fdXNlX2RhdGExNiAoIGNvbTMyX3JlZ3MgKQorCitzdGF0aWMgdWludDhfdCBfX2JzczE2ICggY29tMzJfaW50X3ZlY3RvciApOworI2RlZmluZSBjb20zMl9pbnRfdmVjdG9yIF9fdXNlX2RhdGExNiAoIGNvbTMyX2ludF92ZWN0b3IgKQorCitzdGF0aWMgdWludDMyX3QgX19ic3MxNiAoIGNvbTMyX2ZhcmNhbGxfcHJvYyApOworI2RlZmluZSBjb20zMl9mYXJjYWxsX3Byb2MgX191c2VfZGF0YTE2ICggY29tMzJfZmFyY2FsbF9wcm9jICkKKwordWludDE2X3QgX19ic3MxNiAoIGNvbTMyX3NhdmVkX3NwICk7CisKKy8qKgorICogSW50ZXJydXB0IGNhbGwgaGVscGVyCisgKi8KK3ZvaWQgX19hc21jYWxsIGNvbTMyX2ludGNhbGwgKCB1aW50OF90IGludGVycnVwdCwgcGh5c2FkZHJfdCBpbnJlZ3NfcGh5cywgcGh5c2FkZHJfdCBvdXRyZWdzX3BoeXMgKSB7CisKKwltZW1jcHlfdXNlciAoIHZpcnRfdG9fdXNlciggJmNvbTMyX3JlZ3MgKSwgMCwKKwkgICAgICAgICAgICAgIHBoeXNfdG9fdXNlciAoIGlucmVnc19waHlzICksIDAsCisJICAgICAgICAgICAgICBzaXplb2YoY29tMzJzeXNfdCkgKTsKKworCWNvbTMyX2ludF92ZWN0b3IgPSBpbnRlcnJ1cHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCVJFQUxfQ09ERSAoIC8qIFNhdmUgYWxsIHJlZ2lzdGVycyAqLworCQkgICAgICAgICAgICAicHVzaGFsXG5cdCIKKwkJICAgICAgICAgICAgInB1c2h3ICUlZHNcblx0IgorCQkgICAgICAgICAgICAicHVzaHcgJSVlc1xuXHQiCisJCSAgICAgICAgICAgICJwdXNodyAlJWZzXG5cdCIKKwkJICAgICAgICAgICAgInB1c2h3ICUlZ3Ncblx0IgorCQkgICAgICAgICAgICAvKiBNYXNrIG9mZiB1bnNhZmUgZmxhZ3MgKi8KKwkJICAgICAgICAgICAgIm1vdmwgKGNvbTMyX3JlZ3MgKyA0MCksICUlZWF4XG5cdCIKKwkJICAgICAgICAgICAgImFuZGwgJDB4MjAwY2Q3LCAlJWVheFxuXHQiCisJCSAgICAgICAgICAgICJtb3ZsICUlZWF4LCAoY29tMzJfcmVncyArIDQwKVxuXHQiCisJCSAgICAgICAgICAgIC8qIExvYWQgY29tMzJfcmVncyBpbnRvIHRoZSBhY3R1YWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAgICAgICJtb3Z3ICUlc3AsICUlc3M6KGNvbTMyX3NhdmVkX3NwKVxuXHQiCisJCSAgICAgICAgICAgICJtb3Z3ICRjb20zMl9yZWdzLCAlJXNwXG5cdCIKKwkJICAgICAgICAgICAgInBvcHcgJSVnc1xuXHQiCisJCSAgICAgICAgICAgICJwb3B3ICUlZnNcblx0IgorCQkgICAgICAgICAgICAicG9wdyAlJWVzXG5cdCIKKwkJICAgICAgICAgICAgInBvcHcgJSVkc1xuXHQiCisJCSAgICAgICAgICAgICJwb3BhbFxuXHQiCisJCSAgICAgICAgICAgICJwb3BmbFxuXHQiCisJCSAgICAgICAgICAgICJtb3Z3ICUlc3M6KGNvbTMyX3NhdmVkX3NwKSwgJSVzcFxuXHQiCisJCSAgICAgICAgICAgIC8qIHBhdGNoIElOVCBpbnN0cnVjdGlvbiAqLworCQkgICAgICAgICAgICAicHVzaHcgJSVheFxuXHQiCisJCSAgICAgICAgICAgICJtb3ZiICUlc3M6KGNvbTMyX2ludF92ZWN0b3IpLCAlJWFsXG5cdCIKKwkJICAgICAgICAgICAgIm1vdmIgJSVhbCwgJSVjczooY29tMzJfaW50Y2FsbF9pbnN0ciArIDEpXG5cdCIgCisJCSAgICAgICAgICAgIC8qIHBlcmZvcm0gYSBqdW1wIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggY2FjaGUKKwkJICAgICAgICAgICAgICogY29uc2lzdGVuY3kgaW4gc2VsZi1tb2RpZnlpbmcgY29kZSBvbiBzb21lIENQVXMgKDQ4NikKKwkJICAgICAgICAgICAgICovCisJCSAgICAgICAgICAgICJqbXAgMWZcbiIKKwkJICAgICAgICAgICAgIjE6XG5cdCIKKwkJICAgICAgICAgICAgInBvcHcgJSVheFxuXHQiCisJCSAgICAgICAgICAgICJjb20zMl9pbnRjYWxsX2luc3RyOlxuXHQiCisJCSAgICAgICAgICAgIC8qIElOVCBpbnN0cnVjdGlvbiB0byBiZSBwYXRjaGVkICovCisJCSAgICAgICAgICAgICJpbnQgJDB4RkZcblx0IgorCQkgICAgICAgICAgICAvKiBDb3B5IHJlZ3MgYmFjayB0byBjb20zMl9yZWdzICovCisJCSAgICAgICAgICAgICJtb3Z3ICUlc3AsICUlc3M6KGNvbTMyX3NhdmVkX3NwKVxuXHQiCisJCSAgICAgICAgICAgICJtb3Z3ICQoY29tMzJfcmVncyArIDQ0KSwgJSVzcFxuXHQiCisJCSAgICAgICAgICAgICJwdXNoZmxcblx0IgorCQkgICAgICAgICAgICAicHVzaGFsXG5cdCIKKwkJICAgICAgICAgICAgInB1c2h3ICUlZHNcblx0IgorCQkgICAgICAgICAgICAicHVzaHcgJSVlc1xuXHQiCisJCSAgICAgICAgICAgICJwdXNodyAlJWZzXG5cdCIKKwkJICAgICAgICAgICAgInB1c2h3ICUlZ3Ncblx0IgorCQkgICAgICAgICAgICAibW92dyAlJXNzOihjb20zMl9zYXZlZF9zcCksICUlc3Bcblx0IgorCQkgICAgICAgICAgICAvKiBSZXN0b3JlIHJlZ2lzdGVycyAqLworCQkgICAgICAgICAgICAicG9wdyAlJWdzXG5cdCIKKwkJICAgICAgICAgICAgInBvcHcgJSVmc1xuXHQiCisJCSAgICAgICAgICAgICJwb3B3ICUlZXNcblx0IgorCQkgICAgICAgICAgICAicG9wdyAlJWRzXG5cdCIKKwkJICAgICAgICAgICAgInBvcGFsXG5cdCIpCisJCSAgICAgICAgICAgIDogOiApOworCisJaWYgKCBvdXRyZWdzX3BoeXMgKSB7CisJCW1lbWNweV91c2VyICggcGh5c190b191c2VyICggb3V0cmVnc19waHlzICksIDAsCisJCSAgICAgICAgICAgICAgdmlydF90b191c2VyKCAmY29tMzJfcmVncyApLCAwLCAKKwkJICAgICAgICAgICAgICBzaXplb2YoY29tMzJzeXNfdCkgKTsKKwl9Cit9CisKKy8qKgorICogRmFyY2FsbCBoZWxwZXIKKyAqLwordm9pZCBfX2FzbWNhbGwgY29tMzJfZmFyY2FsbCAoIHVpbnQzMl90IHByb2MsIHBoeXNhZGRyX3QgaW5yZWdzX3BoeXMsIHBoeXNhZGRyX3Qgb3V0cmVnc19waHlzICkgeworCisJbWVtY3B5X3VzZXIgKCB2aXJ0X3RvX3VzZXIoICZjb20zMl9yZWdzICksIDAsCisJICAgICAgICAgICAgICBwaHlzX3RvX3VzZXIgKCBpbnJlZ3NfcGh5cyApLCAwLAorCSAgICAgICAgICAgICAgc2l6ZW9mKGNvbTMyc3lzX3QpICk7CisKKwljb20zMl9mYXJjYWxsX3Byb2MgPSBwcm9jOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQlSRUFMX0NPREUgKCAvKiBTYXZlIGFsbCByZWdpc3RlcnMgKi8KKwkJICAgICAgICAgICAgInB1c2hhbFxuXHQiCisJCSAgICAgICAgICAgICJwdXNodyAlJWRzXG5cdCIKKwkJICAgICAgICAgICAgInB1c2h3ICUlZXNcblx0IgorCQkgICAgICAgICAgICAicHVzaHcgJSVmc1xuXHQiCisJCSAgICAgICAgICAgICJwdXNodyAlJWdzXG5cdCIKKwkJICAgICAgICAgICAgLyogTWFzayBvZmYgdW5zYWZlIGZsYWdzICovCisJCSAgICAgICAgICAgICJtb3ZsIChjb20zMl9yZWdzICsgNDApLCAlJWVheFxuXHQiCisJCSAgICAgICAgICAgICJhbmRsICQweDIwMGNkNywgJSVlYXhcblx0IgorCQkgICAgICAgICAgICAibW92bCAlJWVheCwgKGNvbTMyX3JlZ3MgKyA0MClcblx0IgorCQkgICAgICAgICAgICAvKiBMb2FkIGNvbTMyX3JlZ3MgaW50byB0aGUgYWN0dWFsIHJlZ2lzdGVycyAqLworCQkgICAgICAgICAgICAibW92dyAlJXNwLCAlJXNzOihjb20zMl9zYXZlZF9zcClcblx0IgorCQkgICAgICAgICAgICAibW92dyAkY29tMzJfcmVncywgJSVzcFxuXHQiCisJCSAgICAgICAgICAgICJwb3B3ICUlZ3Ncblx0IgorCQkgICAgICAgICAgICAicG9wdyAlJWZzXG5cdCIKKwkJICAgICAgICAgICAgInBvcHcgJSVlc1xuXHQiCisJCSAgICAgICAgICAgICJwb3B3ICUlZHNcblx0IgorCQkgICAgICAgICAgICAicG9wYWxcblx0IgorCQkgICAgICAgICAgICAicG9wZmxcblx0IgorCQkgICAgICAgICAgICAibW92dyAlJXNzOihjb20zMl9zYXZlZF9zcCksICUlc3Bcblx0IgorCQkgICAgICAgICAgICAvKiBDYWxsIHByb2NlZHVyZSAqLworCQkgICAgICAgICAgICAibGNhbGwgKiUlc3M6KGNvbTMyX2ZhcmNhbGxfcHJvYylcblx0IgorCQkgICAgICAgICAgICAvKiBDb3B5IHJlZ3MgYmFjayB0byBjb20zMl9yZWdzICovCisJCSAgICAgICAgICAgICJtb3Z3ICUlc3AsICUlc3M6KGNvbTMyX3NhdmVkX3NwKVxuXHQiCisJCSAgICAgICAgICAgICJtb3Z3ICQoY29tMzJfcmVncyArIDQ0KSwgJSVzcFxuXHQiCisJCSAgICAgICAgICAgICJwdXNoZmxcblx0IgorCQkgICAgICAgICAgICAicHVzaGFsXG5cdCIKKwkJICAgICAgICAgICAgInB1c2h3ICUlZHNcblx0IgorCQkgICAgICAgICAgICAicHVzaHcgJSVlc1xuXHQiCisJCSAgICAgICAgICAgICJwdXNodyAlJWZzXG5cdCIKKwkJICAgICAgICAgICAgInB1c2h3ICUlZ3Ncblx0IgorCQkgICAgICAgICAgICAibW92dyAlJXNzOihjb20zMl9zYXZlZF9zcCksICUlc3Bcblx0IgorCQkgICAgICAgICAgICAvKiBSZXN0b3JlIHJlZ2lzdGVycyAqLworCQkgICAgICAgICAgICAicG9wdyAlJWdzXG5cdCIKKwkJICAgICAgICAgICAgInBvcHcgJSVmc1xuXHQiCisJCSAgICAgICAgICAgICJwb3B3ICUlZXNcblx0IgorCQkgICAgICAgICAgICAicG9wdyAlJWRzXG5cdCIKKwkJICAgICAgICAgICAgInBvcGFsXG5cdCIpCisJCSAgICAgICAgICAgIDogOiApOworCisJaWYgKCBvdXRyZWdzX3BoeXMgKSB7CisJCW1lbWNweV91c2VyICggcGh5c190b191c2VyICggb3V0cmVnc19waHlzICksIDAsCisJCSAgICAgICAgICAgICAgdmlydF90b191c2VyKCAmY29tMzJfcmVncyApLCAwLCAKKwkJICAgICAgICAgICAgICBzaXplb2YoY29tMzJzeXNfdCkgKTsKKwl9Cit9CisKKy8qKgorICogQ0RFQ0wgZmFyY2FsbCBoZWxwZXIKKyAqLworaW50IF9fYXNtY2FsbCBjb20zMl9jZmFyY2FsbCAoIHVpbnQzMl90IHByb2MsIHBoeXNhZGRyX3Qgc3RhY2ssIHNpemVfdCBzdGFja3N6ICkgeworCWludDMyX3QgZWF4OworCisJY29weV91c2VyX3RvX3JtX3N0YWNrICggcGh5c190b191c2VyICggc3RhY2sgKSwgc3RhY2tzeiApOworCWNvbTMyX2ZhcmNhbGxfcHJvYyA9IHByb2M7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCVJFQUxfQ09ERSAoICJsY2FsbCAqJSVzczooY29tMzJfZmFyY2FsbF9wcm9jKVxuXHQiICkKKwkJOiAiPWEiIChlYXgpCisJCTogCisJCTogImVjeCIsICJlZHgiICk7CisKKwlyZW1vdmVfdXNlcl9mcm9tX3JtX3N0YWNrICggMCwgc3RhY2tzeiApOworCisJcmV0dXJuIGVheDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2Uvc3lzbGludXgvY29tMzJfd3JhcHBlci5TIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9zeXNsaW51eC9jb20zMl93cmFwcGVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1YmQxMwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9pbnRlcmZhY2Uvc3lzbGludXgvY29tMzJfd3JhcHBlci5TCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGFuaWVsIFZlcmthbXAgPGRhbmllbEBkcnYubnU+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICkKKworCS50ZXh0CisJLmFyY2ggaTM4NgorCS5jb2RlMzIKKworCS5nbG9ibCBjb20zMl9mYXJjYWxsX3dyYXBwZXIKK2NvbTMyX2ZhcmNhbGxfd3JhcHBlcjoKKworCW1vdmwgJGNvbTMyX2ZhcmNhbGwsICVlYXgKKwlqbXAgY29tMzJfd3JhcHBlcgorCisKKwkuZ2xvYmwgY29tMzJfY2ZhcmNhbGxfd3JhcHBlcgorY29tMzJfY2ZhcmNhbGxfd3JhcHBlcjoKKworCW1vdmwgJGNvbTMyX2NmYXJjYWxsLCAlZWF4CisJam1wIGNvbTMyX3dyYXBwZXIKKworCisJLmdsb2JsIGNvbTMyX2ludGNhbGxfd3JhcHBlcgorY29tMzJfaW50Y2FsbF93cmFwcGVyOgorCisJbW92bCAkY29tMzJfaW50Y2FsbCwgJWVheAorCS8qam1wIGNvbTMyX3dyYXBwZXIqLyAvKiBmYWxsIHRocm91Z2ggKi8KKworY29tMzJfd3JhcHBlcjoKKworCS8qIFN3aXRjaCB0byBpbnRlcm5hbCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KKwljYWxsIF9waHlzX3RvX3ZpcnQKKworCW1vdiAlZWF4LCAoY29tMzJfaGVscGVyX2Z1bmN0aW9uKQorCisJLyogU2F2ZSBleHRlcm5hbCBDT00zMiBzdGFjayBwb2ludGVyICovCisJbW92bCAlZXNwLCAoY29tMzJfZXh0ZXJuYWxfZXNwKQorCisJLyogQ29weSBhcmd1bWVudHMgdG8gY2FsbGVyLXNhdmUgcmVnaXN0ZXJzICovCisJbW92bCAxMiglZXNwKSwgJWVheAorCW1vdmwgOCglZXNwKSwgJWVjeAorCW1vdmwgNCglZXNwKSwgJWVkeAorCisJLyogU3dpdGNoIHRvIGludGVybmFsIHN0YWNrICovCisJbW92bCAoY29tMzJfaW50ZXJuYWxfZXNwKSwgJWVzcAorCisJLyogQ29weSBhcmd1bWVudHMgdG8gaW50ZXJuYWwgc3RhY2sgKi8KKwlwdXNobCAlZWF4CisJcHVzaGwgJWVjeAorCXB1c2hsICVlZHgKKworCWNhbGwgKihjb20zMl9oZWxwZXJfZnVuY3Rpb24pCisKKwkvKiBDbGVhbiB1cCBzdGFjayAqLworCWFkZGwgJDEyLCAlZXNwCisKKwkvKiBTYXZlIGludGVybmFsIHN0YWNrIHBvaW50ZXIgYW5kIHJlc3RvcmUgZXh0ZXJuYWwgc3RhY2sgcG9pbnRlciAqLworCW1vdmwgJWVzcCwgKGNvbTMyX2ludGVybmFsX2VzcCkKKwltb3ZsIChjb20zMl9leHRlcm5hbF9lc3ApLCAlZXNwCisKKwkvKiBTd2l0Y2ggdG8gZXh0ZXJuYWwgZmxhdCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlICovCisJY2FsbCBfdmlydF90b19waHlzCisKKwlyZXQKKworCisJLmRhdGEKKworLyogSW50ZXJuYWwgZ1BYRSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgJWVzcCAqLworLmdsb2JsIGNvbTMyX2ludGVybmFsX2VzcAorLmxjb21tIGNvbTMyX2ludGVybmFsX2VzcCwgNAorCisvKiBFeHRlcm5hbCBmbGF0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgJWVzcCAqLworLmdsb2JsIGNvbTMyX2V4dGVybmFsX2VzcAorLmxjb21tIGNvbTMyX2V4dGVybmFsX2VzcCwgNAorCisvKiBGdW5jdGlvbiBwb2ludGVyIG9mIGhlbHBlciB0byBjYWxsICovCisubGNvbW0gY29tMzJfaGVscGVyX2Z1bmN0aW9uLCA0CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3N5c2xpbnV4L2NvbWJvb3RfY2FsbC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9zeXNsaW51eC9jb21ib290X2NhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE3YmYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9zeXNsaW51eC9jb21ib290X2NhbGwuYwpAQCAtMCwwICsxLDcxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYW5pZWwgVmVya2FtcCA8ZGFuaWVsQGRydi5udT4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qKgorICogQGZpbGUgU1lTTElOVVggQ09NQk9PVCBBUEkKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxyZWFsbW9kZS5oPgorI2luY2x1ZGUgPGJpb3NpbnQuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y29tYm9vdC5oPgorI2luY2x1ZGUgPGJ6aW1hZ2UuaD4KKyNpbmNsdWRlIDxweGVfY2FsbC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdweGUvcG9zaXhfaW8uaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3NlcmlhbC5oPgorI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorI2luY2x1ZGUgPGdweGUvaW1hZ2UuaD4KKyNpbmNsdWRlIDx1c3IvaW1nbWdtdC5oPgorI2luY2x1ZGUgImNvbmZpZy9jb25zb2xlLmgiCisjaW5jbHVkZSAiY29uZmlnL3NlcmlhbC5oIgorCisvKiogVGhlICJTWVNMSU5VWCIgdmVyc2lvbiBzdHJpbmcgKi8KK3N0YXRpYyBjaGFyIF9fZGF0YTE2X2FycmF5ICggc3lzbGludXhfdmVyc2lvbiwgW10gKSA9ICJnUFhFICIgVkVSU0lPTjsKKyNkZWZpbmUgc3lzbGludXhfdmVyc2lvbiBfX3VzZV9kYXRhMTYgKCBzeXNsaW51eF92ZXJzaW9uICkKKworLyoqIFRoZSAiU1lTTElOVVgiIGNvcHlyaWdodCBzdHJpbmcgKi8KK3N0YXRpYyBjaGFyIF9fZGF0YTE2X2FycmF5ICggc3lzbGludXhfY29weXJpZ2h0LCBbXSApID0gImh0dHA6Ly9ldGhlcmJvb3Qub3JnIjsKKyNkZWZpbmUgc3lzbGludXhfY29weXJpZ2h0IF9fdXNlX2RhdGExNiAoIHN5c2xpbnV4X2NvcHlyaWdodCApCisKK3N0YXRpYyBjaGFyIF9fZGF0YTE2X2FycmF5ICggc3lzbGludXhfY29uZmlndXJhdGlvbl9maWxlLCBbXSApID0gIiI7CisjZGVmaW5lIHN5c2xpbnV4X2NvbmZpZ3VyYXRpb25fZmlsZSBfX3VzZV9kYXRhMTYgKCBzeXNsaW51eF9jb25maWd1cmF0aW9uX2ZpbGUgKQorCisvKiogRmVhdHVyZSBmbGFncyAqLworc3RhdGljIHVpbnQ4X3QgX19kYXRhMTYgKCBjb21ib290X2ZlYXR1cmVfZmxhZ3MgKSA9IENPTUJPT1RfRkVBVFVSRV9JRExFX0xPT1A7CisjZGVmaW5lIGNvbWJvb3RfZmVhdHVyZV9mbGFncyBfX3VzZV9kYXRhMTYgKCBjb21ib290X2ZlYXR1cmVfZmxhZ3MgKQorCit0eXBlZGVmIHVuaW9uIHsKKwlzeXNsaW51eF9wbV9yZWdzIHBtOyBzeXNsaW51eF9ybV9yZWdzIHJtOworfSBzeXNsaW51eF9yZWdzOworCisvKiogSW5pdGlhbCByZWdpc3RlciB2YWx1ZXMgZm9yIElOVCAyMmggQVg9MUFoIGFuZCAxQmggKi8KK3N0YXRpYyBzeXNsaW51eF9yZWdzIF9fdGV4dDE2ICggY29tYm9vdF9pbml0aWFsX3JlZ3MgKTsKKyNkZWZpbmUgY29tYm9vdF9pbml0aWFsX3JlZ3MgX191c2VfdGV4dDE2ICggY29tYm9vdF9pbml0aWFsX3JlZ3MgKQorCitzdGF0aWMgc3RydWN0IHNlZ29mZiBfX3RleHQxNiAoIGludDIwX3ZlY3RvciApOworI2RlZmluZSBpbnQyMF92ZWN0b3IgX191c2VfdGV4dDE2ICggaW50MjBfdmVjdG9yICkKKworc3RhdGljIHN0cnVjdCBzZWdvZmYgX190ZXh0MTYgKCBpbnQyMV92ZWN0b3IgKTsKKyNkZWZpbmUgaW50MjFfdmVjdG9yIF9fdXNlX3RleHQxNiAoIGludDIxX3ZlY3RvciApCisKK3N0YXRpYyBzdHJ1Y3Qgc2Vnb2ZmIF9fdGV4dDE2ICggaW50MjJfdmVjdG9yICk7CisjZGVmaW5lIGludDIyX3ZlY3RvciBfX3VzZV90ZXh0MTYgKCBpbnQyMl92ZWN0b3IgKQorCitleHRlcm4gdm9pZCBpbnQyMF93cmFwcGVyICggdm9pZCApOworZXh0ZXJuIHZvaWQgaW50MjFfd3JhcHBlciAoIHZvaWQgKTsKK2V4dGVybiB2b2lkIGludDIyX3dyYXBwZXIgKCB2b2lkICk7CisKKy8qIHNldGptcC9sb25nam1wIGNvbnRleHQgYnVmZmVyIHVzZWQgdG8gcmV0dXJuIGFmdGVyIGxvYWRpbmcgYW4gaW1hZ2UgKi8KK3Jtam1wX2J1ZiBjb21ib290X3JldHVybjsKKworLyogUmVwbGFjZW1lbnQgaW1hZ2Ugd2hlbiBleGl0aW5nIHdpdGggQ09NQk9PVF9FWElUX1JVTl9LRVJORUwgKi8KK3N0cnVjdCBpbWFnZSAqY29tYm9vdF9yZXBsYWNlbWVudF9pbWFnZTsKKworLyogTW9kZSBmbGFncyBzZXQgYnkgSU5UIDIyaCBBWD0wMDE3aCAqLworc3RhdGljIHVpbnQxNl90IGNvbWJvb3RfZ3JhcGhpY3NfbW9kZSA9IDA7CisKKworLyoqCisgKiBQcmludCBhIHN0cmluZyB3aXRoIGEgcGFydGljdWxhciB0ZXJtaW5hdG9yCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X3VzZXJfc3RyaW5nICggdW5zaWduZWQgaW50IHNlZ21lbnQsIHVuc2lnbmVkIGludCBvZmZzZXQsIGNoYXIgdGVybWluYXRvciApIHsKKwlpbnQgaSA9IDA7CisJY2hhciBjOworCXVzZXJwdHJfdCBzdHIgPSByZWFsX3RvX3VzZXIgKCBzZWdtZW50LCBvZmZzZXQgKTsKKwlmb3IgKCA7IDsgKSB7CisJCWNvcHlfZnJvbV91c2VyICggJmMsIHN0ciwgaSwgMSApOworCQlpZiAoIGMgPT0gdGVybWluYXRvciApIGJyZWFrOworCQlwdXRjaGFyICggYyApOworCQlpKys7CisJfQorfQorCisKKy8qKgorICogUGVyZm9ybSBhIHNlcmllcyBvZiBtZW1vcnkgY29waWVzIGZyb20gYSBsaXN0IGluIGxvdyBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgc2h1ZmZsZSAoIHVuc2lnbmVkIGludCBsaXN0X3NlZ21lbnQsIHVuc2lnbmVkIGludCBsaXN0X29mZnNldCwgdW5zaWduZWQgaW50IGNvdW50ICkKK3sKKwljb21ib290X3NodWZmbGVfZGVzY3JpcHRvciBzaHVmW0NPTUJPT1RfTUFYX1NIVUZGTEVfREVTQ1JJUFRPUlNdOworCXVuc2lnbmVkIGludCBpOworCisJLyogQ29weSBzaHVmZmxlIGRlc2NyaXB0b3IgbGlzdCBzbyBpdCBkb2Vzbid0IGdldCBvdmVyd3JpdHRlbiAqLworCWNvcHlfZnJvbV91c2VyICggc2h1ZiwgcmVhbF90b191c2VyICggbGlzdF9zZWdtZW50LCBsaXN0X29mZnNldCApLCAwLAorCSAgICAgICAgICAgICAgICAgY291bnQgKiBzaXplb2YoIGNvbWJvb3Rfc2h1ZmZsZV9kZXNjcmlwdG9yICkgKTsKKworCS8qIERvIHRoZSBjb3BpZXMgKi8KKwlmb3IgKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKSB7CisJCXVzZXJwdHJfdCBzcmNfdSA9IHBoeXNfdG9fdXNlciAoIHNodWZbIGkgXS5zcmMgKTsKKwkJdXNlcnB0cl90IGRlc3RfdSA9IHBoeXNfdG9fdXNlciAoIHNodWZbIGkgXS5kZXN0ICk7CisKKwkJaWYgKCBzaHVmWyBpIF0uc3JjID09IDB4RkZGRkZGRkYgKSB7CisJCQkvKiBGaWxsIHdpdGggMCBpbnN0ZWFkIG9mIGNvcHlpbmcgKi8KKwkJCW1lbXNldF91c2VyICggZGVzdF91LCAwLCAwLCBzaHVmWyBpIF0ubGVuICk7CisJCX0gZWxzZSBpZiAoIHNodWZbIGkgXS5kZXN0ID09IDB4RkZGRkZGRkYgKSB7CisJCQkvKiBDb3B5IG5ldyBsaXN0IG9mIGRlc2NyaXB0b3JzICovCisJCQljb3VudCA9IHNodWZbIGkgXS5sZW4gLyBzaXplb2YoIGNvbWJvb3Rfc2h1ZmZsZV9kZXNjcmlwdG9yICk7CisJCQlhc3NlcnQgKCBjb3VudCA8PSBDT01CT09UX01BWF9TSFVGRkxFX0RFU0NSSVBUT1JTICk7CisJCQljb3B5X2Zyb21fdXNlciAoIHNodWYsIHNyY191LCAwLCBzaHVmWyBpIF0ubGVuICk7CisJCQlpID0gLTE7CisJCX0gZWxzZSB7CisJCQkvKiBSZWd1bGFyIGNvcHkgKi8KKwkJCW1lbW1vdmVfdXNlciAoIGRlc3RfdSwgMCwgc3JjX3UsIDAsIHNodWZbIGkgXS5sZW4gKTsKKwkJfQorCX0KK30KKworCisvKioKKyAqIFNldCBkZWZhdWx0IHRleHQgbW9kZQorICovCit2b2lkIGNvbWJvb3RfZm9yY2VfdGV4dF9tb2RlICggdm9pZCApIHsKKwlpZiAoIGNvbWJvb3RfZ3JhcGhpY3NfbW9kZSAmIENPTUJPT1RfVklERU9fVkVTQSApIHsKKwkJLyogU2V0IFZHQSBtb2RlIDMgdmlhIFZFU0EgVkJFIG1vZGUgc2V0ICovCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJCVJFQUxfQ09ERSAoCisJCQkJIm1vdiAkMHg0RjAyLCAlJWF4XG5cdCIKKwkJCQkibW92ICQweDAzLCAlJWJ4XG5cdCIKKwkJCQkiaW50ICQweDEwXG5cdCIKKwkJCSkKKwkJOiA6ICk7CisJfSBlbHNlIGlmICggY29tYm9vdF9ncmFwaGljc19tb2RlICYgQ09NQk9PVF9WSURFT19HUkFQSElDUyApIHsKKwkJLyogU2V0IFZHQSBtb2RlIDMgdmlhIHN0YW5kYXJkIFZHQSBtb2RlIHNldCAqLworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCQlSRUFMX0NPREUgKAorCQkJCSJtb3YgJDB4MDMsICUlYXhcblx0IgorCQkJCSJpbnQgJDB4MTBcblx0IgorCQkJKQorCQk6IDogKTsKKwl9CisKKwljb21ib290X2dyYXBoaWNzX21vZGUgPSAwOworfQorCisKKy8qKgorICogRmV0Y2gga2VybmVsIGFuZCBvcHRpb25hbCBpbml0cmQKKyAqLworc3RhdGljIGludCBjb21ib290X2ZldGNoX2tlcm5lbCAoIGNoYXIgKmtlcm5lbF9maWxlLCBjaGFyICpjbWRsaW5lICkgeworCXN0cnVjdCBpbWFnZSAqa2VybmVsID0gTlVMTDsKKwlzdHJ1Y3QgaW1hZ2UgKmluaXRyZCA9IE5VTEw7CisJY2hhciAqaW5pdHJkX2ZpbGU7CisJaW50IHJjOworCisJLyogRmluZCBpbml0cmQ9IHBhcmFtZXRlciwgaWYgYW55ICovCisJaWYgKCAoIGluaXRyZF9maWxlID0gc3Ryc3RyICggY21kbGluZSwgImluaXRyZD0iICkgKSAhPSBOVUxMICkgeworCQljaGFyICppbml0cmRfZW5kOworCisJCS8qIHNraXAgImluaXRyZD0iICovCisJCWluaXRyZF9maWxlICs9IDc7CisKKwkJLyogRmluZCB0ZXJtaW5hdGluZyBzcGFjZSwgaWYgYW55LCBhbmQgcmVwbGFjZSB3aXRoIE5VTCAqLworCQlpbml0cmRfZW5kID0gc3RyY2hyICggaW5pdHJkX2ZpbGUsICcgJyApOworCQlpZiAoIGluaXRyZF9lbmQgKQorCQkJKmluaXRyZF9lbmQgPSAnXDAnOworCisJCURCRyAoICJDT01CT09UOiBmZXRjaGluZyBpbml0cmQgJyVzJ1xuIiwgaW5pdHJkX2ZpbGUgKTsKKworCQkvKiBBbGxvY2F0ZSBhbmQgZmV0Y2ggaW5pdHJkICovCisJCWluaXRyZCA9IGFsbG9jX2ltYWdlKCk7CisJCWlmICggISBpbml0cmQgKSB7CisJCQlEQkcgKCAiQ09NQk9PVDogY291bGQgbm90IGFsbG9jYXRlIGluaXRyZFxuIiApOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCAoIHJjID0gaW1nZmV0Y2ggKCBpbml0cmQsIGluaXRyZF9maWxlLAorCQkJCSAgICAgICByZWdpc3Rlcl9pbWFnZSApICkgIT0gMCApIHsKKwkJCURCRyAoICJDT01CT09UOiBjb3VsZCBub3QgZmV0Y2ggaW5pdHJkOiAlc1xuIiwKKwkJCSAgICAgIHN0cmVycm9yICggcmMgKSApOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBSZXN0b3JlIHNwYWNlIGFmdGVyIGluaXRyZCBuYW1lLCBpZiBhcHBsaWNhYmxlICovCisJCWlmICggaW5pdHJkX2VuZCApCisJCQkqaW5pdHJkX2VuZCA9ICcgJzsKKwl9CisKKwlEQkcgKCAiQ09NQk9PVDogZmV0Y2hpbmcga2VybmVsICclcydcbiIsIGtlcm5lbF9maWxlICk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgZmV0Y2gga2VybmVsICovCisJa2VybmVsID0gYWxsb2NfaW1hZ2UoKTsKKwlpZiAoICEga2VybmVsICkgeworCQlEQkcgKCAiQ09NQk9PVDogY291bGQgbm90IGFsbG9jYXRlIGtlcm5lbFxuIiApOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlpZiAoICggcmMgPSBpbWdmZXRjaCAoIGtlcm5lbCwga2VybmVsX2ZpbGUsCisJCQkgICAgICAgcmVnaXN0ZXJfaW1hZ2UgKSApICE9IDAgKSB7CisJCURCRyAoICJDT01CT09UOiBjb3VsZCBub3QgZmV0Y2gga2VybmVsOiAlc1xuIiwKKwkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoICggcmMgPSBpbWFnZV9zZXRfY21kbGluZSAoIGtlcm5lbCwgY21kbGluZSApICkgIT0gMCApIHsKKwkJREJHICggIkNPTUJPT1Q6IGNvdWxkIG5vdCBzZXQga2VybmVsIGNvbW1hbmQgbGluZTogJXNcbiIsCisJCSAgICAgIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTdG9yZSBrZXJuZWwgYXMgcmVwbGFjZW1lbnQgaW1hZ2UgKi8KKwlhc3NlcnQgKCBjb21ib290X3JlcGxhY2VtZW50X2ltYWdlID09IE5VTEwgKTsKKwljb21ib290X3JlcGxhY2VtZW50X2ltYWdlID0gaW1hZ2VfZ2V0ICgga2VybmVsICk7CisKKyBvdXQ6CisJLyogRHJvcCBpbWFnZSByZWZlcmVuY2VzIHVuY29uZGl0aW9uYWxseTsgZWl0aGVyIHdlIHdhbnQgdG8KKwkgKiBkaXNjYXJkIHRoZW0sIG9yIHRoZXkgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYW5kIHdlIHNob3VsZAorCSAqIGRyb3Agb3V0IGxvY2FsIHJlZmVyZW5jZS4KKwkgKi8KKwlpbWFnZV9wdXQgKCBrZXJuZWwgKTsKKwlpbWFnZV9wdXQgKCBpbml0cmQgKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBUZXJtaW5hdGUgcHJvZ3JhbSBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgX19hc21jYWxsIHZvaWQgaW50MjAgKCBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiBfX3VudXNlZCApIHsKKwlybWxvbmdqbXAgKCBjb21ib290X3JldHVybiwgQ09NQk9PVF9FWElUICk7Cit9CisKKworLyoqCisgKiBET1MtY29tcGF0aWJsZSBBUEkKKyAqLworc3RhdGljIF9fYXNtY2FsbCB2b2lkIGludDIxICggc3RydWN0IGkzODZfYWxsX3JlZ3MgKml4ODYgKSB7CisJaXg4Ni0+ZmxhZ3MgfD0gQ0Y7CisKKwlzd2l0Y2ggKCBpeDg2LT5yZWdzLmFoICkgeworCWNhc2UgMHgwMDoKKwljYXNlIDB4NEM6IC8qIFRlcm1pbmF0ZSBwcm9ncmFtICovCisJCXJtbG9uZ2ptcCAoIGNvbWJvb3RfcmV0dXJuLCBDT01CT09UX0VYSVQgKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDE6IC8qIEdldCBLZXkgd2l0aCBFY2hvICovCisJY2FzZSAweDA4OiAvKiBHZXQgS2V5IHdpdGhvdXQgRWNobyAqLworCQkvKiBUT0RPOiBoYW5kbGUgZXh0ZW5kZWQgY2hhcmFjdGVycz8gKi8KKwkJaXg4Ni0+cmVncy5hbCA9IGdldGNoYXIoICk7CisKKwkJLyogRW50ZXIgKi8KKwkJaWYgKCBpeDg2LT5yZWdzLmFsID09IDB4MEEgKQorCQkJaXg4Ni0+cmVncy5hbCA9IDB4MEQ7CisKKwkJaWYgKCBpeDg2LT5yZWdzLmFoID09IDB4MDEgKQorCQkJcHV0Y2hhciAoIGl4ODYtPnJlZ3MuYWwgKTsKKworCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCWJyZWFrOworCisJY2FzZSAweDAyOiAvKiBXcml0ZSBDaGFyYWN0ZXIgKi8KKwkJcHV0Y2hhciAoIGl4ODYtPnJlZ3MuZGwgKTsKKwkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQlicmVhazsKKworCWNhc2UgMHgwNDogLyogV3JpdGUgQ2hhcmFjdGVyIHRvIFNlcmlhbCBQb3J0ICovCisJCXNlcmlhbF9wdXRjICggaXg4Ni0+cmVncy5kbCApOworCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCWJyZWFrOworCisJY2FzZSAweDA5OiAvKiBXcml0ZSBET1MgU3RyaW5nIHRvIENvbnNvbGUgKi8KKwkJcHJpbnRfdXNlcl9zdHJpbmcgKCBpeDg2LT5zZWdzLmRzLCBpeDg2LT5yZWdzLmR4LCAnJCcgKTsKKwkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQlicmVhazsKKworCWNhc2UgMHgwQjogLyogQ2hlY2sgS2V5Ym9hcmQgKi8KKwkJaWYgKCBpc2tleSgpICkKKwkJCWl4ODYtPnJlZ3MuYWwgPSAweEZGOworCQllbHNlCisJCQlpeDg2LT5yZWdzLmFsID0gMHgwMDsKKworCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCWJyZWFrOworCisJY2FzZSAweDMwOiAvKiBDaGVjayBET1MgVmVyc2lvbiAqLworCQkvKiBCb3R0b20gaGFsdmVzIGFsbCAwOyB0b3AgaGFsdmVzIHNwZWxsICJTWVNMSU5VWCIgKi8KKwkJaXg4Ni0+cmVncy5lYXggPSAweDU5NTMwMDAwOworCQlpeDg2LT5yZWdzLmVieCA9IDB4NEM1MzAwMDA7CisJCWl4ODYtPnJlZ3MuZWN4ID0gMHg0RTQ5MDAwMDsKKwkJaXg4Ni0+cmVncy5lZHggPSAweDU4NTUwMDAwOworCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREJHICggIkNPTUJPT1QgdW5rbm93biBpbnQyMSBmdW5jdGlvbiAlMDJ4XG4iLCBpeDg2LT5yZWdzLmFoICk7CisJCWJyZWFrOworCX0KK30KKworCisvKioKKyAqIFNZU0xJTlVYIEFQSQorICovCitzdGF0aWMgX19hc21jYWxsIHZvaWQgaW50MjIgKCBzdHJ1Y3QgaTM4Nl9hbGxfcmVncyAqaXg4NiApIHsKKwlpeDg2LT5mbGFncyB8PSBDRjsKKworCXN3aXRjaCAoIGl4ODYtPnJlZ3MuYXggKSB7CisJY2FzZSAweDAwMDE6IC8qIEdldCBWZXJzaW9uICovCisKKwkJLyogTnVtYmVyIG9mIElOVCAyMmggQVBJIGZ1bmN0aW9ucyBhdmFpbGFibGUgKi8KKwkJaXg4Ni0+cmVncy5heCA9IDB4MDAxRDsKKworCQkvKiBTWVNMSU5VWCB2ZXJzaW9uIG51bWJlciAqLworCQlpeDg2LT5yZWdzLmNoID0gMDsgLyogbWFqb3IgKi8KKwkJaXg4Ni0+cmVncy5jbCA9IDA7IC8qIG1pbm9yICovCisKKwkJLyogU1lTTElOVVggZGVyaXZhdGl2ZSBJRCAqLworCQlpeDg2LT5yZWdzLmRsID0gQlpJX0xPQURFUl9UWVBFX0dQWEU7CisKKwkJLyogU1lTTElOVVggdmVyc2lvbiBhbmQgY29weXJpZ2h0IHN0cmluZ3MgKi8KKwkJaXg4Ni0+c2Vncy5lcyA9IHJtX2RzOworCQlpeDg2LT5yZWdzLnNpID0gKCAoIHVuc2lnbmVkICkgX19mcm9tX2RhdGExNiAoIHN5c2xpbnV4X3ZlcnNpb24gKSApOworCQlpeDg2LT5yZWdzLmRpID0gKCAoIHVuc2lnbmVkICkgX19mcm9tX2RhdGExNiAoIHN5c2xpbnV4X2NvcHlyaWdodCApICk7CisKKwkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQlicmVhazsKKworCWNhc2UgMHgwMDAyOiAvKiBXcml0ZSBTdHJpbmcgKi8KKwkJcHJpbnRfdXNlcl9zdHJpbmcgKCBpeDg2LT5zZWdzLmVzLCBpeDg2LT5yZWdzLmJ4LCAnXDAnICk7CisJCWl4ODYtPmZsYWdzICY9IH5DRjsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDAwMzogLyogUnVuIGNvbW1hbmQgKi8KKwkJeworCQkJdXNlcnB0cl90IGNtZF91ID0gcmVhbF90b191c2VyICggaXg4Ni0+c2Vncy5lcywgaXg4Ni0+cmVncy5ieCApOworCQkJaW50IGxlbiA9IHN0cmxlbl91c2VyICggY21kX3UsIDAgKTsKKwkJCWNoYXIgY21kW2xlbiArIDFdOworCQkJY29weV9mcm9tX3VzZXIgKCBjbWQsIGNtZF91LCAwLCBsZW4gKyAxICk7CisJCQlEQkcgKCAiQ09NQk9PVDogZXhlY3V0aW5nIGNvbW1hbmQgJyVzJ1xuIiwgY21kICk7CisJCQlzeXN0ZW0gKCBjbWQgKTsKKwkJCURCRyAoICJDT01CT09UOiBleGl0aW5nIGFmdGVyIGV4ZWN1dGluZyBjb21tYW5kLi4uXG4iICk7CisJCQlybWxvbmdqbXAgKCBjb21ib290X3JldHVybiwgQ09NQk9PVF9FWElUX0NPTU1BTkQgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwMDA0OiAvKiBSdW4gZGVmYXVsdCBjb21tYW5kICovCisJCS8qIEZJWE1FOiBqdXN0IGV4aXQgZm9yIG5vdyAqLworCQlybWxvbmdqbXAgKCBjb21ib290X3JldHVybiwgQ09NQk9PVF9FWElUX0NPTU1BTkQgKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDAwNTogLyogRm9yY2UgdGV4dCBtb2RlICovCisJCWNvbWJvb3RfZm9yY2VfdGV4dF9tb2RlICggKTsKKwkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQlicmVhazsKKworCWNhc2UgMHgwMDA2OiAvKiBPcGVuIGZpbGUgKi8KKwkJeworCQkJaW50IGZkOworCQkJdXNlcnB0cl90IGZpbGVfdSA9IHJlYWxfdG9fdXNlciAoIGl4ODYtPnNlZ3MuZXMsIGl4ODYtPnJlZ3Muc2kgKTsKKwkJCWludCBsZW4gPSBzdHJsZW5fdXNlciAoIGZpbGVfdSwgMCApOworCQkJY2hhciBmaWxlW2xlbiArIDFdOworCisJCQljb3B5X2Zyb21fdXNlciAoIGZpbGUsIGZpbGVfdSwgMCwgbGVuICsgMSApOworCisJCQlpZiAoIGZpbGVbMF0gPT0gJ1wwJyApIHsKKwkJCQlEQkcgKCAiQ09NQk9PVDogYXR0ZW1wdGVkIG9wZW4gd2l0aCBlbXB0eSBmaWxlIG5hbWVcbiIgKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJREJHICggIkNPTUJPT1Q6IG9wZW5pbmcgZmlsZSAnJXMnXG4iLCBmaWxlICk7CisKKwkJCWZkID0gb3BlbiAoIGZpbGUgKTsKKworCQkJaWYgKCBmZCA8IDAgKSB7CisJCQkJREJHICggIkNPTUJPT1Q6IGVycm9yIG9wZW5pbmcgZmlsZSAlc1xuIiwgZmlsZSApOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBUaGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGEgZ1BYRSBQT1NJWCBmZCB3aWxsCisJCQkgKiBhbHdheXMgZml0IGluIDE2IGJpdHMuCisJCQkgKi8KKyNpZiAoUE9TSVhfRkRfTUFYID4gNjU1MzUpCisjZXJyb3IgUE9TSVhfRkRfTUFYIHRvbyBsYXJnZQorI2VuZGlmCisJCQlpeDg2LT5yZWdzLnNpID0gKHVpbnQxNl90KSBmZDsKKworCQkJaXg4Ni0+cmVncy5jeCA9IENPTUJPT1RfRklMRV9CTE9DS1NaOworCQkJaXg4Ni0+cmVncy5lYXggPSBmc2l6ZSAoIGZkICk7CisJCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4MDAwNzogLyogUmVhZCBmaWxlICovCisJCXsKKwkJCWludCBmZCA9IGl4ODYtPnJlZ3Muc2k7CisJCQlpbnQgbGVuID0gaXg4Ni0+cmVncy5jeCAqIENPTUJPT1RfRklMRV9CTE9DS1NaOworCQkJaW50IHJjOworCQkJZmRfc2V0IGZkczsKKwkJCXVzZXJwdHJfdCBidWYgPSByZWFsX3RvX3VzZXIgKCBpeDg2LT5zZWdzLmVzLCBpeDg2LT5yZWdzLmJ4ICk7CisKKwkJCS8qIFdhaXQgZm9yIGRhdGEgcmVhZHkgdG8gcmVhZCAqLworCQkJRkRfWkVSTyAoICZmZHMgKTsKKwkJCUZEX1NFVCAoIGZkLCAmZmRzICk7CisKKwkJCXNlbGVjdCAoICZmZHMsIDEgKTsKKworCQkJcmMgPSByZWFkX3VzZXIgKCBmZCwgYnVmLCAwLCBsZW4gKTsKKwkJCWlmICggcmMgPCAwICkgeworCQkJCURCRyAoICJDT01CT09UOiByZWFkIGZhaWxlZFxuIiApOworCQkJCWl4ODYtPnJlZ3Muc2kgPSAwOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpeDg2LT5yZWdzLmVjeCA9IHJjOworCQkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQl9CisJCWJyZWFrOworCisJY2FzZSAweDAwMDg6IC8qIENsb3NlIGZpbGUgKi8KKwkJeworCQkJaW50IGZkID0gaXg4Ni0+cmVncy5zaTsKKwkJCWNsb3NlICggZmQgKTsKKwkJCWl4ODYtPmZsYWdzICY9IH5DRjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwMDA5OiAvKiBDYWxsIFBYRSBTdGFjayAqLworCQlpZiAoIHB4ZV9hcGlfY2FsbF93ZWFrICggaXg4NiApICE9IDAgKQorCQkJaXg4Ni0+ZmxhZ3MgfD0gQ0Y7CisJCWVsc2UKKwkJCWl4ODYtPmZsYWdzICY9IH5DRjsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDAwQTogLyogR2V0IERlcml2YXRpdmUtU3BlY2lmaWMgSW5mb3JtYXRpb24gKi8KKworCQkvKiBnUFhFIGhhcyBpdHMgb3duIGRlcml2YXRpdmUgSUQsIHNvIHRoZXJlIGlzIG5vIGRlZmluZWQKKwkJICogb3V0cHV0IGhlcmU7IGp1c3QgcmV0dXJuIEFMIGZvciBub3cgKi8KKwkJaXg4Ni0+cmVncy5hbCA9IEJaSV9MT0FERVJfVFlQRV9HUFhFOworCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCWJyZWFrOworCisJY2FzZSAweDAwMEI6IC8qIEdldCBTZXJpYWwgQ29uc29sZSBDb25maWd1cmF0aW9uICovCisjaWYgZGVmaW5lZChDT05TT0xFX1NFUklBTCkgJiYgIWRlZmluZWQoQ09NUFJFU0VSVkUpCisJCWl4ODYtPnJlZ3MuZHggPSBDT01DT05TT0xFOworCQlpeDg2LT5yZWdzLmN4ID0gMTE1MjAwIC8gQ09NU1BFRUQ7CisJCWl4ODYtPnJlZ3MuYnggPSAwOworI2Vsc2UKKwkJaXg4Ni0+cmVncy5keCA9IDA7CisjZW5kaWYKKworCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCWJyZWFrOworCisJY2FzZSAweDAwMEU6IC8qIEdldCBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSAqLworCQkvKiBGSVhNRTogc3R1YiAqLworCQlpeDg2LT5zZWdzLmVzID0gcm1fZHM7CisJCWl4ODYtPnJlZ3MuYnggPSAoICggdW5zaWduZWQgKSBfX2Zyb21fZGF0YTE2ICggc3lzbGludXhfY29uZmlndXJhdGlvbl9maWxlICkgKTsKKwkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQlicmVhazsKKworCWNhc2UgMHgwMDBGOiAvKiBHZXQgSVBBUFBFTkQgc3RyaW5ncyAqLworCQkvKiBGSVhNRTogc3R1YiAqLworCQlpeDg2LT5yZWdzLmN4ID0gMDsKKwkJaXg4Ni0+c2Vncy5lcyA9IDA7CisJCWl4ODYtPnJlZ3MuYnggPSAwOworCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCWJyZWFrOworCisJY2FzZSAweDAwMTA6IC8qIFJlc29sdmUgaG9zdG5hbWUgKi8KKwkJeworCQkJdXNlcnB0cl90IGhvc3RuYW1lX3UgPSByZWFsX3RvX3VzZXIgKCBpeDg2LT5zZWdzLmVzLCBpeDg2LT5yZWdzLmJ4ICk7CisJCQlpbnQgbGVuID0gc3RybGVuX3VzZXIgKCBob3N0bmFtZV91LCAwICk7CisJCQljaGFyIGhvc3RuYW1lW2xlbl07CisJCQlzdHJ1Y3QgaW5fYWRkciBhZGRyOworCisJCQljb3B5X2Zyb21fdXNlciAoIGhvc3RuYW1lLCBob3N0bmFtZV91LCAwLCBsZW4gKyAxICk7CisJCQkKKwkJCS8qIFRPRE86CisJCQkgKiAiSWYgdGhlIGhvc3RuYW1lIGRvZXMgbm90IGNvbnRhaW4gYSBkb3QgKC4pLCB0aGUKKwkJCSAqIGxvY2FsIGRvbWFpbiBuYW1lIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQuIgorCQkJICovCisKKwkJCWNvbWJvb3RfcmVzb2x2ICggaG9zdG5hbWUsICZhZGRyICk7CisKKwkJCWl4ODYtPnJlZ3MuZWF4ID0gYWRkci5zX2FkZHI7CisJCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4MDAxMTogLyogTWF4aW11bSBudW1iZXIgb2Ygc2h1ZmZsZSBkZXNjcmlwdG9ycyAqLworCQlpeDg2LT5yZWdzLmN4ID0gQ09NQk9PVF9NQVhfU0hVRkZMRV9ERVNDUklQVE9SUzsKKwkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQlicmVhazsKKworCWNhc2UgMHgwMDEyOiAvKiBDbGVhbnVwLCBzaHVmZmxlIGFuZCBib290ICovCisJCWlmICggaXg4Ni0+cmVncy5jeCA+IENPTUJPT1RfTUFYX1NIVUZGTEVfREVTQ1JJUFRPUlMgKQorCQkJYnJlYWs7CisKKwkJLyogUGVyZm9ybSBmaW5hbCBjbGVhbnVwICovCisJCXNodXRkb3duICggU0hVVERPV05fQk9PVCApOworCisJCS8qIFBlcmZvcm0gc2VxdWVuY2Ugb2YgY29waWVzICovCisJCXNodWZmbGUgKCBpeDg2LT5zZWdzLmVzLCBpeDg2LT5yZWdzLmRpLCBpeDg2LT5yZWdzLmN4ICk7CisKKwkJLyogSnVtcCB0byByZWFsLW1vZGUgZW50cnkgcG9pbnQgKi8KKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkJUkVBTF9DT0RFICggCisJCQkJInB1c2h3ICUwXG5cdCIKKwkJCQkicG9wdyAlJWRzXG5cdCIKKwkJCQkicHVzaGwgJTFcblx0IgorCQkJCSJscmV0XG5cdCIKKwkJCSkKKwkJCToKKwkJCTogInIiICggaXg4Ni0+c2Vncy5kcyApLAorCQkJICAiciIgKCBpeDg2LT5yZWdzLmVicCApLAorCQkJICAiZCIgKCBpeDg2LT5yZWdzLmVieCApLAorCQkJICAiUyIgKCBpeDg2LT5yZWdzLmVzaSApICk7CisKKwkJYXNzZXJ0ICggMCApOyAvKiBFeGVjdXRpb24gc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgcG9pbnQgKi8KKworCQlicmVhazsKKworCWNhc2UgMHgwMDEzOiAvKiBJZGxlIGxvb3AgY2FsbCAqLworCQlzdGVwICggKTsKKwkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQlicmVhazsKKworCWNhc2UgMHgwMDE1OiAvKiBHZXQgZmVhdHVyZSBmbGFncyAqLworCQlpeDg2LT5zZWdzLmVzID0gcm1fZHM7CisJCWl4ODYtPnJlZ3MuYnggPSAoICggdW5zaWduZWQgKSBfX2Zyb21fZGF0YTE2ICggJmNvbWJvb3RfZmVhdHVyZV9mbGFncyApICk7CisJCWl4ODYtPnJlZ3MuY3ggPSAxOyAvKiBOdW1iZXIgb2YgZmVhdHVyZSBmbGFnIGJ5dGVzICovCisJCWl4ODYtPmZsYWdzICY9IH5DRjsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDAxNjogLyogUnVuIGtlcm5lbCBpbWFnZSAqLworCQl7CisJCQl1c2VycHRyX3QgZmlsZV91ID0gcmVhbF90b191c2VyICggaXg4Ni0+c2Vncy5kcywgaXg4Ni0+cmVncy5zaSApOworCQkJdXNlcnB0cl90IGNtZF91ID0gcmVhbF90b191c2VyICggaXg4Ni0+c2Vncy5lcywgaXg4Ni0+cmVncy5ieCApOworCQkJaW50IGZpbGVfbGVuID0gc3RybGVuX3VzZXIgKCBmaWxlX3UsIDAgKTsKKwkJCWludCBjbWRfbGVuID0gc3RybGVuX3VzZXIgKCBjbWRfdSwgMCApOworCQkJY2hhciBmaWxlW2ZpbGVfbGVuICsgMV07CisJCQljaGFyIGNtZFtjbWRfbGVuICsgMV07CisKKwkJCWNvcHlfZnJvbV91c2VyICggZmlsZSwgZmlsZV91LCAwLCBmaWxlX2xlbiArIDEgKTsKKwkJCWNvcHlfZnJvbV91c2VyICggY21kLCBjbWRfdSwgMCwgY21kX2xlbiArIDEgKTsKKworCQkJREJHICggIkNPTUJPT1Q6IHJ1biBrZXJuZWwgJXMgJXNcbiIsIGZpbGUsIGNtZCApOworCQkJY29tYm9vdF9mZXRjaF9rZXJuZWwgKCBmaWxlLCBjbWQgKTsKKwkJCS8qIFRlY2huaWNhbGx5LCB3ZSBzaG91bGQgcmV0dXJuIGlmIHdlCisJCQkgKiBjb3VsZG4ndCBsb2FkIHRoZSBrZXJuZWwsIGJ1dCBpdCdzIG5vdCBzYWZlCisJCQkgKiB0byBkbyB0aGF0IHNpbmNlIHdlIGhhdmUganVzdCBvdmVyd3JpdHRlbgorCQkJICogcGFydCBvZiB0aGUgQ09NQk9PVCBwcm9ncmFtJ3MgbWVtb3J5IHNwYWNlLgorCQkJICovCisJCQlEQkcgKCAiQ09NQk9PVDogZXhpdGluZyB0byBydW4ga2VybmVsLi4uXG4iICk7CisJCQlybWxvbmdqbXAgKCBjb21ib290X3JldHVybiwgQ09NQk9PVF9FWElUX1JVTl9LRVJORUwgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwMDE3OiAvKiBSZXBvcnQgdmlkZW8gbW9kZSBjaGFuZ2UgKi8KKwkJY29tYm9vdF9ncmFwaGljc19tb2RlID0gaXg4Ni0+cmVncy5ieDsKKwkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQlicmVhazsKKworCWNhc2UgMHgwMDE4OiAvKiBRdWVyeSBjdXN0b20gZm9udCAqLworCQkvKiBGSVhNRTogc3R1YiAqLworCQlpeDg2LT5yZWdzLmFsID0gMDsKKwkJaXg4Ni0+c2Vncy5lcyA9IDA7CisJCWl4ODYtPnJlZ3MuYnggPSAwOworCQlpeDg2LT5mbGFncyAmPSB+Q0Y7CisJCWJyZWFrOworCisJY2FzZSAweDAwMUI6IC8qIENsZWFudXAsIHNodWZmbGUgYW5kIGJvb3QgdG8gcmVhbCBtb2RlICovCisJCWlmICggaXg4Ni0+cmVncy5jeCA+IENPTUJPT1RfTUFYX1NIVUZGTEVfREVTQ1JJUFRPUlMgKQorCQkJYnJlYWs7CisKKwkJLyogUGVyZm9ybSBmaW5hbCBjbGVhbnVwICovCisJCXNodXRkb3duICggU0hVVERPV05fQk9PVCApOworCisJCS8qIFBlcmZvcm0gc2VxdWVuY2Ugb2YgY29waWVzICovCisJCXNodWZmbGUgKCBpeDg2LT5zZWdzLmVzLCBpeDg2LT5yZWdzLmRpLCBpeDg2LT5yZWdzLmN4ICk7CisKKwkJLyogQ29weSBpbml0aWFsIHJlZ2lzdGVyIHZhbHVlcyB0byAudGV4dDE2ICovCisJCW1lbWNweV91c2VyICggcmVhbF90b191c2VyICggcm1fY3MsICh1bnNpZ25lZCkgX19mcm9tX3RleHQxNiAoICZjb21ib290X2luaXRpYWxfcmVncyApICksIDAsCisJCSAgICAgICAgICAgICAgcmVhbF90b191c2VyICggaXg4Ni0+c2Vncy5kcywgaXg4Ni0+cmVncy5zaSApLCAwLAorCQkgICAgICAgICAgICAgIHNpemVvZihzeXNsaW51eF9ybV9yZWdzKSApOworCisJCS8qIExvYWQgaW5pdGlhbCByZWdpc3RlciB2YWx1ZXMgKi8KKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkJUkVBTF9DT0RFICgKKwkJCQkvKiBQb2ludCBTUzpTUCBhdCB0aGUgcmVnaXN0ZXIgdmFsdWUgc3RydWN0dXJlICovCisJCQkJInB1c2h3ICUlY3Ncblx0IgorCQkJCSJwb3B3ICUlc3Ncblx0IgorCQkJCSJtb3Z3ICRjb21ib290X2luaXRpYWxfcmVncywgJSVzcFxuXHQiCisKKwkJCQkvKiBTZWdtZW50IHJlZ2lzdGVycyAqLworCQkJCSJwb3B3ICUlZXNcblx0IgorCQkJCSJwb3B3ICUlYXhcblx0IiAvKiBTa2lwIENTICovCisJCQkJInBvcHcgJSVkc1xuXHQiCisJCQkJInBvcHcgJSVheFxuXHQiIC8qIFNraXAgU1MgZm9yIG5vdyAqLworCQkJCSJwb3B3ICUlZnNcblx0IgorCQkJCSJwb3B3ICUlZ3Ncblx0IgorCisJCQkJLyogR1AgcmVnaXN0ZXJzICovCisJCQkJInBvcGwgJSVlYXhcblx0IgorCQkJCSJwb3BsICUlZWN4XG5cdCIKKwkJCQkicG9wbCAlJWVkeFxuXHQiCisJCQkJInBvcGwgJSVlYnhcblx0IgorCQkJCSJwb3BsICUlZWJwXG5cdCIgLyogU2tpcCBFU1AgZm9yIG5vdyAqLworCQkJCSJwb3BsICUlZWJwXG5cdCIKKwkJCQkicG9wbCAlJWVzaVxuXHQiCisJCQkJInBvcGwgJSVlZGlcblx0IgorCisJCQkJLyogTG9hZCBjb3JyZWN0IFNTOkVTUCAqLworCQkJCSJtb3Z3ICQoY29tYm9vdF9pbml0aWFsX3JlZ3MgKyA2KSwgJSVzcFxuXHQiCisJCQkJInBvcHcgJSVzc1xuXHQiCisJCQkJIm1vdmwgJSVjczooY29tYm9vdF9pbml0aWFsX3JlZ3MgKyAyOCksICUlZXNwXG5cdCIKKworCQkJCSJsam1wIColJWNzOihjb21ib290X2luaXRpYWxfcmVncyArIDQ0KVxuXHQiCisJCQkpCisJCQk6IDogKTsKKworCQlicmVhazsKKworCWNhc2UgMHgwMDFDOiAvKiBHZXQgcG9pbnRlciB0byBhdXhpbGxpYXJ5IGRhdGEgdmVjdG9yICovCisJCS8qIEZJWE1FOiBzdHViICovCisJCWl4ODYtPnJlZ3MuY3ggPSAwOyAvKiBTaXplIG9mIHRoZSBBRFYgKi8KKwkJaXg4Ni0+ZmxhZ3MgJj0gfkNGOworCQlicmVhazsKKworCWNhc2UgMHgwMDFEOiAvKiBXcml0ZSBhdXhpbGxpYXJ5IGRhdGEgdmVjdG9yICovCisJCS8qIEZJWE1FOiBzdHViICovCisJCWl4ODYtPmZsYWdzICY9IH5DRjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEQkcgKCAiQ09NQk9PVCB1bmtub3duIGludDIyIGZ1bmN0aW9uICUwNHhcbiIsIGl4ODYtPnJlZ3MuYXggKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIEhvb2sgQklPUyBpbnRlcnJ1cHRzIHJlbGF0ZWQgdG8gQ09NQk9PVCBBUEkgKElOVCAyMGgsIDIxaCwgMjJoKQorICovCit2b2lkIGhvb2tfY29tYm9vdF9pbnRlcnJ1cHRzICggKSB7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCVRFWFQxNl9DT0RFICggIlxuaW50MjBfd3JhcHBlcjpcblx0IgorCQkgICAgICAgICAgICAgICJwdXNobCAlMFxuXHQiCisJCSAgICAgICAgICAgICAgInB1c2h3ICUlY3Ncblx0IgorCQkgICAgICAgICAgICAgICJjYWxsIHByb3RfY2FsbFxuXHQiCisJCSAgICAgICAgICAgICAgImFkZHcgJDQsICUlc3Bcblx0IgorCQkgICAgICAgICAgICAgICJpcmV0XG5cdCIgKQorCQkgICAgICAgICAgOiA6ICJpIiAoIGludDIwICkgKTsKKworCWhvb2tfYmlvc19pbnRlcnJ1cHQgKCAweDIwLCAoIHVuc2lnbmVkIGludCApIGludDIwX3dyYXBwZXIsCisJCSAgICAgICAgICAgICAgICAgICAgICAmaW50MjBfdmVjdG9yICk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCVRFWFQxNl9DT0RFICggIlxuaW50MjFfd3JhcHBlcjpcblx0IgorCQkgICAgICAgICAgICAgICJwdXNobCAlMFxuXHQiCisJCSAgICAgICAgICAgICAgInB1c2h3ICUlY3Ncblx0IgorCQkgICAgICAgICAgICAgICJjYWxsIHByb3RfY2FsbFxuXHQiCisJCSAgICAgICAgICAgICAgImFkZHcgJDQsICUlc3Bcblx0IgorCQkgICAgICAgICAgICAgICJpcmV0XG5cdCIgKQorCQkgICAgICAgICAgOiA6ICJpIiAoIGludDIxICkgKTsKKworCWhvb2tfYmlvc19pbnRlcnJ1cHQgKCAweDIxLCAoIHVuc2lnbmVkIGludCApIGludDIxX3dyYXBwZXIsCisJICAgICAgICAgICAgICAgICAgICAgICZpbnQyMV92ZWN0b3IgKTsKKworCV9fYXNtX18gIF9fdm9sYXRpbGVfXyAoCisJCVRFWFQxNl9DT0RFICggIlxuaW50MjJfd3JhcHBlcjpcblx0IgorCQkgICAgICAgICAgICAgICJwdXNobCAlMFxuXHQiCisJCSAgICAgICAgICAgICAgInB1c2h3ICUlY3Ncblx0IgorCQkgICAgICAgICAgICAgICJjYWxsIHByb3RfY2FsbFxuXHQiCisJCSAgICAgICAgICAgICAgImFkZHcgJDQsICUlc3Bcblx0IgorCQkgICAgICAgICAgICAgICJpcmV0XG5cdCIgKQorCQkgICAgICAgICAgOiA6ICJpIiAoIGludDIyKSApOworCisJaG9va19iaW9zX2ludGVycnVwdCAoIDB4MjIsICggdW5zaWduZWQgaW50ICkgaW50MjJfd3JhcHBlciwKKwkgICAgICAgICAgICAgICAgICAgICAgJmludDIyX3ZlY3RvciApOworfQorCisvKioKKyAqIFVuaG9vayBCSU9TIGludGVycnVwdHMgcmVsYXRlZCB0byBDT01CT09UIEFQSSAoSU5UIDIwaCwgMjFoLCAyMmgpCisgKi8KK3ZvaWQgdW5ob29rX2NvbWJvb3RfaW50ZXJydXB0cyAoICkgeworCisJdW5ob29rX2Jpb3NfaW50ZXJydXB0ICggMHgyMCwgKCB1bnNpZ25lZCBpbnQgKSBpbnQyMF93cmFwcGVyLAorCQkJCSZpbnQyMF92ZWN0b3IgKTsKKworCXVuaG9va19iaW9zX2ludGVycnVwdCAoIDB4MjEsICggdW5zaWduZWQgaW50ICkgaW50MjFfd3JhcHBlciwKKwkJCQkmaW50MjFfdmVjdG9yICk7CisKKwl1bmhvb2tfYmlvc19pbnRlcnJ1cHQgKCAweDIyLCAoIHVuc2lnbmVkIGludCApIGludDIyX3dyYXBwZXIsCisJCQkJJmludDIyX3ZlY3RvciApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9zeXNsaW51eC9jb21ib290X3Jlc29sdi5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L2ludGVyZmFjZS9zeXNsaW51eC9jb21ib290X3Jlc29sdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWM1MDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvaW50ZXJmYWNlL3N5c2xpbnV4L2NvbWJvb3RfcmVzb2x2LmMKQEAgLTAsMCArMSw2MCBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y29tYm9vdC5oPgorI2luY2x1ZGUgPGdweGUvaW4uaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3Jlc29sdi5oPgorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0YXRpYyBpbnQgY29tYm9vdF9yZXNvbHZfcmM7CitzdGF0aWMgc3RydWN0IGluX2FkZHIgY29tYm9vdF9yZXNvbHZfYWRkcjsKKworc3RhdGljIHZvaWQgY29tYm9vdF9yZXNvbHZfZG9uZSAoIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlICpyZXNvbHYsCisJCQkJICBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBpbnQgcmMgKSB7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW47CisKKwlyZXNvbHZfdW5wbHVnICggcmVzb2x2ICk7CisKKwlpZiAoIHJjICE9IDAgKSB7CisJCWNvbWJvb3RfcmVzb2x2X3JjID0gcmM7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIHNhLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCApIHsKKwkJY29tYm9vdF9yZXNvbHZfcmMgPSAtRUFGTk9TVVBQT1JUOworCQlyZXR1cm47CisJfQorCisJc2luID0gKCAoIHN0cnVjdCBzb2NrYWRkcl9pbiAqICkgc2EgKTsKKwljb21ib290X3Jlc29sdl9hZGRyID0gc2luLT5zaW5fYWRkcjsKKworCWNvbWJvb3RfcmVzb2x2X3JjID0gMDsKK30KKworc3RhdGljIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlX29wZXJhdGlvbnMgY29tYm9vdF9yZXNvbHZfb3BzID0geworCS5kb25lID0gY29tYm9vdF9yZXNvbHZfZG9uZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSBjb21ib290X3Jlc29sdmVyID0geworCS5pbnRmID0geworCQkuZGVzdCA9ICZudWxsX3Jlc29sdi5pbnRmLAorCQkucmVmY250ID0gTlVMTCwKKwl9LAorCS5vcCA9ICZjb21ib290X3Jlc29sdl9vcHMsCit9OworCitpbnQgY29tYm9vdF9yZXNvbHYgKCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaW5fYWRkciAqYWRkcmVzcyApIHsKKwlpbnQgcmM7CisKKwljb21ib290X3Jlc29sdl9yYyA9IC1FSU5QUk9HUkVTUzsKKworCWlmICggKCByYyA9IHJlc29sdiAoICZjb21ib290X3Jlc29sdmVyLCBuYW1lLCBOVUxMICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJd2hpbGUgKCBjb21ib290X3Jlc29sdl9yYyA9PSAtRUlOUFJPR1JFU1MgKQorCQlzdGVwKCk7CisKKwkqYWRkcmVzcyA9IGNvbWJvb3RfcmVzb2x2X2FkZHI7CisJcmV0dXJuIGNvbWJvb3RfcmVzb2x2X3JjOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L2tpci1NYWtlZmlsZSBiL2dweGUvc3JjL2FyY2gvaTM4Ni9raXItTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmYzFhMwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9raXItTWFrZWZpbGUKQEAgLTAsMCArMSwyNiBAQAorIyBNYWtlZmlsZSB0byBidWlsZCBhIEtFRVBfSVRfUkVBTCBmbGF2b3VyCisjIAorIyBLRUVQX0lUX1JFQUwsIGJ5IGl0cyBuYXR1cmUsIHJlcXVpcmVzIGEgZGlmZmVyZW50IGJ1aWxkIG9mIGV2ZXJ5CisjIHNpbmdsZSBvYmplY3QgZmlsZSwgc2luY2UgdGhlIGluY2x1c2lvbiBvZiAiLmNvZGUxNmdjYyIgd2lsbAorIyBnZW5lcmF0ZSBkaWZmZXJlbnQgbWFjaGluZSBjb2RlIGZyb20gdGhlIGFzc2VtYmx5LiAgVW5saWtlIHRoZSBvdGhlcgorIyBjb25maWcgb3B0aW9ucywgdGhlcmUgaXMgbm8gd2F5IHRoYXQgdGhpcyBnbG9iYWwgZGVwZW5kZW5jeSBjYW4gZXZlcgorIyBiZSByZWR1Y2VkLCBzbyBpdCBtYWtlcyBzZW5zZSB0byBiZSBhYmxlIHRvIGJ1aWxkIGJvdGggdGhlIG5vcm1hbAorIyBhbmQgdGhlIEtJUiB2ZXJzaW9ucyB3aXRob3V0IGhhdmluZyB0byBmb3JjZSBhIGZ1bGwgcmVidWlsZCBlYWNoCisjIHRpbWUuCisKKyMgQWRkIHRoaXMgTWFrZWZpbGUgdG8gTUFLRURFUFMKKyMKK01BS0VERVBTCSs9IGFyY2gvaTM4Ni9raXItTWFrZWZpbGUKKworIyBQbGFjZSBiaW5hcmllcyBpbiBiaW4ta2lyCisjCitCSU4JCT0gYmluLWtpcgorCisjIENvbXBpbGUgd2l0aCAtREtFRVBfSVRfUkVBTCwgZm9yY2libHkgaW5jbHVkZSBraXIuaCBhdCB0aGUgc3RhcnQgb2YKKyMgZWFjaCBmaWxlIHRvIGRyYWcgaW4gIi5jb2RlMTZnY2MiCisjCitDRkxBR1MJCSs9IC1ES0VFUF9JVF9SRUFMIC1pbmNsdWRlIGtpci5oCisKK2luY2x1ZGUgTWFrZWZpbGUKKworTERTQ1JJUFQJPSBhcmNoL2kzODYvc2NyaXB0cy9pMzg2LWtpci5sZHMKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvYm9vdHBhcnQuUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvYm9vdHBhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhkYTFhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9ib290cGFydC5TCkBAIC0wLDAgKzEsMjE4IEBACitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICkKKworI2RlZmluZSBCT09UX1NFRwkweDA3YzAKKyNkZWZpbmUgRVhFQ19TRUcJMHgwMTAwCisjZGVmaW5lIFNUQUNLX1NFRyAJMHgwMjAwCisjZGVmaW5lIFNUQUNLX1NJWkUJMHgyMDAwCisJCisJLnRleHQKKwkuYXJjaCBpMzg2CisJLnNlY3Rpb24gIi5wcmVmaXgiLCAiYXd4IiwgQHByb2diaXRzCisJLmNvZGUxNgorCisvKgorICogRmluZCBhY3RpdmUgcGFydGl0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWRsCTogQklPUyBkcml2ZSBudW1iZXIKKyAqICAgJWJwCTogQWN0aXZlIHBhcnRpdGlvbiBoYW5kbGVyIHJvdXRpbmUKKyAqLworZmluZF9hY3RpdmVfcGFydGl0aW9uOgorCS8qIFNldCB1cCBzdGFjayBhdCBTVEFDS19TRUc6U1RBQ0tfU0laRSAqLworCW1vdncJJFNUQUNLX1NFRywgJWF4CisJbW92dwklYXgsICVzcworCW1vdncJJFNUQUNLX1NJWkUsICVzcAorCisJLyogUmVsb2NhdGUgc2VsZiB0byBFWEVDX1NFRyAqLworCXB1c2h3CSRCT09UX1NFRworCXBvcHcJJWRzCisJcHVzaHcJJEVYRUNfU0VHCisJcG9wdwklZXMKKwl4b3J3CSVzaSwgJXNpCisJeG9ydwklZGksICVkaQorCW1vdncJJDB4MjAwLCAlY3gKKwlyZXAgbW92c2IKKwlsam1wCSRFWEVDX1NFRywgJDFmCisxOglwdXNodwklZHMKKwlwb3B3CSVlcworCXB1c2h3CSVjcworCXBvcHcJJWRzCisKKwkvKiBDaGVjayBmb3IgTEJBIGV4dGVuc2lvbnMgKi8KKwltb3ZiCSQweDQxLCAlYWgKKwltb3Z3CSQweDU1YWEsICVieAorCXN0YworCWludAkkMHgxMworCWpjCTFmCisJY21wdwkkMHhhYTU1LCAlYngKKwlqbmUJMWYKKwltb3Z3CSRyZWFkX2xiYSwgcmVhZF9zZWN0b3JzCisxOgkKKwkvKiBSZWFkIGFuZCBwcm9jZXNzIHJvb3QgcGFydGl0aW9uIHRhYmxlICovCisJeG9yYgklZGgsICVkaAorCW1vdncJJDB4MDAwMSwgJWN4CisJeG9ybAklZXNpLCAlZXNpCisJeG9ybAklZWRpLCAlZWRpCisJY2FsbAlwcm9jZXNzX3RhYmxlCisKKwkvKiBQcmludCBmYWlsdXJlIG1lc3NhZ2UgKi8KKwltb3Z3CSQxMGYsICVzaQorCWptcAlib290X2Vycm9yCisxMDoJLmFzY2l6CSJDb3VsZCBub3QgbG9jYXRlIGFjdGl2ZSBwYXJ0aXRpb25cclxuIgorCisvKgorICogUHJpbnQgZmFpbHVyZSBtZXNzYWdlIGFuZCBib290IG5leHQgZGV2aWNlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJXNpCTogRmFpbHVyZSBzdHJpbmcKKyAqLworYm9vdF9lcnJvcjoKKwljbGQKKwltb3Z3CSQweDAwMDcsICVieAorCW1vdmIJJDB4MGUsICVhaAorMToJbG9kc2IKKwl0ZXN0YgklYWwsICVhbAorCWplCTk5ZgorCWludAkkMHgxMAorCWptcAkxYgorOTk6CS8qIEJvb3QgbmV4dCBkZXZpY2UgKi8KKwlpbnQJJDB4MTgKKworLyoKKyAqIFByb2Nlc3MgcGFydGl0aW9uIHRhYmxlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWRsCTogQklPUyBkcml2ZSBudW1iZXIKKyAqICAgJWRoCTogSGVhZAorICogICAlY2wJOiBTZWN0b3IgKGJpdHMgMC01KSwgaGlnaCB0d28gYml0cyBvZiBjeWxpbmRlciAoYml0cyA2LTcpCisgKiAgICVjaAk6IExvdyBlaWdodCBiaXRzIG9mIGN5bGluZGVyCisgKiAgICVlc2k6JWVkaQk6IExCQSBhZGRyZXNzCisgKiAgICVicAk6IEFjdGl2ZSBwYXJ0aXRpb24gaGFuZGxlciByb3V0aW5lCisgKgorICogUmV0dXJuczoKKyAqICAgQ0Ygc2V0IG9uIGVycm9yCisgKi8KK3Byb2Nlc3NfdGFibGU6CisJcHVzaGFsCisJY2FsbAlyZWFkX2Jvb3Rfc2VjdG9yCisJamMJOTlmCisJbW92dwkkNDQ2LCAlYngKKzE6CWNhbGwJcHJvY2Vzc19wYXJ0aXRpb24KKwlhZGR3CSQxNiwgJWJ4CisJY21wdwkkNTEwLCAlYngKKwlqbmUJMWIKKzk5Oglwb3BhbAorCXJldAorCisvKgorICogUHJvY2VzcyBwYXJ0aXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlZGwJOiBCSU9TIGRyaXZlIG51bWJlcgorICogICAlZGgJOiBIZWFkCisgKiAgICVjbAk6IFNlY3RvciAoYml0cyAwLTUpLCBoaWdoIHR3byBiaXRzIG9mIGN5bGluZGVyIChiaXRzIDYtNykKKyAqICAgJWNoCTogTG93IGVpZ2h0IGJpdHMgb2YgY3lsaW5kZXIKKyAqICAgJWVzaTolZWRpCTogTEJBIGFkZHJlc3MKKyAqICAgJWJ4CTogT2Zmc2V0IHdpdGhpbiBwYXJ0aXRpb24gdGFibGUKKyAqICAgJWJwCTogQWN0aXZlIHBhcnRpdGlvbiBoYW5kbGVyIHJvdXRpbmUKKyAqLworcHJvY2Vzc19wYXJ0aXRpb246CisJcHVzaGFsCisJLyogTG9hZCBDL0gvUyB2YWx1ZXMgZnJvbSBwYXJ0aXRpb24gZW50cnkgKi8KKwltb3ZiCSVlczoxKCVieCksICVkaAorCW1vdncJJWVzOjIoJWJ4KSwgJWN4CisJLyogVXBkYXRlIExCQSBhZGRyZXNzIGZyb20gcGFydGl0aW9uIGVudHJ5ICovCisJYWRkbAklZXM6OCglYngpLCAlZWRpCisJYWRjbAkkMCwgJWVzaQorCS8qIENoZWNrIGFjdGl2ZSBmbGFnICovCisJdGVzdGIJJDB4ODAsICVlczooJWJ4KQorCWp6CTFmCisJY2FsbAlyZWFkX2Jvb3Rfc2VjdG9yCisJamMJOTlmCisJam1wCSolYnAKKzE6CS8qIENoZWNrIGZvciBleHRlbmRlZCBwYXJ0aXRpb24gKi8KKwltb3ZiCSVlczo0KCVieCksICVhbAorCWNtcGIJJDB4MDUsICVhbAorCWplCTJmCisJY21wYgkkMHgwZiwgJWFsCisJamUJMmYKKwljbXBiCSQweDg1LCAlYWwKKwlqbmUJOTlmCisyOgljYWxsCXByb2Nlc3NfdGFibGUKKzk5Oglwb3BhbAorCS8qIFJlbG9hZCBvcmlnaW5hbCBwYXJ0aXRpb24gdGFibGUgKi8KKwljYWxsCXJlYWRfYm9vdF9zZWN0b3IKKwlyZXQKKworLyoKKyAqIFJlYWQgc2luZ2xlIHNlY3RvciB0byAlZXM6MDAwMCBhbmQgdmVyaWZ5IDB4NTVhYSBzaWduYXR1cmUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlZGwJOiBCSU9TIGRyaXZlIG51bWJlcgorICogICAlZGgJOiBIZWFkCisgKiAgICVjbAk6IFNlY3RvciAoYml0cyAwLTUpLCBoaWdoIHR3byBiaXRzIG9mIGN5bGluZGVyIChiaXRzIDYtNykKKyAqICAgJWNoCTogTG93IGVpZ2h0IGJpdHMgb2YgY3lsaW5kZXIKKyAqICAgJWVzaTolZWRpCTogTEJBIGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zOgorICogICBDRiBzZXQgb24gZXJyb3IKKyAqLworcmVhZF9ib290X3NlY3RvcjoKKwlwdXNodwklYXgKKwltb3Z3CSQxLCAlYXgKKwljYWxsCSpyZWFkX3NlY3RvcnMKKwlqYwk5OWYKKwljbXB3CSQweGFhNTUsICVlczooNTEwKQorCWplCTk5ZgorCXN0YwkKKzk5Oglwb3B3CSVheAorCXJldAorCQorLyoKKyAqIFJlYWQgc2VjdG9ycyB0byAlZXM6MDAwMAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICVkbAk6IEJJT1MgZHJpdmUgbnVtYmVyCisgKiAgICVkaAk6IEhlYWQKKyAqICAgJWNsCTogU2VjdG9yIChiaXRzIDAtNSksIGhpZ2ggdHdvIGJpdHMgb2YgY3lsaW5kZXIgKGJpdHMgNi03KQorICogICAlY2gJOiBMb3cgZWlnaHQgYml0cyBvZiBjeWxpbmRlcgorICogICAlZXNpOiVlZGkJOiBMQkEgYWRkcmVzcworICogICAlYXgJOiBOdW1iZXIgb2Ygc2VjdG9ycyAobWF4IDEyNykKKyAqCisgKiBSZXR1cm5zOgorICogICBDRiBzZXQgb24gZXJyb3IKKyAqLworcmVhZF9zZWN0b3JzOgkud29yZAlyZWFkX2NocworCityZWFkX2NoczoKKwkvKiBSZWFkIHNlY3RvcnMgdXNpbmcgQy9IL1MgYWRkcmVzcyAqLworCXB1c2hhbAorCXhvcncJJWJ4LCAlYngKKwltb3ZiCSQweDAyLCAlYWgKKwlzdGMKKwlpbnQJJDB4MTMKKwlzdGkKKwlwb3BhbAorCXJldAorCityZWFkX2xiYToKKwkvKiBSZWFkIHNlY3RvcnMgdXNpbmcgTEJBIGFkZHJlc3MgKi8KKwlwdXNoYWwKKwltb3Z3CSVheCwgKGxiYV9kZXNjICsgMikKKwlwdXNodwklZXMKKwlwb3B3CShsYmFfZGVzYyArIDYpCisJbW92bAklZWRpLCAobGJhX2Rlc2MgKyA4KQorCW1vdmwJJWVzaSwgKGxiYV9kZXNjICsgMTIpCisJbW92dwkkbGJhX2Rlc2MsICVzaQorCW1vdmIJJDB4NDIsICVhaAorCWludAkkMHgxMworCXBvcGFsCisJcmV0CisKK2xiYV9kZXNjOgorCS5ieXRlCTB4MTAKKwkuYnl0ZQkwCisJLndvcmQJMQorCS53b3JkCTB4MDAwMAorCS53b3JkCTB4MDAwMAorCS5sb25nCTAsIDAKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvZHNrcHJlZml4LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L2Rza3ByZWZpeC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZDM1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L2Rza3ByZWZpeC5TCkBAIC0wLDAgKzEsMzgxIEBACisvKiBOT1RFOiB0aGlzIGJvb3Qgc2VjdG9yIGNvbnRhaW5zIGluc3RydWN0aW9ucyB0aGF0IG5lZWQgYXQgbGVhc3QgYW4gODAxODYuCisgKiBZZXMsIGFzODYgaGFzIGEgYnVnIHNvbWV3aGVyZSBpbiB0aGUgdmFsaWQgaW5zdHJ1Y3Rpb24gc2V0IGNoZWNrcy4KKyAqCisgKi8KKworLyoJZmxvcHB5bG9hZC5TIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcworICoJbW9kaWZpZWQgYnkgRHJldyBFY2toYXJkdAorICoJbW9kaWZpZWQgYnkgQnJ1Y2UgRXZhbnMgKGJkZSkKKyAqCisgKiBmbG9wcHlwcmVmaXguUyBpcyBsb2FkZWQgYXQgMHgwMDAwOjB4N2MwMCBieSB0aGUgYmlvcy1zdGFydHVwIHJvdXRpbmVzLgorICoKKyAqIEl0IHRoZW4gbG9hZHMgdGhlIHN5c3RlbSBhdCBTWVNTRUc8PDQsIHVzaW5nIEJJT1MgaW50ZXJydXB0cy4KKyAqCisgKiBUaGUgbG9hZGVyIGhhcyBiZWVuIG1hZGUgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLCBhbmQgY29udGludW91cyByZWFkIGVycm9ycworICogd2lsbCByZXN1bHQgaW4gYSB1bmJyZWFrYWJsZSBsb29wLiBSZWJvb3QgYnkgaGFuZC4gSXQgbG9hZHMgcHJldHR5IGZhc3QgYnkKKyAqIGdldHRpbmcgd2hvbGUgdHJhY2tzIGF0IGEgdGltZSB3aGVuZXZlciBwb3NzaWJsZS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKQorCisuZXF1CUJPT1RTRUcsIDB4MDdDMAkJCS8qIG9yaWdpbmFsIGFkZHJlc3Mgb2YgYm9vdC1zZWN0b3IgKi8KKworLmVxdQlTWVNTRUcsIDB4MTAwMAkJCS8qIHN5c3RlbSBsb2FkZWQgYXQgU1lTU0VHPDw0ICovCisKKwkub3JnCTAKKwkuYXJjaCBpMzg2CisJLnRleHQKKwkuc2VjdGlvbiAiLnByZWZpeCIsICJheCIsIEBwcm9nYml0cworCS5jb2RlMTYKKworCWptcAkkQk9PVFNFRywgJGdvCQkvKiByZWxvYWQgY3M6aXAgdG8gbWF0Y2ggcmVsb2NhdGlvbiBhZGRyICovCitnbzogCisJbW92dwkkMHgyMDAwLTEyLCAlZGkJCS8qIDB4MjAwMCBpcyBhcmJpdHJhcnkgdmFsdWUgPj0gbGVuZ3RoICovCisJCQkJCS8qIG9mIGJvb3RzZWN0ICsgcm9vbSBmb3Igc3RhY2sgKyAxMiBmb3IgKi8KKwkJCQkJLyogc2F2ZWQgZGlzayBwYXJtIGJsb2NrICovCisKKwltb3Z3CSRCT09UU0VHLCAlYXgKKwltb3Z3CSVheCwlZHMKKwltb3Z3CSVheCwlZXMKKwltb3Z3CSVheCwlc3MJCQkvKiBwdXQgc3RhY2sgYXQgQk9PVFNFRzoweDQwMDAtMTIuICovCisJbW92dwklZGksJXNwCisKKy8qIE1hbnkgQklPUydzIGRlZmF1bHQgZGlzayBwYXJhbWV0ZXIgdGFibGVzIHdpbGwgbm90IHJlY29nbml6ZSBtdWx0aS1zZWN0b3IKKyAqIHJlYWRzIGJleW9uZCB0aGUgbWF4aW11bSBzZWN0b3IgbnVtYmVyIHNwZWNpZmllZCBpbiB0aGUgZGVmYXVsdCBkaXNrZXR0ZQorICogcGFyYW1ldGVyIHRhYmxlcyAtIHRoaXMgbWF5IG1lYW4gNyBzZWN0b3JzIGluIHNvbWUgY2FzZXMuCisgKgorICogU2luY2Ugc2luZ2xlIHNlY3RvciByZWFkcyBhcmUgc2xvdyBhbmQgb3V0IG9mIHRoZSBxdWVzdGlvbiwgd2UgbXVzdCB0YWtlIGNhcmUKKyAqIG9mIHRoaXMgYnkgY3JlYXRpbmcgbmV3IHBhcmFtZXRlciB0YWJsZXMgKGZvciB0aGUgZmlyc3QgZGlzaykgaW4gUkFNLiAgV2UKKyAqIHdpbGwgc2V0IHRoZSBtYXhpbXVtIHNlY3RvciBjb3VudCB0byAzNiAtIHRoZSBtb3N0IHdlIHdpbGwgZW5jb3VudGVyIG9uIGFuCisgKiBFRCAyLjg4LiAgSGlnaCBkb2Vzbid0IGh1cnQuCUxvdyBkb2VzLgorICoKKyAqIFNlZ21lbnRzIGFyZSBhcyBmb2xsb3dzOiBkcz1lcz1zcz1jcyAtIEJPT1RTRUcKKyAqLworCisJeG9ydwklY3gsJWN4CisJbW92dwklY3gsJWVzCQkJLyogYWNjZXNzIHNlZ21lbnQgMCAqLworCW1vdncJJDB4NzgsICVieAkJLyogMDpieCBpcyBwYXJhbWV0ZXIgdGFibGUgYWRkcmVzcyAqLworCXB1c2h3CSVkcwkJCS8qIHNhdmUgZHMgKi8KKy8qIDA6YnggaXMgcGFyYW1ldGVyIHRhYmxlIGFkZHJlc3MgKi8KKwlsZHN3CSVlczooJWJ4KSwlc2kJCS8qIGxvYWRzIGRzIGFuZCBzaSAqLworCisJbW92dwklYXgsJWVzCQkJLyogYXggaXMgQk9PVFNFQ1QgKGxvYWRlZCBhYm92ZSkgKi8KKwltb3ZiCSQ2LCAlY2wJCQkvKiBjb3B5IDEyIGJ5dGVzICovCisJY2xkCisJcHVzaHcJJWRpCQkJLyoga2VlcCBhIGNvcHkgZm9yIGxhdGVyICovCisJcmVwCisJbW92c3cJCQkJLyogZHM6c2kgaXMgc291cmNlLCBlczpkaSBpcyBkZXN0ICovCisJcG9wdwklZGkKKworCW1vdmIJJDM2LCVlczo0KCVkaSkKKworCW1vdncJJWN4LCVkcwkJCS8qIGFjY2VzcyBzZWdtZW50IDAgKi8KKwl4Y2hndwklZGksKCVieCkKKwltb3Z3CSVlcywlc2kKKwl4Y2hndwklc2ksMiglYngpCisJcG9wdwklZHMJCQkvKiByZXN0b3JlIGRzICovCisJbW92dwklZGksIGRwb2ZmCQkvKiBzYXZlIG9sZCBwYXJhbWV0ZXJzICovCisJbW92dwklc2ksIGRwc2VnCQkvKiB0byByZXN0b3JlIGp1c3QgYmVmb3JlIGZpbmlzaGluZyAqLworCXB1c2h3CSVkcworCXBvcHcJJWVzCQkJLyogcmVsb2FkIGVzICovCisKKy8qIE5vdGUgdGhhdCBlcyBpcyBhbHJlYWR5IHNldCB1cC4gIEFsc28gY3ggaXMgMCBmcm9tIHJlcCBtb3ZzdyBhYm92ZS4gKi8KKworCXhvcmIJJWFoLCVhaAkJCS8qIHJlc2V0IEZEQyAqLworCXhvcmIJJWRsLCVkbAorCWludAkkMHgxMworCisvKiBHZXQgZGlzayBkcml2ZSBwYXJhbWV0ZXJzLCBzcGVjaWZpY2FsbHkgbnVtYmVyIG9mIHNlY3RvcnMvdHJhY2suCisgKgorICogSXQgc2VlbXMgdGhhdCB0aGVyZSBpcyBubyBCSU9TIGNhbGwgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygc2VjdG9ycy4gIEd1ZXNzCisgKiAzNiBzZWN0b3JzIGlmIHNlY3RvciAzNiBjYW4gYmUgcmVhZCwgMTggc2VjdG9ycyBpZiBzZWN0b3IgMTggY2FuIGJlIHJlYWQsCisgKiAxNSBpZiBzZWN0b3IgMTUgY2FuIGJlIHJlYWQuCU90aGVyd2lzZSBndWVzcyA5LgorICovCisKKwltb3Z3CSRkaXNrc2l6ZXMsICVzaQkJLyogdGFibGUgb2Ygc2l6ZXMgdG8gdHJ5ICovCisKK3Byb2JlX2xvb3A6IAorCWxvZHNiCisJY2J0dwkJCQkvKiBleHRlbmQgdG8gd29yZCAqLworCW1vdncJJWF4LCBzZWN0b3JzCisJY21wdwkkZGlza3NpemVzKzQsICVzaQorCWphZQlnb3Rfc2VjdG9ycwkJLyogaWYgYWxsIGVsc2UgZmFpbHMsIHRyeSA5ICovCisJeGNoZ3cJJWN4LCVheAkJCS8qIGN4ID0gdHJhY2sgYW5kIHNlY3RvciAqLworCXhvcncJJWR4LCVkeAkJCS8qIGRyaXZlIDAsIGhlYWQgMCAqLworCW1vdncJJDB4MDIwMCwgJWJ4CQkvKiBhZGRyZXNzIGFmdGVyIGJvb3Qgc2VjdG9yICovCisJCQkJCS8qICAgKDUxMiBieXRlcyBmcm9tIG9yaWdpbiwgZXMgPSBjcykgKi8KKwltb3Z3CSQweDAyMDEsICVheAkJLyogc2VydmljZSAyLCAxIHNlY3RvciAqLworCWludAkkMHgxMworCWpjCXByb2JlX2xvb3AJCS8qIHRyeSBuZXh0IHZhbHVlICovCisKK2dvdF9zZWN0b3JzOiAKKwltb3Z3CSRtc2cxZW5kLW1zZzEsICVjeAorCW1vdncJJG1zZzEsICVzaQorCWNhbGwJcHJpbnRfc3RyCisKKy8qIG9rLCB3ZSd2ZSB3cml0dGVuIHRoZSBMb2FkaW5nLi4uIG1lc3NhZ2UsIG5vdyB3ZSB3YW50IHRvIGxvYWQgdGhlIHN5c3RlbSAqLworCisJbW92dwkkU1lTU0VHLCAlYXgKKwltb3Z3CSVheCwlZXMJCQkvKiBzZWdtZW50IG9mIFNZU1NFRzw8NCAqLworCXB1c2h3CSVlcworCWNhbGwJcmVhZF9pdAorCisvKiBUaGlzIHR1cm5zIG9mZiB0aGUgZmxvcHB5IGRyaXZlIG1vdG9yLCBzbyB0aGF0IHdlIGVudGVyIHRoZSBrZXJuZWwgaW4gYQorICoga25vd24gc3RhdGUsIGFuZCBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0IGxhdGVyLgorICovCisJbW92dwkkMHgzZjIsICVkeAorCXhvcmIJJWFsLCVhbAorCW91dGIJJWFsLCVkeAorCisJY2FsbAlwcmludF9ubAorCXBvcAklZXMJCQkvKiA9IFNZU1NFRyAqLworCisvKiBSZXN0b3JlIG9yaWdpbmFsIGRpc2sgcGFyYW1ldGVycyAqLworCW1vdncJJDB4NzgsICVieAorCW1vdncJZHBvZmYsICVkaQorCW1vdncJZHBzZWcsICVzaQorCXhvcncJJWF4LCVheAorCW1vdncJJWF4LCVkcworCW1vdncJJWRpLCglYngpCisJbW92dwklc2ksMiglYngpCisKKwkvKiBFdmVyeXRoaW5nIG5vdyBsb2FkZWQuICAlZXMgPSBTWVNTRUcsIHNvICVlczowMDAwIHBvaW50cyB0bworCSAqIHN0YXJ0IG9mIGxvYWRlZCBpbWFnZS4KKwkgKi8KKworCS8qIEp1bXAgdG8gbG9hZGVkIGNvcHkgKi8KKwlsam1wCSRTWVNTRUcsICRzdGFydF9ydW50aW1lCisKK2VuZHNlZzoJLndvcmQgU1lTU0VHCisJLnNlY3Rpb24gIi56aW5mby5maXh1cCIsICJhIiwgQHByb2diaXRzCS8qIENvbXByZXNzb3IgZml4dXBzICovCisJLmFzY2lpCSJBRERXIgorCS5sb25nCWVuZHNlZworCS5sb25nCTE2CisJLmxvbmcJMAorCS5wcmV2aW91cworCisvKiBUaGlzIHJvdXRpbmUgbG9hZHMgdGhlIHN5c3RlbSBhdCBhZGRyZXNzIFNZU1NFRzw8NCwgbWFraW5nIHN1cmUgbm8gNjRrQgorICogYm91bmRhcmllcyBhcmUgY3Jvc3NlZC4gV2UgdHJ5IHRvIGxvYWQgaXQgYXMgZmFzdCBhcyBwb3NzaWJsZSwgbG9hZGluZyB3aG9sZQorICogdHJhY2tzIHdoZW5ldmVyIHdlIGNhbi4KKyAqCisgKiBpbjoJZXMgLSBzdGFydGluZyBhZGRyZXNzIHNlZ21lbnQgKG5vcm1hbGx5IFNZU1NFRykKKyAqLworcmVhZF9pdDogCisJbW92dwkkMCxzcmVhZAkJLyogbG9hZCB3aG9sZSBpbWFnZSBpbmNsdWRpbmcgcHJlZml4ICovCisJbW92dwklZXMsJWF4CisJdGVzdHcJJDB4MGZmZiwgJWF4CitkaWU6CWpuZQlkaWUJCQkvKiBlcyBtdXN0IGJlIGF0IDY0a0IgYm91bmRhcnkgKi8KKwl4b3J3CSVieCwlYngJCQkvKiBieCBpcyBzdGFydGluZyBhZGRyZXNzIHdpdGhpbiBzZWdtZW50ICovCitycF9yZWFkOiAKKwltb3Z3CSVlcywlYXgKKwltb3Z3CSVieCwlZHgKKwltb3ZiCSQ0LCAlY2wKKwlzaHJ3CSVjbCwlZHgJCQkvKiBieCBpcyBhbHdheXMgZGl2aXNpYmxlIGJ5IDE2ICovCisJYWRkdwklZHgsJWF4CisJY21wdwllbmRzZWcsICVheAkvKiBoYXZlIHdlIGxvYWRlZCBhbGwgeWV0PyAqLworCWpiCW9rMV9yZWFkCisJcmV0CitvazFfcmVhZDogCisJbW92dwlzZWN0b3JzLCAlYXgKKwlzdWJ3CXNyZWFkLCAlYXgKKwltb3Z3CSVheCwlY3gKKwlzaGx3CSQ5LCAlY3gKKwlhZGR3CSVieCwlY3gKKwlqbmMJb2syX3JlYWQKKwlqZQlvazJfcmVhZAorCXhvcncJJWF4LCVheAorCXN1YncJJWJ4LCVheAorCXNocncJJDksICVheAorb2syX3JlYWQ6IAorCWNhbGwJcmVhZF90cmFjaworCW1vdncJJWF4LCVjeAorCWFkZHcJc3JlYWQsICVheAorCWNtcHcJc2VjdG9ycywgJWF4CisJam5lCW9rM19yZWFkCisJbW92dwkkMSwgJWF4CisJc3VidwloZWFkLCAlYXgKKwlqbmUJb2s0X3JlYWQKKwlpbmN3CXRyYWNrCitvazRfcmVhZDogCisJbW92dwklYXgsIGhlYWQKKwl4b3J3CSVheCwlYXgKK29rM19yZWFkOiAKKwltb3Z3CSVheCwgc3JlYWQKKwlzaGx3CSQ5LCAlY3gKKwlhZGR3CSVjeCwlYngKKwlqbmMJcnBfcmVhZAorCW1vdncJJWVzLCVheAorCWFkZGIJJDB4MTAsICVhaAorCW1vdncJJWF4LCVlcworCXhvcncJJWJ4LCVieAorCWptcAlycF9yZWFkCisKK3JlYWRfdHJhY2s6IAorCXB1c2hhCisJcHVzaHcJJWF4CisJcHVzaHcJJWJ4CisJcHVzaHcJJWJwCQkJLyoganVzdCBpbiBjYXNlIHRoZSBCSU9TIGlzIGJ1Z2d5ICovCisJbW92dwkkMHgwZTJlLCAlYXgJCS8qIDB4MmUgPSAuICovCisJbW92dwkkMHgwMDA3LCAlYngKKwlpbnQJJDB4MTAKKwlwb3B3CSVicAorCXBvcHcJJWJ4CisJcG9wdwklYXgKKworCW1vdncJdHJhY2ssICVkeAorCW1vdncJc3JlYWQsICVjeAorCWluY3cJJWN4CisJbW92YgklZGwsJWNoCisJbW92dwloZWFkLCAlZHgKKwltb3ZiCSVkbCwlZGgKKwlhbmR3CSQweDAxMDAsICVkeAorCW1vdmIJJDIsICVhaAorCisJcHVzaHcJJWR4CQkJLyogc2F2ZSBmb3IgZXJyb3IgZHVtcCAqLworCXB1c2h3CSVjeAorCXB1c2h3CSVieAorCXB1c2h3CSVheAorCisJaW50CSQweDEzCisJamMJYmFkX3J0CisJYWRkdwkkOCwgJXNwCisJcG9wYQorCXJldAorCitiYWRfcnQ6IHB1c2h3CSVheAkJCS8qIHNhdmUgZXJyb3IgY29kZSAqLworCWNhbGwJcHJpbnRfYWxsCQkvKiBhaCA9IGVycm9yLCBhbCA9IHJlYWQgKi8KKworCXhvcmIJJWFoLCVhaAorCXhvcmIJJWRsLCVkbAorCWludAkkMHgxMworCisJYWRkdwkkMTAsICVzcAorCXBvcGEKKwlqbXAJcmVhZF90cmFjaworCisvKiBwcmludF9hbGwgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4JSXQgd2lsbCBwcmludCBvdXQgYWxsIG9mIHRoZSByZWdpc3RlcnMuCisgKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgaXMgY2FsbGVkIGZyb20gYSByb3V0aW5lLCB3aXRoIGEgc3RhY2sgZnJhbWUgbGlrZQorICoJZHgKKyAqCWN4CisgKglieAorICoJYXgKKyAqCWVycm9yCisgKglyZXQgPC0gc3AKKyAqLworCitwcmludF9hbGw6IAorCWNhbGwJcHJpbnRfbmwJCS8qIG5sIGZvciByZWFkYWJpbGl0eSAqLworCW1vdncJJDUsICVjeAkJCS8qIGVycm9yIGNvZGUgKyA0IHJlZ2lzdGVycyAqLworCW1vdncJJXNwLCVicAorCitwcmludF9sb29wOiAKKwlwdXNodwklY3gJCQkvKiBzYXZlIGNvdW50IGxlZnQgKi8KKworCWNtcGIJJDUsICVjbAorCWphZQlub19yZWcJCQkvKiBzZWUgaWYgcmVnaXN0ZXIgbmFtZSBpcyBuZWVkZWQgKi8KKworCW1vdncJJDB4MDAwNywgJWJ4CQkvKiBwYWdlIDAsIGF0dHJpYnV0ZSA3IChub3JtYWwpICovCisJbW92dwkkMHhlMDUrMHg0MS0xLCAlYXgKKwlzdWJiCSVjbCwlYWwKKwlpbnQJJDB4MTAKKworCW1vdmIJJDB4NTgsICVhbAkJLyogJ1gnICovCisJaW50CSQweDEwCisKKwltb3ZiCSQweDNBLCAlYWwJCS8qICc6JyAqLworCWludAkkMHgxMAorCitub19yZWc6IAorCWFkZHcJJDIsICVicAkJCS8qIG5leHQgcmVnaXN0ZXIgKi8KKwljYWxsCXByaW50X2hleAkJLyogcHJpbnQgaXQgKi8KKwltb3ZiCSQweDIwLCAlYWwJCS8qIHByaW50IGEgc3BhY2UgKi8KKwlpbnQJJDB4MTAKKwlwb3B3CSVjeAorCWxvb3AJcHJpbnRfbG9vcAorCWNhbGwJcHJpbnRfbmwJCS8qIG5sIGZvciByZWFkYWJpbGl0eSAqLworCXJldAorCitwcmludF9zdHI6IAorCW1vdncJJDB4MDAwNywgJWJ4CQkvKiBwYWdlIDAsIGF0dHJpYnV0ZSA3IChub3JtYWwpICovCisJbW92YgkkMHgwZSwgJWFoCQkvKiB3cml0ZSBjaGFyLCB0dHkgbW9kZSAqLworcHJsb29wOiAKKwlsb2RzYgorCWludAkkMHgxMAorCWxvb3AJcHJsb29wCisJcmV0CisKK3ByaW50X25sOiAKKwltb3Z3CSQweDAwMDcsICVieAkJLyogcGFnZSAwLCBhdHRyaWJ1dGUgNyAobm9ybWFsKSAqLworCW1vdncJJDB4ZTBkLCAlYXgJCS8qIENSICovCisJaW50CSQweDEwCisJbW92YgkkMHhhLCAlYWwJCS8qIExGICovCisJaW50CSQweDEwCisJcmV0CisKKy8qIHByaW50X2hleCBwcmludHMgdGhlIHdvcmQgcG9pbnRlZCB0byBieSBzczpicCBpbiBoZXhhZGVjaW1hbC4gKi8KKworcHJpbnRfaGV4OiAKKwltb3Z3CSglYnApLCVkeAkJLyogbG9hZCB3b3JkIGludG8gZHggKi8KKwltb3ZiCSQ0LCAlY2wKKwltb3ZiCSQweDBlLCAlYWgJCS8qIHdyaXRlIGNoYXIsIHR0eSBtb2RlICovCisJbW92dwkkMHgwMDA3LCAlYngJCS8qIHBhZ2UgMCwgYXR0cmlidXRlIDcgKG5vcm1hbCkgKi8KKwljYWxsCXByaW50X2RpZ2l0CisJY2FsbAlwcmludF9kaWdpdAorCWNhbGwJcHJpbnRfZGlnaXQKKy8qIGZhbGwgdGhyb3VnaCAqLworcHJpbnRfZGlnaXQ6IAorCXJvbAklY2wsJWR4CQkJLyogcm90YXRlIHNvIHRoYXQgbG93ZXN0IDQgYml0cyBhcmUgdXNlZCAqLworCW1vdmIJJDB4MGYsICVhbAkJLyogbWFzayBmb3IgbnliYmxlICovCisJYW5kYgklZGwsJWFsCisJYWRkYgkkMHg5MCwgJWFsCQkvKiBjb252ZXJ0IGFsIHRvIGFzY2lpIGhleCAoZm91ciBpbnN0cnVjdGlvbnMpICovCisJZGFhCisJYWRjYgkkMHg0MCwgJWFsCisJZGFhCisJaW50CSQweDEwCisJcmV0CisKK3NyZWFkOgkud29yZCAwCQkJCS8qIHNlY3RvcnMgcmVhZCBvZiBjdXJyZW50IHRyYWNrICovCitoZWFkOgkud29yZCAwCQkJCS8qIGN1cnJlbnQgaGVhZCAqLwordHJhY2s6CS53b3JkIDAJCQkJLyogY3VycmVudCB0cmFjayAqLworCitzZWN0b3JzOiAKKwkud29yZCAwCisKK2Rwc2VnOgkud29yZCAwCitkcG9mZjoJLndvcmQgMAorCitkaXNrc2l6ZXM6IAorCS5ieXRlIDM2LDE4LDE1LDkKKworbXNnMTogCisJLmFzY2lpICJMb2FkaW5nIFJPTSBpbWFnZSIKK21zZzFlbmQ6IAorCisJLm9yZyA1MTAsIDAKKwkud29yZCAweEFBNTUKKworc3RhcnRfcnVudGltZToKKwkvKiBJbnN0YWxsIGdQWEUgKi8KKwljYWxsCWluc3RhbGwKKworCS8qIFNldCB1cCByZWFsLW1vZGUgc3RhY2sgKi8KKwltb3Z3CSVieCwgJXNzCisJbW92dwkkX2VzdGFjazE2LCAlc3AKKworCS8qIEp1bXAgdG8gLnRleHQxNiBzZWdtZW50ICovCisJcHVzaHcJJWF4CisJcHVzaHcJJDFmCisJbHJldAorCS5zZWN0aW9uICIudGV4dDE2IiwgImF3eCIsIEBwcm9nYml0cworMToKKwlwdXNobAkkbWFpbgorCXB1c2h3CSVjcworCWNhbGwJcHJvdF9jYWxsCisJcG9wbAklZWN4IC8qIGRpc2NhcmQgKi8KKworCS8qIFVuaW5zdGFsbCBnUFhFICovCisJY2FsbAl1bmluc3RhbGwKKworCS8qIEJvb3QgbmV4dCBkZXZpY2UgKi8KKwlpbnQgJDB4MTgKKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9oZHByZWZpeC5TIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9oZHByZWZpeC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NzY3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L2hkcHJlZml4LlMKQEAgLTAsMCArMSwxMDkgQEAKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKQorCisJLnRleHQKKwkuYXJjaCBpMzg2CisJLnNlY3Rpb24gIi5wcmVmaXgiLCAiYXd4IiwgQHByb2diaXRzCisJLmNvZGUxNgorCS5vcmcgMAorCisJbW92dwkkbG9hZF9pbWFnZSwgJWJwCisJam1wCWZpbmRfYWN0aXZlX3BhcnRpdGlvbgorCisjaW5jbHVkZSAiYm9vdHBhcnQuUyIKKworbG9hZF9pbWFnZToKKwkvKiBHZXQgZGlzayBnZW9tZXRyeSAqLworCXB1c2hhbAorCXB1c2h3CSVlcworCW1vdmIJJDB4MDgsICVhaAorCWludAkkMHgxMworCWpjCWxvYWRfZmFpbGVkCisJbW92YgklY2wsIG1heF9zZWN0b3IKKwltb3ZiCSVkaCwgbWF4X2hlYWQKKwlwb3B3CSVlcworCXBvcGFsCisJCisxOgkvKiBSZWFkIHRvIGVuZCBvZiBjdXJyZW50IHRyYWNrICovCisJbW92YgklY2wsICVhbAorCW5lZ2IJJWFsCisJYWRkYgltYXhfc2VjdG9yLCAlYWwKKwlpbmNiCSVhbAorCWFuZGIJJDB4M2YsICVhbAorCW1vdnpibAklYWwsICVlYXgKKwljYWxsCSpyZWFkX3NlY3RvcnMKKwlqYwlsb2FkX2ZhaWxlZAorCQorCS8qIFVwZGF0ZSAlZXMgKi8KKwltb3Z3CSVlcywgJWJ4CisJc2hsbAkkNSwgJWVheAorCWFkZHcJJWF4LCAlYngKKwltb3Z3CSVieCwgJWVzCisJc2hybAkkNSwgJWVheAorCQorCS8qIFVwZGF0ZSBMQkEgYWRkcmVzcyAqLworCWFkZGwJJWVheCwgJWVkaQorCWFkY2wJJDAsICVlc2kKKwkKKwkvKiBVcGRhdGUgQ0hTIGFkZHJlc3MgKi8KKwlhbmRiCSQweGMwLCAlY2wKKwlvcmIJJDB4MDEsICVjbAorCWluY2IJJWRoCisJY21wYgltYXhfaGVhZCwgJWRoCisJamJlCTJmCisJeG9yYgklZGgsICVkaAorCWluY2IJJWNoCisJam5jCTJmCisJYWRkYgkkMHhjMCwgJWNsCisyOgorCS8qIExvb3AgdW50aWwgd2hvbGUgaW1hZ2UgaXMgcmVhZCAqLworCXN1YmwJJWVheCwgbG9hZF9sZW5ndGgKKwlqYQkxYgorCWxqbXAJJEJPT1RfU0VHLCAkc3RhcnRfaW1hZ2UKKworbWF4X3NlY3RvcjoKKwkuYnl0ZQkwCittYXhfaGVhZDoKKwkuYnl0ZQkwCitsb2FkX2xlbmd0aDoKKwkubG9uZwkwCisJCisJLnNlY3Rpb24gIi56aW5mby5maXh1cCIsICJhIiwgQHByb2diaXRzCS8qIENvbXByZXNzb3IgZml4dXBzICovCisJLmFzY2lpCSJBRERMIgorCS5sb25nCWxvYWRfbGVuZ3RoCisJLmxvbmcJNTEyCisJLmxvbmcJMAorCS5wcmV2aW91cworCisKK2xvYWRfZmFpbGVkOgorCW1vdncJJDEwZiwgJXNpCisJam1wCWJvb3RfZXJyb3IKKzEwOgkuYXNjaXoJIkNvdWxkIG5vdCBsb2FkIGdQWEVcclxuIgorCisJLm9yZyA1MTAKKwkuYnl0ZSAweDU1LCAweGFhCisKK3N0YXJ0X2ltYWdlOgorCS8qIEluc3RhbGwgZ1BYRSAqLworCWNhbGwJaW5zdGFsbAorCisJLyogU2V0IHVwIHJlYWwtbW9kZSBzdGFjayAqLworCW1vdncJJWJ4LCAlc3MKKwltb3Z3CSRfZXN0YWNrMTYsICVzcAorCisJLyogSnVtcCB0byAudGV4dDE2IHNlZ21lbnQgKi8KKwlwdXNodwklYXgKKwlwdXNodwkkMWYKKwlscmV0CisJLnNlY3Rpb24gIi50ZXh0MTYiLCAiYXd4IiwgQHByb2diaXRzCisxOgorCXB1c2hsCSRtYWluCisJcHVzaHcJJWNzCisJY2FsbAlwcm90X2NhbGwKKwlwb3BsCSVlY3ggLyogZGlzY2FyZCAqLworCisJLyogVW5pbnN0YWxsIGdQWEUgKi8KKwljYWxsCXVuaW5zdGFsbAorCisJLyogQm9vdCBuZXh0IGRldmljZSAqLworCWludCAkMHgxOApkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9ocm9tcHJlZml4LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L2hyb21wcmVmaXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2FjZjFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9ocm9tcHJlZml4LlMKQEAgLTAsMCArMSwxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBST00gcHJlZml4IHRoYXQgcmVsb2NhdGVzIHRvIEhJR0hNRU1fTE9BRFBPSU5UIGR1cmluZyBQT1NUIGlmIFBNTSBhbGxvY2F0aW9uCisgKiBmYWlscy4gSW50ZW5kZWQgdG8gYmUgdXNlZCwgd2l0aCBjYXV0aW9uLCBvbiBCSU9TZXMgdGhhdCBzdXBwb3J0IFBDSTMuMDAgYnV0CisgKiBoYXZlIGxpbWl0ZWQgUE1NIHN1cHBvcnQsIHN1Y2ggYXMgbW9zdCBBTUkgQklPU2VzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApCisKKyNkZWZpbmUgU0hSSU5LX1dJVEhPVVRfUE1NCisKKyNpbmNsdWRlICJyb21wcmVmaXguUyIKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgva2tweGVwcmVmaXguUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgva2tweGVwcmVmaXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmNjNmZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9ra3B4ZXByZWZpeC5TCkBAIC0wLDAgKzEsMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFhFIHByZWZpeCB0aGF0IGtlZXBzIHRoZSB3aG9sZSBQWEUgc3RhY2sgcHJlc2VudAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApCisKKy8qIFNpbmNlIHdlIGhhdmUgdGhlIHdob2xlIHN0YWNrLCB3ZSBjYW4gdXNlIGNhY2hlZCBESENQIGluZm9ybWF0aW9uICovCitSRVFVRVNUX09CSkVDVCAoIHB4ZXBhcmVudF9kaGNwICkKKworI2RlZmluZSBQWEVMT0FERVJfS0VFUF9VTkRJCisjZGVmaW5lIFBYRUxPQURFUl9LRUVQX1BYRQorI2luY2x1ZGUgInB4ZXByZWZpeC5TIgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9rcHhlcHJlZml4LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L2tweGVwcmVmaXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjNmYWNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9rcHhlcHJlZml4LlMKQEAgLTAsMCArMSw5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBYRSBwcmVmaXggdGhhdCBrZWVwIHRoZSBVTkRJIHBvcnRpb24gb2YgdGhlIFBYRSBzdGFjayBwcmVzZW50CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICkKKworI2RlZmluZSBQWEVMT0FERVJfS0VFUF9VTkRJCisjaW5jbHVkZSAicHhlcHJlZml4LlMiCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L2xpYnByZWZpeC5TIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9saWJwcmVmaXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTZiYTZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9saWJwcmVmaXguUwpAQCAtMCwwICsxLDgxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICkKKworCS5hcmNoIGkzODYKKworLyoqCisgKiBIaWdoIG1lbW9yeSB0ZW1wb3JhcnkgbG9hZCBhZGRyZXNzCisgKgorICogVGVtcG9yYXJ5IGJ1ZmZlciBpbnRvIHdoaWNoIHRvIGNvcHkgKG9yIGRlY29tcHJlc3MpIG91ciBydW50aW1lCisgKiBpbWFnZSwgcHJpb3IgdG8gY2FsbGluZyBnZXRfbWVtbWFwKCkgYW5kIHJlbG9jYXRlKCkuICBXZSBkb24ndAorICogYWN0dWFsbHkgbGVhdmUgYW55dGhpbmcgaGVyZSBvbmNlIGluc3RhbGwoKSBoYXMgcmV0dXJuZWQuCisgKgorICogV2UgdXNlIHRoZSBzdGFydCBvZiBhbiBldmVuIG1lZ2FieXRlIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQorICogYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEEyMCBsaW5lLgorICoKKyAqIFdlIHVzZSA0TUIgcmF0aGVyIHRoYW4gMk1CIGJlY2F1c2Ugc29tZSBQWEUgc3RhY2sgLyBQTU0gQklPUworICogY29tYmluYXRpb25zIGFyZSBrbm93biB0byBwbGFjZSBkYXRhIHJlcXVpcmVkIGJ5IG90aGVyIFVOREkgUk9NcworICogbG9hZGVyIGFyb3VuZCB0aGUgMk1CIG1hcmsuCisgKi8KKwkuZ2xvYmwJSElHSE1FTV9MT0FEUE9JTlQKKwkuZXF1CUhJR0hNRU1fTE9BRFBPSU5ULCAoIDQgPDwgMjAgKQorCisvKiBJbWFnZSBjb21wcmVzc2lvbiBlbmFibGVkICovCisjZGVmaW5lIENPTVBSRVNTIDEKKworI2RlZmluZSBDUjBfUEUgMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFV0aWxpdHkgZnVuY3Rpb246IHByaW50IGNoYXJhY3RlciAod2l0aCBMRiAtPiBMRixDUiB0cmFuc2xhdGlvbikKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlYWwgOiBjaGFyYWN0ZXIgdG8gcHJpbnQKKyAqICAgJWRzOmRpIDogb3V0cHV0IGJ1ZmZlciAob3IgJWRpPTAgdG8gcHJpbnQgdG8gY29uc29sZSkKKyAqIFJldHVybnM6CisgKiAgICVkczpkaSA6IG5leHQgY2hhcmFjdGVyIGluIG91dHB1dCBidWZmZXIgKGlmIGFwcGxpY2FibGUpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIucHJlZml4LmxpYiIsICJhd3giLCBAcHJvZ2JpdHMKKwkuY29kZTE2CisJLmdsb2JsCXByaW50X2NoYXJhY3RlcgorcHJpbnRfY2hhcmFjdGVyOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycyAqLworCXB1c2h3CSVheAorCXB1c2h3CSVieAorCXB1c2h3CSVicAorCS8qIElmICVkaSBpcyBub24temVybywgd3JpdGUgY2hhcmFjdGVyIHRvIGJ1ZmZlciBhbmQgZXhpdCAqLworCXRlc3R3CSVkaSwgJWRpCisJanoJMWYKKwltb3ZiCSVhbCwgJWRzOiglZGkpCisJaW5jdwklZGkKKwlqbXAJM2YKKzE6CS8qIFByaW50IGNoYXJhY3RlciAqLworCW1vdncJJDB4MDAwNywgJWJ4CQkvKiBwYWdlIDAsIGF0dHJpYnV0ZSA3IChub3JtYWwpICovCisJbW92YgkkMHgwZSwgJWFoCQkvKiB3cml0ZSBjaGFyLCB0dHkgbW9kZSAqLworCWNtcGIJJDB4MGEsICVhbAkJLyogJ1xuJz8gKi8KKwlqbmUJMmYKKwlpbnQJJDB4MTAKKwltb3ZiCSQweDBkLCAlYWwKKzI6CWludAkkMHgxMAorCS8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KKzM6CXBvcHcJJWJwCisJcG9wdwklYngKKwlwb3B3CSVheAorCXJldAorCS5zaXplCXByaW50X2NoYXJhY3RlciwgLiAtIHByaW50X2NoYXJhY3RlcgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFV0aWxpdHkgZnVuY3Rpb246IHByaW50IGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWRzOnNpIDogc3RyaW5nIHRvIHByaW50CisgKiAgICVkczpkaSA6IG91dHB1dCBidWZmZXIgKG9yICVkaT0wIHRvIHByaW50IHRvIGNvbnNvbGUpCisgKiBSZXR1cm5zOgorICogICAlZHM6c2kgOiBjaGFyYWN0ZXIgYWZ0ZXIgdGVybWluYXRpbmcgTlVMCisgKiAgICVkczpkaSA6IG5leHQgY2hhcmFjdGVyIGluIG91dHB1dCBidWZmZXIgKGlmIGFwcGxpY2FibGUpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIucHJlZml4LmxpYiIsICJhd3giLCBAcHJvZ2JpdHMKKwkuY29kZTE2CisJLmdsb2JsCXByaW50X21lc3NhZ2UKK3ByaW50X21lc3NhZ2U6CisJLyogUHJlc2VydmUgcmVnaXN0ZXJzICovCisJcHVzaHcJJWF4CisJLyogUHJpbnQgc3RyaW5nICovCisxOiAJbG9kc2IKKwl0ZXN0YgklYWwsICVhbAorCWplCTJmCisJY2FsbAlwcmludF9jaGFyYWN0ZXIKKwlqbXAJMWIKKzI6CS8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KKwlwb3B3CSVheAorCXJldAorCS5zaXplCXByaW50X21lc3NhZ2UsIC4gLSBwcmludF9tZXNzYWdlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVXRpbGl0eSBmdW5jdGlvbnM6IHByaW50IGhleCBkaWdpdC9ieXRlL3dvcmQvZHdvcmQKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlYWwgKGxvdyBuaWJibGUpIDogZGlnaXQgdG8gcHJpbnQKKyAqICAgJWFsIDogYnl0ZSB0byBwcmludAorICogICAlYXggOiB3b3JkIHRvIHByaW50CisgKiAgICVlYXggOiBkd29yZCB0byBwcmludAorICogICAlZHM6ZGkgOiBvdXRwdXQgYnVmZmVyIChvciAlZGk9MCB0byBwcmludCB0byBjb25zb2xlKQorICogUmV0dXJuczoKKyAqICAgJWRzOmRpIDogbmV4dCBjaGFyYWN0ZXIgaW4gb3V0cHV0IGJ1ZmZlciAoaWYgYXBwbGljYWJsZSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi5wcmVmaXgubGliIiwgImF3eCIsIEBwcm9nYml0cworCS5jb2RlMTYKKwkuZ2xvYmwJcHJpbnRfaGV4X2R3b3JkCitwcmludF9oZXhfZHdvcmQ6CisJcm9ybAkkMTYsICVlYXgKKwljYWxsCXByaW50X2hleF93b3JkCisJcm9ybAkkMTYsICVlYXgKKwkvKiBGYWxsIHRocm91Z2ggKi8KKwkuc2l6ZQlwcmludF9oZXhfZHdvcmQsIC4gLSBwcmludF9oZXhfZHdvcmQKKwkuZ2xvYmwJcHJpbnRfaGV4X3dvcmQKK3ByaW50X2hleF93b3JkOgorCXhjaGdiCSVhbCwgJWFoCisJY2FsbAlwcmludF9oZXhfYnl0ZQorCXhjaGdiCSVhbCwgJWFoCisJLyogRmFsbCB0aHJvdWdoICovCisJLnNpemUJcHJpbnRfaGV4X3dvcmQsIC4gLSBwcmludF9oZXhfd29yZAorCS5nbG9ibAlwcmludF9oZXhfYnl0ZQorcHJpbnRfaGV4X2J5dGU6CisJcm9yYgkkNCwgJWFsCisJY2FsbAlwcmludF9oZXhfbmliYmxlCisJcm9yYgkkNCwgJWFsCisJLyogRmFsbCB0aHJvdWdoICovCisJLnNpemUJcHJpbnRfaGV4X2J5dGUsIC4gLSBwcmludF9oZXhfYnl0ZQorCS5nbG9ibAlwcmludF9oZXhfbmliYmxlCitwcmludF9oZXhfbmliYmxlOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycyAqLworCXB1c2h3CSVheAorCS8qIFByaW50IGRpZ2l0ICh0ZWNobmlxdWUgYnkgTm9yYmVydCBKdWZmYSA8bm9yYmVydC5qdWZmYUBhbWQuY29tPiAqLworCWFuZGIJJDB4MGYsICVhbAorCWNtcGIJJDEwLCAlYWwKKwlzYmJiCSQweDY5LCAlYWwKKwlkYXMKKwljYWxsCXByaW50X2NoYXJhY3RlcgorCS8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KKwlwb3B3CSVheAorCXJldAorCS5zaXplCXByaW50X2hleF9uaWJibGUsIC4gLSBwcmludF9oZXhfbmliYmxlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVXRpbGl0eSBmdW5jdGlvbjogcHJpbnQgUENJIGJ1czpkZXYuZm4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlYXggOiBQQ0kgYnVzOmRldi5mbiB0byBwcmludAorICogICAlZHM6ZGkgOiBvdXRwdXQgYnVmZmVyIChvciAlZGk9MCB0byBwcmludCB0byBjb25zb2xlKQorICogUmV0dXJuczoKKyAqICAgJWRzOmRpIDogbmV4dCBjaGFyYWN0ZXIgaW4gb3V0cHV0IGJ1ZmZlciAoaWYgYXBwbGljYWJsZSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi5wcmVmaXgubGliIiwgImF3eCIsIEBwcm9nYml0cworCS5jb2RlMTYKKwkuZ2xvYmwJcHJpbnRfcGNpX2J1c2RldmZuCitwcmludF9wY2lfYnVzZGV2Zm46CisJLyogUHJlc2VydmUgcmVnaXN0ZXJzICovCisJcHVzaHcJJWF4CisJLyogUHJpbnQgYnVzICovCisJeGNoZ2IJJWFsLCAlYWgKKwljYWxsCXByaW50X2hleF9ieXRlCisJLyogUHJpbnQgIjoiICovCisJbW92YgkkKCAnOicgKSwgJWFsCisJY2FsbAlwcmludF9jaGFyYWN0ZXIKKwkvKiBQcmludCBkZXZpY2UgKi8KKwltb3ZiCSVhaCwgJWFsCisJc2hyYgkkMywgJWFsCisJY2FsbAlwcmludF9oZXhfYnl0ZQorCS8qIFByaW50ICIuIiAqLworCW1vdmIJJCggJy4nICksICVhbAorCWNhbGwJcHJpbnRfY2hhcmFjdGVyCisJLyogUHJpbnQgZnVuY3Rpb24gKi8KKwltb3ZiCSVhaCwgJWFsCisJYW5kYgkkMHgwNywgJWFsCisJY2FsbAlwcmludF9oZXhfbmliYmxlCisJLyogUmVzdG9yZSByZWdpc3RlcnMgYW5kIHJldHVybiAqLworCXBvcHcJJWF4CisJcmV0CisJLnNpemUJcHJpbnRfcGNpX2J1c2RldmZuLCAuIC0gcHJpbnRfcGNpX2J1c2RldmZuCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVXRpbGl0eSBmdW5jdGlvbjogY2xlYXIgY3VycmVudCBsaW5lCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWRzOmRpIDogb3V0cHV0IGJ1ZmZlciAob3IgJWRpPTAgdG8gcHJpbnQgdG8gY29uc29sZSkKKyAqIFJldHVybnM6CisgKiAgICVkczpkaSA6IG5leHQgY2hhcmFjdGVyIGluIG91dHB1dCBidWZmZXIgKGlmIGFwcGxpY2FibGUpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIucHJlZml4LmxpYiIsICJhd3giLCBAcHJvZ2JpdHMKKwkuY29kZTE2CisJLmdsb2JsCXByaW50X2tpbGxfbGluZQorcHJpbnRfa2lsbF9saW5lOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycyAqLworCXB1c2h3CSVheAorCXB1c2h3CSVjeAorCS8qIFByaW50IENSICovCisJbW92YgkkKCAnXHInICksICVhbAorCWNhbGwJcHJpbnRfY2hhcmFjdGVyCisJLyogUHJpbnQgNzkgc3BhY2VzICovCisJbW92YgkkKCAnICcgKSwgJWFsCisJbW92dwkkNzksICVjeAorMToJY2FsbAlwcmludF9jaGFyYWN0ZXIKKwlsb29wCTFiCisJLyogUHJpbnQgQ1IgKi8KKwltb3ZiCSQoICdccicgKSwgJWFsCisJY2FsbAlwcmludF9jaGFyYWN0ZXIKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgcmV0dXJuICovCisJcG9wdwklY3gKKwlwb3B3CSVheAorCXJldAorCS5zaXplCXByaW50X2tpbGxfbGluZSwgLiAtIHByaW50X2tpbGxfbGluZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcG1fY2FsbCAocmVhbC1tb2RlIG5lYXIgY2FsbCkKKyAqCisgKiBDYWxsIHJvdXRpbmUgaW4gMTYtYml0IHByb3RlY3RlZCBtb2RlIGZvciBhY2Nlc3MgdG8gZXh0ZW5kZWQgbWVtb3J5CisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWF4IDogYWRkcmVzcyBvZiByb3V0aW5lIHRvIGNhbGwgaW4gMTYtYml0IHByb3RlY3RlZCBtb2RlCisgKiBSZXR1cm5zOgorICogICBub25lCisgKiBDb3JydXB0czoKKyAqICAgJWF4CisgKgorICogVGhlIHNwZWNpZmllZCByb3V0aW5lIGlzIGNhbGxlZCBpbiAxNi1iaXQgcHJvdGVjdGVkIG1vZGUsIHdpdGg6CisgKgorICogICAlY3MgOiAxNi1iaXQgY29kZSBzZWdtZW50IHdpdGggYmFzZSBtYXRjaGluZyByZWFsLW1vZGUgJWNzCisgKiAgICVzcyA6IDE2LWJpdCBkYXRhIHNlZ21lbnQgd2l0aCBiYXNlIG1hdGNoaW5nIHJlYWwtbW9kZSAlc3MKKyAqICAgJWRzLCVlcywlZnMsJWdzIDogMzItYml0IGRhdGEgc2VnbWVudCB3aXRoIHplcm8gYmFzZSBhbmQgNEdCIGxpbWl0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIEtFRVBfSVRfUkVBTAorCisJLyogR0RUIGZvciBwcm90ZWN0ZWQtbW9kZSBjYWxscyAqLworCS5zZWN0aW9uICIucHJlZml4LmxpYiIsICJhd3giLCBAcHJvZ2JpdHMKKwkuYWxpZ24gMTYKK3BtX2NhbGxfdmFyczoKK2dkdDoKK2dkdF9saW1pdDoJCS53b3JkIGdkdF9sZW5ndGggLSAxCitnZHRfYmFzZToJCS5sb25nIDAKKwkJCS53b3JkIDAgLyogcGFkZGluZyAqLworcG1fY3M6CQkvKiAxNi1iaXQgcHJvdGVjdGVkLW1vZGUgY29kZSBzZWdtZW50ICovCQorCS5lcXUgICAgUE1fQ1MsIHBtX2NzIC0gZ2R0CisJLndvcmQgICAweGZmZmYsIDAKKwkuYnl0ZSAgIDAsIDB4OWIsIDB4MDAsIDAKK3BtX3NzOgkJLyogMTYtYml0IHByb3RlY3RlZC1tb2RlIHN0YWNrIHNlZ21lbnQgKi8KKwkuZXF1ICAgIFBNX1NTLCBwbV9zcyAtIGdkdAorCS53b3JkICAgMHhmZmZmLCAwCisJLmJ5dGUgICAwLCAweDkzLCAweDAwLCAwCitwbV9kczoJCS8qIDMyLWJpdCBwcm90ZWN0ZWQtbW9kZSBmbGF0IGRhdGEgc2VnbWVudCAqLworCS5lcXUgICAgUE1fRFMsIHBtX2RzIC0gZ2R0CisJLndvcmQgICAweGZmZmYsIDAKKwkuYnl0ZSAgIDAsIDB4OTMsIDB4Y2YsIDAKK2dkdF9lbmQ6CisJLmVxdQlnZHRfbGVuZ3RoLCAuIC0gZ2R0CisJLnNpemUJZ2R0LCAuIC0gZ2R0CisKKwkuc2VjdGlvbiAiLnByZWZpeC5saWIiLCAiYXd4IiwgQHByb2diaXRzCisJLmFsaWduIDE2CitwbV9zYXZlZF9nZHQ6CQorCS5sb25nCTAsIDAKKwkuc2l6ZQlwbV9zYXZlZF9nZHQsIC4gLSBwbV9zYXZlZF9nZHQKKworCS5lcXUJcG1fY2FsbF92YXJzX3NpemUsIC4gLSBwbV9jYWxsX3ZhcnMKKyNkZWZpbmUgUE1fQ0FMTF9WQVIoeCkgKCAtcG1fY2FsbF92YXJzX3NpemUgKyAoICh4KSAtIHBtX2NhbGxfdmFycyApICkKKworCS5zZWN0aW9uICIucHJlZml4LmxpYiIsICJhd3giLCBAcHJvZ2JpdHMKKwkuY29kZTE2CitwbV9jYWxsOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycywgZmxhZ3MsIGFuZCBSTSByZXR1cm4gcG9pbnQgKi8KKwlwdXNodwklYnAKKwltb3Z3CSVzcCwgJWJwCisJc3VidwkkcG1fY2FsbF92YXJzX3NpemUsICVzcAorCWFuZHcJJDB4ZmZmMCwgJXNwCisJcHVzaGZsCisJcHVzaHcJJWdzCisJcHVzaHcJJWZzCisJcHVzaHcJJWVzCisJcHVzaHcJJWRzCisJcHVzaHcJJXNzCisJcHVzaHcJJWNzCisJcHVzaHcJJDk5ZgorCisJLyogU2V0IHVwIGxvY2FsIHZhcmlhYmxlIGJsb2NrLCBhbmQgcHJlc2VydmUgR0RUICovCisJcHVzaHcJJWN4CisJcHVzaHcJJXNpCisJcHVzaHcJJWRpCisJcHVzaHcJJXNzCisJcG9wdwklZXMKKwltb3Z3CSRwbV9jYWxsX3ZhcnMsICVzaQorCWxlYXcJUE1fQ0FMTF9WQVIocG1fY2FsbF92YXJzKSglYnApLCAlZGkKKwltb3Z3CSRwbV9jYWxsX3ZhcnNfc2l6ZSwgJWN4CisJY3MgcmVwIG1vdnNiCisJcG9wdwklZGkKKwlwb3B3CSVzaQorCXBvcHcJJWN4CisJc2dkdAlQTV9DQUxMX1ZBUihwbV9zYXZlZF9nZHQpKCVicCkKKworCS8qIFNldCB1cCBHRFQgYmFzZXMgKi8KKwlwdXNobAklZWF4CisJcHVzaGwJJWVkaQorCXhvcmwJJWVheCwgJWVheAorCW1vdncJJXNzLCAlYXgKKwlzaGxsCSQ0LCAlZWF4CisJbW92endsCSVicCwgJWVkaQorCWFkZHIzMiBsZWFsIFBNX0NBTExfVkFSKGdkdCkoJWVheCwgJWVkaSksICVlYXgKKwltb3ZsCSVlYXgsIFBNX0NBTExfVkFSKGdkdF9iYXNlKSglYnApCisJbW92dwklY3MsICVheAorCW1vdncJJFBNX0NBTExfVkFSKHBtX2NzKSwgJWRpCisJY2FsbAlzZXRfc2VnX2Jhc2UKKwltb3Z3CSVzcywgJWF4CisJbW92dwkkUE1fQ0FMTF9WQVIocG1fc3MpLCAlZGkKKwljYWxsCXNldF9zZWdfYmFzZQorCXBvcGwJJWVkaQorCXBvcGwJJWVheAorCisJLyogU3dpdGNoIENQVSB0byBwcm90ZWN0ZWQgbW9kZSBhbmQgbG9hZCB1cCBzZWdtZW50IHJlZ2lzdGVycyAqLworCXB1c2hsCSVlYXgKKwljbGkKKwlkYXRhMzIgbGdkdCBQTV9DQUxMX1ZBUihnZHQpKCVicCkKKwltb3ZsCSVjcjAsICVlYXgKKwlvcmIJJENSMF9QRSwgJWFsCisJbW92bAklZWF4LCAlY3IwCisJbGptcAkkUE1fQ1MsICQxZgorMToJbW92dwkkUE1fU1MsICVheAorCW1vdncJJWF4LCAlc3MKKwltb3Z3CSRQTV9EUywgJWF4CisJbW92dwklYXgsICVkcworCW1vdncJJWF4LCAlZXMKKwltb3Z3CSVheCwgJWZzCisJbW92dwklYXgsICVncworCXBvcGwJJWVheAorCisJLyogQ2FsbCBQTSByb3V0aW5lICovCisJY2FsbAkqJWF4CisKKwkvKiBTZXQgcmVhbC1tb2RlIHNlZ21lbnQgbGltaXRzIG9uICVkcywgJWVzLCAlZnMgYW5kICVncyAqLworCW1vdncJJXNzLCAlYXgKKwltb3Z3CSVheCwgJWRzCisJbW92dwklYXgsICVlcworCW1vdncJJWF4LCAlZnMKKwltb3Z3CSVheCwgJWdzCisKKwkvKiBSZXR1cm4gQ1BVIHRvIHJlYWwgbW9kZSAqLworCW1vdmwJJWNyMCwgJWVheAorCWFuZGIJJDAhQ1IwX1BFLCAlYWwKKwltb3ZsCSVlYXgsICVjcjAKKworCS8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBmbGFncyAqLworCWxyZXQJLyogd2lsbCBsam1wIHRvIDk5ZiAqLworOTk6CXBvcHcJJXNzCisJcG9wdwklZHMKKwlwb3B3CSVlcworCXBvcHcJJWZzCisJcG9wdwklZ3MKKwlkYXRhMzIgbGdkdCBQTV9DQUxMX1ZBUihwbV9zYXZlZF9nZHQpKCVicCkKKwlwb3BmbAorCW1vdncJJWJwLCAlc3AKKwlwb3B3CSVicAorCXJldAorCS5zaXplIHBtX2NhbGwsIC4gLSBwbV9jYWxsCisKK3NldF9zZWdfYmFzZToKKwlyb2x3CSQ0LCAlYXgKKwltb3Z3CSVheCwgMiglYnAsJWRpKQorCWFuZHcJJDB4ZmZmMCwgMiglYnAsJWRpKQorCW1vdmIJJWFsLCA0KCVicCwlZGkpCisJYW5kYgkkMHgwZiwgNCglYnAsJWRpKQorCXJldAorCS5zaXplIHNldF9zZWdfYmFzZSwgLiAtIHNldF9zZWdfYmFzZQorCisjZW5kaWYgLyogS0VFUF9JVF9SRUFMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb3B5X2J5dGVzIChyZWFsLW1vZGUgb3IgMTYtYml0IHByb3RlY3RlZC1tb2RlIG5lYXIgY2FsbCkKKyAqCisgKiBDb3B5IGJ5dGVzCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWRzOmVzaSA6IHNvdXJjZSBhZGRyZXNzCisgKiAgICVlczplZGkgOiBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiAgICVlY3ggOiBsZW5ndGgKKyAqIFJldHVybnM6CisgKiAgICVkczplc2kgOiBuZXh0IHNvdXJjZSBhZGRyZXNzCisgKiAgICVlczplZGkgOiBuZXh0IGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIENvcnJ1cHRzOgorICogICBOb25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi5wcmVmaXgubGliIiwgImF3eCIsIEBwcm9nYml0cworCS5jb2RlMTYKK2NvcHlfYnl0ZXM6CisJcHVzaGwgJWVjeAorCXJlcCBhZGRyMzIgbW92c2IKKwlwb3BsICVlY3gKKwlyZXQKKwkuc2l6ZSBjb3B5X2J5dGVzLCAuIC0gY29weV9ieXRlcworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5zdGFsbF9ibG9jayAocmVhbC1tb2RlIG5lYXIgY2FsbCkKKyAqCisgKiBJbnN0YWxsIGJsb2NrIHRvIHNwZWNpZmllZCBhZGRyZXNzCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWVzaSA6IHNvdXJjZSBwaHlzaWNhbCBhZGRyZXNzIChtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYpCisgKiAgICVlZGkgOiBkZXN0aW5hdGlvbiBwaHlzaWNhbCBhZGRyZXNzIChtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYpCisgKiAgICVlY3ggOiBsZW5ndGggb2YgKGRlY29tcHJlc3NlZCkgZGF0YQorICogICAlZWR4IDogdG90YWwgbGVuZ3RoIG9mIGJsb2NrIChpbmNsdWRpbmcgYW55IHVuaW5pdGlhbGlzZWQgZGF0YSBwb3J0aW9uKQorICogUmV0dXJuczoKKyAqICAgJWVzaSA6IG5leHQgc291cmNlIHBoeXNpY2FsIGFkZHJlc3MgKHdpbGwgYmUgYSBtdWx0aXBsZSBvZiAxNikKKyAqIENvcnJ1cHRzOgorICogICBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi5wcmVmaXgubGliIiwgImF3eCIsIEBwcm9nYml0cworCS5jb2RlMTYKK2luc3RhbGxfYmxvY2s6CisJCisjaWZkZWYgS0VFUF9JVF9SRUFMCisKKwkvKiBQcmVzZXJ2ZSByZWdpc3RlcnMgKi8KKwlwdXNodwklZHMKKwlwdXNodwklZXMKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkaQorCQorCS8qIENvbnZlcnQgJWVzaSBhbmQgJWVkaSB0byBzZWdtZW50IHJlZ2lzdGVycyAqLworCXNocmwJJDQsICVlc2kKKwltb3Z3CSVzaSwgJWRzCisJeG9ydwklc2ksICVzaQorCXNocmwJJDQsICVlZGkKKwltb3Z3CSVkaSwgJWVzCisJeG9ydwklZGksICVkaQorCisjZWxzZSAvKiBLRUVQX0lUX1JFQUwgKi8KKworCS8qIENhbGwgc2VsZiBpbiBwcm90ZWN0ZWQgbW9kZSAqLworCXB1c2h3CSVheAorCW1vdncJJDFmLCAlYXgKKwljYWxsCXBtX2NhbGwKKwlwb3B3CSVheAorCXJldAorMToKKwkvKiBQcmVzZXJ2ZSByZWdpc3RlcnMgKi8KKwlwdXNobAklZWN4CisJcHVzaGwJJWVkaQorCQorI2VuZGlmIC8qIEtFRVBfSVRfUkVBTCAqLworCisJCisjaWYgQ09NUFJFU1MKKwkvKiBEZWNvbXByZXNzIHNvdXJjZSB0byBkZXN0aW5hdGlvbiAqLworCWNhbGwJZGVjb21wcmVzczE2CisjZWxzZQorCS8qIENvcHkgc291cmNlIHRvIGRlc3RpbmF0aW9uICovCisJY2FsbAljb3B5X2J5dGVzCisjZW5kaWYKKworCS8qIFplcm8gLmJzcyBwb3J0aW9uICovCisJbmVnbAklZWN4CisJYWRkbAklZWR4LCAlZWN4CisJcHVzaHcJJWF4CisJeG9ydwklYXgsICVheAorCXJlcCBhZGRyMzIgc3Rvc2IKKwlwb3B3CSVheAorCisJLyogUm91bmQgdXAgJWVzaSB0byBzdGFydCBvZiBuZXh0IHNvdXJjZSBibG9jayAqLworCWFkZGwJJDB4ZiwgJWVzaQorCWFuZGwJJH4weGYsICVlc2kKKworCisjaWZkZWYgS0VFUF9JVF9SRUFMCisKKwkvKiBDb252ZXJ0ICVkczplc2kgYmFjayB0byBhIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwltb3Z6d2wJJWRzLCAlY3gKKwlzaGxsCSQ0LCAlZWN4CisJYWRkbAklZWN4LCAlZXNpCisKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyAqLworCXBvcGwJJWVkaQorCXBvcGwJJWVjeAorCXBvcHcJJWVzCisJcG9wdwklZHMKKworI2Vsc2UgLyogS0VFUF9JVF9SRUFMICovCisKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyAqLworCXBvcGwJJWVkaQorCXBvcGwJJWVjeAorCisjZW5kaWYKKworCXJldAorCS5zaXplIGluc3RhbGxfYmxvY2ssIC4gLSBpbnN0YWxsX2Jsb2NrCisJCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYWxsb2NfYmFzZW1lbSAocmVhbC1tb2RlIG5lYXIgY2FsbCkKKyAqCisgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgLnRleHQxNiBhbmQgLmRhdGExNiBmcm9tIHRvcCBvZiBiYXNlIG1lbW9yeS4KKyAqIE1lbW9yeSBpcyBhbGxvY2F0ZWQgdXNpbmcgdGhlIEJJT1MgZnJlZSBiYXNlIG1lbW9yeSBjb3VudGVyIGF0CisgKiAweDQwOjEzLgorICoKKyAqIFBhcmFtZXRlcnM6IAorICogICBub25lCisgKiBSZXR1cm5zOgorICogICAlYXggOiAudGV4dDE2IHNlZ21lbnQgYWRkcmVzcworICogICAlYnggOiAuZGF0YTE2IHNlZ21lbnQgYWRkcmVzcworICogQ29ycnVwdHM6CisgKiAgIG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnByZWZpeC5saWIiLCAiYXd4IiwgQHByb2diaXRzCisJLmNvZGUxNgorCS5nbG9ibAlhbGxvY19iYXNlbWVtCithbGxvY19iYXNlbWVtOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycyAqLworCXB1c2h3CSVmcworCisJLyogRkJNUyA9PiAlYXggYXMgc2VnbWVudCBhZGRyZXNzICovCisJcHVzaHcJJDB4NDAKKwlwb3B3CSVmcworCW1vdncJJWZzOjB4MTMsICVheAorCXNobHcJJDYsICVheAorCisJLyogQ2FsY3VsYXRlIC5kYXRhMTYgc2VnbWVudCBhZGRyZXNzICovCisJc3VidwkkX2RhdGExNl9tZW1zel9wZ2gsICVheAorCXB1c2h3CSVheAorCisJLyogQ2FsY3VsYXRlIC50ZXh0MTYgc2VnbWVudCBhZGRyZXNzICovCisJc3VidwkkX3RleHQxNl9tZW1zel9wZ2gsICVheAorCXB1c2h3CSVheAorCisJLyogVXBkYXRlIEZCTVMgKi8KKwlzaHJ3CSQ2LCAlYXgKKwltb3Z3CSVheCwgJWZzOjB4MTMKKworCS8qIFJldHJpZXZlIC50ZXh0MTYgYW5kIC5kYXRhMTYgc2VnbWVudCBhZGRyZXNzZXMgKi8KKwlwb3B3CSVheAorCXBvcHcJJWJ4CisKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgcmV0dXJuICovCisJcG9wdwklZnMKKwlyZXQKKwkuc2l6ZSBhbGxvY19iYXNlbWVtLCAuIC0gYWxsb2NfYmFzZW1lbQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnJlZV9iYXNlbWVtIChyZWFsLW1vZGUgbmVhciBjYWxsKQorICoKKyAqIEZyZWUgc3BhY2UgYWxsb2NhdGVkIHdpdGggYWxsb2NfYmFzZW1lbS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlYXggOiAudGV4dDE2IHNlZ21lbnQgYWRkcmVzcworICogICAlYnggOiAuZGF0YTE2IHNlZ21lbnQgYWRkcmVzcworICogUmV0dXJuczoKKyAqICAgJWF4IDogMCBpZiBzdWNjZXNzZnVsbHkgZnJlZWQKKyAqIENvcnJ1cHRzOgorICogICBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi50ZXh0MTYiLCAiYXgiLCBAcHJvZ2JpdHMKKwkuY29kZTE2CisJLmdsb2JsCWZyZWVfYmFzZW1lbQorZnJlZV9iYXNlbWVtOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycyAqLworCXB1c2h3CSVmcworCisJLyogQ2hlY2sgRkJNUyBjb3VudGVyICovCisJcHVzaHcJJWF4CisJc2hydwkkNiwgJWF4CisJcHVzaHcJJDB4NDAKKwlwb3B3CSVmcworCWNtcHcJJWF4LCAlZnM6MHgxMworCXBvcHcJJWF4CisJam5lCTFmCisKKwkvKiBDaGVjayBob29rZWQgaW50ZXJydXB0IGNvdW50ICovCisJY21wdwkkMCwgJWNzOmhvb2tlZF9iaW9zX2ludGVycnVwdHMKKwlqbmUJMWYKKworCS8qIE9LIHRvIGZyZWUgbWVtb3J5ICovCisJYWRkdwkkX3RleHQxNl9tZW1zel9wZ2gsICVheAorCWFkZHcJJF9kYXRhMTZfbWVtc3pfcGdoLCAlYXgKKwlzaHJ3CSQ2LCAlYXgKKwltb3Z3CSVheCwgJWZzOjB4MTMKKwl4b3J3CSVheCwgJWF4CisKKzE6CS8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KKwlwb3B3CSVmcworCXJldAorCS5zaXplIGZyZWVfYmFzZW1lbSwgLiAtIGZyZWVfYmFzZW1lbQorCisJLnNlY3Rpb24gIi50ZXh0MTYuZGF0YSIsICJhdyIsIEBwcm9nYml0cworCS5nbG9ibAlob29rZWRfYmlvc19pbnRlcnJ1cHRzCitob29rZWRfYmlvc19pbnRlcnJ1cHRzOgorCS53b3JkCTAKKwkuc2l6ZQlob29rZWRfYmlvc19pbnRlcnJ1cHRzLCAuIC0gaG9va2VkX2Jpb3NfaW50ZXJydXB0cworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5zdGFsbCAocmVhbC1tb2RlIG5lYXIgY2FsbCkKKyAqCisgKiBJbnN0YWxsIGFsbCB0ZXh0IGFuZCBkYXRhIHNlZ21lbnRzLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIG5vbmUKKyAqIFJldHVybnM6CisgKiAgICVheCAgOiAudGV4dDE2IHNlZ21lbnQgYWRkcmVzcworICogICAlYnggIDogLmRhdGExNiBzZWdtZW50IGFkZHJlc3MKKyAqIENvcnJ1cHRzOgorICogICBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi5wcmVmaXgubGliIiwgImF3eCIsIEBwcm9nYml0cworCS5jb2RlMTYKKwkuZ2xvYmwgaW5zdGFsbAoraW5zdGFsbDoKKwkvKiBQcmVzZXJ2ZSByZWdpc3RlcnMgKi8KKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCS8qIEFsbG9jYXRlIHNwYWNlIGZvciAudGV4dDE2IGFuZCAuZGF0YTE2ICovCisJY2FsbAlhbGxvY19iYXNlbWVtCisJLyogSW1hZ2Ugc291cmNlID0gJWNzOjAwMDAgKi8KKwl4b3JsCSVlc2ksICVlc2kKKwkvKiBJbWFnZSBkZXN0aW5hdGlvbiA9IEhJR0hNRU1fTE9BRFBPSU5UICovCisJbW92bAkkSElHSE1FTV9MT0FEUE9JTlQsICVlZGkKKwkvKiBJbnN0YWxsIHRleHQgYW5kIGRhdGEgc2VnbWVudHMgKi8KKwljYWxsCWluc3RhbGxfcHJlYWxsb2MKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgcmV0dXJuICovCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcmV0CisJLnNpemUgaW5zdGFsbCwgLiAtIGluc3RhbGwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluc3RhbGxfcHJlYWxsb2MgKHJlYWwtbW9kZSBuZWFyIGNhbGwpCisgKgorICogSW5zdGFsbCBhbGwgdGV4dCBhbmQgZGF0YSBzZWdtZW50cy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlYXggIDogLnRleHQxNiBzZWdtZW50IGFkZHJlc3MKKyAqICAgJWJ4ICA6IC5kYXRhMTYgc2VnbWVudCBhZGRyZXNzCisgKiAgICVlc2kgOiBJbWFnZSBzb3VyY2UgcGh5c2ljYWwgYWRkcmVzcyAob3IgemVybyBmb3IgJWNzOjAwMDApCisgKiAgICVlZGkgOiBEZWNvbXByZXNzaW9uIHRlbXBvcmFyeSBhcmVhIHBoeXNpY2FsIGFkZHJlc3MKKyAqIENvcnJ1cHRzOgorICogICBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi5wcmVmaXgubGliIiwgImF3eCIsIEBwcm9nYml0cworCS5jb2RlMTYKKwkuZ2xvYmwgaW5zdGFsbF9wcmVhbGxvYworaW5zdGFsbF9wcmVhbGxvYzoKKwkvKiBTYXZlIHJlZ2lzdGVycyAqLworCXB1c2hhbAorCXB1c2h3CSVkcworCXB1c2h3CSVlcworCisJLyogU2FuaXR5OiBjbGVhciB0aGUgZGlyZWN0aW9uIGZsYWcgYXNhcCAqLworCWNsZAorCisJLyogQ2FsY3VsYXRlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcGF5bG9hZCAoaS5lLiBmaXJzdCBzb3VyY2UpICovCisJdGVzdGwJJWVzaSwgJWVzaQorCWpuegkxZgorCW1vdncJJWNzLCAlc2kKKwlzaGxsCSQ0LCAlZXNpCisxOglhZGRsCSRfcGF5bG9hZF9sbWEsICVlc2kKKworCS8qIEluc3RhbGwgLnRleHQxNiBhbmQgLmRhdGExNiAqLworCXB1c2hsCSVlZGkKKwltb3Z6d2wJJWF4LCAlZWRpCisJc2hsbAkkNCwgJWVkaQorCW1vdmwJJF90ZXh0MTZfbWVtc3osICVlY3gKKwltb3ZsCSVlY3gsICVlZHgKKwljYWxsCWluc3RhbGxfYmxvY2sJCS8qIC50ZXh0MTYgKi8KKwltb3Z6d2wJJWJ4LCAlZWRpCisJc2hsbAkkNCwgJWVkaQorCW1vdmwJJF9kYXRhMTZfZmlsZXN6LCAlZWN4CisJbW92bAkkX2RhdGExNl9tZW1zeiwgJWVkeAorCWNhbGwJaW5zdGFsbF9ibG9jawkJLyogLmRhdGExNiAqLworCXBvcGwJJWVkaQorCisJLyogU2V0IHVwICVkcyBmb3IgYWNjZXNzIHRvIC5kYXRhMTYgKi8KKwltb3Z3CSVieCwgJWRzCisKKyNpZmRlZiBLRUVQX0lUX1JFQUwKKwkvKiBJbml0aWFsaXNlIGxpYmtpciAqLworCW1vdncJJWF4LCAoaW5pdF9saWJraXJfdmVjdG9yKzIpCisJbGNhbGwJKmluaXRfbGlia2lyX3ZlY3RvcgorI2Vsc2UKKwkvKiBJbnN0YWxsIC50ZXh0IGFuZCAuZGF0YSB0byB0ZW1wb3JhcnkgYXJlYSBpbiBoaWdoIG1lbW9yeSwKKwkgKiBwcmlvciB0byByZWFkaW5nIHRoZSBFODIwIG1lbW9yeSBtYXAgYW5kIHJlbG9jYXRpbmcKKwkgKiBwcm9wZXJseS4KKwkgKi8KKwltb3ZsCSRfdGV4dGRhdGFfZmlsZXN6LCAlZWN4CisJbW92bAkkX3RleHRkYXRhX21lbXN6LCAlZWR4CisJY2FsbAlpbnN0YWxsX2Jsb2NrCisKKwkvKiBJbml0aWFsaXNlIGxpYnJtIGF0IGN1cnJlbnQgbG9jYXRpb24gKi8KKwltb3Z3CSVheCwgKGluaXRfbGlicm1fdmVjdG9yKzIpCisJbGNhbGwJKmluaXRfbGlicm1fdmVjdG9yCisKKwkvKiBDYWxsIHJlbG9jYXRlKCkgdG8gZGV0ZXJtaW5lIHRhcmdldCBhZGRyZXNzIGZvciByZWxvY2F0aW9uLgorCSAqIHJlbG9jYXRlKCkgd2lsbCByZXR1cm4gd2l0aCAlZXNpLCAlZWRpIGFuZCAlZWN4IHNldCB1cAorCSAqIHJlYWR5IGZvciB0aGUgY29weSB0byB0aGUgbmV3IGxvY2F0aW9uLgorCSAqLworCW1vdncJJWF4LCAocHJvdF9jYWxsX3ZlY3RvcisyKQorCXB1c2hsCSRyZWxvY2F0ZQorCWxjYWxsCSpwcm90X2NhbGxfdmVjdG9yCisJcG9wbAklZWR4IC8qIGRpc2NhcmQgKi8KKworCS8qIENvcHkgY29kZSB0byBuZXcgbG9jYXRpb24gKi8KKwlwdXNobAklZWRpCisJcHVzaHcJJWF4CisJbW92dwkkY29weV9ieXRlcywgJWF4CisJY2FsbAlwbV9jYWxsCisJcG9wdwklYXgKKwlwb3BsCSVlZGkKKworCS8qIEluaXRpYWxpc2UgbGlicm0gYXQgbmV3IGxvY2F0aW9uICovCisJbGNhbGwJKmluaXRfbGlicm1fdmVjdG9yCisKKyNlbmRpZgorCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJcG9wdwklZXMKKwlwb3B3CSVkcworCXBvcGFsCisJcmV0CisJLnNpemUgaW5zdGFsbF9wcmVhbGxvYywgLiAtIGluc3RhbGxfcHJlYWxsb2MKKworCS8qIFZlY3RvcnMgZm9yIGZhciBjYWxscyB0byAudGV4dDE2IGZ1bmN0aW9ucyAqLworCS5zZWN0aW9uICIuZGF0YTE2IiwgImF3IiwgQHByb2diaXRzCisjaWZkZWYgS0VFUF9JVF9SRUFMCitpbml0X2xpYmtpcl92ZWN0b3I6CisJLndvcmQgaW5pdF9saWJraXIKKwkud29yZCAwCisJLnNpemUgaW5pdF9saWJraXJfdmVjdG9yLCAuIC0gaW5pdF9saWJraXJfdmVjdG9yCisjZWxzZQoraW5pdF9saWJybV92ZWN0b3I6CisJLndvcmQgaW5pdF9saWJybQorCS53b3JkIDAKKwkuc2l6ZSBpbml0X2xpYnJtX3ZlY3RvciwgLiAtIGluaXRfbGlicm1fdmVjdG9yCitwcm90X2NhbGxfdmVjdG9yOgorCS53b3JkIHByb3RfY2FsbAorCS53b3JkIDAKKwkuc2l6ZSBwcm90X2NhbGxfdmVjdG9yLCAuIC0gcHJvdF9jYWxsX3ZlY3RvcgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB1bmluc3RhbGwgKHJlYWwtbW9kZSBuZWFyIGNhbGwpCisgKgorICogVW5pbnN0YWxsIGFsbCB0ZXh0IGFuZCBkYXRhIHNlZ21lbnRzLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICVheCAgOiAudGV4dDE2IHNlZ21lbnQgYWRkcmVzcworICogICAlYnggIDogLmRhdGExNiBzZWdtZW50IGFkZHJlc3MKKyAqIFJldHVybnM6CisgKiAgIG5vbmUKKyAqIENvcnJ1cHRzOgorICogICBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi50ZXh0MTYiLCAiYXgiLCBAcHJvZ2JpdHMKKwkuY29kZTE2CisJLmdsb2JsIHVuaW5zdGFsbAordW5pbnN0YWxsOgorCWNhbGwJZnJlZV9iYXNlbWVtCisJcmV0CisJLnNpemUgdW5pbnN0YWxsLCAuIC0gdW5pbnN0YWxsCisKKworCisJLyogRmlsZSBzcGxpdCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXByZXNzb3IgKi8KKyNpZiBDT01QUkVTUworCS5zZWN0aW9uICIuemluZm8iLCAiYSIsIEBwcm9nYml0cworCS5hc2NpaQkiQ09QWSIKKwkubG9uZwlfcHJlZml4X2xtYQorCS5sb25nCV9wcmVmaXhfZmlsZXN6CisJLmxvbmcJX21heF9hbGlnbgorCS5hc2NpaQkiUEFDSyIKKwkubG9uZwlfdGV4dDE2X2xtYQorCS5sb25nCV90ZXh0MTZfZmlsZXN6CisJLmxvbmcJX21heF9hbGlnbgorCS5hc2NpaQkiUEFDSyIKKwkubG9uZwlfZGF0YTE2X2xtYQorCS5sb25nCV9kYXRhMTZfZmlsZXN6CisJLmxvbmcJX21heF9hbGlnbgorCS5hc2NpaQkiUEFDSyIKKwkubG9uZwlfdGV4dGRhdGFfbG1hCisJLmxvbmcJX3RleHRkYXRhX2ZpbGVzegorCS5sb25nCV9tYXhfYWxpZ24KKyNlbHNlIC8qIENPTVBSRVNTICovCisJLnNlY3Rpb24gIi56aW5mbyIsICJhIiwgQHByb2diaXRzCisJLmFzY2lpCSJDT1BZIgorCS5sb25nCV9wcmVmaXhfbG1hCisJLmxvbmcJX2ZpbGVzegorCS5sb25nCV9tYXhfYWxpZ24KKyNlbmRpZiAvKiBDT01QUkVTUyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9sa3JucHJlZml4LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L2xrcm5wcmVmaXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFkMDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9sa3JucHJlZml4LlMKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisJQ29weXJpZ2h0IChDKSAyMDAwLCBFbnRpdHkgQ3liZXIsIEluYy4KKworCUF1dGhvcnM6IEdhcnkgQnllcnMgKGdiQHRoaW5ndWluLm9yZykKKwkJIE1hcnR5IENvbm5vciAobWRjQHRoaW5ndWluLm9yZykKKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCURlc2NyaXB0aW9uOgkKKworCVRoaXMgaXMganVzdCBhIGxpdHRsZSBiaXQgb2YgY29kZSBhbmQgZGF0YSB0aGF0IGNhbiBnZXQgcHJlcGVuZGVkCisJdG8gYSBST00gaW1hZ2UgaW4gb3JkZXIgdG8gYWxsb3cgYm9vdGxvYWRlcnMgdG8gbG9hZCB0aGUgcmVzdWx0CisJYXMgaWYgaXQgd2VyZSBhIExpbnV4IGtlcm5lbCBpbWFnZS4KKworCUEgcmVhbCBMaW51eCBrZXJuZWwgaW1hZ2UgY29uc2lzdHMgb2YgYSBvbmUtc2VjdG9yIGJvb3QgbG9hZGVyCisJKHRvIGxvYWQgdGhlIGltYWdlIGZyb20gYSBmbG9wcHkgZGlzayksIGZvbGxvd2VkIGEgZmV3IHNlY3RvcnMKKwlvZiBzZXR1cCBjb2RlLCBmb2xsb3dlZCBieSB0aGUga2VybmVsIGNvZGUgaXRzZWxmLiAgVGhlcmUncworCWEgdGFibGUgaW4gdGhlIGZpcnN0IHNlY3RvciAoc3RhcnRpbmcgYXQgb2Zmc2V0IDQ5NykgdGhhdCBpbmRpY2F0ZXMKKwlob3cgbWFueSBzZWN0b3JzIG9mIHNldHVwIGNvZGUgZm9sbG93IHRoZSBmaXJzdCBzZWN0b3IgYW5kIHdoaWNoCisJY29udGFpbnMgc29tZSBvdGhlciBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGludGVyZXN0aW5nIGluIHRoaXMKKwljYXNlLgorCisJV2hlbiBhIGJvb3Rsb2FkZXIgbG9hZHMgdGhlIHNlY3RvcnMgdGhhdCBjb21wcmlzZSBhIGtlcm5lbCBpbWFnZSwKKwlpdCBkb2Vzbid0IGV4ZWN1dGUgdGhlIGNvZGUgaW4gdGhlIGZpcnN0IHNlY3RvciAoc2luY2UgdGhhdCBjb2RlCisJd291bGQgdHJ5IHRvIGxvYWQgdGhlIGltYWdlIGZyb20gYSBmbG9wcHkgZGlzay4pICBUaGUgY29kZSBpbiB0aGUKKwlmaXJzdCBzZWN0b3IgYmVsb3cgZG9lc24ndCBleHBlY3QgdG8gZ2V0IGV4ZWN1dGVkIChhbmQgcHJpbnRzIGFuCisJZXJyb3IgbWVzc2FnZSBpZiBpdCBldmVyIC1pcy0gZXhlY3V0ZWQuKQorCisJV2UgZG9uJ3QgcmVxdWlyZSBtdWNoIGluIHRoZSB3YXkgb2Ygc2V0dXAgY29kZS4gIEhpc3RvcmljYWxseSwgdGhlCisJTGludXgga2VybmVsIHJlcXVpcmVkIGF0IGxlYXN0IDQgc2VjdG9ycyBvZiBzZXR1cCBjb2RlLgorCVRoZXJlZm9yZSwgYXQgbGVhc3QgNCBzZWN0b3JzIG11c3QgYmUgcHJlc2VudCBldmVuIHRob3VnaCB3ZSBkb24ndAorCXVzZSB0aGVtLgorCisqLworCitGSUxFX0xJQ0VOQ0UgKCBHUExfQU5ZICkKKworI2RlZmluZQlTRVRVUFNFQ1MgNAkJLyogTWluaW1hbCBuciBvZiBzZXR1cC1zZWN0b3JzICovCisjZGVmaW5lIFBSRUZJWFNJWkUgKChTRVRVUFNFQ1MrMSkqNTEyKQorI2RlZmluZSBQUkVGSVhQR0ggKFBSRUZJWFNJWkUgLyAxNiApCisjZGVmaW5lCUJPT1RTRUcgIDB4MDdDMAkJLyogb3JpZ2luYWwgYWRkcmVzcyBvZiBib290LXNlY3RvciAqLworI2RlZmluZQlJTklUU0VHICAweDkwMDAJCS8qIHdlIG1vdmUgYm9vdCBoZXJlIC0gb3V0IG9mIHRoZSB3YXkgKi8KKyNkZWZpbmUJU0VUVVBTRUcgMHg5MDIwCQkvKiBzZXR1cCBzdGFydHMgaGVyZSAqLworI2RlZmluZSBTWVNTRUcgICAweDEwMDAJCS8qIHN5c3RlbSBsb2FkZWQgYXQgMHgxMDAwMCAoNjU1MzYpLiAqLworCisJLnRleHQKKwkuY29kZTE2CisJLmFyY2ggaTM4NgorCS5vcmcJMAorCS5zZWN0aW9uICIucHJlZml4IiwgImF4IiwgQHByb2diaXRzCisvKiAKKwlUaGlzIGlzIGEgbWluaW1hbCBib290IHNlY3Rvci4JSWYgYW55b25lIHRyaWVzIHRvIGV4ZWN1dGUgaXQgKGUuZy4sIGlmCisJYSAubGlsbyBmaWxlIGlzIGRkJ2VkIHRvIGEgZmxvcHB5KSwgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gCisqLworCitib290c2VjdG9yOiAKKwlqbXAJJEJPT1RTRUcsICQxZgkvKiByZWxvYWQgY3M6aXAgdG8gbWF0Y2ggcmVsb2NhdGlvbiBhZGRyICovCisxOgorCW1vdncJJDB4MjAwMCwgJWRpCQkvKiAgMHgyMDAwIGlzIGFyYml0cmFyeSB2YWx1ZSA+PSBsZW5ndGgKKwkJCQkJICAgIG9mIGJvb3RzZWN0ICsgcm9vbSBmb3Igc3RhY2sgKi8KKworCW1vdncJJEJPT1RTRUcsICVheAorCW1vdncJJWF4LCVkcworCW1vdncJJWF4LCVlcworCisJY2xpCisJbW92dwklYXgsICVzcwkJLyogcHV0IHN0YWNrIGF0IEJPT1RTRUc6MHgyMDAwLiAqLworCW1vdncJJWRpLCVzcAorCXN0aQorCisJbW92dwkkd2h5X2VuZC13aHksICVjeAorCW1vdncJJHdoeSwgJXNpCisKKwltb3Z3CSQweDAwMDcsICVieAkJLyogcGFnZSAwLCBhdHRyaWJ1dGUgNyAobm9ybWFsKSAqLworCW1vdmIJJDB4MGUsICVhaAkJLyogd3JpdGUgY2hhciwgdHR5IG1vZGUgKi8KK3BybG9vcDogCisJbG9kc2IKKwlpbnQJJDB4MTAKKwlsb29wCXBybG9vcAorZnJlZXplOiBqbXAJZnJlZXplCisKK3doeToJLmFzY2lpCSJUaGlzIGltYWdlIGNhbm5vdCBiZSBsb2FkZWQgZnJvbSBhIGZsb3BweSBkaXNrLlxyXG4iCit3aHlfZW5kOiAKKworCisvKgorCVRoZSBmb2xsb3dpbmcgaGVhZGVyIGlzIGRvY3VtZW50ZWQgaW4gdGhlIExpbnV4IHNvdXJjZSBjb2RlIGF0CisJRG9jdW1lbnRhdGlvbi9pMzg2L2Jvb3QudHh0CisqLworCS5vcmcJNDk3CitzZXR1cF9zZWN0czogCisJLmJ5dGUJU0VUVVBTRUNTCityb290X2ZsYWdzOiAKKwkud29yZAkwCitzeXNzaXplOiAKKwkubG9uZwktUFJFRklYUEdICisKKwkuc2VjdGlvbiAiLnppbmZvLmZpeHVwIiwgImEiLCBAcHJvZ2JpdHMJLyogQ29tcHJlc3NvciBmaXh1cHMgKi8KKwkuYXNjaWkJIkFEREwiCisJLmxvbmcJc3lzc2l6ZQorCS5sb25nCTE2CisJLmxvbmcJMAorCS5wcmV2aW91cworCQorcmFtX3NpemU6IAorCS53b3JkCTAKK3ZpZF9tb2RlOiAKKwkud29yZAkwCityb290X2RldjogCisJLndvcmQJMAorYm9vdF9mbGFnOiAKKwkud29yZAkweEFBNTUKK2p1bXA6CisJLyogTWFudWFsbHkgc3BlY2lmeSBhIHR3by1ieXRlIGptcCBpbnN0cnVjdGlvbiBoZXJlIHJhdGhlcgorCSAqIHRoYW4gbGVhdmluZyBpdCB1cCB0byB0aGUgYXNzZW1ibGVyLiAqLworCS5ieXRlCTB4ZWIKKwkuYnl0ZQlzZXR1cF9jb2RlIC0gaGVhZGVyCitoZWFkZXI6CisJLmJ5dGUJJ0gnLCAnZCcsICdyJywgJ1MnCit2ZXJzaW9uOgorCS53b3JkCTB4MDIwNyAvKiAyLjA3ICovCityZWFsbW9kZV9zd3RjaDoKKwkubG9uZwkwCitzdGFydF9zeXM6CisJLndvcmQJMAora2VybmVsX3ZlcnNpb246CisJLndvcmQJMAordHlwZV9vZl9sb2FkZXI6CisJLmJ5dGUJMAorbG9hZGZsYWdzOgorCS5ieXRlCTAKK3NldHVwX21vdmVfc2l6ZToKKwkud29yZAkwCitjb2RlMzJfc3RhcnQ6CisJLmxvbmcJMAorcmFtZGlza19pbWFnZToKKwkubG9uZwkwCityYW1kaXNrX3NpemU6CisJLmxvbmcJMAorYm9vdHNlY3Rfa2x1ZGdlOgorCS5sb25nCTAKK2hlYXBfZW5kX3B0cjoKKwkud29yZAkwCitwYWQxOgorCS53b3JkCTAKK2NtZF9saW5lX3B0cjoKKwkubG9uZwkwCitpbml0cmRfYWRkcl9tYXg6CisJLyogV2UgZG9uJ3QgdXNlIGFuIGluaXRyZCBidXQgc29tZSBib290bG9hZGVycyAoZS5nLiBTWVNMSU5VWCkgaGF2ZQorCSAqIGJlZW4ga25vd24gdG8gcmVxdWlyZSB0aGlzIGZpZWxkLiAgU2V0IHRoZSB2YWx1ZSB0byAyIEdCLiAgVGhpcworCSAqIHZhbHVlIGlzIGFsc28gdXNlZCBieSB0aGUgTGludXgga2VybmVsLiAqLworCS5sb25nCTB4N2ZmZmZmZmYKK2tlcm5lbF9hbGlnbm1lbnQ6CisJLmxvbmcJMAorcmVsb2NhdGFibGVfa2VybmVsOgorCS5ieXRlCTAKK3BhZDI6CisJLmJ5dGUJMCwgMCwgMAorY21kbGluZV9zaXplOgorCS5sb25nCTAKK2hhcmR3YXJlX3N1YmFyY2g6CisJLmxvbmcJMAoraGFyZHdhcmVfc3ViYXJjaF9kYXRhOgorCS5ieXRlCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKworLyoKKwlXZSBkb24ndCBuZWVkIHRvIGRvIHRvbyBtdWNoIHNldHVwLgorCisJVGhpcyBjb2RlIGdldHMgbG9hZGVkIGF0IFNFVFVQU0VHOjAuICBJdCB3YW50cyB0byBzdGFydAorCWV4ZWN1dGluZyB0aGUgaW1hZ2UgdGhhdCdzIGxvYWRlZCBhdCBTWVNTRUc6MCBhbmQKKwl3aG9zZSBlbnRyeSBwb2ludCBpcyBTWVNTRUc6MC4KKyovCitzZXR1cF9jb2RlOgorCS8qIFdlIGV4cGVjdCB0byBiZSBjb250aWd1b3VzIGluIG1lbW9yeSBvbmNlIGxvYWRlZC4gIFRoZSBMaW51eCBpbWFnZQorCSAqIGJvb3QgcHJvY2VzcyByZXF1aXJlcyB0aGF0IHNldHVwIGNvZGUgaXMgbG9hZGVkIHNlcGFyYXRlbHkgZnJvbQorCSAqICJub24tcmVhbCBjb2RlIi4gIFNpbmNlIHdlIGRvbid0IG5lZWQgYW55IGluZm9ybWF0aW9uIHRoYXQncyBsZWZ0CisJICogaW4gdGhlIHByZWZpeCwgaXQgZG9lc24ndCBtYXR0ZXI6IHdlIGp1c3QgaGF2ZSB0byBlbnN1cmUgdGhhdAorCSAqICVjczowMDAwIGlzIHdoZXJlIHRoZSBzdGFydCBvZiB0aGUgaW1hZ2UgKndvdWxkKiBiZS4KKwkgKi8KKwlsam1wCSQoU1lTU0VHLShQUkVGSVhTSVpFLzE2KSksICRydW5fZ3B4ZQorCisKKwkub3JnCVBSRUZJWFNJWkUKKy8qCisJV2UncmUgbm93IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtlcm5lbCBwcm9wZXIuCisgKi8KK3J1bl9ncHhlOgorCS8qIFNldCB1cCBzdGFjayBqdXN0IGJlbG93IDB4N2MwMCAqLworCXhvcncJJWF4LCAlYXgKKwltb3Z3CSVheCwgJXNzCisJbW92dwkkMHg3YzAwLCAlc3AKKworCS8qIEluc3RhbGwgZ1BYRSAqLworCWNhbGwJaW5zdGFsbAorCisJLyogU2V0IHVwIHJlYWwtbW9kZSBzdGFjayAqLworCW1vdncJJWJ4LCAlc3MKKwltb3Z3CSRfZXN0YWNrMTYsICVzcAorCisJLyogSnVtcCB0byAudGV4dDE2IHNlZ21lbnQgKi8KKwlwdXNodwklYXgKKwlwdXNodwkkMWYKKwlscmV0CisJLnNlY3Rpb24gIi50ZXh0MTYiLCAiYXd4IiwgQHByb2diaXRzCisxOgorCXB1c2hsCSRtYWluCisJcHVzaHcJJWNzCisJY2FsbAlwcm90X2NhbGwKKwlwb3BsCSVlY3ggLyogZGlzY2FyZCAqLworCisJLyogVW5pbnN0YWxsIGdQWEUgKi8KKwljYWxsCXVuaW5zdGFsbAorCisJLyogQm9vdCBuZXh0IGRldmljZSAqLworCWludCAkMHgxOApkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9tYnIuUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvbWJyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmZTIwNAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvbWJyLlMKQEAgLTAsMCArMSwxMyBAQAorCS50ZXh0CisJLmFyY2ggaTM4NgorCS5zZWN0aW9uICIucHJlZml4IiwgImF3eCIsIEBwcm9nYml0cworCS5jb2RlMTYKKwkub3JnIDAKKworbWJyOgorCW1vdncJJGV4ZWNfc2VjdG9yLCAlYnAKKwlqbXAJZmluZF9hY3RpdmVfcGFydGl0aW9uCitleGVjX3NlY3RvcjoKKwlsam1wCSQweDAwMDAsICQweDdjMDAKKworI2luY2x1ZGUgImJvb3RwYXJ0LlMiCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L25iaXByZWZpeC5TIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9uYmlwcmVmaXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDdkODBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC9uYmlwcmVmaXguUwpAQCAtMCwwICsxLDc3IEBACisJLnRleHQKKwkuYXJjaCBpMzg2CisJLmNvZGUxNgorCS5zZWN0aW9uICIucHJlZml4IiwgImF4IiwgQHByb2diaXRzCisJLm9yZyAwCisKK25iaV9oZWFkZXI6CisJCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5CSSBmaWxlIGhlYWRlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2ZpbGVfaGVhZGVyOgorCS5sb25nCTB4MWIwMzEzMzYJLyogU2lnbmF0dXJlICovCisJLmJ5dGUJMHgwNAkJLyogMTYgYnl0ZXMgaGVhZGVyLCBubyB2ZW5kb3IgaW5mbyAqLworCS5ieXRlCTAKKwkuYnl0ZQkwCisJLmJ5dGUJMAkJLyogTm8gZmxhZ3MgKi8KKwkud29yZAkweDAwMDAsIDB4MDdjMAkvKiBMb2FkIGhlYWRlciB0byAweDA3YzA6MHgwMDAwICovCisJLndvcmQJZW50cnksIDB4MDdjMAkvKiBTdGFydCBleGVjdXRpb24gYXQgMHgwN2MwOmVudHJ5ICovCisJLnNpemUJZmlsZV9oZWFkZXIsIC4gLSBmaWxlX2hlYWRlcgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5CSSBzZWdtZW50IGhlYWRlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3NlZ21lbnRfaGVhZGVyOgorCS5ieXRlCTB4MDQJCS8qIDE2IGJ5dGVzIGhlYWRlciwgbm8gdmVuZG9yIGluZm8gKi8KKwkuYnl0ZQkwCisJLmJ5dGUJMAorCS5ieXRlCTB4MDQJCS8qIExhc3Qgc2VnbWVudCAqLworCS5sb25nCTB4MDAwMDdlMDAKK2ltZ2xlbjoJLmxvbmcJLTUxMgorbWVtbGVuOgkubG9uZwktNTEyCisJLnNpemUJc2VnbWVudF9oZWFkZXIsIC4gLSBzZWdtZW50X2hlYWRlcgorCisJLnNlY3Rpb24gIi56aW5mby5maXh1cCIsICJhIiwgQHByb2diaXRzCS8qIENvbXByZXNzb3IgZml4dXBzICovCisJLmFzY2lpCSJBRERMIgorCS5sb25nCWltZ2xlbgorCS5sb25nCTEKKwkubG9uZwkwCisJLmFzY2lpCSJBRERMIgorCS5sb25nCW1lbWxlbgorCS5sb25nCTEKKwkubG9uZwkwCisJLnByZXZpb3VzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTkJJIGVudHJ5IHBvaW50CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworZW50cnk6CisJLyogSW5zdGFsbCBnUFhFICovCisJY2FsbAlpbnN0YWxsCisKKwkvKiBKdW1wIHRvIC50ZXh0MTYgc2VnbWVudCAqLworCXB1c2h3CSVheAorCXB1c2h3CSQxZgorCWxyZXQKKwkuc2VjdGlvbiAiLnRleHQxNiIsICJhd3giLCBAcHJvZ2JpdHMKKzE6CisJcHVzaGwJJG1haW4KKwlwdXNodwklY3MKKwljYWxsCXByb3RfY2FsbAorCXBvcGwJJWVjeCAvKiBkaXNjYXJkICovCisKKwkvKiBVbmluc3RhbGwgZ1BYRSAqLworCWNhbGwJdW5pbnN0YWxsCisKKwkvKiBSZWJvb3Qgc3lzdGVtICovCisJaW50ICQweDE5CisKKwkucHJldmlvdXMKKwkuc2l6ZQllbnRyeSwgLiAtIGVudHJ5CisKK25iaV9oZWFkZXJfZW5kOgorCS5vcmcgNTEyCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L251bGxwcmVmaXguUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvbnVsbHByZWZpeC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMmQ0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L251bGxwcmVmaXguUwpAQCAtMCwwICsxLDEzIEBACisJLm9yZwkwCisJLnRleHQKKwkuYXJjaCBpMzg2CisKKwkuc2VjdGlvbiAiLnByZWZpeCIsICJheCIsIEBwcm9nYml0cworCS5jb2RlMTYKK19wcmVmaXg6CisKKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworcHJlZml4X2V4aXQ6CisKK3ByZWZpeF9leGl0X2VuZDoKKwkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvcHhlcHJlZml4LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3B4ZXByZWZpeC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjhjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3B4ZXByZWZpeC5TCkBAIC0wLDAgKzEsNzYxIEBACitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICkKKworI2RlZmluZSBQWEVOVl9VTkRJX1NIVVRET1dOCQkweDAwMDUKKyNkZWZpbmUJUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUJCTB4MDAxMgorI2RlZmluZSBQWEVOVl9VTkRJX0dFVF9JRkFDRV9JTkZPCTB4MDAxMworI2RlZmluZQlQWEVOVl9TVE9QX1VOREkJCQkweDAwMTUKKyNkZWZpbmUgUFhFTlZfVU5MT0FEX1NUQUNLCQkweDAwNzAKKworI2RlZmluZSBQWEVfSEFDS19FQjU0CQkJMHgwMDAxCisKKwkudGV4dAorCS5hcmNoIGkzODYKKwkub3JnIDAKKwkuY29kZTE2CisKKyNpbmNsdWRlIDx1bmRpLmg+CisKKyNkZWZpbmUgU1RBQ0tfTUFHSUMgKCAnTCcgKyAoICdSJyA8PCA4ICkgKyAoICdFJyA8PCAxNiApICsgKCAnVCcgPDwgMjQgKSApCisjZGVmaW5lIEVCX01BR0lDXzEgKCAnRScgKyAoICd0JyA8PCA4ICkgKyAoICdoJyA8PCAxNiApICsgKCAnZScgPDwgMjQgKSApCisjZGVmaW5lIEVCX01BR0lDXzIgKCAncicgKyAoICdiJyA8PCA4ICkgKyAoICdvJyA8PCAxNiApICsgKCAnbycgPDwgMjQgKSApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRW50cnkgcG9pbnQ6CXNldCBvcGVyYXRpbmcgY29udGV4dCwgcHJpbnQgd2VsY29tZSBtZXNzYWdlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIucHJlZml4IiwgImF4IiwgQHByb2diaXRzCisJam1wCSQweDdjMCwgJDFmCisxOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycyBmb3IgcG9zc2libGUgcmV0dXJuIHRvIFBYRSAqLworCXB1c2hmbAorCXB1c2hhbAorCXB1c2h3CSVncworCXB1c2h3CSVmcworCXB1c2h3CSVlcworCXB1c2h3CSVkcworCisJLyogU3RvcmUgbWFnaWMgd29yZCBvbiBQWEUgc3RhY2sgYW5kIHJlbWVtYmVyIFBYRSAlc3M6ZXNwICovCisJcHVzaGwJJFNUQUNLX01BR0lDCisJbW92dwklc3MsICVjczpweGVfc3MKKwltb3ZsCSVlc3AsICVjczpweGVfZXNwCisKKwkvKiBTZXQgdXAgc2VnbWVudHMgKi8KKwltb3Z3CSVjcywgJWF4CisJbW92dwklYXgsICVkcworCW1vdncJJDB4NDAsICVheAkJLyogQklPUyBkYXRhIHNlZ21lbnQgYWNjZXNzICovCisJbW92dwklYXgsICVmcworCS8qIFNldCB1cCBzdGFjayBqdXN0IGJlbG93IDB4N2MwMCAqLworCXhvcncJJWF4LCAlYXgKKwltb3Z3CSVheCwgJXNzCisJbW92bAkkMHg3YzAwLCAlZXNwCisJLyogQ2xlYXIgZGlyZWN0aW9uIGZsYWcsIGZvciB0aGUgc2FrZSBvZiBzYW5pdHkgKi8KKwljbGQKKwkvKiBQcmludCB3ZWxjb21lIG1lc3NhZ2UgKi8KKwltb3Z3CSQxMGYsICVzaQorCXhvcncJJWRpLCAlZGkKKwljYWxsCXByaW50X21lc3NhZ2UKKwkuc2VjdGlvbiAiLnByZWZpeC5kYXRhIiwgImF3IiwgQHByb2diaXRzCisxMDoJLmFzY2l6CSJQWEUtPkVCOiIKKwkucHJldmlvdXMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaW5kIHVzIGEgdXNhYmxlICFQWEUgb3IgUFhFTlYrIGVudHJ5IHBvaW50CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworZGV0ZWN0X3B4ZToKKwkvKiBQbGFuIEE6ICFQWEUgcG9pbnRlciBmcm9tIHRoZSBzdGFjayAqLworCWxnc2wJcHhlX2VzcCwgJWVicAkJLyogJWdzOiVicCAtPiBvcmlnaW5hbCBzdGFjayAqLworCWxlc3cJJWdzOjUyKCVicCksICVieAorCWNhbGwJaXNfdmFsaWRfcHB4ZQorCWplCWhhdmVfcHB4ZQorCisJLyogUGxhbiBCOiBQWEVOVisgcG9pbnRlciBmcm9tIGluaXRpYWwgRVM6QlggKi8KKwltb3Z3CSVnczozMiglYnApLCVieAorCW1vdncJJWdzOjgoJWJwKSwlZXMKKwljYWxsCWlzX3ZhbGlkX3B4ZW52CisJamUJaGF2ZV9weGVudgorCisJLyogUGxhbiBDOiBQWEVOVisgc3RydWN0dXJlIHZpYSBJTlQgMUFoICovCisJbW92dwkkMHg1NjUwLCAlYXgKKwlpbnQJJDB4MWEKKwlqYwkxZgorCWNtcHcJJDB4NTY0ZSwgJWF4CisJam5lCTFmCisJY2FsbAlpc192YWxpZF9weGVudgorCWplCWhhdmVfcHhlbnYKKzE6CisJLyogUGxhbiBEOiBzY2FuIGJhc2UgbWVtb3J5IGZvciAhUFhFICovCisJY2FsbAltZW1vcnlfc2Nhbl9wcHhlCisJamUJaGF2ZV9wcHhlCisKKwkvKiBQbGFuIEU6IHNjYW4gYmFzZSBtZW1vcnkgZm9yIFBYRU5WKyAqLworCWNhbGwJbWVtb3J5X3NjYW5fcHhlbnYKKwlqbmUJc3RhY2tfbm90X2ZvdW5kCisJCitoYXZlX3B4ZW52OgorCW1vdncJJWJ4LCBweGVudl9vZmZzZXQKKwltb3Z3CSVlcywgcHhlbnZfc2VnbWVudAorCisJY21wdwkkMHgyMDEsICVlczo2KCVieCkJLyogQVBJIHZlcnNpb24gPj0gMi4wMSAqLworCWpiCTFmCisJY21wYgkkMHgyYywgJWVzOjgoJWJ4KQkvKiAuLi4gYW5kIHN0cnVjdHVyZSBsb25nIGVub3VnaCAqLworCWpiCTJmCisKKwlsZXN3CSVlczoweDI4KCVieCksICVieAkvKiBGaW5kICFQWEUgZnJvbSBQWEVOVisgKi8KKwljYWxsCWlzX3ZhbGlkX3BweGUKKwlqZQloYXZlX3BweGUKKzI6CisJY2FsbAltZW1vcnlfc2Nhbl9wcHhlCS8qIFdlIGFyZSAqc3VwcG9zZWQqIHRvIGhhdmUgIVBYRS4uLiAqLworCWplCWhhdmVfcHB4ZQorMToKKwlsZXN3CXB4ZW52X3NlZ29mZiwgJWJ4CS8qIE5vcGUsIHdlJ3JlIHN0dWNrIHdpdGggUFhFTlYrICovCisKKwkvKiBSZWNvcmQgZW50cnkgcG9pbnQgYW5kIFVOREkgc2VnbWVudHMgKi8KKwlwdXNobAklZXM6MHgwYSglYngpCQkvKiBFbnRyeSBwb2ludCAqLworCXB1c2h3CSVlczoweDI0KCVieCkJCS8qIFVOREkgY29kZSBzZWdtZW50ICovCisJcHVzaHcJJWVzOjB4MjYoJWJ4KQkJLyogVU5ESSBjb2RlIHNpemUgKi8KKwlwdXNodwklZXM6MHgyMCglYngpCQkvKiBVTkRJIGRhdGEgc2VnbWVudCAqLworCXB1c2h3CSVlczoweDIyKCVieCkJCS8qIFVOREkgZGF0YSBzaXplICovCisKKwkvKiBQcmludCAiUFhFTlYrIGF0IDxhZGRyZXNzPiIgKi8KKwltb3Z3CSQxMGYsICVzaQorCWptcAljaGVja19oYXZlX3N0YWNrCisJLnNlY3Rpb24gIi5wcmVmaXguZGF0YSIsICJhdyIsIEBwcm9nYml0cworMTA6CS5hc2NpegkiIFBYRU5WKyBhdCAiCisJLnByZXZpb3VzCisKK2hhdmVfcHB4ZToKKwltb3Z3CSVieCwgcHB4ZV9vZmZzZXQKKwltb3Z3CSVlcywgcHB4ZV9zZWdtZW50CisJCisJcHVzaGwJJWVzOjB4MTAoJWJ4KQkJLyogRW50cnkgcG9pbnQgKi8KKwlwdXNodwklZXM6MHgzMCglYngpCQkvKiBVTkRJIGNvZGUgc2VnbWVudCAqLworCXB1c2h3CSVlczoweDM2KCVieCkJCS8qIFVOREkgY29kZSBzaXplICovCisJcHVzaHcJJWVzOjB4MjgoJWJ4KQkJLyogVU5ESSBkYXRhIHNlZ21lbnQgKi8KKwlwdXNodwklZXM6MHgyZSglYngpCQkvKiBVTkRJIGRhdGEgc2l6ZSAqLworCisJLyogUHJpbnQgIiFQWEUgYXQgPGFkZHJlc3M+IiAqLworCW1vdncJJDEwZiwgJXNpCisJam1wCWNoZWNrX2hhdmVfc3RhY2sKKwkuc2VjdGlvbiAiLnByZWZpeC5kYXRhIiwgImF3IiwgQHByb2diaXRzCisxMDoJLmFzY2l6CSIgIVBYRSBhdCAiCisJLnByZXZpb3VzCisKK2lzX3ZhbGlkX3BweGU6CisJY21wbAkkMHg0NTU4NTAyMSwgJWVzOiglYngpCisJam5lCTFmCisJbW92emJ3CSVlczo0KCVieCksICVjeAorCWNtcHcJJDB4NTgsICVjeAorCWphZQlpc192YWxpZF9jaGVja3N1bQorMToKKwlyZXQKKwkKK2lzX3ZhbGlkX3B4ZW52OgorCWNtcGwJJDB4NGU0NTU4NTAsICVlczooJWJ4KQorCWpuZQkxYgorCWNtcHcJJDB4MmI1NiwgJWVzOjQoJWJ4KQorCWpuZQkxYgorCW1vdnpidwklZXM6OCglYngpLCAlY3gKKwljbXB3CSQweDI4LCAlY3gKKwlqYgkxYgorCQoraXNfdmFsaWRfY2hlY2tzdW06CisJcHVzaHcJJWF4CisJbW92dwklYngsICVzaQorCXhvcncJJWF4LCAlYXgKKzI6CisJZXMgbG9kc2IKKwlhZGRiCSVhbCwgJWFoCisJbG9vcHcJMmIKKwlwb3B3CSVheAorCXJldAorCittZW1vcnlfc2Nhbl9wcHhlOgorCW1vdncJJGlzX3ZhbGlkX3BweGUsICVkeAorCWptcAltZW1vcnlfc2Nhbl9jb21tb24KKworbWVtb3J5X3NjYW5fcHhlbnY6CisJbW92dwkkaXNfdmFsaWRfcHhlbnYsICVkeAorCittZW1vcnlfc2Nhbl9jb21tb246CisJbW92dwklZnM6KDB4MTMpLCAlYXgKKwlzaGx3CSQ2LCAlYXgKKwlkZWN3CSVheAorMToJaW5jdwklYXgKKwljbXB3CSQoIDB4YTAwMCAtIDEgKSwgJWF4CisJamEJMmYKKwltb3Z3CSVheCwgJWVzCisJeG9ydwklYngsICVieAorCWNhbGwJKiVkeAorCWpuZQkxYgorMjoJcmV0CisJCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNhbml0eSBjaGVjazogd2UgbXVzdCBoYXZlIGFuIGVudHJ5IHBvaW50CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworY2hlY2tfaGF2ZV9zdGFjazoKKwkvKiBTYXZlIGNvbW1vbiB2YWx1ZXMgcHVzaGVkIG9udG8gdGhlIHN0YWNrICovCisJcG9wbAl1bmRpX2RhdGFfc2Vnb2ZmCisJcG9wbAl1bmRpX2NvZGVfc2Vnb2ZmCisJcG9wbAllbnRyeV9zZWdvZmYKKworCS8qIFByaW50IGhhdmUgIVBYRS9QWEVOVisgbWVzc2FnZTsgc3RydWN0dXJlIHBvaW50ZXIgaW4gJWVzOiVieCAqLworCWNhbGwJcHJpbnRfbWVzc2FnZQorCWNhbGwJcHJpbnRfc2Vnb2ZmCisJbW92YgkkKCAnLCcgKSwgJWFsCisJY2FsbAlwcmludF9jaGFyYWN0ZXIKKworCS8qIENoZWNrIGZvciBlbnRyeSBwb2ludCAqLworCW1vdmwJZW50cnlfc2Vnb2ZmLCAlZWF4CisJdGVzdGwJJWVheCwgJWVheAorCWpuegk5OWYKKwkvKiBObyBlbnRyeSBwb2ludDogcHJpbnQgbWVzc2FnZSBhbmQgc2tpcCBldmVyeXRoaW5nIGVsc2UgKi8KK3N0YWNrX25vdF9mb3VuZDoKKwltb3Z3CSQxMGYsICVzaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCWptcAlmaW5pc2hlZAorCS5zZWN0aW9uICIucHJlZml4LmRhdGEiLCAiYXciLCBAcHJvZ2JpdHMKKzEwOgkuYXNjaXoJIiBObyBQWEUgc3RhY2sgZm91bmQhXG4iCisJLnByZXZpb3VzCis5OToJCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2FsY3VsYXRlIGJhc2UgbWVtb3J5IHVzYWdlIGJ5IFVOREkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitmaW5kX3VuZGlfYmFzZW1lbV91c2FnZToKKwltb3Z3CXVuZGlfY29kZV9zZWdtZW50LCAlYXgKKwltb3Z3CXVuZGlfY29kZV9zaXplLCAlYngKKwltb3Z3CXVuZGlfZGF0YV9zZWdtZW50LCAlY3gKKwltb3Z3CXVuZGlfZGF0YV9zaXplLCAlZHgKKwljbXB3CSVheCwgJWN4CisJamEJMWYKKwl4Y2hndwklYXgsICVjeAorCXhjaGd3CSVieCwgJWR4CisxOgkvKiAlYXg6JWJ4IG5vdyBkZXNjcmliZXMgdGhlIGxvd2VyIHJlZ2lvbiwgJWN4OiVkeCB0aGUgaGlnaGVyICovCisJc2hydwkkNiwgJWF4CQkJLyogUm91bmQgZG93biB0byBuZWFyZXN0IGtCICovCisJbW92dwklYXgsIHVuZGlfZmJtc19zdGFydAorCWFkZHcJJDB4MGYsICVkeAkJLyogUm91bmQgdXAgdG8gbmV4dCBzZWdtZW50ICovCisJc2hydwkkNCwgJWR4CisJYWRkdwklZHgsICVjeAorCWFkZHcJJCgoMTAyNCAvIDE2KSAtIDEpLCAlY3gJLyogUm91bmQgdXAgdG8gbmV4dCBrQiAqLworCXNocncJJDYsICVjeAorCW1vdncJJWN4LCB1bmRpX2ZibXNfZW5kCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgZGV0ZWN0ZWQgUFhFIHN0YWNrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcHJpbnRfc3RydWN0dXJlX2luZm9ybWF0aW9uOgorCS8qIFByaW50IGVudHJ5IHBvaW50ICovCisJbW92dwkkMTBmLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKKwlsZXMJZW50cnlfc2Vnb2ZmLCAlYngKKwljYWxsCXByaW50X3NlZ29mZgorCS5zZWN0aW9uICIucHJlZml4LmRhdGEiLCAiYXciLCBAcHJvZ2JpdHMKKzEwOgkuYXNjaXoJIiBlbnRyeSBwb2ludCBhdCAiCisJLnByZXZpb3VzCisJLyogUHJpbnQgVU5ESSBjb2RlIHNlZ21lbnQgKi8KKwltb3Z3CSQxMGYsICVzaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCWxlcwl1bmRpX2NvZGVfc2Vnb2ZmLCAlYngKKwljYWxsCXByaW50X3NlZ29mZgorCS5zZWN0aW9uICIucHJlZml4LmRhdGEiLCAiYXciLCBAcHJvZ2JpdHMKKzEwOgkuYXNjaXoJIlxuICAgICAgICAgVU5ESSBjb2RlIHNlZ21lbnQgIgorCS5wcmV2aW91cworCS8qIFByaW50IFVOREkgZGF0YSBzZWdtZW50ICovCisJbW92dwkkMTBmLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKKwlsZXMJdW5kaV9kYXRhX3NlZ29mZiwgJWJ4CisJY2FsbAlwcmludF9zZWdvZmYKKwkuc2VjdGlvbiAiLnByZWZpeC5kYXRhIiwgImF3IiwgQHByb2diaXRzCisxMDoJLmFzY2l6CSIsIGRhdGEgc2VnbWVudCAiCisJLnByZXZpb3VzCisJLyogUHJpbnQgVU5ESSBtZW1vcnkgdXNhZ2UgKi8KKwltb3Z3CSQxMGYsICVzaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCW1vdncJdW5kaV9mYm1zX3N0YXJ0LCAlYXgKKwljYWxsCXByaW50X3dvcmQKKwltb3ZiCSQoICctJyApLCAlYWwKKwljYWxsCXByaW50X2NoYXJhY3RlcgorCW1vdncJdW5kaV9mYm1zX2VuZCwgJWF4CisJY2FsbAlwcmludF93b3JkCisJbW92dwkkMjBmLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKKwkuc2VjdGlvbiAiLnByZWZpeC5kYXRhIiwgImF3IiwgQHByb2diaXRzCisxMDoJLmFzY2l6CSIgKCIKKzIwOgkuYXNjaXoJImtCKVxuIgorCS5wcmV2aW91cworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldGVybWluZSBwaHlzaWNhbCBkZXZpY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitnZXRfcGh5c2ljYWxfZGV2aWNlOgorCS8qIElzc3VlIFBYRU5WX1VORElfR0VUX05JQ19UWVBFICovCisJbW92dwkkUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUsICVieAorCWNhbGwJcHhlX2NhbGwKKwlqbmMJMWYKKwljYWxsCXByaW50X3B4ZV9lcnJvcgorCWptcAlub19waHlzaWNhbF9kZXZpY2UKKzE6CS8qIERldGVybWluZSBwaHlzaWNhbCBkZXZpY2UgdHlwZSAqLworCW1vdmIJKCBweGVfcGFyYW1ldGVyX3N0cnVjdHVyZSArIDB4MDIgKSwgJWFsCisJY21wYgkkMiwgJWFsCisJamUJcGNpX3BoeXNpY2FsX2RldmljZQorCWptcAlub19waHlzaWNhbF9kZXZpY2UKKworcGNpX3BoeXNpY2FsX2RldmljZToKKwkvKiBSZWNvcmQgUENJIGJ1czpkZXYuZm4gYW5kIHZlbmRvci9kZXZpY2UgSURzICovCisJbW92bAkoIHB4ZV9wYXJhbWV0ZXJfc3RydWN0dXJlICsgMHgwMyApLCAlZWF4CisJbW92bAklZWF4LCBwY2lfdmVuZG9yCisJbW92dwkoIHB4ZV9wYXJhbWV0ZXJfc3RydWN0dXJlICsgMHgwYiApLCAlYXgKKwltb3Z3CSVheCwgcGNpX2J1c2RldmZuCisJbW92dwkkMTBmLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKKwljYWxsCXByaW50X3BjaV9idXNkZXZmbgorCWptcAk5OWYKKwkuc2VjdGlvbiAiLnByZWZpeC5kYXRhIiwgImF3IiwgQHByb2diaXRzCisxMDoJLmFzY2l6CSIgICAgICAgICBVTkRJIGRldmljZSBpcyBQQ0kgIgorCS5wcmV2aW91cworCitub19waHlzaWNhbF9kZXZpY2U6CisJLyogTm8gZGV2aWNlIGZvdW5kLCBvciBkZXZpY2UgdHlwZSBub3QgdW5kZXJzdG9vZCAqLworCW1vdncJJDEwZiwgJXNpCisJY2FsbAlwcmludF9tZXNzYWdlCisJLnNlY3Rpb24gIi5wcmVmaXguZGF0YSIsICJhdyIsIEBwcm9nYml0cworMTA6CS5hc2NpegkiICAgICAgICAgVW5hYmxlIHRvIGRldGVybWluZSBVTkRJIHBoeXNpY2FsIGRldmljZSIKKwkucHJldmlvdXMKKworOTk6CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV0ZXJtaW5lIGludGVyZmFjZSB0eXBlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworZ2V0X2lmYWNlX3R5cGU6CisJLyogSXNzdWUgUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GTyAqLworCW1vdncJJFBYRU5WX1VORElfR0VUX0lGQUNFX0lORk8sICVieAorCWNhbGwJcHhlX2NhbGwKKwlqbmMJMWYKKwljYWxsCXByaW50X3B4ZV9lcnJvcgorCWptcAk5OWYKKzE6CS8qIFByaW50IGludGVyZmFjZSB0eXBlICovCisJbW92dwkkMTBmLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKKwlsZWF3CSggcHhlX3BhcmFtZXRlcl9zdHJ1Y3R1cmUgKyAweDAyICksICVzaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCS5zZWN0aW9uICIucHJlZml4LmRhdGEiLCAiYXciLCBAcHJvZ2JpdHMKKzEwOgkuYXNjaXoJIiwgdHlwZSAiCisJLnByZXZpb3VzCisJLyogQ2hlY2sgZm9yICJFdGhlcmJvb3QiIGludGVyZmFjZSB0eXBlICovCisJY21wbAkkRUJfTUFHSUNfMSwgKCBweGVfcGFyYW1ldGVyX3N0cnVjdHVyZSArIDB4MDIgKQorCWpuZQk5OWYKKwljbXBsCSRFQl9NQUdJQ18yLCAoIHB4ZV9wYXJhbWV0ZXJfc3RydWN0dXJlICsgMHgwNiApCisJam5lCTk5ZgorCW1vdncJJDEwZiwgJXNpCisJY2FsbAlwcmludF9tZXNzYWdlCisJLnNlY3Rpb24gIi5wcmVmaXguZGF0YSIsICJhdyIsIEBwcm9nYml0cworMTA6CS5hc2NpegkiICh3b3JrYXJvdW5kIGVuYWJsZWQpIgorCS5wcmV2aW91cworCS8qIEZsYWcgRXRoZXJib290IHdvcmthcm91bmRzIGFzIHJlcXVpcmVkICovCisJb3J3CSRQWEVfSEFDS19FQjU0LCBweGVfaGFja3MKKworOTk6CW1vdmIJJDB4MGEsICVhbAorCWNhbGwJcHJpbnRfY2hhcmFjdGVyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGVhdmUgTklDIGluIGEgc2FmZSBzdGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpZm5kZWYgUFhFTE9BREVSX0tFRVBfUFhFCitzaHV0ZG93bl9uaWM6CisJLyogSXNzdWUgUFhFTlZfVU5ESV9TSFVURE9XTiAqLworCW1vdncJJFBYRU5WX1VORElfU0hVVERPV04sICVieAorCWNhbGwJcHhlX2NhbGwKKwlqbmMJMWYKKwljYWxsCXByaW50X3B4ZV9lcnJvcgorMToKK3VubG9hZF9iYXNlX2NvZGU6CisJLyogRXRoZXJib290IHRyZWF0cyBQWEVOVl9VTkxPQURfU1RBQ0sgYXMgUFhFTlZfU1RPUF9VTkRJLCBzbworCSAqIHdlIG11c3Qgbm90IGlzc3VlIHRoaXMgY2FsbCBpZiB0aGUgdW5kZXJseWluZyBzdGFjayBpcworCSAqIEV0aGVyYm9vdCBhbmQgd2Ugd2VyZSBub3QgaW50ZW5kaW5nIHRvIGlzc3VlIGEgUFhFTlZfU1RPUF9VTkRJLgorCSAqLworI2lmZGVmIFBYRUxPQURFUl9LRUVQX1VOREkKKwl0ZXN0dwkkUFhFX0hBQ0tfRUI1NCwgcHhlX2hhY2tzCisJam56CTk5ZgorI2VuZGlmIC8qIFBYRUxPQURFUl9LRUVQX1VOREkgKi8KKwkvKiBJc3N1ZSBQWEVOVl9VTkxPQURfU1RBQ0sgKi8KKwltb3Z3CSRQWEVOVl9VTkxPQURfU1RBQ0ssICVieAorCWNhbGwJcHhlX2NhbGwKKwlqbmMJMWYKKwljYWxsCXByaW50X3B4ZV9lcnJvcgorCWptcAk5OWYKKzE6CS8qIEZyZWUgYmFzZSBtZW1vcnkgdXNlZCBieSBQWEUgYmFzZSBjb2RlICovCisJbW92dwl1bmRpX2ZibXNfc3RhcnQsICVheAorCW1vdncJJWZzOigweDEzKSwgJWJ4CisJY2FsbAlmcmVlX2Jhc2VtZW0KKzk5OgorCWFuZHcJJH4oIFVORElfRkxfSU5JVElBTElaRUQgfCBVTkRJX0ZMX0tFRVBfQUxMICksIGZsYWdzCisjZW5kaWYgLyogUFhFTE9BREVSX0tFRVBfUFhFICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVW5sb2FkIFVOREkgZHJpdmVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2lmbmRlZiBQWEVMT0FERVJfS0VFUF9VTkRJCit1bmxvYWRfdW5kaToKKwkvKiBJc3N1ZSBQWEVOVl9TVE9QX1VOREkgKi8KKwltb3Z3CSRQWEVOVl9TVE9QX1VOREksICVieAorCWNhbGwJcHhlX2NhbGwKKwlqbmMJMWYKKwljYWxsCXByaW50X3B4ZV9lcnJvcgorCWptcAk5OWYKKzE6CS8qIEZyZWUgYmFzZSBtZW1vcnkgdXNlZCBieSBVTkRJICovCisJbW92dwl1bmRpX2ZibXNfZW5kLCAlYXgKKwltb3Z3CXVuZGlfZmJtc19zdGFydCwgJWJ4CisJY2FsbAlmcmVlX2Jhc2VtZW0KKwkvKiBDbGVhciBVTkRJX0ZMX1NUQVJURUQgKi8KKwlhbmR3CSR+VU5ESV9GTF9TVEFSVEVELCBmbGFncworOTk6CQorI2VuZGlmIC8qIFBYRUxPQURFUl9LRUVQX1VOREkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcmludCByZW1haW5pbmcgZnJlZSBiYXNlIG1lbW9yeQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ByaW50X2ZyZWVfYmFzZW1lbToKKwltb3Z3CSQxMGYsICVzaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCW1vdncJJWZzOigweDEzKSwgJWF4CisJY2FsbAlwcmludF93b3JkCisJbW92dwkkMjBmLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKKwkuc2VjdGlvbiAiLnByZWZpeC5kYXRhIiwgImF3IiwgQHByb2diaXRzCisxMDoJLmFzY2l6CSIgICAgICAgICAiCisyMDoJLmFzY2l6CSJrQiBmcmVlIGJhc2UgbWVtb3J5IGFmdGVyIFBYRSB1bmxvYWRcbiIKKwkucHJldmlvdXMKKwkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXhpdCBwb2ludAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8JCitmaW5pc2hlZDoKKwlqbXAJcnVuX2dweGUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdWJyb3V0aW5lOiBwcmludCBzZWdtZW50Om9mZnNldCBhZGRyZXNzCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWVzOiVieCA6IHNlZ21lbnQ6b2Zmc2V0IGFkZHJlc3MgdG8gcHJpbnQKKyAqICAgJWRzOmRpIDogb3V0cHV0IGJ1ZmZlciAob3IgJWRpPTAgdG8gcHJpbnQgdG8gY29uc29sZSkKKyAqIFJldHVybnM6CisgKiAgICVkczpkaSA6IG5leHQgY2hhcmFjdGVyIGluIG91dHB1dCBidWZmZXIgKGlmIGFwcGxpY2FibGUpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcHJpbnRfc2Vnb2ZmOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycyAqLworCXB1c2h3CSVheAorCS8qIFByaW50ICI8c2VnbWVudD46b2Zmc2V0IiAqLworCW1vdncJJWVzLCAlYXgKKwljYWxsCXByaW50X2hleF93b3JkCisJbW92YgkkKCAnOicgKSwgJWFsCisJY2FsbAlwcmludF9jaGFyYWN0ZXIKKwltb3Z3CSVieCwgJWF4CisJY2FsbAlwcmludF9oZXhfd29yZAorCS8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KKwlwb3B3CSVheAorCXJldAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN1YnJvdXRpbmU6IHByaW50IGRlY2ltYWwgd29yZAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICVheCA6IHdvcmQgdG8gcHJpbnQKKyAqICAgJWRzOmRpIDogb3V0cHV0IGJ1ZmZlciAob3IgJWRpPTAgdG8gcHJpbnQgdG8gY29uc29sZSkKKyAqIFJldHVybnM6CisgKiAgICVkczpkaSA6IG5leHQgY2hhcmFjdGVyIGluIG91dHB1dCBidWZmZXIgKGlmIGFwcGxpY2FibGUpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcHJpbnRfd29yZDoKKwkvKiBQcmVzZXJ2ZSByZWdpc3RlcnMgKi8KKwlwdXNodwklYXgKKwlwdXNodwklYngKKwlwdXNodwklY3gKKwlwdXNodwklZHgKKwkvKiBCdWlsZCB1cCBkaWdpdCBzZXF1ZW5jZSBvbiBzdGFjayAqLworCW1vdncJJDEwLCAlYngKKwl4b3J3CSVjeCwgJWN4CisxOgl4b3J3CSVkeCwgJWR4CisJZGl2dwklYngsICVheAorCXB1c2h3CSVkeAorCWluY3cJJWN4CisJdGVzdHcJJWF4LCAlYXgKKwlqbnoJMWIKKwkvKiBQcmludCBkaWdpdCBzZXF1ZW5jZSAqLworMToJcG9wdwklYXgKKwljYWxsCXByaW50X2hleF9uaWJibGUKKwlsb29wCTFiCisJLyogUmVzdG9yZSByZWdpc3RlcnMgYW5kIHJldHVybiAqLworCXBvcHcJJWR4CisJcG9wdwklY3gKKwlwb3B3CSVieAorCXBvcHcJJWF4CisJcmV0CisJCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN1YnJvdXRpbmU6IHplcm8gMWtCIGJsb2NrIG9mIGJhc2UgbWVtb3J5CisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWJ4IDogYmxvY2sgdG8gemVybyAoaW4ga0IpCisgKiBSZXR1cm5zOgorICogICBOb3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworemVyb19rYjoKKwkvKiBQcmVzZXJ2ZSByZWdpc3RlcnMgKi8KKwlwdXNodwklYXgKKwlwdXNodwklY3gKKwlwdXNodwklZGkKKwlwdXNodwklZXMKKwkvKiBaZXJvIGJsb2NrICovCisJbW92dwklYngsICVheAorCXNobHcJJDYsICVheAorCW1vdncJJWF4LCAlZXMKKwltb3Z3CSQweDQwMCwgJWN4CisJeG9ydwklZGksICVkaQorCXhvcncJJWF4LCAlYXgKKwlyZXAgc3Rvc2IKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgcmV0dXJuICovCisJcG9wdwklZXMKKwlwb3B3CSVkaQorCXBvcHcJJWN4CisJcG9wdwklYXgKKwlyZXQKKwkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3Vicm91dGluZTogZnJlZSBhbmQgemVybyBiYXNlIG1lbW9yeQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICVheCA6IERlc2lyZWQgbmV3IGZyZWUgYmFzZSBtZW1vcnkgY291bnRlciAoaW4ga0IpCisgKiAgICVieCA6IEV4cGVjdGVkIGN1cnJlbnQgZnJlZSBiYXNlIG1lbW9yeSBjb3VudGVyIChpbiBrQikKKyAqICAgJWZzIDogQklPUyBkYXRhIHNlZ21lbnQgKDB4NDApCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKgorICogVGhlIGJhc2UgbWVtb3J5IGZyb20gJWJ4IGtCIHRvICVheCBrQiBpcyB1bmNvbmRpdGlvbmFsbHkgemVyb2VkLgorICogSXQgd2lsbCBiZSBmcmVlZCBpZiBhbmQgb25seSBpZiB0aGUgZXhwZWN0ZWQgY3VycmVudCBmcmVlIGJhc2UKKyAqIG1lbW9yeSBjb3VudGVyICglYngpIG1hdGNoZXMgdGhlIGFjdHVhbCBjdXJyZW50IGZyZWUgYmFzZSBtZW1vcnkKKyAqIGNvdW50ZXIgaW4gMHg0MDoweDEzOyBpZiB0aGlzIGRvZXMgbm90IG1hdGNoIHRoZW4gdGhlIG1lbW9yeSB3aWxsCisgKiBiZSBsZWFrZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworZnJlZV9iYXNlbWVtOgorCS8qIFplcm8gYmFzZSBtZW1vcnkgKi8KKwlwdXNodwklYngKKzE6CWNtcHcJJWJ4LCAlYXgKKwlqZQkyZgorCWNhbGwJemVyb19rYgorCWluY3cJJWJ4CisJam1wCTFiCisyOglwb3B3CSVieAorCS8qIEZyZWUgYmFzZSBtZW1vcnkgKi8KKwljbXB3CSVmczooMHgxMyksICVieAkJLyogVXBkYXRlIEZCTVMgb25seSBpZiAib2xkIiB2YWx1ZSAgKi8KKwlqbmUJMWYJCQkvKiBpcyBjb3JyZWN0CQkJICAgICovCisxOgltb3Z3CSVheCwgJWZzOigweDEzKQorCXJldAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN1YnJvdXRpbmU6IG1ha2UgYSBQWEUgQVBJIGNhbGwuICBXb3JrcyB3aXRoIGVpdGhlciAhUFhFIG9yIFBYRU5WKyBBUEkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgJWJ4IDogUFhFIEFQSSBjYWxsIG51bWJlcgorICogICAlZHM6cHhlX3BhcmFtZXRlcl9zdHJ1Y3R1cmUgOiBQYXJhbWV0ZXJzIGZvciBQWEUgQVBJIGNhbGwKKyAqIFJldHVybnM6CisgKiAgICVheCA6IFBYRSBzdGF0dXMgY29kZSAobm90IGV4aXQgY29kZSkKKyAqICAgQ0Ygc2V0IGlmICVheCBpcyBub24temVybworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3B4ZV9jYWxsOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycyAqLworCXB1c2h3CSVkaQorCXB1c2h3CSVlcworCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIFBYRU5WKyBBUEkuICAlYnggYWxyZWFkeSBzZXQgdXAgKi8KKwlwdXNodwklZHMKKwlwb3B3CSVlcworCW1vdncJJHB4ZV9wYXJhbWV0ZXJfc3RydWN0dXJlLCAlZGkKKwkvKiBTZXQgdXAgc3RhY2sgZm9yICFQWEUgQVBJICovCisJcHVzaHcgICAlZXMKKwlwdXNodwklZGkKKwlwdXNodwklYngKKwkvKiBNYWtlIHRoZSBBUEkgY2FsbCAqLworCWxjYWxsCSplbnRyeV9zZWdvZmYKKwkvKiBSZXNldCB0aGUgc3RhY2sgKi8KKwlhZGR3CSQ2LCAlc3AKKwltb3Z3CXB4ZV9wYXJhbWV0ZXJfc3RydWN0dXJlLCAlYXgKKwljbGMKKwl0ZXN0dwklYXgsICVheAorCWp6CTFmCisJc3RjCisxOgkvKiBDbGVhciBkaXJlY3Rpb24gZmxhZywgZm9yIHRoZSBzYWtlIG9mIHNhbml0eSAqLworCWNsZAorCS8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KKwlwb3B3CSVlcworCXBvcHcJJWRpCisJcmV0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3Vicm91dGluZTogcHJpbnQgUFhFIEFQSSBjYWxsIGVycm9yIG1lc3NhZ2UKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlYXggOiBQWEUgc3RhdHVzIGNvZGUKKyAqICAgJWJ4IDogUFhFIEFQSSBjYWxsIG51bWJlcgorICogUmV0dXJuczoKKyAqICAgTm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ByaW50X3B4ZV9lcnJvcjoKKwlwdXNodwklc2kKKwltb3Z3CSQxMGYsICVzaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCXhjaGd3CSVheCwgJWJ4CisJY2FsbAlwcmludF9oZXhfd29yZAorCW1vdncJJDIwZiwgJXNpCisJY2FsbAlwcmludF9tZXNzYWdlCisJeGNoZ3cJJWF4LCAlYngKKwljYWxsCXByaW50X2hleF93b3JkCisJbW92dwkkMzBmLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKKwlwb3B3CSVzaQorCXJldAorCS5zZWN0aW9uICIucHJlZml4LmRhdGEiLCAiYXciLCBAcHJvZ2JpdHMKKzEwOgkuYXNjaXoJIiAgICAgICAgIFVOREkgQVBJIGNhbGwgIgorMjA6CS5hc2NpegkiIGZhaWxlZDogc3RhdHVzIGNvZGUgIgorMzA6CS5hc2NpegkiXG4iCisJLnByZXZpb3VzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFhFIGRhdGEgc3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnByZWZpeC5kYXRhIgorCitweGVfZXNwOgkJLmxvbmcgMAorcHhlX3NzOgkJCS53b3JkIDAKKworcHhlX3BhcmFtZXRlcl9zdHJ1Y3R1cmU6IC5maWxsIDY0CisKK3VuZGlfY29kZV9zZWdvZmY6Cit1bmRpX2NvZGVfc2l6ZToJCS53b3JkIDAKK3VuZGlfY29kZV9zZWdtZW50Ogkud29yZCAwCisKK3VuZGlfZGF0YV9zZWdvZmY6Cit1bmRpX2RhdGFfc2l6ZToJCS53b3JkIDAKK3VuZGlfZGF0YV9zZWdtZW50Ogkud29yZCAwCisKK3B4ZV9oYWNrczoJCS53b3JkIDAKKworLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHBhcnQgb2YgYSBzdHJ1Y3QgdW5kaV9kZXZpY2UgKi8KKwordW5kaV9kZXZpY2U6CisKK3B4ZW52X3NlZ29mZjoKK3B4ZW52X29mZnNldDoJCS53b3JkIDAKK3B4ZW52X3NlZ21lbnQ6CQkud29yZCAwCisKK3BweGVfc2Vnb2ZmOgorcHB4ZV9vZmZzZXQ6CQkud29yZCAwCitwcHhlX3NlZ21lbnQ6CQkud29yZCAwCisJCitlbnRyeV9zZWdvZmY6CitlbnRyeV9vZmZzZXQ6CQkud29yZCAwCitlbnRyeV9zZWdtZW50OgkJLndvcmQgMAorCit1bmRpX2ZibXNfc3RhcnQ6CS53b3JkIDAKK3VuZGlfZmJtc19lbmQ6CQkud29yZCAwCisKK3BjaV9idXNkZXZmbjoJCS53b3JkIFVORElfTk9fUENJX0JVU0RFVkZOCitpc2FwbnBfY3NuOgkJLndvcmQgVU5ESV9OT19JU0FQTlBfQ1NOCitpc2FwbnBfcmVhZF9wb3J0Ogkud29yZCBVTkRJX05PX0lTQVBOUF9SRUFEX1BPUlQKKworcGNpX3ZlbmRvcjoJCS53b3JkIDAKK3BjaV9kZXZpY2U6CQkud29yZCAwCitmbGFnczoKKwkud29yZCAoIFVORElfRkxfSU5JVElBTElaRUQgfCBVTkRJX0ZMX1NUQVJURUQgfCBVTkRJX0ZMX0tFRVBfQUxMICkKKworCS5lcXUgdW5kaV9kZXZpY2Vfc2l6ZSwgKCAuIC0gdW5kaV9kZXZpY2UgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJ1biBnUFhFIG1haW4gY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuc2VjdGlvbiAiLnByZWZpeCIKK3J1bl9ncHhlOgorCS8qIEluc3RhbGwgZ1BYRSAqLworCWNhbGwJaW5zdGFsbAorCisJLyogU2V0IHVwIHJlYWwtbW9kZSBzdGFjayAqLworCW1vdncJJWJ4LCAlc3MKKwltb3Z3CSRfZXN0YWNrMTYsICVzcAorCisjaWZkZWYgUFhFTE9BREVSX0tFRVBfVU5ESQorCS8qIENvcHkgb3VyIHVuZGlfZGV2aWNlIHN0cnVjdHVyZSB0byB0aGUgcHJlbG9hZGVkX3VuZGkgdmFyaWFibGUgKi8KKwltb3Z3CSVieCwgJWVzCisJbW92dwkkcHJlbG9hZGVkX3VuZGksICVkaQorCW1vdncJJHVuZGlfZGV2aWNlLCAlc2kKKwltb3Z3CSR1bmRpX2RldmljZV9zaXplLCAlY3gKKwlyZXAgbW92c2IKKyNlbmRpZgorCisJLyogUmV0cmlldmUgUFhFICVzczplc3AgKi8KKwltb3Z3CXB4ZV9zcywJJWRpCisJbW92bAlweGVfZXNwLCAlZWJwCisKKwkvKiBKdW1wIHRvIC50ZXh0MTYgc2VnbWVudCB3aXRoICVkcyBwb2ludGluZyB0byAuZGF0YTE2ICovCisJbW92dwklYngsICVkcworCXB1c2h3CSVheAorCXB1c2h3CSQxZgorCWxyZXQKKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworMToKKwkvKiBVcGRhdGUgdGhlIGV4aXQgaG9vayAqLworCW1vdncJJWNzLHB4ZV9leGl0X2hvb2srMgorCXB1c2gJJWF4CisJbW92CSQyZiwlYXgKKwltb3YJJWF4LHB4ZV9leGl0X2hvb2sKKwlwb3AJJWF4CisKKwkvKiBSdW4gbWFpbiBwcm9ncmFtICovCisJcHVzaGwJJG1haW4KKwlwdXNodwklY3MKKwljYWxsCXByb3RfY2FsbAorCXBvcGwJJWVjeCAvKiBkaXNjYXJkICovCisKKwkvKiBVbmluc3RhbGwgZ1BYRSAqLworCWNhbGwJdW5pbnN0YWxsCisKKwkvKiBSZXN0b3JlIFBYRSBzdGFjayAqLworCW1vdncJJWRpLCAlc3MKKwltb3ZsCSVlYnAsICVlc3AKKworCS8qIEp1bXAgdG8gaG9vayBpZiBhcHBsaWNhYmxlICovCisJbGptcHcJKnB4ZV9leGl0X2hvb2sKKworMjoJLyogQ2hlY2sgUFhFIHN0YWNrIG1hZ2ljICovCisJcG9wbAklZWF4CisJY21wbAkkU1RBQ0tfTUFHSUMsICVlYXgKKwlqbmUJMWYKKworCS8qIFBYRSBzdGFjayBPSzogcmV0dXJuIHRvIGNhbGxlciAqLworCXBvcHcJJWRzCisJcG9wdwklZXMKKwlwb3B3CSVmcworCXBvcHcJJWdzCisJcG9wYWwKKwlwb3BmbAorCXhvcncJJWF4LCAlYXgJLyogUmV0dXJuIHN1Y2Nlc3MgKi8KKwlscmV0CisKKzE6CS8qIFBYRSBzdGFjayBjb3JydXB0IG9yIHJlbW92ZWQ6IHVzZSBJTlQgMTggKi8KKwlpbnQJJDB4MTgKKwkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvcm9tcHJlZml4LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3JvbXByZWZpeC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTU0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3JvbXByZWZpeC5TCkBAIC0wLDAgKzEsMTA3OSBAQAorLyogQXQgZW50cnksIHRoZSBwcm9jZXNzb3IgaXMgaW4gMTYgYml0IHJlYWwgbW9kZSBhbmQgdGhlIGNvZGUgaXMgYmVpbmcKKyAqIGV4ZWN1dGVkIGZyb20gYW4gYWRkcmVzcyBpdCB3YXMgbm90IGxpbmtlZCB0by4gQ29kZSBtdXN0IGJlIHBpYyBhbmQKKyAqIDMyIGJpdCBzZW5zaXRpdmUgdW50aWwgdGhpbmdzIGFyZSBmaXhlZCB1cC4KKyAqCisgKiBBbHNvIGJlIHZlcnkgY2FyZWZ1bCBhcyB0aGUgc3RhY2sgaXMgYXQgdGhlIHJlYXIgZW5kIG9mIHRoZSBpbnRlcnJ1cHQKKyAqIHRhYmxlIHNvIHVzaW5nIGEgbm90aWNlYWJsZSBhbW91bnQgb2Ygc3RhY2sgc3BhY2UgaXMgYSBuby1uby4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICkKKworI2luY2x1ZGUgPGNvbmZpZy9nZW5lcmFsLmg+CisKKyNkZWZpbmUgUE5QX1NJR05BVFVSRSAoICckJyArICggJ1AnIDw8IDggKSArICggJ24nIDw8IDE2ICkgKyAoICdQJyA8PCAyNCApICkKKyNkZWZpbmUgUE1NX1NJR05BVFVSRSAoICckJyArICggJ1AnIDw8IDggKSArICggJ00nIDw8IDE2ICkgKyAoICdNJyA8PCAyNCApICkKKyNkZWZpbmUgUENJX1NJR05BVFVSRSAoICdQJyArICggJ0MnIDw8IDggKSArICggJ0knIDw8IDE2ICkgKyAoICcgJyA8PCAyNCApICkKKyNkZWZpbmUgU1RBQ0tfTUFHSUMgKCAnTCcgKyAoICdSJyA8PCA4ICkgKyAoICdFJyA8PCAxNiApICsgKCAnVCcgPDwgMjQgKSApCisjZGVmaW5lIFBOUF9HRVRfQkJTX1ZFUlNJT04gMHg2MAorI2RlZmluZSBQTU1fQUxMT0NBVEUgMHgwMDAwCisjZGVmaW5lIFBNTV9ERUFMTE9DQVRFIDB4MDAwMgorCisvKiBST00gYmFubmVyIHRpbWVvdXQuICBCYXNlZCBvbiB0aGUgY29uZmlndXJhYmxlIEJBTk5FUl9USU1FT1VUIGluCisgKiBjb25maWcuaCwgYnV0IGNvbnZlcnRlZCB0byBhIG51bWJlciBvZiAoMThIeikgdGltZXIgdGlja3MsIGFuZAorICogZG91YmxlZCB0byBhbGxvdyBmb3IgQklPU2VzIHRoYXQgc3dpdGNoIHZpZGVvIG1vZGVzIGltbWVkaWF0ZWx5CisgKiBiZWZvcmVoYW5kLCBzbyByZW5kZXJpbmcgdGhlIG1lc3NhZ2UgYWxtb3N0IGludmlzaWJsZSB0byB0aGUgdXNlci4KKyAqLworI2RlZmluZSBST01fQkFOTkVSX1RJTUVPVVQgKCAyICogKCAxOCAqIEJBTk5FUl9USU1FT1VUICkgLyAxMCApCisKKy8qIFdlIGNhbiBsb2FkIGEgUk9NIGluIHR3byB3YXlzOiBoYXZlIHRoZSBCSU9TIGxvYWQgYWxsIG9mIGl0ICgucm9tIHByZWZpeCkKKyAqIG9yIGhhdmUgdGhlIEJJT1MgbG9hZCBhIHN0dWIgdGhhdCBsb2FkcyB0aGUgcmVzdCB1c2luZyBQQ0kgKC54cm9tIHByZWZpeCkuCisgKiBUaGUgbGF0dGVyIGlzIG5vdCBhcyB3aWRlbHkgc3VwcG9ydGVkLCBidXQgYWxsb3dzIHRoZSB1c2Ugb2YgbGFyZ2UgUk9NcworICogb24gc29tZSBzeXN0ZW1zIHdpdGggY3Jvd2RlZCBvcHRpb24gUk9NIHNwYWNlLgorICovCisKKyNpZmRlZiBMT0FEX1JPTV9GUk9NX1BDSQorI2RlZmluZSBST01fU0laRV9WQUxVRQlfcHJlZml4X2ZpbGVzel9zZWN0IC8qIEFtb3VudCB0byBsb2FkIGluIEJJT1MgKi8KKyNlbHNlCisjZGVmaW5lIFJPTV9TSVpFX1ZBTFVFCTAJCS8qIExvYWQgYW1vdW50IChiZWZvcmUgY29tcHIuIGZpeHVwKSAqLworI2VuZGlmCisKKworCS50ZXh0CisJLmNvZGUxNgorCS5hcmNoIGkzODYKKwkuc2VjdGlvbiAiLnByZWZpeCIsICJheCIsIEBwcm9nYml0cworCQorCS5vcmcJMHgwMAorcm9taGVhZGVyOgorCS53b3JkCTB4QUE1NQkJCS8qIEJJT1MgZXh0ZW5zaW9uIHNpZ25hdHVyZSAqLworcm9taGVhZGVyX3NpemU6CS5ieXRlIFJPTV9TSVpFX1ZBTFVFCS8qIFNpemUgaW4gNTEyLWJ5dGUgYmxvY2tzICovCisJam1wCWluaXQJCQkvKiBJbml0aWFsaXNhdGlvbiB2ZWN0b3IgKi8KK2NoZWNrc3VtOgorCS5ieXRlCTAsIDAKK3JlYWxfc2l6ZToKKwkud29yZAkwCisJLm9yZwkweDE2CisJLndvcmQJdW5kaWhlYWRlcgorCS5vcmcJMHgxOAorCS53b3JkCXBjaWhlYWRlcgorCS5vcmcJMHgxYQorCS53b3JkCXBucGhlYWRlcgorCS5zaXplIHJvbWhlYWRlciwgLiAtIHJvbWhlYWRlcgorCisJLnNlY3Rpb24gIi56aW5mby5maXh1cCIsICJhIiwgQHByb2diaXRzCS8qIENvbXByZXNzb3IgZml4dXBzICovCisjaWZuZGVmIExPQURfUk9NX0ZST01fUENJCisJLmFzY2lpCSJBRERCIgorCS5sb25nCXJvbWhlYWRlcl9zaXplCisJLmxvbmcJNTEyCisJLmxvbmcJMAorI2VuZGlmCisJLmFzY2lpCSJBRERCIgorCS5sb25nCXJlYWxfc2l6ZQorCS5sb25nCTUxMgorCS5sb25nCTAKKwkucHJldmlvdXMKKworcGNpaGVhZGVyOgorCS5hc2NpaQkiUENJUiIJCQkvKiBTaWduYXR1cmUgKi8KKwkud29yZAlwY2lfdmVuZG9yX2lkCQkvKiBWZW5kb3IgaWRlbnRpZmljYXRpb24gKi8gCisJLndvcmQJcGNpX2RldmljZV9pZAkJLyogRGV2aWNlIGlkZW50aWZpY2F0aW9uICovCisJLndvcmQJMHgwMDAwCQkJLyogRGV2aWNlIGxpc3QgcG9pbnRlciAqLworCS53b3JkCXBjaWhlYWRlcl9sZW4JCS8qIFBDSSBkYXRhIHN0cnVjdHVyZSBsZW5ndGggKi8KKwkuYnl0ZQkweDAzCQkJLyogUENJIGRhdGEgc3RydWN0dXJlIHJldmlzaW9uICovCisJLmJ5dGUJMHgwMiwgMHgwMCwgMHgwMAkvKiBDbGFzcyBjb2RlICovCitwY2loZWFkZXJfaW1hZ2VfbGVuZ3RoOgorCS53b3JkCVJPTV9TSVpFX1ZBTFVFCQkvKiBJbWFnZSBsZW5ndGggKi8KKwkud29yZAkweDAwMDEJCQkvKiBSZXZpc2lvbiBsZXZlbCAqLworCS5ieXRlCTB4MDAJCQkvKiBDb2RlIHR5cGUgKi8KKwkuYnl0ZQkweDgwCQkJLyogTGFzdCBpbWFnZSBpbmRpY2F0b3IgKi8KK3BjaWhlYWRlcl9ydW50aW1lX2xlbmd0aDoKKwkud29yZAlST01fU0laRV9WQUxVRQkJLyogTWF4aW11bSBydW4tdGltZSBpbWFnZSBsZW5ndGggKi8KKwkud29yZAkweDAwMDAJCQkvKiBDb25maWd1cmF0aW9uIHV0aWxpdHkgY29kZSBoZWFkZXIgKi8KKwkud29yZAkweDAwMDAJCQkvKiBETVRGIENMUCBlbnRyeSBwb2ludCAqLworCS5lcXUgcGNpaGVhZGVyX2xlbiwgLiAtIHBjaWhlYWRlcgorCS5zaXplIHBjaWhlYWRlciwgLiAtIHBjaWhlYWRlcgorCisjaWZuZGVmIExPQURfUk9NX0ZST01fUENJCisJLnNlY3Rpb24gIi56aW5mby5maXh1cCIsICJhIiwgQHByb2diaXRzCS8qIENvbXByZXNzb3IgZml4dXBzICovCisJLmFzY2lpCSJBRERXIgorCS5sb25nCXBjaWhlYWRlcl9pbWFnZV9sZW5ndGgKKwkubG9uZwk1MTIKKwkubG9uZwkwCisJLmFzY2lpCSJBRERXIgorCS5sb25nCXBjaWhlYWRlcl9ydW50aW1lX2xlbmd0aAorCS5sb25nCTUxMgorCS5sb25nCTAKKwkucHJldmlvdXMKKyNlbmRpZgorCitwbnBoZWFkZXI6CisJLmFzY2lpCSIkUG5QIgkJCS8qIFNpZ25hdHVyZSAqLworCS5ieXRlCTB4MDEJCQkvKiBTdHJ1Y3R1cmUgcmV2aXNpb24gKi8KKwkuYnl0ZQkoIHBucGhlYWRlcl9sZW4JLyAxNiApCS8qIExlbmd0aCAoaW4gMTYgYnl0ZSBpbmNyZW1lbnRzKSAqLworCS53b3JkCTB4MDAwMAkJCS8qIE9mZnNldCBvZiBuZXh0IGhlYWRlciAqLworCS5ieXRlCTB4MDAJCQkvKiBSZXNlcnZlZCAqLworCS5ieXRlCTB4MDAJCQkvKiBDaGVja3N1bSAqLworCS5sb25nCTB4MDAwMDAwMDAJCS8qIERldmljZSBpZGVudGlmaWVyICovCisJLndvcmQJbWZnc3RyCQkJLyogTWFudWZhY3R1cmVyIHN0cmluZyAqLworCS53b3JkCXByb2RzdHIJCQkvKiBQcm9kdWN0IG5hbWUgKi8KKwkuYnl0ZQkweDAyCQkJLyogRGV2aWNlIGJhc2UgdHlwZSBjb2RlICovCisJLmJ5dGUJMHgwMAkJCS8qIERldmljZSBzdWItdHlwZSBjb2RlICovCisJLmJ5dGUJMHgwMAkJCS8qIERldmljZSBpbnRlcmZhY2UgdHlwZSBjb2RlICovCisJLmJ5dGUJMHhmNAkJCS8qIERldmljZSBpbmRpY2F0b3IgKi8KKwkud29yZAkweDAwMDAJCQkvKiBCb290IGNvbm5lY3Rpb24gdmVjdG9yICovCisJLndvcmQJMHgwMDAwCQkJLyogRGlzY29ubmVjdCB2ZWN0b3IgKi8KKwkud29yZAliZXZfZW50cnkJCS8qIEJvb3QgZXhlY3V0aW9uIHZlY3RvciAqLworCS53b3JkCTB4MDAwMAkJCS8qIFJlc2VydmVkICovCisJLndvcmQJMHgwMDAwCQkJLyogU3RhdGljIHJlc291cmNlIGluZm9ybWF0aW9uIHZlY3RvciovCisJLmVxdSBwbnBoZWFkZXJfbGVuLCAuIC0gcG5waGVhZGVyCisJLnNpemUgcG5waGVhZGVyLCAuIC0gcG5waGVhZGVyCisKKy8qIE1hbnVmYWN0dXJlciBzdHJpbmcgKi8KK21mZ3N0cjoKKwkuYXNjaXoJImh0dHA6Ly9ldGhlcmJvb3Qub3JnIgorCS5zaXplIG1mZ3N0ciwgLiAtIG1mZ3N0cgorCisvKiBQcm9kdWN0IHN0cmluZworICoKKyAqIERlZmF1bHRzIHRvIFBST0RVQ1RfU0hPUlRfTkFNRS4gIElmIHRoZSBST00gaW1hZ2UgaXMgd3JpdGFibGUgYXQKKyAqIGluaXRpYWxpc2F0aW9uIHRpbWUsIGl0IHdpbGwgYmUgZmlsbGVkIGluIHRvIGluY2x1ZGUgdGhlIFBDSQorICogYnVzOmRldi5mbiBudW1iZXIgb2YgdGhlIGNhcmQgYXMgd2VsbC4KKyAqLworcHJvZHN0cjoKKwkuYXNjaWkJUFJPRFVDVF9TSE9SVF9OQU1FCitwcm9kc3RyX3NlcGFyYXRvcjoKKwkuYnl0ZQkwCisJLmFzY2lpCSIoUENJICIKK3Byb2RzdHJfcGNpX2lkOgorCS5hc2NpegkieHg6eHgueCkiCQkvKiBGaWxsZWQgaW4gYnkgaW5pdCBjb2RlICovCisJLnNpemUgcHJvZHN0ciwgLiAtIHByb2RzdHIKKworCS5nbG9ibAl1bmRpaGVhZGVyCQorCS53ZWFrCXVuZGlsb2FkZXIKK3VuZGloZWFkZXI6CisJLmFzY2lpCSJVTkRJIgkJCS8qIFNpZ25hdHVyZSAqLworCS5ieXRlCXVuZGloZWFkZXJfbGVuCQkvKiBMZW5ndGggb2Ygc3RydWN0dXJlICovCisJLmJ5dGUJMAkJCS8qIENoZWNrc3VtICovCisJLmJ5dGUJMAkJCS8qIFN0cnVjdHVyZSByZXZpc2lvbiAqLworCS5ieXRlCTAsMSwyCQkJLyogUFhFIHZlcnNpb246IDIuMS4wICovCisJLndvcmQJdW5kaWxvYWRlcgkJLyogT2Zmc2V0IHRvIGxvYWRlciByb3V0aW5lICovCisJLndvcmQJX2RhdGExNl9tZW1zegkJLyogU3RhY2sgc2VnbWVudCBzaXplICovCisJLndvcmQJX2RhdGExNl9tZW1zegkJLyogRGF0YSBzZWdtZW50IHNpemUgKi8KKwkud29yZAlfdGV4dDE2X21lbXN6CQkvKiBDb2RlIHNlZ21lbnQgc2l6ZSAqLworCS5hc2NpaQkiUENJUiIJCQkvKiBCdXMgdHlwZSAqLworCS5lcXUgdW5kaWhlYWRlcl9sZW4sIC4gLSB1bmRpaGVhZGVyCisJLnNpemUgdW5kaWhlYWRlciwgLiAtIHVuZGloZWFkZXIKKworLyogSW5pdGlhbGlzYXRpb24gKGNhbGxlZCBvbmNlIGR1cmluZyBQT1NUKQorICoKKyAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgUG5QIHN5c3RlbSB2aWEgYSBzaWduYXR1cmUKKyAqIGNoZWNrLiAgSWYgaXQgaXMgUG5QLCByZXR1cm4gdG8gdGhlIFBuUCBCSU9TIGluZGljYXRpbmcgdGhhdCB3ZSBhcmUKKyAqIGEgYm9vdC1jYXBhYmxlIGRldmljZTsgdGhlIEJJT1Mgd2lsbCBjYWxsIG91ciBib290IGV4ZWN1dGlvbiB2ZWN0b3IKKyAqIGlmIGl0IHdhbnRzIHRvIGJvb3QgdXMuICBJZiBpdCBpcyBub3QgUG5QLCBob29rIElOVCAxOS4KKyAqLworaW5pdDoKKwkvKiBQcmVzZXJ2ZSByZWdpc3RlcnMsIGNsZWFyIGRpcmVjdGlvbiBmbGFnLCBzZXQgJWRzPSVjcyAqLworCXB1c2hhdworCXB1c2h3CSVkcworCXB1c2h3CSVlcworCXB1c2h3CSVmcworCXB1c2h3CSVncworCWNsZAorCXB1c2h3CSVjcworCXBvcHcJJWRzCisKKwkvKiBTaHVmZmxlIHNvbWUgcmVnaXN0ZXJzIGFyb3VuZC4gIFdlIG5lZWQgJWRpIGF2YWlsYWJsZSBmb3IKKwkgKiB0aGUgcHJpbnRfeHh4IGZ1bmN0aW9ucywgYW5kIGluIGEgcmVnaXN0ZXIgdGhhdCdzCisJICogYWRkcmVzc2FibGUgZnJvbSAlZXMsIHNvIHNodWZmbGUgYXMgZm9sbG93czoKKwkgKgorCSAqICAgICVkaSAocG9pbnRlciB0byBQblAgc3RydWN0dXJlKSA9PiAlYngKKwkgKiAgICAlYnggKHJ1bnRpbWUgc2VnbWVudCBhZGRyZXNzLCBmb3IgUENJIDMuMCkgPT4gJWdzCisJICovCisJbW92dwklYngsICVncworCW1vdncJJWRpLCAlYngKKworCS8qIFByaW50IG1lc3NhZ2UgYXMgZWFybHkgYXMgcG9zc2libGUgKi8KKwltb3Z3CSRpbml0X21lc3NhZ2UsICVzaQorCXhvcncJJWRpLCAlZGkKKwljYWxsCXByaW50X21lc3NhZ2UKKwljYWxsCXByaW50X3BjaV9idXNkZXZmbgorCisjaWZkZWYgTE9BRF9ST01fRlJPTV9QQ0kKKwkvKiBTYXZlIFBDSSBidXM6ZGV2LmZuIGZvciBsYXRlciB1c2UgKi8KKwltb3Z3CSVheCwgcGNpX2J1c2RldmZuCisjZW5kaWYKKworCS8qIEZpbGwgaW4gcHJvZHVjdCBuYW1lIHN0cmluZywgaWYgcG9zc2libGUgKi8KKwltb3Z3CSRwcm9kc3RyX3BjaV9pZCwgJWRpCisJY2FsbAlwcmludF9wY2lfYnVzZGV2Zm4KKwltb3ZiCSQoICcgJyApLCBwcm9kc3RyX3NlcGFyYXRvcgorCisJLyogUHJpbnQgc2VnbWVudCBhZGRyZXNzICovCisJbW92YgkkKCAnICcgKSwgJWFsCisJeG9ydwklZGksICVkaQorCWNhbGwJcHJpbnRfY2hhcmFjdGVyCisJbW92dwklY3MsICVheAorCWNhbGwJcHJpbnRfaGV4X3dvcmQKKworCS8qIENoZWNrIGZvciBQQ0kgQklPUyB2ZXJzaW9uICovCisJcHVzaGwJJWVieAorCXB1c2hsCSVlZHgKKwlwdXNobAklZWRpCisJc3RjCisJbW92dwkkMHhiMTAxLCAlYXgKKwlpbnQJJDB4MWEKKwlqYwlub19wY2kzCisJY21wbAkkUENJX1NJR05BVFVSRSwgJWVkeAorCWpuZQlub19wY2kzCisJdGVzdGIJJWFoLCAlYWgKKwlqbnoJbm9fcGNpMworI2lmZGVmIExPQURfUk9NX0ZST01fUENJCisJaW5jYglwY2liaW9zX3ByZXNlbnQKKyNlbmRpZgorCW1vdncJJGluaXRfbWVzc2FnZV9wY2ksICVzaQorCXhvcncJJWRpLCAlZGkKKwljYWxsCXByaW50X21lc3NhZ2UKKwltb3ZiCSViaCwgJWFsCisJY2FsbAlwcmludF9oZXhfbmliYmxlCisJbW92YgkkKCAnLicgKSwgJWFsCisJY2FsbAlwcmludF9jaGFyYWN0ZXIKKwltb3ZiCSVibCwgJWFsCisJY2FsbAlwcmludF9oZXhfYnl0ZQorCWNtcGIJJDMsICViaAorCWpiCW5vX3BjaTMKKwkvKiBQQ0kgPj0zLjA6IGxlYXZlICVncyBhcy1pcyBpZiBzYW5lICovCisJbW92dwklZ3MsICVheAorCWNtcHcJJDB4YTAwMCwgJWF4CS8qIEluc2FuZSBpZiAlZ3MgPCAweGEwMDAgKi8KKwlqYglwY2kzX2luc2FuZQorCW1vdncJJWNzLCAlYngJLyogU2FuZSBpZiAlY3MgPT0gJWdzICovCisJY21wdwklYngsICVheAorCWplCTFmCisJbW92emJ3CXJvbWhlYWRlcl9zaXplLCAlY3ggLyogU2FuZSBpZiAlY3MrbGVuIDw9ICVncyAqLworCXNobHcJJDUsICVjeAorCWFkZHcJJWN4LCAlYngKKwljbXB3CSVieCwgJWF4CisJamFlCTFmCisJbW92dwklY3MsICVieAkvKiBTYW5lIGlmICVncytsZW4gPD0gJWNzICovCisJYWRkdwklY3gsICVheAorCWNtcHcJJWJ4LCAlYXgKKwlqYmUJMWYKK3BjaTNfaW5zYW5lOiAvKiBQQ0kgMy4wIHdpdGggaW5zYW5lICVncyB2YWx1ZTogcHJpbnQgZXJyb3IgYW5kIGlnbm9yZSAlZ3MgKi8KKwltb3ZiCSQoICchJyApLCAlYWwKKwljYWxsCXByaW50X2NoYXJhY3RlcgorCW1vdncJJWdzLCAlYXgKKwljYWxsCXByaW50X2hleF93b3JkCitub19wY2kzOgorCS8qIFBDSSA8My4wOiBzZXQgJWdzIChydW50aW1lIHNlZ21lbnQpID0gJWNzIChpbml0LXRpbWUgc2VnbWVudCkgKi8KKwlwdXNodwklY3MKKwlwb3B3CSVncworMToJcG9wbAklZWRpCisJcG9wbAklZWR4CisJcG9wbAklZWJ4CisKKwkvKiBDaGVjayBmb3IgUG5QIEJJT1MuICBBbHRob3VnaCAlZXM6ZGkgc2hvdWxkIHBvaW50IHRvIHRoZQorCSAqIFBuUCBCSU9TIHNpZ25hdHVyZSBvbiBlbnRyeSwgc29tZSBCSU9TZXMgZmFpbCB0byBkbyB0aGlzLgorCSAqLworCW1vdncJJCggMHhmMDAwIC0gMSApLCAlYngKK3BucF9zY2FuOgorCWluY3cJJWJ4CisJanoJbm9fcG5wCisJbW92dwklYngsICVlcworCWNtcGwJJFBOUF9TSUdOQVRVUkUsICVlczowCisJam5lCXBucF9zY2FuCisJeG9ydwklZHgsICVkeAorCXhvcncJJXNpLCAlc2kKKwltb3Z6YncJJWVzOjUsICVjeAorMToJZXMgbG9kc2IKKwlhZGRiCSVhbCwgJWRsCisJbG9vcAkxYgorCWpueglwbnBfc2NhbgorCS8qIElzIFBuUDogcHJpbnQgUG5QIG1lc3NhZ2UgKi8KKwltb3Z3CSRpbml0X21lc3NhZ2VfcG5wLCAlc2kKKwl4b3J3CSVkaSwgJWRpCisJY2FsbAlwcmludF9tZXNzYWdlCisJLyogQ2hlY2sgZm9yIEJCUyAqLworCXB1c2h3CSVlczoweDFiCS8qIFJlYWwtbW9kZSBkYXRhIHNlZ21lbnQgKi8KKwlwdXNodwklZHMJCS8qICYoYmJzX3ZlcnNpb24pICovCisJcHVzaHcJJGJic192ZXJzaW9uCisJcHVzaHcJJFBOUF9HRVRfQkJTX1ZFUlNJT04KKwlsY2FsbAkqJWVzOjB4ZAorCWFkZHcJJDgsICVzcAorCXRlc3R3CSVheCwgJWF4CisJamUJZ290X2Jicworbm9fcG5wOgkvKiBOb3QgUG5QLWNvbXBsaWFudCAtIHRoZXJlZm9yZSBjYW5ub3QgYmUgQkJTLWNvbXBsaWFudCAqLworbm9fYmJzOgkvKiBOb3QgQkJTLWNvbXBsaWFudCAtIG11c3QgaG9vayBJTlQgMTkgKi8KKwltb3Z3CSRpbml0X21lc3NhZ2VfaW50MTksICVzaQorCXhvcncJJWRpLCAlZGkKKwljYWxsCXByaW50X21lc3NhZ2UKKwl4b3J3CSVheCwgJWF4CisJbW92dwklYXgsICVlcworCXB1c2hsCSVlczooIDB4MTkgKiA0ICkKKwlwb3BsCW9yaWdfaW50MTkKKwlwdXNodwklZ3MgLyogJWdzIGNvbnRhaW5zIHJ1bnRpbWUgJWNzICovCisJcHVzaHcJJGludDE5X2VudHJ5CisJcG9wbAklZXM6KCAweDE5ICogNCApCisJam1wCWJic19kb25lCitnb3RfYmJzOiAvKiBCQlMgY29tcGxpYW50IC0gbm8gbmVlZCB0byBob29rIElOVCAxOSAqLworCW1vdncJJGluaXRfbWVzc2FnZV9iYnMsICVzaQorCXhvcncJJWRpLCAlZGkKKwljYWxsCXByaW50X21lc3NhZ2UKK2Jic19kb25lOgorCisJLyogQ2hlY2sgZm9yIFBNTSAqLworCW1vdncJJCggMHhlMDAwIC0gMSApLCAlYngKK3BtbV9zY2FuOgorCWluY3cJJWJ4CisJanoJbm9fcG1tCisJbW92dwklYngsICVlcworCWNtcGwJJFBNTV9TSUdOQVRVUkUsICVlczowCisJam5lCXBtbV9zY2FuCisJeG9ydwklZHgsICVkeAorCXhvcncJJXNpLCAlc2kKKwltb3Z6YncJJWVzOjUsICVjeAorMToJZXMgbG9kc2IKKwlhZGRiCSVhbCwgJWRsCisJbG9vcAkxYgorCWpueglwbW1fc2NhbgorCS8qIFBNTSBmb3VuZDogcHJpbnQgUE1NIG1lc3NhZ2UgKi8KKwltb3Z3CSRpbml0X21lc3NhZ2VfcG1tLCAlc2kKKwl4b3J3CSVkaSwgJWRpCisJY2FsbAlwcmludF9tZXNzYWdlCisJLyogV2UgaGF2ZSBQTU0gYW5kIHNvIGEgMWtCIHN0YWNrOiBwcmVzZXJ2ZSB1cHBlciByZWdpc3RlciBoYWx2ZXMgKi8KKwlwdXNoYWwKKwkvKiBDYWxjdWxhdGUgcmVxdWlyZWQgYWxsb2NhdGlvbiBzaXplIGluICVlc2kgKi8KKwltb3Z6d2wJcmVhbF9zaXplLCAlZWF4CisJc2hsbAkkOSwgJWVheAorCWFkZGwJJF90ZXh0ZGF0YV9tZW1zeiwgJWVheAorCW9ydwkkMHhmZmZmLCAlYXgJLyogRW5zdXJlIGFsbG9jYXRpb24gc2l6ZSBpcyBhdCBsZWFzdCA2NGtCICovCisJYnNybAklZWF4LCAlZWN4CisJc3VidwkkMTUsICVjeAkvKiBSb3VuZCB1cCBhbmQgY29udmVydCB0byA2NGtCIGNvdW50ICovCisJbW92dwkkMSwgJXNpCisJc2hsdwklY2wsICVzaQorcG1tX2xvb3A6CisJLyogVHJ5IHRvIGFsbG9jYXRlIGJsb2NrIHZpYSBQTU0gKi8KKwlwdXNodwkkMHgwMDA2CQkvKiBBbGlnbmVkLCBleHRlbmRlZCBtZW1vcnkgKi8KKwlwdXNobAkkMHhmZmZmZmZmZgkvKiBObyBoYW5kbGUgKi8KKwltb3Z6d2wJJXNpLCAlZWF4CisJc2hsbAkkMTIsICVlYXgKKwlwdXNobAklZWF4CQkvKiBBbGxvY2F0aW9uIHNpemUgaW4gcGFyYWdyYXBocyAqLworCXB1c2h3CSRQTU1fQUxMT0NBVEUKKwlsY2FsbAkqJWVzOjcKKwlhZGR3CSQxMiwgJXNwCisJLyogQWJvcnQgaWYgYWxsb2NhdGlvbiBmYWlscyAqLworCXRlc3R3CSVkeCwgJWR4CS8qICVheD09MCBldmVuIG9uIHN1Y2Nlc3MsIHNpbmNlIGFsaWduPj02NGtCICovCisJanoJcG1tX2ZhaWwKKwkvKiBJZiBibG9jayBoYXMgQTIwPT0xLCBmcmVlIGJsb2NrIGFuZCB0cnkgYWdhaW4gd2l0aCB0d2ljZQorCSAqIHRoZSBhbGxvY2F0aW9uIHNpemUgKGFuZCBoZW5jZSBhbGlnbm1lbnQpLgorCSAqLworCXRlc3R3CSQweDAwMTAsICVkeAorCWp6CWdvdF9wbW0KKwlwdXNodwklZHgKKwlwdXNodwkkMAorCXB1c2h3CSRQTU1fREVBTExPQ0FURQorCWxjYWxsCSolZXM6NworCWFkZHcJJDYsICVzcAorCWFkZHcJJXNpLCAlc2kKKwlqbXAJcG1tX2xvb3AKK2dvdF9wbW06IC8qIFBNTSBhbGxvY2F0aW9uIHN1Y2NlZWRlZCAqLworCW1vdncJJWR4LCAoIGltYWdlX3NvdXJjZSArIDIgKQorCW1vdncJJWR4LCAlYXgKKwl4b3J3CSVkaSwgJWRpCisJY2FsbAlwcmludF9oZXhfd29yZAorCW1vdmIJJCggJ0AnICksICVhbAorCWNhbGwJcHJpbnRfY2hhcmFjdGVyCisJbW92dwklc2ksICVheAorCWNhbGwJcHJpbnRfaGV4X2J5dGUKK3BtbV9jb3B5OgorCS8qIENvcHkgUk9NIHRvIFBNTSBibG9jayAqLworCXhvcncJJWF4LCAlYXgKKwltb3Z3CSVheCwgJWVzCisJbW92bAlpbWFnZV9zb3VyY2UsICVlZGkKKwl4b3JsCSVlc2ksICVlc2kKKwltb3Z6YmwJcm9taGVhZGVyX3NpemUsICVlY3gKKwlzaGxsCSQ5LCAlZWN4CisJYWRkcjMyIHJlcCBtb3ZzYgkvKiBQTU0gcHJlc2VuY2UgaW1wbGllcyBmbGF0IHJlYWwgbW9kZSAqLworCW1vdmwJJWVkaSwgZGVjb21wcmVzc190bworCS8qIFNocmluayBST00gKi8KKwltb3ZiCSRfcHJlZml4X21lbXN6X3NlY3QsIHJvbWhlYWRlcl9zaXplCisjaWYgZGVmaW5lZChTSFJJTktfV0lUSE9VVF9QTU0pIHx8IGRlZmluZWQoTE9BRF9ST01fRlJPTV9QQ0kpCisJam1wCXBtbV9kb25lCitwbW1fZmFpbDoKKwkvKiBQcmludCBtYXJrZXIgYW5kIGNvcHkgb3Vyc2VsdmVzIHRvIGhpZ2ggbWVtb3J5ICovCisJbW92bAkkSElHSE1FTV9MT0FEUE9JTlQsIGltYWdlX3NvdXJjZQorCXhvcncJJWRpLCAlZGkKKwltb3ZiCSQoICchJyApLCAlYWwKKwljYWxsCXByaW50X2NoYXJhY3RlcgorCWptcAlwbW1fY29weQorcG1tX2RvbmU6CisjZWxzZQorcG1tX2ZhaWw6CisjZW5kaWYKKwkvKiBSZXN0b3JlIHVwcGVyIHJlZ2lzdGVyIGhhbHZlcyAqLworCXBvcGFsCisjaWYgZGVmaW5lZChMT0FEX1JPTV9GUk9NX1BDSSkKKwljYWxsCWxvYWRfZnJvbV9wY2kKKwlqYwlsb2FkX2VycgorCWptcAlsb2FkX29rCitub19wbW06CisJLyogQ2Fubm90IGNvbnRpbnVlIHdpdGhvdXQgUE1NIC0gcHJpbnQgZXJyb3IgbWVzc2FnZSAqLworCXhvcncJJWRpLCAlZGkKKwltb3Z3CSRpbml0X21lc3NhZ2Vfbm9fcG1tLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKK2xvYWRfZXJyOgorCS8qIFdhaXQgZm9yIGZpdmUgc2Vjb25kcyB0byBsZXQgdXNlciBzZWUgbWVzc2FnZSAqLworCW1vdncJJDkwLCAlY3gKKzE6CWNhbGwJd2FpdF9mb3JfdGljaworCWxvb3AJMWIKKwkvKiBNYXJrIGVudmlyb25tZW50IGFzIGludmFsaWQgYW5kIHJldHVybiAqLworCW1vdmwJJDAsIGRlY29tcHJlc3NfdG8KKwlqbXAJb3V0CisKK2xvYWRfb2s6CisjZWxzZQorbm9fcG1tOgorI2VuZGlmCisJLyogVXBkYXRlIGNoZWNrc3VtICovCisJeG9ydwklYngsICVieAorCXhvcncJJXNpLCAlc2kKKwltb3Z6YncJcm9taGVhZGVyX3NpemUsICVjeAorCXNobHcJJDksICVjeAorMToJbG9kc2IKKwlhZGRiCSVhbCwgJWJsCisJbG9vcAkxYgorCXN1YmIJJWJsLCBjaGVja3N1bQorCisJLyogQ29weSBzZWxmIHRvIG9wdGlvbiBST00gc3BhY2UuICBSZXF1aXJlZCBmb3IgUENJMy4wLCB3aGljaAorCSAqIGxvYWRzIHVzIHRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uIGluIGxvdyBtZW1vcnkuICBXaWxsIGJlIGEKKwkgKiBuby1vcCBmb3IgbG93ZXIgUENJIHZlcnNpb25zLgorCSAqLworCW1vdmIJJCggJyAnICksICVhbAorCXhvcncJJWRpLCAlZGkKKwljYWxsCXByaW50X2NoYXJhY3RlcgorCW1vdncJJWdzLCAlYXgKKwljYWxsCXByaW50X2hleF93b3JkCisJbW92emJ3CXJvbWhlYWRlcl9zaXplLCAlY3gKKwlzaGx3CSQ5LCAlY3gKKwltb3Z3CSVheCwgJWVzCisJeG9ydwklc2ksICVzaQorCXhvcncJJWRpLCAlZGkKKwljcyByZXAJbW92c2IKKworCS8qIFByb21wdCBmb3IgUE9TVC10aW1lIHNoZWxsICovCisJbW92dwkkaW5pdF9tZXNzYWdlX3Byb21wdCwgJXNpCisJeG9ydwklZGksICVkaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCW1vdncJJHByb2RzdHIsICVzaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCW1vdncJJGluaXRfbWVzc2FnZV9kb3RzLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKKwkvKiBXYWl0IGZvciBDdHJsLUIgKi8KKwltb3Z3CSQweGZmMDIsICVieAorCWNhbGwJd2FpdF9mb3Jfa2V5CisJLyogQ2xlYXIgcHJvbXB0ICovCisJcHVzaGYKKwl4b3J3CSVkaSwgJWRpCisJY2FsbAlwcmludF9raWxsX2xpbmUKKwltb3Z3CSRpbml0X21lc3NhZ2VfZG9uZSwgJXNpCisJY2FsbAlwcmludF9tZXNzYWdlCisJcG9wZgorCWpueglvdXQKKwkvKiBDdHJsLUIgd2FzIHByZXNzZWQ6IGludm9rZSBnUFhFLiAgVGhlIGtleXByZXNzIHdpbGwgYmUKKwkgKiBwaWNrZWQgdXAgYnkgdGhlIGluaXRpYWwgc2hlbGwgcHJvbXB0LCBhbmQgd2Ugd2lsbCBkcm9wCisJICogaW50byBhIHNoZWxsLgorCSAqLworCXB1c2h3CSVjcworCWNhbGwJZXhlYworb3V0OgorCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJcG9wdwklZ3MKKwlwb3B3CSVmcworCXBvcHcJJWVzCisJcG9wdwklZHMKKwlwb3BhdworCisJLyogSW5kaWNhdGUgYm9vdCBjYXBhYmlsaXR5IHRvIFBuUCBCSU9TLCBpZiBwcmVzZW50ICovCisJbW92dwkkMHgyMCwgJWF4CisJbHJldAorCS5zaXplIGluaXQsIC4gLSBpbml0CisKKy8qCisgKiBOb3RlIHRvIGhhcmR3YXJlIHZlbmRvcnM6CisgKgorICogSWYgeW91IHdpc2ggdG8gYnJhbmQgdGhpcyBib290IFJPTSwgcGxlYXNlIGRvIHNvIGJ5IGRlZmluaW5nIHRoZQorICogc3RyaW5ncyBQUk9EVUNUX05BTUUgYW5kIFBST0RVQ1RfU0hPUlRfTkFNRSBpbiBjb25maWcvZ2VuZXJhbC5oLgorICoKKyAqIFdoaWxlIG5vdGhpbmcgaW4gdGhlIEdQTCBwcmV2ZW50cyB5b3UgZnJvbSByZW1vdmluZyBhbGwgcmVmZXJlbmNlcworICogdG8gZ1BYRSBvciBodHRwOi8vZXRoZXJib290Lm9yZywgd2UgcHJlZmVyIHlvdSBub3QgdG8gZG8gc28uCisgKgorICogSWYgeW91IGhhdmUgYW4gT0VNLW1hbmRhdGVkIGJyYW5kaW5nIHJlcXVpcmVtZW50IHRoYXQgY2Fubm90IGJlCisgKiBzYXRpc2ZpZWQgc2ltcGx5IGJ5IGRlZmluaW5nIFBST0RVQ1RfTkFNRSBhbmQgUFJPRFVDVF9TSE9SVF9OQU1FLAorICogcGxlYXNlIGNvbnRhY3QgdXMuCisgKgorICogWyBJbmNsdWRpbmcgYW4gQVNDSUkgTlVMIGluIFBST0RVQ1RfTkFNRSBpcyBjb25zaWRlcmVkIHRvIGJlCisgKiAgIGJ5cGFzc2luZyB0aGUgc3Bpcml0IG9mIHRoaXMgcmVxdWVzdCEgXQorICovCitpbml0X21lc3NhZ2U6CisJLmFzY2lpCSJcbiIKKwkuYXNjaWkJUFJPRFVDVF9OQU1FCisJLmFzY2lpCSJcbiIKKwkuYXNjaXoJImdQWEUgKGh0dHA6Ly9ldGhlcmJvb3Qub3JnKSAtICIKKwkuc2l6ZQlpbml0X21lc3NhZ2UsIC4gLSBpbml0X21lc3NhZ2UKK2luaXRfbWVzc2FnZV9wY2k6CisJLmFzY2l6CSIgUENJIgorCS5zaXplCWluaXRfbWVzc2FnZV9wY2ksIC4gLSBpbml0X21lc3NhZ2VfcGNpCitpbml0X21lc3NhZ2VfcG5wOgorCS5hc2NpegkiIFBuUCIKKwkuc2l6ZQlpbml0X21lc3NhZ2VfcG5wLCAuIC0gaW5pdF9tZXNzYWdlX3BucAoraW5pdF9tZXNzYWdlX2JiczoKKwkuYXNjaXoJIiBCQlMiCisJLnNpemUJaW5pdF9tZXNzYWdlX2JicywgLiAtIGluaXRfbWVzc2FnZV9iYnMKK2luaXRfbWVzc2FnZV9wbW06CisJLmFzY2l6CSIgUE1NIgorCS5zaXplCWluaXRfbWVzc2FnZV9wbW0sIC4gLSBpbml0X21lc3NhZ2VfcG1tCisjaWZkZWYgTE9BRF9ST01fRlJPTV9QQ0kKK2luaXRfbWVzc2FnZV9ub19wbW06CisJLmFzY2l6CSJcblBNTSByZXF1aXJlZCBidXQgbm90IHByZXNlbnQhXG4iCisJLnNpemUJaW5pdF9tZXNzYWdlX25vX3BtbSwgLiAtIGluaXRfbWVzc2FnZV9ub19wbW0KKyNlbmRpZgoraW5pdF9tZXNzYWdlX2ludDE5OgorCS5hc2NpegkiIElOVDE5IgorCS5zaXplCWluaXRfbWVzc2FnZV9pbnQxOSwgLiAtIGluaXRfbWVzc2FnZV9pbnQxOQoraW5pdF9tZXNzYWdlX3Byb21wdDoKKwkuYXNjaXoJIlxuUHJlc3MgQ3RybC1CIHRvIGNvbmZpZ3VyZSAiCisJLnNpemUJaW5pdF9tZXNzYWdlX3Byb21wdCwgLiAtIGluaXRfbWVzc2FnZV9wcm9tcHQKK2luaXRfbWVzc2FnZV9kb3RzOgorCS5hc2NpegkiLi4uIgorCS5zaXplCWluaXRfbWVzc2FnZV9kb3RzLCAuIC0gaW5pdF9tZXNzYWdlX2RvdHMKK2luaXRfbWVzc2FnZV9kb25lOgorCS5hc2NpegkiXG5cbiIKKwkuc2l6ZQlpbml0X21lc3NhZ2VfZG9uZSwgLiAtIGluaXRfbWVzc2FnZV9kb25lCisKKy8qIFJPTSBpbWFnZSBsb2NhdGlvbgorICoKKyAqIE1heSBiZSBlaXRoZXIgd2l0aGluIG9wdGlvbiBST00gc3BhY2UsIG9yIHdpdGhpbiBQTU0tYWxsb2NhdGVkIGJsb2NrLgorICovCisJLmdsb2JsCWltYWdlX3NvdXJjZQoraW1hZ2Vfc291cmNlOgorCS5sb25nCTAKKwkuc2l6ZQlpbWFnZV9zb3VyY2UsIC4gLSBpbWFnZV9zb3VyY2UKKworLyogVGVtcG9yYXJ5IGRlY29tcHJlc3Npb24gYXJlYQorICoKKyAqIE1heSBiZSBlaXRoZXIgYXQgSElHSE1FTV9MT0FEUE9JTlQsIG9yIHdpdGhpbiBQTU0tYWxsb2NhdGVkIGJsb2NrLgorICogSWYgYSBQQ0kgUk9NIGxvYWQgZmFpbHMsIHRoaXMgd2lsbCBiZSBzZXQgdG8gemVyby4KKyAqLworCS5nbG9ibAlkZWNvbXByZXNzX3RvCitkZWNvbXByZXNzX3RvOgorCS5sb25nCUhJR0hNRU1fTE9BRFBPSU5UCisJLnNpemUJZGVjb21wcmVzc190bywgLiAtIGRlY29tcHJlc3NfdG8KKworI2lmZGVmIExPQURfUk9NX0ZST01fUENJCisKKy8qIFNldCBpZiB0aGUgUENJIEJJT1MgaXMgcHJlc2VudCwgZXZlbiA8My4wICovCitwY2liaW9zX3ByZXNlbnQ6CisJLmJ5dGUJMAorCS5ieXRlCTAJCS8qIGZvciBhbGlnbm1lbnQgKi8KKwkuc2l6ZQlwY2liaW9zX3ByZXNlbnQsIC4gLSBwY2liaW9zX3ByZXNlbnQKKworLyogUENJIGJ1czpkZXZpY2UuZnVuY3Rpb24gd29yZAorICoKKyAqIEZpbGxlZCBpbiBieSBpbml0IGluIHRoZSAueHJvbSBjYXNlLCBzbyB0aGUgcmVtYWluZGVyIG9mIHRoZSBST00KKyAqIGNhbiBiZSBsb2NhdGVkLgorICovCitwY2lfYnVzZGV2Zm46CisJLndvcmQJMAorCS5zaXplCXBjaV9idXNkZXZmbiwgLiAtIHBjaV9idXNkZXZmbgorCisjZW5kaWYKKworLyogQkJTIHZlcnNpb24KKyAqCisgKiBGaWxsZWQgaW4gYnkgQkJTIEJJT1MuICBXZSBpZ25vcmUgdGhlIHZhbHVlLgorICovCitiYnNfdmVyc2lvbjoKKwkud29yZAkwCisJLnNpemUJYmJzX3ZlcnNpb24sIC4gLSBiYnNfdmVyc2lvbgorCisvKiBCb290IEV4ZWN1dGlvbiBWZWN0b3IgZW50cnkgcG9pbnQKKyAqCisgKiBDYWxsZWQgYnkgdGhlIFBuUCBCSU9TIHdoZW4gaXQgd2FudHMgdG8gYm9vdCB1cy4KKyAqLworYmV2X2VudHJ5OgorCXB1c2h3CSVjcworCWNhbGwJZXhlYworCWxyZXQKKwkuc2l6ZQliZXZfZW50cnksIC4gLSBiZXZfZW50cnkKKworCisjaWZkZWYgTE9BRF9ST01fRlJPTV9QQ0kKKworI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MJCTB4MzAJLyogQml0cyAzMToxMSBhZGRyZXNzLCAxMDoxIHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9ST01fQUREUkVTU19FTkFCTEUJIDB4MDAwMDAwMDEKKyNkZWZpbmUgUENJX1JPTV9BRERSRVNTX01BU0sJIDB4ZmZmZmY4MDAKKworI2RlZmluZSBQQ0lCSU9TX1JFQURfV09SRAkweGIxMDkKKyNkZWZpbmUgUENJQklPU19SRUFEX0RXT1JECTB4YjEwYQorI2RlZmluZSBQQ0lCSU9TX1dSSVRFX1dPUkQJMHhiMTBjCisjZGVmaW5lIFBDSUJJT1NfV1JJVEVfRFdPUkQJMHhiMTBkCisKKy8qIERldGVybWluZSBzaXplIG9mIFBDSSBCQVIKKyAqCisgKiAgJWJ4IDogUENJIGJ1czpkZXYuZm4gdG8gcHJvYmUKKyAqICAlZGkgOiBBZGRyZXNzIG9mIEJBUiB0byBmaW5kIHNpemUgb2YKKyAqICVlZHggOiBNYXNrIG9mIGFkZHJlc3MgYml0cyB3aXRoaW4gQkFSCisgKgorICogJWVjeCA6IFNpemUgZm9yIGEgbWVtb3J5IHJlc291cmNlLAorICoJICAxIGZvciBhbiBJL08gcmVzb3VyY2UgKGJpdCAwIHNldCkuCisgKiAgIENGIDogU2V0IG9uIGVycm9yIG9yIG5vbmV4aXN0ZW50IGRldmljZSAoYWxsLW9uZXMgcmVhZCkKKyAqCisgKiBBbGwgb3RoZXIgcmVnaXN0ZXJzIHNhdmVkLgorICovCitwY2lfYmFyX3NpemU6CisJLyogU2F2ZSByZWdpc3RlcnMgKi8KKwlwdXNodwklYXgKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkeAorCisJLyogUmVhZCBjdXJyZW50IEJBUiB2YWx1ZSAqLworCW1vdncJJFBDSUJJT1NfUkVBRF9EV09SRCwgJWF4CisJaW50CSQweDFhCisKKwkvKiBDaGVjayBmb3IgZGV2aWNlIGV4aXN0ZW5jZSBhbmQgc2F2ZSBpdCAqLworCXRlc3RiCSQxLCAlY2wJCS8qIEkvTyBiaXQ/ICovCisJanoJMWYKKwlhbmRsCSQxLCAlZWN4CS8qIElmIHNvLCBleGl0IHdpdGggJWVjeCA9IDEgKi8KKwlqbXAJOTlmCisxOglub3RsCSVlY3gKKwl0ZXN0bAklZWN4LCAlZWN4CS8qIFNldCBaRiBpZmYgJWVjeCB3YXMgYWxsLW9uZXMgKi8KKwlub3RsCSVlY3gKKwlqbnoJMWYKKwlzdGMJCQkvKiBBbGwgb25lcyAtIGV4aXQgd2l0aCBDRiBzZXQgKi8KKwlqbXAJOTlmCisxOgltb3ZsCSVlY3gsICVlc2kJLyogU2F2ZSBpbiAlZXNpICovCisKKwkvKiBXcml0ZSBhbGwgb25lcyB0byBCQVIgKi8KKwltb3ZsCSVlZHgsICVlY3gKKwltb3Z3CSRQQ0lCSU9TX1dSSVRFX0RXT1JELCAlYXgKKwlpbnQJJDB4MWEKKworCS8qIFJlYWQgYmFjayBCQVIgKi8KKwltb3Z3CSRQQ0lCSU9TX1JFQURfRFdPUkQsICVheAorCWludAkkMHgxYQorCisJLyogRmluZCBkZWNvZGUgc2l6ZSBmcm9tIGxlYXN0IHNldCBiaXQgaW4gbWFzayBCQVIgKi8KKwlic2ZsCSVlY3gsICVlY3gJLyogRmluZCBsZWFzdCBzZXQgYml0LCBsb2cyKGRlY29kZSBzaXplKSAqLworCWp6CTFmCQkvKiBNYXNrIEJBUiBzaG91bGQgbm90IGJlIHplcm8gKi8KKwl4b3JsCSVlZHgsICVlZHgKKwlpbmNsCSVlZHgKKwlzaGxsCSVjbCwgJWVkeAkvKiAlZWR4ID0gZGVjb2RlIHNpemUgKi8KKwlqbXAJMmYKKzE6CXhvcmwJJWVkeCwgJWVkeAkvKiBSZXR1cm4gemVybyBzaXplIGZvciBtYXNrIEJBUiB6ZXJvICovCisKKwkvKiBSZXN0b3JlIG9sZCBCQVIgdmFsdWUgKi8KKzI6CW1vdmwJJWVzaSwgJWVjeAorCW1vdncJJFBDSUJJT1NfV1JJVEVfRFdPUkQsICVheAorCWludAkkMHgxYQorCisJbW92bAklZWR4LCAlZWN4CS8qIFJldHVybiBzaXplIGluICVlY3ggKi8KKworCS8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KKzk5Oglwb3BsCSVlZHgKKwlwb3BsCSVlc2kKKwlwb3B3CSVheAorCXJldAorCisJLnNpemUJcGNpX2Jhcl9zaXplLCAuIC0gcGNpX2Jhcl9zaXplCisKKy8qIFBDSSBST00gbG9hZGVyCisgKgorICogQ2FsbGVkIGZyb20gaW5pdCBpbiB0aGUgLnhyb20gY2FzZSB0byBsb2FkIHRoZSBub24tcHJlZml4IGNvZGUKKyAqIHVzaW5nIHRoZSBQQ0kgUk9NIEJBUi4KKyAqCisgKiBSZXR1cm5zIHdpdGggY2FycnkgZmxhZyBzZXQgb24gZXJyb3IuIEFsbCByZWdpc3RlcnMgc2F2ZWQuCisgKi8KK2xvYWRfZnJvbV9wY2k6CisJLyoKKwkgKiBVc2UgUENJIEJJT1MgYWNjZXNzIHRvIGNvbmZpZyBzcGFjZS4gVGhlIGNhbGxzIHRha2UKKwkgKgorCSAqICAgJWFoIDogMHhiMQkJJWFsIDogZnVuY3Rpb24KKwkgKiAgICVieCA6IGJ1cy9kZXYvZm4KKwkgKiAgICVkaSA6IGNvbmZpZyBzcGFjZSBhZGRyZXNzCisJICogICVlY3ggOiB2YWx1ZSB0byB3cml0ZSAoZm9yIHdyaXRlcykKKwkgKgorCSAqICAlZWN4IDogdmFsdWUgcmVhZCAoZm9yIHJlYWRzKQorCSAqICAgJWFoIDogcmV0dXJuIGNvZGUKKwkgKiAgICBDRiA6IGVycm9yIGluZGljYXRpb24KKwkgKgorCSAqIEFsbCByZWdpc3RlcnMgbm90IHVzZWQgZm9yIHJldHVybiBhcmUgcHJlc2VydmVkLgorCSAqLworCisJLyogU2F2ZSByZWdpc3RlcnMgYW5kIHNldCB1cCAlZXMgZm9yIGJpZyByZWFsIG1vZGUgKi8KKwlwdXNoYWwKKwlwdXNodwklZXMKKwl4b3J3CSVheCwgJWF4CisJbW92dwklYXgsICVlcworCisJLyogQ2hlY2sgUENJIEJJT1MgcHJlc2VuY2UgKi8KKwljbXBiCSQwLCBwY2liaW9zX3ByZXNlbnQKKwlqegllcnJfcGNpYmlvcworCisJLyogTG9hZCBleGlzdGluZyBQQ0kgUk9NIEJBUiAqLworCW1vdncJJFBDSUJJT1NfUkVBRF9EV09SRCwgJWF4CisJbW92dwlwY2lfYnVzZGV2Zm4sICVieAorCW1vdncJJFBDSV9ST01fQUREUkVTUywgJWRpCisJaW50CSQweDFhCisKKwkvKiBNYXliZSBpdCdzIGFscmVhZHkgZW5hYmxlZD8gKi8KKwl0ZXN0YgkkUENJX1JPTV9BRERSRVNTX0VOQUJMRSwgJWNsCisJanoJMWYKKwltb3ZiCSQxLCAlZGwJCS8qIEZsYWcgaW5kaWNhdGluZyBubyBkZWluaXQgcmVxdWlyZWQgKi8KKwltb3ZsCSVlY3gsICVlYnAKKwlqbXAJY2hlY2tfcm9tCisKKwkvKiBEZXRlcm1pbmUgUENJIEJBUiBkZWNvZGUgc2l6ZSAqLworMToJbW92bAkkUENJX1JPTV9BRERSRVNTX01BU0ssICVlZHgKKwljYWxsCXBjaV9iYXJfc2l6ZQkvKiBSZXR1cm5zIGRlY29kZSBzaXplIGluICVlY3ggKi8KKwlqYwllcnJfc2l6ZV9pbnNhbmUJLyogQ0YgPT4gbm8gUk9NIEJBUiwgJWVjeCA9PSBmZmZmZmZmZiAqLworCisJLyogQ2hlY2sgc2FuaXR5IG9mIGRlY29kZSBzaXplICovCisJeG9ybAklZWF4LCAlZWF4CisJbW92dwlyZWFsX3NpemUsICVheAorCXNobGwJJDksICVlYXgJLyogJWVheCA9IFJPTSBzaXplICovCisJY21wbAklZWN4LCAlZWF4CisJamEJZXJyX3NpemVfaW5zYW5lCS8qIEluc2FuZSBpZiBkZWNvZGUgc2l6ZSA8IFJPTSBzaXplICovCisJY21wbAkkMHgxMDAwMDAsICVlY3gKKwlqYWUJZXJyX3NpemVfaW5zYW5lCS8qIEluc2FuZSBpZiBkZWNvZGUgc2l6ZSA+PSAxTUIgKi8KKworCS8qIEZpbmQgYSBwbGFjZSB0byBtYXAgdGhlIEJBUgorCSAqIEluIHRoZW9yeSB3ZSBzaG91bGQgZXhhbWluZSBlODIwIGFuZCBhbGwgUENJIEJBUnMgdG8gZmluZCBhCisJICogZnJlZSByZWdpb24uIEhvd2V2ZXIsIHdlIHJ1biBhdCBQT1NUIHdoZW4gZTgyMCBtYXkgbm90IGJlCisJICogYXZhaWxhYmxlLCBhbmQgbWVtb3J5IHJlYWRzIG9mIGFuIHVubWFwcGVkIGxvY2F0aW9uIGFyZQorCSAqIGRlIGZhY3RvIHN0YW5kYXJkaXplZCB0byByZXR1cm4gYWxsLW9uZXMuIFRodXMsIHdlIGNhbiBnZXQKKwkgKiBhd2F5IHdpdGggc2VhcmNoaW5nIGhpZ2ggbWVtb3J5ICgweGYwMDAwMDAwIGFuZCB1cCkgb24KKwkgKiBtdWx0aXBsZXMgb2YgdGhlIFJPTSBCQVIgZGVjb2RlIHNpemUgZm9yIGEgc3VmZmljaWVudGx5CisJICogbGFyZ2UgYWxsLW9uZXMgcmVnaW9uLgorCSAqLworCW1vdmwJJWVjeCwgJWVkeAkvKiBTYXZlIFJPTSBCQVIgc2l6ZSBpbiAlZWR4ICovCisJbW92bAkkMHhmMDAwMDAwMCwgJWVicAorCXhvcmwJJWVheCwgJWVheAorCW5vdGwJJWVheAkJLyogJWVheCA9IGFsbCBvbmVzICovCitiYXJfc2VhcmNoOgorCW1vdmwJJWVicCwgJWVkaQorCW1vdmwJJWVkeCwgJWVjeAorCXNocmwJJDIsICVlY3gKKwlhZGRyMzIgcmVwZSBzY2FzbAkvKiBTY2FuICVlczplZGkgZm9yIGFueXRoaW5nIG5vdCBhbGwtb25lcyAqLworCWp6CWJhcl9mb3VuZAorCWFkZGwJJWVkeCwgJWVicAorCXRlc3RsCSQweDgwMDAwMDAwLCAlZWJwCisJanoJZXJyX25vX2JhcgorCWptcAliYXJfc2VhcmNoCisKK2Jhcl9mb3VuZDoKKwltb3ZsCSVlZGksICVlYnAKKwkvKiBTYXZlIGN1cnJlbnQgQkFSIHZhbHVlIG9uIHN0YWNrIHRvIHJlc3RvcmUgbGF0ZXIgKi8KKwltb3Z3CSRQQ0lCSU9TX1JFQURfRFdPUkQsICVheAorCW1vdncJJFBDSV9ST01fQUREUkVTUywgJWRpCisJaW50CSQweDFhCisJcHVzaGwJJWVjeAorCisJLyogTWFwIHRoZSBST00gKi8KKwltb3Z3CSRQQ0lCSU9TX1dSSVRFX0RXT1JELCAlYXgKKwltb3ZsCSVlYnAsICVlY3gKKwlvcmIJJFBDSV9ST01fQUREUkVTU19FTkFCTEUsICVjbAorCWludAkkMHgxYQorCisJeG9yYgklZGwsICVkbAkvKiAlZGwgPSAwIDogUk9NIHdhcyBub3QgYWxyZWFkeSBtYXBwZWQgKi8KK2NoZWNrX3JvbToKKwkvKiBDaGVjayBhbmQgY29weSBST00gLSBlbnRlciB3aXRoICVkbCBzZXQgdG8gc2tpcCB1bm1hcHBpbmcsCisJICogJWVicCBzZXQgdG8gbWFwcGVkIFJPTSBCQVIgYWRkcmVzcy4KKwkgKiBXZSBjaGVjayB1cCB0byBwcm9kc3RyX3NlcGFyYXRvciBmb3IgZXF1YWxpdHksIHNpbmNlIGFueXRoaW5nIHBhc3QKKwkgKiB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQuIFNpbmNlIG91ciBjaGVjayBpbmNsdWRlcyB0aGUgY2hlY2tzdW0KKwkgKiBieXRlIG92ZXIgdGhlIHdob2xlIFJPTSBzdHViLCB0aGF0IHNob3VsZCBiZSBzdWZmaWNpZW50LgorCSAqLworCXhvcmIJJWRoLCAlZGgJLyogJWRoID0gMCA6IFJPTSBkaWQgbm90IGZhaWwgaW50ZWdyaXR5IGNoZWNrICovCisKKwkvKiBWZXJpZnkgUk9NIGludGVncml0eSAqLworCXhvcmwJJWVzaSwgJWVzaQorCW1vdmwJJWVicCwgJWVkaQorCW1vdmwJJHByb2RzdHJfc2VwYXJhdG9yLCAlZWN4CisJYWRkcjMyIHJlcGUgY21wc2IKKwlqegljb3B5X3JvbQorCWluY2IJJWRoCQkvKiBST00gZmFpbGVkIGludGVncml0eSBjaGVjayAqLworCW1vdmwJJWVjeCwgJWVicAkvKiBTYXZlIG51bWJlciBvZiBieXRlcyBsZWZ0ICovCisJam1wCXNraXBfbG9hZAorCitjb3B5X3JvbToKKwkvKiBQcmludCBCQVIgYWRkcmVzcyBhbmQgaW5kaWNhdGUgd2hldGhlciB3ZSBtYXBwZWQgaXQgb3Vyc2VsdmVzICovCisJbW92YgkkKCAnICcgKSwgJWFsCisJeG9ydwklZGksICVkaQorCWNhbGwJcHJpbnRfY2hhcmFjdGVyCisJbW92bAklZWJwLCAlZWF4CisJY2FsbAlwcmludF9oZXhfZHdvcmQKKwltb3ZiCSQoICctJyApLCAlYWwJLyogJy0nIGZvciBzZWxmLW1hcHBlZCAqLworCXN1YmIJJWRsLCAlYWwKKwlzdWJiCSVkbCwgJWFsCS8qICcrJyA9ICctJyAtIDIgZm9yIEJJT1MtbWFwcGVkICovCisJY2FsbAlwcmludF9jaGFyYWN0ZXIKKworCS8qIENvcHkgUk9NIGF0ICVlYnAgdG8gUE1NIG9yIGhpZ2htZW0gYmxvY2sgKi8KKwltb3ZsCSVlYnAsICVlc2kKKwltb3ZsCWltYWdlX3NvdXJjZSwgJWVkaQorCW1vdnp3bAlyZWFsX3NpemUsICVlY3gKKwlzaGxsCSQ5LCAlZWN4CisJYWRkcjMyIGVzIHJlcCBtb3ZzYgorCW1vdmwJJWVkaSwgZGVjb21wcmVzc190bworc2tpcF9sb2FkOgorCXRlc3RiCSVkbCwgJWRsCS8qIFdhcyBST00gYWxyZWFkeSBtYXBwZWQ/ICovCisJam56CXNraXBfdW5tYXAKKworCS8qIFVubWFwIHRoZSBST00gYnkgcmVzdG9yaW5nIG9sZCBST00gQkFSICovCisJbW92dwkkUENJQklPU19XUklURV9EV09SRCwgJWF4CisJbW92dwkkUENJX1JPTV9BRERSRVNTLCAlZGkKKwlwb3BsCSVlY3gKKwlpbnQJJDB4MWEKKworc2tpcF91bm1hcDoKKwkvKiBFcnJvciBoYW5kbGluZyAqLworCXRlc3RiCSVkaCwgJWRoCisJam56CWVycl9yb21faW52YWxpZAorCWNsYworCWptcAk5OWYKKworZXJyX3BjaWJpb3M6CQkJLyogTm8gUENJIEJJT1MgYXZhaWxhYmxlICovCisJbW92dwkkbG9hZF9tZXNzYWdlX25vX3BjaWJpb3MsICVzaQorCXhvcmwJJWVheCwgJWVheAkvKiAiZXJyb3IgY29kZSIgaXMgemVybyAqLworCWptcAkxZgorZXJyX3NpemVfaW5zYW5lOgkJLyogQkFSIGhhcyBzaXplICglZWN4KSB0aGF0IGlzIGluc2FuZSAqLworCW1vdncJJGxvYWRfbWVzc2FnZV9zaXplX2luc2FuZSwgJXNpCisJbW92bAklZWN4LCAlZWF4CisJam1wCTFmCitlcnJfbm9fYmFyOgkJCS8qIE5vIHNwYWNlIG9mIHN1ZmZpY2llbnQgc2l6ZSAoJWVkeCkgZm91bmQgKi8KKwltb3Z3CSRsb2FkX21lc3NhZ2Vfbm9fYmFyLCAlc2kKKwltb3ZsCSVlZHgsICVlYXgKKwlqbXAJMWYKK2Vycl9yb21faW52YWxpZDoJCS8qIExvYWRlZCBST00gZG9lcyBub3QgbWF0Y2ggKCVlYnAgYnl0ZXMgbGVmdCkgKi8KKwltb3Z3CSRsb2FkX21lc3NhZ2Vfcm9tX2ludmFsaWQsICVzaQorCW1vdnpibAlyb21oZWFkZXJfc2l6ZSwgJWVheAorCXNobGwJJDksICVlYXgKKwlzdWJsCSVlYnAsICVlYXgKKwlkZWNsCSVlYXgJCS8qICVlYXggaXMgbm93IGJ5dGUgaW5kZXggb2YgZmFpbHVyZSAqLworCisxOgkvKiBFcnJvciBoYW5kbGVyIC0gcHJpbnQgbWVzc2FnZSBhdCAlc2kgYW5kIGR3b3JkIGluICVlYXggKi8KKwl4b3J3CSVkaSwgJWRpCisJY2FsbAlwcmludF9tZXNzYWdlCisJY2FsbAlwcmludF9oZXhfZHdvcmQKKwlzdGMKKzk5Oglwb3B3CSVlcworCXBvcGFsCisJcmV0CisKKwkuc2l6ZQlsb2FkX2Zyb21fcGNpLCAuIC0gbG9hZF9mcm9tX3BjaQorCitsb2FkX21lc3NhZ2Vfbm9fcGNpYmlvczoKKwkuYXNjaXoJIlxuTm8gUENJIEJJT1MgZm91bmQhICIKKwkuc2l6ZQlsb2FkX21lc3NhZ2Vfbm9fcGNpYmlvcywgLiAtIGxvYWRfbWVzc2FnZV9ub19wY2liaW9zCisKK2xvYWRfbWVzc2FnZV9zaXplX2luc2FuZToKKwkuYXNjaXoJIlxuUk9NIHJlc291cmNlIGhhcyBpbnZhbGlkIHNpemUgIgorCS5zaXplCWxvYWRfbWVzc2FnZV9zaXplX2luc2FuZSwgLiAtIGxvYWRfbWVzc2FnZV9zaXplX2luc2FuZQorCitsb2FkX21lc3NhZ2Vfbm9fYmFyOgorCS5hc2NpegkiXG5ObyBtZW1vcnkgaG9sZSBvZiBzdWZmaWNpZW50IHNpemUgIgorCS5zaXplCWxvYWRfbWVzc2FnZV9ub19iYXIsIC4gLSBsb2FkX21lc3NhZ2Vfbm9fYmFyCisKK2xvYWRfbWVzc2FnZV9yb21faW52YWxpZDoKKwkuYXNjaXoJIlxuTG9hZGVkIFJPTSBpcyBpbnZhbGlkIGF0ICIKKwkuc2l6ZQlsb2FkX21lc3NhZ2Vfcm9tX2ludmFsaWQsIC4gLSBsb2FkX21lc3NhZ2Vfcm9tX2ludmFsaWQKKworI2VuZGlmIC8qIExPQURfUk9NX0ZST01fUENJICovCisKKworLyogSU5UMTkgZW50cnkgcG9pbnQKKyAqCisgKiBDYWxsZWQgdmlhIHRoZSBob29rZWQgSU5UIDE5IGlmIHdlIGRldGVjdGVkIGEgbm9uLVBuUCBCSU9TLiAgV2UKKyAqIGF0dGVtcHQgdG8gcmV0dXJuIHZpYSB0aGUgb3JpZ2luYWwgSU5UIDE5IHZlY3RvciAoaWYgd2Ugd2VyZSBhYmxlCisgKiB0byBzdG9yZSBpdCkuCisgKi8KK2ludDE5X2VudHJ5OgorCXB1c2h3CSVjcworCXBvcHcJJWRzCisJLyogUHJvbXB0IHVzZXIgdG8gcHJlc3MgQiB0byBib290ICovCisJbW92dwkkaW50MTlfbWVzc2FnZV9wcm9tcHQsICVzaQorCXhvcncJJWRpLCAlZGkKKwljYWxsCXByaW50X21lc3NhZ2UKKwltb3Z3CSRwcm9kc3RyLCAlc2kKKwljYWxsCXByaW50X21lc3NhZ2UKKwltb3Z3CSRpbnQxOV9tZXNzYWdlX2RvdHMsICVzaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCW1vdncJJDB4ZGY0ZSwgJWJ4CisJY2FsbAl3YWl0X2Zvcl9rZXkKKwlwdXNoZgorCXhvcncJJWRpLCAlZGkKKwljYWxsCXByaW50X2tpbGxfbGluZQorCW1vdncJJGludDE5X21lc3NhZ2VfZG9uZSwgJXNpCisJY2FsbAlwcmludF9tZXNzYWdlCisJcG9wZgorCWp6CTFmCisJLyogTGVhdmUga2V5cHJlc3MgaW4gYnVmZmVyIGFuZCBzdGFydCBnUFhFLiAgVGhlIGtleXByZXNzIHdpbGwKKwkgKiBjYXVzZSB0aGUgdXN1YWwgaW5pdGlhbCBDdHJsLUIgcHJvbXB0IHRvIGJlIHNraXBwZWQuCisJICovCisJcHVzaHcJJWNzCisJY2FsbAlleGVjCisxOgkvKiBUcnkgdG8gY2FsbCBvcmlnaW5hbCBJTlQgMTkgdmVjdG9yICovCisJbW92bAklY3M6b3JpZ19pbnQxOSwgJWVheAorCXRlc3RsCSVlYXgsICVlYXgKKwlqZQkyZgorCWxqbXAJKiVjczpvcmlnX2ludDE5CisyOgkvKiBObyBjaGFpbmVkIHZlY3RvcjogaXNzdWUgSU5UIDE4IGFzIGEgbGFzdCByZXNvcnQgKi8KKwlpbnQJJDB4MTgKKwkuc2l6ZQlpbnQxOV9lbnRyeSwgLiAtIGludDE5X2VudHJ5CitvcmlnX2ludDE5OgorCS5sb25nCTAKKwkuc2l6ZQlvcmlnX2ludDE5LCAuIC0gb3JpZ19pbnQxOQorCitpbnQxOV9tZXNzYWdlX3Byb21wdDoKKwkuYXNjaXoJIlByZXNzIE4gdG8gc2tpcCBib290aW5nIGZyb20gIgorCS5zaXplCWludDE5X21lc3NhZ2VfcHJvbXB0LCAuIC0gaW50MTlfbWVzc2FnZV9wcm9tcHQKK2ludDE5X21lc3NhZ2VfZG90czoKKwkuYXNjaXoJIi4uLiIKKwkuc2l6ZQlpbnQxOV9tZXNzYWdlX2RvdHMsIC4gLSBpbnQxOV9tZXNzYWdlX2RvdHMKK2ludDE5X21lc3NhZ2VfZG9uZToKKwkuYXNjaXoJIlxuXG4iCisJLnNpemUJaW50MTlfbWVzc2FnZV9kb25lLCAuIC0gaW50MTlfbWVzc2FnZV9kb25lCisJCisvKiBFeGVjdXRlIGFzIGEgYm9vdCBkZXZpY2UKKyAqCisgKi8KK2V4ZWM6CS8qIFNldCAlZHMgPSAlY3MgKi8KKwlwdXNodwklY3MKKwlwb3B3CSVkcworCisjaWZkZWYgTE9BRF9ST01fRlJPTV9QQ0kKKwkvKiBEb24ndCBleGVjdXRlIGlmIGxvYWQgd2FzIGludmFsaWQgKi8KKwljbXBsCSQwLCBkZWNvbXByZXNzX3RvCisJam5lCTFmCisJbHJldAorMToKKyNlbmRpZgorCisJLyogUHJpbnQgbWVzc2FnZSBhcyBzb29uIGFzIHBvc3NpYmxlICovCisJbW92dwkkcHJvZHN0ciwgJXNpCisJeG9ydwklZGksICVkaQorCWNhbGwJcHJpbnRfbWVzc2FnZQorCW1vdncJJGV4ZWNfbWVzc2FnZSwgJXNpCisJY2FsbAlwcmludF9tZXNzYWdlCisKKwkvKiBTdG9yZSBtYWdpYyB3b3JkIG9uIEJJT1Mgc3RhY2sgYW5kIHJlbWVtYmVyIEJJT1MgJXNzOnNwICovCisJcHVzaGwJJFNUQUNLX01BR0lDCisJbW92dwklc3MsICVkeAorCW1vdncJJXNwLCAlYnAKKworCS8qIE9idGFpbiBhIHJlYXNvbmFibHktc2l6ZWQgdGVtcG9yYXJ5IHN0YWNrICovCisJeG9ydwklYXgsICVheAorCW1vdncJJWF4LCAlc3MKKwltb3Z3CSQweDdjMDAsICVzcAorCisJLyogSW5zdGFsbCBnUFhFICovCisJbW92bAlpbWFnZV9zb3VyY2UsICVlc2kKKwltb3ZsCWRlY29tcHJlc3NfdG8sICVlZGkKKwljYWxsCWFsbG9jX2Jhc2VtZW0KKwljYWxsCWluc3RhbGxfcHJlYWxsb2MKKworCS8qIFNldCB1cCByZWFsLW1vZGUgc3RhY2sgKi8KKwltb3Z3CSVieCwgJXNzCisJbW92dwkkX2VzdGFjazE2LCAlc3AKKworCS8qIEp1bXAgdG8gLnRleHQxNiBzZWdtZW50ICovCisJcHVzaHcJJWF4CisJcHVzaHcJJDFmCisJbHJldAorCS5zZWN0aW9uICIudGV4dDE2IiwgImF3eCIsIEBwcm9nYml0cworMToJLyogQ2FsbCBtYWluKCkgKi8KKwlwdXNobAkkbWFpbgorCXB1c2h3CSVjcworCWNhbGwJcHJvdF9jYWxsCisJcG9wbAklZWN4IC8qIGRpc2NhcmQgKi8KKworCS8qIFVuaW5zdGFsbCBnUFhFICovCisJY2FsbAl1bmluc3RhbGwKKworCS8qIFJlc3RvcmUgQklPUyBzdGFjayAqLworCW1vdncJJWR4LCAlc3MKKwltb3Z3CSVicCwgJXNwCisKKwkvKiBDaGVjayBtYWdpYyB3b3JkIG9uIEJJT1Mgc3RhY2sgKi8KKwlwb3BsCSVlYXgKKwljbXBsCSRTVEFDS19NQUdJQywgJWVheAorCWpuZQkxZgorCS8qIEJJT1Mgc3RhY2sgT0s6IHJldHVybiB0byBjYWxsZXIgKi8KKwlscmV0CisxOgkvKiBCSU9TIHN0YWNrIGNvcnJ1cHQ6IHVzZSBJTlQgMTggKi8KKwlpbnQJJDB4MTgKKwkucHJldmlvdXMKKworZXhlY19tZXNzYWdlOgorCS5hc2NpegkiIHN0YXJ0aW5nIGV4ZWN1dGlvblxuIgorCS5zaXplIGV4ZWNfbWVzc2FnZSwgLiAtIGV4ZWNfbWVzc2FnZQorCisvKiBXYWl0IGZvciBrZXkgcHJlc3Mgc3BlY2lmaWVkIGJ5ICVibCAobWFza2VkIGJ5ICViaCkKKyAqCisgKiBVc2VkIGJ5IGluaXQgYW5kIElOVDE5IGNvZGUgd2hlbiBwcm9tcHRpbmcgdXNlci4gIElmIHRoZSBzcGVjaWZpZWQKKyAqIGtleSBpcyBwcmVzc2VkLCBpdCBpcyBsZWZ0IGluIHRoZSBrZXlib2FyZCBidWZmZXIuCisgKgorICogUmV0dXJucyB3aXRoIFpGIHNldCBpZmYgc3BlY2lmaWVkIGtleSBpcyBwcmVzc2VkLgorICovCit3YWl0X2Zvcl9rZXk6CisJLyogUHJlc2VydmUgcmVnaXN0ZXJzICovCisJcHVzaHcJJWN4CisJcHVzaHcJJWF4CisxOgkvKiBFbXB0eSB0aGUga2V5Ym9hcmQgYnVmZmVyIGJlZm9yZSB3YWl0aW5nIGZvciBpbnB1dCAqLworCW1vdmIJJDB4MDEsICVhaAorCWludAkkMHgxNgorCWp6CTJmCisJeG9ydwklYXgsICVheAorCWludAkkMHgxNgorCWptcAkxYgorMjoJLyogV2FpdCBmb3IgYSBrZXkgcHJlc3MgKi8KKwltb3Z3CSRST01fQkFOTkVSX1RJTUVPVVQsICVjeAorMzoJZGVjdwklY3gKKwlqcwk5OWYJCS8qIEV4aXQgd2l0aCBaRiBjbGVhciAqLworCS8qIFdhaXQgZm9yIHRpbWVyIHRpY2sgdG8gYmUgdXBkYXRlZCAqLworCWNhbGwJd2FpdF9mb3JfdGljaworCS8qIENoZWNrIHRvIHNlZSBpZiBhIGtleSB3YXMgcHJlc3NlZCAqLworCW1vdmIJJDB4MDEsICVhaAorCWludAkkMHgxNgorCWp6CTNiCisJLyogQ2hlY2sgdG8gc2VlIGlmIGtleSB3YXMgdGhlIHNwZWNpZmllZCBrZXkgKi8KKwlhbmRiCSViaCwgJWFsCisJY21wYgklYWwsICVibAorCWplCTk5ZgkJLyogRXhpdCB3aXRoIFpGIHNldCAqLworCS8qIE5vdCB0aGUgc3BlY2lmaWVkIGtleTogcmVtb3ZlIGZyb20gYnVmZmVyIGFuZCBzdG9wIHdhaXRpbmcgKi8KKwlwdXNoZncKKwl4b3J3CSVheCwgJWF4CisJaW50CSQweDE2CisJcG9wZncJCQkvKiBFeGl0IHdpdGggWkYgY2xlYXIgKi8KKzk5OgkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgcmV0dXJuICovCisJcG9wdwklYXgKKwlwb3B3CSVjeAorCXJldAorCS5zaXplIHdhaXRfZm9yX2tleSwgLiAtIHdhaXRfZm9yX2tleQorCisvKiBXYWl0IGZvciB0aW1lciB0aWNrCisgKgorICogVXNlZCBieSB3YWl0X2Zvcl9rZXkKKyAqLword2FpdF9mb3JfdGljazoKKwlwdXNobAklZWF4CisJcHVzaHcJJWZzCisJbW92dwkkMHg0MCwgJWF4CisJbW92dwklYXgsICVmcworCW1vdmwJJWZzOigweDZjKSwgJWVheAorMToJcHVzaGYKKwlzdGkKKwlobHQKKwlwb3BmCisJY21wbAklZnM6KDB4NmMpLCAlZWF4CisJamUJMWIKKwlwb3B3CSVmcworCXBvcGwJJWVheAorCXJldAorCS5zaXplIHdhaXRfZm9yX3RpY2ssIC4gLSB3YWl0X2Zvcl90aWNrCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3VuZGlsb2FkZXIuUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvdW5kaWxvYWRlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzFiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3VuZGlsb2FkZXIuUwpAQCAtMCwwICsxLDQ5IEBACisJLnRleHQKKwkuY29kZTE2CisJLmFyY2ggaTM4NgorCS5zZWN0aW9uICIucHJlZml4IiwgImF4IiwgQHByb2diaXRzCisKKy8qIFVOREkgbG9hZGVyCisgKgorICogQ2FsbGVkIGJ5IGFuIGV4dGVybmFsIHByb2dyYW0gdG8gbG9hZCBvdXIgUFhFIHN0YWNrLgorICovCisJLmdsb2JsCXVuZGlsb2FkZXIKK3VuZGlsb2FkZXI6CisJLyogU2F2ZSByZWdpc3RlcnMgKi8KKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2h3CSVkcworCXB1c2h3CSVlcworCXB1c2h3CSVieAorCS8qIFJPTSBzZWdtZW50IGFkZHJlc3MgdG8gJWRzICovCisJcHVzaHcJJWNzCisJcG9wdwklZHMKKwkvKiBVTkRJIGxvYWRlciBwYXJhbWV0ZXIgc3RydWN0dXJlIGFkZHJlc3MgaW50byAlZXM6JWRpICovCisJbW92dwklc3AsICVieAorCW1vdncJJXNzOjE4KCVieCksICVkaQorCW1vdncJJXNzOjIwKCVieCksICVlcworCS8qIEluc3RhbGwgdG8gc3BlY2lmaWVkIHJlYWwtbW9kZSBhZGRyZXNzZXMgKi8KKwlwdXNodwklZGkKKwltb3Z3CSVlczoxMiglZGkpLCAlYngKKwltb3Z3CSVlczoxNCglZGkpLCAlYXgKKwltb3ZsCWltYWdlX3NvdXJjZSwgJWVzaQorCW1vdmwJZGVjb21wcmVzc190bywgJWVkaQorCWNhbGwJaW5zdGFsbF9wcmVhbGxvYworCXBvcHcJJWRpCisJLyogQ2FsbCBVTkRJIGxvYWRlciBDIGNvZGUgKi8KKwlwdXNobAkkcHhlX2xvYWRlcl9jYWxsCisJcHVzaHcJJWNzCisJcHVzaHcJJDFmCisJcHVzaHcJJWF4CisJcHVzaHcJJHByb3RfY2FsbAorCWxyZXQKKzE6CXBvcHcJJWJ4CS8qIGRpc2NhcmQgKi8KKwlwb3B3CSVieAkvKiBkaXNjYXJkICovCisJLyogUmVzdG9yZSByZWdpc3RlcnMgYW5kIHJldHVybiAqLworCXBvcHcJJWJ4CisJcG9wdwklZXMKKwlwb3B3CSVkcworCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCWxyZXQKKwkuc2l6ZSB1bmRpbG9hZGVyLCAuIC0gdW5kaWxvYWRlcgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC91bm5ydjJiLlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3VubnJ2MmIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTcyNGMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC91bm5ydjJiLlMKQEAgLTAsMCArMSwxODQgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDIgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogT3JpZ2luYWxseSB0aGlzIGNvZGUgd2FzIHBhcnQgb2YgdWNsIHRoZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIGZvciB1cHggdGhlIGBgVWx0aW1hdGUgUGFja2VyIG9mIGVYZWN1dGFibGVzJycuCisgKgorICogLSBDb252ZXJ0ZWQgdG8gZ2FzIGFzc2VtYmx5LCBhbmQgcmVmaXR0ZWQgdG8gd29yayB3aXRoIGV0aGVyYm9vdC4KKyAqICAgRXJpYyBCaWVkZXJtYW4gMjAgQXVnIDIwMDIKKyAqCisgKiAtIFN0cnVjdHVyZSBtb2RpZmllZCB0byBiZSBhIHN1YnJvdXRpbmUgY2FsbCByYXRoZXIgdGhhbiBhbgorICogICBleGVjdXRhYmxlIHByZWZpeC4KKyAqICAgTWljaGFlbCBCcm93biAzMCBNYXIgMjAwNAorICoKKyAqIC0gTW9kaWZpZWQgdG8gYmUgY29tcGlsYWJsZSBhcyBlaXRoZXIgMTYtYml0IG9yIDMyLWJpdCBjb2RlLgorICogICBNaWNoYWVsIEJyb3duIDkgTWFyIDIwMDUKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgZGVjb21wcmVzcygpIGFuZCBkZWNvbXByZXNzMTYoKSBmdW5jdGlvbnMKKyAqIHdoaWNoIGNhbiBiZSBjYWxsZWQgaW4gb3JkZXIgdG8gZGVjb21wcmVzcyBhbiBpbWFnZSBjb21wcmVzc2VkIHdpdGgKKyAqIHRoZSBucnYyYiB1dGlsaXR5IGluIHNyYy91dGlsLgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVzaWduZWQgdG8gYmUgY2FsbGVkIGJ5IHRoZSBwcmVmaXguICBUaGV5IGFyZQorICogcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZS4KKyAqCisgKiBUaGUgc2FtZSBiYXNpYyBhc3NlbWJseSBjb2RlIGlzIHVzZWQgdG8gY29tcGlsZSBib3RoCisgKiBkZWNvbXByZXNzKCkgYW5kIGRlY29tcHJlc3MxNigpLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisJLnRleHQKKwkuYXJjaCBpMzg2CisJLnNlY3Rpb24gIi5wcmVmaXgubGliIiwgImF4IiwgQHByb2diaXRzCisKKyNpZmRlZiBDT0RFMTYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkZWNvbXByZXNzMTYgKHJlYWwtbW9kZSBuZWFyIGNhbGwsIHBvc2l0aW9uIGluZGVwZW5kZW50KQorICoKKyAqIERlY29tcHJlc3MgZGF0YSBpbiAxNi1iaXQgbW9kZQorICoKKyAqIFBhcmFtZXRlcnMgKHBhc3NlZCB2aWEgcmVnaXN0ZXJzKToKKyAqICAgJWRzOiVlc2kgLSBTdGFydCBvZiBjb21wcmVzc2VkIGlucHV0IGRhdGEKKyAqICAgJWVzOiVlZGkgLSBTdGFydCBvZiBvdXRwdXQgYnVmZmVyCisgKiBSZXR1cm5zOgorICogICAlZHM6JWVzaSAtIEVuZCBvZiBjb21wcmVzc2VkIGlucHV0IGRhdGEKKyAqICAgJWVzOiVlZGkgLSBFbmQgb2YgZGVjb21wcmVzc2VkIG91dHB1dCBkYXRhCisgKiAgIEFsbCBvdGhlciByZWdpc3RlcnMgYXJlIHByZXNlcnZlZAorICoKKyAqIE5PVEU6IEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGJ1aWxkIGEgc21hbGxlciB2ZXJzaW9uIG9mIHRoZQorICogZGVjb21wcmVzc2lvbiBjb2RlIGZvciAtREtFRVBfSVRfUkVBTCBieSB1c2luZworICogICAgI2RlZmluZSBSRUcoeCkgeAorICogdG8gdXNlIDE2LWJpdCByZWdpc3RlcnMgd2hlcmUgcG9zc2libGUuICBUaGlzIHdvdWxkIGltcG9zZSBsaW1pdHMKKyAqIHRoYXQgdGhlIGNvbXByZXNzZWQgZGF0YSBzaXplIG11c3QgYmUgaW4gdGhlIHJhbmdlIFsxLDY1NTMzLSVzaV0KKyAqIGFuZCB0aGUgdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtdXN0IGJlIGluIHRoZSByYW5nZSBbMSw2NTUzNi0lZGldCisgKiAod2hlcmUgJXNpIGFuZCAlZGkgYXJlIHRoZSBpbnB1dCB2YWx1ZXMgZm9yIHRob3NlIHJlZ2lzdGVycykuICBOb3RlCisgKiBwYXJ0aWN1bGFybHkgdGhhdCB0aGUgbG93ZXIgbGltaXQgaXMgMSwgbm90IDAsIGFuZCB0aGF0IHRoZSB1cHBlcgorICogbGltaXQgb24gdGhlIGlucHV0IChjb21wcmVzc2VkKSBkYXRhIHJlYWxseSBpcyA2NTUzMywgc2luY2UgdGhlCisgKiBhbGdvcml0aG0gbWF5IHJlYWQgdXAgdG8gdGhyZWUgYnl0ZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0CisgKiBkYXRhLCBzaW5jZSBpdCByZWFkcyBkd29yZHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNkZWZpbmUgUkVHKHgpIGUgIyMgeAorI2RlZmluZSBBRERSMzIgYWRkcjMyCisKKwkuY29kZTE2CisJLmdsb2JsCWRlY29tcHJlc3MxNgorZGVjb21wcmVzczE2OgorCQorI2Vsc2UgLyogQ09ERTE2ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkZWNvbXByZXNzICgzMi1iaXQgcHJvdGVjdGVkLW1vZGUgbmVhciBjYWxsLCBwb3NpdGlvbiBpbmRlcGVuZGVudCkKKyAqCisgKiBQYXJhbWV0ZXJzIChwYXNzZWQgdmlhIHJlZ2lzdGVycyk6CisgKiAgICVkczolZXNpIC0gU3RhcnQgb2YgY29tcHJlc3NlZCBpbnB1dCBkYXRhCisgKiAgICVlczolZWRpIC0gU3RhcnQgb2Ygb3V0cHV0IGJ1ZmZlcgorICogUmV0dXJuczoKKyAqICAgJWRzOiVlc2kgLSBFbmQgb2YgY29tcHJlc3NlZCBpbnB1dCBkYXRhCisgKiAgICVlczolZWRpIC0gRW5kIG9mIGRlY29tcHJlc3NlZCBvdXRwdXQgZGF0YQorICogICBBbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZSBwcmVzZXJ2ZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2RlZmluZSBSRUcoeCkgZSAjIyB4CisjZGVmaW5lIEFERFIzMgorCQorCS5jb2RlMzIKKwkuZ2xvYmwJZGVjb21wcmVzcworZGVjb21wcmVzczoKKworI2VuZGlmIC8qIENPREUxNiAqLworCisjZGVmaW5lIHhBWAlSRUcoYXgpCisjZGVmaW5lIHhDWAlSRUcoY3gpCisjZGVmaW5lIHhCUAlSRUcoYnApCisjZGVmaW5lIHhTSQlSRUcoc2kpCisjZGVmaW5lIHhESQlSRUcoZGkpCisKKwkvKiBTYXZlIHJlZ2lzdGVycyAqLworCXB1c2gJJXhBWAorCXB1c2hsCSVlYngKKwlwdXNoCSV4Q1gKKwlwdXNoCSV4QlAKKwkvKiBEbyB0aGUgZGVjb21wcmVzc2lvbiAqLworCWNsZAorCXhvcgkleEJQLCAleEJQCisJZGVjCSV4QlAJCS8qIGxhc3RfbV9vZmYgPSAtMSAqLworCWptcAlkY2wxX24yYgorCQorZGVjb21wcl9saXRlcmFsc19uMmI6CisJQUREUjMyIG1vdnNiCitkZWNvbXByX2xvb3BfbjJiOgorCWFkZGwJJWVieCwgJWVieAorCWpueglkY2wyX24yYgorZGNsMV9uMmI6CisJY2FsbAlnZXRiaXQzMgorZGNsMl9uMmI6CisJamMJZGVjb21wcl9saXRlcmFsc19uMmIKKwl4b3IJJXhBWCwgJXhBWAorCWluYwkleEFYCQkvKiBtX29mZiA9IDEgKi8KK2xvb3AxX24yYjoKKwljYWxsCWdldGJpdDEKKwlhZGMJJXhBWCwgJXhBWAkvKiBtX29mZiA9IG1fb2ZmKjIgKyBnZXRiaXQoKSAqLworCWNhbGwJZ2V0Yml0MQorCWpuYwlsb29wMV9uMmIJLyogd2hpbGUoIWdldGJpdCgpKSAqLworCXN1YgkkMywgJXhBWAorCWpiCWRlY29tcHJfZWJwZWF4X24yYgkvKiBpZiAobV9vZmYgPT0gMikgZ290byBkZWNvbXByX2VicGVheF9uMmIgPyAqLworCXNobAkkOCwgJXhBWAkKKwlBRERSMzIgbW92YiAoJXhTSSksICVhbAkvKiBtX29mZiA9IChtX29mZiAtIDMpKjI1NiArIHNyY1tpbGVuKytdICovCisJaW5jCSV4U0kKKwl4b3IJJC0xLCAleEFYCisJanoJZGVjb21wcl9lbmRfbjJiCS8qIGlmIChtX29mZiA9PSAweGZmZmZmZmZmKSBnb3RvIGRlY29tcF9lbmRfbjJiICovCisJbW92CSV4QVgsICV4QlAJLyogbGFzdF9tX29mZiA9IG1fb2ZmID8qLworZGVjb21wcl9lYnBlYXhfbjJiOgorCXhvcgkleENYLCAleENYCisJY2FsbAlnZXRiaXQxCisJYWRjCSV4Q1gsICV4Q1gJLyogbV9sZW4gPSBnZXRiaXQoKSAqLworCWNhbGwJZ2V0Yml0MQorCWFkYwkleENYLCAleENYCS8qIG1fbGVuID0gbV9sZW4qMiArIGdldGJpdCgpKSAqLworCWpueglkZWNvbXByX2dvdF9tbGVuX24yYgkvKiBpZiAobV9sZW4gPT0gMCkgZ290byBkZWNvbXByX2dvdF9tbGVuX24yYiAqLworCWluYwkleENYCQkvKiBtX2xlbisrICovCitsb29wMl9uMmI6CisJY2FsbAlnZXRiaXQxCQorCWFkYwkleENYLCAleENYCS8qIG1fbGVuID0gbV9sZW4qMiArIGdldGJpdCgpICovCisJY2FsbAlnZXRiaXQxCisJam5jCWxvb3AyX24yYgkvKiB3aGlsZSghZ2V0Yml0KCkpICovCisJaW5jCSV4Q1gKKwlpbmMJJXhDWAkJLyogbV9sZW4gKz0gMiAqLworZGVjb21wcl9nb3RfbWxlbl9uMmI6CisJY21wCSQtMHhkMDAsICV4QlAKKwlhZGMJJDEsICV4Q1gJLyogbV9sZW4gPSBtX2xlbiArIDEgKyAobGFzdF9tX29mZiA+IDB4ZDAwKSAqLworCXB1c2gJJXhTSQorCUFERFIzMiBsZWEgKCV4QlAsJXhESSksICV4U0kJLyogbV9wb3MgPSBkc3QgKyBvbGVuICsgLW1fb2ZmICAqLworCXJlcAorCWVzIEFERFIzMiBtb3ZzYgkJLyogZHN0W29sZW4rK10gPSAqbV9wb3MrKyB3aGlsZShtX2xlbiA+IDApICovCisJcG9wCSV4U0kKKwlqbXAJZGVjb21wcl9sb29wX24yYgorCisKK2dldGJpdDE6CisJYWRkbAklZWJ4LCAlZWJ4CisJam56CTFmCitnZXRiaXQzMjoKKwlBRERSMzIgbW92bCAoJXhTSSksICVlYngKKwlzdWIJJC00LCAleFNJCS8qIHNldHMgY2FycnkgZmxhZyAqLworCWFkY2wJJWVieCwgJWVieAorMToKKwlyZXQKKworZGVjb21wcl9lbmRfbjJiOgorCS8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KKwlwb3AJJXhCUAorCXBvcAkleENYCisJcG9wbAklZWJ4CisJcG9wCSV4QVgKKwlyZXQKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gvaTM4Ni9wcmVmaXgvdW5ucnYyYjE2LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3VubnJ2MmIxNi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGMyODQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3VubnJ2MmIxNi5TCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIDE2LWJpdCB2ZXJzaW9uIG9mIHRoZSBkZWNvbXByZXNzb3IKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApCisKKyNkZWZpbmUgQ09ERTE2CisjaW5jbHVkZSAidW5ucnYyYi5TIgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC91c2JkaXNrLlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3VzYmRpc2suUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTdkMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC91c2JkaXNrLlMKQEAgLTAsMCArMSwyMyBAQAorCS50ZXh0CisJLmFyY2ggaTM4NgorCS5zZWN0aW9uICIucHJlZml4IiwgImF3eCIsIEBwcm9nYml0cworCS5jb2RlMTYKKwkub3JnIDAKKworI2luY2x1ZGUgIm1ici5TIgorCisvKiBQYXJ0aXRpb24gdGFibGU6IFpJUC1jb21wYXRpYmxlIHBhcnRpdGlvbiA0LCA2NCBoZWFkcywgMzIgc2VjdG9ycy90cmFjayAqLworCS5vcmcgNDQ2CisJLnNwYWNlIDE2CisJLnNwYWNlIDE2CisJLnNwYWNlIDE2CisJLmJ5dGUgMHg4MCwgMHgwMSwgMHgwMSwgMHgwMAorCS5ieXRlIDB4ZWIsIDB4M2YsIDB4MjAsIDB4MDEKKwkubG9uZyAweDAwMDAwMDIwCisJLmxvbmcgMHgwMDAwMGZlMAorCisJLm9yZyA1MTAKKwkuYnl0ZSAweDU1LCAweGFhCisKKy8qIFNraXAgdG8gc3RhcnQgb2YgcGFydGl0aW9uICovCisJLm9yZyAzMiAqIDUxMgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC94cm9tcHJlZml4LlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvcHJlZml4L3hyb21wcmVmaXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2M4NjFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3ByZWZpeC94cm9tcHJlZml4LlMKQEAgLTAsMCArMSw5IEBACisvKgorICogUk9NIHByZWZpeCB0aGF0IGxvYWRzIHRoZSBidWxrIG9mIHRoZSBST00gdXNpbmcgZGlyZWN0IFBDSSBhY2Nlc3NlcywKKyAqIHNvIGFzIG5vdCB0byB0YWtlIHVwIG11Y2ggb3B0aW9uIFJPTSBzcGFjZSBvbiBQQ0kgPDMuMCBzeXN0ZW1zLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKQorCisjZGVmaW5lIExPQURfUk9NX0ZST01fUENJCisjaW5jbHVkZSAicm9tcHJlZml4LlMiCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvc2NyaXB0cy9pMzg2LWtpci5sZHMgYi9ncHhlL3NyYy9hcmNoL2kzODYvc2NyaXB0cy9pMzg2LWtpci5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5NDgwZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9zY3JpcHRzL2kzODYta2lyLmxkcwpAQCAtMCwwICsxLDE5NyBAQAorLyogLSotIHNoIC0qLSAqLworCisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgaTM4NiBpbWFnZXMKKyAqCisgKi8KKworT1VUUFVUX0ZPUk1BVCAoICJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIgKQorT1VUUFVUX0FSQ0ggKCBpMzg2ICkKK0VOVFJZICggX2VudHJ5ICkKKworU0VDVElPTlMgeworCisgICAgLyogQWxsIHNlY3Rpb25zIGluIHRoZSByZXN1bHRpbmcgZmlsZSBoYXZlIGNvbnNlY3V0aXZlIGxvYWQKKyAgICAgKiBhZGRyZXNzZXMsIGJ1dCBtYXkgaGF2ZSBpbmRpdmlkdWFsIGxpbmsgYWRkcmVzc2VzIGRlcGVuZGluZyBvbgorICAgICAqIHRoZSBtZW1vcnkgbW9kZWwgYmVpbmcgdXNlZC4KKyAgICAgKgorICAgICAqIFRoZSBsaW5rZXIgc3ltYm9scyBfcHJlZml4X2xpbmtfYWRkciwgbG9hZF9hZGRyLCBhbmQKKyAgICAgKiBfbWF4X2FsaWduIG1heSBiZSBzcGVjaWZpZWQgZXhwbGljaXRseS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZXkKKyAgICAgKiB3aWxsIGRlZmF1bHQgdG86CisgICAgICoKKyAgICAgKiAgIF9wcmVmaXhfbGlua19hZGRyCT0gMAorICAgICAqICAgX2xvYWRfYWRkcgkJPSAwCisgICAgICogICBfbWF4X2FsaWduCQk9IDE2CisgICAgICogCisgICAgICogV2UgZ3VhcmFudGVlIGFsaWdubWVudCBvZiB2aXJ0dWFsIGFkZHJlc3NlcyB0byBhbnkgYWxpZ25tZW50CisgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBjb25zdGl0dWVudCBvYmplY3QgZmlsZXMgKGUuZy4gdmlhCisgICAgICogX19hdHRyaWJ1dGVfXygoYWxpZ25lZCh4KSkpKS4gIExvYWQgYWRkcmVzc2VzIGFyZSBndWFyYW50ZWVkCisgICAgICogb25seSB1cCB0byBfbWF4X2FsaWduLiAgUHJvdmlkZWQgdGhhdCBhbGwgbG9hZGVyIGFuZCByZWxvY2F0aW9uCisgICAgICogY29kZSBob25vdXJzIF9tYXhfYWxpZ24sIHRoaXMgbWVhbnMgdGhhdCBwaHlzaWNhbCBhZGRyZXNzZXMgYXJlCisgICAgICogYWxzbyBndWFyYW50ZWVkIHVwIHRvIF9tYXhfYWxpZ24uCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgd2hlbiB1c2luZyAtREtFRVBfSVRfUkVBTCwgdGhlIFVOREkgc2VnbWVudHMgYXJlIG9ubHkKKyAgICAgKiBndWFyYW50ZWVkIHRvIGJlIGxvYWRlZCBvbiBhIHBhcmFncmFwaCBib3VuZGFyeSAoaS5lLiAxNi1ieXRlCisgICAgICogYWxpZ25tZW50KS4gIFVzaW5nIF9tYXhfYWxpZ24+MTYgd2lsbCB0aGVyZWZvcmUgbm90IGd1YXJhbnRlZQorICAgICAqID4xNi1ieXRlIGFsaWdubWVudCBvZiBwaHlzaWNhbCBhZGRyZXNzZXMgd2hlbiAtREtFRVBfSVRfUkVBTCBpcworICAgICAqIHVzZWQgKHRob3VnaCB2aXJ0dWFsIGFkZHJlc3NlcyB3aWxsIHN0aWxsIGJlIGZ1bGx5IGFsaWduZWQpLgorICAgICAqCisgICAgICovCisKKyAgICAvKgorICAgICAqIFRoZSBwcmVmaXgKKyAgICAgKi8KKworICAgIF9wcmVmaXhfbGlua19hZGRyID0gREVGSU5FRCAoIF9wcmVmaXhfbGlua19hZGRyICkgPyBfcHJlZml4X2xpbmtfYWRkciA6IDA7CisgICAgLiA9IF9wcmVmaXhfbGlua19hZGRyOworICAgIF9wcmVmaXggPSAuOworCisgICAgLnByZWZpeCA6IEFUICggX3ByZWZpeF9sb2FkX29mZnNldCArIF9fcHJlZml4ICkgeworCV9fcHJlZml4ID0gLjsKKwlfZW50cnkgPSAuOworCSooLnByZWZpeCkKKwkqKC5wcmVmaXguKikKKwlfZXByZWZpeF9wcm9nYml0cyA9IC47CisgICAgfQorICAgIAorICAgIF9lcHJlZml4ID0gLjsKKworICAgIC8qCisgICAgICogVGhlIDE2LWJpdCBzZWN0aW9ucworICAgICAqLworCisgICAgX3RleHQxNl9saW5rX2FkZHIgPSAwOworICAgIC4gPSBfdGV4dDE2X2xpbmtfYWRkcjsKKyAgICBfdGV4dDE2ID0gLjsKKworICAgIC4gKz0gMTsJCQkvKiBQcmV2ZW50IE5VTEwgYmVpbmcgdmFsaWQgKi8KKworICAgIC50ZXh0MTYgOiBBVCAoIF90ZXh0MTZfbG9hZF9vZmZzZXQgKyBfX3RleHQxNiApIHsKKwlfX3RleHQxNiA9IC47CisJKigudGV4dC5udWxsX3RyYXApCisJKigudGV4dDE2KQorCSooLnRleHQxNi4qKQorCSooLnRleHQpCisJKigudGV4dC4qKQorCV9ldGV4dDE2X3Byb2diaXRzID0gLjsKKyAgICB9ID0gMHg5MDkwCisKKyAgICBfZXRleHQxNiA9IC47CisKKyAgICBfZGF0YTE2X2xpbmtfYWRkciA9IDA7CisgICAgLiA9IF9kYXRhMTZfbGlua19hZGRyOworICAgIF9kYXRhMTYgPSAuOworCisgICAgLiArPSAxOwkJCS8qIFByZXZlbnQgTlVMTCBiZWluZyB2YWxpZCAqLworCisgICAgLnJvZGF0YTE2IDogQVQgKCBfZGF0YTE2X2xvYWRfb2Zmc2V0ICsgX19yb2RhdGExNiApIHsKKwlfX3JvZGF0YTE2ID0gLjsKKwkqKC5yb2RhdGExNikKKwkqKC5yb2RhdGExNi4qKQorCSooLnJvZGF0YSkKKwkqKC5yb2RhdGEuKikKKyAgICB9CisgICAgLmRhdGExNiA6IEFUICggX2RhdGExNl9sb2FkX29mZnNldCArIF9fZGF0YTE2ICkgeworCV9fZGF0YTE2ID0gLjsKKwkqKC5kYXRhMTYpCisJKiguZGF0YTE2LiopCisJKiguZGF0YSkKKwkqKC5kYXRhLiopCisJKihTT1JUKC50YmwuKikpCQkvKiBWYXJpb3VzIHRhYmxlcy4gIFNlZSBpbmNsdWRlL3RhYmxlcy5oICovCisJX2VkYXRhMTZfcHJvZ2JpdHMgPSAuOworICAgIH0KKyAgICAuYnNzMTYgOiBBVCAoIF9kYXRhMTZfbG9hZF9vZmZzZXQgKyBfX2JzczE2ICkgeworCV9fYnNzMTYgPSAuOworCV9ic3MxNiA9IC47CisJKiguYnNzMTYpCisJKiguYnNzMTYuKikKKwkqKC5ic3MpCisJKiguYnNzLiopCisJKihDT01NT04pCisJX2Vic3MxNiA9IC47CisgICAgfQorICAgIC5zdGFjazE2IDogQVQgKCBfZGF0YTE2X2xvYWRfb2Zmc2V0ICsgX19zdGFjazE2ICkgeworCV9fc3RhY2sxNiA9IC47CisJKiguc3RhY2sxNikKKwkqKC5zdGFjazE2LiopCisJKiguc3RhY2spCisJKiguc3RhY2suKikKKyAgICB9CisKKyAgICBfZWRhdGExNiA9IC47CisKKyAgICBfZW5kID0gLjsKKworICAgIC8qCisgICAgICogRGlzcG9zZSBvZiB0aGUgY29tbWVudCBhbmQgbm90ZSBzZWN0aW9ucyB0byBtYWtlIHRoZSBsaW5rIG1hcAorICAgICAqIGVhc2llciB0byByZWFkCisgICAgICovCisKKyAgICAvRElTQ0FSRC8gOiB7CisJKiguY29tbWVudCkKKwkqKC5ub3RlKQorCSooLmRpc2NhcmQpCisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb2FkIGFkZHJlc3MgY2FsY3VsYXRpb25zLiAgVGhlIHNsaWdodGx5IG9ic2N1cmUgbmF0dXJlIG9mIHRoZQorICAgICAqIGNhbGN1bGF0aW9ucyBpcyBiZWNhdXNlIEFMSUdOKHgpIGNhbiBvbmx5IG9wZXJhdGUgb24gdGhlCisgICAgICogbG9jYXRpb24gY291bnRlci4KKyAgICAgKi8KKworICAgIF9tYXhfYWxpZ24JCSAgICA9IERFRklORUQgKCBfbWF4X2FsaWduICkgPyBfbWF4X2FsaWduIDogMTY7CisgICAgX2xvYWRfYWRkcgkJICAgID0gREVGSU5FRCAoIF9sb2FkX2FkZHIgKSA/IF9sb2FkX2FkZHIgOiAwOworCisgICAgLgkJCSAgICA9IF9sb2FkX2FkZHI7CisKKyAgICAuCQkJICAgLT0gX3ByZWZpeF9saW5rX2FkZHI7CisgICAgX3ByZWZpeF9sb2FkX29mZnNldAkgICAgPSBBTElHTiAoIF9tYXhfYWxpZ24gKTsKKyAgICBfcHJlZml4X2xvYWRfYWRkcgkgICAgPSBfcHJlZml4X2xpbmtfYWRkciArIF9wcmVmaXhfbG9hZF9vZmZzZXQ7CisgICAgX3ByZWZpeF9zaXplCSAgICA9IF9lcHJlZml4IC0gX3ByZWZpeDsKKyAgICBfcHJlZml4X3Byb2diaXRzX3NpemUgICA9IF9lcHJlZml4X3Byb2diaXRzIC0gX3ByZWZpeDsKKyAgICAuCQkJICAgID0gX3ByZWZpeF9sb2FkX2FkZHIgKyBfcHJlZml4X3Byb2diaXRzX3NpemU7CisKKyAgICAuCQkJICAgLT0gX3RleHQxNl9saW5rX2FkZHI7CisgICAgX3RleHQxNl9sb2FkX29mZnNldAkgICAgPSBBTElHTiAoIF9tYXhfYWxpZ24gKTsKKyAgICBfdGV4dDE2X2xvYWRfYWRkcgkgICAgPSBfdGV4dDE2X2xpbmtfYWRkciArIF90ZXh0MTZfbG9hZF9vZmZzZXQ7CisgICAgX3RleHQxNl9zaXplCSAgICA9IF9ldGV4dDE2IC0gX3RleHQxNjsKKyAgICBfdGV4dDE2X3Byb2diaXRzX3NpemUgICA9IF9ldGV4dDE2X3Byb2diaXRzIC0gX3RleHQxNjsKKyAgICAuCQkJICAgID0gX3RleHQxNl9sb2FkX2FkZHIgKyBfdGV4dDE2X3Byb2diaXRzX3NpemU7CisKKyAgICAuCQkJICAgLT0gX2RhdGExNl9saW5rX2FkZHI7CisgICAgX2RhdGExNl9sb2FkX29mZnNldAkgICAgPSBBTElHTiAoIF9tYXhfYWxpZ24gKTsKKyAgICBfZGF0YTE2X2xvYWRfYWRkcgkgICAgPSBfZGF0YTE2X2xpbmtfYWRkciArIF9kYXRhMTZfbG9hZF9vZmZzZXQ7CisgICAgX2RhdGExNl9zaXplCSAgICA9IF9lZGF0YTE2IC0gX2RhdGExNjsKKyAgICBfZGF0YTE2X3Byb2diaXRzX3NpemUgICA9IF9lZGF0YTE2X3Byb2diaXRzIC0gX2RhdGExNjsKKyAgICAuCQkJICAgID0gX2RhdGExNl9sb2FkX2FkZHIgKyBfZGF0YTE2X3Byb2diaXRzX3NpemU7CisKKyAgICAuCQkJICAgID0gQUxJR04gKCBfbWF4X2FsaWduICk7CisKKyAgICBfbG9hZF9zaXplCQkgICAgPSAuIC0gX2xvYWRfYWRkcjsKKworICAgIC8qCisgICAgICogQWxpZ25tZW50IGNoZWNrcy4gIEFMSUdOKCkgY2FuIG9ubHkgb3BlcmF0ZSBvbiB0aGUgbG9jYXRpb24KKyAgICAgKiBjb3VudGVyLCBzbyB3ZSBzZXQgdGhlIGxvY2F0aW9uIGNvdW50ZXIgdG8gZWFjaCB2YWx1ZSB3ZSB3YW50CisgICAgICogdG8gY2hlY2suCisgICAgICovCisKKyAgICAuID0gX3ByZWZpeF9sb2FkX2FkZHIgLSBfcHJlZml4X2xpbmtfYWRkcjsKKyAgICBfYXNzZXJ0ID0gQVNTRVJUICggKCAuID09IEFMSUdOICggX21heF9hbGlnbiApICksCisJCSAgICAgICAiX3ByZWZpeCBpcyBiYWRseSBhbGlnbmVkIiApOworCisgICAgLiA9IF90ZXh0MTZfbG9hZF9hZGRyIC0gX3RleHQxNl9saW5rX2FkZHI7CisgICAgX2Fzc2VydCA9IEFTU0VSVCAoICggLiA9PSBBTElHTiAoIF9tYXhfYWxpZ24gKSApLAorCQkgICAgICAgIl90ZXh0MTYgaXMgYmFkbHkgYWxpZ25lZCIgKTsKKworICAgIC4gPSBfZGF0YTE2X2xvYWRfYWRkciAtIF9kYXRhMTZfbGlua19hZGRyOworICAgIF9hc3NlcnQgPSBBU1NFUlQgKCAoIC4gPT0gQUxJR04gKCBfbWF4X2FsaWduICkgKSwKKwkJICAgICAgICJfZGF0YTE2IGlzIGJhZGx5IGFsaWduZWQiICk7CisKKyAgICAvKgorICAgICAqIFZhbHVlcyBjYWxjdWxhdGVkIHRvIHNhdmUgY29kZSBmcm9tIGRvaW5nIGl0CisgICAgICovCisgICAgX3RleHQxNl9zaXplX3BnaAk9ICggKCBfdGV4dDE2X3NpemUgKyAxNSApIC8gMTYgKTsKKyAgICBfZGF0YTE2X3NpemVfcGdoCT0gKCAoIF9kYXRhMTZfc2l6ZSArIDE1ICkgLyAxNiApOworICAgIF9sb2FkX3NpemVfcGdoCT0gKCAoIF9sb2FkX3NpemUgKyAxNSApIC8gMTYgKTsKKyAgICBfbG9hZF9zaXplX3NlY3QJPSAoICggX2xvYWRfc2l6ZSArIDUxMSApIC8gNTEyICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvc2NyaXB0cy9pMzg2LmxkcyBiL2dweGUvc3JjL2FyY2gvaTM4Ni9zY3JpcHRzL2kzODYubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYzc1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvc2NyaXB0cy9pMzg2LmxkcwpAQCAtMCwwICsxLDIwMiBAQAorLyogLSotIHNoIC0qLSAqLworCisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgaTM4NiBpbWFnZXMKKyAqCisgKi8KKworU0VDVElPTlMgeworCisgICAgLyogRWFjaCBzZWN0aW9uIHN0YXJ0cyBhdCBhIHZpcnR1YWwgYWRkcmVzcyBvZiB6ZXJvLgorICAgICAqCisgICAgICogV2UgZ3VhcmFudGVlIGFsaWdubWVudCBvZiB2aXJ0dWFsIGFkZHJlc3NlcyB0byBhbnkgYWxpZ25tZW50CisgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBjb25zdGl0dWVudCBvYmplY3QgZmlsZXMgKGUuZy4gdmlhCisgICAgICogX19hdHRyaWJ1dGVfXygoYWxpZ25lZCh4KSkpKS4gIExvYWQgYWRkcmVzc2VzIGFyZSBndWFyYW50ZWVkCisgICAgICogb25seSB1cCB0byBfbWF4X2FsaWduLiAgUHJvdmlkZWQgdGhhdCBhbGwgbG9hZGVyIGFuZCByZWxvY2F0aW9uCisgICAgICogY29kZSBob25vdXJzIF9tYXhfYWxpZ24sIHRoaXMgbWVhbnMgdGhhdCBwaHlzaWNhbCBhZGRyZXNzZXMgYXJlCisgICAgICogYWxzbyBndWFyYW50ZWVkIHVwIHRvIF9tYXhfYWxpZ24uCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgd2hlbiB1c2luZyAtREtFRVBfSVRfUkVBTCwgdGhlIFVOREkgc2VnbWVudHMgYXJlIG9ubHkKKyAgICAgKiBndWFyYW50ZWVkIHRvIGJlIGxvYWRlZCBvbiBhIHBhcmFncmFwaCBib3VuZGFyeSAoaS5lLiAxNi1ieXRlCisgICAgICogYWxpZ25tZW50KS4gIFVzaW5nIF9tYXhfYWxpZ24+MTYgd2lsbCB0aGVyZWZvcmUgbm90IGd1YXJhbnRlZQorICAgICAqID4xNi1ieXRlIGFsaWdubWVudCBvZiBwaHlzaWNhbCBhZGRyZXNzZXMgd2hlbiAtREtFRVBfSVRfUkVBTCBpcworICAgICAqIHVzZWQgKHRob3VnaCB2aXJ0dWFsIGFkZHJlc3NlcyB3aWxsIHN0aWxsIGJlIGZ1bGx5IGFsaWduZWQpLgorICAgICAqCisgICAgICovCisKKyAgICAvKgorICAgICAqIFRoZSBwcmVmaXgKKyAgICAgKgorICAgICAqLworCisgICAgLnByZWZpeCAweDAgOiBBVCAoIF9wcmVmaXhfbG1hICkgeworCV9wcmVmaXggPSAuOworCSooLnByZWZpeCkKKwkqKC5wcmVmaXguKikKKwlfbXByZWZpeCA9IC47CisgICAgfSAuYnNzLnByZWZpeCAoTk9MT0FEKSA6IEFUICggX2VuZF9sbWEgKSB7CisJX2VwcmVmaXggPSAuOworICAgIH0KKyAgICBfcHJlZml4X2ZpbGVzegk9IEFCU09MVVRFICggX21wcmVmaXggLSBfcHJlZml4ICk7CisgICAgX3ByZWZpeF9tZW1zegk9IEFCU09MVVRFICggX2VwcmVmaXggLSBfcHJlZml4ICk7CisKKyAgICAvKgorICAgICAqIFRoZSAxNi1iaXQgKHJlYWwtbW9kZSkgY29kZSBzZWN0aW9uCisgICAgICoKKyAgICAgKi8KKworICAgIC50ZXh0MTYgMHgwIDogQVQgKCBfdGV4dDE2X2xtYSApIHsKKwlfdGV4dDE2ID0gLjsKKwkqKC50ZXh0MTYubnVsbCkKKwkuICs9IDE7CQkJCS8qIFByZXZlbnQgTlVMTCBiZWluZyB2YWxpZCAqLworCSooLnRleHQxNikKKwkqKC50ZXh0MTYuKikKKwlfbXRleHQxNiA9IC47CisgICAgfSAuYnNzLnRleHQxNiAoTk9MT0FEKSA6IEFUICggX2VuZF9sbWEgKSB7CisJX2V0ZXh0MTYgPSAuOworICAgIH0KKyAgICBfdGV4dDE2X2ZpbGVzegk9IEFCU09MVVRFICggX210ZXh0MTYgLSBfdGV4dDE2ICk7CisgICAgX3RleHQxNl9tZW1zegk9IEFCU09MVVRFICggX2V0ZXh0MTYgLSBfdGV4dDE2ICk7CisKKyAgICAvKgorICAgICAqIFRoZSAxNi1iaXQgKHJlYWwtbW9kZSkgZGF0YSBzZWN0aW9uCisgICAgICoKKyAgICAgKi8KKworICAgIC5kYXRhMTYgMHgwIDogQVQgKCBfZGF0YTE2X2xtYSApIHsKKwlfZGF0YTE2ID0gLjsKKwkuICs9IDE7CQkJCS8qIFByZXZlbnQgTlVMTCBiZWluZyB2YWxpZCAqLworCSooLnJvZGF0YTE2KQorCSooLnJvZGF0YTE2LiopCisJKiguZGF0YTE2KQorCSooLmRhdGExNi4qKQorCV9tZGF0YTE2ID0gLjsKKyAgICB9IC5ic3MuZGF0YTE2IChOT0xPQUQpIDogQVQgKCBfZW5kX2xtYSApIHsKKwkqKC5ic3MxNikKKwkqKC5ic3MxNi4qKQorCSooLnN0YWNrMTYpCisJKiguc3RhY2sxNi4qKQorCV9lZGF0YTE2ID0gLjsKKyAgICB9CisgICAgX2RhdGExNl9maWxlc3oJPSBBQlNPTFVURSAoIF9tZGF0YTE2IC0gX2RhdGExNiApOworICAgIF9kYXRhMTZfbWVtc3oJPSBBQlNPTFVURSAoIF9lZGF0YTE2IC0gX2RhdGExNiApOworCisgICAgLyoKKyAgICAgKiBUaGUgMzItYml0IHNlY3Rpb25zCisgICAgICoKKyAgICAgKi8KKworICAgIC50ZXh0ZGF0YSAweDAgOiBBVCAoIF90ZXh0ZGF0YV9sbWEgKSB7CisJX3RleHRkYXRhID0gLjsKKwkqKC50ZXh0Lm51bGxfdHJhcCkKKwkuICs9IDE7CQkJCS8qIFByZXZlbnQgTlVMTCBiZWluZyB2YWxpZCAqLworCSooLnRleHQpCisJKigudGV4dC4qKQorCSooLnJvZGF0YSkKKwkqKC5yb2RhdGEuKikKKwkqKC5kYXRhKQorCSooLmRhdGEuKikKKwkqKFNPUlQoLnRibC4qKSkJCS8qIFZhcmlvdXMgdGFibGVzLiAgU2VlIGluY2x1ZGUvdGFibGVzLmggKi8KKwlfbXRleHRkYXRhID0gLjsKKyAgICB9IC5ic3MudGV4dGRhdGEgKE5PTE9BRCkgOiBBVCAoIF9lbmRfbG1hICkgeworCSooLmJzcykKKwkqKC5ic3MuKikKKwkqKENPTU1PTikKKwkqKC5zdGFjaykKKwkqKC5zdGFjay4qKQorCV9ldGV4dGRhdGEgPSAuOworICAgIH0KKyAgICBfdGV4dGRhdGFfZmlsZXN6CT0gQUJTT0xVVEUgKCBfbXRleHRkYXRhIC0gX3RleHRkYXRhICk7CisgICAgX3RleHRkYXRhX21lbXN6CT0gQUJTT0xVVEUgKCBfZXRleHRkYXRhIC0gX3RleHRkYXRhICk7CisKKyAgICAvKgorICAgICAqIENvbXByZXNzb3IgaW5mb3JtYXRpb24gYmxvY2sKKyAgICAgKgorICAgICAqLworCisgICAgLnppbmZvIDB4MCA6IEFUICggX3ppbmZvX2xtYSApIHsKKwlfemluZm8gPSAuOworCSooLnppbmZvKQorCSooLnppbmZvLiopCisJX216aW5mbyA9IC47CisgICAgfSAuYnNzLnppbmZvIChOT0xPQUQpIDogQVQgKCBfZW5kX2xtYSApIHsKKwlfZXppbmZvID0gLjsKKyAgICB9CisgICAgX3ppbmZvX2ZpbGVzegk9IEFCU09MVVRFICggX216aW5mbyAtIF96aW5mbyApOworICAgIF96aW5mb19tZW1zegk9IEFCU09MVVRFICggX2V6aW5mbyAtIF96aW5mbyApOworCisgICAgLyoKKyAgICAgKiBXZWFrIHN5bWJvbHMgdGhhdCBuZWVkIHplcm8gdmFsdWVzIGlmIG5vdCBvdGhlcndpc2UgZGVmaW5lZAorICAgICAqCisgICAgICovCisKKyAgICAud2VhayAweDAgOiBBVCAoIF9lbmRfbG1hICkgeworCV93ZWFrID0gLjsKKwkqKC53ZWFrKQorCV9ld2VhayA9IC47CisgICAgfQorICAgIF9hc3NlcnQgPSBBU1NFUlQgKCAoIF93ZWFrID09IF9ld2VhayApLCAiLndlYWsgaXMgbm9uLXplcm8gbGVuZ3RoIiApOworCisgICAgLyoKKyAgICAgKiBEaXNwb3NlIG9mIHRoZSBjb21tZW50IGFuZCBub3RlIHNlY3Rpb25zIHRvIG1ha2UgdGhlIGxpbmsgbWFwCisgICAgICogZWFzaWVyIHRvIHJlYWQKKyAgICAgKgorICAgICAqLworCisgICAgL0RJU0NBUkQvIDogeworCSooLmNvbW1lbnQpCisJKiguY29tbWVudC4qKQorCSooLm5vdGUpCisJKigubm90ZS4qKQorCSooLmVoX2ZyYW1lKQorCSooLmVoX2ZyYW1lLiopCisJKigucmVsKQorCSooLnJlbC4qKQorCSooLmRpc2NhcmQpCisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb2FkIGFkZHJlc3MgY2FsY3VsYXRpb25zLiAgSW4gb2xkZXIgdmVyc2lvbnMgb2YgbGQsIEFMSUdOKCkKKyAgICAgKiBjYW4gb3BlcmF0ZSBvbmx5IG9uIHRoZSBsb2NhdGlvbiBjb3VudGVyLCBzbyB3ZSB1c2UgdGhhdC4KKyAgICAgKgorICAgICAqLworCisgICAgUFJPVklERSAoIF9tYXhfYWxpZ24gPSAxNiApOworICAgIC4JCQk9IDA7CisKKyAgICAuCQkJPSBBTElHTiAoIF9tYXhfYWxpZ24gKTsKKyAgICBfcHJlZml4X2xtYQkJPSAuOworICAgIC4JCQkrPSBfcHJlZml4X2ZpbGVzejsKKworICAgIC4JCQk9IEFMSUdOICggX21heF9hbGlnbiApOworICAgIF9wYXlsb2FkX2xtYQk9IC47CisgICAgX3RleHQxNl9sbWEJCT0gLjsKKyAgICAuCQkJKz0gX3RleHQxNl9maWxlc3o7CisKKyAgICAuCQkJPSBBTElHTiAoIF9tYXhfYWxpZ24gKTsKKyAgICBfZGF0YTE2X2xtYQkJPSAuOworICAgIC4JCQkrPSBfZGF0YTE2X2ZpbGVzejsKKworICAgIC4JCQk9IEFMSUdOICggX21heF9hbGlnbiApOworICAgIF90ZXh0ZGF0YV9sbWEJPSAuOworICAgIC4JCQkrPSBfdGV4dGRhdGFfZmlsZXN6OworCisgICAgX2ZpbGVzegkJPSAuOyAvKiBEbyBub3QgaW5jbHVkZSB6aW5mbyBibG9jayBpbiBmaWxlIHNpemUgKi8KKworICAgIC4JCQk9IEFMSUdOICggX21heF9hbGlnbiApOworICAgIF96aW5mb19sbWEJCT0gLjsKKyAgICAuCQkJKz0gX3ppbmZvX2ZpbGVzejsKKworICAgIC4JCQk9IEFMSUdOICggX21heF9hbGlnbiApOworICAgIF9lbmRfbG1hCQk9IC47CisKKyAgICAvKgorICAgICAqIFZhbHVlcyBjYWxjdWxhdGVkIHRvIHNhdmUgY29kZSBmcm9tIGRvaW5nIGl0CisgICAgICoKKyAgICAgKi8KKyAgICBfcHJlZml4X2ZpbGVzel9zZWN0ID0gKCAoIF9wcmVmaXhfZmlsZXN6ICsgNTExICkgLyA1MTIgKTsKKyAgICBfcHJlZml4X21lbXN6X3BnaAk9ICggKCBfcHJlZml4X21lbXN6ICsgMTUgKSAvIDE2ICk7CisgICAgX3ByZWZpeF9tZW1zel9zZWN0CT0gKCAoIF9wcmVmaXhfbWVtc3ogKyA1MTEgKSAvIDUxMiApOworICAgIF90ZXh0MTZfbWVtc3pfcGdoCT0gKCAoIF90ZXh0MTZfbWVtc3ogKyAxNSApIC8gMTYgKTsKKyAgICBfZGF0YTE2X21lbXN6X3BnaAk9ICggKCBfZGF0YTE2X21lbXN6ICsgMTUgKSAvIDE2ICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvdHJhbnNpdGlvbnMvbGlia2lyLlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvdHJhbnNpdGlvbnMvbGlia2lyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3NmZjYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gvaTM4Ni90cmFuc2l0aW9ucy9saWJraXIuUwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIGxpYmtpcjogYSB0cmFuc2l0aW9uIGxpYnJhcnkgZm9yIC1ES0VFUF9JVF9SRUFMCisgKgorICogTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+CisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmaWxlIGRlZmluZXMgbGlia2lyOiBhbiBpbnRlcmZhY2UgYmV0d2VlbiBleHRlcm5hbCBhbmQKKyAqIGludGVybmFsIGVudmlyb25tZW50cyB3aGVuIC1ES0VFUF9JVF9SRUFMIGlzIHVzZWQsIHNvIHRoYXQgYm90aAorICogaW50ZXJuYWwgYW5kIGV4dGVybmFsIGVudmlyb25tZW50cyBhcmUgaW4gcmVhbCBtb2RlLiAgSXQgZGVhbHMgd2l0aAorICogc3dpdGNoaW5nIGRhdGEgc2VnbWVudHMgYW5kIHRoZSBzdGFjay4gIEl0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcKKyAqIGZ1bmN0aW9uczoKKyAqCisgKiBleHRfdG9fa2lyICYJCXN3aXRjaCBiZXR3ZWVuIGV4dGVybmFsIGFuZCBpbnRlcm5hbCAoa2lyKQorICoga2lyX3RvX2V4dAkJZW52aXJvbm1lbnRzLCBwcmVzZXJ2aW5nIGFsbCBub24tc2VnbWVudAorICoJCQlyZWdpc3RlcnMKKyAqCisgKiBraXJfY2FsbAkJaXNzdWUgYSBjYWxsIHRvIGFuIGludGVybmFsIHJvdXRpbmUgZnJvbSBleHRlcm5hbAorICoJCQljb2RlCisgKgorICogbGlia2lyIGlzIHdyaXR0ZW4gdG8gYXZvaWQgYXNzdW1pbmcgdGhhdCBzZWdtZW50cyBhcmUgYW55dGhpbmcKKyAqIG90aGVyIHRoYW4gb3BhcXVlIGRhdGEgdHlwZXMsIGFuZCBhbHNvIGF2b2lkcyBhc3N1bWluZyB0aGF0IHRoZQorICogc3RhY2sgcG9pbnRlciBpcyAxNi1iaXQuICBUaGlzIHNob3VsZCBlbmFibGUgaXQgdG8gcnVuIGp1c3QgYXMgd2VsbAorICogaW4gMTY6MTYgb3IgMTY6MzIgcHJvdGVjdGVkIG1vZGUgYXMgaW4gcmVhbCBtb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBCcmVha3BvaW50IGZvciB3aGVuIGRlYnVnZ2luZyB1bmRlciBib2NocyAqLworI2RlZmluZSBCT0NIU0JQIHhjaGd3ICVieCwgJWJ4CisKKwkudGV4dAorCS5hcmNoIGkzODYKKwkuc2VjdGlvbiAiLnRleHQxNiIsICJhd3giLCBAcHJvZ2JpdHMKKwkuY29kZTE2CisJCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5pdF9saWJraXIgKHJlYWwtbW9kZSBvciAxNjp4eCBwcm90ZWN0ZWQtbW9kZSBmYXIgY2FsbCkKKyAqCisgKiBJbml0aWFsaXNlIGxpYmtpciByZWFkeSBmb3IgdHJhbnNpdGlvbnMgdG8gdGhlIGtpciBlbnZpcm9ubWVudAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICVjcyA6IC50ZXh0MTYgc2VnbWVudAorICogICAlZHMgOiAuZGF0YTE2IHNlZ21lbnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkuZ2xvYmwJaW5pdF9saWJraXIKK2luaXRfbGlia2lyOgorCS8qIFJlY29yZCBzZWdtZW50IHJlZ2lzdGVycyAqLworCXB1c2h3CSVkcworCXBvcHcJJWNzOmtpcl9kcworCWxyZXQKKwkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleHRfdG9fa2lyIChyZWFsLW1vZGUgb3IgMTY6eHggcHJvdGVjdGVkLW1vZGUgbmVhciBjYWxsKQorICoKKyAqIFN3aXRjaCBmcm9tIGV4dGVybmFsIHN0YWNrIGFuZCBzZWdtZW50IHJlZ2lzdGVycyB0byBpbnRlcm5hbCBzdGFjaworICogYW5kIHNlZ21lbnQgcmVnaXN0ZXJzLiAgJXNzOnNwIGlzIHJlc3RvcmVkIGZyb20gdGhlIHNhdmVkIGtpcl9kcworICogYW5kIGtpcl9zcC4gICVkcywgJWVzLCAlZnMgYW5kICVncyBhcmUgYWxsIHJlc3RvcmVkIGZyb20gdGhlIHNhdmVkCisgKiBraXJfZHMuICBBbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZSBwcmVzZXJ2ZWQuCisgKgorICogJWNzOjAwMDAgbXVzdCBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIHJ1bnRpbWUgaW1hZ2UgY29kZSBzZWdtZW50CisgKiBvbiBlbnRyeS4KKyAqCisgKiBQYXJhbWV0ZXJzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKwkuZ2xvYmwJZXh0X3RvX2tpcgorZXh0X3RvX2tpcjoKKwkvKiBSZWNvcmQgZXh0ZXJuYWwgc2VnbWVudCByZWdpc3RlcnMgKi8KKwltb3Z3CSVkcywgJWNzOmV4dF9kcworCXB1c2h3CSVjcworCXBvcHcJJWRzCS8qIFNldCAlZHMgPSAlY3MgZm9yIGVhc2llciBhY2Nlc3MgdG8gdmFyaWFibGVzICovCisJbW92dwklZXMsICVkczpleHRfZXMKKwltb3Z3CSVmcywgJWRzOmV4dF9mcworCW1vdncJJWdzLCAlZHM6ZXh0X2ZzCisKKwkvKiBQcmVzZXJ2ZSByZWdpc3RlcnMgKi8KKwltb3Z3CSVheCwgJWRzOnNhdmVfYXgKKworCS8qIEV4dHJhY3QgbmVhciByZXR1cm4gYWRkcmVzcyBmcm9tIHN0YWNrICovCisJcG9wdwklZHM6c2F2ZV9yZXRhZGRyCisKKwkvKiBSZWNvcmQgZXh0ZXJuYWwgJXNzOmVzcCAqLworCW1vdncJJXNzLCAlZHM6ZXh0X3NzCisJbW92bAklZXNwLCAlZHM6ZXh0X2VzcAorCisJLyogTG9hZCBpbnRlcm5hbCBzZWdtZW50IHJlZ2lzdGVycyBhbmQgc3RhY2sgcG9pbnRlciAqLworCW1vdncJJWRzOmtpcl9kcywgJWF4CisJbW92dwklYXgsICVzcworCW1vdnp3bAklZHM6a2lyX3NwLCAlZXNwCisJbW92dwklYXgsICVkcworCW1vdncJJWF4LCAlZXMKKwltb3Z3CSVheCwgJWZzCisJbW92dwklYXgsICVncworMToKKworCS8qIFBsYWNlIHJldHVybiBhZGRyZXNzIG9uIG5ldyBzdGFjayAqLworCXB1c2h3CSVjczpzYXZlX3JldGFkZHIKKwkKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgcmV0dXJuICovCisJbW92dwklY3M6c2F2ZV9heCwgJWF4CisJcmV0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBraXJfdG9fZXh0IChyZWFsLW1vZGUgb3IgMTY6eHggcHJvdGVjdGVkLW1vZGUgbmVhciBjYWxsKQorICoKKyAqIFN3aXRjaCBmcm9tIGludGVybmFsIHN0YWNrIGFuZCBzZWdtZW50IHJlZ2lzdGVycyB0byBleHRlcm5hbCBzdGFjaworICogYW5kIHNlZ21lbnQgcmVnaXN0ZXJzLiAgJXNzOiVlc3AgaXMgcmVzdG9yZWQgZnJvbSB0aGUgc2F2ZWQgZXh0X3NzCisgKiBhbmQgZXh0X2VzcC4gIE90aGVyIHNlZ21lbnQgcmVnaXN0ZXJzIGFyZSByZXN0b3JlZCBmcm9tIHRoZQorICogY29ycmVzcG9uZGluZyBsb2NhdGlvbnMuICBBbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZSBwcmVzZXJ2ZWQuCisgKgorICogTm90ZSB0aGF0IGl0IGlzIGFjdHVhbGx5ICVzcyB0aGF0IGlzIHJlY29yZGVkIGFzIGtpcl9kcywgb24gdGhlCisgKiBhc3N1bXB0aW9uIHRoYXQgJXNzID09ICVkcyB3aGVuIGtpcl90b19leHQgaXMgY2FsbGVkLgorICoKKyAqIFBhcmFtZXRlcnM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCS5nbG9ibAlraXJfdG9fZXh0CitraXJfdG9fZXh0OgorCS8qIFJlY29yZCBuZWFyIHJldHVybiBhZGRyZXNzICovCisJcHVzaHcJJWNzCisJcG9wdwklZHMJLyogU2V0ICVkcyA9ICVjcyBmb3IgZWFzaWVyIGFjY2VzcyB0byB2YXJpYWJsZXMgKi8KKwlwb3B3CSVkczpzYXZlX3JldGFkZHIKKwkKKwkvKiBSZWNvcmQgaW50ZXJuYWwgc2VnbWVudCByZWdpc3RlcnMgYW5kICVzcCAqLworCW1vdncJJXNzLCAlZHM6a2lyX2RzCisJbW92dwklc3AsICVkczpraXJfc3AKKworCS8qIExvYWQgZXh0ZXJuYWwgc2VnbWVudCByZWdpc3RlcnMgYW5kIHN0YWNrIHBvaW50ZXIgKi8KKwltb3Z3CSVkczpleHRfc3MsICVzcworCW1vdmwJJWRzOmV4dF9lc3AsICVlc3AKKwltb3Z3CSVkczpleHRfZ3MsICVncworCW1vdncJJWRzOmV4dF9mcywgJWZzCisJbW92dwklZHM6ZXh0X2VzLCAlZXMKKwltb3Z3CSVkczpleHRfZHMsICVkcworCisJLyogUmV0dXJuICovCisJcHVzaHcJJWNzOnNhdmVfcmV0YWRkcgorCXJldAorCQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGtpcl9jYWxsIChyZWFsLW1vZGUgb3IgMTY6eHggcHJvdGVjdGVkLW1vZGUgZmFyIGNhbGwpCisgKgorICogQ2FsbCBhIHNwZWNpZmljIEMgZnVuY3Rpb24gaW4gdGhlIGludGVybmFsIGNvZGUuICBUaGUgcHJvdG90eXBlIG9mCisgKiB0aGUgQyBmdW5jdGlvbiBtdXN0IGJlCisgKiAgIHZvaWQgZnVuY3Rpb24gKCBzdHJ1Y3QgaTM4Nl9hbGxfcmVzZyAqaXg4NiApOyAKKyAqIGl4ODYgd2lsbCBwb2ludCB0byBhIHN0cnVjdCBjb250YWluaW5nIHRoZSByZWFsLW1vZGUgcmVnaXN0ZXJzCisgKiBhdCBlbnRyeSB0byBraXJfY2FsbC4KKyAqCisgKiBBbGwgcmVnaXN0ZXJzIHdpbGwgYmUgcHJlc2VydmVkIGFjcm9zcyBraXJfY2FsbCgpLCB1bmxlc3MgdGhlIEMKKyAqIGZ1bmN0aW9uIGV4cGxpY2l0bHkgb3ZlcndyaXRlcyB2YWx1ZXMgaW4gaXg4Ni4gIEludGVycnVwdCBzdGF0dXMKKyAqIHdpbGwgYWxzbyBiZSBwcmVzZXJ2ZWQuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZnVuY3Rpb24gOiAoMzItYml0KSB2aXJ0dWFsIGFkZHJlc3Mgb2YgQyBmdW5jdGlvbiB0byBjYWxsCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqCXB1c2hsCSRweGVfYXBpX2NhbGwKKyAqCWxjYWxsCSRVTkRJX0NTLCAka2lyX2NhbGwKKyAqCWFkZHcJJDQsICVzcAorICogdG8gY2FsbCBpbiB0byB0aGUgQyBmdW5jdGlvbgorICogICAgICB2b2lkIHB4ZV9hcGlfY2FsbCAoIHN0cnVjdCBpMzg2X2FsbF9yZWdzICppeDg2ICk7CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKwkuZ2xvYmwJa2lyX2NhbGwKK2tpcl9jYWxsOgorCS8qIFByZXNlcnZlIGZsYWdzLiAgTXVzdCBkbyB0aGlzIGJlZm9yZSBhbnkgb3BlcmF0aW9uIHRoYXQgbWF5CisJICogYWZmZWN0IGZsYWdzLgorCSAqLworCXB1c2hmbAorCXBvcGwJJWNzOnNhdmVfZmxhZ3MKKworCS8qIERpc2FibGUgaW50ZXJydXB0cy4gIFdlIGRvIGZ1bm55IHRoaW5ncyB3aXRoIHRoZSBzdGFjaywgYW5kCisJICogd2UncmUgbm90IHJlLWVudHJhbnQuCisJICovCisJY2xpCisJCQorCS8qIEV4dHJhY3QgYWRkcmVzcyBvZiBpbnRlcm5hbCByb3V0aW5lIGZyb20gc3RhY2suICBXZSBtdXN0IGRvCisJICogdGhpcyB3aXRob3V0IHVzaW5nICglYnApLCBiZWNhdXNlIHdlIG1heSBiZSBjYWxsZWQgd2l0aAorCSAqIGVpdGhlciBhIDE2LWJpdCBvciBhIDMyLWJpdCBzdGFjayBzZWdtZW50LgorCSAqLworCXBvcGwJJWNzOnNhdmVfcmV0YWRkcgkvKiBTY3JhdGNoIGxvY2F0aW9uICovCisJcG9wbAklY3M6c2F2ZV9mdW5jdGlvbgorCXN1YmwJJDgsICVlc3AJCS8qIFJlc3RvcmUgJWVzcCAqLworCQorCS8qIFN3aXRjaCB0byBpbnRlcm5hbCBzdGFjay4gIE5vdGUgdGhhdCB0aGUgZXh0ZXJuYWwgc3RhY2sgaXMKKwkgKiBpbmFjY2Vzc2libGUgb25jZSB3ZSdyZSBydW5uaW5nIGludGVybmFsbHkgKHNpbmNlIHdlIGhhdmUKKwkgKiBubyBjb25jZXB0IG9mIDQ4LWJpdCBmYXIgcG9pbnRlcnMpCisJICovCisJY2FsbAlleHRfdG9fa2lyCisJCisJLyogU3RvcmUgZXh0ZXJuYWwgcmVnaXN0ZXJzIG9uIGludGVybmFsIHN0YWNrICovCisJcHVzaGwJJWNzOnNhdmVfZmxhZ3MKKwlwdXNoYWwKKwlwdXNobAklY3M6ZXh0X2ZzX2FuZF9ncworCXB1c2hsCSVjczpleHRfZHNfYW5kX2VzCisJcHVzaGwJJWNzOmV4dF9jc19hbmRfc3MKKworCS8qIFB1c2ggJml4ODYgb24gc3RhY2sgYW5kIGNhbGwgZnVuY3Rpb24gKi8KKwlzdGkKKwlwdXNobAklZXNwCisJZGF0YTMyIGNhbGwgKiVjczpzYXZlX2Z1bmN0aW9uCisJcG9wbAklZWF4IC8qIGRpc2NhcmQgKi8KKwkKKwkvKiBSZXN0b3JlIGV4dGVybmFsIHJlZ2lzdGVycyBmcm9tIGludGVybmFsIHN0YWNrICovCisJcG9wbAklY3M6ZXh0X2NzX2FuZF9zcworCXBvcGwJJWNzOmV4dF9kc19hbmRfZXMKKwlwb3BsCSVjczpleHRfZnNfYW5kX2dzCisJcG9wYWwKKwlwb3BsCSVjczpzYXZlX2ZsYWdzCisKKwkvKiBTd2l0Y2ggdG8gZXh0ZXJuYWwgc3RhY2sgKi8KKwljYWxsCWtpcl90b19leHQKKworCS8qIFJlc3RvcmUgZmxhZ3MgKi8KKwlwdXNobAklY3M6c2F2ZV9mbGFncworCXBvcGZsCisKKwkvKiBSZXR1cm4gKi8KKwlscmV0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdG9yZWQgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHN0YWNrIGFuZCBzZWdtZW50IHJlZ2lzdGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCQorZXh0X2NzX2FuZF9zczoJCitleHRfY3M6CQkud29yZCAwCitleHRfc3M6CQkud29yZCAwCitleHRfZHNfYW5kX2VzOgkKK2V4dF9kczoJCS53b3JkIDAKK2V4dF9lczoJCS53b3JkIDAKK2V4dF9mc19hbmRfZ3M6CQorZXh0X2ZzOgkJLndvcmQgMAorZXh0X2dzOgkJLndvcmQgMAorZXh0X2VzcDoJLmxvbmcgMAorCisJCS5nbG9ibCBraXJfZHMKK2tpcl9kczoJCS53b3JkIDAKKwkJLmdsb2JsIGtpcl9zcAora2lyX3NwOgkJLndvcmQgX2VzdGFjaworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVtcG9yYXJ5IHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc2F2ZV9heDoJLndvcmQgMAorc2F2ZV9yZXRhZGRyOgkubG9uZyAwCitzYXZlX2ZsYWdzOgkubG9uZyAwCitzYXZlX2Z1bmN0aW9uOgkubG9uZyAwCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvdHJhbnNpdGlvbnMvbGlicG0uUyBiL2dweGUvc3JjL2FyY2gvaTM4Ni90cmFuc2l0aW9ucy9saWJwbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL2kzODYvdHJhbnNpdGlvbnMvbGlicG0uUwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC9pMzg2L3RyYW5zaXRpb25zL2xpYnJtLlMgYi9ncHhlL3NyYy9hcmNoL2kzODYvdHJhbnNpdGlvbnMvbGlicm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI3ZWYzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3RyYW5zaXRpb25zL2xpYnJtLlMKQEAgLTAsMCArMSw1ODEgQEAKKy8qCisgKiBsaWJybTogYSBsaWJyYXJ5IGZvciBpbnRlcmZhY2luZyB0byByZWFsLW1vZGUgY29kZQorICoKKyAqIE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICkKKworLyogRHJhZyBpbiBsb2NhbCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImxpYnJtLmgiCisKKy8qIEZvciBzd2l0Y2hlcyB0by9mcm9tIHByb3RlY3RlZCBtb2RlICovCisjZGVmaW5lIENSMF9QRSAxCisKKy8qIFNpemUgb2YgdmFyaW91cyBDIGRhdGEgc3RydWN0dXJlcyAqLworI2RlZmluZSBTSVpFT0ZfSTM4Nl9TRUdfUkVHUwkxMgorI2RlZmluZSBTSVpFT0ZfSTM4Nl9SRUdTCTMyCisjZGVmaW5lIFNJWkVPRl9SRUFMX01PREVfUkVHUwkoIFNJWkVPRl9JMzg2X1NFR19SRUdTICsgU0laRU9GX0kzODZfUkVHUyApCisjZGVmaW5lIFNJWkVPRl9JMzg2X0ZMQUdTCTQKKyNkZWZpbmUgU0laRU9GX0kzODZfQUxMX1JFR1MJKCBTSVpFT0ZfUkVBTF9NT0RFX1JFR1MgKyBTSVpFT0ZfSTM4Nl9GTEFHUyApCisJCisJLmFyY2ggaTM4NgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2xvYmFsIGRlc2NyaXB0b3IgdGFibGUKKyAqCisgKiBDYWxsIGluaXRfbGlicm0gdG8gc2V0IHVwIHRoZSBHRFQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGFueQorICogcHJvdGVjdGVkLW1vZGUgY29kZS4KKyAqCisgKiBEZWZpbmUgRkxBVFRFTl9SRUFMX01PREUgaWYgeW91IHdhbnQgdG8gdXNlIHNvLWNhbGxlZCAiZmxhdCByZWFsCisgKiBtb2RlIiB3aXRoIDRHQiBsaW1pdHMgaW5zdGVhZC4KKyAqCisgKiBOT1RFOiBUaGlzIG11c3QgYmUgbG9jYXRlZCBiZWZvcmUgcHJvdF90b19yZWFsLCBvdGhlcndpc2UgZ2FzCisgKiB0aHJvd3MgYSAiY2FuJ3QgaGFuZGxlIG5vbiBhYnNvbHV0ZSBzZWdtZW50IGluIGBsam1wJyIgZXJyb3IgZHVlIHRvCisgKiBub3Qga25vd2luZyB0aGUgdmFsdWUgb2YgUkVBTF9DUyB3aGVuIHRoZSBsam1wIGlzIGVuY291bnRlcmVkLgorICoKKyAqIE5vdGUgYWxzbyB0aGF0IHB1dHRpbmcgIi53b3JkIGdkdF9lbmQgLSBnZHQgLSAxIiBkaXJlY3RseSBpbnRvCisgKiBnZHRfbGltaXQsIHJhdGhlciB0aGFuIGdvaW5nIHZpYSBnZHRfbGVuZ3RoLCB3aWxsIGFsc28gcHJvZHVjZSB0aGUKKyAqICJub24gYWJzb2x1dGUgc2VnbWVudCIgZXJyb3IuICBUaGlzIGlzIG1vc3QgcHJvYmFibHkgYSBidWcgaW4gZ2FzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCQorI2lmZGVmIEZMQVRURU5fUkVBTF9NT0RFCisjZGVmaW5lIFJNX0xJTUlUXzE2XzE5X19BVkxfX1NJWkVfX0dSQU5VTEFSSVRZIDB4OGYKKyNlbHNlCisjZGVmaW5lIFJNX0xJTUlUXzE2XzE5X19BVkxfX1NJWkVfX0dSQU5VTEFSSVRZIDB4MDAKKyNlbmRpZgorCS5zZWN0aW9uICIuZGF0YTE2IiwgImF3IiwgQHByb2diaXRzCisJLmFsaWduIDE2CitnZHQ6CitnZHRyOgkJLyogVGhlIGZpcnN0IEdEVCBlbnRyeSBpcyB1bnVzZWQsIHRoZSBHRFRSIGNhbiBmaXQgaGVyZS4gKi8KK2dkdF9saW1pdDoJCS53b3JkIGdkdF9sZW5ndGggLSAxCitnZHRfYmFzZToJCS5sb25nIDAKKwkJCS53b3JkIDAgLyogcGFkZGluZyAqLworCisJLm9yZwlnZHQgKyBWSVJUVUFMX0NTLCAwCit2aXJ0dWFsX2NzOgkvKiAzMiBiaXQgcHJvdGVjdGVkIG1vZGUgY29kZSBzZWdtZW50LCB2aXJ0dWFsIGFkZHJlc3NlcyAqLworCS53b3JkCTB4ZmZmZiwgMAorCS5ieXRlCTAsIDB4OWYsIDB4Y2YsIDAKKworCS5vcmcJZ2R0ICsgVklSVFVBTF9EUywgMAordmlydHVhbF9kczoJLyogMzIgYml0IHByb3RlY3RlZCBtb2RlIGRhdGEgc2VnbWVudCwgdmlydHVhbCBhZGRyZXNzZXMgKi8KKwkud29yZAkweGZmZmYsIDAKKwkuYnl0ZQkwLCAweDkzLCAweGNmLCAwCisJCisJLm9yZwlnZHQgKyBQSFlTSUNBTF9DUywgMAorcGh5c2ljYWxfY3M6CS8qIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZSBjb2RlIHNlZ21lbnQsIHBoeXNpY2FsIGFkZHJlc3NlcyAqLworCS53b3JkCTB4ZmZmZiwgMAorCS5ieXRlCTAsIDB4OWYsIDB4Y2YsIDAKKworCS5vcmcJZ2R0ICsgUEhZU0lDQUxfRFMsIDAKK3BoeXNpY2FsX2RzOgkvKiAzMiBiaXQgcHJvdGVjdGVkIG1vZGUgZGF0YSBzZWdtZW50LCBwaHlzaWNhbCBhZGRyZXNzZXMgKi8KKwkud29yZAkweGZmZmYsIDAKKwkuYnl0ZQkwLCAweDkzLCAweGNmLCAwCQorCisJLm9yZwlnZHQgKyBSRUFMX0NTLCAwCityZWFsX2NzOiAJLyogMTYgYml0IHJlYWwgbW9kZSBjb2RlIHNlZ21lbnQgKi8KKwkud29yZAkweGZmZmYsIDAKKwkuYnl0ZQkwLCAweDliLCBSTV9MSU1JVF8xNl8xOV9fQVZMX19TSVpFX19HUkFOVUxBUklUWSwgMAorCisJLm9yZwlnZHQgKyBSRUFMX0RTCQorcmVhbF9kczoJLyogMTYgYml0IHJlYWwgbW9kZSBkYXRhIHNlZ21lbnQgKi8KKwkud29yZAkweGZmZmYsIDAKKwkuYnl0ZQkwLCAweDkzLCBSTV9MSU1JVF8xNl8xOV9fQVZMX19TSVpFX19HUkFOVUxBUklUWSwgMAorCQorZ2R0X2VuZDoKKwkuZXF1CWdkdF9sZW5ndGgsIGdkdF9lbmQgLSBnZHQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluaXRfbGlicm0gKHJlYWwtbW9kZSBmYXIgY2FsbCwgMTYtYml0IHJlYWwtbW9kZSBmYXIgcmV0dXJuIGFkZHJlc3MpCisgKgorICogSW5pdGlhbGlzZSB0aGUgR0RUIHJlYWR5IGZvciB0cmFuc2l0aW9ucyB0byBwcm90ZWN0ZWQgbW9kZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAlY3MgOiAudGV4dDE2IHNlZ21lbnQKKyAqICAgJWRzIDogLmRhdGExNiBzZWdtZW50CisgKiAgICVlZGkgOiBQaHlzaWNhbCBiYXNlIG9mIHByb3RlY3RlZC1tb2RlIGNvZGUgKHZpcnRfb2Zmc2V0KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCisJLmNvZGUxNgorCS5nbG9ibCBpbml0X2xpYnJtCitpbml0X2xpYnJtOgorCS8qIFByZXNlcnZlIHJlZ2lzdGVycyAqLworCXB1c2hsCSVlYXgKKwlwdXNobAklZWJ4CisKKwkvKiBTdG9yZSBfdmlydF9vZmZzZXQgYW5kIHNldCB1cCB2aXJ0dWFsX2NzIGFuZCB2aXJ0dWFsX2RzIHNlZ21lbnRzICovCisJbW92bAklZWRpLCAlZWF4CisJbW92dwkkdmlydHVhbF9jcywgJWJ4CisJY2FsbAlzZXRfc2VnX2Jhc2UKKwltb3Z3CSR2aXJ0dWFsX2RzLCAlYngKKwljYWxsCXNldF9zZWdfYmFzZQkKKwltb3ZsCSVlZGksIF92aXJ0X29mZnNldAorCisJLyogTmVnYXRlIHZpcnRfb2Zmc2V0ICovCisJbmVnbAklZWRpCisJCQorCS8qIFN0b3JlIHJtX2NzIGFuZCBfdGV4dDE2LCBzZXQgdXAgcmVhbF9jcyBzZWdtZW50ICovCisJeG9ybAklZWF4LCAlZWF4CisJbW92dwklY3MsICVheAorCW1vdncJJWF4LCBybV9jcworCXNobGwJJDQsICVlYXgKKwltb3Z3CSRyZWFsX2NzLCAlYngKKwljYWxsCXNldF9zZWdfYmFzZQorCWFkZHIzMiBsZWFsCSglZWF4LCAlZWRpKSwgJWVieAorCW1vdmwJJWVieCwgX3RleHQxNgorCisJLyogU3RvcmUgcm1fZHMgYW5kIF9kYXRhMTYsIHNldCB1cCByZWFsX2RzIHNlZ21lbnQgKi8KKwl4b3JsCSVlYXgsICVlYXgKKwltb3Z3CSVkcywgJWF4CisJbW92dwklYXgsICVjczpybV9kcworCXNobGwJJDQsICVlYXgKKwltb3Z3CSRyZWFsX2RzLCAlYngKKwljYWxsCXNldF9zZWdfYmFzZQorCWFkZHIzMiBsZWFsCSglZWF4LCAlZWRpKSwgJWVieAorCW1vdmwJJWVieCwgX2RhdGExNgorCisJLyogU2V0IEdEVCBhbmQgSURUIGJhc2UgKi8KKwltb3ZsCSVlYXgsIGdkdF9iYXNlCisJYWRkbAkkZ2R0LCBnZHRfYmFzZQorCWNhbGwJaWR0X2luaXQKKworCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJbmVnbAklZWRpCisJcG9wbAklZWJ4CisJcG9wbAklZWF4CisJbHJldAorCisJLnNlY3Rpb24gIi50ZXh0MTYiLCAiYXgiLCBAcHJvZ2JpdHMKKwkuY29kZTE2CisJLndlYWsgaWR0X2luaXQKK3NldF9zZWdfYmFzZToKKzE6CW1vdncJJWF4LCAyKCVieCkKKwlyb3JsCSQxNiwgJWVheAorCW1vdmIJJWFsLCA0KCVieCkKKwltb3ZiCSVhaCwgNyglYngpCisJcm9sbAkkMTYsICVlYXgKK2lkdF9pbml0OiAvKiBSZXVzZSB0aGUgcmV0dXJuIG9wY29kZSBoZXJlICovCisJcmV0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZWFsX3RvX3Byb3QgKHJlYWwtbW9kZSBuZWFyIGNhbGwsIDMyLWJpdCB2aXJ0dWFsIHJldHVybiBhZGRyZXNzKQorICoKKyAqIFN3aXRjaCBmcm9tIDE2LWJpdCByZWFsLW1vZGUgdG8gMzItYml0IHByb3RlY3RlZCBtb2RlIHdpdGggdmlydHVhbAorICogYWRkcmVzc2VzLiAgVGhlIHJlYWwtbW9kZSAlc3M6c3AgaXMgc3RvcmVkIGluIHJtX3NzIGFuZCBybV9zcCwgYW5kCisgKiB0aGUgcHJvdGVjdGVkLW1vZGUgJWVzcCBpcyByZXN0b3JlZCBmcm9tIHRoZSBzYXZlZCBwbV9lc3AuCisgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gIEFsbCBvdGhlciByZWdpc3RlcnMgbWF5IGJlIGRlc3Ryb3llZC4KKyAqCisgKiBUaGUgcmV0dXJuIGFkZHJlc3MgZm9yIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgMzItYml0IHZpcnR1YWwKKyAqIGFkZHJlc3MuCisgKgorICogUGFyYW1ldGVyczogCisgKiAgICVlY3ggOiBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZSBmcm9tIFJNIHN0YWNrIHRvIFBNIHN0YWNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCisJLmNvZGUxNgorcmVhbF90b19wcm90OgorCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIG91ciBkYXRhIHNlZ21lbnQgYXZhaWxhYmxlICovCisJbW92dwklY3M6cm1fZHMsICVheAorCW1vdncJJWF4LCAlZHMKKwkKKwkvKiBBZGQgX3ZpcnRfb2Zmc2V0LCBfdGV4dDE2IGFuZCBfZGF0YTE2IHRvIHN0YWNrIHRvIGJlCisJICogY29waWVkLCBhbmQgYWxzbyBjb3B5IHRoZSByZXR1cm4gYWRkcmVzcy4KKwkgKi8KKwlwdXNobAlfdmlydF9vZmZzZXQKKwlwdXNobAlfdGV4dDE2CisJcHVzaGwJX2RhdGExNgorCWFkZHcJJDE2LCAlY3ggLyogJWVjeCBtdXN0IGJlIGxlc3MgdGhhbiA2NGtCIGFueXdheSAqLworCQorCS8qIFJlYWwtbW9kZSAlc3M6JXNwID0+ICVlYnA6JWVkeCBhbmQgdmlydHVhbCBhZGRyZXNzID0+ICVlc2kgKi8KKwl4b3JsCSVlYnAsICVlYnAKKwltb3Z3CSVzcywgJWJwCisJbW92endsCSVzcCwgJWVkeAorCW1vdmwJJWVicCwgJWVheAorCXNobGwJJDQsICVlYXgKKwlhZGRyMzIgbGVhbCAoJWVheCwlZWR4KSwgJWVzaQorCXN1YmwJX3ZpcnRfb2Zmc2V0LCAlZXNpCisKKwkvKiBTd2l0Y2ggdG8gcHJvdGVjdGVkIG1vZGUgKi8KKwljbGkKKwlkYXRhMzIgbGdkdCBnZHRyCisJZGF0YTMyIGxpZHQgaWR0cgorCW1vdmwJJWNyMCwgJWVheAorCW9yYgkkQ1IwX1BFLCAlYWwKKwltb3ZsCSVlYXgsICVjcjAKKwlkYXRhMzIgbGptcAkkVklSVFVBTF9DUywgJDFmCisJLnNlY3Rpb24gIi50ZXh0IiwgImF4IiwgQHByb2diaXRzCisJLmNvZGUzMgorMToKKwkvKiBTZXQgdXAgcHJvdGVjdGVkLW1vZGUgZGF0YSBzZWdtZW50cyBhbmQgc3RhY2sgcG9pbnRlciAqLworCW1vdncJJFZJUlRVQUxfRFMsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJWVzCisJbW92dwklYXgsICVmcworCW1vdncJJWF4LCAlZ3MKKwltb3Z3CSVheCwgJXNzCisJbW92bAlwbV9lc3AsICVlc3AKKworCS8qIFJlY29yZCByZWFsLW1vZGUgJXNzOnNwIChhZnRlciByZW1vdmFsIG9mIGRhdGEpICovCisJbW92dwklYnAsIHJtX3NzCisJYWRkbAklZWN4LCAlZWR4CisJbW92dwklZHgsIHJtX3NwCisKKwkvKiBNb3ZlIGRhdGEgZnJvbSBSTSBzdGFjayB0byBQTSBzdGFjayAqLworCXN1YmwJJWVjeCwgJWVzcAorCW1vdmwJJWVzcCwgJWVkaQorCXJlcCBtb3ZzYgorCisJLyogUHVibGlzaCB2aXJ0X29mZnNldCwgdGV4dDE2IGFuZCBkYXRhMTYgZm9yIFBNIGNvZGUgdG8gdXNlICovCisJcG9wbAlkYXRhMTYKKwlwb3BsCXRleHQxNgorCXBvcGwJdmlydF9vZmZzZXQKKworCS8qIFJldHVybiB0byB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlyZXQKKworCS8qIERlZmF1bHQgSURUUiB3aXRoIG5vIGludGVycnVwdHMgKi8KKwkuc2VjdGlvbiAiLmRhdGExNiIsICJhdyIsIEBwcm9nYml0cworCS53ZWFrIGlkdHIKK2lkdHI6CitybV9pZHRyOgorCS53b3JkIDB4ZmZmZiAvKiBsaW1pdCAqLworCS5sb25nIDAgLyogYmFzZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJvdF90b19yZWFsIChwcm90ZWN0ZWQtbW9kZSBuZWFyIGNhbGwsIDMyLWJpdCByZWFsLW1vZGUgcmV0dXJuIGFkZHJlc3MpCisgKgorICogU3dpdGNoIGZyb20gMzItYml0IHByb3RlY3RlZCBtb2RlIHdpdGggdmlydHVhbCBhZGRyZXNzZXMgdG8gMTYtYml0CisgKiByZWFsIG1vZGUuICBUaGUgcHJvdGVjdGVkLW1vZGUgJWVzcCBpcyBzdG9yZWQgaW4gcG1fZXNwIGFuZCB0aGUKKyAqIHJlYWwtbW9kZSAlc3M6c3AgaXMgcmVzdG9yZWQgZnJvbSB0aGUgc2F2ZWQgcm1fc3MgYW5kIHJtX3NwLiAgVGhlCisgKiBoaWdoIHdvcmQgb2YgdGhlIHJlYWwtbW9kZSAlZXNwIGlzIHNldCB0byB6ZXJvLiAgQWxsIHJlYWwtbW9kZSBkYXRhCisgKiBzZWdtZW50IHJlZ2lzdGVycyBhcmUgbG9hZGVkIGZyb20gdGhlIHNhdmVkIHJtX2RzLiAgSW50ZXJydXB0cyBhcmUKKyAqICpub3QqIGVuYWJsZWQsIHNpbmNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgcHJvdF90b19yZWFsIGluIGFuCisgKiBJU1IuICBBbGwgb3RoZXIgcmVnaXN0ZXJzIG1heSBiZSBkZXN0cm95ZWQuCisgKgorICogVGhlIHJldHVybiBhZGRyZXNzIGZvciB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBhIDMyLWJpdCAoc2ljKQorICogcmVhbC1tb2RlIG9mZnNldCB3aXRoaW4gLmNvZGUxNi4KKyAqCisgKiBQYXJhbWV0ZXJzOiAKKyAqICAgJWVjeCA6IG51bWJlciBvZiBieXRlcyB0byBtb3ZlIGZyb20gUE0gc3RhY2sgdG8gUk0gc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi50ZXh0IiwgImF4IiwgQHByb2diaXRzCisJLmNvZGUzMgorcHJvdF90b19yZWFsOgorCS8qIEFkZCByZXR1cm4gYWRkcmVzcyB0byBkYXRhIHRvIGJlIG1vdmVkIHRvIFJNIHN0YWNrICovCisJYWRkbAkkNCwgJWVjeAorCQorCS8qIFJlYWwtbW9kZSAlc3M6c3AgPT4gJWVicDplZHggYW5kIHZpcnR1YWwgYWRkcmVzcyA9PiAlZWRpICovCisJbW92endsCXJtX3NzLCAlZWJwCisJbW92endsCXJtX3NwLCAlZWR4CisJc3VibAklZWN4LCAlZWR4CisJbW92bAklZWJwLCAlZWF4CisJc2hsbAkkNCwgJWVheAorCWxlYWwJKCVlYXgsJWVkeCksICVlZGkKKwlzdWJsCXZpcnRfb2Zmc2V0LCAlZWRpCisJCisJLyogTW92ZSBkYXRhIGZyb20gUE0gc3RhY2sgdG8gUk0gc3RhY2sgKi8KKwltb3ZsCSVlc3AsICVlc2kKKwlyZXAgbW92c2IKKwkKKwkvKiBSZWNvcmQgcHJvdGVjdGVkLW1vZGUgJWVzcCAoYWZ0ZXIgcmVtb3ZhbCBvZiBkYXRhKSAqLworCW1vdmwJJWVzaSwgcG1fZXNwCisKKwkvKiBMb2FkIHJlYWwtbW9kZSBzZWdtZW50IGxpbWl0cyAqLworCW1vdncJJFJFQUxfRFMsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJWVzCisJbW92dwklYXgsICVmcworCW1vdncJJWF4LCAlZ3MKKwltb3Z3CSVheCwgJXNzCisJbGptcAkkUkVBTF9DUywgJDFmCisJLnNlY3Rpb24gIi50ZXh0MTYiLCAiYXgiLCBAcHJvZ2JpdHMKKwkuY29kZTE2CisxOgorCS8qIFN3aXRjaCB0byByZWFsIG1vZGUgKi8KKwltb3ZsCSVjcjAsICVlYXgKKwlhbmRiCSQwIUNSMF9QRSwgJWFsCisJbW92bAklZWF4LCAlY3IwCisJbGptcAkqcDJyX2p1bXBfdmVjdG9yCitwMnJfanVtcF90YXJnZXQ6CisKKwkvKiBTZXQgdXAgcmVhbC1tb2RlIGRhdGEgc2VnbWVudHMgYW5kIHN0YWNrIHBvaW50ZXIgKi8KKwltb3Z3CSVjczpybV9kcywgJWF4CisJbW92dwklYXgsICVkcworCW1vdncJJWF4LCAlZXMKKwltb3Z3CSVheCwgJWZzCisJbW92dwklYXgsICVncworCW1vdncJJWJwLCAlc3MKKwltb3ZsCSVlZHgsICVlc3AKKworCS8qIFJlc2V0IElEVFIgdG8gdGhlIHJlYWwtbW9kZSBkZWZhdWx0cyAqLworCWRhdGEzMiBsaWR0IHJtX2lkdHIKKworCS8qIFJldHVybiB0byByZWFsLW1vZGUgYWRkcmVzcyAqLworCWRhdGEzMiByZXQKKworCisJLyogUmVhbC1tb2RlIGNvZGUgYW5kIGRhdGEgc2VnbWVudHMuICBBc3NpZ25lZCBieSB0aGUgY2FsbCB0bworCSAqIGluaXRfbGlicm0uICBybV9jcyBkb3VibGVzIGFzIHRoZSBzZWdtZW50IHBhcnQgb2YgdGhlIGp1bXAKKwkgKiB2ZWN0b3IgdXNlZCBieSBwcm90X3RvX3JlYWwuICBybV9kcyBpcyBsb2NhdGVkIGluIC50ZXh0MTYKKwkgKiByYXRoZXIgdGhhbiAuZGF0YTE2IGJlY2F1c2UgY29kZSBuZWVkcyB0byBiZSBhYmxlIHRvIGxvY2F0ZQorCSAqIHRoZSBkYXRhIHNlZ21lbnQuCisJICovCisJLnNlY3Rpb24gIi5kYXRhMTYiLCAiYXciLCBAcHJvZ2JpdHMKK3Aycl9qdW1wX3ZlY3RvcjoKKwkud29yZAlwMnJfanVtcF90YXJnZXQKKwkuZ2xvYmwgcm1fY3MKK3JtX2NzOgkud29yZCAwCisJLmdsb2JsIHJtX2RzCisJLnNlY3Rpb24gIi50ZXh0MTYuZGF0YSIsICJhdyIsIEBwcm9nYml0cworcm1fZHM6CS53b3JkIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHByb3RfY2FsbCAocmVhbC1tb2RlIGZhciBjYWxsLCAxNi1iaXQgcmVhbC1tb2RlIGZhciByZXR1cm4gYWRkcmVzcykKKyAqCisgKiBDYWxsIGEgc3BlY2lmaWMgQyBmdW5jdGlvbiBpbiB0aGUgcHJvdGVjdGVkLW1vZGUgY29kZS4gIFRoZQorICogcHJvdG90eXBlIG9mIHRoZSBDIGZ1bmN0aW9uIG11c3QgYmUKKyAqICAgdm9pZCBmdW5jdGlvbiAoIHN0cnVjdCBpMzg2X2FsbF9yZWdzICppeDg2ICk7IAorICogaXg4NiB3aWxsIHBvaW50IHRvIGEgc3RydWN0IGNvbnRhaW5pbmcgdGhlIHJlYWwtbW9kZSByZWdpc3RlcnMKKyAqIGF0IGVudHJ5IHRvIHByb3RfY2FsbC4gIAorICoKKyAqIEFsbCByZWdpc3RlcnMgd2lsbCBiZSBwcmVzZXJ2ZWQgYWNyb3NzIHByb3RfY2FsbCgpLCB1bmxlc3MgdGhlIEMKKyAqIGZ1bmN0aW9uIGV4cGxpY2l0bHkgb3ZlcndyaXRlcyB2YWx1ZXMgaW4gaXg4Ni4gIEludGVycnVwdCBzdGF0dXMKKyAqIGFuZCBHRFQgd2lsbCBhbHNvIGJlIHByZXNlcnZlZC4gIEdhdGUgQTIwIHdpbGwgYmUgZW5hYmxlZC4KKyAqCisgKiBOb3RlIHRoYXQgcHJvdF9jYWxsKCkgZG9lcyBub3QgcmVseSBvbiB0aGUgcmVhbC1tb2RlIHN0YWNrCisgKiByZW1haW5pbmcgaW50YWN0IGluIG9yZGVyIHRvIHJldHVybiwgc2luY2UgZXZlcnl0aGluZyByZWxldmFudCBpcworICogY29waWVkIHRvIHRoZSBwcm90ZWN0ZWQtbW9kZSBzdGFjayBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWxsLgorICogSW4gcGFydGljdWxhciwgdGhpcyBtZWFucyB0aGF0IGEgcmVhbC1tb2RlIHByZWZpeCBjYW4gbWFrZSBhIGNhbGwKKyAqIHRvIG1haW4oKSB3aGljaCB3aWxsIHJldHVybiBjb3JyZWN0bHkgZXZlbiBpZiB0aGUgcHJlZml4J3Mgc3RhY2sKKyAqIGdldHMgdmFwb3VyaXNlZCBkdXJpbmcgdGhlIEV0aGVyYm9vdCBydW4uICAoVGhlIHByZWZpeCBjYW5ub3QgcmVseQorICogb24gYW55dGhpbmcgZWxzZSBvbiB0aGUgc3RhY2sgYmVpbmcgcHJlc2VydmVkLCBzbyBzaG91bGQgbW92ZSBhbnkKKyAqIGNyaXRpY2FsIGRhdGEgdG8gcmVnaXN0ZXJzIGJlZm9yZSBjYWxsaW5nIG1haW4oKSkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgZnVuY3Rpb24gOiB2aXJ0dWFsIGFkZHJlc3Mgb2YgcHJvdGVjdGVkLW1vZGUgZnVuY3Rpb24gdG8gY2FsbAorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKglwdXNobAkkcHhlX2FwaV9jYWxsCisgKgljYWxsCXByb3RfY2FsbAorICoJYWRkdwkkNCwgJXNwCisgKiB0byBjYWxsIGluIHRvIHRoZSBDIGZ1bmN0aW9uCisgKiAgICAgIHZvaWQgcHhlX2FwaV9jYWxsICggc3RydWN0IGkzODZfYWxsX3JlZ3MgKml4ODYgKTsKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2RlZmluZSBQQ19PRkZTRVRfR0RUICggMCApCisjZGVmaW5lIFBDX09GRlNFVF9JRFQgKCBQQ19PRkZTRVRfR0RUICsgOCAvKiBwYWQgdG8gOCB0byBrZWVwIGFsaWdubWVudCAqLyApCisjZGVmaW5lIFBDX09GRlNFVF9JWDg2ICggUENfT0ZGU0VUX0lEVCArIDggLyogcGFkIHRvIDggdG8ga2VlcCBhbGlnbm1lbnQgKi8gKQorI2RlZmluZSBQQ19PRkZTRVRfUkVUQUREUiAoIFBDX09GRlNFVF9JWDg2ICsgU0laRU9GX0kzODZfQUxMX1JFR1MgKQorI2RlZmluZSBQQ19PRkZTRVRfRlVOQ1RJT04gKCBQQ19PRkZTRVRfUkVUQUREUiArIDQgKQorI2RlZmluZSBQQ19PRkZTRVRfRU5EICggUENfT0ZGU0VUX0ZVTkNUSU9OICsgNCApCisKKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworCS5jb2RlMTYKKwkuZ2xvYmwgcHJvdF9jYWxsCitwcm90X2NhbGw6CisJLyogUHJlc2VydmUgcmVnaXN0ZXJzLCBmbGFncyBhbmQgR0RUIG9uIGV4dGVybmFsIFJNIHN0YWNrICovCisJcHVzaGZsCisJcHVzaGFsCisJcHVzaHcJJWdzCisJcHVzaHcJJWZzCisJcHVzaHcJJWVzCisJcHVzaHcJJWRzCisJcHVzaHcJJXNzCisJcHVzaHcJJWNzCisJc3VidwkkMTYsICVzcAorCW1vdncJJXNwLCAlYnAKKwlzaWR0CTgoJWJwKQorCXNnZHQJKCVicCkKKworCS8qIEZvciBzYW5pdHkncyBzYWtlLCBjbGVhciB0aGUgZGlyZWN0aW9uIGZsYWcgYXMgc29vbiBhcyBwb3NzaWJsZSAqLworCWNsZAorCisJLyogU3dpdGNoIHRvIHByb3RlY3RlZCBtb2RlIGFuZCBtb3ZlIHJlZ2lzdGVyIGR1bXAgdG8gUE0gc3RhY2sgKi8KKwltb3ZsCSRQQ19PRkZTRVRfRU5ELCAlZWN4CisJcHVzaGwJJDFmCisJam1wCXJlYWxfdG9fcHJvdAorCS5zZWN0aW9uICIudGV4dCIsICJheCIsIEBwcm9nYml0cworCS5jb2RlMzIKKzE6CisJLyogU2V0IHVwIGVudmlyb25tZW50IGV4cGVjdGVkIGJ5IEMgY29kZSAqLworCWNhbGwJZ2F0ZUEyMF9zZXQKKworCS8qIENhbGwgZnVuY3Rpb24gKi8KKwlsZWFsCVBDX09GRlNFVF9JWDg2KCVlc3ApLCAlZWF4CisJcHVzaGwJJWVheAorCWNhbGwJKihQQ19PRkZTRVRfRlVOQ1RJT04rNCkoJWVzcCkKKwlwb3BsCSVlYXggLyogZGlzY2FyZCAqLworCisJLyogU3dpdGNoIHRvIHJlYWwgbW9kZSBhbmQgbW92ZSByZWdpc3RlciBkdW1wIGJhY2sgdG8gUk0gc3RhY2sgKi8KKwltb3ZsCSRQQ19PRkZTRVRfRU5ELCAlZWN4CisJcHVzaGwJJDFmCisJam1wCXByb3RfdG9fcmVhbAorCS5zZWN0aW9uICIudGV4dDE2IiwgImF4IiwgQHByb2diaXRzCisJLmNvZGUxNgorMToJCisJLyogUmVsb2FkIEdEVCBhbmQgSURULCByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZmxhZ3MgYW5kIHJldHVybiAqLworCW1vdncJJXNwLCAlYnAKKwlkYXRhMzIgbGdkdCAoJWJwKQorCWRhdGEzMiBsaWR0IDgoJWJwKQorCWFkZHcJJDIwLCAlc3AgLyogYWxzbyBza2lwICVjcyBhbmQgJXNzICovCisJcG9wdwklZHMKKwlwb3B3CSVlcworCXBvcHcJJWZzCisJcG9wdwklZ3MKKwlwb3BhbAorCS8qIHBvcGFsIHNraXBzICVlc3AuICBXZSB0aGVyZWZvcmUgd2FudCB0byBkbyAibW92bCAtMjAoJXNwKSwKKwkgKiAlZXNwIiwgYnV0IC0yMCglc3ApIGlzIG5vdCBhIHZhbGlkIDgwMzg2IGV4cHJlc3Npb24uCisJICogRm9ydHVuYXRlbHksIHByb3RfdG9fcmVhbCgpIHplcm9lcyB0aGUgaGlnaCB3b3JkIG9mICVlc3AsIHNvCisJICogd2UgY2FuIGp1c3QgdXNlIC0yMCglZXNwKSBpbnN0ZWFkLgorCSAqLworCWFkZHIzMiBtb3ZsIC0yMCglZXNwKSwgJWVzcAorCXBvcGZsCisJbHJldAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmVhbF9jYWxsIChwcm90ZWN0ZWQtbW9kZSBuZWFyIGNhbGwsIDMyLWJpdCB2aXJ0dWFsIHJldHVybiBhZGRyZXNzKQorICoKKyAqIENhbGwgYSByZWFsLW1vZGUgZnVuY3Rpb24gZnJvbSBwcm90ZWN0ZWQtbW9kZSBjb2RlLgorICoKKyAqIFRoZSBub24tc2VnbWVudCByZWdpc3RlciB2YWx1ZXMgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlCisgKiByZWFsLW1vZGUgY29kZS4gIFRoZSBzZWdtZW50IHJlZ2lzdGVycyB3aWxsIGJlIHNldCBhcyBwZXIKKyAqIHByb3RfdG9fcmVhbC4gIFRoZSBub24tc2VnbWVudCByZWdpc3RlciB2YWx1ZXMgc2V0IGJ5IHRoZSByZWFsLW1vZGUKKyAqIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIHByb3RlY3RlZC1tb2RlIGNhbGxlci4gIEEKKyAqIHJlc3VsdCBvZiB0aGlzIGlzIHRoYXQgdGhpcyByb3V0aW5lIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbQorICogQyBjb2RlLCBzaW5jZSBpdCBjbG9iYmVycyByZWdpc3RlcnMgdGhhdCB0aGUgQyBBQkkgZXhwZWN0cyB0aGUKKyAqIGNhbGxlZSB0byBwcmVzZXJ2ZS4gIEdhdGUgQTIwIHdpbGwgKm5vdCogYmUgYXV0b21hdGljYWxseQorICogcmUtZW5hYmxlZC4gIFNpbmNlIHdlIGFsd2F5cyBydW4gZnJvbSBhbiBldmVuIG1lZ2FieXRlIG9mIG1lbW9yeSwKKyAqIHdlIGFyZSBndWFyYW50ZWVkIHRvIHJldHVybiBzdWNjZXNzZnVsbHkgdG8gdGhlIHByb3RlY3RlZC1tb2RlCisgKiBjb2RlLCB3aGljaCBzaG91bGQgdGhlbiBjYWxsIGdhdGVBMjBfc2V0KCkgaWYgaXQgc3VzcGVjdHMgdGhhdCBnYXRlCisgKiBBMjAgbWF5IGhhdmUgYmVlbiBkaXNhYmxlZC4gIE5vdGUgdGhhdCBlbmFibGluZyBnYXRlIEEyMCBpcyBhCisgKiBwb3RlbnRpYWxseSBzbG93IG9wZXJhdGlvbiB0aGF0IG1heSBhbHNvIGNhdXNlIGtleWJvYXJkIGlucHV0IHRvIGJlCisgKiBsb3N0OyB0aGlzIGlzIHdoeSBpdCBpcyBub3QgZG9uZSBhdXRvbWF0aWNhbGx5LgorICoKKyAqIGxpYnJtLmggZGVmaW5lcyBhIGNvbnZlbmllbnQgbWFjcm8gUkVBTF9DT0RFKCkgZm9yIHVzaW5nIHJlYWxfY2FsbC4KKyAqIFNlZSBsaWJybS5oIGFuZCByZWFsbW9kZS5oIGZvciBkZXRhaWxzIGFuZCBleGFtcGxlcy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAoMzItYml0KSBuZWFyIHBvaW50ZXIgdG8gcmVhbC1tb2RlIGZ1bmN0aW9uIHRvIGNhbGwKKyAqCisgKiBSZXR1cm5zOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNkZWZpbmUgUkNfT0ZGU0VUX1BSRVNFUlZFX1JFR1MgKCAwICkKKyNkZWZpbmUgUkNfT0ZGU0VUX1JFVEFERFIgKCBSQ19PRkZTRVRfUFJFU0VSVkVfUkVHUyArIFNJWkVPRl9JMzg2X1JFR1MgKQorI2RlZmluZSBSQ19PRkZTRVRfRlVOQ1RJT04gKCBSQ19PRkZTRVRfUkVUQUREUiArIDQgKQorI2RlZmluZSBSQ19PRkZTRVRfRU5EICggUkNfT0ZGU0VUX0ZVTkNUSU9OICsgNCApCisKKwkuc2VjdGlvbiAiLnRleHQiLCAiYXgiLCBAcHJvZ2JpdHMKKwkuY29kZTMyCisJLmdsb2JsIHJlYWxfY2FsbAorcmVhbF9jYWxsOgorCS8qIENyZWF0ZSByZWdpc3RlciBkdW1wIGFuZCBmdW5jdGlvbiBwb2ludGVyIGNvcHkgb24gUE0gc3RhY2sgKi8KKwlwdXNoYWwKKwlwdXNobAlSQ19PRkZTRVRfRlVOQ1RJT04oJWVzcCkKKworCS8qIFN3aXRjaCB0byByZWFsIG1vZGUgYW5kIG1vdmUgcmVnaXN0ZXIgZHVtcCB0byBSTSBzdGFjayAgKi8KKwltb3ZsCSQoIFJDX09GRlNFVF9SRVRBRERSICsgNCAvKiBmdW5jdGlvbiBwb2ludGVyIGNvcHkgKi8gKSwgJWVjeAorCXB1c2hsCSQxZgorCWptcAlwcm90X3RvX3JlYWwKKwkuc2VjdGlvbiAiLnRleHQxNiIsICJheCIsIEBwcm9nYml0cworCS5jb2RlMTYKKzE6CisJLyogQ2FsbCByZWFsLW1vZGUgZnVuY3Rpb24gKi8KKwlwb3BsCXJjX2Z1bmN0aW9uCisJcG9wYWwKKwljYWxsCSpyY19mdW5jdGlvbgorCXB1c2hhbAorCisJLyogRm9yIHNhbml0eSdzIHNha2UsIGNsZWFyIHRoZSBkaXJlY3Rpb24gZmxhZyBhcyBzb29uIGFzIHBvc3NpYmxlICovCisJY2xkCisKKwkvKiBTd2l0Y2ggdG8gcHJvdGVjdGVkIG1vZGUgYW5kIG1vdmUgcmVnaXN0ZXIgZHVtcCBiYWNrIHRvIFBNIHN0YWNrICovCisJbW92bAkkUkNfT0ZGU0VUX1JFVEFERFIsICVlY3gKKwlwdXNobAkkMWYKKwlqbXAJcmVhbF90b19wcm90CisJLnNlY3Rpb24gIi50ZXh0IiwgImF4IiwgQHByb2diaXRzCisJLmNvZGUzMgorMToKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyBhbmQgcmV0dXJuICovCisJcG9wYWwKKwlyZXQKKworCisJLyogRnVuY3Rpb24gdmVjdG9yLCB1c2VkIGJlY2F1c2UgImNhbGwgeHgoJXNwKSIgaXMgbm90IGEgdmFsaWQKKwkgKiAxNi1iaXQgZXhwcmVzc2lvbi4KKwkgKi8KKwkuc2VjdGlvbiAiLmRhdGExNiIsICJhdyIsIEBwcm9nYml0cworcmNfZnVuY3Rpb246CS53b3JkIDAsIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0b3JlZCByZWFsLW1vZGUgYW5kIHByb3RlY3RlZC1tb2RlIHN0YWNrIHBvaW50ZXJzCisgKgorICogVGhlIHJlYWwtbW9kZSBzdGFjayBwb2ludGVyIGlzIHN0b3JlZCBoZXJlIHdoZW5ldmVyIHJlYWxfdG9fcHJvdAorICogaXMgY2FsbGVkIGFuZCByZXN0b3JlZCB3aGVuZXZlciBwcm90X3RvX3JlYWwgaXMgY2FsbGVkLiAgVGhlCisgKiBjb252ZXJzZSBoYXBwZW5zIGZvciB0aGUgcHJvdGVjdGVkLW1vZGUgc3RhY2sgcG9pbnRlci4KKyAqCisgKiBEZXNwaXRlIGluaXRpYWwgYXBwZWFyYW5jZXMgdGhpcyBzY2hlbWUgaXMsIGluIGZhY3QgcmUtZW50cmFudCwKKyAqIGJlY2F1c2UgcHJvZ3JhbSBmbG93IGRpY3RhdGVzIHRoYXQgd2UgYWx3YXlzIHJldHVybiB2aWEgdGhlIHBvaW50CisgKiB3ZSBsZWZ0IGJ5LiAgRm9yIGV4YW1wbGU6CisgKiAgICBQWEUgQVBJIGNhbGwgZW50cnkKKyAqICAxICAgcmVhbCA9PiBwcm90CisgKiAgICAgICAgLi4uCisgKiAgICAgICAgUHJpbnQgYSB0ZXh0IHN0cmluZworICoJICAgIC4uLgorICogIDIgICAgICAgcHJvdCA9PiByZWFsCisgKiAgICAgICAgICAgIElOVCAxMAorICogIDMgICAgICAgcmVhbCA9PiBwcm90CisgKgkgICAgLi4uCisgKiAgICAgICAgLi4uCisgKiAgNCAgIHByb3QgPT4gcmVhbAorICogICAgUFhFIEFQSSBjYWxsIGV4aXQKKyAqCisgKiBBdCBwb2ludCAxLCB0aGUgUk0gbW9kZSBzdGFjayB2YWx1ZSwgc2F5IFJQWEUsIGlzIHN0b3JlZCBpbgorICogcm1fc3Msc3AuICBXZSB3YW50IHRoaXMgdmFsdWUgdG8gc3RpbGwgYmUgcHJlc2VudCBpbiBybV9zcyxzcCB3aGVuCisgKiB3ZSByZWFjaCBwb2ludCA0LgorICoKKyAqIEF0IHBvaW50IDIsIHRoZSBSTSBzdGFjayB2YWx1ZSBpcyByZXN0b3JlZCBmcm9tIFJQWEUuICBBdCBwb2ludCAzLAorICogdGhlIFJNIHN0YWNrIHZhbHVlIGlzIGFnYWluIHN0b3JlZCBpbiBybV9zcyxzcC4gIFRoaXMgKmRvZXMqCisgKiBvdmVyd3JpdGUgdGhlIFJQWEUgdGhhdCB3ZSBoYXZlIHN0b3JlZCB0aGVyZSwgYnV0IGl0J3MgdGhlIHNhbWUKKyAqIHZhbHVlLCBzaW5jZSB0aGUgY29kZSBiZXR3ZWVuIHBvaW50cyAyIGFuZCAzIGhhcyBtYW5hZ2VkIHRvIHJldHVybgorICogdG8gdXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisJLnNlY3Rpb24gIi5kYXRhIiwgImF3IiwgQHByb2diaXRzCisJLmdsb2JsIHJtX3NwCitybV9zcDoJLndvcmQgMAorCS5nbG9ibCBybV9zcworcm1fc3M6CS53b3JkIDAKK3BtX2VzcDoJLmxvbmcgX2VzdGFjaworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmlydHVhbCBhZGRyZXNzIG9mZnNldHMKKyAqCisgKiBUaGVzZSBhcmUgdXNlZCBieSB0aGUgcHJvdGVjdGVkLW1vZGUgY29kZSB0byBtYXAgYmV0d2VlbiB2aXJ0dWFsCisgKiBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzLCBhbmQgdG8gYWNjZXNzIHZhcmlhYmxlcyBpbiB0aGUgLnRleHQxNiBvcgorICogLmRhdGExNiBzZWdtZW50cy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwkvKiBJbnRlcm5hbCBjb3BpZXMsIGNyZWF0ZWQgYnkgaW5pdF9saWJybSAod2hpY2ggcnVucyBpbiByZWFsIG1vZGUpICovCisJLnNlY3Rpb24gIi5kYXRhMTYiLCAiYXciLCBAcHJvZ2JpdHMKK192aXJ0X29mZnNldDoJLmxvbmcgMAorX3RleHQxNjoJLmxvbmcgMAorX2RhdGExNjoJLmxvbmcgMAorCisJLyogRXh0ZXJuYWxseS12aXNpYmxlIGNvcGllcywgY3JlYXRlZCBieSByZWFsX3RvX3Byb3QgKi8KKwkuc2VjdGlvbiAiLmRhdGEiLCAiYXciLCBAcHJvZ2JpdHMKKwkuZ2xvYmwgdmlydF9vZmZzZXQKK3ZpcnRfb2Zmc2V0OgkubG9uZyAwCQorCS5nbG9ibCB0ZXh0MTYKK3RleHQxNjoJCS5sb25nIDAKKwkuZ2xvYmwgZGF0YTE2CitkYXRhMTY6CQkubG9uZyAwCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL2kzODYvdHJhbnNpdGlvbnMvbGlicm1fbWdtdC5jIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3RyYW5zaXRpb25zL2xpYnJtX21nbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDBiZTgxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC9pMzg2L3RyYW5zaXRpb25zL2xpYnJtX21nbXQuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogbGlicm06IGEgbGlicmFyeSBmb3IgaW50ZXJmYWNpbmcgdG8gcmVhbC1tb2RlIGNvZGUKKyAqCisgKiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8cmVhbG1vZGUuaD4KKworLyoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGxpYnJtLgorICoKKyAqLworCisvKioKKyAqIEFsbG9jYXRlIHNwYWNlIG9uIHRoZSByZWFsLW1vZGUgc3RhY2sgYW5kIGNvcHkgZGF0YSB0aGVyZSBmcm9tIGEKKyAqIHVzZXIgYnVmZmVyCisgKgorICogQHYgZGF0YQkJCVVzZXIgYnVmZmVyCisgKiBAdiBzaXplCQkJU2l6ZSBvZiBzdGFjayBkYXRhCisgKiBAcmV0IHNwCQkJTmV3IHZhbHVlIG9mIHJlYWwtbW9kZSBzdGFjayBwb2ludGVyCisgKi8KK3VpbnQxNl90IGNvcHlfdXNlcl90b19ybV9zdGFjayAoIHVzZXJwdHJfdCBkYXRhLCBzaXplX3Qgc2l6ZSApIHsKKwl1c2VycHRyX3Qgcm1fc3RhY2s7CisJcm1fc3AgLT0gc2l6ZTsKKwlybV9zdGFjayA9IHJlYWxfdG9fdXNlciAoIHJtX3NzLCBybV9zcCApOworCW1lbWNweV91c2VyICggcm1fc3RhY2ssIDAsIGRhdGEsIDAsIHNpemUgKTsKKwlyZXR1cm4gcm1fc3A7Cit9OworCisvKioKKyAqIERlYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHJlYWwtbW9kZSBzdGFjaywgb3B0aW9uYWxseSBjb3B5aW5nIGJhY2sKKyAqIGRhdGEgdG8gYSB1c2VyIGJ1ZmZlci4KKyAqCisgKiBAdiBkYXRhCQkJVXNlciBidWZmZXIKKyAqIEB2IHNpemUJCQlTaXplIG9mIHN0YWNrIGRhdGEKKyAqLwordm9pZCByZW1vdmVfdXNlcl9mcm9tX3JtX3N0YWNrICggdXNlcnB0cl90IGRhdGEsIHNpemVfdCBzaXplICkgeworCWlmICggZGF0YSApIHsKKwkJdXNlcnB0cl90IHJtX3N0YWNrID0gcmVhbF90b191c2VyICggcm1fc3MsIHJtX3NwICk7CisJCW1lbWNweV91c2VyICggcm1fc3RhY2ssIDAsIGRhdGEsIDAsIHNpemUgKTsKKwl9CisJcm1fc3AgKz0gc2l6ZTsKK307CisKK1BST1ZJREVfVUFDQ0VTU19JTkxJTkUgKCBsaWJybSwgcGh5c190b191c2VyICk7CitQUk9WSURFX1VBQ0NFU1NfSU5MSU5FICggbGlicm0sIHVzZXJfdG9fcGh5cyApOworUFJPVklERV9VQUNDRVNTX0lOTElORSAoIGxpYnJtLCB2aXJ0X3RvX3VzZXIgKTsKK1BST1ZJREVfVUFDQ0VTU19JTkxJTkUgKCBsaWJybSwgdXNlcl90b192aXJ0ICk7CitQUk9WSURFX1VBQ0NFU1NfSU5MSU5FICggbGlicm0sIHVzZXJwdHJfYWRkICk7CitQUk9WSURFX1VBQ0NFU1NfSU5MSU5FICggbGlicm0sIG1lbWNweV91c2VyICk7CitQUk9WSURFX1VBQ0NFU1NfSU5MSU5FICggbGlicm0sIG1lbW1vdmVfdXNlciApOworUFJPVklERV9VQUNDRVNTX0lOTElORSAoIGxpYnJtLCBtZW1zZXRfdXNlciApOworUFJPVklERV9VQUNDRVNTX0lOTElORSAoIGxpYnJtLCBzdHJsZW5fdXNlciApOworUFJPVklERV9VQUNDRVNTX0lOTElORSAoIGxpYnJtLCBtZW1jaHJfdXNlciApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODYvTWFrZWZpbGUgYi9ncHhlL3NyYy9hcmNoL3g4Ni9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWY2N2FjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC94ODYvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjIEluY2x1ZGUgY29tbW9uIHg4NiBoZWFkZXJzCisjCitJTkNESVJTCQkrPSBhcmNoL3g4Ni9pbmNsdWRlCisKKyMgeDg2LXNwZWNpZmljIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgc291cmNlIGZpbGVzCisjCitTUkNESVJTCQkrPSBhcmNoL3g4Ni9jb3JlCitTUkNESVJTIAkrPSBhcmNoL3g4Ni9pbnRlcmZhY2UvZWZpCitTUkNESVJTIAkrPSBhcmNoL3g4Ni9wcmVmaXgKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2L01ha2VmaWxlLmVmaSBiL2dweGUvc3JjL2FyY2gveDg2L01ha2VmaWxlLmVmaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWY4ZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC94ODYvTWFrZWZpbGUuZWZpCkBAIC0wLDAgKzEsMjggQEAKKyMgLSotIG1ha2VmaWxlIC0qLSA6IEZvcmNlIGVtYWNzIHRvIHVzZSBNYWtlZmlsZSBtb2RlCisKKyMgVGhlIEVGSSBsaW5rZXIgc2NyaXB0CisjCitMRFNDUklQVAk9IGFyY2gveDg2L3NjcmlwdHMvZWZpLmxkcworCisjIFJldGFpbiByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBlbGYyZWZpCisjCitMREZMQUdTCQkrPSAtcSAtUworCisjIE1lZGlhIHR5cGVzLgorIworTk9OX0FVVE9fTUVESUEJKz0gZWZpCitOT05fQVVUT19NRURJQQkrPSBlZmlkcnYKKworIyBSdWxlcyBmb3IgYnVpbGRpbmcgRUZJIGZpbGVzCisjCiskKEJJTikvJS5lZmkgOiAkKEJJTikvJS5lZmkudG1wICQoRUxGMkVGSSkKKwkkKFFNKSQoRUNITykgIiAgW0ZJTklTSF0gJEAiCisJJChRKSQoRUxGMkVGSSkgLS1zdWJzeXN0ZW09MTAgJDwgJEAKKworJChCSU4pLyUuZWZpZHJ2IDogJChCSU4pLyUuZWZpZHJ2LnRtcCAkKEVMRjJFRkkpCisJJChRTSkkKEVDSE8pICIgIFtGSU5JU0hdICRAIgorCSQoUSkkKEVMRjJFRkkpIC0tc3Vic3lzdGVtPTExICQ8ICRACisKKyQoQklOKS8lLmVmaXJvbSA6ICQoQklOKS8lLmVmaWRydiAkKEVGSVJPTSkKKwkkKFFNKSQoRUNITykgIiAgW0ZJTklTSF0gJEAiCisJJChRKSQoRUZJUk9NKSAtdiAkKFRHVF9QQ0lfVkVORE9SKSAtZCAkKFRHVF9QQ0lfREVWSUNFKSAkPCAkQApkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODYvY29yZS9wY2lkaXJlY3QuYyBiL2dweGUvc3JjL2FyY2gveDg2L2NvcmUvcGNpZGlyZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2MWQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2L2NvcmUvcGNpZGlyZWN0LmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3MgdmlhIFR5cGUgMSBhY2Nlc3NlcworICoKKyAqLworCisvKioKKyAqIFByZXBhcmUgZm9yIFR5cGUgMSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3MKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqIEB2IHdoZXJlCUxvY2F0aW9uIHdpdGhpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICovCit2b2lkIHBjaWRpcmVjdF9wcmVwYXJlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwgaW50IHdoZXJlICkgeworCW91dGwgKCAoIDB4ODAwMDAwMDAgfCAoIHBjaS0+YnVzIDw8IDE2ICkgfCAoIHBjaS0+ZGV2Zm4gPDwgOCApIHwKKwkJICggd2hlcmUgJiB+MyApICksIFBDSURJUkVDVF9DT05GSUdfQUREUkVTUyApOworfQorCitQUk9WSURFX1BDSUFQSV9JTkxJTkUgKCBkaXJlY3QsIHBjaV9tYXhfYnVzICk7CitQUk9WSURFX1BDSUFQSV9JTkxJTkUgKCBkaXJlY3QsIHBjaV9yZWFkX2NvbmZpZ19ieXRlICk7CitQUk9WSURFX1BDSUFQSV9JTkxJTkUgKCBkaXJlY3QsIHBjaV9yZWFkX2NvbmZpZ193b3JkICk7CitQUk9WSURFX1BDSUFQSV9JTkxJTkUgKCBkaXJlY3QsIHBjaV9yZWFkX2NvbmZpZ19kd29yZCApOworUFJPVklERV9QQ0lBUElfSU5MSU5FICggZGlyZWN0LCBwY2lfd3JpdGVfY29uZmlnX2J5dGUgKTsKK1BST1ZJREVfUENJQVBJX0lOTElORSAoIGRpcmVjdCwgcGNpX3dyaXRlX2NvbmZpZ193b3JkICk7CitQUk9WSURFX1BDSUFQSV9JTkxJTkUgKCBkaXJlY3QsIHBjaV93cml0ZV9jb25maWdfZHdvcmQgKTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2L2NvcmUveDg2X3N0cmluZy5jIGIvZ3B4ZS9zcmMvYXJjaC94ODYvY29yZS94ODZfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzOGViYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2L2NvcmUveDg2X3N0cmluZy5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiogQGZpbGUKKyAqCisgKiBPcHRpbWlzZWQgc3RyaW5nIG9wZXJhdGlvbnMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogQ29weSBtZW1vcnkgYXJlYQorICoKKyAqIEB2IGRlc3QJCURlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEB2IHNyYwkJU291cmNlIGFkZHJlc3MKKyAqIEB2IGxlbgkJTGVuZ3RoCisgKiBAcmV0IGRlc3QJCURlc3RpbmF0aW9uIGFkZHJlc3MKKyAqLwordm9pZCAqIF9fbWVtY3B5ICggdm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuICkgeworCXZvaWQgKmVkaSA9IGRlc3Q7CisJY29uc3Qgdm9pZCAqZXNpID0gc3JjOworCWludCBkaXNjYXJkX2VjeDsKKworCS8qIFdlIG9mdGVuIGRvIGxhcmdlIGR3b3JkLWFsaWduZWQgYW5kIGR3b3JkLWxlbmd0aCBibG9jaworCSAqIG1vdmVzLiAgVXNpbmcgbW92c2wgcmF0aGVyIHRoYW4gbW92c2Igc3BlZWRzIHRoZXNlIHVwIGJ5CisJICogYXJvdW5kIDMyJS4KKwkgKi8KKwlpZiAoIGxlbiA+PiAyICkgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJyZXAgbW92c2wiCisJCQkJICAgICAgIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKSwKKwkJCQkgICAgICAgICAiPSZjIiAoIGRpc2NhcmRfZWN4ICkKKwkJCQkgICAgICAgOiAiMCIgKCBlZGkgKSwgIjEiICggZXNpICksCisJCQkJICAgICAgICAgIjIiICggbGVuID4+IDIgKQorCQkJCSAgICAgICA6ICJtZW1vcnkiICk7CisJfQorCWlmICggbGVuICYgMHgwMiApIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c3ciIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisJfQorCWlmICggbGVuICYgMHgwMSApIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c2IiIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisJfQorCXJldHVybiBkZXN0OworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODYvaW5jbHVkZS9iaXRzL3BjaV9pby5oIGIvZ3B4ZS9zcmMvYXJjaC94ODYvaW5jbHVkZS9iaXRzL3BjaV9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZWZjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL3g4Ni9pbmNsdWRlL2JpdHMvcGNpX2lvLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfQklUU19QQ0lfSU9fSAorI2RlZmluZSBfQklUU19QQ0lfSU9fSAorCisvKiogQGZpbGUKKyAqCisgKiBpMzg2LXNwZWNpZmljIFBDSSBJL08gQVBJIGltcGxlbWVudGF0aW9ucworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL3BjaWJpb3MuaD4KKyNpbmNsdWRlIDxncHhlL3BjaWRpcmVjdC5oPgorCisjZW5kaWYgLyogX0JJVFNfUENJX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2L2luY2x1ZGUvYml0cy9zdHJpbmcuaCBiL2dweGUvc3JjL2FyY2gveDg2L2luY2x1ZGUvYml0cy9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjg4NjhhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC94ODYvaW5jbHVkZS9iaXRzL3N0cmluZy5oCkBAIC0wLDAgKzEsMjUyIEBACisjaWZuZGVmIEVUSEVSQk9PVF9CSVRTX1NUUklOR19ICisjZGVmaW5lIEVUSEVSQk9PVF9CSVRTX1NUUklOR19ICisvKgorICogVGFrZW4gZnJvbSBMaW51eCAvdXNyL2luY2x1ZGUvYXNtL3N0cmluZy5oCisgKiBBbGwgZXhjZXB0IG1lbWNweSwgbWVtbW92ZSwgbWVtc2V0IGFuZCBtZW1jbXAgcmVtb3ZlZC4KKyAqCisgKiBOb24tc3RhbmRhcmQgbWVtc3dhcCgpIGZ1bmN0aW9uIGFkZGVkIGJlY2F1c2UgaXQgc2F2ZXMgcXVpdGUgYSBiaXQKKyAqIG9mIGNvZGUgKG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrKS4KKyAqLworCisvKgorICogVGhpcyBzdHJpbmctaW5jbHVkZSBkZWZpbmVzIGFsbCBzdHJpbmcgZnVuY3Rpb25zIGFzIGlubGluZQorICogZnVuY3Rpb25zLiBVc2UgZ2NjLiBJdCBhbHNvIGFzc3VtZXMgZHM9ZXM9ZGF0YSBzcGFjZSwgdGhpcyBzaG91bGQgYmUKKyAqIG5vcm1hbC4gTW9zdCBvZiB0aGUgc3RyaW5nLWZ1bmN0aW9ucyBhcmUgcmF0aGVyIGhlYXZpbHkgaGFuZC1vcHRpbWl6ZWQsCisgKiBzZWUgZXNwZWNpYWxseSBzdHJ0b2ssc3Ryc3RyLHN0cltjXXNwbi4gVGhleSBzaG91bGQgd29yaywgYnV0IGFyZSBub3QKKyAqIHZlcnkgZWFzeSB0byB1bmRlcnN0YW5kLiBFdmVyeXRoaW5nIGlzIGRvbmUgZW50aXJlbHkgd2l0aGluIHRoZSByZWdpc3RlcgorICogc2V0LCBtYWtpbmcgdGhlIGZ1bmN0aW9ucyBmYXN0IGFuZCBjbGVhbi4gU3RyaW5nIGluc3RydWN0aW9ucyBoYXZlIGJlZW4KKyAqIHVzZWQgdGhyb3VnaC1vdXQsIG1ha2luZyBmb3IgInNsaWdodGx5IiB1bmNsZWFyIGNvZGUgOi0pCisgKgorICoJCU5PIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcywKKyAqCQljb25zaWRlciB0aGVzZSB0cml2aWFsIGZ1bmN0aW9ucyB0byBiZSBQRC4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBQVUJMSUNfRE9NQUlOICk7CisKKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNQ1BZCisKK2V4dGVybiB2b2lkICogX19tZW1jcHkgKCB2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4gKTsKKworI2lmIDAKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQgKgorX19tZW1jcHkgKCB2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4gKSB7CisJaW50IGQwLCBkMSwgZDI7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAicmVwIDsgbW92c2IiCisJCQkgICAgICAgOiAiPSZjIiAoIGQwICksICI9JlMiICggZDEgKSwgIj0mRCIgKCBkMiApCisJCQkgICAgICAgOiAiMCIgKCBsZW4gKSwgIjEiICggc3JjICksICIyIiAoIGRlc3QgKQorCQkJICAgICAgIDogIm1lbW9yeSIgKTsKKwlyZXR1cm4gZGVzdDsgCit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZCAqCitfX2NvbnN0YW50X21lbWNweSAoIHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbiApIHsKKwl1bmlvbiB7CisJCXVpbnQzMl90IHUzMlsyXTsKKwkJdWludDE2X3QgdTE2WzRdOworCQl1aW50OF90ICB1OFs4XTsKKwl9IF9fYXR0cmlidXRlX18gKCggX19tYXlfYWxpYXNfXyApKSAqZGVzdF91ID0gZGVzdDsKKwljb25zdCB1bmlvbiB7CisJCXVpbnQzMl90IHUzMlsyXTsKKwkJdWludDE2X3QgdTE2WzRdOworCQl1aW50OF90ICB1OFs4XTsKKwl9IF9fYXR0cmlidXRlX18gKCggX19tYXlfYWxpYXNfXyApKSAqc3JjX3UgPSBzcmM7CisJY29uc3Qgdm9pZCAqZXNpOworCXZvaWQgKmVkaTsKKworCXN3aXRjaCAoIGxlbiApIHsKKwljYXNlIDAgOiAvKiAwIGJ5dGVzICovCisJCXJldHVybiBkZXN0OworCS8qCisJICogU2luZ2xlLXJlZ2lzdGVyIG1vdmVzOyB0aGVzZSBhcmUgYWx3YXlzIGJldHRlciB0aGFuIGEKKwkgKiBzdHJpbmcgb3BlcmF0aW9uLiAgV2UgY2FuIGNsb2JiZXIgYW4gYXJiaXRyYXJ5IHR3bworCSAqIHJlZ2lzdGVycyAoZGF0YSwgc291cmNlLCBkZXN0IGNhbiByZS11c2Ugc291cmNlIHJlZ2lzdGVyKQorCSAqIGluc3RlYWQgb2YgYmVpbmcgcmVzdHJpY3RlZCB0byBlc2kgYW5kIGVkaS4gIFRoZXJlJ3MgYWxzbyBhCisJICogbXVjaCBncmVhdGVyIHBvdGVudGlhbCBmb3Igb3B0aW1pc2luZyB3aXRoIG5lYXJieSBjb2RlLgorCSAqCisJICovCisJY2FzZSAxIDogLyogNCBieXRlcyAqLworCQlkZXN0X3UtPnU4WzBdICA9IHNyY191LT51OFswXTsKKwkJcmV0dXJuIGRlc3Q7CisJY2FzZSAyIDogLyogNiBieXRlcyAqLworCQlkZXN0X3UtPnUxNlswXSA9IHNyY191LT51MTZbMF07CisJCXJldHVybiBkZXN0OworCWNhc2UgNCA6IC8qIDQgYnl0ZXMgKi8KKwkJZGVzdF91LT51MzJbMF0gPSBzcmNfdS0+dTMyWzBdOworCQlyZXR1cm4gZGVzdDsKKwkvKgorCSAqIERvdWJsZS1yZWdpc3RlciBtb3ZlczsgdGhlc2UgYXJlIHByb2JhYmx5IHN0aWxsIGEgd2luLgorCSAqCisJICovCisJY2FzZSAzIDogLyogMTIgYnl0ZXMgKi8KKwkJZGVzdF91LT51MTZbMF0gPSBzcmNfdS0+dTE2WzBdOworCQlkZXN0X3UtPnU4WzJdICA9IHNyY191LT51OFsyXTsKKwkJcmV0dXJuIGRlc3Q7CisJY2FzZSA1IDogLyogMTAgYnl0ZXMgKi8KKwkJZGVzdF91LT51MzJbMF0gPSBzcmNfdS0+dTMyWzBdOworCQlkZXN0X3UtPnU4WzRdICA9IHNyY191LT51OFs0XTsKKwkJcmV0dXJuIGRlc3Q7CisJY2FzZSA2IDogLyogMTIgYnl0ZXMgKi8KKwkJZGVzdF91LT51MzJbMF0gPSBzcmNfdS0+dTMyWzBdOworCQlkZXN0X3UtPnUxNlsyXSA9IHNyY191LT51MTZbMl07CisJCXJldHVybiBkZXN0OworCWNhc2UgOCA6IC8qIDEwIGJ5dGVzICovCisJCWRlc3RfdS0+dTMyWzBdID0gc3JjX3UtPnUzMlswXTsKKwkJZGVzdF91LT51MzJbMV0gPSBzcmNfdS0+dTMyWzFdOworCQlyZXR1cm4gZGVzdDsKKwl9CisKKwkvKiBFdmVuIGlmIHdlIGhhdmUgdG8gbG9hZCB1cCBlc2kgYW5kIGVkaSByZWFkeSBmb3IgYSBzdHJpbmcKKwkgKiBvcGVyYXRpb24sIHdlIGNhbiBzb21ldGltZXMgc2F2ZSBzcGFjZSBieSB1c2luZyBtdWx0aXBsZQorCSAqIHNpbmdsZS1ieXRlICJtb3ZzIiBvcGVyYXRpb25zIGluc3RlYWQgb2YgbG9hZGluZyB1cCBlY3ggYW5kCisJICogdXNpbmcgInJlcCBtb3ZzYiIuCisJICoKKwkgKiAibG9hZCBlY3gsIHJlcCBtb3ZzYiIgaXMgNyBieXRlcywgcGx1cyBhbiBhdmVyYWdlIG9mIDEgYnl0ZQorCSAqIHRvIGFsbG93IGZvciBzYXZpbmcvcmVzdG9yaW5nIGVjeCA1MCUgb2YgdGhlIHRpbWUuCisJICoKKwkgKiAibW92c2wiIGFuZCAibW92c2IiIGFyZSAxIGJ5dGUgZWFjaCwgIm1vdnN3IiBpcyB0d28gYnl0ZXMuCisJICogKEluIDE2LWJpdCBtb2RlLCAibW92c2wiIGlzIDIgYnl0ZXMgYW5kICJtb3ZzdyIgaXMgMSBieXRlLAorCSAqIGJ1dCAibW92c2wiIG1vdmVzIHR3aWNlIGFzIG11Y2ggZGF0YSwgc28gaXQgYmFsYW5jZXMgb3V0KS4KKwkgKgorCSAqIFRoZSBjdXRvZmYgcG9pbnQgdGhlcmVmb3JlIG9jY3VycyBhcm91bmQgMjYgYnl0ZXM7IHRoZSBieXRlCisJICogcmVxdWlyZW1lbnRzIGZvciBlYWNoIG1ldGhvZCBhcmU6CisJICoKKwkgKiBsZW4JCSAgIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxCisJICogI2J5dGVzIChlY3gpCSAgICA4ICA4ICA4ICA4ICA4ICA4ICA4ICA4ICA4ICA4ICA4ICA4ICA4ICA4ICA4ICA4CisJICogI2J5dGVzIChubyBlY3gpICA0ICA1ICA2ICA3ICA1ICA2ICA3ICA4ICA2ICA3ICA4ICA5ICA3ICA4ICA5IDEwCisJICovCisKKwllc2kgPSBzcmM7CisJZWRpID0gZGVzdDsKKwkKKwlpZiAoIGxlbiA+PSAyNiApCisJCXJldHVybiBfX21lbWNweSAoIGRlc3QsIHNyYywgbGVuICk7CisJCisJaWYgKCBsZW4gPj0gNio0ICkKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c2wiIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisJaWYgKCBsZW4gPj0gNSo0ICkKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c2wiIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisJaWYgKCBsZW4gPj0gNCo0ICkKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c2wiIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisJaWYgKCBsZW4gPj0gMyo0ICkKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c2wiIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisJaWYgKCBsZW4gPj0gMio0ICkKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c2wiIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisJaWYgKCBsZW4gPj0gMSo0ICkKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c2wiIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisJaWYgKCAoIGxlbiAlIDQgKSA+PSAyICkKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c3ciIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisJaWYgKCAoIGxlbiAlIDIgKSA+PSAxICkKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92c2IiIDogIj0mRCIgKCBlZGkgKSwgIj0mUyIgKCBlc2kgKQorCQkJCSAgICAgICA6ICIwIiAoIGVkaSApLCAiMSIgKCBlc2kgKSA6ICJtZW1vcnkiICk7CisKKwlyZXR1cm4gZGVzdDsKK30KKworI2RlZmluZSBtZW1jcHkoIGRlc3QsIHNyYywgbGVuICkJCQlcCisJKCBfX2J1aWx0aW5fY29uc3RhbnRfcCAoIChsZW4pICkgPwkJXAorCSAgX19jb25zdGFudF9tZW1jcHkgKCAoZGVzdCksIChzcmMpLCAobGVuKSApIDoJXAorCSAgX19tZW1jcHkgKCAoZGVzdCksIChzcmMpLCAobGVuKSApICkKKworI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1NT1ZFCitzdGF0aWMgaW5saW5lIHZvaWQgKiBtZW1tb3ZlKHZvaWQgKiBkZXN0LGNvbnN0IHZvaWQgKiBzcmMsIHNpemVfdCBuKQoreworaW50IGQwLCBkMSwgZDI7CitpZiAoZGVzdDxzcmMpCitfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiY2xkXG5cdCIKKwkicmVwXG5cdCIKKwkibW92c2IiCisJOiAiPSZjIiAoZDApLCAiPSZTIiAoZDEpLCAiPSZEIiAoZDIpCisJOiIwIiAobiksIjEiIChzcmMpLCIyIiAoZGVzdCkKKwk6ICJtZW1vcnkiKTsKK2Vsc2UKK19fYXNtX18gX192b2xhdGlsZV9fKAorCSJzdGRcblx0IgorCSJyZXBcblx0IgorCSJtb3ZzYlxuXHQiCisJImNsZCIKKwk6ICI9JmMiIChkMCksICI9JlMiIChkMSksICI9JkQiIChkMikKKwk6IjAiIChuKSwKKwkgIjEiIChuLTErKGNvbnN0IGNoYXIgKilzcmMpLAorCSAiMiIgKG4tMSsoY2hhciAqKWRlc3QpCisJOiJtZW1vcnkiKTsKK3JldHVybiBkZXN0OworfQorCisjZGVmaW5lIF9fSEFWRV9BUkNIX01FTVNFVAorc3RhdGljIGlubGluZSB2b2lkICogbWVtc2V0KHZvaWQgKnMsIGludCBjLHNpemVfdCBjb3VudCkKK3sKK2ludCBkMCwgZDE7CitfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiY2xkXG5cdCIKKwkicmVwXG5cdCIKKwkic3Rvc2IiCisJOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpCisJOiJhIiAoYyksIjEiIChzKSwiMCIgKGNvdW50KQorCToibWVtb3J5Iik7CityZXR1cm4gczsKK30KKworI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1TV0FQCitzdGF0aWMgaW5saW5lIHZvaWQgKiBtZW1zd2FwKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CitpbnQgZDAsIGQxLCBkMiwgZDM7CitfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiXG4xOlx0IgorCSJtb3ZiICglJWVkaSksJSVhbFxuXHQiCisJInhjaGdiICglJWVzaSksJSVhbFxuXHQiCisJImluY2wgJSVlc2lcblx0IgorCSJzdG9zYlxuXHQiCisJImxvb3AgMWIiCisJOiAiPSZjIiAoZDApLCAiPSZTIiAoZDEpLCAiPSZEIiAoZDIpLCAiPSZhIiAoZDMpCisJOiAiMCIgKG4pLCAiMSIgKHNyYyksICIyIiAoZGVzdCkKKwk6ICJtZW1vcnkiICk7CityZXR1cm4gZGVzdDsKK30KKworI2RlZmluZSBfX0hBVkVfQVJDSF9TVFJOQ01QCitzdGF0aWMgaW5saW5lIGludCBzdHJuY21wKGNvbnN0IGNoYXIgKiBjcyxjb25zdCBjaGFyICogY3Qsc2l6ZV90IGNvdW50KQoreworcmVnaXN0ZXIgaW50IF9fcmVzOworaW50IGQwLCBkMSwgZDI7CitfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMTpcdGRlY2wgJTNcblx0IgorCSJqcyAyZlxuXHQiCisJImxvZHNiXG5cdCIKKwkic2Nhc2Jcblx0IgorCSJqbmUgM2Zcblx0IgorCSJ0ZXN0YiAlJWFsLCUlYWxcblx0IgorCSJqbmUgMWJcbiIKKwkiMjpcdHhvcmwgJSVlYXgsJSVlYXhcblx0IgorCSJqbXAgNGZcbiIKKwkiMzpcdHNiYmwgJSVlYXgsJSVlYXhcblx0IgorCSJvcmIgJDEsJSVhbFxuIgorCSI0OiIKKwkJICAgICA6Ij1hIiAoX19yZXMpLCAiPSZTIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZjIiAoZDIpCisJCSAgICAgOiIxIiAoY3MpLCIyIiAoY3QpLCIzIiAoY291bnQpKTsKK3JldHVybiBfX3JlczsKK30KKworI2RlZmluZSBfX0hBVkVfQVJDSF9TVFJMRU4KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICogcykKK3sKK2ludCBkMDsKK3JlZ2lzdGVyIGludCBfX3JlczsKK19fYXNtX18gX192b2xhdGlsZV9fKAorCSJyZXBuZVxuXHQiCisJInNjYXNiXG5cdCIKKwkibm90bCAlMFxuXHQiCisJImRlY2wgJTAiCisJOiI9YyIgKF9fcmVzKSwgIj0mRCIgKGQwKSA6IjEiIChzKSwiYSIgKDApLCAiMCIgKDB4ZmZmZmZmZmYpKTsKK3JldHVybiBfX3JlczsKK30KKworI2VuZGlmIC8qIEVUSEVSQk9PVF9CSVRTX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL3g4Ni9pbmNsdWRlL2dweGUvZWZpL2VmaXg4Nl9uYXAuaCBiL2dweGUvc3JjL2FyY2gveDg2L2luY2x1ZGUvZ3B4ZS9lZmkvZWZpeDg2X25hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2M5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL3g4Ni9pbmNsdWRlL2dweGUvZWZpL2VmaXg4Nl9uYXAuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9HUFhFX0VGSVg4Nl9OQVBfSAorI2RlZmluZSBfR1BYRV9FRklYODZfTkFQX0gKKworLyoqIEBmaWxlCisgKgorICogRUZJIENQVSBzbGVlcGluZworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZmRlZiBOQVBfRUZJWDg2CisjZGVmaW5lIE5BUF9QUkVGSVhfZWZpeDg2CisjZWxzZQorI2RlZmluZSBOQVBfUFJFRklYX2VmaXg4NiBfX2VmaXg4Nl8KKyNlbmRpZgorCisjZW5kaWYgLyogX0dQWEVfRUZJWDg2X05BUF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL3g4Ni9pbmNsdWRlL2dweGUvcGNpYmlvcy5oIGIvZ3B4ZS9zcmMvYXJjaC94ODYvaW5jbHVkZS9ncHhlL3BjaWJpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E2ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC94ODYvaW5jbHVkZS9ncHhlL3BjaWJpb3MuaApAQCAtMCwwICsxLDEzNSBAQAorI2lmbmRlZiBfR1BYRV9QQ0lCSU9TX0gKKyNkZWZpbmUgX0dQWEVfUENJQklPU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqIEBmaWxlCisgKgorICogUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgYWNjZXNzIHZpYSBQQ0kgQklPUworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZmRlZiBQQ0lBUElfUENCSU9TCisjZGVmaW5lIFBDSUFQSV9QUkVGSVhfcGNiaW9zCisjZWxzZQorI2RlZmluZSBQQ0lBUElfUFJFRklYX3BjYmlvcyBfX3BjYmlvc18KKyNlbmRpZgorCitzdHJ1Y3QgcGNpX2RldmljZTsKKworI2RlZmluZSBQQ0lCSU9TX0lOU1RBTExBVElPTl9DSEVDSwkweGIxMDEwMDAwCisjZGVmaW5lIFBDSUJJT1NfUkVBRF9DT05GSUdfQllURQkweGIxMDgwMDAwCisjZGVmaW5lIFBDSUJJT1NfUkVBRF9DT05GSUdfV09SRAkweGIxMDkwMDAwCisjZGVmaW5lIFBDSUJJT1NfUkVBRF9DT05GSUdfRFdPUkQJMHhiMTBhMDAwMAorI2RlZmluZSBQQ0lCSU9TX1dSSVRFX0NPTkZJR19CWVRFCTB4YjEwYjAwMDAKKyNkZWZpbmUgUENJQklPU19XUklURV9DT05GSUdfV09SRAkweGIxMGMwMDAwCisjZGVmaW5lIFBDSUJJT1NfV1JJVEVfQ09ORklHX0RXT1JECTB4YjEwZDAwMDAKKworZXh0ZXJuIGludCBwY2liaW9zX3JlYWQgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCB1aW50MzJfdCBjb21tYW5kLAorCQkJICB1aW50MzJfdCAqdmFsdWUgKTsKK2V4dGVybiBpbnQgcGNpYmlvc193cml0ZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIHVpbnQzMl90IGNvbW1hbmQsCisJCQkgICB1aW50MzJfdCB2YWx1ZSApOworCisvKioKKyAqIFJlYWQgYnl0ZSBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHZpYSBQQ0kgQklPUworICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiB3aGVyZQlMb2NhdGlvbiB3aXRoaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEB2IHZhbHVlCVZhbHVlIHJlYWQKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIGludAorUENJQVBJX0lOTElORSAoIHBjYmlvcywgcGNpX3JlYWRfY29uZmlnX2J5dGUgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCQkgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJCQkJIHVpbnQ4X3QgKnZhbHVlICkgeworCXVpbnQzMl90IHRtcDsKKwlpbnQgcmM7CisKKwlyYyA9IHBjaWJpb3NfcmVhZCAoIHBjaSwgUENJQklPU19SRUFEX0NPTkZJR19CWVRFIHwgd2hlcmUsICZ0bXAgKTsKKwkqdmFsdWUgPSB0bXA7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFJlYWQgd29yZCBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHZpYSBQQ0kgQklPUworICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiB3aGVyZQlMb2NhdGlvbiB3aXRoaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEB2IHZhbHVlCVZhbHVlIHJlYWQKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIGludAorUENJQVBJX0lOTElORSAoIHBjYmlvcywgcGNpX3JlYWRfY29uZmlnX3dvcmQgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCQkgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJCQkJIHVpbnQxNl90ICp2YWx1ZSApIHsKKwl1aW50MzJfdCB0bXA7CisJaW50IHJjOworCisJcmMgPSBwY2liaW9zX3JlYWQgKCBwY2ksIFBDSUJJT1NfUkVBRF9DT05GSUdfV09SRCB8IHdoZXJlLCAmdG1wICk7CisJKnZhbHVlID0gdG1wOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZWFkIGR3b3JkIGZyb20gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgdmlhIFBDSSBCSU9TCisgKgorICogQHYgcGNpCVBDSSBkZXZpY2UKKyAqIEB2IHdoZXJlCUxvY2F0aW9uIHdpdGhpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICogQHYgdmFsdWUJVmFsdWUgcmVhZAorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgaW50CitQQ0lBUElfSU5MSU5FICggcGNiaW9zLCBwY2lfcmVhZF9jb25maWdfZHdvcmQgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCQkgIHVuc2lnbmVkIGludCB3aGVyZSwKKwkJCQkJCSAgdWludDMyX3QgKnZhbHVlICkgeworCXJldHVybiBwY2liaW9zX3JlYWQgKCBwY2ksIFBDSUJJT1NfUkVBRF9DT05GSUdfRFdPUkQgfCB3aGVyZSwgdmFsdWUgKTsKK30KKworLyoqCisgKiBXcml0ZSBieXRlIHRvIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHZpYSBQQ0kgQklPUworICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiB3aGVyZQlMb2NhdGlvbiB3aXRoaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEB2IHZhbHVlCVZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIGludAorUENJQVBJX0lOTElORSAoIHBjYmlvcywgcGNpX3dyaXRlX2NvbmZpZ19ieXRlICkgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorCQkJCQkJICB1bnNpZ25lZCBpbnQgd2hlcmUsCisJCQkJCQkgIHVpbnQ4X3QgdmFsdWUgKSB7CisJcmV0dXJuIHBjaWJpb3Nfd3JpdGUgKCBwY2ksIFBDSUJJT1NfV1JJVEVfQ09ORklHX0JZVEUgfCB3aGVyZSwgdmFsdWUgKTsKK30KKworLyoqCisgKiBXcml0ZSB3b3JkIHRvIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHZpYSBQQ0kgQklPUworICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiB3aGVyZQlMb2NhdGlvbiB3aXRoaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEB2IHZhbHVlCVZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIGludAorUENJQVBJX0lOTElORSAoIHBjYmlvcywgcGNpX3dyaXRlX2NvbmZpZ193b3JkICkgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorCQkJCQkJICB1bnNpZ25lZCBpbnQgd2hlcmUsCisJCQkJCQkgIHVpbnQxNl90IHZhbHVlICkgeworCXJldHVybiBwY2liaW9zX3dyaXRlICggcGNpLCBQQ0lCSU9TX1dSSVRFX0NPTkZJR19XT1JEIHwgd2hlcmUsIHZhbHVlICk7Cit9CisKKy8qKgorICogV3JpdGUgZHdvcmQgdG8gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgdmlhIFBDSSBCSU9TCisgKgorICogQHYgcGNpCVBDSSBkZXZpY2UKKyAqIEB2IHdoZXJlCUxvY2F0aW9uIHdpdGhpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICogQHYgdmFsdWUJVmFsdWUgdG8gYmUgd3JpdHRlbgorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgaW50CitQQ0lBUElfSU5MSU5FICggcGNiaW9zLCBwY2lfd3JpdGVfY29uZmlnX2R3b3JkICkgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJCQkJICAgdWludDMyX3QgdmFsdWUgKSB7CisJcmV0dXJuIHBjaWJpb3Nfd3JpdGUgKCBwY2ksIFBDSUJJT1NfV1JJVEVfQ09ORklHX0RXT1JEIHwgd2hlcmUsIHZhbHVlKTsKK30KKworI2VuZGlmIC8qIF9HUFhFX1BDSUJJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODYvaW5jbHVkZS9ncHhlL3BjaWRpcmVjdC5oIGIvZ3B4ZS9zcmMvYXJjaC94ODYvaW5jbHVkZS9ncHhlL3BjaWRpcmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzA1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL3g4Ni9pbmNsdWRlL2dweGUvcGNpZGlyZWN0LmgKQEAgLTAsMCArMSwxNDEgQEAKKyNpZm5kZWYgX1BDSURJUkVDVF9ICisjZGVmaW5lIF9QQ0lESVJFQ1RfSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL2lvLmg+CisKKyNpZmRlZiBQQ0lBUElfRElSRUNUCisjZGVmaW5lIFBDSUFQSV9QUkVGSVhfZGlyZWN0CisjZWxzZQorI2RlZmluZSBQQ0lBUElfUFJFRklYX2RpcmVjdCBfX2RpcmVjdF8KKyNlbmRpZgorCisvKiogQGZpbGUKKyAqCisgKiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3MgdmlhIFR5cGUgMSBhY2Nlc3NlcworICoKKyAqLworCisjZGVmaW5lIFBDSURJUkVDVF9DT05GSUdfQUREUkVTUwkweGNmOAorI2RlZmluZSBQQ0lESVJFQ1RfQ09ORklHX0RBVEEJCTB4Y2ZjCisKK3N0cnVjdCBwY2lfZGV2aWNlOworCitleHRlcm4gdm9pZCBwY2lkaXJlY3RfcHJlcGFyZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIGludCB3aGVyZSApOworCisvKioKKyAqIERldGVybWluZSBtYXhpbXVtIFBDSSBidXMgbnVtYmVyIHdpdGhpbiBzeXN0ZW0KKyAqCisgKiBAcmV0IG1heF9idXMJCU1heGltdW0gYnVzIG51bWJlcgorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBpbnQKK1BDSUFQSV9JTkxJTkUgKCBkaXJlY3QsIHBjaV9tYXhfYnVzICkgKCB2b2lkICkgeworCS8qIE5vIHdheSB0byB3b3JrIHRoaXMgb3V0IHZpYSBUeXBlIDEgYWNjZXNzZXMgKi8KKwlyZXR1cm4gMHhmZjsKK30KKworLyoqCisgKiBSZWFkIGJ5dGUgZnJvbSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB2aWEgVHlwZSAxIGFjY2VzcworICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiB3aGVyZQlMb2NhdGlvbiB3aXRoaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEB2IHZhbHVlCVZhbHVlIHJlYWQKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIGludAorUENJQVBJX0lOTElORSAoIGRpcmVjdCwgcGNpX3JlYWRfY29uZmlnX2J5dGUgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCQkgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJCQkJIHVpbnQ4X3QgKnZhbHVlICkgeworCXBjaWRpcmVjdF9wcmVwYXJlICggcGNpLCB3aGVyZSApOworCSp2YWx1ZSA9IGluYiAoIFBDSURJUkVDVF9DT05GSUdfREFUQSArICggd2hlcmUgJiAzICkgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkIHdvcmQgZnJvbSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB2aWEgVHlwZSAxIGFjY2VzcworICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiB3aGVyZQlMb2NhdGlvbiB3aXRoaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEB2IHZhbHVlCVZhbHVlIHJlYWQKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIGludAorUENJQVBJX0lOTElORSAoIGRpcmVjdCwgcGNpX3JlYWRfY29uZmlnX3dvcmQgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCQkgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJCQkJIHVpbnQxNl90ICp2YWx1ZSApIHsKKwlwY2lkaXJlY3RfcHJlcGFyZSAoIHBjaSwgd2hlcmUgKTsKKwkqdmFsdWUgPSBpbncgKCBQQ0lESVJFQ1RfQ09ORklHX0RBVEEgKyAoIHdoZXJlICYgMiApICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBkd29yZCBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHZpYSBUeXBlIDEgYWNjZXNzCisgKgorICogQHYgcGNpCVBDSSBkZXZpY2UKKyAqIEB2IHdoZXJlCUxvY2F0aW9uIHdpdGhpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICogQHYgdmFsdWUJVmFsdWUgcmVhZAorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgaW50CitQQ0lBUElfSU5MSU5FICggZGlyZWN0LCBwY2lfcmVhZF9jb25maWdfZHdvcmQgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCQkgIHVuc2lnbmVkIGludCB3aGVyZSwKKwkJCQkJCSAgdWludDMyX3QgKnZhbHVlICkgeworCXBjaWRpcmVjdF9wcmVwYXJlICggcGNpLCB3aGVyZSApOworCSp2YWx1ZSA9IGlubCAoIFBDSURJUkVDVF9DT05GSUdfREFUQSApOworCXJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIGJ5dGUgdG8gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgdmlhIFR5cGUgMSBhY2Nlc3MKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgd2hlcmUJTG9jYXRpb24gd2l0aGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAdiB2YWx1ZQlWYWx1ZSB0byBiZSB3cml0dGVuCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBpbnQKK1BDSUFQSV9JTkxJTkUgKCBkaXJlY3QsIHBjaV93cml0ZV9jb25maWdfYnl0ZSApICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJCQkJICB1aW50OF90IHZhbHVlICkgeworCXBjaWRpcmVjdF9wcmVwYXJlICggcGNpLCB3aGVyZSApOworCW91dGIgKCB2YWx1ZSwgUENJRElSRUNUX0NPTkZJR19EQVRBICsgKCB3aGVyZSAmIDMgKSApOworCXJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIHdvcmQgdG8gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgdmlhIFR5cGUgMSBhY2Nlc3MKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgd2hlcmUJTG9jYXRpb24gd2l0aGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAdiB2YWx1ZQlWYWx1ZSB0byBiZSB3cml0dGVuCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBpbnQKK1BDSUFQSV9JTkxJTkUgKCBkaXJlY3QsIHBjaV93cml0ZV9jb25maWdfd29yZCApICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJCQkJICB1aW50MTZfdCB2YWx1ZSApIHsKKwlwY2lkaXJlY3RfcHJlcGFyZSAoIHBjaSwgd2hlcmUgKTsKKwlvdXR3ICggdmFsdWUsIFBDSURJUkVDVF9DT05GSUdfREFUQSArICggd2hlcmUgJiAyICkgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBXcml0ZSBkd29yZCB0byBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB2aWEgVHlwZSAxIGFjY2VzcworICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiB3aGVyZQlMb2NhdGlvbiB3aXRoaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEB2IHZhbHVlCVZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIGludAorUENJQVBJX0lOTElORSAoIGRpcmVjdCwgcGNpX3dyaXRlX2NvbmZpZ19kd29yZCApICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB3aGVyZSwKKwkJCQkJCSAgIHVpbnQzMl90IHZhbHVlICkgeworCXBjaWRpcmVjdF9wcmVwYXJlICggcGNpLCB3aGVyZSApOworCW91dGwgKCB2YWx1ZSwgUENJRElSRUNUX0NPTkZJR19EQVRBICk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfUENJRElSRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2L2ludGVyZmFjZS9lZmkvZWZpeDg2X25hcC5jIGIvZ3B4ZS9zcmMvYXJjaC94ODYvaW50ZXJmYWNlL2VmaS9lZml4ODZfbmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhNGUzYgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2L2ludGVyZmFjZS9lZmkvZWZpeDg2X25hcC5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL25hcC5oPgorI2luY2x1ZGUgPGdweGUvZWZpL2VmaS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIENQVSBzbGVlcGluZyBBUEkgZm9yIEVGSQorICoKKyAqLworCisvKioKKyAqIFNsZWVwIHVudGlsIG5leHQgaW50ZXJydXB0CisgKgorICovCitzdGF0aWMgdm9pZCBlZml4ODZfY3B1X25hcCAoIHZvaWQgKSB7CisJLyoKKwkgKiBJIGNhbid0IGZpbmQgYW55IEVGSSBBUEkgdGhhdCBhbGxvd3MgdXMgdG8gcHV0IHRoZSBDUFUgdG8KKwkgKiBzbGVlcC4gIFRoZSBDcHVTbGVlcCgpIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gQ3B1TGliLmgsIGJ1dAorCSAqIGlzbid0IHBhcnQgb2YgYW55IGV4cG9zZWQgcHJvdG9jb2wgc28gd2UgaGF2ZSBubyB3YXkgdG8KKwkgKiBjYWxsIGl0LgorCSAqCisJICogVGhlIEVGSSBzaGVsbCBkb2Vzbid0IHNlZW0gdG8gYm90aGVyIHNsZWVwaW5nIHRoZSBDUFU7IGl0CisJICoganVzdCBzaXRzIHRoZXJlIGlkbHkgYnVybmluZyBwb3dlci4KKwkgKgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICggImhsdCIgKTsKK30KKworUFJPVklERV9OQVAgKCBlZml4ODYsIGNwdV9uYXAsIGVmaXg4Nl9jcHVfbmFwICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL3g4Ni9wcmVmaXgvZWZpZHJ2cHJlZml4LmMgYi9ncHhlL3NyYy9hcmNoL3g4Ni9wcmVmaXgvZWZpZHJ2cHJlZml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkNTY1MAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2L3ByZWZpeC9lZmlkcnZwcmVmaXguYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbml0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvZWZpLmg+CisKKy8qKgorICogRUZJIGVudHJ5IHBvaW50CisgKgorICogQHYgaW1hZ2VfaGFuZGxlCUltYWdlIGhhbmRsZQorICogQHYgc3lzdGFiCQlTeXN0ZW0gdGFibGUKKyAqIEByZXQgZWZpcmMJCUVGSSByZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworRUZJX1NUQVRVUyBFRklBUEkgX3N0YXJ0ICggRUZJX0hBTkRMRSBpbWFnZV9oYW5kbGUsCisJCQkgICBFRklfU1lTVEVNX1RBQkxFICpzeXN0YWIgKSB7CisJRUZJX1NUQVRVUyBlZmlyYzsKKworCS8qIEluaXRpYWxpc2UgRUZJIGVudmlyb25tZW50ICovCisJaWYgKCAoIGVmaXJjID0gZWZpX2luaXQgKCBpbWFnZV9oYW5kbGUsIHN5c3RhYiApICkgIT0gMCApCisJCXJldHVybiBlZmlyYzsKKworCS8qIEluaXRpYWxpc2UgZ1BYRSBlbnZpcm9ubWVudCAqLworCWluaXRpYWxpc2UoKTsKKwlzdGFydHVwKCk7CisKKwkvKiBJbnN0YWxsIFNOUCBkcml2ZXIgYW5kIHJldHVybiAqLworCXJldHVybiBSQ19UT19FRklSQyAoIGVmaV9zbnBfaW5zdGFsbCAoKSApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODYvcHJlZml4L2VmaXByZWZpeC5jIGIvZ3B4ZS9zcmMvYXJjaC94ODYvcHJlZml4L2VmaXByZWZpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYzllMDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL3g4Ni9wcmVmaXgvZWZpcHJlZml4LmMKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdweGUvZWZpL2VmaS5oPgorCisvKioKKyAqIEVGSSBlbnRyeSBwb2ludAorICoKKyAqIEB2IGltYWdlX2hhbmRsZQlJbWFnZSBoYW5kbGUKKyAqIEB2IHN5c3RhYgkJU3lzdGVtIHRhYmxlCisgKiBAcmV0IGVmaXJjCQlFRkkgcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK0VGSV9TVEFUVVMgRUZJQVBJIF9zdGFydCAoIEVGSV9IQU5ETEUgaW1hZ2VfaGFuZGxlLAorCQkJICAgRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiICkgeworCUVGSV9TVEFUVVMgZWZpcmM7CisKKwkvKiBJbml0aWFsaXNlIEVGSSBlbnZpcm9ubWVudCAqLworCWlmICggKCBlZmlyYyA9IGVmaV9pbml0ICggaW1hZ2VfaGFuZGxlLCBzeXN0YWIgKSApICE9IDAgKQorCQlyZXR1cm4gZWZpcmM7CisKKwkvKiBDYWxsIHRvIG1haW4oKSAqLworCXJldHVybiBSQ19UT19FRklSQyAoIG1haW4gKCkgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2L3NjcmlwdHMvZWZpLmxkcyBiL2dweGUvc3JjL2FyY2gveDg2L3NjcmlwdHMvZWZpLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTI1YjgxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC94ODYvc2NyaXB0cy9lZmkubGRzCkBAIC0wLDAgKzEsMTA2IEBACisvKiAtKi0gc2ggLSotICovCisKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciBFRkkgaW1hZ2VzCisgKgorICovCisKK0VOVFJZICggX3N0YXJ0ICkKKworU0VDVElPTlMgeworCisgICAgLyogVGhlIGZpbGUgc3RhcnRzIGF0IGEgdmlydHVhbCBhZGRyZXNzIG9mIHplcm8sIGFuZCBzZWN0aW9ucyBhcmUKKyAgICAgKiBjb250aWd1b3VzLiAgRWFjaCBzZWN0aW9uIGlzIGFsaWduZWQgdG8gYXQgbGVhc3QgX21heF9hbGlnbiwKKyAgICAgKiB3aGljaCBkZWZhdWx0cyB0byAzMi4gIExvYWQgYWRkcmVzc2VzIGFyZSBlcXVhbCB0byB2aXJ0dWFsCisgICAgICogYWRkcmVzc2VzLgorICAgICAqLworCisgICAgX21heF9hbGlnbiA9IDMyOworCisgICAgLyogQWxsb3cgcGxlbnR5IG9mIHNwYWNlIGZvciBmaWxlIGhlYWRlcnMgKi8KKyAgICAuID0gMHgxMDAwOworCisgICAgLyoKKyAgICAgKiBUaGUgdGV4dCBzZWN0aW9uCisgICAgICoKKyAgICAgKi8KKworICAgIC4gPSBBTElHTiAoIF9tYXhfYWxpZ24gKTsKKyAgICAudGV4dCA6IHsKKwlfdGV4dCA9IC47CisJKigudGV4dCkKKwkqKC50ZXh0LiopCisJX2V0ZXh0ID0gLjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSByb2RhdGEgc2VjdGlvbgorICAgICAqCisgICAgICovCisKKyAgICAuID0gQUxJR04gKCBfbWF4X2FsaWduICk7CisgICAgLnJvZGF0YSA6IHsKKwlfcm9kYXRhID0gLjsKKwkqKC5yb2RhdGEpCisJKigucm9kYXRhLiopCisJX2Vyb2RhdGEgPSAuOworICAgIH0KKworICAgIC8qCisgICAgICogVGhlIGRhdGEgc2VjdGlvbgorICAgICAqCisgICAgICovCisKKyAgICAuID0gQUxJR04gKCBfbWF4X2FsaWduICk7CisgICAgLmRhdGEgOiB7CisJX2RhdGEgPSAuOworCSooLmRhdGEpCisJKiguZGF0YS4qKQorCSooU09SVCgudGJsLiopKQkJLyogVmFyaW91cyB0YWJsZXMuICBTZWUgaW5jbHVkZS90YWJsZXMuaCAqLworCV9lZGF0YSA9IC47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgYnNzIHNlY3Rpb24KKyAgICAgKgorICAgICAqLworCisgICAgLiA9IEFMSUdOICggX21heF9hbGlnbiApOworICAgIC5ic3MgOiB7CisJX2JzcyA9IC47CisJKiguYnNzKQorCSooLmJzcy4qKQorCSooQ09NTU9OKQorCV9lYnNzID0gLjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlYWsgc3ltYm9scyB0aGF0IG5lZWQgemVybyB2YWx1ZXMgaWYgbm90IG90aGVyd2lzZSBkZWZpbmVkCisgICAgICoKKyAgICAgKi8KKworICAgIC53ZWFrIDB4MCA6IHsKKwlfd2VhayA9IC47CisJKigud2VhaykKKwlfZXdlYWsgPSAuOworICAgIH0KKyAgICBfYXNzZXJ0ID0gQVNTRVJUICggKCBfd2VhayA9PSBfZXdlYWsgKSwgIi53ZWFrIGlzIG5vbi16ZXJvIGxlbmd0aCIgKTsKKworICAgIC8qCisgICAgICogRGlzcG9zZSBvZiB0aGUgY29tbWVudCBhbmQgbm90ZSBzZWN0aW9ucyB0byBtYWtlIHRoZSBsaW5rIG1hcAorICAgICAqIGVhc2llciB0byByZWFkCisgICAgICoKKyAgICAgKi8KKworICAgIC9ESVNDQVJELyA6IHsKKwkqKC5jb21tZW50KQorCSooLmNvbW1lbnQuKikKKwkqKC5ub3RlKQorCSooLm5vdGUuKikKKwkqKC5laF9mcmFtZSkKKwkqKC5laF9mcmFtZS4qKQorCSooLnJlbCkKKwkqKC5yZWwuKikKKwkqKC5kaXNjYXJkKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2XzY0L01ha2VmaWxlIGIvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjMmZmNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2XzY0L01ha2VmaWxlCkBAIC0wLDAgKzEsNDEgQEAKKyMgQ29kZSBzaXplIHJlZHVjdGlvbi4KKyMKK0NGTEFHUwkJKz0gLWZzdHJlbmd0aC1yZWR1Y2UgLWZvbWl0LWZyYW1lLXBvaW50ZXIKKworIyBDb2RlIHNpemUgcmVkdWN0aW9uLiAgZ2NjMyBuZWVkcyBhIGRpZmZlcmVudCBzeW50YXggdG8gZ2NjMiBpZiB5b3UKKyMgd2FudCB0byBhdm9pZCBzcHVyaW91cyB3YXJuaW5ncy4KKyMKK0NGTEFHUwkJKz0gLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xCisKKyMgVXNlICVyaXAtcmVsYXRpdmUgYWRkcmVzc2luZyB3aGVyZXZlciBwb3NzaWJsZS4KKyMKK0NGTEFHUwkJKz0gLWZwaWUKKworIyBGb3JjZSA2NC1iaXQgY29kZQorIworQ0ZMQUdTCQkrPSAtbTY0CitBU0ZMQUdTCQkrPSAtLTY0CitMREZMQUdTCQkrPSAtbSBlbGZfeDg2XzY0CisKKyMgRUZJIHJlcXVpcmVzIC1mc2hvcnQtd2NoYXIsIGFuZCBub3RoaW5nIGVsc2UgY3VycmVudGx5IHVzZXMgd2NoYXJfdAorIworQ0ZMQUdTCQkrPSAtZnNob3J0LXdjaGFyCisKKyMgV2UgbmVlZCB0byB1bmRlZmluZSB0aGUgZGVmYXVsdCBtYWNybyAiaTM4NiIgd2hlbiBjb21waWxpbmcgLlMKKyMgZmlsZXMsIG90aGVyd2lzZSAiLmFyY2ggaTM4NiIgdHJhbnNsYXRlcyB0byAiLmFyY2ggMSIuLi4KKyMKK0NGTEFHUwkJCSs9IC1VaTM4NgorCisjIHg4Nl82NC1zcGVjaWZpYyBkaXJlY3RvcmllcyBjb250YWluaW5nIHNvdXJjZSBmaWxlcworIworU1JDRElSUwkJKz0gYXJjaC94ODZfNjQvcHJlZml4CisKKyMgSW5jbHVkZSBjb21tb24geDg2IE1ha2VmaWxlCisjCitNQUtFREVQUwkrPSBhcmNoL3g4Ni9NYWtlZmlsZQoraW5jbHVkZSBhcmNoL3g4Ni9NYWtlZmlsZQorCisjIEluY2x1ZGUgcGxhdGZvcm0tc3BlY2lmaWMgTWFrZWZpbGUKKyMKK01BS0VERVBTCSs9IGFyY2gveDg2XzY0L01ha2VmaWxlLiQoUExBVEZPUk0pCitpbmNsdWRlIGFyY2gveDg2XzY0L01ha2VmaWxlLiQoUExBVEZPUk0pCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL3g4Nl82NC9NYWtlZmlsZS5lZmkgYi9ncHhlL3NyYy9hcmNoL3g4Nl82NC9NYWtlZmlsZS5lZmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiNzEyNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2XzY0L01ha2VmaWxlLmVmaQpAQCAtMCwwICsxLDE0IEBACisjIC0qLSBtYWtlZmlsZSAtKi0gOiBGb3JjZSBlbWFjcyB0byB1c2UgTWFrZWZpbGUgbW9kZQorCisjIEVGSSBwcm9iYWJseSBkb2Vzbid0IGd1YXJhbnRlZSB1cyBhIHJlZCB6b25lLCBzbyBsZXQncyBub3QgcmVseSBvbiBpdC4KKyMKK0NGTEFHUwkJKz0gLW1uby1yZWQtem9uZQorCisjIFNwZWNpZnkgRUZJIGltYWdlIGJ1aWxkZXIKKyMKK0VMRjJFRkkJCT0gJChFTEYyRUZJNjQpCisKKyMgSW5jbHVkZSBnZW5lcmljIEVGSSBNYWtlZmlsZQorIworTUFLRURFUFMJKz0gYXJjaC94ODYvTWFrZWZpbGUuZWZpCitpbmNsdWRlIGFyY2gveDg2L01ha2VmaWxlLmVmaQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL2J5dGVzd2FwLmggYi9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvYnl0ZXN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQ4NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL2J5dGVzd2FwLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfQklUU19CWVRFU1dBUF9ICisjZGVmaW5lIF9CSVRTX0JZVEVTV0FQX0gKKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUsIGNvbnN0ICkpIHVpbnQxNl90CitfX2Jzd2FwX3ZhcmlhYmxlXzE2ICggdWludDE2X3QgeCApIHsKKwlfX2FzbV9fICggInhjaGdiICViMCwlaDAiIDogIj1RIiAoIHggKSA6ICIwIiAoIHggKSApOworCXJldHVybiB4OworfQorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSwgY29uc3QgKSkgdWludDMyX3QKK19fYnN3YXBfdmFyaWFibGVfMzIgKCB1aW50MzJfdCB4ICkgeworCV9fYXNtX18gKCAiYnN3YXBsICVrMCIgOiAiPXIiICggeCApIDogIjAiICggeCApICk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lLCBjb25zdCApKSB1aW50NjRfdAorX19ic3dhcF92YXJpYWJsZV82NCAoIHVpbnQ2NF90IHggKSB7CisJX19hc21fXyAoICJic3dhcHEgJXEwIiA6ICI9ciIgKCB4ICkgOiAiMCIgKCB4ICkgKTsKKwlyZXR1cm4geDsKK30KKworI2VuZGlmIC8qIF9CSVRTX0JZVEVTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy9jb21waWxlci5oIGIvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL2NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhN2VhYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy9jb21waWxlci5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0JJVFNfQ09NUElMRVJfSAorI2RlZmluZSBfQklUU19DT01QSUxFUl9ICisKKyNpZm5kZWYgQVNTRU1CTFkKKworLyoqIERlY2xhcmUgYSBmdW5jdGlvbiB3aXRoIHN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbnMgKi8KKyNkZWZpbmUgX19hc21jYWxsIF9fYXR0cmlidXRlX18gKCggcmVncGFybSgwKSApKQorCisvKiogRGVjbGFyZSBhIGZ1bmN0aW9uIHdpdGggbGliZ2NjIGltcGxpY2l0IGxpbmthZ2UgKi8KKyNkZWZpbmUgX19saWJnY2MKKworI2VuZGlmIC8qIEFTU0VNQkxZICovCisKKyNlbmRpZiAvKiBfQklUU19DT01QSUxFUl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvZW5kaWFuLmggYi9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzZTcwMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy9lbmRpYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgRVRIRVJCT09UX0JJVFNfRU5ESUFOX0gKKyNkZWZpbmUgRVRIRVJCT09UX0JJVFNfRU5ESUFOX0gKKworI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCisKKyNlbmRpZiAvKiBFVEhFUkJPT1RfQklUU19FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL2VycmZpbGUuaCBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy9lcnJmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkYTI2YgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy9lcnJmaWxlLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfQklUU19FUlJGSUxFX0gKKyNkZWZpbmUgX0JJVFNfRVJSRklMRV9ICisKKy8qKgorICogQGFkZHRvZ3JvdXAgZXJyZmlsZSBFcnJvciBmaWxlIGlkZW50aWZpZXJzCisgKiBAeworICovCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogX0JJVFNfRVJSRklMRV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvaW8uaCBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWZkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvaW8uaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9CSVRTX0lPX0gKKyNkZWZpbmUgX0JJVFNfSU9fSAorCisvKiogQGZpbGUKKyAqCisgKiB4ODZfNjQtc3BlY2lmaWMgSS9PIEFQSSBpbXBsZW1lbnRhdGlvbnMKKyAqCisgKi8KKworI2VuZGlmIC8qIF9CSVRTX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy9uYXAuaCBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy9uYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBjOGEyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL25hcC5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0JJVFNfTkFQX0gKKyNkZWZpbmUgX0JJVFNfTkFQX0gKKworLyoqIEBmaWxlCisgKgorICogeDg2XzY0LXNwZWNpZmljIENQVSBzbGVlcGluZyBBUEkgaW1wbGVtZW50YXRpb25zCisgKgorICovCisKKyNpbmNsdWRlIDxncHhlL2VmaS9lZml4ODZfbmFwLmg+CisKKyNlbmRpZiAvKiBfQklUU19NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL3NtYmlvcy5oIGIvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL3NtYmlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMDExOGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvc21iaW9zLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfQklUU19TTUJJT1NfSAorI2RlZmluZSBfQklUU19TTUJJT1NfSAorCisvKiogQGZpbGUKKyAqCisgKiBpMzg2LXNwZWNpZmljIFNNQklPUyBBUEkgaW1wbGVtZW50YXRpb25zCisgKgorICovCisKKyNlbmRpZiAvKiBfQklUU19TTUJJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL3N0ZGludC5oIGIvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjcyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvc3RkaW50LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfQklUU19TVERJTlRfSAorI2RlZmluZSBfQklUU19TVERJTlRfSAorCit0eXBlZGVmIF9fU0laRV9UWVBFX18JCXNpemVfdDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcJCXNzaXplX3Q7Cit0eXBlZGVmIHNpZ25lZCBsb25nCQlvZmZfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwl1aW50NjRfdDsKKwordHlwZWRlZiBzaWduZWQgY2hhcgkJaW50OF90OwordHlwZWRlZiBzaWduZWQgc2hvcnQJCWludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQJCWludDMyX3Q7Cit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcJaW50NjRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQlwaHlzYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQlpbnRwdHJfdDsKKworI2VuZGlmIC8qIF9CSVRTX1NURElOVF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvdGltZXIuaCBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYTZjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvdGltZXIuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9CSVRTX1RJTUVSX0gKKyNkZWZpbmUgX0JJVFNfVElNRVJfSAorCisvKiogQGZpbGUKKyAqCisgKiB4ODZfNjQtc3BlY2lmaWMgdGltZXIgQVBJIGltcGxlbWVudGF0aW9ucworICoKKyAqLworCisjZW5kaWYgLyogX0JJVFNfVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9iaXRzL3VhY2Nlc3MuaCBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy91YWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1ODI5MgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy91YWNjZXNzLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfQklUU19VQUNDRVNTX0gKKyNkZWZpbmUgX0JJVFNfVUFDQ0VTU19ICisKKy8qKiBAZmlsZQorICoKKyAqIHg4Nl82NC1zcGVjaWZpYyB1c2VyIGFjY2VzcyBBUEkgaW1wbGVtZW50YXRpb25zCisgKgorICovCisKKyNlbmRpZiAvKiBfQklUU19VQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvYml0cy91bWFsbG9jLmggYi9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvdW1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYmY5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2JpdHMvdW1hbGxvYy5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0JJVFNfVU1BTExPQ19ICisjZGVmaW5lIF9CSVRTX1VNQUxMT0NfSAorCisvKiogQGZpbGUKKyAqCisgKiB4ODZfNjQtc3BlY2lmaWMgdXNlciBtZW1vcnkgYWxsb2NhdGlvbiBBUEkgaW1wbGVtZW50YXRpb25zCisgKgorICovCisKKyNlbmRpZiAvKiBfQklUU19VTUFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvZ2RibWFjaC5oIGIvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9nZGJtYWNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmOGU5NAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2FyY2gveDg2XzY0L2luY2x1ZGUvZ2RibWFjaC5oCkBAIC0wLDAgKzEsNTEgQEAKKyNpZm5kZWYgR0RCTUFDSF9ICisjZGVmaW5lIEdEQk1BQ0hfSAorCisvKiogQGZpbGUKKyAqCisgKiBHREIgYXJjaGl0ZWN0dXJlIHNwZWNpZmljcworICoKKyAqIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgbWFjaGluZSBzdGF0ZSBhbmQKKyAqIGRlYnVnZ2luZyBjb250ZXh0LgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBnZGJyZWdfdDsKKworLyogVGhlIHJlZ2lzdGVyIHNuYXBzaG90LCB0aGlzIG11c3QgYmUgaW4gc3luYyB3aXRoIGludGVycnVwdCBoYW5kbGVyIGFuZCB0aGUKKyAqIEdEQiBwcm90b2NvbC4gKi8KK2VudW0geworCS8vIFNUVUI6IGRvbid0IGV4cGVjdCB0aGlzIHRvIHdvcmshCisJR0RCTUFDSF9FSVAsCisJR0RCTUFDSF9FRkxBR1MsCisJR0RCTUFDSF9OUkVHUywKKwlHREJNQUNIX1NJWkVPRl9SRUdTID0gR0RCTUFDSF9OUkVHUyAqIHNpemVvZiAoIGdkYnJlZ190ICkKK307CisKKy8qIEJyZWFrcG9pbnQgdHlwZXMgKi8KK2VudW0geworCUdEQk1BQ0hfQlBNRU0sCisJR0RCTUFDSF9CUEhXLAorCUdEQk1BQ0hfV0FUQ0gsCisJR0RCTUFDSF9SV0FUQ0gsCisJR0RCTUFDSF9BV0FUQ0gsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2RibWFjaF9zZXRfcGMgKCBnZGJyZWdfdCAqcmVncywgZ2RicmVnX3QgcGMgKSB7CisJcmVncyBbIEdEQk1BQ0hfRUlQIF0gPSBwYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdkYm1hY2hfc2V0X3NpbmdsZV9zdGVwICggZ2RicmVnX3QgKnJlZ3MsIGludCBzdGVwICkgeworCXJlZ3MgWyBHREJNQUNIX0VGTEFHUyBdICY9IH4oIDEgPDwgOCApOyAvKiBUcmFjZSBGbGFnIChURikgKi8KKwlyZWdzIFsgR0RCTUFDSF9FRkxBR1MgXSB8PSAoIHN0ZXAgPDwgOCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2RibWFjaF9icmVha3BvaW50ICggdm9pZCApIHsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJpbnQgJDNcbiIgKTsKK30KKworZXh0ZXJuIGludCBnZGJtYWNoX3NldF9icmVha3BvaW50ICggaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbiwgaW50IGVuYWJsZSApOworCisjZW5kaWYgLyogR0RCTUFDSF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2xpbWl0cy5oIGIvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2Y4N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvYXJjaC94ODZfNjQvaW5jbHVkZS9saW1pdHMuaApAQCAtMCwwICsxLDU5IEBACisjaWZuZGVmIExJTUlUU19ICisjZGVmaW5lIExJTUlUU19ICTEKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBgY2hhcicgKi8KKyNkZWZpbmUgQ0hBUl9CSVQJOAorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgY2hhcicgY2FuIGhvbGQgKi8KKyNkZWZpbmUgU0NIQVJfTUlOCSgtMTI4KQorI2RlZmluZSBTQ0hBUl9NQVgJMTI3CisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGNoYXInIGNhbiBob2xkLiAoTWluaW11bSBpcyAwLikgKi8KKyNkZWZpbmUgVUNIQVJfTUFYCTI1NQorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBjaGFyJyBjYW4gaG9sZCAqLworI2RlZmluZSBDSEFSX01JTglTQ0hBUl9NSU4KKyNkZWZpbmUgQ0hBUl9NQVgJU0NIQVJfTUFYCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBzaG9ydCBpbnQnIGNhbiBob2xkICovCisjZGVmaW5lIFNIUlRfTUlOCSgtMzI3NjgpCisjZGVmaW5lIFNIUlRfTUFYCTMyNzY3CisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIHNob3J0JyBjYW4gaG9sZC4gKE1pbmltdW0gaXMgMC4pICovCisjZGVmaW5lIFVTSFJUX01BWAk2NTUzNQorCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBpbnQnIGNhbiBob2xkICovCisjZGVmaW5lIElOVF9NSU4JCSgtSU5UX01BWCAtIDEpCisjZGVmaW5lIElOVF9NQVgJCTIxNDc0ODM2NDcKKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgaW50JyBjYW4gaG9sZC4gKE1pbmltdW0gaXMgMC4pICovCisjZGVmaW5lIFVJTlRfTUFYCTQyOTQ5NjcyOTVVCisKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGludCcgY2FuIGhvbGQgKi8KKyNkZWZpbmUgSU5UX01BWAkJMjE0NzQ4MzY0NworI2RlZmluZSBJTlRfTUlOCQkoLUlOVF9NQVggLSAxKQorCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGludCcgY2FuIGhvbGQuIChNaW5pbXVtIGlzIDAuKSAqLworI2RlZmluZSBVSU5UX01BWAk0Mjk0OTY3Mjk1VQorCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nJyBjYW4gaG9sZCAqLworI2RlZmluZSBMT05HX01BWAk5MjIzMzcyMDM2ODU0Nzc1ODA3TAorI2RlZmluZSBMT05HX01JTgkoLUxPTkdfTUFYIC0gMUwpCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcnIGNhbiBob2xkLiAoTWluaW11bSBpcyAwLikgKi8KKyNkZWZpbmUgVUxPTkdfTUFYCTE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZycgY2FuIGhvbGQgKi8KKyNkZWZpbmUgTExPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorI2RlZmluZSBMTE9OR19NSU4JKC1MT05HX01BWCAtIDFMTCkKKworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGxvbmcnIGNhbiBob2xkLiAoTWluaW11bSBpcyAwLikgKi8KKyNkZWZpbmUgVUxMT05HX01BWAkxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTAorCisKKyNlbmRpZiAvKiBMSU1JVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29uZmlnL2NvbmZpZy5jIGIvZ3B4ZS9zcmMvY29uZmlnL2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTc2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb25maWcvY29uZmlnLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGNvbmZpZy9nZW5lcmFsLmg+CisjaW5jbHVkZSA8Y29uZmlnL2NvbnNvbGUuaD4KKworLyoqIEBmaWxlCisgKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyB0aGF0IHB1bGwgdmFyaW91cyBvYmplY3RzIGludG8gdGhlIGxpbmsKKyAqIGJhc2VkIG9uIGRlZmluaXRpb25zIGluIGNvbmZpZ3VyYXRpb24gaGVhZGVyIGZpbGVzLiBJZGVhbGx5IGl0CisgKiBzaG91bGQgYmUgdGhlIG9ubHkgcGxhY2UgaW4gZ1BYRSB3aGVyZSBvbmUgbWlnaHQgbmVlZCB0byB1c2UgI2lmZGVmCisgKiBmb3IgY29tcGlsZS10aW1lIG9wdGlvbnMuCisgKgorICogSW4gdGhlIGZhaXJseSBjb21tb24gY2FzZSB3aGVyZSBhbiBvYmplY3Qgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZAorICogZm9yIGluY2x1c2lvbiBpZiB0aGUgc3Vic3lzdGVtIGl0IGRlcGVuZHMgb24gaXMgcHJlc2VudCwgaXRzCisgKiBjb25maWd1cmF0aW9uIG1hY3JvcyBzaG91bGQgYmUgcGxhY2VkIGluIGEgZmlsZSBuYW1lZAorICogPHR0PmNvbmZpZ188aT5zdWJzeXN0ZW08L2k+LmM8L3R0Piwgd2hlcmUgQGUgc3Vic3lzdGVtIGlzIHRoZQorICogb2JqZWN0IGJhc2VuYW1lIG9mIHRoZSBtYWluIHNvdXJjZSBmaWxlIGZvciB0aGF0IHN1YnN5c3RlbS4gVGhlCisgKiBidWlsZCBzeXN0ZW0gd2lsbCBwdWxsIGluIHRoYXQgZmlsZSBpZiBAYyBzdWJzeXN0ZW0uYyBpcyBpbmNsdWRlZAorICogaW4gdGhlIGZpbmFsIGdQWEUgZXhlY3V0YWJsZSBidWlsdC4KKyAqLworCisvKgorICogQnVpbGQgSUQgc3RyaW5nIGNhbGN1bGF0aW9ucworICoKKyAqLworI3VuZGVmIFhTVFIKKyN1bmRlZiBTVFIKKyNkZWZpbmUgWFNUUihzKSBTVFIocykKKyNkZWZpbmUgU1RSKHMpICNzCisKKyNpZmRlZiBCVUlMRF9TRVJJQUwKKyNpbmNsdWRlICJjb25maWcvLmJ1aWxkc2VyaWFsLmgiCisjZGVmaW5lIEJVSUxEX1NFUklBTF9TVFIgIiAjIiBYU1RSKEJVSUxEX1NFUklBTF9OVU0pCisjZWxzZQorI2RlZmluZSBCVUlMRF9TRVJJQUxfU1RSICIiCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0lECisjZGVmaW5lIEJVSUxEX0lEX1NUUiAiICIgQlVJTERfSUQKKyNlbHNlCisjZGVmaW5lIEJVSUxEX0lEX1NUUiAiIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJVSUxEX0lEKSB8fCBkZWZpbmVkKEJVSUxEX1NFUklBTCkKKyNkZWZpbmUgQlVJTERfU1RSSU5HICIgW2J1aWxkIiBCVUlMRF9JRF9TVFIgQlVJTERfU0VSSUFMX1NUUiAiXSIKKyNlbHNlCisjZGVmaW5lIEJVSUxEX1NUUklORyAiIgorI2VuZGlmCisKKy8qCisgKiBEcmFnIGluIGFsbCByZXF1ZXN0ZWQgY29uc29sZSB0eXBlcworICoKKyAqLworCisjaWZkZWYgQ09OU09MRV9QQ0JJT1MKK1JFUVVJUkVfT0JKRUNUICggYmlvc19jb25zb2xlICk7CisjZW5kaWYKKyNpZmRlZiBDT05TT0xFX1NFUklBTAorUkVRVUlSRV9PQkpFQ1QgKCBzZXJpYWxfY29uc29sZSApOworI2VuZGlmCisjaWZkZWYgQ09OU09MRV9ESVJFQ1RfVkdBCitSRVFVSVJFX09CSkVDVCAoIHZpZGVvX3N1YnIgKTsKKyNlbmRpZgorI2lmZGVmIENPTlNPTEVfQlRFWFQKK1JFUVVJUkVfT0JKRUNUICggYnRleHQgKTsKKyNlbmRpZgorI2lmZGVmIENPTlNPTEVfUENfS0JECitSRVFVSVJFX09CSkVDVCAoIHBjX2tiZCApOworI2VuZGlmCisjaWZkZWYgQ09OU09MRV9TWVNMT0cKK1JFUVVJUkVfT0JKRUNUICggc3lzbG9nICk7CisjZW5kaWYKKyNpZmRlZiBDT05TT0xFX0VGSQorUkVRVUlSRV9PQkpFQ1QgKCBlZmlfY29uc29sZSApOworI2VuZGlmCisKKy8qCisgKiBEcmFnIGluIGFsbCByZXF1ZXN0ZWQgbmV0d29yayBwcm90b2NvbHMKKyAqCisgKi8KKyNpZmRlZiBORVRfUFJPVE9fSVBWNAorUkVRVUlSRV9PQkpFQ1QgKCBpcHY0ICk7CisjZW5kaWYKKworLyoKKyAqIERyYWcgaW4gYWxsIHJlcXVlc3RlZCBQWEUgc3VwcG9ydAorICoKKyAqLworI2lmZGVmIFBYRV9NRU5VCitSRVFVSVJFX09CSkVDVCAoIHB4ZW1lbnUgKTsKKyNlbmRpZgorI2lmZGVmIFBYRV9TVEFDSworUkVRVUlSRV9PQkpFQ1QgKCBweGVfY2FsbCApOworI2VuZGlmCisKKy8qCisgKiBEcmFnIGluIGFsbCByZXF1ZXN0ZWQgZG93bmxvYWQgcHJvdG9jb2xzCisgKgorICovCisjaWZkZWYgRE9XTkxPQURfUFJPVE9fVEZUUAorUkVRVUlSRV9PQkpFQ1QgKCB0ZnRwICk7CisjZW5kaWYKKyNpZmRlZiBET1dOTE9BRF9QUk9UT19IVFRQCitSRVFVSVJFX09CSkVDVCAoIGh0dHAgKTsKKyNlbmRpZgorI2lmZGVmIERPV05MT0FEX1BST1RPX0hUVFBTCitSRVFVSVJFX09CSkVDVCAoIGh0dHBzICk7CisjZW5kaWYKKyNpZmRlZiBET1dOTE9BRF9QUk9UT19GVFAKK1JFUVVJUkVfT0JKRUNUICggZnRwICk7CisjZW5kaWYKKyNpZmRlZiBET1dOTE9BRF9QUk9UT19URlRNCitSRVFVSVJFX09CSkVDVCAoIHRmdG0gKTsKKyNlbmRpZgorI2lmZGVmIERPV05MT0FEX1BST1RPX1NMQU0KK1JFUVVJUkVfT0JKRUNUICggc2xhbSApOworI2VuZGlmCisKKy8qCisgKiBEcmFnIGluIGFsbCByZXF1ZXN0ZWQgU0FOIGJvb3QgcHJvdG9jb2xzCisgKgorICovCisjaWZkZWYgU0FOQk9PVF9QUk9UT19JU0NTSQorUkVRVUlSRV9PQkpFQ1QgKCBpc2NzaWJvb3QgKTsKKyNlbmRpZgorI2lmZGVmIFNBTkJPT1RfUFJPVE9fQU9FCitSRVFVSVJFX09CSkVDVCAoIGFvZWJvb3QgKTsKKyNlbmRpZgorI2lmZGVmIFNBTkJPT1RfUFJPVE9fSUJfU1JQCitSRVFVSVJFX09CSkVDVCAoIGliX3NycGJvb3QgKTsKKyNlbmRpZgorCisvKgorICogRHJhZyBpbiBhbGwgcmVxdWVzdGVkIHJlc29sdmVycworICoKKyAqLworI2lmZGVmIEROU19SRVNPTFZFUgorUkVRVUlSRV9PQkpFQ1QgKCBkbnMgKTsKKyNlbmRpZgorCisvKgorICogRHJhZyBpbiBhbGwgcmVxdWVzdGVkIGltYWdlIGZvcm1hdHMKKyAqCisgKi8KKyNpZmRlZiBJTUFHRV9OQkkKK1JFUVVJUkVfT0JKRUNUICggbmJpICk7CisjZW5kaWYKKyNpZmRlZiBJTUFHRV9FTEYKK1JFUVVJUkVfT0JKRUNUICggZWxmYm9vdCApOworI2VuZGlmCisjaWZkZWYgSU1BR0VfRlJFRUJTRAorUkVRVUlSRV9PQkpFQ1QgKCBmcmVlYnNkICk7CisjZW5kaWYKKyNpZmRlZiBJTUFHRV9NVUxUSUJPT1QKK1JFUVVJUkVfT0JKRUNUICggbXVsdGlib290ICk7CisjZW5kaWYKKyNpZmRlZiBJTUFHRV9BT1VUCitSRVFVSVJFX09CSkVDVCAoIGFvdXQgKTsKKyNlbmRpZgorI2lmZGVmIElNQUdFX1dJTkNFCitSRVFVSVJFX09CSkVDVCAoIHdpbmNlICk7CisjZW5kaWYKKyNpZmRlZiBJTUFHRV9QWEUKK1JFUVVJUkVfT0JKRUNUICggcHhlX2ltYWdlICk7CisjZW5kaWYKKyNpZmRlZiBJTUFHRV9TQ1JJUFQKK1JFUVVJUkVfT0JKRUNUICggc2NyaXB0ICk7CisjZW5kaWYKKyNpZmRlZiBJTUFHRV9CWklNQUdFCitSRVFVSVJFX09CSkVDVCAoIGJ6aW1hZ2UgKTsKKyNlbmRpZgorI2lmZGVmIElNQUdFX0VMVE9SSVRPCitSRVFVSVJFX09CSkVDVCAoIGVsdG9yaXRvICk7CisjZW5kaWYKKyNpZmRlZiBJTUFHRV9DT01CT09UCitSRVFVSVJFX09CSkVDVCAoIGNvbWJvb3QgKTsKK1JFUVVJUkVfT0JKRUNUICggY29tMzIgKTsKK1JFUVVJUkVfT0JKRUNUICggY29tYm9vdF9jYWxsICk7CitSRVFVSVJFX09CSkVDVCAoIGNvbTMyX2NhbGwgKTsKK1JFUVVJUkVfT0JKRUNUICggY29tMzJfd3JhcHBlciApOworUkVRVUlSRV9PQkpFQ1QgKCBjb21ib290X3Jlc29sdiApOworI2VuZGlmCisjaWZkZWYgSU1BR0VfRUZJCitSRVFVSVJFX09CSkVDVCAoIGVmaV9pbWFnZSApOworI2VuZGlmCisKKy8qCisgKiBEcmFnIGluIGFsbCByZXF1ZXN0ZWQgY29tbWFuZHMKKyAqCisgKi8KKyNpZmRlZiBBVVRPQk9PVF9DTUQKK1JFUVVJUkVfT0JKRUNUICggYXV0b2Jvb3RfY21kICk7CisjZW5kaWYKKyNpZmRlZiBOVk9fQ01ECitSRVFVSVJFX09CSkVDVCAoIG52b19jbWQgKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DTUQKK1JFUVVJUkVfT0JKRUNUICggY29uZmlnX2NtZCApOworI2VuZGlmCisjaWZkZWYgSUZNR01UX0NNRAorUkVRVUlSRV9PQkpFQ1QgKCBpZm1nbXRfY21kICk7CisjZW5kaWYKKy8qIElXTUdNVF9DTUQgaXMgYnJvdWdodCBpbiBieSBuZXQ4MDIxMS5jIGlmIHJlcXVlc3RlZCAqLworI2lmZGVmIFJPVVRFX0NNRAorUkVRVUlSRV9PQkpFQ1QgKCByb3V0ZV9jbWQgKTsKKyNlbmRpZgorI2lmZGVmIElNQUdFX0NNRAorUkVRVUlSRV9PQkpFQ1QgKCBpbWFnZV9jbWQgKTsKKyNlbmRpZgorI2lmZGVmIERIQ1BfQ01ECitSRVFVSVJFX09CSkVDVCAoIGRoY3BfY21kICk7CisjZW5kaWYKKyNpZmRlZiBTQU5CT09UX0NNRAorUkVRVUlSRV9PQkpFQ1QgKCBzYW5ib290X2NtZCApOworI2VuZGlmCisjaWZkZWYgTE9HSU5fQ01ECitSRVFVSVJFX09CSkVDVCAoIGxvZ2luX2NtZCApOworI2VuZGlmCisjaWZkZWYgVElNRV9DTUQKK1JFUVVJUkVfT0JKRUNUICggdGltZV9jbWQgKTsKKyNlbmRpZgorI2lmZGVmIERJR0VTVF9DTUQKK1JFUVVJUkVfT0JKRUNUICggZGlnZXN0X2NtZCApOworI2VuZGlmCisjaWZkZWYgUFhFX0NNRAorUkVRVUlSRV9PQkpFQ1QgKCBweGVfY21kICk7CisjZW5kaWYKKworLyoKKyAqIERyYWcgaW4gbWlzY2VsbGFuZW91cyBvYmplY3RzCisgKgorICovCisjaWZkZWYgTlVMTF9UUkFQCitSRVFVSVJFX09CSkVDVCAoIG51bGx0cmFwICk7CisjZW5kaWYKKyNpZmRlZiBHREJTRVJJQUwKK1JFUVVJUkVfT0JKRUNUICggZ2RiaWR0ICk7CitSRVFVSVJFX09CSkVDVCAoIGdkYnNlcmlhbCApOworUkVRVUlSRV9PQkpFQ1QgKCBnZGJzdHViX2NtZCApOworI2VuZGlmCisjaWZkZWYgR0RCVURQCitSRVFVSVJFX09CSkVDVCAoIGdkYmlkdCApOworUkVRVUlSRV9PQkpFQ1QgKCBnZGJ1ZHAgKTsKK1JFUVVJUkVfT0JKRUNUICggZ2Ric3R1Yl9jbWQgKTsKKyNlbmRpZgorCisvKgorICogRHJhZyBpbiBvYmplY3RzIHRoYXQgYXJlIGFsd2F5cyByZXF1aXJlZCwgYnV0IG5vdCBkcmFnZ2VkIGluIHZpYQorICogc3ltYm9sIGRlcGVuZGVuY2llcy4KKyAqCisgKi8KK1JFUVVJUkVfT0JKRUNUICggZGV2aWNlICk7CitSRVFVSVJFX09CSkVDVCAoIGVtYmVkZGVkICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb25maWcvY29uZmlnX25ldDgwMjExLmMgYi9ncHhlL3NyYy9jb25maWcvY29uZmlnX25ldDgwMjExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzYzM2MwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvbmZpZy9jb25maWdfbmV0ODAyMTEuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxjb25maWcvZ2VuZXJhbC5oPgorCisvKiogQGZpbGUKKyAqCisgKiA4MDIuMTEgY29uZmlndXJhdGlvbiBvcHRpb25zCisgKgorICovCisKKy8qCisgKiBEcmFnIGluIDgwMi4xMS1zcGVjaWZpYyBjb21tYW5kcworICoKKyAqLworI2lmZGVmIElXTUdNVF9DTUQKK1JFUVVJUkVfT0JKRUNUICggaXdtZ210X2NtZCApOworI2VuZGlmCisKKy8qCisgKiBEcmFnIGluIDgwMi4xMSBlcnJvciBtZXNzYWdlIHRhYmxlcworICoKKyAqLworI2lmZGVmIEVSUk1TR184MDIxMQorUkVRVUlSRV9PQkpFQ1QgKCB3aXJlbGVzc19lcnJvcnMgKTsKKyNlbmRpZgorCisvKgorICogRHJhZyBpbiA4MDIuMTEgY3J5cHRvc3lzdGVtcyBhbmQgaGFuZHNoYWtpbmcgcHJvdG9jb2xzCisgKgorICovCisjaWZkZWYgQ1JZUFRPXzgwMjExX1dFUAorUkVRVUlSRV9PQkpFQ1QgKCB3ZXAgKTsKKyNlbmRpZgorCisjaWZkZWYgQ1JZUFRPXzgwMjExX1dQQTIKKyNkZWZpbmUgQ1JZUFRPXzgwMjExX1dQQQorUkVRVUlSRV9PQkpFQ1QgKCB3cGFfY2NtcCApOworI2VuZGlmCisKKyNpZmRlZiBDUllQVE9fODAyMTFfV1BBCitSRVFVSVJFX09CSkVDVCAoIHdwYV9wc2sgKTsKK1JFUVVJUkVfT0JKRUNUICggd3BhX3RraXAgKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29uZmlnL2NvbmZpZ19yb21wcmVmaXguYyBiL2dweGUvc3JjL2NvbmZpZy9jb25maWdfcm9tcHJlZml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmMWU3OAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvbmZpZy9jb25maWdfcm9tcHJlZml4LmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Y29uZmlnL2dlbmVyYWwuaD4KKworLyoqIEBmaWxlCisgKgorICogUk9NIHByZWZpeCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqCisgKi8KKworLyoKKyAqIFByb3ZpZGUgVU5ESSBsb2FkZXIgaWYgUFhFIHN0YWNrIGlzIHJlcXVlc3RlZAorICoKKyAqLworI2lmZGVmIFBYRV9TVEFDSworUkVRVUlSRV9PQkpFQ1QgKCB1bmRpbG9hZGVyICk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvbmZpZy9jb25zb2xlLmggYi9ncHhlL3NyYy9jb25maWcvY29uc29sZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMzI0MmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb25maWcvY29uc29sZS5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgQ09ORklHX0NPTlNPTEVfSAorI2RlZmluZSBDT05GSUdfQ09OU09MRV9ICisKKy8qKiBAZmlsZQorICoKKyAqIENvbnNvbGUgY29uZmlndXJhdGlvbgorICoKKyAqIFRoZXNlIG9wdGlvbnMgc3BlY2lmeSB0aGUgY29uc29sZSB0eXBlcyB0aGF0IEV0aGVyYm9vdCB3aWxsIHVzZSBmb3IKKyAqIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGNvbmZpZy9kZWZhdWx0cy5oPgorCisvLyNkZWZpbmUJQ09OU09MRV9QQ0JJT1MJCS8qIERlZmF1bHQgQklPUyBjb25zb2xlICovCisvLyNkZWZpbmUJQ09OU09MRV9TRVJJQUwJCS8qIFNlcmlhbCBwb3J0ICovCisvLyNkZWZpbmUJQ09OU09MRV9ESVJFQ1RfVkdBCS8qIERpcmVjdCBhY2Nlc3MgdG8gVkdBIGNhcmQgKi8KKy8vI2RlZmluZQlDT05TT0xFX0JURVhUCQkvKiBXaG8ga25vd3Mgd2hhdCB0aGlzIGRvZXM/ICovCisvLyNkZWZpbmUJQ09OU09MRV9QQ19LQkQJCS8qIERpcmVjdCBhY2Nlc3MgdG8gUEMga2V5Ym9hcmQgKi8KKworI2VuZGlmIC8qIENPTkZJR19DT05TT0xFX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvbmZpZy9kZWZhdWx0cy5oIGIvZ3B4ZS9zcmMvY29uZmlnL2RlZmF1bHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5YzBiMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvbmZpZy9kZWZhdWx0cy5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgQ09ORklHX0RFRkFVTFRTX0gKKyNkZWZpbmUgQ09ORklHX0RFRkFVTFRTX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjZGVmaW5lIENPTkZJR19ERUZBVUxUUyhfcGxhdGZvcm0pIDxjb25maWcvZGVmYXVsdHMvX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIENPTkZJR19ERUZBVUxUUyhQTEFURk9STSkKKworI2VuZGlmIC8qIENPTkZJR19ERUZBVUxUU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb25maWcvZGVmYXVsdHMvZWZpLmggYi9ncHhlL3NyYy9jb25maWcvZGVmYXVsdHMvZWZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzOGZkMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvbmZpZy9kZWZhdWx0cy9lZmkuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIENPTkZJR19ERUZBVUxUU19FRklfSAorI2RlZmluZSBDT05GSUdfREVGQVVMVFNfRUZJX0gKKworLyoqIEBmaWxlCisgKgorICogQ29uZmlndXJhdGlvbiBkZWZhdWx0cyBmb3IgRUZJCisgKgorICovCisKKyNkZWZpbmUgVUFDQ0VTU19FRkkKKyNkZWZpbmUgSU9BUElfRUZJCisjZGVmaW5lIFBDSUFQSV9FRkkKKyNkZWZpbmUgQ09OU09MRV9FRkkKKyNkZWZpbmUgVElNRVJfRUZJCisjZGVmaW5lIE5BUF9FRklYODYKKyNkZWZpbmUgVU1BTExPQ19FRkkKKyNkZWZpbmUgU01CSU9TX0VGSQorCisjZGVmaW5lCUlNQUdFX0VGSQkJLyogRUZJIGltYWdlIHN1cHBvcnQgKi8KKworI2VuZGlmIC8qIENPTkZJR19ERUZBVUxUU19FRklfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29uZmlnL2RlZmF1bHRzL3BjYmlvcy5oIGIvZ3B4ZS9zcmMvY29uZmlnL2RlZmF1bHRzL3BjYmlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTEwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb25maWcvZGVmYXVsdHMvcGNiaW9zLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBDT05GSUdfREVGQVVMVFNfUENCSU9TX0gKKyNkZWZpbmUgQ09ORklHX0RFRkFVTFRTX1BDQklPU19ICisKKy8qKiBAZmlsZQorICoKKyAqIENvbmZpZ3VyYXRpb24gZGVmYXVsdHMgZm9yIFBDQklPUworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNkZWZpbmUgVUFDQ0VTU19MSUJSTQorI2RlZmluZSBJT0FQSV9YODYKKyNkZWZpbmUgUENJQVBJX1BDQklPUworI2RlZmluZSBUSU1FUl9QQ0JJT1MKKyNkZWZpbmUgQ09OU09MRV9QQ0JJT1MKKyNkZWZpbmUgTkFQX1BDQklPUworI2RlZmluZSBVTUFMTE9DX01FTVRPUAorI2RlZmluZSBTTUJJT1NfUENCSU9TCisKKyNkZWZpbmUJSU1BR0VfRUxGCQkvKiBFTEYgaW1hZ2Ugc3VwcG9ydCAqLworI2RlZmluZQlJTUFHRV9NVUxUSUJPT1QJCS8qIE11bHRpQm9vdCBpbWFnZSBzdXBwb3J0ICovCisjZGVmaW5lCUlNQUdFX1BYRQkJLyogUFhFIGltYWdlIHN1cHBvcnQgKi8KKyNkZWZpbmUgSU1BR0VfU0NSSVBUCQkvKiBnUFhFIHNjcmlwdCBpbWFnZSBzdXBwb3J0ICovCisjZGVmaW5lIElNQUdFX0JaSU1BR0UJCS8qIExpbnV4IGJ6SW1hZ2UgaW1hZ2Ugc3VwcG9ydCAqLworI2RlZmluZSBJTUFHRV9DT01CT09UCQkvKiBTWVNMSU5VWCBDT01CT09UIGltYWdlIHN1cHBvcnQgKi8KKworI2RlZmluZSBQWEVfU1RBQ0sJCS8qIFBYRSBzdGFjayBpbiBnUFhFIC0gcmVxdWlyZWQgZm9yIFBYRUxJTlVYICovCisjZGVmaW5lIFBYRV9NRU5VCQkvKiBQWEUgbWVudSBib290aW5nICovCisjZGVmaW5lCVBYRV9DTUQJCQkvKiBQWEUgY29tbWFuZHMgKi8KKworI2RlZmluZQlTQU5CT09UX1BST1RPX0lTQ1NJCS8qIGlTQ1NJIHByb3RvY29sICovCisjZGVmaW5lCVNBTkJPT1RfUFJPVE9fQU9FCS8qIEFvRSBwcm90b2NvbCAqLworCisjZW5kaWYgLyogQ09ORklHX0RFRkFVTFRTX1BDQklPU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb25maWcvZ2VuZXJhbC5oIGIvZ3B4ZS9zcmMvY29uZmlnL2dlbmVyYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjVhOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29uZmlnL2dlbmVyYWwuaApAQCAtMCwwICsxLDE0OCBAQAorI2lmbmRlZiBDT05GSUdfR0VORVJBTF9ICisjZGVmaW5lIENPTkZJR19HRU5FUkFMX0gKKworLyoqIEBmaWxlCisgKgorICogR2VuZXJhbCBjb25maWd1cmF0aW9uCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGNvbmZpZy9kZWZhdWx0cy5oPgorCisvKgorICogQnJhbmRpbmcKKyAqCisgKiBWZW5kb3JzIG1heSB1c2UgdGhlc2Ugc3RyaW5ncyB0byBhZGQgdGhlaXIgb3duIGJyYW5kaW5nIHRvIGdQWEUuCisgKiBQUk9EVUNUX05BTUUgaXMgZGlzcGxheWVkIHByaW9yIHRvIGFueSBnUFhFIGJyYW5kaW5nIGluIHN0YXJ0dXAKKyAqIG1lc3NhZ2VzLCBhbmQgUFJPRFVDVF9TSE9SVF9OQU1FIGlzIHVzZWQgd2hlcmUgYSBicmllZiBwcm9kdWN0CisgKiBsYWJlbCBpcyByZXF1aXJlZCAoZS5nLiBpbiBCSU9TIGJvb3Qgc2VsZWN0aW9uIG1lbnVzKS4KKyAqCisgKiBUbyBtaW5pbWlzZSBlbmQtdXNlciBjb25mdXNpb24sIGl0J3MgcHJvYmFibHkgYSBnb29kIGlkZWEgdG8gZWl0aGVyCisgKiBtYWtlIFBST0RVQ1RfU0hPUlRfTkFNRSBhIHN1YnN0cmluZyBvZiBQUk9EVUNUX05BTUUgb3IgbGVhdmUgaXQgYXMKKyAqICJnUFhFIi4KKyAqCisgKi8KKyNkZWZpbmUgUFJPRFVDVF9OQU1FICIiCisjZGVmaW5lIFBST0RVQ1RfU0hPUlRfTkFNRSAiZ1BYRSIKKworLyoKKyAqIFRpbWVyIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKyNkZWZpbmUgQkFOTkVSX1RJTUVPVVQJMAkvKiBUZW50aHMgb2YgYSBzZWNvbmQgZm9yIHdoaWNoIHRoZSBzaGVsbAorCQkJCSAgIGJhbm5lciBzaG91bGQgYXBwZWFyICovCisKKy8qCisgKiBOZXR3b3JrIHByb3RvY29scworICoKKyAqLworCisjZGVmaW5lCU5FVF9QUk9UT19JUFY0CQkvKiBJUHY0IHByb3RvY29sICovCisKKy8qCisgKiBQWEUgc3VwcG9ydAorICoKKyAqLworLy8jdW5kZWYJUFhFX1NUQUNLCQkvKiBQWEUgc3RhY2sgaW4gZ1BYRSAtIHlvdSB3YW50IHRoaXMhICovCisvLyN1bmRlZglQWEVfTUVOVQkJLyogUFhFIG1lbnUgYm9vdGluZyAqLworCisvKgorICogRG93bmxvYWQgcHJvdG9jb2xzCisgKgorICovCisKKyNkZWZpbmUJRE9XTkxPQURfUFJPVE9fVEZUUAkvKiBUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wgKi8KKyNkZWZpbmUJRE9XTkxPQURfUFJPVE9fSFRUUAkvKiBIeXBlcnRleHQgVHJhbnNmZXIgUHJvdG9jb2wgKi8KKyNkZWZpbmUJRE9XTkxPQURfUFJPVE9fSFRUUFMJLyogU2VjdXJlIEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCAqLworI2RlZmluZQlET1dOTE9BRF9QUk9UT19GVFAJLyogRmlsZSBUcmFuc2ZlciBQcm90b2NvbCAqLworI3VuZGVmCURPV05MT0FEX1BST1RPX1RGVE0JLyogTXVsdGljYXN0IFRyaXZpYWwgRmlsZSBUcmFuc2ZlciBQcm90b2NvbCAqLworI3VuZGVmCURPV05MT0FEX1BST1RPX1NMQU0JLyogU2NhbGFibGUgTG9jYWwgQXJlYSBNdWx0aWNhc3QgKi8KKworLyoKKyAqIFNBTiBib290IHByb3RvY29scworICoKKyAqLworCisvLyN1bmRlZglTQU5CT09UX1BST1RPX0lTQ1NJCS8qIGlTQ1NJIHByb3RvY29sICovCisvLyN1bmRlZglTQU5CT09UX1BST1RPX0FPRQkvKiBBb0UgcHJvdG9jb2wgKi8KKy8vI3VuZGVmCVNBTkJPT1RfUFJPVE9fSUJfU1JQCS8qIEluZmluaWJhbmQgU0NTSSBSRE1BIHByb3RvY29sICovCisKKy8qCisgKiA4MDIuMTEgY3J5cHRvc3lzdGVtcyBhbmQgaGFuZHNoYWtpbmcgcHJvdG9jb2xzCisgKgorICovCisjZGVmaW5lCUNSWVBUT184MDIxMV9XRVAJLyogV0VQIGVuY3J5cHRpb24gKGRlcHJlY2F0ZWQgYW5kIGluc2VjdXJlISkgKi8KKyNkZWZpbmUJQ1JZUFRPXzgwMjExX1dQQQkvKiBXUEEgUGVyc29uYWwsIGF1dGhlbnRpY2F0aW5nIHdpdGggcGFzc3BocmFzZSAqLworI2RlZmluZQlDUllQVE9fODAyMTFfV1BBMgkvKiBBZGQgc3VwcG9ydCBmb3Igc3Ryb25nZXIgV1BBIGNyeXB0b2dyYXBoeSAqLworCisvKgorICogTmFtZSByZXNvbHV0aW9uIG1vZHVsZXMKKyAqCisgKi8KKworI2RlZmluZQlETlNfUkVTT0xWRVIJCS8qIEROUyByZXNvbHZlciAqLworCisvKgorICogSW1hZ2UgdHlwZXMKKyAqCisgKiBFdGhlcmJvb3Qgc3VwcG9ydHMgdmFyaW91cyBpbWFnZSBmb3JtYXRzLiAgU2VsZWN0IHdoaWNoZXZlciBvbmVzCisgKiB5b3Ugd2FudCB0byB1c2UuCisgKgorICovCisvLyNkZWZpbmUJSU1BR0VfTkJJCQkvKiBOQkkgaW1hZ2Ugc3VwcG9ydCAqLworLy8jZGVmaW5lCUlNQUdFX0VMRgkJLyogRUxGIGltYWdlIHN1cHBvcnQgKi8KKy8vI2RlZmluZQlJTUFHRV9GUkVFQlNECQkvKiBGcmVlQlNEIGtlcm5lbCBpbWFnZSBzdXBwb3J0ICovCisvLyNkZWZpbmUJSU1BR0VfTVVMVElCT09UCQkvKiBNdWx0aUJvb3QgaW1hZ2Ugc3VwcG9ydCAqLworLy8jZGVmaW5lCUlNQUdFX0FPVVQJCS8qIGEub3V0IGltYWdlIHN1cHBvcnQgKi8KKy8vI2RlZmluZQlJTUFHRV9XSU5DRQkJLyogV2luQ0UgaW1hZ2Ugc3VwcG9ydCAqLworLy8jZGVmaW5lCUlNQUdFX1BYRQkJLyogUFhFIGltYWdlIHN1cHBvcnQgKi8KKy8vI2RlZmluZQlJTUFHRV9TQ1JJUFQJCS8qIGdQWEUgc2NyaXB0IGltYWdlIHN1cHBvcnQgKi8KKy8vI2RlZmluZQlJTUFHRV9CWklNQUdFCQkvKiBMaW51eCBiekltYWdlIGltYWdlIHN1cHBvcnQgKi8KKy8vI2RlZmluZQlJTUFHRV9DT01CT09UCQkvKiBTWVNMSU5VWCBDT01CT09UIGltYWdlIHN1cHBvcnQgKi8KKy8vI2RlZmluZQlJTUFHRV9FRkkJCS8qIEVGSSBpbWFnZSBzdXBwb3J0ICovCisKKy8qCisgKiBDb21tYW5kLWxpbmUgY29tbWFuZHMgdG8gaW5jbHVkZQorICoKKyAqLworI2RlZmluZQlBVVRPQk9PVF9DTUQJCS8qIEF1dG9tYXRpYyBib290aW5nICovCisjZGVmaW5lCU5WT19DTUQJCQkvKiBOb24tdm9sYXRpbGUgb3B0aW9uIHN0b3JhZ2UgY29tbWFuZHMgKi8KKyNkZWZpbmUJQ09ORklHX0NNRAkJLyogT3B0aW9uIGNvbmZpZ3VyYXRpb24gY29uc29sZSAqLworI2RlZmluZQlJRk1HTVRfQ01ECQkvKiBJbnRlcmZhY2UgbWFuYWdlbWVudCBjb21tYW5kcyAqLworI2RlZmluZQlJV01HTVRfQ01ECQkvKiBXaXJlbGVzcyBpbnRlcmZhY2UgbWFuYWdlbWVudCBjb21tYW5kcyAqLworI2RlZmluZQlST1VURV9DTUQJCS8qIFJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCBjb21tYW5kcyAqLworI2RlZmluZSBJTUFHRV9DTUQJCS8qIEltYWdlIG1hbmFnZW1lbnQgY29tbWFuZHMgKi8KKyNkZWZpbmUgREhDUF9DTUQJCS8qIERIQ1AgbWFuYWdlbWVudCBjb21tYW5kcyAqLworI2RlZmluZSBTQU5CT09UX0NNRAkJLyogU0FOIGJvb3QgY29tbWFuZHMgKi8KKyNkZWZpbmUgTE9HSU5fQ01ECQkvKiBMb2dpbiBjb21tYW5kICovCisjdW5kZWYJVElNRV9DTUQJCS8qIFRpbWUgY29tbWFuZHMgKi8KKyN1bmRlZglESUdFU1RfQ01ECQkvKiBJbWFnZSBjcnlwdG8gZGlnZXN0IGNvbW1hbmRzICovCisvLyN1bmRlZglQWEVfQ01ECQkJLyogUFhFIGNvbW1hbmRzICovCisKKy8qCisgKiBFcnJvciBtZXNzYWdlIHRhYmxlcyB0byBpbmNsdWRlCisgKgorICovCisjdW5kZWYJRVJSTVNHXzgwMjExCQkvKiBBbGwgODAyLjExIGVycm9yIGRlc2NyaXB0aW9ucyAofjMuM2tiKSAqLworCisvKgorICogT2JzY3VyZSBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqCisgKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB0b3VjaCB0aGVzZS4KKyAqCisgKi8KKworI3VuZGVmCUJVSUxEX1NFUklBTAkJLyogSW5jbHVkZSBhbiBhdXRvbWF0aWMgYnVpbGQgc2VyaWFsCisJCQkJICogbnVtYmVyLiAgQWRkICJicyIgdG8gdGhlIGxpc3Qgb2YKKwkJCQkgKiBtYWtlIHRhcmdldHMuICBGb3IgZXhhbXBsZToKKwkJCQkgKiAibWFrZSBiaW4vcnRsODEzOS5kc2sgYnMiICovCisjdW5kZWYJQlVJTERfSUQJCS8qIEluY2x1ZGUgYSBjdXN0b20gYnVpbGQgSUQgc3RyaW5nLAorCQkJCSAqIGUuZyAidGVzdC1mb28iICovCisjdW5kZWYJTlVMTF9UUkFQCQkvKiBBdHRlbXB0IHRvIGNhdGNoIE5VTEwgZnVuY3Rpb24gY2FsbHMgKi8KKyN1bmRlZglHREJTRVJJQUwJCS8qIFJlbW90ZSBHREIgZGVidWdnaW5nIG92ZXIgc2VyaWFsICovCisjdW5kZWYJR0RCVURQCQkJLyogUmVtb3RlIEdEQiBkZWJ1Z2dpbmcgb3ZlciBVRFAKKwkJCQkgKiAoYm90aCBtYXkgYmUgc2V0KSAqLworCisjZW5kaWYgLyogQ09ORklHX0dFTkVSQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29uZmlnL2lvYXBpLmggYi9ncHhlL3NyYy9jb25maWcvaW9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRkNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29uZmlnL2lvYXBpLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBDT05GSUdfSU9BUElfSAorI2RlZmluZSBDT05GSUdfSU9BUElfSAorCisvKiogQGZpbGUKKyAqCisgKiBJL08gQVBJIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Y29uZmlnL2RlZmF1bHRzLmg+CisKKy8vI3VuZGVmCVBDSUFQSV9QQ0JJT1MJCS8qIEFjY2VzcyB2aWEgUENJIEJJT1MgKi8KKy8vI2RlZmluZQlQQ0lBUElfRElSRUNUCQkvKiBEaXJlY3QgYWNjZXNzIHZpYSBUeXBlIDEgYWNjZXNzZXMgKi8KKworI2VuZGlmIC8qIENPTkZJR19JT0FQSV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb25maWcvaXNhLmggYi9ncHhlL3NyYy9jb25maWcvaXNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzYmUxYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvbmZpZy9pc2EuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIENPTkZJR19JU0FfSAorI2RlZmluZSBDT05GSUdfSVNBX0gKKworLyoqIEBmaWxlCisgKgorICogSVNBIHByb2JlIGFkZHJlc3MgY29uZmlndXJhdGlvbgorICoKKyAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGxpc3Qgb2YgYWRkcmVzc2VzIHRoYXQgd2lsbCBiZSBwcm9iZWQgYnkgYW55CisgKiBJU0EgZHJpdmVycy4KKyAqCisgKi8KKyN1bmRlZglJU0FfUFJPQkVfQUREUlMJCS8qIGUuZy4gMHgyMDAsIDB4MzAwICovCisjdW5kZWYJSVNBX1BST0JFX09OTFkJCS8qIERvIG5vdCBwcm9iZSBhbnkgb3RoZXIgYWRkcmVzc2VzICovCisKKyNlbmRpZiAvKiBDT05GSUdfSVNBX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvbmZpZy9uYXAuaCBiL2dweGUvc3JjL2NvbmZpZy9uYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjk4MTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29uZmlnL25hcC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgQ09ORklHX05BUF9ICisjZGVmaW5lIENPTkZJR19OQVBfSAorCisvKiogQGZpbGUKKyAqCisgKiBDUFUgc2xlZXBpbmcKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Y29uZmlnL2RlZmF1bHRzLmg+CisKKy8vI3VuZGVmCQlOQVBfUENCSU9TCisvLyNkZWZpbmUJCU5BUF9OVUxMCisKKyNlbmRpZiAvKiBDT05GSUdfTkFQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvbmZpZy9zZXJpYWwuaCBiL2dweGUvc3JjL2NvbmZpZy9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDI3MmQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29uZmlnL3NlcmlhbC5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgQ09ORklHX1NFUklBTF9ICisjZGVmaW5lIENPTkZJR19TRVJJQUxfSAorCisvKiogQGZpbGUKKyAqCisgKiBTZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uCisgKgorICogVGhlc2Ugb3B0aW9ucyBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgc2VyaWFsIGNvbnNvbGUuICBUaGV5CisgKiB0YWtlIGVmZmVjdCBvbmx5IGlmIHRoZSBzZXJpYWwgY29uc29sZSBpcyBpbmNsdWRlZCB1c2luZyB0aGUKKyAqIENPTlNPTEVfU0VSSUFMIG9wdGlvbi4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjZGVmaW5lCUNPTTEJCTB4M2Y4CisjZGVmaW5lCUNPTTIJCTB4MmY4CisjZGVmaW5lCUNPTTMJCTB4M2U4CisjZGVmaW5lCUNPTTQJCTB4MmU4CisKKyNkZWZpbmUJQ09NQ09OU09MRQlDT00xCQkvKiBJL08gcG9ydCBhZGRyZXNzICovCisKKy8qIEtlZXAgc2V0dGluZ3MgZnJvbSBhIHByZXZpb3VzIHVzZXIgb2YgdGhlIHNlcmlhbCBwb3J0IChlLmcuIGxpbG8gb3IKKyAqIExpbnV4QklPUyksIGlnbm9yaW5nIENPTVNQRUVELCBDT01EQVRBLCBDT01QQVJJVFkgYW5kIENPTVNUT1AuCisgKi8KKyN1bmRlZglDT01QUkVTRVJWRQorCisjaWZuZGVmIENPTVBSRVNFUlZFCisjZGVmaW5lCUNPTVNQRUVECTExNTIwMAkJLyogQmF1ZCByYXRlICovCisjZGVmaW5lCUNPTURBVEEJCTgJCS8qIERhdGEgYml0cyAqLworI2RlZmluZQlDT01QQVJJVFkJMAkJLyogUGFyaXR5OiAwPU5vbmUsIDE9T2RkLCAyPUV2ZW4gKi8KKyNkZWZpbmUJQ09NU1RPUAkJMQkJLyogU3RvcCBiaXRzICovCisjZW5kaWYKKworI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29uZmlnL3RpbWVyLmggYi9ncHhlL3NyYy9jb25maWcvdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzZhOTNkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29uZmlnL3RpbWVyLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBDT05GSUdfVElNRVJfSAorI2RlZmluZSBDT05GSUdfVElNRVJfSAorCisvKiogQGZpbGUKKyAqCisgKiBUaW1lciBjb25maWd1cmF0aW9uLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxjb25maWcvZGVmYXVsdHMuaD4KKworLy8jdW5kZWYJCVRJTUVSX1BDQklPUworLy8jZGVmaW5lCQlUSU1FUl9SRFRTQworCisjZW5kaWYgLyogQ09ORklHX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvbmZpZy91bWFsbG9jLmggYi9ncHhlL3NyYy9jb25maWcvdW1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZmViZjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb25maWcvdW1hbGxvYy5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgQ09ORklHX1VNQUxMT0NfSAorI2RlZmluZSBDT05GSUdfVU1BTExPQ19ICisKKy8qKiBAZmlsZQorICoKKyAqIFVzZXIgbWVtb3J5IGFsbG9jYXRpb24gQVBJIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Y29uZmlnL2RlZmF1bHRzLmg+CisKKyNlbmRpZiAvKiBDT05GSUdfVU1BTExPQ19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2FjcGkuYyBiL2dweGUvc3JjL2NvcmUvYWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NWY0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2FjcGkuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9hY3BpLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEFDUEkgc3VwcG9ydCBmdW5jdGlvbnMKKyAqCisgKi8KKworLyoqCisgKiBGaXggdXAgQUNQSSB0YWJsZSBjaGVja3N1bQorICoKKyAqIEB2IGFjcGkJCUFDUEkgdGFibGUgaGVhZGVyCisgKi8KK3ZvaWQgYWNwaV9maXhfY2hlY2tzdW0gKCBzdHJ1Y3QgYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgKmFjcGkgKSB7CisJdW5zaWduZWQgaW50IGkgPSAwOworCXVpbnQ4X3Qgc3VtID0gMDsKKworCWZvciAoIGkgPSAwIDsgaSA8IGFjcGktPmxlbmd0aCA7IGkrKyApIHsKKwkJc3VtICs9ICooICggKCB1aW50OF90ICogKSBhY3BpICkgKyBpICk7CisJfQorCWFjcGktPmNoZWNrc3VtIC09IHN1bTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvYW5zaWVzYy5jIGIvZ3B4ZS9zcmMvY29yZS9hbnNpZXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzMDZlMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvYW5zaWVzYy5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9hbnNpZXNjLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEFOU0kgZXNjYXBlIHNlcXVlbmNlcworICoKKyAqLworCisvKioKKyAqIENhbGwgQU5TSSBlc2NhcGUgc2VxdWVuY2UgaGFuZGxlcgorICoKKyAqIEB2IGhhbmRsZXJzCQlMaXN0IG9mIGVzY2FwZSBzZXF1ZW5jZSBoYW5kbGVycworICogQHYgZnVuY3Rpb24JCUNvbnRyb2wgZnVuY3Rpb24gaWRlbnRpZmllcgorICogQHYgY291bnQJCVBhcmFtZXRlciBjb3VudAorICogQHYgcGFyYW1zCQlQYXJhbWV0ZXIgbGlzdAorICovCitzdGF0aWMgdm9pZCBhbnNpZXNjX2NhbGxfaGFuZGxlciAoIHN0cnVjdCBhbnNpZXNjX2hhbmRsZXIgKmhhbmRsZXJzLAorCQkJCSAgIHVuc2lnbmVkIGludCBmdW5jdGlvbiwgaW50IGNvdW50LAorCQkJCSAgIGludCBwYXJhbXNbXSApIHsKKwlzdHJ1Y3QgYW5zaWVzY19oYW5kbGVyICpoYW5kbGVyOworCisJZm9yICggaGFuZGxlciA9IGhhbmRsZXJzIDsgaGFuZGxlci0+ZnVuY3Rpb24gOyBoYW5kbGVyKysgKSB7CisJCWlmICggaGFuZGxlci0+ZnVuY3Rpb24gPT0gZnVuY3Rpb24gKSB7CisJCQloYW5kbGVyLT5oYW5kbGUgKCBjb3VudCwgcGFyYW1zICk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqCisgKiBQcm9jZXNzIGNoYXJhY3RlciB0aGF0IG1heSBiZSBwYXJ0IG9mIEFOU0kgZXNjYXBlIHNlcXVlbmNlCisgKgorICogQHYgY3R4CQlBTlNJIGVzY2FwZSBzZXF1ZW5jZSBjb250ZXh0CisgKiBAdiBjCQkJQ2hhcmFjdGVyCisgKiBAcmV0IGMJCU9yaWdpbmFsIGNoYXJhY3RlciBpZiBub3QgcGFydCBvZiBlc2NhcGUgc2VxdWVuY2UKKyAqIEByZXQgPDAJCUNoYXJhY3RlciB3YXMgcGFydCBvZiBlc2NhcGUgc2VxdWVuY2UKKyAqCisgKiBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgd2lsbCBiZSBwbHVja2VkIG91dCBvZiB0aGUgY2hhcmFjdGVyIHN0cmVhbQorICogYW5kIGludGVycHJldGVkOyBvbmNlIGNvbXBsZXRlIHRoZXkgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCisgKiBhcHByb3ByaWF0ZSBoYW5kbGVyIGlmIG9uZSBleGlzdHMgaW4gdGhpcyBBTlNJIGVzY2FwZSBzZXF1ZW5jZQorICogY29udGV4dC4KKyAqCisgKiBJbiB0aGUgaW50ZXJlc3RzIG9mIGNvZGUgc2l6ZSwgd2UgYXJlIHJhdGhlciBsaWJlcmFsIGFib3V0IHRoZQorICogc2VxdWVuY2VzIHdlIGFyZSBwcmVwYXJlZCB0byBhY2NlcHQgYXMgdmFsaWQuCisgKi8KK2ludCBhbnNpZXNjX3Byb2Nlc3MgKCBzdHJ1Y3QgYW5zaWVzY19jb250ZXh0ICpjdHgsIGludCBjICkgeworCWlmICggY3R4LT5jb3VudCA9PSAwICkgeworCQlpZiAoIGMgPT0gRVNDICkgeworCQkJLyogRmlyc3QgYnl0ZSBvZiBDU0kgOiBiZWdpbiBlc2NhcGUgc2VxdWVuY2UgKi8KKwkJCWN0eC0+Y291bnQgPSAxOworCQkJbWVtc2V0ICggY3R4LT5wYXJhbXMsIDB4ZmYsIHNpemVvZiAoIGN0eC0+cGFyYW1zICkgKTsKKwkJCWN0eC0+ZnVuY3Rpb24gPSAwOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJLyogTm9ybWFsIGNoYXJhY3RlciAqLworCQkJcmV0dXJuIGM7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIGMgPT0gJ1snICkgeworCQkJLyogU2Vjb25kIGJ5dGUgb2YgQ1NJIDogZG8gbm90aGluZyAqLworCQl9IGVsc2UgaWYgKCAoIGMgPj0gJzAnICkgJiYgKCBjIDw9ICc5JyApICkgeworCQkJLyogUGFyYW1ldGVyIEJ5dGUgOiBwYXJ0IG9mIGEgcGFyYW1ldGVyIHZhbHVlICovCisJCQlpbnQgKnBhcmFtID0gJmN0eC0+cGFyYW1zW2N0eC0+Y291bnQgLSAxXTsKKwkJCWlmICggKnBhcmFtIDwgMCApCisJCQkJKnBhcmFtID0gMDsKKwkJCSpwYXJhbSA9ICggKCAqcGFyYW0gKiAxMCApICsgKCBjIC0gJzAnICkgKTsKKwkJfSBlbHNlIGlmICggYyA9PSAnOycgKSB7CisJCQkvKiBQYXJhbWV0ZXIgQnl0ZSA6IHBhcmFtZXRlciBkZWxpbWl0ZXIgKi8KKwkJCWN0eC0+Y291bnQrKzsKKwkJCWlmICggY3R4LT5jb3VudCA+ICggc2l6ZW9mICggY3R4LT5wYXJhbXMgKSAvCisJCQkJCSAgICBzaXplb2YgKCBjdHgtPnBhcmFtc1swXSApICkgKSB7CisJCQkJLyogRXhjZXNzaXZlIHBhcmFtZXRlcnMgOiBhYm9ydCBzZXF1ZW5jZSAqLworCQkJCWN0eC0+Y291bnQgPSAwOworCQkJCURCRyAoICJUb28gbWFueSBwYXJhbWV0ZXJzIGluIEFOU0kgZXNjYXBlICIKKwkJCQkgICAgICAic2VxdWVuY2VcbiIgKTsKKwkJCX0KKwkJfSBlbHNlIGlmICggKCBjID49IDB4MjAgKSAmJiAoIGMgPD0gMHgyZiApICkgeworCQkJLyogSW50ZXJtZWRpYXRlIEJ5dGUgKi8KKwkJCWN0eC0+ZnVuY3Rpb24gPDw9IDg7CisJCQljdHgtPmZ1bmN0aW9uIHw9IGM7CisJCX0gZWxzZSB7CisJCQkvKiBUcmVhdCBhcyBGaW5hbCBCeXRlLiAgWmVybyBjdHgtPmNvdW50IGJlZm9yZSAKKwkJCSAqIGNhbGxpbmcgaGFuZGxlciB0byBhdm9pZCBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcHMuCisJCQkgKi8KKwkJCWludCBjb3VudCA9IGN0eC0+Y291bnQ7CisJCQljdHgtPmNvdW50ID0gMDsKKwkJCWN0eC0+ZnVuY3Rpb24gPDw9IDg7CisJCQljdHgtPmZ1bmN0aW9uIHw9IGM7CisJCQlhbnNpZXNjX2NhbGxfaGFuZGxlciAoIGN0eC0+aGFuZGxlcnMsIGN0eC0+ZnVuY3Rpb24sCisJCQkJCSAgICAgICBjb3VudCwgY3R4LT5wYXJhbXMgKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9hc3ByaW50Zi5jIGIvZ3B4ZS9zcmMvY29yZS9hc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzY2Y0NWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2FzcHJpbnRmLmMKQEAgLTAsMCArMSw0OSBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIFdyaXRlIGEgZm9ybWF0dGVkIHN0cmluZyB0byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5LgorICoKKyAqIEB2IHN0cnAJCVBvaW50ZXIgdG8gaG9sZCBhbGxvY2F0ZWQgc3RyaW5nCisgKiBAdiBmbXQJCUZvcm1hdCBzdHJpbmcKKyAqIEB2IGFyZ3MJCUFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0CWxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCBzdHJpbmcKKyAqLworaW50IHZhc3ByaW50ZiAoIGNoYXIgKipzdHJwLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyApIHsKKwlzaXplX3QgbGVuOworCXZhX2xpc3QgYXJnc190bXA7CisKKwkvKiBDYWxjdWxhdGUgbGVuZ3RoIG5lZWRlZCBmb3Igc3RyaW5nICovCisJdmFfY29weSAoIGFyZ3NfdG1wLCBhcmdzICk7CisJbGVuID0gKCB2c25wcmludGYgKCBOVUxMLCAwLCBmbXQsIGFyZ3NfdG1wICkgKyAxICk7CisJdmFfZW5kICggYXJnc190bXAgKTsKKworCS8qIEFsbG9jYXRlIGFuZCBmaWxsIHN0cmluZyAqLworCSpzdHJwID0gbWFsbG9jICggbGVuICk7CisJaWYgKCAhICpzdHJwICkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIHZzbnByaW50ZiAoICpzdHJwLCBsZW4sIGZtdCwgYXJncyApOworfQorCisvKioKKyAqIFdyaXRlIGEgZm9ybWF0dGVkIHN0cmluZyB0byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5LgorICoKKyAqIEB2IHN0cnAJCVBvaW50ZXIgdG8gaG9sZCBhbGxvY2F0ZWQgc3RyaW5nCisgKiBAdiBmbXQJCUZvcm1hdCBzdHJpbmcKKyAqIEB2IC4uLgkJQXJndW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEByZXQJbGVuCQlMZW5ndGggb2YgZm9ybWF0dGVkIHN0cmluZworICovCitpbnQgYXNwcmludGYgKCBjaGFyICoqc3RycCwgY29uc3QgY2hhciAqZm10LCAuLi4gKSB7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW47CisKKwl2YV9zdGFydCAoIGFyZ3MsIGZtdCApOworCWxlbiA9IHZhc3ByaW50ZiAoIHN0cnAsIGZtdCwgYXJncyApOworCXZhX2VuZCAoIGFyZ3MgKTsKKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9iYXNlNjQuYyBiL2dweGUvc3JjL2NvcmUvYmFzZTY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxOWVmNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvYmFzZTY0LmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvYmFzZTY0Lmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEJhc2U2NCBlbmNvZGluZworICoKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciBiYXNlNjRbNjRdID0KKwkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKKy8qKgorICogQmFzZTY0LWVuY29kZSBhIHN0cmluZworICoKKyAqIEB2IHJhdwkJUmF3IHN0cmluZworICogQHYgZW5jb2RlZAkJQnVmZmVyIGZvciBlbmNvZGVkIHN0cmluZworICoKKyAqIFRoZSBidWZmZXIgbXVzdCBiZSB0aGUgY29ycmVjdCBsZW5ndGggZm9yIHRoZSBlbmNvZGVkIHN0cmluZy4gIFVzZQorICogc29tZXRoaW5nIGxpa2UKKyAqCisgKiAgICAgY2hhciBidWZbIGJhc2U2NF9lbmNvZGVkX2xlbiAoIHN0cmxlbiAoIHJhdyApICkgKyAxIF07CisgKgorICogKHRoZSArMSBpcyBmb3IgdGhlIHRlcm1pbmF0aW5nIE5VTCkgdG8gcHJvdmlkZSBhIGJ1ZmZlciBvZiB0aGUKKyAqIGNvcnJlY3Qgc2l6ZS4KKyAqLwordm9pZCBiYXNlNjRfZW5jb2RlICggY29uc3QgY2hhciAqcmF3LCBjaGFyICplbmNvZGVkICkgeworCWNvbnN0IHVpbnQ4X3QgKnJhd19ieXRlcyA9ICggKCBjb25zdCB1aW50OF90ICogKSByYXcgKTsKKwl1aW50OF90ICplbmNvZGVkX2J5dGVzID0gKCAoIHVpbnQ4X3QgKiApIGVuY29kZWQgKTsKKwlzaXplX3QgcmF3X2JpdF9sZW4gPSAoIDggKiBzdHJsZW4gKCByYXcgKSApOworCXVuc2lnbmVkIGludCBiaXQ7CisJdW5zaWduZWQgaW50IHRtcDsKKworCWZvciAoIGJpdCA9IDAgOyBiaXQgPCByYXdfYml0X2xlbiA7IGJpdCArPSA2ICkgeworCQl0bXAgPSAoICggcmF3X2J5dGVzWyBiaXQgLyA4IF0gPDwgKCBiaXQgJSA4ICkgKSB8CisJCQkoIHJhd19ieXRlc1sgYml0IC8gOCArIDEgXSA+PiAoIDggLSAoIGJpdCAlIDggKSApICkgKTsKKwkJdG1wID0gKCAoIHRtcCA+PiAyICkgJiAweDNmICk7CisJCSooZW5jb2RlZF9ieXRlcysrKSA9IGJhc2U2NFt0bXBdOworCX0KKwlmb3IgKCA7ICggYml0ICUgOCApICE9IDAgOyBiaXQgKz0gNiApCisJCSooZW5jb2RlZF9ieXRlcysrKSA9ICc9JzsKKwkqKGVuY29kZWRfYnl0ZXMrKykgPSAnXDAnOworCisJREJHICggIkJhc2U2NC1lbmNvZGVkIFwiJXNcIiBhcyBcIiVzXCJcbiIsIHJhdywgZW5jb2RlZCApOworCWFzc2VydCAoIHN0cmxlbiAoIGVuY29kZWQgKSA9PSBiYXNlNjRfZW5jb2RlZF9sZW4gKCBzdHJsZW4gKCByYXcgKSApICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2Jhc2VuYW1lLmMgYi9ncHhlL3NyYy9jb3JlL2Jhc2VuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4MWM1NAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvYmFzZW5hbWUuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEBmaWxlCisgKgorICogR2V0IGJhc2UgbmFtZSBvZiBwYXRoCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaWJnZW4uaD4KKworLyoqCisgKiBSZXR1cm4gYmFzZSBuYW1lIGZyb20gcGF0aAorICoKKyAqIEB2IHBhdGgJCUZ1bGwgcGF0aAorICogQHJldCBiYXNlbmFtZQlCYXNlIG5hbWUKKyAqLworY2hhciAqIGJhc2VuYW1lICggY2hhciAqcGF0aCApIHsKKwljaGFyICpiYXNlbmFtZTsKKworCWJhc2VuYW1lID0gc3RycmNociAoIHBhdGgsICcvJyApOworCXJldHVybiAoIGJhc2VuYW1lID8gKCBiYXNlbmFtZSArIDEgKSA6IHBhdGggKTsKK30KKworLyoqCisgKiBSZXR1cm4gZGlyZWN0b3J5IG5hbWUgZnJvbSBwYXRoCisgKgorICogQHYgcGF0aAkJRnVsbCBwYXRoCisgKiBAcmV0IGRpcm5hbWUJCURpcmVjdG9yeSBuYW1lCisgKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSBpdHMgYXJndW1lbnQuCisgKi8KK2NoYXIgKiBkaXJuYW1lICggY2hhciAqcGF0aCApIHsKKwljaGFyICpzZXBhcmF0b3I7CisKKwlzZXBhcmF0b3IgPSBzdHJyY2hyICggcGF0aCwgJy8nICk7CisJaWYgKCBzZXBhcmF0b3IgPT0gcGF0aCApIHsKKwkJcmV0dXJuICIvIjsKKwl9IGVsc2UgaWYgKCBzZXBhcmF0b3IgKSB7CisJCSpzZXBhcmF0b3IgPSAwOworCQlyZXR1cm4gcGF0aDsKKwl9IGVsc2UgeworCQlyZXR1cm4gIi4iOworCX0KK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvYml0bWFwLmMgYi9ncHhlL3NyYy9jb3JlL2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTljYmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2JpdG1hcC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2JpdG1hcC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBCaXRtYXBzIGZvciBtdWx0aWNhc3QgZG93bmxvYWRzCisgKgorICovCisKKy8qKgorICogUmVzaXplIGJpdG1hcAorICoKKyAqIEB2IGJpdG1hcAkJQml0bWFwCisgKiBAdiBuZXdfbGVuZ3RoCU5ldyBsZW5ndGggb2YgYml0bWFwLCBpbiBiaXRzCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IGJpdG1hcF9yZXNpemUgKCBzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGludCBuZXdfbGVuZ3RoICkgeworCXVuc2lnbmVkIGludCBvbGRfbnVtX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgbmV3X251bV9ibG9ja3M7CisJc2l6ZV90IG5ld19zaXplOworCWJpdG1hcF9ibG9ja190ICpuZXdfYmxvY2tzOworCisJb2xkX251bV9ibG9ja3MgPSBCSVRNQVBfSU5ERVggKCBiaXRtYXAtPmxlbmd0aCArIEJJVE1BUF9CTEtTSVpFIC0gMSApOworCW5ld19udW1fYmxvY2tzID0gQklUTUFQX0lOREVYICggbmV3X2xlbmd0aCArIEJJVE1BUF9CTEtTSVpFIC0gMSApOworCisJaWYgKCBvbGRfbnVtX2Jsb2NrcyAhPSBuZXdfbnVtX2Jsb2NrcyApIHsKKwkJbmV3X3NpemUgPSAoIG5ld19udW1fYmxvY2tzICogc2l6ZW9mICggYml0bWFwLT5ibG9ja3NbMF0gKSApOworCQluZXdfYmxvY2tzID0gcmVhbGxvYyAoIGJpdG1hcC0+YmxvY2tzLCBuZXdfc2l6ZSApOworCQlpZiAoICEgbmV3X2Jsb2NrcyApIHsKKwkJCURCR0MgKCBiaXRtYXAsICJCaXRtYXAgJXAgY291bGQgbm90IHJlc2l6ZSB0byAlZCAiCisJCQkgICAgICAgImJpdHNcbiIsIGJpdG1hcCwgbmV3X2xlbmd0aCApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYml0bWFwLT5ibG9ja3MgPSBuZXdfYmxvY2tzOworCX0KKwliaXRtYXAtPmxlbmd0aCA9IG5ld19sZW5ndGg7CisKKwl3aGlsZSAoIG9sZF9udW1fYmxvY2tzIDwgbmV3X251bV9ibG9ja3MgKSB7CisJCWJpdG1hcC0+YmxvY2tzW29sZF9udW1fYmxvY2tzKytdID0gMDsKKwl9CisKKwlEQkdDICggYml0bWFwLCAiQml0bWFwICVwIHJlc2l6ZWQgdG8gJWQgYml0c1xuIiwgYml0bWFwLCBuZXdfbGVuZ3RoICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGVzdCBiaXQgaW4gYml0bWFwCisgKgorICogQHYgYml0bWFwCQlCaXRtYXAKKyAqIEB2IGJpdAkJQml0IGluZGV4CisgKiBAcmV0IGlzX3NldAkJQml0IGlzIHNldAorICovCitpbnQgYml0bWFwX3Rlc3QgKCBzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGludCBiaXQgKSB7CisJdW5zaWduZWQgaW50IGluZGV4ID0gQklUTUFQX0lOREVYICggYml0ICk7CisgICAgICAgIGJpdG1hcF9ibG9ja190IG1hc2sgPSBCSVRNQVBfTUFTSyAoIGJpdCApOworCisJaWYgKCBiaXQgPj0gYml0bWFwLT5sZW5ndGggKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKCBiaXRtYXAtPmJsb2Nrc1tpbmRleF0gJiBtYXNrICk7Cit9CisKKy8qKgorICogU2V0IGJpdCBpbiBiaXRtYXAKKyAqCisgKiBAdiBiaXRtYXAJCUJpdG1hcAorICogQHYgYml0CQlCaXQgaW5kZXgKKyAqLwordm9pZCBiaXRtYXBfc2V0ICggc3RydWN0IGJpdG1hcCAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYml0ICkgeworCXVuc2lnbmVkIGludCBpbmRleCA9IEJJVE1BUF9JTkRFWCAoIGJpdCApOworICAgICAgICBiaXRtYXBfYmxvY2tfdCBtYXNrID0gQklUTUFQX01BU0sgKCBiaXQgKTsKKworCURCR0MgKCBiaXRtYXAsICJCaXRtYXAgJXAgc2V0dGluZyBiaXQgJWRcbiIsIGJpdG1hcCwgYml0ICk7CisKKwkvKiBVcGRhdGUgYml0bWFwICovCisJYml0bWFwLT5ibG9ja3NbaW5kZXhdIHw9IG1hc2s7CisKKwkvKiBVcGRhdGUgZmlyc3QgZ2FwIGNvdW50ZXIgKi8KKwl3aGlsZSAoIGJpdG1hcF90ZXN0ICggYml0bWFwLCBiaXRtYXAtPmZpcnN0X2dhcCApICkgeworCQliaXRtYXAtPmZpcnN0X2dhcCsrOworCX0KK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvYml0b3BzLmMgYi9ncHhlL3NyYy9jb3JlL2JpdG9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiY2E5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2JpdG9wcy5jCkBAIC0wLDAgKzEsMTMgQEAKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworaW50IF9fZmxzbCAoIGxvbmcgeCApIHsKKwl1bnNpZ25lZCBsb25nIHZhbHVlID0geDsKKwlpbnQgbHMgPSAwOworCisJZm9yICggbHMgPSAwIDsgdmFsdWUgOyBscysrICkgeworCQl2YWx1ZSA+Pj0gMTsKKwl9CisJcmV0dXJuIGxzOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9idGV4dC5jIGIvZ3B4ZS9zcmMvY29yZS9idGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMmQ4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2J0ZXh0LmMKQEAgLTAsMCArMSw1MDM5IEBACisjaWYgMAorCisvKgorICogUHJvY2VkdXJlcyBmb3IgZHJhd2luZyBvbiB0aGUgc2NyZWVuIGVhcmx5IG9uIGluIHRoZSBib290IHByb2Nlc3MuCisgKgorICogQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqICAgbW92ZSB0byBMaW51eEJJT1MgYnkgTFlIIHlobHVAdHlhbi5jb20KKyAqICAgbW92ZSB0byBFdGhlcmJvb3QgYnkgTFlICisgKi8KKworI2luY2x1ZGUgImNvbnNvbGUuaCIKKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorCisjdW5kZWYgX19CSUdfRU5ESUFOCisjaWYgMAorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gCisjZW5kaWYKKworI2luY2x1ZGUgImJ0ZXh0LmgiCisKKy8vI2RlZmluZSBOT19TQ1JPTEwKKworI2lmbmRlZiBOT19TQ1JPTEwKK3N0YXRpYyB2b2lkIHNjcm9sbHNjcmVlbih2b2lkKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkcmF3X2J5dGUoY29uc3QgdW5zaWduZWQgY2hhciBjLCB1MzIgbG9jWCwgdTMyIGxvY1kpOworI2lmIDAKK3N0YXRpYyB2b2lkIGRyYXdfYnl0ZV8zMihjb25zdCB1bnNpZ25lZCBjaGFyICpiaXRzLCB1MzIgKmJhc2UsIHUzMiByYik7CitzdGF0aWMgdm9pZCBkcmF3X2J5dGVfMTYoY29uc3QgdW5zaWduZWQgY2hhciAqYml0cywgdTMyICpiYXNlLCB1MzIgcmIpOworI2VuZGlmCitzdGF0aWMgdm9pZCBkcmF3X2J5dGVfOChjb25zdCB1bnNpZ25lZCBjaGFyICpiaXRzLCB1MzIgKmJhc2UsIHUzMiByYik7CisKK3N0YXRpYyB1MzIgZ19sb2NfWDsKK3N0YXRpYyB1MzIgZ19sb2NfWTsKK3N0YXRpYyB1MzIgZ19tYXhfbG9jX1g7CitzdGF0aWMgdTMyIGdfbWF4X2xvY19ZOworCisjZGVmaW5lIENIQVJfMjU2IDAKKworI2lmIENIQVJfMjU2PT0xCisjZGVmaW5lIGNtYXBzegkoMTYqMjU2KQorI2Vsc2UKKyNkZWZpbmUgY21hcHN6ICAoMTYqOTYpCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmdhX2ZvbnRbY21hcHN6XTsKKwordTMyIGJvb3RfdGV4dF9tYXBwZWQ7CisKK2Jvb3RfaW5mb3NfdCBkaXNwX2JpOworCisjZGVmaW5lIEJURVhUCQkKKyNkZWZpbmUgQlREQVRBCQorCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBlbmFibGUgdGhlIGVhcmx5IGJvb3QgdGV4dCB3aGVuIGRvaW5nIE9GIGJvb3RpbmcuIFRoaXMKKyAqIHdheSwgeG1vbiBvdXRwdXQgc2hvdWxkIHdvcmsgdG9vCisgKi8KK3N0YXRpYyB2b2lkCitidGV4dF9zZXR1cF9kaXNwbGF5KHUzMiB3aWR0aCwgdTMyIGhlaWdodCwgdTMyIGRlcHRoLCB1MzIgcGl0Y2gsCisJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJYm9vdF9pbmZvc190KiBiaSA9ICZkaXNwX2JpOworCisJZ19sb2NfWCA9IDA7CisJZ19sb2NfWSA9IDA7CisJZ19tYXhfbG9jX1ggPSB3aWR0aCAvIDg7CisJZ19tYXhfbG9jX1kgPSBoZWlnaHQgLyAxNjsKKy8vCWJpLT5sb2dpY2FsRGlzcGxheUJhc2UgPSAodW5zaWduZWQgY2hhciAqKWFkZHJlc3M7CisJYmktPmRpc3BEZXZpY2VCYXNlID0gYWRkcmVzczsKKwliaS0+ZGlzcERldmljZVJvd0J5dGVzID0gcGl0Y2g7CisJYmktPmRpc3BEZXZpY2VEZXB0aCA9IGRlcHRoOworCWJpLT5kaXNwRGV2aWNlUmVjdFswXSA9IGJpLT5kaXNwRGV2aWNlUmVjdFsxXSA9IDA7CisJYmktPmRpc3BEZXZpY2VSZWN0WzJdID0gd2lkdGg7CisJYmktPmRpc3BEZXZpY2VSZWN0WzNdID0gaGVpZ2h0OworCWJvb3RfdGV4dF9tYXBwZWQgPSAwOworfQorCisvKiBIZXJlJ3MgYSBzbWFsbCB0ZXh0IGVuZ2luZSB0byB1c2UgZHVyaW5nIGVhcmx5IGJvb3QKKyAqIG9yIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqCisgKiB0b2RvOgorICoKKyAqICAtIGJ1aWxkIHNvbWUga2luZCBvZiB2Z2Fjb24gd2l0aCBpdCB0byBlbmFibGUgZWFybHkgcHJpbnRrCisgKiAgLSBtb3ZlIHRvIGEgc2VwYXJhdGUgZmlsZQorICogIC0gYWRkIGEgZmV3IHZpZGVvIGRyaXZlciBob29rcyB0byBrZWVwIGluIHN5bmMgd2l0aCBkaXNwbGF5CisgKiAgICBjaGFuZ2VzLgorICovCisKK3N0YXRpYyB2b2lkIAorbWFwX2Jvb3RfdGV4dCh2b2lkKQoreworCWJvb3RfaW5mb3NfdCAqYmkgPSAmZGlzcF9iaTsKKwkKKwlpZiAoYmktPmRpc3BEZXZpY2VCYXNlID09IDApCisJCXJldHVybjsKKworCWJvb3RfdGV4dF9tYXBwZWQgPSAwOwkKKworCWJpLT5sb2dpY2FsRGlzcGxheUJhc2UgPSBwaHlzX3RvX3ZpcnQoYmktPmRpc3BEZXZpY2VCYXNlKTsKKwkKKwlib290X3RleHRfbWFwcGVkID0gMTsKK30KKworLyogQ2FsYyB0aGUgYmFzZSBhZGRyZXNzIG9mIGEgZ2l2ZW4gcG9pbnQgKHgseSkgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogQlRFWFQKK2NhbGNfYmFzZShib290X2luZm9zX3QgKmJpLCB1MzIgeCwgdTMyIHkpCit7CisJdW5zaWduZWQgY2hhciAqYmFzZTsKKwliYXNlID0gYmktPmxvZ2ljYWxEaXNwbGF5QmFzZTsKKyNpZiAwCisJLyogVW1tbS4uLiB3aGljaCBtb3JvbiB3cm90ZSB0aGlzPyAqLworCWlmIChiYXNlID09IDApCisJCWJhc2UgPSBiaS0+ZGlzcERldmljZUJhc2U7CisjZW5kaWYKKwliYXNlICs9ICh4ICsgYmktPmRpc3BEZXZpY2VSZWN0WzBdKSAqIChiaS0+ZGlzcERldmljZURlcHRoID4+IDMpOworCWJhc2UgKz0gKHkgKyBiaS0+ZGlzcERldmljZVJlY3RbMV0pICogYmktPmRpc3BEZXZpY2VSb3dCeXRlczsKKwlyZXR1cm4gYmFzZTsKK30KKworCitzdGF0aWMgdm9pZCBCVEVYVCBidGV4dF9jbGVhcnNjcmVlbih2b2lkKQoreworCWJvb3RfaW5mb3NfdCogYmkJPSAmZGlzcF9iaTsKKwl1MzIgKmJhc2UJPSAodTMyICopY2FsY19iYXNlKGJpLCAwLCAwKTsKKwl1MzIgd2lkdGggCT0gKChiaS0+ZGlzcERldmljZVJlY3RbMl0gLSBiaS0+ZGlzcERldmljZVJlY3RbMF0pICoKKwkJCQkJKGJpLT5kaXNwRGV2aWNlRGVwdGggPj4gMykpID4+IDI7CisJdTMyIGksajsKKworCWZvciAoaT0wOyBpPChiaS0+ZGlzcERldmljZVJlY3RbM10gLSBiaS0+ZGlzcERldmljZVJlY3RbMV0pOyBpKyspCisJeworCQl1MzIgKnB0ciA9IGJhc2U7CisJCWZvcihqPXdpZHRoOyBqOyAtLWopCisJCQkqKHB0cisrKSA9IDA7CisJCWJhc2UgKz0gKGJpLT5kaXNwRGV2aWNlUm93Qnl0ZXMgPj4gMik7CisJfQorfQorCisjaWYgMAorX19pbmxpbmVfXyB2b2lkIGRjYnN0KGNvbnN0IHZvaWQqIGFkZHIpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJkY2JzdCAwLCUwIiA6OiAiciIgKGFkZHIpKTsKK30KKworc3RhdGljIHZvaWQgQlRFWFQgYnRleHRfZmx1c2hzY3JlZW4odm9pZCkKK3sKKwlib290X2luZm9zX3QqIGJpCT0gJmRpc3BfYmk7CisJdTMyICAqYmFzZQk9ICh1bnNpZ25lZCBsb25nICopY2FsY19iYXNlKGJpLCAwLCAwKTsKKwl1MzIgd2lkdGggCT0gKChiaS0+ZGlzcERldmljZVJlY3RbMl0gLSBiaS0+ZGlzcERldmljZVJlY3RbMF0pICoKKwkJCQkJKGJpLT5kaXNwRGV2aWNlRGVwdGggPj4gMykpID4+IDI7CisJdTMyIGksajsKKworCWZvciAoaT0wOyBpPChiaS0+ZGlzcERldmljZVJlY3RbM10gLSBiaS0+ZGlzcERldmljZVJlY3RbMV0pOyBpKyspCisJeworCQl1MzIgKnB0ciA9IGJhc2U7CisJCWZvcihqPXdpZHRoOyBqPjA7IGotPTgpIHsKKwkJCWRjYnN0KHB0cik7CisJCQlwdHIgKz0gODsKKwkJfQorCQliYXNlICs9IChiaS0+ZGlzcERldmljZVJvd0J5dGVzID4+IDIpOworCX0KK30KKyNlbmRpZgorCisKKyNpZm5kZWYgTk9fU0NST0xMCitzdGF0aWMgQlRFWFQgdm9pZAorc2Nyb2xsc2NyZWVuKHZvaWQpCit7CisJYm9vdF9pbmZvc190KiBiaQkJPSAmZGlzcF9iaTsKKwl1MzIgKnNyYwkJPSAodTMyICopY2FsY19iYXNlKGJpLDAsMTYpOworCXUzMiAqZHN0CQk9ICh1MzIgKiljYWxjX2Jhc2UoYmksMCwwKTsKKwl1MzIgd2lkdGgJCT0gKChiaS0+ZGlzcERldmljZVJlY3RbMl0gLSBiaS0+ZGlzcERldmljZVJlY3RbMF0pICoKKwkJCQkJCShiaS0+ZGlzcERldmljZURlcHRoID4+IDMpKSA+PiAyOworCXUzMiBpLGo7CisKKwlmb3IgKGk9MDsgaTwoYmktPmRpc3BEZXZpY2VSZWN0WzNdIC0gYmktPmRpc3BEZXZpY2VSZWN0WzFdIC0gMTYpOyBpKyspCisJeworCQl1MzIgKnNyY19wdHIgPSBzcmM7CisJCXUzMiAqZHN0X3B0ciA9IGRzdDsKKwkJZm9yKGo9d2lkdGg7IGo7IC0taikKKwkJCSooZHN0X3B0cisrKSA9ICooc3JjX3B0cisrKTsKKwkJc3JjICs9IChiaS0+ZGlzcERldmljZVJvd0J5dGVzID4+IDIpOworCQlkc3QgKz0gKGJpLT5kaXNwRGV2aWNlUm93Qnl0ZXMgPj4gMik7CisJfQorCWZvciAoaT0wOyBpPDE2OyBpKyspCisJeworCQl1MzIgKmRzdF9wdHIgPSBkc3Q7CisJCWZvcihqPXdpZHRoOyBqOyAtLWopCisJCQkqKGRzdF9wdHIrKykgPSAwOworCQlkc3QgKz0gKGJpLT5kaXNwRGV2aWNlUm93Qnl0ZXMgPj4gMik7CisJfQorfQorI2VuZGlmIC8qIG5kZWYgTk9fU0NST0xMICovCisKK3N0YXRpYyB2b2lkIEJURVhUIGJ0ZXh0X2RyYXdjaGFyKGNoYXIgYykKK3sKKwl1MzIgY2xpbmUgPSAwOworCisJaWYgKCFib290X3RleHRfbWFwcGVkKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICdcYic6CisJCWlmIChnX2xvY19YID4gMCkKKwkJCS0tZ19sb2NfWDsKKwkJYnJlYWs7CisJY2FzZSAnXHQnOgorCQlnX2xvY19YID0gKGdfbG9jX1ggJiAtOCkgKyA4OworCQlicmVhazsKKwljYXNlICdccic6CisJCWdfbG9jX1ggPSAwOworCQlicmVhazsKKwljYXNlICdcbic6CisJCWdfbG9jX1ggPSAwOworCQlnX2xvY19ZKys7CisJCWNsaW5lID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHJhd19ieXRlKGMsIGdfbG9jX1grKywgZ19sb2NfWSk7CisJfQorCWlmIChnX2xvY19YID49IGdfbWF4X2xvY19YKSB7CisJCWdfbG9jX1ggPSAwOworCQlnX2xvY19ZKys7CisJCWNsaW5lID0gMTsKKwl9CisjaWZuZGVmIE5PX1NDUk9MTAorCXdoaWxlIChnX2xvY19ZID49IGdfbWF4X2xvY19ZKSB7CisJCXNjcm9sbHNjcmVlbigpOworCQlnX2xvY19ZLS07CisJfQorI2Vsc2UKKwkvKiB3cmFwIGFyb3VuZCBmcm9tIGJvdHRvbSB0byB0b3Agb2Ygc2NyZWVuIHNvIHdlIGRvbid0CisJICAgd2FzdGUgdGltZSBzY3JvbGxpbmcgZWFjaCBsaW5lLiAgLS0gcGF1bHVzLiAqLworCWlmIChnX2xvY19ZID49IGdfbWF4X2xvY19ZKQorCQlnX2xvY19ZID0gMDsKKwlpZiAoY2xpbmUpIHsKKwkJZm9yICh4ID0gMDsgeCA8IGdfbWF4X2xvY19YOyArK3gpCisJCQlkcmF3X2J5dGUoJyAnLCB4LCBnX2xvY19ZKTsKKwl9CisjZW5kaWYKK30KKyNpZiAwCitzdGF0aWMgdm9pZCBCVEVYVAorYnRleHRfZHJhd3N0cmluZyhjb25zdCBjaGFyICpjKQoreworCWlmICghYm9vdF90ZXh0X21hcHBlZCkKKwkJcmV0dXJuOworCXdoaWxlICgqYykKKwkJYnRleHRfZHJhd2NoYXIoKmMrKyk7Cit9CitzdGF0aWMgdm9pZCBCVEVYVAorYnRleHRfZHJhd2hleCh1MzIgdikKK3sKKwlzdGF0aWMgY2hhciBoZXhfdGFibGVbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKworCWlmICghYm9vdF90ZXh0X21hcHBlZCkKKwkJcmV0dXJuOworCWJ0ZXh0X2RyYXdjaGFyKGhleF90YWJsZVsodiA+PiAyOCkgJiAweDAwMDAwMDBGVUxdKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfdGFibGVbKHYgPj4gMjQpICYgMHgwMDAwMDAwRlVMXSk7CisJYnRleHRfZHJhd2NoYXIoaGV4X3RhYmxlWyh2ID4+IDIwKSAmIDB4MDAwMDAwMEZVTF0pOworCWJ0ZXh0X2RyYXdjaGFyKGhleF90YWJsZVsodiA+PiAxNikgJiAweDAwMDAwMDBGVUxdKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfdGFibGVbKHYgPj4gMTIpICYgMHgwMDAwMDAwRlVMXSk7CisJYnRleHRfZHJhd2NoYXIoaGV4X3RhYmxlWyh2ID4+ICA4KSAmIDB4MDAwMDAwMEZVTF0pOworCWJ0ZXh0X2RyYXdjaGFyKGhleF90YWJsZVsodiA+PiAgNCkgJiAweDAwMDAwMDBGVUxdKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfdGFibGVbKHYgPj4gIDApICYgMHgwMDAwMDAwRlVMXSk7CisJYnRleHRfZHJhd2NoYXIoJyAnKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBCVEVYVAorZHJhd19ieXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgYywgdTMyIGxvY1gsIHUzMiBsb2NZKQoreworCWJvb3RfaW5mb3NfdCogYmkJPSAmZGlzcF9iaTsKKwl1bnNpZ25lZCBjaGFyICpiYXNlCT0gY2FsY19iYXNlKGJpLCBsb2NYIDw8IDMsIGxvY1kgPDwgNCk7CisjaWYgQ0hBUl8yNTY9PTEKKyAgICAgICAgdW5zaWduZWQgY29uc3QgY2hhciAqZm9udCAgICAgPSAmdmdhX2ZvbnRbKCgodTMyKWMpKSAqIDE2XTsKKyNlbHNlCisJdW5zaWduZWQgY29uc3QgY2hhciAqZm9udAk9ICZ2Z2FfZm9udFsoKCh1MzIpYy0weDIwKSkgKiAxNl07CisjZW5kaWYKKworCXUzMiByYgkJCT0gYmktPmRpc3BEZXZpY2VSb3dCeXRlczsKKworCXN3aXRjaChiaS0+ZGlzcERldmljZURlcHRoKSB7CisjaWYgMAorCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwkJZHJhd19ieXRlXzMyKGZvbnQsICh1MzIgKiliYXNlLCByYik7CisJCWJyZWFrOworCWNhc2UgMTU6CisJY2FzZSAxNjoKKwkJZHJhd19ieXRlXzE2KGZvbnQsICh1MzIgKiliYXNlLCByYik7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSA4OgorCQlkcmF3X2J5dGVfOChmb250LCAodTMyICopYmFzZSwgcmIpOworCQlicmVhazsKKwl9Cit9CitzdGF0aWMgdTMyIGV4cGFuZF9iaXRzXzhbMTZdIEJUREFUQSA9IHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwZmYsMHgwMDAwZmYwMCwweDAwMDBmZmZmLAorICAgIDB4MDBmZjAwMDAsMHgwMGZmMDBmZiwweDAwZmZmZjAwLDB4MDBmZmZmZmYsCisgICAgMHhmZjAwMDAwMCwweGZmMDAwMGZmLDB4ZmYwMGZmMDAsMHhmZjAwZmZmZiwKKyAgICAweGZmZmYwMDAwLDB4ZmZmZjAwZmYsMHhmZmZmZmYwMCwweGZmZmZmZmZmCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKyAgICAweDAwMDAwMDAwLDB4ZmYwMDAwMDAsMHgwMGZmMDAwMCwweGZmZmYwMDAwLAorICAgIDB4MDAwMGZmMDAsMHhmZjAwZmYwMCwweDAwZmZmZjAwLDB4ZmZmZmZmMDAsCisgICAgMHgwMDAwMDBmZiwweGZmMDAwMGZmLDB4MDBmZjAwZmYsMHhmZmZmMDBmZiwKKyAgICAweDAwMDBmZmZmLDB4ZmYwMGZmZmYsMHgwMGZmZmZmZiwweGZmZmZmZmZmCisjZWxzZQorI2Vycm9yIEZJWE1FOiBObyBlbmRpYW5uZXNzPz8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAKK307CisjaWYgMAorc3RhdGljIGNvbnN0IHUzMiBleHBhbmRfYml0c18xNls0XSBCVERBVEEgPSB7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisgICAgMHgwMDAwMDAwMCwgMHgwMDAwZmZmZiwgMHhmZmZmMDAwMCwgMHhmZmZmZmZmZgorI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisgICAgMHgwMDAwMDAwMCwgMHhmZmZmMDAwMCwgMHgwMDAwZmZmZiwgMHhmZmZmZmZmZgorI2Vsc2UKKyNlcnJvciBGSVhNRTogTm8gZW5kaWFubmVzcz8/CisjZW5kaWYKK307CisjZW5kaWYKKyNpZiAwCitzdGF0aWMgdm9pZCBCVEVYVAorZHJhd19ieXRlXzMyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZvbnQsIHUzMiAqYmFzZSwgdTMyIHJiKQoreworCXUzMiBsLCBiaXRzOworCXUzMiBmZyA9IDB4RkZGRkZGRkY7CisJdTMyIGJnID0gMHgwMDAwMDAwMDsKKworCWZvciAobCA9IDA7IGwgPCAxNjsgKytsKQorCXsKKwkJYml0cyA9ICpmb250Kys7CisJCWJhc2VbMF0gPSAoLShiaXRzID4+IDcpICYgZmcpIF4gYmc7CisJCWJhc2VbMV0gPSAoLSgoYml0cyA+PiA2KSAmIDEpICYgZmcpIF4gYmc7CisJCWJhc2VbMl0gPSAoLSgoYml0cyA+PiA1KSAmIDEpICYgZmcpIF4gYmc7CisJCWJhc2VbM10gPSAoLSgoYml0cyA+PiA0KSAmIDEpICYgZmcpIF4gYmc7CisJCWJhc2VbNF0gPSAoLSgoYml0cyA+PiAzKSAmIDEpICYgZmcpIF4gYmc7CisJCWJhc2VbNV0gPSAoLSgoYml0cyA+PiAyKSAmIDEpICYgZmcpIF4gYmc7CisJCWJhc2VbNl0gPSAoLSgoYml0cyA+PiAxKSAmIDEpICYgZmcpIF4gYmc7CisJCWJhc2VbN10gPSAoLShiaXRzICYgMSkgJiBmZykgXiBiZzsKKwkJYmFzZSA9ICh1MzIgKikgKChjaGFyICopYmFzZSArIHJiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEJURVhUCitkcmF3X2J5dGVfMTYoY29uc3QgdW5zaWduZWQgY2hhciAqZm9udCwgdTMyICpiYXNlLCB1MzIgcmIpCit7CisJdTMyIGwsIGJpdHM7CisJdTMyIGZnID0gMHhGRkZGRkZGRjsKKwl1MzIgYmcgPSAweDAwMDAwMDAwOworCXUzMiAqZWIgPSBleHBhbmRfYml0c18xNjsKKworCWZvciAobCA9IDA7IGwgPCAxNjsgKytsKQorCXsKKwkJYml0cyA9ICpmb250Kys7CisJCWJhc2VbMF0gPSAoZWJbYml0cyA+PiA2XSAmIGZnKSBeIGJnOworCQliYXNlWzFdID0gKGViWyhiaXRzID4+IDQpICYgM10gJiBmZykgXiBiZzsKKwkJYmFzZVsyXSA9IChlYlsoYml0cyA+PiAyKSAmIDNdICYgZmcpIF4gYmc7CisJCWJhc2VbM10gPSAoZWJbYml0cyAmIDNdICYgZmcpIF4gYmc7CisJCWJhc2UgPSAodTMyICopICgoY2hhciAqKWJhc2UgKyByYik7CisJfQorfQorI2VuZGlmCitzdGF0aWMgdm9pZCBCVEVYVAorZHJhd19ieXRlXzgoY29uc3QgdW5zaWduZWQgY2hhciAqZm9udCwgdTMyICpiYXNlLCB1MzIgcmIpCit7CisJdTMyIGwsIGJpdHM7CisJdTMyIGZnID0gMHgwRjBGMEYwRjsKKwl1MzIgYmcgPSAweDAwMDAwMDAwOworCXUzMiAqZWIgPSBleHBhbmRfYml0c184OworCisJZm9yIChsID0gMDsgbCA8IDE2OyArK2wpCisJeworCQliaXRzID0gKmZvbnQrKzsKKwkJYmFzZVswXSA9IChlYltiaXRzID4+IDRdICYgZmcpIF4gYmc7CisJCWJhc2VbMV0gPSAoZWJbYml0cyAmIDB4Zl0gJiBmZykgXiBiZzsKKwkJYmFzZSA9ICh1MzIgKikgKChjaGFyICopYmFzZSArIHJiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJ0ZXh0X2luaXQodm9pZCkKK3sKKyNpZiAwCisvLyBmb3IgZGVidWcKKyNkZWZpbmUgZnJhbWVfYnVmZmVyIDB4ZmMwMDAwMDAKKyNlbHNlCisgICAgdWludDMyX3QgZnJhbWVfYnVmZmVyOy8vICAweGZjMDAwMDAwCisKKyAgICBzdHJ1Y3QgcGNpX2RldmljZSBkZXY7CisKKyAgICAjd2FybmluZyAicGNpX2ZpbmRfZGV2aWNlX3ggbm8gbG9uZ2VyIGV4aXN0czsgdXNlIGZpbmRfcGNpX2RldmljZSBpbnN0ZWFkIgorICAgIC8qICAgIHBjaV9maW5kX2RldmljZV94KDB4MTAwMiwgMHg0NzUyLCAwLCAmZGV2KTsgKi8KKyAgICBpZihkZXYudmVuZG9yPT0wKSByZXR1cm47IC8vIG5vIGZiCisKKyAgICBmcmFtZV9idWZmZXIgPSAodWludDMyX3QpZGV2Lm1lbWJhc2U7CisjZW5kaWYKKworCWJ0ZXh0X3NldHVwX2Rpc3BsYXkoNjQwLCA0ODAsIDgsIDY0MCxmcmFtZV9idWZmZXIpOworCWJ0ZXh0X2NsZWFyc2NyZWVuKCk7CisJbWFwX2Jvb3RfdGV4dCgpOworfQorc3RhdGljIHZvaWQgYnRleHRfcHV0YyhpbnQgYykKK3sJCisgICAgICAgIGJ0ZXh0X2RyYXdjaGFyKCh1bnNpZ25lZCBjaGFyKWMpOworfQorCitzdHJ1Y3QgY29uc29sZV9kcml2ZXIgYnRleHRfY29uc29sZSBfX2NvbnNvbGVfZHJpdmVyID0geworCS5wdXRjaGFyID0gYnRleHRfcHV0YywKKwkuZGlzYWJsZWQgPSAxLAorfTsKKworLy9jb21lIGZyb20gbGludXgvZHJpdmVycy92aWRlby9mb250LTh4MTYuYworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEZvbnQgZmlsZSBnZW5lcmF0ZWQgYnkgY3BpMmZudCAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB2Z2FfZm9udFtjbWFwc3pdIEJUREFUQSA9IHsKKyNpZiBDSEFSXzI1Nj09MQorCS8qIDAgMHgwMCAnXkAnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEgMHgwMSAnXkEnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg4MSwgLyogMTAwMDAwMDEgKi8KKwkweGE1LCAvKiAxMDEwMDEwMSAqLworCTB4ODEsIC8qIDEwMDAwMDAxICovCisJMHg4MSwgLyogMTAwMDAwMDEgKi8KKwkweGJkLCAvKiAxMDExMTEwMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHg4MSwgLyogMTAwMDAwMDEgKi8KKwkweDgxLCAvKiAxMDAwMDAwMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIgMHgwMiAnXkInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4ZTcsIC8qIDExMTAwMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDMgMHgwMyAnXkMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQgMHgwNCAnXkQnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDUgMHgwNSAnXkUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4ZTcsIC8qIDExMTAwMTExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDYgMHgwNiAnXkYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDcgMHgwNyAnXkcnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDggMHgwOCAnXkgnICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4YzMsIC8qIDExMDAwMDExICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKworCS8qIDkgMHgwOSAnXkknICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDQyLCAvKiAwMTAwMDAxMCAqLworCTB4NDIsIC8qIDAxMDAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwIDB4MGEgJ15KJyAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHhiZCwgLyogMTAxMTExMDEgKi8KKwkweGJkLCAvKiAxMDExMTEwMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHhjMywgLyogMTEwMDAwMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisKKwkvKiAxMSAweDBiICdeSycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MWEsIC8qIDAwMDExMDEwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIgMHgwYyAnXkwnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzIDB4MGQgJ15NJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNmLCAvKiAwMDExMTExMSAqLworCTB4MzMsIC8qIDAwMTEwMDExICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNCAweDBlICdeTicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZiwgLyogMDExMTExMTEgKi8KKwkweDYzLCAvKiAwMTEwMDAxMSAqLworCTB4N2YsIC8qIDAxMTExMTExICovCisJMHg2MywgLyogMDExMDAwMTEgKi8KKwkweDYzLCAvKiAwMTEwMDAxMSAqLworCTB4NjMsIC8qIDAxMTAwMDExICovCisJMHg2MywgLyogMDExMDAwMTEgKi8KKwkweDY3LCAvKiAwMTEwMDExMSAqLworCTB4ZTcsIC8qIDExMTAwMTExICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTUgMHgwZiAnXk8nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2IDB4MTAgJ15QJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg4MCwgLyogMTAwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDgwLCAvKiAxMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNyAweDExICdeUScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDIsIC8qIDAwMDAwMDEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MWUsIC8qIDAwMDExMTEwICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwMiwgLyogMDAwMDAwMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTggMHgxMiAnXlInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5IDB4MTMgJ15TJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMCAweDE0ICdeVCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZiwgLyogMDExMTExMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweDdiLCAvKiAwMTExMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxYiwgLyogMDAwMTEwMTEgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxYiwgLyogMDAwMTEwMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjEgMHgxNSAnXlUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyIDB4MTYgJ15WJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMyAweDE3ICdeVycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQgMHgxOCAnXlgnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1IDB4MTkgJ15ZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNiAweDFhICdeWicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjcgMHgxYiAnXlsnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI4IDB4MWMgJ15cJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyOSAweDFkICdeXScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzAgMHgxZSAnXl4nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDMxIDB4MWYgJ15fJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisjZW5kaWYKKwkvKiAzMiAweDIwICcgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMyAweDIxICchJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNCAweDIyICciJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNSAweDIzICcjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNiAweDI0ICckJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4ODYsIC8qIDEwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNyAweDI1ICclJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDg2LCAvKiAxMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOCAweDI2ICcmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOSAweDI3ICcnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MCAweDI4ICcoJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MSAweDI5ICcpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MiAweDJhICcqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MyAweDJiICcrJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NCAweDJjICcsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NSAweDJkICctJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NiAweDJlICcuJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NyAweDJmICcvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMiwgLyogMDAwMDAwMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDgwLCAvKiAxMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0OCAweDMwICcwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0OSAweDMxICcxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MCAweDMyICcyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MSAweDMzICczJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MiAweDM0ICc0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDFlLCAvKiAwMDAxMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MyAweDM1ICc1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NCAweDM2ICc2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NSAweDM3ICc3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NiAweDM4ICc4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NyAweDM5ICc5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1OCAweDNhICc6JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1OSAweDNiICc7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MCAweDNjICc8JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MSAweDNkICc9JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MiAweDNlICc+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MyAweDNmICc/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NCAweDQwICdAJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZGUsIC8qIDExMDExMTEwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGRlLCAvKiAxMTAxMTExMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NSAweDQxICdBJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NiAweDQyICdCJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NyAweDQzICdDJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzIsIC8qIDExMDAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OCAweDQ0ICdEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OSAweDQ1ICdFJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2MiwgLyogMDExMDAwMTAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2OCwgLyogMDExMDEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MCAweDQ2ICdGJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2MiwgLyogMDExMDAwMTAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2OCwgLyogMDExMDEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MSAweDQ3ICdHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNhLCAvKiAwMDExMTAxMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MiAweDQ4ICdIJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MyAweDQ5ICdJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NCAweDRhICdKJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFlLCAvKiAwMDAxMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NSAweDRiICdLJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NiAweDRjICdMJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NyAweDRkICdNJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZWUsIC8qIDExMTAxMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3OCAweDRlICdOJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHhmNiwgLyogMTExMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZGUsIC8qIDExMDExMTEwICovCisJMHhjZSwgLyogMTEwMDExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3OSAweDRmICdPJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MCAweDUwICdQJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MSAweDUxICdRJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MiAweDUyICdSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MyAweDUzICdTJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NCAweDU0ICdUJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg1YSwgLyogMDEwMTEwMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NSAweDU1ICdVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NiAweDU2ICdWJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NyAweDU3ICdXJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhlZSwgLyogMTExMDExMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4OCAweDU4ICdYJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4OSAweDU5ICdZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MCAweDVhICdaJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg4NiwgLyogMTAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzIsIC8qIDExMDAwMDEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MSAweDViICdbJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MiAweDVjICdcJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ODAsIC8qIDEwMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwMCAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDAyLCAvKiAwMDAwMDAxMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MyAweDVkICddJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NCAweDVlICdeJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NSAweDVmICdfJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NiAweDYwICdgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NyAweDYxICdhJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OCAweDYyICdiJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OSAweDYzICdjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDAgMHg2NCAnZCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTAxIDB4NjUgJ2UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwMiAweDY2ICdmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDMgMHg2NyAnZycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA0IDB4NjggJ2gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwNSAweDY5ICdpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDYgMHg2YSAnaicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA3IDB4NmIgJ2snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwOCAweDZjICdsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDkgMHg2ZCAnbScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhlYywgLyogMTExMDExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEwIDB4NmUgJ24nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExMSAweDZmICdvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTIgMHg3MCAncCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEzIDB4NzEgJ3EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MWUsIC8qIDAwMDExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNCAweDcyICdyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTUgMHg3MyAncycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE2IDB4NzQgJ3QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNyAweDc1ICd1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTggMHg3NiAndicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE5IDB4NzcgJ3cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMCAweDc4ICd4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjEgMHg3OSAneScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIyIDB4N2EgJ3onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMyAweDdiICd7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjQgMHg3YyAnfCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTI1IDB4N2QgJ30nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyNiAweDdlICd+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjcgMHg3ZiAnfycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworI2lmIENIQVJfMjU2MjU2PT0xCisJLyogMTI4IDB4ODAgJ4AnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGMyLCAvKiAxMTAwMDAxMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyOSAweDgxICeBJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzAgMHg4MiAngicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTMxIDB4ODMgJ4MnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMiAweDg0ICeEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzMgMHg4NSAnhScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTM0IDB4ODYgJ4YnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNSAweDg3ICeHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzYgMHg4OCAniCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTM3IDB4ODkgJ4knICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzOCAweDhhICeKJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzkgMHg4YiAniycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQwIDB4OGMgJ4wnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MSAweDhkICeNJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDIgMHg4ZSAnjicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQzIDB4OGYgJ48nICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NCAweDkwICeQJyAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDYyLCAvKiAwMTEwMDAxMCAqLworCTB4NjgsIC8qIDAxMTAxMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDUgMHg5MSAnkScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhlYywgLyogMTExMDExMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHg2ZSwgLyogMDExMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQ2IDB4OTIgJ5InICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2UsIC8qIDExMDAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NyAweDkzICeTJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDggMHg5NCAnlCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQ5IDB4OTUgJ5UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MCAweDk2ICeWJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTEgMHg5NyAnlycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTUyIDB4OTggJ5gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MyAweDk5ICeZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTQgMHg5YSAnmicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTU1IDB4OWIgJ5snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NiAweDljICecJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NjQsIC8qIDAxMTAwMTAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTcgMHg5ZCAnnScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTU4IDB4OWUgJ54nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4YzQsIC8qIDExMDAwMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGRlLCAvKiAxMTAxMTExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1OSAweDlmICefJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjAgMHhhMCAnoCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTYxIDB4YTEgJ6EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MiAweGEyICeiJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjMgMHhhMyAnoycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTY0IDB4YTQgJ6QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NSAweGE1ICelJyAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGNlLCAvKiAxMTAwMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjYgMHhhNiAnpicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTY3IDB4YTcgJ6cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2OCAweGE4ICeoJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjkgMHhhOSAnqScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTcwIDB4YWEgJ6onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MSAweGFiICerJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHg4NiwgLyogMTAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNzIgMHhhYyAnrCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhlMCwgLyogMTExMDAwMDAgKi8KKwkweDYyLCAvKiAwMTEwMDAxMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGNlLCAvKiAxMTAwMTExMCAqLworCTB4OWEsIC8qIDEwMDExMDEwICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTczIDB4YWQgJ60nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NCAweGFlICeuJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNzUgMHhhZiAnrycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTc2IDB4YjAgJ7AnICovCisJMHgxMSwgLyogMDAwMTAwMDEgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTEsIC8qIDAwMDEwMDAxICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDExLCAvKiAwMDAxMDAwMSAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgxMSwgLyogMDAwMTAwMDEgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTEsIC8qIDAwMDEwMDAxICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDExLCAvKiAwMDAxMDAwMSAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgxMSwgLyogMDAwMTAwMDEgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTEsIC8qIDAwMDEwMDAxICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKworCS8qIDE3NyAweGIxICexJyAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKwkweDU1LCAvKiAwMTAxMDEwMSAqLworCTB4YWEsIC8qIDEwMTAxMDEwICovCisJMHg1NSwgLyogMDEwMTAxMDEgKi8KKwkweGFhLCAvKiAxMDEwMTAxMCAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKwkweDU1LCAvKiAwMTAxMDEwMSAqLworCTB4YWEsIC8qIDEwMTAxMDEwICovCisJMHg1NSwgLyogMDEwMTAxMDEgKi8KKwkweGFhLCAvKiAxMDEwMTAxMCAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKwkweDU1LCAvKiAwMTAxMDEwMSAqLworCTB4YWEsIC8qIDEwMTAxMDEwICovCisKKwkvKiAxNzggMHhiMiAnsicgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCTB4ZGQsIC8qIDExMDExMTAxICovCisJMHg3NywgLyogMDExMTAxMTEgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCTB4ZGQsIC8qIDExMDExMTAxICovCisJMHg3NywgLyogMDExMTAxMTEgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCisJLyogMTc5IDB4YjMgJ7MnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE4MCAweGI0ICe0JyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxODEgMHhiNSAntScgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMTgyIDB4YjYgJ7YnICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4MyAweGI3ICe3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAxODQgMHhiOCAnuCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMTg1IDB4YjkgJ7knICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4ZjYsIC8qIDExMTEwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4NiAweGJhICe6JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAxODcgMHhiYiAnuycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4ZjYsIC8qIDExMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCisJLyogMTg4IDB4YmMgJ7wnICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4ZjYsIC8qIDExMTEwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE4OSAweGJkICe9JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxOTAgMHhiZSAnvicgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTkxIDB4YmYgJ78nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5MiAweGMwICfAJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxOTMgMHhjMSAnwScgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTk0IDB4YzIgJ8InICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5NSAweGMzICfDJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxOTYgMHhjNCAnxCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTk3IDB4YzUgJ8UnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5OCAweGM2ICfGJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxOTkgMHhjNyAnxycgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzcsIC8qIDAwMTEwMTExICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCisJLyogMjAwIDB4YzggJ8gnICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzcsIC8qIDAwMTEwMTExICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDNmLCAvKiAwMDExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwMSAweGM5ICfJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNmLCAvKiAwMDExMTExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzNywgLyogMDAxMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAyMDIgMHhjYSAnyicgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmNywgLyogMTExMTAxMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjAzIDB4Y2IgJ8snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY3LCAvKiAxMTExMDExMSAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwNCAweGNjICfMJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM3LCAvKiAwMDExMDExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzNywgLyogMDAxMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAyMDUgMHhjZCAnzScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjA2IDB4Y2UgJ84nICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4ZjcsIC8qIDExMTEwMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY3LCAvKiAxMTExMDExMSAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwNyAweGNmICfPJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMDggMHhkMCAn0CcgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjA5IDB4ZDEgJ9EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxMCAweGQyICfSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAyMTEgMHhkMyAn0ycgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4M2YsIC8qIDAwMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjEyIDB4ZDQgJ9QnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MWYsIC8qIDAwMDExMTExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIxMyAweGQ1ICfVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAyMTQgMHhkNiAn1icgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2YsIC8qIDAwMTExMTExICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCisJLyogMjE1IDB4ZDcgJ9cnICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIxNiAweGQ4ICfYJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAyMTcgMHhkOSAn2ScgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjE4IDB4ZGEgJ9onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxOSAweGRiICfbJyAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisKKwkvKiAyMjAgMHhkYyAn3CcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCisJLyogMjIxIDB4ZGQgJ90nICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKworCS8qIDIyMiAweGRlICfeJyAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisKKwkvKiAyMjMgMHhkZiAn3ycgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjI0IDB4ZTAgJ+AnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNSAweGUxICfhJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMjYgMHhlMiAn4icgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjI3IDB4ZTMgJ+MnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyOCAweGU0ICfkJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMjkgMHhlNSAn5ScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjMwIDB4ZTYgJ+YnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzMSAweGU3ICfnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzIgMHhlOCAn6CcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjMzIDB4ZTkgJ+knICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNCAweGVhICfqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGVlLCAvKiAxMTEwMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzUgMHhlYiAn6ycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDNlLCAvKiAwMDExMTExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjM2IDB4ZWMgJ+wnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNyAweGVkICftJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDMsIC8qIDAwMDAwMDExICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweGYzLCAvKiAxMTExMDAxMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzggMHhlZSAn7icgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjM5IDB4ZWYgJ+8nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MCAweGYwICfwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDEgMHhmMSAn8ScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQyIDB4ZjIgJ/InICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MyAweGYzICfzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDQgMHhmNCAn9CcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMjQ1IDB4ZjUgJ/UnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NiAweGY2ICf2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDcgMHhmNyAn9ycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQ4IDB4ZjggJ/gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0OSAweGY5ICf5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNTAgMHhmYSAn+icgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjUxIDB4ZmIgJ/snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweGVjLCAvKiAxMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MiAweGZjICf8JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNTMgMHhmZCAn/ScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjU0IDB4ZmUgJ/4nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1NSAweGZmICf/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisjZW5kaWYKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9jb25zb2xlLmMgYi9ncHhlL3NyYy9jb3JlL2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjJkMjYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9jb25zb2xlLmMKQEAgLTAsMCArMSwxMzAgQEAKKyNpbmNsdWRlICJzdGRkZWYuaCIKKyNpbmNsdWRlICJjb25zb2xlLmgiCisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9uYXAuaD4KKworLyoqIEBmaWxlICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8gZWFjaCBjb25zb2xlIGRldmljZS4KKyAqCisgKiBAdiBjaGFyYWN0ZXIJCUNoYXJhY3RlciB0byBiZSB3cml0dGVuCisgKiBAcmV0IE5vbmUJCS0KKyAqIEBlcnIgTm9uZQkJLQorICoKKyAqIFRoZSBjaGFyYWN0ZXIgaXMgd3JpdHRlbiBvdXQgdG8gYWxsIGVuYWJsZWQgY29uc29sZSBkZXZpY2VzLCB1c2luZworICogZWFjaCBkZXZpY2UncyBjb25zb2xlX2RyaXZlcjo6cHV0Y2hhcigpIG1ldGhvZC4KKyAqCisgKi8KK3ZvaWQgcHV0Y2hhciAoIGludCBjaGFyYWN0ZXIgKSB7CisJc3RydWN0IGNvbnNvbGVfZHJpdmVyICpjb25zb2xlOworCisJLyogQXV0b21hdGljIExGIC0+IENSLExGIHRyYW5zbGF0aW9uICovCisJaWYgKCBjaGFyYWN0ZXIgPT0gJ1xuJyApCisJCXB1dGNoYXIgKCAnXHInICk7CisKKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIGNvbnNvbGUsIENPTlNPTEVTICkgeworCQlpZiAoICggISBjb25zb2xlLT5kaXNhYmxlZCApICYmIGNvbnNvbGUtPnB1dGNoYXIgKQorCQkJY29uc29sZS0+cHV0Y2hhciAoIGNoYXJhY3RlciApOworCX0KK30KKworLyoqCisgKiBDaGVjayB0byBzZWUgaWYgYW55IGlucHV0IGlzIGF2YWlsYWJsZSBvbiBhbnkgY29uc29sZS4KKyAqCisgKiBAdiBOb25lCQktCisgKiBAcmV0IGNvbnNvbGUJCUNvbnNvbGUgZGV2aWNlIHRoYXQgaGFzIGlucHV0IGF2YWlsYWJsZSwgaWYgYW55LgorICogQHJldCBOVUxMCQlObyBjb25zb2xlIGRldmljZSBoYXMgaW5wdXQgYXZhaWxhYmxlLgorICogQGVyciBOb25lCQktCisgKgorICogQWxsIGVuYWJsZWQgY29uc29sZSBkZXZpY2VzIGFyZSBjaGVja2VkIG9uY2UgZm9yIGF2YWlsYWJsZSBpbnB1dAorICogdXNpbmcgZWFjaCBkZXZpY2UncyBjb25zb2xlX2RyaXZlcjo6aXNrZXkoKSBtZXRob2QuICBUaGUgZmlyc3QKKyAqIGNvbnNvbGUgZGV2aWNlIHRoYXQgaGFzIGF2YWlsYWJsZSBpbnB1dCB3aWxsIGJlIHJldHVybmVkLCBpZiBhbnkuCisgKgorICovCitzdGF0aWMgc3RydWN0IGNvbnNvbGVfZHJpdmVyICogaGFzX2lucHV0ICggdm9pZCApIHsKKwlzdHJ1Y3QgY29uc29sZV9kcml2ZXIgKmNvbnNvbGU7CisKKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIGNvbnNvbGUsIENPTlNPTEVTICkgeworCQlpZiAoICggISBjb25zb2xlLT5kaXNhYmxlZCApICYmIGNvbnNvbGUtPmlza2V5ICkgeworCQkJaWYgKCBjb25zb2xlLT5pc2tleSAoKSApCisJCQkJcmV0dXJuIGNvbnNvbGU7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBhbnkgY29uc29sZS4KKyAqCisgKiBAdiBOb25lCQktCisgKiBAcmV0IGNoYXJhY3RlcglDaGFyYWN0ZXIgcmVhZCBmcm9tIGEgY29uc29sZS4KKyAqIEBlcnIgTm9uZQkJLQorICoKKyAqIEEgY2hhcmFjdGVyIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBmaXJzdCBlbmFibGVkIGNvbnNvbGUgZGV2aWNlIHRoYXQKKyAqIGhhcyBpbnB1dCBhdmFpbGFibGUgdXNpbmcgdGhhdCBjb25zb2xlJ3MgY29uc29sZV9kcml2ZXI6OmdldGNoYXIoKQorICogbWV0aG9kLiAgSWYgbm8gY29uc29sZSBoYXMgaW5wdXQgYXZhaWxhYmxlIHRvIGJlIHJlYWQsIHRoaXMgbWV0aG9kCisgKiB3aWxsIGJsb2NrLiAgVG8gcGVyZm9ybSBhIG5vbi1ibG9ja2luZyByZWFkLCB1c2Ugc29tZXRoaW5nIGxpa2UKKyAqCisgKiBAY29kZQorICoKKyAqICAgaW50IGtleSA9IGlza2V5KCkgPyBnZXRjaGFyKCkgOiAtMTsKKyAqCisgKiBAZW5kY29kZQorICoKKyAqIFRoZSBjaGFyYWN0ZXIgcmVhZCB3aWxsIG5vdCBiZSBlY2hvZWQgYmFjayB0byBhbnkgY29uc29sZS4KKyAqCisgKi8KK2ludCBnZXRjaGFyICggdm9pZCApIHsKKwlzdHJ1Y3QgY29uc29sZV9kcml2ZXIgKmNvbnNvbGU7CisJaW50IGNoYXJhY3RlcjsKKworCXdoaWxlICggMSApIHsKKwkJY29uc29sZSA9IGhhc19pbnB1dCgpOworCQlpZiAoIGNvbnNvbGUgJiYgY29uc29sZS0+Z2V0Y2hhciApIHsKKwkJCWNoYXJhY3RlciA9IGNvbnNvbGUtPmdldGNoYXIgKCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIERvemUgZm9yIGEgd2hpbGUgKHVudGlsIHRoZSBuZXh0IGludGVycnVwdCkuICBUaGlzIHdvcmtzCisJCSAqIGZpbmUsIGJlY2F1c2UgdGhlIGtleWJvYXJkIGlzIGludGVycnVwdC1kcml2ZW4sIGFuZCB0aGUKKwkJICogdGltZXIgaW50ZXJydXB0IChhcHByb3guIGV2ZXJ5IDUwbXNlYykgdGFrZXMgY2FyZSBvZiB0aGUKKwkJICogc2VyaWFsIHBvcnQsIHdoaWNoIGlzIHJlYWQgYnkgcG9sbGluZy4gIFRoaXMgcmVkdWNlcyB0aGUKKwkJICogcG93ZXIgZGlzc2lwYXRpb24gb2YgYSBtb2Rlcm4gQ1BVIGNvbnNpZGVyYWJseSwgYW5kIGFsc28KKwkJICogbWFrZXMgRXRoZXJib290IHdhaXRpbmcgZm9yIHVzZXIgaW50ZXJhY3Rpb24gd2FzdGUgYSBsb3QKKwkJICogbGVzcyBDUFUgdGltZSBpbiBhIFZNd2FyZSBzZXNzaW9uLgorCQkgKi8KKwkJY3B1X25hcCgpOworCisJCS8qIEtlZXAgcHJvY2Vzc2luZyBiYWNrZ3JvdW5kIHRhc2tzIHdoaWxlIHdlIHdhaXQgZm9yCisJCSAqIGlucHV0LgorCQkgKi8KKwkJc3RlcCgpOworCX0KKworCS8qIENSIC0+IExGIHRyYW5zbGF0aW9uICovCisJaWYgKCBjaGFyYWN0ZXIgPT0gJ1xyJyApCisJCWNoYXJhY3RlciA9ICdcbic7CisKKwlyZXR1cm4gY2hhcmFjdGVyOworfQorCisvKiogQ2hlY2sgZm9yIGF2YWlsYWJsZSBpbnB1dCBvbiBhbnkgY29uc29sZS4KKyAqCisgKiBAdiBOb25lCQktCisgKiBAcmV0IFRydWUJCUlucHV0IGlzIGF2YWlsYWJsZSBvbiBhIGNvbnNvbGUKKyAqIEByZXQgRmFsc2UJCUlucHV0IGlzIG5vdCBhdmFpbGFibGUgb24gYW55IGNvbnNvbGUKKyAqIEBlcnIgTm9uZQkJLQorICoKKyAqIEFsbCBlbmFibGVkIGNvbnNvbGUgZGV2aWNlcyBhcmUgY2hlY2tlZCBvbmNlIGZvciBhdmFpbGFibGUgaW5wdXQKKyAqIHVzaW5nIGVhY2ggZGV2aWNlJ3MgY29uc29sZV9kcml2ZXI6Omlza2V5KCkgbWV0aG9kLiAgSWYgYW55IGNvbnNvbGUKKyAqIGRldmljZSBoYXMgaW5wdXQgYXZhaWxhYmxlLCB0aGlzIGNhbGwgd2lsbCByZXR1cm4gVHJ1ZS4gIElmIHRoaXMKKyAqIGNhbGwgcmV0dXJucyBUcnVlLCB5b3UgY2FuIHRoZW4gc2FmZWx5IGNhbGwgZ2V0Y2hhcigpIHdpdGhvdXQKKyAqIGJsb2NraW5nLgorICoKKyAqLworaW50IGlza2V5ICggdm9pZCApIHsKKwlyZXR1cm4gaGFzX2lucHV0KCkgPyAxIDogMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvY3Bpby5jIGIvZ3B4ZS9zcmMvY29yZS9jcGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwM2ZhMwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvY3Bpby5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKiBAZmlsZQorICoKKyAqIENQSU8gYXJjaGl2ZXMKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3B4ZS9jcGlvLmg+CisKKy8qKgorICogU2V0IGZpZWxkIHdpdGhpbiBhIENQSU8gaGVhZGVyCisgKgorICogQHYgZmllbGQJCUZpZWxkIHdpdGhpbiBDUElPIGhlYWRlcgorICogQHYgdmFsdWUJCVZhbHVlIHRvIHNldAorICovCit2b2lkIGNwaW9fc2V0X2ZpZWxkICggY2hhciAqZmllbGQsIHVuc2lnbmVkIGxvbmcgdmFsdWUgKSB7CisJY2hhciBidWZbOV07CisKKwlzbnByaW50ZiAoIGJ1Ziwgc2l6ZW9mICggYnVmICksICIlMDhseCIsIHZhbHVlICk7CisJbWVtY3B5ICggZmllbGQsIGJ1ZiwgOCApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9jdHlwZS5jIGIvZ3B4ZS9zcmMvY29yZS9jdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODViYjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2N0eXBlLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZmlsZQorICoKKyAqIENoYXJhY3RlciB0eXBlcworICoKKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLyoqCisgKiBDaGVjayB0byBzZWUgaWYgY2hhcmFjdGVyIGlzIGEgc3BhY2UKKyAqCisgKiBAdiBjCQkJQ2hhcmFjdGVyCisgKiBAcmV0IGlzc3BhY2UJCUNoYXJhY3RlciBpcyBhIHNwYWNlCisgKi8KK2ludCBpc3NwYWNlICggaW50IGMgKSB7CisJc3dpdGNoICggYyApIHsKKwljYXNlICcgJyA6CisJY2FzZSAnXGYnIDoKKwljYXNlICdcbicgOgorCWNhc2UgJ1xyJyA6CisJY2FzZSAnXHQnIDoKKwljYXNlICdcdicgOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2N3dXJpLmMgYi9ncHhlL3NyYy9jb3JlL2N3dXJpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlMDFiMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvY3d1cmkuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8Z3B4ZS91cmkuaD4KKworLyoqIEBmaWxlCisgKgorICogQ3VycmVudCB3b3JraW5nIFVSSQorICoKKyAqIFNvbWV3aGF0IGFuYWxvZ291cyB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpbiBhIFBPU0lYCisgKiBzeXN0ZW0uCisgKi8KKworLyoqIEN1cnJlbnQgd29ya2luZyBVUkkgKi8KK3N0cnVjdCB1cmkgKmN3dXJpID0gTlVMTDsKKworLyoqCisgKiBDaGFuZ2Ugd29ya2luZyBVUkkKKyAqCisgKiBAdiB1cmkJCU5ldyB3b3JraW5nIFVSSSwgb3IgTlVMTAorICovCit2b2lkIGNodXJpICggc3RydWN0IHVyaSAqdXJpICkgeworCXN0cnVjdCB1cmkgKm5ld191cmk7CisKKwluZXdfdXJpID0gcmVzb2x2ZV91cmkgKCBjd3VyaSwgdXJpICk7CisJdXJpX3B1dCAoIGN3dXJpICk7CisJY3d1cmkgPSBuZXdfdXJpOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9kZWJ1Zy5jIGIvZ3B4ZS9zcmMvY29yZS9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTI5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2RlYnVnLmMKQEAgLTAsMCArMSwxOTYgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisKK3ZvaWQgcGF1c2UgKCB2b2lkICkgeworCXByaW50ZiAoICJcblByZXNzIGEga2V5IiApOworCWdldGNoYXIoKTsKKwlwcmludGYgKCAiXHIgICAgICAgICAgIFxyIiApOworfQorCit2b2lkIG1vcmUgKCB2b2lkICkgeworCXByaW50ZiAoICItLS1tb3JlLS0tIiApOworCWdldGNoYXIoKTsKKwlwcmludGYgKCAiXHIgICAgICAgICAgXHIiICk7Cit9CisKKy8qKgorICogUHJpbnQgcm93IG9mIGEgaGV4IGR1bXAgd2l0aCBzcGVjaWZpZWQgZGlzcGxheSBhZGRyZXNzCisgKgorICogQHYgZGlzcGFkZHIJCURpc3BsYXkgYWRkcmVzcworICogQHYgZGF0YQkJRGF0YSB0byBwcmludAorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YQorICogQHYgb2Zmc2V0CQlTdGFydGluZyBvZmZzZXQgd2l0aGluIGRhdGEKKyAqLworc3RhdGljIHZvaWQgZGJnX2hleF9kdW1wX2RhX3JvdyAoIHVuc2lnbmVkIGxvbmcgZGlzcGFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgaW50IG9mZnNldCApIHsKKwljb25zdCB1aW50OF90ICpieXRlcyA9IGRhdGE7CisJdW5zaWduZWQgaW50IGk7CisJdWludDhfdCBieXRlOworCisJcHJpbnRmICggIiUwOGx4IDoiLCAoIGRpc3BhZGRyICsgb2Zmc2V0ICkgKTsKKwlmb3IgKCBpID0gb2Zmc2V0IDsgaSA8ICggb2Zmc2V0ICsgMTYgKSA7IGkrKyApIHsKKwkJaWYgKCBpID49IGxlbiApIHsKKwkJCXByaW50ZiAoICIgICAiICk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYgKCAiJWMlMDJ4IiwKKwkJCSAoICggKCBpICUgMTYgKSA9PSA4ICkgPyAnLScgOiAnICcgKSwgYnl0ZXNbaV0gKTsKKwl9CisJcHJpbnRmICggIiA6ICIgKTsKKwlmb3IgKCBpID0gb2Zmc2V0IDsgaSA8ICggb2Zmc2V0ICsgMTYgKSA7IGkrKyApIHsKKwkJaWYgKCBpID49IGxlbiApIHsKKwkJCXByaW50ZiAoICIgIiApOworCQkJY29udGludWU7CisJCX0KKwkJYnl0ZSA9IGJ5dGVzW2ldOworCQlpZiAoICggYnl0ZSA8IDB4MjAgKSB8fCAoIGJ5dGUgPj0gMHg3ZiApICkKKwkJCWJ5dGUgPSAnLic7CisJCXByaW50ZiAoICIlYyIsIGJ5dGUgKTsKKwl9CisJcHJpbnRmICggIlxuIiApOworfQorCisvKioKKyAqIFByaW50IGhleCBkdW1wIHdpdGggc3BlY2lmaWVkIGRpc3BsYXkgYWRkcmVzcworICoKKyAqIEB2IGRpc3BhZGRyCQlEaXNwbGF5IGFkZHJlc3MKKyAqIEB2IGRhdGEJCURhdGEgdG8gcHJpbnQKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEKKyAqLwordm9pZCBkYmdfaGV4X2R1bXBfZGEgKCB1bnNpZ25lZCBsb25nIGRpc3BhZGRyLCBjb25zdCB2b2lkICpkYXRhLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBsZW4gKSB7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCWZvciAoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBsZW4gOyBvZmZzZXQgKz0gMTYgKSB7CisJCWRiZ19oZXhfZHVtcF9kYV9yb3cgKCBkaXNwYWRkciwgZGF0YSwgbGVuLCBvZmZzZXQgKTsKKwl9Cit9CisKKyNkZWZpbmUgR1VBUkRfU1lNQk9MICggKCAnTScgPDwgMjQgKSB8ICggJ0knIDw8IDE2ICkgfCAoICdOJyA8PCA4ICkgfCAnRScgKQorLyogRmlsbCBhIHJlZ2lvbiB3aXRoIGd1YXJkIG1hcmtlcnMuICBXZSB1c2UgYSA0LWJ5dGUgcGF0dGVybiB0byBtYWtlCisgKiBpdCBsZXNzIGxpa2VseSB0aGF0IGNoZWNrX3JlZ2lvbiB3aWxsIGZpbmQgc3B1cmlvdXMgMS1ieXRlIHJlZ2lvbnMKKyAqIG9mIG5vbi1jb3JydXB0aW9uLgorICovCit2b2lkIGd1YXJkX3JlZ2lvbiAoIHZvaWQgKnJlZ2lvbiwgc2l6ZV90IGxlbiApIHsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCisJbGVuICY9IH4weDAzOworCWZvciAoIG9mZnNldCA9IDA7IG9mZnNldCA8IGxlbiA7IG9mZnNldCArPSA0ICkgeworCQkqKCh1aW50MzJfdCAqKShyZWdpb24gKyBvZmZzZXQpKSA9IEdVQVJEX1NZTUJPTDsKKwl9Cit9CisKKy8qIENoZWNrIGEgcmVnaW9uIHRoYXQgaGFzIGJlZW4gZ3VhcmRlZCB3aXRoIGd1YXJkX3JlZ2lvbigpIGZvcgorICogY29ycnVwdGlvbi4KKyAqLworaW50IGNoZWNrX3JlZ2lvbiAoIHZvaWQgKnJlZ2lvbiwgc2l6ZV90IGxlbiApIHsKKwl1aW50OF90IGNvcnJ1cHRlZCA9IDA7CisJdWludDhfdCBpbl9jb3JydXB0aW9uID0gMDsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCXVpbnQzMl90IHRlc3QgPSAwOworCisJbGVuICY9IH4weDAzOworCWZvciAoIG9mZnNldCA9IDA7IG9mZnNldCA8IGxlbiA7IG9mZnNldCArPSA0ICkgeworCQl0ZXN0ID0gKigodWludDMyX3QgKikocmVnaW9uICsgb2Zmc2V0KSkgPSBHVUFSRF9TWU1CT0w7CisJCWlmICggKCBpbl9jb3JydXB0aW9uID09IDAgKSAmJgorCQkgICAgICggdGVzdCAhPSBHVUFSRF9TWU1CT0wgKSApIHsKKwkJCS8qIFN0YXJ0IG9mIGNvcnJ1cHRpb24gKi8KKwkJCWlmICggY29ycnVwdGVkID09IDAgKSB7CisJCQkJY29ycnVwdGVkID0gMTsKKwkJCQlwcmludGYgKCAiUmVnaW9uICVwLSVwIChwaHlzaWNhbCAlI2x4LSUjbHgpICIKKwkJCQkJICJjb3JydXB0ZWRcbiIsCisJCQkJCSByZWdpb24sIHJlZ2lvbiArIGxlbiwKKwkJCQkJIHZpcnRfdG9fcGh5cyAoIHJlZ2lvbiApLAorCQkJCQkgdmlydF90b19waHlzICggcmVnaW9uICsgbGVuICkgKTsKKwkJCX0KKwkJCWluX2NvcnJ1cHRpb24gPSAxOworCQkJcHJpbnRmICggIi0tLSBvZmZzZXQgJSN4ICIsIG9mZnNldCApOworCQl9IGVsc2UgaWYgKCAoIGluX2NvcnJ1cHRpb24gIT0gMCApICYmCisJCQkgICAgKCB0ZXN0ID09IEdVQVJEX1NZTUJPTCApICkgeworCQkJLyogRW5kIG9mIGNvcnJ1cHRpb24gKi8KKwkJCWluX2NvcnJ1cHRpb24gPSAwOworCQkJcHJpbnRmICggInRvIG9mZnNldCAlI3giLCBvZmZzZXQgKTsKKwkJfQorCisJfQorCWlmICggaW5fY29ycnVwdGlvbiAhPSAwICkgeworCQlwcmludGYgKCAidG8gb2Zmc2V0ICUjenggKGVuZCBvZiByZWdpb24pXG4iLCBsZW4tMSApOworCX0KKwlyZXR1cm4gY29ycnVwdGVkOworfQorCisvKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIHNlcGFyYXRlbHkgY29sb3VyZWQgbWVzc2FnZSBzdHJlYW1zCisgKgorICogU2l4IGlzIHRoZSByZWFsaXN0aWMgbWF4aW11bTsgdGhlcmUgYXJlIDggYmFzaWMgQU5TSSBjb2xvdXJzLCBvbmUKKyAqIG9mIHdoaWNoIHdpbGwgYmUgdGhlIHRlcm1pbmFsIGRlZmF1bHQgYW5kIG9uZSBvZiB3aGljaCB3aWxsIGJlCisgKiBpbnZpc2libGUgb24gdGhlIHRlcm1pbmFsIGJlY2F1c2UgaXQgbWF0Y2hlcyB0aGUgYmFja2dyb3VuZCBjb2xvdXIuCisgKi8KKyNkZWZpbmUgTlVNX0FVVE9fQ09MT1VSUyA2CisKKy8qKiBBIGNvbG91ciBhc3NpZ25lZCB0byBhbiBhdXRvY29sb3VyaXNlZCBkZWJ1ZyBtZXNzYWdlIHN0cmVhbSAqLworc3RydWN0IGF1dG9jb2xvdXIgeworCS8qKiBNZXNzYWdlIHN0cmVhbSBJRCAqLworCXVuc2lnbmVkIGxvbmcgc3RyZWFtOworCS8qKiBMYXN0IHJlY29yZGVkIHVzYWdlICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VzZWQ7Cit9OworCisvKioKKyAqIENob29zZSBjb2xvdXIgaW5kZXggZm9yIGRlYnVnIGF1dG9jb2xvdXJpc2F0aW9uCisgKgorICogQHYgc3RyZWFtCQlNZXNzYWdlIHN0cmVhbSBJRAorICogQHJldCBjb2xvdXIJCUNvbG91ciBJRAorICovCitzdGF0aWMgaW50IGRiZ19hdXRvY29sb3VyICggdW5zaWduZWQgbG9uZyBzdHJlYW0gKSB7CisJc3RhdGljIHN0cnVjdCBhdXRvY29sb3VyIGFjc1tOVU1fQVVUT19DT0xPVVJTXTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyB1c2U7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IG9sZGVzdDsKKwl1bnNpZ25lZCBpbnQgb2xkZXN0X2xhc3RfdXNlZDsKKworCS8qIEluY3JlbWVudCB1c2FnZSBpdGVyYXRpb24gY291bnRlciAqLworCXVzZSsrOworCisJLyogU2NhbiB0aHJvdWdoIGxpc3QgZm9yIGEgY3VycmVudGx5IGFzc2lnbmVkIGNvbG91ciAqLworCWZvciAoIGkgPSAwIDsgaSA8ICggc2l6ZW9mICggYWNzICkgLyBzaXplb2YgKCBhY3NbMF0gKSApIDsgaSsrICkgeworCQlpZiAoIGFjc1tpXS5zdHJlYW0gPT0gc3RyZWFtICkgeworCQkJYWNzW2ldLmxhc3RfdXNlZCA9IHVzZTsKKwkJCXJldHVybiBpOworCQl9CisJfQorCisJLyogTm8gY29sb3VyIGZvdW5kOyBldmljdCB0aGUgb2xkZXN0IGZyb20gdGhlIGxpc3QgKi8KKwlvbGRlc3QgPSAwOworCW9sZGVzdF9sYXN0X3VzZWQgPSB1c2U7CisJZm9yICggaSA9IDAgOyBpIDwgKCBzaXplb2YgKCBhY3MgKSAvIHNpemVvZiAoIGFjc1swXSApICkgOyBpKysgKSB7CisJCWlmICggYWNzW2ldLmxhc3RfdXNlZCA8IG9sZGVzdF9sYXN0X3VzZWQgKSB7CisJCQlvbGRlc3RfbGFzdF91c2VkID0gYWNzW2ldLmxhc3RfdXNlZDsKKwkJCW9sZGVzdCA9IGk7CisJCX0KKwl9CisJYWNzW29sZGVzdF0uc3RyZWFtID0gc3RyZWFtOworCWFjc1tvbGRlc3RdLmxhc3RfdXNlZCA9IHVzZTsKKwlyZXR1cm4gb2xkZXN0OworfQorCisvKioKKyAqIFNlbGVjdCBhdXRvbWF0aWMgY29sb3VyIGZvciBkZWJ1ZyBtZXNzYWdlcworICoKKyAqIEB2IHN0cmVhbQkJTWVzc2FnZSBzdHJlYW0gSUQKKyAqLwordm9pZCBkYmdfYXV0b2NvbG91cmlzZSAoIHVuc2lnbmVkIGxvbmcgc3RyZWFtICkgeworCXByaW50ZiAoICJcMDMzWyVkbSIsCisJCSAoIHN0cmVhbSA/ICggMzEgKyBkYmdfYXV0b2NvbG91ciAoIHN0cmVhbSApICkgOiAwICkgKTsKK30KKworLyoqCisgKiBSZXZlcnQgdG8gbm9ybWFsIGNvbG91cgorICoKKyAqLwordm9pZCBkYmdfZGVjb2xvdXJpc2UgKCB2b2lkICkgeworCXByaW50ZiAoICJcMDMzWzBtIiApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9kZXZpY2UuYyBiL2dweGUvc3JjL2NvcmUvZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjY2M5ZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvZGV2aWNlLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbml0Lmg+CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBEZXZpY2UgbW9kZWwKKyAqCisgKi8KKworLyoqIFJlZ2lzdGVyZWQgcm9vdCBkZXZpY2VzICovCitzdGF0aWMgTElTVF9IRUFEICggZGV2aWNlcyApOworCisvKioKKyAqIFByb2JlIGEgcm9vdCBkZXZpY2UKKyAqCisgKiBAdiByb290ZGV2CQlSb290IGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcm9vdGRldl9wcm9iZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApIHsKKwlpbnQgcmM7CisKKwlEQkcgKCAiQWRkaW5nICVzIHJvb3QgYnVzXG4iLCByb290ZGV2LT5kZXYubmFtZSApOworCWlmICggKCByYyA9IHJvb3RkZXYtPmRyaXZlci0+cHJvYmUgKCByb290ZGV2ICkgKSAhPSAwICkgeworCQlEQkcgKCAiRmFpbGVkIHRvIGFkZCAlcyByb290IGJ1czogJXNcbiIsCisJCSAgICAgIHJvb3RkZXYtPmRldi5uYW1lLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlbW92ZSBhIHJvb3QgZGV2aWNlCisgKgorICogQHYgcm9vdGRldgkJUm9vdCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgcm9vdGRldl9yZW1vdmUgKCBzdHJ1Y3Qgcm9vdF9kZXZpY2UgKnJvb3RkZXYgKSB7CisJcm9vdGRldi0+ZHJpdmVyLT5yZW1vdmUgKCByb290ZGV2ICk7CisJREJHICggIlJlbW92ZWQgJXMgcm9vdCBidXNcbiIsIHJvb3RkZXYtPmRldi5uYW1lICk7Cit9CisKKy8qKgorICogUHJvYmUgYWxsIGRldmljZXMKKyAqCisgKiBUaGlzIGluaXRpYXRlcyBwcm9iaW5nIGZvciBhbGwgZGV2aWNlcyBpbiB0aGUgc3lzdGVtLiAgQWZ0ZXIgdGhpcworICogY2FsbCwgdGhlIGRldmljZSBoaWVyYXJjaHkgd2lsbCBiZSBwb3B1bGF0ZWQsIGFuZCBhbGwgaGFyZHdhcmUKKyAqIHNob3VsZCBiZSByZWFkeSB0byB1c2UuCisgKi8KK3N0YXRpYyB2b2lkIHByb2JlX2RldmljZXMgKCB2b2lkICkgeworCXN0cnVjdCByb290X2RldmljZSAqcm9vdGRldjsKKwlpbnQgcmM7CisKKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIHJvb3RkZXYsIFJPT1RfREVWSUNFUyApIHsKKwkJbGlzdF9hZGQgKCAmcm9vdGRldi0+ZGV2LnNpYmxpbmdzLCAmZGV2aWNlcyApOworCQlJTklUX0xJU1RfSEVBRCAoICZyb290ZGV2LT5kZXYuY2hpbGRyZW4gKTsKKwkJaWYgKCAoIHJjID0gcm9vdGRldl9wcm9iZSAoIHJvb3RkZXYgKSApICE9IDAgKQorCQkJbGlzdF9kZWwgKCAmcm9vdGRldi0+ZGV2LnNpYmxpbmdzICk7CisJfQorfQorCisvKioKKyAqIFJlbW92ZSBhbGwgZGV2aWNlcworICoKKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2RldmljZXMgKCBpbnQgZmxhZ3MgKSB7CisJc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2OworCXN0cnVjdCByb290X2RldmljZSAqdG1wOworCisJaWYgKCBmbGFncyAmIFNIVVRET1dOX0tFRVBfREVWSUNFUyApIHsKKwkJREJHICggIlJlZnVzaW5nIHRvIHJlbW92ZSBkZXZpY2VzIG9uIHNodXRkb3duXG4iICk7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKCByb290ZGV2LCB0bXAsICZkZXZpY2VzLCBkZXYuc2libGluZ3MgKSB7CisJCXJvb3RkZXZfcmVtb3ZlICggcm9vdGRldiApOworCQlsaXN0X2RlbCAoICZyb290ZGV2LT5kZXYuc2libGluZ3MgKTsKKwl9Cit9CisKK3N0cnVjdCBzdGFydHVwX2ZuIHN0YXJ0dXBfZGV2aWNlcyBfX3N0YXJ0dXBfZm4gKCBTVEFSVFVQX05PUk1BTCApID0geworCS5zdGFydHVwID0gcHJvYmVfZGV2aWNlcywKKwkuc2h1dGRvd24gPSByZW1vdmVfZGV2aWNlcywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2Rvd25sb2FkZXIuYyBiL2dweGUvc3JjL2NvcmUvZG93bmxvYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzE0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2Rvd25sb2FkZXIuYwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisjaW5jbHVkZSA8Z3B4ZS9qb2IuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3VtYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL2ltYWdlLmg+CisjaW5jbHVkZSA8Z3B4ZS9kb3dubG9hZGVyLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEltYWdlIGRvd25sb2FkZXIKKyAqCisgKi8KKworLyoqIEEgZG93bmxvYWRlciAqLworc3RydWN0IGRvd25sb2FkZXIgeworCS8qKiBSZWZlcmVuY2UgY291bnQgZm9yIHRoaXMgb2JqZWN0ICovCisJc3RydWN0IHJlZmNudCByZWZjbnQ7CisKKwkvKiogSm9iIGNvbnRyb2wgaW50ZXJmYWNlICovCisJc3RydWN0IGpvYl9pbnRlcmZhY2Ugam9iOworCS8qKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZSAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSB4ZmVyOworCisJLyoqIEltYWdlIHRvIGNvbnRhaW4gZG93bmxvYWRlZCBmaWxlICovCisJc3RydWN0IGltYWdlICppbWFnZTsKKwkvKiogQ3VycmVudCBwb3NpdGlvbiB3aXRoaW4gaW1hZ2UgYnVmZmVyICovCisJc2l6ZV90IHBvczsKKwkvKiogSW1hZ2UgcmVnaXN0cmF0aW9uIHJvdXRpbmUgKi8KKwlpbnQgKCAqIHJlZ2lzdGVyX2ltYWdlICkgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICk7Cit9OworCisvKioKKyAqIEZyZWUgZG93bmxvYWRlciBvYmplY3QKKyAqCisgKiBAdiByZWZjbnQJCURvd25sb2FkZXIgcmVmZXJlbmNlIGNvdW50ZXIKKyAqLworc3RhdGljIHZvaWQgZG93bmxvYWRlcl9mcmVlICggc3RydWN0IHJlZmNudCAqcmVmY250ICkgeworCXN0cnVjdCBkb3dubG9hZGVyICpkb3dubG9hZGVyID0KKwkJY29udGFpbmVyX29mICggcmVmY250LCBzdHJ1Y3QgZG93bmxvYWRlciwgcmVmY250ICk7CisKKwlpbWFnZV9wdXQgKCBkb3dubG9hZGVyLT5pbWFnZSApOworCWZyZWUgKCBkb3dubG9hZGVyICk7Cit9CisKKy8qKgorICogVGVybWluYXRlIGRvd25sb2FkCisgKgorICogQHYgZG93bmxvYWRlcglEb3dubG9hZGVyCisgKiBAdiByYwkJUmVhc29uIGZvciB0ZXJtaW5hdGlvbgorICovCitzdGF0aWMgdm9pZCBkb3dubG9hZGVyX2ZpbmlzaGVkICggc3RydWN0IGRvd25sb2FkZXIgKmRvd25sb2FkZXIsIGludCByYyApIHsKKworCS8qIEJsb2NrIGZ1cnRoZXIgaW5jb21pbmcgbWVzc2FnZXMgKi8KKwlqb2JfbnVsbGlmeSAoICZkb3dubG9hZGVyLT5qb2IgKTsKKwl4ZmVyX251bGxpZnkgKCAmZG93bmxvYWRlci0+eGZlciApOworCisJLyogRnJlZSByZXNvdXJjZXMgYW5kIGNsb3NlIGludGVyZmFjZXMgKi8KKwl4ZmVyX2Nsb3NlICggJmRvd25sb2FkZXItPnhmZXIsIHJjICk7CisJam9iX2RvbmUgKCAmZG93bmxvYWRlci0+am9iLCByYyApOworfQorCisvKioKKyAqIEVuc3VyZSB0aGF0IGRvd25sb2FkIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggZm9yIHRoZSBzcGVjaWZpZWQgc2l6ZQorICoKKyAqIEB2IGRvd25sb2FkZXIJRG93bmxvYWRlcgorICogQHYgbGVuCQlSZXF1aXJlZCBtaW5pbXVtIHNpemUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGRvd25sb2FkZXJfZW5zdXJlX3NpemUgKCBzdHJ1Y3QgZG93bmxvYWRlciAqZG93bmxvYWRlciwKKwkJCQkgICAgc2l6ZV90IGxlbiApIHsKKwl1c2VycHRyX3QgbmV3X2J1ZmZlcjsKKworCS8qIElmIGJ1ZmZlciBpcyBhbHJlYWR5IGxhcmdlIGVub3VnaCwgZG8gbm90aGluZyAqLworCWlmICggbGVuIDw9IGRvd25sb2FkZXItPmltYWdlLT5sZW4gKQorCQlyZXR1cm4gMDsKKworCURCR0MgKCBkb3dubG9hZGVyLCAiRG93bmxvYWRlciAlcCBleHRlbmRpbmcgdG8gJXpkIGJ5dGVzXG4iLAorCSAgICAgICBkb3dubG9hZGVyLCBsZW4gKTsKKworCS8qIEV4dGVuZCBidWZmZXIgKi8KKwluZXdfYnVmZmVyID0gdXJlYWxsb2MgKCBkb3dubG9hZGVyLT5pbWFnZS0+ZGF0YSwgbGVuICk7CisJaWYgKCAhIG5ld19idWZmZXIgKSB7CisJCURCR0MgKCBkb3dubG9hZGVyLCAiRG93bmxvYWRlciAlcCBjb3VsZCBub3QgZXh0ZW5kIGJ1ZmZlciB0byAiCisJCSAgICAgICAiJXpkIGJ5dGVzXG4iLCBkb3dubG9hZGVyLCBsZW4gKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwlkb3dubG9hZGVyLT5pbWFnZS0+ZGF0YSA9IG5ld19idWZmZXI7CisJZG93bmxvYWRlci0+aW1hZ2UtPmxlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEpvYiBjb250cm9sIGludGVyZmFjZQorICoKKyAqLworCisvKioKKyAqIEhhbmRsZSBraWxsKCkgZXZlbnQgcmVjZWl2ZWQgdmlhIGpvYiBjb250cm9sIGludGVyZmFjZQorICoKKyAqIEB2IGpvYgkJRG93bmxvYWRlciBqb2IgY29udHJvbCBpbnRlcmZhY2UKKyAqLworc3RhdGljIHZvaWQgZG93bmxvYWRlcl9qb2Jfa2lsbCAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IgKSB7CisJc3RydWN0IGRvd25sb2FkZXIgKmRvd25sb2FkZXIgPQorCQljb250YWluZXJfb2YgKCBqb2IsIHN0cnVjdCBkb3dubG9hZGVyLCBqb2IgKTsKKworCS8qIFRlcm1pbmF0ZSBkb3dubG9hZCAqLworCWRvd25sb2FkZXJfZmluaXNoZWQgKCBkb3dubG9hZGVyLCAtRUNBTkNFTEVEICk7Cit9CisKKy8qKgorICogUmVwb3J0IHByb2dyZXNzIG9mIGRvd25sb2FkIGpvYgorICoKKyAqIEB2IGpvYgkJRG93bmxvYWRlciBqb2IgY29udHJvbCBpbnRlcmZhY2UKKyAqIEB2IHByb2dyZXNzCQlQcm9ncmVzcyByZXBvcnQgdG8gZmlsbCBpbgorICovCitzdGF0aWMgdm9pZCBkb3dubG9hZGVyX2pvYl9wcm9ncmVzcyAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IsCisJCQkJICAgICAgc3RydWN0IGpvYl9wcm9ncmVzcyAqcHJvZ3Jlc3MgKSB7CisJc3RydWN0IGRvd25sb2FkZXIgKmRvd25sb2FkZXIgPQorCQljb250YWluZXJfb2YgKCBqb2IsIHN0cnVjdCBkb3dubG9hZGVyLCBqb2IgKTsKKworCS8qIFRoaXMgaXMgbm90IGVudGlyZWx5IGFjY3VyYXRlLCBzaW5jZSBkb3dubG9hZGVkIGRhdGEgbWF5CisJICogYXJyaXZlIG91dCBvZiBvcmRlciAoZS5nLiB3aXRoIG11bHRpY2FzdCBwcm90b2NvbHMpLCBidXQKKwkgKiBpdCdzIGEgcmVhc29uYWJsZSBmaXJzdCBhcHByb3hpbWF0aW9uLgorCSAqLworCXByb2dyZXNzLT5jb21wbGV0ZWQgPSBkb3dubG9hZGVyLT5wb3M7CisJcHJvZ3Jlc3MtPnRvdGFsID0gZG93bmxvYWRlci0+aW1hZ2UtPmxlbjsKK30KKworLyoqIERvd25sb2FkZXIgam9iIGNvbnRyb2wgaW50ZXJmYWNlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgam9iX2ludGVyZmFjZV9vcGVyYXRpb25zIGRvd25sb2FkZXJfam9iX29wZXJhdGlvbnMgPSB7CisJLmRvbmUJCT0gaWdub3JlX2pvYl9kb25lLAorCS5raWxsCQk9IGRvd25sb2FkZXJfam9iX2tpbGwsCisJLnByb2dyZXNzCT0gZG93bmxvYWRlcl9qb2JfcHJvZ3Jlc3MsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKgorICovCisKKy8qKgorICogSGFuZGxlIGRlbGl2ZXJfcmF3KCkgZXZlbnQgcmVjZWl2ZWQgdmlhIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKgorICogQHYgeGZlcgkJRG93bmxvYWRlciBkYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgaW9idWYJCURhdGFncmFtIEkvTyBidWZmZXIKKyAqIEB2IG1ldGEJCURhdGEgdHJhbnNmZXIgbWV0YWRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGRvd25sb2FkZXJfeGZlcl9kZWxpdmVyX2lvYiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCQkJIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJCQkgc3RydWN0IHhmZXJfbWV0YWRhdGEgKm1ldGEgKSB7CisJc3RydWN0IGRvd25sb2FkZXIgKmRvd25sb2FkZXIgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgZG93bmxvYWRlciwgeGZlciApOworCXNpemVfdCBsZW47CisJc2l6ZV90IG1heDsKKwlpbnQgcmM7CisKKwkvKiBDYWxjdWxhdGUgbmV3IGJ1ZmZlciBwb3NpdGlvbiAqLworCWlmICggbWV0YS0+d2hlbmNlICE9IFNFRUtfQ1VSICkKKwkJZG93bmxvYWRlci0+cG9zID0gMDsKKwlkb3dubG9hZGVyLT5wb3MgKz0gbWV0YS0+b2Zmc2V0OworCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIHNwYWNlIGZvciB0aGlzIGRhdGEgKi8KKwlsZW4gPSBpb2JfbGVuICggaW9idWYgKTsKKwltYXggPSAoIGRvd25sb2FkZXItPnBvcyArIGxlbiApOworCWlmICggKCByYyA9IGRvd25sb2FkZXJfZW5zdXJlX3NpemUgKCBkb3dubG9hZGVyLCBtYXggKSApICE9IDAgKQorCQlnb3RvIGRvbmU7CisKKwkvKiBDb3B5IGRhdGEgdG8gYnVmZmVyICovCisJY29weV90b191c2VyICggZG93bmxvYWRlci0+aW1hZ2UtPmRhdGEsIGRvd25sb2FkZXItPnBvcywKKwkJICAgICAgIGlvYnVmLT5kYXRhLCBsZW4gKTsKKworCS8qIFVwZGF0ZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbiAqLworCWRvd25sb2FkZXItPnBvcyArPSBsZW47CisKKyBkb25lOgorCWZyZWVfaW9iICggaW9idWYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogSGFuZGxlIGNsb3NlKCkgZXZlbnQgcmVjZWl2ZWQgdmlhIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKgorICogQHYgeGZlcgkJRG93bmxvYWRlciBkYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgcmMJCVJlYXNvbiBmb3IgY2xvc2UKKyAqLworc3RhdGljIHZvaWQgZG93bmxvYWRlcl94ZmVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKSB7CisJc3RydWN0IGRvd25sb2FkZXIgKmRvd25sb2FkZXIgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgZG93bmxvYWRlciwgeGZlciApOworCisJLyogUmVnaXN0ZXIgaW1hZ2UgaWYgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgKi8KKwlpZiAoIHJjID09IDAgKQorCQlyYyA9IGRvd25sb2FkZXItPnJlZ2lzdGVyX2ltYWdlICggZG93bmxvYWRlci0+aW1hZ2UgKTsKKworCS8qIFRlcm1pbmF0ZSBkb3dubG9hZCAqLworCWRvd25sb2FkZXJfZmluaXNoZWQgKCBkb3dubG9hZGVyLCByYyApOworfQorCisvKiogRG93bmxvYWRlciBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgZG93bmxvYWRlcl94ZmVyX29wZXJhdGlvbnMgPSB7CisJLmNsb3NlCQk9IGRvd25sb2FkZXJfeGZlcl9jbG9zZSwKKwkudnJlZGlyZWN0CT0geGZlcl92cmVvcGVuLAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IGRvd25sb2FkZXJfeGZlcl9kZWxpdmVyX2lvYiwKKwkuZGVsaXZlcl9yYXcJPSB4ZmVyX2RlbGl2ZXJfYXNfaW9iLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbnN0YW50aWF0b3IKKyAqCisgKi8KKworLyoqCisgKiBJbnN0YW50aWF0ZSBhIGRvd25sb2FkZXIKKyAqCisgKiBAdiBqb2IJCUpvYiBjb250cm9sIGludGVyZmFjZQorICogQHYgaW1hZ2UJCUltYWdlIHRvIGZpbGwgd2l0aCBkb3dubG9hZGVkIGZpbGUKKyAqIEB2IHJlZ2lzdGVyX2ltYWdlCUltYWdlIHJlZ2lzdHJhdGlvbiByb3V0aW5lCisgKiBAdiB0eXBlCQlMb2NhdGlvbiB0eXBlIHRvIHBhc3MgdG8geGZlcl9vcGVuKCkKKyAqIEB2IC4uLgkJUmVtYWluaW5nIGFyZ3VtZW50cyB0byBwYXNzIHRvIHhmZXJfb3BlbigpCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBJbnN0YW50aWF0ZXMgYSBkb3dubG9hZGVyIG9iamVjdCB0byBkb3dubG9hZCB0aGUgc3BlY2lmaWVkIFVSSSBpbnRvCisgKiB0aGUgc3BlY2lmaWVkIGltYWdlIG9iamVjdC4gIElmIHRoZSBkb3dubG9hZCBpcyBzdWNjZXNzZnVsLCB0aGUKKyAqIGltYWdlIHJlZ2lzdHJhdGlvbiByb3V0aW5lIEBjIHJlZ2lzdGVyX2ltYWdlKCkgd2lsbCBiZSBjYWxsZWQuCisgKi8KK2ludCBjcmVhdGVfZG93bmxvYWRlciAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IsIHN0cnVjdCBpbWFnZSAqaW1hZ2UsCisJCQlpbnQgKCAqIHJlZ2lzdGVyX2ltYWdlICkgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICksCisJCQlpbnQgdHlwZSwgLi4uICkgeworCXN0cnVjdCBkb3dubG9hZGVyICpkb3dubG9hZGVyOworCXZhX2xpc3QgYXJnczsKKwlpbnQgcmM7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBzdHJ1Y3R1cmUgKi8KKwlkb3dubG9hZGVyID0gemFsbG9jICggc2l6ZW9mICggKmRvd25sb2FkZXIgKSApOworCWlmICggISBkb3dubG9hZGVyICkKKwkJcmV0dXJuIC1FTk9NRU07CisJZG93bmxvYWRlci0+cmVmY250LmZyZWUgPSBkb3dubG9hZGVyX2ZyZWU7CisJam9iX2luaXQgKCAmZG93bmxvYWRlci0+am9iLCAmZG93bmxvYWRlcl9qb2Jfb3BlcmF0aW9ucywKKwkJICAgJmRvd25sb2FkZXItPnJlZmNudCApOworCXhmZXJfaW5pdCAoICZkb3dubG9hZGVyLT54ZmVyLCAmZG93bmxvYWRlcl94ZmVyX29wZXJhdGlvbnMsCisJCSAgICAmZG93bmxvYWRlci0+cmVmY250ICk7CisJZG93bmxvYWRlci0+aW1hZ2UgPSBpbWFnZV9nZXQgKCBpbWFnZSApOworCWRvd25sb2FkZXItPnJlZ2lzdGVyX2ltYWdlID0gcmVnaXN0ZXJfaW1hZ2U7CisJdmFfc3RhcnQgKCBhcmdzLCB0eXBlICk7CisKKwkvKiBJbnN0YW50aWF0ZSBjaGlsZCBvYmplY3RzIGFuZCBhdHRhY2ggdG8gb3VyIGludGVyZmFjZXMgKi8KKwlpZiAoICggcmMgPSB4ZmVyX3ZvcGVuICggJmRvd25sb2FkZXItPnhmZXIsIHR5cGUsIGFyZ3MgKSApICE9IDAgKQorCQlnb3RvIGVycjsKKworCS8qIEF0dGFjaCBwYXJlbnQgaW50ZXJmYWNlLCBtb3J0YWxpc2Ugc2VsZiwgYW5kIHJldHVybiAqLworCWpvYl9wbHVnX3BsdWcgKCAmZG93bmxvYWRlci0+am9iLCBqb2IgKTsKKwlyZWZfcHV0ICggJmRvd25sb2FkZXItPnJlZmNudCApOworCXZhX2VuZCAoIGFyZ3MgKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlkb3dubG9hZGVyX2ZpbmlzaGVkICggZG93bmxvYWRlciwgcmMgKTsKKwlyZWZfcHV0ICggJmRvd25sb2FkZXItPnJlZmNudCApOworCXZhX2VuZCAoIGFyZ3MgKTsKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2Vycm5vLmMgYi9ncHhlL3NyYy9jb3JlL2Vycm5vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmNDRjZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvZXJybm8uYwpAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyoqIEBmaWxlCisgKgorICogRXJyb3IgY29kZXMKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGdsb2JhbCB2YXJpYWJsZSAjZXJybm8uCisgKgorICovCisKKy8qKgorICogR2xvYmFsICJsYXN0IGVycm9yIiBudW1iZXIuCisgKgorICogVGhpcyBpcyB2YWxpZCBvbmx5IHdoZW4gYSBmdW5jdGlvbiBoYXMganVzdCByZXR1cm5lZCBpbmRpY2F0aW5nIGEKKyAqIGZhaWx1cmUuCisgKgorICovCitpbnQgZXJybm87CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2V4ZWMuYyBiL2dweGUvc3JjL2NvcmUvZXhlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMTZhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2V4ZWMuYwpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisjaW5jbHVkZSA8Z3B4ZS9jb21tYW5kLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXR0aW5ncy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBDb21tYW5kIGV4ZWN1dGlvbgorICoKKyAqLworCisvKiBBdm9pZCBkcmFnZ2luZyBpbiBnZXRvcHQubyB1bmxlc3MgYSBjb21tYW5kIHJlYWxseSB1c2VzIGl0ICovCitpbnQgb3B0aW5kOworaW50IG5leHRjaGFyOworCisvKioKKyAqIEV4ZWN1dGUgY29tbWFuZAorICoKKyAqIEB2IGNvbW1hbmQJCUNvbW1hbmQgbmFtZQorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICogQHJldCByYwkJQ29tbWFuZCBleGl0IHN0YXR1cworICoKKyAqIEV4ZWN1dGUgdGhlIG5hbWVkIGNvbW1hbmQuICBVbmxpa2UgYSB0cmFkaXRpb25hbCBQT1NJWCBleGVjdigpLAorICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY29tbWFuZC4KKyAqLworaW50IGV4ZWN2ICggY29uc3QgY2hhciAqY29tbWFuZCwgY2hhciAqIGNvbnN0IGFyZ3ZbXSApIHsKKwlzdHJ1Y3QgY29tbWFuZCAqY21kOworCWludCBhcmdjOworCisJLyogQ291bnQgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworCWZvciAoIGFyZ2MgPSAwIDsgYXJndlthcmdjXSA7IGFyZ2MrKyApIHt9CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCAhIGNvbW1hbmQgKSB7CisJCURCRyAoICJObyBjb21tYW5kXG4iICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoICEgYXJnYyApIHsKKwkJREJHICggIiVzOiBlbXB0eSBhcmd1bWVudCBsaXN0XG4iLCBjb21tYW5kICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFJlc2V0IGdldG9wdCgpIGxpYnJhcnkgcmVhZHkgZm9yIHVzZSBieSB0aGUgY29tbWFuZC4gIFRoaXMKKwkgKiBpcyBhbiBhcnRlZmFjdCBvZiB0aGUgUE9TSVggZ2V0b3B0KCkgQVBJIHdpdGhpbiB0aGUgY29udGV4dAorCSAqIG9mIEV0aGVyYm9vdDsgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciByZXNldF9nZXRvcHQoKSBmb3IKKwkgKiBkZXRhaWxzLgorCSAqLworCXJlc2V0X2dldG9wdCgpOworCisJLyogSGFuZCBvZmYgdG8gY29tbWFuZCBpbXBsZW1lbnRhdGlvbiAqLworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggY21kLCBDT01NQU5EUyApIHsKKwkJaWYgKCBzdHJjbXAgKCBjb21tYW5kLCBjbWQtPm5hbWUgKSA9PSAwICkKKwkJCXJldHVybiBjbWQtPmV4ZWMgKCBhcmdjLCAoIGNoYXIgKiogKSBhcmd2ICk7CisJfQorCisJcHJpbnRmICggIiVzOiBjb21tYW5kIG5vdCBmb3VuZFxuIiwgY29tbWFuZCApOworCXJldHVybiAtRU5PRVhFQzsKK30KKworLyoqCisgKiBFeHBhbmQgdmFyaWFibGVzIHdpdGhpbiBjb21tYW5kIGxpbmUKKyAqCisgKiBAdiBjb21tYW5kCQlDb21tYW5kIGxpbmUKKyAqIEByZXQgZXhwY21kCQlFeHBhbmRlZCBjb21tYW5kIGxpbmUKKyAqCisgKiBUaGUgZXhwYW5kZWQgY29tbWFuZCBsaW5lIGlzIGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpIGFuZCB0aGUgY2FsbGVyCisgKiBtdXN0IGV2ZW50dWFsbHkgZnJlZSgpIGl0LgorICovCitzdGF0aWMgY2hhciAqIGV4cGFuZF9jb21tYW5kICggY29uc3QgY2hhciAqY29tbWFuZCApIHsKKwljaGFyICpleHBjbWQ7CisJY2hhciAqc3RhcnQ7CisJY2hhciAqZW5kOworCWNoYXIgKmhlYWQ7CisJY2hhciAqbmFtZTsKKwljaGFyICp0YWlsOworCWludCBzZXR0aW5nX2xlbjsKKwlpbnQgbmV3X2xlbjsKKwljaGFyICp0bXA7CisKKwkvKiBPYnRhaW4gdGVtcG9yYXJ5IG1vZGlmaWFibGUgY29weSBvZiBjb21tYW5kIGxpbmUgKi8KKwlleHBjbWQgPSBzdHJkdXAgKCBjb21tYW5kICk7CisJaWYgKCAhIGV4cGNtZCApCisJCXJldHVybiBOVUxMOworCisJLyogRXhwYW5kIHdoaWxlIGV4cGFuc2lvbnMgcmVtYWluICovCisJd2hpbGUgKCAxICkgeworCisJCWhlYWQgPSBleHBjbWQ7CisKKwkJLyogTG9jYXRlIG9wZW5lciAqLworCQlzdGFydCA9IHN0cnN0ciAoIGV4cGNtZCwgIiR7IiApOworCQlpZiAoICEgc3RhcnQgKQorCQkJYnJlYWs7CisJCSpzdGFydCA9ICdcMCc7CisJCW5hbWUgPSAoIHN0YXJ0ICsgMiApOworCisJCS8qIExvY2F0ZSBjbG9zZXIgKi8KKwkJZW5kID0gc3Ryc3RyICggbmFtZSwgIn0iICk7CisJCWlmICggISBlbmQgKQorCQkJYnJlYWs7CisJCSplbmQgPSAnXDAnOworCQl0YWlsID0gKCBlbmQgKyAxICk7CisKKwkJLyogRGV0ZXJtaW5lIHNldHRpbmcgbGVuZ3RoICovCisJCXNldHRpbmdfbGVuID0gZmV0Y2hmX25hbWVkX3NldHRpbmcgKCBuYW1lLCBOVUxMLCAwICk7CisJCWlmICggc2V0dGluZ19sZW4gPCAwICkKKwkJCXNldHRpbmdfbGVuID0gMDsgLyogVHJlYXQgZXJyb3IgYXMgZW1wdHkgc2V0dGluZyAqLworCisJCS8qIFJlYWQgc2V0dGluZyBpbnRvIHRlbXBvcmFyeSBidWZmZXIgKi8KKwkJeworCQkJY2hhciBzZXR0aW5nX2J1Zlsgc2V0dGluZ19sZW4gKyAxIF07CisKKwkJCXNldHRpbmdfYnVmWzBdID0gJ1wwJzsKKwkJCWZldGNoZl9uYW1lZF9zZXR0aW5nICggbmFtZSwgc2V0dGluZ19idWYsCisJCQkJCSAgICAgICBzaXplb2YgKCBzZXR0aW5nX2J1ZiApICk7CisKKwkJCS8qIENvbnN0cnVjdCBleHBhbmRlZCBzdHJpbmcgYW5kIGRpc2NhcmQgb2xkIHN0cmluZyAqLworCQkJdG1wID0gZXhwY21kOworCQkJbmV3X2xlbiA9IGFzcHJpbnRmICggJmV4cGNtZCwgIiVzJXMlcyIsCisJCQkJCSAgICAgaGVhZCwgc2V0dGluZ19idWYsIHRhaWwgKTsKKwkJCWZyZWUgKCB0bXAgKTsKKwkJCWlmICggbmV3X2xlbiA8IDAgKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIGV4cGNtZDsKK30KKworLyoqCisgKiBTcGxpdCBjb21tYW5kIGxpbmUgaW50byBhcmd2IGFycmF5CisgKgorICogQHYgYXJncwkJQ29tbWFuZCBsaW5lCisgKiBAdiBhcmd2CQlBcmd1bWVudCBhcnJheSB0byBwb3B1bGF0ZSwgb3IgTlVMTAorICogQHJldCBhcmdjCQlBcmd1bWVudCBjb3VudAorICoKKyAqIFNwbGl0cyB0aGUgY29tbWFuZCBsaW5lIGludG8gd2hpdGVzcGFjZS1kZWxpbWl0ZWQgYXJndW1lbnRzLiAgSWYgQGMKKyAqIGFyZ3YgaXMgbm9uLU5VTEwsIGFueSB3aGl0ZXNwYWNlIGluIHRoZSBjb21tYW5kIGxpbmUgd2lsbCBiZQorICogcmVwbGFjZWQgd2l0aCBOVUxzLgorICovCitzdGF0aWMgaW50IHNwbGl0X2FyZ3MgKCBjaGFyICphcmdzLCBjaGFyICogYXJndltdICkgeworCWludCBhcmdjID0gMDsKKworCXdoaWxlICggMSApIHsKKwkJLyogU2tpcCBvdmVyIGFueSB3aGl0ZXNwYWNlIC8gY29udmVydCB0byBOVUwgKi8KKwkJd2hpbGUgKCBpc3NwYWNlICggKmFyZ3MgKSApIHsKKwkJCWlmICggYXJndiApCisJCQkJKmFyZ3MgPSAnXDAnOworCQkJYXJncysrOworCQl9CisJCS8qIENoZWNrIGZvciBlbmQgb2YgbGluZSAqLworCQlpZiAoICEgKmFyZ3MgKQorCQkJYnJlYWs7CisJCS8qIFdlIGhhdmUgZm91bmQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGFyZ3VtZW50ICovCisJCWlmICggYXJndiApCisJCQlhcmd2W2FyZ2NdID0gYXJnczsKKwkJYXJnYysrOworCQkvKiBTa2lwIHRvIHN0YXJ0IG9mIG5leHQgd2hpdGVzcGFjZSwgaWYgYW55ICovCisJCXdoaWxlICggKmFyZ3MgJiYgISBpc3NwYWNlICggKmFyZ3MgKSApIHsKKwkJCWFyZ3MrKzsKKwkJfQorCX0KKwlyZXR1cm4gYXJnYzsKK30KKworLyoqCisgKiBFeGVjdXRlIGNvbW1hbmQgbGluZQorICoKKyAqIEB2IGNvbW1hbmQJCUNvbW1hbmQgbGluZQorICogQHJldCByYwkJQ29tbWFuZCBleGl0IHN0YXR1cworICoKKyAqIEV4ZWN1dGUgdGhlIG5hbWVkIGNvbW1hbmQgYW5kIGFyZ3VtZW50cy4KKyAqLworaW50IHN5c3RlbSAoIGNvbnN0IGNoYXIgKmNvbW1hbmQgKSB7CisJY2hhciAqYXJnczsKKwlpbnQgYXJnYzsKKwlpbnQgcmMgPSAwOworCisJLyogUGVyZm9ybSB2YXJpYWJsZSBleHBhbnNpb24gKi8KKwlhcmdzID0gZXhwYW5kX2NvbW1hbmQgKCBjb21tYW5kICk7CisJaWYgKCAhIGFyZ3MgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIENvdW50IGFyZ3VtZW50cyAqLworCWFyZ2MgPSBzcGxpdF9hcmdzICggYXJncywgTlVMTCApOworCisJLyogQ3JlYXRlIGFyZ3YgYXJyYXkgYW5kIGV4ZWN1dGUgY29tbWFuZCAqLworCWlmICggYXJnYyApIHsKKwkJY2hhciAqIGFyZ3ZbYXJnYyArIDFdOworCQkKKwkJc3BsaXRfYXJncyAoIGFyZ3MsIGFyZ3YgKTsKKwkJYXJndlthcmdjXSA9IE5VTEw7CisKKwkJaWYgKCBhcmd2WzBdWzBdICE9ICcjJyApCisJCQlyYyA9IGV4ZWN2ICggYXJndlswXSwgYXJndiApOworCX0KKworCWZyZWUgKCBhcmdzICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFRoZSAiZWNobyIgY29tbWFuZAorICoKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAcmV0IHJjCQlFeGl0IGNvZGUKKyAqLworc3RhdGljIGludCBlY2hvX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJaW50IGk7CisKKwlmb3IgKCBpID0gMSA7IGkgPCBhcmdjIDsgaSsrICkgeworCQlwcmludGYgKCAiJXMlcyIsICggKCBpID09IDEgKSA/ICIiIDogIiAiICksIGFyZ3ZbaV0gKTsKKwl9CisJcHJpbnRmICggIlxuIiApOworCXJldHVybiAwOworfQorCisvKiogImVjaG8iIGNvbW1hbmQgKi8KK3N0cnVjdCBjb21tYW5kIGVjaG9fY29tbWFuZCBfX2NvbW1hbmQgPSB7CisJLm5hbWUgPSAiZWNobyIsCisJLmV4ZWMgPSBlY2hvX2V4ZWMsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9maWx0ZXIuYyBiL2dweGUvc3JjL2NvcmUvZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiZWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvZmlsdGVyLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUveGZlci5oPgorI2luY2x1ZGUgPGdweGUvZmlsdGVyLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIERhdGEgdHJhbnNmZXIgZmlsdGVycworICoKKyAqLworCisvKgorICogUGFzcy10aHJvdWdoIG1ldGhvZHMgdG8gYmUgdXNlZCBieSBmaWx0ZXJzIHdoaWNoIGRvbid0IHdhbnQgdG8KKyAqIGludGVyY2VwdCBhbGwgZXZlbnRzLgorICoKKyAqLworCit2b2lkIGZpbHRlcl9jbG9zZSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHJjICkgeworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqb3RoZXIgPSBmaWx0ZXJfb3RoZXJfaGFsZiAoIHhmZXIgKTsKKworCXhmZXJfY2xvc2UgKCBvdGhlciwgcmMgKTsKK30KKworaW50IGZpbHRlcl92cmVkaXJlY3QgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGludCB0eXBlLAorCQkJdmFfbGlzdCBhcmdzICkgeworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqb3RoZXIgPSBmaWx0ZXJfb3RoZXJfaGFsZiAoIHhmZXIgKTsKKworCXJldHVybiB4ZmVyX3ZyZWRpcmVjdCAoIG90aGVyLCB0eXBlLCBhcmdzICk7Cit9CisKK3NpemVfdCBmaWx0ZXJfd2luZG93ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyICkgeworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqb3RoZXIgPSBmaWx0ZXJfb3RoZXJfaGFsZiAoIHhmZXIgKTsKKworCXJldHVybiB4ZmVyX3dpbmRvdyAoIG90aGVyICk7Cit9CisKK3N0cnVjdCBpb19idWZmZXIgKiBmaWx0ZXJfYWxsb2NfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCSAgICAgIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IHhmZXJfaW50ZXJmYWNlICpvdGhlciA9IGZpbHRlcl9vdGhlcl9oYWxmICggeGZlciApOworCisJcmV0dXJuIHhmZXJfYWxsb2NfaW9iICggb3RoZXIsIGxlbiApOworfQorCitpbnQgZmlsdGVyX2RlbGl2ZXJfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCSBzdHJ1Y3QgeGZlcl9tZXRhZGF0YSAqbWV0YSApIHsKKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKm90aGVyID0gZmlsdGVyX290aGVyX2hhbGYgKCB4ZmVyICk7CisKKwlyZXR1cm4geGZlcl9kZWxpdmVyX2lvYl9tZXRhICggb3RoZXIsIGlvYnVmLCBtZXRhICk7Cit9CisKK2ludCBmaWx0ZXJfZGVsaXZlcl9yYXcgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKm90aGVyID0gZmlsdGVyX290aGVyX2hhbGYgKCB4ZmVyICk7CisKKwlyZXR1cm4geGZlcl9kZWxpdmVyX3JhdyAoIG90aGVyLCBkYXRhLCBsZW4gKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvZ2Ric2VyaWFsLmMgYi9ncHhlL3NyYy9jb3JlL2dkYnNlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDUwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2dkYnNlcmlhbC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU3RlZmFuIEhham5vY3ppIDxzdGVmYW5oYUBnbWFpbC5jb20+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXJpYWwuaD4KKyNpbmNsdWRlIDxncHhlL2dkYnN0dWIuaD4KKyNpbmNsdWRlIDxncHhlL2dkYnNlcmlhbC5oPgorCitzdHJ1Y3QgZ2RiX3RyYW5zcG9ydCBzZXJpYWxfZ2RiX3RyYW5zcG9ydCBfX2dkYl90cmFuc3BvcnQ7CisKK3N0YXRpYyBzaXplX3QgZ2Ric2VyaWFsX3JlY3YgKCBjaGFyICpidWYsIHNpemVfdCBsZW4gKSB7CisJYXNzZXJ0ICggbGVuID4gMCApOworCWJ1ZiBbIDAgXSA9IHNlcmlhbF9nZXRjKCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGdkYnNlcmlhbF9zZW5kICggY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuICkgeworCXdoaWxlICggbGVuLS0gPiAwICkgeworCQlzZXJpYWxfcHV0YyAoICpidWYrKyApOworCX0KK30KKworc3RydWN0IGdkYl90cmFuc3BvcnQgc2VyaWFsX2dkYl90cmFuc3BvcnQgX19nZGJfdHJhbnNwb3J0ID0geworCS5uYW1lID0gInNlcmlhbCIsCisJLnJlY3YgPSBnZGJzZXJpYWxfcmVjdiwKKwkuc2VuZCA9IGdkYnNlcmlhbF9zZW5kLAorfTsKKworc3RydWN0IGdkYl90cmFuc3BvcnQgKmdkYnNlcmlhbF9jb25maWd1cmUgKCB2b2lkICkgeworCXJldHVybiAmc2VyaWFsX2dkYl90cmFuc3BvcnQ7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2dkYnN0dWIuYyBiL2dweGUvc3JjL2NvcmUvZ2Ric3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MDgzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2dkYnN0dWIuYwpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTdGVmYW4gSGFqbm9jemkgPHN0ZWZhbmhhQGdtYWlsLmNvbT4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qKgorICogQGZpbGUKKyAqCisgKiBHREIgc3R1YiBmb3IgcmVtb3RlIGRlYnVnZ2luZworICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9nZGJzdHViLmg+CisjaW5jbHVkZSAiZ2RibWFjaC5oIgorCitlbnVtIHsKKwlQT1NJWF9FSU5WQUwgPSAweDFjLCAgLyogdXNlZCB0byByZXBvcnQgYmFkIGFyZ3VtZW50cyB0byBHREIgKi8KKwlTSVpFT0ZfUEFZTE9BRCA9IDI1NiwgLyogYnVmZmVyIHNpemUgb2YgR0RCIHBheWxvYWQgZGF0YSAqLworfTsKKworc3RydWN0IGdkYnN0dWIgeworCXN0cnVjdCBnZGJfdHJhbnNwb3J0ICp0cmFuczsKKwlpbnQgZXhpdF9oYW5kbGVyOyAvKiBsZWF2ZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCisJaW50IHNpZ25vOworCWdkYnJlZ190ICpyZWdzOworCisJdm9pZCAoICogcGFyc2UgKSAoIHN0cnVjdCBnZGJzdHViICpzdHViLCBjaGFyIGNoICk7CisJdWludDhfdCBja3N1bTE7CisKKwkvKiBCdWZmZXIgZm9yIHBheWxvYWQgZGF0YSB3aGVuIHBhcnNpbmcgYSBwYWNrZXQuICBPbmNlIHRoZQorCSAqIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCwgdGhpcyBidWZmZXIgaXMgdXNlZCB0byBob2xkCisJICogdGhlIHJlcGx5IHBheWxvYWQuICovCisJY2hhciBidWYgWyBTSVpFT0ZfUEFZTE9BRCArIDQgXTsgLyogJC4uLlBBWUxPQUQuLi4jWFggKi8KKwljaGFyICpwYXlsb2FkOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBvZiBwYXlsb2FkICovCisJaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHBheWxvYWQgKi8KK307CisKKy8qIFBhY2tldCBwYXJzZXIgc3RhdGVzICovCitzdGF0aWMgdm9pZCBnZGJzdHViX3N0YXRlX25ldyAoIHN0cnVjdCBnZGJzdHViICpzdHViLCBjaGFyIGNoICk7CitzdGF0aWMgdm9pZCBnZGJzdHViX3N0YXRlX2RhdGEgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciBjaCApOworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zdGF0ZV9ja3N1bTEgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciBjaCApOworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zdGF0ZV9ja3N1bTIgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciBjaCApOworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zdGF0ZV93YWl0X2FjayAoIHN0cnVjdCBnZGJzdHViICpzdHViLCBjaGFyIGNoICk7CisKK3N0YXRpYyB1aW50OF90IGdkYnN0dWJfZnJvbV9oZXhfZGlnaXQgKCBjaGFyIGNoICkgeworCXJldHVybiAoIGlzZGlnaXQgKCBjaCApID8gY2ggLSAnMCcgOiB0b2xvd2VyICggY2ggKSAtICdhJyArIDB4YSApICYgMHhmOworfQorCitzdGF0aWMgdWludDhfdCBnZGJzdHViX3RvX2hleF9kaWdpdCAoIHVpbnQ4X3QgYiApIHsKKwliICY9IDB4ZjsKKwlyZXR1cm4gKCBiIDwgMHhhID8gJzAnIDogJ2EnIC0gMHhhICkgKyBiOworfQorCisvKgorICogVG8gbWFrZSByZWFkaW5nL3dyaXRpbmcgZGV2aWNlIG1lbW9yeSBhdG9taWMsIHdlIGNoZWNrIGZvcgorICogMi0gb3IgNC1ieXRlIGFsaWduZWQgb3BlcmF0aW9ucyBhbmQgaGFuZGxlIHRoZW0gc3BlY2lhbGx5LgorICovCisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfZnJvbV9oZXhfYnVmICggY2hhciAqZHN0LCBjaGFyICpzcmMsIGludCBsZW5ieXRlcyApIHsKKwlpZiAoIGxlbmJ5dGVzID09IDIgJiYgKCAoIHVuc2lnbmVkIGxvbmcgKSBkc3QgJiAweDEgKSA9PSAwICkgeworCQl1aW50MTZfdCBpID0gZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdCAoIHNyYyBbIDIgXSApIDw8IDEyIHwKKwkJCWdkYnN0dWJfZnJvbV9oZXhfZGlnaXQgKCBzcmMgWyAzIF0gKSA8PCA4IHwKKwkJCWdkYnN0dWJfZnJvbV9oZXhfZGlnaXQgKCBzcmMgWyAwIF0gKSA8PCA0IHwKKwkJCWdkYnN0dWJfZnJvbV9oZXhfZGlnaXQgKCBzcmMgWyAxIF0gKTsKKwkJKiAoIHVpbnQxNl90ICogKSBkc3QgPSBjcHVfdG9fbGUxNiAoIGkgKTsKKwl9IGVsc2UgaWYgKCBsZW5ieXRlcyA9PSA0ICYmICggKCB1bnNpZ25lZCBsb25nICkgZHN0ICYgMHgzICkgPT0gMCApIHsKKwkJdWludDMyX3QgaSA9IGdkYnN0dWJfZnJvbV9oZXhfZGlnaXQgKCBzcmMgWyA2IF0gKSA8PCAyOCB8CisJCQlnZGJzdHViX2Zyb21faGV4X2RpZ2l0ICggc3JjIFsgNyBdICkgPDwgMjQgfAorCQkJZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdCAoIHNyYyBbIDQgXSApIDw8IDIwIHwKKwkJCWdkYnN0dWJfZnJvbV9oZXhfZGlnaXQgKCBzcmMgWyA1IF0gKSA8PCAxNiB8CisJCQlnZGJzdHViX2Zyb21faGV4X2RpZ2l0ICggc3JjIFsgMiBdICkgPDwgMTIgfAorCQkJZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdCAoIHNyYyBbIDMgXSApIDw8IDggfAorCQkJZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdCAoIHNyYyBbIDAgXSApIDw8IDQgfAorCQkJZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdCAoIHNyYyBbIDEgXSApOworCQkqICggdWludDMyX3QgKiApIGRzdCA9IGNwdV90b19sZTMyICggaSApOworCX0gZWxzZSB7CisJCXdoaWxlICggbGVuYnl0ZXMtLSA+IDAgKSB7CisJCQkqZHN0KysgPSBnZGJzdHViX2Zyb21faGV4X2RpZ2l0ICggc3JjIFsgMCBdICkgPDwgNCB8CisJCQkJZ2Ric3R1Yl9mcm9tX2hleF9kaWdpdCAoIHNyYyBbIDEgXSApOworCQkJc3JjICs9IDI7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfdG9faGV4X2J1ZiAoIGNoYXIgKmRzdCwgY2hhciAqc3JjLCBpbnQgbGVuYnl0ZXMgKSB7CisJaWYgKCBsZW5ieXRlcyA9PSAyICYmICggKCB1bnNpZ25lZCBsb25nICkgc3JjICYgMHgxICkgPT0gMCApIHsKKwkJdWludDE2X3QgaSA9IGNwdV90b19sZTE2ICggKiAoIHVpbnQxNl90ICogKSBzcmMgKTsKKwkJZHN0IFsgMCBdID0gZ2Ric3R1Yl90b19oZXhfZGlnaXQgKCBpID4+IDQgKTsKKwkJZHN0IFsgMSBdID0gZ2Ric3R1Yl90b19oZXhfZGlnaXQgKCBpICk7CisJCWRzdCBbIDIgXSA9IGdkYnN0dWJfdG9faGV4X2RpZ2l0ICggaSA+PiAxMiApOworCQlkc3QgWyAzIF0gPSBnZGJzdHViX3RvX2hleF9kaWdpdCAoIGkgPj4gOCApOworCX0gZWxzZSBpZiAoIGxlbmJ5dGVzID09IDQgJiYgKCAoIHVuc2lnbmVkIGxvbmcgKSBzcmMgJiAweDMgKSA9PSAwICkgeworCQl1aW50MzJfdCBpID0gY3B1X3RvX2xlMzIgKCAqICggdWludDMyX3QgKiApIHNyYyApOworCQlkc3QgWyAwIF0gPSBnZGJzdHViX3RvX2hleF9kaWdpdCAoIGkgPj4gNCApOworCQlkc3QgWyAxIF0gPSBnZGJzdHViX3RvX2hleF9kaWdpdCAoIGkgKTsKKwkJZHN0IFsgMiBdID0gZ2Ric3R1Yl90b19oZXhfZGlnaXQgKCBpID4+IDEyICk7CisJCWRzdCBbIDMgXSA9IGdkYnN0dWJfdG9faGV4X2RpZ2l0ICggaSA+PiA4ICk7CisJCWRzdCBbIDQgXSA9IGdkYnN0dWJfdG9faGV4X2RpZ2l0ICggaSA+PiAyMCApOworCQlkc3QgWyA1IF0gPSBnZGJzdHViX3RvX2hleF9kaWdpdCAoIGkgPj4gMTYpOworCQlkc3QgWyA2IF0gPSBnZGJzdHViX3RvX2hleF9kaWdpdCAoIGkgPj4gMjggKTsKKwkJZHN0IFsgNyBdID0gZ2Ric3R1Yl90b19oZXhfZGlnaXQgKCBpID4+IDI0ICk7CisJfSBlbHNlIHsKKwkJd2hpbGUgKCBsZW5ieXRlcy0tID4gMCApIHsKKwkJCSpkc3QrKyA9IGdkYnN0dWJfdG9faGV4X2RpZ2l0ICggKnNyYyA+PiA0ICk7CisJCQkqZHN0KysgPSBnZGJzdHViX3RvX2hleF9kaWdpdCAoICpzcmMgKTsKKwkJCXNyYysrOworCQl9CisJfQorfQorCitzdGF0aWMgdWludDhfdCBnZGJzdHViX2Nrc3VtICggY2hhciAqZGF0YSwgaW50IGxlbiApIHsKKwl1aW50OF90IGNrc3VtID0gMDsKKwl3aGlsZSAoIGxlbi0tID4gMCApIHsKKwkJY2tzdW0gKz0gKCB1aW50OF90ICkgKmRhdGErKzsKKwl9CisJcmV0dXJuIGNrc3VtOworfQorCitzdGF0aWMgdm9pZCBnZGJzdHViX3R4X3BhY2tldCAoIHN0cnVjdCBnZGJzdHViICpzdHViICkgeworCXVpbnQ4X3QgY2tzdW0gPSBnZGJzdHViX2Nrc3VtICggc3R1Yi0+cGF5bG9hZCwgc3R1Yi0+bGVuICk7CisJc3R1Yi0+YnVmIFsgMCBdID0gJyQnOworCXN0dWItPmJ1ZiBbIHN0dWItPmxlbiArIDEgXSA9ICcjJzsKKwlzdHViLT5idWYgWyBzdHViLT5sZW4gKyAyIF0gPSBnZGJzdHViX3RvX2hleF9kaWdpdCAoIGNrc3VtID4+IDQgKTsKKwlzdHViLT5idWYgWyBzdHViLT5sZW4gKyAzIF0gPSBnZGJzdHViX3RvX2hleF9kaWdpdCAoIGNrc3VtICk7CisJc3R1Yi0+dHJhbnMtPnNlbmQgKCBzdHViLT5idWYsIHN0dWItPmxlbiArIDQgKTsKKwlzdHViLT5wYXJzZSA9IGdkYnN0dWJfc3RhdGVfd2FpdF9hY2s7Cit9CisKKy8qIEdEQiBjb21tYW5kcyAqLworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zZW5kX29rICggc3RydWN0IGdkYnN0dWIgKnN0dWIgKSB7CisJc3R1Yi0+cGF5bG9hZCBbIDAgXSA9ICdPJzsKKwlzdHViLT5wYXlsb2FkIFsgMSBdID0gJ0snOworCXN0dWItPmxlbiA9IDI7CisJZ2Ric3R1Yl90eF9wYWNrZXQgKCBzdHViICk7Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfc2VuZF9udW1fcGFja2V0ICggc3RydWN0IGdkYnN0dWIgKnN0dWIsIGNoYXIgcmVwbHksIGludCBudW0gKSB7CisJc3R1Yi0+cGF5bG9hZCBbIDAgXSA9IHJlcGx5OworCXN0dWItPnBheWxvYWQgWyAxIF0gPSBnZGJzdHViX3RvX2hleF9kaWdpdCAoICggY2hhciApIG51bSA+PiA0ICk7CisJc3R1Yi0+cGF5bG9hZCBbIDIgXSA9IGdkYnN0dWJfdG9faGV4X2RpZ2l0ICggKCBjaGFyICkgbnVtICk7CisJc3R1Yi0+bGVuID0gMzsKKwlnZGJzdHViX3R4X3BhY2tldCAoIHN0dWIgKTsKK30KKworLyogRm9ybWF0IGlzIGFyZzEsYXJnMiwuLi4sYXJnbjpkYXRhIHdoZXJlIGFyZ24gYXJlIGhleCBpbnRlZ2VycyBhbmQgZGF0YSBpcyBub3QgYW4gYXJndW1lbnQgKi8KK3N0YXRpYyBpbnQgZ2Ric3R1Yl9nZXRfcGFja2V0X2FyZ3MgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgdW5zaWduZWQgbG9uZyAqYXJncywgaW50IG5hcmdzLCBpbnQgKnN0b3BfaWR4ICkgeworCWludCBpOworCWNoYXIgY2ggPSAwOworCWludCBhcmdjID0gMDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CisJZm9yICggaSA9IDE7IGkgPCBzdHViLT5sZW4gJiYgYXJnYyA8IG5hcmdzOyBpKysgKSB7CisJCWNoID0gc3R1Yi0+cGF5bG9hZCBbIGkgXTsKKwkJaWYgKCBjaCA9PSAnOicgKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICggY2ggPT0gJywnICkgeworCQkJYXJncyBbIGFyZ2MrKyBdID0gdmFsOworCQkJdmFsID0gMDsKKwkJfSBlbHNlIHsKKwkJCXZhbCA9ICggdmFsIDw8IDQgKSB8IGdkYnN0dWJfZnJvbV9oZXhfZGlnaXQgKCBjaCApOworCQl9CisJfQorCWlmICggc3RvcF9pZHggKSB7CisJCSpzdG9wX2lkeCA9IGk7CisJfQorCWlmICggYXJnYyA8IG5hcmdzICkgeworCQlhcmdzIFsgYXJnYysrIF0gPSB2YWw7CisJfQorCXJldHVybiAoICggaSA9PSBzdHViLT5sZW4gfHwgY2ggPT0gJzonICkgJiYgYXJnYyA9PSBuYXJncyApOworfQorCitzdGF0aWMgdm9pZCBnZGJzdHViX3NlbmRfZXJybm8gKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgaW50IGVycm5vICkgeworCWdkYnN0dWJfc2VuZF9udW1fcGFja2V0ICggc3R1YiwgJ0UnLCBlcnJubyApOworfQorCitzdGF0aWMgdm9pZCBnZGJzdHViX3JlcG9ydF9zaWduYWwgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiApIHsKKwlnZGJzdHViX3NlbmRfbnVtX3BhY2tldCAoIHN0dWIsICdTJywgc3R1Yi0+c2lnbm8gKTsKK30KKworc3RhdGljIHZvaWQgZ2Ric3R1Yl9yZWFkX3JlZ3MgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiApIHsKKwlnZGJzdHViX3RvX2hleF9idWYgKCBzdHViLT5wYXlsb2FkLCAoIGNoYXIgKiApIHN0dWItPnJlZ3MsIEdEQk1BQ0hfU0laRU9GX1JFR1MgKTsKKwlzdHViLT5sZW4gPSBHREJNQUNIX1NJWkVPRl9SRUdTICogMjsKKwlnZGJzdHViX3R4X3BhY2tldCAoIHN0dWIgKTsKK30KKworc3RhdGljIHZvaWQgZ2Ric3R1Yl93cml0ZV9yZWdzICggc3RydWN0IGdkYnN0dWIgKnN0dWIgKSB7CisJaWYgKCBzdHViLT5sZW4gIT0gMSArIEdEQk1BQ0hfU0laRU9GX1JFR1MgKiAyICkgeworCQlnZGJzdHViX3NlbmRfZXJybm8gKCBzdHViLCBQT1NJWF9FSU5WQUwgKTsKKwkJcmV0dXJuOworCX0KKwlnZGJzdHViX2Zyb21faGV4X2J1ZiAoICggY2hhciAqICkgc3R1Yi0+cmVncywgJnN0dWItPnBheWxvYWQgWyAxIF0sIEdEQk1BQ0hfU0laRU9GX1JFR1MgKTsKKwlnZGJzdHViX3NlbmRfb2sgKCBzdHViICk7Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfcmVhZF9tZW0gKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiApIHsKKwl1bnNpZ25lZCBsb25nIGFyZ3MgWyAyIF07CisJaWYgKCAhZ2Ric3R1Yl9nZXRfcGFja2V0X2FyZ3MgKCBzdHViLCBhcmdzLCBzaXplb2YgYXJncyAvIHNpemVvZiBhcmdzIFsgMCBdLCBOVUxMICkgKSB7CisJCWdkYnN0dWJfc2VuZF9lcnJubyAoIHN0dWIsIFBPU0lYX0VJTlZBTCApOworCQlyZXR1cm47CisJfQorCWFyZ3MgWyAxIF0gPSAoIGFyZ3MgWyAxIF0gPCBTSVpFT0ZfUEFZTE9BRCAvIDIgKSA/IGFyZ3MgWyAxIF0gOiBTSVpFT0ZfUEFZTE9BRCAvIDI7CisJZ2Ric3R1Yl90b19oZXhfYnVmICggc3R1Yi0+cGF5bG9hZCwgKCBjaGFyICogKSBhcmdzIFsgMCBdLCBhcmdzIFsgMSBdICk7CisJc3R1Yi0+bGVuID0gYXJncyBbIDEgXSAqIDI7CisJZ2Ric3R1Yl90eF9wYWNrZXQgKCBzdHViICk7Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfd3JpdGVfbWVtICggc3RydWN0IGdkYnN0dWIgKnN0dWIgKSB7CisJdW5zaWduZWQgbG9uZyBhcmdzIFsgMiBdOworCWludCBjb2xvbjsKKwlpZiAoICFnZGJzdHViX2dldF9wYWNrZXRfYXJncyAoIHN0dWIsIGFyZ3MsIHNpemVvZiBhcmdzIC8gc2l6ZW9mIGFyZ3MgWyAwIF0sICZjb2xvbiApIHx8CisJCQljb2xvbiA+PSBzdHViLT5sZW4gfHwgc3R1Yi0+cGF5bG9hZCBbIGNvbG9uIF0gIT0gJzonIHx8CisJCQkoIHN0dWItPmxlbiAtIGNvbG9uIC0gMSApICUgMiAhPSAwICkgeworCQlnZGJzdHViX3NlbmRfZXJybm8gKCBzdHViLCBQT1NJWF9FSU5WQUwgKTsKKwkJcmV0dXJuOworCX0KKwlnZGJzdHViX2Zyb21faGV4X2J1ZiAoICggY2hhciAqICkgYXJncyBbIDAgXSwgJnN0dWItPnBheWxvYWQgWyBjb2xvbiArIDEgXSwgKCBzdHViLT5sZW4gLSBjb2xvbiAtIDEgKSAvIDIgKTsKKwlnZGJzdHViX3NlbmRfb2sgKCBzdHViICk7Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfY29udGludWUgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgaW50IHNpbmdsZV9zdGVwICkgeworCWdkYnJlZ190IHBjOworCWlmICggc3R1Yi0+bGVuID4gMSAmJiBnZGJzdHViX2dldF9wYWNrZXRfYXJncyAoIHN0dWIsICZwYywgMSwgTlVMTCApICkgeworCQlnZGJtYWNoX3NldF9wYyAoIHN0dWItPnJlZ3MsIHBjICk7CisJfQorCWdkYm1hY2hfc2V0X3NpbmdsZV9zdGVwICggc3R1Yi0+cmVncywgc2luZ2xlX3N0ZXAgKTsKKwlzdHViLT5leGl0X2hhbmRsZXIgPSAxOworCS8qIFJlcGx5IHdpbGwgYmUgc2VudCB3aGVuIHdlIGhpdCB0aGUgbmV4dCBicmVha3BvaW50IG9yIGludGVycnVwdCAqLworfQorCitzdGF0aWMgdm9pZCBnZGJzdHViX2JyZWFrcG9pbnQgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiApIHsKKwl1bnNpZ25lZCBsb25nIGFyZ3MgWyAzIF07CisJaW50IGVuYWJsZSA9IHN0dWItPnBheWxvYWQgWyAwIF0gPT0gJ1onID8gMSA6IDA7CisJaWYgKCAhZ2Ric3R1Yl9nZXRfcGFja2V0X2FyZ3MgKCBzdHViLCBhcmdzLCBzaXplb2YgYXJncyAvIHNpemVvZiBhcmdzIFsgMCBdLCBOVUxMICkgKSB7CisJCWdkYnN0dWJfc2VuZF9lcnJubyAoIHN0dWIsIFBPU0lYX0VJTlZBTCApOworCQlyZXR1cm47CisJfQorCWlmICggZ2RibWFjaF9zZXRfYnJlYWtwb2ludCAoIGFyZ3MgWyAwIF0sIGFyZ3MgWyAxIF0sIGFyZ3MgWyAyIF0sIGVuYWJsZSApICkgeworCQlnZGJzdHViX3NlbmRfb2sgKCBzdHViICk7CisJfSBlbHNlIHsKKwkJLyogTm90IHN1cHBvcnRlZCAqLworCQlzdHViLT5sZW4gPSAwOworCQlnZGJzdHViX3R4X3BhY2tldCAoIHN0dWIgKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfcnhfcGFja2V0ICggc3RydWN0IGdkYnN0dWIgKnN0dWIgKSB7CisJc3dpdGNoICggc3R1Yi0+cGF5bG9hZCBbIDAgXSApIHsKKwkJY2FzZSAnPyc6CisJCQlnZGJzdHViX3JlcG9ydF9zaWduYWwgKCBzdHViICk7CisJCQlicmVhazsKKwkJY2FzZSAnZyc6CisJCQlnZGJzdHViX3JlYWRfcmVncyAoIHN0dWIgKTsKKwkJCWJyZWFrOworCQljYXNlICdHJzoKKwkJCWdkYnN0dWJfd3JpdGVfcmVncyAoIHN0dWIgKTsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWdkYnN0dWJfcmVhZF9tZW0gKCBzdHViICk7CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQlnZGJzdHViX3dyaXRlX21lbSAoIHN0dWIgKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzogLyogQ29udGludWUgKi8KKwkJY2FzZSAnayc6IC8qIEtpbGwgKi8KKwkJY2FzZSAncyc6IC8qIFN0ZXAgKi8KKwkJY2FzZSAnRCc6IC8qIERldGFjaCAqLworCQkJZ2Ric3R1Yl9jb250aW51ZSAoIHN0dWIsIHN0dWItPnBheWxvYWQgWyAwIF0gPT0gJ3MnICk7CisJCQlpZiAoIHN0dWItPnBheWxvYWQgWyAwIF0gPT0gJ0QnICkgeworCQkJCWdkYnN0dWJfc2VuZF9vayAoIHN0dWIgKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdaJzogLyogSW5zZXJ0IGJyZWFrcG9pbnQgKi8KKwkJY2FzZSAneic6IC8qIFJlbW92ZSBicmVha3BvaW50ICovCisJCQlnZGJzdHViX2JyZWFrcG9pbnQgKCBzdHViICk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0dWItPmxlbiA9IDA7CisJCQlnZGJzdHViX3R4X3BhY2tldCAoIHN0dWIgKTsKKwkJCWJyZWFrOworCX0KK30KKworLyogR0RCIHBhY2tldCBwYXJzZXIgKi8KK3N0YXRpYyB2b2lkIGdkYnN0dWJfc3RhdGVfbmV3ICggc3RydWN0IGdkYnN0dWIgKnN0dWIsIGNoYXIgY2ggKSB7CisJaWYgKCBjaCA9PSAnJCcgKSB7CisJCXN0dWItPmxlbiA9IDA7CisJCXN0dWItPnBhcnNlID0gZ2Ric3R1Yl9zdGF0ZV9kYXRhOworCX0KK30KKworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zdGF0ZV9kYXRhICggc3RydWN0IGdkYnN0dWIgKnN0dWIsIGNoYXIgY2ggKSB7CisJaWYgKCBjaCA9PSAnIycgKSB7CisJCXN0dWItPnBhcnNlID0gZ2Ric3R1Yl9zdGF0ZV9ja3N1bTE7CisJfSBlbHNlIGlmICggY2ggPT0gJyQnICkgeworCQlzdHViLT5sZW4gPSAwOyAvKiByZXRyeSBuZXcgcGFja2V0ICovCisJfSBlbHNlIHsKKwkJLyogSWYgdGhlIGxlbmd0aCBleGNlZWRzIG91ciBidWZmZXIsIGxldCB0aGUgY2hlY2tzdW0gZmFpbCAqLworCQlpZiAoIHN0dWItPmxlbiA8IFNJWkVPRl9QQVlMT0FEICkgeworCQkJc3R1Yi0+cGF5bG9hZCBbIHN0dWItPmxlbisrIF0gPSBjaDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZ2Ric3R1Yl9zdGF0ZV9ja3N1bTEgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciBjaCApIHsKKwlzdHViLT5ja3N1bTEgPSBnZGJzdHViX2Zyb21faGV4X2RpZ2l0ICggY2ggKSA8PCA0OworCXN0dWItPnBhcnNlID0gZ2Ric3R1Yl9zdGF0ZV9ja3N1bTI7Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfc3RhdGVfY2tzdW0yICggc3RydWN0IGdkYnN0dWIgKnN0dWIsIGNoYXIgY2ggKSB7CisJdWludDhfdCB0aGVpcl9ja3N1bTsKKwl1aW50OF90IG91cl9ja3N1bTsKKworCXN0dWItPnBhcnNlID0gZ2Ric3R1Yl9zdGF0ZV9uZXc7CisJdGhlaXJfY2tzdW0gPSBzdHViLT5ja3N1bTEgKyBnZGJzdHViX2Zyb21faGV4X2RpZ2l0ICggY2ggKTsKKwlvdXJfY2tzdW0gPSBnZGJzdHViX2Nrc3VtICggc3R1Yi0+cGF5bG9hZCwgc3R1Yi0+bGVuICk7CisJaWYgKCB0aGVpcl9ja3N1bSA9PSBvdXJfY2tzdW0gKSB7CisJCXN0dWItPnRyYW5zLT5zZW5kICggIisiLCAxICk7CisJCWlmICggc3R1Yi0+bGVuID4gMCApIHsKKwkJCWdkYnN0dWJfcnhfcGFja2V0ICggc3R1YiApOworCQl9CisJfSBlbHNlIHsKKwkJc3R1Yi0+dHJhbnMtPnNlbmQgKCAiLSIsIDEgKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfc3RhdGVfd2FpdF9hY2sgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciBjaCApIHsKKwlpZiAoIGNoID09ICcrJyApIHsKKwkJc3R1Yi0+cGFyc2UgPSBnZGJzdHViX3N0YXRlX25ldzsKKwl9IGVsc2UgeworCQkvKiBUaGlzIHJldHJhbnNtaXQgaXMgdmVyeSBhZ2dyZXNzaXZlIGJ1dCBuZWNlc3NhcnkgdG8ga2VlcAorCQkgKiBpbiBzeW5jIHdpdGggR0RCLiAqLworCQlnZGJzdHViX3R4X3BhY2tldCAoIHN0dWIgKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdkYnN0dWJfcGFyc2UgKCBzdHJ1Y3QgZ2Ric3R1YiAqc3R1YiwgY2hhciBjaCApIHsKKwlzdHViLT5wYXJzZSAoIHN0dWIsIGNoICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2Ric3R1YiBzdHViID0geworCS5wYXJzZSA9IGdkYnN0dWJfc3RhdGVfbmV3Cit9OworCit2b2lkIGdkYnN0dWJfaGFuZGxlciAoIGludCBzaWdubywgZ2RicmVnX3QgKnJlZ3MgKSB7CisJY2hhciBwYWNrZXQgWyBTSVpFT0ZfUEFZTE9BRCArIDQgXTsKKwlzaXplX3QgbGVuLCBpOworCisJLyogQSB0cmFuc3BvcnQgbXVzdCBiZSBzZXQgdXAgKi8KKwlpZiAoICFzdHViLnRyYW5zICkgeworCQlyZXR1cm47CisJfQorCisJc3R1Yi5zaWdubyA9IHNpZ25vOworCXN0dWIucmVncyA9IHJlZ3M7CisJc3R1Yi5leGl0X2hhbmRsZXIgPSAwOworCWdkYnN0dWJfcmVwb3J0X3NpZ25hbCAoICZzdHViICk7CisJd2hpbGUgKCAhc3R1Yi5leGl0X2hhbmRsZXIgJiYgKCBsZW4gPSBzdHViLnRyYW5zLT5yZWN2ICggcGFja2V0LCBzaXplb2YgKCBwYWNrZXQgKSApICkgPiAwICkgeworCQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworCQkJZ2Ric3R1Yl9wYXJzZSAoICZzdHViLCBwYWNrZXQgWyBpIF0gKTsKKwkJfQorCX0KK30KKworc3RydWN0IGdkYl90cmFuc3BvcnQgKmZpbmRfZ2RiX3RyYW5zcG9ydCAoIGNvbnN0IGNoYXIgKm5hbWUgKSB7CisJc3RydWN0IGdkYl90cmFuc3BvcnQgKnRyYW5zOworCisJZm9yX2VhY2hfdGFibGVfZW50cnkgKCB0cmFucywgR0RCX1RSQU5TUE9SVFMgKSB7CisJCWlmICggc3RyY21wICggdHJhbnMtPm5hbWUsIG5hbWUgKSA9PSAwICkgeworCQkJcmV0dXJuIHRyYW5zOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCit2b2lkIGdkYnN0dWJfc3RhcnQgKCBzdHJ1Y3QgZ2RiX3RyYW5zcG9ydCAqdHJhbnMgKSB7CisJc3R1Yi50cmFucyA9IHRyYW5zOworCXN0dWIucGF5bG9hZCA9ICZzdHViLmJ1ZiBbIDEgXTsKKwlnZGJtYWNoX2JyZWFrcG9pbnQoKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvZ2RidWRwLmMgYi9ncHhlL3NyYy9jb3JlL2dkYnVkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmViMzgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2dkYnVkcC5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFN0ZWZhbiBIYWpub2N6aSA8c3RlZmFuaGFAZ21haWwuY29tPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbi5oPgorI2luY2x1ZGUgPGdweGUvaWZfYXJwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGdweGUvaXAuaD4KKyNpbmNsdWRlIDxncHhlL3VkcC5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9uYXAuaD4KKyNpbmNsdWRlIDxncHhlL2dkYnN0dWIuaD4KKyNpbmNsdWRlIDxncHhlL2dkYnVkcC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBHREIgb3ZlciBVRFAgdHJhbnNwb3J0CisgKgorICovCisKK2VudW0geworCURFRkFVTFRfUE9SVCA9IDQzNzcwLCAvKiBVRFAgbGlzdGVuIHBvcnQgKi8KK307CisKK3N0cnVjdCBnZGJfdHJhbnNwb3J0IHVkcF9nZGJfdHJhbnNwb3J0IF9fZ2RiX3RyYW5zcG9ydDsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CitzdGF0aWMgdWludDhfdCBkZXN0X2V0aFtFVEhfQUxFTl07CitzdGF0aWMgc3RydWN0IHNvY2thZGRyX2luIGRlc3RfYWRkcjsKK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gc291cmNlX2FkZHI7CisKK3N0YXRpYyB2b2lkIGdkYnVkcF9lbnN1cmVfbmV0ZGV2X29wZW4gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCS8qIFRoZSBkZXZpY2UgbWF5IGhhdmUgYmVlbiBjbG9zZWQgYmV0d2VlbiBicmVha3BvaW50cyAqLworCWFzc2VydCAoIG5ldGRldiApOworCW5ldGRldl9vcGVuICggbmV0ZGV2ICk7CisKKwkvKiBTdHJpY3RseSBzcGVha2luZywgd2UgbWF5IG5lZWQgdG8gY2xvc2UgdGhlIGRldmljZSB3aGVuIGxlYXZpbmcgdGhlIGludGVycnVwdCBoYW5kbGVyICovCit9CisKK3N0YXRpYyBzaXplX3QgZ2RidWRwX3JlY3YgKCBjaGFyICpidWYsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iOworCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKKwlzdHJ1Y3QgYXJwaGRyICphcnBoZHI7CisJc3RydWN0IGlwaGRyICppcGhkcjsKKwlzdHJ1Y3QgdWRwX2hlYWRlciAqdWRwaGRyOworCXNpemVfdCBwYXlsb2FkX2xlbjsKKworCWdkYnVkcF9lbnN1cmVfbmV0ZGV2X29wZW4gKCBuZXRkZXYgKTsKKworCWZvciAoIDsgOyApIHsKKwkJbmV0ZGV2X3BvbGwgKCBuZXRkZXYgKTsKKwkJd2hpbGUgKCAoIGlvYiA9IG5ldGRldl9yeF9kZXF1ZXVlICggbmV0ZGV2ICkgKSAhPSBOVUxMICkgeworCQkJLyogRXRoZXJuZXQgaGVhZGVyICovCisJCQlpZiAoIGlvYl9sZW4gKCBpb2IgKSA8IHNpemVvZiAoICpldGhoZHIgKSApIHsKKwkJCQlnb3RvIGJhZF9wYWNrZXQ7CisJCQl9CisJCQlldGhoZHIgPSBpb2ItPmRhdGE7CisJCQlpb2JfcHVsbCAoIGlvYiwgc2l6ZW9mICggKmV0aGhkciApICk7CisKKwkJCS8qIEhhbmRsZSBBUlAgcmVxdWVzdHMgc28gdGhlIGNsaWVudCBjYW4gZmluZCBvdXIgTUFDICovCisJCQlpZiAoIGV0aGhkci0+aF9wcm90b2NvbCA9PSBodG9ucyAoIEVUSF9QX0FSUCApICkgeworCQkJCWFycGhkciA9IGlvYi0+ZGF0YTsKKwkJCQlpZiAoIGlvYl9sZW4gKCBpb2IgKSA8IHNpemVvZiAoICphcnBoZHIgKSArIDIgKiAoIEVUSF9BTEVOICsgc2l6ZW9mICggc3RydWN0IGluX2FkZHIgKSApIHx8CisJCQkJCQlhcnBoZHItPmFyX2hyZCAhPSBodG9ucyAoIEFSUEhSRF9FVEhFUiApIHx8CisJCQkJCQlhcnBoZHItPmFyX3BybyAhPSBodG9ucyAoIEVUSF9QX0lQICkgfHwKKwkJCQkJCWFycGhkci0+YXJfaGxuICE9IEVUSF9BTEVOIHx8CisJCQkJCQlhcnBoZHItPmFyX3BsbiAhPSBzaXplb2YgKCBzdHJ1Y3QgaW5fYWRkciApIHx8CisJCQkJCQlhcnBoZHItPmFyX29wICE9IGh0b25zICggQVJQT1BfUkVRVUVTVCApIHx8CisJCQkJCQkqICggdWludDMyX3QgKiApIGFycF90YXJnZXRfcGEgKCBhcnBoZHIgKSAhPSBzb3VyY2VfYWRkci5zaW5fYWRkci5zX2FkZHIgKSB7CisJCQkJCWdvdG8gYmFkX3BhY2tldDsKKwkJCQl9CisKKwkJCQkvKiBHZW5lcmF0ZSBhbiBBUlAgcmVwbHkgKi8KKwkJCQlhcnBoZHItPmFyX29wID0gaHRvbnMgKCBBUlBPUF9SRVBMWSApOworCQkJCW1lbXN3YXAgKCBhcnBfc2VuZGVyX3BhICggYXJwaGRyICksIGFycF90YXJnZXRfcGEgKCBhcnBoZHIgKSwgc2l6ZW9mICggc3RydWN0IGluX2FkZHIgKSApOworCQkJCW1lbWNweSAoIGFycF90YXJnZXRfaGEgKCBhcnBoZHIgKSwgYXJwX3NlbmRlcl9oYSAoIGFycGhkciApLCBFVEhfQUxFTiApOworCQkJCW1lbWNweSAoIGFycF9zZW5kZXJfaGEgKCBhcnBoZHIgKSwgbmV0ZGV2LT5sbF9hZGRyLCBFVEhfQUxFTiApOworCisJCQkJLyogRml4IHVwIGV0aGVybmV0IGhlYWRlciAqLworCQkJCWV0aGhkciA9IGlvYl9wdXNoICggaW9iLCBzaXplb2YgKCAqZXRoaGRyICkgKTsKKwkJCQltZW1jcHkgKCBldGhoZHItPmhfZGVzdCwgZXRoaGRyLT5oX3NvdXJjZSwgRVRIX0FMRU4gKTsKKwkJCQltZW1jcHkgKCBldGhoZHItPmhfc291cmNlLCBuZXRkZXYtPmxsX2FkZHIsIEVUSF9BTEVOICk7CisKKwkJCQluZXRkZXZfdHggKCBuZXRkZXYsIGlvYiApOworCQkJCWNvbnRpbnVlOyAvKiBubyBuZWVkIHRvIGZyZWUgaW9iICovCisJCQl9CisKKwkJCWlmICggZXRoaGRyLT5oX3Byb3RvY29sICE9IGh0b25zICggRVRIX1BfSVAgKSApIHsKKwkJCQlnb3RvIGJhZF9wYWNrZXQ7CisJCQl9CisKKwkJCS8qIElQIGhlYWRlciAqLworCQkJaWYgKCBpb2JfbGVuICggaW9iICkgPCBzaXplb2YgKCAqaXBoZHIgKSApIHsKKwkJCQlnb3RvIGJhZF9wYWNrZXQ7CisJCQl9CisJCQlpcGhkciA9IGlvYi0+ZGF0YTsKKwkJCWlvYl9wdWxsICggaW9iLCBzaXplb2YgKCAqaXBoZHIgKSApOworCQkJaWYgKCBpcGhkci0+cHJvdG9jb2wgIT0gSVBfVURQIHx8IGlwaGRyLT5kZXN0LnNfYWRkciAhPSBzb3VyY2VfYWRkci5zaW5fYWRkci5zX2FkZHIgKSB7CisJCQkJZ290byBiYWRfcGFja2V0OworCQkJfQorCisJCQkvKiBVRFAgaGVhZGVyICovCisJCQlpZiAoIGlvYl9sZW4gKCBpb2IgKSA8IHNpemVvZiAoICp1ZHBoZHIgKSApIHsKKwkJCQlnb3RvIGJhZF9wYWNrZXQ7CisJCQl9CisJCQl1ZHBoZHIgPSBpb2ItPmRhdGE7CisJCQlpZiAoIHVkcGhkci0+ZGVzdCAhPSBzb3VyY2VfYWRkci5zaW5fcG9ydCApIHsKKwkJCQlnb3RvIGJhZF9wYWNrZXQ7CisJCQl9CisKKwkJCS8qIExlYXJuIHRoZSByZW1vdGUgY29ubmVjdGlvbiBkZXRhaWxzICovCisJCQltZW1jcHkgKCBkZXN0X2V0aCwgZXRoaGRyLT5oX3NvdXJjZSwgRVRIX0FMRU4gKTsKKwkJCWRlc3RfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpcGhkci0+c3JjLnNfYWRkcjsKKwkJCWRlc3RfYWRkci5zaW5fcG9ydCA9IHVkcGhkci0+c3JjOworCisJCQkvKiBQYXlsb2FkICovCisJCQlwYXlsb2FkX2xlbiA9IG50b2hzICggdWRwaGRyLT5sZW4gKTsKKwkJCWlmICggcGF5bG9hZF9sZW4gPCBzaXplb2YgKCAqdWRwaGRyICkgfHwgcGF5bG9hZF9sZW4gPiBpb2JfbGVuICggaW9iICkgKSB7CisJCQkJZ290byBiYWRfcGFja2V0OworCQkJfQorCQkJcGF5bG9hZF9sZW4gLT0gc2l6ZW9mICggKnVkcGhkciApOworCQkJaW9iX3B1bGwgKCBpb2IsIHNpemVvZiAoICp1ZHBoZHIgKSApOworCQkJaWYgKCBwYXlsb2FkX2xlbiA+IGxlbiApIHsKKwkJCQlnb3RvIGJhZF9wYWNrZXQ7CisJCQl9CisJCQltZW1jcHkgKCBidWYsIGlvYi0+ZGF0YSwgcGF5bG9hZF9sZW4gKTsKKworCQkJZnJlZV9pb2IgKCBpb2IgKTsKKwkJCXJldHVybiBwYXlsb2FkX2xlbjsKKworYmFkX3BhY2tldDoKKwkJCWZyZWVfaW9iICggaW9iICk7CisJCX0KKwkJY3B1X25hcCgpOworCX0KK30KKworc3RhdGljIHZvaWQgZ2RidWRwX3NlbmQgKCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iOworCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKKwlzdHJ1Y3QgaXBoZHIgKmlwaGRyOworCXN0cnVjdCB1ZHBfaGVhZGVyICp1ZHBoZHI7CisKKwkvKiBDaGVjayB0aGF0IHdlIGFyZSBjb25uZWN0ZWQgKi8KKwlpZiAoIGRlc3RfYWRkci5zaW5fcG9ydCA9PSAwICkgeworCQlyZXR1cm47CisJfQorCisJZ2RidWRwX2Vuc3VyZV9uZXRkZXZfb3BlbiAoIG5ldGRldiApOworCisJaW9iID0gYWxsb2NfaW9iICggc2l6ZW9mICggKmV0aGhkciApICsgc2l6ZW9mICggKmlwaGRyICkgKyBzaXplb2YgKCAqdWRwaGRyICkgKyBsZW4gKTsKKwlpZiAoICFpb2IgKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBQYXlsb2FkICovCisJaW9iX3Jlc2VydmUgKCBpb2IsIHNpemVvZiAoICpldGhoZHIgKSArIHNpemVvZiAoICppcGhkciApICsgc2l6ZW9mICggKnVkcGhkciApICk7CisJbWVtY3B5ICggaW9iX3B1dCAoIGlvYiwgbGVuICksIGJ1ZiwgbGVuICk7CisKKwkvKiBVRFAgaGVhZGVyICovCisJdWRwaGRyID0gaW9iX3B1c2ggKCBpb2IsIHNpemVvZiAoICp1ZHBoZHIgKSApOworCXVkcGhkci0+c3JjID0gc291cmNlX2FkZHIuc2luX3BvcnQ7CisJdWRwaGRyLT5kZXN0ID0gZGVzdF9hZGRyLnNpbl9wb3J0OworCXVkcGhkci0+bGVuID0gaHRvbnMgKCBpb2JfbGVuICggaW9iICkgKTsKKwl1ZHBoZHItPmNoa3N1bSA9IDA7IC8qIG9wdGlvbmFsIGFuZCB3ZSBhcmUgbm90IHVzaW5nIGl0ICovCisKKwkvKiBJUCBoZWFkZXIgKi8KKwlpcGhkciA9IGlvYl9wdXNoICggaW9iLCBzaXplb2YgKCAqaXBoZHIgKSApOworCW1lbXNldCAoIGlwaGRyLCAwLCBzaXplb2YgKCAqaXBoZHIgKSApOworCWlwaGRyLT52ZXJoZHJsZW4gPSAoIElQX1ZFUiB8ICggc2l6ZW9mICggKmlwaGRyICkgLyA0ICkgKTsKKwlpcGhkci0+c2VydmljZSA9IElQX1RPUzsKKwlpcGhkci0+bGVuID0gaHRvbnMgKCBpb2JfbGVuICggaW9iICkgKTsJCisJaXBoZHItPnR0bCA9IElQX1RUTDsKKwlpcGhkci0+cHJvdG9jb2wgPSBJUF9VRFA7CisJaXBoZHItPmRlc3Quc19hZGRyID0gZGVzdF9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwlpcGhkci0+c3JjLnNfYWRkciA9IHNvdXJjZV9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwlpcGhkci0+Y2hrc3VtID0gdGNwaXBfY2hrc3VtICggaXBoZHIsIHNpemVvZiAoICppcGhkciApICk7CisKKwkvKiBFdGhlcm5ldCBoZWFkZXIgKi8KKwlldGhoZHIgPSBpb2JfcHVzaCAoIGlvYiwgc2l6ZW9mICggKmV0aGhkciApICk7CisJbWVtY3B5ICggZXRoaGRyLT5oX2Rlc3QsIGRlc3RfZXRoLCBFVEhfQUxFTiApOworCW1lbWNweSAoIGV0aGhkci0+aF9zb3VyY2UsIG5ldGRldi0+bGxfYWRkciwgRVRIX0FMRU4gKTsKKwlldGhoZHItPmhfcHJvdG9jb2wgPSBodG9ucyAoIEVUSF9QX0lQICk7CisKKwluZXRkZXZfdHggKCBuZXRkZXYsIGlvYiApOworfQorCitzdHJ1Y3QgZ2RiX3RyYW5zcG9ydCAqZ2RidWRwX2NvbmZpZ3VyZSAoIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciApIHsKKwlzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzOworCisJLyogUmVsZWFzZSBvbGQgbmV0d29yayBkZXZpY2UgKi8KKwluZXRkZXZfcHV0ICggbmV0ZGV2ICk7CisKKwluZXRkZXYgPSBmaW5kX25ldGRldiAoIG5hbWUgKTsKKwlpZiAoICFuZXRkZXYgKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEhvbGQgbmV0d29yayBkZXZpY2UgKi8KKwluZXRkZXZfZ2V0ICggbmV0ZGV2ICk7CisKKwkvKiBTb3VyY2UgVURQIHBvcnQgKi8KKwlzb3VyY2VfYWRkci5zaW5fcG9ydCA9ICggYWRkciAmJiBhZGRyLT5zaW5fcG9ydCApID8gYWRkci0+c2luX3BvcnQgOiBodG9ucyAoIERFRkFVTFRfUE9SVCApOworCisJLyogU291cmNlIElQIGFkZHJlc3MgKi8KKwlpZiAoIGFkZHIgJiYgYWRkci0+c2luX2FkZHIuc19hZGRyICkgeworCQlzb3VyY2VfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBhZGRyLT5zaW5fYWRkci5zX2FkZHI7CisJfSBlbHNlIHsKKwkJc2V0dGluZ3MgPSBuZXRkZXZfc2V0dGluZ3MgKCBuZXRkZXYgKTsKKwkJZmV0Y2hfaXB2NF9zZXR0aW5nICggc2V0dGluZ3MsICZpcF9zZXR0aW5nLCAmc291cmNlX2FkZHIuc2luX2FkZHIgKTsKKwkJaWYgKCBzb3VyY2VfYWRkci5zaW5fYWRkci5zX2FkZHIgPT0gMCApIHsKKwkJCW5ldGRldl9wdXQgKCBuZXRkZXYgKTsKKwkJCW5ldGRldiA9IE5VTEw7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiAmdWRwX2dkYl90cmFuc3BvcnQ7Cit9CisKK3N0YXRpYyBpbnQgZ2RidWRwX2luaXQgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJaWYgKCBhcmdjICE9IDEgKSB7CisJCXByaW50ZiAoICJ1ZHA6IG1pc3NpbmcgPGludGVyZmFjZT4gYXJndW1lbnRcbiIgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCAhZ2RidWRwX2NvbmZpZ3VyZSAoIGFyZ3ZbMF0sIE5VTEwgKSApIHsKKwkJcHJpbnRmICggIiVzOiBkZXZpY2UgZG9lcyBub3QgZXhpc3Qgb3IgaGFzIG5vIElQIGFkZHJlc3NcbiIsIGFyZ3ZbMF0gKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ2RiX3RyYW5zcG9ydCB1ZHBfZ2RiX3RyYW5zcG9ydCBfX2dkYl90cmFuc3BvcnQgPSB7CisJLm5hbWUgPSAidWRwIiwKKwkuaW5pdCA9IGdkYnVkcF9pbml0LAorCS5zZW5kID0gZ2RidWRwX3NlbmQsCisJLnJlY3YgPSBnZGJ1ZHBfcmVjdiwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2dldGtleS5jIGIvZ3B4ZS9zcmMvY29yZS9nZXRrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmQwNzRjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9nZXRrZXkuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9rZXlzLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorCisvKiogQGZpbGUKKyAqCisgKiBTcGVjaWFsIGtleSBpbnRlcnByZXRhdGlvbgorICoKKyAqLworCisjZGVmaW5lIEdFVEtFWV9USU1FT1VUICggVElDS1NfUEVSX1NFQyAvIDQgKQorCisvKioKKyAqIFJlYWQgY2hhcmFjdGVyIGZyb20gY29uc29sZSBpZiBhdmFpbGFibGUgd2l0aGluIHRpbWVvdXQgcGVyaW9kCisgKgorICogQHYgdGltZW91dAkJVGltZW91dCBwZXJpb2QsIGluIHRpY2tzCisgKiBAcmV0IGNoYXJhY3RlcglDaGFyYWN0ZXIgcmVhZCBmcm9tIGNvbnNvbGUKKyAqLworc3RhdGljIGludCBnZXRjaGFyX3RpbWVvdXQgKCB1bnNpZ25lZCBsb25nIHRpbWVvdXQgKSB7CisJdW5zaWduZWQgbG9uZyBleHBpcnkgPSAoIGN1cnJ0aWNrcygpICsgdGltZW91dCApOworCisJd2hpbGUgKCBjdXJydGlja3MoKSA8IGV4cGlyeSApIHsKKwkJc3RlcCgpOworCQlpZiAoIGlza2V5KCkgKQorCQkJcmV0dXJuIGdldGNoYXIoKTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogR2V0IHNpbmdsZSBrZXlwcmVzcworICoKKyAqIEByZXQga2V5CQlLZXkgcHJlc3NlZAorICoKKyAqIFRoZSByZXR1cm5lZCBrZXkgd2lsbCBiZSBhbiBBU0NJSSB2YWx1ZSBvciBhIEtFWV9YWFggc3BlY2lhbAorICogY29uc3RhbnQuICBUaGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSBnZXRjaGFyKCkgaW4gdGhhdCBnZXRjaGFyKCkKKyAqIHdpbGwgcmV0dXJuICJzcGVjaWFsIiBrZXlzIChlLmcuIGN1cnNvciBrZXlzKSBhcyBhIHNlcmllcyBvZgorICogY2hhcmFjdGVycyBmb3JtaW5nIGFuIEFOU0kgZXNjYXBlIHNlcXVlbmNlLgorICovCitpbnQgZ2V0a2V5ICggdm9pZCApIHsKKwlpbnQgY2hhcmFjdGVyOworCXVuc2lnbmVkIGludCBuID0gMDsKKworCWNoYXJhY3RlciA9IGdldGNoYXIoKTsKKwlpZiAoIGNoYXJhY3RlciAhPSBFU0MgKQorCQlyZXR1cm4gY2hhcmFjdGVyOworCisJd2hpbGUgKCAoIGNoYXJhY3RlciA9IGdldGNoYXJfdGltZW91dCAoIEdFVEtFWV9USU1FT1VUICkgKSA+PSAwICkgeworCQlpZiAoIGNoYXJhY3RlciA9PSAnWycgKQorCQkJY29udGludWU7CisJCWlmICggaXNkaWdpdCAoIGNoYXJhY3RlciApICkgeworCQkJbiA9ICggKCBuICogMTAgKSArICggY2hhcmFjdGVyIC0gJzAnICkgKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICggY2hhcmFjdGVyID49IDB4NDAgKQorCQkJcmV0dXJuIEtFWV9BTlNJICggbiwgY2hhcmFjdGVyICk7CisJfQorCisJcmV0dXJuIEVTQzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvZ2V0b3B0LmMgYi9ncHhlL3NyYy9jb3JlL2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2N2RhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2dldG9wdC5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworLyoqIEBmaWxlCisgKgorICogUGFyc2UgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAqCisgKi8KKworLyoqCisgKiBPcHRpb24gYXJndW1lbnQKKyAqCisgKiBUaGlzIHdpbGwgcG9pbnQgdG8gdGhlIGFyZ3VtZW50IGZvciB0aGUgbW9zdCByZWNlbnRseSByZXR1cm5lZAorICogb3B0aW9uLCBpZiBhcHBsaWNhYmxlLgorICovCitjaGFyICpvcHRhcmc7CisKKy8qKgorICogQ3VycmVudCBvcHRpb24gaW5kZXgKKyAqCisgKiBUaGlzIGlzIGFuIGluZGV4IGludG8gdGhlIGFyZ3ZbXSBhcnJheS4gIFdoZW4gZ2V0b3B0KCkgcmV0dXJucyAtMSwKKyAqIEBjIG9wdGluZCBpcyB0aGUgaW5kZXggdG8gdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBub3QgYW4gb3B0aW9uLgorICovCitpbnQgb3B0aW5kOworCisvKioKKyAqIEN1cnJlbnQgb3B0aW9uIGNoYXJhY3RlciBpbmRleAorICoKKyAqIFRoaXMgaXMgYW4gaW5kZXggaW50byB0aGUgY3VycmVudCBlbGVtZW50IG9mIGFyZ3ZbXS4KKyAqLworaW50IG5leHRjaGFyOworCisvKioKKyAqIFVucmVjb2duaXNlZCBvcHRpb24KKyAqCisgKiBXaGVuIGFuIHVucmVjb2duaXNlZCBvcHRpb24gaXMgZW5jb3VudGVyZWQsIHRoZSBhY3R1YWwgb3B0aW9uCisgKiBjaGFyYWN0ZXIgaXMgc3RvcmVkIGluIEBjIG9wdG9wdC4KKyAqLworaW50IG9wdG9wdDsKKworLyoqCisgKiBHZXQgb3B0aW9uIGFyZ3VtZW50IGZyb20gYXJndltdIGFycmF5CisgKgorICogQHYgYXJnYwkJQXJndW1lbnQgY291bnQKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqIEByZXQgYXJndW1lbnQJT3B0aW9uIGFyZ3VtZW50LCBvciBOVUxMCisgKgorICogR3JhYiB0aGUgbmV4dCBlbGVtZW50IG9mIGFyZ3ZbXSwgaWYgaXQgZXhpc3RzIGFuZCBpcyBub3QgYW4gb3B0aW9uLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGdldF9hcmd2X2FyZ3VtZW50ICggaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10gKSB7CisJY2hhciAqYXJnOworCisJLyogRG9uJ3Qgb3ZlcnJ1biBhcmd2W10gKi8KKwlpZiAoIG9wdGluZCA+PSBhcmdjICkKKwkJcmV0dXJuIE5VTEw7CisJYXJnID0gYXJndltvcHRpbmRdOworCisJLyogSWYgbmV4dCBhcmd2IGVsZW1lbnQgaXMgYW4gb3B0aW9uLCB0aGVuIGl0J3Mgbm90IHVzYWJsZSBhcworCSAqIGFuIGFyZ3VtZW50LgorCSAqLworCWlmICggKmFyZyA9PSAnLScgKQorCQlyZXR1cm4gTlVMTDsKKworCS8qKiBDb25zdW1lIHRoaXMgYXJndiBlbGVtZW50LCBhbmQgcmV0dXJuIGl0ICovCisJb3B0aW5kKys7CisJcmV0dXJuIGFyZzsKK30KKworLyoqCisgKiBNYXRjaCBsb25nIG9wdGlvbgorICoKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAdiBvcHR0ZXh0CQlPcHRpb24gdGV4dCB3aXRoaW4gY3VycmVudCBhcmd2W10gZWxlbWVudAorICogQHYgbG9uZ29wdAkJTG9uZyBvcHRpb24gc3BlY2lmaWNhdGlvbgorICogQHJldCBvcHRpb24JCU9wdGlvbiB0byByZXR1cm4gZnJvbSBnZXRvcHQoKQorICogQHJldCBtYXRjaGVkCQlGb3VuZCBhIG1hdGNoIGZvciB0aGlzIGxvbmcgb3B0aW9uCisgKi8KK3N0YXRpYyBpbnQgbWF0Y2hfbG9uZ19vcHRpb24gKCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpvcHR0ZXh0LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdvcHQsIGludCAqb3B0aW9uICkgeworCXNpemVfdCBvcHRsZW47CisJY29uc3QgY2hhciAqYXJndW1lbnQgPSBOVUxMOworCisJLyogQ29tcGFyZSBvcHRpb24gbmFtZSAqLworCW9wdGxlbiA9IHN0cmxlbiAoIGxvbmdvcHQtPm5hbWUgKTsKKwlpZiAoIHN0cm5jbXAgKCBvcHR0ZXh0LCBsb25nb3B0LT5uYW1lLCBvcHRsZW4gKSAhPSAwICkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBmb3IgaW5saW5lIGFyZ3VtZW50ICovCisJaWYgKCBvcHR0ZXh0W29wdGxlbl0gPT0gJz0nICkgeworCQlhcmd1bWVudCA9ICZvcHR0ZXh0WyBvcHRsZW4gKyAxIF07CisJfSBlbHNlIGlmICggb3B0dGV4dFtvcHRsZW5dICkgeworCQkvKiBMb25nIG9wdGlvbiB3aXRoIHRyYWlsaW5nIGdhcmJhZ2UgLSBubyBtYXRjaCAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDb25zdW1lIHRoaXMgYXJndiBlbGVtZW50ICovCisJb3B0aW5kKys7CisKKwkvKiBJZiB3ZSB3YW50IGFuIGFyZ3VtZW50IGJ1dCBkb24ndCBoYXZlIG9uZSB5ZXQsIHRyeSB0byBncmFiCisJICogdGhlIG5leHQgYXJndiBlbGVtZW50CisJICovCisJaWYgKCAoIGxvbmdvcHQtPmhhc19hcmcgIT0gbm9fYXJndW1lbnQgKSAmJiAoICEgYXJndW1lbnQgKSApCisJCWFyZ3VtZW50ID0gZ2V0X2FyZ3ZfYXJndW1lbnQgKCBhcmdjLCBhcmd2ICk7CisKKwkvKiBJZiB3ZSBuZWVkIGFuIGFyZ3VtZW50IGJ1dCBkb24ndCBoYXZlIG9uZSwgc3VsayAqLworCWlmICggKCBsb25nb3B0LT5oYXNfYXJnID09IHJlcXVpcmVkX2FyZ3VtZW50ICkgJiYgKCAhIGFyZ3VtZW50ICkgKSB7CisJCXByaW50ZiAoICJPcHRpb24gXCIlc1wiIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJIGxvbmdvcHQtPm5hbWUgKTsKKwkJKm9wdGlvbiA9ICc6JzsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogSWYgd2UgaGF2ZSBhbiBhcmd1bWVudCB3aGVyZSB3ZSBzaG91bGRuJ3QgaGF2ZSBvbmUsIHN1bGsgKi8KKwlpZiAoICggbG9uZ29wdC0+aGFzX2FyZyA9PSBub19hcmd1bWVudCApICYmIGFyZ3VtZW50ICkgeworCQlwcmludGYgKCAiT3B0aW9uIFwiJXNcIiB0YWtlcyBubyBhcmd1bWVudFxuIiwgbG9uZ29wdC0+bmFtZSApOworCQkqb3B0aW9uID0gJzonOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTdG9yZSB2YWx1ZXMgYW5kIHJldHVybiBzdWNjZXNzICovCisJb3B0YXJnID0gKCBjaGFyICogKSBhcmd1bWVudDsKKwlpZiAoIGxvbmdvcHQtPmZsYWcgKSB7CisJCSoobG9uZ29wdC0+ZmxhZykgPSBsb25nb3B0LT52YWw7CisJCSpvcHRpb24gPSAwOworCX0gZWxzZSB7CisJCSpvcHRpb24gPSBsb25nb3B0LT52YWw7CisJfQorCXJldHVybiAxOworfQorCisvKioKKyAqIE1hdGNoIHNob3J0IG9wdGlvbgorICoKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAdiBvcHR0ZXh0CQlPcHRpb24gdGV4dCB3aXRoaW4gY3VycmVudCBhcmd2W10gZWxlbWVudAorICogQHYgc2hvcnRvcHQJCU9wdGlvbiBjaGFyYWN0ZXIgZnJvbSBvcHRpb24gc3BlY2lmaWNhdGlvbgorICogQHJldCBvcHRpb24JCU9wdGlvbiB0byByZXR1cm4gZnJvbSBnZXRvcHQoKQorICogQHJldCBtYXRjaGVkCQlGb3VuZCBhIG1hdGNoIGZvciB0aGlzIHNob3J0IG9wdGlvbgorICovCitzdGF0aWMgaW50IG1hdGNoX3Nob3J0X29wdGlvbiAoIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLAorCQkJCWNvbnN0IGNoYXIgKm9wdHRleHQsIGludCBzaG9ydG9wdCwKKwkJCQllbnVtIGdldG9wdF9hcmd1bWVudF9yZXF1aXJlbWVudCBoYXNfYXJnLAorCQkJCWludCAqb3B0aW9uICkgeworCWNvbnN0IGNoYXIgKmFyZ3VtZW50ID0gTlVMTDsKKworCS8qIENvbXBhcmUgb3B0aW9uIGNoYXJhY3RlciAqLworCWlmICggKm9wdHRleHQgIT0gc2hvcnRvcHQgKQorCQlyZXR1cm4gMDsKKworCS8qIENvbnN1bWUgb3B0aW9uIGNoYXJhY3RlciAqLworCW9wdHRleHQrKzsKKwluZXh0Y2hhcisrOworCWlmICggKm9wdHRleHQgKSB7CisJCWlmICggaGFzX2FyZyAhPSBub19hcmd1bWVudCApIHsKKwkJCS8qIENvbnN1bWUgcmVtYWluZGVyIG9mIGVsZW1lbnQgYXMgaW5saW5lIGFyZ3VtZW50ICovCisJCQlhcmd1bWVudCA9IG9wdHRleHQ7CisJCQlvcHRpbmQrKzsKKwkJCW5leHRjaGFyID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFJlYWNoZWQgZW5kIG9mIGFyZ3YgZWxlbWVudCAqLworCQlvcHRpbmQrKzsKKwkJbmV4dGNoYXIgPSAwOworCX0KKworCS8qIElmIHdlIHdhbnQgYW4gYXJndW1lbnQgYnV0IGRvbid0IGhhdmUgb25lIHlldCwgdHJ5IHRvIGdyYWIKKwkgKiB0aGUgbmV4dCBhcmd2IGVsZW1lbnQKKwkgKi8KKwlpZiAoICggaGFzX2FyZyAhPSBub19hcmd1bWVudCApICYmICggISBhcmd1bWVudCApICkKKwkJYXJndW1lbnQgPSBnZXRfYXJndl9hcmd1bWVudCAoIGFyZ2MsIGFyZ3YgKTsKKworCS8qIElmIHdlIG5lZWQgYW4gYXJndW1lbnQgYnV0IGRvbid0IGhhdmUgb25lLCBzdWxrICovCisJaWYgKCAoIGhhc19hcmcgPT0gcmVxdWlyZWRfYXJndW1lbnQgKSAmJiAoICEgYXJndW1lbnQgKSApIHsKKwkJcHJpbnRmICggIk9wdGlvbiBcIiVjXCIgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIsIHNob3J0b3B0ICk7CisJCSpvcHRpb24gPSAnOic7CisJCXJldHVybiAxOworCX0KKworCS8qIFN0b3JlIHZhbHVlcyBhbmQgcmV0dXJuIHN1Y2Nlc3MgKi8KKwlvcHRhcmcgPSAoIGNoYXIgKiApIGFyZ3VtZW50OworCSpvcHRpb24gPSBzaG9ydG9wdDsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBQYXJzZSBjb21tYW5kLWxpbmUgb3B0aW9ucworICoKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAdiBvcHRzdHJpbmcJCU9wdGlvbiBzcGVjaWZpY2F0aW9uIHN0cmluZworICogQHYgbG9uZ29wdHMJCUxvbmcgb3B0aW9uIHNwZWNpZmljYXRpb24gdGFibGUKKyAqIEByZXQgbG9uZ2luZGV4CUluZGV4IG9mIGxvbmcgb3B0aW9uIChvciBOVUxMKQorICogQHJldCBvcHRpb24JCU9wdGlvbiBmb3VuZCwgb3IgLTEgZm9yIG5vIG1vcmUgb3B0aW9ucworICoKKyAqIE5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QgYXJyYW5nZSBmb3IgcmVzZXRfZ2V0b3B0KCkgdG8gYmUgY2FsbGVkCisgKiBiZWZvcmUgZWFjaCBzZXQgb2YgY2FsbHMgdG8gZ2V0b3B0X2xvbmcoKS4gIEluIEV0aGVyYm9vdCwgdGhpcyBpcworICogZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IGV4ZWN2KCkuCisgKi8KK2ludCBnZXRvcHRfbG9uZyAoIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBjb25zdCBjaGFyICpvcHRzdHJpbmcsCisJCSAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZGV4ICkgeworCWNvbnN0IGNoYXIgKm9wdHRleHQgPSBhcmd2W29wdGluZF07CisJY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdDsKKwlpbnQgc2hvcnRvcHQ7CisJZW51bSBnZXRvcHRfYXJndW1lbnRfcmVxdWlyZW1lbnQgaGFzX2FyZzsKKwlpbnQgb3B0aW9uOworCisJLyogQ2hlY2sgZm9yIGVuZCBvZiBhcmd2IGFycmF5ICovCisJaWYgKCBvcHRpbmQgPj0gYXJnYyApCisJCXJldHVybiAtMTsKKworCS8qIENoZWNrIGZvciBlbmQgb2Ygb3B0aW9ucyAqLworCWlmICggKihvcHR0ZXh0KyspICE9ICctJyApCisJCXJldHVybiAtMTsKKworCS8qIENoZWNrIGZvciBsb25nIG9wdGlvbnMgKi8KKwlpZiAoICoob3B0dGV4dCsrKSA9PSAnLScgKSB7CisJCWZvciAoIGxvbmdvcHQgPSBsb25nb3B0cyA7IGxvbmdvcHQtPm5hbWUgOyBsb25nb3B0KysgKSB7CisJCQlpZiAoICEgbWF0Y2hfbG9uZ19vcHRpb24gKCBhcmdjLCBhcmd2LCBvcHR0ZXh0LAorCQkJCQkJICAgbG9uZ29wdCwgJm9wdGlvbiApICkKKwkJCQljb250aW51ZTsKKwkJCWlmICggbG9uZ2luZGV4ICkKKwkJCQkqbG9uZ2luZGV4ID0gKCBsb25nb3B0IC0gbG9uZ29wdHMgKTsKKwkJCXJldHVybiBvcHRpb247CisJCX0KKwkJb3B0b3B0ID0gJz8nOworCQlwcmludGYgKCAiVW5yZWNvZ25pc2VkIG9wdGlvbiBcIi0tJXNcIlxuIiwgb3B0dGV4dCApOworCQlyZXR1cm4gJz8nOworCX0KKworCS8qIENoZWNrIGZvciBzaG9ydCBvcHRpb25zICovCisJaWYgKCBuZXh0Y2hhciA8IDEgKQorCQluZXh0Y2hhciA9IDE7CisJb3B0dGV4dCA9ICggYXJndltvcHRpbmRdICsgbmV4dGNoYXIgKTsKKwl3aGlsZSAoICggc2hvcnRvcHQgPSAqKG9wdHN0cmluZysrKSApICkgeworCQloYXNfYXJnID0gbm9fYXJndW1lbnQ7CisJCXdoaWxlICggKm9wdHN0cmluZyA9PSAnOicgKSB7CisJCQloYXNfYXJnKys7CisJCQlvcHRzdHJpbmcrKzsKKwkJfQorCQlpZiAoIG1hdGNoX3Nob3J0X29wdGlvbiAoIGFyZ2MsIGFyZ3YsIG9wdHRleHQsIHNob3J0b3B0LAorCQkJCQkgIGhhc19hcmcsICZvcHRpb24gKSApIHsKKwkJCXJldHVybiBvcHRpb247CisJCX0KKwl9CisJb3B0b3B0ID0gKm9wdHRleHQ7CisJcHJpbnRmICggIlVucmVjb2duaXNlZCBvcHRpb24gXCItJWNcIlxuIiwgb3B0b3B0ICk7CisJcmV0dXJuICc/JzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvaHcuYyBiL2dweGUvc3JjL2NvcmUvaHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTYwNGVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9ody5jCkBAIC0wLDAgKzEsNzQgQEAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvcmVmY250Lmg+CisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisKKy8qKiBAZmlsZQorICoKKyAqICJIZWxsbyBXb3JsZCIgZGF0YSBzb3VyY2UKKyAqCisgKi8KKworc3RydWN0IGh3IHsKKwlzdHJ1Y3QgcmVmY250IHJlZmNudDsKKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgeGZlcjsKKwlzdHJ1Y3QgcHJvY2VzcyBwcm9jZXNzOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgaHdfbXNnW10gPSAiSGVsbG8gd29ybGQhXG4iOworCitzdGF0aWMgdm9pZCBod19maW5pc2hlZCAoIHN0cnVjdCBodyAqaHcsIGludCByYyApIHsKKwl4ZmVyX251bGxpZnkgKCAmaHctPnhmZXIgKTsKKwl4ZmVyX2Nsb3NlICggJmh3LT54ZmVyLCByYyApOworCXByb2Nlc3NfZGVsICggJmh3LT5wcm9jZXNzICk7Cit9CisKK3N0YXRpYyB2b2lkIGh3X3hmZXJfY2xvc2UgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGludCByYyApIHsKKwlzdHJ1Y3QgaHcgKmh3ID0gY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IGh3LCB4ZmVyICk7CisKKwlod19maW5pc2hlZCAoIGh3LCByYyApOworfQorCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgaHdfeGZlcl9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSBod194ZmVyX2Nsb3NlLAorCS52cmVkaXJlY3QJPSBpZ25vcmVfeGZlcl92cmVkaXJlY3QsCisJLndpbmRvdwkJPSB1bmxpbWl0ZWRfeGZlcl93aW5kb3csCisJLmFsbG9jX2lvYgk9IGRlZmF1bHRfeGZlcl9hbGxvY19pb2IsCisJLmRlbGl2ZXJfaW9iCT0geGZlcl9kZWxpdmVyX2FzX3JhdywKKwkuZGVsaXZlcl9yYXcJPSBpZ25vcmVfeGZlcl9kZWxpdmVyX3JhdywKK307CisKK3N0YXRpYyB2b2lkIGh3X3N0ZXAgKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcyApIHsKKwlzdHJ1Y3QgaHcgKmh3ID0gY29udGFpbmVyX29mICggcHJvY2Vzcywgc3RydWN0IGh3LCBwcm9jZXNzICk7CisJaW50IHJjOworCisJaWYgKCB4ZmVyX3dpbmRvdyAoICZody0+eGZlciApICkgeworCQlyYyA9IHhmZXJfZGVsaXZlcl9yYXcgKCAmaHctPnhmZXIsIGh3X21zZywgc2l6ZW9mICggaHdfbXNnICkgKTsKKwkJaHdfZmluaXNoZWQgKCBodywgcmMgKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHdfb3BlbiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgc3RydWN0IHVyaSAqdXJpIF9fdW51c2VkICkgeworCXN0cnVjdCBodyAqaHc7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBzdHJ1Y3R1cmUgKi8KKwlodyA9IHphbGxvYyAoIHNpemVvZiAoICpodyApICk7CisJaWYgKCAhIGh3ICkKKwkJcmV0dXJuIC1FTk9NRU07CisJeGZlcl9pbml0ICggJmh3LT54ZmVyLCAmaHdfeGZlcl9vcGVyYXRpb25zLCAmaHctPnJlZmNudCApOworCXByb2Nlc3NfaW5pdCAoICZody0+cHJvY2VzcywgaHdfc3RlcCwgJmh3LT5yZWZjbnQgKTsKKworCS8qIEF0dGFjaCBwYXJlbnQgaW50ZXJmYWNlLCBtb3J0YWxpc2Ugc2VsZiwgYW5kIHJldHVybiAqLworCXhmZXJfcGx1Z19wbHVnICggJmh3LT54ZmVyLCB4ZmVyICk7CisJcmVmX3B1dCAoICZody0+cmVmY250ICk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB1cmlfb3BlbmVyIGh3X3VyaV9vcGVuZXIgX191cmlfb3BlbmVyID0geworCS5zY2hlbWUgPSAiaHciLAorCS5vcGVuID0gaHdfb3BlbiwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2k4MjM2NS5jIGIvZ3B4ZS9zcmMvY29yZS9pODIzNjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY2MzllCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9pODIzNjUuYwpAQCAtMCwwICsxLDY1NiBAQAorI2lmZGVmIENPTkZJR19QQ01DSUEKKworLyoKKyAqCWk4MjM2NS5jCisgKglTdXBwb3J0IGZvciBpODIzNjUgYW5kIHNpbWlsYXIgSVNBLXRvLVBDTUNJQSBicmlkZ2VzCisgKgorICoJVGFrZW4gZnJvbSBMaW51eCBrZXJuZWwgc291cmNlcywgZGlzdHJpYnV0ZWQgdW5kZXIgR1BMMgorICoKKyAqICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCisgKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogICBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgdGhlIG9yaWdpbmFsIGNvZGUgaXMgRGF2aWQgQS4gSGluZHMKKyAqICAgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKKyAqICAgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICoJUG9ydGVkIGJ5OiBBbnNlbG0gTWFydGluIEhvZmZtZWlzdGVyLCBTdG9ja2hvbG0gUHJvamVrdCBDb21wdXRlci1TZXJ2aWNlLCBTYW5rdCBBdWd1c3Rpbi9Cb25uLCBHRVJNQU5ZCisgKi8KKworLyoKKyAqCisgKgorICoJCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJUExFQVNFIERPIE5PVCBZRVQgV09SSyBPTiBUSElTCisgKgkJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUknbSBzdGlsbCBmaXhpbmcgaXQgdXAgb24gZXZlcnkgZW5kLCBzbyB3ZSBtb3N0IHByb2JhYmx5IHdvdWxkIGludGVyZmVyZQorICoJYXQgc29tZSBwb2ludC4gSWYgdGhlcmUncyBhbnl0aGluZyBvYnZpb3VzIG9yIGJldHRlciwgbm90LXNvLW9idmlvdXMsCisgKglwbGVhc2UgY29udGFjdCBtZSBieSBlLW1haWw6IGFuc2VsbSAoQVQpIGhvZmZtZWlzdGVyIChET1QpIGJlICAgKlRIQU5LUyoKKyAqLworI2luY2x1ZGUgIi4uL2luY2x1ZGUvcGNtY2lhLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9wY21jaWEtb3B0cy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvaTgyMzY1LmgiCisKKyNpZm5kZWYgQ09ORklHX0lTQQorI2Vycm9yCVBDTUNJQV9JODIzNjUgb25seSB3b3JrcyB3aXRoIElTQSBkZWZpbmVkIC0gc2V0IENPTkZJR19JU0EKKyNlbmRpZgorCit0eXBlZGVmIGVudW0gcGNpY19pZCB7CisgICAgSVNfSTgyMzY1QSwgSVNfSTgyMzY1QiwgSVNfSTgyMzY1REYsCisgICAgSVNfSUJNLCBJU19SRjVDeDk2LCBJU19WTFNJLCBJU19WRzQ2OCwgSVNfVkc0NjksCisgICAgSVNfUEQ2NzEwLCBJU19QRDY3MlgsIElTX1ZUODNDNDY5LAorfSBwY2ljX2lkOworCisvKiBGbGFncyBmb3IgY2xhc3NpZnlpbmcgZ3JvdXBzIG9mIGNvbnRyb2xsZXJzICovCisjZGVmaW5lIElTX1ZBREVNICAgICAgICAweDAwMDEKKyNkZWZpbmUgSVNfQ0lSUlVTICAgICAgIDB4MDAwMgorI2RlZmluZSBJU19USSAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIElTX08yTUlDUk8gICAgICAweDAwMDgKKyNkZWZpbmUgSVNfVklBICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJU19UT1BJQyAgICAgICAgMHgwMDIwCisjZGVmaW5lIElTX1JJQ09IICAgICAgICAweDAwNDAKKyNkZWZpbmUgSVNfVU5LTk9XTiAgICAgIDB4MDQwMAorI2RlZmluZSBJU19WR19QV1IgICAgICAgMHgwODAwCisjZGVmaW5lIElTX0RGX1BXUiAgICAgICAweDEwMDAKKyNkZWZpbmUgSVNfUENJICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBJU19BTElWRSAgICAgICAgMHg4MDAwCisKK3R5cGVkZWYgc3RydWN0IHBjaWNfdCB7CisgICAgY2hhciAgICAgICAgICAgICAgICAqbmFtZTsKKyAgICB1X3Nob3J0ICAgICAgICAgICAgIGZsYWdzOworfSBwY2ljX3Q7CisKK3N0YXRpYyBwY2ljX3QgcGNpY1tdID0geworICAgIHsgIkludGVsIGk4MjM2NXNsIEEgc3RlcCIsIDAgfSwKKyAgICB7ICJJbnRlbCBpODIzNjVzbCBCIHN0ZXAiLCAwIH0sCisgICAgeyAiSW50ZWwgaTgyMzY1c2wgREYiLCBJU19ERl9QV1IgfSwKKyAgICB7ICJJQk0gQ2xvbmUiLCAwIH0sCisgICAgeyAiUmljb2ggUkY1QzI5Ni8zOTYiLCAwIH0sCisgICAgeyAiVkxTSSA4MkMxNDYiLCAwIH0sCisgICAgeyAiVmFkZW0gVkctNDY4IiwgSVNfVkFERU0gfSwKKyAgICB7ICJWYWRlbSBWRy00NjkiLCBJU19WQURFTXxJU19WR19QV1IgfSwKKyAgICB7ICJDaXJydXMgUEQ2NzEwIiwgSVNfQ0lSUlVTIH0sCisgICAgeyAiQ2lycnVzIFBENjcyeCIsIElTX0NJUlJVUyB9LAorICAgIHsgIlZJQSBWVDgzQzQ2OSIsIElTX0NJUlJVU3xJU19WSUEgfSwKK307CisKK3R5cGVkZWYgc3RydWN0IGNpcnJ1c19zdGF0ZV90IHsKKyAgICB1X2NoYXIgICAgICAgICAgICAgIG1pc2MxLCBtaXNjMjsKKyAgICB1X2NoYXIgICAgICAgICAgICAgIHRpbWVyWzZdOworfSBjaXJydXNfc3RhdGVfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgdmc0Nnhfc3RhdGVfdCB7CisgICAgdV9jaGFyICAgICAgICAgICAgICBjdGwsIGVtYTsKK30gdmc0Nnhfc3RhdGVfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc29ja2V0X2luZm9fdCB7CisgICAgdV9zaG9ydCAgICAgICAgICAgICB0eXBlLCBmbGFnczsKKyAgICBzb2NrZXRfY2FwX3QgICAgICAgIGNhcDsKKyAgICBpb2FkZHJfdCAgICAgICAgICAgIGlvYWRkcjsKKyAgICB1X3Nob3J0ICAgICAgICAgICAgIHBzb2NrOworICAgIHVfY2hhciAgICAgICAgICAgICAgY3NfaXJxLCBpbnRyOworICAgIHZvaWQgICAgICAgICAgICAgICAgKCpoYW5kbGVyKSh2b2lkICppbmZvLCB1X2ludCBldmVudHMpOworICAgIHZvaWQgICAgICAgICAgICAgICAgKmluZm87CisgICAgdW5pb24geworICAgICAgICBjaXJydXNfc3RhdGVfdCAgICAgICAgICBjaXJydXM7CisgICAgICAgIHZnNDZ4X3N0YXRlX3QgICAgICAgICAgIHZnNDZ4OworICAgIH0gc3RhdGU7Cit9IHNvY2tldF9pbmZvX3Q7CisKKy8vc3RhdGljIHNvY2tldF9pbmZvX3Qgc29ja2V0WzhdOworCitpbnQJaTM2NV9iYXNlID0gMHgzZTA7IC8vIERlZmF1bHQgaW4gTGludXgga2VybmVsCitpbnQJY3ljbGVfdGltZSA9IDEyMDsgLy8gRXh0ZXJuYWwgY2xvY2sgdGltZSBpbiBucywgMTIwbnMgPX4gOC4zMyBNSHoKK2ludAlteWRyaXZlcmlkID0gMDsKKwordm9pZAlwaGV4ICggdW5zaWduZWQgY2hhciBjICk7CisvKnN0YXRpYyBpbnQgdG9fY3ljbGVzKGludCBucykKK3sKKyAgICByZXR1cm4gbnMvY3ljbGVfdGltZTsKK30KKyovCisvKnN0YXRpYyBpbnQgdG9fbnMoaW50IGN5Y2xlcykKK3sKKyAgICByZXR1cm4gY3ljbGVfdGltZSpjeWNsZXM7Cit9CisqLworCitzdGF0aWMgdV9jaGFyIGkzNjVfZ2V0KHVfc2hvcnQgc29jaywgdV9zaG9ydCByZWcpCit7CisgICAgLy91bnNpZ25lZCBsb25nIGZsYWdzOworICAgIC8vc3Bpbl9sb2NrX2lycXNhdmUoJmJ1c19sb2NrLGZsYWdzKTsKKyAgICB7CisgICAgICAgIGlvYWRkcl90IHBvcnQgPSBwY2Nzb2NrW3NvY2tdLmlvYWRkcjsKKyAgICAgICAgdV9jaGFyIHZhbDsKKyAgICAgICAgcmVnID0gSTM2NV9SRUcocGNjc29ja1tzb2NrXS5pbnRlcm5hbGlkLCByZWcpOworICAgICAgICBvdXRiKHJlZywgcG9ydCk7IHZhbCA9IGluYihwb3J0KzEpOworICAgICAgICAvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1c19sb2NrLGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGkzNjVfc2V0KHVfc2hvcnQgc29jaywgdV9zaG9ydCByZWcsIHVfY2hhciBkYXRhKQoreworICAgIC8vdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAvL3NwaW5fbG9ja19pcnFzYXZlKCZidXNfbG9jayxmbGFncyk7CisgICAgeworICAgICAgICBpb2FkZHJfdCBwb3J0ID0gcGNjc29ja1tzb2NrXS5pb2FkZHI7CisgICAgICAgIHVfY2hhciB2YWwgPSBJMzY1X1JFRyhwY2Nzb2NrW3NvY2tdLmludGVybmFsaWQsIHJlZyk7CisgICAgICAgIG91dGIodmFsLCBwb3J0KTsgb3V0YihkYXRhLCBwb3J0KzEpOworICAgICAgICAvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1c19sb2NrLGZsYWdzKTsKKyAgICB9Cit9CisKK3ZvaWQJYWRkX3NvY2tldF9pMzY1KHVfc2hvcnQgcG9ydCwgaW50IHBzb2NrLCBpbnQgdHlwZSkgeworCXBjY3NvY2tbcGNjc29ja3NdLmlvYWRkciA9IHBvcnQ7CisJcGNjc29ja1twY2Nzb2Nrc10uaW50ZXJuYWxpZCA9IHBzb2NrOworCXBjY3NvY2tbcGNjc29ja3NdLnR5cGUgPSB0eXBlOworCXBjY3NvY2tbcGNjc29ja3NdLmZsYWdzID0gcGNpY1t0eXBlXS5mbGFnczsKKwlwY2Nzb2NrW3BjY3NvY2tzXS5kcml2ZXJudW0gPSBteWRyaXZlcmlkOworCXBjY3NvY2tbcGNjc29ja3NdLmNvbmZpZ29mZnNldCA9IC0xOworCS8vIEZpbmQgb3V0IGlmIGEgY2FyZCBpbiBpbnNpZGUgdGhhdCBzb2NrZXQKKwlwY2Nzb2NrW3BjY3NvY2tzXS5zdGF0dXMgPSAoKCAxMiA9PSAoaTM2NV9nZXQocGNjc29ja3MsSTM2NV9TVEFUVVMpJjEyKSApICA/ICBIQVNDQVJEIDogRU1QVFkgKTsKKwkvLyAqVE9ETyogY2hlY2sgaWYgdGhhdCdzIGFsbAorCWlmICggMCA9PSAocHNvY2sgJiAxKSApIHsKKwkJcHJpbnRmICggIkZvdW5kIGEgUENNQ0lBIGNvbnRyb2xsZXIgKGk4MjM2NSkgYXQgaW8gJXgsIHR5cGUgJyVzJ1xuIiwgcG9ydCwgcGNpY1t0eXBlXS5uYW1lICk7CisJCS8vCXBjY3NvY2tbcGNjc29ja3NdLnN0YXR1cyA9PSBIQVNDQVJEPyAiaG9sZHMgY2FyZCI6ImVtcHR5IiApOworCX0KKwlwY2Nzb2NrcysrOworCXJldHVybjsKK30KKwordm9pZAlpMzY1X2JzZXQodV9zaG9ydCBzb2NrLCB1X3Nob3J0IHJlZywgdV9jaGFyIG1hc2spIHsKKwl1X2NoYXIgZCA9IGkzNjVfZ2V0KHNvY2ssIHJlZyk7CisJZCB8PSBtYXNrOworCWkzNjVfc2V0KHNvY2ssIHJlZywgZCk7Cit9CisKK3ZvaWQJaTM2NV9iY2xyKHVfc2hvcnQgc29jaywgdV9zaG9ydCByZWcsIHVfY2hhciBtYXNrKSB7CisJdV9jaGFyIGQgPSBpMzY1X2dldChzb2NrLCByZWcpOworCWQgJj0gfm1hc2s7CisJaTM2NV9zZXQoc29jaywgcmVnLCBkKTsKK30KKworCisvKnN0YXRpYyB2b2lkIGkzNjVfYmZsaXAodV9zaG9ydCBzb2NrLCB1X3Nob3J0IHJlZywgdV9jaGFyIG1hc2ssIGludCBiKQoreworICAgIHVfY2hhciBkID0gaTM2NV9nZXQoc29jaywgcmVnKTsKKyAgICBpZiAoYikKKyAgICAgICAgZCB8PSBtYXNrOworICAgIGVsc2UKKyAgICAgICAgZCAmPSB+bWFzazsKKyAgICBpMzY1X3NldChzb2NrLCByZWcsIGQpOworfQorKi8KKworLyoKK3N0YXRpYyB1X3Nob3J0IGkzNjVfZ2V0X3BhaXIodV9zaG9ydCBzb2NrLCB1X3Nob3J0IHJlZykKK3sKKyAgICB1X3Nob3J0IGEsIGI7CisgICAgYSA9IGkzNjVfZ2V0KHNvY2ssIHJlZyk7CisgICAgYiA9IGkzNjVfZ2V0KHNvY2ssIHJlZysxKTsKKyAgICByZXR1cm4gKGEgKyAoYjw8OCkpOworfQorKi8KKworLyoKK3N0YXRpYyB2b2lkIGkzNjVfc2V0X3BhaXIodV9zaG9ydCBzb2NrLCB1X3Nob3J0IHJlZywgdV9zaG9ydCBkYXRhKQoreworICAgIGkzNjVfc2V0KHNvY2ssIHJlZywgZGF0YSAmIDB4ZmYpOworICAgIGkzNjVfc2V0KHNvY2ssIHJlZysxLCBkYXRhID4+IDgpOworfQorKi8KK2ludAlpZGVudGlmeV9pMzY1ICggdV9zaG9ydCBwb3J0LCB1X3Nob3J0IHNvY2sgKSB7CisJdV9jaGFyIHZhbDsKKwlpbnQgdHlwZSA9IC0xOworCS8qIFVzZSB0aGUgbmV4dCBmcmVlIGVudHJ5IGluIHRoZSBzb2NrZXQgdGFibGUgKi8KKwlwY2Nzb2NrW3BjY3NvY2tzXS5pb2FkZHIgPSBwb3J0OworCXBjY3NvY2tbcGNjc29ja3NdLmludGVybmFsaWQgPSBzb2NrOworCS8vICpUT0RPKiB3YWtldXAgYSBzbGVlcHkgY2lycnVzIGNvbnRyb2xsZXI/CisKKwlpZiAoKHZhbCA9IGkzNjVfZ2V0KHBjY3NvY2tzLCBJMzY1X0lERU5UKSkgJiAweDcwKQorCSAgICByZXR1cm4gLTE7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDB4ODI6CisJICAgIHR5cGUgPSBJU19JODIzNjVBOyBicmVhazsKKwljYXNlIDB4ODM6CisJICAgIHR5cGUgPSBJU19JODIzNjVCOyBicmVhazsKKwljYXNlIDB4ODQ6CisJICAgIHR5cGUgPSBJU19JODIzNjVERjsgYnJlYWs7CisJY2FzZSAweDg4OiBjYXNlIDB4ODk6IGNhc2UgMHg4YToKKwkgICAgdHlwZSA9IElTX0lCTTsgYnJlYWs7CisJfQorCS8qIENoZWNrIGZvciBWYWRlbSBWRy00NjggY2hpcHMgKi8KKwlvdXRiKDB4MGUsIHBvcnQpOworCW91dGIoMHgzNywgcG9ydCk7CisJaTM2NV9ic2V0KHBjY3NvY2tzLCBWRzQ2OF9NSVNDLCBWRzQ2OF9NSVNDX1ZBREVNUkVWKTsKKwl2YWwgPSBpMzY1X2dldChwY2Nzb2NrcywgSTM2NV9JREVOVCk7CisJaWYgKHZhbCAmIEkzNjVfSURFTlRfVkFERU0pIHsKKwkgICAgaTM2NV9iY2xyKHBjY3NvY2tzLCBWRzQ2OF9NSVNDLCBWRzQ2OF9NSVNDX1ZBREVNUkVWKTsKKwkgICAgdHlwZSA9ICgodmFsICYgNykgPj0gNCkgPyBJU19WRzQ2OSA6IElTX1ZHNDY4OworCX0KKworCS8qIENoZWNrIGZvciBSaWNvaCBjaGlwcyAqLworCXZhbCA9IGkzNjVfZ2V0KHBjY3NvY2tzLCBSRjVDX0NISVBfSUQpOworCWlmICgodmFsID09IFJGNUNfQ0hJUF9SRjVDMjk2KSB8fCAodmFsID09IFJGNUNfQ0hJUF9SRjVDMzk2KSkgdHlwZSA9IElTX1JGNUN4OTY7CisKKwkvKiBDaGVjayBmb3IgQ2lycnVzIENMLVBENjd4eCBjaGlwcyAqLworCWkzNjVfc2V0KHBjY3NvY2tzLCBQRDY3X0NISVBfSU5GTywgMCk7CisJdmFsID0gaTM2NV9nZXQocGNjc29ja3MsIFBENjdfQ0hJUF9JTkZPKTsKKwlpZiAoKHZhbCAmIFBENjdfSU5GT19DSElQX0lEKSA9PSBQRDY3X0lORk9fQ0hJUF9JRCkgeworCSAgICB2YWwgPSBpMzY1X2dldChwY2Nzb2NrcywgUEQ2N19DSElQX0lORk8pOworCSAgICBpZiAoKHZhbCAmIFBENjdfSU5GT19DSElQX0lEKSA9PSAwKSB7CisJCXR5cGUgPSAodmFsICYgUEQ2N19JTkZPX1NMT1RTKSA/IElTX1BENjcyWCA6IElTX1BENjcxMDsKKwkJaTM2NV9zZXQocGNjc29ja3MsIFBENjdfRVhUX0lOREVYLCAweGU1KTsKKwkJaWYgKGkzNjVfZ2V0KHBjY3NvY2tzLCBQRDY3X0VYVF9JTkRFWCkgIT0gMHhlNSkgdHlwZSA9IElTX1ZUODNDNDY5OworCSAgICB9CisJfQorICAgIHJldHVybiB0eXBlOworfQorCitpbnQJaW5pdF9pODIzNjUodm9pZCkgeworCWludAlpLCBqLCBzb2NrLCBrLCBucywgaWQ7CisJLy91bnNpZ25lZCBpbnQgdWksdWo7CisJLy91bnNpZ25lZCBjaGFyICogdXBjOworCWlvYWRkcl90IHBvcnQ7CisJaW50CWk4MjM2NXMgPSAwOworCS8vIENoYW5nZSBmcm9tIGtlcm5lbDogTm8gaXJxIGluaXQsIG5vIGNoZWNrX3JlZ2lvbiwgbm8gaXNhcG5wIHN1cHBvcnQKKwkvLyBObyBpZ25vcmUgc29ja2V0LCBubyBleHRyYSBzb2NrZXRzIHRvIGNoZWNrIChzbyBpdCdzIGVhc2llciBoZXJlIDotLykKKwkvLyBQcm9iYWJseSB3ZSBkb24ndCBuZWVkIGFueSBvZiB0aGVtOyBpbiBjYXNlIFlPVSBkbywgU0hPVVQgQVQgTUUhCisJaWQgPSBpZGVudGlmeV9pMzY1KGkzNjVfYmFzZSwgMCk7CisJaWYgKChpZCA9PSBJU19JODIzNjVERikgJiYgKGlkZW50aWZ5X2kzNjUoaTM2NV9iYXNlLCAxKSAhPSBpZCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkgICAgcG9ydCA9IGkzNjVfYmFzZSArICgoaSAmIDEpIDw8IDIpICsgKChpICYgMikgPDwgMSk7CisJCSAgICBzb2NrID0gKGkgJiAxKSA8PCAxOworCQkgICAgaWYgKGlkZW50aWZ5X2kzNjUocG9ydCwgc29jaykgPT0gSVNfSTgyMzY1REYpIHsKKwkJCWFkZF9zb2NrZXRfaTM2NShwb3J0LCBzb2NrLCBJU19WTFNJKTsKKwkJICAgIH0KKwkJfQorCX0gZWxzZSB7CisJICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAyKSB7CisgICAgICAgICAgICBwb3J0ID0gaTM2NV9iYXNlICsgMiooaT4+Mik7CisgICAgICAgICAgICBzb2NrID0gKGkgJiAzKTsKKyAgICAgICAgICAgIGlkID0gaWRlbnRpZnlfaTM2NShwb3J0LCBzb2NrKTsKKyAgICAgICAgICAgIGlmIChpZCA8IDApIGNvbnRpbnVlOworCisgICAgICAgICAgICBmb3IgKGogPSBucyA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAvKiBEb2VzIHRoZSBzb2NrZXQgZXhpc3Q/ICovCisgICAgICAgICAgICAgICAgaWYgKGlkZW50aWZ5X2kzNjUocG9ydCwgc29jaytqKSA8IDApCWNvbnRpbnVlOworICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBiYWQgc29ja2V0IGRlY29kZSAqLworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPD0gaTgyMzY1czsgaysrKQorICAgICAgICAgICAgICAgICAgICBpMzY1X3NldChrLCBJMzY1X01FTSgwKStJMzY1X1dfT0ZGLCBrKTsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDw9IGk4MjM2NXM7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkzNjVfZ2V0KGssIEkzNjVfTUVNKDApK0kzNjVfV19PRkYpICE9IGspCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoayA8PSBpODIzNjVzKSBicmVhazsKKyAgICAgICAgICAgICAgICBhZGRfc29ja2V0X2kzNjUocG9ydCwgc29jaytqLCBpZCk7IG5zKys7CisgICAgICAgICAgICB9CisJICB9CisJfQorCXJldHVybgkwOworCisKKworCisKKworCisvKglwcmludGYgKCAiU2VsZWN0aW5nIGNvbmZpZyAxOiBpbyAweDMwMCBAYnl0ZSA4NyoyLi4iICk7CisJdXBjWygyKjg3KV0gPSAyOworCWkzNjVfYmNscigxLCBJMzY1X0FERFJXSU4sIDEgKTsKKwlpMzY1X3NldCgxLEkzNjVfSU5UQ1RMLCAweDY1ICk7IC8vbm8tcmVzZXQsIG1lbW9yeS1jYXJkCisJaTM2NV9zZXQoMSwgSTM2NV9JTygwKSswLCAweDIwICk7CisJaTM2NV9zZXQoMSwgSTM2NV9JTygwKSsxLCAweDAzICk7CisJaTM2NV9zZXQoMSwgSTM2NV9JTygwKSsyLCAweDNmICk7CisJaTM2NV9zZXQoMSwgSTM2NV9JTygwKSszLCAweDAzICk7CisJaTM2NV9zZXQoMSwgMHgzYSwgMHgwNSApOworCWkzNjVfc2V0KDEsIDB4M2IsIDB4MDUgKTsKKwlpMzY1X3NldCgxLCAweDNjLCAweDA1ICk7CisJaTM2NV9zZXQoMSwgMHgzZCwgMHgwNSApOworCWkzNjVfc2V0KDEsIDB4M2UsIDB4MDUgKTsKKwlpMzY1X3NldCgxLCAweDNmLCAweDA1ICk7CisJaTM2NV9zZXQoMSwgMHgwNywgMHgwYSApOworCWkzNjVfc2V0KDEsIEkzNjVfQUREUldJTiwgMHg0MCApOyAvLyAweDQwCisJcHJpbnRmICggIiFcbiIgKTsgZ2V0Y2hhcigpOworCXByaW50ZiAoICJcbiIgKTsKKwlyZXR1cm4gMDsgKi8KK30KKwordm9pZAlwaGV4ICggdW5zaWduZWQgY2hhciBjICkgeworCXVuc2lnbmVkIGNoYXIgYSA9IDAsIGIgPSAwOworCWIgPSAoIGMgJiAweGYgKTsKKwlpZiAoIGIgPiA5ICkgYiArPSAoJ2EnLSc5Jy0xKTsKKwliICs9ICcwJzsKKwlhID0gKCBjICYgMHhmMCApID4+IDQ7CisJaWYgKCBhID4gOSApIGEgKz0gKCdhJy0nOSctMSk7CisJYSArPSAnMCc7CisJcHJpbnRmICggIiVjJWMgIiwgYSwgYiApOworCXJldHVybjsKK30KKworaW50CWRlaW5pdF9pODIzNjUodm9pZCkgeworCXByaW50ZigiRGVpbml0aWFsaXppbmcgaTgyMzY1XG4iICk7CisJcmV0dXJuIDA7Cit9CisKKy8qc3RhdGljIGludCBpMzY1X2dldF9zdGF0dXModV9zaG9ydCBzb2NrLCB1X2ludCAqdmFsdWUpCit7CisgICAgdV9pbnQgc3RhdHVzOworCisgICAgc3RhdHVzID0gaTM2NV9nZXQoc29jaywgSTM2NV9TVEFUVVMpOworICAgICp2YWx1ZSA9ICgoc3RhdHVzICYgSTM2NV9DU19ERVRFQ1QpID09IEkzNjVfQ1NfREVURUNUKQorICAgICAgICA/IFNTX0RFVEVDVCA6IDA7CisKKyAgICBpZiAoaTM2NV9nZXQoc29jaywgSTM2NV9JTlRDVEwpICYgSTM2NV9QQ19JT0NBUkQpCisgICAgICAgICp2YWx1ZSB8PSAoc3RhdHVzICYgSTM2NV9DU19TVFNDSEcpID8gMCA6IFNTX1NUU0NIRzsKKyAgICBlbHNlIHsKKyAgICAgICAgKnZhbHVlIHw9IChzdGF0dXMgJiBJMzY1X0NTX0JWRDEpID8gMCA6IFNTX0JBVERFQUQ7CisgICAgICAgICp2YWx1ZSB8PSAoc3RhdHVzICYgSTM2NV9DU19CVkQyKSA/IDAgOiBTU19CQVRXQVJOOworICAgIH0KKyAgICAqdmFsdWUgfD0gKHN0YXR1cyAmIEkzNjVfQ1NfV1JQUk9UKSA/IFNTX1dSUFJPVCA6IDA7CisgICAgKnZhbHVlIHw9IChzdGF0dXMgJiBJMzY1X0NTX1JFQURZKSA/IFNTX1JFQURZIDogMDsKKyAgICAqdmFsdWUgfD0gKHN0YXR1cyAmIEkzNjVfQ1NfUE9XRVJPTikgPyBTU19QT1dFUk9OIDogMDsKKworI2lmZGVmIENPTkZJR19JU0EKKyAgICBpZiAocGNjc29ja1tzb2NrXS50eXBlID09IElTX1ZHNDY5KSB7CisgICAgICAgIHN0YXR1cyA9IGkzNjVfZ2V0KHNvY2ssIFZHNDY5X1ZTRU5TRSk7CisgICAgICAgIGlmIChwY2Nzb2NrW3NvY2tdLmludGVybmFsaWQgJiAxKSB7CisgICAgICAgICAgICAqdmFsdWUgfD0gKHN0YXR1cyAmIFZHNDY5X1ZTRU5TRV9CX1ZTMSkgPyAwIDogU1NfM1ZDQVJEOworICAgICAgICAgICAgKnZhbHVlIHw9IChzdGF0dXMgJiBWRzQ2OV9WU0VOU0VfQl9WUzIpID8gMCA6IFNTX1hWQ0FSRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp2YWx1ZSB8PSAoc3RhdHVzICYgVkc0NjlfVlNFTlNFX0FfVlMxKSA/IDAgOiBTU18zVkNBUkQ7CisgICAgICAgICAgICAqdmFsdWUgfD0gKHN0YXR1cyAmIFZHNDY5X1ZTRU5TRV9BX1ZTMikgPyAwIDogU1NfWFZDQVJEOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBwcmludGYoImk4MjM2NTogR2V0U3RhdHVzKCVkKSA9ICUjNC40eFxuIiwgc29jaywgKnZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30gLy9pMzY1X2dldF9zdGF0dXMKKyovCisKKy8qc3RhdGljIGludCBpMzY1X3NldF9zb2NrZXQodV9zaG9ydCBzb2NrLCBzb2NrZXRfc3RhdGVfdCAqc3RhdGUpCit7CisgICAgc29ja2V0X2luZm9fdCAqdCA9ICZzb2NrZXRbc29ja107CisgICAgdV9jaGFyIHJlZzsKKworICAgIHByaW50ZigiaTgyMzY1OiBTZXRTb2NrZXQoJWQsIGZsYWdzICUjMy4zeCwgVmNjICVkLCBWcHAgJWQsICIKKyAgICAgICAgICAiaW9faXJxICVkLCBjc2NfbWFzayAlIzIuMngpXG4iLCBzb2NrLCBzdGF0ZS0+ZmxhZ3MsCisgICAgICAgICAgc3RhdGUtPlZjYywgc3RhdGUtPlZwcCwgc3RhdGUtPmlvX2lycSwgc3RhdGUtPmNzY19tYXNrKTsKK3ByaW50ZiAoIlxuRVJST1I6VU5JTVBMRU1FTlRFRFxuIiApOworcmV0dXJuIDA7CisgICAgLy8gRmlyc3Qgc2V0IGdsb2JhbCBjb250cm9sbGVyIG9wdGlvbnMgCisgICAgLy8gc2V0X2JyaWRnZV9zdGF0ZShzb2NrKTsgKlRPRE8qIGNoZWNrOiBuZWVkIHRoaXMgaGVyZT8KKworICAgIC8vIElPIGNhcmQsIFJFU0VUIGZsYWcsIElPIGludGVycnVwdCAKKyAgICByZWcgPSB0LT5pbnRyOworICAgIGlmIChzdGF0ZS0+aW9faXJxICE9IHQtPmNhcC5wY2lfaXJxKSByZWcgfD0gc3RhdGUtPmlvX2lycTsKKyAgICByZWcgfD0gKHN0YXRlLT5mbGFncyAmIFNTX1JFU0VUKSA/IDAgOiBJMzY1X1BDX1JFU0VUOworICAgIHJlZyB8PSAoc3RhdGUtPmZsYWdzICYgU1NfSU9DQVJEKSA/IEkzNjVfUENfSU9DQVJEIDogMDsKKyAgICBpMzY1X3NldChzb2NrLCBJMzY1X0lOVENUTCwgcmVnKTsKKworICAgIHJlZyA9IEkzNjVfUFdSX05PUkVTRVQ7CisgICAgaWYgKHN0YXRlLT5mbGFncyAmIFNTX1BXUl9BVVRPKSByZWcgfD0gSTM2NV9QV1JfQVVUTzsKKyAgICBpZiAoc3RhdGUtPmZsYWdzICYgU1NfT1VUUFVUX0VOQSkgcmVnIHw9IEkzNjVfUFdSX09VVDsKKworICAgIGlmICh0LT5mbGFncyAmIElTX0NJUlJVUykgeworICAgICAgICBpZiAoc3RhdGUtPlZwcCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUtPlZwcCA9PSAxMjApCisgICAgICAgICAgICAgICAgcmVnIHw9IEkzNjVfVlBQMV8xMlY7CisgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZS0+VnBwID09IHN0YXRlLT5WY2MpCisgICAgICAgICAgICAgICAgcmVnIHw9IEkzNjVfVlBQMV81VjsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRlLT5WY2MgIT0gMCkgeworICAgICAgICAgICAgcmVnIHw9IEkzNjVfVkNDXzVWOworICAgICAgICAgICAgaWYgKHN0YXRlLT5WY2MgPT0gMzMpCisgICAgICAgICAgICAgICAgaTM2NV9ic2V0KHNvY2ssIFBENjdfTUlTQ19DVExfMSwgUEQ2N19NQzFfVkNDXzNWKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5WY2MgPT0gNTApCisgICAgICAgICAgICAgICAgaTM2NV9iY2xyKHNvY2ssIFBENjdfTUlTQ19DVExfMSwgUEQ2N19NQzFfVkNDXzNWKTsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHQtPmZsYWdzICYgSVNfVkdfUFdSKSB7CisgICAgICAgIGlmIChzdGF0ZS0+VnBwICE9IDApIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+VnBwID09IDEyMCkKKyAgICAgICAgICAgICAgICByZWcgfD0gSTM2NV9WUFAxXzEyVjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5WcHAgPT0gc3RhdGUtPlZjYykKKyAgICAgICAgICAgICAgICByZWcgfD0gSTM2NV9WUFAxXzVWOworICAgICAgICAgICAgZWxzZSByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgIGlmIChzdGF0ZS0+VmNjICE9IDApIHsKKyAgICAgICAgICAgIHJlZyB8PSBJMzY1X1ZDQ181VjsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+VmNjID09IDMzKQorICAgICAgICAgICAgICAgIGkzNjVfYnNldChzb2NrLCBWRzQ2OV9WU0VMRUNULCBWRzQ2OV9WU0VMX1ZDQyk7CisgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZS0+VmNjID09IDUwKQorICAgICAgICAgICAgICAgIGkzNjVfYmNscihzb2NrLCBWRzQ2OV9WU0VMRUNULCBWRzQ2OV9WU0VMX1ZDQyk7CisgICAgICAgICAgICBlbHNlIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0LT5mbGFncyAmIElTX0RGX1BXUikgeworICAgICAgICBzd2l0Y2ggKHN0YXRlLT5WY2MpIHsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMzOiAgICAgICAgcmVnIHw9IEkzNjVfVkNDXzNWOyBicmVhazsKKyAgICAgICAgY2FzZSA1MDogICAgICAgIHJlZyB8PSBJMzY1X1ZDQ181VjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHN0YXRlLT5WcHApIHsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUwOiAgICAgICAgcmVnIHw9IEkzNjVfVlBQMV81VjsgYnJlYWs7CisgICAgICAgIGNhc2UgMTIwOiAgICAgICByZWcgfD0gSTM2NV9WUFAxXzEyVjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUtPlZjYykgeworICAgICAgICBjYXNlIDA6ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTA6ICAgICAgICByZWcgfD0gSTM2NV9WQ0NfNVY7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzdGF0ZS0+VnBwKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MDogICAgICAgIHJlZyB8PSBJMzY1X1ZQUDFfNVYgfCBJMzY1X1ZQUDJfNVY7IGJyZWFrOworICAgICAgICBjYXNlIDEyMDogICAgICAgcmVnIHw9IEkzNjVfVlBQMV8xMlYgfCBJMzY1X1ZQUDJfMTJWOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlZyAhPSBpMzY1X2dldChzb2NrLCBJMzY1X1BPV0VSKSkKKyAgICAgICAgaTM2NV9zZXQoc29jaywgSTM2NV9QT1dFUiwgcmVnKTsKKworICAgIC8vIENoaXBzZXQtc3BlY2lmaWMgZnVuY3Rpb25zIAorICAgIGlmICh0LT5mbGFncyAmIElTX0NJUlJVUykgeworICAgICAgICAvLyBTcGVha2VyIGNvbnRyb2wgCisgICAgICAgIGkzNjVfYmZsaXAoc29jaywgUEQ2N19NSVNDX0NUTF8xLCBQRDY3X01DMV9TUEtSX0VOQSwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+ZmxhZ3MgJiBTU19TUEtSX0VOQSk7CisgICAgfQorCisgICAgLy8gQ2FyZCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCBtYXNrIAorICAgIHJlZyA9IHQtPmNzX2lycSA8PCA0OworICAgIGlmIChzdGF0ZS0+Y3NjX21hc2sgJiBTU19ERVRFQ1QpIHJlZyB8PSBJMzY1X0NTQ19ERVRFQ1Q7CisgICAgaWYgKHN0YXRlLT5mbGFncyAmIFNTX0lPQ0FSRCkgeworICAgICAgICBpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfU1RTQ0hHKSByZWcgfD0gSTM2NV9DU0NfU1RTQ0hHOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdGF0ZS0+Y3NjX21hc2sgJiBTU19CQVRERUFEKSByZWcgfD0gSTM2NV9DU0NfQlZEMTsKKyAgICAgICAgaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVFdBUk4pIHJlZyB8PSBJMzY1X0NTQ19CVkQyOworICAgICAgICBpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfUkVBRFkpIHJlZyB8PSBJMzY1X0NTQ19SRUFEWTsKKyAgICB9CisgICAgaTM2NV9zZXQoc29jaywgSTM2NV9DU0NJTlQsIHJlZyk7CisgICAgaTM2NV9nZXQoc29jaywgSTM2NV9DU0MpOworCisgICAgcmV0dXJuIDA7Cit9IC8vIGkzNjVfc2V0X3NvY2tldCAKKyovCisKKy8qc3RhdGljIGludCBpMzY1X2dldF9pb19tYXAodV9zaG9ydCBzb2NrLCBzdHJ1Y3QgcGNjYXJkX2lvX21hcCAqaW8pCit7CisgICAgdV9jaGFyIG1hcCwgaW9jdGwsIGFkZHI7CisJcHJpbnRmICggIkdFVElPTUFQIHVuaW1wbGVtZW50ZWRcbiIgKTsgcmV0dXJuIDA7CisgICAgbWFwID0gaW8tPm1hcDsKKyAgICBpZiAobWFwID4gMSkgcmV0dXJuIC1FSU5WQUw7CisgICAgaW8tPnN0YXJ0ID0gaTM2NV9nZXRfcGFpcihzb2NrLCBJMzY1X0lPKG1hcCkrSTM2NV9XX1NUQVJUKTsKKyAgICBpby0+c3RvcCA9IGkzNjVfZ2V0X3BhaXIoc29jaywgSTM2NV9JTyhtYXApK0kzNjVfV19TVE9QKTsKKyAgICBpb2N0bCA9IGkzNjVfZ2V0KHNvY2ssIEkzNjVfSU9DVEwpOworICAgIGFkZHIgPSBpMzY1X2dldChzb2NrLCBJMzY1X0FERFJXSU4pOworICAgIGlvLT5zcGVlZCA9IHRvX25zKGlvY3RsICYgSTM2NV9JT0NUTF9XQUlUKG1hcCkpID8gMSA6IDA7CisgICAgaW8tPmZsYWdzICA9IChhZGRyICYgSTM2NV9FTkFfSU8obWFwKSkgPyBNQVBfQUNUSVZFIDogMDsKKyAgICBpby0+ZmxhZ3MgfD0gKGlvY3RsICYgSTM2NV9JT0NUTF8wV1MobWFwKSkgPyBNQVBfMFdTIDogMDsKKyAgICBpby0+ZmxhZ3MgfD0gKGlvY3RsICYgSTM2NV9JT0NUTF8xNkJJVChtYXApKSA/IE1BUF8xNkJJVCA6IDA7CisgICAgaW8tPmZsYWdzIHw9IChpb2N0bCAmIEkzNjVfSU9DVExfSU9DUzE2KG1hcCkpID8gTUFQX0FVVE9TWiA6IDA7CisgICAgcHJpbnRmKCJpODIzNjU6IEdldElPTWFwKCVkLCAlZCkgPSAlIzIuMngsICVkIG5zLCAiCisgICAgICAgICAgIiUjNC40eC0lIzQuNHhcbiIsIHNvY2ssIG1hcCwgaW8tPmZsYWdzLCBpby0+c3BlZWQsCisgICAgICAgICAgaW8tPnN0YXJ0LCBpby0+c3RvcCk7CisgICAgcmV0dXJuIDA7Cit9IC8vIGkzNjVfZ2V0X2lvX21hcCAKKyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKnN0YXRpYyBpbnQgaTM2NV9zZXRfaW9fbWFwKHVfc2hvcnQgc29jaywgc3RydWN0IHBjY2FyZF9pb19tYXAgKmlvKQoreworICAgIHVfY2hhciBtYXAsIGlvY3RsOworCisgICAgcHJpbnRmKCJpODIzNjU6IFNldElPTWFwKCVkLCAlZCwgJSMyLjJ4LCAlZCBucywgIgorICAgICAgICAgICIlIzQuNHgtJSM0LjR4KVxuIiwgc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLAorICAgICAgICAgIGlvLT5zcGVlZCwgaW8tPnN0YXJ0LCBpby0+c3RvcCk7CitwcmludGYgKCAiVU5JTVBMRU1FTlRFRFxuIiApOworCXJldHVybiAwOworICAgIG1hcCA9IGlvLT5tYXA7CisgICAgLy9pZiAoKG1hcCA+IDEpIHx8IChpby0+c3RhcnQgPiAweGZmZmYpIHx8IChpby0+c3RvcCA+IDB4ZmZmZikgfHwKKyAgICBpZiAoKG1hcCA+IDEpIHx8CisgICAgICAgIChpby0+c3RvcCA8IGlvLT5zdGFydCkpIHJldHVybiAtRUlOVkFMOworICAgIC8vIFR1cm4gb2ZmIHRoZSB3aW5kb3cgYmVmb3JlIGNoYW5naW5nIGFueXRoaW5nIAorICAgIGlmIChpMzY1X2dldChzb2NrLCBJMzY1X0FERFJXSU4pICYgSTM2NV9FTkFfSU8obWFwKSkKKyAgICAgICAgaTM2NV9iY2xyKHNvY2ssIEkzNjVfQUREUldJTiwgSTM2NV9FTkFfSU8obWFwKSk7CisgICAgaTM2NV9zZXRfcGFpcihzb2NrLCBJMzY1X0lPKG1hcCkrSTM2NV9XX1NUQVJULCBpby0+c3RhcnQpOworICAgIGkzNjVfc2V0X3BhaXIoc29jaywgSTM2NV9JTyhtYXApK0kzNjVfV19TVE9QLCBpby0+c3RvcCk7CisgICAgaW9jdGwgPSBpMzY1X2dldChzb2NrLCBJMzY1X0lPQ1RMKSAmIH5JMzY1X0lPQ1RMX01BU0sobWFwKTsKKyAgICBpZiAoaW8tPnNwZWVkKSBpb2N0bCB8PSBJMzY1X0lPQ1RMX1dBSVQobWFwKTsKKyAgICBpZiAoaW8tPmZsYWdzICYgTUFQXzBXUykgaW9jdGwgfD0gSTM2NV9JT0NUTF8wV1MobWFwKTsKKyAgICBpZiAoaW8tPmZsYWdzICYgTUFQXzE2QklUKSBpb2N0bCB8PSBJMzY1X0lPQ1RMXzE2QklUKG1hcCk7CisgICAgaWYgKGlvLT5mbGFncyAmIE1BUF9BVVRPU1opIGlvY3RsIHw9IEkzNjVfSU9DVExfSU9DUzE2KG1hcCk7CisgICAgaTM2NV9zZXQoc29jaywgSTM2NV9JT0NUTCwgaW9jdGwpOworICAgIC8vIFR1cm4gb24gdGhlIHdpbmRvdyBpZiBuZWNlc3NhcnkgCisgICAgaWYgKGlvLT5mbGFncyAmIE1BUF9BQ1RJVkUpCisgICAgICAgIGkzNjVfYnNldChzb2NrLCBJMzY1X0FERFJXSU4sIEkzNjVfRU5BX0lPKG1hcCkpOworICAgIHJldHVybiAwOworfSAvLyBpMzY1X3NldF9pb19tYXAgCisqLworCisvKgorc3RhdGljIGludCBpMzY1X3NldF9tZW1fbWFwKHVfc2hvcnQgc29jaywgc3RydWN0IHBjY2FyZF9tZW1fbWFwICptZW0pCit7CisgICAgdV9zaG9ydCBiYXNlLCBpOworICAgIHVfY2hhciBtYXA7CisKKyAgICBwcmludGYoImk4MjM2NTogU2V0TWVtTWFwKCVkLCAlZCwgJSMyLjJ4LCAlZCBucywgJSM1LjVseC0lIzUuNSIKKyAgICAgICAgICAibHgsICUjNS41eClcbiIsIHNvY2ssIG1lbS0+bWFwLCBtZW0tPmZsYWdzLCBtZW0tPnNwZWVkLAorICAgICAgICAgIG1lbS0+c3lzX3N0YXJ0LCBtZW0tPnN5c19zdG9wLCBtZW0tPmNhcmRfc3RhcnQpOworCitwcmludGYgKCAiVU5JTVBMRU1FTlRFRFxuIiApOworCXJldHVybiAwOworICAgIG1hcCA9IG1lbS0+bWFwOworICAgIGlmICgobWFwID4gNCkgfHwgKG1lbS0+Y2FyZF9zdGFydCA+IDB4M2ZmZmZmZikgfHwKKyAgICAgICAgKG1lbS0+c3lzX3N0YXJ0ID4gbWVtLT5zeXNfc3RvcCkgfHwgKG1lbS0+c3BlZWQgPiAxMDAwKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKCEoc29ja2V0W3NvY2tdLmZsYWdzICYgSVNfUENJKSAmJgorICAgICAgICAoKG1lbS0+c3lzX3N0YXJ0ID4gMHhmZmZmZmYpIHx8IChtZW0tPnN5c19zdG9wID4gMHhmZmZmZmYpKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvLyBUdXJuIG9mZiB0aGUgd2luZG93IGJlZm9yZSBjaGFuZ2luZyBhbnl0aGluZyAKKyAgICBpZiAoaTM2NV9nZXQoc29jaywgSTM2NV9BRERSV0lOKSAmIEkzNjVfRU5BX01FTShtYXApKQorICAgICAgICBpMzY1X2JjbHIoc29jaywgSTM2NV9BRERSV0lOLCBJMzY1X0VOQV9NRU0obWFwKSk7CisKKyAgICBiYXNlID0gSTM2NV9NRU0obWFwKTsKKyAgICBpID0gKG1lbS0+c3lzX3N0YXJ0ID4+IDEyKSAmIDB4MGZmZjsKKyAgICBpZiAobWVtLT5mbGFncyAmIE1BUF8xNkJJVCkgaSB8PSBJMzY1X01FTV8xNkJJVDsKKyAgICBpZiAobWVtLT5mbGFncyAmIE1BUF8wV1MpIGkgfD0gSTM2NV9NRU1fMFdTOworICAgIGkzNjVfc2V0X3BhaXIoc29jaywgYmFzZStJMzY1X1dfU1RBUlQsIGkpOworCisgICAgaSA9IChtZW0tPnN5c19zdG9wID4+IDEyKSAmIDB4MGZmZjsKKyAgICBzd2l0Y2ggKHRvX2N5Y2xlcyhtZW0tPnNwZWVkKSkgeworICAgIGNhc2UgMDogICAgIGJyZWFrOworICAgIGNhc2UgMTogICAgIGkgfD0gSTM2NV9NRU1fV1MwOyBicmVhazsKKyAgICBjYXNlIDI6ICAgICBpIHw9IEkzNjVfTUVNX1dTMTsgYnJlYWs7CisgICAgZGVmYXVsdDogICAgaSB8PSBJMzY1X01FTV9XUzEgfCBJMzY1X01FTV9XUzA7IGJyZWFrOworICAgIH0KKyAgICBpMzY1X3NldF9wYWlyKHNvY2ssIGJhc2UrSTM2NV9XX1NUT1AsIGkpOworCisgICAgaSA9ICgobWVtLT5jYXJkX3N0YXJ0IC0gbWVtLT5zeXNfc3RhcnQpID4+IDEyKSAmIDB4M2ZmZjsKKyAgICBpZiAobWVtLT5mbGFncyAmIE1BUF9XUlBST1QpIGkgfD0gSTM2NV9NRU1fV1JQUk9UOworICAgIGlmIChtZW0tPmZsYWdzICYgTUFQX0FUVFJJQikgaSB8PSBJMzY1X01FTV9SRUc7CisgICAgaTM2NV9zZXRfcGFpcihzb2NrLCBiYXNlK0kzNjVfV19PRkYsIGkpOworCisgICAgLy8gVHVybiBvbiB0aGUgd2luZG93IGlmIG5lY2Vzc2FyeSAKKyAgICBpZiAobWVtLT5mbGFncyAmIE1BUF9BQ1RJVkUpCisgICAgICAgIGkzNjVfYnNldChzb2NrLCBJMzY1X0FERFJXSU4sIEkzNjVfRU5BX01FTShtYXApKTsKKyAgICByZXR1cm4gMDsKK30gLy8gaTM2NV9zZXRfbWVtX21hcCAKKyovCisKKworaW50CWk4MjM2NV9pbnRlcmZhY2VyICggaW50ZXJmYWNlX2Z1bmNfdCBmdW5jLCBpbnQgc29ja25vLCBpbnQgcGFyMSwgaW50IHBhcjIsIHZvaWQqIHBhcjMgKSB7CisJLy9pbnQJaSwgaiwgazsKKwkvL3VfaW50CXVpOworCXVfY2hhciAqdXBjOworCXN0cnVjdCBwY2NfY29uZmlnX3QgKiBwY2NjOworCXN3aXRjaCAoIGZ1bmMgKSB7CisJICBjYXNlCUlOSVQ6CisJCW15ZHJpdmVyaWQgPSBwYXIxOworCQlyZXR1cm4JaW5pdF9pODIzNjUoKTsKKwkgIGNhc2UJU0hVVERPV046CisJCWkzNjVfc2V0KHNvY2tubywgSTM2NV9BRERSV0lOLCBpMzY1X2dldChzb2Nrbm8sIEkzNjVfQUREUldJTikgJiAweDIwICk7CisJCWkzNjVfc2V0KHNvY2tubywgSTM2NV9JTlRDVEwsIDB4MDUgKTsKKwkJc2xlZXB0aWNrcygyKTsKKwkJaTM2NV9zZXQoc29ja25vLEkzNjVfSU5UQ1RMLCAweDQ1ICk7IC8vbm8tcmVzZXQsIG1lbW9yeS1jYXJkCisJCWJyZWFrOworCSAgY2FzZQlNQVBBVFRSTUVNOgorCQlpMzY1X3NldChzb2Nrbm8sSTM2NV9QT1dFUiwgMHhiMSApOworCQlpMzY1X3NldChzb2Nrbm8sIEkzNjVfSU5UQ1RMLCAweDA1ICk7CisJCXNsZWVwdGlja3MoMik7CisJCWkzNjVfc2V0KHNvY2tubyxJMzY1X0lOVENUTCwgMHg0NSApOyAvL25vLXJlc2V0LCBtZW1vcnktY2FyZAorCQlpMzY1X3NldChzb2Nrbm8sIEkzNjVfQUREUldJTiwgaTM2NV9nZXQoc29ja25vLCBJMzY1X0FERFJXSU4pICYgMHgyMCApOworCQkvL2kzNjVfYmNscihzb2Nrbm8sIEkzNjVfQUREUldJTiwgMSApOworCQlpMzY1X3NldChzb2Nrbm8sIEkzNjVfTUVNKDApKzAsICggcGFyMSA+PiAxMiApJiAweGZmICk7IC8vc3RhcnQKKwkJaTM2NV9zZXQoc29ja25vLCBJMzY1X01FTSgwKSsxLCAoIHBhcjEgPj4gMjAgKSAmIDB4MGYgKTsKKwkJaTM2NV9zZXQoc29ja25vLCBJMzY1X01FTSgwKSsyLCAoKHBhcjEgKyBwYXIyIC0gMSApID4+IDEyICkgJiAweGZmICk7IC8vZW5kCisJCWkzNjVfc2V0KHNvY2tubywgSTM2NV9NRU0oMCkrMywgKCggcGFyMSArIHBhcjIgLSAxICkgPj4gMjAgKSAmIDB4MGYgICk7CisJCWkzNjVfc2V0KHNvY2tubywgSTM2NV9NRU0oMCkrNCwgKCgweDQwMDAwMDAgLSBwYXIxKSA+PiAxMikgJiAweGZmICk7IC8vb2Zmc2V0IGxvdworCQlpMzY1X3NldChzb2Nrbm8sIEkzNjVfTUVNKDApKzUsIDB4NDAgfCAoKCgweDQwMDAwMDAwIC0gcGFyMSkgPj4gMTIpICYgMHgzZikpOworCQlpMzY1X2JzZXQoc29ja25vLCBJMzY1X0FERFJXSU4sIDEgKTsKKwkJaWYgKCAhICggMSAmIGkzNjVfZ2V0ICggc29ja25vLCBJMzY1X0FERFJXSU4gKSApICkgcmV0dXJuIDE7CisJCWJyZWFrOworCSAgY2FzZQlVTk1BUEFUVFJNRU06CisJCWkzNjVfc2V0KHNvY2tubywgSTM2NV9BRERSV0lOLCBpMzY1X2dldChzb2Nrbm8sIEkzNjVfQUREUldJTikgJiAweDIwICk7CisJCWkzNjVfc2V0KHNvY2tubyxJMzY1X0lOVENUTCwgMHg0NSApOyAvL25vLXJlc2V0LCBtZW1vcnktY2FyZAorCQlicmVhazsKKwkgIGNhc2UJU0VMRUNUQ09ORklHOgkvLyBQYXJhbXM6IHBhcjE6IGNvbmZpZyBudW1iZXI7IHBhcjMgY29uZmlnIHBvaW50ZXIgcG9pbnRlcgorCQlpZiAoIDAgPiBwY2Nzb2NrW3NvY2tub10uY29uZmlnb2Zmc2V0ICkgcmV0dXJuIDE7CisJCWlmICggTlVMTCA9PSAocGNjYyA9IHBhcjMgKSApIHJldHVybiAyOworCQkvLyB3cml0ZSBjb25maWcgbnVtYmVyIHRvIAorCQl1cGMgPSBpb3JlbWFwICggTUFQX0FUVFJNRU1fVE8sIE1BUF9BVFRSTUVNX0xFTiApOworCQlpZiAoIHBjY3NvY2tbc29ja25vXS5jb25maWdvZmZzZXQgPiBNQVBfQVRUUk1FTV9MRU4gKSByZXR1cm4gMzsKKwkJaWYgKCAoIHBhcjEgJiAweDdmZmZmZmMwICkgKSByZXR1cm4gNDsKKwkJaWYgKCBwY2NjLT5pbmRleCAhPSBwYXIxICkgcmV0dXJuIDU7CisJCXVwY1twY2Nzb2NrW3NvY2tub10uY29uZmlnb2Zmc2V0XSA9ICggdXBjW3BjY3NvY2tbc29ja25vXS5jb25maWdvZmZzZXRdICYgMHhjMCApIHwgKCBwYXIxICYgMHgzZiApOworCQlpMzY1X3NldChzb2Nrbm8sIEkzNjVfSU9DVEwsIChpMzY1X2dldChzb2Nrbm8sIEkzNjVfSU9DVEwpICYgMHhmZSkgfCAweDIwICk7CS8vIDE2Yml0IGF1dG9zaXplCisJCWkzNjVfc2V0KHNvY2tubywgSTM2NV9JTygwKSswLCBwY2NjLT5pb3dpbiAmIDB4ZmYpOworCQlpMzY1X3NldChzb2Nrbm8sIEkzNjVfSU8oMCkrMSwgKHBjY2MtPmlvd2luID4+IDgpICYgMHhmZik7CisJCWkzNjVfc2V0KHNvY2tubywgSTM2NV9JTygwKSsyLCAocGNjYy0+aW93aW4rcGNjYy0+aW9sZW4gLSAxKSAmIDB4ZmYpOworCQlpMzY1X3NldChzb2Nrbm8sIEkzNjVfSU8oMCkrMywgKChwY2NjLT5pb3dpbitwY2NjLT5pb2xlbi0gMSkgPj4gOCkgJiAweGZmKTsKKwkJLy8gRGlzYWJsZSBtZW0gbWFwcGluZworCQlpMzY1X2JjbHIoc29ja25vLCBJMzY1X0FERFJXSU4sIDEpOworCQlpMzY1X3NldChzb2Nrbm8sIEkzNjVfSU5UQ1RMLCAweDY1KTsKKwkJaTM2NV9ic2V0KHNvY2tubywgSTM2NV9BRERSV0lOLDB4NDApOworCQlicmVhazsKKwkgIGRlZmF1bHQ6CisJCXJldHVybgktMTsgLy8gRVJST1I6IFVua25vd24gZnVuY3Rpb24gY2FsbGVkCisJfQorCXJldHVybgkwOworfQorCisvLyBnZXRfbWVtX21hcFsxMzIwXQorLy8gY2lycnVzX2dldF9zdGF0ZS9zZXQvb3B0cy4uLgorLy8gdmc0NnhfZ2V0X3N0YXRlLy4uLgorLy8gZ2V0X2JyaWRnZV9zdGF0ZS8uLi4KKworI2VuZGlmIC8qIENPTkZJR19QQ01DSUEgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvaW1hZ2UuYyBiL2dweGUvc3JjL2NvcmUvaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGZlNTFhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9pbWFnZS5jCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorI2luY2x1ZGUgPGdweGUvdW1hbGxvYy5oPgorI2luY2x1ZGUgPGdweGUvdXJpLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbWFnZS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBFeGVjdXRhYmxlL2xvYWRhYmxlIGltYWdlcworICoKKyAqLworCisvKiogTGlzdCBvZiByZWdpc3RlcmVkIGltYWdlcyAqLworc3RydWN0IGxpc3RfaGVhZCBpbWFnZXMgPSBMSVNUX0hFQURfSU5JVCAoIGltYWdlcyApOworCisvKioKKyAqIEZyZWUgZXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZQorICoKKyAqIEB2IHJlZmNudAkJUmVmZXJlbmNlIGNvdW50ZXIKKyAqLworc3RhdGljIHZvaWQgZnJlZV9pbWFnZSAoIHN0cnVjdCByZWZjbnQgKnJlZmNudCApIHsKKwlzdHJ1Y3QgaW1hZ2UgKmltYWdlID0gY29udGFpbmVyX29mICggcmVmY250LCBzdHJ1Y3QgaW1hZ2UsIHJlZmNudCApOworCisJdXJpX3B1dCAoIGltYWdlLT51cmkgKTsKKwl1ZnJlZSAoIGltYWdlLT5kYXRhICk7CisJaW1hZ2VfcHV0ICggaW1hZ2UtPnJlcGxhY2VtZW50ICk7CisJZnJlZSAoIGltYWdlICk7CisJREJHQyAoIGltYWdlLCAiSU1BR0UgJXAgZnJlZWRcbiIsIGltYWdlICk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgZXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZQorICoKKyAqIEByZXQgaW1hZ2UJCUV4ZWN1dGFibGUvbG9hZGFibGUgaW1hZ2UKKyAqLworc3RydWN0IGltYWdlICogYWxsb2NfaW1hZ2UgKCB2b2lkICkgeworCXN0cnVjdCBpbWFnZSAqaW1hZ2U7CisKKwlpbWFnZSA9IHphbGxvYyAoIHNpemVvZiAoICppbWFnZSApICk7CisJaWYgKCBpbWFnZSApIHsKKwkJaW1hZ2UtPnJlZmNudC5mcmVlID0gZnJlZV9pbWFnZTsKKwl9CisJcmV0dXJuIGltYWdlOworfQorCisvKioKKyAqIFNldCBpbWFnZSBVUkkKKyAqCisgKiBAdiBpbWFnZQkJSW1hZ2UKKyAqIEB2IFVSSQkJTmV3IGltYWdlIFVSSQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogSWYgbm8gbmFtZSBpcyBzZXQsIHRoZSBuYW1lIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYmFzZSBuYW1lIG9mIHRoZQorICogVVJJIHBhdGggKGlmIGFueSkuCisgKi8KK2ludCBpbWFnZV9zZXRfdXJpICggc3RydWN0IGltYWdlICppbWFnZSwgc3RydWN0IHVyaSAqdXJpICkgeworCWNvbnN0IGNoYXIgKnBhdGggPSB1cmktPnBhdGg7CisKKwkvKiBSZXBsYWNlIFVSSSByZWZlcmVuY2UgKi8KKwl1cmlfcHV0ICggaW1hZ2UtPnVyaSApOworCWltYWdlLT51cmkgPSB1cmlfZ2V0ICggdXJpICk7CisKKwkvKiBTZXQgbmFtZSBpZiBub25lIGFscmVhZHkgc3BlY2lmaWVkICovCisJaWYgKCBwYXRoICYmICggISBpbWFnZS0+bmFtZVswXSApICkKKwkJaW1hZ2Vfc2V0X25hbWUgKCBpbWFnZSwgYmFzZW5hbWUgKCAoIGNoYXIgKiApIHBhdGggKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2V0IGltYWdlIGNvbW1hbmQgbGluZQorICoKKyAqIEB2IGltYWdlCQlJbWFnZQorICogQHYgY21kbGluZQkJTmV3IGltYWdlIGNvbW1hbmQgbGluZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpbWFnZV9zZXRfY21kbGluZSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsIGNvbnN0IGNoYXIgKmNtZGxpbmUgKSB7CisJZnJlZSAoIGltYWdlLT5jbWRsaW5lICk7CisJaW1hZ2UtPmNtZGxpbmUgPSBzdHJkdXAgKCBjbWRsaW5lICk7CisJaWYgKCAhIGltYWdlLT5jbWRsaW5lICkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVnaXN0ZXIgZXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlFeGVjdXRhYmxlL2xvYWRhYmxlIGltYWdlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHJlZ2lzdGVyX2ltYWdlICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGltZ2luZGV4ID0gMDsKKworCS8qIENyZWF0ZSBpbWFnZSBuYW1lIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIG9uZSAqLworCWlmICggISBpbWFnZS0+bmFtZVswXSApIHsKKwkJc25wcmludGYgKCBpbWFnZS0+bmFtZSwgc2l6ZW9mICggaW1hZ2UtPm5hbWUgKSwgImltZyVkIiwKKwkJCSAgIGltZ2luZGV4KysgKTsKKwl9CisKKwkvKiBBZGQgdG8gaW1hZ2UgbGlzdCAqLworCWltYWdlX2dldCAoIGltYWdlICk7CisJbGlzdF9hZGRfdGFpbCAoICZpbWFnZS0+bGlzdCwgJmltYWdlcyApOworCURCR0MgKCBpbWFnZSwgIklNQUdFICVwIGF0IFslbHgsJWx4KSByZWdpc3RlcmVkIGFzICVzXG4iLAorCSAgICAgICBpbWFnZSwgdXNlcl90b19waHlzICggaW1hZ2UtPmRhdGEsIDAgKSwKKwkgICAgICAgdXNlcl90b19waHlzICggaW1hZ2UtPmRhdGEsIGltYWdlLT5sZW4gKSwgaW1hZ2UtPm5hbWUgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFVucmVnaXN0ZXIgZXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlFeGVjdXRhYmxlL2xvYWRhYmxlIGltYWdlCisgKi8KK3ZvaWQgdW5yZWdpc3Rlcl9pbWFnZSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJREJHQyAoIGltYWdlLCAiSU1BR0UgJXAgdW5yZWdpc3RlcmVkXG4iLCBpbWFnZSApOworCWxpc3RfZGVsICggJmltYWdlLT5saXN0ICk7CisJaW1hZ2VfcHV0ICggaW1hZ2UgKTsKK30KKworLyoqCisgKiBGaW5kIGltYWdlIGJ5IG5hbWUKKyAqCisgKiBAdiBuYW1lCQlJbWFnZSBuYW1lCisgKiBAcmV0IGltYWdlCQlFeGVjdXRhYmxlL2xvYWRhYmxlIGltYWdlLCBvciBOVUxMCisgKi8KK3N0cnVjdCBpbWFnZSAqIGZpbmRfaW1hZ2UgKCBjb25zdCBjaGFyICpuYW1lICkgeworCXN0cnVjdCBpbWFnZSAqaW1hZ2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggaW1hZ2UsICZpbWFnZXMsIGxpc3QgKSB7CisJCWlmICggc3RyY21wICggaW1hZ2UtPm5hbWUsIG5hbWUgKSA9PSAwICkKKwkJCXJldHVybiBpbWFnZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBMb2FkIGV4ZWN1dGFibGUvbG9hZGFibGUgaW1hZ2UgaW50byBtZW1vcnkKKyAqCisgKiBAdiBpbWFnZQkJRXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZQorICogQHYgdHlwZQkJRXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZSB0eXBlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpbWFnZV9sb2FkX3R5cGUgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLCBzdHJ1Y3QgaW1hZ2VfdHlwZSAqdHlwZSApIHsKKwlpbnQgcmM7CisKKwkvKiBDaGVjayBpbWFnZSBpcyBhY3R1YWxseSBsb2FkYWJsZSAqLworCWlmICggISB0eXBlLT5sb2FkICkKKwkJcmV0dXJuIC1FTk9FWEVDOworCisJLyogVHJ5IHRoZSBpbWFnZSBsb2FkZXIgKi8KKwlpZiAoICggcmMgPSB0eXBlLT5sb2FkICggaW1hZ2UgKSApICE9IDAgKSB7CisJCURCR0MgKCBpbWFnZSwgIklNQUdFICVwIGNvdWxkIG5vdCBsb2FkIGFzICVzOiAlc1xuIiwKKwkJICAgICAgIGltYWdlLCB0eXBlLT5uYW1lLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEZsYWcgYXMgbG9hZGVkICovCisJaW1hZ2UtPmZsYWdzIHw9IElNQUdFX0xPQURFRDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBMb2FkIGV4ZWN1dGFibGUvbG9hZGFibGUgaW1hZ2UgaW50byBtZW1vcnkKKyAqCisgKiBAdiBpbWFnZQkJRXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpbWFnZV9sb2FkICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKworCWFzc2VydCAoIGltYWdlLT50eXBlICE9IE5VTEwgKTsKKworCXJldHVybiBpbWFnZV9sb2FkX3R5cGUgKCBpbWFnZSwgaW1hZ2UtPnR5cGUgKTsKK30KKworLyoqCisgKiBBdXRvZGV0ZWN0IGltYWdlIHR5cGUgYW5kIGxvYWQgZXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZSBpbnRvIG1lbW9yeQorICoKKyAqIEB2IGltYWdlCQlFeGVjdXRhYmxlL2xvYWRhYmxlIGltYWdlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IGltYWdlX2F1dG9sb2FkICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwlzdHJ1Y3QgaW1hZ2VfdHlwZSAqdHlwZTsKKwlpbnQgcmM7CisKKwkvKiBJZiBpbWFnZSBhbHJlYWR5IGhhcyBhIHR5cGUsIHVzZSBpdCAqLworCWlmICggaW1hZ2UtPnR5cGUgKQorCQlyZXR1cm4gaW1hZ2VfbG9hZCAoIGltYWdlICk7CisKKwkvKiBPdGhlcndpc2UgcHJvYmUgZm9yIGEgc3VpdGFibGUgdHlwZSAqLworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggdHlwZSwgSU1BR0VfVFlQRVMgKSB7CisJCURCR0MgKCBpbWFnZSwgIklNQUdFICVwIHRyeWluZyB0eXBlICVzXG4iLCBpbWFnZSwgdHlwZS0+bmFtZSApOworCQlyYyA9IGltYWdlX2xvYWRfdHlwZSAoIGltYWdlLCB0eXBlICk7CisJCWlmICggaW1hZ2UtPnR5cGUgPT0gTlVMTCApCisJCQljb250aW51ZTsKKwkJcmV0dXJuIHJjOworCX0KKworCURCR0MgKCBpbWFnZSwgIklNQUdFICVwIGZvcm1hdCBub3QgcmVjb2duaXNlZFxuIiwgaW1hZ2UgKTsKKwlyZXR1cm4gLUVOT0VYRUM7Cit9CisKKy8qKgorICogRXhlY3V0ZSBsb2FkZWQgaW1hZ2UKKyAqCisgKiBAdiBpbWFnZQkJTG9hZGVkIGltYWdlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IGltYWdlX2V4ZWMgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXN0cnVjdCBpbWFnZSAqcmVwbGFjZW1lbnQ7CisJc3RydWN0IHVyaSAqb2xkX2N3dXJpOworCWludCByYzsKKworCS8qIEltYWdlIG11c3QgYmUgbG9hZGVkIGZpcnN0ICovCisJaWYgKCAhICggaW1hZ2UtPmZsYWdzICYgSU1BR0VfTE9BREVEICkgKSB7CisJCURCR0MgKCBpbWFnZSwgIklNQUdFICVwIGNvdWxkIG5vdCBleGVjdXRlOiBub3QgbG9hZGVkXG4iLAorCQkgICAgICAgaW1hZ2UgKTsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCisJYXNzZXJ0ICggaW1hZ2UtPnR5cGUgIT0gTlVMTCApOworCisJLyogQ2hlY2sgdGhhdCBpbWFnZSBpcyBhY3R1YWxseSBleGVjdXRhYmxlICovCisJaWYgKCAhIGltYWdlLT50eXBlLT5leGVjICkKKwkJcmV0dXJuIC1FTk9FWEVDOworCisJLyogU3dpdGNoIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgdG8gYmUgdGhhdCBvZiB0aGUgaW1hZ2UgaXRzZWxmICovCisJb2xkX2N3dXJpID0gdXJpX2dldCAoIGN3dXJpICk7CisJY2h1cmkgKCBpbWFnZS0+dXJpICk7CisKKwkvKiBUYWtlIG91dCBhIHRlbXBvcmFyeSByZWZlcmVuY2UgdG8gdGhlIGltYWdlLiAgVGhpcyBhbGxvd3MKKwkgKiB0aGUgaW1hZ2UgdG8gdW5yZWdpc3RlciBpdHNlbGYgaWYgbmVjZXNzYXJ5LCB3aXRob3V0CisJICogYXV0b21hdGljYWxseSBmcmVlaW5nIGl0c2VsZi4KKwkgKi8KKwlpbWFnZV9nZXQgKCBpbWFnZSApOworCisJLyogVHJ5IGV4ZWN1dGluZyB0aGUgaW1hZ2UgKi8KKwlpZiAoICggcmMgPSBpbWFnZS0+dHlwZS0+ZXhlYyAoIGltYWdlICkgKSAhPSAwICkgeworCQlEQkdDICggaW1hZ2UsICJJTUFHRSAlcCBjb3VsZCBub3QgZXhlY3V0ZTogJXNcbiIsCisJCSAgICAgICBpbWFnZSwgc3RyZXJyb3IgKCByYyApICk7CisJCS8qIERvIG5vdCByZXR1cm4geWV0OyB3ZSBzdGlsbCBoYXZlIGNsZWFuLXVwIHRvIGRvICovCisJfQorCisJLyogUGljayB1cCByZXBsYWNlbWVudCBpbWFnZSBiZWZvcmUgd2UgZHJvcCB0aGUgb3JpZ2luYWwKKwkgKiBpbWFnZSdzIHRlbXBvcmFyeSByZWZlcmVuY2UuCisJICovCisJcmVwbGFjZW1lbnQgPSBpbWFnZS0+cmVwbGFjZW1lbnQ7CisKKwkvKiBEcm9wIHRlbXBvcmFyeSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGltYWdlICovCisJaW1hZ2VfcHV0ICggaW1hZ2UgKTsKKworCS8qIFJlc2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KKwljaHVyaSAoIG9sZF9jd3VyaSApOworCXVyaV9wdXQgKCBvbGRfY3d1cmkgKTsKKworCS8qIFRhaWwtcmVjdXJzZSBpbnRvIHJlcGxhY2VtZW50IGltYWdlLCBpZiBvbmUgZXhpc3RzICovCisJaWYgKCByZXBsYWNlbWVudCApIHsKKwkJREJHQyAoIGltYWdlLCAiSU1BR0UgJXAgcmVwbGFjaW5nIHNlbGYgd2l0aCBJTUFHRSAlcFxuIiwKKwkJICAgICAgIGltYWdlLCByZXBsYWNlbWVudCApOworCQlpZiAoICggcmMgPSBpbWFnZV9leGVjICggcmVwbGFjZW1lbnQgKSApICE9IDAgKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZWdpc3RlciBhbmQgYXV0b2xvYWQgYW4gaW1hZ2UKKyAqCisgKiBAdiBpbWFnZQkJSW1hZ2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgcmVnaXN0ZXJfYW5kX2F1dG9sb2FkX2ltYWdlICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwlpbnQgcmM7CisKKwlpZiAoICggcmMgPSByZWdpc3Rlcl9pbWFnZSAoIGltYWdlICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJaWYgKCAoIHJjID0gaW1hZ2VfYXV0b2xvYWQgKCBpbWFnZSApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlZ2lzdGVyIGFuZCBhdXRvZXhlYyBhbiBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlJbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCByZWdpc3Rlcl9hbmRfYXV0b2V4ZWNfaW1hZ2UgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCWludCByYzsKKworCWlmICggKCByYyA9IHJlZ2lzdGVyX2FuZF9hdXRvbG9hZF9pbWFnZSAoIGltYWdlICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJaWYgKCAoIHJjID0gaW1hZ2VfZXhlYyAoIGltYWdlICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL2luaXQuYyBiL2dweGUvc3JjL2NvcmUvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMGY2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2luaXQuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9kZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKworLyoqIEBmaWxlCisgKgorICogSW5pdGlhbGlzYXRpb24sIHN0YXJ0dXAgYW5kIHNodXRkb3duIHJvdXRpbmVzCisgKgorICovCisKKy8qKiAic3RhcnR1cCgpIGhhcyBiZWVuIGNhbGxlZCIgZmxhZyAqLworc3RhdGljIGludCBzdGFydGVkID0gMDsKKworLyoqCisgKiBJbml0aWFsaXNlIGdQWEUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBvbmUtdGltZS1vbmx5IGFuZCBpcnJldmVyc2libGUKKyAqIGluaXRpYWxpc2F0aW9uIHN0ZXBzLCBzdWNoIGFzIGluaXRpYWxpc2luZyB0aGUgaGVhcC4gIEl0IG11c3QgYmUKKyAqIGNhbGxlZCBiZWZvcmUgKGFsbW9zdCkgYW55IG90aGVyIGZ1bmN0aW9uLgorICoKKyAqIFRoZXJlIGlzLCBieSBkZWZpbml0aW9uLCBubyBjb3VudGVycGFydCB0byB0aGlzIGZ1bmN0aW9uIG9uIHRoZQorICogc2h1dGRvd24gcGF0aC4KKyAqLwordm9pZCBpbml0aWFsaXNlICggdm9pZCApIHsKKwlzdHJ1Y3QgaW5pdF9mbiAqaW5pdF9mbjsKKworCS8qIENhbGwgcmVnaXN0ZXJlZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgKi8KKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIGluaXRfZm4sIElOSVRfRk5TICkKKwkJaW5pdF9mbi0+aW5pdGlhbGlzZSAoKTsKK30KKworLyoqCisgKiBTdGFydCB1cCBnUFhFCisgKgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgcmVwZWF0YWJsZSBpbml0aWFsaXNhdGlvbiBzdGVwcywgc3VjaCBhcworICogcHJvYmluZyBkZXZpY2VzLiAgWW91IG1heSBjYWxsIHN0YXJ0dXAoKSBhbmQgc2h1dGRvd24oKSBtdWx0aXBsZQorICogdGltZXMgKGFzIGlzIGRvbmUgdmlhIHRoZSBQWEUgQVBJIHdoZW4gUFhFTlZfU1RBUlRfVU5ESSBpcyB1c2VkKS4KKyAqLwordm9pZCBzdGFydHVwICggdm9pZCApIHsKKwlzdHJ1Y3Qgc3RhcnR1cF9mbiAqc3RhcnR1cF9mbjsKKworCWlmICggc3RhcnRlZCApCisJCXJldHVybjsKKworCS8qIENhbGwgcmVnaXN0ZXJlZCBzdGFydHVwIGZ1bmN0aW9ucyAqLworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggc3RhcnR1cF9mbiwgU1RBUlRVUF9GTlMgKSB7CisJCWlmICggc3RhcnR1cF9mbi0+c3RhcnR1cCApCisJCQlzdGFydHVwX2ZuLT5zdGFydHVwKCk7CisJfQorCisJc3RhcnRlZCA9IDE7Cit9CisKKy8qKgorICogU2h1dCBkb3duIGdQWEUKKyAqCisgKiBAdiBmbGFncwkJU2h1dGRvd24gYmVoYXZpb3VyIGZsYWdzCisgKgorICogVGhpcyBmdW5jdGlvbiByZXZlcnNlcyB0aGUgYWN0aW9ucyBvZiBzdGFydHVwKCksIGFuZCBsZWF2ZXMgZ1BYRSBpbgorICogYSBzdGF0ZSByZWFkeSB0byBiZSByZW1vdmVkIGZyb20gbWVtb3J5LiAgWW91IG1heSBjYWxsIHN0YXJ0dXAoKQorICogYWdhaW4gYWZ0ZXIgY2FsbGluZyBzaHV0ZG93bigpLgorICoKKyAqIENhbGwgdGhpcyBmdW5jdGlvbiBvbmx5IG9uY2UsIGJlZm9yZSBlaXRoZXIgZXhpdGluZyBtYWluKCkgb3IKKyAqIHN0YXJ0aW5nIHVwIGEgbm9uLXJldHVybmFibGUgaW1hZ2UuCisgKi8KK3ZvaWQgc2h1dGRvd24gKCBpbnQgZmxhZ3MgKSB7CisJc3RydWN0IHN0YXJ0dXBfZm4gKnN0YXJ0dXBfZm47CisKKwlpZiAoICEgc3RhcnRlZCApCisJCXJldHVybjsKKworCS8qIENhbGwgcmVnaXN0ZXJlZCBzaHV0ZG93biBmdW5jdGlvbnMgKGluIHJldmVyc2Ugb3JkZXIpICovCisJZm9yX2VhY2hfdGFibGVfZW50cnlfcmV2ZXJzZSAoIHN0YXJ0dXBfZm4sIFNUQVJUVVBfRk5TICkgeworCQlpZiAoIHN0YXJ0dXBfZm4tPnNodXRkb3duICkKKwkJCXN0YXJ0dXBfZm4tPnNodXRkb3duICggZmxhZ3MgKTsKKwl9CisKKwlzdGFydGVkID0gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvaW50ZXJmYWNlLmMgYi9ncHhlL3NyYy9jb3JlL2ludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDU4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL2ludGVyZmFjZS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBPYmplY3QgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2VzCisgKgorICovCisKKy8qKgorICogUGx1ZyBhbiBpbnRlcmZhY2UgaW50byBhIG5ldyBkZXN0aW5hdGlvbiBpbnRlcmZhY2UKKyAqCisgKiBAdiBpbnRmCQlJbnRlcmZhY2UKKyAqIEB2IGRlc3QJCU5ldyBkZXN0aW5hdGlvbiBpbnRlcmZhY2UKKyAqCisgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBkZXN0aW5hdGlvbiBpbnRlcmZhY2UgaXMgZHJvcHBlZCwgYQorICogcmVmZXJlbmNlIHRvIHRoZSBuZXcgZGVzdGluYXRpb24gaW50ZXJmYWNlIGlzIG9idGFpbmVkLCBhbmQgdGhlCisgKiBpbnRlcmZhY2UgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV3IGRlc3RpbmF0aW9uIGludGVyZmFjZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gInVucGx1ZyIgY2FsbDsgaW5zdGVhZCB5b3UgbXVzdCBwbHVnIHRoZQorICogaW50ZXJmYWNlIGludG8gYSBudWxsIGludGVyZmFjZS4KKyAqLwordm9pZCBwbHVnICggc3RydWN0IGludGVyZmFjZSAqaW50Ziwgc3RydWN0IGludGVyZmFjZSAqZGVzdCApIHsKKwlEQkdDICggaW50ZiwgIklOVEYgJXAgbW92aW5nIGZyb20gSU5URiAlcCB0byBJTlRGICVwXG4iLAorCSAgICAgICBpbnRmLCBpbnRmLT5kZXN0LCBkZXN0ICk7CisJaW50Zl9wdXQgKCBpbnRmLT5kZXN0ICk7CisJaW50Zi0+ZGVzdCA9IGludGZfZ2V0ICggZGVzdCApOworfQorCisvKioKKyAqIFBsdWcgdHdvIGludGVyZmFjZXMgdG9nZXRoZXIKKyAqCisgKiBAdiBhCQkJSW50ZXJmYWNlIEEKKyAqIEB2IGIJCQlJbnRlcmZhY2UgQgorICoKKyAqIFBsdWdzIGludGVyZmFjZSBBIGludG8gaW50ZXJmYWNlIEIsIGFuZCBpbnRlcmZhY2UgQiBpbnRvIGludGVyZmFjZQorICogQS4gIChUaGUgYmFzaWMgcGx1ZygpIGZ1bmN0aW9uIGlzIHVuaWRpcmVjdGlvbmFsOyB0aGlzIGZ1bmN0aW9uIGlzCisgKiBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIHR3byBjYWxscyB0byBwbHVnKCksIGhlbmNlIHRoZSBuYW1lLikKKyAqLwordm9pZCBwbHVnX3BsdWcgKCBzdHJ1Y3QgaW50ZXJmYWNlICphLCBzdHJ1Y3QgaW50ZXJmYWNlICpiICkgeworCXBsdWcgKCBhLCBiICk7CisJcGx1ZyAoIGIsIGEgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvaW9idWYuYyBiL2dweGUvc3JjL2NvcmUvaW9idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2U3ODkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9pb2J1Zi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvbWFsbG9jLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorCisvKiogQGZpbGUKKyAqCisgKiBJL08gYnVmZmVycworICoKKyAqLworCisvKioKKyAqIEFsbG9jYXRlIEkvTyBidWZmZXIKKyAqCisgKiBAdiBsZW4JUmVxdWlyZWQgbGVuZ3RoIG9mIGJ1ZmZlcgorICogQHJldCBpb2J1ZglJL08gYnVmZmVyLCBvciBOVUxMIGlmIG5vbmUgYXZhaWxhYmxlCisgKgorICogVGhlIEkvTyBidWZmZXIgd2lsbCBiZSBwaHlzaWNhbGx5IGFsaWduZWQgdG8gYSBtdWx0aXBsZSBvZgorICogQGMgSU9CVUZfU0laRS4KKyAqLworc3RydWN0IGlvX2J1ZmZlciAqIGFsbG9jX2lvYiAoIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgPSBOVUxMOworCXZvaWQgKmRhdGE7CisKKwkvKiBQYWQgdG8gbWluaW11bSBsZW5ndGggKi8KKwlpZiAoIGxlbiA8IElPQl9aTEVOICkKKwkJbGVuID0gSU9CX1pMRU47CisKKwkvKiBBbGlnbiBidWZmZXIgbGVuZ3RoICovCisJbGVuID0gKCBsZW4gKyBfX2FsaWdub2ZfXyggKmlvYnVmICkgLSAxICkgJgorCQl+KCBfX2FsaWdub2ZfXyggKmlvYnVmICkgLSAxICk7CisJCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBidWZmZXIgcGx1cyBkZXNjcmlwdG9yICovCisJZGF0YSA9IG1hbGxvY19kbWEgKCBsZW4gKyBzaXplb2YgKCAqaW9idWYgKSwgSU9CX0FMSUdOICk7CisJaWYgKCAhIGRhdGEgKQorCQlyZXR1cm4gTlVMTDsKKworCWlvYnVmID0gKCBzdHJ1Y3QgaW9fYnVmZmVyICogKSAoIGRhdGEgKyBsZW4gKTsKKwlpb2J1Zi0+aGVhZCA9IGlvYnVmLT5kYXRhID0gaW9idWYtPnRhaWwgPSBkYXRhOworCWlvYnVmLT5lbmQgPSBpb2J1ZjsKKwlyZXR1cm4gaW9idWY7Cit9CisKKy8qKgorICogRnJlZSBJL08gYnVmZmVyCisgKgorICogQHYgaW9idWYJSS9PIGJ1ZmZlcgorICovCit2b2lkIGZyZWVfaW9iICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKSB7CisJaWYgKCBpb2J1ZiApIHsKKwkJYXNzZXJ0ICggaW9idWYtPmhlYWQgPD0gaW9idWYtPmRhdGEgKTsKKwkJYXNzZXJ0ICggaW9idWYtPmRhdGEgPD0gaW9idWYtPnRhaWwgKTsKKwkJYXNzZXJ0ICggaW9idWYtPnRhaWwgPD0gaW9idWYtPmVuZCApOworCQlmcmVlX2RtYSAoIGlvYnVmLT5oZWFkLAorCQkJICAgKCBpb2J1Zi0+ZW5kIC0gaW9idWYtPmhlYWQgKSArIHNpemVvZiAoICppb2J1ZiApICk7CisJfQorfQorCisvKioKKyAqIEVuc3VyZSBJL08gYnVmZmVyIGhhcyBzdWZmaWNpZW50IGhlYWRyb29tCisgKgorICogQHYgaW9idWYJSS9PIGJ1ZmZlcgorICogQHYgbGVuCVJlcXVpcmVkIGhlYWRyb29tCisgKgorICogVGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgb25seSBjaGVja3MgZm9yIHRoZSByZXF1aXJlZCBoZWFkcm9vbTsgaXQKKyAqIGRvZXMgbm90IHJlYWxsb2NhdGUgdGhlIEkvTyBidWZmZXIgaWYgcmVxdWlyZWQuICBJZiB3ZSBldmVyIGhhdmUgYQorICogY29kZSBwYXRoIHRoYXQgcmVxdWlyZXMgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCdzIGEgZmFpcmx5IHRyaXZpYWwKKyAqIGNoYW5nZSB0byBtYWtlLgorICovCitpbnQgaW9iX2Vuc3VyZV9oZWFkcm9vbSAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzaXplX3QgbGVuICkgeworCisJaWYgKCBpb2JfaGVhZHJvb20gKCBpb2J1ZiApID49IGxlbiApCisJCXJldHVybiAwOworCXJldHVybiAtRU5PQlVGUzsKK30KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9qb2IuYyBiL2dweGUvc3JjL2NvcmUvam9iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4MDY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvam9iLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9qb2IuaD4KKworLyoqIEBmaWxlCisgKgorICogSm9iIGNvbnRyb2wgaW50ZXJmYWNlcworICoKKyAqLworCit2b2lkIGpvYl9kb25lICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiwgaW50IHJjICkgeworCXN0cnVjdCBqb2JfaW50ZXJmYWNlICpkZXN0ID0gam9iX2dldF9kZXN0ICggam9iICk7CisKKwlqb2JfdW5wbHVnICggam9iICk7CisJZGVzdC0+b3AtPmRvbmUgKCBkZXN0LCByYyApOworCWpvYl9wdXQgKCBkZXN0ICk7Cit9CisKK3ZvaWQgam9iX2tpbGwgKCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSAqam9iICkgeworCXN0cnVjdCBqb2JfaW50ZXJmYWNlICpkZXN0ID0gam9iX2dldF9kZXN0ICggam9iICk7CisKKwlqb2JfdW5wbHVnICggam9iICk7CisJZGVzdC0+b3AtPmtpbGwgKCBkZXN0ICk7CisJam9iX3B1dCAoIGRlc3QgKTsKK30KKwordm9pZCBqb2JfcHJvZ3Jlc3MgKCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSAqam9iLAorCQkgICAgc3RydWN0IGpvYl9wcm9ncmVzcyAqcHJvZ3Jlc3MgKSB7CisJc3RydWN0IGpvYl9pbnRlcmZhY2UgKmRlc3QgPSBqb2JfZ2V0X2Rlc3QgKCBqb2IgKTsKKworCWRlc3QtPm9wLT5wcm9ncmVzcyAoIGRlc3QsIHByb2dyZXNzICk7CisJam9iX3B1dCAoIGRlc3QgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBIZWxwZXIgbWV0aG9kcworICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBtZXRob2RzIGluIHRoZQorICogam9iX2ludGVyZmFjZV9vcGVyYXRpb25zIHRhYmxlLgorICoKKyAqLworCit2b2lkIGlnbm9yZV9qb2JfZG9uZSAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IgX191bnVzZWQsIGludCByYyBfX3VudXNlZCApIHsKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CisKK3ZvaWQgaWdub3JlX2pvYl9raWxsICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiBfX3VudXNlZCApIHsKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CisKK3ZvaWQgaWdub3JlX2pvYl9wcm9ncmVzcyAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IgX191bnVzZWQsCisJCQkgICBzdHJ1Y3Qgam9iX3Byb2dyZXNzICpwcm9ncmVzcyApIHsKKwltZW1zZXQgKCBwcm9ncmVzcywgMCwgc2l6ZW9mICggKnByb2dyZXNzICkgKTsKK30KKworLyoqIE51bGwgam9iIGNvbnRyb2wgaW50ZXJmYWNlIG9wZXJhdGlvbnMgKi8KK3N0cnVjdCBqb2JfaW50ZXJmYWNlX29wZXJhdGlvbnMgbnVsbF9qb2Jfb3BzID0geworCS5kb25lCQk9IGlnbm9yZV9qb2JfZG9uZSwKKwkua2lsbAkJPSBpZ25vcmVfam9iX2tpbGwsCisJLnByb2dyZXNzCT0gaWdub3JlX2pvYl9wcm9ncmVzcywKK307CisKKy8qKgorICogTnVsbCBqb2IgY29udHJvbCBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gd2hpY2ggam9iIGNvbnRyb2wgaW50ZXJmYWNlcyBhcmUgY29ubmVjdGVkCisgKiB3aGVuIHVucGx1Z2dlZC4gIEl0IHdpbGwgbmV2ZXIgZ2VuZXJhdGUgbWVzc2FnZXMsIGFuZCB3aWxsIHNpbGVudGx5CisgKiBhYnNvcmIgYWxsIHJlY2VpdmVkIG1lc3NhZ2VzLgorICovCitzdHJ1Y3Qgam9iX2ludGVyZmFjZSBudWxsX2pvYiA9IHsKKwkuaW50ZiA9IHsKKwkJLmRlc3QgPSAmbnVsbF9qb2IuaW50ZiwKKwkJLnJlZmNudCA9IE5VTEwsCisJfSwKKwkub3AgPSAmbnVsbF9qb2Jfb3BzLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvbGluZWJ1Zi5jIGIvZ3B4ZS9zcmMvY29yZS9saW5lYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxZjRlMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvbGluZWJ1Zi5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEBmaWxlCisgKgorICogTGluZSBidWZmZXJpbmcKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9saW5lYnVmLmg+CisKKy8qKgorICogUmV0cmlldmUgYnVmZmVyZWQtdXAgbGluZQorICoKKyAqIEB2IGxpbmVidWYJCUxpbmUgYnVmZmVyCisgKiBAcmV0IGxpbmUJCUJ1ZmZlcmVkIGxpbmUsIG9yIE5VTEwgaWYgbm8gbGluZSByZWFkeSB0byByZWFkCisgKi8KK2NoYXIgKiBidWZmZXJlZF9saW5lICggc3RydWN0IGxpbmVfYnVmZmVyICpsaW5lYnVmICkgeworCXJldHVybiAoIGxpbmVidWYtPnJlYWR5ID8gbGluZWJ1Zi0+ZGF0YSA6IE5VTEwgKTsKK30KKworLyoqCisgKiBEaXNjYXJkIGxpbmUgYnVmZmVyIGNvbnRlbnRzCisgKgorICogQHYgbGluZWJ1ZgkJTGluZSBidWZmZXIKKyAqLwordm9pZCBlbXB0eV9saW5lX2J1ZmZlciAoIHN0cnVjdCBsaW5lX2J1ZmZlciAqbGluZWJ1ZiApIHsKKwlmcmVlICggbGluZWJ1Zi0+ZGF0YSApOworCWxpbmVidWYtPmRhdGEgPSBOVUxMOworCWxpbmVidWYtPmxlbiA9IDA7CisJbGluZWJ1Zi0+cmVhZHkgPSAwOworfQorCisvKioKKyAqIEJ1ZmZlciB1cCByZWNlaXZlZCBkYXRhIGJ5IGxpbmVzCisgKgorICogQHYgbGluZWJ1ZgkJCUxpbmUgYnVmZmVyCisgKiBAdiBkYXRhCQkJTmV3IGRhdGEgdG8gYWRkCisgKiBAdiBsZW4JCQlMZW5ndGggb2YgbmV3IGRhdGEgdG8gYWRkCisgKiBAcmV0IGxlbgkJCUNvbnN1bWVkIGxlbmd0aCwgb3IgbmVnYXRpdmUgZXJyb3IgbnVtYmVyCisgKgorICogQWZ0ZXIgY2FsbGluZyBsaW5lX2J1ZmZlcigpLCB1c2UgYnVmZmVyZWRfbGluZSgpIHRvIGRldGVybWluZQorICogd2hldGhlciBvciBub3QgYSBjb21wbGV0ZSBsaW5lIGlzIGF2YWlsYWJsZS4gIENhcnJpYWdlIHJldHVybnMgYW5kCisgKiBuZXdsaW5lcyB3aWxsIGhhdmUgYmVlbiBzdHJpcHBlZCwgYW5kIHRoZSBsaW5lIHdpbGwgYmUKKyAqIE5VTC10ZXJtaW5hdGVkLiAgVGhpcyBidWZmZXJlZCBsaW5lIGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIG5leHQKKyAqIGNhbGwgdG8gbGluZV9idWZmZXIoKSAob3IgdG8gZW1wdHlfbGluZV9idWZmZXIoKSkuCisgKgorICogTm90ZSB0aGF0IGxpbmUgYnVmZmVycyB1c2UgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0b3JhZ2U7IHlvdQorICogc2hvdWxkIGNhbGwgZW1wdHlfbGluZV9idWZmZXIoKSBiZWZvcmUgZnJlZWluZyBhIEBjIHN0cnVjdCBAYworICogbGluZV9idWZmZXIuCisgKi8KK3NzaXplX3QgbGluZV9idWZmZXIgKCBzdHJ1Y3QgbGluZV9idWZmZXIgKmxpbmVidWYsCisJCSAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJY29uc3QgY2hhciAqZW9sOworCXNpemVfdCBjb25zdW1lOworCXNpemVfdCBuZXdfbGVuOworCWNoYXIgKm5ld19kYXRhOworCisJLyogRnJlZSBhbnkgY29tcGxldGVkIGxpbmUgZnJvbSBwcmV2aW91cyBpdGVyYXRpb24gKi8KKwlpZiAoIGxpbmVidWYtPnJlYWR5ICkKKwkJZW1wdHlfbGluZV9idWZmZXIgKCBsaW5lYnVmICk7CisKKwkvKiBTZWFyY2ggZm9yIGxpbmUgdGVybWluYXRvciAqLworCWlmICggKCBlb2wgPSBtZW1jaHIgKCBkYXRhLCAnXG4nLCBsZW4gKSApICkgeworCQljb25zdW1lID0gKCBlb2wgLSBkYXRhICsgMSApOworCX0gZWxzZSB7CisJCWNvbnN1bWUgPSBsZW47CisJfQorCisJLyogUmVhbGxvY2F0ZSBkYXRhIGJ1ZmZlciBhbmQgY29weSBpbiBuZXcgZGF0YSAqLworCW5ld19sZW4gPSAoIGxpbmVidWYtPmxlbiArIGNvbnN1bWUgKTsKKwluZXdfZGF0YSA9IHJlYWxsb2MgKCBsaW5lYnVmLT5kYXRhLCAoIG5ld19sZW4gKyAxICkgKTsKKwlpZiAoICEgbmV3X2RhdGEgKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkgKCAoIG5ld19kYXRhICsgbGluZWJ1Zi0+bGVuICksIGRhdGEsIGNvbnN1bWUgKTsKKwluZXdfZGF0YVtuZXdfbGVuXSA9ICdcMCc7CisJbGluZWJ1Zi0+ZGF0YSA9IG5ld19kYXRhOworCWxpbmVidWYtPmxlbiA9IG5ld19sZW47CisKKwkvKiBJZiB3ZSBoYXZlIHJlYWNoZWQgZW5kIG9mIGxpbmUsIHRyaW0gdGhlIGxpbmUgYW5kIG1hcmsgYXMgcmVhZHkgKi8KKwlpZiAoIGVvbCApIHsKKwkJbGluZWJ1Zi0+ZGF0YVstLWxpbmVidWYtPmxlbl0gPSAnXDAnOyAvKiB0cmltIE5MICovCisJCWlmICggbGluZWJ1Zi0+ZGF0YVtsaW5lYnVmLT5sZW4gLSAxXSA9PSAnXHInICkKKwkJCWxpbmVidWYtPmRhdGFbLS1saW5lYnVmLT5sZW5dID0gJ1wwJzsgLyogdHJpbSBDUiAqLworCQlsaW5lYnVmLT5yZWFkeSA9IDE7CisJfQorCisJcmV0dXJuIGNvbnN1bWU7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL21haW4uYyBiL2dweGUvc3JjL2NvcmUvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwN2QyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL21haW4uYwpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2dQWEUgLSAgTmV0d29yayBCb290c3RyYXAgUHJvZ3JhbQorCitMaXRlcmF0dXJlIGRlYWxpbmcgd2l0aCB0aGUgbmV0d29yayBwcm90b2NvbHM6CisJQVJQIC0gUkZDODI2CisJUkFSUCAtIFJGQzkwMworCVVEUCAtIFJGQzc2OAorCUJPT1RQIC0gUkZDOTUxLCBSRkMyMTMyICh2ZW5kb3IgZXh0ZW5zaW9ucykKKwlESENQIC0gUkZDMjEzMSwgUkZDMjEzMiAob3B0aW9ucykKKwlURlRQIC0gUkZDMTM1MCwgUkZDMjM0NyAob3B0aW9ucyksIFJGQzIzNDggKGJsb2Nrc2l6ZSksIFJGQzIzNDkgKHRzaXplKQorCVJQQyAtIFJGQzE4MzEsIFJGQzE4MzIgKFhEUiksIFJGQzE4MzMgKHJwY2JpbmQvcG9ydG1hcHBlcikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbml0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9mZWF0dXJlcy5oPgorI2luY2x1ZGUgPGdweGUvc2hlbGwuaD4KKyNpbmNsdWRlIDxncHhlL3NoZWxsX2Jhbm5lci5oPgorI2luY2x1ZGUgPGdweGUvaW1hZ2UuaD4KKyNpbmNsdWRlIDx1c3IvYXV0b2Jvb3QuaD4KKyNpbmNsdWRlIDxjb25maWcvZ2VuZXJhbC5oPgorCisjZGVmaW5lIE5PUk1BTAkiXDAzM1swbSIKKyNkZWZpbmUgQk9MRAkiXDAzM1sxbSIKKyNkZWZpbmUgQ1lBTgkiXDAzM1szNm0iCisKKy8qKgorICogTWFpbiBlbnRyeSBwb2ludAorICoKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitfX2FzbWNhbGwgaW50IG1haW4gKCB2b2lkICkgeworCXN0cnVjdCBmZWF0dXJlICpmZWF0dXJlOworCXN0cnVjdCBpbWFnZSAqaW1hZ2U7CisKKwkvKiBTb21lIGRldmljZXMgdGFrZSBhbiB1bnJlYXNvbmFibHkgbG9uZyB0aW1lIHRvIGluaXRpYWxpc2UgKi8KKwlwcmludGYgKCBQUk9EVUNUX1NIT1JUX05BTUUgIiBpbml0aWFsaXNpbmcgZGV2aWNlcy4uLlxuIiApOworCisJaW5pdGlhbGlzZSgpOworCXN0YXJ0dXAoKTsKKworCS8qCisJICogUHJpbnQgd2VsY29tZSBiYW5uZXIKKwkgKgorCSAqCisJICogSWYgeW91IHdpc2ggdG8gYnJhbmQgdGhpcyBidWlsZCBvZiBnUFhFLCBwbGVhc2UgZG8gc28gYnkKKwkgKiBkZWZpbmluZyB0aGUgc3RyaW5nIFBST0RVQ1RfTkFNRSBpbiBjb25maWcvZ2VuZXJhbC5oLgorCSAqCisJICogV2hpbGUgbm90aGluZyBpbiB0aGUgR1BMIHByZXZlbnRzIHlvdSBmcm9tIHJlbW92aW5nIGFsbAorCSAqIHJlZmVyZW5jZXMgdG8gZ1BYRSBvciBodHRwOi8vZXRoZXJib290Lm9yZywgd2UgcHJlZmVyIHlvdQorCSAqIG5vdCB0byBkbyBzby4KKwkgKgorCSAqLworCXByaW50ZiAoIE5PUk1BTCAiXG5cbiIgUFJPRFVDVF9OQU1FICJcbiIgQk9MRCAiZ1BYRSAiIFZFUlNJT04KKwkJIE5PUk1BTCAiIC0tIE9wZW4gU291cmNlIEJvb3QgRmlybXdhcmUgLS0gIgorCQkgQ1lBTiAiaHR0cDovL2V0aGVyYm9vdC5vcmciIE5PUk1BTCAiXG4iCisJCSAiRmVhdHVyZXM6IiApOworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggZmVhdHVyZSwgRkVBVFVSRVMgKQorCQlwcmludGYgKCAiICVzIiwgZmVhdHVyZS0+bmFtZSApOworCXByaW50ZiAoICJcbiIgKTsKKworCS8qIFByb21wdCBmb3Igc2hlbGwgKi8KKwlpZiAoIHNoZWxsX2Jhbm5lcigpICkgeworCQkvKiBVc2VyIHdhbnRzIHNoZWxsOyBqdXN0IGdpdmUgdGhlbSBhIHNoZWxsICovCisJCXNoZWxsKCk7CisJfSBlbHNlIHsKKwkJLyogVXNlciBkb2Vzbid0IHdhbnQgc2hlbGw7IGxvYWQgYW5kIGV4ZWN1dGUgdGhlIGZpcnN0CisJCSAqIGltYWdlLCBvciBhdXRvYm9vdCgpIGlmIHdlIGhhdmUgbm8gaW1hZ2VzLiAgSWYKKwkJICogYm9vdGluZyBmYWlscyBmb3IgYW55IHJlYXNvbiwgb2ZmZXIgYSBzZWNvbmQgY2hhbmNlCisJCSAqIHRvIGVudGVyIHRoZSBzaGVsbCBmb3IgZGlhZ25vc3RpY3MuCisJCSAqLworCQlpZiAoIGhhdmVfaW1hZ2VzKCkgKSB7CisJCQlmb3JfZWFjaF9pbWFnZSAoIGltYWdlICkgeworCQkJCWltYWdlX2V4ZWMgKCBpbWFnZSApOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJYXV0b2Jvb3QoKTsKKwkJfQorCisJCWlmICggc2hlbGxfYmFubmVyKCkgKQorCQkJc2hlbGwoKTsKKwl9CisKKwlzaHV0ZG93biAoIFNIVVRET1dOX0VYSVQgfCBzaHV0ZG93bl9leGl0X2ZsYWdzICk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvbWFsbG9jLmMgYi9ncHhlL3NyYy9jb3JlL21hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTM3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL21hbGxvYy5jCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKyNpbmNsdWRlIDxncHhlL21hbGxvYy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBEeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uCisgKgorICovCisKKy8qKiBBIGZyZWUgYmxvY2sgb2YgbWVtb3J5ICovCitzdHJ1Y3QgbWVtb3J5X2Jsb2NrIHsKKwkvKiogTGlzdCBvZiBmcmVlIGJsb2NrcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwkvKiogU2l6ZSBvZiB0aGlzIGJsb2NrICovCisJc2l6ZV90IHNpemU7Cit9OworCisjZGVmaW5lIE1JTl9NRU1CTE9DS19TSVpFIFwKKwkoICggc2l6ZV90ICkgKCAxIDw8ICggZmxzICggc2l6ZW9mICggc3RydWN0IG1lbW9yeV9ibG9jayApIC0gMSApICkgKSApCisKKy8qKiBBIGJsb2NrIG9mIGFsbG9jYXRlZCBtZW1vcnkgY29tcGxldGUgd2l0aCBzaXplIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgYXV0b3NpemVkX2Jsb2NrIHsKKwkvKiogU2l6ZSBvZiB0aGlzIGJsb2NrICovCisJc2l6ZV90IHNpemU7CisJLyoqIFJlbWFpbmluZyBkYXRhICovCisJY2hhciBkYXRhWzBdOworfTsKKworLyoqCisgKiBBZGRyZXNzIGZvciB6ZXJvLWxlbmd0aCBtZW1vcnkgYmxvY2tzCisgKgorICogQGMgbWFsbG9jKDApIG9yIEBjIHJlYWxsb2MocHRyLDApIHdpbGwgcmV0dXJuIHRoZSBzcGVjaWFsIHZhbHVlIEBjCisgKiBOT1dIRVJFLiAgQ2FsbGluZyBAYyBmcmVlKE5PV0hFUkUpIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisgKgorICogVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIEFOU0kgQyBzdGFuZGFyZHMsIHdoaWNoIHN0YXRlIHRoYXQKKyAqICJlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgc3VpdGFibGUgdG8gYmUgcGFzc2VkIHRvIGZyZWUoKSIgbXVzdCBiZQorICogcmV0dXJuZWQgaW4gdGhlc2UgY2FzZXMuICBVc2luZyBhIHNwZWNpYWwgbm9uLU5VTEwgdmFsdWUgbWVhbnMgdGhhdAorICogdGhlIGNhbGxlciBjYW4gdGFrZSBhIE5VTEwgcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIGZhaWx1cmUsCisgKiB3aXRob3V0IGZpcnN0IGhhdmluZyB0byBjaGVjayBmb3IgYSByZXF1ZXN0ZWQgc2l6ZSBvZiB6ZXJvLgorICoKKyAqIENvZGUgb3V0c2lkZSBvZiBtYWxsb2MuYyBkbyBub3QgZXZlciBuZWVkIHRvIHJlZmVyIHRvIHRoZSBhY3R1YWwKKyAqIHZhbHVlIG9mIEBjIE5PV0hFUkU7IHRoaXMgaXMgYW4gaW50ZXJuYWwgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZSBOT1dIRVJFICggKCB2b2lkICogKSB+KCAoIGludHB0cl90ICkgMCApICkKKworLyoqIExpc3Qgb2YgZnJlZSBtZW1vcnkgYmxvY2tzICovCitzdGF0aWMgTElTVF9IRUFEICggZnJlZV9ibG9ja3MgKTsKKworLyoqIFRvdGFsIGFtb3VudCBvZiBmcmVlIG1lbW9yeSAqLworc2l6ZV90IGZyZWVtZW07CisKKy8qKgorICogSGVhcCBzaXplCisgKgorICogQ3VycmVudGx5IGZpeGVkIGF0IDUxMmtCLgorICovCisjZGVmaW5lIEhFQVBfU0laRSAoIDUxMiAqIDEwMjQgKQorCisvKiogVGhlIGhlYXAgaXRzZWxmICovCitzdGF0aWMgY2hhciBoZWFwW0hFQVBfU0laRV0gX19hdHRyaWJ1dGVfXyAoKCBhbGlnbmVkICggX19hbGlnbm9mX18odm9pZCAqKSApKSk7CisKKy8qKgorICogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sKKyAqCisgKiBAdiBzaXplCQlSZXF1ZXN0ZWQgc2l6ZQorICogQHYgYWxpZ24JCVBoeXNpY2FsIGFsaWdubWVudAorICogQHJldCBwdHIJCU1lbW9yeSBibG9jaywgb3IgTlVMTAorICoKKyAqIEFsbG9jYXRlcyBhIG1lbW9yeSBibG9jayBAYiBwaHlzaWNhbGx5IGFsaWduZWQgYXMgcmVxdWVzdGVkLiAgTm8KKyAqIGd1YXJhbnRlZXMgYXJlIHByb3ZpZGVkIGZvciB0aGUgYWxpZ25tZW50IG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3MuCisgKgorICogQGMgYWxpZ24gbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gIEBjIHNpemUgbWF5IG5vdCBiZSB6ZXJvLgorICovCit2b2lkICogYWxsb2NfbWVtYmxvY2sgKCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduICkgeworCXN0cnVjdCBtZW1vcnlfYmxvY2sgKmJsb2NrOworCXNpemVfdCBhbGlnbl9tYXNrOworCXNpemVfdCBwcmVfc2l6ZTsKKwlzc2l6ZV90IHBvc3Rfc2l6ZTsKKwlzdHJ1Y3QgbWVtb3J5X2Jsb2NrICpwcmU7CisJc3RydWN0IG1lbW9yeV9ibG9jayAqcG9zdDsKKworCS8qIFJvdW5kIHVwIHNpemUgdG8gbXVsdGlwbGUgb2YgTUlOX01FTUJMT0NLX1NJWkUgYW5kCisJICogY2FsY3VsYXRlIGFsaWdubWVudCBtYXNrLgorCSAqLworCXNpemUgPSAoIHNpemUgKyBNSU5fTUVNQkxPQ0tfU0laRSAtIDEgKSAmIH4oIE1JTl9NRU1CTE9DS19TSVpFIC0gMSApOworCWFsaWduX21hc2sgPSAoIGFsaWduIC0gMSApIHwgKCBNSU5fTUVNQkxPQ0tfU0laRSAtIDEgKTsKKworCURCRyAoICJBbGxvY2F0aW5nICUjenggKGFsaWduZWQgJSN6eClcbiIsIHNpemUsIGFsaWduICk7CisKKwkvKiBTZWFyY2ggdGhyb3VnaCBibG9ja3MgZm9yIHRoZSBmaXJzdCBvbmUgd2l0aCBlbm91Z2ggc3BhY2UgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggYmxvY2ssICZmcmVlX2Jsb2NrcywgbGlzdCApIHsKKwkJcHJlX3NpemUgPSAoIC0gdmlydF90b19waHlzICggYmxvY2sgKSApICYgYWxpZ25fbWFzazsKKwkJcG9zdF9zaXplID0gYmxvY2stPnNpemUgLSBwcmVfc2l6ZSAtIHNpemU7CisJCWlmICggcG9zdF9zaXplID49IDAgKSB7CisJCQkvKiBTcGxpdCBibG9jayBpbnRvIHByZS1ibG9jaywgYmxvY2ssIGFuZAorCQkJICogcG9zdC1ibG9jay4gIEFmdGVyIHRoaXMgc3BsaXQsIHRoZSAicHJlIgorCQkJICogYmxvY2sgaXMgdGhlIG9uZSBjdXJyZW50bHkgbGlua2VkIGludG8gdGhlCisJCQkgKiBmcmVlIGxpc3QuCisJCQkgKi8KKwkJCXByZSAgID0gYmxvY2s7CisJCQlibG9jayA9ICggKCAoIHZvaWQgKiApIHByZSAgICkgKyBwcmVfc2l6ZSApOworCQkJcG9zdCAgPSAoICggKCB2b2lkICogKSBibG9jayApICsgc2l6ZSAgICAgKTsKKwkJCURCRyAoICJbJXAsJXApIC0+IFslcCwlcCkgKyBbJXAsJXApXG4iLCBwcmUsCisJCQkgICAgICAoICggKCB2b2lkICogKSBwcmUgKSArIHByZS0+c2l6ZSApLCBwcmUsIGJsb2NrLAorCQkJICAgICAgcG9zdCwgKCAoICggdm9pZCAqICkgcHJlICkgKyBwcmUtPnNpemUgKSApOworCQkJLyogSWYgdGhlcmUgaXMgYSAicG9zdCIgYmxvY2ssIGFkZCBpdCBpbiB0bworCQkJICogdGhlIGZyZWUgbGlzdC4gIExlYWsgaXQgaWYgaXQgaXMgdG9vIHNtYWxsCisJCQkgKiAod2hpY2ggY2FuIGhhcHBlbiBvbmx5IGF0IHRoZSB2ZXJ5IGVuZCBvZgorCQkJICogdGhlIGhlYXApLgorCQkJICovCisJCQlpZiAoICggc2l6ZV90ICkgcG9zdF9zaXplID49IE1JTl9NRU1CTE9DS19TSVpFICkgeworCQkJCXBvc3QtPnNpemUgPSBwb3N0X3NpemU7CisJCQkJbGlzdF9hZGQgKCAmcG9zdC0+bGlzdCwgJnByZS0+bGlzdCApOworCQkJfQorCQkJLyogU2hyaW5rICJwcmUiIGJsb2NrLCBsZWF2aW5nIHRoZSBtYWluIGJsb2NrCisJCQkgKiBpc29sYXRlZCBhbmQgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGZyZWUKKwkJCSAqIGxpc3QuCisJCQkgKi8KKwkJCXByZS0+c2l6ZSA9IHByZV9zaXplOworCQkJLyogSWYgdGhlcmUgaXMgbm8gInByZSIgYmxvY2ssIHJlbW92ZSBpdCBmcm9tCisJCQkgKiB0aGUgbGlzdC4gIEFsc28gcmVtb3ZlIGl0IChpLmUuIGxlYWsgaXQpIGlmCisJCQkgKiBpdCBpcyB0b28gc21hbGwsIHdoaWNoIGNhbiBoYXBwZW4gb25seSBhdAorCQkJICogdGhlIHZlcnkgc3RhcnQgb2YgdGhlIGhlYXAuCisJCQkgKi8KKwkJCWlmICggcHJlX3NpemUgPCBNSU5fTUVNQkxPQ0tfU0laRSApCisJCQkJbGlzdF9kZWwgKCAmcHJlLT5saXN0ICk7CisJCQkvKiBVcGRhdGUgdG90YWwgZnJlZSBtZW1vcnkgKi8KKwkJCWZyZWVtZW0gLT0gc2l6ZTsKKwkJCS8qIFJldHVybiBhbGxvY2F0ZWQgYmxvY2sgKi8KKwkJCURCRyAoICJBbGxvY2F0ZWQgWyVwLCVwKVxuIiwgYmxvY2ssCisJCQkgICAgICAoICggKCB2b2lkICogKSBibG9jayApICsgc2l6ZSApICk7CisJCQlyZXR1cm4gYmxvY2s7CisJCX0KKwl9CisKKwlEQkcgKCAiRmFpbGVkIHRvIGFsbG9jYXRlICUjenggKGFsaWduZWQgJSN6eClcbiIsIHNpemUsIGFsaWduICk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRnJlZSBhIG1lbW9yeSBibG9jaworICoKKyAqIEB2IHB0cgkJTWVtb3J5IGFsbG9jYXRlZCBieSBhbGxvY19tZW1ibG9jaygpLCBvciBOVUxMCisgKiBAdiBzaXplCQlTaXplIG9mIHRoZSBtZW1vcnkKKyAqCisgKiBJZiBAYyBwdHIgaXMgTlVMTCwgbm8gYWN0aW9uIGlzIHRha2VuLgorICovCit2b2lkIGZyZWVfbWVtYmxvY2sgKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICkgeworCXN0cnVjdCBtZW1vcnlfYmxvY2sgKmZyZWVpbmc7CisJc3RydWN0IG1lbW9yeV9ibG9jayAqYmxvY2s7CisJc3NpemVfdCBnYXBfYmVmb3JlOworCXNzaXplX3QgZ2FwX2FmdGVyID0gLTE7CisKKwkvKiBBbGxvdyBmb3IgcHRyPT1OVUxMICovCisJaWYgKCAhIHB0ciApCisJCXJldHVybjsKKworCS8qIFJvdW5kIHVwIHNpemUgdG8gbWF0Y2ggYWN0dWFsIHNpemUgdGhhdCBhbGxvY19tZW1ibG9jaygpCisJICogd291bGQgaGF2ZSB1c2VkLgorCSAqLworCXNpemUgPSAoIHNpemUgKyBNSU5fTUVNQkxPQ0tfU0laRSAtIDEgKSAmIH4oIE1JTl9NRU1CTE9DS19TSVpFIC0gMSApOworCWZyZWVpbmcgPSBwdHI7CisJZnJlZWluZy0+c2l6ZSA9IHNpemU7CisJREJHICggIkZyZWVpbmcgWyVwLCVwKVxuIiwgZnJlZWluZywgKCAoICggdm9pZCAqICkgZnJlZWluZyApICsgc2l6ZSApKTsKKworCS8qIEluc2VydC9tZXJnZSBpbnRvIGZyZWUgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBibG9jaywgJmZyZWVfYmxvY2tzLCBsaXN0ICkgeworCQkvKiBDYWxjdWxhdGUgZ2FwcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSAiZnJlZWluZyIgYmxvY2sgKi8KKwkJZ2FwX2JlZm9yZSA9ICggKCAoIHZvaWQgKiApIGZyZWVpbmcgKSAtIAorCQkJICAgICAgICggKCAoIHZvaWQgKiApIGJsb2NrICkgKyBibG9jay0+c2l6ZSApICk7CisJCWdhcF9hZnRlciA9ICggKCAoIHZvaWQgKiApIGJsb2NrICkgLSAKKwkJCSAgICAgICggKCAoIHZvaWQgKiApIGZyZWVpbmcgKSArIGZyZWVpbmctPnNpemUgKSApOworCQkvKiBNZXJnZSB3aXRoIGltbWVkaWF0ZWx5IHByZWNlZGluZyBibG9jaywgaWYgcG9zc2libGUgKi8KKwkJaWYgKCBnYXBfYmVmb3JlID09IDAgKSB7CisJCQlEQkcgKCAiWyVwLCVwKSArIFslcCwlcCkgLT4gWyVwLCVwKVxuIiwgYmxvY2ssCisJCQkgICAgICAoICggKCB2b2lkICogKSBibG9jayApICsgYmxvY2stPnNpemUgKSwgZnJlZWluZywKKwkJCSAgICAgICggKCAoIHZvaWQgKiApIGZyZWVpbmcgKSArIGZyZWVpbmctPnNpemUgKSxibG9jaywKKwkJCSAgICAgICggKCAoIHZvaWQgKiApIGZyZWVpbmcgKSArIGZyZWVpbmctPnNpemUgKSApOworCQkJYmxvY2stPnNpemUgKz0gc2l6ZTsKKwkJCWxpc3RfZGVsICggJmJsb2NrLT5saXN0ICk7CisJCQlmcmVlaW5nID0gYmxvY2s7CisJCX0KKwkJLyogU3RvcCBwcm9jZXNzaW5nIGFzIHNvb24gYXMgd2UgcmVhY2ggYSBmb2xsb3dpbmcgYmxvY2sgKi8KKwkJaWYgKCBnYXBfYWZ0ZXIgPj0gMCApCisJCQlicmVhazsKKwl9CisKKwkvKiBJbnNlcnQgYmVmb3JlIHRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYmxvY2suICBJZgorCSAqIHBvc3NpYmxlLCBtZXJnZSB0aGUgZm9sbG93aW5nIGJsb2NrIGludG8gdGhlICJmcmVlaW5nIgorCSAqIGJsb2NrLgorCSAqLworCURCRyAoICJbJXAsJXApXG4iLCBmcmVlaW5nLCAoICggKCB2b2lkICogKSBmcmVlaW5nICkgKyBmcmVlaW5nLT5zaXplKSk7CisJbGlzdF9hZGRfdGFpbCAoICZmcmVlaW5nLT5saXN0LCAmYmxvY2stPmxpc3QgKTsKKwlpZiAoIGdhcF9hZnRlciA9PSAwICkgeworCQlEQkcgKCAiWyVwLCVwKSArIFslcCwlcCkgLT4gWyVwLCVwKVxuIiwgZnJlZWluZywKKwkJICAgICAgKCAoICggdm9pZCAqICkgZnJlZWluZyApICsgZnJlZWluZy0+c2l6ZSApLCBibG9jaywKKwkJICAgICAgKCAoICggdm9pZCAqICkgYmxvY2sgKSArIGJsb2NrLT5zaXplICksIGZyZWVpbmcsCisJCSAgICAgICggKCAoIHZvaWQgKiApIGJsb2NrICkgKyBibG9jay0+c2l6ZSApICk7CisJCWZyZWVpbmctPnNpemUgKz0gYmxvY2stPnNpemU7CisJCWxpc3RfZGVsICggJmJsb2NrLT5saXN0ICk7CisJfQorCisJLyogVXBkYXRlIGZyZWUgbWVtb3J5IGNvdW50ZXIgKi8KKwlmcmVlbWVtICs9IHNpemU7Cit9CisKKy8qKgorICogUmVhbGxvY2F0ZSBtZW1vcnkKKyAqCisgKiBAdiBvbGRfcHRyCQlNZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgbWFsbG9jKCksIG9yIE5VTEwKKyAqIEB2IG5ld19zaXplCQlSZXF1ZXN0ZWQgc2l6ZQorICogQHJldCBuZXdfcHRyCQlBbGxvY2F0ZWQgbWVtb3J5LCBvciBOVUxMCisgKgorICogQWxsb2NhdGVzIG1lbW9yeSB3aXRoIG5vIHBhcnRpY3VsYXIgYWxpZ25tZW50IHJlcXVpcmVtZW50LiAgQGMKKyAqIG5ld19wdHIgd2lsbCBiZSBhbGlnbmVkIHRvIGF0IGxlYXN0IGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKHZvaWQqKS4KKyAqIElmIEBjIG9sZF9wdHIgaXMgbm9uLU5VTEwsIHRoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQKKyAqIG1lbW9yeSB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBjb250ZW50cyBvZiB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQKKyAqIG1lbW9yeSwgdXAgdG8gdGhlIG1pbmltdW0gb2YgdGhlIG9sZCBhbmQgbmV3IHNpemVzLiAgVGhlIG9sZCBtZW1vcnkKKyAqIHdpbGwgYmUgZnJlZWQuCisgKgorICogSWYgYWxsb2NhdGlvbiBmYWlscyB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgYmxvY2sgaXMgbGVmdAorICogdW50b3VjaGVkIGFuZCBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIENhbGxpbmcgcmVhbGxvYygpIHdpdGggYSBuZXcgc2l6ZSBvZiB6ZXJvIGlzIGEgdmFsaWQgd2F5IHRvIGZyZWUgYQorICogbWVtb3J5IGJsb2NrLgorICovCit2b2lkICogcmVhbGxvYyAoIHZvaWQgKm9sZF9wdHIsIHNpemVfdCBuZXdfc2l6ZSApIHsKKwlzdHJ1Y3QgYXV0b3NpemVkX2Jsb2NrICpvbGRfYmxvY2s7CisJc3RydWN0IGF1dG9zaXplZF9ibG9jayAqbmV3X2Jsb2NrOworCXNpemVfdCBvbGRfdG90YWxfc2l6ZTsKKwlzaXplX3QgbmV3X3RvdGFsX3NpemU7CisJc2l6ZV90IG9sZF9zaXplOworCXZvaWQgKm5ld19wdHIgPSBOT1dIRVJFOworCisJLyogQWxsb2NhdGUgbmV3IG1lbW9yeSBpZiBuZWNlc3NhcnkuICBJZiBhbGxvY2F0aW9uIGZhaWxzLAorCSAqIHJldHVybiB3aXRob3V0IHRvdWNoaW5nIHRoZSBvbGQgYmxvY2suCisJICovCisJaWYgKCBuZXdfc2l6ZSApIHsKKwkJbmV3X3RvdGFsX3NpemUgPSAoIG5ld19zaXplICsKKwkJCQkgICBvZmZzZXRvZiAoIHN0cnVjdCBhdXRvc2l6ZWRfYmxvY2ssIGRhdGEgKSApOworCQluZXdfYmxvY2sgPSBhbGxvY19tZW1ibG9jayAoIG5ld190b3RhbF9zaXplLCAxICk7CisJCWlmICggISBuZXdfYmxvY2sgKQorCQkJcmV0dXJuIE5VTEw7CisJCW5ld19ibG9jay0+c2l6ZSA9IG5ld190b3RhbF9zaXplOworCQluZXdfcHRyID0gJm5ld19ibG9jay0+ZGF0YTsKKwl9CisJCisJLyogQ29weSBhY3Jvc3MgcmVsZXZhbnQgcGFydCBvZiB0aGUgb2xkIGRhdGEgcmVnaW9uIChpZiBhbnkpLAorCSAqIHRoZW4gZnJlZSBpdC4gIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IGVpdGhlciAoYSkgbmV3X3B0cgorCSAqIGlzIHZhbGlkLCBvciAoYikgbmV3X3NpemUgaXMgMDsgZWl0aGVyIHdheSwgdGhlIG1lbWNweSgpIGlzCisJICogdmFsaWQuCisJICovCisJaWYgKCBvbGRfcHRyICYmICggb2xkX3B0ciAhPSBOT1dIRVJFICkgKSB7CisJCW9sZF9ibG9jayA9IGNvbnRhaW5lcl9vZiAoIG9sZF9wdHIsIHN0cnVjdCBhdXRvc2l6ZWRfYmxvY2ssCisJCQkJCSAgIGRhdGEgKTsKKwkJb2xkX3RvdGFsX3NpemUgPSBvbGRfYmxvY2stPnNpemU7CisJCW9sZF9zaXplID0gKCBvbGRfdG90YWxfc2l6ZSAtCisJCQkgICAgIG9mZnNldG9mICggc3RydWN0IGF1dG9zaXplZF9ibG9jaywgZGF0YSApICk7CisJCW1lbWNweSAoIG5ld19wdHIsIG9sZF9wdHIsCisJCQkgKCAoIG9sZF9zaXplIDwgbmV3X3NpemUgKSA/IG9sZF9zaXplIDogbmV3X3NpemUgKSApOworCQlmcmVlX21lbWJsb2NrICggb2xkX2Jsb2NrLCBvbGRfdG90YWxfc2l6ZSApOworCX0KKworCXJldHVybiBuZXdfcHRyOworfQorCisvKioKKyAqIEFsbG9jYXRlIG1lbW9yeQorICoKKyAqIEB2IHNpemUJCVJlcXVlc3RlZCBzaXplCisgKiBAcmV0IHB0cgkJTWVtb3J5LCBvciBOVUxMCisgKgorICogQWxsb2NhdGVzIG1lbW9yeSB3aXRoIG5vIHBhcnRpY3VsYXIgYWxpZ25tZW50IHJlcXVpcmVtZW50LiAgQGMgcHRyCisgKiB3aWxsIGJlIGFsaWduZWQgdG8gYXQgbGVhc3QgYSBtdWx0aXBsZSBvZiBzaXplb2Yodm9pZCopLgorICovCit2b2lkICogbWFsbG9jICggc2l6ZV90IHNpemUgKSB7CisJcmV0dXJuIHJlYWxsb2MgKCBOVUxMLCBzaXplICk7Cit9CisKKy8qKgorICogRnJlZSBtZW1vcnkKKyAqCisgKiBAdiBwdHIJCU1lbW9yeSBhbGxvY2F0ZWQgYnkgbWFsbG9jKCksIG9yIE5VTEwKKyAqCisgKiBNZW1vcnkgYWxsb2NhdGVkIHdpdGggbWFsbG9jX2RtYSgpIGNhbm5vdCBiZSBmcmVlZCB3aXRoIGZyZWUoKTsgaXQKKyAqIG11c3QgYmUgZnJlZWQgd2l0aCBmcmVlX2RtYSgpIGluc3RlYWQuCisgKgorICogSWYgQGMgcHRyIGlzIE5VTEwsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAqLwordm9pZCBmcmVlICggdm9pZCAqcHRyICkgeworCXJlYWxsb2MgKCBwdHIsIDAgKTsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBjbGVhcmVkIG1lbW9yeQorICoKKyAqIEB2IHNpemUJCVJlcXVlc3RlZCBzaXplCisgKiBAcmV0IHB0cgkJQWxsb2NhdGVkIG1lbW9yeQorICoKKyAqIEFsbG9jYXRlIG1lbW9yeSBhcyBwZXIgbWFsbG9jKCksIGFuZCB6ZXJvIGl0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbmFtZSBpcyBub24tc3RhbmRhcmQsIGJ1dCBwcmV0dHkgaW50dWl0aXZlLgorICogemFsbG9jKHNpemUpIGlzIGFsd2F5cyBlcXVpdmFsZW50IHRvIGNhbGxvYygxLHNpemUpCisgKi8KK3ZvaWQgKiB6YWxsb2MgKCBzaXplX3Qgc2l6ZSApIHsKKwl2b2lkICpkYXRhOworCisJZGF0YSA9IG1hbGxvYyAoIHNpemUgKTsKKwlpZiAoIGRhdGEgKQorCQltZW1zZXQgKCBkYXRhLCAwLCBzaXplICk7CisJcmV0dXJuIGRhdGE7Cit9CisKKy8qKgorICogQWRkIG1lbW9yeSB0byBhbGxvY2F0aW9uIHBvb2wKKyAqCisgKiBAdiBzdGFydAkJU3RhcnQgYWRkcmVzcworICogQHYgZW5kCQlFbmQgYWRkcmVzcworICoKKyAqIEFkZHMgYSBibG9jayBvZiBtZW1vcnkgW3N0YXJ0LGVuZCkgdG8gdGhlIGFsbG9jYXRpb24gcG9vbC4gIFRoaXMgaXMKKyAqIGEgb25lLXdheSBvcGVyYXRpb247IHRoZXJlIGlzIG5vIHdheSB0byByZWNsYWltIHRoaXMgbWVtb3J5LgorICoKKyAqIEBjIHN0YXJ0IG11c3QgYmUgYWxpZ25lZCB0byBhdCBsZWFzdCBhIG11bHRpcGxlIG9mIHNpemVvZih2b2lkKikuCisgKi8KK3ZvaWQgbXBvcHVsYXRlICggdm9pZCAqc3RhcnQsIHNpemVfdCBsZW4gKSB7CisJLyogUHJldmVudCBmcmVlX21lbWJsb2NrKCkgZnJvbSByb3VuZGluZyB1cCBsZW4gYmV5b25kIHRoZSBlbmQKKwkgKiBvZiB3aGF0IHdlIHdlcmUgYWN0dWFsbHkgZ2l2ZW4uLi4KKwkgKi8KKwlmcmVlX21lbWJsb2NrICggc3RhcnQsICggbGVuICYgfiggTUlOX01FTUJMT0NLX1NJWkUgLSAxICkgKSApOworfQorCisvKioKKyAqIEluaXRpYWxpc2UgdGhlIGhlYXAKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfaGVhcCAoIHZvaWQgKSB7CisJbXBvcHVsYXRlICggaGVhcCwgc2l6ZW9mICggaGVhcCApICk7Cit9CisKKy8qKiBNZW1vcnkgYWxsb2NhdG9yIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uICovCitzdHJ1Y3QgaW5pdF9mbiBoZWFwX2luaXRfZm4gX19pbml0X2ZuICggSU5JVF9FQVJMWSApID0geworCS5pbml0aWFsaXNlID0gaW5pdF9oZWFwLAorfTsKKworI2lmIDAKKyNpbmNsdWRlIDxzdGRpby5oPgorLyoqCisgKiBEdW1wIGZyZWUgYmxvY2sgbGlzdAorICoKKyAqLwordm9pZCBtZHVtcGZyZWUgKCB2b2lkICkgeworCXN0cnVjdCBtZW1vcnlfYmxvY2sgKmJsb2NrOworCisJcHJpbnRmICggIkZyZWUgYmxvY2sgbGlzdDpcbiIgKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggYmxvY2ssICZmcmVlX2Jsb2NrcywgbGlzdCApIHsKKwkJcHJpbnRmICggIlslcCwlcF0gKHNpemUgJSN6eClcbiIsIGJsb2NrLAorCQkJICggKCAoIHZvaWQgKiApIGJsb2NrICkgKyBibG9jay0+c2l6ZSApLCBibG9jay0+c2l6ZSApOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9taXNjLmMgYi9ncHhlL3NyYy9jb3JlL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTk1OTFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9taXNjLmMKQEAgLTAsMCArMSw4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNSVNDIFN1cHBvcnQgUm91dGluZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbi5oPgorI2luY2x1ZGUgPGdweGUvdGltZXIuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJTkVUX0FUT04gLSBDb252ZXJ0IGFuIGFzY2lpIHgueC54LnggdG8gYmluYXJ5IGZvcm0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGluZXRfYXRvbiAoIGNvbnN0IGNoYXIgKmNwLCBzdHJ1Y3QgaW5fYWRkciAqaW5wICkgeworCWNvbnN0IGNoYXIgKnAgPSBjcDsKKwljb25zdCBjaGFyICpkaWdpdHNfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBpcCA9IDA7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGo7CisJZm9yKGogPSAwOyBqIDw9IDM7IGorKykgeworCQlkaWdpdHNfc3RhcnQgPSBwOworCQl2YWwgPSBzdHJ0b3VsKHAsICggY2hhciAqKiApICZwLCAxMCk7CisJCWlmICgocCA9PSBkaWdpdHNfc3RhcnQpIHx8ICh2YWwgPiAyNTUpKSByZXR1cm4gMDsKKwkJaWYgKCAoIGogPCAzICkgJiYgKCAqKHArKykgIT0gJy4nICkgKSByZXR1cm4gMDsKKwkJaXAgPSAoaXAgPDwgOCkgfCB2YWw7CisJfQorCWlmICggKnAgPT0gJ1wwJyApIHsKKwkJaW5wLT5zX2FkZHIgPSBodG9ubChpcCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgbG9uZyBzdHJ0b3VsICggY29uc3QgY2hhciAqcCwgY2hhciAqKmVuZHAsIGludCBiYXNlICkgeworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgY2hhcnZhbDsKKworCXdoaWxlICggaXNzcGFjZSAoICpwICkgKQorCQlwKys7CisKKwlpZiAoIGJhc2UgPT0gMCApIHsKKwkJYmFzZSA9IDEwOworCQlpZiAoICpwID09ICcwJyApIHsKKwkJCXArKzsKKwkJCWJhc2UgPSA4OworCQkJaWYgKCAoICpwIHwgMHgyMCApID09ICd4JyApIHsKKwkJCQlwKys7CisJCQkJYmFzZSA9IDE2OworCQkJfQorCQl9CisJfQorCisJd2hpbGUgKCAxICkgeworCQljaGFydmFsID0gKnA7CisJCWlmICggY2hhcnZhbCA+PSAnYScgKSB7CisJCQljaGFydmFsID0gKCBjaGFydmFsIC0gJ2EnICsgMTAgKTsKKwkJfSBlbHNlIGlmICggY2hhcnZhbCA+PSAnQScgKSB7CisJCQljaGFydmFsID0gKCBjaGFydmFsIC0gJ0EnICsgMTAgKTsKKwkJfSBlbHNlIGlmICggY2hhcnZhbCA8PSAnOScgKSB7CisJCQljaGFydmFsID0gKCBjaGFydmFsIC0gJzAnICk7CisJCX0KKwkJaWYgKCBjaGFydmFsID49ICggdW5zaWduZWQgaW50ICkgYmFzZSApCisJCQlicmVhazsKKwkJcmV0ID0gKCAoIHJldCAqIGJhc2UgKSArIGNoYXJ2YWwgKTsKKwkJcCsrOworCX0KKworCWlmICggZW5kcCApCisJCSplbmRwID0gKCBjaGFyICogKSBwOworCisJcmV0dXJuICggcmV0ICk7Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9tb25vam9iLmMgYi9ncHhlL3NyYy9jb3JlL21vbm9qb2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjRiNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9tb25vam9iLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGdweGUva2V5cy5oPgorI2luY2x1ZGUgPGdweGUvam9iLmg+CisjaW5jbHVkZSA8Z3B4ZS9tb25vam9iLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorCisvKiogQGZpbGUKKyAqCisgKiBTaW5nbGUgZm9yZWdyb3VuZCBqb2IKKyAqCisgKi8KKworc3RhdGljIGludCBtb25vam9iX3JjOworCitzdGF0aWMgdm9pZCBtb25vam9iX2RvbmUgKCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSAqam9iIF9fdW51c2VkLCBpbnQgcmMgKSB7CisJbW9ub2pvYl9yYyA9IHJjOworfQorCisvKiogU2luZ2xlIGZvcmVncm91bmQgam9iIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgam9iX2ludGVyZmFjZV9vcGVyYXRpb25zIG1vbm9qb2Jfb3BlcmF0aW9ucyA9IHsKKwkuZG9uZQkJPSBtb25vam9iX2RvbmUsCisJLmtpbGwJCT0gaWdub3JlX2pvYl9raWxsLAorCS5wcm9ncmVzcwk9IGlnbm9yZV9qb2JfcHJvZ3Jlc3MsCit9OworCisvKiogU2luZ2xlIGZvcmVncm91bmQgam9iICovCitzdHJ1Y3Qgam9iX2ludGVyZmFjZSBtb25vam9iID0geworCS5pbnRmID0geworCQkuZGVzdCA9ICZudWxsX2pvYi5pbnRmLAorCQkucmVmY250ID0gTlVMTCwKKwl9LAorCS5vcCA9ICZtb25vam9iX29wZXJhdGlvbnMsCit9OworCisvKioKKyAqIFdhaXQgZm9yIHNpbmdsZSBmb3JlZ3JvdW5kIGpvYiB0byBjb21wbGV0ZQorICoKKyAqIEB2IHN0cmluZwkJSm9iIGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkKKyAqIEByZXQgcmMJCUpvYiBmaW5hbCBzdGF0dXMgY29kZQorICovCitpbnQgbW9ub2pvYl93YWl0ICggY29uc3QgY2hhciAqc3RyaW5nICkgeworCWludCBrZXk7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgbGFzdF9wcm9ncmVzc19kb3Q7CisJdW5zaWduZWQgbG9uZyBlbGFwc2VkOworCisJcHJpbnRmICggIiVzLiIsIHN0cmluZyApOworCW1vbm9qb2JfcmMgPSAtRUlOUFJPR1JFU1M7CisJbGFzdF9wcm9ncmVzc19kb3QgPSBjdXJydGlja3MoKTsKKwl3aGlsZSAoIG1vbm9qb2JfcmMgPT0gLUVJTlBST0dSRVNTICkgeworCQlzdGVwKCk7CisJCWlmICggaXNrZXkoKSApIHsKKwkJCWtleSA9IGdldGNoYXIoKTsKKwkJCXN3aXRjaCAoIGtleSApIHsKKwkJCWNhc2UgQ1RSTF9DOgorCQkJCWpvYl9raWxsICggJm1vbm9qb2IgKTsKKwkJCQlyYyA9IC1FQ0FOQ0VMRUQ7CisJCQkJZ290byBkb25lOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbGFwc2VkID0gKCBjdXJydGlja3MoKSAtIGxhc3RfcHJvZ3Jlc3NfZG90ICk7CisJCWlmICggZWxhcHNlZCA+PSBUSUNLU19QRVJfU0VDICkgeworCQkJcHJpbnRmICggIi4iICk7CisJCQlsYXN0X3Byb2dyZXNzX2RvdCA9IGN1cnJ0aWNrcygpOworCQl9CisJfQorCXJjID0gbW9ub2pvYl9yYzsKKworZG9uZToKKwlqb2JfZG9uZSAoICZtb25vam9iLCByYyApOworCWlmICggcmMgKSB7CisJCXByaW50ZiAoICIgJXNcbiIsIHN0cmVycm9yICggcmMgKSApOworCX0gZWxzZSB7CisJCXByaW50ZiAoICIgb2tcbiIgKTsKKwl9CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9udWxsX25hcC5jIGIvZ3B4ZS9zcmMvY29yZS9udWxsX25hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjAxZWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL251bGxfbmFwLmMKQEAgLTAsMCArMSwzIEBACisjaW5jbHVkZSA8Z3B4ZS9uYXAuaD4KKworUFJPVklERV9OQVBfSU5MSU5FICggbnVsbCwgY3B1X25hcCApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9udm8uYyBiL2dweGUvc3JjL2NvcmUvbnZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiZjUxZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvbnZvLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvZGhjcC5oPgorI2luY2x1ZGUgPGdweGUvbnZzLmg+CisjaW5jbHVkZSA8Z3B4ZS9udm8uaD4KKworLyoqIEBmaWxlCisgKgorICogTm9uLXZvbGF0aWxlIHN0b3JlZCBvcHRpb25zCisgKgorICovCisKKy8qKgorICogQ2FsY3VsYXRlIGNoZWNrc3VtIG92ZXIgbm9uLXZvbGF0aWxlIHN0b3JlZCBvcHRpb25zCisgKgorICogQHYgbnZvCQlOb24tdm9sYXRpbGUgb3B0aW9ucyBibG9jaworICogQHJldCBzdW0JCUNoZWNrc3VtCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnZvX2NoZWNrc3VtICggc3RydWN0IG52b19ibG9jayAqbnZvICkgeworCXVpbnQ4X3QgKmRhdGEgPSBudm8tPmRhdGE7CisJdWludDhfdCBzdW0gPSAwOworCXVuc2lnbmVkIGludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgbnZvLT50b3RhbF9sZW4gOyBpKysgKSB7CisJCXN1bSArPSAqKGRhdGErKyk7CisJfQorCXJldHVybiBzdW07Cit9CisKKy8qKgorICogTG9hZCBub24tdm9sYXRpbGUgc3RvcmVkIG9wdGlvbnMgZnJvbSBub24tdm9sYXRpbGUgc3RvcmFnZSBkZXZpY2UKKyAqCisgKiBAdiBudm8JCU5vbi12b2xhdGlsZSBvcHRpb25zIGJsb2NrCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBudm9fbG9hZCAoIHN0cnVjdCBudm9fYmxvY2sgKm52byApIHsKKwl2b2lkICpkYXRhID0gbnZvLT5kYXRhOworCXN0cnVjdCBudm9fZnJhZ21lbnQgKmZyYWc7CisJaW50IHJjOworCisJLyogUmVhZCBkYXRhIGEgZnJhZ21lbnQgYXQgYSB0aW1lICovCisJZm9yICggZnJhZyA9IG52by0+ZnJhZ21lbnRzIDsgZnJhZy0+bGVuIDsgZnJhZysrICkgeworCQlpZiAoICggcmMgPSBudnNfcmVhZCAoIG52by0+bnZzLCBmcmFnLT5hZGRyZXNzLCBkYXRhLAorCQkJCSAgICAgICBmcmFnLT5sZW4gKSApICE9IDAgKSB7CisJCQlEQkdDICggbnZvLCAiTlZPICVwIGNvdWxkIG5vdCByZWFkICV6ZCBieXRlcyBhdCAiCisJCQkgICAgICAgIiUjMDR4XG4iLCBudm8sIGZyYWctPmxlbiwgZnJhZy0+YWRkcmVzcyApOworCQkJcmV0dXJuIHJjOworCQl9CisJCWRhdGEgKz0gZnJhZy0+bGVuOworCX0KKworCURCR0MgKCBudm8sICJOVk8gJXAgbG9hZGVkIGZyb20gbm9uLXZvbGF0aWxlIHN0b3JhZ2VcbiIsIG52byApOworCXJldHVybiAwOworfQorCisvKioKKyAqIFNhdmUgbm9uLXZvbGF0aWxlIHN0b3JlZCBvcHRpb25zIGJhY2sgdG8gbm9uLXZvbGF0aWxlIHN0b3JhZ2UgZGV2aWNlCisgKgorICogQHYgbnZvCQlOb24tdm9sYXRpbGUgb3B0aW9ucyBibG9jaworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbnZvX3NhdmUgKCBzdHJ1Y3QgbnZvX2Jsb2NrICpudm8gKSB7CisJdm9pZCAqZGF0YSA9IG52by0+ZGF0YTsKKwl1aW50OF90ICpjaGVja3N1bSA9IGRhdGE7CisJc3RydWN0IG52b19mcmFnbWVudCAqZnJhZzsKKwlpbnQgcmM7CisKKwkvKiBSZWNhbGN1bGF0ZSBjaGVja3N1bSAqLworCSpjaGVja3N1bSAtPSBudm9fY2hlY2tzdW0gKCBudm8gKTsKKworCS8qIFdyaXRlIGRhdGEgYSBmcmFnbWVudCBhdCBhIHRpbWUgKi8KKwlmb3IgKCBmcmFnID0gbnZvLT5mcmFnbWVudHMgOyBmcmFnLT5sZW4gOyBmcmFnKysgKSB7CisJCWlmICggKCByYyA9IG52c193cml0ZSAoIG52by0+bnZzLCBmcmFnLT5hZGRyZXNzLCBkYXRhLAorCQkJCQlmcmFnLT5sZW4gKSApICE9IDAgKSB7CisJCQlEQkdDICggbnZvLCAiTlZPICVwIGNvdWxkIG5vdCB3cml0ZSAlemQgYnl0ZXMgYXQgIgorCQkJICAgICAgICIlIzA0eFxuIiwgbnZvLCBmcmFnLT5sZW4sIGZyYWctPmFkZHJlc3MgKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlkYXRhICs9IGZyYWctPmxlbjsKKwl9CisKKwlEQkdDICggbnZvLCAiTlZPICVwIHNhdmVkIHRvIG5vbi12b2xhdGlsZSBzdG9yYWdlXG4iLCBudm8gKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQYXJzZSBzdG9yZWQgb3B0aW9ucworICoKKyAqIEB2IG52bwkJTm9uLXZvbGF0aWxlIG9wdGlvbnMgYmxvY2sKKyAqCisgKiBWZXJpZmllcyB0aGF0IHRoZSBvcHRpb25zIGRhdGEgaXMgdmFsaWQsIGFuZCBjb25maWd1cmVzIHRoZSBESENQCisgKiBvcHRpb25zIGJsb2NrLiAgSWYgdGhlIGRhdGEgaXMgbm90IHZhbGlkLCBpdCBpcyByZXBsYWNlZCB3aXRoIGFuCisgKiBlbXB0eSBvcHRpb25zIGJsb2NrLgorICovCitzdGF0aWMgdm9pZCBudm9faW5pdF9kaGNwb3B0cyAoIHN0cnVjdCBudm9fYmxvY2sgKm52byApIHsKKwl1aW50OF90ICpvcHRpb25zX2RhdGE7CisJc2l6ZV90IG9wdGlvbnNfbGVuOworCisJLyogU3RlYWwgb25lIGJ5dGUgZm9yIHRoZSBjaGVja3N1bSAqLworCW9wdGlvbnNfZGF0YSA9ICggbnZvLT5kYXRhICsgMSApOworCW9wdGlvbnNfbGVuID0gKCBudm8tPnRvdGFsX2xlbiAtIDEgKTsKKworCS8qIElmIGNoZWNrc3VtIGZhaWxzLCBvciBvcHRpb25zIGRhdGEgc3RhcnRzIHdpdGggYSB6ZXJvLAorCSAqIGFzc3VtZSB0aGUgd2hvbGUgYmxvY2sgaXMgaW52YWxpZC4gIFRoaXMgc2hvdWxkIGNhcHR1cmUgdGhlCisJICogY2FzZSBvZiByYW5kb20gaW5pdGlhbCBjb250ZW50cy4KKwkgKi8KKwlpZiAoICggbnZvX2NoZWNrc3VtICggbnZvICkgIT0gMCApIHx8ICggb3B0aW9uc19kYXRhWzBdID09IDAgKSApIHsKKwkJREJHQyAoIG52bywgIk5WTyAlcCBoYXMgY2hlY2tzdW0gJTAyeCBhbmQgaW5pdGlhbCBieXRlICUwMng7ICIKKwkJICAgICAgICJhc3N1bWluZyBlbXB0eVxuIiwgbnZvLCBudm9fY2hlY2tzdW0gKCBudm8gKSwKKwkJICAgICAgIG9wdGlvbnNfZGF0YVswXSApOworCQltZW1zZXQgKCBudm8tPmRhdGEsIDAsIG52by0+dG90YWxfbGVuICk7CisJfQorCisJZGhjcG9wdF9pbml0ICggJm52by0+ZGhjcG9wdHMsIG9wdGlvbnNfZGF0YSwgb3B0aW9uc19sZW4gKTsKK30KKworLyoqCisgKiBTdG9yZSB2YWx1ZSBvZiBOVk8gc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBzdG9yZQorICogQHYgZGF0YQkJU2V0dGluZyBkYXRhLCBvciBOVUxMIHRvIGNsZWFyIHNldHRpbmcKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbnZvX3N0b3JlICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCBudm9fYmxvY2sgKm52byA9CisJCWNvbnRhaW5lcl9vZiAoIHNldHRpbmdzLCBzdHJ1Y3QgbnZvX2Jsb2NrLCBzZXR0aW5ncyApOworCWludCByYzsKKworCS8qIFVwZGF0ZSBzdG9yZWQgb3B0aW9ucyAqLworCWlmICggKCByYyA9IGRoY3BvcHRfc3RvcmUgKCAmbnZvLT5kaGNwb3B0cywgc2V0dGluZy0+dGFnLAorCQkJCSAgICBkYXRhLCBsZW4gKSApICE9IDAgKSB7CisJCURCR0MgKCBudm8sICJOVk8gJXAgY291bGQgbm90IHN0b3JlICV6ZCBieXRlczogJXNcbiIsCisJCSAgICAgICBudm8sIGxlbiwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBTYXZlIHVwZGF0ZWQgb3B0aW9ucyB0byBOVlMgKi8KKwlpZiAoICggcmMgPSBudm9fc2F2ZSAoIG52byApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEZldGNoIHZhbHVlIG9mIE5WTyBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZldGNoCisgKiBAdiBkYXRhCQlCdWZmZXIgdG8gZmlsbCB3aXRoIHNldHRpbmcgZGF0YQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YSwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqCisgKiBUaGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgc2V0dGluZyB3aWxsIGJlIHJldHVybmVkIGV2ZW4gaWYKKyAqIHRoZSBidWZmZXIgd2FzIHRvbyBzbWFsbC4KKyAqLworc3RhdGljIGludCBudm9fZmV0Y2ggKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IG52b19ibG9jayAqbnZvID0KKwkJY29udGFpbmVyX29mICggc2V0dGluZ3MsIHN0cnVjdCBudm9fYmxvY2ssIHNldHRpbmdzICk7CisKKwlyZXR1cm4gZGhjcG9wdF9mZXRjaCAoICZudm8tPmRoY3BvcHRzLCBzZXR0aW5nLT50YWcsIGRhdGEsIGxlbiApOworfQorCisvKiogTlZPIHNldHRpbmdzIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2V0dGluZ3Nfb3BlcmF0aW9ucyBudm9fc2V0dGluZ3Nfb3BlcmF0aW9ucyA9IHsKKwkuc3RvcmUgPSBudm9fc3RvcmUsCisJLmZldGNoID0gbnZvX2ZldGNoLAorfTsKKworLyoqCisgKiBJbml0aWFsaXNlIG5vbi12b2xhdGlsZSBzdG9yZWQgb3B0aW9ucworICoKKyAqIEB2IG52bwkJTm9uLXZvbGF0aWxlIG9wdGlvbnMgYmxvY2sKKyAqIEB2IG52cwkJVW5kZXJseWluZyBub24tdm9sYXRpbGUgc3RvcmFnZSBkZXZpY2UKKyAqIEB2IGZyYWdtZW50cwkJTGlzdCBvZiBvcHRpb24tY29udGFpbmluZyBmcmFnbWVudHMKKyAqIEB2IHJlZmNudAkJQ29udGFpbmluZyBvYmplY3QgcmVmZXJlbmNlIGNvdW50ZXIsIG9yIE5VTEwKKyAqLwordm9pZCBudm9faW5pdCAoIHN0cnVjdCBudm9fYmxvY2sgKm52bywgc3RydWN0IG52c19kZXZpY2UgKm52cywKKwkJc3RydWN0IG52b19mcmFnbWVudCAqZnJhZ21lbnRzLCBzdHJ1Y3QgcmVmY250ICpyZWZjbnQgKSB7CisJbnZvLT5udnMgPSBudnM7CisJbnZvLT5mcmFnbWVudHMgPSBmcmFnbWVudHM7CisJc2V0dGluZ3NfaW5pdCAoICZudm8tPnNldHRpbmdzLCAmbnZvX3NldHRpbmdzX29wZXJhdGlvbnMsIHJlZmNudCwKKwkJCSJudm8iLCAwICk7Cit9CisKKy8qKgorICogUmVnaXN0ZXIgbm9uLXZvbGF0aWxlIHN0b3JlZCBvcHRpb25zCisgKgorICogQHYgbnZvCQlOb24tdm9sYXRpbGUgb3B0aW9ucyBibG9jaworICogQHYgcGFyZW50CQlQYXJlbnQgc2V0dGluZ3MgYmxvY2ssIG9yIE5VTEwKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgcmVnaXN0ZXJfbnZvICggc3RydWN0IG52b19ibG9jayAqbnZvLCBzdHJ1Y3Qgc2V0dGluZ3MgKnBhcmVudCApIHsKKwlzdHJ1Y3QgbnZvX2ZyYWdtZW50ICpmcmFnbWVudCA9IG52by0+ZnJhZ21lbnRzOworCWludCByYzsKKworCS8qIENhbGN1bGF0ZSB0b3RhbCBsZW5ndGggb2YgYWxsIGZyYWdtZW50cyAqLworCWZvciAoIGZyYWdtZW50ID0gbnZvLT5mcmFnbWVudHMgOyBmcmFnbWVudC0+bGVuIDsgZnJhZ21lbnQrKyApCisJCW52by0+dG90YWxfbGVuICs9IGZyYWdtZW50LT5sZW47CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG9wdGlvbnMgYW5kIHJlYWQgaW4gZnJvbSBOVlMgKi8KKwludm8tPmRhdGEgPSBtYWxsb2MgKCBudm8tPnRvdGFsX2xlbiApOworCWlmICggISBudm8tPmRhdGEgKSB7CisJCURCR0MgKCBudm8sICJOVk8gJXAgY291bGQgbm90IGFsbG9jYXRlICV6ZCBieXRlc1xuIiwKKwkJICAgICAgIG52bywgbnZvLT50b3RhbF9sZW4gKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tYWxsb2M7CisJfQorCWlmICggKCByYyA9IG52b19sb2FkICggbnZvICkgKSAhPSAwICkKKwkJZ290byBlcnJfbG9hZDsKKworCS8qIFZlcmlmeSBhbmQgcmVnaXN0ZXIgb3B0aW9ucyAqLworCW52b19pbml0X2RoY3BvcHRzICggbnZvICk7CisJaWYgKCAoIHJjID0gcmVnaXN0ZXJfc2V0dGluZ3MgKCAmbnZvLT5zZXR0aW5ncywgcGFyZW50ICkgKSAhPSAwICkKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisKKwlEQkdDICggbnZvLCAiTlZPICVwIHJlZ2lzdGVyZWRcbiIsIG52byApOworCXJldHVybiAwOworCQorIGVycl9yZWdpc3RlcjoKKyBlcnJfbG9hZDoKKwlmcmVlICggbnZvLT5kYXRhICk7CisJbnZvLT5kYXRhID0gTlVMTDsKKyBlcnJfbWFsbG9jOgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBVbnJlZ2lzdGVyIG5vbi12b2xhdGlsZSBzdG9yZWQgb3B0aW9ucworICoKKyAqIEB2IG52bwkJTm9uLXZvbGF0aWxlIG9wdGlvbnMgYmxvY2sKKyAqLwordm9pZCB1bnJlZ2lzdGVyX252byAoIHN0cnVjdCBudm9fYmxvY2sgKm52byApIHsKKwl1bnJlZ2lzdGVyX3NldHRpbmdzICggJm52by0+c2V0dGluZ3MgKTsKKwlmcmVlICggbnZvLT5kYXRhICk7CisJbnZvLT5kYXRhID0gTlVMTDsKKwlEQkdDICggbnZvLCAiTlZPICVwIHVucmVnaXN0ZXJlZFxuIiwgbnZvICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL29wZW4uYyBiL2dweGUvc3JjL2NvcmUvb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjQyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL29wZW4uYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS91cmkuaD4KKyNpbmNsdWRlIDxncHhlL3NvY2tldC5oPgorI2luY2x1ZGUgPGdweGUvb3Blbi5oPgorCisvKiogQGZpbGUKKyAqCisgKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZSBvcGVuaW5nCisgKgorICovCisKKy8qKgorICogT3BlbiBVUkkKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdXJpCQlVUkkKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoZSBVUkkgd2lsbCBiZSByZWdhcmRlZCBhcyBiZWluZyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nCisgKiBVUkkgKHNlZSBjaHVyaSgpKS4KKyAqLworaW50IHhmZXJfb3Blbl91cmkgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIHN0cnVjdCB1cmkgKnVyaSApIHsKKwlzdHJ1Y3QgdXJpX29wZW5lciAqb3BlbmVyOworCXN0cnVjdCB1cmkgKnJlc29sdmVkX3VyaTsKKwlpbnQgcmMgPSAtRU5PVFNVUDsKKworCS8qIFJlc29sdmUgVVJJICovCisJcmVzb2x2ZWRfdXJpID0gcmVzb2x2ZV91cmkgKCBjd3VyaSwgdXJpICk7CisJaWYgKCAhIHJlc29sdmVkX3VyaSApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRmluZCBvcGVuZXIgd2hpY2ggc3VwcG9ydHMgdGhpcyBVUkkgc2NoZW1lICovCisJZm9yX2VhY2hfdGFibGVfZW50cnkgKCBvcGVuZXIsIFVSSV9PUEVORVJTICkgeworCQlpZiAoIHN0cmNtcCAoIHJlc29sdmVkX3VyaS0+c2NoZW1lLCBvcGVuZXItPnNjaGVtZSApID09IDAgKSB7CisJCQlEQkdDICggeGZlciwgIlhGRVIgJXAgb3BlbmluZyAlcyBVUklcbiIsCisJCQkgICAgICAgeGZlciwgb3BlbmVyLT5zY2hlbWUgKTsKKwkJCXJjID0gb3BlbmVyLT5vcGVuICggeGZlciwgcmVzb2x2ZWRfdXJpICk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisJREJHQyAoIHhmZXIsICJYRkVSICVwIGF0dGVtcHRlZCB0byBvcGVuIHVuc3VwcG9ydGVkIFVSSSBzY2hlbWUgIgorCSAgICAgICAiXCIlc1wiXG4iLCB4ZmVyLCByZXNvbHZlZF91cmktPnNjaGVtZSApOworCisgZG9uZToKKwl1cmlfcHV0ICggcmVzb2x2ZWRfdXJpICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIE9wZW4gVVJJIHN0cmluZworICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiB1cmlfc3RyaW5nCVVSSSBzdHJpbmcgKGUuZy4gImh0dHA6Ly9ldGhlcmJvb3Qub3JnL2tlcm5lbCIpCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGUgVVJJIHdpbGwgYmUgcmVnYXJkZWQgYXMgYmVpbmcgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZworICogVVJJIChzZWUgY2h1cmkoKSkuCisgKi8KK2ludCB4ZmVyX29wZW5fdXJpX3N0cmluZyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCSAgIGNvbnN0IGNoYXIgKnVyaV9zdHJpbmcgKSB7CisJc3RydWN0IHVyaSAqdXJpOworCWludCByYzsKKworCURCR0MgKCB4ZmVyLCAiWEZFUiAlcCBvcGVuaW5nIFVSSSAlc1xuIiwgeGZlciwgdXJpX3N0cmluZyApOworCisJdXJpID0gcGFyc2VfdXJpICggdXJpX3N0cmluZyApOworCWlmICggISB1cmkgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJjID0geGZlcl9vcGVuX3VyaSAoIHhmZXIsIHVyaSApOworCisJdXJpX3B1dCAoIHVyaSApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBPcGVuIHNvY2tldAorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiBzZW1hbnRpY3MJCUNvbW11bmljYXRpb24gc2VtYW50aWNzIChlLmcuIFNPQ0tfU1RSRUFNKQorICogQHYgcGVlcgkJUGVlciBzb2NrZXQgYWRkcmVzcworICogQHYgbG9jYWwJCUxvY2FsIHNvY2tldCBhZGRyZXNzLCBvciBOVUxMCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHhmZXJfb3Blbl9zb2NrZXQgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGludCBzZW1hbnRpY3MsCisJCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIsIHN0cnVjdCBzb2NrYWRkciAqbG9jYWwgKSB7CisJc3RydWN0IHNvY2tldF9vcGVuZXIgKm9wZW5lcjsKKworCURCR0MgKCB4ZmVyLCAiWEZFUiAlcCBvcGVuaW5nICglcywlcykgc29ja2V0XG4iLCB4ZmVyLAorCSAgICAgICBzb2NrZXRfc2VtYW50aWNzX25hbWUgKCBzZW1hbnRpY3MgKSwKKwkgICAgICAgc29ja2V0X2ZhbWlseV9uYW1lICggcGVlci0+c2FfZmFtaWx5ICkgKTsKKworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggb3BlbmVyLCBTT0NLRVRfT1BFTkVSUyApIHsKKwkJaWYgKCAoIG9wZW5lci0+c2VtYW50aWNzID09IHNlbWFudGljcyApICYmCisJCSAgICAgKCBvcGVuZXItPmZhbWlseSA9PSBwZWVyLT5zYV9mYW1pbHkgKSApIHsKKwkJCXJldHVybiBvcGVuZXItPm9wZW4gKCB4ZmVyLCBwZWVyLCBsb2NhbCApOworCQl9CisJfQorCisJREJHQyAoIHhmZXIsICJYRkVSICVwIGF0dGVtcHRlZCB0byBvcGVuIHVuc3VwcG9ydGVkIHNvY2tldCB0eXBlICIKKwkgICAgICAgIiglcywlcylcbiIsIHhmZXIsIHNvY2tldF9zZW1hbnRpY3NfbmFtZSAoIHNlbWFudGljcyApLAorCSAgICAgICBzb2NrZXRfZmFtaWx5X25hbWUgKCBwZWVyLT5zYV9mYW1pbHkgKSApOworCXJldHVybiAtRU5PVFNVUDsKK30KKworLyoqCisgKiBPcGVuIGxvY2F0aW9uCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHR5cGUJCUxvY2F0aW9uIHR5cGUKKyAqIEB2IGFyZ3MJCVJlbWFpbmluZyBhcmd1bWVudHMgZGVwZW5kIHVwb24gbG9jYXRpb24gdHlwZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB4ZmVyX3ZvcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgdHlwZSwgdmFfbGlzdCBhcmdzICkgeworCXN3aXRjaCAoIHR5cGUgKSB7CisJY2FzZSBMT0NBVElPTl9VUklfU1RSSU5HOiB7CisJCWNvbnN0IGNoYXIgKnVyaV9zdHJpbmcgPSB2YV9hcmcgKCBhcmdzLCBjb25zdCBjaGFyICogKTsKKworCQlyZXR1cm4geGZlcl9vcGVuX3VyaV9zdHJpbmcgKCB4ZmVyLCB1cmlfc3RyaW5nICk7IH0KKwljYXNlIExPQ0FUSU9OX1VSSTogeworCQlzdHJ1Y3QgdXJpICp1cmkgPSB2YV9hcmcgKCBhcmdzLCBzdHJ1Y3QgdXJpICogKTsKKworCQlyZXR1cm4geGZlcl9vcGVuX3VyaSAoIHhmZXIsIHVyaSApOyB9CisJY2FzZSBMT0NBVElPTl9TT0NLRVQ6IHsKKwkJaW50IHNlbWFudGljcyA9IHZhX2FyZyAoIGFyZ3MsIGludCApOworCQlzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIgPSB2YV9hcmcgKCBhcmdzLCBzdHJ1Y3Qgc29ja2FkZHIgKiApOworCQlzdHJ1Y3Qgc29ja2FkZHIgKmxvY2FsID0gdmFfYXJnICggYXJncywgc3RydWN0IHNvY2thZGRyICogKTsKKworCQlyZXR1cm4geGZlcl9vcGVuX3NvY2tldCAoIHhmZXIsIHNlbWFudGljcywgcGVlciwgbG9jYWwgKTsgfQorCWRlZmF1bHQ6CisJCURCR0MgKCB4ZmVyLCAiWEZFUiAlcCBhdHRlbXB0ZWQgdG8gb3BlbiB1bnN1cHBvcnRlZCBsb2NhdGlvbiAiCisJCSAgICAgICAidHlwZSAlZFxuIiwgeGZlciwgdHlwZSApOworCQlyZXR1cm4gLUVOT1RTVVA7CisJfQorfQorCisvKioKKyAqIE9wZW4gbG9jYXRpb24KKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdHlwZQkJTG9jYXRpb24gdHlwZQorICogQHYgLi4uCQlSZW1haW5pbmcgYXJndW1lbnRzIGRlcGVuZCB1cG9uIGxvY2F0aW9uIHR5cGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgeGZlcl9vcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgdHlwZSwgLi4uICkgeworCXZhX2xpc3QgYXJnczsKKwlpbnQgcmM7CisKKwl2YV9zdGFydCAoIGFyZ3MsIHR5cGUgKTsKKwlyYyA9IHhmZXJfdm9wZW4gKCB4ZmVyLCB0eXBlLCBhcmdzICk7CisJdmFfZW5kICggYXJncyApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZW9wZW4gbG9jYXRpb24KKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdHlwZQkJTG9jYXRpb24gdHlwZQorICogQHYgYXJncwkJUmVtYWluaW5nIGFyZ3VtZW50cyBkZXBlbmQgdXBvbiBsb2NhdGlvbiB0eXBlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGlzIHdpbGwgY2xvc2UgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gYW5kIG9wZW4gYSBuZXcgY29ubmVjdGlvbgorICogdXNpbmcgeGZlcl92b3BlbigpLiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIC52cmVkaXJlY3QKKyAqIG1ldGhvZCBoYW5kbGVyLgorICovCitpbnQgeGZlcl92cmVvcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgdHlwZSwgdmFfbGlzdCBhcmdzICkgeworCisJLyogQ2xvc2UgZXhpc3RpbmcgY29ubmVjdGlvbiAqLworCXhmZXJfY2xvc2UgKCB4ZmVyLCAwICk7CisKKwkvKiBPcGVuIG5ldyBsb2NhdGlvbiAqLworCXJldHVybiB4ZmVyX3ZvcGVuICggeGZlciwgdHlwZSwgYXJncyApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9wY19rYmQuYyBiL2dweGUvc3JjL2NvcmUvcGNfa2JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5YzhiZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvcGNfa2JkLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIE1pbmltYWwgcG9sbGluZyBQQyBrZXlib2FyZCBkcml2ZXIKKyAqIC0gTm8gaW50ZXJydXB0CisgKiAtIE5vIExFRAorICogLSBObyBzcGVjaWFsIGtleXMKKyAqCisgKiBzdGlsbCBFbm91Z2ggRm9yIE1lIHRvIHR5cGUgYSBmaWxlbmFtZS4KKyAqCisgKiAyMDAzLTA3IGJ5IFNPTkUgVGFrZXNoCisgKiAyMDA0LTA0IG1vdmVkIGJ5IExZSCBGcm9tIGZpbG8gdG8gRXRoZXJib290CisgKgkJeWhsdUB0eWFuLmNvbQorICovCisKKyNpbmNsdWRlIDxncHhlL2lvLmg+CisjaW5jbHVkZSAiY29uc29sZS5oIgorCitzdGF0aWMgY2hhciBrZXlfbWFwW11bMTI4XSA9IHsKKyAgICB7CisJIlwwXHgxYiIiMTIzNDU2Nzg5MC09XGJcdCIKKwkicXdlcnR5dWlvcFtdXHJcMGFzIgorCSJkZmdoamtsOydgXDBcXHp4Y3YiCisJImJubSwuL1wwKlwwIFwwXDBcMFwwXDBcMCIKKwkiXDBcMFwwXDBcMFwwXDAiIjc4OS00NTYrMSIKKwkiMjMwLiIKKyAgICB9LHsKKwkiXDBceDFiIiIhQCMkJV4mKigpXytcYlx0IgorCSJRV0VSVFlVSU9Qe31cclwwQVMiCisJIkRGR0hKS0w6XCJ+XDB8WlhDViIKKwkiQk5NPD4/XDBcMFwwIFwwXDBcMFwwXDBcMCIKKwkiXDBcMFwwXDBcMFwwXDAiIjc4OS00NTYrMSIKKwkiMjMwLiIKKyAgICB9Cit9OworCitzdGF0aWMgaW50IGN1cl9zY2FuOworc3RhdGljIHVuc2lnbmVkIGludCBzaGlmdF9zdGF0ZTsKKyNkZWZpbmUgU0hJRlQgMQorI2RlZmluZSBDT05UUk9MIDIKKyNkZWZpbmUgQ0FQUyA0CisKK3N0YXRpYyBpbnQgZ2V0X3NjYW5jb2RlKHZvaWQpCit7CisgICAgaW50IHNjYW47CisKKyAgICBpZiAoKGluYigweDY0KSAmIDEpID09IDApCisJcmV0dXJuIDA7CisgICAgc2NhbiA9IGluYigweDYwKTsKKworICAgIHN3aXRjaCAoc2NhbikgeworICAgIGNhc2UgMHgyYToKKyAgICBjYXNlIDB4MzY6CisJc2hpZnRfc3RhdGUgfD0gU0hJRlQ7CisJYnJlYWs7CisgICAgY2FzZSAweGFhOgorICAgIGNhc2UgMHhiNjoKKwlzaGlmdF9zdGF0ZSAmPSB+U0hJRlQ7CisJYnJlYWs7CisgICAgY2FzZSAweDFkOgorCXNoaWZ0X3N0YXRlIHw9IENPTlRST0w7CisJYnJlYWs7CisgICAgY2FzZSAweDlkOgorCXNoaWZ0X3N0YXRlICY9IH5DT05UUk9MOworCWJyZWFrOworICAgIGNhc2UgMHgzYToKKwlzaGlmdF9zdGF0ZSBePSBDQVBTOworCWJyZWFrOworICAgIH0KKworICAgIGlmIChzY2FuICYgMHg4MCkKKwlyZXR1cm4gMDsgLyogaWdub3JlIGJyZWFrIGNvZGUgb3IgMHhlMCBldGMhICovCisgICAgcmV0dXJuIHNjYW47Cit9CisKK3N0YXRpYyBpbnQga2JkX2hhdmVrZXkodm9pZCkKK3sKKyAgICBpZiAoIWN1cl9zY2FuKQorCWN1cl9zY2FuID0gZ2V0X3NjYW5jb2RlKCk7CisgICAgcmV0dXJuIGN1cl9zY2FuICE9IDA7Cit9CisKK3N0YXRpYyBpbnQga2JkX2lzY2hhcih2b2lkKQoreworICAgIGlmICgha2JkX2hhdmVrZXkoKSkKKwlyZXR1cm4gMDsKKyAgICBpZiAoIWtleV9tYXBbc2hpZnRfc3RhdGUgJiBTSElGVF1bY3VyX3NjYW5dKSB7CisJY3VyX3NjYW4gPSAwOworCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBrYmRfZ2V0Yyh2b2lkKQoreworICAgIGludCBjOworCisgICAgd2hpbGUgKCFrYmRfaXNjaGFyKCkpCisJOworICAgIGMgPSBrZXlfbWFwW3NoaWZ0X3N0YXRlICYgU0hJRlRdW2N1cl9zY2FuXTsKKyAgICBpZiAoc2hpZnRfc3RhdGUgJiAoQ09OVFJPTCB8IENBUFMpKSB7CisJaWYgKChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSkgeworCSAgICBpZiAoc2hpZnRfc3RhdGUgJiBDT05UUk9MKQorCQljICY9IDB4MWY7CisJICAgIGVsc2UgaWYgKHNoaWZ0X3N0YXRlICYgQ0FQUykKKwkJYyBePSAoJ0EnIF4gJ2EnKTsKKwl9CisgICAgfQorICAgIGN1cl9zY2FuID0gMDsKKyAgICByZXR1cm4gYzsKK30KKworc3RydWN0IGNvbnNvbGVfZHJpdmVyIHBjX2tiZF9jb25zb2xlIF9fY29uc29sZV9kcml2ZXIgPSB7CisJLmdldGNoYXIgPSBrYmRfZ2V0YywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL3BjbWNpYS5jIGIvZ3B4ZS9zcmMvY29yZS9wY21jaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE5NzFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9wY21jaWEuYwpAQCAtMCwwICsxLDI2NyBAQAorI2lmIDAKKworLyoKKyAqCXBjbWNpYS5jCisgKgorICoJUENNQ0lBIHN1cHBvcnQgcm91dGluZXMgZm9yIGV0aGVyYm9vdCAtIGdlbmVyaWMgc3R1ZmYKKyAqCisgKglUaGlzIGNvZGUgaGFzIHBhcnRseSBiZSB0YWtlbiBmcm9tIHRoZSBsaW51eCBrZXJuZWwgc291cmNlcywgLi4uL2RyaXZlcnMvcGNtY2lhLworICoJU3RhcnRlZCAmIHB1dCB0b2dldGhlciBieQorICoJCUFuc2VsbSBNYXJ0aW4gSG9mZm1laXN0ZXIKKyAqCQlTdG9ja2hvbG0gUHJvamVrdCBDb21wdXRlci1TZXJ2aWNlCisgKgkJU2Fua3QgQXVndXN0aW4gLyBCb25uLCBHZXJtYW55CisgKgorICoJRGlzdHJpYnV0ZWQgdW5kZXIgR1BMMgorICovCisKKy8qCisgKgorICoKKyAqCQkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCVBMRUFTRSBETyBOT1QgWUVUIFdPUksgT04gVEhJUworICoJCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglJJ20gc3RpbGwgZml4aW5nIGl0IHVwIG9uIGV2ZXJ5IGVuZCwgc28gd2UgbW9zdCBwcm9iYWJseSB3b3VsZCBpbnRlcmZlcmUKKyAqCWF0IHNvbWUgcG9pbnQuIElmIHRoZXJlJ3MgYW55dGhpbmcgb2J2aW91cyBvciBiZXR0ZXIsIG5vdC1zby1vYnZpb3VzLAorICoJcGxlYXNlIGNvbnRhY3QgbWUgYnkgZS1tYWlsOiBhbnNlbG0gKEFUKSBob2ZmbWVpc3RlciAoRE9UKSBiZSAgICpUSEFOS1MqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHBjbWNpYS5oPgorI2luY2x1ZGUgPGk4MjM2NS5oPgorI2RlZmluZSBDT0RFX1NUQVRVUyAiYWxwaGEiCisjZGVmaW5lCUNPREVfVkVSU0lPTiAiMC4xLjMiCisjaW5jbHVkZSA8cGNtY2lhLW9wdHMuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbml0Lmg+CisKK2ludAlzb2NrZXRzOyAvKiBBSFRPRE86IFBoYXNlIHRoaXMgb3V0ISAqLwordV9pbnQJcGNjc29ja3M7CitzdHJ1Y3QJcGNjc29ja190IHBjY3NvY2tbTUFYUENDU09DS1NdOworaW50CWluaXRlZCA9IC0xOworc3RydWN0CXBjY19jb25maWdfdCBwY2Njb25maWdbTUFYUENDQ09ORklHU107CisKK3N0cnVjdAlkcml2ZXJfaW50ZXJhY3RfdCBkcml2ZXJbXSA9IHsKKyNpZmRlZglTVVBQT1JUX0k4MjM2NQorCXsgSTgyMzY1LCBpODIzNjVfaW50ZXJmYWNlciwgIkludGVsXzgyMzY1IiB9LAorI2VuZGlmCit9OworCisjZGVmaW5lCU5VTV9EUklWRVJTIChzaXplb2YoZHJpdmVyKS8oc2l6ZW9mKHN0cnVjdCBkcml2ZXJfaW50ZXJhY3RfdCkpKQorCit2b2lkCXNsZWVwdGlja3MoaW50IG51bXRpY2tzICkgeworCXVfaW50CXRtbzsKKwlmb3IgKHRtbyA9IGN1cnJ0aWNrcygpK251bXRpY2tzOyBjdXJydGlja3MoKSA8IHRtbzsgKSB7CisgICAgICAgIH0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHBjbWNpYV9pbml0X2FsbCh2b2lkKSB7CisJdV9pbnQgaSwgaiwgaywgbCwgbSwgbiwgdWksIGNvbmZpZ3MgPSAwOworCXVfaW50IG11bHRpY2FyZFs4XTsKKwl1X2NoYXIJKnVjLCB1cGM7CisJaWYgKCBQREVCVUcgPiAwICkgcHJpbnRmKCJJbml0aWFsaXppbmcgUENNQ0lBIHN1YnN5c3RlbSAoY29kZS1zdGF0dXM6ICIgQ09ERV9TVEFUVVMgIiwgVmVyc2lvbiAiIENPREVfVkVSU0lPTiAiKVxuIik7CisJaWYgKCBQREVCVUcgPiAyICkgeworCQlwcmludGYgKCAiU3VwcG9ydGluZyAlZCBkcml2ZXIocyk6ICIsIE5VTV9EUklWRVJTICk7CisJCWZvciAoIGkgPSAwOyBpIDwgTlVNX0RSSVZFUlM7ICsraSApIHsKKwkJCXByaW50ZiAoICJbJXNdICIsIGRyaXZlcltpXS5uYW1lICk7CisJCX0KKwkJcHJpbnRmICggIlxuIiApOworCX0KKwlwY2Nzb2NrcyA9IDA7CisJc29ja2V0cyA9IDA7CisJLy8gSW5pdCBhbGwgZHJpdmVycyBpbiB0aGUgZHJpdmVyW10gYXJyYXk6CisJZm9yICggaSA9IDA7IGkgPCBOVU1fRFJJVkVSUzsgKytpICkgeworCQlkcml2ZXJbaV0uZihJTklULDAsaSwwLDApOwkvLyBpbml0IG5lZWRzIG5vIHBhcmFtcy4gSXQgdXNlcyBwY2Nzb2NrcyBhbmQgcGNjc29ja1tdLgorCQkJCQkJLy8gT25seSBpIHRlbGxzIGl0IHdoaWNoIGRyaXZlcl9pZCBpdHNlbGYgaXMuCisJfQorCWZvciAoIGkgPSAwOyBpIDwgcGNjc29ja3M7ICsraSApIHsKKwkJcHJpbnRmICggIlNvY2tldCAlZDogIiwgaSApOworCQlpZiAoIHBjY3NvY2tbaV0uc3RhdHVzICE9IEhBU0NBUkQgKSB7CisJCQlwcmludGYgKCAiaXMgJXM6IHNraXBwaW5nXG4iLCBwY2Nzb2NrW2ldLnN0YXR1cyA9PSBFTVBUWT8gImVtcHR5IjoiW3N0YXR1cyB1bmtub3duXSIgKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICggMCAhPSBkcml2ZXJbcGNjc29ja1tpXS5kcml2ZXJudW1dLmYoTUFQQVRUUk1FTSxwY2Nzb2NrW2ldLmludGVybmFsaWQsTUFQX0FUVFJNRU1fVE8sIE1BUF9BVFRSTUVNX0xFTiwwICkgKSB7CisJCQlwcmludGYgKCJQQ01DSUEgY29udHJvbGxlciBmYWlsZWQgdG8gbWFwIGF0dHJpYnV0ZSBtZW1vcnkuXG4qKioqIFNFVkVSRSBFUlJPUiBDT05ESVRJT04uIFNraXBwaW5nIGNvbnRyb2xsZXIuXG4iICk7CisJCQlpZiAoIFBERUJVRyA+IDIgKSB7CisJCQkJcHJpbnRmICggIjxwcmVzcyBrZXkuIFRISVMgQ09ORElUSU9OIFNIT1VMRCBCRSBSRVBPUlRFRCE+XG4iICk7IGdldGNoYXIoKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCS8vIHBhcnNlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKwkJdWMgPSBpb3JlbWFwICggTUFQX0FUVFJNRU1fVE8sIE1BUF9BVFRSTUVNX0xFTiApOworCQlwY2Nzb2NrW2ldLnN0cmluZ29mZnNldCA9IHBjY3NvY2tbaV0uY29uZmlnb2Zmc2V0ID0gcGNjc29ja1tpXS5zdHJpbmdsZW5ndGggPSAwOworCQlwY2Nzb2NrW2ldLnR5cGUgPSAweGZmOworCQlmb3IgKCBsID0gMDsgbCA8IDg7ICsrbCApIG11bHRpY2FyZFtsXSA9IDA7CisJCXNsZWVwdGlja3MoMik7CisJCWZvciAoIGwgPSB1aSA9IDA7IHVpIDwgMHg4MDA7IHVpICs9IHVjWygyKnVpKSsyXSArIDIgKSB7CisJCQlpZiAoIHVjWygyKnVpKV0gPT0gMHhmZiApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIFRoaXMgbG9vcCBpcyBjb21wbGV0ZSBydWJiaXNoIEFGQUlDUy4KKwkJCS8vIEJ1dCB3aXRob3V0IGl0LCBteSB0ZXN0IHN5c3RlbSB3b24ndCBjb21lIHVwLgorCQkJLy8gSXQncyB0b28gYmFkIHRvIGRldmVsb3Agb24gYnJva2VuIGhhcmR3YXJlCisJCQkvLwkJCQktIEFuc2VsbQorCQl9CisJCXNsZWVwdGlja3MoMik7CisJCWNvbmZpZ3MgPSAwOworCQlpbml0ZWQgPSAtMTsKKwkJZm9yICggbCA9IHVpID0gMDsgdWkgPCAweDgwMDsgdWkgKz0gdWNbKDIqdWkpKzJdICsgMiApIHsKKwkJCWlmICggdWNbKDIqdWkpXSA9PSAweGZmICkgYnJlYWs7CisJCQllbHNlIGlmICggdWNbMip1aV0gPT0gMHgxNSApIHsKKwkJCQlmb3IgKCBrID0gMiAqICggdWkgKyAyICk7ICggdWNba10gPD0gJyAnICkgJiYgKCBrIDwgKCAyICogKCB1Y1syKih1aSsxKV0gKyB1aSArIDIgKSApICkgOyBrICs9IDIgKSB7IDsgfQorCQkJCXBjY3NvY2tbaV0uc3RyaW5nb2Zmc2V0ID0gazsKKwkJCQlwY2Nzb2NrW2ldLnN0cmluZ2xlbmd0aCA9ICggMiAqICggdWkgKyAyICsgdWNbKDIqdWkpKzJdICkgLSBrICkgLyAyOworCQkJfSBlbHNlIGlmICggdWNbMip1aV0gPT0gMHgyMSApIHsKKwkJCQlwY2Nzb2NrW2ldLnR5cGUgPSB1Y1soMip1aSkrNF07CisJCQl9IGVsc2UgaWYgKCB1Y1syKnVpXSA9PSAweDFhICkgeyAvLyBDb25maWd1cmF0aW9uIG1hcAorCQkJCXByaW50ZiAoICJcbkNvbmZpZyBtYXAgMHgxYSBmb3VuZCBbIiApOworCQkJCWZvciAoIGsgPSAwOyBrIDwgdWNbMioodWkrMSldOyArK2sgKSB7CisJCQkJCXByaW50ZiAoICIlMDJ4ICIsIHVjWzIqKHVpK2srMildICk7CisJCQkJfQorCQkJCXByaW50ZiAoICJdXG5IaWdoZXN0IGNvbmZpZyBhdmFpbGFibGUgaXMgJWRcbiIsIHVjWzIqKHVpKzMpXSApOworCQkJCW0gPSB1Y1syKih1aSsyKV07CisJCQkJcGNjc29ja1tpXS5jb25maWdvZmZzZXQgPSAwOworCQkJCWZvciAoIGogPSAwOyBqIDw9IChtICYgMyk7ICsraiApIHsKKwkJCQkJcGNjc29ja1tpXS5jb25maWdvZmZzZXQgKz0gdWNbMioodWkrNCtqKV0gPDwgKDgqaik7CisJCQkJfQorCQkJCXBjY3NvY2tbaV0ucm1hc2swID0gMDsKKwkJCQlmb3IgKCBqID0gMDsgaiA8PSAoICggKCBtICYgMHgzYyApID4+IDIgKSAmIDMgKTsgKytqICkgeworCQkJCQlwY2Nzb2NrW2ldLnJtYXNrMCArPSB1Y1syKih1aSs1KyhtJjMpK2opXSA8PCAoOCpqKTsKKwkJCQl9CisJCQkJaiA9IHBjY3NvY2tbaV0ucm1hc2swOworCQkJCXByaW50ZiAoICJDb25maWcgb2Zmc2V0IGlzICV4LCBjYXJkIGhhcyByZWdzOiA8ICVzJXMlcyVzJXM+XG4iLCBwY2Nzb2NrW2ldLmNvbmZpZ29mZnNldCwKKwkJCQkJaiAmIDEgPyAiQ09SICI6IiIsIGogJiAyID8gIkNDU1IgIjoiIiwgaiAmIDQgPyAiUFJSICI6IiIsIGogJiA4ID8gIlNDUiAiOiIiLCBqICYgMTY/ICJFU1IgIjoiIiApOworCQkJCXByaW50ZiAoICJDT1IgKyBDQ1NSIGNvbnRlbnRzIChzaS9kdSkgJXggJXgvJXggJXhcbiIsIHVjW3BjY3NvY2tbaV0uY29uZmlnb2Zmc2V0KzBdLAorCQkJCQl1Y1twY2Nzb2NrW2ldLmNvbmZpZ29mZnNldCsyXSx1Y1twY2Nzb2NrW2ldLmNvbmZpZ29mZnNldCoyXSx1Y1socGNjc29ja1tpXS5jb25maWdvZmZzZXQqMikrMl0gKTsKKwkJCQlwcmludGYgKCAiICAgICAgICAgICIgKTsKKwkJCX0gZWxzZSBpZiAoIHVjWzIqdWldID09IDB4MWIgKSB7IC8vIENvbmZpZ3VyYXRpb24gZGF0YSBlbnRyeQorCQkJCS8vcHJpbnRmICggIkNvbmZpZyBkYXRhIDB4MWIgZm91bmQgW1xuIiApO2dldGNoYXIoKTsKKwkJCQlmb3IgKCBrID0gMDsgayA8IHVjWzIqKHVpKzEpXTsgKytrICkgeworCQkJCS8vCXByaW50ZiAoICIlMDJ4ICIsIHVjWzIqKHVpK2srMildICk7CisJCQkJfQorCQkJCS8vIFBhcnNlIHRoaXMgdHVwbGUgaW50byBwY2Njb25maWdbY29uZmlnc10KKwkJCQkvLyBwcmludGYgKCAiXVxuIiApOworCQkJCWlmICggY29uZmlncyA9PSBNQVhQQ0NDT05GSUdTICkgY29udGludWU7CisJCQkJayA9IDIqdWkrNDsKKwkJCQlwY2Njb25maWdbY29uZmlnc10uaW5kZXggPSB1Y1trXSAmIDB4M2Y7CisJCQkJaWYgKCB1Y1trXSAmIDB4ODAgKSB7CisJCQkJLy8JcHJpbnRmICggIlNwZWNpYWwgY29uZmlnLCB1bnN1cHAuIGZvciBub3dcbiIgKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWsrPTI7CisJCQkJLy8gcHJpbnRmICggIkZlYXR1cmVzOiAlMnhcbiIsIHVjW2tdICk7CisJCQkJaWYgKCB1Y1trXSAmIDB4NyApIHsKKwkJCQkJLy8gcHJpbnRmICggIkNhbm5vdCB3b3JrIHdpdGggVmNjL1RpbWluZyBjb25maWdzIHJpZ2h0IG5vd1xuIiApOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcGNjY29uZmlnW2NvbmZpZ3NdLmlvd2luID0gcGNjY29uZmlnW2NvbmZpZ3NdLmlvbGVuID0gMDsKKwkJCQlpZiAoIDAgIT0gKCB1Y1trXSAmIDB4OCApICkgeworCQkJCQlrKz0yOworCQkJCQkvLyBwcmludGYgKCAiUmVhZGluZyBJTyBjb25maWc6ICIgKTsKKwkJCQkJaWYgKCAwID09ICggdWNba10gJiAweDgwICkgKSB7CisJCQkJCS8vCXByaW50ZiAoICJDYW5ub3Qgd29yayB3aXRoIGF1dG8vaW8gY29uZmlnXG4iICk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlrKz0yOworCQkJCQlpZiAoIDAgIT0gKCB1Y1trXSAmIDB4MGYgKSApIHsKKwkJCQkJLy8JcHJpbnRmICggIkRvbid0IHN1cHBvcnQgbW9yZSB0aGFuIDEgaW93aW4gcmlnaHQgbm93XG4iICk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlqID0gKHVjW2tdICYgMHgzMCkgPj4gNDsKKwkJCQkJbSA9ICh1Y1trXSAmIDB4YzApID4+IDY7CisJCQkJCWlmICggMyA9PSBqICkgKytqOworCQkJCQlpZiAoIDMgPT0gbSApICsrbTsKKwkJCQkJayArPSAyOworCQkJCQlwY2Njb25maWdbY29uZmlnc10uaW93aW4gPSAwOworCQkJCQlwY2Njb25maWdbY29uZmlnc10uaW9sZW4gPSAxOworCQkJCQlmb3IgKCBuID0gMDsgbiA8IGo7ICsrbiwgays9MiApIHsKKwkJCQkJCXBjY2NvbmZpZ1tjb25maWdzXS5pb3dpbiArPSB1Y1trXSA8PCAobio4KTsKKwkJCQkJfQorCQkJCQlmb3IgKCBuID0gMDsgbiA8IG07ICsrbiwgays9MiApIHsKKwkJCQkJCXBjY2NvbmZpZ1tjb25maWdzXS5pb2xlbiArPSB1Y1trXSA8PCAobio4KTsKKwkJCQkJfQorCQkJCQkvLyBwcmludGYgKCAiaW8gJXggbGVuICVkICglZClcbiIsIHBjY2NvbmZpZ1tjb25maWdzXS5pb3dpbiwgcGNjY29uZmlnW2NvbmZpZ3NdLmlvbGVuLGNvbmZpZ3MgKTsKKwkJCQl9CisJCQkJZm9yICggaiA9IDA7IGogPCAodWNba10gJiAzKTsgKytqICkgeworCQkJCS8vCXBjY2NvbmZpZ1tjb25maWdzXS5pb3dpbiArPSAodWNbaysoMipqKSsyXSkgPDwgKDgqaik7CisJCQkJfQorCQkJCSsrY29uZmlnczsKKwkJCX0KKwkJfQorCQlpZiAoIHBjY3NvY2tbaV0uc3RyaW5nb2Zmc2V0ID4gMCApIHsJLy8gSWYgbm8gaWRlbnRpZmllciwgaXQncyBub3QgYSB2YWxpZCBDSVMgKGFzIG9mIGRvY3VtZW50YXRpb24uLi4pCisJCQlwcmludGYgKCAiWyIgKTsKKwkJCWZvciAoIGsgPSAwOyAoIGsgPCAgcGNjc29ja1tpXS5zdHJpbmdsZW5ndGggKSAmJiAoIGsgPCA2NCApOyArK2sgKSB7CisJCQkJaiA9IHVjW3BjY3NvY2tbaV0uc3RyaW5nb2Zmc2V0ICsgMiAqIGtdOworCQkJCXByaW50ZiAoICIlYyIsIChqPj0nICc/IGo6JyAnICkgKTsKKwkJCX0KKwkJCXByaW50ZiAoIl1cbiAgICAgICAgICBpcyB0eXBlICVkICgiLCBwY2Nzb2NrW2ldLnR5cGUgKTsKKwkJCXN3aXRjaCAoIHBjY3NvY2tbaV0udHlwZSApIHsKKwkJCSAgY2FzZQkweDAwOgorCQkJCXByaW50ZiAoICJNVUxUSSIgKTsgYnJlYWs7CisJCQkgIGNhc2UJMHgwMToKKwkJCQlwcmludGYgKCAiTWVtb3J5IiApOyBicmVhazsKKwkJCSAgY2FzZQkweDAyOgorCQkJCXByaW50ZiAoICJTZXJpYWwiICk7IGJyZWFrOworCQkJICBjYXNlCTB4MDM6CisJCQkJcHJpbnRmICggIlBhcmFsbGVsIiApOyBicmVhazsKKwkJCSAgY2FzZQkweDA0OgorCQkJCXByaW50ZiAoICJGaXhlZCIgKTsgYnJlYWs7CisJCQkgIGNhc2UJMHgwNToKKwkJCQlwcmludGYgKCAiVmlkZW8iICk7IGJyZWFrOworCQkJICBjYXNlCTB4MDY6CisJCQkJcHJpbnRmICggIk5ldHdvcmsiICk7IGJyZWFrOworCQkJICBjYXNlCTB4MDc6CisJCQkJcHJpbnRmICggIkFJTVMiICk7IGJyZWFrOworCQkJICBjYXNlCTB4MDg6CisJCQkJcHJpbnRmICggIlNDU0kiICk7IGJyZWFrOworCQkJICBjYXNlCTB4MTA2OiAvLyBTcGVjaWFsIC8gaG9tZWJyZXcgdG8gc2F5ICJNdWx0aS9uZXR3b3JrIgorCQkJCXByaW50ZiAoICJNVUxUSSwgd2l0aCBOZXR3b3JrIiApOyBicmVhazsgLy8gQUhUT0RPIGZpbmQgYSBjYXJkIGZvciB0aGlzCisJCQkgIGRlZmF1bHQ6CisJCQkJcHJpbnRmICggIlVOU1VQUE9SVEVEL1VOS05PV04iICk7CisJCQl9CisJCQlwcmludGYgKCAiKSB3aXRoICVkIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24ocylcbiIsIGNvbmZpZ3MgKTsKKwkJCS8vIE5vdyBzZXQgZGVwZW5kZW5jeTogSWYgaXQncyBOZXR3b3JrIG9yIG11bHRpLT5uZXR3b3JrLCBhY2NlcHQKKwkJCWlmICggKGluaXRlZCA8PSAwICkgJiYgKDYgPT0gKDB4ZmYgJiBwY2Nzb2NrW2ldLnR5cGUpICkgJiYgKDAgPCBjb25maWdzICkgKSB7CisJCQkJcHJpbnRmICggImFjdGl2YXRpbmcgdGhpcyBkZXZpY2Ugd2l0aCBpb3BvcnQgJXgtJXggKGNvbmZpZyAjJWQpXG4iLCAKKwkJCQlwY2Njb25maWdbMF0uaW93aW4sIHBjY2NvbmZpZ1swXS5pb3dpbitwY2Njb25maWdbMF0uaW9sZW4tMSwgcGNjY29uZmlnWzBdLmluZGV4ICk7CisJCQkJaW5pdGVkID0gaTsKKwkJCQkvLyBBbmQgdW5tYXAgYXR0cm1lbSBvdXJzZWx2ZXMhCisJCQkJcHJpbnRmICggIkFjdGl2YXRpbmcgY29uZmlnLi4uIiApOworCQkJCWlmICggbT1kcml2ZXJbcGNjc29ja1tpXS5kcml2ZXJudW1dLmYoU0VMRUNUQ09ORklHLHBjY3NvY2tbaV0uaW50ZXJuYWxpZCxwY2Njb25maWdbMF0uaW5kZXgsMCwmcGNjY29uZmlnWzBdKSApIHsKKwkJCQkJcHJpbnRmICgiRmFpbHVyZSglZCkhIixtKTsgaW5pdGVkID0gLTE7CisJCSAgICAJCQlkcml2ZXJbcGNjc29ja1tpXS5kcml2ZXJudW1dLmYoVU5NQVBBVFRSTUVNLHBjY3NvY2tbaV0uaW50ZXJuYWxpZCwwLDAsMCk7CisJCQkJfQorCQkJCXByaW50ZiAoICJkb25lIVxuIiApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRmICggInVuc3VwcG9ydGVkIC0gbm8gaWRlbnRpZmllciBzdHJpbmcgZm91bmQgaW4gQ0lTXG4iICk7CisJCX0KKwkJLy8gdW5tYXAgdGhlIFBDTUNJQSBkZXZpY2UKKwkJaWYgKCBpICE9IGluaXRlZCApIHsKKwkJICAgIGlmICggMCAhPSBkcml2ZXJbcGNjc29ja1tpXS5kcml2ZXJudW1dLmYoVU5NQVBBVFRSTUVNLHBjY3NvY2tbaV0uaW50ZXJuYWxpZCwwLDAsMCkgKSB7CisJCQlwcmludGYgKCJQQ01DSUEgY29udHJvbGxlciBmYWlsZWQgdG8gdW5tYXAgYXR0cmlidXRlIG1lbW9yeS5cbioqKiogU0VWRVJFIEVSUk9SIENPTkRJVElPTiAqKioqXG4iICk7CisJCQlpZiAoIFBERUJVRyA+IDIgKSB7CisJCQkJcHJpbnRmICggIjxwcmVzcyBrZXkuIFRISVMgQ09ORElUSU9OIFNIT1VMRCBCRSBSRVBPUlRFRCE+XG4iICk7IGdldGNoYXIoKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQkgICAgfQorCQl9CisJfQorCWlmICggUERFQlVHID4gMiApIHsKKwkJcHJpbnRmICggIjxwcmVzcyBrZXkgdG8gZXhpdCB0aGUgcGNtY2lhX2luaXRfYWxsIHJvdXRpbmU+XG4iICk7CisJCWdldGNoYXIoKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQJcGNtY2lhX3NodXRkb3duX2FsbCh2b2lkKSB7CisJaW50IGk7CisJLy9pZiAoIFBERUJVRyA+IDIgKSB7cHJpbnRmKCI8cHJlc3Mga2V5IHRvIGNvbnRpbnVlPlxuIiApOyBnZXRjaGFyKCk7IH0KKwlmb3IgKCBpID0gMDsgaSA8IHBjY3NvY2tzOyArK2kgKSB7CisgCQlkcml2ZXJbcGNjc29ja1tpXS5kcml2ZXJudW1dLmYoU0hVVERPV04scGNjc29ja1tpXS5pbnRlcm5hbGlkLDAsMCwwKTsKKwl9CisJcHJpbnRmKCJTaHV0ZG93biBvZiBQQ01DSUEgc3Vic3lzdGVtIGNvbXBsZXRlZCIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvcG9zaXhfaW8uYyBiL2dweGUvc3JjL2NvcmUvcG9zaXhfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmIxYTBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9wb3NpeF9pby5jCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKyNpbmNsdWRlIDxncHhlL29wZW4uaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3Bvc2l4X2lvLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFBPU0lYLWxpa2UgSS9PCisgKgorICogVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgdHJhZGl0aW9uYWwgYmxvY2tpbmcgSS9PIHNlbWFudGljcy4gIFRoZXkKKyAqIGFyZSBkZXNpZ25lZCB0byBiZSB1c2VkIGJ5IHRoZSBQWEUgVEZUUCBBUEkuICBCZWNhdXNlIHRoZXkgYmxvY2ssCisgKiB0aGV5IG1heSBub3QgYmUgdXNlZCBieSBtb3N0IG90aGVyIHBvcnRpb25zIG9mIHRoZSBnUFhFIGNvZGViYXNlLgorICovCisKKy8qKiBBbiBvcGVuIGZpbGUgKi8KK3N0cnVjdCBwb3NpeF9maWxlIHsKKwkvKiogUmVmZXJlbmNlIGNvdW50IGZvciB0aGlzIG9iamVjdCAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCS8qKiBMaXN0IG9mIG9wZW4gZmlsZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJLyoqIEZpbGUgZGVzY3JpcHRvciAqLworCWludCBmZDsKKwkvKiogT3ZlcmFsbCBzdGF0dXMKKwkgKgorCSAqIFNldCB0byAtRUlOUFJPR1JFU1Mgd2hpbGUgZGF0YSB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcy4KKwkgKi8KKwlpbnQgcmM7CisJLyoqIERhdGEgdHJhbnNmZXIgaW50ZXJmYWNlICovCisJc3RydWN0IHhmZXJfaW50ZXJmYWNlIHhmZXI7CisJLyoqIEN1cnJlbnQgc2VlayBwb3NpdGlvbiAqLworCXNpemVfdCBwb3M7CisJLyoqIEZpbGUgc2l6ZSAqLworCXNpemVfdCBmaWxlc2l6ZTsKKwkvKiogUmVjZWl2ZWQgZGF0YSBxdWV1ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGF0YTsKK307CisKKy8qKiBMaXN0IG9mIG9wZW4gZmlsZXMgKi8KK3N0YXRpYyBMSVNUX0hFQUQgKCBwb3NpeF9maWxlcyApOworCisvKioKKyAqIEZyZWUgb3BlbiBmaWxlCisgKgorICogQHYgcmVmY250CQlSZWZlcmVuY2UgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBwb3NpeF9maWxlX2ZyZWUgKCBzdHJ1Y3QgcmVmY250ICpyZWZjbnQgKSB7CisJc3RydWN0IHBvc2l4X2ZpbGUgKmZpbGUgPQorCQljb250YWluZXJfb2YgKCByZWZjbnQsIHN0cnVjdCBwb3NpeF9maWxlLCByZWZjbnQgKTsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwlzdHJ1Y3QgaW9fYnVmZmVyICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKCBpb2J1ZiwgdG1wLCAmZmlsZS0+ZGF0YSwgbGlzdCApIHsKKwkJbGlzdF9kZWwgKCAmaW9idWYtPmxpc3QgKTsKKwkJZnJlZV9pb2IgKCBpb2J1ZiApOworCX0KKwlmcmVlICggZmlsZSApOworfQorCisvKioKKyAqIFRlcm1pbmF0ZSBmaWxlIGRhdGEgdHJhbnNmZXIKKyAqCisgKiBAdiBmaWxlCQlQT1NJWCBmaWxlCisgKiBAdiByYwkJUmVhc29uIGZvciB0ZXJtaW5hdGlvbgorICovCitzdGF0aWMgdm9pZCBwb3NpeF9maWxlX2ZpbmlzaGVkICggc3RydWN0IHBvc2l4X2ZpbGUgKmZpbGUsIGludCByYyApIHsKKwl4ZmVyX251bGxpZnkgKCAmZmlsZS0+eGZlciApOworCXhmZXJfY2xvc2UgKCAmZmlsZS0+eGZlciwgcmMgKTsKKwlmaWxlLT5yYyA9IHJjOworfQorCisvKioKKyAqIEhhbmRsZSBjbG9zZSgpIGV2ZW50CisgKgorICogQHYgeGZlcgkJUE9TSVggZmlsZSBkYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgcmMJCVJlYXNvbiBmb3IgY2xvc2UKKyAqLworc3RhdGljIHZvaWQgcG9zaXhfZmlsZV94ZmVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKSB7CisJc3RydWN0IHBvc2l4X2ZpbGUgKmZpbGUgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgcG9zaXhfZmlsZSwgeGZlciApOworCisJcG9zaXhfZmlsZV9maW5pc2hlZCAoIGZpbGUsIHJjICk7Cit9CisKKy8qKgorICogSGFuZGxlIGRlbGl2ZXJfaW9iKCkgZXZlbnQKKyAqCisgKiBAdiB4ZmVyCQlQT1NJWCBmaWxlIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbWV0YQkJRGF0YSB0cmFuc2ZlciBtZXRhZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQKK3Bvc2l4X2ZpbGVfeGZlcl9kZWxpdmVyX2lvYiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCSAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJICAgICAgc3RydWN0IHhmZXJfbWV0YWRhdGEgKm1ldGEgKSB7CisJc3RydWN0IHBvc2l4X2ZpbGUgKmZpbGUgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgcG9zaXhfZmlsZSwgeGZlciApOworCisJLyogS2VlcCB0cmFjayBvZiBmaWxlIHBvc2l0aW9uIHNvbGVseSBmb3IgdGhlIGZpbGVzaXplICovCisJaWYgKCBtZXRhLT53aGVuY2UgIT0gU0VFS19DVVIgKQorCQlmaWxlLT5wb3MgPSAwOworCWZpbGUtPnBvcyArPSBtZXRhLT5vZmZzZXQ7CisJaWYgKCBmaWxlLT5maWxlc2l6ZSA8IGZpbGUtPnBvcyApCisJCWZpbGUtPmZpbGVzaXplID0gZmlsZS0+cG9zOworCisJaWYgKCBpb2JfbGVuICggaW9idWYgKSApIHsKKwkJbGlzdF9hZGRfdGFpbCAoICZpb2J1Zi0+bGlzdCwgJmZpbGUtPmRhdGEgKTsKKwl9IGVsc2UgeworCQlmcmVlX2lvYiAoIGlvYnVmICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKiBQT1NJWCBmaWxlIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBwb3NpeF9maWxlX3hmZXJfb3BlcmF0aW9ucyA9IHsKKwkuY2xvc2UJCT0gcG9zaXhfZmlsZV94ZmVyX2Nsb3NlLAorCS52cmVkaXJlY3QJPSB4ZmVyX3ZyZW9wZW4sCisJLndpbmRvdwkJPSB1bmxpbWl0ZWRfeGZlcl93aW5kb3csCisJLmFsbG9jX2lvYgk9IGRlZmF1bHRfeGZlcl9hbGxvY19pb2IsCisJLmRlbGl2ZXJfaW9iCT0gcG9zaXhfZmlsZV94ZmVyX2RlbGl2ZXJfaW9iLAorCS5kZWxpdmVyX3Jhdwk9IHhmZXJfZGVsaXZlcl9hc19pb2IsCit9OworCisvKioKKyAqIElkZW50aWZ5IGZpbGUgYnkgZmlsZSBkZXNjcmlwdG9yCisgKgorICogQHYgZmQJCUZpbGUgZGVzY3JpcHRvcgorICogQHJldCBmaWxlCQlDb3JyZXNwb25kaW5nIGZpbGUsIG9yIE5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBwb3NpeF9maWxlICogcG9zaXhfZmRfdG9fZmlsZSAoIGludCBmZCApIHsKKwlzdHJ1Y3QgcG9zaXhfZmlsZSAqZmlsZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBmaWxlLCAmcG9zaXhfZmlsZXMsIGxpc3QgKSB7CisJCWlmICggZmlsZS0+ZmQgPT0gZmQgKQorCQkJcmV0dXJuIGZpbGU7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIEZpbmQgYW4gYXZhaWxhYmxlIGZpbGUgZGVzY3JpcHRvcgorICoKKyAqIEByZXQgZmQJCUZpbGUgZGVzY3JpcHRvciwgb3IgbmVnYXRpdmUgZXJyb3IgbnVtYmVyCisgKi8KK3N0YXRpYyBpbnQgcG9zaXhfZmluZF9mcmVlX2ZkICggdm9pZCApIHsKKwlpbnQgZmQ7CisKKwlmb3IgKCBmZCA9IFBPU0lYX0ZEX01JTiA7IGZkIDw9IFBPU0lYX0ZEX01BWCA7IGZkKysgKSB7CisJCWlmICggISBwb3NpeF9mZF90b19maWxlICggZmQgKSApCisJCQlyZXR1cm4gZmQ7CisJfQorCURCRyAoICJQT1NJWCBjb3VsZCBub3QgZmluZCBmcmVlIGZpbGUgZGVzY3JpcHRvclxuIiApOworCXJldHVybiAtRU5GSUxFOworfQorCisvKioKKyAqIE9wZW4gZmlsZQorICoKKyAqIEB2IHVyaV9zdHJpbmcJVVJJIHN0cmluZworICogQHJldCBmZAkJRmlsZSBkZXNjcmlwdG9yLCBvciBuZWdhdGl2ZSBlcnJvciBudW1iZXIKKyAqLworaW50IG9wZW4gKCBjb25zdCBjaGFyICp1cmlfc3RyaW5nICkgeworCXN0cnVjdCBwb3NpeF9maWxlICpmaWxlOworCWludCBmZDsKKwlpbnQgcmM7CisKKwkvKiBGaW5kIGEgZnJlZSBmaWxlIGRlc2NyaXB0b3IgdG8gdXNlICovCisJZmQgPSBwb3NpeF9maW5kX2ZyZWVfZmQoKTsKKwlpZiAoIGZkIDwgMCApCisJCXJldHVybiBmZDsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHN0cnVjdHVyZSAqLworCWZpbGUgPSB6YWxsb2MgKCBzaXplb2YgKCAqZmlsZSApICk7CisJaWYgKCAhIGZpbGUgKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmaWxlLT5yZWZjbnQuZnJlZSA9IHBvc2l4X2ZpbGVfZnJlZTsKKwlmaWxlLT5mZCA9IGZkOworCWZpbGUtPnJjID0gLUVJTlBST0dSRVNTOworCXhmZXJfaW5pdCAoICZmaWxlLT54ZmVyLCAmcG9zaXhfZmlsZV94ZmVyX29wZXJhdGlvbnMsCisJCSAgICAmZmlsZS0+cmVmY250ICk7CisJSU5JVF9MSVNUX0hFQUQgKCAmZmlsZS0+ZGF0YSApOworCisJLyogT3BlbiBVUkkgb24gZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UgKi8KKwlpZiAoICggcmMgPSB4ZmVyX29wZW5fdXJpX3N0cmluZyAoICZmaWxlLT54ZmVyLCB1cmlfc3RyaW5nICkgKSAhPSAwICkKKwkJZ290byBlcnI7CisKKwkvKiBXYWl0IGZvciBvcGVuIHRvIHN1Y2NlZWQgb3IgZmFpbCAqLworCXdoaWxlICggbGlzdF9lbXB0eSAoICZmaWxlLT5kYXRhICkgKSB7CisJCXN0ZXAoKTsKKwkJaWYgKCBmaWxlLT5yYyA9PSAwICkKKwkJCWJyZWFrOworCQlpZiAoIGZpbGUtPnJjICE9IC1FSU5QUk9HUkVTUyApIHsKKwkJCXJjID0gZmlsZS0+cmM7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCS8qIEFkZCB0byBsaXN0IG9mIG9wZW4gZmlsZXMuICBMaXN0IHRha2VzIHJlZmVyZW5jZSBvd25lcnNoaXAuICovCisJbGlzdF9hZGQgKCAmZmlsZS0+bGlzdCwgJnBvc2l4X2ZpbGVzICk7CisJREJHICggIlBPU0lYIG9wZW5lZCAlcyBhcyBmaWxlICVkXG4iLCB1cmlfc3RyaW5nLCBmZCApOworCXJldHVybiBmZDsKKworIGVycjoKKwlwb3NpeF9maWxlX2ZpbmlzaGVkICggZmlsZSwgcmMgKTsKKwlyZWZfcHV0ICggJmZpbGUtPnJlZmNudCApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBDaGVjayBmaWxlIGRlc2NyaXB0b3JzIGZvciByZWFkaW5lc3MKKyAqCisgKiBAdiByZWFkZmRzCQlGaWxlIGRlc2NyaXB0b3JzIHRvIGNoZWNrCisgKiBAdiB3YWl0CQlXYWl0IHVudGlsIGRhdGEgaXMgcmVhZHkKKyAqIEByZXQgbnJlYWR5CQlOdW1iZXIgb2YgcmVhZHkgZmlsZSBkZXNjcmlwdG9ycworICovCitpbnQgc2VsZWN0ICggZmRfc2V0ICpyZWFkZmRzLCBpbnQgd2FpdCApIHsKKwlzdHJ1Y3QgcG9zaXhfZmlsZSAqZmlsZTsKKwlpbnQgZmQ7CisKKwlkbyB7CisJCWZvciAoIGZkID0gUE9TSVhfRkRfTUlOIDsgZmQgPD0gUE9TSVhfRkRfTUFYIDsgZmQrKyApIHsKKwkJCWlmICggISBGRF9JU1NFVCAoIGZkLCByZWFkZmRzICkgKQorCQkJCWNvbnRpbnVlOworCQkJZmlsZSA9IHBvc2l4X2ZkX3RvX2ZpbGUgKCBmZCApOworCQkJaWYgKCAhIGZpbGUgKQorCQkJCXJldHVybiAtRUJBREY7CisJCQlpZiAoICggbGlzdF9lbXB0eSAoICZmaWxlLT5kYXRhICkgKSAmJgorCQkJICAgICAoIGZpbGUtPnJjID09IC1FSU5QUk9HUkVTUyApICkKKwkJCQljb250aW51ZTsKKwkJCS8qIERhdGEgaXMgYXZhaWxhYmxlIG9yIHN0YXR1cyBoYXMgY2hhbmdlZCAqLworCQkJRkRfWkVSTyAoIHJlYWRmZHMgKTsKKwkJCUZEX1NFVCAoIGZkLCByZWFkZmRzICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlzdGVwKCk7CisJfSB3aGlsZSAoIHdhaXQgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlYWQgZGF0YSBmcm9tIGZpbGUKKyAqCisgKiBAdiBidWZmZXIJCURhdGEgYnVmZmVyCisgKiBAdiBvZmZzZXQJCVN0YXJ0aW5nIG9mZnNldCB3aXRoaW4gZGF0YSBidWZmZXIKKyAqIEB2IGxlbgkJTWF4aW11bSBsZW5ndGggdG8gcmVhZAorICogQHJldCBsZW4JCUFjdHVhbCBsZW5ndGggcmVhZCwgb3IgbmVnYXRpdmUgZXJyb3IgbnVtYmVyCisgKgorICogVGhpcyBjYWxsIGlzIG5vbi1ibG9ja2luZzsgaWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgdG8gcmVhZCB0aGVuCisgKiAtRVdPVUxEQkxPQ0sgd2lsbCBiZSByZXR1cm5lZC4KKyAqLworc3NpemVfdCByZWFkX3VzZXIgKCBpbnQgZmQsIHVzZXJwdHJfdCBidWZmZXIsIG9mZl90IG9mZnNldCwgc2l6ZV90IG1heF9sZW4gKSB7CisJc3RydWN0IHBvc2l4X2ZpbGUgKmZpbGU7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisJc2l6ZV90IGxlbjsKKworCS8qIElkZW50aWZ5IGZpbGUgKi8KKwlmaWxlID0gcG9zaXhfZmRfdG9fZmlsZSAoIGZkICk7CisJaWYgKCAhIGZpbGUgKQorCQlyZXR1cm4gLUVCQURGOworCisJLyogVHJ5IHRvIGZldGNoIG1vcmUgZGF0YSBpZiBub25lIGF2YWlsYWJsZSAqLworCWlmICggbGlzdF9lbXB0eSAoICZmaWxlLT5kYXRhICkgKQorCQlzdGVwKCk7CisKKwkvKiBEZXF1ZXVlIGF0IG1vc3Qgb25lIHJlY2VpdmVkIEkvTyBidWZmZXIgaW50byB1c2VyIGJ1ZmZlciAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBpb2J1ZiwgJmZpbGUtPmRhdGEsIGxpc3QgKSB7CisJCWxlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCQlpZiAoIGxlbiA+IG1heF9sZW4gKQorCQkJbGVuID0gbWF4X2xlbjsKKwkJY29weV90b191c2VyICggYnVmZmVyLCBvZmZzZXQsIGlvYnVmLT5kYXRhLCBsZW4gKTsKKwkJaW9iX3B1bGwgKCBpb2J1ZiwgbGVuICk7CisJCWlmICggISBpb2JfbGVuICggaW9idWYgKSApIHsKKwkJCWxpc3RfZGVsICggJmlvYnVmLT5saXN0ICk7CisJCQlmcmVlX2lvYiAoIGlvYnVmICk7CisJCX0KKwkJZmlsZS0+cG9zICs9IGxlbjsKKwkJYXNzZXJ0ICggbGVuICE9IDAgKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwkvKiBJZiBmaWxlIGhhcyBjb21wbGV0ZWQsIHJldHVybiAoYWZ0ZXIgcmV0dXJuaW5nIGFsbCBkYXRhKSAqLworCWlmICggZmlsZS0+cmMgIT0gLUVJTlBST0dSRVNTICkgeworCQlhc3NlcnQgKCBsaXN0X2VtcHR5ICggJmZpbGUtPmRhdGEgKSApOworCQlyZXR1cm4gZmlsZS0+cmM7CisJfQorCisJLyogTm8gZGF0YSByZWFkeSBhbmQgZmlsZSBzdGlsbCBpbiBwcm9ncmVzczsgcmV0dXJuIC1XT1VMREJMT0NLICovCisJcmV0dXJuIC1FV09VTERCTE9DSzsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgZmlsZSBzaXplCisgKgorICogQHYgZmQJCUZpbGUgZGVzY3JpcHRvcgorICogQHJldCBzaXplCQlGaWxlIHNpemUsIG9yIG5lZ2F0aXZlIGVycm9yIG51bWJlcgorICovCitzc2l6ZV90IGZzaXplICggaW50IGZkICkgeworCXN0cnVjdCBwb3NpeF9maWxlICpmaWxlOworCisJLyogSWRlbnRpZnkgZmlsZSAqLworCWZpbGUgPSBwb3NpeF9mZF90b19maWxlICggZmQgKTsKKwlpZiAoICEgZmlsZSApCisJCXJldHVybiAtRUJBREY7CisKKwlyZXR1cm4gZmlsZS0+ZmlsZXNpemU7Cit9CisKKy8qKgorICogQ2xvc2UgZmlsZQorICoKKyAqIEB2IGZkCQlGaWxlIGRlc2NyaXB0b3IKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgY2xvc2UgKCBpbnQgZmQgKSB7CisJc3RydWN0IHBvc2l4X2ZpbGUgKmZpbGU7CisKKwkvKiBJZGVudGlmeSBmaWxlICovCisJZmlsZSA9IHBvc2l4X2ZkX3RvX2ZpbGUgKCBmZCApOworCWlmICggISBmaWxlICkKKwkJcmV0dXJuIC1FQkFERjsKKworCS8qIFRlcm1pbmF0ZSBkYXRhIHRyYW5zZmVyICovCisJcG9zaXhfZmlsZV9maW5pc2hlZCAoIGZpbGUsIDAgKTsKKworCS8qIFJlbW92ZSBmcm9tIGxpc3Qgb2Ygb3BlbiBmaWxlcyBhbmQgZHJvcCByZWZlcmVuY2UgKi8KKwlsaXN0X2RlbCAoICZmaWxlLT5saXN0ICk7CisJcmVmX3B1dCAoICZmaWxlLT5yZWZjbnQgKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvcHJvY2Vzcy5jIGIvZ3B4ZS9zcmMvY29yZS9wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxM2UwMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvcHJvY2Vzcy5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9saXN0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pbml0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFByb2Nlc3NlcworICoKKyAqIFdlIGltcGxlbWVudCBhIHRyaXZpYWwgZm9ybSBvZiBjb29wZXJhdGl2ZSBtdWx0aXRhc2tpbmcsIGluIHdoaWNoCisgKiBhbGwgcHJvY2Vzc2VzIHNoYXJlIGEgc2luZ2xlIHN0YWNrIGFuZCBhZGRyZXNzIHNwYWNlLgorICovCisKKy8qKiBQcm9jZXNzIHJ1biBxdWV1ZSAqLworc3RhdGljIExJU1RfSEVBRCAoIHJ1bl9xdWV1ZSApOworCisvKioKKyAqIEFkZCBwcm9jZXNzIHRvIHByb2Nlc3MgbGlzdAorICoKKyAqIEB2IHByb2Nlc3MJCVByb2Nlc3MKKyAqCisgKiBJdCBpcyBzYWZlIHRvIGNhbGwgcHJvY2Vzc19hZGQoKSBtdWx0aXBsZSB0aW1lczsgZnVydGhlciBjYWxscyB3aWxsCisgKiBoYXZlIG5vIGVmZmVjdC4KKyAqLwordm9pZCBwcm9jZXNzX2FkZCAoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzICkgeworCWlmICggbGlzdF9lbXB0eSAoICZwcm9jZXNzLT5saXN0ICkgKSB7CisJCURCR0MgKCBwcm9jZXNzLCAiUFJPQ0VTUyAlcCBzdGFydGluZ1xuIiwgcHJvY2VzcyApOworCQlyZWZfZ2V0ICggcHJvY2Vzcy0+cmVmY250ICk7CisJCWxpc3RfYWRkX3RhaWwgKCAmcHJvY2Vzcy0+bGlzdCwgJnJ1bl9xdWV1ZSApOworCX0gZWxzZSB7CisJCURCR0MgKCBwcm9jZXNzLCAiUFJPQ0VTUyAlcCBhbHJlYWR5IHN0YXJ0ZWRcbiIsIHByb2Nlc3MgKTsKKwl9Cit9CisKKy8qKgorICogUmVtb3ZlIHByb2Nlc3MgZnJvbSBwcm9jZXNzIGxpc3QKKyAqCisgKiBAdiBwcm9jZXNzCQlQcm9jZXNzCisgKgorICogSXQgaXMgc2FmZSB0byBjYWxsIHByb2Nlc3NfZGVsKCkgbXVsdGlwbGUgdGltZXM7IGZ1cnRoZXIgY2FsbHMgd2lsbAorICogaGF2ZSBubyBlZmZlY3QuCisgKi8KK3ZvaWQgcHJvY2Vzc19kZWwgKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcyApIHsKKwlpZiAoICEgbGlzdF9lbXB0eSAoICZwcm9jZXNzLT5saXN0ICkgKSB7CisJCURCR0MgKCBwcm9jZXNzLCAiUFJPQ0VTUyAlcCBzdG9wcGluZ1xuIiwgcHJvY2VzcyApOworCQlsaXN0X2RlbCAoICZwcm9jZXNzLT5saXN0ICk7CisJCUlOSVRfTElTVF9IRUFEICggJnByb2Nlc3MtPmxpc3QgKTsKKwkJcmVmX3B1dCAoIHByb2Nlc3MtPnJlZmNudCApOworCX0gZWxzZSB7CisJCURCR0MgKCBwcm9jZXNzLCAiUFJPQ0VTUyAlcCBhbHJlYWR5IHN0b3BwZWRcbiIsIHByb2Nlc3MgKTsKKwl9Cit9CisKKy8qKgorICogU2luZ2xlLXN0ZXAgYSBzaW5nbGUgcHJvY2VzcworICoKKyAqIFRoaXMgZXhlY3V0ZXMgYSBzaW5nbGUgc3RlcCBvZiB0aGUgZmlyc3QgcHJvY2VzcyBpbiB0aGUgcnVuIHF1ZXVlLAorICogYW5kIG1vdmVzIHRoZSBwcm9jZXNzIHRvIHRoZSBlbmQgb2YgdGhlIHJ1biBxdWV1ZS4KKyAqLwordm9pZCBzdGVwICggdm9pZCApIHsKKwlzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBwcm9jZXNzLCAmcnVuX3F1ZXVlLCBsaXN0ICkgeworCQlsaXN0X2RlbCAoICZwcm9jZXNzLT5saXN0ICk7CisJCWxpc3RfYWRkX3RhaWwgKCAmcHJvY2Vzcy0+bGlzdCwgJnJ1bl9xdWV1ZSApOworCQlEQkdDMiAoIHByb2Nlc3MsICJQUk9DRVNTICVwIGV4ZWN1dGluZ1xuIiwgcHJvY2VzcyApOworCQlwcm9jZXNzLT5zdGVwICggcHJvY2VzcyApOworCQlEQkdDMiAoIHByb2Nlc3MsICJQUk9DRVNTICVwIGZpbmlzaGVkIGV4ZWN1dGluZ1xuIiwgcHJvY2VzcyApOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogSW5pdGlhbGlzZSBwcm9jZXNzZXMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcHJvY2Vzc2VzICggdm9pZCApIHsKKwlzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzczsKKworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggcHJvY2VzcywgUEVSTUFORU5UX1BST0NFU1NFUyApCisJCXByb2Nlc3NfYWRkICggcHJvY2VzcyApOworfQorCisvKiogUHJvY2VzcyBpbml0aWFsaXNlciAqLworc3RydWN0IGluaXRfZm4gcHJvY2Vzc19pbml0X2ZuIF9faW5pdF9mbiAoIElOSVRfTk9STUFMICkgPSB7CisJLmluaXRpYWxpc2UgPSBpbml0X3Byb2Nlc3NlcywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL3Byb3RvX2V0aF9zbG93LmMgYi9ncHhlL3NyYy9jb3JlL3Byb3RvX2V0aF9zbG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1OWE3MQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvcHJvdG9fZXRoX3Nsb3cuYwpAQCAtMCwwICsxLDQwNiBAQAorLyogQ29weXJpZ2h0IDIwMDQgTGludXggTmV0d29yeCAqLworI2lmZGVmIFBST1RPX0xBQ1AKKyNpZiAwCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKyNlbmRpZgorCisjZGVmaW5lIExBQ1BfREVCVUcgMAorCisvKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgb3JpZ2luYWxseSB0YWtlbiBmcm9tIHRoZSBsaW51eCBib25kXzNhZCBkcml2ZXIgKi8KKworI2RlZmluZSBTTE9XX0RTVF9NQUMgIlx4MDFceDgwXHhjMlx4MDBceDAwXHgwMiIKK3N0YXRpYyBjb25zdCBjaGFyIHNsb3dfZGVzdFtdID0gU0xPV19EU1RfTUFDOworCisKKyNkZWZpbmUgU0xPV19TVUJUWVBFX0xBQ1AgMQorI2RlZmluZSBTTE9XX1NVQlRZUEVfTUFSS0VSIDIKKworc3RydWN0IHNsb3dfaGVhZGVyIHsKKwl1aW50OF90IHN1YnR5cGU7Cit9OworCitzdHJ1Y3QgbGFjcF9pbmZvIHsKKwl1aW50MTZfdCBzeXN0ZW1fcHJpb3JpdHk7CisJdWludDhfdCAgc3lzdGVtW0VUSF9BTEVOXTsKKwl1aW50MTZfdCBrZXk7CisJdWludDE2X3QgcG9ydF9wcmlvcml0eTsKKwl1aW50MTZfdCBwb3J0OworCXVpbnQ4X3QgIHN0YXRlOworCXVpbnQ4X3QgIHJlc2VydmVkWzNdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTEFDUF9DTVBfTEVOICgyICsgNiArIDIgKyAyICsgMikKKyNkZWZpbmUgTEFDUF9DUF9MRU4gICgyICsgNiArIDIgKyAyICsgMiArIDEpCisKKy8qIExpbmsgQWdncmVnYXRpb24gQ29udHJvbCBQcm90b2NvbChMQUNQKSBkYXRhIHVuaXQgc3RydWN0dXJlKDQzLjQuMi4yIGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKSAqLworc3RydWN0IHNsb3dfbGFjcCB7CisJdWludDhfdCAgc3VidHlwZTsJCSAgICAgICAvKiA9IExBQ1AoPSAweDAxKSAqLworCXVpbnQ4X3QgIHZlcnNpb25fbnVtYmVyOworCXVpbnQ4X3QgIHRsdl90eXBlX2FjdG9yX2luZm87CSAgICAgICAvKiA9IGFjdG9yIGluZm9ybWF0aW9uKHR5cGUvbGVuZ3RoL3ZhbHVlKSAqLworI2RlZmluZSBMQUNQX1RMVl9URVJNSU5BVE9SIDAKKyNkZWZpbmUgTEFDUF9UTFZfQUNUT1IgICAgICAxCisjZGVmaW5lIExBQ1BfVExWX1BBUlRORVIgICAgMgorI2RlZmluZSBMQUNQX1RMVl9DT0xMRUNUT1IgIDMKKwl1aW50OF90ICBhY3Rvcl9pbmZvcm1hdGlvbl9sZW5ndGg7ICAgICAvKiA9IDIwICovCisJc3RydWN0IGxhY3BfaW5mbyBhY3RvcjsKKwl1aW50OF90ICB0bHZfdHlwZV9wYXJ0bmVyX2luZm87ICAgICAgICAvKiA9IHBhcnRuZXIgaW5mb3JtYXRpb24gKi8KKwl1aW50OF90ICBwYXJ0bmVyX2luZm9ybWF0aW9uX2xlbmd0aDsgICAvKiA9IDIwICovCisJc3RydWN0IGxhY3BfaW5mbyBwYXJ0bmVyOworCXVpbnQ4X3QgIHRsdl90eXBlX2NvbGxlY3Rvcl9pbmZvOyAgICAgIC8qID0gY29sbGVjdG9yIGluZm9ybWF0aW9uICovCisJdWludDhfdCAgY29sbGVjdG9yX2luZm9ybWF0aW9uX2xlbmd0aDsgLyogPSAxNiAqLworCXVpbnQxNl90IGNvbGxlY3Rvcl9tYXhfZGVsYXk7CisJdWludDhfdCAgcmVzZXJ2ZWRfMTJbMTJdOworCXVpbnQ4X3QgIHRsdl90eXBlX3Rlcm1pbmF0b3I7CSAgICAgICAvKiA9IHRlcm1pbmF0b3IgKi8KKwl1aW50OF90ICB0ZXJtaW5hdG9yX2xlbmd0aDsJICAgICAgIC8qID0gMCAqLyAKKwl1aW50OF90ICByZXNlcnZlZF81MFs1MF07CSAgICAgICAvKiA9IDAgKi8KK30gUEFDS0VEOworCisvKiBNYXJrZXIgUHJvdG9jb2wgRGF0YSBVbml0KFBEVSkgc3RydWN0dXJlKDQzLjUuMy4yIGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKSAqLworc3RydWN0IHNsb3dfbWFya2VyIHsKKwl1aW50OF90ICBzdWJ0eXBlOyAgICAgICAgICAgICAgICAgICAgICAvKiA9IDB4MDIgIChtYXJrZXIgUERVKSAqLworCXVpbnQ4X3QgIHZlcnNpb25fbnVtYmVyOwkgICAgICAgLyogPSAweDAxICovCisJdWludDhfdCAgdGx2X3R5cGU7CisjZGVmaW5lIE1BUktFUl9UTFZfVEVSTUlOQVRPUiAwICAgICAgICAgICAgICAgIC8qIG1hcmtlciB0ZXJtaW5hdG9yICovCisjZGVmaW5lIE1BUktFUl9UTFZfSU5GTyAgICAgICAxCSAgICAgICAgICAgICAgIC8qIG1hcmtlciBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBNQVJLRVJfVExWX1JFU1BPTlNFICAgMgkgICAgICAgICAgICAgICAvKiBtYXJrZXIgcmVzcG9uc2UgaW5mb3JtYXRpb24gKi8KKwl1aW50OF90ICBtYXJrZXJfbGVuZ3RoOyAgICAgICAgICAgICAgICAvKiA9IDB4MTYgKi8KKwl1aW50MTZfdCByZXF1ZXN0ZXJfcG9ydDsJICAgICAgIC8qIFRoZSBudW1iZXIgYXNzaWduZWQgdG8gdGhlIHBvcnQgYnkgdGhlIHJlcXVlc3RlciAqLworCXVpbnQ4X3QgIHJlcXVlc3Rlcl9zeXN0ZW1bRVRIX0FMRU5dOyAgIC8qIFRoZSByZXF1ZXN0ZXIncyBzeXN0ZW0gaWQgKi8KKwl1aW50MzJfdCByZXF1ZXN0ZXJfdHJhbnNhY3Rpb25faWQ7ICAgICAvKiBUaGUgdHJhbnNhY3Rpb24gaWQgYWxsb2NhdGVkIGJ5IHRoZSByZXF1ZXN0ZXIsICovCisJdWludDE2X3QgcGFkOwkJICAgICAgICAgICAgICAgLyogPSAwICovCisJdWludDhfdCAgdGx2X3R5cGVfdGVybWluYXRvcjsJICAgICAgIC8qID0gMHgwMCAqLworCXVpbnQ4X3QgIHRlcm1pbmF0b3JfbGVuZ3RoOwkgICAgICAgLyogPSAweDAwICovCisJdWludDhfdCAgcmVzZXJ2ZWRfOTBbOTBdOwkgICAgICAgLyogPSAwICovCit9IFBBQ0tFRDsKKwordW5pb24gc2xvd191bmlvbiB7CisJc3RydWN0IHNsb3dfaGVhZGVyIGhlYWRlcjsKKwlzdHJ1Y3Qgc2xvd19sYWNwIGxhY3A7CisJc3RydWN0IHNsb3dfbWFya2VyIG1hcmtlcjsKK307CisKKyNkZWZpbmUgRkFTVF9QRVJJT0RJQ19USU1FICAgKDEqVElDS1NfUEVSX1NFQykKKyNkZWZpbmUgU0xPV19QRVJJT0RJQ19USU1FICAgKDMwKlRJQ0tTX1BFUl9TRUMpCisjZGVmaW5lIFNIT1JUX1RJTUVPVVRfVElNRSAgICgzKkZBU1RfUEVSSU9ESUNfVElNRSkKKyNkZWZpbmUgTE9OR19USU1FT1VUX1RJTUUgICAgKDMqU0xPV19QRVJJT0RJQ19USU1FKQorI2RlZmluZSBDSFVSTl9ERVRFQ1RJT05fVElNRSAoNjAqVElDS1NfUEVSX1NFQykKKyNkZWZpbmUgQUdHUkVHQVRFX1dBSVRfVElNRSAgKDIqVElDS1NfUEVSX1NFQykKKworI2RlZmluZSBMQUNQX0FDVElWSVRZICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBMQUNQX1RJTUVPVVQgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBMQUNQX0FHR1JFR0FUSU9OICAgICAoMSA8PCAyKQorI2RlZmluZSBMQUNQX1NZTkNIUk9OSVpBVElPTiAoMSA8PCAzKQorI2RlZmluZSBMQUNQX0NPTExFQ1RJTkcgICAgICAoMSA8PCA0KQorI2RlZmluZSBMQUNQX0RJU1RSSUJVVElORyAgICAoMSA8PCA1KQorI2RlZmluZSBMQUNQX0RFRkFVTFRFRCAgICAgICAoMSA8PCA2KQorI2RlZmluZSBMQUNQX0VYUElSRUQgICAgICAgICAoMSA8PCA3KQorCisjZGVmaW5lIFVOU0VMRUNURUQgMAorI2RlZmluZSBTVEFOREJZICAgIDEKKyNkZWZpbmUgU0VMRUNURUQgICAyCisKKworc3RydWN0IGxhY3Bfc3RhdGUgeworCXN0cnVjdCBzbG93X2xhY3AgcGt0OworCXVuc2lnbmVkIGxvbmcgY3VycmVudF93aGlsZV90aW1lcjsgLyogVGltZSB3aGVuIHRoZSBMQUNQIGluZm9ybWF0aW9uIGV4cGlyZXMgKi8KKwl1bnNpZ25lZCBsb25nIHBlcmlvZGljX3RpbWVyOyAvKiBUaW1lIHdoZW4gSSBuZWVkIHRvIHNlbmQgbXkgcGFydG5lciBhbiB1cGRhdGUgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgbGFjcF9zdGF0ZSBsYWNwOworCisKKyNpZiBMQUNQX0RFQlVHID4gMAorc3RhdGljIHZvaWQgcHJpbnRfbGFjcF9zdGF0ZSh1aW50OF90IHN0YXRlKQoreworCXByaW50ZigiJWhoeCIsIHN0YXRlKTsKKwlpZiAoc3RhdGUgJiBMQUNQX0FDVElWSVRZKSB7CisJCXByaW50ZigiIEFjdGl2aXR5Iik7CisJfQorCWlmIChzdGF0ZSAmIExBQ1BfVElNRU9VVCkgeworCQlwcmludGYoIiBUaW1lb3V0Iik7CisJfQorCWlmIChzdGF0ZSAmIExBQ1BfQUdHUkVHQVRJT04pIHsKKwkJcHJpbnRmKCIgQWdncmVnYXRpb24iKTsKKwl9CisJaWYgKHN0YXRlICYgTEFDUF9TWU5DSFJPTklaQVRJT04pIHsKKwkJcHJpbnRmKCIgU3luY3Jvbml6YXRpb24iKTsKKwl9CisJaWYgKHN0YXRlICYgTEFDUF9DT0xMRUNUSU5HKSB7CisJCXByaW50ZigiIENvbGxlY3RpbmciKTsKKwl9CisJaWYgKHN0YXRlICYgTEFDUF9ESVNUUklCVVRJTkcpIHsKKwkJcHJpbnRmKCIgRGlzdHJpYnV0aW5nIik7CisJfQorCWlmIChzdGF0ZSAmIExBQ1BfREVGQVVMVEVEKSB7CisJCXByaW50ZigiIERlZmF1bHRlZCIpOworCX0KKwlpZiAoc3RhdGUgJiBMQUNQX0VYUElSRUQpIHsKKwkJcHJpbnRmKCIgRXhwaXJlZCIpOworCX0KKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9sYWNwZHUoc3RydWN0IHNsb3dfbGFjcCAqcGt0KQoreworCXByaW50Zigic3VidHlwZSB2ZXJzaW9uOiAgJWhoeCAlaGh4XG4iLCAKKwkJcGt0LT5zdWJ0eXBlLCBwa3QtPnZlcnNpb25fbnVtYmVyKTsKKwlwcmludGYoImFjdG9yX3RsdiAlaGh4IiwgcGt0LT50bHZfdHlwZV9hY3Rvcl9pbmZvKTsKKwlwcmludGYoIiBsZW46ICVoaHggKFxuIiwgcGt0LT5hY3Rvcl9pbmZvcm1hdGlvbl9sZW5ndGgpOworCXByaW50ZigiIHN5c19wcmk6ICVoeCIsIG50b2hzKHBrdC0+YWN0b3Iuc3lzdGVtX3ByaW9yaXR5KSk7CisJcHJpbnRmKCIgbWFjOiAlISIsIHBrdC0+YWN0b3Iuc3lzdGVtKTsKKwlwcmludGYoIiBrZXk6ICVoeCIsIG50b2hzKHBrdC0+YWN0b3Iua2V5KSk7CisJcHJpbnRmKCIgcG9ydF9wcmk6ICVoeCIsIG50b2hzKHBrdC0+YWN0b3IucG9ydF9wcmlvcml0eSkpOworCXByaW50ZigiIHBvcnQ6ICVoeFxuIiwgbnRvaHMocGt0LT5hY3Rvci5wb3J0KSk7CisJcHJpbnRmKCIgc3RhdGU6ICIpOworCXByaW50X2xhY3Bfc3RhdGUocGt0LT5hY3Rvci5zdGF0ZSk7CisjaWYgTEFDUF9ERUJVRyA+IDEKKwlwcmludGYoIiByZXNlcnZlZDogICAgICVoaHggJWhoeCAlaGh4XG4iLAorCQlwa3QtPmFjdG9yLnJlc2VydmVkWzBdLCBwa3QtPmFjdG9yLnJlc2VydmVkWzFdLCBwa3QtPmFjdG9yLnJlc2VydmVkWzJdKTsKKyNlbmRpZgorCXByaW50ZigiKVxuIik7CisJcHJpbnRmKCJwYXJ0bmVyX3RsdjogJWhoeCIsIHBrdC0+dGx2X3R5cGVfcGFydG5lcl9pbmZvKTsKKwlwcmludGYoIiBsZW46ICVoaHggKFxuIiwgcGt0LT5wYXJ0bmVyX2luZm9ybWF0aW9uX2xlbmd0aCk7CisJcHJpbnRmKCIgc3lzX3ByaTogJWh4IiwgbnRvaHMocGt0LT5wYXJ0bmVyLnN5c3RlbV9wcmlvcml0eSkpOworCXByaW50ZigiIG1hYzogJSEiLCBwa3QtPnBhcnRuZXIuc3lzdGVtKTsKKwlwcmludGYoIiBrZXk6ICVoeCIsIG50b2hzKHBrdC0+cGFydG5lci5rZXkpKTsKKwlwcmludGYoIiBwb3J0X3ByaTogJWh4IiwgbnRvaHMocGt0LT5wYXJ0bmVyLnBvcnRfcHJpb3JpdHkpKTsKKwlwcmludGYoIiBwb3J0OiAlaHhcbiIsIG50b2hzKHBrdC0+cGFydG5lci5wb3J0KSk7CisJcHJpbnRmKCIgc3RhdGU6ICIpOworCXByaW50X2xhY3Bfc3RhdGUocGt0LT5wYXJ0bmVyLnN0YXRlKTsKKyNpZiBMQUNQX0RFQlVHID4gMQorCXByaW50ZigiIHJlc2VydmVkOiAgICAgJWhoeCAlaGh4ICVoaHhcbiIsCisJCXBrdC0+cGFydG5lci5yZXNlcnZlZFswXSwgcGt0LT5wYXJ0bmVyLnJlc2VydmVkWzFdLCBwa3QtPnBhcnRuZXIucmVzZXJ2ZWRbMl0pOworI2VuZGlmCisJcHJpbnRmKCIpXG4iKTsKKwlwcmludGYoImNvbGxlY3Rvcl90bHY6ICVoaHggIiwgcGt0LT50bHZfdHlwZV9jb2xsZWN0b3JfaW5mbyk7CisJcHJpbnRmKCIgbGVuOiAlaGh4ICgiLCBwa3QtPmNvbGxlY3Rvcl9pbmZvcm1hdGlvbl9sZW5ndGgpOworCXByaW50ZigiIG1heF9kZWxheTogJWh4IiwgbnRvaHMocGt0LT5jb2xsZWN0b3JfbWF4X2RlbGF5KSk7CisjaWYgTEFDUF9ERUJVRyA+IDEKKwlwcmludGYoInJlc2VydmVkXzEyOiAgICAgICVoaHggJWhoeCAlaGh4ICVoaHggJWhoeCAlaGh4ICVoaHggJWhoeCAlaGh4ICVoaHggJWhoeCAlaGh4XG4iLAorCQlwa3QtPnJlc2VydmVkXzEyWzBdLCBwa3QtPnJlc2VydmVkXzEyWzFdLCBwa3QtPnJlc2VydmVkXzEyWzJdLCAKKwkJcGt0LT5yZXNlcnZlZF8xMlszXSwgcGt0LT5yZXNlcnZlZF8xMls0XSwgcGt0LT5yZXNlcnZlZF8xMls1XSwgCisJCXBrdC0+cmVzZXJ2ZWRfMTJbNl0sIHBrdC0+cmVzZXJ2ZWRfMTJbN10sIHBrdC0+cmVzZXJ2ZWRfMTJbOF0sIAorCQlwa3QtPnJlc2VydmVkXzEyWzldLCBwa3QtPnJlc2VydmVkXzEyWzEwXSwgcGt0LT5yZXNlcnZlZF8xMlsxMV0pOworI2VuZGlmCisJcHJpbnRmKCIgKVxuIik7CisJcHJpbnRmKCJ0ZXJtaW5hdG9yX3RsdjogJWhoeCIsIHBrdC0+dGx2X3R5cGVfdGVybWluYXRvcik7CisJcHJpbnRmKCIgbGVuOiAlaGh4ICgpXG4iLCBwa3QtPnRlcm1pbmF0b3JfbGVuZ3RoKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxhY3BfdGltZXJfdmFsKHVuc2lnbmVkIGxvbmcgbm93LCB1bnNpZ25lZCBsb25nIHdoZW4pCit7CisJcmV0dXJuIHdoZW4/KHdoZW4gLSBub3cpL1RJQ0tTX1BFUl9TRUMgOiAwOworfQorc3RhdGljIHZvaWQgcHJpbnRfbGFjcChjb25zdCBjaGFyICp3aGljaCwgc3RydWN0IHNsb3dfbGFjcCAqcGt0LCB1bnNpZ25lZCBsb25nIG5vdykKK3sKKwlwcmludGYoIiVzXG4iLCB3aGljaCk7CisJcHJpbnRfbGFjcGR1KHBrdCk7CisJcHJpbnRmKCJ0aW1lcnM6IGMgJWRzIHAgJWRzXG4iLAorCQlsYWNwX3RpbWVyX3ZhbChub3csIGxhY3AuY3VycmVudF93aGlsZV90aW1lciksCisJCWxhY3BfdGltZXJfdmFsKG5vdywgbGFjcC5wZXJpb2RpY190aW1lcikKKwkJKTsKKwlwcmludGYoIlxuIik7Cit9CisjZWxzZSAvKiBMQUNQX0RFQlVHICovCisjZGVmaW5lIHByaW50X2xhY3Aod2hpY2gsIHBrdCwgbm93KSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmIC8qIExBQ1BfREVCVUcgKi8KKworc3RhdGljIHZvaWQgbGFjcF9pbml0X3N0YXRlKGNvbnN0IHVpbnQ4X3QgKm1hYykKK3sKKwltZW1zZXQoJmxhY3AsIDAsIHNpemVvZihsYWNwKSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwYWNrZXQgY29uc3RhbnRzICovCisJbGFjcC5wa3Quc3VidHlwZSAgICAgICAgICAgICAgID0gMTsKKwlsYWNwLnBrdC52ZXJzaW9uX251bWJlciAgICAgICAgPSAxOworCisKKwkvKiBUaGUgZGVmYXVsdCBzdGF0ZSBvZiBteSBpbnRlcmZhY2UgKi8KKwlsYWNwLnBrdC50bHZfdHlwZV9hY3Rvcl9pbmZvICAgICAgPSBMQUNQX1RMVl9BQ1RPUjsKKwlsYWNwLnBrdC5hY3Rvcl9pbmZvcm1hdGlvbl9sZW5ndGggPSAweDE0OworCWxhY3AucGt0LmFjdG9yLnN5c3RlbV9wcmlvcml0eSAgICA9IGh0b25zKDEpOworCW1lbWNweShsYWNwLnBrdC5hY3Rvci5zeXN0ZW0sIG1hYywgRVRIX0FMRU4pOworCWxhY3AucGt0LmFjdG9yLmtleSAgICAgICAgICAgICAgICA9IGh0b25zKDEpOworCWxhY3AucGt0LmFjdG9yLnBvcnQgICAgICAgICAgICAgICA9IGh0b25zKDEpOworCWxhY3AucGt0LmFjdG9yLnBvcnRfcHJpb3JpdHkgICAgICA9IGh0b25zKDEpOworCWxhY3AucGt0LmFjdG9yLnN0YXRlID0gCisJCUxBQ1BfU1lOQ0hST05JWkFUSU9OIHwKKwkJTEFDUF9DT0xMRUNUSU5HICAgICAgfAorCQlMQUNQX0RJU1RSSUJVVElORyAgICB8CisJCUxBQ1BfREVGQVVMVEVEOworCisJLyogU2V0IG15IHBhcnRuZXIgZGVmYXVsdHMgKi8KKwlsYWNwLnBrdC50bHZfdHlwZV9wYXJ0bmVyX2luZm8gICAgICA9IExBQ1BfVExWX1BBUlRORVI7CisJbGFjcC5wa3QucGFydG5lcl9pbmZvcm1hdGlvbl9sZW5ndGggPSAweDE0OworCWxhY3AucGt0LnBhcnRuZXIuc3lzdGVtX3ByaW9yaXR5ICAgID0gaHRvbnMoMSk7CisJLyogbWVtc2V0KGxhY3AucGt0LnBhcm50ZXJfc3lzdGVtLCAwLCBFVEhfQUxFTik7ICovCisJbGFjcC5wa3QucGFydG5lci5rZXkgICAgICAgICAgICAgICAgPSBodG9ucygxKTsKKwlsYWNwLnBrdC5wYXJ0bmVyLnBvcnQgICAgICAgICAgICAgICA9IGh0b25zKDEpOworCWxhY3AucGt0LnBhcnRuZXIucG9ydF9wcmlvcml0eSAgICAgID0gaHRvbnMoMSk7CisJbGFjcC5wa3QucGFydG5lci5zdGF0ZSA9CisJCUxBQ1BfQUNUSVZJVFkgICAgICAgIHwKKwkJTEFDUF9TWU5DSFJPTklaQVRJT04gfAorCQlMQUNQX0NPTExFQ1RJTkcgICAgICB8CisJCUxBQ1BfRElTVFJJQlVUSU5HICAgIHwKKwkJTEFDUF9ERUZBVUxURUQ7CisKKwlsYWNwLnBrdC50bHZfdHlwZV9jb2xsZWN0b3JfaW5mbyAgICAgID0gTEFDUF9UTFZfQ09MTEVDVE9SOworCWxhY3AucGt0LmNvbGxlY3Rvcl9pbmZvcm1hdGlvbl9sZW5ndGggPSAweDEwOworCWxhY3AucGt0LmNvbGxlY3Rvcl9tYXhfZGVsYXkgICAgICAgICAgPSBodG9ucygweDgwMDApOyAvKiA/Pz8/ICovCisKKwlsYWNwLnBrdC50bHZfdHlwZV90ZXJtaW5hdG9yICAgICAgICAgID0gTEFDUF9UTFZfVEVSTUlOQVRPUjsKKwlsYWNwLnBrdC50ZXJtaW5hdG9yX2xlbmd0aCAgICAgICAgICAgID0gMDsKK30KKworI2RlZmluZSBMQUNQX05UVF9NQVNLIChMQUNQX0FDVElWSVRZIHwgTEFDUF9USU1FT1VUIHwgXAorCUxBQ1BfU1lOQ0hST05JWkFUSU9OIHwgTEFDUF9BR0dSRUdBVElPTikKKworc3RhdGljIGlubGluZSBpbnQgbGFjcF91cGRhdGVfbnR0KHN0cnVjdCBzbG93X2xhY3AgKnBrdCkKK3sKKwlpbnQgbnR0ID0gMDsKKwlpZiAoKG1lbWNtcCgmcGt0LT5wYXJ0bmVyLCAmbGFjcC5wa3QuYWN0b3IsIExBQ1BfQ01QX0xFTikgIT0gMCkgfHwKKwkJKChwa3QtPnBhcnRuZXIuc3RhdGUgJiBMQUNQX05UVF9NQVNLKSAhPSAKKwkJCShsYWNwLnBrdC5hY3Rvci5zdGF0ZSAmIExBQ1BfTlRUX01BU0spKSkKKwl7CisJCW50dCA9IDE7CisJfQorCXJldHVybiBudHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYWNwX3JlY29yZF9wZHUoc3RydWN0IHNsb3dfbGFjcCAqcGt0KQoreworCW1lbWNweSgmbGFjcC5wa3QucGFydG5lciwgJnBrdC0+YWN0b3IsIExBQ1BfQ1BfTEVOKTsKKworCWxhY3AucGt0LmFjdG9yLnN0YXRlICY9IH5MQUNQX0RFRkFVTFRFRDsKKwlsYWNwLnBrdC5wYXJ0bmVyLnN0YXRlICY9IH5MQUNQX1NZTkNIUk9OSVpBVElPTjsKKwlpZiAoKG1lbWNtcCgmcGt0LT5wYXJ0bmVyLCAmbGFjcC5wa3QuYWN0b3IsIExBQ1BfQ01QX0xFTikgPT0gMCkgJiYKKwkJKChwa3QtPnBhcnRuZXIuc3RhdGUgJiBMQUNQX0FHR1JFR0FUSU9OKSA9PQorCQkJKGxhY3AucGt0LmFjdG9yLnN0YXRlICYgTEFDUF9BR0dSRUdBVElPTikpKQorCXsKKwkJbGFjcC5wa3QucGFydG5lci5zdGF0ZSAgfD0gTEFDUF9TWU5DSFJPTklaQVRJT047CisJfQorCWlmICghKHBrdC0+YWN0b3Iuc3RhdGUgJiBMQUNQX0FHR1JFR0FUSU9OKSkgeworCQlsYWNwLnBrdC5wYXJ0bmVyLnN0YXRlIHw9IExBQ1BfU1lOQ0hST05JWkFUSU9OOworCX0KKworCS8qIEFDVElWSVRZPyAqLworfQorCitzdGF0aWMgaW5saW5lIGludCBsYWNwX3RpbWVyX2V4cGlyZWQodW5zaWduZWQgbG9uZyBub3csIHVuc2lnbmVkIGxvbmcgd2hlbikKK3sKKwlyZXR1cm4gd2hlbiAmJiAobm93ID4gd2hlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYWNwX3N0YXJ0X3BlcmlvZGljX3RpbWVyKHVuc2lnbmVkIGxvbmcgbm93KQoreworCWlmICgobGFjcC5wa3QucGFydG5lci5zdGF0ZSAmIExBQ1BfQUNUSVZJVFkpIHx8CisJCShsYWNwLnBrdC5hY3Rvci5zdGF0ZSAmIExBQ1BfQUNUSVZJVFkpKSB7CisJCWxhY3AucGVyaW9kaWNfdGltZXIgPSBub3cgKworCQkJKCgobGFjcC5wa3QucGFydG5lci5zdGF0ZSAmIExBQ1BfVElNRU9VVCk/CisJCQkJRkFTVF9QRVJJT0RJQ19USU1FIDogU0xPV19QRVJJT0RJQ19USU1FKSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGFjcF9zdGFydF9jdXJyZW50X3doaWxlX3RpbWVyKHVuc2lnbmVkIGxvbmcgbm93KQoreworCWxhY3AuY3VycmVudF93aGlsZV90aW1lciA9IG5vdyArCisJCSgobGFjcC5wa3QuYWN0b3Iuc3RhdGUgJiBMQUNQX1RJTUVPVVQpID8KKwkJU0hPUlRfVElNRU9VVF9USU1FIDogTE9OR19USU1FT1VUX1RJTUUpOworCisJbGFjcC5wa3QuYWN0b3Iuc3RhdGUgJj0gfkxBQ1BfRVhQSVJFRDsKK30KKworc3RhdGljIHZvaWQgc2VuZF9sYWNwX3JlcG9ydHModW5zaWduZWQgbG9uZyBub3csIGludCBudHQpCit7CisJaWYgKG1lbWNtcChuaWMubm9kZV9hZGRyLCBsYWNwLnBrdC5hY3Rvci5zeXN0ZW0sIEVUSF9BTEVOKSAhPSAwKSB7CisJCWxhY3BfaW5pdF9zdGF0ZShuaWMubm9kZV9hZGRyKTsKKwl9CisJLyogSWYgdGhlIHJlbW90ZSBpbmZvcm1hdGlvbiBoYXMgZXhwaXJlZCBJIG5lZWQgdG8gdGFrZSBhY3Rpb24gKi8KKwlpZiAobGFjcF90aW1lcl9leHBpcmVkKG5vdywgbGFjcC5jdXJyZW50X3doaWxlX3RpbWVyKSkgeworCQlpZiAoIShsYWNwLnBrdC5hY3Rvci5zdGF0ZSAmIExBQ1BfRVhQSVJFRCkpIHsKKwkJCWxhY3AucGt0LnBhcnRuZXIuc3RhdGUgJj0gfkxBQ1BfU1lOQ0hST05JWkFUSU9OOworCQkJbGFjcC5wa3QucGFydG5lci5zdGF0ZSB8PSBMQUNQX1RJTUVPVVQ7CisJCQlsYWNwLnBrdC5hY3Rvci5zdGF0ZSB8PSBMQUNQX0VYUElSRUQ7CisJCQlsYWNwLmN1cnJlbnRfd2hpbGVfdGltZXIgPSBub3cgKyBTSE9SVF9USU1FT1VUX1RJTUU7CisJCQludHQgPSAxOworCQl9CisJCWVsc2UgeworCQkJbGFjcF9pbml0X3N0YXRlKG5pYy5ub2RlX2FkZHIpOworCQl9CisJfQorCS8qIElmIHRoZSBwZXJpb2RpYyB0aW1lciBoYXMgZXhwaXJlZCBJIG5lZWQgdG8gdHJhbnNtaXQgKi8KKwlpZiAobGFjcF90aW1lcl9leHBpcmVkKG5vdywgbGFjcC5wZXJpb2RpY190aW1lcikpIHsKKwkJbnR0ID0gMTsKKwkJLyogUmVzZXQgYnkgbGFjcF9zdGFydF9wZXJpb2RpY190aW1lciAqLworCX0KKwlpZiAobnR0KSB7CisJCWV0aF90cmFuc21pdChzbG93X2Rlc3QsIEVUSF9QX1NMT1csIHNpemVvZihsYWNwLnBrdCksICZsYWNwLnBrdCk7CisKKwkJLyogUmVzdGFydCB0aGUgcGVyaW9kaWMgdGltZXIgKi8KKwkJbGFjcF9zdGFydF9wZXJpb2RpY190aW1lcihub3cpOworCisJCXByaW50X2xhY3AoIlRyYXNtaXR0ZWQiLCAmbGFjcC5wa3QsIG5vdyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9ldGhfc2xvd19yZXBvcnRzKHVuc2lnbmVkIGxvbmcgbm93KQoreworCXNlbmRfbGFjcF9yZXBvcnRzKG5vdywgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX2V0aF9zbG93KHVuc2lnbmVkIHNob3J0IHB0eXBlLCB1bnNpZ25lZCBsb25nIG5vdykKK3sKKwl1bmlvbiBzbG93X3VuaW9uICpwa3Q7CisJaWYgKChwdHlwZSAhPSBFVEhfUF9TTE9XKSB8fCAKKwkJKG5pYy5wYWNrZXRsZW4gPCAoRVRIX0hMRU4gKyBzaXplb2YocGt0LT5oZWFkZXIpKSkpIHsKKwkJcmV0dXJuOworCX0KKwlwa3QgPSAodW5pb24gc2xvd191bmlvbiAqKSZuaWMucGFja2V0W0VUSF9ITEVOXTsKKwlpZiAoKHBrdC0+aGVhZGVyLnN1YnR5cGUgPT0gU0xPV19TVUJUWVBFX0xBQ1ApICYmCisJCShuaWMucGFja2V0bGVuID49IEVUSF9ITEVOICsgc2l6ZW9mKHBrdC0+bGFjcCkpKSB7CisJCWludCBudHQ7CisJCWlmIChtZW1jbXAobmljLm5vZGVfYWRkciwgbGFjcC5wa3QuYWN0b3Iuc3lzdGVtLCBFVEhfQUxFTikgIT0gMCkgeworCQkJbGFjcF9pbml0X3N0YXRlKG5pYy5ub2RlX2FkZHIpOworCQl9CisJCS8qIEFzIGxvbmcgYXMgbmljLnBhY2tldCBpcyAyIGJ5dGUgYWxpZ25lZCBhbGwgaXMgZ29vZCAqLworCQlwcmludF9sYWNwKCJSZWNlaXZlZCIsICZwa3QtPmxhY3AsIG5vdyk7CisJCS8qIEkgZG9uJ3QgYWN0dWFsbHkgaW1wbGVtZW50IHRoZSBNVVggb3IgU0VMRUNUCisJCSAqIG1hY2hpbmVzLiAgCisJCSAqCisJCSAqIFdoYXQgbG9naWNhbGx5IGhhcHBlbnMgd2hlbiB0aGUgY2xpZW50IGFuZCBJCisJCSAqIGRpc2FncmVlIGFib3V0IGFuIGFnZ3JlZ2F0b3IgaXMgdGhlIGN1cnJlbnQKKwkJICogYWdncmVndGF0b3IgaXMgdW5zZWxlY3RlZC4gIFRoZSBNVVggbWFjaGluZSBwbGFjZXMKKwkJICogbWUgaW4gREVUQUNIRUQuICBUaGUgU0VMRUNUIG1hY2hpbmUgcnVucyBhbmQKKwkJICogcmVzbGVjdHMgdGhlIHNhbWUgYWdncmVnYXRvci4gIElmIEkgZ28gdGhyb3VnaAorCQkgKiB0aGVzZSBzdGVwcyBmYXN0IGVub3VnaCBhbiBvdXRzaWRlIG9ic2VydmVyIGNhbiBub3QKKwkJICogbm90aWNlIHRoaXMuICAKKwkJICoKKwkJICogU2luY2UgdGhlIHByb2Nlc3Mgd2lsbCBub3QgZ2VuZXJhdGUgYW55IG5vdGljZWFibGUKKwkJICogZWZmZWN0IGl0IGRvZXMgbm90IG5lZWQgYW4gaW1wbG1lbmV0YXRpb24uICBUaGlzCisJCSAqIGtlZXBzIHRoZSBjb2RlIHNpbXBsZSBhbmQgdGhlIGNvZGUgYW5kIGJpbmFyeQorCQkgKiBzaXplIGRvd24uCisJCSAqLworCQkvKiBsYWNwX3VwZGF0ZV9zZWxlY3RlZCgmcGt0LT5sYWNwKTsgKi8KKwkJbnR0ID0gbGFjcF91cGRhdGVfbnR0KCZwa3QtPmxhY3ApOworCQlsYWNwX3JlY29yZF9wZHUoJnBrdC0+bGFjcCk7CisJCWxhY3Bfc3RhcnRfY3VycmVudF93aGlsZV90aW1lcihub3cpOworCQlzZW5kX2xhY3BfcmVwb3J0cyhub3csIG50dCk7CisJfQorCS8qIElmIHdlIHJlY2VpdmUgYSBtYXJrZXIgaW5mb3JtYXRpb24gcGFja2V0IHJldHVybiBpdCAqLworCWVsc2UgaWYgKChwa3QtPmhlYWRlci5zdWJ0eXBlID09IFNMT1dfU1VCVFlQRV9NQVJLRVIpICYmCisJCShuaWMucGFja2V0bGVuID49IEVUSF9ITEVOICsgc2l6ZW9mKHBrdC0+bWFya2VyKSkgJiYKKwkJKHBrdC0+bWFya2VyLnRsdl90eXBlID09IE1BUktFUl9UTFZfSU5GTykgJiYKKwkJKHBrdC0+bWFya2VyLm1hcmtlcl9sZW5ndGggPT0gMHgxNikpIAorCXsKKwkJcGt0LT5tYXJrZXIudGx2X3R5cGUgPSBNQVJLRVJfVExWX1JFU1BPTlNFOworCQlldGhfdHJhbnNtaXQoc2xvd19kZXN0LCBFVEhfUF9TTE9XLCAKKwkJCXNpemVvZihwa3QtPm1hcmtlciksICZwa3QtPm1hcmtlcik7CisJfQorCisgfQorI2Vsc2UKKworI2RlZmluZSBzZW5kX2V0aF9zbG93X3JlcG9ydHMobm93KSAgICBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBwcm9jZXNzX2V0aF9zbG93KHB0eXBlLCBub3cpICBkbyB7fSB3aGlsZSgwKQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL3JhbmRvbS5jIGIvZ3B4ZS9zcmMvY29yZS9yYW5kb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTczNzRlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9yYW5kb20uYwpAQCAtMCwwICsxLDQxIEBACisvKiogQGZpbGUKKyAqCisgKiBSYW5kb20gbnVtYmVyIGdlbmVyYXRpb24KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorCitzdGF0aWMgaW50MzJfdCBybmRfc2VlZCA9IDA7CisKKy8qKgorICogU2VlZCB0aGUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgKgorICogQHYgc2VlZAkJU2VlZCB2YWx1ZQorICovCit2b2lkIHNyYW5kb20gKCB1bnNpZ25lZCBpbnQgc2VlZCApIHsKKwlybmRfc2VlZCA9IHNlZWQ7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBwc2V1ZG8tcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIDIxNDc0ODM2NDdMIG9yIDIxNDc0ODM1NjI/CisgKgorICogQHJldCByYW5kCQlQc2V1ZG8tcmFuZG9tIG51bWJlcgorICovCitsb25nIGludCByYW5kb20gKCB2b2lkICkgeworCWludDMyX3QgcTsKKworCWlmICggISBybmRfc2VlZCApIC8qIEluaXRpYWxpemUgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgKi8KKwkJc3JhbmRvbSAoIGN1cnJ0aWNrcygpICk7CisKKwkvKiBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIExDRyBnaXZlbiBpbiBCcnVjZSBTY2huZWllcidzCisJICAgIkFwcGxpZWQgQ3J5cHRvZ3JhcGh5IiAqLworCXEgPSAoIHJuZF9zZWVkIC8gNTM2NjggKTsKKwlybmRfc2VlZCA9ICggNDAwMTQgKiAoIHJuZF9zZWVkIC0gNTM2NjggKiBxICkgLSAxMjIxMSAqIHEgKTsKKwlpZiAoIHJuZF9zZWVkIDwgMCApCisJCXJuZF9zZWVkICs9IDIxNDc0ODM1NjNMOworCXJldHVybiBybmRfc2VlZDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvcmVmY250LmMgYi9ncHhlL3NyYy9jb3JlL3JlZmNudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjg2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL3JlZmNudC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxncHhlL3JlZmNudC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBSZWZlcmVuY2UgY291bnRpbmcKKyAqCisgKi8KKworLyoqCisgKiBJbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50CisgKgorICogQHYgcmVmY250CQlSZWZlcmVuY2UgY291bnRlciwgb3IgTlVMTAorICogQHJldCByZWZjbnQJCVJlZmVyZW5jZSBjb3VudGVyCisgKgorICogSWYgQGMgcmVmY250IGlzIE5VTEwsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAqLworc3RydWN0IHJlZmNudCAqIHJlZl9nZXQgKCBzdHJ1Y3QgcmVmY250ICpyZWZjbnQgKSB7CisKKwlpZiAoIHJlZmNudCApIHsKKwkJcmVmY250LT5yZWZjbnQrKzsKKwkJREJHQzIgKCByZWZjbnQsICJSRUZDTlQgJXAgaW5jcmVtZW50ZWQgdG8gJWRcbiIsCisJCQlyZWZjbnQsIHJlZmNudC0+cmVmY250ICk7CisJfQorCXJldHVybiByZWZjbnQ7Cit9CisKKy8qKgorICogRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudAorICoKKyAqIEB2IHJlZmNudAkJUmVmZXJlbmNlIGNvdW50ZXIsIG9yIE5VTEwKKyAqCisgKiBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IGRlY3JlYXNlcyBiZWxvdyB6ZXJvLCB0aGUgb2JqZWN0J3MgZnJlZSgpCisgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCisgKgorICogSWYgQGMgcmVmY250IGlzIE5VTEwsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAqLwordm9pZCByZWZfcHV0ICggc3RydWN0IHJlZmNudCAqcmVmY250ICkgeworCisJaWYgKCAhIHJlZmNudCApCisJCXJldHVybjsKKworCXJlZmNudC0+cmVmY250LS07CisJREJHQzIgKCByZWZjbnQsICJSRUZDTlQgJXAgZGVjcmVtZW50ZWQgdG8gJWRcbiIsCisJCXJlZmNudCwgcmVmY250LT5yZWZjbnQgKTsKKworCWlmICggcmVmY250LT5yZWZjbnQgPj0gMCApCisJCXJldHVybjsKKworCWlmICggcmVmY250LT5mcmVlICkgeworCQlEQkdDICggcmVmY250LCAiUkVGQ05UICVwIGJlaW5nIGZyZWVkIHZpYSBtZXRob2QgJXBcbiIsCisJCSAgICAgICByZWZjbnQsIHJlZmNudC0+ZnJlZSApOworCQlyZWZjbnQtPmZyZWUgKCByZWZjbnQgKTsKKwl9IGVsc2UgeworCQlEQkdDICggcmVmY250LCAiUkVGQ05UICVwIGJlaW5nIGZyZWVkXG4iLCByZWZjbnQgKTsKKwkJZnJlZSAoIHJlZmNudCApOworCX0KK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvcmVzb2x2LmMgYi9ncHhlL3NyYy9jb3JlL3Jlc29sdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDFmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL3Jlc29sdi5jCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9yZXNvbHYuaD4KKworLyoqIEBmaWxlCisgKgorICogTmFtZSByZXNvbHV0aW9uCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIE5hbWUgcmVzb2x1dGlvbiBjb21wbGV0ZWQKKyAqCisgKiBAdiByZXNvbHYJCU5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2UKKyAqIEB2IHNhCQlDb21wbGV0ZWQgc29ja2V0IGFkZHJlc3MgKGlmIHN1Y2Nlc3NmdWwpCisgKiBAdiByYwkJRmluYWwgc3RhdHVzIGNvZGUKKyAqLwordm9pZCByZXNvbHZfZG9uZSAoIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlICpyZXNvbHYsIHN0cnVjdCBzb2NrYWRkciAqc2EsCisJCSAgIGludCByYyApIHsKKwlzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSAqZGVzdCA9IHJlc29sdl9nZXRfZGVzdCAoIHJlc29sdiApOworCisJcmVzb2x2X3VucGx1ZyAoIHJlc29sdiApOworCWRlc3QtPm9wLT5kb25lICggZGVzdCwgc2EsIHJjICk7CisJcmVzb2x2X3B1dCAoIGRlc3QgKTsKK30KKworLyoqCisgKiBJZ25vcmUgbmFtZSByZXNvbHV0aW9uIGRvbmUoKSBldmVudAorICoKKyAqIEB2IHJlc29sdgkJTmFtZSByZXNvbHV0aW9uIGludGVyZmFjZQorICogQHYgc2EJCUNvbXBsZXRlZCBzb2NrZXQgYWRkcmVzcyAoaWYgc3VjY2Vzc2Z1bCkKKyAqIEB2IHJjCQlGaW5hbCBzdGF0dXMgY29kZQorICovCit2b2lkIGlnbm9yZV9yZXNvbHZfZG9uZSAoIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlICpyZXNvbHYgX191bnVzZWQsCisJCQkgIHN0cnVjdCBzb2NrYWRkciAqc2EgX191bnVzZWQsIGludCByYyBfX3VudXNlZCApIHsKKwkvKiBEbyBub3RoaW5nICovCit9CisKKy8qKiBOdWxsIG5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2Ugb3BlcmF0aW9ucyAqLworc3RydWN0IHJlc29sdl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBudWxsX3Jlc29sdl9vcHMgPSB7CisJLmRvbmUJCT0gaWdub3JlX3Jlc29sdl9kb25lLAorfTsKKworLyoqIE51bGwgbmFtZSByZXNvbHV0aW9uIGludGVyZmFjZSAqLworc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgbnVsbF9yZXNvbHYgPSB7CisJLmludGYgPSB7CisJCS5kZXN0ID0gJm51bGxfcmVzb2x2LmludGYsCisJCS5yZWZjbnQgPSBOVUxMLAorCX0sCisJLm9wID0gJm51bGxfcmVzb2x2X29wcywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOdW1lcmljIG5hbWUgcmVzb2x2ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIEEgbnVtZXJpYyBuYW1lIHJlc29sdmVyICovCitzdHJ1Y3QgbnVtZXJpY19yZXNvbHYgeworCS8qKiBSZWZlcmVuY2UgY291bnRlciAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCS8qKiBOYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlICovCisJc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgcmVzb2x2OworCS8qKiBQcm9jZXNzICovCisJc3RydWN0IHByb2Nlc3MgcHJvY2VzczsKKwkvKiogQ29tcGxldGVkIHNvY2tldCBhZGRyZXNzICovCisJc3RydWN0IHNvY2thZGRyIHNhOworCS8qKiBPdmVyYWxsIHN0YXR1cyBjb2RlICovCisJaW50IHJjOworfTsKKworc3RhdGljIHZvaWQgbnVtZXJpY19zdGVwICggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MgKSB7CisJc3RydWN0IG51bWVyaWNfcmVzb2x2ICpudW1lcmljID0KKwkJY29udGFpbmVyX29mICggcHJvY2Vzcywgc3RydWN0IG51bWVyaWNfcmVzb2x2LCBwcm9jZXNzICk7CisJCisJcmVzb2x2X2RvbmUgKCAmbnVtZXJpYy0+cmVzb2x2LCAmbnVtZXJpYy0+c2EsIG51bWVyaWMtPnJjICk7CisJcHJvY2Vzc19kZWwgKCBwcm9jZXNzICk7Cit9CisKK3N0YXRpYyBpbnQgbnVtZXJpY19yZXNvbHYgKCBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSAqcmVzb2x2LAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqc2EgKSB7CisJc3RydWN0IG51bWVyaWNfcmVzb2x2ICpudW1lcmljOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2Ugc3RydWN0dXJlICovCisJbnVtZXJpYyA9IHphbGxvYyAoIHNpemVvZiAoICpudW1lcmljICkgKTsKKwlpZiAoICEgbnVtZXJpYyApCisJCXJldHVybiAtRU5PTUVNOworCXJlc29sdl9pbml0ICggJm51bWVyaWMtPnJlc29sdiwgJm51bGxfcmVzb2x2X29wcywgJm51bWVyaWMtPnJlZmNudCApOworCXByb2Nlc3NfaW5pdCAoICZudW1lcmljLT5wcm9jZXNzLCBudW1lcmljX3N0ZXAsICZudW1lcmljLT5yZWZjbnQgKTsKKwltZW1jcHkgKCAmbnVtZXJpYy0+c2EsIHNhLCBzaXplb2YgKCBudW1lcmljLT5zYSApICk7CisKKwlEQkdDICggbnVtZXJpYywgIk5VTUVSSUMgJXAgYXR0ZW1wdGluZyB0byByZXNvbHZlIFwiJXNcIlxuIiwKKwkgICAgICAgbnVtZXJpYywgbmFtZSApOworCisJLyogQXR0ZW1wdCB0byByZXNvbHZlIG5hbWUgKi8KKwlzaW4gPSAoICggc3RydWN0IHNvY2thZGRyX2luICogKSAmbnVtZXJpYy0+c2EgKTsKKwlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWlmICggaW5ldF9hdG9uICggbmFtZSwgJnNpbi0+c2luX2FkZHIgKSA9PSAwICkKKwkJbnVtZXJpYy0+cmMgPSAtRUlOVkFMOworCisJLyogQXR0YWNoIHRvIHBhcmVudCBpbnRlcmZhY2UsIG1vcnRhbGlzZSBzZWxmLCBhbmQgcmV0dXJuICovCisJcmVzb2x2X3BsdWdfcGx1ZyAoICZudW1lcmljLT5yZXNvbHYsIHJlc29sdiApOworCXJlZl9wdXQgKCAmbnVtZXJpYy0+cmVmY250ICk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCByZXNvbHZlciBudW1lcmljX3Jlc29sdmVyIF9fcmVzb2x2ZXIgKCBSRVNPTFZfTlVNRVJJQyApID0geworCS5uYW1lID0gIk5VTUVSSUMiLAorCS5yZXNvbHYgPSBudW1lcmljX3Jlc29sdiwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lIHJlc29sdXRpb24gbXVsdGlwbGV4ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIEEgbmFtZSByZXNvbHV0aW9uIG11bHRpcGxleGVyICovCitzdHJ1Y3QgcmVzb2x2X211eCB7CisJLyoqIFJlZmVyZW5jZSBjb3VudGVyICovCisJc3RydWN0IHJlZmNudCByZWZjbnQ7CisJLyoqIFBhcmVudCBuYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlICovCisJc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgcGFyZW50OworCisJLyoqIENoaWxkIG5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSBjaGlsZDsKKwkvKiogQ3VycmVudCBjaGlsZCByZXNvbHZlciAqLworCXN0cnVjdCByZXNvbHZlciAqcmVzb2x2ZXI7CisKKwkvKiogU29ja2V0IGFkZHJlc3MgdG8gY29tcGxldGUgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgc2E7CisJLyoqIE5hbWUgdG8gYmUgcmVzb2x2ZWQKKwkgKgorCSAqIE11c3QgYmUgYXQgZW5kIG9mIHN0cnVjdHVyZQorCSAqLworCWNoYXIgbmFtZVswXTsKK307CisKKy8qKgorICogVHJ5IGN1cnJlbnQgY2hpbGQgbmFtZSByZXNvbHZlcgorICoKKyAqIEB2IG11eAkJTmFtZSByZXNvbHV0aW9uIG11bHRpcGxleGVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCByZXNvbHZfbXV4X3RyeSAoIHN0cnVjdCByZXNvbHZfbXV4ICptdXggKSB7CisJc3RydWN0IHJlc29sdmVyICpyZXNvbHZlciA9IG11eC0+cmVzb2x2ZXI7CisJaW50IHJjOworCisJREJHQyAoIG11eCwgIlJFU09MViAlcCB0cnlpbmcgbWV0aG9kICVzXG4iLCBtdXgsIHJlc29sdmVyLT5uYW1lICk7CisKKwlpZiAoICggcmMgPSByZXNvbHZlci0+cmVzb2x2ICggJm11eC0+Y2hpbGQsIG11eC0+bmFtZSwKKwkJCQkgICAgICAgJm11eC0+c2EgKSApICE9IDAgKSB7CisJCURCR0MgKCBtdXgsICJSRVNPTFYgJXAgY291bGQgbm90IHVzZSBtZXRob2QgJXM6ICVzXG4iLAorCQkgICAgICAgbXV4LCByZXNvbHZlci0+bmFtZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgZG9uZSgpIGV2ZW50IGZyb20gY2hpbGQgbmFtZSByZXNvbHZlcgorICoKKyAqIEB2IHJlc29sdgkJQ2hpbGQgbmFtZSByZXNvbHV0aW9uIGludGVyZmFjZQorICogQHYgc2EJCUNvbXBsZXRlZCBzb2NrZXQgYWRkcmVzcyAoaWYgc3VjY2Vzc2Z1bCkKKyAqIEB2IHJjCQlGaW5hbCBzdGF0dXMgY29kZQorICovCitzdGF0aWMgdm9pZCByZXNvbHZfbXV4X2RvbmUgKCBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSAqcmVzb2x2LAorCQkJICAgICAgc3RydWN0IHNvY2thZGRyICpzYSwgaW50IHJjICkgeworCXN0cnVjdCByZXNvbHZfbXV4ICptdXggPQorCQljb250YWluZXJfb2YgKCByZXNvbHYsIHN0cnVjdCByZXNvbHZfbXV4LCBjaGlsZCApOworCisJLyogVW5wbHVnIGNoaWxkICovCisJcmVzb2x2X3VucGx1ZyAoICZtdXgtPmNoaWxkICk7CisKKwkvKiBJZiB0aGlzIHJlc29sdXRpb24gc3VjY2VlZGVkLCBzdG9wIG5vdyAqLworCWlmICggcmMgPT0gMCApIHsKKwkJREJHQyAoIG11eCwgIlJFU09MViAlcCBzdWNjZWVkZWQgdXNpbmcgbWV0aG9kICVzXG4iLAorCQkgICAgICAgbXV4LCBtdXgtPnJlc29sdmVyLT5uYW1lICk7CisJCWdvdG8gZmluaXNoZWQ7CisJfQorCisJLyogQXR0ZW1wdCBuZXh0IGNoaWxkIHJlc29sdmVyLCBpZiBwb3NzaWJsZSAqLworCW11eC0+cmVzb2x2ZXIrKzsKKwlpZiAoIG11eC0+cmVzb2x2ZXIgPj0gdGFibGVfZW5kICggUkVTT0xWRVJTICkgKSB7CisJCURCR0MgKCBtdXgsICJSRVNPTFYgJXAgZmFpbGVkIHRvIHJlc29sdmUgbmFtZVxuIiwgbXV4ICk7CisJCWdvdG8gZmluaXNoZWQ7CisJfQorCWlmICggKCByYyA9IHJlc29sdl9tdXhfdHJ5ICggbXV4ICkgKSAhPSAwICkKKwkJZ290byBmaW5pc2hlZDsKKworCS8qIE5leHQgcmVzb2x2ZXIgaXMgbm93IHJ1bm5pbmcgKi8KKwlyZXR1cm47CisJCisgZmluaXNoZWQ6CisJcmVzb2x2X2RvbmUgKCAmbXV4LT5wYXJlbnQsIHNhLCByYyApOworfQorCisvKiogTmFtZSByZXNvbHV0aW9uIG11bHRpcGxleGVyIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZV9vcGVyYXRpb25zIHJlc29sdl9tdXhfY2hpbGRfb3BzID0geworCS5kb25lCQk9IHJlc29sdl9tdXhfZG9uZSwKK307CisKKy8qKgorICogU3RhcnQgbmFtZSByZXNvbHV0aW9uCisgKgorICogQHYgcmVzb2x2CQlOYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlCisgKiBAdiBuYW1lCQlOYW1lIHRvIHJlc29sdmUKKyAqIEB2IHNhCQlTb2NrZXQgYWRkcmVzcyB0byBjb21wbGV0ZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCByZXNvbHYgKCBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSAqcmVzb2x2LCBjb25zdCBjaGFyICpuYW1lLAorCSAgICAgc3RydWN0IHNvY2thZGRyICpzYSApIHsKKwlzdHJ1Y3QgcmVzb2x2X211eCAqbXV4OworCXNpemVfdCBuYW1lX2xlbiA9ICggc3RybGVuICggbmFtZSApICsgMSApOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHN0cnVjdHVyZSAqLworCW11eCA9IHphbGxvYyAoIHNpemVvZiAoICptdXggKSArIG5hbWVfbGVuICk7CisJaWYgKCAhIG11eCApCisJCXJldHVybiAtRU5PTUVNOworCXJlc29sdl9pbml0ICggJm11eC0+cGFyZW50LCAmbnVsbF9yZXNvbHZfb3BzLCAmbXV4LT5yZWZjbnQgKTsKKwlyZXNvbHZfaW5pdCAoICZtdXgtPmNoaWxkLCAmcmVzb2x2X211eF9jaGlsZF9vcHMsICZtdXgtPnJlZmNudCApOworCW11eC0+cmVzb2x2ZXIgPSB0YWJsZV9zdGFydCAoIFJFU09MVkVSUyApOworCW1lbWNweSAoICZtdXgtPnNhLCBzYSwgc2l6ZW9mICggbXV4LT5zYSApICk7CisJbWVtY3B5ICggbXV4LT5uYW1lLCBuYW1lLCBuYW1lX2xlbiApOworCisJREJHQyAoIG11eCwgIlJFU09MViAlcCBhdHRlbXB0aW5nIHRvIHJlc29sdmUgXCIlc1wiXG4iLCBtdXgsIG5hbWUgKTsKKworCS8qIFN0YXJ0IGZpcnN0IHJlc29sdmVyIGluIGNoYWluLiAgVGhlcmUgd2lsbCBhbHdheXMgYmUgYXQKKwkgKiBsZWFzdCBvbmUgcmVzb2x2ZXIgKHRoZSBudW1lcmljIHJlc29sdmVyKSwgc28gbm8gbmVlZCB0bworCSAqIGNoZWNrIGZvciB0aGUgemVyby1yZXNvbHZlcnMtYXZhaWxhYmxlIGNhc2UuCisJICovCisJaWYgKCAoIHJjID0gcmVzb2x2X211eF90cnkgKCBtdXggKSApICE9IDAgKQorCQlnb3RvIGVycjsKKworCS8qIEF0dGFjaCBwYXJlbnQgaW50ZXJmYWNlLCBtb3J0YWxpc2Ugc2VsZiwgYW5kIHJldHVybiAqLworCXJlc29sdl9wbHVnX3BsdWcgKCAmbXV4LT5wYXJlbnQsIHJlc29sdiApOworCXJlZl9wdXQgKCAmbXV4LT5yZWZjbnQgKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlyZWZfcHV0ICggJm11eC0+cmVmY250ICk7CisJcmV0dXJuIHJjOwkKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWVkIHNvY2tldCBvcGVuaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBBIG5hbWVkIHNvY2tldCAqLworc3RydWN0IG5hbWVkX3NvY2tldCB7CisJLyoqIFJlZmVyZW5jZSBjb3VudGVyICovCisJc3RydWN0IHJlZmNudCByZWZjbnQ7CisJLyoqIERhdGEgdHJhbnNmZXIgaW50ZXJmYWNlICovCisJc3RydWN0IHhmZXJfaW50ZXJmYWNlIHhmZXI7CisJLyoqIE5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSByZXNvbHY7CisJLyoqIENvbW11bmljYXRpb24gc2VtYW50aWNzIChlLmcuIFNPQ0tfU1RSRUFNKSAqLworCWludCBzZW1hbnRpY3M7CisJLyoqIFN0b3JlZCBsb2NhbCBzb2NrZXQgYWRkcmVzcywgaWYgYXBwbGljYWJsZSAqLworCXN0cnVjdCBzb2NrYWRkciBsb2NhbDsKKwkvKiogU3RvcmVkIGxvY2FsIHNvY2tldCBhZGRyZXNzIGV4aXN0cyAqLworCWludCBoYXZlX2xvY2FsOworfTsKKworLyoqCisgKiBGaW5pc2ggdXNpbmcgbmFtZWQgc29ja2V0CisgKgorICogQHYgbmFtZWQJCU5hbWVkIHNvY2tldAorICogQHYgcmMJCVJlYXNvbiBmb3IgZmluaXNoCisgKi8KK3N0YXRpYyB2b2lkIG5hbWVkX2RvbmUgKCBzdHJ1Y3QgbmFtZWRfc29ja2V0ICpuYW1lZCwgaW50IHJjICkgeworCisJLyogQ2xvc2UgYWxsIGludGVyZmFjZXMgKi8KKwlyZXNvbHZfbnVsbGlmeSAoICZuYW1lZC0+cmVzb2x2ICk7CisJeGZlcl9udWxsaWZ5ICggJm5hbWVkLT54ZmVyICk7CisJeGZlcl9jbG9zZSAoICZuYW1lZC0+eGZlciwgcmMgKTsKK30KKworLyoqCisgKiBIYW5kbGUgY2xvc2UoKSBldmVudAorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiByYwkJUmVhc29uIGZvciBjbG9zZQorICovCitzdGF0aWMgdm9pZCBuYW1lZF94ZmVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKSB7CisJc3RydWN0IG5hbWVkX3NvY2tldCAqbmFtZWQgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgbmFtZWRfc29ja2V0LCB4ZmVyICk7CisKKwluYW1lZF9kb25lICggbmFtZWQsIHJjICk7Cit9CisKKy8qKiBOYW1lZCBzb2NrZXQgb3BlbmVyIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBuYW1lZF94ZmVyX29wcyA9IHsKKwkuY2xvc2UJCT0gbmFtZWRfeGZlcl9jbG9zZSwKKwkudnJlZGlyZWN0CT0gaWdub3JlX3hmZXJfdnJlZGlyZWN0LAorCS53aW5kb3cJCT0gbm9feGZlcl93aW5kb3csCisJLmFsbG9jX2lvYgk9IGRlZmF1bHRfeGZlcl9hbGxvY19pb2IsCisJLmRlbGl2ZXJfaW9iCT0geGZlcl9kZWxpdmVyX2FzX3JhdywKKwkuZGVsaXZlcl9yYXcJPSBpZ25vcmVfeGZlcl9kZWxpdmVyX3JhdywKK307CisKKy8qKgorICogSGFuZGxlIGRvbmUoKSBldmVudAorICoKKyAqIEB2IHJlc29sdgkJTmFtZSByZXNvbHV0aW9uIGludGVyZmFjZQorICogQHYgc2EJCUNvbXBsZXRlZCBzb2NrZXQgYWRkcmVzcyAoaWYgc3VjY2Vzc2Z1bCkKKyAqIEB2IHJjCQlGaW5hbCBzdGF0dXMgY29kZQorICovCitzdGF0aWMgdm9pZCBuYW1lZF9yZXNvbHZfZG9uZSAoIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlICpyZXNvbHYsCisJCQkJc3RydWN0IHNvY2thZGRyICpzYSwgaW50IHJjICkgeworCXN0cnVjdCBuYW1lZF9zb2NrZXQgKm5hbWVkID0KKwkJY29udGFpbmVyX29mICggcmVzb2x2LCBzdHJ1Y3QgbmFtZWRfc29ja2V0LCByZXNvbHYgKTsKKworCS8qIFJlZGlyZWN0IGlmIG5hbWUgcmVzb2x1dGlvbiB3YXMgc3VjY2Vzc2Z1bCAqLworCWlmICggcmMgPT0gMCApIHsKKwkJcmMgPSB4ZmVyX3JlZGlyZWN0ICggJm5hbWVkLT54ZmVyLCBMT0NBVElPTl9TT0NLRVQsCisJCQkJICAgICBuYW1lZC0+c2VtYW50aWNzLCBzYSwKKwkJCQkgICAgICggbmFtZWQtPmhhdmVfbG9jYWwgPworCQkJCSAgICAgICAmbmFtZWQtPmxvY2FsIDogTlVMTCApICk7CisJfQorCisJLyogVGVybWluYXRlIHJlc29sdXRpb24gKi8KKwluYW1lZF9kb25lICggbmFtZWQsIHJjICk7Cit9CisKKy8qKiBOYW1lZCBzb2NrZXQgb3BlbmVyIG5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2Ugb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlX29wZXJhdGlvbnMgbmFtZWRfcmVzb2x2X29wcyA9IHsKKwkuZG9uZQkJPSBuYW1lZF9yZXNvbHZfZG9uZSwKK307CisKKy8qKgorICogT3BlbiBuYW1lZCBzb2NrZXQKKyAqCisgKiBAdiBzZW1hbnRpY3MJCUNvbW11bmljYXRpb24gc2VtYW50aWNzIChlLmcuIFNPQ0tfU1RSRUFNKQorICogQHYgcGVlcgkJUGVlciBzb2NrZXQgYWRkcmVzcyB0byBjb21wbGV0ZQorICogQHYgbmFtZQkJTmFtZSB0byByZXNvbHZlCisgKiBAdiBsb2NhbAkJTG9jYWwgc29ja2V0IGFkZHJlc3MsIG9yIE5VTEwKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgeGZlcl9vcGVuX25hbWVkX3NvY2tldCAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHNlbWFudGljcywKKwkJCSAgICAgc3RydWN0IHNvY2thZGRyICpwZWVyLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmxvY2FsICkgeworCXN0cnVjdCBuYW1lZF9zb2NrZXQgKm5hbWVkOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHN0cnVjdHVyZSAqLworCW5hbWVkID0gemFsbG9jICggc2l6ZW9mICggKm5hbWVkICkgKTsKKwlpZiAoICEgbmFtZWQgKQorCQlyZXR1cm4gLUVOT01FTTsKKwl4ZmVyX2luaXQgKCAmbmFtZWQtPnhmZXIsICZuYW1lZF94ZmVyX29wcywgJm5hbWVkLT5yZWZjbnQgKTsKKwlyZXNvbHZfaW5pdCAoICZuYW1lZC0+cmVzb2x2LCAmbmFtZWRfcmVzb2x2X29wcywgJm5hbWVkLT5yZWZjbnQgKTsKKwluYW1lZC0+c2VtYW50aWNzID0gc2VtYW50aWNzOworCWlmICggbG9jYWwgKSB7CisJCW1lbWNweSAoICZuYW1lZC0+bG9jYWwsIGxvY2FsLCBzaXplb2YgKCBuYW1lZC0+bG9jYWwgKSApOworCQluYW1lZC0+aGF2ZV9sb2NhbCA9IDE7CisJfQorCisJREJHQyAoIG5hbWVkLCAiUkVTT0xWICVwIG9wZW5pbmcgbmFtZWQgc29ja2V0IFwiJXNcIlxuIiwKKwkgICAgICAgbmFtZWQsIG5hbWUgKTsKKworCS8qIFN0YXJ0IG5hbWUgcmVzb2x1dGlvbiAqLworCWlmICggKCByYyA9IHJlc29sdiAoICZuYW1lZC0+cmVzb2x2LCBuYW1lLCBwZWVyICkgKSAhPSAwICkKKwkJZ290byBlcnI7CisKKwkvKiBBdHRhY2ggcGFyZW50IGludGVyZmFjZSwgbW9ydGFsaXNlIHNlbGYsIGFuZCByZXR1cm4gKi8KKwl4ZmVyX3BsdWdfcGx1ZyAoICZuYW1lZC0+eGZlciwgeGZlciApOworCXJlZl9wdXQgKCAmbmFtZWQtPnJlZmNudCApOworCXJldHVybiAwOworCisgZXJyOgorCXJlZl9wdXQgKCAmbmFtZWQtPnJlZmNudCApOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvc2VyaWFsLmMgYi9ncHhlL3NyYy9jb3JlL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNWU4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL3NlcmlhbC5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogVGhlIHNlcmlhbCBwb3J0IGludGVyZmFjZSByb3V0aW5lcyBpbXBsZW1lbnQgYSBzaW1wbGUgcG9sbGVkIGkvbworICogaW50ZXJmYWNlIHRvIGEgc3RhbmRhcmQgc2VyaWFsIHBvcnQuICBEdWUgdG8gdGhlIHNwYWNlIHJlc3RyaWN0aW9ucworICogZm9yIHRoZSBib290IGJsb2Nrcywgbm8gQklPUyBzdXBwb3J0IGlzIHVzZWQgKHNpbmNlIEJJT1MgcmVxdWlyZXMKKyAqIGV4cGVuc2l2ZSByZWFsL3Byb3RlY3RlZCBtb2RlIHN3aXRjaGVzKSwgaW5zdGVhZCB0aGUgcnVkaW1lbnRhcnkKKyAqIEJJT1Mgc3VwcG9ydCBpcyBkdXBsaWNhdGVkIGhlcmUuCisgKgorICogVGhlIGJhc2UgYWRkcmVzcyBhbmQgc3BlZWQgZm9yIHRoZSBpL28gcG9ydCBhcmUgcGFzc2VkIGZyb20gdGhlCisgKiBNYWtlZmlsZSBpbiB0aGUgQ09NQ09OU09MRSBhbmQgQ09OU1BFRUQgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIFRoZQorICogbGluZSBjb250cm9sIHBhcmFtZXRlcnMgYXJlIGN1cnJlbnRseSBoYXJkLWNvZGVkIHRvIDggYml0cywgbm8KKyAqIHBhcml0eSwgMSBzdG9wIGJpdCAoOE4xKS4gIFRoaXMgY2FuIGJlIGNoYW5nZWQgaW4gaW5pdF9zZXJpYWwoKS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlICJzdGRkZWYuaCIKKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKyNpbmNsdWRlIDxncHhlL2lvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXJpYWwuaD4KKyNpbmNsdWRlICJjb25maWcvc2VyaWFsLmgiCisKKy8qIFNldCBkZWZhdWx0IHZhbHVlcyBpZiBub25lIHNwZWNpZmllZCAqLworCisjaWZuZGVmIENPTUNPTlNPTEUKKyNkZWZpbmUgQ09NQ09OU09MRQkweDNmOAorI2VuZGlmCisKKyNpZm5kZWYgQ09NU1BFRUQKKyNkZWZpbmUgQ09NU1BFRUQJOTYwMAorI2VuZGlmCisKKyNpZm5kZWYgQ09NREFUQQorI2RlZmluZSBDT01EQVRBCQk4CisjZW5kaWYKKworI2lmbmRlZiBDT01QQVJJVFkKKyNkZWZpbmUgQ09NUEFSSVRZCTAKKyNlbmRpZgorCisjaWZuZGVmIENPTVNUT1AKKyNkZWZpbmUgQ09NU1RPUAkJMQorI2VuZGlmCisKKyN1bmRlZiBVQVJUX0JBU0UKKyNkZWZpbmUgVUFSVF9CQVNFICggQ09NQ09OU09MRSApCisKKyN1bmRlZiBVQVJUX0JBVUQKKyNkZWZpbmUgVUFSVF9CQVVEICggQ09NU1BFRUQgKQorCisjaWYgKCgxMTUyMDAlVUFSVF9CQVVEKSAhPSAwKQorI2Vycm9yIEJhZCB0dHlzMCBiYXVkIHJhdGUKKyNlbmRpZgorCisjZGVmaW5lIENPTUJSRCAoMTE1MjAwL1VBUlRfQkFVRCkKKworLyogTGluZSBDb250cm9sIFNldHRpbmdzICovCisjZGVmaW5lIFVBUlRfTENTICggKCAoIChDT01EQVRBKSAtIDUgKQk8PCAwICkgfCBcCisJCSAgICggKCAoQ09NUEFSSVRZKSApCTw8IDMgKSB8IFwKKwkJICAgKCAoIChDT01TVE9QKSAtIDEgKQk8PCAyICkgKQorCisvKiBEYXRhICovCisjZGVmaW5lIFVBUlRfUkJSIDB4MDAKKyNkZWZpbmUgVUFSVF9UQlIgMHgwMAorCisvKiBDb250cm9sICovCisjZGVmaW5lIFVBUlRfSUVSIDB4MDEKKyNkZWZpbmUgVUFSVF9JSVIgMHgwMgorI2RlZmluZSBVQVJUX0ZDUiAweDAyCisjZGVmaW5lIFVBUlRfTENSIDB4MDMKKyNkZWZpbmUgVUFSVF9NQ1IgMHgwNAorI2RlZmluZSBVQVJUX0RMTCAweDAwCisjZGVmaW5lIFVBUlRfRExNIDB4MDEKKworLyogU3RhdHVzICovCisjZGVmaW5lIFVBUlRfTFNSIDB4MDUKKyNkZWZpbmUgIFVBUlRfTFNSX1RFTVBUIDB4NDAJLyogVHJhbnNtaXR0ZXIgZW1wdHkgKi8KKyNkZWZpbmUgIFVBUlRfTFNSX1RIUkUgIDB4MjAJLyogVHJhbnNtaXQtaG9sZC1yZWdpc3RlciBlbXB0eSAqLworI2RlZmluZSAgVUFSVF9MU1JfQkkJMHgxMAkvKiBCcmVhayBpbnRlcnJ1cHQgaW5kaWNhdG9yICovCisjZGVmaW5lICBVQVJUX0xTUl9GRQkweDA4CS8qIEZyYW1lIGVycm9yIGluZGljYXRvciAqLworI2RlZmluZSAgVUFSVF9MU1JfUEUJMHgwNAkvKiBQYXJpdHkgZXJyb3IgaW5kaWNhdG9yICovCisjZGVmaW5lICBVQVJUX0xTUl9PRQkweDAyCS8qIE92ZXJydW4gZXJyb3IgaW5kaWNhdG9yICovCisjZGVmaW5lICBVQVJUX0xTUl9EUgkweDAxCS8qIFJlY2VpdmVyIGRhdGEgcmVhZHkgKi8KKworI2RlZmluZSBVQVJUX01TUiAweDA2CisjZGVmaW5lIFVBUlRfU0NSIDB4MDcKKworI2lmIGRlZmluZWQoVUFSVF9NRU0pCisjZGVmaW5lIHVhcnRfcmVhZGIoYWRkcikgcmVhZGIoKGFkZHIpKQorI2RlZmluZSB1YXJ0X3dyaXRlYih2YWwsYWRkcikgd3JpdGViKCh2YWwpLChhZGRyKSkKKyNlbHNlCisjZGVmaW5lIHVhcnRfcmVhZGIoYWRkcikgaW5iKChhZGRyKSkKKyNkZWZpbmUgdWFydF93cml0ZWIodmFsLGFkZHIpIG91dGIoKHZhbCksKGFkZHIpKQorI2VuZGlmCisKKy8qCisgKiB2b2lkIHNlcmlhbF9wdXRjKGludCBjaCk7CisgKglXcml0ZSBjaGFyYWN0ZXIgYGNoJyB0byBwb3J0IFVBUlRfQkFTRS4KKyAqLwordm9pZCBzZXJpYWxfcHV0YyAoIGludCBjaCApIHsKKwlpbnQgaTsKKwlpbnQgc3RhdHVzOworCWkgPSAxMDAwOyAvKiB0aW1lb3V0ICovCisJd2hpbGUoLS1pID4gMCkgeworCQlzdGF0dXMgPSB1YXJ0X3JlYWRiKFVBUlRfQkFTRSArIFVBUlRfTFNSKTsKKwkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpIHsgCisJCQkvKiBUWCBidWZmZXIgZW10cHkgKi8KKwkJCXVhcnRfd3JpdGViKGNoLCBVQVJUX0JBU0UgKyBVQVJUX1RCUik7CisJCQlicmVhazsKKwkJfQorCQltZGVsYXkoMik7CisJfQorfQorCisvKgorICogaW50IHNlcmlhbF9nZXRjKHZvaWQpOworICoJUmVhZCBhIGNoYXJhY3RlciBmcm9tIHBvcnQgVUFSVF9CQVNFLgorICovCitpbnQgc2VyaWFsX2dldGMgKCB2b2lkICkgeworCWludCBzdGF0dXM7CisJaW50IGNoOworCWRvIHsKKwkJc3RhdHVzID0gdWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX0xTUik7CisJfSB3aGlsZSgoc3RhdHVzICYgMSkgPT0gMCk7CisJY2ggPSB1YXJ0X3JlYWRiKFVBUlRfQkFTRSArIFVBUlRfUkJSKTsJLyogZmV0Y2ggKGZpcnN0KSBjaGFyYWN0ZXIgKi8KKwljaCAmPSAweDdmOwkJCQkvKiByZW1vdmUgYW55IHBhcml0eSBiaXRzIHdlIGdldCAqLworCWlmIChjaCA9PSAweDdmKSB7CQkJLyogTWFrZSBERUwuLi4gbG9vayBsaWtlIEJTICovCisJCWNoID0gMHgwODsKKwl9CisJcmV0dXJuIGNoOworfQorCisvKgorICogaW50IHNlcmlhbF9pc2NoYXIodm9pZCk7CisgKiAgICAgICBJZiB0aGVyZSBpcyBhIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQgYnVmZmVyIG9mIHBvcnQgVUFSVF9CQVNFLAorICogICAgICAgcmV0dXJuIG5vbnplcm87IG90aGVyd2lzZSByZXR1cm4gMC4KKyAqLworaW50IHNlcmlhbF9pc2NoYXIgKCB2b2lkICkgeworCWludCBzdGF0dXM7CisJc3RhdHVzID0gdWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX0xTUik7CS8qIGxpbmUgc3RhdHVzIHJlZzsgKi8KKwlyZXR1cm4gc3RhdHVzICYgMTsJCS8qIHJ4IGNoYXIgYXZhaWxhYmxlICovCit9CisKKy8qCisgKiBpbnQgc2VyaWFsX2luaXQodm9pZCk7CisgKglJbml0aWFsaXplIHBvcnQgVUFSVF9CQVNFIHRvIHNwZWVkIENPTVNQRUVELCBsaW5lIHNldHRpbmdzIDhOMS4KKyAqLworc3RhdGljIHZvaWQgc2VyaWFsX2luaXQgKCB2b2lkICkgeworCWludCBzdGF0dXM7CisJaW50IGRpdmlzb3IsIGxjczsKKworCURCRyAoICJTZXJpYWwgcG9ydCAlI3ggaW5pdGlhbGlzaW5nXG4iLCBVQVJUX0JBU0UgKTsKKworCWRpdmlzb3IgPSBDT01CUkQ7CisJbGNzID0gVUFSVF9MQ1M7CisKKworI2lmZGVmIENPTVBSRVNFUlZFCisJbGNzID0gdWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX0xDUikgJiAweDdmOworCXVhcnRfd3JpdGViKDB4ODAgfCBsY3MsIFVBUlRfQkFTRSArIFVBUlRfTENSKTsKKwlkaXZpc29yID0gKHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9ETE0pIDw8IDgpIHwgdWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX0RMTCk7CisJdWFydF93cml0ZWIobGNzLCBVQVJUX0JBU0UgKyBVQVJUX0xDUik7CisjZW5kaWYKKworCS8qIFNldCBCYXVkIFJhdGUgRGl2aXNvciB0byBDT01TUEVFRCwgYW5kIHRlc3QgdG8gc2VlIGlmIHRoZQorCSAqIHNlcmlhbCBwb3J0IGFwcGVhcnMgdG8gYmUgcHJlc2VudC4KKwkgKi8KKwl1YXJ0X3dyaXRlYigweDgwIHwgbGNzLCBVQVJUX0JBU0UgKyBVQVJUX0xDUik7CisJdWFydF93cml0ZWIoMHhhYSwgVUFSVF9CQVNFICsgVUFSVF9ETEwpOworCWlmICh1YXJ0X3JlYWRiKFVBUlRfQkFTRSArIFVBUlRfRExMKSAhPSAweGFhKSB7CisJCURCRyAoICJTZXJpYWwgcG9ydCAlI3ggVUFSVF9ETEwgZmFpbGVkXG4iLCBVQVJUX0JBU0UgKTsKKwkJZ290byBvdXQ7CisJfQorCXVhcnRfd3JpdGViKDB4NTUsIFVBUlRfQkFTRSArIFVBUlRfRExMKTsKKwlpZiAodWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX0RMTCkgIT0gMHg1NSkgeworCQlEQkcgKCAiU2VyaWFsIHBvcnQgJSN4IFVBUlRfRExMIGZhaWxlZFxuIiwgVUFSVF9CQVNFICk7CisJCWdvdG8gb3V0OworCX0KKwl1YXJ0X3dyaXRlYihkaXZpc29yICYgMHhmZiwgVUFSVF9CQVNFICsgVUFSVF9ETEwpOworCWlmICh1YXJ0X3JlYWRiKFVBUlRfQkFTRSArIFVBUlRfRExMKSAhPSAoZGl2aXNvciAmIDB4ZmYpKSB7CisJCURCRyAoICJTZXJpYWwgcG9ydCAlI3ggVUFSVF9ETEwgZmFpbGVkXG4iLCBVQVJUX0JBU0UgKTsKKwkJZ290byBvdXQ7CisJfQorCXVhcnRfd3JpdGViKDB4YWEsIFVBUlRfQkFTRSArIFVBUlRfRExNKTsKKwlpZiAodWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX0RMTSkgIT0gMHhhYSkgeworCQlEQkcgKCAiU2VyaWFsIHBvcnQgJSN4IFVBUlRfRExNIGZhaWxlZFxuIiwgVUFSVF9CQVNFICk7CisJCWdvdG8gb3V0OworCX0KKwl1YXJ0X3dyaXRlYigweDU1LCBVQVJUX0JBU0UgKyBVQVJUX0RMTSk7CisJaWYgKHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9ETE0pICE9IDB4NTUpIHsKKwkJREJHICggIlNlcmlhbCBwb3J0ICUjeCBVQVJUX0RMTSBmYWlsZWRcbiIsIFVBUlRfQkFTRSApOworCQlnb3RvIG91dDsKKwl9CisJdWFydF93cml0ZWIoKGRpdmlzb3IgPj4gOCkgJiAweGZmLCBVQVJUX0JBU0UgKyBVQVJUX0RMTSk7CisJaWYgKHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9ETE0pICE9ICgoZGl2aXNvciA+PiA4KSAmIDB4ZmYpKSB7CisJCURCRyAoICJTZXJpYWwgcG9ydCAlI3ggVUFSVF9ETE0gZmFpbGVkXG4iLCBVQVJUX0JBU0UgKTsKKwkJZ290byBvdXQ7CisJfQorCXVhcnRfd3JpdGViKGxjcywgVUFSVF9CQVNFICsgVUFSVF9MQ1IpOworCQorCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXVhcnRfd3JpdGViKDB4MCwgVUFSVF9CQVNFICsgVUFSVF9JRVIpOworCisJLyogZGlzYWJsZSBmaWZvJ3MgKi8KKwl1YXJ0X3dyaXRlYigweDAwLCBVQVJUX0JBU0UgKyBVQVJUX0ZDUik7CisKKwkvKiBTZXQgY2xlYXIgdG8gc2VuZCwgc28gZmxvdyBjb250cm9sIHdvcmtzLi4uICovCisJdWFydF93cml0ZWIoKDE8PDEpLCBVQVJUX0JBU0UgKyBVQVJUX01DUik7CisKKworCS8qIEZsdXNoIHRoZSBpbnB1dCBidWZmZXIuICovCisJZG8geworCQkvKiByeCBidWZmZXIgcmVnCisJCSAqIHRocm93IGF3YXkgKHVuY29uZGl0aW9uYWxseSB0aGUgZmlyc3QgdGltZSkKKwkJICovCisJICAgICAgICAodm9pZCkgdWFydF9yZWFkYihVQVJUX0JBU0UgKyBVQVJUX1JCUik7CisJCS8qIGxpbmUgc3RhdHVzIHJlZyAqLworCQlzdGF0dXMgPSB1YXJ0X3JlYWRiKFVBUlRfQkFTRSArIFVBUlRfTFNSKTsKKwl9IHdoaWxlKHN0YXR1cyAmIFVBUlRfTFNSX0RSKTsKKyBvdXQ6CisJcmV0dXJuOworfQorCisvKgorICogdm9pZCBzZXJpYWxfZmluaSh2b2lkKTsKKyAqCUNsZWFudXAgb3VyIHVzZSBvZiB0aGUgc2VyaWFsIHBvcnQsIGluIHBhcnRpY3VsYXIgZmx1c2ggdGhlCisgKglvdXRwdXQgYnVmZmVyIHNvIHdlIGRvbid0IGFjY2lkZW50aWFsbHkgbG9zZSBjaGFyYWN0ZXJzLgorICovCitzdGF0aWMgdm9pZCBzZXJpYWxfZmluaSAoIGludCBmbGFncyBfX3VudXNlZCApIHsKKwlpbnQgaSwgc3RhdHVzOworCS8qIEZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGF2b2lkIGRyb3BwaW5nIGNoYXJhY3RlcnMsCisJICogaWYgd2UgYXJlIHJlaW5pdGlhbGl6aW5nIHRoZSBzZXJpYWwgcG9ydC4KKwkgKi8KKwlpID0gMTAwMDA7IC8qIHRpbWVvdXQgKi8KKwlkbyB7CisJCXN0YXR1cyA9IHVhcnRfcmVhZGIoVUFSVF9CQVNFICsgVUFSVF9MU1IpOworCX0gd2hpbGUoKC0taSA+IDApICYmICEoc3RhdHVzICYgVUFSVF9MU1JfVEVNUFQpKTsKKwkvKiBEb24ndCBtYXJrIGl0IGFzIGRpc2FibGVkOyBpdCdzIHN0aWxsIHVzYWJsZSAqLworfQorCisvKioKKyAqIFNlcmlhbCBkcml2ZXIgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24KKyAqCisgKiBJbml0aWFsaXNlIHNlcmlhbCBwb3J0IGVhcmx5IG9uIHNvIHRoYXQgaXQgaXMgYXZhaWxhYmxlIHRvIGNhcHR1cmUKKyAqIGVhcmx5IGRlYnVnIG1lc3NhZ2VzLgorICovCitzdHJ1Y3QgaW5pdF9mbiBzZXJpYWxfaW5pdF9mbiBfX2luaXRfZm4gKCBJTklUX1NFUklBTCApID0geworCS5pbml0aWFsaXNlID0gc2VyaWFsX2luaXQsCit9OworCisvKiogU2VyaWFsIGRyaXZlciBzdGFydHVwIGZ1bmN0aW9uICovCitzdHJ1Y3Qgc3RhcnR1cF9mbiBzZXJpYWxfc3RhcnR1cF9mbiBfX3N0YXJ0dXBfZm4gKCBTVEFSVFVQX0VBUkxZICkgPSB7CisJLnNodXRkb3duID0gc2VyaWFsX2ZpbmksCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9zZXJpYWxfY29uc29sZS5jIGIvZ3B4ZS9zcmMvY29yZS9zZXJpYWxfY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDA0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jb3JlL3NlcmlhbF9jb25zb2xlLmMKQEAgLTAsMCArMSwzMSBAQAorI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorI2luY2x1ZGUgPGdweGUvc2VyaWFsLmg+CisjaW5jbHVkZSAiY29uc29sZS5oIgorCisvKiogQGZpbGUKKyAqCisgKiBTZXJpYWwgY29uc29sZQorICoKKyAqLworCitzdHJ1Y3QgY29uc29sZV9kcml2ZXIgc2VyaWFsX2NvbnNvbGUgX19jb25zb2xlX2RyaXZlcjsKKworc3RhdGljIHZvaWQgc2VyaWFsX2NvbnNvbGVfaW5pdCAoIHZvaWQgKSB7CisJLyogU2VyaWFsIGRyaXZlciBpbml0aWFsaXphdGlvbiBzaG91bGQgYWxyZWFkeSBiZSBkb25lLAorCSAqIHRpbWUgdG8gZW5hYmxlIHRoZSBzZXJpYWwgY29uc29sZS4gKi8KKwlzZXJpYWxfY29uc29sZS5kaXNhYmxlZCA9IDA7Cit9CisKK3N0cnVjdCBjb25zb2xlX2RyaXZlciBzZXJpYWxfY29uc29sZSBfX2NvbnNvbGVfZHJpdmVyID0geworCS5wdXRjaGFyID0gc2VyaWFsX3B1dGMsCisJLmdldGNoYXIgPSBzZXJpYWxfZ2V0YywKKwkuaXNrZXkgPSBzZXJpYWxfaXNjaGFyLAorCS5kaXNhYmxlZCA9IDEsCit9OworCisvKioKKyAqIFNlcmlhbCBjb25zb2xlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uCisgKi8KK3N0cnVjdCBpbml0X2ZuIHNlcmlhbF9jb25zb2xlX2luaXRfZm4gX19pbml0X2ZuICggSU5JVF9DT05TT0xFICkgPSB7CisJLmluaXRpYWxpc2UgPSBzZXJpYWxfY29uc29sZV9pbml0LAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvc2V0dGluZ3MuYyBiL2dweGUvc3JjL2NvcmUvc2V0dGluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDgzMTAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9zZXR0aW5ncy5jCkBAIC0wLDAgKzEsMTQ1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisjaW5jbHVkZSA8Z3B4ZS92c3ByaW50Zi5oPgorI2luY2x1ZGUgPGdweGUvZGhjcC5oPgorI2luY2x1ZGUgPGdweGUvdXVpZC5oPgorI2luY2x1ZGUgPGdweGUvdXJpLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXR0aW5ncy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBDb25maWd1cmF0aW9uIHNldHRpbmdzCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZW5lcmljIHNldHRpbmdzIGJsb2NrcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIEEgZ2VuZXJpYyBzZXR0aW5nCisgKgorICovCitzdHJ1Y3QgZ2VuZXJpY19zZXR0aW5nIHsKKwkvKiogTGlzdCBvZiBnZW5lcmljIHNldHRpbmdzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8qKiBTZXR0aW5nICovCisJc3RydWN0IHNldHRpbmcgc2V0dGluZzsKKwkvKiogU2l6ZSBvZiBzZXR0aW5nIG5hbWUgKi8KKwlzaXplX3QgbmFtZV9sZW47CisJLyoqIFNpemUgb2Ygc2V0dGluZyBkYXRhICovCisJc2l6ZV90IGRhdGFfbGVuOworfTsKKworLyoqCisgKiBHZXQgZ2VuZXJpYyBzZXR0aW5nIG5hbWUKKyAqCisgKiBAdiBnZW5lcmljCQlHZW5lcmljIHNldHRpbmcKKyAqIEByZXQgbmFtZQkJR2VuZXJpYyBzZXR0aW5nIG5hbWUKKyAqLworc3RhdGljIGlubGluZSB2b2lkICogZ2VuZXJpY19zZXR0aW5nX25hbWUgKCBzdHJ1Y3QgZ2VuZXJpY19zZXR0aW5nICpnZW5lcmljICkgeworCXJldHVybiAoICggKCB2b2lkICogKSBnZW5lcmljICkgKyBzaXplb2YgKCAqZ2VuZXJpYyApICk7Cit9CisKKy8qKgorICogR2V0IGdlbmVyaWMgc2V0dGluZyBkYXRhCisgKgorICogQHYgZ2VuZXJpYwkJR2VuZXJpYyBzZXR0aW5nCisgKiBAcmV0IGRhdGEJCUdlbmVyaWMgc2V0dGluZyBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGdlbmVyaWNfc2V0dGluZ19kYXRhICggc3RydWN0IGdlbmVyaWNfc2V0dGluZyAqZ2VuZXJpYyApIHsKKwlyZXR1cm4gKCAoICggdm9pZCAqICkgZ2VuZXJpYyApICsgc2l6ZW9mICggKmdlbmVyaWMgKSArCisJCSBnZW5lcmljLT5uYW1lX2xlbiApOworfQorCisvKioKKyAqIEZpbmQgZ2VuZXJpYyBzZXR0aW5nCisgKgorICogQHYgZ2VuZXJpY3MJCUdlbmVyaWMgc2V0dGluZ3MgYmxvY2sKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gZmluZAorICogQHJldCBnZW5lcmljCQlHZW5lcmljIHNldHRpbmcsIG9yIE5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBnZW5lcmljX3NldHRpbmcgKgorZmluZF9nZW5lcmljX3NldHRpbmcgKCBzdHJ1Y3QgZ2VuZXJpY19zZXR0aW5ncyAqZ2VuZXJpY3MsCisJCSAgICAgICBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZyApIHsKKwlzdHJ1Y3QgZ2VuZXJpY19zZXR0aW5nICpnZW5lcmljOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIGdlbmVyaWMsICZnZW5lcmljcy0+bGlzdCwgbGlzdCApIHsKKwkJaWYgKCBzZXR0aW5nX2NtcCAoICZnZW5lcmljLT5zZXR0aW5nLCBzZXR0aW5nICkgPT0gMCApCisJCQlyZXR1cm4gZ2VuZXJpYzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogU3RvcmUgdmFsdWUgb2YgZ2VuZXJpYyBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIHN0b3JlCisgKiBAdiBkYXRhCQlTZXR0aW5nIGRhdGEsIG9yIE5VTEwgdG8gY2xlYXIgc2V0dGluZworICogQHYgbGVuCQlMZW5ndGggb2Ygc2V0dGluZyBkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IGdlbmVyaWNfc2V0dGluZ3Nfc3RvcmUgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJICAgICBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgZ2VuZXJpY19zZXR0aW5ncyAqZ2VuZXJpY3MgPQorCQljb250YWluZXJfb2YgKCBzZXR0aW5ncywgc3RydWN0IGdlbmVyaWNfc2V0dGluZ3MsIHNldHRpbmdzICk7CisJc3RydWN0IGdlbmVyaWNfc2V0dGluZyAqb2xkOworCXN0cnVjdCBnZW5lcmljX3NldHRpbmcgKm5ldyA9IE5VTEw7CisJc2l6ZV90IG5hbWVfbGVuOworCisJLyogSWRlbnRpZnkgZXhpc3RpbmcgZ2VuZXJpYyBzZXR0aW5nLCBpZiBhbnkgKi8KKwlvbGQgPSBmaW5kX2dlbmVyaWNfc2V0dGluZyAoIGdlbmVyaWNzLCBzZXR0aW5nICk7CisKKwkvKiBDcmVhdGUgbmV3IGdlbmVyaWMgc2V0dGluZywgaWYgcmVxdWlyZWQgKi8KKwlpZiAoIGxlbiApIHsKKwkJLyogQWxsb2NhdGUgbmV3IGdlbmVyaWMgc2V0dGluZyAqLworCQluYW1lX2xlbiA9ICggc3RybGVuICggc2V0dGluZy0+bmFtZSApICsgMSApOworCQluZXcgPSB6YWxsb2MgKCBzaXplb2YgKCAqbmV3ICkgKyBuYW1lX2xlbiArIGxlbiApOworCQlpZiAoICEgbmV3ICkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIFBvcHVsYXRlIG5ldyBnZW5lcmljIHNldHRpbmcgKi8KKwkJbmV3LT5uYW1lX2xlbiA9IG5hbWVfbGVuOworCQluZXctPmRhdGFfbGVuID0gbGVuOworCQltZW1jcHkgKCAmbmV3LT5zZXR0aW5nLCBzZXR0aW5nLCBzaXplb2YgKCBuZXctPnNldHRpbmcgKSApOworCQluZXctPnNldHRpbmcubmFtZSA9IGdlbmVyaWNfc2V0dGluZ19uYW1lICggbmV3ICk7CisJCW1lbWNweSAoIGdlbmVyaWNfc2V0dGluZ19uYW1lICggbmV3ICksCisJCQkgc2V0dGluZy0+bmFtZSwgbmFtZV9sZW4gKTsKKwkJbWVtY3B5ICggZ2VuZXJpY19zZXR0aW5nX2RhdGEgKCBuZXcgKSwgZGF0YSwgbGVuICk7CisJfQorCisJLyogRGVsZXRlIGV4aXN0aW5nIGdlbmVyaWMgc2V0dGluZywgaWYgYW55ICovCisJaWYgKCBvbGQgKSB7CisJCWxpc3RfZGVsICggJm9sZC0+bGlzdCApOworCQlmcmVlICggb2xkICk7CisJfQorCisJLyogQWRkIG5ldyBzZXR0aW5nIHRvIGxpc3QsIGlmIGFueSAqLworCWlmICggbmV3ICkKKwkJbGlzdF9hZGQgKCAmbmV3LT5saXN0LCAmZ2VuZXJpY3MtPmxpc3QgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEZldGNoIHZhbHVlIG9mIGdlbmVyaWMgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgZGF0YQkJQnVmZmVyIHRvIGZpbGwgd2l0aCBzZXR0aW5nIGRhdGEKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBzZXR0aW5nIGRhdGEsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK2ludCBnZW5lcmljX3NldHRpbmdzX2ZldGNoICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCSAgICAgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGdlbmVyaWNfc2V0dGluZ3MgKmdlbmVyaWNzID0KKwkJY29udGFpbmVyX29mICggc2V0dGluZ3MsIHN0cnVjdCBnZW5lcmljX3NldHRpbmdzLCBzZXR0aW5ncyApOworCXN0cnVjdCBnZW5lcmljX3NldHRpbmcgKmdlbmVyaWM7CisKKwkvKiBGaW5kIGdlbmVyaWMgc2V0dGluZyAqLworCWdlbmVyaWMgPSBmaW5kX2dlbmVyaWNfc2V0dGluZyAoIGdlbmVyaWNzLCBzZXR0aW5nICk7CisJaWYgKCAhIGdlbmVyaWMgKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qIENvcHkgb3V0IGdlbmVyaWMgc2V0dGluZyBkYXRhICovCisJaWYgKCBsZW4gPiBnZW5lcmljLT5kYXRhX2xlbiApCisJCWxlbiA9IGdlbmVyaWMtPmRhdGFfbGVuOworCW1lbWNweSAoIGRhdGEsIGdlbmVyaWNfc2V0dGluZ19kYXRhICggZ2VuZXJpYyApLCBsZW4gKTsKKwlyZXR1cm4gZ2VuZXJpYy0+ZGF0YV9sZW47Cit9CisKKy8qKgorICogQ2xlYXIgZ2VuZXJpYyBzZXR0aW5ncyBibG9jaworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICovCit2b2lkIGdlbmVyaWNfc2V0dGluZ3NfY2xlYXIgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzICkgeworCXN0cnVjdCBnZW5lcmljX3NldHRpbmdzICpnZW5lcmljcyA9CisJCWNvbnRhaW5lcl9vZiAoIHNldHRpbmdzLCBzdHJ1Y3QgZ2VuZXJpY19zZXR0aW5ncywgc2V0dGluZ3MgKTsKKwlzdHJ1Y3QgZ2VuZXJpY19zZXR0aW5nICpnZW5lcmljOworCXN0cnVjdCBnZW5lcmljX3NldHRpbmcgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAoIGdlbmVyaWMsIHRtcCwgJmdlbmVyaWNzLT5saXN0LCBsaXN0ICkgeworCQlsaXN0X2RlbCAoICZnZW5lcmljLT5saXN0ICk7CisJCWZyZWUgKCBnZW5lcmljICk7CisJfQorCWFzc2VydCAoIGxpc3RfZW1wdHkgKCAmZ2VuZXJpY3MtPmxpc3QgKSApOworfQorCisvKiogR2VuZXJpYyBzZXR0aW5ncyBvcGVyYXRpb25zICovCitzdHJ1Y3Qgc2V0dGluZ3Nfb3BlcmF0aW9ucyBnZW5lcmljX3NldHRpbmdzX29wZXJhdGlvbnMgPSB7CisJLnN0b3JlID0gZ2VuZXJpY19zZXR0aW5nc19zdG9yZSwKKwkuZmV0Y2ggPSBnZW5lcmljX3NldHRpbmdzX2ZldGNoLAorCS5jbGVhciA9IGdlbmVyaWNfc2V0dGluZ3NfY2xlYXIsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVnaXN0ZXJlZCBzZXR0aW5ncyBibG9ja3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIFJvb3QgZ2VuZXJpYyBzZXR0aW5ncyBibG9jayAqLworc3RydWN0IGdlbmVyaWNfc2V0dGluZ3MgZ2VuZXJpY19zZXR0aW5nc19yb290ID0geworCS5zZXR0aW5ncyA9IHsKKwkJLnJlZmNudCA9IE5VTEwsCisJCS5uYW1lID0gIiIsCisJCS5zaWJsaW5ncyA9CisJCSAgICBMSVNUX0hFQURfSU5JVCAoIGdlbmVyaWNfc2V0dGluZ3Nfcm9vdC5zZXR0aW5ncy5zaWJsaW5ncyApLAorCQkuY2hpbGRyZW4gPQorCQkgICAgTElTVF9IRUFEX0lOSVQgKCBnZW5lcmljX3NldHRpbmdzX3Jvb3Quc2V0dGluZ3MuY2hpbGRyZW4gKSwKKwkJLm9wID0gJmdlbmVyaWNfc2V0dGluZ3Nfb3BlcmF0aW9ucywKKwl9LAorCS5saXN0ID0gTElTVF9IRUFEX0lOSVQgKCBnZW5lcmljX3NldHRpbmdzX3Jvb3QubGlzdCApLAorfTsKKworLyoqIFJvb3Qgc2V0dGluZ3MgYmxvY2sgKi8KKyNkZWZpbmUgc2V0dGluZ3Nfcm9vdCBnZW5lcmljX3NldHRpbmdzX3Jvb3Quc2V0dGluZ3MKKworLyoqCisgKiBGaW5kIGNoaWxkIG5hbWVkIHNldHRpbmdzIGJsb2NrCisgKgorICogQHYgcGFyZW50CQlQYXJlbnQgc2V0dGluZ3MgYmxvY2sKKyAqIEB2IG5hbWUJCU5hbWUgd2l0aGluIHRoaXMgcGFyZW50CisgKiBAcmV0IHNldHRpbmdzCVNldHRpbmdzIGJsb2NrLCBvciBOVUxMCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2V0dGluZ3MgKiBmaW5kX2NoaWxkX3NldHRpbmdzICggc3RydWN0IHNldHRpbmdzICpwYXJlbnQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lICkgeworCXN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3M7CisKKwkvKiBUcmVhdCBlbXB0eSBuYW1lIGFzIG1lYW5pbmcgInRoaXMgYmxvY2siICovCisJaWYgKCAhICpuYW1lICkKKwkJcmV0dXJuIHBhcmVudDsKKworCS8qIExvb2sgZm9yIGNoaWxkIHdpdGggbWF0Y2hpbmcgbmFtZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBzZXR0aW5ncywgJnBhcmVudC0+Y2hpbGRyZW4sIHNpYmxpbmdzICkgeworCQlpZiAoIHN0cmNtcCAoIHNldHRpbmdzLT5uYW1lLCBuYW1lICkgPT0gMCApCisJCQlyZXR1cm4gc2V0dGluZ3M7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRmluZCBvciBjcmVhdGUgY2hpbGQgbmFtZWQgc2V0dGluZ3MgYmxvY2sKKyAqCisgKiBAdiBwYXJlbnQJCVBhcmVudCBzZXR0aW5ncyBibG9jaworICogQHYgbmFtZQkJTmFtZSB3aXRoaW4gdGhpcyBwYXJlbnQKKyAqIEByZXQgc2V0dGluZ3MJU2V0dGluZ3MgYmxvY2ssIG9yIE5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBzZXR0aW5ncyAqIGF1dG92aXZpZnlfY2hpbGRfc2V0dGluZ3MgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnBhcmVudCwKKwkJCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSApIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ2VuZXJpY19zZXR0aW5ncyBnZW5lcmljOworCQljaGFyIG5hbWVbIHN0cmxlbiAoIG5hbWUgKSArIDEgLyogTlVMICovIF07CisJfSAqbmV3X2NoaWxkOworCXN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3M7CisKKwkvKiBSZXR1cm4gZXhpc3Rpbmcgc2V0dGluZ3MsIGlmIGV4aXN0ZW50ICovCisJaWYgKCAoIHNldHRpbmdzID0gZmluZF9jaGlsZF9zZXR0aW5ncyAoIHBhcmVudCwgbmFtZSApICkgIT0gTlVMTCApCisJCXJldHVybiBzZXR0aW5nczsKKworCS8qIENyZWF0ZSBuZXcgZ2VuZXJpYyBzZXR0aW5ncyBibG9jayAqLworCW5ld19jaGlsZCA9IHphbGxvYyAoIHNpemVvZiAoICpuZXdfY2hpbGQgKSApOworCWlmICggISBuZXdfY2hpbGQgKSB7CisJCURCR0MgKCBwYXJlbnQsICJTZXR0aW5ncyAlcCBjb3VsZCBub3QgY3JlYXRlIGNoaWxkICVzXG4iLAorCQkgICAgICAgcGFyZW50LCBuYW1lICk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1jcHkgKCBuZXdfY2hpbGQtPm5hbWUsIG5hbWUsIHNpemVvZiAoIG5ld19jaGlsZC0+bmFtZSApICk7CisJZ2VuZXJpY19zZXR0aW5nc19pbml0ICggJm5ld19jaGlsZC0+Z2VuZXJpYywgTlVMTCwgbmV3X2NoaWxkLT5uYW1lICk7CisJc2V0dGluZ3MgPSAmbmV3X2NoaWxkLT5nZW5lcmljLnNldHRpbmdzOworCXJlZ2lzdGVyX3NldHRpbmdzICggc2V0dGluZ3MsIHBhcmVudCApOworCXJldHVybiBzZXR0aW5nczsKK30KKworLyoqCisgKiBSZXR1cm4gc2V0dGluZ3MgYmxvY2sgbmFtZSAoZm9yIGRlYnVnIG9ubHkpCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAcmV0IG5hbWUJCVNldHRpbmdzIGJsb2NrIG5hbWUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBzZXR0aW5nc19uYW1lICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncyApIHsKKwlzdGF0aWMgY2hhciBidWZbNjRdOworCWNoYXIgdG1wWyBzaXplb2YgKCBidWYgKSBdOworCWludCBjb3VudDsKKworCWZvciAoIGNvdW50ID0gMCA7IHNldHRpbmdzIDsgc2V0dGluZ3MgPSBzZXR0aW5ncy0+cGFyZW50ICkgeworCQltZW1jcHkgKCB0bXAsIGJ1Ziwgc2l6ZW9mICggdG1wICkgKTsKKwkJc25wcmludGYgKCBidWYsIHNpemVvZiAoIGJ1ZiApLCAiJXMlYyVzIiwgc2V0dGluZ3MtPm5hbWUsCisJCQkgICAoIGNvdW50KysgPyAnLicgOiAnXDAnICksIHRtcCApOworCX0KKwlyZXR1cm4gKCBidWYgKyAxICk7Cit9CisKKy8qKgorICogUGFyc2Ugc2V0dGluZ3MgYmxvY2sgbmFtZQorICoKKyAqIEB2IG5hbWUJCU5hbWUKKyAqIEB2IGdldF9jaGlsZAkJRnVuY3Rpb24gdG8gZmluZCBvciBjcmVhdGUgY2hpbGQgc2V0dGluZ3MgYmxvY2sKKyAqIEByZXQgc2V0dGluZ3MJU2V0dGluZ3MgYmxvY2ssIG9yIE5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBzZXR0aW5ncyAqCitwYXJzZV9zZXR0aW5nc19uYW1lICggY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgc3RydWN0IHNldHRpbmdzICogKCAqIGdldF9jaGlsZCApICggc3RydWN0IHNldHRpbmdzICosCisJCQkJCQkJICBjb25zdCBjaGFyICogKSApIHsKKwlzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzID0gJnNldHRpbmdzX3Jvb3Q7CisJY2hhciBuYW1lX2NvcHlbIHN0cmxlbiAoIG5hbWUgKSArIDEgXTsKKwljaGFyICpzdWJuYW1lOworCWNoYXIgKnJlbWFpbmRlcjsKKworCS8qIENyZWF0ZSBtb2RpZmlhYmxlIGNvcHkgb2YgbmFtZSAqLworCW1lbWNweSAoIG5hbWVfY29weSwgbmFtZSwgc2l6ZW9mICggbmFtZV9jb3B5ICkgKTsKKwlyZW1haW5kZXIgPSBuYW1lX2NvcHk7CisKKwkvKiBQYXJzZSBlYWNoIG5hbWUgY29tcG9uZW50IGluIHR1cm4gKi8KKwl3aGlsZSAoIHJlbWFpbmRlciApIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCQlzdWJuYW1lID0gcmVtYWluZGVyOworCQlyZW1haW5kZXIgPSBzdHJjaHIgKCBzdWJuYW1lLCAnLicgKTsKKwkJaWYgKCByZW1haW5kZXIgKQorCQkJKihyZW1haW5kZXIrKykgPSAnXDAnOworCisJCS8qIFNwZWNpYWwgY2FzZSAibmV0WCIgcm9vdCBzZXR0aW5ncyBibG9jayAqLworCQlpZiAoICggc3VibmFtZSA9PSBuYW1lX2NvcHkgKSAmJiAhIHN0cmNtcCAoIHN1Ym5hbWUsICJuZXRYIiApICYmCisJCSAgICAgKCAoIG5ldGRldiA9IGxhc3Rfb3BlbmVkX25ldGRldigpICkgIT0gTlVMTCApICkKKwkJCXNldHRpbmdzID0gZ2V0X2NoaWxkICggc2V0dGluZ3MsIG5ldGRldi0+bmFtZSApOworCQllbHNlCisJCQlzZXR0aW5ncyA9IGdldF9jaGlsZCAoIHNldHRpbmdzLCBzdWJuYW1lICk7CisKKwkJaWYgKCAhIHNldHRpbmdzICkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBzZXR0aW5nczsKK30KKworLyoqCisgKiBGaW5kIG5hbWVkIHNldHRpbmdzIGJsb2NrCisgKgorICogQHYgbmFtZQkJTmFtZQorICogQHJldCBzZXR0aW5ncwlTZXR0aW5ncyBibG9jaywgb3IgTlVMTAorICovCitzdHJ1Y3Qgc2V0dGluZ3MgKiBmaW5kX3NldHRpbmdzICggY29uc3QgY2hhciAqbmFtZSApIHsKKworCXJldHVybiBwYXJzZV9zZXR0aW5nc19uYW1lICggbmFtZSwgZmluZF9jaGlsZF9zZXR0aW5ncyApOworfQorCisvKioKKyAqIEFwcGx5IGFsbCBzZXR0aW5ncworICoKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGFwcGx5X3NldHRpbmdzICggdm9pZCApIHsKKwlzdHJ1Y3Qgc2V0dGluZ3NfYXBwbGljYXRvciAqYXBwbGljYXRvcjsKKwlpbnQgcmM7CisKKwkvKiBDYWxsIGFsbCBzZXR0aW5ncyBhcHBsaWNhdG9ycyAqLworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggYXBwbGljYXRvciwgU0VUVElOR1NfQVBQTElDQVRPUlMgKSB7CisJCWlmICggKCByYyA9IGFwcGxpY2F0b3ItPmFwcGx5KCkgKSAhPSAwICkgeworCQkJREJHICggIkNvdWxkIG5vdCBhcHBseSBzZXR0aW5ncyB1c2luZyBhcHBsaWNhdG9yICIKKwkJCSAgICAgICIlcDogJXNcbiIsIGFwcGxpY2F0b3IsIHN0cmVycm9yICggcmMgKSApOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVwcmlvcml0aXNlIHNldHRpbmdzCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKgorICogUmVvcmRlcnMgdGhlIHNldHRpbmdzIGJsb2NrIGFtb25nc3QgaXRzIHNpYmxpbmdzIGFjY29yZGluZyB0byBpdHMKKyAqIHByaW9yaXR5LgorICovCitzdGF0aWMgdm9pZCByZXByaW9yaXRpc2Vfc2V0dGluZ3MgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzICkgeworCXN0cnVjdCBzZXR0aW5ncyAqcGFyZW50ID0gc2V0dGluZ3MtPnBhcmVudDsKKwlsb25nIHByaW9yaXR5OworCXN0cnVjdCBzZXR0aW5ncyAqdG1wOworCWxvbmcgdG1wX3ByaW9yaXR5OworCisJLyogU3RvcCB3aGVuIHdlIHJlYWNoIHRoZSB0b3Agb2YgdGhlIHRyZWUgKi8KKwlpZiAoICEgcGFyZW50ICkKKwkJcmV0dXJuOworCisJLyogUmVhZCBwcmlvcml0eSwgaWYgcHJlc2VudCAqLworCXByaW9yaXR5ID0gZmV0Y2hfaW50el9zZXR0aW5nICggc2V0dGluZ3MsICZwcmlvcml0eV9zZXR0aW5nICk7CisKKwkvKiBSZW1vdmUgZnJvbSBzaWJsaW5ncyBsaXN0ICovCisJbGlzdF9kZWwgKCAmc2V0dGluZ3MtPnNpYmxpbmdzICk7CisKKwkvKiBSZWluc2VydCBhZnRlciBhbnkgZXhpc3RpbmcgYmxvY2tzIHdoaWNoIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggdG1wLCAmcGFyZW50LT5jaGlsZHJlbiwgc2libGluZ3MgKSB7CisJCXRtcF9wcmlvcml0eSA9IGZldGNoX2ludHpfc2V0dGluZyAoIHRtcCwgJnByaW9yaXR5X3NldHRpbmcgKTsKKwkJaWYgKCBwcmlvcml0eSA+IHRtcF9wcmlvcml0eSApCisJCQlicmVhazsKKwl9CisJbGlzdF9hZGRfdGFpbCAoICZzZXR0aW5ncy0+c2libGluZ3MsICZ0bXAtPnNpYmxpbmdzICk7CisKKwkvKiBSZWN1cnNlIHVwIHRoZSB0cmVlICovCisJcmVwcmlvcml0aXNlX3NldHRpbmdzICggcGFyZW50ICk7Cit9CisKKy8qKgorICogUmVnaXN0ZXIgc2V0dGluZ3MgYmxvY2sKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2sKKyAqIEB2IHBhcmVudAkJUGFyZW50IHNldHRpbmdzIGJsb2NrLCBvciBOVUxMCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHJlZ2lzdGVyX3NldHRpbmdzICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmdzICpwYXJlbnQgKSB7CisJc3RydWN0IHNldHRpbmdzICpvbGRfc2V0dGluZ3M7CisKKwkvKiBOVUxMIHBhcmVudCA9PiBhZGQgdG8gc2V0dGluZ3Mgcm9vdCAqLworCWFzc2VydCAoIHNldHRpbmdzICE9IE5VTEwgKTsKKwlpZiAoIHBhcmVudCA9PSBOVUxMICkKKwkJcGFyZW50ID0gJnNldHRpbmdzX3Jvb3Q7CisKKwkvKiBSZW1vdmUgYW55IGV4aXN0aW5nIHNldHRpbmdzIHdpdGggdGhlIHNhbWUgbmFtZSAqLworCWlmICggKCBvbGRfc2V0dGluZ3MgPSBmaW5kX2NoaWxkX3NldHRpbmdzICggcGFyZW50LCBzZXR0aW5ncy0+bmFtZSApICkpCisJCXVucmVnaXN0ZXJfc2V0dGluZ3MgKCBvbGRfc2V0dGluZ3MgKTsKKworCS8qIEFkZCB0byBsaXN0IG9mIHNldHRpbmdzICovCisJcmVmX2dldCAoIHNldHRpbmdzLT5yZWZjbnQgKTsKKwlyZWZfZ2V0ICggcGFyZW50LT5yZWZjbnQgKTsKKwlzZXR0aW5ncy0+cGFyZW50ID0gcGFyZW50OworCWxpc3RfYWRkX3RhaWwgKCAmc2V0dGluZ3MtPnNpYmxpbmdzLCAmcGFyZW50LT5jaGlsZHJlbiApOworCURCR0MgKCBzZXR0aW5ncywgIlNldHRpbmdzICVwIChcIiVzXCIpIHJlZ2lzdGVyZWRcbiIsCisJICAgICAgIHNldHRpbmdzLCBzZXR0aW5nc19uYW1lICggc2V0dGluZ3MgKSApOworCisJLyogRml4IHVwIHNldHRpbmdzIHByaW9yaXR5ICovCisJcmVwcmlvcml0aXNlX3NldHRpbmdzICggc2V0dGluZ3MgKTsKKworCS8qIEFwcGx5IHBvdGVudGlhbGx5LXVwZGF0ZWQgc2V0dGluZ3MgKi8KKwlhcHBseV9zZXR0aW5ncygpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVW5yZWdpc3RlciBzZXR0aW5ncyBibG9jaworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICovCit2b2lkIHVucmVnaXN0ZXJfc2V0dGluZ3MgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzICkgeworCisJREJHQyAoIHNldHRpbmdzLCAiU2V0dGluZ3MgJXAgKFwiJXNcIikgdW5yZWdpc3RlcmVkXG4iLAorCSAgICAgICBzZXR0aW5ncywgc2V0dGluZ3NfbmFtZSAoIHNldHRpbmdzICkgKTsKKworCS8qIFJlbW92ZSBmcm9tIGxpc3Qgb2Ygc2V0dGluZ3MgKi8KKwlyZWZfcHV0ICggc2V0dGluZ3MtPnJlZmNudCApOworCXJlZl9wdXQgKCBzZXR0aW5ncy0+cGFyZW50LT5yZWZjbnQgKTsKKwlzZXR0aW5ncy0+cGFyZW50ID0gTlVMTDsKKwlsaXN0X2RlbCAoICZzZXR0aW5ncy0+c2libGluZ3MgKTsKKworCS8qIEFwcGx5IHBvdGVudGlhbGx5LXVwZGF0ZWQgc2V0dGluZ3MgKi8KKwlhcHBseV9zZXR0aW5ncygpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29yZSBzZXR0aW5ncyByb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFN0b3JlIHZhbHVlIG9mIHNldHRpbmcKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2ssIG9yIE5VTEwKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gc3RvcmUKKyAqIEB2IGRhdGEJCVNldHRpbmcgZGF0YSwgb3IgTlVMTCB0byBjbGVhciBzZXR0aW5nCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBzZXR0aW5nIGRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgc3RvcmVfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlpbnQgcmM7CisKKwkvKiBOVUxMIHNldHRpbmdzIGltcGxpZXMgc3RvcmluZyBpbnRvIHRoZSBnbG9iYWwgc2V0dGluZ3Mgcm9vdCAqLworCWlmICggISBzZXR0aW5ncyApCisJCXNldHRpbmdzID0gJnNldHRpbmdzX3Jvb3Q7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoICEgc2V0dGluZ3MtPm9wLT5zdG9yZSApCisJCXJldHVybiAtRU5PVFNVUDsKKworCS8qIFN0b3JlIHNldHRpbmcgKi8KKwlpZiAoICggcmMgPSBzZXR0aW5ncy0+b3AtPnN0b3JlICggc2V0dGluZ3MsIHNldHRpbmcsCisJCQkJCSAgZGF0YSwgbGVuICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogUmVwcmlvcml0aXNlIHNldHRpbmdzIGlmIG5lY2Vzc2FyeSAqLworCWlmICggc2V0dGluZ19jbXAgKCBzZXR0aW5nLCAmcHJpb3JpdHlfc2V0dGluZyApID09IDAgKQorCQlyZXByaW9yaXRpc2Vfc2V0dGluZ3MgKCBzZXR0aW5ncyApOworCisJLyogSWYgdGhlc2Ugc2V0dGluZ3MgYXJlIHJlZ2lzdGVyZWQsIGFwcGx5IHBvdGVudGlhbGx5LXVwZGF0ZWQKKwkgKiBzZXR0aW5ncworCSAqLworCWZvciAoIDsgc2V0dGluZ3MgOyBzZXR0aW5ncyA9IHNldHRpbmdzLT5wYXJlbnQgKSB7CisJCWlmICggc2V0dGluZ3MgPT0gJnNldHRpbmdzX3Jvb3QgKSB7CisJCQlpZiAoICggcmMgPSBhcHBseV9zZXR0aW5ncygpICkgIT0gMCApCisJCQkJcmV0dXJuIHJjOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBGZXRjaCB2YWx1ZSBvZiBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrLCBvciBOVUxMIHRvIHNlYXJjaCBhbGwgYmxvY2tzCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZldGNoCisgKiBAdiBkYXRhCQlCdWZmZXIgdG8gZmlsbCB3aXRoIHNldHRpbmcgZGF0YQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YSwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqCisgKiBUaGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgc2V0dGluZyB3aWxsIGJlIHJldHVybmVkIGV2ZW4gaWYKKyAqIHRoZSBidWZmZXIgd2FzIHRvbyBzbWFsbC4KKyAqLworaW50IGZldGNoX3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJICAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IHNldHRpbmdzICpjaGlsZDsKKwlpbnQgcmV0OworCisJLyogQXZvaWQgcmV0dXJuaW5nIHVuaW5pdGlhbGlzZWQgZGF0YSBvbiBlcnJvciAqLworCW1lbXNldCAoIGRhdGEsIDAsIGxlbiApOworCisJLyogTlVMTCBzZXR0aW5ncyBpbXBsaWVzIHN0YXJ0aW5nIGF0IHRoZSBnbG9iYWwgc2V0dGluZ3Mgcm9vdCAqLworCWlmICggISBzZXR0aW5ncyApCisJCXNldHRpbmdzID0gJnNldHRpbmdzX3Jvb3Q7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoICEgc2V0dGluZ3MtPm9wLT5mZXRjaCApCisJCXJldHVybiAtRU5PVFNVUDsKKworCS8qIFRyeSB0aGlzIGJsb2NrIGZpcnN0ICovCisJaWYgKCAoIHJldCA9IHNldHRpbmdzLT5vcC0+ZmV0Y2ggKCBzZXR0aW5ncywgc2V0dGluZywKKwkJCQkJICAgZGF0YSwgbGVuICkgKSA+PSAwICkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlY3Vyc2UgaW50byBlYWNoIGNoaWxkIGJsb2NrIGluIHR1cm4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggY2hpbGQsICZzZXR0aW5ncy0+Y2hpbGRyZW4sIHNpYmxpbmdzICkgeworCQlpZiAoICggcmV0ID0gZmV0Y2hfc2V0dGluZyAoIGNoaWxkLCBzZXR0aW5nLAorCQkJCQkgICAgIGRhdGEsIGxlbiApICkgPj0gMCApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqIEZldGNoIGxlbmd0aCBvZiBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrLCBvciBOVUxMIHRvIHNlYXJjaCBhbGwgYmxvY2tzCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZldGNoCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YSwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgYXMgYW4gZXhpc3RlbmNlIGNoZWNrIGZvciB0aGUKKyAqIHNldHRpbmcuCisgKi8KK2ludCBmZXRjaF9zZXR0aW5nX2xlbiAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nICkgeworCXJldHVybiBmZXRjaF9zZXR0aW5nICggc2V0dGluZ3MsIHNldHRpbmcsIE5VTEwsIDAgKTsKK30KKworLyoqCisgKiBGZXRjaCB2YWx1ZSBvZiBzdHJpbmcgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgZGF0YQkJQnVmZmVyIHRvIGZpbGwgd2l0aCBzZXR0aW5nIHN0cmluZyBkYXRhCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBidWZmZXIKKyAqIEByZXQgbGVuCQlMZW5ndGggb2Ygc3RyaW5nIHNldHRpbmcsIG9yIG5lZ2F0aXZlIGVycm9yCisgKgorICogVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0bHkgTlVMLXRlcm1pbmF0ZWQuCisgKiBUaGUgcmV0dXJuZWQgbGVuZ3RoIHdpbGwgYmUgdGhlIGxlbmd0aCBvZiB0aGUgdW5kZXJseWluZyBzZXR0aW5nCisgKiBkYXRhLgorICovCitpbnQgZmV0Y2hfc3RyaW5nX3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCSAgIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJbWVtc2V0ICggZGF0YSwgMCwgbGVuICk7CisJcmV0dXJuIGZldGNoX3NldHRpbmcgKCBzZXR0aW5ncywgc2V0dGluZywgZGF0YSwKKwkJCSAgICAgICAoICggbGVuID4gMCApID8gKCBsZW4gLSAxICkgOiAwICkgKTsKK30KKworLyoqCisgKiBGZXRjaCB2YWx1ZSBvZiBzdHJpbmcgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgZGF0YQkJQnVmZmVyIHRvIGFsbG9jYXRlIGFuZCBmaWxsIHdpdGggc2V0dGluZyBzdHJpbmcgZGF0YQorICogQHJldCBsZW4JCUxlbmd0aCBvZiBzdHJpbmcgc2V0dGluZywgb3IgbmVnYXRpdmUgZXJyb3IKKyAqCisgKiBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3RseSBOVUwtdGVybWluYXRlZC4KKyAqIFRoZSByZXR1cm5lZCBsZW5ndGggd2lsbCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSB1bmRlcmx5aW5nIHNldHRpbmcKKyAqIGRhdGEuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBldmVudHVhbGx5IGZyZWVpbmcgdGhlCisgKiBhbGxvY2F0ZWQgYnVmZmVyLgorICovCitpbnQgZmV0Y2hfc3RyaW5nX3NldHRpbmdfY29weSAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkJY2hhciAqKmRhdGEgKSB7CisJaW50IGxlbjsKKwlpbnQgY2hlY2tfbGVuID0gMDsKKworCWxlbiA9IGZldGNoX3NldHRpbmdfbGVuICggc2V0dGluZ3MsIHNldHRpbmcgKTsKKwlpZiAoIGxlbiA8IDAgKQorCQlyZXR1cm4gbGVuOworCisJKmRhdGEgPSBtYWxsb2MgKCBsZW4gKyAxICk7CisJaWYgKCAhICpkYXRhICkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGVja19sZW4gPSBmZXRjaF9zdHJpbmdfc2V0dGluZyAoIHNldHRpbmdzLCBzZXR0aW5nLCAqZGF0YSwKKwkJCQkJICAgKCBsZW4gKyAxICkgKTsKKwlhc3NlcnQgKCBjaGVja19sZW4gPT0gbGVuICk7CisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBGZXRjaCB2YWx1ZSBvZiBJUHY0IGFkZHJlc3Mgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgaW5wCQlJUHY0IGFkZHJlc3MgdG8gZmlsbCBpbgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBzZXR0aW5nLCBvciBuZWdhdGl2ZSBlcnJvcgorICovCitpbnQgZmV0Y2hfaXB2NF9zZXR0aW5nICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgc3RydWN0IGluX2FkZHIgKmlucCApIHsKKwlpbnQgbGVuOworCisJbGVuID0gZmV0Y2hfc2V0dGluZyAoIHNldHRpbmdzLCBzZXR0aW5nLCBpbnAsIHNpemVvZiAoICppbnAgKSApOworCWlmICggbGVuIDwgMCApCisJCXJldHVybiBsZW47CisJaWYgKCBsZW4gPCAoIGludCApIHNpemVvZiAoICppbnAgKSApCisJCXJldHVybiAtRVJBTkdFOworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogRmV0Y2ggdmFsdWUgb2Ygc2lnbmVkIGludGVnZXIgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgdmFsdWUJCUludGVnZXIgdmFsdWUgdG8gZmlsbCBpbgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBzZXR0aW5nLCBvciBuZWdhdGl2ZSBlcnJvcgorICovCitpbnQgZmV0Y2hfaW50X3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCWxvbmcgKnZhbHVlICkgeworCXVuaW9uIHsKKwkJdWludDhfdCB1OFsgc2l6ZW9mICggbG9uZyApIF07CisJCWludDhfdCBzOFsgc2l6ZW9mICggbG9uZyApIF07CisJfSBidWY7CisJaW50IGxlbjsKKwlpbnQgaTsKKworCS8qIEF2b2lkIHJldHVybmluZyB1bmluaXRpYWxpc2VkIGRhdGEgb24gZXJyb3IgKi8KKwkqdmFsdWUgPSAwOworCisJLyogRmV0Y2ggcmF3IChuZXR3b3JrLW9yZGVyZWQsIHZhcmlhYmxlLWxlbmd0aCkgc2V0dGluZyAqLworCWxlbiA9IGZldGNoX3NldHRpbmcgKCBzZXR0aW5ncywgc2V0dGluZywgJmJ1Ziwgc2l6ZW9mICggYnVmICkgKTsKKwlpZiAoIGxlbiA8IDAgKQorCQlyZXR1cm4gbGVuOworCWlmICggbGVuID4gKCBpbnQgKSBzaXplb2YgKCBidWYgKSApCisJCXJldHVybiAtRVJBTkdFOworCisJLyogQ29udmVydCB0byBob3N0LW9yZGVyZWQgc2lnbmVkIGxvbmcgKi8KKwkqdmFsdWUgPSAoICggYnVmLnM4WzBdID49IDAgKSA/IDAgOiAtMUwgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBsZW4gOyBpKysgKSB7CisJCSp2YWx1ZSA9ICggKCAqdmFsdWUgPDwgOCApIHwgYnVmLnU4W2ldICk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBGZXRjaCB2YWx1ZSBvZiB1bnNpZ25lZCBpbnRlZ2VyIHNldHRpbmcKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2ssIG9yIE5VTEwgdG8gc2VhcmNoIGFsbCBibG9ja3MKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gZmV0Y2gKKyAqIEB2IHZhbHVlCQlJbnRlZ2VyIHZhbHVlIHRvIGZpbGwgaW4KKyAqIEByZXQgbGVuCQlMZW5ndGggb2Ygc2V0dGluZywgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworaW50IGZldGNoX3VpbnRfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJIHVuc2lnbmVkIGxvbmcgKnZhbHVlICkgeworCWxvbmcgc3ZhbHVlOworCWludCBsZW47CisKKwkvKiBBdm9pZCByZXR1cm5pbmcgdW5pbml0aWFsaXNlZCBkYXRhIG9uIGVycm9yICovCisJKnZhbHVlID0gMDsKKworCS8qIEZldGNoIGFzIGEgc2lnbmVkIGxvbmcgKi8KKwlsZW4gPSBmZXRjaF9pbnRfc2V0dGluZyAoIHNldHRpbmdzLCBzZXR0aW5nLCAmc3ZhbHVlICk7CisJaWYgKCBsZW4gPCAwICkKKwkJcmV0dXJuIGxlbjsKKworCS8qIE1hc2sgb2ZmIHNpZ24tZXh0ZW5kZWQgYml0cyAqLworCWFzc2VydCAoIGxlbiA8PSAoIGludCApIHNpemVvZiAoIGxvbmcgKSApOworCSp2YWx1ZSA9ICggc3ZhbHVlICYgKCAtMVVMID4+ICggOCAqICggc2l6ZW9mICggbG9uZyApIC0gbGVuICkgKSApICk7CisKKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIEZldGNoIHZhbHVlIG9mIHNpZ25lZCBpbnRlZ2VyIHNldHRpbmcsIG9yIHplcm8KKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2ssIG9yIE5VTEwgdG8gc2VhcmNoIGFsbCBibG9ja3MKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gZmV0Y2gKKyAqIEByZXQgdmFsdWUJCVNldHRpbmcgdmFsdWUsIG9yIHplcm8KKyAqLworbG9uZyBmZXRjaF9pbnR6X3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZyApeworCWxvbmcgdmFsdWU7CisKKwlmZXRjaF9pbnRfc2V0dGluZyAoIHNldHRpbmdzLCBzZXR0aW5nLCAmdmFsdWUgKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogRmV0Y2ggdmFsdWUgb2YgdW5zaWduZWQgaW50ZWdlciBzZXR0aW5nLCBvciB6ZXJvCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrLCBvciBOVUxMIHRvIHNlYXJjaCBhbGwgYmxvY2tzCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZldGNoCisgKiBAcmV0IHZhbHVlCQlTZXR0aW5nIHZhbHVlLCBvciB6ZXJvCisgKi8KK3Vuc2lnbmVkIGxvbmcgZmV0Y2hfdWludHpfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJICAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nICkgeworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwlmZXRjaF91aW50X3NldHRpbmcgKCBzZXR0aW5ncywgc2V0dGluZywgJnZhbHVlICk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEZldGNoIHZhbHVlIG9mIFVVSUQgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgdXVpZAkJVVVJRCB0byBmaWxsIGluCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK2ludCBmZXRjaF91dWlkX3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCSB1bmlvbiB1dWlkICp1dWlkICkgeworCWludCBsZW47CisKKwlsZW4gPSBmZXRjaF9zZXR0aW5nICggc2V0dGluZ3MsIHNldHRpbmcsIHV1aWQsIHNpemVvZiAoICp1dWlkICkgKTsKKwlpZiAoIGxlbiA8IDAgKQorCQlyZXR1cm4gbGVuOworCWlmICggbGVuICE9IHNpemVvZiAoICp1dWlkICkgKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIENsZWFyIHNldHRpbmdzIGJsb2NrCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKi8KK3ZvaWQgY2xlYXJfc2V0dGluZ3MgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzICkgeworCWlmICggc2V0dGluZ3MtPm9wLT5jbGVhciApCisJCXNldHRpbmdzLT5vcC0+Y2xlYXIgKCBzZXR0aW5ncyApOworfQorCisvKioKKyAqIENvbXBhcmUgdHdvIHNldHRpbmdzCisgKgorICogQHYgYQkJCVNldHRpbmcgdG8gY29tcGFyZQorICogQHYgYgkJCVNldHRpbmcgdG8gY29tcGFyZQorICogQHJldCAwCQlTZXR0aW5ncyBhcmUgdGhlIHNhbWUKKyAqIEByZXQgbm9uLXplcm8JU2V0dGluZ3MgYXJlIG5vdCB0aGUgc2FtZQorICovCitpbnQgc2V0dGluZ19jbXAgKCBzdHJ1Y3Qgc2V0dGluZyAqYSwgc3RydWN0IHNldHRpbmcgKmIgKSB7CisKKwkvKiBJZiB0aGUgc2V0dGluZ3MgaGF2ZSB0YWdzLCBjb21wYXJlIHRoZW0gKi8KKwlpZiAoIGEtPnRhZyAmJiAoIGEtPnRhZyA9PSBiLT50YWcgKSApCisJCXJldHVybiAwOworCisJLyogT3RoZXJ3aXNlLCBpZiB0aGUgc2V0dGluZ3MgaGF2ZSBuYW1lcywgY29tcGFyZSB0aGVtICovCisJaWYgKCBhLT5uYW1lICYmIGItPm5hbWUgJiYgYS0+bmFtZVswXSApCisJCXJldHVybiBzdHJjbXAgKCBhLT5uYW1lLCBiLT5uYW1lICk7CisKKwkvKiBPdGhlcndpc2UsIHJldHVybiBhIG5vbi1tYXRjaCAqLworCXJldHVybiAoICEgMCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRm9ybWF0dGVkIHNldHRpbmcgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBTdG9yZSB2YWx1ZSBvZiB0eXBlZCBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIHN0b3JlCisgKiBAdiB0eXBlCQlTZXR0aW5ncyB0eXBlCisgKiBAdiB2YWx1ZQkJRm9ybWF0dGVkIHNldHRpbmcgZGF0YSwgb3IgTlVMTAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBzdG9yZWZfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkgICAgIGNvbnN0IGNoYXIgKnZhbHVlICkgeworCisJLyogTlVMTCB2YWx1ZSBpbXBsaWVzIGRlbGV0aW9uLiAgQXZvaWQgaW1wb3NpbmcgdGhlIGJ1cmRlbiBvZgorCSAqIGNoZWNraW5nIGZvciBOVUxMIHZhbHVlcyBvbiBlYWNoIHR5cGVkIHNldHRpbmcncyBzdG9yZWYoKQorCSAqIG1ldGhvZC4KKwkgKi8KKwlpZiAoICEgdmFsdWUgKQorCQlyZXR1cm4gZGVsZXRlX3NldHRpbmcgKCBzZXR0aW5ncywgc2V0dGluZyApOworCQkKKwlyZXR1cm4gc2V0dGluZy0+dHlwZS0+c3RvcmVmICggc2V0dGluZ3MsIHNldHRpbmcsIHZhbHVlICk7Cit9CisKKy8qKgorICogRmluZCBuYW1lZCBzZXR0aW5nCisgKgorICogQHYgbmFtZQkJTmFtZQorICogQHJldCBzZXR0aW5nCQlOYW1lZCBzZXR0aW5nLCBvciBOVUxMCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2V0dGluZyAqIGZpbmRfc2V0dGluZyAoIGNvbnN0IGNoYXIgKm5hbWUgKSB7CisJc3RydWN0IHNldHRpbmcgKnNldHRpbmc7CisKKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIHNldHRpbmcsIFNFVFRJTkdTICkgeworCQlpZiAoIHN0cmNtcCAoIG5hbWUsIHNldHRpbmctPm5hbWUgKSA9PSAwICkKKwkJCXJldHVybiBzZXR0aW5nOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBQYXJzZSBzZXR0aW5nIG5hbWUgYXMgdGFnIG51bWJlcgorICoKKyAqIEB2IG5hbWUJCU5hbWUKKyAqIEByZXQgdGFnCQlUYWcgbnVtYmVyLCBvciAwIGlmIG5vdCBhIHZhbGlkIG51bWJlcgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBhcnNlX3NldHRpbmdfdGFnICggY29uc3QgY2hhciAqbmFtZSApIHsKKwljaGFyICp0bXAgPSAoICggY2hhciAqICkgbmFtZSApOworCXVuc2lnbmVkIGludCB0YWcgPSAwOworCisJd2hpbGUgKCAxICkgeworCQl0YWcgPSAoICggdGFnIDw8IDggKSB8IHN0cnRvdWwgKCB0bXAsICZ0bXAsIDAgKSApOworCQlpZiAoICp0bXAgPT0gMCApCisJCQlyZXR1cm4gdGFnOworCQlpZiAoICp0bXAgIT0gJy4nICkKKwkJCXJldHVybiAwOworCQl0bXArKzsKKwl9Cit9CisKKy8qKgorICogRmluZCBzZXR0aW5nIHR5cGUKKyAqCisgKiBAdiBuYW1lCQlOYW1lCisgKiBAcmV0IHR5cGUJCVNldHRpbmcgdHlwZSwgb3IgTlVMTAorICovCitzdGF0aWMgc3RydWN0IHNldHRpbmdfdHlwZSAqIGZpbmRfc2V0dGluZ190eXBlICggY29uc3QgY2hhciAqbmFtZSApIHsKKwlzdHJ1Y3Qgc2V0dGluZ190eXBlICp0eXBlOworCisJZm9yX2VhY2hfdGFibGVfZW50cnkgKCB0eXBlLCBTRVRUSU5HX1RZUEVTICkgeworCQlpZiAoIHN0cmNtcCAoIG5hbWUsIHR5cGUtPm5hbWUgKSA9PSAwICkKKwkJCXJldHVybiB0eXBlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBQYXJzZSBzZXR0aW5nIG5hbWUKKyAqCisgKiBAdiBuYW1lCQlOYW1lIG9mIHNldHRpbmcKKyAqIEB2IGdldF9jaGlsZAkJRnVuY3Rpb24gdG8gZmluZCBvciBjcmVhdGUgY2hpbGQgc2V0dGluZ3MgYmxvY2sKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jayB0byBmaWxsIGluCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZpbGwgaW4KKyAqIEB2IHRtcF9uYW1lCQlCdWZmZXIgZm9yIGNvcHkgb2Ygc2V0dGluZyBuYW1lCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBJbnRlcnByZXRzIGEgbmFtZSBvZiB0aGUgZm9ybQorICogIltzZXR0aW5nc19uYW1lL110YWdfbmFtZVs6dHlwZV9uYW1lXSIgYW5kIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZQorICogZmllbGRzLgorICoKKyAqIFRoZSBAYyB0bXBfbmFtZSBidWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIGNvcHkgb2YgdGhlCisgKiBzZXR0aW5nIG5hbWUuCisgKi8KK3N0YXRpYyBpbnQKK3BhcnNlX3NldHRpbmdfbmFtZSAoIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgc3RydWN0IHNldHRpbmdzICogKCAqIGdldF9jaGlsZCApICggc3RydWN0IHNldHRpbmdzICosCisJCQkJCQkJIGNvbnN0IGNoYXIgKiApLAorCQkgICAgIHN0cnVjdCBzZXR0aW5ncyAqKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJICAgICBjaGFyICp0bXBfbmFtZSApIHsKKwljaGFyICpzZXR0aW5nc19uYW1lOworCWNoYXIgKnNldHRpbmdfbmFtZTsKKwljaGFyICp0eXBlX25hbWU7CisJc3RydWN0IHNldHRpbmcgKm5hbWVkX3NldHRpbmc7CisKKwkvKiBTZXQgZGVmYXVsdHMgKi8KKwkqc2V0dGluZ3MgPSAmc2V0dGluZ3Nfcm9vdDsKKwltZW1zZXQgKCBzZXR0aW5nLCAwLCBzaXplb2YgKCAqc2V0dGluZyApICk7CisJc2V0dGluZy0+bmFtZSA9ICIiOworCXNldHRpbmctPnR5cGUgPSAmc2V0dGluZ190eXBlX3N0cmluZzsKKworCS8qIFNwbGl0IG5hbWUgaW50byAiW3NldHRpbmdzX25hbWUvXXNldHRpbmdfbmFtZVs6dHlwZV9uYW1lXSIgKi8KKwlzdHJjcHkgKCB0bXBfbmFtZSwgbmFtZSApOworCWlmICggKCBzZXR0aW5nX25hbWUgPSBzdHJjaHIgKCB0bXBfbmFtZSwgJy8nICkgKSAhPSBOVUxMICkgeworCQkqKHNldHRpbmdfbmFtZSsrKSA9IDA7CisJCXNldHRpbmdzX25hbWUgPSB0bXBfbmFtZTsKKwl9IGVsc2UgeworCQlzZXR0aW5nX25hbWUgPSB0bXBfbmFtZTsKKwkJc2V0dGluZ3NfbmFtZSA9IE5VTEw7CisJfQorCWlmICggKCB0eXBlX25hbWUgPSBzdHJjaHIgKCBzZXR0aW5nX25hbWUsICc6JyApICkgIT0gTlVMTCApCisJCSoodHlwZV9uYW1lKyspID0gMDsKKworCS8qIElkZW50aWZ5IHNldHRpbmdzIGJsb2NrLCBpZiBzcGVjaWZpZWQgKi8KKwlpZiAoIHNldHRpbmdzX25hbWUgKSB7CisJCSpzZXR0aW5ncyA9IHBhcnNlX3NldHRpbmdzX25hbWUgKCBzZXR0aW5nc19uYW1lLCBnZXRfY2hpbGQgKTsKKwkJaWYgKCAqc2V0dGluZ3MgPT0gTlVMTCApIHsKKwkJCURCRyAoICJVbnJlY29nbmlzZWQgc2V0dGluZ3MgYmxvY2sgXCIlc1wiIGluIFwiJXNcIlxuIiwKKwkJCSAgICAgIHNldHRpbmdzX25hbWUsIG5hbWUgKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogSWRlbnRpZnkgc2V0dGluZyAqLworCWlmICggKCBuYW1lZF9zZXR0aW5nID0gZmluZF9zZXR0aW5nICggc2V0dGluZ19uYW1lICkgKSAhPSBOVUxMICkgeworCQkvKiBNYXRjaGVzIGEgZGVmaW5lZCBuYW1lZCBzZXR0aW5nOyB1c2UgdGhhdCBzZXR0aW5nICovCisJCW1lbWNweSAoIHNldHRpbmcsIG5hbWVkX3NldHRpbmcsIHNpemVvZiAoICpzZXR0aW5nICkgKTsKKwl9IGVsc2UgaWYgKCAoIHNldHRpbmctPnRhZyA9IHBhcnNlX3NldHRpbmdfdGFnICggc2V0dGluZ19uYW1lICkgKSAhPTApeworCQkvKiBJcyBhIHZhbGlkIG51bWVyaWMgdGFnOyB1c2UgdGhlIHRhZyAqLworCQlzZXR0aW5nLT50YWcgfD0gKCpzZXR0aW5ncyktPnRhZ19tYWdpYzsKKwl9IGVsc2UgeworCQkvKiBVc2UgdGhlIGFyYml0cmFyeSBuYW1lICovCisJCXNldHRpbmctPm5hbWUgPSBzZXR0aW5nX25hbWU7CisJfQorCisJLyogSWRlbnRpZnkgc2V0dGluZyB0eXBlLCBpZiBzcGVjaWZpZWQgKi8KKwlpZiAoIHR5cGVfbmFtZSApIHsKKwkJc2V0dGluZy0+dHlwZSA9IGZpbmRfc2V0dGluZ190eXBlICggdHlwZV9uYW1lICk7CisJCWlmICggc2V0dGluZy0+dHlwZSA9PSBOVUxMICkgeworCQkJREJHICggIkludmFsaWQgc2V0dGluZyB0eXBlIFwiJXNcIiBpbiBcIiVzXCJcbiIsCisJCQkgICAgICB0eXBlX25hbWUsIG5hbWUgKTsKKwkJCXJldHVybiAtRU5PVFNVUDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIGFuZCBzdG9yZSB2YWx1ZSBvZiBuYW1lZCBzZXR0aW5nCisgKgorICogQHYgbmFtZQkJTmFtZSBvZiBzZXR0aW5nCisgKiBAdiB2YWx1ZQkJRm9ybWF0dGVkIHNldHRpbmcgZGF0YSwgb3IgTlVMTAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBzdG9yZWZfbmFtZWRfc2V0dGluZyAoIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlICkgeworCXN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3M7CisJc3RydWN0IHNldHRpbmcgc2V0dGluZzsKKwljaGFyIHRtcF9uYW1lWyBzdHJsZW4gKCBuYW1lICkgKyAxIF07CisJaW50IHJjOworCisJaWYgKCAoIHJjID0gcGFyc2Vfc2V0dGluZ19uYW1lICggbmFtZSwgYXV0b3ZpdmlmeV9jaGlsZF9zZXR0aW5ncywKKwkJCQkJICZzZXR0aW5ncywgJnNldHRpbmcsIHRtcF9uYW1lICkpICE9IDApCisJCXJldHVybiByYzsKKwlyZXR1cm4gc3RvcmVmX3NldHRpbmcgKCBzZXR0aW5ncywgJnNldHRpbmcsIHZhbHVlICk7Cit9CisKKy8qKgorICogRmV0Y2ggYW5kIGZvcm1hdCB2YWx1ZSBvZiBuYW1lZCBzZXR0aW5nCisgKgorICogQHYgbmFtZQkJTmFtZSBvZiBzZXR0aW5nCisgKiBAdiBidWYJCUJ1ZmZlciB0byBjb250YWluIGZvcm1hdHRlZCB2YWx1ZQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCB2YWx1ZSwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworaW50IGZldGNoZl9uYW1lZF9zZXR0aW5nICggY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3M7CisJc3RydWN0IHNldHRpbmcgc2V0dGluZzsKKwljaGFyIHRtcF9uYW1lWyBzdHJsZW4gKCBuYW1lICkgKyAxIF07CisJaW50IHJjOworCisJaWYgKCAoIHJjID0gcGFyc2Vfc2V0dGluZ19uYW1lICggbmFtZSwgZmluZF9jaGlsZF9zZXR0aW5ncywKKwkJCQkJICZzZXR0aW5ncywgJnNldHRpbmcsIHRtcF9uYW1lICkpICE9IDApCisJCXJldHVybiByYzsKKwlyZXR1cm4gZmV0Y2hmX3NldHRpbmcgKCBzZXR0aW5ncywgJnNldHRpbmcsIGJ1ZiwgbGVuICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXR0aW5nIHR5cGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogUGFyc2UgYW5kIHN0b3JlIHZhbHVlIG9mIHN0cmluZyBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIHN0b3JlCisgKiBAdiB2YWx1ZQkJRm9ybWF0dGVkIHNldHRpbmcgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc3RvcmVmX3N0cmluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJICAgY29uc3QgY2hhciAqdmFsdWUgKSB7CisJcmV0dXJuIHN0b3JlX3NldHRpbmcgKCBzZXR0aW5ncywgc2V0dGluZywgdmFsdWUsIHN0cmxlbiAoIHZhbHVlICkgKTsKK30KKworLyoqCisgKiBGZXRjaCBhbmQgZm9ybWF0IHZhbHVlIG9mIHN0cmluZyBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrLCBvciBOVUxMIHRvIHNlYXJjaCBhbGwgYmxvY2tzCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZldGNoCisgKiBAdiBidWYJCUJ1ZmZlciB0byBjb250YWluIGZvcm1hdHRlZCB2YWx1ZQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCB2YWx1ZSwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworc3RhdGljIGludCBmZXRjaGZfc3RyaW5nICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgICBjaGFyICpidWYsIHNpemVfdCBsZW4gKSB7CisJcmV0dXJuIGZldGNoX3N0cmluZ19zZXR0aW5nICggc2V0dGluZ3MsIHNldHRpbmcsIGJ1ZiwgbGVuICk7Cit9CisKKy8qKiBBIHN0cmluZyBzZXR0aW5nIHR5cGUgKi8KK3N0cnVjdCBzZXR0aW5nX3R5cGUgc2V0dGluZ190eXBlX3N0cmluZyBfX3NldHRpbmdfdHlwZSA9IHsKKwkubmFtZSA9ICJzdHJpbmciLAorCS5zdG9yZWYgPSBzdG9yZWZfc3RyaW5nLAorCS5mZXRjaGYgPSBmZXRjaGZfc3RyaW5nLAorfTsKKworLyoqCisgKiBQYXJzZSBhbmQgc3RvcmUgdmFsdWUgb2YgVVJJLWVuY29kZWQgc3RyaW5nIHNldHRpbmcKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2sKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gc3RvcmUKKyAqIEB2IHZhbHVlCQlGb3JtYXR0ZWQgc2V0dGluZyBkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBzdG9yZWZfdXJpc3RyaW5nICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCSAgICAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJICAgICAgY29uc3QgY2hhciAqdmFsdWUgKSB7CisJY2hhciBidWZbIHN0cmxlbiAoIHZhbHVlICkgKyAxIF07IC8qIERlY29kaW5nIG5ldmVyIGV4cGFuZHMgc3RyaW5nICovCisJc2l6ZV90IGxlbjsKKworCWxlbiA9IHVyaV9kZWNvZGUgKCB2YWx1ZSwgYnVmLCBzaXplb2YgKCBidWYgKSApOworCXJldHVybiBzdG9yZV9zZXR0aW5nICggc2V0dGluZ3MsIHNldHRpbmcsIGJ1ZiwgbGVuICk7Cit9CisKKy8qKgorICogRmV0Y2ggYW5kIGZvcm1hdCB2YWx1ZSBvZiBVUkktZW5jb2RlZCBzdHJpbmcgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgYnVmCQlCdWZmZXIgdG8gY29udGFpbiBmb3JtYXR0ZWQgdmFsdWUKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBmb3JtYXR0ZWQgdmFsdWUsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZmV0Y2hmX3VyaXN0cmluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkgICAgICBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiApIHsKKwlzc2l6ZV90IHJhd19sZW47CisKKwkvKiBXZSBuZWVkIHRvIGFsd2F5cyByZXRyaWV2ZSB0aGUgZnVsbCByYXcgc3RyaW5nIHRvIGtub3cgdGhlCisJICogbGVuZ3RoIG9mIHRoZSBlbmNvZGVkIHN0cmluZy4KKwkgKi8KKwlyYXdfbGVuID0gZmV0Y2hfc2V0dGluZyAoIHNldHRpbmdzLCBzZXR0aW5nLCBOVUxMLCAwICk7CisJaWYgKCByYXdfbGVuIDwgMCApCisJCXJldHVybiByYXdfbGVuOworCisJeworCQljaGFyIHJhd19idWZbIHJhd19sZW4gKyAxIF07CisgICAgICAgCisJCWZldGNoX3N0cmluZ19zZXR0aW5nICggc2V0dGluZ3MsIHNldHRpbmcsIHJhd19idWYsCisJCQkJICAgICAgIHNpemVvZiAoIHJhd19idWYgKSApOworCQlyZXR1cm4gdXJpX2VuY29kZSAoIHJhd19idWYsIGJ1ZiwgbGVuLCBVUklfRlJBR01FTlQgKTsKKwl9Cit9CisKKy8qKiBBIFVSSS1lbmNvZGVkIHN0cmluZyBzZXR0aW5nIHR5cGUgKi8KK3N0cnVjdCBzZXR0aW5nX3R5cGUgc2V0dGluZ190eXBlX3VyaXN0cmluZyBfX3NldHRpbmdfdHlwZSA9IHsKKwkubmFtZSA9ICJ1cmlzdHJpbmciLAorCS5zdG9yZWYgPSBzdG9yZWZfdXJpc3RyaW5nLAorCS5mZXRjaGYgPSBmZXRjaGZfdXJpc3RyaW5nLAorfTsKKworLyoqCisgKiBQYXJzZSBhbmQgc3RvcmUgdmFsdWUgb2YgSVB2NCBhZGRyZXNzIHNldHRpbmcKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2sKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gc3RvcmUKKyAqIEB2IHZhbHVlCQlGb3JtYXR0ZWQgc2V0dGluZyBkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBzdG9yZWZfaXB2NCAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJIGNvbnN0IGNoYXIgKnZhbHVlICkgeworCXN0cnVjdCBpbl9hZGRyIGlwdjQ7CisKKwlpZiAoIGluZXRfYXRvbiAoIHZhbHVlLCAmaXB2NCApID09IDAgKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc3RvcmVfc2V0dGluZyAoIHNldHRpbmdzLCBzZXR0aW5nLCAmaXB2NCwgc2l6ZW9mICggaXB2NCApICk7Cit9CisKKy8qKgorICogRmV0Y2ggYW5kIGZvcm1hdCB2YWx1ZSBvZiBJUHY0IGFkZHJlc3Mgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgYnVmCQlCdWZmZXIgdG8gY29udGFpbiBmb3JtYXR0ZWQgdmFsdWUKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBmb3JtYXR0ZWQgdmFsdWUsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZmV0Y2hmX2lwdjQgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCSBjaGFyICpidWYsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGluX2FkZHIgaXB2NDsKKwlpbnQgcmF3X2xlbjsKKworCWlmICggKCByYXdfbGVuID0gZmV0Y2hfaXB2NF9zZXR0aW5nICggc2V0dGluZ3MsIHNldHRpbmcsICZpcHY0ICkgKSA8IDApCisJCXJldHVybiByYXdfbGVuOworCXJldHVybiBzbnByaW50ZiAoIGJ1ZiwgbGVuLCAiJXMiLCBpbmV0X250b2EgKCBpcHY0ICkgKTsKK30KKworLyoqIEFuIElQdjQgYWRkcmVzcyBzZXR0aW5nIHR5cGUgKi8KK3N0cnVjdCBzZXR0aW5nX3R5cGUgc2V0dGluZ190eXBlX2lwdjQgX19zZXR0aW5nX3R5cGUgPSB7CisJLm5hbWUgPSAiaXB2NCIsCisJLnN0b3JlZiA9IHN0b3JlZl9pcHY0LAorCS5mZXRjaGYgPSBmZXRjaGZfaXB2NCwKK307CisKKy8qKgorICogUGFyc2UgYW5kIHN0b3JlIHZhbHVlIG9mIGludGVnZXIgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBzdG9yZQorICogQHYgdmFsdWUJCUZvcm1hdHRlZCBzZXR0aW5nIGRhdGEKKyAqIEB2IHNpemUJCUludGVnZXIgc2l6ZSwgaW4gYnl0ZXMKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHN0b3JlZl9pbnQgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCWNvbnN0IGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgc2l6ZSApIHsKKwl1bmlvbiB7CisJCXVpbnQzMl90IG51bTsKKwkJdWludDhfdCBieXRlc1s0XTsKKwl9IHU7CisJY2hhciAqZW5kcDsKKworCXUubnVtID0gaHRvbmwgKCBzdHJ0b3VsICggdmFsdWUsICZlbmRwLCAwICkgKTsKKwlpZiAoICplbmRwICkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHN0b3JlX3NldHRpbmcgKCBzZXR0aW5ncywgc2V0dGluZywgCisJCQkgICAgICAgJnUuYnl0ZXNbIHNpemVvZiAoIHUgKSAtIHNpemUgXSwgc2l6ZSApOworfQorCisvKioKKyAqIFBhcnNlIGFuZCBzdG9yZSB2YWx1ZSBvZiA4LWJpdCBpbnRlZ2VyIHNldHRpbmcKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2sKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gc3RvcmUKKyAqIEB2IHZhbHVlCQlGb3JtYXR0ZWQgc2V0dGluZyBkYXRhCisgKiBAdiBzaXplCQlJbnRlZ2VyIHNpemUsIGluIGJ5dGVzCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBzdG9yZWZfaW50OCAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJIGNvbnN0IGNoYXIgKnZhbHVlICkgeworCXJldHVybiBzdG9yZWZfaW50ICggc2V0dGluZ3MsIHNldHRpbmcsIHZhbHVlLCAxICk7Cit9CisKKy8qKgorICogUGFyc2UgYW5kIHN0b3JlIHZhbHVlIG9mIDE2LWJpdCBpbnRlZ2VyIHNldHRpbmcKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2sKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gc3RvcmUKKyAqIEB2IHZhbHVlCQlGb3JtYXR0ZWQgc2V0dGluZyBkYXRhCisgKiBAdiBzaXplCQlJbnRlZ2VyIHNpemUsIGluIGJ5dGVzCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBzdG9yZWZfaW50MTYgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCSAgY29uc3QgY2hhciAqdmFsdWUgKSB7CisJcmV0dXJuIHN0b3JlZl9pbnQgKCBzZXR0aW5ncywgc2V0dGluZywgdmFsdWUsIDIgKTsKK30KKworLyoqCisgKiBQYXJzZSBhbmQgc3RvcmUgdmFsdWUgb2YgMzItYml0IGludGVnZXIgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBzdG9yZQorICogQHYgdmFsdWUJCUZvcm1hdHRlZCBzZXR0aW5nIGRhdGEKKyAqIEB2IHNpemUJCUludGVnZXIgc2l6ZSwgaW4gYnl0ZXMKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHN0b3JlZl9pbnQzMiAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJICBjb25zdCBjaGFyICp2YWx1ZSApIHsKKwlyZXR1cm4gc3RvcmVmX2ludCAoIHNldHRpbmdzLCBzZXR0aW5nLCB2YWx1ZSwgNCApOworfQorCisvKioKKyAqIEZldGNoIGFuZCBmb3JtYXQgdmFsdWUgb2Ygc2lnbmVkIGludGVnZXIgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgYnVmCQlCdWZmZXIgdG8gY29udGFpbiBmb3JtYXR0ZWQgdmFsdWUKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBmb3JtYXR0ZWQgdmFsdWUsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZmV0Y2hmX2ludCAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJY2hhciAqYnVmLCBzaXplX3QgbGVuICkgeworCWxvbmcgdmFsdWU7CisJaW50IHJjOworCisJaWYgKCAoIHJjID0gZmV0Y2hfaW50X3NldHRpbmcgKCBzZXR0aW5ncywgc2V0dGluZywgJnZhbHVlICkgKSA8IDAgKQorCQlyZXR1cm4gcmM7CisJcmV0dXJuIHNucHJpbnRmICggYnVmLCBsZW4sICIlbGQiLCB2YWx1ZSApOworfQorCisvKioKKyAqIEZldGNoIGFuZCBmb3JtYXQgdmFsdWUgb2YgdW5zaWduZWQgaW50ZWdlciBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrLCBvciBOVUxMIHRvIHNlYXJjaCBhbGwgYmxvY2tzCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZldGNoCisgKiBAdiBidWYJCUJ1ZmZlciB0byBjb250YWluIGZvcm1hdHRlZCB2YWx1ZQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCB2YWx1ZSwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworc3RhdGljIGludCBmZXRjaGZfdWludCAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiApIHsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByYzsKKworCWlmICggKCByYyA9IGZldGNoX3VpbnRfc2V0dGluZyAoIHNldHRpbmdzLCBzZXR0aW5nLCAmdmFsdWUgKSApIDwgMCApCisJCXJldHVybiByYzsKKwlyZXR1cm4gc25wcmludGYgKCBidWYsIGxlbiwgIiUjbHgiLCB2YWx1ZSApOworfQorCisvKiogQSBzaWduZWQgOC1iaXQgaW50ZWdlciBzZXR0aW5nIHR5cGUgKi8KK3N0cnVjdCBzZXR0aW5nX3R5cGUgc2V0dGluZ190eXBlX2ludDggX19zZXR0aW5nX3R5cGUgPSB7CisJLm5hbWUgPSAiaW50OCIsCisJLnN0b3JlZiA9IHN0b3JlZl9pbnQ4LAorCS5mZXRjaGYgPSBmZXRjaGZfaW50LAorfTsKKworLyoqIEEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHNldHRpbmcgdHlwZSAqLworc3RydWN0IHNldHRpbmdfdHlwZSBzZXR0aW5nX3R5cGVfaW50MTYgX19zZXR0aW5nX3R5cGUgPSB7CisJLm5hbWUgPSAiaW50MTYiLAorCS5zdG9yZWYgPSBzdG9yZWZfaW50MTYsCisJLmZldGNoZiA9IGZldGNoZl9pbnQsCit9OworCisvKiogQSBzaWduZWQgMzItYml0IGludGVnZXIgc2V0dGluZyB0eXBlICovCitzdHJ1Y3Qgc2V0dGluZ190eXBlIHNldHRpbmdfdHlwZV9pbnQzMiBfX3NldHRpbmdfdHlwZSA9IHsKKwkubmFtZSA9ICJpbnQzMiIsCisJLnN0b3JlZiA9IHN0b3JlZl9pbnQzMiwKKwkuZmV0Y2hmID0gZmV0Y2hmX2ludCwKK307CisKKy8qKiBBbiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyIHNldHRpbmcgdHlwZSAqLworc3RydWN0IHNldHRpbmdfdHlwZSBzZXR0aW5nX3R5cGVfdWludDggX19zZXR0aW5nX3R5cGUgPSB7CisJLm5hbWUgPSAidWludDgiLAorCS5zdG9yZWYgPSBzdG9yZWZfaW50OCwKKwkuZmV0Y2hmID0gZmV0Y2hmX3VpbnQsCit9OworCisvKiogQW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgc2V0dGluZyB0eXBlICovCitzdHJ1Y3Qgc2V0dGluZ190eXBlIHNldHRpbmdfdHlwZV91aW50MTYgX19zZXR0aW5nX3R5cGUgPSB7CisJLm5hbWUgPSAidWludDE2IiwKKwkuc3RvcmVmID0gc3RvcmVmX2ludDE2LAorCS5mZXRjaGYgPSBmZXRjaGZfdWludCwKK307CisKKy8qKiBBbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciBzZXR0aW5nIHR5cGUgKi8KK3N0cnVjdCBzZXR0aW5nX3R5cGUgc2V0dGluZ190eXBlX3VpbnQzMiBfX3NldHRpbmdfdHlwZSA9IHsKKwkubmFtZSA9ICJ1aW50MzIiLAorCS5zdG9yZWYgPSBzdG9yZWZfaW50MzIsCisJLmZldGNoZiA9IGZldGNoZl91aW50LAorfTsKKworLyoqCisgKiBQYXJzZSBhbmQgc3RvcmUgdmFsdWUgb2YgaGV4IHN0cmluZyBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIHN0b3JlCisgKiBAdiB2YWx1ZQkJRm9ybWF0dGVkIHNldHRpbmcgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc3RvcmVmX2hleCAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJY29uc3QgY2hhciAqdmFsdWUgKSB7CisJY2hhciAqcHRyID0gKCBjaGFyICogKSB2YWx1ZTsKKwl1aW50OF90IGJ5dGVzWyBzdHJsZW4gKCB2YWx1ZSApIF07IC8qIGNhbm5vdCBleGNlZWQgc3RybGVuKHZhbHVlKSAqLworCXVuc2lnbmVkIGludCBsZW4gPSAwOworCisJd2hpbGUgKCAxICkgeworCQlieXRlc1tsZW4rK10gPSBzdHJ0b3VsICggcHRyLCAmcHRyLCAxNiApOworCQlzd2l0Y2ggKCAqcHRyICkgeworCQljYXNlICdcMCcgOgorCQkJcmV0dXJuIHN0b3JlX3NldHRpbmcgKCBzZXR0aW5ncywgc2V0dGluZywgYnl0ZXMsIGxlbiApOworCQljYXNlICc6JyA6CisJCQlwdHIrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorfQorCisvKioKKyAqIEZldGNoIGFuZCBmb3JtYXQgdmFsdWUgb2YgaGV4IHN0cmluZyBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrLCBvciBOVUxMIHRvIHNlYXJjaCBhbGwgYmxvY2tzCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZldGNoCisgKiBAdiBidWYJCUJ1ZmZlciB0byBjb250YWluIGZvcm1hdHRlZCB2YWx1ZQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCB2YWx1ZSwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworc3RhdGljIGludCBmZXRjaGZfaGV4ICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQljaGFyICpidWYsIHNpemVfdCBsZW4gKSB7CisJaW50IHJhd19sZW47CisJaW50IGNoZWNrX2xlbjsKKwlpbnQgdXNlZCA9IDA7CisJaW50IGk7CisKKwlyYXdfbGVuID0gZmV0Y2hfc2V0dGluZ19sZW4gKCBzZXR0aW5ncywgc2V0dGluZyApOworCWlmICggcmF3X2xlbiA8IDAgKQorCQlyZXR1cm4gcmF3X2xlbjsKKworCXsKKwkJdWludDhfdCByYXdbcmF3X2xlbl07CisKKwkJY2hlY2tfbGVuID0gZmV0Y2hfc2V0dGluZyAoIHNldHRpbmdzLCBzZXR0aW5nLCByYXcsCisJCQkJCSAgICBzaXplb2YgKCByYXcgKSApOworCQlpZiAoIGNoZWNrX2xlbiA8IDAgKQorCQkJcmV0dXJuIGNoZWNrX2xlbjsKKwkJYXNzZXJ0ICggY2hlY2tfbGVuID09IHJhd19sZW4gKTsKKwkJCisJCWlmICggbGVuICkKKwkJCWJ1ZlswXSA9IDA7IC8qIEVuc3VyZSB0aGF0IGEgdGVybWluYXRpbmcgTlVMIGV4aXN0cyAqLworCQlmb3IgKCBpID0gMCA7IGkgPCByYXdfbGVuIDsgaSsrICkgeworCQkJdXNlZCArPSBzc25wcmludGYgKCAoIGJ1ZiArIHVzZWQgKSwgKCBsZW4gLSB1c2VkICksCisJCQkJCSAgICAiJXMlMDJ4IiwgKCB1c2VkID8gIjoiIDogIiIgKSwKKwkJCQkJICAgIHJhd1tpXSApOworCQl9CisJCXJldHVybiB1c2VkOworCX0KK30KKworLyoqIEEgaGV4LXN0cmluZyBzZXR0aW5nICovCitzdHJ1Y3Qgc2V0dGluZ190eXBlIHNldHRpbmdfdHlwZV9oZXggX19zZXR0aW5nX3R5cGUgPSB7CisJLm5hbWUgPSAiaGV4IiwKKwkuc3RvcmVmID0gc3RvcmVmX2hleCwKKwkuZmV0Y2hmID0gZmV0Y2hmX2hleCwKK307CisKKy8qKgorICogUGFyc2UgYW5kIHN0b3JlIHZhbHVlIG9mIFVVSUQgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBzdG9yZQorICogQHYgdmFsdWUJCUZvcm1hdHRlZCBzZXR0aW5nIGRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHN0b3JlZl91dWlkICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncyBfX3VudXNlZCwKKwkJCSBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZyBfX3VudXNlZCwKKwkJCSBjb25zdCBjaGFyICp2YWx1ZSBfX3VudXNlZCApIHsKKwlyZXR1cm4gLUVOT1RTVVA7Cit9CisKKy8qKgorICogRmV0Y2ggYW5kIGZvcm1hdCB2YWx1ZSBvZiBVVUlEIHNldHRpbmcKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2ssIG9yIE5VTEwgdG8gc2VhcmNoIGFsbCBibG9ja3MKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gZmV0Y2gKKyAqIEB2IGJ1ZgkJQnVmZmVyIHRvIGNvbnRhaW4gZm9ybWF0dGVkIHZhbHVlCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBidWZmZXIKKyAqIEByZXQgbGVuCQlMZW5ndGggb2YgZm9ybWF0dGVkIHZhbHVlLCBvciBuZWdhdGl2ZSBlcnJvcgorICovCitzdGF0aWMgaW50IGZldGNoZl91dWlkICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgY2hhciAqYnVmLCBzaXplX3QgbGVuICkgeworCXVuaW9uIHV1aWQgdXVpZDsKKwlpbnQgcmF3X2xlbjsKKworCWlmICggKCByYXdfbGVuID0gZmV0Y2hfdXVpZF9zZXR0aW5nICggc2V0dGluZ3MsIHNldHRpbmcsICZ1dWlkICkgKSA8IDApCisJCXJldHVybiByYXdfbGVuOworCXJldHVybiBzbnByaW50ZiAoIGJ1ZiwgbGVuLCAiJXMiLCB1dWlkX250b2EgKCAmdXVpZCApICk7Cit9CisKKy8qKiBVVUlEIHNldHRpbmcgdHlwZSAqLworc3RydWN0IHNldHRpbmdfdHlwZSBzZXR0aW5nX3R5cGVfdXVpZCBfX3NldHRpbmdfdHlwZSA9IHsKKwkubmFtZSA9ICJ1dWlkIiwKKwkuc3RvcmVmID0gc3RvcmVmX3V1aWQsCisJLmZldGNoZiA9IGZldGNoZl91dWlkLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNldHRpbmdzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBIb3N0bmFtZSBzZXR0aW5nICovCitzdHJ1Y3Qgc2V0dGluZyBob3N0bmFtZV9zZXR0aW5nIF9fc2V0dGluZyA9IHsKKwkubmFtZSA9ICJob3N0bmFtZSIsCisJLmRlc2NyaXB0aW9uID0gIkhvc3QgbmFtZSIsCisJLnRhZyA9IERIQ1BfSE9TVF9OQU1FLAorCS50eXBlID0gJnNldHRpbmdfdHlwZV9zdHJpbmcsCit9OworCisvKiogRmlsZW5hbWUgc2V0dGluZyAqLworc3RydWN0IHNldHRpbmcgZmlsZW5hbWVfc2V0dGluZyBfX3NldHRpbmcgPSB7CisJLm5hbWUgPSAiZmlsZW5hbWUiLAorCS5kZXNjcmlwdGlvbiA9ICJCb290IGZpbGVuYW1lIiwKKwkudGFnID0gREhDUF9CT09URklMRV9OQU1FLAorCS50eXBlID0gJnNldHRpbmdfdHlwZV9zdHJpbmcsCit9OworCisvKiogUm9vdCBwYXRoIHNldHRpbmcgKi8KK3N0cnVjdCBzZXR0aW5nIHJvb3RfcGF0aF9zZXR0aW5nIF9fc2V0dGluZyA9IHsKKwkubmFtZSA9ICJyb290LXBhdGgiLAorCS5kZXNjcmlwdGlvbiA9ICJpU0NTSSByb290IHBhdGgiLAorCS50YWcgPSBESENQX1JPT1RfUEFUSCwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfc3RyaW5nLAorfTsKKworLyoqIFVzZXJuYW1lIHNldHRpbmcgKi8KK3N0cnVjdCBzZXR0aW5nIHVzZXJuYW1lX3NldHRpbmcgX19zZXR0aW5nID0geworCS5uYW1lID0gInVzZXJuYW1lIiwKKwkuZGVzY3JpcHRpb24gPSAiVXNlciBuYW1lIiwKKwkudGFnID0gREhDUF9FQl9VU0VSTkFNRSwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfc3RyaW5nLAorfTsKKworLyoqIFBhc3N3b3JkIHNldHRpbmcgKi8KK3N0cnVjdCBzZXR0aW5nIHBhc3N3b3JkX3NldHRpbmcgX19zZXR0aW5nID0geworCS5uYW1lID0gInBhc3N3b3JkIiwKKwkuZGVzY3JpcHRpb24gPSAiUGFzc3dvcmQiLAorCS50YWcgPSBESENQX0VCX1BBU1NXT1JELAorCS50eXBlID0gJnNldHRpbmdfdHlwZV9zdHJpbmcsCit9OworCisvKiogUHJpb3JpdHkgc2V0dGluZyAqLworc3RydWN0IHNldHRpbmcgcHJpb3JpdHlfc2V0dGluZyBfX3NldHRpbmcgPSB7CisJLm5hbWUgPSAicHJpb3JpdHkiLAorCS5kZXNjcmlwdGlvbiA9ICJQcmlvcml0eSBvZiB0aGVzZSBzZXR0aW5ncyIsCisJLnRhZyA9IERIQ1BfRUJfUFJJT1JJVFksCisJLnR5cGUgPSAmc2V0dGluZ190eXBlX2ludDgsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS9zdHJpbmcuYyBiL2dweGUvc3JjL2NvcmUvc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwMDA3YQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NvcmUvc3RyaW5nLmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogIENvcHlyaWdodCAoQykgMjAwNCBUb2JpYXMgTG9yZW56CisgKgorICogIHN0cmluZyBoYW5kbGluZyBmdW5jdGlvbnMKKyAqICBiYXNlZCBvbiBsaW51eC9saWIvc3RyaW5nLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisvKgorICogc3R1cGlkIGxpYnJhcnkgcm91dGluZXMuLiBUaGUgb3B0aW1pemVkIHZlcnNpb25zIHNob3VsZCBnZW5lcmFsbHkgYmUgZm91bmQKKyAqIGFzIGlubGluZSBjb2RlIGluIDxhc20teHgvc3RyaW5nLmg+CisgKgorICogVGhlc2UgYXJlIGJ1Z2d5IGFzIHdlbGwuLgorICoKKyAqICogRnJpIEp1biAyNSAxOTk5LCBJbmdvIE9lc2VyIDxpb2VAaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZT4KKyAqIC0gIEFkZGVkIHN0cnNlcCgpIHdoaWNoIHdpbGwgcmVwbGFjZSBzdHJ0b2soKSBzb29uIChiZWNhdXNlIHN0cnNlcCgpIGlzCisgKiAgICByZWVudHJhbnQgYW5kIHNob3VsZCBiZSBmYXN0ZXIpLiBVc2Ugb25seSBzdHJzZXAoKSBpbiBuZXcgY29kZSwgcGxlYXNlLgorICovCisgCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLyogKioqIEZST00gc3RyaW5nLmMgKioqICovCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ1BZCisvKioKKyAqIHN0cmNweSAtIENvcHkgYSAlTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCisgKiBAZGVzdDogV2hlcmUgdG8gY29weSB0aGUgc3RyaW5nIHRvCisgKiBAc3JjOiBXaGVyZSB0byBjb3B5IHRoZSBzdHJpbmcgZnJvbQorICovCitjaGFyICogc3RyY3B5KGNoYXIgKiBkZXN0LGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICp0bXAgPSBkZXN0OworCisJd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorCQkvKiBub3RoaW5nICovOworCXJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ1BZCisvKioKKyAqIHN0cm5jcHkgLSBDb3B5IGEgbGVuZ3RoLWxpbWl0ZWQsICVOVUwtdGVybWluYXRlZCBzdHJpbmcKKyAqIEBkZXN0OiBXaGVyZSB0byBjb3B5IHRoZSBzdHJpbmcgdG8KKyAqIEBzcmM6IFdoZXJlIHRvIGNvcHkgdGhlIHN0cmluZyBmcm9tCisgKiBAY291bnQ6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKgorICogTm90ZSB0aGF0IHVubGlrZSB1c2Vyc3BhY2Ugc3RybmNweSwgdGhpcyBkb2VzIG5vdCAlTlVMLXBhZCB0aGUgYnVmZmVyLgorICogSG93ZXZlciwgdGhlIHJlc3VsdCBpcyBub3QgJU5VTC10ZXJtaW5hdGVkIGlmIHRoZSBzb3VyY2UgZXhjZWVkcworICogQGNvdW50IGJ5dGVzLgorICovCitjaGFyICogc3RybmNweShjaGFyICogZGVzdCxjb25zdCBjaGFyICpzcmMsc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnRtcCA9IGRlc3Q7CisKKwl3aGlsZSAoY291bnQtLSAmJiAoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKwkJLyogbm90aGluZyAqLzsKKworCXJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDQVQKKy8qKgorICogc3RyY2F0IC0gQXBwZW5kIG9uZSAlTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIGFub3RoZXIKKyAqIEBkZXN0OiBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvCisgKiBAc3JjOiBUaGUgc3RyaW5nIHRvIGFwcGVuZCB0byBpdAorICovCitjaGFyICogc3RyY2F0KGNoYXIgKiBkZXN0LCBjb25zdCBjaGFyICogc3JjKQoreworCWNoYXIgKnRtcCA9IGRlc3Q7CisKKwl3aGlsZSAoKmRlc3QpCisJCWRlc3QrKzsKKwl3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCisJCTsKKworCXJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDTVAKKy8qKgorICogc3RyY21wIC0gQ29tcGFyZSB0d28gc3RyaW5ncworICogQGNzOiBPbmUgc3RyaW5nCisgKiBAY3Q6IEFub3RoZXIgc3RyaW5nCisgKi8KK2ludCBzdHJjbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKwlyZWdpc3RlciBzaWduZWQgY2hhciBfX3JlczsKKworCXdoaWxlICgxKSB7CisJCWlmICgoX19yZXMgPSAqY3MgLSAqY3QrKykgIT0gMCB8fCAhKmNzKyspCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gX19yZXM7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ01QCisvKioKKyAqIHN0cm5jbXAgLSBDb21wYXJlIHR3byBsZW5ndGgtbGltaXRlZCBzdHJpbmdzCisgKiBAY3M6IE9uZSBzdHJpbmcKKyAqIEBjdDogQW5vdGhlciBzdHJpbmcKKyAqIEBjb3VudDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUKKyAqLworaW50IHN0cm5jbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCxzaXplX3QgY291bnQpCit7CisJcmVnaXN0ZXIgc2lnbmVkIGNoYXIgX19yZXMgPSAwOworCisJd2hpbGUgKGNvdW50KSB7CisJCWlmICgoX19yZXMgPSAqY3MgLSAqY3QrKykgIT0gMCB8fCAhKmNzKyspCisJCQlicmVhazsKKwkJY291bnQtLTsKKwl9CisKKwlyZXR1cm4gX19yZXM7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDQVNFQ01QCitpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQoreworCXdoaWxlICgqYSAmJiAqYiAmJiAoKmEgJiB+MHgyMCkgPT0gKCpiICYgfjB4MjApKSB7YSsrOyBiKys7IH0KKwlyZXR1cm4oKCphICYgfjB4MjApIC0gKCpiICYgfjB4MjApKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNIUgorLyoqCisgKiBzdHJjaHIgLSBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgY2hhcmFjdGVyIGluIGEgc3RyaW5nCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGM6IFRoZSBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZvcgorICovCitjaGFyICogc3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykKK3sKKwlmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQorCQlpZiAoKnMgPT0gJ1wwJykKKwkJCXJldHVybiBOVUxMOworCXJldHVybiAoY2hhciAqKSBzOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSUkNIUgorLyoqCisgKiBzdHJyY2hyIC0gRmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgY2hhcmFjdGVyIGluIGEgc3RyaW5nCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGM6IFRoZSBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZvcgorICovCitjaGFyICogc3RycmNocihjb25zdCBjaGFyICogcywgaW50IGMpCit7CisgICAgICAgY29uc3QgY2hhciAqcCA9IHMgKyBzdHJsZW4ocyk7CisgICAgICAgZG8geworICAgICAgICAgICBpZiAoKnAgPT0gKGNoYXIpYykKKyAgICAgICAgICAgICAgIHJldHVybiAoY2hhciAqKXA7CisgICAgICAgfSB3aGlsZSAoLS1wID49IHMpOworICAgICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTEVOCisvKioKKyAqIHN0cmxlbiAtIEZpbmQgdGhlIGxlbmd0aCBvZiBhIHN0cmluZworICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2l6ZWQKKyAqLworc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICogcykKK3sKKwljb25zdCBjaGFyICpzYzsKKworCWZvciAoc2MgPSBzOyAqc2MgIT0gJ1wwJzsgKytzYykKKwkJLyogbm90aGluZyAqLzsKKwlyZXR1cm4gc2MgLSBzOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkxFTgorLyoqCisgKiBzdHJubGVuIC0gRmluZCB0aGUgbGVuZ3RoIG9mIGEgbGVuZ3RoLWxpbWl0ZWQgc3RyaW5nCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzaXplZAorICogQGNvdW50OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc2VhcmNoCisgKi8KK3NpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKiBzLCBzaXplX3QgY291bnQpCit7CisJY29uc3QgY2hhciAqc2M7CisKKwlmb3IgKHNjID0gczsgY291bnQtLSAmJiAqc2MgIT0gJ1wwJzsgKytzYykKKwkJLyogbm90aGluZyAqLzsKKwlyZXR1cm4gc2MgLSBzOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNU0VUCisvKioKKyAqIG1lbXNldCAtIEZpbGwgYSByZWdpb24gb2YgbWVtb3J5IHdpdGggdGhlIGdpdmVuIHZhbHVlCisgKiBAczogUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGFyZWEuCisgKiBAYzogVGhlIGJ5dGUgdG8gZmlsbCB0aGUgYXJlYSB3aXRoCisgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgorICoKKyAqIERvIG5vdCB1c2UgbWVtc2V0KCkgdG8gYWNjZXNzIElPIHNwYWNlLCB1c2UgbWVtc2V0X2lvKCkgaW5zdGVhZC4KKyAqLwordm9pZCAqIG1lbXNldCh2b2lkICogcyxpbnQgYyxzaXplX3QgY291bnQpCit7CisJY2hhciAqeHMgPSAoY2hhciAqKSBzOworCisJd2hpbGUgKGNvdW50LS0pCisJCSp4cysrID0gYzsKKworCXJldHVybiBzOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ1BZCisvKioKKyAqIG1lbWNweSAtIENvcHkgb25lIGFyZWEgb2YgbWVtb3J5IHRvIGFub3RoZXIKKyAqIEBkZXN0OiBXaGVyZSB0byBjb3B5IHRvCisgKiBAc3JjOiBXaGVyZSB0byBjb3B5IGZyb20KKyAqIEBjb3VudDogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZnVuY3Rpb24gdG8gYWNjZXNzIElPIHNwYWNlLCB1c2UgbWVtY3B5X3RvaW8oKQorICogb3IgbWVtY3B5X2Zyb21pbygpIGluc3RlYWQuCisgKi8KK3ZvaWQgKiBtZW1jcHkodm9pZCAqIGRlc3QsY29uc3Qgdm9pZCAqc3JjLHNpemVfdCBjb3VudCkKK3sKKwljaGFyICp0bXAgPSAoY2hhciAqKSBkZXN0LCAqcyA9IChjaGFyICopIHNyYzsKKworCXdoaWxlIChjb3VudC0tKQorCQkqdG1wKysgPSAqcysrOworCisJcmV0dXJuIGRlc3Q7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1NT1ZFCisvKioKKyAqIG1lbW1vdmUgLSBDb3B5IG9uZSBhcmVhIG9mIG1lbW9yeSB0byBhbm90aGVyCisgKiBAZGVzdDogV2hlcmUgdG8gY29weSB0bworICogQHNyYzogV2hlcmUgdG8gY29weSBmcm9tCisgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgorICoKKyAqIFVubGlrZSBtZW1jcHkoKSwgbWVtbW92ZSgpIGNvcGVzIHdpdGggb3ZlcmxhcHBpbmcgYXJlYXMuCisgKi8KK3ZvaWQgKiBtZW1tb3ZlKHZvaWQgKiBkZXN0LGNvbnN0IHZvaWQgKnNyYyxzaXplX3QgY291bnQpCit7CisJY2hhciAqdG1wLCAqczsKKworCWlmIChkZXN0IDw9IHNyYykgeworCQl0bXAgPSAoY2hhciAqKSBkZXN0OworCQlzID0gKGNoYXIgKikgc3JjOworCQl3aGlsZSAoY291bnQtLSkKKwkJCSp0bXArKyA9ICpzKys7CisJCX0KKwllbHNlIHsKKwkJdG1wID0gKGNoYXIgKikgZGVzdCArIGNvdW50OworCQlzID0gKGNoYXIgKikgc3JjICsgY291bnQ7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKi0tdG1wID0gKi0tczsKKwkJfQorCisJcmV0dXJuIGRlc3Q7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DTVAKKy8qKgorICogbWVtY21wIC0gQ29tcGFyZSB0d28gYXJlYXMgb2YgbWVtb3J5CisgKiBAY3M6IE9uZSBhcmVhIG9mIG1lbW9yeQorICogQGN0OiBBbm90aGVyIGFyZWEgb2YgbWVtb3J5CisgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgorICovCitpbnQgbWVtY21wKGNvbnN0IHZvaWQgKiBjcyxjb25zdCB2b2lkICogY3Qsc2l6ZV90IGNvdW50KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN1MSwgKnN1MjsKKwlpbnQgcmVzID0gMDsKKworCWZvciggc3UxID0gY3MsIHN1MiA9IGN0OyAwIDwgY291bnQ7ICsrc3UxLCArK3N1MiwgY291bnQtLSkKKwkJaWYgKChyZXMgPSAqc3UxIC0gKnN1MikgIT0gMCkKKwkJCWJyZWFrOworCXJldHVybiByZXM7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJTVFIKKy8qKgorICogc3Ryc3RyIC0gRmluZCB0aGUgZmlyc3Qgc3Vic3RyaW5nIGluIGEgJU5VTCB0ZXJtaW5hdGVkIHN0cmluZworICogQHMxOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAczI6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvcgorICovCitjaGFyICogc3Ryc3RyKGNvbnN0IGNoYXIgKiBzMSxjb25zdCBjaGFyICogczIpCit7CisJaW50IGwxLCBsMjsKKworCWwyID0gc3RybGVuKHMyKTsKKwlpZiAoIWwyKQorCQlyZXR1cm4gKGNoYXIgKikgczE7CisJbDEgPSBzdHJsZW4oczEpOworCXdoaWxlIChsMSA+PSBsMikgeworCQlsMS0tOworCQlpZiAoIW1lbWNtcChzMSxzMixsMikpCisJCQlyZXR1cm4gKGNoYXIgKikgczE7CisJCXMxKys7CisJfQorCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ0hSCisvKioKKyAqIG1lbWNociAtIEZpbmQgYSBjaGFyYWN0ZXIgaW4gYW4gYXJlYSBvZiBtZW1vcnkuCisgKiBAczogVGhlIG1lbW9yeSBhcmVhCisgKiBAYzogVGhlIGJ5dGUgdG8gc2VhcmNoIGZvcgorICogQG46IFRoZSBzaXplIG9mIHRoZSBhcmVhLgorICoKKyAqIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQGMsIG9yICVOVUxMCisgKiBpZiBAYyBpcyBub3QgZm91bmQKKyAqLwordm9pZCAqIG1lbWNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHM7CisJd2hpbGUgKG4tLSAhPSAwKSB7CisgICAgICAgIAlpZiAoKHVuc2lnbmVkIGNoYXIpYyA9PSAqcCsrKSB7CisJCQlyZXR1cm4gKHZvaWQgKikocC0xKTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCisKK2NoYXIgKiBzdHJuZHVwKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreworICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKHMpOworICAgICAgICBjaGFyICpuZXc7CisKKyAgICAgICAgaWYgKGxlbj5uKQorICAgICAgICAgICAgICAgIGxlbiA9IG47CisgICAgICAgIG5ldyA9IG1hbGxvYyhsZW4rMSk7CisgICAgICAgIGlmIChuZXcpIHsKKyAgICAgICAgICAgICAgICBuZXdbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgbWVtY3B5KG5ldyxzLGxlbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldzsKK30KKworY2hhciAqIHN0cmR1cChjb25zdCBjaGFyICpzKSB7CisJcmV0dXJuIHN0cm5kdXAocywgfigoc2l6ZV90KTApKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvc3RyaW5nZXh0cmEuYyBiL2dweGUvc3JjL2NvcmUvc3RyaW5nZXh0cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmJlNGZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS9zdHJpbmdleHRyYS5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgVG9iaWFzIExvcmVuegorICoKKyAqICBzdHJpbmcgaGFuZGxpbmcgZnVuY3Rpb25zCisgKiAgYmFzZWQgb24gbGludXgvbGliL3N0cmluZy5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogc3R1cGlkIGxpYnJhcnkgcm91dGluZXMuLiBUaGUgb3B0aW1pemVkIHZlcnNpb25zIHNob3VsZCBnZW5lcmFsbHkgYmUgZm91bmQKKyAqIGFzIGlubGluZSBjb2RlIGluIDxhc20teHgvc3RyaW5nLmg+CisgKgorICogVGhlc2UgYXJlIGJ1Z2d5IGFzIHdlbGwuLgorICoKKyAqICogRnJpIEp1biAyNSAxOTk5LCBJbmdvIE9lc2VyIDxpb2VAaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZT4KKyAqIC0gIEFkZGVkIHN0cnNlcCgpIHdoaWNoIHdpbGwgcmVwbGFjZSBzdHJ0b2soKSBzb29uIChiZWNhdXNlIHN0cnNlcCgpIGlzCisgKiAgICByZWVudHJhbnQgYW5kIHNob3VsZCBiZSBmYXN0ZXIpLiBVc2Ugb25seSBzdHJzZXAoKSBpbiBuZXcgY29kZSwgcGxlYXNlLgorICovCisKKy8qCisgKiB0aGVzZSBhcmUgdGhlIHN0YW5kYXJkIHN0cmluZyBmdW5jdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IG5vdCB1c2VkIGJ5CisgKiBhbnkgY29kZSBpbiBldGhlcmJvb3QuIHB1dCBpbnRvIGEgc2VwYXJhdGUgZmlsZSB0byBhdm9pZCBsaW5raW5nIHRoZW0gaW4KKyAqIHdpdGggdGhlIHJlc3Qgb2Ygc3RyaW5nLm8KKyAqIGlmIGFueXRoaW5nIGV2ZXIgZG9lcyB3YW50IHRvIHVzZSBhIGZ1bmN0aW9uIG9mIHRoZXNlLCBjb25zaWRlciBtb3ZpbmcKKyAqIHRoZSBmdW5jdGlvbiBpbiBxdWVzdGlvbiBiYWNrIGludG8gc3RyaW5nLmMKKyAqLworIAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qICoqKiBGUk9NIHN0cmluZy5jICoqKiAqLworCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5JQ01QCisvKioKKyAqIHN0cm5pY21wIC0gQ2FzZSBpbnNlbnNpdGl2ZSwgbGVuZ3RoLWxpbWl0ZWQgc3RyaW5nIGNvbXBhcmlzb24KKyAqIEBzMTogT25lIHN0cmluZworICogQHMyOiBUaGUgb3RoZXIgc3RyaW5nCisgKiBAbGVuOiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb21wYXJlCisgKi8KK2ludCBzdHJuaWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBsZW4pCit7CisJLyogWWVzLCBWaXJnaW5pYSwgaXQgaGFkIGJldHRlciBiZSB1bnNpZ25lZCAqLworCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworCisJYzEgPSAwOwljMiA9IDA7CisJaWYgKGxlbikgeworCQlkbyB7CisJCQljMSA9ICpzMTsgYzIgPSAqczI7CisJCQlzMSsrOyBzMisrOworCQkJaWYgKCFjMSkKKwkJCQlicmVhazsKKwkJCWlmICghYzIpCisJCQkJYnJlYWs7CisJCQlpZiAoYzEgPT0gYzIpCisJCQkJY29udGludWU7CisJCQljMSA9IHRvbG93ZXIoYzEpOworCQkJYzIgPSB0b2xvd2VyKGMyKTsKKwkJCWlmIChjMSAhPSBjMikKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoLS1sZW4pOworCX0KKwlyZXR1cm4gKGludCljMSAtIChpbnQpYzI7Cit9CisjZW5kaWYKKworY2hhciAqIF9fX3N0cnRvazsKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ0FUCisvKioKKyAqIHN0cm5jYXQgLSBBcHBlbmQgYSBsZW5ndGgtbGltaXRlZCwgJU5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byBhbm90aGVyCisgKiBAZGVzdDogVGhlIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0bworICogQHNyYzogVGhlIHN0cmluZyB0byBhcHBlbmQgdG8gaXQKKyAqIEBjb3VudDogVGhlIG1heGltdW0gbnVtYmVycyBvZiBieXRlcyB0byBjb3B5CisgKgorICogTm90ZSB0aGF0IGluIGNvbnRyYXN0IHRvIHN0cm5jcHksIHN0cm5jYXQgZW5zdXJlcyB0aGUgcmVzdWx0IGlzCisgKiB0ZXJtaW5hdGVkLgorICovCitjaGFyICogc3RybmNhdChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBjb3VudCkKK3sKKwljaGFyICp0bXAgPSBkZXN0OworCisJaWYgKGNvdW50KSB7CisJCXdoaWxlICgqZGVzdCkKKwkJCWRlc3QrKzsKKwkJd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSkgeworCQkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJCSpkZXN0ID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJTUE4KKy8qKgorICogc3Ryc3BuIC0gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc3Vic3RyaW5nIG9mIEBzIHdoaWNoIG9ubHkKKyAqIAljb250YWluIGxldHRlcnMgaW4gQGFjY2VwdAorICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBhY2NlcHQ6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvcgorICovCitzaXplX3Qgc3Ryc3BuKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmFjY2VwdCkKK3sKKwljb25zdCBjaGFyICpwOworCWNvbnN0IGNoYXIgKmE7CisJc2l6ZV90IGNvdW50ID0gMDsKKworCWZvciAocCA9IHM7ICpwICE9ICdcMCc7ICsrcCkgeworCQlmb3IgKGEgPSBhY2NlcHQ7ICphICE9ICdcMCc7ICsrYSkgeworCQkJaWYgKCpwID09ICphKQorCQkJCWJyZWFrOworCQl9CisJCWlmICgqYSA9PSAnXDAnKQorCQkJcmV0dXJuIGNvdW50OworCQkrK2NvdW50OworCX0KKworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNTUE4KKy8qKgorICogc3RyY3NwbiAtIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsIHN1YnN0cmluZyBvZiBAcyB3aGljaCBvbmx5CisgKiAJY29udGFpbiBsZXR0ZXJzIG5vdCBpbiBAcmVqZWN0CisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGFjY2VwdDogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCisgKi8KK3NpemVfdCBzdHJjc3BuKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnJlamVjdCkKK3sKKwljb25zdCBjaGFyICpwOworCWNvbnN0IGNoYXIgKnI7CisJc2l6ZV90IGNvdW50ID0gMDsKKworCWZvciAocCA9IHM7ICpwICE9ICdcMCc7ICsrcCkgeworCQlmb3IgKHIgPSByZWplY3Q7ICpyICE9ICdcMCc7ICsrcikgeworCQkJaWYgKCpwID09ICpyKQorCQkJCXJldHVybiBjb3VudDsKKwkJfQorCQkrK2NvdW50OworCX0KKworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlBCUksKKy8qKgorICogc3RycGJyayAtIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBzZXQgb2YgY2hhcmFjdGVycworICogQGNzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKKyAqLworY2hhciAqIHN0cnBicmsoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKwljb25zdCBjaGFyICpzYzEsKnNjMjsKKworCWZvciggc2MxID0gY3M7ICpzYzEgIT0gJ1wwJzsgKytzYzEpIHsKKwkJZm9yKCBzYzIgPSBjdDsgKnNjMiAhPSAnXDAnOyArK3NjMikgeworCQkJaWYgKCpzYzEgPT0gKnNjMikKKwkJCQlyZXR1cm4gKGNoYXIgKikgc2MxOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSVE9LCisvKioKKyAqIHN0cnRvayAtIFNwbGl0IGEgc3RyaW5nIGludG8gdG9rZW5zCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGN0OiBUaGUgY2hhcmFjdGVycyB0byBzZWFyY2ggZm9yCisgKgorICogV0FSTklORzogc3RydG9rIGlzIGRlcHJlY2F0ZWQsIHVzZSBzdHJzZXAgaW5zdGVhZC4KKyAqLworY2hhciAqIHN0cnRvayhjaGFyICogcyxjb25zdCBjaGFyICogY3QpCit7CisJY2hhciAqc2JlZ2luLCAqc2VuZDsKKworCXNiZWdpbiAgPSBzID8gcyA6IF9fX3N0cnRvazsKKwlpZiAoIXNiZWdpbikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJc2JlZ2luICs9IHN0cnNwbihzYmVnaW4sY3QpOworCWlmICgqc2JlZ2luID09ICdcMCcpIHsKKwkJX19fc3RydG9rID0gTlVMTDsKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCXNlbmQgPSBzdHJwYnJrKCBzYmVnaW4sIGN0KTsKKwlpZiAoc2VuZCAmJiAqc2VuZCAhPSAnXDAnKQorCQkqc2VuZCsrID0gJ1wwJzsKKwlfX19zdHJ0b2sgPSBzZW5kOworCXJldHVybiAoc2JlZ2luKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlNFUAorLyoqCisgKiBzdHJzZXAgLSBTcGxpdCBhIHN0cmluZyBpbnRvIHRva2VucworICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBjdDogVGhlIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvcgorICoKKyAqIHN0cnNlcCgpIHVwZGF0ZXMgQHMgdG8gcG9pbnQgYWZ0ZXIgdGhlIHRva2VuLCByZWFkeSBmb3IgdGhlIG5leHQgY2FsbC4KKyAqCisgKiBJdCByZXR1cm5zIGVtcHR5IHRva2VucywgdG9vLCBiZWhhdmluZyBleGFjdGx5IGxpa2UgdGhlIGxpYmMgZnVuY3Rpb24KKyAqIG9mIHRoYXQgbmFtZS4gSW4gZmFjdCwgaXQgd2FzIHN0b2xlbiBmcm9tIGdsaWJjMiBhbmQgZGUtZmFuY3ktZmllZC4KKyAqIFNhbWUgc2VtYW50aWNzLCBzbGltbWVyIHNoYXBlLiA7KQorICovCitjaGFyICogc3Ryc2VwKGNoYXIgKipzLCBjb25zdCBjaGFyICpjdCkKK3sKKwljaGFyICpzYmVnaW4gPSAqcywgKmVuZDsKKworCWlmIChzYmVnaW4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwllbmQgPSBzdHJwYnJrKHNiZWdpbiwgY3QpOworCWlmIChlbmQpCisJCSplbmQrKyA9ICdcMCc7CisJKnMgPSBlbmQ7CisKKwlyZXR1cm4gc2JlZ2luOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfQkNPUFkKKy8qKgorICogYmNvcHkgLSBDb3B5IG9uZSBhcmVhIG9mIG1lbW9yeSB0byBhbm90aGVyCisgKiBAc3JjOiBXaGVyZSB0byBjb3B5IGZyb20KKyAqIEBkZXN0OiBXaGVyZSB0byBjb3B5IHRvCisgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFzIG1lbWNweSgpLCB3aXRoIHRoZSBhcmd1bWVudHMgcmV2ZXJzZWQuCisgKiBtZW1jcHkoKSBpcyB0aGUgc3RhbmRhcmQsIGJjb3B5KCkgaXMgYSBsZWdhY3kgQlNEIGZ1bmN0aW9uLgorICoKKyAqIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGFjY2VzcyBJTyBzcGFjZSwgdXNlIG1lbWNweV90b2lvKCkKKyAqIG9yIG1lbWNweV9mcm9taW8oKSBpbnN0ZWFkLgorICovCitjaGFyICogYmNvcHkoY29uc3QgY2hhciAqIHNyYywgY2hhciAqIGRlc3QsIGludCBjb3VudCkKK3sKKwlyZXR1cm4gbWVtbW92ZShkZXN0LHNyYyxjb3VudCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1TQ0FOCisvKioKKyAqIG1lbXNjYW4gLSBGaW5kIGEgY2hhcmFjdGVyIGluIGFuIGFyZWEgb2YgbWVtb3J5LgorICogQGFkZHI6IFRoZSBtZW1vcnkgYXJlYQorICogQGM6IFRoZSBieXRlIHRvIHNlYXJjaCBmb3IKKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KKyAqCisgKiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIEBjLCBvciAxIGJ5dGUgcGFzdAorICogdGhlIGFyZWEgaWYgQGMgaXMgbm90IGZvdW5kCisgKi8KK3ZvaWQgKiBtZW1zY2FuKGNvbnN0IHZvaWQgKiBhZGRyLCBpbnQgYywgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgY2hhciAqIHAgPSAodW5zaWduZWQgY2hhciAqKSBhZGRyOworCisJd2hpbGUgKHNpemUpIHsKKwkJaWYgKCpwID09IGMpCisJCQlyZXR1cm4gKHZvaWQgKikgcDsKKwkJcCsrOworCQlzaXplLS07CisJfQorICAJcmV0dXJuICh2b2lkICopIHA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvdGltZXIuYyBiL2dweGUvc3JjL2NvcmUvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTZkMDdlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS90aW1lci5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyoqCisgKiBEZWxheSBmb3IgYSBmaXhlZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgKgorICogQHYgbXNlY3MJCU51bWJlciBvZiBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGRlbGF5CisgKi8KK3ZvaWQgbWRlbGF5ICggdW5zaWduZWQgbG9uZyBtc2VjcyApIHsKKwl3aGlsZSAoIG1zZWNzLS0gKQorCQl1ZGVsYXkgKCAxMDAwICk7Cit9CisKKy8qKgorICogRGVsYXkgZm9yIGEgZml4ZWQgbnVtYmVyIG9mIHNlY29uZHMKKyAqCisgKiBAdiBzZWNzCQlOdW1iZXIgb2Ygc2Vjb25kcyBmb3Igd2hpY2ggdG8gZGVsYXkKKyAqLwordW5zaWduZWQgaW50IHNsZWVwICggdW5zaWduZWQgaW50IHNlY3MgKSB7CisJd2hpbGUgKCBzZWNzLS0gKQorCQltZGVsYXkgKCAxMDAwICk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jb3JlL3VyaS5jIGIvZ3B4ZS9zcmMvY29yZS91cmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTFmMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS91cmkuYwpAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqIEBmaWxlCisgKgorICogVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycworICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxncHhlL3ZzcHJpbnRmLmg+CisjaW5jbHVkZSA8Z3B4ZS91cmkuaD4KKworLyoqCisgKiBEdW1wIFVSSSBmb3IgZGVidWdnaW5nCisgKgorICogQHYgdXJpCQlVUkkKKyAqLworc3RhdGljIHZvaWQgZHVtcF91cmkgKCBzdHJ1Y3QgdXJpICp1cmkgKSB7CisJaWYgKCAhIHVyaSApCisJCXJldHVybjsKKwlpZiAoIHVyaS0+c2NoZW1lICkKKwkJREJHICggIiBzY2hlbWUgXCIlc1wiIiwgdXJpLT5zY2hlbWUgKTsKKwlpZiAoIHVyaS0+b3BhcXVlICkKKwkJREJHICggIiBvcGFxdWUgXCIlc1wiIiwgdXJpLT5vcGFxdWUgKTsKKwlpZiAoIHVyaS0+dXNlciApCisJCURCRyAoICIgdXNlciBcIiVzXCIiLCB1cmktPnVzZXIgKTsKKwlpZiAoIHVyaS0+cGFzc3dvcmQgKQorCQlEQkcgKCAiIHBhc3N3b3JkIFwiJXNcIiIsIHVyaS0+cGFzc3dvcmQgKTsKKwlpZiAoIHVyaS0+aG9zdCApCisJCURCRyAoICIgaG9zdCBcIiVzXCIiLCB1cmktPmhvc3QgKTsKKwlpZiAoIHVyaS0+cG9ydCApCisJCURCRyAoICIgcG9ydCBcIiVzXCIiLCB1cmktPnBvcnQgKTsKKwlpZiAoIHVyaS0+cGF0aCApCisJCURCRyAoICIgcGF0aCBcIiVzXCIiLCB1cmktPnBhdGggKTsKKwlpZiAoIHVyaS0+cXVlcnkgKQorCQlEQkcgKCAiIHF1ZXJ5IFwiJXNcIiIsIHVyaS0+cXVlcnkgKTsKKwlpZiAoIHVyaS0+ZnJhZ21lbnQgKQorCQlEQkcgKCAiIGZyYWdtZW50IFwiJXNcIiIsIHVyaS0+ZnJhZ21lbnQgKTsKK30KKworLyoqCisgKiBQYXJzZSBVUkkKKyAqCisgKiBAdiB1cmlfc3RyaW5nCVVSSSBhcyBhIHN0cmluZworICogQHJldCB1cmkJCVVSSQorICoKKyAqIFNwbGl0cyBhIFVSSSBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuICBUaGUgcmV0dXJuIFVSSSBzdHJ1Y3R1cmUgaXMKKyAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgbXVzdCBldmVudHVhbGx5IGJlIGZyZWVkIGJ5IGNhbGxpbmcKKyAqIHVyaV9wdXQoKS4KKyAqLworc3RydWN0IHVyaSAqIHBhcnNlX3VyaSAoIGNvbnN0IGNoYXIgKnVyaV9zdHJpbmcgKSB7CisJc3RydWN0IHVyaSAqdXJpOworCWNoYXIgKnJhdzsKKwljaGFyICp0bXA7CisJY2hhciAqcGF0aCA9IE5VTEw7CisJY2hhciAqYXV0aG9yaXR5ID0gTlVMTDsKKwlpbnQgaTsKKwlzaXplX3QgcmF3X2xlbjsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBVUkkgc3RydWN0IGFuZCBhIGNvcHkgb2YgdGhlIHN0cmluZyAqLworCXJhd19sZW4gPSAoIHN0cmxlbiAoIHVyaV9zdHJpbmcgKSArIDEgLyogTlVMICovICk7CisJdXJpID0gemFsbG9jICggc2l6ZW9mICggKnVyaSApICsgcmF3X2xlbiApOworCWlmICggISB1cmkgKQorCQlyZXR1cm4gTlVMTDsKKwlyYXcgPSAoICggKCBjaGFyICogKSB1cmkgKSArIHNpemVvZiAoICp1cmkgKSApOworCisJLyogQ29weSBpbiB0aGUgcmF3IHN0cmluZyAqLworCW1lbWNweSAoIHJhdywgdXJpX3N0cmluZywgcmF3X2xlbiApOworCisJLyogU3RhcnQgYnkgY2hvcHBpbmcgb2ZmIHRoZSBmcmFnbWVudCwgaWYgaXQgZXhpc3RzICovCisJaWYgKCAoIHRtcCA9IHN0cmNociAoIHJhdywgJyMnICkgKSApIHsKKwkJKih0bXArKykgPSAnXDAnOworCQl1cmktPmZyYWdtZW50ID0gdG1wOworCX0KKworCS8qIElkZW50aWZ5IGFic29sdXRlL3JlbGF0aXZlIFVSSS4gIFdlIGlnbm9yZSBzY2hlbWVzIHRoYXQgYXJlCisJICogYXBwYXJlbnRseSBvbmx5IGEgc2luZ2xlIGNoYXJhY3RlciBsb25nLCBzaW5jZSBvdGhlcndpc2Ugd2UKKwkgKiBtaXNpbnRlcnByZXQgYSBET1Mtc3R5bGUgcGF0aCBuYW1lICgiQzpccGF0aFx0b1xmaWxlIikgYXMgYQorCSAqIFVSSSB3aXRoIHNjaGVtZT0iQyIsb3BhcXVlPSJccGF0aFx0b1xmaWxlIi4KKwkgKi8KKwlpZiAoICggdG1wID0gc3RyY2hyICggcmF3LCAnOicgKSApICYmICggdG1wID4gKCByYXcgKyAxICkgKSApIHsKKwkJLyogQWJzb2x1dGUgVVJJOiBpZGVudGlmeSBoaWVyYXJjaGljYWwvb3BhcXVlICovCisJCXVyaS0+c2NoZW1lID0gcmF3OworCQkqKHRtcCsrKSA9ICdcMCc7CisJCWlmICggKnRtcCA9PSAnLycgKSB7CisJCQkvKiBBYnNvbHV0ZSBVUkkgd2l0aCBoaWVyYXJjaGljYWwgcGFydCAqLworCQkJcGF0aCA9IHRtcDsKKwkJfSBlbHNlIHsKKwkJCS8qIEFic29sdXRlIFVSSSB3aXRoIG9wYXF1ZSBwYXJ0ICovCisJCQl1cmktPm9wYXF1ZSA9IHRtcDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFJlbGF0aXZlIFVSSSAqLworCQlwYXRoID0gcmF3OworCX0KKworCS8qIElmIHdlIGRvbid0IGhhdmUgYSBwYXRoIChpLmUuIHdlIGhhdmUgYW4gYWJzb2x1dGUgVVJJIHdpdGgKKwkgKiBhbiBvcGFxdWUgcG9ydGlvbiwgd2UncmUgYWxyZWFkeSBmaW5pc2hlZCBwcm9jZXNzaW5nCisJICovCisJaWYgKCAhIHBhdGggKQorCQlnb3RvIGRvbmU7CisKKwkvKiBDaG9wIG9mZiB0aGUgcXVlcnksIGlmIGl0IGV4aXN0cyAqLworCWlmICggKCB0bXAgPSBzdHJjaHIgKCBwYXRoLCAnPycgKSApICkgeworCQkqKHRtcCsrKSA9ICdcMCc7CisJCXVyaS0+cXVlcnkgPSB0bXA7CisJfQorCisJLyogSWRlbnRpZnkgbmV0L2Fic29sdXRlL3JlbGF0aXZlIHBhdGggKi8KKwlpZiAoIHN0cm5jbXAgKCBwYXRoLCAiLy8iLCAyICkgPT0gMCApIHsKKwkJLyogTmV0IHBhdGguICBJZiB0aGlzIGlzIHRlcm1pbmF0ZWQgYnkgdGhlIGZpcnN0ICcvJworCQkgKiBvZiBhbiBhYnNvbHV0ZSBwYXRoLCB0aGVuIHdlIGhhdmUgbm8gc3BhY2UgZm9yIGEKKwkJICogdGVybWluYXRvciBhZnRlciB0aGUgYXV0aG9yaXR5IGZpZWxkLCBzbyBzaHVmZmxlCisJCSAqIHRoZSBhdXRob3JpdHkgZG93biBieSBvbmUgYnl0ZSwgb3ZlcndyaXRpbmcgb25lIG9mCisJCSAqIHRoZSB0d28gc2xhc2hlcy4KKwkJICovCisJCWF1dGhvcml0eSA9ICggcGF0aCArIDIgKTsKKwkJaWYgKCAoIHRtcCA9IHN0cmNociAoIGF1dGhvcml0eSwgJy8nICkgKSApIHsKKwkJCS8qIFNodWZmbGUgZG93biAqLworCQkJdXJpLT5wYXRoID0gdG1wOworCQkJbWVtbW92ZSAoICggYXV0aG9yaXR5IC0gMSApLCBhdXRob3JpdHksCisJCQkJICAoIHRtcCAtIGF1dGhvcml0eSApICk7CisJCQlhdXRob3JpdHktLTsKKwkJCSooLS10bXApID0gJ1wwJzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEFic29sdXRlL3JlbGF0aXZlIHBhdGggKi8KKwkJdXJpLT5wYXRoID0gcGF0aDsKKwl9CisKKwkvKiBTcGxpdCBhdXRob3JpdHkgaW50byB1c2VyWzpwYXNzd29yZF0gYW5kIGhvc3RbOnBvcnRdIHBvcnRpb25zICovCisJaWYgKCAoIHRtcCA9IHN0cmNociAoIGF1dGhvcml0eSwgJ0AnICkgKSApIHsKKwkJLyogSGFzIHVzZXJbOnBhc3N3b3JkXSAqLworCQkqKHRtcCsrKSA9ICdcMCc7CisJCXVyaS0+aG9zdCA9IHRtcDsKKwkJdXJpLT51c2VyID0gYXV0aG9yaXR5OworCQlpZiAoICggdG1wID0gc3RyY2hyICggYXV0aG9yaXR5LCAnOicgKSApICkgeworCQkJLyogSGFzIHBhc3N3b3JkICovCisJCQkqKHRtcCsrKSA9ICdcMCc7CisJCQl1cmktPnBhc3N3b3JkID0gdG1wOworCQl9CisJfSBlbHNlIHsKKwkJLyogTm8gdXNlcjpwYXNzd29yZCAqLworCQl1cmktPmhvc3QgPSBhdXRob3JpdHk7CisJfQorCisJLyogU3BsaXQgaG9zdCBpbnRvIGhvc3RbOnBvcnRdICovCisJaWYgKCAoIHRtcCA9IHN0cmNociAoIHVyaS0+aG9zdCwgJzonICkgKSApIHsKKwkJKih0bXArKykgPSAnXDAnOworCQl1cmktPnBvcnQgPSB0bXA7CisJfQorCisJLyogRGVjb2RlIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkZWNvZGVkICovCisJZm9yICggaSA9IFVSSV9GSVJTVF9GSUVMRDsgaSA8PSBVUklfTEFTVF9GSUVMRDsgaSsrICkgeworCQljb25zdCBjaGFyICpmaWVsZCA9IHVyaV9nZXRfZmllbGQgKCB1cmksIGkgKTsKKwkJaWYgKCBmaWVsZCAmJiAoIFVSSV9FTkNPREVEICYgKCAxIDw8IGkgKSApICkKKwkJCXVyaV9kZWNvZGUgKCBmaWVsZCwgKCBjaGFyICogKSBmaWVsZCwKKwkJCQkgICAgIHN0cmxlbiAoIGZpZWxkICkgKyAxIC8qIE5VTCAqLyApOworCX0KKworIGRvbmU6CisJREJHICggIlVSSSBcIiVzXCIgc3BsaXQgaW50byIsIHVyaV9zdHJpbmcgKTsKKwlkdW1wX3VyaSAoIHVyaSApOworCURCRyAoICJcbiIgKTsKKworCXJldHVybiB1cmk7Cit9CisKKy8qKgorICogR2V0IHBvcnQgZnJvbSBVUkkKKyAqCisgKiBAdiB1cmkJCVVSSSwgb3IgTlVMTAorICogQHYgZGVmYXVsdF9wb3J0CURlZmF1bHQgcG9ydCB0byB1c2UgaWYgbm9uZSBzcGVjaWZpZWQgaW4gVVJJCisgKiBAcmV0IHBvcnQJCVBvcnQKKyAqLwordW5zaWduZWQgaW50IHVyaV9wb3J0ICggc3RydWN0IHVyaSAqdXJpLCB1bnNpZ25lZCBpbnQgZGVmYXVsdF9wb3J0ICkgeworCWlmICggKCAhIHVyaSApIHx8ICggISB1cmktPnBvcnQgKSApCisJCXJldHVybiBkZWZhdWx0X3BvcnQ7CisJcmV0dXJuICggc3RydG91bCAoIHVyaS0+cG9ydCwgTlVMTCwgMCApICk7Cit9CisKKy8qKgorICogVW5wYXJzZSBVUkkKKyAqCisgKiBAdiBidWYJCUJ1ZmZlciB0byBmaWxsIHdpdGggVVJJIHN0cmluZworICogQHYgc2l6ZQkJU2l6ZSBvZiBidWZmZXIKKyAqIEB2IHVyaQkJVVJJIHRvIHdyaXRlIGludG8gYnVmZmVyLCBvciBOVUxMCisgKiBAdiBmaWVsZHMJCUJpdG1hc2sgb2YgZmllbGRzIHRvIGluY2x1ZGUgaW4gVVJJIHN0cmluZywgb3IgVVJJX0FMTAorICogQHJldCBsZW4JCUxlbmd0aCBvZiBVUkkgc3RyaW5nCisgKi8KK2ludCB1bnBhcnNlX3VyaSAoIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIHN0cnVjdCB1cmkgKnVyaSwKKwkJICB1bnNpZ25lZCBpbnQgZmllbGRzICkgeworCS8qIExpc3Qgb2YgY2hhcmFjdGVycyB0aGF0IHR5cGljYWxseSBnbyBiZWZvcmUgY2VydGFpbiBmaWVsZHMgKi8KKwlzdGF0aWMgY2hhciBzZXBhcmF0b3JzW10gPSB7IC8qIHNjaGVtZSAqLyAwLCAvKiBvcGFxdWUgKi8gJzonLAorCQkJCSAgICAgLyogdXNlciAqLyAwLCAvKiBwYXNzd29yZCAqLyAnOicsCisJCQkJICAgICAvKiBob3N0ICovICdAJywgLyogcG9ydCAqLyAnOicsCisJCQkJICAgICAvKiBwYXRoICovIDAsIC8qIHF1ZXJ5ICovICc/JywKKwkJCQkgICAgIC8qIGZyYWdtZW50ICovICcjJyB9OworCWludCB1c2VkID0gMDsKKwlpbnQgaTsKKworCURCRyAoICJVUkkgdW5wYXJzaW5nIiApOworCWR1bXBfdXJpICggdXJpICk7CisJREJHICggIlxuIiApOworCisJLyogRW5zdXJlIGJ1ZmZlciBpcyBOVUwtdGVybWluYXRlZCAqLworCWlmICggc2l6ZSApCisJCWJ1ZlswXSA9ICdcMCc7CisKKwkvKiBTcGVjaWFsLWNhc2UgTlVMTCBVUkkgKi8KKwlpZiAoICEgdXJpICkKKwkJcmV0dXJuIDA7CisKKwkvKiBJdGVyYXRlIHRocm91Z2ggcmVxdWVzdGVkIGZpZWxkcyAqLworCWZvciAoIGkgPSBVUklfRklSU1RfRklFTEQ7IGkgPD0gVVJJX0xBU1RfRklFTEQ7IGkrKyApIHsKKwkJY29uc3QgY2hhciAqZmllbGQgPSB1cmlfZ2V0X2ZpZWxkICggdXJpLCBpICk7CisJCWNoYXIgc2VwID0gc2VwYXJhdG9yc1tpXTsKKworCQkvKiBFbnN1cmUgYGZpZWxkcycgb25seSBjb250YWlucyBiaXRzIGZvciBmaWVsZHMgdGhhdCBleGlzdCAqLworCQlpZiAoICEgZmllbGQgKQorCQkJZmllbGRzICY9IH4oIDEgPDwgaSApOworCisJCS8qIFN0b3JlIHRoaXMgZmllbGQgaWYgd2Ugd2VyZSBhc2tlZCB0byAqLworCQlpZiAoIGZpZWxkcyAmICggMSA8PCBpICkgKSB7CisJCQkvKiBQcmludCA6Ly8gaWYgd2UncmUgbm9uLW9wYXF1ZSBhbmQgaGFkIGEgc2NoZW1lICovCisJCQlpZiAoICggZmllbGRzICYgVVJJX1NDSEVNRV9CSVQgKSAmJgorCQkJICAgICAoIGkgPiBVUklfT1BBUVVFICkgKSB7CisJCQkJdXNlZCArPSBzc25wcmludGYgKCBidWYgKyB1c2VkLCBzaXplIC0gdXNlZCwKKwkJCQkJCSAgICAiOi8vIiApOworCQkJCS8qIE9ubHkgcHJpbnQgOi8vIG9uY2UgKi8KKwkJCQlmaWVsZHMgJj0gflVSSV9TQ0hFTUVfQklUOworCQkJfQorCisJCQkvKiBPbmx5IHByaW50IHNlcGFyYXRvciBpZiBhbiBlYXJsaWVyIGZpZWxkIGV4aXN0cyAqLworCQkJaWYgKCBzZXAgJiYgKCBmaWVsZHMgJiAoICggMSA8PCBpICkgLSAxICkgKSApCisJCQkJdXNlZCArPSBzc25wcmludGYgKCBidWYgKyB1c2VkLCBzaXplIC0gdXNlZCwKKwkJCQkJCSAgICAiJWMiLCBzZXAgKTsKKworCQkJLyogUHJpbnQgY29udGVudHMgb2YgZmllbGQsIHBvc3NpYmx5IGVuY29kZWQgKi8KKwkJCWlmICggVVJJX0VOQ09ERUQgJiAoIDEgPDwgaSApICkKKwkJCQl1c2VkICs9IHVyaV9lbmNvZGUgKCBmaWVsZCwgYnVmICsgdXNlZCwKKwkJCQkJCSAgICAgc2l6ZSAtIHVzZWQsIGkgKTsKKwkJCWVsc2UKKwkJCQl1c2VkICs9IHNzbnByaW50ZiAoIGJ1ZiArIHVzZWQsIHNpemUgLSB1c2VkLAorCQkJCQkJICAgICIlcyIsIGZpZWxkICk7CisJCX0KKwl9CisKKwlyZXR1cm4gdXNlZDsKK30KKworLyoqCisgKiBEdXBsaWNhdGUgVVJJCisgKgorICogQHYgdXJpCQlVUkkKKyAqIEByZXQgdXJpCQlEdXBsaWNhdGUgVVJJCisgKgorICogQ3JlYXRlcyBhIG1vZGlmaWFibGUgY29weSBvZiBhIFVSSS4KKyAqLworc3RydWN0IHVyaSAqIHVyaV9kdXAgKCBzdHJ1Y3QgdXJpICp1cmkgKSB7CisJc2l6ZV90IGxlbiA9ICggdW5wYXJzZV91cmkgKCBOVUxMLCAwLCB1cmksIFVSSV9BTEwgKSArIDEgKTsKKwljaGFyIGJ1ZltsZW5dOworCisJdW5wYXJzZV91cmkgKCBidWYsIGxlbiwgdXJpLCBVUklfQUxMICk7CisJcmV0dXJuIHBhcnNlX3VyaSAoIGJ1ZiApOworfQorCisvKioKKyAqIFJlc29sdmUgYmFzZStyZWxhdGl2ZSBwYXRoCisgKgorICogQHYgYmFzZV91cmkJCUJhc2UgcGF0aAorICogQHYgcmVsYXRpdmVfdXJpCVJlbGF0aXZlIHBhdGgKKyAqIEByZXQgcmVzb2x2ZWRfdXJpCVJlc29sdmVkIHBhdGgKKyAqCisgKiBUYWtlcyBhIGJhc2UgcGF0aCAoZS5nLiAiL3Zhci9saWIvdGZ0cGJvb3Qvdm1saW51eiIgYW5kIGEgcmVsYXRpdmUKKyAqIHBhdGggKGUuZy4gImluaXRyZC5neiIpIGFuZCBwcm9kdWNlcyBhIG5ldyBwYXRoCisgKiAoZS5nLiAiL3Zhci9saWIvdGZ0cGJvb3QvaW5pdHJkLmd6IikuICBOb3RlIHRoYXQgYW55IG5vbi1kaXJlY3RvcnkKKyAqIHBvcnRpb24gb2YgdGhlIGJhc2UgcGF0aCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc3RyaXBwZWQ7IHRoaXMKKyAqIG1hdGNoZXMgdGhlIHNlbWFudGljcyB1c2VkIHdoZW4gcmVzb2x2aW5nIHRoZSBwYXRoIGNvbXBvbmVudCBvZgorICogVVJJcy4KKyAqLworY2hhciAqIHJlc29sdmVfcGF0aCAoIGNvbnN0IGNoYXIgKmJhc2VfcGF0aCwKKwkJICAgICAgY29uc3QgY2hhciAqcmVsYXRpdmVfcGF0aCApIHsKKwlzaXplX3QgYmFzZV9sZW4gPSAoIHN0cmxlbiAoIGJhc2VfcGF0aCApICsgMSApOworCWNoYXIgYmFzZV9wYXRoX2NvcHlbYmFzZV9sZW5dOworCWNoYXIgKmJhc2VfdG1wID0gYmFzZV9wYXRoX2NvcHk7CisJY2hhciAqcmVzb2x2ZWQ7CisKKwkvKiBJZiByZWxhdGl2ZSBwYXRoIGlzIGFic29sdXRlLCBqdXN0IHJlLXVzZSBpdCAqLworCWlmICggcmVsYXRpdmVfcGF0aFswXSA9PSAnLycgKQorCQlyZXR1cm4gc3RyZHVwICggcmVsYXRpdmVfcGF0aCApOworCisJLyogQ3JlYXRlIG1vZGlmaWFibGUgY29weSBvZiBwYXRoIGZvciBkaXJuYW1lKCkgKi8KKwltZW1jcHkgKCBiYXNlX3RtcCwgYmFzZV9wYXRoLCBiYXNlX2xlbiApOworCWJhc2VfdG1wID0gZGlybmFtZSAoIGJhc2VfdG1wICk7CisKKwkvKiBQcm9jZXNzICIuLyIgYW5kICIuLi8iIGVsZW1lbnRzICovCisJd2hpbGUgKCAqcmVsYXRpdmVfcGF0aCA9PSAnLicgKSB7CisJCXJlbGF0aXZlX3BhdGgrKzsKKwkJaWYgKCAqcmVsYXRpdmVfcGF0aCA9PSAwICkgeworCQkJLyogRG8gbm90aGluZyAqLworCQl9IGVsc2UgaWYgKCAqcmVsYXRpdmVfcGF0aCA9PSAnLycgKSB7CisJCQlyZWxhdGl2ZV9wYXRoKys7CisJCX0gZWxzZSBpZiAoICpyZWxhdGl2ZV9wYXRoID09ICcuJyApIHsKKwkJCXJlbGF0aXZlX3BhdGgrKzsKKwkJCWlmICggKnJlbGF0aXZlX3BhdGggPT0gMCApIHsKKwkJCQliYXNlX3RtcCA9IGRpcm5hbWUgKCBiYXNlX3RtcCApOworCQkJfSBlbHNlIGlmICggKnJlbGF0aXZlX3BhdGggPT0gJy8nICkgeworCQkJCWJhc2VfdG1wID0gZGlybmFtZSAoIGJhc2VfdG1wICk7CisJCQkJcmVsYXRpdmVfcGF0aCsrOworCQkJfSBlbHNlIHsKKwkJCQlyZWxhdGl2ZV9wYXRoIC09IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZWxhdGl2ZV9wYXRoLS07CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIENyZWF0ZSBhbmQgcmV0dXJuIG5ldyBwYXRoICovCisJaWYgKCBhc3ByaW50ZiAoICZyZXNvbHZlZCwgIiVzJXMlcyIsIGJhc2VfdG1wLAorCQkJKCAoIGJhc2VfdG1wWyBzdHJsZW4gKCBiYXNlX3RtcCApIC0gMSBdID09ICcvJyApID8KKwkJCSAgIiIgOiAiLyIgKSwgcmVsYXRpdmVfcGF0aCApIDwgMCApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHJlc29sdmVkOworfQorCisvKioKKyAqIFJlc29sdmUgYmFzZStyZWxhdGl2ZSBVUkkKKyAqCisgKiBAdiBiYXNlX3VyaQkJQmFzZSBVUkksIG9yIE5VTEwKKyAqIEB2IHJlbGF0aXZlX3VyaQlSZWxhdGl2ZSBVUkkKKyAqIEByZXQgcmVzb2x2ZWRfdXJpCVJlc29sdmVkIFVSSQorICoKKyAqIFRha2VzIGEgYmFzZSBVUkkgKGUuZy4gImh0dHA6Ly9ldGhlcmJvb3Qub3JnL2tlcm5lbHMvdm1saW51eiIgYW5kIGEKKyAqIHJlbGF0aXZlIFVSSSAoZS5nLiAiLi4vaW5pdHJkcy9pbml0cmQuZ3oiKSBhbmQgcHJvZHVjZXMgYSBuZXcgVVJJCisgKiAoZS5nLiAiaHR0cDovL2V0aGVyYm9vdC5vcmcvaW5pdHJkcy9pbml0cmQuZ3oiKS4KKyAqLworc3RydWN0IHVyaSAqIHJlc29sdmVfdXJpICggc3RydWN0IHVyaSAqYmFzZV91cmksCisJCQkgICBzdHJ1Y3QgdXJpICpyZWxhdGl2ZV91cmkgKSB7CisJc3RydWN0IHVyaSB0bXBfdXJpOworCWNoYXIgKnRtcF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3QgdXJpICpuZXdfdXJpOworCisJLyogSWYgcmVsYXRpdmUgVVJJIGlzIGFic29sdXRlLCBqdXN0IHJlLXVzZSBpdCAqLworCWlmICggdXJpX2lzX2Fic29sdXRlICggcmVsYXRpdmVfdXJpICkgfHwgKCAhIGJhc2VfdXJpICkgKQorCQlyZXR1cm4gdXJpX2dldCAoIHJlbGF0aXZlX3VyaSApOworCisJLyogTWFuZ2xlIFVSSSAqLworCW1lbWNweSAoICZ0bXBfdXJpLCBiYXNlX3VyaSwgc2l6ZW9mICggdG1wX3VyaSApICk7CisJaWYgKCByZWxhdGl2ZV91cmktPnBhdGggKSB7CisJCXRtcF9wYXRoID0gcmVzb2x2ZV9wYXRoICggKCBiYXNlX3VyaS0+cGF0aCA/CisJCQkJCSAgICBiYXNlX3VyaS0+cGF0aCA6ICIvIiApLAorCQkJCQkgIHJlbGF0aXZlX3VyaS0+cGF0aCApOworCQl0bXBfdXJpLnBhdGggPSB0bXBfcGF0aDsKKwkJdG1wX3VyaS5xdWVyeSA9IHJlbGF0aXZlX3VyaS0+cXVlcnk7CisJCXRtcF91cmkuZnJhZ21lbnQgPSByZWxhdGl2ZV91cmktPmZyYWdtZW50OworCX0gZWxzZSBpZiAoIHJlbGF0aXZlX3VyaS0+cXVlcnkgKSB7CisJCXRtcF91cmkucXVlcnkgPSByZWxhdGl2ZV91cmktPnF1ZXJ5OworCQl0bXBfdXJpLmZyYWdtZW50ID0gcmVsYXRpdmVfdXJpLT5mcmFnbWVudDsKKwl9IGVsc2UgaWYgKCByZWxhdGl2ZV91cmktPmZyYWdtZW50ICkgeworCQl0bXBfdXJpLmZyYWdtZW50ID0gcmVsYXRpdmVfdXJpLT5mcmFnbWVudDsKKwl9CisKKwkvKiBDcmVhdGUgZGVtYW5nbGVkIFVSSSAqLworCW5ld191cmkgPSB1cmlfZHVwICggJnRtcF91cmkgKTsKKwlmcmVlICggdG1wX3BhdGggKTsKKwlyZXR1cm4gbmV3X3VyaTsKK30KKworLyoqCisgKiBUZXN0IGZvciB1bnJlc2VydmVkIFVSSSBjaGFyYWN0ZXJzCisgKgorICogQHYgYwkJCUNoYXJhY3RlciB0byB0ZXN0CisgKiBAdiBmaWVsZAkJRmllbGQgb2YgVVJJIGluIHdoaWNoIGNoYXJhY3RlciBsaWVzCisgKiBAcmV0IGlzX3VucmVzZXJ2ZWQJQ2hhcmFjdGVyIGlzIGFuIHVucmVzZXJ2ZWQgY2hhcmFjdGVyCisgKi8KK3N0YXRpYyBpbnQgaXNfdW5yZXNlcnZlZF91cmlfY2hhciAoIGludCBjLCBpbnQgZmllbGQgKSB7CisJLyogQWNjb3JkaW5nIHRvIFJGQzM5ODYsIHRoZSB1bnJlc2VydmVkIGNoYXJhY3RlciBzZXQgaXMKKwkgKgorCSAqIEEtWiBhLXogMC05IC0gXyAuIH4KKwkgKgorCSAqIGJ1dCB3ZSBhbHNvIHBhc3MgJiA7ID0gaW4gcXVlcmllcywgLyBpbiBwYXRocywKKwkgKiBhbmQgZXZlcnl0aGluZyBpbiBvcGFxdWVzCisJICovCisJaW50IG9rID0gKCBpc3VwcGVyICggYyApIHx8IGlzbG93ZXIgKCBjICkgfHwgaXNkaWdpdCAoIGMgKSB8fAorCQkgICAgKCBjID09ICctJyApIHx8ICggYyA9PSAnXycgKSB8fAorCQkgICAgKCBjID09ICcuJyApIHx8ICggYyA9PSAnficgKSApOworCisJaWYgKCBmaWVsZCA9PSBVUklfUVVFUlkgKQorCQlvayA9IG9rIHx8ICggYyA9PSAnOycgKSB8fCAoIGMgPT0gJyYnICkgfHwgKCBjID09ICc9JyApOworCisJaWYgKCBmaWVsZCA9PSBVUklfUEFUSCApCisJCW9rID0gb2sgfHwgKCBjID09ICcvJyApOworCisJaWYgKCBmaWVsZCA9PSBVUklfT1BBUVVFICkKKwkJb2sgPSAxOworCisJcmV0dXJuIG9rOworfQorCisvKioKKyAqIFVSSS1lbmNvZGUgc3RyaW5nCisgKgorICogQHYgcmF3X3N0cmluZwlTdHJpbmcgdG8gYmUgVVJJLWVuY29kZWQKKyAqIEB2IGJ1ZgkJQnVmZmVyIHRvIGNvbnRhaW4gZW5jb2RlZCBzdHJpbmcKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorICogQHYgZmllbGQJCUZpZWxkIG9mIFVSSSBpbiB3aGljaCBzdHJpbmcgbGllcworICogQHJldCBsZW4JCUxlbmd0aCBvZiBlbmNvZGVkIHN0cmluZyAoZXhjbHVkaW5nIE5VTCkKKyAqLworc2l6ZV90IHVyaV9lbmNvZGUgKCBjb25zdCBjaGFyICpyYXdfc3RyaW5nLCBjaGFyICpidWYsIHNzaXplX3QgbGVuLAorCQkgICAgaW50IGZpZWxkICkgeworCXNzaXplX3QgcmVtYWluaW5nID0gbGVuOworCXNpemVfdCB1c2VkOworCXVuc2lnbmVkIGNoYXIgYzsKKworCWlmICggbGVuID4gMCApCisJCWJ1ZlswXSA9ICdcMCc7CisKKwl3aGlsZSAoICggYyA9ICoocmF3X3N0cmluZysrKSApICkgeworCQlpZiAoIGlzX3VucmVzZXJ2ZWRfdXJpX2NoYXIgKCBjLCBmaWVsZCApICkgeworCQkJdXNlZCA9IHNzbnByaW50ZiAoIGJ1ZiwgcmVtYWluaW5nLCAiJWMiLCBjICk7CisJCX0gZWxzZSB7CisJCQl1c2VkID0gc3NucHJpbnRmICggYnVmLCByZW1haW5pbmcsICIlJSUwMlgiLCBjICk7CisJCX0KKwkJYnVmICs9IHVzZWQ7CisJCXJlbWFpbmluZyAtPSB1c2VkOworCX0KKworCXJldHVybiAoIGxlbiAtIHJlbWFpbmluZyApOworfQorCisvKioKKyAqIERlY29kZSBVUkktZW5jb2RlZCBzdHJpbmcKKyAqCisgKiBAdiBlbmNvZGVkX3N0cmluZwlVUkktZW5jb2RlZCBzdHJpbmcKKyAqIEB2IGJ1ZgkJQnVmZmVyIHRvIGNvbnRhaW4gZGVjb2RlZCBzdHJpbmcKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBkZWNvZGVkIHN0cmluZyAoZXhjbHVkaW5nIE5VTCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIGluLXBsYWNlLCB3aXRoIEBhIGJ1ZiB0aGUgc2FtZSBhcworICogQGEgZW5jb2RlZF9zdHJpbmcuCisgKi8KK3NpemVfdCB1cmlfZGVjb2RlICggY29uc3QgY2hhciAqZW5jb2RlZF9zdHJpbmcsIGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4gKSB7CisJc3NpemVfdCByZW1haW5pbmc7CisJY2hhciBoZXhidWZbM107CisJY2hhciAqaGV4YnVmX2VuZDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlmb3IgKCByZW1haW5pbmcgPSBsZW47ICplbmNvZGVkX3N0cmluZzsgcmVtYWluaW5nLS0gKSB7CisJCWlmICggKmVuY29kZWRfc3RyaW5nID09ICclJyApIHsKKwkJCWVuY29kZWRfc3RyaW5nKys7CisJCQlzbnByaW50ZiAoIGhleGJ1Ziwgc2l6ZW9mICggaGV4YnVmICksICIlcyIsCisJCQkJICAgZW5jb2RlZF9zdHJpbmcgKTsKKwkJCWMgPSBzdHJ0b3VsICggaGV4YnVmLCAmaGV4YnVmX2VuZCwgMTYgKTsKKwkJCWVuY29kZWRfc3RyaW5nICs9ICggaGV4YnVmX2VuZCAtIGhleGJ1ZiApOworCQl9IGVsc2UgeworCQkJYyA9ICooZW5jb2RlZF9zdHJpbmcrKyk7CisJCX0KKwkJaWYgKCByZW1haW5pbmcgPiAxICkKKwkJCSpidWYrKyA9IGM7CisJfQorCisJaWYgKCBsZW4gKQorCQkqYnVmID0gMDsKKworCXJldHVybiAoIGxlbiAtIHJlbWFpbmluZyApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS91dWlkLmMgYi9ncHhlL3NyYy9jb3JlL3V1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjY3ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS91dWlkLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL3V1aWQuaD4KKworLyoqIEBmaWxlCisgKgorICogVW5pdmVyc2FsbHkgdW5pcXVlIElEcworICoKKyAqLworCisvKioKKyAqIENvbnZlcnQgVVVJRCB0byBwcmludGFibGUgc3RyaW5nCisgKgorICogQHYgdXVpZAkJVVVJRAorICogQHJldCBzdHJpbmcJCVVVSUQgaW4gY2Fub25pY2FsIGZvcm0KKyAqLworY2hhciAqIHV1aWRfbnRvYSAoIHVuaW9uIHV1aWQgKnV1aWQgKSB7CisJc3RhdGljIGNoYXIgYnVmWzM3XTsgLyogIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIgKi8KKworCXNwcmludGYgKCBidWYsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCSAgYmUzMl90b19jcHUgKCB1dWlkLT5jYW5vbmljYWwuYSApLAorCQkgIGJlMTZfdG9fY3B1ICggdXVpZC0+Y2Fub25pY2FsLmIgKSwKKwkJICBiZTE2X3RvX2NwdSAoIHV1aWQtPmNhbm9uaWNhbC5jICksCisJCSAgYmUxNl90b19jcHUgKCB1dWlkLT5jYW5vbmljYWwuZCApLAorCQkgIHV1aWQtPmNhbm9uaWNhbC5lWzBdLCB1dWlkLT5jYW5vbmljYWwuZVsxXSwKKwkJICB1dWlkLT5jYW5vbmljYWwuZVsyXSwgdXVpZC0+Y2Fub25pY2FsLmVbM10sCisJCSAgdXVpZC0+Y2Fub25pY2FsLmVbNF0sIHV1aWQtPmNhbm9uaWNhbC5lWzVdICk7CisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NvcmUvdnNwcmludGYuYyBiL2dweGUvc3JjL2NvcmUvdnNwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWFiMjQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS92c3ByaW50Zi5jCkBAIC0wLDAgKzEsNDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL3ZzcHJpbnRmLmg+CisKKy8qKiBAZmlsZSAqLworCisjZGVmaW5lIENIQVJfTEVOCTAJLyoqPCAiaGgiIGxlbmd0aCBtb2RpZmllciAqLworI2RlZmluZSBTSE9SVF9MRU4JMQkvKio8ICJoIiBsZW5ndGggbW9kaWZpZXIgKi8KKyNkZWZpbmUgSU5UX0xFTgkJMgkvKio8IG5vIGxlbmd0aCBtb2RpZmllciAqLworI2RlZmluZSBMT05HX0xFTgkzCS8qKjwgImwiIGxlbmd0aCBtb2RpZmllciAqLworI2RlZmluZSBMT05HTE9OR19MRU4JNAkvKio8ICJsbCIgbGVuZ3RoIG1vZGlmaWVyICovCisjZGVmaW5lIFNJWkVfVF9MRU4JNQkvKio8ICJ6IiBsZW5ndGggbW9kaWZpZXIgKi8KKworc3RhdGljIHVpbnQ4X3QgdHlwZV9zaXplc1tdID0geworCVtDSEFSX0xFTl0JPSBzaXplb2YgKCBjaGFyICksCisJW1NIT1JUX0xFTl0JPSBzaXplb2YgKCBzaG9ydCApLAorCVtJTlRfTEVOXQk9IHNpemVvZiAoIGludCApLAorCVtMT05HX0xFTl0JPSBzaXplb2YgKCBsb25nICksCisJW0xPTkdMT05HX0xFTl0JPSBzaXplb2YgKCBsb25nIGxvbmcgKSwKKwlbU0laRV9UX0xFTl0JPSBzaXplb2YgKCBzaXplX3QgKSwKK307CisKKy8qKgorICogVXNlIGxvd2VyLWNhc2UgZm9yIGhleGFkZWNpbWFsIGRpZ2l0cworICoKKyAqIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGlzIHNldCB0byAweDIwIHNpbmNlIHRoYXQgbWFrZXMgZm9yIHZlcnkKKyAqIGVmZmljaWVudCBjYWxjdWxhdGlvbnMuICAoQml0d2lzZS1PUmluZyB3aXRoIEBjIExDQVNFIGNvbnZlcnRzIHRvIGEKKyAqIGxvd2VyLWNhc2UgY2hhcmFjdGVyLCBmb3IgZXhhbXBsZS4pCisgKi8KKyNkZWZpbmUgTENBU0UgMHgyMAorCisvKioKKyAqIFVzZSAiYWx0ZXJuYXRlIGZvcm0iCisgKgorICogRm9yIGhleGFkZWNpbWFsIG51bWJlcnMsIHRoaXMgbWVhbnMgdG8gYWRkIGEgIjB4IiBvciAiMFgiIHByZWZpeCB0bworICogdGhlIG51bWJlci4KKyAqLworI2RlZmluZSBBTFRfRk9STSAweDAyCisKKy8qKgorICogRm9ybWF0IGEgaGV4YWRlY2ltYWwgbnVtYmVyCisgKgorICogQHYgZW5kCQlFbmQgb2YgYnVmZmVyIHRvIGNvbnRhaW4gbnVtYmVyCisgKiBAdiBudW0JCU51bWJlciB0byBmb3JtYXQKKyAqIEB2IHdpZHRoCQlNaW5pbXVtIGZpZWxkIHdpZHRoCisgKiBAcmV0IHB0cgkJRW5kIG9mIGJ1ZmZlcgorICoKKyAqIEZpbGxzIGEgYnVmZmVyIGluIHJldmVyc2Ugb3JkZXIgd2l0aCBhIGZvcm1hdHRlZCBoZXhhZGVjaW1hbAorICogbnVtYmVyLiAgVGhlIG51bWJlciB3aWxsIGJlIHplcm8tcGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGguCisgKiBMb3dlci1jYXNlIGFuZCAiYWx0ZXJuYXRlIGZvcm0iIChpLmUuICIweCIgcHJlZml4KSBmbGFncyBtYXkgYmUKKyAqIHNldC4KKyAqCisgKiBUaGVyZSBtdXN0IGJlIGVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyIHRvIGNvbnRhaW4gdGhlIGxhcmdlc3QKKyAqIG51bWJlciB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIGZvcm1hdC4KKyAqLworc3RhdGljIGNoYXIgKiBmb3JtYXRfaGV4ICggY2hhciAqZW5kLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtLCBpbnQgd2lkdGgsCisJCQkgICBpbnQgZmxhZ3MgKSB7CisJY2hhciAqcHRyID0gZW5kOworCWludCBjYXNlX21vZDsKKworCS8qIEdlbmVyYXRlIHRoZSBudW1iZXIgKi8KKwljYXNlX21vZCA9IGZsYWdzICYgTENBU0U7CisJZG8geworCQkqKC0tcHRyKSA9ICIwMTIzNDU2Nzg5QUJDREVGIlsgbnVtICYgMHhmIF0gfCBjYXNlX21vZDsKKwkJbnVtID4+PSA0OworCX0gd2hpbGUgKCBudW0gKTsKKworCS8qIFplcm8tcGFkIHRvIHdpZHRoICovCisJd2hpbGUgKCAoIGVuZCAtIHB0ciApIDwgd2lkdGggKQorCQkqKC0tcHRyKSA9ICcwJzsKKworCS8qIEFkZCAiMHgiIG9yICIwWCIgaWYgYWx0ZXJuYXRlIGZvcm0gc3BlY2lmaWVkICovCisJaWYgKCBmbGFncyAmIEFMVF9GT1JNICkgeworCQkqKC0tcHRyKSA9ICdYJyB8IGNhc2VfbW9kOworCQkqKC0tcHRyKSA9ICcwJzsKKwl9CisKKwlyZXR1cm4gcHRyOworfQorCisvKioKKyAqIEZvcm1hdCBhIGRlY2ltYWwgbnVtYmVyCisgKgorICogQHYgZW5kCQlFbmQgb2YgYnVmZmVyIHRvIGNvbnRhaW4gbnVtYmVyCisgKiBAdiBudW0JCU51bWJlciB0byBmb3JtYXQKKyAqIEB2IHdpZHRoCQlNaW5pbXVtIGZpZWxkIHdpZHRoCisgKiBAcmV0IHB0cgkJRW5kIG9mIGJ1ZmZlcgorICoKKyAqIEZpbGxzIGEgYnVmZmVyIGluIHJldmVyc2Ugb3JkZXIgd2l0aCBhIGZvcm1hdHRlZCBkZWNpbWFsIG51bWJlci4KKyAqIFRoZSBudW1iZXIgd2lsbCBiZSBzcGFjZS1wYWRkZWQgdG8gdGhlIHNwZWNpZmllZCB3aWR0aC4KKyAqCisgKiBUaGVyZSBtdXN0IGJlIGVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyIHRvIGNvbnRhaW4gdGhlIGxhcmdlc3QKKyAqIG51bWJlciB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIGZvcm1hdC4KKyAqLworc3RhdGljIGNoYXIgKiBmb3JtYXRfZGVjaW1hbCAoIGNoYXIgKmVuZCwgc2lnbmVkIGxvbmcgbnVtLCBpbnQgd2lkdGggKSB7CisJY2hhciAqcHRyID0gZW5kOworCWludCBuZWdhdGl2ZSA9IDA7CisKKwkvKiBHZW5lcmF0ZSB0aGUgbnVtYmVyICovCisJaWYgKCBudW0gPCAwICkgeworCQluZWdhdGl2ZSA9IDE7CisJCW51bSA9IC1udW07CisJfQorCWRvIHsKKwkJKigtLXB0cikgPSAnMCcgKyAoIG51bSAlIDEwICk7CisJCW51bSAvPSAxMDsKKwl9IHdoaWxlICggbnVtICk7CisKKwkvKiBBZGQgIi0iIGlmIG5lY2Vzc2FyeSAqLworCWlmICggbmVnYXRpdmUgKQorCQkqKC0tcHRyKSA9ICctJzsKKworCS8qIFNwYWNlLXBhZCB0byB3aWR0aCAqLworCXdoaWxlICggKCBlbmQgLSBwdHIgKSA8IHdpZHRoICkKKwkJKigtLXB0cikgPSAnICc7CisKKwlyZXR1cm4gcHRyOworfQorCisvKioKKyAqIFByaW50IGNoYXJhY3RlciB2aWEgYSBwcmludGYgY29udGV4dAorICoKKyAqIEB2IGN0eAkJQ29udGV4dAorICogQHYgYwkJCUNoYXJhY3RlcgorICoKKyAqIENhbGwncyB0aGUgcHJpbnRmX2NvbnRleHQ6OmhhbmRsZXIoKSBtZXRob2QgYW5kIGluY3JlbWVudHMKKyAqIHByaW50Zl9jb250ZXh0OjpsZW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHV0Y2hhciAoIHN0cnVjdCBwcmludGZfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgYyApIHsKKwljdHgtPmhhbmRsZXIgKCBjdHgsIGMgKTsKKwkrK2N0eC0+bGVuOworfQorCisvKioKKyAqIFdyaXRlIGEgZm9ybWF0dGVkIHN0cmluZyB0byBhIHByaW50ZiBjb250ZXh0CisgKgorICogQHYgY3R4CQlDb250ZXh0CisgKiBAdiBmbXQJCUZvcm1hdCBzdHJpbmcKKyAqIEB2IGFyZ3MJCUFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCBzdHJpbmcKKyAqLworc2l6ZV90IHZjcHJpbnRmICggc3RydWN0IHByaW50Zl9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkgeworCWludCBmbGFnczsKKwlpbnQgd2lkdGg7CisJdWludDhfdCAqbGVuZ3RoOworCWNoYXIgKnB0cjsKKwljaGFyIHRtcF9idWZbMzJdOyAvKiAzMiBpcyBlbm91Z2ggZm9yIGFsbCBudW1lcmljYWwgZm9ybWF0cy4KKwkJCSAgICogSW5zYW5lIHdpZHRoIGZpZWxkcyBjb3VsZCBvdmVyZmxvdyB0aGlzIGJ1ZmZlci4gKi8KKworCS8qIEluaXRpYWxpc2UgY29udGV4dCAqLworCWN0eC0+bGVuID0gMDsKKworCWZvciAoIDsgKmZtdCA7IGZtdCsrICkgeworCQkvKiBQYXNzIHRocm91Z2ggb3JkaW5hcnkgY2hhcmFjdGVycyAqLworCQlpZiAoICpmbXQgIT0gJyUnICkgeworCQkJY3B1dGNoYXIgKCBjdHgsICpmbXQgKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZtdCsrOworCQkvKiBQcm9jZXNzIGZsYWcgY2hhcmFjdGVycyAqLworCQlmbGFncyA9IDA7CisJCWZvciAoIDsgOyBmbXQrKyApIHsKKwkJCWlmICggKmZtdCA9PSAnIycgKSB7CisJCQkJZmxhZ3MgfD0gQUxUX0ZPUk07CisJCQl9IGVsc2UgaWYgKCAqZm10ID09ICcwJyApIHsKKwkJCQkvKiBXZSBhbHdheXMgMC1wYWQgaGV4IGFuZCBzcGFjZS1wYWQgZGVjaW1hbCAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBFbmQgb2YgZmxhZyBjaGFyYWN0ZXJzICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogUHJvY2VzcyBmaWVsZCB3aWR0aCAqLworCQl3aWR0aCA9IDA7CisJCWZvciAoIDsgOyBmbXQrKyApIHsKKwkJCWlmICggKCAoIHVuc2lnbmVkICkgKCAqZm10IC0gJzAnICkgKSA8IDEwICkgeworCQkJCXdpZHRoID0gKCB3aWR0aCAqIDEwICkgKyAoICpmbXQgLSAnMCcgKTsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogV2UgZG9uJ3QgZG8gZmxvYXRpbmcgcG9pbnQgKi8KKwkJLyogUHJvY2VzcyBsZW5ndGggbW9kaWZpZXIgKi8KKwkJbGVuZ3RoID0gJnR5cGVfc2l6ZXNbSU5UX0xFTl07CisJCWZvciAoIDsgOyBmbXQrKyApIHsKKwkJCWlmICggKmZtdCA9PSAnaCcgKSB7CisJCQkJbGVuZ3RoLS07CisJCQl9IGVsc2UgaWYgKCAqZm10ID09ICdsJyApIHsKKwkJCQlsZW5ndGgrKzsKKwkJCX0gZWxzZSBpZiAoICpmbXQgPT0gJ3onICkgeworCQkJCWxlbmd0aCA9ICZ0eXBlX3NpemVzW1NJWkVfVF9MRU5dOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBQcm9jZXNzIGNvbnZlcnNpb24gc3BlY2lmaWVyICovCisJCXB0ciA9IHRtcF9idWYgKyBzaXplb2YgKCB0bXBfYnVmICkgLSAxOworCQkqcHRyID0gJ1wwJzsKKwkJaWYgKCAqZm10ID09ICdjJyApIHsKKwkJCWNwdXRjaGFyICggY3R4LCB2YV9hcmcgKCBhcmdzLCB1bnNpZ25lZCBpbnQgKSApOworCQl9IGVsc2UgaWYgKCAqZm10ID09ICdzJyApIHsKKwkJCXB0ciA9IHZhX2FyZyAoIGFyZ3MsIGNoYXIgKiApOworCQkJaWYgKCAhIHB0ciApCisJCQkJcHRyID0gIjxOVUxMPiI7CisJCX0gZWxzZSBpZiAoICpmbXQgPT0gJ3AnICkgeworCQkJaW50cHRyX3QgcHRydmFsOworCisJCQlwdHJ2YWwgPSAoIGludHB0cl90ICkgdmFfYXJnICggYXJncywgdm9pZCAqICk7CisJCQlwdHIgPSBmb3JtYXRfaGV4ICggcHRyLCBwdHJ2YWwsIHdpZHRoLCAKKwkJCQkJICAgKCBBTFRfRk9STSB8IExDQVNFICkgKTsKKwkJfSBlbHNlIGlmICggKCAqZm10ICYgfjB4MjAgKSA9PSAnWCcgKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgaGV4OworCisJCQlmbGFncyB8PSAoICpmbXQgJiAweDIwICk7IC8qIExDQVNFICovCisJCQlpZiAoICpsZW5ndGggPj0gc2l6ZW9mICggdW5zaWduZWQgbG9uZyBsb25nICkgKSB7CisJCQkJaGV4ID0gdmFfYXJnICggYXJncywgdW5zaWduZWQgbG9uZyBsb25nICk7CisJCQl9IGVsc2UgaWYgKCAqbGVuZ3RoID49IHNpemVvZiAoIHVuc2lnbmVkIGxvbmcgKSApIHsKKwkJCQloZXggPSB2YV9hcmcgKCBhcmdzLCB1bnNpZ25lZCBsb25nICk7CisJCQl9IGVsc2UgeworCQkJCWhleCA9IHZhX2FyZyAoIGFyZ3MsIHVuc2lnbmVkIGludCApOworCQkJfQorCQkJcHRyID0gZm9ybWF0X2hleCAoIHB0ciwgaGV4LCB3aWR0aCwgZmxhZ3MgKTsKKwkJfSBlbHNlIGlmICggKCAqZm10ID09ICdkJyApIHx8ICggKmZtdCA9PSAnaScgKSApeworCQkJc2lnbmVkIGxvbmcgZGVjaW1hbDsKKworCQkJaWYgKCAqbGVuZ3RoID49IHNpemVvZiAoIHNpZ25lZCBsb25nICkgKSB7CisJCQkJZGVjaW1hbCA9IHZhX2FyZyAoIGFyZ3MsIHNpZ25lZCBsb25nICk7CisJCQl9IGVsc2UgeworCQkJCWRlY2ltYWwgPSB2YV9hcmcgKCBhcmdzLCBzaWduZWQgaW50ICk7CisJCQl9CisJCQlwdHIgPSBmb3JtYXRfZGVjaW1hbCAoIHB0ciwgZGVjaW1hbCwgd2lkdGggKTsKKwkJfSBlbHNlIHsKKwkJCSooLS1wdHIpID0gKmZtdDsKKwkJfQorCQkvKiBXcml0ZSBvdXQgY29udmVyc2lvbiByZXN1bHQgKi8KKwkJZm9yICggOyAqcHRyIDsgcHRyKysgKSB7CisJCQljcHV0Y2hhciAoIGN0eCwgKnB0ciApOworCQl9CisJfQorCisJcmV0dXJuIGN0eC0+bGVuOworfQorCisvKiogQ29udGV4dCB1c2VkIGJ5IHZzbnByaW50ZigpIGFuZCBmcmllbmRzICovCitzdHJ1Y3Qgc3B1dGNfY29udGV4dCB7CisJc3RydWN0IHByaW50Zl9jb250ZXh0IGN0eDsKKwkvKiogQnVmZmVyIGZvciBmb3JtYXR0ZWQgc3RyaW5nICh1c2VkIGJ5IHByaW50Zl9zcHV0YygpKSAqLworCWNoYXIgKmJ1ZjsKKwkvKiogQnVmZmVyIGxlbmd0aCAodXNlZCBieSBwcmludGZfc3B1dGMoKSkgKi8KKwlzaXplX3QgbWF4X2xlbjsJCit9OworCisvKioKKyAqIFdyaXRlIGNoYXJhY3RlciB0byBidWZmZXIKKyAqCisgKiBAdiBjdHgJCUNvbnRleHQKKyAqIEB2IGMJCQlDaGFyYWN0ZXIKKyAqLworc3RhdGljIHZvaWQgcHJpbnRmX3NwdXRjICggc3RydWN0IHByaW50Zl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGludCBjICkgeworCXN0cnVjdCBzcHV0Y19jb250ZXh0ICogc2N0eCA9CisJCWNvbnRhaW5lcl9vZiAoIGN0eCwgc3RydWN0IHNwdXRjX2NvbnRleHQsIGN0eCApOworCisJaWYgKCBjdHgtPmxlbiA8IHNjdHgtPm1heF9sZW4gKQorCQlzY3R4LT5idWZbY3R4LT5sZW5dID0gYzsKK30KKworLyoqCisgKiBXcml0ZSBhIGZvcm1hdHRlZCBzdHJpbmcgdG8gYSBidWZmZXIKKyAqCisgKiBAdiBidWYJCUJ1ZmZlciBpbnRvIHdoaWNoIHRvIHdyaXRlIHRoZSBzdHJpbmcKKyAqIEB2IHNpemUJCVNpemUgb2YgYnVmZmVyCisgKiBAdiBmbXQJCUZvcm1hdCBzdHJpbmcKKyAqIEB2IGFyZ3MJCUFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCBzdHJpbmcKKyAqCisgKiBJZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbCB0byBjb250YWluIHRoZSBzdHJpbmcsIHRoZSByZXR1cm5lZAorICogbGVuZ3RoIGlzIHRoZSBsZW5ndGggdGhhdCB3b3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBoYWQgZW5vdWdoIHNwYWNlCisgKiBiZWVuIGF2YWlsYWJsZS4KKyAqLworaW50IHZzbnByaW50ZiAoIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkgeworCXN0cnVjdCBzcHV0Y19jb250ZXh0IHNjdHg7CisJc2l6ZV90IGxlbjsKKwlzaXplX3QgZW5kOworCisJLyogSGFuZCBvZmYgdG8gdmNwcmludGYgKi8KKwlzY3R4LmN0eC5oYW5kbGVyID0gcHJpbnRmX3NwdXRjOworCXNjdHguYnVmID0gYnVmOworCXNjdHgubWF4X2xlbiA9IHNpemU7CisJbGVuID0gdmNwcmludGYgKCAmc2N0eC5jdHgsIGZtdCwgYXJncyApOworCisJLyogQWRkIHRyYWlsaW5nIE5VTCAqLworCWlmICggc2l6ZSApIHsKKwkJZW5kID0gc2l6ZSAtIDE7CisJCWlmICggbGVuIDwgZW5kICkKKwkJCWVuZCA9IGxlbjsKKwkJYnVmW2VuZF0gPSAnXDAnOworCX0KKworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogV3JpdGUgYSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGEgYnVmZmVyCisgKgorICogQHYgYnVmCQlCdWZmZXIgaW50byB3aGljaCB0byB3cml0ZSB0aGUgc3RyaW5nCisgKiBAdiBzaXplCQlTaXplIG9mIGJ1ZmZlcgorICogQHYgZm10CQlGb3JtYXQgc3RyaW5nCisgKiBAdiAuLi4JCUFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCBzdHJpbmcKKyAqLworaW50IHNucHJpbnRmICggY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4gKSB7CisJdmFfbGlzdCBhcmdzOworCWludCBpOworCisJdmFfc3RhcnQgKCBhcmdzLCBmbXQgKTsKKwlpID0gdnNucHJpbnRmICggYnVmLCBzaXplLCBmbXQsIGFyZ3MgKTsKKwl2YV9lbmQgKCBhcmdzICk7CisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogVmVyc2lvbiBvZiB2c25wcmludGYoKSB0aGF0IGFjY2VwdHMgYSBzaWduZWQgYnVmZmVyIHNpemUKKyAqCisgKiBAdiBidWYJCUJ1ZmZlciBpbnRvIHdoaWNoIHRvIHdyaXRlIHRoZSBzdHJpbmcKKyAqIEB2IHNpemUJCVNpemUgb2YgYnVmZmVyCisgKiBAdiBmbXQJCUZvcm1hdCBzdHJpbmcKKyAqIEB2IGFyZ3MJCUFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCBzdHJpbmcKKyAqLworaW50IHZzc25wcmludGYgKCBjaGFyICpidWYsIHNzaXplX3Qgc3NpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkgeworCisJLyogVHJlYXQgbmVnYXRpdmUgYnVmZmVyIHNpemUgYXMgemVybyBidWZmZXIgc2l6ZSAqLworCWlmICggc3NpemUgPCAwICkKKwkJc3NpemUgPSAwOworCisJLyogSGFuZCBvZmYgdG8gdnNucHJpbnRmICovCisJcmV0dXJuIHZzbnByaW50ZiAoIGJ1Ziwgc3NpemUsIGZtdCwgYXJncyApOworfQorCisvKioKKyAqIFZlcnNpb24gb2YgdnNucHJpbnRmKCkgdGhhdCBhY2NlcHRzIGEgc2lnbmVkIGJ1ZmZlciBzaXplCisgKgorICogQHYgYnVmCQlCdWZmZXIgaW50byB3aGljaCB0byB3cml0ZSB0aGUgc3RyaW5nCisgKiBAdiBzaXplCQlTaXplIG9mIGJ1ZmZlcgorICogQHYgZm10CQlGb3JtYXQgc3RyaW5nCisgKiBAdiAuLi4JCUFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCBzdHJpbmcKKyAqLworaW50IHNzbnByaW50ZiAoIGNoYXIgKmJ1Ziwgc3NpemVfdCBzc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4gKSB7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW47CisKKwkvKiBIYW5kIG9mZiB0byB2c3NucHJpbnRmICovCisJdmFfc3RhcnQgKCBhcmdzLCBmbXQgKTsKKwlsZW4gPSB2c3NucHJpbnRmICggYnVmLCBzc2l6ZSwgZm10LCBhcmdzICk7CisJdmFfZW5kICggYXJncyApOworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogV3JpdGUgY2hhcmFjdGVyIHRvIGNvbnNvbGUKKyAqCisgKiBAdiBjdHgJCUNvbnRleHQKKyAqIEB2IGMJCQlDaGFyYWN0ZXIKKyAqLworc3RhdGljIHZvaWQgcHJpbnRmX3B1dGNoYXIgKCBzdHJ1Y3QgcHJpbnRmX2NvbnRleHQgKmN0eCBfX3VudXNlZCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGMgKSB7CisJcHV0Y2hhciAoIGMgKTsKK30KKworLyoqCisgKiBXcml0ZSBhIGZvcm1hdHRlZCBzdHJpbmcgdG8gdGhlIGNvbnNvbGUKKyAqCisgKiBAdiBmbXQJCUZvcm1hdCBzdHJpbmcKKyAqIEB2IGFyZ3MJCUFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCBzdHJpbmcKKyAqLworaW50IHZwcmludGYgKCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyApIHsKKwlzdHJ1Y3QgcHJpbnRmX2NvbnRleHQgY3R4OworCisJLyogSGFuZCBvZmYgdG8gdmNwcmludGYgKi8KKwljdHguaGFuZGxlciA9IHByaW50Zl9wdXRjaGFyOwkKKwlyZXR1cm4gdmNwcmludGYgKCAmY3R4LCBmbXQsIGFyZ3MgKTsJCit9CisKKy8qKgorICogV3JpdGUgYSBmb3JtYXR0ZWQgc3RyaW5nIHRvIHRoZSBjb25zb2xlLgorICoKKyAqIEB2IGZtdAkJRm9ybWF0IHN0cmluZworICogQHYgLi4uCQlBcmd1bWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgZm9ybWF0IHN0cmluZworICogQHJldAlsZW4JCUxlbmd0aCBvZiBmb3JtYXR0ZWQgc3RyaW5nCisgKi8KK2ludCBwcmludGYgKCBjb25zdCBjaGFyICpmbXQsIC4uLiApIHsKKwl2YV9saXN0IGFyZ3M7CisJaW50IGk7CisKKwl2YV9zdGFydCAoIGFyZ3MsIGZtdCApOworCWkgPSB2cHJpbnRmICggZm10LCBhcmdzICk7CisJdmFfZW5kICggYXJncyApOworCXJldHVybiBpOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY29yZS94ZmVyLmMgYi9ncHhlL3NyYy9jb3JlL3hmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM2ZjlkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY29yZS94ZmVyLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIERhdGEgdHJhbnNmZXIgaW50ZXJmYWNlcworICoKKyAqLworCisvKioKKyAqIER1bW15IHRyYW5zZmVyIG1ldGFkYXRhCisgKgorICogVGhpcyBnZXRzIHBhc3NlZCB0byB4ZmVyX2ludGVyZmFjZTo6ZGVsaXZlcl9pb2IoKSBhbmQgZXF1aXZhbGVudHMKKyAqIHdoZW4gbm8gbWV0YWRhdGEgaXMgYXZhaWxhYmxlLgorICovCitzdGF0aWMgc3RydWN0IHhmZXJfbWV0YWRhdGEgZHVtbXlfbWV0YWRhdGE7CisKKy8qKgorICogQ2xvc2UgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgcmMJCVJlYXNvbiBmb3IgY2xvc2UKKyAqLwordm9pZCB4ZmVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKSB7CisJc3RydWN0IHhmZXJfaW50ZXJmYWNlICpkZXN0ID0geGZlcl9nZXRfZGVzdCAoIHhmZXIgKTsKKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyAqb3AgPSB4ZmVyLT5vcDsKKworCURCR0MgKCB4ZmVyLCAiWEZFUiAlcC0+JXAgY2xvc2VcbiIsIHhmZXIsIGRlc3QgKTsKKworCXhmZXJfdW5wbHVnICggeGZlciApOworCXhmZXJfbnVsbGlmeSAoIHhmZXIgKTsKKwlkZXN0LT5vcC0+Y2xvc2UgKCBkZXN0LCByYyApOworCXhmZXItPm9wID0gb3A7CisJeGZlcl9wdXQgKCBkZXN0ICk7Cit9CisKKy8qKgorICogU2VuZCByZWRpcmVjdGlvbiBldmVudAorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiB0eXBlCQlOZXcgbG9jYXRpb24gdHlwZQorICogQHYgYXJncwkJUmVtYWluaW5nIGFyZ3VtZW50cyBkZXBlbmQgdXBvbiBsb2NhdGlvbiB0eXBlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHhmZXJfdnJlZGlyZWN0ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgdHlwZSwgdmFfbGlzdCBhcmdzICkgeworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqZGVzdCA9IHhmZXJfZ2V0X2Rlc3QgKCB4ZmVyICk7CisJaW50IHJjOworCisJREJHQyAoIHhmZXIsICJYRkVSICVwLT4lcCByZWRpcmVjdFxuIiwgeGZlciwgZGVzdCApOworCisJcmMgPSBkZXN0LT5vcC0+dnJlZGlyZWN0ICggZGVzdCwgdHlwZSwgYXJncyApOworCisJaWYgKCByYyAhPSAwICkgeworCQlEQkdDICggeGZlciwgIlhGRVIgJXA8LSVwIHJlZGlyZWN0OiAlc1xuIiwgeGZlciwgZGVzdCwKKwkJICAgICAgIHN0cmVycm9yICggcmMgKSApOworCX0KKwl4ZmVyX3B1dCAoIGRlc3QgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogU2VuZCByZWRpcmVjdGlvbiBldmVudAorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiB0eXBlCQlOZXcgbG9jYXRpb24gdHlwZQorICogQHYgLi4uCQlSZW1haW5pbmcgYXJndW1lbnRzIGRlcGVuZCB1cG9uIGxvY2F0aW9uIHR5cGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgeGZlcl9yZWRpcmVjdCAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHR5cGUsIC4uLiApIHsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJjOworCisJdmFfc3RhcnQgKCBhcmdzLCB0eXBlICk7CisJcmMgPSB4ZmVyX3ZyZWRpcmVjdCAoIHhmZXIsIHR5cGUsIGFyZ3MgKTsKKwl2YV9lbmQgKCBhcmdzICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIENoZWNrIGZsb3cgY29udHJvbCB3aW5kb3cKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHJldCBsZW4JCUxlbmd0aCBvZiB3aW5kb3cKKyAqLworc2l6ZV90IHhmZXJfd2luZG93ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyICkgeworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqZGVzdCA9IHhmZXJfZ2V0X2Rlc3QgKCB4ZmVyICk7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IGRlc3QtPm9wLT53aW5kb3cgKCBkZXN0ICk7CisKKwl4ZmVyX3B1dCAoIGRlc3QgKTsKKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIEFsbG9jYXRlIEkvTyBidWZmZXIKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgbGVuCQlJL08gYnVmZmVyIHBheWxvYWQgbGVuZ3RoCisgKiBAcmV0IGlvYnVmCQlJL08gYnVmZmVyCisgKi8KK3N0cnVjdCBpb19idWZmZXIgKiB4ZmVyX2FsbG9jX2lvYiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKmRlc3QgPSB4ZmVyX2dldF9kZXN0ICggeGZlciApOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCisJREJHQyAoIHhmZXIsICJYRkVSICVwLT4lcCBhbGxvY19pb2IgJXpkXG4iLCB4ZmVyLCBkZXN0LCBsZW4gKTsKKworCWlvYnVmID0gZGVzdC0+b3AtPmFsbG9jX2lvYiAoIGRlc3QsIGxlbiApOworCisJaWYgKCAhIGlvYnVmICkgeworCQlEQkdDICggeGZlciwgIlhGRVIgJXA8LSVwIGFsbG9jX2lvYiBmYWlsZWRcbiIsIHhmZXIsIGRlc3QgKTsKKwl9CisJeGZlcl9wdXQgKCBkZXN0ICk7CisJcmV0dXJuIGlvYnVmOworfQorCisvKioKKyAqIERlbGl2ZXIgZGF0YWdyYW0gYXMgSS9PIGJ1ZmZlciB3aXRoIG1ldGFkYXRhCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IGlvYnVmCQlEYXRhZ3JhbSBJL08gYnVmZmVyCisgKiBAdiBtZXRhCQlEYXRhIHRyYW5zZmVyIG1ldGFkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHhmZXJfZGVsaXZlcl9pb2JfbWV0YSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCSAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCSAgICBzdHJ1Y3QgeGZlcl9tZXRhZGF0YSAqbWV0YSApIHsKKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKmRlc3QgPSB4ZmVyX2dldF9kZXN0ICggeGZlciApOworCWludCByYzsKKworCURCR0MgKCB4ZmVyLCAiWEZFUiAlcC0+JXAgZGVsaXZlcl9pb2IgJXpkXG4iLCB4ZmVyLCBkZXN0LAorCSAgICAgICBpb2JfbGVuICggaW9idWYgKSApOworCisJcmMgPSBkZXN0LT5vcC0+ZGVsaXZlcl9pb2IgKCBkZXN0LCBpb2J1ZiwgbWV0YSApOworCisJaWYgKCByYyAhPSAwICkgeworCQlEQkdDICggeGZlciwgIlhGRVIgJXA8LSVwIGRlbGl2ZXJfaW9iOiAlc1xuIiwgeGZlciwgZGVzdCwKKwkJICAgICAgIHN0cmVycm9yICggcmMgKSApOworCX0KKwl4ZmVyX3B1dCAoIGRlc3QgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogRGVsaXZlciBkYXRhZ3JhbSBhcyBJL08gYnVmZmVyIHdpdGggbWV0YWRhdGEKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgaW9idWYJCURhdGFncmFtIEkvTyBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgeGZlcl9kZWxpdmVyX2lvYiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJICAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXJldHVybiB4ZmVyX2RlbGl2ZXJfaW9iX21ldGEgKCB4ZmVyLCBpb2J1ZiwgJmR1bW15X21ldGFkYXRhICk7Cit9CisKKy8qKgorICogRGVsaXZlciBkYXRhZ3JhbSBhcyByYXcgZGF0YQorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiBpb2J1ZgkJRGF0YWdyYW0gSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB4ZmVyX2RlbGl2ZXJfcmF3ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKmRlc3QgPSB4ZmVyX2dldF9kZXN0ICggeGZlciApOworCWludCByYzsKKworCURCR0MgKCB4ZmVyLCAiWEZFUiAlcC0+JXAgZGVsaXZlcl9yYXcgJXArJXpkXG4iLCB4ZmVyLCBkZXN0LAorCSAgICAgICBkYXRhLCBsZW4gKTsKKworCXJjID0gZGVzdC0+b3AtPmRlbGl2ZXJfcmF3ICggZGVzdCwgZGF0YSwgbGVuICk7CisKKwlpZiAoIHJjICE9IDAgKSB7CisJCURCR0MgKCB4ZmVyLCAiWEZFUiAlcDwtJXAgZGVsaXZlcl9yYXc6ICVzXG4iLCB4ZmVyLCBkZXN0LAorCQkgICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJfQorCXhmZXJfcHV0ICggZGVzdCApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBEZWxpdmVyIGZvcm1hdHRlZCBzdHJpbmcKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgZm9ybWF0CQlGb3JtYXQgc3RyaW5nCisgKiBAdiBhcmdzCQlBcmd1bWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgZm9ybWF0IHN0cmluZworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB4ZmVyX3ZwcmludGYgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwKKwkJICAgdmFfbGlzdCBhcmdzICkgeworCXNpemVfdCBsZW47CisJdmFfbGlzdCBhcmdzX3RtcDsKKworCXZhX2NvcHkgKCBhcmdzX3RtcCwgYXJncyApOworCWxlbiA9IHZzbnByaW50ZiAoIE5VTEwsIDAsIGZvcm1hdCwgYXJncyApOworCXsKKwkJY2hhciBidWZbbGVuICsgMV07CisJCXZzbnByaW50ZiAoIGJ1Ziwgc2l6ZW9mICggYnVmICksIGZvcm1hdCwgYXJnc190bXAgKTsKKwkJdmFfZW5kICggYXJnc190bXAgKTsKKwkJcmV0dXJuIHhmZXJfZGVsaXZlcl9yYXcgKCB4ZmVyLCBidWYsIGxlbiApOworCX0KK30KKworLyoqCisgKiBEZWxpdmVyIGZvcm1hdHRlZCBzdHJpbmcKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgZm9ybWF0CQlGb3JtYXQgc3RyaW5nCisgKiBAdiAuLi4JCUFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHhmZXJfcHJpbnRmICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLiApIHsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJjOworCisJdmFfc3RhcnQgKCBhcmdzLCBmb3JtYXQgKTsKKwlyYyA9IHhmZXJfdnByaW50ZiAoIHhmZXIsIGZvcm1hdCwgYXJncyApOworCXZhX2VuZCAoIGFyZ3MgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogU2VlayB0byBwb3NpdGlvbgorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiBvZmZzZXQJCU9mZnNldCB0byBuZXcgcG9zaXRpb24KKyAqIEB2IHdoZW5jZQkJQmFzaXMgZm9yIG5ldyBwb3NpdGlvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB4ZmVyX3NlZWsgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSApIHsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwlzdHJ1Y3QgeGZlcl9tZXRhZGF0YSBtZXRhID0geworCQkub2Zmc2V0ID0gb2Zmc2V0LAorCQkud2hlbmNlID0gd2hlbmNlLAorCX07CisKKwlEQkdDICggeGZlciwgIlhGRVIgJXAgc2VlayAlcyslbGRcbiIsIHhmZXIsCisJICAgICAgIHdoZW5jZV90ZXh0ICggd2hlbmNlICksIG9mZnNldCApOworCisJLyogQWxsb2NhdGUgYW5kIHNlbmQgYSB6ZXJvLWxlbmd0aCBkYXRhIGJ1ZmZlciAqLworCWlvYnVmID0geGZlcl9hbGxvY19pb2IgKCB4ZmVyLCAwICk7CisJaWYgKCAhIGlvYnVmICkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIHhmZXJfZGVsaXZlcl9pb2JfbWV0YSAoIHhmZXIsIGlvYnVmLCAmbWV0YSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEhlbHBlciBtZXRob2RzCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIG1ldGhvZHMgaW4gdGhlCisgKiB4ZmVyX2ludGVyZmFjZV9vcGVyYXRpb25zIHRhYmxlLgorICoKKyAqLworCisvKioKKyAqIElnbm9yZSBjbG9zZSgpIGV2ZW50CisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3ZvaWQgaWdub3JlX3hmZXJfY2xvc2UgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIgX191bnVzZWQsCisJCQkgaW50IHJjIF9fdW51c2VkICkgeworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworLyoqCisgKiBJZ25vcmUgdnJlZGlyZWN0KCkgZXZlbnQKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdHlwZQkJTmV3IGxvY2F0aW9uIHR5cGUKKyAqIEB2IGFyZ3MJCVJlbWFpbmluZyBhcmd1bWVudHMgZGVwZW5kIHVwb24gbG9jYXRpb24gdHlwZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpZ25vcmVfeGZlcl92cmVkaXJlY3QgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIgX191bnVzZWQsCisJCQkgICAgaW50IHR5cGUgX191bnVzZWQsIHZhX2xpc3QgYXJncyBfX3VudXNlZCApIHsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBVbmxpbWl0ZWQgZmxvdyBjb250cm9sIHdpbmRvdworICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHdpbmRvdworICoKKyAqIFRoaXMgaGFuZGxlciBpbmRpY2F0ZXMgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIGFsd2F5cyByZWFkeSB0byBhY2NlcHQKKyAqIGRhdGEuCisgKi8KK3NpemVfdCB1bmxpbWl0ZWRfeGZlcl93aW5kb3cgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIgX191bnVzZWQgKSB7CisJcmV0dXJuIH4oICggc2l6ZV90ICkgMCApOworfQorCisvKioKKyAqIE5vIGZsb3cgY29udHJvbCB3aW5kb3cKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHJldCBsZW4JCUxlbmd0aCBvZiB3aW5kb3cKKyAqCisgKiBUaGlzIGhhbmRsZXIgaW5kaWNhdGVzIHRoYXQgdGhlIGludGVyZmFjZSBpcyBuZXZlciByZWFkeSB0byBhY2NlcHQKKyAqIGRhdGEuCisgKi8KK3NpemVfdCBub194ZmVyX3dpbmRvdyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciBfX3VudXNlZCApIHsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBJL08gYnVmZmVyCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IGxlbgkJSS9PIGJ1ZmZlciBwYXlsb2FkIGxlbmd0aAorICogQHJldCBpb2J1ZgkJSS9PIGJ1ZmZlcgorICovCitzdHJ1Y3QgaW9fYnVmZmVyICoKK2RlZmF1bHRfeGZlcl9hbGxvY19pb2IgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIgX191bnVzZWQsIHNpemVfdCBsZW4gKSB7CisJcmV0dXJuIGFsbG9jX2lvYiAoIGxlbiApOworfQorCisvKioKKyAqIERlbGl2ZXIgZGF0YWdyYW0gYXMgcmF3IGRhdGEKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgaW9idWYJCURhdGFncmFtIEkvTyBidWZmZXIKKyAqIEB2IG1ldGEJCURhdGEgdHJhbnNmZXIgbWV0YWRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0aGUgZGVsaXZlcigpIG1ldGhvZCBmb3IKKyAqIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlcyB0aGF0IHByZWZlciB0byBoYW5kbGUgcmF3IGRhdGEuCisgKi8KK2ludCB4ZmVyX2RlbGl2ZXJfYXNfcmF3ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCSAgc3RydWN0IHhmZXJfbWV0YWRhdGEgKm1ldGEgX191bnVzZWQgKSB7CisJaW50IHJjOworCisJcmMgPSB4ZmVyLT5vcC0+ZGVsaXZlcl9yYXcgKCB4ZmVyLCBpb2J1Zi0+ZGF0YSwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIERlbGl2ZXIgZGF0YWdyYW0gYXMgSS9PIGJ1ZmZlcgorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiBkYXRhCQlEYXRhIGJ1ZmZlcgorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0aGUgZGVsaXZlcl9yYXcoKSBtZXRob2QKKyAqIGZvciBkYXRhIHRyYW5zZmVyIGludGVyZmFjZXMgdGhhdCBwcmVmZXIgdG8gaGFuZGxlIEkvTyBidWZmZXJzLgorICovCitpbnQgeGZlcl9kZWxpdmVyX2FzX2lvYiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKworCWlvYnVmID0geGZlci0+b3AtPmFsbG9jX2lvYiAoIHhmZXIsIGxlbiApOworCWlmICggISBpb2J1ZiApCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5ICggaW9iX3B1dCAoIGlvYnVmLCBsZW4gKSwgZGF0YSwgbGVuICk7CisJcmV0dXJuIHhmZXItPm9wLT5kZWxpdmVyX2lvYiAoIHhmZXIsIGlvYnVmLCAmZHVtbXlfbWV0YWRhdGEgKTsKK30KKworLyoqCisgKiBJZ25vcmUgZGF0YWdyYW0gYXMgcmF3IGRhdGEgZXZlbnQKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IGlnbm9yZV94ZmVyX2RlbGl2ZXJfcmF3ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSBfX3VudXNlZCwgc2l6ZV90IGxlbiApIHsKKwlEQkdDICggeGZlciwgIlhGRVIgJXAgJXpkIGJ5dGVzIGRlbGl2ZXJlZCAlc1xuIiwgeGZlciwgbGVuLAorCSAgICAgICAoICggeGZlciA9PSAmbnVsbF94ZmVyICkgPworCQkgImJlZm9yZSBjb25uZWN0aW9uIiA6ICJhZnRlciB0ZXJtaW5hdGlvbiIgKSApOworCXJldHVybiAwOworfQorCisvKiogTnVsbCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBvcGVyYXRpb25zICovCitzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBudWxsX3hmZXJfb3BzID0geworCS5jbG9zZQkJPSBpZ25vcmVfeGZlcl9jbG9zZSwKKwkudnJlZGlyZWN0CT0gaWdub3JlX3hmZXJfdnJlZGlyZWN0LAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHhmZXJfZGVsaXZlcl9hc19yYXcsCisJLmRlbGl2ZXJfcmF3CT0gaWdub3JlX3hmZXJfZGVsaXZlcl9yYXcsCit9OworCisvKioKKyAqIE51bGwgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gd2hpY2ggZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2VzIGFyZQorICogY29ubmVjdGVkIHdoZW4gdW5wbHVnZ2VkLiAgSXQgd2lsbCBuZXZlciBnZW5lcmF0ZSBtZXNzYWdlcywgYW5kCisgKiB3aWxsIHNpbGVudGx5IGFic29yYiBhbGwgcmVjZWl2ZWQgbWVzc2FnZXMuCisgKi8KK3N0cnVjdCB4ZmVyX2ludGVyZmFjZSBudWxsX3hmZXIgPSBYRkVSX0lOSVQgKCAmbnVsbF94ZmVyX29wcyApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2Flc193cmFwLmMgYi9ncHhlL3NyYy9jcnlwdG8vYWVzX3dyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Y5NGFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY3J5cHRvL2Flc193cmFwLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdweGUvY3J5cHRvLmg+CisjaW5jbHVkZSA8Z3B4ZS9hZXMuaD4KKworLyoqCisgKiBXcmFwIGEga2V5IG9yIG90aGVyIGRhdGEgdXNpbmcgQUVTIEtleSBXcmFwIChSRkMgMzM5NCkKKyAqCisgKiBAdiBrZWsJS2V5IEVuY3J5cHRpb24gS2V5LCAxNiBieXRlcworICogQHYgc3JjCURhdGEgdG8gZW5jcnlwdAorICogQHYgbmJsawlOdW1iZXIgb2YgOC1ieXRlIGJsb2NrcyBpbiBAYSBkYXRhCisgKiBAcmV0IGRlc3QJRW5jcnlwdGVkIGRhdGEgKDggYnl0ZXMgbG9uZ2VyIHRoYW4gaW5wdXQpCisgKgorICogVGhlIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCBzdWNoIHRoYXQgQGEgc3JjIGFuZCBAYSBkZXN0IG1heSBwb2ludAorICogdG8gdGhlIHNhbWUgYnVmZmVyLgorICovCitpbnQgYWVzX3dyYXAgKCBjb25zdCB2b2lkICprZWssIGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZGVzdCwgaW50IG5ibGsgKQoreworCXU4ICpBID0gZGVzdDsKKwl1OCBCWzE2XTsKKwl1OCAqUjsKKwlpbnQgaSwgajsKKwl2b2lkICphZXNfY3R4ID0gbWFsbG9jICggQUVTX0NUWF9TSVpFICk7CisKKwlpZiAoICEgYWVzX2N0eCApCisJCXJldHVybiAtMTsKKworCWNpcGhlcl9zZXRrZXkgKCAmYWVzX2FsZ29yaXRobSwgYWVzX2N0eCwga2VrLCAxNiApOworCisJLyogU2V0IHVwICovCisJbWVtc2V0ICggQSwgMHhBNiwgc2l6ZW9mICggQSApICk7CisJbWVtbW92ZSAoIGRlc3QgKyA4LCBzcmMsIG5ibGsgKiA4ICk7CisKKwkvKiBXcmFwICovCisJZm9yICggaiA9IDA7IGogPCA2OyBqKysgKSB7CisJCVIgPSBkZXN0ICsgODsKKwkJZm9yICggaSA9IDE7IGkgPD0gbmJsazsgaSsrICkgeworCQkJbWVtY3B5ICggQiwgQSwgOCApOworCQkJbWVtY3B5ICggQiArIDgsIFIsIDggKTsKKwkJCWNpcGhlcl9lbmNyeXB0ICggJmFlc19hbGdvcml0aG0sIGFlc19jdHgsIEIsIEIsIDE2ICk7CisJCQltZW1jcHkgKCBBLCBCLCA4ICk7CisJCQlBWzddIF49ICggbmJsayAqIGogKSArIGk7CisJCQltZW1jcHkgKCBSLCBCICsgOCwgOCApOworCQkJUiArPSA4OworCQl9CisJfQorCisJZnJlZSAoIGFlc19jdHggKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBVbndyYXAgYSBrZXkgb3Igb3RoZXIgZGF0YSB1c2luZyBBRVMgS2V5IFdyYXAgKFJGQyAzMzk0KQorICoKKyAqIEB2IGtlawlLZXkgRW5jcnlwdGlvbiBLZXksIDE2IGJ5dGVzCisgKiBAdiBzcmMJRGF0YSB0byBkZWNyeXB0CisgKiBAdiBuYmxrCU51bWJlciBvZiA4LWJ5dGUgYmxvY2tzIGluIEBlIHBsYWludGV4dCBrZXkKKyAqIEByZXQgZGVzdAlEZWNyeXB0ZWQgZGF0YSAoOCBieXRlcyBzaG9ydGVyIHRoYW4gaW5wdXQpCisgKiBAcmV0IHJjCVplcm8gb24gc3VjY2Vzcywgbm9uemVybyBvbiBJViBtaXNtYXRjaAorICoKKyAqIFRoZSBhbGdvcml0aG0gaXMgaW1wbGVtZW50ZWQgc3VjaCB0aGF0IEBhIHNyYyBhbmQgQGEgZGVzdCBtYXkgcG9pbnQKKyAqIHRvIHRoZSBzYW1lIGJ1ZmZlci4KKyAqLworaW50IGFlc191bndyYXAgKCBjb25zdCB2b2lkICprZWssIGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZGVzdCwgaW50IG5ibGsgKQoreworCXU4IEFbOF0sIEJbMTZdOworCXU4ICpSOworCWludCBpLCBqOworCXZvaWQgKmFlc19jdHggPSBtYWxsb2MgKCBBRVNfQ1RYX1NJWkUgKTsKKworCWlmICggISBhZXNfY3R4ICkKKwkJcmV0dXJuIC0xOworCisJY2lwaGVyX3NldGtleSAoICZhZXNfYWxnb3JpdGhtLCBhZXNfY3R4LCBrZWssIDE2ICk7CisKKwkvKiBTZXQgdXAgKi8KKwltZW1jcHkgKCBBLCBzcmMsIDggKTsKKwltZW1tb3ZlICggZGVzdCwgc3JjICsgOCwgbmJsayAqIDggKTsKKworCS8qIFVud3JhcCAqLworCWZvciAoIGogPSA1OyBqID49IDA7IGotLSApIHsKKwkJUiA9IGRlc3QgKyAoIG5ibGsgLSAxICkgKiA4OworCQlmb3IgKCBpID0gbmJsazsgaSA+PSAxOyBpLS0gKSB7CisJCQltZW1jcHkgKCBCLCBBLCA4ICk7CisJCQltZW1jcHkgKCBCICsgOCwgUiwgOCApOworCQkJQls3XSBePSAoIG5ibGsgKiBqICkgKyBpOworCQkJY2lwaGVyX2RlY3J5cHQgKCAmYWVzX2FsZ29yaXRobSwgYWVzX2N0eCwgQiwgQiwgMTYgKTsKKwkJCW1lbWNweSAoIEEsIEIsIDggKTsKKwkJCW1lbWNweSAoIFIsIEIgKyA4LCA4ICk7CisJCQlSIC09IDg7CisJCX0KKwl9CisKKwlmcmVlICggYWVzX2N0eCApOworCisJLyogQ2hlY2sgSVYgKi8KKwlmb3IgKCBpID0gMDsgaSA8IDg7IGkrKyApIHsKKwkJaWYgKCBBW2ldICE9IDB4QTYgKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2FyYzQuYyBiL2dweGUvc3JjL2NyeXB0by9hcmM0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZmJhNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NyeXB0by9hcmM0LmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBUaGUgQVJDNCBzdHJlYW0gY2lwaGVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0Pi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9jcnlwdG8uaD4KKyNpbmNsdWRlIDxncHhlL2FyYzQuaD4KKworI2RlZmluZSBTV0FQKCBhcnksIGksIGogKQlcCisJKHsgdTggdGVtcCA9IGFyeVtpXTsgYXJ5W2ldID0gYXJ5W2pdOyBhcnlbal0gPSB0ZW1wOyB9KQorCisvKioKKyAqIFNldCBBUkM0IGtleQorICoKKyAqIEB2IGN0eHYJQVJDNCBlbmNyeXB0aW9uIGNvbnRleHQKKyAqIEB2IGtleXYJS2V5IHRvIHNldAorICogQHYga2V5bGVuCUxlbmd0aCBvZiBrZXkKKyAqCisgKiBJZiBhbiBpbml0aWFsaXNhdGlvbiB2ZWN0b3IgaXMgdG8gYmUgdXNlZCwgaXQgc2hvdWxkIGJlIHByZXBlbmRlZAorICogdG8gdGhlIGtleTsgQVJDNCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIEBjIHNldGl2IGZ1bmN0aW9uIGJlY2F1c2UKKyAqIHRoZXJlIGlzIG5vIHN0YW5kYXJkIGxlbmd0aCBmb3IgYW4gaW5pdGlhbGlzYXRpb24gdmVjdG9yIGluIHRoZQorICogY2lwaGVyLgorICovCitzdGF0aWMgaW50IGFyYzRfc2V0a2V5ICggdm9pZCAqY3R4diwgY29uc3Qgdm9pZCAqa2V5diwgc2l6ZV90IGtleWxlbiApCit7CisJc3RydWN0IGFyYzRfY3R4ICpjdHggPSBjdHh2OworCWNvbnN0IHU4ICprZXkgPSBrZXl2OworCXU4ICpTID0gY3R4LT5zdGF0ZTsKKwlpbnQgaSwgajsKKworCWZvciAoIGkgPSAwOyBpIDwgMjU2OyBpKysgKSB7CisJCVNbaV0gPSBpOworCX0KKworCWZvciAoIGkgPSBqID0gMDsgaSA8IDI1NjsgaSsrICkgeworCQlqID0gKCBqICsgU1tpXSArIGtleVtpICUga2V5bGVuXSApICYgMHhmZjsKKwkJU1dBUCAoIFMsIGksIGogKTsKKwl9CisKKwljdHgtPmkgPSBjdHgtPmogPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIFBlcmZvcm0gQVJDNCBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24KKyAqCisgKiBAdiBjdHh2CUFSQzQgZW5jcnlwdGlvbiBjb250ZXh0CisgKiBAdiBzcmN2CURhdGEgdG8gZW5jcnlwdCBvciBkZWNyeXB0CisgKiBAdiBkc3R2CUxvY2F0aW9uIHRvIHN0b3JlIGVuY3J5cHRlZCBvciBkZWNyeXB0ZWQgZGF0YQorICogQHYgbGVuCUxlbmd0aCBvZiBkYXRhIHRvIG9wZXJhdGUgb24KKyAqCisgKiBBUkM0IGlzIGEgc3RyZWFtIGNpcGhlciB0aGF0IHdvcmtzIGJ5IGdlbmVyYXRpbmcgYSBzdHJlYW0gb2YgUFJORworICogZGF0YSBiYXNlZCBvbiB0aGUga2V5LCBhbmQgWE9SJ2luZyBpdCB3aXRoIHRoZSBkYXRhIHRvIGJlCisgKiBlbmNyeXB0ZWQuIFNpbmNlIFhPUiBpcyBzeW1tZXRyaWMsIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gaW4KKyAqIEFSQzQgYXJlIHRoZSBzYW1lIG9wZXJhdGlvbi4KKyAqCisgKiBJZiB5b3UgcGFzcyBhIEBjIE5VTEwgc291cmNlIG9yIGRlc3RpbmF0aW9uIHBvaW50ZXIsIEBhIGxlbgorICoga2V5c3RyZWFtIGJ5dGVzIHdpbGwgYmUgY29uc3VtZWQgd2l0aG91dCBlbmNyeXB0aW5nIGFueSBkYXRhLgorICovCitzdGF0aWMgdm9pZCBhcmM0X3hvciAoIHZvaWQgKmN0eHYsIGNvbnN0IHZvaWQgKnNyY3YsIHZvaWQgKmRzdHYsCisJCSAgICAgICBzaXplX3QgbGVuICkKK3sKKwlzdHJ1Y3QgYXJjNF9jdHggKmN0eCA9IGN0eHY7CisJY29uc3QgdTggKnNyYyA9IHNyY3Y7CisJdTggKmRzdCA9IGRzdHY7CisJdTggKlMgPSBjdHgtPnN0YXRlOworCWludCBpID0gY3R4LT5pLCBqID0gY3R4LT5qOworCisJd2hpbGUgKCBsZW4tLSApIHsKKwkJaSA9ICggaSArIDEgKSAmIDB4ZmY7CisJCWogPSAoIGogKyBTW2ldICkgJiAweGZmOworCQlTV0FQICggUywgaSwgaiApOworCQlpZiAoIHNyY3YgJiYgZHN0diApCisJCQkqZHN0KysgPSAqc3JjKysgXiBTWyhTW2ldICsgU1tqXSkgJiAweGZmXTsKKwl9CisKKwljdHgtPmkgPSBpOworCWN0eC0+aiA9IGo7Cit9CisKK3N0YXRpYyB2b2lkIGFyYzRfc2V0aXYgKCB2b2lkICpjdHggX191bnVzZWQsIGNvbnN0IHZvaWQgKml2IF9fdW51c2VkICkKK3sKKwkvKiBBUkM0IGRvZXMgbm90IHVzZSBhIGZpeGVkLWxlbmd0aCBJViAqLworfQorCisKKy8qKgorICogUGVyZm9ybSBBUkM0IGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiwgc2tpcHBpbmcgaW5pdGlhbCBrZXlzdHJlYW0gYnl0ZXMKKyAqCisgKiBAdiBrZXkJQVJDNCBlbmNyeXB0aW9uIGtleQorICogQHYga2V5bGVuCUtleSBsZW5ndGgKKyAqIEB2IHNraXAJTnVtYmVyIG9mIGJ5dGVzIG9mIGtleXN0cmVhbSB0byBza2lwCisgKiBAdiBzcmMJTWVzc2FnZSB0byBlbmNyeXB0IG9yIGRlY3J5cHQKKyAqIEB2IG1zZ2xlbglMZW5ndGggb2YgbWVzc2FnZQorICogQHJldCBkc3QJRW5jcnlwdGVkIG9yIGRlY3J5cHRlZCBtZXNzYWdlCisgKi8KK3ZvaWQgYXJjNF9za2lwICggY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuLCBzaXplX3Qgc2tpcCwKKwkJIGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBzaXplX3QgbXNnbGVuICkKK3sKKwlzdHJ1Y3QgYXJjNF9jdHggY3R4OworCWFyYzRfc2V0a2V5ICggJmN0eCwga2V5LCBrZXlsZW4gKTsKKwlhcmM0X3hvciAoICZjdHgsIE5VTEwsIE5VTEwsIHNraXAgKTsKKwlhcmM0X3hvciAoICZjdHgsIHNyYywgZHN0LCBtc2dsZW4gKTsKK30KKworc3RydWN0IGNpcGhlcl9hbGdvcml0aG0gYXJjNF9hbGdvcml0aG0gPSB7CisJLm5hbWUgPSAiQVJDNCIsCisJLmN0eHNpemUgPSBBUkM0X0NUWF9TSVpFLAorCS5ibG9ja3NpemUgPSAxLAorCS5zZXRrZXkgPSBhcmM0X3NldGtleSwKKwkuc2V0aXYgPSBhcmM0X3NldGl2LAorCS5lbmNyeXB0ID0gYXJjNF94b3IsCisJLmRlY3J5cHQgPSBhcmM0X3hvciwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jcnlwdG8vYXNuMS5jIGIvZ3B4ZS9zcmMvY3J5cHRvL2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTRhOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY3J5cHRvL2FzbjEuYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9hc24xLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEFTTi4xIGVuY29kaW5nCisgKgorICovCisKKy8qKgorICogU3RhcnQgcGFyc2luZyBBU04uMSBvYmplY3QKKyAqCisgKiBAdiBjdXJzb3IJCUFTTi4xIG9iamVjdCBjdXJzb3IKKyAqIEB2IHR5cGUJCUV4cGVjdGVkIHR5cGUKKyAqIEByZXQgbGVuCQlMZW5ndGggb2Ygb2JqZWN0IGJvZHksIG9yIG5lZ2F0aXZlIGVycm9yCisgKgorICogVGhlIG9iamVjdCBjdXJzb3Igd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUKKyAqIG9iamVjdCBib2R5IChpLmUuIHRoZSBmaXJzdCBieXRlIGZvbGxvd2luZyB0aGUgbGVuZ3RoIGJ5dGUocykpLCBhbmQKKyAqIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCBib2R5IChpLmUuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdW50aWwgdGhlCisgKiBmb2xsb3dpbmcgb2JqZWN0IHRhZywgaWYgYW55KSBpcyByZXR1cm5lZC4KKyAqCisgKiBJZiBhbnkgZXJyb3Igb2NjdXJzIChpLmUuIGlmIHRoZSBvYmplY3QgaXMgbm90IG9mIHRoZSBleHBlY3RlZAorICogdHlwZSwgb3IgaWYgd2Ugb3ZlcmZsb3cgYmV5b25kIHRoZSBlbmQgb2YgdGhlIEFTTi4xIG9iamVjdCksIHRoZW4KKyAqIHRoZSBjdXJzb3Igd2lsbCBiZSBpbnZhbGlkYXRlZCBhbmQgYSBuZWdhdGl2ZSB2YWx1ZSB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBhc24xX3N0YXJ0ICggc3RydWN0IGFzbjFfY3Vyc29yICpjdXJzb3IsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHR5cGUgKSB7CisJdW5zaWduZWQgaW50IGxlbl9sZW47CisJdW5zaWduZWQgaW50IGxlbjsKKwlpbnQgcmM7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIGN1cnNvci0+bGVuIDwgMiAvKiBUYWcgYnl0ZSBhbmQgZmlyc3QgbGVuZ3RoIGJ5dGUgKi8gKSB7CisJCWlmICggY3Vyc29yLT5sZW4gKQorCQkJREJHQyAoIGN1cnNvciwgIkFTTjEgJXAgdG9vIHNob3J0XG4iLCBjdXJzb3IgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG5vdGZvdW5kOworCX0KKworCS8qIENoZWNrIHRoZSB0YWcgYnl0ZSAqLworCWlmICggKiggKCB1aW50OF90ICogKSBjdXJzb3ItPmRhdGEgKSAhPSB0eXBlICkgeworCQlEQkdDICggY3Vyc29yLCAiQVNOMSAlcCB0eXBlIG1pc21hdGNoIChleHBlY3RlZCAlZCwgZ290ICVkKVxuIiwKKwkJICAgICAgIGN1cnNvciwgdHlwZSwgKiggKCB1aW50OF90ICogKSBjdXJzb3ItPmRhdGEgKSApOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBub3Rmb3VuZDsKKwl9CisJY3Vyc29yLT5kYXRhKys7CisJY3Vyc29yLT5sZW4tLTsKKworCS8qIEV4dHJhY3QgbGVuZ3RoIG9mIHRoZSBsZW5ndGggZmllbGQgYW5kIHNhbml0eSBjaGVjayAqLworCWxlbl9sZW4gPSAqKCAoIHVpbnQ4X3QgKiApIGN1cnNvci0+ZGF0YSApOworCWlmICggbGVuX2xlbiAmIDB4ODAgKSB7CisJCWxlbl9sZW4gPSAoIGxlbl9sZW4gJiAweDdmICk7CisJCWN1cnNvci0+ZGF0YSsrOworCQljdXJzb3ItPmxlbi0tOworCX0gZWxzZSB7CisJCWxlbl9sZW4gPSAxOworCX0KKwlpZiAoIGN1cnNvci0+bGVuIDwgbGVuX2xlbiApIHsKKwkJREJHQyAoIGN1cnNvciwgIkFTTjEgJXAgYmFkIGxlbmd0aCBmaWVsZCBsZW5ndGggJWQgKG1heCAiCisJCSAgICAgICAiJXpkKVxuIiwgY3Vyc29yLCBsZW5fbGVuLCBjdXJzb3ItPmxlbiApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gbm90Zm91bmQ7CisJfQorCisJLyogRXh0cmFjdCB0aGUgbGVuZ3RoIGFuZCBzYW5pdHkgY2hlY2sgKi8KKwlmb3IgKCBsZW4gPSAwIDsgbGVuX2xlbiA7IGxlbl9sZW4tLSApIHsKKwkJbGVuIDw8PSA4OworCQlsZW4gfD0gKiggKCB1aW50OF90ICogKSBjdXJzb3ItPmRhdGEgKTsKKwkJY3Vyc29yLT5kYXRhKys7CisJCWN1cnNvci0+bGVuLS07CisJfQorCWlmICggY3Vyc29yLT5sZW4gPCBsZW4gKSB7CisJCURCR0MgKCBjdXJzb3IsICJBU04xICVwIGJhZCBsZW5ndGggJWQgKG1heCAlemQpXG4iLAorCQkgICAgICAgY3Vyc29yLCBsZW4sIGN1cnNvci0+bGVuICk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBub3Rmb3VuZDsKKwl9CisKKwlyZXR1cm4gbGVuOworCisgbm90Zm91bmQ6CisJY3Vyc29yLT5kYXRhID0gTlVMTDsKKwljdXJzb3ItPmxlbiA9IDA7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEVudGVyIEFTTi4xIG9iamVjdAorICoKKyAqIEB2IGN1cnNvcgkJQVNOLjEgb2JqZWN0IGN1cnNvcgorICogQHYgdHlwZQkJRXhwZWN0ZWQgdHlwZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogVGhlIG9iamVjdCBjdXJzb3Igd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBib2R5IG9mIHRoZQorICogY3VycmVudCBBU04uMSBvYmplY3QuICBJZiBhbnkgZXJyb3Igb2NjdXJzLCB0aGUgb2JqZWN0IGN1cnNvciB3aWxsCisgKiBiZSBpbnZhbGlkYXRlZC4KKyAqLworaW50IGFzbjFfZW50ZXIgKCBzdHJ1Y3QgYXNuMV9jdXJzb3IgKmN1cnNvciwgdW5zaWduZWQgaW50IHR5cGUgKSB7CisJaW50IGxlbjsKKworCWxlbiA9IGFzbjFfc3RhcnQgKCBjdXJzb3IsIHR5cGUgKTsKKwlpZiAoIGxlbiA8IDAgKQorCQlyZXR1cm4gbGVuOworCisJY3Vyc29yLT5sZW4gPSBsZW47CisJREJHQyAoIGN1cnNvciwgIkFTTjEgJXAgZW50ZXJlZCBvYmplY3QgdHlwZSAlMDJ4IChsZW4gJXgpXG4iLAorCSAgICAgICBjdXJzb3IsIHR5cGUsIGxlbiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2tpcCBBU04uMSBvYmplY3QKKyAqCisgKiBAdiBjdXJzb3IJCUFTTi4xIG9iamVjdCBjdXJzb3IKKyAqIEB2IHR5cGUJCUV4cGVjdGVkIHR5cGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoZSBvYmplY3QgY3Vyc29yIHdpbGwgYmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV4dCBBU04uMQorICogb2JqZWN0LiAgSWYgYW55IGVycm9yIG9jY3VycywgdGhlIG9iamVjdCBjdXJzb3Igd2lsbCBiZQorICogaW52YWxpZGF0ZWQuCisgKi8KK2ludCBhc24xX3NraXAgKCBzdHJ1Y3QgYXNuMV9jdXJzb3IgKmN1cnNvciwgdW5zaWduZWQgaW50IHR5cGUgKSB7CisJaW50IGxlbjsKKworCWxlbiA9IGFzbjFfc3RhcnQgKCBjdXJzb3IsIHR5cGUgKTsKKwlpZiAoIGxlbiA8IDAgKQorCQlyZXR1cm4gbGVuOworCisJY3Vyc29yLT5kYXRhICs9IGxlbjsKKwljdXJzb3ItPmxlbiAtPSBsZW47CisJREJHQyAoIGN1cnNvciwgIkFTTjEgJXAgc2tpcHBlZCBvYmplY3QgdHlwZSAlMDJ4IChsZW4gJXgpXG4iLAorCSAgICAgICBjdXJzb3IsIHR5cGUsIGxlbiApOworCisJaWYgKCAhIGN1cnNvci0+bGVuICkgeworCQlEQkdDICggY3Vyc29yLCAiQVNOMSAlcCByZWFjaGVkIGVuZCBvZiBvYmplY3RcbiIsIGN1cnNvciApOworCQljdXJzb3ItPmRhdGEgPSBOVUxMOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by9heHRscy9hZXMuYyBiL2dweGUvc3JjL2NyeXB0by9heHRscy9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzBkNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL2Flcy5jCkBAIC0wLDAgKzEsNDc2IEBACisvKgorICogIENvcHlyaWdodChDKSAyMDA2IENhbWVyb24gUmljaAorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qKgorICogQUVTIGltcGxlbWVudGF0aW9uIC0gdGhpcyBpcyBhIHNtYWxsIGNvZGUgdmVyc2lvbi4gVGhlcmUgYXJlIG11Y2ggZmFzdGVyCisgKiB2ZXJzaW9ucyBhcm91bmQgYnV0IHRoZXkgYXJlIG11Y2ggbGFyZ2VyIGluIHNpemUgKGkuZS4gdGhleSB1c2UgbGFyZ2UgCisgKiBzdWJtaXggdGFibGVzKS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiY3J5cHRvLmgiCisKKy8qIGFsbCBjb21tZW50ZWQgb3V0IGluIHNrZWxldG9uIG1vZGUgKi8KKyNpZm5kZWYgQ09ORklHX1NTTF9TS0VMRVRPTl9NT0RFCisKKyNkZWZpbmUgcm90MSh4KSAoKCh4KSA8PCAyNCkgfCAoKHgpID4+IDgpKQorI2RlZmluZSByb3QyKHgpICgoKHgpIDw8IDE2KSB8ICgoeCkgPj4gMTYpKQorI2RlZmluZSByb3QzKHgpICgoKHgpIDw8ICA4KSB8ICgoeCkgPj4gMjQpKQorCisvKiAKKyAqIFRoaXMgY3V0ZSB0cmljayBkb2VzIDQgJ211bCBieSB0d28nIGF0IG9uY2UuICBTdG9sZW4gZnJvbQorICogRHIgQi4gUi4gR2xhZG1hbiA8YnJnQGdsYWRtYW4udWsubmV0PiBidXQgSSdtIHN1cmUgdGhlIHUtKHU+PjcpIGlzCisgKiBhIHN0YW5kYXJkIGdyYXBoaWNzIHRyaWNrCisgKiBUaGUga2V5IHRvIHRoaXMgaXMgdGhhdCB3ZSBuZWVkIHRvIHhvciB3aXRoIDB4MWIgaWYgdGhlIHRvcCBiaXQgaXMgc2V0LgorICogYSAxeHh4IHh4eHggICAweHh4IDB4eHggRmlyc3Qgd2UgbWFzayB0aGUgN2JpdCwKKyAqIGIgMTAwMCAwMDAwICAgMDAwMCAwMDAwIHRoZW4gd2Ugc2hpZnQgcmlnaHQgYnkgNyBwdXR0aW5nIHRoZSA3Yml0IGluIDBiaXQsCisgKiBjIDAwMDAgMDAwMSAgIDAwMDAgMDAwMCB3ZSB0aGVuIHN1YnRyYWN0IChjKSBmcm9tIChiKQorICogZCAwMTExIDExMTEgICAwMDAwIDAwMDAgYW5kIG5vdyB3ZSBhbmQgd2l0aCBvdXIgbWFzaworICogZSAwMDAxIDEwMTEgICAwMDAwIDAwMDAKKyAqLworI2RlZmluZSBtdCAgMHg4MDgwODA4MAorI2RlZmluZSBtbCAgMHg3ZjdmN2Y3ZgorI2RlZmluZSBtaCAgMHhmZWZlZmVmZQorI2RlZmluZSBtbSAgMHgxYjFiMWIxYgorI2RlZmluZSBtdWwyKHgsdCkJKCh0KT0oKHgpJm10KSwgXAorCQkJKCgoKHgpKyh4KSkmbWgpXigoKHQpLSgodCk+PjcpKSZtbSkpKQorCisjZGVmaW5lIGludl9taXhfY29sKHgsZjIsZjQsZjgsZjkpIChcCisJCQkoZjIpPW11bDIoeCxmMiksIFwKKwkJCShmNCk9bXVsMihmMixmNCksIFwKKwkJCShmOCk9bXVsMihmNCxmOCksIFwKKwkJCShmOSk9KHgpXihmOCksIFwKKwkJCShmOCk9KChmMileKGY0KV4oZjgpKSwgXAorCQkJKGYyKV49KGY5KSwgXAorCQkJKGY0KV49KGY5KSwgXAorCQkJKGY4KV49cm90MyhmMiksIFwKKwkJCShmOClePXJvdDIoZjQpLCBcCisJCQkoZjgpXnJvdDEoZjkpKQorCisvKiBzb21lIG1hY3JvcyB0byBkbyBlbmRpYW4gaW5kZXBlbmRlbnQgYnl0ZSBleHRyYWN0aW9uICovCisjZGVmaW5lIG4ybChjLGwpIGw9bnRvaGwoKmMpOyBjKysKKyNkZWZpbmUgbDJuKGwsYykgKmMrKz1odG9ubChsKQorCisvKgorICogQUVTIFMtYm94CisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGFlc19zYm94WzI1Nl0gPQoreworCTB4NjMsMHg3QywweDc3LDB4N0IsMHhGMiwweDZCLDB4NkYsMHhDNSwKKwkweDMwLDB4MDEsMHg2NywweDJCLDB4RkUsMHhENywweEFCLDB4NzYsCisJMHhDQSwweDgyLDB4QzksMHg3RCwweEZBLDB4NTksMHg0NywweEYwLAorCTB4QUQsMHhENCwweEEyLDB4QUYsMHg5QywweEE0LDB4NzIsMHhDMCwKKwkweEI3LDB4RkQsMHg5MywweDI2LDB4MzYsMHgzRiwweEY3LDB4Q0MsCisJMHgzNCwweEE1LDB4RTUsMHhGMSwweDcxLDB4RDgsMHgzMSwweDE1LAorCTB4MDQsMHhDNywweDIzLDB4QzMsMHgxOCwweDk2LDB4MDUsMHg5QSwKKwkweDA3LDB4MTIsMHg4MCwweEUyLDB4RUIsMHgyNywweEIyLDB4NzUsCisJMHgwOSwweDgzLDB4MkMsMHgxQSwweDFCLDB4NkUsMHg1QSwweEEwLAorCTB4NTIsMHgzQiwweEQ2LDB4QjMsMHgyOSwweEUzLDB4MkYsMHg4NCwKKwkweDUzLDB4RDEsMHgwMCwweEVELDB4MjAsMHhGQywweEIxLDB4NUIsCisJMHg2QSwweENCLDB4QkUsMHgzOSwweDRBLDB4NEMsMHg1OCwweENGLAorCTB4RDAsMHhFRiwweEFBLDB4RkIsMHg0MywweDRELDB4MzMsMHg4NSwKKwkweDQ1LDB4RjksMHgwMiwweDdGLDB4NTAsMHgzQywweDlGLDB4QTgsCisJMHg1MSwweEEzLDB4NDAsMHg4RiwweDkyLDB4OUQsMHgzOCwweEY1LAorCTB4QkMsMHhCNiwweERBLDB4MjEsMHgxMCwweEZGLDB4RjMsMHhEMiwKKwkweENELDB4MEMsMHgxMywweEVDLDB4NUYsMHg5NywweDQ0LDB4MTcsCisJMHhDNCwweEE3LDB4N0UsMHgzRCwweDY0LDB4NUQsMHgxOSwweDczLAorCTB4NjAsMHg4MSwweDRGLDB4REMsMHgyMiwweDJBLDB4OTAsMHg4OCwKKwkweDQ2LDB4RUUsMHhCOCwweDE0LDB4REUsMHg1RSwweDBCLDB4REIsCisJMHhFMCwweDMyLDB4M0EsMHgwQSwweDQ5LDB4MDYsMHgyNCwweDVDLAorCTB4QzIsMHhEMywweEFDLDB4NjIsMHg5MSwweDk1LDB4RTQsMHg3OSwKKwkweEU3LDB4QzgsMHgzNywweDZELDB4OEQsMHhENSwweDRFLDB4QTksCisJMHg2QywweDU2LDB4RjQsMHhFQSwweDY1LDB4N0EsMHhBRSwweDA4LAorCTB4QkEsMHg3OCwweDI1LDB4MkUsMHgxQywweEE2LDB4QjQsMHhDNiwKKwkweEU4LDB4REQsMHg3NCwweDFGLDB4NEIsMHhCRCwweDhCLDB4OEEsCisJMHg3MCwweDNFLDB4QjUsMHg2NiwweDQ4LDB4MDMsMHhGNiwweDBFLAorCTB4NjEsMHgzNSwweDU3LDB4QjksMHg4NiwweEMxLDB4MUQsMHg5RSwKKwkweEUxLDB4RjgsMHg5OCwweDExLDB4NjksMHhEOSwweDhFLDB4OTQsCisJMHg5QiwweDFFLDB4ODcsMHhFOSwweENFLDB4NTUsMHgyOCwweERGLAorCTB4OEMsMHhBMSwweDg5LDB4MEQsMHhCRiwweEU2LDB4NDIsMHg2OCwKKwkweDQxLDB4OTksMHgyRCwweDBGLDB4QjAsMHg1NCwweEJCLDB4MTYsCit9OworCisvKgorICogQUVTIGlzLWJveAorICovCitzdGF0aWMgY29uc3QgdWludDhfdCBhZXNfaXNib3hbMjU2XSA9IAoreworICAgIDB4NTIsMHgwOSwweDZhLDB4ZDUsMHgzMCwweDM2LDB4YTUsMHgzOCwKKyAgICAweGJmLDB4NDAsMHhhMywweDllLDB4ODEsMHhmMywweGQ3LDB4ZmIsCisgICAgMHg3YywweGUzLDB4MzksMHg4MiwweDliLDB4MmYsMHhmZiwweDg3LAorICAgIDB4MzQsMHg4ZSwweDQzLDB4NDQsMHhjNCwweGRlLDB4ZTksMHhjYiwKKyAgICAweDU0LDB4N2IsMHg5NCwweDMyLDB4YTYsMHhjMiwweDIzLDB4M2QsCisgICAgMHhlZSwweDRjLDB4OTUsMHgwYiwweDQyLDB4ZmEsMHhjMywweDRlLAorICAgIDB4MDgsMHgyZSwweGExLDB4NjYsMHgyOCwweGQ5LDB4MjQsMHhiMiwKKyAgICAweDc2LDB4NWIsMHhhMiwweDQ5LDB4NmQsMHg4YiwweGQxLDB4MjUsCisgICAgMHg3MiwweGY4LDB4ZjYsMHg2NCwweDg2LDB4NjgsMHg5OCwweDE2LAorICAgIDB4ZDQsMHhhNCwweDVjLDB4Y2MsMHg1ZCwweDY1LDB4YjYsMHg5MiwKKyAgICAweDZjLDB4NzAsMHg0OCwweDUwLDB4ZmQsMHhlZCwweGI5LDB4ZGEsCisgICAgMHg1ZSwweDE1LDB4NDYsMHg1NywweGE3LDB4OGQsMHg5ZCwweDg0LAorICAgIDB4OTAsMHhkOCwweGFiLDB4MDAsMHg4YywweGJjLDB4ZDMsMHgwYSwKKyAgICAweGY3LDB4ZTQsMHg1OCwweDA1LDB4YjgsMHhiMywweDQ1LDB4MDYsCisgICAgMHhkMCwweDJjLDB4MWUsMHg4ZiwweGNhLDB4M2YsMHgwZiwweDAyLAorICAgIDB4YzEsMHhhZiwweGJkLDB4MDMsMHgwMSwweDEzLDB4OGEsMHg2YiwKKyAgICAweDNhLDB4OTEsMHgxMSwweDQxLDB4NGYsMHg2NywweGRjLDB4ZWEsCisgICAgMHg5NywweGYyLDB4Y2YsMHhjZSwweGYwLDB4YjQsMHhlNiwweDczLAorICAgIDB4OTYsMHhhYywweDc0LDB4MjIsMHhlNywweGFkLDB4MzUsMHg4NSwKKyAgICAweGUyLDB4ZjksMHgzNywweGU4LDB4MWMsMHg3NSwweGRmLDB4NmUsCisgICAgMHg0NywweGYxLDB4MWEsMHg3MSwweDFkLDB4MjksMHhjNSwweDg5LAorICAgIDB4NmYsMHhiNywweDYyLDB4MGUsMHhhYSwweDE4LDB4YmUsMHgxYiwKKyAgICAweGZjLDB4NTYsMHgzZSwweDRiLDB4YzYsMHhkMiwweDc5LDB4MjAsCisgICAgMHg5YSwweGRiLDB4YzAsMHhmZSwweDc4LDB4Y2QsMHg1YSwweGY0LAorICAgIDB4MWYsMHhkZCwweGE4LDB4MzMsMHg4OCwweDA3LDB4YzcsMHgzMSwKKyAgICAweGIxLDB4MTIsMHgxMCwweDU5LDB4MjcsMHg4MCwweGVjLDB4NWYsCisgICAgMHg2MCwweDUxLDB4N2YsMHhhOSwweDE5LDB4YjUsMHg0YSwweDBkLAorICAgIDB4MmQsMHhlNSwweDdhLDB4OWYsMHg5MywweGM5LDB4OWMsMHhlZiwKKyAgICAweGEwLDB4ZTAsMHgzYiwweDRkLDB4YWUsMHgyYSwweGY1LDB4YjAsCisgICAgMHhjOCwweGViLDB4YmIsMHgzYywweDgzLDB4NTMsMHg5OSwweDYxLAorICAgIDB4MTcsMHgyYiwweDA0LDB4N2UsMHhiYSwweDc3LDB4ZDYsMHgyNiwKKyAgICAweGUxLDB4NjksMHgxNCwweDYzLDB4NTUsMHgyMSwweDBjLDB4N2QKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFJjb25bMzBdPQoreworCTB4MDEsMHgwMiwweDA0LDB4MDgsMHgxMCwweDIwLDB4NDAsMHg4MCwKKwkweDFiLDB4MzYsMHg2YywweGQ4LDB4YWIsMHg0ZCwweDlhLDB4MmYsCisJMHg1ZSwweGJjLDB4NjMsMHhjNiwweDk3LDB4MzUsMHg2YSwweGQ0LAorCTB4YjMsMHg3ZCwweGZhLDB4ZWYsMHhjNSwweDkxLAorfTsKKworLyogUGVyZm9ybSBkb3VibGluZyBpbiBHYWxvaXMgRmllbGQgR0YoMl44KSB1c2luZyB0aGUgaXJyZWR1Y2libGUgcG9seW5vbWlhbAorICAgeF44K3heNCt4XjMreCsxICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBBRVNfeHRpbWUodWludDMyX3QgeCkKK3sKKwlyZXR1cm4geCA9ICh4JjB4ODApID8gKHg8PDEpXjB4MWIgOiB4PDwxOworfQorCisvKioKKyAqIFNldCB1cCBBRVMgd2l0aCB0aGUga2V5L2l2IGFuZCBjaXBoZXIgc2l6ZS4KKyAqLwordm9pZCBBRVNfc2V0X2tleShBRVNfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmtleSwgCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBBRVNfTU9ERSBtb2RlKQoreworICAgIGludCBpLCBpaTsKKyAgICB1aW50MzJfdCAqVywgdG1wLCB0bXAyOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlwOworICAgIGludCB3b3JkczsKKworICAgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQUVTX01PREVfMTI4OgorICAgICAgICAgICAgaSA9IDEwOworICAgICAgICAgICAgd29yZHMgPSA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBRVNfTU9ERV8yNTY6CisgICAgICAgICAgICBpID0gMTQ7CisgICAgICAgICAgICB3b3JkcyA9IDg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAgICAgICAgLyogZmFpbCBzaWxlbnRseSAqLworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGN0eC0+cm91bmRzID0gaTsKKyAgICBjdHgtPmtleV9zaXplID0gd29yZHM7CisgICAgVyA9IGN0eC0+a3M7CisgICAgZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKz0yKQorICAgIHsKKyAgICAgICAgV1tpKzBdPQkoKHVpbnQzMl90KWtleVsgMF08PDI0KXwKKyAgICAgICAgICAgICgodWludDMyX3Qpa2V5WyAxXTw8MTYpfAorICAgICAgICAgICAgKCh1aW50MzJfdClrZXlbIDJdPDwgOCl8CisgICAgICAgICAgICAoKHVpbnQzMl90KWtleVsgM10gICAgKTsKKyAgICAgICAgV1tpKzFdPQkoKHVpbnQzMl90KWtleVsgNF08PDI0KXwKKyAgICAgICAgICAgICgodWludDMyX3Qpa2V5WyA1XTw8MTYpfAorICAgICAgICAgICAgKCh1aW50MzJfdClrZXlbIDZdPDwgOCl8CisgICAgICAgICAgICAoKHVpbnQzMl90KWtleVsgN10gICAgKTsKKyAgICAgICAga2V5ICs9IDg7CisgICAgfQorCisgICAgaXAgPSBSY29uOworICAgIGlpID0gNCAqIChjdHgtPnJvdW5kcysxKTsKKyAgICBmb3IgKGkgPSB3b3JkczsgaTxpaTsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gV1tpLTFdOworCisgICAgICAgIGlmICgoaSAlIHdvcmRzKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAyID0odWludDMyX3QpYWVzX3Nib3hbKHRtcCAgICApJjB4ZmZdPDwgODsKKyAgICAgICAgICAgIHRtcDJ8PSh1aW50MzJfdClhZXNfc2JveFsodG1wPj4gOCkmMHhmZl08PDE2OworICAgICAgICAgICAgdG1wMnw9KHVpbnQzMl90KWFlc19zYm94Wyh0bXA+PjE2KSYweGZmXTw8MjQ7CisgICAgICAgICAgICB0bXAyfD0odWludDMyX3QpYWVzX3Nib3hbKHRtcD4+MjQpICAgICBdOworICAgICAgICAgICAgdG1wPXRtcDJeKCgodW5zaWduZWQgaW50KSppcCk8PDI0KTsKKyAgICAgICAgICAgIGlwKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHdvcmRzID09IDgpICYmICgoaSAlIHdvcmRzKSA9PSA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMiA9KHVpbnQzMl90KWFlc19zYm94Wyh0bXAgICAgKSYweGZmXSAgICA7CisgICAgICAgICAgICB0bXAyfD0odWludDMyX3QpYWVzX3Nib3hbKHRtcD4+IDgpJjB4ZmZdPDwgODsKKyAgICAgICAgICAgIHRtcDJ8PSh1aW50MzJfdClhZXNfc2JveFsodG1wPj4xNikmMHhmZl08PDE2OworICAgICAgICAgICAgdG1wMnw9KHVpbnQzMl90KWFlc19zYm94Wyh0bXA+PjI0KSAgICAgXTw8MjQ7CisgICAgICAgICAgICB0bXA9dG1wMjsKKyAgICAgICAgfQorCisgICAgICAgIFdbaV09V1tpLXdvcmRzXV50bXA7CisgICAgfQorCisgICAgLyogY29weSB0aGUgaXYgYWNyb3NzICovCisgICAgbWVtY3B5KGN0eC0+aXYsIGl2LCAxNik7Cit9CisKKy8qKgorICogQ2hhbmdlIGEga2V5IGZvciBkZWNyeXB0aW9uLgorICovCit2b2lkIEFFU19jb252ZXJ0X2tleShBRVNfQ1RYICpjdHgpCit7CisgICAgaW50IGk7CisgICAgdWludDMyX3QgKmssdyx0MSx0Mix0Myx0NDsKKworICAgIGsgPSBjdHgtPmtzOworICAgIGsgKz0gNDsKKworICAgIGZvciAoaT1jdHgtPnJvdW5kcyo0OyBpPjQ7IGktLSkKKyAgICB7CisgICAgICAgIHc9ICprOworICAgICAgICB3ID0gaW52X21peF9jb2wodyx0MSx0Mix0Myx0NCk7CisgICAgICAgICprKysgPXc7CisgICAgfQorfQorCisjaWYgMAorLyoqCisgKiBFbmNyeXB0IGEgYnl0ZSBzZXF1ZW5jZSAod2l0aCBhIGJsb2NrIHNpemUgMTYpIHVzaW5nIHRoZSBBRVMgY2lwaGVyLgorICovCit2b2lkIEFFU19jYmNfZW5jcnlwdChBRVNfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKm1zZywgdWludDhfdCAqb3V0LCBpbnQgbGVuZ3RoKQoreworICAgIHVpbnQzMl90IHRpbjAsIHRpbjEsIHRpbjIsIHRpbjM7CisgICAgdWludDMyX3QgdG91dDAsIHRvdXQxLCB0b3V0MiwgdG91dDM7CisgICAgdWludDMyX3QgdGluWzRdOworICAgIHVpbnQzMl90ICppdiA9ICh1aW50MzJfdCAqKWN0eC0+aXY7CisgICAgdWludDMyX3QgKm1zZ18zMiA9ICh1aW50MzJfdCAqKW1zZzsKKyAgICB1aW50MzJfdCAqb3V0XzMyID0gKHVpbnQzMl90ICopb3V0OworCisgICAgbjJsKGl2LCB0b3V0MCk7CisgICAgbjJsKGl2LCB0b3V0MSk7CisgICAgbjJsKGl2LCB0b3V0Mik7CisgICAgbjJsKGl2LCB0b3V0Myk7CisgICAgaXYgLT0gNDsKKworICAgIGZvciAobGVuZ3RoIC09IDE2OyBsZW5ndGggPj0gMDsgbGVuZ3RoIC09IDE2KQorICAgIHsKKyAgICAgICAgbjJsKG1zZ18zMiwgdGluMCk7CisgICAgICAgIG4ybChtc2dfMzIsIHRpbjEpOworICAgICAgICBuMmwobXNnXzMyLCB0aW4yKTsKKyAgICAgICAgbjJsKG1zZ18zMiwgdGluMyk7CisgICAgICAgIHRpblswXSA9IHRpbjBedG91dDA7CisgICAgICAgIHRpblsxXSA9IHRpbjFedG91dDE7CisgICAgICAgIHRpblsyXSA9IHRpbjJedG91dDI7CisgICAgICAgIHRpblszXSA9IHRpbjNedG91dDM7CisKKyAgICAgICAgQUVTX2VuY3J5cHQoY3R4LCB0aW4pOworCisgICAgICAgIHRvdXQwID0gdGluWzBdOyAKKyAgICAgICAgbDJuKHRvdXQwLCBvdXRfMzIpOworICAgICAgICB0b3V0MSA9IHRpblsxXTsgCisgICAgICAgIGwybih0b3V0MSwgb3V0XzMyKTsKKyAgICAgICAgdG91dDIgPSB0aW5bMl07IAorICAgICAgICBsMm4odG91dDIsIG91dF8zMik7CisgICAgICAgIHRvdXQzID0gdGluWzNdOyAKKyAgICAgICAgbDJuKHRvdXQzLCBvdXRfMzIpOworICAgIH0KKworICAgIGwybih0b3V0MCwgaXYpOworICAgIGwybih0b3V0MSwgaXYpOworICAgIGwybih0b3V0MiwgaXYpOworICAgIGwybih0b3V0MywgaXYpOworfQorCisvKioKKyAqIERlY3J5cHQgYSBieXRlIHNlcXVlbmNlICh3aXRoIGEgYmxvY2sgc2l6ZSAxNikgdXNpbmcgdGhlIEFFUyBjaXBoZXIuCisgKi8KK3ZvaWQgQUVTX2NiY19kZWNyeXB0KEFFU19DVFggKmN0eCwgY29uc3QgdWludDhfdCAqbXNnLCB1aW50OF90ICpvdXQsIGludCBsZW5ndGgpCit7CisgICAgdWludDMyX3QgdGluMCwgdGluMSwgdGluMiwgdGluMzsKKyAgICB1aW50MzJfdCB4b3IwLHhvcjEseG9yMix4b3IzOworICAgIHVpbnQzMl90IHRvdXQwLHRvdXQxLHRvdXQyLHRvdXQzOworICAgIHVpbnQzMl90IGRhdGFbNF07CisgICAgdWludDMyX3QgKml2ID0gKHVpbnQzMl90ICopY3R4LT5pdjsKKyAgICB1aW50MzJfdCAqbXNnXzMyID0gKHVpbnQzMl90ICopbXNnOworICAgIHVpbnQzMl90ICpvdXRfMzIgPSAodWludDMyX3QgKilvdXQ7CisKKyAgICBuMmwoaXYgLHhvcjApOworICAgIG4ybChpdiwgeG9yMSk7CisgICAgbjJsKGl2LCB4b3IyKTsKKyAgICBuMmwoaXYsIHhvcjMpOworICAgIGl2IC09IDQ7CisKKyAgICBmb3IgKGxlbmd0aC09MTY7IGxlbmd0aCA+PSAwOyBsZW5ndGggLT0gMTYpCisgICAgeworICAgICAgICBuMmwobXNnXzMyLCB0aW4wKTsKKyAgICAgICAgbjJsKG1zZ18zMiwgdGluMSk7CisgICAgICAgIG4ybChtc2dfMzIsIHRpbjIpOworICAgICAgICBuMmwobXNnXzMyLCB0aW4zKTsKKworICAgICAgICBkYXRhWzBdID0gdGluMDsKKyAgICAgICAgZGF0YVsxXSA9IHRpbjE7CisgICAgICAgIGRhdGFbMl0gPSB0aW4yOworICAgICAgICBkYXRhWzNdID0gdGluMzsKKworICAgICAgICBBRVNfZGVjcnlwdChjdHgsIGRhdGEpOworCisgICAgICAgIHRvdXQwID0gZGF0YVswXV54b3IwOworICAgICAgICB0b3V0MSA9IGRhdGFbMV1eeG9yMTsKKyAgICAgICAgdG91dDIgPSBkYXRhWzJdXnhvcjI7CisgICAgICAgIHRvdXQzID0gZGF0YVszXV54b3IzOworCisgICAgICAgIHhvcjAgPSB0aW4wOworICAgICAgICB4b3IxID0gdGluMTsKKyAgICAgICAgeG9yMiA9IHRpbjI7CisgICAgICAgIHhvcjMgPSB0aW4zOworCisgICAgICAgIGwybih0b3V0MCwgb3V0XzMyKTsKKyAgICAgICAgbDJuKHRvdXQxLCBvdXRfMzIpOworICAgICAgICBsMm4odG91dDIsIG91dF8zMik7CisgICAgICAgIGwybih0b3V0Mywgb3V0XzMyKTsKKyAgICB9CisKKyAgICBsMm4oeG9yMCwgaXYpOworICAgIGwybih4b3IxLCBpdik7CisgICAgbDJuKHhvcjIsIGl2KTsKKyAgICBsMm4oeG9yMywgaXYpOworfQorI2VuZGlmCisKKy8qKgorICogRW5jcnlwdCBhIHNpbmdsZSBibG9jayAoMTYgYnl0ZXMpIG9mIGRhdGEKKyAqLwordm9pZCBBRVNfZW5jcnlwdChjb25zdCBBRVNfQ1RYICpjdHgsIHVpbnQzMl90ICpkYXRhKQoreworICAgIC8qIFRvIG1ha2UgdGhpcyBjb2RlIHNtYWxsZXIsIGdlbmVyYXRlIHRoZSBzYm94IGVudHJpZXMgb24gdGhlIGZseS4KKyAgICAgKiBUaGlzIHdpbGwgaGF2ZSBhIHJlYWxseSBoZWF2eSBlZmZlY3QgdXBvbiBwZXJmb3JtYW5jZS4KKyAgICAgKi8KKyAgICB1aW50MzJfdCB0bXBbNF07CisgICAgdWludDMyX3QgdG1wMSwgb2xkX2EwLCBhMCwgYTEsIGEyLCBhMywgcm93OworICAgIGludCBjdXJyX3JuZDsKKyAgICBpbnQgcm91bmRzID0gY3R4LT5yb3VuZHM7IAorICAgIGNvbnN0IHVpbnQzMl90ICprID0gY3R4LT5rczsKKworICAgIC8qIFByZS1yb3VuZCBrZXkgYWRkaXRpb24gKi8KKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IDQ7IHJvdysrKQorICAgIHsKKyAgICAgICAgZGF0YVtyb3ddIF49ICooaysrKTsKKyAgICB9CisKKyAgICAvKiBFbmNyeXB0IG9uZSBibG9jay4gKi8KKyAgICBmb3IgKGN1cnJfcm5kID0gMDsgY3Vycl9ybmQgPCByb3VuZHM7IGN1cnJfcm5kKyspCisgICAgeworICAgICAgICAvKiBQZXJmb3JtIEJ5dGVTdWIgYW5kIFNoaWZ0Um93IG9wZXJhdGlvbnMgdG9nZXRoZXIgKi8KKyAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCA0OyByb3crKykKKyAgICAgICAgeworICAgICAgICAgICAgYTAgPSAodWludDMyX3QpYWVzX3Nib3hbKGRhdGFbcm93JTRdPj4yNCkmMHhGRl07CisgICAgICAgICAgICBhMSA9ICh1aW50MzJfdClhZXNfc2JveFsoZGF0YVsocm93KzEpJTRdPj4xNikmMHhGRl07CisgICAgICAgICAgICBhMiA9ICh1aW50MzJfdClhZXNfc2JveFsoZGF0YVsocm93KzIpJTRdPj44KSYweEZGXTsgCisgICAgICAgICAgICBhMyA9ICh1aW50MzJfdClhZXNfc2JveFsoZGF0YVsocm93KzMpJTRdKSYweEZGXTsKKworICAgICAgICAgICAgLyogUGVyZm9ybSBNaXhDb2x1bW4gaWZmIG5vdCBsYXN0IHJvdW5kICovCisgICAgICAgICAgICBpZiAoY3Vycl9ybmQgPCAocm91bmRzIC0gMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wMSA9IGEwIF4gYTEgXiBhMiBeIGEzOworICAgICAgICAgICAgICAgIG9sZF9hMCA9IGEwOworCisgICAgICAgICAgICAgICAgYTAgXj0gdG1wMSBeIEFFU194dGltZShhMCBeIGExKTsKKyAgICAgICAgICAgICAgICBhMSBePSB0bXAxIF4gQUVTX3h0aW1lKGExIF4gYTIpOworICAgICAgICAgICAgICAgIGEyIF49IHRtcDEgXiBBRVNfeHRpbWUoYTIgXiBhMyk7CisgICAgICAgICAgICAgICAgYTMgXj0gdG1wMSBeIEFFU194dGltZShhMyBeIG9sZF9hMCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG1wW3Jvd10gPSAoKGEwIDw8IDI0KSB8IChhMSA8PCAxNikgfCAoYTIgPDwgOCkgfCBhMyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBLZXlBZGRpdGlvbiAtIG5vdGUgdGhhdCBpdCBpcyB2aXRhbCB0aGF0IHRoaXMgbG9vcCBpcyBzZXBhcmF0ZSBmcm9tCisgICAgICAgICAgIHRoZSBNaXhDb2x1bW4gb3BlcmF0aW9uLCB3aGljaCBtdXN0IGJlIGF0b21pYy4uLiovIAorICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IDQ7IHJvdysrKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhW3Jvd10gPSB0bXBbcm93XSBeICooaysrKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBEZWNyeXB0IGEgc2luZ2xlIGJsb2NrICgxNiBieXRlcykgb2YgZGF0YQorICovCit2b2lkIEFFU19kZWNyeXB0KGNvbnN0IEFFU19DVFggKmN0eCwgdWludDMyX3QgKmRhdGEpCit7IAorICAgIHVpbnQzMl90IHRtcFs0XTsKKyAgICB1aW50MzJfdCB4dDAseHQxLHh0Mix4dDMseHQ0LHh0NSx4dDY7CisgICAgdWludDMyX3QgYTAsIGExLCBhMiwgYTMsIHJvdzsKKyAgICBpbnQgY3Vycl9ybmQ7CisgICAgaW50IHJvdW5kcyA9IGN0eC0+cm91bmRzOworICAgIHVpbnQzMl90ICprID0gKHVpbnQzMl90KiljdHgtPmtzICsgKChyb3VuZHMrMSkqNCk7CisKKyAgICAvKiBwcmUtcm91bmQga2V5IGFkZGl0aW9uICovCisgICAgZm9yIChyb3c9NDsgcm93ID4gMDtyb3ctLSkKKyAgICB7CisgICAgICAgIGRhdGFbcm93LTFdIF49ICooLS1rKTsKKyAgICB9CisKKyAgICAvKiBEZWNyeXB0IG9uZSBibG9jayAqLworICAgIGZvciAoY3Vycl9ybmQ9MDsgY3Vycl9ybmQgPCByb3VuZHM7IGN1cnJfcm5kKyspCisgICAgeworICAgICAgICAvKiBQZXJmb3JtIEJ5dGVTdWIgYW5kIFNoaWZ0Um93IG9wZXJhdGlvbnMgdG9nZXRoZXIgKi8KKyAgICAgICAgZm9yIChyb3cgPSA0OyByb3cgPiAwOyByb3ctLSkKKyAgICAgICAgeworICAgICAgICAgICAgYTAgPSBhZXNfaXNib3hbKGRhdGFbKHJvdyszKSU0XT4+MjQpJjB4RkZdOworICAgICAgICAgICAgYTEgPSBhZXNfaXNib3hbKGRhdGFbKHJvdysyKSU0XT4+MTYpJjB4RkZdOworICAgICAgICAgICAgYTIgPSBhZXNfaXNib3hbKGRhdGFbKHJvdysxKSU0XT4+OCkmMHhGRl07CisgICAgICAgICAgICBhMyA9IGFlc19pc2JveFsoZGF0YVtyb3clNF0pJjB4RkZdOworCisgICAgICAgICAgICAvKiBQZXJmb3JtIE1peENvbHVtbiBpZmYgbm90IGxhc3Qgcm91bmQgKi8KKyAgICAgICAgICAgIGlmIChjdXJyX3JuZDwocm91bmRzLTEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRoZSBNRFMgY29mZWZmaWNpZW50cyAoMHgwOSwgMHgwQiwgMHgwRCwgMHgwRSkKKyAgICAgICAgICAgICAgICAgICBhcmUgcXVpdGUgbGFyZ2UgY29tcGFyZWQgdG8gZW5jcnlwdGlvbjsgdGhpcyAKKyAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gc2xvd3MgZGVjcnlwdGlvbiBkb3duIG5vdGljZWFibHkuICovCisgICAgICAgICAgICAgICAgeHQwID0gQUVTX3h0aW1lKGEwXmExKTsKKyAgICAgICAgICAgICAgICB4dDEgPSBBRVNfeHRpbWUoYTFeYTIpOworICAgICAgICAgICAgICAgIHh0MiA9IEFFU194dGltZShhMl5hMyk7CisgICAgICAgICAgICAgICAgeHQzID0gQUVTX3h0aW1lKGEzXmEwKTsKKyAgICAgICAgICAgICAgICB4dDQgPSBBRVNfeHRpbWUoeHQwXnh0MSk7CisgICAgICAgICAgICAgICAgeHQ1ID0gQUVTX3h0aW1lKHh0MV54dDIpOworICAgICAgICAgICAgICAgIHh0NiA9IEFFU194dGltZSh4dDReeHQ1KTsKKworICAgICAgICAgICAgICAgIHh0MCBePSBhMV5hMl5hM154dDReeHQ2OworICAgICAgICAgICAgICAgIHh0MSBePSBhMF5hMl5hM154dDVeeHQ2OworICAgICAgICAgICAgICAgIHh0MiBePSBhMF5hMV5hM154dDReeHQ2OworICAgICAgICAgICAgICAgIHh0MyBePSBhMF5hMV5hMl54dDVeeHQ2OworICAgICAgICAgICAgICAgIHRtcFtyb3ctMV0gPSAoKHh0MDw8MjQpfCh4dDE8PDE2KXwoeHQyPDw4KXx4dDMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRtcFtyb3ctMV0gPSAoKGEwPDwyNCl8KGExPDwxNil8KGEyPDw4KXxhMyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHJvdyA9IDQ7IHJvdyA+IDA7IHJvdy0tKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhW3Jvdy0xXSA9IHRtcFtyb3ctMV0gXiAqKC0tayk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL2JpZ2ludC5jIGIvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL2JpZ2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Y2FkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jcnlwdG8vYXh0bHMvYmlnaW50LmMKQEAgLTAsMCArMSwxNDk2IEBACisvKgorICogIENvcHlyaWdodChDKSAyMDA2IENhbWVyb24gUmljaAorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgYmlnaW50X2FwaSBCaWcgSW50ZWdlciBBUEkKKyAqIEBicmllZiBUaGUgYmlnaW50IGltcGxlbWVudGF0aW9uIGFzIHVzZWQgYnkgdGhlIGF4VExTIHByb2plY3QuCisgKgorICogVGhlIGJpZ2ludCBsaWJyYXJ5IGlzIGZvciBSU0EgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGFzIHdlbGwgYXMgc2lnbmluZy4KKyAqIFRoaXMgY29kZSB0cmllcyB0byBtaW5pbWlzZSB1c2Ugb2YgbWFsbG9jL2ZyZWUgYnkgbWFpbnRhaW5pbmcgYSBzbWFsbCAKKyAqIGNhY2hlLiBBIGJpZ2ludCBjb250ZXh0IG1heSBtYWludGFpbiBzdGF0ZSBieSBiZWluZyBtYWRlICJwZXJtYW5lbnQiLiAKKyAqIEl0IGJlIGJlIGxhdGVyIHJlbGVhc2VkIHdpdGggYSBiaV9kZXBlcm1hbmVudCgpIGFuZCBiaV9mcmVlKCkgY2FsbC4KKyAqCisgKiBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHJlZHVjdGlvbiB0ZWNobmlxdWVzOgorICogLSBDbGFzc2ljYWwKKyAqIC0gQmFycmV0dAorICogLSBNb250Z29tZXJ5CisgKgorICogSXQgYWxzbyBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmc6CisgKiAtIEthcmF0c3ViYSBtdWx0aXBsaWNhdGlvbgorICogLSBTcXVhcmluZworICogLSBTbGlkaW5nIHdpbmRvdyBleHBvbmVudGlhdGlvbgorICogLSBDaGluZXNlIFJlbWFpbmRlciBUaGVvcmVtIChpbXBsZW1lbnRlZCBpbiByc2EuYykuCisgKgorICogQWxsIHRoZSBhbGdvcml0aG1zIHVzZWQgYXJlIHByZXR0eSBzdGFuZGFyZCwgYW5kIGRlc2lnbmVkIGZvciBkaWZmZXJlbnQKKyAqIGRhdGEgYnVzIHNpemVzLiBOZWdhdGl2ZSBudW1iZXJzIGFyZSBub3QgZGVhbHQgd2l0aCBhdCBhbGwsIHNvIGEgc3VidHJhY3Rpb24KKyAqIG1heSBuZWVkIHRvIGJlIHRlc3RlZCBmb3IgbmVnYXRpdml0eS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgc3RlYWxzIHNvbWUgaWRlYXMgZnJvbSBKZWYgUG9za2FuemVyCisgKiA8aHR0cDovL2NzLm1hcmxib3JvLmVkdS90ZXJtL2NzLWZhbGwwMi9hbGdvcml0aG1zL2NyeXB0by9SU0EvYmlnaW50PgorICogYW5kIEdNUCA8aHR0cDovL3d3dy5zd294LmNvbS9nbXA+LiBJdCBnZXRzIG1vc3Qgb2YgaXRzIGltcGxlbWVudGF0aW9uCisgKiBkZXRhaWwgZnJvbSAiVGhlIEhhbmRib29rIG9mIEFwcGxpZWQgQ3J5cHRvZ3JhcGh5IgorICogPGh0dHA6Ly93d3cuY2Fjci5tYXRoLnV3YXRlcmxvby5jYS9oYWMvYWJvdXQvY2hhcDE0LnBkZj4KKyAqIEB7CisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImJpZ2ludC5oIgorI2luY2x1ZGUgImNyeXB0by5oIgorCitzdGF0aWMgYmlnaW50ICpiaV9pbnRfbXVsdGlwbHkoQklfQ1RYICpjdHgsIGJpZ2ludCAqYmksIGNvbXAgaSk7CitzdGF0aWMgYmlnaW50ICpiaV9pbnRfZGl2aWRlKEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpUiwgY29tcCBkZW5vbSk7CitzdGF0aWMgYmlnaW50IF9fbWFsbG9jICphbGxvYyhCSV9DVFggKmN0eCwgaW50IHNpemUpOworc3RhdGljIGJpZ2ludCAqdHJpbShiaWdpbnQgKmJpKTsKK3N0YXRpYyB2b2lkIG1vcmVfY29tcHMoYmlnaW50ICpiaSwgaW50IG4pOworI2lmIGRlZmluZWQoQ09ORklHX0JJR0lOVF9LQVJBVFNVQkEpIHx8IGRlZmluZWQoQ09ORklHX0JJR0lOVF9CQVJSRVRUKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQklHSU5UX01PTlRHT01FUlkpCitzdGF0aWMgYmlnaW50ICpjb21wX3JpZ2h0X3NoaWZ0KGJpZ2ludCAqYmlSLCBpbnQgbnVtX3NoaWZ0cyk7CitzdGF0aWMgYmlnaW50ICpjb21wX2xlZnRfc2hpZnQoYmlnaW50ICpiaVIsIGludCBudW1fc2hpZnRzKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JJR0lOVF9DSEVDS19PTgorc3RhdGljIHZvaWQgY2hlY2soY29uc3QgYmlnaW50ICpiaSk7CisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgU3RhcnQgYSBuZXcgYmlnaW50IGNvbnRleHQuCisgKiBAcmV0dXJuIEEgYmlnaW50IGNvbnRleHQuCisgKi8KK0JJX0NUWCAqYmlfaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIGNhbGxvYygpIHNldHMgZXZlcnl0aGluZyB0byB6ZXJvICovCisgICAgQklfQ1RYICpjdHggPSAoQklfQ1RYICopY2FsbG9jKDEsIHNpemVvZihCSV9DVFgpKTsKKyAgIAorICAgIC8qIHRoZSByYWRpeCAqLworICAgIGN0eC0+YmlfcmFkaXggPSBhbGxvYyhjdHgsIDIpOyAKKyAgICBjdHgtPmJpX3JhZGl4LT5jb21wc1swXSA9IDA7CisgICAgY3R4LT5iaV9yYWRpeC0+Y29tcHNbMV0gPSAxOworICAgIGJpX3Blcm1hbmVudChjdHgtPmJpX3JhZGl4KTsKKyAgICByZXR1cm4gY3R4OworfQorCisvKioKKyAqIEBicmllZiBDbG9zZSB0aGUgYmlnaW50IGNvbnRleHQgYW5kIGZyZWUgYW55IHJlc291cmNlcy4KKyAqCisgKiBGcmVlIHVwIGFueSB1c2VkIG1lbW9yeSAtIGEgY2hlY2sgaXMgZG9uZSBpZiBhbGwgb2JqZWN0cyB3ZXJlIG5vdCAKKyAqIHByb3Blcmx5IGZyZWVkLgorICogQHBhcmFtIGN0eCBbaW5dICAgVGhlIGJpZ2ludCBzZXNzaW9uIGNvbnRleHQuCisgKi8KK3ZvaWQgYmlfdGVybWluYXRlKEJJX0NUWCAqY3R4KQoreworICAgIGJpZ2ludCAqcCwgKnBuOworCisgICAgYmlfZGVwZXJtYW5lbnQoY3R4LT5iaV9yYWRpeCk7IAorICAgIGJpX2ZyZWUoY3R4LCBjdHgtPmJpX3JhZGl4KTsKKworICAgIGlmIChjdHgtPmFjdGl2ZV9jb3VudCAhPSAwKQorICAgIHsKKyNpZmRlZiBDT05GSUdfU1NMX0ZVTExfTU9ERQorICAgICAgICBwcmludGYoImJpX3Rlcm1pbmF0ZTogdGhlcmUgd2VyZSAlZCB1bi1mcmVlZCBiaWdpbnRzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmFjdGl2ZV9jb3VudCk7CisjZW5kaWYKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICBmb3IgKHAgPSBjdHgtPmZyZWVfbGlzdDsgcCAhPSBOVUxMOyBwID0gcG4pCisgICAgeworICAgICAgICBwbiA9IHAtPm5leHQ7CisgICAgICAgIGZyZWUocC0+Y29tcHMpOworICAgICAgICBmcmVlKHApOworICAgIH0KKworICAgIGZyZWUoY3R4KTsKK30KKworLyoqCisgKiBAYnJpZWYgSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byB0aGlzIG9iamVjdC4gCisgKiBJdCBkb2VzIG5vdCBkbyBhIGZ1bGwgY29weS4KKyAqIEBwYXJhbSBiaSBbaW5dICAgVGhlIGJpZ2ludCB0byBjb3B5LgorICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGUgc2FtZSBiaWdpbnQuCisgKi8KK2JpZ2ludCAqYmlfY29weShiaWdpbnQgKmJpKQoreworICAgIGNoZWNrKGJpKTsKKyAgICBpZiAoYmktPnJlZnMgIT0gUEVSTUFORU5UKQorICAgICAgICBiaS0+cmVmcysrOworICAgIHJldHVybiBiaTsKK30KKworLyoqCisgKiBAYnJpZWYgU2ltcGx5IG1ha2UgYSBiaWdpbnQgb2JqZWN0ICJ1bmZyZWVhYmxlIiBpZiBiaV9mcmVlKCkgaXMgY2FsbGVkIG9uIGl0LgorICoKKyAqIEZvciB0aGlzIG9iamVjdCB0byBiZSBmcmVlZCwgYmlfZGVwZXJtYW5lbnQoKSBtdXN0IGJlIGNhbGxlZC4KKyAqIEBwYXJhbSBiaSBbaW5dICAgVGhlIGJpZ2ludCB0byBiZSBtYWRlIHBlcm1hbmVudC4KKyAqLwordm9pZCBiaV9wZXJtYW5lbnQoYmlnaW50ICpiaSkKK3sKKyAgICBjaGVjayhiaSk7CisgICAgaWYgKGJpLT5yZWZzICE9IDEpCisgICAgeworI2lmZGVmIENPTkZJR19TU0xfRlVMTF9NT0RFCisgICAgICAgIHByaW50ZigiYmlfcGVybWFuZW50OiByZWZzIHdhcyBub3QgMVxuIik7CisjZW5kaWYKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICBiaS0+cmVmcyA9IFBFUk1BTkVOVDsKK30KKworLyoqCisgKiBAYnJpZWYgVGFrZSBhIHBlcm1hbmVudCBvYmplY3QgYW5kIG1ha2UgaXQgZWxpZ2libGUgZm9yIGZyZWVkb20uCisgKiBAcGFyYW0gYmkgW2luXSAgIFRoZSBiaWdpbnQgdG8gYmUgbWFkZSBiYWNrIHRvIHRlbXBvcmFyeS4KKyAqLwordm9pZCBiaV9kZXBlcm1hbmVudChiaWdpbnQgKmJpKQoreworICAgIGNoZWNrKGJpKTsKKyAgICBpZiAoYmktPnJlZnMgIT0gUEVSTUFORU5UKQorICAgIHsKKyNpZmRlZiBDT05GSUdfU1NMX0ZVTExfTU9ERQorICAgICAgICBwcmludGYoImJpX2RlcGVybWFuZW50OiBiaWdpbnQgd2FzIG5vdCBwZXJtYW5lbnRcbiIpOworI2VuZGlmCisgICAgICAgIGFib3J0KCk7CisgICAgfQorCisgICAgYmktPnJlZnMgPSAxOworfQorCisvKioKKyAqIEBicmllZiBGcmVlIGEgYmlnaW50IG9iamVjdCBzbyBpdCBjYW4gYmUgdXNlZCBhZ2Fpbi4gCisgKgorICogVGhlIG1lbW9yeSBpdHNlbGYgaXQgbm90IGFjdHVhbGx5IGZyZWVkLCBqdXN0IHRhZ2dlZCBhcyBiZWluZyBhdmFpbGFibGUgCisgKiBAcGFyYW0gY3R4IFtpbl0gICBUaGUgYmlnaW50IHNlc3Npb24gY29udGV4dC4KKyAqIEBwYXJhbSBiaSBbaW5dICAgIFRoZSBiaWdpbnQgdG8gYmUgZnJlZWQuCisgKi8KK3ZvaWQgYmlfZnJlZShCSV9DVFggKmN0eCwgYmlnaW50ICpiaSkKK3sKKyAgICBjaGVjayhiaSk7CisgICAgaWYgKGJpLT5yZWZzID09IFBFUk1BTkVOVCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoLS1iaS0+cmVmcyA+IDApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYmktPm5leHQgPSBjdHgtPmZyZWVfbGlzdDsKKyAgICBjdHgtPmZyZWVfbGlzdCA9IGJpOworICAgIGN0eC0+ZnJlZV9jb3VudCsrOworCisgICAgaWYgKC0tY3R4LT5hY3RpdmVfY291bnQgPCAwKQorICAgIHsKKyNpZmRlZiBDT05GSUdfU1NMX0ZVTExfTU9ERQorICAgICAgICBwcmludGYoImJpX2ZyZWU6IGFjdGl2ZV9jb3VudCB3ZW50IG5lZ2F0aXZlICIKKyAgICAgICAgICAgICAgICAiLSBkb3VibGUtZnJlZWQgYmlnaW50P1xuIik7CisjZW5kaWYKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKKy8qKgorICogQGJyaWVmIENvbnZlcnQgYW4gKHVuc2lnbmVkKSBpbnRlZ2VyIGludG8gYSBiaWdpbnQuCisgKiBAcGFyYW0gY3R4IFtpbl0gICBUaGUgYmlnaW50IHNlc3Npb24gY29udGV4dC4KKyAqIEBwYXJhbSBpIFtpbl0gICAgIFRoZSAodW5zaWduZWQpIGludGVnZXIgdG8gYmUgY29udmVydGVkLgorICogCisgKi8KK2JpZ2ludCAqaW50X3RvX2JpKEJJX0NUWCAqY3R4LCBjb21wIGkpCit7CisgICAgYmlnaW50ICpiaVIgPSBhbGxvYyhjdHgsIDEpOworICAgIGJpUi0+Y29tcHNbMF0gPSBpOworICAgIHJldHVybiBiaVI7Cit9CisKKy8qKgorICogQGJyaWVmIERvIGEgZnVsbCBjb3B5IG9mIHRoZSBiaWdpbnQgb2JqZWN0LgorICogQHBhcmFtIGN0eCBbaW5dICAgVGhlIGJpZ2ludCBzZXNzaW9uIGNvbnRleHQuCisgKiBAcGFyYW0gYmkgIFtpbl0gICBUaGUgYmlnaW50IG9iamVjdCB0byBiZSBjb3BpZWQuCisgKi8KK2JpZ2ludCAqYmlfY2xvbmUoQklfQ1RYICpjdHgsIGNvbnN0IGJpZ2ludCAqYmkpCit7CisgICAgYmlnaW50ICpiaVIgPSBhbGxvYyhjdHgsIGJpLT5zaXplKTsKKyAgICBjaGVjayhiaSk7CisgICAgbWVtY3B5KGJpUi0+Y29tcHMsIGJpLT5jb21wcywgYmktPnNpemUqQ09NUF9CWVRFX1NJWkUpOworICAgIHJldHVybiBiaVI7Cit9CisKKy8qKgorICogQGJyaWVmIFBlcmZvcm0gYW4gYWRkaXRpb24gb3BlcmF0aW9uIGJldHdlZW4gdHdvIGJpZ2ludHMuCisgKiBAcGFyYW0gY3R4IFtpbl0gIFRoZSBiaWdpbnQgc2Vzc2lvbiBjb250ZXh0LgorICogQHBhcmFtIGJpYSBbaW5dICBBIGJpZ2ludC4KKyAqIEBwYXJhbSBiaWIgW2luXSAgQW5vdGhlciBiaWdpbnQuCisgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGFkZGl0aW9uLgorICovCitiaWdpbnQgKmJpX2FkZChCSV9DVFggKmN0eCwgYmlnaW50ICpiaWEsIGJpZ2ludCAqYmliKQoreworICAgIGludCBuOworICAgIGNvbXAgY2FycnkgPSAwOworICAgIGNvbXAgKnBhLCAqcGI7CisKKyAgICBjaGVjayhiaWEpOworICAgIGNoZWNrKGJpYik7CisKKyAgICBuID0gbWF4KGJpYS0+c2l6ZSwgYmliLT5zaXplKTsKKyAgICBtb3JlX2NvbXBzKGJpYSwgbisxKTsKKyAgICBtb3JlX2NvbXBzKGJpYiwgbik7CisgICAgcGEgPSBiaWEtPmNvbXBzOworICAgIHBiID0gYmliLT5jb21wczsKKworICAgIGRvCisgICAgeworICAgICAgICBjb21wICBzbCwgcmwsIGN5MTsKKyAgICAgICAgc2wgPSAqcGEgKyAqcGIrKzsKKyAgICAgICAgcmwgPSBzbCArIGNhcnJ5OworICAgICAgICBjeTEgPSBzbCA8ICpwYTsKKyAgICAgICAgY2FycnkgPSBjeTEgfCAocmwgPCBzbCk7CisgICAgICAgICpwYSsrID0gcmw7CisgICAgfSB3aGlsZSAoLS1uICE9IDApOworCisgICAgKnBhID0gY2Fycnk7ICAgICAgICAgICAgICAgICAgLyogZG8gb3ZlcmZsb3cgKi8KKyAgICBiaV9mcmVlKGN0eCwgYmliKTsKKyAgICByZXR1cm4gdHJpbShiaWEpOworfQorCisvKioKKyAqIEBicmllZiBQZXJmb3JtIGEgc3VidHJhY3Rpb24gb3BlcmF0aW9uIGJldHdlZW4gdHdvIGJpZ2ludHMuCisgKiBAcGFyYW0gY3R4IFtpbl0gIFRoZSBiaWdpbnQgc2Vzc2lvbiBjb250ZXh0LgorICogQHBhcmFtIGJpYSBbaW5dICBBIGJpZ2ludC4KKyAqIEBwYXJhbSBiaWIgW2luXSAgQW5vdGhlciBiaWdpbnQuCisgKiBAcGFyYW0gaXNfbmVnYXRpdmUgW291dF0gSWYgZGVmaW5lZCwgaW5kaWNhdGVzIHRoYXQgdGhlIHJlc3VsdCB3YXMgbmVnYXRpdmUuCisgKiBpc19uZWdhdGl2ZSBtYXkgYmUgbnVsbC4KKyAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgc3VidHJhY3Rpb24uIFRoZSByZXN1bHQgaXMgYWx3YXlzIHBvc2l0aXZlLgorICovCitiaWdpbnQgKmJpX3N1YnRyYWN0KEJJX0NUWCAqY3R4LCAKKyAgICAgICAgYmlnaW50ICpiaWEsIGJpZ2ludCAqYmliLCBpbnQgKmlzX25lZ2F0aXZlKQoreworICAgIGludCBuID0gYmlhLT5zaXplOworICAgIGNvbXAgKnBhLCAqcGIsIGNhcnJ5ID0gMDsKKworICAgIGNoZWNrKGJpYSk7CisgICAgY2hlY2soYmliKTsKKworICAgIG1vcmVfY29tcHMoYmliLCBuKTsKKyAgICBwYSA9IGJpYS0+Y29tcHM7CisgICAgcGIgPSBiaWItPmNvbXBzOworCisgICAgZG8gCisgICAgeworICAgICAgICBjb21wIHNsLCBybCwgY3kxOworICAgICAgICBzbCA9ICpwYSAtICpwYisrOworICAgICAgICBybCA9IHNsIC0gY2Fycnk7CisgICAgICAgIGN5MSA9IHNsID4gKnBhOworICAgICAgICBjYXJyeSA9IGN5MSB8IChybCA+IHNsKTsKKyAgICAgICAgKnBhKysgPSBybDsKKyAgICB9IHdoaWxlICgtLW4gIT0gMCk7CisKKyAgICBpZiAoaXNfbmVnYXRpdmUpICAgIC8qIGluZGljYXRlIGEgbmVnYXRpdmUgcmVzdWx0ICovCisgICAgeworICAgICAgICAqaXNfbmVnYXRpdmUgPSBjYXJyeTsKKyAgICB9CisKKyAgICBiaV9mcmVlKGN0eCwgdHJpbShiaWIpKTsgICAgLyogcHV0IGJpYiBiYWNrIHRvIHRoZSB3YXkgaXQgd2FzICovCisgICAgcmV0dXJuIHRyaW0oYmlhKTsKK30KKworLyoqCisgKiBQZXJmb3JtIGEgbXVsdGlwbHkgYmV0d2VlbiBhIGJpZ2ludCBhbiBhbiAodW5zaWduZWQpIGludGVnZXIKKyAqLworc3RhdGljIGJpZ2ludCAqYmlfaW50X211bHRpcGx5KEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpYSwgY29tcCBiKQoreworICAgIGludCBqID0gMCwgbiA9IGJpYS0+c2l6ZTsKKyAgICBiaWdpbnQgKmJpUiA9IGFsbG9jKGN0eCwgbiArIDEpOworICAgIGNvbXAgY2FycnkgPSAwOworICAgIGNvbXAgKnIgPSBiaVItPmNvbXBzOworICAgIGNvbXAgKmEgPSBiaWEtPmNvbXBzOworCisgICAgY2hlY2soYmlhKTsKKworICAgIC8qIGNsZWFyIHRoaW5ncyB0byBzdGFydCB3aXRoICovCisgICAgbWVtc2V0KHIsIDAsICgobisxKSpDT01QX0JZVEVfU0laRSkpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGxvbmdfY29tcCB0bXAgPSAqciArIChsb25nX2NvbXApYVtqXSpiICsgY2Fycnk7CisgICAgICAgICpyKysgPSAoY29tcCl0bXA7ICAgICAgICAgICAgICAvKiBkb3duc2l6ZSAqLworICAgICAgICBjYXJyeSA9IChjb21wKSh0bXAgPj4gQ09NUF9CSVRfU0laRSk7CisgICAgfSB3aGlsZSAoKytqIDwgbik7CisKKyAgICAqciA9IGNhcnJ5OworICAgIGJpX2ZyZWUoY3R4LCBiaWEpOworICAgIHJldHVybiB0cmltKGJpUik7Cit9CisKKy8qKgorICogQGJyaWVmIERvZXMgYm90aCBkaXZpc2lvbiBhbmQgbW9kdWxvIGNhbGN1bGF0aW9ucy4gCisgKgorICogVXNlZCBleHRlbnNpdmVseSB3aGVuIGRvaW5nIGNsYXNzaWNhbCByZWR1Y3Rpb24uCisgKiBAcGFyYW0gY3R4IFtpbl0gIFRoZSBiaWdpbnQgc2Vzc2lvbiBjb250ZXh0LgorICogQHBhcmFtIHUgW2luXSAgICBBIGJpZ2ludCB3aGljaCBpcyB0aGUgbnVtZXJhdG9yLgorICogQHBhcmFtIHYgW2luXSAgICBFaXRoZXIgdGhlIGRlbm9taW5hdG9yIG9yIHRoZSBtb2R1bHVzIGRlcGVuZGluZyBvbiB0aGUgbW9kZS4KKyAqIEBwYXJhbSBpc19tb2QgW25dIERldGVybWluZXMgaWYgdGhpcyBpcyBhIG5vcm1hbCBkaXZpc2lvbiAoMCkgb3IgYSByZWR1Y3Rpb24KKyAqICgxKS4KKyAqIEByZXR1cm4gIFRoZSByZXN1bHQgb2YgdGhlIGRpdmlzaW9uL3JlZHVjdGlvbi4KKyAqLworYmlnaW50ICpiaV9kaXZpZGUoQklfQ1RYICpjdHgsIGJpZ2ludCAqdSwgYmlnaW50ICp2LCBpbnQgaXNfbW9kKQoreworICAgIGludCBuID0gdi0+c2l6ZSwgbSA9IHUtPnNpemUtbjsKKyAgICBpbnQgaiA9IDAsIG9yaWdfdV9zaXplID0gdS0+c2l6ZTsKKyAgICB1aW50OF90IG1vZF9vZmZzZXQgPSBjdHgtPm1vZF9vZmZzZXQ7CisgICAgY29tcCBkOworICAgIGJpZ2ludCAqcXVvdGllbnQsICp0bXBfdTsKKyAgICBjb21wIHFfZGFzaDsKKworICAgIGNoZWNrKHUpOworICAgIGNoZWNrKHYpOworCisgICAgLyogaWYgZG9pbmcgcmVkdWN0aW9uIGFuZCB3ZSBhcmUgPCBtb2QsIHRoZW4gcmV0dXJuIG1vZCAqLworICAgIGlmIChpc19tb2QgJiYgYmlfY29tcGFyZSh2LCB1KSA+IDApCisgICAgeworICAgICAgICBiaV9mcmVlKGN0eCwgdik7CisgICAgICAgIHJldHVybiB1OworICAgIH0KKworICAgIHF1b3RpZW50ID0gYWxsb2MoY3R4LCBtKzEpOworICAgIHRtcF91ID0gYWxsb2MoY3R4LCBuKzEpOworICAgIHYgPSB0cmltKHYpOyAgICAgICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgbm8gbGVhZGluZyAwJ3MgKi8KKyAgICBkID0gKGNvbXApKChsb25nX2NvbXApQ09NUF9SQURJWC8oVjErMSkpOworCisgICAgLyogY2xlYXIgdGhpbmdzIHRvIHN0YXJ0IHdpdGggKi8KKyAgICBtZW1zZXQocXVvdGllbnQtPmNvbXBzLCAwLCAoKHF1b3RpZW50LT5zaXplKSpDT01QX0JZVEVfU0laRSkpOworCisgICAgLyogbm9ybWFsaXNlICovCisgICAgaWYgKGQgPiAxKQorICAgIHsKKyAgICAgICAgdSA9IGJpX2ludF9tdWx0aXBseShjdHgsIHUsIGQpOworCisgICAgICAgIGlmIChpc19tb2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHYgPSBjdHgtPmJpX25vcm1hbGlzZWRfbW9kW21vZF9vZmZzZXRdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdiA9IGJpX2ludF9tdWx0aXBseShjdHgsIHYsIGQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9yaWdfdV9zaXplID09IHUtPnNpemUpICAvKiBuZXcgZGlnaXQgcG9zaXRpb24gdTAgKi8KKyAgICB7CisgICAgICAgIG1vcmVfY29tcHModSwgb3JpZ191X3NpemUgKyAxKTsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogZ2V0IGEgdGVtcG9yYXJ5IHNob3J0IHZlcnNpb24gb2YgdSAqLworICAgICAgICBtZW1jcHkodG1wX3UtPmNvbXBzLCAmdS0+Y29tcHNbdS0+c2l6ZS1uLTEtal0sIChuKzEpKkNPTVBfQllURV9TSVpFKTsKKworICAgICAgICAvKiBjYWxjdWxhdGUgcScgKi8KKyAgICAgICAgaWYgKFUoMCkgPT0gVjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHFfZGFzaCA9IENPTVBfUkFESVgtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHFfZGFzaCA9IChjb21wKSgoKGxvbmdfY29tcClVKDApKkNPTVBfUkFESVggKyBVKDEpKS9WMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodi0+c2l6ZSA+IDEgJiYgVjIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIGFyZSBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgIGlmIChWMipxX2Rhc2ggPiAoKChVKDApKkNPTVBfUkFESVggKyBVKDEpIC0gCisgICAgICAgICAgICAgICAgICAgIHFfZGFzaCpWMSkqQ09NUF9SQURJWCkgKyBVKDIpKSkgLi4uICovCisgICAgICAgICAgICBjb21wIGlubmVyID0gKGNvbXApKChsb25nX2NvbXApQ09NUF9SQURJWCpVKDApICsgVSgxKSAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nX2NvbXApcV9kYXNoKlYxKTsKKyAgICAgICAgICAgIGlmICgobG9uZ19jb21wKVYyKnFfZGFzaCA+IChsb25nX2NvbXApaW5uZXIqQ09NUF9SQURJWCArIFUoMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcV9kYXNoLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBtdWx0aXBseSBhbmQgc3VidHJhY3QgKi8KKyAgICAgICAgaWYgKHFfZGFzaCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlzX25lZ2F0aXZlOworICAgICAgICAgICAgdG1wX3UgPSBiaV9zdWJ0cmFjdChjdHgsIHRtcF91LCAKKyAgICAgICAgICAgICAgICAgICAgYmlfaW50X211bHRpcGx5KGN0eCwgYmlfY29weSh2KSwgcV9kYXNoKSwgJmlzX25lZ2F0aXZlKTsKKyAgICAgICAgICAgIG1vcmVfY29tcHModG1wX3UsIG4rMSk7CisKKyAgICAgICAgICAgIFEoaikgPSBxX2Rhc2g7IAorCisgICAgICAgICAgICAvKiBhZGQgYmFjayAqLworICAgICAgICAgICAgaWYgKGlzX25lZ2F0aXZlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFEoaiktLTsKKyAgICAgICAgICAgICAgICB0bXBfdSA9IGJpX2FkZChjdHgsIHRtcF91LCBiaV9jb3B5KHYpKTsKKworICAgICAgICAgICAgICAgIC8qIGxvcCBvZmYgdGhlIGNhcnJ5ICovCisgICAgICAgICAgICAgICAgdG1wX3UtPnNpemUtLTsKKyAgICAgICAgICAgICAgICB2LT5zaXplLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBRKGopID0gMDsgCisgICAgICAgIH0KKworICAgICAgICAvKiBjb3B5IGJhY2sgdG8gdSAqLworICAgICAgICBtZW1jcHkoJnUtPmNvbXBzW3UtPnNpemUtbi0xLWpdLCB0bXBfdS0+Y29tcHMsIChuKzEpKkNPTVBfQllURV9TSVpFKTsKKyAgICB9IHdoaWxlICgrK2ogPD0gbSk7CisKKyAgICBiaV9mcmVlKGN0eCwgdG1wX3UpOworICAgIGJpX2ZyZWUoY3R4LCB2KTsKKworICAgIGlmIChpc19tb2QpICAgICAvKiBnZXQgdGhlIHJlbWFpbmRlciAqLworICAgIHsKKyAgICAgICAgYmlfZnJlZShjdHgsIHF1b3RpZW50KTsKKyAgICAgICAgcmV0dXJuIGJpX2ludF9kaXZpZGUoY3R4LCB0cmltKHUpLCBkKTsKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgIC8qIGdldCB0aGUgcXVvdGllbnQgKi8KKyAgICB7CisgICAgICAgIGJpX2ZyZWUoY3R4LCB1KTsKKyAgICAgICAgcmV0dXJuIHRyaW0ocXVvdGllbnQpOworICAgIH0KK30KKworLyoKKyAqIFBlcmZvcm0gYW4gaW50ZWdlciBkaXZpZGUgb24gYSBiaWdpbnQuCisgKi8KK3N0YXRpYyBiaWdpbnQgKmJpX2ludF9kaXZpZGUoQklfQ1RYICpjdHggX191bnVzZWQsIGJpZ2ludCAqYmlSLCBjb21wIGRlbm9tKQoreworICAgIGludCBpID0gYmlSLT5zaXplIC0gMTsKKyAgICBsb25nX2NvbXAgciA9IDA7CisKKyAgICBjaGVjayhiaVIpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHIgPSAocjw8Q09NUF9CSVRfU0laRSkgKyBiaVItPmNvbXBzW2ldOworICAgICAgICBiaVItPmNvbXBzW2ldID0gKGNvbXApKHIgLyBkZW5vbSk7CisgICAgICAgIHIgJT0gZGVub207CisgICAgfSB3aGlsZSAoLS1pICE9IDApOworCisgICAgcmV0dXJuIHRyaW0oYmlSKTsKK30KKworI2lmZGVmIENPTkZJR19CSUdJTlRfTU9OVEdPTUVSWQorLyoqCisgKiBUaGVyZSBpcyBhIG5lZWQgZm9yIHRoZSB2YWx1ZSBvZiBpbnRlZ2VyIE4nIHN1Y2ggdGhhdCBCXi0xKEItMSktTl4tMU4nPTEsIAorICogd2hlcmUgQl4tMShCLTEpIG1vZCBOPTEuIEFjdHVhbGx5LCBvbmx5IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIAorICogTicgaXMgbmVlZGVkLCBoZW5jZSB0aGUgZGVmaW5pdGlvbiBOMCc9TicgbW9kIGIuIFdlIHJlcHJvZHVjZSBiZWxvdyB0aGUgCisgKiBzaW1wbGUgYWxnb3JpdGhtIGZyb20gYW4gYXJ0aWNsZSBieSBEdXNzZSBhbmQgS2FsaXNraSB0byBlZmZpY2llbnRseSAKKyAqIGZpbmQgTjAnIGZyb20gTjAgYW5kIGIgKi8KK3N0YXRpYyBjb21wIG1vZHVsYXJfaW52ZXJzZShiaWdpbnQgKmJpbSkKK3sKKyAgICBpbnQgaTsKKyAgICBjb21wIHQgPSAxOworICAgIGNvbXAgdHdvXzJfaV9taW51c18xID0gMjsgICAvKiAyXihpLTEpICovCisgICAgbG9uZ19jb21wIHR3b18yX2kgPSA0OyAgICAgIC8qIDJeaSAqLworICAgIGNvbXAgTiA9IGJpbS0+Y29tcHNbMF07CisKKyAgICBmb3IgKGkgPSAyOyBpIDw9IENPTVBfQklUX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgobG9uZ19jb21wKU4qdCV0d29fMl9pID49IHR3b18yX2lfbWludXNfMSkKKyAgICAgICAgeworICAgICAgICAgICAgdCArPSB0d29fMl9pX21pbnVzXzE7CisgICAgICAgIH0KKworICAgICAgICB0d29fMl9pX21pbnVzXzEgPDw9IDE7CisgICAgICAgIHR3b18yX2kgPDw9IDE7CisgICAgfQorCisgICAgcmV0dXJuIChjb21wKShDT01QX1JBRElYLXQpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CSUdJTlRfS0FSQVRTVUJBKSB8fCBkZWZpbmVkKENPTkZJR19CSUdJTlRfQkFSUkVUVCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0JJR0lOVF9NT05UR09NRVJZKQorLyoqCisgKiBUYWtlIGVhY2ggY29tcG9uZW50IGFuZCBzaGlmdCBkb3duIChpbiB0ZXJtcyBvZiBjb21wb25lbnRzKSAKKyAqLworc3RhdGljIGJpZ2ludCAqY29tcF9yaWdodF9zaGlmdChiaWdpbnQgKmJpUiwgaW50IG51bV9zaGlmdHMpCit7CisgICAgaW50IGkgPSBiaVItPnNpemUtbnVtX3NoaWZ0czsKKyAgICBjb21wICp4ID0gYmlSLT5jb21wczsKKyAgICBjb21wICp5ID0gJmJpUi0+Y29tcHNbbnVtX3NoaWZ0c107CisKKyAgICBjaGVjayhiaVIpOworCisgICAgaWYgKGkgPD0gMCkgICAgIC8qIGhhdmUgd2UgY29tcGxldGVseSByaWdodCBzaGlmdGVkPyAqLworICAgIHsKKyAgICAgICAgYmlSLT5jb21wc1swXSA9IDA7ICAvKiByZXR1cm4gMCAqLworICAgICAgICBiaVItPnNpemUgPSAxOworICAgICAgICByZXR1cm4gYmlSOworICAgIH0KKworICAgIGRvCisgICAgeworICAgICAgICAqeCsrID0gKnkrKzsKKyAgICB9IHdoaWxlICgtLWkgPiAwKTsKKworICAgIGJpUi0+c2l6ZSAtPSBudW1fc2hpZnRzOworICAgIHJldHVybiBiaVI7Cit9CisKKy8qKgorICogVGFrZSBlYWNoIGNvbXBvbmVudCBhbmQgc2hpZnQgaXQgdXAgKGluIHRlcm1zIG9mIGNvbXBvbmVudHMpIAorICovCitzdGF0aWMgYmlnaW50ICpjb21wX2xlZnRfc2hpZnQoYmlnaW50ICpiaVIsIGludCBudW1fc2hpZnRzKQoreworICAgIGludCBpID0gYmlSLT5zaXplLTE7CisgICAgY29tcCAqeCwgKnk7CisKKyAgICBjaGVjayhiaVIpOworCisgICAgaWYgKG51bV9zaGlmdHMgPD0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBiaVI7CisgICAgfQorCisgICAgbW9yZV9jb21wcyhiaVIsIGJpUi0+c2l6ZSArIG51bV9zaGlmdHMpOworCisgICAgeCA9ICZiaVItPmNvbXBzW2krbnVtX3NoaWZ0c107CisgICAgeSA9ICZiaVItPmNvbXBzW2ldOworCisgICAgZG8KKyAgICB7CisgICAgICAgICp4LS0gPSAqeS0tOworICAgIH0gd2hpbGUgKGktLSk7CisKKyAgICBtZW1zZXQoYmlSLT5jb21wcywgMCwgbnVtX3NoaWZ0cypDT01QX0JZVEVfU0laRSk7IC8qIHplcm8gTFMgY29tcHMgKi8KKyAgICByZXR1cm4gYmlSOworfQorI2VuZGlmCisKKy8qKgorICogQGJyaWVmIEFsbG93IGEgYmluYXJ5IHNlcXVlbmNlIHRvIGJlIGltcG9ydGVkIGFzIGEgYmlnaW50LgorICogQHBhcmFtIGN0eCBbaW5dICBUaGUgYmlnaW50IHNlc3Npb24gY29udGV4dC4KKyAqIEBwYXJhbSBkYXRhIFtpbl0gVGhlIGRhdGEgdG8gYmUgY29udmVydGVkLgorICogQHBhcmFtIHNpemUgW2luXSBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEuCisgKiBAcmV0dXJuIEEgYmlnaW50IHJlcHJlc2VudGluZyB0aGlzIGRhdGEuCisgKi8KK2JpZ2ludCAqYmlfaW1wb3J0KEJJX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSkKK3sKKyAgICBiaWdpbnQgKmJpUiA9IGFsbG9jKGN0eCwgKHNpemUrQ09NUF9CWVRFX1NJWkUtMSkvQ09NUF9CWVRFX1NJWkUpOworICAgIGludCBpLCBqID0gMCwgb2Zmc2V0ID0gMDsKKworICAgIG1lbXNldChiaVItPmNvbXBzLCAwLCBiaVItPnNpemUqQ09NUF9CWVRFX1NJWkUpOworCisgICAgZm9yIChpID0gc2l6ZS0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICAgIGJpUi0+Y29tcHNbb2Zmc2V0XSArPSBkYXRhW2ldIDw8IChqKjgpOworCisgICAgICAgIGlmICgrK2ogPT0gQ09NUF9CWVRFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgb2Zmc2V0ICsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRyaW0oYmlSKTsKK30KKworI2lmZGVmIENPTkZJR19TU0xfRlVMTF9NT0RFCisvKioKKyAqIEBicmllZiBUaGUgdGVzdGhhcm5lc3MgdXNlcyB0aGlzIGNvZGUgdG8gaW1wb3J0IHRleHQgaGV4LXN0cmVhbXMgYW5kIAorICogY29udmVydCB0aGVtIGludG8gYmlnaW50cy4KKyAqIEBwYXJhbSBjdHggW2luXSAgVGhlIGJpZ2ludCBzZXNzaW9uIGNvbnRleHQuCisgKiBAcGFyYW0gZGF0YSBbaW5dIEEgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgaGV4IGNoYXJhY3RlcnMuIFRoZSBjaGFyYWN0ZXJzIG11c3QKKyAqIGJlIGluIHVwcGVyIGNhc2UuCisgKiBAcmV0dXJuIEEgYmlnaW50IHJlcHJlc2VudGluZyB0aGlzIGRhdGEuCisgKi8KK2JpZ2ludCAqYmlfc3RyX2ltcG9ydChCSV9DVFggKmN0eCwgY29uc3QgY2hhciAqZGF0YSkKK3sKKyAgICBpbnQgc2l6ZSA9IHN0cmxlbihkYXRhKTsKKyAgICBiaWdpbnQgKmJpUiA9IGFsbG9jKGN0eCwgKHNpemUrQ09NUF9OVU1fTklCQkxFUy0xKS9DT01QX05VTV9OSUJCTEVTKTsKKyAgICBpbnQgaSwgaiA9IDAsIG9mZnNldCA9IDA7CisgICAgbWVtc2V0KGJpUi0+Y29tcHMsIDAsIGJpUi0+c2l6ZSpDT01QX0JZVEVfU0laRSk7CisKKyAgICBmb3IgKGkgPSBzaXplLTE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgICAgaW50IG51bSA9IChkYXRhW2ldIDw9ICc5JykgPyAoZGF0YVtpXSAtICcwJykgOiAoZGF0YVtpXSAtICdBJyArIDEwKTsKKyAgICAgICAgYmlSLT5jb21wc1tvZmZzZXRdICs9IG51bSA8PCAoaio0KTsKKworICAgICAgICBpZiAoKytqID09IENPTVBfTlVNX05JQkJMRVMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgb2Zmc2V0ICsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJpUjsKK30KKwordm9pZCBiaV9wcmludChjb25zdCBjaGFyICpsYWJlbCwgYmlnaW50ICp4KQoreworICAgIGludCBpLCBqOworCisgICAgaWYgKHggPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiJXM6IChudWxsKVxuIiwgbGFiZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJpbnRmKCIlczogKHNpemUgJWQpXG4iLCBsYWJlbCwgeC0+c2l6ZSk7CisgICAgZm9yIChpID0geC0+c2l6ZS0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IENPTVBfTlVNX05JQkJMRVMtMTsgaiA+PSAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbXAgbWFzayA9IDB4MGYgPDwgKGoqNCk7CisgICAgICAgICAgICBjb21wIG51bSA9ICh4LT5jb21wc1tpXSAmIG1hc2spID4+IChqKjQpOworICAgICAgICAgICAgcHV0YygobnVtIDw9IDkpID8gKG51bSArICcwJykgOiAobnVtICsgJ0EnIC0gMTApLCBzdGRvdXQpOworICAgICAgICB9CisgICAgfSAgCisKKyAgICBwcmludGYoIlxuIik7Cit9CisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgVGFrZSBhIGJpZ2ludCBhbmQgY29udmVydCBpdCBpbnRvIGEgYnl0ZSBzZXF1ZW5jZS4gCisgKgorICogVGhpcyBpcyB1c2VmdWwgYWZ0ZXIgYSBkZWNyeXB0IG9wZXJhdGlvbi4KKyAqIEBwYXJhbSBjdHggW2luXSAgVGhlIGJpZ2ludCBzZXNzaW9uIGNvbnRleHQuCisgKiBAcGFyYW0geCBbaW5dICBUaGUgYmlnaW50IHRvIGJlIGNvbnZlcnRlZC4KKyAqIEBwYXJhbSBkYXRhIFtvdXRdIFRoZSBjb252ZXJ0ZWQgZGF0YSBhcyBhIGJ5dGUgc3RyZWFtLgorICogQHBhcmFtIHNpemUgW2luXSBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBieXRlIHN0cmVhbS4gVW51c2VkIGJ5dGVzIHdpbGwgYmUKKyAqIHplcm9lZC4KKyAqLwordm9pZCBiaV9leHBvcnQoQklfQ1RYICpjdHgsIGJpZ2ludCAqeCwgdWludDhfdCAqZGF0YSwgaW50IHNpemUpCit7CisgICAgaW50IGksIGosIGsgPSBzaXplLTE7CisKKyAgICBjaGVjayh4KTsKKyAgICBtZW1zZXQoZGF0YSwgMCwgc2l6ZSk7ICAvKiBlbnN1cmUgYWxsIGxlYWRpbmcgMCdzIGFyZSBjbGVhcmVkICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgeC0+c2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IENPTVBfQllURV9TSVpFOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbXAgbWFzayA9IDB4ZmYgPDwgKGoqOCk7CisgICAgICAgICAgICBpbnQgbnVtID0gKHgtPmNvbXBzW2ldICYgbWFzaykgPj4gKGoqOCk7CisgICAgICAgICAgICBkYXRhW2stLV0gPSBudW07CisKKyAgICAgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJpX2ZyZWUoY3R4LCB4KTsKK30KKworLyoqCisgKiBAYnJpZWYgUHJlLWNhbGN1bGF0ZSBzb21lIG9mIHRoZSBleHBlbnNpdmUgc3RlcHMgaW4gcmVkdWN0aW9uLiAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIChub3JtYWxseSB3aGVuIGEgc2Vzc2lvbiBzdGFydHMpLgorICogV2hlbiB0aGUgc2Vzc2lvbiBpcyBvdmVyLCBiaV9mcmVlX21vZCgpIHNob3VsZCBiZSBjYWxsZWQuIGJpX21vZF9wb3dlcigpCisgKiByZWxpZXMgb24gdGhpcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQuCisgKiBAcGFyYW0gY3R4IFtpbl0gIFRoZSBiaWdpbnQgc2Vzc2lvbiBjb250ZXh0LgorICogQHBhcmFtIGJpbSBbaW5dICBUaGUgYmlnaW50IG1vZHVsdXMgdGhhdCB3aWxsIGJlIHVzZWQuCisgKiBAcGFyYW0gbW9kX29mZnNldCBbaW5dIFRoZXJlIGFyZSB0aHJlZSBtb2R1bHVpaSB0aGF0IGNhbiBiZSBzdG9yZWQgLSB0aGUKKyAqIHN0YW5kYXJkIG1vZHVsdXMsIGFuZCBpdHMgdHdvIHByaW1lcyBwIGFuZCBxLiBUaGlzIG9mZnNldCByZWZlcnMgdG8gd2hpY2gKKyAqIG1vZHVsdXMgd2UgYXJlIHJlZmVycmluZyB0by4KKyAqIEBzZWUgYmlfZnJlZV9tb2QoKSwgYmlfbW9kX3Bvd2VyKCkuCisgKi8KK3ZvaWQgYmlfc2V0X21vZChCSV9DVFggKmN0eCwgYmlnaW50ICpiaW0sIGludCBtb2Rfb2Zmc2V0KQoreworICAgIGludCBrID0gYmltLT5zaXplOworICAgIGNvbXAgZCA9IChjb21wKSgobG9uZ19jb21wKUNPTVBfUkFESVgvKGJpbS0+Y29tcHNbay0xXSsxKSk7CisjaWZkZWYgQ09ORklHX0JJR0lOVF9NT05UR09NRVJZCisgICAgYmlnaW50ICpSLCAqUjI7CisjZW5kaWYKKworICAgIGN0eC0+YmlfbW9kW21vZF9vZmZzZXRdID0gYmltOworICAgIGJpX3Blcm1hbmVudChjdHgtPmJpX21vZFttb2Rfb2Zmc2V0XSk7CisgICAgY3R4LT5iaV9ub3JtYWxpc2VkX21vZFttb2Rfb2Zmc2V0XSA9IGJpX2ludF9tdWx0aXBseShjdHgsIGJpbSwgZCk7CisgICAgYmlfcGVybWFuZW50KGN0eC0+Ymlfbm9ybWFsaXNlZF9tb2RbbW9kX29mZnNldF0pOworCisjaWYgZGVmaW5lZChDT05GSUdfQklHSU5UX01PTlRHT01FUlkpCisgICAgLyogc2V0IG1vbnRnb21lcnkgdmFyaWFibGVzICovCisgICAgUiA9IGNvbXBfbGVmdF9zaGlmdChiaV9jbG9uZShjdHgsIGN0eC0+YmlfcmFkaXgpLCBrLTEpOyAgICAgLyogUiAqLworICAgIFIyID0gY29tcF9sZWZ0X3NoaWZ0KGJpX2Nsb25lKGN0eCwgY3R4LT5iaV9yYWRpeCksIGsqMi0xKTsgIC8qIFJeMiAqLworICAgIGN0eC0+YmlfUlJfbW9kX21bbW9kX29mZnNldF0gPSBiaV9tb2QoY3R4LCBSMik7ICAgICAgICAgICAgIC8qIFJeMiBtb2QgbSAqLworICAgIGN0eC0+YmlfUl9tb2RfbVttb2Rfb2Zmc2V0XSA9IGJpX21vZChjdHgsIFIpOyAgICAgICAgICAgICAgIC8qIFIgbW9kIG0gKi8KKworICAgIGJpX3Blcm1hbmVudChjdHgtPmJpX1JSX21vZF9tW21vZF9vZmZzZXRdKTsKKyAgICBiaV9wZXJtYW5lbnQoY3R4LT5iaV9SX21vZF9tW21vZF9vZmZzZXRdKTsKKworICAgIGN0eC0+TjBfZGFzaFttb2Rfb2Zmc2V0XSA9IG1vZHVsYXJfaW52ZXJzZShjdHgtPmJpX21vZFttb2Rfb2Zmc2V0XSk7CisKKyNlbGlmIGRlZmluZWQgKENPTkZJR19CSUdJTlRfQkFSUkVUVCkKKyAgICBjdHgtPmJpX211W21vZF9vZmZzZXRdID0gCisgICAgICAgIGJpX2RpdmlkZShjdHgsIGNvbXBfbGVmdF9zaGlmdCgKKyAgICAgICAgICAgIGJpX2Nsb25lKGN0eCwgY3R4LT5iaV9yYWRpeCksIGsqMi0xKSwgY3R4LT5iaV9tb2RbbW9kX29mZnNldF0sIDApOworICAgIGJpX3Blcm1hbmVudChjdHgtPmJpX211W21vZF9vZmZzZXRdKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEBicmllZiBVc2VkIHdoZW4gY2xlYW5pbmcgdmFyaW91cyBiaWdpbnRzIGF0IHRoZSBlbmQgb2YgYSBzZXNzaW9uLgorICogQHBhcmFtIGN0eCBbaW5dICBUaGUgYmlnaW50IHNlc3Npb24gY29udGV4dC4KKyAqIEBwYXJhbSBtb2Rfb2Zmc2V0IFtpbl0gVGhlIG9mZnNldCB0byB1c2UuCisgKiBAc2VlIGJpX3NldF9tb2QoKS4KKyAqLwordm9pZCBiaV9mcmVlX21vZChCSV9DVFggKmN0eCwgaW50IG1vZF9vZmZzZXQpCit7CisgICAgYmlfZGVwZXJtYW5lbnQoY3R4LT5iaV9tb2RbbW9kX29mZnNldF0pOworICAgIGJpX2ZyZWUoY3R4LCBjdHgtPmJpX21vZFttb2Rfb2Zmc2V0XSk7CisjaWYgZGVmaW5lZCAoQ09ORklHX0JJR0lOVF9NT05UR09NRVJZKQorICAgIGJpX2RlcGVybWFuZW50KGN0eC0+YmlfUlJfbW9kX21bbW9kX29mZnNldF0pOworICAgIGJpX2RlcGVybWFuZW50KGN0eC0+YmlfUl9tb2RfbVttb2Rfb2Zmc2V0XSk7CisgICAgYmlfZnJlZShjdHgsIGN0eC0+YmlfUlJfbW9kX21bbW9kX29mZnNldF0pOworICAgIGJpX2ZyZWUoY3R4LCBjdHgtPmJpX1JfbW9kX21bbW9kX29mZnNldF0pOworI2VsaWYgZGVmaW5lZChDT05GSUdfQklHSU5UX0JBUlJFVFQpCisgICAgYmlfZGVwZXJtYW5lbnQoY3R4LT5iaV9tdVttb2Rfb2Zmc2V0XSk7IAorICAgIGJpX2ZyZWUoY3R4LCBjdHgtPmJpX211W21vZF9vZmZzZXRdKTsKKyNlbmRpZgorICAgIGJpX2RlcGVybWFuZW50KGN0eC0+Ymlfbm9ybWFsaXNlZF9tb2RbbW9kX29mZnNldF0pOyAKKyAgICBiaV9mcmVlKGN0eCwgY3R4LT5iaV9ub3JtYWxpc2VkX21vZFttb2Rfb2Zmc2V0XSk7Cit9CisKKy8qKiAKKyAqIFBlcmZvcm0gYSBzdGFuZGFyZCBtdWx0aXBsaWNhdGlvbiBiZXR3ZWVuIHR3byBiaWdpbnRzLgorICovCitzdGF0aWMgYmlnaW50ICpyZWd1bGFyX211bHRpcGx5KEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpYSwgYmlnaW50ICpiaWIpCit7CisgICAgaW50IGksIGosIGlfcGx1c19qOworICAgIGludCBuID0gYmlhLT5zaXplOyAKKyAgICBpbnQgdCA9IGJpYi0+c2l6ZTsKKyAgICBiaWdpbnQgKmJpUiA9IGFsbG9jKGN0eCwgbiArIHQpOworICAgIGNvbXAgKnNyID0gYmlSLT5jb21wczsKKyAgICBjb21wICpzYSA9IGJpYS0+Y29tcHM7CisgICAgY29tcCAqc2IgPSBiaWItPmNvbXBzOworCisgICAgY2hlY2soYmlhKTsKKyAgICBjaGVjayhiaWIpOworCisgICAgLyogY2xlYXIgdGhpbmdzIHRvIHN0YXJ0IHdpdGggKi8KKyAgICBtZW1zZXQoYmlSLT5jb21wcywgMCwgKChuK3QpKkNPTVBfQllURV9TSVpFKSk7CisgICAgaSA9IDA7CisKKyAgICBkbyAKKyAgICB7CisgICAgICAgIGNvbXAgY2FycnkgPSAwOworICAgICAgICBjb21wIGIgPSAqc2IrKzsKKyAgICAgICAgaV9wbHVzX2ogPSBpOworICAgICAgICBqID0gMDsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBsb25nX2NvbXAgdG1wID0gc3JbaV9wbHVzX2pdICsgKGxvbmdfY29tcClzYVtqXSpiICsgY2Fycnk7CisgICAgICAgICAgICBzcltpX3BsdXNfaisrXSA9IChjb21wKXRtcDsgICAgICAgICAgICAgIC8qIGRvd25zaXplICovCisgICAgICAgICAgICBjYXJyeSA9IChjb21wKSh0bXAgPj4gQ09NUF9CSVRfU0laRSk7CisgICAgICAgIH0gd2hpbGUgKCsraiA8IG4pOworCisgICAgICAgIHNyW2lfcGx1c19qXSA9IGNhcnJ5OworICAgIH0gd2hpbGUgKCsraSA8IHQpOworCisgICAgYmlfZnJlZShjdHgsIGJpYSk7CisgICAgYmlfZnJlZShjdHgsIGJpYik7CisgICAgcmV0dXJuIHRyaW0oYmlSKTsKK30KKworI2lmZGVmIENPTkZJR19CSUdJTlRfS0FSQVRTVUJBCisvKgorICogS2FyYXRzdWJhIGltcHJvdmVzIG9uIHJlZ3VsYXIgbXVsdGlwbGljYXRpb24gZHVlIHRvIG9ubHkgMyBtdWx0aXBsaWNhdGlvbnMgCisgKiBiZWluZyBkb25lIGluc3RlYWQgb2YgNC4gVGhlIGFkZGl0aW9uYWwgYWRkaXRpb25zL3N1YnRyYWN0aW9ucyBhcmUgTyhOKSAKKyAqIHJhdGhlciB0aGFuIE8oTl4yKSBhbmQgc28gZm9yIGJpZyBudW1iZXJzIGl0IHNhdmVzIG9uIGEgZmV3IG9wZXJhdGlvbnMgCisgKi8KK3N0YXRpYyBiaWdpbnQgKmthcmF0c3ViYShCSV9DVFggKmN0eCwgYmlnaW50ICpiaWEsIGJpZ2ludCAqYmliLCBpbnQgaXNfc3F1YXJlKQoreworICAgIGJpZ2ludCAqeDAsICp4MTsKKyAgICBiaWdpbnQgKnAwLCAqcDEsICpwMjsKKyAgICBpbnQgbTsKKworICAgIGlmIChpc19zcXVhcmUpCisgICAgeworICAgICAgICBtID0gKGJpYS0+c2l6ZSArIDEpLzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG0gPSAobWF4KGJpYS0+c2l6ZSwgYmliLT5zaXplKSArIDEpLzI7CisgICAgfQorCisgICAgeDAgPSBiaV9jbG9uZShjdHgsIGJpYSk7CisgICAgeDAtPnNpemUgPSBtOworICAgIHgxID0gYmlfY2xvbmUoY3R4LCBiaWEpOworICAgIGNvbXBfcmlnaHRfc2hpZnQoeDEsIG0pOworICAgIGJpX2ZyZWUoY3R4LCBiaWEpOworCisgICAgLyogd29yayBvdXQgdGhlIDMgcGFydGlhbCBwcm9kdWN0cyAqLworICAgIGlmIChpc19zcXVhcmUpCisgICAgeworICAgICAgICBwMCA9IGJpX3NxdWFyZShjdHgsIGJpX2NvcHkoeDApKTsKKyAgICAgICAgcDIgPSBiaV9zcXVhcmUoY3R4LCBiaV9jb3B5KHgxKSk7CisgICAgICAgIHAxID0gYmlfc3F1YXJlKGN0eCwgYmlfYWRkKGN0eCwgeDAsIHgxKSk7CisgICAgfQorICAgIGVsc2UgLyogbm9ybWFsIG11bHRpcGx5ICovCisgICAgeworICAgICAgICBiaWdpbnQgKnkwLCAqeTE7CisgICAgICAgIHkwID0gYmlfY2xvbmUoY3R4LCBiaWIpOworICAgICAgICB5MC0+c2l6ZSA9IG07CisgICAgICAgIHkxID0gYmlfY2xvbmUoY3R4LCBiaWIpOworICAgICAgICBjb21wX3JpZ2h0X3NoaWZ0KHkxLCBtKTsKKyAgICAgICAgYmlfZnJlZShjdHgsIGJpYik7CisKKyAgICAgICAgcDAgPSBiaV9tdWx0aXBseShjdHgsIGJpX2NvcHkoeDApLCBiaV9jb3B5KHkwKSk7CisgICAgICAgIHAyID0gYmlfbXVsdGlwbHkoY3R4LCBiaV9jb3B5KHgxKSwgYmlfY29weSh5MSkpOworICAgICAgICBwMSA9IGJpX211bHRpcGx5KGN0eCwgYmlfYWRkKGN0eCwgeDAsIHgxKSwgYmlfYWRkKGN0eCwgeTAsIHkxKSk7CisgICAgfQorCisgICAgcDEgPSBiaV9zdWJ0cmFjdChjdHgsIAorICAgICAgICAgICAgYmlfc3VidHJhY3QoY3R4LCBwMSwgYmlfY29weShwMiksIE5VTEwpLCBiaV9jb3B5KHAwKSwgTlVMTCk7CisKKyAgICBjb21wX2xlZnRfc2hpZnQocDEsIG0pOworICAgIGNvbXBfbGVmdF9zaGlmdChwMiwgMiptKTsKKyAgICByZXR1cm4gYmlfYWRkKGN0eCwgcDEsIGJpX2FkZChjdHgsIHAwLCBwMikpOworfQorI2VuZGlmCisKKy8qKgorICogQGJyaWVmIFBlcmZvcm0gYSBtdWx0aXBsaWNhdGlvbiBvcGVyYXRpb24gYmV0d2VlbiB0d28gYmlnaW50cy4KKyAqIEBwYXJhbSBjdHggW2luXSAgVGhlIGJpZ2ludCBzZXNzaW9uIGNvbnRleHQuCisgKiBAcGFyYW0gYmlhIFtpbl0gIEEgYmlnaW50LgorICogQHBhcmFtIGJpYiBbaW5dICBBbm90aGVyIGJpZ2ludC4KKyAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgbXVsdGlwbGljYXRpb24uCisgKi8KK2JpZ2ludCAqYmlfbXVsdGlwbHkoQklfQ1RYICpjdHgsIGJpZ2ludCAqYmlhLCBiaWdpbnQgKmJpYikKK3sKKyAgICBjaGVjayhiaWEpOworICAgIGNoZWNrKGJpYik7CisKKyNpZmRlZiBDT05GSUdfQklHSU5UX0tBUkFUU1VCQQorICAgIGlmIChtaW4oYmlhLT5zaXplLCBiaWItPnNpemUpIDwgTVVMX0tBUkFUU1VCQV9USFJFU0gpCisgICAgeworICAgICAgICByZXR1cm4gcmVndWxhcl9tdWx0aXBseShjdHgsIGJpYSwgYmliKTsKKyAgICB9CisKKyAgICByZXR1cm4ga2FyYXRzdWJhKGN0eCwgYmlhLCBiaWIsIDApOworI2Vsc2UKKyAgICByZXR1cm4gcmVndWxhcl9tdWx0aXBseShjdHgsIGJpYSwgYmliKTsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX0JJR0lOVF9TUVVBUkUKKy8qCisgKiBQZXJmb3JtIHRoZSBhY3R1YWwgc3F1YXJlIG9wZXJpb24uIEl0IHRha2VzIGludG8gYWNjb3VudCBvdmVyZmxvdy4KKyAqLworc3RhdGljIGJpZ2ludCAqcmVndWxhcl9zcXVhcmUoQklfQ1RYICpjdHgsIGJpZ2ludCAqYmkpCit7CisgICAgaW50IHQgPSBiaS0+c2l6ZTsKKyAgICBpbnQgaSA9IDAsIGo7CisgICAgYmlnaW50ICpiaVIgPSBhbGxvYyhjdHgsIHQqMik7CisgICAgY29tcCAqdyA9IGJpUi0+Y29tcHM7CisgICAgY29tcCAqeCA9IGJpLT5jb21wczsKKyAgICBjb21wIGNhcnJ5OworCisgICAgbWVtc2V0KHcsIDAsIGJpUi0+c2l6ZSpDT01QX0JZVEVfU0laRSk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgbG9uZ19jb21wIHRtcCA9IHdbMippXSArIChsb25nX2NvbXApeFtpXSp4W2ldOworICAgICAgICBjb21wIHUgPSAwOworICAgICAgICB3WzIqaV0gPSAoY29tcCl0bXA7CisgICAgICAgIGNhcnJ5ID0gKGNvbXApKHRtcCA+PiBDT01QX0JJVF9TSVpFKTsKKworICAgICAgICBmb3IgKGogPSBpKzE7IGogPCB0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmdfY29tcCB4eCA9IChsb25nX2NvbXApeFtpXSp4W2pdOworICAgICAgICAgICAgbG9uZ19jb21wIGJsb2IgPSAobG9uZ19jb21wKXdbaStqXStjYXJyeTsKKworICAgICAgICAgICAgaWYgKHUpICAgICAgICAgICAgICAgICAgLyogcHJldmlvdXMgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBibG9iICs9IENPTVBfUkFESVg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHUgPSAwOworICAgICAgICAgICAgaWYgKHh4ICYgQ09NUF9CSUdfTVNCKSAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcCA9IDIqeHggKyBibG9iOworICAgICAgICAgICAgd1tpK2pdID0gKGNvbXApdG1wOworICAgICAgICAgICAgY2FycnkgPSAoY29tcCkodG1wID4+IENPTVBfQklUX1NJWkUpOworICAgICAgICB9CisKKyAgICAgICAgd1tpK3RdICs9IGNhcnJ5OworCisgICAgICAgIGlmICh1KQorICAgICAgICB7CisgICAgICAgICAgICB3W2krdCsxXSA9IDE7ICAgLyogYWRkIGNhcnJ5ICovCisgICAgICAgIH0KKyAgICB9IHdoaWxlICgrK2kgPCB0KTsKKworICAgIGJpX2ZyZWUoY3R4LCBiaSk7CisgICAgcmV0dXJuIHRyaW0oYmlSKTsKK30KKworLyoqCisgKiBAYnJpZWYgUGVyZm9ybSBhIHNxdWFyZSBvcGVyYXRpb24gb24gYSBiaWdpbnQuCisgKiBAcGFyYW0gY3R4IFtpbl0gIFRoZSBiaWdpbnQgc2Vzc2lvbiBjb250ZXh0LgorICogQHBhcmFtIGJpYSBbaW5dICBBIGJpZ2ludC4KKyAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgbXVsdGlwbGljYXRpb24uCisgKi8KK2JpZ2ludCAqYmlfc3F1YXJlKEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpYSkKK3sKKyAgICBjaGVjayhiaWEpOworCisjaWZkZWYgQ09ORklHX0JJR0lOVF9LQVJBVFNVQkEKKyAgICBpZiAoYmlhLT5zaXplIDwgU1FVX0tBUkFUU1VCQV9USFJFU0gpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlZ3VsYXJfc3F1YXJlKGN0eCwgYmlhKTsKKyAgICB9CisKKyAgICByZXR1cm4ga2FyYXRzdWJhKGN0eCwgYmlhLCBOVUxMLCAxKTsKKyNlbHNlCisgICAgcmV0dXJuIHJlZ3VsYXJfc3F1YXJlKGN0eCwgYmlhKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKgorICogQGJyaWVmIENvbXBhcmUgdHdvIGJpZ2ludHMuCisgKiBAcGFyYW0gYmlhIFtpbl0gIEEgYmlnaW50LgorICogQHBhcmFtIGJpYiBbaW5dICBBbm90aGVyIGJpZ2ludC4KKyAqIEByZXR1cm4gLTEgaWYgc21hbGxlciwgMSBpZiBsYXJnZXIgYW5kIDAgaWYgZXF1YWwuCisgKi8KK2ludCBiaV9jb21wYXJlKGJpZ2ludCAqYmlhLCBiaWdpbnQgKmJpYikKK3sKKyAgICBpbnQgciwgaTsKKworICAgIGNoZWNrKGJpYSk7CisgICAgY2hlY2soYmliKTsKKworICAgIGlmIChiaWEtPnNpemUgPiBiaWItPnNpemUpCisgICAgICAgIHIgPSAxOworICAgIGVsc2UgaWYgKGJpYS0+c2l6ZSA8IGJpYi0+c2l6ZSkKKyAgICAgICAgciA9IC0xOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvbXAgKmEgPSBiaWEtPmNvbXBzOyAKKyAgICAgICAgY29tcCAqYiA9IGJpYi0+Y29tcHM7IAorCisgICAgICAgIC8qIFNhbWUgbnVtYmVyIG9mIGNvbXBvbmVudHMuICBDb21wYXJlIHN0YXJ0aW5nIGZyb20gdGhlIGhpZ2ggZW5kCisgICAgICAgICAqIGFuZCB3b3JraW5nIGRvd24uICovCisgICAgICAgIHIgPSAwOworICAgICAgICBpID0gYmlhLT5zaXplIC0gMTsKKworICAgICAgICBkbyAKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFbaV0gPiBiW2ldKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICByID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhW2ldIDwgYltpXSkKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgciA9IC0xOworICAgICAgICAgICAgICAgIGJyZWFrOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoLS1pID49IDApOworICAgIH0KKworICAgIHJldHVybiByOworfQorCisvKgorICogQWxsb2NhdGUgYW5kIHplcm8gbW9yZSBjb21wb25lbnRzLiAgRG9lcyBub3QgY29uc3VtZSBiaS4gCisgKi8KK3N0YXRpYyB2b2lkIG1vcmVfY29tcHMoYmlnaW50ICpiaSwgaW50IG4pCit7CisgICAgaWYgKG4gPiBiaS0+bWF4X2NvbXBzKQorICAgIHsKKyAgICAgICAgYmktPm1heF9jb21wcyA9IG1heChiaS0+bWF4X2NvbXBzICogMiwgbik7CisgICAgICAgIGJpLT5jb21wcyA9IChjb21wKilyZWFsbG9jKGJpLT5jb21wcywgYmktPm1heF9jb21wcyAqIENPTVBfQllURV9TSVpFKTsKKyAgICB9CisKKyAgICBpZiAobiA+IGJpLT5zaXplKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZiaS0+Y29tcHNbYmktPnNpemVdLCAwLCAobi1iaS0+c2l6ZSkqQ09NUF9CWVRFX1NJWkUpOworICAgIH0KKworICAgIGJpLT5zaXplID0gbjsKK30KKworLyoKKyAqIE1ha2UgYSBuZXcgZW1wdHkgYmlnaW50LiBJdCBtYXkganVzdCB1c2UgYW4gb2xkIG9uZSBpZiBvbmUgaXMgYXZhaWxhYmxlLgorICogT3RoZXJ3aXNlIGdldCBvbmUgb2ZmIHRoZSBoZWFwLgorICovCitzdGF0aWMgYmlnaW50ICphbGxvYyhCSV9DVFggKmN0eCwgaW50IHNpemUpCit7CisgICAgYmlnaW50ICpiaVI7CisKKyAgICAvKiBDYW4gd2UgcmVjeWNsZSBhbiBvbGQgYmlnaW50PyAqLworICAgIGlmIChjdHgtPmZyZWVfbGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmlSID0gY3R4LT5mcmVlX2xpc3Q7CisgICAgICAgIGN0eC0+ZnJlZV9saXN0ID0gYmlSLT5uZXh0OworICAgICAgICBjdHgtPmZyZWVfY291bnQtLTsKKworICAgICAgICBpZiAoYmlSLT5yZWZzICE9IDApCisgICAgICAgIHsKKyNpZmRlZiBDT05GSUdfU1NMX0ZVTExfTU9ERQorICAgICAgICAgICAgcHJpbnRmKCJhbGxvYzogcmVmcyB3YXMgbm90IDBcbiIpOworI2VuZGlmCisgICAgICAgICAgICBhYm9ydCgpOyAgICAvKiBjcmVhdGUgYSBzdGFjayB0cmFjZSBmcm9tIGEgY29yZSBkdW1wICovCisgICAgICAgIH0KKworICAgICAgICBtb3JlX2NvbXBzKGJpUiwgc2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIE5vIGZyZWUgYmlnaW50cyBhdmFpbGFibGUgLSBjcmVhdGUgYSBuZXcgb25lLiAqLworICAgICAgICBiaVIgPSAoYmlnaW50ICopbWFsbG9jKHNpemVvZihiaWdpbnQpKTsKKyAgICAgICAgYmlSLT5jb21wcyA9IChjb21wKiltYWxsb2Moc2l6ZSAqIENPTVBfQllURV9TSVpFKTsKKyAgICAgICAgYmlSLT5tYXhfY29tcHMgPSBzaXplOyAgLyogZ2l2ZSBzb21lIHNwYWNlIHRvIHNwYXJlICovCisgICAgfQorCisgICAgYmlSLT5zaXplID0gc2l6ZTsKKyAgICBiaVItPnJlZnMgPSAxOworICAgIGJpUi0+bmV4dCA9IE5VTEw7CisgICAgY3R4LT5hY3RpdmVfY291bnQrKzsKKyAgICByZXR1cm4gYmlSOworfQorCisvKgorICogV29yayBvdXQgdGhlIGhpZ2hlc3QgJzEnIGJpdCBpbiBhbiBleHBvbmVudC4gVXNlZCB3aGVuIGRvaW5nIHNsaWRpbmctd2luZG93CisgKiBleHBvbmVudGlhdGlvbi4KKyAqLworc3RhdGljIGludCBmaW5kX21heF9leHBfaW5kZXgoYmlnaW50ICpiaWV4cCkKK3sKKyAgICBpbnQgaSA9IENPTVBfQklUX1NJWkUtMTsKKyAgICBjb21wIHNoaWZ0ID0gQ09NUF9SQURJWC8yOworICAgIGNvbXAgdGVzdCA9IGJpZXhwLT5jb21wc1tiaWV4cC0+c2l6ZS0xXTsgICAgLyogYXNzdW1lIG5vIGxlYWRpbmcgemVyb2VzICovCisKKyAgICBjaGVjayhiaWV4cCk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYgKHRlc3QgJiBzaGlmdCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGkrKGJpZXhwLT5zaXplLTEpKkNPTVBfQklUX1NJWkU7CisgICAgICAgIH0KKworICAgICAgICBzaGlmdCA+Pj0gMTsKKyAgICB9IHdoaWxlICgtLWkgIT0gMCk7CisKKyAgICByZXR1cm4gLTE7ICAgICAgLyogZXJyb3IgLSBtdXN0IGhhdmUgYmVlbiBhIGxlYWRpbmcgMCAqLworfQorCisvKgorICogSXMgYSBwYXJ0aWN1bGFyIGJpdCBpcyBhbiBleHBvbmVudCAxIG9yIDA/IFVzZWQgd2hlbiBkb2luZyBzbGlkaW5nLXdpbmRvdworICogZXhwb25lbnRpYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgZXhwX2JpdF9pc19vbmUoYmlnaW50ICpiaWV4cCwgaW50IG9mZnNldCkKK3sKKyAgICBjb21wIHRlc3QgPSBiaWV4cC0+Y29tcHNbb2Zmc2V0IC8gQ09NUF9CSVRfU0laRV07CisgICAgaW50IG51bV9zaGlmdHMgPSBvZmZzZXQgJSBDT01QX0JJVF9TSVpFOworICAgIGNvbXAgc2hpZnQgPSAxOworICAgIGludCBpOworCisgICAgY2hlY2soYmlleHApOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zaGlmdHM7IGkrKykKKyAgICB7CisgICAgICAgIHNoaWZ0IDw8PSAxOworICAgIH0KKworICAgIHJldHVybiB0ZXN0ICYgc2hpZnQ7Cit9CisKKyNpZmRlZiBDT05GSUdfQklHSU5UX0NIRUNLX09OCisvKgorICogUGVyZm9ybSBhIHNhbml0eSBjaGVjayBvbiBiaS4KKyAqLworc3RhdGljIHZvaWQgY2hlY2soY29uc3QgYmlnaW50ICpiaSkKK3sKKyAgICBpZiAoYmktPnJlZnMgPD0gMCkKKyAgICB7CisgICAgICAgIHByaW50ZigiY2hlY2s6IHplcm8gb3IgbmVnYXRpdmUgcmVmcyBpbiBiaWdpbnRcbiIpOworICAgICAgICBhYm9ydCgpOworICAgIH0KKworICAgIGlmIChiaS0+bmV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJjaGVjazogYXR0ZW1wdCB0byB1c2UgYSBiaWdpbnQgZnJvbSAiCisgICAgICAgICAgICAgICAgInRoZSBmcmVlIGxpc3RcbiIpOworICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogRGVsZXRlIGFueSBsZWFkaW5nIDAncyAoYW5kIGFsbG93IGZvciAwKS4KKyAqLworc3RhdGljIGJpZ2ludCAqdHJpbShiaWdpbnQgKmJpKQoreworICAgIGNoZWNrKGJpKTsKKworICAgIHdoaWxlIChiaS0+Y29tcHNbYmktPnNpemUtMV0gPT0gMCAmJiBiaS0+c2l6ZSA+IDEpCisgICAgeworICAgICAgICBiaS0+c2l6ZS0tOworICAgIH0KKworICAgIHJldHVybiBiaTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0JJR0lOVF9NT05UR09NRVJZKQorLyoqCisgKiBAYnJpZWYgUGVyZm9ybSBhIHNpbmdsZSBtb250Z29tZXJ5IHJlZHVjdGlvbi4KKyAqIEBwYXJhbSBjdHggW2luXSAgVGhlIGJpZ2ludCBzZXNzaW9uIGNvbnRleHQuCisgKiBAcGFyYW0gYml4eSBbaW5dICBBIGJpZ2ludC4KKyAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgbW9udGdvbWVyeSByZWR1Y3Rpb24uCisgKi8KK2JpZ2ludCAqYmlfbW9udChCSV9DVFggKmN0eCwgYmlnaW50ICpiaXh5KQoreworICAgIGludCBpID0gMCwgbjsKKyAgICB1aW50OF90IG1vZF9vZmZzZXQgPSBjdHgtPm1vZF9vZmZzZXQ7CisgICAgYmlnaW50ICpiaW0gPSBjdHgtPmJpX21vZFttb2Rfb2Zmc2V0XTsKKyAgICBjb21wIG1vZF9pbnYgPSBjdHgtPk4wX2Rhc2hbbW9kX29mZnNldF07CisKKyAgICBjaGVjayhiaXh5KTsKKworICAgIGlmIChjdHgtPnVzZV9jbGFzc2ljYWwpICAgICAvKiBqdXN0IHVzZSBjbGFzc2ljYWwgaW5zdGVhZCAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIGJpX21vZChjdHgsIGJpeHkpOworICAgIH0KKworICAgIG4gPSBiaW0tPnNpemU7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgYml4eSA9IGJpX2FkZChjdHgsIGJpeHksIGNvbXBfbGVmdF9zaGlmdCgKKyAgICAgICAgICAgICAgICAgICAgYmlfaW50X211bHRpcGx5KGN0eCwgYmltLCBiaXh5LT5jb21wc1tpXSptb2RfaW52KSwgaSkpOworICAgIH0gd2hpbGUgKCsraSA8IG4pOworCisgICAgY29tcF9yaWdodF9zaGlmdChiaXh5LCBuKTsKKworICAgIGlmIChiaV9jb21wYXJlKGJpeHksIGJpbSkgPj0gMCkKKyAgICB7CisgICAgICAgIGJpeHkgPSBiaV9zdWJ0cmFjdChjdHgsIGJpeHksIGJpbSwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIGJpeHk7Cit9CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JJR0lOVF9CQVJSRVRUKQorLyoKKyAqIFN0b21wIG9uIHRoZSBtb3N0IHNpZ25pZmljYW50IGNvbXBvbmVudHMgdG8gZ2l2ZSB0aGUgaWxsdXNpb24gb2YgYSAibW9kIGJhc2UKKyAqIHJhZGl4IiBvcGVyYXRpb24gCisgKi8KK3N0YXRpYyBiaWdpbnQgKmNvbXBfbW9kKGJpZ2ludCAqYmksIGludCBtb2QpCit7CisgICAgY2hlY2soYmkpOworCisgICAgaWYgKGJpLT5zaXplID4gbW9kKQorICAgIHsKKyAgICAgICAgYmktPnNpemUgPSBtb2Q7CisgICAgfQorCisgICAgcmV0dXJuIGJpOworfQorCisvKgorICogQmFycmV0dCByZWR1Y3Rpb24gaGFzIG5vIG5lZWQgZm9yIHNvbWUgcGFydHMgb2YgdGhlIHByb2R1Y3QsIHNvIGlnbm9yZSBiaXRzCisgKiBvZiB0aGUgbXVsdGlwbHkuIFRoaXMgcm91dGluZSBnaXZlcyBCYXJyZXR0IGl0cyBiaWcgcGVyZm9ybWFuY2UKKyAqIGltcHJvdmVtZW50cyBvdmVyIENsYXNzaWNhbC9Nb250Z29tZXJ5IHJlZHVjdGlvbiBtZXRob2RzLiAKKyAqLworc3RhdGljIGJpZ2ludCAqcGFydGlhbF9tdWx0aXBseShCSV9DVFggKmN0eCwgYmlnaW50ICpiaWEsIGJpZ2ludCAqYmliLCAKKyAgICAgICAgaW50IGlubmVyX3BhcnRpYWwsIGludCBvdXRlcl9wYXJ0aWFsKQoreworICAgIGludCBpID0gMCwgaiwgbiA9IGJpYS0+c2l6ZSwgdCA9IGJpYi0+c2l6ZTsKKyAgICBiaWdpbnQgKmJpUjsKKyAgICBjb21wIGNhcnJ5OworICAgIGNvbXAgKnNyLCAqc2EsICpzYjsKKworICAgIGNoZWNrKGJpYSk7CisgICAgY2hlY2soYmliKTsKKworICAgIGJpUiA9IGFsbG9jKGN0eCwgbiArIHQpOworICAgIHNhID0gYmlhLT5jb21wczsKKyAgICBzYiA9IGJpYi0+Y29tcHM7CisgICAgc3IgPSBiaVItPmNvbXBzOworCisgICAgaWYgKGlubmVyX3BhcnRpYWwpCisgICAgeworICAgICAgICBtZW1zZXQoc3IsIDAsIGlubmVyX3BhcnRpYWwqQ09NUF9CWVRFX1NJWkUpOyAKKyAgICB9CisgICAgZWxzZSAgICAvKiBvdXRlciBwYXJ0aWFsICovCisgICAgeworICAgICAgICBpZiAobiA8IG91dGVyX3BhcnRpYWwgfHwgdCA8IG91dGVyX3BhcnRpYWwpIC8qIHNob3VsZCB3ZSBib3RoZXI/ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpX2ZyZWUoY3R4LCBiaWEpOworICAgICAgICAgICAgYmlfZnJlZShjdHgsIGJpYik7CisgICAgICAgICAgICBiaVItPmNvbXBzWzBdID0gMDsgICAgICAvKiByZXR1cm4gMCAqLworICAgICAgICAgICAgYmlSLT5zaXplID0gMTsKKyAgICAgICAgICAgIHJldHVybiBiaVI7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJnNyW291dGVyX3BhcnRpYWxdLCAwLCAobit0LW91dGVyX3BhcnRpYWwpKkNPTVBfQllURV9TSVpFKTsKKyAgICB9CisKKyAgICBkbyAKKyAgICB7CisgICAgICAgIGNvbXAgKmEgPSBzYTsKKyAgICAgICAgY29tcCBiID0gKnNiKys7CisgICAgICAgIGxvbmdfY29tcCB0bXA7CisgICAgICAgIGludCBpX3BsdXNfaiA9IGk7CisgICAgICAgIGNhcnJ5ID0gMDsKKyAgICAgICAgaiA9IG47CisKKyAgICAgICAgaWYgKG91dGVyX3BhcnRpYWwgJiYgaV9wbHVzX2ogPCBvdXRlcl9wYXJ0aWFsKQorICAgICAgICB7CisgICAgICAgICAgICBpX3BsdXNfaiA9IG91dGVyX3BhcnRpYWw7CisgICAgICAgICAgICBhID0gJnNhW291dGVyX3BhcnRpYWwtaV07CisgICAgICAgICAgICBqID0gbi0ob3V0ZXJfcGFydGlhbC1pKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbm5lcl9wYXJ0aWFsICYmIGlfcGx1c19qID49IGlubmVyX3BhcnRpYWwpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bXAgPSBzcltpX3BsdXNfal0gKyAoKGxvbmdfY29tcCkqYSsrKSpiICsgY2Fycnk7CisgICAgICAgICAgICBzcltpX3BsdXNfaisrXSA9IChjb21wKXRtcDsgICAgICAgICAgICAgIC8qIGRvd25zaXplICovCisgICAgICAgICAgICBjYXJyeSA9IChjb21wKSh0bXAgPj4gQ09NUF9CSVRfU0laRSk7CisgICAgICAgIH0gd2hpbGUgKC0taiAhPSAwKTsKKworICAgICAgICBzcltpX3BsdXNfal0gPSBjYXJyeTsKKyAgICB9IHdoaWxlICgrK2kgPCB0KTsKKworICAgIGJpX2ZyZWUoY3R4LCBiaWEpOworICAgIGJpX2ZyZWUoY3R4LCBiaWIpOworICAgIHJldHVybiB0cmltKGJpUik7Cit9CisKKy8qKgorICogQGJyaWVmIFBlcmZvcm0gYSBzaW5nbGUgQmFycmV0dCByZWR1Y3Rpb24uCisgKiBAcGFyYW0gY3R4IFtpbl0gIFRoZSBiaWdpbnQgc2Vzc2lvbiBjb250ZXh0LgorICogQHBhcmFtIGJpIFtpbl0gIEEgYmlnaW50LgorICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBCYXJyZXR0IHJlZHVjdGlvbi4KKyAqLworYmlnaW50ICpiaV9iYXJyZXR0KEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpKQoreworICAgIGJpZ2ludCAqcTEsICpxMiwgKnEzLCAqcjEsICpyMiwgKnI7CisgICAgdWludDhfdCBtb2Rfb2Zmc2V0ID0gY3R4LT5tb2Rfb2Zmc2V0OworICAgIGJpZ2ludCAqYmltID0gY3R4LT5iaV9tb2RbbW9kX29mZnNldF07CisgICAgaW50IGsgPSBiaW0tPnNpemU7CisKKyAgICBjaGVjayhiaSk7CisgICAgY2hlY2soYmltKTsKKworICAgIC8qIHVzZSBDbGFzc2ljYWwgbWV0aG9kIGluc3RlYWQgIC0gQmFycmV0dCBjYW5ub3QgaGVscCBoZXJlICovCisgICAgaWYgKGJpLT5zaXplID4gayoyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJpX21vZChjdHgsIGJpKTsKKyAgICB9CisKKyAgICBxMSA9IGNvbXBfcmlnaHRfc2hpZnQoYmlfY2xvbmUoY3R4LCBiaSksIGstMSk7CisKKyAgICAvKiBkbyBvdXRlciBwYXJ0aWFsIG11bHRpcGx5ICovCisgICAgcTIgPSBwYXJ0aWFsX211bHRpcGx5KGN0eCwgcTEsIGN0eC0+YmlfbXVbbW9kX29mZnNldF0sIDAsIGstMSk7IAorICAgIHEzID0gY29tcF9yaWdodF9zaGlmdChxMiwgaysxKTsKKyAgICByMSA9IGNvbXBfbW9kKGJpLCBrKzEpOworCisgICAgLyogZG8gaW5uZXIgcGFydGlhbCBtdWx0aXBseSAqLworICAgIHIyID0gY29tcF9tb2QocGFydGlhbF9tdWx0aXBseShjdHgsIHEzLCBiaW0sIGsrMSwgMCksIGsrMSk7CisgICAgciA9IGJpX3N1YnRyYWN0KGN0eCwgcjEsIHIyLCBOVUxMKTsKKworICAgIC8qIGlmIChyID49IG0pIHIgPSByIC0gbTsgKi8KKyAgICBpZiAoYmlfY29tcGFyZShyLCBiaW0pID49IDApCisgICAgeworICAgICAgICByID0gYmlfc3VidHJhY3QoY3R4LCByLCBiaW0sIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiByOworfQorI2VuZGlmIC8qIENPTkZJR19CSUdJTlRfQkFSUkVUVCAqLworCisjaWZkZWYgQ09ORklHX0JJR0lOVF9TTElESU5HX1dJTkRPVworLyoKKyAqIFdvcmsgb3V0IGcxLCBnMywgZzUsIGc3Li4uIGV0YyBmb3IgdGhlIHNsaWRpbmctd2luZG93IGFsZ29yaXRobSAKKyAqLworc3RhdGljIHZvaWQgcHJlY29tcHV0ZV9zbGlkZV93aW5kb3coQklfQ1RYICpjdHgsIGludCB3aW5kb3csIGJpZ2ludCAqZzEpCit7CisgICAgaW50IGsgPSAxLCBpOworICAgIGJpZ2ludCAqZzI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2luZG93LTE7IGkrKykgICAvKiBjb21wdXRlIDJeKHdpbmRvdy0xKSAqLworICAgIHsKKyAgICAgICAgayA8PD0gMTsKKyAgICB9CisKKyAgICBjdHgtPmcgPSAoYmlnaW50ICoqKW1hbGxvYyhrKnNpemVvZihiaWdpbnQgKikpOworICAgIGN0eC0+Z1swXSA9IGJpX2Nsb25lKGN0eCwgZzEpOworICAgIGJpX3Blcm1hbmVudChjdHgtPmdbMF0pOworICAgIGcyID0gYmlfcmVzaWR1ZShjdHgsIGJpX3NxdWFyZShjdHgsIGN0eC0+Z1swXSkpOyAgIC8qIGdeMiAqLworCisgICAgZm9yIChpID0gMTsgaSA8IGs7IGkrKykKKyAgICB7CisgICAgICAgIGN0eC0+Z1tpXSA9IGJpX3Jlc2lkdWUoY3R4LCBiaV9tdWx0aXBseShjdHgsIGN0eC0+Z1tpLTFdLCBiaV9jb3B5KGcyKSkpOworICAgICAgICBiaV9wZXJtYW5lbnQoY3R4LT5nW2ldKTsKKyAgICB9CisKKyAgICBiaV9mcmVlKGN0eCwgZzIpOworICAgIGN0eC0+d2luZG93ID0gazsKK30KKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBQZXJmb3JtIGEgbW9kdWxhciBleHBvbmVudGlhdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGJpX3NldF9tb2QoKSB0byBoYXZlIGJlZW4gY2FsbGVkIHByZXZpb3VzbHkuIFRoaXMgaXMgCisgKiBvbmUgb2YgdGhlIG9wdGltaXNhdGlvbnMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuCisgKiBAcGFyYW0gY3R4IFtpbl0gIFRoZSBiaWdpbnQgc2Vzc2lvbiBjb250ZXh0LgorICogQHBhcmFtIGJpICBbaW5dICBUaGUgYmlnaW50IG9uIHdoaWNoIHRvIHBlcmZvcm0gdGhlIG1vZCBwb3dlciBvcGVyYXRpb24uCisgKiBAcGFyYW0gYmlleHAgW2luXSBUaGUgYmlnaW50IGV4cG9uZW50LgorICogQHNlZSBiaV9zZXRfbW9kKCkuCisgKi8KK2JpZ2ludCAqYmlfbW9kX3Bvd2VyKEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpLCBiaWdpbnQgKmJpZXhwKQoreworICAgIGludCBpID0gZmluZF9tYXhfZXhwX2luZGV4KGJpZXhwKSwgaiwgd2luZG93X3NpemUgPSAxOworICAgIGJpZ2ludCAqYmlSID0gaW50X3RvX2JpKGN0eCwgMSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19CSUdJTlRfTU9OVEdPTUVSWSkKKyAgICB1aW50OF90IG1vZF9vZmZzZXQgPSBjdHgtPm1vZF9vZmZzZXQ7CisgICAgaWYgKCFjdHgtPnVzZV9jbGFzc2ljYWwpCisgICAgeworICAgICAgICAvKiBwcmVjb252ZXJ0ICovCisgICAgICAgIGJpID0gYmlfbW9udChjdHgsIAorICAgICAgICAgICAgICAgIGJpX211bHRpcGx5KGN0eCwgYmksIGN0eC0+YmlfUlJfbW9kX21bbW9kX29mZnNldF0pKTsgICAgLyogeCcgKi8KKyAgICAgICAgYmlfZnJlZShjdHgsIGJpUik7CisgICAgICAgIGJpUiA9IGN0eC0+YmlfUl9tb2RfbVttb2Rfb2Zmc2V0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBICovCisgICAgfQorI2VuZGlmCisKKyAgICBjaGVjayhiaSk7CisgICAgY2hlY2soYmlleHApOworCisjaWZkZWYgQ09ORklHX0JJR0lOVF9TTElESU5HX1dJTkRPVworICAgIGZvciAoaiA9IGk7IGogPiAzMjsgaiAvPSA1KSAvKiB3b3JrIG91dCBhbiBvcHRpbXVtIHNpemUgKi8KKyAgICAgICAgd2luZG93X3NpemUrKzsKKworICAgIC8qIHdvcmsgb3V0IHRoZSBzbGlkZSBjb25zdGFudHMgKi8KKyAgICBwcmVjb21wdXRlX3NsaWRlX3dpbmRvdyhjdHgsIHdpbmRvd19zaXplLCBiaSk7CisjZWxzZSAgIC8qIGp1c3Qgb25lIGNvbnN0YW50ICovCisgICAgY3R4LT5nID0gKGJpZ2ludCAqKiltYWxsb2Moc2l6ZW9mKGJpZ2ludCAqKSk7CisgICAgY3R4LT5nWzBdID0gYmlfY2xvbmUoY3R4LCBiaSk7CisgICAgY3R4LT53aW5kb3cgPSAxOworICAgIGJpX3Blcm1hbmVudChjdHgtPmdbMF0pOworI2VuZGlmCisKKyAgICAvKiBpZiBzbGlkaW5nLXdpbmRvdyBpcyBvZmYsIHRoZW4gb25seSBvbmUgYml0IHdpbGwgYmUgZG9uZSBhdCBhIHRpbWUgYW5kCisgICAgICogd2lsbCByZWR1Y2UgdG8gc3RhbmRhcmQgbGVmdC10by1yaWdodCBleHBvbmVudGlhdGlvbiAqLworICAgIGRvCisgICAgeworICAgICAgICBpZiAoZXhwX2JpdF9pc19vbmUoYmlleHAsIGkpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbCA9IGktd2luZG93X3NpemUrMTsKKyAgICAgICAgICAgIGludCBwYXJ0X2V4cCA9IDA7CisKKyAgICAgICAgICAgIGlmIChsIDwgMCkgIC8qIExTQiBvZiBleHBvbmVudCB3aWxsIGFsd2F5cyBiZSAxICovCisgICAgICAgICAgICAgICAgbCA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGV4cF9iaXRfaXNfb25lKGJpZXhwLCBsKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBsKys7ICAgIC8qIGdvIGJhY2sgdXAgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYnVpbGQgdXAgdGhlIHNlY3Rpb24gb2YgdGhlIGV4cG9uZW50ICovCisgICAgICAgICAgICBmb3IgKGogPSBpOyBqID49IGw7IGotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiaVIgPSBiaV9yZXNpZHVlKGN0eCwgYmlfc3F1YXJlKGN0eCwgYmlSKSk7CisgICAgICAgICAgICAgICAgaWYgKGV4cF9iaXRfaXNfb25lKGJpZXhwLCBqKSkKKyAgICAgICAgICAgICAgICAgICAgcGFydF9leHArKzsKKworICAgICAgICAgICAgICAgIGlmIChqICE9IGwpCisgICAgICAgICAgICAgICAgICAgIHBhcnRfZXhwIDw8PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJ0X2V4cCA9IChwYXJ0X2V4cC0xKS8yOyAgLyogYWRqdXN0IGZvciBhcnJheSAqLworICAgICAgICAgICAgYmlSID0gYmlfcmVzaWR1ZShjdHgsIGJpX211bHRpcGx5KGN0eCwgYmlSLCBjdHgtPmdbcGFydF9leHBdKSk7CisgICAgICAgICAgICBpID0gbC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAgLyogc3F1YXJlIGl0ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpUiA9IGJpX3Jlc2lkdWUoY3R4LCBiaV9zcXVhcmUoY3R4LCBiaVIpKTsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGkgPj0gMCk7CisgICAgIAorICAgIC8qIGNsZWFudXAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT53aW5kb3c7IGkrKykKKyAgICB7CisgICAgICAgIGJpX2RlcGVybWFuZW50KGN0eC0+Z1tpXSk7CisgICAgICAgIGJpX2ZyZWUoY3R4LCBjdHgtPmdbaV0pOworICAgIH0KKworICAgIGZyZWUoY3R4LT5nKTsKKyAgICBiaV9mcmVlKGN0eCwgYmkpOworICAgIGJpX2ZyZWUoY3R4LCBiaWV4cCk7CisjaWYgZGVmaW5lZCBDT05GSUdfQklHSU5UX01PTlRHT01FUlkKKyAgICByZXR1cm4gY3R4LT51c2VfY2xhc3NpY2FsID8gYmlSIDogYmlfbW9udChjdHgsIGJpUik7IC8qIGNvbnZlcnQgYmFjayAqLworI2Vsc2UgLyogQ09ORklHX0JJR0lOVF9DTEFTU0lDQUwgb3IgQ09ORklHX0JJR0lOVF9CQVJSRVRUICovCisgICAgcmV0dXJuIGJpUjsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX1NTTF9DRVJUX1ZFUklGSUNBVElPTgorLyoqCisgKiBAYnJpZWYgUGVyZm9ybSBhIG1vZHVsYXIgZXhwb25lbnRpYXRpb24gdXNpbmcgYSB0ZW1wb3JhcnkgbW9kdWx1cy4KKyAqCisgKiBXZSBuZWVkIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgdGhlIHNpZ25hdHVyZXMgb2YgY2VydGlmaWNhdGVzLiBUaGUgbW9kdWx1cworICogb2YgdGhpcyBmdW5jdGlvbiBpcyB0ZW1wb3JhcnkgYXMgaXQncyBqdXN0IHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgorICogQHBhcmFtIGN0eCBbaW5dICBUaGUgYmlnaW50IHNlc3Npb24gY29udGV4dC4KKyAqIEBwYXJhbSBiaSAgW2luXSAgVGhlIGJpZ2ludCB0byBwZXJmb3JtIHRoZSBleHAvbW9kLgorICogQHBhcmFtIGJpbSBbaW5dICBUaGUgdGVtcG9yYXJ5IG1vZHVsdXMuCisgKiBAcGFyYW0gYmlleHAgW2luXSBUaGUgYmlnaW50IGV4cG9uZW50LgorICogQHNlZSBiaV9zZXRfbW9kKCkuCisgKi8KK2JpZ2ludCAqYmlfbW9kX3Bvd2VyMihCSV9DVFggKmN0eCwgYmlnaW50ICpiaSwgYmlnaW50ICpiaW0sIGJpZ2ludCAqYmlleHApCit7CisgICAgYmlnaW50ICpiaVIsICp0bXBfYmlSOworCisgICAgLyogU2V0IHVwIGEgdGVtcG9yYXJ5IGJpZ2ludCBjb250ZXh0IGFuZCB0cmFuc2ZlciB3aGF0IHdlIG5lZWQgYmV0d2VlbgorICAgICAqIHRoZW0uIFdlIG5lZWQgdG8gZG8gdGhpcyBzaW5jZSB3ZSB3YW50IHRvIGtlZXAgdGhlIG9yaWdpbmFsIG1vZHVsdXMKKyAgICAgKiB3aGljaCBpcyBhbHJlYWR5IGluIHRoaXMgY29udGV4dC4gVGhpcyBvcGVyYXRpb24gaXMgb25seSBjYWxsZWQgd2hlbgorICAgICAqIGRvaW5nIHBlZXIgdmVyaWZpY2F0aW9uLCBhbmQgc28gaXMgbm90IGV4cGVuc2l2ZSA6LSkgKi8KKyAgICBCSV9DVFggKnRtcF9jdHggPSBiaV9pbml0aWFsaXplKCk7CisgICAgYmlfc2V0X21vZCh0bXBfY3R4LCBiaV9jbG9uZSh0bXBfY3R4LCBiaW0pLCBCSUdJTlRfTV9PRkZTRVQpOworICAgIHRtcF9iaVIgPSBiaV9tb2RfcG93ZXIodG1wX2N0eCwgCisgICAgICAgICAgICAgICAgYmlfY2xvbmUodG1wX2N0eCwgYmkpLCAKKyAgICAgICAgICAgICAgICBiaV9jbG9uZSh0bXBfY3R4LCBiaWV4cCkpOworICAgIGJpUiA9IGJpX2Nsb25lKGN0eCwgdG1wX2JpUik7CisgICAgYmlfZnJlZSh0bXBfY3R4LCB0bXBfYmlSKTsKKyAgICBiaV9mcmVlX21vZCh0bXBfY3R4LCBCSUdJTlRfTV9PRkZTRVQpOworICAgIGJpX3Rlcm1pbmF0ZSh0bXBfY3R4KTsKKworICAgIGJpX2ZyZWUoY3R4LCBiaSk7CisgICAgYmlfZnJlZShjdHgsIGJpbSk7CisgICAgYmlfZnJlZShjdHgsIGJpZXhwKTsKKyAgICByZXR1cm4gYmlSOworfQorI2VuZGlmCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by9heHRscy9iaWdpbnQuaCBiL2dweGUvc3JjL2NyeXB0by9heHRscy9iaWdpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWEzYzcwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL2JpZ2ludC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiAgQ29weXJpZ2h0KEMpIDIwMDYgQ2FtZXJvbiBSaWNoCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBCSUdJTlRfSEVBREVSCisjZGVmaW5lIEJJR0lOVF9IRUFERVIKKworLyogZW5hYmxlIGZlYXR1cmVzIGJhc2VkIG9uIGEgJ3N1cGVyLXNldCcgY2FwYmFpbGl0eS4gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TU0xfRlVMTF9NT0RFKSAKKyNkZWZpbmUgQ09ORklHX1NTTF9FTkFCTEVfQ0xJRU5UCisjZGVmaW5lIENPTkZJR19TU0xfQ0VSVF9WRVJJRklDQVRJT04KKyNlbGlmIGRlZmluZWQoQ09ORklHX1NTTF9FTkFCTEVfQ0xJRU5UKQorI2RlZmluZSBDT05GSUdfU1NMX0NFUlRfVkVSSUZJQ0FUSU9OCisjZW5kaWYKKworI2luY2x1ZGUgIm9zX3BvcnQuaCIKKyNpbmNsdWRlICJiaWdpbnRfaW1wbC5oIgorCisjaWZuZGVmIENPTkZJR19CSUdJTlRfQ0hFQ0tfT04KKyNkZWZpbmUgY2hlY2soQSkgICAgICAgICAgICAgICAgLyoqPCBkaXNhcHBlYXJzIGluIG5vcm1hbCBwcm9kdWN0aW9uIG1vZGUgKi8KKyNlbmRpZgorQklfQ1RYICpiaV9pbml0aWFsaXplKHZvaWQpOwordm9pZCBiaV90ZXJtaW5hdGUoQklfQ1RYICpjdHgpOwordm9pZCBiaV9wZXJtYW5lbnQoYmlnaW50ICpiaSk7Cit2b2lkIGJpX2RlcGVybWFuZW50KGJpZ2ludCAqYmkpOwordm9pZCBiaV9mcmVlKEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpKTsKK2JpZ2ludCAqYmlfY29weShiaWdpbnQgKmJpKTsKK2JpZ2ludCAqYmlfY2xvbmUoQklfQ1RYICpjdHgsIGNvbnN0IGJpZ2ludCAqYmkpOwordm9pZCBiaV9leHBvcnQoQklfQ1RYICpjdHgsIGJpZ2ludCAqYmksIHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKTsKK2JpZ2ludCAqYmlfaW1wb3J0KEJJX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgbGVuKTsKK2JpZ2ludCAqaW50X3RvX2JpKEJJX0NUWCAqY3R4LCBjb21wIGkpOworCisvKiB0aGUgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgZG8gc29tZXRoaW5nIGludGVyZXN0aW5nICovCitiaWdpbnQgKmJpX2FkZChCSV9DVFggKmN0eCwgYmlnaW50ICpiaWEsIGJpZ2ludCAqYmliKTsKK2JpZ2ludCAqYmlfc3VidHJhY3QoQklfQ1RYICpjdHgsIGJpZ2ludCAqYmlhLCAKKyAgICAgICAgYmlnaW50ICpiaWIsIGludCAqaXNfbmVnYXRpdmUpOworYmlnaW50ICpiaV9kaXZpZGUoQklfQ1RYICpjdHgsIGJpZ2ludCAqYmlhLCBiaWdpbnQgKmJpbSwgaW50IGlzX21vZCk7CitiaWdpbnQgKmJpX211bHRpcGx5KEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpYSwgYmlnaW50ICpiaWIpOworYmlnaW50ICpiaV9tb2RfcG93ZXIoQklfQ1RYICpjdHgsIGJpZ2ludCAqYmksIGJpZ2ludCAqYmlleHApOworYmlnaW50ICpiaV9tb2RfcG93ZXIyKEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpLCBiaWdpbnQgKmJpbSwgYmlnaW50ICpiaWV4cCk7CitpbnQgYmlfY29tcGFyZShiaWdpbnQgKmJpYSwgYmlnaW50ICpiaWIpOwordm9pZCBiaV9zZXRfbW9kKEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpbSwgaW50IG1vZF9vZmZzZXQpOwordm9pZCBiaV9mcmVlX21vZChCSV9DVFggKmN0eCwgaW50IG1vZF9vZmZzZXQpOworCisjaWZkZWYgQ09ORklHX1NTTF9GVUxMX01PREUKK3ZvaWQgYmlfcHJpbnQoY29uc3QgY2hhciAqbGFiZWwsIGJpZ2ludCAqYmkpOworYmlnaW50ICpiaV9zdHJfaW1wb3J0KEJJX0NUWCAqY3R4LCBjb25zdCBjaGFyICpkYXRhKTsKKyNlbmRpZgorCisvKioKKyAqIEBkZWYgYmlfbW9kCisgKiBGaW5kIHRoZSByZXNpZHVlIG9mIEIuIGJpX3NldF9tb2QoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgaGFuZC4KKyAqLworI2RlZmluZSBiaV9tb2QoQSwgQikgICAgICBiaV9kaXZpZGUoQSwgQiwgY3R4LT5iaV9tb2RbY3R4LT5tb2Rfb2Zmc2V0XSwgMSkKKworLyoqCisgKiBiaV9yZXNpZHVlKCkgaXMgdGVjaG5pY2FsbHkgdGhlIHNhbWUgYXMgYmlfbW9kKCksIGJ1dCBpdCB1c2VzIHRoZQorICogYXBwcm9wcmlhdGUgcmVkdWN0aW9uIHRlY2huaXF1ZSAod2hpY2ggaXMgYmlfbW9kKCkgd2hlbiBkb2luZyBjbGFzc2ljYWwKKyAqIHJlZHVjdGlvbikuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19CSUdJTlRfTU9OVEdPTUVSWSkKKyNkZWZpbmUgYmlfcmVzaWR1ZShBLCBCKSAgICAgICAgIGJpX21vbnQoQSwgQikKK2JpZ2ludCAqYmlfbW9udChCSV9DVFggKmN0eCwgYmlnaW50ICpiaXh5KTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JJR0lOVF9CQVJSRVRUKQorI2RlZmluZSBiaV9yZXNpZHVlKEEsIEIpICAgICAgICAgYmlfYmFycmV0dChBLCBCKQorYmlnaW50ICpiaV9iYXJyZXR0KEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpKTsKKyNlbHNlIC8qIGlmIGRlZmluZWQoQ09ORklHX0JJR0lOVF9DTEFTU0lDQUwpICovCisjZGVmaW5lIGJpX3Jlc2lkdWUoQSwgQikgICAgICAgICBiaV9tb2QoQSwgQikKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JJR0lOVF9TUVVBUkUKK2JpZ2ludCAqYmlfc3F1YXJlKEJJX0NUWCAqY3R4LCBiaWdpbnQgKmJpKTsKKyNlbHNlCisjZGVmaW5lIGJpX3NxdWFyZShBLCBCKSAgICAgYmlfbXVsdGlwbHkoQSwgYmlfY29weShCKSwgQikKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by9heHRscy9iaWdpbnRfaW1wbC5oIGIvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL2JpZ2ludF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyYTdjYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NyeXB0by9heHRscy9iaWdpbnRfaW1wbC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogIENvcHlyaWdodChDKSAyMDA2IENhbWVyb24gUmljaAorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBCSUdJTlRfSU1QTF9IRUFERVIKKyNkZWZpbmUgQklHSU5UX0lNUExfSEVBREVSCisKKy8qIE1haW50YWluIGEgbnVtYmVyIG9mIHByZWNvbXB1dGVkIHZhcmlhYmxlcyB3aGVuIGRvaW5nIHJlZHVjdGlvbiAqLworI2RlZmluZSBCSUdJTlRfTV9PRkZTRVQgICAgIDAgICAgLyoqPCBOb3JtYWwgbW9kdWxvIG9mZnNldC4gKi8KKyNpZmRlZiBDT05GSUdfQklHSU5UX0NSVAorI2RlZmluZSBCSUdJTlRfUF9PRkZTRVQgICAgIDEgICAgLyoqPCBwIG1vZHVsbyBvZmZzZXQuICovCisjZGVmaW5lIEJJR0lOVF9RX09GRlNFVCAgICAgMiAgICAvKio8IHEgbW9kdWxlIG9mZnNldC4gKi8KKyNkZWZpbmUgQklHSU5UX05VTV9NT0RTICAgICAzICAgIC8qKjwgVGhlIG51bWJlciBvZiBtb2R1bHVzIGNvbnN0YW50cyB1c2VkLiAqLworI2Vsc2UKKyNkZWZpbmUgQklHSU5UX05VTV9NT0RTICAgICAxICAgIAorI2VuZGlmCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmdW5jdGlvbnMgZm9yIGJpZyBpbnRzICovCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgQ09NUF9SQURJWCAgICAgICAgICA0Mjk0OTY3Mjk2aTY0ICAgICAgICAgCisjZGVmaW5lIENPTVBfQklHX01TQiAgICAgICAgMHg4MDAwMDAwMDAwMDAwMDAwaTY0IAorI2Vsc2UKKyNkZWZpbmUgQ09NUF9SQURJWCAgICAgICAgICA0Mjk0OTY3Mjk2VUxMICAgICAgICAgLyoqPCBNYXggY29tcG9uZW50ICsgMSAqLworI2RlZmluZSBDT01QX0JJR19NU0IgICAgICAgIDB4ODAwMDAwMDAwMDAwMDAwMFVMTCAvKio8IChNYXggZGJsIGNvbXAgKyAxKS8gMiAqLworI2VuZGlmCisjZGVmaW5lIENPTVBfQklUX1NJWkUgICAgICAgMzIgIC8qKjwgTnVtYmVyIG9mIGJpdHMgaW4gYSBjb21wb25lbnQuICovCisjZGVmaW5lIENPTVBfQllURV9TSVpFICAgICAgNCAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIGluIGEgY29tcG9uZW50LiAqLworI2RlZmluZSBDT01QX05VTV9OSUJCTEVTICAgIDggICAvKio8IFVzZWQgRm9yIGRpYWdub3N0aWNzIG9ubHkuICovCisKK3R5cGVkZWYgdWludDMyX3QgY29tcDsJICAgICAgICAvKio8IEEgc2luZ2xlIHByZWNpc2lvbiBjb21wb25lbnQuICovCit0eXBlZGVmIHVpbnQ2NF90IGxvbmdfY29tcDsgICAgIC8qKjwgQSBkb3VibGUgcHJlY2lzaW9uIGNvbXBvbmVudC4gKi8KK3R5cGVkZWYgaW50NjRfdCBzbG9uZ19jb21wOyAgICAgLyoqPCBBIHNpZ25lZCBkb3VibGUgcHJlY2lzaW9uIGNvbXBvbmVudC4gKi8KKworLyoqCisgKiBAc3RydWN0ICBfYmlnaW50CisgKiBAYnJpZWYgQSBiaWcgaW50ZWdlciBiYXNpYyBvYmplY3QKKyAqLworc3RydWN0IF9iaWdpbnQKK3sKKyAgICBzdHJ1Y3QgX2JpZ2ludCogbmV4dDsgICAgICAgLyoqPCBUaGUgbmV4dCBiaWdpbnQgaW4gdGhlIGNhY2hlLiAqLworICAgIHNob3J0IHNpemU7ICAgICAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGlzIGJpZ2ludC4gKi8KKyAgICBzaG9ydCBtYXhfY29tcHM7ICAgICAgICAgICAgLyoqPCBUaGUgaGVhcHNpemUgYWxsb2NhdGVkIGZvciB0aGlzIGJpZ2ludCAqLworICAgIGludCByZWZzOyAgICAgICAgICAgICAgICAgICAvKio8IEFuIGludGVybmFsIHJlZmVyZW5jZSBjb3VudC4gKi8KKyAgICBjb21wKiBjb21wczsgICAgICAgICAgICAgICAgLyoqPCBBIHB0ciB0byB0aGUgYWN0dWFsIGNvbXBvbmVudCBkYXRhICovCit9OworCit0eXBlZGVmIHN0cnVjdCBfYmlnaW50IGJpZ2ludDsgIC8qKjwgQW4gYWxpYXMgZm9yIF9iaWdpbnQgKi8KKworLyoqCisgKiBNYWludGFpbnMgdGhlIHN0YXRlIG9mIHRoZSBjYWNoZSwgYW5kIGEgbnVtYmVyIG9mIHZhcmlhYmxlcyB1c2VkIGluIAorICogcmVkdWN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCAvKio8IEEgYmlnIGludGVnZXIgInNlc3Npb24iIGNvbnRleHQuICovCit7CisgICAgYmlnaW50ICphY3RpdmVfbGlzdDsgICAgICAgICAgICAgICAgICAgIC8qKjwgQmlnaW50cyBjdXJyZW50bHkgdXNlZC4gKi8KKyAgICBiaWdpbnQgKmZyZWVfbGlzdDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCaWdpbnRzIG5vdCB1c2VkLiAqLworICAgIGJpZ2ludCAqYmlfcmFkaXg7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSByYWRpeCB1c2VkLiAqLworICAgIGJpZ2ludCAqYmlfbW9kW0JJR0lOVF9OVU1fTU9EU107ICAgICAgICAvKio8IG1vZHVsdXMgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0JJR0lOVF9NT05UR09NRVJZKQorICAgIGJpZ2ludCAqYmlfUlJfbW9kX21bQklHSU5UX05VTV9NT0RTXTsgICAvKio8IFJeMiBtb2QgbSAqLworICAgIGJpZ2ludCAqYmlfUl9tb2RfbVtCSUdJTlRfTlVNX01PRFNdOyAgICAvKio8IFIgbW9kIG0gKi8KKyAgICBjb21wIE4wX2Rhc2hbQklHSU5UX05VTV9NT0RTXTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JJR0lOVF9CQVJSRVRUKQorICAgIGJpZ2ludCAqYmlfbXVbQklHSU5UX05VTV9NT0RTXTsgICAgICAgICAvKio8IFN0b3JhZ2UgZm9yIG11ICovCisjZW5kaWYKKyAgICBiaWdpbnQgKmJpX25vcm1hbGlzZWRfbW9kW0JJR0lOVF9OVU1fTU9EU107IC8qKjwgTm9ybWFsaXNlZCBtb2Qgc3RvcmFnZS4gKi8KKyAgICBiaWdpbnQgKipnOyAgICAgICAgICAgICAgICAgLyoqPCBVc2VkIGJ5IHNsaWRpbmctd2luZG93LiAqLworICAgIGludCB3aW5kb3c7ICAgICAgICAgICAgICAgICAvKio8IFRoZSBzaXplIG9mIHRoZSBzbGlkaW5nIHdpbmRvdyAqLworICAgIGludCBhY3RpdmVfY291bnQ7ICAgICAgICAgICAvKio8IE51bWJlciBvZiBhY3RpdmUgYmlnaW50cy4gKi8KKyAgICBpbnQgZnJlZV9jb3VudDsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZnJlZSBiaWdpbnRzLiAqLworCisjaWZkZWYgQ09ORklHX0JJR0lOVF9NT05UR09NRVJZCisgICAgdWludDhfdCB1c2VfY2xhc3NpY2FsOyAgICAgIC8qKjwgVXNlIGNsYXNzaWNhbCByZWR1Y3Rpb24uICovCisjZW5kaWYKKyAgICB1aW50OF90IG1vZF9vZmZzZXQ7ICAgICAgICAgLyoqPCBUaGUgbW9kIG9mZnNldCB3ZSBhcmUgdXNpbmcgKi8KK30gQklfQ1RYOworCisjaWZuZGVmIFdJTjMyCisjZGVmaW5lIG1heChhLGIpICgoYSk+KGIpPyhhKTooYikpICAvKio8IEZpbmQgdGhlIG1heGltdW0gb2YgMiBudW1iZXJzLiAqLworI2RlZmluZSBtaW4oYSxiKSAoKGEpPChiKT8oYSk6KGIpKSAgLyoqPCBGaW5kIHRoZSBtaW5pbXVtIG9mIDIgbnVtYmVycy4gKi8KKyNlbmRpZgorCisjZGVmaW5lIFBFUk1BTkVOVCAgICAgICAgICAgMHg3RkZGNTVBQSAgLyoqPCBBIG1hZ2ljIG51bWJlciBmb3IgcGVybWFuZW50cy4gKi8KKworI2RlZmluZSBWMSAgICAgIHYtPmNvbXBzW3YtPnNpemUtMV0gICAgICAgICAgICAgICAgIC8qKjwgdjEgZm9yIGRpdmlzaW9uICovCisjZGVmaW5lIFYyICAgICAgdi0+Y29tcHNbdi0+c2l6ZS0yXSAgICAgICAgICAgICAgICAgLyoqPCB2MiBmb3IgZGl2aXNpb24gKi8KKyNkZWZpbmUgVShqKSAgICB0bXBfdS0+Y29tcHNbdG1wX3UtPnNpemUtai0xXSAgICAgICAvKio8IHVqIGZvciBkaXZpc2lvbiAqLworI2RlZmluZSBRKGopICAgIHF1b3RpZW50LT5jb21wc1txdW90aWVudC0+c2l6ZS1qLTFdIC8qKjwgcWogZm9yIGRpdmlzaW9uICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL2NyeXB0by5oIGIvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL2NyeXB0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYWNiMjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jcnlwdG8vYXh0bHMvY3J5cHRvLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiAgQ29weXJpZ2h0KEMpIDIwMDYgQ2FtZXJvbiBSaWNoCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZSBjcnlwdG8uaAorICovCisKKyNpZm5kZWYgSEVBREVSX0NSWVBUT19ICisjZGVmaW5lIEhFQURFUl9DUllQVE9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJiaWdpbnQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBRVMgZGVjbGFyYXRpb25zIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEFFU19NQVhST1VORFMJCQkxNAorCit0eXBlZGVmIHN0cnVjdCBhZXNfa2V5X3N0IAoreworICAgIHVpbnQxNl90IHJvdW5kczsKKyAgICB1aW50MTZfdCBrZXlfc2l6ZTsKKyAgICB1aW50MzJfdCBrc1soQUVTX01BWFJPVU5EUysxKSo4XTsKKyAgICB1aW50OF90IGl2WzE2XTsKK30gQUVTX0NUWDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQUVTX01PREVfMTI4LAorICAgIEFFU19NT0RFXzI1NgorfSBBRVNfTU9ERTsKKwordm9pZCBBRVNfc2V0X2tleShBRVNfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmtleSwgCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBBRVNfTU9ERSBtb2RlKTsKK3ZvaWQgQUVTX2NiY19lbmNyeXB0KEFFU19DVFggKmN0eCwgY29uc3QgdWludDhfdCAqbXNnLCAKKyAgICAgICAgdWludDhfdCAqb3V0LCBpbnQgbGVuZ3RoKTsKK3ZvaWQgQUVTX2NiY19kZWNyeXB0KEFFU19DVFggKmtzLCBjb25zdCB1aW50OF90ICppbiwgdWludDhfdCAqb3V0LCBpbnQgbGVuZ3RoKTsKK3ZvaWQgQUVTX2NvbnZlcnRfa2V5KEFFU19DVFggKmN0eCk7Cit2b2lkIEFFU19lbmNyeXB0KGNvbnN0IEFFU19DVFggKmN0eCwgdWludDMyX3QgKmRhdGEpOwordm9pZCBBRVNfZGVjcnlwdChjb25zdCBBRVNfQ1RYICpjdHgsIHVpbnQzMl90ICpkYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSQzQgZGVjbGFyYXRpb25zIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICBpbnQgeCwgeSwgbVsyNTZdOworfSBSQzRfQ1RYOworCit2b2lkIFJDNF9zZXR1cChSQzRfQ1RYICpzLCBjb25zdCB1aW50OF90ICprZXksIGludCBsZW5ndGgpOwordm9pZCBSQzRfY3J5cHQoUkM0X0NUWCAqcywgY29uc3QgdWludDhfdCAqbXNnLCB1aW50OF90ICpkYXRhLCBpbnQgbGVuZ3RoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTSEExIGRlY2xhcmF0aW9ucyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTSEExX1NJWkUgICAyMAorCisvKgorICogIFRoaXMgc3RydWN0dXJlIHdpbGwgaG9sZCBjb250ZXh0IGluZm9ybWF0aW9uIGZvciB0aGUgU0hBLTEKKyAqICBoYXNoaW5nIG9wZXJhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICB1aW50MzJfdCBJbnRlcm1lZGlhdGVfSGFzaFtTSEExX1NJWkUvNF07IC8qIE1lc3NhZ2UgRGlnZXN0ICAqLworICAgIHVpbnQzMl90IExlbmd0aF9Mb3c7ICAgICAgICAgICAgLyogTWVzc2FnZSBsZW5ndGggaW4gYml0cyAgICAgICovCisgICAgdWludDMyX3QgTGVuZ3RoX0hpZ2g7ICAgICAgICAgICAvKiBNZXNzYWdlIGxlbmd0aCBpbiBiaXRzICAgICAgKi8KKyAgICB1aW50MTZfdCBNZXNzYWdlX0Jsb2NrX0luZGV4OyAgIC8qIEluZGV4IGludG8gbWVzc2FnZSBibG9jayBhcnJheSAgICovCisgICAgdWludDhfdCBNZXNzYWdlX0Jsb2NrWzY0XTsgICAgICAvKiA1MTItYml0IG1lc3NhZ2UgYmxvY2tzICAgICAgKi8KK30gU0hBMV9DVFg7CisKK3ZvaWQgU0hBMUluaXQoU0hBMV9DVFggKik7Cit2b2lkIFNIQTFVcGRhdGUoU0hBMV9DVFggKiwgY29uc3QgdWludDhfdCAqIG1zZywgaW50IGxlbik7Cit2b2lkIFNIQTFGaW5hbChTSEExX0NUWCAqLCB1aW50OF90ICpkaWdlc3QpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1ENSBkZWNsYXJhdGlvbnMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1ENSBjb250ZXh0LiAqLworCisjZGVmaW5lIE1ENV9TSVpFICAgIDE2CisKK3R5cGVkZWYgc3RydWN0IAoreworICB1aW50MzJfdCBzdGF0ZVs0XTsgICAgICAgIC8qIHN0YXRlIChBQkNEKSAqLworICB1aW50MzJfdCBjb3VudFsyXTsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzLCBtb2R1bG8gMl42NCAobHNiIGZpcnN0KSAqLworICB1aW50OF90IGJ1ZmZlcls2NF07ICAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworfSBNRDVfQ1RYOworCit2b2lkIE1ENUluaXQoTUQ1X0NUWCAqKTsKK3ZvaWQgTUQ1VXBkYXRlKE1ENV9DVFggKiwgY29uc3QgdWludDhfdCAqbXNnLCBpbnQgbGVuKTsKK3ZvaWQgTUQ1RmluYWwoTUQ1X0NUWCAqLCB1aW50OF90ICpkaWdlc3QpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhNQUMgZGVjbGFyYXRpb25zIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBobWFjX21kNShjb25zdCB1aW50OF90ICptc2csIGludCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKmtleSwgCisgICAgICAgIGludCBrZXlfbGVuLCB1aW50OF90ICpkaWdlc3QpOwordm9pZCBobWFjX3NoYTEoY29uc3QgdWludDhfdCAqbXNnLCBpbnQgbGVuZ3RoLCBjb25zdCB1aW50OF90ICprZXksIAorICAgICAgICBpbnQga2V5X2xlbiwgdWludDhfdCAqZGlnZXN0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSTkcgZGVjbGFyYXRpb25zIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBSTkdfaW5pdGlhbGl6ZShjb25zdCB1aW50OF90ICpzZWVkX2J1ZiwgaW50IHNpemUpOwordm9pZCBSTkdfdGVybWluYXRlKHZvaWQpOwordm9pZCBnZXRfcmFuZG9tKGludCBudW1fcmFuZF9ieXRlcywgdWludDhfdCAqcmFuZF9kYXRhKTsKKy8vdm9pZCBnZXRfcmFuZG9tX05aKGludCBudW1fcmFuZF9ieXRlcywgdWludDhfdCAqcmFuZF9kYXRhKTsKKworI2luY2x1ZGUgPHN0cmluZy5oPgorc3RhdGljIGlubGluZSB2b2lkIGdldF9yYW5kb21fTlooaW50IG51bV9yYW5kX2J5dGVzLCB1aW50OF90ICpyYW5kX2RhdGEpIHsKKwltZW1zZXQgKCByYW5kX2RhdGEsIDB4MDEsIG51bV9yYW5kX2J5dGVzICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUlNBIGRlY2xhcmF0aW9ucyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAgYmlnaW50ICptOyAgICAgICAgICAgICAgLyogbW9kdWx1cyAqLworICAgIGJpZ2ludCAqZTsgICAgICAgICAgICAgIC8qIHB1YmxpYyBleHBvbmVudCAqLworICAgIGJpZ2ludCAqZDsgICAgICAgICAgICAgIC8qIHByaXZhdGUgZXhwb25lbnQgKi8KKyNpZmRlZiBDT05GSUdfQklHSU5UX0NSVAorICAgIGJpZ2ludCAqcDsgICAgICAgICAgICAgIC8qIHAgYXMgaW4gbSA9IHBxICovCisgICAgYmlnaW50ICpxOyAgICAgICAgICAgICAgLyogcSBhcyBpbiBtID0gcHEgKi8KKyAgICBiaWdpbnQgKmRQOyAgICAgICAgICAgICAvKiBkIG1vZCAocC0xKSAqLworICAgIGJpZ2ludCAqZFE7ICAgICAgICAgICAgIC8qIGQgbW9kIChxLTEpICovCisgICAgYmlnaW50ICpxSW52OyAgICAgICAgICAgLyogcV4tMSBtb2QgcCAqLworI2VuZGlmCisgICAgaW50IG51bV9vY3RldHM7CisgICAgYmlnaW50ICpzaWdfbTsgICAgICAgICAvKiBzaWduYXR1cmUgbW9kdWx1cyAqLworICAgIEJJX0NUWCAqYmlfY3R4OworfSBSU0FfQ1RYOworCit2b2lkIFJTQV9wcml2X2tleV9uZXcoUlNBX0NUWCAqKnJzYV9jdHgsIAorICAgICAgICBjb25zdCB1aW50OF90ICptb2R1bHVzLCBpbnQgbW9kX2xlbiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHViX2V4cCwgaW50IHB1Yl9sZW4sCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnByaXZfZXhwLCBpbnQgcHJpdl9sZW4KKyNpZmRlZiBDT05GSUdfQklHSU5UX0NSVAorICAgICAgLCBjb25zdCB1aW50OF90ICpwLCBpbnQgcF9sZW4sCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnEsIGludCBxX2xlbiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqZFAsIGludCBkUF9sZW4sCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRRLCBpbnQgZFFfbGVuLAorICAgICAgICBjb25zdCB1aW50OF90ICpxSW52LCBpbnQgcUludl9sZW4KKyNlbmRpZgorICAgICAgICApOwordm9pZCBSU0FfcHViX2tleV9uZXcoUlNBX0NUWCAqKnJzYV9jdHgsIAorICAgICAgICBjb25zdCB1aW50OF90ICptb2R1bHVzLCBpbnQgbW9kX2xlbiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHViX2V4cCwgaW50IHB1Yl9sZW4pOwordm9pZCBSU0FfZnJlZShSU0FfQ1RYICpjdHgpOworaW50IFJTQV9kZWNyeXB0KGNvbnN0IFJTQV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqaW5fZGF0YSwgdWludDhfdCAqb3V0X2RhdGEsCisgICAgICAgIGludCBpc19kZWNyeXB0aW9uKTsKK2JpZ2ludCAqUlNBX3ByaXZhdGUoY29uc3QgUlNBX0NUWCAqYywgYmlnaW50ICpiaV9tc2cpOworI2lmZGVmIENPTkZJR19TU0xfQ0VSVF9WRVJJRklDQVRJT04KK2JpZ2ludCAqUlNBX3Jhd19zaWduX3ZlcmlmeShSU0FfQ1RYICpjLCBiaWdpbnQgKmJpX21zZyk7CitiaWdpbnQgKlJTQV9zaWduX3ZlcmlmeShCSV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqc2lnLCBpbnQgc2lnX2xlbiwKKyAgICAgICAgYmlnaW50ICptb2R1bHVzLCBiaWdpbnQgKnB1Yl9leHApOworYmlnaW50ICpSU0FfcHVibGljKGNvbnN0IFJTQV9DVFggKmMsIGJpZ2ludCAqYmlfbXNnKTsKK2ludCBSU0FfZW5jcnlwdChjb25zdCBSU0FfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmluX2RhdGEsIHVpbnQxNl90IGluX2xlbiwgCisgICAgICAgIHVpbnQ4X3QgKm91dF9kYXRhLCBpbnQgaXNfc2lnbmluZyk7Cit2b2lkIFJTQV9wcmludChjb25zdCBSU0FfQ1RYICpjdHgpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVNOMSBkZWNsYXJhdGlvbnMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFg1MDlfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWDUwOV9OT1RfT0sgICAgICAgICAgICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgWDUwOV9WRllfRVJST1JfTk9fVFJVU1RFRF9DRVJUICAgICAgLTIKKyNkZWZpbmUgWDUwOV9WRllfRVJST1JfQkFEX1NJR05BVFVSRSAgICAgICAgLTMgICAgICAKKyNkZWZpbmUgWDUwOV9WRllfRVJST1JfTk9UX1lFVF9WQUxJRCAgICAgICAgLTQKKyNkZWZpbmUgWDUwOV9WRllfRVJST1JfRVhQSVJFRCAgICAgICAgICAgICAgLTUKKyNkZWZpbmUgWDUwOV9WRllfRVJST1JfU0VMRl9TSUdORUQgICAgICAgICAgLTYKKyNkZWZpbmUgWDUwOV9WRllfRVJST1JfSU5WQUxJRF9DSEFJTiAgICAgICAgLTcKKyNkZWZpbmUgWDUwOV9WRllfRVJST1JfVU5TVVBQT1JURURfRElHRVNUICAgLTgKKyNkZWZpbmUgWDUwOV9JTlZBTElEX1BSSVZfS0VZICAgICAgICAgICAgICAgLTkKKworLyoKKyAqIFRoZSBEaXN0aW5ndWlzaGVkIE5hbWUKKyAqLworI2RlZmluZSBYNTA5X05VTV9ETl9UWVBFUyAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFg1MDlfQ09NTU9OX05BTUUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWDUwOV9PUkdBTklaQVRJT04gICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYNTA5X09SR0FOSVpBVElPTkFMX1RZUEUgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVNOMV9JTlRFR0VSICAgICAgICAgICAgMHgwMgorI2RlZmluZSBBU04xX0JJVF9TVFJJTkcgICAgICAgICAweDAzCisjZGVmaW5lIEFTTjFfT0NURVRfU1RSSU5HICAgICAgIDB4MDQKKyNkZWZpbmUgQVNOMV9OVUxMICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBBU04xX09JRCAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIEFTTjFfUFJJTlRBQkxFX1NUUiAgICAgIDB4MTMKKyNkZWZpbmUgQVNOMV9URUxFVEVYX1NUUiAgICAgICAgMHgxNAorI2RlZmluZSBBU04xX0lBNV9TVFIgICAgICAgICAgICAweDE2CisjZGVmaW5lIEFTTjFfVVRDX1RJTUUgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgQVNOMV9TRVFVRU5DRSAgICAgICAgICAgMHgzMAorI2RlZmluZSBBU04xX1NFVCAgICAgICAgICAgICAgICAweDMxCisjZGVmaW5lIEFTTjFfSU1QTElDSVRfVEFHICAgICAgIDB4ODAKKyNkZWZpbmUgQVNOMV9FWFBMSUNJVF9UQUcgICAgICAgMHhhMAorCisjZGVmaW5lIFNBTFRfU0laRSAgICAgICAgICAgICAgIDgKKworc3RydWN0IF94NTA5X2N0eAoreworICAgIGNoYXIgKmNhX2NlcnRfZG5bWDUwOV9OVU1fRE5fVFlQRVNdOworICAgIGNoYXIgKmNlcnRfZG5bWDUwOV9OVU1fRE5fVFlQRVNdOworI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICBsb25nIG5vdF9iZWZvcmU7CisgICAgbG9uZyBub3RfYWZ0ZXI7CisjZWxzZQorICAgIHRpbWVfdCBub3RfYmVmb3JlOworICAgIHRpbWVfdCBub3RfYWZ0ZXI7CisjZW5kaWYKKyAgICB1aW50OF90ICpzaWduYXR1cmU7CisgICAgdWludDE2X3Qgc2lnX2xlbjsKKyAgICB1aW50OF90IHNpZ190eXBlOworICAgIFJTQV9DVFggKnJzYV9jdHg7CisgICAgYmlnaW50ICpkaWdlc3Q7CisgICAgc3RydWN0IF94NTA5X2N0eCAqbmV4dDsKK307CisKK3R5cGVkZWYgc3RydWN0IF94NTA5X2N0eCBYNTA5X0NUWDsKKworI2lmZGVmIENPTkZJR19TU0xfQ0VSVF9WRVJJRklDQVRJT04KK3R5cGVkZWYgc3RydWN0IAoreworICAgIFg1MDlfQ1RYICpjZXJ0W0NPTkZJR19YNTA5X01BWF9DQV9DRVJUU107Cit9IENBX0NFUlRfQ1RYOworI2VuZGlmCisKK2ludCBhc24xX2dldF9wcml2YXRlX2tleShjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sIFJTQV9DVFggKipyc2FfY3R4KTsKK2ludCBhc24xX25leHRfb2JqKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50ICpvZmZzZXQsIGludCBvYmpfdHlwZSk7CitpbnQgYXNuMV9za2lwX29iaihjb25zdCB1aW50OF90ICpidWYsIGludCAqb2Zmc2V0LCBpbnQgb2JqX3R5cGUpOworaW50IGFzbjFfZ2V0X2ludChjb25zdCB1aW50OF90ICpidWYsIGludCAqb2Zmc2V0LCB1aW50OF90ICoqb2JqZWN0KTsKK2ludCB4NTA5X25ldyhjb25zdCB1aW50OF90ICpjZXJ0LCBpbnQgKmxlbiwgWDUwOV9DVFggKipjdHgpOwordm9pZCB4NTA5X2ZyZWUoWDUwOV9DVFggKng1MDlfY3R4KTsKKyNpZmRlZiBDT05GSUdfU1NMX0NFUlRfVkVSSUZJQ0FUSU9OCitpbnQgeDUwOV92ZXJpZnkoY29uc3QgQ0FfQ0VSVF9DVFggKmNhX2NlcnRfY3R4LCBjb25zdCBYNTA5X0NUWCAqY2VydCk7Citjb25zdCB1aW50OF90ICp4NTA5X2dldF9zaWduYXR1cmUoY29uc3QgdWludDhfdCAqYXNuMV9zaWduYXR1cmUsIGludCAqbGVuKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TU0xfRlVMTF9NT0RFCit2b2lkIHg1MDlfcHJpbnQoQ0FfQ0VSVF9DVFggKmNhX2NlcnRfY3R4LCBjb25zdCBYNTA5X0NUWCAqY2VydCk7Cit2b2lkIHg1MDlfZGlzcGxheV9lcnJvcihpbnQgZXJyb3IpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUlTQyBkZWNsYXJhdGlvbnMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBjb25zdCBjaGFyICogY29uc3QgdW5zdXBwb3J0ZWRfc3RyOworCit0eXBlZGVmIHZvaWQgKCpjcnlwdF9mdW5jKSh2b2lkICosIGNvbnN0IHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQpOwordHlwZWRlZiB2b2lkICgqaG1hY19mdW5jKShjb25zdCB1aW50OF90ICptc2csIGludCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKmtleSwgCisgICAgICAgIGludCBrZXlfbGVuLCB1aW50OF90ICpkaWdlc3QpOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgKnByZV9kYXRhOwkvKiBpbmNsdWRlIHRoZSBzc2wgcmVjb3JkIGJ5dGVzICovCisgICAgdWludDhfdCAqZGF0YTsJLyogdGhlIHJlZ3VsYXIgc3NsIGRhdGEgKi8KKyAgICBpbnQgbWF4X2xlbjsKKyAgICBpbnQgaW5kZXg7Cit9IEJVRl9NRU07CisKK0JVRl9NRU0gYnVmX25ldyh2b2lkKTsKK3ZvaWQgYnVmX2dyb3coQlVGX01FTSAqYm0sIGludCBsZW4pOwordm9pZCBidWZfZnJlZShCVUZfTUVNICpibSk7CitpbnQgZ2V0X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHVpbnQ4X3QgKipidWYpOworCisjaWYgZGVmaW5lZChDT05GSUdfU1NMX0ZVTExfTU9ERSkgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChDT05GSUdfREVCVUcpCit2b2lkIHByaW50X2Jsb2IoY29uc3QgY2hhciAqZm9ybWF0LCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSwgLi4uKTsKKyNlbHNlCisgICAgI2RlZmluZSBwcmludF9ibG9iKC4uLikKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9jcnlwdG8vYXh0bHMvb3NfcG9ydC5oIGIvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL29zX3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWJkYmZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL29zX3BvcnQuaApAQCAtMCwwICsxLDYxIEBACisvKioKKyAqIEBmaWxlIG9zX3BvcnQuaAorICoKKyAqIFRyaWNrIHRoZSBheHRscyBjb2RlIGludG8gYnVpbGRpbmcgd2l0aGluIG91ciBidWlsZCBlbnZpcm9ubWVudC4KKyAqLworCisjaWZuZGVmIEhFQURFUl9PU19QT1JUX0gKKyNkZWZpbmUgSEVBREVSX09TX1BPUlRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKworI2RlZmluZSBTVERDQUxMCisjZGVmaW5lIEVYUF9GVU5DCisjZGVmaW5lIFRUWV9GTFVTSCgpCisKKy8qKiBXZSBjYW4ndCBhY3R1YWxseSBhYm9ydCwgc2luY2Ugd2UgYXJlIGVmZmVjdGl2ZWx5IGEga2VybmVsLi4uICovCisjZGVmaW5lIGFib3J0KCkgYXNzZXJ0ICggMCApCisKKy8qKiBjcnlwdG9fbWlzYy5jIGhhcyBhIGJhZCAjaWZkZWYgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9zZSAoIGludCBmZCBfX3VudXNlZCApIHsKKwkvKiBEbyBub3RoaW5nICovCit9CisKK3R5cGVkZWYgdm9pZCBGSUxFOworCitzdGF0aWMgaW5saW5lIEZJTEUgKiBmb3BlbiAoIGNvbnN0IGNoYXIgKmZpbGVuYW1lIF9fdW51c2VkLAorCQkJICAgICBjb25zdCBjaGFyICptb2RlIF9fdW51c2VkICkgeworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBmc2VlayAoIEZJTEUgKnN0cmVhbSBfX3VudXNlZCwgbG9uZyBvZmZzZXQgX191bnVzZWQsCisJCQkgIGludCB3aGVuY2UgX191bnVzZWQgKSB7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgZnRlbGwgKCBGSUxFICpzdHJlYW0gX191bnVzZWQgKSB7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBmcmVhZCAoIHZvaWQgKnB0ciBfX3VudXNlZCwgc2l6ZV90IHNpemUgX191bnVzZWQsCisJCQkgICAgIHNpemVfdCBubWVtYiBfX3VudXNlZCwgRklMRSAqc3RyZWFtIF9fdW51c2VkICkgeworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmNsb3NlICggRklMRSAqc3RyZWFtIF9fdW51c2VkICkgeworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBDT05GSUdfU1NMX0NFUlRfVkVSSUZJQ0FUSU9OIDEKKyNkZWZpbmUgQ09ORklHX1NTTF9NQVhfQ0VSVFMgMQorI2RlZmluZSBDT05GSUdfWDUwOV9NQVhfQ0FfQ0VSVFMgMQorI2RlZmluZSBDT05GSUdfU1NMX0VYUElSWV9USU1FIDI0CisjZGVmaW5lIENPTkZJR19TU0xfRU5BQkxFX0NMSUVOVCAxCisjZGVmaW5lIENPTkZJR19CSUdJTlRfQ0xBU1NJQ0FMIDEKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL3JzYS5jIGIvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzL3JzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OWVkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jcnlwdG8vYXh0bHMvcnNhLmMKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiAgQ29weXJpZ2h0KEMpIDIwMDYgQ2FtZXJvbiBSaWNoCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvKioKKyAqIEltcGxlbWVudHMgdGhlIFJTQSBwdWJsaWMgZW5jcnlwdGlvbiBhbGdvcml0aG0uIFVzZXMgdGhlIGJpZ2ludCBsaWJyYXJ5IHRvCisgKiBwZXJmb3JtIGl0cyBjYWxjdWxhdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNyeXB0by5oIgorCisjaWZkZWYgQ09ORklHX0JJR0lOVF9DUlQKK3N0YXRpYyBiaWdpbnQgKmJpX2NydChjb25zdCBSU0FfQ1RYICpyc2EsIGJpZ2ludCAqYmkpOworI2VuZGlmCisKK3ZvaWQgUlNBX3ByaXZfa2V5X25ldyhSU0FfQ1RYICoqY3R4LCAKKyAgICAgICAgY29uc3QgdWludDhfdCAqbW9kdWx1cywgaW50IG1vZF9sZW4sCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB1Yl9leHAsIGludCBwdWJfbGVuLAorICAgICAgICBjb25zdCB1aW50OF90ICpwcml2X2V4cCwgaW50IHByaXZfbGVuCisjaWYgQ09ORklHX0JJR0lOVF9DUlQKKyAgICAgICwgY29uc3QgdWludDhfdCAqcCwgaW50IHBfbGVuLAorICAgICAgICBjb25zdCB1aW50OF90ICpxLCBpbnQgcV9sZW4sCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRQLCBpbnQgZFBfbGVuLAorICAgICAgICBjb25zdCB1aW50OF90ICpkUSwgaW50IGRRX2xlbiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcUludiwgaW50IHFJbnZfbGVuCisjZW5kaWYKKyAgICApCit7CisgICAgUlNBX0NUWCAqcnNhX2N0eDsKKyAgICBCSV9DVFggKmJpX2N0eDsKKyAgICBSU0FfcHViX2tleV9uZXcoY3R4LCBtb2R1bHVzLCBtb2RfbGVuLCBwdWJfZXhwLCBwdWJfbGVuKTsKKyAgICByc2FfY3R4ID0gKmN0eDsKKyAgICBiaV9jdHggPSByc2FfY3R4LT5iaV9jdHg7CisgICAgcnNhX2N0eC0+ZCA9IGJpX2ltcG9ydChiaV9jdHgsIHByaXZfZXhwLCBwcml2X2xlbik7CisgICAgYmlfcGVybWFuZW50KHJzYV9jdHgtPmQpOworCisjaWZkZWYgQ09ORklHX0JJR0lOVF9DUlQKKyAgICByc2FfY3R4LT5wID0gYmlfaW1wb3J0KGJpX2N0eCwgcCwgcF9sZW4pOworICAgIHJzYV9jdHgtPnEgPSBiaV9pbXBvcnQoYmlfY3R4LCBxLCBxX2xlbik7CisgICAgcnNhX2N0eC0+ZFAgPSBiaV9pbXBvcnQoYmlfY3R4LCBkUCwgZFBfbGVuKTsKKyAgICByc2FfY3R4LT5kUSA9IGJpX2ltcG9ydChiaV9jdHgsIGRRLCBkUV9sZW4pOworICAgIHJzYV9jdHgtPnFJbnYgPSBiaV9pbXBvcnQoYmlfY3R4LCBxSW52LCBxSW52X2xlbik7CisgICAgYmlfcGVybWFuZW50KHJzYV9jdHgtPmRQKTsKKyAgICBiaV9wZXJtYW5lbnQocnNhX2N0eC0+ZFEpOworICAgIGJpX3Blcm1hbmVudChyc2FfY3R4LT5xSW52KTsKKyAgICBiaV9zZXRfbW9kKGJpX2N0eCwgcnNhX2N0eC0+cCwgQklHSU5UX1BfT0ZGU0VUKTsKKyAgICBiaV9zZXRfbW9kKGJpX2N0eCwgcnNhX2N0eC0+cSwgQklHSU5UX1FfT0ZGU0VUKTsKKyNlbmRpZgorfQorCit2b2lkIFJTQV9wdWJfa2V5X25ldyhSU0FfQ1RYICoqY3R4LCAKKyAgICAgICAgY29uc3QgdWludDhfdCAqbW9kdWx1cywgaW50IG1vZF9sZW4sCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB1Yl9leHAsIGludCBwdWJfbGVuKQoreworICAgIFJTQV9DVFggKnJzYV9jdHg7CisgICAgQklfQ1RYICpiaV9jdHggPSBiaV9pbml0aWFsaXplKCk7CisgICAgKmN0eCA9IChSU0FfQ1RYICopY2FsbG9jKDEsIHNpemVvZihSU0FfQ1RYKSk7CisgICAgcnNhX2N0eCA9ICpjdHg7CisgICAgcnNhX2N0eC0+YmlfY3R4ID0gYmlfY3R4OworICAgIHJzYV9jdHgtPm51bV9vY3RldHMgPSAobW9kX2xlbiAmIDB4RkZGMCk7CisgICAgcnNhX2N0eC0+bSA9IGJpX2ltcG9ydChiaV9jdHgsIG1vZHVsdXMsIG1vZF9sZW4pOworICAgIGJpX3NldF9tb2QoYmlfY3R4LCByc2FfY3R4LT5tLCBCSUdJTlRfTV9PRkZTRVQpOworICAgIHJzYV9jdHgtPmUgPSBiaV9pbXBvcnQoYmlfY3R4LCBwdWJfZXhwLCBwdWJfbGVuKTsKKyAgICBiaV9wZXJtYW5lbnQocnNhX2N0eC0+ZSk7Cit9CisKKy8qKgorICogRnJlZSB1cCBhbnkgUlNBIGNvbnRleHQgcmVzb3VyY2VzLgorICovCit2b2lkIFJTQV9mcmVlKFJTQV9DVFggKnJzYV9jdHgpCit7CisgICAgQklfQ1RYICpiaV9jdHg7CisgICAgaWYgKHJzYV9jdHggPT0gTlVMTCkgICAgICAgICAgICAgICAgLyogZGVhbCB3aXRoIHB0cnMgdGhhdCBhcmUgbnVsbCAqLworICAgICAgICByZXR1cm47CisKKyAgICBiaV9jdHggPSByc2FfY3R4LT5iaV9jdHg7CisKKyAgICBiaV9kZXBlcm1hbmVudChyc2FfY3R4LT5lKTsKKyAgICBiaV9mcmVlKGJpX2N0eCwgcnNhX2N0eC0+ZSk7CisgICAgYmlfZnJlZV9tb2QocnNhX2N0eC0+YmlfY3R4LCBCSUdJTlRfTV9PRkZTRVQpOworCisgICAgaWYgKHJzYV9jdHgtPmQpCisgICAgeworICAgICAgICBiaV9kZXBlcm1hbmVudChyc2FfY3R4LT5kKTsKKyAgICAgICAgYmlfZnJlZShiaV9jdHgsIHJzYV9jdHgtPmQpOworI2lmZGVmIENPTkZJR19CSUdJTlRfQ1JUCisgICAgICAgIGJpX2RlcGVybWFuZW50KHJzYV9jdHgtPmRQKTsKKyAgICAgICAgYmlfZGVwZXJtYW5lbnQocnNhX2N0eC0+ZFEpOworICAgICAgICBiaV9kZXBlcm1hbmVudChyc2FfY3R4LT5xSW52KTsKKyAgICAgICAgYmlfZnJlZShiaV9jdHgsIHJzYV9jdHgtPmRQKTsKKyAgICAgICAgYmlfZnJlZShiaV9jdHgsIHJzYV9jdHgtPmRRKTsKKyAgICAgICAgYmlfZnJlZShiaV9jdHgsIHJzYV9jdHgtPnFJbnYpOworICAgICAgICBiaV9mcmVlX21vZChyc2FfY3R4LT5iaV9jdHgsIEJJR0lOVF9QX09GRlNFVCk7CisgICAgICAgIGJpX2ZyZWVfbW9kKHJzYV9jdHgtPmJpX2N0eCwgQklHSU5UX1FfT0ZGU0VUKTsKKyNlbmRpZgorICAgIH0KKworICAgIGJpX3Rlcm1pbmF0ZShiaV9jdHgpOworICAgIGZyZWUocnNhX2N0eCk7Cit9CisKKy8qKgorICogQGJyaWVmIFVzZSBQS0NTMS41IGZvciBkZWNyeXB0aW9uL3ZlcmlmaWNhdGlvbi4KKyAqIEBwYXJhbSBjdHggW2luXSBUaGUgY29udGV4dAorICogQHBhcmFtIGluX2RhdGEgW2luXSBUaGUgZGF0YSB0byBlbmNyeXB0IChtdXN0IGJlIDwgbW9kdWx1cyBzaXplLTExKQorICogQHBhcmFtIG91dF9kYXRhIFtvdXRdIFRoZSBlbmNyeXB0ZWQgZGF0YS4KKyAqIEBwYXJhbSBpc19kZWNyeXB0aW9uIFtpbl0gRGVjcnlwdGlvbiBvciB2ZXJpZnkgb3BlcmF0aW9uLgorICogQHJldHVybiAgVGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgb3JpZ2luYWxseSBlbmNyeXB0ZWQuIC0xIG9uIGVycm9yLgorICogQHNlZSBodHRwOi8vd3d3LnJzYXNlY3VyaXR5LmNvbS9yc2FsYWJzL25vZGUuYXNwP2lkPTIxMjUKKyAqLworaW50IFJTQV9kZWNyeXB0KGNvbnN0IFJTQV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqaW5fZGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0X2RhdGEsIGludCBpc19kZWNyeXB0aW9uKQoreworICAgIGludCBieXRlX3NpemUgPSBjdHgtPm51bV9vY3RldHM7CisgICAgdWludDhfdCAqYmxvY2s7CisgICAgaW50IGksIHNpemU7CisgICAgYmlnaW50ICpkZWNyeXB0ZWRfYmksICpkYXRfYmk7CisKKyAgICBtZW1zZXQob3V0X2RhdGEsIDAsIGJ5dGVfc2l6ZSk7IC8qIGluaXRpYWxpc2UgKi8KKworICAgIC8qIGRlY3J5cHQgKi8KKyAgICBkYXRfYmkgPSBiaV9pbXBvcnQoY3R4LT5iaV9jdHgsIGluX2RhdGEsIGJ5dGVfc2l6ZSk7CisjaWZkZWYgQ09ORklHX1NTTF9DRVJUX1ZFUklGSUNBVElPTgorICAgIGRlY3J5cHRlZF9iaSA9IGlzX2RlY3J5cHRpb24gPyAgLyogZGVjcnlwdCBvciB2ZXJpZnk/ICovCisgICAgICAgICAgICBSU0FfcHJpdmF0ZShjdHgsIGRhdF9iaSkgOiBSU0FfcHVibGljKGN0eCwgZGF0X2JpKTsKKyNlbHNlICAgLyogYWx3YXlzIGEgZGVjcnlwdGlvbiAqLworICAgIGRlY3J5cHRlZF9iaSA9IFJTQV9wcml2YXRlKGN0eCwgZGF0X2JpKTsKKyNlbmRpZgorCisgICAgLyogY29udmVydCB0byBhIG5vcm1hbCBibG9jayAqLworICAgIGJsb2NrID0gKHVpbnQ4X3QgKiltYWxsb2MoYnl0ZV9zaXplKTsKKyAgICBiaV9leHBvcnQoY3R4LT5iaV9jdHgsIGRlY3J5cHRlZF9iaSwgYmxvY2ssIGJ5dGVfc2l6ZSk7CisKKyAgICBpID0gMTA7IC8qIHN0YXJ0IGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBub24tcGFkZGVkIGJ5dGUgKi8KKworI2lmZGVmIENPTkZJR19TU0xfQ0VSVF9WRVJJRklDQVRJT04KKyAgICBpZiAoaXNfZGVjcnlwdGlvbiA9PSAwKSAvKiBQS0NTMS41IHNpZ25pbmcgcGFkcyB3aXRoICIweGZmInMgKi8KKyAgICB7CisgICAgICAgIHdoaWxlIChibG9ja1tpKytdID09IDB4ZmYgJiYgaSA8IGJ5dGVfc2l6ZSk7CisKKyAgICAgICAgaWYgKGJsb2NrW2ktMl0gIT0gMHhmZikKKyAgICAgICAgICAgIGkgPSBieXRlX3NpemU7ICAgICAvKmVuc3VyZSBzaXplIGlzIDAgKi8gICAKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogUEtDUzEuNSBlbmNyeXB0aW9uIHBhZGRpbmcgaXMgcmFuZG9tICovCisjZW5kaWYKKyAgICB7CisgICAgICAgIHdoaWxlIChibG9ja1tpKytdICYmIGkgPCBieXRlX3NpemUpOworICAgIH0KKyAgICBzaXplID0gYnl0ZV9zaXplIC0gaTsKKworICAgIC8qIGdldCBvbmx5IHRoZSBiaXQgd2Ugd2FudCAqLworICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgbWVtY3B5KG91dF9kYXRhLCAmYmxvY2tbaV0sIHNpemUpOworICAgIAorICAgIGZyZWUoYmxvY2spOworICAgIHJldHVybiBzaXplID8gc2l6ZSA6IC0xOworfQorCisvKioKKyAqIFBlcmZvcm1zIG0gPSBjXmQgbW9kIG4KKyAqLworYmlnaW50ICpSU0FfcHJpdmF0ZShjb25zdCBSU0FfQ1RYICpjLCBiaWdpbnQgKmJpX21zZykKK3sKKyNpZmRlZiBDT05GSUdfQklHSU5UX0NSVAorICAgIHJldHVybiBiaV9jcnQoYywgYmlfbXNnKTsKKyNlbHNlCisgICAgQklfQ1RYICpjdHggPSBjLT5iaV9jdHg7CisgICAgY3R4LT5tb2Rfb2Zmc2V0ID0gQklHSU5UX01fT0ZGU0VUOworICAgIHJldHVybiBiaV9tb2RfcG93ZXIoY3R4LCBiaV9tc2csIGMtPmQpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfQklHSU5UX0NSVAorLyoqCisgKiBVc2UgdGhlIENoaW5lc2UgUmVtYWluZGVyIFRoZW9yZW0gdG8gcXVpY2tseSBwZXJmb3JtIFJTQSBkZWNyeXB0cy4KKyAqIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBpbiBiaWdpbnQuYyAoYW5kIHdhcyBhdCBvbmUgc3RhZ2UpLCBidXQgbmVlZHMgCisgKiBhY2Nlc3MgdG8gdGhlIFJTQV9DVFggY29udGV4dC4uLgorICovCitzdGF0aWMgYmlnaW50ICpiaV9jcnQoY29uc3QgUlNBX0NUWCAqcnNhLCBiaWdpbnQgKmJpKQoreworICAgIEJJX0NUWCAqY3R4ID0gcnNhLT5iaV9jdHg7CisgICAgYmlnaW50ICptMSwgKm0yLCAqaDsKKworICAgIC8qIE1vbnRnb21lcnkgaGFzIGEgY29uZGl0aW9uIHRoZSAwIDwgeCwgeSA8IG0gYW5kIHRoZXNlIHByb2R1Y3RzIHZpb2xhdGUKKyAgICAgKiB0aGF0IGNvbmRpdGlvbi4gU28gZGlzYWJsZSBNb250Z29tZXJ5IHdoZW4gdXNpbmcgQ1JUICovCisjaWYgZGVmaW5lZChDT05GSUdfQklHSU5UX01PTlRHT01FUlkpCisgICAgY3R4LT51c2VfY2xhc3NpY2FsID0gMTsKKyNlbmRpZgorICAgIGN0eC0+bW9kX29mZnNldCA9IEJJR0lOVF9QX09GRlNFVDsKKyAgICBtMSA9IGJpX21vZF9wb3dlcihjdHgsIGJpX2NvcHkoYmkpLCByc2EtPmRQKTsKKworICAgIGN0eC0+bW9kX29mZnNldCA9IEJJR0lOVF9RX09GRlNFVDsKKyAgICBtMiA9IGJpX21vZF9wb3dlcihjdHgsIGJpLCByc2EtPmRRKTsKKworICAgIGggPSBiaV9zdWJ0cmFjdChjdHgsIGJpX2FkZChjdHgsIG0xLCByc2EtPnApLCBiaV9jb3B5KG0yKSwgTlVMTCk7CisgICAgaCA9IGJpX211bHRpcGx5KGN0eCwgaCwgcnNhLT5xSW52KTsKKyAgICBjdHgtPm1vZF9vZmZzZXQgPSBCSUdJTlRfUF9PRkZTRVQ7CisgICAgaCA9IGJpX3Jlc2lkdWUoY3R4LCBoKTsKKyNpZiBkZWZpbmVkKENPTkZJR19CSUdJTlRfTU9OVEdPTUVSWSkKKyAgICBjdHgtPnVzZV9jbGFzc2ljYWwgPSAwOyAgICAgICAgIC8qIHJlc2V0IGZvciBhbnkgZnVydGhlciBvcGVyYXRpb24gKi8KKyNlbmRpZgorICAgIHJldHVybiBiaV9hZGQoY3R4LCBtMiwgYmlfbXVsdGlwbHkoY3R4LCByc2EtPnEsIGgpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NTTF9GVUxMX01PREUKKy8qKgorICogVXNlZCBmb3IgZGlhZ25vc3RpY3MuCisgKi8KK3ZvaWQgUlNBX3ByaW50KGNvbnN0IFJTQV9DVFggKnJzYV9jdHgpIAoreworICAgIGlmIChyc2FfY3R4ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0gICBSU0EgREVCVUcgICAtLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBwcmludGYoIlNpemU6XHQlZFxuIiwgcnNhX2N0eC0+bnVtX29jdGV0cyk7CisgICAgYmlfcHJpbnQoIk1vZHVsdXMiLCByc2FfY3R4LT5tKTsKKyAgICBiaV9wcmludCgiUHVibGljIEtleSIsIHJzYV9jdHgtPmUpOworICAgIGJpX3ByaW50KCJQcml2YXRlIEtleSIsIHJzYV9jdHgtPmQpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1NMX0NFUlRfVkVSSUZJQ0FUSU9OCisvKioKKyAqIFBlcmZvcm1zIGMgPSBtXmUgbW9kIG4KKyAqLworYmlnaW50ICpSU0FfcHVibGljKGNvbnN0IFJTQV9DVFggKiBjLCBiaWdpbnQgKmJpX21zZykKK3sKKyAgICBjLT5iaV9jdHgtPm1vZF9vZmZzZXQgPSBCSUdJTlRfTV9PRkZTRVQ7CisgICAgcmV0dXJuIGJpX21vZF9wb3dlcihjLT5iaV9jdHgsIGJpX21zZywgYy0+ZSk7Cit9CisKKy8qKgorICogVXNlIFBLQ1MxLjUgZm9yIGVuY3J5cHRpb24vc2lnbmluZy4KKyAqIHNlZSBodHRwOi8vd3d3LnJzYXNlY3VyaXR5LmNvbS9yc2FsYWJzL25vZGUuYXNwP2lkPTIxMjUKKyAqLworaW50IFJTQV9lbmNyeXB0KGNvbnN0IFJTQV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqaW5fZGF0YSwgdWludDE2X3QgaW5fbGVuLCAKKyAgICAgICAgdWludDhfdCAqb3V0X2RhdGEsIGludCBpc19zaWduaW5nKQoreworICAgIGludCBieXRlX3NpemUgPSBjdHgtPm51bV9vY3RldHM7CisgICAgaW50IG51bV9wYWRzX25lZWRlZCA9IGJ5dGVfc2l6ZS1pbl9sZW4tMzsKKyAgICBiaWdpbnQgKmRhdF9iaSwgKmVuY3J5cHRfYmk7CisKKyAgICAvKiBub3RlOiBpbl9sZW4rMTEgbXVzdCBiZSA+IGJ5dGVfc2l6ZSAqLworICAgIG91dF9kYXRhWzBdID0gMDsgICAgIC8qIGVuc3VyZSBlbmNyeXB0aW9uIGJsb2NrIGlzIDwgbW9kdWx1cyAqLworCisgICAgaWYgKGlzX3NpZ25pbmcpCisgICAgeworICAgICAgICBvdXRfZGF0YVsxXSA9IDE7ICAgICAgICAvKiBQS0NTMS41IHNpZ25pbmcgcGFkcyB3aXRoICIweGZmIidzICovCisgICAgICAgIG1lbXNldCgmb3V0X2RhdGFbMl0sIDB4ZmYsIG51bV9wYWRzX25lZWRlZCk7CisgICAgfQorICAgIGVsc2UgLyogcmFuZG9taXplIHRoZSBlbmNyeXB0aW9uIHBhZGRpbmcgd2l0aCBub24temVybyBieXRlcyAqLyAgIAorICAgIHsKKyAgICAgICAgb3V0X2RhdGFbMV0gPSAyOworICAgICAgICBnZXRfcmFuZG9tX05aKG51bV9wYWRzX25lZWRlZCwgJm91dF9kYXRhWzJdKTsKKyAgICB9CisKKyAgICBvdXRfZGF0YVsyK251bV9wYWRzX25lZWRlZF0gPSAwOworICAgIG1lbWNweSgmb3V0X2RhdGFbMytudW1fcGFkc19uZWVkZWRdLCBpbl9kYXRhLCBpbl9sZW4pOworCisgICAgLyogbm93IGVuY3J5cHQgaXQgKi8KKyAgICBkYXRfYmkgPSBiaV9pbXBvcnQoY3R4LT5iaV9jdHgsIG91dF9kYXRhLCBieXRlX3NpemUpOworICAgIGVuY3J5cHRfYmkgPSBpc19zaWduaW5nID8gUlNBX3ByaXZhdGUoY3R4LCBkYXRfYmkpIDogCisgICAgICAgIFJTQV9wdWJsaWMoY3R4LCBkYXRfYmkpOworICAgIGJpX2V4cG9ydChjdHgtPmJpX2N0eCwgZW5jcnlwdF9iaSwgb3V0X2RhdGEsIGJ5dGVfc2l6ZSk7CisgICAgcmV0dXJuIGJ5dGVfc2l6ZTsKK30KKworI2lmIDAKKy8qKgorICogVGFrZSBhIHNpZ25hdHVyZSBhbmQgZGVjcnlwdCBpdC4KKyAqLworYmlnaW50ICpSU0Ffc2lnbl92ZXJpZnkoQklfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNpZywgaW50IHNpZ19sZW4sCisgICAgICAgIGJpZ2ludCAqbW9kdWx1cywgYmlnaW50ICpwdWJfZXhwKQoreworICAgIHVpbnQ4X3QgKmJsb2NrOworICAgIGludCBpLCBzaXplOworICAgIGJpZ2ludCAqZGVjcnlwdGVkX2JpLCAqZGF0X2JpOworICAgIGJpZ2ludCAqYmlyID0gTlVMTDsKKworICAgIGJsb2NrID0gKHVpbnQ4X3QgKiltYWxsb2Moc2lnX2xlbik7CisKKyAgICAvKiBkZWNyeXB0ICovCisgICAgZGF0X2JpID0gYmlfaW1wb3J0KGN0eCwgc2lnLCBzaWdfbGVuKTsKKyAgICBjdHgtPm1vZF9vZmZzZXQgPSBCSUdJTlRfTV9PRkZTRVQ7CisKKyAgICAvKiBjb252ZXJ0IHRvIGEgbm9ybWFsIGJsb2NrICovCisgICAgZGVjcnlwdGVkX2JpID0gYmlfbW9kX3Bvd2VyMihjdHgsIGRhdF9iaSwgbW9kdWx1cywgcHViX2V4cCk7CisKKyAgICBiaV9leHBvcnQoY3R4LCBkZWNyeXB0ZWRfYmksIGJsb2NrLCBzaWdfbGVuKTsKKyAgICBjdHgtPm1vZF9vZmZzZXQgPSBCSUdJTlRfTV9PRkZTRVQ7CisKKyAgICBpID0gMTA7IC8qIHN0YXJ0IGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBub24tcGFkZGVkIGJ5dGUgKi8KKyAgICB3aGlsZSAoYmxvY2tbaSsrXSAmJiBpIDwgc2lnX2xlbik7CisgICAgc2l6ZSA9IHNpZ19sZW4gLSBpOworCisgICAgLyogZ2V0IG9ubHkgdGhlIGJpdCB3ZSB3YW50ICovCisgICAgaWYgKHNpemUgPiAwKQorICAgIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc2lnX3B0ciA9IHg1MDlfZ2V0X3NpZ25hdHVyZSgmYmxvY2tbaV0sICZsZW4pOworCisgICAgICAgIGlmIChzaWdfcHRyKQorICAgICAgICB7CisgICAgICAgICAgICBiaXIgPSBiaV9pbXBvcnQoY3R4LCBzaWdfcHRyLCBsZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgZnJlZShibG9jayk7CisgICAgcmV0dXJuIGJpcjsKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIENPTkZJR19TU0xfQ0VSVF9WRVJJRklDQVRJT04gKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by9heHRscy9zaGExLmMgYi9ncHhlL3NyYy9jcnlwdG8vYXh0bHMvc2hhMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDI4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jcnlwdG8vYXh0bHMvc2hhMS5jCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogIENvcHlyaWdodChDKSAyMDA2IENhbWVyb24gUmljaAorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLyoqCisgKiBTSEExIGltcGxlbWVudGF0aW9uIC0gYXMgZGVmaW5lZCBpbiBGSVBTIFBVQiAxODAtMSBwdWJsaXNoZWQgQXByaWwgMTcsIDE5OTUuCisgKiBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgdGFrZW4gZnJvbSBSRkMzMTc0CisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImNyeXB0by5oIgorCisvKgorICogIERlZmluZSB0aGUgU0hBMSBjaXJjdWxhciBsZWZ0IHNoaWZ0IG1hY3JvCisgKi8KKyNkZWZpbmUgU0hBMUNpcmN1bGFyU2hpZnQoYml0cyx3b3JkKSBcCisgICAgICAgICAgICAgICAgKCgod29yZCkgPDwgKGJpdHMpKSB8ICgod29yZCkgPj4gKDMyLShiaXRzKSkpKQorCisvKiAtLS0tLSBzdGF0aWMgZnVuY3Rpb25zIC0tLS0tICovCitzdGF0aWMgdm9pZCBTSEExUGFkTWVzc2FnZShTSEExX0NUWCAqY3R4KTsKK3N0YXRpYyB2b2lkIFNIQTFQcm9jZXNzTWVzc2FnZUJsb2NrKFNIQTFfQ1RYICpjdHgpOworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIFNIQTEgY29udGV4dCAKKyAqLwordm9pZCBTSEExSW5pdChTSEExX0NUWCAqY3R4KQoreworICAgIGN0eC0+TGVuZ3RoX0xvdyAgICAgICAgICAgICA9IDA7CisgICAgY3R4LT5MZW5ndGhfSGlnaCAgICAgICAgICAgID0gMDsKKyAgICBjdHgtPk1lc3NhZ2VfQmxvY2tfSW5kZXggICAgPSAwOworICAgIGN0eC0+SW50ZXJtZWRpYXRlX0hhc2hbMF0gICA9IDB4Njc0NTIzMDE7CisgICAgY3R4LT5JbnRlcm1lZGlhdGVfSGFzaFsxXSAgID0gMHhFRkNEQUI4OTsKKyAgICBjdHgtPkludGVybWVkaWF0ZV9IYXNoWzJdICAgPSAweDk4QkFEQ0ZFOworICAgIGN0eC0+SW50ZXJtZWRpYXRlX0hhc2hbM10gICA9IDB4MTAzMjU0NzY7CisgICAgY3R4LT5JbnRlcm1lZGlhdGVfSGFzaFs0XSAgID0gMHhDM0QyRTFGMDsKK30KKworLyoqCisgKiBBY2NlcHRzIGFuIGFycmF5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dCBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlLgorICovCit2b2lkIFNIQTFVcGRhdGUoU0hBMV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqbXNnLCBpbnQgbGVuKQoreworICAgIHdoaWxlIChsZW4tLSkKKyAgICB7CisgICAgICAgIGN0eC0+TWVzc2FnZV9CbG9ja1tjdHgtPk1lc3NhZ2VfQmxvY2tfSW5kZXgrK10gPSAoKm1zZyAmIDB4RkYpOworCisgICAgICAgIGN0eC0+TGVuZ3RoX0xvdyArPSA4OworICAgICAgICBpZiAoY3R4LT5MZW5ndGhfTG93ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0eC0+TGVuZ3RoX0hpZ2grKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdHgtPk1lc3NhZ2VfQmxvY2tfSW5kZXggPT0gNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNIQTFQcm9jZXNzTWVzc2FnZUJsb2NrKGN0eCk7CisgICAgICAgIH0KKworICAgICAgICBtc2crKzsKKyAgICB9Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSAxNjAtYml0IG1lc3NhZ2UgZGlnZXN0IGludG8gdGhlIHVzZXIncyBhcnJheQorICovCit2b2lkIFNIQTFGaW5hbChTSEExX0NUWCAqY3R4LCB1aW50OF90ICpkaWdlc3QpCit7CisgICAgaW50IGk7CisKKyAgICBTSEExUGFkTWVzc2FnZShjdHgpOworICAgIG1lbXNldChjdHgtPk1lc3NhZ2VfQmxvY2ssIDAsIDY0KTsKKyAgICBjdHgtPkxlbmd0aF9Mb3cgPSAwOyAgICAvKiBhbmQgY2xlYXIgbGVuZ3RoICovCisgICAgY3R4LT5MZW5ndGhfSGlnaCA9IDA7CisKKyAgICBmb3IgIChpID0gMDsgaSA8IFNIQTFfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgZGlnZXN0W2ldID0gY3R4LT5JbnRlcm1lZGlhdGVfSGFzaFtpPj4yXSA+PiA4ICogKCAzIC0gKCBpICYgMHgwMyApICk7CisgICAgfQorfQorCisvKioKKyAqIFByb2Nlc3MgdGhlIG5leHQgNTEyIGJpdHMgb2YgdGhlIG1lc3NhZ2Ugc3RvcmVkIGluIHRoZSBhcnJheS4KKyAqLworc3RhdGljIHZvaWQgU0hBMVByb2Nlc3NNZXNzYWdlQmxvY2soU0hBMV9DVFggKmN0eCkKK3sKKyAgICBjb25zdCB1aW50MzJfdCBLW10gPSAgICB7ICAgICAgIC8qIENvbnN0YW50cyBkZWZpbmVkIGluIFNIQS0xICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVBODI3OTk5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NkVEOUVCQTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RjFCQkNEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweENBNjJDMUQ2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICBpbnQgICAgICAgIHQ7ICAgICAgICAgICAgICAgICAvKiBMb29wIGNvdW50ZXIgICAgICAgICAgICAgICAgKi8KKyAgICB1aW50MzJfdCAgICAgIHRlbXA7ICAgICAgICAgICAgICAvKiBUZW1wb3Jhcnkgd29yZCB2YWx1ZSAgICAgICAgKi8KKyAgICB1aW50MzJfdCAgICAgIFdbODBdOyAgICAgICAgICAgICAvKiBXb3JkIHNlcXVlbmNlICAgICAgICAgICAgICAgKi8KKyAgICB1aW50MzJfdCAgICAgIEEsIEIsIEMsIEQsIEU7ICAgICAvKiBXb3JkIGJ1ZmZlcnMgICAgICAgICAgICAgICAgKi8KKworICAgIC8qCisgICAgICogIEluaXRpYWxpemUgdGhlIGZpcnN0IDE2IHdvcmRzIGluIHRoZSBhcnJheSBXCisgICAgICovCisgICAgZm9yICAodCA9IDA7IHQgPCAxNjsgdCsrKQorICAgIHsKKyAgICAgICAgV1t0XSA9IGN0eC0+TWVzc2FnZV9CbG9ja1t0ICogNF0gPDwgMjQ7CisgICAgICAgIFdbdF0gfD0gY3R4LT5NZXNzYWdlX0Jsb2NrW3QgKiA0ICsgMV0gPDwgMTY7CisgICAgICAgIFdbdF0gfD0gY3R4LT5NZXNzYWdlX0Jsb2NrW3QgKiA0ICsgMl0gPDwgODsKKyAgICAgICAgV1t0XSB8PSBjdHgtPk1lc3NhZ2VfQmxvY2tbdCAqIDQgKyAzXTsKKyAgICB9CisKKyAgICBmb3IgKHQgPSAxNjsgdCA8IDgwOyB0KyspCisgICAgeworICAgICAgIFdbdF0gPSBTSEExQ2lyY3VsYXJTaGlmdCgxLFdbdC0zXSBeIFdbdC04XSBeIFdbdC0xNF0gXiBXW3QtMTZdKTsKKyAgICB9CisKKyAgICBBID0gY3R4LT5JbnRlcm1lZGlhdGVfSGFzaFswXTsKKyAgICBCID0gY3R4LT5JbnRlcm1lZGlhdGVfSGFzaFsxXTsKKyAgICBDID0gY3R4LT5JbnRlcm1lZGlhdGVfSGFzaFsyXTsKKyAgICBEID0gY3R4LT5JbnRlcm1lZGlhdGVfSGFzaFszXTsKKyAgICBFID0gY3R4LT5JbnRlcm1lZGlhdGVfSGFzaFs0XTsKKworICAgIGZvciAodCA9IDA7IHQgPCAyMDsgdCsrKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICBTSEExQ2lyY3VsYXJTaGlmdCg1LEEpICsKKyAgICAgICAgICAgICAgICAoKEIgJiBDKSB8ICgofkIpICYgRCkpICsgRSArIFdbdF0gKyBLWzBdOworICAgICAgICBFID0gRDsKKyAgICAgICAgRCA9IEM7CisgICAgICAgIEMgPSBTSEExQ2lyY3VsYXJTaGlmdCgzMCxCKTsKKworICAgICAgICBCID0gQTsKKyAgICAgICAgQSA9IHRlbXA7CisgICAgfQorCisgICAgZm9yICh0ID0gMjA7IHQgPCA0MDsgdCsrKQorICAgIHsKKyAgICAgICAgdGVtcCA9IFNIQTFDaXJjdWxhclNoaWZ0KDUsQSkgKyAoQiBeIEMgXiBEKSArIEUgKyBXW3RdICsgS1sxXTsKKyAgICAgICAgRSA9IEQ7CisgICAgICAgIEQgPSBDOworICAgICAgICBDID0gU0hBMUNpcmN1bGFyU2hpZnQoMzAsQik7CisgICAgICAgIEIgPSBBOworICAgICAgICBBID0gdGVtcDsKKyAgICB9CisKKyAgICBmb3IgKHQgPSA0MDsgdCA8IDYwOyB0KyspCisgICAgeworICAgICAgICB0ZW1wID0gU0hBMUNpcmN1bGFyU2hpZnQoNSxBKSArCisgICAgICAgICAgICAgICAoKEIgJiBDKSB8IChCICYgRCkgfCAoQyAmIEQpKSArIEUgKyBXW3RdICsgS1syXTsKKyAgICAgICAgRSA9IEQ7CisgICAgICAgIEQgPSBDOworICAgICAgICBDID0gU0hBMUNpcmN1bGFyU2hpZnQoMzAsQik7CisgICAgICAgIEIgPSBBOworICAgICAgICBBID0gdGVtcDsKKyAgICB9CisKKyAgICBmb3IgKHQgPSA2MDsgdCA8IDgwOyB0KyspCisgICAgeworICAgICAgICB0ZW1wID0gU0hBMUNpcmN1bGFyU2hpZnQoNSxBKSArIChCIF4gQyBeIEQpICsgRSArIFdbdF0gKyBLWzNdOworICAgICAgICBFID0gRDsKKyAgICAgICAgRCA9IEM7CisgICAgICAgIEMgPSBTSEExQ2lyY3VsYXJTaGlmdCgzMCxCKTsKKyAgICAgICAgQiA9IEE7CisgICAgICAgIEEgPSB0ZW1wOworICAgIH0KKworICAgIGN0eC0+SW50ZXJtZWRpYXRlX0hhc2hbMF0gKz0gQTsKKyAgICBjdHgtPkludGVybWVkaWF0ZV9IYXNoWzFdICs9IEI7CisgICAgY3R4LT5JbnRlcm1lZGlhdGVfSGFzaFsyXSArPSBDOworICAgIGN0eC0+SW50ZXJtZWRpYXRlX0hhc2hbM10gKz0gRDsKKyAgICBjdHgtPkludGVybWVkaWF0ZV9IYXNoWzRdICs9IEU7CisgICAgY3R4LT5NZXNzYWdlX0Jsb2NrX0luZGV4ID0gMDsKK30KKworLyoKKyAqIEFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQsIHRoZSBtZXNzYWdlIG11c3QgYmUgcGFkZGVkIHRvIGFuIGV2ZW4KKyAqIDUxMiBiaXRzLiAgVGhlIGZpcnN0IHBhZGRpbmcgYml0IG11c3QgYmUgYSAnMScuICBUaGUgbGFzdCA2NAorICogYml0cyByZXByZXNlbnQgdGhlIGxlbmd0aCBvZiB0aGUgb3JpZ2luYWwgbWVzc2FnZS4gIEFsbCBiaXRzIGluCisgKiBiZXR3ZWVuIHNob3VsZCBiZSAwLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHBhZCB0aGUgbWVzc2FnZQorICogYWNjb3JkaW5nIHRvIHRob3NlIHJ1bGVzIGJ5IGZpbGxpbmcgdGhlIE1lc3NhZ2VfQmxvY2sgYXJyYXkKKyAqIGFjY29yZGluZ2x5LiAgSXQgd2lsbCBhbHNvIGNhbGwgdGhlIFByb2Nlc3NNZXNzYWdlQmxvY2sgZnVuY3Rpb24KKyAqIHByb3ZpZGVkIGFwcHJvcHJpYXRlbHkuICBXaGVuIGl0IHJldHVybnMsIGl0IGNhbiBiZSBhc3N1bWVkIHRoYXQKKyAqIHRoZSBtZXNzYWdlIGRpZ2VzdCBoYXMgYmVlbiBjb21wdXRlZC4KKyAqCisgKiBAcGFyYW0gY3R4IFtpbiwgb3V0XSBUaGUgU0hBMSBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIFNIQTFQYWRNZXNzYWdlKFNIQTFfQ1RYICpjdHgpCit7CisgICAgLyoKKyAgICAgKiAgQ2hlY2sgdG8gc2VlIGlmIHRoZSBjdXJyZW50IG1lc3NhZ2UgYmxvY2sgaXMgdG9vIHNtYWxsIHRvIGhvbGQKKyAgICAgKiAgdGhlIGluaXRpYWwgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGguICBJZiBzbywgd2Ugd2lsbCBwYWQgdGhlCisgICAgICogIGJsb2NrLCBwcm9jZXNzIGl0LCBhbmQgdGhlbiBjb250aW51ZSBwYWRkaW5nIGludG8gYSBzZWNvbmQKKyAgICAgKiAgYmxvY2suCisgICAgICovCisgICAgaWYgKGN0eC0+TWVzc2FnZV9CbG9ja19JbmRleCA+IDU1KQorICAgIHsKKyAgICAgICAgY3R4LT5NZXNzYWdlX0Jsb2NrW2N0eC0+TWVzc2FnZV9CbG9ja19JbmRleCsrXSA9IDB4ODA7CisgICAgICAgIHdoaWxlKGN0eC0+TWVzc2FnZV9CbG9ja19JbmRleCA8IDY0KQorICAgICAgICB7CisgICAgICAgICAgICBjdHgtPk1lc3NhZ2VfQmxvY2tbY3R4LT5NZXNzYWdlX0Jsb2NrX0luZGV4KytdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIFNIQTFQcm9jZXNzTWVzc2FnZUJsb2NrKGN0eCk7CisKKyAgICAgICAgd2hpbGUgKGN0eC0+TWVzc2FnZV9CbG9ja19JbmRleCA8IDU2KQorICAgICAgICB7CisgICAgICAgICAgICBjdHgtPk1lc3NhZ2VfQmxvY2tbY3R4LT5NZXNzYWdlX0Jsb2NrX0luZGV4KytdID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjdHgtPk1lc3NhZ2VfQmxvY2tbY3R4LT5NZXNzYWdlX0Jsb2NrX0luZGV4KytdID0gMHg4MDsKKyAgICAgICAgd2hpbGUoY3R4LT5NZXNzYWdlX0Jsb2NrX0luZGV4IDwgNTYpCisgICAgICAgIHsKKworICAgICAgICAgICAgY3R4LT5NZXNzYWdlX0Jsb2NrW2N0eC0+TWVzc2FnZV9CbG9ja19JbmRleCsrXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqICBTdG9yZSB0aGUgbWVzc2FnZSBsZW5ndGggYXMgdGhlIGxhc3QgOCBvY3RldHMKKyAgICAgKi8KKyAgICBjdHgtPk1lc3NhZ2VfQmxvY2tbNTZdID0gY3R4LT5MZW5ndGhfSGlnaCA+PiAyNDsKKyAgICBjdHgtPk1lc3NhZ2VfQmxvY2tbNTddID0gY3R4LT5MZW5ndGhfSGlnaCA+PiAxNjsKKyAgICBjdHgtPk1lc3NhZ2VfQmxvY2tbNThdID0gY3R4LT5MZW5ndGhfSGlnaCA+PiA4OworICAgIGN0eC0+TWVzc2FnZV9CbG9ja1s1OV0gPSBjdHgtPkxlbmd0aF9IaWdoOworICAgIGN0eC0+TWVzc2FnZV9CbG9ja1s2MF0gPSBjdHgtPkxlbmd0aF9Mb3cgPj4gMjQ7CisgICAgY3R4LT5NZXNzYWdlX0Jsb2NrWzYxXSA9IGN0eC0+TGVuZ3RoX0xvdyA+PiAxNjsKKyAgICBjdHgtPk1lc3NhZ2VfQmxvY2tbNjJdID0gY3R4LT5MZW5ndGhfTG93ID4+IDg7CisgICAgY3R4LT5NZXNzYWdlX0Jsb2NrWzYzXSA9IGN0eC0+TGVuZ3RoX0xvdzsKKyAgICBTSEExUHJvY2Vzc01lc3NhZ2VCbG9jayhjdHgpOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzX2Flcy5jIGIvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzX2Flcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDM3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jcnlwdG8vYXh0bHNfYWVzLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9jcnlwdG8uaD4KKyNpbmNsdWRlIDxncHhlL2NiYy5oPgorI2luY2x1ZGUgPGdweGUvYWVzLmg+CisjaW5jbHVkZSAiY3J5cHRvL2F4dGxzL2NyeXB0by5oIgorCisvKiogQGZpbGUKKyAqCisgKiBBRVMgYWxnb3JpdGhtCisgKgorICovCisKKy8qKgorICogU2V0IGtleQorICoKKyAqIEB2IGN0eAkJQ29udGV4dAorICogQHYga2V5CQlLZXkKKyAqIEB2IGtleWxlbgkJS2V5IGxlbmd0aAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYWVzX3NldGtleSAoIHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuICkgeworCXN0cnVjdCBhZXNfY29udGV4dCAqYWVzX2N0eCA9IGN0eDsKKwlBRVNfTU9ERSBtb2RlOworCXZvaWQgKml2OworCisJc3dpdGNoICgga2V5bGVuICkgeworCWNhc2UgKCAxMjggLyA4ICk6CisJCW1vZGUgPSBBRVNfTU9ERV8xMjg7CisJCWJyZWFrOworCWNhc2UgKCAyNTYgLyA4ICk6CisJCW1vZGUgPSBBRVNfTU9ERV8yNTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElWIGlzIG5vdCBhIHJlbGV2YW50IGNvbmNlcHQgYXQgdGhpcyBzdGFnZTsgdXNlIGEgZHVtbXkKKwkgKiB2YWx1ZSB0aGF0IHdpbGwgaGF2ZSBubyBzaWRlLWVmZmVjdHMuCisJICovCisJaXYgPSAmYWVzX2N0eC0+YXh0bHNfY3R4Lml2OworCisJQUVTX3NldF9rZXkgKCAmYWVzX2N0eC0+YXh0bHNfY3R4LCBrZXksIGl2LCBtb2RlICk7CisKKwlhZXNfY3R4LT5kZWNyeXB0aW5nID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFNldCBpbml0aWFsaXNhdGlvbiB2ZWN0b3IKKyAqCisgKiBAdiBjdHgJCUNvbnRleHQKKyAqIEB2IGl2CQlJbml0aWFsaXNhdGlvbiB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgYWVzX3NldGl2ICggdm9pZCAqY3R4IF9fdW51c2VkLCBjb25zdCB2b2lkICppdiBfX3VudXNlZCApIHsKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CisKKy8qKgorICogQ2FsbCBBWFRMUycgQUVTX2VuY3J5cHQoKSBvciBBRVNfZGVjcnlwdCgpIGZ1bmN0aW9ucworICoKKyAqIEB2IGF4dGxzX2N0eAkJQVhUTFMgQUVTIGNvbnRleHQKKyAqIEB2IHNyYwkJRGF0YSB0byBwcm9jZXNzCisgKiBAdiBkc3QJCUJ1ZmZlciBmb3Igb3V0cHV0CisgKiBAdiBmdW5jCQlBWFRMUyBBRVMgZnVuY3Rpb24gdG8gY2FsbAorICovCitzdGF0aWMgdm9pZCBhZXNfY2FsbF9heHRscyAoIEFFU19DVFggKmF4dGxzX2N0eCwgY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkgICAgIHZvaWQgKCAqIGZ1bmMgKSAoIGNvbnN0IEFFU19DVFggKmF4dGxzX2N0eCwKKwkJCQkJICAgICAgIHVpbnQzMl90ICpkYXRhICkgKXsKKwljb25zdCB1aW50MzJfdCAqc3JjbCA9IHNyYzsKKwl1aW50MzJfdCAqZHN0bCA9IGRzdDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEFYVExTJyBBRVNfZW5jcnlwdCgpIGFuZCBBRVNfZGVjcnlwdCgpIGZ1bmN0aW9ucyBib3RoCisJICogZXhwZWN0IHRvIGRlYWwgd2l0aCBhbiBhcnJheSBvZiBmb3VyIGR3b3JkcyBpbiBob3N0LWVuZGlhbgorCSAqIG9yZGVyLgorCSAqLworCWZvciAoIGkgPSAwIDsgaSA8IDQgOyBpKysgKQorCQlkc3RsW2ldID0gbnRvaGwgKCBzcmNsW2ldICk7CisJZnVuYyAoIGF4dGxzX2N0eCwgZHN0bCApOworCWZvciAoIGkgPSAwIDsgaSA8IDQgOyBpKysgKQorCQlkc3RsW2ldID0gaHRvbmwgKCBkc3RsW2ldICk7Cit9CisKKy8qKgorICogRW5jcnlwdCBkYXRhCisgKgorICogQHYgY3R4CQlDb250ZXh0CisgKiBAdiBzcmMJCURhdGEgdG8gZW5jcnlwdAorICogQHYgZHN0CQlCdWZmZXIgZm9yIGVuY3J5cHRlZCBkYXRhCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIGFlc19lbmNyeXB0ICggdm9pZCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCSAgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgYWVzX2NvbnRleHQgKmFlc19jdHggPSBjdHg7CisKKwlhc3NlcnQgKCBsZW4gPT0gQUVTX0JMT0NLU0laRSApOworCWlmICggYWVzX2N0eC0+ZGVjcnlwdGluZyApCisJCWFzc2VydCAoIDAgKTsKKwlhZXNfY2FsbF9heHRscyAoICZhZXNfY3R4LT5heHRsc19jdHgsIHNyYywgZHN0LCBBRVNfZW5jcnlwdCApOworfQorCisvKioKKyAqIERlY3J5cHQgZGF0YQorICoKKyAqIEB2IGN0eAkJQ29udGV4dAorICogQHYgc3JjCQlEYXRhIHRvIGRlY3J5cHQKKyAqIEB2IGRzdAkJQnVmZmVyIGZvciBkZWNyeXB0ZWQgZGF0YQorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YQorICovCitzdGF0aWMgdm9pZCBhZXNfZGVjcnlwdCAoIHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkgIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGFlc19jb250ZXh0ICphZXNfY3R4ID0gY3R4OworCisJYXNzZXJ0ICggbGVuID09IEFFU19CTE9DS1NJWkUgKTsKKwlpZiAoICEgYWVzX2N0eC0+ZGVjcnlwdGluZyApIHsKKwkJQUVTX2NvbnZlcnRfa2V5ICggJmFlc19jdHgtPmF4dGxzX2N0eCApOworCQlhZXNfY3R4LT5kZWNyeXB0aW5nID0gMTsKKwl9CisJYWVzX2NhbGxfYXh0bHMgKCAmYWVzX2N0eC0+YXh0bHNfY3R4LCBzcmMsIGRzdCwgQUVTX2RlY3J5cHQgKTsKK30KKworLyoqIEJhc2ljIEFFUyBhbGdvcml0aG0gKi8KK3N0cnVjdCBjaXBoZXJfYWxnb3JpdGhtIGFlc19hbGdvcml0aG0gPSB7CisJLm5hbWUgPSAiYWVzIiwKKwkuY3R4c2l6ZSA9IHNpemVvZiAoIHN0cnVjdCBhZXNfY29udGV4dCApLAorCS5ibG9ja3NpemUgPSBBRVNfQkxPQ0tTSVpFLAorCS5zZXRrZXkgPSBhZXNfc2V0a2V5LAorCS5zZXRpdiA9IGFlc19zZXRpdiwKKwkuZW5jcnlwdCA9IGFlc19lbmNyeXB0LAorCS5kZWNyeXB0ID0gYWVzX2RlY3J5cHQsCit9OworCisvKiBBRVMgd2l0aCBjaXBoZXItYmxvY2sgY2hhaW5pbmcgKi8KK0NCQ19DSVBIRVIgKCBhZXNfY2JjLCBhZXNfY2JjX2FsZ29yaXRobSwKKwkgICAgIGFlc19hbGdvcml0aG0sIHN0cnVjdCBhZXNfY29udGV4dCwgQUVTX0JMT0NLU0laRSApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2F4dGxzX3NoYTEuYyBiL2dweGUvc3JjL2NyeXB0by9heHRsc19zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxZTE5MwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NyeXB0by9heHRsc19zaGExLmMKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgImNyeXB0by9heHRscy9jcnlwdG8uaCIKKyNpbmNsdWRlIDxncHhlL2NyeXB0by5oPgorI2luY2x1ZGUgPGdweGUvc2hhMS5oPgorCitzdGF0aWMgdm9pZCBzaGExX2luaXQgKCB2b2lkICpjdHggKSB7CisJU0hBMUluaXQgKCBjdHggKTsKK30KKworc3RhdGljIHZvaWQgc2hhMV91cGRhdGUgKCB2b2lkICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJU0hBMVVwZGF0ZSAoIGN0eCwgZGF0YSwgbGVuICk7Cit9CisKK3N0YXRpYyB2b2lkIHNoYTFfZmluYWwgKCB2b2lkICpjdHgsIHZvaWQgKm91dCApIHsKKwlTSEExRmluYWwgKCBjdHgsIG91dCApOworfQorCitzdHJ1Y3QgZGlnZXN0X2FsZ29yaXRobSBzaGExX2FsZ29yaXRobSA9IHsKKwkubmFtZQkJPSAic2hhMSIsCisJLmN0eHNpemUJPSBTSEExX0NUWF9TSVpFLAorCS5ibG9ja3NpemUJPSA2NCwKKwkuZGlnZXN0c2l6ZQk9IFNIQTFfRElHRVNUX1NJWkUsCisJLmluaXQJCT0gc2hhMV9pbml0LAorCS51cGRhdGUJCT0gc2hhMV91cGRhdGUsCisJLmZpbmFsCQk9IHNoYTFfZmluYWwsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2NiYy5jIGIvZ3B4ZS9zcmMvY3J5cHRvL2NiYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTAyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jcnlwdG8vY2JjLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxncHhlL2NyeXB0by5oPgorI2luY2x1ZGUgPGdweGUvY2JjLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIENpcGhlci1ibG9jayBjaGFpbmluZworICoKKyAqLworCisvKioKKyAqIFhPUiBkYXRhIGJsb2NrcworICoKKyAqIEB2IHNyYwkJSW5wdXQgZGF0YQorICogQHYgZHN0CQlTZWNvbmQgaW5wdXQgZGF0YSBhbmQgb3V0cHV0IGRhdGEgYnVmZmVyCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIGNiY194b3IgKCBjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgc2l6ZV90IGxlbiApIHsKKwljb25zdCB1aW50MzJfdCAqc3JjbCA9IHNyYzsKKwl1aW50MzJfdCAqZHN0bCA9IGRzdDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEFzc3VtZSB0aGF0IGJsb2NrIHNpemVzIHdpbGwgYWx3YXlzIGJlIGR3b3JkLWFsaWduZWQsIGZvciBzcGVlZCAqLworCWFzc2VydCAoICggbGVuICUgc2l6ZW9mICggKnNyY2wgKSApID09IDAgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8ICggbGVuIC8gc2l6ZW9mICggKnNyY2wgKSApIDsgaSsrICkKKwkJZHN0bFtpXSBePSBzcmNsW2ldOworfQorCisvKioKKyAqIEVuY3J5cHQgZGF0YQorICoKKyAqIEB2IGN0eAkJQ29udGV4dAorICogQHYgc3JjCQlEYXRhIHRvIGVuY3J5cHQKKyAqIEB2IGRzdAkJQnVmZmVyIGZvciBlbmNyeXB0ZWQgZGF0YQorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YQorICogQHYgcmF3X2NpcGhlcglVbmRlcmx5aW5nIGNpcGhlciBhbGdvcml0aG0KKyAqIEB2IGNiY19jdHgJCUNCQyBjb250ZXh0CisgKi8KK3ZvaWQgY2JjX2VuY3J5cHQgKCB2b2lkICpjdHgsIGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBzaXplX3QgbGVuLAorCQkgICBzdHJ1Y3QgY2lwaGVyX2FsZ29yaXRobSAqcmF3X2NpcGhlciwgdm9pZCAqY2JjX2N0eCApIHsKKwlzaXplX3QgYmxvY2tzaXplID0gcmF3X2NpcGhlci0+YmxvY2tzaXplOworCisJYXNzZXJ0ICggKCBsZW4gJSBibG9ja3NpemUgKSA9PSAwICk7CisKKwl3aGlsZSAoIGxlbiApIHsKKwkJY2JjX3hvciAoIHNyYywgY2JjX2N0eCwgYmxvY2tzaXplICk7CisJCWNpcGhlcl9lbmNyeXB0ICggcmF3X2NpcGhlciwgY3R4LCBjYmNfY3R4LCBkc3QsIGJsb2Nrc2l6ZSApOworCQltZW1jcHkgKCBjYmNfY3R4LCBkc3QsIGJsb2Nrc2l6ZSApOworCQlkc3QgKz0gYmxvY2tzaXplOworCQlzcmMgKz0gYmxvY2tzaXplOworCQlsZW4gLT0gYmxvY2tzaXplOworCX0KK30KKworLyoqCisgKiBEZWNyeXB0IGRhdGEKKyAqCisgKiBAdiBjdHgJCUNvbnRleHQKKyAqIEB2IHNyYwkJRGF0YSB0byBkZWNyeXB0CisgKiBAdiBkc3QJCUJ1ZmZlciBmb3IgZGVjcnlwdGVkIGRhdGEKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEKKyAqIEB2IHJhd19jaXBoZXIJVW5kZXJseWluZyBjaXBoZXIgYWxnb3JpdGhtCisgKiBAdiBjYmNfY3R4CQlDQkMgY29udGV4dAorICovCit2b2lkIGNiY19kZWNyeXB0ICggdm9pZCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgc2l6ZV90IGxlbiwKKwkJICAgc3RydWN0IGNpcGhlcl9hbGdvcml0aG0gKnJhd19jaXBoZXIsIHZvaWQgKmNiY19jdHggKSB7CisJc2l6ZV90IGJsb2Nrc2l6ZSA9IHJhd19jaXBoZXItPmJsb2Nrc2l6ZTsKKworCWFzc2VydCAoICggbGVuICUgYmxvY2tzaXplICkgPT0gMCApOworCisJd2hpbGUgKCBsZW4gKSB7CisJCWNpcGhlcl9kZWNyeXB0ICggcmF3X2NpcGhlciwgY3R4LCBzcmMsIGRzdCwgYmxvY2tzaXplICk7CisJCWNiY194b3IgKCBjYmNfY3R4LCBkc3QsIGJsb2Nrc2l6ZSApOworCQltZW1jcHkgKCBjYmNfY3R4LCBzcmMsIGJsb2Nrc2l6ZSApOworCQlkc3QgKz0gYmxvY2tzaXplOworCQlzcmMgKz0gYmxvY2tzaXplOworCQlsZW4gLT0gYmxvY2tzaXplOworCX0KK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by9jaGFwLmMgYi9ncHhlL3NyYy9jcnlwdG8vY2hhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTIyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jcnlwdG8vY2hhcC5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxncHhlL2NyeXB0by5oPgorI2luY2x1ZGUgPGdweGUvY2hhcC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBDSEFQIHByb3RvY29sCisgKgorICovCisKKy8qKgorICogSW5pdGlhbGlzZSBDSEFQIGNoYWxsZW5nZS9yZXNwb25zZQorICoKKyAqIEB2IGNoYXAJCUNIQVAgY2hhbGxlbmdlL3Jlc3BvbnNlCisgKiBAdiBkaWdlc3QJCURpZ2VzdCBhbGdvcml0aG0gdG8gdXNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBJbml0aWFsaXNlcyBhIENIQVAgY2hhbGxlbmdlL3Jlc3BvbnNlIHN0cnVjdHVyZS4gIFRoaXMgcm91dGluZQorICogYWxsb2NhdGVzIG1lbW9yeSwgYW5kIHNvIG1heSBmYWlsLiAgVGhlIGFsbG9jYXRlZCBtZW1vcnkgbXVzdAorICogZXZlbnR1YWxseSBiZSBmcmVlZCBieSBhIGNhbGwgdG8gY2hhcF9maW5pc2goKS4KKyAqLworaW50IGNoYXBfaW5pdCAoIHN0cnVjdCBjaGFwX3Jlc3BvbnNlICpjaGFwLAorCQlzdHJ1Y3QgZGlnZXN0X2FsZ29yaXRobSAqZGlnZXN0ICkgeworCXNpemVfdCBzdGF0ZV9sZW47CisJdm9pZCAqc3RhdGU7CisKKwlhc3NlcnQgKCBjaGFwLT5kaWdlc3QgPT0gTlVMTCApOworCWFzc2VydCAoIGNoYXAtPmRpZ2VzdF9jb250ZXh0ID09IE5VTEwgKTsKKwlhc3NlcnQgKCBjaGFwLT5yZXNwb25zZSA9PSBOVUxMICk7CisKKwlEQkcgKCAiQ0hBUCAlcCBpbml0aWFsaXNpbmcgd2l0aCAlcyBkaWdlc3RcbiIsIGNoYXAsIGRpZ2VzdC0+bmFtZSApOworCisJc3RhdGVfbGVuID0gKCBkaWdlc3QtPmN0eHNpemUgKyBkaWdlc3QtPmRpZ2VzdHNpemUgKTsKKwlzdGF0ZSA9IG1hbGxvYyAoIHN0YXRlX2xlbiApOworCWlmICggISBzdGF0ZSApIHsKKwkJREJHICggIkNIQVAgJXAgY291bGQgbm90IGFsbG9jYXRlICV6ZCBieXRlcyBmb3Igc3RhdGVcbiIsCisJCSAgICAgIGNoYXAsIHN0YXRlX2xlbiApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisJY2hhcC0+ZGlnZXN0ID0gZGlnZXN0OworCWNoYXAtPmRpZ2VzdF9jb250ZXh0ID0gc3RhdGU7CisJY2hhcC0+cmVzcG9uc2UgPSAoIHN0YXRlICsgZGlnZXN0LT5jdHhzaXplICk7CisJY2hhcC0+cmVzcG9uc2VfbGVuID0gZGlnZXN0LT5kaWdlc3RzaXplOworCWRpZ2VzdF9pbml0ICggY2hhcC0+ZGlnZXN0LCBjaGFwLT5kaWdlc3RfY29udGV4dCApOworCXJldHVybiAwOworfQorCisvKioKKyAqIEFkZCBkYXRhIHRvIHRoZSBDSEFQIGNoYWxsZW5nZQorICoKKyAqIEB2IGNoYXAJCUNIQVAgcmVzcG9uc2UKKyAqIEB2IGRhdGEJCURhdGEgdG8gYWRkCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIHRvIGFkZAorICovCit2b2lkIGNoYXBfdXBkYXRlICggc3RydWN0IGNoYXBfcmVzcG9uc2UgKmNoYXAsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgIHNpemVfdCBsZW4gKSB7CisJYXNzZXJ0ICggY2hhcC0+ZGlnZXN0ICE9IE5VTEwgKTsKKwlhc3NlcnQgKCBjaGFwLT5kaWdlc3RfY29udGV4dCAhPSBOVUxMICk7CisKKwlpZiAoICEgY2hhcC0+ZGlnZXN0ICkKKwkJcmV0dXJuOworCisJZGlnZXN0X3VwZGF0ZSAoIGNoYXAtPmRpZ2VzdCwgY2hhcC0+ZGlnZXN0X2NvbnRleHQsIGRhdGEsIGxlbiApOworfQorCisvKioKKyAqIFJlc3BvbmQgdG8gdGhlIENIQVAgY2hhbGxlbmdlCisgKgorICogQHYgY2hhcAkJQ0hBUCByZXNwb25zZQorICoKKyAqIENhbGN1bGF0ZXMgdGhlIGZpbmFsIENIQVAgcmVzcG9uc2UgdmFsdWUsIGFuZCBwbGFjZXMgaXQgaW4gQGMKKyAqIGNoYXAtPnJlc3BvbnNlLCB3aXRoIGEgbGVuZ3RoIG9mIEBjIGNoYXAtPnJlc3BvbnNlX2xlbi4KKyAqLwordm9pZCBjaGFwX3Jlc3BvbmQgKCBzdHJ1Y3QgY2hhcF9yZXNwb25zZSAqY2hhcCApIHsKKwlhc3NlcnQgKCBjaGFwLT5kaWdlc3QgIT0gTlVMTCApOworCWFzc2VydCAoIGNoYXAtPmRpZ2VzdF9jb250ZXh0ICE9IE5VTEwgKTsKKwlhc3NlcnQgKCBjaGFwLT5yZXNwb25zZSAhPSBOVUxMICk7CisKKwlEQkcgKCAiQ0hBUCAlcCByZXNwb25kaW5nIHRvIGNoYWxsZW5nZVxuIiwgY2hhcCApOworCisJaWYgKCAhIGNoYXAtPmRpZ2VzdCApCisJCXJldHVybjsKKworCWRpZ2VzdF9maW5hbCAoIGNoYXAtPmRpZ2VzdCwgY2hhcC0+ZGlnZXN0X2NvbnRleHQsIGNoYXAtPnJlc3BvbnNlICk7Cit9CisKKy8qKgorICogRnJlZSByZXNvdXJjZXMgdXNlZCBieSBhIENIQVAgcmVzcG9uc2UKKyAqCisgKiBAdiBjaGFwCQlDSEFQIHJlc3BvbnNlCisgKi8KK3ZvaWQgY2hhcF9maW5pc2ggKCBzdHJ1Y3QgY2hhcF9yZXNwb25zZSAqY2hhcCApIHsKKwl2b2lkICpzdGF0ZSA9IGNoYXAtPmRpZ2VzdF9jb250ZXh0OworCisJREJHICggIkNIQVAgJXAgZmluaXNoZWRcbiIsIGNoYXAgKTsKKworCWZyZWUgKCBzdGF0ZSApOworCW1lbXNldCAoIGNoYXAsIDAsIHNpemVvZiAoICpjaGFwICkgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by9jcmFuZG9tLmMgYi9ncHhlL3NyYy9jcnlwdG8vY3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Mjg0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jcnlwdG8vY3JhbmRvbS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqIEBmaWxlCisgKgorICogQ3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgKgorICogQ3VycmVudGx5IHRoZSBjcnlwdG9ncmFwaGljIHBhcnQgaXMgbm90IGltcGxlbWVudGVkLCBhbmQgdGhpcyBqdXN0CisgKiB1c2VzIHJhbmRvbSgpLgorICovCisKKyNpbmNsdWRlIDxncHhlL2NyeXB0by5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKioKKyAqIEdldCBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcgcmFuZG9tIGJ5dGVzCisgKgorICogQHYgYnVmCUJ1ZmZlciBpbiB3aGljaCB0byBzdG9yZSByYW5kb20gYnl0ZXMKKyAqIEB2IGxlbglOdW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGdlbmVyYXRlCisgKgorICogQGIgV0FSTklORzogVGhpcyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgdW5kZXJpbXBsZW1lbnRlZCwgYW5kIGRvZXMKKyAqIG5vdCBnaXZlIG51bWJlcnMgYW55IHN0cm9uZ2VyIHRoYW4gcmFuZG9tKCkhCisgKi8KK3ZvaWQgZ2V0X3JhbmRvbV9ieXRlcyAoIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiApCit7CisJdTggKmJ1ZnAgPSBidWY7CisKKwkvKgorCSAqIFNvbWV3aGF0IGFyYml0cmFyaWx5LCBjaG9vc2UgdGhlIDB4MDBGRjAwMDAtbWFza2VkIGJ5dGUKKwkgKiByZXR1cm5lZCBieSByYW5kb20oKSBhcyBoYXZpbmcgZ29vZCBlbnRyb3B5LiBQUk5HcyBvZnRlbgorCSAqIGRvbid0IHByb3ZpZGUgZ29vZCBlbnRyb3B5IGluIGxvd2VyIGJpdHMsIGFuZCB0aGUgdG9wIGJ5dGUKKwkgKiBtaWdodCBzaG93IGEgcGF0dGVybiBiZWNhdXNlIG9mIHNpZ24gaXNzdWVzLgorCSAqLworCisJd2hpbGUgKCBsZW4tLSApIHsKKwkJKmJ1ZnArKyA9ICggcmFuZG9tKCkgPj4gMTYgKSAmIDB4RkY7CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2NyYzMyLmMgYi9ncHhlL3NyYy9jcnlwdG8vY3JjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2MzMTRlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY3J5cHRvL2NyYzMyLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpdHRsZS1lbmRpYW4gQ1JDMzIgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL2NyYzMyLmg+CisKKyNkZWZpbmUgQ1JDUE9MWQkJMHhlZGI4ODMyMAorCisvKioKKyAqIENhbGN1bGF0ZSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBDUkMgY2hlY2tzdW0KKyAqCisgKiBAdiBzZWVkCUluaXRpYWwgdmFsdWUKKyAqIEB2IGRhdGEJRGF0YSB0byBjaGVja3N1bQorICogQHYgbGVuCUxlbmd0aCBvZiBkYXRhCisgKgorICogVXN1YWxseSBAYSBzZWVkIGlzIGluaXRpYWxseSB6ZXJvIG9yIGFsbCBvbmUgYml0cywgZGVwZW5kaW5nIG9uIHRoZQorICogcHJvdG9jb2wuIFRvIGNvbnRpbnVlIGEgQ1JDIGNoZWNrc3VtIG92ZXIgbXVsdGlwbGUgY2FsbHMsIHBhc3MgdGhlCisgKiByZXR1cm4gdmFsdWUgZnJvbSBvbmUgY2FsbCBhcyB0aGUgQGEgc2VlZCBwYXJhbWV0ZXIgdG8gdGhlIG5leHQuCisgKi8KK3UzMiBjcmMzMl9sZSAoIHUzMiBzZWVkLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkKK3sKKwl1MzIgY3JjID0gc2VlZDsKKwljb25zdCB1OCAqc3JjID0gZGF0YTsKKwl1MzIgbXVsdDsKKwlpbnQgaTsKKworCXdoaWxlICggbGVuLS0gKSB7CisJCWNyYyBePSAqc3JjKys7CisJCWZvciAoIGkgPSAwOyBpIDwgODsgaSsrICkgeworCQkJbXVsdCA9ICggY3JjICYgMSApID8gQ1JDUE9MWSA6IDA7CisJCQljcmMgPSAoIGNyYyA+PiAxICkgXiBtdWx0OworCQl9CisJfQorCisJcmV0dXJuIGNyYzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by9jcnlwdG9fbnVsbC5jIGIvZ3B4ZS9zcmMvY3J5cHRvL2NyeXB0b19udWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlZmIzNAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NyeXB0by9jcnlwdG9fbnVsbC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBOdWxsIGNyeXB0byBhbGdvcml0aG0KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3B4ZS9jcnlwdG8uaD4KKworc3RhdGljIHZvaWQgZGlnZXN0X251bGxfaW5pdCAoIHZvaWQgKmN0eCBfX3VudXNlZCApIHsKKwkvKiBEbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkIGRpZ2VzdF9udWxsX3VwZGF0ZSAoIHZvaWQgKmN0eCBfX3VudXNlZCwgY29uc3Qgdm9pZCAqc3JjIF9fdW51c2VkLAorCQkJCSBzaXplX3QgbGVuIF9fdW51c2VkICkgeworCS8qIERvIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHZvaWQgZGlnZXN0X251bGxfZmluYWwgKCB2b2lkICpjdHggX191bnVzZWQsIHZvaWQgKm91dCBfX3VudXNlZCApIHsKKwkvKiBEbyBub3RoaW5nICovCit9CisKK3N0cnVjdCBkaWdlc3RfYWxnb3JpdGhtIGRpZ2VzdF9udWxsID0geworCS5uYW1lID0gIm51bGwiLAorCS5jdHhzaXplID0gMCwKKwkuYmxvY2tzaXplID0gMSwKKwkuZGlnZXN0c2l6ZSA9IDAsCisJLmluaXQgPSBkaWdlc3RfbnVsbF9pbml0LAorCS51cGRhdGUgPSBkaWdlc3RfbnVsbF91cGRhdGUsCisJLmZpbmFsID0gZGlnZXN0X251bGxfZmluYWwsCit9OworCitzdGF0aWMgaW50IGNpcGhlcl9udWxsX3NldGtleSAoIHZvaWQgKmN0eCBfX3VudXNlZCwgY29uc3Qgdm9pZCAqa2V5IF9fdW51c2VkLAorCQkJCXNpemVfdCBrZXlsZW4gX191bnVzZWQgKSB7CisJLyogRG8gbm90aGluZyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaXBoZXJfbnVsbF9zZXRpdiAoIHZvaWQgKmN0eCBfX3VudXNlZCwKKwkJCQljb25zdCB2b2lkICppdiBfX3VudXNlZCApIHsKKwkvKiBEbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkIGNpcGhlcl9udWxsX2VuY3J5cHQgKCB2b2lkICpjdHggX191bnVzZWQsIGNvbnN0IHZvaWQgKnNyYywKKwkJCQkgIHZvaWQgKmRzdCwgc2l6ZV90IGxlbiApIHsKKwltZW1jcHkgKCBkc3QsIHNyYywgbGVuICk7Cit9CisKK3N0YXRpYyB2b2lkIGNpcGhlcl9udWxsX2RlY3J5cHQgKCB2b2lkICpjdHggX191bnVzZWQsIGNvbnN0IHZvaWQgKnNyYywKKwkJCQkgIHZvaWQgKmRzdCwgc2l6ZV90IGxlbiApIHsKKwltZW1jcHkgKCBkc3QsIHNyYywgbGVuICk7Cit9CisKK3N0cnVjdCBjaXBoZXJfYWxnb3JpdGhtIGNpcGhlcl9udWxsID0geworCS5uYW1lID0gIm51bGwiLAorCS5jdHhzaXplID0gMCwKKwkuYmxvY2tzaXplID0gMSwKKwkuc2V0a2V5ID0gY2lwaGVyX251bGxfc2V0a2V5LAorCS5zZXRpdiA9IGNpcGhlcl9udWxsX3NldGl2LAorCS5lbmNyeXB0ID0gY2lwaGVyX251bGxfZW5jcnlwdCwKKwkuZGVjcnlwdCA9IGNpcGhlcl9udWxsX2RlY3J5cHQsCit9OworCitzdHJ1Y3QgcHVia2V5X2FsZ29yaXRobSBwdWJrZXlfbnVsbCA9IHsKKwkubmFtZSA9ICJudWxsIiwKKwkuY3R4c2l6ZSA9IDAsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvY3J5cHRvL2htYWMuYyBiL2dweGUvc3JjL2NyeXB0by9obWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NzMwYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2NyeXB0by9obWFjLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBLZXllZC1IYXNoaW5nIGZvciBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvY3J5cHRvLmg+CisjaW5jbHVkZSA8Z3B4ZS9obWFjLmg+CisKKy8qKgorICogUmVkdWNlIEhNQUMga2V5IGxlbmd0aAorICoKKyAqIEB2IGRpZ2VzdAkJRGlnZXN0IGFsZ29yaXRobSB0byB1c2UKKyAqIEB2IGRpZ2VzdF9jdHgJRGlnZXN0IGNvbnRleHQKKyAqIEB2IGtleQkJS2V5CisgKiBAdiBrZXlfbGVuCQlMZW5ndGggb2Yga2V5CisgKi8KK3N0YXRpYyB2b2lkIGhtYWNfcmVkdWNlX2tleSAoIHN0cnVjdCBkaWdlc3RfYWxnb3JpdGhtICpkaWdlc3QsCisJCQkgICAgICB2b2lkICprZXksIHNpemVfdCAqa2V5X2xlbiApIHsKKwl1aW50OF90IGRpZ2VzdF9jdHhbZGlnZXN0LT5jdHhzaXplXTsKKworCWRpZ2VzdF9pbml0ICggZGlnZXN0LCBkaWdlc3RfY3R4ICk7CisJZGlnZXN0X3VwZGF0ZSAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwga2V5LCAqa2V5X2xlbiApOworCWRpZ2VzdF9maW5hbCAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwga2V5ICk7CisJKmtleV9sZW4gPSBkaWdlc3QtPmRpZ2VzdHNpemU7Cit9CisKKy8qKgorICogSW5pdGlhbGlzZSBITUFDCisgKgorICogQHYgZGlnZXN0CQlEaWdlc3QgYWxnb3JpdGhtIHRvIHVzZQorICogQHYgZGlnZXN0X2N0eAlEaWdlc3QgY29udGV4dAorICogQHYga2V5CQlLZXkKKyAqIEB2IGtleV9sZW4JCUxlbmd0aCBvZiBrZXkKKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgYmxvY2sgc2l6ZSBvZiB0aGUKKyAqIGRpZ2VzdCBhbGdvcml0aG0gYmVpbmcgdXNlZC4gIChJZiB0aGUga2V5IGxlbmd0aCBpcyBncmVhdGVyLCBpdAorICogd2lsbCBiZSByZXBsYWNlZCB3aXRoIGl0cyBvd24gZGlnZXN0LCBhbmQga2V5X2xlbiB3aWxsIGJlIHVwZGF0ZWQKKyAqIGFjY29yZGluZ2x5KS4KKyAqLwordm9pZCBobWFjX2luaXQgKCBzdHJ1Y3QgZGlnZXN0X2FsZ29yaXRobSAqZGlnZXN0LCB2b2lkICpkaWdlc3RfY3R4LAorCQkgdm9pZCAqa2V5LCBzaXplX3QgKmtleV9sZW4gKSB7CisJdW5zaWduZWQgY2hhciBrX2lwYWRbZGlnZXN0LT5ibG9ja3NpemVdOworCXVuc2lnbmVkIGludCBpOworCisJLyogUmVkdWNlIGtleSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoICprZXlfbGVuID4gc2l6ZW9mICgga19pcGFkICkgKQorCQlobWFjX3JlZHVjZV9rZXkgKCBkaWdlc3QsIGtleSwga2V5X2xlbiApOworCisJLyogQ29uc3RydWN0IGlucHV0IHBhZCAqLworCW1lbXNldCAoIGtfaXBhZCwgMCwgc2l6ZW9mICgga19pcGFkICkgKTsKKwltZW1jcHkgKCBrX2lwYWQsIGtleSwgKmtleV9sZW4gKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBzaXplb2YgKCBrX2lwYWQgKSA7IGkrKyApIHsKKwkJa19pcGFkW2ldIF49IDB4MzY7CisJfQorCQorCS8qIFN0YXJ0IGlubmVyIGhhc2ggKi8KKwlkaWdlc3RfaW5pdCAoIGRpZ2VzdCwgZGlnZXN0X2N0eCApOworCWRpZ2VzdF91cGRhdGUgKCBkaWdlc3QsIGRpZ2VzdF9jdHgsIGtfaXBhZCwgc2l6ZW9mICgga19pcGFkICkgKTsKK30KKworLyoqCisgKiBGaW5hbGlzZSBITUFDCisgKgorICogQHYgZGlnZXN0CQlEaWdlc3QgYWxnb3JpdGhtIHRvIHVzZQorICogQHYgZGlnZXN0X2N0eAlEaWdlc3QgY29udGV4dAorICogQHYga2V5CQlLZXkKKyAqIEB2IGtleV9sZW4JCUxlbmd0aCBvZiBrZXkKKyAqIEB2IGhtYWMJCUhNQUMgZGlnZXN0IHRvIGZpbGwgaW4KKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgYmxvY2sgc2l6ZSBvZiB0aGUKKyAqIGRpZ2VzdCBhbGdvcml0aG0gYmVpbmcgdXNlZC4gIChJZiB0aGUga2V5IGxlbmd0aCBpcyBncmVhdGVyLCBpdAorICogd2lsbCBiZSByZXBsYWNlZCB3aXRoIGl0cyBvd24gZGlnZXN0LCBhbmQga2V5X2xlbiB3aWxsIGJlIHVwZGF0ZWQKKyAqIGFjY29yZGluZ2x5KS4KKyAqLwordm9pZCBobWFjX2ZpbmFsICggc3RydWN0IGRpZ2VzdF9hbGdvcml0aG0gKmRpZ2VzdCwgdm9pZCAqZGlnZXN0X2N0eCwKKwkJICB2b2lkICprZXksIHNpemVfdCAqa2V5X2xlbiwgdm9pZCAqaG1hYyApIHsKKwl1bnNpZ25lZCBjaGFyIGtfb3BhZFtkaWdlc3QtPmJsb2Nrc2l6ZV07CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBSZWR1Y2Uga2V5IGlmIG5lY2Vzc2FyeSAqLworCWlmICggKmtleV9sZW4gPiBzaXplb2YgKCBrX29wYWQgKSApCisJCWhtYWNfcmVkdWNlX2tleSAoIGRpZ2VzdCwga2V5LCBrZXlfbGVuICk7CisKKwkvKiBDb25zdHJ1Y3Qgb3V0cHV0IHBhZCAqLworCW1lbXNldCAoIGtfb3BhZCwgMCwgc2l6ZW9mICgga19vcGFkICkgKTsKKwltZW1jcHkgKCBrX29wYWQsIGtleSwgKmtleV9sZW4gKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBzaXplb2YgKCBrX29wYWQgKSA7IGkrKyApIHsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCQorCS8qIEZpbmlzaCBpbm5lciBoYXNoICovCisJZGlnZXN0X2ZpbmFsICggZGlnZXN0LCBkaWdlc3RfY3R4LCBobWFjICk7CisKKwkvKiBQZXJmb3JtIG91dGVyIGhhc2ggKi8KKwlkaWdlc3RfaW5pdCAoIGRpZ2VzdCwgZGlnZXN0X2N0eCApOworCWRpZ2VzdF91cGRhdGUgKCBkaWdlc3QsIGRpZ2VzdF9jdHgsIGtfb3BhZCwgc2l6ZW9mICgga19vcGFkICkgKTsKKwlkaWdlc3RfdXBkYXRlICggZGlnZXN0LCBkaWdlc3RfY3R4LCBobWFjLCBkaWdlc3QtPmRpZ2VzdHNpemUgKTsKKwlkaWdlc3RfZmluYWwgKCBkaWdlc3QsIGRpZ2VzdF9jdHgsIGhtYWMgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by9tZDUuYyBiL2dweGUvc3JjL2NyeXB0by9tZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzYwNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY3J5cHRvL21kNS5jCkBAIC0wLDAgKzEsMjM0IEBACisvKiAKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIE1ENSBNZXNzYWdlIERpZ2VzdCBBbGdvcml0aG0gKFJGQzEzMjEpLgorICoKKyAqIERlcml2ZWQgZnJvbSBjcnlwdG9hcGkgaW1wbGVtZW50YXRpb24sIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlCisgKiBwdWJsaWMgZG9tYWluIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgQ29saW4gUGx1bWIgaW4gMTk5My4KKyAqCisgKiBSZWR1Y2VkIG9iamVjdCBzaXplIGJ5IGFyb3VuZCA1MCUgY29tcGFyZWQgdG8gdGhlIG9yaWdpbmFsIExpbnV4CisgKiB2ZXJzaW9uIGZvciB1c2UgaW4gRXRoZXJib290IGJ5IE1pY2hhZWwgQnJvd24uCisgKgorICogQ29weXJpZ2h0IChjKSBDcnlwdG9hcGkgZGV2ZWxvcGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9jcnlwdG8uaD4KKyNpbmNsdWRlIDxncHhlL21kNS5oPgorCitzdHJ1Y3QgbWQ1X3N0ZXAgeworCXUzMiAoICogZiApICggdTMyIGIsIHUzMiBjLCB1MzIgZCApOworCXU4IGNvZWZmaWNpZW50OworCXU4IGNvbnN0YW50OworfTsKKworc3RhdGljIHUzMiBmMSh1MzIgYiwgdTMyIGMsIHUzMiBkKQoreworCXJldHVybiAoIGQgXiAoIGIgJiAoIGMgXiBkICkgKSApOworfQorCitzdGF0aWMgdTMyIGYyKHUzMiBiLCB1MzIgYywgdTMyIGQpCit7CisJcmV0dXJuICggYyBeICggZCAmICggYiBeIGMgKSApICk7Cit9CisKK3N0YXRpYyB1MzIgZjModTMyIGIsIHUzMiBjLCB1MzIgZCkKK3sKKwlyZXR1cm4gKCBiIF4gYyBeIGQgKTsKK30KKworc3RhdGljIHUzMiBmNCh1MzIgYiwgdTMyIGMsIHUzMiBkKQoreworCXJldHVybiAoIGMgXiAoIGIgfCB+ZCApICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWQ1X3N0ZXAgbWQ1X3N0ZXBzWzRdID0geworCXsKKwkJLmYgPSBmMSwKKwkJLmNvZWZmaWNpZW50ID0gMSwKKwkJLmNvbnN0YW50ID0gMCwKKwl9LAorCXsKKwkJLmYgPSBmMiwKKwkJLmNvZWZmaWNpZW50ID0gNSwKKwkJLmNvbnN0YW50ID0gMSwKKwl9LAorCXsKKwkJLmYgPSBmMywKKwkJLmNvZWZmaWNpZW50ID0gMywKKwkJLmNvbnN0YW50ID0gNSwKKwl9LAorCXsKKwkJLmYgPSBmNCwKKwkJLmNvZWZmaWNpZW50ID0gNywKKwkJLmNvbnN0YW50ID0gMCwKKwl9Cit9OworCitzdGF0aWMgY29uc3QgdTggcls2NF0gPSB7CisJNywxMiwxNywyMiw3LDEyLDE3LDIyLDcsMTIsMTcsMjIsNywxMiwxNywyMiwKKwk1LDksMTQsMjAsNSw5LDE0LDIwLDUsOSwxNCwyMCw1LDksMTQsMjAsCisJNCwxMSwxNiwyMyw0LDExLDE2LDIzLDQsMTEsMTYsMjMsNCwxMSwxNiwyMywKKwk2LDEwLDE1LDIxLDYsMTAsMTUsMjEsNiwxMCwxNSwyMSw2LDEwLDE1LDIxCit9OworCitzdGF0aWMgY29uc3QgdTMyIGtbNjRdID0geworCTB4ZDc2YWE0NzhVTCwgMHhlOGM3Yjc1NlVMLCAweDI0MjA3MGRiVUwsIDB4YzFiZGNlZWVVTCwKKwkweGY1N2MwZmFmVUwsIDB4NDc4N2M2MmFVTCwgMHhhODMwNDYxM1VMLCAweGZkNDY5NTAxVUwsCisJMHg2OTgwOThkOFVMLCAweDhiNDRmN2FmVUwsIDB4ZmZmZjViYjFVTCwgMHg4OTVjZDdiZVVMLAorCTB4NmI5MDExMjJVTCwgMHhmZDk4NzE5M1VMLCAweGE2Nzk0MzhlVUwsIDB4NDliNDA4MjFVTCwKKwkweGY2MWUyNTYyVUwsIDB4YzA0MGIzNDBVTCwgMHgyNjVlNWE1MVVMLCAweGU5YjZjN2FhVUwsCisJMHhkNjJmMTA1ZFVMLCAweDAyNDQxNDUzVUwsIDB4ZDhhMWU2ODFVTCwgMHhlN2QzZmJjOFVMLAorCTB4MjFlMWNkZTZVTCwgMHhjMzM3MDdkNlVMLCAweGY0ZDUwZDg3VUwsIDB4NDU1YTE0ZWRVTCwKKwkweGE5ZTNlOTA1VUwsIDB4ZmNlZmEzZjhVTCwgMHg2NzZmMDJkOVVMLCAweDhkMmE0YzhhVUwsCisJMHhmZmZhMzk0MlVMLCAweDg3NzFmNjgxVUwsIDB4NmQ5ZDYxMjJVTCwgMHhmZGU1MzgwY1VMLAorCTB4YTRiZWVhNDRVTCwgMHg0YmRlY2ZhOVVMLCAweGY2YmI0YjYwVUwsIDB4YmViZmJjNzBVTCwKKwkweDI4OWI3ZWM2VUwsIDB4ZWFhMTI3ZmFVTCwgMHhkNGVmMzA4NVVMLCAweDA0ODgxZDA1VUwsCisJMHhkOWQ0ZDAzOVVMLCAweGU2ZGI5OWU1VUwsIDB4MWZhMjdjZjhVTCwgMHhjNGFjNTY2NVVMLAorCTB4ZjQyOTIyNDRVTCwgMHg0MzJhZmY5N1VMLCAweGFiOTQyM2E3VUwsIDB4ZmM5M2EwMzlVTCwKKwkweDY1NWI1OWMzVUwsIDB4OGYwY2NjOTJVTCwgMHhmZmVmZjQ3ZFVMLCAweDg1ODQ1ZGQxVUwsCisJMHg2ZmE4N2U0ZlVMLCAweGZlMmNlNmUwVUwsIDB4YTMwMTQzMTRVTCwgMHg0ZTA4MTFhMVVMLAorCTB4Zjc1MzdlODJVTCwgMHhiZDNhZjIzNVVMLCAweDJhZDdkMmJiVUwsIDB4ZWI4NmQzOTFVTCwKK307CisKK3N0YXRpYyB2b2lkIG1kNV90cmFuc2Zvcm0odTMyICpoYXNoLCBjb25zdCB1MzIgKmluKQoreworCXUzMiBhLCBiLCBjLCBkLCBmLCBnLCB0ZW1wOworCWludCBpOworCXN0cnVjdCBtZDVfc3RlcCAqc3RlcDsKKworCWEgPSBoYXNoWzBdOworCWIgPSBoYXNoWzFdOworCWMgPSBoYXNoWzJdOworCWQgPSBoYXNoWzNdOworCisJZm9yICggaSA9IDAgOyBpIDwgNjQgOyBpKysgKSB7CisJCXN0ZXAgPSAmbWQ1X3N0ZXBzW2kgPj4gNF07CisJCWYgPSBzdGVwLT5mICggYiwgYywgZCApOworCQlnID0gKCAoIGkgKiBzdGVwLT5jb2VmZmljaWVudCArIHN0ZXAtPmNvbnN0YW50ICkgJiAweGYgKTsKKwkJdGVtcCA9IGQ7CisJCWQgPSBjOworCQljID0gYjsKKwkJYSArPSAoIGYgKyBrW2ldICsgaW5bZ10gKTsKKwkJYSA9ICggKCBhIDw8IHJbaV0gKSB8ICggYSA+PiAoIDMyLXJbaV0gKSApICk7CisJCWIgKz0gYTsKKwkJYSA9IHRlbXA7CisJfQorCisJaGFzaFswXSArPSBhOworCWhhc2hbMV0gKz0gYjsKKwloYXNoWzJdICs9IGM7CisJaGFzaFszXSArPSBkOworfQorCisvKiBYWFg6IHRoaXMgc3R1ZmYgY2FuIGJlIG9wdGltaXplZCAqLworc3RhdGljIGlubGluZSB2b2lkIGxlMzJfdG9fY3B1X2FycmF5KHUzMiAqYnVmLCB1bnNpZ25lZCBpbnQgd29yZHMpCit7CisJd2hpbGUgKHdvcmRzLS0pIHsKKwkJbGUzMl90b19jcHVzKGJ1Zik7CisJCWJ1ZisrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwdV90b19sZTMyX2FycmF5KHUzMiAqYnVmLCB1bnNpZ25lZCBpbnQgd29yZHMpCit7CisJd2hpbGUgKHdvcmRzLS0pIHsKKwkJY3B1X3RvX2xlMzJzKGJ1Zik7CisJCWJ1ZisrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG1kNV90cmFuc2Zvcm1faGVscGVyKHN0cnVjdCBtZDVfY3R4ICpjdHgpCit7CisJbGUzMl90b19jcHVfYXJyYXkoY3R4LT5ibG9jaywgc2l6ZW9mKGN0eC0+YmxvY2spIC8gc2l6ZW9mKHUzMikpOworCW1kNV90cmFuc2Zvcm0oY3R4LT5oYXNoLCBjdHgtPmJsb2NrKTsKK30KKworc3RhdGljIHZvaWQgbWQ1X2luaXQodm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgbWQ1X2N0eCAqbWN0eCA9IGNvbnRleHQ7CisKKwltY3R4LT5oYXNoWzBdID0gMHg2NzQ1MjMwMTsKKwltY3R4LT5oYXNoWzFdID0gMHhlZmNkYWI4OTsKKwltY3R4LT5oYXNoWzJdID0gMHg5OGJhZGNmZTsKKwltY3R4LT5oYXNoWzNdID0gMHgxMDMyNTQ3NjsKKwltY3R4LT5ieXRlX2NvdW50ID0gMDsKK30KKworc3RhdGljIHZvaWQgbWQ1X3VwZGF0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBtZDVfY3R4ICptY3R4ID0gY29udGV4dDsKKwljb25zdCB1MzIgYXZhaWwgPSBzaXplb2YobWN0eC0+YmxvY2spIC0gKG1jdHgtPmJ5dGVfY291bnQgJiAweDNmKTsKKworCW1jdHgtPmJ5dGVfY291bnQgKz0gbGVuOworCisJaWYgKGF2YWlsID4gbGVuKSB7CisJCW1lbWNweSgoY2hhciAqKW1jdHgtPmJsb2NrICsgKHNpemVvZihtY3R4LT5ibG9jaykgLSBhdmFpbCksCisJCSAgICAgICBkYXRhLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KChjaGFyICopbWN0eC0+YmxvY2sgKyAoc2l6ZW9mKG1jdHgtPmJsb2NrKSAtIGF2YWlsKSwKKwkgICAgICAgZGF0YSwgYXZhaWwpOworCisJbWQ1X3RyYW5zZm9ybV9oZWxwZXIobWN0eCk7CisJZGF0YSArPSBhdmFpbDsKKwlsZW4gLT0gYXZhaWw7CisKKwl3aGlsZSAobGVuID49IHNpemVvZihtY3R4LT5ibG9jaykpIHsKKwkJbWVtY3B5KG1jdHgtPmJsb2NrLCBkYXRhLCBzaXplb2YobWN0eC0+YmxvY2spKTsKKwkJbWQ1X3RyYW5zZm9ybV9oZWxwZXIobWN0eCk7CisJCWRhdGEgKz0gc2l6ZW9mKG1jdHgtPmJsb2NrKTsKKwkJbGVuIC09IHNpemVvZihtY3R4LT5ibG9jayk7CisJfQorCisJbWVtY3B5KG1jdHgtPmJsb2NrLCBkYXRhLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBtZDVfZmluYWwodm9pZCAqY29udGV4dCwgdm9pZCAqb3V0KQoreworCXN0cnVjdCBtZDVfY3R4ICptY3R4ID0gY29udGV4dDsKKwljb25zdCB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gbWN0eC0+Ynl0ZV9jb3VudCAmIDB4M2Y7CisJY2hhciAqcCA9IChjaGFyICopbWN0eC0+YmxvY2sgKyBvZmZzZXQ7CisJaW50IHBhZGRpbmcgPSA1NiAtIChvZmZzZXQgKyAxKTsKKworCSpwKysgPSAweDgwOworCWlmIChwYWRkaW5nIDwgMCkgeworCQltZW1zZXQocCwgMHgwMCwgcGFkZGluZyArIHNpemVvZiAodTY0KSk7CisJCW1kNV90cmFuc2Zvcm1faGVscGVyKG1jdHgpOworCQlwID0gKGNoYXIgKiltY3R4LT5ibG9jazsKKwkJcGFkZGluZyA9IDU2OworCX0KKworCW1lbXNldChwLCAwLCBwYWRkaW5nKTsKKwltY3R4LT5ibG9ja1sxNF0gPSBtY3R4LT5ieXRlX2NvdW50IDw8IDM7CisJbWN0eC0+YmxvY2tbMTVdID0gbWN0eC0+Ynl0ZV9jb3VudCA+PiAyOTsKKwlsZTMyX3RvX2NwdV9hcnJheShtY3R4LT5ibG9jaywgKHNpemVvZihtY3R4LT5ibG9jaykgLQorCSAgICAgICAgICAgICAgICAgIHNpemVvZih1NjQpKSAvIHNpemVvZih1MzIpKTsKKwltZDVfdHJhbnNmb3JtKG1jdHgtPmhhc2gsIG1jdHgtPmJsb2NrKTsKKwljcHVfdG9fbGUzMl9hcnJheShtY3R4LT5oYXNoLCBzaXplb2YobWN0eC0+aGFzaCkgLyBzaXplb2YodTMyKSk7CisJbWVtY3B5KG91dCwgbWN0eC0+aGFzaCwgc2l6ZW9mKG1jdHgtPmhhc2gpKTsKKwltZW1zZXQobWN0eCwgMCwgc2l6ZW9mKCptY3R4KSk7Cit9CisKK3N0cnVjdCBkaWdlc3RfYWxnb3JpdGhtIG1kNV9hbGdvcml0aG0gPSB7CisJLm5hbWUJCT0gIm1kNSIsCisJLmN0eHNpemUJPSBNRDVfQ1RYX1NJWkUsCisJLmJsb2Nrc2l6ZQk9ICggTUQ1X0JMT0NLX1dPUkRTICogNCApLAorCS5kaWdlc3RzaXplCT0gTUQ1X0RJR0VTVF9TSVpFLAorCS5pbml0CQk9IG1kNV9pbml0LAorCS51cGRhdGUJCT0gbWQ1X3VwZGF0ZSwKKwkuZmluYWwJCT0gbWQ1X2ZpbmFsLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by9zaGExZXh0cmEuYyBiL2dweGUvc3JjL2NyeXB0by9zaGExZXh0cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQ0YTBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvY3J5cHRvL3NoYTFleHRyYS5jCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL2NyeXB0by5oPgorI2luY2x1ZGUgPGdweGUvc2hhMS5oPgorI2luY2x1ZGUgPGdweGUvaG1hYy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisKKy8qKgorICogU0hBMSBwc2V1ZG9yYW5kb20gZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGRlcml2ZWQga2V5cworICoKKyAqIEB2IGtleQlNYXN0ZXIga2V5IHdpdGggd2hpY2ggdGhpcyBjYWxsIGlzIGFzc29jaWF0ZWQKKyAqIEB2IGtleV9sZW4JTGVuZ3RoIG9mIGtleQorICogQHYgbGFiZWwJTlVMLXRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nIGRlc2NyaWJpbmcgcHVycG9zZSBvZiBQUkYgZGF0YQorICogQHYgZGF0YQlGdXJ0aGVyIGRhdGEgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIFBSRgorICogQHYgZGF0YV9sZW4JTGVuZ3RoIG9mIGZ1cnRoZXIgUFJGIGRhdGEKKyAqIEB2IHByZl9sZW4JQnl0ZXMgb2YgUFJGIHRvIGdlbmVyYXRlCisgKiBAcmV0IHByZglQc2V1ZG9yYW5kb20gZnVuY3Rpb24gYnl0ZXMKKyAqCisgKiBUaGlzIGlzIHRoZSBQUkYgdmFyaWFudCB1c2VkIGJ5IDgwMi4xMSwgZGVmaW5lZCBpbiBJRUVFIDgwMi4xMS0yMDA3CisgKiA4LjUuNS4xLiBFQVAtRkFTVCB1c2VzIGEgZGlmZmVyZW50IFNIQTEtYmFzZWQgUFJGLCBhbmQgVExTIHVzZXMgYW4KKyAqIE1ENS1iYXNlZCBQUkYuCisgKi8KK3ZvaWQgcHJmX3NoYTEgKCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlfbGVuLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB2b2lkICpwcmYsIHNpemVfdCBwcmZfbGVuICkKK3sKKwl1MzIgYmxrOworCXU4IGtleW1ba2V5X2xlbl07CS8qIG1vZGlmaWFibGUgY29weSBvZiBrZXkgKi8KKwl1OCBpbltzdHJsZW4gKCBsYWJlbCApICsgMSArIGRhdGFfbGVuICsgMV07IC8qIG1lc3NhZ2UgdG8gSE1BQyAqLworCXU4ICppbl9ibGtucjsJCS8qIHBvaW50ZXIgdG8gbGFzdCBieXRlIG9mIGluLCBibG9jayBudW1iZXIgKi8KKwl1OCBvdXRbU0hBMV9TSVpFXTsJLyogSE1BQy1TSEExIHJlc3VsdCAqLworCXU4IHNoYTFfY3R4W1NIQTFfQ1RYX1NJWkVdOyAvKiBTSEExIGNvbnRleHQgKi8KKwljb25zdCBzaXplX3QgbGFiZWxfbGVuID0gc3RybGVuICggbGFiZWwgKTsKKworCS8qIFRoZSBITUFDLVNIQS0xIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGdpdmVuIGtleSBvbiB0aGUKKwkgICBtZXNzYWdlIHRleHQgYGxhYmVsJywgZm9sbG93ZWQgYnkgYSBOVUwsIGZvbGxvd2VkIGJ5IG9uZQorCSAgIGJ5dGUgaW5kaWNhdGluZyB0aGUgYmxvY2sgbnVtYmVyICgwIGZvciBmaXJzdCkuICovCisKKwltZW1jcHkgKCBrZXltLCBrZXksIGtleV9sZW4gKTsKKworCW1lbWNweSAoIGluLCBsYWJlbCwgc3RybGVuICggbGFiZWwgKSArIDEgKTsKKwltZW1jcHkgKCBpbiArIGxhYmVsX2xlbiArIDEsIGRhdGEsIGRhdGFfbGVuICk7CisJaW5fYmxrbnIgPSBpbiArIGxhYmVsX2xlbiArIDEgKyBkYXRhX2xlbjsKKworCWZvciAoIGJsayA9IDAgOzsgYmxrKysgKSB7CisJCSppbl9ibGtuciA9IGJsazsKKworCQlobWFjX2luaXQgKCAmc2hhMV9hbGdvcml0aG0sIHNoYTFfY3R4LCBrZXltLCAma2V5X2xlbiApOworCQlobWFjX3VwZGF0ZSAoICZzaGExX2FsZ29yaXRobSwgc2hhMV9jdHgsIGluLCBzaXplb2YgKCBpbiApICk7CisJCWhtYWNfZmluYWwgKCAmc2hhMV9hbGdvcml0aG0sIHNoYTFfY3R4LCBrZXltLCAma2V5X2xlbiwgb3V0ICk7CisKKwkJaWYgKCBwcmZfbGVuIDw9IFNIQTFfU0laRSApIHsKKwkJCW1lbWNweSAoIHByZiwgb3V0LCBwcmZfbGVuICk7CisJCQlicmVhazsKKwkJfQorCisJCW1lbWNweSAoIHByZiwgb3V0LCBTSEExX1NJWkUgKTsKKwkJcHJmX2xlbiAtPSBTSEExX1NJWkU7CisJCXByZiArPSBTSEExX1NJWkU7CisJfQorfQorCisvKioKKyAqIFBCS0RGMiBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBpbm5lciBibG9jayBvcGVyYXRpb24KKyAqCisgKiBAdiBwYXNzcGhyYXNlCVBhc3NwaHJhc2UgZnJvbSB3aGljaCB0byBkZXJpdmUga2V5CisgKiBAdiBwYXNzX2xlbgkJTGVuZ3RoIG9mIHBhc3NwaHJhc2UKKyAqIEB2IHNhbHQJCVNhbHQgdG8gaW5jbHVkZSBpbiBrZXkKKyAqIEB2IHNhbHRfbGVuCQlMZW5ndGggb2Ygc2FsdAorICogQHYgaXRlcmF0aW9ucwlOdW1iZXIgb2YgaXRlcmF0aW9ucyBvZiBTSEExIHRvIHBlcmZvcm0KKyAqIEB2IGJsb2NrbnIJCUluZGV4IG9mIHRoaXMgYmxvY2ssIHN0YXJ0aW5nIGF0IDEKKyAqIEByZXQgYmxvY2sJCVNIQTFfU0laRSBieXRlcyBvZiBQQktERjIgZGF0YQorICoKKyAqIFRoZSBvcGVyYXRpb24gb2YgdGhpcyBmdW5jdGlvbiBpcyBkZXNjcmliZWQgaW4gUkZDIDI4OTguCisgKi8KK3N0YXRpYyB2b2lkIHBia2RmMl9zaGExX2YgKCBjb25zdCB2b2lkICpwYXNzcGhyYXNlLCBzaXplX3QgcGFzc19sZW4sCisJCQkgICAgY29uc3Qgdm9pZCAqc2FsdCwgc2l6ZV90IHNhbHRfbGVuLAorCQkJICAgIGludCBpdGVyYXRpb25zLCB1MzIgYmxvY2tuciwgdTggKmJsb2NrICkKK3sKKwl1OCBwYXNzW3Bhc3NfbGVuXTsJLyogbW9kaWZpYWJsZSBwYXNzcGhyYXNlICovCisJdTggaW5bc2FsdF9sZW4gKyA0XTsJLyogaW5wdXQgYnVmZmVyIHRvIGZpcnN0IHJvdW5kICovCisJdTggbGFzdFtTSEExX1NJWkVdOwkvKiBvdXRwdXQgb2Ygcm91bmQgTiwgaW5wdXQgb2YgTisxICovCisJdTggc2hhMV9jdHhbU0hBMV9DVFhfU0laRV07CisJdTggKm5leHRfaW4gPSBpbjsJLyogY2hhbmdlZCB0byBgbGFzdCcgYWZ0ZXIgZmlyc3Qgcm91bmQgKi8KKwlpbnQgbmV4dF9zaXplID0gc2l6ZW9mICggaW4gKTsKKwlpbnQgaSwgajsKKworCWJsb2NrbnIgPSBodG9ubCAoIGJsb2NrbnIgKTsKKworCW1lbWNweSAoIHBhc3MsIHBhc3NwaHJhc2UsIHBhc3NfbGVuICk7CisJbWVtY3B5ICggaW4sIHNhbHQsIHNhbHRfbGVuICk7CisJbWVtY3B5ICggaW4gKyBzYWx0X2xlbiwgJmJsb2NrbnIsIDQgKTsKKwltZW1zZXQgKCBibG9jaywgMCwgU0hBMV9TSVpFICk7CisKKwlmb3IgKCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKyApIHsKKwkJaG1hY19pbml0ICggJnNoYTFfYWxnb3JpdGhtLCBzaGExX2N0eCwgcGFzcywgJnBhc3NfbGVuICk7CisJCWhtYWNfdXBkYXRlICggJnNoYTFfYWxnb3JpdGhtLCBzaGExX2N0eCwgbmV4dF9pbiwgbmV4dF9zaXplICk7CisJCWhtYWNfZmluYWwgKCAmc2hhMV9hbGdvcml0aG0sIHNoYTFfY3R4LCBwYXNzLCAmcGFzc19sZW4sIGxhc3QgKTsKKworCQlmb3IgKCBqID0gMDsgaiA8IFNIQTFfU0laRTsgaisrICkgeworCQkJYmxvY2tbal0gXj0gbGFzdFtqXTsKKwkJfQorCisJCW5leHRfaW4gPSBsYXN0OworCQluZXh0X3NpemUgPSBTSEExX1NJWkU7CisJfQorfQorCisvKioKKyAqIFBCS0RGMiBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB1c2luZyBTSEExCisgKgorICogQHYgcGFzc3BocmFzZQlQYXNzcGhyYXNlIGZyb20gd2hpY2ggdG8gZGVyaXZlIGtleQorICogQHYgcGFzc19sZW4JCUxlbmd0aCBvZiBwYXNzcGhyYXNlCisgKiBAdiBzYWx0CQlTYWx0IHRvIGluY2x1ZGUgaW4ga2V5CisgKiBAdiBzYWx0X2xlbgkJTGVuZ3RoIG9mIHNhbHQKKyAqIEB2IGl0ZXJhdGlvbnMJTnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgU0hBMSB0byBwZXJmb3JtCisgKiBAdiBrZXlfbGVuCQlMZW5ndGggb2Yga2V5IHRvIGdlbmVyYXRlCisgKiBAcmV0IGtleQkJR2VuZXJhdGVkIGtleSBieXRlcworICoKKyAqIFRoaXMgaXMgdXNlZCBtb3N0IG5vdGFibHkgaW4gODAyLjExIFdQQSBwYXNzcGhyYXNlIGhhc2hpbmcsIGluCisgKiB3aGljaCBjYXNlIHRoZSBzYWx0IGlzIHRoZSBTU0lELCA0MDk2IGl0ZXJhdGlvbnMgYXJlIHVzZWQsIGFuZCBhCisgKiAzMi1ieXRlIGtleSBpcyBnZW5lcmF0ZWQgdGhhdCBzZXJ2ZXMgYXMgdGhlIFBhaXJ3aXNlIE1hc3RlciBLZXkgZm9yCisgKiBFQVBPTCBhdXRoZW50aWNhdGlvbi4KKyAqCisgKiBUaGUgb3BlcmF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgZnVydGhlciBkZXNjcmliZWQgaW4gUkZDIDI4OTguCisgKi8KK3ZvaWQgcGJrZGYyX3NoYTEgKCBjb25zdCB2b2lkICpwYXNzcGhyYXNlLCBzaXplX3QgcGFzc19sZW4sCisJCSAgIGNvbnN0IHZvaWQgKnNhbHQsIHNpemVfdCBzYWx0X2xlbiwKKwkJICAgaW50IGl0ZXJhdGlvbnMsIHZvaWQgKmtleSwgc2l6ZV90IGtleV9sZW4gKQoreworCXUzMiBibG9ja3MgPSAoIGtleV9sZW4gKyBTSEExX1NJWkUgLSAxICkgLyBTSEExX1NJWkU7CisJdTMyIGJsazsKKwl1OCBidWZbU0hBMV9TSVpFXTsKKworCWZvciAoIGJsayA9IDE7IGJsayA8PSBibG9ja3M7IGJsaysrICkgeworCQlwYmtkZjJfc2hhMV9mICggcGFzc3BocmFzZSwgcGFzc19sZW4sIHNhbHQsIHNhbHRfbGVuLAorCQkJCWl0ZXJhdGlvbnMsIGJsaywgYnVmICk7CisJCWlmICgga2V5X2xlbiA8PSBTSEExX1NJWkUgKSB7CisJCQltZW1jcHkgKCBrZXksIGJ1Ziwga2V5X2xlbiApOworCQkJYnJlYWs7CisJCX0KKworCQltZW1jcHkgKCBrZXksIGJ1ZiwgU0hBMV9TSVpFICk7CisJCWtleV9sZW4gLT0gU0hBMV9TSVpFOworCQlrZXkgKz0gU0hBMV9TSVpFOworCX0KK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2NyeXB0by94NTA5LmMgYi9ncHhlL3NyYy9jcnlwdG8veDUwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZWQ0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9jcnlwdG8veDUwOS5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2FzbjEuaD4KKyNpbmNsdWRlIDxncHhlL3g1MDkuaD4KKworLyoqIEBmaWxlCisgKgorICogWC41MDkgY2VydGlmaWNhdGVzCisgKgorICogVGhlIHN0cnVjdHVyZSBvZiBYLjUwOXYzIGNlcnRpZmljYXRlcyBpcyBjb25jaXNlbHkgZG9jdW1lbnRlZCBpbgorICogUkZDNTI4MCBzZWN0aW9uIDQuMS4gIFRoZSBzdHJ1Y3R1cmUgb2YgUlNBIHB1YmxpYyBrZXlzIGlzCisgKiBkb2N1bWVudGVkIGluIFJGQzIzMTMuCisgKi8KKworLyoqIE9iamVjdCBJZGVudGlmaWVyIGZvciAicnNhRW5jcnlwdGlvbiIgKDEuMi44NDAuMTEzNTQ5LjEuMS4xKSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb2lkX3JzYV9lbmNyeXB0aW9uW10gPSB7IDB4MmEsIDB4ODYsIDB4NDgsIDB4ODYsIDB4ZjcsCisJCQkJCSAgICAgIDB4MGQsIDB4MDEsIDB4MDEsIDB4MDEgfTsKKworLyoqCisgKiBJZGVudGlmeSBYLjUwOSBjZXJ0aWZpY2F0ZSBwdWJsaWMga2V5CisgKgorICogQHYgY2VydGlmaWNhdGUJQ2VydGlmaWNhdGUKKyAqIEB2IGFsZ29yaXRobQkJUHVibGljIGtleSBhbGdvcml0aG0gdG8gZmlsbCBpbgorICogQHYgcHVia2V5CQlQdWJsaWMga2V5IHZhbHVlIHRvIGZpbGwgaW4KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHg1MDlfcHVibGljX2tleSAoIGNvbnN0IHN0cnVjdCBhc24xX2N1cnNvciAqY2VydGlmaWNhdGUsCisJCQkgICAgIHN0cnVjdCBhc24xX2N1cnNvciAqYWxnb3JpdGhtLAorCQkJICAgICBzdHJ1Y3QgYXNuMV9jdXJzb3IgKnB1YmtleSApIHsKKwlzdHJ1Y3QgYXNuMV9jdXJzb3IgY3Vyc29yOworCWludCByYzsKKworCS8qIExvY2F0ZSBzdWJqZWN0UHVibGljS2V5SW5mbyAqLworCW1lbWNweSAoICZjdXJzb3IsIGNlcnRpZmljYXRlLCBzaXplb2YgKCBjdXJzb3IgKSApOworCXJjID0gKCBhc24xX2VudGVyICggJmN1cnNvciwgQVNOMV9TRVFVRU5DRSApLCAvKiBDZXJ0aWZpY2F0ZSAqLworCSAgICAgICBhc24xX2VudGVyICggJmN1cnNvciwgQVNOMV9TRVFVRU5DRSApLCAvKiB0YnNDZXJ0aWZpY2F0ZSAqLworCSAgICAgICBhc24xX3NraXAgKCAmY3Vyc29yLCBBU04xX0VYUExJQ0lUX1RBRyApLCAvKiB2ZXJzaW9uICovCisJICAgICAgIGFzbjFfc2tpcCAoICZjdXJzb3IsIEFTTjFfSU5URUdFUiApLCAvKiBzZXJpYWxOdW1iZXIgKi8KKwkgICAgICAgYXNuMV9za2lwICggJmN1cnNvciwgQVNOMV9TRVFVRU5DRSApLCAvKiBzaWduYXR1cmUgKi8KKwkgICAgICAgYXNuMV9za2lwICggJmN1cnNvciwgQVNOMV9TRVFVRU5DRSApLCAvKiBpc3N1ZXIgKi8KKwkgICAgICAgYXNuMV9za2lwICggJmN1cnNvciwgQVNOMV9TRVFVRU5DRSApLCAvKiB2YWxpZGl0eSAqLworCSAgICAgICBhc24xX3NraXAgKCAmY3Vyc29yLCBBU04xX1NFUVVFTkNFICksIC8qIG5hbWUgKi8KKwkgICAgICAgYXNuMV9lbnRlciAoICZjdXJzb3IsIEFTTjFfU0VRVUVOQ0UgKS8qIHN1YmplY3RQdWJsaWNLZXlJbmZvKi8pOworCWlmICggcmMgIT0gMCApIHsKKwkJREJHICggIkNhbm5vdCBsb2NhdGUgc3ViamVjdFB1YmxpY0tleUluZm8gaW46XG4iICk7CisJCURCR19IREEgKCAwLCBjZXJ0aWZpY2F0ZS0+ZGF0YSwgY2VydGlmaWNhdGUtPmxlbiApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogTG9jYXRlIGFsZ29yaXRobSAqLworCW1lbWNweSAoIGFsZ29yaXRobSwgJmN1cnNvciwgc2l6ZW9mICggKmFsZ29yaXRobSApICk7CisJcmMgPSAoIGFzbjFfZW50ZXIgKCBhbGdvcml0aG0sIEFTTjFfU0VRVUVOQ0UgKSAvKiBhbGdvcml0aG0gKi8gKTsKKwlpZiAoIHJjICE9IDAgKSB7CisJCURCRyAoICJDYW5ub3QgbG9jYXRlIGFsZ29yaXRobSBpbjpcbiIgKTsKKwkJREJHX0hEQSAoIDAsIGNlcnRpZmljYXRlLT5kYXRhLCBjZXJ0aWZpY2F0ZS0+bGVuICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBMb2NhdGUgc3ViamVjdFB1YmxpY0tleSAqLworCW1lbWNweSAoIHB1YmtleSwgJmN1cnNvciwgc2l6ZW9mICggKnB1YmtleSApICk7CisJcmMgPSAoIGFzbjFfc2tpcCAoIHB1YmtleSwgQVNOMV9TRVFVRU5DRSApLCAvKiBhbGdvcml0aG0gKi8KKwkgICAgICAgYXNuMV9lbnRlciAoIHB1YmtleSwgQVNOMV9CSVRfU1RSSU5HICkgLyogc3ViamVjdFB1YmxpY0tleSovICk7CisJaWYgKCByYyAhPSAwICkgeworCQlEQkcgKCAiQ2Fubm90IGxvY2F0ZSBzdWJqZWN0UHVibGljS2V5IGluOlxuIiApOworCQlEQkdfSERBICggMCwgY2VydGlmaWNhdGUtPmRhdGEsIGNlcnRpZmljYXRlLT5sZW4gKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIElkZW50aWZ5IFguNTA5IGNlcnRpZmljYXRlIFJTQSBtb2R1bHVzIGFuZCBwdWJsaWMgZXhwb25lbnQKKyAqCisgKiBAdiBjZXJ0aWZpY2F0ZQlDZXJ0aWZpY2F0ZQorICogQHYgcnNhCQlSU0EgcHVibGljIGtleSB0byBmaWxsIGluCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBldmVudHVhbGx5IGNhbGxpbmcKKyAqIHg1MDlfZnJlZV9yc2FfcHVibGljX2tleSgpIHRvIGZyZWUgdGhlIHN0b3JhZ2UgYWxsb2NhdGVkIHRvIGhvbGQKKyAqIHRoZSBSU0EgbW9kdWx1cyBhbmQgZXhwb25lbnQuCisgKi8KK2ludCB4NTA5X3JzYV9wdWJsaWNfa2V5ICggY29uc3Qgc3RydWN0IGFzbjFfY3Vyc29yICpjZXJ0aWZpY2F0ZSwKKwkJCSAgc3RydWN0IHg1MDlfcnNhX3B1YmxpY19rZXkgKnJzYV9wdWJrZXkgKSB7CisJc3RydWN0IGFzbjFfY3Vyc29yIGFsZ29yaXRobTsKKwlzdHJ1Y3QgYXNuMV9jdXJzb3IgcHVia2V5OworCXN0cnVjdCBhc24xX2N1cnNvciBtb2R1bHVzOworCXN0cnVjdCBhc24xX2N1cnNvciBleHBvbmVudDsKKwlpbnQgcmM7CisKKwkvKiBGaXJzdCwgZXh0cmFjdCB0aGUgcHVibGljIGtleSBhbGdvcml0aG0gYW5kIGtleSBkYXRhICovCisJaWYgKCAoIHJjID0geDUwOV9wdWJsaWNfa2V5ICggY2VydGlmaWNhdGUsICZhbGdvcml0aG0sCisJCQkJICAgICAgJnB1YmtleSApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIENoZWNrIHRoYXQgYWxnb3JpdGhtIGlzIFJTQSAqLworCXJjID0gKCBhc24xX2VudGVyICggJmFsZ29yaXRobSwgQVNOMV9PSUQgKSAvKiBhbGdvcml0aG0gKi8gKTsKKwlpZiAoIHJjICE9IDAgKSB7CisJCURCRyAoICJDYW5ub3QgbG9jYXRlIGFsZ29yaXRobTpcbiIgKTsKKwkJREJHX0hEQSAoIDAsIGNlcnRpZmljYXRlLT5kYXRhLCBjZXJ0aWZpY2F0ZS0+bGVuICk7CisJcmV0dXJuIHJjOworCX0KKwlpZiAoICggYWxnb3JpdGhtLmxlbiAhPSBzaXplb2YgKCBvaWRfcnNhX2VuY3J5cHRpb24gKSApIHx8CisJICAgICAoIG1lbWNtcCAoIGFsZ29yaXRobS5kYXRhLCAmb2lkX3JzYV9lbmNyeXB0aW9uLAorCQkJc2l6ZW9mICggb2lkX3JzYV9lbmNyeXB0aW9uICkgKSAhPSAwICkgKSB7CisJCURCRyAoICJhbGdvcml0aG0gaXMgbm90IHJzYUVuY3J5cHRpb24gaW46XG4iICk7CisJCURCR19IREEgKCAwLCBjZXJ0aWZpY2F0ZS0+ZGF0YSwgY2VydGlmaWNhdGUtPmxlbiApOworCQlyZXR1cm4gLUVOT1RTVVA7CisJfQorCisJLyogQ2hlY2sgdGhhdCBwdWJsaWMga2V5IGlzIGEgYnl0ZSBzdHJpbmcsIGkuZS4gdGhhdCB0aGUKKwkgKiAidW51c2VkIGJpdHMiIGJ5dGUgY29udGFpbnMgemVyby4KKwkgKi8KKwlpZiAoICggcHVia2V5LmxlbiA8IDEgKSB8fAorCSAgICAgKCAoICooIHVpbnQ4X3QgKiApIHB1YmtleS5kYXRhICkgIT0gMCApICkgeworCQlEQkcgKCAic3ViamVjdFB1YmxpY0tleSBpcyBub3QgYSBieXRlIHN0cmluZyBpbjpcbiIgKTsKKwkJREJHX0hEQSAoIDAsIGNlcnRpZmljYXRlLT5kYXRhLCBjZXJ0aWZpY2F0ZS0+bGVuICk7CisJCXJldHVybiAtRU5PVFNVUDsKKwl9CisJcHVia2V5LmRhdGErKzsKKwlwdWJrZXkubGVuLS07CisKKwkvKiBQaWNrIG91dCB0aGUgbW9kdWx1cyBhbmQgZXhwb25lbnQgKi8KKwlyYyA9ICggYXNuMV9lbnRlciAoICZwdWJrZXksIEFTTjFfU0VRVUVOQ0UgKSAvKiBSU0FQdWJsaWNLZXkgKi8gKTsKKwlpZiAoIHJjICE9IDAgKSB7CisJCURCRyAoICJDYW5ub3QgbG9jYXRlIFJTQVB1YmxpY0tleSBpbjpcbiIgKTsKKwkJREJHX0hEQSAoIDAsIGNlcnRpZmljYXRlLT5kYXRhLCBjZXJ0aWZpY2F0ZS0+bGVuICk7CisJCXJldHVybiAtRU5PVFNVUDsKKwl9CisJbWVtY3B5ICggJm1vZHVsdXMsICZwdWJrZXksIHNpemVvZiAoIG1vZHVsdXMgKSApOworCXJjID0gKCBhc24xX2VudGVyICggJm1vZHVsdXMsIEFTTjFfSU5URUdFUiApIC8qIG1vZHVsdXMgKi8gKTsKKwlpZiAoIHJjICE9IDAgKSB7CisJCURCRyAoICJDYW5ub3QgbG9jYXRlIG1vZHVsdXMgaW46XG4iICk7CisJCURCR19IREEgKCAwLCBjZXJ0aWZpY2F0ZS0+ZGF0YSwgY2VydGlmaWNhdGUtPmxlbiApOworCQlyZXR1cm4gLUVOT1RTVVA7CisJfQorCW1lbWNweSAoICZleHBvbmVudCwgJnB1YmtleSwgc2l6ZW9mICggZXhwb25lbnQgKSApOworCXJjID0gKCBhc24xX3NraXAgKCAmZXhwb25lbnQsIEFTTjFfSU5URUdFUiApLCAvKiBtb2R1bHVzICovCisJICAgICAgIGFzbjFfZW50ZXIgKCAmZXhwb25lbnQsIEFTTjFfSU5URUdFUiApIC8qIHB1YmxpY0V4cG9uZW50ICovICk7CisJaWYgKCByYyAhPSAwICkgeworCQlEQkcgKCAiQ2Fubm90IGxvY2F0ZSBwdWJsaWNFeHBvbmVudCBpbjpcbiIgKTsKKwkJREJHX0hEQSAoIDAsIGNlcnRpZmljYXRlLT5kYXRhLCBjZXJ0aWZpY2F0ZS0+bGVuICk7CisJCXJldHVybiAtRU5PVFNVUDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBhbmQgY29weSBvdXQgbW9kdWx1cyBhbmQgZXhwb25lbnQgKi8KKwlyc2FfcHVia2V5LT5tb2R1bHVzID0gbWFsbG9jICggbW9kdWx1cy5sZW4gKyBleHBvbmVudC5sZW4gKTsKKwlpZiAoICEgcnNhX3B1YmtleS0+bW9kdWx1cyApCisJCXJldHVybiAtRU5PTUVNOworCXJzYV9wdWJrZXktPmV4cG9uZW50ID0gKCByc2FfcHVia2V5LT5tb2R1bHVzICsgbW9kdWx1cy5sZW4gKTsKKwltZW1jcHkgKCByc2FfcHVia2V5LT5tb2R1bHVzLCBtb2R1bHVzLmRhdGEsIG1vZHVsdXMubGVuICk7CisJcnNhX3B1YmtleS0+bW9kdWx1c19sZW4gPSBtb2R1bHVzLmxlbjsKKwltZW1jcHkgKCByc2FfcHVia2V5LT5leHBvbmVudCwgZXhwb25lbnQuZGF0YSwgZXhwb25lbnQubGVuICk7CisJcnNhX3B1YmtleS0+ZXhwb25lbnRfbGVuID0gZXhwb25lbnQubGVuOworCisJREJHMiAoICJSU0EgbW9kdWx1czpcbiIgKTsKKwlEQkcyX0hEQSAoIDAsIHJzYV9wdWJrZXktPm1vZHVsdXMsIHJzYV9wdWJrZXktPm1vZHVsdXNfbGVuICk7CisJREJHMiAoICJSU0EgZXhwb25lbnQ6XG4iICk7CisJREJHMl9IREEgKCAwLCByc2FfcHVia2V5LT5leHBvbmVudCwgcnNhX3B1YmtleS0+ZXhwb25lbnRfbGVuICk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RvYy9idWlsZF9zeXMuZG94IGIvZ3B4ZS9zcmMvZG9jL2J1aWxkX3N5cy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2NmY2NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RvYy9idWlsZF9zeXMuZG94CkBAIC0wLDAgKzEsNDE5IEBACisvKiogQHBhZ2UgYnVpbGRfc3lzIEJ1aWxkIHN5c3RlbQorCitAc2VjdGlvbiBvdmVydmlldyBPdmVydmlldworCitCdWlsZGluZyBhbiBFdGhlcmJvb3QgaW1hZ2UgY29uc2lzdHMgb2YgdGhyZWUgc3RhZ2VzOgorCisgIC0jIEByZWYgY29tcGlsYXRpb24gOiBDb21waWxpbmcgYWxsIHRoZSBzb3VyY2UgZmlsZXMgaW50byBvYmplY3QgZmlsZXMKKyAgLSMgQHJlZiBsaW5raW5nIDogTGlua2luZyBhIHBhcnRpY3VsYXIgaW1hZ2UgZnJvbSBzZWxlY3RlZCBvYmplY3QgZmlsZXMKKyAgLSMgQHJlZiBmaW5hbGlzYXRpb24gOiBQcm9kdWNpbmcgdGhlIGZpbmFsIG91dHB1dCBiaW5hcnkKKworVGhvdWdoIHRoaXMgaXMgYSByZW1hcmthYmx5IGNvbXBsZXggcHJvY2VzcywgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUKK3RoYXQgaXQgYWxsIGhhcHBlbnMgYXV0b21hdGljYWxseS4gIFdoYXRldmVyIHN0YXRlIHlvdXIgYnVpbGQgdHJlZSBpcworaW4sIHlvdSBjYW4gYWx3YXlzIHR5cGUsIGZvciBleGFtcGxlCisKK0Bjb2RlCisKKwltYWtlIGJpbi9ydGw4MTM5LmRzaworCitAZW5kY29kZQorCithbmQga25vdyB0aGF0IHlvdSB3aWxsIGdldCBhIGZsb3BweSBkaXNrIGltYWdlIHdpdGggYW4gUlRMODEzOSBkcml2ZXIKK2J1aWx0IGZyb20gdGhlIGN1cnJlbnQgc291cmNlcy4KKworQHNlY3Rpb24gY29tcGlsYXRpb24gQ29tcGlsYXRpb24KKworQHN1YnNlY3Rpb24gY29tcF9vdmVydmlldyBPdmVydmlldworCitFYWNoIHNvdXJjZSBmaWxlIChhIEBjIC5jIG9yIGEgQGMgLlMgZmlsZSkgaXMgY29tcGlsZWQgaW50byBhIEBjIC5vCitmaWxlIGluIHRoZSBAYyBiaW4vIGRpcmVjdG9yeS4gIEV0aGVyYm9vdCBtYWtlcyBtaW5pbWFsIHVzZSBvZgorY29uZGl0aW9uYWwgY29tcGlsYXRpb24gKHNlZSBAcmVmIGlmZGVmX2hhcm1mdWwpLCBhbmQgc28geW91IHdpbGwgZmluZAordGhhdCBhbGwgb2JqZWN0cyBnZXQgYnVpbHQsIGV2ZW4gdGhlIG9iamVjdHMgdGhhdCBjb3JyZXNwb25kIHRvCitmZWF0dXJlcyB0aGF0IHlvdSBhcmUgbm90IGludGVuZGluZyB0byBpbmNsdWRlIGluIHlvdXIgaW1hZ2UuICBGb3IKK2V4YW1wbGUsIGFsbCBuZXR3b3JrIGNhcmQgZHJpdmVycyB3aWxsIGJlIGNvbXBpbGVkIGV2ZW4gaWYgeW91IGFyZQoranVzdCBidWlsZGluZyBhIFJPTSBmb3IgYSAzYzUwOSBjYXJkLiAgVGhpcyBpcyBhIGRlbGliZXJhdGUgZGVzaWduCitkZWNpc2lvbjsgcGxlYXNlIGRvIEBiIG5vdCBhdHRlbXB0IHRvICJmaXgiIHRoZSBidWlsZCBzeXN0ZW0gdG8gYXZvaWQKK2RvaW5nIHRoaXMuCisKK1NvdXJjZSBmaWxlcyBhcmUgZGVmaW5lZCB0byBiZSBhbnkgQGMgLmMgb3IgQGMgLlMgZmlsZXMgZm91bmQgaW4gYQorZGlyZWN0b3J5IGxpc3RlZCBpbiB0aGUgTWFrZWZpbGUgdmFyaWFibGUgI1NSQ0RJUlMuICBZb3UgdGhlcmVmb3JlIGRvCitAYiBub3QgbmVlZCB0byBlZGl0IHRoZSBNYWtlZmlsZSBqdXN0IGJlY2F1c2UgeW91IGhhdmUgYWRkZWQgYSBuZXcKK3NvdXJjZSBmaWxlIChhbHRob3VnaCB5b3Ugd2lsbCBuZWVkIHRvIGVkaXQgdGhlIE1ha2VmaWxlIGlmIHlvdSBoYXZlCithZGRlZCBhIG5ldyBzb3VyY2UgZGlyZWN0b3J5KS4gIFRvIHNlZSBhIGxpc3Qgb2YgYWxsIHNvdXJjZQorZGlyZWN0b3JpZXMgYW5kIHNvdXJjZSBmaWxlcyB0aGF0IHRoZSBidWlsZCBzeXN0ZW0gY3VycmVudGx5IGtub3dzCithYm91dCwgeW91IGNhbiB1c2UgdGhlIGNvbW1hbmRzCisKK0Bjb2RlCisKKwltYWtlIHNyY2RpcnMKKwltYWtlIHNyY3MKKworQGVuZGNvZGUKKworUnVsZXMgZm9yIGNvbXBpbGluZyBAYyAuYyBhbmQgQGMgLlMgZmlsZXMgYXJlIGRlZmluZWQgaW4gdGhlIE1ha2VmaWxlCit2YXJpYWJsZXMgI1JVTEVfYyBhbmQgI1JVTEVfUy4gIE1ha2VmaWxlIHJ1bGVzIGFyZSBhdXRvbWF0aWNhbGx5CitnZW5lcmF0ZWQgZm9yIGVhY2ggc291cmNlIGZpbGUgdXNpbmcgdGhlc2UgcnVsZXMuICBUaGUgZ2VuZXJhdGVkIHJ1bGVzCitjYW4gYmUgZm91bmQgaW4gdGhlIEBjIC5kIGZpbGUgY29ycmVzcG9uZGluZyB0byBlYWNoIHNvdXJjZSBmaWxlOwordGhlc2UgYXJlIGxvY2F0ZWQgaW4gPHR0PmJpbi9kZXBzLzwvdHQ+LiAgRm9yIGV4YW1wbGUsIHRoZSBydWxlcworZ2VuZXJhdGVkIGZvciA8dHQ+ZHJpdmVycy9uZXQvcnRsODEzOS5jPC90dD4gY2FuIGJlIGZvdW5kIGluCis8dHQ+YmluL2RlcHMvZHJpdmVycy9uZXQvcnRsODEzOS5jLmQ8L3R0Pi4gIFRoZXNlIHJ1bGVzIGFsbG93IHlvdSB0bwordHlwZSwgZm9yIGV4YW1wbGUKKworQGNvZGUKKworCW1ha2UgYmluL3J0bDgxMzkubworCitAZW5kY29kZQorCithbmQgaGF2ZSA8dHQ+cnRsODEzOS5vPC90dD4gYmUgYnVpbHQgZnJvbQorPHR0PmRyaXZlcnMvbmV0L3J0bDgxMzkuYzwvdHQ+IHVzaW5nIHRoZSBnZW5lcmljIHJ1bGUgI1JVTEVfYyBmb3IKK2NvbXBpbGluZyBAYyAuYyBmaWxlcy4KKworWW91IGNhbiBzZWUgdGhlIGZ1bGwgbGlzdCBvZiBvYmplY3QgZmlsZXMgdGhhdCB3aWxsIGJlIGJ1aWx0IHVzaW5nCisKK0Bjb2RlCisKKwltYWtlIGJvYmpzCisKK0BlbmRjb2RlCisKK0BzdWJzZWN0aW9uIGNvbXBfYXIgQWZ0ZXIgY29tcGlsYXRpb24KKworT25jZSBhbGwgb2JqZWN0cyBoYXZlIGJlZW4gY29tcGlsZWQsIHRoZXkgd2lsbCBiZSBjb2xsZWN0ZWQgaW50byBhCitidWlsZCBsaWJyYXJ5ICgiYmxpYiIpIGluIDx0dD5iaW4vYmxpYi5hPC90dD4uCisKK0BzdWJzZWN0aW9uIGNvbXBfY3VzdG9tIEN1c3RvbWlzaW5nIGNvbXBpbGF0aW9uCisKK1RoZSBNYWtlZmlsZSBydWxlcyBmb3IgYSBwYXJ0aWN1bGFyIG9iamVjdCBjYW4gYmUgY3VzdG9taXNlZCB0byBhCitjZXJ0YWluIGV4dGVudCBieSBkZWZpbmluZyB0aGUgTWFrZWZpbGUgdmFyaWFibGUgQ0ZMQUdTX0A8b2JqZWN0QD4uCitGb3IgZXhhbXBsZSwgaWYgeW91IHdlcmUgdG8gc2V0CisKK0Bjb2RlCisKKwlDRkxBR1NfcnRsODEzOSA9IC1ERk9PCisKK0BlbmRjb2RlCisKK3RoZW4gPHR0PmJpbi9ydGw4MTM5Lm88L3R0PiB3b3VsZCBiZSBjb21waWxlZCB3aXRoIHRoZSBhZGRpdGlvbmFsCitmbGFncyA8dHQ+LURGT088L3R0Pi4gIFRvIHNlZSB0aGUgZmxhZ3MgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbgorY29tcGlsaW5nIGEgcGFydGljdWxhciBvYmplY3QsIHlvdSBjYW4gdXNlIGUuZy4KKworQGNvZGUKKworCW1ha2UgYmluL3J0bDgxMzkuZmxhZ3MKKworQGVuZGNvZGUKKworSWYgeW91IG5lZWQgbW9yZSBmbGV4aWJpbGl0eSB0aGFuIHRoZSBDRkxBR1NfQDxvYmplY3RAPiBtZWNoYW5pc20KK3Byb3ZpZGVzLCB0aGVuIHlvdSBjYW4gZXhjbHVkZSBzb3VyY2UgZmlsZXMgZnJvbSB0aGUgYXV0b21hdGljIHJ1bGUKK2dlbmVyYXRpb24gcHJvY2VzcyBieSBsaXN0aW5nIHRoZW0gaW4gdGhlIE1ha2VmaWxlIHZhcmlhYmxlCisjTk9OX0FVVE9fU1JDUy4gIFRoZSBjb21tYW5kCisKK0Bjb2RlCisKKwltYWtlIGF1dG9zcmNzCisKK0BlbmRjb2RlCisKK3dpbGwgc2hvdyB5b3Ugd2hpY2ggZmlsZXMgYXJlIGN1cnJlbnRseSBwYXJ0IG9mIHRoZSBhdXRvbWF0aWMgcnVsZQorZ2VuZXJhdGlvbiBwcm9jZXNzLgorCitAc3Vic2VjdGlvbiBjb21wX211bHRpb2JqIE11bHRpcGxlIG9iamVjdHMKKworQSBzaW5nbGUgc291cmNlIGZpbGUgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb2JqZWN0IGZpbGVzLgorVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gZ2VuZXJhdGUgdGhlIGRlY29tcHJlc3NpbmcgYW5kIHRoZQorbm9uLWRlY29tcHJlc3NpbmcgcHJlZml4ZXMgZnJvbSB0aGUgc2FtZSBzb3VyY2UgZmlsZXMuCisKK0J5IGRlZmF1bHQsIGEgc2luZ2xlIG9iamVjdCB3aWxsIGJlIGJ1aWx0IGZyb20gZWFjaCBzb3VyY2UgZmlsZS4gIFRvCitvdmVycmlkZSB0aGUgbGlzdCBvZiBvYmplY3RzIGZvciBhIHNvdXJjZSBmaWxlLCB5b3UgY2FuIGRlZmluZSB0aGUKK01ha2VmaWxlIHZhcmlhYmxlIE9CSlNfQDxvYmplY3RAPi4gIEZvciBleGFtcGxlLCB0aGUKKzx0dD5hcmNoL2kzODYvcHJlZml4L2Rza3ByZWZpeC5TPC90dD4gc291cmNlIGZpbGUgaXMgYnVpbHQgaW50byB0d28KK29iamVjdHMsIDx0dD5iaW4vZHNrcHJlZml4Lm88L3R0PiBhbmQgPHR0Pnpkc2twcmVmaXgubzwvdHQ+IGJ5CitkZWZpbmluZyB0aGUgTWFrZWZpbGUgdmFyaWFibGUKKworQGNvZGUKKworCU9CSlNfZHNrcHJlZml4ID0gZHNrcHJlZml4IHpkc2twcmVmaXgKKworQGVuZGNvZGUKKworU2luY2UgdGhlcmUgd291bGQgYmUgbGl0dGxlIHBvaW50IGluIGJ1aWxkaW5nIHR3byBpZGVudGljYWwgb2JqZWN0cywKK2N1c3RvbWlzZWQgY29tcGlsYXRpb24gZmxhZ3MgKHNlZSBAcmVmIGNvbXBfY3VzdG9tKSBhcmUgZGVmaW5lZCBhcworCitAY29kZQorCisJQ0ZMQUdTX3pkc2twcmVmaXggPSAtRENPTVBSRVNTCisKK0BlbmRjb2RlCisKK1RodXMsIDx0dD5hcmNoL2kzODYvcHJlZml4L2Rza3ByZWZpeC5TPC90dD4gaXMgYnVpbHQgaW50byBAYworZHNrcHJlZml4Lm8gdXNpbmcgdGhlIG5vcm1hbCBzZXQgb2YgZmxhZ3MsIGFuZCBpbnRvIEBjIHpkc2twcmVmaXgubwordXNpbmcgdGhlIG5vcm1hbCBzZXQgb2YgZmxhZ3MgcGx1cyA8dHQ+LURDT01QUkVTUzwvdHQ+LgorCitAc3Vic2VjdGlvbiBjb21wX2RlYnVnIFNwZWNpYWwgZGVidWdnaW5nIHRhcmdldHMKKworSW4gYWRkaXRpb24gdG8gdGhlIGJhc2ljIHJ1bGVzICNSVUxFX2MgYW5kICNSVUxFX1MgZm9yIGNvbXBpbGluZworc291cmNlIGZpbGVzIGludG8gb2JqZWN0IGZpbGVzLCB0aGVyZSBhcmUgdmFyaW91cyBvdGhlciBydWxlcyB0aGF0IGNhbgorYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisKK0BzdWJzdWJzZWN0aW9uIGNvbXBfZGVidWdfY190b19jIFByZXByb2Nlc3NlZCBDCisKK1lvdSBjYW4gc2VlIHRoZSByZXN1bHRzIG9mIHByZXByb2Nlc3NpbmcgYSBAYyAuYyBmaWxlIChpbmNsdWRpbmcgdGhlCitwZXItb2JqZWN0IGZsYWdzIGRlZmluZWQgdmlhIENGTEFHU19APG9iamVjdEA+IGlmIGFwcGxpY2FibGUpIHVzaW5nCitlLmcuCisKK0Bjb2RlCisKKwltYWtlIGJpbi9ydGw4MTM5LmMKKworQGVuZGNvZGUKKworYW5kIGV4YW1pbmluZyB0aGUgcmVzdWx0aW5nIGZpbGUgKDx0dD5iaW4vcnRsODEzOS5jPC90dD4gaW4gdGhpcworY2FzZSkuCisKK0BzdWJzdWJzZWN0aW9uIGNvbXBfZGVidWdfeF90b19zIEFzc2VtYmxlcgorCitZb3UgY2FuIHNlZSB0aGUgcmVzdWx0cyBvZiBhc3NlbWJsaW5nIGEgQGMgLmMgZmlsZSwgb3Igb2YKK3ByZXByb2Nlc3NpbmcgYSBAYyAuUyBmaWxlLCB1c2luZyBlLmcuCisKK0Bjb2RlCisKKwltYWtlIGJpbi9ydGw4MTM5LnMKKwltYWtlIGJpbi96ZHNrcHJlZml4LnMKKworQGVuZGNvZGUKKworQHN1YnN1YnNlY3Rpb24gY29tcF9kZWJ1Z19kYmcgRGVidWdnaW5nLWVuYWJsZWQgdGFyZ2V0cworCitZb3UgY2FuIGJ1aWxkIHRhcmdldHMgd2l0aCBkZWJ1ZyBtZXNzYWdlcyAoREJHKCkpIGVuYWJsZWQgdXNpbmcgZS5nLgorCitAY29kZQorCisJbWFrZSBiaW4vcnRsODEzOS5kYmcubworCW1ha2UgYmluL3J0bDgxMzkuZGJnMi5vCisKK0BlbmRjb2RlCisKK1lvdSB3aWxsIHByb2JhYmx5IG5vdCBuZWVkIHRvIHVzZSB0aGVzZSB0YXJnZXRzIGRpcmVjdGx5LCBzaW5jZSBhCittZWNoYW5pc20gZXhpc3RzIHRvIHNlbGVjdCBkZWJ1Z2dpbmcgbGV2ZWxzIGF0IGJ1aWxkIHRpbWU7IHNlZSBAcmVmCitkZWJ1Zy4KKworQHNlY3Rpb24gbGlua2luZyBMaW5raW5nCisKK0BzdWJzZWN0aW9uIGxpbmtfb3ZlcnZpZXcgT3ZlcnZpZXcKKworRXRoZXJib290IGlzIGRlc2lnbmVkIHRvIGJlIHNtYWxsIGFuZCBleHRyZW1lbHkgY3VzdG9taXNhYmxlLiAgVGhpcyBpcworYWNoaWV2ZWQgYnkgbGlua2luZyBpbiBvbmx5IHRoZSBmZWF0dXJlcyB0aGF0IGFyZSByZWFsbHkgd2FudGVkIGluIGFueQorcGFydGljdWxhciBidWlsZC4KKworVGhlcmUgYXJlIHR3byBwbGFjZXMgZnJvbSB3aGljaCB0aGUgbGlzdCBvZiBkZXNpcmVkIGZlYXR1cmVzIGlzCitvYnRhaW5lZDoKKworICAtIyBAcmVmIGxpbmtfY29uZmlnX2gKKyAgLSMgQHJlZiBsaW5rX2NtZGxpbmUKKworQHN1YnNlY3Rpb24gbGlua19jb25maWdfaCBjb25maWcuaAorCitUaGUgY29uZmlnLmggZmlsZSBpcyB1c2VkIHRvIGRlZmluZSBnbG9iYWwgYnVpbGQgb3B0aW9ucyB0aGF0IGFyZQorbGlrZWx5IHRvIGFwcGx5IHRvIGFsbCBpbWFnZXMgdGhhdCB5b3UgYnVpbGQsIHN1Y2ggYXMgdGhlIGNvbnNvbGUKK3R5cGVzLCBzdXBwb3J0ZWQgZG93bmxvYWQgcHJvdG9jb2xzIGV0Yy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKK2NvbmZpZy5oIGZvciBtb3JlIGRldGFpbHMuCisKK0BzdWJzZWN0aW9uIGxpbmtfY21kbGluZSBUaGUgbWFrZSBjb21tYW5kIGxpbmUKKworV2hlbiB5b3UgdHlwZSBhIGNvbW1hbmQgc3VjaCBhcworCitAY29kZQorCisJbWFrZSBiaW4vZGZlNTM4Lnpyb20KKworQGVuZGNvZGUKKworaXQgaXMgdXNlZCB0byBkZXJpdmUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKworICAgLSBXZSBhcmUgYnVpbGRpbmcgYSBjb21wcmVzc2VkIFJPTSBpbWFnZQorICAgLSBUaGUgREZFNTM4IGlzIGEgUENJIE5JQywgc28gd2UgbmVlZCB0aGUgZGVjb21wcmVzc2luZyBQQ0kgUk9NIHByZWZpeAorICAgLSBUaGUgUENJIElEcyBmb3IgdGhlIERGRTUzOCBhcmUgMTE4NjoxMzAwCisgICAtIFRoZSBERkU1MzggaXMgYW4gcnRsODEzOS1iYXNlZCBjYXJkLCB0aGVyZWZvcmUgd2UgbmVlZCB0aGUgcnRsODEzOSBkcml2ZXIKKworWW91IGNhbiBzZWUgdGhpcyBwcm9jZXNzIGluIGFjdGlvbiB1c2luZyB0aGUgY29tbWFuZAorCitAY29kZQorCisJbWFrZSBiaW4vZGZlNTM4Lnpyb20uaW5mbworCitAZW5kY29kZQorCit3aGljaCB3aWxsIHByaW50CisKK0Bjb2RlCisKKwlFbGVtZW50cyAgICAgICAgICAgICA6IGRmZTUzOAorCVByZWZpeCAgICAgICAgICAgICAgIDogenJvbQorCURyaXZlcnMgICAgICAgICAgICAgIDogcnRsODEzOQorCVJPTSBuYW1lICAgICAgICAgICAgIDogZGZlNTM4CisJTWVkaWEgICAgICAgICAgICAgICAgOiByb20KKworCVJPTSB0eXBlICAgICAgICAgICAgIDogcGNpCisJUENJIHZlbmRvciAgICAgICAgICAgOiAweDExODYKKwlQQ0kgZGV2aWNlICAgICAgICAgICA6IDB4MTMwMAorCisJTEQgZHJpdmVyIHN5bWJvbHMgICAgOiBvYmpfcnRsODEzOQorCUxEIHByZWZpeCBzeW1ib2xzICAgIDogb2JqX3pwY2lwcmVmaXgKKwlMRCBJRCBzeW1ib2xzICAgICAgICA6IHBjaV92ZW5kb3JfaWQ9MHgxMTg2IHBjaV9kZXZpY2VfaWQ9MHgxMzAwCisKKwlMRCB0YXJnZXQgZmxhZ3MgICAgICA6ICAtdSBvYmpfenBjaXByZWZpeCAtLWRlZnN5bSBjaGVja19vYmpfenBjaXByZWZpeD1vYmpfenBjaXByZWZpeCAgIC11IG9ial9ydGw4MTM5IC0tZGVmc3ltIGNoZWNrX29ial9ydGw4MTM5PW9ial9ydGw4MTM5ICAgLXUgb2JqX2NvbmZpZyAtLWRlZnN5bSBjaGVja19vYmpfY29uZmlnPW9ial9jb25maWcgIC0tZGVmc3ltIHBjaV92ZW5kb3JfaWQ9MHgxMTg2IC0tZGVmc3ltIHBjaV9kZXZpY2VfaWQ9MHgxMzAwCisKK0BlbmRjb2RlCisKK1RoaXMgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGZvbGxvd3M6CisKK0Bjb2RlCisKKwlFbGVtZW50cyAgICAgICAgICAgICA6IGRmZTUzOAorCVByZWZpeCAgICAgICAgICAgICAgIDogenJvbQorCitAZW5kY29kZQorCisiRWxlbWVudHMiIGlzIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgcHJlY2VkaW5nIHRoZSBmaXJzdCBkb3QgaW4gdGhlCit0YXJnZXQgbmFtZS4gICJQcmVmaXgiIGlzIHRoZSBjb21wb25lbnQgZm9sbG93aW5nIHRoZSBmaXJzdCBkb3QgaW4gdGhlCit0YXJnZXQgbmFtZS4gIChJdCdzIGNhbGxlZCBhICJwcmVmaXgiIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBtYWtlcyBpdCBhCitAYyAuenJvbSAocmF0aGVyIHRoYW4gYSBAYyAuZHNrLCBAYyAuenB4ZSBvciBhbnkgb3RoZXIgdHlwZSBvZiB0YXJnZXQpCit1c3VhbGx5IGVuZHMgdXAgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZXN1bHRpbmcgYmluYXJ5IGltYWdlLikKKworQGNvZGUKKworCURyaXZlcnMgICAgICAgICAgICAgIDogcnRsODEzOQorCitAZW5kY29kZQorCisiRHJpdmVycyIgaXMgdGhlIGxpc3Qgb2YgZHJpdmVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSAiRWxlbWVudHMiLgorTW9zdCBkcml2ZXJzIHN1cHBvcnQgc2V2ZXJhbCBuZXR3b3JrIGNhcmRzLiAgVGhlIFBDSV9ST00oKSBhbmQKK0lTQV9ST00oKSBtYWNyb3MgYXJlIHVzZWQgaW4gdGhlIGRyaXZlciBzb3VyY2UgZmlsZXMgdG8gbGlzdCB0aGUgY2FyZHMKK3RoYXQgYSBwYXJ0aWN1bGFyIGRyaXZlciBjYW4gc3VwcG9ydC4KKworQGNvZGUKKworCVJPTSBuYW1lICAgICAgICAgICAgIDogZGZlNTM4CisKK0BlbmRjb2RlCisKKyJST00gbmFtZSIgaXMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICJFbGVtZW50cyIgbGlzdC4gIEl0IGlzIHVzZWQgdG8KK3NlbGVjdCB0aGUgUENJIElEcyBmb3IgYSBQQ0kgUk9NLgorCitAY29kZQorCisJTWVkaWEgICAgICAgICAgICAgICAgOiByb20KKworQGVuZGNvZGUKKworIk1lZGlhIiBpcyB0aGUgIlByZWZpeCIgbWludXMgdGhlIGxlYWRpbmcgQGMgeiwgaWYgYW55LgorCitAY29kZQorCisJUk9NIHR5cGUgICAgICAgICAgICAgOiBwY2kKKwlQQ0kgdmVuZG9yICAgICAgICAgICA6IDB4MTE4NgorCVBDSSBkZXZpY2UgICAgICAgICAgIDogMHgxMzAwCisKK0BlbmRjb2RlCisKK1RoZXNlIGFyZSBkZXJpdmVkIGZyb20gdGhlICJST00gbmFtZSIgYW5kIHRoZSBQQ0lfUk9NKCkgb3IgSVNBX1JPTSgpCittYWNyb3MgaW4gdGhlIGRyaXZlciBzb3VyY2UgZmlsZXMuCisKK0Bjb2RlCisKKwlMRCBkcml2ZXIgc3ltYm9scyAgICA6IG9ial9ydGw4MTM5CisJTEQgcHJlZml4IHN5bWJvbHMgICAgOiBvYmpfenBjaXByZWZpeAorCitAZW5kY29kZQorCitUaGlzIGlzIHRoZSBpbnRlcmVzdGluZyBwYXJ0LiAgQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBlc3RhYmxpc2hlZCB0aGF0Cit3ZSBuZWVkIHRoZSBydGw4MTM5IGRyaXZlciAoaS5lLiBAYyBydGw4MTM5Lm8pIGFuZCB0aGUgZGVjb21wcmVzc2luZworUENJIHByZWZpeCAoaS5lLiBAYyB6cGNpcHJlZml4Lm8pLiAgT3VyIGJ1aWxkIHN5c3RlbSAodmlhIHRoZQorY29tcGlsZXIuaCBoZWFkZXIgZmlsZSkgYXJyYW5nZXMgdGhhdCBldmVyeSBvYmplY3QgZXhwb3J0cyBhIHN5bWJvbAorb2JqX0A8b2JqZWN0QD47IHRoaXMgY2FuIGJlIHNlZW4gYnkgZS5nLgorCitAY29kZQorCisJb2JqZHVtcCAtdCBiaW4vcnRsODEzOS5vCisKK0BlbmRjb2RlCisKK3doaWNoIHdpbGwgc2hvdyB0aGUgbGluZQorCitAY29kZQorCisJMDAwMDAwMDAgZyAgICAgICAqQUJTKiAgMDAwMDAwMDAgb2JqX3J0bDgxMzkKKworQGVuZGNvZGUKKworQnkgaW5zdHJ1Y3RpbmcgdGhlIGxpbmtlciB0aGF0IHdlIG5lZWQgdGhlIHN5bWJvbHMgQGMgb2JqX3J0bDgxMzkgYW5kCitAYyBvYmpfenBjaXByZWZpeCwgd2UgY2FuIHRoZXJlZm9yZSBlbnN1cmUgdGhhdCB0aGVzZSB0d28gb2JqZWN0cyBhcmUKK2luY2x1ZGVkIGluIG91ciBidWlsZC4gIChUaGUgbGlua2VyIHdpbGwgYWxzbyBpbmNsdWRlIGFueSBvYmplY3RzIHRoYXQKK3RoZXNlIHR3byBvYmplY3RzIHJlcXVpcmUsIHNpbmNlIHRoYXQncyB0aGUgd2hvbGUgcHVycG9zZSBvZiB0aGUKK2xpbmtlci4pCisKK0luIGEgc2ltaWxhciB3YXksIHdlIGFsd2F5cyBpbnN0cnVjdCB0aGUgbGlua2VyIHRoYXQgd2UgbmVlZCB0aGUKK3N5bWJvbCBAYyBvYmpfY29uZmlnLCBpbiBvcmRlciB0byBpbmNsdWRlIHRoZSBvYmplY3QgQGMgY29uZmlnLm8uICBAYworY29uZmlnLm8gaXMgdXNlZCB0byBkcmFnIGluIHRoZSBvYmplY3RzIHRoYXQgd2VyZSBzcGVjaWZpZWQgdmlhCitjb25maWcuaDsgc2VlIEByZWYgbGlua19jb25maWdfaC4KKworQGNvZGUKKworCUxEIHRhcmdldCBmbGFncyAgICAgIDogIC11IG9ial96cGNpcHJlZml4IC0tZGVmc3ltIGNoZWNrX29ial96cGNpcHJlZml4PW9ial96cGNpcHJlZml4ICAgLXUgb2JqX3J0bDgxMzkgLS1kZWZzeW0gY2hlY2tfb2JqX3J0bDgxMzk9b2JqX3J0bDgxMzkgICAtdSBvYmpfY29uZmlnIC0tZGVmc3ltIGNoZWNrX29ial9jb25maWc9b2JqX2NvbmZpZyAgLS1kZWZzeW0gcGNpX3ZlbmRvcl9pZD0weDExODYgLS1kZWZzeW0gcGNpX2RldmljZV9pZD0weDEzMDAKKworQGVuZGNvZGUKKworVGhlc2UgYXJlIHRoZSBmbGFncyB0aGF0IHdlIHBhc3MgdG8gdGhlIGxpbmtlciBpbiBvcmRlciB0byBpbmNsdWRlIHRoZQorb2JqZWN0cyB0aGF0IHdlIHdhbnQgaW4gb3VyIGJ1aWxkLCBhbmQgdG8gY2hlY2sgdGhhdCB0aGV5IHJlYWxseSBnZXQKK2luY2x1ZGVkLiAgKFRoaXMgbGF0dGVyIGNoZWNrIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCB3aGF0IHNlZW1zIHRvCitiZSBhIGJ1ZyBpbiBAYyBsZCkuCisKK1RoZSBsaW5rZXIgZG9lcyBpdHMgam9iIG9mIGxpbmtpbmcgYWxsIHRoZSByZXF1aXJlZCBvYmplY3RzIHRvZ2V0aGVyCitpbnRvIGEgY29oZXJlbnQgYnVpbGQuICBUaGUgYmVzdCB3YXkgdG8gc2VlIHdoYXQgaXMgaGFwcGVuaW5nIGlzIHRvCitsb29rIGF0IG9uZSBvZiB0aGUgcmVzdWx0aW5nIGxpbmtlciBtYXBzOyB0cnksIGZvciBleGFtcGxlCisKK0Bjb2RlCisKKwltYWtlIGJpbi9kZmU1MzguZHNrLm1hcAorCitAZW5kY29kZQorCitUaGUgbGlua2VyIG1hcCBpbmNsdWRlcywgYW1vbmdzdCBvdGhlcnM6CisKKyAgLSBBIGxpc3Qgb2Ygd2hpY2ggb2JqZWN0cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLCBhbmQgd2h5LgorICAtIFRoZSByZXN1bHRzIG9mIHByb2Nlc3NpbmcgdGhlIGxpbmtlciBzY3JpcHQsIGxpbmUtYnktbGluZS4KKyAgLSBBIGNvbXBsZXRlIHN5bWJvbCB0YWJsZSBvZiB0aGUgcmVzdWx0aW5nIGJ1aWxkLgorCitJdCBpcyB3b3J0aCBzcGVuZGluZyB0aW1lIGV4YW1pbmluZyB0aGUgbGlua2VyIG1hcCB0byBzZWUgaG93IGFuCitFdGhlcmJvb3QgaW1hZ2UgaXMgYXNzZW1ibGVkLgorCitXaGF0ZXZlciBmb3JtYXQgaXMgc2VsZWN0ZWQsIHRoZSBFdGhlcmJvb3QgaW1hZ2UgaXMgYnVpbHQgaW50byBhbiBFTEYKK2ZpbGUsIHNpbXBseSBiZWNhdXNlIHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9ybWF0IHVzZWQgYnkgQGMgbGQuCisKK0BzZWN0aW9uIGZpbmFsaXNhdGlvbiBGaW5hbGlzYXRpb24KKworQHN1YnNlY3Rpb24gZmluYWxfb3ZlcnZpZXcgT3ZlcnZpZXcKKworVGhlIEVMRiBmaWxlIHJlc3VsdGluZyBmcm9tIEByZWYgbGlua2luZyAibGlua2luZyIgbmVlZHMgdG8gYmUKK2NvbnZlcnRlZCBpbnRvIHRoZSBmaW5hbCBiaW5hcnkgaW1hZ2UuICBVc3VhbGx5LCB0aGlzIGlzIGp1c3QgYSBjYXNlCitvZiBydW5uaW5nCisKK0Bjb2RlCisKKwlvYmpjb3B5IC1PIGJpbmFyeSA8ZWxmIGZpbGU+IDxvdXRwdXQgZmlsZT4KKworQGVuZGNvZGUKKwordG8gY29udmVydCB0aGUgRUxGIGZpbGUgaW50byBhIHJhdyBiaW5hcnkgaW1hZ2UuICBDZXJ0YWluIGltYWdlCitmb3JtYXRzIHJlcXVpcmUgc3BlY2lhbCBhZGRpdGlvbmFsIHRyZWF0bWVudC4KKworQHN1YnNlY3Rpb24gZmluYWxfcm9tIFJPTSBpbWFnZXMKKworUk9NIGltYWdlcyBtdXN0IGJlIHJvdW5kZWQgdXAgdG8gYSBzdWl0YWJsZSBST00gc2l6ZSAoZS5nLiAxNmtCIG9yCiszMmtCKSwgYW5kIGNlcnRhaW4gaGVhZGVyIGluZm9ybWF0aW9uIHN1Y2ggYXMgY2hlY2tzdW1zIG5lZWRzIHRvIGJlCitmaWxsZWQgaW4uICBUaGlzIGlzIGRvbmUgYnkgdGhlIEBjIG1ha2Vyb20ucGwgcHJvZ3JhbS4KKworQHNlY3Rpb24gZGVidWcgRGVidWdnaW5nLWVuYWJsZWQgYnVpbGRzCisKKyovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kb2MvcHhlX2V4dGVuc2lvbnMgYi9ncHhlL3NyYy9kb2MvcHhlX2V4dGVuc2lvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmMTRhOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RvYy9weGVfZXh0ZW5zaW9ucwpAQCAtMCwwICsxLDMxMiBAQAorRklMRSBPUEVOCisKK09wLUNvZGU6CVBYRU5WX0ZJTEVfT1BFTiAoMDBlMGgpCisKK0lucHV0OgkJRmFyIHBvaW50ZXIgdG8gYSB0X1BYRU5WX0ZJTEVfT1BFTiBwYXJhbWV0ZXIgc3RydWN0dXJlCisJCXRoYXQgaGFzIGJlZW4gaW5pdGlhbGlzZWQgYnkgdGhlIGNhbGxlci4KKworT3V0cHV0OgkJUFhFTlZfRVhJVF9TVUNDRVNTIG9yIFBYRU5WX0VYSVRfRkFJTFVSRSBtdXN0IGJlCisJCXJldHVybmVkIGluIEFYLiAgVGhlIHN0YXR1cyBmaWVsZCBpbiB0aGUgcGFyYW1ldGVyCisJCXN0cnVjdHVyZSBtdXN0IGJlIHNldCB0byBvbmUgb2YgdGhlIHZhbHVlcyByZXByZXNlbnRlZAorCQlieSB0aGUgUFhFTlZfU1RBVFVTX3h4eCBjb25zdGFudHMuCisKK0Rlc2NyaXB0aW9uOglPcGVucyBhIGZpbGUgc3BlY2lmaWVkIGJ5IGEgVVJMIGZvciByZWFkaW5nLiAgTXVsdGlwbGUKKwkJZmlsZXMgbWF5IGJlIG9wZW5lZCBhbmQgdXNlZCBjb25jdXJyZW50bHkuCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9GSUxFX09QRU4geworCVBYRU5WX1NUQVRVUyBTdGF0dXM7CisJVUlOVDE2IEZpbGVIYW5kbGU7CisJU0VHT0ZGMTYgRmlsZU5hbWU7CisJVUlOVDMyIFJlc2VydmVkOworfSB0X1BYRU5WX0ZJTEVfT1BFTjsKKworCitTZXQgYmVmb3JlIGNhbGxpbmcgQVBJIHNlcnZpY2U6CisKK0ZpbGVOYW1lOglVUkwgb2YgZmlsZSB0byBiZSBvcGVuZWQuICBOdWxsIHRlcm1pbmF0ZWQuCisKK1Jlc2VydmVkOglNdXN0IGJlIHplcm8uCisKKworUmV0dXJuZWQgZnJvbSBBUEkgc2VydmljZToKKworRmlsZUhhbmRsZToJSGFuZGxlIGZvciB1c2UgaW4gc3Vic2VxdWVudCBQWEUgRklMRSBBUEkgY2FsbHMuCisKK1N0YXR1czoJCVNlZSBQWEVOVl9TVEFUVVNfeHh4IGNvbnN0YW50cy4KKworCisKKworRklMRSBDTE9TRQorCitPcC1Db2RlOglQWEVOVl9GSUxFX0NMT1NFICgwMGUxaCkKKworSW5wdXQ6CQlGYXIgcG9pbnRlciB0byBhIHRfUFhFTlZfRklMRV9DTE9TRSBwYXJhbWV0ZXIgc3RydWN0dXJlCisJCXRoYXQgaGFzIGJlZW4gaW5pdGlhbGlzZWQgYnkgdGhlIGNhbGxlci4KKworT3V0cHV0OgkJUFhFTlZfRVhJVF9TVUNDRVNTIG9yIFBYRU5WX0VYSVRfRkFJTFVSRSBtdXN0IGJlCisJCXJldHVybmVkIGluIEFYLiAgVGhlIHN0YXR1cyBmaWVsZCBpbiB0aGUgcGFyYW1ldGVyCisJCXN0cnVjdHVyZSBtdXN0IGJlIHNldCB0byBvbmUgb2YgdGhlIHZhbHVlcyByZXByZXNlbnRlZAorCQlieSB0aGUgUFhFTlZfU1RBVFVTX3h4eCBjb25zdGFudHMuCisKK0Rlc2NyaXB0aW9uOglDbG9zZXMgYSBwcmV2aW91c2x5IG9wZW5lZCBmaWxlLgorCisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfRklMRV9DTE9TRSB7CisJUFhFTlZfU1RBVFVTIFN0YXR1czsKKwlVSU5UMTYgRmlsZUhhbmRsZTsKK30gdF9QWEVOVl9GSUxFX0NMT1NFOworCisKK1NldCBiZWZvcmUgY2FsbGluZyBBUEkgc2VydmljZToKKworRmlsZUhhbmRsZToJSGFuZGxlIG9idGFpbmVkIHdoZW4gZmlsZSB3YXMgb3BlbmVkLgorCisKK1JldHVybmVkIGZyb20gQVBJIHNlcnZpY2U6CisKK1N0YXR1czoJCVNlZSBQWEVOVl9TVEFUVVNfeHh4IGNvbnN0YW50cy4KKworCisKKworRklMRSBTRUxFQ1QKKworT3AtQ29kZToJUFhFTlZfRklMRV9TRUxFQ1QgKDAwZTJoKQorCitJbnB1dDoJCUZhciBwb2ludGVyIHRvIGEgdF9QWEVOVl9GSUxFX1NFTEVDVCBwYXJhbWV0ZXIgc3RydWN0dXJlCisJCXRoYXQgaGFzIGJlZW4gaW5pdGlhbGlzZWQgYnkgdGhlIGNhbGxlci4KKworT3V0cHV0OgkJUFhFTlZfRVhJVF9TVUNDRVNTIG9yIFBYRU5WX0VYSVRfRkFJTFVSRSBtdXN0IGJlCisJCXJldHVybmVkIGluIEFYLiAgVGhlIHN0YXR1cyBmaWVsZCBpbiB0aGUgcGFyYW1ldGVyCisJCXN0cnVjdHVyZSBtdXN0IGJlIHNldCB0byBvbmUgb2YgdGhlIHZhbHVlcyByZXByZXNlbnRlZAorCQlieSB0aGUgUFhFTlZfU1RBVFVTX3h4eCBjb25zdGFudHMuCisKK0Rlc2NyaXB0aW9uOglDaGVjayBhIHByZXZpb3VzbHkgb3BlbmVkIGZpbGUncyByZWFkaW5lc3MgZm9yIEkvTy4KKworCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX0ZJTEVfU0VMRUNUIHsKKwlQWEVOVl9TVEFUVVMgU3RhdHVzOworCVVJTlQxNiBGaWxlSGFuZGxlOworCVVJTlQxNiBSZWFkeTsKKyNkZWZpbmUgUkRZX1JFQUQgMHgwMDAxCit9IHRfUFhFTlZfRklMRV9TRUxFQ1Q7CisKKworU2V0IGJlZm9yZSBjYWxsaW5nIEFQSSBzZXJ2aWNlOgorCitGaWxlSGFuZGxlOglIYW5kbGUgb2J0YWluZWQgd2hlbiBmaWxlIHdhcyBvcGVuZWQuCisKKworUmV0dXJuZWQgZnJvbSBBUEkgc2VydmljZToKKworUmVhZHk6CQlJbmRpY2F0aW9uIG9mIHJlYWRpbmVzcy4gIFRoaXMgY2FuIGJlIHplcm8sIG9yIG1vcmUsCisJCW9mIHRoZSBSRFlfeHh4IGNvbnN0YW50cy4gIE11bHRpcGxlIHZhbHVlcyBhcmUKKwkJYXJpdGhtZXRpY2FsbHkgb3ItZWQgdG9nZXRoZXIuCisKK1N0YXR1czoJCVNlZSBQWEVOVl9TVEFUVVNfeHh4IGNvbnN0YW50cy4KKworCisKKworRklMRSBSRUFECisKK09wLUNvZGU6CVBYRU5WX0ZJTEVfUkVBRCAoMDBlM2gpCisKK0lucHV0OgkJRmFyIHBvaW50ZXIgdG8gYSB0X1BYRU5WX0ZJTEVfUkVBRCBwYXJhbWV0ZXIgc3RydWN0dXJlCisJCXRoYXQgaGFzIGJlZW4gaW5pdGlhbGlzZWQgYnkgdGhlIGNhbGxlci4KKworT3V0cHV0OgkJUFhFTlZfRVhJVF9TVUNDRVNTIG9yIFBYRU5WX0VYSVRfRkFJTFVSRSBtdXN0IGJlCisJCXJldHVybmVkIGluIEFYLiAgVGhlIHN0YXR1cyBmaWVsZCBpbiB0aGUgcGFyYW1ldGVyCisJCXN0cnVjdHVyZSBtdXN0IGJlIHNldCB0byBvbmUgb2YgdGhlIHZhbHVlcyByZXByZXNlbnRlZAorCQlieSB0aGUgUFhFTlZfU1RBVFVTX3h4eCBjb25zdGFudHMuCisKKwkJVGhpcyBBUEkgZnVuY3Rpb24gaXMgbm9uLWJsb2NraW5nLiAgUFhFTlZfRVhJVF9TVUNDRVNTCisJCWFuZCBQWEVOVl9TVEFUVVNfU1VDQ0VTUyBpcyByZXR1cm5lZCBpZiBhIGRhdGEgYmxvY2sKKwkJaGFzIGJlZW4gdHJhbnNmZXJyZWQgaW50byB0aGUgY2FsbGVyJ3MgYnVmZmVyLgorCQlQWEVOVl9FWElUX0ZBSUxVUkUgYW5kIFBYRU5WX1NUQVRVU19URlRQX09QRU4gaXMKKwkJcmV0dXJuZWQgaWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgdG8gdHJhbnNmZXI7IGFueQorCQlvdGhlciBzdGF0dXMgY29kZSByZWZsZWN0cyBhbiBlcnJvci4KKworRGVzY3JpcHRpb246CVJlYWQgZnJvbSBhIHByZXZpb3VzbHkgb3BlbmVkIGZpbGUuCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9GSUxFX1JFQUQgeworCVBYRU5WX1NUQVRVUyBTdGF0dXM7CisJVUlOVDE2IEZpbGVIYW5kbGU7CisJVUlOVDE2IEJ1ZmZlclNpemU7CisJU0VHT0ZGMTYgQnVmZmVyOworfSB0X1BYRU5WX0ZJTEVfUkVBRDsKKworCitTZXQgYmVmb3JlIGNhbGxpbmcgQVBJIHNlcnZpY2U6CisKK0ZpbGVIYW5kbGU6CUhhbmRsZSBvYnRhaW5lZCB3aGVuIGZpbGUgd2FzIG9wZW5lZC4KKworQnVmZmVyU2l6ZToJTWF4aW11bSBudW1iZXIgb2YgZGF0YSBieXRlcyB0aGF0IGNhbiBiZSBjb3BpZWQgaW50bworCQlCdWZmZXIuCisKK0J1ZmZlcjoJCVNlZ21lbnQ6T2Zmc2V0IGFkZHJlc3Mgb2YgZGF0YSBidWZmZXIuCisKKworUmV0dXJuZWQgZnJvbSBBUEkgc2VydmljZToKKworQnVmZmVyU2l6ZToJTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIGRhdGEgYnVmZmVyLiAgRW5kIG9mCisJCWZpbGUgaWYgdGhpcyBpcyB6ZXJvLgorCitTdGF0dXM6CQlTZWUgUFhFTlZfU1RBVFVTX3h4eCBjb25zdGFudHMuCisKKworCisKK0dFVCBGSUxFIFNJWkUKKworT3AtQ29kZToJUFhFTlZfR0VUX0ZJTEVfU0laRSAoMDBlNGgpCisKK0lucHV0OgkJRmFyIHBvaW50ZXIgdG8gYSB0X1BYRU5WX0dFVF9GSUxFX1NJWkUgcGFyYW1ldGVyCisJCXN0cnVjdHVyZSB0aGF0IGhhcyBiZWVuIGluaXRpYWxpc2VkIGJ5IHRoZSBjYWxsZXIuCisKK091dHB1dDoJCVBYRU5WX0VYSVRfU1VDQ0VTUyBvciBQWEVOVl9FWElUX0ZBSUxVUkUgbXVzdCBiZQorCQlyZXR1cm5lZCBpbiBBWC4gIFRoZSBzdGF0dXMgZmllbGQgaW4gdGhlIHBhcmFtZXRlcgorCQlzdHJ1Y3R1cmUgbXVzdCBiZSBzZXQgdG8gb25lIG9mIHRoZSB2YWx1ZXMgcmVwcmVzZW50ZWQKKwkJYnkgdGhlIFBYRU5WX1NUQVRVU194eHggY29uc3RhbnRzLgorCitEZXNjcmlwdGlvbjoJRGV0ZXJtaW5lIHNpemUgb2YgYSBwcmV2aW91c2x5IG9wZW5lZCBmaWxlLgorCisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfR0VUX0ZJTEVfU0laRSB7CisJUFhFTlZfU1RBVFVTIFN0YXR1czsKKwlVSU5UMTYgRmlsZUhhbmRsZTsKKwlVSU5UMzIgRmlsZVNpemU7Cit9IHRfUFhFTlZfR0VUX0ZJTEVfU0laRTsKKworCitTZXQgYmVmb3JlIGNhbGxpbmcgQVBJIHNlcnZpY2U6CisKK0ZpbGVIYW5kbGU6CUhhbmRsZSBvYnRhaW5lZCB3aGVuIGZpbGUgd2FzIG9wZW5lZC4KKworCitSZXR1cm5lZCBmcm9tIEFQSSBzZXJ2aWNlOgorCitGaWxlU2l6ZToJU2l6ZSBvZiB0aGUgZmlsZSBpbiBieXRlcy4KKworU3RhdHVzOgkJU2VlIFBYRU5WX1NUQVRVU194eHggY29uc3RhbnRzLgorCisKKworCitGSUxFIEVYRUMKKworT3AtQ29kZToJUFhFTlZfRklMRV9FWEVDICgwMGU1aCkKKworSW5wdXQ6CQlGYXIgcG9pbnRlciB0byBhIHRfUFhFTlZfRklMRV9FWEVDIHBhcmFtZXRlcgorCQlzdHJ1Y3R1cmUgdGhhdCBoYXMgYmVlbiBpbml0aWFsaXplZCBieSB0aGUgY2FsbGVyLgorCitPdXRwdXQ6CQlQWEVOVl9FWElUX1NVQ0NFU1Mgb3IgUFhFTlZfRVhJVF9GQUlMVVJFIG11c3QgYmUKKwkJcmV0dXJuZWQgaW4gQVguICBUaGUgU3RhdHVzIGZpZWxkIGluIHRoZSBwYXJhbWV0ZXIKKwkJc3RydWN0dXJlIG11c3QgYmUgc2V0IHRvIG9uZSBvZiB0aGUgdmFsdWVzIHJlcHJlc2VudGVkCisJCWJ5IHRoZSBQWEVOVl9TVEFUVVNfeHh4IGNvbnN0YW50cy4KKworRGVzY3JpcHRpb246CUV4ZWN1dGUgYSBnUFhFIGNvbW1hbmQuCisKK3R5cGVkZWYgc3RydWN0IHNfUFhFTlZfRklMRV9FWEVDIHsKKyAgICAgICAgUFhFTlZfU1RBVFVTX3QgU3RhdHVzOworICAgICAgICBTRUdPRkYxNl90IENvbW1hbmQ7Cit9IHRfUFhFTlZfRklMRV9FWEVDOworCisKK1NldCBiZWZvcmUgY2FsbGluZyBBUEkgc2VydmljZToKKworQ29tbWFuZDoJQ29tbWFuZCB0byBleGVjdXRlLiAgTnVsbCB0ZXJtaW5hdGVkLgorCisKK1JldHVybmVkIGZyb20gQVBJIHNlcnZpY2U6CisKK1N0YXR1czoJCVNlZSBQWEVOVl9TVEFUVVNfeHh4IGNvbnN0YW50cy4KKworCisKKworRklMRSBBUEkgQ0hFQ0sKKworT3AtQ29kZToJUFhFTlZfRklMRV9BUElfQ0hFQ0sgKDAwZTZoKQorCitJbnB1dDoJCUZhciBwb2ludGVyIHRvIGEgdF9QWEVOVl9GSUxFX0NIRUNLX0FQSSBwYXJhbWV0ZXIKKwkJc3RydWN0dXJlIHRoYXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYnkgdGhlIGNhbGxlci4KKworCQlPbiBlbnRyeSwgdGhlIE1hZ2ljIGZpZWxkIHNob3VsZCBjb250YWluIHRoZSBudW1iZXIKKwkJMHg5MWQ0NDdiMiBvciB0aGUgY2FsbCB3aWxsIGZhaWwuCisKK091dHB1dDoJCVBYRU5WX0VYSVRfU1VDQ0VTUyBvciBQWEVOVl9FWElUX0ZBSUxVUkUgbXVzdCBiZQorCQlyZXR1cm5lZCBpbiBBWC4gIFRoZSBTdGF0dXMgZmllbGQgaW4gdGhlIHBhcmFtZXRlcgorCQlzdHJ1Y3R1cmUgbXVzdCBiZSBzZXQgdG8gb25lIG9mIHRoZSB2YWx1ZXMgcmVwcmVzZW50ZWQKKwkJYnkgdGhlIFBYRU5WX1NUQVRVU194eHggY29uc3RhbnRzLgorCisJCUlmIHRoaXMgQVBJIGlzIHByZXNlbnQgYW5kIHRoZSBNYWdpYyBmaWVsZCBjb250YWlucyB0aGUKKwkJcHJvcGVyIHZhbHVlIG9uIGVudHJ5LCBBWCB3aWxsIGNvbnRhaW4gUFhFTlZfRVhJVF9TVUNDRVNTLAorCQl0aGUgU3RhdHVzIGZpZWxkIFBYRU5WX1NUQVRVU19TVUNDRVNTLCBhbmQgdGhlIE1hZ2ljIGZpZWxkCisJCXRoZSBudW1iZXIgMHhlOWMxN2IyMC4gIEFueSBvdGhlciBjb21iaW5hdGlvbiBzaG91bGQgYmUKKwkJY29uc2lkZXJlZCBhIGZhaWx1cmUuCisKK0Rlc2NyaXB0aW9uOglEZXRlY3QgcHJlc2VuY2Ugb2YgdGhpcyBBUEkuCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19QWEVOVl9GSUxFX0NIRUNLX0FQSSB7CisJUFhFTlZfU1RBVFVTIFN0YXR1czsKKwlVSU5UMTYgU2l6ZTsKKwlVSU5UMzIgTWFnaWM7CisJVUlOVDMyIFByb3ZpZGVyOworCVVJTlQzMiBBUElNYXNrOworCVVJTlQzMiBGbGFnczsKK30gdF9QWEVOVl9GSUxFX0NIRUNLX0FQSTsKKworU2V0IGJlZm9yZSBjYWxsaW5nIEFQSSBzZXJ2aWNlOgorCitTaXplOgkJU2V0IHRvIHNpemVvZih0X1BYRU5WX0ZJTEVfQ0hFQ0tfQVBJKSAoMjApLgorTWFnaWM6CQlTZXQgdG8gMHg5MWQ0NDdiMi4KKworCitSZXR1cm5lZCBmcm9tIEFQSSBzZXJ2aWNlOgorCitTaXplOgkJU2V0IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgZmlsbGVkIGluICgyMCkuCitNYWdpYzoJCVNldCB0byAweGU5YzE3YjIwLgorUHJvdmlkZXI6CVNldCB0byAweDQ1NTg1MDY3ICgiZ1BYRSIpLiAgQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCisJCUFQSSBjYW4gdXNlIGFub3RoZXIgdmFsdWUsIGUuZy4gdG8gaW5kaWNhdGUgYSBkaWZmZXJlbnQKKwkJY29tbWFuZCBzZXQgc3VwcG9ydGVkIGJ5IEZJTEUgRVhFQy4KK0FQSU1hc2s6CUJpdG1hc2sgb2Ygc3VwcG9ydGVkIEFQSSBmdW5jdGlvbnMgKG9uZSBiaXQgZm9yIGVhY2ggZnVuY3Rpb24KKwkJaW4gdGhlIHJhbmdlIDAwZTBoIHRvIDAwZmZoKS4KK0ZsYWdzOgkJU2V0IHRvIHplcm8sIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgorCisKKworCitGSUxFIEVYSVQgSE9PSworCitPcC1Db2RlOglQWEVOVl9GSUxFX0VYSVRfSE9PSyAoMDBlN2gpCisKK0lucHV0OgkJRmFyIHBvaW50ZXIgdG8gYSB0X1BYRU5WX0ZJTEVfRVhJVF9IT09LIHBhcmFtZXRlcgorCQlzdHJ1Y3R1cmUgdGhhdCBoYXMgYmVlbiBpbml0aWFsaXplZCBieSB0aGUgY2FsbGVyLgorCitPdXRwdXQ6CQlQWEVOVl9FWElUX1NVQ0NFU1Mgb3IgUFhFTlZfRVhJVF9GQUlMVVJFIG11c3QgYmUKKwkJcmV0dXJuZWQgaW4gQVguICBUaGUgU3RhdHVzIGZpZWxkIGluIHRoZSBwYXJhbWV0ZXIKKwkJc3RydWN0dXJlIG11c3QgYmUgc2V0IHRvIG9uZSBvZiB0aGUgdmFsdWVzIHJlcHJlc2VudGVkCisJCWJ5IHRoZSBQWEVOVl9TVEFUVVNfeHh4IGNvbnN0YW50cy4KKworRGVzY3JpcHRpb246CU1vZGlmeSB0aGUgZXhpdCBwYXRoIHRvIGp1bXAgdG8gdGhlIHNwZWNpZmllZCBjb2RlLgorCQlPbmx5IHZhbGlkIGZvciBweGVwcmVmaXgtYmFzZWQgYnVpbGRzLgorCit0eXBlZGVmIHN0cnVjdCBzX1BYRU5WX0ZJTEVfRVhJVF9IT09LIHsKKyAgICAgICAgUFhFTlZfU1RBVFVTX3QgU3RhdHVzOworICAgICAgICBTRUdPRkYxNl90IEhvb2s7Cit9IHRfUFhFTlZfRklMRV9FWElUX0hPT0s7CisKKworU2V0IGJlZm9yZSBjYWxsaW5nIEFQSSBzZXJ2aWNlOgorCitIb29rOgkJVGhlIFNFRzE2Ok9GRjE2IG9mIHRoZSBjb2RlIHRvIGp1bXAgdG8uCisKKworUmV0dXJuZWQgZnJvbSBBUEkgc2VydmljZToKKworU3RhdHVzOgkJU2VlIFBYRU5WX1NUQVRVU194eHggY29uc3RhbnRzLgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZG94eWdlbi5jZmcgYi9ncHhlL3NyYy9kb3h5Z2VuLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWU4N2FkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZG94eWdlbi5jZmcKQEAgLTAsMCArMSwxNDg3IEBACisjIERveHlmaWxlIDEuNS43LjEKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QKKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkCisjIFRoZSBmb3JtYXQgaXM6CisjICAgICAgIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6CisjICAgICAgIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoIiAiKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZSAKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCAKKyMgdGV4dCBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIAorIyBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSAKKyMgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZCAKKyMgYnkgcXVvdGVzKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUgcHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9IGdQWEUKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIAorIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yIAorIyBpZiBzb21lIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IAorCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkgCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IEBCSU5AL2RvYworCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgY3JlYXRlIAorIyA0MDk2IHN1Yi1kaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0IAorIyBmb3JtYXQgYW5kIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuIAorIyBFbmFibGluZyB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2YgCisjIHNvdXJjZSBmaWxlcywgd2hlcmUgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZCAKKyMgb3RoZXJ3aXNlIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zIGZvciB0aGUgZmlsZSBzeXN0ZW0uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsIAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcyAKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLiAKKyMgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCwgb3RoZXIgc3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6IAorIyBBZnJpa2FhbnMsIEFyYWJpYywgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLCBDaGluZXNlLVRyYWRpdGlvbmFsLCAKKyMgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBGYXJzaSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLCAKKyMgSHVuZ2FyaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksIAorIyBLb3JlYW4sIEtvcmVhbi1lbiwgTGl0aHVhbmlhbiwgTm9yd2VnaWFuLCBNYWNlZG9uaWFuLCBQZXJzaWFuLCBQb2xpc2gsIAorIyBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGljLCBTbG92YWssIFNsb3ZlbmUsIAorIyBTcGFuaXNoLCBTd2VkaXNoLCBhbmQgVWtyYWluaWFuLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbiAKKyMgdGhlIGZpbGUgYW5kIGNsYXNzIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YURvYykuIAorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCBwcmVwZW5kIAorIyB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gCisjIE5vdGU6IGlmIGJvdGggSElERV9VTkRPQ19NRU1CRVJTIGFuZCBCUklFRl9NRU1CRVJfREVTQyBhcmUgc2V0IHRvIE5PLCB0aGUgCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvciAKKyMgdGhhdCBpcyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgCisjIGluIHRoaXMgbGlzdCwgaWYgZm91bmQgYXMgdGhlIGxlYWRpbmcgdGV4dCBvZiB0aGUgYnJpZWYgZGVzY3JpcHRpb24sIHdpbGwgYmUgCisjIHN0cmlwcGVkIGZyb20gdGhlIHRleHQgYW5kIHRoZSByZXN1bHQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMgCisjIHVzZWQgYXMgdGhlIGFubm90YXRlZCB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLiAKKyMgSWYgbGVmdCBibGFuaywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCIkbmFtZSIgaXMgYXV0b21hdGljYWxseSAKKyMgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZW50aXR5KTogIlRoZSAkbmFtZSBjbGFzcyIgIlRoZSAkbmFtZSB3aWRnZXQiIAorIyAiVGhlICRuYW1lIGZpbGUiICJpcyIgInByb3ZpZGVzIiAic3BlY2lmaWVzIiAiY29udGFpbnMiIAorIyAicmVwcmVzZW50cyIgImEiICJhbiIgInRoZSIKKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9IAorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4gCisjIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYgCisjIGRlc2NyaXB0aW9uLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gWUVTCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsIAorIyBpbmhlcml0ZWQgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UgCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50IAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKworSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IE5PCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsIAorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCAKKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcgCisjIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguIFN0cmlwcGluZyBpcyAKKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YgCisjIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4gCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIAorIyBwYXRoIHRvIHN0cmlwLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gCisKKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgCisjIHRoZSBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyAKKyMgdGhlIHJlYWRlciB3aGljaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiAKKyMgSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcyAKKyMgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZCBzcGVjaWZ5IHRoZSBpbmNsdWRlIHBhdGhzIHRoYXQgCisjIGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyIHVzaW5nIHRoZSAtSSBmbGFnLgorCitTVFJJUF9GUk9NX0lOQ19QQVRIICAgID0gCisKKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyIAorIyAoYnV0IGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpcyB5b3VyIGZpbGUgc3lzdGVtcyAKKyMgZG9lc24ndCBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIAorIyB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhRG9jLXN0eWxlIAorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YURvYyAKKyMgY29tbWVudHMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgCisjICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIAorIyBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBjb21tZW50cyAKKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIAorIyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisKK1FUX0FVVE9CUklFRiAgICAgICAgICAgPSBOTworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIERveHlnZW4gCisjIHRyZWF0IGEgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLyAKKyMgY29tbWVudHMpIGFzIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuIAorIyBUaGUgbmV3IGRlZmF1bHQgaXMgdG8gdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBjb21tZW50IGJsb2NrIGFzIGEgZGV0YWlsZWQgCisjIGRlc2NyaXB0aW9uLiBTZXQgdGhpcyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvdXIgaW5zdGVhZC4KKworTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCisKKyMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYW4gdW5kb2N1bWVudGVkIAorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdCAKKyMgcmUtaW1wbGVtZW50cy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgCisjIGEgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwgCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiAKKyMgRG94eWdlbiB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3RzIAorIyBhcyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8gCisjIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZSBkb2N1bWVudGF0aW9uLCB3aGljaCAKKyMgd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZyAiU2lkZSBFZmZlY3RzOiIuIAorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9IHY9QHBhcmFtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXQ9QHJldHZhbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyPUBleGNlcHRpb24KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIAorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIAorIyBGb3IgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0IAorIyBvZiBhbGwgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IFlFUworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0pBVkEgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgSmF2YSAKKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciAKKyMgSmF2YS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLCBxdWFsaWZpZWQgCisjIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisKK09QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbiAKKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciAKKyMgRm9ydHJhbi4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMIAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgCisjIFZIREwuCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQgCisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCAKKyMgc2V0IHRoaXMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZCAKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7IHYucy4gCisjIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2UgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIAorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisKK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIHNvdXJjZXMgb25seS4gCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyAKKyMgaW5zdGVhZCBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisKK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTworCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSBnZXR0ZXIgCisjIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgKHRoZSBkZWZhdWx0KSAKKyMgd2lsbCBtYWtlIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSAKKyMgZG9jdW1lbnRhdGlvbi4gVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3IgCisjIHNldHRpbmcgYSBzaW1wbGUgdHlwZS4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlIAorIyBtZXRob2RzIGFueXdheSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBOTworCisjIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MgCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QgCisjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdCAKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IFlFUworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgCisjIHRoZSBzYW1lIHR5cGUgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIAorIyBzdWJncm91cCBvZiB0aGF0IHR5cGUgKGUuZy4gdW5kZXIgdGhlIFB1YmxpYyBGdW5jdGlvbnMgc2VjdGlvbikuIFNldCBpdCB0byAKKyMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgCisjIHRoZSBcbm9zdWJncm91cGluZyBjb21tYW5kLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIAorIyBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28gCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdCAKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwgCisjIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseSAKKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQgCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKworVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PCisKKyMgVGhlIFNZTUJPTF9DQUNIRV9TSVpFIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGNhY2hlIHVzZSB0byAKKyMgZGV0ZXJtaW5lIHdoaWNoIHN5bWJvbHMgdG8ga2VlcCBpbiBtZW1vcnkgYW5kIHdoaWNoIHRvIGZsdXNoIHRvIGRpc2suCisjIFdoZW4gdGhlIGNhY2hlIGlzIGZ1bGwsIGxlc3Mgb2Z0ZW4gdXNlZCBzeW1ib2xzIHdpbGwgYmUgd3JpdHRlbiB0byBkaXNrLgorIyBGb3Igc21hbGwgdG8gbWVkaXVtIHNpemUgcHJvamVjdHMgKDwxMDAwIGlucHV0IGZpbGVzKSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAKKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UgCisjIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZSAKKyMgY2F1c2luZyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHBlbmFsaXR5LiAKKyMgSWYgdGhlIHN5c3RlbSBoYXMgZW5vdWdoIHBoeXNpY2FsIG1lbW9yeSBpbmNyZWFzaW5nIHRoZSBjYWNoZSB3aWxsIGltcHJvdmUgdGhlIAorIyBwZXJmb3JtYW5jZSBieSBrZWVwaW5nIG1vcmUgc3ltYm9scyBpbiBtZW1vcnkuIE5vdGUgdGhhdCB0aGUgdmFsdWUgd29ya3Mgb24gCisjIGEgbG9nYXJpdGhtaWMgc2NhbGUgc28gaW5jcmVhc2luZyB0aGUgc2l6ZSBieSBvbmUgd2lsbCByb3VnbHkgZG91YmxlIHRoZSAKKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6IAorIyAyXigxNitTWU1CT0xfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLCAKKyMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMKKworU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbiAKKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIAorIyBQcml2YXRlIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIAorIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyAKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIAorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykgCisjIGRlZmluZWQgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gCisjIElmIHNldCB0byBOTyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwgCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4gCisjIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAKKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZSAKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkIAorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlIAorIyBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgCisjIGFub255bW91cyBuYW1lc3BhY2UgYXJlIGhpZGRlbi4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsIAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIAorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIAorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbCAKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiAKKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIAorIyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsIAorIyBmcmllbmQgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLiAKKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIAorIyBkb2N1bWVudGF0aW9uLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFueSAKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgCisjIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCisKKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbiAKKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCAKKyMgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgZXhjbHVkZWQuIAorIyBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUgCisjIGZpbGUgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbyAKKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlciAKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzIAorIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4gCisjIHdpbGwgc2hvdyBtZW1iZXJzIHdpdGggdGhlaXIgZnVsbCBjbGFzcyBhbmQgbmFtZXNwYWNlIHNjb3BlcyBpbiB0aGUgCisjIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlIHNjb3BlIHdpbGwgYmUgaGlkZGVuLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuIAorIyB3aWxsIHB1dCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKyMgb2YgdGhhdCBmaWxlLgorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXSAKKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4gCisjIHdpbGwgc29ydCB0aGUgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgCisjIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gCisjIGRlY2xhcmF0aW9uIG9yZGVyLgorCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIAorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSAKKyMgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIAorIyBkZWNsYXJhdGlvbiBvcmRlci4KKworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgCisjIGhpZXJhcmNoeSBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIAorIyBzb3J0ZWQgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIAorIyBOTyAodGhlIGRlZmF1bHQpLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIAorIyBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4gCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSAKKyMgYWxwaGFiZXRpY2FsIGxpc3QuCisKK1NPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIAorIyBkaXNhYmxlIChOTykgdGhlIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbyAKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciAKKyMgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QgCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciAKKyMgZGlzYWJsZSAoTk8pIHRoZSBidWcgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnIAorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIAorIyBkaXNhYmxlIChOTykgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyAKKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKKworIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsIAorIyBkb2N1bWVudGF0aW9uIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIHNlY3Rpb25uYW1lIC4uLiBcZW5kaWYuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSAKKworIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyAKKyMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBkZWZpbmUgY29uc2lzdHMgb2YgZm9yIGl0IHRvIGFwcGVhciBpbiAKKyMgdGhlIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkIAorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIAorIyBUaGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIGRlZmluZXMgaW4gdGhlIAorIyBkb2N1bWVudGF0aW9uIGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplciAKKyMgY29tbWFuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKworTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCisKKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIAorIyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlIAorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgc291cmNlcyBpbiB5b3VyIHByb2plY3QgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgbXVsdGlwbGUgZGlyZWN0b3JpZXMgCisjIHRoZW4gc2V0dGluZyB0aGUgU0hPV19ESVJFQ1RPUklFUyB0YWcgdG8gWUVTIHdpbGwgc2hvdyB0aGUgZGlyZWN0b3J5IGhpZXJhcmNoeSAKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBkZWZhdWx0IGlzIE5PLgorCitTSE9XX0RJUkVDVE9SSUVTICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLgorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSAKKyMgTmFtZXNwYWNlcyBwYWdlLiAgVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleAorIyBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX05BTUVTUEFDRVMgICAgICAgID0gWUVTCisKKyMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0IAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20gCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYSAKKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGNvbW1hbmQ+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGNvbW1hbmQ+IGlzIHRoZSB2YWx1ZSBvZiAKKyMgdGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUgCisjIHByb3ZpZGVkIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgCisjIGlzIHVzZWQgYXMgdGhlIGZpbGUgdmVyc2lvbi4gU2VlIHRoZSBtYW51YWwgZm9yIGV4YW1wbGVzLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQgYnkgCisjIGRveHlnZW4uIFRoZSBsYXlvdXQgZmlsZSBjb250cm9scyB0aGUgZ2xvYmFsIHN0cnVjdHVyZSBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dCBmaWxlcyAKKyMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRoZSBjcmVhdGUgdGhlIGxheW91dCBmaWxlIHRoYXQgcmVwcmVzZW50cyAKKyMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgCisjIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIERveHlnZW5MYXlvdXQueG1sIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSAKKyMgb2YgdGhlIGxheW91dCBmaWxlLgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgCisjIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlIAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIAorIyBOTyBpcyB1c2VkLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9VTkRPQ1VNRU5URUQgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgCisjIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZyB3aWxsIAorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvciAKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSAKKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCAKKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBhYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIAorIyBmdW5jdGlvbnMgdGhhdCBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyAKKyMgb3IgcmV0dXJuIHZhbHVlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0IAorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIAorIyBkb2N1bWVudGF0aW9uLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gWUVTCisKKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCAKKyMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgCisjIHRhZ3MsIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIAorIyB3YXJuaW5nIG9yaWdpbmF0ZWQgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbiAKKyMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIAorIyBiZSBvYnRhaW5lZCB2aWEgRklMRV9WRVJTSU9OX0ZJTFRFUikKKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9IAorCisjIFRoZSBXQVJOX0xPR0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHRvIHdoaWNoIHdhcm5pbmcgCisjIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gCisjIHRvIHN0ZGVyci4KKworV0FSTl9MT0dGSUxFICAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBJTlBVVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiAKKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvciAKKyMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIAorIyB3aXRoIHNwYWNlcy4KKworSU5QVVQgICAgICAgICAgICAgICAgICA9IEBTUkNESVJTQCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQElOQ0RJUlNAIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvYworCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzIAorIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzIAorIyBhbHNvIHRoZSBkZWZhdWx0IGlucHV0IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCAKKyMgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvciAKKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlIAorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgCisjIGJsYW5rIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDogCisjICouYyAqLmNjICouY3h4ICouY3BwICouYysrICouamF2YSAqLmlpICouaXh4ICouaXBwICouaSsrICouaW5sICouaCAqLmhoICouaHh4IAorIyAqLmhwcCAqLmgrKyAqLmlkbCAqLm9kbCAqLmNzICoucGhwICoucGhwMyAqLmluYyAqLm0gKi5tbSAqLnB5ICouZjkwCisKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5kb3gKKworIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgCisjIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiAKKyMgSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIAorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYSAKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yIAorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGVzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkIAorIyBmcm9tIHRoZSBpbnB1dC4KKworRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZSAKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlIAorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIAorIyBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8gZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyAKKyMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAKKworIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcyAKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZSAKKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywgCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKworRVhDTFVERV9TWU1CT0xTICAgICAgICA9IAorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgCisjIHRoZSBcaW5jbHVkZSBjb21tYW5kKS4KKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlIAorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgCisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAKKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlIAorIyBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBcaW5jbHVkZSBvciBcZG9udGluY2x1ZGUgCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuIAorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCisKKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbWFnZSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIAorIyB0aGUgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZCAKKyMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbSAKKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPiAKKyMgaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuIAorIyBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIgcHJvZ3JhbSB3cml0ZXMgCisjIHRvIHN0YW5kYXJkIG91dHB1dC4gIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUgCisjIGlnbm9yZWQuCisKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSAKKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuIAorIyBiYXNpcy4gIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZSAKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guICBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOiAKKyMgcGF0dGVybj1maWx0ZXIgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSwgSU5QVVRfRklMVEVSIAorIyBpcyBhcHBsaWVkIHRvIGFsbCBmaWxlcy4KKworRklMVEVSX1BBVFRFUk5TICAgICAgICA9IAorCisjIElmIHRoZSBGSUxURVJfU09VUkNFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5wdXQgZmlsdGVyIChpZiBzZXQgdXNpbmcgCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlIAorIyBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCAKKyMgYmUgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuIAorIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIGFsc28gCisjIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gWUVTCisKKyMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkgCisjIG9mIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBkaXJlY3RseSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IFlFUworCisjIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgaW5zdHJ1Y3QgCisjIGRveHlnZW4gdG8gaGlkZSBhbnkgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZSAKKyMgZnJhZ21lbnRzLiBOb3JtYWwgQyBhbmQgQysrIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gTk8KKworIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUyAKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIAorIyBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUyAKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIAorIyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KQorIyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbQorIyBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsCisjIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLiAgT3RoZXJ3aXNlIHRoZXkgd2lsbCBsaW5rIHRvIHRoZSBkb2N1bWVudHN0aW9uLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlIAorIyB3aWxsIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4gCisjIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgCisjIHRhZ2dpbmcgc3lzdGVtIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdSAKKyMgd2lsbCBuZWVkIHZlcnNpb24gNC44LjYgb3IgaGlnaGVyLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbiAKKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciAKKyMgd2hpY2ggYW4gaW5jbHVkZSBpcyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisKK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4IAorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCAKKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBJZiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGlzIGVuYWJsZWQgKHNlZSBBTFBIQUJFVElDQUxfSU5ERVgpIHRoZW4gCisjIHRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyAKKyMgaW4gd2hpY2ggdGhpcyBsaXN0IHdpbGwgYmUgc3BsaXQgKGNhbiBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEuLjIwXSkKKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIAorIyBjbGFzc2VzIHdpbGwgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiAKKyMgVGhlIElHTk9SRV9QUkVGSVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgcHJlZml4ZXMgdGhhdCAKKyMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIAorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGh0bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciAKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwucGhwLC5hc3ApLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIAorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgZmlsZXMgd2l0aCAuaHRtbCBleHRlbnNpb24uCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGhlYWRlciBmb3IgCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSAKKyMgc3RhbmRhcmQgaGVhZGVyLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yIAorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgCisjIHN0YW5kYXJkIGZvb3Rlci4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIAorIyBzdHlsZSBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIAorIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiAKKyMgd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuIE5vdGUgdGhhdCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIGNvcHkgCisjIHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHNvIGRvbid0IHB1dCB5b3VyIG93biAKKyMgc3R5bGVzaGVldCBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGFzIHdlbGwsIG9yIGl0IHdpbGwgYmUgZXJhc2VkIQorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCisKKyMgSWYgdGhlIEhUTUxfQUxJR05fTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgY2xhc3NlcywgCisjIGZpbGVzIG9yIG5hbWVzcGFjZXMgd2lsbCBiZSBhbGlnbmVkIGluIEhUTUwgdXNpbmcgdGFibGVzLiBJZiBzZXQgdG8gCisjIE5PIGEgYnVsbGV0IGxpc3Qgd2lsbCBiZSB1c2VkLgorCitIVE1MX0FMSUdOX01FTUJFUlMgICAgID0gWUVTCisKKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTCAKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUgCisjIHBhZ2UgaGFzIGxvYWRlZC4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyAKKyMgSmF2YVNjcmlwdCBhbmQgREhUTUwgaXMgcmVxdWlyZWQgKGZvciBpbnN0YW5jZSBNb3ppbGxhIDEuMCssIEZpcmVmb3ggCisjIE5ldHNjYXBlIDYuMCssIEludGVybmV0IGV4cGxvcmVyIDUuMCssIEtvbnF1ZXJvciwgb3IgU2FmYXJpKS4KKworSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IFlFUworCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMyAKKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4gCisjIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBNYWtlZmlsZSBpbiB0aGUgCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluIHRoYXQgCisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbiAKKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIAorIyBpdCBhdCBzdGFydHVwLiAKKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSAKKyMgZmVlZC4gQSBkb2N1bWVudGF0aW9uIGZlZWQgcHJvdmlkZXMgYW4gdW1icmVsbGEgdW5kZXIgd2hpY2ggbXVsdGlwbGUgCisjIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKSAKKyMgY2FuIGJlIGdyb3VwZWQuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgCisjIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhIAorIyByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIAorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyAKKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdG9vbHMgbGlrZSB0aGUgCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21waWxlZCBIVE1MIGhlbHAgZmlsZSAoLmNobSkgCisjIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fRklMRSB0YWcgY2FuIAorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0gZmlsZS4gWW91IAorIyBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUgCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuIAorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIAorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIChoaGMuZXhlKS4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIAorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIG9uIHRoZSBnZW5lcmF0ZWQgaW5kZXguaGhwLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgR0VORVJBVEVfQ0hJIGZsYWcgCisjIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoWUVTKSBvciB0aGF0IAorIyBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hc3RlciAuY2htIGZpbGUgKE5PKS4KKworR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0lOREVYX0VOQ09ESU5HCisjIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpIGFuZCBwcm9qZWN0IGZpbGUKKyMgY29udGVudC4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZyAKKyMgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgYSAKKyMgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgCisjIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kIFFIUF9WSVJUVUFMX0ZPTERFUiAKKyMgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIAorIyBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgUXQgQ29tcHJlc3NlZCBIZWxwICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIAorIyBIVE1MIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4gCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLiAKKyMgVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyAKKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSAKKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UiPlF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZTwvYT4uCisKK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyAKKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSAKKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLWZvbGRlcnMiPlF0IEhlbHAgUHJvamVjdCAvIFZpcnR1YWwgRm9sZGVyczwvYT4uCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4gCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncyBxaGVscGdlbmVyYXRvci4gCisjIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUgZ2VuZXJhdGVkIAorIyAucWhwIGZpbGUgLgorCitRSEdfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgVGhlIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggYXQgCisjIHRvcCBvZiBlYWNoIEhUTUwgcGFnZS4gVGhlIHZhbHVlIE5PICh0aGUgZGVmYXVsdCkgZW5hYmxlcyB0aGUgaW5kZXggYW5kIAorIyB0aGUgdmFsdWUgWUVTIGRpc2FibGVzIGl0LgorCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcyAocmFuZ2UgWzEuLjIwXSkgCisjIHRoYXQgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIEZSQU1FLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQKKyMgY29udGFpbmluZyBhIHRyZWUtbGlrZSBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgCisjIGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyAKKyMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkIChmb3IgaW5zdGFuY2UgTW96aWxsYSAxLjArLCAKKyMgTmV0c2NhcGUgNi4wKywgSW50ZXJuZXQgZXhwbG9yZXIgNS4wKywgb3IgS29ucXVlcm9yKS4gV2luZG93cyB1c2VycyBhcmUgCisjIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlIEhUTUwgaGVscCBmZWF0dXJlLiBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgCisjIGZvciB0aGlzIHRhZyBhcmU6IEhJRVJBUkNISUVTLCB3aGljaCB3aWxsIGdlbmVyYXRlIHRoZSBHcm91cHMsIERpcmVjdG9yaWVzLAorIyBhbmQgQ2xhc3MgSGllcmFyY2h5IHBhZ2VzIHVzaW5nIGEgdHJlZSB2aWV3IGluc3RlYWQgb2YgYW4gb3JkZXJlZCBsaXN0OworIyBBTEwsIHdoaWNoIGNvbWJpbmVzIHRoZSBiZWhhdmlvciBvZiBGUkFNRSBhbmQgSElFUkFSQ0hJRVM7IGFuZCBOT05FLCB3aGljaAorIyBkaXNhYmxlcyB0aGlzIGJlaGF2aW9yIGNvbXBsZXRlbHkuIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzCisjIHJlbGVhc2VzIG9mIERveHlnZW4sIHRoZSB2YWx1ZXMgWUVTIGFuZCBOTyBhcmUgZXF1aXZhbGVudCB0byBGUkFNRSBhbmQgTk9ORQorIyByZXNwZWN0aXZlbHkuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOT05FCisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUgCisjIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZSAKKyMgaXMgc2hvd24uCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGF0ZXggZm9ybXVsYXMgaW5jbHVkZWQgCisjIGFzIGltYWdlcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyAxMC4gTm90ZSB0aGF0IAorIyB3aGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwgZG94eWdlbiBydW4geW91IG5lZWQgCisjIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IAorIyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBMYXRleCBvdXRwdXQuCisKK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUgCisjIGludm9rZWQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gCisjIGdlbmVyYXRlIGluZGV4IGZvciBMYVRlWC4gSWYgbGVmdCBibGFuayBgbWFrZWluZGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIAorIyBkZWZhdWx0IGNvbW1hbmQgbmFtZS4KKworTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCAKKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byAKKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuCisKK0NPTVBBQ1RfTEFURVggICAgICAgICAgPSBZRVMKKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCAKKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBhNHdpZGUsIGxldHRlciwgbGVnYWwgYW5kIAorIyBleGVjdXRpdmUuIElmIGxlZnQgYmxhbmsgYTR3aWRlIHdpbGwgYmUgdXNlZC4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbmFtZXMgb2YgTGFUZVggCisjIHBhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuCisKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPSAKKworIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvciAKKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIAorIyB0aGUgZmlyc3QgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSAKKyMgc3RhbmRhcmQgaGVhZGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKworTEFURVhfSEVBREVSICAgICAgICAgICA9IAorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkIAorIyBpcyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBwZGYgKHVzaW5nIHBzMnBkZikuIFRoZSBwZGYgZmlsZSB3aWxsIAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcyAKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBwZGZsYXRleCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiAKKyMgcGxhaW4gbGF0ZXggaW4gdGhlIGdlbmVyYXRlZCBNYWtlZmlsZS4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYSAKKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCisKK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLiAKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCAKKyMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiAKKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gWUVTCisKKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90IAorIyBpbmNsdWRlIHRoZSBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikgCisjIGluIHRoZSBvdXRwdXQuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dCAKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aCAKKyMgb3RoZXIgUlRGIHJlYWRlcnMgb3IgZWRpdG9ycy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIAorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IAorIyBSVEYgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byAKKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCAKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIFdPUkQgb3Igb3RoZXIgCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLiAKKyMgTm90ZTogd29yZHBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyAKKyMgY29uZmlnIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSAKKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuIAorIyBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworTUFOX09VVFBVVCAgICAgICAgICAgICA9IAorCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0byAKKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gCisKKyMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgRG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwgCisjIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkgCisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgCisjIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dCB0aGVtIHRoZSBtYW4gY29tbWFuZCAKKyMgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4gVGhlIGRlZmF1bHQgaXMgTk8uCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiAKKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSAKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGB4bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitYTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sCisKKyMgVGhlIFhNTF9TQ0hFTUEgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIHNjaGVtYSwgCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZSAKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKK1hNTF9TQ0hFTUEgICAgICAgICAgICAgPSAKKworIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgRFRELCAKKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlIAorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKworWE1MX0RURCAgICAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIAorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyAKKyMgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0byB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IAorIyBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgWE1MIG91dHB1dC4KKworWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlIAorIyB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCAKKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgCisjIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgCisjIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSAKKyMgbW9tZW50LgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgCisjIHRoZSBuZWNlc3NhcnkgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIAorIyB0byBnZW5lcmF0ZSBQREYgYW5kIERWSSBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIAorIyBuaWNlbHkgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuICBUaGlzIGlzIHVzZWZ1bCAKKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgCisjIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciAKKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUgCisjIGFyZSBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguIAorIyBUaGlzIGlzIHVzZWZ1bCBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgCisjIE1ha2VmaWxlIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvciAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZXZhbHVhdGUgYWxsIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgCisjIGZpbGVzLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyAKKyMgbmFtZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IGNvbmRpdGlvbmFsIAorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCAKKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgCisjIHRoZW4gdGhlIG1hY3JvIGV4cGFuc2lvbiBpcyBsaW1pdGVkIHRvIHRoZSBtYWNyb3Mgc3BlY2lmaWVkIHdpdGggdGhlIAorIyBQUkVERUZJTkVEIGFuZCBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZSBpbmNsdWRlcyBmaWxlcyAKKyMgaW4gdGhlIElOQ0xVREVfUEFUSCAoc2VlIGJlbG93KSB3aWxsIGJlIHNlYXJjaCBpZiBhICNpbmNsdWRlIGlzIGZvdW5kLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0IAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IAorIyB0aGUgcHJlcHJvY2Vzc29yLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gQElOQ0RJUlNACisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCAKKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZSAKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgCisjIGJlIHVzZWQuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0IAorIyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUgCisjIG9yIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSA9IGFyZSAKKyMgb21pdHRlZCA9MSBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nIAorIyB1bmRlZmluZWQgdmlhICN1bmRlZiBvciByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIAorIyBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gRE9YWUdFTj0xCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiAKKyMgdGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuIAorIyBUaGUgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gCisjIFVzZSB0aGUgUFJFREVGSU5FRCB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24uCisKK0VYUEFORF9BU19ERUZJTkVEICAgICAgPSBfX2F0dHJpYnV0ZV9fIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLRUQgXAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fdW51c2VkIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX3VzZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fYWxpZ25lZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX190YWJsZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX190YWJsZV9zdGFydCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX190YWJsZV9lbmQKKworIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIAorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCBmdW5jdGlvbi1saWtlIG1hY3JvcyB0aGF0IGFyZSBhbG9uZSAKKyMgb24gYSBsaW5lLCBoYXZlIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCAKKyMgZnVuY3Rpb24gbWFjcm9zIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgCisjIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZ2ZpbGVzLiAKKyMgT3B0aW9uYWxseSBhbiBpbml0aWFsIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIAorIyBjYW4gYmUgYWRkZWQgZm9yIGVhY2ggdGFnZmlsZS4gVGhlIGZvcm1hdCBvZiBhIHRhZyBmaWxlIHdpdGhvdXQgCisjIHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czogCisjICAgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4gCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6IAorIyAgIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4gCisjIHdoZXJlICJsb2MxIiBhbmQgImxvYzIiIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRocyBvciAKKyMgVVJMcy4gSWYgYSBsb2NhdGlvbiBpcyBwcmVzZW50IGZvciBlYWNoIHRhZywgdGhlIGluc3RhbGxkb3ggdG9vbCAKKyMgZG9lcyBub3QgaGF2ZSB0byBiZSBydW4gdG8gY29ycmVjdCB0aGUgbGlua3MuCisjIE5vdGUgdGhhdCBlYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lCisjICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwYXRoKQorIyBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggZG94eWdlbiAKKyMgaXMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9IAorCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkIAorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcyAKKyMgd2lsbCBiZSBsaXN0ZWQuCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZCAKKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgCisjIGJlIGxpc3RlZC4KKworRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdCAKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiBgd2hpY2ggcGVybCcpLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEhUTUwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSAKKyMgb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdCAKKyMgdGhpcyBvcHRpb24gaXMgc3VwZXJzZWRlZCBieSB0aGUgSEFWRV9ET1Qgb3B0aW9uIGJlbG93LiBUaGlzIGlzIG9ubHkgYSAKKyMgZmFsbGJhY2suIEl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlIAorIyBwb3dlcmZ1bCBncmFwaHMuCisKK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBOTworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjIAorIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWUgCisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUgCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlIAorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUgCisjIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgCisjIG9yIGlzIG5vdCBhIGNsYXNzLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gTk8KKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMgCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiwgYSBncmFwaCB2aXN1YWxpemF0aW9uIAorIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIAorIyBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB3cml0ZSBhIGZvbnQgY2FsbGVkIEZyZWVTYW5zLnR0ZiB0byB0aGUgb3V0cHV0IAorIyBkaXJlY3RvcnkgYW5kIHJlZmVyZW5jZSBpdCBpbiBhbGwgZG90IGZpbGVzIHRoYXQgZG94eWdlbiBnZW5lcmF0ZXMuIFRoaXMgCisjIGZvbnQgZG9lcyBub3QgaW5jbHVkZSBhbGwgcG9zc2libGUgdW5pY29kZSBjaGFyYWN0ZXJzIGhvd2V2ZXIsIHNvIHdoZW4geW91IG5lZWQgCisjIHRoZXNlIChvciBqdXN0IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQpIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBuYW1lIAorIyB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIG5lZWQgdG8gbWFrZSBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsIAorIyB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgCisjIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5IHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZSBkaXJlY3RvcnkgCisjIGNvbnRhaW5pbmcgdGhlIGZvbnQuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBGcmVlU2FucworCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgZm9udCBvZiBkb3QgZ3JhcGhzLiAKKyMgVGhlIGRlZmF1bHQgc2l6ZSBpcyAxMHB0LgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIG91dHB1dCBkaXJlY3RvcnkgdG8gbG9vayBmb3IgdGhlIAorIyBGcmVlU2Fucy50dGYgZm9udCAod2hpY2ggZG94eWdlbiB3aWxsIHB1dCB0aGVyZSBpdHNlbGYpLiBJZiB5b3Ugc3BlY2lmeSBhIAorIyBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQgdGhlIHBhdGggd2hlcmUgZG90IAorIyBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSBDTEFTU19HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUgCisjIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgCisjIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgCisjIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiAKKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZCAKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcgCisjIExhbmd1YWdlLgorCitVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIgaW5zdGFuY2VzLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gWUVTCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVfR1JBUEgsIGFuZCBIQVZFX0RPVCAKKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIAorIyBvdGhlciBkb2N1bWVudGVkIGZpbGVzLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVEX0JZX0dSQVBILCBhbmQgCisjIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCAKKyMgZG9jdW1lbnRlZCBoZWFkZXIgZmlsZSBzaG93aW5nIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3IgCisjIGluZGlyZWN0bHkgaW5jbHVkZSB0aGlzIGZpbGUuCisKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ0FMTF9HUkFQSCBhbmQgSEFWRV9ET1Qgb3B0aW9ucyBhcmUgc2V0IHRvIFlFUyB0aGVuIAorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiAKKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIAorIyB0aGUgdGltZSBvZiBhIHJ1bi4gU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbCBncmFwaHMgCisjIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gCisjIG9yIGNsYXNzIG1ldGhvZC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSAKKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciAKKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiAKKyMgd2lsbCBncmFwaGljYWwgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEgsIFNIT1dfRElSRUNUT1JJRVMgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgCisjIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMgCisjIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZQorIyByZWxhdGlvbnMgYmV0d2VlbiB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMgCisjIGdlbmVyYXRlZCBieSBkb3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgcG5nLCBqcGcsIG9yIGdpZgorIyBJZiBsZWZ0IGJsYW5rIHBuZyB3aWxsIGJlIHVzZWQuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBUaGUgdGFnIERPVF9QQVRIIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZSAKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9IAorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdCAKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgCisjIFxkb3RmaWxlIGNvbW1hbmQpLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgCisjIG5vZGVzIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaCAKKyMgYmVjb21lcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyAKKyMgdmlzdWFsaXplZCBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlIAorIyBudW1iZXIgb2YgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuIAorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIAorIyB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgorCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTAKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSAKKyMgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlIAorIyBmcm9tIHRoZSByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyAKKyMgdGhhdCBsYXkgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIAorIyBvcHRpb24gdG8gMSBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlIAorIyBjb2RlIGJhc2VzLiBBbHNvIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgCisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQgCisjIGJhY2tncm91bmQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBkb3Qgb24gV2luZG93cyBkb2VzIG5vdCAKKyMgc2VlbSB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwgCisjIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIAorIyBhIGdyYXBoIChpLmUuIHRoZXkgYmVjb21lIGhhcmQgdG8gcmVhZCkuCisKK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0IAorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzIAorIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSAKKyMgc3VwcG9ydCB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKworRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgYSBsZWdlbmQgcGFnZSBleHBsYWluaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGJveGVzIGFuZCAKKyMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4KKworR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworCisjIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90IGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgCisjIHRoZSB2YXJpb3VzIGdyYXBocy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIHRoZSBzZWFyY2ggZW5naW5lICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFNFQVJDSEVOR0lORSB0YWcgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IGEgc2VhcmNoIGVuZ2luZSBzaG91bGQgYmUgCisjIHVzZWQuIElmIHNldCB0byBOTyB0aGUgdmFsdWVzIG9mIGFsbCB0YWdzIGJlbG93IHRoaXMgb25lIHdpbGwgYmUgaWdub3JlZC4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IE5PCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2JpdGJhc2gvYml0YmFzaC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9iaXRiYXNoL2JpdGJhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTU1OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9iaXRiYXNoL2JpdGJhc2guYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9iaXRiYXNoLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEJpdC1iYXNoaW5nIGludGVyZmFjZXMKKyAqCisgKi8KKworLyoqCisgKiBTZXQvY2xlYXIgb3V0cHV0IGJpdAorICoKKyAqIEB2IGJhc2hlcgkJQml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKiBAdiBiaXRfaWQJCUJpdCBudW1iZXIKKyAqIEB2IGRhdGEJCVZhbHVlIHRvIHdyaXRlCisgKiAKKyAqIElmIEBjIGRhdGEgaXMgMCwgYSBsb2dpYyAwIHdpbGwgYmUgd3JpdHRlbi4gIElmIEBjIGRhdGEgaXMKKyAqIG5vbi16ZXJvLCBhIGxvZ2ljIDEgd2lsbCBiZSB3cml0dGVuLgorICovCit2b2lkIHdyaXRlX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsIHVuc2lnbmVkIGludCBiaXRfaWQsCisJCSB1bnNpZ25lZCBsb25nIGRhdGEgKSB7CisJYmFzaGVyLT5vcC0+d3JpdGUgKCBiYXNoZXIsIGJpdF9pZCwgKCBkYXRhID8gLTFVTCA6IDAgKSApOworfQorCisvKioKKyAqIFJlYWQgaW5wdXQgYml0CisgKgorICogQHYgYmFzaGVyCQlCaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqIEB2IGJpdF9pZAkJQml0IG51bWJlcgorICogQHJldCBkYXRhCQlWYWx1ZSByZWFkCisgKgorICogQGMgZGF0YSB3aWxsIGFsd2F5cyBiZSBlaXRoZXIgMCBvciAtMVVMLiAgVGhlIGlkZWEgaXMgdGhhdCB0aGUKKyAqIGNhbGxlciBjYW4gc2ltcGx5IGJpbmFyeS1BTkQgdGhlIHJldHVybmVkIHZhbHVlIHdpdGggd2hhdGV2ZXIgbWFzaworICogaXQgbmVlZHMgdG8gYXBwbHkuCisgKi8KK2ludCByZWFkX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsIHVuc2lnbmVkIGludCBiaXRfaWQgKSB7CisJcmV0dXJuICggYmFzaGVyLT5vcC0+cmVhZCAoIGJhc2hlciwgYml0X2lkICkgPyAtMVVMIDogMCApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9iaXRiYXNoL2kyY19iaXQuYyBiL2dweGUvc3JjL2RyaXZlcnMvYml0YmFzaC9pMmNfYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxOTcyNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvYml0YmFzaC9pMmNfYml0LmMKQEAgLTAsMCArMSwzOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdweGUvYml0YmFzaC5oPgorI2luY2x1ZGUgPGdweGUvaTJjLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEkyQyBiaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGltcGxlbWVudHMgYSBzaW1wbGUgSTJDIG1hc3RlciB2aWEgYSBiaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqIHRoYXQgcHJvdmlkZXMgdHdvIGxpbmVzOiBTQ0wgKGNsb2NrKSBhbmQgU0RBIChkYXRhKS4KKyAqLworCisvKioKKyAqIERlbGF5IGJldHdlZW4gb3V0cHV0IHN0YXRlIGNoYW5nZXMKKyAqCisgKiBNYXggcmF0ZWQgaTJjIHNwZWVkIChmb3IgdGhlIGJhc2ljIGkyYyBwcm90b2NvbCkgaXMgMTAwa2JwcywKKyAqIGkuZS4gMjAwayBjbG9jayB0cmFuc2l0aW9ucyBwZXIgc2Vjb25kLgorICovCitzdGF0aWMgdm9pZCBpMmNfZGVsYXkgKCB2b2lkICkgeworCXVkZWxheSAoIEkyQ19VREVMQVkgKTsKK30KKworLyoqCisgKiBTZXQgc3RhdGUgb2YgSTJDIFNDTCBsaW5lCisgKgorICogQHYgYmFzaGVyCQlCaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqIEB2IHN0YXRlCQlOZXcgc3RhdGUgb2YgU0NMCisgKi8KK3N0YXRpYyB2b2lkIHNldHNjbCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsIGludCBzdGF0ZSApIHsKKwlEQkcyICggIiVjIiwgKCBzdGF0ZSA/ICcvJyA6ICdcXCcgKSApOworCXdyaXRlX2JpdCAoIGJhc2hlciwgSTJDX0JJVF9TQ0wsIHN0YXRlICk7CisJaTJjX2RlbGF5KCk7Cit9CisKKy8qKgorICogU2V0IHN0YXRlIG9mIEkyQyBTREEgbGluZQorICoKKyAqIEB2IGJhc2hlcgkJQml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKiBAdiBzdGF0ZQkJTmV3IHN0YXRlIG9mIFNEQQorICovCitzdGF0aWMgdm9pZCBzZXRzZGEgKCBzdHJ1Y3QgYml0X2Jhc2hlciAqYmFzaGVyLCBpbnQgc3RhdGUgKSB7CisJREJHMiAoICIlYyIsICggc3RhdGUgPyAnMScgOiAnMCcgKSApOworCXdyaXRlX2JpdCAoIGJhc2hlciwgSTJDX0JJVF9TREEsIHN0YXRlICk7CisJaTJjX2RlbGF5KCk7Cit9CisKKy8qKgorICogR2V0IHN0YXRlIG9mIEkyQyBTREEgbGluZQorICoKKyAqIEB2IGJhc2hlcgkJQml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKiBAcmV0IHN0YXRlCQlTdGF0ZSBvZiBTREEKKyAqLworc3RhdGljIGludCBnZXRzZGEgKCBzdHJ1Y3QgYml0X2Jhc2hlciAqYmFzaGVyICkgeworCWludCBzdGF0ZTsKKwlzdGF0ZSA9IHJlYWRfYml0ICggYmFzaGVyLCBJMkNfQklUX1NEQSApOworCURCRzIgKCAiJWMiLCAoIHN0YXRlID8gJysnIDogJy0nICkgKTsKKwlyZXR1cm4gc3RhdGU7Cit9CisKKy8qKgorICogU2VuZCBhbiBJMkMgc3RhcnQgY29uZGl0aW9uCisgKgorICogQHYgYmFzaGVyCQlCaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqLworc3RhdGljIHZvaWQgaTJjX3N0YXJ0ICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciApIHsKKwlzZXRzY2wgKCBiYXNoZXIsIDEgKTsKKwlzZXRzZGEgKCBiYXNoZXIsIDAgKTsKKwlzZXRzY2wgKCBiYXNoZXIsIDAgKTsKKwlzZXRzZGEgKCBiYXNoZXIsIDEgKTsKK30KKworLyoqCisgKiBTZW5kIGFuIEkyQyBkYXRhIGJpdAorICoKKyAqIEB2IGJhc2hlcgkJQml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKiBAdiBiaXQJCUJpdCB0byBzZW5kCisgKi8KK3N0YXRpYyB2b2lkIGkyY19zZW5kX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsIGludCBiaXQgKSB7CisJc2V0c2RhICggYmFzaGVyLCBiaXQgKTsKKwlzZXRzY2wgKCBiYXNoZXIsIDEgKTsKKwlzZXRzY2wgKCBiYXNoZXIsIDAgKTsKKwlzZXRzZGEgKCBiYXNoZXIsIDEgKTsKK30KKworLyoqCisgKiBSZWNlaXZlIGFuIEkyQyBkYXRhIGJpdAorICoKKyAqIEB2IGJhc2hlcgkJQml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKiBAcmV0IGJpdAkJUmVjZWl2ZWQgYml0CisgKi8KK3N0YXRpYyBpbnQgaTJjX3JlY3ZfYml0ICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciApIHsKKwlpbnQgYml0OworCisJc2V0c2NsICggYmFzaGVyLCAxICk7CisJYml0ID0gZ2V0c2RhICggYmFzaGVyICk7CisJc2V0c2NsICggYmFzaGVyLCAwICk7CisJcmV0dXJuIGJpdDsKK30KKworLyoqCisgKiBTZW5kIGFuIEkyQyBzdG9wIGNvbmRpdGlvbgorICoKKyAqIEB2IGJhc2hlcgkJQml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB2b2lkIGkyY19zdG9wICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciApIHsKKwlzZXRzZGEgKCBiYXNoZXIsIDAgKTsKKwlzZXRzY2wgKCBiYXNoZXIsIDEgKTsKKwlzZXRzZGEgKCBiYXNoZXIsIDEgKTsKK30KKworLyoqCisgKiBTZW5kIGJ5dGUgdmlhIEkyQyBidXMgYW5kIGNoZWNrIGZvciBhY2tub3dsZWRnZW1lbnQKKyAqCisgKiBAdiBiYXNoZXIJCUJpdC1iYXNoaW5nIGludGVyZmFjZQorICogQHYgYnl0ZQkJQnl0ZSB0byBzZW5kCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBTZW5kcyBhIGJ5dGUgdmlhIHRoZSBJMkMgYnVzIGFuZCBjaGVja3MgZm9yIGFuIGFja25vd2xlZGdlbWVudCBmcm9tCisgKiB0aGUgc2xhdmUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGkyY19zZW5kX2J5dGUgKCBzdHJ1Y3QgYml0X2Jhc2hlciAqYmFzaGVyLCB1aW50OF90IGJ5dGUgKSB7CisJaW50IGk7CisJaW50IGFjazsKKworCS8qIFNlbmQgYnl0ZSAqLworCURCRzIgKCAiW3NlbmQgJTAyeF0iLCBieXRlICk7CisJZm9yICggaSA9IDggOyBpIDsgaS0tICkgeworCQlpMmNfc2VuZF9iaXQgKCBiYXNoZXIsIGJ5dGUgJiAweDgwICk7CisJCWJ5dGUgPDw9IDE7CisJfQorCisJLyogQ2hlY2sgZm9yIGFja25vd2xlZGdlbWVudCBmcm9tIHNsYXZlICovCisJYWNrID0gKCBpMmNfcmVjdl9iaXQgKCBiYXNoZXIgKSA9PSAwICk7CisJREJHMiAoICIlcyIsICggYWNrID8gIlthY2tlZF0iIDogIltub3QgYWNrZWRdIiApICk7CisKKwlyZXR1cm4gKCBhY2sgPyAwIDogLUVJTyApOworfQorCisvKioKKyAqIFJlY2VpdmUgYnl0ZSB2aWEgSTJDIGJ1cworICoKKyAqIEB2IGJhc2hlcgkJQml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKiBAcmV0IGJ5dGUJCVJlY2VpdmVkIGJ5dGUKKyAqCisgKiBSZWNlaXZlcyBhIGJ5dGUgdmlhIHRoZSBJMkMgYnVzIGFuZCBzZW5kcyBOQUNLIHRvIHRoZSBzbGF2ZSBkZXZpY2UuCisgKi8KK3N0YXRpYyB1aW50OF90IGkyY19yZWN2X2J5dGUgKCBzdHJ1Y3QgYml0X2Jhc2hlciAqYmFzaGVyICkgeworCXVpbnQ4X3QgYnl0ZSA9IDA7CisJaW50IGk7CisKKwkvKiBSZWNlaXZlIGJ5dGUgKi8KKwlmb3IgKCBpID0gOCA7IGkgOyBpLS0gKSB7CisJCWJ5dGUgPDw9IDE7CisJCWJ5dGUgfD0gKCBpMmNfcmVjdl9iaXQgKCBiYXNoZXIgKSAmIDB4MSApOworCX0KKworCS8qIFNlbmQgTkFDSyAqLworCWkyY19zZW5kX2JpdCAoIGJhc2hlciwgMSApOworCisJREJHMiAoICJbcmN2ZCAlMDJ4XSIsIGJ5dGUgKTsKKwlyZXR1cm4gYnl0ZTsKK30KKworLyoqCisgKiBTZWxlY3QgSTJDIGRldmljZSBmb3IgcmVhZGluZyBvciB3cml0aW5nCisgKgorICogQHYgYmFzaGVyCQlCaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqIEB2IGkyY2RldgkJSTJDIGRldmljZQorICogQHYgb2Zmc2V0CQlTdGFydGluZyBvZmZzZXQgd2l0aGluIHRoZSBkZXZpY2UKKyAqIEB2IGRpcmVjdGlvbgkJSTJDX1JFQUQgb3IgSTJDX1dSSVRFCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpMmNfc2VsZWN0ICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciwgc3RydWN0IGkyY19kZXZpY2UgKmkyY2RldiwKKwkJCXVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBkaXJlY3Rpb24gKSB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisJaW50IHNoaWZ0OworCXVuc2lnbmVkIGludCBieXRlOworCWludCByYzsKKworCWkyY19zdGFydCAoIGJhc2hlciApOworCisJLyogQ2FsY3VsYXRlIGFkZHJlc3MgdG8gYXBwZWFyIG9uIGJ1cyAqLworCWFkZHJlc3MgPSAoICggKCBpMmNkZXYtPmRldl9hZGRyIHwKKwkJCSggb2Zmc2V0ID4+ICggOCAqIGkyY2Rldi0+d29yZF9hZGRyX2xlbiApICkgKSA8PCAxICkKKwkJICAgIHwgZGlyZWN0aW9uICk7CisKKwkvKiBTZW5kIGFkZHJlc3MgYSBieXRlIGF0IGEgdGltZSAqLworCWZvciAoIHNoaWZ0ID0gKCA4ICogKCBpMmNkZXYtPmRldl9hZGRyX2xlbiAtIDEgKSApIDsKKwkgICAgICBzaGlmdCA+PSAwIDsgc2hpZnQgLT0gOCApIHsKKwkJYnl0ZSA9ICggKCBhZGRyZXNzID4+IHNoaWZ0ICkgJiAweGZmICk7CisJCWlmICggKCByYyA9IGkyY19zZW5kX2J5dGUgKCBiYXNoZXIsIGJ5dGUgKSApICE9IDAgKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlc2V0IEkyQyBidXMKKyAqCisgKiBAdiBiYXNoZXIJCUJpdC1iYXNoaW5nIGludGVyZmFjZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogaTJjIGRldmljZXMgb2Z0ZW4gZG9uJ3QgaGF2ZSBhIHJlc2V0IGxpbmUsIHNvIGV2ZW4gYSByZWJvb3Qgb3IKKyAqIHN5c3RlbSBwb3dlciBjeWNsZSBpcyBzb21ldGltZXMgbm90IGVub3VnaCB0byBicmluZyB0aGVtIGJhY2sgdG8gYQorICoga25vd24gc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQgaTJjX3Jlc2V0ICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciApIHsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgc2RhOworCisJLyogQ2xvY2sgdGhyb3VnaCBzZXZlcmFsIGN5Y2xlcywgd2FpdGluZyBmb3IgYW4gb3Bwb3J0dW5pdHkgdG8KKwkgKiBwdWxsIFNEQSBsb3cgd2hpbGUgU0NMIGlzIGhpZ2ggKHdoaWNoIGNyZWF0ZXMgYSBzdGFydAorCSAqIGNvbmRpdGlvbikuCisJICovCisJc2V0c2NsICggYmFzaGVyLCAwICk7CisJc2V0c2RhICggYmFzaGVyLCAxICk7CisJZm9yICggaSA9IDAgOyBpIDwgSTJDX1JFU0VUX01BWF9DWUNMRVMgOyBpKysgKSB7CisJCXNldHNjbCAoIGJhc2hlciwgMSApOworCQlzZGEgPSBnZXRzZGEgKCBiYXNoZXIgKTsKKwkJaWYgKCBzZGEgKSB7CisJCQkvKiBOb3cgdGhhdCB0aGUgZGV2aWNlIHdpbGwgc2VlIGEgc3RhcnQsIGlzc3VlIGl0ICovCisJCQlpMmNfc3RhcnQgKCBiYXNoZXIgKTsKKwkJCS8qIFN0b3AgdGhlIGJ1cyB0byBsZWF2ZSBpdCBpbiBhIGtub3duIGdvb2Qgc3RhdGUgKi8KKwkJCWkyY19zdG9wICggYmFzaGVyICk7CisJCQlEQkdDICggYmFzaGVyLCAiSTJDQklUICVwIHJlc2V0IGFmdGVyICVkIGF0dGVtcHRzXG4iLAorCQkJICAgICAgIGJhc2hlciwgKCBpICsgMSApICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzZXRzY2wgKCBiYXNoZXIsIDAgKTsKKwl9CisKKwlEQkdDICggYmFzaGVyLCAiSTJDQklUICVwIGNvdWxkIG5vdCByZXNldCBhZnRlciAlZCBhdHRlbXB0c1xuIiwKKwkgICAgICAgYmFzaGVyLCBpICk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qKgorICogUmVhZCBkYXRhIGZyb20gSTJDIGRldmljZSB2aWEgYml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKgorICogQHYgaTJjCQlJMkMgaW50ZXJmYWNlCisgKiBAdiBpMmNkZXYJCUkyQyBkZXZpY2UKKyAqIEB2IG9mZnNldAkJU3RhcnRpbmcgb2Zmc2V0IHdpdGhpbiB0aGUgZGV2aWNlCisgKiBAdiBkYXRhCQlEYXRhIGJ1ZmZlcgorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIE5vdGUgdGhhdCBhdHRlbXB0aW5nIHRvIHJlYWQgemVybyBieXRlcyBvZiBkYXRhIGlzIGEgdmFsaWQgd2F5IHRvCisgKiBjaGVjayBmb3IgSTJDIGRldmljZSBwcmVzZW5jZS4KKyAqLworc3RhdGljIGludCBpMmNfYml0X3JlYWQgKCBzdHJ1Y3QgaTJjX2ludGVyZmFjZSAqaTJjLAorCQkJICBzdHJ1Y3QgaTJjX2RldmljZSAqaTJjZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICB1aW50OF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuICkgeworCXN0cnVjdCBpMmNfYml0X2Jhc2hlciAqaTJjYml0CisJCT0gY29udGFpbmVyX29mICggaTJjLCBzdHJ1Y3QgaTJjX2JpdF9iYXNoZXIsIGkyYyApOworCXN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIgPSAmaTJjYml0LT5iYXNoZXI7CisJaW50IHJjID0gMDsKKworCURCR0MgKCBiYXNoZXIsICJJMkNCSVQgJXAgcmVhZGluZyBmcm9tIGRldmljZSAleDogIiwKKwkgICAgICAgYmFzaGVyLCBpMmNkZXYtPmRldl9hZGRyICk7CisKKwlmb3IgKCA7IDsgZGF0YSsrLCBvZmZzZXQrKyApIHsKKworCQkvKiBTZWxlY3QgZGV2aWNlIGZvciB3cml0aW5nICovCisJCWlmICggKCByYyA9IGkyY19zZWxlY3QgKCBiYXNoZXIsIGkyY2Rldiwgb2Zmc2V0LAorCQkJCQkgSTJDX1dSSVRFICkgKSAhPSAwICkKKwkJCWJyZWFrOworCisJCS8qIEFib3J0IGF0IGVuZCBvZiBkYXRhICovCisJCWlmICggISAoIGxlbi0tICkgKQorCQkJYnJlYWs7CisKKwkJLyogU2VsZWN0IG9mZnNldCAqLworCQlpZiAoICggcmMgPSBpMmNfc2VuZF9ieXRlICggYmFzaGVyLCBvZmZzZXQgKSApICE9IDAgKQorCQkJYnJlYWs7CisJCQorCQkvKiBTZWxlY3QgZGV2aWNlIGZvciByZWFkaW5nICovCisJCWlmICggKCByYyA9IGkyY19zZWxlY3QgKCBiYXNoZXIsIGkyY2Rldiwgb2Zmc2V0LAorCQkJCQkgSTJDX1JFQUQgKSApICE9IDAgKQorCQkJYnJlYWs7CisKKwkJLyogUmVhZCBieXRlICovCisJCSpkYXRhID0gaTJjX3JlY3ZfYnl0ZSAoIGJhc2hlciApOworCQlEQkdDICggYmFzaGVyLCAiJTAyeCAiLCAqZGF0YSApOworCX0KKwkKKwlEQkdDICggYmFzaGVyLCAiJXNcbiIsICggcmMgPyAiZmFpbGVkIiA6ICIiICkgKTsKKwlpMmNfc3RvcCAoIGJhc2hlciApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBXcml0ZSBkYXRhIHRvIEkyQyBkZXZpY2UgdmlhIGJpdC1iYXNoaW5nIGludGVyZmFjZQorICoKKyAqIEB2IGkyYwkJSTJDIGludGVyZmFjZQorICogQHYgaTJjZGV2CQlJMkMgZGV2aWNlCisgKiBAdiBvZmZzZXQJCVN0YXJ0aW5nIG9mZnNldCB3aXRoaW4gdGhlIGRldmljZQorICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBOb3RlIHRoYXQgYXR0ZW1wdGluZyB0byB3cml0ZSB6ZXJvIGJ5dGVzIG9mIGRhdGEgaXMgYSB2YWxpZCB3YXkgdG8KKyAqIGNoZWNrIGZvciBJMkMgZGV2aWNlIHByZXNlbmNlLgorICovCitzdGF0aWMgaW50IGkyY19iaXRfd3JpdGUgKCBzdHJ1Y3QgaTJjX2ludGVyZmFjZSAqaTJjLAorCQkJICAgc3RydWN0IGkyY19kZXZpY2UgKmkyY2RldiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4gKSB7CisJc3RydWN0IGkyY19iaXRfYmFzaGVyICppMmNiaXQKKwkJPSBjb250YWluZXJfb2YgKCBpMmMsIHN0cnVjdCBpMmNfYml0X2Jhc2hlciwgaTJjICk7CisJc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciA9ICZpMmNiaXQtPmJhc2hlcjsKKwlpbnQgcmMgPSAwOworCisJREJHQyAoIGJhc2hlciwgIkkyQ0JJVCAlcCB3cml0aW5nIHRvIGRldmljZSAleDogIiwKKwkgICAgICAgYmFzaGVyLCBpMmNkZXYtPmRldl9hZGRyICk7CisKKwlmb3IgKCA7IDsgZGF0YSsrLCBvZmZzZXQrKyApIHsKKworCQkvKiBTZWxlY3QgZGV2aWNlIGZvciB3cml0aW5nICovCisJCWlmICggKCByYyA9IGkyY19zZWxlY3QgKCBiYXNoZXIsIGkyY2Rldiwgb2Zmc2V0LAorCQkJCQkgSTJDX1dSSVRFICkgKSAhPSAwICkKKwkJCWJyZWFrOworCQkKKwkJLyogQWJvcnQgYXQgZW5kIG9mIGRhdGEgKi8KKwkJaWYgKCAhICggbGVuLS0gKSApCisJCQlicmVhazsKKworCQkvKiBTZWxlY3Qgb2Zmc2V0ICovCisJCWlmICggKCByYyA9IGkyY19zZW5kX2J5dGUgKCBiYXNoZXIsIG9mZnNldCApICkgIT0gMCApCisJCQlicmVhazsKKwkJCisJCS8qIFdyaXRlIGRhdGEgdG8gZGV2aWNlICovCisJCURCR0MgKCBiYXNoZXIsICIlMDJ4ICIsICpkYXRhICk7CisJCWlmICggKCByYyA9IGkyY19zZW5kX2J5dGUgKCBiYXNoZXIsICpkYXRhICkgKSAhPSAwICkKKwkJCWJyZWFrOworCX0KKwkKKwlEQkdDICggYmFzaGVyLCAiJXNcbiIsICggcmMgPyAiZmFpbGVkIiA6ICIiICkgKTsKKwlpMmNfc3RvcCAoIGJhc2hlciApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBJbml0aWFsaXNlIEkyQyBiaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqCisgKiBAdiBpMmNiaXQJCUkyQyBiaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqIEB2IGJhc2hfb3AJCUJpdC1iYXNoZXIgb3BlcmF0aW9ucworICovCitpbnQgaW5pdF9pMmNfYml0X2Jhc2hlciAoIHN0cnVjdCBpMmNfYml0X2Jhc2hlciAqaTJjYml0LAorCQkJICBzdHJ1Y3QgYml0X2Jhc2hlcl9vcGVyYXRpb25zICpiYXNoX29wICkgeworCXN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIgPSAmaTJjYml0LT5iYXNoZXI7CisJaW50IHJjOworCisJLyogSW5pdGlhbGlzZSBkYXRhIHN0cnVjdHVyZXMgKi8KKwliYXNoZXItPm9wID0gYmFzaF9vcDsKKwlhc3NlcnQgKCBiYXNoZXItPm9wLT5yZWFkICE9IE5VTEwgKTsKKwlhc3NlcnQgKCBiYXNoZXItPm9wLT53cml0ZSAhPSBOVUxMICk7CisJaTJjYml0LT5pMmMucmVhZCA9IGkyY19iaXRfcmVhZDsKKwlpMmNiaXQtPmkyYy53cml0ZSA9IGkyY19iaXRfd3JpdGU7CisKKwkvKiBSZXNldCBJMkMgYnVzICovCisJaWYgKCAoIHJjID0gaTJjX3Jlc2V0ICggYmFzaGVyICkgKSAhPSAwICkgeworCQlEQkdDICggYmFzaGVyLCAiSTJDQklUICVwIGNvdWxkIG5vdCByZXNldCBJMkMgYnVzOiAlc1xuIiwKKwkJICAgICAgIGJhc2hlciwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvYml0YmFzaC9zcGlfYml0LmMgYi9ncHhlL3NyYy9kcml2ZXJzL2JpdGJhc2gvc3BpX2JpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzAzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL2JpdGJhc2gvc3BpX2JpdC5jCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdweGUvYml0YmFzaC5oPgorI2luY2x1ZGUgPGdweGUvc3BpX2JpdC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBTUEkgYml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKgorICovCisKKy8qKiBEZWxheSBiZXR3ZWVuIFNDTEsgY2hhbmdlcyBhbmQgYXJvdW5kIFNTIGNoYW5nZXMgKi8KK3N0YXRpYyB2b2lkIHNwaV9iaXRfZGVsYXkgKCB2b2lkICkgeworCXVkZWxheSAoIFNQSV9CSVRfVURFTEFZICk7Cit9CisKKy8qKiBDaGlwIHNlbGVjdCBsaW5lIHdpbGwgYmUgYXNzZXJ0ZWQgKi8KKyNkZWZpbmUgU0VMRUNUX1NMQVZFIDAKKworLyoqIENoaXAgc2VsZWN0IGxpbmUgd2lsbCBiZSBkZWFzc2VydGVkICovCisjZGVmaW5lIERFU0VMRUNUX1NMQVZFIFNQSV9NT0RFX1NTUE9MCisKKy8qKgorICogU2VsZWN0L2Rlc2VsZWN0IHNsYXZlCisgKgorICogQHYgc3BpYml0CQlTUEkgYml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKiBAdiBzbGF2ZQkJU2xhdmUgbnVtYmVyCisgKiBAdiBzdGF0ZQkJU2xhdmUgc2VsZWN0IHN0YXRlCisgKgorICogQGMgc3RhdGUgbXVzdCBiZSBAYyBTRUxFQ1RfU0xBVkUgb3IgQGMgREVTRUxFQ1RfU0xBVkUuCisgKi8KK3N0YXRpYyB2b2lkIHNwaV9iaXRfc2V0X3NsYXZlX3NlbGVjdCAoIHN0cnVjdCBzcGlfYml0X2Jhc2hlciAqc3BpYml0LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2xhdmUsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBzdGF0ZSApIHsKKwlzdHJ1Y3QgYml0X2Jhc2hlciAqYmFzaGVyID0gJnNwaWJpdC0+YmFzaGVyOworCisJc3RhdGUgXj0gKCBzcGliaXQtPmJ1cy5tb2RlICYgU1BJX01PREVfU1NQT0wgKTsKKwlEQkdDMiAoIHNwaWJpdCwgIlNQSUJJVCAlcCBzZXR0aW5nIHNsYXZlICVkIHNlbGVjdCAlc1xuIiwKKwkJc3BpYml0LCBzbGF2ZSwgKCBzdGF0ZSA/ICJoaWdoIiA6ICJsb3ciICkgKTsKKworCXNwaV9iaXRfZGVsYXkoKTsKKwl3cml0ZV9iaXQgKCBiYXNoZXIsIFNQSV9CSVRfU1MgKCBzbGF2ZSApLCBzdGF0ZSApOworCXNwaV9iaXRfZGVsYXkoKTsKK30KKworLyoqCisgKiBUcmFuc2ZlciBiaXRzIG92ZXIgU1BJIGJpdC1iYXNoaW5nIGJ1cworICoKKyAqIEB2IGJ1cwkJU1BJIGJ1cworICogQHYgZGF0YV9vdXQJCVRYIGRhdGEgYnVmZmVyIChvciBOVUxMKQorICogQHYgZGF0YV9pbgkJUlggZGF0YSBidWZmZXIgKG9yIE5VTEwpCisgKiBAdiBsZW4JCUxlbmd0aCBvZiB0cmFuc2ZlciAoaW4gQGIgYml0cykKKyAqIEB2IGVuZGlhbm5lc3MJRW5kaWFubmVzcyBvZiB0aGlzIGRhdGEgdHJhbnNmZXIKKyAqCisgKiBUaGlzIGlzc3VlcyBAYyBsZW4gY2xvY2sgY3ljbGVzIG9uIHRoZSBTUEkgYnVzLCBzaGlmdGluZyBvdXQgZGF0YQorICogZnJvbSB0aGUgQGMgZGF0YV9vdXQgYnVmZmVyIHRvIHRoZSBNT1NJIGxpbmUgYW5kIHNoaWZ0aW5nIGluIGRhdGEKKyAqIGZyb20gdGhlIE1JU08gbGluZSB0byB0aGUgQGMgZGF0YV9pbiBidWZmZXIuICBJZiBAYyBkYXRhX291dCBpcworICogTlVMTCwgdGhlbiB0aGUgZGF0YSBzZW50IHdpbGwgYmUgYWxsIHplcm9lcy4gIElmIEBjIGRhdGFfaW4gaXMKKyAqIE5VTEwsIHRoZW4gdGhlIGluY29taW5nIGRhdGEgd2lsbCBiZSBkaXNjYXJkZWQuCisgKi8KK3N0YXRpYyB2b2lkIHNwaV9iaXRfdHJhbnNmZXIgKCBzdHJ1Y3Qgc3BpX2JpdF9iYXNoZXIgKnNwaWJpdCwKKwkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhX291dCwgdm9pZCAqZGF0YV9pbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgZW5kaWFubmVzcyApIHsKKwlzdHJ1Y3Qgc3BpX2J1cyAqYnVzID0gJnNwaWJpdC0+YnVzOworCXN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIgPSAmc3BpYml0LT5iYXNoZXI7CisJdW5zaWduZWQgaW50IHNjbGsgPSAoICggYnVzLT5tb2RlICYgU1BJX01PREVfQ1BPTCApID8gMSA6IDAgKTsKKwl1bnNpZ25lZCBpbnQgY3BoYSA9ICggKCBidXMtPm1vZGUgJiBTUElfTU9ERV9DUEhBICkgPyAxIDogMCApOworCXVuc2lnbmVkIGludCBiaXRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBieXRlX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYnl0ZV9tYXNrOworCXVuc2lnbmVkIGludCBiaXQ7CisJdW5zaWduZWQgaW50IHN0ZXA7CisKKwlEQkdDMiAoIHNwaWJpdCwgIlNQSUJJVCAlcCB0cmFuc2ZlcnJpbmcgJWQgYml0cyBpbiBtb2RlICUjeFxuIiwKKwkJc3BpYml0LCBsZW4sIGJ1cy0+bW9kZSApOworCisJZm9yICggc3RlcCA9IDAgOyBzdGVwIDwgKCBsZW4gKiAyICkgOyBzdGVwKysgKSB7CisJCS8qIENhbGN1bGF0ZSBieXRlIG9mZnNldCBhbmQgYnl0ZSBtYXNrICovCisJCWJpdF9vZmZzZXQgPSAoICggZW5kaWFubmVzcyA9PSBTUElfQklUX0JJR19FTkRJQU4gKSA/CisJCQkgICAgICAgKCBsZW4gLSAoIHN0ZXAgLyAyICkgLSAxICkgOiAoIHN0ZXAgLyAyICkgKTsKKwkJYnl0ZV9vZmZzZXQgPSAoIGJpdF9vZmZzZXQgLyA4ICk7CisJCWJ5dGVfbWFzayA9ICggMSA8PCAoIGJpdF9vZmZzZXQgJSA4ICkgKTsKKworCQkvKiBTaGlmdCBkYXRhIGluIG9yIG91dCAqLworCQlpZiAoIHNjbGsgPT0gY3BoYSApIHsKKwkJCWNvbnN0IHVpbnQ4X3QgKmJ5dGU7CisKKwkJCS8qIFNoaWZ0IGRhdGEgb3V0ICovCisJCQlpZiAoIGRhdGFfb3V0ICkgeworCQkJCWJ5dGUgPSAoIGRhdGFfb3V0ICsgYnl0ZV9vZmZzZXQgKTsKKwkJCQliaXQgPSAoICpieXRlICYgYnl0ZV9tYXNrICk7CisJCQkJREJHQ1AgKCBzcGliaXQsICJTUElCSVQgJXAgd3JvdGUgYml0ICVkXG4iLAorCQkJCQlzcGliaXQsICggYml0ID8gMSA6IDAgKSApOworCQkJfSBlbHNlIHsKKwkJCQliaXQgPSAwOworCQkJfQorCQkJd3JpdGVfYml0ICggYmFzaGVyLCBTUElfQklUX01PU0ksIGJpdCApOworCQl9IGVsc2UgeworCQkJdWludDhfdCAqYnl0ZTsKKworCQkJLyogU2hpZnQgZGF0YSBpbiAqLworCQkJYml0ID0gcmVhZF9iaXQgKCBiYXNoZXIsIFNQSV9CSVRfTUlTTyApOworCQkJaWYgKCBkYXRhX2luICkgeworCQkJCURCR0NQICggc3BpYml0LCAiU1BJQklUICVwIHJlYWQgYml0ICVkXG4iLAorCQkJCQlzcGliaXQsICggYml0ID8gMSA6IDAgKSApOworCQkJCWJ5dGUgPSAoIGRhdGFfaW4gKyBieXRlX29mZnNldCApOworCQkJCSpieXRlICY9IH5ieXRlX21hc2s7CisJCQkJKmJ5dGUgfD0gKCBiaXQgJiBieXRlX21hc2sgKTsKKwkJCX0KKwkJfQorCisJCS8qIFRvZ2dsZSBjbG9jayBsaW5lICovCisJCXNwaV9iaXRfZGVsYXkoKTsKKwkJc2NsayBePSAxOworCQl3cml0ZV9iaXQgKCBiYXNoZXIsIFNQSV9CSVRfU0NMSywgc2NsayApOworCX0KK30KKworLyoqCisgKiBSZWFkL3dyaXRlIGRhdGEgdmlhIFNQSSBiaXQtYmFzaGluZyBidXMKKyAqCisgKiBAdiBidXMJCVNQSSBidXMKKyAqIEB2IGRldmljZQkJU1BJIGRldmljZQorICogQHYgY29tbWFuZAkJQ29tbWFuZAorICogQHYgYWRkcmVzcwkJQWRkcmVzcyB0byByZWFkL3dyaXRlICg8MCBmb3Igbm8gYWRkcmVzcykKKyAqIEB2IGRhdGFfb3V0CQlUWCBkYXRhIGJ1ZmZlciAob3IgTlVMTCkKKyAqIEB2IGRhdGFfaW4JCVJYIGRhdGEgYnVmZmVyIChvciBOVUxMKQorICogQHYgbGVuCQlMZW5ndGggb2YgdHJhbnNmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNwaV9iaXRfcncgKCBzdHJ1Y3Qgc3BpX2J1cyAqYnVzLCBzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2aWNlLAorCQkJdW5zaWduZWQgaW50IGNvbW1hbmQsIGludCBhZGRyZXNzLAorCQkJY29uc3Qgdm9pZCAqZGF0YV9vdXQsIHZvaWQgKmRhdGFfaW4sIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IHNwaV9iaXRfYmFzaGVyICpzcGliaXQKKwkJPSBjb250YWluZXJfb2YgKCBidXMsIHN0cnVjdCBzcGlfYml0X2Jhc2hlciwgYnVzICk7CisJdWludDMyX3QgdG1wX2NvbW1hbmQ7CisJdWludDMyX3QgdG1wX2FkZHJlc3M7CisJdWludDMyX3QgdG1wX2FkZHJlc3NfZGV0ZWN0OworCisJLyogU2V0IGNsb2NrIGxpbmUgdG8gaWRsZSBzdGF0ZSAqLworCXdyaXRlX2JpdCAoICZzcGliaXQtPmJhc2hlciwgU1BJX0JJVF9TQ0xLLCAKKwkJICAgICggYnVzLT5tb2RlICYgU1BJX01PREVfQ1BPTCApICk7CisKKwkvKiBBc3NlcnQgY2hpcCBzZWxlY3Qgb24gc3BlY2lmaWVkIHNsYXZlICovCisJc3BpX2JpdF9zZXRfc2xhdmVfc2VsZWN0ICggc3BpYml0LCBkZXZpY2UtPnNsYXZlLCBTRUxFQ1RfU0xBVkUgKTsKKworCS8qIFRyYW5zbWl0IGNvbW1hbmQgKi8KKwlhc3NlcnQgKCBkZXZpY2UtPmNvbW1hbmRfbGVuIDw9ICggOCAqIHNpemVvZiAoIHRtcF9jb21tYW5kICkgKSApOworCXRtcF9jb21tYW5kID0gY3B1X3RvX2xlMzIgKCBjb21tYW5kICk7CisJc3BpX2JpdF90cmFuc2ZlciAoIHNwaWJpdCwgJnRtcF9jb21tYW5kLCBOVUxMLCBkZXZpY2UtPmNvbW1hbmRfbGVuLAorCQkJICAgU1BJX0JJVF9CSUdfRU5ESUFOICk7CisKKwkvKiBUcmFuc21pdCBhZGRyZXNzLCBpZiBwcmVzZW50ICovCisJaWYgKCBhZGRyZXNzID49IDAgKSB7CisJCWFzc2VydCAoIGRldmljZS0+YWRkcmVzc19sZW4gPD0gKCA4ICogc2l6ZW9mICggdG1wX2FkZHJlc3MgKSkpOworCQl0bXBfYWRkcmVzcyA9IGNwdV90b19sZTMyICggYWRkcmVzcyApOworCQlpZiAoIGRldmljZS0+YWRkcmVzc19sZW4gPT0gU1BJX0FVVE9ERVRFQ1RfQUREUkVTU19MRU4gKSB7CisJCQkvKiBBdXRvZGV0ZWN0IGFkZHJlc3MgbGVuZ3RoLiAgVGhpcyByZWxpZXMgb24KKwkJCSAqIHRoZSBkZXZpY2UgcmVzcG9uZGluZyB3aXRoIGEgZHVtbXkgemVybworCQkJICogZGF0YSBiaXQgYmVmb3JlIHRoZSBmaXJzdCByZWFsIGRhdGEgYml0LgorCQkJICovCisJCQlEQkdDICggc3BpYml0LCAiU1BJQklUICVwIGF1dG9kZXRlY3RpbmcgZGV2aWNlICIKKwkJCSAgICAgICAiYWRkcmVzcyBsZW5ndGhcbiIsIHNwaWJpdCApOworCQkJYXNzZXJ0ICggYWRkcmVzcyA9PSAwICk7CisJCQlkZXZpY2UtPmFkZHJlc3NfbGVuID0gMDsKKwkJCWRvIHsKKwkJCQlzcGlfYml0X3RyYW5zZmVyICggc3BpYml0LCAmdG1wX2FkZHJlc3MsCisJCQkJCQkgICAmdG1wX2FkZHJlc3NfZGV0ZWN0LCAxLAorCQkJCQkJICAgU1BJX0JJVF9CSUdfRU5ESUFOICk7CisJCQkJZGV2aWNlLT5hZGRyZXNzX2xlbisrOworCQkJfSB3aGlsZSAoIGxlMzJfdG9fY3B1ICggdG1wX2FkZHJlc3NfZGV0ZWN0ICkgJiAxICk7CisJCQlEQkdDICggc3BpYml0LCAiU1BJQklUICVwIGF1dG9kZXRlY3RlZCBkZXZpY2UgYWRkcmVzcyAiCisJCQkgICAgICAgImxlbmd0aCAlZFxuIiwgc3BpYml0LCBkZXZpY2UtPmFkZHJlc3NfbGVuICk7CisJCX0gZWxzZSB7CisJCQlzcGlfYml0X3RyYW5zZmVyICggc3BpYml0LCAmdG1wX2FkZHJlc3MsIE5VTEwsCisJCQkJCSAgIGRldmljZS0+YWRkcmVzc19sZW4sCisJCQkJCSAgIFNQSV9CSVRfQklHX0VORElBTiApOworCQl9CisJfQorCisJLyogVHJhbnNtaXQvcmVjZWl2ZSBkYXRhICovCisJc3BpX2JpdF90cmFuc2ZlciAoIHNwaWJpdCwgZGF0YV9vdXQsIGRhdGFfaW4sICggbGVuICogOCApLAorCQkJICAgc3BpYml0LT5lbmRpYW5uZXNzICk7CisKKwkvKiBEZWFzc2VydCBjaGlwIHNlbGVjdCBvbiBzcGVjaWZpZWQgc2xhdmUgKi8KKwlzcGlfYml0X3NldF9zbGF2ZV9zZWxlY3QgKCBzcGliaXQsIGRldmljZS0+c2xhdmUsIERFU0VMRUNUX1NMQVZFICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBJbml0aWFsaXNlIFNQSSBiaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqCisgKiBAdiBzcGliaXQJCVNQSSBiaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqLwordm9pZCBpbml0X3NwaV9iaXRfYmFzaGVyICggc3RydWN0IHNwaV9iaXRfYmFzaGVyICpzcGliaXQgKSB7CisJYXNzZXJ0ICggJnNwaWJpdC0+YmFzaGVyLm9wLT5yZWFkICE9IE5VTEwgKTsKKwlhc3NlcnQgKCAmc3BpYml0LT5iYXNoZXIub3AtPndyaXRlICE9IE5VTEwgKTsKKwlzcGliaXQtPmJ1cy5ydyA9IHNwaV9iaXRfcnc7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2Jsb2NrL2F0YS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9ibG9jay9hdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg1MWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9ibG9jay9hdGEuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL2Jsb2NrZGV2Lmg+CisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9hdGEuaD4KKworLyoqIEBmaWxlCisgKgorICogQVRBIGJsb2NrIGRldmljZQorICoKKyAqLworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBzdHJ1Y3QgYXRhX2RldmljZSAqCitibG9ja190b19hdGEgKCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiApIHsKKwlyZXR1cm4gY29udGFpbmVyX29mICggYmxvY2tkZXYsIHN0cnVjdCBhdGFfZGV2aWNlLCBibG9ja2RldiApOworfQorCisvKioKKyAqIElzc3VlIEFUQSBjb21tYW5kCisgKgorICogQHYgYXRhCQlBVEEgZGV2aWNlCisgKiBAdiBjb21tYW5kCQlBVEEgY29tbWFuZAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIGludAorYXRhX2NvbW1hbmQgKCBzdHJ1Y3QgYXRhX2RldmljZSAqYXRhLCBzdHJ1Y3QgYXRhX2NvbW1hbmQgKmNvbW1hbmQgKSB7CisJaW50IHJjOworCisJREJHICggIkFUQSBjbWQgJTAyeCBkZXYgJTAyeCBMQkElcyAlbGx4IGNvdW50ICUwNHhcbiIsCisJICAgICAgY29tbWFuZC0+Y2IuY21kX3N0YXQsIGNvbW1hbmQtPmNiLmRldmljZSwKKwkgICAgICAoIGNvbW1hbmQtPmNiLmxiYTQ4ID8gIjQ4IiA6ICIiICksCisJICAgICAgKCB1bnNpZ25lZCBsb25nIGxvbmcgKSBjb21tYW5kLT5jYi5sYmEubmF0aXZlLAorCSAgICAgIGNvbW1hbmQtPmNiLmNvdW50Lm5hdGl2ZSApOworCisJLyogRmxhZyBjb21tYW5kIGFzIGluLXByb2dyZXNzICovCisJY29tbWFuZC0+cmMgPSAtRUlOUFJPR1JFU1M7CisKKwkvKiBJc3N1ZSBBVEEgY29tbWFuZCAqLworCWlmICggKCByYyA9IGF0YS0+Y29tbWFuZCAoIGF0YSwgY29tbWFuZCApICkgIT0gMCApIHsKKwkJLyogU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgaXNzdWluZyBtZWNoYW5pc20gKi8KKwkJREJHICggIkFUQSBjb3VsZCBub3QgaXNzdWUgY29tbWFuZDogJXNcbiIsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCXdoaWxlICggY29tbWFuZC0+cmMgPT0gLUVJTlBST0dSRVNTICkKKwkJc3RlcCgpOworCWlmICggKCByYyA9IGNvbW1hbmQtPnJjICkgIT0gMCApIHsKKwkJLyogU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgY29tbWFuZCBleGVjdXRpb24gKi8KKwkJREJHICggIkFUQSBjb21tYW5kIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBibG9jayBmcm9tIEFUQSBkZXZpY2UKKyAqCisgKiBAdiBibG9ja2RldgkJQmxvY2sgZGV2aWNlCisgKiBAdiBibG9jawkJTEJBIGJsb2NrIG51bWJlcgorICogQHYgY291bnQJCUJsb2NrIGNvdW50CisgKiBAdiBidWZmZXIJCURhdGEgYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhdGFfcmVhZCAoIHN0cnVjdCBibG9ja19kZXZpY2UgKmJsb2NrZGV2LCB1aW50NjRfdCBibG9jaywKKwkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdXNlcnB0cl90IGJ1ZmZlciApIHsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqYXRhID0gYmxvY2tfdG9fYXRhICggYmxvY2tkZXYgKTsKKwlzdHJ1Y3QgYXRhX2NvbW1hbmQgY29tbWFuZDsKKworCW1lbXNldCAoICZjb21tYW5kLCAwLCBzaXplb2YgKCBjb21tYW5kICkgKTsKKwljb21tYW5kLmNiLmxiYS5uYXRpdmUgPSBibG9jazsKKwljb21tYW5kLmNiLmNvdW50Lm5hdGl2ZSA9IGNvdW50OworCWNvbW1hbmQuY2IuZGV2aWNlID0gKCBhdGEtPmRldmljZSB8IEFUQV9ERVZfT0JTT0xFVEUgfCBBVEFfREVWX0xCQSApOworCWNvbW1hbmQuY2IubGJhNDggPSBhdGEtPmxiYTQ4OworCWlmICggISBhdGEtPmxiYTQ4ICkKKwkJY29tbWFuZC5jYi5kZXZpY2UgfD0gY29tbWFuZC5jYi5sYmEuYnl0ZXMubG93X3ByZXY7CisJY29tbWFuZC5jYi5jbWRfc3RhdCA9ICggYXRhLT5sYmE0OCA/IEFUQV9DTURfUkVBRF9FWFQgOiBBVEFfQ01EX1JFQUQgKTsKKwljb21tYW5kLmRhdGFfaW4gPSBidWZmZXI7CisJcmV0dXJuIGF0YV9jb21tYW5kICggYXRhLCAmY29tbWFuZCApOworfQorCisvKioKKyAqIFdyaXRlIGJsb2NrIHRvIEFUQSBkZXZpY2UKKyAqCisgKiBAdiBibG9ja2RldgkJQmxvY2sgZGV2aWNlCisgKiBAdiBibG9jawkJTEJBIGJsb2NrIG51bWJlcgorICogQHYgY291bnQJCUJsb2NrIGNvdW50CisgKiBAdiBidWZmZXIJCURhdGEgYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhdGFfd3JpdGUgKCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiwgdWludDY0X3QgYmxvY2ssCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB1c2VycHRyX3QgYnVmZmVyICkgeworCXN0cnVjdCBhdGFfZGV2aWNlICphdGEgPSBibG9ja190b19hdGEgKCBibG9ja2RldiApOworCXN0cnVjdCBhdGFfY29tbWFuZCBjb21tYW5kOworCQorCW1lbXNldCAoICZjb21tYW5kLCAwLCBzaXplb2YgKCBjb21tYW5kICkgKTsKKwljb21tYW5kLmNiLmxiYS5uYXRpdmUgPSBibG9jazsKKwljb21tYW5kLmNiLmNvdW50Lm5hdGl2ZSA9IGNvdW50OworCWNvbW1hbmQuY2IuZGV2aWNlID0gKCBhdGEtPmRldmljZSB8IEFUQV9ERVZfT0JTT0xFVEUgfCBBVEFfREVWX0xCQSApOworCWNvbW1hbmQuY2IubGJhNDggPSBhdGEtPmxiYTQ4OworCWlmICggISBhdGEtPmxiYTQ4ICkKKwkJY29tbWFuZC5jYi5kZXZpY2UgfD0gY29tbWFuZC5jYi5sYmEuYnl0ZXMubG93X3ByZXY7CisJY29tbWFuZC5jYi5jbWRfc3RhdCA9ICggYXRhLT5sYmE0OCA/CisJCQkJQVRBX0NNRF9XUklURV9FWFQgOiBBVEFfQ01EX1dSSVRFICk7CisJY29tbWFuZC5kYXRhX291dCA9IGJ1ZmZlcjsKKwlyZXR1cm4gYXRhX2NvbW1hbmQgKCBhdGEsICZjb21tYW5kICk7Cit9CisKKy8qKgorICogSWRlbnRpZnkgQVRBIGRldmljZQorICoKKyAqIEB2IGJsb2NrZGV2CQlCbG9jayBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGF0YV9pZGVudGlmeSAoIHN0cnVjdCBibG9ja19kZXZpY2UgKmJsb2NrZGV2ICkgeworCXN0cnVjdCBhdGFfZGV2aWNlICphdGEgPSBibG9ja190b19hdGEgKCBibG9ja2RldiApOworCXN0cnVjdCBhdGFfY29tbWFuZCBjb21tYW5kOworCXN0cnVjdCBhdGFfaWRlbnRpdHkgaWRlbnRpdHk7CisJaW50IHJjOworCisJLyogSXNzdWUgSURFTlRJRlkgKi8KKwltZW1zZXQgKCAmY29tbWFuZCwgMCwgc2l6ZW9mICggY29tbWFuZCApICk7CisJY29tbWFuZC5jYi5jb3VudC5uYXRpdmUgPSAxOworCWNvbW1hbmQuY2IuZGV2aWNlID0gKCBhdGEtPmRldmljZSB8IEFUQV9ERVZfT0JTT0xFVEUgfCBBVEFfREVWX0xCQSApOworCWNvbW1hbmQuY2IuY21kX3N0YXQgPSBBVEFfQ01EX0lERU5USUZZOworCWNvbW1hbmQuZGF0YV9pbiA9IHZpcnRfdG9fdXNlciAoICZpZGVudGl0eSApOworCWxpbmtlcl9hc3NlcnQgKCBzaXplb2YgKCBpZGVudGl0eSApID09IEFUQV9TRUNUT1JfU0laRSwKKwkJCV9fYXRhX2lkZW50aXR5X2JhZF9zaXplX18gKTsKKwlpZiAoICggcmMgPSBhdGFfY29tbWFuZCAoIGF0YSwgJmNvbW1hbmQgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBGaWxsIGluIGJsb2NrIGRldmljZSBwYXJhbWV0ZXJzICovCisJYmxvY2tkZXYtPmJsa3NpemUgPSBBVEFfU0VDVE9SX1NJWkU7CisJaWYgKCBpZGVudGl0eS5zdXBwb3J0c19sYmE0OCAmIGNwdV90b19sZTE2ICggQVRBX1NVUFBPUlRTX0xCQTQ4ICkgKSB7CisJCWF0YS0+bGJhNDggPSAxOworCQlibG9ja2Rldi0+YmxvY2tzID0gbGU2NF90b19jcHUgKCBpZGVudGl0eS5sYmE0OF9zZWN0b3JzICk7CisJfSBlbHNlIHsKKwkJYmxvY2tkZXYtPmJsb2NrcyA9IGxlMzJfdG9fY3B1ICggaWRlbnRpdHkubGJhX3NlY3RvcnMgKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgYXRhX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJPSBhdGFfcmVhZCwKKwkud3JpdGUJPSBhdGFfd3JpdGUKK307CisKKy8qKgorICogSW5pdGlhbGlzZSBBVEEgZGV2aWNlCisgKgorICogQHYgYXRhCQlBVEEgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBJbml0aWFsaXNlcyBhbiBBVEEgZGV2aWNlLiAgVGhlIGF0YV9kZXZpY2U6OmNvbW1hbmQgZmllbGQgYW5kIHRoZQorICogQGMgQVRBX0ZMX1NMQVZFIHBvcnRpb24gb2YgdGhlIGF0YV9kZXZpY2U6OmZsYWdzIGZpZWxkIG11c3QgYWxyZWFkeQorICogYmUgZmlsbGVkIGluLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSBhdGFfZGV2aWNlOjpibG9ja2RldiwKKyAqIGluY2x1ZGluZyBpc3N1aW5nIGFuIElERU5USUZZIERFVklDRSBjYWxsIHRvIGRldGVybWluZSB0aGUgYmxvY2sKKyAqIHNpemUgYW5kIHRvdGFsIGRldmljZSBzaXplLgorICovCitpbnQgaW5pdF9hdGFkZXYgKCBzdHJ1Y3QgYXRhX2RldmljZSAqYXRhICkgeworCS8qKiBGaWxsIGluIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMsIGFuZCBnZXQgZGV2aWNlIGNhcGFjaXR5ICovCisJYXRhLT5ibG9ja2Rldi5vcCA9ICZhdGFfb3BlcmF0aW9uczsKKwlyZXR1cm4gYXRhX2lkZW50aWZ5ICggJmF0YS0+YmxvY2tkZXYgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvYmxvY2svcmFtZGlzay5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9ibG9jay9yYW1kaXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2ZjFiYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvYmxvY2svcmFtZGlzay5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL2Jsb2NrZGV2Lmg+CisjaW5jbHVkZSA8Z3B4ZS9yYW1kaXNrLmg+CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBSQU0gZGlza3MKKyAqCisgKi8KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgc3RydWN0IHJhbWRpc2sgKgorYmxvY2tfdG9fcmFtZGlzayAoIHN0cnVjdCBibG9ja19kZXZpY2UgKmJsb2NrZGV2ICkgeworCXJldHVybiBjb250YWluZXJfb2YgKCBibG9ja2Rldiwgc3RydWN0IHJhbWRpc2ssIGJsb2NrZGV2ICk7Cit9CisKKy8qKgorICogUmVhZCBibG9jaworICoKKyAqIEB2IGJsb2NrZGV2CQlCbG9jayBkZXZpY2UKKyAqIEB2IGJsb2NrCQlCbG9jayBudW1iZXIKKyAqIEB2IGNvdW50CQlCbG9jayBjb3VudAorICogQHYgYnVmZmVyCQlEYXRhIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcmFtZGlza19yZWFkICggc3RydWN0IGJsb2NrX2RldmljZSAqYmxvY2tkZXYsIHVpbnQ2NF90IGJsb2NrLAorCQkJICB1bnNpZ25lZCBsb25nIGNvdW50LCB1c2VycHRyX3QgYnVmZmVyICkgeworCXN0cnVjdCByYW1kaXNrICpyYW1kaXNrID0gYmxvY2tfdG9fcmFtZGlzayAoIGJsb2NrZGV2ICk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAoIGJsb2NrICogYmxvY2tkZXYtPmJsa3NpemUgKTsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aCA9ICggY291bnQgKiBibG9ja2Rldi0+Ymxrc2l6ZSApOworCisJREJHQyAoIHJhbWRpc2ssICJSQU1ESVNLICVwIHJlYWRpbmcgWyVseCwlbHgpXG4iLAorCSAgICAgICByYW1kaXNrLCBvZmZzZXQsIGxlbmd0aCApOworCisJbWVtY3B5X3VzZXIgKCBidWZmZXIsIDAsIHJhbWRpc2stPmRhdGEsIG9mZnNldCwgbGVuZ3RoICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogV3JpdGUgYmxvY2sKKyAqCisgKiBAdiBibG9ja2RldgkJQmxvY2sgZGV2aWNlCisgKiBAdiBibG9jawkJQmxvY2sgbnVtYmVyCisgKiBAdiBjb3VudAkJQmxvY2sgY291bnQKKyAqIEB2IGJ1ZmZlcgkJRGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHJhbWRpc2tfd3JpdGUgKCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiwgdWludDY0X3QgYmxvY2ssCisJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50LCB1c2VycHRyX3QgYnVmZmVyICkgeworCXN0cnVjdCByYW1kaXNrICpyYW1kaXNrID0gYmxvY2tfdG9fcmFtZGlzayAoIGJsb2NrZGV2ICk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAoIGJsb2NrICogYmxvY2tkZXYtPmJsa3NpemUgKTsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aCA9ICggY291bnQgKiBibG9ja2Rldi0+Ymxrc2l6ZSApOworCisJREJHQyAoIHJhbWRpc2ssICJSQU1ESVNLICVwIHdyaXRpbmcgWyVseCwlbHgpXG4iLAorCSAgICAgICByYW1kaXNrLCBvZmZzZXQsIGxlbmd0aCApOworCisJbWVtY3B5X3VzZXIgKCByYW1kaXNrLT5kYXRhLCBvZmZzZXQsIGJ1ZmZlciwgMCwgbGVuZ3RoICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgcmFtZGlza19vcGVyYXRpb25zID0geworCS5yZWFkCT0gcmFtZGlza19yZWFkLAorCS53cml0ZQk9IHJhbWRpc2tfd3JpdGUKK307CisKK2ludCBpbml0X3JhbWRpc2sgKCBzdHJ1Y3QgcmFtZGlzayAqcmFtZGlzaywgdXNlcnB0cl90IGRhdGEsIHNpemVfdCBsZW4sCisJCSAgIHVuc2lnbmVkIGludCBibGtzaXplICkgeworCQorCWlmICggISBibGtzaXplICkKKwkJYmxrc2l6ZSA9IDUxMjsKKworCXJhbWRpc2stPmRhdGEgPSBkYXRhOworCXJhbWRpc2stPmJsb2NrZGV2Lm9wID0gJnJhbWRpc2tfb3BlcmF0aW9uczsKKwlyYW1kaXNrLT5ibG9ja2Rldi5ibGtzaXplID0gYmxrc2l6ZTsKKwlyYW1kaXNrLT5ibG9ja2Rldi5ibG9ja3MgPSAoIGxlbiAvIGJsa3NpemUgKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9ibG9jay9zY3NpLmMgYi9ncHhlL3NyYy9kcml2ZXJzL2Jsb2NrL3Njc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTFiM2FmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9ibG9jay9zY3NpLmMKQEAgLTAsMCArMSwzNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9ibG9ja2Rldi5oPgorI2luY2x1ZGUgPGdweGUvcHJvY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvc2NzaS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBTQ1NJIGJsb2NrIGRldmljZQorICoKKyAqLworCisvKiogTWF4aW11bSBudW1iZXIgb2YgZHVtbXkgInJlYWQgY2FwYWNpdHkgKDEwKSIgb3BlcmF0aW9ucworICoKKyAqIFRoZXNlIGFyZSBpc3N1ZWQgYXQgY29ubmVjdGlvbiBzZXR1cCB0byBkcmF3IG91dCB2YXJpb3VzIHVzZWxlc3MKKyAqIHBvd2VyLW9uIG1lc3NhZ2VzLgorICovCisjZGVmaW5lIFNDU0lfTUFYX0RVTU1ZX1JFQURfQ0FQIDEwCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHN0cnVjdCBzY3NpX2RldmljZSAqCitibG9ja190b19zY3NpICggc3RydWN0IGJsb2NrX2RldmljZSAqYmxvY2tkZXYgKSB7CisJcmV0dXJuIGNvbnRhaW5lcl9vZiAoIGJsb2NrZGV2LCBzdHJ1Y3Qgc2NzaV9kZXZpY2UsIGJsb2NrZGV2ICk7Cit9CisKKy8qKgorICogSGFuZGxlIFNDU0kgY29tbWFuZCB3aXRoIG5vIGJhY2tpbmcgZGV2aWNlCisgKgorICogQHYgc2NzaQkJU0NTSSBkZXZpY2UKKyAqIEB2IGNvbW1hbmQJCVNDU0kgY29tbWFuZAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBzY3NpX2RldGFjaGVkX2NvbW1hbmQgKCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2kgX191bnVzZWQsCisJCQkgICAgc3RydWN0IHNjc2lfY29tbWFuZCAqY29tbWFuZCBfX3VudXNlZCApIHsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqCisgKiBJc3N1ZSBTQ1NJIGNvbW1hbmQKKyAqCisgKiBAdiBzY3NpCQlTQ1NJIGRldmljZQorICogQHYgY29tbWFuZAkJU0NTSSBjb21tYW5kCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBzY3NpX2NvbW1hbmQgKCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2ksCisJCQkgIHN0cnVjdCBzY3NpX2NvbW1hbmQgKmNvbW1hbmQgKSB7CisJaW50IHJjOworCisJREJHQzIgKCBzY3NpLCAiU0NTSSAlcCAiIFNDU0lfQ0RCX0ZPUk1BVCAiXG4iLAorCQlzY3NpLCBTQ1NJX0NEQl9EQVRBICggY29tbWFuZC0+Y2RiICkgKTsKKworCS8qIENsZWFyIHNlbnNlIHJlc3BvbnNlIGNvZGUgYmVmb3JlIGlzc3VpbmcgY29tbWFuZCAqLworCWNvbW1hbmQtPnNlbnNlX3Jlc3BvbnNlID0gMDsKKworCS8qIEZsYWcgY29tbWFuZCBhcyBpbi1wcm9ncmVzcyAqLworCWNvbW1hbmQtPnJjID0gLUVJTlBST0dSRVNTOworCisJLyogSXNzdWUgU0NTSSBjb21tYW5kICovCisJaWYgKCAoIHJjID0gc2NzaS0+Y29tbWFuZCAoIHNjc2ksIGNvbW1hbmQgKSApICE9IDAgKSB7CisJCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIGlzc3VpbmcgbWVjaGFuaXNtICovCisJCURCR0MgKCBzY3NpLCAiU0NTSSAlcCAiIFNDU0lfQ0RCX0ZPUk1BVCAiIGVyciAlc1xuIiwKKwkJICAgICAgIHNjc2ksIFNDU0lfQ0RCX0RBVEEgKCBjb21tYW5kLT5jZGIgKSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKCBjb21tYW5kLT5yYyA9PSAtRUlOUFJPR1JFU1MgKQorCQlzdGVwKCk7CisJaWYgKCAoIHJjID0gY29tbWFuZC0+cmMgKSAhPSAwICkgeworCQkvKiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiAqLworCQlEQkdDICggc2NzaSwgIlNDU0kgJXAgIiBTQ1NJX0NEQl9GT1JNQVQgIiBlcnIgJXNcbiIsCisJCSAgICAgICBzY3NpLCBTQ1NJX0NEQl9EQVRBICggY29tbWFuZC0+Y2RiICksIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogQ2hlY2sgZm9yIFNDU0kgZXJyb3JzICovCisJaWYgKCBjb21tYW5kLT5zdGF0dXMgIT0gMCApIHsKKwkJREJHQyAoIHNjc2ksICJTQ1NJICVwICIgU0NTSV9DREJfRk9STUFUICIgc3RhdHVzICUwMnggc2Vuc2UgIgorCQkgICAgICAgIiUwMnhcbiIsIHNjc2ksIFNDU0lfQ0RCX0RBVEEgKCBjb21tYW5kLT5jZGIgKSwKKwkJICAgICAgIGNvbW1hbmQtPnN0YXR1cywgY29tbWFuZC0+c2Vuc2VfcmVzcG9uc2UgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBibG9jayBmcm9tIFNDU0kgZGV2aWNlIHVzaW5nIFJFQUQgKDEwKQorICoKKyAqIEB2IGJsb2NrZGV2CQlCbG9jayBkZXZpY2UKKyAqIEB2IGJsb2NrCQlMQkEgYmxvY2sgbnVtYmVyCisgKiBAdiBjb3VudAkJQmxvY2sgY291bnQKKyAqIEB2IGJ1ZmZlcgkJRGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNjc2lfcmVhZF8xMCAoIHN0cnVjdCBibG9ja19kZXZpY2UgKmJsb2NrZGV2LCB1aW50NjRfdCBibG9jaywKKwkJCSAgdW5zaWduZWQgbG9uZyBjb3VudCwgdXNlcnB0cl90IGJ1ZmZlciApIHsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2kgPSBibG9ja190b19zY3NpICggYmxvY2tkZXYgKTsKKwlzdHJ1Y3Qgc2NzaV9jb21tYW5kIGNvbW1hbmQ7CisJc3RydWN0IHNjc2lfY2RiX3JlYWRfMTAgKmNkYiA9ICZjb21tYW5kLmNkYi5yZWFkMTA7CisKKwkvKiBJc3N1ZSBSRUFEICgxMCkgKi8KKwltZW1zZXQgKCAmY29tbWFuZCwgMCwgc2l6ZW9mICggY29tbWFuZCApICk7CisJY2RiLT5vcGNvZGUgPSBTQ1NJX09QQ09ERV9SRUFEXzEwOworCWNkYi0+bGJhID0gY3B1X3RvX2JlMzIgKCBibG9jayApOworCWNkYi0+bGVuID0gY3B1X3RvX2JlMTYgKCBjb3VudCApOworCWNvbW1hbmQuZGF0YV9pbiA9IGJ1ZmZlcjsKKwljb21tYW5kLmRhdGFfaW5fbGVuID0gKCBjb3VudCAqIGJsb2NrZGV2LT5ibGtzaXplICk7CisJcmV0dXJuIHNjc2lfY29tbWFuZCAoIHNjc2ksICZjb21tYW5kICk7Cit9CisKKy8qKgorICogUmVhZCBibG9jayBmcm9tIFNDU0kgZGV2aWNlIHVzaW5nIFJFQUQgKDE2KQorICoKKyAqIEB2IGJsb2NrZGV2CQlCbG9jayBkZXZpY2UKKyAqIEB2IGJsb2NrCQlMQkEgYmxvY2sgbnVtYmVyCisgKiBAdiBjb3VudAkJQmxvY2sgY291bnQKKyAqIEB2IGJ1ZmZlcgkJRGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNjc2lfcmVhZF8xNiAoIHN0cnVjdCBibG9ja19kZXZpY2UgKmJsb2NrZGV2LCB1aW50NjRfdCBibG9jaywKKwkJCSAgdW5zaWduZWQgbG9uZyBjb3VudCwgdXNlcnB0cl90IGJ1ZmZlciApIHsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2kgPSBibG9ja190b19zY3NpICggYmxvY2tkZXYgKTsKKwlzdHJ1Y3Qgc2NzaV9jb21tYW5kIGNvbW1hbmQ7CisJc3RydWN0IHNjc2lfY2RiX3JlYWRfMTYgKmNkYiA9ICZjb21tYW5kLmNkYi5yZWFkMTY7CisKKwkvKiBJc3N1ZSBSRUFEICgxNikgKi8KKwltZW1zZXQgKCAmY29tbWFuZCwgMCwgc2l6ZW9mICggY29tbWFuZCApICk7CisJY2RiLT5vcGNvZGUgPSBTQ1NJX09QQ09ERV9SRUFEXzE2OworCWNkYi0+bGJhID0gY3B1X3RvX2JlNjQgKCBibG9jayApOworCWNkYi0+bGVuID0gY3B1X3RvX2JlMzIgKCBjb3VudCApOworCWNvbW1hbmQuZGF0YV9pbiA9IGJ1ZmZlcjsKKwljb21tYW5kLmRhdGFfaW5fbGVuID0gKCBjb3VudCAqIGJsb2NrZGV2LT5ibGtzaXplICk7CisJcmV0dXJuIHNjc2lfY29tbWFuZCAoIHNjc2ksICZjb21tYW5kICk7Cit9CisKKy8qKgorICogV3JpdGUgYmxvY2sgdG8gU0NTSSBkZXZpY2UgdXNpbmcgV1JJVEUgKDEwKQorICoKKyAqIEB2IGJsb2NrZGV2CQlCbG9jayBkZXZpY2UKKyAqIEB2IGJsb2NrCQlMQkEgYmxvY2sgbnVtYmVyCisgKiBAdiBjb3VudAkJQmxvY2sgY291bnQKKyAqIEB2IGJ1ZmZlcgkJRGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNjc2lfd3JpdGVfMTAgKCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiwgdWludDY0X3QgYmxvY2ssCisJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50LCB1c2VycHRyX3QgYnVmZmVyICkgeworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSA9IGJsb2NrX3RvX3Njc2kgKCBibG9ja2RldiApOworCXN0cnVjdCBzY3NpX2NvbW1hbmQgY29tbWFuZDsKKwlzdHJ1Y3Qgc2NzaV9jZGJfd3JpdGVfMTAgKmNkYiA9ICZjb21tYW5kLmNkYi53cml0ZTEwOworCisJLyogSXNzdWUgV1JJVEUgKDEwKSAqLworCW1lbXNldCAoICZjb21tYW5kLCAwLCBzaXplb2YgKCBjb21tYW5kICkgKTsKKwljZGItPm9wY29kZSA9IFNDU0lfT1BDT0RFX1dSSVRFXzEwOworCWNkYi0+bGJhID0gY3B1X3RvX2JlMzIgKCBibG9jayApOworCWNkYi0+bGVuID0gY3B1X3RvX2JlMTYgKCBjb3VudCApOworCWNvbW1hbmQuZGF0YV9vdXQgPSBidWZmZXI7CisJY29tbWFuZC5kYXRhX291dF9sZW4gPSAoIGNvdW50ICogYmxvY2tkZXYtPmJsa3NpemUgKTsKKwlyZXR1cm4gc2NzaV9jb21tYW5kICggc2NzaSwgJmNvbW1hbmQgKTsKK30KKworLyoqCisgKiBXcml0ZSBibG9jayB0byBTQ1NJIGRldmljZSB1c2luZyBXUklURSAoMTYpCisgKgorICogQHYgYmxvY2tkZXYJCUJsb2NrIGRldmljZQorICogQHYgYmxvY2sJCUxCQSBibG9jayBudW1iZXIKKyAqIEB2IGNvdW50CQlCbG9jayBjb3VudAorICogQHYgYnVmZmVyCQlEYXRhIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc2NzaV93cml0ZV8xNiAoIHN0cnVjdCBibG9ja19kZXZpY2UgKmJsb2NrZGV2LCB1aW50NjRfdCBibG9jaywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHVzZXJwdHJfdCBidWZmZXIgKSB7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpID0gYmxvY2tfdG9fc2NzaSAoIGJsb2NrZGV2ICk7CisJc3RydWN0IHNjc2lfY29tbWFuZCBjb21tYW5kOworCXN0cnVjdCBzY3NpX2NkYl93cml0ZV8xNiAqY2RiID0gJmNvbW1hbmQuY2RiLndyaXRlMTY7CisKKwkvKiBJc3N1ZSBXUklURSAoMTYpICovCisJbWVtc2V0ICggJmNvbW1hbmQsIDAsIHNpemVvZiAoIGNvbW1hbmQgKSApOworCWNkYi0+b3Bjb2RlID0gU0NTSV9PUENPREVfV1JJVEVfMTY7CisJY2RiLT5sYmEgPSBjcHVfdG9fYmU2NCAoIGJsb2NrICk7CisJY2RiLT5sZW4gPSBjcHVfdG9fYmUzMiAoIGNvdW50ICk7CisJY29tbWFuZC5kYXRhX291dCA9IGJ1ZmZlcjsKKwljb21tYW5kLmRhdGFfb3V0X2xlbiA9ICggY291bnQgKiBibG9ja2Rldi0+Ymxrc2l6ZSApOworCXJldHVybiBzY3NpX2NvbW1hbmQgKCBzY3NpLCAmY29tbWFuZCApOworfQorCisvKioKKyAqIFJlYWQgY2FwYWNpdHkgb2YgU0NTSSBkZXZpY2UgdmlhIFJFQUQgQ0FQQUNJVFkgKDEwKQorICoKKyAqIEB2IGJsb2NrZGV2CQlCbG9jayBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNjc2lfcmVhZF9jYXBhY2l0eV8xMCAoIHN0cnVjdCBibG9ja19kZXZpY2UgKmJsb2NrZGV2ICkgeworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSA9IGJsb2NrX3RvX3Njc2kgKCBibG9ja2RldiApOworCXN0cnVjdCBzY3NpX2NvbW1hbmQgY29tbWFuZDsKKwlzdHJ1Y3Qgc2NzaV9jZGJfcmVhZF9jYXBhY2l0eV8xMCAqY2RiID0gJmNvbW1hbmQuY2RiLnJlYWRjYXAxMDsKKwlzdHJ1Y3Qgc2NzaV9jYXBhY2l0eV8xMCBjYXBhY2l0eTsKKwlpbnQgcmM7CisKKwkvKiBJc3N1ZSBSRUFEIENBUEFDSVRZICgxMCkgKi8KKwltZW1zZXQgKCAmY29tbWFuZCwgMCwgc2l6ZW9mICggY29tbWFuZCApICk7CisJY2RiLT5vcGNvZGUgPSBTQ1NJX09QQ09ERV9SRUFEX0NBUEFDSVRZXzEwOworCWNvbW1hbmQuZGF0YV9pbiA9IHZpcnRfdG9fdXNlciAoICZjYXBhY2l0eSApOworCWNvbW1hbmQuZGF0YV9pbl9sZW4gPSBzaXplb2YgKCBjYXBhY2l0eSApOworCisJaWYgKCAoIHJjID0gc2NzaV9jb21tYW5kICggc2NzaSwgJmNvbW1hbmQgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBGaWxsIGluIGJsb2NrIGRldmljZSBmaWVsZHMgKi8KKwlibG9ja2Rldi0+Ymxrc2l6ZSA9IGJlMzJfdG9fY3B1ICggY2FwYWNpdHkuYmxrc2l6ZSApOworCWJsb2NrZGV2LT5ibG9ja3MgPSAoIGJlMzJfdG9fY3B1ICggY2FwYWNpdHkubGJhICkgKyAxICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkIGNhcGFjaXR5IG9mIFNDU0kgZGV2aWNlIHZpYSBSRUFEIENBUEFDSVRZICgxNikKKyAqCisgKiBAdiBibG9ja2RldgkJQmxvY2sgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBzY3NpX3JlYWRfY2FwYWNpdHlfMTYgKCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiApIHsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2kgPSBibG9ja190b19zY3NpICggYmxvY2tkZXYgKTsKKwlzdHJ1Y3Qgc2NzaV9jb21tYW5kIGNvbW1hbmQ7CisJc3RydWN0IHNjc2lfY2RiX3JlYWRfY2FwYWNpdHlfMTYgKmNkYiA9ICZjb21tYW5kLmNkYi5yZWFkY2FwMTY7CisJc3RydWN0IHNjc2lfY2FwYWNpdHlfMTYgY2FwYWNpdHk7CisJaW50IHJjOworCisJLyogSXNzdWUgUkVBRCBDQVBBQ0lUWSAoMTYpICovCisJbWVtc2V0ICggJmNvbW1hbmQsIDAsIHNpemVvZiAoIGNvbW1hbmQgKSApOworCWNkYi0+b3Bjb2RlID0gU0NTSV9PUENPREVfU0VSVklDRV9BQ1RJT05fSU47CisJY2RiLT5zZXJ2aWNlX2FjdGlvbiA9IFNDU0lfU0VSVklDRV9BQ1RJT05fUkVBRF9DQVBBQ0lUWV8xNjsKKwljZGItPmxlbiA9IGNwdV90b19iZTMyICggc2l6ZW9mICggY2FwYWNpdHkgKSApOworCWNvbW1hbmQuZGF0YV9pbiA9IHZpcnRfdG9fdXNlciAoICZjYXBhY2l0eSApOworCWNvbW1hbmQuZGF0YV9pbl9sZW4gPSBzaXplb2YgKCBjYXBhY2l0eSApOworCisJaWYgKCAoIHJjID0gc2NzaV9jb21tYW5kICggc2NzaSwgJmNvbW1hbmQgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBGaWxsIGluIGJsb2NrIGRldmljZSBmaWVsZHMgKi8KKwlibG9ja2Rldi0+Ymxrc2l6ZSA9IGJlMzJfdG9fY3B1ICggY2FwYWNpdHkuYmxrc2l6ZSApOworCWJsb2NrZGV2LT5ibG9ja3MgPSAoIGJlNjRfdG9fY3B1ICggY2FwYWNpdHkubGJhICkgKyAxICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgc2NzaV9vcGVyYXRpb25zXzE2ID0geworCS5yZWFkCT0gc2NzaV9yZWFkXzE2LAorCS53cml0ZQk9IHNjc2lfd3JpdGVfMTYsCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHNjc2lfb3BlcmF0aW9uc18xMCA9IHsKKwkucmVhZAk9IHNjc2lfcmVhZF8xMCwKKwkud3JpdGUJPSBzY3NpX3dyaXRlXzEwLAorfTsKKworLyoqCisgKiBJbml0aWFsaXNlIFNDU0kgZGV2aWNlCisgKgorICogQHYgc2NzaQkJU0NTSSBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIEluaXRpYWxpc2VzIGEgU0NTSSBkZXZpY2UuICBUaGUgc2NzaV9kZXZpY2U6OmNvbW1hbmQgYW5kCisgKiBzY3NpX2RldmljZTo6bHVuIGZpZWxkcyBtdXN0IGFscmVhZHkgYmUgZmlsbGVkIGluLiAgVGhpcyBmdW5jdGlvbgorICogd2lsbCBjb25maWd1cmUgc2NzaV9kZXZpY2U6OmJsb2NrZGV2LCBpbmNsdWRpbmcgaXNzdWluZyBhIFJFQUQKKyAqIENBUEFDSVRZIGNhbGwgdG8gZGV0ZXJtaW5lIHRoZSBibG9jayBzaXplIGFuZCB0b3RhbCBkZXZpY2Ugc2l6ZS4KKyAqLworaW50IGluaXRfc2NzaWRldiAoIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSApIHsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmM7CisKKwkvKiBJc3N1ZSBzb21lIHRoZW9yZXRpY2FsbHkgZXh0cmFuZW91cyBSRUFEIENBUEFDSVRZICgxMCkKKwkgKiBjb21tYW5kcywgc29sZWx5IGluIG9yZGVyIHRvIGRyYXcgb3V0IHRoZSAiQ0hFQ0sgQ09ORElUSU9OCisJICogKHBvd2VyLW9uIG9jY3VycmVkKSIsICJDSEVDSyBDT05ESVRJT04gKHJlcG9ydGVkIExVTnMgZGF0YQorCSAqIGhhcyBjaGFuZ2VkKSIgZXRjLiB0aGF0IHNvbWUgZHVtYiB0YXJnZXRzIGluc2lzdCBvbiBzZW5kaW5nCisJICogYXMgYW4gZXJyb3IgYXQgc3RhcnQgb2YgZGF5LiAgVGhlIHByZWNpc2UgY29tbWFuZCB0aGF0IHdlCisJICogdXNlIGlzIHVuaW1wb3J0YW50OyB3ZSBqdXN0IG5lZWQgdG8gcHJvdmlkZSB0aGUgdGFyZ2V0IHdpdGgKKwkgKiBhbiBvcHBvcnR1bml0eSB0byBzZW5kIGl0cyByZXNwb25zZXMuCisJICovCisJZm9yICggaSA9IDAgOyBpIDwgU0NTSV9NQVhfRFVNTVlfUkVBRF9DQVAgOyBpKysgKSB7CisJCWlmICggKCByYyA9IHNjc2lfcmVhZF9jYXBhY2l0eV8xMCAoICZzY3NpLT5ibG9ja2RldiApICkgPT0gMCApCisJCQlicmVhazsKKwkJREJHQyAoIHNjc2ksICJTQ1NJICVwIGlnbm9yaW5nIHN0YXJ0LW9mLWRheSBlcnJvciAoIyVkKVxuIiwKKwkJICAgICAgIHNjc2ksICggaSArIDEgKSApOworCX0KKworCS8qIFRyeSBSRUFEIENBUEFDSVRZICgxMCksIHdoaWNoIGlzIGEgbWFuZGF0b3J5IGNvbW1hbmQsIGZpcnN0LiAqLworCXNjc2ktPmJsb2NrZGV2Lm9wID0gJnNjc2lfb3BlcmF0aW9uc18xMDsKKwlpZiAoICggcmMgPSBzY3NpX3JlYWRfY2FwYWNpdHlfMTAgKCAmc2NzaS0+YmxvY2tkZXYgKSApICE9IDAgKSB7CisJCURCR0MgKCBzY3NpLCAiU0NTSSAlcCBjb3VsZCBub3QgUkVBRCBDQVBBQ0lUWSAoMTApOiAlc1xuIiwKKwkJICAgICAgIHNjc2ksIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogSWYgY2FwYWNpdHkgcmFuZ2Ugd2FzIGV4Y2VlZGVkIChpLmUuIGNhcGFjaXR5LmxiYSB3YXMKKwkgKiAweGZmZmZmZmZmLCBtZWFuaW5nIHRoYXQgYmxvY2tkZXYtPmJsb2NrcyBpcyBub3cgemVybyksIHVzZQorCSAqIFJFQUQgQ0FQQUNJVFkgKDE2KSBpbnN0ZWFkLiAgUkVBRCBDQVBBQ0lUWSAoMTYpIGlzIG5vdAorCSAqIG1hbmRhdG9yeSwgc28gd2UgY2FuJ3QganVzdCB1c2UgaXQgc3RyYWlnaHQgb2ZmLgorCSAqLworCWlmICggc2NzaS0+YmxvY2tkZXYuYmxvY2tzID09IDAgKSB7CisJCXNjc2ktPmJsb2NrZGV2Lm9wID0gJnNjc2lfb3BlcmF0aW9uc18xNjsKKwkJaWYgKCAoIHJjID0gc2NzaV9yZWFkX2NhcGFjaXR5XzE2ICggJnNjc2ktPmJsb2NrZGV2ICkgKSAhPSAwICl7CisJCQlEQkdDICggc2NzaSwgIlNDU0kgJXAgY291bGQgbm90IFJFQUQgQ0FQQUNJVFkgKDE2KTogIgorCQkJICAgICAgICIlc1xuIiwgc2NzaSwgc3RyZXJyb3IgKCByYyApICk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlEQkdDICggc2NzaSwgIlNDU0kgJXAgdXNpbmcgUkVBRC9XUklURSAoJWQpIGNvbW1hbmRzXG4iLCBzY3NpLAorCSAgICAgICAoICggc2NzaS0+YmxvY2tkZXYub3AgPT0gJnNjc2lfb3BlcmF0aW9uc18xMCApID8gMTAgOiAxNiApICk7CisJREJHQyAoIHNjc2ksICJTQ1NJICVwIGNhcGFjaXR5IGlzICVsZCBNQiAoJSNsbHggYmxvY2tzKVxuIiwgc2NzaSwKKwkgICAgICAgKCAoIHVuc2lnbmVkIGxvbmcgKSAoIHNjc2ktPmJsb2NrZGV2LmJsb2NrcyA+PiAxMSApICksCisJICAgICAgIHNjc2ktPmJsb2NrZGV2LmJsb2NrcyApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgU0NTSSBMVU4KKyAqCisgKiBAdiBsdW5fc3RyaW5nCUxVTiBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAqIEB2IGx1bgkJTFVOIHRvIGZpbGwgaW4KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgc2NzaV9wYXJzZV9sdW4gKCBjb25zdCBjaGFyICpsdW5fc3RyaW5nLCBzdHJ1Y3Qgc2NzaV9sdW4gKmx1biApIHsKKwljaGFyICpwOworCWludCBpOworCisJbWVtc2V0ICggbHVuLCAwLCBzaXplb2YgKCAqbHVuICkgKTsKKwlpZiAoIGx1bl9zdHJpbmcgKSB7CisJCXAgPSAoIGNoYXIgKiApIGx1bl9zdHJpbmc7CisJCWZvciAoIGkgPSAwIDsgaSA8IDQgOyBpKysgKSB7CisJCQlsdW4tPnUxNltpXSA9IGh0b25zICggc3RydG91bCAoIHAsICZwLCAxNiApICk7CisJCQlpZiAoICpwID09ICdcMCcgKQorCQkJCWJyZWFrOworCQkJaWYgKCAqcCAhPSAnLScgKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcCsrOworCQl9CisJCWlmICggKnAgKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2Jsb2NrL3NycC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9ibG9jay9zcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDA3OTlhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9ibG9jay9zcnAuYwpAQCAtMCwwICsxLDUyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGZW4gU3lzdGVtcyBMdGQgPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEJTRDIgKTsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9zY3NpLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9mZWF0dXJlcy5oPgorI2luY2x1ZGUgPGdweGUvaWJfc3JwLmg+CisjaW5jbHVkZSA8Z3B4ZS9zcnAuaD4KKworLyoqCisgKiBAZmlsZQorICoKKyAqIFNDU0kgUkRNQSBQcm90b2NvbAorICoKKyAqLworCitGRUFUVVJFICggRkVBVFVSRV9QUk9UT0NPTCwgIlNSUCIsIERIQ1BfRUJfRkVBVFVSRV9TUlAsIDEgKTsKKworLyoqIFRhZyB0byBiZSB1c2VkIGZvciBuZXh0IFNSUCBJVSAqLworc3RhdGljIHVuc2lnbmVkIGludCBzcnBfdGFnID0gMDsKKworc3RhdGljIHZvaWQgc3JwX2xvZ2luICggc3RydWN0IHNycF9kZXZpY2UgKnNycCApOworc3RhdGljIHZvaWQgc3JwX2NtZCAoIHN0cnVjdCBzcnBfZGV2aWNlICpzcnAgKTsKKworLyoqCisgKiBNYXJrIFNSUCBTQ1NJIGNvbW1hbmQgYXMgY29tcGxldGUKKyAqCisgKiBAdiBzcnAJCVNSUCBkZXZpY2UKKyAqIEB2IHJjCQlTdGF0dXMgY29kZQorICovCitzdGF0aWMgdm9pZCBzcnBfc2NzaV9kb25lICggc3RydWN0IHNycF9kZXZpY2UgKnNycCwgaW50IHJjICkgeworCWlmICggc3JwLT5jb21tYW5kICkKKwkJc3JwLT5jb21tYW5kLT5yYyA9IHJjOworCXNycC0+Y29tbWFuZCA9IE5VTEw7Cit9CisKKy8qKgorICogSGFuZGxlIFNSUCBzZXNzaW9uIGZhaWx1cmUKKyAqCisgKiBAdiBzcnAJCVNSUCBkZXZpY2UKKyAqIEB2IHJjIAkJUmVhc29uIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyB2b2lkIHNycF9mYWlsICggc3RydWN0IHNycF9kZXZpY2UgKnNycCwgaW50IHJjICkgeworCisJLyogQ2xvc2UgdW5kZXJseWluZyBzb2NrZXQgKi8KKwl4ZmVyX2Nsb3NlICggJnNycC0+c29ja2V0LCByYyApOworCisJLyogQ2xlYXIgc2Vzc2lvbiBzdGF0ZSAqLworCXNycC0+c3RhdGUgPSAwOworCisJLyogSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSByZXRyeSBsaW1pdCwgcmVwb3J0IHRoZSBmYWlsdXJlICovCisJaWYgKCBzcnAtPnJldHJ5X2NvdW50ID49IFNSUF9NQVhfUkVUUklFUyApIHsKKwkJc3JwX3Njc2lfZG9uZSAoIHNycCwgcmMgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE90aGVyd2lzZSwgaW5jcmVtZW50IHRoZSByZXRyeSBjb3VudCBhbmQgdHJ5IHRvIHJlb3BlbiB0aGUKKwkgKiBjb25uZWN0aW9uCisJICovCisJc3JwLT5yZXRyeV9jb3VudCsrOworCXNycF9sb2dpbiAoIHNycCApOworfQorCisvKioKKyAqIEluaXRpYXRlIFNSUCBsb2dpbgorICoKKyAqIEB2IHNycAkJU1JQIGRldmljZQorICovCitzdGF0aWMgdm9pZCBzcnBfbG9naW4gKCBzdHJ1Y3Qgc3JwX2RldmljZSAqc3JwICkgeworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXN0cnVjdCBzcnBfbG9naW5fcmVxICpsb2dpbl9yZXE7CisJaW50IHJjOworCisJYXNzZXJ0ICggISAoIHNycC0+c3RhdGUgJiBTUlBfU1RBVEVfU09DS0VUX09QRU4gKSApOworCisJLyogT3BlbiB1bmRlcmx5aW5nIHNvY2tldCAqLworCWlmICggKCByYyA9IHNycC0+dHJhbnNwb3J0LT5jb25uZWN0ICggc3JwICkgKSAhPSAwICkgeworCQlEQkdDICggc3JwLCAiU1JQICVwIGNvdWxkIG5vdCBvcGVuIHNvY2tldDogJXNcbiIsCisJCSAgICAgICBzcnAsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycjsKKwl9CisJc3JwLT5zdGF0ZSB8PSBTUlBfU1RBVEVfU09DS0VUX09QRU47CisKKwkvKiBBbGxvY2F0ZSBJL08gYnVmZmVyICovCisJaW9idWYgPSB4ZmVyX2FsbG9jX2lvYiAoICZzcnAtPnNvY2tldCwgc2l6ZW9mICggKmxvZ2luX3JlcSApICk7CisJaWYgKCAhIGlvYnVmICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCS8qIENvbnN0cnVjdCBsb2dpbiByZXF1ZXN0IElVICovCisJbG9naW5fcmVxID0gaW9iX3B1dCAoIGlvYnVmLCBzaXplb2YgKCAqbG9naW5fcmVxICkgKTsKKwltZW1zZXQgKCBsb2dpbl9yZXEsIDAsIHNpemVvZiAoICpsb2dpbl9yZXEgKSApOworCWxvZ2luX3JlcS0+dHlwZSA9IFNSUF9MT0dJTl9SRVE7CisJbG9naW5fcmVxLT50YWcuZHdvcmRzWzFdID0gaHRvbmwgKCArK3NycF90YWcgKTsKKwlsb2dpbl9yZXEtPm1heF9pX3RfaXVfbGVuID0gaHRvbmwgKCBTUlBfTUFYX0lfVF9JVV9MRU4gKTsKKwlsb2dpbl9yZXEtPnJlcXVpcmVkX2J1ZmZlcl9mb3JtYXRzID0gU1JQX0xPR0lOX1JFUV9GTVRfRERCRDsKKwltZW1jcHkgKCAmbG9naW5fcmVxLT5wb3J0X2lkcywgJnNycC0+cG9ydF9pZHMsCisJCSBzaXplb2YgKCBsb2dpbl9yZXEtPnBvcnRfaWRzICkgKTsKKworCURCR0MyICggc3JwLCAiU1JQICVwIFRYIGxvZ2luIHJlcXVlc3QgdGFnICUwOHglMDh4XG4iLAorCQlzcnAsIG50b2hsICggbG9naW5fcmVxLT50YWcuZHdvcmRzWzBdICksCisJCW50b2hsICggbG9naW5fcmVxLT50YWcuZHdvcmRzWzFdICkgKTsKKwlEQkdDMl9IREEgKCBzcnAsIDAsIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSApOworCisJLyogU2VuZCBsb2dpbiByZXF1ZXN0IElVICovCisJaWYgKCAoIHJjID0geGZlcl9kZWxpdmVyX2lvYiAoICZzcnAtPnNvY2tldCwgaW9idWYgKSApICE9IDAgKSB7CisJCURCR0MgKCBzcnAsICJTUlAgJXAgY291bGQgbm90IHNlbmQgbG9naW4gcmVxdWVzdDogJXNcbiIsCisJCSAgICAgICBzcnAsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm47CisKKyBlcnI6CisJc3JwX2ZhaWwgKCBzcnAsIHJjICk7Cit9CisKKy8qKgorICogSGFuZGxlIFNSUCBsb2dpbiByZXNwb25zZQorICoKKyAqIEB2IHNycAkJU1JQIGRldmljZQorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNycF9sb2dpbl9yc3AgKCBzdHJ1Y3Qgc3JwX2RldmljZSAqc3JwLCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApIHsKKwlzdHJ1Y3Qgc3JwX2xvZ2luX3JzcCAqbG9naW5fcnNwID0gaW9idWYtPmRhdGE7CisJaW50IHJjOworCisJREJHQzIgKCBzcnAsICJTUlAgJXAgUlggbG9naW4gcmVzcG9uc2UgdGFnICUwOHglMDh4XG4iLAorCQlzcnAsIG50b2hsICggbG9naW5fcnNwLT50YWcuZHdvcmRzWzBdICksCisJCW50b2hsICggbG9naW5fcnNwLT50YWcuZHdvcmRzWzFdICkgKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggaW9iX2xlbiAoIGlvYnVmICkgPCBzaXplb2YgKCAqbG9naW5fcnNwICkgKSB7CisJCURCR0MgKCBzcnAsICJTUlAgJXAgUlggbG9naW4gcmVzcG9uc2UgdG9vIHNob3J0ICglemQgYnl0ZXMpXG4iLAorCQkgICAgICAgc3JwLCBpb2JfbGVuICggaW9idWYgKSApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCURCR0MgKCBzcnAsICJTUlAgJXAgbG9nZ2VkIGluXG4iLCBzcnAgKTsKKworCS8qIE1hcmsgYXMgbG9nZ2VkIGluICovCisJc3JwLT5zdGF0ZSB8PSBTUlBfU1RBVEVfTE9HR0VEX0lOOworCisJLyogUmVzZXQgZXJyb3IgY291bnRlciAqLworCXNycC0+cmV0cnlfY291bnQgPSAwOworCisJLyogSXNzdWUgcGVuZGluZyBjb21tYW5kICovCisJc3JwX2NtZCAoIHNycCApOworCisJcmMgPSAwOworIG91dDoKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEhhbmRsZSBTUlAgbG9naW4gcmVqZWN0aW9uCisgKgorICogQHYgc3JwCQlTUlAgZGV2aWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc3JwX2xvZ2luX3JlaiAoIHN0cnVjdCBzcnBfZGV2aWNlICpzcnAsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXN0cnVjdCBzcnBfbG9naW5fcmVqICpsb2dpbl9yZWogPSBpb2J1Zi0+ZGF0YTsKKwlpbnQgcmM7CisKKwlEQkdDMiAoIHNycCwgIlNSUCAlcCBSWCBsb2dpbiByZWplY3Rpb24gdGFnICUwOHglMDh4XG4iLAorCQlzcnAsIG50b2hsICggbG9naW5fcmVqLT50YWcuZHdvcmRzWzBdICksCisJCW50b2hsICggbG9naW5fcmVqLT50YWcuZHdvcmRzWzFdICkgKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggaW9iX2xlbiAoIGlvYnVmICkgPCBzaXplb2YgKCAqbG9naW5fcmVqICkgKSB7CisJCURCR0MgKCBzcnAsICJTUlAgJXAgUlggbG9naW4gcmVqZWN0aW9uIHRvbyBzaG9ydCAoJXpkICIKKwkJICAgICAgICJieXRlcylcbiIsIHNycCwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBMb2dpbiByZWplY3Rpb24gYWx3YXlzIGluZGljYXRlcyBhbiBlcnJvciAqLworCURCR0MgKCBzcnAsICJTUlAgJXAgbG9naW4gcmVqZWN0ZWQgKHJlYXNvbiAlMDh4KVxuIiwKKwkgICAgICAgc3JwLCBudG9obCAoIGxvZ2luX3Jlai0+cmVhc29uICkgKTsKKwlyYyA9IC1FUEVSTTsKKworIG91dDoKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFRyYW5zbWl0IFNSUCBTQ1NJIGNvbW1hbmQKKyAqCisgKiBAdiBzcnAJCVNSUCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgc3JwX2NtZCAoIHN0cnVjdCBzcnBfZGV2aWNlICpzcnAgKSB7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisJc3RydWN0IHNycF9jbWQgKmNtZDsKKwlzdHJ1Y3Qgc3JwX21lbW9yeV9kZXNjcmlwdG9yICpkYXRhX291dDsKKwlzdHJ1Y3Qgc3JwX21lbW9yeV9kZXNjcmlwdG9yICpkYXRhX2luOworCWludCByYzsKKworCWFzc2VydCAoIHNycC0+c3RhdGUgJiBTUlBfU1RBVEVfTE9HR0VEX0lOICk7CisKKwkvKiBBbGxvY2F0ZSBJL08gYnVmZmVyICovCisJaW9idWYgPSB4ZmVyX2FsbG9jX2lvYiAoICZzcnAtPnNvY2tldCwgU1JQX01BWF9JX1RfSVVfTEVOICk7CisJaWYgKCAhIGlvYnVmICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCS8qIENvbnN0cnVjdCBiYXNlIHBvcnRpb24gKi8KKwljbWQgPSBpb2JfcHV0ICggaW9idWYsIHNpemVvZiAoICpjbWQgKSApOworCW1lbXNldCAoIGNtZCwgMCwgc2l6ZW9mICggKmNtZCApICk7CisJY21kLT50eXBlID0gU1JQX0NNRDsKKwljbWQtPnRhZy5kd29yZHNbMV0gPSBodG9ubCAoICsrc3JwX3RhZyApOworCWNtZC0+bHVuID0gc3JwLT5sdW47CisJbWVtY3B5ICggJmNtZC0+Y2RiLCAmc3JwLT5jb21tYW5kLT5jZGIsIHNpemVvZiAoIGNtZC0+Y2RiICkgKTsKKworCS8qIENvbnN0cnVjdCBkYXRhLW91dCBkZXNjcmlwdG9yLCBpZiBwcmVzZW50ICovCisJaWYgKCBzcnAtPmNvbW1hbmQtPmRhdGFfb3V0ICkgeworCQljbWQtPmRhdGFfYnVmZmVyX2Zvcm1hdHMgfD0gU1JQX0NNRF9ET19GTVRfRElSRUNUOworCQlkYXRhX291dCA9IGlvYl9wdXQgKCBpb2J1Ziwgc2l6ZW9mICggKmRhdGFfb3V0ICkgKTsKKwkJZGF0YV9vdXQtPmFkZHJlc3MgPQorCQkgICAgY3B1X3RvX2JlNjQgKCB1c2VyX3RvX3BoeXMgKCBzcnAtPmNvbW1hbmQtPmRhdGFfb3V0LCAwICkgKTsKKwkJZGF0YV9vdXQtPmhhbmRsZSA9IG50b2hsICggc3JwLT5tZW1vcnlfaGFuZGxlICk7CisJCWRhdGFfb3V0LT5sZW4gPSBudG9obCAoIHNycC0+Y29tbWFuZC0+ZGF0YV9vdXRfbGVuICk7CisJfQorCisJLyogQ29uc3RydWN0IGRhdGEtaW4gZGVzY3JpcHRvciwgaWYgcHJlc2VudCAqLworCWlmICggc3JwLT5jb21tYW5kLT5kYXRhX2luICkgeworCQljbWQtPmRhdGFfYnVmZmVyX2Zvcm1hdHMgfD0gU1JQX0NNRF9ESV9GTVRfRElSRUNUOworCQlkYXRhX2luID0gaW9iX3B1dCAoIGlvYnVmLCBzaXplb2YgKCAqZGF0YV9pbiApICk7CisJCWRhdGFfaW4tPmFkZHJlc3MgPQorCQkgICAgIGNwdV90b19iZTY0ICggdXNlcl90b19waHlzICggc3JwLT5jb21tYW5kLT5kYXRhX2luLCAwICkgKTsKKwkJZGF0YV9pbi0+aGFuZGxlID0gbnRvaGwgKCBzcnAtPm1lbW9yeV9oYW5kbGUgKTsKKwkJZGF0YV9pbi0+bGVuID0gbnRvaGwgKCBzcnAtPmNvbW1hbmQtPmRhdGFfaW5fbGVuICk7CisJfQorCisJREJHQzIgKCBzcnAsICJTUlAgJXAgVFggU0NTSSBjb21tYW5kIHRhZyAlMDh4JTA4eFxuIiwgc3JwLAorCQludG9obCAoIGNtZC0+dGFnLmR3b3Jkc1swXSApLCBudG9obCAoIGNtZC0+dGFnLmR3b3Jkc1sxXSApICk7CisJREJHQzJfSERBICggc3JwLCAwLCBpb2J1Zi0+ZGF0YSwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKworCS8qIFNlbmQgSVUgKi8KKwlpZiAoICggcmMgPSB4ZmVyX2RlbGl2ZXJfaW9iICggJnNycC0+c29ja2V0LCBpb2J1ZiApICkgIT0gMCApIHsKKwkJREJHQyAoIHNycCwgIlNSUCAlcCBjb3VsZCBub3Qgc2VuZCBjb21tYW5kOiAlc1xuIiwKKwkJICAgICAgIHNycCwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybjsKKworIGVycjoKKwlzcnBfZmFpbCAoIHNycCwgcmMgKTsKK30KKworLyoqCisgKiBIYW5kbGUgU1JQIFNDU0kgcmVzcG9uc2UKKyAqCisgKiBAdiBzcnAJCVNSUCBkZXZpY2UKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm5zIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc3JwX3JzcCAoIHN0cnVjdCBzcnBfZGV2aWNlICpzcnAsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXN0cnVjdCBzcnBfcnNwICpyc3AgPSBpb2J1Zi0+ZGF0YTsKKwlpbnQgcmM7CisKKwlEQkdDMiAoIHNycCwgIlNSUCAlcCBSWCBTQ1NJIHJlc3BvbnNlIHRhZyAlMDh4JTA4eFxuIiwgc3JwLAorCQludG9obCAoIHJzcC0+dGFnLmR3b3Jkc1swXSApLCBudG9obCAoIHJzcC0+dGFnLmR3b3Jkc1sxXSApICk7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIGlvYl9sZW4gKCBpb2J1ZiApIDwgc2l6ZW9mICggKnJzcCApICkgeworCQlEQkdDICggc3JwLCAiU1JQICVwIFJYIFNDU0kgcmVzcG9uc2UgdG9vIHNob3J0ICglemQgYnl0ZXMpXG4iLAorCQkgICAgICAgc3JwLCBpb2JfbGVuICggaW9idWYgKSApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFJlcG9ydCBTQ1NJIGVycm9ycyAqLworCWlmICggcnNwLT5zdGF0dXMgIT0gMCApIHsKKwkJREJHQyAoIHNycCwgIlNSUCAlcCByZXNwb25zZSBzdGF0dXMgJTAyeFxuIiwKKwkJICAgICAgIHNycCwgcnNwLT5zdGF0dXMgKTsKKwkJaWYgKCBzcnBfcnNwX3NlbnNlX2RhdGEgKCByc3AgKSApIHsKKwkJCURCR0MgKCBzcnAsICJTUlAgJXAgc2Vuc2UgZGF0YTpcbiIsIHNycCApOworCQkJREJHQ19IREEgKCBzcnAsIDAsIHNycF9yc3Bfc2Vuc2VfZGF0YSAoIHJzcCApLAorCQkJCSAgIHNycF9yc3Bfc2Vuc2VfZGF0YV9sZW4gKCByc3AgKSApOworCQl9CisJfQorCWlmICggcnNwLT52YWxpZCAmICggU1JQX1JTUF9WQUxJRF9ET1VOREVSIHwgU1JQX1JTUF9WQUxJRF9ET09WRVIgKSApIHsKKwkJREJHQyAoIHNycCwgIlNSUCAlcCByZXNwb25zZSBkYXRhLW91dCAlc3J1biBieSAlI3ggYnl0ZXNcbiIsCisJCSAgICAgICBzcnAsICggKCByc3AtPnZhbGlkICYgU1JQX1JTUF9WQUxJRF9ET1VOREVSICkKKwkJCSAgICAgID8gInVuZGVyIiA6ICJvdmVyIiApLAorCQkgICAgICAgbnRvaGwgKCByc3AtPmRhdGFfb3V0X3Jlc2lkdWFsX2NvdW50ICkgKTsKKwl9CisJaWYgKCByc3AtPnZhbGlkICYgKCBTUlBfUlNQX1ZBTElEX0RJVU5ERVIgfCBTUlBfUlNQX1ZBTElEX0RJT1ZFUiApICkgeworCQlEQkdDICggc3JwLCAiU1JQICVwIHJlc3BvbnNlIGRhdGEtaW4gJXNydW4gYnkgJSN4IGJ5dGVzXG4iLAorCQkgICAgICAgc3JwLCAoICggcnNwLT52YWxpZCAmIFNSUF9SU1BfVkFMSURfRElVTkRFUiApCisJCQkgICAgICA/ICJ1bmRlciIgOiAib3ZlciIgKSwKKwkJICAgICAgIG50b2hsICggcnNwLT5kYXRhX2luX3Jlc2lkdWFsX2NvdW50ICkgKTsKKwl9CisJc3JwLT5jb21tYW5kLT5zdGF0dXMgPSByc3AtPnN0YXR1czsKKworCS8qIE1hcmsgU0NTSSBjb21tYW5kIGFzIGNvbXBsZXRlICovCisJc3JwX3Njc2lfZG9uZSAoIHNycCwgMCApOworCisJcmMgPSAwOworIG91dDoKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEhhbmRsZSBTUlAgdW5yZWNvZ25pc2VkIHJlc3BvbnNlCisgKgorICogQHYgc3JwCQlTUlAgZGV2aWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJucyBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNycF91bnJlY29nbmlzZWQgKCBzdHJ1Y3Qgc3JwX2RldmljZSAqc3JwLAorCQkJICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKSB7CisJc3RydWN0IHNycF9jb21tb24gKmNvbW1vbiA9IGlvYnVmLT5kYXRhOworCisJREJHQyAoIHNycCwgIlNSUCAlcCBSWCB1bnJlY29nbmlzZWQgSVUgdGFnICUwOHglMDh4IHR5cGUgJTAyeFxuIiwKKwkgICAgICAgc3JwLCBudG9obCAoIGNvbW1vbi0+dGFnLmR3b3Jkc1swXSApLAorCSAgICAgICBudG9obCAoIGNvbW1vbi0+dGFnLmR3b3Jkc1sxXSApLCBjb21tb24tPnR5cGUgKTsKKworCWZyZWVfaW9iICggaW9idWYgKTsKKwlyZXR1cm4gLUVOT1RTVVA7Cit9CisKKy8qKgorICogUmVjZWl2ZSBkYXRhIGZyb20gdW5kZXJseWluZyBzb2NrZXQKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgaW9idWYJCURhdGFncmFtIEkvTyBidWZmZXIKKyAqIEB2IG1ldGEJCURhdGEgdHJhbnNmZXIgbWV0YWRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNycF94ZmVyX2RlbGl2ZXJfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCQkJICBzdHJ1Y3QgeGZlcl9tZXRhZGF0YSAqbWV0YSBfX3VudXNlZCApIHsKKwlzdHJ1Y3Qgc3JwX2RldmljZSAqc3JwID0KKwkJY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IHNycF9kZXZpY2UsIHNvY2tldCApOworCXN0cnVjdCBzcnBfY29tbW9uICpjb21tb24gPSBpb2J1Zi0+ZGF0YTsKKwlpbnQgKCAqIHR5cGUgKSAoIHN0cnVjdCBzcnBfZGV2aWNlICpzcnAsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICk7CisJaW50IHJjOworCisJLyogRGV0ZXJtaW5lIElVIHR5cGUgKi8KKwlzd2l0Y2ggKCBjb21tb24tPnR5cGUgKSB7CisJY2FzZSBTUlBfTE9HSU5fUlNQOgorCQl0eXBlID0gc3JwX2xvZ2luX3JzcDsKKwkJYnJlYWs7CisJY2FzZSBTUlBfTE9HSU5fUkVKOgorCQl0eXBlID0gc3JwX2xvZ2luX3JlajsKKwkJYnJlYWs7CisJY2FzZSBTUlBfUlNQOgorCQl0eXBlID0gc3JwX3JzcDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHlwZSA9IHNycF91bnJlY29nbmlzZWQ7CisJCWJyZWFrOworCX0KKworCS8qIEhhbmRsZSBJVSAqLworCWlmICggKCByYyA9IHR5cGUgKCBzcnAsIGlvYnVmICkgKSAhPSAwICkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKKworIGVycjoKKwlzcnBfZmFpbCAoIHNycCwgcmMgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogVW5kZXJseWluZyBzb2NrZXQgY2xvc2VkCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIHNycF94ZmVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKSB7CisJc3RydWN0IHNycF9kZXZpY2UgKnNycCA9CisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCBzcnBfZGV2aWNlLCBzb2NrZXQgKTsKKworCURCR0MgKCBzcnAsICJTUlAgJXAgc29ja2V0IGNsb3NlZDogJXNcbiIsIHNycCwgc3RyZXJyb3IgKCByYyApICk7CisKKwlzcnBfZmFpbCAoIHNycCwgcmMgKTsKK30KKworLyoqIFNSUCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgc3JwX3hmZXJfb3BlcmF0aW9ucyA9IHsKKwkuY2xvc2UJCT0gc3JwX3hmZXJfY2xvc2UsCisJLnZyZWRpcmVjdAk9IGlnbm9yZV94ZmVyX3ZyZWRpcmVjdCwKKwkud2luZG93CQk9IHVubGltaXRlZF94ZmVyX3dpbmRvdywKKwkuYWxsb2NfaW9iCT0gZGVmYXVsdF94ZmVyX2FsbG9jX2lvYiwKKwkuZGVsaXZlcl9pb2IJPSBzcnBfeGZlcl9kZWxpdmVyX2lvYiwKKwkuZGVsaXZlcl9yYXcJPSB4ZmVyX2RlbGl2ZXJfYXNfaW9iLAorfTsKKworLyoqCisgKiBJc3N1ZSBTQ1NJIGNvbW1hbmQgdmlhIFNSUAorICoKKyAqIEB2IHNjc2kJCVNDU0kgZGV2aWNlCisgKiBAdiBjb21tYW5kCQlTQ1NJIGNvbW1hbmQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNycF9jb21tYW5kICggc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpLAorCQkJIHN0cnVjdCBzY3NpX2NvbW1hbmQgKmNvbW1hbmQgKSB7CisJc3RydWN0IHNycF9kZXZpY2UgKnNycCA9CisJCWNvbnRhaW5lcl9vZiAoIHNjc2ktPmJhY2tlbmQsIHN0cnVjdCBzcnBfZGV2aWNlLCByZWZjbnQgKTsKKworCS8qIFN0b3JlIFNDU0kgY29tbWFuZCAqLworCWlmICggc3JwLT5jb21tYW5kICkgeworCQlEQkdDICggc3JwLCAiU1JQICVwIGNhbm5vdCBoYW5kbGUgY29uY3VycmVudCBTQ1NJIGNvbW1hbmRzXG4iLAorCQkgICAgICAgc3JwICk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNycC0+Y29tbWFuZCA9IGNvbW1hbmQ7CisKKwkvKiBMb2cgaW4gb3IgaXNzdWUgY29tbWFuZCBhcyBhcHByb3ByaWF0ZSAqLworCWlmICggISAoIHNycC0+c3RhdGUgJiBTUlBfU1RBVEVfU09DS0VUX09QRU4gKSApIHsKKwkJc3JwX2xvZ2luICggc3JwICk7CisJfSBlbHNlIGlmICggc3JwLT5zdGF0ZSAmIFNSUF9TVEFURV9MT0dHRURfSU4gKSB7CisJCXNycF9jbWQgKCBzcnAgKTsKKwl9IGVsc2UgeworCQkvKiBTdGlsbCB3YWl0aW5nIGZvciBsb2dpbjsgZG8gbm90aGluZyAqLworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEF0dGFjaCBTUlAgZGV2aWNlCisgKgorICogQHYgc2NzaQkJU0NTSSBkZXZpY2UKKyAqIEB2IHJvb3RfcGF0aAkJUm9vdCBwYXRoCisgKi8KK2ludCBzcnBfYXR0YWNoICggc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpLCBjb25zdCBjaGFyICpyb290X3BhdGggKSB7CisJc3RydWN0IHNycF90cmFuc3BvcnRfdHlwZSAqdHJhbnNwb3J0OworCXN0cnVjdCBzcnBfZGV2aWNlICpzcnA7CisJaW50IHJjOworCisJLyogSGFyZC1jb2RlIGFuIElCIFNSUCBiYWNrLWVuZCBmb3Igbm93ICovCisJdHJhbnNwb3J0ID0gJmliX3NycF90cmFuc3BvcnQ7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBzdHJ1Y3R1cmUgKi8KKwlzcnAgPSB6YWxsb2MgKCBzaXplb2YgKCAqc3JwICkgKyB0cmFuc3BvcnQtPnByaXZfbGVuICk7CisJaWYgKCAhIHNycCApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisJeGZlcl9pbml0ICggJnNycC0+c29ja2V0LCAmc3JwX3hmZXJfb3BlcmF0aW9ucywgJnNycC0+cmVmY250ICk7CisJc3JwLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisJREJHQyAoIHNycCwgIlNSUCAlcCB1c2luZyAlc1xuIiwgc3JwLCByb290X3BhdGggKTsKKworCS8qIFBhcnNlIHJvb3QgcGF0aCAqLworCWlmICggKCByYyA9IHRyYW5zcG9ydC0+cGFyc2Vfcm9vdF9wYXRoICggc3JwLCByb290X3BhdGggKSApICE9IDAgKSB7CisJCURCR0MgKCBzcnAsICJTUlAgJXAgY291bGQgbm90IHBhcnNlIHJvb3QgcGF0aDogJXNcbiIsCisJCSAgICAgICBzcnAsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9wYXJzZV9yb290X3BhdGg7CisJfQorCisJLyogQXR0YWNoIHBhcmVudCBpbnRlcmZhY2UsIG1vcnRhbGlzZSBzZWxmLCBhbmQgcmV0dXJuICovCisJc2NzaS0+YmFja2VuZCA9IHJlZl9nZXQgKCAmc3JwLT5yZWZjbnQgKTsKKwlzY3NpLT5jb21tYW5kID0gc3JwX2NvbW1hbmQ7CisJcmVmX3B1dCAoICZzcnAtPnJlZmNudCApOworCXJldHVybiAwOworCisgZXJyX3BhcnNlX3Jvb3RfcGF0aDoKKwlyZWZfcHV0ICggJnNycC0+cmVmY250ICk7CisgZXJyX2FsbG9jOgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBEZXRhY2ggU1JQIGRldmljZQorICoKKyAqIEB2IHNjc2kJCVNDU0kgZGV2aWNlCisgKi8KK3ZvaWQgc3JwX2RldGFjaCAoIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSApIHsKKwlzdHJ1Y3Qgc3JwX2RldmljZSAqc3JwID0KKwkJY29udGFpbmVyX29mICggc2NzaS0+YmFja2VuZCwgc3RydWN0IHNycF9kZXZpY2UsIHJlZmNudCApOworCisJLyogQ2xvc2Ugc29ja2V0ICovCisJeGZlcl9udWxsaWZ5ICggJnNycC0+c29ja2V0ICk7CisJeGZlcl9jbG9zZSAoICZzcnAtPnNvY2tldCwgMCApOworCXNjc2ktPmNvbW1hbmQgPSBzY3NpX2RldGFjaGVkX2NvbW1hbmQ7CisJcmVmX3B1dCAoIHNjc2ktPmJhY2tlbmQgKTsKKwlzY3NpLT5iYWNrZW5kID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvYnVzL2Vpc2EuYyBiL2dweGUvc3JjL2RyaXZlcnMvYnVzL2Vpc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMzMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9idXMvZWlzYS5jCkBAIC0wLDAgKzEsMTgyIEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxncHhlL2Vpc2EuaD4KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitzdGF0aWMgdm9pZCBlaXNhYnVzX3JlbW92ZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApOworCisvKioKKyAqIFJlc2V0IGFuZCBlbmFibGUvZGlzYWJsZSBhbiBFSVNBIGRldmljZQorICoKKyAqIEB2IGVpc2EJCUVJU0EgZGV2aWNlCisgKiBAdiBlbmFibGVkCQkxPWVuYWJsZSwgMD1kaXNhYmxlCisgKi8KK3ZvaWQgZWlzYV9kZXZpY2VfZW5hYmxlZCAoIHN0cnVjdCBlaXNhX2RldmljZSAqZWlzYSwgaW50IGVuYWJsZWQgKSB7CisJLyogU2V0IHJlc2V0IGxpbmUgaGlnaCBmb3IgMTAwMCC1cy4gIFNwZWMgc2F5cyA1MDAgtXMsIGJ1dAorCSAqIHRoaXMgZG9lc24ndCB3b3JrIGZvciBhbGwgY2FyZHMsIHNvIHdlIGFyZSBjb25zZXJ2YXRpdmUuCisJICovCisJb3V0YiAoIEVJU0FfQ01EX1JFU0VULCBlaXNhLT5pb2FkZHIgKyBFSVNBX0dMT0JBTF9DT05GSUcgKTsKKwl1ZGVsYXkgKCAxMDAwICk7IC8qIE11c3Qgd2FpdCA4MDAgKi8KKworCS8qIFNldCByZXNldCBsb3cgYW5kIHdyaXRlIGEgMSB0byBFTkFCTEUuICBEZWxheSBhZ2FpbiwgaW4KKwkgKiBjYXNlIHRoZSBjYXJkIHRha2VzIGEgd2hpbGUgdG8gd2FrZSB1cC4KKwkgKi8KKwlvdXRiICggZW5hYmxlZCA/IEVJU0FfQ01EX0VOQUJMRSA6IDAsCisJICAgICAgIGVpc2EtPmlvYWRkciArIEVJU0FfR0xPQkFMX0NPTkZJRyApOworCXVkZWxheSAoIDEwMDAgKTsgLyogTXVzdCB3YWl0IDgwMCAqLworCisJREJHICggIkVJU0EgJXMgZGV2aWNlICUwMnhcbiIsICggZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIgKSwKKwkgICAgICBlaXNhLT5zbG90ICk7Cit9CisKKy8qKgorICogUHJvYmUgYW4gRUlTQSBkZXZpY2UKKyAqCisgKiBAdiBlaXNhCQlFSVNBIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogU2VhcmNoZXMgZm9yIGEgZHJpdmVyIGZvciB0aGUgRUlTQSBkZXZpY2UuICBJZiBhIGRyaXZlciBpcyBmb3VuZCwKKyAqIGl0cyBwcm9iZSgpIHJvdXRpbmUgaXMgY2FsbGVkLgorICovCitzdGF0aWMgaW50IGVpc2FfcHJvYmUgKCBzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVpc2EgKSB7CisJc3RydWN0IGVpc2FfZHJpdmVyICpkcml2ZXI7CisJc3RydWN0IGVpc2FfZGV2aWNlX2lkICppZDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmM7CisKKwlEQkcgKCAiQWRkaW5nIEVJU0EgZGV2aWNlICUwMnggKCUwNHg6JTA0eCAoXCIlc1wiKSBpbyAleClcbiIsCisJICAgICAgZWlzYS0+c2xvdCwgZWlzYS0+dmVuZG9yX2lkLCBlaXNhLT5wcm9kX2lkLAorCSAgICAgIGlzYV9pZF9zdHJpbmcgKCBlaXNhLT52ZW5kb3JfaWQsIGVpc2EtPnByb2RfaWQgKSwgZWlzYS0+aW9hZGRyICk7CisKKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIGRyaXZlciwgRUlTQV9EUklWRVJTICkgeworCQlmb3IgKCBpID0gMCA7IGkgPCBkcml2ZXItPmlkX2NvdW50IDsgaSsrICkgeworCQkJaWQgPSAmZHJpdmVyLT5pZHNbaV07CisJCQlpZiAoIGlkLT52ZW5kb3JfaWQgIT0gZWlzYS0+dmVuZG9yX2lkICkKKwkJCQljb250aW51ZTsKKwkJCWlmICggSVNBX1BST0RfSUQgKCBpZC0+cHJvZF9pZCApICE9CisJCQkgICAgIElTQV9QUk9EX0lEICggZWlzYS0+cHJvZF9pZCApICkKKwkJCQljb250aW51ZTsKKwkJCWVpc2EtPmRyaXZlciA9IGRyaXZlcjsKKwkJCWVpc2EtPmRyaXZlcl9uYW1lID0gaWQtPm5hbWU7CisJCQlEQkcgKCAiLi4udXNpbmcgZHJpdmVyICVzXG4iLCBlaXNhLT5kcml2ZXJfbmFtZSApOworCQkJaWYgKCAoIHJjID0gZHJpdmVyLT5wcm9iZSAoIGVpc2EsIGlkICkgKSAhPSAwICkgeworCQkJCURCRyAoICIuLi4uLi5wcm9iZSBmYWlsZWRcbiIgKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJREJHICggIi4uLm5vIGRyaXZlciBmb3VuZFxuIiApOworCXJldHVybiAtRU5PVFRZOworfQorCisvKioKKyAqIFJlbW92ZSBhbiBFSVNBIGRldmljZQorICoKKyAqIEB2IGVpc2EJCUVJU0EgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGVpc2FfcmVtb3ZlICggc3RydWN0IGVpc2FfZGV2aWNlICplaXNhICkgeworCWVpc2EtPmRyaXZlci0+cmVtb3ZlICggZWlzYSApOworCURCRyAoICJSZW1vdmVkIEVJU0EgZGV2aWNlICUwMnhcbiIsIGVpc2EtPnNsb3QgKTsKK30KKworLyoqCisgKiBQcm9iZSBFSVNBIHJvb3QgYnVzCisgKgorICogQHYgcm9vdGRldgkJRUlTQSBidXMgcm9vdCBkZXZpY2UKKyAqCisgKiBTY2FucyB0aGUgRUlTQSBidXMgZm9yIGRldmljZXMgYW5kIHJlZ2lzdGVycyBhbGwgZGV2aWNlcyBpdCBjYW4KKyAqIGZpbmQuCisgKi8KK3N0YXRpYyBpbnQgZWlzYWJ1c19wcm9iZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApIHsKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVpc2EgPSBOVUxMOworCXVuc2lnbmVkIGludCBzbG90OworCWludCByYzsKKworCWZvciAoIHNsb3QgPSBFSVNBX01JTl9TTE9UIDsgc2xvdCA8PSBFSVNBX01BWF9TTE9UIDsgc2xvdCsrICkgeworCQkvKiBBbGxvY2F0ZSBzdHJ1Y3QgZWlzYV9kZXZpY2UgKi8KKwkJaWYgKCAhIGVpc2EgKQorCQkJZWlzYSA9IG1hbGxvYyAoIHNpemVvZiAoICplaXNhICkgKTsKKwkJaWYgKCAhIGVpc2EgKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGVycjsKKwkJfQorCQltZW1zZXQgKCBlaXNhLCAwLCBzaXplb2YgKCAqZWlzYSApICk7CisJCWVpc2EtPnNsb3QgPSBzbG90OworCQllaXNhLT5pb2FkZHIgPSBFSVNBX1NMT1RfQkFTRSAoIGVpc2EtPnNsb3QgKTsKKworCQkvKiBUZXN0IGZvciBib2FyZCBwcmVzZW50ICovCisJCW91dGIgKCAweGZmLCBlaXNhLT5pb2FkZHIgKyBFSVNBX1ZFTkRPUl9JRCApOworCQllaXNhLT52ZW5kb3JfaWQgPQorCQkJbGUxNl90b19jcHUgKCBpbncgKCBlaXNhLT5pb2FkZHIgKyBFSVNBX1ZFTkRPUl9JRCApICk7CisJCWVpc2EtPnByb2RfaWQgPQorCQkJbGUxNl90b19jcHUgKCBpbncgKCBlaXNhLT5pb2FkZHIgKyBFSVNBX1BST0RfSUQgKSApOworCQlpZiAoIGVpc2EtPnZlbmRvcl9pZCAmIDB4ODAgKSB7CisJCQkvKiBObyBib2FyZCBwcmVzZW50ICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEFkZCB0byBkZXZpY2UgaGllcmFyY2h5ICovCisJCXNucHJpbnRmICggZWlzYS0+ZGV2Lm5hbWUsIHNpemVvZiAoIGVpc2EtPmRldi5uYW1lICksCisJCQkgICAiRUlTQSUwMngiLCBzbG90ICk7CisJCWVpc2EtPmRldi5kZXNjLmJ1c190eXBlID0gQlVTX1RZUEVfRUlTQTsKKwkJZWlzYS0+ZGV2LmRlc2MudmVuZG9yID0gZWlzYS0+dmVuZG9yX2lkOworCQllaXNhLT5kZXYuZGVzYy5kZXZpY2UgPSBlaXNhLT5wcm9kX2lkOworCQllaXNhLT5kZXYucGFyZW50ID0gJnJvb3RkZXYtPmRldjsKKwkJbGlzdF9hZGQgKCAmZWlzYS0+ZGV2LnNpYmxpbmdzLCAmcm9vdGRldi0+ZGV2LmNoaWxkcmVuICk7CisJCUlOSVRfTElTVF9IRUFEICggJmVpc2EtPmRldi5jaGlsZHJlbiApOworCisJCS8qIExvb2sgZm9yIGEgZHJpdmVyICovCisJCWlmICggZWlzYV9wcm9iZSAoIGVpc2EgKSA9PSAwICkgeworCQkJLyogZWlzYWRldiByZWdpc3RlcmVkLCB3ZSBjYW4gZHJvcCBvdXIgcmVmICovCisJCQllaXNhID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vdCByZWdpc3RlcmVkOyByZS11c2Ugc3RydWN0ICovCisJCQlsaXN0X2RlbCAoICZlaXNhLT5kZXYuc2libGluZ3MgKTsKKwkJfQorCX0KKworCWZyZWUgKCBlaXNhICk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJZnJlZSAoIGVpc2EgKTsKKwllaXNhYnVzX3JlbW92ZSAoIHJvb3RkZXYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVtb3ZlIEVJU0Egcm9vdCBidXMKKyAqCisgKiBAdiByb290ZGV2CQlFSVNBIGJ1cyByb290IGRldmljZQorICovCitzdGF0aWMgdm9pZCBlaXNhYnVzX3JlbW92ZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApIHsKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVpc2E7CisJc3RydWN0IGVpc2FfZGV2aWNlICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKCBlaXNhLCB0bXAsICZyb290ZGV2LT5kZXYuY2hpbGRyZW4sCisJCQkJICAgZGV2LnNpYmxpbmdzICkgeworCQllaXNhX3JlbW92ZSAoIGVpc2EgKTsKKwkJbGlzdF9kZWwgKCAmZWlzYS0+ZGV2LnNpYmxpbmdzICk7CisJCWZyZWUgKCBlaXNhICk7CisJfQorfQorCisvKiogRUlTQSBidXMgcm9vdCBkZXZpY2UgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHJvb3RfZHJpdmVyIGVpc2Ffcm9vdF9kcml2ZXIgPSB7CisJLnByb2JlID0gZWlzYWJ1c19wcm9iZSwKKwkucmVtb3ZlID0gZWlzYWJ1c19yZW1vdmUsCit9OworCisvKiogRUlTQSBidXMgcm9vdCBkZXZpY2UgKi8KK3N0cnVjdCByb290X2RldmljZSBlaXNhX3Jvb3RfZGV2aWNlIF9fcm9vdF9kZXZpY2UgPSB7CisJLmRldiA9IHsgLm5hbWUgPSAiRUlTQSIgfSwKKwkuZHJpdmVyID0gJmVpc2Ffcm9vdF9kcml2ZXIsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9idXMvaXNhLmMgYi9ncHhlL3NyYy9kcml2ZXJzL2J1cy9pc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDU4ODI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9idXMvaXNhLmMKQEAgLTAsMCArMSwxNzIgQEAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorI2luY2x1ZGUgPGdweGUvaXNhLmg+CisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoKKyAqIGlzYS5jIGltcGxlbWVudHMgYSAiY2xhc3NpY2FsIiBwb3J0LXNjYW5uaW5nIG1ldGhvZCBvZiBJU0EgZGV2aWNlCisgKiBkZXRlY3Rpb24uICBUaGUgZHJpdmVyIG11c3QgcHJvdmlkZSBhIGxpc3Qgb2YgcHJvYmUgYWRkcmVzc2VzCisgKiAocHJvYmVfYWRkcnMpLCB0b2dldGhlciB3aXRoIGEgZnVuY3Rpb24gKHByb2JlX2FkZHIpIHRoYXQgY2FuIGJlCisgKiB1c2VkIHRvIHRlc3QgZm9yIHRoZSBwaHlzaWNhbCBwcmVzZW5jZSBvZiBhIGRldmljZSBhdCBhbnkgZ2l2ZW4KKyAqIGFkZHJlc3MuCisgKgorICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGNvbnNpZGVyZWQgdGhlICJsYXN0IHJlc29ydCIgZm9yCisgKiBkZXZpY2UgcHJvYmluZy4gIElmIHRoZSBjYXJkIHN1cHBvcnRzIElTQVBuUCBvciBFSVNBLCB1c2UgdGhhdAorICogaW5zdGVhZC4gIFNvbWUgY2FyZHMgKGUuZy4gdGhlIDNjNTA5KSBpbXBsZW1lbnQgYSBwcm9wcmlldGFyeQorICogSVNBUG5QLWxpa2UgbWVjaGFuaXNtLgorICoKKyAqIFRoZSBJU0EgcHJvYmUgYWRkcmVzcyBsaXN0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGNvbmZpZy5oOyBpZiB0aGUKKyAqIHVzZXIgc3BlY2lmaWVzIElTQV9QUk9CRV9BRERSUyB0aGVuIHRoYXQgbGlzdCB3aWxsIGJlIHVzZWQgZmlyc3QuCisgKiAoSWYgSVNBX1BST0JFX09OTFkgaXMgZGVmaW5lZCwgdGhlIGRyaXZlcidzIG93biBsaXN0IHdpbGwgbmV2ZXIgYmUKKyAqIHVzZWQpLgorICovCisKKy8qCisgKiBVc2VyLXN1cHBsaWVkIHByb2JlIGFkZHJlc3MgbGlzdAorICoKKyAqLworc3RhdGljIGlzYV9wcm9iZV9hZGRyX3QgaXNhX2V4dHJhX3Byb2JlX2FkZHJzW10gPSB7CisjaWZkZWYgSVNBX1BST0JFX0FERFJTCisJSVNBX1BST0JFX0FERFJTCisjZW5kaWYKK307CisjZGVmaW5lIElTQV9FWFRSQV9QUk9CRV9BRERSX0NPVU5UIFwKKyAgICAgKCBzaXplb2YgKCBpc2FfZXh0cmFfcHJvYmVfYWRkcnMgKSAvIHNpemVvZiAoIGlzYV9leHRyYV9wcm9iZV9hZGRyc1swXSApICkKKworI2RlZmluZSBJU0FfSU9JRFhfTUlOKCBkcml2ZXIgKSAoIC1JU0FfRVhUUkFfUFJPQkVfQUREUl9DT1VOVCApCisjaWZkZWYgSVNBX1BST0JFX09OTFkKKyNkZWZpbmUgSVNBX0lPSURYX01BWCggZHJpdmVyICkgKCAtMSApCisjZWxzZQorI2RlZmluZSBJU0FfSU9JRFhfTUFYKCBkcml2ZXIgKSAoIChpbnQpIChkcml2ZXIpLT5hZGRyX2NvdW50IC0gMSApCisjZW5kaWYKKworI2RlZmluZSBJU0FfSU9BRERSKCBkcml2ZXIsIGlvaWR4ICkJCQkJCSAgXAorCSggKCAoaW9pZHgpIDwgMCApID8JCQkJCQkgIFwKKwkgIGlzYV9leHRyYV9wcm9iZV9hZGRyc1sgKGlvaWR4KSArIElTQV9FWFRSQV9QUk9CRV9BRERSX0NPVU5UIF0gOiBcCisJICAoZHJpdmVyKS0+cHJvYmVfYWRkcnNbKGlvaWR4KV0gKQorCitzdGF0aWMgdm9pZCBpc2FidXNfcmVtb3ZlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICk7CisKKy8qKgorICogUHJvYmUgYW4gSVNBIGRldmljZQorICoKKyAqIEB2IGlzYQkJSVNBIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNhX3Byb2JlICggc3RydWN0IGlzYV9kZXZpY2UgKmlzYSApIHsKKwlpbnQgcmM7CisKKwlEQkcgKCAiVHJ5aW5nIElTQSBkcml2ZXIgJXMgYXQgSS9PICUwNHhcbiIsCisJICAgICAgaXNhLT5kcml2ZXItPm5hbWUsIGlzYS0+aW9hZGRyICk7CisKKwlpZiAoICggcmMgPSBpc2EtPmRyaXZlci0+cHJvYmUgKCBpc2EgKSApICE9IDAgKSB7CisJCURCRyAoICIuLi5wcm9iZSBmYWlsZWRcbiIgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCURCRyAoICIuLi5kZXZpY2UgZm91bmRcbiIgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZW1vdmUgYW4gSVNBIGRldmljZQorICoKKyAqIEB2IGlzYQkJSVNBIGRldmljZQorICovCitzdGF0aWMgdm9pZCBpc2FfcmVtb3ZlICggc3RydWN0IGlzYV9kZXZpY2UgKmlzYSApIHsKKwlpc2EtPmRyaXZlci0+cmVtb3ZlICggaXNhICk7CisJREJHICggIlJlbW92ZWQgSVNBJTA0eFxuIiwgaXNhLT5pb2FkZHIgKTsKK30KKworLyoqCisgKiBQcm9iZSBJU0Egcm9vdCBidXMKKyAqCisgKiBAdiByb290ZGV2CQlJU0EgYnVzIHJvb3QgZGV2aWNlCisgKgorICogU2NhbnMgdGhlIElTQSBidXMgZm9yIGRldmljZXMgYW5kIHJlZ2lzdGVycyBhbGwgZGV2aWNlcyBpdCBjYW4KKyAqIGZpbmQuCisgKi8KK3N0YXRpYyBpbnQgaXNhYnVzX3Byb2JlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICkgeworCXN0cnVjdCBpc2FfZGV2aWNlICppc2EgPSBOVUxMOworCXN0cnVjdCBpc2FfZHJpdmVyICpkcml2ZXI7CisJaW50IGlvaWR4OworCWludCByYzsKKworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggZHJpdmVyLCBJU0FfRFJJVkVSUyApIHsKKwkJZm9yICggaW9pZHggPSBJU0FfSU9JRFhfTUlOICggZHJpdmVyICkgOworCQkgICAgICBpb2lkeCA8PSBJU0FfSU9JRFhfTUFYICggZHJpdmVyICkgOyBpb2lkeCsrICkgeworCQkJLyogQWxsb2NhdGUgc3RydWN0IGlzYV9kZXZpY2UgKi8KKwkJCWlmICggISBpc2EgKQorCQkJCWlzYSA9IG1hbGxvYyAoIHNpemVvZiAoICppc2EgKSApOworCQkJaWYgKCAhIGlzYSApIHsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJZ290byBlcnI7CisJCQl9CisJCQltZW1zZXQgKCBpc2EsIDAsIHNpemVvZiAoICppc2EgKSApOworCQkJaXNhLT5kcml2ZXIgPSBkcml2ZXI7CisJCQlpc2EtPmlvYWRkciA9IElTQV9JT0FERFIgKCBkcml2ZXIsIGlvaWR4ICk7CisKKwkJCS8qIEFkZCB0byBkZXZpY2UgaGllcmFyY2h5ICovCisJCQlzbnByaW50ZiAoIGlzYS0+ZGV2Lm5hbWUsIHNpemVvZiAoIGlzYS0+ZGV2Lm5hbWUgKSwKKwkJCQkgICAiSVNBJTA0eCIsIGlzYS0+aW9hZGRyICk7CisJCQlpc2EtPmRldi5kZXNjLmJ1c190eXBlID0gQlVTX1RZUEVfSVNBOworCQkJaXNhLT5kZXYuZGVzYy52ZW5kb3IgPSBkcml2ZXItPnZlbmRvcl9pZDsKKwkJCWlzYS0+ZGV2LmRlc2MuZGV2aWNlID0gZHJpdmVyLT5wcm9kX2lkOworCQkJaXNhLT5kZXYucGFyZW50ID0gJnJvb3RkZXYtPmRldjsKKwkJCWxpc3RfYWRkICggJmlzYS0+ZGV2LnNpYmxpbmdzLAorCQkJCSAgICZyb290ZGV2LT5kZXYuY2hpbGRyZW4gKTsKKwkJCUlOSVRfTElTVF9IRUFEICggJmlzYS0+ZGV2LmNoaWxkcmVuICk7CisKKwkJCS8qIFRyeSBwcm9iaW5nIGF0IHRoaXMgSS9PIGFkZHJlc3MgKi8KKwkJCWlmICggaXNhX3Byb2JlICggaXNhICkgPT0gMCApIHsKKwkJCQkvKiBpc2FkZXYgcmVnaXN0ZXJlZCwgd2UgY2FuIGRyb3Agb3VyIHJlZiAqLworCQkJCWlzYSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCS8qIE5vdCByZWdpc3RlcmVkOyByZS11c2Ugc3RydWN0ICovCisJCQkJbGlzdF9kZWwgKCAmaXNhLT5kZXYuc2libGluZ3MgKTsKKwkJCX0KKwkJfQorCX0KKworCWZyZWUgKCBpc2EgKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlmcmVlICggaXNhICk7CisJaXNhYnVzX3JlbW92ZSAoIHJvb3RkZXYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVtb3ZlIElTQSByb290IGJ1cworICoKKyAqIEB2IHJvb3RkZXYJCUlTQSBidXMgcm9vdCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaXNhYnVzX3JlbW92ZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApIHsKKwlzdHJ1Y3QgaXNhX2RldmljZSAqaXNhOworCXN0cnVjdCBpc2FfZGV2aWNlICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKCBpc2EsIHRtcCwgJnJvb3RkZXYtPmRldi5jaGlsZHJlbiwKKwkJCQkgICBkZXYuc2libGluZ3MgKSB7CisJCWlzYV9yZW1vdmUgKCBpc2EgKTsKKwkJbGlzdF9kZWwgKCAmaXNhLT5kZXYuc2libGluZ3MgKTsKKwkJZnJlZSAoIGlzYSApOworCX0KK30KKworLyoqIElTQSBidXMgcm9vdCBkZXZpY2UgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHJvb3RfZHJpdmVyIGlzYV9yb290X2RyaXZlciA9IHsKKwkucHJvYmUgPSBpc2FidXNfcHJvYmUsCisJLnJlbW92ZSA9IGlzYWJ1c19yZW1vdmUsCit9OworCisvKiogSVNBIGJ1cyByb290IGRldmljZSAqLworc3RydWN0IHJvb3RfZGV2aWNlIGlzYV9yb290X2RldmljZSBfX3Jvb3RfZGV2aWNlID0geworCS5kZXYgPSB7IC5uYW1lID0gIklTQSIgfSwKKwkuZHJpdmVyID0gJmlzYV9yb290X2RyaXZlciwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2J1cy9pc2FfaWRzLmMgYi9ncHhlL3NyYy9kcml2ZXJzL2J1cy9pc2FfaWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxMDE1OAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvYnVzL2lzYV9pZHMuYwpAQCAtMCwwICsxLDI2IEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvaXNhX2lkcy5oPgorCisvKiAKKyAqIEVJU0EgYW5kIElTQVBuUCBJRHMgYXJlIGFjdHVhbGx5IG1pbGRseSBodW1hbiByZWFkYWJsZSwgdGhvdWdoIGluIGEKKyAqIHNvbWV3aGF0IGJyYWluLWRhbWFnZWQgd2F5LgorICoKKyAqLworY2hhciAqIGlzYV9pZF9zdHJpbmcgKCB1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgcHJvZHVjdCApIHsKKwlzdGF0aWMgY2hhciBidWZbN107CisJaW50IGk7CisKKwkvKiBWZW5kb3IgSUQgaXMgYSBjb21wcmVzc2VkIEFTQ0lJIHN0cmluZyAqLworCXZlbmRvciA9IGJzd2FwXzE2ICggdmVuZG9yICk7CisJZm9yICggaSA9IDIgOyBpID49IDAgOyBpLS0gKSB7CisJCWJ1ZltpXSA9ICggJ0EnIC0gMSArICggdmVuZG9yICYgMHgxZiApICk7CisJCXZlbmRvciA+Pj0gNTsKKwl9CisJCisJLyogUHJvZHVjdCBJRCBpcyBhIDQtZGlnaXQgaGV4IHN0cmluZyAqLworCXNwcmludGYgKCAmYnVmWzNdLCAiJTA0eCIsIGJzd2FwXzE2ICggcHJvZHVjdCApICk7CisKKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9idXMvaXNhcG5wLmMgYi9ncHhlL3NyYy9kcml2ZXJzL2J1cy9pc2FwbnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y2MjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9idXMvaXNhcG5wLmMKQEAgLTAsMCArMSw3NTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICBpc2FwbnAuYyAtLSBFdGhlcmJvb3QgaXNhcG5wIHN1cHBvcnQgZm9yIHRoZSAzQ29tIDNjNTE1CisqICAgIFdyaXR0ZW4gMjAwMi0yMDAzIGJ5IFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogICAgUG9ydGlvbnMgb2YgdGhpcyBjb2RlOgorKglDb3B5cmlnaHQgKEMpIDIwMDEgIFAuSi5ILkZveCAoZm94QHJvZXN0b2NrLmRlbW9uLmNvLnVrKQorKgorKgorKiAgICBSRVZJU0lPTiBISVNUT1JZOgorKiAgICA9PT09PT09PT09PT09PT09CisqICAgIFZlcnNpb24gMC4xIEFwcmlsIDI2LCAyMDAyIFRKTAorKiAgICBWZXJzaW9uIDAuMiAwMS8wOC8yMDAzCVRKTCBNb3ZlZCBvdXRzaWRlIHRoZSAzYzUxNS5jIGRyaXZlciBmaWxlCisqICAgIFZlcnNpb24gMC4zIFNlcHQgMjMsIDIwMDMJdGltbGVnZ2UgQ2hhbmdlIGRlbGF5IHRvIGN1cnJ0aWNrcworKgkJCisqCisqICAgIEdlbmVyYWxpc2VkIGludG8gYW4gSVNBUG5QIGJ1cyB0aGF0IGNhbiBiZSB1c2VkIGJ5IG1vcmUgdGhhbiBqdXN0CisqICAgIHRoZSAzYzUxNSBieSBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIEBmaWxlCisgKgorICogSVNBUG5QIGJ1cyBzdXBwb3J0CisgKgorICogRXRoZXJib290IG9yaWduYWxseSBnYWluZWQgSVNBUG5QIHN1cHBvcnQgaW4gYSB2ZXJ5IGxpbWl0ZWQgd2F5IGZvcgorICogdGhlIDNjNTE1IE5JQy4gIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGFsbW9zdCBhIGNvbXBsZXRlCisgKiByZXdyaXRlIGJhc2VkIG9uIHRoZSBJU0FQblAgc3BlY2lmaWNhdGlvbiwgd2l0aCBwYXNzaW5nIHJlZmVyZW5jZQorICogdG8gdGhlIExpbnV4IElTQVBuUCBjb2RlLgorICoKKyAqIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBJU0FQblAgYnVzIGluIGEgc3lzdGVtLiAgT25jZSB0aGUgcmVhZCBwb3J0CisgKiBpcyBrbm93biBhbmQgYWxsIGNhcmRzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgQ1NOcywgdGhlcmUncyBub3RoaW5nIHRvCisgKiBiZSBnYWluZWQgYnkgcmUtc2Nhbm5pbmcgZm9yIGNhcmRzLgorICoKKyAqIEV4dGVybmFsIGNvZGUgKGUuZy4gdGhlIElTQVBuUCBST00gcHJlZml4KSBtYXkgYWxyZWFkeSBrbm93IHRoZQorICogcmVhZCBwb3J0IGFkZHJlc3MsIGluIHdoaWNoIGNhc2UgaXQgY2FuIHN0b3JlIGl0IGluCisgKiAjaXNhcG5wX3JlYWRfcG9ydC4gIE5vdGUgdGhhdCBzZXR0aW5nIHRoZSByZWFkIHBvcnQgYWRkcmVzcyBpbiB0aGlzCisgKiB3YXkgd2lsbCBwcmV2ZW50IGZ1cnRoZXIgaXNvbGF0aW9uIGZyb20gdGFraW5nIHBsYWNlOyB5b3Ugc2hvdWxkCisgKiBzZXQgdGhlIHJlYWQgcG9ydCBhZGRyZXNzIG9ubHkgaWYgeW91IGtub3cgdGhhdCBkZXZpY2VzIGhhdmUKKyAqIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgQ1NOcy4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxncHhlL2lzYXBucC5oPgorCisvKioKKyAqIElTQVBuUCBSZWFkIFBvcnQgYWRkcmVzcy4KKyAqCisgKiBST00gcHJlZml4IG1heSBiZSBhYmxlIHRvIHNldCB0aGlzIGFkZHJlc3MsIHdoaWNoIGlzIHdoeSB0aGlzIGlzCisgKiBub24tc3RhdGljLgorICovCit1aW50MTZfdCBpc2FwbnBfcmVhZF9wb3J0OworCitzdGF0aWMgdm9pZCBpc2FwbnBidXNfcmVtb3ZlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICk7CisKKy8qCisgKiBJU0FQblAgdXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKi8KKworI2RlZmluZSBJU0FQTlBfQ0FSRF9JRF9GTVQgIklEICUwNHg6JTA0eCAoXCIlc1wiKSBzZXJpYWwgJXgiCisjZGVmaW5lIElTQVBOUF9DQVJEX0lEX0RBVEEoaWRlbnRpZmllcikJCQkJCSAgXAorCShpZGVudGlmaWVyKS0+dmVuZG9yX2lkLCAoaWRlbnRpZmllciktPnByb2RfaWQsCQkJICBcCisJaXNhX2lkX3N0cmluZyAoIChpZGVudGlmaWVyKS0+dmVuZG9yX2lkLCAoaWRlbnRpZmllciktPnByb2RfaWQgKSwgXAorCShpZGVudGlmaWVyKS0+c2VyaWFsCisjZGVmaW5lIElTQVBOUF9ERVZfSURfRk1UICJJRCAlMDR4OiUwNHggKFwiJXNcIikiCisjZGVmaW5lIElTQVBOUF9ERVZfSURfREFUQShpc2FwbnApCQkJCQkgIFwKKwkoaXNhcG5wKS0+dmVuZG9yX2lkLCAoaXNhcG5wKS0+cHJvZF9pZCwJCQkJICBcCisJaXNhX2lkX3N0cmluZyAoIChpc2FwbnApLT52ZW5kb3JfaWQsIChpc2FwbnApLT5wcm9kX2lkICkKKworc3RhdGljIGlubGluZSB2b2lkIGlzYXBucF93cml0ZV9hZGRyZXNzICggdW5zaWduZWQgaW50IGFkZHJlc3MgKSB7CisJb3V0YiAoIGFkZHJlc3MsIElTQVBOUF9BRERSRVNTICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2FwbnBfd3JpdGVfZGF0YSAoIHVuc2lnbmVkIGludCBkYXRhICkgeworCW91dGIgKCBkYXRhLCBJU0FQTlBfV1JJVEVfREFUQSApOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpc2FwbnBfcmVhZF9kYXRhICggdm9pZCApIHsKKwlyZXR1cm4gaW5iICggaXNhcG5wX3JlYWRfcG9ydCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNhcG5wX3dyaXRlX2J5dGUgKCB1bnNpZ25lZCBpbnQgYWRkcmVzcywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHZhbHVlICkgeworCWlzYXBucF93cml0ZV9hZGRyZXNzICggYWRkcmVzcyApOworCWlzYXBucF93cml0ZV9kYXRhICggdmFsdWUgKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaXNhcG5wX3JlYWRfYnl0ZSAoIHVuc2lnbmVkIGludCBhZGRyZXNzICkgeworCWlzYXBucF93cml0ZV9hZGRyZXNzICggYWRkcmVzcyApOworCXJldHVybiBpc2FwbnBfcmVhZF9kYXRhICgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpc2FwbnBfcmVhZF93b3JkICggdW5zaWduZWQgaW50IGFkZHJlc3MgKSB7CisJLyogWWVzLCB0aGV5J3JlIGluIGJpZy1lbmRpYW4gb3JkZXIgKi8KKwlyZXR1cm4gKCAoIGlzYXBucF9yZWFkX2J5dGUgKCBhZGRyZXNzICkgPDwgOCApCisJCSB8IGlzYXBucF9yZWFkX2J5dGUgKCBhZGRyZXNzICsgMSApICk7Cit9CisKKy8qKiBJbmZvcm0gY2FyZHMgb2YgYSBuZXcgcmVhZCBwb3J0IGFkZHJlc3MgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2FwbnBfc2V0X3JlYWRfcG9ydCAoIHZvaWQgKSB7CisJaXNhcG5wX3dyaXRlX2J5dGUgKCBJU0FQTlBfUkVBRFBPUlQsICggaXNhcG5wX3JlYWRfcG9ydCA+PiAyICkgKTsKK30KKworLyoqCisgKiBFbnRlciB0aGUgSXNvbGF0aW9uIHN0YXRlLgorICoKKyAqIE9ubHkgY2FyZHMgY3VycmVudGx5IGluIHRoZSBTbGVlcCBzdGF0ZSB3aWxsIHJlc3BvbmQgdG8gdGhpcworICogY29tbWFuZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlzYXBucF9zZXJpYWxpc29sYXRpb24gKCB2b2lkICkgeworCWlzYXBucF93cml0ZV9hZGRyZXNzICggSVNBUE5QX1NFUklBTElTT0xBVElPTiApOworfQorCisvKioKKyAqIEVudGVyIHRoZSBXYWl0IGZvciBLZXkgc3RhdGUuCisgKgorICogQWxsIGNhcmRzIHdpbGwgcmVzcG9uZCB0byB0aGlzIGNvbW1hbmQsIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgY3VycmVudAorICogc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2FwbnBfd2FpdF9mb3Jfa2V5ICggdm9pZCApIHsKKwlpc2FwbnBfd3JpdGVfYnl0ZSAoIElTQVBOUF9DT05GSUdDT05UUk9MLCBJU0FQTlBfQ09ORklHX1dBSVRfRk9SX0tFWSApOworfQorCisvKioKKyAqIFJlc2V0IChpLmUuIHJlbW92ZSkgQ2FyZCBTZWxlY3QgTnVtYmVyLgorICoKKyAqIE9ubHkgY2FyZHMgY3VycmVudGx5IGluIHRoZSBTbGVlcCBzdGF0ZSB3aWxsIHJlc3BvbmQgdG8gdGhpcworICogY29tbWFuZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlzYXBucF9yZXNldF9jc24gKCB2b2lkICkgeworCWlzYXBucF93cml0ZV9ieXRlICggSVNBUE5QX0NPTkZJR0NPTlRST0wsIElTQVBOUF9DT05GSUdfUkVTRVRfQ1NOICk7Cit9CisKKy8qKgorICogUGxhY2UgYSBzcGVjaWZpZWQgY2FyZCBpbnRvIHRoZSBDb25maWcgc3RhdGUuCisgKgorICogQHYgY3NuCQlDYXJkIFNlbGVjdCBOdW1iZXIKKyAqIEByZXQgTm9uZQkJLQorICogQGVyciBOb25lCQktCisgKgorICogT25seSBjYXJkcyBjdXJyZW50bHkgaW4gdGhlIFNsZWVwLCBJc29sYXRpb24sIG9yIENvbmZpZyBzdGF0ZXMgd2lsbAorICogcmVzcG9uZCB0byB0aGlzIGNvbW1hbmQuICBUaGUgY2FyZCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIENTTiB3aWxsCisgKiBlbnRlciB0aGUgQ29uZmlnIHN0YXRlLCBhbGwgb3RoZXIgY2FyZHMgd2lsbCBlbnRlciB0aGUgU2xlZXAgc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2FwbnBfd2FrZSAoIHVpbnQ4X3QgY3NuICkgeworCWlzYXBucF93cml0ZV9ieXRlICggSVNBUE5QX1dBS0UsIGNzbiApOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpc2FwbnBfcmVhZF9yZXNvdXJjZWRhdGEgKCB2b2lkICkgeworCXJldHVybiBpc2FwbnBfcmVhZF9ieXRlICggSVNBUE5QX1JFU09VUkNFREFUQSApOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpc2FwbnBfcmVhZF9zdGF0dXMgKCB2b2lkICkgeworCXJldHVybiBpc2FwbnBfcmVhZF9ieXRlICggSVNBUE5QX1NUQVRVUyApOworfQorCisvKioKKyAqIEFzc2lnbiBhIENhcmQgU2VsZWN0IE51bWJlciB0byBhIGNhcmQsIGFuZCBlbnRlciB0aGUgQ29uZmlnIHN0YXRlLgorICoKKyAqIEB2IGNzbgkJQ2FyZCBTZWxlY3QgTnVtYmVyCisgKgorICogT25seSBjYXJkcyBpbiB0aGUgSXNvbGF0aW9uIHN0YXRlIHdpbGwgcmVzcG9uZCB0byB0aGlzIGNvbW1hbmQuCisgKiBUaGUgaXNvbGF0aW9uIHByb3RvY29sIGlzIGRlc2lnbmVkIHNvIHRoYXQgb25seSBvbmUgY2FyZCB3aWxsCisgKiByZW1haW4gaW4gdGhlIElzb2xhdGlvbiBzdGF0ZSBieSB0aGUgdGltZSB0aGUgaXNvbGF0aW9uIHByb3RvY29sCisgKiBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2FwbnBfd3JpdGVfY3NuICggdW5zaWduZWQgaW50IGNzbiApIHsKKwlpc2FwbnBfd3JpdGVfYnl0ZSAoIElTQVBOUF9DQVJEU0VMRUNUTlVNQkVSLCBjc24gKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzYXBucF9sb2dpY2FsZGV2aWNlICggdW5zaWduZWQgaW50IGxvZ2RldiApIHsKKwlpc2FwbnBfd3JpdGVfYnl0ZSAoIElTQVBOUF9MT0dJQ0FMREVWSUNFTlVNQkVSLCBsb2dkZXYgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzYXBucF9hY3RpdmF0ZSAoIHVuc2lnbmVkIGludCBsb2dkZXYgKSB7CisJaXNhcG5wX2xvZ2ljYWxkZXZpY2UgKCBsb2dkZXYgKTsKKwlpc2FwbnBfd3JpdGVfYnl0ZSAoIElTQVBOUF9BQ1RJVkFURSwgMSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNhcG5wX2RlYWN0aXZhdGUgKCB1bnNpZ25lZCBpbnQgbG9nZGV2ICkgeworCWlzYXBucF9sb2dpY2FsZGV2aWNlICggbG9nZGV2ICk7CisJaXNhcG5wX3dyaXRlX2J5dGUgKCBJU0FQTlBfQUNUSVZBVEUsIDAgKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaXNhcG5wX3JlYWRfaW9iYXNlICggdW5zaWduZWQgaW50IGluZGV4ICkgeworCXJldHVybiBpc2FwbnBfcmVhZF93b3JkICggSVNBUE5QX0lPQkFTRSAoIGluZGV4ICkgKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaXNhcG5wX3JlYWRfaXJxbm8gKCB1bnNpZ25lZCBpbnQgaW5kZXggKSB7CisJcmV0dXJuIGlzYXBucF9yZWFkX2J5dGUgKCBJU0FQTlBfSVJRTk8gKCBpbmRleCApICk7Cit9CisKK3N0YXRpYyB2b2lkIGlzYXBucF9kZWxheSAoIHZvaWQgKSB7CisJdWRlbGF5ICggMTAwMCApOworfQorCisvKioKKyAqIExpbmVhciBmZWVkYmFjayBzaGlmdCByZWdpc3Rlci4KKyAqCisgKiBAdiBsZnNyCQlDdXJyZW50IHZhbHVlIG9mIHRoZSBMRlNSCisgKiBAdiBpbnB1dF9iaXQJCUN1cnJlbnQgaW5wdXQgYml0IHRvIHRoZSBMRlNSCisgKiBAcmV0IGxmc3IJCU5leHQgdmFsdWUgb2YgdGhlIExGU1IKKyAqCisgKiBUaGlzIHJvdXRpbmUgaW1wbGVtZW50cyB0aGUgbGluZWFyIGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVyIGFzCisgKiBkZXNjcmliZWQgaW4gQXBwZW5kaXggQiBvZiB0aGUgUG5QIElTQSBzcGVjLiAgVGhlIGhhcmR3YXJlCisgKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGVpZ2h0IEQtdHlwZSBsYXRjaGVzIGFuZCB0d28gWE9SIGdhdGVzLiAgSQorICogdGhpbmsgdGhpcyBpcyBwcm9iYWJseSB0aGUgc21hbGxlc3QgcG9zc2libGUgaW1wbGVtZW50YXRpb24gaW4KKyAqIHNvZnR3YXJlLiAgU2l4IGluc3RydWN0aW9ucyB3aGVuIGlucHV0X2JpdCBpcyBhIGNvbnN0YW50IDAgKGZvcgorICogaXNhcG5wX3NlbmRfa2V5KS4gIDopCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlzYXBucF9sZnNyX25leHQgKCB1bnNpZ25lZCBpbnQgbGZzciwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IGlucHV0X2JpdCApIHsKKwlyZWdpc3RlciB1aW50OF90IGxmc3JfbmV4dDsKKworCWxmc3JfbmV4dCA9IGxmc3IgPj4gMTsKKwlsZnNyX25leHQgfD0gKCAoICggbGZzciBeIGxmc3JfbmV4dCApIF4gaW5wdXRfYml0ICkgKSA8PCA3OworCXJldHVybiBsZnNyX25leHQ7Cit9CisKKy8qKgorICogU2VuZCB0aGUgSVNBUG5QIGluaXRpYXRpb24ga2V5LgorICoKKyAqIFNlbmRpbmcgdGhlIGtleSBjYXVzZXMgYWxsIElTQVBuUCBjYXJkcyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdGhlCisgKiBXYWl0IGZvciBLZXkgc3RhdGUgdG8gdHJhbnNpdGlvbiBpbnRvIHRoZSBTbGVlcCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgaXNhcG5wX3NlbmRfa2V5ICggdm9pZCApIHsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbGZzcjsKKworCWlzYXBucF9kZWxheSgpOworCWlzYXBucF93cml0ZV9hZGRyZXNzICggMHgwMCApOworCWlzYXBucF93cml0ZV9hZGRyZXNzICggMHgwMCApOworCisJbGZzciA9IElTQVBOUF9MRlNSX1NFRUQ7CisJZm9yICggaSA9IDAgOyBpIDwgMzIgOyBpKysgKSB7CisJCWlzYXBucF93cml0ZV9hZGRyZXNzICggbGZzciApOworCQlsZnNyID0gaXNhcG5wX2xmc3JfbmV4dCAoIGxmc3IsIDAgKTsKKwl9Cit9CisKKy8qKgorICogQ29tcHV0ZSBJU0FQblAgaWRlbnRpZmllciBjaGVja3N1bQorICoKKyAqIEB2IGlkZW50aWZpZXIJSVNBUG5QIGlkZW50aWZpZXIKKyAqIEByZXQgY2hlY2tzdW0JRXhwZWN0ZWQgY2hlY2tzdW0gdmFsdWUKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBpc2FwbnBfY2hlY2tzdW0gKCBzdHJ1Y3QgaXNhcG5wX2lkZW50aWZpZXIgKmlkZW50aWZpZXIgKSB7CisJdW5zaWduZWQgaW50IGksIGo7CisJdW5zaWduZWQgaW50IGxmc3I7CisJdW5zaWduZWQgaW50IGJ5dGU7CisKKwlsZnNyID0gSVNBUE5QX0xGU1JfU0VFRDsKKwlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgeworCQlieXRlID0gKiAoICggKCB1aW50OF90ICogKSBpZGVudGlmaWVyICkgKyBpICk7CisJCWZvciAoIGogPSAwIDsgaiA8IDggOyBqKysgKSB7CisJCQlsZnNyID0gaXNhcG5wX2xmc3JfbmV4dCAoIGxmc3IsIGJ5dGUgKTsKKwkJCWJ5dGUgPj49IDE7CisJCX0KKwl9CisJcmV0dXJuIGxmc3I7Cit9CisKKy8qCisgKiBSZWFkIGEgYnl0ZSBvZiByZXNvdXJjZSBkYXRhIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24KKyAqCisgKiBAcmV0IGJ5dGUJCUJ5dGUgb2YgcmVzb3VyY2UgZGF0YQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpc2FwbnBfcGVla19ieXRlICggdm9pZCApIHsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFdhaXQgZm9yIGRhdGEgdG8gYmUgcmVhZHkgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCAyMCA7IGkrKyApIHsKKwkJaWYgKCBpc2FwbnBfcmVhZF9zdGF0dXMoKSAmIDB4MDEgKSB7CisJCQkvKiBCeXRlIHJlYWR5IC0gcmVhZCBpdCAqLworCQkJcmV0dXJuIGlzYXBucF9yZWFkX3Jlc291cmNlZGF0YSgpOworCQl9CisJCWlzYXBucF9kZWxheSgpOworCX0KKwkvKiBEYXRhIG5ldmVyIGJlY2FtZSByZWFkeSAtIHJldHVybiAweGZmICovCisJcmV0dXJuIDB4ZmY7Cit9CisKKy8qKgorICogUmVhZCByZXNvdXJjZSBkYXRhLgorICoKKyAqIEB2IGJ1ZgkJQnVmZmVyIGluIHdoaWNoIHRvIHN0b3JlIGRhdGEsIG9yIE5VTEwKKyAqIEB2IGJ5dGVzCQlOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICoKKyAqIFJlc291cmNlIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgSWYgI2J1ZiBpcyBOVUxMLAorICogdGhlIGRhdGEgaXMgZGlzY2FyZGVkLgorICovCitzdGF0aWMgdm9pZCBpc2FwbnBfcGVlayAoIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiApIHsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgYnl0ZTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGxlbiA7IGkrKykgeworCQlieXRlID0gaXNhcG5wX3BlZWtfYnl0ZSgpOworCQlpZiAoIGJ1ZiApCisJCQkqICggKCB1aW50OF90ICogKSBidWYgKyBpICkgPSBieXRlOworCX0KK30KKworLyoqCisgKiBGaW5kIGEgdGFnIHdpdGhpbiB0aGUgcmVzb3VyY2UgZGF0YS4KKyAqCisgKiBAdiB3YW50ZWRfdGFnCVRoZSB0YWcgdGhhdCB3ZSdyZSBsb29raW5nIGZvcgorICogQHYgYnVmCQlCdWZmZXIgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHRhZydzIGNvbnRlbnRzCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFNjYW4gdGhyb3VnaCB0aGUgcmVzb3VyY2UgZGF0YSB1bnRpbCB3ZSBmaW5kIGEgcGFydGljdWxhciB0YWcsIGFuZAorICogcmVhZCBpdHMgY29udGVudHMgaW50byBhIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBpc2FwbnBfZmluZF90YWcgKCB1bnNpZ25lZCBpbnQgd2FudGVkX3RhZywgdm9pZCAqYnVmLCBzaXplX3QgbGVuICkgeworCXVuc2lnbmVkIGludCB0YWc7CisJdW5zaWduZWQgaW50IHRhZ19sZW47CisKKwlEQkcyICggIklTQVBuUCByZWFkIHRhZyIgKTsKKwlkbyB7CisJCXRhZyA9IGlzYXBucF9wZWVrX2J5dGUoKTsKKwkJaWYgKCBJU0FQTlBfSVNfU01BTExfVEFHICggdGFnICkgKSB7CisJCQl0YWdfbGVuID0gSVNBUE5QX1NNQUxMX1RBR19MRU4gKCB0YWcgKTsKKwkJCXRhZyA9IElTQVBOUF9TTUFMTF9UQUdfTkFNRSAoIHRhZyApOworCQl9IGVsc2UgeworCQkJdGFnX2xlbiA9ICggaXNhcG5wX3BlZWtfYnl0ZSgpICsKKwkJCQkgICAgKCBpc2FwbnBfcGVla19ieXRlKCkgPDwgOCApICk7CisJCQl0YWcgPSBJU0FQTlBfTEFSR0VfVEFHX05BTUUgKCB0YWcgKTsKKwkJfQorCQlEQkcyICggIiAlMDJ4ICglMDJ4KSIsIHRhZywgdGFnX2xlbiApOworCQlpZiAoIHRhZyA9PSB3YW50ZWRfdGFnICkgeworCQkJaWYgKCBsZW4gPiB0YWdfbGVuICkKKwkJCQlsZW4gPSB0YWdfbGVuOworCQkJaXNhcG5wX3BlZWsgKCBidWYsIGxlbiApOworCQkJREJHMiAoICJcbiIgKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJaXNhcG5wX3BlZWsgKCBOVUxMLCB0YWdfbGVuICk7CisJCX0KKwl9IHdoaWxlICggdGFnICE9IElTQVBOUF9UQUdfRU5EICk7CisJREJHMiAoICJcbiIgKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoqCisgKiBGaW5kIHNwZWNpZmllZCBMb2dpY2FsIERldmljZSBJRCB0YWcKKyAqCisgKiBAdiBsb2dkZXYJCUxvZ2ljYWwgZGV2aWNlIElECisgKiBAdiBsb2dkZXZpZAkJTG9naWNhbCBkZXZpY2UgSUQgc3RydWN0dXJlIHRvIGZpbGwgaW4KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlzYXBucF9maW5kX2xvZ2RldmlkICggdW5zaWduZWQgaW50IGxvZ2RldiwKKwkJCQkgIHN0cnVjdCBpc2FwbnBfbG9nZGV2aWQgKmxvZ2RldmlkICkgeworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCWZvciAoIGkgPSAwIDsgaSA8PSBsb2dkZXYgOyBpKysgKSB7CisJCWlmICggKCByYyA9IGlzYXBucF9maW5kX3RhZyAoIElTQVBOUF9UQUdfTE9HREVWSUQsIGxvZ2RldmlkLAorCQkJCQkgICAgICBzaXplb2YgKCAqbG9nZGV2aWQgKSApICkgIT0gMCApCisJCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIFRyeSBpc29sYXRpbmcgSVNBUG5QIGNhcmRzIGF0IHRoZSBjdXJyZW50IHJlYWQgcG9ydC4KKyAqCisgKiBAcmV0IFw+MAkJTnVtYmVyIG9mIElTQVBuUCBjYXJkcyBmb3VuZAorICogQHJldCAwCQlUaGVyZSBhcmUgbm8gSVNBUG5QIGNhcmRzIGluIHRoZSBzeXN0ZW0KKyAqIEByZXQgXDwwCQlBIGNvbmZsaWN0IHdhcyBkZXRlY3RlZDsgdHJ5IGEgbmV3IHJlYWQgcG9ydAorICogQGVyciBOb25lCQktCisgKgorICogVGhlIHN0YXRlIGRpYWdyYW0gb24gcGFnZSAxOCAoUERGIHBhZ2UgMjQpIG9mIHRoZSBQblAgSVNBIHNwZWMKKyAqIGdpdmVzIHRoZSBiZXN0IG92ZXJ2aWV3IG9mIHdoYXQgaGFwcGVucyBoZXJlLgorICovCitzdGF0aWMgaW50IGlzYXBucF90cnlfaXNvbGF0ZSAoIHZvaWQgKSB7CisJc3RydWN0IGlzYXBucF9pZGVudGlmaWVyIGlkZW50aWZpZXI7CisJdW5zaWduZWQgaW50IGksIGo7CisJdW5zaWduZWQgaW50IHNlZW5fNTVhYSwgc2Vlbl9saWZlOworCXVuc2lnbmVkIGludCBjc24gPSAwOworCXVuc2lnbmVkIGludCBkYXRhOworCXVuc2lnbmVkIGludCBieXRlOworCisJREJHICggIklTQVBuUCBhdHRlbXB0aW5nIGlzb2xhdGlvbiBhdCByZWFkIHBvcnQgJTA0eFxuIiwKKwkgICAgICBpc2FwbnBfcmVhZF9wb3J0ICk7CisKKwkvKiBQbGFjZSBhbGwgY2FyZHMgaW50byB0aGUgU2xlZXAgc3RhdGUsIHdoYXRldmVyIHN0YXRlCisJICogdGhleSdyZSBjdXJyZW50bHkgaW4uCisJICovCisJaXNhcG5wX3dhaXRfZm9yX2tleSgpOworCWlzYXBucF9zZW5kX2tleSgpOworCisJLyogUmVzZXQgYWxsIGFzc2lnbmVkIENTTnMgKi8KKwlpc2FwbnBfcmVzZXRfY3NuKCk7CisJaXNhcG5wX2RlbGF5KCk7CisJaXNhcG5wX2RlbGF5KCk7CisJCisJLyogUGxhY2UgYWxsIGNhcmRzIGludG8gdGhlIElzb2xhdGlvbiBzdGF0ZSAqLworCWlzYXBucF93YWl0X2Zvcl9rZXkgKCk7CisJaXNhcG5wX3NlbmRfa2V5KCk7CisJaXNhcG5wX3dha2UgKCAweDAwICk7CisJCisJLyogU2V0IHRoZSByZWFkIHBvcnQgKi8KKwlpc2FwbnBfc2V0X3JlYWRfcG9ydCgpOworCWlzYXBucF9kZWxheSgpOworCisJd2hpbGUgKCAxICkgeworCisJCS8qIEFsbCBjYXJkcyB0aGF0IGRvIG5vdCBoYXZlIGFzc2lnbmVkIENTTnMgYXJlCisJCSAqIGN1cnJlbnRseSBpbiB0aGUgSXNvbGF0aW9uIHN0YXRlLCBlYWNoIHRpbWUgd2UgZ28KKwkJICogdGhyb3VnaCB0aGlzIGxvb3AuCisJCSAqLworCisJCS8qIEluaXRpYXRlIHNlcmlhbCBpc29sYXRpb24gKi8KKwkJaXNhcG5wX3NlcmlhbGlzb2xhdGlvbigpOworCQlpc2FwbnBfZGVsYXkoKTsKKworCQkvKiBSZWFkIGlkZW50aWZpZXIgc2VyaWFsbHkgdmlhIHRoZSBJU0FQblAgcmVhZCBwb3J0LiAqLworCQltZW1zZXQgKCAmaWRlbnRpZmllciwgMCwgc2l6ZW9mICggaWRlbnRpZmllciApICk7CisJCXNlZW5fNTVhYSA9IHNlZW5fbGlmZSA9IDA7CisJCWZvciAoIGkgPSAwIDsgaSA8IDkgOyBpKysgKSB7CisJCQlieXRlID0gMDsKKwkJCWZvciAoIGogPSAwIDsgaiA8IDggOyBqKysgKSB7CisJCQkJZGF0YSA9IGlzYXBucF9yZWFkX2RhdGEoKTsKKwkJCQlpc2FwbnBfZGVsYXkoKTsKKwkJCQlkYXRhID0gKCAoIGRhdGEgPDwgOCApIHwgaXNhcG5wX3JlYWRfZGF0YSgpICk7CisJCQkJaXNhcG5wX2RlbGF5KCk7CisJCQkJYnl0ZSA+Pj0gMTsKKwkJCQlpZiAoICBkYXRhICE9IDB4ZmZmZiApIHsKKwkJCQkJc2Vlbl9saWZlKys7CisJCQkJCWlmICggZGF0YSA9PSAweDU1YWEgKSB7CisJCQkJCQlieXRlIHw9IDB4ODA7CisJCQkJCQlzZWVuXzU1YWErKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCSooICggKCB1aW50OF90ICogKSAmaWRlbnRpZmllciApICsgaSApID0gYnl0ZTsKKwkJfQorCisJCS8qIElmIHdlIGRpZG4ndCBzZWUgYW55IDU1YWEgcGF0dGVybnMsIHN0b3AgaGVyZSAqLworCQlpZiAoICEgc2Vlbl81NWFhICkgeworCQkJaWYgKCBjc24gKSB7CisJCQkJREJHICggIklTQVBuUCBmb3VuZCBubyBtb3JlIGNhcmRzXG4iICk7CisJCQl9IGVsc2UgeworCQkJCWlmICggc2Vlbl9saWZlICkgeworCQkJCQlEQkcgKCAiSVNBUG5QIHNhdyBsaWZlIGJ1dCBubyBjYXJkcywgIgorCQkJCQkgICAgICAidHJ5aW5nIG5ldyByZWFkIHBvcnRcbiIgKTsKKwkJCQkJY3NuID0gLTE7CisJCQkJfSBlbHNlIHsKKwkJCQkJREJHICggIklTQVBuUCBzYXcgbm8gc2lnbnMgb2YgbGlmZSwgIgorCQkJCQkgICAgICAiYWJhbmRvbmluZyBpc29sYXRpb25cbiIgKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIElmIHRoZSBjaGVja3N1bSB3YXMgaW52YWxpZCBzdG9wIGhlcmUgKi8KKwkJaWYgKCBpZGVudGlmaWVyLmNoZWNrc3VtICE9IGlzYXBucF9jaGVja3N1bSAoICZpZGVudGlmaWVyKSApIHsKKwkJCURCRyAoICJJU0FQblAgZm91bmQgbWFsZm9ybWVkIGNhcmQgIgorCQkJICAgICAgSVNBUE5QX0NBUkRfSURfRk1UICJcbiAgd2l0aCBjaGVja3N1bSAlMDJ4ICIKKwkJCSAgICAgICIoc2hvdWxkIGJlICUwMngpLCB0cnlpbmcgbmV3IHJlYWQgcG9ydFxuIiwKKwkJCSAgICAgIElTQVBOUF9DQVJEX0lEX0RBVEEgKCAmaWRlbnRpZmllciApLAorCQkJICAgICAgaWRlbnRpZmllci5jaGVja3N1bSwKKwkJCSAgICAgIGlzYXBucF9jaGVja3N1bSAoICZpZGVudGlmaWVyKSApOworCQkJY3NuID0gLTE7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEdpdmUgdGhlIGRldmljZSBhIENTTiAqLworCQljc24rKzsKKwkJREJHICggIklTQVBuUCBmb3VuZCBjYXJkICIgSVNBUE5QX0NBUkRfSURfRk1UCisJCSAgICAgICIsIGFzc2lnbmluZyBDU04gJTAyeFxuIiwKKwkJICAgICAgSVNBUE5QX0NBUkRfSURfREFUQSAoICZpZGVudGlmaWVyICksIGNzbiApOworCQkKKwkJaXNhcG5wX3dyaXRlX2NzbiAoIGNzbiApOworCQlpc2FwbnBfZGVsYXkoKTsKKworCQkvKiBTZW5kIHRoaXMgY2FyZCBiYWNrIHRvIFNsZWVwIGFuZCBmb3JjZSBhbGwgY2FyZHMKKwkJICogd2l0aG91dCBhIENTTiBpbnRvIElzb2xhdGlvbiBzdGF0ZQorCQkgKi8KKwkJaXNhcG5wX3dha2UgKCAweDAwICk7CisJCWlzYXBucF9kZWxheSgpOworCX0KKworCS8qIFBsYWNlIGFsbCBjYXJkcyBpbiBXYWl0IGZvciBLZXkgc3RhdGUgKi8KKwlpc2FwbnBfd2FpdF9mb3Jfa2V5KCk7CisKKwkvKiBSZXR1cm4gbnVtYmVyIG9mIGNhcmRzIGZvdW5kICovCisJaWYgKCBjc24gPiAwICkgeworCQlEQkcgKCAiSVNBUG5QIGZvdW5kICVkIGNhcmRzIGF0IHJlYWQgcG9ydCAlMDR4XG4iLAorCQkgICAgICBjc24sIGlzYXBucF9yZWFkX3BvcnQgKTsKKwl9CisJcmV0dXJuIGNzbjsKK30KKworLyoqCisgKiBGaW5kIGEgdmFsaWQgcmVhZCBwb3J0IGFuZCBpc29sYXRlIGFsbCBJU0FQblAgY2FyZHMuCisgKgorICovCitzdGF0aWMgdm9pZCBpc2FwbnBfaXNvbGF0ZSAoIHZvaWQgKSB7CisJZm9yICggaXNhcG5wX3JlYWRfcG9ydCA9IElTQVBOUF9SRUFEX1BPUlRfU1RBUlQgOworCSAgICAgIGlzYXBucF9yZWFkX3BvcnQgPD0gSVNBUE5QX1JFQURfUE9SVF9NQVggOworCSAgICAgIGlzYXBucF9yZWFkX3BvcnQgKz0gSVNBUE5QX1JFQURfUE9SVF9TVEVQICkgeworCQkvKiBBdm9pZCBwcm9ibGVtYXRpYyBsb2NhdGlvbnMgc3VjaCBhcyB0aGUgTkUyMDAwCisJCSAqIHByb2JlIHNwYWNlCisJCSAqLworCQlpZiAoICggaXNhcG5wX3JlYWRfcG9ydCA+PSAweDI4MCApICYmCisJCSAgICAgKCBpc2FwbnBfcmVhZF9wb3J0IDw9IDB4MzgwICkgKQorCQkJY29udGludWU7CisJCQorCQkvKiBJZiB3ZSBkZXRlY3QgYW55IElTQVBuUCBjYXJkcyBhdCB0aGlzIGxvY2F0aW9uLCBzdG9wICovCisJCWlmICggaXNhcG5wX3RyeV9pc29sYXRlKCkgPj0gMCApCisJCQlyZXR1cm47CisJfQorfQorCisvKioKKyAqIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgYW4gSVNBUG5QIGRldmljZS4KKyAqCisgKiBAdiBpc2FwbnAJCUlTQVBuUCBkZXZpY2UKKyAqIEB2IGFjdGl2YXRpb24JVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvIGRpc2FibGUgdGhlIGRldmljZQorICogQHJldCBOb25lCQktCisgKiBAZXJyIE5vbmUJCS0KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2ltcGx5IGFjdGl2YXRlcyB0aGUgZGV2aWNlIGluIGl0cyBjdXJyZW50CisgKiBjb25maWd1cmF0aW9uLCBvciBkZWFjdGl2YXRlcyB0aGUgZGV2aWNlLiAgSXQgZG9lcyBub3QgYXR0ZW1wdCBhbnkKKyAqIGtpbmQgb2YgcmVzb3VyY2UgYXJiaXRyYXRpb24uCisgKgorICovCit2b2lkIGlzYXBucF9kZXZpY2VfYWN0aXZhdGlvbiAoIHN0cnVjdCBpc2FwbnBfZGV2aWNlICppc2FwbnAsCisJCQkJaW50IGFjdGl2YXRpb24gKSB7CisJLyogV2FrZSB0aGUgY2FyZCBhbmQgc2VsZWN0IHRoZSBsb2dpY2FsIGRldmljZSAqLworCWlzYXBucF93YWl0X2Zvcl9rZXkgKCk7CisJaXNhcG5wX3NlbmRfa2V5ICgpOworCWlzYXBucF93YWtlICggaXNhcG5wLT5jc24gKTsKKwlpc2FwbnBfbG9naWNhbGRldmljZSAoIGlzYXBucC0+bG9nZGV2ICk7CisKKwkvKiBBY3RpdmF0ZS9kZWFjdGl2YXRlIHRoZSBsb2dpY2FsIGRldmljZSAqLworCWlzYXBucF9hY3RpdmF0ZSAoIGFjdGl2YXRpb24gKTsKKwlpc2FwbnBfZGVsYXkoKTsKKworCS8qIFJldHVybiBhbGwgY2FyZHMgdG8gV2FpdCBmb3IgS2V5IHN0YXRlICovCisJaXNhcG5wX3dhaXRfZm9yX2tleSAoKTsKKworCURCRyAoICJJU0FQblAgJXMgZGV2aWNlICUwMng6JTAyeFxuIiwKKwkgICAgICAoIGFjdGl2YXRpb24gPyAiYWN0aXZhdGVkIiA6ICJkZWFjdGl2YXRlZCIgKSwKKwkgICAgICBpc2FwbnAtPmNzbiwgaXNhcG5wLT5sb2dkZXYgKTsKK30KKworLyoqCisgKiBQcm9iZSBhbiBJU0FQblAgZGV2aWNlCisgKgorICogQHYgaXNhcG5wCQlJU0FQblAgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBTZWFyY2hlcyBmb3IgYSBkcml2ZXIgZm9yIHRoZSBJU0FQblAgZGV2aWNlLiAgSWYgYSBkcml2ZXIgaXMgZm91bmQsCisgKiBpdHMgcHJvYmUoKSByb3V0aW5lIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIGludCBpc2FwbnBfcHJvYmUgKCBzdHJ1Y3QgaXNhcG5wX2RldmljZSAqaXNhcG5wICkgeworCXN0cnVjdCBpc2FwbnBfZHJpdmVyICpkcml2ZXI7CisJc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgKmlkOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCURCRyAoICJBZGRpbmcgSVNBUG5QIGRldmljZSAlMDJ4OiUwMnggKCUwNHg6JTA0eCAoXCIlc1wiKSAiCisJICAgICAgImlvICV4IGlycSAlZClcbiIsIGlzYXBucC0+Y3NuLCBpc2FwbnAtPmxvZ2RldiwKKwkgICAgICBpc2FwbnAtPnZlbmRvcl9pZCwgaXNhcG5wLT5wcm9kX2lkLAorCSAgICAgIGlzYV9pZF9zdHJpbmcgKCBpc2FwbnAtPnZlbmRvcl9pZCwgaXNhcG5wLT5wcm9kX2lkICksCisJICAgICAgaXNhcG5wLT5pb2FkZHIsIGlzYXBucC0+aXJxbm8gKTsKKworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggZHJpdmVyLCBJU0FQTlBfRFJJVkVSUyApIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgZHJpdmVyLT5pZF9jb3VudCA7IGkrKyApIHsKKwkJCWlkID0gJmRyaXZlci0+aWRzW2ldOworCQkJaWYgKCBpZC0+dmVuZG9yX2lkICE9IGlzYXBucC0+dmVuZG9yX2lkICkKKwkJCQljb250aW51ZTsKKwkJCWlmICggSVNBX1BST0RfSUQgKCBpZC0+cHJvZF9pZCApICE9CisJCQkgICAgIElTQV9QUk9EX0lEICggaXNhcG5wLT5wcm9kX2lkICkgKQorCQkJCWNvbnRpbnVlOworCQkJaXNhcG5wLT5kcml2ZXIgPSBkcml2ZXI7CisJCQlpc2FwbnAtPmRyaXZlcl9uYW1lID0gaWQtPm5hbWU7CisJCQlEQkcgKCAiLi4udXNpbmcgZHJpdmVyICVzXG4iLCBpc2FwbnAtPmRyaXZlcl9uYW1lICk7CisJCQlpZiAoICggcmMgPSBkcml2ZXItPnByb2JlICggaXNhcG5wLCBpZCApICkgIT0gMCApIHsKKwkJCQlEQkcgKCAiLi4uLi4ucHJvYmUgZmFpbGVkXG4iICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCURCRyAoICIuLi5ubyBkcml2ZXIgZm91bmRcbiIgKTsKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyoqCisgKiBSZW1vdmUgYW4gSVNBUG5QIGRldmljZQorICoKKyAqIEB2IGlzYXBucAkJSVNBUG5QIGRldmljZQorICovCitzdGF0aWMgdm9pZCBpc2FwbnBfcmVtb3ZlICggc3RydWN0IGlzYXBucF9kZXZpY2UgKmlzYXBucCApIHsKKwlpc2FwbnAtPmRyaXZlci0+cmVtb3ZlICggaXNhcG5wICk7CisJREJHICggIlJlbW92ZWQgSVNBUG5QIGRldmljZSAlMDJ4OiUwMnhcbiIsCisJICAgICAgaXNhcG5wLT5jc24sIGlzYXBucC0+bG9nZGV2ICk7Cit9CisKKy8qKgorICogUHJvYmUgSVNBUG5QIHJvb3QgYnVzCisgKgorICogQHYgcm9vdGRldgkJSVNBUG5QIGJ1cyByb290IGRldmljZQorICoKKyAqIFNjYW5zIHRoZSBJU0FQblAgYnVzIGZvciBkZXZpY2VzIGFuZCByZWdpc3RlcnMgYWxsIGRldmljZXMgaXQgY2FuCisgKiBmaW5kLgorICovCitzdGF0aWMgaW50IGlzYXBucGJ1c19wcm9iZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApIHsKKwlzdHJ1Y3QgaXNhcG5wX2RldmljZSAqaXNhcG5wID0gTlVMTDsKKwlzdHJ1Y3QgaXNhcG5wX2lkZW50aWZpZXIgaWRlbnRpZmllcjsKKwlzdHJ1Y3QgaXNhcG5wX2xvZ2RldmlkIGxvZ2RldmlkOworCXVuc2lnbmVkIGludCBjc247CisJdW5zaWduZWQgaW50IGxvZ2RldjsKKwlpbnQgcmM7CisKKwkvKiBQZXJmb3JtIGlzb2xhdGlvbiBpZiBpdCBoYXNuJ3QgeWV0IGJlZW4gZG9uZSAqLworCWlmICggISBpc2FwbnBfcmVhZF9wb3J0ICkKKwkJaXNhcG5wX2lzb2xhdGUoKTsKKworCWZvciAoIGNzbiA9IDEgOyBjc24gPD0gMHhmZiA7IGNzbisrICkgeworCQlmb3IgKCBsb2dkZXYgPSAwIDsgbG9nZGV2IDw9IDB4ZmYgOyBsb2dkZXYrKyApIHsKKworCQkJLyogQWxsb2NhdGUgc3RydWN0IGlzYXBucF9kZXZpY2UgKi8KKwkJCWlmICggISBpc2FwbnAgKQorCQkJCWlzYXBucCA9IG1hbGxvYyAoIHNpemVvZiAoICppc2FwbnAgKSApOworCQkJaWYgKCAhIGlzYXBucCApIHsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJZ290byBlcnI7CisJCQl9CisJCQltZW1zZXQgKCBpc2FwbnAsIDAsIHNpemVvZiAoICppc2FwbnAgKSApOworCQkJaXNhcG5wLT5jc24gPSBjc247CisJCQlpc2FwbnAtPmxvZ2RldiA9IGxvZ2RldjsKKworCQkJLyogV2FrZSB0aGUgY2FyZCAqLworCQkJaXNhcG5wX3dhaXRfZm9yX2tleSgpOworCQkJaXNhcG5wX3NlbmRfa2V5KCk7CisJCQlpc2FwbnBfd2FrZSAoIGNzbiApOworCisJCQkvKiBSZWFkIHRoZSBjYXJkIGlkZW50aWZpZXIgKi8KKwkJCWlzYXBucF9wZWVrICggJmlkZW50aWZpZXIsIHNpemVvZiAoIGlkZW50aWZpZXIgKSApOworCQkJCisJCQkvKiBObyBjYXJkIHdpdGggdGhpcyBDU047IHN0b3AgaGVyZSAqLworCQkJaWYgKCBpZGVudGlmaWVyLnZlbmRvcl9pZCAmIDB4ODAgKQorCQkJCWdvdG8gZG9uZTsKKworCQkJLyogRmluZCB0aGUgTG9naWNhbCBEZXZpY2UgSUQgdGFnICovCisJCQlpZiAoICggcmMgPSBpc2FwbnBfZmluZF9sb2dkZXZpZCAoIGxvZ2RldiwKKwkJCQkJCQkgICAmbG9nZGV2aWQgKSApICE9IDApeworCQkJCS8qIE5vIG1vcmUgbG9naWNhbCBkZXZpY2VzOyBnbyB0byBuZXh0IENTTiAqLworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKiBTZWxlY3QgdGhlIGxvZ2ljYWwgZGV2aWNlICovCisJCQlpc2FwbnBfbG9naWNhbGRldmljZSAoIGxvZ2RldiApOworCisJCQkvKiBQb3B1bGF0ZSBzdHJ1Y3QgaXNhcG5wX2RldmljZSAqLworCQkJaXNhcG5wLT52ZW5kb3JfaWQgPSBsb2dkZXZpZC52ZW5kb3JfaWQ7CisJCQlpc2FwbnAtPnByb2RfaWQgPSBsb2dkZXZpZC5wcm9kX2lkOworCQkJaXNhcG5wLT5pb2FkZHIgPSBpc2FwbnBfcmVhZF9pb2Jhc2UgKCAwICk7CisJCQlpc2FwbnAtPmlycW5vID0gaXNhcG5wX3JlYWRfaXJxbm8gKCAwICk7CisKKwkJCS8qIFJldHVybiBhbGwgY2FyZHMgdG8gV2FpdCBmb3IgS2V5IHN0YXRlICovCisJCQlpc2FwbnBfd2FpdF9mb3Jfa2V5KCk7CisKKwkJCS8qIEFkZCB0byBkZXZpY2UgaGllcmFyY2h5ICovCisJCQlzbnByaW50ZiAoIGlzYXBucC0+ZGV2Lm5hbWUsCisJCQkJICAgc2l6ZW9mICggaXNhcG5wLT5kZXYubmFtZSApLAorCQkJCSAgICJJU0FQblAlMDJ4OiUwMngiLCBjc24sIGxvZ2RldiApOworCQkJaXNhcG5wLT5kZXYuZGVzYy5idXNfdHlwZSA9IEJVU19UWVBFX0lTQVBOUDsKKwkJCWlzYXBucC0+ZGV2LmRlc2MudmVuZG9yID0gaXNhcG5wLT52ZW5kb3JfaWQ7CisJCQlpc2FwbnAtPmRldi5kZXNjLmRldmljZSA9IGlzYXBucC0+cHJvZF9pZDsKKwkJCWlzYXBucC0+ZGV2LmRlc2MuaW9hZGRyID0gaXNhcG5wLT5pb2FkZHI7CisJCQlpc2FwbnAtPmRldi5kZXNjLmlycSA9IGlzYXBucC0+aXJxbm87CisJCQlpc2FwbnAtPmRldi5wYXJlbnQgPSAmcm9vdGRldi0+ZGV2OworCQkJbGlzdF9hZGQgKCAmaXNhcG5wLT5kZXYuc2libGluZ3MsCisJCQkJICAgJnJvb3RkZXYtPmRldi5jaGlsZHJlbiApOworCQkJSU5JVF9MSVNUX0hFQUQgKCAmaXNhcG5wLT5kZXYuY2hpbGRyZW4gKTsKKwkJCQorCQkJLyogTG9vayBmb3IgYSBkcml2ZXIgKi8KKwkJCWlmICggaXNhcG5wX3Byb2JlICggaXNhcG5wICkgPT0gMCApIHsKKwkJCQkvKiBpc2FwbnBkZXYgcmVnaXN0ZXJlZCwgd2UgY2FuIGRyb3Agb3VyIHJlZiAqLworCQkJCWlzYXBucCA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCS8qIE5vdCByZWdpc3RlcmVkOyByZS11c2Ugc3RydWN0ICovCisJCQkJbGlzdF9kZWwgKCAmaXNhcG5wLT5kZXYuc2libGluZ3MgKTsKKwkJCX0KKwkJfQorCX0KKworIGRvbmU6CisJZnJlZSAoIGlzYXBucCApOworCXJldHVybiAwOworCisgZXJyOgorCWZyZWUgKCBpc2FwbnAgKTsKKwlpc2FwbnBidXNfcmVtb3ZlICggcm9vdGRldiApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZW1vdmUgSVNBUG5QIHJvb3QgYnVzCisgKgorICogQHYgcm9vdGRldgkJSVNBUG5QIGJ1cyByb290IGRldmljZQorICovCitzdGF0aWMgdm9pZCBpc2FwbnBidXNfcmVtb3ZlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICkgeworCXN0cnVjdCBpc2FwbnBfZGV2aWNlICppc2FwbnA7CisJc3RydWN0IGlzYXBucF9kZXZpY2UgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAoIGlzYXBucCwgdG1wLCAmcm9vdGRldi0+ZGV2LmNoaWxkcmVuLAorCQkJCSAgIGRldi5zaWJsaW5ncyApIHsKKwkJaXNhcG5wX3JlbW92ZSAoIGlzYXBucCApOworCQlsaXN0X2RlbCAoICZpc2FwbnAtPmRldi5zaWJsaW5ncyApOworCQlmcmVlICggaXNhcG5wICk7CisJfQorfQorCisvKiogSVNBUG5QIGJ1cyByb290IGRldmljZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgcm9vdF9kcml2ZXIgaXNhcG5wX3Jvb3RfZHJpdmVyID0geworCS5wcm9iZSA9IGlzYXBucGJ1c19wcm9iZSwKKwkucmVtb3ZlID0gaXNhcG5wYnVzX3JlbW92ZSwKK307CisKKy8qKiBJU0FQblAgYnVzIHJvb3QgZGV2aWNlICovCitzdHJ1Y3Qgcm9vdF9kZXZpY2UgaXNhcG5wX3Jvb3RfZGV2aWNlIF9fcm9vdF9kZXZpY2UgPSB7CisJLmRldiA9IHsgLm5hbWUgPSAiSVNBUG5QIiB9LAorCS5kcml2ZXIgPSAmaXNhcG5wX3Jvb3RfZHJpdmVyLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvYnVzL21jYS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9idXMvbWNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxNTYwMwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvYnVzL21jYS5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogTUNBIGJ1cyBkcml2ZXIgY29kZQorICoKKyAqIEFic3RyYWN0ZWQgZnJvbSAzYzUwOS5jLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBCU0QyICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorI2luY2x1ZGUgPGdweGUvbWNhLmg+CisKK3N0YXRpYyB2b2lkIG1jYWJ1c19yZW1vdmUgKCBzdHJ1Y3Qgcm9vdF9kZXZpY2UgKnJvb3RkZXYgKTsKKworLyoqCisgKiBQcm9iZSBhbiBNQ0EgZGV2aWNlCisgKgorICogQHYgbWNhCQlNQ0EgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBTZWFyY2hlcyBmb3IgYSBkcml2ZXIgZm9yIHRoZSBNQ0EgZGV2aWNlLiAgSWYgYSBkcml2ZXIgaXMgZm91bmQsCisgKiBpdHMgcHJvYmUoKSByb3V0aW5lIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIGludCBtY2FfcHJvYmUgKCBzdHJ1Y3QgbWNhX2RldmljZSAqbWNhICkgeworCXN0cnVjdCBtY2FfZHJpdmVyICpkcml2ZXI7CisJc3RydWN0IG1jYV9kZXZpY2VfaWQgKmlkOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCURCRyAoICJBZGRpbmcgTUNBIHNsb3QgJTAyeCAoSUQgJTA0eCBQT1MgIgorCSAgICAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLAorCSAgICAgIG1jYS0+c2xvdCwgTUNBX0lEICggbWNhICksCisJICAgICAgbWNhLT5wb3NbMF0sIG1jYS0+cG9zWzFdLCBtY2EtPnBvc1syXSwgbWNhLT5wb3NbM10sCisJICAgICAgbWNhLT5wb3NbNF0sIG1jYS0+cG9zWzVdLCBtY2EtPnBvc1s2XSwgbWNhLT5wb3NbN10gKTsKKworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggZHJpdmVyLCBNQ0FfRFJJVkVSUyApIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgZHJpdmVyLT5pZF9jb3VudCA7IGkrKyApIHsKKwkJCWlkID0gJmRyaXZlci0+aWRzW2ldOworCQkJaWYgKCBpZC0+aWQgIT0gTUNBX0lEICggbWNhICkgKQorCQkJCWNvbnRpbnVlOworCQkJbWNhLT5kcml2ZXIgPSBkcml2ZXI7CisJCQltY2EtPmRyaXZlcl9uYW1lID0gaWQtPm5hbWU7CisJCQlEQkcgKCAiLi4udXNpbmcgZHJpdmVyICVzXG4iLCBtY2EtPmRyaXZlcl9uYW1lICk7CisJCQlpZiAoICggcmMgPSBkcml2ZXItPnByb2JlICggbWNhLCBpZCApICkgIT0gMCApIHsKKwkJCQlEQkcgKCAiLi4uLi4ucHJvYmUgZmFpbGVkXG4iICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCURCRyAoICIuLi5ubyBkcml2ZXIgZm91bmRcbiIgKTsKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyoqCisgKiBSZW1vdmUgYW4gTUNBIGRldmljZQorICoKKyAqIEB2IG1jYQkJTUNBIGRldmljZQorICovCitzdGF0aWMgdm9pZCBtY2FfcmVtb3ZlICggc3RydWN0IG1jYV9kZXZpY2UgKm1jYSApIHsKKwltY2EtPmRyaXZlci0+cmVtb3ZlICggbWNhICk7CisJREJHICggIlJlbW92ZWQgTUNBIGRldmljZSAlMDJ4XG4iLCBtY2EtPnNsb3QgKTsKK30KKworLyoqCisgKiBQcm9iZSBNQ0Egcm9vdCBidXMKKyAqCisgKiBAdiByb290ZGV2CQlNQ0EgYnVzIHJvb3QgZGV2aWNlCisgKgorICogU2NhbnMgdGhlIE1DQSBidXMgZm9yIGRldmljZXMgYW5kIHJlZ2lzdGVycyBhbGwgZGV2aWNlcyBpdCBjYW4KKyAqIGZpbmQuCisgKi8KK3N0YXRpYyBpbnQgbWNhYnVzX3Byb2JlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICkgeworCXN0cnVjdCBtY2FfZGV2aWNlICptY2EgPSBOVUxMOworCXVuc2lnbmVkIGludCBzbG90OworCWludCBzZWVuX25vbl9mZjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmM7CisKKwlmb3IgKCBzbG90ID0gMCA7IHNsb3QgPD0gTUNBX01BWF9TTE9UX05SIDsgc2xvdCsrICkgeworCQkvKiBBbGxvY2F0ZSBzdHJ1Y3QgbWNhX2RldmljZSAqLworCQlpZiAoICEgbWNhICkKKwkJCW1jYSA9IG1hbGxvYyAoIHNpemVvZiAoICptY2EgKSApOworCQlpZiAoICEgbWNhICkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBlcnI7CisJCX0KKwkJbWVtc2V0ICggbWNhLCAwLCBzaXplb2YgKCAqbWNhICkgKTsKKwkJbWNhLT5zbG90ID0gc2xvdDsKKworCQkvKiBNYWtlIHN1cmUgbW90aGVyYm9hcmQgc2V0dXAgaXMgb2ZmICovCisJCW91dGJfcCAoIDB4ZmYsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcgKTsKKworCQkvKiBTZWxlY3QgdGhlIHNsb3QgKi8KKwkJb3V0Yl9wICggMHg4IHwgKCBtY2EtPnNsb3QgJiAweGYgKSwgTUNBX0FEQVBURVJfU0VUVVBfUkVHICk7CisKKwkJLyogUmVhZCB0aGUgUE9TIHJlZ2lzdGVycyAqLworCQlzZWVuX25vbl9mZiA9IDA7CisJCWZvciAoIGkgPSAwIDsgaSA8ICggc2l6ZW9mICggbWNhLT5wb3MgKSAvCisJCQkJICAgIHNpemVvZiAoIG1jYS0+cG9zWzBdICkgKSA7IGkrKyApIHsKKwkJCW1jYS0+cG9zW2ldID0gaW5iX3AgKCBNQ0FfUE9TX1JFRyAoIGkgKSApOworCQkJaWYgKCBtY2EtPnBvc1tpXSAhPSAweGZmICkKKwkJCQlzZWVuX25vbl9mZiA9IDE7CisJCX0KKwkKKwkJLyogS2lsbCBhbGwgc2V0dXAgbW9kZXMgKi8KKwkJb3V0Yl9wICggMCwgTUNBX0FEQVBURVJfU0VUVVBfUkVHICk7CisKKwkJLyogSWYgYWxsIFBPUyByZWdpc3RlcnMgYXJlIDB4ZmYsIHRoaXMgbWVhbnMgdGhlcmUncyBubyBkZXZpY2UKKwkJICogcHJlc2VudAorCQkgKi8KKwkJaWYgKCAhIHNlZW5fbm9uX2ZmICkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFkZCB0byBkZXZpY2UgaGllcmFyY2h5ICovCisJCXNucHJpbnRmICggbWNhLT5kZXYubmFtZSwgc2l6ZW9mICggbWNhLT5kZXYubmFtZSApLAorCQkJICAgIk1DQSUwMngiLCBzbG90ICk7CisJCW1jYS0+ZGV2LmRlc2MuYnVzX3R5cGUgPSBCVVNfVFlQRV9NQ0E7CisJCW1jYS0+ZGV2LmRlc2MudmVuZG9yID0gR0VORVJJQ19NQ0FfVkVORE9SOworCQltY2EtPmRldi5kZXNjLmRldmljZSA9IE1DQV9JRCAoIG1jYSApOworCQltY2EtPmRldi5wYXJlbnQgPSAmcm9vdGRldi0+ZGV2OworCQlsaXN0X2FkZCAoICZtY2EtPmRldi5zaWJsaW5ncywgJnJvb3RkZXYtPmRldi5jaGlsZHJlbiApOworCQlJTklUX0xJU1RfSEVBRCAoICZtY2EtPmRldi5jaGlsZHJlbiApOworCisJCS8qIExvb2sgZm9yIGEgZHJpdmVyICovCisJCWlmICggbWNhX3Byb2JlICggbWNhICkgPT0gMCApIHsKKwkJCS8qIG1jYWRldiByZWdpc3RlcmVkLCB3ZSBjYW4gZHJvcCBvdXIgcmVmICovCisJCQltY2EgPSBOVUxMOworCQl9IGVsc2UgeworCQkJLyogTm90IHJlZ2lzdGVyZWQ7IHJlLXVzZSBzdHJ1Y3QgKi8KKwkJCWxpc3RfZGVsICggJm1jYS0+ZGV2LnNpYmxpbmdzICk7CisJCX0KKwl9CisKKwlmcmVlICggbWNhICk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJZnJlZSAoIG1jYSApOworCW1jYWJ1c19yZW1vdmUgKCByb290ZGV2ICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFJlbW92ZSBNQ0Egcm9vdCBidXMKKyAqCisgKiBAdiByb290ZGV2CQlNQ0EgYnVzIHJvb3QgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIG1jYWJ1c19yZW1vdmUgKCBzdHJ1Y3Qgcm9vdF9kZXZpY2UgKnJvb3RkZXYgKSB7CisJc3RydWN0IG1jYV9kZXZpY2UgKm1jYTsKKwlzdHJ1Y3QgbWNhX2RldmljZSAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlICggbWNhLCB0bXAsICZyb290ZGV2LT5kZXYuY2hpbGRyZW4sCisJCQkJICAgZGV2LnNpYmxpbmdzICkgeworCQltY2FfcmVtb3ZlICggbWNhICk7CisJCWxpc3RfZGVsICggJm1jYS0+ZGV2LnNpYmxpbmdzICk7CisJCWZyZWUgKCBtY2EgKTsKKwl9Cit9CisKKy8qKiBNQ0EgYnVzIHJvb3QgZGV2aWNlIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCByb290X2RyaXZlciBtY2Ffcm9vdF9kcml2ZXIgPSB7CisJLnByb2JlID0gbWNhYnVzX3Byb2JlLAorCS5yZW1vdmUgPSBtY2FidXNfcmVtb3ZlLAorfTsKKworLyoqIE1DQSBidXMgcm9vdCBkZXZpY2UgKi8KK3N0cnVjdCByb290X2RldmljZSBtY2Ffcm9vdF9kZXZpY2UgX19yb290X2RldmljZSA9IHsKKwkuZGV2ID0geyAubmFtZSA9ICJNQ0EiIH0sCisJLmRyaXZlciA9ICZtY2Ffcm9vdF9kcml2ZXIsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9idXMvcGNpLmMgYi9ncHhlL3NyYy9kcml2ZXJzL2J1cy9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk5ZTZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9idXMvcGNpLmMKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIEJhc2VkIGluIHBhcnQgb24gcGNpLmMgZnJvbSBFdGhlcmJvb3QgNS40LCBieSBLZW4gWWFwIGFuZCBEYXZpZAorICogTXVucm8sIGluIHR1cm4gYmFzZWQgb24gdGhlIExpbnV4IGtlcm5lbCdzIFBDSSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisjaW5jbHVkZSA8Z3B4ZS9kZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBQQ0kgYnVzCisgKgorICovCisKK3N0YXRpYyB2b2lkIHBjaWJ1c19yZW1vdmUgKCBzdHJ1Y3Qgcm9vdF9kZXZpY2UgKnJvb3RkZXYgKTsKKworLyoqCisgKiBSZWFkIFBDSSBCQVIKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqIEB2IHJlZwkJUENJIHJlZ2lzdGVyIG51bWJlcgorICogQHJldCBiYXIJCUJhc2UgYWRkcmVzcyByZWdpc3RlcgorICoKKyAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgUENJIGJhc2UgYWRkcmVzcyByZWdpc3RlciwgaW5jbHVkaW5nIHRoZSBmbGFncworICogcG9ydGlvbi4gIDY0LWJpdCBCQVJzIHdpbGwgYmUgaGFuZGxlZCBhdXRvbWF0aWNhbGx5LiAgSWYgdGhlIHZhbHVlCisgKiBvZiB0aGUgNjQtYml0IEJBUiBleGNlZWRzIHRoZSBzaXplIG9mIGFuIHVuc2lnbmVkIGxvbmcgKGkuZS4gaWYgdGhlCisgKiBoaWdoIGR3b3JkIGlzIG5vbi16ZXJvIG9uIGEgMzItYml0IHBsYXRmb3JtKSwgdGhlbiB0aGUgdmFsdWUKKyAqIHJldHVybmVkIHdpbGwgYmUgemVybyBwbHVzIHRoZSBmbGFncyBmb3IgYSA2NC1iaXQgQkFSLiAgVW5yZWFjaGFibGUKKyAqIDY0LWJpdCBCQVJzIGFyZSB0aGVyZWZvcmUgcmV0dXJuZWQgYXMgdW5pbml0aWFsaXNlZCA2NC1iaXQgQkFScy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNpX2JhciAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIHVuc2lnbmVkIGludCByZWcgKSB7CisJdWludDMyX3QgbG93OworCXVpbnQzMl90IGhpZ2g7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKCBwY2ksIHJlZywgJmxvdyApOworCWlmICggKCBsb3cgJiAoUENJX0JBU0VfQUREUkVTU19TUEFDRXxQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0spICkKKwkgICAgID09IChQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWXxQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KSApeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKCBwY2ksIHJlZyArIDQsICZoaWdoICk7CisJCWlmICggaGlnaCApIHsKKwkJCWlmICggc2l6ZW9mICggdW5zaWduZWQgbG9uZyApID4gc2l6ZW9mICggdWludDMyX3QgKSApIHsKKwkJCQlyZXR1cm4gKCAoICggdWludDY0X3QgKSBoaWdoIDw8IDMyICkgfCBsb3cgKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHICggIlVuaGFuZGxlZCA2NC1iaXQgQkFSICUwOHglMDh4XG4iLAorCQkJCSAgICAgIGhpZ2gsIGxvdyApOworCQkJCXJldHVybiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0OworCQkJfQorCQl9CisJfQorCXJldHVybiBsb3c7Cit9CisKKy8qKgorICogRmluZCB0aGUgc3RhcnQgb2YgYSBQQ0kgQkFSCisgKgorICogQHYgcGNpCQlQQ0kgZGV2aWNlCisgKiBAdiByZWcJCVBDSSByZWdpc3RlciBudW1iZXIKKyAqIEByZXQgc3RhcnQJCUJBUiBzdGFydCBhZGRyZXNzCisgKgorICogUmVhZHMgdGhlIHNwZWNpZmllZCBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyLCBhbmQgcmV0dXJucyB0aGUKKyAqIGFkZHJlc3MgcG9ydGlvbiBvZiB0aGUgQkFSIChpLmUuIHdpdGhvdXQgdGhlIGZsYWdzKS4KKyAqCisgKiBJZiB0aGUgYWRkcmVzcyBleGNlZWRzIHRoZSBzaXplIG9mIGFuIHVuc2lnbmVkIGxvbmcgKGkuZS4gaWYgYQorICogNjQtYml0IEJBUiBoYXMgYSBub24temVybyBoaWdoIGR3b3JkIG9uIGEgMzItYml0IG1hY2hpbmUpLCB0aGUKKyAqIHJldHVybiB2YWx1ZSB3aWxsIGJlIHplcm8uCisgKi8KK3Vuc2lnbmVkIGxvbmcgcGNpX2Jhcl9zdGFydCAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIHVuc2lnbmVkIGludCByZWcgKSB7CisJdW5zaWduZWQgbG9uZyBiYXI7CisKKwliYXIgPSBwY2lfYmFyICggcGNpLCByZWcgKTsKKwlpZiAoIChiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWSApeworCQlyZXR1cm4gKCBiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLICk7CisJfSBlbHNlIHsKKwkJcmV0dXJuICggYmFyICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLICk7CisJfQorfQorCisvKioKKyAqIFJlYWQgbWVtYmFzZSBhbmQgaW9hZGRyIGZvciBhIFBDSSBkZXZpY2UKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqCisgKiBUaGlzIHNjYW5zIHRocm91Z2ggYWxsIFBDSSBCQVJzIG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlLiAgVGhlIGZpcnN0CisgKiB2YWxpZCBtZW1vcnkgQkFSIGlzIHJlY29yZGVkIGFzIHBjaV9kZXZpY2U6Om1lbWJhc2UsIGFuZCB0aGUgZmlyc3QKKyAqIHZhbGlkIElPIEJBUiBpcyByZWNvcmRlZCBhcyBwY2lfZGV2aWNlOjppb2FkZHIuCisgKgorICogNjQtYml0IEJBUnMgYXJlIGhhbmRsZWQgYXV0b21hdGljYWxseS4gIE9uIGEgMzItYml0IHBsYXRmb3JtLCBpZiBhCisgKiA2NC1iaXQgQkFSIGhhcyBhIG5vbi16ZXJvIGhpZ2ggZHdvcmQsIGl0IHdpbGwgYmUgcmVnYXJkZWQgYXMKKyAqIGludmFsaWQuCisgKi8KK3N0YXRpYyB2b2lkIHBjaV9yZWFkX2Jhc2VzICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKwl1bnNpZ25lZCBsb25nIGJhcjsKKwlpbnQgcmVnOworCisJZm9yICggcmVnID0gUENJX0JBU0VfQUREUkVTU18wOyByZWcgPD0gUENJX0JBU0VfQUREUkVTU181OyByZWcgKz0gNCApIHsKKwkJYmFyID0gcGNpX2JhciAoIHBjaSwgcmVnICk7CisJCWlmICggYmFyICYgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTyApIHsKKwkJCWlmICggISBwY2ktPmlvYWRkciApCisJCQkJcGNpLT5pb2FkZHIgPSAKKwkJCQkJKCBiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0sgKTsKKwkJfSBlbHNlIHsKKwkJCWlmICggISBwY2ktPm1lbWJhc2UgKQorCQkJCXBjaS0+bWVtYmFzZSA9CisJCQkJCSggYmFyICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyApOworCQkJLyogU2tpcCBuZXh0IEJBUiBpZiA2NC1iaXQgKi8KKwkJCWlmICggYmFyICYgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCApCisJCQkJcmVnICs9IDQ7CisJCX0KKwl9Cit9CisKKy8qKgorICogRW5hYmxlIFBDSSBkZXZpY2UKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqCisgKiBTZXQgZGV2aWNlIHRvIGJlIGEgYnVzbWFzdGVyIGluIGNhc2UgQklPUyBuZWdsZWN0ZWQgdG8gZG8gc28uICBBbHNvCisgKiBhZGp1c3QgUENJIGxhdGVuY3kgdGltZXIgdG8gYSByZWFzb25hYmxlIHZhbHVlLCAzMi4KKyAqLwordm9pZCBhZGp1c3RfcGNpX2RldmljZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgKSB7CisJdW5zaWduZWQgc2hvcnQgbmV3X2NvbW1hbmQsIHBjaV9jb21tYW5kOworCXVuc2lnbmVkIGNoYXIgcGNpX2xhdGVuY3k7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZCAoIHBjaSwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCApOworCW5ld19jb21tYW5kID0gKCBwY2lfY29tbWFuZCB8IFBDSV9DT01NQU5EX01BU1RFUiB8CisJCQlQQ0lfQ09NTUFORF9NRU0gfCBQQ0lfQ09NTUFORF9JTyApOworCWlmICggcGNpX2NvbW1hbmQgIT0gbmV3X2NvbW1hbmQgKSB7CisJCURCRyAoICJQQ0kgQklPUyBoYXMgbm90IGVuYWJsZWQgZGV2aWNlICUwMng6JTAyeC4leCEgIgorCQkgICAgICAiVXBkYXRpbmcgUENJIGNvbW1hbmQgJTA0eC0+JTA0eFxuIiwgcGNpLT5idXMsCisJCSAgICAgIFBDSV9TTE9UICggcGNpLT5kZXZmbiApLCBQQ0lfRlVOQyAoIHBjaS0+ZGV2Zm4gKSwKKwkJICAgICAgcGNpX2NvbW1hbmQsIG5ld19jb21tYW5kICk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZCAoIHBjaSwgUENJX0NPTU1BTkQsIG5ld19jb21tYW5kICk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUgKCBwY2ksIFBDSV9MQVRFTkNZX1RJTUVSLCAmcGNpX2xhdGVuY3kpOworCWlmICggcGNpX2xhdGVuY3kgPCAzMiApIHsKKwkJREJHICggIlBDSSBkZXZpY2UgJTAyeDolMDJ4LiV4IGxhdGVuY3kgdGltZXIgaXMgdW5yZWFzb25hYmx5ICIKKwkJICAgICAgImxvdyBhdCAlZC4gU2V0dGluZyB0byAzMi5cbiIsIHBjaS0+YnVzLAorCQkgICAgICBQQ0lfU0xPVCAoIHBjaS0+ZGV2Zm4gKSwgUENJX0ZVTkMgKCBwY2ktPmRldmZuICksCisJCSAgICAgIHBjaV9sYXRlbmN5ICk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZSAoIHBjaSwgUENJX0xBVEVOQ1lfVElNRVIsIDMyKTsKKwl9Cit9CisKKy8qKgorICogUHJvYmUgYSBQQ0kgZGV2aWNlCisgKgorICogQHYgcGNpCQlQQ0kgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBTZWFyY2hlcyBmb3IgYSBkcml2ZXIgZm9yIHRoZSBQQ0kgZGV2aWNlLiAgSWYgYSBkcml2ZXIgaXMgZm91bmQsCisgKiBpdHMgcHJvYmUoKSByb3V0aW5lIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIGludCBwY2lfcHJvYmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCXN0cnVjdCBwY2lfZHJpdmVyICpkcml2ZXI7CisJc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCURCRyAoICJBZGRpbmcgUENJIGRldmljZSAlMDJ4OiUwMnguJXggKCUwNHg6JTA0eCBtZW0gJWx4IGlvICVseCAiCisJICAgICAgImlycSAlZClcbiIsIHBjaS0+YnVzLCBQQ0lfU0xPVCAoIHBjaS0+ZGV2Zm4gKSwKKwkgICAgICBQQ0lfRlVOQyAoIHBjaS0+ZGV2Zm4gKSwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2aWNlLAorCSAgICAgIHBjaS0+bWVtYmFzZSwgcGNpLT5pb2FkZHIsIHBjaS0+aXJxICk7CisKKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIGRyaXZlciwgUENJX0RSSVZFUlMgKSB7CisJCWZvciAoIGkgPSAwIDsgaSA8IGRyaXZlci0+aWRfY291bnQgOyBpKysgKSB7CisJCQlpZCA9ICZkcml2ZXItPmlkc1tpXTsKKwkJCWlmICggKCBpZC0+dmVuZG9yICE9IFBDSV9BTllfSUQgKSAmJgorCQkJICAgICAoIGlkLT52ZW5kb3IgIT0gcGNpLT52ZW5kb3IgKSApCisJCQkJY29udGludWU7CisJCQlpZiAoICggaWQtPmRldmljZSAhPSBQQ0lfQU5ZX0lEICkgJiYKKwkJCSAgICAgKCBpZC0+ZGV2aWNlICE9IHBjaS0+ZGV2aWNlICkgKQorCQkJCWNvbnRpbnVlOworCQkJcGNpLT5kcml2ZXIgPSBkcml2ZXI7CisJCQlwY2ktPmRyaXZlcl9uYW1lID0gaWQtPm5hbWU7CisJCQlEQkcgKCAiLi4udXNpbmcgZHJpdmVyICVzXG4iLCBwY2ktPmRyaXZlcl9uYW1lICk7CisJCQlpZiAoICggcmMgPSBkcml2ZXItPnByb2JlICggcGNpLCBpZCApICkgIT0gMCApIHsKKwkJCQlEQkcgKCAiLi4uLi4ucHJvYmUgZmFpbGVkXG4iICk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCURCRyAoICIuLi5ubyBkcml2ZXIgZm91bmRcbiIgKTsKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyoqCisgKiBSZW1vdmUgYSBQQ0kgZGV2aWNlCisgKgorICogQHYgcGNpCQlQQ0kgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHBjaV9yZW1vdmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCXBjaS0+ZHJpdmVyLT5yZW1vdmUgKCBwY2kgKTsKKwlEQkcgKCAiUmVtb3ZlZCBQQ0kgZGV2aWNlICUwMng6JTAyeC4leFxuIiwgcGNpLT5idXMsCisJICAgICAgUENJX1NMT1QgKCBwY2ktPmRldmZuICksIFBDSV9GVU5DICggcGNpLT5kZXZmbiApICk7Cit9CisKKy8qKgorICogUHJvYmUgUENJIHJvb3QgYnVzCisgKgorICogQHYgcm9vdGRldgkJUENJIGJ1cyByb290IGRldmljZQorICoKKyAqIFNjYW5zIHRoZSBQQ0kgYnVzIGZvciBkZXZpY2VzIGFuZCByZWdpc3RlcnMgYWxsIGRldmljZXMgaXQgY2FuCisgKiBmaW5kLgorICovCitzdGF0aWMgaW50IHBjaWJ1c19wcm9iZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApIHsKKwlzdHJ1Y3QgcGNpX2RldmljZSAqcGNpID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbWF4X2J1czsKKwl1bnNpZ25lZCBpbnQgYnVzOworCXVuc2lnbmVkIGludCBkZXZmbjsKKwl1aW50OF90IGhkcnR5cGUgPSAwOworCXVpbnQzMl90IHRtcDsKKwlpbnQgcmM7CisKKwltYXhfYnVzID0gcGNpX21heF9idXMoKTsKKwlmb3IgKCBidXMgPSAwIDsgYnVzIDw9IG1heF9idXMgOyBidXMrKyApIHsKKwkJZm9yICggZGV2Zm4gPSAwIDsgZGV2Zm4gPD0gMHhmZiA7IGRldmZuKysgKSB7CisKKwkJCS8qIEFsbG9jYXRlIHN0cnVjdCBwY2lfZGV2aWNlICovCisJCQlpZiAoICEgcGNpICkKKwkJCQlwY2kgPSBtYWxsb2MgKCBzaXplb2YgKCAqcGNpICkgKTsKKwkJCWlmICggISBwY2kgKSB7CisJCQkJcmMgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJbWVtc2V0ICggcGNpLCAwLCBzaXplb2YgKCAqcGNpICkgKTsKKwkJCXBjaS0+YnVzID0gYnVzOworCQkJcGNpLT5kZXZmbiA9IGRldmZuOworCQkJCisJCQkvKiBTa2lwIGFsbCBidXQgdGhlIGZpcnN0IGZ1bmN0aW9uIG9uCisJCQkgKiBub24tbXVsdGlmdW5jdGlvbiBjYXJkcworCQkJICovCisJCQlpZiAoIFBDSV9GVU5DICggZGV2Zm4gKSA9PSAwICkgeworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlICggcGNpLCBQQ0lfSEVBREVSX1RZUEUsCisJCQkJCQkgICAgICAgJmhkcnR5cGUgKTsKKwkJCX0gZWxzZSBpZiAoICEgKCBoZHJ0eXBlICYgMHg4MCApICkgeworCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogQ2hlY2sgZm9yIHBoeXNpY2FsIGRldmljZSBwcmVzZW5jZSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkICggcGNpLCBQQ0lfVkVORE9SX0lELCAmdG1wICk7CisJCQlpZiAoICggdG1wID09IDB4ZmZmZmZmZmYgKSB8fCAoIHRtcCA9PSAwICkgKQorCQkJCWNvbnRpbnVlOworCQkJCisJCQkvKiBQb3B1bGF0ZSBzdHJ1Y3QgcGNpX2RldmljZSAqLworCQkJcGNpLT52ZW5kb3IgPSAoIHRtcCAmIDB4ZmZmZiApOworCQkJcGNpLT5kZXZpY2UgPSAoIHRtcCA+PiAxNiApOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkICggcGNpLCBQQ0lfUkVWSVNJT04sICZ0bXAgKTsKKwkJCXBjaS0+Y2xhc3MgPSAoIHRtcCA+PiA4ICk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoIHBjaSwgUENJX0lOVEVSUlVQVF9MSU5FLAorCQkJCQkgICAgICAgJnBjaS0+aXJxICk7CisJCQlwY2lfcmVhZF9iYXNlcyAoIHBjaSApOworCisJCQkvKiBBZGQgdG8gZGV2aWNlIGhpZXJhcmNoeSAqLworCQkJc25wcmludGYgKCBwY2ktPmRldi5uYW1lLCBzaXplb2YgKCBwY2ktPmRldi5uYW1lICksCisJCQkJICAgIlBDSSUwMng6JTAyeC4leCIsIGJ1cywKKwkJCQkgICBQQ0lfU0xPVCAoIGRldmZuICksIFBDSV9GVU5DICggZGV2Zm4gKSApOworCQkJcGNpLT5kZXYuZGVzYy5idXNfdHlwZSA9IEJVU19UWVBFX1BDSTsKKwkJCXBjaS0+ZGV2LmRlc2MubG9jYXRpb24gPSBQQ0lfQlVTREVWRk4gKGJ1cywgZGV2Zm4pOworCQkJcGNpLT5kZXYuZGVzYy52ZW5kb3IgPSBwY2ktPnZlbmRvcjsKKwkJCXBjaS0+ZGV2LmRlc2MuZGV2aWNlID0gcGNpLT5kZXZpY2U7CisJCQlwY2ktPmRldi5kZXNjLmNsYXNzID0gcGNpLT5jbGFzczsKKwkJCXBjaS0+ZGV2LmRlc2MuaW9hZGRyID0gcGNpLT5pb2FkZHI7CisJCQlwY2ktPmRldi5kZXNjLmlycSA9IHBjaS0+aXJxOworCQkJcGNpLT5kZXYucGFyZW50ID0gJnJvb3RkZXYtPmRldjsKKwkJCWxpc3RfYWRkICggJnBjaS0+ZGV2LnNpYmxpbmdzLCAmcm9vdGRldi0+ZGV2LmNoaWxkcmVuKTsKKwkJCUlOSVRfTElTVF9IRUFEICggJnBjaS0+ZGV2LmNoaWxkcmVuICk7CisJCQkKKwkJCS8qIExvb2sgZm9yIGEgZHJpdmVyICovCisJCQlpZiAoIHBjaV9wcm9iZSAoIHBjaSApID09IDAgKSB7CisJCQkJLyogcGNpZGV2IHJlZ2lzdGVyZWQsIHdlIGNhbiBkcm9wIG91ciByZWYgKi8KKwkJCQlwY2kgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQkvKiBOb3QgcmVnaXN0ZXJlZDsgcmUtdXNlIHN0cnVjdCBwY2lfZGV2aWNlICovCisJCQkJbGlzdF9kZWwgKCAmcGNpLT5kZXYuc2libGluZ3MgKTsKKwkJCX0KKwkJfQorCX0KKworCWZyZWUgKCBwY2kgKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlmcmVlICggcGNpICk7CisJcGNpYnVzX3JlbW92ZSAoIHJvb3RkZXYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVtb3ZlIFBDSSByb290IGJ1cworICoKKyAqIEB2IHJvb3RkZXYJCVBDSSBidXMgcm9vdCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgcGNpYnVzX3JlbW92ZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApIHsKKwlzdHJ1Y3QgcGNpX2RldmljZSAqcGNpOworCXN0cnVjdCBwY2lfZGV2aWNlICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKCBwY2ksIHRtcCwgJnJvb3RkZXYtPmRldi5jaGlsZHJlbiwKKwkJCQkgICBkZXYuc2libGluZ3MgKSB7CisJCXBjaV9yZW1vdmUgKCBwY2kgKTsKKwkJbGlzdF9kZWwgKCAmcGNpLT5kZXYuc2libGluZ3MgKTsKKwkJZnJlZSAoIHBjaSApOworCX0KK30KKworLyoqIFBDSSBidXMgcm9vdCBkZXZpY2UgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHJvb3RfZHJpdmVyIHBjaV9yb290X2RyaXZlciA9IHsKKwkucHJvYmUgPSBwY2lidXNfcHJvYmUsCisJLnJlbW92ZSA9IHBjaWJ1c19yZW1vdmUsCit9OworCisvKiogUENJIGJ1cyByb290IGRldmljZSAqLworc3RydWN0IHJvb3RfZGV2aWNlIHBjaV9yb290X2RldmljZSBfX3Jvb3RfZGV2aWNlID0geworCS5kZXYgPSB7IC5uYW1lID0gIlBDSSIgfSwKKwkuZHJpdmVyID0gJnBjaV9yb290X2RyaXZlciwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2J1cy9wY2liYWNrdXAuYyBiL2dweGUvc3JjL2RyaXZlcnMvYnVzL3BjaWJhY2t1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTk5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL2J1cy9wY2liYWNrdXAuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL3BjaWJhY2t1cC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBiYWNrdXAgYW5kIHJlc3RvcmF0aW9uCisgKgorICovCisKKy8qKgorICogQ2hlY2sgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2Zmc2V0IGFnYWluc3QgZXhjbHVzaW9uIGxpc3QKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IHdpdGhpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICogQHYgZXhjbHVkZQkJUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgYmFja3VwIGV4Y2x1c2lvbiBsaXN0LCBvciBOVUxMCisgKi8KK3N0YXRpYyBpbnQKK3BjaV9iYWNrdXBfZXhjbHVkZWQgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgICBjb25zdCB1aW50OF90ICpleGNsdWRlICkgeworCisJaWYgKCAhIGV4Y2x1ZGUgKQorCQlyZXR1cm4gMDsKKwlmb3IgKCA7ICpleGNsdWRlICE9IFBDSV9DT05GSUdfQkFDS1VQX0VYQ0xVREVfRU5EIDsgZXhjbHVkZSsrICkgeworCQlpZiAoIG9mZnNldCA9PSAqZXhjbHVkZSApIHsKKwkJCURCR0MgKCBwY2ksICJQQ0kgJXAgc2tpcHBpbmcgY29uZmlndXJhdGlvbiBvZmZzZXQgIgorCQkJICAgICAgICIlMDJ4XG4iLCBwY2ksIG9mZnNldCApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQmFjayB1cCBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICoKKyAqIEB2IHBjaQkJUENJIGRldmljZQorICogQHYgYmFja3VwCQlQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBiYWNrdXAKKyAqIEB2IGV4Y2x1ZGUJCVBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGJhY2t1cCBleGNsdXNpb24gbGlzdCwgb3IgTlVMTAorICovCit2b2lkIHBjaV9iYWNrdXAgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCBzdHJ1Y3QgcGNpX2NvbmZpZ19iYWNrdXAgKmJhY2t1cCwKKwkJICBjb25zdCB1aW50OF90ICpleGNsdWRlICkgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdWludDMyX3QgKmR3b3JkOworCisJZm9yICggb2Zmc2V0ID0gMCwgZHdvcmQgPSBiYWNrdXAtPmR3b3JkcyA7IG9mZnNldCA8IDB4MTAwIDsKKwkgICAgICBvZmZzZXQgKz0gc2l6ZW9mICggKmR3b3JkICkgLCBkd29yZCsrICkgeworCQlpZiAoICEgcGNpX2JhY2t1cF9leGNsdWRlZCAoIHBjaSwgb2Zmc2V0LCBleGNsdWRlICkgKQorCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkICggcGNpLCBvZmZzZXQsIGR3b3JkICk7CisJfQorfQorCisvKioKKyAqIFJlc3RvcmUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqIEB2IGJhY2t1cAkJUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgYmFja3VwCisgKiBAdiBleGNsdWRlCQlQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBiYWNrdXAgZXhjbHVzaW9uIGxpc3QsIG9yIE5VTEwKKyAqLwordm9pZCBwY2lfcmVzdG9yZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIHN0cnVjdCBwY2lfY29uZmlnX2JhY2t1cCAqYmFja3VwLAorCQkgICBjb25zdCB1aW50OF90ICpleGNsdWRlICkgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdWludDMyX3QgKmR3b3JkOworCisJZm9yICggb2Zmc2V0ID0gMCwgZHdvcmQgPSBiYWNrdXAtPmR3b3JkcyA7IG9mZnNldCA8IDB4MTAwIDsKKwkgICAgICBvZmZzZXQgKz0gc2l6ZW9mICggKmR3b3JkICkgLCBkd29yZCsrICkgeworCQlpZiAoICEgcGNpX2JhY2t1cF9leGNsdWRlZCAoIHBjaSwgb2Zmc2V0LCBleGNsdWRlICkgKQorCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoIHBjaSwgb2Zmc2V0LCAqZHdvcmQgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2J1cy9wY2lleHRyYS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9idXMvcGNpZXh0cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGM0MDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9idXMvcGNpZXh0cmEuYwpAQCAtMCwwICsxLDg2IEBACitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorCisvKioKKyAqIExvb2sgZm9yIGEgUENJIGNhcGFiaWxpdHkKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UgdG8gcXVlcnkKKyAqIEB2IGNhcAkJQ2FwYWJpbGl0eSBjb2RlCisgKiBAcmV0IGFkZHJlc3MJCUFkZHJlc3Mgb2YgY2FwYWJpbGl0eSwgb3IgMCBpZiBub3QgZm91bmQKKyAqCisgKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBkZXZpY2Ugc3VwcG9ydHMgYSBnaXZlbiBQQ0kgY2FwYWJpbGl0eS4KKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlcXVlc3RlZCBjYXBhYmlsaXR5IHN0cnVjdHVyZSB3aXRoaW4KKyAqIHRoZSBkZXZpY2UncyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSwgb3IgMCBpZiB0aGUgZGV2aWNlIGRvZXMgbm90CisgKiBzdXBwb3J0IGl0LgorICovCitpbnQgcGNpX2ZpbmRfY2FwYWJpbGl0eSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIGludCBjYXAgKSB7CisJdWludDE2X3Qgc3RhdHVzOworCXVpbnQ4X3QgcG9zLCBpZDsKKwl1aW50OF90IGhkcl90eXBlOworCWludCB0dGwgPSA0ODsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkICggcGNpLCBQQ0lfU1RBVFVTLCAmc3RhdHVzICk7CisJaWYgKCAhICggc3RhdHVzICYgUENJX1NUQVRVU19DQVBfTElTVCApICkKKwkJcmV0dXJuIDA7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZSAoIHBjaSwgUENJX0hFQURFUl9UWVBFLCAmaGRyX3R5cGUgKTsKKwlzd2l0Y2ggKCBoZHJfdHlwZSAmIDB4N0YgKSB7CisJY2FzZSBQQ0lfSEVBREVSX1RZUEVfTk9STUFMOgorCWNhc2UgUENJX0hFQURFUl9UWVBFX0JSSURHRToKKwlkZWZhdWx0OgorCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoIHBjaSwgUENJX0NBUEFCSUxJVFlfTElTVCwgJnBvcyApOworCQlicmVhazsKKwljYXNlIFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTOgorCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoIHBjaSwgUENJX0NCX0NBUEFCSUxJVFlfTElTVCwgJnBvcyApOworCQlicmVhazsKKwl9CisJd2hpbGUgKCB0dGwtLSAmJiBwb3MgPj0gMHg0MCApIHsKKwkJcG9zICY9IH4zOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoIHBjaSwgcG9zICsgUENJX0NBUF9MSVNUX0lELCAmaWQgKTsKKwkJREJHICggIlBDSSBDYXBhYmlsaXR5OiAlZFxuIiwgaWQgKTsKKwkJaWYgKCBpZCA9PSAweGZmICkKKwkJCWJyZWFrOworCQlpZiAoIGlkID09IGNhcCApCisJCQlyZXR1cm4gcG9zOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoIHBjaSwgcG9zICsgUENJX0NBUF9MSVNUX05FWFQsICZwb3MgKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmluZCB0aGUgc2l6ZSBvZiBhIFBDSSBCQVIKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqIEB2IHJlZwkJUENJIHJlZ2lzdGVyIG51bWJlcgorICogQHJldCBzaXplCQlCQVIgc2l6ZQorICoKKyAqIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGZvciBhbnkgRXRoZXJib290IGNvZGUgdG8gY2FsbCB0aGlzCisgKiBmdW5jdGlvbi4KKyAqLwordW5zaWduZWQgbG9uZyBwY2lfYmFyX3NpemUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCB1bnNpZ25lZCBpbnQgcmVnICkgeworCXVpbnQxNl90IGNtZDsKKwl1aW50MzJfdCBzdGFydCwgc2l6ZTsKKworCS8qIFNhdmUgdGhlIG9yaWdpbmFsIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZCAoIHBjaSwgUENJX0NPTU1BTkQsICZjbWQgKTsKKwkvKiBTYXZlIHRoZSBvcmlnaW5hbCBiYXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKCBwY2ksIHJlZywgJnN0YXJ0ICk7CisJLyogQ29tcHV0ZSB3aGljaCBiaXRzIGNhbiBiZSBzZXQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkICggcGNpLCByZWcsIH4wICk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkICggcGNpLCByZWcsICZzaXplICk7CisJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc2l6ZSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKCBwY2ksIHJlZywgc3RhcnQgKTsKKwkvKiBGaW5kIHRoZSBzaWduaWZpY2FudCBiaXRzICovCisJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgY29tbWFuZCByZWdpc3Rlci4gVGhpcyByZWVuYWJsZXMgZGVjb2RpbmcuICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkICggcGNpLCBQQ0lfQ09NTUFORCwgY21kICk7CisJaWYgKCBzdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8gKSB7CisJCXNpemUgJj0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLOworCX0gZWxzZSB7CisJCXNpemUgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwl9CisJLyogRmluZCB0aGUgbG93ZXN0IGJpdCBzZXQgKi8KKwlzaXplID0gc2l6ZSAmIH4oIHNpemUgLSAxICk7CisJcmV0dXJuIHNpemU7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2J1cy92aXJ0aW8tcGNpLmMgYi9ncHhlL3NyYy9kcml2ZXJzL2J1cy92aXJ0aW8tcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhY2NlMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvYnVzL3ZpcnRpby1wY2kuYwpAQCAtMCwwICsxLDY0IEBACisvKiB2aXJ0aW8tcGNpLmMgLSBwY2kgaW50ZXJmYWNlIGZvciB2aXJ0aW8gaW50ZXJmYWNlCisgKgorICogKGMpIENvcHlyaWdodCAyMDA4IEJ1bGwgUy5BLlMuCisgKgorICogIEF1dGhvcjogTGF1cmVudCBWaXZpZXIgPExhdXJlbnQuVml2aWVyQGJ1bGwubmV0PgorICoKKyAqIHNvbWUgcGFydHMgZnJvbSBMaW51eCBWaXJ0aW8gUENJIGRyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDcKKyAqICBBdXRob3JzOiBBbnRob255IExpZ3VvcmkgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAiZ3B4ZS9pby5oIgorI2luY2x1ZGUgImdweGUvdmlydGlvLXJpbmcuaCIKKyNpbmNsdWRlICJncHhlL3ZpcnRpby1wY2kuaCIKKworaW50IHZwX2ZpbmRfdnEodW5zaWduZWQgaW50IGlvYWRkciwgaW50IHF1ZXVlX2luZGV4LAorICAgICAgICAgICAgICAgc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSAqdnEpCit7CisgICBzdHJ1Y3QgdnJpbmcgKiB2ciA9ICZ2cS0+dnJpbmc7CisgICB1MTYgbnVtOworCisgICAvKiBzZWxlY3QgdGhlIHF1ZXVlICovCisKKyAgIG91dHcocXVldWVfaW5kZXgsIGlvYWRkciArIFZJUlRJT19QQ0lfUVVFVUVfU0VMKTsKKworICAgLyogY2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGF2YWlsYWJsZSAqLworCisgICBudW0gPSBpbncoaW9hZGRyICsgVklSVElPX1BDSV9RVUVVRV9OVU0pOworICAgaWYgKCFudW0pIHsKKyAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogcXVldWUgc2l6ZSBpcyAwXG4iKTsKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICBpZiAobnVtID4gTUFYX1FVRVVFX05VTSkgeworICAgICAgICAgICBwcmludGYoIkVSUk9SOiBxdWV1ZSBzaXplICVkID4gJWRcbiIsIG51bSwgTUFYX1FVRVVFX05VTSk7CisgICAgICAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgLyogY2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkgYWN0aXZlICovCisKKyAgIGlmIChpbmwoaW9hZGRyICsgVklSVElPX1BDSV9RVUVVRV9QRk4pKSB7CisgICAgICAgICAgIHByaW50ZigiRVJST1I6IHF1ZXVlIGFscmVhZHkgYWN0aXZlXG4iKTsKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICB2cS0+cXVldWVfaW5kZXggPSBxdWV1ZV9pbmRleDsKKworICAgLyogaW5pdGlhbGl6ZSB0aGUgcXVldWUgKi8KKworICAgdnJpbmdfaW5pdCh2ciwgbnVtLCAodW5zaWduZWQgY2hhciopJnZxLT5xdWV1ZSk7CisKKyAgIC8qIGFjdGl2YXRlIHRoZSBxdWV1ZQorICAgICoKKyAgICAqIE5PVEU6IHZyLT5kZXNjIGlzIGluaXRpYWxpemVkIGJ5IHZyaW5nX2luaXQoKQorICAgICovCisKKyAgIG91dGwoKHVuc2lnbmVkIGxvbmcpdmlydF90b19waHlzKHZyLT5kZXNjKSA+PiBQQUdFX1NISUZULAorICAgICAgICBpb2FkZHIgKyBWSVJUSU9fUENJX1FVRVVFX1BGTik7CisKKyAgIHJldHVybiBudW07Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2J1cy92aXJ0aW8tcmluZy5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9idXMvdmlydGlvLXJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDE1ZjYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9idXMvdmlydGlvLXJpbmcuYwpAQCAtMCwwICsxLDEzNCBAQAorLyogdmlydGlvLXBjaS5jIC0gdmlydGlvIHJpbmcgbWFuYWdlbWVudAorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwOCBCdWxsIFMuQS5TLgorICoKKyAqICBBdXRob3I6IExhdXJlbnQgVml2aWVyIDxMYXVyZW50LlZpdmllckBidWxsLm5ldD4KKyAqCisgKiAgc29tZSBwYXJ0cyBmcm9tIExpbnV4IFZpcnRpbyBSaW5nCisgKgorICogIENvcHlyaWdodCBSdXN0eSBSdXNzZWxsIElCTSBDb3Jwb3JhdGlvbiAyMDA3CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICoKKyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAiZ3B4ZS9pby5oIgorI2luY2x1ZGUgImdweGUvdmlydGlvLXJpbmcuaCIKKyNpbmNsdWRlICJncHhlL3ZpcnRpby1wY2kuaCIKKworI2RlZmluZSBCVUcoKSBkbyB7IFwKKyAgIHByaW50ZigiQlVHOiBmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBcCisgICB3aGlsZSgxKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgQlVHX09OKGNvbmRpdGlvbikgZG8geyBpZiAoY29uZGl0aW9uKSBCVUcoKTsgfSB3aGlsZSAoMCkKKworLyoKKyAqIHZyaW5nX2ZyZWUKKyAqCisgKiBwdXQgYXQgdGhlIGJlZ2luIG9mIHRoZSBmcmVlIGxpc3QgdGhlIGN1cnJlbnQgZGVzY1toZWFkXQorICovCisKK3ZvaWQgdnJpbmdfZGV0YWNoKHN0cnVjdCB2cmluZ192aXJ0cXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgaGVhZCkKK3sKKyAgIHN0cnVjdCB2cmluZyAqdnIgPSAmdnEtPnZyaW5nOworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIC8qIGZpbmQgZW5kIG9mIGdpdmVuIGRlc2NyaXB0b3IgKi8KKworICAgaSA9IGhlYWQ7CisgICB3aGlsZSAodnItPmRlc2NbaV0uZmxhZ3MgJiBWUklOR19ERVNDX0ZfTkVYVCkKKyAgICAgICAgICAgaSA9IHZyLT5kZXNjW2ldLm5leHQ7CisKKyAgIC8qIGxpbmsgaXQgd2l0aCBmcmVlIGxpc3QgYW5kIHBvaW50IHRvIGl0ICovCisKKyAgIHZyLT5kZXNjW2ldLm5leHQgPSB2cS0+ZnJlZV9oZWFkOworICAgd21iKCk7CisgICB2cS0+ZnJlZV9oZWFkID0gaGVhZDsKK30KKworLyoKKyAqIHZyaW5nX2dldF9idWYKKyAqCisgKiBnZXQgYSBidWZmZXIgZnJvbSB0aGUgdXNlZCBsaXN0CisgKgorICovCisKK2ludCB2cmluZ19nZXRfYnVmKHN0cnVjdCB2cmluZ192aXJ0cXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKmxlbikKK3sKKyAgIHN0cnVjdCB2cmluZyAqdnIgPSAmdnEtPnZyaW5nOworICAgc3RydWN0IHZyaW5nX3VzZWRfZWxlbSAqZWxlbTsKKyAgIHUzMiBpZDsKKyAgIGludCByZXQ7CisKKyAgIEJVR19PTighdnJpbmdfbW9yZV91c2VkKHZxKSk7CisKKyAgIGVsZW0gPSAmdnItPnVzZWQtPnJpbmdbdnEtPmxhc3RfdXNlZF9pZHggJSB2ci0+bnVtXTsKKyAgIHdtYigpOworICAgaWQgPSBlbGVtLT5pZDsKKyAgIGlmIChsZW4gIT0gTlVMTCkKKyAgICAgICAgICAgKmxlbiA9IGVsZW0tPmxlbjsKKworICAgcmV0ID0gdnEtPnZkYXRhW2lkXTsKKworICAgdnJpbmdfZGV0YWNoKHZxLCBpZCk7CisKKyAgIHZxLT5sYXN0X3VzZWRfaWR4Kys7CisKKyAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgdnJpbmdfYWRkX2J1ZihzdHJ1Y3QgdnJpbmdfdmlydHF1ZXVlICp2cSwKKwkJICAgc3RydWN0IHZyaW5nX2xpc3QgbGlzdFtdLAorCQkgICB1bnNpZ25lZCBpbnQgb3V0LCB1bnNpZ25lZCBpbnQgaW4sCisJCSAgIGludCBpbmRleCwgaW50IG51bV9hZGRlZCkKK3sKKyAgIHN0cnVjdCB2cmluZyAqdnIgPSAmdnEtPnZyaW5nOworICAgaW50IGksIGF2YWlsLCBoZWFkLCBwcmV2OworCisgICBCVUdfT04ob3V0ICsgaW4gPT0gMCk7CisKKyAgIHByZXYgPSAwOworICAgaGVhZCA9IHZxLT5mcmVlX2hlYWQ7CisgICBmb3IgKGkgPSBoZWFkOyBvdXQ7IGkgPSB2ci0+ZGVzY1tpXS5uZXh0LCBvdXQtLSkgeworCisgICAgICAgICAgIHZyLT5kZXNjW2ldLmZsYWdzID0gVlJJTkdfREVTQ19GX05FWFQ7CisgICAgICAgICAgIHZyLT5kZXNjW2ldLmFkZHIgPSAodTY0KXZpcnRfdG9fcGh5cyhsaXN0LT5hZGRyKTsKKyAgICAgICAgICAgdnItPmRlc2NbaV0ubGVuID0gbGlzdC0+bGVuZ3RoOworICAgICAgICAgICBwcmV2ID0gaTsKKyAgICAgICAgICAgbGlzdCsrOworICAgfQorICAgZm9yICggOyBpbjsgaSA9IHZyLT5kZXNjW2ldLm5leHQsIGluLS0pIHsKKworICAgICAgICAgICB2ci0+ZGVzY1tpXS5mbGFncyA9IFZSSU5HX0RFU0NfRl9ORVhUfFZSSU5HX0RFU0NfRl9XUklURTsKKyAgICAgICAgICAgdnItPmRlc2NbaV0uYWRkciA9ICh1NjQpdmlydF90b19waHlzKGxpc3QtPmFkZHIpOworICAgICAgICAgICB2ci0+ZGVzY1tpXS5sZW4gPSBsaXN0LT5sZW5ndGg7CisgICAgICAgICAgIHByZXYgPSBpOworICAgICAgICAgICBsaXN0Kys7CisgICB9CisgICB2ci0+ZGVzY1twcmV2XS5mbGFncyAmPSB+VlJJTkdfREVTQ19GX05FWFQ7CisKKyAgIHZxLT5mcmVlX2hlYWQgPSBpOworCisgICB2cS0+dmRhdGFbaGVhZF0gPSBpbmRleDsKKworICAgYXZhaWwgPSAodnItPmF2YWlsLT5pZHggKyBudW1fYWRkZWQpICUgdnItPm51bTsKKyAgIHZyLT5hdmFpbC0+cmluZ1thdmFpbF0gPSBoZWFkOworICAgd21iKCk7Cit9CisKK3ZvaWQgdnJpbmdfa2ljayh1bnNpZ25lZCBpbnQgaW9hZGRyLCBzdHJ1Y3QgdnJpbmdfdmlydHF1ZXVlICp2cSwgaW50IG51bV9hZGRlZCkKK3sKKyAgIHN0cnVjdCB2cmluZyAqdnIgPSAmdnEtPnZyaW5nOworCisgICB3bWIoKTsKKyAgIHZyLT5hdmFpbC0+aWR4ICs9IG51bV9hZGRlZDsKKworICAgbWIoKTsKKyAgIGlmICghKHZyLT51c2VkLT5mbGFncyAmIFZSSU5HX1VTRURfRl9OT19OT1RJRlkpKQorICAgICAgICAgICB2cF9ub3RpZnkoaW9hZGRyLCB2cS0+cXVldWVfaW5kZXgpOworfQorCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvTVQyNTIxOF9QUk0uaCBiL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9NVDI1MjE4X1BSTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjdjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvTVQyNTIxOF9QUk0uaApAQCAtMCwwICsxLDM0NjIgQEAKKy8qCisgIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBhdAorICA8aHR0cDovL3d3dy5mc2Yub3JnL2NvcHlsZWZ0L2dwbC5odG1sPiwgb3IgdGhlIE9wZW5JQi5vcmcgQlNECisgIGxpY2Vuc2UsIGF2YWlsYWJsZSBpbiB0aGUgTElDRU5TRS5UWFQgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcworICBzb2Z0d2FyZS4gIFRoZXNlIGRldGFpbHMgYXJlIGFsc28gYXZhaWxhYmxlIGF0CisgIDxodHRwOi8vb3BlbmliLm9yZy9saWNlbnNlLmh0bWw+LgorCisgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICBTT0ZUV0FSRS4KKworICBDb3B5cmlnaHQgKGMpIDIwMDQgTWVsbGFub3ggVGVjaG5vbG9naWVzIEx0ZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTsKKworLyoqKgorICoqKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdCAiVHVlIE5vdiAyMiAxNToyMToyMyAyMDA1IgorICoqKiBieToKKyAqKiogICAgJSBjc3BfYmYgLWNvcHlyaWdodD0vbXN3Zy9taXNjL2xpY2Vuc2UtaGVhZGVyLnR4dCAtcHJlZml4IGFyYmVscHJtXyAtYml0cyAtZml4bmFtZXMgTVQyNTIxOF9QUk0uY3NwCisgKioqLworCisjaWZuZGVmIEhfcHJlZml4X2FyYmVscHJtX2JpdHNfZml4bmFtZXNfTVQyNTIxOF9QUk1fY3NwX0gKKyNkZWZpbmUgSF9wcmVmaXhfYXJiZWxwcm1fYml0c19maXhuYW1lc19NVDI1MjE4X1BSTV9jc3BfSAorCisvKiBVRCBBZGRyZXNzIFZlY3RvciAqLworCitzdHJ1Y3QgYXJiZWxwcm1fdWRfYWRkcmVzc192ZWN0b3Jfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXBkWzB4MDAwMThdOyAgICAgICAgICAgLyogUHJvdGVjdGlvbiBEb21haW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcG9ydF9udW1iZXJbMHgwMDAwMl07ICAvKiBQb3J0IG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBQb3J0IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gUG9ydCAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgLSByZXNlcnZlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwNl07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlybGlkWzB4MDAwMTBdOyAgICAgICAgIC8qIFJlbW90ZSAoRGVzdGluYXRpb24pIExJRCAqLworICAgIHBzZXVkb19iaXRfdAlteV9saWRfcGF0aF9iaXRzWzB4MDAwMDddOy8qIFNvdXJjZSBMSUQgLSB0aGUgbG93ZXIgNyBiaXRzICh1cHBlciBiaXRzIGFyZSB0YWtlbiBmcm9tIFBvcnRJbmZvKSAqLworICAgIHBzZXVkb19iaXRfdAlnWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIEdsb2JhbCBhZGRyZXNzIGVuYWJsZSAtIGlmIHNldCwgR1JIIHdpbGwgYmUgZm9ybWVkIGZvciBwYWNrZXQgaGVhZGVyICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWhvcF9saW1pdFsweDAwMDA4XTsgICAgLyogSVB2NiBob3AgbGltaXQgKi8KKyAgICBwc2V1ZG9fYml0X3QJbWF4X3N0YXRfcmF0ZVsweDAwMDAzXTsvKiBNYXhpbXVtIHN0YXRpYyByYXRlIGNvbnRyb2wuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSA0WCBpbmplY3Rpb24gcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSAxWCBpbmplY3Rpb24gcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIC0gcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAltc2dbMHgwMDAwMl07ICAgICAgICAgIC8qIE1heCBNZXNzYWdlIHNpemUsIHNpemUgaXMgMjU2KjJeTVNHIGJ5dGVzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJbWdpZF9pbmRleFsweDAwMDA2XTsgICAvKiBJbmRleCB0byBwb3J0IEdJRCB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1naWRfaW5kZXggPSAocG9ydF9udW1iZXItMSkgKiAyXmxvZ19tYXhfZ2lkICsgZ2lkX2luZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlcmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gbG9nX21heF9naWQgaXMgdGFrZW4gZnJvbSBRVUVSWV9ERVZfTElNIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBnaWRfaW5kZXggaXMgdGhlIGluZGV4IHRvIHRoZSBHSUQgdGFibGUgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMGFdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZmxvd19sYWJlbFsweDAwMDE0XTsgICAvKiBJUHY2IGZsb3cgbGFiZWwgKi8KKyAgICBwc2V1ZG9fYml0X3QJdGNsYXNzWzB4MDAwMDhdOyAgICAgICAvKiBJUHY2IFRDbGFzcyAqLworICAgIHBzZXVkb19iaXRfdAlzbFsweDAwMDA0XTsgICAgICAgICAgIC8qIEluZmluaUJhbmQgU2VydmljZSBMZXZlbCAoU0wpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZ2lkXzEyN185NlsweDAwMDIwXTsgIC8qIFJlbW90ZSBHSURbMTI3Ojk2XSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmdpZF85NV82NFsweDAwMDIwXTsgICAvKiBSZW1vdGUgR0lEWzk1OjY0XSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmdpZF82M18zMlsweDAwMDIwXTsgICAvKiBSZW1vdGUgR0lEWzYzOjMyXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmdpZF8zMV8wWzB4MDAwMjBdOyAgICAvKiBSZW1vdGUgR0lEWzMxOjBdIGlmIEcgYml0IGlzIHNldC4gTXVzdCBiZSBzZXQgdG8gMHgyIGlmIEcgYml0IGlzIGNsZWFyZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFNlbmQgZG9vcmJlbGwgKi8KKworc3RydWN0IGFyYmVscHJtX3NlbmRfZG9vcmJlbGxfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CW5vcGNvZGVbMHgwMDAwNV07ICAgICAgLyogT3Bjb2RlIG9mIGRlc2NyaXB0b3IgdG8gYmUgZXhlY3V0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJZlsweDAwMDAxXTsgICAgICAgICAgICAvKiBGZW5jZSBiaXQuIElmIHNldCwgZGVzY3JpcHRvciBpcyBmZW5jZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAl3cWVfY291bnRlclsweDAwMDEwXTsgIC8qIE1vZHVsby02NEsgY291bnRlciBvZiBXUUVzIHBvc3RlZCB0byB0aGUgUVAgc2luY2UgaXRzIGNyZWF0aW9uIGV4Y2x1ZGluZyB0aGUgbmV3bHkgcG9zdGVkIFdRRXMgaW4gdGhpcyBkb29yYmVsbC4gU2hvdWxkIGJlIHplcm8gZm9yIHRoZSBmaXJzdCBkb29yYmVsbCBvbiB0aGUgUVAgKi8KKyAgICBwc2V1ZG9fYml0X3QJd3FlX2NudFsweDAwMDA4XTsgICAgICAvKiBOdW1iZXIgb2YgV1FFcyBwb3N0ZWQgd2l0aCB0aGlzIGRvb3JiZWxsLiBNdXN0IGJlIGdyYXRlciB0aGVuIHplcm8uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAluZHNbMHgwMDAwNl07ICAgICAgICAgIC8qIE5leHQgZGVzY3JpcHRvciBzaXplIChpbiAxNi1ieXRlIGNodW5rcykgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlxcG5bMHgwMDAxOF07ICAgICAgICAgIC8qIFFQIG51bWJlciB0aGlzIGRvb3JiZWxsIGlzIHJ1bmcgb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogQUNDRVNTX0xBTV9pbmplY3RfZXJyb3JzX2lucHV0X21vZGlmaWVyICovCisKK3N0cnVjdCBhcmJlbHBybV9hY2Nlc3NfbGFtX2luamVjdF9lcnJvcnNfaW5wdXRfbW9kaWZpZXJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWluZGV4M1sweDAwMDA3XTsKKyAgICBwc2V1ZG9fYml0X3QJcTNbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CWluZGV4MlsweDAwMDA3XTsKKyAgICBwc2V1ZG9fYml0X3QJcTJbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CWluZGV4MVsweDAwMDA3XTsKKyAgICBwc2V1ZG9fYml0X3QJcTFbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CWluZGV4MFsweDAwMDA3XTsKKyAgICBwc2V1ZG9fYml0X3QJcTBbMHgwMDAwMV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEFDQ0VTU19MQU1faW5qZWN0X2Vycm9yc19pbnB1dF9wYXJhbWV0ZXIgKi8KKworc3RydWN0IGFyYmVscHJtX2FjY2Vzc19sYW1faW5qZWN0X2Vycm9yc19pbnB1dF9wYXJhbWV0ZXJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWJhWzB4MDAwMDJdOyAgICAgICAgICAgLyogQmFuayBBZGRyZXNzICovCisgICAgcHNldWRvX2JpdF90CWRhWzB4MDAwMDJdOyAgICAgICAgICAgLyogRGltbSBBZGRyZXNzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDFjXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJhWzB4MDAwMTBdOyAgICAgICAgICAgLyogUm93IEFkZHJlc3MgKi8KKyAgICBwc2V1ZG9fYml0X3QJY2FbMHgwMDAxMF07ICAgICAgICAgICAvKiBDb2x1bW4gQWRkcmVzcyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiAgKi8KKworc3RydWN0IGFyYmVscHJtX3JlY3Zfd3FlX3NlZ21lbnRfbmV4dF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDZdOworICAgIHBzZXVkb19iaXRfdAluZGFfMzFfNlsweDAwMDFhXTsgICAgIC8qIE5leHQgV1FFIGFkZHJlc3MsIGxvdyAzMiBiaXQuIFdRRSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byA2NC1ieXRlIGJvdW5kYXJ5ICg2IExTQiBhcmUgZm9yY2VkIFpFUk8pLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbmRzWzB4MDAwMDZdOyAgICAgICAgICAvKiBOZXh0IFdRRSBzaXplIGluIE9jdG9Xb3JkcyAoMTYgYnl0ZXMpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaZXJvIHZhbHVlIGluIE5EUyBmaWVsZCBzaWduYWxzIGVuZCBvZiBXUUVzPyBjaGFpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMWFdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTZW5kIHdxZSBzZWdtZW50IGRhdGEgaW5saW5lICovCisKK3N0cnVjdCBhcmJlbHBybV93cWVfc2VnbWVudF9kYXRhX2lubGluZV9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnl0ZV9jb3VudFsweDAwMDBhXTsgICAvKiBOb3QgaW5jbHVkaW5nIHBhZGRpbmcgZm9yIDE2Qnl0ZSBjaHVua3MgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMTVdOworICAgIHBzZXVkb19iaXRfdAlhbHdheXMxWzB4MDAwMDFdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGF0YVsweDAwMDE4XTsgICAgICAgICAvKiBEYXRhIG1heSBiZSBtb3JlIHRoaXMgc2VnbWVudCBzaXplIC0gaW4gMTZCeXRlIGNodW5rcyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFNlbmQgd3FlIHNlZ21lbnQgZGF0YSBwdHIgKi8KKworc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X2RhdGFfcHRyX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlieXRlX2NvdW50WzB4MDAwMWZdOworICAgIHBzZXVkb19iaXRfdAlhbHdheXMwWzB4MDAwMDFdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbF9rZXlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2NhbF9hZGRyZXNzX2hbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2NhbF9hZGRyZXNzX2xbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFNlbmQgd3FlIHNlZ21lbnQgcmQgKi8KKworc3RydWN0IGFyYmVscHJtX2xvY2FsX2ludmFsaWRhdGVfc2VnbWVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWVtX2tleVsweDAwMDE4XTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwYTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBGYXN0X1JlZ2lzdHJhdGlvbl9TZWdtZW50ICovCisKK3N0cnVjdCBhcmJlbHBybV9mYXN0X3JlZ2lzdHJhdGlvbl9zZWdtZW50X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAxYl07CisgICAgcHNldWRvX2JpdF90CWxyWzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0IC0gTG9jYWwgUmVhZCBhY2Nlc3Mgd2lsbCBiZSBlbmFibGVkICovCisgICAgcHNldWRvX2JpdF90CWx3WzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0IC0gTG9jYWwgV3JpdGUgYWNjZXNzIHdpbGwgYmUgZW5hYmxlZCAqLworICAgIHBzZXVkb19iaXRfdAlyclsweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCAtIFJlbW90ZSBSZWFkIGFjY2VzcyB3aWxsIGJlIGVuYWJsZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcndbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgLSBSZW1vdGUgV3JpdGUgYWNjZXNzIHdpbGwgYmUgZW5hYmxlZCAqLworICAgIHBzZXVkb19iaXRfdAlhWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIElmIHNldCAtIFJlbW90ZSBBdG9taWMgYWNjZXNzIHdpbGwgYmUgZW5hYmxlZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGJsX3B0cl82M18zMlsweDAwMDIwXTsvKiBQaHlzaWNhbCBhZGRyZXNzIHBvaW50ZXIgWzYzOjMyXSB0byB0aGUgcGh5c2ljYWwgYnVmZmVyIGxpc3QgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1lbV9rZXlbMHgwMDAyMF07ICAgICAgLyogTWVtb3J5IEtleSBvbiB3aGljaCB0aGUgZmFzdCByZWdpc3RyYXRpb24gaXMgZXhlY3V0ZWQgb24uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlwYWdlX3NpemVbMHgwMDAwNV07ICAgIC8qIFBhZ2Ugc2l6ZSB1c2VkIGZvciB0aGUgcmVnaW9uLiBBY3R1YWwgc2l6ZSBpcyBbNEtdKjJeUGFnZV9zaXplIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDIwLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXpiWzB4MDAwMDFdOyAgICAgICAgICAgLyogWmVybyBCYXNlZCBSZWdpb24gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGJsX3B0cl8zMV84WzB4MDAwMThdOyAvKiBQaHlzaWNhbCBhZGRyZXNzIHBvaW50ZXIgWzMxOjhdIHRvIHRoZSBwaHlzaWNhbCBidWZmZXIgbGlzdCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhcnRfYWRkcmVzc19oWzB4MDAwMjBdOy8qIFN0YXJ0IEFkZHJlc3NbNjM6MzJdIC0gVmlydHVhbCBBZGRyZXNzIHdoZXJlIHRoaXMgcmVnaW9uIHN0YXJ0cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhcnRfYWRkcmVzc19sWzB4MDAwMjBdOy8qIFN0YXJ0IEFkZHJlc3NbMzE6MF0gLSBWaXJ0dWFsIEFkZHJlc3Mgd2hlcmUgdGhpcyByZWdpb24gc3RhcnRzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZWdfbGVuX2hbMHgwMDAyMF07ICAgIC8qIFJlZ2lvbiBMZW5ndGhbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZWdfbGVuX2xbMHgwMDAyMF07ICAgIC8qIFJlZ2lvbiBMZW5ndGhbMzE6MF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogU2VuZCB3cWUgc2VnbWVudCBhdG9taWMgKi8KKworc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X2F0b21pY19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3dhcF9hZGRfaFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN3YXBfYWRkX2xbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljb21wYXJlX2hbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljb21wYXJlX2xbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFNlbmQgd3FlIHNlZ21lbnQgcmVtb3RlIGFkZHJlc3MgKi8KKworc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X3JlbW90ZV9hZGRyZXNzX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZW1vdGVfdmlydF9hZGRyX2hbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZW1vdGVfdmlydF9hZGRyX2xbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlya2V5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBlbmQgd3FlIHNlZ21lbnQgYmluZCAqLworCitzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfYmluZF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMWRdOworICAgIHBzZXVkb19iaXRfdAlyclsweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCwgUmVtb3RlIFJlYWQgRW5hYmxlIGZvciBib3VuZCB3aW5kb3cuICovCisgICAgcHNldWRvX2JpdF90CXJ3WzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0LCBSZW1vdGUgV3JpdGUgRW5hYmxlIGZvciBib3VuZCB3aW5kb3cuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgcHNldWRvX2JpdF90CWFbMHgwMDAwMV07ICAgICAgICAgICAgLyogSWYgc2V0LCBBdG9taWMgRW5hYmxlIGZvciBib3VuZCB3aW5kb3cuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAxZV07CisgICAgcHNldWRvX2JpdF90CXpiWzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0LCBXaW5kb3cgaXMgWmVybyBCYXNlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJdHlwZVsweDAwMDAxXTsgICAgICAgICAvKiBXaW5kb3cgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gVHlwZSBvbmUgd2luZG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIFR5cGUgdHdvIHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbmV3X3JrZXlbMHgwMDAyMF07ICAgICAvKiBUaGUgbmV3IFJLZXkgb2Ygd2luZG93IHRvIGJpbmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlZ2lvbl9sa2V5WzB4MDAwMjBdOyAgLyogTG9jYWwga2V5IG9mIHJlZ2lvbiwgd2hpY2ggd2luZG93IHdpbGwgYmUgYm91bmQgdG8gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN0YXJ0X2FkZHJlc3NfaFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN0YXJ0X2FkZHJlc3NfbFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxlbmd0aF9oWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbGVuZ3RoX2xbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFNlbmQgd3FlIHNlZ21lbnQgdWQgKi8KKworc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X3VkX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHN0cnVjdCBhcmJlbHBybV91ZF9hZGRyZXNzX3ZlY3Rvcl9zdAl1ZF9hZGRyZXNzX3ZlY3RvcjsvKiBVRCBBZGRyZXNzIFZlY3RvciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGVzdGluYXRpb25fcXBbMHgwMDAxOF07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXFfa2V5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTZW5kIHdxZSBzZWdtZW50IHJkICovCisKK3N0cnVjdCBhcmJlbHBybV93cWVfc2VnbWVudF9yZF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGVzdGluYXRpb25fcXBbMHgwMDAxOF07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXFfa2V5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTZW5kIHdxZSBzZWdtZW50IGN0cmwgKi8KKworc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X2N0cmxfc2VuZF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJYWx3YXlzMVsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJc1sweDAwMDAxXTsgICAgICAgICAgICAvKiBTb2xpY2l0ZWQgRXZlbnQgYml0LiBJZiBzZXQsIFNFIChTb2xpY2l0ZWQgRXZlbnQpIGJpdCBpcyBzZXQgaW4gdGhlIChsYXN0IHBhY2tldCBvZikgbWVzc2FnZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZVsweDAwMDAxXTsgICAgICAgICAgICAvKiBFdmVudCBiaXQuIElmIHNldCwgZXZlbnQgaXMgZ2VuZXJhdGVkIHVwb24gV1FFP3MgY29tcGxldGlvbiwgaWYgUVAgaXMgYWxsb3dlZCB0byBnZW5lcmF0ZSBhbiBldmVudC4gRXZlcnkgV1FFIHdpdGggRS1iaXQgc2V0IGdlbmVyYXRlcyBhbiBldmVudC4gVGhlIEMgYml0IG11c3QgYmUgc2V0IG9uIHVuc2lnbmFsbGVkIFFQcyBpZiB0aGUgRSBiaXQgaXMgc2V0LiAqLworICAgIHBzZXVkb19iaXRfdAljWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIENvbXBsZXRpb24gUXVldWUgYml0LiBWYWxpZCBmb3IgdW5zaWduYWxsZWQgUVBzIG9ubHkuIElmIHNldCwgdGhlIENRIGlzIHVwZGF0ZWQgdXBvbiBXUUU/cyBjb21wbGV0aW9uICovCisgICAgcHNldWRvX2JpdF90CWlwWzB4MDAwMDFdOyAgICAgICAgICAgLyogV2hlbiBzZXQsIEluZmluaUhvc3QgSUlJIEV4IHdpbGwgY2FsY3VsYXRlIHRoZSBJUCBjaGVja3N1bSBvZiB0aGUgSVAgaGVhZGVyIHRoYXQgaXMgcHJlc2VudCBpbW1lZGlhdGVseSBhZnRlciB0aGUgSVBvdmVySUIgZW5jYXBzdWxhdGlvbiBoZWFkZXIuIEluIHRoZSBjYXNlIG9mIG11bHRpcGxlIGhlYWRlcnMgKGVuY2Fwc3VsYXRpb24pLCBJbmZpbmlIb3N0IElJSSBFeCB3aWxsIGNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gb25seSBmb3IgdGhlIGZpcnN0IElQIGhlYWRlciBmb2xsb3dpbmcgdGhlIElQb3ZlcklCIGVuY2Fwc3VsYXRpb24gaGVhZGVyLiBOb3QgVmFsaWQgZm9yIElQdjYgcGFja2V0cyAqLworICAgIHBzZXVkb19iaXRfdAl0Y3BfdWRwWzB4MDAwMDFdOyAgICAgIC8qIFdoZW4gc2V0LCBJbmZpbmlIb3N0IElJSSBFeCB3aWxsIGNhbGN1bGF0ZSB0aGUgVENQL1VEUCBjaGVja3N1bSBvZiB0aGUgcGFja2V0IHRoYXQgaXMgcHJlc2VudCBpbW1lZGlhdGVseSBhZnRlciB0aGUgSVAgaGVhZGVyLiBJbiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBoZWFkZXJzIChlbmNhcHN1bGF0aW9uKSwgSW5maW5pSG9zdCBJSUkgRXggd2lsbCBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtIG9ubHkgZm9yIHRoZSBmaXJzdCBUQ1AgaGVhZGVyIGZvbGxvd2luZyB0aGUgSVAgaGVhZGVyLiBUaGlzIGJpdCBtYXkgYmUgc2V0IG9ubHkgaWYgdGhlIGVudGlyZSBUQ1AvVURQIHNlZ21lbnQgaXMgcHJlc2VudCBpbiBvbmUgSUIgcGFja2V0ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJc29bMHgwMDAwMV07ICAgICAgICAgICAvKiBTdHJvbmcgT3JkZXJpbmcgLSB3aGVuIHNldCwgdGhlIFdRRSB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgYWZ0ZXIgYWxsIHByZXZpb3VzIFdRRXMgaGF2ZSBiZWVuIGV4ZWN1dGVkLiBDYW4gYmUgc2V0IGZvciBSQyBXUUVzIG9ubHkuIFRoaXMgYml0IG11c3QgYmUgc2V0IGluIHR5cGUgdHdvIEJJTkQsIEZhc3QgUmVnaXN0cmF0aW9uIGFuZCBMb2NhbCBpbnZhbGlkYXRlIG9wZXJhdGlvbnMuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDE4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWltbWVkaWF0ZVsweDAwMDIwXTsgICAgLyogSWYgdGhlIE9wQ29kZSBlbmNvZGVzIGFuIG9wZXJhdGlvbiB3aXRoIEltbWVkaWF0ZSAoUkRNQS13cml0ZS9TRU5EKSwgVGhpcyBmaWVsZCB3aWxsIGhvbGQgdGhlIEltbWVkaWF0ZSBkYXRhIHRvIGJlIHNlbnQuIElmIHRoZSBPcENvZGUgZW5jb2RlcyBzZW5kIGFuZCBpbnZhbGlkYXRlIG9wZXJhdGlvbnMsIHRoaXMgZmllbGQgaG9sZHMgdGhlIEludmFsaWRhdGlvbiBrZXkgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgcGFja2V0OyBvdGhlcndpc2UsIHRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFNlbmQgd3FlIHNlZ21lbnQgbmV4dCAqLworCitzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfbmV4dF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbm9wY29kZVsweDAwMDA1XTsgICAgICAvKiBOZXh0IE9wY29kZTogT3BDb2RlIHRvIGJlIHVzZWQgaW4gdGhlIG5leHQgV1FFLiBFbmNvZGVzIHRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZCBvbiB0aGUgUVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzAwMDAwPyAtIE5PUC4gV1FFIHdpdGggdGhpcyBvcGNvZGUgY3JlYXRlcyBhIGNvbXBsZXRpb24sIGJ1dCBkb2VzIG5vdGhpbmcgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8wMTAwMD8gLSBSRE1BLXdyaXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzAxMDAxPyAtIFJETUEtV3JpdGUgd2l0aCBJbW1lZGlhdGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzEwMDAwPyAtIFJETUEtcmVhZCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzEwMDAxPyAtIEF0b21pYyBDb21wYXJlICYgc3dhcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8xMDAxMD8gLSBBdG9taWMgRmV0Y2ggJiBBZGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/MTEwMDA/IC0gQmluZCBtZW1vcnkgd2luZG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVuY29kaW5nIGZvciB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgZGVwZW5kcyBvbiB0aGUgUVAgdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgUkMsIFVDIGFuZCBSRCBRUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/MDEwMTA/IC0gU0VORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8wMTAxMT8gLSBTRU5EIHdpdGggSW1tZWRpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIFVEIFFQOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW5jb2RpbmcgZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mIGJpdFszMV0gb2YgdGhlIFFfa2V5IGZpZWxkIGluIHRoZSBEYXRhZ3JhbSBTZWdtZW50IChzZWUgVGFibGUgMzksID9VbnJlbGlhYmxlIERhdGFncmFtIFNlZ21lbnQgRm9ybWF0IC0gUG9pbnRlcnMsPyBvbiBwYWdlIDEwMSkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoICB0aGUgY3VycmVudCBXUUUgYW5kIHRoZSBuZXh0IFdRRSwgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiAgdGhlIGxhc3QgV1FFIFFfS2V5IGJpdFszMV0gaXMgY2xlYXIgYW5kIHRoZSBuZXh0IFdRRSBRX2tleSBiaXRbMzFdIGlzIHNldCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzAxMDAwPyAtIFNFTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/MDEwMDE/IC0gU0VORCB3aXRoIEltbWVkaWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSAoaWYgdGhlIG5leHQgV1FFIFFfa2V5IGJpdFszMV0gaXMgY2xlYXJlZCwgb3IgdGhlIGxhc3QgV1FFIFFfS2V5IGJpdFszMV0gaXMgc2V0KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/MDEwMTA/IC0gU0VORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8wMTAxMT8gLSBTRU5EIHdpdGggSW1tZWRpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIG90aGVyIG9wY29kZSB2YWx1ZXMgYXJlIFJFU0VSVkVELCBhbmQgd2lsbCByZXN1bHQgaW4gaW52YWxpZCBvcGVyYXRpb24gZXhlY3V0aW9uLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CW5kYV8zMV82WzB4MDAwMWFdOyAgICAgLyogTmV4dCBXUUUgYWRkcmVzcywgbG93IDMyIGJpdC4gV1FFIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIDY0LWJ5dGUgYm91bmRhcnkgKDYgTFNCIGFyZSBmb3JjZWQgWkVSTykuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAluZHNbMHgwMDAwNl07ICAgICAgICAgIC8qIE5leHQgV1FFIHNpemUgaW4gT2N0b1dvcmRzICgxNiBieXRlcykuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFplcm8gdmFsdWUgaW4gTkRTIGZpZWxkIHNpZ25hbHMgZW5kIG9mIFdRRXM/IGNoYWluLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlmWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIEZlbmNlIGJpdC4gSWYgc2V0LCBuZXh0IFdRRSB3aWxsIHN0YXJ0IGV4ZWN1dGlvbiBvbmx5IGFmdGVyIGFsbCBwcmV2aW91cyBSZWFkL0F0b21pYyBXUUVzIGNvbXBsZXRlLiAqLworICAgIHBzZXVkb19iaXRfdAlhbHdheXMxWzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAxOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEFkZHJlc3MgUGF0aCAqLworCitzdHJ1Y3QgYXJiZWxwcm1fYWRkcmVzc19wYXRoX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlwa2V5X2luZGV4WzB4MDAwMDddOyAgIC8qIFBLZXkgdGFibGUgaW5kZXggKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMTFdOworICAgIHBzZXVkb19iaXRfdAlwb3J0X251bWJlclsweDAwMDAyXTsgIC8qIFNwZWNpZmljIHBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUVAvRUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIFBvcnQgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLSBQb3J0IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciAtIHJlc2VydmVkICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDA2XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJsaWRbMHgwMDAxMF07ICAgICAgICAgLyogUmVtb3RlIChEZXN0aW5hdGlvbikgTElEICovCisgICAgcHNldWRvX2JpdF90CW15X2xpZF9wYXRoX2JpdHNbMHgwMDAwN107LyogU291cmNlIExJRCAtIHRoZSBsb3dlciA3IGJpdHMgKHVwcGVyIGJpdHMgYXJlIHRha2VuIGZyb20gUG9ydEluZm8pICovCisgICAgcHNldWRvX2JpdF90CWdbMHgwMDAwMV07ICAgICAgICAgICAgLyogR2xvYmFsIGFkZHJlc3MgZW5hYmxlIC0gaWYgc2V0LCBHUkggd2lsbCBiZSBmb3JtZWQgZm9yIHBhY2tldCBoZWFkZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAlybnJfcmV0cnlbMHgwMDAwM107ICAgIC8qIFJOUiByZXRyeSBjb3VudCAoc2VlIEM5LTEzMiBpbiBJQiBzcGVjIFZvbCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAtNiAtIG51bWJlciBvZiByZXRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgICAtIGluZmluaXRlICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlob3BfbGltaXRbMHgwMDAwOF07ICAgIC8qIElQdjYgaG9wIGxpbWl0ICovCisgICAgcHNldWRvX2JpdF90CW1heF9zdGF0X3JhdGVbMHgwMDAwM107LyogTWF4aW11bSBzdGF0aWMgcmF0ZSBjb250cm9sLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gMTAwJSBpbmplY3Rpb24gcmF0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gMjUlIGluamVjdGlvbiByYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIDEyLjUlIGluamVjdGlvbiByYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtIDUwJSBpbmplY3Rpb24gcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIC0gcmVzZXJ2ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAltZ2lkX2luZGV4WzB4MDAwMDZdOyAgIC8qIEluZGV4IHRvIHBvcnQgR0lEIHRhYmxlICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDA1XTsKKyAgICBwc2V1ZG9fYml0X3QJYWNrX3RpbWVvdXRbMHgwMDAwNV07ICAvKiBMb2NhbCBBQ0sgdGltZW91dCAtIFRyYW5zcG9ydCB0aW1lciBmb3IgYWN0aXZhdGlvbiBvZiByZXRyYW5zbWlzc2lvbiBtZWNoYW5pc20uIFJlZmVyIHRvIElCIHNwZWMgVm9sMSA5LjcuNi4xLjMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdHJhbnNwb3J0IHRpbWVyIGlzIHNldCB0byA0LjA5NnVzKjJeYWNrX3RpbWVvdXQsIGlmIGFja190aW1lb3V0IGlzIDAgdGhlbiB0cmFuc3BvcnQgdGltZXIgaXMgZGlzYWJsZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlmbG93X2xhYmVsWzB4MDAwMTRdOyAgIC8qIElQdjYgZmxvdyBsYWJlbCAqLworICAgIHBzZXVkb19iaXRfdAl0Y2xhc3NbMHgwMDAwOF07ICAgICAgIC8qIElQdjYgVENsYXNzICovCisgICAgcHNldWRvX2JpdF90CXNsWzB4MDAwMDRdOyAgICAgICAgICAgLyogSW5maW5pQmFuZCBTZXJ2aWNlIExldmVsIChTTCkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJnaWRfMTI3Xzk2WzB4MDAwMjBdOyAgLyogUmVtb3RlIEdJRFsxMjc6OTZdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZ2lkXzk1XzY0WzB4MDAwMjBdOyAgIC8qIFJlbW90ZSBHSURbOTU6NjRdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZ2lkXzYzXzMyWzB4MDAwMjBdOyAgIC8qIFJlbW90ZSBHSURbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZ2lkXzMxXzBbMHgwMDAyMF07ICAgIC8qIFJlbW90ZSBHSURbMzE6MF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogSENBIENvbW1hbmQgUmVnaXN0ZXIgKEhDUikgKi8KKworc3RydWN0IGFyYmVscHJtX2hjYV9jb21tYW5kX3JlZ2lzdGVyX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlpbl9wYXJhbV9oWzB4MDAwMjBdOyAgIC8qIElucHV0IFBhcmFtZXRlcjogcGFyYW1ldGVyWzYzOjMyXSBvciBwb2ludGVyWzYzOjMyXSB0byBpbnB1dCBtYWlsYm94IChzZWUgY29tbWFuZCBkZXNjcmlwdGlvbikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWluX3BhcmFtX2xbMHgwMDAyMF07ICAgLyogSW5wdXQgUGFyYW1ldGVyOiBwYXJhbWV0ZXJbMzE6MF0gb3IgcG9pbnRlclszMTowXSB0byBpbnB1dCBtYWlsYm94IChzZWUgY29tbWFuZCBkZXNjcmlwdGlvbikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWlucHV0X21vZGlmaWVyWzB4MDAwMjBdOy8qIElucHV0IFBhcmFtZXRlciBNb2RpZmllciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3V0X3BhcmFtX2hbMHgwMDAyMF07ICAvKiBPdXRwdXQgUGFyYW1ldGVyOiBwYXJhbWV0ZXJbNjM6MzJdIG9yIHBvaW50ZXJbNjM6MzJdIHRvIG91dHB1dCBtYWlsYm94IChzZWUgY29tbWFuZCBkZXNjcmlwdGlvbikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW91dF9wYXJhbV9sWzB4MDAwMjBdOyAgLyogT3V0cHV0IFBhcmFtZXRlcjogcGFyYW1ldGVyWzMxOjBdIG9yIHBvaW50ZXJbMzE6MF0gdG8gb3V0cHV0IG1haWxib3ggKHNlZSBjb21tYW5kIGRlc2NyaXB0aW9uKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMTBdOworICAgIHBzZXVkb19iaXRfdAl0b2tlblsweDAwMDEwXTsgICAgICAgIC8qIFNvZnR3YXJlIGFzc2lnbmVkIHRva2VuIHRvIHRoZSBjb21tYW5kLCB0byB1bmlxdWVseSBpZGVudGlmeSBpdC4gVGhlIHRva2VuIGlzIHJldHVybmVkIHRvIHRoZSBzb2Z0d2FyZSBpbiB0aGUgRVFFIHJlcG9ydGVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3Bjb2RlWzB4MDAwMGNdOyAgICAgICAvKiBDb21tYW5kIG9wY29kZSAqLworICAgIHBzZXVkb19iaXRfdAlvcGNvZGVfbW9kaWZpZXJbMHgwMDAwNF07LyogT3Bjb2RlIE1vZGlmaWVyLCBzZWUgc3BlY2lmaWMgZGVzY3JpcHRpb24gZm9yIGVhY2ggY29tbWFuZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDZdOworICAgIHBzZXVkb19iaXRfdAllWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIEV2ZW50IFJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gRG9uJ3QgcmVwb3J0IGV2ZW50IChzb2Z0d2FyZSB3aWxsIHBvbGwgdGhlIEdPIGJpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gUmVwb3J0IGV2ZW50IHRvIEVRIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzICovCisgICAgcHNldWRvX2JpdF90CWdvWzB4MDAwMDFdOyAgICAgICAgICAgLyogR28gKDA9U29mdHdhcmUgb3duZXJzaGlwIGZvciB0aGUgSENSLCAxPUhhcmR3YXJlIG93bmVyc2hpcCBmb3IgdGhlIEhDUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2Z0d2FyZSBjYW4gd3JpdGUgdG8gdGhlIEhDUiBvbmx5IGlmIEdvIGJpdCBpcyBjbGVhcmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIG11c3Qgc2V0IHRoZSBHbyBiaXQgdG8gdHJpZ2dlciB0aGUgSFcgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZC4gU29mdHdhcmUgbXVzdCBub3Qgd3JpdGUgdG8gdGhpcyByZWdpc3RlciB2YWx1ZSBvdGhlciB0aGFuIDEgZm9yIHRoZSBHbyBiaXQuICovCisgICAgcHNldWRvX2JpdF90CXN0YXR1c1sweDAwMDA4XTsgICAgICAgLyogQ29tbWFuZCBleGVjdXRpb24gc3RhdHVzIHJlcG9ydC4gVmFsaWQgb25seSBpZiBjb21tYW5kIGludGVyZmFjZSBpbiB1bmRlciBTVyBvd25lcnNoaXAgKEdvIGJpdCBpcyBjbGVhcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBjb21tYW5kIGNvbXBsZXRlZCB3aXRob3V0IGVycm9yLiBJZiBkaWZmZXJlbnQgdGhhbiB6ZXJvLCBjb21tYW5kIGV4ZWN1dGlvbiBjb21wbGV0ZWQgd2l0aCBlcnJvci4gU3luZHJvbSBlbmNvZGluZyBpcyBkZXBlbmRlZCBvbiBjb21tYW5kIGV4ZWN1dGVkIGFuZCBpcyBkZWZpbmVkIGZvciBlYWNoIGNvbW1hbmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogQ1EgRG9vcmJlbGwgKi8KKworc3RydWN0IGFyYmVscHJtX2NxX2NtZF9kb29yYmVsbF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FuWzB4MDAwMThdOyAgICAgICAgICAvKiBDUSBudW1iZXIgYWNjZXNzZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJY21kWzB4MDAwMDNdOyAgICAgICAgICAvKiBDb21tYW5kIHRvIGJlIGV4ZWN1dGVkIG9uIENRCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwIC0gUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEgLSBSZXF1ZXN0IG5vdGlmaWNhdGlvbiBmb3IgbmV4dCBTb2xpY2l0ZWQgY29tcGxldGlvbiBldmVudC4gQ1FfcGFyYW0gc3BlY2lmaWVzIHRoZSBjdXJyZW50IENRIENvbnN1bWVyIENvdW50ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyIC0gUmVxdWVzdCBub3RpZmljYXRpb24gZm9yIG5leHQgU29saWNpdGVkIG9yIFVuc29saWNpdGVkIGNvbXBsZXRpb24gZXZlbnQuIENRX3BhcmFtIHNwZWNpZmllcyB0aGUgY3VycmVudCBDUSBDb25zdW1lciBDb3VudGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MyAtIFJlcXVlc3Qgbm90aWZpY2F0aW9uIGZvciBtdWx0aXBsZSBjb21wbGV0aW9ucyAoQXJtLU4pLiBDUV9wYXJhbSBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBDUSBDb3VudGVyIHRoYXQgd2hlbiByZWFjaGVkIGJ5IEhXIChpLmUuIEhXIGdlbmVyYXRlcyBhIENRRSBpbnRvIHRoaXMgQ291bnRlcikgRXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlciAtIFJlc2VydmVkICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJY21kX3NuWzB4MDAwMDJdOyAgICAgICAvKiBDb21tYW5kIFNlcXVlbmNlIE51bWJlciAtIFRoaXMgZmllbGQgc2hvdWxkIGJlIGluY3JlbWVudGVkIHVwb24gcmVjZWl2aW5nIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIG9mIHRoZSByZXNwZWN0aXZlIENRLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNpdGlvbiBpcyBkb25lIGJ5IHJpbmdpbmcgUmVxdWVzdCBub3RpZmljYXRpb24gZm9yIG5leHQgU29saWNpdGVkLCBSZXF1ZXN0IG5vdGlmaWNhdGlvbiBmb3IgbmV4dCBTb2xpY2l0ZWQgb3IgVW5zb2xpY2l0ZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiBvciBSZXF1ZXN0IG5vdGlmaWNhdGlvbiBmb3IgbXVsdGlwbGUgY29tcGxldGlvbnMgZG9vcmJlbGxzIGFmdGVyIHJlY2VpdmluZyBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIGluaXRpYWxpemVkIHRvIFplcm8gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDJdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FfcGFyYW1bMHgwMDAyMF07ICAgICAvKiBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBieSBDUSBjb21tYW5kICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFJELXNlbmQgZG9vcmJlbGwgKi8KKworc3RydWN0IGFyYmVscHJtX3JkX3NlbmRfZG9vcmJlbGxfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJZWVuWzB4MDAwMThdOyAgICAgICAgICAvKiBFbmQtdG8tZW5kIGNvbnRleHQgbnVtYmVyIChyZWxpYWJsZSBkYXRhZ3JhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHplcm8gZm9yIE5vcCBhbmQgQmluZCBvcGVyYXRpb25zICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXFwblsweDAwMDE4XTsgICAgICAgICAgLyogUVAgbnVtYmVyIHRoaXMgZG9vcmJlbGwgaXMgcnVuZyBvbiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fc2VuZF9kb29yYmVsbF9zdAlzZW5kX2Rvb3JiZWxsOy8qIFNlbmQgUGFyYW1ldGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyIFFQICovCisKK3N0cnVjdCBhcmJlbHBybV9tZ21xcF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcXBuX2lbMHgwMDAxOF07ICAgICAgICAvKiBRUE5faTogUVAgbnVtYmVyIHdoaWNoIGlzIGEgbWVtYmVyIGluIHRoaXMgbXVsdGljYXN0IGdyb3VwLiBWYWxpZCBvbmx5IGlmIFFpIGJpdCBpcyBzZXQuIExlbmd0aCBvZiB0aGUgUVBOX2kgbGlzdCBpcyBzZXQgaW4gSU5JVF9IQ0EgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDddOworICAgIHBzZXVkb19iaXRfdAlxaVsweDAwMDAxXTsgICAgICAgICAgIC8qIFFpOiBRUE5faSBpcyB2YWxpZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiB2c2QgKi8KKworc3RydWN0IGFyYmVscHJtX3ZzZF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3M1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc4WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3OVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzEwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MTFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcxMlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzEzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MTRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcxNVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzE2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MTdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcxOFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzE5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MjBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcyMVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzIyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MjNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcyNFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzI1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MjZbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcyN1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzI4WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MjlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHczMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzMxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MzJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHczM1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzM0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MzVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHczNlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzM3WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MzhbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHczOVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NDFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc0MlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzQzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NDRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc0NVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzQ2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NDdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc0OFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzQ5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NTBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc1MVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzUyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NTNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc1NFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzU1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBBQ0NFU1NfTEFNX2luamVjdF9lcnJvcnMgKi8KKworc3RydWN0IGFyYmVscHJtX2FjY2Vzc19sYW1faW5qZWN0X2Vycm9yc19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fYWNjZXNzX2xhbV9pbmplY3RfZXJyb3JzX2lucHV0X3BhcmFtZXRlcl9zdAlhY2Nlc3NfbGFtX2luamVjdF9lcnJvcnNfaW5wdXRfcGFyYW1ldGVyOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fYWNjZXNzX2xhbV9pbmplY3RfZXJyb3JzX2lucHV0X21vZGlmaWVyX3N0CWFjY2Vzc19sYW1faW5qZWN0X2Vycm9yc19pbnB1dF9tb2RpZmllcjsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogTG9naWNhbCBESU1NIEluZm9ybWF0aW9uICovCisKK3N0cnVjdCBhcmJlbHBybV9kaW1taW5mb19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGltbXNpemVbMHgwMDAxMF07ICAgICAvKiBTaXplIG9mIERJTU0gaW4gdW5pdHMgb2YgMl4yMCBCeXRlcy4gVGhpcyB2YWx1ZSBpcyB2YWxpZCBvbmx5IHdoZW4gRElNTVN0YXR1cyBpcyAwLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CWRpbW1zdGF0dXNbMHgwMDAwMV07ICAgLyogRElNTSBTdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBEaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlkaFsweDAwMDAxXTsgICAgICAgICAgIC8qIFdoZW4gc2V0LCB0aGUgRElNTSBpcyBIaWRkZW4gYW5kIGNhbiBub3QgYmUgYWNjZXNzZWQgZnJvbSB0aGUgUENJIGJ1cy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJd29bMHgwMDAwMV07ICAgICAgICAgICAvKiBXaGVuIHNldCwgdGhlIERJTU0gaXMgd3JpdGUgb25seS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIGludGVncml0eSBpcyBjb25maWd1cmVkIChvdGhlciB0aGFuIG5vbmUpLCB0aGUgRElNTSBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSB0YXJnZXRlZCBieSB3cml0ZSB0cmFuc2FjdGlvbnMgd2hlcmUgdGhlIGFkZHJlc3MgYW5kIHNpemUgYXJlIG11bHRpcGxlcyBvZiAxNiBieXRlcy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDVdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3BkWzB4MDAwMDFdOyAgICAgICAgICAvKiAwIC0gRElNTSBTUEQgd2FzIHJlYWQgZnJvbSBESU1NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIERJTU0gU1BEIHdhcyByZWFkIGZyb20gSW5maW5pSG9zdC1JSUktRVggTlZNRU0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc2xhZHJbMHgwMDAwM107ICAgICAgICAvKiBTUEQgU2xhdmUgQWRkcmVzcyAzIExTQml0cy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgb25seSBpZiBzcGQgYml0IGlzIDAuICovCisgICAgcHNldWRvX2JpdF90CXNvY2tfbnVtWzB4MDAwMDJdOyAgICAgLyogRElNTSBzb2NrZXQgbnVtYmVyIChmb3IgZG91YmxlIHNpZGVkIERJTU0gb25lIG9mIHRoZSB0d28gbnVtYmVycyB3aWxsIGJlIHJlcG9ydGVkKSAqLworICAgIHBzZXVkb19iaXRfdAlzeW5bMHgwMDAwNF07ICAgICAgICAgIC8qIEVycm9yIHN5bmRyb21lICh2YWxpZCByZWdhcmRsZXNzIG9mIHN0YXR1cyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gRElNTSBoYXMgbm8gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gU1BEIGVycm9yIChlLmcuIGNoZWNrc3VtIGVycm9yLCBubyByZXNwb25zZSwgZXJyb3Igd2hpbGUgcmVhZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gRElNTSBvdXQgb2YgYm91bmRzIChlLmcuIERJTU0gcm93cyBudW1iZXIgaXMgbm90IGJldHdlZW4gNyBhbmQgMTQsIERJTU0gdHlwZSBpcyBub3QgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0gRElNTSBjb25mbGljdCAoZS5nLiBtaXggb2YgcmVnaXN0ZXJlZCBhbmQgdW5idWZmZXJlZCBESU1NcywgQ0FTIGxhdGVuY3kgY29uZmxpY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAtIERJTU0gc2l6ZSB0cmltbWVkIGR1ZSB0byBjb25maWd1cmF0aW9uIChzaXplIGV4Y2VlZHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgLSBFcnJvciwgcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMTZdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGltbV9zdGFydF9hZHJfaFsweDAwMDIwXTsvKiBESU1NIG1lbW9yeSBzdGFydCBhZGRyZXNzIFs2MzozMl0uIFRoaXMgdmFsdWUgaXMgdmFsaWQgb25seSB3aGVuIERJTU1TdGF0dXMgaXMgMC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWRpbW1fc3RhcnRfYWRyX2xbMHgwMDAyMF07LyogRElNTSBtZW1vcnkgc3RhcnQgYWRkcmVzcyBbMzE6MF0uIFRoaXMgdmFsdWUgaXMgdmFsaWQgb25seSB3aGVuIERJTU1TdGF0dXMgaXMgMC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogVUFSIFBhcmFtZXRlcnMgKi8KKworc3RydWN0IGFyYmVscHJtX3Vhcl9wYXJhbXNfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXVhcl9iYXNlX2FkZHJfaFsweDAwMDIwXTsvKiBVQVIgQmFzZSAocHloc2ljYWwpIEFkZHJlc3MgWzYzOjMyXSAoUVVFUllfSENBIG9ubHkpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAxNF07CisgICAgcHNldWRvX2JpdF90CXVhcl9iYXNlX2FkZHJfbFsweDAwMDBjXTsvKiBVQVIgQmFzZSAocHloc2ljYWwpIEFkZHJlc3MgWzMxOjIwXSAoUVVFUllfSENBIG9ubHkpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl1YXJfcGFnZV9zelsweDAwMDA4XTsgIC8qIFRoaXMgZmllbGQgZGVmaW5lcyB0aGUgc2l6ZSBvZiBlYWNoIFVBUiBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgb2YgVUFSIFBhZ2UgaXMgNEtCKjJeVUFSX1BhZ2VfU2l6ZSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X3VhcnNbMHgwMDAwNF07IC8qIE51bWJlciBvZiBVQVJzIHN1cHBvcnRlZCBpcyAyXmxvZ19tYXhfVUFScyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CWxvZ191YXJfZW50cnlfc3pbMHgwMDAwNl07LyogU2l6ZSBvZiBVQVIgQ29udGV4dCBlbnRyeSBpcyAyXmxvZ191YXJfc3ogaW4gNEtCeXRlIHBhZ2VzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDBhXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXVhcl9zY3JhdGNoX2Jhc2VfYWRkcl9oWzB4MDAwMjBdOy8qIEJhc2UgYWRkcmVzcyBvZiBVQVIgc2NyYXRjaHBhZCBbNjM6MzJdLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBlbnRyaWVzIGluIHRhYmxlIGlzIDJebG9nX21heF91YXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG11c3QgYmUgYWxpZ25lZCB0byBpdHMgc2l6ZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdWFyX3NjcmF0Y2hfYmFzZV9hZGRyX2xbMHgwMDAyMF07LyogQmFzZSBhZGRyZXNzIG9mIFVBUiBzY3JhdGNocGFkIFszMTowXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgZW50cmllcyBpbiB0YWJsZSBpcyAyXmxvZ19tYXhfdWFycy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGl0cyBzaXplLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdWFyX2NvbnRleHRfYmFzZV9hZGRyX2hbMHgwMDAyMF07LyogQmFzZSBhZGRyZXNzIG9mIFVBUiBDb250ZXh0IFs2MzozMl0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGVudHJpZXMgaW4gdGFibGUgaXMgMl5sb2dfbWF4X3VhcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGl0cyBzaXplLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdWFyX2NvbnRleHRfYmFzZV9hZGRyX2xbMHgwMDAyMF07LyogQmFzZSBhZGRyZXNzIG9mIFVBUiBDb250ZXh0IFszMTowXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgZW50cmllcyBpbiB0YWJsZSBpcyAyXmxvZ19tYXhfdWFycy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGl0cyBzaXplLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBUcmFuc2xhdGlvbiBhbmQgUHJvdGVjdGlvbiBUYWJsZXMgUGFyYW1ldGVycyAqLworCitzdHJ1Y3QgYXJiZWxwcm1fdHB0cGFyYW1zX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAltcHRfYmFzZV9hZHJfaFsweDAwMDIwXTsvKiBNUFQgLSBNZW1vcnkgUHJvdGVjdGlvbiBUYWJsZSBiYXNlIHBoeXNpY2FsIGFkZHJlc3MgWzYzOjMyXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeSBzaXplIGlzIDY0IGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG11c3QgYmUgYWxpZ25lZCB0byBpdHMgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1heSBiZSBzZXQgdG8gMHhGRkZGRkZGRiBpZiBhZGRyZXNzIHRyYW5zbGF0aW9uIGFuZCBwcm90ZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltcHRfYmFzZV9hZHJfbFsweDAwMDIwXTsvKiBNUFQgLSBNZW1vcnkgUHJvdGVjdGlvbiBUYWJsZSBiYXNlIHBoeXNpY2FsIGFkZHJlc3MgWzMxOjBdLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5IHNpemUgaXMgNjQgYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGl0cyBzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF5IGJlIHNldCB0byAweEZGRkZGRkZGIGlmIGFkZHJlc3MgdHJhbnNsYXRpb24gYW5kIHByb3RlY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tcHRfc3pbMHgwMDAwNl07ICAgLyogTG9nIChiYXNlIDIpIG9mIHRoZSBudW1iZXIgb2YgcmVnaW9uL3dpbmRvd3MgZW50cmllcyBpbiB0aGUgTVBUIHRhYmxlLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXBmdG9bMHgwMDAwNV07ICAgICAgICAgLyogUGFnZSBGYXVsdCBSTlIgVGltZW91dCAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmaWVsZCByZXR1cm5lZCBpbiBSTlIgTmFrcyBnZW5lcmF0ZWQgd2hlbiBhIHBhZ2UgZmF1bHQgaXMgZGV0ZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaGFzIG5vIGVmZmVjdCB3aGVuIG9uLWRlbWFuZC1wYWdpbmcgaXMgbm90IHVzZWQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDEzXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF9iYXNlX2FkZHJfaFsweDAwMDIwXTsvKiBNVFQgLSBNZW1vcnkgVHJhbnNsYXRpb24gdGFibGUgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIFs2MzozMl0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGl0cyBzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF5IGJlIHNldCB0byAweEZGRkZGRkZGIGlmIGFkZHJlc3MgdHJhbnNsYXRpb24gYW5kIHByb3RlY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF9iYXNlX2FkZHJfbFsweDAwMDIwXTsvKiBNVFQgLSBNZW1vcnkgVHJhbnNsYXRpb24gdGFibGUgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIFszMTowXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gaXRzIHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIDB4RkZGRkZGRkYgaWYgYWRkcmVzcyB0cmFuc2xhdGlvbiBhbmQgcHJvdGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNdWx0aWNhc3QgU3VwcG9ydCBQYXJhbWV0ZXJzICovCisKK3N0cnVjdCBhcmJlbHBybV9tdWx0aWNhc3RwYXJhbV9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWNfYmFzZV9hZGRyX2hbMHgwMDAyMF07LyogQmFzZSBBZGRyZXNzIG9mIHRoZSBNdWx0aWNhc3QgVGFibGUgWzYzOjMyXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgZW50cnkgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1heSBiZSBzZXQgdG8gMHhGRkZGRkZGRiBpZiBtdWx0aWNhc3QgaXMgbm90IHN1cHBvcnRlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1jX2Jhc2VfYWRkcl9sWzB4MDAwMjBdOy8qIEJhc2UgQWRkcmVzcyBvZiB0aGUgTXVsdGljYXN0IFRhYmxlIFszMTowXS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIGVudHJ5IHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIDB4RkZGRkZGRkYgaWYgbXVsdGljYXN0IGlzIG5vdCBzdXBwb3J0ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWNfdGFibGVfZW50cnlfc3pbMHgwMDAxMF07LyogTG9nMiBvZiB0aGUgU2l6ZSBvZiBtdWx0aWNhc3QgZ3JvdXAgbWVtYmVyIChNR00pIGVudHJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgZ3JlYXRlciB0aGFuIDUgKHRvIGFsbG93IENUUkwgYW5kIEdJRCBzZWN0aW9ucykuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoYXQgaW1wbGllcyB0aGUgbnVtYmVyIG9mIFFQcyBwZXIgTUMgdGFibGUgZW50cnkuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1jX3RhYmxlX2hhc2hfc3pbMHgwMDAxMV07LyogTnVtYmVyIG9mIGVudHJpZXMgaW4gbXVsdGljYXN0IERHSUQgaGFzaCB0YWJsZSAobXVzdCBiZSBwb3dlciBvZiAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVRfSENBIC0gdGhlIHJlcXVpcmVkIG51bWJlciBvZiBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUllfSENBIC0gdGhlIGFjdHVhbCBudW1iZXIgb2YgZW50cmllcyBhc3NpZ25lZCBieSBmaXJtd2FyZSAod2lsbCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFtb3VudCByZXF1aXJlZCBpbiBJTklUX0hDQSkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMGZdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21jX3RhYmxlX3N6WzB4MDAwMDVdOy8qIExvZzIgb2YgdGhlIG92ZXJhbGwgbnVtYmVyIG9mIE1DIGVudHJpZXMgaW4gdGhlIE1DRyB0YWJsZSAoaW5jbHVkZXMgYm90aCBoYXNoIGFuZCBhdXhpbGlhcnkgdGFibGVzKSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAxM107CisgICAgcHNldWRvX2JpdF90CW1jX2hhc2hfZm5bMHgwMDAwM107ICAgLyogTXVsdGljYXN0IGhhc2ggZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gRGVmYXVsdCBoYXNoIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgLSByZXNlcnZlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwNV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFFQQy9FRUMvQ1FDL0VRQy9SREIgUGFyYW1ldGVycyAqLworCitzdHJ1Y3QgYXJiZWxwcm1fcXBjYmFzZWFkZHJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXFwY19iYXNlX2FkZHJfaFsweDAwMDIwXTsvKiBRUEMgQmFzZSBBZGRyZXNzIFs2MzozMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgb24gaXRzIHNpemUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19udW1fb2ZfcXBbMHgwMDAwNV07LyogTG9nIGJhc2UgMiBvZiBudW1iZXIgb2Ygc3VwcG9ydGVkIFFQcyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXFwY19iYXNlX2FkZHJfbFsweDAwMDE5XTsvKiBRUEMgQmFzZSBBZGRyZXNzIFszMTo3XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG11c3QgYmUgYWxpZ25lZCBvbiBpdHMgc2l6ZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZWVjX2Jhc2VfYWRkcl9oWzB4MDAwMjBdOy8qIEVFQyBCYXNlIEFkZHJlc3MgWzYzOjMyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG11c3QgYmUgYWxpZ25lZCBvbiBpdHMgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1heSBiZSBzZXQgdG8gMHhGRkZGRkZGRiBpZiBSRCBpcyBub3Qgc3VwcG9ydGVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX251bV9vZl9lZVsweDAwMDA1XTsvKiBMb2cgYmFzZSAyIG9mIG51bWJlciBvZiBzdXBwb3J0ZWQgRUVzLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWVlY19iYXNlX2FkZHJfbFsweDAwMDE5XTsvKiBFRUMgQmFzZSBBZGRyZXNzIFszMTo3XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG11c3QgYmUgYWxpZ25lZCBvbiBpdHMgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF5IGJlIHNldCB0byAweEZGRkZGRkZGIGlmIFJEIGlzIG5vdCBzdXBwb3J0ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcnFjX2Jhc2VfYWRkcl9oWzB4MDAwMjBdOy8qIFNSUSBDb250ZXh0IEJhc2UgQWRkcmVzcyBbNjM6MzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIDB4RkZGRkZGRkYgaWYgU1JRIGlzIG5vdCBzdXBwb3J0ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbnVtX29mX3NycVsweDAwMDA1XTsvKiBMb2cgYmFzZSAyIG9mIG51bWJlciBvZiBzdXBwb3J0ZWQgU1JRcy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3JxY19iYXNlX2FkZHJfbFsweDAwMDFiXTsvKiBTUlEgQ29udGV4dCBCYXNlIEFkZHJlc3MgWzMxOjVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIDB4RkZGRkZGRkYgaWYgU1JRIGlzIG5vdCBzdXBwb3J0ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljcWNfYmFzZV9hZGRyX2hbMHgwMDAyMF07LyogQ1FDIEJhc2UgQWRkcmVzcyBbNjM6MzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbnVtX29mX2NxWzB4MDAwMDVdOy8qIExvZyBiYXNlIDIgb2YgbnVtYmVyIG9mIHN1cHBvcnRlZCBDUXMuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJY3FjX2Jhc2VfYWRkcl9sWzB4MDAwMWFdOy8qIENRQyBCYXNlIEFkZHJlc3MgWzMxOjZdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcXBjX2Jhc2VfYWRkcl9oWzB4MDAwMjBdOy8qIEV4dGVuZGVkIFFQQyBCYXNlIEFkZHJlc3MgWzYzOjMyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIGhhcyBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIFFQQyB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gZW50cnkgc2l6ZS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxcGNfYmFzZV9hZGRyX2xbMHgwMDAyMF07LyogRXh0ZW5kZWQgUVBDIEJhc2UgQWRkcmVzcyBbMzE6MF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBoYXMgc2FtZSBudW1iZXIgb2YgZW50cmllcyBhcyBRUEMgdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGVudHJ5IHNpemUuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDZbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllZWVjX2Jhc2VfYWRkcl9oWzB4MDAwMjBdOy8qIEV4dGVuZGVkIEVFQyBCYXNlIEFkZHJlc3MgWzYzOjMyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIGhhcyBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIEVFQyB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gZW50cnkgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1heSBiZSBzZXQgdG8gMHhGRkZGRkZGRiBpZiBSRCBpcyBub3Qgc3VwcG9ydGVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZWVlY19iYXNlX2FkZHJfbFsweDAwMDIwXTsvKiBFeHRlbmRlZCBFRUMgQmFzZSBBZGRyZXNzIFszMTowXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIGhhcyBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIEVFQyB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gZW50cnkgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1heSBiZSBzZXQgdG8gMHhGRkZGRkZGRiBpZiBSRCBpcyBub3Qgc3VwcG9ydGVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXFjX2Jhc2VfYWRkcl9oWzB4MDAwMjBdOy8qIEVRQyBCYXNlIEFkZHJlc3MgWzYzOjMyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF5IGJlIHNldCB0byAweEZGRkZGRkZGIGlmIEVRcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gZW50cnkgc2l6ZS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19udW1fZXFbMHgwMDAwNF07ICAgLyogTG9nIGJhc2UgMiBvZiBudW1iZXIgb2Ygc3VwcG9ydGVkIEVRcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIDYgb3IgbGVzcyBpbiBJbmZpbmlIb3N0LUlJSS1FWC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAllcWNfYmFzZV9hZGRyX2xbMHgwMDAxYV07LyogRVFDIEJhc2UgQWRkcmVzcyBbMzE6Nl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1heSBiZSBzZXQgdG8gMHhGRkZGRkZGRiBpZiBFUXMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGVudHJ5IHNpemUuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDlbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZGJfYmFzZV9hZGRyX2hbMHgwMDAyMF07LyogQmFzZSBhZGRyZXNzIG9mIHRhYmxlIHRoYXQgaG9sZHMgcmVtb3RlIHJlYWQgYW5kIHJlbW90ZSBhdG9taWMgcmVxdWVzdHMgWzYzOjMyXS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIDB4RkZGRkZGRkYgaWYgcmVtb3RlIFJETUEgcmVhZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIHJlZmVyIHRvIFFQIGFuZCBFRSBjaGFwdGVyIGZvciBmdXJ0aGVyIGV4cGxhbmF0aW9uIG9uIFJEQiBhbGxvY2F0aW9uLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmRiX2Jhc2VfYWRkcl9sWzB4MDAwMjBdOy8qIEJhc2UgYWRkcmVzcyBvZiB0YWJsZSB0aGF0IGhvbGRzIHJlbW90ZSByZWFkIGFuZCByZW1vdGUgYXRvbWljIHJlcXVlc3RzIFszMTowXS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIFJEQiBlbnRyeSBzaXplICgzMiBieXRlcykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIHplcm8gaWYgcmVtb3RlIFJETUEgcmVhZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIHJlZmVyIHRvIFFQIGFuZCBFRSBjaGFwdGVyIGZvciBmdXJ0aGVyIGV4cGxhbmF0aW9uIG9uIFJEQiBhbGxvY2F0aW9uLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogSGVhZGVyX0xvZ19SZWdpc3RlciAqLworCitzdHJ1Y3QgYXJiZWxwcm1faGVhZGVyX2xvZ19yZWdpc3Rlcl9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGxhY2VfaG9sZGVyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBQZXJmb3JtYW5jZSBNb25pdG9ycyAqLworCitzdHJ1Y3QgYXJiZWxwcm1fcGVyZm9ybWFuY2VfbW9uaXRvcnNfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWUwWzB4MDAwMDFdOyAgICAgICAgICAgLyogRW5hYmxlcyBjb3VudGluZyBvZiByZXNwZWN0aXZlIHBlcmZvcm1hbmNlIGNvdW50ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJZTFbMHgwMDAwMV07ICAgICAgICAgICAvKiBFbmFibGVzIGNvdW50aW5nIG9mIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2UgY291bnRlciAqLworICAgIHBzZXVkb19iaXRfdAllMlsweDAwMDAxXTsgICAgICAgICAgIC8qIEVuYWJsZXMgY291bnRpbmcgb2YgcmVzcGVjdGl2ZSBwZXJmb3JtYW5jZSBjb3VudGVyICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcjBbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiB3cml0dGVuIHRvIGFzICcxIC0gcmVzZXRzIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2UgY291bnRlciwgaWYgd3JpdHRlbiB0byBheiAnMCAtIG5vIGNoYW5nZSB0byBtYXR0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcjFbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiB3cml0dGVuIHRvIGFzICcxIC0gcmVzZXRzIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2UgY291bnRlciwgaWYgd3JpdHRlbiB0byBheiAnMCAtIG5vIGNoYW5nZSB0byBtYXR0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcjJbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiB3cml0dGVuIHRvIGFzICcxIC0gcmVzZXRzIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2UgY291bnRlciwgaWYgd3JpdHRlbiB0byBheiAnMCAtIG5vIGNoYW5nZSB0byBtYXR0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAlpMFsweDAwMDAxXTsgICAgICAgICAgIC8qIEludGVycnVwdCBlbmFibGUgb24gcmVzcGVjdGl2ZSBjb3VudGVyIG92ZXJmbG93LiAnMSAtIGludGVycnVwdCBlbmFibGVkLCAnMCAtIGludGVycnVwdCBkaXNhYmxlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJaTFbMHgwMDAwMV07ICAgICAgICAgICAvKiBJbnRlcnJ1cHQgZW5hYmxlIG9uIHJlc3BlY3RpdmUgY291bnRlciBvdmVyZmxvdy4gJzEgLSBpbnRlcnJ1cHQgZW5hYmxlZCwgJzAgLSBpbnRlcnJ1cHQgZGlzYWJsZWQuICovCisgICAgcHNldWRvX2JpdF90CWkyWzB4MDAwMDFdOyAgICAgICAgICAgLyogSW50ZXJydXB0IGVuYWJsZSBvbiByZXNwZWN0aXZlIGNvdW50ZXIgb3ZlcmZsb3cuICcxIC0gaW50ZXJydXB0IGVuYWJsZWQsICcwIC0gaW50ZXJydXB0IGRpc2FibGVkLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CWYwWzB4MDAwMDFdOyAgICAgICAgICAgLyogT3ZlcmZsb3cgZmxhZy4gSWYgc2V0LCBvdmVyZmxvdyBvY2N1cnJlZCBvbiByZXNwZWN0aXZlIGNvdW50ZXIuIENsZWFyZWQgaWYgd3JpdHRlbiB0byBhcyAnMSAqLworICAgIHBzZXVkb19iaXRfdAlmMVsweDAwMDAxXTsgICAgICAgICAgIC8qIE92ZXJmbG93IGZsYWcuIElmIHNldCwgb3ZlcmZsb3cgb2NjdXJyZWQgb24gcmVzcGVjdGl2ZSBjb3VudGVyLiBDbGVhcmVkIGlmIHdyaXR0ZW4gdG8gYXMgJzEgKi8KKyAgICBwc2V1ZG9fYml0X3QJZjJbMHgwMDAwMV07ICAgICAgICAgICAvKiBPdmVyZmxvdyBmbGFnLiBJZiBzZXQsIG92ZXJmbG93IG9jY3VycmVkIG9uIHJlc3BlY3RpdmUgY291bnRlci4gQ2xlYXJlZCBpZiB3cml0dGVuIHRvIGFzICcxICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJZXZfY250MVsweDAwMDA1XTsgICAgICAvKiBTcGVjaWZpZXMgZXZlbnQgdG8gYmUgY291bnRlZCBieSBFdmVudF9jb3VudGVyMSBTZWUgWFhYIGZvciBldmVudHMnIGRlZmluaXRpb24uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJZXZfY250MlsweDAwMDA1XTsgICAgICAvKiBTcGVjaWZpZXMgZXZlbnQgdG8gYmUgY291bnRlZCBieSBFdmVudF9jb3VudGVyMiBTZWUgWFhYIGZvciBldmVudHMnIGRlZmluaXRpb24uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDAzXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNsb2NrX2NvdW50ZXJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlldmVudF9jb3VudGVyMVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWV2ZW50X2NvdW50ZXIyWzB4MDAwMjBdOy8qIFJlYWQvd3JpdGUgZXZlbnQgY291bnRlciwgY291bnRpbmcgZXZlbnRzIHNwZWNpZmllZCBieSBFdkNudGwgYW5kIEV2Q250MiBmaWVsZHMgcmVwc2VjdGl2ZWx5LiBXaGVuIHRoZSBldmVudCBjb3VudGVyIHJlYWNoZXMgaXMgbWF4aW11bSB2YWx1ZSBvZiAweEZGRkZGRiwgdGhlIG5leHQgZXZlbnQgd2lsbCBjYXVzZSBpdCB0byByb2xsIG92ZXIgdG8gemVybywgc2V0IEYxIG9yIEYyIGJpdCByZXNwZWN0aXZlbHkgYW5kIGdlbmVyYXRlIGludGVycnVwdCBieSBJMSBJMiBiaXQgcmVzcGVjdGl2ZWx5LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBSZWNlaXZlIHNlZ21lbnQgZm9ybWF0ICovCisKK3N0cnVjdCBhcmJlbHBybV93cWVfc2VnbWVudF9jdHJsX3JlY3Zfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgc3RydWN0IGFyYmVscHJtX3JlY3Zfd3FlX3NlZ21lbnRfbmV4dF9zdAl3cWVfc2VnbWVudF9uZXh0OworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMWNdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNTFggV1FFIHNlZ21lbnQgZm9ybWF0ICovCisKK3N0cnVjdCBhcmJlbHBybV93cWVfc2VnbWVudF9jdHJsX21seF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAllWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIFdRRSBldmVudCAqLworICAgIHBzZXVkb19iaXRfdAljWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIENyZWF0ZSBDUUUgKGZvciAicmVxdWVzdGVkIHNpZ25hbGxpbmciIFFQKSAqLworICAgIHBzZXVkb19iaXRfdAlpY3JjWzB4MDAwMDJdOyAgICAgICAgIC8qIGljcmMgZmllbGQgZGV0ZW1pbmVzIHdoYXQgdG8gZG8gd2l0aCB0aGUgbGFzdCBkd29yZCBvZiB0aGUgcGFja2V0OiAwIC0gQ2FsY3VsYXRlIElDUkMgYW5kIHB1dCBpdCBpbnN0ZWFkIG9mIGxhc3QgZHdvcmQuIExhc3QgZHdvcmQgbXVzdCBiZSAweDAuIDEsMiAtIHJlc2VydmVkLiAgMyAtIExlYXZlIGxhc3QgZHdvcmQgYXMgaXMuIExhc3QgZHdvcmQgbXVzdCBub3QgYmUgMHgwLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXNsWzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAltYXhfc3RhdHJhdGVbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CXNsclsweDAwMDAxXTsgICAgICAgICAgLyogMD0gdGFrZSBzbGlkIGZyb20gcG9ydC4gMT0gdGFrZSBzbGlkIGZyb20gZ2l2ZW4gaGVhZGVycyAqLworICAgIHBzZXVkb19iaXRfdAl2MTVbMHgwMDAwMV07ICAgICAgICAgIC8qIFNlbmQgcGFja2V0IG92ZXIgVkwxNSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwZV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2Y3JjWzB4MDAwMTBdOyAgICAgICAgIC8qIFBhY2tldCdzIFZDUkMgKGlmIG5vdCAwIC0gb3RoZXJ3aXNlIGNvbXB1dGVkIGJ5IEhXKSAqLworICAgIHBzZXVkb19iaXRfdAlybGlkWzB4MDAwMTBdOyAgICAgICAgIC8qIERlc3RpbmF0aW9uIExJRCAobXVzdCBtYXRjaCBnaXZlbiBoZWFkZXJzKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTZW5kIFdRRSBzZWdtZW50IGZvcm1hdCAqLworCitzdHJ1Y3QgYXJiZWxwcm1fc2VuZF93cWVfc2VnbWVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfbmV4dF9zdAl3cWVfc2VnbWVudF9uZXh0Oy8qIFNlbmQgd3FlIHNlZ21lbnQgbmV4dCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfY3RybF9zZW5kX3N0CXdxZV9zZWdtZW50X2N0cmxfc2VuZDsvKiBTZW5kIHdxZSBzZWdtZW50IGN0cmwgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X3JkX3N0CXdxZV9zZWdtZW50X3JkOy8qIFNlbmQgd3FlIHNlZ21lbnQgcmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X3VkX3N0CXdxZV9zZWdtZW50X3VkOy8qIFNlbmQgd3FlIHNlZ21lbnQgdWQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X2JpbmRfc3QJd3FlX3NlZ21lbnRfYmluZDsvKiBTZW5kIHdxZSBzZWdtZW50IGJpbmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMTgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X3JlbW90ZV9hZGRyZXNzX3N0CXdxZV9zZWdtZW50X3JlbW90ZV9hZGRyZXNzOy8qIFNlbmQgd3FlIHNlZ21lbnQgcmVtb3RlIGFkZHJlc3MgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X2F0b21pY19zdAl3cWVfc2VnbWVudF9hdG9taWM7LyogU2VuZCB3cWUgc2VnbWVudCBhdG9taWMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2Zhc3RfcmVnaXN0cmF0aW9uX3NlZ21lbnRfc3QJZmFzdF9yZWdpc3RyYXRpb25fc2VnbWVudDsvKiBGYXN0IFJlZ2lzdHJhdGlvbiBTZWdtZW50ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9sb2NhbF9pbnZhbGlkYXRlX3NlZ21lbnRfc3QJbG9jYWxfaW52YWxpZGF0ZV9zZWdtZW50Oy8qIGxvY2FsIGludmFsaWRhdGUgc2VnbWVudCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfZGF0YV9wdHJfc3QJd3FlX3NlZ21lbnRfZGF0YV9wdHI7LyogU2VuZCB3cWUgc2VnbWVudCBkYXRhIHB0ciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfZGF0YV9pbmxpbmVfc3QJd3FlX3NlZ21lbnRfZGF0YV9pbmxpbmU7LyogU2VuZCB3cWUgc2VnbWVudCBkYXRhIGlubGluZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAyMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBRUCBhbmQgRUUgQ29udGV4dCBFbnRyeSAqLworCitzdHJ1Y3QgYXJiZWxwcm1fcXVldWVfcGFpcl9lZV9jb250ZXh0X2VudHJ5X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CWRlWzB4MDAwMDFdOyAgICAgICAgICAgLyogU2VuZC9SZWNlaXZlIERlc2NyaXB0b3IgRXZlbnQgZW5hYmxlIC0gaWYgc2V0LCBldmVudHMgY2FuIGJlIGdlbmVyYXRlZCB1cG9uIGRlc2NyaXB0b3JzJyBjb21wbGV0aW9uIG9uIHNlbmQvcmVjZWl2ZSBxdWV1ZSAoY29udHJvbGxlZCBieSBFIGJpdCBpbiBXUUUpLiBJbnZhbGlkIGluIEVFIGNvbnRleHQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlwbV9zdGF0ZVsweDAwMDAyXTsgICAgIC8qIFBhdGggbWlncmF0aW9uIHN0YXRlIChNaWdyYXRlZCwgQXJtZWQgb3IgUmVhcm0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEtTWlncmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMC1Bcm1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxLVJlYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAtUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG91bGQgYmUgc2V0IHRvIDExIGZvciBVRCBRUHMgYW5kIGZvciBRUHMgd2hpY2ggZG8gbm90IHN1cHBvcnQgQVBNICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJc3RbMHgwMDAwM107ICAgICAgICAgICAvKiBTZXJ2aWNlIHR5cGUgKGludmFsaWQgaW4gRUUgY29udGV4dCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAwLVJlbGlhYmxlIENvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMDEtVW5yZWxpYWJsZSBDb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEwLVJlbGlhYmxlIERhdGFncmFtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxMS1VbnJlbGlhYmxlIERhdGFncmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExLU1MWCB0cmFuc3BvcnQgKHJhdyBiaXRzIGluamVjdGlvbikuIFVzZWQgZm9yIG1hbmFnZW1lbnQgUVBzIGFuZCBSQVcgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMDldOworICAgIHBzZXVkb19iaXRfdAlzdGF0ZVsweDAwMDA0XTsgICAgICAgIC8qIFFQL0VFIHN0YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBSU1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gSU5JVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLSBSVFIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0gUlRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAtIFNRRXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1IC0gU1FEIChTZW5kIFF1ZXVlIERyYWluZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAtIEVSUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgLSBTZW5kIFF1ZXVlIERyYWluaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAtIFJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAtIFN1c3BlbmRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEtIEYgLSBSZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWYWxpZCBmb3IgUVVFUllfUVBFRSBhbmQgRVJSMlJTVF9RUEVFIGNvbW1hbmRzIG9ubHkpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzY2hlZF9xdWV1ZVsweDAwMDA0XTsgIC8qIFNjaGVkdWxlIHF1ZXVlIHRvIGJlIHVzZWQgZm9yIFdRRSBzY2hlZHVsaW5nIHRvIGV4ZWN1dGlvbi4gRGV0ZXJtaW5lcyBRT1MgZm9yIHRoaXMgUVAuICovCisgICAgcHNldWRvX2JpdF90CXJsa3lbMHgwMDAwMV07ICAgICAgICAgLyogV2hlbiBzZXQgdGhpcyBRUCBjYW4gdXNlIHRoZSBSZXNlcnZlZCBMX0tleSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAwM107CisgICAgcHNldWRvX2JpdF90CWxvZ19zcV9zdHJpZGVbMHgwMDAwM107LyogU3RyaWRlIG9uIHRoZSBzZW5kIHF1ZXVlLiBXUSBlbnRyeSBpcyAxNiooMl5sb2dfU1Ffc3RyaWRlKSBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpZGUgbXVzdCBiZSBlcXVhbCBvciBiaWdnZXIgdGhlbiA2NCBieXRlcyAobWluaW11bSBsb2dfUlFfc3RyaWRlIHZhbHVlIGFsbG93ZWQgaXMgMikuICovCisgICAgcHNldWRvX2JpdF90CWxvZ19zcV9zaXplWzB4MDAwMDRdOyAgLyogTG9nMiBvZiB0aGUgTnVtYmVyIG9mIFdRRXMgaW4gdGhlIFNlbmQgUXVldWUuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX3JxX3N0cmlkZVsweDAwMDAzXTsvKiBTdHJpZGUgb24gdGhlIHJlY2VpdmUgcXVldWUuIFdRIGVudHJ5IGlzIDE2KigyXmxvZ19SUV9zdHJpZGUpIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlkZSBtdXN0IGJlIGVxdWFsIG9yIGJpZ2dlciB0aGVuIDY0IGJ5dGVzIChtaW5pbXVtIGxvZ19SUV9zdHJpZGUgdmFsdWUgYWxsb3dlZCBpcyAyKS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX3JxX3NpemVbMHgwMDAwNF07ICAvKiBMb2cyIG9mIHRoZSBOdW1iZXIgb2YgV1FFcyBpbiB0aGUgUmVjZWl2ZSBRdWV1ZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAltc2dfbWF4WzB4MDAwMDVdOyAgICAgIC8qIE1heCBtZXNzYWdlIHNpemUgYWxsb3dlZCBvbiB0aGUgUVAuIE1heGltdW0gbWVzc2FnZSBzaXplIGlzIDJebXNnX01heC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGVxdWFsIHRvIE1UVSBmb3IgVUQgYW5kIE1MWCBRUHMuICovCisgICAgcHNldWRvX2JpdF90CW10dVsweDAwMDAzXTsgICAgICAgICAgLyogTVRVIG9mIHRoZSBRUCAoTXVzdCBiZSB0aGUgc2FtZSBmb3IgYm90aCBwYXRoczogcHJpbWFyeSBhbmQgYWx0ZXJuYXRpdmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MSAtIDI1NiBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MiAtIDUxMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MyAtIDEwMjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQgLSAyMDQ4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgLSByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCBiZSBjb25maWd1cmVkIHRvIDB4NCBmb3IgVUQgYW5kIE1MWCBRUHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl1c3JfcGFnZVsweDAwMDE4XTsgICAgIC8qIFFQIChzZWUgIm5vbl9wcml2aWxlZ2VkIEFjY2VzcyB0byB0aGUgSENBIEhhcmR3YXJlIikuIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvY2FsX3Fwbl9lZW5bMHgwMDAxOF07LyogTG9jYWwgUVAvRUUgbnVtYmVyIExvd2VyIGJpdHMgZGV0ZXJtaW5lIHBvc2l0aW9uIG9mIHRoaXMgcmVjb3JkIGluIFFQQyB0YWJsZSwgYW5kIC0gdGh1cyAtIGNvbnN0cmFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyB2YWxpZCBmb3IgUVVFUlkgYW5kIEVSUjJSU1QgY29tbWFuZHMgb25seS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVtb3RlX3Fwbl9lZW5bMHgwMDAxOF07LyogUmVtb3RlIFFQL0VFIG51bWJlciAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEwWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMVsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2FkZHJlc3NfcGF0aF9zdAlwcmltYXJ5X2FkZHJlc3NfcGF0aDsvKiBQcmltYXJ5IGFkZHJlc3MgcGF0aCBmb3IgdGhlIFFQL0VFICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9hZGRyZXNzX3BhdGhfc3QJYWx0ZXJuYXRpdmVfYWRkcmVzc19wYXRoOy8qIEFsdGVybmF0ZSBhZGRyZXNzIHBhdGggZm9yIHRoZSBRUC9FRSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmRkWzB4MDAwMThdOyAgICAgICAgICAvKiBSZWxpYWJsZSBEYXRhZ3JhbSBEb21haW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMlsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBkWzB4MDAwMThdOyAgICAgICAgICAgLyogUVAgcHJvdGVjdGlvbiBkb21haW4uIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTNbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl3cWVfYmFzZV9hZHJfaFsweDAwMDIwXTsvKiBCaXRzIDYzOjMyIG9mIFdRRSBhZGRyZXNzIGZvciBib3RoIFNRIGFuZCBSUS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgZm9yIEVFIGNvbnRleHQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl3cWVfbGtleVsweDAwMDIwXTsgICAgIC8qIG1lbW9yeSBrZXkgKEwtS2V5KSB0byBiZSB1c2VkIHRvIGFjY2VzcyBXUUVzLiBOb3QgdmFsaWQgKHJlc2VydmVkKSBpbiBFRSBjb250ZXh0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNFsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJc3NjWzB4MDAwMDFdOyAgICAgICAgICAvKiBTZW5kIFNpZ25hbGVkIENvbXBsZXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gYWxsIHNlbmQgV1FFcyBnZW5lcmF0ZSBDUUVzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gb25seSBzZW5kIFdRRXMgd2l0aCBDIGJpdCBzZXQgZ2VuZXJhdGUgY29tcGxldGlvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJc2ljWzB4MDAwMDFdOyAgICAgICAgICAvKiBJZiBzZXQgLSBJZ25vcmUgZW5kIHRvIGVuZCBjcmVkaXRzIG9uIHNlbmQgcXVldWUuIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CWN1cl9yZXRyeV9jbnRbMHgwMDAwM107LyogQ3VycmVudCB0cmFuc3BvcnQgcmV0cnkgY291bnRlciAoUVVFUllfUVBFRSBvbmx5KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY3VycmVudCB0cmFuc3BvcnQgcmV0cnkgY291bnRlciBjYW4gdmFyeSBmcm9tIHJldHJ5X2NvdW50IGRvd24gdG8gMSwgd2hlcmUgMSBtZWFucyB0aGF0IHRoZSBsYXN0IHJldHJ5IGF0dGVtcHQgaXMgY3VycmVudGx5IGV4ZWN1dGluZy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3VyX3Jucl9yZXRyeVsweDAwMDAzXTsvKiBDdXJyZW50IFJOUiByZXRyeSBjb3VudGVyIChRVUVSWV9RUEVFIG9ubHkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjdXJyZW50IFJOUiByZXRyeSBjb3VudGVyIGNhbiB2YXJ5IGZyb20gcm5yX3JldHJ5IHRvIDEsIHdoZXJlIDEgbWVhbnMgdGhhdCB0aGUgbGFzdCByZXRyeSBhdHRlbXB0IGlzIGN1cnJlbnRseSBleGVjdXRpbmcuICovCisgICAgcHNldWRvX2JpdF90CWZyZVsweDAwMDAxXTsgICAgICAgICAgLyogRmFzdCBSZWdpc3RyYXRpb24gV29yayBSZXF1ZXN0IEVuYWJsZWQuIChSZXNlcnZlZCBmb3IgRUUpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTVbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CXNhZVsweDAwMDAxXTsgICAgICAgICAgLyogSWYgc2V0IC0gQXRvbWljIG9wZXJhdGlvbnMgZW5hYmxlZCBvbiBzZW5kIHF1ZXVlLiBOb3QgdmFsaWQgKHJlc2VydmVkKSBpbiBFRSBjb250ZXh0LiAqLworICAgIHBzZXVkb19iaXRfdAlzd2VbMHgwMDAwMV07ICAgICAgICAgIC8qIElmIHNldCAtIFJETUEgLSB3cml0ZSBlbmFibGVkIG9uIHNlbmQgcXVldWUuIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXNyZVsweDAwMDAxXTsgICAgICAgICAgLyogSWYgc2V0IC0gUkRNQSAtIHJlYWQgZW5hYmxlZCBvbiBzZW5kIHF1ZXVlLiBOb3QgdmFsaWQgKHJlc2VydmVkKSBpbiBFRSBjb250ZXh0LiAqLworICAgIHBzZXVkb19iaXRfdAlyZXRyeV9jb3VudFsweDAwMDAzXTsgIC8qIFRyYW5zcG9ydCB0aW1lb3V0IFJldHJ5IGNvdW50ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTZbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXNyYV9tYXhbMHgwMDAwM107ICAgICAgLyogTWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgUkRNQS1yZWFkL0F0b21pYyBvcGVyYXRpb25zIGFsbG93ZWQgaW4gdGhlIHNlbmQgcXVldWUuIE1heGltdW0gbnVtYmVyIGlzIDJeU1JBX01heC4gTXVzdCBiZSB6ZXJvIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CWZsaWdodF9saW1bMHgwMDAwNF07ICAgLyogTnVtYmVyIG9mIG91dHN0YW5kaW5nIChpbi1mbGlnaHQpIG1lc3NhZ2VzIG9uIHRoZSB3aXJlIGFsbG93ZWQgZm9yIHRoaXMgc2VuZCBxdWV1ZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIG91dHN0YW5kaW5nIG1lc3NhZ2VzIGlzIDJeRmxpZ2h0X0xpbS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIDB4RiBmb3IgdW5saW1pdGVkIG51bWJlciBvZiBvdXRzdGFuZGluZyBtZXNzYWdlcy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJYWNrX3JlcV9mcmVxWzB4MDAwMDRdOyAvKiBBQ0sgcmVxdWlyZWQgZnJlcXVlbmN5LiBBQ0sgcmVxdWlyZWQgYml0IHdpbGwgYmUgc2V0IGluIGV2ZXJ5IDJeQWNrUmVxRnJlcSBwYWNrZXRzIGF0IGxlYXN0LiBOb3QgdmFsaWQgZm9yIFJEIFFQLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxN1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW5leHRfc2VuZF9wc25bMHgwMDAxOF07LyogTmV4dCBQU04gdG8gYmUgc2VudCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE4WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FuX3NuZFsweDAwMDE4XTsgICAgICAvKiBDUSBudW1iZXIgY29tcGxldGlvbnMgZnJvbSB0aGUgc2VuZCBxdWV1ZSB0byBiZSByZXBvcnRlZCB0by4gTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxOVsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjBbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CXNuZF93cWVfYmFzZV9hZHJfbFsweDAwMDFhXTsvKiBXaGlsZSBvcGVuaW5nIChjcmVhdGluZykgdGhlIFdRLCB0aGlzIGZpZWxkIHNob3VsZCBjb250YWluIHRoZSBhZGRyZXNzIG9mIGZpcnN0IGRlc2NyaXB0b3IgdG8gYmUgcG9zdGVkLiBOb3QgdmFsaWQgKHJlc2VydmVkKSBpbiBFRSBjb250ZXh0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc25kX2RiX3JlY29yZF9pbmRleFsweDAwMDIwXTsvKiBJbmRleCBpbiB0aGUgVUFSIENvbnRleHQgVGFibGUgRW50cnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFcgdXNlcyB0aGlzIGluZGV4IGFzIGFuIG9mZnNldCBmcm9tIHRoZSBVQVIgQ29udGV4dCBUYWJsZSBFbnRyeSBpbiBvcmRlciB0byByZWFkIHRoaXMgU1EgZG9vcmJlbGwgcmVjb3JkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlbnRyeSBpcyBvYnRhaW5lZCB2aWEgdGhlIHVzcl9wYWdlIGZpZWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB2YWxpZCBmb3IgRUUuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsYXN0X2Fja2VkX3BzblsweDAwMDE4XTsvKiBUaGUgbGFzdCBhY2tub3dsZWRnZWQgUFNOIGZvciB0aGUgcmVxdWVzdGVyIChRVUVSWV9RUEVFIG9ubHkpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzc25bMHgwMDAxOF07ICAgICAgICAgIC8qIFJlcXVlc3RlciBTZW5kIFNlcXVlbmNlIE51bWJlciAoUVVFUllfUVBFRSBvbmx5KSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIyWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyM1sweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJcnNjWzB4MDAwMDFdOyAgICAgICAgICAvKiAxIC0gYWxsIHJlY2VpdmUgV1FFcyBnZW5lcmF0ZSBDUUVzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gb25seSByZWNlaXZlIFdRRXMgd2l0aCBDIGJpdCBzZXQgZ2VuZXJhdGUgY29tcGxldGlvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmljWzB4MDAwMDFdOyAgICAgICAgICAvKiBJbnZhbGlkIENyZWRpdHMuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBwbGFjZSAiSW52YWxpZCBDcmVkaXRzIiB0byBBQ0tzIHNlbnQgZnJvbSB0aGlzIHF1ZXVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBBQ0tzIHJlcG9ydCB0aGUgYWN0dWFsIG51bWJlciBvZiBlbmQgdG8gZW5kIGNyZWRpdHMgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHNldCB0byAxIG9uIFFQcyB3aGljaCBhcmUgYXR0YWNoZWQgdG8gU1JRLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI0WzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlyYWVbMHgwMDAwMV07ICAgICAgICAgIC8qIElmIHNldCAtIEF0b21pYyBvcGVyYXRpb25zIGVuYWJsZWQuIG9uIHJlY2VpdmUgcXVldWUuIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJ3ZVsweDAwMDAxXTsgICAgICAgICAgLyogSWYgc2V0IC0gUkRNQSAtIHdyaXRlIGVuYWJsZWQgb24gcmVjZWl2ZSBxdWV1ZS4gTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnJlWzB4MDAwMDFdOyAgICAgICAgICAvKiBJZiBzZXQgLSBSRE1BIC0gcmVhZCBlbmFibGVkIG9uIHJlY2VpdmUgcXVldWUuIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjVbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CXJyYV9tYXhbMHgwMDAwM107ICAgICAgLyogTWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgUkRNQS1yZWFkL0F0b21pYyBvcGVyYXRpb25zIGFsbG93ZWQgb24gcmVjZWl2ZSBxdWV1ZSBpcyAyXlJSQV9NYXguIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgMCBmb3IgRUUgY29udGV4dC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyNlsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW5leHRfcmN2X3BzblsweDAwMDE4XTsgLyogTmV4dCAoZXhwZWN0ZWQpIFBTTiBvbiByZWNlaXZlICovCisgICAgcHNldWRvX2JpdF90CW1pbl9ybnJfbmFrWzB4MDAwMDVdOyAgLyogTWluaW11bSBSTlIgTkFLIHRpbWVyIHZhbHVlIChUVFRUVCBmaWVsZCBlbmNvZGluZyBhY2NvcmRpbmcgdG8gdGhlIElCIHNwZWMgVm9sMSA5LjcuNS4yLjgpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgdmFsaWQgKHJlc2VydmVkKSBpbiBFRSBjb250ZXh0LiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI3WzB4MDAwMDNdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyOFsweDAwMDA1XTsKKyAgICBwc2V1ZG9fYml0X3QJcmFfYnVmZl9pbmR4WzB4MDAwMWJdOyAvKiBJbmRleCB0byBvdXRzdGFuZGluZyByZWFkL2F0b21pYyBidWZmZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgY29uc3RydWN0cyB0aGUgYWRkcmVzcyB0byB0aGUgUkRCIGZvciBtYWludGFpbmluZyB0aGUgaW5jb21pbmcgUkRNQSByZWFkIGFuZCBhdG9taWMgcmVxdWVzdHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljcW5fcmN2WzB4MDAwMThdOyAgICAgIC8qIENRIG51bWJlciBjb21wbGV0aW9ucyBmcm9tIHJlY2VpdmUgcXVldWUgdG8gYmUgcmVwb3J0ZWQgdG8uIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjlbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDMwWzB4MDAwMDZdOworICAgIHBzZXVkb19iaXRfdAlyY3Zfd3FlX2Jhc2VfYWRyX2xbMHgwMDAxYV07LyogV2hpbGUgb3BlbmluZyAoY3JlYXRpbmcpIHRoZSBXUSwgdGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBvZiBmaXJzdCBkZXNjcmlwdG9yIHRvIGJlIHBvc3RlZC4gTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJjdl9kYl9yZWNvcmRfaW5kZXhbMHgwMDAyMF07LyogSW5kZXggaW4gdGhlIFVBUiBDb250ZXh0IFRhYmxlIEVudHJ5IGNvbnRhaW5pbmcgdGhlIGRvb3JiZWxsIHJlY29yZCBmb3IgdGhlIHJlY2VpdmUgcXVldWUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXIHVzZXMgdGhpcyBpbmRleCBhcyBhbiBvZmZzZXQgZnJvbSB0aGUgVUFSIENvbnRleHQgVGFibGUgRW50cnkgaW4gb3JkZXIgdG8gcmVhZCB0aGlzIFJRIGRvb3JiZWxsIHJlY29yZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZW50cnkgaXMgb2J0YWluZWQgdmlhIHRoZSB1c3JfcGFnZSBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgdmFsaWQgZm9yIEVFLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcV9rZXlbMHgwMDAyMF07ICAgICAgICAvKiBRX0tleSB0byBiZSB2YWxpZGF0ZWQgYWdhaW5zdCByZWNlaXZlZCBkYXRhZ3JhbXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gc2VuZCBkYXRhZ3JhbXMsIGlmIFFfS2V5WzMxXSBzcGVjaWZpZWQgaW4gdGhlIFdRRSBpcyBzZXQsIHRoZW4gdGhpcyBRX0tleSB3aWxsIGJlIHRyYW5zbWl0dGVkIGluIHRoZSBvdXRnb2luZyBtZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcnFuWzB4MDAwMThdOyAgICAgICAgIC8qIFNSUU4gLSBTaGFyZWQgUmVjZWl2ZSBRdWV1ZSBOdW1iZXIgLSBzcGVjaWZpZXMgdGhlIFNSUSBudW1iZXIgZnJvbSB3aGljaCB0aGUgUVAgZGVxdWV1ZXMgcmVjZWl2ZSBkZXNjcmlwdG9ycy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JRTiBpcyB2YWxpZCBvbmx5IGlmIFNSUSBiaXQgaXMgc2V0LiBOb3QgdmFsaWQgKHJlc2VydmVkKSBpbiBFRSBjb250ZXh0LiAqLworICAgIHBzZXVkb19iaXRfdAlzcnFbMHgwMDAwMV07ICAgICAgICAgIC8qIFNSUSAtIFNoYXJlZCBSZWNlaXZlIFF1ZXVlLiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gdGhlIFFQIGlzIGFzc29jaWF0ZWQgd2l0aCBhIFNSUS4gTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMVsweDAwMDA3XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJtc25bMHgwMDAxOF07ICAgICAgICAgLyogUmVzcG9uZGVyIGN1cnJlbnQgbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgKFFVRVJZX1FQRUUgb25seSkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMlsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNxX3dxZV9jb3VudGVyWzB4MDAwMTBdOy8qIEEgMTZiaXRzIGNvdW50ZXIgdGhhdCBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBXUUUgcG9zdGVkIHRvIHRoZSBTUS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIDB4MCBpbiBTUSBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUVVFUllfUVBFRSBvbmx5KS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfd3FlX2NvdW50ZXJbMHgwMDAxMF07LyogQSAxNmJpdHMgY291bnRlciB0aGF0IGlzIGluY3JlbWVudGVkIGZvciBlYWNoIFdRRSBwb3N0ZWQgdG8gdGhlIFJRLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgMHgwIGluIFJRIGluaXRpYWxpemF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChRVUVSWV9RUEVFIG9ubHkpLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzM1sweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogQ2xlYXIgSW50ZXJydXB0IFs2MzowXSAqLworCitzdHJ1Y3QgYXJiZWxwcm1fY2xyX2ludF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJY2xyX2ludF9oWzB4MDAwMjBdOyAgICAvKiBDbGVhciBJbnRlcnJ1cHQgWzYzOjMyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHRyYW5zYWN0aW9ucyB0byB0aGlzIHJlZ2lzdGVyIHdpbGwgY2xlYXIgKGRlLWFzc2VydCkgdGhlIHZpcnR1YWwgaW50ZXJydXB0IG91dHB1dCBwaW5zIG9mIEluZmluaUhvc3QtSUlJLUVYLiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGlzIHJlZ2lzdGVyIGlzIG9idGFpbmVkIGJ5IGV4ZWN1dGluZyBRVUVSWV9BREFQVEVSIGNvbW1hbmQgb24gY29tbWFuZCBpbnRlcmZhY2UgYWZ0ZXIgc3lzdGVtIGJvb3QuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcmVnaXN0ZXIgaXMgd3JpdGUtb25seS4gUmVhZGluZyBmcm9tIHRoaXMgcmVnaXN0ZXIgd2lsbCBjYXVzZSB1bmRlZmluZWQgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbHJfaW50X2xbMHgwMDAyMF07ICAgIC8qIENsZWFyIEludGVycnVwdCBbMzE6MF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZSB0cmFuc2FjdGlvbnMgdG8gdGhpcyByZWdpc3RlciB3aWxsIGNsZWFyIChkZS1hc3NlcnQpIHRoZSB2aXJ0dWFsIGludGVycnVwdCBvdXRwdXQgcGlucyBvZiBJbmZpbmlIb3N0LUlJSS1FWC4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhpcyByZWdpc3RlciBpcyBvYnRhaW5lZCBieSBleGVjdXRpbmcgUVVFUllfQURBUFRFUiBjb21tYW5kIG9uIGNvbW1hbmQgaW50ZXJmYWNlIGFmdGVyIHN5c3RlbSBib290LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHJlZ2lzdGVyIGlzIHdyaXRlLW9ubHkuIFJlYWRpbmcgZnJvbSB0aGlzIHJlZ2lzdGVyIHdpbGwgY2F1c2UgdW5kZWZpbmVkIHJlc3VsdCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFUV9Bcm1fREJfUmVnaW9uICovCisKK3N0cnVjdCBhcmJlbHBybV9lcV9hcm1fZGJfcmVnaW9uX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAllcV94X2FybV9oWzB4MDAwMjBdOyAgIC8qIEVRWzYzOjMyXSAgWCBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gQXJtIEVRcyB3aGVuIHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIGJpdHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcV94X2FybV9sWzB4MDAwMjBdOyAgIC8qIEVRWzMxOjBdICBYIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcmVnaXN0ZXIgaXMgdXNlZCB0byBBcm0gRVFzIHdoZW4gc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgYml0cy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogRVEgU2V0IENJIERCcyBUYWJsZSAqLworCitzdHJ1Y3QgYXJiZWxwcm1fZXFfc2V0X2NpX3RhYmxlX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAllcTBfc2V0X2NpWzB4MDAwMjBdOyAgIC8qIEVRMF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMV9zZXRfY2lbMHgwMDAyMF07ICAgLyogRVExX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEyX3NldF9jaVsweDAwMDIwXTsgICAvKiBFUTJfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTNfc2V0X2NpWzB4MDAwMjBdOyAgIC8qIEVRM19TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNF9zZXRfY2lbMHgwMDAyMF07ICAgLyogRVE0X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE1X3NldF9jaVsweDAwMDIwXTsgICAvKiBFUTVfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTZfc2V0X2NpWzB4MDAwMjBdOyAgIC8qIEVRNl9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxN19zZXRfY2lbMHgwMDAyMF07ICAgLyogRVE3X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE4X3NldF9jaVsweDAwMDIwXTsgICAvKiBFUThfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDhbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTlfc2V0X2NpWzB4MDAwMjBdOyAgIC8qIEVROV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMTBfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVExMF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTExX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMTFfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDExWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXExMl9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTEyX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMTNfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVExM19TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTE0X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMTRfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXExNV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTE1X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMTZfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVExNl9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTZbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTE3X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMTdfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE3WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXExOF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTE4X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxOFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMTlfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVExOV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTIwX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMjBfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEyMV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTIxX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyMVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMjJfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEyMl9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTIzX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMjNfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEyNF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTI0X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyNFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMjVfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEyNV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTI2X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMjZfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEyN19zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTI3X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyN1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMjhfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEyOF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjhbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTI5X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMjlfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEzMF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTMwX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMzFfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEzMV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTMyX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMzJfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDMyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEzM19zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTMzX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzM1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMzRfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEzNF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTM1X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMzVfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEzNl9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTM2X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzNlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMzdfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEzN19TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTM4X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMzhfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM4WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEzOV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTM5X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzOVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNDBfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE0MF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTQxX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNDFfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE0Ml9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTQyX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0MlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNDNfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE0M19TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTQ0X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNDRfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQ0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE0NV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTQ1X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0NVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNDZfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE0Nl9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDZbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTQ3X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNDdfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQ3WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE0OF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTQ4X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0OFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNDlfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE0OV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTUwX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNTBfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDUwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE1MV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTUxX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1MVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNTJfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE1Ml9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTUzX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNTNfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDUzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE1NF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTU0X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1NFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNTVfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE1NV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTU2X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNTZfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE1N19zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTU3X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1N1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNThfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE1OF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNThbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTU5X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNTlfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE2MF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTYwX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2MFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNjFfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE2MV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNjFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTYyX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNjJfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDYyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE2M19zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTYzX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2M1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogSW5maW5pSG9zdC1JSUktRVggQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KKworc3RydWN0IGFyYmVscHJtX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJzX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHg0MDM0MDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1faGNhX2NvbW1hbmRfcmVnaXN0ZXJfc3QJaGNhX2NvbW1hbmRfaW50ZXJmYWNlX3JlZ2lzdGVyOy8qIEhDQSBDb21tYW5kIFJlZ2lzdGVyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgzZmNiMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBRUF9EQl9SZWNvcmQgKi8KKworc3RydWN0IGFyYmVscHJtX3FwX2RiX3JlY29yZF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJY291bnRlclsweDAwMDEwXTsgICAgICAvKiBNb2R1bG8tNjRLIGNvdW50ZXIgb2YgV1FFcyBwb3N0ZWQgdG8gdGhlIFFQIHNpbmNlIGl0cyBjcmVhdGlvbi4gU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIHplcm8uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDA1XTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzWzB4MDAwMDNdOyAgICAgICAgICAvKiAweDMgZm9yIFNRCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0IGZvciBSUSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUgZm9yIFNSUSAqLworICAgIHBzZXVkb19iaXRfdAlxcF9udW1iZXJbMHgwMDAxOF07ICAgIC8qIFFQIG51bWJlciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBDUV9BUk1fREJfUmVjb3JkICovCisKK3N0cnVjdCBhcmJlbHBybV9jcV9hcm1fZGJfcmVjb3JkX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAljb3VudGVyWzB4MDAwMjBdOyAgICAgIC8qIENRIGNvdW50ZXIgZm9yIHRoZSBhcm1pbmcgcmVxdWVzdCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY21kWzB4MDAwMDNdOyAgICAgICAgICAvKiAweDAgLSBObyBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxIC0gUmVxdWVzdCBub3RpZmljYXRpb24gZm9yIG5leHQgU29saWNpdGVkIGNvbXBsZXRpb24gZXZlbnQuIENvdW50ZXIgZmlsZWQgc3BlY2lmaWVzIHRoZSBjdXJyZW50IENRIENvbnN1bWVyIENvdW50ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyIC0gUmVxdWVzdCBub3RpZmljYXRpb24gZm9yIG5leHQgU29saWNpdGVkIG9yIFVuc29saWNpdGVkIGNvbXBsZXRpb24gZXZlbnQuIENvdW50ZXIgZmlsZWQgc3BlY2lmaWVzIHRoZSBjdXJyZW50IENRIENvbnN1bWVyIGNvdW50ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzIC0gUmVxdWVzdCBub3RpZmljYXRpb24gZm9yIG11bHRpcGxlIGNvbXBsZXRpb25zIChBcm0tTikuIENvdW50ZXIgZmlsZWQgc3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGUgQ1EgSW5kZXggdGhhdCB3aGVuIHJlYWNoZWQgYnkgSFcgKGkuZS4gSFcgZ2VuZXJhdGVzIGEgQ1FFIGludG8gdGhpcyBJbmRleCkgRXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlciAtIFJlc2VydmVkICovCisgICAgcHNldWRvX2JpdF90CWNtZF9zblsweDAwMDAyXTsgICAgICAgLyogQ29tbWFuZCBTZXF1ZW5jZSBOdW1iZXIgLSBTZWUgVGFibGUgMzUsICJDUSBEb29yYmVsbCBMYXlvdXQiIGZvciBkZWZpbml0aW9uIG9mIHRoaXMgZmlsZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzWzB4MDAwMDNdOyAgICAgICAgICAvKiBNdXN0IGJlIDB4MiAqLworICAgIHBzZXVkb19iaXRfdAljcV9udW1iZXJbMHgwMDAxOF07ICAgIC8qIENRIG51bWJlciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBDUV9DSV9EQl9SZWNvcmQgKi8KKworc3RydWN0IGFyYmVscHJtX2NxX2NpX2RiX3JlY29yZF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJY291bnRlclsweDAwMDIwXTsgICAgICAvKiBDUSBjb3VudGVyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CXJlc1sweDAwMDAzXTsgICAgICAgICAgLyogTXVzdCBiZSAweDEgKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FfbnVtYmVyWzB4MDAwMThdOyAgICAvKiBDUSBudW1iZXIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogVmlydHVhbF9QaHlzaWNhbF9NYXBwaW5nICovCisKK3N0cnVjdCBhcmJlbHBybV92aXJ0dWFsX3BoeXNpY2FsX21hcHBpbmdfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXZhX2hbMHgwMDAyMF07ICAgICAgICAgLyogVmlydHVhbCBBZGRyZXNzWzYzOjMyXS4gVmFsaWQgb25seSBmb3IgTUFQX0lDTSBjb21tYW5kLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMGNdOworICAgIHBzZXVkb19iaXRfdAl2YV9sWzB4MDAwMTRdOyAgICAgICAgIC8qIFZpcnR1YWwgQWRkcmVzc1szMToxMl0uIFZhbGlkIG9ubHkgZm9yIE1BUF9JQ00gY29tbWFuZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBhX2hbMHgwMDAyMF07ICAgICAgICAgLyogUGh5c2ljYWwgQWRkcmVzc1s2MzozMl0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZzJzaXplWzB4MDAwMDZdOyAgICAgLyogTG9nMiBvZiB0aGUgc2l6ZSBpbiA0S0IgcGFnZXMgb2YgdGhlIHBoeXNpY2FsIGFuZCB2aXJ0dWFsIGNvbnRpZ3VvdXMgbWVtb3J5IHRoYXQgc3RhcnRzIGF0IFBBX0wvSCBhbmQgVkFfTC9IICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDA2XTsKKyAgICBwc2V1ZG9fYml0X3QJcGFfbFsweDAwMDE0XTsgICAgICAgICAvKiBQaHlzaWNhbCBBZGRyZXNzWzMxOjEyXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNT0RfU1RBVF9DRkcgKi8KKworc3RydWN0IGFyYmVscHJtX21vZF9zdGF0X2NmZ19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9zcnFzWzB4MDAwMDVdOyAvKiBMb2cgKGJhc2UgMikgb2YgdGhlIG51bWJlciBvZiBTUlFzIHRvIGFsbG9jYXRlICgwIGlmIG5vIFNSUXMgYXJlIHJlcXVpcmVkKSwgdmFsaWQgb25seSBpZiBzcnEgYml0IGlzIHNldC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAlzcnFbMHgwMDAwMV07ICAgICAgICAgIC8qIFdoZW4gc2V0IFNSUXMgYXJlIHN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlzcnFfbVsweDAwMDAxXTsgICAgICAgIC8qIE1vZGlmeSBTUlEgcGFyYW1ldGVycyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAxOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDdlMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFNSUSBDb250ZXh0ICovCisKK3N0cnVjdCBhcmJlbHBybV9zcnFfY29udGV4dF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3JxblsweDAwMDE4XTsgICAgICAgICAvKiBTUlEgbnVtYmVyICovCisgICAgcHNldWRvX2JpdF90CWxvZ19zcnFfc2l6ZVsweDAwMDA0XTsgLyogTG9nMiBvZiB0aGUgTnVtYmVyIG9mIFdRRXMgaW4gdGhlIFJlY2VpdmUgUXVldWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bSB2YWx1ZSBpcyAweDEwLCBpLmUuIDE2TSBXUUVzLiAqLworICAgIHBzZXVkb19iaXRfdAlzdGF0ZVsweDAwMDA0XTsgICAgICAgIC8qIFNSUSBTdGF0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTExIC0gU1cgT3duZXJzaGlwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAwMCAtIEhXIE93bmVyc2hpcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDEgLSBFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIG9ubHkgb24gUVVFUllfU1JRIGFuZCBIVzJTV19TUlEgY29tbWFuZHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsX2tleVsweDAwMDIwXTsgICAgICAgIC8qIG1lbW9yeSBrZXkgKEwtS2V5KSB0byBiZSB1c2VkIHRvIGFjY2VzcyBXUUVzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3JxX2RiX3JlY29yZF9pbmRleFsweDAwMDIwXTsvKiBJbmRleCBpbiB0aGUgVUFSIENvbnRleHQgVGFibGUgRW50cnkgY29udGFpbmluZyB0aGUgZG9vcmJlbGwgcmVjb3JkIGZvciB0aGUgcmVjZWl2ZSBxdWV1ZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFcgdXNlcyB0aGlzIGluZGV4IGFzIGFuIG9mZnNldCBmcm9tIHRoZSBVQVIgQ29udGV4dCBUYWJsZSBFbnRyeSBpbiBvcmRlciB0byByZWFkIHRoaXMgU1JRIGRvb3JiZWxsIHJlY29yZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZW50cnkgaXMgb2J0YWluZWQgdmlhIHRoZSB1c3JfcGFnZSBmaWVsZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXVzcl9wYWdlWzB4MDAwMThdOyAgICAgLyogSW5kZXggKG9mZnNldCkgb2YgdXNlciBwYWdlIGFsbG9jYXRlZCBmb3IgdGhpcyBTUlEgKHNlZSAibm9uX3ByaXZpbGVnZWQgQWNjZXNzIHRvIHRoZSBIQ0EgSGFyZHdhcmUiKS4gTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAlsb2dfcnFfc3RyaWRlWzB4MDAwMDNdOy8qIFN0cmlkZSAobWF4IFdRRSBzaXplKSBvbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gV1EgZW50cnkgaXMgMTYqKDJebG9nX1JRX3N0cmlkZSkgYnl0ZXMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl3cWVfYWRkcl9oWzB4MDAwMjBdOyAgIC8qIEJpdHMgNjM6MzIgb2YgV1FFIGFkZHJlc3MgKFdRRSBiYXNlIGFkZHJlc3MpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CXNycV93cWVfYmFzZV9hZHJfbFsweDAwMDFhXTsvKiBXaGlsZSBvcGVuaW5nIChjcmVhdGluZykgdGhlIFNSUSwgdGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBvZiBmaXJzdCBkZXNjcmlwdG9yIHRvIGJlIHBvc3RlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBkWzB4MDAwMThdOyAgICAgICAgICAgLyogU1JRIHByb3RlY3Rpb24gZG9tYWluLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl3cWVfY250WzB4MDAwMTBdOyAgICAgIC8qIFdRRSBjb3VudCBvbiB0aGUgU1JRLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIG9ubHkgb24gUVVFUllfU1JRIGFuZCBIVzJTV19TUlEgY29tbWFuZHMuICovCisgICAgcHNldWRvX2JpdF90CWx3bVsweDAwMDEwXTsgICAgICAgICAgLyogTGltaXQgV2F0ZXIgTWFyayAtIGlmIHRoZSBMV00gaXMgbm90IHplcm8sIGFuZCB0aGUgd3FlX2NudCBkcm9wcyBiZWxvdyBMV00gd2hlbiBhIFdRRSBpcyBkZXF1ZXVlZCBmcm9tIHRoZSBTUlEsIHRoZW4gYSBTUlEgbGltaXQgZXZlbnQgaXMgZmlyZWQgYW5kIHRoZSBMV00gaXMgc2V0IHRvIHplcm8uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcnFfd3FlX2NvdW50ZXJbMHgwMDAxMF07LyogQSAxNmJpdHMgY291bnRlciB0aGF0IGlzIGluY3JlbWVudGVkIGZvciBlYWNoIFdRRSBwb3N0ZWQgdG8gdGhlIFNRLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgMHgwIGluIFNSUSBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUVVFUllfU1JRIG9ubHkpLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAxMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDA2MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFBCTCAqLworCitzdHJ1Y3QgYXJiZWxwcm1fcGJsX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAltdHRfMF9oWzB4MDAwMjBdOyAgICAgIC8qIEZpcnN0IE1UVFs2MzozMl0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF8wX2xbMHgwMDAyMF07ICAgICAgLyogRmlyc3QgTVRUWzMxOjBdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltdHRfMV9oWzB4MDAwMjBdOyAgICAgIC8qIFNlY29uZCBNVFRbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltdHRfMV9sWzB4MDAwMjBdOyAgICAgIC8qIFNlY29uZCBNVFRbMzE6MF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF8yX2hbMHgwMDAyMF07ICAgICAgLyogVGhpcmQgTVRUWzYzOjMyXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXR0XzJfbFsweDAwMDIwXTsgICAgICAvKiBUaGlyZCBNVFRbMzE6MF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF8zX2hbMHgwMDAyMF07ICAgICAgLyogRm91cnRoIE1UVFs2MzozMl0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF8zX2xbMHgwMDAyMF07ICAgICAgLyogRm91cnRoIE1UVFszMTowXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBQZXJmb3JtYW5jZSBDb3VudGVycyAqLworCitzdHJ1Y3QgYXJiZWxwcm1fcGVyZm9ybWFuY2VfY291bnRlcnNfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXNxcGNfYWNjZXNzX2NudFsweDAwMDIwXTsvKiBTUVBDIGNhY2hlIGFjY2VzcyBjb3VudCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FwY19taXNzX2NudFsweDAwMDIwXTsvKiBTUVBDIGNhY2hlIG1pc3MgY291bnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxcGNfYWNjZXNzX2NudFsweDAwMDIwXTsvKiBSUVBDIGNhY2hlIGFjY2VzcyBjb3VudCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFwY19taXNzX2NudFsweDAwMDIwXTsvKiBSUVBDIGNhY2hlIG1pc3MgY291bnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNxY19hY2Nlc3NfY250WzB4MDAwMjBdOy8qIENRQyBjYWNoZSBhY2Nlc3MgY291bnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNxY19taXNzX2NudFsweDAwMDIwXTsgLyogQ1FDIGNhY2hlIG1pc3MgY291bnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXRwdF9hY2Nlc3NfY250WzB4MDAwMjBdOy8qIFRQVCBjYWNoZSBhY2Nlc3MgY291bnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1wdF9taXNzX2NudFsweDAwMDIwXTsgLyogTVBUIGNhY2hlIG1pc3MgY291bnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF9taXNzX2NudFsweDAwMDIwXTsgLyogTVRUIGNhY2hlIG1pc3MgY291bnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwNjIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogVHJhbnNwb3J0IGFuZCBDSSBFcnJvciBDb3VudGVycyAqLworCitzdHJ1Y3QgYXJiZWxwcm1fdHJhbnNwb3J0X2FuZF9jaV9lcnJvcl9jb3VudGVyc19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX2xsZVsweDAwMDIwXTsgICAvKiBSZXNwb25kZXIgLSBudW1iZXIgb2YgbG9jYWwgbGVuZ3RoIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX2xsZVsweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgbG9jYWwgbGVuZ3RoIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX2xxcG9lWzB4MDAwMjBdOyAvKiBSZXNwb25kZXIgLSBudW1iZXIgbG9jYWwgUVAgb3BlcmF0aW9uIGVycm9yICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fbHFwb2VbMHgwMDAyMF07IC8qIFJlcXVlc3RlciAtIG51bWJlciBsb2NhbCBRUCBvcGVyYXRpb24gZXJyb3IgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV9sZWVvZVsweDAwMDIwXTsgLyogUmVzcG9uZGVyIC0gbnVtYmVyIGxvY2FsIEVFIG9wZXJhdGlvbiBlcnJvciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX2xlZW9lWzB4MDAwMjBdOyAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgbG9jYWwgRUUgb3BlcmF0aW9uIGVycm9yICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlycV9udW1fbHBlWzB4MDAwMjBdOyAgIC8qIFJlc3BvbmRlciAtIG51bWJlciBvZiBsb2NhbCBwcm90ZWN0aW9uIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX2xwZVsweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgbG9jYWwgcHJvdGVjdGlvbiBlcnJvcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV93cmZlWzB4MDAwMjBdOyAgLyogUmVzcG9uZGVyIC0gbnVtYmVyIG9mIENRRXMgd2l0aCBlcnJvci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgQ1FFIHdpdGggZXJyb3IgaXMgZ2VuZXJhdGVkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fd3JmZVsweDAwMDIwXTsgIC8qIFJlcXVlc3RlciAtIG51bWJlciBvZiBDUUVzIHdpdGggZXJyb3IuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGVkIGVhY2ggdGltZSBhIENRRSB3aXRoIGVycm9yIGlzIGdlbmVyYXRlZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX213YmVbMHgwMDAyMF07ICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgbWVtb3J5IHdpbmRvdyBiaW5kIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX2JyZVsweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgYmFkIHJlc3BvbnNlIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX2xhZVsweDAwMDIwXTsgICAvKiBSZXNwb25kZXIgLSBudW1iZXIgb2YgbG9jYWwgYWNjZXNzIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX3JpcmVbMHgwMDAyMF07ICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgcmVtb3RlIGludmFsaWQgcmVxdWVzdCBlcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQUstSW52YWxpZCBSZXF1ZXN0IG9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFVuc3VwcG9ydGVkIE9wQ29kZTogUmVzcG9uZGVyIGRldGVjdGVkIGFuIHVuc3VwcG9ydGVkIE9wQ29kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBVbmV4cGVjdGVkIE9wQ29kZTogUmVzcG9uZGVyIGRldGVjdGVkIGFuIGVycm9yIGluIHRoZSBzZXF1ZW5jZSBvZiBPcENvZGVzLCBzdWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBtaXNzaW5nICJMYXN0IiBwYWNrZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogdGhlcmUgaXMgbm8gUFNOIGVycm9yLCB0aHVzIHRoaXMgZG9lcyBub3QgaW5kaWNhdGUgYSBkcm9wcGVkIHBhY2tldC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV9yaXJlWzB4MDAwMjBdOyAgLyogUmVzcG9uZGVyIC0gbnVtYmVyIG9mIHJlbW90ZSBpbnZhbGlkIHJlcXVlc3QgZXJyb3JzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BSyBtYXkgb3IgbWF5IG5vdCBiZSBzZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFFQIEFzeW5jIEFmZmlsaWF0ZWQgRXJyb3I6IFVuc3VwcG9ydGVkIG9yIFJlc2VydmVkIE9wQ29kZSAoUkMsUkQgb25seSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ib3VuZCByZXF1ZXN0IE9wQ29kZSB3YXMgZWl0aGVyIHJlc2VydmVkLCBvciB3YXMgZm9yIGEgZnVuY3Rpb24gbm90IHN1cHBvcnRlZCBieSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVAuIChFLmcuIFJETUEgb3IgQVRPTUlDIG9uIFFQIG5vdCBzZXQgdXAgZm9yIHRoaXMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIE1pc2FsaWduZWQgQVRPTUlDOiBWQSBkb2VzIG5vdCBwb2ludCB0byBhbiBhbGlnbmVkIGFkZHJlc3Mgb24gYW4gYXRvbWljIG9wZXJhLXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4gVG9vIG1hbnkgUkRNQSBSRUFEIG9yIEFUT01JQyBSZXF1ZXN0czogVGhlcmUgd2VyZSBtb3JlIHJlcXVlc3RzIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBBQ0tlZCB0aGFuIGFsbG93ZWQgZm9yIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuIE91dCBvZiBTZXF1ZW5jZSBPcENvZGUsIGN1cnJlbnQgcGFja2V0IGlzICJGaXJzdCIgb3IgIk9ubHkiOiBUaGUgUmVzcG9uZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWQgYW4gZXJyb3IgaW4gdGhlIHNlcXVlbmNlIG9mIE9wQ29kZXM7IGEgbWlzc2luZyAiTGFzdCIgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4gT3V0IG9mIFNlcXVlbmNlIE9wQ29kZSwgY3VycmVudCBwYWNrZXQgaXMgbm90ICJGaXJzdCIgb3IgIk9ubHkiOiBUaGUgUmVzcG9uZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWQgYW4gZXJyb3IgaW4gdGhlIHNlcXVlbmNlIG9mIE9wQ29kZXM7IGEgbWlzc2luZyAiRmlyc3QiIHBhY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYuIExvY2FsIExlbmd0aCBFcnJvcjogSW5ib3VuZCAiU2VuZCIgcmVxdWVzdCBtZXNzYWdlIGV4Y2VlZGVkIHRoZSByZXNwb25kZXIucyBhdmFpbC1hYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcuIExlbmd0aCBlcnJvcjogUkRNQSBXUklURSByZXF1ZXN0IG1lc3NhZ2UgY29udGFpbmVkIHRvbyBtdWNoIG9yIHRvbyBsaXR0bGUgcGF5LWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGNvbXBhcmVkIHRvIHRoZSBETUEgbGVuZ3RoIGFkdmVydGlzZWQgaW4gdGhlIGZpcnN0IG9yIG9ubHkgcGFja2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDguIExlbmd0aCBlcnJvcjogUGF5bG9hZCBsZW5ndGggd2FzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIG9wY29kZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiAwIGJ5dGUgPD0gIm9ubHkiIDw9IFBNVFUgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiAoImZpcnN0IiBvciAibWlkZGxlIikgPT0gUE1UVSBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IDFieXRlIDw9ICJsYXN0IiA8PSBQTVRVIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOS4gTGVuZ3RoIGVycm9yOiBJbmJvdW5kIG1lc3NhZ2UgZXhjZWVkZWQgdGhlIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBDQSBwb3J0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX3JhZVsweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgcmVtb3RlIGFjY2VzcyBlcnJvcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFLLVJlbW90ZSBBY2Nlc3MgRXJyb3Igb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUl9LZXkgVmlvbGF0aW9uOiBSZXNwb25kZXIgZGV0ZWN0ZWQgYW4gaW52YWxpZCBSX0tleSB3aGlsZSBleGVjdXRpbmcgYW4gUkRNQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3QuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlycV9udW1fcmFlWzB4MDAwMjBdOyAgIC8qIFJlc3BvbmRlciAtIG51bWJlciBvZiByZW1vdGUgYWNjZXNzIGVycm9ycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSX0tleSBWaW9sYXRpb24gUmVzcG9uZGVyIGRldGVjdGVkIGFuIFJfS2V5IHZpb2xhdGlvbiB3aGlsZSBleGVjdXRpbmcgYW4gUkRNQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFLIG1heSBvciBtYXkgbm90IGJlIHNlbnQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fcm9lWzB4MDAwMjBdOyAgIC8qIFJlcXVlc3RlciAtIG51bWJlciBvZiByZW1vdGUgb3BlcmF0aW9uIGVycm9ycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQUstUmVtb3RlIE9wZXJhdGlvbiBFcnJvciBvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGUgT3BlcmF0aW9uIEVycm9yOiBSZXNwb25kZXIgZW5jb3VudGVyZWQgYW4gZXJyb3IsIChsb2NhbCB0byB0aGUgcmVzcG9uZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBwcmV2ZW50ZWQgaXQgZnJvbSBjb21wbGV0aW5nIHRoZSByZXF1ZXN0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX3JvZVsweDAwMDIwXTsgICAvKiBSZXNwb25kZXIgLSBudW1iZXIgb2YgcmVtb3RlIG9wZXJhdGlvbiBlcnJvcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFLLVJlbW90ZSBPcGVyYXRpb24gRXJyb3Igb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gTWFsZm9ybWVkIFdRRTogUmVzcG9uZGVyIGRldGVjdGVkIGEgbWFsZm9ybWVkIFJlY2VpdmUgUXVldWUgV1FFIHdoaWxlIHByby1jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBSZW1vdGUgT3BlcmF0aW9uIEVycm9yOiBSZXNwb25kZXIgZW5jb3VudGVyZWQgYW4gZXJyb3IsIChsb2NhbCB0byB0aGUgcmVzcG9uZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBwcmV2ZW50ZWQgaXQgZnJvbSBjb21wbGV0aW5nIHRoZSByZXF1ZXN0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX3RyZWVbMHgwMDAyMF07ICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgdHJhbnNwb3J0IHJldHJpZXMgZXhjZWVkZWQgZXJyb3JzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fcnJlZVsweDAwMDIwXTsgIC8qIFJlcXVlc3RlciAtIG51bWJlciBvZiBSTlIgbmFrIHJldHJpZXMgZXhjZWVkZWQgZXJyb3JzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fbHJkdmVbMHgwMDAyMF07IC8qIFJlcXVlc3RlciAtIG51bWJlciBvZiBsb2NhbCBSREQgdmlvbGF0aW9uIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX3JpcmRyZVsweDAwMDIwXTsvKiBSZXNwb25kZXIgLSBudW1iZXIgb2YgcmVtb3RlIGludmFsaWQgUkQgcmVxdWVzdCBlcnJvcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNxX251bV9yYWJydGVbMHgwMDAyMF07LyogUmVxdWVzdGVyIC0gbnVtYmVyIG9mIHJlbW90ZSBhYm9ydGVkIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX2llZWNuZVsweDAwMDIwXTsvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgaW52YWxpZCBFRSBjb250ZXh0IG51bWJlciBlcnJvcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkN1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNxX251bV9pZWVjc2VbMHgwMDAyMF07LyogUmVxdWVzdGVyIC0gaW52YWxpZCBFRSBjb250ZXh0IHN0YXRlIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAzODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX29vc1sweDAwMDIwXTsgICAvKiBSZXNwb25kZXIgLSBudW1iZXIgb2Ygb3V0IG9mIHNlcXVlbmNlIHJlcXVlc3RzIHJlY2VpdmVkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fb29zWzB4MDAwMjBdOyAgIC8qIFJlcXVlc3RlciAtIG51bWJlciBvZiBvdXQgb2Ygc2VxdWVuY2UgTmFrcyByZWNlaXZlZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX21jZVsweDAwMDIwXTsgICAvKiBSZXNwb25kZXIgLSBudW1iZXIgb2YgYmFkIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlycV9udW1fcnN5bmNbMHgwMDAyMF07IC8qIFJlc3BvbmRlciAtIG51bWJlciBvZiBSRVNZTkMgb3BlcmF0aW9ucyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX3JzeW5jWzB4MDAwMjBdOyAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgUkVTWU5DIG9wZXJhdGlvbnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV91ZHNkcHJkWzB4MDAwMjBdOy8qIFRoZSBudW1iZXIgb2YgVUQgcGFja2V0cyBzaWxlbnRseSBkaXNjYXJkZWQgb24gdGhlIHJlY2VpdmUgcXVldWUgZHVlIHRvIGxhY2sgb2YgcmVjZWl2ZSBkZXNjcmlwdG9yLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV91Y3NkcHJkWzB4MDAwMjBdOy8qIFRoZSBudW1iZXIgb2YgVUMgcGFja2V0cyBzaWxlbnRseSBkaXNjYXJkZWQgb24gdGhlIHJlY2VpdmUgcXVldWUgZHVlIHRvIGxhY2sgb2YgcmVjZWl2ZSBkZXNjcmlwdG9yLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMVsweDAwM2UwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW51bV9jcW92ZlsweDAwMDIwXTsgICAgLyogTnVtYmVyIG9mIENRIG92ZXJmbG93cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbnVtX2Vxb3ZmWzB4MDAwMjBdOyAgICAvKiBOdW1iZXIgb2YgRVEgb3ZlcmZsb3dzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAludW1fYmFkZGJbMHgwMDAyMF07ICAgIC8qIE51bWJlciBvZiBiYWQgZG9vcmJlbGxzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEyWzB4MDAyYTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFdmVudF9kYXRhIEZpZWxkIC0gSENSIENvbXBsZXRpb24gRXZlbnQgKi8KKworc3RydWN0IGFyYmVscHJtX2hjcl9jb21wbGV0aW9uX2V2ZW50X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAl0b2tlblsweDAwMDEwXTsgICAgICAgIC8qIEhDUiBUb2tlbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAxMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzdGF0dXNbMHgwMDAwOF07ICAgICAgIC8qIEhDUiBTdGF0dXMgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMThdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3V0X3BhcmFtX2hbMHgwMDAyMF07ICAvKiBIQ1IgT3V0cHV0IFBhcmFtZXRlciBbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlvdXRfcGFyYW1fbFsweDAwMDIwXTsgIC8qIEhDUiBPdXRwdXQgUGFyYW1ldGVyIFszMTowXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBDb21wbGV0aW9uIHdpdGggRXJyb3IgQ1FFICovCisKK3N0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3dpdGhfZXJyb3Jfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CW15cXBuWzB4MDAwMThdOyAgICAgICAgLyogSW5kaWNhdGVzIHRoZSBRUCBmb3Igd2hpY2ggY29tcGxldGlvbiBpcyBiZWluZyByZXBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDA2MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAxMF07CisgICAgcHNldWRvX2JpdF90CXZlbmRvcl9jb2RlWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlzeW5kcm9tZVsweDAwMDA4XTsgICAgIC8qIENvbXBsZXRpb24gd2l0aCBlcnJvciBzeW5kcm9tZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEgLSBMb2NhbCBMZW5ndGggRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgLSBMb2NhbCBRUCBPcGVyYXRpb24gRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgLSBMb2NhbCBFRSBDb250ZXh0IE9wZXJhdGlvbiBFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCAtIExvY2FsIFByb3RlY3Rpb24gRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUgLSBXb3JrIFJlcXVlc3QgRmx1c2hlZCBFcnJvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYgLSBNZW1vcnkgV2luZG93IEJpbmQgRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgLSBCYWQgUmVzcG9uc2UgRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEgLSBMb2NhbCBBY2Nlc3MgRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIgLSBSZW1vdGUgSW52YWxpZCBSZXF1ZXN0IEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzIC0gUmVtb3RlIEFjY2VzcyBFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNCAtIFJlbW90ZSBPcGVyYXRpb24gRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUgLSBUcmFuc3BvcnQgUmV0cnkgQ291bnRlciBFeGNlZWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNiAtIFJOUiBSZXRyeSBDb3VudGVyIEV4Y2VlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIC0gTG9jYWwgUkREIFZpb2xhdGlvbiBFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMSAtIFJlbW90ZSBJbnZhbGlkIFJEIFJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjIgLSBSZW1vdGUgQWJvcnRlZCBFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMyAtIEludmFsaWQgRUUgQ29udGV4dCBOdW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjQgLSBJbnZhbGlkIEVFIENvbnRleHQgU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIC0gUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5kcm9tZSBpcyBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUgSUIgc3BlY2lmaWNhdGlvbiB2b2x1bWUgMS4gRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZSBzeW5kcm9tZXMsIHJlZmVyIHRvIGNoYXB0ZXJzIDEwLTExIG9mIHRoZSBJQiBzcGVjaWZpY2F0aW9uIHJldiAxLjEuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CXdxZV9hZGRyWzB4MDAwMWFdOyAgICAgLyogQml0cyAzMTo2IG9mIFdRRSB2aXJ0dWFsIGFkZHJlc3MgY29tcGxldGlvbiBpcyByZXBvcnRlZCBmb3IuIFRoZSA2IGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIHplcm8uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAwN107CisgICAgcHNldWRvX2JpdF90CW93bmVyWzB4MDAwMDFdOyAgICAgICAgLyogT3duZXIgZmllbGQuIFplcm8gdmFsdWUgb2YgdGhpcyBmaWVsZCBtZWFucyBTVyBvd25lcnNoaXAgb2YgQ1FFLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDZbMHgwMDAxMF07CisgICAgcHNldWRvX2JpdF90CW9wY29kZVsweDAwMDA4XTsgICAgICAgLyogVGhlIG9wY29kZSBvZiBXUUUgY29tcGxldGlvbiBpcyByZXBvcnRlZCBmb3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHJlcG9ydGVkIGluIGNhc2Ugb2YgY29tcGxldGlvbiB3aXRoIGVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkUgLSBGb3IgY29tcGxldGlvbiB3aXRoIGVycm9yIG9uIFJlY2VpdmUgUXVldWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRiAtIEZvciBjb21wbGV0aW9uIHdpdGggZXJyb3Igb24gU2VuZCBRdWV1ZXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogUmVzaXplIENRIElucHV0IE1haWxib3ggKi8KKworc3RydWN0IGFyYmVscHJtX3Jlc2l6ZV9jcV9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhcnRfYWRkcl9oWzB4MDAwMjBdOyAvKiBTdGFydCBhZGRyZXNzIG9mIENRWzYzOjMyXS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBhbGlnbmVkIG9uIENRRSBzaXplICgzMiBieXRlcykgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN0YXJ0X2FkZHJfbFsweDAwMDIwXTsgLyogU3RhcnQgYWRkcmVzcyBvZiBDUVszMTowXS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBhbGlnbmVkIG9uIENRRSBzaXplICgzMiBieXRlcykgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDE4XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX2NxX3NpemVbMHgwMDAwNV07ICAvKiBMb2cgKGJhc2UgMikgb2YgdGhlIENRIHNpemUgKGluIGVudHJpZXMpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAzXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDYwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxfa2V5WzB4MDAwMjBdOyAgICAgICAgLyogTWVtb3J5IGtleSAoTF9LZXkpIHRvIGJlIHVzZWQgdG8gYWNjZXNzIENRICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDEwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIE1BRF9JRkMgSW5wdXQgTW9kaWZpZXIgKi8KKworc3RydWN0IGFyYmVscHJtX21hZF9pZmNfaW5wdXRfbW9kaWZpZXJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXBvcnRfbnVtYmVyWzB4MDAwMDhdOyAgLyogVGhlIHBhY2tldCByZWNlcHRpb24gcG9ydCBudW1iZXIgKDEgb3IgMikuICovCisgICAgcHNldWRvX2JpdF90CW1hZF9leHRlbmRlZF9pbmZvWzB4MDAwMDFdOy8qIE1hZF9FeHRlbmRlZF9JbmZvIHZhbGlkIGJpdCAoTUFEX0lGQyBJbnB1dCBNYWlsYm94IGRhdGEgZnJvbSBvZmZzZXQgMDAxMDBoIGFuZCBkb3duKS4gTUFEX0V4dGVuZGVkX0luZm8gaXMgcmVhZCBvbmx5IGlmIHRoaXMgYml0IGlzIHNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBmb3IgdHJhcCBnZW5lcmF0aW9uIHdoZW4gQktleSBjaGVjayBpcyBlbmFibGVkIGFuZCBmb3IgZ2xvYmFsIHJvdXRlZCBwYWNrZXRzLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwN107CisgICAgcHNldWRvX2JpdF90CXJsaWRbMHgwMDAxMF07ICAgICAgICAgLyogUmVtb3RlIChzb3VyY2UpIExJRCAgZnJvbSB0aGUgcmVjZWl2ZWQgTUFELgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgZm9yIHRyYXAgZ2VuZXJhdGlvbiB1cG9uIE1LZXkvQktleSB2YWxpZGF0aW9uLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNQURfSUZDIElucHV0IE1haWxib3ggKi8KKworc3RydWN0IGFyYmVscHJtX21hZF9pZmNfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlcXVlc3RfbWFkX3BhY2tldFs2NF1bMHgwMDAyMF07LyogUmVxdWVzdCBNQUQgUGFja2V0ICgyNTZieXRlcykgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW15X3FwblsweDAwMDE4XTsgICAgICAgLyogRGVzdGluYXRpb24gUVAgbnVtYmVyIGZyb20gdGhlIHJlY2VpdmVkIE1BRC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBpZiBNYWRfZXh0ZW5kZWRfaW5mbyBpbmRpY2F0aW9uIGluIHRoZSBpbnB1dCBtb2RpZmllciBpcyBjbGVhci4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFwblsweDAwMDE4XTsgICAgICAgICAvKiBSZW1vdGUgKHNvdXJjZSkgUVAgbnVtYmVyICBmcm9tIHRoZSByZWNlaXZlZCBNQUQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBpZiBNYWRfZXh0ZW5kZWRfaW5mbyBpbmRpY2F0aW9uIGluIHRoZSBpbnB1dCBtb2RpZmllciBpcyBjbGVhci4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmxpZFsweDAwMDEwXTsgICAgICAgICAvKiBSZW1vdGUgKHNvdXJjZSkgTElEICBmcm9tIHRoZSByZWNlaXZlZCBNQUQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBpZiBNYWRfZXh0ZW5kZWRfaW5mbyBpbmRpY2F0aW9uIGluIHRoZSBpbnB1dCBtb2RpZmllciBpcyBjbGVhci4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWxfcGF0aFsweDAwMDA3XTsgICAgICAvKiBNeSAoZGVzdGluYXRpb24pIExJRCBwYXRoIGJpdHMgIGZyb20gdGhlIHJlY2VpdmVkIE1BRC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGlmIE1hZF9leHRlbmRlZF9pbmZvIGluZGljYXRpb24gaW4gdGhlIGlucHV0IG1vZGlmaWVyIGlzIGNsZWFyLiAqLworICAgIHBzZXVkb19iaXRfdAlnWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIElmIHNldCwgdGhlIEdSSCBmaWVsZCBpbiB2YWxpZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBpZiBNYWRfZXh0ZW5kZWRfaW5mbyBpbmRpY2F0aW9uIGluIHRoZSBpbnB1dCBtb2RpZmllciBpcyBjbGVhci4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAlzbFsweDAwMDA0XTsgICAgICAgICAgIC8qIFNlcnZpY2UgTGV2ZWwgb2YgdGhlIHJlY2VpdmVkIE1BRC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGlmIE1hZF9leHRlbmRlZF9pbmZvIGluZGljYXRpb24gaW4gdGhlIGlucHV0IG1vZGlmaWVyIGlzIGNsZWFyLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGtleV9pbmR4WzB4MDAwMTBdOyAgICAvKiBJbmRleCBpbiBQS2V5IHRhYmxlIHRoYXQgbWF0Y2hlcyBQS2V5IG9mIHRoZSByZWNlaXZlZCBNQUQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgaWYgTWFkX2V4dGVuZGVkX2luZm8gaW5kaWNhdGlvbiBpbiB0aGUgaW5wdXQgbW9kaWZpZXIgaXMgY2xlYXIuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMTgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWdyaFsxMF1bMHgwMDAyMF07ICAgICAgLyogVGhlIEdSSCBmaWVsZCBvZiB0aGUgTUFEIHBhY2tldCB0aGF0IHdhcyBzY2F0dGVyZWQgdG8gdGhlIGZpcnN0IDQwIGJ5dGVzIHBvaW50ZWQgdG8gYnkgdGhlIHNjYXR0ZXIgbGlzdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgaWYgTWFkX2V4dGVuZGVkX2luZm8gYml0IChpbiB0aGUgaW5wdXQgbW9kaWZpZXIpIGFuZCBnIGJpdCBhcmUgc2V0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgdGhpcyBmaWVsZCBpcyByZXNlcnZlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwNGMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogUXVlcnkgRGVidWcgTWVzc2FnZSAqLworCitzdHJ1Y3QgYXJiZWxwcm1fcXVlcnlfZGVidWdfbXNnX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlwaHlfYWRkcl9oWzB4MDAwMjBdOyAgIC8qIFRyYW5zbGF0aW9uIG9mIHRoZSBhZGRyZXNzIGluIGZpcm13YXJlIGFyZWEuIEhpZ2ggMzIgYml0cy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZbMHgwMDAwMV07ICAgICAgICAgICAgLyogUGh5c2ljYWwgdHJhbnNsYXRpb24gaXMgdmFsaWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMGJdOworICAgIHBzZXVkb19iaXRfdAlwaHlfYWRkcl9sWzB4MDAwMTRdOyAgIC8qIFRyYW5zbGF0aW9uIG9mIHRoZSBhZGRyZXNzIGluIGZpcm13YXJlIGFyZWEuIExvdyAzMiBiaXRzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZndfYXJlYV9iYXNlWzB4MDAwMjBdOyAvKiBGaXJtd2FyZSBhcmVhIGJhc2UgYWRkcmVzcy4gVGhlIGZvcm1hdCBzdHJpbmdzIGFuZCB0aGUgdHJhY2UgYnVmZmVycyBtYXkgYmUgbG9jYXRlZCBzdGFydGluZyBmcm9tIHRoaXMgYWRkcmVzcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWZ3X2FyZWFfc2l6ZVsweDAwMDIwXTsgLyogRmlybXdhcmUgYXJlYSBzaXplICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl0cmNfaGRyX3N6WzB4MDAwMjBdOyAgIC8qIFRyYWNlIG1lc3NhZ2UgaGVhZGVyIHNpemUgaW4gZHdvcmRzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdHJjX2FyZ19udW1bMHgwMDAyMF07ICAvKiBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwZXIgdHJhY2UgbWVzc2FnZS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMGMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWRiZ19tc2tfaFsweDAwMDIwXTsgICAgLyogRGVidWcgbWVzc2FnZXMgbWFzayBbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlkYmdfbXNrX2xbMHgwMDAyMF07ICAgIC8qIERlYnVnIG1lc3NhZ2VzIG1hc2sgWzMxOjBdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlidWZmMF9hZGRyWzB4MDAwMjBdOyAgIC8qIEFkZHJlc3MgaW4gZmlybXdhcmUgYXJlYSBvZiBUcmFjZSBCdWZmZXIgMCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjBfc2l6ZVsweDAwMDIwXTsgICAvKiBTaXplIG9mIFRyYWNlIEJ1ZmZlciAwICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlidWZmMV9hZGRyWzB4MDAwMjBdOyAgIC8qIEFkZHJlc3MgaW4gZmlybXdhcmUgYXJlYSBvZiBUcmFjZSBCdWZmZXIgMSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjFfc2l6ZVsweDAwMDIwXTsgICAvKiBTaXplIG9mIFRyYWNlIEJ1ZmZlciAxICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlidWZmMl9hZGRyWzB4MDAwMjBdOyAgIC8qIEFkZHJlc3MgaW4gZmlybXdhcmUgYXJlYSBvZiBUcmFjZSBCdWZmZXIgMiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjJfc2l6ZVsweDAwMDIwXTsgICAvKiBTaXplIG9mIFRyYWNlIEJ1ZmZlciAyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlidWZmM19hZGRyWzB4MDAwMjBdOyAgIC8qIEFkZHJlc3MgaW4gZmlybXdhcmUgYXJlYSBvZiBUcmFjZSBCdWZmZXIgMyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjNfc2l6ZVsweDAwMDIwXTsgICAvKiBTaXplIG9mIFRyYWNlIEJ1ZmZlciAzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlidWZmNF9hZGRyWzB4MDAwMjBdOyAgIC8qIEFkZHJlc3MgaW4gZmlybXdhcmUgYXJlYSBvZiBUcmFjZSBCdWZmZXIgNCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjRfc2l6ZVsweDAwMDIwXTsgICAvKiBTaXplIG9mIFRyYWNlIEJ1ZmZlciA0ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlidWZmNV9hZGRyWzB4MDAwMjBdOyAgIC8qIEFkZHJlc3MgaW4gZmlybXdhcmUgYXJlYSBvZiBUcmFjZSBCdWZmZXIgNSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjVfc2l6ZVsweDAwMDIwXTsgICAvKiBTaXplIG9mIFRyYWNlIEJ1ZmZlciA1ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlidWZmNl9hZGRyWzB4MDAwMjBdOyAgIC8qIEFkZHJlc3MgaW4gZmlybXdhcmUgYXJlYSBvZiBUcmFjZSBCdWZmZXIgNiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjZfc2l6ZVsweDAwMDIwXTsgICAvKiBTaXplIG9mIFRyYWNlIEJ1ZmZlciA2ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlidWZmN19hZGRyWzB4MDAwMjBdOyAgIC8qIEFkZHJlc3MgaW4gZmlybXdhcmUgYXJlYSBvZiBUcmFjZSBCdWZmZXIgNyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjdfc2l6ZVsweDAwMDIwXTsgICAvKiBTaXplIG9mIFRyYWNlIEJ1ZmZlciA3ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDQwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFVzZXIgQWNjZXNzIFJlZ2lvbiAqLworCitzdHJ1Y3QgYXJiZWxwcm1fdWFyX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHN0cnVjdCBhcmJlbHBybV9yZF9zZW5kX2Rvb3JiZWxsX3N0CXJkX3NlbmRfZG9vcmJlbGw7LyogUmVsaWFibGUgRGF0YWdyYW0gc2VuZCBkb29yYmVsbCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fc2VuZF9kb29yYmVsbF9zdAlzZW5kX2Rvb3JiZWxsOy8qIFNlbmQgZG9vcmJlbGwgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2NxX2NtZF9kb29yYmVsbF9zdAljcV9jb21tYW5kX2Rvb3JiZWxsOy8qIENRIERvb3JiZWxsICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwM2VjMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFJlY2VpdmUgZG9vcmJlbGwgKi8KKworc3RydWN0IGFyYmVscHJtX3JlY2VpdmVfZG9vcmJlbGxfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJd3FlX2NvdW50ZXJbMHgwMDAxMF07ICAvKiBNb2R1bG8tNjRLIGNvdW50ZXIgb2YgV1FFcyBwb3N0ZWQgb24gdGhpcyBxdWV1ZSBzaW5jZSBpdHMgY3JlYXRpb24uIFNob3VsZCBiZSB6ZXJvIGZvciB0aGUgZmlyc3QgZG9vcmJlbGwgb24gdGhlIFFQICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDA1XTsKKyAgICBwc2V1ZG9fYml0X3QJc3JxWzB4MDAwMDFdOyAgICAgICAgICAvKiBJZiBzZXQsIHRoaXMgaXMgYSBTaGFyZWQgUmVjZWl2ZSBRdWV1ZSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXFwblsweDAwMDE4XTsgICAgICAgICAgLyogUVAgbnVtYmVyIG9yIFNSUSBudW1iZXIgdGhpcyBkb29yYmVsbCBpcyBydW5nIG9uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFNFVF9JQiBQYXJhbWV0ZXJzICovCisKK3N0cnVjdCBhcmJlbHBybV9zZXRfaWJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJxa1sweDAwMDAxXTsgICAgICAgICAgLyogUmVzZXQgUUtleSBWaW9sYXRpb24gQ291bnRlciAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAxMV07CisgICAgcHNldWRvX2JpdF90CXNpZ1sweDAwMDAxXTsgICAgICAgICAgLyogU2V0IFN5c3RlbSBJbWFnZSBHVUlEIHRvIHN5c3RlbV9pbWFnZV9ndWlkIHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1faW1hZ2VfZ3VpZCBhbmQgc2lnIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBwb3J0cy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMGRdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY2FwYWJpbGl0eV9tYXNrWzB4MDAwMjBdOy8qIFBvcnRJbmZvIENhcGFiaWxpdHkgTWFzayAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3lzdGVtX2ltYWdlX2d1aWRfaFsweDAwMDIwXTsvKiBTeXN0ZW0gSW1hZ2UgR1VJRFs2MzozMl0sIHRha2VzIGVmZmVjdCBvbmx5IGlmIHRoZSBTSUcgYml0IGlzIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgdGhlIHNhbWUgZm9yIGJvdGggcG9ydHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzeXN0ZW1faW1hZ2VfZ3VpZF9sWzB4MDAwMjBdOy8qIFN5c3RlbSBJbWFnZSBHVUlEWzMxOjBdLCB0YWtlcyBlZmZlY3Qgb25seSBpZiB0aGUgU0lHIGJpdCBpcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHRoZSBzYW1lIGZvciBib3RoIHBvcnRzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAxODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyICovCisKK3N0cnVjdCBhcmJlbHBybV9tZ21fZW50cnlfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA2XTsKKyAgICBwc2V1ZG9fYml0X3QJbmV4dF9naWRfaW5kZXhbMHgwMDAxYV07LyogSW5kZXggb2YgbmV4dCBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyIHdob3NlIEdJRCBtYXBzIHRvIHNhbWUgTUdJRF9IQVNIIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5kZXggaXMgaW50byB0aGUgTXVsdGljYXN0IEdyb3VwIFRhYmxlLCB3aGljaCBpcyB0aGUgY29tcHJpc2VkIHRoZSBNR0hUIGFuZCBBTUdNIHRhYmxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2dpZF9pbmRleD0wIG1lYW5zIGVuZCBvZiB0aGUgY2hhaW4uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDA2MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltZ2lkXzEyOF85NlsweDAwMDIwXTsgIC8qIE11bHRpY2FzdCBncm91cCBHSURbMTI4Ojk2XSBpbiBiaWcgZW5kaWFuIGZvcm1hdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIFJlc2VydmVkIEdJRCAwOjA6MDowOjA6MDowOjAgZm9yIGFuIGludmFsaWQgZW50cnkuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltZ2lkXzk1XzY0WzB4MDAwMjBdOyAgIC8qIE11bHRpY2FzdCBncm91cCBHSURbOTU6NjRdIGluIGJpZyBlbmRpYW4gZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgUmVzZXJ2ZWQgR0lEIDA6MDowOjA6MDowOjA6MCBmb3IgYW4gaW52YWxpZCBlbnRyeS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1naWRfNjNfMzJbMHgwMDAyMF07ICAgLyogTXVsdGljYXN0IGdyb3VwIEdJRFs2MzozMl0gaW4gYmlnIGVuZGlhbiBmb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBSZXNlcnZlZCBHSUQgMDowOjA6MDowOjA6MDowIGZvciBhbiBpbnZhbGlkIGVudHJ5LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWdpZF8zMV8wWzB4MDAwMjBdOyAgICAvKiBNdWx0aWNhc3QgZ3JvdXAgR0lEWzMxOjBdIGluIGJpZyBlbmRpYW4gZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgUmVzZXJ2ZWQgR0lEIDA6MDowOjA6MDowOjA6MCBmb3IgYW4gaW52YWxpZCBlbnRyeS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX21nbXFwX3N0CW1nbXFwXzA7ICAgLyogTXVsdGljYXN0IEdyb3VwIE1lbWJlciBRUCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fbWdtcXBfc3QJbWdtcXBfMTsgICAvKiBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyIFFQICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9tZ21xcF9zdAltZ21xcF8yOyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX21nbXFwX3N0CW1nbXFwXzM7ICAgLyogTXVsdGljYXN0IEdyb3VwIE1lbWJlciBRUCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fbWdtcXBfc3QJbWdtcXBfNDsgICAvKiBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyIFFQICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9tZ21xcF9zdAltZ21xcF81OyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX21nbXFwX3N0CW1nbXFwXzY7ICAgLyogTXVsdGljYXN0IEdyb3VwIE1lbWJlciBRUCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fbWdtcXBfc3QJbWdtcXBfNzsgICAvKiBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyIFFQICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIElOSVRfSUIgUGFyYW1ldGVycyAqLworCitzdHJ1Y3QgYXJiZWxwcm1faW5pdF9pYl9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAl2bF9jYXBbMHgwMDAwNF07ICAgICAgIC8qIE1heGltdW0gVkxzIHN1cHBvcnRlZCBvbiB0aGUgcG9ydCwgZXhjbHVkaW5nIFZMMTUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWwgdmFsdWVzIGFyZSAxLDIsNCBhbmQgOC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcG9ydF93aWR0aF9jYXBbMHgwMDAwNF07LyogSUIgUG9ydCBXaWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAtIDF4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgIC0gMXgsIDR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgLSAxeCwgNHggb3IgMTJ4IChtdXN0IG5vdCBiZSB1c2VkIGluIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAtIFJlc2VydmVkICovCisgICAgcHNldWRvX2JpdF90CW10dV9jYXBbMHgwMDAwNF07ICAgICAgLyogTWF4aW11bSBNVFUgU3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwIC0gUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEgLSAyNTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIgLSA1MTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMgLSAxMDI0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0IC0gMjA0OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NSAtIDB4RiBSZXNlcnZlZCAqLworICAgIHBzZXVkb19iaXRfdAlnMFsweDAwMDAxXTsgICAgICAgICAgIC8qIFNldCBwb3J0IEdVSUQwIHRvIEdVSUQwIHNwZWNpZmllZCAqLworICAgIHBzZXVkb19iaXRfdAluZ1sweDAwMDAxXTsgICAgICAgICAgIC8qIFNldCBub2RlIEdVSUQgdG8gbm9kZV9ndWlkIHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlX2d1aWQgYW5kIG5nIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBwb3J0cy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJc2lnWzB4MDAwMDFdOyAgICAgICAgICAvKiBTZXQgU3lzdGVtIEltYWdlIEdVSUQgdG8gc3lzdGVtX2ltYWdlX2d1aWQgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9pbWFnZV9ndWlkIGFuZCBzaWcgbXVzdCBiZSB0aGUgc2FtZSBmb3IgYWxsIHBvcnRzLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwZF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfZ2lkWzB4MDAwMTBdOyAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIEdJRHMgZm9yIHRoZSBwb3J0ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1heF9wa2V5WzB4MDAwMTBdOyAgICAgLyogTWF4aW11bSBwa2V5cyBmb3IgdGhlIHBvcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSB0aGUgc2FtZSBmb3IgYm90aCBwb3J0cy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZ3VpZDBfaFsweDAwMDIwXTsgICAgICAvKiBFVUktNjQgR1VJRCBhc3NpZ25lZCBieSB0aGUgbWFudWZhY3R1cmVyLCB0YWtlcyBlZmZlY3Qgb25seSBpZiB0aGUgRzAgYml0IGlzIHNldCAoYml0cyA2MzozMikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWd1aWQwX2xbMHgwMDAyMF07ICAgICAgLyogRVVJLTY0IEdVSUQgYXNzaWduZWQgYnkgdGhlIG1hbnVmYWN0dXJlciwgdGFrZXMgZWZmZWN0IG9ubHkgaWYgdGhlIEcwIGJpdCBpcyBzZXQgKGJpdHMgMzE6MCkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW5vZGVfZ3VpZF9oWzB4MDAwMjBdOyAgLyogTm9kZSBHVUlEWzYzOjMyXSwgdGFrZXMgZWZmZWN0IG9ubHkgaWYgdGhlIE5HIGJpdCBpcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHRoZSBzYW1lIGZvciBib3RoIHBvcnRzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbm9kZV9ndWlkX2xbMHgwMDAyMF07ICAvKiBOb2RlIEdVSURbMzE6MF0sIHRha2VzIGVmZmVjdCBvbmx5IGlmIHRoZSBORyBiaXQgaXMgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSB0aGUgc2FtZSBmb3IgYm90aCBwb3J0cy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN5c3RlbV9pbWFnZV9ndWlkX2hbMHgwMDAyMF07LyogU3lzdGVtIEltYWdlIEdVSURbNjM6MzJdLCB0YWtlcyBlZmZlY3Qgb25seSBpZiB0aGUgU0lHIGJpdCBpcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHRoZSBzYW1lIGZvciBib3RoIHBvcnRzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3lzdGVtX2ltYWdlX2d1aWRfbFsweDAwMDIwXTsvKiBTeXN0ZW0gSW1hZ2UgR1VJRFszMTowXSwgdGFrZXMgZWZmZWN0IG9ubHkgaWYgdGhlIFNJRyBiaXQgaXMgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSB0aGUgc2FtZSBmb3IgYm90aCBwb3J0cy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwNmMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogUXVlcnkgRGV2aWNlIExpbWl0YXRpb25zICovCisKK3N0cnVjdCBhcmJlbHBybV9xdWVyeV9kZXZfbGltX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDA4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X3FwWzB4MDAwMDVdOyAgIC8qIExvZzIgb2YgdGhlIE1heGltdW0gbnVtYmVyIG9mIFFQcyBzdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAlsb2cyX3JzdmRfcXBzWzB4MDAwMDRdOy8qIExvZyAoYmFzZSAyKSBvZiB0aGUgbnVtYmVyIG9mIFFQcyByZXNlcnZlZCBmb3IgZmlybXdhcmUgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlc2VydmVkIHJlc291cmNlcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIDJebG9nMl9yc3ZkX3Fwcy0xICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9xcF9zelsweDAwMDA4XTsvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgV1FFcyBhbGxvd2VkIG9uIHRoZSBSUSBvciB0aGUgU1EgaXMgMl5sb2dfbWF4X3FwX3N6LTEgKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9zcnFfc3pbMHgwMDAwOF07LyogVGhlIG1heGltdW0gbnVtYmVyIG9mIFdRRXMgYWxsb3dlZCBvbiB0aGUgU1JRIGlzIDJebG9nX21heF9zcnFfc3otMSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9lZVsweDAwMDA1XTsgICAvKiBMb2cyIG9mIHRoZSBNYXhpbXVtIG51bWJlciBvZiBFRSBjb250ZXh0cyBzdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAlsb2cyX3JzdmRfZWVzWzB4MDAwMDRdOy8qIExvZyAoYmFzZSAyKSBvZiB0aGUgbnVtYmVyIG9mIEVFQ3MgcmVzZXJ2ZWQgZm9yIGZpcm13YXJlIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXNlcnZlZCByZXNvdXJjZXMgYXJlIG51bWJlcmVkIGZyb20gMCB0byAyXmxvZzJfcnN2ZF9lZXMtMSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfc3Jxc1sweDAwMDA1XTsgLyogTG9nIGJhc2UgMiBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgU1JRcyBzdXBwb3J0ZWQsIHZhbGlkIG9ubHkgaWYgU1JRIGJpdCBpcyBzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDA3XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nMl9yc3ZkX3NycXNbMHgwMDAwNF07LyogTG9nIChiYXNlIDIpIG9mIHRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgU1JRcyBmb3IgZmlybXdhcmUgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlc2VydmVkIHJlc291cmNlcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIDJebG9nMl9yc3ZkX3NycXMtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgaWYgdGhlIFNSUSBiaXQgaXMgc2V0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9jcVsweDAwMDA1XTsgICAvKiBMb2cyIG9mIHRoZSBNYXhpbXVtIG51bWJlciBvZiBDUXMgc3VwcG9ydGVkICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nMl9yc3ZkX2Nxc1sweDAwMDA0XTsvKiBMb2cgKGJhc2UgMikgb2YgdGhlIG51bWJlciBvZiBDUXMgcmVzZXJ2ZWQgZm9yIGZpcm13YXJlIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXNlcnZlZCByZXNvdXJjZXMgYXJlIG51bWJlcmVkIGZyb20gMCB0byAyXmxvZzJfcnNydmRfY3FzLTEgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X2NxX3N6WzB4MDAwMDhdOy8qIExvZzIgb2YgdGhlIE1heGltdW0gQ1FFcyBhbGxvd2VkIGluIGEgQ1EgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9lcVsweDAwMDAzXTsgICAvKiBMb2cyIG9mIHRoZSBNYXhpbXVtIG51bWJlciBvZiBFUXMgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAludW1fcnN2ZF9lcXNbMHgwMDAwNF07IC8qIFRoZSBudW1iZXIgb2YgRVFzIHJlc2VydmVkIGZvciBmaXJtd2FyZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVzZXJ2ZWQgcmVzb3VyY2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8gbnVtX3JzdmRfZXFzLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiAwIC0gbm8gcmVzb3VyY2VzIGFyZSByZXNlcnZlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMFsweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9tcHRzWzB4MDAwMDZdOyAvKiBMb2cgKGJhc2UgMikgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIE1QVCBlbnRyaWVzICh0aGUgbnVtYmVyIG9mIFJlZ2lvbnMvV2luZG93cykgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMVsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9lcV9zelsweDAwMDA4XTsvKiBMb2cyIG9mIHRoZSBNYXhpbXVtIEVRRXMgYWxsb3dlZCBpbiBhIEVRICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X210dHNbMHgwMDAwNl07IC8qIExvZzIgb2YgdGhlIE1heGltdW0gbnVtYmVyIG9mIE1UVCBlbnRyaWVzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTJbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWxvZzJfcnN2ZF9tcndzWzB4MDAwMDRdOy8qIExvZyAoYmFzZSAyKSBvZiB0aGUgbnVtYmVyIG9mIE1QVHMgcmVzZXJ2ZWQgZm9yIGZpcm13YXJlIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXNlcnZlZCByZXNvdXJjZXMgYXJlIG51bWJlcmVkIGZyb20gMCB0byAyXmxvZzJfcnN2ZF9tcndzLTEgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxM1sweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9tcndfc3pbMHgwMDAwOF07LyogTG9nMiBvZiB0aGUgTWF4aW11bSBTaXplIG9mIE1lbW9yeSBSZWdpb24vV2luZG93ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTRbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CWxvZzJfcnN2ZF9tdHRzWzB4MDAwMDRdOy8qIExvZyAoYmFzZSAyKSBvZiB0aGUgbnVtYmVyIG9mIE1UVCBlbnRyaWVzIHJlc2VydmVkIGZvciBmaXJtd2FyZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVzZXJ2ZWQgcmVzb3VyY2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8gMl5sb2cyX3JzdmRfbXR0cy0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9yYV9yZXNfcXBbMHgwMDAwNl07LyogTG9nMiBvZiB0aGUgTWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgUkRNQSByZWFkL0F0b21pYyBwZXIgUVAgYXMgYSByZXNwb25kZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNlsweDAwMDBhXTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9yYV9yZXFfcXBbMHgwMDAwNl07LyogTG9nMiBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgUkRNQSByZWFkL0F0b21pYyBwZXIgUVAgYXMgYSByZXF1ZXN0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxN1sweDAwMDBhXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfcmFfcmVzX2dsb2JhbFsweDAwMDA2XTsvKiBMb2cyIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiBSRE1BIHJlYWQvYXRvbWljIG9wZXJhdGlvbnMgdGhlIEhDQSByZXNwb25kZXIgY2FuIHN1cHBvcnQgZ2xvYmFsbHkuIFRoYXQgaW1wbGllcyB0aGUgUkRCIHRhYmxlIHNpemUuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMThbMHgwMDAxNl07CisgICAgcHNldWRvX2JpdF90CWxvZzJfcnN2ZF9yZGJzWzB4MDAwMDRdOy8qIExvZyAoYmFzZSAyKSBvZiB0aGUgbnVtYmVyIG9mIFJEQiBlbnRyaWVzIHJlc2VydmVkIGZvciBmaXJtd2FyZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVzZXJ2ZWQgcmVzb3VyY2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8gMl5sb2cyX3JzdmRfcmRicy0xICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyc3pfc3JxWzB4MDAwMDFdOyAgICAgIC8qIEFiaWxpdHkgdG8gbW9kaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBXUnMgcGVyIFNSUS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxOVsweDAwMDFmXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW51bV9wb3J0c1sweDAwMDA0XTsgICAgLyogTnVtYmVyIG9mIElCIHBvcnRzLiAqLworICAgIHBzZXVkb19iaXRfdAltYXhfdmxbMHgwMDAwNF07ICAgICAgIC8qIE1heGltdW0gVkxzIHN1cHBvcnRlZCBvbiBlYWNoIHBvcnQsIGV4Y2x1ZGluZyBWTDE1ICovCisgICAgcHNldWRvX2JpdF90CW1heF9wb3J0X3dpZHRoWzB4MDAwMDRdOy8qIElCIFBvcnQgV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgLSAxeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAtIDF4LCA0eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExIC0gMXgsIDR4IG9yIDEyeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLSBSZXNlcnZlZCAqLworICAgIHBzZXVkb19iaXRfdAltYXhfbXR1WzB4MDAwMDRdOyAgICAgIC8qIE1heGltdW0gTVRVIFN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCAtIFJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxIC0gMjU2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyIC0gNTEyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzIC0gMTAyNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NCAtIDIwNDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUgLSAweEYgUmVzZXJ2ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9jYWxfY2FfYWNrX2RlbGF5WzB4MDAwMDVdOy8qIFRoZSBMb2NhbCBDQSBBQ0sgRGVsYXkuIFRoaXMgaXMgdGhlIHZhbHVlIHJlY29tbWVuZGVkIHRvIGJlIHJldHVybmVkIGluIFF1ZXJ5IEhDQSB2ZXJiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWxheSB2YWx1ZSBpbiBtaWNyb3NlY29uZHMgaXMgY29tcHV0ZWQgdXNpbmcgNC4wOTZ1cyAqIDJeKGxvY2FsX2NhX2Fja19kZWxheSkuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjBbMHgwMDAwYl07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X2dpZFsweDAwMDA0XTsgIC8qIExvZzIgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIEdJRHMgcGVyIHBvcnQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyMVsweDAwMDFjXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfcGtleVsweDAwMDA0XTsgLyogTG9nMiBvZiB0aGUgbWF4IFBLZXkgVGFibGUgU2l6ZSAocGVyIElCIHBvcnQpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjJbMHgwMDAwY107CisgICAgcHNldWRvX2JpdF90CXN0YXRfcmF0ZV9zdXBwb3J0WzB4MDAwMTBdOy8qIGJpdCBtYXNrIG9mIHN0YXQgcmF0ZSBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCAtIGZ1bGwgYncKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMSAtIDEvNCBidworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAyIC0gMS84IGJ3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDMgLSAxLzIgYnc7ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmNbMHgwMDAwMV07ICAgICAgICAgICAvKiBSQyBUcmFuc3BvcnQgc3VwcG9ydGVkICovCisgICAgcHNldWRvX2JpdF90CXVjWzB4MDAwMDFdOyAgICAgICAgICAgLyogVUMgVHJhbnNwb3J0IFN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAl1ZFsweDAwMDAxXTsgICAgICAgICAgIC8qIFVEIFRyYW5zcG9ydCBTdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmRbMHgwMDAwMV07ICAgICAgICAgICAvKiBSRCBUcmFuc3BvcnQgU3VwcG9ydGVkICovCisgICAgcHNldWRvX2JpdF90CXJhd19pcHY2WzB4MDAwMDFdOyAgICAgLyogUmF3IElQdjYgVHJhbnNwb3J0IFN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlyYXdfZXRoZXJbMHgwMDAwMV07ICAgIC8qIFJhdyBFdGhlcnR5cGUgVHJhbnNwb3J0IFN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlzcnFbMHgwMDAwMV07ICAgICAgICAgIC8qIFNSUSBpcyBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBwc2V1ZG9fYml0X3QJaXBvX2liX2NoZWNrc3VtWzB4MDAwMDFdOy8qIElQIG92ZXIgSUIgY2hlY2tzdW0gaXMgc3VwcG9ydGVkICovCisgICAgcHNldWRvX2JpdF90CXBrdlsweDAwMDAxXTsgICAgICAgICAgLyogUEtleSBWaW9sYXRpb24gQ291bnRlciBTdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcWt2WzB4MDAwMDFdOyAgICAgICAgICAvKiBRS2V5IFZpb2xhdGlvbiBDb3V0bmVyIFN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI0WzB4MDAwMDZdOworICAgIHBzZXVkb19iaXRfdAltd1sweDAwMDAxXTsgICAgICAgICAgIC8qIE1lbW9yeSB3aW5kb3dzIHN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlhcG1bMHgwMDAwMV07ICAgICAgICAgIC8qIEF1dG9tYXRpYyBQYXRoIE1pZ3JhdGlvbiBTdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJYXRtWzB4MDAwMDFdOyAgICAgICAgICAvKiBBdG9taWMgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgKGF0b21pY2l0eSBpcyBndWFyYW50ZWVkIGJldHdlZW4gUVBzIG9uIHRoaXMgSENBKSAqLworICAgIHBzZXVkb19iaXRfdAlybVsweDAwMDAxXTsgICAgICAgICAgIC8qIFJhdyBNdWx0aWNhc3QgU3VwcG9ydGVkICovCisgICAgcHNldWRvX2JpdF90CWF2cFsweDAwMDAxXTsgICAgICAgICAgLyogQWRkcmVzcyBWZWN0b3IgUG9ydCBjaGVja2luZyBzdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJdWRtWzB4MDAwMDFdOyAgICAgICAgICAvKiBVRCBNdWx0aWNhc3QgU3VwcG9ydGVkICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjVbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXBnWzB4MDAwMDFdOyAgICAgICAgICAgLyogUGFnaW5nIG9uIGRlbWFuZCBzdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJclsweDAwMDAxXTsgICAgICAgICAgICAvKiBSb3V0ZXIgbW9kZSBzdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyNlsweDAwMDA2XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19wZ19zelsweDAwMDA4XTsgICAgLyogTWluaW11bSBzeXN0ZW0gcGFnZSBzaXplIHN1cHBvcnRlZCAobG9nMikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHByb3BlciBvcGVyYXRpb24gaXQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIGhvc3RpbmcgcGxhdGZvcm0gKENQVSkgbWluaW11bSBwYWdlIHNpemUuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjdbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXVhcl9zelsweDAwMDA2XTsgICAgICAgLyogVUFSIEFyZWEgU2l6ZSA9IDFNQiAqIDJedWFyX3N6ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjhbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CW51bV9yc3ZkX3VhcnNbMHgwMDAwNF07LyogVGhlIG51bWJlciBvZiBVQVJzIHJlc2VydmVkIGZvciBmaXJtd2FyZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVzZXJ2ZWQgcmVzb3VyY2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8gbnVtX3Jlc2VydmVkX3VhcnMtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBVQVIgbnVtYmVyIG51bV9yZXNlcnZlZF91YXJzIGlzIGFsd2F5cyBmb3IgdGhlIGtlcm5lbC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfZGVzY19zel9zcVsweDAwMDEwXTsvKiBNYXggZGVzY3JpcHRvciBzaXplIGluIGJ5dGVzIGZvciB0aGUgc2VuZCBxdWV1ZSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfc2dfc3FbMHgwMDAwOF07ICAgIC8qIFRoZSBtYXhpbXVtIFMvRyBsaXN0IGVsZW1lbnRzIGluIGEgU1EgV1FFIChtYXhfZGVzY19zei8xNiAtIDMpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzBbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfZGVzY19zel9ycVsweDAwMDEwXTsvKiBNYXggZGVzY3JpcHRvciBzaXplIGluIGJ5dGVzIGZvciB0aGUgcmVjZWl2ZSBxdWV1ZSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfc2dfcnFbMHgwMDAwOF07ICAgIC8qIFRoZSBtYXhpbXVtIFMvRyBsaXN0IGVsZW1lbnRzIGluIGEgUlEgV1FFIChtYXhfZGVzY19zei8xNiAtIDMpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDMyWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9tY2dbMHgwMDAwOF07ICAvKiBMb2cyIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgZ3JvdXBzICovCisgICAgcHNldWRvX2JpdF90CW51bV9yc3ZkX21jZ3NbMHgwMDAwNF07LyogVGhlIG51bWJlciBvZiBNR01zIHJlc2VydmVkIGZvciBmaXJtd2FyZSB1c2UgaW4gdGhlIE1HSFQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlc2VydmVkIHJlc291cmNlcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIG51bV9yZXNlcnZlZF9tY2dzLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiAwIC0gbm8gcmVzb3VyY2VzIGFyZSByZXNlcnZlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzM1sweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9xcF9tY2dbMHgwMDAwOF07LyogTG9nMiBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgUVBzIHBlciBtdWx0aWNhc3QgZ3JvdXAgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzNFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfcmRkc1sweDAwMDA2XTsgLyogTG9nMiBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgUkREcyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM1WzB4MDAwMDZdOworICAgIHBzZXVkb19iaXRfdAludW1fcnN2ZF9yZGRzWzB4MDAwMDRdOy8qIFRoZSBudW1iZXIgb2YgUkREcyByZXNlcnZlZCBmb3IgZmlybXdhcmUgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlc2VydmVkIHJlc291cmNlcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIG51bV9yZXNlcnZlZF9yZGRzLTEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgMCAtIG5vIHJlc291cmNlcyBhcmUgcmVzZXJ2ZWQuICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfcGRbMHgwMDAwNl07ICAgLyogTG9nMiBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgUERzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzZbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CW51bV9yc3ZkX3Bkc1sweDAwMDA0XTsgLyogVGhlIG51bWJlciBvZiBQRHMgcmVzZXJ2ZWQgZm9yIGZpcm13YXJlIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXNlcnZlZCByZXNvdXJjZXMgYXJlIG51bWJlcmVkIGZyb20gMCB0byBudW1fcmVzZXJ2ZWRfcGRzLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiAwIC0gbm8gcmVzb3VyY2VzIGFyZSByZXNlcnZlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzdbMHgwMDBjMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlxcGNfZW50cnlfc3pbMHgwMDAxMF07IC8qIFFQQyBFbnRyeSBTaXplIGZvciB0aGUgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBJbmZpbmlIb3N0LUlJSS1FWCBNVDI1MjA4IGVudHJ5IHNpemUgaXMgMjU2IGJ5dGVzICovCisgICAgcHNldWRvX2JpdF90CWVlY19lbnRyeV9zelsweDAwMDEwXTsgLyogRUVDIEVudHJ5IFNpemUgZm9yIHRoZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDggZW50cnkgc2l6ZSBpcyAyNTYgYnl0ZXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxcGNfZW50cnlfc3pbMHgwMDAxMF07LyogRXh0ZW5kZWQgUVBDIGVudHJ5IHNpemUgZm9yIHRoZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDggZW50cnkgc2l6ZSBpcyAzMiBieXRlcyAqLworICAgIHBzZXVkb19iaXRfdAllZWVjX2VudHJ5X3N6WzB4MDAwMTBdOy8qIEV4dGVuZGVkIEVFQyBlbnRyeSBzaXplIGZvciB0aGUgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBJbmZpbmlIb3N0LUlJSS1FWCBNVDI1MjA4IGVudHJ5IHNpemUgaXMgMzIgYnl0ZXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNxY19lbnRyeV9zelsweDAwMDEwXTsgLyogQ1FDIGVudHJ5IHNpemUgZm9yIHRoZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDggZW50cnkgc2l6ZSBpcyA2NCBieXRlcyAqLworICAgIHBzZXVkb19iaXRfdAllcWNfZW50cnlfc3pbMHgwMDAxMF07IC8qIEVRIGNvbnRleHQgZW50cnkgc2l6ZSBmb3IgdGhlIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgSW5maW5pSG9zdC1JSUktRVggTVQyNTIwOCBlbnRyeSBzaXplIGlzIDY0IGJ5dGVzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl1YXJfc2NyYXRjaF9lbnRyeV9zelsweDAwMDEwXTsvKiBVQVIgU2NyYXRjaHBhZCBFbnRyeSBTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBJbmZpbmlIb3N0LUlJSS1FWCBNVDI1MjA4IGVudHJ5IHNpemUgaXMgMzIgYnl0ZXMgKi8KKyAgICBwc2V1ZG9fYml0X3QJc3JxX2VudHJ5X3N6WzB4MDAwMTBdOyAvKiBTUlEgY29udGV4dCBlbnRyeSBzaXplIGZvciB0aGUgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBJbmZpbmlIb3N0LUlJSS1FWCBNVDI1MjA4IGVudHJ5IHNpemUgaXMgMzIgYnl0ZXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1wdF9lbnRyeV9zelsweDAwMDEwXTsgLyogTVBUIGVudHJ5IHNpemUgaW4gQnl0ZXMgZm9yIHRoZSBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBJbmZpbmlIb3N0LUlJSS1FWCBNVDI1MjA4IGVudHJ5IHNpemUgaXMgNjQgYnl0ZXMgKi8KKyAgICBwc2V1ZG9fYml0X3QJbXR0X2VudHJ5X3N6WzB4MDAwMTBdOyAvKiBNVFQgZW50cnkgc2l6ZSBpbiBCeXRlcyBmb3IgdGhlIGRldmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDggZW50cnkgc2l6ZSBpcyA4IGJ5dGVzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlibW1lWzB4MDAwMDFdOyAgICAgICAgIC8qIEJhc2UgTWVtb3J5IE1hbmFnZW1lbnQgRXh0ZW5zaW9uIFN1cHBvcnQgKi8KKyAgICBwc2V1ZG9fYml0X3QJd2luX3R5cGVbMHgwMDAwMV07ICAgICAvKiBCb3VuZCBUeXBlIDIgTWVtb3J5IFdpbmRvdyBBc3NvY2lhdGlvbiBtZWNoYW5pc206CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIFR5cGUgMkEgLSBRUCBOdW1iZXIgQXNzb2NpYXRpb247IG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIFR5cGUgMkIgLSBRUCBOdW1iZXIgYW5kIFBEIEFzc29jaWF0aW9uLiAqLworICAgIHBzZXVkb19iaXRfdAltcHNbMHgwMDAwMV07ICAgICAgICAgIC8qIEFiaWxpdHkgb2YgdGhpcyBIQ0EgdG8gc3VwcG9ydCBtdWx0aXBsZSBwYWdlIHNpemVzIHBlciBNZW1vcnkgUmVnaW9uLiAqLworICAgIHBzZXVkb19iaXRfdAlibFsweDAwMDAxXTsgICAgICAgICAgIC8qIEFiaWxpdHkgb2YgdGhpcyBIQ0EgdG8gc3VwcG9ydCBCbG9jayBMaXN0IFBoeXNpY2FsIEJ1ZmZlciBMaXN0cy4gKFRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydHMgQmxvY2sgTGlzdCkgKi8KKyAgICBwc2V1ZG9fYml0X3QJemJbMHgwMDAwMV07ICAgICAgICAgICAvKiBaZXJvIEJhc2VkIHJlZ2lvbi93aW5kb3dzIHN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlsaWZbMHgwMDAwMV07ICAgICAgICAgIC8qIEFiaWxpdHkgb2YgdGhpcyBIQ0EgdG8gc3VwcG9ydCBMb2NhbCBJbnZhbGlkYXRlIEZlbmNpbmcuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzhbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWxvZ19wYmxfc3pbMHgwMDAwNl07ICAgLyogTG9nMiBvZiB0aGUgTWF4aW11bSBQaHlzaWNhbCBCdWZmZXIgTGlzdCBzaXplIGluIEJ5dGVzIHN1cHBvcnRlZCBieSB0aGlzIEhDQSB3aGVuIGludm9raW5nIHRoZSBBbGxvY2F0ZSBMX0tleSB2ZXJiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM5WzB4MDAwMTJdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZF9sa2V5WzB4MDAwMjBdOyAgICAvKiBUaGUgdmFsdWUgb2YgdGhlIHJlc2VydmVkIExrZXkgZm9yIEJhc2UgTWVtb3J5IE1hbmFnZW1lbnQgRXh0ZW5zaW9uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsYW1yWzB4MDAwMDFdOyAgICAgICAgIC8qIFdoZW4gc2V0IHRoZSBkZXZpY2UgcmVxdWlyZXMgbG9jYWwgYXR0YWNoZWQgbWVtb3J5IGluIG9yZGVyIHRvIG9wZXJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBzZXQsICBJQ00gcGFnZXMsIEZpcm13YXJlIEFyZWEgYW5kIElDTSBhdXhpbGlhcnkgcGFnZXMgbXVzdCBiZSBhbGxvY2F0ZWQgaW4gdGhlIGxvY2FsIGF0dGFjaGVkIG1lbW9yeS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0MFsweDAwMDFmXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1heF9pY21fc2l6ZV9oWzB4MDAwMjBdOy8qIEJpdHMgWzYzOjMyXSBvZiBtYXhpbXVtIElDTSBzaXplIEluZmluaUhvc3QgSUlJIEV4IHN1cHBvcnQgaW4gYnl0ZXMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfaWNtX3NpemVfbFsweDAwMDIwXTsvKiBCaXRzIFszMTowXSBvZiBtYXhpbXVtIElDTSBzaXplIEluZmluaUhvc3QgSUlJIEV4IHN1cHBvcnQgaW4gYnl0ZXMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQxWzB4MDAyYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBRVUVSWV9BREFQVEVSIFBhcmFtZXRlcnMgQmxvY2sgKi8KKworc3RydWN0IGFyYmVscHJtX3F1ZXJ5X2FkYXB0ZXJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDE4XTsKKyAgICBwc2V1ZG9fYml0X3QJaW50YXBpblsweDAwMDA4XTsgICAgICAvKiBEcml2ZXIgc2hvdWxkIHNldCB0aGlzIGZpZWxkIHRvIElOVFIgdmFsdWUgaW4gdGhlIGV2ZW50IHF1ZXVlIGluIG9yZGVyIHRvIGdldCBFeHByZXNzIGludGVycnVwdCBtZXNzYWdlcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDYwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3ZzZF9zdAl2c2Q7CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFFVRVJZX0ZXIFBhcmFtZXRlcnMgQmxvY2sgKi8KKworc3RydWN0IGFyYmVscHJtX3F1ZXJ5X2Z3X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlmd19yZXZfbWFqb3JbMHgwMDAxMF07IC8qIEZpcm13YXJlIFJldmlzaW9uIC0gTWFqb3IgKi8KKyAgICBwc2V1ZG9fYml0X3QJZndfcGFnZXNbMHgwMDAxMF07ICAgICAvKiBBbW91bnQgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBmb3IgRlcgdXNhZ2UgaXMgaW4gNEtCeXRlIHBhZ2VzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZndfcmV2X21pbm9yWzB4MDAwMTBdOyAvKiBGaXJtd2FyZSBSZXZpc2lvbiAtIE1pbm9yICovCisgICAgcHNldWRvX2JpdF90CWZ3X3Jldl9zdWJtaW5vclsweDAwMDEwXTsvKiBGaXJtd2FyZSBTdWItbWlub3IgdmVyc2lvbiAoUGF0Y2ggbGV2ZWwpLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY21kX2ludGVyZmFjZV9yZXZbMHgwMDAxMF07LyogQ29tbWFuZCBJbnRlcmZhY2UgSW50ZXJwcmV0ZXIgUmV2aXNpb24gSUQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMGVdOworICAgIHBzZXVkb19iaXRfdAl3cWVfaF9tb2RlWzB4MDAwMDFdOyAgIC8qIEhlcm1vbiBtb2RlLiBJZiAnMScsIHRoZW4gV1FFIGFuZCBBViBmb3JtYXQgaXMgdGhlIGFkdmFuY2VkIGZvcm1hdCAqLworICAgIHBzZXVkb19iaXRfdAl6Yl93cV9jcVsweDAwMDAxXTsgICAgIC8qIElmICcxJywgdGhlbiBaQiBtb2RlIG9mIFdRIGFuZCBDUSBhcmUgZW5hYmxlZCAoaS5lLiByZWFsIE1lbWZyZWUgUFJNIGlzIHN1cHBvcnRlZCkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfb3V0c3RhbmRpbmdfY21kWzB4MDAwMDhdOy8qIExvZzIgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbW1hbmRzIHRoZSBIQ1IgY2FuIHN1cHBvcnQgc2ltdWx0YW5lb3VzbHkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMTddOworICAgIHBzZXVkb19iaXRfdAlkdFsweDAwMDAxXTsgICAgICAgICAgIC8qIERlYnVnIFRyYWNlIFN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gRGVidWcgdHJhY2UgaXMgbm90IHN1cHBvcnRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gRGVidWcgdHJhY2UgaXMgc3VwcG9ydGVkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbWRfaW50ZXJmYWNlX2RiWzB4MDAwMDFdOy8qIFNldCBpZiB0aGUgZGV2aWNlIGFjY2VwdHMgY29tbWFuZHMgYnkgbWVhbnMgb2Ygc3BlY2lhbCBkb29yYmVsbHMgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMWZdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY2xyX2ludF9iYXNlX2FkZHJfaFsweDAwMDIwXTsvKiBCaXRzIFs2MzozMl0gb2YgQ2xlYXIgaW50ZXJydXB0IHJlZ2lzdGVyIHBoeXNpY2FsIGFkZHJlc3MuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50cyB0byA2NCBiaXQgcmVnaXN0ZXIuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbHJfaW50X2Jhc2VfYWRkcl9sWzB4MDAwMjBdOy8qIEJpdHMgWzMxOjBdIG9mIENsZWFyIGludGVycnVwdCByZWdpc3RlciBwaHlzaWNhbCBhZGRyZXNzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludHMgdG8gNjQgYml0IHJlZ2lzdGVyLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXJyb3JfYnVmX3N0YXJ0X2hbMHgwMDAyMF07LyogUmVhZCBPbmx5IGJ1ZmZlciBmb3IgY2F0YXN0cm9waGljIGVycm9yIHJlcG9ydHMgKHBoeXNpY2FsIGFkZHJlc3MpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcnJvcl9idWZfc3RhcnRfbFsweDAwMDIwXTsvKiBSZWFkIE9ubHkgYnVmZmVyIGZvciBjYXRhc3Ryb3BoaWMgZXJyb3IgcmVwb3J0cyAocGh5c2ljYWwgYWRkcmVzcykgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVycm9yX2J1Zl9zaXplWzB4MDAwMjBdOy8qIFNpemUgaW4gd29yZHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxX2FybV9iYXNlX2FkZHJfaFsweDAwMDIwXTsvKiBCaXRzIFs2MzozMl0gb2YgRVEgQXJtIERCcyBwaHlzaWNhbCBhZGRyZXNzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludHMgdG8gNjQgYml0IHJlZ2lzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgYml0IHggaW4gdGhlIG9mZnNldCwgYXJtcyBFUSBudW1iZXIgeC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxX2FybV9iYXNlX2FkZHJfbFsweDAwMDIwXTsvKiBCaXRzIFszMTowXSBvZiBFUSBBcm0gREJzIHBoeXNpY2FsIGFkZHJlc3MuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50cyB0byA2NCBiaXQgcmVnaXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyBiaXQgeCBpbiB0aGUgb2Zmc2V0LCBhcm1zIEVRIG51bWJlciB4LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXFfc2V0X2NpX2Jhc2VfYWRkcl9oWzB4MDAwMjBdOy8qIEJpdHMgWzYzOjMyXSBvZiBFUSBTZXQgQ0kgREJzIFRhYmxlIHBoeXNpY2FsIGFkZHJlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRzIHRvIGEgdGhlIEVRIFNldCBDSSBEQnMgVGFibGUgYmFzZSBhZGRyZXNzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXFfc2V0X2NpX2Jhc2VfYWRkcl9sWzB4MDAwMjBdOy8qIEJpdHMgWzMxOjBdIG9mIEVRIFNldCBDSSBEQnMgVGFibGUgcGh5c2ljYWwgYWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludHMgdG8gYSB0aGUgRVEgU2V0IENJIERCcyBUYWJsZSBiYXNlIGFkZHJlc3MuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbWRfZGJfZHcxWzB4MDAwMTBdOyAgIC8qIG9mZnNldCBpbiBieXRlcyBmcm9tIGNtZF9kYl9hZGRyX2Jhc2Ugd2hlcmUgRFdvcmQgMSBvZiBhIENvbW1hbmQgSW50ZXJmYWNlIERvb3JiZWxsIHNob3VsZCBiZSB3cml0dGVuLiBWYWxpZCBvbmx5IGlmIENtZEludGVyZmFjZURiIGJpdCBpcyAnMScgKi8KKyAgICBwc2V1ZG9fYml0X3QJY21kX2RiX2R3MFsweDAwMDEwXTsgICAvKiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSBjbWRfZGJfYWRkcl9iYXNlIHdoZXJlIERXb3JkIDAgb2YgYSBDb21tYW5kIEludGVyZmFjZSBEb29yYmVsbCBzaG91bGQgYmUgd3JpdHRlbi4gVmFsaWQgb25seSBpZiBDbWRJbnRlcmZhY2VEYiBiaXQgaXMgJzEnICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbWRfZGJfZHczWzB4MDAwMTBdOyAgIC8qIG9mZnNldCBpbiBieXRlcyBmcm9tIGNtZF9kYl9hZGRyX2Jhc2Ugd2hlcmUgRFdvcmQgMyBvZiBhIENvbW1hbmQgSW50ZXJmYWNlIERvb3JiZWxsIHNob3VsZCBiZSB3cml0dGVuLiBWYWxpZCBvbmx5IGlmIENtZEludGVyZmFjZURiIGJpdCBpcyAnMScgKi8KKyAgICBwc2V1ZG9fYml0X3QJY21kX2RiX2R3MlsweDAwMDEwXTsgICAvKiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSBjbWRfZGJfYWRkcl9iYXNlIHdoZXJlIERXb3JkIDIgb2YgYSBDb21tYW5kIEludGVyZmFjZSBEb29yYmVsbCBzaG91bGQgYmUgd3JpdHRlbi4gVmFsaWQgb25seSBpZiBDbWRJbnRlcmZhY2VEYiBiaXQgaXMgJzEnICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbWRfZGJfZHc1WzB4MDAwMTBdOyAgIC8qIG9mZnNldCBpbiBieXRlcyBmcm9tIGNtZF9kYl9hZGRyX2Jhc2Ugd2hlcmUgRFdvcmQgNSBvZiBhIENvbW1hbmQgSW50ZXJmYWNlIERvb3JiZWxsIHNob3VsZCBiZSB3cml0dGVuLiBWYWxpZCBvbmx5IGlmIENtZEludGVyZmFjZURiIGJpdCBpcyAnMScgKi8KKyAgICBwc2V1ZG9fYml0X3QJY21kX2RiX2R3NFsweDAwMDEwXTsgICAvKiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSBjbWRfZGJfYWRkcl9iYXNlIHdoZXJlIERXb3JkIDQgb2YgYSBDb21tYW5kIEludGVyZmFjZSBEb29yYmVsbCBzaG91bGQgYmUgd3JpdHRlbi4gVmFsaWQgb25seSBpZiBDbWRJbnRlcmZhY2VEYiBiaXQgaXMgJzEnICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbWRfZGJfZHc3WzB4MDAwMTBdOyAgIC8qIG9mZnNldCBpbiBieXRlcyBmcm9tIGNtZF9kYl9hZGRyX2Jhc2Ugd2hlcmUgRFdvcmQgNyBvZiBhIENvbW1hbmQgSW50ZXJmYWNlIERvb3JiZWxsIHNob3VsZCBiZSB3cml0dGVuLiBWYWxpZCBvbmx5IGlmIENtZEludGVyZmFjZURiIGJpdCBpcyAnMScgKi8KKyAgICBwc2V1ZG9fYml0X3QJY21kX2RiX2R3NlsweDAwMDEwXTsgICAvKiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSBjbWRfZGJfYWRkcl9iYXNlIHdoZXJlIERXb3JkIDYgb2YgYSBDb21tYW5kIEludGVyZmFjZSBEb29yYmVsbCBzaG91bGQgYmUgd3JpdHRlbi4gVmFsaWQgb25seSBpZiBDbWRJbnRlcmZhY2VEYiBiaXQgaXMgJzEnICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbWRfZGJfYWRkcl9iYXNlX2hbMHgwMDAyMF07LyogSGlnaCBiaXRzIG9mIGNtZF9kYl9hZGRyX2Jhc2UsIHdoaWNoIGNtZF9kYl9kdyBvZmZzZXRzIHJlZmVyIHRvLiBWYWxpZCBvbmx5IGlmIENtZEludGVyZmFjZURiIGJpdCBpcyAnMScgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNtZF9kYl9hZGRyX2Jhc2VfbFsweDAwMDIwXTsvKiBMb3cgIGJpdHMgb2YgY21kX2RiX2FkZHJfYmFzZSwgd2hpY2ggY21kX2RiX2R3IG9mZnNldHMgcmVmZXIgdG8uIFZhbGlkIG9ubHkgaWYgQ21kSW50ZXJmYWNlRGIgYml0IGlzICcxJyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDA0YzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBBQ0NFU1NfTEFNICovCisKK3N0cnVjdCBhcmJlbHBybV9hY2Nlc3NfbGFtX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHN0cnVjdCBhcmJlbHBybV9hY2Nlc3NfbGFtX2luamVjdF9lcnJvcnNfc3QJYWNjZXNzX2xhbV9pbmplY3RfZXJyb3JzOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFTkFCTEVfTEFNIFBhcmFtZXRlcnMgQmxvY2sgKi8KKworc3RydWN0IGFyYmVscHJtX2VuYWJsZV9sYW1fc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWxhbV9zdGFydF9hZHJfaFsweDAwMDIwXTsvKiBMQU0gc3RhcnQgYWRkcmVzcyBbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsYW1fc3RhcnRfYWRyX2xbMHgwMDAyMF07LyogTEFNIHN0YXJ0IGFkZHJlc3MgWzMxOjBdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsYW1fZW5kX2Fkcl9oWzB4MDAwMjBdOy8qIExBTSBlbmQgYWRkcmVzcyBbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsYW1fZW5kX2Fkcl9sWzB4MDAwMjBdOy8qIExBTSBlbmQgYWRkcmVzcyBbMzE6MF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWRpWzB4MDAwMDJdOyAgICAgICAgICAgLyogRGF0YSBJbnRlZ3JpdHkgQ29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMCAtIG5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSAtIFBhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIC0gRUNDIERldGVjdGlvbiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgLSBFQ0MgV2l0aCBDb3JyZWN0aW9uICovCisgICAgcHNldWRvX2JpdF90CWFwWzB4MDAwMDJdOyAgICAgICAgICAgLyogQXV0byBQcmVjaGFyZ2UgTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwIC0gTm8gYXV0byBwcmVjaGFyZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSAtIEF1dG8gcHJlY2hhcmdlIHBlciB0cmFuc2FjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIC0gQXV0byBwcmVjaGFyZ2UgcGVyIDY0IGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgLSByZXNlcnZlZCAqLworICAgIHBzZXVkb19iaXRfdAlkaFsweDAwMDAxXTsgICAgICAgICAgIC8qIFdoZW4gc2V0LCBMQU0gaXMgSGlkZGVuIGFuZCBjYW4gbm90IGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gdGhlIFBDSSBidXMuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDFiXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMTYwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2RpbW1pbmZvX3N0CWRpbW0wOyAgLyogTG9naWNhbCBESU1NIDAgUGFyYW1ldGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fZGltbWluZm9fc3QJZGltbTE7ICAvKiBMb2dpY2FsIERJTU0gMSBQYXJhbWV0ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDQwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIE1lbW9yeSBBY2Nlc3MgUGFyYW1ldGVycyBmb3IgVUQgQWRkcmVzcyBWZWN0b3IgVGFibGUgKi8KKworc3RydWN0IGFyYmVscHJtX3VkYXZ0YWJsZV9tZW1vcnlfcGFyYW1ldGVyc19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbF9rZXlbMHgwMDAyMF07ICAgICAgICAvKiBMX0tleSB1c2VkIHRvIGFjY2VzcyBUUFQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBkWzB4MDAwMThdOyAgICAgICAgICAgLyogUEQgdXNlZCBieSBUUFQgZm9yIG1hdGNoaW5nIGFnYWluc3QgUEQgb2YgcmVnaW9uIGVudHJ5IGJlaW5nIGFjY2Vzc2VkLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CXhsYXRpb25fZW5bMHgwMDAwMV07ICAgLyogV2hlbiBjbGVhcmVkLCBhZGRyZXNzIGlzIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG5vIHRyYW5zbGF0aW9uIHdpbGwgYmUgZG9uZS4gV2hlbiBzZXQsIGFkZHJlc3MgaXMgdmlydHVhbC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDJdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBJTklUX0hDQSAmIFFVRVJZX0hDQSBQYXJhbWV0ZXJzIEJsb2NrICovCisKK3N0cnVjdCBhcmJlbHBybV9pbml0X2hjYV9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMTBdOworICAgIHBzZXVkb19iaXRfdAl0aW1lX3N0YW1wX2dyYW51bGFyaXR5WzB4MDAwMDhdOy8qIFRoaXMgZmllbGQgY29udHJvbHMgdGhlIGdyYW51bGFyaXR5IGluIHdoaWNoIENRRSBUaW1lc3RhbXAgY291bnRlciBpcyBpbmNyZW1lbnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVGltZVN0YW1wR3JhbnVsYXJpdHkgdW5pdHMgaXMgMS80IG9mIGEgbWljcm9zZWNvbmRzLiAoZS5nIGlzIFRpbWVTdGFtcEdyYW51bGFyaXR5IGlzIGNvbmZpZ3VyZWQgdG8gMHgyLCBDUUUgVGltZXN0YW1wIHdpbGwgYmUgaW5jcmVtZW50ZWQgZXZlcnkgb25lIG1pY3Jvc2Vjb25kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gc2V0cyB0byBaZXJvLCB0aW1lc3RhbXAgcmVwb3J0aW5nIGluIHRoZSBDUUUgaXMgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAloY2FfY29yZV9jbG9ja1sweDAwMDA4XTsvKiBJbnRlcm5hbCBDbG9jayBQZXJpb2QgKGluIHVuaXRzIG9mIDEvMTYgbnMpIChRVUVSWV9IQ0Egb25seSkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJcm91dGVyX3FwWzB4MDAwMTBdOyAgICAvKiBVcHBlciAxNiBiaXQgdG8gYmUgdXNlZCBhcyBhIFFQIG51bWJlciBmb3Igcm91dGVyIG1vZGUuIExvdyBvcmRlciA4IGJpdHMgYXJlIHRha2VuIGZyb20gdGhlIFRDbGFzcyBmaWVsZCBvZiB0aGUgaW5jb21pbmcgcGFja2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIG9ubHkgaWYgUkUgYml0IGlzIHNldCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAwN107CisgICAgcHNldWRvX2JpdF90CXJlWzB4MDAwMDFdOyAgICAgICAgICAgLyogUm91dGVyIE1vZGUgRW5hYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBiaXQgaXMgc2V0LCBlbnRpcmUgcGFja2V0IChpbmNsdWRpbmcgYWxsIGhlYWRlcnMgYW5kIElDUkMpIHdpbGwgYmUgY29uc2lkZXJlZCBhcyBhIGRhdGEgcGF5bG9hZCBhbmQgd2lsbCBiZSBzY2F0dGVyZWQgdG8gbWVtb3J5IGFzIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvciB0aGF0IGlzIHBvc3RlZCBvbiB0aGUgUVAgbWF0Y2hpbmcgdGhlIFRDbGFzcyBmaWVsZCBvZiBwYWNrZXQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl1ZHBbMHgwMDAwMV07ICAgICAgICAgIC8qIFVEIFBvcnQgQ2hlY2sgRW5hYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIFBvcnQgZmllbGQgaW4gQWRkcmVzcyBWZWN0b3IgaXMgaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBIQ0Egd2lsbCBjaGVjayB0aGUgcG9ydCBmaWVsZCBpbiBBViBlbnRyeSAoZmV0Y2hlZCBmb3IgVUQgZGVzY3JpcHRvcikgYWdhaW5zdCB0aGUgUG9ydCBvZiB0aGUgVUQgUVAgZXhlY3V0aW5nIHRoZSBkZXNjcmlwdG9yLiAqLworICAgIHBzZXVkb19iaXRfdAloZVsweDAwMDAxXTsgICAgICAgICAgIC8qIEhvc3QgRW5kaWFuZXNzIC0gVXNlZCBmb3IgQXRvbWljIE9wZXJhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gSG9zdCBpcyBMaXR0bGUgRW5kaWFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIEhvc3QgaXMgQmlnIGVuZGlhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CWNlWzB4MDAwMDFdOyAgICAgICAgICAgLyogQ2hlY2tzdW0gRW5hYmxlZCAtIHdoZW4gU2V0IElQb3ZlcklCIGNoZWNrc3VtIGdlbmVyYXRpb24gJiBjaGVja2luZyBpcyBlbmFibGVkICovCisgICAgcHNldWRvX2JpdF90CXNwaFsweDAwMDAxXTsgICAgICAgICAgLyogMCAtIFNXIGNhbGN1bGF0ZXMgVENQL1VEUCBQc2V1ZG8tSGVhZGVyIGNoZWNrc3VtIGFuZCBpbnNlcnRzIGl0IGludG8gdGhlIFRDUC9VRFAgY2hlY2tzdW0gZmllbGQgd2hlbiBzZW5kaW5nIGEgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIEhXIGNhbGN1bGF0ZXMgVENQL1VEUCBQc2V1ZG8tSGVhZGVyIGNoZWNrc3VtIHdoZW4gc2VuZGluZyBhIHBhY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlycGhbMHgwMDAwMV07ICAgICAgICAgIC8qIDAgLSBOb3QgSFcgY2FsY3VsYXRpb24gb2YgVENQL1VEUCBQc2V1ZG8tSGVhZGVyIGNoZWNrc3VtIGFyZSBkb25lIHdoZW4gcmVjZWl2aW5nIGEgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIEhXIGNhbGN1bGF0ZXMgVENQL1VEUCBQc2V1ZG8tSGVhZGVyIGNoZWNrc3VtIHdoZW4gcmVjZWl2aW5nIGEgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzcG9uZGVyX2V4dVsweDAwMDA0XTsvKiBJbmRpY2F0ZSB0aGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgZXhlY3V0aW9uIGVuZWdpbmVzIGFsbG9jYXRpb24gZGVkaWNhdGVkIGZvciByZXNwb25kZXIgdmVyc3VzIHRoZSBlbmdpbmVzIGRlZGljYXRlZCBmb3IgcmVxdmVzdGVyIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25kZXJfZXh1LzE2ID0gKG51bWJlciBvZiByZXNwb25kZXIgZXh1IGVuZ2luZXMpLyh0b3RhbCBudW1iZXIgb2YgZW5naW5lcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbCB2YWx1ZXMgYXJlIDB4MC0weEYuIDAgaXMgImF1dG8iLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDZbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CXdxZV9xdW90YVsweDAwMDBmXTsgICAgLyogTWF4aW11bSBudW1iZXIgb2YgV1FFcyB0aGF0IGFyZSBleGVjdXRlZCBwcmlvciB0byBwcmVlbXB0aW9uIG9mIGV4ZWN1dGlvbiB1bml0LiAwIC0gcmVzZXJ2ZWQuICovCisgICAgcHNldWRvX2JpdF90CXdxZV9xdW90YV9lblsweDAwMDAxXTsgLyogSWYgc2V0IC0gd3FlX3F1b3RhIGZpZWxkIGlzIHVzZWQuIElmIGNsZWFyZWQgLSBXUUUgcXVvdGEgaXMgc2V0IHRvICJhdXRvIiB2YWx1ZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fcXBjYmFzZWFkZHJfc3QJcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAxMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fbXVsdGljYXN0cGFyYW1fc3QJbXVsdGljYXN0X3BhcmFtZXRlcnM7CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDlbMHgwMDA4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV90cHRwYXJhbXNfc3QJdHB0X3BhcmFtZXRlcnM7CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEwWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fdWFyX3BhcmFtc19zdAl1YXJfcGFyYW1ldGVyczsvKiBVQVIgUGFyYW1ldGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMVsweDAwNjAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogRXZlbnQgUXVldWUgQ29udGV4dCBUYWJsZSBFbnRyeSAqLworCitzdHJ1Y3QgYXJiZWxwcm1fZXFjX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXN0WzB4MDAwMDRdOyAgICAgICAgICAgLyogRXZlbnQgZGVsaXZlcnkgc3RhdGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OSAtIEFybWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBIC0gRmlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEIgLSBBbHdheXNfQXJtZWQgKGF1dG8tcmVhcm0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgLSByZXNlcnZlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CW9pWzB4MDAwMDFdOyAgICAgICAgICAgLyogT2VycnVuIGlnbm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQsIEhXIHdpbGwgbm90IGNoZWNrIEVRIGZ1bGwgY29uZGl0aW9uIHdoZW4gd3JpdGluZyBuZXcgRVFFcy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJdHJbMHgwMDAwMV07ICAgICAgICAgICAvKiBUcmFuc2xhdGlvbiBSZXF1aXJlZC4gSWYgc2V0IC0gRVEgYWNjZXNzIHVuZGVyZ28gYWRkcmVzcyB0cmFuc2xhdGlvbi4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAlvd25lclsweDAwMDA0XTsgICAgICAgIC8qIDAgLSBTVyBvd25lcnNoaXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gSFcgb3duZXJzaGlwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgZm9yIHRoZSBRVUVSWV9FUSBhbmQgSFcyU1dfRVEgY29tbWFuZHMgb25seSAqLworICAgIHBzZXVkb19iaXRfdAlzdGF0dXNbMHgwMDAwNF07ICAgICAgIC8qIEVRIHN0YXR1czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMDAwIC0gT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDEwIC0gRVEgd3JpdGUgZmFpbHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIGZvciB0aGUgUVVFUllfRVEgYW5kIEhXMlNXX0VRIGNvbW1hbmRzIG9ubHkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN0YXJ0X2FkZHJlc3NfaFsweDAwMDIwXTsvKiBTdGFydCBBZGRyZXNzIG9mIEV2ZW50IFF1ZXVlWzYzOjMyXS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN0YXJ0X2FkZHJlc3NfbFsweDAwMDIwXTsvKiBTdGFydCBBZGRyZXNzIG9mIEV2ZW50IFF1ZXVlWzMxOjBdLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGFsaWduZWQgb24gMzItYnl0ZSBib3VuZGFyeSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMThdOworICAgIHBzZXVkb19iaXRfdAlsb2dfZXFfc2l6ZVsweDAwMDA1XTsgIC8qIEFtb3VudCBvZiBlbnRyaWVzIGluIHRoaXMgRVEgaXMgMl5sb2dfZXFfc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dfZXFfc2l6ZSBtdXN0IGJlIGJpZ2dlciB0aGFuIDEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bSBFUSBzaXplIGlzIDJeMTcgRVFFcyAobWF4IExvZ19lcV9zaXplIGlzIDE3KS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMDNdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJaW50clsweDAwMDA4XTsgICAgICAgICAvKiBJbnRlcnJ1cHQgKG1lc3NhZ2UpIHRvIGJlIGdlbmVyYXRlZCB0byByZXBvcnQgZXZlbnQgdG8gSU5UIGxheWVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwaWlpaWlpIC0gc2V0IHRvIElOVEEgZ2l2ZW4gaW4gUVVFUllfQURBUFRFUiBpbiBvcmRlciB0byBnZW5lcmF0ZSBJTlRBIG1lc3NhZ2VzIG9uIEV4cHJlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBqampqamogLSBzcGVjaWZpY2llcyB0eXBlIG9mIGludGVycnVwdCBtZXNzYWdlIHRvIGJlIGdlbmVyYXRlZCAodG90YWwgNjQgZGlmZmVyZW50IG1lc3NhZ2VzIHN1cHBvcnRlZCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpcyBub3QgcmVxdWlyZWQsIFNUIGZpZWxkIG11c3QgYmUgc2V0IHVwb24gY3JlYXRpb24gdG8gRmlyZWQgc3RhdGUuIE5vIEVRIGFybWluZyBkb29yYmVsbCBzaG91bGQgYmUgcGVyZm9ybWVkLiBJbiB0aGlzIGNhc2UgaGFyZHdhcmUgd2lsbCBub3QgZ2VuZXJhdGUgYW55IGludGVycnVwdC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwMThdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGRbMHgwMDAxOF07ICAgICAgICAgICAvKiBQRCB0byBiZSB1c2VkIHRvIGFjY2VzcyBFUSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDdbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsa2V5WzB4MDAwMjBdOyAgICAgICAgIC8qIE1lbW9yeSBrZXkgKEwtS2V5KSB0byBiZSB1c2VkIHRvIGFjY2VzcyBFUSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY29uc3VtZXJfaW5keFsweDAwMDIwXTsvKiBDb250YWlucyBuZXh0IGVudHJ5IHRvIGJlIHJlYWQgdXBvbiBwb2xsaW5nIHRoZSBldmVudCBxdWV1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGluaXRhbGl6ZWQgdG8gemVybyB3aGlsZSBvcGVuaW5nIEVRICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlwcm9kdWNlcl9pbmR4WzB4MDAwMjBdOy8qIENvbnRhaW5zIG5leHQgZW50cnkgaW4gRVEgdG8gYmUgd3JpdHRlbiBieSB0aGUgSENBLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgaW5pdGFsaXplZCB0byB6ZXJvIHdoaWxlIG9wZW5pbmcgRVEuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDlbMHgwMDA4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIE1lbW9yeSBUcmFuc2xhdGlvbiBUYWJsZSAoTVRUKSBFbnRyeSAqLworCitzdHJ1Y3QgYXJiZWxwcm1fbXR0X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlwdGFnX2hbMHgwMDAyMF07ICAgICAgIC8qIEhpZ2gtb3JkZXIgYml0cyBvZiBwaHlzaWNhbCB0YWcuIFRoZSBzaXplIG9mIHRoZSBmaWVsZCBkZXBlbmRzIG9uIHRoZSBwYWdlIHNpemUgb2YgdGhlIHJlZ2lvbi4gTWF4aW11bSBQVEFHIHNpemUgaXMgNTIgYml0cy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBbMHgwMDAwMV07ICAgICAgICAgICAgLyogUHJlc2VudCBiaXQuIElmIHNldCwgcGFnZSBlbnRyeSBpcyB2YWxpZC4gSWYgY2xlYXJlZCwgYWNjZXNzIHRvIHRoaXMgcGFnZSB3aWxsIGdlbmVyYXRlIG5vbi1wcmVzZW50IHBhZ2UgYWNjZXNzIGZhdWx0LiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwYl07CisgICAgcHNldWRvX2JpdF90CXB0YWdfbFsweDAwMDE0XTsgICAgICAgLyogTG93LW9yZGVyIGJpdHMgb2YgUGh5c2ljYWwgdGFnLiBUaGUgc2l6ZSBvZiB0aGUgZmllbGQgZGVwZW5kcyBvbiB0aGUgcGFnZSBzaXplIG9mIHRoZSByZWdpb24uIE1heGltdW0gUFRBRyBzaXplIGlzIDUyIGJpdHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIE1lbW9yeSBQcm90ZWN0aW9uIFRhYmxlIChNUFQpIEVudHJ5ICovCisKK3N0cnVjdCBhcmJlbHBybV9tcHRfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJcl93WzB4MDAwMDFdOyAgICAgICAgICAvKiBEZWZpbmVzIHdoZXRoZXIgdGhpcyBlbnRyeSBpcyBSZWdpb24gKDEpIG9yIFdpbmRvdyAoMCkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcGFbMHgwMDAwMV07ICAgICAgICAgICAvKiBQaHlzaWNhbCBhZGRyZXNzLiBJZiBzZXQsIG5vIHZpcnR1YWwtdG8tcGh5c2ljYWwgYWRkcmVzcyB0cmFuc2xhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBmb3IgdGhpcyByZWdpb24gKi8KKyAgICBwc2V1ZG9fYml0X3QJbHJbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgLSBsb2NhbCByZWFkIGFjY2VzcyBlbmFibGVkICovCisgICAgcHNldWRvX2JpdF90CWx3WzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0IC0gbG9jYWwgd3JpdGUgYWNjZXNzIGVuYWJsZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcnJbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgLSByZW1vdGUgcmVhZCBhY2Nlc3MgZW5hYmxlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcndbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgLSByZW1vdGUgd3JpdGUgYWNjZXNzIGVuYWJsZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJYVsweDAwMDAxXTsgICAgICAgICAgICAvKiBJZiBzZXQgLSByZW1vdGUgQXRvbWljIGFjY2VzcyBpcyBlbmFibGVkICovCisgICAgcHNldWRvX2JpdF90CWViWzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0IC0gQmluZCBpcyBlbmFibGVkLiBWYWxpZCBmb3IgcmVnaW9uIGVudHJ5IG9ubHkuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDBjXTsKKyAgICBwc2V1ZG9fYml0X3QJc3RhdHVzWzB4MDAwMDRdOyAgICAgICAvKiBSZWdpb24vV2luZG93IFN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RiAtIG5vdCB2YWxpZCAoU1cgb3duZXJzaGlwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MyAtIEZSRUUgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC0gSFcgb3duZXJzaGlwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5ib3VuZCBUeXBlIEkgd2luZG93cyBhcmUgZG9uZXRlZCByZWdfd25kX2xlbiBmaWVsZCBlcXVhbHMgemVyby4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmJvdW5kIFR5cGUgSUkgd2luZG93cyBhcmUgZG9uYXRlZCBieSBTdGF0dXM9RlJFRS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBhZ2Vfc2l6ZVsweDAwMDA1XTsgICAgLyogUGFnZSBzaXplIHVzZWQgZm9yIHRoZSByZWdpb24uIEFjdHVhbCBzaXplIGlzIFs0S10qMl5QYWdlX3NpemUgYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9zaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMjAuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJdHlwZVsweDAwMDAxXTsgICAgICAgICAvKiBBcHBsaWNhYmxlIGZvciB3aW5kb3dzIG9ubHksIG11c3QgYmUgemVybyBmb3IgcmVnaW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBUeXBlIG9uZSB3aW5kb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gVHlwZSB0d28gd2luZG93ICovCisgICAgcHNldWRvX2JpdF90CXFwblsweDAwMDE4XTsgICAgICAgICAgLyogUVAgbnVtYmVyIHRoaXMgTVcgaXMgYXR0YWNoZWQgdG8uIFZhbGlkIGZvciB0eXBlMiBtZW1vcnkgd2luZG93cyBhbmQgb24gUVVFUllfTVBUIG9ubHkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1lbV9rZXlbMHgwMDAyMF07ICAgICAgLyogVGhlIG1lbW9yeSBLZXkuIFRoZSBmaWVsZCBob2xkcyB0aGUgbWVtX2tleSBmaWVsZCBpbiB0aGUgZm9sbG93aW5nIHNlbWFudGljczoge2tleVs3OjBdLGtleVszMTo4XX0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlwZFsweDAwMDE4XTsgICAgICAgICAgIC8qIFByb3RlY3Rpb24gRG9tYWluICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJZWlbMHgwMDAwMV07ICAgICAgICAgICAvKiBFbmFibGUgSW52YWxpZGF0aW9uIC0gV2hlbiBzZXQsIExvY2FsL1JlbW90ZSBpbnZhbGlkYXRpb24gY2FuIGJlIGV4ZWN1dGVkIG9uIHRoaXMgd2luZG93L3JlZ2lvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBzZXQgZm9yIHR5cGUyIHdpbmRvd3MgYW5kIG5vbi1zaGFyZWQgcGh5c2ljYWwgbWVtb3J5IHJlZ2lvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBjbGVhciBmb3IgcmVnaW9ucyB0aGF0IGFyZSB1c2VkIHRvIGFjY2VzcyBXb3JrIFF1ZXVlcywgQ29tcGxldGlvbiBRdWV1ZXMgYW5kIEV2ZW50IFF1ZXVlcyAqLworICAgIHBzZXVkb19iaXRfdAl6YlsweDAwMDAxXTsgICAgICAgICAgIC8qIFdoZW4gc2V0LCB0aGlzIHJlZ2lvbiBpcyBaZXJvIEJhc2VkIFJlZ2lvbiAqLworICAgIHBzZXVkb19iaXRfdAlmcmVbMHgwMDAwMV07ICAgICAgICAgIC8qIFdoZW4gc2V0LCBGYXN0IFJlZ2lzdHJhdGlvbiBPcGVyYXRpb25zIGNhbiBiZSBleGVjdXRlZCBvbiB0aGlzIHJlZ2lvbiAqLworICAgIHBzZXVkb19iaXRfdAlyYWVbMHgwMDAwMV07ICAgICAgICAgIC8qIFdoZW4gc2V0LCByZW1vdGUgYWNjZXNzIGNhbiBiZSBlbmFibGVkIG9uIHRoaXMgcmVnaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgd2hlbiBleGVjdXRpbmcgRmFzdCBSZWdpc3RyYXRpb24gV29yayBSZXF1ZXN0IHRvIHZhbGlkYXRlIHRoYXQgcmVtb3RlIGFjY2VzcyByaWdodHMgY2FuIGJlIGdyYW50ZWQgdG8gdGhpcyBNUFQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBiaXQgaXMgY2xlYXJlZCwgRmFzdCBSZWdpc3RyYXRpb24gV29yayBSZXF1ZXN0IHJlcXVlc3RpbmcgcmVtb3RlIGFjY2VzcyByaWdodHMgd2lsbCBmYWlsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwM107CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzdGFydF9hZGRyZXNzX2hbMHgwMDAyMF07LyogU3RhcnQgQWRkcmVzc1s2MzozMl0gLSBWaXJ0dWFsIEFkZHJlc3Mgd2hlcmUgdGhpcyByZWdpb24vd2luZG93IHN0YXJ0cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhcnRfYWRkcmVzc19sWzB4MDAwMjBdOy8qIFN0YXJ0IEFkZHJlc3NbMzE6MF0gLSBWaXJ0dWFsIEFkZHJlc3Mgd2hlcmUgdGhpcyByZWdpb24vd2luZG93IHN0YXJ0cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVnX3duZF9sZW5faFsweDAwMDIwXTsvKiBSZWdpb24vV2luZG93IExlbmd0aFs2MzozMl0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlZ193bmRfbGVuX2xbMHgwMDAyMF07LyogUmVnaW9uL1dpbmRvdyBMZW5ndGhbMzE6MF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxrZXlbMHgwMDAyMF07ICAgICAgICAgLyogTXVzdCBiZSAwIGZvciBTVzJIV19NUFQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gUVVFUllfTVBUIGFuZCBIVzJTV19NUFQgY29tbWFuZHMgZm9yIE1lbW9yeSBXaW5kb3cgaXQgcmVmbGVjdHMgdGhlIExLZXkgb2YgdGhlIFJlZ2lvbiB0aGF0IHRoZSBXaW5kb3cgaXMgYm91bmQgdG8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpZWxkIGhvbGRzIHRoZSBsa2V5IGZpZWxkIGluIHRoZSBmb2xsb3dpbmcgc2VtYW50aWNzOiB7a2V5Wzc6MF0sa2V5WzMxOjhdfS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXdpbl9jbnRbMHgwMDAyMF07ICAgICAgLyogTnVtYmVyIG9mIHdpbmRvd3MgYm91bmQgdG8gdGhpcyByZWdpb24uIFZhbGlkIGZvciByZWdpb25zIG9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpZWxkIGlzIHZhbGlkIG9ubHkgZm9yIHRoZSBRVUVSWV9NUFQgYW5kIEhXMlNXX01QVCBjb21tYW5kcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF9hZHJfaFsweDAwMDA2XTsgICAgLyogQmFzZSAoZmlyc3QpIGFkZHJlc3Mgb2YgdGhlIE1UVCByZWxhdGl2ZSB0byBNVFQgYmFzZSBpbiB0aGUgSUNNICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMDFhXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkN1sweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJbXR0X2Fkcl9sWzB4MDAwMWRdOyAgICAvKiBCYXNlIChmaXJzdCkgYWRkcmVzcyBvZiB0aGUgTVRUIHJlbGF0aXZlIHRvIE1UVCBiYXNlIGFkZHJlc3MgaW4gdGhlIElDTS4gTXVzdCBiZSBhbGlnbmVkIG9uIDggYnl0ZXMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltdHRfc3pbMHgwMDAyMF07ICAgICAgIC8qIE51bWJlciBvZiBNVFQgZW50cmllcyBhbGxvY2F0ZWQgZm9yIHRoaXMgTVIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBGYXN0IFJlZ2lzdHJhdGlvbiBPcGVyYXRpb25zIGNhbiBub3QgYmUgZXhlY3V0ZWQgb24gdGhpcyByZWdpb24gKEZSRSBiaXQgaXMgemVybykgdGhpcyBmaWVsZCBpcyByZXNlcnZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIEZhc3QgUmVnaXN0cmF0aW9uIE9wZXJhdGlvbiBpcyBlbmFibGVkIChGUkUgYml0IGlzIHNldCkgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBNVFRzIGFsbG9jYXRlZCBmb3IgdGhpcyBNUi4gSWYgbXR0X3N6IHZhbHVlICBpcyB6ZXJvLCB0aGVyZSBpcyBubyBsaW1pdCBmb3IgdGhlIG51bWJlcnMgb2YgTVRUcyBhbmQgdGhlIEhDQSBkb2VzIG5vdCBjaGVjayB0aGlzIGZpZWxkIHdoZW4gZXhlY3V0aW5nIGZhc3QgcmVnaXN0ZXIgV1FFLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBDb21wbGV0aW9uIFF1ZXVlIENvbnRleHQgVGFibGUgRW50cnkgKi8KKworc3RydWN0IGFyYmVscHJtX2NvbXBsZXRpb25fcXVldWVfY29udGV4dF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlzdFsweDAwMDA0XTsgICAgICAgICAgIC8qIEV2ZW50IGRlbGl2ZXJ5IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAgLSByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OSAtIEFSTUVEIChSZXF1ZXN0IGZvciBOb3RpZmljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2IC0gQVJNRUQgU09MSUNJVEVEIChSZXF1ZXN0IFNvbGljaXRlZCBOb3RpZmljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBIC0gRklSRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciAtIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSAweDAgaW4gQ1EgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgZm9yIHRoZSBRVUVSWV9DUSBhbmQgSFcyU1dfQ1EgY29tbWFuZHMgb25seS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAlvaVsweDAwMDAxXTsgICAgICAgICAgIC8qIFdoZW4gc2V0LCBvdmVycnVuIGlnbm9yZSBpcyBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gc2V0LCBVcGRhdGVzIG9mIENRIGNvbnN1bWVyIGNvdW50ZXIgKHBvbGwgZm9yIGNvbXBsZXRpb24pIG9yIFJlcXVlc3QgY29tcGxldGlvbiBub3RpZmljYXRpb25zIChBcm0gQ1EpIGRvb3JiZWxscyBzaG91bGQgbm90IGJlIHJhbmcgb24gdGhhdCBDUS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMGFdOworICAgIHBzZXVkb19iaXRfdAlzdGF0dXNbMHgwMDAwNF07ICAgICAgIC8qIENRIHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDAgLSBPSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDEgLSBDUSBvdmVyZmxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTAgLSBDUSB3cml0ZSBmYWlsdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgZm9yIHRoZSBRVUVSWV9DUSBhbmQgSFcyU1dfQ1EgY29tbWFuZHMgb25seSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhcnRfYWRkcmVzc19oWzB4MDAwMjBdOy8qIFN0YXJ0IGFkZHJlc3Mgb2YgQ1FbNjM6MzJdLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGFsaWduZWQgb24gQ1FFIHNpemUgKDMyIGJ5dGVzKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhcnRfYWRkcmVzc19sWzB4MDAwMjBdOy8qIFN0YXJ0IGFkZHJlc3Mgb2YgQ1FbMzE6MF0uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgYWxpZ25lZCBvbiBDUUUgc2l6ZSAoMzIgYnl0ZXMpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl1c3JfcGFnZVsweDAwMDE4XTsgICAgIC8qIFVBUiBwYWdlIHRoaXMgQ1EgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggKHJpbmdpbmlnIENRIGRvb3JiZWxscykgKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX2NxX3NpemVbMHgwMDAwNV07ICAvKiBMb2cgKGJhc2UgMikgb2YgdGhlIENRIHNpemUgKGluIGVudHJpZXMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heGltdW0gQ1Egc2l6ZSBpcyAyXjE3IENRRXMgKG1heCBsb2dfY3Ffc2l6ZSBpcyAxNykgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMDNdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY19lcW5bMHgwMDAwOF07ICAgICAgICAvKiBFdmVudCBRdWV1ZSB0aGlzIENRIHJlcG9ydHMgY29tcGxldGlvbiBldmVudHMgdG8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgdmFsdWVzIGFyZSAwIHRvIDYzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgY29uZmlndXJlZCB0byB2YWx1ZSBvdGhlciB0aGFuIDAtNjMsIGNvbXBsZXRpb24gZXZlbnRzIHdpbGwgbm90IGJlIHJlcG9ydGVkIG9uIHRoZSBDUS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1WzB4MDAwMThdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGRbMHgwMDAxOF07ICAgICAgICAgICAvKiBQcm90ZWN0aW9uIERvbWFpbiB0byBiZSB1c2VkIHRvIGFjY2VzcyBDUS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHRoZSBzYW1lIFBEIG9mIHRoZSBDUSBMX0tleS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbF9rZXlbMHgwMDAyMF07ICAgICAgICAvKiBNZW1vcnkga2V5IChMX0tleSkgdG8gYmUgdXNlZCB0byBhY2Nlc3MgQ1EgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxhc3Rfbm90aWZpZWRfaW5keFsweDAwMDIwXTsvKiBNYWludGFpbmVkIGJ5IEhXLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIGZvciBRVUVSWV9DUSBhbmQgSFcyU1dfQ1EgY29tbWFuZHMgb25seS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNvbGljaXRfcHJvZHVjZXJfaW5keFsweDAwMDIwXTsvKiBNYWludGFpbmVkIGJ5IEhXLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIGZvciBRVUVSWV9DUSBhbmQgSFcyU1dfQ1EgY29tbWFuZHMgb25seS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljb25zdW1lcl9jb3VudGVyWzB4MDAwMjBdOy8qIENvbnN1bWVyIGNvdW50ZXIgaXMgYSAzMmJpdHMgY291bnRlciB0aGF0IGlzIGluY3JlbWVudGVkIGZvciBlYWNoIENRRSBwb29sZWQgZnJvbSB0aGUgQ1EuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSAweDAgaW4gQ1EgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgZm9yIHRoZSBRVUVSWV9DUSBhbmQgSFcyU1dfQ1EgY29tbWFuZHMgb25seS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXByb2R1Y2VyX2NvdW50ZXJbMHgwMDAyMF07LyogUHJvZHVjZXIgY291bnRlciBpcyBhIDMyYml0cyBjb3VudGVyIHRoYXQgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggQ1FFIHRoYXQgaXMgd3JpdHRlbiBieSB0aGUgSFcgdG8gdGhlIENRLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENRIG92ZXJydW4gaXMgcmVwb3J0ZWQgaWYgUHJvZHVjZXJfY291bnRlciArIDEgZXF1YWxzIHRvIENvbnN1bWVyX2NvdW50ZXIgYW5kIGEgQ1FFIG5lZWRzIHRvIGJlIGFkZGVkLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWludGFpbmVkIGJ5IEhXICh2YWxpZCBmb3IgdGhlIFFVRVJZX0NRIGFuZCBIVzJTV19DUSBjb21tYW5kcyBvbmx5KSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FuWzB4MDAwMThdOyAgICAgICAgICAvKiBDUSBudW1iZXIuIExlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIGNvbnN0cmFpbmVkIGJ5IHRoZSBwb3NpdGlvbiBvZiB0aGlzIENRIGluIENRQyB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIGZvciB0aGUgUVVFUllfQ1EgYW5kIEhXMlNXX0NRIGNvbW1hbmRzIG9ubHkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FfY2lfZGJfcmVjb3JkWzB4MDAwMjBdOy8qIEluZGV4IGluIHRoZSBVQVIgQ29udGV4dCBUYWJsZSBFbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVyB1c2VzIHRoaXMgaW5kZXggYXMgYW4gb2Zmc2V0IGZyb20gdGhlIFVBUiBDb250ZXh0IFRhYmxlIEVudHJ5IGluIG9yZGVyIHRvIHJlYWQgdGhpcyBDUSBDb25zdW1lciBDb3VudGVyIGRvb3JiZWxsIHJlY29yZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgSFcgaW4gdGhlIFFVRVJZX0NRIGNvbW1hbmQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljcV9zdGF0ZV9kYl9yZWNvcmRbMHgwMDAyMF07LyogSW5kZXggaW4gdGhlIFVBUiBDb250ZXh0IFRhYmxlIEVudHJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXIHVzZXMgdGhpcyBpbmRleCBhcyBhbiBvZmZzZXQgZnJvbSB0aGUgVUFSIENvbnRleHQgVGFibGUgRW50cnkgaW4gb3JkZXIgdG8gcmVhZCB0aGlzIENRIHN0YXRlIGRvb3JiZWxsIHJlY29yZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgSFcgaW4gdGhlIFFVRVJZX0NRIGNvbW1hbmQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDhbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEdQSU9fZXZlbnRfZGF0YSAqLworCitzdHJ1Y3QgYXJiZWxwcm1fZ3Bpb19ldmVudF9kYXRhX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDA2MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlncGlvX2V2ZW50X2hpWzB4MDAwMjBdOy8qIElmIGFueSBiaXQgaXMgc2V0IHRvIDEsIHRoZW4gYSByaXNpbmcvZmFsbGluZyBldmVudCBoYXMgb2NjdXJyZWQgb24gdGhlIGNvcnJzcG9uZGluZyBHUElPIHBpbi4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWdwaW9fZXZlbnRfbG9bMHgwMDAyMF07LyogSWYgYW55IGJpdCBpcyBzZXQgdG8gMSwgdGhlbiBhIHJpc2luZy9mYWxsaW5nIGV2ZW50IGhhcyBvY2N1cnJlZCBvbiB0aGUgY29ycnNwb25kaW5nIEdQSU8gcGluLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFdmVudF9kYXRhIEZpZWxkIC0gUVAvRUUgRXZlbnRzICovCisKK3N0cnVjdCBhcmJlbHBybV9xcF9lZV9ldmVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcXBuX2VlblsweDAwMDE4XTsgICAgICAvKiBRUC9FRS9TUlEgbnVtYmVyIGV2ZW50IGlzIHJlcG9ydGVkIGZvciAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAxY107CisgICAgcHNldWRvX2JpdF90CWVfcVsweDAwMDAxXTsgICAgICAgICAgLyogSWYgc2V0IC0gRUVOIGlmIGNsZWFyZWQgLSBRUCBpbiB0aGUgUVBOL0VFTiBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB2YWxpZCBvbiBTUlEgZXZlbnRzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDAzXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDYwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogSW5maW5pSG9zdC1JSUktRVggVHlwZTAgQ29uZmlndXJhdGlvbiBIZWFkZXIgKi8KKworc3RydWN0IGFyYmVscHJtX210MjUyMDhfdHlwZTBfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXZlbmRvcl9pZFsweDAwMDEwXTsgICAgLyogSGFyZHdpcmVkIHRvIDB4MTVCMyAqLworICAgIHBzZXVkb19iaXRfdAlkZXZpY2VfaWRbMHgwMDAxMF07ICAgIC8qIDI1MjA4IChkZWNpbWFsKSAtIEluZmluaUhvc3QtSUlJIGNvbXBhdGlibGUgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MjE4IChkZWNpbWFsKSAtIEluZmluaUhvc3QtSUlJIEVYIG1vZGUgKHRoZSBtb2RlIGRlc2NyaWJlZCBpbiB0aGlzIG1hbnVhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTIwOSAoZGVjaW1hbCkgLSBGbGFzaCBidXJuZXIgbW9kZSAtIHNlZSBGbGFzaCBidXJuaW5nIGFwcGxpY2F0aW9uIG5vdGUgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiB0aGlzIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNvbW1hbmRbMHgwMDAxMF07ICAgICAgLyogUENJIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhdHVzWzB4MDAwMTBdOyAgICAgICAvKiBQQ0kgU3RhdHVzIFJlZ2lzdGVyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXZpc2lvbl9pZFsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJY2xhc3NfY29kZV9oY2FfY2xhc3NfY29kZVsweDAwMDE4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNhY2hlX2xpbmVfc2l6ZVsweDAwMDA4XTsvKiBDYWNoZSBMaW5lIFNpemUgKi8KKyAgICBwc2V1ZG9fYml0X3QJbGF0ZW5jeV90aW1lclsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJaGVhZGVyX3R5cGVbMHgwMDAwOF07ICAvKiBoYXJkd2lyZWQgdG8gemVybyAqLworICAgIHBzZXVkb19iaXRfdAliaXN0WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYmFyMF9jdHJsWzB4MDAwMDRdOyAgICAvKiBoYXJkLXdpcmVkIHRvIDAxMDAgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMTBdOworICAgIHBzZXVkb19iaXRfdAliYXIwX2xbMHgwMDAwY107ICAgICAgIC8qIExvd2VyIGJpdHMgb2YgQkFSMCAoRGV2aWNlIENvbmZpZ3VyYXRpb24gU3BhY2UpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAliYXIwX2hbMHgwMDAyMF07ICAgICAgIC8qIFVwcGVyIDMyIGJpdHMgb2YgQkFSMCAoRGV2aWNlIENvbmZpZ3VyYXRpb24gU3BhY2UpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAliYXIxX2N0cmxbMHgwMDAwNF07ICAgIC8qIEhhcmR3aXJlZCB0byAxMTAwICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJYmFyMV9sWzB4MDAwMGNdOyAgICAgICAvKiBMb3dlciBiaXRzIG9mIEJBUjEgKFVzZXIgQWNjZXNzIFJlZ2lvbiAtIFVBUiAtIHNwYWNlKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYmFyMV9oWzB4MDAwMjBdOyAgICAgICAvKiB1cHBlciAzMiBiaXRzIG9mIEJBUjEgKFVzZXIgQWNjZXNzIFJlZ2lvbiAtIFVBUiAtIHNwYWNlKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYmFyMl9jdHJsWzB4MDAwMDRdOyAgICAvKiBIYXJkd2lyZWQgdG8gMTEwMCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAxMF07CisgICAgcHNldWRvX2JpdF90CWJhcjJfbFsweDAwMDBjXTsgICAgICAgLyogTG93ZXIgYml0cyBvZiBCQVIyIC0gTG9jYWwgQXR0YWNoZWQgTWVtb3J5IGlmIHByZXNlbnQgYW5kIGVuYWJsZWQuIEVsc2UgemVyb2VkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYmFyMl9oWzB4MDAwMjBdOyAgICAgICAvKiBVcHBlciAzMiBiaXRzIG9mIEJBUjIgLSBMb2NhbCBBdHRhY2hlZCBNZW1vcnkgaWYgcHJlc2VudCBhbmQgZW5hYmxlZC4gRWxzZSB6ZXJvZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljYXJkYnVzX2Npc19wb2ludGVyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3Vic3lzdGVtX3ZlbmRvcl9pZFsweDAwMDEwXTsvKiBTcGVjaWZpZWQgYnkgdGhlIGRldmljZSBOVk1FTSBjb25maWd1cmF0aW9uICovCisgICAgcHNldWRvX2JpdF90CXN1YnN5c3RlbV9pZFsweDAwMDEwXTsgLyogU3BlY2lmaWVkIGJ5IHRoZSBkZXZpY2UgTlZNRU0gY29uZmlndXJhdGlvbiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXhwYW5zaW9uX3JvbV9lbmFibGVbMHgwMDAwMV07LyogRXhwYW5zaW9uIFJPTSBFbmFibGUuIEhhcmR3aXJlZCB0byAwIGlmIGV4cGFuc2lvbiBST00gaXMgZGlzYWJsZWQgaW4gdGhlIGRldmljZSBOVk1FTSBjb25maWd1cmF0aW9uLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAwYV07CisgICAgcHNldWRvX2JpdF90CWV4cGFuc2lvbl9yb21fYmFzZV9hZGRyZXNzWzB4MDAwMTVdOy8qIEV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzICh1cHBlciAyMSBiaXQpLiBIYXJkd2lyZWQgdG8gMCBpZiBleHBhbnNpb24gUk9NIGlzIGRpc2FibGVkIGluIHRoZSBkZXZpY2UgTlZNRU0gY29uZmlndXJhdGlvbi4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNhcGFiaWxpdGllc19wb2ludGVyWzB4MDAwMDhdOy8qIFNwZWNpZmllZCBieSB0aGUgZGV2aWNlIE5WTUVNIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMThdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJaW50ZXJydXB0X2xpbmVbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CWludGVycnVwdF9waW5bMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CW1pbl9nbnRbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CW1heF9sYXRlbmN5WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAxMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXNpX2NhcF9pZFsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJbXNpX25leHRfY2FwX3B0clsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJbXNpX2VuWzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAltdWx0aXBsZV9tc2dfY2FwWzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAltdWx0aXBsZV9tc2dfZW5bMHgwMDAwM107CisgICAgcHNldWRvX2JpdF90CWNhcF82NF9iaXRfYWRkclsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXNnX2FkZHJfbFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1zZ19hZGRyX2hbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltc2dfZGF0YVsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAwMTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcG1fY2FwX2lkWzB4MDAwMDhdOyAgICAvKiBQb3dlciBtYW5hZ2VtZW50IGNhcGFiaWxpdHkgSUQgLSAwMWggKi8KKyAgICBwc2V1ZG9fYml0X3QJcG1fbmV4dF9jYXBfcHRyWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlwbV9jYXBbMHgwMDAxMF07ICAgICAgIC8qIFsyOjBdIFZlcnNpb24gLSAwMmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbM10gUE1FIGNsb2NrIC0gMGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNF0gUnN2UAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs1XSBEZXZpY2Ugc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gLSAwaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs4OjZdIEFVWCBjdXJyZW50IC0gMGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOV0gRDEgc3VwcG9ydCAtIDBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwXSBEMiBzdXBwb3J0IC0gMGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTU6MTFdIFBNRSBzdXBwb3J0IC0gMGggKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBtX3N0YXR1c19jb250cm9sWzB4MDAwMTBdOy8qIFsxNDoxM10gLSBEYXRhIHNjYWxlIC0gMGggKi8KKyAgICBwc2V1ZG9fYml0X3QJcG1fY29udHJvbF9zdGF0dXNfYnJkZ19leHRbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CWRhdGFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEwWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnBkX2NhcF9pZFsweDAwMDA4XTsgICAvKiAwM2ggKi8KKyAgICBwc2V1ZG9fYml0X3QJdnBkX25leHRfY2FwX2lkWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAl2cGRfYWRkcmVzc1sweDAwMDBmXTsKKyAgICBwc2V1ZG9fYml0X3QJZlsweDAwMDAxXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZwZF9kYXRhWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMVsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBjaWV4X2NhcF9pZFsweDAwMDA4XTsgLyogUENJLUV4cHJlc3MgY2FwYWJpbGl0eSBJRCAtIDEwaCAqLworICAgIHBzZXVkb19iaXRfdAlwY2lleF9uZXh0X2NhcF9wdHJbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXBjaWV4X2NhcFsweDAwMDEwXTsgICAgLyogWzM6MF0gQ2FwYWJpbGl0eSB2ZXJzaW9uIC0gMWgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNzo0XSBEZXZpY2UvUG9ydCBUeXBlIC0gMGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOF0gU2xvdCBpbXBsZW1lbnRlZCAtIDBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEzOjldIEludGVycnVwdCBtZXNzYWdlIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGV2aWNlX2NhcFsweDAwMDIwXTsgICAvKiBbMjowXSBNYXhfUGF5bG9hZF9TaXplIHN1cHBvcnRlZCAtIDJoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzQ6M10gUGhhbnRvbSBGdW5jdGlvbiBzdXBwb3J0ZWQgLSAwaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs1XSBFeHRlbmRlZCBUYWcgRmlsZWQgc3VwcG9ydGVkIC0gMGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbODo2XSBFbmRwb2ludCBMMHMgQWNjZXB0YWJsZSBMYXRlbmN5IC0gVEJECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzExOjldIEVuZHBvaW50IEwxIEFjY2VwdGFibGUgTGF0ZW5jeSAtIFRCRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMl0gQXR0ZW50aW9uIEJ1dHRvbiBQcmVzZW50IC0gY29uZmlndXJlZCB0aHJvdWdoIEluZmluaUJ1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTNdIEF0dGVudGlvbiBJbmRpY2F0b3IgUHJlc2VudCAtIGNvbmZpZ3VyZWQgdGhyb3VnaCBJbmZpbmlCdXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE0XSBQb3dlciBJbmRpY2F0b3IgUHJlc2VudCAtIGNvbmZpZ3VyZWQgdGhyb3VnaCBJbmZpbmlCdXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzI1OjE4XSBDYXB0dXJlZCBTbG90IFBvd2VyIExpbWl0IFZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzI3OjI2XSBDYXB0dXJlZCBTbG90IFBvd2VyIExpbWl0IFNjYWxlICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlkZXZpY2VfY29udHJvbFsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJZGV2aWNlX3N0YXR1c1sweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxpbmtfY2FwWzB4MDAwMjBdOyAgICAgLyogWzM6MF0gTWF4aW11bSBMaW5rIFNwZWVkIC0gMWgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOTo0XSBNYXhpbXVtIExpbmsgV2lkdGggLSA4aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMToxMF0gQWN0aXZlIFN0YXRlIFBvd2VyIE1hbmFnZW1lbnQgU3VwcG9ydCAtIDNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE0OjEyXSBMMHMgRXhpdCBMYXRlbmN5IC0gVEJECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE3OjE1XSBMMSBFeGl0IExhdGVuY3kgLSBUQkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMzE6MjRdIFBvcnQgTnVtYmVyIC0gMGggKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxpbmtfY29udHJvbFsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJbGlua19zdGF0dXNbMHgwMDAxMF07ICAvKiBbMzowXSBMaW5rIFNwZWVkIC0gMWgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOTo0XSBOZWdvdGlhdGVkIExpbmsgV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTJdIFNsb3QgY2xvY2sgY29uZmlndXJhdGlvbiAtIDFoICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEyWzB4MDAyNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYWR2YW5jZWRfZXJyb3JfcmVwb3J0aW5nX2NhcF9pZFsweDAwMDEwXTsvKiAwMDAxaC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJY2FwYWJpbGl0eV92ZXJzaW9uWzB4MDAwMDRdOy8qIDFoICovCisgICAgcHNldWRvX2JpdF90CW5leHRfY2FwYWJpbGl0eV9vZmZzZXRbMHgwMDAwY107LyogMGggKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXVuY29ycmVjdGFibGVfZXJyb3Jfc3RhdHVzX3JlZ2lzdGVyWzB4MDAwMjBdOy8qIDAgVHJhaW5pbmcgRXJyb3IgU3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCBEYXRhIExpbmsgUHJvdG9jb2wgRXJyb3IgU3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgUG9pc29uZWQgVExQIFN0YXR1cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyBGbG93IENvbnRyb2wgUHJvdG9jb2wgRXJyb3IgU3RhdHVzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0IENvbXBsZXRpb24gVGltZW91dCBTdGF0dXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUgQ29tcGxldGVyIEFib3J0IFN0YXR1cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiBVbmV4cGVjdGVkIENvbXBsZXRpb24gU3RhdHVzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3IFJlY2VpdmVyIE92ZXJmbG93IFN0YXR1cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCBNYWxmb3JtZWQgVExQIFN0YXR1cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSBFQ1JDIEVycm9yIFN0YXR1cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCBVbnN1cHBvcnRlZCBSZXF1ZXN0IEVycm9yIFN0YXR1cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdW5jb3JyZWN0YWJsZV9lcnJvcl9tYXNrX3JlZ2lzdGVyWzB4MDAwMjBdOy8qIDAgVHJhaW5pbmcgRXJyb3IgTWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgRGF0YSBMaW5rIFByb3RvY29sIEVycm9yIE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBQb2lzb25lZCBUTFAgTWFzayAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyBGbG93IENvbnRyb2wgUHJvdG9jb2wgRXJyb3IgTWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0IENvbXBsZXRpb24gVGltZW91dCBNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUgQ29tcGxldGVyIEFib3J0IE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiBVbmV4cGVjdGVkIENvbXBsZXRpb24gTWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3IFJlY2VpdmVyIE92ZXJmbG93IE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCBNYWxmb3JtZWQgVExQIE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSBFQ1JDIEVycm9yIE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCBVbnN1cHBvcnRlZCBSZXF1ZXN0IEVycm9yIE1hc2sgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXVuY29ycmVjdGFibGVfc2V2ZXJpdHlfbWFza19yZWdpc3RlclsweDAwMDIwXTsvKiAwIFRyYWluaW5nIEVycm9yIFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCBEYXRhIExpbmsgUHJvdG9jb2wgRXJyb3IgU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBQb2lzb25lZCBUTFAgU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyBGbG93IENvbnRyb2wgUHJvdG9jb2wgRXJyb3IgU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCBDb21wbGV0aW9uIFRpbWVvdXQgU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSBDb21wbGV0ZXIgQWJvcnQgU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiBVbmV4cGVjdGVkIENvbXBsZXRpb24gU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyBSZWNlaXZlciBPdmVyZmxvdyBTZXZlcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4IE1hbGZvcm1lZCBUTFAgU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSBFQ1JDIEVycm9yIFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgVW5zdXBwb3J0ZWQgUmVxdWVzdCBFcnJvciBTZXZlcml0eSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY29ycmVjdGFibGVfZXJyb3Jfc3RhdHVzX3JlZ2lzdGVyWzB4MDAwMjBdOy8qIDAgUmVjZWl2ZXIgRXJyb3IgU3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiBCYWQgVExQIFN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgQmFkIERMTFAgU3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCBSRVBMQVlfTlVNIFJvbGxvdmVyIFN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIFJlcGxheSBUaW1lciBUaW1lb3V0IFN0YXR1cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY29ycmVjdGFibGVfZXJyb3JfbWFza19yZWdpc3RlclsweDAwMDIwXTsvKiAwIFJlY2VpdmVyIEVycm9yIE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IEJhZCBUTFAgTWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgQmFkIERMTFAgTWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggUkVQTEFZX05VTSBSb2xsb3ZlciBNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgUmVwbGF5IFRpbWVyIFRpbWVvdXQgTWFzayAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYWR2YW5jZV9lcnJvcl9jYXBhYmlsaXRpZXNfYW5kX2NvbnRyb2xfcmVnaXN0ZXJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9oZWFkZXJfbG9nX3JlZ2lzdGVyX3N0CWhlYWRlcl9sb2dfcmVnaXN0ZXI7CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEzWzB4MDA2YTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFdmVudCBEYXRhIEZpZWxkIC0gUGVyZm9ybWFuY2UgTW9uaXRvciAqLworCitzdHJ1Y3QgYXJiZWxwcm1fcGVyZm9ybWFuY2VfbW9uaXRvcl9ldmVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fcGVyZm9ybWFuY2VfbW9uaXRvcnNfc3QJcGVyZm9ybWFuY2VfbW9uaXRvcl9zbmFwc2hvdDsvKiBQZXJmb3JtYW5jZSBtb25pdG9yIHNuYXBzaG90ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltb25pdG9yX251bWJlclsweDAwMDA4XTsvKiAweDAxIC0gU1FQQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgLSBSUVBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMyAtIENRQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgLSBSa2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSAtIFRMQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYgLSBwb3J0MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcgLSBwb3J0MSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAxOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEV2ZW50X2RhdGEgRmllbGQgLSBQYWdlIEZhdWx0cyAqLworCitzdHJ1Y3QgYXJiZWxwcm1fcGFnZV9mYXVsdF9ldmVudF9kYXRhX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAl2YV9oWzB4MDAwMjBdOyAgICAgICAgIC8qIFZpcnR1YWwgQWRkcmVzc1s2MzozMl0gdGhpcyBwYWdlIGZhdWx0IGlzIHJlcG9ydGVkIG9uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2YV9sWzB4MDAwMjBdOyAgICAgICAgIC8qIFZpcnR1YWwgQWRkcmVzc1s2MzozMl0gdGhpcyBwYWdlIGZhdWx0IGlzIHJlcG9ydGVkIG9uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltZW1fa2V5WzB4MDAwMjBdOyAgICAgIC8qIE1lbW9yeSBLZXkgdGhpcyBwYWdlIGZhdWx0IGlzIHJlcG9ydGVkIG9uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlxcFsweDAwMDE4XTsgICAgICAgICAgIC8qIFFQIHRoaXMgcGFnZSBmYXVsdCBpcyByZXBvcnRlZCBvbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwM107CisgICAgcHNldWRvX2JpdF90CWFbMHgwMDAwMV07ICAgICAgICAgICAgLyogSWYgc2V0IHRoZSBtZW1vcnkgYWNjZXNzIHRoYXQgY2F1c2VkIHRoZSBwYWdlIGZhdWx0IHdhcyBhdG9taWMgKi8KKyAgICBwc2V1ZG9fYml0X3QJbHdbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgdGhlIG1lbW9yeSBhY2Nlc3MgdGhhdCBjYXVzZWQgdGhlIHBhZ2UgZmF1bHQgd2FzIGxvY2FsIHdyaXRlICovCisgICAgcHNldWRvX2JpdF90CWxyWzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0IHRoZSBtZW1vcnkgYWNjZXNzIHRoYXQgY2F1c2VkIHRoZSBwYWdlIGZhdWx0IHdhcyBsb2NhbCByZWFkICovCisgICAgcHNldWRvX2JpdF90CXJ3WzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0IHRoZSBtZW1vcnkgYWNjZXNzIHRoYXQgY2F1c2VkIHRoZSBwYWdlIGZhdWx0IHdhcyByZW1vdGUgd3JpdGUgKi8KKyAgICBwc2V1ZG9fYml0X3QJcnJbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgdGhlIG1lbW9yeSBhY2Nlc3MgdGhhdCBjYXVzZWQgdGhlIHBhZ2UgZmF1bHQgd2FzIHJlbW90ZSByZWFkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlwZFsweDAwMDE4XTsgICAgICAgICAgIC8qIFBEIHRoaXMgcGFnZSBmYXVsdCBpcyByZXBvcnRlZCBvbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlwcmVmZXRjaF9sZW5bMHgwMDAyMF07IC8qIEluZGljYXRlcyBob3cgbWFueSBzdWJzZXF1ZW50IHBhZ2VzIGluIHRoZSBzYW1lIG1lbW9yeSByZWdpb24vd2luZG93IHdpbGwgYmUgYWNjZXNzZWQgYnkgdGhlIGZvbGxvd2luZyB0cmFuc2FjdGlvbiBhZnRlciB0aGlzIHBhZ2UgZmF1bHQgaXMgcmVzb2x2ZWQuIG1lYXN1cmVkIGluIGJ5dGVzLiBTVyBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gcGFnZS1pbiB0aGUgc3Vic2VxdWVudCBwYWdlcyBpZiB0aGV5IGFyZSBub3QgcHJlc2VudC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogV1FFIHNlZ21lbnRzIGZvcm1hdCAqLworCitzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgc3RydWN0IGFyYmVscHJtX3NlbmRfd3FlX3NlZ21lbnRfc3QJc2VuZF93cWVfc2VnbWVudDsvKiBTZW5kIFdRRSBzZWdtZW50IGZvcm1hdCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAyODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfY3RybF9tbHhfc3QJbWx4X3dxZV9zZWdtZW50X2N0cmw7LyogTUxYIFdRRSBzZWdtZW50IGZvcm1hdCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAxMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfY3RybF9yZWN2X3N0CXJlY3Zfd3FlX3NlZ21lbnRfY3RybDsvKiBSZWNlaXZlIHNlZ21lbnQgZm9ybWF0ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDA4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEV2ZW50X2RhdGEgRmllbGQgLSBQb3J0IFN0YXRlIENoYW5nZSAqLworCitzdHJ1Y3QgYXJiZWxwcm1fcG9ydF9zdGF0ZV9jaGFuZ2Vfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDFjXTsKKyAgICBwc2V1ZG9fYml0X3QJcFsweDAwMDAyXTsgICAgICAgICAgICAvKiBQb3J0IG51bWJlciAoMSBvciAyKSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwMl07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDA2MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEV2ZW50X2RhdGEgRmllbGQgLSBDb21wbGV0aW9uIFF1ZXVlIEVycm9yICovCisKK3N0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3F1ZXVlX2Vycm9yX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAljcW5bMHgwMDAxOF07ICAgICAgICAgIC8qIENRIG51bWJlciBldmVudCBpcyByZXBvcnRlZCBmb3IgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3luZHJvbWVbMHgwMDAwOF07ICAgICAvKiBFcnJvciBzeW5kcm9tZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEgLSBDUSBvdmVycnVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiAtIENRIGFjY2VzcyB2aW9sYXRpb24gZXJyb3IgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMThdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFdmVudF9kYXRhIEZpZWxkIC0gQ29tcGxldGlvbiBFdmVudCAqLworCitzdHJ1Y3QgYXJiZWxwcm1fY29tcGxldGlvbl9ldmVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FuWzB4MDAwMThdOyAgICAgICAgICAvKiBDUSBudW1iZXIgZXZlbnQgaXMgcmVwb3J0ZWQgZm9yICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMGEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogRXZlbnQgUXVldWUgRW50cnkgKi8KKworc3RydWN0IGFyYmVscHJtX2V2ZW50X3F1ZXVlX2VudHJ5X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlldmVudF9zdWJfdHlwZVsweDAwMDA4XTsvKiBFdmVudCBTdWIgVHlwZS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lZCBmb3IgZXZlbnRzIHdoaWNoIGhhdmUgc3ViIHR5cGVzLCB6ZXJvIGVsc2V3aGVyZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlldmVudF90eXBlWzB4MDAwMDhdOyAgIC8qIEV2ZW50IFR5cGUgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXZlbnRfZGF0YVs2XVsweDAwMDIwXTsvKiBEZWxpdmVycyBhdXhpbGFyeSBkYXRhIHRvIGhhbmRsZSBldmVudC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDA3XTsKKyAgICBwc2V1ZG9fYml0X3QJb3duZXJbMHgwMDAwMV07ICAgICAgICAvKiBPd25lciBvZiB0aGUgZW50cnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBTVyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIEhXICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDE4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogUVAvRUUgU3RhdGUgVHJhbnNpdGlvbnMgQ29tbWFuZCBQYXJhbWV0ZXJzICovCisKK3N0cnVjdCBhcmJlbHBybV9xcF9lZV9zdGF0ZV90cmFuc2l0aW9uc19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3B0X3BhcmFtX21hc2tbMHgwMDAyMF07LyogVGhpcyBmaWVsZCBkZWZpbmVzIHdoaWNoIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC4gRWFjaCBiaXQgc3BlY2lmaWVzIHdoZXRoZXIgb3B0aW9uYWwgcGFyYW1ldGVyIGlzIHBhc3NlZCAoc2V0KSBvciBub3QgKGNsZWFyZWQpLiBUaGUgb3B0cGFyYW1tYXNrIGlzIGRlZmluZWQgZm9yIGVhY2ggUVAvRUUgY29tbWFuZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3F1ZXVlX3BhaXJfZWVfY29udGV4dF9lbnRyeV9zdAlxcGNfZWVjX2RhdGE7LyogUVBDL0VFQyBkYXRhICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDljMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIENvbXBsZXRpb24gUXVldWUgRW50cnkgRm9ybWF0ICovCisKK3N0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3F1ZXVlX2VudHJ5X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlteV9xcG5bMHgwMDAxOF07ICAgICAgIC8qIEluZGljYXRlcyB0aGUgUVAgZm9yIHdoaWNoIGNvbXBsZXRpb24gaXMgYmVpbmcgcmVwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAl2ZXJbMHgwMDAwNF07ICAgICAgICAgIC8qIENRRSB2ZXJzaW9uLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGZvciBJbmZpbmlIb3N0LUlJSS1FWCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXlfZWVbMHgwMDAxOF07ICAgICAgICAvKiBFRSBjb250ZXh0IChmb3IgUkQgb25seSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZCBmb3IgQmluZCBhbmQgTm9wIG9wZXJhdGlvbiBvbiBSRC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3Igbm9uIFJEIHNlcnZpY2VzIHRoaXMgZmlsZWQgcmVwb3J0cyB0aGUgQ1FFIHRpbWVzdGFtcC4gVGhlIFRpbWVzdGFtcCBpcyBhIGZyZWUgcnVubmluZyBjb3VudGVyIHRoYXQgaXMgaW5jcmVtZW50ZWQgZXZlcnkgVGltZVN0YW1wR3JhbnVsYXJpdHkgdGljay4gVGhlIGNvdW50ZXIgcm9sbHMtb3ZlciB3aGVuIGl0IHJlYWNoZXMgc2F0dXJhdGlvbi4gVGltZVN0YW1wR3JhbnVsYXJpdHkgaXMgY29uZmlndXJlZCBpbiB0aGUgSU5JVF9IQ0EgY29tbWFuZC4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAljaGVja3N1bV8xNV84WzB4MDAwMDhdOy8qIENoZWNrc3VtWzE1OjhdIC0gU2VlIElQb3ZlcklCIGNoZWNrc3VtIG9mZmxvYWRpbmcgY2hhcHRlciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFwblsweDAwMDE4XTsgICAgICAgICAvKiBSZW1vdGUgKHNvdXJjZSkgUVAgbnVtYmVyLiBWYWxpZCBpbiBSZXNwb25kZXIgQ1FFIG9ubHkgZm9yIERhdGFncmFtIFFQLiAqLworICAgIHBzZXVkb19iaXRfdAljaGVja3N1bV83XzBbMHgwMDAwOF07IC8qIENoZWNrc3VtWzc6MF0gLSBTZWUgSVBvdmVySUIgY2hlY2tzdW0gb2ZmbG9hZGluZyBjaGFwdGVyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlybGlkWzB4MDAwMTBdOyAgICAgICAgIC8qIFJlbW90ZSAoc291cmNlKSBMSUQgb2YgdGhlIG1lc3NhZ2UuIFZhbGlkIGluIFJlc3BvbmRlciBvZiBVRCBRUCBDUUUgb25seS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWxfcGF0aFsweDAwMDA3XTsgICAgICAvKiBNeSAoZGVzdGluYXRpb24pIExJRCBwYXRoIGJpdHMgLSB0aGVzZSBhcmUgdGhlIGxvd2Vtb3N0IExNQyBiaXRzIG9mIHRoZSBETElEIGluIGFuIGluY29taW5nIFVEIHBhY2tldCwgaGlnaGVyIGJpdHMgb2YgdGhpcyBmaWVsZCwgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIExNQyBiaXRzIGFyZSB6ZXJvZWQgYnkgSFcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgaW4gcmVzcG9uZGVyIG9mIFVEIFFQIENRRSBvbmx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWQgaWYgaW5jb21pbmcgbWVzc2FnZSBETElEIGlzIHRoZSBwZXJtaXNzaXZlIExJRCBvciBpbmNvbWluZyBtZXNzYWdlIGlzIG11bHRpY2FzdC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZ1sweDAwMDAxXTsgICAgICAgICAgICAvKiBHUkggcHJlc2VudCBpbmRpY2F0b3IuIFZhbGlkIGluIFJlc3BvbmRlciBvZiBVRCBRUCBDUUUgb25seS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJaXBva1sweDAwMDAxXTsgICAgICAgICAvKiBJUCBPSyAtIFNlZSBJUG92ZXJJQiBjaGVja3N1bSBvZmZsb2FkaW5nIGNoYXB0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAlzbFsweDAwMDA0XTsgICAgICAgICAgIC8qIFNlcnZpY2UgTGV2ZWwgb2YgdGhlIG1lc3NhZ2UuIFZhbGlkIGluIFJlc3BvbmRlciBvZiBVRCBRUCBDUUUgb25seS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWltbWVkaWF0ZV9ldGhlcnR5cGVfcGtleV9pbmR4X2VlY3JlZGl0c1sweDAwMDIwXTsvKiBWYWxpZCBmb3IgcmVjZWl2ZSBxdWV1ZSBjb21wbGV0aW9uIG9ubHkuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIE9wY29kZSBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdhcyBzZW5kL3dyaXRlIHdpdGggaW1tZWRpYXRlLCB0aGlzIGZpZWxkIGNvbnRhaW5zIGltbWVkaWF0ZSBmaWVsZCBvZiB0aGUgcGFja2V0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBjb21wbGV0aW9uIGNvcnJlc3BvbmRzIHRvIFJBVyByZWNlaXZlIHF1ZXVlLCBiaXRzIDE1OjAgY29udGFpbiBFdGhlcnR5cGUgZmllbGQgb2YgdGhlIHBhY2tldC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgY29tcGxldGlvbiBjb3JyZXNwb25kcyB0byBHU0kgcmVjZWl2ZSBxdWV1ZSwgYml0cyAzMToxNiBjb250YWluIGluZGV4IGluIFBLZXkgdGFibGUgdGhhdCBtYXRjaGVzIFBLZXkgb2YgdGhlIG1lc3NhZ2UgYXJyaXZlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgT3Bjb2RlIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoaXMgd2FzIHNlbmQgYW5kIGludmFsaWRhdGUsIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIGtleSB0aGF0IHdhcyBpbnZhbGlkYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQ1FFIG9mIHNlbmQgcXVldWUgb2YgdGhlIHJlbGlhYmxlIGNvbm5lY3Rpb24gc2VydmljZSAoYnV0IHNlbmQgYW5kIGludmFsaWRlKSwgYml0cyBbNDowXSBvZiB0aGlzIGZpZWxkIGNvbnRhaW4gdGhlIGVuY29kZWQgRUVjcmVkaXRzIHJlY2VpdmVkIGluIGxhc3QgQUNLIG9mIHRoZSBtZXNzYWdlLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnl0ZV9jbnRbMHgwMDAyMF07ICAgICAvKiBCeXRlIGNvdW50IG9mIGRhdGEgYWN0dWFsbHkgdHJhbnNmZXJyZWQgKHZhbGlkIGZvciByZWNlaXZlIHF1ZXVlIGNvbXBsZXRpb25zIG9ubHkpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CXdxZV9hZHJbMHgwMDAxYV07ICAgICAgLyogQml0cyAzMTo2IG9mIFdRRSB2aXJ0dWFsIGFkZHJlc3MgY29tcGxldGlvbiBpcyByZXBvcnRlZCBmb3IuIFRoZSA2IGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIHplcm8uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAwN107CisgICAgcHNldWRvX2JpdF90CW93bmVyWzB4MDAwMDFdOyAgICAgICAgLyogT3duZXIgZmllbGQuIFplcm8gdmFsdWUgb2YgdGhpcyBmaWVsZCBtZWFucyBTVyBvd25lcnNoaXAgb2YgQ1FFLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwZl07CisgICAgcHNldWRvX2JpdF90CXNbMHgwMDAwMV07ICAgICAgICAgICAgLyogSWYgc2V0LCBjb21wbGV0aW9uIGlzIHJlcG9ydGVkIGZvciBTZW5kIHF1ZXVlLCBpZiBjbGVhcmVkIC0gcmVjZWl2ZSBxdWV1ZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3Bjb2RlWzB4MDAwMDhdOyAgICAgICAvKiBUaGUgb3Bjb2RlIG9mIFdRRSBjb21wbGV0aW9uIGlzIHJlcG9ydGVkIGZvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQ1FFcyBjb3JyZXNwb25kaW5nIHRvIHNlbmQgY29tcGxldGlvbiwgTk9QQ09ERSBmaWVsZCBvZiB0aGUgV1FFIGlzIGNvcGllZCB0byB0aGlzIGZpZWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBDUUVzIGNvcnJlc3BvbmRpbmcgdG8gcmVjZWl2ZSBjb21wbGV0aW9ucywgb3Bjb2RlIGZpZWxkIG9mIGxhc3QgcGFja2V0IGluIHRoZSBtZXNzYWdlIGNvcGllZCB0byB0aGlzIGZpZWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBDUUVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlY2VpdmUgcXVldWUgb2YgUVBzIG1hcHBlZCB0byBRUDEsIHRoZSBvcGNvZGUgd2lsbCBiZSBTRU5EIHdpdGggSW1tZWRpYXRlIChtZXNzYWdlcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBTRU5EIG9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHJlcG9ydGVkIGluIGNhc2Ugb2YgY29tcGxldGlvbiB3aXRoIGVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkUgLSBGb3IgY29tcGxldGlvbiB3aXRoIGVycm9yIG9uIFJlY2VpdmUgUXVldWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRiAtIEZvciBjb21wbGV0aW9uIHdpdGggZXJyb3Igb24gU2VuZCBRdWV1ZXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogICovCisKK3N0cnVjdCBhcmJlbHBybV9lY2NfZGV0ZWN0X2V2ZW50X2RhdGFfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNhdXNlX2xzYlsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAljYXVzZV9tc2JbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJZXJyX3Jtd1sweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJZXJyX3NyY19pZFsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJZXJyX2RhWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAllcnJfYmFbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDExXTsKKyAgICBwc2V1ZG9fYml0X3QJb3ZlcmZsb3dbMHgwMDAwMV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcnJfcmFbMHgwMDAxMF07CisgICAgcHNldWRvX2JpdF90CWVycl9jYVsweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogRXZlbnRfZGF0YSBGaWVsZCAtIEVDQyBEZXRlY3Rpb24gRXZlbnQgKi8KKworc3RydWN0IGFyYmVscHJtX3NjcnViYmluZ19ldmVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY2F1c2VfbHNiWzB4MDAwMDFdOyAgICAvKiBkYXRhIGludGVncml0eSBlcnJvciBjYXVzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgRUNDIGVycm9yIGluIHRoZSA2NGJpdCBsc2IgZGF0YSwgb24gdGhlIHJpc2UgZWRnZSBvZiB0aGUgY2xvY2sgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAljYXVzZV9tc2JbMHgwMDAwMV07ICAgIC8qIGRhdGEgaW50ZWdyaXR5IGVycm9yIGNhdXNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBFQ0MgZXJyb3IgaW4gdGhlIDY0Yml0IG1zYiBkYXRhLCBvbiB0aGUgZmFsbCBlZGdlIG9mIHRoZSBjbG9jayAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWVycl9ybXdbMHgwMDAwMV07ICAgICAgLyogdHJhbnNhY3Rpb24gdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSByZWFkL21vZGlmeS93cml0ZSAqLworICAgIHBzZXVkb19iaXRfdAllcnJfc3JjX2lkWzB4MDAwMDNdOyAgIC8qIHNvdXJjZSBvZiB0aGUgdHJhbnNhY3Rpb246IDB4NCAtIFBDSSwgb3RoZXIgLSBpbnRlcm5hbCBvciBJQiAqLworICAgIHBzZXVkb19iaXRfdAllcnJfZGFbMHgwMDAwMl07ICAgICAgIC8qIEVycm9yIERJTU0gYWRkcmVzcyAqLworICAgIHBzZXVkb19iaXRfdAllcnJfYmFbMHgwMDAwMl07ICAgICAgIC8qIEVycm9yIGJhbmsgYWRkcmVzcyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAxMV07CisgICAgcHNldWRvX2JpdF90CW92ZXJmbG93WzB4MDAwMDFdOyAgICAgLyogRmF0YWw6IEVDQyBlcnJvciBGSUZPIG92ZXJmbG93IC0gRUNDIGVycm9ycyB3ZXJlIGRldGVjdGVkLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBoYXZlIGJlZW4gY29ycmVjdGVkIGJ5IEluZmluaUhvc3QtSUlJLUVYICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcnJfcmFbMHgwMDAxMF07ICAgICAgIC8qIEVycm9yIHJvdyBhZGRyZXNzICovCisgICAgcHNldWRvX2JpdF90CWVycl9jYVsweDAwMDEwXTsgICAgICAgLyogRXJyb3IgY29sdW1uIGFkZHJlc3MgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogTWlzY2VsbGFuZW91cyBDb3VudGVycyAqLworCitzdHJ1Y3QgYXJiZWxwcm1fbWlzY19jb3VudGVyc19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGRyX3NjYW5fY250WzB4MDAwMjBdOyAvKiBOdW1iZXIgb2YgdGltZXMgd2hvbGUgb2YgTEFNIHdhcyBzY2FubmVkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDdlMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIExBTV9FTiBPdXRwdXQgUGFyYW1ldGVyICovCisKK3N0cnVjdCBhcmJlbHBybV9sYW1fZW5fb3V0X3BhcmFtX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEV4dGVuZGVkX0NvbXBsZXRpb25fUXVldWVfRW50cnkgKi8KKworc3RydWN0IGFyYmVscHJtX2V4dGVuZGVkX2NvbXBsZXRpb25fcXVldWVfZW50cnlfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogICovCisKK3N0cnVjdCBhcmJlbHBybV9lcV9jbWRfZG9vcmJlbGxfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogMCAqLworCitzdHJ1Y3QgYXJiZWxwcm1fYXJiZWxfcHJtX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHN0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3F1ZXVlX2VudHJ5X3N0CWNvbXBsZXRpb25fcXVldWVfZW50cnk7LyogQ29tcGxldGlvbiBRdWV1ZSBFbnRyeSBGb3JtYXQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDdmZjAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3FwX2VlX3N0YXRlX3RyYW5zaXRpb25zX3N0CXFwX2VlX3N0YXRlX3RyYW5zaXRpb25zOy8qIFFQL0VFIFN0YXRlIFRyYW5zaXRpb25zIENvbW1hbmQgUGFyYW1ldGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4N2YwMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fZXZlbnRfcXVldWVfZW50cnlfc3QJZXZlbnRfcXVldWVfZW50cnk7LyogRXZlbnQgUXVldWUgRW50cnkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDdmZjAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2NvbXBsZXRpb25fZXZlbnRfc3QJY29tcGxldGlvbl9ldmVudDsvKiBFdmVudF9kYXRhIEZpZWxkIC0gQ29tcGxldGlvbiBFdmVudCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4N2ZmNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fY29tcGxldGlvbl9xdWV1ZV9lcnJvcl9zdAljb21wbGV0aW9uX3F1ZXVlX2Vycm9yOy8qIEV2ZW50X2RhdGEgRmllbGQgLSBDb21wbGV0aW9uIFF1ZXVlIEVycm9yICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHg3ZmY0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9wb3J0X3N0YXRlX2NoYW5nZV9zdAlwb3J0X3N0YXRlX2NoYW5nZTsvKiBFdmVudF9kYXRhIEZpZWxkIC0gUG9ydCBTdGF0ZSBDaGFuZ2UgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDdmZjQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X3N0CXdxZV9zZWdtZW50Oy8qIFdRRSBzZWdtZW50cyBmb3JtYXQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDdmMDAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3BhZ2VfZmF1bHRfZXZlbnRfZGF0YV9zdAlwYWdlX2ZhdWx0X2V2ZW50X2RhdGE7LyogRXZlbnRfZGF0YSBGaWVsZCAtIFBhZ2UgRmF1bHRzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDdbMHg3ZmY0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9wZXJmb3JtYW5jZV9tb25pdG9yX2V2ZW50X3N0CXBlcmZvcm1hbmNlX21vbml0b3JfZXZlbnQ7LyogRXZlbnQgRGF0YSBGaWVsZCAtIFBlcmZvcm1hbmNlIE1vbml0b3IgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOFsweGZmZjIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX210MjUyMDhfdHlwZTBfc3QJbXQyNTIwOF90eXBlMDsvKiBJbmZpbmlIb3N0LUlJSS1FWCBUeXBlMCBDb25maWd1cmF0aW9uIEhlYWRlciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4N2YwMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fcXBfZWVfZXZlbnRfc3QJcXBfZWVfZXZlbnQ7LyogRXZlbnRfZGF0YSBGaWVsZCAtIFFQL0VFIEV2ZW50cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2dwaW9fZXZlbnRfZGF0YV9zdAlncGlvX2V2ZW50X2RhdGE7CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDExWzB4N2ZlNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fdWRfYWRkcmVzc192ZWN0b3Jfc3QJdWRfYWRkcmVzc192ZWN0b3I7LyogVUQgQWRkcmVzcyBWZWN0b3IgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTJbMHg3ZmYwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9xdWV1ZV9wYWlyX2VlX2NvbnRleHRfZW50cnlfc3QJcXVldWVfcGFpcl9lZV9jb250ZXh0X2VudHJ5Oy8qIFFQIGFuZCBFRSBDb250ZXh0IEVudHJ5ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEzWzB4N2ZhMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fYWRkcmVzc19wYXRoX3N0CWFkZHJlc3NfcGF0aDsvKiBBZGRyZXNzIFBhdGggKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTRbMHg3ZmYwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3F1ZXVlX2NvbnRleHRfc3QJY29tcGxldGlvbl9xdWV1ZV9jb250ZXh0Oy8qIENvbXBsZXRpb24gUXVldWUgQ29udGV4dCBUYWJsZSBFbnRyeSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNVsweDdmZTAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX21wdF9zdAltcHQ7ICAgICAgICAgLyogTWVtb3J5IFByb3RlY3Rpb24gVGFibGUgKE1QVCkgRW50cnkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTZbMHg3ZmUwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9tdHRfc3QJbXR0OyAgICAgICAgIC8qIE1lbW9yeSBUcmFuc2xhdGlvbiBUYWJsZSAoTVRUKSBFbnRyeSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxN1sweDdmZmMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2VxY19zdAllcWM7ICAgICAgICAgLyogRXZlbnQgUXVldWUgQ29udGV4dCBUYWJsZSBFbnRyeSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxOFsweDdmZTAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3BlcmZvcm1hbmNlX21vbml0b3JzX3N0CXBlcmZvcm1hbmNlX21vbml0b3JzOy8qIFBlcmZvcm1hbmNlIE1vbml0b3JzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE5WzB4N2ZmODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1faGNhX2NvbW1hbmRfcmVnaXN0ZXJfc3QJaGNhX2NvbW1hbmRfcmVnaXN0ZXI7LyogSENBIENvbW1hbmQgUmVnaXN0ZXIgKEhDUikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjBbMHhmZmYyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9pbml0X2hjYV9zdAlpbml0X2hjYTsvKiBJTklUX0hDQSAmIFFVRVJZX0hDQSBQYXJhbWV0ZXJzIEJsb2NrICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIxWzB4N2YwMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fcXBjYmFzZWFkZHJfc3QJcXBjYmFzZWFkZHI7LyogUVBDL0VFQy9DUUMvRVFDL1JEQiBQYXJhbWV0ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIyWzB4N2ZjMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fdWRhdnRhYmxlX21lbW9yeV9wYXJhbWV0ZXJzX3N0CXVkYXZ0YWJsZV9tZW1vcnlfcGFyYW1ldGVyczsvKiBNZW1vcnkgQWNjZXNzIFBhcmFtZXRlcnMgZm9yIFVEIEFkZHJlc3MgVmVjdG9yIFRhYmxlICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIzWzB4N2ZmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fbXVsdGljYXN0cGFyYW1fc3QJbXVsdGljYXN0cGFyYW07LyogTXVsdGljYXN0IFN1cHBvcnQgUGFyYW1ldGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyNFsweDdmZjAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3RwdHBhcmFtc19zdAl0cHRwYXJhbXM7LyogVHJhbnNsYXRpb24gYW5kIFByb3RlY3Rpb24gVGFibGVzIFBhcmFtZXRlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjVbMHg3ZmYwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9lbmFibGVfbGFtX3N0CWVuYWJsZV9sYW07LyogRU5BQkxFX0xBTSBQYXJhbWV0ZXJzIEJsb2NrICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9hY2Nlc3NfbGFtX3N0CWFjY2Vzc19sYW07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI2WzB4N2Y3MDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fZGltbWluZm9fc3QJZGltbWluZm87LyogTG9naWNhbCBESU1NIEluZm9ybWF0aW9uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI3WzB4N2ZmMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fcXVlcnlfZndfc3QJcXVlcnlfZnc7LyogUVVFUllfRlcgUGFyYW1ldGVycyBCbG9jayAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyOFsweDdmODAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3F1ZXJ5X2FkYXB0ZXJfc3QJcXVlcnlfYWRhcHRlcjsvKiBRVUVSWV9BREFQVEVSIFBhcmFtZXRlcnMgQmxvY2sgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjlbMHg3ZjgwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9xdWVyeV9kZXZfbGltX3N0CXF1ZXJ5X2Rldl9saW07LyogUXVlcnkgRGV2aWNlIExpbWl0YXRpb25zICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDMwWzB4N2Y4MDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fdWFyX3BhcmFtc19zdAl1YXJfcGFyYW1zOy8qIFVBUiBQYXJhbWV0ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDMxWzB4N2ZmMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1faW5pdF9pYl9zdAlpbml0X2liOyAvKiBJTklUX0lCIFBhcmFtZXRlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzJbMHg3ZjgwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9tZ21fZW50cnlfc3QJbWdtX2VudHJ5Oy8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzNbMHg3ZmUwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9zZXRfaWJfc3QJc2V0X2liOyAgIC8qIFNFVF9JQiBQYXJhbWV0ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM0WzB4N2ZlMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fcmRfc2VuZF9kb29yYmVsbF9zdAlyZF9zZW5kX2Rvb3JiZWxsOy8qIFJELXNlbmQgZG9vcmJlbGwgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzVbMHg3ZmY4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9zZW5kX2Rvb3JiZWxsX3N0CXNlbmRfZG9vcmJlbGw7LyogU2VuZCBkb29yYmVsbCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzNlsweDdmZmMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3JlY2VpdmVfZG9vcmJlbGxfc3QJcmVjZWl2ZV9kb29yYmVsbDsvKiBSZWNlaXZlIGRvb3JiZWxsICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM3WzB4N2ZmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fY3FfY21kX2Rvb3JiZWxsX3N0CWNxX2NtZF9kb29yYmVsbDsvKiBDUSBEb29yYmVsbCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzOFsweGZmZmMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3Vhcl9zdAl1YXI7ICAgICAgICAgLyogVXNlciBBY2Nlc3MgUmVnaW9uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM5WzB4N2MwMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fbWdtcXBfc3QJbWdtcXA7ICAgICAvKiBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyIFFQICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQwWzB4N2ZmZTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fcXVlcnlfZGVidWdfbXNnX3N0CXF1ZXJ5X2RlYnVnX21zZzsvKiBRdWVyeSBEZWJ1ZyBNZXNzYWdlICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQxWzB4N2Y4MDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fbWFkX2lmY19zdAltYWRfaWZjOyAvKiBNQURfSUZDIElucHV0IE1haWxib3ggKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDJbMHgwMDkwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9tYWRfaWZjX2lucHV0X21vZGlmaWVyX3N0CW1hZF9pZmNfaW5wdXRfbW9kaWZpZXI7LyogTUFEX0lGQyBJbnB1dCBNb2RpZmllciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0M1sweDdlNmUwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3Jlc2l6ZV9jcV9zdAlyZXNpemVfY3E7LyogUmVzaXplIENRIElucHV0IE1haWxib3ggKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDRbMHg3ZmUwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3dpdGhfZXJyb3Jfc3QJY29tcGxldGlvbl93aXRoX2Vycm9yOy8qIENvbXBsZXRpb24gd2l0aCBFcnJvciBDUUUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDVbMHg3ZmYwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9oY3JfY29tcGxldGlvbl9ldmVudF9zdAloY3JfY29tcGxldGlvbl9ldmVudDsvKiBFdmVudF9kYXRhIEZpZWxkIC0gSENSIENvbXBsZXRpb24gRXZlbnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDZbMHg3ZmY0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV90cmFuc3BvcnRfYW5kX2NpX2Vycm9yX2NvdW50ZXJzX3N0CXRyYW5zcG9ydF9hbmRfY2lfZXJyb3JfY291bnRlcnM7LyogVHJhbnNwb3J0IGFuZCBDSSBFcnJvciBDb3VudGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0N1sweDdmMDAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3BlcmZvcm1hbmNlX2NvdW50ZXJzX3N0CXBlcmZvcm1hbmNlX2NvdW50ZXJzOy8qIFBlcmZvcm1hbmNlIENvdW50ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQ4WzB4OWZmODAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2Zhc3RfcmVnaXN0cmF0aW9uX3NlZ21lbnRfc3QJZmFzdF9yZWdpc3RyYXRpb25fc2VnbWVudDsvKiBGYXN0IFJlZ2lzdHJhdGlvbiBTZWdtZW50ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQ5WzB4N2ZmMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fcGJsX3N0CXBibDsgICAgICAgICAvKiBQaHlzaWNhbCBCdWZmZXIgTGlzdCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1MFsweDdmZjAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX3NycV9jb250ZXh0X3N0CXNycV9jb250ZXh0Oy8qIFNSUSBDb250ZXh0ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDUxWzB4N2ZlODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fbW9kX3N0YXRfY2ZnX3N0CW1vZF9zdGF0X2NmZzsvKiBNT0RfU1RBVF9DRkcgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTJbMHg3ZjgwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV92aXJ0dWFsX3BoeXNpY2FsX21hcHBpbmdfc3QJdmlydHVhbF9waHlzaWNhbF9tYXBwaW5nOy8qIFZpcnR1YWwgYW5kIFBoeXNpY2FsIE1hcHBpbmcgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTNbMHg3ZmY4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBhcmJlbHBybV9jcV9jaV9kYl9yZWNvcmRfc3QJY3FfY2lfZGJfcmVjb3JkOy8qIENRX0NJX0RCX1JlY29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1NFsweDdmZmMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2NxX2FybV9kYl9yZWNvcmRfc3QJY3FfYXJtX2RiX3JlY29yZDsvKiBDUV9BUk1fREJfUmVjb3JkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU1WzB4N2ZmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fcXBfZGJfcmVjb3JkX3N0CXFwX2RiX3JlY29yZDsvKiBRUF9EQl9SZWNvcmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTZbMHgxZmZmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fY29uZmlndXJhdGlvbl9yZWdpc3RlcnNfc3QJY29uZmlndXJhdGlvbl9yZWdpc3RlcnM7LyogSW5maW5pSG9zdCBJSUkgRVggQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2VxX3NldF9jaV90YWJsZV9zdAllcV9zZXRfY2lfdGFibGU7LyogRVEgU2V0IENJIERCcyBUYWJsZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1N1sweDAxMDAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGFyYmVscHJtX2VxX2FybV9kYl9yZWdpb25fc3QJZXFfYXJtX2RiX3JlZ2lvbjsvKiBFUSBBcm0gRG9vcmJlbGwgUmVnaW9uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU4WzB4MDBmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgYXJiZWxwcm1fY2xyX2ludF9zdAljbHJfaW50OyAvKiBDbGVhciBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTlbMHhmZmNmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorI2VuZGlmIC8qIEhfcHJlZml4X2FyYmVscHJtX2JpdHNfZml4bmFtZXNfTVQyNTIxOF9QUk1fY3NwX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9NVDI1NDA4X1BSTS5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL01UMjU0MDhfUFJNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5ZTI1YQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9NVDI1NDA4X1BSTS5oCkBAIC0wLDAgKzEsMzMxOSBAQAorLyoKKyAgVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAgbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGF0CisgIDxodHRwOi8vd3d3LmZzZi5vcmcvY29weWxlZnQvZ3BsLmh0bWw+LCBvciB0aGUgT3BlbklCLm9yZyBCU0QKKyAgbGljZW5zZSwgYXZhaWxhYmxlIGluIHRoZSBMSUNFTlNFLlRYVCBmaWxlIGFjY29tcGFueWluZyB0aGlzCisgIHNvZnR3YXJlLiAgVGhlc2UgZGV0YWlscyBhcmUgYWxzbyBhdmFpbGFibGUgYXQKKyAgPGh0dHA6Ly9vcGVuaWIub3JnL2xpY2Vuc2UuaHRtbD4uCisKKyAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgIFNPRlRXQVJFLgorCisgIENvcHlyaWdodCAoYykgMjAwNCBNZWxsYW5veCBUZWNobm9sb2dpZXMgTHRkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisvKioqCisgKioqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGF0ICJNb24gQXByIDE2IDIzOjIyOjAyIDIwMDciCisgKioqIGJ5OgorICoqKiAgICAlIGNzcF9iZiAtY29weXJpZ2h0PS9tc3dnL21pc2MvbGljZW5zZS1oZWFkZXIudHh0IC1wcmVmaXggaGVybW9ucHJtXyAtYml0cyAtZml4bmFtZXMgTVQyNTQwOF9QUk0uY3NwCisgKioqLworCisjaWZuZGVmIEhfcHJlZml4X2hlcm1vbnBybV9iaXRzX2ZpeG5hbWVzX01UMjU0MDhfUFJNX2NzcF9ICisjZGVmaW5lIEhfcHJlZml4X2hlcm1vbnBybV9iaXRzX2ZpeG5hbWVzX01UMjU0MDhfUFJNX2NzcF9ICisKKy8qIFVEIEFkZHJlc3MgVmVjdG9yICovCisKK3N0cnVjdCBoZXJtb25wcm1fdWRfYWRkcmVzc192ZWN0b3Jfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXBkWzB4MDAwMThdOyAgICAgICAgICAgLyogUHJvdGVjdGlvbiBEb21haW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcG9ydF9udW1iZXJbMHgwMDAwMl07ICAvKiBQb3J0IG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBQb3J0IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gUG9ydCAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgLSByZXNlcnZlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CWZsWzB4MDAwMDFdOyAgICAgICAgICAgLyogZm9yY2UgbG9vcGJhY2sgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJsaWRbMHgwMDAxMF07ICAgICAgICAgLyogUmVtb3RlIChEZXN0aW5hdGlvbikgTElEICovCisgICAgcHNldWRvX2JpdF90CW15X2xpZF9wYXRoX2JpdHNbMHgwMDAwN107LyogU291cmNlIExJRCAtIHRoZSBsb3dlciA3IGJpdHMgKHVwcGVyIGJpdHMgYXJlIHRha2VuIGZyb20gUG9ydEluZm8pICovCisgICAgcHNldWRvX2JpdF90CWdbMHgwMDAwMV07ICAgICAgICAgICAgLyogR2xvYmFsIGFkZHJlc3MgZW5hYmxlIC0gaWYgc2V0LCBHUkggd2lsbCBiZSBmb3JtZWQgZm9yIHBhY2tldCBoZWFkZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJaG9wX2xpbWl0WzB4MDAwMDhdOyAgICAvKiBJUHY2IGhvcCBsaW1pdCAqLworICAgIHBzZXVkb19iaXRfdAltYXhfc3RhdF9yYXRlWzB4MDAwMDRdOy8qIE1heGltdW0gc3RhdGljIHJhdGUgY29udHJvbC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIDRYIGluamVjdGlvbiByYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIDFYIGluamVjdGlvbiByYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgLSByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CW1naWRfaW5kZXhbMHgwMDAwN107ICAgLyogSW5kZXggdG8gcG9ydCBHSUQgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZ2lkX2luZGV4ID0gKHBvcnRfbnVtYmVyLTEpICogMl5sb2dfbWF4X2dpZCArIGdpZF9pbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIGxvZ19tYXhfZ2lkIGlzIHRha2VuIGZyb20gUVVFUllfREVWX0NBUCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gZ2lkX2luZGV4IGlzIHRoZSBpbmRleCB0byB0aGUgR0lEIHRhYmxlICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDA5XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWZsb3dfbGFiZWxbMHgwMDAxNF07ICAgLyogSVB2NiBmbG93IGxhYmVsICovCisgICAgcHNldWRvX2JpdF90CXRjbGFzc1sweDAwMDA4XTsgICAgICAgLyogSVB2NiBUQ2xhc3MgKi8KKyAgICBwc2V1ZG9fYml0X3QJc2xbMHgwMDAwNF07ICAgICAgICAgICAvKiBJbmZpbmlCYW5kIFNlcnZpY2UgTGV2ZWwgKFNMKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmdpZF8xMjdfOTZbMHgwMDAyMF07ICAvKiBSZW1vdGUgR0lEWzEyNzo5Nl0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJnaWRfOTVfNjRbMHgwMDAyMF07ICAgLyogUmVtb3RlIEdJRFs5NTo2NF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJnaWRfNjNfMzJbMHgwMDAyMF07ICAgLyogUmVtb3RlIEdJRFs2MzozMl0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJnaWRfMzFfMFsweDAwMDIwXTsgICAgLyogUmVtb3RlIEdJRFszMTowXSBpZiBHIGJpdCBpcyBzZXQuIE11c3QgYmUgc2V0IHRvIDB4MiBpZiBHIGJpdCBpcyBjbGVhcmVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTZW5kIGRvb3JiZWxsICovCisKK3N0cnVjdCBoZXJtb25wcm1fc2VuZF9kb29yYmVsbF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbm9wY29kZVsweDAwMDA1XTsgICAgICAvKiBPcGNvZGUgb2YgZGVzY3JpcHRvciB0byBiZSBleGVjdXRlZCAqLworICAgIHBzZXVkb19iaXRfdAlmWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIEZlbmNlIGJpdC4gSWYgc2V0LCBkZXNjcmlwdG9yIGlzIGZlbmNlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXdxZV9jb3VudGVyWzB4MDAwMTBdOyAgLyogTW9kdWxvLTY0SyBjb3VudGVyIG9mIFdRRXMgcG9zdGVkIHRvIHRoZSBRUCBzaW5jZSBpdHMgY3JlYXRpb24gZXhjbHVkaW5nIHRoZSBuZXdseSBwb3N0ZWQgV1FFcyBpbiB0aGlzIGRvb3JiZWxsLiBTaG91bGQgYmUgemVybyBmb3IgdGhlIGZpcnN0IGRvb3JiZWxsIG9uIHRoZSBRUCAqLworICAgIHBzZXVkb19iaXRfdAl3cWVfY250WzB4MDAwMDhdOyAgICAgIC8qIE51bWJlciBvZiBXUUVzIHBvc3RlZCB3aXRoIHRoaXMgZG9vcmJlbGwuIE11c3QgYmUgZ3JhdGVyIHRoZW4gemVyby4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW5kc1sweDAwMDA2XTsgICAgICAgICAgLyogTmV4dCBkZXNjcmlwdG9yIHNpemUgKGluIDE2LWJ5dGUgY2h1bmtzKSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXFwblsweDAwMDE4XTsgICAgICAgICAgLyogUVAgbnVtYmVyIHRoaXMgZG9vcmJlbGwgaXMgcnVuZyBvbiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTZW5kIHdxZSBzZWdtZW50IGRhdGEgaW5saW5lICovCisKK3N0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfZGF0YV9pbmxpbmVfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWJ5dGVfY291bnRbMHgwMDAwYV07ICAgLyogTm90IGluY2x1ZGluZyBwYWRkaW5nIGZvciAxNkJ5dGUgY2h1bmtzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDE1XTsKKyAgICBwc2V1ZG9fYml0X3QJYWx3YXlzMVsweDAwMDAxXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWRhdGFbMHgwMDAxOF07ICAgICAgICAgLyogRGF0YSBtYXkgYmUgbW9yZSB0aGlzIHNlZ21lbnQgc2l6ZSAtIGluIDE2Qnl0ZSBjaHVua3MgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTZW5kIHdxZSBzZWdtZW50IGRhdGEgcHRyICovCisKK3N0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfZGF0YV9wdHJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWJ5dGVfY291bnRbMHgwMDAxZl07CisgICAgcHNldWRvX2JpdF90CWFsd2F5czBbMHgwMDAwMV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsX2tleVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvY2FsX2FkZHJlc3NfaFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvY2FsX2FkZHJlc3NfbFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogU2VuZCB3cWUgc2VnbWVudCByZCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX2xvY2FsX2ludmFsaWRhdGVfc2VnbWVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWVtX2tleVsweDAwMDE4XTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwYTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBGYXN0X1JlZ2lzdHJhdGlvbl9TZWdtZW50ICAgIyMjI21pY2hhbCAtIGRvZXNuJ3QgbWF0Y2ggUFJNIChmaWVsZHMgd2VyZSBhZGRlZCwgc2VlIGJlbG93KSBuZXcgdGFibGUgc2l6ZSBpbiBieXRlcyAtICAweDMwICovCisKK3N0cnVjdCBoZXJtb25wcm1fZmFzdF9yZWdpc3RyYXRpb25fc2VnbWVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMWJdOworICAgIHBzZXVkb19iaXRfdAlsclsweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCAtIExvY2FsIFJlYWQgYWNjZXNzIHdpbGwgYmUgZW5hYmxlZCAqLworICAgIHBzZXVkb19iaXRfdAlsd1sweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCAtIExvY2FsIFdyaXRlIGFjY2VzcyB3aWxsIGJlIGVuYWJsZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcnJbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgLSBSZW1vdGUgUmVhZCBhY2Nlc3Mgd2lsbCBiZSBlbmFibGVkICovCisgICAgcHNldWRvX2JpdF90CXJ3WzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0IC0gUmVtb3RlIFdyaXRlIGFjY2VzcyB3aWxsIGJlIGVuYWJsZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJYVsweDAwMDAxXTsgICAgICAgICAgICAvKiBJZiBzZXQgLSBSZW1vdGUgQXRvbWljIGFjY2VzcyB3aWxsIGJlIGVuYWJsZWQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBibF9wdHJfNjNfMzJbMHgwMDAyMF07LyogUGh5c2ljYWwgYWRkcmVzcyBwb2ludGVyIFs2MzozMl0gdG8gdGhlIHBoeXNpY2FsIGJ1ZmZlciBsaXN0ICAjIyMgbWljaGFsIC0gdGhpcyBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIG1lbV9rZXkgLjMyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltZW1fa2V5WzB4MDAwMjBdOyAgICAgIC8qIE1lbW9yeSBLZXkgb24gd2hpY2ggdGhlIGZhc3QgcmVnaXN0cmF0aW9uIGlzIGV4ZWN1dGVkIG9uLiAjIyNtaWNoYWwtdGhpcyBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHBibF9wdHJfNjNfMzIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBhZ2Vfc2l6ZVsweDAwMDA1XTsgICAgLyogUGFnZSBzaXplIHVzZWQgZm9yIHRoZSByZWdpb24uIEFjdHVhbCBzaXplIGlzIFs0S10qMl5QYWdlX3NpemUgYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9zaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMjAuICMjI21pY2hhbCAtIGZpZWxkIGRvZXNuJ3QgZXhzaXN0IChzZWUgcmVwbGFjZW1lbnQgYWJvdmUpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJemJbMHgwMDAwMV07ICAgICAgICAgICAvKiBaZXJvIEJhc2VkIFJlZ2lvbiAgICAgICAgICAgICAgICMjI21pY2hhbCAtIGZpZWxkIGRvZXNuJ3QgZXhzaXN0IChzZWUgcmVwbGFjZW1lbnQgYWJvdmUpICovCisgICAgcHNldWRvX2JpdF90CXBibF9wdHJfMzFfOFsweDAwMDE4XTsgLyogUGh5c2ljYWwgYWRkcmVzcyBwb2ludGVyIFszMTo4XSB0byB0aGUgcGh5c2ljYWwgYnVmZmVyIGxpc3QgICAgIyMjbWljaGFsIC0gZmllbGQgZG9lc24ndCBleHNpc3QgKHNlZSByZXBsYWNlbWVudCBhYm92ZSkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN0YXJ0X2FkZHJlc3NfaFsweDAwMDIwXTsvKiBTdGFydCBBZGRyZXNzWzYzOjMyXSAtIFZpcnR1YWwgQWRkcmVzcyB3aGVyZSB0aGlzIHJlZ2lvbiBzdGFydHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN0YXJ0X2FkZHJlc3NfbFsweDAwMDIwXTsvKiBTdGFydCBBZGRyZXNzWzMxOjBdIC0gVmlydHVhbCBBZGRyZXNzIHdoZXJlIHRoaXMgcmVnaW9uIHN0YXJ0cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVnX2xlbl9oWzB4MDAwMjBdOyAgICAvKiBSZWdpb24gTGVuZ3RoWzYzOjMyXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVnX2xlbl9sWzB4MDAwMjBdOyAgICAvKiBSZWdpb24gTGVuZ3RoWzMxOjBdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFNlbmQgd3FlIHNlZ21lbnQgYXRvbWljICovCisKK3N0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfYXRvbWljX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlzd2FwX2FkZF9oWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3dhcF9hZGRfbFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNvbXBhcmVfaFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNvbXBhcmVfbFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogU2VuZCB3cWUgc2VnbWVudCByZW1vdGUgYWRkcmVzcyAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3dxZV9zZWdtZW50X3JlbW90ZV9hZGRyZXNzX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZW1vdGVfdmlydF9hZGRyX2hbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZW1vdGVfdmlydF9hZGRyX2xbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlya2V5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBlbmQgd3FlIHNlZ21lbnQgYmluZCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3dxZV9zZWdtZW50X2JpbmRfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDFkXTsKKyAgICBwc2V1ZG9fYml0X3QJcnJbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQsIFJlbW90ZSBSZWFkIEVuYWJsZSBmb3IgYm91bmQgd2luZG93LiAqLworICAgIHBzZXVkb19iaXRfdAlyd1sweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCwgUmVtb3RlIFdyaXRlIEVuYWJsZSBmb3IgYm91bmQgd2luZG93LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlhWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIElmIHNldCwgQXRvbWljIEVuYWJsZSBmb3IgYm91bmQgd2luZG93LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMWVdOworICAgIHBzZXVkb19iaXRfdAl6YlsweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCwgV2luZG93IGlzIFplcm8gQmFzZWQuICovCisgICAgcHNldWRvX2JpdF90CXR5cGVbMHgwMDAwMV07ICAgICAgICAgLyogV2luZG93IHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIFR5cGUgb25lIHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBUeXBlIHR3byB3aW5kb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW5ld19ya2V5WzB4MDAwMjBdOyAgICAgLyogVGhlIG5ldyBSS2V5IG9mIHdpbmRvdyB0byBiaW5kICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZWdpb25fbGtleVsweDAwMDIwXTsgIC8qIExvY2FsIGtleSBvZiByZWdpb24sIHdoaWNoIHdpbmRvdyB3aWxsIGJlIGJvdW5kIHRvICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzdGFydF9hZGRyZXNzX2hbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzdGFydF9hZGRyZXNzX2xbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsZW5ndGhfaFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxlbmd0aF9sWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTZW5kIHdxZSBzZWdtZW50IHVkICovCisKK3N0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfdWRfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgc3RydWN0IGhlcm1vbnBybV91ZF9hZGRyZXNzX3ZlY3Rvcl9zdAl1ZF9hZGRyZXNzX3ZlY3RvcjsvKiBVRCBBZGRyZXNzIFZlY3RvciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGVzdGluYXRpb25fcXBbMHgwMDAxOF07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXFfa2V5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTZW5kIHdxZSBzZWdtZW50IHJkICovCisKK3N0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfcmRfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWRlc3RpbmF0aW9uX3FwWzB4MDAwMThdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlxX2tleVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogU2VuZCB3cWUgc2VnbWVudCBjdHJsICovCisKK3N0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfY3RybF9zZW5kX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlvcGNvZGVbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDFhXTsKKyAgICBwc2V1ZG9fYml0X3QJb3duZXJbMHgwMDAwMV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlkc1sweDAwMDA2XTsgICAgICAgICAgIC8qIGRlc2NyaXB0b3IgKHdxZSkgc2l6ZSBpbiAxNmJ5dGVzIGNodW5rICovCisgICAgcHNldWRvX2JpdF90CWZbMHgwMDAwMV07ICAgICAgICAgICAgLyogZmVuY2UgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMTldOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZmxbMHgwMDAwMV07ICAgICAgICAgICAvKiBGb3JjZSBMb29wQmFjayAqLworICAgIHBzZXVkb19iaXRfdAlzWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIFJlbW90ZSBTb2xpY2l0ZWQgRXZlbnQgKi8KKyAgICBwc2V1ZG9fYml0X3QJY1sweDAwMDAyXTsgICAgICAgICAgICAvKiBjb21wbGV0aW9uIHJlcXVpcmVkOiAwYjAwIC0gbm8gICAwYjExIC0geWVzICovCisgICAgcHNldWRvX2JpdF90CWlwWzB4MDAwMDFdOyAgICAgICAgICAgLyogV2hlbiBzZXQsIEluZmluaUhvc3QgSUlJIEV4IHdpbGwgY2FsY3VsYXRlIHRoZSBJUCBjaGVja3N1bSBvZiB0aGUgSVAgaGVhZGVyIHRoYXQgaXMgcHJlc2VudCBpbW1lZGlhdGVseSBhZnRlciB0aGUgSVBvdmVySUIgZW5jYXBzdWxhdGlvbiBoZWFkZXIuIEluIHRoZSBjYXNlIG9mIG11bHRpcGxlIGhlYWRlcnMgKGVuY2Fwc3VsYXRpb24pLCBJbmZpbmlIb3N0IElJSSBFeCB3aWxsIGNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gb25seSBmb3IgdGhlIGZpcnN0IElQIGhlYWRlciBmb2xsb3dpbmcgdGhlIElQb3ZlcklCIGVuY2Fwc3VsYXRpb24gaGVhZGVyLiBOb3QgVmFsaWQgZm9yIElQdjYgcGFja2V0cyAqLworICAgIHBzZXVkb19iaXRfdAl0Y3BfdWRwWzB4MDAwMDFdOyAgICAgIC8qIFdoZW4gc2V0LCBJbmZpbmlIb3N0IElJSSBFeCB3aWxsIGNhbGN1bGF0ZSB0aGUgVENQL1VEUCBjaGVja3N1bSBvZiB0aGUgcGFja2V0IHRoYXQgaXMgcHJlc2VudCBpbW1lZGlhdGVseSBhZnRlciB0aGUgSVAgaGVhZGVyLiBJbiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBoZWFkZXJzIChlbmNhcHN1bGF0aW9uKSwgSW5maW5pSG9zdCBJSUkgRXggd2lsbCBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtIG9ubHkgZm9yIHRoZSBmaXJzdCBUQ1AgaGVhZGVyIGZvbGxvd2luZyB0aGUgSVAgaGVhZGVyLiBUaGlzIGJpdCBtYXkgYmUgc2V0IG9ubHkgaWYgdGhlIGVudGlyZSBUQ1AvVURQIHNlZ21lbnQgaXMgcHJlc2VudCBpbiBvbmUgSUIgcGFja2V0ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJc29bMHgwMDAwMV07ICAgICAgICAgICAvKiBTdHJvbmcgT3JkZXJpbmcgLSB3aGVuIHNldCwgdGhlIFdRRSB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgYWZ0ZXIgYWxsIHByZXZpb3VzIFdRRXMgaGF2ZSBiZWVuIGV4ZWN1dGVkLiBDYW4gYmUgc2V0IGZvciBSQyBXUUVzIG9ubHkuIFRoaXMgYml0IG11c3QgYmUgc2V0IGluIHR5cGUgdHdvIEJJTkQsIEZhc3QgUmVnaXN0cmF0aW9uIGFuZCBMb2NhbCBpbnZhbGlkYXRlIG9wZXJhdGlvbnMuICovCisgICAgcHNldWRvX2JpdF90CXNyY19yZW1vdGVfYnVmWzB4MDAwMThdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJaW1tZWRpYXRlWzB4MDAwMjBdOyAgICAvKiBJZiB0aGUgT3BDb2RlIGVuY29kZXMgYW4gb3BlcmF0aW9uIHdpdGggSW1tZWRpYXRlIChSRE1BLXdyaXRlL1NFTkQpLCBUaGlzIGZpZWxkIHdpbGwgaG9sZCB0aGUgSW1tZWRpYXRlIGRhdGEgdG8gYmUgc2VudC4gSWYgdGhlIE9wQ29kZSBlbmNvZGVzIHNlbmQgYW5kIGludmFsaWRhdGUgb3BlcmF0aW9ucywgdGhpcyBmaWVsZCBob2xkcyB0aGUgSW52YWxpZGF0aW9uIGtleSB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBwYWNrZXQ7IG90aGVyd2lzZSwgdGhpcyBmaWVsZCBpcyByZXNlcnZlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogQWRkcmVzcyBQYXRoCSMgIyMjbWljaGFsIC0gbWF0Y2ggdG8gUFJNICovCisKK3N0cnVjdCBoZXJtb25wcm1fYWRkcmVzc19wYXRoX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlwa2V5X2luZGV4WzB4MDAwMDddOyAgIC8qIFBLZXkgdGFibGUgaW5kZXggKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMTZdOworICAgIHBzZXVkb19iaXRfdAlzdlsweDAwMDAxXTsgICAgICAgICAgIC8qIFNlcnZpY2UgIFZMQU4gb24gUVAgKi8KKyAgICBwc2V1ZG9fYml0X3QJY3ZbMHgwMDAwMV07ICAgICAgICAgICAvKiBDdXN0b21lciBWTEFOIGluIFFQICovCisgICAgcHNldWRvX2JpdF90CWZsWzB4MDAwMDFdOyAgICAgICAgICAgLyogRm9yY2UgTG9vcEJhY2sgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJsaWRbMHgwMDAxMF07ICAgICAgICAgLyogUmVtb3RlIChEZXN0aW5hdGlvbikgTElEICovCisgICAgcHNldWRvX2JpdF90CW15X2xpZF9zbWFjX2lkeFsweDAwMDA3XTsvKiBTb3VyY2UgTElEIC0gdGhlIGxvd2VyIDcgYml0cyAodXBwZXIgYml0cyBhcmUgdGFrZW4gZnJvbSBQb3J0SW5mbykgKi8KKyAgICBwc2V1ZG9fYml0X3QJZ3JoX2lwWzB4MDAwMDFdOyAgICAgICAvKiBHbG9iYWwgYWRkcmVzcyBlbmFibGUgLSBpZiBzZXQsIEdSSCB3aWxsIGJlIGZvcm1lZCBmb3IgcGFja2V0IGhlYWRlciAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlob3BfbGltaXRbMHgwMDAwOF07ICAgIC8qIElQdjYgaG9wIGxpbWl0ICovCisgICAgcHNldWRvX2JpdF90CW1heF9zdGF0X3JhdGVbMHgwMDAwNF07LyogTWF4aW11bSBzdGF0aWMgcmF0ZSBjb250cm9sLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gMTAwJSBpbmplY3Rpb24gcmF0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gMjUlIGluamVjdGlvbiByYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIDEyLjUlIGluamVjdGlvbiByYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtIDUwJSBpbmplY3Rpb24gcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6IDIuNSBHYi9zLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OiAxMCBHYi9zLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OiAzMCBHYi9zLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDogNSBHYi9zLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTogMjAgR2Ivcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjogNDAgR2Ivcy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6IDYwIEdiL3MuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OiA4MCBHYi9zLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTogMTIwIEdiL3MuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJbWdpZF9pbmRleFsweDAwMDA3XTsgICAvKiBJbmRleCB0byBwb3J0IEdJRCB0YWJsZSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CWFja190aW1lb3V0WzB4MDAwMDVdOyAgLyogTG9jYWwgQUNLIHRpbWVvdXQgLSBUcmFuc3BvcnQgdGltZXIgZm9yIGFjdGl2YXRpb24gb2YgcmV0cmFuc21pc3Npb24gbWVjaGFuaXNtLiBSZWZlciB0byBJQiBzcGVjIFZvbDEgOS43LjYuMS4zIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRyYW5zcG9ydCB0aW1lciBpcyBzZXQgdG8gNC4wOTZ1cyoyXmFja190aW1lb3V0LCBpZiBhY2tfdGltZW91dCBpcyAwIHRoZW4gdHJhbnNwb3J0IHRpbWVyIGlzIGRpc2FibGVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZmxvd19sYWJlbFsweDAwMDE0XTsgICAvKiBJUHY2IGZsb3cgbGFiZWwgKi8KKyAgICBwc2V1ZG9fYml0X3QJdGNsYXNzWzB4MDAwMDhdOyAgICAgICAvKiBJUHY2IFRDbGFzcyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwNF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZ2lkXzEyN185NlsweDAwMDIwXTsgIC8qIFJlbW90ZSBHSURbMTI3Ojk2XSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmdpZF85NV82NFsweDAwMDIwXTsgICAvKiBSZW1vdGUgR0lEWzk1OjY0XSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmdpZF82M18zMlsweDAwMDIwXTsgICAvKiBSZW1vdGUgR0lEWzYzOjMyXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmdpZF8zMV8wWzB4MDAwMjBdOyAgICAvKiBSZW1vdGUgR0lEWzMxOjBdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXNwWzB4MDAwMDFdOyAgICAgICAgICAgLyogaWYgc2V0LCBzcG9vZmluZyBwcm90ZWN0aW9uIGlzIGVuZm9yY2VkIG9uIHRoaXMgUVAgYW5kIEV0aGVydHlwZSBoZWFkZXJzIGFyZSByZXN0cmljdGVkICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJZnZsWzB4MDAwMDFdOyAgICAgICAgICAvKiBmb3JjZSBWTEFOICovCisgICAgcHNldWRvX2JpdF90CWZzaXBbMHgwMDAwMV07ICAgICAgICAgLyogZm9yY2Ugc291cmNlIElQICovCisgICAgcHNldWRvX2JpdF90CWZzbVsweDAwMDAxXTsgICAgICAgICAgLyogZm9yY2Ugc291cmNlIE1BQyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDdbMHgwMDAwYV07CisgICAgcHNldWRvX2JpdF90CXNjaGVkX3F1ZXVlWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZG1hY180N18zMlsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJdmxhbl9pbmRleFsweDAwMDA3XTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAljb3VudGVyX2luZGV4WzB4MDAwMDhdOy8qIEluZGV4IHRvIGEgdGFibGUgb2YgY291bnRlcnMgdGhhdCBjb3VudHMgZWdyZXNzIHBhY2tldHMgYW5kIGJ5dGVzLCAweEZGIG5vdCB2YWxpZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZG1hY18zMV8wWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBIQ0EgQ29tbWFuZCBSZWdpc3RlciAoSENSKSAgICAjIyMjIG1pY2hhbCAtIG1hdGNoIFBSTSAqLworCitzdHJ1Y3QgaGVybW9ucHJtX2hjYV9jb21tYW5kX3JlZ2lzdGVyX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlpbl9wYXJhbV9oWzB4MDAwMjBdOyAgIC8qIElucHV0IFBhcmFtZXRlcjogcGFyYW1ldGVyWzYzOjMyXSBvciBwb2ludGVyWzYzOjMyXSB0byBpbnB1dCBtYWlsYm94IChzZWUgY29tbWFuZCBkZXNjcmlwdGlvbikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWluX3BhcmFtX2xbMHgwMDAyMF07ICAgLyogSW5wdXQgUGFyYW1ldGVyOiBwYXJhbWV0ZXJbMzE6MF0gb3IgcG9pbnRlclszMTowXSB0byBpbnB1dCBtYWlsYm94IChzZWUgY29tbWFuZCBkZXNjcmlwdGlvbikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWlucHV0X21vZGlmaWVyWzB4MDAwMjBdOy8qIElucHV0IFBhcmFtZXRlciBNb2RpZmllciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3V0X3BhcmFtX2hbMHgwMDAyMF07ICAvKiBPdXRwdXQgUGFyYW1ldGVyOiBwYXJhbWV0ZXJbNjM6MzJdIG9yIHBvaW50ZXJbNjM6MzJdIHRvIG91dHB1dCBtYWlsYm94IChzZWUgY29tbWFuZCBkZXNjcmlwdGlvbikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW91dF9wYXJhbV9sWzB4MDAwMjBdOyAgLyogT3V0cHV0IFBhcmFtZXRlcjogcGFyYW1ldGVyWzMxOjBdIG9yIHBvaW50ZXJbMzE6MF0gdG8gb3V0cHV0IG1haWxib3ggKHNlZSBjb21tYW5kIGRlc2NyaXB0aW9uKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMTBdOworICAgIHBzZXVkb19iaXRfdAl0b2tlblsweDAwMDEwXTsgICAgICAgIC8qIFNvZnR3YXJlIGFzc2lnbmVkIHRva2VuIHRvIHRoZSBjb21tYW5kLCB0byB1bmlxdWVseSBpZGVudGlmeSBpdC4gVGhlIHRva2VuIGlzIHJldHVybmVkIHRvIHRoZSBzb2Z0d2FyZSBpbiB0aGUgRVFFIHJlcG9ydGVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3Bjb2RlWzB4MDAwMGNdOyAgICAgICAvKiBDb21tYW5kIG9wY29kZSAqLworICAgIHBzZXVkb19iaXRfdAlvcGNvZGVfbW9kaWZpZXJbMHgwMDAwNF07LyogT3Bjb2RlIE1vZGlmaWVyLCBzZWUgc3BlY2lmaWMgZGVzY3JpcHRpb24gZm9yIGVhY2ggY29tbWFuZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAl0WzB4MDAwMDFdOwkgICAgICAgLyogVG9nZ2xlICovCisgICAgcHNldWRvX2JpdF90CWVbMHgwMDAwMV07ICAgICAgICAgICAgLyogRXZlbnQgUmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBEb24ndCByZXBvcnQgZXZlbnQgKHNvZnR3YXJlIHdpbGwgcG9sbCB0aGUgR08gYml0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBSZXBvcnQgZXZlbnQgdG8gRVEgd2hlbiB0aGUgY29tbWFuZCBjb21wbGV0ZXMgKi8KKyAgICBwc2V1ZG9fYml0X3QJZ29bMHgwMDAwMV07ICAgICAgICAgICAvKiBHbyAoMD1Tb2Z0d2FyZSBvd25lcnNoaXAgZm9yIHRoZSBIQ1IsIDE9SGFyZHdhcmUgb3duZXJzaGlwIGZvciB0aGUgSENSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIGNhbiB3cml0ZSB0byB0aGUgSENSIG9ubHkgaWYgR28gYml0IGlzIGNsZWFyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdhcmUgbXVzdCBzZXQgdGhlIEdvIGJpdCB0byB0cmlnZ2VyIHRoZSBIVyB0byBleGVjdXRlIHRoZSBjb21tYW5kLiBTb2Z0d2FyZSBtdXN0IG5vdCB3cml0ZSB0byB0aGlzIHJlZ2lzdGVyIHZhbHVlIG90aGVyIHRoYW4gMSBmb3IgdGhlIEdvIGJpdC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhdHVzWzB4MDAwMDhdOyAgICAgICAvKiBDb21tYW5kIGV4ZWN1dGlvbiBzdGF0dXMgcmVwb3J0LiBWYWxpZCBvbmx5IGlmIGNvbW1hbmQgaW50ZXJmYWNlIGluIHVuZGVyIFNXIG93bmVyc2hpcCAoR28gYml0IGlzIGNsZWFyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIGNvbW1hbmQgY29tcGxldGVkIHdpdGhvdXQgZXJyb3IuIElmIGRpZmZlcmVudCB0aGFuIHplcm8sIGNvbW1hbmQgZXhlY3V0aW9uIGNvbXBsZXRlZCB3aXRoIGVycm9yLiBTeW5kcm9tIGVuY29kaW5nIGlzIGRlcGVuZGVkIG9uIGNvbW1hbmQgZXhlY3V0ZWQgYW5kIGlzIGRlZmluZWQgZm9yIGVhY2ggY29tbWFuZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBDUSBEb29yYmVsbCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX2NxX2NtZF9kb29yYmVsbF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FuWzB4MDAwMThdOyAgICAgICAgICAvKiBDUSBudW1iZXIgYWNjZXNzZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJY21kWzB4MDAwMDNdOyAgICAgICAgICAvKiBDb21tYW5kIHRvIGJlIGV4ZWN1dGVkIG9uIENRCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwIC0gUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEgLSBSZXF1ZXN0IG5vdGlmaWNhdGlvbiBmb3IgbmV4dCBTb2xpY2l0ZWQgY29tcGxldGlvbiBldmVudC4gQ1FfcGFyYW0gc3BlY2lmaWVzIHRoZSBjdXJyZW50IENRIENvbnN1bWVyIENvdW50ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyIC0gUmVxdWVzdCBub3RpZmljYXRpb24gZm9yIG5leHQgU29saWNpdGVkIG9yIFVuc29saWNpdGVkIGNvbXBsZXRpb24gZXZlbnQuIENRX3BhcmFtIHNwZWNpZmllcyB0aGUgY3VycmVudCBDUSBDb25zdW1lciBDb3VudGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MyAtIFJlcXVlc3Qgbm90aWZpY2F0aW9uIGZvciBtdWx0aXBsZSBjb21wbGV0aW9ucyAoQXJtLU4pLiBDUV9wYXJhbSBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBDUSBDb3VudGVyIHRoYXQgd2hlbiByZWFjaGVkIGJ5IEhXIChpLmUuIEhXIGdlbmVyYXRlcyBhIENRRSBpbnRvIHRoaXMgQ291bnRlcikgRXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlciAtIFJlc2VydmVkICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJY21kX3NuWzB4MDAwMDJdOyAgICAgICAvKiBDb21tYW5kIFNlcXVlbmNlIE51bWJlciAtIFRoaXMgZmllbGQgc2hvdWxkIGJlIGluY3JlbWVudGVkIHVwb24gcmVjZWl2aW5nIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIG9mIHRoZSByZXNwZWN0aXZlIENRLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNpdGlvbiBpcyBkb25lIGJ5IHJpbmdpbmcgUmVxdWVzdCBub3RpZmljYXRpb24gZm9yIG5leHQgU29saWNpdGVkLCBSZXF1ZXN0IG5vdGlmaWNhdGlvbiBmb3IgbmV4dCBTb2xpY2l0ZWQgb3IgVW5zb2xpY2l0ZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiBvciBSZXF1ZXN0IG5vdGlmaWNhdGlvbiBmb3IgbXVsdGlwbGUgY29tcGxldGlvbnMgZG9vcmJlbGxzIGFmdGVyIHJlY2VpdmluZyBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIGluaXRpYWxpemVkIHRvIFplcm8gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDJdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FfcGFyYW1bMHgwMDAyMF07ICAgICAvKiBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBieSBDUSBjb21tYW5kICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFJELXNlbmQgZG9vcmJlbGwgKi8KKworc3RydWN0IGhlcm1vbnBybV9yZF9zZW5kX2Rvb3JiZWxsX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CWVlblsweDAwMDE4XTsgICAgICAgICAgLyogRW5kLXRvLWVuZCBjb250ZXh0IG51bWJlciAocmVsaWFibGUgZGF0YWdyYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSB6ZXJvIGZvciBOb3AgYW5kIEJpbmQgb3BlcmF0aW9ucyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlxcG5bMHgwMDAxOF07ICAgICAgICAgIC8qIFFQIG51bWJlciB0aGlzIGRvb3JiZWxsIGlzIHJ1bmcgb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9zZW5kX2Rvb3JiZWxsX3N0CXNlbmRfZG9vcmJlbGw7LyogU2VuZCBQYXJhbWV0ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgICAjIyMjIG1pY2hhbCAtIG1hdGNoIFBSTSAqLworCitzdHJ1Y3QgaGVybW9ucHJtX21nbXFwX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlxcG5faVsweDAwMDE4XTsgICAgICAgIC8qIFFQTl9pOiBRUCBudW1iZXIgd2hpY2ggaXMgYSBtZW1iZXIgaW4gdGhpcyBtdWx0aWNhc3QgZ3JvdXAuIFZhbGlkIG9ubHkgaWYgUWkgYml0IGlzIHNldC4gTGVuZ3RoIG9mIHRoZSBRUE5faSBsaXN0IGlzIHNldCBpbiBJTklUX0hDQSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CWJsY2tfbGJbMHgwMDAwMV07ICAgICAgLyogQmxvY2sgc2VsZi1sb29wYmFjayBtZXNzYWdlcyBhcnJpdmluZyB0byB0aGlzIHFwICovCisgICAgcHNldWRvX2JpdF90CXFpWzB4MDAwMDFdOyAgICAgICAgICAgLyogUWk6IFFQTl9pIGlzIHZhbGlkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIHZzZCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3ZzZF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3M1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc4WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3OVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzEwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MTFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcxMlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzEzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MTRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcxNVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzE2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MTdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcxOFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzE5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MjBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcyMVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzIyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MjNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcyNFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzI1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MjZbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHcyN1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzI4WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MjlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHczMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzMxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MzJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHczM1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzM0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MzVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHczNlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzM3WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3MzhbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHczOVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NDFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc0MlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzQzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NDRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc0NVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzQ2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NDdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc0OFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzQ5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NTBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc1MVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzUyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdnNkX2R3NTNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2c2RfZHc1NFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZzZF9kdzU1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBVQVIgUGFyYW1ldGVycyAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3Vhcl9wYXJhbXNfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXVhcl9wYWdlX3N6WzB4MDAwMDhdOyAgLyogVGhpcyBmaWVsZCBkZWZpbmVzIHRoZSBzaXplIG9mIGVhY2ggVUFSIHBhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSBvZiBVQVIgUGFnZSBpcyA0S0IqMl5VQVJfUGFnZV9TaXplICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfdWFyc1sweDAwMDA0XTsgLyogTnVtYmVyIG9mIFVBUnMgc3VwcG9ydGVkIGlzIDJebG9nX21heF9VQVJzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDE0XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMGEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogVHJhbnNsYXRpb24gYW5kIFByb3RlY3Rpb24gVGFibGVzIFBhcmFtZXRlcnMgKi8KKworc3RydWN0IGhlcm1vbnBybV90cHRwYXJhbXNfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWRtcHRfYmFzZV9hZHJfaFsweDAwMDIwXTsvKiBkTVBUIC0gTWVtb3J5IFByb3RlY3Rpb24gVGFibGUgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIFs2MzozMl0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkgc2l6ZSBpcyA2NCBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gaXRzIHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIDB4RkZGRkZGRkYgaWYgYWRkcmVzcyB0cmFuc2xhdGlvbiBhbmQgcHJvdGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZG1wdF9iYXNlX2Fkcl9sWzB4MDAwMjBdOy8qIGRNUFQgLSBNZW1vcnkgUHJvdGVjdGlvbiBUYWJsZSBiYXNlIHBoeXNpY2FsIGFkZHJlc3MgWzMxOjBdLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5IHNpemUgaXMgNjQgYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGl0cyBzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF5IGJlIHNldCB0byAweEZGRkZGRkZGIGlmIGFkZHJlc3MgdHJhbnNsYXRpb24gYW5kIHByb3RlY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19kbXB0X3N6WzB4MDAwMDZdOyAgLyogTG9nIChiYXNlIDIpIG9mIHRoZSBudW1iZXIgb2YgcmVnaW9uL3dpbmRvd3MgZW50cmllcyBpbiB0aGUgZE1QVCB0YWJsZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlwZnRvWzB4MDAwMDVdOyAgICAgICAgIC8qIFBhZ2UgRmF1bHQgUk5SIFRpbWVvdXQgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZmllbGQgcmV0dXJuZWQgaW4gUk5SIE5ha3MgZ2VuZXJhdGVkIHdoZW4gYSBwYWdlIGZhdWx0IGlzIGRldGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IGhhcyBubyBlZmZlY3Qgd2hlbiBvbi1kZW1hbmQtcGFnaW5nIGlzIG5vdCB1c2VkLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAxM107CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltdHRfYmFzZV9hZGRyX2hbMHgwMDAyMF07LyogTVRUIC0gTWVtb3J5IFRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBbNjM6MzJdLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG11c3QgYmUgYWxpZ25lZCB0byBpdHMgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1heSBiZSBzZXQgdG8gMHhGRkZGRkZGRiBpZiBhZGRyZXNzIHRyYW5zbGF0aW9uIGFuZCBwcm90ZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltdHRfYmFzZV9hZGRyX2xbMHgwMDAyMF07LyogTVRUIC0gTWVtb3J5IFRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBbMzE6MF0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGl0cyBzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF5IGJlIHNldCB0byAweEZGRkZGRkZGIGlmIGFkZHJlc3MgdHJhbnNsYXRpb24gYW5kIHByb3RlY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNtcHRfYmFzZV9hZHJfaFsweDAwMDIwXTsvKiBjTVBUIC0gTWVtb3J5IFByb3RlY3Rpb24gVGFibGUgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIFs2MzozMl0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkgc2l6ZSBpcyA2NCBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gaXRzIHNpemUuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbXB0X2Jhc2VfYWRyX2xbMHgwMDAyMF07LyogY01QVCAtIE1lbW9yeSBQcm90ZWN0aW9uIFRhYmxlIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBbMzE6MF0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkgc2l6ZSBpcyA2NCBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gaXRzIHNpemUuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIE11bHRpY2FzdCBTdXBwb3J0IFBhcmFtZXRlcnMgICAjIyMjIG1pY2hhbCAtIG1hdGNoIFBSTSAqLworCitzdHJ1Y3QgaGVybW9ucHJtX211bHRpY2FzdHBhcmFtX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAltY19iYXNlX2FkZHJfaFsweDAwMDIwXTsvKiBCYXNlIEFkZHJlc3Mgb2YgdGhlIE11bHRpY2FzdCBUYWJsZSBbNjM6MzJdLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXNlIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSBlbnRyeSBzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF5IGJlIHNldCB0byAweEZGRkZGRkZGIGlmIG11bHRpY2FzdCBpcyBub3Qgc3VwcG9ydGVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWNfYmFzZV9hZGRyX2xbMHgwMDAyMF07LyogQmFzZSBBZGRyZXNzIG9mIHRoZSBNdWx0aWNhc3QgVGFibGUgWzMxOjBdLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgZW50cnkgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1heSBiZSBzZXQgdG8gMHhGRkZGRkZGRiBpZiBtdWx0aWNhc3QgaXMgbm90IHN1cHBvcnRlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tY190YWJsZV9lbnRyeV9zelsweDAwMDA1XTsvKiBMb2cyIG9mIHRoZSBTaXplIG9mIG11bHRpY2FzdCBncm91cCBtZW1iZXIgKE1HTSkgZW50cnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBncmVhdGVyIHRoYW4gNSAodG8gYWxsb3cgQ1RSTCBhbmQgR0lEIHNlY3Rpb25zKS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhhdCBpbXBsaWVzIHRoZSBudW1iZXIgb2YgUVBzIHBlciBNQyB0YWJsZSBlbnRyeS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMGJdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAxMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWNfdGFibGVfaGFzaF9zelsweDAwMDA1XTsvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBtdWx0aWNhc3QgREdJRCBoYXNoIHRhYmxlIChtdXN0IGJlIHBvd2VyIG9mIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5JVF9IQ0EgLSB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWV9IQ0EgLSB0aGUgYWN0dWFsIG51bWJlciBvZiBlbnRyaWVzIGFzc2lnbmVkIGJ5IGZpcm13YXJlICh3aWxsIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYW1vdW50IHJlcXVpcmVkIGluIElOSVRfSENBKSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAxYl07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWNfdGFibGVfc3pbMHgwMDAwNV07LyogTG9nMiBvZiB0aGUgb3ZlcmFsbCBudW1iZXIgb2YgTUMgZW50cmllcyBpbiB0aGUgTUNHIHRhYmxlIChpbmNsdWRlcyBib3RoIGhhc2ggYW5kIGF1eGlsaWFyeSB0YWJsZXMpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDEzXTsKKyAgICBwc2V1ZG9fYml0X3QJbWNfaGFzaF9mblsweDAwMDAzXTsgICAvKiBNdWx0aWNhc3QgaGFzaCBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBEZWZhdWx0IGhhc2ggZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciAtIHJlc2VydmVkICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDA1XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogUVBDL0VFQy9DUUMvRVFDL1JEQiBQYXJhbWV0ZXJzICAgIyMjIyBtaWNoYWwgLSBkb2Vzbid0IG1hdGNoIFBSTSAoZmllbGQgbmFtZSBhcmUgZGlmZmVycy4gc2VlIGJlbG93KSAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3FwY2Jhc2VhZGRyX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDA4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlxcGNfYmFzZV9hZGRyX2hbMHgwMDAyMF07LyogUVBDIEJhc2UgQWRkcmVzcyBbNjM6MzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbnVtX29mX3FwWzB4MDAwMDVdOy8qIExvZyBiYXNlIDIgb2YgbnVtYmVyIG9mIHN1cHBvcnRlZCBRUHMgKi8KKyAgICBwc2V1ZG9fYml0X3QJcXBjX2Jhc2VfYWRkcl9sWzB4MDAwMWJdOy8qIFFQQyBCYXNlIEFkZHJlc3MgWzMxOjddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcnFjX2Jhc2VfYWRkcl9oWzB4MDAwMjBdOy8qIFNSUSBDb250ZXh0IEJhc2UgQWRkcmVzcyBbNjM6MzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIDB4RkZGRkZGRkYgaWYgU1JRIGlzIG5vdCBzdXBwb3J0ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbnVtX29mX3NycVsweDAwMDA1XTsvKiBMb2cgYmFzZSAyIG9mIG51bWJlciBvZiBzdXBwb3J0ZWQgU1JRcy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3JxY19iYXNlX2FkZHJfbFsweDAwMDFiXTsvKiBTUlEgQ29udGV4dCBCYXNlIEFkZHJlc3MgWzMxOjVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIDB4RkZGRkZGRkYgaWYgU1JRIGlzIG5vdCBzdXBwb3J0ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljcWNfYmFzZV9hZGRyX2hbMHgwMDAyMF07LyogQ1FDIEJhc2UgQWRkcmVzcyBbNjM6MzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbnVtX29mX2NxWzB4MDAwMDVdOy8qIExvZyBiYXNlIDIgb2YgbnVtYmVyIG9mIHN1cHBvcnRlZCBDUXMuICovCisgICAgcHNldWRvX2JpdF90CWNxY19iYXNlX2FkZHJfbFsweDAwMDFiXTsvKiBDUUMgQmFzZSBBZGRyZXNzIFszMTo2XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG11c3QgYmUgYWxpZ25lZCBvbiBpdHMgc2l6ZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYWx0Y19iYXNlX2FkZHJfaFsweDAwMDIwXTsvKiBBbHRDIEJhc2UgQWRkcmVzcyAoYWx0Y19iYXNlX2FkZHJfaCkgWzYzOjMyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIGhhcyBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIFFQQyB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gZW50cnkgc2l6ZS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWFsdGNfYmFzZV9hZGRyX2xbMHgwMDAyMF07LyogQWx0QyBCYXNlIEFkZHJlc3MgKGFsdGNfYmFzZV9hZGRyX2wpIFszMTowXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIGhhcyBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIFFQQyB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gZW50cnkgc2l6ZS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWF1eGNfYmFzZV9hZGRyX2hbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlhdXhjX2Jhc2VfYWRkcl9sWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1WzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXFjX2Jhc2VfYWRkcl9oWzB4MDAwMjBdOy8qIEVRQyBCYXNlIEFkZHJlc3MgWzYzOjMyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF5IGJlIHNldCB0byAweEZGRkZGRkZGIGlmIEVRcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gZW50cnkgc2l6ZS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19udW1fb2ZfZXFbMHgwMDAwNV07LyogTG9nIGJhc2UgMiBvZiBudW1iZXIgb2Ygc3VwcG9ydGVkIEVRcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIDYgb3IgbGVzcyBpbiBJbmZpbmlIb3N0LUlJSS1FWC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXFjX2Jhc2VfYWRkcl9sWzB4MDAwMWJdOy8qIEVRQyBCYXNlIEFkZHJlc3MgWzMxOjZdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXkgYmUgc2V0IHRvIDB4RkZGRkZGRkYgaWYgRVFzIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIG11c3QgYmUgYWxpZ25lZCB0byBlbnRyeSBzaXplLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmRtYXJkY19iYXNlX2FkZHJfaFsweDAwMDIwXTsvKiByZG1hcmRjX2Jhc2VfYWRkcl9oOiBCYXNlIGFkZHJlc3Mgb2YgdGFibGUgdGhhdCBob2xkcyByZW1vdGUgcmVhZCBhbmQgcmVtb3RlIGF0b21pYyByZXF1ZXN0cyBbNjM6MzJdLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX251bV9yZFsweDAwMDAzXTsgICAvKiBMb2cgKGJhc2UgMikgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIFJkbWFSZEMgZW50cmllcyBwZXIgUVAuIFRoaXMgZGVub3RlcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVhZHMvYXRvbWljcyBhcyBhIHJlc3BvbmRlci4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlyZG1hcmRjX2Jhc2VfYWRkcl9sWzB4MDAwMWJdOy8qIHJkbWFyZGNfYmFzZV9hZGRyX2w6IEJhc2UgYWRkcmVzcyBvZiB0YWJsZSB0aGF0IGhvbGRzIHJlbW90ZSByZWFkIGFuZCByZW1vdGUgYXRvbWljIHJlcXVlc3RzIFszMTowXS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIFJEQiBlbnRyeSBzaXplICgzMiBieXRlcykuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDhbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEhlYWRlcl9Mb2dfUmVnaXN0ZXIgKi8KKworc3RydWN0IGhlcm1vbnBybV9oZWFkZXJfbG9nX3JlZ2lzdGVyX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlwbGFjZV9ob2xkZXJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDA2MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFBlcmZvcm1hbmNlIE1vbml0b3JzICovCisKK3N0cnVjdCBoZXJtb25wcm1fcGVyZm9ybWFuY2VfbW9uaXRvcnNfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWUwWzB4MDAwMDFdOyAgICAgICAgICAgLyogRW5hYmxlcyBjb3VudGluZyBvZiByZXNwZWN0aXZlIHBlcmZvcm1hbmNlIGNvdW50ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJZTFbMHgwMDAwMV07ICAgICAgICAgICAvKiBFbmFibGVzIGNvdW50aW5nIG9mIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2UgY291bnRlciAqLworICAgIHBzZXVkb19iaXRfdAllMlsweDAwMDAxXTsgICAgICAgICAgIC8qIEVuYWJsZXMgY291bnRpbmcgb2YgcmVzcGVjdGl2ZSBwZXJmb3JtYW5jZSBjb3VudGVyICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcjBbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiB3cml0dGVuIHRvIGFzICcxIC0gcmVzZXRzIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2UgY291bnRlciwgaWYgd3JpdHRlbiB0byBheiAnMCAtIG5vIGNoYW5nZSB0byBtYXR0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcjFbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiB3cml0dGVuIHRvIGFzICcxIC0gcmVzZXRzIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2UgY291bnRlciwgaWYgd3JpdHRlbiB0byBheiAnMCAtIG5vIGNoYW5nZSB0byBtYXR0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcjJbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiB3cml0dGVuIHRvIGFzICcxIC0gcmVzZXRzIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2UgY291bnRlciwgaWYgd3JpdHRlbiB0byBheiAnMCAtIG5vIGNoYW5nZSB0byBtYXR0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAlpMFsweDAwMDAxXTsgICAgICAgICAgIC8qIEludGVycnVwdCBlbmFibGUgb24gcmVzcGVjdGl2ZSBjb3VudGVyIG92ZXJmbG93LiAnMSAtIGludGVycnVwdCBlbmFibGVkLCAnMCAtIGludGVycnVwdCBkaXNhYmxlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJaTFbMHgwMDAwMV07ICAgICAgICAgICAvKiBJbnRlcnJ1cHQgZW5hYmxlIG9uIHJlc3BlY3RpdmUgY291bnRlciBvdmVyZmxvdy4gJzEgLSBpbnRlcnJ1cHQgZW5hYmxlZCwgJzAgLSBpbnRlcnJ1cHQgZGlzYWJsZWQuICovCisgICAgcHNldWRvX2JpdF90CWkyWzB4MDAwMDFdOyAgICAgICAgICAgLyogSW50ZXJydXB0IGVuYWJsZSBvbiByZXNwZWN0aXZlIGNvdW50ZXIgb3ZlcmZsb3cuICcxIC0gaW50ZXJydXB0IGVuYWJsZWQsICcwIC0gaW50ZXJydXB0IGRpc2FibGVkLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CWYwWzB4MDAwMDFdOyAgICAgICAgICAgLyogT3ZlcmZsb3cgZmxhZy4gSWYgc2V0LCBvdmVyZmxvdyBvY2N1cnJlZCBvbiByZXNwZWN0aXZlIGNvdW50ZXIuIENsZWFyZWQgaWYgd3JpdHRlbiB0byBhcyAnMSAqLworICAgIHBzZXVkb19iaXRfdAlmMVsweDAwMDAxXTsgICAgICAgICAgIC8qIE92ZXJmbG93IGZsYWcuIElmIHNldCwgb3ZlcmZsb3cgb2NjdXJyZWQgb24gcmVzcGVjdGl2ZSBjb3VudGVyLiBDbGVhcmVkIGlmIHdyaXR0ZW4gdG8gYXMgJzEgKi8KKyAgICBwc2V1ZG9fYml0X3QJZjJbMHgwMDAwMV07ICAgICAgICAgICAvKiBPdmVyZmxvdyBmbGFnLiBJZiBzZXQsIG92ZXJmbG93IG9jY3VycmVkIG9uIHJlc3BlY3RpdmUgY291bnRlci4gQ2xlYXJlZCBpZiB3cml0dGVuIHRvIGFzICcxICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJZXZfY250MVsweDAwMDA1XTsgICAgICAvKiBTcGVjaWZpZXMgZXZlbnQgdG8gYmUgY291bnRlZCBieSBFdmVudF9jb3VudGVyMSBTZWUgWFhYIGZvciBldmVudHMnIGRlZmluaXRpb24uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJZXZfY250MlsweDAwMDA1XTsgICAgICAvKiBTcGVjaWZpZXMgZXZlbnQgdG8gYmUgY291bnRlZCBieSBFdmVudF9jb3VudGVyMiBTZWUgWFhYIGZvciBldmVudHMnIGRlZmluaXRpb24uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDAzXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNsb2NrX2NvdW50ZXJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlldmVudF9jb3VudGVyMVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWV2ZW50X2NvdW50ZXIyWzB4MDAwMjBdOy8qIFJlYWQvd3JpdGUgZXZlbnQgY291bnRlciwgY291bnRpbmcgZXZlbnRzIHNwZWNpZmllZCBieSBFdkNudGwgYW5kIEV2Q250MiBmaWVsZHMgcmVwc2VjdGl2ZWx5LiBXaGVuIHRoZSBldmVudCBjb3VudGVyIHJlYWNoZXMgaXMgbWF4aW11bSB2YWx1ZSBvZiAweEZGRkZGRiwgdGhlIG5leHQgZXZlbnQgd2lsbCBjYXVzZSBpdCB0byByb2xsIG92ZXIgdG8gemVybywgc2V0IEYxIG9yIEYyIGJpdCByZXNwZWN0aXZlbHkgYW5kIGdlbmVyYXRlIGludGVycnVwdCBieSBJMSBJMiBiaXQgcmVzcGVjdGl2ZWx5LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNTFggV1FFIHNlZ21lbnQgZm9ybWF0ICovCisKK3N0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfY3RybF9tbHhfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CW9wY29kZVsweDAwMDA1XTsgICAgICAgLyogbXVzdCBiZSAweEEgPSBTRU5EICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDFhXTsKKyAgICBwc2V1ZG9fYml0X3QJb3duZXJbMHgwMDAwMV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlkc1sweDAwMDA2XTsgICAgICAgICAgIC8qIERlc2NyaXB0b3IgU2l6ZSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAxYV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlmbFsweDAwMDAxXTsgICAgICAgICAgIC8qIEZvcmNlIExvb3BCYWNrICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJY1sweDAwMDAyXTsgICAgICAgICAgICAvKiBDcmVhdGUgQ1FFIChmb3IgInJlcXVlc3RlZCBzaWduYWxsaW5nIiBRUCkgKi8KKyAgICBwc2V1ZG9fYml0X3QJaWNyY1sweDAwMDAxXTsgICAgICAgICAvKiBsYXN0IGR3b3JkIG9mIHRoZSBwYWNrZXQ6IDAgLSBDYWxjdWxhdGUgSUNSQyBhbmQgcHV0IGl0IGluc3RlYWQgb2YgbGFzdCBkd29yZC4gMSAtIExlYXZlIGxhc3QgZHdvcmQgYXMgaXMuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJc2xbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CW1heF9zdGF0cmF0ZVsweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJc2xyWzB4MDAwMDFdOyAgICAgICAgICAvKiAwPSB0YWtlIHNsaWQgZnJvbSBwb3J0LiAxPSB0YWtlIHNsaWQgZnJvbSBnaXZlbiBoZWFkZXJzICovCisgICAgcHNldWRvX2JpdF90CXYxNVsweDAwMDAxXTsgICAgICAgICAgLyogU2VuZCBwYWNrZXQgb3ZlciBWTDE1ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDBlXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJcmxpZFsweDAwMDEwXTsgICAgICAgICAvKiBEZXN0aW5hdGlvbiBMSUQgKG11c3QgbWF0Y2ggZ2l2ZW4gaGVhZGVycykgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogU2VuZCBXUUUgc2VnbWVudCBmb3JtYXQgKi8KKworc3RydWN0IGhlcm1vbnBybV9zZW5kX3dxZV9zZWdtZW50X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfY3RybF9zZW5kX3N0CXdxZV9zZWdtZW50X2N0cmxfc2VuZDsvKiBTZW5kIHdxZSBzZWdtZW50IGN0cmwgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9yZF9zdAl3cWVfc2VnbWVudF9yZDsvKiBTZW5kIHdxZSBzZWdtZW50IHJkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfdWRfc3QJd3FlX3NlZ21lbnRfdWQ7LyogU2VuZCB3cWUgc2VnbWVudCB1ZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3dxZV9zZWdtZW50X2JpbmRfc3QJd3FlX3NlZ21lbnRfYmluZDsvKiBTZW5kIHdxZSBzZWdtZW50IGJpbmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMTgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9yZW1vdGVfYWRkcmVzc19zdAl3cWVfc2VnbWVudF9yZW1vdGVfYWRkcmVzczsvKiBTZW5kIHdxZSBzZWdtZW50IHJlbW90ZSBhZGRyZXNzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfYXRvbWljX3N0CXdxZV9zZWdtZW50X2F0b21pYzsvKiBTZW5kIHdxZSBzZWdtZW50IGF0b21pYyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX2Zhc3RfcmVnaXN0cmF0aW9uX3NlZ21lbnRfc3QJZmFzdF9yZWdpc3RyYXRpb25fc2VnbWVudDsvKiBGYXN0IFJlZ2lzdHJhdGlvbiBTZWdtZW50ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fbG9jYWxfaW52YWxpZGF0ZV9zZWdtZW50X3N0CWxvY2FsX2ludmFsaWRhdGVfc2VnbWVudDsvKiBsb2NhbCBpbnZhbGlkYXRlIHNlZ21lbnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9kYXRhX3B0cl9zdAl3cWVfc2VnbWVudF9kYXRhX3B0cjsvKiBTZW5kIHdxZSBzZWdtZW50IGRhdGEgcHRyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfZGF0YV9pbmxpbmVfc3QJd3FlX3NlZ21lbnRfZGF0YV9pbmxpbmU7LyogU2VuZCB3cWUgc2VnbWVudCBkYXRhIGlubGluZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAyMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBRUCBhbmQgRUUgQ29udGV4dCBFbnRyeSAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3F1ZXVlX3BhaXJfZWVfY29udGV4dF9lbnRyeV9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJcG1fc3RhdGVbMHgwMDAwMl07ICAgICAvKiBQYXRoIG1pZ3JhdGlvbiBzdGF0ZSAoTWlncmF0ZWQsIEFybWVkIG9yIFJlYXJtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExLU1pZ3JhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAtQXJtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMS1SZWFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLVJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIHNldCB0byAxMSBmb3IgVUQgUVBzIGFuZCBmb3IgUVBzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IEFQTSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAwM107CisgICAgcHNldWRvX2JpdF90CXN0WzB4MDAwMDRdOyAgICAgICAgICAgLyogVHJhbnNwb3J0IFNlcnZpY2UgVHlwZTogUkM6IDAsIFVDOiAxLCBSRDogMiwgVUQ6IDMsIEZDTU5EOjQsIEZFWENIOjUsIFNSQzo2LCBNTFggNywgUmF3IEV0aCAxMSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXN0YXRlWzB4MDAwMDRdOyAgICAgICAgLyogUVAvRUUgc3RhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIFJTVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBJTklUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIFJUUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSBSVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IC0gU1FFcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgLSBTUUQgKFNlbmQgUXVldWUgRHJhaW5lZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IC0gRVJSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAtIFNlbmQgUXVldWUgRHJhaW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IC0gUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5IC0gU3VzcGVuZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS0gRiAtIFJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZhbGlkIGZvciBRVUVSWV9RUEVFIGFuZCBFUlIyUlNUX1FQRUUgY29tbWFuZHMgb25seSkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBkWzB4MDAwMThdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDZbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CXJsa3lbMHgwMDAwMV07ICAgICAgICAgLyogV2hlbiBzZXQgdGhpcyBRUCBjYW4gdXNlIHRoZSBSZXNlcnZlZCBMX0tleSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDdbMHgwMDAwM107CisgICAgcHNldWRvX2JpdF90CWxvZ19zcV9zdHJpZGVbMHgwMDAwM107LyogU3RyaWRlIG9uIHRoZSBzZW5kIHF1ZXVlLiBXUSBlbnRyeSBpcyAxNiooMl5sb2dfU1Ffc3RyaWRlKSBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpZGUgbXVzdCBiZSBlcXVhbCBvciBiaWdnZXIgdGhlbiA2NCBieXRlcyAobWluaW11bSBsb2dfUlFfc3RyaWRlIHZhbHVlIGFsbG93ZWQgaXMgMikuICovCisgICAgcHNldWRvX2JpdF90CWxvZ19zcV9zaXplWzB4MDAwMDRdOyAgLyogTG9nMiBvZiB0aGUgTnVtYmVyIG9mIFdRRXMgaW4gdGhlIFNlbmQgUXVldWUuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOFsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX3JxX3N0cmlkZVsweDAwMDAzXTsvKiBTdHJpZGUgb24gdGhlIHJlY2VpdmUgcXVldWUuIFdRIGVudHJ5IGlzIDE2KigyXmxvZ19SUV9zdHJpZGUpIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlkZSBtdXN0IGJlIGVxdWFsIG9yIGJpZ2dlciB0aGVuIDY0IGJ5dGVzIChtaW5pbXVtIGxvZ19SUV9zdHJpZGUgdmFsdWUgYWxsb3dlZCBpcyAyKS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX3JxX3NpemVbMHgwMDAwNF07ICAvKiBMb2cyIG9mIHRoZSBOdW1iZXIgb2YgV1FFcyBpbiB0aGUgUmVjZWl2ZSBRdWV1ZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAltc2dfbWF4WzB4MDAwMDVdOyAgICAgIC8qIE1heCBtZXNzYWdlIHNpemUgYWxsb3dlZCBvbiB0aGUgUVAuIE1heGltdW0gbWVzc2FnZSBzaXplIGlzIDJebXNnX01heC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGVxdWFsIHRvIE1UVSBmb3IgVUQgYW5kIE1MWCBRUHMuICovCisgICAgcHNldWRvX2JpdF90CW10dVsweDAwMDAzXTsgICAgICAgICAgLyogTVRVIG9mIHRoZSBRUCAoTXVzdCBiZSB0aGUgc2FtZSBmb3IgYm90aCBwYXRoczogcHJpbWFyeSBhbmQgYWx0ZXJuYXRpdmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MSAtIDI1NiBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MiAtIDUxMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MyAtIDEwMjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQgLSAyMDQ4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgLSByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCBiZSBjb25maWd1cmVkIHRvIDB4NCBmb3IgVUQgYW5kIE1MWCBRUHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl1c3JfcGFnZVsweDAwMDE4XTsgICAgIC8qIFVBUiBudW1iZXIgdG8gcmluZyBkb29yYmVsbHMgZm9yIHRoaXMgUVAgKGFsaWFzZWQgdG8gZG9vcmJlbGwgYW5kIEJsdWUgRmxhbWUgcGFnZXMpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTBbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2NhbF9xcG5fZWVuWzB4MDAwMThdOy8qIExvY2FsIFFQL0VFIG51bWJlciBMb3dlciBiaXRzIGRldGVybWluZSBwb3NpdGlvbiBvZiB0aGlzIHJlY29yZCBpbiBRUEMgdGFibGUsIGFuZCAtIHRodXMgLSBjb25zdHJhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgdmFsaWQgZm9yIFFVRVJZIGFuZCBFUlIyUlNUIGNvbW1hbmRzIG9ubHkuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZW1vdGVfcXBuX2VlblsweDAwMDE4XTsvKiBSZW1vdGUgUVAvRUUgbnVtYmVyICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTJbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fYWRkcmVzc19wYXRoX3N0CXByaW1hcnlfYWRkcmVzc19wYXRoOy8qIFByaW1hcnkgYWRkcmVzcyBwYXRoIGZvciB0aGUgUVAvRUUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9hZGRyZXNzX3BhdGhfc3QJYWx0ZXJuYXRpdmVfYWRkcmVzc19wYXRoOy8qIEFsdGVybmF0ZSBhZGRyZXNzIHBhdGggZm9yIHRoZSBRUC9FRSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxM1sweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNFsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNVsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJY3VyX3JldHJ5X2NudFsweDAwMDAzXTsvKiBDdXJyZW50IHRyYW5zcG9ydCByZXRyeSBjb3VudGVyIChRVUVSWV9RUEVFIG9ubHkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjdXJyZW50IHRyYW5zcG9ydCByZXRyeSBjb3VudGVyIGNhbiB2YXJ5IGZyb20gcmV0cnlfY291bnQgZG93biB0byAxLCB3aGVyZSAxIG1lYW5zIHRoYXQgdGhlIGxhc3QgcmV0cnkgYXR0ZW1wdCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLiAqLworICAgIHBzZXVkb19iaXRfdAljdXJfcm5yX3JldHJ5WzB4MDAwMDNdOy8qIEN1cnJlbnQgUk5SIHJldHJ5IGNvdW50ZXIgKFFVRVJZX1FQRUUgb25seSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGN1cnJlbnQgUk5SIHJldHJ5IGNvdW50ZXIgY2FuIHZhcnkgZnJvbSBybnJfcmV0cnkgdG8gMSwgd2hlcmUgMSBtZWFucyB0aGF0IHRoZSBsYXN0IHJldHJ5IGF0dGVtcHQgaXMgY3VycmVudGx5IGV4ZWN1dGluZy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZnJlWzB4MDAwMDFdOyAgICAgICAgICAvKiBGYXN0IFJlZ2lzdHJhdGlvbiBXb3JrIFJlcXVlc3QgRW5hYmxlZC4gKFJlc2VydmVkIGZvciBFRSkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNlsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcm5yX3JldHJ5WzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAlyZXRyeV9jb3VudFsweDAwMDAzXTsgIC8qIFRyYW5zcG9ydCB0aW1lb3V0IFJldHJ5IGNvdW50ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTdbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CXNyYV9tYXhbMHgwMDAwM107ICAgICAgLyogTWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgUkRNQS1yZWFkL0F0b21pYyBvcGVyYXRpb25zIGFsbG93ZWQgaW4gdGhlIHNlbmQgcXVldWUuIE1heGltdW0gbnVtYmVyIGlzIDJeU1JBX01heC4gTXVzdCBiZSB6ZXJvIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMThbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CWFja19yZXFfZnJlcVsweDAwMDA0XTsgLyogQUNLIHJlcXVpcmVkIGZyZXF1ZW5jeS4gQUNLIHJlcXVpcmVkIGJpdCB3aWxsIGJlIHNldCBpbiBldmVyeSAyXkFja1JlcUZyZXEgcGFja2V0cyBhdCBsZWFzdC4gTm90IHZhbGlkIGZvciBSRCBRUC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAluZXh0X3NlbmRfcHNuWzB4MDAwMThdOy8qIE5leHQgUFNOIHRvIGJlIHNlbnQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyMFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNxbl9zbmRbMHgwMDAxOF07ICAgICAgLyogQ1EgbnVtYmVyIGNvbXBsZXRpb25zIGZyb20gdGhlIHNlbmQgcXVldWUgdG8gYmUgcmVwb3J0ZWQgdG8uIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIyWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbGFzdF9hY2tlZF9wc25bMHgwMDAxOF07LyogVGhlIGxhc3QgYWNrbm93bGVkZ2VkIFBTTiBmb3IgdGhlIHJlcXVlc3RlciAoUVVFUllfUVBFRSBvbmx5KSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIzWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3NuWzB4MDAwMThdOyAgICAgICAgICAvKiBSZXF1ZXN0ZXIgU2VuZCBTZXF1ZW5jZSBOdW1iZXIgKFFVRVJZX1FQRUUgb25seSkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyNFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjVbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CXJpY1sweDAwMDAxXTsgICAgICAgICAgLyogSW52YWxpZCBDcmVkaXRzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gcGxhY2UgIkludmFsaWQgQ3JlZGl0cyIgdG8gQUNLcyBzZW50IGZyb20gdGhpcyBxdWV1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gQUNLcyByZXBvcnQgdGhlIGFjdHVhbCBudW1iZXIgb2YgZW5kIHRvIGVuZCBjcmVkaXRzIG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBzZXQgdG8gMSBvbiBRUHMgd2hpY2ggYXJlIGF0dGFjaGVkIHRvIFNSUS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyNlsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcGFnZV9vZmZzZXRbMHgwMDAwNl07ICAvKiBzdGFydCBhZGRyZXNzIG9mIHdxZXMgaW4gZmlyc3QgcGFnZSAoMTE6NiksIGJpdHMgWzU6MF0gcmVzZXJ2ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyN1sweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcmFlWzB4MDAwMDFdOyAgICAgICAgICAvKiBJZiBzZXQgLSBBdG9taWMgb3BlcmF0aW9ucyBlbmFibGVkLiBvbiByZWNlaXZlIHF1ZXVlLiBOb3QgdmFsaWQgKHJlc2VydmVkKSBpbiBFRSBjb250ZXh0LiAqLworICAgIHBzZXVkb19iaXRfdAlyd2VbMHgwMDAwMV07ICAgICAgICAgIC8qIElmIHNldCAtIFJETUEgLSB3cml0ZSBlbmFibGVkIG9uIHJlY2VpdmUgcXVldWUuIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJyZVsweDAwMDAxXTsgICAgICAgICAgLyogSWYgc2V0IC0gUkRNQSAtIHJlYWQgZW5hYmxlZCBvbiByZWNlaXZlIHF1ZXVlLiBOb3QgdmFsaWQgKHJlc2VydmVkKSBpbiBFRSBjb250ZXh0LiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI4WzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAlycmFfbWF4WzB4MDAwMDNdOyAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nIFJETUEtcmVhZC9BdG9taWMgb3BlcmF0aW9ucyBhbGxvd2VkIG9uIHJlY2VpdmUgcXVldWUgaXMgMl5SUkFfTWF4LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIDAgZm9yIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjlbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAluZXh0X3Jjdl9wc25bMHgwMDAxOF07IC8qIE5leHQgKGV4cGVjdGVkKSBQU04gb24gcmVjZWl2ZSAqLworICAgIHBzZXVkb19iaXRfdAltaW5fcm5yX25ha1sweDAwMDA1XTsgIC8qIE1pbmltdW0gUk5SIE5BSyB0aW1lciB2YWx1ZSAoVFRUVFQgZmllbGQgZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHRoZSBJQiBzcGVjIFZvbDEgOS43LjUuMi44KS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMFsweDAwMDAzXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNyY2RbMHgwMDAxMF07ICAgICAgICAgLyogU2NhbGFibGUgUmVsaWFibGUgQ29ubmVjdGlvbiBEb21haW4uIFZhbGlkIGZvciBTUkMgdHJhbnNwb3J0IHNlcnZpY2UgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMVsweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNxbl9yY3ZbMHgwMDAxOF07ICAgICAgLyogQ1EgbnVtYmVyIGNvbXBsZXRpb25zIGZyb20gcmVjZWl2ZSBxdWV1ZSB0byBiZSByZXBvcnRlZCB0by4gTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMlsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWRiX3JlY29yZF9hZGRyX2hbMHgwMDAyMF07LyogUVAgREIgUmVjb3JkIHBoeXNpY2FsIGFkZHJlc3MgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzNbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWRiX3JlY29yZF9hZGRyX2xbMHgwMDAxZV07LyogUVAgREIgUmVjb3JkIHBoeXNpY2FsIGFkZHJlc3MgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXFfa2V5WzB4MDAwMjBdOyAgICAgICAgLyogUV9LZXkgdG8gYmUgdmFsaWRhdGVkIGFnYWluc3QgcmVjZWl2ZWQgZGF0YWdyYW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIHNlbmQgZGF0YWdyYW1zLCBpZiBRX0tleVszMV0gc3BlY2lmaWVkIGluIHRoZSBXUUUgaXMgc2V0LCB0aGVuIHRoaXMgUV9LZXkgd2lsbCBiZSB0cmFuc21pdHRlZCBpbiB0aGUgb3V0Z29pbmcgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgdmFsaWQgKHJlc2VydmVkKSBpbiBFRSBjb250ZXh0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3JxblsweDAwMDE4XTsgICAgICAgICAvKiBTUlFOIC0gU2hhcmVkIFJlY2VpdmUgUXVldWUgTnVtYmVyIC0gc3BlY2lmaWVzIHRoZSBTUlEgbnVtYmVyIGZyb20gd2hpY2ggdGhlIFFQIGRlcXVldWVzIHJlY2VpdmUgZGVzY3JpcHRvcnMuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSUU4gaXMgdmFsaWQgb25seSBpZiBTUlEgYml0IGlzIHNldC4gTm90IHZhbGlkIChyZXNlcnZlZCkgaW4gRUUgY29udGV4dC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3JxWzB4MDAwMDFdOyAgICAgICAgICAvKiBTUlEgLSBTaGFyZWQgUmVjZWl2ZSBRdWV1ZS4gSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIHRoZSBRUCBpcyBhc3NvY2lhdGVkIHdpdGggYSBTUlEuIE5vdCB2YWxpZCAocmVzZXJ2ZWQpIGluIEVFIGNvbnRleHQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzRbMHgwMDAwN107CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlybXNuWzB4MDAwMThdOyAgICAgICAgIC8qIFJlc3BvbmRlciBjdXJyZW50IG1lc3NhZ2Ugc2VxdWVuY2UgbnVtYmVyIChRVUVSWV9RUEVFIG9ubHkpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzVbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV93cWVfY291bnRlclsweDAwMDEwXTsvKiBBIDE2Yml0cyBjb3VudGVyIHRoYXQgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggV1FFIHBvc3RlZCB0byB0aGUgU1EuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSAweDAgaW4gU1EgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFFVRVJZX1FQRUUgb25seSkuICovCisgICAgcHNldWRvX2JpdF90CXJxX3dxZV9jb3VudGVyWzB4MDAwMTBdOy8qIEEgMTZiaXRzIGNvdW50ZXIgdGhhdCBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBXUUUgcG9zdGVkIHRvIHRoZSBSUS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIDB4MCBpbiBSUSBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUVVFUllfUVBFRSBvbmx5KS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzZbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlybWNfcGFyZW50X3FwblsweDAwMDE4XTsvKiByZWxpYWJsZSBtdWx0aWNhc3QgcGFyZW50IHF1ZXVlIG51bWJlciAqLworICAgIHBzZXVkb19iaXRfdAloc1sweDAwMDAxXTsgICAgICAgICAgIC8qIEhlYWRlciBTZXBhcmF0aW9uLiBJZiBzZXQsIHRoZSBieXRlIGNvdW50IG9mIHRoZSBmaXJzdCBzY2F0dGVyIGVudHJ5IHdpbGwgYmUgaWdub3JlZC4gVGhlIGJ1ZmZlciBzcGVjaWZpZWQgYnkgdGhlIGZpcnN0IHNjYXR0ZXIgZW50cnkgd2lsbCBjb250YWluIHBhY2tldCBoZWFkZXJzICh1cCB0byBUQ1ApLiBDUUUgd2lsbCByZXBvcnQgbnVtYmVyIG9mIGJ5dGVzIHNjYXR0ZXJlZCB0byB0aGUgZmlyc3Qgc2NhdHRlciBlbnRyeS4gSW50ZW5kZWQgZm9yIHVzZSBvbiBJUG92ZXJJQiBvbiBVRCBRUCBvciBSYXcgRXRoZXJuZXQgUVAuICovCisgICAgcHNldWRvX2JpdF90CWlzWzB4MDAwMDFdOyAgICAgICAgICAgLyogd2hlbiBzZXQgLSBpbmxpbmUgc2NhdHRlciBpcyBlbmFibGVkIGZvciB0aGlzIFJRICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzdbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CXJtZVsweDAwMDAyXTsgICAgICAgICAgLyogUmVsaWFibGUgTXVsdGljYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAgLSBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxIC0gcGFyZW50IFFQIChyZXF1ZXN0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgLSBjaGlsZCBRUCAocmVxdWVzdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExIC0gcmVzcG9uZGVyIFFQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IFJlbGlhYmxlIE11bHRpY2FzdCBpcyBhIHByZWxpbWluYXJ5IGRlZmluaXRpb24gd2hpY2ggY2FuIGJlIHN1YmplY3QgdG8gY2hhbmdlLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM4WzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlta2V5X3JtcFsweDAwMDAxXTsgICAgIC8qIElmIHNldCwgTUtleSB1c2VkIHRvIGFjY2VzcyBUUFQgZm9yIGluY29taW5nIFJETUEtd3JpdGUgcmVxdWVzdCBpcyBjYWxjdWxhdGVkIGJ5IGFkZGluZyBNS2V5IGZyb20gdGhlIHBhY2tldCB0byBiYXNlX01LZXkgZmllbGQgaW4gdGhlIFFQQy4gQ2FuIGJlIHNldCBvbmx5IGZvciBRUHMgdGhhdCBhcmUgbm90IHRhcmdldCBmb3IgUkRNQS1yZWFkIHJlcXVlc3QuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAliYXNlX21rZXlbMHgwMDAxOF07ICAgIC8qIEJhc2UgTWtleSBiaXRzIFszMTo4XS4gTG93ZXIgOCBiaXRzIG11c3QgYmUgemVyby4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbnVtX3JtY19wZWVyc1sweDAwMDA4XTsvKiBOdW1iZXIgb2YgcmVtb3RlIHBlZXJzIGluIFJlbGlhYmxlIE11bHRpY2FzdCBncm91cCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXR0X2Jhc2VfYWRkcl9oWzB4MDAwMDhdOy8qIE1UVCBCYXNlIEFkZHJlc3MgWzM5OjMyXSBpbiBJQ00gcmVsYXRpdmUgdG8gSU5JVF9IQ0EubXR0X2Jhc2VfYWRkciAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM5WzB4MDAwMTBdOworICAgIHBzZXVkb19iaXRfdAlsb2cyX3BhZ2Vfc2l6ZVsweDAwMDA2XTsvKiBMb2cgKGJhc2UgMikgb2YgTVRUIHBhZ2Ugc2l6ZSBpbiB1bml0cyBvZiA0S0J5dGUgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0MFsweDAwMDAyXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDFbMHgwMDAwM107CisgICAgcHNldWRvX2JpdF90CW10dF9iYXNlX2FkZHJfbFsweDAwMDFkXTsvKiBNVFQgQmFzZSBBZGRyZXNzIFszMTozXSBpbiBJQ00gcmVsYXRpdmUgdG8gSU5JVF9IQ0EubXR0X2Jhc2VfYWRkciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdmZ0X2xhblsweDAwMDBjXTsKKyAgICBwc2V1ZG9fYml0X3QJdmZ0X3ByaW9bMHgwMDAwM107ICAgICAvKiBUaGUgUHJpb3JpdHkgZmlsZWQgaW4gdGhlIFZGVCBoZWFkZXIgZm9yIEZDUCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQyWzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAljc19jdGxbMHgwMDAwOV07ICAgICAgIC8qIFRoZSBQcmlvcml0eSBmaWxlZCBpbiB0aGUgVkZUIGhlYWRlciBmb3IgRkNQICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDNbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CXZlWzB4MDAwMDFdOyAgICAgICAgICAgLyogU2hvdWxkIHdlIGFkZC9jaGVjayB0aGUgVkZUIGhlYWRlciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXhjaF9iYXNlWzB4MDAwMTBdOyAgICAvKiBGb3IgaW5pdCBRUCBvbmx5IC0gVGhlIGJhc2UgZXhjaGFuZ2VzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDRbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CWV4Y2hfc2l6ZVsweDAwMDA0XTsgICAgLyogRm9yIENNTUQgUVAgb25seSAtIFRoZSBzaXplIChmcm9tIGJhc2UpIGV4Y2hhbmdlcyBpcyAyZXhjaGFuZ2VzX3NpemUgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0NVsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJZmNbMHgwMDAwMV07ICAgICAgICAgICAvKiBXaGVuIHNldCBpdCBtZWFuIHRoYXQgdGhpcyBRUCBpcyB1c2VkIGZvciBGSUJSRSBDSEFOTkVMLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVtb3RlX2lkWzB4MDAwMThdOyAgICAvKiBQZWVyIE5YIHBvcnQgSUQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0NlsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWZjcF9tdHVbMHgwMDAwYV07ICAgICAgLyogSW4gNCpCeXRlcyB1bml0cy4gVGhlIE1UVSBTaXplICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDdbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CW15X2lkX2luZHhbMHgwMDAwOF07ICAgLyogSW5kZXggdG8gTXkgTlggcG9ydCBJRCB0YWJsZSAqLworICAgIHBzZXVkb19iaXRfdAl2ZnRfaG9wX2NvdW50WzB4MDAwMDhdOy8qIEhvcENudCB2YWx1ZSBmb3IgdGhlIFZGVCBoZWFkZXIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDhbMHgwMDBjMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qICAqLworCitzdHJ1Y3QgaGVybW9ucHJtX21jZ19xcF9kd19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcXBuWzB4MDAwMThdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CWJsY2tfbGJbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDAxXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogQ2xlYXIgSW50ZXJydXB0IFs2MzowXSAgICAgICAgICAgICAgIyMjIyBtaWNoYWwgLSBtYXRjaCB0byBQUk0gKi8KKworc3RydWN0IGhlcm1vbnBybV9jbHJfaW50X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAljbHJfaW50X2hbMHgwMDAyMF07ICAgIC8qIENsZWFyIEludGVycnVwdCBbNjM6MzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGUgdHJhbnNhY3Rpb25zIHRvIHRoaXMgcmVnaXN0ZXIgd2lsbCBjbGVhciAoZGUtYXNzZXJ0KSB0aGUgdmlydHVhbCBpbnRlcnJ1cHQgb3V0cHV0IHBpbnMgb2YgSW5maW5pSG9zdC1JSUktRVguIFRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGluIHRoaXMgcmVnaXN0ZXIgaXMgb2J0YWluZWQgYnkgZXhlY3V0aW5nIFFVRVJZX0FEQVBURVIgY29tbWFuZCBvbiBjb21tYW5kIGludGVyZmFjZSBhZnRlciBzeXN0ZW0gYm9vdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyByZWdpc3RlciBpcyB3cml0ZS1vbmx5LiBSZWFkaW5nIGZyb20gdGhpcyByZWdpc3RlciB3aWxsIGNhdXNlIHVuZGVmaW5lZCByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNscl9pbnRfbFsweDAwMDIwXTsgICAgLyogQ2xlYXIgSW50ZXJydXB0IFszMTowXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIHRyYW5zYWN0aW9ucyB0byB0aGlzIHJlZ2lzdGVyIHdpbGwgY2xlYXIgKGRlLWFzc2VydCkgdGhlIHZpcnR1YWwgaW50ZXJydXB0IG91dHB1dCBwaW5zIG9mIEluZmluaUhvc3QtSUlJLUVYLiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGlzIHJlZ2lzdGVyIGlzIG9idGFpbmVkIGJ5IGV4ZWN1dGluZyBRVUVSWV9BREFQVEVSIGNvbW1hbmQgb24gY29tbWFuZCBpbnRlcmZhY2UgYWZ0ZXIgc3lzdGVtIGJvb3QuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcmVnaXN0ZXIgaXMgd3JpdGUtb25seS4gUmVhZGluZyBmcm9tIHRoaXMgcmVnaXN0ZXIgd2lsbCBjYXVzZSB1bmRlZmluZWQgcmVzdWx0ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEVRIFNldCBDSSBEQnMgVGFibGUgKi8KKworc3RydWN0IGhlcm1vbnBybV9lcV9zZXRfY2lfdGFibGVfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWVxMF9zZXRfY2lbMHgwMDAyMF07ICAgLyogRVEwX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXExX3NldF9jaVsweDAwMDIwXTsgICAvKiBFUTFfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTJfc2V0X2NpWzB4MDAwMjBdOyAgIC8qIEVRMl9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxM19zZXRfY2lbMHgwMDAyMF07ICAgLyogRVEzX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE0X3NldF9jaVsweDAwMDIwXTsgICAvKiBFUTRfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTVfc2V0X2NpWzB4MDAwMjBdOyAgIC8qIEVRNV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNl9zZXRfY2lbMHgwMDAyMF07ICAgLyogRVE2X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE3X3NldF9jaVsweDAwMDIwXTsgICAvKiBFUTdfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcThfc2V0X2NpWzB4MDAwMjBdOyAgIC8qIEVROF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxOV9zZXRfY2lbMHgwMDAyMF07ICAgLyogRVE5X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXExMF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTEwX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMTFfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVExMV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTEyX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMTJfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXExM19zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTEzX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxM1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMTRfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVExNF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTE1X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMTVfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXExNl9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTE2X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMTdfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVExN19TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTE4X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMThfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE4WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXExOV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTE5X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxOVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMjBfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEyMF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTIxX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMjFfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEyMl9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTIyX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyMlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMjNfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEyM19TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTI0X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMjRfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEyNV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTI1X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyNVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMjZfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEyNl9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjZbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTI3X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMjdfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI3WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEyOF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTI4X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyOFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMjlfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEyOV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTMwX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMzBfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDMwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEzMV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTMxX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMzJfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEzMl9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTMzX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMzNfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDMzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEzNF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTM0X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzNFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMzVfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEzNV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTM2X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMzZfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXEzN19zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTM3X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzN1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxMzhfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVEzOF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzhbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTM5X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRMzlfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE0MF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTQwX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0MFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNDFfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE0MV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTQyX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNDJfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE0M19zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTQzX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0M1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNDRfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE0NF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTQ1X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNDVfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQ1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE0Nl9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTQ2X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0NlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNDdfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE0N19TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTQ4X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNDhfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQ4WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE0OV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTQ5X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0OVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNTBfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE1MF9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTUxX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNTFfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDUxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE1Ml9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTUyX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1MlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNTNfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE1M19TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTU0X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNTRfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU0WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE1NV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTU1X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1NVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNTZfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE1Nl9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTZbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTU3X3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNTdfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU3WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE1OF9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTU4X1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1OFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNTlfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE1OV9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTYwX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNjBfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDYwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXE2MV9zZXRfY2lbMHgwMDAyMF07ICAvKiBFUTYxX1NldF9DSSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2MVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVxNjJfc2V0X2NpWzB4MDAwMjBdOyAgLyogRVE2Ml9TZXRfQ0kgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNjJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcTYzX3NldF9jaVsweDAwMDIwXTsgIC8qIEVRNjNfU2V0X0NJICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDYzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBJbmZpbmlIb3N0LUlJSS1FWCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAgICAgIyMjIyBtaWNoYWwgLSBtYXRjaCB0byBQUk0gKi8KKworc3RydWN0IGhlcm1vbnBybV9jb25maWd1cmF0aW9uX3JlZ2lzdGVyc19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4NDAzNDAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9oY2FfY29tbWFuZF9yZWdpc3Rlcl9zdAloY2FfY29tbWFuZF9pbnRlcmZhY2VfcmVnaXN0ZXI7LyogSENBIENvbW1hbmQgUmVnaXN0ZXIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDNmY2IyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFFQX0RCX1JlY29yZCAgICAgICAgICMjIyBtaWNoYWwgPSBnZHJvciBmaXhlZCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3FwX2RiX3JlY29yZF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVjZWl2ZV93cWVfY291bnRlclsweDAwMDEwXTsvKiBNb2R1bG8tNjRLIGNvdW50ZXIgb2YgV1FFcyBwb3N0ZWQgdG8gdGhlIFFQIHNpbmNlIGl0cyBjcmVhdGlvbi4gU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIHplcm8uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogQ1FfQVJNX0RCX1JlY29yZCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX2NxX2FybV9kYl9yZWNvcmRfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWNvdW50ZXJbMHgwMDAyMF07ICAgICAgLyogQ1EgY291bnRlciBmb3IgdGhlIGFybWluZyByZXF1ZXN0ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbWRbMHgwMDAwM107ICAgICAgICAgIC8qIDB4MCAtIE5vIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEgLSBSZXF1ZXN0IG5vdGlmaWNhdGlvbiBmb3IgbmV4dCBTb2xpY2l0ZWQgY29tcGxldGlvbiBldmVudC4gQ291bnRlciBmaWxlZCBzcGVjaWZpZXMgdGhlIGN1cnJlbnQgQ1EgQ29uc3VtZXIgQ291bnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIgLSBSZXF1ZXN0IG5vdGlmaWNhdGlvbiBmb3IgbmV4dCBTb2xpY2l0ZWQgb3IgVW5zb2xpY2l0ZWQgY29tcGxldGlvbiBldmVudC4gQ291bnRlciBmaWxlZCBzcGVjaWZpZXMgdGhlIGN1cnJlbnQgQ1EgQ29uc3VtZXIgY291bnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMgLSBSZXF1ZXN0IG5vdGlmaWNhdGlvbiBmb3IgbXVsdGlwbGUgY29tcGxldGlvbnMgKEFybS1OKS4gQ291bnRlciBmaWxlZCBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBDUSBJbmRleCB0aGF0IHdoZW4gcmVhY2hlZCBieSBIVyAoaS5lLiBIVyBnZW5lcmF0ZXMgYSBDUUUgaW50byB0aGlzIEluZGV4KSBFdmVudCB3aWxsIGJlIGdlbmVyYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyIC0gUmVzZXJ2ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJY21kX3NuWzB4MDAwMDJdOyAgICAgICAvKiBDb21tYW5kIFNlcXVlbmNlIE51bWJlciAtIFNlZSBUYWJsZSAzNSwgIkNRIERvb3JiZWxsIExheW91dCIgZm9yIGRlZmluaXRpb24gb2YgdGhpcyBmaWxlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNbMHgwMDAwM107ICAgICAgICAgIC8qIE11c3QgYmUgMHgyICovCisgICAgcHNldWRvX2JpdF90CWNxX251bWJlclsweDAwMDE4XTsgICAgLyogQ1EgbnVtYmVyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIENRX0NJX0RCX1JlY29yZCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX2NxX2NpX2RiX3JlY29yZF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJY291bnRlclsweDAwMDIwXTsgICAgICAvKiBDUSBjb3VudGVyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CXJlc1sweDAwMDAzXTsgICAgICAgICAgLyogTXVzdCBiZSAweDEgKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FfbnVtYmVyWzB4MDAwMThdOyAgICAvKiBDUSBudW1iZXIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogVmlydHVhbF9QaHlzaWNhbF9NYXBwaW5nICovCisKK3N0cnVjdCBoZXJtb25wcm1fdmlydHVhbF9waHlzaWNhbF9tYXBwaW5nX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAl2YV9oWzB4MDAwMjBdOyAgICAgICAgIC8qIFZpcnR1YWwgQWRkcmVzc1s2MzozMl0uIFZhbGlkIG9ubHkgZm9yIE1BUF9JQ00gY29tbWFuZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDBjXTsKKyAgICBwc2V1ZG9fYml0X3QJdmFfbFsweDAwMDE0XTsgICAgICAgICAvKiBWaXJ0dWFsIEFkZHJlc3NbMzE6MTJdLiBWYWxpZCBvbmx5IGZvciBNQVBfSUNNIGNvbW1hbmQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlwYV9oWzB4MDAwMjBdOyAgICAgICAgIC8qIFBoeXNpY2FsIEFkZHJlc3NbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2cyc2l6ZVsweDAwMDA2XTsgICAgIC8qIExvZzIgb2YgdGhlIHNpemUgaW4gNEtCIHBhZ2VzIG9mIHRoZSBwaHlzaWNhbCBhbmQgdmlydHVhbCBjb250aWd1b3VzIG1lbW9yeSB0aGF0IHN0YXJ0cyBhdCBQQV9ML0ggYW5kIFZBX0wvSCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CXBhX2xbMHgwMDAxNF07ICAgICAgICAgLyogUGh5c2ljYWwgQWRkcmVzc1szMToxMl0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogTU9EX1NUQVRfQ0ZHICAgICAgICAgICAgIyMjIyBtaWNoYWwgLSBnZHJvciBmaXggKi8KKworc3RydWN0IGhlcm1vbnBybV9tb2Rfc3RhdF9jZmdfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJcnhfb3B0aW9uc1sweDAwMDA0XTsgICAvKiBudW1iZXIgb2YgUlggb3B0aW9ucyB0byBzd2VlcCB3aGVuIGRvaW5nIFNlckRlcyBwYXJhbWV0ZXJzIEF1dG9OZWdvdGlhdGlvbi4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAlyeF9vcHRpb25zX21bMHgwMDAwMV07IC8qIE1vZGlmeSByeF9vcHRpb25zICovCisgICAgcHNldWRvX2JpdF90CXR4X29wdGlvbnNbMHgwMDAwNF07ICAgLyogbnVtYmVyIG9mIFRYIG9wdGlvbnMgdG8gc3dlZXAgd2hlbiBkb2luZyBTZXJEZXMgcGFyYW1ldGVycyBBdXRvTmVnb3RpYXRpb24uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJdHhfb3B0aW9uc19tWzB4MDAwMDFdOyAvKiBNb2RpZnkgdHhfb3B0aW9ucyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcHJlX2FtcFsweDAwMDA0XTsgICAgICAvKiBQcmUgQW1wbGl0dWRlICovCisgICAgcHNldWRvX2JpdF90CXByZV9lbXBfcHJlX2FtcFsweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJcHJlX2VtcF9vdXRbMHgwMDAwNF07ICAvKiBQcmUgRW1waGFzaXMgT3V0ICovCisgICAgcHNldWRvX2JpdF90CXZvbHRhZ2VbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CWVxdVsweDAwMDA0XTsgICAgICAgICAgLyogRXF1YWxpemF0aW9uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDBiXTsKKyAgICBwc2V1ZG9fYml0X3QJc2VyZGVzX21bMHgwMDAwMV07ICAgICAvKiBNb2RpZnkgc2VyZGVzIHBhcmFtZXRlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxpZFsweDAwMDEwXTsgICAgICAgICAgLyogZGVmYXVsdCBMSUQgKi8KKyAgICBwc2V1ZG9fYml0X3QJbGlkX21bMHgwMDAwMV07ICAgICAgICAvKiBNb2RpZnkgZGVmYXVsdCBMSUQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1WzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAlwb3J0X2VuWzB4MDAwMDFdOyAgICAgIC8qIGVuYWJsZSBwb3J0IChFX0tleSkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcG9ydF9lbl9tWzB4MDAwMDFdOyAgICAvKiBNb2RpZnkgIHBvcnRfZW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwMGFdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwMWZdOworICAgIHBzZXVkb19iaXRfdAlndWlkX2hpX21bMHgwMDAwMV07ICAgIC8qIE1vZGlmeSBndWlkX2hpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlndWlkX2hpWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAwMWZdOworICAgIHBzZXVkb19iaXRfdAlndWlkX2xvX21bMHgwMDAwMV07ICAgIC8qIE1vZGlmeSBndWlkX2xvICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlndWlkX2xvWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwMWZdOworICAgIHBzZXVkb19iaXRfdAlub2RlZ3VpZF9oaV9tWzB4MDAwMDFdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbm9kZWd1aWRfaGlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEwWzB4MDAwMWZdOworICAgIHBzZXVkb19iaXRfdAlub2RlZ3VpZF9sb19tWzB4MDAwMDFdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbm9kZWd1aWRfbG9bMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDExWzB4MDA2ODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBTUlEgQ29udGV4dCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3NycV9jb250ZXh0X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlzcnFuWzB4MDAwMThdOyAgICAgICAgIC8qIFNSUSBudW1iZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX3NycV9zaXplWzB4MDAwMDRdOyAvKiBMb2cyIG9mIHRoZSBOdW1iZXIgb2YgV1FFcyBpbiB0aGUgUmVjZWl2ZSBRdWV1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtIHZhbHVlIGlzIDB4MTAsIGkuZS4gMTZNIFdRRXMuICovCisgICAgcHNldWRvX2JpdF90CXN0YXRlWzB4MDAwMDRdOyAgICAgICAgLyogU1JRIFN0YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTEgLSBTVyBPd25lcnNoaXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMDAwIC0gSFcgT3duZXJzaGlwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAwMSAtIEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgb25seSBvbiBRVUVSWV9TUlEgYW5kIEhXMlNXX1NSUSBjb21tYW5kcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNyY19kb21haW5bMHgwMDAxMF07ICAgLyogVGhlIFNjYWxhYmxlIFJDIERvbWFpbi4gTWVzc2FnZXMgY29taW5nIHRvIHJlY2VpdmUgcG9ydHMgc3BlY2lmeWluZyB0aGlzIFNSUSBhcyByZWNlaXZlIHF1ZXVlIHdpbGwgYmUgc2VydmVkIG9ubHkgaWYgU1JDX0RvbWFpbiBvZiB0aGUgU1JRIG1hdGNoZXMgU1JDX0RvbWFpbiBvZiB0aGUgdHJhbnNwb3J0IFFQIG9mIHRoaXMgbWVzc2FnZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlsb2dfc3JxX3N0cmlkZVsweDAwMDAzXTsvKiBTdHJpZGUgKG1heCBXUUUgc2l6ZSkgb24gdGhlIHJlY2VpdmUgcXVldWUuIFdRIGVudHJ5IGlzIDE2KigyXmxvZ19SUV9zdHJpZGUpIGJ5dGVzLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwNV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljcW5bMHgwMDAxOF07ICAgICAgICAgIC8qIENvbXBsZXRpb24gUXVldWUgdG8gcmVwb3J0IFNSQyBtZXNzYWdlcyBkaXJlY3RlZCB0byB0aGlzIFNSUS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGFnZV9vZmZzZXRbMHgwMDAwNl07ICAvKiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBXUUUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIDRLYnl0ZSBwYWdlIChGaWd1cmUgNTIsk1dvcmsgUXVldWUgQnVmZmVyIFN0cnVjdHVyZZQpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDAyXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF9iYXNlX2FkZHJfaFsweDAwMDA4XTsvKiBNVFQgQmFzZSBBZGRyZXNzIFszOTozMl0gaW4gSUNNIHJlbGF0aXZlIHRvIElOSVRfSENBLm10dF9iYXNlX2FkZHIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMTBdOworICAgIHBzZXVkb19iaXRfdAlsb2cyX3BhZ2Vfc2l6ZVsweDAwMDA2XTsvKiBMb2cgKGJhc2UgMikgb2YgTVRUIHBhZ2Ugc2l6ZSBpbiB1bml0cyBvZiA0S0J5dGUgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1WzB4MDAwMDJdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAltdHRfYmFzZV9hZGRyX2xbMHgwMDAxZF07LyogTVRUIEJhc2UgQWRkcmVzcyBbMzE6M10gaW4gSUNNIHJlbGF0aXZlIHRvIElOSVRfSENBLm10dF9iYXNlX2FkZHIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBkWzB4MDAwMThdOyAgICAgICAgICAgLyogU1JRIHByb3RlY3Rpb24gZG9tYWluICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkN1sweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXdxZV9jbnRbMHgwMDAxMF07ICAgICAgLyogV1FFIGNvdW50IG9uIHRoZSBTUlEuIFZhbGlkIG9ubHkgdXBvbiBRVUVSWV9TUlEgYW5kIEhXMlNXX1NSUSBjb21tYW5kcy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbHdtWzB4MDAwMTBdOyAgICAgICAgICAvKiBMaW1pdCBXYXRlciBNYXJrIC0gaWYgdGhlIExXTSBpcyBub3QgemVybywgYW5kIHRoZSB3cWVfY250IGRyb3BzIGJlbG93IExXTSB3aGVuIGEgV1FFIGlzIGRlcXVldWVkIGZyb20gdGhlIFNSUSwgdGhlbiBhbiBTUlEgbGltaXQgZXZlbnQgaXMgZmlyZWQgYW5kIHRoZSBMV00gaXMgc2V0IHRvIHplcm8uIFZhbGlkIG9ubHkgdXBvbiBRVUVSWV9TUlEgYW5kIEhXMlNXX1NSUSBjb21tYW5kcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNycV93cWVfY291bnRlclsweDAwMDEwXTsvKiBBIDE2LWJpdCBjb3VudGVyIGluY3JlbWVudGVkIGZvciBlYWNoIFdRRSBwb3N0ZWQgdG8gdGhlIFNSUS4gTXVzdCBiZSAweDAgaW4gU1JRIGluaXRpYWxpemF0aW9uLiBWYWxpZCBvbmx5IHVwb24gdGhlIFFVRVJZX1NSUSBjb21tYW5kLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDhbMHgwMDAxMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDlbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlkYl9yZWNvcmRfYWRkcl9oWzB4MDAwMjBdOy8qIFNSUSBEQiBSZWNvcmQgcGh5c2ljYWwgYWRkcmVzcyBbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEwWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlkYl9yZWNvcmRfYWRkcl9sWzB4MDAwMWVdOy8qIFNSUSBEQiBSZWNvcmQgcGh5c2ljYWwgYWRkcmVzcyBbMzE6Ml0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogUEJMICovCisKK3N0cnVjdCBoZXJtb25wcm1fcGJsX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAltdHRfMF9oWzB4MDAwMjBdOyAgICAgIC8qIEZpcnN0IE1UVFs2MzozMl0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF8wX2xbMHgwMDAyMF07ICAgICAgLyogRmlyc3QgTVRUWzMxOjBdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltdHRfMV9oWzB4MDAwMjBdOyAgICAgIC8qIFNlY29uZCBNVFRbNjM6MzJdICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltdHRfMV9sWzB4MDAwMjBdOyAgICAgIC8qIFNlY29uZCBNVFRbMzE6MF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF8yX2hbMHgwMDAyMF07ICAgICAgLyogVGhpcmQgTVRUWzYzOjMyXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXR0XzJfbFsweDAwMDIwXTsgICAgICAvKiBUaGlyZCBNVFRbMzE6MF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF8zX2hbMHgwMDAyMF07ICAgICAgLyogRm91cnRoIE1UVFs2MzozMl0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF8zX2xbMHgwMDAyMF07ICAgICAgLyogRm91cnRoIE1UVFszMTowXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBQZXJmb3JtYW5jZSBDb3VudGVycyAgICMjIyMgbWljaGFsIC0gZ2Ryb3IgZml4ZWQgKi8KKworc3RydWN0IGhlcm1vbnBybV9wZXJmb3JtYW5jZV9jb3VudGVyc19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDA2MjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBUcmFuc3BvcnQgYW5kIENJIEVycm9yIENvdW50ZXJzICovCisKK3N0cnVjdCBoZXJtb25wcm1fdHJhbnNwb3J0X2FuZF9jaV9lcnJvcl9jb3VudGVyc19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX2xsZVsweDAwMDIwXTsgICAvKiBSZXNwb25kZXIgLSBudW1iZXIgb2YgbG9jYWwgbGVuZ3RoIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX2xsZVsweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgbG9jYWwgbGVuZ3RoIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX2xxcG9lWzB4MDAwMjBdOyAvKiBSZXNwb25kZXIgLSBudW1iZXIgbG9jYWwgUVAgb3BlcmF0aW9uIGVycm9yICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fbHFwb2VbMHgwMDAyMF07IC8qIFJlcXVlc3RlciAtIG51bWJlciBsb2NhbCBRUCBvcGVyYXRpb24gZXJyb3IgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV9sZWVvZVsweDAwMDIwXTsgLyogUmVzcG9uZGVyIC0gbnVtYmVyIGxvY2FsIEVFIG9wZXJhdGlvbiBlcnJvciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX2xlZW9lWzB4MDAwMjBdOyAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgbG9jYWwgRUUgb3BlcmF0aW9uIGVycm9yICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlycV9udW1fbHBlWzB4MDAwMjBdOyAgIC8qIFJlc3BvbmRlciAtIG51bWJlciBvZiBsb2NhbCBwcm90ZWN0aW9uIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX2xwZVsweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgbG9jYWwgcHJvdGVjdGlvbiBlcnJvcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV93cmZlWzB4MDAwMjBdOyAgLyogUmVzcG9uZGVyIC0gbnVtYmVyIG9mIENRRXMgd2l0aCBlcnJvci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgQ1FFIHdpdGggZXJyb3IgaXMgZ2VuZXJhdGVkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fd3JmZVsweDAwMDIwXTsgIC8qIFJlcXVlc3RlciAtIG51bWJlciBvZiBDUUVzIHdpdGggZXJyb3IuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGVkIGVhY2ggdGltZSBhIENRRSB3aXRoIGVycm9yIGlzIGdlbmVyYXRlZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX213YmVbMHgwMDAyMF07ICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgbWVtb3J5IHdpbmRvdyBiaW5kIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX2JyZVsweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgYmFkIHJlc3BvbnNlIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX2xhZVsweDAwMDIwXTsgICAvKiBSZXNwb25kZXIgLSBudW1iZXIgb2YgbG9jYWwgYWNjZXNzIGVycm9ycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX3JpcmVbMHgwMDAyMF07ICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgcmVtb3RlIGludmFsaWQgcmVxdWVzdCBlcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQUstSW52YWxpZCBSZXF1ZXN0IG9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFVuc3VwcG9ydGVkIE9wQ29kZTogUmVzcG9uZGVyIGRldGVjdGVkIGFuIHVuc3VwcG9ydGVkIE9wQ29kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBVbmV4cGVjdGVkIE9wQ29kZTogUmVzcG9uZGVyIGRldGVjdGVkIGFuIGVycm9yIGluIHRoZSBzZXF1ZW5jZSBvZiBPcENvZGVzLCBzdWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBtaXNzaW5nICJMYXN0IiBwYWNrZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogdGhlcmUgaXMgbm8gUFNOIGVycm9yLCB0aHVzIHRoaXMgZG9lcyBub3QgaW5kaWNhdGUgYSBkcm9wcGVkIHBhY2tldC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV9yaXJlWzB4MDAwMjBdOyAgLyogUmVzcG9uZGVyIC0gbnVtYmVyIG9mIHJlbW90ZSBpbnZhbGlkIHJlcXVlc3QgZXJyb3JzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BSyBtYXkgb3IgbWF5IG5vdCBiZSBzZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFFQIEFzeW5jIEFmZmlsaWF0ZWQgRXJyb3I6IFVuc3VwcG9ydGVkIG9yIFJlc2VydmVkIE9wQ29kZSAoUkMsUkQgb25seSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ib3VuZCByZXF1ZXN0IE9wQ29kZSB3YXMgZWl0aGVyIHJlc2VydmVkLCBvciB3YXMgZm9yIGEgZnVuY3Rpb24gbm90IHN1cHBvcnRlZCBieSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVAuIChFLmcuIFJETUEgb3IgQVRPTUlDIG9uIFFQIG5vdCBzZXQgdXAgZm9yIHRoaXMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIE1pc2FsaWduZWQgQVRPTUlDOiBWQSBkb2VzIG5vdCBwb2ludCB0byBhbiBhbGlnbmVkIGFkZHJlc3Mgb24gYW4gYXRvbWljIG9wZXJhLXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4gVG9vIG1hbnkgUkRNQSBSRUFEIG9yIEFUT01JQyBSZXF1ZXN0czogVGhlcmUgd2VyZSBtb3JlIHJlcXVlc3RzIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBBQ0tlZCB0aGFuIGFsbG93ZWQgZm9yIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuIE91dCBvZiBTZXF1ZW5jZSBPcENvZGUsIGN1cnJlbnQgcGFja2V0IGlzICJGaXJzdCIgb3IgIk9ubHkiOiBUaGUgUmVzcG9uZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWQgYW4gZXJyb3IgaW4gdGhlIHNlcXVlbmNlIG9mIE9wQ29kZXM7IGEgbWlzc2luZyAiTGFzdCIgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4gT3V0IG9mIFNlcXVlbmNlIE9wQ29kZSwgY3VycmVudCBwYWNrZXQgaXMgbm90ICJGaXJzdCIgb3IgIk9ubHkiOiBUaGUgUmVzcG9uZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWQgYW4gZXJyb3IgaW4gdGhlIHNlcXVlbmNlIG9mIE9wQ29kZXM7IGEgbWlzc2luZyAiRmlyc3QiIHBhY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYuIExvY2FsIExlbmd0aCBFcnJvcjogSW5ib3VuZCAiU2VuZCIgcmVxdWVzdCBtZXNzYWdlIGV4Y2VlZGVkIHRoZSByZXNwb25kZXIucyBhdmFpbC1hYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcuIExlbmd0aCBlcnJvcjogUkRNQSBXUklURSByZXF1ZXN0IG1lc3NhZ2UgY29udGFpbmVkIHRvbyBtdWNoIG9yIHRvbyBsaXR0bGUgcGF5LWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGNvbXBhcmVkIHRvIHRoZSBETUEgbGVuZ3RoIGFkdmVydGlzZWQgaW4gdGhlIGZpcnN0IG9yIG9ubHkgcGFja2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDguIExlbmd0aCBlcnJvcjogUGF5bG9hZCBsZW5ndGggd2FzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIG9wY29kZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiAwIGJ5dGUgPD0gIm9ubHkiIDw9IFBNVFUgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiAoImZpcnN0IiBvciAibWlkZGxlIikgPT0gUE1UVSBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IDFieXRlIDw9ICJsYXN0IiA8PSBQTVRVIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOS4gTGVuZ3RoIGVycm9yOiBJbmJvdW5kIG1lc3NhZ2UgZXhjZWVkZWQgdGhlIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBDQSBwb3J0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX3JhZVsweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgcmVtb3RlIGFjY2VzcyBlcnJvcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFLLVJlbW90ZSBBY2Nlc3MgRXJyb3Igb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUl9LZXkgVmlvbGF0aW9uOiBSZXNwb25kZXIgZGV0ZWN0ZWQgYW4gaW52YWxpZCBSX0tleSB3aGlsZSBleGVjdXRpbmcgYW4gUkRNQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3QuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlycV9udW1fcmFlWzB4MDAwMjBdOyAgIC8qIFJlc3BvbmRlciAtIG51bWJlciBvZiByZW1vdGUgYWNjZXNzIGVycm9ycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSX0tleSBWaW9sYXRpb24gUmVzcG9uZGVyIGRldGVjdGVkIGFuIFJfS2V5IHZpb2xhdGlvbiB3aGlsZSBleGVjdXRpbmcgYW4gUkRNQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFLIG1heSBvciBtYXkgbm90IGJlIHNlbnQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fcm9lWzB4MDAwMjBdOyAgIC8qIFJlcXVlc3RlciAtIG51bWJlciBvZiByZW1vdGUgb3BlcmF0aW9uIGVycm9ycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQUstUmVtb3RlIE9wZXJhdGlvbiBFcnJvciBvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGUgT3BlcmF0aW9uIEVycm9yOiBSZXNwb25kZXIgZW5jb3VudGVyZWQgYW4gZXJyb3IsIChsb2NhbCB0byB0aGUgcmVzcG9uZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBwcmV2ZW50ZWQgaXQgZnJvbSBjb21wbGV0aW5nIHRoZSByZXF1ZXN0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX3JvZVsweDAwMDIwXTsgICAvKiBSZXNwb25kZXIgLSBudW1iZXIgb2YgcmVtb3RlIG9wZXJhdGlvbiBlcnJvcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFLLVJlbW90ZSBPcGVyYXRpb24gRXJyb3Igb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gTWFsZm9ybWVkIFdRRTogUmVzcG9uZGVyIGRldGVjdGVkIGEgbWFsZm9ybWVkIFJlY2VpdmUgUXVldWUgV1FFIHdoaWxlIHByby1jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBSZW1vdGUgT3BlcmF0aW9uIEVycm9yOiBSZXNwb25kZXIgZW5jb3VudGVyZWQgYW4gZXJyb3IsIChsb2NhbCB0byB0aGUgcmVzcG9uZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBwcmV2ZW50ZWQgaXQgZnJvbSBjb21wbGV0aW5nIHRoZSByZXF1ZXN0LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX3RyZWVbMHgwMDAyMF07ICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2YgdHJhbnNwb3J0IHJldHJpZXMgZXhjZWVkZWQgZXJyb3JzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fcnJlZVsweDAwMDIwXTsgIC8qIFJlcXVlc3RlciAtIG51bWJlciBvZiBSTlIgbmFrIHJldHJpZXMgZXhjZWVkZWQgZXJyb3JzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlycV9udW1fcm5yWzB4MDAwMjBdOyAgIC8qIFJlc3BvbmRlciAtIHRoZSBudW1iZXIgb2YgUk5SIE5ha3Mgc2VudCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX3JuclsweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSB0aGUgbnVtYmVyIG9mIFJOUiBOYWtzIHJlY2VpdmVkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1fcmFicnRlWzB4MDAwMjBdOy8qIFJlcXVlc3RlciAtIG51bWJlciBvZiByZW1vdGUgYWJvcnRlZCBlcnJvcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNxX251bV9pZWVjbmVbMHgwMDAyMF07LyogUmVxdWVzdGVyIC0gbnVtYmVyIG9mIGludmFsaWQgRUUgY29udGV4dCBudW1iZXIgZXJyb3JzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDdbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzcV9udW1faWVlY3NlWzB4MDAwMjBdOy8qIFJlcXVlc3RlciAtIGludmFsaWQgRUUgY29udGV4dCBzdGF0ZSBlcnJvcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOFsweDAwMzgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV9vb3NbMHgwMDAyMF07ICAgLyogUmVzcG9uZGVyIC0gbnVtYmVyIG9mIG91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cyByZWNlaXZlZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3FfbnVtX29vc1sweDAwMDIwXTsgICAvKiBSZXF1ZXN0ZXIgLSBudW1iZXIgb2Ygb3V0IG9mIHNlcXVlbmNlIE5ha3MgcmVjZWl2ZWQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxX251bV9tY2VbMHgwMDAyMF07ICAgLyogUmVzcG9uZGVyIC0gbnVtYmVyIG9mIGJhZCBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcnFfbnVtX3JzeW5jWzB4MDAwMjBdOyAvKiBSZXNwb25kZXIgLSBudW1iZXIgb2YgUkVTWU5DIG9wZXJhdGlvbnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNxX251bV9yc3luY1sweDAwMDIwXTsgLyogUmVxdWVzdGVyIC0gbnVtYmVyIG9mIFJFU1lOQyBvcGVyYXRpb25zICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlycV9udW1fdWRzZHByZFsweDAwMDIwXTsvKiBUaGUgbnVtYmVyIG9mIFVEIHBhY2tldHMgc2lsZW50bHkgZGlzY2FyZGVkIG9uIHRoZSByZWNlaXZlIHF1ZXVlIGR1ZSB0byBsYWNrIG9mIHJlY2VpdmUgZGVzY3JpcHRvci4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlycV9udW1fdWNzZHByZFsweDAwMDIwXTsvKiBUaGUgbnVtYmVyIG9mIFVDIHBhY2tldHMgc2lsZW50bHkgZGlzY2FyZGVkIG9uIHRoZSByZWNlaXZlIHF1ZXVlIGR1ZSB0byBsYWNrIG9mIHJlY2VpdmUgZGVzY3JpcHRvci4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTFbMHgwMDNlMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAludW1fY3FvdmZbMHgwMDAyMF07ICAgIC8qIE51bWJlciBvZiBDUSBvdmVyZmxvd3MgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW51bV9lcW92ZlsweDAwMDIwXTsgICAgLyogTnVtYmVyIG9mIEVRIG92ZXJmbG93cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbnVtX2JhZGRiWzB4MDAwMjBdOyAgICAvKiBOdW1iZXIgb2YgYmFkIGRvb3JiZWxscyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMlsweDAwMmEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogRXZlbnRfZGF0YSBGaWVsZCAtIEhDUiBDb21wbGV0aW9uIEV2ZW50ICAgIyMjIyBtaWNoYWwgLSBtYXRjaCBQUk0gKi8KKworc3RydWN0IGhlcm1vbnBybV9oY3JfY29tcGxldGlvbl9ldmVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJdG9rZW5bMHgwMDAxMF07ICAgICAgICAvKiBIQ1IgVG9rZW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhdHVzWzB4MDAwMDhdOyAgICAgICAvKiBIQ1IgU3RhdHVzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDE4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW91dF9wYXJhbV9oWzB4MDAwMjBdOyAgLyogSENSIE91dHB1dCBQYXJhbWV0ZXIgWzYzOjMyXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3V0X3BhcmFtX2xbMHgwMDAyMF07ICAvKiBIQ1IgT3V0cHV0IFBhcmFtZXRlciBbMzE6MF0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogQ29tcGxldGlvbiB3aXRoIEVycm9yIENRRSAgICAgICAgICAgICAjIyMjIG1pY2hhbCAtIGdkcm9yIGZpeGVkICovCisKK3N0cnVjdCBoZXJtb25wcm1fY29tcGxldGlvbl93aXRoX2Vycm9yX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlxcG5bMHgwMDAxOF07ICAgICAgICAgIC8qIEluZGljYXRlcyB0aGUgUVAgZm9yIHdoaWNoIGNvbXBsZXRpb24gaXMgYmVpbmcgcmVwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwYTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3luZHJvbWVbMHgwMDAwOF07ICAgICAvKiBDb21wbGV0aW9uIHdpdGggZXJyb3Igc3luZHJvbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxIC0gTG9jYWwgTGVuZ3RoIEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyIC0gTG9jYWwgUVAgT3BlcmF0aW9uIEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzIC0gTG9jYWwgRUUgQ29udGV4dCBPcGVyYXRpb24gRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgLSBMb2NhbCBQcm90ZWN0aW9uIEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1IC0gV29yayBSZXF1ZXN0IEZsdXNoZWQgRXJyb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2IC0gTWVtb3J5IFdpbmRvdyBCaW5kIEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIC0gQmFkIFJlc3BvbnNlIEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExIC0gTG9jYWwgQWNjZXNzIEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyIC0gUmVtb3RlIEludmFsaWQgUmVxdWVzdCBFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMyAtIFJlbW90ZSBBY2Nlc3MgRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQgLSBSZW1vdGUgT3BlcmF0aW9uIEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1IC0gVHJhbnNwb3J0IFJldHJ5IENvdW50ZXIgRXhjZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYgLSBSTlIgUmV0cnkgQ291bnRlciBFeGNlZWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCAtIExvY2FsIFJERCBWaW9sYXRpb24gRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEgLSBSZW1vdGUgSW52YWxpZCBSRCBSZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIyIC0gUmVtb3RlIEFib3J0ZWQgRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMgLSBJbnZhbGlkIEVFIENvbnRleHQgTnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI0IC0gSW52YWxpZCBFRSBDb250ZXh0IFN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciAtIFJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luZHJvbWUgaXMgZGVmaW5lZCBhY2NvcmRpbmcgdG8gdGhlIElCIHNwZWNpZmljYXRpb24gdm9sdW1lIDEuIEZvciBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgc3luZHJvbWVzLCByZWZlciB0byBjaGFwdGVycyAxMC0xMSBvZiB0aGUgSUIgc3BlY2lmaWNhdGlvbiByZXYgMS4xLiAqLworICAgIHBzZXVkb19iaXRfdAl2ZW5kb3JfZXJyb3Jfc3luZHJvbWVbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXdxZV9jb3VudGVyWzB4MDAwMTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3Bjb2RlWzB4MDAwMDVdOyAgICAgICAvKiBUaGUgb3Bjb2RlIG9mIFdRRSBjb21wbGV0aW9uIGlzIHJlcG9ydGVkIGZvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgcmVwb3J0ZWQgaW4gY2FzZSBvZiBjb21wbGV0aW9uIHdpdGggZXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRSAtIEZvciBjb21wbGV0aW9uIHdpdGggZXJyb3Igb24gUmVjZWl2ZSBRdWV1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGIC0gRm9yIGNvbXBsZXRpb24gd2l0aCBlcnJvciBvbiBTZW5kIFF1ZXVlcyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CXNfclsweDAwMDAxXTsgICAgICAgICAgLyogc2VuZCAxIC8gcmVjZWl2ZSAwICovCisgICAgcHNldWRvX2JpdF90CW93bmVyWzB4MDAwMDFdOyAgICAgICAgLyogSFcgRmxpcHMgdGhpcyBiaXQgZm9yIGV2ZXJ5IENRIHdhcnAgYXJvdW5kLiBJbml0aWFsaXplZCB0byBaZXJvLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAxOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFJlc2l6ZSBDUSBJbnB1dCBNYWlsYm94ICovCisKK3N0cnVjdCBoZXJtb25wcm1fcmVzaXplX2NxX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CXBhZ2Vfb2Zmc2V0WzB4MDAwMDZdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAxNF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAxOF07CisgICAgcHNldWRvX2JpdF90CWxvZ19jcV9zaXplWzB4MDAwMDVdOyAgLyogTG9nIChiYXNlIDIpIG9mIHRoZSBDUSBzaXplIChpbiBlbnRyaWVzKSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwM107CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltdHRfYmFzZV9hZGRyX2hbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nMl9wYWdlX3NpemVbMHgwMDAwNl07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkN1sweDAwMDAyXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOFsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJbXR0X2Jhc2VfYWRkcl9sWzB4MDAwMWRdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMFsweDAwMTAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogTUFEX0lGQyBJbnB1dCBNb2RpZmllciAqLworCitzdHJ1Y3QgaGVybW9ucHJtX21hZF9pZmNfaW5wdXRfbW9kaWZpZXJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXBvcnRfbnVtYmVyWzB4MDAwMDhdOyAgLyogVGhlIHBhY2tldCByZWNlcHRpb24gcG9ydCBudW1iZXIgKDEgb3IgMikuICovCisgICAgcHNldWRvX2JpdF90CW1hZF9leHRlbmRlZF9pbmZvWzB4MDAwMDFdOy8qIE1hZF9FeHRlbmRlZF9JbmZvIHZhbGlkIGJpdCAoTUFEX0lGQyBJbnB1dCBNYWlsYm94IGRhdGEgZnJvbSBvZmZzZXQgMDAxMDBoIGFuZCBkb3duKS4gTUFEX0V4dGVuZGVkX0luZm8gaXMgcmVhZCBvbmx5IGlmIHRoaXMgYml0IGlzIHNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBmb3IgdHJhcCBnZW5lcmF0aW9uIHdoZW4gQktleSBjaGVjayBpcyBlbmFibGVkIGFuZCBmb3IgZ2xvYmFsIHJvdXRlZCBwYWNrZXRzLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwN107CisgICAgcHNldWRvX2JpdF90CXJsaWRbMHgwMDAxMF07ICAgICAgICAgLyogUmVtb3RlIChzb3VyY2UpIExJRCAgZnJvbSB0aGUgcmVjZWl2ZWQgTUFELgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgZm9yIHRyYXAgZ2VuZXJhdGlvbiB1cG9uIE1LZXkvQktleSB2YWxpZGF0aW9uLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNQURfSUZDIElucHV0IE1haWxib3ggICAgICMjI21pY2hhbCAtZ2Ryb3IgZml4ZWQgKi8KKworc3RydWN0IGhlcm1vbnBybV9tYWRfaWZjX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXF1ZXN0X21hZF9wYWNrZXRbNjRdWzB4MDAwMjBdOy8qIFJlcXVlc3QgTUFEIFBhY2tldCAoMjU2Ynl0ZXMpICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlteV9xcG5bMHgwMDAxOF07ICAgICAgIC8qIERlc3RpbmF0aW9uIFFQIG51bWJlciBmcm9tIHRoZSByZWNlaXZlZCBNQUQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgaWYgTWFkX2V4dGVuZGVkX2luZm8gaW5kaWNhdGlvbiBpbiB0aGUgaW5wdXQgbW9kaWZpZXIgaXMgY2xlYXIuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJxcG5bMHgwMDAxOF07ICAgICAgICAgLyogUmVtb3RlIChzb3VyY2UpIFFQIG51bWJlciAgZnJvbSB0aGUgcmVjZWl2ZWQgTUFELgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgaWYgTWFkX2V4dGVuZGVkX2luZm8gaW5kaWNhdGlvbiBpbiB0aGUgaW5wdXQgbW9kaWZpZXIgaXMgY2xlYXIuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJbWxfcGF0aFsweDAwMDA3XTsgICAgICAvKiBNeSAoZGVzdGluYXRpb24pIExJRCBwYXRoIGJpdHMgIGZyb20gdGhlIHJlY2VpdmVkIE1BRC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGlmIE1hZF9leHRlbmRlZF9pbmZvIGluZGljYXRpb24gaW4gdGhlIGlucHV0IG1vZGlmaWVyIGlzIGNsZWFyLiAqLworICAgIHBzZXVkb19iaXRfdAlnWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIElmIHNldCwgdGhlIEdSSCBmaWVsZCBpbiB2YWxpZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBpZiBNYWRfZXh0ZW5kZWRfaW5mbyBpbmRpY2F0aW9uIGluIHRoZSBpbnB1dCBtb2RpZmllciBpcyBjbGVhci4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAlzbFsweDAwMDA0XTsgICAgICAgICAgIC8qIFNlcnZpY2UgTGV2ZWwgb2YgdGhlIHJlY2VpdmVkIE1BRC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGlmIE1hZF9leHRlbmRlZF9pbmZvIGluZGljYXRpb24gaW4gdGhlIGlucHV0IG1vZGlmaWVyIGlzIGNsZWFyLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGtleV9pbmR4WzB4MDAwMTBdOyAgICAvKiBJbmRleCBpbiBQS2V5IHRhYmxlIHRoYXQgbWF0Y2hlcyBQS2V5IG9mIHRoZSByZWNlaXZlZCBNQUQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgaWYgTWFkX2V4dGVuZGVkX2luZm8gaW5kaWNhdGlvbiBpbiB0aGUgaW5wdXQgbW9kaWZpZXIgaXMgY2xlYXIuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMTYwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWdyaFsxMF1bMHgwMDAyMF07ICAgICAgLyogVGhlIEdSSCBmaWVsZCBvZiB0aGUgTUFEIHBhY2tldCB0aGF0IHdhcyBzY2F0dGVyZWQgdG8gdGhlIGZpcnN0IDQwIGJ5dGVzIHBvaW50ZWQgdG8gYnkgdGhlIHNjYXR0ZXIgbGlzdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgaWYgTWFkX2V4dGVuZGVkX2luZm8gYml0IChpbiB0aGUgaW5wdXQgbW9kaWZpZXIpIGFuZCBnIGJpdCBhcmUgc2V0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgdGhpcyBmaWVsZCBpcyByZXNlcnZlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkN1sweDAwNGMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogUXVlcnkgRGVidWcgTWVzc2FnZSAgICAgIyMjIyBtaWNoYWwgLSBnZHJvciBmaXhlZCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3F1ZXJ5X2RlYnVnX21zZ19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGh5X2FkZHJfaFsweDAwMDIwXTsgICAvKiBUcmFuc2xhdGlvbiBvZiB0aGUgYWRkcmVzcyBpbiBmaXJtd2FyZSBhcmVhLiBIaWdoIDMyIGJpdHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2WzB4MDAwMDFdOyAgICAgICAgICAgIC8qIFBoeXNpY2FsIHRyYW5zbGF0aW9uIGlzIHZhbGlkICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDBiXTsKKyAgICBwc2V1ZG9fYml0X3QJcGh5X2FkZHJfbFsweDAwMDE0XTsgICAvKiBUcmFuc2xhdGlvbiBvZiB0aGUgYWRkcmVzcyBpbiBmaXJtd2FyZSBhcmVhLiBMb3cgMzIgYml0cy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWZ3X2FyZWFfYmFzZVsweDAwMDIwXTsgLyogRmlybXdhcmUgYXJlYSBiYXNlIGFkZHJlc3MuIFRoZSBmb3JtYXQgc3RyaW5ncyBhbmQgdGhlIHRyYWNlIGJ1ZmZlcnMgbWF5IGJlIGxvY2F0ZWQgc3RhcnRpbmcgZnJvbSB0aGlzIGFkZHJlc3MuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlmd19hcmVhX3NpemVbMHgwMDAyMF07IC8qIEZpcm13YXJlIGFyZWEgc2l6ZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdHJjX2hkcl9zelsweDAwMDIwXTsgICAvKiBUcmFjZSBtZXNzYWdlIGhlYWRlciBzaXplIGluIGR3b3Jkcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXRyY19hcmdfbnVtWzB4MDAwMjBdOyAgLyogVGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGVyIHRyYWNlIG1lc3NhZ2UuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDBjMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlkYmdfbXNrX2hbMHgwMDAyMF07ICAgIC8qIERlYnVnIG1lc3NhZ2VzIG1hc2sgWzYzOjMyXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGJnX21za19sWzB4MDAwMjBdOyAgICAvKiBEZWJ1ZyBtZXNzYWdlcyBtYXNrIFszMTowXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjBfYWRkclsweDAwMDIwXTsgICAvKiBBZGRyZXNzIGluIGZpcm13YXJlIGFyZWEgb2YgVHJhY2UgQnVmZmVyIDAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJ1ZmYwX3NpemVbMHgwMDAyMF07ICAgLyogU2l6ZSBvZiBUcmFjZSBCdWZmZXIgMCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjFfYWRkclsweDAwMDIwXTsgICAvKiBBZGRyZXNzIGluIGZpcm13YXJlIGFyZWEgb2YgVHJhY2UgQnVmZmVyIDEgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJ1ZmYxX3NpemVbMHgwMDAyMF07ICAgLyogU2l6ZSBvZiBUcmFjZSBCdWZmZXIgMSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjJfYWRkclsweDAwMDIwXTsgICAvKiBBZGRyZXNzIGluIGZpcm13YXJlIGFyZWEgb2YgVHJhY2UgQnVmZmVyIDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJ1ZmYyX3NpemVbMHgwMDAyMF07ICAgLyogU2l6ZSBvZiBUcmFjZSBCdWZmZXIgMiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjNfYWRkclsweDAwMDIwXTsgICAvKiBBZGRyZXNzIGluIGZpcm13YXJlIGFyZWEgb2YgVHJhY2UgQnVmZmVyIDMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJ1ZmYzX3NpemVbMHgwMDAyMF07ICAgLyogU2l6ZSBvZiBUcmFjZSBCdWZmZXIgMyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjRfYWRkclsweDAwMDIwXTsgICAvKiBBZGRyZXNzIGluIGZpcm13YXJlIGFyZWEgb2YgVHJhY2UgQnVmZmVyIDQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJ1ZmY0X3NpemVbMHgwMDAyMF07ICAgLyogU2l6ZSBvZiBUcmFjZSBCdWZmZXIgNCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnVmZjVfYWRkclsweDAwMDIwXTsgICAvKiBBZGRyZXNzIGluIGZpcm13YXJlIGFyZWEgb2YgVHJhY2UgQnVmZmVyIDUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJ1ZmY1X3NpemVbMHgwMDAyMF07ICAgLyogU2l6ZSBvZiBUcmFjZSBCdWZmZXIgNSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJaHdfYnVmZl9hZGRyWzB4MDAwMjBdOyAvKiBEcm9yIE11eCBCb2hyZXIgdHJhY2VyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlod19idWZmX3NpemVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDNjMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFVzZXIgQWNjZXNzIFJlZ2lvbiAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3Vhcl9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3JkX3NlbmRfZG9vcmJlbGxfc3QJcmRfc2VuZF9kb29yYmVsbDsvKiBSZWxpYWJsZSBEYXRhZ3JhbSBzZW5kIGRvb3JiZWxsICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fc2VuZF9kb29yYmVsbF9zdAlzZW5kX2Rvb3JiZWxsOy8qIFNlbmQgZG9vcmJlbGwgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9jcV9jbWRfZG9vcmJlbGxfc3QJY3FfY29tbWFuZF9kb29yYmVsbDsvKiBDUSBEb29yYmVsbCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDNlYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBSZWNlaXZlIGRvb3JiZWxsICovCisKK3N0cnVjdCBoZXJtb25wcm1fcmVjZWl2ZV9kb29yYmVsbF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAl3cWVfY291bnRlclsweDAwMDEwXTsgIC8qIE1vZHVsby02NEsgY291bnRlciBvZiBXUUVzIHBvc3RlZCBvbiB0aGlzIHF1ZXVlIHNpbmNlIGl0cyBjcmVhdGlvbi4gU2hvdWxkIGJlIHplcm8gZm9yIHRoZSBmaXJzdCBkb29yYmVsbCBvbiB0aGUgUVAgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAlzcnFbMHgwMDAwMV07ICAgICAgICAgIC8qIElmIHNldCwgdGhpcyBpcyBhIFNoYXJlZCBSZWNlaXZlIFF1ZXVlICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJcXBuWzB4MDAwMThdOyAgICAgICAgICAvKiBRUCBudW1iZXIgb3IgU1JRIG51bWJlciB0aGlzIGRvb3JiZWxsIGlzIHJ1bmcgb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogU0VUX0lCIFBhcmFtZXRlcnMgKi8KKworc3RydWN0IGhlcm1vbnBybV9zZXRfaWJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJxa1sweDAwMDAxXTsgICAgICAgICAgLyogUmVzZXQgUUtleSBWaW9sYXRpb24gQ291bnRlciAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAxMV07CisgICAgcHNldWRvX2JpdF90CXNpZ1sweDAwMDAxXTsgICAgICAgICAgLyogU2V0IFN5c3RlbSBJbWFnZSBHVUlEIHRvIHN5c3RlbV9pbWFnZV9ndWlkIHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1faW1hZ2VfZ3VpZCBhbmQgc2lnIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBwb3J0cy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMGRdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY2FwYWJpbGl0eV9tYXNrWzB4MDAwMjBdOy8qIFBvcnRJbmZvIENhcGFiaWxpdHkgTWFzayAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3lzdGVtX2ltYWdlX2d1aWRfaFsweDAwMDIwXTsvKiBTeXN0ZW0gSW1hZ2UgR1VJRFs2MzozMl0sIHRha2VzIGVmZmVjdCBvbmx5IGlmIHRoZSBTSUcgYml0IGlzIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgdGhlIHNhbWUgZm9yIGJvdGggcG9ydHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzeXN0ZW1faW1hZ2VfZ3VpZF9sWzB4MDAwMjBdOy8qIFN5c3RlbSBJbWFnZSBHVUlEWzMxOjBdLCB0YWtlcyBlZmZlY3Qgb25seSBpZiB0aGUgU0lHIGJpdCBpcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHRoZSBzYW1lIGZvciBib3RoIHBvcnRzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAxODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyICAgICMjIyMgbWljaGFsIC0gZ2Ryb3IgZml4ZWQgKi8KKworc3RydWN0IGhlcm1vbnBybV9tZ21fZW50cnlfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA2XTsKKyAgICBwc2V1ZG9fYml0X3QJbmV4dF9naWRfaW5kZXhbMHgwMDAxYV07LyogSW5kZXggb2YgbmV4dCBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyIHdob3NlIEdJRCBtYXBzIHRvIHNhbWUgTUdJRF9IQVNIIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5kZXggaXMgaW50byB0aGUgTXVsdGljYXN0IEdyb3VwIFRhYmxlLCB3aGljaCBpcyB0aGUgY29tcHJpc2VkIHRoZSBNR0hUIGFuZCBBTUdNIHRhYmxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2dpZF9pbmRleD0wIG1lYW5zIGVuZCBvZiB0aGUgY2hhaW4uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDA2MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltZ2lkXzEyOF85NlsweDAwMDIwXTsgIC8qIE11bHRpY2FzdCBncm91cCBHSURbMTI4Ojk2XSBpbiBiaWcgZW5kaWFuIGZvcm1hdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIFJlc2VydmVkIEdJRCAwOjA6MDowOjA6MDowOjAgZm9yIGFuIGludmFsaWQgZW50cnkuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltZ2lkXzk1XzY0WzB4MDAwMjBdOyAgIC8qIE11bHRpY2FzdCBncm91cCBHSURbOTU6NjRdIGluIGJpZyBlbmRpYW4gZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgUmVzZXJ2ZWQgR0lEIDA6MDowOjA6MDowOjA6MCBmb3IgYW4gaW52YWxpZCBlbnRyeS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1naWRfNjNfMzJbMHgwMDAyMF07ICAgLyogTXVsdGljYXN0IGdyb3VwIEdJRFs2MzozMl0gaW4gYmlnIGVuZGlhbiBmb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBSZXNlcnZlZCBHSUQgMDowOjA6MDowOjA6MDowIGZvciBhbiBpbnZhbGlkIGVudHJ5LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWdpZF8zMV8wWzB4MDAwMjBdOyAgICAvKiBNdWx0aWNhc3QgZ3JvdXAgR0lEWzMxOjBdIGluIGJpZyBlbmRpYW4gZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgUmVzZXJ2ZWQgR0lEIDA6MDowOjA6MDowOjA6MCBmb3IgYW4gaW52YWxpZCBlbnRyeS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tZ21xcF9zdAltZ21xcF8wOyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tZ21xcF9zdAltZ21xcF8xOyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tZ21xcF9zdAltZ21xcF8yOyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tZ21xcF9zdAltZ21xcF8zOyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tZ21xcF9zdAltZ21xcF80OyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tZ21xcF9zdAltZ21xcF81OyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tZ21xcF9zdAltZ21xcF82OyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tZ21xcF9zdAltZ21xcF83OyAgIC8qIE11bHRpY2FzdCBHcm91cCBNZW1iZXIgUVAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogSU5JVF9QT1JUIFBhcmFtZXRlcnMgICAgIyMjIyBtaWNoYWwgLSBtYXRjaCBQUk0gKi8KKworc3RydWN0IGhlcm1vbnBybV9pbml0X3BvcnRfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJdmxfY2FwWzB4MDAwMDRdOyAgICAgICAvKiBNYXhpbXVtIFZMcyBzdXBwb3J0ZWQgb24gdGhlIHBvcnQsIGV4Y2x1ZGluZyBWTDE1LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsIHZhbHVlcyBhcmUgMSwyLDQgYW5kIDguICovCisgICAgcHNldWRvX2JpdF90CXBvcnRfd2lkdGhfY2FwWzB4MDAwMDRdOy8qIElCIFBvcnQgV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgLSAxeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAtIDF4LCA0eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExIC0gMXgsIDR4IG9yIDEyeCAobXVzdCBub3QgYmUgdXNlZCBpbiBJbmZpbmlIb3N0LUlJSS1FWCBNVDI1MjA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLSBSZXNlcnZlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CWcwWzB4MDAwMDFdOyAgICAgICAgICAgLyogU2V0IHBvcnQgR1VJRDAgdG8gR1VJRDAgc3BlY2lmaWVkICovCisgICAgcHNldWRvX2JpdF90CW5nWzB4MDAwMDFdOyAgICAgICAgICAgLyogU2V0IG5vZGUgR1VJRCB0byBub2RlX2d1aWQgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfZ3VpZCBhbmQgbmcgbXVzdCBiZSB0aGUgc2FtZSBmb3IgYWxsIHBvcnRzLiAqLworICAgIHBzZXVkb19iaXRfdAlzaWdbMHgwMDAwMV07ICAgICAgICAgIC8qIFNldCBTeXN0ZW0gSW1hZ2UgR1VJRCB0byBzeXN0ZW1faW1hZ2VfZ3VpZCBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtX2ltYWdlX2d1aWQgYW5kIHNpZyBtdXN0IGJlIHRoZSBzYW1lIGZvciBhbGwgcG9ydHMuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDBkXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1heF9naWRbMHgwMDAxMF07ICAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgR0lEcyBmb3IgdGhlIHBvcnQgKi8KKyAgICBwc2V1ZG9fYml0X3QJbXR1WzB4MDAwMTBdOyAgICAgICAgICAvKiBNYXhpbXVtIE1UVSBTdXBwb3J0ZWQgaW4gYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlOiAyNTYsIDUxMiwgMTAyNCwgMjA0OCBvciA0MDk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEV0aCBwb3J0LCBjYW4gYmUgYW55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgbXVzdCBub3QgY3Jvc3MgZGV2aWNlIGNhcGFiaWxpdGllcyBhcyByZXBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWF4X3BrZXlbMHgwMDAxMF07ICAgICAvKiBNYXhpbXVtIHBrZXlzIGZvciB0aGUgcG9ydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHRoZSBzYW1lIGZvciBib3RoIHBvcnRzLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAxMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlndWlkMF9oWzB4MDAwMjBdOyAgICAgIC8qIEVVSS02NCBHVUlEIGFzc2lnbmVkIGJ5IHRoZSBtYW51ZmFjdHVyZXIsIHRha2VzIGVmZmVjdCBvbmx5IGlmIHRoZSBHMCBiaXQgaXMgc2V0IChiaXRzIDYzOjMyKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZ3VpZDBfbFsweDAwMDIwXTsgICAgICAvKiBFVUktNjQgR1VJRCBhc3NpZ25lZCBieSB0aGUgbWFudWZhY3R1cmVyLCB0YWtlcyBlZmZlY3Qgb25seSBpZiB0aGUgRzAgYml0IGlzIHNldCAoYml0cyAzMTowKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbm9kZV9ndWlkX2hbMHgwMDAyMF07ICAvKiBOb2RlIEdVSURbNjM6MzJdLCB0YWtlcyBlZmZlY3Qgb25seSBpZiB0aGUgTkcgYml0IGlzIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgdGhlIHNhbWUgZm9yIGJvdGggcG9ydHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlub2RlX2d1aWRfbFsweDAwMDIwXTsgIC8qIE5vZGUgR1VJRFszMTowXSwgdGFrZXMgZWZmZWN0IG9ubHkgaWYgdGhlIE5HIGJpdCBpcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHRoZSBzYW1lIGZvciBib3RoIHBvcnRzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3lzdGVtX2ltYWdlX2d1aWRfaFsweDAwMDIwXTsvKiBTeXN0ZW0gSW1hZ2UgR1VJRFs2MzozMl0sIHRha2VzIGVmZmVjdCBvbmx5IGlmIHRoZSBTSUcgYml0IGlzIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgdGhlIHNhbWUgZm9yIGJvdGggcG9ydHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzeXN0ZW1faW1hZ2VfZ3VpZF9sWzB4MDAwMjBdOy8qIFN5c3RlbSBJbWFnZSBHVUlEWzMxOjBdLCB0YWtlcyBlZmZlY3Qgb25seSBpZiB0aGUgU0lHIGJpdCBpcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHRoZSBzYW1lIGZvciBib3RoIHBvcnRzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ1WzB4MDA2YzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBRdWVyeSBEZXZpY2UgQ2FwYWJsaXRpZXMgICAgICMjIyMgbWljaGFsIC0gZ2Ryb3IgZml4ZWQgKi8KKworc3RydWN0IGhlcm1vbnBybV9xdWVyeV9kZXZfY2FwX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDA4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X3FwWzB4MDAwMDVdOyAgIC8qIExvZzIgb2YgdGhlIE1heGltdW0gbnVtYmVyIG9mIFFQcyBzdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAlsb2cyX3JzdmRfcXBzWzB4MDAwMDRdOy8qIExvZyAoYmFzZSAyKSBvZiB0aGUgbnVtYmVyIG9mIFFQcyByZXNlcnZlZCBmb3IgZmlybXdhcmUgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlc2VydmVkIHJlc291cmNlcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIDJebG9nMl9yc3ZkX3Fwcy0xICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9xcF9zelsweDAwMDA4XTsvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgV1FFcyBhbGxvd2VkIG9uIHRoZSBSUSBvciB0aGUgU1EgaXMgMl5sb2dfbWF4X3FwX3N6LTEgKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9zcnFfc3pbMHgwMDAwOF07LyogVGhlIG1heGltdW0gbnVtYmVyIG9mIFdRRXMgYWxsb3dlZCBvbiB0aGUgU1JRIGlzIDJebG9nX21heF9zcnFfc3otMSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9zY3FzWzB4MDAwMDRdOyAvKiBsb2cgYmFzZSAyIG9mIG51bWJlciBvZiBzdXBwb3J0ZWQgc2NoZWR1bGUgcXVldWVzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJbnVtX3JzdmRfc2Nxc1sweDAwMDA2XTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X3NycXNbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDA3XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nMl9yc3ZkX3NycXNbMHgwMDAwNF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X2NxWzB4MDAwMDVdOyAgIC8qIExvZzIgb2YgdGhlIE1heGltdW0gbnVtYmVyIG9mIENRcyBzdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAlsb2cyX3JzdmRfY3FzWzB4MDAwMDRdOy8qIExvZyAoYmFzZSAyKSBvZiB0aGUgbnVtYmVyIG9mIENRcyByZXNlcnZlZCBmb3IgZmlybXdhcmUgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlc2VydmVkIHJlc291cmNlcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIDJebG9nMl9yc3J2ZF9jcXMtMSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDdbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfY3Ffc3pbMHgwMDAwOF07LyogTG9nMiBvZiB0aGUgTWF4aW11bSBDUUVzIGFsbG93ZWQgaW4gYSBDUSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDhbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X2VxWzB4MDAwMDRdOyAgIC8qIExvZzIgb2YgdGhlIE1heGltdW0gbnVtYmVyIG9mIEVRcyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDlbMHgwMDAwNF07CisgICAgcHNldWRvX2JpdF90CW51bV9yc3ZkX2Vxc1sweDAwMDA0XTsgLyogVGhlIG51bWJlciBvZiBFUXMgcmVzZXJ2ZWQgZm9yIGZpcm13YXJlIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXNlcnZlZCByZXNvdXJjZXMgYXJlIG51bWJlcmVkIGZyb20gMCB0byBudW1fcnN2ZF9lcXMtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIDAgLSBubyByZXNvdXJjZXMgYXJlIHJlc2VydmVkLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEwWzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X2RfbXB0c1sweDAwMDA2XTsvKiBMb2cgKGJhc2UgMikgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRhdGEgTVBUIGVudHJpZXMgKHRoZSBudW1iZXIgb2YgUmVnaW9ucy9XaW5kb3dzKSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDExWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X2VxX3N6WzB4MDAwMDhdOy8qIExvZzIgb2YgdGhlIE1heGltdW0gRVFFcyBhbGxvd2VkIGluIGEgRVEgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfbXR0c1sweDAwMDA2XTsgLyogTG9nMiBvZiB0aGUgTWF4aW11bSBudW1iZXIgb2YgTVRUIGVudHJpZXMgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMlsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nMl9yc3ZkX21yd3NbMHgwMDAwNF07LyogTG9nIChiYXNlIDIpIG9mIHRoZSBudW1iZXIgb2YgTVBUcyByZXNlcnZlZCBmb3IgZmlybXdhcmUgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlc2VydmVkIHJlc291cmNlcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIDJebG9nMl9yc3ZkX21yd3MtMSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEzWzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X21yd19zelsweDAwMDA3XTsvKiBMb2cyIG9mIHRoZSBNYXhpbXVtIFNpemUgb2YgTWVtb3J5IFJlZ2lvbi9XaW5kb3cuIGlzIGl0IGluIFBSTSBsYXlvdXQ/ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTRbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CWxvZzJfcnN2ZF9tdHRzWzB4MDAwMDRdOy8qIExvZyAoYmFzZSAyKSBvZiB0aGUgbnVtYmVyIG9mIE1UVCBlbnRyaWVzIHJlc2VydmVkIGZvciBmaXJtd2FyZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVzZXJ2ZWQgcmVzb3VyY2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8gMl5sb2cyX3JzdmRfbXR0cy0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9yYV9yZXNfcXBbMHgwMDAwNl07LyogTG9nMiBvZiB0aGUgTWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgUkRNQSByZWFkL0F0b21pYyBwZXIgUVAgYXMgYSByZXNwb25kZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNlsweDAwMDBhXTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9yYV9yZXFfcXBbMHgwMDAwNl07LyogTG9nMiBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgUkRNQSByZWFkL0F0b21pYyBwZXIgUVAgYXMgYSByZXF1ZXN0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxN1sweDAwMDBhXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfcmFfcmVzX2dsb2JhbFsweDAwMDA2XTsvKiBMb2cyIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiBSRE1BIHJlYWQvYXRvbWljIG9wZXJhdGlvbnMgdGhlIEhDQSByZXNwb25kZXIgY2FuIHN1cHBvcnQgZ2xvYmFsbHkuIFRoYXQgaW1wbGllcyB0aGUgUkRCIHRhYmxlIHNpemUuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMThbMHgwMDAxYV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyc3pfc3JxWzB4MDAwMDFdOyAgICAgIC8qIEFiaWxpdHkgdG8gbW9kaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBXUnMgcGVyIFNSUS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxOVsweDAwMDFmXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW51bV9wb3J0c1sweDAwMDA0XTsgICAgLyogTnVtYmVyIG9mIElCIHBvcnRzLiAqLworICAgIHBzZXVkb19iaXRfdAltYXhfdmxfaWJbMHgwMDAwNF07ICAgIC8qIE1heGltdW0gVkxzIHN1cHBvcnRlZCBvbiBlYWNoIHBvcnQsIGV4Y2x1ZGluZyBWTDE1ICovCisgICAgcHNldWRvX2JpdF90CWliX3BvcnRfd2lkdGhbMHgwMDAwNF07LyogSUIgUG9ydCBXaWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAtIDF4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgIC0gMXgsIDR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgLSAxeCwgNHggb3IgMTJ4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAtIFJlc2VydmVkICovCisgICAgcHNldWRvX2JpdF90CWliX210dVsweDAwMDA0XTsgICAgICAgLyogTWF4aW11bSBNVFUgU3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwIC0gUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEgLSAyNTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIgLSA1MTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMgLSAxMDI0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0IC0gMjA0OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NSAtIDQwOTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYtMHhGIFJlc2VydmVkICovCisgICAgcHNldWRvX2JpdF90CWxvY2FsX2NhX2Fja19kZWxheVsweDAwMDA1XTsvKiBUaGUgTG9jYWwgQ0EgQUNLIERlbGF5LiBUaGlzIGlzIHRoZSB2YWx1ZSByZWNvbW1lbmRlZCB0byBiZSByZXR1cm5lZCBpbiBRdWVyeSBIQ0EgdmVyYi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVsYXkgdmFsdWUgaW4gbWljcm9zZWNvbmRzIGlzIGNvbXB1dGVkIHVzaW5nIDQuMDk2dXMgKiAyXihsb2NhbF9jYV9hY2tfZGVsYXkpLiAqLworICAgIHBzZXVkb19iaXRfdAlwb3J0X3R5cGVbMHgwMDAwNF07ICAgIC8qIEhlcm1vbiBOZXcuIGJpdCBwZXIgcG9ydC4gYml0MCBpcyBmaXJzdCBwb3J0LiB2YWx1ZSAnMScgaXMgZWh0ZXJuZXQuICcwJyBpcyBJQiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIwWzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAl3WzB4MDAwMDFdOyAgICAgICAgICAgIC8qIEhlcm1vbiBOZXcuIDEwR0IgZXRoIHN1cHBvcnQgKi8KKyAgICBwc2V1ZG9fYml0X3QJalsweDAwMDAxXTsgICAgICAgICAgICAvKiBIZXJtb24gTmV3LiBKdW1ibyBmcmFtZSBzdXBwb3J0ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjFbMHgwMDAwMV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X2dpZFsweDAwMDA0XTsgIC8qIExvZzIgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIEdJRHMgcGVyIHBvcnQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyMlsweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX2V0aHR5cGVbMHgwMDAwNF07ICAvKiBIZXJtb24gTmV3LiBsb2cyIGV0aCB0eXBlIHRhYmxlIHNpemUgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyM1sweDAwMDA0XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX2RyYWluX3NpemVbMHgwMDAwOF07LyogTG9nIChiYXNlIDIpIG9mIG1pbmltdW0gc2l6ZSBvZiB0aGUgTm9Ecm9wVkxEcmFpbiBidWZmZXIsIHNwZWNpZmllZCBpbiA0S3BhZ2VzIHVuaXRzICovCisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfbXNnWzB4MDAwMDVdOyAgLyogTG9nIChiYXNlIDIpIG9mIHRoZSBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI0WzB4MDAwMDNdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9wa2V5WzB4MDAwMDRdOyAvKiBMb2cyIG9mIHRoZSBtYXggUEtleSBUYWJsZSBTaXplIChwZXIgSUIgcG9ydCkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyNVsweDAwMDBjXTsKKyAgICBwc2V1ZG9fYml0X3QJc3RhdF9yYXRlX3N1cHBvcnRbMHgwMDAxMF07LyogYml0IG1hc2sgb2Ygc3RhdCByYXRlIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAwIC0gZnVsbCBidworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAxIC0gMS80IGJ3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDIgLSAxLzggYncKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMyAtIDEvMiBidzsgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjZbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyY1sweDAwMDAxXTsgICAgICAgICAgIC8qIFJDIFRyYW5zcG9ydCBzdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJdWNbMHgwMDAwMV07ICAgICAgICAgICAvKiBVQyBUcmFuc3BvcnQgU3VwcG9ydGVkICovCisgICAgcHNldWRvX2JpdF90CXVkWzB4MDAwMDFdOyAgICAgICAgICAgLyogVUQgVHJhbnNwb3J0IFN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlzcmNbMHgwMDAwMV07ICAgICAgICAgIC8qIFNSQyBUcmFuc3BvcnQgU3VwcG9ydGVkLiBIZXJtb24gTmV3IGluc3RlYWQgb2YgUkQuICovCisgICAgcHNldWRvX2JpdF90CXJjbVsweDAwMDAxXTsgICAgICAgICAgLyogUmVsaWFibGUgTXVsdGljYXN0IHN1cHBvcnQuIEhlcm1vbiBOZXcgaW5zdGVhZCBvZiBJUHY2IFRyYW5zcG9ydCBTdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJZmNvaWJbMHgwMDAwMV07ICAgICAgICAvKiBIZXJtb24gTmV3ICovCisgICAgcHNldWRvX2JpdF90CXNycVsweDAwMDAxXTsgICAgICAgICAgLyogU1JRIGlzIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAljaGVja3N1bVsweDAwMDAxXTsgICAgIC8qIElQIG92ZXIgSUIgY2hlY2tzdW0gaXMgc3VwcG9ydGVkICovCisgICAgcHNldWRvX2JpdF90CXBrdlsweDAwMDAxXTsgICAgICAgICAgLyogUEtleSBWaW9sYXRpb24gQ291bnRlciBTdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcWt2WzB4MDAwMDFdOyAgICAgICAgICAvKiBRS2V5IFZpb2xhdGlvbiBDb3V0bmVyIFN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAl2bW1bMHgwMDAwMV07ICAgICAgICAgIC8qIEhlcm1vbiBOZXcgKi8KKyAgICBwc2V1ZG9fYml0X3QJZmNvZVsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJZHBkcFsweDAwMDAxXTsJICAgICAgIC8qIER1YWwgUG9ydCBEaWZmZXJlbnQgUHJvdG9jb2xzICovCisgICAgcHNldWRvX2JpdF90CXJhd19ldGhlcnR5cGVbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CXJhd19pcHY2WzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAlibGhbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CW13WzB4MDAwMDFdOyAgICAgICAgICAgLyogTWVtb3J5IHdpbmRvd3Mgc3VwcG9ydGVkICovCisgICAgcHNldWRvX2JpdF90CWFwbVsweDAwMDAxXTsgICAgICAgICAgLyogQXV0b21hdGljIFBhdGggTWlncmF0aW9uIFN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlhdG1bMHgwMDAwMV07ICAgICAgICAgIC8qIEF0b21pYyBvcGVyYXRpb25zIHN1cHBvcnRlZCAoYXRvbWljaXR5IGlzIGd1YXJhbnRlZWQgYmV0d2VlbiBRUHMgb24gdGhpcyBIQ0EpICovCisgICAgcHNldWRvX2JpdF90CXJtWzB4MDAwMDFdOyAgICAgICAgICAgLyogUmF3IE11bHRpY2FzdCBTdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJYXZwWzB4MDAwMDFdOyAgICAgICAgICAvKiBBZGRyZXNzIFZlY3RvciBQb3J0IGNoZWNraW5nIHN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAl1ZG1bMHgwMDAwMV07ICAgICAgICAgIC8qIFVEIE11bHRpY2FzdCBTdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyOFsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJcGdbMHgwMDAwMV07ICAgICAgICAgICAvKiBQYWdpbmcgb24gZGVtYW5kIHN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlyWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIFJvdXRlciBtb2RlIHN1cHBvcnRlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI5WzB4MDAwMDZdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX3BnX3N6WzB4MDAwMDhdOyAgICAvKiBNaW5pbXVtIHN5c3RlbSBwYWdlIHNpemUgc3VwcG9ydGVkIChsb2cyKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgcHJvcGVyIG9wZXJhdGlvbiBpdCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgaG9zdGluZyBwbGF0Zm9ybSAoQ1BVKSBtaW5pbXVtIHBhZ2Ugc2l6ZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMFsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJdWFyX3N6WzB4MDAwMDZdOyAgICAgICAvKiBVQVIgQXJlYSBTaXplID0gMU1CICogMl51YXJfc3ogKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMVsweDAwMDA2XTsKKyAgICBwc2V1ZG9fYml0X3QJbnVtX3JzdmRfdWFyc1sweDAwMDA0XTsvKiBUaGUgbnVtYmVyIG9mIFVBUnMgcmVzZXJ2ZWQgZm9yIGZpcm13YXJlIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXNlcnZlZCByZXNvdXJjZXMgYXJlIG51bWJlcmVkIGZyb20gMCB0byBudW1fcmVzZXJ2ZWRfdWFycy0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IFVBUiBudW1iZXIgbnVtX3Jlc2VydmVkX3VhcnMgaXMgYWx3YXlzIGZvciB0aGUga2VybmVsLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9iZl9wYWdlc1sweDAwMDA2XTsvKiBNYXhpbXVtIG51bWJlciBvZiBCbHVlRmxhbWUgcGFnZXMgaXMgMl5sb2dfbWF4X2JmX3BhZ2VzICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzJbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWxvZ19tYXhfYmZfcmVnc19wZXJfcGFnZVsweDAwMDA2XTsvKiBNYXhpbXVtIG51bWJlciBvZiBCbHVlRmxhbWUgcmVnaXN0ZXJzIHBlciBwYWdlIGlzIDJebG9nX21heF9iZl9yZWdzX3Blcl9wYWdlLiBJdCBtYXkgYmUgdGhhdCBvbmx5IHRoZSBiZWdpbm5pbmcgb2YgYSBwYWdlIGNvbnRhaW5zIEJsdWVGbGFtZSByZWdpc3RlcnMuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzNbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWxvZ19iZl9yZWdfc2l6ZVsweDAwMDA1XTsvKiBCbHVlRmxhbWUgcmVnaXN0ZXIgc2l6ZSBpbiBieXRlcyBpcyAyXmxvZ19iZl9yZWdfc2l6ZSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM0WzB4MDAwMGFdOworICAgIHBzZXVkb19iaXRfdAliZlsweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCB0byAiMSIgdGhlbiBCbHVlRmxhbWUgbWF5IGJlIHVzZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfZGVzY19zel9zcVsweDAwMDEwXTsvKiBNYXggZGVzY3JpcHRvciBzaXplIGluIGJ5dGVzIGZvciB0aGUgc2VuZCBxdWV1ZSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfc2dfc3FbMHgwMDAwOF07ICAgIC8qIFRoZSBtYXhpbXVtIFMvRyBsaXN0IGVsZW1lbnRzIGluIGEgU1EgV1FFIChtYXhfZGVzY19zei8xNiAtIDMpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzVbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfZGVzY19zel9ycVsweDAwMDEwXTsvKiBNYXggZGVzY3JpcHRvciBzaXplIGluIGJ5dGVzIGZvciB0aGUgcmVjZWl2ZSBxdWV1ZSAqLworICAgIHBzZXVkb19iaXRfdAltYXhfc2dfcnFbMHgwMDAwOF07ICAgIC8qIFRoZSBtYXhpbXVtIFMvRyBsaXN0IGVsZW1lbnRzIGluIGEgUlEgV1FFIChtYXhfZGVzY19zei8xNiAtIDMpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzZbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM3WzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAlmZXhjaF9iYXNlX21wdF8zMV8yNVsweDAwMDA3XTsvKiBIZXJtb24gTmV3LiBGQyBtcHQgYmFzZSBtcHQgbnVtYmVyICovCisgICAgcHNldWRvX2JpdF90CWZjcF91ZF9iYXNlXzIzXzhbMHgwMDAxMF07LyogSGVybW9uIE5ldy4gRkMgdWQgUVAgIGJhc2UgUVBOICovCisgICAgcHNldWRvX2JpdF90CWZleGNoX2Jhc2VfcXBfMjNfMTZbMHgwMDAwOF07LyogSGVybW9uIE5ldy4gRkMgRXhjaGFuZ2UgUVAgYmFzZSBRUE4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzhbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X21jZ1sweDAwMDA4XTsgIC8qIExvZzIgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBncm91cHMgKi8KKyAgICBwc2V1ZG9fYml0X3QJbnVtX3JzdmRfbWNnc1sweDAwMDA0XTsvKiBUaGUgbnVtYmVyIG9mIE1HTXMgcmVzZXJ2ZWQgZm9yIGZpcm13YXJlIHVzZSBpbiB0aGUgTUdIVC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVzZXJ2ZWQgcmVzb3VyY2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8gbnVtX3Jlc2VydmVkX21jZ3MtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIDAgLSBubyByZXNvdXJjZXMgYXJlIHJlc2VydmVkLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM5WzB4MDAwMDRdOworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X3FwX21jZ1sweDAwMDA4XTsvKiBMb2cyIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiBRUHMgcGVyIG11bHRpY2FzdCBncm91cCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQwWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9zcmNkc1sweDAwMDA0XTsvKiBMb2cyIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiBTUkMgRG9tYWlucyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQxWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAludW1fcnN2ZF9zY3Jkc1sweDAwMDA0XTsvKiBUaGUgbnVtYmVyIG9mIFNSQ0RzIHJlc2VydmVkIGZvciBmaXJtd2FyZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVzZXJ2ZWQgcmVzb3VyY2VzIGFyZSBudW1iZXJlZCBmcm9tIDAgdG8gbnVtX3Jlc2VydmVkX3JkZHMtMS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiAwIC0gbm8gcmVzb3VyY2VzIGFyZSByZXNlcnZlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbG9nX21heF9wZFsweDAwMDA1XTsgICAvKiBMb2cyIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiBQRHMgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0MlsweDAwMDA3XTsKKyAgICBwc2V1ZG9fYml0X3QJbnVtX3JzdmRfcGRzWzB4MDAwMDRdOyAvKiBUaGUgbnVtYmVyIG9mIFBEcyByZXNlcnZlZCBmb3IgZmlybXdhcmUgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlc2VydmVkIHJlc291cmNlcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIG51bV9yZXNlcnZlZF9wZHMtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIDAgLSBubyByZXNvdXJjZXMgYXJlIHJlc2VydmVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0M1sweDAwMGMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXFwY19lbnRyeV9zelsweDAwMDEwXTsgLyogUVBDIEVudHJ5IFNpemUgZm9yIHRoZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDggZW50cnkgc2l6ZSBpcyAyNTYgYnl0ZXMgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmRtYXJkY19lbnRyeV9zelsweDAwMDEwXTsvKiBSZG1hUmRDIEVudHJ5IFNpemUgZm9yIHRoZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDggZW50cnkgc2l6ZSBpcyAyNTYgYnl0ZXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWFsdGNfZW50cnlfc3pbMHgwMDAxMF07LyogRXh0ZW5kZWQgUVBDIGVudHJ5IHNpemUgZm9yIHRoZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDggZW50cnkgc2l6ZSBpcyAzMiBieXRlcyAqLworICAgIHBzZXVkb19iaXRfdAlhdXhfZW50cnlfc3pbMHgwMDAxMF07IC8qIEF1eGlsYXJ5IGNvbnRleHQgZW50cnkgc2l6ZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY3FjX2VudHJ5X3N6WzB4MDAwMTBdOyAvKiBDUUMgZW50cnkgc2l6ZSBmb3IgdGhlIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgSW5maW5pSG9zdC1JSUktRVggTVQyNTIwOCBlbnRyeSBzaXplIGlzIDY0IGJ5dGVzICovCisgICAgcHNldWRvX2JpdF90CWVxY19lbnRyeV9zelsweDAwMDEwXTsgLyogRVEgY29udGV4dCBlbnRyeSBzaXplIGZvciB0aGUgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBJbmZpbmlIb3N0LUlJSS1FWCBNVDI1MjA4IGVudHJ5IHNpemUgaXMgNjQgYnl0ZXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNfbXB0X2VudHJ5X3N6WzB4MDAwMTBdOy8qIGNNUFQgZW50cnkgc2l6ZSBpbiBCeXRlcyBmb3IgdGhlIGRldmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDggZW50cnkgc2l6ZSBpcyA2NCBieXRlcyAqLworICAgIHBzZXVkb19iaXRfdAlzcnFfZW50cnlfc3pbMHgwMDAxMF07IC8qIFNSUSBjb250ZXh0IGVudHJ5IHNpemUgZm9yIHRoZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEluZmluaUhvc3QtSUlJLUVYIE1UMjUyMDggZW50cnkgc2l6ZSBpcyAzMiBieXRlcyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZF9tcHRfZW50cnlfc3pbMHgwMDAxMF07LyogZE1QVCBlbnRyeSBzaXplIGluIEJ5dGVzIGZvciB0aGUgZGV2aWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgSW5maW5pSG9zdC1JSUktRVggTVQyNTIwOCBlbnRyeSBzaXplIGlzIDY0IGJ5dGVzICovCisgICAgcHNldWRvX2JpdF90CW10dF9lbnRyeV9zelsweDAwMDEwXTsgLyogTVRUIGVudHJ5IHNpemUgaW4gQnl0ZXMgZm9yIHRoZSBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBJbmZpbmlIb3N0LUlJSS1FWCBNVDI1MjA4IGVudHJ5IHNpemUgaXMgOCBieXRlcyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYm1tZVsweDAwMDAxXTsgICAgICAgICAvKiBCYXNlIE1lbW9yeSBNYW5hZ2VtZW50IEV4dGVuc2lvbiBTdXBwb3J0ICovCisgICAgcHNldWRvX2JpdF90CXdpbl90eXBlWzB4MDAwMDFdOyAgICAgLyogQm91bmQgVHlwZSAyIE1lbW9yeSBXaW5kb3cgQXNzb2NpYXRpb24gbWVjaGFuaXNtOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBUeXBlIDJBIC0gUVAgTnVtYmVyIEFzc29jaWF0aW9uOyBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBUeXBlIDJCIC0gUVAgTnVtYmVyIGFuZCBQRCBBc3NvY2lhdGlvbi4gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXBzWzB4MDAwMDFdOyAgICAgICAgICAvKiBBYmlsaXR5IG9mIHRoaXMgSENBIHRvIHN1cHBvcnQgbXVsdGlwbGUgcGFnZSBzaXplcyBwZXIgTWVtb3J5IFJlZ2lvbi4gKi8KKyAgICBwc2V1ZG9fYml0X3QJYmxbMHgwMDAwMV07ICAgICAgICAgICAvKiBBYmlsaXR5IG9mIHRoaXMgSENBIHRvIHN1cHBvcnQgQmxvY2sgTGlzdCBQaHlzaWNhbCBCdWZmZXIgTGlzdHMuICovCisgICAgcHNldWRvX2JpdF90CXpiWzB4MDAwMDFdOyAgICAgICAgICAgLyogWmVybyBCYXNlZCByZWdpb24vd2luZG93cyBzdXBwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJbGlmWzB4MDAwMDFdOyAgICAgICAgICAvKiBBYmlsaXR5IG9mIHRoaXMgSENBIHRvIHN1cHBvcnQgTG9jYWwgSW52YWxpZGF0ZSBGZW5jaW5nLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQ0WzB4MDAwMWFdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZF9sa2V5WzB4MDAwMjBdOyAgICAvKiBUaGUgdmFsdWUgb2YgdGhlIHJlc2VydmVkIExrZXkgZm9yIEJhc2UgTWVtb3J5IE1hbmFnZW1lbnQgRXh0ZW5zaW9uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQ1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWF4X2ljbV9zaXplX2hbMHgwMDAyMF07LyogQml0cyBbNjM6MzJdIG9mIG1heGltdW0gSUNNIHNpemUgSW5maW5pSG9zdCBJSUkgRXggc3VwcG9ydCBpbiBieXRlcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1heF9pY21fc2l6ZV9sWzB4MDAwMjBdOy8qIEJpdHMgWzMxOjBdIG9mIG1heGltdW0gSUNNIHNpemUgSW5maW5pSG9zdCBJSUkgRXggc3VwcG9ydCBpbiBieXRlcy4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDZbMHgwMDJjMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFFVRVJZX0FEQVBURVIgUGFyYW1ldGVycyBCbG9jayAgICAjIyMjIG1pY2hhbCAtIGdkcm9yIGZpeGVkICovCisKK3N0cnVjdCBoZXJtb25wcm1fcXVlcnlfYWRhcHRlcl9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMThdOworICAgIHBzZXVkb19iaXRfdAlpbnRhcGluWzB4MDAwMDhdOyAgICAgIC8qIERyaXZlciBzaG91bGQgc2V0IHRoaXMgZmllbGQgdG8gSU5UUiB2YWx1ZSBpbiB0aGUgZXZlbnQgcXVldWUgaW4gb3JkZXIgdG8gZ2V0IEV4cHJlc3MgaW50ZXJydXB0IG1lc3NhZ2VzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3ZzZF9zdAl2c2Q7ICAgICAgICAgLyogIyMjbWljaGFsLSB0aGlzIGZpZWxkIHdhcyByZXBsYWNlZCBieSAyIGZpZWxkcyA6IHZzZCAuMTY2NDsgdnNkKGNvbnRpbnVlZC9wc2lkIC4xMjg7ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFFVRVJZX0ZXIFBhcmFtZXRlcnMgQmxvY2sgICAgICAjIyMjIG1pY2hhbCAtIGRvZXNuJ3QgbWF0Y2ggUFJNICovCisKK3N0cnVjdCBoZXJtb25wcm1fcXVlcnlfZndfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWZ3X3Jldl9tYWpvclsweDAwMDEwXTsgLyogRmlybXdhcmUgUmV2aXNpb24gLSBNYWpvciAqLworICAgIHBzZXVkb19iaXRfdAlmd19wYWdlc1sweDAwMDEwXTsgICAgIC8qIEFtb3VudCBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGZvciBGVyB1c2FnZSBpcyBpbiA0S0J5dGUgcGFnZXMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlmd19yZXZfbWlub3JbMHgwMDAxMF07IC8qIEZpcm13YXJlIFJldmlzaW9uIC0gTWlub3IgKi8KKyAgICBwc2V1ZG9fYml0X3QJZndfcmV2X3N1Ym1pbm9yWzB4MDAwMTBdOy8qIEZpcm13YXJlIFN1Yi1taW5vciB2ZXJzaW9uIChQYXRjaCBsZXZlbCkuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbWRfaW50ZXJmYWNlX3JldlsweDAwMDEwXTsvKiBDb21tYW5kIEludGVyZmFjZSBJbnRlcnByZXRlciBSZXZpc2lvbiBJRCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAxMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfbWF4X291dHN0YW5kaW5nX2NtZFsweDAwMDA4XTsvKiBMb2cyIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21tYW5kcyB0aGUgSENSIGNhbiBzdXBwb3J0IHNpbXVsdGFuZW91c2x5ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDE3XTsKKyAgICBwc2V1ZG9fYml0X3QJZHRbMHgwMDAwMV07ICAgICAgICAgICAvKiBEZWJ1ZyBUcmFjZSBTdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIERlYnVnIHRyYWNlIGlzIG5vdCBzdXBwb3J0ZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIERlYnVnIHRyYWNlIGlzIHN1cHBvcnRlZCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAljY3FbMHgwMDAwMV07ICAgICAgICAgIC8qIENDUSBzdXBwb3J0ICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDA2XTsKKyAgICBwc2V1ZG9fYml0X3QJZndfc2Vjb25kc1sweDAwMDA4XTsgICAvKiBGVyB0aW1lc3RhbXAgLSBzZWNvbmRzLiBEaXNwYWx5ZWQgYXMgSGV4YWRlY2ltYWwgbnVtYmVyICovCisgICAgcHNldWRvX2JpdF90CWZ3X21pbnV0ZXNbMHgwMDAwOF07ICAgLyogRlcgdGltZXN0YW1wIC0gbWludXRlcy4gRGlzcGFseWVkIGFzIEhleGFkZWNpbWFsIG51bWJlciAqLworICAgIHBzZXVkb19iaXRfdAlmd19ob3VyWzB4MDAwMDhdOyAgICAgIC8qIEZXIHRpbWVzdGFtcCAtIGhvdXIuICAgIERpc3BhbHllZCBhcyBIZXhhZGVjaW1hbCBudW1iZXIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWZ3X2RheVsweDAwMDA4XTsgICAgICAgLyogRlcgdGltZXN0YW1wIC0gZGF5LiAgICAgRGlzcGFseWVkIGFzIEhleGFkZWNpbWFsIG51bWJlciAqLworICAgIHBzZXVkb19iaXRfdAlmd19tb250aFsweDAwMDA4XTsgICAgIC8qIEZXIHRpbWVzdGFtcCAtIG1vbnRoLiAgIERpc3BhbHllZCBhcyBIZXhhZGVjaW1hbCBudW1iZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJZndfeWVhclsweDAwMDEwXTsgICAgICAvKiBGVyB0aW1lc3RhbXAgLSB5ZWFyLiAgICBEaXNwYWx5ZWQgYXMgSGV4YWRlY2ltYWwgbnVtYmVyIChlLmcuIDB4MjAwNSkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNscl9pbnRfYmFzZV9vZmZzZXRfaFsweDAwMDIwXTsvKiBCaXRzIFs2MzozMl0gb2YgdGhlIENsZWFyIEludGVycnVwdCByZWdpc3RlcsKScyBvZmZzZXQgZnJvbSBjbHJfaW50X2JhciByZWdpc3RlciBpbiBQQ0lhZGRyZXNzIHNwYWNlLiBQb2ludHMgdG8gYSA2NC1iaXQgcmVnaXN0ZXIuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljbHJfaW50X2Jhc2Vfb2Zmc2V0X2xbMHgwMDAyMF07LyogQml0cyBbMzE6MF0gb2YgdGhlIENsZWFyIEludGVycnVwdCByZWdpc3RlcsKScyBvZmZzZXQgZnJvbSBjbHJfaW50X2JhciByZWdpc3RlciBpbiBQQ0lhZGRyZXNzIHNwYWNlLiBQb2ludHMgdG8gYSA2NC1iaXQgcmVnaXN0ZXIuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAxZV07CisgICAgcHNldWRvX2JpdF90CWNscl9pbnRfYmFyWzB4MDAwMDJdOyAgLyogUENJIGJhc2UgYWRkcmVzcyByZWdpc3RlciAoQkFSKSB3aGVyZSBjbHJfaW50IHJlZ2lzdGVyIGlzIGxvY2F0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAgLSBCQVIgMC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEgLSBCQVIgMi0zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgLSBCQVIgNC01CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgLSBSZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBQQ0kgQkFScyBvZiBDb25uZWN0WCBhcmUgNjQgYml0IEJBUnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gQ29ubmVjdFgsIGNscl9pbnQgcmVnaXN0ZXIgaXMgbG9jYXRlZCBvbiBCQVIgMC0xLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXJyb3JfYnVmX29mZnNldF9oWzB4MDAwMjBdOy8qIFJlYWQgT25seSBidWZmZXIgZm9yIGNhdGFzdHJvcGhpYyBlcnJvciByZXBvcnRzIChiaXRzIFs2MzozMl0gb2Ygb2Zmc2V0IGZyb20gZXJyb3JfYnVmX2JhciByZWdpc3RlciBpbiBQQ0kgYWRkcmVzcyBzcGFjZS4pICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcnJvcl9idWZfb2Zmc2V0X2xbMHgwMDAyMF07LyogUmVhZCBPbmx5IGJ1ZmZlciBmb3IgY2F0YXN0cm9waGljIGVycm9yIHJlcG9ydHMgKGJpdHMgWzMxOjBdICBvZiBvZmZzZXQgZnJvbSBlcnJvcl9idWZfYmFyIHJlZ2lzdGVyIGluIFBDSSBhZGRyZXNzIHNwYWNlLikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVycm9yX2J1Zl9zaXplWzB4MDAwMjBdOy8qIFNpemUgaW4gd29yZHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkN1sweDAwMDFlXTsKKyAgICBwc2V1ZG9fYml0X3QJZXJyb3JfYnVmX2JhclsweDAwMDAyXTsvKiBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIChCQVIpIHdoZXJlIGVycm9yX2J1ZiByZWdpc3RlciBpcyBsb2NhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwIC0gQkFSIDAtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxIC0gQkFSIDItMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIC0gQkFSIDQtNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExIC0gUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgUENJIEJBUnMgb2YgQ29ubmVjdFggYXJlIDY0IGJpdCBCQVJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIENvbm5lY3RYLCBlcnJvcl9idWYgcmVnaXN0ZXIgaXMgbG9jYXRlZCBvbiBCQVIgMC0xLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDA2MDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNZW1vcnkgQWNjZXNzIFBhcmFtZXRlcnMgZm9yIFVEIEFkZHJlc3MgVmVjdG9yIFRhYmxlICovCisKK3N0cnVjdCBoZXJtb25wcm1fdWRhdnRhYmxlX21lbW9yeV9wYXJhbWV0ZXJzX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlsX2tleVsweDAwMDIwXTsgICAgICAgIC8qIExfS2V5IHVzZWQgdG8gYWNjZXNzIFRQVCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcGRbMHgwMDAxOF07ICAgICAgICAgICAvKiBQRCB1c2VkIGJ5IFRQVCBmb3IgbWF0Y2hpbmcgYWdhaW5zdCBQRCBvZiByZWdpb24gZW50cnkgYmVpbmcgYWNjZXNzZWQuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA1XTsKKyAgICBwc2V1ZG9fYml0X3QJeGxhdGlvbl9lblsweDAwMDAxXTsgICAvKiBXaGVuIGNsZWFyZWQsIGFkZHJlc3MgaXMgcGh5c2ljYWwgYWRkcmVzcyBhbmQgbm8gdHJhbnNsYXRpb24gd2lsbCBiZSBkb25lLiBXaGVuIHNldCwgYWRkcmVzcyBpcyB2aXJ0dWFsLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwMl07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIElOSVRfSENBICYgUVVFUllfSENBIFBhcmFtZXRlcnMgQmxvY2sgIyMjI21pY2hhbC1kb2Vzbid0IG1hdGNoIFBSTSAoc2VlIGRpZmZlcnMgYmVsb3cpIG5ldyBzaXplIGluIGJ5dGVzOjB4MzAwICovCisKK3N0cnVjdCBoZXJtb25wcm1faW5pdF9oY2Ffc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDE4XTsKKyAgICBwc2V1ZG9fYml0X3QJdmVyc2lvblsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJaGNhX2NvcmVfY2xvY2tbMHgwMDAxMF07LyogSW50ZXJuYWwgQ2xvY2sgZnJlcSBpbiBNSHogKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJvdXRlcl9xcFsweDAwMDE4XTsgICAgLyogUVAgbnVtYmVyIGZvciByb3V0ZXIgbW9kZSAoOCBMU0JpdHMgc2hvdWxkIGJlIDApLiBMb3cgb3JkZXIgOCBiaXRzIGFyZSB0YWtlbiBmcm9tIHRoZSBUQ2xhc3MgZmllbGQgb2YgdGhlIGluY29taW5nIHBhY2tldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCBvbmx5IGlmIFJFIGJpdCBpcyBzZXQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAlpcHIyWzB4MDAwMDFdOyAgICAgICAgIC8qIEhlcm1vbiBOZXcuIElQIHJvdXRlciBvbiBwb3J0IDIgKi8KKyAgICBwc2V1ZG9fYml0X3QJaXByMVsweDAwMDAxXTsgICAgICAgICAvKiBIZXJtb24gTmV3LiBJUCByb3V0ZXIgb24gcG9ydCAxICovCisgICAgcHNldWRvX2JpdF90CWliclsweDAwMDAxXTsgICAgICAgICAgLyogSW5maW5pQmFuZCBSb3V0ZXIgTW9kZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJdWRwWzB4MDAwMDFdOyAgICAgICAgICAvKiBVRCBQb3J0IENoZWNrIEVuYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBQb3J0IGZpZWxkIGluIEFkZHJlc3MgVmVjdG9yIGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gSENBIHdpbGwgY2hlY2sgdGhlIHBvcnQgZmllbGQgaW4gQVYgZW50cnkgKGZldGNoZWQgZm9yIFVEIGRlc2NyaXB0b3IpIGFnYWluc3QgdGhlIFBvcnQgb2YgdGhlIFVEIFFQIGV4ZWN1dGluZyB0aGUgZGVzY3JpcHRvci4gKi8KKyAgICBwc2V1ZG9fYml0X3QJaGVbMHgwMDAwMV07ICAgICAgICAgICAvKiBIb3N0IEVuZGlhbmVzcyAtIFVzZWQgZm9yIEF0b21pYyBPcGVyYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIEhvc3QgaXMgTGl0dGxlIEVuZGlhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBIb3N0IGlzIEJpZyBlbmRpYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAljZVsweDAwMDAxXTsgICAgICAgICAgIC8qIENoZWNrc3VtIEVuYWJsZWQgLSB3aGVuIFNldCBJUG92ZXJJQiBjaGVja3N1bSBnZW5lcmF0aW9uICYgY2hlY2tpbmcgaXMgZW5hYmxlZCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDVbMHgwMDAxY107CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDZbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fcXBjYmFzZWFkZHJfc3QJcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzOy8qICMjIG1pY2hhbCAtIHRoaXMgZmllbGQgaGFzIGNoZW5nZWQgdG8gLSAicXBjX2NxY19lcWNfcGFyYW1ldGVycyIgLSBnZHJvciwgdGhpcyBpcyBvayBmb3Igbm93ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDdbMHgwMDEwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fbXVsdGljYXN0cGFyYW1fc3QJbXVsdGljYXN0X3BhcmFtZXRlcnM7LyogIyNtaWNoYWwtIHRoaXMgZmllbGQgaGFzIGNoZW5nZWQgdG8gLSAiSUJVRC9JUHY2X211bHRpY2FzdF9wYXJhbWV0ZXJzIiAtIGdkcm9yIC0gdGhpcyBpcyBPSyBmb3Igbm93ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDhbMHgwMDA4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fdHB0cGFyYW1zX3N0CXRwdF9wYXJhbWV0ZXJzOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3Vhcl9wYXJhbXNfc3QJdWFyX3BhcmFtZXRlcnM7LyogVUFSIFBhcmFtZXRlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTBbMHgwMDYwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEV2ZW50IFF1ZXVlIENvbnRleHQgVGFibGUgRW50cnkgICAgICMjIyMgbWljaGFsIC0gZ2Ryb3IgZml4ZWQgKi8KKworc3RydWN0IGhlcm1vbnBybV9lcWNfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJc3RbMHgwMDAwNF07ICAgICAgICAgICAvKiBFdmVudCBkZWxpdmVyeSBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5IC0gQXJtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEEgLSBGaXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QiAtIEFsd2F5c19Bcm1lZCAoYXV0by1yZWFybSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciAtIHJlc2VydmVkICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDA1XTsKKyAgICBwc2V1ZG9fYml0X3QJb2lbMHgwMDAwMV07ICAgICAgICAgICAvKiBPZXJydW4gaWdub3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCwgSFcgd2lsbCBub3QgY2hlY2sgRVEgZnVsbCBjb25kaXRpb24gd2hlbiB3cml0aW5nIG5ldyBFUUVzLiAqLworICAgIHBzZXVkb19iaXRfdAllY1sweDAwMDAxXTsgICAgICAgICAgIC8qIGlzIHNldCwgYWxsIEVRRXMgYXJlIHdyaXR0ZW4gKGNvYWxlc2NlZCkgdG8gZmlyc3QgRVEgZW50cnkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDldOworICAgIHBzZXVkb19iaXRfdAlzdGF0dXNbMHgwMDAwNF07ICAgICAgIC8qIEVRIHN0YXR1czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMDAwIC0gT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDEwIC0gRVEgd3JpdGUgZmFpbHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIGZvciB0aGUgUVVFUllfRVEgYW5kIEhXMlNXX0VRIGNvbW1hbmRzIG9ubHkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDA1XTsKKyAgICBwc2V1ZG9fYml0X3QJcGFnZV9vZmZzZXRbMHgwMDAwN107ICAvKiBvZmZzZXQgYml0c1sxMTo1XSBvZiBmaXJzdCBFUUUgaW4gdGhlIEVRIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBwYWdlIGluIG1lbW9yeSByZWdpb24gbWFwcGluZyB0aGlzIEVRICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDE0XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMDE4XTsKKyAgICBwc2V1ZG9fYml0X3QJbG9nX2VxX3NpemVbMHgwMDAwNV07ICAvKiBMb2cgKGJhc2UgMikgb2YgdGhlIEVRIHNpemUgKGluIGVudHJpZXMpLiAgTWF4aW11bSBFUSBzaXplIGlzIDJeMjIgRVFFcyAobWF4IGxvZ19lcV9zaXplIGlzIDIyKSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDdbMHgwMDAwM107CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcV9tYXhfY291bnRbMHgwMDAxMF07IC8qIEV2ZW50IEdlbmVyYXRpb24gTW9kZXJhdGlvbiBjb3VudGVyICovCisgICAgcHNldWRvX2JpdF90CWVxX3BlcmlvZFsweDAwMDEwXTsgICAgLyogRXZlbnQgR2VuZXJhdGlvbiBtb2RlcmF0aW9uIHRpbWVkLCBtaWNyb3NlY29uZHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWludHJbMHgwMDAwYV07ICAgICAgICAgLyogTVNJLVggdGFibGUgZW50cnkgaW5kZXggdG8gYmUgdXNlZCB0byBzaWduYWwgaW50ZXJydXB0cyBvbiB0aGlzIEVRLiAgUmVzZXJ2ZWQgaWYgTVNJLVggYXJlIG5vdCBlbmFibGVkIGluIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBoZWFkZXIuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOFsweDAwMDE2XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF9iYXNlX2FkZHJfaFsweDAwMDA4XTsvKiBNVFQgQmFzZSBBZGRyZXNzIFszOTozMl0gcmVsYXRpdmUgdG8gSU5JVF9IQ0EubXR0X2Jhc2VfYWRkciAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDlbMHgwMDAxMF07CisgICAgcHNldWRvX2JpdF90CWxvZzJfcGFnZV9zaXplWzB4MDAwMDZdOy8qIExvZyAoYmFzZSAyKSBvZiBNVFQgcGFnZSBzaXplIGluIHVuaXRzIG9mIDRLQnl0ZSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEwWzB4MDAwMDJdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMVsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJbXR0X2Jhc2VfYWRkcl9sWzB4MDAwMWRdOy8qIE1UVCBCYXNlIEFkZHJlc3MgWzMxOjNdIHJlbGF0aXZlIHRvIElOSVRfSENBLm10dF9iYXNlX2FkZHIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTJbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljb25zdW1lcl9jb3VudGVyWzB4MDAwMThdOy8qIENvbnN1bWVyIGNvdW50ZXIuIFRoZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIEVRRSBwb2xsZWQgZnJvbSB0aGUgRVEuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIDB4MCBpbiBFUSBpbml0aWFsaXphdGlvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW50YWluZWQgYnkgSFcgKHZhbGlkIGZvciB0aGUgUVVFUllfRVEgY29tbWFuZCBvbmx5KS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxM1sweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXByb2R1Y2VyX2NvdW50ZXJbMHgwMDAxOF07LyogUHJvZHVjZXIgQ291dG5lci4gVGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggRVFFIHRoYXQgaXMgd3JpdHRlbiBieSB0aGUgSFcgdG8gdGhlIEVRLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVEgb3ZlcnJ1biBpcyByZXBvcnRlZCBpZiBQcm9kdWNlcl9jb3VudGVyICsgMSBlcXVhbHMgdG8gQ29uc3VtZXJfY291bnRlciBhbmQgYSBFUUUgbmVlZHMgdG8gYmUgYWRkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW50YWluZWQgYnkgSFcgKHZhbGlkIGZvciB0aGUgUVVFUllfRVEgY29tbWFuZCBvbmx5KSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE0WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNVsweDAwMDgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogTWVtb3J5IFRyYW5zbGF0aW9uIFRhYmxlIChNVFQpIEVudHJ5ICAgICAjIyMjIG1pY2hhbCAtIG1hdGNoIHRvIFBSTSAqLworCitzdHJ1Y3QgaGVybW9ucHJtX210dF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcHRhZ19oWzB4MDAwMjBdOyAgICAgICAvKiBIaWdoLW9yZGVyIGJpdHMgb2YgcGh5c2ljYWwgdGFnLiBUaGUgc2l6ZSBvZiB0aGUgZmllbGQgZGVwZW5kcyBvbiB0aGUgcGFnZSBzaXplIG9mIHRoZSByZWdpb24uIE1heGltdW0gUFRBRyBzaXplIGlzIDUyIGJpdHMuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlwWzB4MDAwMDFdOyAgICAgICAgICAgIC8qIFByZXNlbnQgYml0LiBJZiBzZXQsIHBhZ2UgZW50cnkgaXMgdmFsaWQuIElmIGNsZWFyZWQsIGFjY2VzcyB0byB0aGlzIHBhZ2Ugd2lsbCBnZW5lcmF0ZSBub24tcHJlc2VudCBwYWdlIGFjY2VzcyBmYXVsdC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlwdGFnX2xbMHgwMDAxZF07ICAgICAgIC8qIExvdy1vcmRlciBiaXRzIG9mIFBoeXNpY2FsIHRhZy4gVGhlIHNpemUgb2YgdGhlIGZpZWxkIGRlcGVuZHMgb24gdGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgcmVnaW9uLiBNYXhpbXVtIFBUQUcgc2l6ZSBpcyA1MiBiaXRzLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBNZW1vcnkgUHJvdGVjdGlvbiBUYWJsZSAoTVBUKSBFbnRyeSAgICMjIyBkb2Vzbid0IG1hdGNoIFBSTSAobmV3IGZpZWxkcyB3ZXJlIGFkZGVkKS4gbmV3IHNpemUgaW4gYnl0ZXMgOiAweDU0ICovCisKK3N0cnVjdCBoZXJtb25wcm1fbXB0X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXJfd1sweDAwMDAxXTsgICAgICAgICAgLyogRGVmaW5lcyB3aGV0aGVyIHRoaXMgZW50cnkgaXMgUmVnaW9uICgxKSBvciBXaW5kb3cgKDApICovCisgICAgcHNldWRvX2JpdF90CXBhWzB4MDAwMDFdOyAgICAgICAgICAgLyogUGh5c2ljYWwgYWRkcmVzcy4gSWYgc2V0LCBubyB2aXJ0dWFsLXRvLXBoeXNpY2FsIGFkZHJlc3MgdHJhbnNsYXRpb24gaXMgcGVyZm9ybWVkIGZvciB0aGlzIHJlZ2lvbiAqLworICAgIHBzZXVkb19iaXRfdAlsclsweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCAtIGxvY2FsIHJlYWQgYWNjZXNzIGlzIGVuYWJsZWQuIE11c3QgYmUgc2V0IGZvciBhbGwgTVBUIEVudHJpZXMuICovCisgICAgcHNldWRvX2JpdF90CWx3WzB4MDAwMDFdOyAgICAgICAgICAgLyogSWYgc2V0IC0gbG9jYWwgd3JpdGUgYWNjZXNzIGlzIGVuYWJsZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcnJbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgLSByZW1vdGUgcmVhZCBhY2Nlc3MgaXMgZW5hYmxlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcndbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgLSByZW1vdGUgd3JpdGUgYWNjZXNzIGlzIGVuYWJsZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJYXRvbWljWzB4MDAwMDFdOyAgICAgICAvKiBJZiBzZXQgLSByZW1vdGUgQXRvbWljIGFjY2VzcyBpcyBhbGxvd2VkLiAqLworICAgIHBzZXVkb19iaXRfdAllYlsweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCAtIGJpbmQgaXMgZW5hYmxlZC4gVmFsaWQgb25seSBmb3IgcmVnaW9ucy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJYXRjX3JlcVsweDAwMDAxXTsgICAgICAvKiBJZiBzZXQsIHNlY29uZCBob3Agb2YgYWRkcmVzcyB0cmFuc2xhdGlvbiAoUEEgdG8gTUEpIHRvIGJlIHBlcmZvcm1lZCBpbiB0aGUgZGV2aWNlIHByaW9yIHRvIGlzc3VpbmcgdGhlIHVwbGluayByZXF1ZXN0LiAqLworICAgIHBzZXVkb19iaXRfdAlhdGNfeGxhdGVkWzB4MDAwMDFdOyAgIC8qIElmIHNldCwgdXBsaW5rIGN5Y2xlIHRvIGJlIGlzc3VlcyB3aXRoIMKTQVRDX3RyYW5zbGF0ZWTClCBpbmRpY2F0b3IgdG8gZm9yY2UgYnlwYXNzIG9mIHRoZSBjaGlwc2V0IElPTU1VLiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CW5vX3Nub29wWzB4MDAwMDFdOyAgICAgLyogSWYgc2V0LCBpc3N1ZSBQQ0llIGN5Y2xlIHdpdGggw7tubyBTbm9vcMO/IGF0dHJpYnV0ZSAtIGN5Y2xlIG5vdCB0byBiZSBzbm9vcGVkIGluIENQVSBjYWNoZXMgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlzdGF0dXNbMHgwMDAwNF07ICAgICAgIC8qIDB4RiAtIE5vdCBWYWxpZCAweDMgLSBGcmVlLiBlbHNlIC0gSFcgb3duZXJzaGlwLlVuYm91bmQgVHlwZTEgd2luZG93cyBhcmUgZGVub3RlZCBieSByZWdfd25kX2xlbj0wLiBVbmJvdW5kIFR5cGUgSUkgd2luZG93cyBhcmUgZGVub3RlZCBieSBTdGF0dXMgPSBGcmVlLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMDddOworICAgIHBzZXVkb19iaXRfdAlicXBbMHgwMDAwMV07ICAgICAgICAgIC8qIDAgLSBub3QgYm91bmQgdG8gcXAgKHR5cGUgMSB3aW5kb3csIE1SKTEgLSBib3VuZCB0byBxcCAodHlwZSAyIHdpbmRvdykgKi8KKyAgICBwc2V1ZG9fYml0X3QJcXBuWzB4MDAwMThdOyAgICAgICAgICAvKiBRUCBudW1iZXIgdGhpcyBNVyBpcyBhdHRhY2hlZCB0by4gVmFsaWQgZm9yIHR5cGUyIG1lbW9yeSB3aW5kb3dzIGFuZCBvbiBRVUVSWV9NUFQgb25seSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbWVtX2tleVsweDAwMDIwXTsgICAgICAvKiBUaGUgbWVtb3J5IEtleS4gVGhlIGZpZWxkIGhvbGRzIHRoZSBtZW1fa2V5IGZpZWxkIGluIHRoZSBmb2xsb3dpbmcgc2VtYW50aWNzOiB7a2V5Wzc6MF0sa2V5WzMxOjhdfS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBkWzB4MDAwMThdOyAgICAgICAgICAgLyogUHJvdGVjdGlvbiBEb21haW4uIElmIFZNTSBzdXBwb3J0IGlzIGVuYWJsZWQgUERbMTc6MjNdIHNwZWNpZnkgR3Vlc3QgVk0gSWRlbnRpZmllciAqLworICAgIHBzZXVkb19iaXRfdAllbl9yaW52WzB4MDAwMDFdOyAgICAgIC8qIEVuYWJsZSByZW1vdGUgaW52YWxpZGF0aW9uICovCisgICAgcHNldWRvX2JpdF90CWVpWzB4MDAwMDFdOyAgICAgICAgICAgLyogRW5hYmxlIEludmFsaWRhdGlvbiAtIFdoZW4gc2V0LCBMb2NhbC9SZW1vdGUgaW52YWxpZGF0aW9uIGNhbiBiZSBleGVjdXRlZCBvbiB0aGlzIHdpbmRvdy9yZWdpb24uIE11c3QgYmUgc2V0IGZvciB0eXBlMiB3aW5kb3dzIGFuZCBub24tc2hhcmVkIHBoeXNpY2FsIG1lbW9yeSByZWdpb25zLiBNdXN0IGJlIGNsZWFyIGZvciByZWdpb25zIHRoYXQgYXJlIHVzZWQgdG8gYWNjZXNzIFdvcmsgUXVldWVzLCBDb21wbGV0aW9uIFF1ZXVlcyBhbmQgRXZlbnQgUXVldWVzICovCisgICAgcHNldWRvX2JpdF90CW5jZVsweDAwMDAxXTsgICAgICAgICAgLyogRGF0YSBjYW4gYmUgY2FjaGVkIGluIE5ldHdvcmsgQ2FjaGUgKHNlZSDDu05ldHdvcmsgQ2FjaGXDvyBvbiBwYWdlIDgxKSAqLworICAgIHBzZXVkb19iaXRfdAlmcmVbMHgwMDAwMV07ICAgICAgICAgIC8qIFdoZW4gc2V0LCBGYXN0IFJlZ2lzdHJhdGlvbiBPcGVyYXRpb25zIGNhbiBiZSBleGVjdXRlZCBvbiB0aGlzIHJlZ2lvbiAqLworICAgIHBzZXVkb19iaXRfdAlyYWVbMHgwMDAwMV07ICAgICAgICAgIC8qIFdoZW4gc2V0LCByZW1vdGUgYWNjZXNzIGNhbiBiZSBlbmFibGVkIG9uIHRoaXMgcmVnaW9uLiBVc2VkIHdoZW4gZXhlY3V0aW5nIEZhc3QgUmVnaXN0cmF0aW9uIFdvcmsgUmVxdWVzdCB0byB2YWxpZGF0ZSB0aGF0IHJlbW90ZSBhY2Nlc3MgcmlnaHRzIGNhbiBiZSBncmFudGVkIHRvIHRoaXMgTVBULiBJZiB0aGUgYml0IGlzIGNsZWFyZWQsIEZhc3QgUmVnaXN0cmF0aW9uIFdvcmsgUmVxdWVzdCByZXF1ZXN0aW5nIHJlbW90ZSBhY2Nlc3MgcmlnaHRzIHdpbGwgZmFpbCAqLworICAgIHBzZXVkb19iaXRfdAl3X2RpZlsweDAwMDAxXTsgICAgICAgIC8qIFdpcmUgc3BhY2UgY29udGFpbnMgZGlmICovCisgICAgcHNldWRvX2JpdF90CW1fZGlmWzB4MDAwMDFdOyAgICAgICAgLyogTWVtb3J5IHNwYWNlIGNvbnRhaW5zIGRpZiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDRbMHgwMDAwMV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzdGFydF9hZGRyX2hbMHgwMDAyMF07IC8qIFN0YXJ0IEFkZHJlc3MgLSBWaXJ0dWFsIEFkZHJlc3Mgd2hlcmUgdGhpcyByZWdpb24vd2luZG93IHN0YXJ0cyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3RhcnRfYWRkcl9sWzB4MDAwMjBdOyAvKiBTdGFydCBBZGRyZXNzIC0gVmlydHVhbCBBZGRyZXNzIHdoZXJlIHRoaXMgcmVnaW9uL3dpbmRvdyBzdGFydHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxlbl9oWzB4MDAwMjBdOyAgICAgICAgLyogUmVnaW9uL1dpbmRvdyBMZW5ndGggKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxlbl9sWzB4MDAwMjBdOyAgICAgICAgLyogUmVnaW9uL1dpbmRvdyBMZW5ndGggKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWxrZXlbMHgwMDAyMF07ICAgICAgICAgLyogTXVzdCBiZSAwIGZvciBTVzJIV19NUFQuIE9uIFFVRVJZX01QVCBhbmQgSFcyU1dfTVBUIGNvbW1hbmRzIGZvciBNZW1vcnkgV2luZG93IGl0IHJlZmxlY3RzIHRoZSBMS2V5IG9mIHRoZSBSZWdpb24gdGhhdCB0aGUgV2luZG93IGlzIGJvdW5kIHRvLlRoZSBmaWVsZCBob2xkcyB0aGUgbGtleSBmaWVsZCBpbiB0aGUgZm9sbG93aW5nIHNlbWFudGljczoge2tleVs3OjBdLGtleVszMTo4XX0uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl3aW5fY250WzB4MDAwMThdOyAgICAgIC8qIE51bWJlciBvZiB3aW5kb3dzIGJvdW5kIHRvIHRoaXMgcmVnaW9uLiBWYWxpZCBmb3IgcmVnaW9ucyBvbmx5LlRoZSBmaWVsZCBpcyB2YWxpZCBvbmx5IGZvciB0aGUgUVVFUllfTVBUIGFuZCBIVzJTV19NUFQgY29tbWFuZHMuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF9yZXBbMHgwMDAwNF07ICAgICAgLyogTG9nIChiYXNlIDIpIG9mIHRoZSBudW1iZXIgb2YgdGltZSBhbiBNVFQgaXMgcmVwbGljYXRlZC5FLmcuIGZvciA2NEtCIHZpcnR1YWwgYmxvY2tzIGZyb20gNTEyQiBibG9ja3MsIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDJeNyBpcyBuZWVkZWQgKE1UVF9SRVBMSUNBVElPTl9GQUNUT1I9NykuVXAgdG8gMU1CIG9mIHJlcGxpY2F0ZWQgYmxvY2sgd29ya3MgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2WzB4MDAwMTFdOworICAgIHBzZXVkb19iaXRfdAlibG9ja19tb2RlWzB4MDAwMDFdOyAgIC8qIElmIHNldCwgdGhlIHBhZ2Ugc2l6ZSBpcyBub3QgcG93ZXIgb2YgdHdvLCBhbmQgZW50aXR5X3NpemUgaXMgaW4gYnl0ZXMuICovCisgICAgcHNldWRvX2JpdF90CWxlbjY0WzB4MDAwMDFdOyAgICAgICAgLyogUmVnaW9uL1dpbmRvdyBMZW5ndGhbNjRdLiBUaGlzIGJpdCBhZGRlZCB0byBlbmFibGUgcmVnaXN0ZXJpbmcgMl42NCBieXRlcyBwZXIgcmVnaW9uICovCisgICAgcHNldWRvX2JpdF90CWZib19lblsweDAwMDAxXTsgICAgICAgLyogSWYgc2V0LCBtdHRfZmJvIGZpZWxkIGlzIHZhbGlkLCBvdGhlcndpc2UgaXQgaXMgY2FsY3VsYXRlZCBmcm9tIGxlYXN0IHNpZ25pZmljYW50IGJ5dGVzIG9mIHRoZSBhZGRyZXNzLiBNdXN0IGJlIHNldCB3aGVuIG10dF9yZXAgaXMgdXNlZCBvciBNUFQgaXMgYmxvY2stbW9kZSByZWdpb24gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ3WzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXR0X2Fkcl9oWzB4MDAwMDhdOyAgICAvKiBPZmZzZXQgdG8gTVRUIGxpc3QgZm9yIHRoaXMgcmVnaW9uLiBNdXN0IGJlIGFsaWduZWQgb24gOCBieXRlcy4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAwMThdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXR0X2Fkcl9sWzB4MDAwMjBdOyAgICAvKiBPZmZzZXQgdG8gTVRUIGxpc3QgZm9yIHRoaXMgcmVnaW9uLiBNdXN0IGJlIGFsaWduZWQgb24gOCBieXRlcy4jIyNtaWNoYWwtcmVscGFjZWQgd2l0aDogUkVTRVJWRUQgLjM7bXR0X2Fkcl9sIC4yOTsgZ2Ryb3IgLSB0aGlzIGlzIE9LIHRvIGxlYXZlIGl0IHRoaXMgd2F5LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXR0X3NpemVbMHgwMDAyMF07ICAgICAvKiBOdW1iZXIgb2YgTVRUIGVudHJpZXMgYWxsb2NhdGVkIGZvciB0aGlzIE1SLldoZW4gRmFzdCBSZWdpc3RyYXRpb24gT3BlcmF0aW9ucyBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gdGhpcyByZWdpb24gKEZSRSBiaXQgaXMgemVybykgdGhpcyBmaWVsZCBpcyByZXNlcnZlZC5XaGVuIEZhc3QgUmVnaXN0cmF0aW9uIE9wZXJhdGlvbiBpcyBlbmFibGVkIChGUkUgYml0IGlzIHNldCkgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBNVFRzIGFsbG9jYXRlZCBmb3IgdGhpcyBNUi4gSWYgbXR0X3N6IHZhbHVlIGNhbm5vdCBiZSB6ZXJvLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZW50aXR5X3NpemVbMHgwMDAxNV07ICAvKiBQYWdlL2Jsb2NrIHNpemUuIElmIE1QVCBtYXBzIHBhZ2VzLCB0aGUgcGFnZSBzaXplIGlzIDJlbnRpcnlfc2l6ZS4gSWYgTVBUIG1hcHMgYmxvY2tzLCB0aGUgZW50aXR5X3NpemUgZmllbGQgc3BlY2lmaWVzIGJsb2NrIHNpemUgaW4gYnl0ZXMuIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBjYW4gYmUgbWFwcGVkIHdpdGggc2luZ2xlIE1UVCBpcyA1MTIgYnl0ZXMuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOVsweDAwMDBiXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF9mYm9bMHgwMDAxNV07ICAgICAgLyogRmlyc3QgYnl0ZSBvZmZzZXQgaW4gdGhlIHplcm8tYmFzZWQgcmVnaW9uIC0gdGhlIGZpcnN0IGJ5dGUgd2l0aGluIHRoZSBmaXJzdCBibG9jay9wYWdlIHN0YXJ0IGFkZHJlc3MgcmVmZXJzIHRvLiBXaGVuIG10dF9yZXAgaXMgYmVpbmcgdXNlZCwgZmJvIHBvaW50cyB3aXRoaW4gdGhlIHJlcGxpY2F0ZWQgYmxvY2sgKGkuZS4gYmxvY2stc2l6ZSB4IDJebXR0X3JlcCkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMFsweDAwMDBiXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogQ29tcGxldGlvbiBRdWV1ZSBDb250ZXh0IFRhYmxlIEVudHJ5CSMjIyMgbWljaGFsIC0gbWF0Y2ggUFJNICovCisKK3N0cnVjdCBoZXJtb25wcm1fY29tcGxldGlvbl9xdWV1ZV9jb250ZXh0X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CXN0WzB4MDAwMDRdOyAgICAgICAgICAgLyogRXZlbnQgZGVsaXZlcnkgc3RhdGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCAtIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5IC0gQVJNRUQgKFJlcXVlc3QgZm9yIE5vdGlmaWNhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYgLSBBUk1FRCBTT0xJQ0lURUQgKFJlcXVlc3QgU29saWNpdGVkIE5vdGlmaWNhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEEgLSBGSVJFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIC0gcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIDB4MCBpbiBDUSBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCBmb3IgdGhlIFFVRVJZX0NRIGFuZCBIVzJTV19DUSBjb21tYW5kcyBvbmx5LiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwNV07CisgICAgcHNldWRvX2JpdF90CW9pWzB4MDAwMDFdOyAgICAgICAgICAgLyogV2hlbiBzZXQsIG92ZXJydW4gaWdub3JlIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBzZXQsIFVwZGF0ZXMgb2YgQ1EgY29uc3VtZXIgY291bnRlciAocG9sbCBmb3IgY29tcGxldGlvbikgb3IgUmVxdWVzdCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbnMgKEFybSBDUSkgZG9vcmJlbGxzIHNob3VsZCBub3QgYmUgcmFuZyBvbiB0aGF0IENRLiAqLworICAgIHBzZXVkb19iaXRfdAljY1sweDAwMDAxXTsgICAgICAgICAgIC8qIGlzIHNldCwgYWxsIENRRXMgYXJlIHdyaXR0ZW4gKGNvYWxlc2NlZCkgdG8gZmlyc3QgQ1EgZW50cnkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDldOworICAgIHBzZXVkb19iaXRfdAlzdGF0dXNbMHgwMDAwNF07ICAgICAgIC8qIENRIHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDAgLSBPSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDEgLSBDUSBvdmVyZmxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTAgLSBDUSB3cml0ZSBmYWlsdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgZm9yIHRoZSBRVUVSWV9DUSBhbmQgSFcyU1dfQ1EgY29tbWFuZHMgb25seSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0WzB4MDAwMDVdOworICAgIHBzZXVkb19iaXRfdAlwYWdlX29mZnNldFsweDAwMDA3XTsgIC8qIG9mZnNldCBvZiBmaXJzdCBDUUUgaW4gdGhlIENRIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBwYWdlIGluIG1lbW9yeSByZWdpb24gbWFwcGluZyB0aGlzIENRICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDE0XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXVzcl9wYWdlWzB4MDAwMThdOyAgICAgLyogVUFSIHBhZ2UgdGhpcyBDUSBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCAocmluZ2luaWcgQ1EgZG9vcmJlbGxzKSAqLworICAgIHBzZXVkb19iaXRfdAlsb2dfY3Ffc2l6ZVsweDAwMDA1XTsgIC8qIExvZyAoYmFzZSAyKSBvZiB0aGUgQ1Egc2l6ZSAoaW4gZW50cmllcykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bSBDUSBzaXplIGlzIDJeMTcgQ1FFcyAobWF4IGxvZ19jcV9zaXplIGlzIDE3KSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDZbMHgwMDAwM107CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljcV9tYXhfY291bnRbMHgwMDAxMF07IC8qIEV2ZW50IEdlbmVyYXRpb24gTW9kZXJhdGlvbiBjb3VudGVyICovCisgICAgcHNldWRvX2JpdF90CWNxX3BlcmlvZFsweDAwMDEwXTsgICAgLyogRXZlbnQgR2VuZXJhdGlvbiBtb2RlcmF0aW9uIHRpbWVkLCBtaWNyb3NlY29uZHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNfZXFuWzB4MDAwMDldOyAgICAgICAgLyogRXZlbnQgUXVldWUgdGhpcyBDUSByZXBvcnRzIGNvbXBsZXRpb24gZXZlbnRzIHRvLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIHZhbHVlcyBhcmUgMCB0byA2MworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGNvbmZpZ3VyZWQgdG8gdmFsdWUgb3RoZXIgdGhhbiAwLTYzLCBjb21wbGV0aW9uIGV2ZW50cyB3aWxsIG5vdCBiZSByZXBvcnRlZCBvbiB0aGUgQ1EuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkN1sweDAwMDE3XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW10dF9iYXNlX2FkZHJfaFsweDAwMDA4XTsvKiBNVFQgQmFzZSBBZGRyZXNzIFszOTozMl0gaW4gSUNNIHJlbGF0aXZlIHRvIElOSVRfSENBLm10dF9iYXNlX2FkZHIgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ4WzB4MDAwMTBdOworICAgIHBzZXVkb19iaXRfdAlsb2cyX3BhZ2Vfc2l6ZVsweDAwMDA2XTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ5WzB4MDAwMDJdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMFsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJbXR0X2Jhc2VfYWRkcl9sWzB4MDAwMWRdOy8qIE1UVCBCYXNlIEFkZHJlc3MgWzMxOjNdIGluIElDTSByZWxhdGl2ZSB0byBJTklUX0hDQS5tdHRfYmFzZV9hZGRyICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsYXN0X25vdGlmaWVkX2luZHhbMHgwMDAxOF07LyogTWFpbnRhaW5lZCBieSBIVy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCBmb3IgUVVFUllfQ1EgYW5kIEhXMlNXX0NRIGNvbW1hbmRzIG9ubHkuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzb2xpY2l0X3Byb2R1Y2VyX2luZHhbMHgwMDAxOF07LyogTWFpbnRhaW5lZCBieSBIVy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCBmb3IgUVVFUllfQ1EgYW5kIEhXMlNXX0NRIGNvbW1hbmRzIG9ubHkuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEyWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY29uc3VtZXJfY291bnRlclsweDAwMDE4XTsvKiBDb25zdW1lciBjb3VudGVyIGlzIGEgMzJiaXRzIGNvdW50ZXIgdGhhdCBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBDUUUgcG9vbGVkIGZyb20gdGhlIENRLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEzWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcHJvZHVjZXJfY291bnRlclsweDAwMDE4XTsvKiBQcm9kdWNlciBjb3VudGVyIGlzIGEgMzJiaXRzIGNvdW50ZXIgdGhhdCBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBDUUUgdGhhdCBpcyB3cml0dGVuIGJ5IHRoZSBIVyB0byB0aGUgQ1EuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Egb3ZlcnJ1biBpcyByZXBvcnRlZCBpZiBQcm9kdWNlcl9jb3VudGVyICsgMSBlcXVhbHMgdG8gQ29uc3VtZXJfY291bnRlciBhbmQgYSBDUUUgbmVlZHMgdG8gYmUgYWRkZWQuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW50YWluZWQgYnkgSFcgKHZhbGlkIGZvciB0aGUgUVVFUllfQ1EgYW5kIEhXMlNXX0NRIGNvbW1hbmRzIG9ubHkpICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTRbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDE1WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWRiX3JlY29yZF9hZGRyX2hbMHgwMDAyMF07LyogQ1EgREIgUmVjb3JkIHBoeXNpY2FsIGFkZHJlc3MgWzYzOjMyXSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxN1sweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJZGJfcmVjb3JkX2FkZHJfbFsweDAwMDFkXTsvKiBDUSBEQiBSZWNvcmQgcGh5c2ljYWwgYWRkcmVzcyBbMzE6M10gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogR1BJT19ldmVudF9kYXRhICAgIyMjIyBtaWNoYWwgLSBnZHJvciBmaXhlZCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX2dwaW9fZXZlbnRfZGF0YV9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZ3Bpb19ldmVudF9oaVsweDAwMDIwXTsvKiBJZiBhbnkgYml0IGlzIHNldCB0byAxLCB0aGVuIGEgcmlzaW5nL2ZhbGxpbmcgZXZlbnQgaGFzIG9jY3VycmVkIG9uIHRoZSBjb3Jyc3BvbmRpbmcgR1BJTyBwaW4uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlncGlvX2V2ZW50X2xvWzB4MDAwMjBdOy8qIElmIGFueSBiaXQgaXMgc2V0IHRvIDEsIHRoZW4gYSByaXNpbmcvZmFsbGluZyBldmVudCBoYXMgb2NjdXJyZWQgb24gdGhlIGNvcnJzcG9uZGluZyBHUElPIHBpbi4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogRXZlbnRfZGF0YSBGaWVsZCAtIFFQL0VFIEV2ZW50cyAgICAgIyMjIyBtaWNoYWwgLSBkb2Vzbid0IG1hdGNoIFBSTSAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3FwX2VlX2V2ZW50X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlxcG5fZWVuWzB4MDAwMThdOyAgICAgIC8qIFFQL0VFL1NSUSBudW1iZXIgZXZlbnQgaXMgcmVwb3J0ZWQgZm9yICAjIyNtaWNoYWwgLSBmaWVsZCBjaGFuZ2VkIHRvIFFQIG51bWJlciAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAxY107CisgICAgcHNldWRvX2JpdF90CWVfcVsweDAwMDAxXTsgICAgICAgICAgLyogSWYgc2V0IC0gRUVOIGlmIGNsZWFyZWQgLSBRUCBpbiB0aGUgUVBOL0VFTiBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB2YWxpZCBvbiBTUlEgZXZlbnRzICAjIyNtaWNoYWwgLSBmaWVsZCByZXBsYWNlZCB3aXRoIFJFU0VSVkVEICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDAwMDAzXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDYwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogSW5maW5pSG9zdC1JSUktRVggVHlwZTAgQ29uZmlndXJhdGlvbiBIZWFkZXIgICAjIyMjbWljaGFsIC0gZG9lc24ndCBtYXRjaCBQUk0gKG5ldyBmaWVsZHMgYWRkZWQsIHNlZSBiZWxvdykgKi8KKworc3RydWN0IGhlcm1vbnBybV9tdDI1MjA4X3R5cGUwX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAl2ZW5kb3JfaWRbMHgwMDAxMF07ICAgIC8qIEhhcmR3aXJlZCB0byAweDE1QjMgKi8KKyAgICBwc2V1ZG9fYml0X3QJZGV2aWNlX2lkWzB4MDAwMTBdOyAgICAvKiAyNTIwOCAoZGVjaW1hbCkgLSBJbmZpbmlIb3N0LUlJSSBjb21wYXRpYmxlIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTQwOCAoZGVjaW1hbCkgLSBJbmZpbmlIb3N0LUlJSSBFWCBtb2RlICh0aGUgbW9kZSBkZXNjcmliZWQgaW4gdGhpcyBtYW51YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUyMDkgKGRlY2ltYWwpIC0gRmxhc2ggYnVybmVyIG1vZGUgLSBzZWUgRmxhc2ggYnVybmluZyBhcHBsaWNhdGlvbiBub3RlIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gdGhpcyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljb21tYW5kWzB4MDAwMTBdOyAgICAgIC8qIFBDSSBDb21tYW5kIFJlZ2lzdGVyICovCisgICAgcHNldWRvX2JpdF90CXN0YXR1c1sweDAwMDEwXTsgICAgICAgLyogUENJIFN0YXR1cyBSZWdpc3RlciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmV2aXNpb25faWRbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CWNsYXNzX2NvZGVfaGNhX2NsYXNzX2NvZGVbMHgwMDAxOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljYWNoZV9saW5lX3NpemVbMHgwMDAwOF07LyogQ2FjaGUgTGluZSBTaXplICovCisgICAgcHNldWRvX2JpdF90CWxhdGVuY3lfdGltZXJbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CWhlYWRlcl90eXBlWzB4MDAwMDhdOyAgLyogaGFyZHdpcmVkIHRvIHplcm8gKi8KKyAgICBwc2V1ZG9fYml0X3QJYmlzdFsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJhcjBfY3RybFsweDAwMDA0XTsgICAgLyogaGFyZC13aXJlZCB0byAwMTAwICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJYmFyMF9sWzB4MDAwMGNdOyAgICAgICAvKiBMb3dlciBiaXRzIG9mIEJBUjAgKERldmljZSBDb25maWd1cmF0aW9uIFNwYWNlKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYmFyMF9oWzB4MDAwMjBdOyAgICAgICAvKiBVcHBlciAzMiBiaXRzIG9mIEJBUjAgKERldmljZSBDb25maWd1cmF0aW9uIFNwYWNlKSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYmFyMV9jdHJsWzB4MDAwMDRdOyAgICAvKiBIYXJkd2lyZWQgdG8gMTEwMCAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAxMF07CisgICAgcHNldWRvX2JpdF90CWJhcjFfbFsweDAwMDBjXTsgICAgICAgLyogTG93ZXIgYml0cyBvZiBCQVIxIChVc2VyIEFjY2VzcyBSZWdpb24gLSBVQVIgLSBzcGFjZSkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJhcjFfaFsweDAwMDIwXTsgICAgICAgLyogdXBwZXIgMzIgYml0cyBvZiBCQVIxIChVc2VyIEFjY2VzcyBSZWdpb24gLSBVQVIgLSBzcGFjZSkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJhcjJfY3RybFsweDAwMDA0XTsgICAgLyogSGFyZHdpcmVkIHRvIDExMDAgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMTBdOworICAgIHBzZXVkb19iaXRfdAliYXIyX2xbMHgwMDAwY107ICAgICAgIC8qIExvd2VyIGJpdHMgb2YgQkFSMiAtIExvY2FsIEF0dGFjaGVkIE1lbW9yeSBpZiBwcmVzZW50IGFuZCBlbmFibGVkLiBFbHNlIHplcm9lZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWJhcjJfaFsweDAwMDIwXTsgICAgICAgLyogVXBwZXIgMzIgYml0cyBvZiBCQVIyIC0gTG9jYWwgQXR0YWNoZWQgTWVtb3J5IGlmIHByZXNlbnQgYW5kIGVuYWJsZWQuIEVsc2UgemVyb2VkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY2FyZGJ1c19jaXNfcG9pbnRlclsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXN1YnN5c3RlbV92ZW5kb3JfaWRbMHgwMDAxMF07LyogU3BlY2lmaWVkIGJ5IHRoZSBkZXZpY2UgTlZNRU0gY29uZmlndXJhdGlvbiAqLworICAgIHBzZXVkb19iaXRfdAlzdWJzeXN0ZW1faWRbMHgwMDAxMF07IC8qIFNwZWNpZmllZCBieSB0aGUgZGV2aWNlIE5WTUVNIGNvbmZpZ3VyYXRpb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWV4cGFuc2lvbl9yb21fZW5hYmxlWzB4MDAwMDFdOy8qIEV4cGFuc2lvbiBST00gRW5hYmxlLiBIYXJkd2lyZWQgdG8gMCBpZiBleHBhbnNpb24gUk9NIGlzIGRpc2FibGVkIGluIHRoZSBkZXZpY2UgTlZNRU0gY29uZmlndXJhdGlvbi4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMGFdOworICAgIHBzZXVkb19iaXRfdAlleHBhbnNpb25fcm9tX2Jhc2VfYWRkcmVzc1sweDAwMDE1XTsvKiBFeHBhbnNpb24gUk9NIEJhc2UgQWRkcmVzcyAodXBwZXIgMjEgYml0KS4gSGFyZHdpcmVkIHRvIDAgaWYgZXhwYW5zaW9uIFJPTSBpcyBkaXNhYmxlZCBpbiB0aGUgZGV2aWNlIE5WTUVNIGNvbmZpZ3VyYXRpb24uICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAljYXBhYmlsaXRpZXNfcG9pbnRlclsweDAwMDA4XTsvKiBTcGVjaWZpZWQgYnkgdGhlIGRldmljZSBOVk1FTSBjb25maWd1cmF0aW9uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDAwMDE4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWludGVycnVwdF9saW5lWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlpbnRlcnJ1cHRfcGluWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAltaW5fZ250WzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAltYXhfbGF0ZW5jeVsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNlsweDAwMTAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1zaV9jYXBfaWRbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CW1zaV9uZXh0X2NhcF9wdHJbMHgwMDAwOF07CisgICAgcHNldWRvX2JpdF90CW1zaV9lblsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJbXVsdGlwbGVfbXNnX2NhcFsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJbXVsdGlwbGVfbXNnX2VuWzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAljYXBfNjRfYml0X2FkZHJbMHgwMDAwMV07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkN1sweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1zZ19hZGRyX2xbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltc2dfYWRkcl9oWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbXNnX2RhdGFbMHgwMDAxMF07CisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOFsweDAwMDEwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOVsweDAwMDgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBtX2NhcF9pZFsweDAwMDA4XTsgICAgLyogUG93ZXIgbWFuYWdlbWVudCBjYXBhYmlsaXR5IElEIC0gMDFoICovCisgICAgcHNldWRvX2JpdF90CXBtX25leHRfY2FwX3B0clsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJcG1fY2FwWzB4MDAwMTBdOyAgICAgICAvKiBbMjowXSBWZXJzaW9uIC0gMDJoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzNdIFBNRSBjbG9jayAtIDBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzRdIFJzdlAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNV0gRGV2aWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIC0gMGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbODo2XSBBVVggY3VycmVudCAtIDBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzldIEQxIHN1cHBvcnQgLSAwaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMF0gRDIgc3VwcG9ydCAtIDBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE1OjExXSBQTUUgc3VwcG9ydCAtIDBoICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlwbV9zdGF0dXNfY29udHJvbFsweDAwMDEwXTsvKiBbMTQ6MTNdIC0gRGF0YSBzY2FsZSAtIDBoICovCisgICAgcHNldWRvX2JpdF90CXBtX2NvbnRyb2xfc3RhdHVzX2JyZGdfZXh0WzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlkYXRhWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMFsweDAwMDQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZwZF9jYXBfaWRbMHgwMDAwOF07ICAgLyogMDNoICovCisgICAgcHNldWRvX2JpdF90CXZwZF9uZXh0X2NhcF9pZFsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJdnBkX2FkZHJlc3NbMHgwMDAwZl07CisgICAgcHNldWRvX2JpdF90CWZbMHgwMDAwMV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl2cGRfZGF0YVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTFbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlwY2lleF9jYXBfaWRbMHgwMDAwOF07IC8qIFBDSS1FeHByZXNzIGNhcGFiaWxpdHkgSUQgLSAxMGggKi8KKyAgICBwc2V1ZG9fYml0X3QJcGNpZXhfbmV4dF9jYXBfcHRyWzB4MDAwMDhdOworICAgIHBzZXVkb19iaXRfdAlwY2lleF9jYXBbMHgwMDAxMF07ICAgIC8qIFszOjBdIENhcGFiaWxpdHkgdmVyc2lvbiAtIDFoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzc6NF0gRGV2aWNlL1BvcnQgVHlwZSAtIDBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzhdIFNsb3QgaW1wbGVtZW50ZWQgLSAwaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMzo5XSBJbnRlcnJ1cHQgbWVzc2FnZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWRldmljZV9jYXBbMHgwMDAyMF07ICAgLyogWzI6MF0gTWF4X1BheWxvYWRfU2l6ZSBzdXBwb3J0ZWQgLSAyaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0OjNdIFBoYW50b20gRnVuY3Rpb24gc3VwcG9ydGVkIC0gMGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNV0gRXh0ZW5kZWQgVGFnIEZpbGVkIHN1cHBvcnRlZCAtIDBoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzg6Nl0gRW5kcG9pbnQgTDBzIEFjY2VwdGFibGUgTGF0ZW5jeSAtIFRCRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMTo5XSBFbmRwb2ludCBMMSBBY2NlcHRhYmxlIExhdGVuY3kgLSBUQkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTJdIEF0dGVudGlvbiBCdXR0b24gUHJlc2VudCAtIGNvbmZpZ3VyZWQgdGhyb3VnaCBJbmZpbmlCdXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEzXSBBdHRlbnRpb24gSW5kaWNhdG9yIFByZXNlbnQgLSBjb25maWd1cmVkIHRocm91Z2ggSW5maW5pQnVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNF0gUG93ZXIgSW5kaWNhdG9yIFByZXNlbnQgLSBjb25maWd1cmVkIHRocm91Z2ggSW5maW5pQnVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyNToxOF0gQ2FwdHVyZWQgU2xvdCBQb3dlciBMaW1pdCBWYWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyNzoyNl0gQ2FwdHVyZWQgU2xvdCBQb3dlciBMaW1pdCBTY2FsZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGV2aWNlX2NvbnRyb2xbMHgwMDAxMF07CisgICAgcHNldWRvX2JpdF90CWRldmljZV9zdGF0dXNbMHgwMDAxMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsaW5rX2NhcFsweDAwMDIwXTsgICAgIC8qIFszOjBdIE1heGltdW0gTGluayBTcGVlZCAtIDFoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzk6NF0gTWF4aW11bSBMaW5rIFdpZHRoIC0gOGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTE6MTBdIEFjdGl2ZSBTdGF0ZSBQb3dlciBNYW5hZ2VtZW50IFN1cHBvcnQgLSAzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNDoxMl0gTDBzIEV4aXQgTGF0ZW5jeSAtIFRCRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNzoxNV0gTDEgRXhpdCBMYXRlbmN5IC0gVEJECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzMxOjI0XSBQb3J0IE51bWJlciAtIDBoICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlsaW5rX2NvbnRyb2xbMHgwMDAxMF07CisgICAgcHNldWRvX2JpdF90CWxpbmtfc3RhdHVzWzB4MDAwMTBdOyAgLyogWzM6MF0gTGluayBTcGVlZCAtIDFoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzk6NF0gTmVnb3RpYXRlZCBMaW5rIFdpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEyXSBTbG90IGNsb2NrIGNvbmZpZ3VyYXRpb24gLSAxaCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxMlsweDAwMjYwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWFkdmFuY2VkX2Vycm9yX3JlcG9ydGluZ19jYXBfaWRbMHgwMDAxMF07LyogMDAwMWguICovCisgICAgcHNldWRvX2JpdF90CWNhcGFiaWxpdHlfdmVyc2lvblsweDAwMDA0XTsvKiAxaCAqLworICAgIHBzZXVkb19iaXRfdAluZXh0X2NhcGFiaWxpdHlfb2Zmc2V0WzB4MDAwMGNdOy8qIDBoICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl1bmNvcnJlY3RhYmxlX2Vycm9yX3N0YXR1c19yZWdpc3RlclsweDAwMDIwXTsvKiAwIFRyYWluaW5nIEVycm9yIFN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgRGF0YSBMaW5rIFByb3RvY29sIEVycm9yIFN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIFBvaXNvbmVkIFRMUCBTdGF0dXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgRmxvdyBDb250cm9sIFByb3RvY29sIEVycm9yIFN0YXR1cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCBDb21wbGV0aW9uIFRpbWVvdXQgU3RhdHVzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1IENvbXBsZXRlciBBYm9ydCBTdGF0dXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgVW5leHBlY3RlZCBDb21wbGV0aW9uIFN0YXR1cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyBSZWNlaXZlciBPdmVyZmxvdyBTdGF0dXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTggTWFsZm9ybWVkIFRMUCBTdGF0dXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkgRUNSQyBFcnJvciBTdGF0dXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgVW5zdXBwb3J0ZWQgUmVxdWVzdCBFcnJvciBTdGF0dXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXVuY29ycmVjdGFibGVfZXJyb3JfbWFza19yZWdpc3RlclsweDAwMDIwXTsvKiAwIFRyYWluaW5nIEVycm9yIE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IERhdGEgTGluayBQcm90b2NvbCBFcnJvciBNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgUG9pc29uZWQgVExQIE1hc2sgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgRmxvdyBDb250cm9sIFByb3RvY29sIEVycm9yIE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCBDb21wbGV0aW9uIFRpbWVvdXQgTWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1IENvbXBsZXRlciBBYm9ydCBNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgVW5leHBlY3RlZCBDb21wbGV0aW9uIE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyBSZWNlaXZlciBPdmVyZmxvdyBNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTggTWFsZm9ybWVkIFRMUCBNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkgRUNSQyBFcnJvciBNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgVW5zdXBwb3J0ZWQgUmVxdWVzdCBFcnJvciBNYXNrICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAl1bmNvcnJlY3RhYmxlX3NldmVyaXR5X21hc2tfcmVnaXN0ZXJbMHgwMDAyMF07LyogMCBUcmFpbmluZyBFcnJvciBTZXZlcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgRGF0YSBMaW5rIFByb3RvY29sIEVycm9yIFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgUG9pc29uZWQgVExQIFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgRmxvdyBDb250cm9sIFByb3RvY29sIEVycm9yIFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQgQ29tcGxldGlvbiBUaW1lb3V0IFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUgQ29tcGxldGVyIEFib3J0IFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgVW5leHBlY3RlZCBDb21wbGV0aW9uIFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcgUmVjZWl2ZXIgT3ZlcmZsb3cgU2V2ZXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCBNYWxmb3JtZWQgVExQIFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkgRUNSQyBFcnJvciBTZXZlcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIFVuc3VwcG9ydGVkIFJlcXVlc3QgRXJyb3IgU2V2ZXJpdHkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNvcnJlY3RhYmxlX2Vycm9yX3N0YXR1c19yZWdpc3RlclsweDAwMDIwXTsvKiAwIFJlY2VpdmVyIEVycm9yIFN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgQmFkIFRMUCBTdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3IEJhZCBETExQIFN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggUkVQTEFZX05VTSBSb2xsb3ZlciBTdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBSZXBsYXkgVGltZXIgVGltZW91dCBTdGF0dXMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNvcnJlY3RhYmxlX2Vycm9yX21hc2tfcmVnaXN0ZXJbMHgwMDAyMF07LyogMCBSZWNlaXZlciBFcnJvciBNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiBCYWQgVExQIE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3IEJhZCBETExQIE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IFJFUExBWV9OVU0gUm9sbG92ZXIgTWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIFJlcGxheSBUaW1lciBUaW1lb3V0IE1hc2sgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWFkdmFuY2VfZXJyb3JfY2FwYWJpbGl0aWVzX2FuZF9jb250cm9sX3JlZ2lzdGVyWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX2hlYWRlcl9sb2dfcmVnaXN0ZXJfc3QJaGVhZGVyX2xvZ19yZWdpc3RlcjsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTNbMHgwMDZhMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEV2ZW50IERhdGEgRmllbGQgLSBQZXJmb3JtYW5jZSBNb25pdG9yICovCisKK3N0cnVjdCBoZXJtb25wcm1fcGVyZm9ybWFuY2VfbW9uaXRvcl9ldmVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3BlcmZvcm1hbmNlX21vbml0b3JzX3N0CXBlcmZvcm1hbmNlX21vbml0b3Jfc25hcHNob3Q7LyogUGVyZm9ybWFuY2UgbW9uaXRvciBzbmFwc2hvdCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJbW9uaXRvcl9udW1iZXJbMHgwMDAwOF07LyogMHgwMSAtIFNRUEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyIC0gUlFQQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgLSBDUUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0IC0gUmtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUgLSBUTEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2IC0gcG9ydDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3IC0gcG9ydDEgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMThdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFdmVudF9kYXRhIEZpZWxkIC0gUGFnZSBGYXVsdHMgKi8KKworc3RydWN0IGhlcm1vbnBybV9wYWdlX2ZhdWx0X2V2ZW50X2RhdGFfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXZhX2hbMHgwMDAyMF07ICAgICAgICAgLyogVmlydHVhbCBBZGRyZXNzWzYzOjMyXSB0aGlzIHBhZ2UgZmF1bHQgaXMgcmVwb3J0ZWQgb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXZhX2xbMHgwMDAyMF07ICAgICAgICAgLyogVmlydHVhbCBBZGRyZXNzWzYzOjMyXSB0aGlzIHBhZ2UgZmF1bHQgaXMgcmVwb3J0ZWQgb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CW1lbV9rZXlbMHgwMDAyMF07ICAgICAgLyogTWVtb3J5IEtleSB0aGlzIHBhZ2UgZmF1bHQgaXMgcmVwb3J0ZWQgb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXFwWzB4MDAwMThdOyAgICAgICAgICAgLyogUVAgdGhpcyBwYWdlIGZhdWx0IGlzIHJlcG9ydGVkIG9uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDAzXTsKKyAgICBwc2V1ZG9fYml0X3QJYVsweDAwMDAxXTsgICAgICAgICAgICAvKiBJZiBzZXQgdGhlIG1lbW9yeSBhY2Nlc3MgdGhhdCBjYXVzZWQgdGhlIHBhZ2UgZmF1bHQgd2FzIGF0b21pYyAqLworICAgIHBzZXVkb19iaXRfdAlsd1sweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCB0aGUgbWVtb3J5IGFjY2VzcyB0aGF0IGNhdXNlZCB0aGUgcGFnZSBmYXVsdCB3YXMgbG9jYWwgd3JpdGUgKi8KKyAgICBwc2V1ZG9fYml0X3QJbHJbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgdGhlIG1lbW9yeSBhY2Nlc3MgdGhhdCBjYXVzZWQgdGhlIHBhZ2UgZmF1bHQgd2FzIGxvY2FsIHJlYWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcndbMHgwMDAwMV07ICAgICAgICAgICAvKiBJZiBzZXQgdGhlIG1lbW9yeSBhY2Nlc3MgdGhhdCBjYXVzZWQgdGhlIHBhZ2UgZmF1bHQgd2FzIHJlbW90ZSB3cml0ZSAqLworICAgIHBzZXVkb19iaXRfdAlyclsweDAwMDAxXTsgICAgICAgICAgIC8qIElmIHNldCB0aGUgbWVtb3J5IGFjY2VzcyB0aGF0IGNhdXNlZCB0aGUgcGFnZSBmYXVsdCB3YXMgcmVtb3RlIHJlYWQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXBkWzB4MDAwMThdOyAgICAgICAgICAgLyogUEQgdGhpcyBwYWdlIGZhdWx0IGlzIHJlcG9ydGVkIG9uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXByZWZldGNoX2xlblsweDAwMDIwXTsgLyogSW5kaWNhdGVzIGhvdyBtYW55IHN1YnNlcXVlbnQgcGFnZXMgaW4gdGhlIHNhbWUgbWVtb3J5IHJlZ2lvbi93aW5kb3cgd2lsbCBiZSBhY2Nlc3NlZCBieSB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9uIGFmdGVyIHRoaXMgcGFnZSBmYXVsdCBpcyByZXNvbHZlZC4gbWVhc3VyZWQgaW4gYnl0ZXMuIFNXIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiBpbiBvcmRlciB0byBwYWdlLWluIHRoZSBzdWJzZXF1ZW50IHBhZ2VzIGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50LiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBXUUUgc2VnbWVudHMgZm9ybWF0ICovCisKK3N0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgc3RydWN0IGhlcm1vbnBybV9zZW5kX3dxZV9zZWdtZW50X3N0CXNlbmRfd3FlX3NlZ21lbnQ7LyogU2VuZCBXUUUgc2VnbWVudCBmb3JtYXQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMjgwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9jdHJsX21seF9zdAltbHhfd3FlX3NlZ21lbnRfY3RybDsvKiBNTFggV1FFIHNlZ21lbnQgZm9ybWF0ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDEwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZWN2X3dxZV9zZWdtZW50X2N0cmxbNF1bMHgwMDAyMF07LyogUmVjZWl2ZSBzZWdtZW50IGZvcm1hdCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFdmVudF9kYXRhIEZpZWxkIC0gUG9ydCBTdGF0ZSBDaGFuZ2UgICAjIyMjIG1pY2hhbCAtIG1hdGNoIFBSTSAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3BvcnRfc3RhdGVfY2hhbmdlX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDA0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAxY107CisgICAgcHNldWRvX2JpdF90CXBbMHgwMDAwMl07ICAgICAgICAgICAgLyogUG9ydCBudW1iZXIgKDEgb3IgMikgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDJdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFdmVudF9kYXRhIEZpZWxkIC0gQ29tcGxldGlvbiBRdWV1ZSBFcnJvciAgICAgIyMjIyBtaWNoYWwgLSBtYXRjaCBQUk0gKi8KKworc3RydWN0IGhlcm1vbnBybV9jb21wbGV0aW9uX3F1ZXVlX2Vycm9yX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAljcW5bMHgwMDAxOF07ICAgICAgICAgIC8qIENRIG51bWJlciBldmVudCBpcyByZXBvcnRlZCBmb3IgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc3luZHJvbWVbMHgwMDAwOF07ICAgICAvKiBFcnJvciBzeW5kcm9tZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEgLSBDUSBvdmVycnVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiAtIENRIGFjY2VzcyB2aW9sYXRpb24gZXJyb3IgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMThdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwNjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFdmVudF9kYXRhIEZpZWxkIC0gQ29tcGxldGlvbiBFdmVudAkjIyMjIG1pY2hhbCAtIG1hdGNoIFBSTSAqLworCitzdHJ1Y3QgaGVybW9ucHJtX2NvbXBsZXRpb25fZXZlbnRfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CWNxblsweDAwMDE4XTsgICAgICAgICAgLyogQ1EgbnVtYmVyIGV2ZW50IGlzIHJlcG9ydGVkIGZvciAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDBhMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIEV2ZW50IFF1ZXVlIEVudHJ5ICAgICAgICAgIyMjIyBtaWNoYWwgLSBtYXRjaCB0byBQUk0gKi8KKworc3RydWN0IGhlcm1vbnBybV9ldmVudF9xdWV1ZV9lbnRyeV9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZXZlbnRfc3ViX3R5cGVbMHgwMDAwOF07LyogRXZlbnQgU3ViIFR5cGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZWQgZm9yIGV2ZW50cyB3aGljaCBoYXZlIHN1YiB0eXBlcywgemVybyBlbHNld2hlcmUuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA4XTsKKyAgICBwc2V1ZG9fYml0X3QJZXZlbnRfdHlwZVsweDAwMDA4XTsgICAvKiBFdmVudCBUeXBlICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDA4XTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWV2ZW50X2RhdGFbNl1bMHgwMDAyMF07LyogRGVsaXZlcnMgYXV4aWxhcnkgZGF0YSB0byBoYW5kbGUgZXZlbnQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwN107CisgICAgcHNldWRvX2JpdF90CW93bmVyWzB4MDAwMDFdOyAgICAgICAgLyogT3duZXIgb2YgdGhlIGVudHJ5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgU1cgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBIVyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAxOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIFFQL0VFIFN0YXRlIFRyYW5zaXRpb25zIENvbW1hbmQgUGFyYW1ldGVycyAgIyMjbWljaGFsIC0gZG9lc24ndCBtYXRjaCBQUk0gKGZpZWxkIG5hbWUgY2hhbmdlZCkgKi8KKworc3RydWN0IGhlcm1vbnBybV9xcF9lZV9zdGF0ZV90cmFuc2l0aW9uc19zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJb3B0X3BhcmFtX21hc2tbMHgwMDAyMF07LyogVGhpcyBmaWVsZCBkZWZpbmVzIHdoaWNoIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC4gRWFjaCBiaXQgc3BlY2lmaWVzIHdoZXRoZXIgb3B0aW9uYWwgcGFyYW1ldGVyIGlzIHBhc3NlZCAoc2V0KSBvciBub3QgKGNsZWFyZWQpLiBUaGUgb3B0cGFyYW1tYXNrIGlzIGRlZmluZWQgZm9yIGVhY2ggUVAvRUUgY29tbWFuZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9xdWV1ZV9wYWlyX2VlX2NvbnRleHRfZW50cnlfc3QJcXBjX2VlY19kYXRhOy8qIFFQQy9FRUMgZGF0YSAgIyMjbWljaGFsIC0gZmllbGQgaGFzIHJlcGxhY2VkIHdpdGggInFwY19kYXRhIiAoc2l6ZSAuMTk0OCkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwODAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogQ29tcGxldGlvbiBRdWV1ZSBFbnRyeSBGb3JtYXQgICAgICAgICMjIyMgbWljaGFsIC0gZml4ZWQgYnkgZ2Ryb3IgKi8KKworc3RydWN0IGhlcm1vbnBybV9jb21wbGV0aW9uX3F1ZXVlX2VudHJ5X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlxcG5bMHgwMDAxOF07ICAgICAgICAgIC8qIEluZGljYXRlcyB0aGUgUVAgZm9yIHdoaWNoIGNvbXBsZXRpb24gaXMgYmVpbmcgcmVwb3J0ZWQgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAlkMnNbMHgwMDAwMV07ICAgICAgICAgIC8qIER1cGxpY2F0ZSB0byBTbmlmZmVyLiBUaGlzIGJpdCBpcyBzZXQgaWYgYm90aCBTZW5kIGFuZCBSZWNlaXZlIHF1ZXVlcyBhcmUgc3ViamVjdCBmb3Igc25pZmZlciBxdWV1ZS4gVGhlIEhXIGRlbGl2ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0IG9ubHkgdG8gc2VuZC1hc3NvY2lhdGVkIHNuaWZmZXIgcmVjZWl2ZSBxdWV1ZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZmNyY19zZFsweDAwMDAxXTsgICAgICAvKiBGQ1JDOiBJZiBzZXQsIEZDIENSQyBpcyBjb3JyZWN0IGluIEZDIGZyYW1lIGVuY2Fwc3VsYXRlZCBpbiBwYXlsb2FkLiBWYWxpZCBmb3IgUmF3IEZyYW1lIEZDIHJlY2VpdmUgcXVldWUgb25seS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRDogQ1EgYXNzb2NpYXRlZCB3aXRoIFNuaWZmZXIgcmVjZWl2ZSBxdWV1ZS4gSWYgc2V0LCBwYWNrZXRzIHdlcmUgc2tpcHBlZCBkdWUgdG8gbGFjayBvZiByZWNlaXZlIGJ1ZmZlcnMgb24gdGhlIFNuaWZmZXIgcmVjZWl2ZSBxdWV1ZSAqLworICAgIHBzZXVkb19iaXRfdAlmbFsweDAwMDAxXTsgICAgICAgICAgIC8qIEZvcmNlIExvb3BiYWNrIFZhbGlkIGZvciByZXNwb25kZXIgUmF3RXRoIGFuZCBVRCBvbmx5LiAqLworICAgIHBzZXVkb19iaXRfdAl2bGFuWzB4MDAwMDJdOyAgICAgICAgIC8qIFZhbGlkIGZvciBSYXdFdGggYW5kIFVEIG92ZXIgRXRoZXJuZXQgb25seS4gQXBwbGljYWJsZSBmb3IgUmF3RXRoIGFuZCBVRCBvdmVyIEV0aGVybmV0IFJlY2VpdmUgcXVldWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAgLSBObyBWTEFOIGhlYWRlciB3YXMgcHJlc2VudCBpbiB0aGUgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEgLSBDLVZMQU4gKDgwMi4xcSkgSGVhZGVyIHdhcyBwcmVzZW50IGluIHRoZSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAtIFMtVkxBTiAoODAyLjFhZCkgSGVhZGVyIHdhcyBwcmVzZW50IGluIHRoZSBmcmFtZS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZGlmZVsweDAwMDAxXTsgICAgICAgICAvKiBESUYgRXJyb3IgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWltbWVkaWF0ZV9yc3N2YWx1ZV9pbnZhbGlkYXRla2V5WzB4MDAwMjBdOy8qIEZvciBhIHJlc3BvbmRlciBDUUUsIGlmIGNvbXBsZXRlZCBXUUUgT3Bjb2RlIGlzIFNlbmQgV2l0aCBJbW1lZGlhdGUgb3IgV3JpdGUgV2l0aCBJbW1lZGlhdGUsIHRoaXMgZmllbGQgY29udGFpbnMgaW1tZWRpYXRlIGZpZWxkIG9mIHRoZSByZWNlaXZlZCBtZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBhIHJlc3BvbmRlciBDUUUsIGlmIGNvbXBsZXRlZCBXUUUgT3Bjb2RlIGlzIFNlbmQgV2l0aCBJbnZhbGlkYXRlLCB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBSX2tleSB0aGF0IHdhcyBpbnZhbGlkYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSByZXNwb25kZXIgQ1FFIG9mIGEgR1NJIHBhY2tldCB0aGlzIGZpbGVkIGNvbnRhaW5zIHRoZSBQa2V5IEluZGV4IG9mIHRoZSBwYWNrZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIElQb0lCIChVRCkgYW5kIFJhd0V0aCBDUUVzIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIFJTUyBoYXNoIGZ1bmN0aW9uIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBpcyByZXNlcnZlZC4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXNycV9ycXBuWzB4MDAwMThdOyAgICAgLyogRm9yIFJlc3BvbmRlciBVRCBRUHMsIFJlbW90ZSAoc291cmNlKSBRUCBudW1iZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBSZXNwb25kZXIgU1JDIFFQcywgU1JRIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQuICovCisgICAgcHNldWRvX2JpdF90CW1sX3BhdGhfbWFjX2luZGV4WzB4MDAwMDddOy8qIEZvciByZXNwb25kZXIgVUQgb3ZlciBJQiBDUUU6IFRoZXNlIGFyZSB0aGUgbG93ZXIgTE1DIGJpdHMgb2YgdGhlIERMSUQgaW4gYW4gaW5jb21pbmcgVUQgcGFja2V0LCBoaWdoZXIgYml0cyBvZiB0aGlzIGZpZWxkLCB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTE1DIGJpdHMgYXJlIHplcm9lZCBieSBIVy4gSW52YWxpZCBpZiBpbmNvbWluZyBtZXNzYWdlIERMSUQgaXMgdGhlIHBlcm1pc3NpdmUgTElEIG9yIGluY29taW5nIG1lc3NhZ2UgaXMgbXVsdGljYXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgcmVzcG9uZGVyIFVEIG92ZXIgRXRoZXJuZXQgYW5kIFJhd0V0aCBDUUVzOiBJbmRleCBvZiB0aGUgTUFDIFRhYmxlIGVudHJ5IHRoYXQgdGhlIHBhY2tldCBETUFDIHdhcyBtYXRjaGVkIGFnYWluc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBpcyByZXNlcnZlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJZ1sweDAwMDAxXTsgICAgICAgICAgICAvKiBGb3IgcmVzcG9uZGVyIFVEIG92ZXIgSUIgQ1FFIHRoaXMgYml0IGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgYSBHUkgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgcmVzcG9uZGVyIFVEIG92ZXIgRXRoZXJuZXQgQ1FFIHRoaXMgYml0IGlzIHNldCBpZiBJUHY2IEwzIGhlYWRlciB3YXMgcHJlc2VudCBpbiB0aGUgcGFja2V0LCB0aGlzIGJpdCBpcyBjbGVhcmVkIGlmIElQdjQgTDMgSGVhZGVyIHdhcyBwcmVzZW50IGluIHRoZSBwYWNrZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIGlzIHJlc2VydmVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJc2xpZF9zbWFjNDdfMzJbMHgwMDAxMF07LyogRm9yIHJlc3BvbmRlciBVRCBvdmVyIElCIENRRSBpdCBpcyB0aGUgc291cmNlIExJRCBvZiB0aGUgcGFja2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciByZXNwb25kZXIgVUQgb3ZlciBFdGhlcm5ldCBhbmQgUmF3RXRoIENRRXMgaXQgaXMgdGhlIHNvdXJjZS1NQUNbNDc6MzJdIG9mIHRoZSBwYWNrZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIGlzIHJlc2VydmVkLiAqLworICAgIHBzZXVkb19iaXRfdAl2aWRbMHgwMDAwY107ICAgICAgICAgIC8qIEZyYW1lIFZJRCwgdmFsaWQgZm9yIFJlc3BvbmRlciBSYXcgRXRoZXJuZXQgYW5kIFVEIG92ZXIgRXRoZXJuZXQgUVAuIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBpcyByZXNlcnZlZC4gKi8KKyAgICBwc2V1ZG9fYml0X3QJc2xbMHgwMDAwNF07ICAgICAgICAgICAvKiBGb3IgcmVzcG9uZGVyIFVEIG92ZXIgSUIgLSB0aGUgU2VydmljZSBMZXZlbCBvZiB0aGUgcGFja2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgcmVzcG9uZGVyIFVEIG92ZXIgRXRoZXJuZXQgYW5kIFJhd0V0aCAtIGl0IGlzIFZMQU4taGVhZGVyWzE1OjEyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQuICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlzbWFjMzFfMF9yYXdldGhlcl9pcG9pYl9zdGF0dXNbMHgwMDAyMF07LyogRm9yIHJlc3BvbmRlciBVRCBvdmVyIEV0aGVybmV0IC0gc291cmNlIE1BQ1szMTowXSBvZiB0aGUgcGFja2V0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHJlc3BvbmRlciBSYXdFdGggYW5kIFVEIG92ZXIgSUIgLSBSYXdFdGgtSVBvSUIgc3RhdHVzIHszIHJlc2VydmVkLCBpcG9rLHVkcCx0Y3AsaXB2NG9wdCxpcHY2LGlwdjR2ZixpcHY0LHJodCg2KSxpcHY2ZXh0bWFzayg2KSxyZXNlcnZlZCgyKSxsMmFtLHJlc2VydmVkKDIpLGJmY3MscmVzZXJ2ZWQoMiksZW5jfSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIGlzIHJlc2VydmVkLiAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJYnl0ZV9jbnRbMHgwMDAyMF07ICAgICAvKiBCeXRlIGNvdW50IG9mIGRhdGEgdHJhbnNmZXJyZWQuIEFwcGxpY2FibGUgZm9yIFJETUEtcmVhZCwgQXRvbWljIGFuZCBhbGwgcmVjZWl2ZSBvcGVyYXRpb25zLiBjb21wbGV0aW9ucy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIFJlY2VpdmUgUXVldWUgdGhhdCBpcyBzdWJqZWN0IGZvciBoZWFkZXJzLiBzZXBhcmF0aW9uLCBieXRlX2NudFszMToyNF0gc3BlY2lmeSBudW1iZXIgb2YgYnl0ZXMgc2NhdHRlcmVkIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGVudHJ5IChoZWFkZXJzLiBsZW5ndGgpLiBCeXRlX2NudFsyMzowXSBzcGVjaWZ5IHRvdGFsIGJ5dGUgY291bnQgcmVjZWl2ZWQgKGluY2x1ZGluZyBoZWFkZXJzKS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWNoZWNrc3VtWzB4MDAwMTBdOyAgICAgLyogVmFsaWQgZm9yIFJhd0V0aCBhbmQgSVBvSUIgb25seS4gKi8KKyAgICBwc2V1ZG9fYml0X3QJd3FlX2NvdW50ZXJbMHgwMDAxMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlvcGNvZGVbMHgwMDAwNV07ICAgICAgIC8qIFNlbmQgY29tcGxldGlvbnMgLSBzYW1lIGVuY29kaW5nIGFzIFdRRS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGluZyBpcyAweDFGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCAtIFJETUEtV3JpdGUgd2l0aCBJbW1lZGlhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxIC0gU2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIgLSBTZW5kIHdpdGggSW1tZWRpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MyAtIFNlbmQgJiBJbnZhbGlkYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgcHNldWRvX2JpdF90CWlzWzB4MDAwMDFdOyAgICAgICAgICAgLyogaW5saW5lIHNjYXR0ZXIgKi8KKyAgICBwc2V1ZG9fYml0X3QJc19yWzB4MDAwMDFdOyAgICAgICAgICAvKiBzZW5kIDEgLyByZWNlaXZlIDAgKi8KKyAgICBwc2V1ZG9fYml0X3QJb3duZXJbMHgwMDAwMV07ICAgICAgICAvKiBIVyBGbGlwcyB0aGlzIGJpdCBmb3IgZXZlcnkgQ1Egd2FycCBhcm91bmQuIEluaXRpYWxpemVkIHRvIFplcm8uICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMVsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDhdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiAgKi8KKworc3RydWN0IGhlcm1vbnBybV9tY2dfcXBzX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fbWNnX3FwX2R3X3N0CWR3WzEyOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qICAqLworCitzdHJ1Y3QgaGVybW9ucHJtX21jZ19oZHJfc3QgewkvKiBMaXR0bGUgRW5kaWFuICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA2XTsKKyAgICBwc2V1ZG9fYml0X3QJbmV4dF9tY2dbMHgwMDAxYV07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAltZW1iZXJzX2NvdW50WzB4MDAwMThdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlnaWQzWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJZ2lkMlsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWdpZDFbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlnaWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiAgKi8KKworc3RydWN0IGhlcm1vbnBybV9zY2hlZF9xdWV1ZV9jb250ZXh0X3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlwb2xpY3lbMHgwMDAwM107ICAgICAgIC8qIFNjaGVkdWxlIFF1ZXVlIFBvbGljeSAtIDAgLSBMTFNRLCAxIC0gR0JTUSwgMiAtIEJFU1EgKi8KKyAgICBwc2V1ZG9fYml0X3QJdmwxNVsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJc2xbMHgwMDAwNF07ICAgICAgICAgICAvKiBTTCB0aGlzIFNjaGVkdWxlIFF1ZXVlIGlzIGFzc29jaWF0ZWQgd2l0aCAoaWYgdmwxNSBiaXQgaXMgMCkgKi8KKyAgICBwc2V1ZG9fYml0X3QJcG9ydFsweDAwMDAyXTsgICAgICAgICAvKiBQb3J0IHRoaXMgU2NoZWR1bGUgUXVldWUgaXMgYXNzb2NpYXRlZCB3aXRoICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMFsweDAwMDA2XTsKKyAgICBwc2V1ZG9fYml0X3QJd2VpZ2h0WzB4MDAwMTBdOyAgICAgICAvKiBXZWlnaHQgb2YgdGhpcyBTY2hRICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qICAqLworCitzdHJ1Y3QgaGVybW9ucHJtX2VjY19kZXRlY3RfZXZlbnRfZGF0YV9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY2F1c2VfbHNiWzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWNhdXNlX21zYlsweDAwMDAxXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAllcnJfcm13WzB4MDAwMDFdOworICAgIHBzZXVkb19iaXRfdAllcnJfc3JjX2lkWzB4MDAwMDNdOworICAgIHBzZXVkb19iaXRfdAllcnJfZGFbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWVycl9iYVsweDAwMDAyXTsKKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzWzB4MDAwMTFdOworICAgIHBzZXVkb19iaXRfdAlvdmVyZmxvd1sweDAwMDAxXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CWVycl9yYVsweDAwMDEwXTsKKyAgICBwc2V1ZG9fYml0X3QJZXJyX2NhWzB4MDAwMTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KK307IAorCisvKiBFdmVudF9kYXRhIEZpZWxkIC0gRUNDIERldGVjdGlvbiBFdmVudCAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3NjcnViYmluZ19ldmVudF9zdCB7CS8qIExpdHRsZSBFbmRpYW4gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQwWzB4MDAwODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJY2F1c2VfbHNiWzB4MDAwMDFdOyAgICAvKiBkYXRhIGludGVncml0eSBlcnJvciBjYXVzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgRUNDIGVycm9yIGluIHRoZSA2NGJpdCBsc2IgZGF0YSwgb24gdGhlIHJpc2UgZWRnZSBvZiB0aGUgY2xvY2sgKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxWzB4MDAwMDJdOworICAgIHBzZXVkb19iaXRfdAljYXVzZV9tc2JbMHgwMDAwMV07ICAgIC8qIGRhdGEgaW50ZWdyaXR5IGVycm9yIGNhdXNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBFQ0MgZXJyb3IgaW4gdGhlIDY0Yml0IG1zYiBkYXRhLCBvbiB0aGUgZmFsbCBlZGdlIG9mIHRoZSBjbG9jayAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDJbMHgwMDAwMl07CisgICAgcHNldWRvX2JpdF90CWVycl9ybXdbMHgwMDAwMV07ICAgICAgLyogdHJhbnNhY3Rpb24gdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSByZWFkL21vZGlmeS93cml0ZSAqLworICAgIHBzZXVkb19iaXRfdAllcnJfc3JjX2lkWzB4MDAwMDNdOyAgIC8qIHNvdXJjZSBvZiB0aGUgdHJhbnNhY3Rpb246IDB4NCAtIFBDSSwgb3RoZXIgLSBpbnRlcm5hbCBvciBJQiAqLworICAgIHBzZXVkb19iaXRfdAllcnJfZGFbMHgwMDAwMl07ICAgICAgIC8qIEVycm9yIERJTU0gYWRkcmVzcyAqLworICAgIHBzZXVkb19iaXRfdAllcnJfYmFbMHgwMDAwMl07ICAgICAgIC8qIEVycm9yIGJhbmsgYWRkcmVzcyAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDNbMHgwMDAxMV07CisgICAgcHNldWRvX2JpdF90CW92ZXJmbG93WzB4MDAwMDFdOyAgICAgLyogRmF0YWw6IEVDQyBlcnJvciBGSUZPIG92ZXJmbG93IC0gRUNDIGVycm9ycyB3ZXJlIGRldGVjdGVkLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBoYXZlIGJlZW4gY29ycmVjdGVkIGJ5IEluZmluaUhvc3QtSUlJLUVYICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAllcnJfcmFbMHgwMDAxMF07ICAgICAgIC8qIEVycm9yIHJvdyBhZGRyZXNzICovCisgICAgcHNldWRvX2JpdF90CWVycl9jYVsweDAwMDEwXTsgICAgICAgLyogRXJyb3IgY29sdW1uIGFkZHJlc3MgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCit9OyAKKworLyogICovCisKK3N0cnVjdCBoZXJtb25wcm1fZXFfY21kX2Rvb3JiZWxsX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisKKy8qIDAgKi8KKworc3RydWN0IGhlcm1vbnBybV9oZXJtb25fcHJtX3N0IHsJLyogTGl0dGxlIEVuZGlhbiAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fY29tcGxldGlvbl9xdWV1ZV9lbnRyeV9zdAljb21wbGV0aW9uX3F1ZXVlX2VudHJ5Oy8qIENvbXBsZXRpb24gUXVldWUgRW50cnkgRm9ybWF0ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDBbMHg3ZmYwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fcXBfZWVfc3RhdGVfdHJhbnNpdGlvbnNfc3QJcXBfZWVfc3RhdGVfdHJhbnNpdGlvbnM7LyogUVAvRUUgU3RhdGUgVHJhbnNpdGlvbnMgQ29tbWFuZCBQYXJhbWV0ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDFbMHg3ZjAwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fZXZlbnRfcXVldWVfZW50cnlfc3QJZXZlbnRfcXVldWVfZW50cnk7LyogRXZlbnQgUXVldWUgRW50cnkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMlsweDdmZjAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9jb21wbGV0aW9uX2V2ZW50X3N0CWNvbXBsZXRpb25fZXZlbnQ7LyogRXZlbnRfZGF0YSBGaWVsZCAtIENvbXBsZXRpb24gRXZlbnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkM1sweDdmZjQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9jb21wbGV0aW9uX3F1ZXVlX2Vycm9yX3N0CWNvbXBsZXRpb25fcXVldWVfZXJyb3I7LyogRXZlbnRfZGF0YSBGaWVsZCAtIENvbXBsZXRpb24gUXVldWUgRXJyb3IgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNFsweDdmZjQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9wb3J0X3N0YXRlX2NoYW5nZV9zdAlwb3J0X3N0YXRlX2NoYW5nZTsvKiBFdmVudF9kYXRhIEZpZWxkIC0gUG9ydCBTdGF0ZSBDaGFuZ2UgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNVsweDdmZjQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9zdAl3cWVfc2VnbWVudDsvKiBXUUUgc2VnbWVudHMgZm9ybWF0ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDZbMHg3ZjAwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fcGFnZV9mYXVsdF9ldmVudF9kYXRhX3N0CXBhZ2VfZmF1bHRfZXZlbnRfZGF0YTsvKiBFdmVudF9kYXRhIEZpZWxkIC0gUGFnZSBGYXVsdHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkN1sweDdmZjQwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9wZXJmb3JtYW5jZV9tb25pdG9yX2V2ZW50X3N0CXBlcmZvcm1hbmNlX21vbml0b3JfZXZlbnQ7LyogRXZlbnQgRGF0YSBGaWVsZCAtIFBlcmZvcm1hbmNlIE1vbml0b3IgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOFsweGZmZjIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tdDI1MjA4X3R5cGUwX3N0CW10MjUyMDhfdHlwZTA7LyogSW5maW5pSG9zdC1JSUktRVggVHlwZTAgQ29uZmlndXJhdGlvbiBIZWFkZXIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkOVsweDdmMDAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9xcF9lZV9ldmVudF9zdAlxcF9lZV9ldmVudDsvKiBFdmVudF9kYXRhIEZpZWxkIC0gUVAvRUUgRXZlbnRzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEwWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX2dwaW9fZXZlbnRfZGF0YV9zdAlncGlvX2V2ZW50X2RhdGE7CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDExWzB4N2ZlNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3VkX2FkZHJlc3NfdmVjdG9yX3N0CXVkX2FkZHJlc3NfdmVjdG9yOy8qIFVEIEFkZHJlc3MgVmVjdG9yICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDEyWzB4N2ZmMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3F1ZXVlX3BhaXJfZWVfY29udGV4dF9lbnRyeV9zdAlxdWV1ZV9wYWlyX2VlX2NvbnRleHRfZW50cnk7LyogUVAgYW5kIEVFIENvbnRleHQgRW50cnkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTNbMHg3Zjg0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fYWRkcmVzc19wYXRoX3N0CWFkZHJlc3NfcGF0aDsvKiBBZGRyZXNzIFBhdGggKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTRbMHg3ZmVhMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fY29tcGxldGlvbl9xdWV1ZV9jb250ZXh0X3N0CWNvbXBsZXRpb25fcXVldWVfY29udGV4dDsvKiBDb21wbGV0aW9uIFF1ZXVlIENvbnRleHQgVGFibGUgRW50cnkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTVbMHg3ZmUwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fbXB0X3N0CW1wdDsgICAgICAgICAvKiBNZW1vcnkgUHJvdGVjdGlvbiBUYWJsZSAoTVBUKSBFbnRyeSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxNlsweDdmZTAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tdHRfc3QJbXR0OyAgICAgICAgIC8qIE1lbW9yeSBUcmFuc2xhdGlvbiBUYWJsZSAoTVRUKSBFbnRyeSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQxN1sweDdmZmMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9lcWNfc3QJZXFjOyAgICAgICAgIC8qIEV2ZW50IFF1ZXVlIENvbnRleHQgVGFibGUgRW50cnkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMThbMHg3ZmUwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fcGVyZm9ybWFuY2VfbW9uaXRvcnNfc3QJcGVyZm9ybWFuY2VfbW9uaXRvcnM7LyogUGVyZm9ybWFuY2UgTW9uaXRvcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMTlbMHg3ZmY4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1faGNhX2NvbW1hbmRfcmVnaXN0ZXJfc3QJaGNhX2NvbW1hbmRfcmVnaXN0ZXI7LyogSENBIENvbW1hbmQgUmVnaXN0ZXIgKEhDUikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjBbMHhmZmYyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1faW5pdF9oY2Ffc3QJaW5pdF9oY2E7LyogSU5JVF9IQ0EgJiBRVUVSWV9IQ0EgUGFyYW1ldGVycyBCbG9jayAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyMVsweDdmMDAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9xcGNiYXNlYWRkcl9zdAlxcGNiYXNlYWRkcjsvKiBRUEMvRUVDL0NRQy9FUUMvUkRCIFBhcmFtZXRlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjJbMHg3ZmMwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fdWRhdnRhYmxlX21lbW9yeV9wYXJhbWV0ZXJzX3N0CXVkYXZ0YWJsZV9tZW1vcnlfcGFyYW1ldGVyczsvKiBNZW1vcnkgQWNjZXNzIFBhcmFtZXRlcnMgZm9yIFVEIEFkZHJlc3MgVmVjdG9yIFRhYmxlICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDIzWzB4N2ZmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX211bHRpY2FzdHBhcmFtX3N0CW11bHRpY2FzdHBhcmFtOy8qIE11bHRpY2FzdCBTdXBwb3J0IFBhcmFtZXRlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjRbMHg3ZmYwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fdHB0cGFyYW1zX3N0CXRwdHBhcmFtczsvKiBUcmFuc2xhdGlvbiBhbmQgUHJvdGVjdGlvbiBUYWJsZXMgUGFyYW1ldGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyNVsweDdmZjAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjZbMHgwMDgwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDI3WzB4MDAxMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQyOFsweDdmNzAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMjlbMHgwMDEwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDMwWzB4N2ZmMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3F1ZXJ5X2Z3X3N0CXF1ZXJ5X2Z3Oy8qIFFVRVJZX0ZXIFBhcmFtZXRlcnMgQmxvY2sgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkMzFbMHg3ZjgwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fcXVlcnlfYWRhcHRlcl9zdAlxdWVyeV9hZGFwdGVyOy8qIFFVRVJZX0FEQVBURVIgUGFyYW1ldGVycyBCbG9jayAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzMlsweDdmODAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9xdWVyeV9kZXZfY2FwX3N0CXF1ZXJ5X2Rldl9jYXA7LyogUXVlcnkgRGV2aWNlIExpbWl0YXRpb25zICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDMzWzB4N2Y4MDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3Vhcl9wYXJhbXNfc3QJdWFyX3BhcmFtczsvKiBVQVIgUGFyYW1ldGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzNFsweDdmZjAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9pbml0X3BvcnRfc3QJaW5pdF9wb3J0Oy8qIElOSVRfUE9SVCBQYXJhbWV0ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM1WzB4N2Y4MDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX21nbV9lbnRyeV9zdAltZ21fZW50cnk7LyogTXVsdGljYXN0IEdyb3VwIE1lbWJlciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQzNlsweDdmZTAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9zZXRfaWJfc3QJc2V0X2liOyAgIC8qIFNFVF9JQiBQYXJhbWV0ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM3WzB4N2ZlMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3JkX3NlbmRfZG9vcmJlbGxfc3QJcmRfc2VuZF9kb29yYmVsbDsvKiBSRC1zZW5kIGRvb3JiZWxsICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM4WzB4N2ZmODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3NlbmRfZG9vcmJlbGxfc3QJc2VuZF9kb29yYmVsbDsvKiBTZW5kIGRvb3JiZWxsICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDM5WzB4N2ZmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3JlY2VpdmVfZG9vcmJlbGxfc3QJcmVjZWl2ZV9kb29yYmVsbDsvKiBSZWNlaXZlIGRvb3JiZWxsICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQwWzB4N2ZmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX2NxX2NtZF9kb29yYmVsbF9zdAljcV9jbWRfZG9vcmJlbGw7LyogQ1EgRG9vcmJlbGwgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDFbMHhmZmZjMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fdWFyX3N0CXVhcjsgICAgICAgICAvKiBVc2VyIEFjY2VzcyBSZWdpb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDJbMHg3YzAwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fbWdtcXBfc3QJbWdtcXA7ICAgICAvKiBNdWx0aWNhc3QgR3JvdXAgTWVtYmVyIFFQICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQzWzB4N2ZmZTBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3F1ZXJ5X2RlYnVnX21zZ19zdAlxdWVyeV9kZWJ1Z19tc2c7LyogUXVlcnkgRGVidWcgTWVzc2FnZSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0NFsweDdmODAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tYWRfaWZjX3N0CW1hZF9pZmM7IC8qIE1BRF9JRkMgSW5wdXQgTWFpbGJveCAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0NVsweDAwOTAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9tYWRfaWZjX2lucHV0X21vZGlmaWVyX3N0CW1hZF9pZmNfaW5wdXRfbW9kaWZpZXI7LyogTUFEX0lGQyBJbnB1dCBNb2RpZmllciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0NlsweDdlNmUwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9yZXNpemVfY3Ffc3QJcmVzaXplX2NxOy8qIFJlc2l6ZSBDUSBJbnB1dCBNYWlsYm94ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDQ3WzB4N2ZlMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX2NvbXBsZXRpb25fd2l0aF9lcnJvcl9zdAljb21wbGV0aW9uX3dpdGhfZXJyb3I7LyogQ29tcGxldGlvbiB3aXRoIEVycm9yIENRRSAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ0OFsweDdmZjAwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9oY3JfY29tcGxldGlvbl9ldmVudF9zdAloY3JfY29tcGxldGlvbl9ldmVudDsvKiBFdmVudF9kYXRhIEZpZWxkIC0gSENSIENvbXBsZXRpb24gRXZlbnQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNDlbMHg3ZmY0MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fdHJhbnNwb3J0X2FuZF9jaV9lcnJvcl9jb3VudGVyc19zdAl0cmFuc3BvcnRfYW5kX2NpX2Vycm9yX2NvdW50ZXJzOy8qIFRyYW5zcG9ydCBhbmQgQ0kgRXJyb3IgQ291bnRlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTBbMHg3ZjAwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fcGVyZm9ybWFuY2VfY291bnRlcnNfc3QJcGVyZm9ybWFuY2VfY291bnRlcnM7LyogUGVyZm9ybWFuY2UgQ291bnRlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTFbMHg5ZmY4MDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX2Zhc3RfcmVnaXN0cmF0aW9uX3NlZ21lbnRfc3QJZmFzdF9yZWdpc3RyYXRpb25fc2VnbWVudDsvKiBGYXN0IFJlZ2lzdHJhdGlvbiBTZWdtZW50ICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDUyWzB4N2ZmMDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3BibF9zdAlwYmw7ICAgICAgICAgLyogUGh5c2ljYWwgQnVmZmVyIExpc3QgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTNbMHg3ZmYwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fc3JxX2NvbnRleHRfc3QJc3JxX2NvbnRleHQ7LyogU1JRIENvbnRleHQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTRbMHg3ZmU4MF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fbW9kX3N0YXRfY2ZnX3N0CW1vZF9zdGF0X2NmZzsvKiBNT0RfU1RBVF9DRkcgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNTVbMHg3ZjgwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fdmlydHVhbF9waHlzaWNhbF9tYXBwaW5nX3N0CXZpcnR1YWxfcGh5c2ljYWxfbWFwcGluZzsvKiBWaXJ0dWFsIGFuZCBQaHlzaWNhbCBNYXBwaW5nICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU2WzB4N2ZmODBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX2NxX2NpX2RiX3JlY29yZF9zdAljcV9jaV9kYl9yZWNvcmQ7LyogQ1FfQ0lfREJfUmVjb3JkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU3WzB4N2ZmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX2NxX2FybV9kYl9yZWNvcmRfc3QJY3FfYXJtX2RiX3JlY29yZDsvKiBDUV9BUk1fREJfUmVjb3JkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU4WzB4N2ZmYzBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBzdHJ1Y3QgaGVybW9ucHJtX3FwX2RiX3JlY29yZF9zdAlxcF9kYl9yZWNvcmQ7LyogUVBfREJfUmVjb3JkICovCisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDU5WzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2MFsweDFmZmZjMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHN0cnVjdCBoZXJtb25wcm1fY29uZmlndXJhdGlvbl9yZWdpc3RlcnNfc3QJY29uZmlndXJhdGlvbl9yZWdpc3RlcnM7LyogSW5maW5pSG9zdCBJSUkgRVggQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9lcV9zZXRfY2lfdGFibGVfc3QJZXFfc2V0X2NpX3RhYmxlOy8qIEVRIFNldCBDSSBEQnMgVGFibGUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgcHNldWRvX2JpdF90CXJlc2VydmVkNjFbMHgwMTAwMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworICAgIHBzZXVkb19iaXRfdAlyZXNlcnZlZDYyWzB4MDAwNDBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2M1sweDAwZmMwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisgICAgc3RydWN0IGhlcm1vbnBybV9jbHJfaW50X3N0CWNscl9pbnQ7IC8qIENsZWFyIEludGVycnVwdCBSZWdpc3RlciAqLworLyogLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBwc2V1ZG9fYml0X3QJcmVzZXJ2ZWQ2NFsweGZmY2ZjMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworfTsgCisjZW5kaWYgLyogSF9wcmVmaXhfaGVybW9ucHJtX2JpdHNfZml4bmFtZXNfTVQyNTQwOF9QUk1fY3NwX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9hcmJlbC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL2FyYmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmMzU3NAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9hcmJlbC5jCkBAIC0wLDAgKzEsMjI0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogQmFzZWQgaW4gcGFydCB1cG9uIHRoZSBvcmlnaW5hbCBkcml2ZXIgYnkgTWVsbGFub3ggVGVjaG5vbG9naWVzCisgKiBMdGQuICBQb3J0aW9ucyBtYXkgYmUgQ29weXJpZ2h0IChjKSBNZWxsYW5veCBUZWNobm9sb2dpZXMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL3VtYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2luZmluaWJhbmQuaD4KKyNpbmNsdWRlIDxncHhlL2liX3NtYy5oPgorI2luY2x1ZGUgImFyYmVsLmgiCisKKy8qKgorICogQGZpbGUKKyAqCisgKiBNZWxsYW5veCBBcmJlbCBJbmZpbmliYW5kIEhDQQorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUXVldWUgbnVtYmVyIGFsbG9jYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBBbGxvY2F0ZSBxdWV1ZSBudW1iZXIKKyAqCisgKiBAdiBxX2ludXNlCQlRdWV1ZSB1c2FnZSBiaXRtYXNrCisgKiBAdiBtYXhfaW51c2UJCU1heGltdW0gbnVtYmVyIG9mIGluLXVzZSBxdWV1ZXMKKyAqIEByZXQgcW5fb2Zmc2V0CUZyZWUgcXVldWUgbnVtYmVyIG9mZnNldCwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworc3RhdGljIGludCBhcmJlbF9hbGxvY19xbl9vZmZzZXQgKCBhcmJlbF9iaXRtYXNrX3QgKnFfaW51c2UsCisJCQkJICAgdW5zaWduZWQgaW50IG1heF9pbnVzZSApIHsKKwl1bnNpZ25lZCBpbnQgcW5fb2Zmc2V0ID0gMDsKKwlhcmJlbF9iaXRtYXNrX3QgbWFzayA9IDE7CisKKwl3aGlsZSAoIHFuX29mZnNldCA8IG1heF9pbnVzZSApIHsKKwkJaWYgKCAoIG1hc2sgJiAqcV9pbnVzZSApID09IDAgKSB7CisJCQkqcV9pbnVzZSB8PSBtYXNrOworCQkJcmV0dXJuIHFuX29mZnNldDsKKwkJfQorCQlxbl9vZmZzZXQrKzsKKwkJbWFzayA8PD0gMTsKKwkJaWYgKCAhIG1hc2sgKSB7CisJCQltYXNrID0gMTsKKwkJCXFfaW51c2UrKzsKKwkJfQorCX0KKwlyZXR1cm4gLUVORklMRTsKK30KKworLyoqCisgKiBGcmVlIHF1ZXVlIG51bWJlcgorICoKKyAqIEB2IHFfaW51c2UJCVF1ZXVlIHVzYWdlIGJpdG1hc2sKKyAqIEB2IHFuX29mZnNldAkJUXVldWUgbnVtYmVyIG9mZnNldAorICovCitzdGF0aWMgdm9pZCBhcmJlbF9mcmVlX3FuX29mZnNldCAoIGFyYmVsX2JpdG1hc2tfdCAqcV9pbnVzZSwgaW50IHFuX29mZnNldCApIHsKKwlhcmJlbF9iaXRtYXNrX3QgbWFzazsKKworCW1hc2sgPSAoIDEgPDwgKCBxbl9vZmZzZXQgJSAoIDggKiBzaXplb2YgKCBtYXNrICkgKSApICk7CisJcV9pbnVzZSArPSAoIHFuX29mZnNldCAvICggOCAqIHNpemVvZiAoIG1hc2sgKSApICk7CisJKnFfaW51c2UgJj0gfm1hc2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBIQ0EgY29tbWFuZHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBXYWl0IGZvciBBcmJlbCBjb21tYW5kIGNvbXBsZXRpb24KKyAqCisgKiBAdiBhcmJlbAkJQXJiZWwgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcmJlbF9jbWRfd2FpdCAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsCisJCQkgICAgc3RydWN0IGFyYmVscHJtX2hjYV9jb21tYW5kX3JlZ2lzdGVyICpoY3IgKSB7CisJdW5zaWduZWQgaW50IHdhaXQ7CisKKwlmb3IgKCB3YWl0ID0gQVJCRUxfSENSX01BWF9XQUlUX01TIDsgd2FpdCA7IHdhaXQtLSApIHsKKwkJaGNyLT51LmR3b3Jkc1s2XSA9CisJCQlyZWFkbCAoIGFyYmVsLT5jb25maWcgKyBBUkJFTF9IQ1JfUkVHICggNiApICk7CisJCWlmICggTUxYX0dFVCAoIGhjciwgZ28gKSA9PSAwICkKKwkJCXJldHVybiAwOworCQltZGVsYXkgKCAxICk7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKKy8qKgorICogSXNzdWUgSENBIGNvbW1hbmQKKyAqCisgKiBAdiBhcmJlbAkJQXJiZWwgZGV2aWNlCisgKiBAdiBjb21tYW5kCQlDb21tYW5kIG9wY29kZSwgZmxhZ3MgYW5kIGlucHV0L291dHB1dCBsZW5ndGhzCisgKiBAdiBvcF9tb2QJCU9wY29kZSBtb2RpZmllciAoMCBpZiBubyBtb2RpZmllciBhcHBsaWNhYmxlKQorICogQHYgaW4JCUlucHV0IHBhcmFtZXRlcnMKKyAqIEB2IGluX21vZAkJSW5wdXQgbW9kaWZpZXIgKDAgaWYgbm8gbW9kaWZpZXIgYXBwbGljYWJsZSkKKyAqIEB2IG91dAkJT3V0cHV0IHBhcmFtZXRlcnMKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGFyYmVsX2NtZCAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsIHVuc2lnbmVkIGxvbmcgY29tbWFuZCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBvcF9tb2QsIGNvbnN0IHZvaWQgKmluLAorCQkgICAgICAgdW5zaWduZWQgaW50IGluX21vZCwgdm9pZCAqb3V0ICkgeworCXN0cnVjdCBhcmJlbHBybV9oY2FfY29tbWFuZF9yZWdpc3RlciBoY3I7CisJdW5zaWduZWQgaW50IG9wY29kZSA9IEFSQkVMX0hDUl9PUENPREUgKCBjb21tYW5kICk7CisJc2l6ZV90IGluX2xlbiA9IEFSQkVMX0hDUl9JTl9MRU4gKCBjb21tYW5kICk7CisJc2l6ZV90IG91dF9sZW4gPSBBUkJFTF9IQ1JfT1VUX0xFTiAoIGNvbW1hbmQgKTsKKwl2b2lkICppbl9idWZmZXI7CisJdm9pZCAqb3V0X2J1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCWFzc2VydCAoIGluX2xlbiA8PSBBUkJFTF9NQk9YX1NJWkUgKTsKKwlhc3NlcnQgKCBvdXRfbGVuIDw9IEFSQkVMX01CT1hfU0laRSApOworCisJREJHQzIgKCBhcmJlbCwgIkFyYmVsICVwIGNvbW1hbmQgJTAyeCBpbiAlenglcyBvdXQgJXp4JXNcbiIsCisJCWFyYmVsLCBvcGNvZGUsIGluX2xlbiwKKwkJKCAoIGNvbW1hbmQgJiBBUkJFTF9IQ1JfSU5fTUJPWCApID8gIihtYm94KSIgOiAiIiApLCBvdXRfbGVuLAorCQkoICggY29tbWFuZCAmIEFSQkVMX0hDUl9PVVRfTUJPWCApID8gIihtYm94KSIgOiAiIiApICk7CisKKwkvKiBDaGVjayB0aGF0IEhDUiBpcyBmcmVlICovCisJaWYgKCAoIHJjID0gYXJiZWxfY21kX3dhaXQgKCBhcmJlbCwgJmhjciApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgY29tbWFuZCBpbnRlcmZhY2UgbG9ja2VkXG4iLCBhcmJlbCApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogUHJlcGFyZSBIQ1IgKi8KKwltZW1zZXQgKCAmaGNyLCAwLCBzaXplb2YgKCBoY3IgKSApOworCWluX2J1ZmZlciA9ICZoY3IudS5kd29yZHNbMF07CisJaWYgKCBpbl9sZW4gJiYgKCBjb21tYW5kICYgQVJCRUxfSENSX0lOX01CT1ggKSApIHsKKwkJaW5fYnVmZmVyID0gYXJiZWwtPm1haWxib3hfaW47CisJCU1MWF9GSUxMXzEgKCAmaGNyLCAxLCBpbl9wYXJhbV9sLCB2aXJ0X3RvX2J1cyAoIGluX2J1ZmZlciApICk7CisJfQorCW1lbWNweSAoIGluX2J1ZmZlciwgaW4sIGluX2xlbiApOworCU1MWF9GSUxMXzEgKCAmaGNyLCAyLCBpbnB1dF9tb2RpZmllciwgaW5fbW9kICk7CisJb3V0X2J1ZmZlciA9ICZoY3IudS5kd29yZHNbM107CisJaWYgKCBvdXRfbGVuICYmICggY29tbWFuZCAmIEFSQkVMX0hDUl9PVVRfTUJPWCApICkgeworCQlvdXRfYnVmZmVyID0gYXJiZWwtPm1haWxib3hfb3V0OworCQlNTFhfRklMTF8xICggJmhjciwgNCwgb3V0X3BhcmFtX2wsCisJCQkgICAgIHZpcnRfdG9fYnVzICggb3V0X2J1ZmZlciApICk7CisJfQorCU1MWF9GSUxMXzMgKCAmaGNyLCA2LAorCQkgICAgIG9wY29kZSwgb3Bjb2RlLAorCQkgICAgIG9wY29kZV9tb2RpZmllciwgb3BfbW9kLAorCQkgICAgIGdvLCAxICk7CisJREJHQzJfSEQgKCBhcmJlbCwgJmhjciwgc2l6ZW9mICggaGNyICkgKTsKKwlpZiAoIGluX2xlbiApIHsKKwkJREJHQzIgKCBhcmJlbCwgIklucHV0OlxuIiApOworCQlEQkdDMl9IRCAoIGFyYmVsLCBpbiwgKCAoIGluX2xlbiA8IDUxMiApID8gaW5fbGVuIDogNTEyICkgKTsKKwl9CisKKwkvKiBJc3N1ZSBjb21tYW5kICovCisJZm9yICggaSA9IDAgOyBpIDwgKCBzaXplb2YgKCBoY3IgKSAvIHNpemVvZiAoIGhjci51LmR3b3Jkc1swXSApICkgOworCSAgICAgIGkrKyApIHsKKwkJd3JpdGVsICggaGNyLnUuZHdvcmRzW2ldLAorCQkJIGFyYmVsLT5jb25maWcgKyBBUkJFTF9IQ1JfUkVHICggaSApICk7CisJCWJhcnJpZXIoKTsKKwl9CisKKwkvKiBXYWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24gKi8KKwlpZiAoICggcmMgPSBhcmJlbF9jbWRfd2FpdCAoIGFyYmVsLCAmaGNyICkgKSAhPSAwICkgeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY29tbWFuZDpcbiIsCisJCSAgICAgICBhcmJlbCApOworCQlEQkdDX0hEICggYXJiZWwsICZoY3IsIHNpemVvZiAoIGhjciApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBDaGVjayBjb21tYW5kIHN0YXR1cyAqLworCXN0YXR1cyA9IE1MWF9HRVQgKCAmaGNyLCBzdGF0dXMgKTsKKwlpZiAoIHN0YXR1cyAhPSAwICkgeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBjb21tYW5kIGZhaWxlZCB3aXRoIHN0YXR1cyAlMDJ4OlxuIiwKKwkJICAgICAgIGFyYmVsLCBzdGF0dXMgKTsKKwkJREJHQ19IRCAoIGFyYmVsLCAmaGNyLCBzaXplb2YgKCBoY3IgKSApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBSZWFkIG91dHB1dCBwYXJhbWV0ZXJzLCBpZiBhbnkgKi8KKwloY3IudS5kd29yZHNbM10gPSByZWFkbCAoIGFyYmVsLT5jb25maWcgKyBBUkJFTF9IQ1JfUkVHICggMyApICk7CisJaGNyLnUuZHdvcmRzWzRdID0gcmVhZGwgKCBhcmJlbC0+Y29uZmlnICsgQVJCRUxfSENSX1JFRyAoIDQgKSApOworCW1lbWNweSAoIG91dCwgb3V0X2J1ZmZlciwgb3V0X2xlbiApOworCWlmICggb3V0X2xlbiApIHsKKwkJREJHQzIgKCBhcmJlbCwgIk91dHB1dDpcbiIgKTsKKwkJREJHQzJfSEQgKCBhcmJlbCwgb3V0LCAoICggb3V0X2xlbiA8IDUxMiApID8gb3V0X2xlbiA6IDUxMiApICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithcmJlbF9jbWRfcXVlcnlfZGV2X2xpbSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsCisJCQkgIHN0cnVjdCBhcmJlbHBybV9xdWVyeV9kZXZfbGltICpkZXZfbGltICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9PVVRfQ01EICggQVJCRUxfSENSX1FVRVJZX0RFVl9MSU0sCisJCQkJCSAgICAgICAxLCBzaXplb2YgKCAqZGV2X2xpbSApICksCisJCQkgICAwLCBOVUxMLCAwLCBkZXZfbGltICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithcmJlbF9jbWRfcXVlcnlfZncgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsLCBzdHJ1Y3QgYXJiZWxwcm1fcXVlcnlfZncgKmZ3ICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9PVVRfQ01EICggQVJCRUxfSENSX1FVRVJZX0ZXLCAKKwkJCQkJICAgICAgIDEsIHNpemVvZiAoICpmdyApICksCisJCQkgICAwLCBOVUxMLCAwLCBmdyApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX2luaXRfaGNhICggc3RydWN0IGFyYmVsICphcmJlbCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYXJiZWxwcm1faW5pdF9oY2EgKmluaXRfaGNhICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9JTl9DTUQgKCBBUkJFTF9IQ1JfSU5JVF9IQ0EsCisJCQkJCSAgICAgIDEsIHNpemVvZiAoICppbml0X2hjYSApICksCisJCQkgICAwLCBpbml0X2hjYSwgMCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX2Nsb3NlX2hjYSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwgKSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX1ZPSURfQ01EICggQVJCRUxfSENSX0NMT1NFX0hDQSApLAorCQkJICAgMCwgTlVMTCwgMCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX2luaXRfaWIgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsLCB1bnNpZ25lZCBpbnQgcG9ydCwKKwkJICAgIGNvbnN0IHN0cnVjdCBhcmJlbHBybV9pbml0X2liICppbml0X2liICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9JTl9DTUQgKCBBUkJFTF9IQ1JfSU5JVF9JQiwKKwkJCQkJICAgICAgMSwgc2l6ZW9mICggKmluaXRfaWIgKSApLAorCQkJICAgMCwgaW5pdF9pYiwgcG9ydCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX2Nsb3NlX2liICggc3RydWN0IGFyYmVsICphcmJlbCwgdW5zaWduZWQgaW50IHBvcnQgKSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX1ZPSURfQ01EICggQVJCRUxfSENSX0NMT1NFX0lCICksCisJCQkgICAwLCBOVUxMLCBwb3J0LCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithcmJlbF9jbWRfc3cyaHdfbXB0ICggc3RydWN0IGFyYmVsICphcmJlbCwgdW5zaWduZWQgaW50IGluZGV4LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYXJiZWxwcm1fbXB0ICptcHQgKSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX0lOX0NNRCAoIEFSQkVMX0hDUl9TVzJIV19NUFQsCisJCQkJCSAgICAgIDEsIHNpemVvZiAoICptcHQgKSApLAorCQkJICAgMCwgbXB0LCBpbmRleCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX21hcF9lcSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsIHVuc2lnbmVkIGxvbmcgaW5kZXhfbWFwLAorCQkgICBjb25zdCBzdHJ1Y3QgYXJiZWxwcm1fZXZlbnRfbWFzayAqbWFzayApIHsKKwlyZXR1cm4gYXJiZWxfY21kICggYXJiZWwsCisJCQkgICBBUkJFTF9IQ1JfSU5fQ01EICggQVJCRUxfSENSX01BUF9FUSwKKwkJCQkJICAgICAgMCwgc2l6ZW9mICggKm1hc2sgKSApLAorCQkJICAgMCwgbWFzaywgaW5kZXhfbWFwLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithcmJlbF9jbWRfc3cyaHdfZXEgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCSAgICAgY29uc3Qgc3RydWN0IGFyYmVscHJtX2VxYyAqZXFjdHggKSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX0lOX0NNRCAoIEFSQkVMX0hDUl9TVzJIV19FUSwKKwkJCQkJICAgICAgMSwgc2l6ZW9mICggKmVxY3R4ICkgKSwKKwkJCSAgIDAsIGVxY3R4LCBpbmRleCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX2h3MnN3X2VxICggc3RydWN0IGFyYmVsICphcmJlbCwgdW5zaWduZWQgaW50IGluZGV4LAorCQkgICAgIHN0cnVjdCBhcmJlbHBybV9lcWMgKmVxY3R4ICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9PVVRfQ01EICggQVJCRUxfSENSX0hXMlNXX0VRLAorCQkJCQkgICAgICAgMSwgc2l6ZW9mICggKmVxY3R4ICkgKSwKKwkJCSAgIDEsIE5VTEwsIGluZGV4LCBlcWN0eCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX3N3Mmh3X2NxICggc3RydWN0IGFyYmVsICphcmJlbCwgdW5zaWduZWQgbG9uZyBjcW4sCisJCSAgICAgY29uc3Qgc3RydWN0IGFyYmVscHJtX2NvbXBsZXRpb25fcXVldWVfY29udGV4dCAqY3FjdHggKSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX0lOX0NNRCAoIEFSQkVMX0hDUl9TVzJIV19DUSwKKwkJCQkJICAgICAgMSwgc2l6ZW9mICggKmNxY3R4ICkgKSwKKwkJCSAgIDAsIGNxY3R4LCBjcW4sIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FyYmVsX2NtZF9odzJzd19jcSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsIHVuc2lnbmVkIGxvbmcgY3FuLAorCQkgICAgIHN0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3F1ZXVlX2NvbnRleHQgKmNxY3R4KSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX09VVF9DTUQgKCBBUkJFTF9IQ1JfSFcyU1dfQ1EsCisJCQkJCSAgICAgICAxLCBzaXplb2YgKCAqY3FjdHggKSApLAorCQkJICAgMCwgTlVMTCwgY3FuLCBjcWN0eCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX3JzdDJpbml0X3FwZWUgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsLCB1bnNpZ25lZCBsb25nIHFwbiwKKwkJCSAgY29uc3Qgc3RydWN0IGFyYmVscHJtX3FwX2VlX3N0YXRlX3RyYW5zaXRpb25zICpjdHggKXsKKwlyZXR1cm4gYXJiZWxfY21kICggYXJiZWwsCisJCQkgICBBUkJFTF9IQ1JfSU5fQ01EICggQVJCRUxfSENSX1JTVDJJTklUX1FQRUUsCisJCQkJCSAgICAgIDEsIHNpemVvZiAoICpjdHggKSApLAorCQkJICAgMCwgY3R4LCBxcG4sIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FyYmVsX2NtZF9pbml0MnJ0cl9xcGVlICggc3RydWN0IGFyYmVsICphcmJlbCwgdW5zaWduZWQgbG9uZyBxcG4sCisJCQkgIGNvbnN0IHN0cnVjdCBhcmJlbHBybV9xcF9lZV9zdGF0ZV90cmFuc2l0aW9ucyAqY3R4ICl7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX0lOX0NNRCAoIEFSQkVMX0hDUl9JTklUMlJUUl9RUEVFLAorCQkJCQkgICAgICAxLCBzaXplb2YgKCAqY3R4ICkgKSwKKwkJCSAgIDAsIGN0eCwgcXBuLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithcmJlbF9jbWRfcnRyMnJ0c19xcGVlICggc3RydWN0IGFyYmVsICphcmJlbCwgdW5zaWduZWQgbG9uZyBxcG4sCisJCQkgY29uc3Qgc3RydWN0IGFyYmVscHJtX3FwX2VlX3N0YXRlX3RyYW5zaXRpb25zICpjdHggKSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX0lOX0NNRCAoIEFSQkVMX0hDUl9SVFIyUlRTX1FQRUUsCisJCQkJCSAgICAgIDEsIHNpemVvZiAoICpjdHggKSApLAorCQkJICAgMCwgY3R4LCBxcG4sIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FyYmVsX2NtZF9ydHMycnRzX3FwICggc3RydWN0IGFyYmVsICphcmJlbCwgdW5zaWduZWQgbG9uZyBxcG4sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXJiZWxwcm1fcXBfZWVfc3RhdGVfdHJhbnNpdGlvbnMgKmN0eCApIHsKKwlyZXR1cm4gYXJiZWxfY21kICggYXJiZWwsCisJCQkgICBBUkJFTF9IQ1JfSU5fQ01EICggQVJCRUxfSENSX1JUUzJSVFNfUVBFRSwKKwkJCQkJICAgICAgMSwgc2l6ZW9mICggKmN0eCApICksCisJCQkgICAwLCBjdHgsIHFwbiwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kXzJyc3RfcXBlZSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsIHVuc2lnbmVkIGxvbmcgcXBuICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9WT0lEX0NNRCAoIEFSQkVMX0hDUl8yUlNUX1FQRUUgKSwKKwkJCSAgIDB4MDMsIE5VTEwsIHFwbiwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX21hZF9pZmMgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsLCB1bnNpZ25lZCBpbnQgcG9ydCwKKwkJICAgIHVuaW9uIGFyYmVscHJtX21hZCAqbWFkICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9JTk9VVF9DTUQgKCBBUkJFTF9IQ1JfTUFEX0lGQywKKwkJCQkJCSAxLCBzaXplb2YgKCAqbWFkICksCisJCQkJCQkgMSwgc2l6ZW9mICggKm1hZCApICksCisJCQkgICAweDAzLCBtYWQsIHBvcnQsIG1hZCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX3JlYWRfbWdtICggc3RydWN0IGFyYmVsICphcmJlbCwgdW5zaWduZWQgaW50IGluZGV4LAorCQkgICAgIHN0cnVjdCBhcmJlbHBybV9tZ21fZW50cnkgKm1nbSApIHsKKwlyZXR1cm4gYXJiZWxfY21kICggYXJiZWwsCisJCQkgICBBUkJFTF9IQ1JfT1VUX0NNRCAoIEFSQkVMX0hDUl9SRUFEX01HTSwKKwkJCQkJICAgICAgIDEsIHNpemVvZiAoICptZ20gKSApLAorCQkJICAgMCwgTlVMTCwgaW5kZXgsIG1nbSApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX3dyaXRlX21nbSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsIHVuc2lnbmVkIGludCBpbmRleCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGFyYmVscHJtX21nbV9lbnRyeSAqbWdtICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9JTl9DTUQgKCBBUkJFTF9IQ1JfV1JJVEVfTUdNLAorCQkJCQkgICAgICAxLCBzaXplb2YgKCAqbWdtICkgKSwKKwkJCSAgIDAsIG1nbSwgaW5kZXgsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FyYmVsX2NtZF9tZ2lkX2hhc2ggKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsLCBjb25zdCBzdHJ1Y3QgaWJfZ2lkICpnaWQsCisJCSAgICAgIHN0cnVjdCBhcmJlbHBybV9tZ21faGFzaCAqaGFzaCApIHsKKwlyZXR1cm4gYXJiZWxfY21kICggYXJiZWwsCisJCQkgICBBUkJFTF9IQ1JfSU5PVVRfQ01EICggQVJCRUxfSENSX01HSURfSEFTSCwKKwkJCQkJCSAxLCBzaXplb2YgKCAqZ2lkICksCisJCQkJCQkgMCwgc2l6ZW9mICggKmhhc2ggKSApLAorCQkJICAgMCwgZ2lkLCAwLCBoYXNoICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithcmJlbF9jbWRfcnVuX2Z3ICggc3RydWN0IGFyYmVsICphcmJlbCApIHsKKwlyZXR1cm4gYXJiZWxfY21kICggYXJiZWwsCisJCQkgICBBUkJFTF9IQ1JfVk9JRF9DTUQgKCBBUkJFTF9IQ1JfUlVOX0ZXICksCisJCQkgICAwLCBOVUxMLCAwLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithcmJlbF9jbWRfZGlzYWJsZV9sYW0gKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9WT0lEX0NNRCAoIEFSQkVMX0hDUl9ESVNBQkxFX0xBTSApLAorCQkJICAgMCwgTlVMTCwgMCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX2VuYWJsZV9sYW0gKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsLCBzdHJ1Y3QgYXJiZWxwcm1fYWNjZXNzX2xhbSAqbGFtICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9PVVRfQ01EICggQVJCRUxfSENSX0VOQUJMRV9MQU0sCisJCQkJCSAgICAgICAxLCBzaXplb2YgKCAqbGFtICkgKSwKKwkJCSAgIDEsIE5VTEwsIDAsIGxhbSApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX3VubWFwX2ljbSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsIHVuc2lnbmVkIGludCBwYWdlX2NvdW50ICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9WT0lEX0NNRCAoIEFSQkVMX0hDUl9VTk1BUF9JQ00gKSwKKwkJCSAgIDAsIE5VTEwsIHBhZ2VfY291bnQsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FyYmVsX2NtZF9tYXBfaWNtICggc3RydWN0IGFyYmVsICphcmJlbCwKKwkJICAgIGNvbnN0IHN0cnVjdCBhcmJlbHBybV92aXJ0dWFsX3BoeXNpY2FsX21hcHBpbmcgKm1hcCApIHsKKwlyZXR1cm4gYXJiZWxfY21kICggYXJiZWwsCisJCQkgICBBUkJFTF9IQ1JfSU5fQ01EICggQVJCRUxfSENSX01BUF9JQ00sCisJCQkJCSAgICAgIDEsIHNpemVvZiAoICptYXAgKSApLAorCQkJICAgMCwgbWFwLCAxLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithcmJlbF9jbWRfdW5tYXBfaWNtX2F1eCAoIHN0cnVjdCBhcmJlbCAqYXJiZWwgKSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX1ZPSURfQ01EICggQVJCRUxfSENSX1VOTUFQX0lDTV9BVVggKSwKKwkJCSAgIDAsIE5VTEwsIDAsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FyYmVsX2NtZF9tYXBfaWNtX2F1eCAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsCisJCQljb25zdCBzdHJ1Y3QgYXJiZWxwcm1fdmlydHVhbF9waHlzaWNhbF9tYXBwaW5nICptYXAgKSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX0lOX0NNRCAoIEFSQkVMX0hDUl9NQVBfSUNNX0FVWCwKKwkJCQkJICAgICAgMSwgc2l6ZW9mICggKm1hcCApICksCisJCQkgICAwLCBtYXAsIDEsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FyYmVsX2NtZF9zZXRfaWNtX3NpemUgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsLAorCQkJIGNvbnN0IHN0cnVjdCBhcmJlbHBybV9zY2FsYXJfcGFyYW1ldGVyICppY21fc2l6ZSwKKwkJCSBzdHJ1Y3QgYXJiZWxwcm1fc2NhbGFyX3BhcmFtZXRlciAqaWNtX2F1eF9zaXplICkgeworCXJldHVybiBhcmJlbF9jbWQgKCBhcmJlbCwKKwkJCSAgIEFSQkVMX0hDUl9JTk9VVF9DTUQgKCBBUkJFTF9IQ1JfU0VUX0lDTV9TSVpFLAorCQkJCQkJIDAsIHNpemVvZiAoICppY21fc2l6ZSApLAorCQkJCQkJIDAsIHNpemVvZiAoICppY21fYXV4X3NpemUgKSApLAorCQkJICAgMCwgaWNtX3NpemUsIDAsIGljbV9hdXhfc2l6ZSApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYXJiZWxfY21kX3VubWFwX2ZhICggc3RydWN0IGFyYmVsICphcmJlbCApIHsKKwlyZXR1cm4gYXJiZWxfY21kICggYXJiZWwsCisJCQkgICBBUkJFTF9IQ1JfVk9JRF9DTUQgKCBBUkJFTF9IQ1JfVU5NQVBfRkEgKSwKKwkJCSAgIDAsIE5VTEwsIDAsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FyYmVsX2NtZF9tYXBfZmEgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsLAorCQkgICBjb25zdCBzdHJ1Y3QgYXJiZWxwcm1fdmlydHVhbF9waHlzaWNhbF9tYXBwaW5nICptYXAgKSB7CisJcmV0dXJuIGFyYmVsX2NtZCAoIGFyYmVsLAorCQkJICAgQVJCRUxfSENSX0lOX0NNRCAoIEFSQkVMX0hDUl9NQVBfRkEsCisJCQkJCSAgICAgIDEsIHNpemVvZiAoICptYXAgKSApLAorCQkJICAgMCwgbWFwLCAxLCBOVUxMICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNQUQgb3BlcmF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIElzc3VlIG1hbmFnZW1lbnQgZGF0YWdyYW0KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG1hZAkJTWFuYWdlbWVudCBkYXRhZ3JhbQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYXJiZWxfbWFkICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHVuaW9uIGliX21hZCAqbWFkICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJdW5pb24gYXJiZWxwcm1fbWFkIG1hZF9pZmM7CisJaW50IHJjOworCisJbGlua2VyX2Fzc2VydCAoIHNpemVvZiAoICptYWQgKSA9PSBzaXplb2YgKCBtYWRfaWZjLm1hZCApLAorCQkJbWFkX3NpemVfbWlzbWF0Y2ggKTsKKworCS8qIENvcHkgaW4gcmVxdWVzdCBwYWNrZXQgKi8KKwltZW1jcHkgKCAmbWFkX2lmYy5tYWQsIG1hZCwgc2l6ZW9mICggbWFkX2lmYy5tYWQgKSApOworCisJLyogSXNzdWUgTUFEICovCisJaWYgKCAoIHJjID0gYXJiZWxfY21kX21hZF9pZmMgKCBhcmJlbCwgaWJkZXYtPnBvcnQsCisJCQkJCSZtYWRfaWZjICkgKSAhPSAwICkgeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBjb3VsZCBub3QgaXNzdWUgTUFEIElGQzogJXNcbiIsCisJCSAgICAgICBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBDb3B5IG91dCByZXBseSBwYWNrZXQgKi8KKwltZW1jcHkgKCBtYWQsICZtYWRfaWZjLm1hZCwgc2l6ZW9mICggKm1hZCApICk7CisKKwlpZiAoIG1hZC0+aGRyLnN0YXR1cyAhPSAwICkgeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBNQUQgSUZDIHN0YXR1cyAlMDR4XG4iLAorCQkgICAgICAgYXJiZWwsIG50b2hzICggbWFkLT5oZHIuc3RhdHVzICkgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29tcGxldGlvbiBxdWV1ZSBvcGVyYXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQ3JlYXRlIGNvbXBsZXRpb24gcXVldWUKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IGNxCQlDb21wbGV0aW9uIHF1ZXVlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcmJlbF9jcmVhdGVfY3EgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGFyYmVsX2NvbXBsZXRpb25fcXVldWUgKmFyYmVsX2NxOworCXN0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3F1ZXVlX2NvbnRleHQgY3FjdHg7CisJc3RydWN0IGFyYmVscHJtX2NxX2NpX2RiX3JlY29yZCAqY2lfZGJfcmVjOworCXN0cnVjdCBhcmJlbHBybV9jcV9hcm1fZGJfcmVjb3JkICphcm1fZGJfcmVjOworCWludCBjcW5fb2Zmc2V0OworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCS8qIEZpbmQgYSBmcmVlIGNvbXBsZXRpb24gcXVldWUgbnVtYmVyICovCisJY3FuX29mZnNldCA9IGFyYmVsX2FsbG9jX3FuX29mZnNldCAoIGFyYmVsLT5jcV9pbnVzZSwgQVJCRUxfTUFYX0NRUyApOworCWlmICggY3FuX29mZnNldCA8IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIG91dCBvZiBjb21wbGV0aW9uIHF1ZXVlc1xuIiwgYXJiZWwgKTsKKwkJcmMgPSBjcW5fb2Zmc2V0OworCQlnb3RvIGVycl9jcW5fb2Zmc2V0OworCX0KKwljcS0+Y3FuID0gKCBhcmJlbC0+bGltaXRzLnJlc2VydmVkX2NxcyArIGNxbl9vZmZzZXQgKTsKKworCS8qIEFsbG9jYXRlIGNvbnRyb2wgc3RydWN0dXJlcyAqLworCWFyYmVsX2NxID0gemFsbG9jICggc2l6ZW9mICggKmFyYmVsX2NxICkgKTsKKwlpZiAoICEgYXJiZWxfY3EgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfYXJiZWxfY3E7CisJfQorCWFyYmVsX2NxLT5jaV9kb29yYmVsbF9pZHggPSBhcmJlbF9jcV9jaV9kb29yYmVsbF9pZHggKCBjcW5fb2Zmc2V0ICk7CisJYXJiZWxfY3EtPmFybV9kb29yYmVsbF9pZHggPSBhcmJlbF9jcV9hcm1fZG9vcmJlbGxfaWR4ICggY3FuX29mZnNldCApOworCisJLyogQWxsb2NhdGUgY29tcGxldGlvbiBxdWV1ZSBpdHNlbGYgKi8KKwlhcmJlbF9jcS0+Y3FlX3NpemUgPSAoIGNxLT5udW1fY3FlcyAqIHNpemVvZiAoIGFyYmVsX2NxLT5jcWVbMF0gKSApOworCWFyYmVsX2NxLT5jcWUgPSBtYWxsb2NfZG1hICggYXJiZWxfY3EtPmNxZV9zaXplLAorCQkJCSAgICAgc2l6ZW9mICggYXJiZWxfY3EtPmNxZVswXSApICk7CisJaWYgKCAhIGFyYmVsX2NxLT5jcWUgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfY3FlOworCX0KKwltZW1zZXQgKCBhcmJlbF9jcS0+Y3FlLCAwLCBhcmJlbF9jcS0+Y3FlX3NpemUgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBjcS0+bnVtX2NxZXMgOyBpKysgKSB7CisJCU1MWF9GSUxMXzEgKCAmYXJiZWxfY3EtPmNxZVtpXS5ub3JtYWwsIDcsIG93bmVyLCAxICk7CisJfQorCWJhcnJpZXIoKTsKKworCS8qIEluaXRpYWxpc2UgZG9vcmJlbGwgcmVjb3JkcyAqLworCWNpX2RiX3JlYyA9ICZhcmJlbC0+ZGJfcmVjW2FyYmVsX2NxLT5jaV9kb29yYmVsbF9pZHhdLmNxX2NpOworCU1MWF9GSUxMXzEgKCBjaV9kYl9yZWMsIDAsIGNvdW50ZXIsIDAgKTsKKwlNTFhfRklMTF8yICggY2lfZGJfcmVjLCAxLAorCQkgICAgIHJlcywgQVJCRUxfVUFSX1JFU19DUV9DSSwKKwkJICAgICBjcV9udW1iZXIsIGNxLT5jcW4gKTsKKwlhcm1fZGJfcmVjID0gJmFyYmVsLT5kYl9yZWNbYXJiZWxfY3EtPmFybV9kb29yYmVsbF9pZHhdLmNxX2FybTsKKwlNTFhfRklMTF8xICggYXJtX2RiX3JlYywgMCwgY291bnRlciwgMCApOworCU1MWF9GSUxMXzIgKCBhcm1fZGJfcmVjLCAxLAorCQkgICAgIHJlcywgQVJCRUxfVUFSX1JFU19DUV9BUk0sCisJCSAgICAgY3FfbnVtYmVyLCBjcS0+Y3FuICk7CisKKwkvKiBIYW5kIHF1ZXVlIG92ZXIgdG8gaGFyZHdhcmUgKi8KKwltZW1zZXQgKCAmY3FjdHgsIDAsIHNpemVvZiAoIGNxY3R4ICkgKTsKKwlNTFhfRklMTF8xICggJmNxY3R4LCAwLCBzdCwgMHhhIC8qICJFdmVudCBmaXJlZCIgKi8gKTsKKwlNTFhfRklMTF8xICggJmNxY3R4LCAyLCBzdGFydF9hZGRyZXNzX2wsCisJCSAgICAgdmlydF90b19idXMgKCBhcmJlbF9jcS0+Y3FlICkgKTsKKwlNTFhfRklMTF8yICggJmNxY3R4LCAzLAorCQkgICAgIHVzcl9wYWdlLCBhcmJlbC0+bGltaXRzLnJlc2VydmVkX3VhcnMsCisJCSAgICAgbG9nX2NxX3NpemUsIGZscyAoIGNxLT5udW1fY3FlcyAtIDEgKSApOworCU1MWF9GSUxMXzEgKCAmY3FjdHgsIDUsIGNfZXFuLCBBUkJFTF9OT19FUSApOworCU1MWF9GSUxMXzEgKCAmY3FjdHgsIDYsIHBkLCBBUkJFTF9HTE9CQUxfUEQgKTsKKwlNTFhfRklMTF8xICggJmNxY3R4LCA3LCBsX2tleSwgYXJiZWwtPnJlc2VydmVkX2xrZXkgKTsKKwlNTFhfRklMTF8xICggJmNxY3R4LCAxMiwgY3FuLCBjcS0+Y3FuICk7CisJTUxYX0ZJTExfMSAoICZjcWN0eCwgMTMsCisJCSAgICAgY3FfY2lfZGJfcmVjb3JkLCBhcmJlbF9jcS0+Y2lfZG9vcmJlbGxfaWR4ICk7CisJTUxYX0ZJTExfMSAoICZjcWN0eCwgMTQsCisJCSAgICAgY3Ffc3RhdGVfZGJfcmVjb3JkLCBhcmJlbF9jcS0+YXJtX2Rvb3JiZWxsX2lkeCApOworCWlmICggKCByYyA9IGFyYmVsX2NtZF9zdzJod19jcSAoIGFyYmVsLCBjcS0+Y3FuLCAmY3FjdHggKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIFNXMkhXX0NRIGZhaWxlZDogJXNcbiIsCisJCSAgICAgICBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX3N3Mmh3X2NxOworCX0KKworCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIENRTiAlI2x4IHJpbmcgYXQgWyVwLCVwKVxuIiwKKwkgICAgICAgYXJiZWwsIGNxLT5jcW4sIGFyYmVsX2NxLT5jcWUsCisJICAgICAgICggKCAoIHZvaWQgKiApIGFyYmVsX2NxLT5jcWUgKSArIGFyYmVsX2NxLT5jcWVfc2l6ZSApICk7CisJaWJfY3Ffc2V0X2RydmRhdGEgKCBjcSwgYXJiZWxfY3EgKTsKKwlyZXR1cm4gMDsKKworIGVycl9zdzJod19jcToKKwlNTFhfRklMTF8xICggY2lfZGJfcmVjLCAxLCByZXMsIEFSQkVMX1VBUl9SRVNfTk9ORSApOworCU1MWF9GSUxMXzEgKCBhcm1fZGJfcmVjLCAxLCByZXMsIEFSQkVMX1VBUl9SRVNfTk9ORSApOworCWZyZWVfZG1hICggYXJiZWxfY3EtPmNxZSwgYXJiZWxfY3EtPmNxZV9zaXplICk7CisgZXJyX2NxZToKKwlmcmVlICggYXJiZWxfY3EgKTsKKyBlcnJfYXJiZWxfY3E6CisJYXJiZWxfZnJlZV9xbl9vZmZzZXQgKCBhcmJlbC0+Y3FfaW51c2UsIGNxbl9vZmZzZXQgKTsKKyBlcnJfY3FuX29mZnNldDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogRGVzdHJveSBjb21wbGV0aW9uIHF1ZXVlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBjcQkJQ29tcGxldGlvbiBxdWV1ZQorICovCitzdGF0aWMgdm9pZCBhcmJlbF9kZXN0cm95X2NxICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICAgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGFyYmVsX2NvbXBsZXRpb25fcXVldWUgKmFyYmVsX2NxID0gaWJfY3FfZ2V0X2RydmRhdGEgKCBjcSApOworCXN0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3F1ZXVlX2NvbnRleHQgY3FjdHg7CisJc3RydWN0IGFyYmVscHJtX2NxX2NpX2RiX3JlY29yZCAqY2lfZGJfcmVjOworCXN0cnVjdCBhcmJlbHBybV9jcV9hcm1fZGJfcmVjb3JkICphcm1fZGJfcmVjOworCWludCBjcW5fb2Zmc2V0OworCWludCByYzsKKworCS8qIFRha2Ugb3duZXJzaGlwIGJhY2sgZnJvbSBoYXJkd2FyZSAqLworCWlmICggKCByYyA9IGFyYmVsX2NtZF9odzJzd19jcSAoIGFyYmVsLCBjcS0+Y3FuLCAmY3FjdHggKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIEZBVEFMIEhXMlNXX0NRIGZhaWxlZCBvbiBDUU4gJSNseDogIgorCQkgICAgICAgIiVzXG4iLCBhcmJlbCwgY3EtPmNxbiwgc3RyZXJyb3IgKCByYyApICk7CisJCS8qIExlYWsgbWVtb3J5IGFuZCByZXR1cm47IGF0IGxlYXN0IHdlIGF2b2lkIGNvcnJ1cHRpb24gKi8KKwkJcmV0dXJuOworCX0KKworCS8qIENsZWFyIGRvb3JiZWxsIHJlY29yZHMgKi8KKwljaV9kYl9yZWMgPSAmYXJiZWwtPmRiX3JlY1thcmJlbF9jcS0+Y2lfZG9vcmJlbGxfaWR4XS5jcV9jaTsKKwlhcm1fZGJfcmVjID0gJmFyYmVsLT5kYl9yZWNbYXJiZWxfY3EtPmFybV9kb29yYmVsbF9pZHhdLmNxX2FybTsKKwlNTFhfRklMTF8xICggY2lfZGJfcmVjLCAxLCByZXMsIEFSQkVMX1VBUl9SRVNfTk9ORSApOworCU1MWF9GSUxMXzEgKCBhcm1fZGJfcmVjLCAxLCByZXMsIEFSQkVMX1VBUl9SRVNfTk9ORSApOworCisJLyogRnJlZSBtZW1vcnkgKi8KKwlmcmVlX2RtYSAoIGFyYmVsX2NxLT5jcWUsIGFyYmVsX2NxLT5jcWVfc2l6ZSApOworCWZyZWUgKCBhcmJlbF9jcSApOworCisJLyogTWFyayBxdWV1ZSBudW1iZXIgYXMgZnJlZSAqLworCWNxbl9vZmZzZXQgPSAoIGNxLT5jcW4gLSBhcmJlbC0+bGltaXRzLnJlc2VydmVkX2NxcyApOworCWFyYmVsX2ZyZWVfcW5fb2Zmc2V0ICggYXJiZWwtPmNxX2ludXNlLCBjcW5fb2Zmc2V0ICk7CisKKwlpYl9jcV9zZXRfZHJ2ZGF0YSAoIGNxLCBOVUxMICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBRdWV1ZSBwYWlyIG9wZXJhdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBDcmVhdGUgc2VuZCB3b3JrIHF1ZXVlCisgKgorICogQHYgYXJiZWxfc2VuZF93cQlTZW5kIHdvcmsgcXVldWUKKyAqIEB2IG51bV93cWVzCQlOdW1iZXIgb2Ygd29yayBxdWV1ZSBlbnRyaWVzCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcmJlbF9jcmVhdGVfc2VuZF93cSAoIHN0cnVjdCBhcmJlbF9zZW5kX3dvcmtfcXVldWUgKmFyYmVsX3NlbmRfd3EsCisJCQkJICB1bnNpZ25lZCBpbnQgbnVtX3dxZXMgKSB7CisJc3RydWN0IGFyYmVscHJtX3VkX3NlbmRfd3FlICp3cWU7CisJc3RydWN0IGFyYmVscHJtX3VkX3NlbmRfd3FlICpuZXh0X3dxZTsKKwl1bnNpZ25lZCBpbnQgd3FlX2lkeF9tYXNrOworCXVuc2lnbmVkIGludCBpOworCisJLyogQWxsb2NhdGUgd29yayBxdWV1ZSAqLworCWFyYmVsX3NlbmRfd3EtPndxZV9zaXplID0gKCBudW1fd3FlcyAqCisJCQkJICAgIHNpemVvZiAoIGFyYmVsX3NlbmRfd3EtPndxZVswXSApICk7CisJYXJiZWxfc2VuZF93cS0+d3FlID0gbWFsbG9jX2RtYSAoIGFyYmVsX3NlbmRfd3EtPndxZV9zaXplLAorCQkJCQkgIHNpemVvZiAoIGFyYmVsX3NlbmRfd3EtPndxZVswXSApICk7CisJaWYgKCAhIGFyYmVsX3NlbmRfd3EtPndxZSApCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldCAoIGFyYmVsX3NlbmRfd3EtPndxZSwgMCwgYXJiZWxfc2VuZF93cS0+d3FlX3NpemUgKTsKKworCS8qIExpbmsgd29yayBxdWV1ZSBlbnRyaWVzICovCisJd3FlX2lkeF9tYXNrID0gKCBudW1fd3FlcyAtIDEgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBudW1fd3FlcyA7IGkrKyApIHsKKwkJd3FlID0gJmFyYmVsX3NlbmRfd3EtPndxZVtpXS51ZDsKKwkJbmV4dF93cWUgPSAmYXJiZWxfc2VuZF93cS0+d3FlWyAoIGkgKyAxICkgJiB3cWVfaWR4X21hc2sgXS51ZDsKKwkJTUxYX0ZJTExfMSAoICZ3cWUtPm5leHQsIDAsIG5kYV8zMV82LAorCQkJICAgICAoIHZpcnRfdG9fYnVzICggbmV4dF93cWUgKSA+PiA2ICkgKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ3JlYXRlIHJlY2VpdmUgd29yayBxdWV1ZQorICoKKyAqIEB2IGFyYmVsX3JlY3Zfd3EJUmVjZWl2ZSB3b3JrIHF1ZXVlCisgKiBAdiBudW1fd3FlcwkJTnVtYmVyIG9mIHdvcmsgcXVldWUgZW50cmllcworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYXJiZWxfY3JlYXRlX3JlY3Zfd3EgKCBzdHJ1Y3QgYXJiZWxfcmVjdl93b3JrX3F1ZXVlICphcmJlbF9yZWN2X3dxLAorCQkJCSAgdW5zaWduZWQgaW50IG51bV93cWVzICkgeworCXN0cnVjdCBhcmJlbHBybV9yZWN2X3dxZSAqd3FlOworCXN0cnVjdCBhcmJlbHBybV9yZWN2X3dxZSAqbmV4dF93cWU7CisJdW5zaWduZWQgaW50IHdxZV9pZHhfbWFzazsKKwlzaXplX3QgbmRzOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBqOworCisJLyogQWxsb2NhdGUgd29yayBxdWV1ZSAqLworCWFyYmVsX3JlY3Zfd3EtPndxZV9zaXplID0gKCBudW1fd3FlcyAqCisJCQkJICAgIHNpemVvZiAoIGFyYmVsX3JlY3Zfd3EtPndxZVswXSApICk7CisJYXJiZWxfcmVjdl93cS0+d3FlID0gbWFsbG9jX2RtYSAoIGFyYmVsX3JlY3Zfd3EtPndxZV9zaXplLAorCQkJCQkgIHNpemVvZiAoIGFyYmVsX3JlY3Zfd3EtPndxZVswXSApICk7CisJaWYgKCAhIGFyYmVsX3JlY3Zfd3EtPndxZSApCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldCAoIGFyYmVsX3JlY3Zfd3EtPndxZSwgMCwgYXJiZWxfcmVjdl93cS0+d3FlX3NpemUgKTsKKworCS8qIExpbmsgd29yayBxdWV1ZSBlbnRyaWVzICovCisJd3FlX2lkeF9tYXNrID0gKCBudW1fd3FlcyAtIDEgKTsKKwluZHMgPSAoICggb2Zmc2V0b2YgKCB0eXBlb2YgKCAqd3FlICksIGRhdGEgKSArCisJCSAgc2l6ZW9mICggd3FlLT5kYXRhWzBdICkgKSA+PiA0ICk7CisJZm9yICggaSA9IDAgOyBpIDwgbnVtX3dxZXMgOyBpKysgKSB7CisJCXdxZSA9ICZhcmJlbF9yZWN2X3dxLT53cWVbaV0ucmVjdjsKKwkJbmV4dF93cWUgPSAmYXJiZWxfcmVjdl93cS0+d3FlWyggaSArIDEgKSAmIHdxZV9pZHhfbWFza10ucmVjdjsKKwkJTUxYX0ZJTExfMSAoICZ3cWUtPm5leHQsIDAsIG5kYV8zMV82LAorCQkJICAgICAoIHZpcnRfdG9fYnVzICggbmV4dF93cWUgKSA+PiA2ICkgKTsKKwkJTUxYX0ZJTExfMSAoICZ3cWUtPm5leHQsIDEsIG5kcywgKCBzaXplb2YgKCAqd3FlICkgLyAxNiApICk7CisJCWZvciAoIGogPSAwIDsgKCAoICggdm9pZCAqICkgJndxZS0+ZGF0YVtqXSApIDwKKwkJCQkoICggdm9pZCAqICkgKCB3cWUgKyAxICkgKSApIDsgaisrICkgeworCQkJTUxYX0ZJTExfMSAoICZ3cWUtPmRhdGFbal0sIDEsCisJCQkJICAgICBsX2tleSwgQVJCRUxfSU5WQUxJRF9MS0VZICk7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ3JlYXRlIHF1ZXVlIHBhaXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcmJlbF9jcmVhdGVfcXAgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGFyYmVsX3F1ZXVlX3BhaXIgKmFyYmVsX3FwOworCXN0cnVjdCBhcmJlbHBybV9xcF9lZV9zdGF0ZV90cmFuc2l0aW9ucyBxcGN0eDsKKwlzdHJ1Y3QgYXJiZWxwcm1fcXBfZGJfcmVjb3JkICpzZW5kX2RiX3JlYzsKKwlzdHJ1Y3QgYXJiZWxwcm1fcXBfZGJfcmVjb3JkICpyZWN2X2RiX3JlYzsKKwlpbnQgcXBuX29mZnNldDsKKwlpbnQgcmM7CisKKwkvKiBGaW5kIGEgZnJlZSBxdWV1ZSBwYWlyIG51bWJlciAqLworCXFwbl9vZmZzZXQgPSBhcmJlbF9hbGxvY19xbl9vZmZzZXQgKCBhcmJlbC0+cXBfaW51c2UsIEFSQkVMX01BWF9RUFMgKTsKKwlpZiAoIHFwbl9vZmZzZXQgPCAwICkgeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBvdXQgb2YgcXVldWUgcGFpcnNcbiIsIGFyYmVsICk7CisJCXJjID0gcXBuX29mZnNldDsKKwkJZ290byBlcnJfcXBuX29mZnNldDsKKwl9CisJcXAtPnFwbiA9ICggQVJCRUxfUVBOX0JBU0UgKyBhcmJlbC0+bGltaXRzLnJlc2VydmVkX3FwcyArIHFwbl9vZmZzZXQgKTsKKworCS8qIEFsbG9jYXRlIGNvbnRyb2wgc3RydWN0dXJlcyAqLworCWFyYmVsX3FwID0gemFsbG9jICggc2l6ZW9mICggKmFyYmVsX3FwICkgKTsKKwlpZiAoICEgYXJiZWxfcXAgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfYXJiZWxfcXA7CisJfQorCWFyYmVsX3FwLT5zZW5kLmRvb3JiZWxsX2lkeCA9IGFyYmVsX3NlbmRfZG9vcmJlbGxfaWR4ICggcXBuX29mZnNldCApOworCWFyYmVsX3FwLT5yZWN2LmRvb3JiZWxsX2lkeCA9IGFyYmVsX3JlY3ZfZG9vcmJlbGxfaWR4ICggcXBuX29mZnNldCApOworCisJLyogQ3JlYXRlIHNlbmQgYW5kIHJlY2VpdmUgd29yayBxdWV1ZXMgKi8KKwlpZiAoICggcmMgPSBhcmJlbF9jcmVhdGVfc2VuZF93cSAoICZhcmJlbF9xcC0+c2VuZCwKKwkJCQkJICAgcXAtPnNlbmQubnVtX3dxZXMgKSApICE9IDAgKQorCQlnb3RvIGVycl9jcmVhdGVfc2VuZF93cTsKKwlpZiAoICggcmMgPSBhcmJlbF9jcmVhdGVfcmVjdl93cSAoICZhcmJlbF9xcC0+cmVjdiwKKwkJCQkJICAgcXAtPnJlY3YubnVtX3dxZXMgKSApICE9IDAgKQorCQlnb3RvIGVycl9jcmVhdGVfcmVjdl93cTsKKworCS8qIEluaXRpYWxpc2UgZG9vcmJlbGwgcmVjb3JkcyAqLworCXNlbmRfZGJfcmVjID0gJmFyYmVsLT5kYl9yZWNbYXJiZWxfcXAtPnNlbmQuZG9vcmJlbGxfaWR4XS5xcDsKKwlNTFhfRklMTF8xICggc2VuZF9kYl9yZWMsIDAsIGNvdW50ZXIsIDAgKTsKKwlNTFhfRklMTF8yICggc2VuZF9kYl9yZWMsIDEsCisJCSAgICAgcmVzLCBBUkJFTF9VQVJfUkVTX1NRLAorCQkgICAgIHFwX251bWJlciwgcXAtPnFwbiApOworCXJlY3ZfZGJfcmVjID0gJmFyYmVsLT5kYl9yZWNbYXJiZWxfcXAtPnJlY3YuZG9vcmJlbGxfaWR4XS5xcDsKKwlNTFhfRklMTF8xICggcmVjdl9kYl9yZWMsIDAsIGNvdW50ZXIsIDAgKTsKKwlNTFhfRklMTF8yICggcmVjdl9kYl9yZWMsIDEsCisJCSAgICAgcmVzLCBBUkJFTF9VQVJfUkVTX1JRLAorCQkgICAgIHFwX251bWJlciwgcXAtPnFwbiApOworCisJLyogSGFuZCBxdWV1ZSBvdmVyIHRvIGhhcmR3YXJlICovCisJbWVtc2V0ICggJnFwY3R4LCAwLCBzaXplb2YgKCBxcGN0eCApICk7CisJTUxYX0ZJTExfMyAoICZxcGN0eCwgMiwKKwkJICAgICBxcGNfZWVjX2RhdGEuZGUsIDEsCisJCSAgICAgcXBjX2VlY19kYXRhLnBtX3N0YXRlLCAweDAzIC8qIEFsd2F5cyAweDAzIGZvciBVRCAqLywKKwkJICAgICBxcGNfZWVjX2RhdGEuc3QsIEFSQkVMX1NUX1VEICk7CisJTUxYX0ZJTExfNiAoICZxcGN0eCwgNCwKKwkJICAgICBxcGNfZWVjX2RhdGEubXR1LCBBUkJFTF9NVFVfMjA0OCwKKwkJICAgICBxcGNfZWVjX2RhdGEubXNnX21heCwgMTEgLyogMl4xMSA9IDIwNDggKi8sCisJCSAgICAgcXBjX2VlY19kYXRhLmxvZ19ycV9zaXplLCBmbHMgKCBxcC0+cmVjdi5udW1fd3FlcyAtIDEgKSwKKwkJICAgICBxcGNfZWVjX2RhdGEubG9nX3JxX3N0cmlkZSwKKwkJICAgICAoIGZscyAoIHNpemVvZiAoIGFyYmVsX3FwLT5yZWN2LndxZVswXSApIC0gMSApIC0gNCApLAorCQkgICAgIHFwY19lZWNfZGF0YS5sb2dfc3Ffc2l6ZSwgZmxzICggcXAtPnNlbmQubnVtX3dxZXMgLSAxICksCisJCSAgICAgcXBjX2VlY19kYXRhLmxvZ19zcV9zdHJpZGUsCisJCSAgICAgKCBmbHMgKCBzaXplb2YgKCBhcmJlbF9xcC0+c2VuZC53cWVbMF0gKSAtIDEgKSAtIDQgKSApOworCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDUsCisJCSAgICAgcXBjX2VlY19kYXRhLnVzcl9wYWdlLCBhcmJlbC0+bGltaXRzLnJlc2VydmVkX3VhcnMgKTsKKwlNTFhfRklMTF8xICggJnFwY3R4LCAxMCwgcXBjX2VlY19kYXRhLnByaW1hcnlfYWRkcmVzc19wYXRoLnBvcnRfbnVtYmVyLAorCQkgICAgIGliZGV2LT5wb3J0ICk7CisJTUxYX0ZJTExfMSAoICZxcGN0eCwgMjcsIHFwY19lZWNfZGF0YS5wZCwgQVJCRUxfR0xPQkFMX1BEICk7CisJTUxYX0ZJTExfMSAoICZxcGN0eCwgMjksIHFwY19lZWNfZGF0YS53cWVfbGtleSwgYXJiZWwtPnJlc2VydmVkX2xrZXkgKTsKKwlNTFhfRklMTF8xICggJnFwY3R4LCAzMCwgcXBjX2VlY19kYXRhLnNzYywgMSApOworCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDMzLCBxcGNfZWVjX2RhdGEuY3FuX3NuZCwgcXAtPnNlbmQuY3EtPmNxbiApOworCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDM0LCBxcGNfZWVjX2RhdGEuc25kX3dxZV9iYXNlX2Fkcl9sLAorCQkgICAgICggdmlydF90b19idXMgKCBhcmJlbF9xcC0+c2VuZC53cWUgKSA+PiA2ICkgKTsKKwlNTFhfRklMTF8xICggJnFwY3R4LCAzNSwgcXBjX2VlY19kYXRhLnNuZF9kYl9yZWNvcmRfaW5kZXgsCisJCSAgICAgYXJiZWxfcXAtPnNlbmQuZG9vcmJlbGxfaWR4ICk7CisJTUxYX0ZJTExfMSAoICZxcGN0eCwgMzgsIHFwY19lZWNfZGF0YS5yc2MsIDEgKTsKKwlNTFhfRklMTF8xICggJnFwY3R4LCA0MSwgcXBjX2VlY19kYXRhLmNxbl9yY3YsIHFwLT5yZWN2LmNxLT5jcW4gKTsKKwlNTFhfRklMTF8xICggJnFwY3R4LCA0MiwgcXBjX2VlY19kYXRhLnJjdl93cWVfYmFzZV9hZHJfbCwKKwkJICAgICAoIHZpcnRfdG9fYnVzICggYXJiZWxfcXAtPnJlY3Yud3FlICkgPj4gNiApICk7CisJTUxYX0ZJTExfMSAoICZxcGN0eCwgNDMsIHFwY19lZWNfZGF0YS5yY3ZfZGJfcmVjb3JkX2luZGV4LAorCQkgICAgIGFyYmVsX3FwLT5yZWN2LmRvb3JiZWxsX2lkeCApOworCWlmICggKCByYyA9IGFyYmVsX2NtZF9yc3QyaW5pdF9xcGVlICggYXJiZWwsIHFwLT5xcG4sICZxcGN0eCApKSAhPSAwICl7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIFJTVDJJTklUX1FQRUUgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfcnN0MmluaXRfcXBlZTsKKwl9CisJbWVtc2V0ICggJnFwY3R4LCAwLCBzaXplb2YgKCBxcGN0eCApICk7CisJTUxYX0ZJTExfMiAoICZxcGN0eCwgNCwKKwkJICAgICBxcGNfZWVjX2RhdGEubXR1LCBBUkJFTF9NVFVfMjA0OCwKKwkJICAgICBxcGNfZWVjX2RhdGEubXNnX21heCwgMTEgLyogMl4xMSA9IDIwNDggKi8gKTsKKwlpZiAoICggcmMgPSBhcmJlbF9jbWRfaW5pdDJydHJfcXBlZSAoIGFyYmVsLCBxcC0+cXBuLCAmcXBjdHggKSkgIT0gMCApeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBJTklUMlJUUl9RUEVFIGZhaWxlZDogJXNcbiIsCisJCSAgICAgICBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX2luaXQycnRyX3FwZWU7CisJfQorCW1lbXNldCAoICZxcGN0eCwgMCwgc2l6ZW9mICggcXBjdHggKSApOworCWlmICggKCByYyA9IGFyYmVsX2NtZF9ydHIycnRzX3FwZWUgKCBhcmJlbCwgcXAtPnFwbiwgJnFwY3R4ICkgKSAhPSAwICl7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIFJUUjJSVFNfUVBFRSBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICAgYXJiZWwsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9ydHIycnRzX3FwZWU7CisJfQorCisJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgUVBOICUjbHggc2VuZCByaW5nIGF0IFslcCwlcClcbiIsCisJICAgICAgIGFyYmVsLCBxcC0+cXBuLCBhcmJlbF9xcC0+c2VuZC53cWUsCisJICAgICAgICggKCAodm9pZCAqKSBhcmJlbF9xcC0+c2VuZC53cWUgKSArIGFyYmVsX3FwLT5zZW5kLndxZV9zaXplICkgKTsKKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBRUE4gJSNseCByZWNlaXZlIHJpbmcgYXQgWyVwLCVwKVxuIiwKKwkgICAgICAgYXJiZWwsIHFwLT5xcG4sIGFyYmVsX3FwLT5yZWN2LndxZSwKKwkgICAgICAgKCAoICh2b2lkICopIGFyYmVsX3FwLT5yZWN2LndxZSApICsgYXJiZWxfcXAtPnJlY3Yud3FlX3NpemUgKSApOworCWliX3FwX3NldF9kcnZkYXRhICggcXAsIGFyYmVsX3FwICk7CisJcmV0dXJuIDA7CisKKyBlcnJfcnRyMnJ0c19xcGVlOgorIGVycl9pbml0MnJ0cl9xcGVlOgorCWFyYmVsX2NtZF8ycnN0X3FwZWUgKCBhcmJlbCwgcXAtPnFwbiApOworIGVycl9yc3QyaW5pdF9xcGVlOgorCU1MWF9GSUxMXzEgKCBzZW5kX2RiX3JlYywgMSwgcmVzLCBBUkJFTF9VQVJfUkVTX05PTkUgKTsKKwlNTFhfRklMTF8xICggcmVjdl9kYl9yZWMsIDEsIHJlcywgQVJCRUxfVUFSX1JFU19OT05FICk7CisJZnJlZV9kbWEgKCBhcmJlbF9xcC0+cmVjdi53cWUsIGFyYmVsX3FwLT5yZWN2LndxZV9zaXplICk7CisgZXJyX2NyZWF0ZV9yZWN2X3dxOgorCWZyZWVfZG1hICggYXJiZWxfcXAtPnNlbmQud3FlLCBhcmJlbF9xcC0+c2VuZC53cWVfc2l6ZSApOworIGVycl9jcmVhdGVfc2VuZF93cToKKwlmcmVlICggYXJiZWxfcXAgKTsKKyBlcnJfYXJiZWxfcXA6CisJYXJiZWxfZnJlZV9xbl9vZmZzZXQgKCBhcmJlbC0+cXBfaW51c2UsIHFwbl9vZmZzZXQgKTsKKyBlcnJfcXBuX29mZnNldDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogTW9kaWZ5IHF1ZXVlIHBhaXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcmJlbF9tb2RpZnlfcXAgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGFyYmVscHJtX3FwX2VlX3N0YXRlX3RyYW5zaXRpb25zIHFwY3R4OworCWludCByYzsKKworCS8qIElzc3VlIFJUUzJSVFNfUVAgKi8KKwltZW1zZXQgKCAmcXBjdHgsIDAsIHNpemVvZiAoIHFwY3R4ICkgKTsKKwlNTFhfRklMTF8xICggJnFwY3R4LCAwLCBvcHRfcGFyYW1fbWFzaywgQVJCRUxfUVBFRV9PUFRfUEFSQU1fUUtFWSApOworCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDQ0LCBxcGNfZWVjX2RhdGEucV9rZXksIHFwLT5xa2V5ICk7CisJaWYgKCAoIHJjID0gYXJiZWxfY21kX3J0czJydHNfcXAgKCBhcmJlbCwgcXAtPnFwbiwgJnFwY3R4ICkgKSAhPSAwICl7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIFJUUzJSVFNfUVAgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIERlc3Ryb3kgcXVldWUgcGFpcgorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqLworc3RhdGljIHZvaWQgYXJiZWxfZGVzdHJveV9xcCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCApIHsKKwlzdHJ1Y3QgYXJiZWwgKmFyYmVsID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0cnVjdCBhcmJlbF9xdWV1ZV9wYWlyICphcmJlbF9xcCA9IGliX3FwX2dldF9kcnZkYXRhICggcXAgKTsKKwlzdHJ1Y3QgYXJiZWxwcm1fcXBfZGJfcmVjb3JkICpzZW5kX2RiX3JlYzsKKwlzdHJ1Y3QgYXJiZWxwcm1fcXBfZGJfcmVjb3JkICpyZWN2X2RiX3JlYzsKKwlpbnQgcXBuX29mZnNldDsKKwlpbnQgcmM7CisKKwkvKiBUYWtlIG93bmVyc2hpcCBiYWNrIGZyb20gaGFyZHdhcmUgKi8KKwlpZiAoICggcmMgPSBhcmJlbF9jbWRfMnJzdF9xcGVlICggYXJiZWwsIHFwLT5xcG4gKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIEZBVEFMIDJSU1RfUVBFRSBmYWlsZWQgb24gUVBOICUjbHg6ICIKKwkJICAgICAgICIlc1xuIiwgYXJiZWwsIHFwLT5xcG4sIHN0cmVycm9yICggcmMgKSApOworCQkvKiBMZWFrIG1lbW9yeSBhbmQgcmV0dXJuOyBhdCBsZWFzdCB3ZSBhdm9pZCBjb3JydXB0aW9uICovCisJCXJldHVybjsKKwl9CisKKwkvKiBDbGVhciBkb29yYmVsbCByZWNvcmRzICovCisJc2VuZF9kYl9yZWMgPSAmYXJiZWwtPmRiX3JlY1thcmJlbF9xcC0+c2VuZC5kb29yYmVsbF9pZHhdLnFwOworCXJlY3ZfZGJfcmVjID0gJmFyYmVsLT5kYl9yZWNbYXJiZWxfcXAtPnJlY3YuZG9vcmJlbGxfaWR4XS5xcDsKKwlNTFhfRklMTF8xICggc2VuZF9kYl9yZWMsIDEsIHJlcywgQVJCRUxfVUFSX1JFU19OT05FICk7CisJTUxYX0ZJTExfMSAoIHJlY3ZfZGJfcmVjLCAxLCByZXMsIEFSQkVMX1VBUl9SRVNfTk9ORSApOworCisJLyogRnJlZSBtZW1vcnkgKi8KKwlmcmVlX2RtYSAoIGFyYmVsX3FwLT5zZW5kLndxZSwgYXJiZWxfcXAtPnNlbmQud3FlX3NpemUgKTsKKwlmcmVlX2RtYSAoIGFyYmVsX3FwLT5yZWN2LndxZSwgYXJiZWxfcXAtPnJlY3Yud3FlX3NpemUgKTsKKwlmcmVlICggYXJiZWxfcXAgKTsKKworCS8qIE1hcmsgcXVldWUgbnVtYmVyIGFzIGZyZWUgKi8KKwlxcG5fb2Zmc2V0ID0gKCBxcC0+cXBuIC0gQVJCRUxfUVBOX0JBU0UgLSBhcmJlbC0+bGltaXRzLnJlc2VydmVkX3FwcyApOworCWFyYmVsX2ZyZWVfcW5fb2Zmc2V0ICggYXJiZWwtPnFwX2ludXNlLCBxcG5fb2Zmc2V0ICk7CisKKwlpYl9xcF9zZXRfZHJ2ZGF0YSAoIHFwLCBOVUxMICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBXb3JrIHJlcXVlc3Qgb3BlcmF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFJpbmcgZG9vcmJlbGwgcmVnaXN0ZXIgaW4gVUFSCisgKgorICogQHYgYXJiZWwJCUFyYmVsIGRldmljZQorICogQHYgZGJfcmVnCQlEb29yYmVsbCByZWdpc3RlciBzdHJ1Y3R1cmUKKyAqIEB2IG9mZnNldAkJQWRkcmVzcyBvZiBkb29yYmVsbAorICovCitzdGF0aWMgdm9pZCBhcmJlbF9yaW5nX2Rvb3JiZWxsICggc3RydWN0IGFyYmVsICphcmJlbCwKKwkJCQkgIHVuaW9uIGFyYmVscHJtX2Rvb3JiZWxsX3JlZ2lzdGVyICpkYl9yZWcsCisJCQkJICB1bnNpZ25lZCBpbnQgb2Zmc2V0ICkgeworCisJREJHQzIgKCBhcmJlbCwgIkFyYmVsICVwIHJpbmdpbmcgZG9vcmJlbGwgJTA4eDolMDh4IGF0ICVseFxuIiwKKwkJYXJiZWwsIGRiX3JlZy0+ZHdvcmRbMF0sIGRiX3JlZy0+ZHdvcmRbMV0sCisJCXZpcnRfdG9fcGh5cyAoIGFyYmVsLT51YXIgKyBvZmZzZXQgKSApOworCisJYmFycmllcigpOworCXdyaXRlbCAoIGRiX3JlZy0+ZHdvcmRbMF0sICggYXJiZWwtPnVhciArIG9mZnNldCArIDAgKSApOworCWJhcnJpZXIoKTsKKwl3cml0ZWwgKCBkYl9yZWctPmR3b3JkWzFdLCAoIGFyYmVsLT51YXIgKyBvZmZzZXQgKyA0ICkgKTsKK30KKworLyoqIEdJRCB1c2VkIGZvciBHSUQtbGVzcyBzZW5kIHdvcmsgcXVldWUgZW50cmllcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpYl9naWQgYXJiZWxfbm9fZ2lkID0geworCXsgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwIH0gfQorfTsKKworLyoqCisgKiBQb3N0IHNlbmQgd29yayBxdWV1ZSBlbnRyeQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGF2CQlBZGRyZXNzIHZlY3RvcgorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGFyYmVsX3Bvc3Rfc2VuZCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkgICAgIHN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciAqYXYsCisJCQkgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGFyYmVsX3F1ZXVlX3BhaXIgKmFyYmVsX3FwID0gaWJfcXBfZ2V0X2RydmRhdGEgKCBxcCApOworCXN0cnVjdCBpYl93b3JrX3F1ZXVlICp3cSA9ICZxcC0+c2VuZDsKKwlzdHJ1Y3QgYXJiZWxfc2VuZF93b3JrX3F1ZXVlICphcmJlbF9zZW5kX3dxID0gJmFyYmVsX3FwLT5zZW5kOworCXN0cnVjdCBhcmJlbHBybV91ZF9zZW5kX3dxZSAqcHJldl93cWU7CisJc3RydWN0IGFyYmVscHJtX3VkX3NlbmRfd3FlICp3cWU7CisJc3RydWN0IGFyYmVscHJtX3FwX2RiX3JlY29yZCAqcXBfZGJfcmVjOworCXVuaW9uIGFyYmVscHJtX2Rvb3JiZWxsX3JlZ2lzdGVyIGRiX3JlZzsKKwljb25zdCBzdHJ1Y3QgaWJfZ2lkICpnaWQ7CisJdW5zaWduZWQgaW50IHdxZV9pZHhfbWFzazsKKwlzaXplX3QgbmRzOworCisJLyogQWxsb2NhdGUgd29yayBxdWV1ZSBlbnRyeSAqLworCXdxZV9pZHhfbWFzayA9ICggd3EtPm51bV93cWVzIC0gMSApOworCWlmICggd3EtPmlvYnVmc1t3cS0+bmV4dF9pZHggJiB3cWVfaWR4X21hc2tdICkgeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBzZW5kIHF1ZXVlIGZ1bGwiLCBhcmJlbCApOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCXdxLT5pb2J1ZnNbd3EtPm5leHRfaWR4ICYgd3FlX2lkeF9tYXNrXSA9IGlvYnVmOworCXByZXZfd3FlID0gJmFyYmVsX3NlbmRfd3EtPndxZVsod3EtPm5leHRfaWR4IC0gMSkgJiB3cWVfaWR4X21hc2tdLnVkOworCXdxZSA9ICZhcmJlbF9zZW5kX3dxLT53cWVbd3EtPm5leHRfaWR4ICYgd3FlX2lkeF9tYXNrXS51ZDsKKworCS8qIENvbnN0cnVjdCB3b3JrIHF1ZXVlIGVudHJ5ICovCisJTUxYX0ZJTExfMSAoICZ3cWUtPm5leHQsIDEsIGFsd2F5czEsIDEgKTsKKwltZW1zZXQgKCAmd3FlLT5jdHJsLCAwLCBzaXplb2YgKCB3cWUtPmN0cmwgKSApOworCU1MWF9GSUxMXzEgKCAmd3FlLT5jdHJsLCAwLCBhbHdheXMxLCAxICk7CisJbWVtc2V0ICggJndxZS0+dWQsIDAsIHNpemVvZiAoIHdxZS0+dWQgKSApOworCU1MWF9GSUxMXzIgKCAmd3FlLT51ZCwgMCwKKwkJICAgICB1ZF9hZGRyZXNzX3ZlY3Rvci5wZCwgQVJCRUxfR0xPQkFMX1BELAorCQkgICAgIHVkX2FkZHJlc3NfdmVjdG9yLnBvcnRfbnVtYmVyLCBpYmRldi0+cG9ydCApOworCU1MWF9GSUxMXzIgKCAmd3FlLT51ZCwgMSwKKwkJICAgICB1ZF9hZGRyZXNzX3ZlY3Rvci5ybGlkLCBhdi0+bGlkLAorCQkgICAgIHVkX2FkZHJlc3NfdmVjdG9yLmcsIGF2LT5naWRfcHJlc2VudCApOworCU1MWF9GSUxMXzIgKCAmd3FlLT51ZCwgMiwKKwkJICAgICB1ZF9hZGRyZXNzX3ZlY3Rvci5tYXhfc3RhdF9yYXRlLAorCQkJICggKCBhdi0+cmF0ZSA+PSAzICkgPyAwIDogMSApLAorCQkgICAgIHVkX2FkZHJlc3NfdmVjdG9yLm1zZywgMyApOworCU1MWF9GSUxMXzEgKCAmd3FlLT51ZCwgMywgdWRfYWRkcmVzc192ZWN0b3Iuc2wsIGF2LT5zbCApOworCWdpZCA9ICggYXYtPmdpZF9wcmVzZW50ID8gJmF2LT5naWQgOiAmYXJiZWxfbm9fZ2lkICk7CisJbWVtY3B5ICggJndxZS0+dWQudS5kd29yZHNbNF0sIGdpZCwgc2l6ZW9mICggKmdpZCApICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPnVkLCA4LCBkZXN0aW5hdGlvbl9xcCwgYXYtPnFwbiApOworCU1MWF9GSUxMXzEgKCAmd3FlLT51ZCwgOSwgcV9rZXksIGF2LT5xa2V5ICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPmRhdGFbMF0sIDAsIGJ5dGVfY291bnQsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPmRhdGFbMF0sIDEsIGxfa2V5LCBhcmJlbC0+cmVzZXJ2ZWRfbGtleSApOworCU1MWF9GSUxMXzEgKCAmd3FlLT5kYXRhWzBdLCAzLAorCQkgICAgIGxvY2FsX2FkZHJlc3NfbCwgdmlydF90b19idXMgKCBpb2J1Zi0+ZGF0YSApICk7CisKKwkvKiBVcGRhdGUgcHJldmlvdXMgd29yayBxdWV1ZSBlbnRyeSdzICJuZXh0IiBmaWVsZCAqLworCW5kcyA9ICggKCBvZmZzZXRvZiAoIHR5cGVvZiAoICp3cWUgKSwgZGF0YSApICsKKwkJICBzaXplb2YgKCB3cWUtPmRhdGFbMF0gKSApID4+IDQgKTsKKwlNTFhfU0VUICggJnByZXZfd3FlLT5uZXh0LCBub3Bjb2RlLCBBUkJFTF9PUENPREVfU0VORCApOworCU1MWF9GSUxMXzMgKCAmcHJldl93cWUtPm5leHQsIDEsCisJCSAgICAgbmRzLCBuZHMsCisJCSAgICAgZiwgMSwKKwkJICAgICBhbHdheXMxLCAxICk7CisKKwkvKiBVcGRhdGUgZG9vcmJlbGwgcmVjb3JkICovCisJYmFycmllcigpOworCXFwX2RiX3JlYyA9ICZhcmJlbC0+ZGJfcmVjW2FyYmVsX3NlbmRfd3EtPmRvb3JiZWxsX2lkeF0ucXA7CisJTUxYX0ZJTExfMSAoIHFwX2RiX3JlYywgMCwKKwkJICAgICBjb3VudGVyLCAoICggd3EtPm5leHRfaWR4ICsgMSApICYgMHhmZmZmICkgKTsKKworCS8qIFJpbmcgZG9vcmJlbGwgcmVnaXN0ZXIgKi8KKwlNTFhfRklMTF80ICggJmRiX3JlZy5zZW5kLCAwLAorCQkgICAgIG5vcGNvZGUsIEFSQkVMX09QQ09ERV9TRU5ELAorCQkgICAgIGYsIDEsCisJCSAgICAgd3FlX2NvdW50ZXIsICggd3EtPm5leHRfaWR4ICYgMHhmZmZmICksCisJCSAgICAgd3FlX2NudCwgMSApOworCU1MWF9GSUxMXzIgKCAmZGJfcmVnLnNlbmQsIDEsCisJCSAgICAgbmRzLCBuZHMsCisJCSAgICAgcXBuLCBxcC0+cXBuICk7CisJYXJiZWxfcmluZ19kb29yYmVsbCAoIGFyYmVsLCAmZGJfcmVnLCBBUkJFTF9EQl9QT1NUX1NORF9PRkZTRVQgKTsKKworCS8qIFVwZGF0ZSB3b3JrIHF1ZXVlJ3MgaW5kZXggKi8KKwl3cS0+bmV4dF9pZHgrKzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFBvc3QgcmVjZWl2ZSB3b3JrIHF1ZXVlIGVudHJ5CisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGFyYmVsX3Bvc3RfcmVjdiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGFyYmVsX3F1ZXVlX3BhaXIgKmFyYmVsX3FwID0gaWJfcXBfZ2V0X2RydmRhdGEgKCBxcCApOworCXN0cnVjdCBpYl93b3JrX3F1ZXVlICp3cSA9ICZxcC0+cmVjdjsKKwlzdHJ1Y3QgYXJiZWxfcmVjdl93b3JrX3F1ZXVlICphcmJlbF9yZWN2X3dxID0gJmFyYmVsX3FwLT5yZWN2OworCXN0cnVjdCBhcmJlbHBybV9yZWN2X3dxZSAqd3FlOworCXVuaW9uIGFyYmVscHJtX2Rvb3JiZWxsX3JlY29yZCAqZGJfcmVjOworCXVuc2lnbmVkIGludCB3cWVfaWR4X21hc2s7CisKKwkvKiBBbGxvY2F0ZSB3b3JrIHF1ZXVlIGVudHJ5ICovCisJd3FlX2lkeF9tYXNrID0gKCB3cS0+bnVtX3dxZXMgLSAxICk7CisJaWYgKCB3cS0+aW9idWZzW3dxLT5uZXh0X2lkeCAmIHdxZV9pZHhfbWFza10gKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIHJlY2VpdmUgcXVldWUgZnVsbCIsIGFyYmVsICk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJd3EtPmlvYnVmc1t3cS0+bmV4dF9pZHggJiB3cWVfaWR4X21hc2tdID0gaW9idWY7CisJd3FlID0gJmFyYmVsX3JlY3Zfd3EtPndxZVt3cS0+bmV4dF9pZHggJiB3cWVfaWR4X21hc2tdLnJlY3Y7CisKKwkvKiBDb25zdHJ1Y3Qgd29yayBxdWV1ZSBlbnRyeSAqLworCU1MWF9GSUxMXzEgKCAmd3FlLT5kYXRhWzBdLCAwLCBieXRlX2NvdW50LCBpb2JfdGFpbHJvb20gKCBpb2J1ZiApICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPmRhdGFbMF0sIDEsIGxfa2V5LCBhcmJlbC0+cmVzZXJ2ZWRfbGtleSApOworCU1MWF9GSUxMXzEgKCAmd3FlLT5kYXRhWzBdLCAzLAorCQkgICAgIGxvY2FsX2FkZHJlc3NfbCwgdmlydF90b19idXMgKCBpb2J1Zi0+ZGF0YSApICk7CisKKwkvKiBVcGRhdGUgZG9vcmJlbGwgcmVjb3JkICovCisJYmFycmllcigpOworCWRiX3JlYyA9ICZhcmJlbC0+ZGJfcmVjW2FyYmVsX3JlY3Zfd3EtPmRvb3JiZWxsX2lkeF07CisJTUxYX0ZJTExfMSAoICZkYl9yZWMtPnFwLCAwLAorCQkgICAgIGNvdW50ZXIsICggKCB3cS0+bmV4dF9pZHggKyAxICkgJiAweGZmZmYgKSApOwkKKworCS8qIFVwZGF0ZSB3b3JrIHF1ZXVlJ3MgaW5kZXggKi8KKwl3cS0+bmV4dF9pZHgrKzsKKworCXJldHVybiAwOwkKK30KKworLyoqCisgKiBIYW5kbGUgY29tcGxldGlvbgorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgY3EJCUNvbXBsZXRpb24gcXVldWUKKyAqIEB2IGNxZQkJSGFyZHdhcmUgY29tcGxldGlvbiBxdWV1ZSBlbnRyeQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYXJiZWxfY29tcGxldGUgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3EsCisJCQkgICAgdW5pb24gYXJiZWxwcm1fY29tcGxldGlvbl9lbnRyeSAqY3FlICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGliX3dvcmtfcXVldWUgKndxOworCXN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcDsKKwlzdHJ1Y3QgYXJiZWxfcXVldWVfcGFpciAqYXJiZWxfcXA7CisJc3RydWN0IGFyYmVsX3NlbmRfd29ya19xdWV1ZSAqYXJiZWxfc2VuZF93cTsKKwlzdHJ1Y3QgYXJiZWxfcmVjdl93b3JrX3F1ZXVlICphcmJlbF9yZWN2X3dxOworCXN0cnVjdCBhcmJlbHBybV9yZWN2X3dxZSAqcmVjdl93cWU7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisJc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yIGF2OworCXN0cnVjdCBpYl9nbG9iYWxfcm91dGVfaGVhZGVyICpncmg7CisJdW5zaWduZWQgaW50IG9wY29kZTsKKwl1bnNpZ25lZCBsb25nIHFwbjsKKwlpbnQgaXNfc2VuZDsKKwl1bnNpZ25lZCBsb25nIHdxZV9hZHI7CisJdW5zaWduZWQgaW50IHdxZV9pZHg7CisJc2l6ZV90IGxlbjsKKwlpbnQgcmMgPSAwOworCisJLyogUGFyc2UgY29tcGxldGlvbiAqLworCXFwbiA9IE1MWF9HRVQgKCAmY3FlLT5ub3JtYWwsIG15X3FwbiApOworCWlzX3NlbmQgPSBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCBzICk7CisJd3FlX2FkciA9ICggTUxYX0dFVCAoICZjcWUtPm5vcm1hbCwgd3FlX2FkciApIDw8IDYgKTsKKwlvcGNvZGUgPSBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCBvcGNvZGUgKTsKKwlpZiAoIG9wY29kZSA+PSBBUkJFTF9PUENPREVfUkVDVl9FUlJPUiApIHsKKwkJLyogInMiIGZpZWxkIGlzIG5vdCB2YWxpZCBmb3IgZXJyb3Igb3Bjb2RlcyAqLworCQlpc19zZW5kID0gKCBvcGNvZGUgPT0gQVJCRUxfT1BDT0RFX1NFTkRfRVJST1IgKTsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgQ1BOICVseCBzeW5kcm9tZSAleCB2ZW5kb3IgJXhcbiIsCisJCSAgICAgICBhcmJlbCwgY3EtPmNxbiwgTUxYX0dFVCAoICZjcWUtPmVycm9yLCBzeW5kcm9tZSApLAorCQkgICAgICAgTUxYX0dFVCAoICZjcWUtPmVycm9yLCB2ZW5kb3JfY29kZSApICk7CisJCXJjID0gLUVJTzsKKwkJLyogRG9uJ3QgcmV0dXJuIGltbWVkaWF0ZWx5OyBwcm9wYWdhdGUgZXJyb3IgdG8gY29tcGxldGVyICovCisJfQorCisJLyogSWRlbnRpZnkgd29yayBxdWV1ZSAqLworCXdxID0gaWJfZmluZF93cSAoIGNxLCBxcG4sIGlzX3NlbmQgKTsKKwlpZiAoICEgd3EgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIENRTiAlbHggdW5rbm93biAlcyBRUE4gJWx4XG4iLAorCQkgICAgICAgYXJiZWwsIGNxLT5jcW4sICggaXNfc2VuZCA/ICJzZW5kIiA6ICJyZWN2IiApLCBxcG4gKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXFwID0gd3EtPnFwOworCWFyYmVsX3FwID0gaWJfcXBfZ2V0X2RydmRhdGEgKCBxcCApOworCWFyYmVsX3NlbmRfd3EgPSAmYXJiZWxfcXAtPnNlbmQ7CisJYXJiZWxfcmVjdl93cSA9ICZhcmJlbF9xcC0+cmVjdjsKKworCS8qIElkZW50aWZ5IHdvcmsgcXVldWUgZW50cnkgaW5kZXggKi8KKwlpZiAoIGlzX3NlbmQgKSB7CisJCXdxZV9pZHggPSAoICggd3FlX2FkciAtIHZpcnRfdG9fYnVzICggYXJiZWxfc2VuZF93cS0+d3FlICkgKSAvCisJCQkgICAgc2l6ZW9mICggYXJiZWxfc2VuZF93cS0+d3FlWzBdICkgKTsKKwkJYXNzZXJ0ICggd3FlX2lkeCA8IHFwLT5zZW5kLm51bV93cWVzICk7CisJfSBlbHNlIHsKKwkJd3FlX2lkeCA9ICggKCB3cWVfYWRyIC0gdmlydF90b19idXMgKCBhcmJlbF9yZWN2X3dxLT53cWUgKSApIC8KKwkJCSAgICBzaXplb2YgKCBhcmJlbF9yZWN2X3dxLT53cWVbMF0gKSApOworCQlhc3NlcnQgKCB3cWVfaWR4IDwgcXAtPnJlY3YubnVtX3dxZXMgKTsKKwl9CisKKwkvKiBJZGVudGlmeSBJL08gYnVmZmVyICovCisJaW9idWYgPSB3cS0+aW9idWZzW3dxZV9pZHhdOworCWlmICggISBpb2J1ZiApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgQ1FOICVseCBRUE4gJWx4IGVtcHR5IFdRRSAleFxuIiwKKwkJICAgICAgIGFyYmVsLCBjcS0+Y3FuLCBxcG4sIHdxZV9pZHggKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXdxLT5pb2J1ZnNbd3FlX2lkeF0gPSBOVUxMOworCisJaWYgKCBpc19zZW5kICkgeworCQkvKiBIYW5kIG9mZiB0byBjb21wbGV0aW9uIGhhbmRsZXIgKi8KKwkJaWJfY29tcGxldGVfc2VuZCAoIGliZGV2LCBxcCwgaW9idWYsIHJjICk7CisJfSBlbHNlIHsKKwkJLyogU2V0IHJlY2VpdmVkIGxlbmd0aCAqLworCQlsZW4gPSBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCBieXRlX2NudCApOworCQlyZWN2X3dxZSA9ICZhcmJlbF9yZWN2X3dxLT53cWVbd3FlX2lkeF0ucmVjdjsKKwkJYXNzZXJ0ICggTUxYX0dFVCAoICZyZWN2X3dxZS0+ZGF0YVswXSwgbG9jYWxfYWRkcmVzc19sICkgPT0KKwkJCSB2aXJ0X3RvX2J1cyAoIGlvYnVmLT5kYXRhICkgKTsKKwkJYXNzZXJ0ICggTUxYX0dFVCAoICZyZWN2X3dxZS0+ZGF0YVswXSwgYnl0ZV9jb3VudCApID09CisJCQkgaW9iX3RhaWxyb29tICggaW9idWYgKSApOworCQlNTFhfRklMTF8xICggJnJlY3Zfd3FlLT5kYXRhWzBdLCAwLCBieXRlX2NvdW50LCAwICk7CisJCU1MWF9GSUxMXzEgKCAmcmVjdl93cWUtPmRhdGFbMF0sIDEsCisJCQkgICAgIGxfa2V5LCBBUkJFTF9JTlZBTElEX0xLRVkgKTsKKwkJYXNzZXJ0ICggbGVuIDw9IGlvYl90YWlscm9vbSAoIGlvYnVmICkgKTsKKwkJaW9iX3B1dCAoIGlvYnVmLCBsZW4gKTsKKwkJYXNzZXJ0ICggaW9iX2xlbiAoIGlvYnVmICkgPj0gc2l6ZW9mICggKmdyaCApICk7CisJCWdyaCA9IGlvYnVmLT5kYXRhOworCQlpb2JfcHVsbCAoIGlvYnVmLCBzaXplb2YgKCAqZ3JoICkgKTsKKwkJLyogQ29uc3RydWN0IGFkZHJlc3MgdmVjdG9yICovCisJCW1lbXNldCAoICZhdiwgMCwgc2l6ZW9mICggYXYgKSApOworCQlhdi5xcG4gPSBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCBycXBuICk7CisJCWF2LmxpZCA9IE1MWF9HRVQgKCAmY3FlLT5ub3JtYWwsIHJsaWQgKTsKKwkJYXYuc2wgPSBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCBzbCApOworCQlhdi5naWRfcHJlc2VudCA9IE1MWF9HRVQgKCAmY3FlLT5ub3JtYWwsIGcgKTsKKwkJbWVtY3B5ICggJmF2LmdpZCwgJmdyaC0+c2dpZCwgc2l6ZW9mICggYXYuZ2lkICkgKTsKKwkJLyogSGFuZCBvZmYgdG8gY29tcGxldGlvbiBoYW5kbGVyICovCisJCWliX2NvbXBsZXRlX3JlY3YgKCBpYmRldiwgcXAsICZhdiwgaW9idWYsIHJjICk7CisJfQorCisJcmV0dXJuIHJjOworfQkJCSAgICAgCisKKy8qKgorICogUG9sbCBjb21wbGV0aW9uIHF1ZXVlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBjcQkJQ29tcGxldGlvbiBxdWV1ZQorICovCitzdGF0aWMgdm9pZCBhcmJlbF9wb2xsX2NxICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGFyYmVsX2NvbXBsZXRpb25fcXVldWUgKmFyYmVsX2NxID0gaWJfY3FfZ2V0X2RydmRhdGEgKCBjcSApOworCXN0cnVjdCBhcmJlbHBybV9jcV9jaV9kYl9yZWNvcmQgKmNpX2RiX3JlYzsKKwl1bmlvbiBhcmJlbHBybV9jb21wbGV0aW9uX2VudHJ5ICpjcWU7CisJdW5zaWduZWQgaW50IGNxZV9pZHhfbWFzazsKKwlpbnQgcmM7CisKKwl3aGlsZSAoIDEgKSB7CisJCS8qIExvb2sgZm9yIGNvbXBsZXRpb24gZW50cnkgKi8KKwkJY3FlX2lkeF9tYXNrID0gKCBjcS0+bnVtX2NxZXMgLSAxICk7CisJCWNxZSA9ICZhcmJlbF9jcS0+Y3FlW2NxLT5uZXh0X2lkeCAmIGNxZV9pZHhfbWFza107CisJCWlmICggTUxYX0dFVCAoICZjcWUtPm5vcm1hbCwgb3duZXIgKSAhPSAwICkgeworCQkJLyogRW50cnkgc3RpbGwgb3duZWQgYnkgaGFyZHdhcmU7IGVuZCBvZiBwb2xsICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIEhhbmRsZSBjb21wbGV0aW9uICovCisJCWlmICggKCByYyA9IGFyYmVsX2NvbXBsZXRlICggaWJkZXYsIGNxLCBjcWUgKSApICE9IDAgKSB7CisJCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBmYWlsZWQgdG8gY29tcGxldGU6ICVzXG4iLAorCQkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCURCR0NfSEQgKCBhcmJlbCwgY3FlLCBzaXplb2YgKCAqY3FlICkgKTsKKwkJfQorCisJCS8qIFJldHVybiBvd25lcnNoaXAgdG8gaGFyZHdhcmUgKi8KKwkJTUxYX0ZJTExfMSAoICZjcWUtPm5vcm1hbCwgNywgb3duZXIsIDEgKTsKKwkJYmFycmllcigpOworCQkvKiBVcGRhdGUgY29tcGxldGlvbiBxdWV1ZSdzIGluZGV4ICovCisJCWNxLT5uZXh0X2lkeCsrOworCQkvKiBVcGRhdGUgZG9vcmJlbGwgcmVjb3JkICovCisJCWNpX2RiX3JlYyA9ICZhcmJlbC0+ZGJfcmVjW2FyYmVsX2NxLT5jaV9kb29yYmVsbF9pZHhdLmNxX2NpOworCQlNTFhfRklMTF8xICggY2lfZGJfcmVjLCAwLAorCQkJICAgICBjb3VudGVyLCAoIGNxLT5uZXh0X2lkeCAmIDB4ZmZmZmZmZmZVTCApICk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXZlbnQgcXVldWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQ3JlYXRlIGV2ZW50IHF1ZXVlCisgKgorICogQHYgYXJiZWwJCUFyYmVsIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYXJiZWxfY3JlYXRlX2VxICggc3RydWN0IGFyYmVsICphcmJlbCApIHsKKwlzdHJ1Y3QgYXJiZWxfZXZlbnRfcXVldWUgKmFyYmVsX2VxID0gJmFyYmVsLT5lcTsKKwlzdHJ1Y3QgYXJiZWxwcm1fZXFjIGVxY3R4OworCXN0cnVjdCBhcmJlbHBybV9ldmVudF9tYXNrIG1hc2s7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjOworCisJLyogU2VsZWN0IGV2ZW50IHF1ZXVlIG51bWJlciAqLworCWFyYmVsX2VxLT5lcW4gPSBhcmJlbC0+bGltaXRzLnJlc2VydmVkX2VxczsKKworCS8qIENhbGN1bGF0ZSBkb29yYmVsbCBhZGRyZXNzICovCisJYXJiZWxfZXEtPmRvb3JiZWxsID0gKCBhcmJlbC0+ZXFfY2lfZG9vcmJlbGxzICsKKwkJCSAgICAgICBBUkJFTF9EQl9FUV9PRkZTRVQgKCBhcmJlbF9lcS0+ZXFuICkgKTsKKworCS8qIEFsbG9jYXRlIGV2ZW50IHF1ZXVlIGl0c2VsZiAqLworCWFyYmVsX2VxLT5lcWVfc2l6ZSA9CisJCSggQVJCRUxfTlVNX0VRRVMgKiBzaXplb2YgKCBhcmJlbF9lcS0+ZXFlWzBdICkgKTsKKwlhcmJlbF9lcS0+ZXFlID0gbWFsbG9jX2RtYSAoIGFyYmVsX2VxLT5lcWVfc2l6ZSwKKwkJCQkgICAgIHNpemVvZiAoIGFyYmVsX2VxLT5lcWVbMF0gKSApOworCWlmICggISBhcmJlbF9lcS0+ZXFlICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2VxZTsKKwl9CisJbWVtc2V0ICggYXJiZWxfZXEtPmVxZSwgMCwgYXJiZWxfZXEtPmVxZV9zaXplICk7CisJZm9yICggaSA9IDAgOyBpIDwgQVJCRUxfTlVNX0VRRVMgOyBpKysgKSB7CisJCU1MWF9GSUxMXzEgKCAmYXJiZWxfZXEtPmVxZVtpXS5nZW5lcmljLCA3LCBvd25lciwgMSApOworCX0KKwliYXJyaWVyKCk7CisKKwkvKiBIYW5kIHF1ZXVlIG92ZXIgdG8gaGFyZHdhcmUgKi8KKwltZW1zZXQgKCAmZXFjdHgsIDAsIHNpemVvZiAoIGVxY3R4ICkgKTsKKwlNTFhfRklMTF8xICggJmVxY3R4LCAwLCBzdCwgMHhhIC8qICJGaXJlZCIgKi8gKTsKKwlNTFhfRklMTF8xICggJmVxY3R4LCAyLAorCQkgICAgIHN0YXJ0X2FkZHJlc3NfbCwgdmlydF90b19waHlzICggYXJiZWxfZXEtPmVxZSApICk7CisJTUxYX0ZJTExfMSAoICZlcWN0eCwgMywgbG9nX2VxX3NpemUsIGZscyAoIEFSQkVMX05VTV9FUUVTIC0gMSApICk7CisJTUxYX0ZJTExfMSAoICZlcWN0eCwgNiwgcGQsIEFSQkVMX0dMT0JBTF9QRCApOworCU1MWF9GSUxMXzEgKCAmZXFjdHgsIDcsIGxrZXksIGFyYmVsLT5yZXNlcnZlZF9sa2V5ICk7CisJaWYgKCAoIHJjID0gYXJiZWxfY21kX3N3Mmh3X2VxICggYXJiZWwsIGFyYmVsX2VxLT5lcW4sCisJCQkJCSAmZXFjdHggKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIFNXMkhXX0VRIGZhaWxlZDogJXNcbiIsCisJCSAgICAgICBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX3N3Mmh3X2VxOworCX0KKworCS8qIE1hcCBldmVudHMgdG8gdGhpcyBldmVudCBxdWV1ZSAqLworCW1lbXNldCAoICZtYXNrLCAwLCBzaXplb2YgKCBtYXNrICkgKTsKKwlNTFhfRklMTF8xICggJm1hc2ssIDEsIHBvcnRfc3RhdGVfY2hhbmdlLCAxICk7CisJaWYgKCAoIHJjID0gYXJiZWxfY21kX21hcF9lcSAoIGFyYmVsLAorCQkJCSAgICAgICAoIEFSQkVMX01BUF9FUSB8IGFyYmVsX2VxLT5lcW4gKSwKKwkJCQkgICAgICAgJm1hc2sgKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIE1BUF9FUSBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICAgYXJiZWwsIHN0cmVycm9yICggcmMgKSAgKTsKKwkJZ290byBlcnJfbWFwX2VxOworCX0KKworCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIEVRTiAlI2x4IHJpbmcgYXQgWyVwLCVwXSlcbiIsCisJICAgICAgIGFyYmVsLCBhcmJlbF9lcS0+ZXFuLCBhcmJlbF9lcS0+ZXFlLAorCSAgICAgICAoICggKCB2b2lkICogKSBhcmJlbF9lcS0+ZXFlICkgKyBhcmJlbF9lcS0+ZXFlX3NpemUgKSApOworCXJldHVybiAwOworCisgZXJyX21hcF9lcToKKwlhcmJlbF9jbWRfaHcyc3dfZXEgKCBhcmJlbCwgYXJiZWxfZXEtPmVxbiwgJmVxY3R4ICk7CisgZXJyX3N3Mmh3X2VxOgorCWZyZWVfZG1hICggYXJiZWxfZXEtPmVxZSwgYXJiZWxfZXEtPmVxZV9zaXplICk7CisgZXJyX2VxZToKKwltZW1zZXQgKCBhcmJlbF9lcSwgMCwgc2l6ZW9mICggKmFyYmVsX2VxICkgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogRGVzdHJveSBldmVudCBxdWV1ZQorICoKKyAqIEB2IGFyYmVsCQlBcmJlbCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgYXJiZWxfZGVzdHJveV9lcSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwgKSB7CisJc3RydWN0IGFyYmVsX2V2ZW50X3F1ZXVlICphcmJlbF9lcSA9ICZhcmJlbC0+ZXE7CisJc3RydWN0IGFyYmVscHJtX2VxYyBlcWN0eDsKKwlzdHJ1Y3QgYXJiZWxwcm1fZXZlbnRfbWFzayBtYXNrOworCWludCByYzsKKworCS8qIFVubWFwIGV2ZW50cyBmcm9tIGV2ZW50IHF1ZXVlICovCisJbWVtc2V0ICggJm1hc2ssIDAsIHNpemVvZiAoIG1hc2sgKSApOworCU1MWF9GSUxMXzEgKCAmbWFzaywgMSwgcG9ydF9zdGF0ZV9jaGFuZ2UsIDEgKTsKKwlpZiAoICggcmMgPSBhcmJlbF9jbWRfbWFwX2VxICggYXJiZWwsCisJCQkJICAgICAgICggQVJCRUxfVU5NQVBfRVEgfCBhcmJlbF9lcS0+ZXFuICksCisJCQkJICAgICAgICZtYXNrICkgKSAhPSAwICkgeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBGQVRBTCBNQVBfRVEgZmFpbGVkIHRvIHVubWFwOiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJLyogQ29udGludWU7IEhDQSBtYXkgZGllIGJ1dCBzeXN0ZW0gc2hvdWxkIHN1cnZpdmUgKi8KKwl9CisKKwkvKiBUYWtlIG93bmVyc2hpcCBiYWNrIGZyb20gaGFyZHdhcmUgKi8KKwlpZiAoICggcmMgPSBhcmJlbF9jbWRfaHcyc3dfZXEgKCBhcmJlbCwgYXJiZWxfZXEtPmVxbiwKKwkJCQkJICZlcWN0eCApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgRkFUQUwgSFcyU1dfRVEgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJLyogTGVhayBtZW1vcnkgYW5kIHJldHVybjsgYXQgbGVhc3Qgd2UgYXZvaWQgY29ycnVwdGlvbiAqLworCQlyZXR1cm47CisJfQorCisJLyogRnJlZSBtZW1vcnkgKi8KKwlmcmVlX2RtYSAoIGFyYmVsX2VxLT5lcWUsIGFyYmVsX2VxLT5lcWVfc2l6ZSApOworCW1lbXNldCAoIGFyYmVsX2VxLCAwLCBzaXplb2YgKCAqYXJiZWxfZXEgKSApOworfQorCisvKioKKyAqIEhhbmRsZSBwb3J0IHN0YXRlIGV2ZW50CisgKgorICogQHYgYXJiZWwJCUFyYmVsIGRldmljZQorICogQHYgZXFlCQlQb3J0IHN0YXRlIGNoYW5nZSBldmVudCBxdWV1ZSBlbnRyeQorICovCitzdGF0aWMgdm9pZCBhcmJlbF9ldmVudF9wb3J0X3N0YXRlX2NoYW5nZSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwsCisJCQkJCSAgICB1bmlvbiBhcmJlbHBybV9ldmVudF9lbnRyeSAqZXFlKXsKKwl1bnNpZ25lZCBpbnQgcG9ydDsKKwlpbnQgbGlua191cDsKKworCS8qIEdldCBwb3J0IGFuZCBsaW5rIHN0YXR1cyAqLworCXBvcnQgPSAoIE1MWF9HRVQgKCAmZXFlLT5wb3J0X3N0YXRlX2NoYW5nZSwgZGF0YS5wICkgLSAxICk7CisJbGlua191cCA9ICggTUxYX0dFVCAoICZlcWUtPmdlbmVyaWMsIGV2ZW50X3N1Yl90eXBlICkgJiAweDA0ICk7CisJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgcG9ydCAlZCBsaW5rICVzXG4iLCBhcmJlbCwgKCBwb3J0ICsgMSApLAorCSAgICAgICAoIGxpbmtfdXAgPyAidXAiIDogImRvd24iICkgKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggcG9ydCA+PSBBUkJFTF9OVU1fUE9SVFMgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIHBvcnQgJWQgZG9lcyBub3QgZXhpc3QhXG4iLAorCQkgICAgICAgYXJiZWwsICggcG9ydCArIDEgKSApOworCQlyZXR1cm47CisJfQorCisJLyogVXBkYXRlIE1BRCBwYXJhbWV0ZXJzICovCisJaWJfc21jX3VwZGF0ZSAoIGFyYmVsLT5pYmRldltwb3J0XSwgYXJiZWxfbWFkICk7CisKKwkvKiBOb3RpZnkgSW5maW5pYmFuZCBjb3JlIG9mIGxpbmsgc3RhdGUgY2hhbmdlICovCisJaWJfbGlua19zdGF0ZV9jaGFuZ2VkICggYXJiZWwtPmliZGV2W3BvcnRdICk7Cit9CisKKy8qKgorICogUG9sbCBldmVudCBxdWV1ZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICovCitzdGF0aWMgdm9pZCBhcmJlbF9wb2xsX2VxICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKSB7CisJc3RydWN0IGFyYmVsICphcmJlbCA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgYXJiZWxfZXZlbnRfcXVldWUgKmFyYmVsX2VxID0gJmFyYmVsLT5lcTsKKwl1bmlvbiBhcmJlbHBybV9ldmVudF9lbnRyeSAqZXFlOworCXVuaW9uIGFyYmVscHJtX2VxX2Rvb3JiZWxsX3JlZ2lzdGVyIGRiX3JlZzsKKwl1bnNpZ25lZCBpbnQgZXFlX2lkeF9tYXNrOworCXVuc2lnbmVkIGludCBldmVudF90eXBlOworCisJd2hpbGUgKCAxICkgeworCQkvKiBMb29rIGZvciBldmVudCBlbnRyeSAqLworCQllcWVfaWR4X21hc2sgPSAoIEFSQkVMX05VTV9FUUVTIC0gMSApOworCQllcWUgPSAmYXJiZWxfZXEtPmVxZVthcmJlbF9lcS0+bmV4dF9pZHggJiBlcWVfaWR4X21hc2tdOworCQlpZiAoIE1MWF9HRVQgKCAmZXFlLT5nZW5lcmljLCBvd25lciApICE9IDAgKSB7CisJCQkvKiBFbnRyeSBzdGlsbCBvd25lZCBieSBoYXJkd2FyZTsgZW5kIG9mIHBvbGwgKi8KKwkJCWJyZWFrOworCQl9CisJCURCR0NQICggYXJiZWwsICJBcmJlbCAlcCBldmVudDpcbiIsIGFyYmVsICk7CisJCURCR0NQX0hEICggYXJiZWwsIGVxZSwgc2l6ZW9mICggKmVxZSApICk7CisKKwkJLyogSGFuZGxlIGV2ZW50ICovCisJCWV2ZW50X3R5cGUgPSBNTFhfR0VUICggJmVxZS0+Z2VuZXJpYywgZXZlbnRfdHlwZSApOworCQlzd2l0Y2ggKCBldmVudF90eXBlICkgeworCQljYXNlIEFSQkVMX0VWX1BPUlRfU1RBVEVfQ0hBTkdFOgorCQkJYXJiZWxfZXZlbnRfcG9ydF9zdGF0ZV9jaGFuZ2UgKCBhcmJlbCwgZXFlICk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIHVucmVjb2duaXNlZCBldmVudCB0eXBlICIKKwkJCSAgICAgICAiJSN4OlxuIiwgYXJiZWwsIGV2ZW50X3R5cGUgKTsKKwkJCURCR0NfSEQgKCBhcmJlbCwgZXFlLCBzaXplb2YgKCAqZXFlICkgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmV0dXJuIG93bmVyc2hpcCB0byBoYXJkd2FyZSAqLworCQlNTFhfRklMTF8xICggJmVxZS0+Z2VuZXJpYywgNywgb3duZXIsIDEgKTsKKwkJYmFycmllcigpOworCisJCS8qIFVwZGF0ZSBldmVudCBxdWV1ZSdzIGluZGV4ICovCisJCWFyYmVsX2VxLT5uZXh0X2lkeCsrOworCisJCS8qIFJpbmcgZG9vcmJlbGwgKi8KKwkJTUxYX0ZJTExfMSAoICZkYl9yZWcuY2ksIDAsIGNpLCBhcmJlbF9lcS0+bmV4dF9pZHggKTsKKwkJREJHQ1AgKCBhcmJlbCwgIlJpbmdpbmcgZG9vcmJlbGwgJTA4bHggd2l0aCAlMDh4XG4iLAorCQkJdmlydF90b19waHlzICggYXJiZWxfZXEtPmRvb3JiZWxsICksCisJCQlkYl9yZWcuZHdvcmRbMF0gKTsKKwkJd3JpdGVsICggZGJfcmVnLmR3b3JkWzBdLCBhcmJlbF9lcS0+ZG9vcmJlbGwgKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbmZpbmliYW5kIGxpbmstbGF5ZXIgb3BlcmF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIEluaXRpYWxpc2UgSW5maW5pYmFuZCBsaW5rCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcmJlbF9vcGVuICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKSB7CisJc3RydWN0IGFyYmVsICphcmJlbCA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgYXJiZWxwcm1faW5pdF9pYiBpbml0X2liOworCWludCByYzsKKworCW1lbXNldCAoICZpbml0X2liLCAwLCBzaXplb2YgKCBpbml0X2liICkgKTsKKwlNTFhfRklMTF8zICggJmluaXRfaWIsIDAsCisJCSAgICAgbXR1X2NhcCwgQVJCRUxfTVRVXzIwNDgsCisJCSAgICAgcG9ydF93aWR0aF9jYXAsIDMsCisJCSAgICAgdmxfY2FwLCAxICk7CisJTUxYX0ZJTExfMSAoICZpbml0X2liLCAxLCBtYXhfZ2lkLCAxICk7CisJTUxYX0ZJTExfMSAoICZpbml0X2liLCAyLCBtYXhfcGtleSwgNjQgKTsKKwlpZiAoICggcmMgPSBhcmJlbF9jbWRfaW5pdF9pYiAoIGFyYmVsLCBpYmRldi0+cG9ydCwKKwkJCQkJJmluaXRfaWIgKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIGNvdWxkIG5vdCBpbnRpYWxpc2UgSUI6ICVzXG4iLAorCQkgICAgICAgYXJiZWwsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogVXBkYXRlIE1BRCBwYXJhbWV0ZXJzICovCisJaWJfc21jX3VwZGF0ZSAoIGliZGV2LCBhcmJlbF9tYWQgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIENsb3NlIEluZmluaWJhbmQgbGluaworICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICovCitzdGF0aWMgdm9pZCBhcmJlbF9jbG9zZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJaW50IHJjOworCisJaWYgKCAoIHJjID0gYXJiZWxfY21kX2Nsb3NlX2liICggYXJiZWwsIGliZGV2LT5wb3J0ICkgKSAhPSAwICkgeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBjb3VsZCBub3QgY2xvc2UgSUI6ICVzXG4iLAorCQkgICAgICAgYXJiZWwsIHN0cmVycm9yICggcmMgKSApOworCQkvKiBOb3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGlzICovCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTXVsdGljYXN0IGdyb3VwIG9wZXJhdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBBdHRhY2ggdG8gbXVsdGljYXN0IGdyb3VwCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgZ2lkCQlNdWx0aWNhc3QgR0lECisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcmJlbF9tY2FzdF9hdHRhY2ggKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQlzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkJc3RydWN0IGliX2dpZCAqZ2lkICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGFyYmVscHJtX21nbV9oYXNoIGhhc2g7CisJc3RydWN0IGFyYmVscHJtX21nbV9lbnRyeSBtZ207CisJdW5zaWduZWQgaW50IGluZGV4OworCWludCByYzsKKworCS8qIEdlbmVyYXRlIGhhc2ggdGFibGUgaW5kZXggKi8KKwlpZiAoICggcmMgPSBhcmJlbF9jbWRfbWdpZF9oYXNoICggYXJiZWwsIGdpZCwgJmhhc2ggKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIGNvdWxkIG5vdCBoYXNoIEdJRDogJXNcbiIsCisJCSAgICAgICBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisJaW5kZXggPSBNTFhfR0VUICggJmhhc2gsIGhhc2ggKTsKKworCS8qIENoZWNrIGZvciBleGlzdGluZyBoYXNoIHRhYmxlIGVudHJ5ICovCisJaWYgKCAoIHJjID0gYXJiZWxfY21kX3JlYWRfbWdtICggYXJiZWwsIGluZGV4LCAmbWdtICkgKSAhPSAwICkgeworCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBjb3VsZCBub3QgcmVhZCBNR00gJSN4OiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBpbmRleCwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisJaWYgKCBNTFhfR0VUICggJm1nbSwgbWdtcXBfMC5xaSApICE9IDAgKSB7CisJCS8qIEZJWE1FOiB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cyBvbmx5IGEgc2luZ2xlIFFQCisJCSAqIHBlciBtdWx0aWNhc3QgZ3JvdXAsIGFuZCBkb2Vzbid0IGhhbmRsZSBoYXNoCisJCSAqIGNvbGxpc2lvbnMuICBTdWZmaWNpZW50IGZvciBJUG9JQiBidXQgbWF5IG5lZWQgdG8KKwkJICogYmUgZXh0ZW5kZWQgaW4gZnV0dXJlLgorCQkgKi8KKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgTUdJRCBpbmRleCAlI3ggYWxyZWFkeSBpbiB1c2VcbiIsCisJCSAgICAgICBhcmJlbCwgaW5kZXggKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBVcGRhdGUgaGFzaCB0YWJsZSBlbnRyeSAqLworCU1MWF9GSUxMXzIgKCAmbWdtLCA4LAorCQkgICAgIG1nbXFwXzAucXBuX2ksIHFwLT5xcG4sCisJCSAgICAgbWdtcXBfMC5xaSwgMSApOworCW1lbWNweSAoICZtZ20udS5kd29yZHNbNF0sIGdpZCwgc2l6ZW9mICggKmdpZCApICk7CisJaWYgKCAoIHJjID0gYXJiZWxfY21kX3dyaXRlX21nbSAoIGFyYmVsLCBpbmRleCwgJm1nbSApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgY291bGQgbm90IHdyaXRlIE1HTSAlI3g6ICVzXG4iLAorCQkgICAgICAgYXJiZWwsIGluZGV4LCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIERldGFjaCBmcm9tIG11bHRpY2FzdCBncm91cAorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGdpZAkJTXVsdGljYXN0IEdJRAorICovCitzdGF0aWMgdm9pZCBhcmJlbF9tY2FzdF9kZXRhY2ggKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwIF9fdW51c2VkLAorCQkJCSBzdHJ1Y3QgaWJfZ2lkICpnaWQgKSB7CisJc3RydWN0IGFyYmVsICphcmJlbCA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgYXJiZWxwcm1fbWdtX2hhc2ggaGFzaDsKKwlzdHJ1Y3QgYXJiZWxwcm1fbWdtX2VudHJ5IG1nbTsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJaW50IHJjOworCisJLyogR2VuZXJhdGUgaGFzaCB0YWJsZSBpbmRleCAqLworCWlmICggKCByYyA9IGFyYmVsX2NtZF9tZ2lkX2hhc2ggKCBhcmJlbCwgZ2lkLCAmaGFzaCApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgY291bGQgbm90IGhhc2ggR0lEOiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuOworCX0KKwlpbmRleCA9IE1MWF9HRVQgKCAmaGFzaCwgaGFzaCApOworCisJLyogQ2xlYXIgaGFzaCB0YWJsZSBlbnRyeSAqLworCW1lbXNldCAoICZtZ20sIDAsIHNpemVvZiAoIG1nbSApICk7CisJaWYgKCAoIHJjID0gYXJiZWxfY21kX3dyaXRlX21nbSAoIGFyYmVsLCBpbmRleCwgJm1nbSApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgY291bGQgbm90IHdyaXRlIE1HTSAlI3g6ICVzXG4iLAorCQkgICAgICAgYXJiZWwsIGluZGV4LCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoqIEFyYmVsIEluZmluaWJhbmQgb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBpYl9kZXZpY2Vfb3BlcmF0aW9ucyBhcmJlbF9pYl9vcGVyYXRpb25zID0geworCS5jcmVhdGVfY3EJPSBhcmJlbF9jcmVhdGVfY3EsCisJLmRlc3Ryb3lfY3EJPSBhcmJlbF9kZXN0cm95X2NxLAorCS5jcmVhdGVfcXAJPSBhcmJlbF9jcmVhdGVfcXAsCisJLm1vZGlmeV9xcAk9IGFyYmVsX21vZGlmeV9xcCwKKwkuZGVzdHJveV9xcAk9IGFyYmVsX2Rlc3Ryb3lfcXAsCisJLnBvc3Rfc2VuZAk9IGFyYmVsX3Bvc3Rfc2VuZCwKKwkucG9zdF9yZWN2CT0gYXJiZWxfcG9zdF9yZWN2LAorCS5wb2xsX2NxCT0gYXJiZWxfcG9sbF9jcSwKKwkucG9sbF9lcQk9IGFyYmVsX3BvbGxfZXEsCisJLm9wZW4JCT0gYXJiZWxfb3BlbiwKKwkuY2xvc2UJCT0gYXJiZWxfY2xvc2UsCisJLm1jYXN0X2F0dGFjaAk9IGFyYmVsX21jYXN0X2F0dGFjaCwKKwkubWNhc3RfZGV0YWNoCT0gYXJiZWxfbWNhc3RfZGV0YWNoLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpcm13YXJlIGNvbnRyb2wKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBTdGFydCBmaXJtd2FyZSBydW5uaW5nCisgKgorICogQHYgYXJiZWwJCUFyYmVsIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYXJiZWxfc3RhcnRfZmlybXdhcmUgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsICkgeworCXN0cnVjdCBhcmJlbHBybV9xdWVyeV9mdyBmdzsKKwlzdHJ1Y3QgYXJiZWxwcm1fYWNjZXNzX2xhbSBsYW07CisJc3RydWN0IGFyYmVscHJtX3ZpcnR1YWxfcGh5c2ljYWxfbWFwcGluZyBtYXBfZmE7CisJdW5zaWduZWQgaW50IGZ3X3BhZ2VzOworCXVuc2lnbmVkIGludCBsb2cyX2Z3X3BhZ2VzOworCXNpemVfdCBmd19zaXplOworCXBoeXNhZGRyX3QgZndfYmFzZTsKKwl1aW50NjRfdCBlcV9zZXRfY2lfYmFzZV9hZGRyOworCWludCByYzsKKworCS8qIEdldCBmaXJtd2FyZSBwYXJhbWV0ZXJzICovCisJaWYgKCAoIHJjID0gYXJiZWxfY21kX3F1ZXJ5X2Z3ICggYXJiZWwsICZmdyApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgY291bGQgbm90IHF1ZXJ5IGZpcm13YXJlOiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfcXVlcnlfZnc7CisJfQorCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIGZpcm13YXJlIHZlcnNpb24gJWQuJWQuJWRcbiIsIGFyYmVsLAorCSAgICAgICBNTFhfR0VUICggJmZ3LCBmd19yZXZfbWFqb3IgKSwgTUxYX0dFVCAoICZmdywgZndfcmV2X21pbm9yICksCisJICAgICAgIE1MWF9HRVQgKCAmZncsIGZ3X3Jldl9zdWJtaW5vciApICk7CisJZndfcGFnZXMgPSBNTFhfR0VUICggJmZ3LCBmd19wYWdlcyApOworCWxvZzJfZndfcGFnZXMgPSBmbHMgKCBmd19wYWdlcyAtIDEgKTsKKwlmd19wYWdlcyA9ICggMSA8PCBsb2cyX2Z3X3BhZ2VzICk7CisJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgcmVxdWlyZXMgJWQga0IgZm9yIGZpcm13YXJlXG4iLAorCSAgICAgICBhcmJlbCwgKCBmd19wYWdlcyAqIDQgKSApOworCWVxX3NldF9jaV9iYXNlX2FkZHIgPQorCQkoICggKHVpbnQ2NF90KSBNTFhfR0VUICggJmZ3LCBlcV9zZXRfY2lfYmFzZV9hZGRyX2ggKSA8PCAzMiApIHwKKwkJICAoICh1aW50NjRfdCkgTUxYX0dFVCAoICZmdywgZXFfc2V0X2NpX2Jhc2VfYWRkcl9sICkgKSApOworCWFyYmVsLT5lcV9jaV9kb29yYmVsbHMgPSBpb3JlbWFwICggZXFfc2V0X2NpX2Jhc2VfYWRkciwgMHgyMDAgKTsKKworCS8qIEVuYWJsZSBsb2NhbGx5LWF0dGFjaGVkIG1lbW9yeS4gIElnbm9yZSBmYWlsdXJlOyB0aGVyZSBtYXkKKwkgKiBiZSBubyBhdHRhY2hlZCBtZW1vcnkuCisJICovCisJYXJiZWxfY21kX2VuYWJsZV9sYW0gKCBhcmJlbCwgJmxhbSApOworCisJLyogQWxsb2NhdGUgZmlybXdhcmUgcGFnZXMgYW5kIG1hcCBmaXJtd2FyZSBhcmVhICovCisJZndfc2l6ZSA9ICggZndfcGFnZXMgKiA0MDk2ICk7CisJYXJiZWwtPmZpcm13YXJlX2FyZWEgPSB1bWFsbG9jICggZndfc2l6ZSAqIDIgKTsKKwlpZiAoICEgYXJiZWwtPmZpcm13YXJlX2FyZWEgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2NfZmE7CisJfQorCWZ3X2Jhc2UgPSAoIHVzZXJfdG9fcGh5cyAoIGFyYmVsLT5maXJtd2FyZV9hcmVhLCBmd19zaXplICkgJgorCQkgICAgfiggZndfc2l6ZSAtIDEgKSApOworCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIGZpcm13YXJlIGFyZWEgYXQgcGh5c2ljYWwgWyVseCwlbHgpXG4iLAorCSAgICAgICBhcmJlbCwgZndfYmFzZSwgKCBmd19iYXNlICsgZndfc2l6ZSApICk7CisJbWVtc2V0ICggJm1hcF9mYSwgMCwgc2l6ZW9mICggbWFwX2ZhICkgKTsKKwlNTFhfRklMTF8yICggJm1hcF9mYSwgMywKKwkJICAgICBsb2cyc2l6ZSwgbG9nMl9md19wYWdlcywKKwkJICAgICBwYV9sLCAoIGZ3X2Jhc2UgPj4gMTIgKSApOworCWlmICggKCByYyA9IGFyYmVsX2NtZF9tYXBfZmEgKCBhcmJlbCwgJm1hcF9mYSApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgY291bGQgbm90IG1hcCBmaXJtd2FyZTogJXNcbiIsCisJCSAgICAgICBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX21hcF9mYTsKKwl9CisKKwkvKiBTdGFydCBmaXJtd2FyZSAqLworCWlmICggKCByYyA9IGFyYmVsX2NtZF9ydW5fZncgKCBhcmJlbCApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgY291bGQgbm90IHJ1biBmaXJtd2FyZTogJXNcbiIsCisJCSAgICAgICBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX3J1bl9mdzsKKwl9CisKKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBmaXJtd2FyZSBzdGFydGVkXG4iLCBhcmJlbCApOworCXJldHVybiAwOworCisgZXJyX3J1bl9mdzoKKwlhcmJlbF9jbWRfdW5tYXBfZmEgKCBhcmJlbCApOworIGVycl9tYXBfZmE6CisJdWZyZWUgKCBhcmJlbC0+ZmlybXdhcmVfYXJlYSApOworCWFyYmVsLT5maXJtd2FyZV9hcmVhID0gVU5VTEw7CisgZXJyX2FsbG9jX2ZhOgorIGVycl9xdWVyeV9mdzoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogU3RvcCBmaXJtd2FyZSBydW5uaW5nCisgKgorICogQHYgYXJiZWwJCUFyYmVsIGRldmljZQorICovCitzdGF0aWMgdm9pZCBhcmJlbF9zdG9wX2Zpcm13YXJlICggc3RydWN0IGFyYmVsICphcmJlbCApIHsKKwlpbnQgcmM7CisKKwlpZiAoICggcmMgPSBhcmJlbF9jbWRfdW5tYXBfZmEgKCBhcmJlbCApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgRkFUQUwgY291bGQgbm90IHN0b3AgZmlybXdhcmU6ICVzXG4iLAorCQkgICAgICAgYXJiZWwsIHN0cmVycm9yICggcmMgKSApOworCQkvKiBMZWFrIG1lbW9yeSBhbmQgcmV0dXJuOyBhdCBsZWFzdCB3ZSBhdm9pZCBjb3JydXB0aW9uICovCisJCXJldHVybjsKKwl9CisJdWZyZWUgKCBhcmJlbC0+ZmlybXdhcmVfYXJlYSApOworCWFyYmVsLT5maXJtd2FyZV9hcmVhID0gVU5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbmZpbmlob3N0IENvbnRleHQgTWVtb3J5IG1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBHZXQgZGV2aWNlIGxpbWl0cworICoKKyAqIEB2IGFyYmVsCQlBcmJlbCBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGFyYmVsX2dldF9saW1pdHMgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsICkgeworCXN0cnVjdCBhcmJlbHBybV9xdWVyeV9kZXZfbGltIGRldl9saW07CisJaW50IHJjOworCisJaWYgKCAoIHJjID0gYXJiZWxfY21kX3F1ZXJ5X2Rldl9saW0gKCBhcmJlbCwgJmRldl9saW0gKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIGNvdWxkIG5vdCBnZXQgZGV2aWNlIGxpbWl0czogJXNcbiIsCisJCSAgICAgICBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlhcmJlbC0+bGltaXRzLnJlc2VydmVkX3FwcyA9CisJCSggMSA8PCBNTFhfR0VUICggJmRldl9saW0sIGxvZzJfcnN2ZF9xcHMgKSApOworCWFyYmVsLT5saW1pdHMucXBjX2VudHJ5X3NpemUgPSBNTFhfR0VUICggJmRldl9saW0sIHFwY19lbnRyeV9zeiApOworCWFyYmVsLT5saW1pdHMuZXFwY19lbnRyeV9zaXplID0gTUxYX0dFVCAoICZkZXZfbGltLCBlcXBjX2VudHJ5X3N6ICk7CisJYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF9zcnFzID0KKwkJKCAxIDw8IE1MWF9HRVQgKCAmZGV2X2xpbSwgbG9nMl9yc3ZkX3NycXMgKSApOworCWFyYmVsLT5saW1pdHMuc3JxY19lbnRyeV9zaXplID0gTUxYX0dFVCAoICZkZXZfbGltLCBzcnFfZW50cnlfc3ogKTsKKwlhcmJlbC0+bGltaXRzLnJlc2VydmVkX2VlcyA9CisJCSggMSA8PCBNTFhfR0VUICggJmRldl9saW0sIGxvZzJfcnN2ZF9lZXMgKSApOworCWFyYmVsLT5saW1pdHMuZWVjX2VudHJ5X3NpemUgPSBNTFhfR0VUICggJmRldl9saW0sIGVlY19lbnRyeV9zeiApOworCWFyYmVsLT5saW1pdHMuZWVlY19lbnRyeV9zaXplID0gTUxYX0dFVCAoICZkZXZfbGltLCBlZWVjX2VudHJ5X3N6ICk7CisJYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF9jcXMgPQorCQkoIDEgPDwgTUxYX0dFVCAoICZkZXZfbGltLCBsb2cyX3JzdmRfY3FzICkgKTsKKwlhcmJlbC0+bGltaXRzLmNxY19lbnRyeV9zaXplID0gTUxYX0dFVCAoICZkZXZfbGltLCBjcWNfZW50cnlfc3ogKTsKKwlhcmJlbC0+bGltaXRzLnJlc2VydmVkX2VxcyA9IE1MWF9HRVQgKCAmZGV2X2xpbSwgbnVtX3JzdmRfZXFzICk7CisJYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF9tdHRzID0KKwkJKCAxIDw8IE1MWF9HRVQgKCAmZGV2X2xpbSwgbG9nMl9yc3ZkX210dHMgKSApOworCWFyYmVsLT5saW1pdHMubXR0X2VudHJ5X3NpemUgPSBNTFhfR0VUICggJmRldl9saW0sIG10dF9lbnRyeV9zeiApOworCWFyYmVsLT5saW1pdHMucmVzZXJ2ZWRfbXJ3cyA9CisJCSggMSA8PCBNTFhfR0VUICggJmRldl9saW0sIGxvZzJfcnN2ZF9tcndzICkgKTsKKwlhcmJlbC0+bGltaXRzLm1wdF9lbnRyeV9zaXplID0gTUxYX0dFVCAoICZkZXZfbGltLCBtcHRfZW50cnlfc3ogKTsKKwlhcmJlbC0+bGltaXRzLnJlc2VydmVkX3JkYnMgPQorCQkoIDEgPDwgTUxYX0dFVCAoICZkZXZfbGltLCBsb2cyX3JzdmRfcmRicyApICk7CisJYXJiZWwtPmxpbWl0cy5lcWNfZW50cnlfc2l6ZSA9IE1MWF9HRVQgKCAmZGV2X2xpbSwgZXFjX2VudHJ5X3N6ICk7CisJYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF91YXJzID0gTUxYX0dFVCAoICZkZXZfbGltLCBudW1fcnN2ZF91YXJzICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBHZXQgSUNNIHVzYWdlCisgKgorICogQHYgbG9nX251bV9lbnRyaWVzCUxvZzIgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzCisgKiBAdiBlbnRyeV9zaXplCUVudHJ5IHNpemUKKyAqIEByZXQgdXNhZ2UJCVVzYWdlIHNpemUgaW4gSUNNCisgKi8KK3N0YXRpYyBzaXplX3QgaWNtX3VzYWdlICggdW5zaWduZWQgaW50IGxvZ19udW1fZW50cmllcywgc2l6ZV90IGVudHJ5X3NpemUgKSB7CisJc2l6ZV90IHVzYWdlOworCisJdXNhZ2UgPSAoICggMSA8PCBsb2dfbnVtX2VudHJpZXMgKSAqIGVudHJ5X3NpemUgKTsKKwl1c2FnZSA9ICggKCB1c2FnZSArIDQwOTUgKSAmIH40MDk1ICk7CisJcmV0dXJuIHVzYWdlOworfQorCisvKioKKyAqIEFsbG9jYXRlIElDTQorICoKKyAqIEB2IGFyYmVsCQlBcmJlbCBkZXZpY2UKKyAqIEB2IGluaXRfaGNhCQlJTklUX0hDQSBzdHJ1Y3R1cmUgdG8gZmlsbCBpbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYXJiZWxfYWxsb2NfaWNtICggc3RydWN0IGFyYmVsICphcmJlbCwKKwkJCSAgICAgc3RydWN0IGFyYmVscHJtX2luaXRfaGNhICppbml0X2hjYSApIHsKKwlzdHJ1Y3QgYXJiZWxwcm1fc2NhbGFyX3BhcmFtZXRlciBpY21fc2l6ZTsKKwlzdHJ1Y3QgYXJiZWxwcm1fc2NhbGFyX3BhcmFtZXRlciBpY21fYXV4X3NpemU7CisJc3RydWN0IGFyYmVscHJtX3ZpcnR1YWxfcGh5c2ljYWxfbWFwcGluZyBtYXBfaWNtX2F1eDsKKwlzdHJ1Y3QgYXJiZWxwcm1fdmlydHVhbF9waHlzaWNhbF9tYXBwaW5nIG1hcF9pY207CisJdW5pb24gYXJiZWxwcm1fZG9vcmJlbGxfcmVjb3JkICpkYl9yZWM7CisJc2l6ZV90IGljbV9vZmZzZXQgPSAwOworCXVuc2lnbmVkIGludCBsb2dfbnVtX3FwcywgbG9nX251bV9zcnFzLCBsb2dfbnVtX2VlcywgbG9nX251bV9jcXM7CisJdW5zaWduZWQgaW50IGxvZ19udW1fbXR0cywgbG9nX251bV9tcHRzLCBsb2dfbnVtX3JkYnMsIGxvZ19udW1fZXFzOworCWludCByYzsKKworCWljbV9vZmZzZXQgPSAoICggYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF91YXJzICsgMSApIDw8IDEyICk7CisKKwkvKiBRdWV1ZSBwYWlyIGNvbnRleHRzICovCisJbG9nX251bV9xcHMgPSBmbHMgKCBhcmJlbC0+bGltaXRzLnJlc2VydmVkX3FwcyArIEFSQkVMX01BWF9RUFMgLSAxICk7CisJTUxYX0ZJTExfMiAoIGluaXRfaGNhLCAxMywKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMucXBjX2Jhc2VfYWRkcl9sLAorCQkgICAgICggaWNtX29mZnNldCA+PiA3ICksCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmxvZ19udW1fb2ZfcXAsCisJCSAgICAgbG9nX251bV9xcHMgKTsKKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBJQ00gUVBDIGJhc2UgPSAlenhcbiIsIGFyYmVsLCBpY21fb2Zmc2V0ICk7CisJaWNtX29mZnNldCArPSBpY21fdXNhZ2UgKCBsb2dfbnVtX3FwcywgYXJiZWwtPmxpbWl0cy5xcGNfZW50cnlfc2l6ZSApOworCisJLyogRXh0ZW5kZWQgcXVldWUgcGFpciBjb250ZXh0cyAqLworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgMjUsCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmVxcGNfYmFzZV9hZGRyX2wsCisJCSAgICAgaWNtX29mZnNldCApOworCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIElDTSBFUVBDIGJhc2UgPSAlenhcbiIsIGFyYmVsLCBpY21fb2Zmc2V0ICk7CisJLy8JaWNtX29mZnNldCArPSBpY21fdXNhZ2UgKCBsb2dfbnVtX3FwcywgYXJiZWwtPmxpbWl0cy5lcXBjX2VudHJ5X3NpemUgKTsKKwlpY21fb2Zmc2V0ICs9IGljbV91c2FnZSAoIGxvZ19udW1fcXBzLCBhcmJlbC0+bGltaXRzLnFwY19lbnRyeV9zaXplICk7CQorCisJLyogU2hhcmVkIHJlY2VpdmUgcXVldWUgY29udGV4dHMgKi8KKwlsb2dfbnVtX3NycXMgPSBmbHMgKCBhcmJlbC0+bGltaXRzLnJlc2VydmVkX3NycXMgLSAxICk7CisJTUxYX0ZJTExfMiAoIGluaXRfaGNhLCAxOSwKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMuc3JxY19iYXNlX2FkZHJfbCwKKwkJICAgICAoIGljbV9vZmZzZXQgPj4gNSApLAorCQkgICAgIHFwY19lZWNfY3FjX2VxY19yZGJfcGFyYW1ldGVycy5sb2dfbnVtX29mX3NycSwKKwkJICAgICBsb2dfbnVtX3NycXMgKTsKKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBJQ00gU1JRQyBiYXNlID0gJXp4XG4iLCBhcmJlbCwgaWNtX29mZnNldCApOworCWljbV9vZmZzZXQgKz0gaWNtX3VzYWdlICggbG9nX251bV9zcnFzLCBhcmJlbC0+bGltaXRzLnNycWNfZW50cnlfc2l6ZSApOworCisJLyogRW5kLXRvLWVuZCBjb250ZXh0cyAqLworCWxvZ19udW1fZWVzID0gZmxzICggYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF9lZXMgLSAxICk7CisJTUxYX0ZJTExfMiAoIGluaXRfaGNhLCAxNywKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMuZWVjX2Jhc2VfYWRkcl9sLAorCQkgICAgICggaWNtX29mZnNldCA+PiA3ICksCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmxvZ19udW1fb2ZfZWUsCisJCSAgICAgbG9nX251bV9lZXMgKTsKKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBJQ00gRUVDIGJhc2UgPSAlenhcbiIsIGFyYmVsLCBpY21fb2Zmc2V0ICk7CisJaWNtX29mZnNldCArPSBpY21fdXNhZ2UgKCBsb2dfbnVtX2VlcywgYXJiZWwtPmxpbWl0cy5lZWNfZW50cnlfc2l6ZSApOworCisJLyogRXh0ZW5kZWQgZW5kLXRvLWVuZCBjb250ZXh0cyAqLworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgMjksCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmVlZWNfYmFzZV9hZGRyX2wsCisJCSAgICAgaWNtX29mZnNldCApOworCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIElDTSBFRUVDIGJhc2UgPSAlenhcbiIsIGFyYmVsLCBpY21fb2Zmc2V0ICk7CisJaWNtX29mZnNldCArPSBpY21fdXNhZ2UgKCBsb2dfbnVtX2VlcywgYXJiZWwtPmxpbWl0cy5lZWVjX2VudHJ5X3NpemUgKTsKKworCS8qIENvbXBsZXRpb24gcXVldWUgY29udGV4dHMgKi8KKwlsb2dfbnVtX2NxcyA9IGZscyAoIGFyYmVsLT5saW1pdHMucmVzZXJ2ZWRfY3FzICsgQVJCRUxfTUFYX0NRUyAtIDEgKTsKKwlNTFhfRklMTF8yICggaW5pdF9oY2EsIDIxLAorCQkgICAgIHFwY19lZWNfY3FjX2VxY19yZGJfcGFyYW1ldGVycy5jcWNfYmFzZV9hZGRyX2wsCisJCSAgICAgKCBpY21fb2Zmc2V0ID4+IDYgKSwKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMubG9nX251bV9vZl9jcSwKKwkJICAgICBsb2dfbnVtX2NxcyApOworCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIElDTSBDUUMgYmFzZSA9ICV6eFxuIiwgYXJiZWwsIGljbV9vZmZzZXQgKTsKKwlpY21fb2Zmc2V0ICs9IGljbV91c2FnZSAoIGxvZ19udW1fY3FzLCBhcmJlbC0+bGltaXRzLmNxY19lbnRyeV9zaXplICk7CisKKwkvKiBNZW1vcnkgdHJhbnNsYXRpb24gdGFibGUgKi8KKwlsb2dfbnVtX210dHMgPSBmbHMgKCBhcmJlbC0+bGltaXRzLnJlc2VydmVkX210dHMgLSAxICk7CisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCA2NSwKKwkJICAgICB0cHRfcGFyYW1ldGVycy5tdHRfYmFzZV9hZGRyX2wsIGljbV9vZmZzZXQgKTsKKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBJQ00gTVRUIGJhc2UgPSAlenhcbiIsIGFyYmVsLCBpY21fb2Zmc2V0ICk7CisJaWNtX29mZnNldCArPSBpY21fdXNhZ2UgKCBsb2dfbnVtX210dHMsIGFyYmVsLT5saW1pdHMubXR0X2VudHJ5X3NpemUgKTsKKworCS8qIE1lbW9yeSBwcm90ZWN0aW9uIHRhYmxlICovCisJbG9nX251bV9tcHRzID0gZmxzICggYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF9tcndzICsgMSAtIDEgKTsKKwlNTFhfRklMTF8xICggaW5pdF9oY2EsIDYxLAorCQkgICAgIHRwdF9wYXJhbWV0ZXJzLm1wdF9iYXNlX2Fkcl9sLCBpY21fb2Zmc2V0ICk7CisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCA2MiwKKwkJICAgICB0cHRfcGFyYW1ldGVycy5sb2dfbXB0X3N6LCBsb2dfbnVtX21wdHMgKTsKKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBJQ00gTVRUIGJhc2UgPSAlenhcbiIsIGFyYmVsLCBpY21fb2Zmc2V0ICk7CisJaWNtX29mZnNldCArPSBpY21fdXNhZ2UgKCBsb2dfbnVtX21wdHMsIGFyYmVsLT5saW1pdHMubXB0X2VudHJ5X3NpemUgKTsKKworCS8qIFJETUEgc29tZXRoaW5nIG9yIG90aGVyICovCisJbG9nX251bV9yZGJzID0gZmxzICggYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF9yZGJzIC0gMSApOworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgMzcsCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLnJkYl9iYXNlX2FkZHJfbCwKKwkJICAgICBpY21fb2Zmc2V0ICk7CisJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgSUNNIFJEQiBiYXNlID0gJXp4XG4iLCBhcmJlbCwgaWNtX29mZnNldCApOworCWljbV9vZmZzZXQgKz0gaWNtX3VzYWdlICggbG9nX251bV9yZGJzLCAzMiApOworCisJLyogRXZlbnQgcXVldWUgY29udGV4dHMgKi8KKwlsb2dfbnVtX2VxcyA9ICBmbHMgKCBhcmJlbC0+bGltaXRzLnJlc2VydmVkX2VxcyArIEFSQkVMX01BWF9FUVMgLSAxICk7CisJTUxYX0ZJTExfMiAoIGluaXRfaGNhLCAzMywKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMuZXFjX2Jhc2VfYWRkcl9sLAorCQkgICAgICggaWNtX29mZnNldCA+PiA2ICksCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmxvZ19udW1fZXEsCisJCSAgICAgbG9nX251bV9lcXMgKTsKKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBJQ00gRVEgYmFzZSA9ICV6eFxuIiwgYXJiZWwsIGljbV9vZmZzZXQgKTsKKwlpY21fb2Zmc2V0ICs9ICggKCAxIDw8IGxvZ19udW1fZXFzICkgKiBhcmJlbC0+bGltaXRzLmVxY19lbnRyeV9zaXplICk7CisKKwkvKiBNdWx0aWNhc3QgdGFibGUgKi8KKwlNTFhfRklMTF8xICggaW5pdF9oY2EsIDQ5LAorCQkgICAgIG11bHRpY2FzdF9wYXJhbWV0ZXJzLm1jX2Jhc2VfYWRkcl9sLCBpY21fb2Zmc2V0ICk7CisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCA1MiwKKwkJICAgICBtdWx0aWNhc3RfcGFyYW1ldGVycy5sb2dfbWNfdGFibGVfZW50cnlfc3osCisJCSAgICAgZmxzICggc2l6ZW9mICggc3RydWN0IGFyYmVscHJtX21nbV9lbnRyeSApIC0gMSApICk7CisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCA1MywKKwkJICAgICBtdWx0aWNhc3RfcGFyYW1ldGVycy5tY190YWJsZV9oYXNoX3N6LCA4ICk7CisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCA1NCwKKwkJICAgICBtdWx0aWNhc3RfcGFyYW1ldGVycy5sb2dfbWNfdGFibGVfc3osIDMgKTsKKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBJQ00gTUMgYmFzZSA9ICV6eFxuIiwgYXJiZWwsIGljbV9vZmZzZXQgKTsKKwlpY21fb2Zmc2V0ICs9ICggOCAqIHNpemVvZiAoIHN0cnVjdCBhcmJlbHBybV9tZ21fZW50cnkgKSApOworCisJYXJiZWwtPmljbV9sZW4gPSBpY21fb2Zmc2V0OworCWFyYmVsLT5pY21fbGVuID0gKCAoIGFyYmVsLT5pY21fbGVuICsgNDA5NSApICYgfjQwOTUgKTsKKworCS8qIEdldCBJQ00gYXV4aWxpYXJ5IGFyZWEgc2l6ZSAqLworCW1lbXNldCAoICZpY21fc2l6ZSwgMCwgc2l6ZW9mICggaWNtX3NpemUgKSApOworCU1MWF9GSUxMXzEgKCAmaWNtX3NpemUsIDEsIHZhbHVlLCBhcmJlbC0+aWNtX2xlbiApOworCWlmICggKCByYyA9IGFyYmVsX2NtZF9zZXRfaWNtX3NpemUgKCBhcmJlbCwgJmljbV9zaXplLAorCQkJCQkgICAgICZpY21fYXV4X3NpemUgKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIGNvdWxkIG5vdCBzZXQgSUNNIHNpemU6ICVzXG4iLAorCQkgICAgICAgYXJiZWwsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9zZXRfaWNtX3NpemU7CisJfQorCWFyYmVsLT5pY21fYXV4X2xlbiA9ICggTUxYX0dFVCAoICZpY21fYXV4X3NpemUsIHZhbHVlICkgKiA0MDk2ICk7CisKKwkvKiBBbGxvY2F0ZSBJQ00gZGF0YSBhbmQgYXV4aWxpYXJ5IGFyZWEgKi8KKwlEQkdDICggYXJiZWwsICJBcmJlbCAlcCByZXF1aXJlcyAlemQga0IgSUNNIGFuZCAlemQga0IgQVVYIElDTVxuIiwKKwkgICAgICAgYXJiZWwsICggYXJiZWwtPmljbV9sZW4gLyAxMDI0ICksCisJICAgICAgICggYXJiZWwtPmljbV9hdXhfbGVuIC8gMTAyNCApICk7CisJYXJiZWwtPmljbSA9IHVtYWxsb2MgKCBhcmJlbC0+aWNtX2xlbiArIGFyYmVsLT5pY21fYXV4X2xlbiApOworCWlmICggISBhcmJlbC0+aWNtICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jOworCX0KKworCS8qIE1hcCBJQ00gYXV4aWxpYXJ5IGFyZWEgKi8KKwltZW1zZXQgKCAmbWFwX2ljbV9hdXgsIDAsIHNpemVvZiAoIG1hcF9pY21fYXV4ICkgKTsKKwlNTFhfRklMTF8yICggJm1hcF9pY21fYXV4LCAzLAorCQkgICAgIGxvZzJzaXplLCBmbHMgKCAoIGFyYmVsLT5pY21fYXV4X2xlbiAvIDQwOTYgKSAtIDEgKSwKKwkJICAgICBwYV9sLAorCQkgICAgICggdXNlcl90b19waHlzICggYXJiZWwtPmljbSwgYXJiZWwtPmljbV9sZW4gKSA+PiAxMiApICk7CisJaWYgKCAoIHJjID0gYXJiZWxfY21kX21hcF9pY21fYXV4ICggYXJiZWwsICZtYXBfaWNtX2F1eCApICkgIT0gMCApIHsKKwkJREJHQyAoIGFyYmVsLCAiQXJiZWwgJXAgY291bGQgbm90IG1hcCBBVVggSUNNOiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfbWFwX2ljbV9hdXg7CisJfQorCisJLyogTUFQIElDTSBhcmVhICovCisJbWVtc2V0ICggJm1hcF9pY20sIDAsIHNpemVvZiAoIG1hcF9pY20gKSApOworCU1MWF9GSUxMXzIgKCAmbWFwX2ljbSwgMywKKwkJICAgICBsb2cyc2l6ZSwgZmxzICggKCBhcmJlbC0+aWNtX2xlbiAvIDQwOTYgKSAtIDEgKSwKKwkJICAgICBwYV9sLCAoIHVzZXJfdG9fcGh5cyAoIGFyYmVsLT5pY20sIDAgKSA+PiAxMiApICk7CisJaWYgKCAoIHJjID0gYXJiZWxfY21kX21hcF9pY20gKCBhcmJlbCwgJm1hcF9pY20gKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIGNvdWxkIG5vdCBtYXAgSUNNOiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfbWFwX2ljbTsKKwl9CisKKwkvKiBJbml0aWFsaXNlIFVBUiBjb250ZXh0ICovCisJYXJiZWwtPmRiX3JlYyA9IHBoeXNfdG9fdmlydCAoIHVzZXJfdG9fcGh5cyAoIGFyYmVsLT5pY20sIDAgKSArCisJCQkJICAgICAgICggYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF91YXJzICoKKwkJCQkJIEFSQkVMX1BBR0VfU0laRSApICk7CisJbWVtc2V0ICggYXJiZWwtPmRiX3JlYywgMCwgQVJCRUxfUEFHRV9TSVpFICk7CisJZGJfcmVjID0gJmFyYmVsLT5kYl9yZWNbQVJCRUxfR1JPVVBfU0VQQVJBVE9SX0RPT1JCRUxMXTsKKwlNTFhfRklMTF8xICggJmRiX3JlYy0+cXAsIDEsIHJlcywgQVJCRUxfVUFSX1JFU19HUk9VUF9TRVAgKTsKKworCXJldHVybiAwOworCisJYXJiZWxfY21kX3VubWFwX2ljbSAoIGFyYmVsLCAoIGFyYmVsLT5pY21fbGVuIC8gNDA5NiApICk7CisgZXJyX21hcF9pY206CisJYXJiZWxfY21kX3VubWFwX2ljbV9hdXggKCBhcmJlbCApOworIGVycl9tYXBfaWNtX2F1eDoKKwl1ZnJlZSAoIGFyYmVsLT5pY20gKTsKKwlhcmJlbC0+aWNtID0gVU5VTEw7CisgZXJyX2FsbG9jOgorIGVycl9zZXRfaWNtX3NpemU6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEZyZWUgSUNNCisgKgorICogQHYgYXJiZWwJCUFyYmVsIGRldmljZQorICovCitzdGF0aWMgdm9pZCBhcmJlbF9mcmVlX2ljbSAoIHN0cnVjdCBhcmJlbCAqYXJiZWwgKSB7CisJYXJiZWxfY21kX3VubWFwX2ljbSAoIGFyYmVsLCAoIGFyYmVsLT5pY21fbGVuIC8gNDA5NiApICk7CisJYXJiZWxfY21kX3VubWFwX2ljbV9hdXggKCBhcmJlbCApOworCXVmcmVlICggYXJiZWwtPmljbSApOworCWFyYmVsLT5pY20gPSBVTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBDSSBpbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBTZXQgdXAgbWVtb3J5IHByb3RlY3Rpb24gdGFibGUKKyAqCisgKiBAdiBhcmJlbAkJQXJiZWwgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcmJlbF9zZXR1cF9tcHQgKCBzdHJ1Y3QgYXJiZWwgKmFyYmVsICkgeworCXN0cnVjdCBhcmJlbHBybV9tcHQgbXB0OworCXVpbnQzMl90IGtleTsKKwlpbnQgcmM7CisKKwkvKiBEZXJpdmUga2V5ICovCisJa2V5ID0gKCBhcmJlbC0+bGltaXRzLnJlc2VydmVkX21yd3MgfCBBUkJFTF9NS0VZX1BSRUZJWCApOworCWFyYmVsLT5yZXNlcnZlZF9sa2V5ID0gKCAoIGtleSA8PCA4ICkgfCAoIGtleSA+PiAyNCApICk7CisKKwkvKiBJbml0aWFsaXNlIG1lbW9yeSBwcm90ZWN0aW9uIHRhYmxlICovCisJbWVtc2V0ICggJm1wdCwgMCwgc2l6ZW9mICggbXB0ICkgKTsKKwlNTFhfRklMTF80ICggJm1wdCwgMCwKKwkJICAgICByX3csIDEsCisJCSAgICAgcGEsIDEsCisJCSAgICAgbHIsIDEsCisJCSAgICAgbHcsIDEgKTsKKwlNTFhfRklMTF8xICggJm1wdCwgMiwgbWVtX2tleSwga2V5ICk7CisJTUxYX0ZJTExfMSAoICZtcHQsIDMsIHBkLCBBUkJFTF9HTE9CQUxfUEQgKTsKKwlNTFhfRklMTF8xICggJm1wdCwgNiwgcmVnX3duZF9sZW5faCwgMHhmZmZmZmZmZlVMICk7CisJTUxYX0ZJTExfMSAoICZtcHQsIDcsIHJlZ193bmRfbGVuX2wsIDB4ZmZmZmZmZmZVTCApOworCWlmICggKCByYyA9IGFyYmVsX2NtZF9zdzJod19tcHQgKCBhcmJlbCwgYXJiZWwtPmxpbWl0cy5yZXNlcnZlZF9tcndzLAorCQkJCQkgICZtcHQgKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIGNvdWxkIG5vdCBzZXQgdXAgTVBUOiAlc1xuIiwKKwkJICAgICAgIGFyYmVsLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCQorLyoqCisgKiBQcm9iZSBQQ0kgZGV2aWNlCisgKgorICogQHYgcGNpCQlQQ0kgZGV2aWNlCisgKiBAdiBpZAkJUENJIElECisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcmJlbF9wcm9iZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkIF9fdW51c2VkICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWw7CisJc3RydWN0IGliX2RldmljZSAqaWJkZXY7CisJc3RydWN0IGFyYmVscHJtX2luaXRfaGNhIGluaXRfaGNhOworCWludCBpOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIEFyYmVsIGRldmljZSAqLworCWFyYmVsID0gemFsbG9jICggc2l6ZW9mICggKmFyYmVsICkgKTsKKwlpZiAoICEgYXJiZWwgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2NfYXJiZWw7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YSAoIHBjaSwgYXJiZWwgKTsKKworCS8qIEFsbG9jYXRlIEluZmluaWJhbmQgZGV2aWNlcyAqLworCWZvciAoIGkgPSAwIDsgaSA8IEFSQkVMX05VTV9QT1JUUyA7IGkrKyApIHsKKwkJaWJkZXYgPSBhbGxvY19pYmRldiAoIDAgKTsKKwkJaWYgKCAhIGliZGV2ICkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBlcnJfYWxsb2NfaWJkZXY7CisJCX0KKwkJYXJiZWwtPmliZGV2W2ldID0gaWJkZXY7CisJCWliZGV2LT5vcCA9ICZhcmJlbF9pYl9vcGVyYXRpb25zOworCQlpYmRldi0+ZGV2ID0gJnBjaS0+ZGV2OworCQlpYmRldi0+cG9ydCA9ICggQVJCRUxfUE9SVF9CQVNFICsgaSApOworCQlpYl9zZXRfZHJ2ZGF0YSAoIGliZGV2LCBhcmJlbCApOworCX0KKworCS8qIEZpeCB1cCBQQ0kgZGV2aWNlICovCisJYWRqdXN0X3BjaV9kZXZpY2UgKCBwY2kgKTsKKworCS8qIEdldCBQQ0kgQkFScyAqLworCWFyYmVsLT5jb25maWcgPSBpb3JlbWFwICggcGNpX2Jhcl9zdGFydCAoIHBjaSwgQVJCRUxfUENJX0NPTkZJR19CQVIgKSwKKwkJCQkgIEFSQkVMX1BDSV9DT05GSUdfQkFSX1NJWkUgKTsKKwlhcmJlbC0+dWFyID0gaW9yZW1hcCAoICggcGNpX2Jhcl9zdGFydCAoIHBjaSwgQVJCRUxfUENJX1VBUl9CQVIgKSArCisJCQkJIEFSQkVMX1BDSV9VQVJfSURYICogQVJCRUxfUENJX1VBUl9TSVpFICksCisJCQkgICAgICAgQVJCRUxfUENJX1VBUl9TSVpFICk7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgbWFpbGJveGVzICovCisJYXJiZWwtPm1haWxib3hfaW4gPSBtYWxsb2NfZG1hICggQVJCRUxfTUJPWF9TSVpFLCBBUkJFTF9NQk9YX0FMSUdOICk7CisJaWYgKCAhIGFyYmVsLT5tYWlsYm94X2luICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX21haWxib3hfaW47CisJfQorCWFyYmVsLT5tYWlsYm94X291dCA9IG1hbGxvY19kbWEgKCBBUkJFTF9NQk9YX1NJWkUsIEFSQkVMX01CT1hfQUxJR04gKTsKKwlpZiAoICEgYXJiZWwtPm1haWxib3hfb3V0ICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX21haWxib3hfb3V0OworCX0KKworCS8qIFN0YXJ0IGZpcm13YXJlICovCisJaWYgKCAoIHJjID0gYXJiZWxfc3RhcnRfZmlybXdhcmUgKCBhcmJlbCApICkgIT0gMCApCisJCWdvdG8gZXJyX3N0YXJ0X2Zpcm13YXJlOworCisJLyogR2V0IGRldmljZSBsaW1pdHMgKi8KKwlpZiAoICggcmMgPSBhcmJlbF9nZXRfbGltaXRzICggYXJiZWwgKSApICE9IDAgKQorCQlnb3RvIGVycl9nZXRfbGltaXRzOworCisJLyogQWxsb2NhdGUgSUNNICovCisJbWVtc2V0ICggJmluaXRfaGNhLCAwLCBzaXplb2YgKCBpbml0X2hjYSApICk7CisJaWYgKCAoIHJjID0gYXJiZWxfYWxsb2NfaWNtICggYXJiZWwsICZpbml0X2hjYSApICkgIT0gMCApCisJCWdvdG8gZXJyX2FsbG9jX2ljbTsKKworCS8qIEluaXRpYWxpc2UgSENBICovCisJTUxYX0ZJTExfMSAoICZpbml0X2hjYSwgNzQsIHVhcl9wYXJhbWV0ZXJzLmxvZ19tYXhfdWFycywgMSApOworCWlmICggKCByYyA9IGFyYmVsX2NtZF9pbml0X2hjYSAoIGFyYmVsLCAmaW5pdF9oY2EgKSApICE9IDAgKSB7CisJCURCR0MgKCBhcmJlbCwgIkFyYmVsICVwIGNvdWxkIG5vdCBpbml0aWFsaXNlIEhDQTogJXNcbiIsCisJCSAgICAgICBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX2luaXRfaGNhOworCX0KKworCS8qIFNldCB1cCBtZW1vcnkgcHJvdGVjdGlvbiAqLworCWlmICggKCByYyA9IGFyYmVsX3NldHVwX21wdCAoIGFyYmVsICkgKSAhPSAwICkKKwkJZ290byBlcnJfc2V0dXBfbXB0OworCisJLyogU2V0IHVwIGV2ZW50IHF1ZXVlICovCisJaWYgKCAoIHJjID0gYXJiZWxfY3JlYXRlX2VxICggYXJiZWwgKSApICE9IDAgKQorCQlnb3RvIGVycl9jcmVhdGVfZXE7CisKKwkvKiBVcGRhdGUgTUFEIHBhcmFtZXRlcnMgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBBUkJFTF9OVU1fUE9SVFMgOyBpKysgKQorCQlpYl9zbWNfdXBkYXRlICggYXJiZWwtPmliZGV2W2ldLCBhcmJlbF9tYWQgKTsKKworCS8qIFJlZ2lzdGVyIEluZmluaWJhbmQgZGV2aWNlcyAqLworCWZvciAoIGkgPSAwIDsgaSA8IEFSQkVMX05VTV9QT1JUUyA7IGkrKyApIHsKKwkJaWYgKCAoIHJjID0gcmVnaXN0ZXJfaWJkZXYgKCBhcmJlbC0+aWJkZXZbaV0gKSApICE9IDAgKSB7CisJCQlEQkdDICggYXJiZWwsICJBcmJlbCAlcCBjb3VsZCBub3QgcmVnaXN0ZXIgSUIgIgorCQkJICAgICAgICJkZXZpY2U6ICVzXG4iLCBhcmJlbCwgc3RyZXJyb3IgKCByYyApICk7CisJCQlnb3RvIGVycl9yZWdpc3Rlcl9pYmRldjsKKwkJfQorCX0KKworCXJldHVybiAwOworCisJaSA9IEFSQkVMX05VTV9QT1JUUzsKKyBlcnJfcmVnaXN0ZXJfaWJkZXY6CisJZm9yICggaS0tIDsgaSA+PSAwIDsgaS0tICkKKwkJdW5yZWdpc3Rlcl9pYmRldiAoIGFyYmVsLT5pYmRldltpXSApOworCWFyYmVsX2Rlc3Ryb3lfZXEgKCBhcmJlbCApOworIGVycl9jcmVhdGVfZXE6CisgZXJyX3NldHVwX21wdDoKKwlhcmJlbF9jbWRfY2xvc2VfaGNhICggYXJiZWwgKTsKKyBlcnJfaW5pdF9oY2E6CisJYXJiZWxfZnJlZV9pY20gKCBhcmJlbCApOworIGVycl9hbGxvY19pY206CisgZXJyX2dldF9saW1pdHM6CisJYXJiZWxfc3RvcF9maXJtd2FyZSAoIGFyYmVsICk7CisgZXJyX3N0YXJ0X2Zpcm13YXJlOgorCWZyZWVfZG1hICggYXJiZWwtPm1haWxib3hfb3V0LCBBUkJFTF9NQk9YX1NJWkUgKTsKKyBlcnJfbWFpbGJveF9vdXQ6CisJZnJlZV9kbWEgKCBhcmJlbC0+bWFpbGJveF9pbiwgQVJCRUxfTUJPWF9TSVpFICk7CisgZXJyX21haWxib3hfaW46CisJaSA9IEFSQkVMX05VTV9QT1JUUzsKKyBlcnJfYWxsb2NfaWJkZXY6CisJZm9yICggaS0tIDsgaSA+PSAwIDsgaS0tICkKKwkJaWJkZXZfcHV0ICggYXJiZWwtPmliZGV2W2ldICk7CisJZnJlZSAoIGFyYmVsICk7CisgZXJyX2FsbG9jX2FyYmVsOgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZW1vdmUgUENJIGRldmljZQorICoKKyAqIEB2IHBjaQkJUENJIGRldmljZQorICovCitzdGF0aWMgdm9pZCBhcmJlbF9yZW1vdmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCXN0cnVjdCBhcmJlbCAqYXJiZWwgPSBwY2lfZ2V0X2RydmRhdGEgKCBwY2kgKTsKKwlpbnQgaTsKKworCWZvciAoIGkgPSAoIEFSQkVMX05VTV9QT1JUUyAtIDEgKSA7IGkgPj0gMCA7IGktLSApCisJCXVucmVnaXN0ZXJfaWJkZXYgKCBhcmJlbC0+aWJkZXZbaV0gKTsKKwlhcmJlbF9kZXN0cm95X2VxICggYXJiZWwgKTsKKwlhcmJlbF9jbWRfY2xvc2VfaGNhICggYXJiZWwgKTsKKwlhcmJlbF9mcmVlX2ljbSAoIGFyYmVsICk7CisJYXJiZWxfc3RvcF9maXJtd2FyZSAoIGFyYmVsICk7CisJYXJiZWxfc3RvcF9maXJtd2FyZSAoIGFyYmVsICk7CisJZnJlZV9kbWEgKCBhcmJlbC0+bWFpbGJveF9vdXQsIEFSQkVMX01CT1hfU0laRSApOworCWZyZWVfZG1hICggYXJiZWwtPm1haWxib3hfaW4sIEFSQkVMX01CT1hfU0laRSApOworCWZvciAoIGkgPSAoIEFSQkVMX05VTV9QT1JUUyAtIDEgKSA7IGkgPj0gMCA7IGktLSApCisJCWliZGV2X3B1dCAoIGFyYmVsLT5pYmRldltpXSApOworCWZyZWUgKCBhcmJlbCApOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYXJiZWxfbmljc1tdID0geworCVBDSV9ST00gKCAweDE1YjMsIDB4NjI4MiwgIm10MjUyMTgiLCAiTVQyNTIxOCBIQ0EgZHJpdmVyIiwgMCApLAorCVBDSV9ST00gKCAweDE1YjMsIDB4NjI3NCwgIm10MjUyMDQiLCAiTVQyNTIwNCBIQ0EgZHJpdmVyIiwgMCApLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgYXJiZWxfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzID0gYXJiZWxfbmljcywKKwkuaWRfY291bnQgPSAoIHNpemVvZiAoIGFyYmVsX25pY3MgKSAvIHNpemVvZiAoIGFyYmVsX25pY3NbMF0gKSApLAorCS5wcm9iZSA9IGFyYmVsX3Byb2JlLAorCS5yZW1vdmUgPSBhcmJlbF9yZW1vdmUsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL2FyYmVsLmggYi9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvYXJiZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y1OTMzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL2FyYmVsLmgKQEAgLTAsMCArMSw1NDQgQEAKKyNpZm5kZWYgX0FSQkVMX0gKKyNkZWZpbmUgX0FSQkVMX0gKKworLyoqIEBmaWxlCisgKgorICogTWVsbGFub3ggQXJiZWwgSW5maW5pYmFuZCBIQ0EgZHJpdmVyCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorI2luY2x1ZGUgIm1seF9iaXRvcHMuaCIKKyNpbmNsdWRlICJNVDI1MjE4X1BSTS5oIgorCisvKgorICogSGFyZHdhcmUgY29uc3RhbnRzCisgKgorICovCisKKy8qIFBvcnRzIGluIGV4aXN0ZW5jZSAqLworI2RlZmluZSBBUkJFTF9OVU1fUE9SVFMJCQkyCisjZGVmaW5lIEFSQkVMX1BPUlRfQkFTRQkJCTEKKworLyogUENJIEJBUnMgKi8KKyNkZWZpbmUgQVJCRUxfUENJX0NPTkZJR19CQVIJCVBDSV9CQVNFX0FERFJFU1NfMAorI2RlZmluZSBBUkJFTF9QQ0lfQ09ORklHX0JBUl9TSVpFCTB4MTAwMDAwCisjZGVmaW5lIEFSQkVMX1BDSV9VQVJfQkFSCQlQQ0lfQkFTRV9BRERSRVNTXzIKKyNkZWZpbmUgQVJCRUxfUENJX1VBUl9JRFgJCTEKKyNkZWZpbmUgQVJCRUxfUENJX1VBUl9TSVpFCQkweDEwMDAKKworLyogVUFSIGNvbnRleHQgdGFibGUgKFVDRSkgcmVzb3VyY2UgdHlwZXMgKi8KKyNkZWZpbmUgQVJCRUxfVUFSX1JFU19OT05FCQkweDAwCisjZGVmaW5lIEFSQkVMX1VBUl9SRVNfQ1FfQ0kJCTB4MDEKKyNkZWZpbmUgQVJCRUxfVUFSX1JFU19DUV9BUk0JCTB4MDIKKyNkZWZpbmUgQVJCRUxfVUFSX1JFU19TUQkJMHgwMworI2RlZmluZSBBUkJFTF9VQVJfUkVTX1JRCQkweDA0CisjZGVmaW5lIEFSQkVMX1VBUl9SRVNfR1JPVVBfU0VQCQkweDA3CisKKy8qIFdvcmsgcXVldWUgZW50cnkgYW5kIGNvbXBsZXRpb24gcXVldWUgZW50cnkgb3Bjb2RlcyAqLworI2RlZmluZSBBUkJFTF9PUENPREVfU0VORAkJMHgwYQorI2RlZmluZSBBUkJFTF9PUENPREVfUkVDVl9FUlJPUgkJMHhmZQorI2RlZmluZSBBUkJFTF9PUENPREVfU0VORF9FUlJPUgkJMHhmZgorCisvKiBIQ0EgY29tbWFuZCByZWdpc3RlciBvcGNvZGVzICovCisjZGVmaW5lIEFSQkVMX0hDUl9RVUVSWV9ERVZfTElNCQkweDAwMDMKKyNkZWZpbmUgQVJCRUxfSENSX1FVRVJZX0ZXCQkweDAwMDQKKyNkZWZpbmUgQVJCRUxfSENSX0lOSVRfSENBCQkweDAwMDcKKyNkZWZpbmUgQVJCRUxfSENSX0NMT1NFX0hDQQkJMHgwMDA4CisjZGVmaW5lIEFSQkVMX0hDUl9JTklUX0lCCQkweDAwMDkKKyNkZWZpbmUgQVJCRUxfSENSX0NMT1NFX0lCCQkweDAwMGEKKyNkZWZpbmUgQVJCRUxfSENSX1NXMkhXX01QVAkJMHgwMDBkCisjZGVmaW5lIEFSQkVMX0hDUl9NQVBfRVEJCTB4MDAxMgorI2RlZmluZSBBUkJFTF9IQ1JfU1cySFdfRVEJCTB4MDAxMworI2RlZmluZSBBUkJFTF9IQ1JfSFcyU1dfRVEJCTB4MDAxNAorI2RlZmluZSBBUkJFTF9IQ1JfU1cySFdfQ1EJCTB4MDAxNgorI2RlZmluZSBBUkJFTF9IQ1JfSFcyU1dfQ1EJCTB4MDAxNworI2RlZmluZSBBUkJFTF9IQ1JfUlNUMklOSVRfUVBFRQkJMHgwMDE5CisjZGVmaW5lIEFSQkVMX0hDUl9JTklUMlJUUl9RUEVFCQkweDAwMWEKKyNkZWZpbmUgQVJCRUxfSENSX1JUUjJSVFNfUVBFRQkJMHgwMDFiCisjZGVmaW5lIEFSQkVMX0hDUl9SVFMyUlRTX1FQRUUJCTB4MDAxYworI2RlZmluZSBBUkJFTF9IQ1JfMlJTVF9RUEVFCQkweDAwMjEKKyNkZWZpbmUgQVJCRUxfSENSX01BRF9JRkMJCTB4MDAyNAorI2RlZmluZSBBUkJFTF9IQ1JfUkVBRF9NR00JCTB4MDAyNQorI2RlZmluZSBBUkJFTF9IQ1JfV1JJVEVfTUdNCQkweDAwMjYKKyNkZWZpbmUgQVJCRUxfSENSX01HSURfSEFTSAkJMHgwMDI3CisjZGVmaW5lIEFSQkVMX0hDUl9SVU5fRlcJCTB4MGZmNgorI2RlZmluZSBBUkJFTF9IQ1JfRElTQUJMRV9MQU0JCTB4MGZmNworI2RlZmluZSBBUkJFTF9IQ1JfRU5BQkxFX0xBTQkJMHgwZmY4CisjZGVmaW5lIEFSQkVMX0hDUl9VTk1BUF9JQ00JCTB4MGZmOQorI2RlZmluZSBBUkJFTF9IQ1JfTUFQX0lDTQkJMHgwZmZhCisjZGVmaW5lIEFSQkVMX0hDUl9VTk1BUF9JQ01fQVVYCQkweDBmZmIKKyNkZWZpbmUgQVJCRUxfSENSX01BUF9JQ01fQVVYCQkweDBmZmMKKyNkZWZpbmUgQVJCRUxfSENSX1NFVF9JQ01fU0laRQkJMHgwZmZkCisjZGVmaW5lIEFSQkVMX0hDUl9VTk1BUF9GQQkJMHgwZmZlCisjZGVmaW5lIEFSQkVMX0hDUl9NQVBfRkEJCTB4MGZmZgorCisvKiBTZXJ2aWNlIHR5cGVzICovCisjZGVmaW5lIEFSQkVMX1NUX1VECQkJMHgwMworCisvKiBNVFVzICovCisjZGVmaW5lIEFSQkVMX01UVV8yMDQ4CQkJMHgwNAorCisjZGVmaW5lIEFSQkVMX05PX0VRCQkJNjQKKworI2RlZmluZSBBUkJFTF9JTlZBTElEX0xLRVkJCTB4MDAwMDAxMDBVTAorCisjZGVmaW5lIEFSQkVMX1BBR0VfU0laRQkJCTQwOTYKKworI2RlZmluZSBBUkJFTF9EQl9QT1NUX1NORF9PRkZTRVQJMHgxMAorI2RlZmluZSBBUkJFTF9EQl9FUV9PRkZTRVQoX2VxbikJKCAweDA4ICogKF9lcW4pICkKKworI2RlZmluZSBBUkJFTF9RUEVFX09QVF9QQVJBTV9RS0VZCTB4MDAwMDAwMjBVTAorCisjZGVmaW5lIEFSQkVMX01BUF9FUQkJCSggMFVMIDw8IDMxICkKKyNkZWZpbmUgQVJCRUxfVU5NQVBfRVEJCQkoIDFVTCA8PCAzMSApCisKKyNkZWZpbmUgQVJCRUxfRVZfUE9SVF9TVEFURV9DSEFOR0UJMHgwOQorCisvKgorICogRGF0YXR5cGVzIHRoYXQgc2VlbSB0byBiZSBtaXNzaW5nIGZyb20gdGhlIGF1dG9nZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbgorICoKKyAqLworc3RydWN0IGFyYmVscHJtX21nbV9oYXNoX3N0IHsKKwlwc2V1ZG9fYml0X3QgcmVzZXJ2ZWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKwlwc2V1ZG9fYml0X3QgaGFzaFsweDAwMDEwXTsKKwlwc2V1ZG9fYml0X3QgcmVzZXJ2ZWQxWzB4MDAwMTBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworc3RydWN0IGFyYmVscHJtX3NjYWxhcl9wYXJhbWV0ZXJfc3QgeworCXBzZXVkb19iaXRfdCByZXNlcnZlZDBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworCXBzZXVkb19iaXRfdCB2YWx1ZVsweDAwMDIwXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3N0cnVjdCBhcmJlbHBybV9ldmVudF9tYXNrX3N0IHsKKwlwc2V1ZG9fYml0X3QgcmVzZXJ2ZWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKwlwc2V1ZG9fYml0X3QgY29tcGxldGlvblsweDAwMDAxXTsKKwlwc2V1ZG9fYml0X3QgcmVzZXJ2ZWQxWzB4MDAwOF07CisJcHNldWRvX2JpdF90IHBvcnRfc3RhdGVfY2hhbmdlWzB4MDAwMDFdOworCXBzZXVkb19iaXRfdCByZXNlcnZlZDJbMHgwMDAxNl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCitzdHJ1Y3QgYXJiZWxwcm1fZXFfc2V0X2NpX3N0IHsKKwlwc2V1ZG9fYml0X3QgY2lbMHgwMDAyMF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCitzdHJ1Y3QgYXJiZWxwcm1fcG9ydF9zdGF0ZV9jaGFuZ2VfZXZlbnRfc3QgeworCXBzZXVkb19iaXRfdCByZXNlcnZlZFsweDAwMDIwXTsKKwlzdHJ1Y3QgYXJiZWxwcm1fcG9ydF9zdGF0ZV9jaGFuZ2Vfc3QgZGF0YTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qCisgKiBXcmFwcGVyIHN0cnVjdHVyZXMgZm9yIGhhcmR3YXJlIGRhdGF0eXBlcworICoKKyAqLworCitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fYWNjZXNzX2xhbSApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX2NvbXBsZXRpb25fcXVldWVfY29udGV4dCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX2NvbXBsZXRpb25fcXVldWVfZW50cnkgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBhcmJlbHBybV9jb21wbGV0aW9uX3dpdGhfZXJyb3IgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBhcmJlbHBybV9jcV9hcm1fZGJfcmVjb3JkICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fY3FfY2lfZGJfcmVjb3JkICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fZXZlbnRfbWFzayApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX2V2ZW50X3F1ZXVlX2VudHJ5ICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fZXFfc2V0X2NpICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fZXFjICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1faGNhX2NvbW1hbmRfcmVnaXN0ZXIgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBhcmJlbHBybV9pbml0X2hjYSApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX2luaXRfaWIgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBhcmJlbHBybV9tYWRfaWZjICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fbWdtX2VudHJ5ICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fbWdtX2hhc2ggKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBhcmJlbHBybV9tcHQgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBhcmJlbHBybV9wb3J0X3N0YXRlX2NoYW5nZV9ldmVudCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX3FwX2RiX3JlY29yZCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX3FwX2VlX3N0YXRlX3RyYW5zaXRpb25zICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fcXVlcnlfZGV2X2xpbSApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX3F1ZXJ5X2Z3ICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fcXVldWVfcGFpcl9lZV9jb250ZXh0X2VudHJ5ICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fcmVjdl93cWVfc2VnbWVudF9uZXh0ICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fc2NhbGFyX3BhcmFtZXRlciApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX3NlbmRfZG9vcmJlbGwgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBhcmJlbHBybV91ZF9hZGRyZXNzX3ZlY3RvciApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX3ZpcnR1YWxfcGh5c2ljYWxfbWFwcGluZyApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX3dxZV9zZWdtZW50X2N0cmxfc2VuZCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX3dxZV9zZWdtZW50X2RhdGFfcHRyICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggYXJiZWxwcm1fd3FlX3NlZ21lbnRfbmV4dCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGFyYmVscHJtX3dxZV9zZWdtZW50X3VkICk7CisKKy8qCisgKiBDb21wb3NpdGUgaGFyZHdhcmUgZGF0YXR5cGVzCisgKgorICovCisKKyNkZWZpbmUgQVJCRUxfTUFYX0dBVEhFUiAxCisKK3N0cnVjdCBhcmJlbHBybV91ZF9zZW5kX3dxZSB7CisJc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X25leHQgbmV4dDsKKwlzdHJ1Y3QgYXJiZWxwcm1fd3FlX3NlZ21lbnRfY3RybF9zZW5kIGN0cmw7CisJc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X3VkIHVkOworCXN0cnVjdCBhcmJlbHBybV93cWVfc2VnbWVudF9kYXRhX3B0ciBkYXRhW0FSQkVMX01BWF9HQVRIRVJdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworI2RlZmluZSBBUkJFTF9NQVhfU0NBVFRFUiAxCisKK3N0cnVjdCBhcmJlbHBybV9yZWN2X3dxZSB7CisJLyogVGhlIGF1dG9nZW5lcmF0ZWQgaGVhZGVyIGlzIGluY29uc2lzdGVudCBiZXR3ZWVuIHNlbmQgYW5kCisJICogcmVjZWl2ZSBXUUVzLiAgVGhlICJjdHJsIiBzdHJ1Y3R1cmUgZm9yIHJlY2VpdmUgV1FFcyBpcworCSAqIGRlZmluZWQgdG8gaW5jbHVkZSB0aGUgIm5leHQiIHN0cnVjdHVyZS4gIFNpbmNlIHRoZSAiY3RybCIKKwkgKiBwYXJ0IG9mIHRoZSAiY3RybCIgc3RydWN0dXJlIGNvbnRhaW5zIG9ubHkgInJlc2VydmVkLCBtdXN0CisJICogYmUgemVybyIgYml0cywgd2UgaWdub3JlIGl0cyBkZWZpbml0aW9uIGFuZCBwcm92aWRlCisJICogc29tZXRoaW5nIG1vcmUgdXNhYmxlLgorCSAqLworCXN0cnVjdCBhcmJlbHBybV9yZWN2X3dxZV9zZWdtZW50X25leHQgbmV4dDsKKwl1aW50MzJfdCBjdHJsWzJdOyAvKiBBbGwgInJlc2VydmVkLCBtdXN0IGJlIHplcm8iICovCisJc3RydWN0IGFyYmVscHJtX3dxZV9zZWdtZW50X2RhdGFfcHRyIGRhdGFbQVJCRUxfTUFYX1NDQVRURVJdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKwordW5pb24gYXJiZWxwcm1fY29tcGxldGlvbl9lbnRyeSB7CisJc3RydWN0IGFyYmVscHJtX2NvbXBsZXRpb25fcXVldWVfZW50cnkgbm9ybWFsOworCXN0cnVjdCBhcmJlbHBybV9jb21wbGV0aW9uX3dpdGhfZXJyb3IgZXJyb3I7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCit1bmlvbiBhcmJlbHBybV9ldmVudF9lbnRyeSB7CisJc3RydWN0IGFyYmVscHJtX2V2ZW50X3F1ZXVlX2VudHJ5IGdlbmVyaWM7CisJc3RydWN0IGFyYmVscHJtX3BvcnRfc3RhdGVfY2hhbmdlX2V2ZW50IHBvcnRfc3RhdGVfY2hhbmdlOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKwordW5pb24gYXJiZWxwcm1fZG9vcmJlbGxfcmVjb3JkIHsKKwlzdHJ1Y3QgYXJiZWxwcm1fY3FfYXJtX2RiX3JlY29yZCBjcV9hcm07CisJc3RydWN0IGFyYmVscHJtX2NxX2NpX2RiX3JlY29yZCBjcV9jaTsKKwlzdHJ1Y3QgYXJiZWxwcm1fcXBfZGJfcmVjb3JkIHFwOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKwordW5pb24gYXJiZWxwcm1fZG9vcmJlbGxfcmVnaXN0ZXIgeworCXN0cnVjdCBhcmJlbHBybV9zZW5kX2Rvb3JiZWxsIHNlbmQ7CisJdWludDMyX3QgZHdvcmRbMl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCit1bmlvbiBhcmJlbHBybV9lcV9kb29yYmVsbF9yZWdpc3RlciB7CisJc3RydWN0IGFyYmVscHJtX2VxX3NldF9jaSBjaTsKKwl1aW50MzJfdCBkd29yZFsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3VuaW9uIGFyYmVscHJtX21hZCB7CisJc3RydWN0IGFyYmVscHJtX21hZF9pZmMgaWZjOworCXVuaW9uIGliX21hZCBtYWQ7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKgorICogZ1BYRS1zcGVjaWZpYyBkZWZpbml0aW9ucworICoKKyAqLworCisvKiogQXJiZWwgZGV2aWNlIGxpbWl0cyAqLworc3RydWN0IGFyYmVsX2Rldl9saW1pdHMgeworCS8qKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgUVBzICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkX3FwczsKKwkvKiogUVAgY29udGV4dCBlbnRyeSBzaXplICovCisJc2l6ZV90IHFwY19lbnRyeV9zaXplOworCS8qKiBFeHRlbmRlZCBRUCBjb250ZXh0IGVudHJ5IHNpemUgKi8KKwlzaXplX3QgZXFwY19lbnRyeV9zaXplOworCS8qKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgU1JRcyAqLworCXVuc2lnbmVkIGludCByZXNlcnZlZF9zcnFzOworCS8qKiBTUlEgY29udGV4dCBlbnRyeSBzaXplICovCisJc2l6ZV90IHNycWNfZW50cnlfc2l6ZTsKKwkvKiogTnVtYmVyIG9mIHJlc2VydmVkIEVFcyAqLworCXVuc2lnbmVkIGludCByZXNlcnZlZF9lZXM7CisJLyoqIEVFIGNvbnRleHQgZW50cnkgc2l6ZSAqLworCXNpemVfdCBlZWNfZW50cnlfc2l6ZTsKKwkvKiogRXh0ZW5kZWQgRUUgY29udGV4dCBlbnRyeSBzaXplICovCisJc2l6ZV90IGVlZWNfZW50cnlfc2l6ZTsKKwkvKiogTnVtYmVyIG9mIHJlc2VydmVkIENRcyAqLworCXVuc2lnbmVkIGludCByZXNlcnZlZF9jcXM7CisJLyoqIENRIGNvbnRleHQgZW50cnkgc2l6ZSAqLworCXNpemVfdCBjcWNfZW50cnlfc2l6ZTsKKwkvKiogTnVtYmVyIG9mIHJlc2VydmVkIEVRcyAqLworCXVuc2lnbmVkIGludCByZXNlcnZlZF9lcXM7CisJLyoqIE51bWJlciBvZiByZXNlcnZlZCBNVFRzICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkX210dHM7CisJLyoqIE1UVCBlbnRyeSBzaXplICovCisJc2l6ZV90IG10dF9lbnRyeV9zaXplOworCS8qKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgTVJXcyAqLworCXVuc2lnbmVkIGludCByZXNlcnZlZF9tcndzOworCS8qKiBNUFQgZW50cnkgc2l6ZSAqLworCXNpemVfdCBtcHRfZW50cnlfc2l6ZTsKKwkvKiogTnVtYmVyIG9mIHJlc2VydmVkIFJEQnMgKi8KKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfcmRiczsKKwkvKiogRVEgY29udGV4dCBlbnRyeSBzaXplICovCisJc2l6ZV90IGVxY19lbnRyeV9zaXplOworCS8qKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgVUFScyAqLworCXVuc2lnbmVkIGludCByZXNlcnZlZF91YXJzOworfTsKKworLyoqIEFsaWdubWVudCBvZiBBcmJlbCBzZW5kIHdvcmsgcXVldWUgZW50cmllcyAqLworI2RlZmluZSBBUkJFTF9TRU5EX1dRRV9BTElHTiAxMjgKKworLyoqIEFuIEFyYmVsIHNlbmQgd29yayBxdWV1ZSBlbnRyeSAqLwordW5pb24gYXJiZWxfc2VuZF93cWUgeworCXN0cnVjdCBhcmJlbHBybV91ZF9zZW5kX3dxZSB1ZDsKKwl1aW50OF90IGZvcmNlX2FsaWduW0FSQkVMX1NFTkRfV1FFX0FMSUdOXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBbiBBcmJlbCBzZW5kIHdvcmsgcXVldWUgKi8KK3N0cnVjdCBhcmJlbF9zZW5kX3dvcmtfcXVldWUgeworCS8qKiBEb29yYmVsbCByZWNvcmQgbnVtYmVyICovCisJdW5zaWduZWQgaW50IGRvb3JiZWxsX2lkeDsKKwkvKiogV29yayBxdWV1ZSBlbnRyaWVzICovCisJdW5pb24gYXJiZWxfc2VuZF93cWUgKndxZTsKKwkvKiogU2l6ZSBvZiB3b3JrIHF1ZXVlICovCisJc2l6ZV90IHdxZV9zaXplOworfTsKKworLyoqIEFsaWdubWVudCBvZiBBcmJlbCByZWNlaXZlIHdvcmsgcXVldWUgZW50cmllcyAqLworI2RlZmluZSBBUkJFTF9SRUNWX1dRRV9BTElHTiA2NAorCisvKiogQW4gQXJiZWwgcmVjZWl2ZSB3b3JrIHF1ZXVlIGVudHJ5ICovCit1bmlvbiBhcmJlbF9yZWN2X3dxZSB7CisJc3RydWN0IGFyYmVscHJtX3JlY3Zfd3FlIHJlY3Y7CisJdWludDhfdCBmb3JjZV9hbGlnbltBUkJFTF9SRUNWX1dRRV9BTElHTl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQW4gQXJiZWwgcmVjZWl2ZSB3b3JrIHF1ZXVlICovCitzdHJ1Y3QgYXJiZWxfcmVjdl93b3JrX3F1ZXVlIHsKKwkvKiogRG9vcmJlbGwgcmVjb3JkIG51bWJlciAqLworCXVuc2lnbmVkIGludCBkb29yYmVsbF9pZHg7CisJLyoqIFdvcmsgcXVldWUgZW50cmllcyAqLworCXVuaW9uIGFyYmVsX3JlY3Zfd3FlICp3cWU7CisJLyoqIFNpemUgb2Ygd29yayBxdWV1ZSAqLworCXNpemVfdCB3cWVfc2l6ZTsKK307CisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0YWJsZSBxdWV1ZSBwYWlycworICoKKyAqIFRoaXMgaXMgYSBwb2xpY3kgZGVjaXNpb24sIG5vdCBhIGRldmljZSBsaW1pdC4KKyAqLworI2RlZmluZSBBUkJFTF9NQVhfUVBTCQk4CisKKy8qKiBCYXNlIHF1ZXVlIHBhaXIgbnVtYmVyICovCisjZGVmaW5lIEFSQkVMX1FQTl9CQVNFIDB4NTUwMDAwCisKKy8qKiBBbiBBcmJlbCBxdWV1ZSBwYWlyICovCitzdHJ1Y3QgYXJiZWxfcXVldWVfcGFpciB7CisJLyoqIFNlbmQgd29yayBxdWV1ZSAqLworCXN0cnVjdCBhcmJlbF9zZW5kX3dvcmtfcXVldWUgc2VuZDsKKwkvKiogUmVjZWl2ZSB3b3JrIHF1ZXVlICovCisJc3RydWN0IGFyYmVsX3JlY3Zfd29ya19xdWV1ZSByZWN2OworfTsKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIGFsbG9jYXRhYmxlIGNvbXBsZXRpb24gcXVldWVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbiwgbm90IGEgZGV2aWNlIGxpbWl0LgorICovCisjZGVmaW5lIEFSQkVMX01BWF9DUVMJCTgKKworLyoqIEFuIEFyYmVsIGNvbXBsZXRpb24gcXVldWUgKi8KK3N0cnVjdCBhcmJlbF9jb21wbGV0aW9uX3F1ZXVlIHsKKwkvKiogQ29uc3VtZXIgY291bnRlciBkb29yYmVsbCByZWNvcmQgbnVtYmVyICovCisJdW5zaWduZWQgaW50IGNpX2Rvb3JiZWxsX2lkeDsKKwkvKiogQXJtIHF1ZXVlIGRvb3JiZWxsIHJlY29yZCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgYXJtX2Rvb3JiZWxsX2lkeDsKKwkvKiogQ29tcGxldGlvbiBxdWV1ZSBlbnRyaWVzICovCisJdW5pb24gYXJiZWxwcm1fY29tcGxldGlvbl9lbnRyeSAqY3FlOworCS8qKiBTaXplIG9mIGNvbXBsZXRpb24gcXVldWUgKi8KKwlzaXplX3QgY3FlX3NpemU7Cit9OworCisvKiogTWF4aW11bSBudW1iZXIgb2YgYWxsb2NhdGFibGUgZXZlbnQgcXVldWVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbiwgbm90IGEgZGV2aWNlIGxpbWl0LgorICovCisjZGVmaW5lIEFSQkVMX01BWF9FUVMJCTY0CisKKy8qKiBBIEFyYmVsIGV2ZW50IHF1ZXVlICovCitzdHJ1Y3QgYXJiZWxfZXZlbnRfcXVldWUgeworCS8qKiBFdmVudCBxdWV1ZSBlbnRyaWVzICovCisJdW5pb24gYXJiZWxwcm1fZXZlbnRfZW50cnkgKmVxZTsKKwkvKiogU2l6ZSBvZiBldmVudCBxdWV1ZSAqLworCXNpemVfdCBlcWVfc2l6ZTsKKwkvKiogRXZlbnQgcXVldWUgbnVtYmVyICovCisJdW5zaWduZWQgbG9uZyBlcW47CisJLyoqIE5leHQgZXZlbnQgcXVldWUgZW50cnkgaW5kZXggKi8KKwl1bnNpZ25lZCBsb25nIG5leHRfaWR4OworCS8qKiBEb29yYmVsbCByZWdpc3RlciAqLworCXZvaWQgKmRvb3JiZWxsOworfTsKKworLyoqIE51bWJlciBvZiBldmVudCBxdWV1ZSBlbnRyaWVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbi4KKyAqLworI2RlZmluZSBBUkJFTF9OVU1fRVFFUwkJNAorCisKKy8qKiBBbiBBcmJlbCByZXNvdXJjZSBiaXRtYXNrICovCit0eXBlZGVmIHVpbnQzMl90IGFyYmVsX2JpdG1hc2tfdDsKKworLyoqIFNpemUgb2YgYW4gQXJiZWwgcmVzb3VyY2UgYml0bWFzayAqLworI2RlZmluZSBBUkJFTF9CSVRNQVNLX1NJWkUobWF4X2VudHJpZXMpCQkJCQkgICAgIFwKKwkoICggKG1heF9lbnRyaWVzKSArICggOCAqIHNpemVvZiAoIGFyYmVsX2JpdG1hc2tfdCApICkgLSAxICkgLwkgICAgIFwKKwkgICggOCAqIHNpemVvZiAoIGFyYmVsX2JpdG1hc2tfdCApICkgKQorCisvKiogQW4gQXJiZWwgZGV2aWNlICovCitzdHJ1Y3QgYXJiZWwgeworCS8qKiBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwl2b2lkICpjb25maWc7CisJLyoqIFBDSSB1c2VyIEFjY2VzcyBSZWdpb24gKi8KKwl2b2lkICp1YXI7CisJLyoqIEV2ZW50IHF1ZXVlIGNvbnN1bWVyIGluZGV4IGRvb3JiZWxscyAqLworCXZvaWQgKmVxX2NpX2Rvb3JiZWxsczsKKworCS8qKiBDb21tYW5kIGlucHV0IG1haWxib3ggKi8KKwl2b2lkICptYWlsYm94X2luOworCS8qKiBDb21tYW5kIG91dHB1dCBtYWlsYm94ICovCisJdm9pZCAqbWFpbGJveF9vdXQ7CisKKwkvKiogRmlybXdhcmUgYXJlYSBpbiBleHRlcm5hbCBtZW1vcnkgKi8KKwl1c2VycHRyX3QgZmlybXdhcmVfYXJlYTsKKwkvKiogSUNNIHNpemUgKi8KKwlzaXplX3QgaWNtX2xlbjsKKwkvKiogSUNNIEFVWCBzaXplICovCisJc2l6ZV90IGljbV9hdXhfbGVuOworCS8qKiBJQ00gYXJlYSAqLworCXVzZXJwdHJfdCBpY207CisKKwkvKiogRXZlbnQgcXVldWUgKi8KKwlzdHJ1Y3QgYXJiZWxfZXZlbnRfcXVldWUgZXE7CisJLyoqIERvb3JiZWxsIHJlY29yZHMgKi8KKwl1bmlvbiBhcmJlbHBybV9kb29yYmVsbF9yZWNvcmQgKmRiX3JlYzsKKwkvKiogUmVzZXJ2ZWQgTEtleQorCSAqCisJICogVXNlZCB0byBnZXQgdW5yZXN0cmljdGVkIG1lbW9yeSBhY2Nlc3MuCisJICovCisJdW5zaWduZWQgbG9uZyByZXNlcnZlZF9sa2V5OworCisJLyoqIENvbXBsZXRpb24gcXVldWUgaW4tdXNlIGJpdG1hc2sgKi8KKwlhcmJlbF9iaXRtYXNrX3QgY3FfaW51c2VbIEFSQkVMX0JJVE1BU0tfU0laRSAoIEFSQkVMX01BWF9DUVMgKSBdOworCS8qKiBRdWV1ZSBwYWlyIGluLXVzZSBiaXRtYXNrICovCisJYXJiZWxfYml0bWFza190IHFwX2ludXNlWyBBUkJFTF9CSVRNQVNLX1NJWkUgKCBBUkJFTF9NQVhfUVBTICkgXTsKKwkKKwkvKiogRGV2aWNlIGxpbWl0cyAqLworCXN0cnVjdCBhcmJlbF9kZXZfbGltaXRzIGxpbWl0czsKKworCS8qKiBJbmZpbmliYW5kIGRldmljZXMgKi8KKwlzdHJ1Y3QgaWJfZGV2aWNlICppYmRldltBUkJFTF9OVU1fUE9SVFNdOworfTsKKworLyoqIEdsb2JhbCBwcm90ZWN0aW9uIGRvbWFpbiAqLworI2RlZmluZSBBUkJFTF9HTE9CQUxfUEQJCQkweDEyMzQ1NgorCisvKiogTWVtb3J5IGtleSBwcmVmaXggKi8KKyNkZWZpbmUgQVJCRUxfTUtFWV9QUkVGSVgJCTB4NzcwMDAwMDBVTAorCisvKgorICogSENBIGNvbW1hbmRzCisgKgorICovCisKKyNkZWZpbmUgQVJCRUxfSENSX0JBU0UJCQkweDgwNjgwCisjZGVmaW5lIEFSQkVMX0hDUl9SRUcoeCkJCSggQVJCRUxfSENSX0JBU0UgKyA0ICogKHgpICkKKyNkZWZpbmUgQVJCRUxfSENSX01BWF9XQUlUX01TCQkyMDAwCisjZGVmaW5lIEFSQkVMX01CT1hfQUxJR04JCTQwOTYKKyNkZWZpbmUgQVJCRUxfTUJPWF9TSVpFCQkJNTEyCisKKy8qIEhDQSBjb21tYW5kIGlzIHNwbGl0IGludG8KKyAqCisgKiBiaXRzICAxMTowCU9wY29kZQorICogYml0ICAgICAxMglJbnB1dCB1c2VzIG1haWxib3gKKyAqIGJpdCAgICAgMTMJT3V0cHV0IHVzZXMgbWFpbGJveAorICogYml0cyAyMjoxNAlJbnB1dCBwYXJhbWV0ZXIgbGVuZ3RoIChpbiBkd29yZHMpCisgKiBiaXRzIDMxOjIzCU91dHB1dCBwYXJhbWV0ZXIgbGVuZ3RoIChpbiBkd29yZHMpCisgKgorICogRW5jb2RpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgd2F5IGFsbG93cyB1cyB0byBjdXQgb3V0IHNldmVyYWwKKyAqIHBhcmFtZXRlcnMgdG8gdGhlIGFyYmVsX2NvbW1hbmQoKSBjYWxsLgorICovCisjZGVmaW5lIEFSQkVMX0hDUl9JTl9NQk9YCQkweDAwMDAxMDAwVUwKKyNkZWZpbmUgQVJCRUxfSENSX09VVF9NQk9YCQkweDAwMDAyMDAwVUwKKyNkZWZpbmUgQVJCRUxfSENSX09QQ09ERSggX2NvbW1hbmQgKQkoIChfY29tbWFuZCkgJiAweGZmZiApCisjZGVmaW5lIEFSQkVMX0hDUl9JTl9MRU4oIF9jb21tYW5kICkJKCAoIChfY29tbWFuZCkgPj4gMTIgKSAmIDB4N2ZjICkKKyNkZWZpbmUgQVJCRUxfSENSX09VVF9MRU4oIF9jb21tYW5kICkJKCAoIChfY29tbWFuZCkgPj4gMjEgKSAmIDB4N2ZjICkKKworLyoqIEJ1aWxkIEhDUiBjb21tYW5kIGZyb20gY29tcG9uZW50IHBhcnRzICovCisjZGVmaW5lIEFSQkVMX0hDUl9JTk9VVF9DTUQoIF9vcGNvZGUsIF9pbl9tYm94LCBfaW5fbGVuLAkJICAgICBcCisJCQkgICAgIF9vdXRfbWJveCwgX291dF9sZW4gKQkJCSAgICAgXAorCSggKF9vcGNvZGUpIHwJCQkJCQkJICAgICBcCisJICAoIChfaW5fbWJveCkgPyBBUkJFTF9IQ1JfSU5fTUJPWCA6IDAgKSB8CQkJICAgICBcCisJICAoICggKF9pbl9sZW4pIC8gNCApIDw8IDE0ICkgfAkJCQkJICAgICBcCisJICAoIChfb3V0X21ib3gpID8gQVJCRUxfSENSX09VVF9NQk9YIDogMCApIHwJCQkgICAgIFwKKwkgICggKCAoX291dF9sZW4pIC8gNCApIDw8IDIzICkgKQorCisjZGVmaW5lIEFSQkVMX0hDUl9JTl9DTUQoIF9vcGNvZGUsIF9pbl9tYm94LCBfaW5fbGVuICkJCQkgICAgIFwKKwlBUkJFTF9IQ1JfSU5PVVRfQ01EICggX29wY29kZSwgX2luX21ib3gsIF9pbl9sZW4sIDAsIDAgKQorCisjZGVmaW5lIEFSQkVMX0hDUl9PVVRfQ01EKCBfb3Bjb2RlLCBfb3V0X21ib3gsIF9vdXRfbGVuICkJCSAgICAgXAorCUFSQkVMX0hDUl9JTk9VVF9DTUQgKCBfb3Bjb2RlLCAwLCAwLCBfb3V0X21ib3gsIF9vdXRfbGVuICkKKworI2RlZmluZSBBUkJFTF9IQ1JfVk9JRF9DTUQoIF9vcGNvZGUgKQkJCQkJICAgICBcCisJQVJCRUxfSENSX0lOT1VUX0NNRCAoIF9vcGNvZGUsIDAsIDAsIDAsIDAgKQorCisvKgorICogRG9vcmJlbGwgcmVjb3JkIGFsbG9jYXRpb24KKyAqCisgKiBUaGUgZG9vcmJlbGwgcmVjb3JkIG1hcCBsb29rcyBsaWtlOgorICoKKyAqICAgIEFSQkVMX01BWF9DUVMgKiBBcm0gY29tcGxldGlvbiBxdWV1ZSBkb29yYmVsbAorICogICAgQVJCRUxfTUFYX1FQUyAqIFNlbmQgd29yayByZXF1ZXN0IGRvb3JiZWxsCisgKiAgICBHcm91cCBzZXBhcmF0b3IKKyAqICAgIC4uLihlbXB0eSBzcGFjZSkuLi4KKyAqICAgIEFSQkVMX01BWF9RUFMgKiBSZWNlaXZlIHdvcmsgcmVxdWVzdCBkb29yYmVsbAorICogICAgQVJCRUxfTUFYX0NRUyAqIENvbXBsZXRpb24gcXVldWUgY29uc3VtZXIgY291bnRlciB1cGRhdGUgZG9vcmJlbGwKKyAqLworCisjZGVmaW5lIEFSQkVMX01BWF9ET09SQkVMTF9SRUNPUkRTIDUxMgorI2RlZmluZSBBUkJFTF9HUk9VUF9TRVBBUkFUT1JfRE9PUkJFTEwgKCBBUkJFTF9NQVhfQ1FTICsgQVJCRUxfTUFYX1FQUyApCisKKy8qKgorICogR2V0IGFybSBjb21wbGV0aW9uIHF1ZXVlIGRvb3JiZWxsIGluZGV4CisgKgorICogQHYgY3FuX29mZnNldAlDb21wbGV0aW9uIHF1ZXVlIG51bWJlciBvZmZzZXQKKyAqIEByZXQgZG9vcmJlbGxfaWR4CURvb3JiZWxsIGluZGV4CisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CithcmJlbF9jcV9hcm1fZG9vcmJlbGxfaWR4ICggdW5zaWduZWQgaW50IGNxbl9vZmZzZXQgKSB7CisJcmV0dXJuIGNxbl9vZmZzZXQ7Cit9CisKKy8qKgorICogR2V0IHNlbmQgd29yayByZXF1ZXN0IGRvb3JiZWxsIGluZGV4CisgKgorICogQHYgcXBuX29mZnNldAlRdWV1ZSBwYWlyIG51bWJlciBvZmZzZXQKKyAqIEByZXQgZG9vcmJlbGxfaWR4CURvb3JiZWxsIGluZGV4CisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CithcmJlbF9zZW5kX2Rvb3JiZWxsX2lkeCAoIHVuc2lnbmVkIGludCBxcG5fb2Zmc2V0ICkgeworCXJldHVybiAoIEFSQkVMX01BWF9DUVMgKyBxcG5fb2Zmc2V0ICk7Cit9CisKKy8qKgorICogR2V0IHJlY2VpdmUgd29yayByZXF1ZXN0IGRvb3JiZWxsIGluZGV4CisgKgorICogQHYgcXBuX29mZnNldAlRdWV1ZSBwYWlyIG51bWJlciBvZmZzZXQKKyAqIEByZXQgZG9vcmJlbGxfaWR4CURvb3JiZWxsIGluZGV4CisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CithcmJlbF9yZWN2X2Rvb3JiZWxsX2lkeCAoIHVuc2lnbmVkIGludCBxcG5fb2Zmc2V0ICkgeworCXJldHVybiAoIEFSQkVMX01BWF9ET09SQkVMTF9SRUNPUkRTIC0gQVJCRUxfTUFYX0NRUyAtIHFwbl9vZmZzZXQgLSAxICk7Cit9CisKKy8qKgorICogR2V0IGNvbXBsZXRpb24gcXVldWUgY29uc3VtZXIgY291bnRlciBkb29yYmVsbCBpbmRleAorICoKKyAqIEB2IGNxbl9vZmZzZXQJQ29tcGxldGlvbiBxdWV1ZSBudW1iZXIgb2Zmc2V0CisgKiBAcmV0IGRvb3JiZWxsX2lkeAlEb29yYmVsbCBpbmRleAorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorYXJiZWxfY3FfY2lfZG9vcmJlbGxfaWR4ICggdW5zaWduZWQgaW50IGNxbl9vZmZzZXQgKSB7CisJcmV0dXJuICggQVJCRUxfTUFYX0RPT1JCRUxMX1JFQ09SRFMgLSBjcW5fb2Zmc2V0IC0gMSApOworfQorCisjZW5kaWYgLyogX0FSQkVMX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9oZXJtb24uYyBiL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9oZXJtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWM5N2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL2hlcm1vbi5jCkBAIC0wLDAgKzEsMjc1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWVsbGFub3ggVGVjaG5vbG9naWVzIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvcGNpYmFja3VwLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL3VtYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2luZmluaWJhbmQuaD4KKyNpbmNsdWRlIDxncHhlL2liX3NtYy5oPgorI2luY2x1ZGUgImhlcm1vbi5oIgorCisvKioKKyAqIEBmaWxlCisgKgorICogTWVsbGFub3ggSGVybW9uIEluZmluaWJhbmQgSENBCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBRdWV1ZSBudW1iZXIgYWxsb2NhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIEFsbG9jYXRlIG9mZnNldHMgd2l0aGluIHVzYWdlIGJpdG1hc2sKKyAqCisgKiBAdiBiaXRzCQlVc2FnZSBiaXRtYXNrCisgKiBAdiBiaXRzX2xlbgkJTGVuZ3RoIG9mIHVzYWdlIGJpdG1hc2sKKyAqIEB2IG51bV9iaXRzCQlOdW1iZXIgb2YgY29udGlndW91cyBiaXRzIHRvIGFsbG9jYXRlIHdpdGhpbiBiaXRtYXNrCisgKiBAcmV0IGJpdAkJRmlyc3QgZnJlZSBiaXQgd2l0aGluIGJpdG1hc2ssIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgaGVybW9uX2JpdG1hc2tfYWxsb2MgKCBoZXJtb25fYml0bWFza190ICpiaXRzLAorCQkJCSAgdW5zaWduZWQgaW50IGJpdHNfbGVuLAorCQkJCSAgdW5zaWduZWQgaW50IG51bV9iaXRzICkgeworCXVuc2lnbmVkIGludCBiaXQgPSAwOworCWhlcm1vbl9iaXRtYXNrX3QgbWFzayA9IDE7CisJdW5zaWduZWQgaW50IGZvdW5kID0gMDsKKworCS8qIFNlYXJjaCBiaXRzIGZvciBudW1fYml0cyBjb250aWd1b3VzIGZyZWUgYml0cyAqLworCXdoaWxlICggYml0IDwgYml0c19sZW4gKSB7CisJCWlmICggKCBtYXNrICYgKmJpdHMgKSA9PSAwICkgeworCQkJaWYgKCArK2ZvdW5kID09IG51bV9iaXRzICkKKwkJCQlnb3RvIGZvdW5kOworCQl9IGVsc2UgeworCQkJZm91bmQgPSAwOworCQl9CisJCWJpdCsrOworCQltYXNrID0gKCBtYXNrIDw8IDEgKSB8ICggbWFzayA+PiAoIDggKiBzaXplb2YgKCBtYXNrICkgLSAxICkgKTsKKwkJaWYgKCBtYXNrID09IDEgKQorCQkJYml0cysrOworCX0KKwlyZXR1cm4gLUVORklMRTsKKworIGZvdW5kOgorCS8qIE1hcmsgYml0cyBhcyBpbi11c2UgKi8KKwlkbyB7CisJCSpiaXRzIHw9IG1hc2s7CisJCWlmICggbWFzayA9PSAxICkKKwkJCWJpdHMtLTsKKwkJbWFzayA9ICggbWFzayA+PiAxICkgfCAoIG1hc2sgPDwgKCA4ICogc2l6ZW9mICggbWFzayApIC0gMSApICk7CisJfSB3aGlsZSAoIC0tZm91bmQgKTsKKworCXJldHVybiAoIGJpdCAtIG51bV9iaXRzICsgMSApOworfQorCisvKioKKyAqIEZyZWUgb2Zmc2V0cyB3aXRoaW4gdXNhZ2UgYml0bWFzaworICoKKyAqIEB2IGJpdHMJCVVzYWdlIGJpdG1hc2sKKyAqIEB2IGJpdAkJU3RhcnRpbmcgYml0IHdpdGhpbiBiaXRtYXNrCisgKiBAdiBudW1fYml0cwkJTnVtYmVyIG9mIGNvbnRpZ3VvdXMgYml0cyB0byBmcmVlIHdpdGhpbiBiaXRtYXNrCisgKi8KK3N0YXRpYyB2b2lkIGhlcm1vbl9iaXRtYXNrX2ZyZWUgKCBoZXJtb25fYml0bWFza190ICpiaXRzLAorCQkJCSAgaW50IGJpdCwgdW5zaWduZWQgaW50IG51bV9iaXRzICkgeworCWhlcm1vbl9iaXRtYXNrX3QgbWFzazsKKworCWZvciAoIDsgbnVtX2JpdHMgOyBiaXQrKywgbnVtX2JpdHMtLSApIHsKKwkJbWFzayA9ICggMSA8PCAoIGJpdCAlICggOCAqIHNpemVvZiAoIG1hc2sgKSApICkgKTsKKwkJYml0c1sgKCBiaXQgLyAoIDggKiBzaXplb2YgKCBtYXNrICkgKSApIF0gJj0gfm1hc2s7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSENBIGNvbW1hbmRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogV2FpdCBmb3IgSGVybW9uIGNvbW1hbmQgY29tcGxldGlvbgorICoKKyAqIEB2IGhlcm1vbgkJSGVybW9uIGRldmljZQorICogQHYgaGNyCQlIQ0EgY29tbWFuZCByZWdpc3RlcnMKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGhlcm1vbl9jbWRfd2FpdCAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwKKwkJCSAgICAgc3RydWN0IGhlcm1vbnBybV9oY2FfY29tbWFuZF9yZWdpc3RlciAqaGNyICkgeworCXVuc2lnbmVkIGludCB3YWl0OworCisJZm9yICggd2FpdCA9IEhFUk1PTl9IQ1JfTUFYX1dBSVRfTVMgOyB3YWl0IDsgd2FpdC0tICkgeworCQloY3ItPnUuZHdvcmRzWzZdID0KKwkJCXJlYWRsICggaGVybW9uLT5jb25maWcgKyBIRVJNT05fSENSX1JFRyAoIDYgKSApOworCQlpZiAoICggTUxYX0dFVCAoIGhjciwgZ28gKSA9PSAwICkgJiYKKwkJICAgICAoIE1MWF9HRVQgKCBoY3IsIHQgKSA9PSBoZXJtb24tPnRvZ2dsZSApICkKKwkJCXJldHVybiAwOworCQltZGVsYXkgKCAxICk7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKKy8qKgorICogSXNzdWUgSENBIGNvbW1hbmQKKyAqCisgKiBAdiBoZXJtb24JCUhlcm1vbiBkZXZpY2UKKyAqIEB2IGNvbW1hbmQJCUNvbW1hbmQgb3Bjb2RlLCBmbGFncyBhbmQgaW5wdXQvb3V0cHV0IGxlbmd0aHMKKyAqIEB2IG9wX21vZAkJT3Bjb2RlIG1vZGlmaWVyICgwIGlmIG5vIG1vZGlmaWVyIGFwcGxpY2FibGUpCisgKiBAdiBpbgkJSW5wdXQgcGFyYW1ldGVycworICogQHYgaW5fbW9kCQlJbnB1dCBtb2RpZmllciAoMCBpZiBubyBtb2RpZmllciBhcHBsaWNhYmxlKQorICogQHYgb3V0CQlPdXRwdXQgcGFyYW1ldGVycworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGVybW9uX2NtZCAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwgdW5zaWduZWQgbG9uZyBjb21tYW5kLAorCQkJdW5zaWduZWQgaW50IG9wX21vZCwgY29uc3Qgdm9pZCAqaW4sCisJCQl1bnNpZ25lZCBpbnQgaW5fbW9kLCB2b2lkICpvdXQgKSB7CisJc3RydWN0IGhlcm1vbnBybV9oY2FfY29tbWFuZF9yZWdpc3RlciBoY3I7CisJdW5zaWduZWQgaW50IG9wY29kZSA9IEhFUk1PTl9IQ1JfT1BDT0RFICggY29tbWFuZCApOworCXNpemVfdCBpbl9sZW4gPSBIRVJNT05fSENSX0lOX0xFTiAoIGNvbW1hbmQgKTsKKwlzaXplX3Qgb3V0X2xlbiA9IEhFUk1PTl9IQ1JfT1VUX0xFTiAoIGNvbW1hbmQgKTsKKwl2b2lkICppbl9idWZmZXI7CisJdm9pZCAqb3V0X2J1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCWFzc2VydCAoIGluX2xlbiA8PSBIRVJNT05fTUJPWF9TSVpFICk7CisJYXNzZXJ0ICggb3V0X2xlbiA8PSBIRVJNT05fTUJPWF9TSVpFICk7CisKKwlEQkdDMiAoIGhlcm1vbiwgIkhlcm1vbiAlcCBjb21tYW5kICUwMnggaW4gJXp4JXMgb3V0ICV6eCVzXG4iLAorCQloZXJtb24sIG9wY29kZSwgaW5fbGVuLAorCQkoICggY29tbWFuZCAmIEhFUk1PTl9IQ1JfSU5fTUJPWCApID8gIihtYm94KSIgOiAiIiApLCBvdXRfbGVuLAorCQkoICggY29tbWFuZCAmIEhFUk1PTl9IQ1JfT1VUX01CT1ggKSA/ICIobWJveCkiIDogIiIgKSApOworCisJLyogQ2hlY2sgdGhhdCBIQ1IgaXMgZnJlZSAqLworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfd2FpdCAoIGhlcm1vbiwgJmhjciApICkgIT0gMCApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBjb21tYW5kIGludGVyZmFjZSBsb2NrZWRcbiIsCisJCSAgICAgICBoZXJtb24gKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEZsaXAgSENSIHRvZ2dsZSAqLworCWhlcm1vbi0+dG9nZ2xlID0gKCAxIC0gaGVybW9uLT50b2dnbGUgKTsKKworCS8qIFByZXBhcmUgSENSICovCisJbWVtc2V0ICggJmhjciwgMCwgc2l6ZW9mICggaGNyICkgKTsKKwlpbl9idWZmZXIgPSAmaGNyLnUuZHdvcmRzWzBdOworCWlmICggaW5fbGVuICYmICggY29tbWFuZCAmIEhFUk1PTl9IQ1JfSU5fTUJPWCApICkgeworCQlpbl9idWZmZXIgPSBoZXJtb24tPm1haWxib3hfaW47CisJCU1MWF9GSUxMXzEgKCAmaGNyLCAxLCBpbl9wYXJhbV9sLCB2aXJ0X3RvX2J1cyAoIGluX2J1ZmZlciApICk7CisJfQorCW1lbWNweSAoIGluX2J1ZmZlciwgaW4sIGluX2xlbiApOworCU1MWF9GSUxMXzEgKCAmaGNyLCAyLCBpbnB1dF9tb2RpZmllciwgaW5fbW9kICk7CisJb3V0X2J1ZmZlciA9ICZoY3IudS5kd29yZHNbM107CisJaWYgKCBvdXRfbGVuICYmICggY29tbWFuZCAmIEhFUk1PTl9IQ1JfT1VUX01CT1ggKSApIHsKKwkJb3V0X2J1ZmZlciA9IGhlcm1vbi0+bWFpbGJveF9vdXQ7CisJCU1MWF9GSUxMXzEgKCAmaGNyLCA0LCBvdXRfcGFyYW1fbCwKKwkJCSAgICAgdmlydF90b19idXMgKCBvdXRfYnVmZmVyICkgKTsKKwl9CisJTUxYX0ZJTExfNCAoICZoY3IsIDYsCisJCSAgICAgb3Bjb2RlLCBvcGNvZGUsCisJCSAgICAgb3Bjb2RlX21vZGlmaWVyLCBvcF9tb2QsCisJCSAgICAgZ28sIDEsCisJCSAgICAgdCwgaGVybW9uLT50b2dnbGUgKTsKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGlzc3VpbmcgY29tbWFuZCAlMDR4XG4iLAorCSAgICAgICBoZXJtb24sIG9wY29kZSApOworCURCR0MyX0hEQSAoIGhlcm1vbiwgdmlydF90b19waHlzICggaGVybW9uLT5jb25maWcgKyBIRVJNT05fSENSX0JBU0UgKSwKKwkJICAgICZoY3IsIHNpemVvZiAoIGhjciApICk7CisJaWYgKCBpbl9sZW4gJiYgKCBjb21tYW5kICYgSEVSTU9OX0hDUl9JTl9NQk9YICkgKSB7CisJCURCR0MyICggaGVybW9uLCAiSW5wdXQgbWFpbGJveDpcbiIgKTsKKwkJREJHQzJfSERBICggaGVybW9uLCB2aXJ0X3RvX3BoeXMgKCBpbl9idWZmZXIgKSwgaW5fYnVmZmVyLAorCQkJICAgICggKCBpbl9sZW4gPCA1MTIgKSA/IGluX2xlbiA6IDUxMiApICk7CisJfQorCisJLyogSXNzdWUgY29tbWFuZCAqLworCWZvciAoIGkgPSAwIDsgaSA8ICggc2l6ZW9mICggaGNyICkgLyBzaXplb2YgKCBoY3IudS5kd29yZHNbMF0gKSApIDsKKwkgICAgICBpKysgKSB7CisJCXdyaXRlbCAoIGhjci51LmR3b3Jkc1tpXSwKKwkJCSBoZXJtb24tPmNvbmZpZyArIEhFUk1PTl9IQ1JfUkVHICggaSApICk7CisJCWJhcnJpZXIoKTsKKwl9CisKKwkvKiBXYWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24gKi8KKwlpZiAoICggcmMgPSBoZXJtb25fY21kX3dhaXQgKCBoZXJtb24sICZoY3IgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgdGltZWQgb3V0IHdhaXRpbmcgZm9yIGNvbW1hbmQ6XG4iLAorCQkgICAgICAgaGVybW9uICk7CisJCURCR0NfSERBICggaGVybW9uLAorCQkJICAgdmlydF90b19waHlzICggaGVybW9uLT5jb25maWcgKyBIRVJNT05fSENSX0JBU0UgKSwKKwkJCSAgICZoY3IsIHNpemVvZiAoIGhjciApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBDaGVjayBjb21tYW5kIHN0YXR1cyAqLworCXN0YXR1cyA9IE1MWF9HRVQgKCAmaGNyLCBzdGF0dXMgKTsKKwlpZiAoIHN0YXR1cyAhPSAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGNvbW1hbmQgZmFpbGVkIHdpdGggc3RhdHVzICUwMng6XG4iLAorCQkgICAgICAgaGVybW9uLCBzdGF0dXMgKTsKKwkJREJHQ19IREEgKCBoZXJtb24sCisJCQkgICB2aXJ0X3RvX3BoeXMgKCBoZXJtb24tPmNvbmZpZyArIEhFUk1PTl9IQ1JfQkFTRSApLAorCQkJICAgJmhjciwgc2l6ZW9mICggaGNyICkgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogUmVhZCBvdXRwdXQgcGFyYW1ldGVycywgaWYgYW55ICovCisJaGNyLnUuZHdvcmRzWzNdID0gcmVhZGwgKCBoZXJtb24tPmNvbmZpZyArIEhFUk1PTl9IQ1JfUkVHICggMyApICk7CisJaGNyLnUuZHdvcmRzWzRdID0gcmVhZGwgKCBoZXJtb24tPmNvbmZpZyArIEhFUk1PTl9IQ1JfUkVHICggNCApICk7CisJbWVtY3B5ICggb3V0LCBvdXRfYnVmZmVyLCBvdXRfbGVuICk7CisJaWYgKCBvdXRfbGVuICkgeworCQlEQkdDMiAoIGhlcm1vbiwgIk91dHB1dCVzOlxuIiwKKwkJCSggY29tbWFuZCAmIEhFUk1PTl9IQ1JfT1VUX01CT1ggKSA/ICIgbWFpbGJveCIgOiAiIiApOworCQlEQkdDMl9IREEgKCBoZXJtb24sIHZpcnRfdG9fcGh5cyAoIG91dF9idWZmZXIgKSwgb3V0X2J1ZmZlciwKKwkJCSAgICAoICggb3V0X2xlbiA8IDUxMiApID8gb3V0X2xlbiA6IDUxMiApICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX3F1ZXJ5X2Rldl9jYXAgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sCisJCQkgICBzdHJ1Y3QgaGVybW9ucHJtX3F1ZXJ5X2Rldl9jYXAgKmRldl9jYXAgKSB7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9PVVRfQ01EICggSEVSTU9OX0hDUl9RVUVSWV9ERVZfQ0FQLAorCQkJCQkJIDEsIHNpemVvZiAoICpkZXZfY2FwICkgKSwKKwkJCSAgICAwLCBOVUxMLCAwLCBkZXZfY2FwICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX3F1ZXJ5X2Z3ICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCBzdHJ1Y3QgaGVybW9ucHJtX3F1ZXJ5X2Z3ICpmdyApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX09VVF9DTUQgKCBIRVJNT05fSENSX1FVRVJZX0ZXLAorCQkJCQkJIDEsIHNpemVvZiAoICpmdyApICksCisJCQkgICAgMCwgTlVMTCwgMCwgZncgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfaW5pdF9oY2EgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sCisJCSAgICAgIGNvbnN0IHN0cnVjdCBoZXJtb25wcm1faW5pdF9oY2EgKmluaXRfaGNhICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfSU5fQ01EICggSEVSTU9OX0hDUl9JTklUX0hDQSwKKwkJCQkJCTEsIHNpemVvZiAoICppbml0X2hjYSApICksCisJCQkgICAgMCwgaW5pdF9oY2EsIDAsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfY2xvc2VfaGNhICggc3RydWN0IGhlcm1vbiAqaGVybW9uICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfVk9JRF9DTUQgKCBIRVJNT05fSENSX0NMT1NFX0hDQSApLAorCQkJICAgIDAsIE5VTEwsIDAsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfaW5pdF9wb3J0ICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBpbnQgcG9ydCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBoZXJtb25wcm1faW5pdF9wb3J0ICppbml0X3BvcnQgKSB7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9JTl9DTUQgKCBIRVJNT05fSENSX0lOSVRfUE9SVCwKKwkJCQkJCTEsIHNpemVvZiAoICppbml0X3BvcnQgKSApLAorCQkJICAgIDAsIGluaXRfcG9ydCwgcG9ydCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAoraGVybW9uX2NtZF9jbG9zZV9wb3J0ICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBpbnQgcG9ydCApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX1ZPSURfQ01EICggSEVSTU9OX0hDUl9DTE9TRV9QT1JUICksCisJCQkgICAgMCwgTlVMTCwgcG9ydCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAoraGVybW9uX2NtZF9zdzJod19tcHQgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sIHVuc2lnbmVkIGludCBpbmRleCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBoZXJtb25wcm1fbXB0ICptcHQgKSB7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9JTl9DTUQgKCBIRVJNT05fSENSX1NXMkhXX01QVCwKKwkJCQkJCTEsIHNpemVvZiAoICptcHQgKSApLAorCQkJICAgIDAsIG1wdCwgaW5kZXgsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfd3JpdGVfbXR0ICggc3RydWN0IGhlcm1vbiAqaGVybW9uLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGhlcm1vbnBybV93cml0ZV9tdHQgKndyaXRlX210dCApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX0lOX0NNRCAoIEhFUk1PTl9IQ1JfV1JJVEVfTVRULAorCQkJCQkJMSwgc2l6ZW9mICggKndyaXRlX210dCApICksCisJCQkgICAgMCwgd3JpdGVfbXR0LCAxLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX21hcF9lcSAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwgdW5zaWduZWQgbG9uZyBpbmRleF9tYXAsCisJCSAgICBjb25zdCBzdHJ1Y3QgaGVybW9ucHJtX2V2ZW50X21hc2sgKm1hc2sgKSB7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9JTl9DTUQgKCBIRVJNT05fSENSX01BUF9FUSwKKwkJCQkJCTAsIHNpemVvZiAoICptYXNrICkgKSwKKwkJCSAgICAwLCBtYXNrLCBpbmRleF9tYXAsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfc3cyaHdfZXEgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sIHVuc2lnbmVkIGludCBpbmRleCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGhlcm1vbnBybV9lcWMgKmVxY3R4ICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfSU5fQ01EICggSEVSTU9OX0hDUl9TVzJIV19FUSwKKwkJCQkJCTEsIHNpemVvZiAoICplcWN0eCApICksCisJCQkgICAgMCwgZXFjdHgsIGluZGV4LCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX2h3MnN3X2VxICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCSAgICAgIHN0cnVjdCBoZXJtb25wcm1fZXFjICplcWN0eCApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX09VVF9DTUQgKCBIRVJNT05fSENSX0hXMlNXX0VRLAorCQkJCQkJIDEsIHNpemVvZiAoICplcWN0eCApICksCisJCQkgICAgMSwgTlVMTCwgaW5kZXgsIGVxY3R4ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX3F1ZXJ5X2VxICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCSAgICAgIHN0cnVjdCBoZXJtb25wcm1fZXFjICplcWN0eCApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX09VVF9DTUQgKCBIRVJNT05fSENSX1FVRVJZX0VRLAorCQkJCQkJIDEsIHNpemVvZiAoICplcWN0eCApICksCisJCQkgICAgMCwgTlVMTCwgaW5kZXgsIGVxY3R4ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX3N3Mmh3X2NxICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBsb25nIGNxbiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGhlcm1vbnBybV9jb21wbGV0aW9uX3F1ZXVlX2NvbnRleHQgKmNxY3R4ICl7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9JTl9DTUQgKCBIRVJNT05fSENSX1NXMkhXX0NRLAorCQkJCQkJMSwgc2l6ZW9mICggKmNxY3R4ICkgKSwKKwkJCSAgICAwLCBjcWN0eCwgY3FuLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX2h3MnN3X2NxICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBsb25nIGNxbiwKKwkJICAgICAgc3RydWN0IGhlcm1vbnBybV9jb21wbGV0aW9uX3F1ZXVlX2NvbnRleHQgKmNxY3R4KSB7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9PVVRfQ01EICggSEVSTU9OX0hDUl9IVzJTV19DUSwKKwkJCQkJCSAxLCBzaXplb2YgKCAqY3FjdHggKSApLAorCQkJICAgIDAsIE5VTEwsIGNxbiwgY3FjdHggKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfcnN0MmluaXRfcXAgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sIHVuc2lnbmVkIGxvbmcgcXBuLAorCQkJIGNvbnN0IHN0cnVjdCBoZXJtb25wcm1fcXBfZWVfc3RhdGVfdHJhbnNpdGlvbnMgKmN0eCApeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfSU5fQ01EICggSEVSTU9OX0hDUl9SU1QySU5JVF9RUCwKKwkJCQkJCTEsIHNpemVvZiAoICpjdHggKSApLAorCQkJICAgIDAsIGN0eCwgcXBuLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX2luaXQycnRyX3FwICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBsb25nIHFwbiwKKwkJCSBjb25zdCBzdHJ1Y3QgaGVybW9ucHJtX3FwX2VlX3N0YXRlX3RyYW5zaXRpb25zICpjdHggKXsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX0lOX0NNRCAoIEhFUk1PTl9IQ1JfSU5JVDJSVFJfUVAsCisJCQkJCQkxLCBzaXplb2YgKCAqY3R4ICkgKSwKKwkJCSAgICAwLCBjdHgsIHFwbiwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAoraGVybW9uX2NtZF9ydHIycnRzX3FwICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBsb25nIHFwbiwKKwkJCWNvbnN0IHN0cnVjdCBoZXJtb25wcm1fcXBfZWVfc3RhdGVfdHJhbnNpdGlvbnMgKmN0eCApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX0lOX0NNRCAoIEhFUk1PTl9IQ1JfUlRSMlJUU19RUCwKKwkJCQkJCTEsIHNpemVvZiAoICpjdHggKSApLAorCQkJICAgIDAsIGN0eCwgcXBuLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX3J0czJydHNfcXAgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sIHVuc2lnbmVkIGxvbmcgcXBuLAorCQkJY29uc3Qgc3RydWN0IGhlcm1vbnBybV9xcF9lZV9zdGF0ZV90cmFuc2l0aW9ucyAqY3R4ICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfSU5fQ01EICggSEVSTU9OX0hDUl9SVFMyUlRTX1FQLAorCQkJCQkJMSwgc2l6ZW9mICggKmN0eCApICksCisJCQkgICAgMCwgY3R4LCBxcG4sIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfMnJzdF9xcCAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwgdW5zaWduZWQgbG9uZyBxcG4gKSB7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9WT0lEX0NNRCAoIEhFUk1PTl9IQ1JfMlJTVF9RUCApLAorCQkJICAgIDB4MDMsIE5VTEwsIHFwbiwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAoraGVybW9uX2NtZF9xdWVyeV9xcCAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwgdW5zaWduZWQgbG9uZyBxcG4sCisJCSAgICAgIHN0cnVjdCBoZXJtb25wcm1fcXBfZWVfc3RhdGVfdHJhbnNpdGlvbnMgKmN0eCApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX09VVF9DTUQgKCBIRVJNT05fSENSX1FVRVJZX1FQLAorCQkJCQkJIDEsIHNpemVvZiAoICpjdHggKSApLAorCQkJICAgIDAsIE5VTEwsIHFwbiwgY3R4ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX2NvbmZfc3BlY2lhbF9xcCAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwgdW5zaWduZWQgaW50IGludGVybmFsX3FwcywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBiYXNlX3FwbiApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX1ZPSURfQ01EICggSEVSTU9OX0hDUl9DT05GX1NQRUNJQUxfUVAgKSwKKwkJCSAgICBpbnRlcm5hbF9xcHMsIE5VTEwsIGJhc2VfcXBuLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX21hZF9pZmMgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sIHVuc2lnbmVkIGludCBwb3J0LAorCQkgICAgIHVuaW9uIGhlcm1vbnBybV9tYWQgKm1hZCApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX0lOT1VUX0NNRCAoIEhFUk1PTl9IQ1JfTUFEX0lGQywKKwkJCQkJCSAgIDEsIHNpemVvZiAoICptYWQgKSwKKwkJCQkJCSAgIDEsIHNpemVvZiAoICptYWQgKSApLAorCQkJICAgIDB4MDMsIG1hZCwgcG9ydCwgbWFkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX3JlYWRfbWNnICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCSAgICAgIHN0cnVjdCBoZXJtb25wcm1fbWNnX2VudHJ5ICptY2cgKSB7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9PVVRfQ01EICggSEVSTU9OX0hDUl9SRUFEX01DRywKKwkJCQkJCSAxLCBzaXplb2YgKCAqbWNnICkgKSwKKwkJCSAgICAwLCBOVUxMLCBpbmRleCwgbWNnICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX3dyaXRlX21jZyAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwgdW5zaWduZWQgaW50IGluZGV4LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGhlcm1vbnBybV9tY2dfZW50cnkgKm1jZyApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKwkJCSAgICBIRVJNT05fSENSX0lOX0NNRCAoIEhFUk1PTl9IQ1JfV1JJVEVfTUNHLAorCQkJCQkJMSwgc2l6ZW9mICggKm1jZyApICksCisJCQkgICAgMCwgbWNnLCBpbmRleCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAoraGVybW9uX2NtZF9tZ2lkX2hhc2ggKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sIGNvbnN0IHN0cnVjdCBpYl9naWQgKmdpZCwKKwkJICAgICAgIHN0cnVjdCBoZXJtb25wcm1fbWdtX2hhc2ggKmhhc2ggKSB7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9JTk9VVF9DTUQgKCBIRVJNT05fSENSX01HSURfSEFTSCwKKwkJCQkJCSAgIDEsIHNpemVvZiAoICpnaWQgKSwKKwkJCQkJCSAgIDAsIHNpemVvZiAoICpoYXNoICkgKSwKKwkJCSAgICAwLCBnaWQsIDAsIGhhc2ggKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfcnVuX2Z3ICggc3RydWN0IGhlcm1vbiAqaGVybW9uICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfVk9JRF9DTUQgKCBIRVJNT05fSENSX1JVTl9GVyApLAorCQkJICAgIDAsIE5VTEwsIDAsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfdW5tYXBfaWNtICggc3RydWN0IGhlcm1vbiAqaGVybW9uLCB1bnNpZ25lZCBpbnQgcGFnZV9jb3VudCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBoZXJtb25wcm1fc2NhbGFyX3BhcmFtZXRlciAqb2Zmc2V0ICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfSU5fQ01EICggSEVSTU9OX0hDUl9VTk1BUF9JQ00sCisJCQkJCQkwLCBzaXplb2YgKCAqb2Zmc2V0ICkgKSwKKwkJCSAgICAwLCBvZmZzZXQsIHBhZ2VfY291bnQsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfbWFwX2ljbSAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgaGVybW9ucHJtX3ZpcnR1YWxfcGh5c2ljYWxfbWFwcGluZyAqbWFwICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfSU5fQ01EICggSEVSTU9OX0hDUl9NQVBfSUNNLAorCQkJCQkJMSwgc2l6ZW9mICggKm1hcCApICksCisJCQkgICAgMCwgbWFwLCAxLCBOVUxMICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX3VubWFwX2ljbV9hdXggKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24gKSB7CisJcmV0dXJuIGhlcm1vbl9jbWQgKCBoZXJtb24sCisJCQkgICAgSEVSTU9OX0hDUl9WT0lEX0NNRCAoIEhFUk1PTl9IQ1JfVU5NQVBfSUNNX0FVWCApLAorCQkJICAgIDAsIE5VTEwsIDAsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfbWFwX2ljbV9hdXggKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaGVybW9ucHJtX3ZpcnR1YWxfcGh5c2ljYWxfbWFwcGluZyAqbWFwICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfSU5fQ01EICggSEVSTU9OX0hDUl9NQVBfSUNNX0FVWCwKKwkJCQkJCTEsIHNpemVvZiAoICptYXAgKSApLAorCQkJICAgIDAsIG1hcCwgMSwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAoraGVybW9uX2NtZF9zZXRfaWNtX3NpemUgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sCisJCQkgIGNvbnN0IHN0cnVjdCBoZXJtb25wcm1fc2NhbGFyX3BhcmFtZXRlciAqaWNtX3NpemUsCisJCQkgIHN0cnVjdCBoZXJtb25wcm1fc2NhbGFyX3BhcmFtZXRlciAqaWNtX2F1eF9zaXplICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfSU5PVVRfQ01EICggSEVSTU9OX0hDUl9TRVRfSUNNX1NJWkUsCisJCQkJCQkgICAwLCBzaXplb2YgKCAqaWNtX3NpemUgKSwKKwkJCQkJCSAgIDAsIHNpemVvZiAoKmljbV9hdXhfc2l6ZSkgKSwKKwkJCSAgICAwLCBpY21fc2l6ZSwgMCwgaWNtX2F1eF9zaXplICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtb25fY21kX3VubWFwX2ZhICggc3RydWN0IGhlcm1vbiAqaGVybW9uICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfVk9JRF9DTUQgKCBIRVJNT05fSENSX1VOTUFQX0ZBICksCisJCQkgICAgMCwgTlVMTCwgMCwgTlVMTCApOworfQorCitzdGF0aWMgaW5saW5lIGludAoraGVybW9uX2NtZF9tYXBfZmEgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24sCisJCSAgICBjb25zdCBzdHJ1Y3QgaGVybW9ucHJtX3ZpcnR1YWxfcGh5c2ljYWxfbWFwcGluZyAqbWFwICkgeworCXJldHVybiBoZXJtb25fY21kICggaGVybW9uLAorCQkJICAgIEhFUk1PTl9IQ1JfSU5fQ01EICggSEVSTU9OX0hDUl9NQVBfRkEsCisJCQkJCQkxLCBzaXplb2YgKCAqbWFwICkgKSwKKwkJCSAgICAwLCBtYXAsIDEsIE5VTEwgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hlcm1vbl9jbWRfc2Vuc2VfcG9ydCAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwgdW5zaWduZWQgaW50IHBvcnQsCisJCQlzdHJ1Y3QgaGVybW9ucHJtX3NlbnNlX3BvcnQgKnBvcnRfdHlwZSApIHsKKwlyZXR1cm4gaGVybW9uX2NtZCAoIGhlcm1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVJNT05fSENSX09VVF9DTUQgKCBIRVJNT05fSENSX1NFTlNFX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgc2l6ZW9mICggKnBvcnRfdHlwZSApICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgcG9ydCwgcG9ydF90eXBlICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1lbW9yeSB0cmFuc2xhdGlvbiB0YWJsZSBvcGVyYXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQWxsb2NhdGUgTVRUIGVudHJpZXMKKyAqCisgKiBAdiBoZXJtb24JCUhlcm1vbiBkZXZpY2UKKyAqIEB2IG1lbW9yeQkJTWVtb3J5IHRvIG1hcCBpbnRvIE1UVAorICogQHYgbGVuCQlMZW5ndGggb2YgbWVtb3J5IHRvIG1hcAorICogQHYgbXR0CQlNVFQgZGVzY3JpcHRvciB0byBmaWxsIGluCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBoZXJtb25fYWxsb2NfbXR0ICggc3RydWN0IGhlcm1vbiAqaGVybW9uLAorCQkJICAgICAgY29uc3Qgdm9pZCAqbWVtb3J5LCBzaXplX3QgbGVuLAorCQkJICAgICAgc3RydWN0IGhlcm1vbl9tdHQgKm10dCApIHsKKwlzdHJ1Y3QgaGVybW9ucHJtX3dyaXRlX210dCB3cml0ZV9tdHQ7CisJcGh5c2FkZHJfdCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgcGFnZV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IG51bV9wYWdlczsKKwlpbnQgbXR0X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgbXR0X2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmM7CisKKwkvKiBGaW5kIGF2YWlsYWJsZSBNVFQgZW50cmllcyAqLworCXN0YXJ0ID0gdmlydF90b19waHlzICggbWVtb3J5ICk7CisJcGFnZV9vZmZzZXQgPSAoIHN0YXJ0ICYgKCBIRVJNT05fUEFHRV9TSVpFIC0gMSApICk7CisJc3RhcnQgLT0gcGFnZV9vZmZzZXQ7CisJbGVuICs9IHBhZ2Vfb2Zmc2V0OworCW51bV9wYWdlcyA9ICggKCBsZW4gKyBIRVJNT05fUEFHRV9TSVpFIC0gMSApIC8gSEVSTU9OX1BBR0VfU0laRSApOworCW10dF9vZmZzZXQgPSBoZXJtb25fYml0bWFza19hbGxvYyAoIGhlcm1vbi0+bXR0X2ludXNlLCBIRVJNT05fTUFYX01UVFMsCisJCQkJCSAgICBudW1fcGFnZXMgKTsKKwlpZiAoIG10dF9vZmZzZXQgPCAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBNVFQgZW50cmllc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgbnVtX3BhZ2VzICk7CisJCXJjID0gbXR0X29mZnNldDsKKwkJZ290byBlcnJfbXR0X29mZnNldDsKKwl9CisJbXR0X2Jhc2VfYWRkciA9ICggKCBoZXJtb24tPmNhcC5yZXNlcnZlZF9tdHRzICsgbXR0X29mZnNldCApICoKKwkJCSAgaGVybW9uLT5jYXAubXR0X2VudHJ5X3NpemUgKTsKKworCS8qIEZpbGwgaW4gTVRUIHN0cnVjdHVyZSAqLworCW10dC0+bXR0X29mZnNldCA9IG10dF9vZmZzZXQ7CisJbXR0LT5udW1fcGFnZXMgPSBudW1fcGFnZXM7CisJbXR0LT5tdHRfYmFzZV9hZGRyID0gbXR0X2Jhc2VfYWRkcjsKKwltdHQtPnBhZ2Vfb2Zmc2V0ID0gcGFnZV9vZmZzZXQ7CisKKwkvKiBDb25zdHJ1Y3QgYW5kIGlzc3VlIFdSSVRFX01UVCBjb21tYW5kcyAqLworCWZvciAoIGkgPSAwIDsgaSA8IG51bV9wYWdlcyA7IGkrKyApIHsKKwkJbWVtc2V0ICggJndyaXRlX210dCwgMCwgc2l6ZW9mICggd3JpdGVfbXR0ICkgKTsKKwkJTUxYX0ZJTExfMSAoICZ3cml0ZV9tdHQubXR0X2Jhc2VfYWRkciwgMSwKKwkJCSAgICAgdmFsdWUsIG10dF9iYXNlX2FkZHIgKTsKKwkJTUxYX0ZJTExfMiAoICZ3cml0ZV9tdHQubXR0LCAxLAorCQkJICAgICBwLCAxLAorCQkJICAgICBwdGFnX2wsICggc3RhcnQgPj4gMyApICk7CisJCWlmICggKCByYyA9IGhlcm1vbl9jbWRfd3JpdGVfbXR0ICggaGVybW9uLAorCQkJCQkJICAgJndyaXRlX210dCApICkgIT0gMCApIHsKKwkJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IHdyaXRlIE1UVCBhdCAleFxuIiwKKwkJCSAgICAgICBoZXJtb24sIG10dF9iYXNlX2FkZHIgKTsKKwkJCWdvdG8gZXJyX3dyaXRlX210dDsKKwkJfQorCQlzdGFydCArPSBIRVJNT05fUEFHRV9TSVpFOworCQltdHRfYmFzZV9hZGRyICs9IGhlcm1vbi0+Y2FwLm10dF9lbnRyeV9zaXplOworCX0KKworCXJldHVybiAwOworCisgZXJyX3dyaXRlX210dDoKKwloZXJtb25fYml0bWFza19mcmVlICggaGVybW9uLT5tdHRfaW51c2UsIG10dF9vZmZzZXQsIG51bV9wYWdlcyApOworIGVycl9tdHRfb2Zmc2V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBGcmVlIE1UVCBlbnRyaWVzCisgKgorICogQHYgaGVybW9uCQlIZXJtb24gZGV2aWNlCisgKiBAdiBtdHQJCU1UVCBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyB2b2lkIGhlcm1vbl9mcmVlX210dCAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwKKwkJCSAgICAgIHN0cnVjdCBoZXJtb25fbXR0ICptdHQgKSB7CisJaGVybW9uX2JpdG1hc2tfZnJlZSAoIGhlcm1vbi0+bXR0X2ludXNlLCBtdHQtPm10dF9vZmZzZXQsCisJCQkgICAgICBtdHQtPm51bV9wYWdlcyApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTUFEIG9wZXJhdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBJc3N1ZSBtYW5hZ2VtZW50IGRhdGFncmFtCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtYWQJCU1hbmFnZW1lbnQgZGF0YWdyYW0KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGhlcm1vbl9tYWQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgdW5pb24gaWJfbWFkICptYWQgKSB7CisJc3RydWN0IGhlcm1vbiAqaGVybW9uID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXVuaW9uIGhlcm1vbnBybV9tYWQgbWFkX2lmYzsKKwlpbnQgcmM7CisKKwlsaW5rZXJfYXNzZXJ0ICggc2l6ZW9mICggKm1hZCApID09IHNpemVvZiAoIG1hZF9pZmMubWFkICksCisJCQltYWRfc2l6ZV9taXNtYXRjaCApOworCisJLyogQ29weSBpbiByZXF1ZXN0IHBhY2tldCAqLworCW1lbWNweSAoICZtYWRfaWZjLm1hZCwgbWFkLCBzaXplb2YgKCBtYWRfaWZjLm1hZCApICk7CisKKwkvKiBJc3N1ZSBNQUQgKi8KKwlpZiAoICggcmMgPSBoZXJtb25fY21kX21hZF9pZmMgKCBoZXJtb24sIGliZGV2LT5wb3J0LAorCQkJCQkgJm1hZF9pZmMgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IGlzc3VlIE1BRCBJRkM6ICVzXG4iLAorCQkgICAgICAgaGVybW9uLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIENvcHkgb3V0IHJlcGx5IHBhY2tldCAqLworCW1lbWNweSAoIG1hZCwgJm1hZF9pZmMubWFkLCBzaXplb2YgKCAqbWFkICkgKTsKKworCWlmICggbWFkLT5oZHIuc3RhdHVzICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgTUFEIElGQyBzdGF0dXMgJTA0eFxuIiwKKwkJICAgICAgIGhlcm1vbiwgbnRvaHMgKCBtYWQtPmhkci5zdGF0dXMgKSApOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb21wbGV0aW9uIHF1ZXVlIG9wZXJhdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBDcmVhdGUgY29tcGxldGlvbiBxdWV1ZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgY3EJCUNvbXBsZXRpb24gcXVldWUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGhlcm1vbl9jcmVhdGVfY3EgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgIHN0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlICpjcSApIHsKKwlzdHJ1Y3QgaGVybW9uICpoZXJtb24gPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGhlcm1vbl9jb21wbGV0aW9uX3F1ZXVlICpoZXJtb25fY3E7CisJc3RydWN0IGhlcm1vbnBybV9jb21wbGV0aW9uX3F1ZXVlX2NvbnRleHQgY3FjdHg7CisJaW50IGNxbl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjOworCisJLyogRmluZCBhIGZyZWUgY29tcGxldGlvbiBxdWV1ZSBudW1iZXIgKi8KKwljcW5fb2Zmc2V0ID0gaGVybW9uX2JpdG1hc2tfYWxsb2MgKCBoZXJtb24tPmNxX2ludXNlLAorCQkJCQkgICAgSEVSTU9OX01BWF9DUVMsIDEgKTsKKwlpZiAoIGNxbl9vZmZzZXQgPCAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIG91dCBvZiBjb21wbGV0aW9uIHF1ZXVlc1xuIiwKKwkJICAgICAgIGhlcm1vbiApOworCQlyYyA9IGNxbl9vZmZzZXQ7CisJCWdvdG8gZXJyX2Nxbl9vZmZzZXQ7CisJfQorCWNxLT5jcW4gPSAoIGhlcm1vbi0+Y2FwLnJlc2VydmVkX2NxcyArIGNxbl9vZmZzZXQgKTsKKworCS8qIEFsbG9jYXRlIGNvbnRyb2wgc3RydWN0dXJlcyAqLworCWhlcm1vbl9jcSA9IHphbGxvYyAoIHNpemVvZiAoICpoZXJtb25fY3EgKSApOworCWlmICggISBoZXJtb25fY3EgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfaGVybW9uX2NxOworCX0KKworCS8qIEFsbG9jYXRlIGNvbXBsZXRpb24gcXVldWUgaXRzZWxmICovCisJaGVybW9uX2NxLT5jcWVfc2l6ZSA9ICggY3EtPm51bV9jcWVzICogc2l6ZW9mICggaGVybW9uX2NxLT5jcWVbMF0gKSApOworCWhlcm1vbl9jcS0+Y3FlID0gbWFsbG9jX2RtYSAoIGhlcm1vbl9jcS0+Y3FlX3NpemUsCisJCQkJICAgICAgc2l6ZW9mICggaGVybW9uX2NxLT5jcWVbMF0gKSApOworCWlmICggISBoZXJtb25fY3EtPmNxZSApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9jcWU7CisJfQorCW1lbXNldCAoIGhlcm1vbl9jcS0+Y3FlLCAwLCBoZXJtb25fY3EtPmNxZV9zaXplICk7CisJZm9yICggaSA9IDAgOyBpIDwgY3EtPm51bV9jcWVzIDsgaSsrICkgeworCQlNTFhfRklMTF8xICggJmhlcm1vbl9jcS0+Y3FlW2ldLm5vcm1hbCwgNywgb3duZXIsIDEgKTsKKwl9CisJYmFycmllcigpOworCisJLyogQWxsb2NhdGUgTVRUIGVudHJpZXMgKi8KKwlpZiAoICggcmMgPSBoZXJtb25fYWxsb2NfbXR0ICggaGVybW9uLCBoZXJtb25fY3EtPmNxZSwKKwkJCQkgICAgICAgaGVybW9uX2NxLT5jcWVfc2l6ZSwKKwkJCQkgICAgICAgJmhlcm1vbl9jcS0+bXR0ICkgKSAhPSAwICkKKwkJZ290byBlcnJfYWxsb2NfbXR0OworCisJLyogSGFuZCBxdWV1ZSBvdmVyIHRvIGhhcmR3YXJlICovCisJbWVtc2V0ICggJmNxY3R4LCAwLCBzaXplb2YgKCBjcWN0eCApICk7CisJTUxYX0ZJTExfMSAoICZjcWN0eCwgMCwgc3QsIDB4YSAvKiAiRXZlbnQgZmlyZWQiICovICk7CisJTUxYX0ZJTExfMSAoICZjcWN0eCwgMiwKKwkJICAgICBwYWdlX29mZnNldCwgKCBoZXJtb25fY3EtPm10dC5wYWdlX29mZnNldCA+PiA1ICkgKTsKKwlNTFhfRklMTF8yICggJmNxY3R4LCAzLAorCQkgICAgIHVzcl9wYWdlLCBIRVJNT05fVUFSX05PTl9FUV9QQUdFLAorCQkgICAgIGxvZ19jcV9zaXplLCBmbHMgKCBjcS0+bnVtX2NxZXMgLSAxICkgKTsKKwlNTFhfRklMTF8xICggJmNxY3R4LCA3LCBtdHRfYmFzZV9hZGRyX2wsCisJCSAgICAgKCBoZXJtb25fY3EtPm10dC5tdHRfYmFzZV9hZGRyID4+IDMgKSApOworCU1MWF9GSUxMXzEgKCAmY3FjdHgsIDE1LCBkYl9yZWNvcmRfYWRkcl9sLAorCQkgICAgICggdmlydF90b19waHlzICggJmhlcm1vbl9jcS0+ZG9vcmJlbGwgKSA+PiAzICkgKTsKKwlpZiAoICggcmMgPSBoZXJtb25fY21kX3N3Mmh3X2NxICggaGVybW9uLCBjcS0+Y3FuLCAmY3FjdHggKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgU1cySFdfQ1EgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX3N3Mmh3X2NxOworCX0KKworCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgQ1FOICUjbHggcmluZyBhdCBbJXAsJXApXG4iLAorCSAgICAgICBoZXJtb24sIGNxLT5jcW4sIGhlcm1vbl9jcS0+Y3FlLAorCSAgICAgICAoICggKCB2b2lkICogKSBoZXJtb25fY3EtPmNxZSApICsgaGVybW9uX2NxLT5jcWVfc2l6ZSApICk7CisJaWJfY3Ffc2V0X2RydmRhdGEgKCBjcSwgaGVybW9uX2NxICk7CisJcmV0dXJuIDA7CisKKyBlcnJfc3cyaHdfY3E6CisJaGVybW9uX2ZyZWVfbXR0ICggaGVybW9uLCAmaGVybW9uX2NxLT5tdHQgKTsKKyBlcnJfYWxsb2NfbXR0OgorCWZyZWVfZG1hICggaGVybW9uX2NxLT5jcWUsIGhlcm1vbl9jcS0+Y3FlX3NpemUgKTsKKyBlcnJfY3FlOgorCWZyZWUgKCBoZXJtb25fY3EgKTsKKyBlcnJfaGVybW9uX2NxOgorCWhlcm1vbl9iaXRtYXNrX2ZyZWUgKCBoZXJtb24tPmNxX2ludXNlLCBjcW5fb2Zmc2V0LCAxICk7CisgZXJyX2Nxbl9vZmZzZXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIERlc3Ryb3kgY29tcGxldGlvbiBxdWV1ZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgY3EJCUNvbXBsZXRpb24gcXVldWUKKyAqLworc3RhdGljIHZvaWQgaGVybW9uX2Rlc3Ryb3lfY3EgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQlzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3EgKSB7CisJc3RydWN0IGhlcm1vbiAqaGVybW9uID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0cnVjdCBoZXJtb25fY29tcGxldGlvbl9xdWV1ZSAqaGVybW9uX2NxID0gaWJfY3FfZ2V0X2RydmRhdGEgKCBjcSApOworCXN0cnVjdCBoZXJtb25wcm1fY29tcGxldGlvbl9xdWV1ZV9jb250ZXh0IGNxY3R4OworCWludCBjcW5fb2Zmc2V0OworCWludCByYzsKKworCS8qIFRha2Ugb3duZXJzaGlwIGJhY2sgZnJvbSBoYXJkd2FyZSAqLworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfaHcyc3dfY3EgKCBoZXJtb24sIGNxLT5jcW4sICZjcWN0eCApICkgIT0gMCApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBGQVRBTCBIVzJTV19DUSBmYWlsZWQgb24gQ1FOICUjbHg6ICIKKwkJICAgICAgICIlc1xuIiwgaGVybW9uLCBjcS0+Y3FuLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJLyogTGVhayBtZW1vcnkgYW5kIHJldHVybjsgYXQgbGVhc3Qgd2UgYXZvaWQgY29ycnVwdGlvbiAqLworCQlyZXR1cm47CisJfQorCisJLyogRnJlZSBNVFQgZW50cmllcyAqLworCWhlcm1vbl9mcmVlX210dCAoIGhlcm1vbiwgJmhlcm1vbl9jcS0+bXR0ICk7CisKKwkvKiBGcmVlIG1lbW9yeSAqLworCWZyZWVfZG1hICggaGVybW9uX2NxLT5jcWUsIGhlcm1vbl9jcS0+Y3FlX3NpemUgKTsKKwlmcmVlICggaGVybW9uX2NxICk7CisKKwkvKiBNYXJrIHF1ZXVlIG51bWJlciBhcyBmcmVlICovCisJY3FuX29mZnNldCA9ICggY3EtPmNxbiAtIGhlcm1vbi0+Y2FwLnJlc2VydmVkX2NxcyApOworCWhlcm1vbl9iaXRtYXNrX2ZyZWUgKCBoZXJtb24tPmNxX2ludXNlLCBjcW5fb2Zmc2V0LCAxICk7CisKKwlpYl9jcV9zZXRfZHJ2ZGF0YSAoIGNxLCBOVUxMICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBRdWV1ZSBwYWlyIG9wZXJhdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBBc3NpZ24gcXVldWUgcGFpciBudW1iZXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBoZXJtb25fYWxsb2NfcXBuICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAgKSB7CisJc3RydWN0IGhlcm1vbiAqaGVybW9uID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXVuc2lnbmVkIGludCBwb3J0X29mZnNldDsKKwlpbnQgcXBuX29mZnNldDsKKworCS8qIENhbGN1bGF0ZSBxdWV1ZSBwYWlyIG51bWJlciAqLworCXBvcnRfb2Zmc2V0ID0gKCBpYmRldi0+cG9ydCAtIEhFUk1PTl9QT1JUX0JBU0UgKTsKKworCXN3aXRjaCAoIHFwLT50eXBlICkgeworCWNhc2UgSUJfUVBUX1NNSToKKwkJcXAtPnFwbiA9ICggaGVybW9uLT5zcGVjaWFsX3Fwbl9iYXNlICsgcG9ydF9vZmZzZXQgKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBJQl9RUFRfR1NJOgorCQlxcC0+cXBuID0gKCBoZXJtb24tPnNwZWNpYWxfcXBuX2Jhc2UgKyAyICsgcG9ydF9vZmZzZXQgKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBJQl9RUFRfVUQ6CisJY2FzZSBJQl9RUFRfUkM6CisJCS8qIEZpbmQgYSBmcmVlIHF1ZXVlIHBhaXIgbnVtYmVyICovCisJCXFwbl9vZmZzZXQgPSBoZXJtb25fYml0bWFza19hbGxvYyAoIGhlcm1vbi0+cXBfaW51c2UsCisJCQkJCQkgICAgSEVSTU9OX01BWF9RUFMsIDEgKTsKKwkJaWYgKCBxcG5fb2Zmc2V0IDwgMCApIHsKKwkJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgb3V0IG9mIHF1ZXVlIHBhaXJzXG4iLAorCQkJICAgICAgIGhlcm1vbiApOworCQkJcmV0dXJuIHFwbl9vZmZzZXQ7CisJCX0KKwkJcXAtPnFwbiA9ICggKCByYW5kb20oKSAmIEhFUk1PTl9RUE5fUkFORE9NX01BU0sgKSB8CisJCQkgICAgKCBoZXJtb24tPnFwbl9iYXNlICsgcXBuX29mZnNldCApICk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgdW5zdXBwb3J0ZWQgUVAgdHlwZSAlZFxuIiwKKwkJICAgICAgIGhlcm1vbiwgcXAtPnR5cGUgKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KK30KKworLyoqCisgKiBGcmVlIHF1ZXVlIHBhaXIgbnVtYmVyCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICovCitzdGF0aWMgdm9pZCBoZXJtb25fZnJlZV9xcG4gKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCApIHsKKwlzdHJ1Y3QgaGVybW9uICpoZXJtb24gPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJaW50IHFwbl9vZmZzZXQ7CisKKwlxcG5fb2Zmc2V0ID0gKCAoIHFwLT5xcG4gJiB+SEVSTU9OX1FQTl9SQU5ET01fTUFTSyApCisJCSAgICAgICAtIGhlcm1vbi0+cXBuX2Jhc2UgKTsKKwlpZiAoIHFwbl9vZmZzZXQgPj0gMCApCisJCWhlcm1vbl9iaXRtYXNrX2ZyZWUgKCBoZXJtb24tPnFwX2ludXNlLCBxcG5fb2Zmc2V0LCAxICk7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIHRyYW5zbWlzc2lvbiByYXRlCisgKgorICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yCisgKiBAcmV0IGhlcm1vbl9yYXRlCUhlcm1vbiByYXRlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGVybW9uX3JhdGUgKCBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2ICkgeworCXJldHVybiAoICggKCBhdi0+cmF0ZSA+PSBJQl9SQVRFXzJfNSApICYmICggYXYtPnJhdGUgPD0gSUJfUkFURV8xMjAgKSApCisJCSA/ICggYXYtPnJhdGUgKyA1ICkgOiAwICk7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIHNjaGVkdWxlIHF1ZXVlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHJldCBzY2hlZF9xdWV1ZQlTY2hlZHVsZSBxdWV1ZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGhlcm1vbl9zY2hlZF9xdWV1ZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCQkgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXJldHVybiAoICggKCBxcC0+dHlwZSA9PSBJQl9RUFRfU01JICkgPworCQkgICBIRVJNT05fU0NIRURfUVAwIDogSEVSTU9OX1NDSEVEX0RFRkFVTFQgKSB8CisJCSAoICggaWJkZXYtPnBvcnQgLSAxICkgPDwgNiApICk7Cit9CisKKy8qKiBRdWV1ZSBwYWlyIHRyYW5zcG9ydCBzZXJ2aWNlIHR5cGUgbWFwICovCitzdGF0aWMgdWludDhfdCBoZXJtb25fcXBfc3RbXSA9IHsKKwlbSUJfUVBUX1NNSV0gPSBIRVJNT05fU1RfTUxYLAorCVtJQl9RUFRfR1NJXSA9IEhFUk1PTl9TVF9NTFgsCisJW0lCX1FQVF9VRF0gPSBIRVJNT05fU1RfVUQsCisJW0lCX1FQVF9SQ10gPSBIRVJNT05fU1RfUkMsCit9OworCisvKioKKyAqIER1bXAgcXVldWUgcGFpciBjb250ZXh0IChmb3IgZGVidWdnaW5nIG9ubHkpCisgKgorICogQHYgaGVybW9uCQlIZXJtb24gZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1vbl9kdW1wX3FwY3R4ICggc3RydWN0IGhlcm1vbiAqaGVybW9uLAorCQkJCSAgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCApIHsKKwlzdHJ1Y3QgaGVybW9ucHJtX3FwX2VlX3N0YXRlX3RyYW5zaXRpb25zIHFwY3R4OworCWludCByYzsKKworCW1lbXNldCAoICZxcGN0eCwgMCwgc2l6ZW9mICggcXBjdHggKSApOworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfcXVlcnlfcXAgKCBoZXJtb24sIHFwLT5xcG4sICZxcGN0eCApICkgIT0gMCApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBRVUVSWV9RUCBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICAgaGVybW9uLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIFFQTiAlbHggY29udGV4dDpcbiIsIGhlcm1vbiwgcXAtPnFwbiApOworCURCR0NfSERBICggaGVybW9uLCAwLCAmcXBjdHgudS5kd29yZHNbMl0sCisJCSAgICggc2l6ZW9mICggcXBjdHggKSAtIDggKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ3JlYXRlIHF1ZXVlIHBhaXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBoZXJtb25fY3JlYXRlX3FwICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAgKSB7CisJc3RydWN0IGhlcm1vbiAqaGVybW9uID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0cnVjdCBoZXJtb25fcXVldWVfcGFpciAqaGVybW9uX3FwOworCXN0cnVjdCBoZXJtb25wcm1fcXBfZWVfc3RhdGVfdHJhbnNpdGlvbnMgcXBjdHg7CisJaW50IHJjOworCisJLyogQ2FsY3VsYXRlIHF1ZXVlIHBhaXIgbnVtYmVyICovCisJaWYgKCAoIHJjID0gaGVybW9uX2FsbG9jX3FwbiAoIGliZGV2LCBxcCApICkgIT0gMCApCisJCWdvdG8gZXJyX2FsbG9jX3FwbjsKKworCS8qIEFsbG9jYXRlIGNvbnRyb2wgc3RydWN0dXJlcyAqLworCWhlcm1vbl9xcCA9IHphbGxvYyAoIHNpemVvZiAoICpoZXJtb25fcXAgKSApOworCWlmICggISBoZXJtb25fcXAgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfaGVybW9uX3FwOworCX0KKworCS8qIENhbGN1bGF0ZSBkb29yYmVsbCBhZGRyZXNzICovCisJaGVybW9uX3FwLT5zZW5kLmRvb3JiZWxsID0KKwkJKCBoZXJtb24tPnVhciArIEhFUk1PTl9VQVJfTk9OX0VRX1BBR0UgKiBIRVJNT05fUEFHRV9TSVpFICsKKwkJICBIRVJNT05fREJfUE9TVF9TTkRfT0ZGU0VUICk7CisKKwkvKiBBbGxvY2F0ZSB3b3JrIHF1ZXVlIGJ1ZmZlciAqLworCWhlcm1vbl9xcC0+c2VuZC5udW1fd3FlcyA9ICggcXAtPnNlbmQubnVtX3dxZXMgLyogaGVhZHJvb20gKi8gKyAxICsKKwkJCQkoIDIwNDggLyBzaXplb2YgKCBoZXJtb25fcXAtPnNlbmQud3FlWzBdICkgKSApOworCWhlcm1vbl9xcC0+c2VuZC5udW1fd3FlcyA9CisJCSggMSA8PCBmbHMgKCBoZXJtb25fcXAtPnNlbmQubnVtX3dxZXMgLSAxICkgKTsgLyogcm91bmQgdXAgKi8KKwloZXJtb25fcXAtPnNlbmQud3FlX3NpemUgPSAoIGhlcm1vbl9xcC0+c2VuZC5udW1fd3FlcyAqCisJCQkJICAgICBzaXplb2YgKCBoZXJtb25fcXAtPnNlbmQud3FlWzBdICkgKTsKKwloZXJtb25fcXAtPnJlY3Yud3FlX3NpemUgPSAoIHFwLT5yZWN2Lm51bV93cWVzICoKKwkJCQkgICAgIHNpemVvZiAoIGhlcm1vbl9xcC0+cmVjdi53cWVbMF0gKSApOworCWhlcm1vbl9xcC0+d3FlX3NpemUgPSAoIGhlcm1vbl9xcC0+c2VuZC53cWVfc2l6ZSArCisJCQkJaGVybW9uX3FwLT5yZWN2LndxZV9zaXplICk7CisJaGVybW9uX3FwLT53cWUgPSBtYWxsb2NfZG1hICggaGVybW9uX3FwLT53cWVfc2l6ZSwKKwkJCQkgICAgICBzaXplb2YgKCBoZXJtb25fcXAtPnNlbmQud3FlWzBdICkgKTsKKwlpZiAoICEgaGVybW9uX3FwLT53cWUgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2Nfd3FlOworCX0KKwloZXJtb25fcXAtPnNlbmQud3FlID0gaGVybW9uX3FwLT53cWU7CisJbWVtc2V0ICggaGVybW9uX3FwLT5zZW5kLndxZSwgMHhmZiwgaGVybW9uX3FwLT5zZW5kLndxZV9zaXplICk7CisJaGVybW9uX3FwLT5yZWN2LndxZSA9ICggaGVybW9uX3FwLT53cWUgKyBoZXJtb25fcXAtPnNlbmQud3FlX3NpemUgKTsKKwltZW1zZXQgKCBoZXJtb25fcXAtPnJlY3Yud3FlLCAwLCBoZXJtb25fcXAtPnJlY3Yud3FlX3NpemUgKTsKKworCS8qIEFsbG9jYXRlIE1UVCBlbnRyaWVzICovCisJaWYgKCAoIHJjID0gaGVybW9uX2FsbG9jX210dCAoIGhlcm1vbiwgaGVybW9uX3FwLT53cWUsCisJCQkJICAgICAgIGhlcm1vbl9xcC0+d3FlX3NpemUsCisJCQkJICAgICAgICZoZXJtb25fcXAtPm10dCApICkgIT0gMCApIHsKKwkJZ290byBlcnJfYWxsb2NfbXR0OworCX0KKworCS8qIFRyYW5zaXRpb24gcXVldWUgdG8gSU5JVCBzdGF0ZSAqLworCW1lbXNldCAoICZxcGN0eCwgMCwgc2l6ZW9mICggcXBjdHggKSApOworCU1MWF9GSUxMXzIgKCAmcXBjdHgsIDIsCisJCSAgICAgcXBjX2VlY19kYXRhLnBtX3N0YXRlLCBIRVJNT05fUE1fU1RBVEVfTUlHUkFURUQsCisJCSAgICAgcXBjX2VlY19kYXRhLnN0LCBoZXJtb25fcXBfc3RbcXAtPnR5cGVdICk7CisJTUxYX0ZJTExfMSAoICZxcGN0eCwgMywgcXBjX2VlY19kYXRhLnBkLCBIRVJNT05fR0xPQkFMX1BEICk7CisJTUxYX0ZJTExfNCAoICZxcGN0eCwgNCwKKwkJICAgICBxcGNfZWVjX2RhdGEubG9nX3JxX3NpemUsIGZscyAoIHFwLT5yZWN2Lm51bV93cWVzIC0gMSApLAorCQkgICAgIHFwY19lZWNfZGF0YS5sb2dfcnFfc3RyaWRlLAorCQkgICAgICggZmxzICggc2l6ZW9mICggaGVybW9uX3FwLT5yZWN2LndxZVswXSApIC0gMSApIC0gNCApLAorCQkgICAgIHFwY19lZWNfZGF0YS5sb2dfc3Ffc2l6ZSwKKwkJICAgICBmbHMgKCBoZXJtb25fcXAtPnNlbmQubnVtX3dxZXMgLSAxICksCisJCSAgICAgcXBjX2VlY19kYXRhLmxvZ19zcV9zdHJpZGUsCisJCSAgICAgKCBmbHMgKCBzaXplb2YgKCBoZXJtb25fcXAtPnNlbmQud3FlWzBdICkgLSAxICkgLSA0ICkgKTsKKwlNTFhfRklMTF8xICggJnFwY3R4LCA1LAorCQkgICAgIHFwY19lZWNfZGF0YS51c3JfcGFnZSwgSEVSTU9OX1VBUl9OT05fRVFfUEFHRSApOworCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDMzLCBxcGNfZWVjX2RhdGEuY3FuX3NuZCwgcXAtPnNlbmQuY3EtPmNxbiApOworCU1MWF9GSUxMXzQgKCAmcXBjdHgsIDM4LAorCQkgICAgIHFwY19lZWNfZGF0YS5ycmUsIDEsCisJCSAgICAgcXBjX2VlY19kYXRhLnJ3ZSwgMSwKKwkJICAgICBxcGNfZWVjX2RhdGEucmFlLCAxLAorCQkgICAgIHFwY19lZWNfZGF0YS5wYWdlX29mZnNldCwKKwkJICAgICAoIGhlcm1vbl9xcC0+bXR0LnBhZ2Vfb2Zmc2V0ID4+IDYgKSApOworCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDQxLCBxcGNfZWVjX2RhdGEuY3FuX3JjdiwgcXAtPnJlY3YuY3EtPmNxbiApOworCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDQzLCBxcGNfZWVjX2RhdGEuZGJfcmVjb3JkX2FkZHJfbCwKKwkJICAgICAoIHZpcnRfdG9fcGh5cyAoICZoZXJtb25fcXAtPnJlY3YuZG9vcmJlbGwgKSA+PiAyICkgKTsKKwlNTFhfRklMTF8xICggJnFwY3R4LCA1MywgcXBjX2VlY19kYXRhLm10dF9iYXNlX2FkZHJfbCwKKwkJICAgICAoIGhlcm1vbl9xcC0+bXR0Lm10dF9iYXNlX2FkZHIgPj4gMyApICk7CisJaWYgKCAoIHJjID0gaGVybW9uX2NtZF9yc3QyaW5pdF9xcCAoIGhlcm1vbiwgcXAtPnFwbiwKKwkJCQkJICAgICAmcXBjdHggKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgUlNUMklOSVRfUVAgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX3JzdDJpbml0X3FwOworCX0KKwloZXJtb25fcXAtPnN0YXRlID0gSEVSTU9OX1FQX1NUX0lOSVQ7CisKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIFFQTiAlI2x4IHNlbmQgcmluZyBhdCBbJXAsJXApXG4iLAorCSAgICAgICBoZXJtb24sIHFwLT5xcG4sIGhlcm1vbl9xcC0+c2VuZC53cWUsCisJICAgICAgICggKCh2b2lkICopaGVybW9uX3FwLT5zZW5kLndxZSApICsgaGVybW9uX3FwLT5zZW5kLndxZV9zaXplICkgKTsKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIFFQTiAlI2x4IHJlY2VpdmUgcmluZyBhdCBbJXAsJXApXG4iLAorCSAgICAgICBoZXJtb24sIHFwLT5xcG4sIGhlcm1vbl9xcC0+cmVjdi53cWUsCisJICAgICAgICggKCh2b2lkICopaGVybW9uX3FwLT5yZWN2LndxZSApICsgaGVybW9uX3FwLT5yZWN2LndxZV9zaXplICkgKTsKKwlpYl9xcF9zZXRfZHJ2ZGF0YSAoIHFwLCBoZXJtb25fcXAgKTsKKwlyZXR1cm4gMDsKKworCWhlcm1vbl9jbWRfMnJzdF9xcCAoIGhlcm1vbiwgcXAtPnFwbiApOworIGVycl9yc3QyaW5pdF9xcDoKKwloZXJtb25fZnJlZV9tdHQgKCBoZXJtb24sICZoZXJtb25fcXAtPm10dCApOworIGVycl9hbGxvY19tdHQ6CisJZnJlZV9kbWEgKCBoZXJtb25fcXAtPndxZSwgaGVybW9uX3FwLT53cWVfc2l6ZSApOworIGVycl9hbGxvY193cWU6CisJZnJlZSAoIGhlcm1vbl9xcCApOworIGVycl9oZXJtb25fcXA6CisJaGVybW9uX2ZyZWVfcXBuICggaWJkZXYsIHFwICk7CisgZXJyX2FsbG9jX3FwbjoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogTW9kaWZ5IHF1ZXVlIHBhaXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBoZXJtb25fbW9kaWZ5X3FwICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAgKSB7CisJc3RydWN0IGhlcm1vbiAqaGVybW9uID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0cnVjdCBoZXJtb25fcXVldWVfcGFpciAqaGVybW9uX3FwID0gaWJfcXBfZ2V0X2RydmRhdGEgKCBxcCApOworCXN0cnVjdCBoZXJtb25wcm1fcXBfZWVfc3RhdGVfdHJhbnNpdGlvbnMgcXBjdHg7CisJaW50IHJjOworCisJLyogVHJhbnNpdGlvbiBxdWV1ZSB0byBSVFIgc3RhdGUsIGlmIGFwcGxpY2FibGUgKi8KKwlpZiAoIGhlcm1vbl9xcC0+c3RhdGUgPCBIRVJNT05fUVBfU1RfUlRSICkgeworCQltZW1zZXQgKCAmcXBjdHgsIDAsIHNpemVvZiAoIHFwY3R4ICkgKTsKKwkJTUxYX0ZJTExfMiAoICZxcGN0eCwgNCwKKwkJCSAgICAgcXBjX2VlY19kYXRhLm10dSwgSEVSTU9OX01UVV8yMDQ4LAorCQkJICAgICBxcGNfZWVjX2RhdGEubXNnX21heCwgMzEgKTsKKwkJTUxYX0ZJTExfMSAoICZxcGN0eCwgNywKKwkJCSAgICAgcXBjX2VlY19kYXRhLnJlbW90ZV9xcG5fZWVuLCBxcC0+YXYucXBuICk7CisJCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDksCisJCQkgICAgIHFwY19lZWNfZGF0YS5wcmltYXJ5X2FkZHJlc3NfcGF0aC5ybGlkLAorCQkJICAgICBxcC0+YXYubGlkICk7CisJCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDEwLAorCQkJICAgICBxcGNfZWVjX2RhdGEucHJpbWFyeV9hZGRyZXNzX3BhdGgubWF4X3N0YXRfcmF0ZSwKKwkJCSAgICAgaGVybW9uX3JhdGUgKCAmcXAtPmF2ICkgKTsKKwkJbWVtY3B5ICggJnFwY3R4LnUuZHdvcmRzWzEyXSwgJnFwLT5hdi5naWQsCisJCQkgc2l6ZW9mICggcXAtPmF2LmdpZCApICk7CisJCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDE2LAorCQkJICAgICBxcGNfZWVjX2RhdGEucHJpbWFyeV9hZGRyZXNzX3BhdGguc2NoZWRfcXVldWUsCisJCQkgICAgIGhlcm1vbl9zY2hlZF9xdWV1ZSAoIGliZGV2LCBxcCApICk7CisJCU1MWF9GSUxMXzEgKCAmcXBjdHgsIDM5LAorCQkJICAgICBxcGNfZWVjX2RhdGEubmV4dF9yY3ZfcHNuLCBxcC0+cmVjdi5wc24gKTsKKwkJaWYgKCAoIHJjID0gaGVybW9uX2NtZF9pbml0MnJ0cl9xcCAoIGhlcm1vbiwgcXAtPnFwbiwKKwkJCQkJCSAgICAgJnFwY3R4ICkgKSAhPSAwICkgeworCQkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBJTklUMlJUUl9RUCBmYWlsZWQ6ICVzXG4iLAorCQkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJaGVybW9uX3FwLT5zdGF0ZSA9IEhFUk1PTl9RUF9TVF9SVFI7CisJfQorCisJLyogVHJhbnNpdGlvbiBxdWV1ZSB0byBSVFMgc3RhdGUgKi8KKwlpZiAoIGhlcm1vbl9xcC0+c3RhdGUgPCBIRVJNT05fUVBfU1RfUlRTICkgeworCQltZW1zZXQgKCAmcXBjdHgsIDAsIHNpemVvZiAoIHFwY3R4ICkgKTsKKwkJTUxYX0ZJTExfMSAoICZxcGN0eCwgMTAsCisJCQkgICAgIHFwY19lZWNfZGF0YS5wcmltYXJ5X2FkZHJlc3NfcGF0aC5hY2tfdGltZW91dCwKKwkJCSAgICAgMTQgLyogNC4wOTZ1cyAqIDJeKDE0KSA9IDY3bXMgKi8gKTsKKwkJTUxYX0ZJTExfMiAoICZxcGN0eCwgMzAsCisJCQkgICAgIHFwY19lZWNfZGF0YS5yZXRyeV9jb3VudCwgSEVSTU9OX1JFVFJZX01BWCwKKwkJCSAgICAgcXBjX2VlY19kYXRhLnJucl9yZXRyeSwgSEVSTU9OX1JFVFJZX01BWCApOworCQlNTFhfRklMTF8xICggJnFwY3R4LCAzMiwKKwkJCSAgICAgcXBjX2VlY19kYXRhLm5leHRfc2VuZF9wc24sIHFwLT5zZW5kLnBzbiApOworCQlpZiAoICggcmMgPSBoZXJtb25fY21kX3J0cjJydHNfcXAgKCBoZXJtb24sIHFwLT5xcG4sCisJCQkJCQkgICAgJnFwY3R4ICkgKSAhPSAwICkgeworCQkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBSVFIyUlRTX1FQIGZhaWxlZDogJXNcbiIsCisJCQkgICAgICAgaGVybW9uLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQloZXJtb25fcXAtPnN0YXRlID0gSEVSTU9OX1FQX1NUX1JUUzsKKwl9CisKKwkvKiBVcGRhdGUgcGFyYW1ldGVycyBpbiBSVFMgc3RhdGUgKi8KKwltZW1zZXQgKCAmcXBjdHgsIDAsIHNpemVvZiAoIHFwY3R4ICkgKTsKKwlNTFhfRklMTF8xICggJnFwY3R4LCAwLCBvcHRfcGFyYW1fbWFzaywgSEVSTU9OX1FQX09QVF9QQVJBTV9RS0VZICk7CisJTUxYX0ZJTExfMSAoICZxcGN0eCwgNDQsIHFwY19lZWNfZGF0YS5xX2tleSwgcXAtPnFrZXkgKTsKKwlpZiAoICggcmMgPSBoZXJtb25fY21kX3J0czJydHNfcXAgKCBoZXJtb24sIHFwLT5xcG4sICZxcGN0eCApICkgIT0gMCApeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIFJUUzJSVFNfUVAgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBEZXN0cm95IHF1ZXVlIHBhaXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKi8KK3N0YXRpYyB2b2lkIGhlcm1vbl9kZXN0cm95X3FwICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBoZXJtb24gKmhlcm1vbiA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgaGVybW9uX3F1ZXVlX3BhaXIgKmhlcm1vbl9xcCA9IGliX3FwX2dldF9kcnZkYXRhICggcXAgKTsKKwlpbnQgcmM7CisKKwkvKiBUYWtlIG93bmVyc2hpcCBiYWNrIGZyb20gaGFyZHdhcmUgKi8KKwlpZiAoICggcmMgPSBoZXJtb25fY21kXzJyc3RfcXAgKCBoZXJtb24sIHFwLT5xcG4gKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgRkFUQUwgMlJTVF9RUCBmYWlsZWQgb24gUVBOICUjbHg6ICIKKwkJICAgICAgICIlc1xuIiwgaGVybW9uLCBxcC0+cXBuLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJLyogTGVhayBtZW1vcnkgYW5kIHJldHVybjsgYXQgbGVhc3Qgd2UgYXZvaWQgY29ycnVwdGlvbiAqLworCQlyZXR1cm47CisJfQorCisJLyogRnJlZSBNVFQgZW50cmllcyAqLworCWhlcm1vbl9mcmVlX210dCAoIGhlcm1vbiwgJmhlcm1vbl9xcC0+bXR0ICk7CisKKwkvKiBGcmVlIG1lbW9yeSAqLworCWZyZWVfZG1hICggaGVybW9uX3FwLT53cWUsIGhlcm1vbl9xcC0+d3FlX3NpemUgKTsKKwlmcmVlICggaGVybW9uX3FwICk7CisKKwkvKiBNYXJrIHF1ZXVlIG51bWJlciBhcyBmcmVlICovCisJaGVybW9uX2ZyZWVfcXBuICggaWJkZXYsIHFwICk7CisKKwlpYl9xcF9zZXRfZHJ2ZGF0YSAoIHFwLCBOVUxMICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBXb3JrIHJlcXVlc3Qgb3BlcmF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIENvbnN0cnVjdCBVRCBzZW5kIHdvcmsgcXVldWUgZW50cnkKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBhdgkJQWRkcmVzcyB2ZWN0b3IKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiB3cWUJCVNlbmQgd29yayBxdWV1ZSBlbnRyeQorICogQHJldCBvcGNvZGUJCUNvbnRyb2wgb3Bjb2RlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2hlcm1vbl9maWxsX3VkX3NlbmRfd3FlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCBfX3VudXNlZCwKKwkJCSAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiwKKwkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCQkgIHVuaW9uIGhlcm1vbl9zZW5kX3dxZSAqd3FlICkgeworCXN0cnVjdCBoZXJtb24gKmhlcm1vbiA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKworCU1MWF9GSUxMXzEgKCAmd3FlLT51ZC5jdHJsLCAxLCBkcywKKwkJICAgICAoICggb2Zmc2V0b2YgKCB0eXBlb2YgKCB3cWUtPnVkICksIGRhdGFbMV0gKSAvIDE2ICkgKSApOworCU1MWF9GSUxMXzEgKCAmd3FlLT51ZC5jdHJsLCAyLCBjLCAweDAzIC8qIGdlbmVyYXRlIGNvbXBsZXRpb24gKi8gKTsKKwlNTFhfRklMTF8yICggJndxZS0+dWQudWQsIDAsCisJCSAgICAgdWRfYWRkcmVzc192ZWN0b3IucGQsIEhFUk1PTl9HTE9CQUxfUEQsCisJCSAgICAgdWRfYWRkcmVzc192ZWN0b3IucG9ydF9udW1iZXIsIGliZGV2LT5wb3J0ICk7CisJTUxYX0ZJTExfMiAoICZ3cWUtPnVkLnVkLCAxLAorCQkgICAgIHVkX2FkZHJlc3NfdmVjdG9yLnJsaWQsIGF2LT5saWQsCisJCSAgICAgdWRfYWRkcmVzc192ZWN0b3IuZywgYXYtPmdpZF9wcmVzZW50ICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPnVkLnVkLCAyLAorCQkgICAgIHVkX2FkZHJlc3NfdmVjdG9yLm1heF9zdGF0X3JhdGUsIGhlcm1vbl9yYXRlICggYXYgKSApOworCU1MWF9GSUxMXzEgKCAmd3FlLT51ZC51ZCwgMywgdWRfYWRkcmVzc192ZWN0b3Iuc2wsIGF2LT5zbCApOworCW1lbWNweSAoICZ3cWUtPnVkLnVkLnUuZHdvcmRzWzRdLCAmYXYtPmdpZCwgc2l6ZW9mICggYXYtPmdpZCApICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPnVkLnVkLCA4LCBkZXN0aW5hdGlvbl9xcCwgYXYtPnFwbiApOworCU1MWF9GSUxMXzEgKCAmd3FlLT51ZC51ZCwgOSwgcV9rZXksIGF2LT5xa2V5ICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPnVkLmRhdGFbMF0sIDAsIGJ5dGVfY291bnQsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPnVkLmRhdGFbMF0sIDEsIGxfa2V5LCBoZXJtb24tPmxrZXkgKTsKKwlNTFhfRklMTF8xICggJndxZS0+dWQuZGF0YVswXSwgMywKKwkJICAgICBsb2NhbF9hZGRyZXNzX2wsIHZpcnRfdG9fYnVzICggaW9idWYtPmRhdGEgKSApOworCXJldHVybiBIRVJNT05fT1BDT0RFX1NFTkQ7Cit9CisKKy8qKgorICogQ29uc3RydWN0IE1MWCBzZW5kIHdvcmsgcXVldWUgZW50cnkKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBhdgkJQWRkcmVzcyB2ZWN0b3IKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiB3cWUJCVNlbmQgd29yayBxdWV1ZSBlbnRyeQorICogQHJldCBvcGNvZGUJCUNvbnRyb2wgb3Bjb2RlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2hlcm1vbl9maWxsX21seF9zZW5kX3dxZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJICAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiwKKwkJCSAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJICAgdW5pb24gaGVybW9uX3NlbmRfd3FlICp3cWUgKSB7CisJc3RydWN0IGhlcm1vbiAqaGVybW9uID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0cnVjdCBpb19idWZmZXIgaGVhZGVyczsKKworCS8qIENvbnN0cnVjdCBJQiBoZWFkZXJzICovCisJaW9iX3BvcHVsYXRlICggJmhlYWRlcnMsICZ3cWUtPm1seC5oZWFkZXJzLCAwLAorCQkgICAgICAgc2l6ZW9mICggd3FlLT5tbHguaGVhZGVycyApICk7CisJaW9iX3Jlc2VydmUgKCAmaGVhZGVycywgc2l6ZW9mICggd3FlLT5tbHguaGVhZGVycyApICk7CisJaWJfcHVzaCAoIGliZGV2LCAmaGVhZGVycywgcXAsIGlvYl9sZW4gKCBpb2J1ZiApLCBhdiApOworCisJLyogRmlsbCB3b3JrIHF1ZXVlIGVudHJ5ICovCisJTUxYX0ZJTExfMSAoICZ3cWUtPm1seC5jdHJsLCAxLCBkcywKKwkJICAgICAoICggb2Zmc2V0b2YgKCB0eXBlb2YgKCB3cWUtPm1seCApLCBkYXRhWzJdICkgLyAxNiApICkgKTsKKwlNTFhfRklMTF81ICggJndxZS0+bWx4LmN0cmwsIDIsCisJCSAgICAgYywgMHgwMyAvKiBnZW5lcmF0ZSBjb21wbGV0aW9uICovLAorCQkgICAgIGljcmMsIDAgLyogZ2VuZXJhdGUgSUNSQyAqLywKKwkJICAgICBtYXhfc3RhdHJhdGUsIGhlcm1vbl9yYXRlICggYXYgKSwKKwkJICAgICBzbHIsIDAsCisJCSAgICAgdjE1LCAoICggcXAtPmV4dF9xcG4gPT0gSUJfUVBOX1NNSSApID8gMSA6IDAgKSApOworCU1MWF9GSUxMXzEgKCAmd3FlLT5tbHguY3RybCwgMywgcmxpZCwgYXYtPmxpZCApOworCU1MWF9GSUxMXzEgKCAmd3FlLT5tbHguZGF0YVswXSwgMCwKKwkJICAgICBieXRlX2NvdW50LCBpb2JfbGVuICggJmhlYWRlcnMgKSApOworCU1MWF9GSUxMXzEgKCAmd3FlLT5tbHguZGF0YVswXSwgMSwgbF9rZXksIGhlcm1vbi0+bGtleSApOworCU1MWF9GSUxMXzEgKCAmd3FlLT5tbHguZGF0YVswXSwgMywKKwkJICAgICBsb2NhbF9hZGRyZXNzX2wsIHZpcnRfdG9fYnVzICggaGVhZGVycy5kYXRhICkgKTsKKwlNTFhfRklMTF8xICggJndxZS0+bWx4LmRhdGFbMV0sIDAsCisJCSAgICAgYnl0ZV9jb3VudCwgKCBpb2JfbGVuICggaW9idWYgKSArIDQgLyogSUNSQyAqLyApICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPm1seC5kYXRhWzFdLCAxLCBsX2tleSwgaGVybW9uLT5sa2V5ICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPm1seC5kYXRhWzFdLCAzLAorCQkgICAgIGxvY2FsX2FkZHJlc3NfbCwgdmlydF90b19idXMgKCBpb2J1Zi0+ZGF0YSApICk7CisJcmV0dXJuIEhFUk1PTl9PUENPREVfU0VORDsKK30KKworLyoqCisgKiBDb25zdHJ1Y3QgUkMgc2VuZCB3b3JrIHF1ZXVlIGVudHJ5CisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgd3FlCQlTZW5kIHdvcmsgcXVldWUgZW50cnkKKyAqIEByZXQgb3Bjb2RlCQlDb250cm9sIG9wY29kZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitoZXJtb25fZmlsbF9yY19zZW5kX3dxZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAgX191bnVzZWQsCisJCQkgIHN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciAqYXYgX191bnVzZWQsCisJCQkgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJICB1bmlvbiBoZXJtb25fc2VuZF93cWUgKndxZSApIHsKKwlzdHJ1Y3QgaGVybW9uICpoZXJtb24gPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisKKwlNTFhfRklMTF8xICggJndxZS0+cmMuY3RybCwgMSwgZHMsCisJCSAgICAgKCAoIG9mZnNldG9mICggdHlwZW9mICggd3FlLT5yYyApLCBkYXRhWzFdICkgLyAxNiApICkgKTsKKwlNTFhfRklMTF8xICggJndxZS0+cmMuY3RybCwgMiwgYywgMHgwMyAvKiBnZW5lcmF0ZSBjb21wbGV0aW9uICovICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPnJjLmRhdGFbMF0sIDAsIGJ5dGVfY291bnQsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPnJjLmRhdGFbMF0sIDEsIGxfa2V5LCBoZXJtb24tPmxrZXkgKTsKKwlNTFhfRklMTF8xICggJndxZS0+cmMuZGF0YVswXSwgMywKKwkJICAgICBsb2NhbF9hZGRyZXNzX2wsIHZpcnRfdG9fYnVzICggaW9idWYtPmRhdGEgKSApOworCXJldHVybiBIRVJNT05fT1BDT0RFX1NFTkQ7Cit9CisKKy8qKiBXb3JrIHF1ZXVlIGVudHJ5IGNvbnN0cnVjdG9ycyAqLworc3RhdGljIHVuc2lnbmVkIGludAorKCAqIGhlcm1vbl9maWxsX3NlbmRfd3FlW10gKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2LAorCQkJICAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJICAgICAgIHVuaW9uIGhlcm1vbl9zZW5kX3dxZSAqd3FlICkgPSB7CisJW0lCX1FQVF9TTUldID0gaGVybW9uX2ZpbGxfbWx4X3NlbmRfd3FlLAorCVtJQl9RUFRfR1NJXSA9IGhlcm1vbl9maWxsX21seF9zZW5kX3dxZSwKKwlbSUJfUVBUX1VEXSA9IGhlcm1vbl9maWxsX3VkX3NlbmRfd3FlLAorCVtJQl9RUFRfUkNdID0gaGVybW9uX2ZpbGxfcmNfc2VuZF93cWUsCit9OworCisvKioKKyAqIFBvc3Qgc2VuZCB3b3JrIHF1ZXVlIGVudHJ5CisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGVybW9uX3Bvc3Rfc2VuZCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJICAgICAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiwKKwkJCSAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXN0cnVjdCBoZXJtb24gKmhlcm1vbiA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgaGVybW9uX3F1ZXVlX3BhaXIgKmhlcm1vbl9xcCA9IGliX3FwX2dldF9kcnZkYXRhICggcXAgKTsKKwlzdHJ1Y3QgaWJfd29ya19xdWV1ZSAqd3EgPSAmcXAtPnNlbmQ7CisJc3RydWN0IGhlcm1vbl9zZW5kX3dvcmtfcXVldWUgKmhlcm1vbl9zZW5kX3dxID0gJmhlcm1vbl9xcC0+c2VuZDsKKwl1bmlvbiBoZXJtb25fc2VuZF93cWUgKndxZTsKKwl1bmlvbiBoZXJtb25wcm1fZG9vcmJlbGxfcmVnaXN0ZXIgZGJfcmVnOworCXVuc2lnbmVkIGludCB3cWVfaWR4X21hc2s7CisJdW5zaWduZWQgaW50IG9wY29kZTsKKworCS8qIEFsbG9jYXRlIHdvcmsgcXVldWUgZW50cnkgKi8KKwl3cWVfaWR4X21hc2sgPSAoIHdxLT5udW1fd3FlcyAtIDEgKTsKKwlpZiAoIHdxLT5pb2J1ZnNbd3EtPm5leHRfaWR4ICYgd3FlX2lkeF9tYXNrXSApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBzZW5kIHF1ZXVlIGZ1bGwiLCBoZXJtb24gKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwl3cS0+aW9idWZzW3dxLT5uZXh0X2lkeCAmIHdxZV9pZHhfbWFza10gPSBpb2J1ZjsKKwl3cWUgPSAmaGVybW9uX3NlbmRfd3EtPndxZVsgd3EtPm5leHRfaWR4ICYKKwkJCQkgICAgKCBoZXJtb25fc2VuZF93cS0+bnVtX3dxZXMgLSAxICkgXTsKKworCS8qIENvbnN0cnVjdCB3b3JrIHF1ZXVlIGVudHJ5ICovCisJbWVtc2V0ICggKCAoICggdm9pZCAqICkgd3FlICkgKyA0IC8qIGF2b2lkIGN0cmwub3duZXIgKi8gKSwgMCwKKwkJICAgKCBzaXplb2YgKCAqd3FlICkgLSA0ICkgKTsKKwlhc3NlcnQgKCBxcC0+dHlwZSA8ICggc2l6ZW9mICggaGVybW9uX2ZpbGxfc2VuZF93cWUgKSAvCisJCQkgICAgICBzaXplb2YgKCBoZXJtb25fZmlsbF9zZW5kX3dxZVswXSApICkgKTsKKwlhc3NlcnQgKCBoZXJtb25fZmlsbF9zZW5kX3dxZVtxcC0+dHlwZV0gIT0gTlVMTCApOworCW9wY29kZSA9IGhlcm1vbl9maWxsX3NlbmRfd3FlW3FwLT50eXBlXSAoIGliZGV2LCBxcCwgYXYsIGlvYnVmLCB3cWUgKTsKKwliYXJyaWVyKCk7CisJTUxYX0ZJTExfMiAoICZ3cWUtPmN0cmwsIDAsCisJCSAgICAgb3Bjb2RlLCBvcGNvZGUsCisJCSAgICAgb3duZXIsCisJCSAgICAgKCAoIHdxLT5uZXh0X2lkeCAmIGhlcm1vbl9zZW5kX3dxLT5udW1fd3FlcyApID8gMSA6IDAgKSApOworCURCR0NQICggaGVybW9uLCAiSGVybW9uICVwIHBvc3Rpbmcgc2VuZCBXUUU6XG4iLCBoZXJtb24gKTsKKwlEQkdDUF9IRCAoIGhlcm1vbiwgd3FlLCBzaXplb2YgKCAqd3FlICkgKTsKKwliYXJyaWVyKCk7CisKKwkvKiBSaW5nIGRvb3JiZWxsIHJlZ2lzdGVyICovCisJTUxYX0ZJTExfMSAoICZkYl9yZWcuc2VuZCwgMCwgcW4sIHFwLT5xcG4gKTsKKwlEQkdDUCAoIGhlcm1vbiwgIlJpbmdpbmcgZG9vcmJlbGwgJTA4bHggd2l0aCAlMDh4XG4iLAorCQl2aXJ0X3RvX3BoeXMgKCBoZXJtb25fc2VuZF93cS0+ZG9vcmJlbGwgKSwgZGJfcmVnLmR3b3JkWzBdICk7CisJd3JpdGVsICggZGJfcmVnLmR3b3JkWzBdLCAoIGhlcm1vbl9zZW5kX3dxLT5kb29yYmVsbCApICk7CisKKwkvKiBVcGRhdGUgd29yayBxdWV1ZSdzIGluZGV4ICovCisJd3EtPm5leHRfaWR4Kys7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQb3N0IHJlY2VpdmUgd29yayBxdWV1ZSBlbnRyeQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBoZXJtb25fcG9zdF9yZWN2ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApIHsKKwlzdHJ1Y3QgaGVybW9uICpoZXJtb24gPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGhlcm1vbl9xdWV1ZV9wYWlyICpoZXJtb25fcXAgPSBpYl9xcF9nZXRfZHJ2ZGF0YSAoIHFwICk7CisJc3RydWN0IGliX3dvcmtfcXVldWUgKndxID0gJnFwLT5yZWN2OworCXN0cnVjdCBoZXJtb25fcmVjdl93b3JrX3F1ZXVlICpoZXJtb25fcmVjdl93cSA9ICZoZXJtb25fcXAtPnJlY3Y7CisJc3RydWN0IGhlcm1vbnBybV9yZWN2X3dxZSAqd3FlOworCXVuc2lnbmVkIGludCB3cWVfaWR4X21hc2s7CisKKwkvKiBBbGxvY2F0ZSB3b3JrIHF1ZXVlIGVudHJ5ICovCisJd3FlX2lkeF9tYXNrID0gKCB3cS0+bnVtX3dxZXMgLSAxICk7CisJaWYgKCB3cS0+aW9idWZzW3dxLT5uZXh0X2lkeCAmIHdxZV9pZHhfbWFza10gKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgcmVjZWl2ZSBxdWV1ZSBmdWxsIiwgaGVybW9uICk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJd3EtPmlvYnVmc1t3cS0+bmV4dF9pZHggJiB3cWVfaWR4X21hc2tdID0gaW9idWY7CisJd3FlID0gJmhlcm1vbl9yZWN2X3dxLT53cWVbd3EtPm5leHRfaWR4ICYgd3FlX2lkeF9tYXNrXS5yZWN2OworCisJLyogQ29uc3RydWN0IHdvcmsgcXVldWUgZW50cnkgKi8KKwlNTFhfRklMTF8xICggJndxZS0+ZGF0YVswXSwgMCwgYnl0ZV9jb3VudCwgaW9iX3RhaWxyb29tICggaW9idWYgKSApOworCU1MWF9GSUxMXzEgKCAmd3FlLT5kYXRhWzBdLCAxLCBsX2tleSwgaGVybW9uLT5sa2V5ICk7CisJTUxYX0ZJTExfMSAoICZ3cWUtPmRhdGFbMF0sIDMsCisJCSAgICAgbG9jYWxfYWRkcmVzc19sLCB2aXJ0X3RvX2J1cyAoIGlvYnVmLT5kYXRhICkgKTsKKworCS8qIFVwZGF0ZSB3b3JrIHF1ZXVlJ3MgaW5kZXggKi8KKwl3cS0+bmV4dF9pZHgrKzsKKworCS8qIFVwZGF0ZSBkb29yYmVsbCByZWNvcmQgKi8KKwliYXJyaWVyKCk7CisJTUxYX0ZJTExfMSAoICZoZXJtb25fcmVjdl93cS0+ZG9vcmJlbGwsIDAsIHJlY2VpdmVfd3FlX2NvdW50ZXIsCisJCSAgICAgKCB3cS0+bmV4dF9pZHggJiAweGZmZmYgKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFuZGxlIGNvbXBsZXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IGNxCQlDb21wbGV0aW9uIHF1ZXVlCisgKiBAdiBjcWUJCUhhcmR3YXJlIGNvbXBsZXRpb24gcXVldWUgZW50cnkKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGhlcm1vbl9jb21wbGV0ZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3EsCisJCQkgICAgIHVuaW9uIGhlcm1vbnBybV9jb21wbGV0aW9uX2VudHJ5ICpjcWUgKSB7CisJc3RydWN0IGhlcm1vbiAqaGVybW9uID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0cnVjdCBpYl93b3JrX3F1ZXVlICp3cTsKKwlzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXA7CisJc3RydWN0IGhlcm1vbl9xdWV1ZV9wYWlyICpoZXJtb25fcXA7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisJc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yIHJlY3ZfYXY7CisJc3RydWN0IGliX2dsb2JhbF9yb3V0ZV9oZWFkZXIgKmdyaDsKKwlzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2OworCXVuc2lnbmVkIGludCBvcGNvZGU7CisJdW5zaWduZWQgbG9uZyBxcG47CisJaW50IGlzX3NlbmQ7CisJdW5zaWduZWQgaW50IHdxZV9pZHg7CisJc2l6ZV90IGxlbjsKKwlpbnQgcmMgPSAwOworCisJLyogUGFyc2UgY29tcGxldGlvbiAqLworCXFwbiA9IE1MWF9HRVQgKCAmY3FlLT5ub3JtYWwsIHFwbiApOworCWlzX3NlbmQgPSBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCBzX3IgKTsKKwlvcGNvZGUgPSBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCBvcGNvZGUgKTsKKwlpZiAoIG9wY29kZSA+PSBIRVJNT05fT1BDT0RFX1JFQ1ZfRVJST1IgKSB7CisJCS8qICJzIiBmaWVsZCBpcyBub3QgdmFsaWQgZm9yIGVycm9yIG9wY29kZXMgKi8KKwkJaXNfc2VuZCA9ICggb3Bjb2RlID09IEhFUk1PTl9PUENPREVfU0VORF9FUlJPUiApOworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIENRTiAlbHggc3luZHJvbWUgJXggdmVuZG9yICV4XG4iLAorCQkgICAgICAgaGVybW9uLCBjcS0+Y3FuLCBNTFhfR0VUICggJmNxZS0+ZXJyb3IsIHN5bmRyb21lICksCisJCSAgICAgICBNTFhfR0VUICggJmNxZS0+ZXJyb3IsIHZlbmRvcl9lcnJvcl9zeW5kcm9tZSApICk7CisJCXJjID0gLUVJTzsKKwkJLyogRG9uJ3QgcmV0dXJuIGltbWVkaWF0ZWx5OyBwcm9wYWdhdGUgZXJyb3IgdG8gY29tcGxldGVyICovCisJfQorCisJLyogSWRlbnRpZnkgd29yayBxdWV1ZSAqLworCXdxID0gaWJfZmluZF93cSAoIGNxLCBxcG4sIGlzX3NlbmQgKTsKKwlpZiAoICEgd3EgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgQ1FOICVseCB1bmtub3duICVzIFFQTiAlbHhcbiIsCisJCSAgICAgICBoZXJtb24sIGNxLT5jcW4sICggaXNfc2VuZCA/ICJzZW5kIiA6ICJyZWN2IiApLCBxcG4gKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXFwID0gd3EtPnFwOworCWhlcm1vbl9xcCA9IGliX3FwX2dldF9kcnZkYXRhICggcXAgKTsKKworCS8qIElkZW50aWZ5IEkvTyBidWZmZXIgKi8KKwl3cWVfaWR4ID0gKCBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCB3cWVfY291bnRlciApICYKKwkJICAgICggd3EtPm51bV93cWVzIC0gMSApICk7CisJaW9idWYgPSB3cS0+aW9idWZzW3dxZV9pZHhdOworCWlmICggISBpb2J1ZiApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBDUU4gJWx4IFFQTiAlbHggZW1wdHkgV1FFICV4XG4iLAorCQkgICAgICAgaGVybW9uLCBjcS0+Y3FuLCBxcC0+cXBuLCB3cWVfaWR4ICk7CisJCXJldHVybiAtRUlPOworCX0KKwl3cS0+aW9idWZzW3dxZV9pZHhdID0gTlVMTDsKKworCWlmICggaXNfc2VuZCApIHsKKwkJLyogSGFuZCBvZmYgdG8gY29tcGxldGlvbiBoYW5kbGVyICovCisJCWliX2NvbXBsZXRlX3NlbmQgKCBpYmRldiwgcXAsIGlvYnVmLCByYyApOworCX0gZWxzZSB7CisJCS8qIFNldCByZWNlaXZlZCBsZW5ndGggKi8KKwkJbGVuID0gTUxYX0dFVCAoICZjcWUtPm5vcm1hbCwgYnl0ZV9jbnQgKTsKKwkJYXNzZXJ0ICggbGVuIDw9IGlvYl90YWlscm9vbSAoIGlvYnVmICkgKTsKKwkJaW9iX3B1dCAoIGlvYnVmLCBsZW4gKTsKKwkJc3dpdGNoICggcXAtPnR5cGUgKSB7CisJCWNhc2UgSUJfUVBUX1NNSToKKwkJY2FzZSBJQl9RUFRfR1NJOgorCQljYXNlIElCX1FQVF9VRDoKKwkJCWFzc2VydCAoIGlvYl9sZW4gKCBpb2J1ZiApID49IHNpemVvZiAoICpncmggKSApOworCQkJZ3JoID0gaW9idWYtPmRhdGE7CisJCQlpb2JfcHVsbCAoIGlvYnVmLCBzaXplb2YgKCAqZ3JoICkgKTsKKwkJCS8qIENvbnN0cnVjdCBhZGRyZXNzIHZlY3RvciAqLworCQkJYXYgPSAmcmVjdl9hdjsKKwkJCW1lbXNldCAoIGF2LCAwLCBzaXplb2YgKCAqYXYgKSApOworCQkJYXYtPnFwbiA9IE1MWF9HRVQgKCAmY3FlLT5ub3JtYWwsIHNycV9ycXBuICk7CisJCQlhdi0+bGlkID0gTUxYX0dFVCAoICZjcWUtPm5vcm1hbCwgc2xpZF9zbWFjNDdfMzIgKTsKKwkJCWF2LT5zbCA9IE1MWF9HRVQgKCAmY3FlLT5ub3JtYWwsIHNsICk7CisJCQlhdi0+Z2lkX3ByZXNlbnQgPSBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCBnICk7CisJCQltZW1jcHkgKCAmYXYtPmdpZCwgJmdyaC0+c2dpZCwgc2l6ZW9mICggYXYtPmdpZCApICk7CisJCQlicmVhazsKKwkJY2FzZSBJQl9RUFRfUkM6CisJCQlhdiA9ICZxcC0+YXY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWFzc2VydCAoIDAgKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIEhhbmQgb2ZmIHRvIGNvbXBsZXRpb24gaGFuZGxlciAqLworCQlpYl9jb21wbGV0ZV9yZWN2ICggaWJkZXYsIHFwLCBhdiwgaW9idWYsIHJjICk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFBvbGwgY29tcGxldGlvbiBxdWV1ZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgY3EJCUNvbXBsZXRpb24gcXVldWUKKyAqLworc3RhdGljIHZvaWQgaGVybW9uX3BvbGxfY3EgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxICkgeworCXN0cnVjdCBoZXJtb24gKmhlcm1vbiA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgaGVybW9uX2NvbXBsZXRpb25fcXVldWUgKmhlcm1vbl9jcSA9IGliX2NxX2dldF9kcnZkYXRhICggY3EgKTsKKwl1bmlvbiBoZXJtb25wcm1fY29tcGxldGlvbl9lbnRyeSAqY3FlOworCXVuc2lnbmVkIGludCBjcWVfaWR4X21hc2s7CisJaW50IHJjOworCisJd2hpbGUgKCAxICkgeworCQkvKiBMb29rIGZvciBjb21wbGV0aW9uIGVudHJ5ICovCisJCWNxZV9pZHhfbWFzayA9ICggY3EtPm51bV9jcWVzIC0gMSApOworCQljcWUgPSAmaGVybW9uX2NxLT5jcWVbY3EtPm5leHRfaWR4ICYgY3FlX2lkeF9tYXNrXTsKKwkJaWYgKCBNTFhfR0VUICggJmNxZS0+bm9ybWFsLCBvd25lciApIF4KKwkJICAgICAoICggY3EtPm5leHRfaWR4ICYgY3EtPm51bV9jcWVzICkgPyAxIDogMCApICkgeworCQkJLyogRW50cnkgc3RpbGwgb3duZWQgYnkgaGFyZHdhcmU7IGVuZCBvZiBwb2xsICovCisJCQlicmVhazsKKwkJfQorCQlEQkdDUCAoIGhlcm1vbiwgIkhlcm1vbiAlcCBjb21wbGV0aW9uOlxuIiwgaGVybW9uICk7CisJCURCR0NQX0hEICggaGVybW9uLCBjcWUsIHNpemVvZiAoICpjcWUgKSApOworCisJCS8qIEhhbmRsZSBjb21wbGV0aW9uICovCisJCWlmICggKCByYyA9IGhlcm1vbl9jb21wbGV0ZSAoIGliZGV2LCBjcSwgY3FlICkgKSAhPSAwICkgeworCQkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBmYWlsZWQgdG8gY29tcGxldGU6ICVzXG4iLAorCQkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCQlEQkdDX0hEICggaGVybW9uLCBjcWUsIHNpemVvZiAoICpjcWUgKSApOworCQl9CisKKwkJLyogVXBkYXRlIGNvbXBsZXRpb24gcXVldWUncyBpbmRleCAqLworCQljcS0+bmV4dF9pZHgrKzsKKworCQkvKiBVcGRhdGUgZG9vcmJlbGwgcmVjb3JkICovCisJCU1MWF9GSUxMXzEgKCAmaGVybW9uX2NxLT5kb29yYmVsbCwgMCwgdXBkYXRlX2NpLAorCQkJICAgICAoIGNxLT5uZXh0X2lkeCAmIDB4MDBmZmZmZmZVTCApICk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXZlbnQgcXVldWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQ3JlYXRlIGV2ZW50IHF1ZXVlCisgKgorICogQHYgaGVybW9uCQlIZXJtb24gZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBoZXJtb25fY3JlYXRlX2VxICggc3RydWN0IGhlcm1vbiAqaGVybW9uICkgeworCXN0cnVjdCBoZXJtb25fZXZlbnRfcXVldWUgKmhlcm1vbl9lcSA9ICZoZXJtb24tPmVxOworCXN0cnVjdCBoZXJtb25wcm1fZXFjIGVxY3R4OworCXN0cnVjdCBoZXJtb25wcm1fZXZlbnRfbWFzayBtYXNrOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCS8qIFNlbGVjdCBldmVudCBxdWV1ZSBudW1iZXIgKi8KKwloZXJtb25fZXEtPmVxbiA9ICggNCAqIGhlcm1vbi0+Y2FwLnJlc2VydmVkX3VhcnMgKTsKKwlpZiAoIGhlcm1vbl9lcS0+ZXFuIDwgaGVybW9uLT5jYXAucmVzZXJ2ZWRfZXFzICkKKwkJaGVybW9uX2VxLT5lcW4gPSBoZXJtb24tPmNhcC5yZXNlcnZlZF9lcXM7CisKKwkvKiBDYWxjdWxhdGUgZG9vcmJlbGwgYWRkcmVzcyAqLworCWhlcm1vbl9lcS0+ZG9vcmJlbGwgPQorCQkoIGhlcm1vbi0+dWFyICsgSEVSTU9OX0RCX0VRX09GRlNFVCAoIGhlcm1vbl9lcS0+ZXFuICkgKTsKKworCS8qIEFsbG9jYXRlIGV2ZW50IHF1ZXVlIGl0c2VsZiAqLworCWhlcm1vbl9lcS0+ZXFlX3NpemUgPQorCQkoIEhFUk1PTl9OVU1fRVFFUyAqIHNpemVvZiAoIGhlcm1vbl9lcS0+ZXFlWzBdICkgKTsKKwloZXJtb25fZXEtPmVxZSA9IG1hbGxvY19kbWEgKCBoZXJtb25fZXEtPmVxZV9zaXplLAorCQkJCSAgICAgIHNpemVvZiAoIGhlcm1vbl9lcS0+ZXFlWzBdICkgKTsKKwlpZiAoICEgaGVybW9uX2VxLT5lcWUgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfZXFlOworCX0KKwltZW1zZXQgKCBoZXJtb25fZXEtPmVxZSwgMCwgaGVybW9uX2VxLT5lcWVfc2l6ZSApOworCWZvciAoIGkgPSAwIDsgaSA8IEhFUk1PTl9OVU1fRVFFUyA7IGkrKyApIHsKKwkJTUxYX0ZJTExfMSAoICZoZXJtb25fZXEtPmVxZVtpXS5nZW5lcmljLCA3LCBvd25lciwgMSApOworCX0KKwliYXJyaWVyKCk7CisKKwkvKiBBbGxvY2F0ZSBNVFQgZW50cmllcyAqLworCWlmICggKCByYyA9IGhlcm1vbl9hbGxvY19tdHQgKCBoZXJtb24sIGhlcm1vbl9lcS0+ZXFlLAorCQkJCSAgICAgICBoZXJtb25fZXEtPmVxZV9zaXplLAorCQkJCSAgICAgICAmaGVybW9uX2VxLT5tdHQgKSApICE9IDAgKQorCQlnb3RvIGVycl9hbGxvY19tdHQ7CisKKwkvKiBIYW5kIHF1ZXVlIG92ZXIgdG8gaGFyZHdhcmUgKi8KKwltZW1zZXQgKCAmZXFjdHgsIDAsIHNpemVvZiAoIGVxY3R4ICkgKTsKKwlNTFhfRklMTF8xICggJmVxY3R4LCAwLCBzdCwgMHhhIC8qICJGaXJlZCIgKi8gKTsKKwlNTFhfRklMTF8xICggJmVxY3R4LCAyLAorCQkgICAgIHBhZ2Vfb2Zmc2V0LCAoIGhlcm1vbl9lcS0+bXR0LnBhZ2Vfb2Zmc2V0ID4+IDUgKSApOworCU1MWF9GSUxMXzEgKCAmZXFjdHgsIDMsIGxvZ19lcV9zaXplLCBmbHMgKCBIRVJNT05fTlVNX0VRRVMgLSAxICkgKTsKKwlNTFhfRklMTF8xICggJmVxY3R4LCA3LCBtdHRfYmFzZV9hZGRyX2wsCisJCSAgICAgKCBoZXJtb25fZXEtPm10dC5tdHRfYmFzZV9hZGRyID4+IDMgKSApOworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfc3cyaHdfZXEgKCBoZXJtb24sIGhlcm1vbl9lcS0+ZXFuLAorCQkJCQkgICZlcWN0eCApICkgIT0gMCApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBTVzJIV19FUSBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICAgaGVybW9uLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfc3cyaHdfZXE7CisJfQorCisJLyogTWFwIGV2ZW50cyB0byB0aGlzIGV2ZW50IHF1ZXVlICovCisJbWVtc2V0ICggJm1hc2ssIDAsIHNpemVvZiAoIG1hc2sgKSApOworCU1MWF9GSUxMXzEgKCAmbWFzaywgMSwgcG9ydF9zdGF0ZV9jaGFuZ2UsIDEgKTsKKwlpZiAoICggcmMgPSBoZXJtb25fY21kX21hcF9lcSAoIGhlcm1vbiwKKwkJCQkJKCBIRVJNT05fTUFQX0VRIHwgaGVybW9uX2VxLT5lcW4gKSwKKwkJCQkJJm1hc2sgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgTUFQX0VRIGZhaWxlZDogJXNcbiIsCisJCSAgICAgICBoZXJtb24sIHN0cmVycm9yICggcmMgKSAgKTsKKwkJZ290byBlcnJfbWFwX2VxOworCX0KKworCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgRVFOICUjbHggcmluZyBhdCBbJXAsJXBdKVxuIiwKKwkgICAgICAgaGVybW9uLCBoZXJtb25fZXEtPmVxbiwgaGVybW9uX2VxLT5lcWUsCisJICAgICAgICggKCAoIHZvaWQgKiApIGhlcm1vbl9lcS0+ZXFlICkgKyBoZXJtb25fZXEtPmVxZV9zaXplICkgKTsKKwlyZXR1cm4gMDsKKworIGVycl9tYXBfZXE6CisJaGVybW9uX2NtZF9odzJzd19lcSAoIGhlcm1vbiwgaGVybW9uX2VxLT5lcW4sICZlcWN0eCApOworIGVycl9zdzJod19lcToKKwloZXJtb25fZnJlZV9tdHQgKCBoZXJtb24sICZoZXJtb25fZXEtPm10dCApOworIGVycl9hbGxvY19tdHQ6CisJZnJlZV9kbWEgKCBoZXJtb25fZXEtPmVxZSwgaGVybW9uX2VxLT5lcWVfc2l6ZSApOworIGVycl9lcWU6CisJbWVtc2V0ICggaGVybW9uX2VxLCAwLCBzaXplb2YgKCAqaGVybW9uX2VxICkgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogRGVzdHJveSBldmVudCBxdWV1ZQorICoKKyAqIEB2IGhlcm1vbgkJSGVybW9uIGRldmljZQorICovCitzdGF0aWMgdm9pZCBoZXJtb25fZGVzdHJveV9lcSAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiApIHsKKwlzdHJ1Y3QgaGVybW9uX2V2ZW50X3F1ZXVlICpoZXJtb25fZXEgPSAmaGVybW9uLT5lcTsKKwlzdHJ1Y3QgaGVybW9ucHJtX2VxYyBlcWN0eDsKKwlzdHJ1Y3QgaGVybW9ucHJtX2V2ZW50X21hc2sgbWFzazsKKwlpbnQgcmM7CisKKwkvKiBVbm1hcCBldmVudHMgZnJvbSBldmVudCBxdWV1ZSAqLworCW1lbXNldCAoICZtYXNrLCAwLCBzaXplb2YgKCBtYXNrICkgKTsKKwlNTFhfRklMTF8xICggJm1hc2ssIDEsIHBvcnRfc3RhdGVfY2hhbmdlLCAxICk7CisJaWYgKCAoIHJjID0gaGVybW9uX2NtZF9tYXBfZXEgKCBoZXJtb24sCisJCQkJCSggSEVSTU9OX1VOTUFQX0VRIHwgaGVybW9uX2VxLT5lcW4gKSwKKwkJCQkJJm1hc2sgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgRkFUQUwgTUFQX0VRIGZhaWxlZCB0byB1bm1hcDogJXNcbiIsCisJCSAgICAgICBoZXJtb24sIHN0cmVycm9yICggcmMgKSApOworCQkvKiBDb250aW51ZTsgSENBIG1heSBkaWUgYnV0IHN5c3RlbSBzaG91bGQgc3Vydml2ZSAqLworCX0KKworCS8qIFRha2Ugb3duZXJzaGlwIGJhY2sgZnJvbSBoYXJkd2FyZSAqLworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfaHcyc3dfZXEgKCBoZXJtb24sIGhlcm1vbl9lcS0+ZXFuLAorCQkJCQkgICZlcWN0eCApICkgIT0gMCApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBGQVRBTCBIVzJTV19FUSBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICAgaGVybW9uLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJLyogTGVhayBtZW1vcnkgYW5kIHJldHVybjsgYXQgbGVhc3Qgd2UgYXZvaWQgY29ycnVwdGlvbiAqLworCQlyZXR1cm47CisJfQorCisJLyogRnJlZSBNVFQgZW50cmllcyAqLworCWhlcm1vbl9mcmVlX210dCAoIGhlcm1vbiwgJmhlcm1vbl9lcS0+bXR0ICk7CisKKwkvKiBGcmVlIG1lbW9yeSAqLworCWZyZWVfZG1hICggaGVybW9uX2VxLT5lcWUsIGhlcm1vbl9lcS0+ZXFlX3NpemUgKTsKKwltZW1zZXQgKCBoZXJtb25fZXEsIDAsIHNpemVvZiAoICpoZXJtb25fZXEgKSApOworfQorCisvKioKKyAqIEhhbmRsZSBwb3J0IHN0YXRlIGV2ZW50CisgKgorICogQHYgaGVybW9uCQlIZXJtb24gZGV2aWNlCisgKiBAdiBlcWUJCVBvcnQgc3RhdGUgY2hhbmdlIGV2ZW50IHF1ZXVlIGVudHJ5CisgKi8KK3N0YXRpYyB2b2lkIGhlcm1vbl9ldmVudF9wb3J0X3N0YXRlX2NoYW5nZSAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwKKwkJCQkJICAgICB1bmlvbiBoZXJtb25wcm1fZXZlbnRfZW50cnkgKmVxZSl7CisJdW5zaWduZWQgaW50IHBvcnQ7CisJaW50IGxpbmtfdXA7CisKKwkvKiBHZXQgcG9ydCBhbmQgbGluayBzdGF0dXMgKi8KKwlwb3J0ID0gKCBNTFhfR0VUICggJmVxZS0+cG9ydF9zdGF0ZV9jaGFuZ2UsIGRhdGEucCApIC0gMSApOworCWxpbmtfdXAgPSAoIE1MWF9HRVQgKCAmZXFlLT5nZW5lcmljLCBldmVudF9zdWJfdHlwZSApICYgMHgwNCApOworCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgcG9ydCAlZCBsaW5rICVzXG4iLCBoZXJtb24sICggcG9ydCArIDEgKSwKKwkgICAgICAgKCBsaW5rX3VwID8gInVwIiA6ICJkb3duIiApICk7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIHBvcnQgPj0gaGVybW9uLT5jYXAubnVtX3BvcnRzICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIHBvcnQgJWQgZG9lcyBub3QgZXhpc3QhXG4iLAorCQkgICAgICAgaGVybW9uLCAoIHBvcnQgKyAxICkgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFVwZGF0ZSBNQUQgcGFyYW1ldGVycyAqLworCWliX3NtY191cGRhdGUgKCBoZXJtb24tPmliZGV2W3BvcnRdLCBoZXJtb25fbWFkICk7CisKKwkvKiBOb3RpZnkgSW5maW5pYmFuZCBjb3JlIG9mIGxpbmsgc3RhdGUgY2hhbmdlICovCisJaWJfbGlua19zdGF0ZV9jaGFuZ2VkICggaGVybW9uLT5pYmRldltwb3J0XSApOworfQorCisvKioKKyAqIFBvbGwgZXZlbnQgcXVldWUKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaGVybW9uX3BvbGxfZXEgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKwlzdHJ1Y3QgaGVybW9uICpoZXJtb24gPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGhlcm1vbl9ldmVudF9xdWV1ZSAqaGVybW9uX2VxID0gJmhlcm1vbi0+ZXE7CisJdW5pb24gaGVybW9ucHJtX2V2ZW50X2VudHJ5ICplcWU7CisJdW5pb24gaGVybW9ucHJtX2Rvb3JiZWxsX3JlZ2lzdGVyIGRiX3JlZzsKKwl1bnNpZ25lZCBpbnQgZXFlX2lkeF9tYXNrOworCXVuc2lnbmVkIGludCBldmVudF90eXBlOworCisJd2hpbGUgKCAxICkgeworCQkvKiBMb29rIGZvciBldmVudCBlbnRyeSAqLworCQllcWVfaWR4X21hc2sgPSAoIEhFUk1PTl9OVU1fRVFFUyAtIDEgKTsKKwkJZXFlID0gJmhlcm1vbl9lcS0+ZXFlW2hlcm1vbl9lcS0+bmV4dF9pZHggJiBlcWVfaWR4X21hc2tdOworCQlpZiAoIE1MWF9HRVQgKCAmZXFlLT5nZW5lcmljLCBvd25lciApIF4KKwkJICAgICAoICggaGVybW9uX2VxLT5uZXh0X2lkeCAmIEhFUk1PTl9OVU1fRVFFUyApID8gMSA6IDAgKSApIHsKKwkJCS8qIEVudHJ5IHN0aWxsIG93bmVkIGJ5IGhhcmR3YXJlOyBlbmQgb2YgcG9sbCAqLworCQkJYnJlYWs7CisJCX0KKwkJREJHQ1AgKCBoZXJtb24sICJIZXJtb24gJXAgZXZlbnQ6XG4iLCBoZXJtb24gKTsKKwkJREJHQ1BfSEQgKCBoZXJtb24sIGVxZSwgc2l6ZW9mICggKmVxZSApICk7CisKKwkJLyogSGFuZGxlIGV2ZW50ICovCisJCWV2ZW50X3R5cGUgPSBNTFhfR0VUICggJmVxZS0+Z2VuZXJpYywgZXZlbnRfdHlwZSApOworCQlzd2l0Y2ggKCBldmVudF90eXBlICkgeworCQljYXNlIEhFUk1PTl9FVl9QT1JUX1NUQVRFX0NIQU5HRToKKwkJCWhlcm1vbl9ldmVudF9wb3J0X3N0YXRlX2NoYW5nZSAoIGhlcm1vbiwgZXFlICk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgdW5yZWNvZ25pc2VkIGV2ZW50IHR5cGUgIgorCQkJICAgICAgICIlI3g6XG4iLCBoZXJtb24sIGV2ZW50X3R5cGUgKTsKKwkJCURCR0NfSEQgKCBoZXJtb24sIGVxZSwgc2l6ZW9mICggKmVxZSApICk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFVwZGF0ZSBldmVudCBxdWV1ZSdzIGluZGV4ICovCisJCWhlcm1vbl9lcS0+bmV4dF9pZHgrKzsKKworCQkvKiBSaW5nIGRvb3JiZWxsICovCisJCU1MWF9GSUxMXzEgKCAmZGJfcmVnLmV2ZW50LCAwLAorCQkJICAgICBjaSwgKCBoZXJtb25fZXEtPm5leHRfaWR4ICYgMHgwMGZmZmZmZlVMICkgKTsKKwkJREJHQ1AgKCBoZXJtb24sICJSaW5naW5nIGRvb3JiZWxsICUwOGx4IHdpdGggJTA4eFxuIiwKKwkJCXZpcnRfdG9fcGh5cyAoIGhlcm1vbl9lcS0+ZG9vcmJlbGwgKSwKKwkJCWRiX3JlZy5kd29yZFswXSApOworCQl3cml0ZWwgKCBkYl9yZWcuZHdvcmRbMF0sIGhlcm1vbl9lcS0+ZG9vcmJlbGwgKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbmZpbmliYW5kIGxpbmstbGF5ZXIgb3BlcmF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFNlbnNlIHBvcnQgdHlwZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHJldCBwb3J0X3R5cGUJUG9ydCB0eXBlLCBvciBuZWdhdGl2ZSBlcnJvcgorICovCitzdGF0aWMgaW50IGhlcm1vbl9zZW5zZV9wb3J0X3R5cGUgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKwlzdHJ1Y3QgaGVybW9uICpoZXJtb24gPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGhlcm1vbnBybV9zZW5zZV9wb3J0IHNlbnNlX3BvcnQ7CisJaW50IHBvcnRfdHlwZTsKKwlpbnQgcmM7CisKKwkvKiBJZiBEUERQIGlzIG5vdCBzdXBwb3J0ZWQsIGFsd2F5cyBhc3N1bWUgSW5maW5pYmFuZCAqLworCWlmICggISBoZXJtb24tPmNhcC5kcGRwICkKKwkJcmV0dXJuIEhFUk1PTl9QT1JUX1RZUEVfSUI7CisKKwkvKiBTZW5zZSB0aGUgcG9ydCB0eXBlICovCisJaWYgKCAoIHJjID0gaGVybW9uX2NtZF9zZW5zZV9wb3J0ICggaGVybW9uLCBpYmRldi0+cG9ydCwKKwkJCQkJICAgICZzZW5zZV9wb3J0ICkgKSAhPSAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIHBvcnQgJWQgc2Vuc2UgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgaWJkZXYtPnBvcnQsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCXBvcnRfdHlwZSA9IE1MWF9HRVQgKCAmc2Vuc2VfcG9ydCwgcG9ydF90eXBlICk7CisKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIHBvcnQgJWQgdHlwZSAlZFxuIiwKKwkgICAgICAgaGVybW9uLCBpYmRldi0+cG9ydCwgcG9ydF90eXBlICk7CisJcmV0dXJuIHBvcnRfdHlwZTsKK30KKworLyoqCisgKiBJbml0aWFsaXNlIEluZmluaWJhbmQgbGluaworICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGVybW9uX29wZW4gKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKwlzdHJ1Y3QgaGVybW9uICpoZXJtb24gPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGhlcm1vbnBybV9pbml0X3BvcnQgaW5pdF9wb3J0OworCWludCBwb3J0X3R5cGU7CisJaW50IHJjOworCisJLyogQ2hlY2sgd2UgYXJlIGNvbm5lY3RlZCB0byBhbiBJbmZpbmliYW5kIG5ldHdvcmsgKi8KKwlpZiAoICggcmMgPSBwb3J0X3R5cGUgPSBoZXJtb25fc2Vuc2VfcG9ydF90eXBlICggaWJkZXYgKSApIDwgMCApCisJCXJldHVybiByYzsKKwlpZiAoIHBvcnRfdHlwZSAhPSBIRVJNT05fUE9SVF9UWVBFX0lCICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIHBvcnQgJWQgbm90IGNvbm5lY3RlZCB0byBhbiAiCisJCSAgICAgICAiSW5maW5pYmFuZCBuZXR3b3JrIiwgaGVybW9uLCBpYmRldi0+cG9ydCApOworCQlyZXR1cm4gLUVOT1RDT05OOworICAgICAgICB9CisKKwkvKiBJbml0IFBvcnQgKi8KKwltZW1zZXQgKCAmaW5pdF9wb3J0LCAwLCBzaXplb2YgKCBpbml0X3BvcnQgKSApOworCU1MWF9GSUxMXzIgKCAmaW5pdF9wb3J0LCAwLAorCQkgICAgIHBvcnRfd2lkdGhfY2FwLCAzLAorCQkgICAgIHZsX2NhcCwgMSApOworCU1MWF9GSUxMXzIgKCAmaW5pdF9wb3J0LCAxLAorCQkgICAgIG10dSwgSEVSTU9OX01UVV8yMDQ4LAorCQkgICAgIG1heF9naWQsIDEgKTsKKwlNTFhfRklMTF8xICggJmluaXRfcG9ydCwgMiwgbWF4X3BrZXksIDY0ICk7CisJaWYgKCAoIHJjID0gaGVybW9uX2NtZF9pbml0X3BvcnQgKCBoZXJtb24sIGliZGV2LT5wb3J0LAorCQkJCQkgICAmaW5pdF9wb3J0ICkgKSAhPSAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGNvdWxkIG5vdCBpbnRpYWxpc2UgcG9ydDogJXNcbiIsCisJCSAgICAgICBoZXJtb24sIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogVXBkYXRlIE1BRCBwYXJhbWV0ZXJzICovCisJaWJfc21jX3VwZGF0ZSAoIGliZGV2LCBoZXJtb25fbWFkICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDbG9zZSBJbmZpbmliYW5kIGxpbmsKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaGVybW9uX2Nsb3NlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKSB7CisJc3RydWN0IGhlcm1vbiAqaGVybW9uID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCWludCByYzsKKworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfY2xvc2VfcG9ydCAoIGhlcm1vbiwgaWJkZXYtPnBvcnQgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IGNsb3NlIHBvcnQ6ICVzXG4iLAorCQkgICAgICAgaGVybW9uLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJLyogTm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhpcyAqLworCX0KK30KKworLyoqCisgKiBJbmZvcm0gZW1iZWRkZWQgc3VibmV0IG1hbmFnZW1lbnQgYWdlbnQgb2YgYSByZWNlaXZlZCBNQUQKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG1hZAkJTUFECisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBoZXJtb25faW5mb3JtX3NtYSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgIHVuaW9uIGliX21hZCAqbWFkICkgeworCWludCByYzsKKworCS8qIFNlbmQgdGhlIE1BRCB0byB0aGUgZW1iZWRkZWQgU01BICovCisJaWYgKCAoIHJjID0gaGVybW9uX21hZCAoIGliZGV2LCBtYWQgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBVcGRhdGUgcGFyYW1ldGVycyBoZWxkIGluIHNvZnR3YXJlICovCisJaWJfc21jX3VwZGF0ZSAoIGliZGV2LCBoZXJtb25fbWFkICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE11bHRpY2FzdCBncm91cCBvcGVyYXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQXR0YWNoIHRvIG11bHRpY2FzdCBncm91cAorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGdpZAkJTXVsdGljYXN0IEdJRAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGVybW9uX21jYXN0X2F0dGFjaCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkJIHN0cnVjdCBpYl9naWQgKmdpZCApIHsKKwlzdHJ1Y3QgaGVybW9uICpoZXJtb24gPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGhlcm1vbnBybV9tZ21faGFzaCBoYXNoOworCXN0cnVjdCBoZXJtb25wcm1fbWNnX2VudHJ5IG1jZzsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJaW50IHJjOworCisJLyogR2VuZXJhdGUgaGFzaCB0YWJsZSBpbmRleCAqLworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfbWdpZF9oYXNoICggaGVybW9uLCBnaWQsICZoYXNoICkgKSAhPSAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGNvdWxkIG5vdCBoYXNoIEdJRDogJXNcbiIsCisJCSAgICAgICBoZXJtb24sIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCWluZGV4ID0gTUxYX0dFVCAoICZoYXNoLCBoYXNoICk7CisKKwkvKiBDaGVjayBmb3IgZXhpc3RpbmcgaGFzaCB0YWJsZSBlbnRyeSAqLworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfcmVhZF9tY2cgKCBoZXJtb24sIGluZGV4LCAmbWNnICkgKSAhPSAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGNvdWxkIG5vdCByZWFkIE1DRyAlI3g6ICVzXG4iLAorCQkgICAgICAgaGVybW9uLCBpbmRleCwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisJaWYgKCBNTFhfR0VUICggJm1jZywgaGRyLm1lbWJlcnNfY291bnQgKSAhPSAwICkgeworCQkvKiBGSVhNRTogdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3Mgb25seSBhIHNpbmdsZSBRUAorCQkgKiBwZXIgbXVsdGljYXN0IGdyb3VwLCBhbmQgZG9lc24ndCBoYW5kbGUgaGFzaAorCQkgKiBjb2xsaXNpb25zLiAgU3VmZmljaWVudCBmb3IgSVBvSUIgYnV0IG1heSBuZWVkIHRvCisJCSAqIGJlIGV4dGVuZGVkIGluIGZ1dHVyZS4KKwkJICovCisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgTUdJRCBpbmRleCAlI3ggYWxyZWFkeSBpbiB1c2VcbiIsCisJCSAgICAgICBoZXJtb24sIGluZGV4ICk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogVXBkYXRlIGhhc2ggdGFibGUgZW50cnkgKi8KKwlNTFhfRklMTF8xICggJm1jZywgMSwgaGRyLm1lbWJlcnNfY291bnQsIDEgKTsKKwlNTFhfRklMTF8xICggJm1jZywgOCwgcXBbMF0ucXBuLCBxcC0+cXBuICk7CisJbWVtY3B5ICggJm1jZy51LmR3b3Jkc1s0XSwgZ2lkLCBzaXplb2YgKCAqZ2lkICkgKTsKKwlpZiAoICggcmMgPSBoZXJtb25fY21kX3dyaXRlX21jZyAoIGhlcm1vbiwgaW5kZXgsICZtY2cgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IHdyaXRlIE1DRyAlI3g6ICVzXG4iLAorCQkgICAgICAgaGVybW9uLCBpbmRleCwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBEZXRhY2ggZnJvbSBtdWx0aWNhc3QgZ3JvdXAKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBnaWQJCU11bHRpY2FzdCBHSUQKKyAqLworc3RhdGljIHZvaWQgaGVybW9uX21jYXN0X2RldGFjaCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwIF9fdW51c2VkLAorCQkJCSAgc3RydWN0IGliX2dpZCAqZ2lkICkgeworCXN0cnVjdCBoZXJtb24gKmhlcm1vbiA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgaGVybW9ucHJtX21nbV9oYXNoIGhhc2g7CisJc3RydWN0IGhlcm1vbnBybV9tY2dfZW50cnkgbWNnOworCXVuc2lnbmVkIGludCBpbmRleDsKKwlpbnQgcmM7CisKKwkvKiBHZW5lcmF0ZSBoYXNoIHRhYmxlIGluZGV4ICovCisJaWYgKCAoIHJjID0gaGVybW9uX2NtZF9tZ2lkX2hhc2ggKCBoZXJtb24sIGdpZCwgJmhhc2ggKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IGhhc2ggR0lEOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybjsKKwl9CisJaW5kZXggPSBNTFhfR0VUICggJmhhc2gsIGhhc2ggKTsKKworCS8qIENsZWFyIGhhc2ggdGFibGUgZW50cnkgKi8KKwltZW1zZXQgKCAmbWNnLCAwLCBzaXplb2YgKCBtY2cgKSApOworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfd3JpdGVfbWNnICggaGVybW9uLCBpbmRleCwgJm1jZyApICkgIT0gMCApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBjb3VsZCBub3Qgd3JpdGUgTUNHICUjeDogJXNcbiIsCisJCSAgICAgICBoZXJtb24sIGluZGV4LCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoqIEhlcm1vbiBJbmZpbmliYW5kIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgaWJfZGV2aWNlX29wZXJhdGlvbnMgaGVybW9uX2liX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZV9jcQk9IGhlcm1vbl9jcmVhdGVfY3EsCisJLmRlc3Ryb3lfY3EJPSBoZXJtb25fZGVzdHJveV9jcSwKKwkuY3JlYXRlX3FwCT0gaGVybW9uX2NyZWF0ZV9xcCwKKwkubW9kaWZ5X3FwCT0gaGVybW9uX21vZGlmeV9xcCwKKwkuZGVzdHJveV9xcAk9IGhlcm1vbl9kZXN0cm95X3FwLAorCS5wb3N0X3NlbmQJPSBoZXJtb25fcG9zdF9zZW5kLAorCS5wb3N0X3JlY3YJPSBoZXJtb25fcG9zdF9yZWN2LAorCS5wb2xsX2NxCT0gaGVybW9uX3BvbGxfY3EsCisJLnBvbGxfZXEJPSBoZXJtb25fcG9sbF9lcSwKKwkub3BlbgkJPSBoZXJtb25fb3BlbiwKKwkuY2xvc2UJCT0gaGVybW9uX2Nsb3NlLAorCS5tY2FzdF9hdHRhY2gJPSBoZXJtb25fbWNhc3RfYXR0YWNoLAorCS5tY2FzdF9kZXRhY2gJPSBoZXJtb25fbWNhc3RfZGV0YWNoLAorCS5zZXRfcG9ydF9pbmZvCT0gaGVybW9uX2luZm9ybV9zbWEsCisJLnNldF9wa2V5X3RhYmxlCT0gaGVybW9uX2luZm9ybV9zbWEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlybXdhcmUgY29udHJvbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIE1hcCB2aXJ0dWFsIHRvIHBoeXNpY2FsIGFkZHJlc3MgZm9yIGZpcm13YXJlIHVzYWdlCisgKgorICogQHYgaGVybW9uCQlIZXJtb24gZGV2aWNlCisgKiBAdiBtYXAJCU1hcHBpbmcgZnVuY3Rpb24KKyAqIEB2IHZhCQlWaXJ0dWFsIGFkZHJlc3MKKyAqIEB2IHBhCQlQaHlzaWNhbCBhZGRyZXNzCisgKiBAdiBsZW4JCUxlbmd0aCBvZiByZWdpb24KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGhlcm1vbl9tYXBfdnBtICggc3RydWN0IGhlcm1vbiAqaGVybW9uLAorCQkJICAgIGludCAoICptYXAgKSAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaGVybW9ucHJtX3ZpcnR1YWxfcGh5c2ljYWxfbWFwcGluZyogKSwKKwkJCSAgICB1aW50NjRfdCB2YSwgcGh5c2FkZHJfdCBwYSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgaGVybW9ucHJtX3ZpcnR1YWxfcGh5c2ljYWxfbWFwcGluZyBtYXBwaW5nOworCWludCByYzsKKworCWFzc2VydCAoICggdmEgJiAoIEhFUk1PTl9QQUdFX1NJWkUgLSAxICkgKSA9PSAwICk7CisJYXNzZXJ0ICggKCBwYSAmICggSEVSTU9OX1BBR0VfU0laRSAtIDEgKSApID09IDAgKTsKKwlhc3NlcnQgKCAoIGxlbiAmICggSEVSTU9OX1BBR0VfU0laRSAtIDEgKSApID09IDAgKTsKKworCS8qIFRoZXNlIG1hcHBpbmdzIHRlbmQgdG8gZ2VuZXJhdGUgaHVnZSB2b2x1bWVzIG9mCisJICogdW5pbnRlcmVzdGluZyBkZWJ1ZyBkYXRhLCB3aGljaCBiYXNpY2FsbHkgbWFrZXMgaXQKKwkgKiBpbXBvc3NpYmxlIHRvIHVzZSBkZWJ1Z2dpbmcgb3RoZXJ3aXNlLgorCSAqLworCURCR19ESVNBQkxFICggREJHTFZMX0xPRyB8IERCR0xWTF9FWFRSQSApOworCisJd2hpbGUgKCBsZW4gKSB7CisJCW1lbXNldCAoICZtYXBwaW5nLCAwLCBzaXplb2YgKCBtYXBwaW5nICkgKTsKKwkJTUxYX0ZJTExfMSAoICZtYXBwaW5nLCAwLCB2YV9oLCAoIHZhID4+IDMyICkgKTsKKwkJTUxYX0ZJTExfMSAoICZtYXBwaW5nLCAxLCB2YV9sLCAoIHZhID4+IDEyICkgKTsKKwkJTUxYX0ZJTExfMiAoICZtYXBwaW5nLCAzLAorCQkJICAgICBsb2cyc2l6ZSwgMCwKKwkJCSAgICAgcGFfbCwgKCBwYSA+PiAxMiApICk7CisJCWlmICggKCByYyA9IG1hcCAoIGhlcm1vbiwgJm1hcHBpbmcgKSApICE9IDAgKSB7CisJCQlEQkdfRU5BQkxFICggREJHTFZMX0xPRyB8IERCR0xWTF9FWFRSQSApOworCQkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBjb3VsZCBub3QgbWFwICVsbHggPT4gJWx4OiAiCisJCQkgICAgICAgIiVzXG4iLCBoZXJtb24sIHZhLCBwYSwgc3RyZXJyb3IgKCByYyApICk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcGEgKz0gSEVSTU9OX1BBR0VfU0laRTsKKwkJdmEgKz0gSEVSTU9OX1BBR0VfU0laRTsKKwkJbGVuIC09IEhFUk1PTl9QQUdFX1NJWkU7CisJfQorCisJREJHX0VOQUJMRSAoIERCR0xWTF9MT0cgfCBEQkdMVkxfRVhUUkEgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTdGFydCBmaXJtd2FyZSBydW5uaW5nCisgKgorICogQHYgaGVybW9uCQlIZXJtb24gZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBoZXJtb25fc3RhcnRfZmlybXdhcmUgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24gKSB7CisJc3RydWN0IGhlcm1vbnBybV9xdWVyeV9mdyBmdzsKKwl1bnNpZ25lZCBpbnQgZndfcGFnZXM7CisJc2l6ZV90IGZ3X3NpemU7CisJcGh5c2FkZHJfdCBmd19iYXNlOworCWludCByYzsKKworCS8qIEdldCBmaXJtd2FyZSBwYXJhbWV0ZXJzICovCisJaWYgKCAoIHJjID0gaGVybW9uX2NtZF9xdWVyeV9mdyAoIGhlcm1vbiwgJmZ3ICkgKSAhPSAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGNvdWxkIG5vdCBxdWVyeSBmaXJtd2FyZTogJXNcbiIsCisJCSAgICAgICBoZXJtb24sIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9xdWVyeV9mdzsKKwl9CisJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkLiVkXG4iLCBoZXJtb24sCisJICAgICAgIE1MWF9HRVQgKCAmZncsIGZ3X3Jldl9tYWpvciApLCBNTFhfR0VUICggJmZ3LCBmd19yZXZfbWlub3IgKSwKKwkgICAgICAgTUxYX0dFVCAoICZmdywgZndfcmV2X3N1Ym1pbm9yICkgKTsKKwlmd19wYWdlcyA9IE1MWF9HRVQgKCAmZncsIGZ3X3BhZ2VzICk7CisJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCByZXF1aXJlcyAlZCBwYWdlcyAoJWQga0IpIGZvciBmaXJtd2FyZVxuIiwKKwkgICAgICAgaGVybW9uLCBmd19wYWdlcywgKCBmd19wYWdlcyAqICggSEVSTU9OX1BBR0VfU0laRSAvIDEwMjQgKSApICk7CisKKwkvKiBBbGxvY2F0ZSBmaXJtd2FyZSBwYWdlcyBhbmQgbWFwIGZpcm13YXJlIGFyZWEgKi8KKwlmd19zaXplID0gKCBmd19wYWdlcyAqIEhFUk1PTl9QQUdFX1NJWkUgKTsKKwloZXJtb24tPmZpcm13YXJlX2FyZWEgPSB1bWFsbG9jICggZndfc2l6ZSApOworCWlmICggISBoZXJtb24tPmZpcm13YXJlX2FyZWEgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2NfZmE7CisJfQorCWZ3X2Jhc2UgPSB1c2VyX3RvX3BoeXMgKCBoZXJtb24tPmZpcm13YXJlX2FyZWEsIDAgKTsKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGZpcm13YXJlIGFyZWEgYXQgcGh5c2ljYWwgWyVseCwlbHgpXG4iLAorCSAgICAgICBoZXJtb24sIGZ3X2Jhc2UsICggZndfYmFzZSArIGZ3X3NpemUgKSApOworCWlmICggKCByYyA9IGhlcm1vbl9tYXBfdnBtICggaGVybW9uLCBoZXJtb25fY21kX21hcF9mYSwKKwkJCQkgICAgIDAsIGZ3X2Jhc2UsIGZ3X3NpemUgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IG1hcCBmaXJtd2FyZTogJXNcbiIsCisJCSAgICAgICBoZXJtb24sIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9tYXBfZmE7CisJfQorCisJLyogU3RhcnQgZmlybXdhcmUgKi8KKwlpZiAoICggcmMgPSBoZXJtb25fY21kX3J1bl9mdyAoIGhlcm1vbiApICkgIT0gMCApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBjb3VsZCBub3QgcnVuIGZpcm13YXJlOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX3J1bl9mdzsKKwl9CisKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGZpcm13YXJlIHN0YXJ0ZWRcbiIsIGhlcm1vbiApOworCXJldHVybiAwOworCisgZXJyX3J1bl9mdzoKKyBlcnJfbWFwX2ZhOgorCWhlcm1vbl9jbWRfdW5tYXBfZmEgKCBoZXJtb24gKTsKKwl1ZnJlZSAoIGhlcm1vbi0+ZmlybXdhcmVfYXJlYSApOworCWhlcm1vbi0+ZmlybXdhcmVfYXJlYSA9IFVOVUxMOworIGVycl9hbGxvY19mYToKKyBlcnJfcXVlcnlfZnc6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFN0b3AgZmlybXdhcmUgcnVubmluZworICoKKyAqIEB2IGhlcm1vbgkJSGVybW9uIGRldmljZQorICovCitzdGF0aWMgdm9pZCBoZXJtb25fc3RvcF9maXJtd2FyZSAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiApIHsKKwlpbnQgcmM7CisKKwlpZiAoICggcmMgPSBoZXJtb25fY21kX3VubWFwX2ZhICggaGVybW9uICkgKSAhPSAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIEZBVEFMIGNvdWxkIG5vdCBzdG9wIGZpcm13YXJlOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCS8qIExlYWsgbWVtb3J5IGFuZCByZXR1cm47IGF0IGxlYXN0IHdlIGF2b2lkIGNvcnJ1cHRpb24gKi8KKwkJcmV0dXJuOworCX0KKwl1ZnJlZSAoIGhlcm1vbi0+ZmlybXdhcmVfYXJlYSApOworCWhlcm1vbi0+ZmlybXdhcmVfYXJlYSA9IFVOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW5maW5paG9zdCBDb250ZXh0IE1lbW9yeSBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogR2V0IGRldmljZSBsaW1pdHMKKyAqCisgKiBAdiBoZXJtb24JCUhlcm1vbiBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGhlcm1vbl9nZXRfY2FwICggc3RydWN0IGhlcm1vbiAqaGVybW9uICkgeworCXN0cnVjdCBoZXJtb25wcm1fcXVlcnlfZGV2X2NhcCBkZXZfY2FwOworCWludCByYzsKKworCWlmICggKCByYyA9IGhlcm1vbl9jbWRfcXVlcnlfZGV2X2NhcCAoIGhlcm1vbiwgJmRldl9jYXAgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IGdldCBkZXZpY2UgbGltaXRzOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwloZXJtb24tPmNhcC5jbXB0X2VudHJ5X3NpemUgPSBNTFhfR0VUICggJmRldl9jYXAsIGNfbXB0X2VudHJ5X3N6ICk7CisJaGVybW9uLT5jYXAucmVzZXJ2ZWRfcXBzID0KKwkJKCAxIDw8IE1MWF9HRVQgKCAmZGV2X2NhcCwgbG9nMl9yc3ZkX3FwcyApICk7CisJaGVybW9uLT5jYXAucXBjX2VudHJ5X3NpemUgPSBNTFhfR0VUICggJmRldl9jYXAsIHFwY19lbnRyeV9zeiApOworCWhlcm1vbi0+Y2FwLmFsdGNfZW50cnlfc2l6ZSA9IE1MWF9HRVQgKCAmZGV2X2NhcCwgYWx0Y19lbnRyeV9zeiApOworCWhlcm1vbi0+Y2FwLmF1eGNfZW50cnlfc2l6ZSA9IE1MWF9HRVQgKCAmZGV2X2NhcCwgYXV4X2VudHJ5X3N6ICk7CisJaGVybW9uLT5jYXAucmVzZXJ2ZWRfc3JxcyA9CisJCSggMSA8PCBNTFhfR0VUICggJmRldl9jYXAsIGxvZzJfcnN2ZF9zcnFzICkgKTsKKwloZXJtb24tPmNhcC5zcnFjX2VudHJ5X3NpemUgPSBNTFhfR0VUICggJmRldl9jYXAsIHNycV9lbnRyeV9zeiApOworCWhlcm1vbi0+Y2FwLnJlc2VydmVkX2NxcyA9CisJCSggMSA8PCBNTFhfR0VUICggJmRldl9jYXAsIGxvZzJfcnN2ZF9jcXMgKSApOworCWhlcm1vbi0+Y2FwLmNxY19lbnRyeV9zaXplID0gTUxYX0dFVCAoICZkZXZfY2FwLCBjcWNfZW50cnlfc3ogKTsKKwloZXJtb24tPmNhcC5yZXNlcnZlZF9lcXMgPSBNTFhfR0VUICggJmRldl9jYXAsIG51bV9yc3ZkX2VxcyApOworCWhlcm1vbi0+Y2FwLmVxY19lbnRyeV9zaXplID0gTUxYX0dFVCAoICZkZXZfY2FwLCBlcWNfZW50cnlfc3ogKTsKKwloZXJtb24tPmNhcC5yZXNlcnZlZF9tdHRzID0KKwkJKCAxIDw8IE1MWF9HRVQgKCAmZGV2X2NhcCwgbG9nMl9yc3ZkX210dHMgKSApOworCWhlcm1vbi0+Y2FwLm10dF9lbnRyeV9zaXplID0gTUxYX0dFVCAoICZkZXZfY2FwLCBtdHRfZW50cnlfc3ogKTsKKwloZXJtb24tPmNhcC5yZXNlcnZlZF9tcndzID0KKwkJKCAxIDw8IE1MWF9HRVQgKCAmZGV2X2NhcCwgbG9nMl9yc3ZkX21yd3MgKSApOworCWhlcm1vbi0+Y2FwLmRtcHRfZW50cnlfc2l6ZSA9IE1MWF9HRVQgKCAmZGV2X2NhcCwgZF9tcHRfZW50cnlfc3ogKTsKKwloZXJtb24tPmNhcC5yZXNlcnZlZF91YXJzID0gTUxYX0dFVCAoICZkZXZfY2FwLCBudW1fcnN2ZF91YXJzICk7CisJaGVybW9uLT5jYXAubnVtX3BvcnRzID0gTUxYX0dFVCAoICZkZXZfY2FwLCBudW1fcG9ydHMgKTsKKwloZXJtb24tPmNhcC5kcGRwID0gTUxYX0dFVCAoICZkZXZfY2FwLCBkcGRwICk7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIGhlcm1vbi0+Y2FwLm51bV9wb3J0cyA+IEhFUk1PTl9NQVhfUE9SVFMgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgaGFzICVkIHBvcnRzIChvbmx5ICVkIHN1cHBvcnRlZClcbiIsCisJCSAgICAgICBoZXJtb24sIGhlcm1vbi0+Y2FwLm51bV9wb3J0cywgSEVSTU9OX01BWF9QT1JUUyApOworCQloZXJtb24tPmNhcC5udW1fcG9ydHMgPSBIRVJNT05fTUFYX1BPUlRTOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCBJQ00gdXNhZ2UKKyAqCisgKiBAdiBsb2dfbnVtX2VudHJpZXMJTG9nMiBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMKKyAqIEB2IGVudHJ5X3NpemUJRW50cnkgc2l6ZQorICogQHJldCB1c2FnZQkJVXNhZ2Ugc2l6ZSBpbiBJQ00KKyAqLworc3RhdGljIHNpemVfdCBpY21fdXNhZ2UgKCB1bnNpZ25lZCBpbnQgbG9nX251bV9lbnRyaWVzLCBzaXplX3QgZW50cnlfc2l6ZSApIHsKKwlzaXplX3QgdXNhZ2U7CisKKwl1c2FnZSA9ICggKCAxIDw8IGxvZ19udW1fZW50cmllcyApICogZW50cnlfc2l6ZSApOworCXVzYWdlID0gKCAoIHVzYWdlICsgSEVSTU9OX1BBR0VfU0laRSAtIDEgKSAmCisJCSAgfiggSEVSTU9OX1BBR0VfU0laRSAtIDEgKSApOworCXJldHVybiB1c2FnZTsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBJQ00KKyAqCisgKiBAdiBoZXJtb24JCUhlcm1vbiBkZXZpY2UKKyAqIEB2IGluaXRfaGNhCQlJTklUX0hDQSBzdHJ1Y3R1cmUgdG8gZmlsbCBpbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGVybW9uX2FsbG9jX2ljbSAoIHN0cnVjdCBoZXJtb24gKmhlcm1vbiwKKwkJCSAgICAgIHN0cnVjdCBoZXJtb25wcm1faW5pdF9oY2EgKmluaXRfaGNhICkgeworCXN0cnVjdCBoZXJtb25wcm1fc2NhbGFyX3BhcmFtZXRlciBpY21fc2l6ZTsKKwlzdHJ1Y3QgaGVybW9ucHJtX3NjYWxhcl9wYXJhbWV0ZXIgaWNtX2F1eF9zaXplOworCXVpbnQ2NF90IGljbV9vZmZzZXQgPSAwOworCXVuc2lnbmVkIGludCBsb2dfbnVtX3FwcywgbG9nX251bV9zcnFzLCBsb2dfbnVtX2NxcywgbG9nX251bV9lcXM7CisJdW5zaWduZWQgaW50IGxvZ19udW1fbXR0cywgbG9nX251bV9tcHRzOworCXNpemVfdCBjbXB0X21heF9sZW47CisJc2l6ZV90IHFwX2NtcHRfbGVuLCBzcnFfY21wdF9sZW4sIGNxX2NtcHRfbGVuLCBlcV9jbXB0X2xlbjsKKwlzaXplX3QgaWNtX2xlbiwgaWNtX2F1eF9sZW47CisJcGh5c2FkZHJfdCBpY21fcGh5czsKKwlpbnQgaTsKKwlpbnQgcmM7CisKKwkvKgorCSAqIFN0YXJ0IGJ5IGNhcnZpbmcgdXAgdGhlIElDTSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKKwkgKgorCSAqLworCisJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBlYWNoIG9iamVjdCB0eXBlIHdpdGhpbiBJQ00gKi8KKwlsb2dfbnVtX3FwcyA9IGZscyAoIGhlcm1vbi0+Y2FwLnJlc2VydmVkX3FwcyArCisJCQkgICAgSEVSTU9OX1JTVkRfU1BFQ0lBTF9RUFMgKyBIRVJNT05fTUFYX1FQUyAtIDEgKTsKKwlsb2dfbnVtX3NycXMgPSBmbHMgKCBoZXJtb24tPmNhcC5yZXNlcnZlZF9zcnFzIC0gMSApOworCWxvZ19udW1fY3FzID0gZmxzICggaGVybW9uLT5jYXAucmVzZXJ2ZWRfY3FzICsgSEVSTU9OX01BWF9DUVMgLSAxICk7CisJbG9nX251bV9lcXMgPSBmbHMgKCBoZXJtb24tPmNhcC5yZXNlcnZlZF9lcXMgKyBIRVJNT05fTUFYX0VRUyAtIDEgKTsKKwlsb2dfbnVtX210dHMgPSBmbHMgKCBoZXJtb24tPmNhcC5yZXNlcnZlZF9tdHRzICsgSEVSTU9OX01BWF9NVFRTIC0gMSApOworCisJLyogSUNNIHN0YXJ0cyB3aXRoIHRoZSBjTVBUIHRhYmxlcywgd2hpY2ggYXJlIHNwYXJzZSAqLworCWNtcHRfbWF4X2xlbiA9ICggSEVSTU9OX0NNUFRfTUFYX0VOVFJJRVMgKgorCQkJICggKCB1aW50NjRfdCApIGhlcm1vbi0+Y2FwLmNtcHRfZW50cnlfc2l6ZSApICk7CisJcXBfY21wdF9sZW4gPSBpY21fdXNhZ2UgKCBsb2dfbnVtX3FwcywgaGVybW9uLT5jYXAuY21wdF9lbnRyeV9zaXplICk7CisJaGVybW9uLT5pY21fbWFwW0hFUk1PTl9JQ01fUVBfQ01QVF0ub2Zmc2V0ID0gaWNtX29mZnNldDsKKwloZXJtb24tPmljbV9tYXBbSEVSTU9OX0lDTV9RUF9DTVBUXS5sZW4gPSBxcF9jbXB0X2xlbjsKKwlpY21fb2Zmc2V0ICs9IGNtcHRfbWF4X2xlbjsKKwlzcnFfY21wdF9sZW4gPSBpY21fdXNhZ2UgKCBsb2dfbnVtX3NycXMsIGhlcm1vbi0+Y2FwLmNtcHRfZW50cnlfc2l6ZSApOworCWhlcm1vbi0+aWNtX21hcFtIRVJNT05fSUNNX1NSUV9DTVBUXS5vZmZzZXQgPSBpY21fb2Zmc2V0OworCWhlcm1vbi0+aWNtX21hcFtIRVJNT05fSUNNX1NSUV9DTVBUXS5sZW4gPSBzcnFfY21wdF9sZW47CisJaWNtX29mZnNldCArPSBjbXB0X21heF9sZW47CisJY3FfY21wdF9sZW4gPSBpY21fdXNhZ2UgKCBsb2dfbnVtX2NxcywgaGVybW9uLT5jYXAuY21wdF9lbnRyeV9zaXplICk7CisJaGVybW9uLT5pY21fbWFwW0hFUk1PTl9JQ01fQ1FfQ01QVF0ub2Zmc2V0ID0gaWNtX29mZnNldDsKKwloZXJtb24tPmljbV9tYXBbSEVSTU9OX0lDTV9DUV9DTVBUXS5sZW4gPSBjcV9jbXB0X2xlbjsKKwlpY21fb2Zmc2V0ICs9IGNtcHRfbWF4X2xlbjsKKwllcV9jbXB0X2xlbiA9IGljbV91c2FnZSAoIGxvZ19udW1fZXFzLCBoZXJtb24tPmNhcC5jbXB0X2VudHJ5X3NpemUgKTsKKwloZXJtb24tPmljbV9tYXBbSEVSTU9OX0lDTV9FUV9DTVBUXS5vZmZzZXQgPSBpY21fb2Zmc2V0OworCWhlcm1vbi0+aWNtX21hcFtIRVJNT05fSUNNX0VRX0NNUFRdLmxlbiA9IGVxX2NtcHRfbGVuOworCWljbV9vZmZzZXQgKz0gY21wdF9tYXhfbGVuOworCisJaGVybW9uLT5pY21fbWFwW0hFUk1PTl9JQ01fT1RIRVJdLm9mZnNldCA9IGljbV9vZmZzZXQ7CisKKwkvKiBRdWV1ZSBwYWlyIGNvbnRleHRzICovCisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCAxMiwKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMucXBjX2Jhc2VfYWRkcl9oLAorCQkgICAgICggaWNtX29mZnNldCA+PiAzMiApICk7CisJTUxYX0ZJTExfMiAoIGluaXRfaGNhLCAxMywKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMucXBjX2Jhc2VfYWRkcl9sLAorCQkgICAgICggaWNtX29mZnNldCA+PiA1ICksCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmxvZ19udW1fb2ZfcXAsCisJCSAgICAgbG9nX251bV9xcHMgKTsKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIElDTSBRUEMgYmFzZSA9ICVsbHhcbiIsIGhlcm1vbiwgaWNtX29mZnNldCApOworCWljbV9vZmZzZXQgKz0gaWNtX3VzYWdlICggbG9nX251bV9xcHMsIGhlcm1vbi0+Y2FwLnFwY19lbnRyeV9zaXplICk7CisKKwkvKiBFeHRlbmRlZCBhbHRlcm5hdGUgcGF0aCBjb250ZXh0cyAqLworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgMjQsCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmFsdGNfYmFzZV9hZGRyX2gsCisJCSAgICAgKCBpY21fb2Zmc2V0ID4+IDMyICkgKTsKKwlNTFhfRklMTF8xICggaW5pdF9oY2EsIDI1LAorCQkgICAgIHFwY19lZWNfY3FjX2VxY19yZGJfcGFyYW1ldGVycy5hbHRjX2Jhc2VfYWRkcl9sLAorCQkgICAgIGljbV9vZmZzZXQgKTsKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIElDTSBBTFRDIGJhc2UgPSAlbGx4XG4iLCBoZXJtb24sIGljbV9vZmZzZXQpOworCWljbV9vZmZzZXQgKz0gaWNtX3VzYWdlICggbG9nX251bV9xcHMsCisJCQkJICBoZXJtb24tPmNhcC5hbHRjX2VudHJ5X3NpemUgKTsKKworCS8qIEV4dGVuZGVkIGF1eGlsaWFyeSBjb250ZXh0cyAqLworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgMjgsCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmF1eGNfYmFzZV9hZGRyX2gsCisJCSAgICAgKCBpY21fb2Zmc2V0ID4+IDMyICkgKTsKKwlNTFhfRklMTF8xICggaW5pdF9oY2EsIDI5LAorCQkgICAgIHFwY19lZWNfY3FjX2VxY19yZGJfcGFyYW1ldGVycy5hdXhjX2Jhc2VfYWRkcl9sLAorCQkgICAgIGljbV9vZmZzZXQgKTsKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIElDTSBBVVhDIGJhc2UgPSAlbGx4XG4iLCBoZXJtb24sIGljbV9vZmZzZXQpOworCWljbV9vZmZzZXQgKz0gaWNtX3VzYWdlICggbG9nX251bV9xcHMsCisJCQkJICBoZXJtb24tPmNhcC5hdXhjX2VudHJ5X3NpemUgKTsKKworCS8qIFNoYXJlZCByZWNlaXZlIHF1ZXVlIGNvbnRleHRzICovCisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCAxOCwKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMuc3JxY19iYXNlX2FkZHJfaCwKKwkJICAgICAoIGljbV9vZmZzZXQgPj4gMzIgKSApOworCU1MWF9GSUxMXzIgKCBpbml0X2hjYSwgMTksCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLnNycWNfYmFzZV9hZGRyX2wsCisJCSAgICAgKCBpY21fb2Zmc2V0ID4+IDUgKSwKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMubG9nX251bV9vZl9zcnEsCisJCSAgICAgbG9nX251bV9zcnFzICk7CisJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBJQ00gU1JRQyBiYXNlID0gJWxseFxuIiwgaGVybW9uLCBpY21fb2Zmc2V0KTsKKwlpY21fb2Zmc2V0ICs9IGljbV91c2FnZSAoIGxvZ19udW1fc3JxcywKKwkJCQkgIGhlcm1vbi0+Y2FwLnNycWNfZW50cnlfc2l6ZSApOworCisJLyogQ29tcGxldGlvbiBxdWV1ZSBjb250ZXh0cyAqLworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgMjAsCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmNxY19iYXNlX2FkZHJfaCwKKwkJICAgICAoIGljbV9vZmZzZXQgPj4gMzIgKSApOworCU1MWF9GSUxMXzIgKCBpbml0X2hjYSwgMjEsCisJCSAgICAgcXBjX2VlY19jcWNfZXFjX3JkYl9wYXJhbWV0ZXJzLmNxY19iYXNlX2FkZHJfbCwKKwkJICAgICAoIGljbV9vZmZzZXQgPj4gNSApLAorCQkgICAgIHFwY19lZWNfY3FjX2VxY19yZGJfcGFyYW1ldGVycy5sb2dfbnVtX29mX2NxLAorCQkgICAgIGxvZ19udW1fY3FzICk7CisJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBJQ00gQ1FDIGJhc2UgPSAlbGx4XG4iLCBoZXJtb24sIGljbV9vZmZzZXQgKTsKKwlpY21fb2Zmc2V0ICs9IGljbV91c2FnZSAoIGxvZ19udW1fY3FzLCBoZXJtb24tPmNhcC5jcWNfZW50cnlfc2l6ZSApOworCisJLyogRXZlbnQgcXVldWUgY29udGV4dHMgKi8KKwlNTFhfRklMTF8xICggaW5pdF9oY2EsIDMyLAorCQkgICAgIHFwY19lZWNfY3FjX2VxY19yZGJfcGFyYW1ldGVycy5lcWNfYmFzZV9hZGRyX2gsCisJCSAgICAgKCBpY21fb2Zmc2V0ID4+IDMyICkgKTsKKwlNTFhfRklMTF8yICggaW5pdF9oY2EsIDMzLAorCQkgICAgIHFwY19lZWNfY3FjX2VxY19yZGJfcGFyYW1ldGVycy5lcWNfYmFzZV9hZGRyX2wsCisJCSAgICAgKCBpY21fb2Zmc2V0ID4+IDUgKSwKKwkJICAgICBxcGNfZWVjX2NxY19lcWNfcmRiX3BhcmFtZXRlcnMubG9nX251bV9vZl9lcSwKKwkJICAgICBsb2dfbnVtX2VxcyApOworCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgSUNNIEVRQyBiYXNlID0gJWxseFxuIiwgaGVybW9uLCBpY21fb2Zmc2V0ICk7CisJaWNtX29mZnNldCArPSBpY21fdXNhZ2UgKCBsb2dfbnVtX2VxcywgaGVybW9uLT5jYXAuZXFjX2VudHJ5X3NpemUgKTsKKworCS8qIE1lbW9yeSB0cmFuc2xhdGlvbiB0YWJsZSAqLworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgNjQsCisJCSAgICAgdHB0X3BhcmFtZXRlcnMubXR0X2Jhc2VfYWRkcl9oLCAoIGljbV9vZmZzZXQgPj4gMzIgKSApOworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgNjUsCisJCSAgICAgdHB0X3BhcmFtZXRlcnMubXR0X2Jhc2VfYWRkcl9sLCBpY21fb2Zmc2V0ICk7CisJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBJQ00gTVRUIGJhc2UgPSAlbGx4XG4iLCBoZXJtb24sIGljbV9vZmZzZXQgKTsKKwlpY21fb2Zmc2V0ICs9IGljbV91c2FnZSAoIGxvZ19udW1fbXR0cywKKwkJCQkgIGhlcm1vbi0+Y2FwLm10dF9lbnRyeV9zaXplICk7CisKKwkvKiBNZW1vcnkgcHJvdGVjdGlvbiB0YWJsZSAqLworCWxvZ19udW1fbXB0cyA9IGZscyAoIGhlcm1vbi0+Y2FwLnJlc2VydmVkX21yd3MgKyAxIC0gMSApOworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgNjAsCisJCSAgICAgdHB0X3BhcmFtZXRlcnMuZG1wdF9iYXNlX2Fkcl9oLCAoIGljbV9vZmZzZXQgPj4gMzIgKSApOworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgNjEsCisJCSAgICAgdHB0X3BhcmFtZXRlcnMuZG1wdF9iYXNlX2Fkcl9sLCBpY21fb2Zmc2V0ICk7CisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCA2MiwKKwkJICAgICB0cHRfcGFyYW1ldGVycy5sb2dfZG1wdF9zeiwgbG9nX251bV9tcHRzICk7CisJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBJQ00gRE1QVCBiYXNlID0gJWxseFxuIiwgaGVybW9uLCBpY21fb2Zmc2V0KTsKKwlpY21fb2Zmc2V0ICs9IGljbV91c2FnZSAoIGxvZ19udW1fbXB0cywKKwkJCQkgIGhlcm1vbi0+Y2FwLmRtcHRfZW50cnlfc2l6ZSApOworCisJLyogTXVsdGljYXN0IHRhYmxlICovCisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCA0OCwKKwkJICAgICBtdWx0aWNhc3RfcGFyYW1ldGVycy5tY19iYXNlX2FkZHJfaCwKKwkJICAgICAoIGljbV9vZmZzZXQgPj4gMzIgKSApOworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgNDksCisJCSAgICAgbXVsdGljYXN0X3BhcmFtZXRlcnMubWNfYmFzZV9hZGRyX2wsIGljbV9vZmZzZXQgKTsKKwlNTFhfRklMTF8xICggaW5pdF9oY2EsIDUyLAorCQkgICAgIG11bHRpY2FzdF9wYXJhbWV0ZXJzLmxvZ19tY190YWJsZV9lbnRyeV9zeiwKKwkJICAgICBmbHMgKCBzaXplb2YgKCBzdHJ1Y3QgaGVybW9ucHJtX21jZ19lbnRyeSApIC0gMSApICk7CisJTUxYX0ZJTExfMSAoIGluaXRfaGNhLCA1MywKKwkJICAgICBtdWx0aWNhc3RfcGFyYW1ldGVycy5sb2dfbWNfdGFibGVfaGFzaF9zeiwgMyApOworCU1MWF9GSUxMXzEgKCBpbml0X2hjYSwgNTQsCisJCSAgICAgbXVsdGljYXN0X3BhcmFtZXRlcnMubG9nX21jX3RhYmxlX3N6LCAzICk7CisJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBJQ00gTUMgYmFzZSA9ICVsbHhcbiIsIGhlcm1vbiwgaWNtX29mZnNldCApOworCWljbV9vZmZzZXQgKz0gKCAoIDggKiBzaXplb2YgKCBzdHJ1Y3QgaGVybW9ucHJtX21jZ19lbnRyeSApICsKKwkJCSAgSEVSTU9OX1BBR0VfU0laRSAtIDEgKSAmIH4oIEhFUk1PTl9QQUdFX1NJWkUgLSAxICkgKTsKKworCWhlcm1vbi0+aWNtX21hcFtIRVJNT05fSUNNX09USEVSXS5sZW4gPQorCQkoIGljbV9vZmZzZXQgLSBoZXJtb24tPmljbV9tYXBbSEVSTU9OX0lDTV9PVEhFUl0ub2Zmc2V0ICk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBtYXAgcGh5c2ljYWwgbWVtb3J5IGZvciAocG9ydGlvbnMgb2YpIElDTQorCSAqCisJICogTWFwIGlzOgorCSAqICAgSUNNIEFVWCBhcmVhIChhbGlnbmVkIHRvIGl0cyBvd24gc2l6ZSkKKwkgKiAgIGNNUFQgYXJlYXMKKwkgKiAgIE90aGVyIGFyZWFzCisJICovCisKKwkvKiBDYWxjdWxhdGUgcGh5c2ljYWwgbWVtb3J5IHJlcXVpcmVkIGZvciBJQ00gKi8KKwlpY21fbGVuID0gMDsKKwlmb3IgKCBpID0gMCA7IGkgPCBIRVJNT05fSUNNX05VTV9SRUdJT05TIDsgaSsrICkgeworCQlpY21fbGVuICs9IGhlcm1vbi0+aWNtX21hcFtpXS5sZW47CisJfQorCisJLyogR2V0IElDTSBhdXhpbGlhcnkgYXJlYSBzaXplICovCisJbWVtc2V0ICggJmljbV9zaXplLCAwLCBzaXplb2YgKCBpY21fc2l6ZSApICk7CisJTUxYX0ZJTExfMSAoICZpY21fc2l6ZSwgMCwgdmFsdWVfaGksICggaWNtX29mZnNldCA+PiAzMiApICk7CisJTUxYX0ZJTExfMSAoICZpY21fc2l6ZSwgMSwgdmFsdWUsIGljbV9vZmZzZXQgKTsKKwlpZiAoICggcmMgPSBoZXJtb25fY21kX3NldF9pY21fc2l6ZSAoIGhlcm1vbiwgJmljbV9zaXplLAorCQkJCQkgICAgICAmaWNtX2F1eF9zaXplICkgKSAhPSAwICkgeworCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGNvdWxkIG5vdCBzZXQgSUNNIHNpemU6ICVzXG4iLAorCQkgICAgICAgaGVybW9uLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfc2V0X2ljbV9zaXplOworCX0KKwlpY21fYXV4X2xlbiA9ICggTUxYX0dFVCAoICZpY21fYXV4X3NpemUsIHZhbHVlICkgKiBIRVJNT05fUEFHRV9TSVpFICk7CisKKwkvKiBBbGxvY2F0ZSBJQ00gZGF0YSBhbmQgYXV4aWxpYXJ5IGFyZWEgKi8KKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIHJlcXVpcmVzICV6ZCBrQiBJQ00gYW5kICV6ZCBrQiBBVVggSUNNXG4iLAorCSAgICAgICBoZXJtb24sICggaWNtX2xlbiAvIDEwMjQgKSwgKCBpY21fYXV4X2xlbiAvIDEwMjQgKSApOworCWhlcm1vbi0+aWNtID0gdW1hbGxvYyAoIGljbV9hdXhfbGVuICsgaWNtX2xlbiApOworCWlmICggISBoZXJtb24tPmljbSApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisJaWNtX3BoeXMgPSB1c2VyX3RvX3BoeXMgKCBoZXJtb24tPmljbSwgMCApOworCisJLyogTWFwIElDTSBhdXhpbGlhcnkgYXJlYSAqLworCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgbWFwcGluZyBJQ00gQVVYID0+ICUwOGx4XG4iLAorCSAgICAgICBoZXJtb24sIGljbV9waHlzICk7CisJaWYgKCAoIHJjID0gaGVybW9uX21hcF92cG0gKCBoZXJtb24sIGhlcm1vbl9jbWRfbWFwX2ljbV9hdXgsCisJCQkJICAgICAwLCBpY21fcGh5cywgaWNtX2F1eF9sZW4gKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IG1hcCBBVVggSUNNOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CQkKKwkJZ290byBlcnJfbWFwX2ljbV9hdXg7CisJfQorCWljbV9waHlzICs9IGljbV9hdXhfbGVuOworCisJLyogTUFQIElDTSBhcmVhICovCisJZm9yICggaSA9IDAgOyBpIDwgSEVSTU9OX0lDTV9OVU1fUkVHSU9OUyA7IGkrKyApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBtYXBwaW5nIElDTSAlbGx4KyV6eCA9PiAlMDhseFxuIiwKKwkJICAgICAgIGhlcm1vbiwgaGVybW9uLT5pY21fbWFwW2ldLm9mZnNldCwKKwkJICAgICAgIGhlcm1vbi0+aWNtX21hcFtpXS5sZW4sIGljbV9waHlzICk7CisJCWlmICggKCByYyA9IGhlcm1vbl9tYXBfdnBtICggaGVybW9uLCBoZXJtb25fY21kX21hcF9pY20sCisJCQkJCSAgICAgaGVybW9uLT5pY21fbWFwW2ldLm9mZnNldCwKKwkJCQkJICAgICBpY21fcGh5cywKKwkJCQkJICAgICBoZXJtb24tPmljbV9tYXBbaV0ubGVuICkgKSAhPSAwICl7CisJCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGNvdWxkIG5vdCBtYXAgSUNNOiAlc1xuIiwKKwkJCSAgICAgICBoZXJtb24sIHN0cmVycm9yICggcmMgKSApOworCQkJZ290byBlcnJfbWFwX2ljbTsKKwkJfQorCQlpY21fcGh5cyArPSBoZXJtb24tPmljbV9tYXBbaV0ubGVuOworCX0KKworCXJldHVybiAwOworCisgZXJyX21hcF9pY206CisJYXNzZXJ0ICggaSA9PSAwICk7IC8qIFdlIGRvbid0IGhhbmRsZSBwYXJ0aWFsIGZhaWx1cmUgYXQgcHJlc2VudCAqLworIGVycl9tYXBfaWNtX2F1eDoKKwloZXJtb25fY21kX3VubWFwX2ljbV9hdXggKCBoZXJtb24gKTsKKwl1ZnJlZSAoIGhlcm1vbi0+aWNtICk7CisJaGVybW9uLT5pY20gPSBVTlVMTDsKKyBlcnJfYWxsb2M6CisgZXJyX3NldF9pY21fc2l6ZToKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogRnJlZSBJQ00KKyAqCisgKiBAdiBoZXJtb24JCUhlcm1vbiBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaGVybW9uX2ZyZWVfaWNtICggc3RydWN0IGhlcm1vbiAqaGVybW9uICkgeworCXN0cnVjdCBoZXJtb25wcm1fc2NhbGFyX3BhcmFtZXRlciB1bm1hcF9pY207CisJaW50IGk7CisKKwlmb3IgKCBpID0gKCBIRVJNT05fSUNNX05VTV9SRUdJT05TIC0gMSApIDsgaSA+PSAwIDsgaS0tICkgeworCQltZW1zZXQgKCAmdW5tYXBfaWNtLCAwLCBzaXplb2YgKCB1bm1hcF9pY20gKSApOworCQlNTFhfRklMTF8xICggJnVubWFwX2ljbSwgMCwgdmFsdWVfaGksCisJCQkgICAgICggaGVybW9uLT5pY21fbWFwW2ldLm9mZnNldCA+PiAzMiApICk7CisJCU1MWF9GSUxMXzEgKCAmdW5tYXBfaWNtLCAxLCB2YWx1ZSwKKwkJCSAgICAgaGVybW9uLT5pY21fbWFwW2ldLm9mZnNldCApOworCQloZXJtb25fY21kX3VubWFwX2ljbSAoIGhlcm1vbiwKKwkJCQkgICAgICAgKCAxIDw8IGZscyAoICggaGVybW9uLT5pY21fbWFwW2ldLmxlbiAvCisJCQkJCQkgICAgICBIRVJNT05fUEFHRV9TSVpFICkgLSAxKSksCisJCQkJICAgICAgICZ1bm1hcF9pY20gKTsKKwl9CisJaGVybW9uX2NtZF91bm1hcF9pY21fYXV4ICggaGVybW9uICk7CisJdWZyZWUgKCBoZXJtb24tPmljbSApOworCWhlcm1vbi0+aWNtID0gVU5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQQ0kgaW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogU2V0IHVwIG1lbW9yeSBwcm90ZWN0aW9uIHRhYmxlCisgKgorICogQHYgaGVybW9uCQlIZXJtb24gZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBoZXJtb25fc2V0dXBfbXB0ICggc3RydWN0IGhlcm1vbiAqaGVybW9uICkgeworCXN0cnVjdCBoZXJtb25wcm1fbXB0IG1wdDsKKwl1aW50MzJfdCBrZXk7CisJaW50IHJjOworCisJLyogRGVyaXZlIGtleSAqLworCWtleSA9ICggaGVybW9uLT5jYXAucmVzZXJ2ZWRfbXJ3cyB8IEhFUk1PTl9NS0VZX1BSRUZJWCApOworCWhlcm1vbi0+bGtleSA9ICggKCBrZXkgPDwgOCApIHwgKCBrZXkgPj4gMjQgKSApOworCisJLyogSW5pdGlhbGlzZSBtZW1vcnkgcHJvdGVjdGlvbiB0YWJsZSAqLworCW1lbXNldCAoICZtcHQsIDAsIHNpemVvZiAoIG1wdCApICk7CisJTUxYX0ZJTExfNyAoICZtcHQsIDAsCisJCSAgICAgYXRvbWljLCAxLAorCQkgICAgIHJ3LCAxLAorCQkgICAgIHJyLCAxLAorCQkgICAgIGx3LCAxLAorCQkgICAgIGxyLCAxLAorCQkgICAgIHBhLCAxLAorCQkgICAgIHJfdywgMSApOworCU1MWF9GSUxMXzEgKCAmbXB0LCAyLCBtZW1fa2V5LCBrZXkgKTsKKwlNTFhfRklMTF8xICggJm1wdCwgMywKKwkJICAgICBwZCwgSEVSTU9OX0dMT0JBTF9QRCApOworCU1MWF9GSUxMXzEgKCAmbXB0LCAxMCwgbGVuNjQsIDEgKTsKKwlpZiAoICggcmMgPSBoZXJtb25fY21kX3N3Mmh3X21wdCAoIGhlcm1vbiwKKwkJCQkJICAgaGVybW9uLT5jYXAucmVzZXJ2ZWRfbXJ3cywKKwkJCQkJICAgJm1wdCApICkgIT0gMCApIHsKKwkJREJHQyAoIGhlcm1vbiwgIkhlcm1vbiAlcCBjb3VsZCBub3Qgc2V0IHVwIE1QVDogJXNcbiIsCisJCSAgICAgICBoZXJtb24sIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHNwZWNpYWwgcXVldWUgcGFpcnMKKyAqCisgKiBAdiBoZXJtb24JCUhlcm1vbiBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGhlcm1vbl9jb25maWd1cmVfc3BlY2lhbF9xcHMgKCBzdHJ1Y3QgaGVybW9uICpoZXJtb24gKSB7CisJaW50IHJjOworCisJLyogU3BlY2lhbCBRUCBibG9jayBtdXN0IGJlIGFsaWduZWQgb24gaXRzIG93biBzaXplICovCisJaGVybW9uLT5zcGVjaWFsX3Fwbl9iYXNlID0gKCAoIGhlcm1vbi0+Y2FwLnJlc2VydmVkX3FwcyArCisJCQkJICAgICAgIEhFUk1PTl9OVU1fU1BFQ0lBTF9RUFMgLSAxICkKKwkJCQkgICAgICYgfiggSEVSTU9OX05VTV9TUEVDSUFMX1FQUyAtIDEgKSApOworCWhlcm1vbi0+cXBuX2Jhc2UgPSAoIGhlcm1vbi0+c3BlY2lhbF9xcG5fYmFzZSArCisJCQkgICAgIEhFUk1PTl9OVU1fU1BFQ0lBTF9RUFMgKTsKKwlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIHNwZWNpYWwgUVBzIGF0IFslbHgsJWx4XVxuIiwgaGVybW9uLAorCSAgICAgICBoZXJtb24tPnNwZWNpYWxfcXBuX2Jhc2UsICggaGVybW9uLT5xcG5fYmFzZSAtIDEgKSApOworCisJLyogSXNzdWUgY29tbWFuZCB0byBjb25maWd1cmUgc3BlY2lhbCBRUHMgKi8KKwlpZiAoICggcmMgPSBoZXJtb25fY21kX2NvbmZfc3BlY2lhbF9xcCAoIGhlcm1vbiwgMHgwMCwKKwkJCQkJICBoZXJtb24tPnNwZWNpYWxfcXBuX2Jhc2UgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IGNvbmZpZ3VyZSBzcGVjaWFsIFFQczogIgorCQkgICAgICAgIiVzXG4iLCBoZXJtb24sIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVzZXQgZGV2aWNlCisgKgorICogQHYgaGVybW9uCQlIZXJtb24gZGV2aWNlCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaGVybW9uX3Jlc2V0ICggc3RydWN0IGhlcm1vbiAqaGVybW9uLAorCQkJICAgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKwlzdHJ1Y3QgcGNpX2NvbmZpZ19iYWNrdXAgYmFja3VwOworCXN0YXRpYyBjb25zdCB1aW50OF90IGJhY2t1cF9leGNsdWRlW10gPQorCQlQQ0lfQ09ORklHX0JBQ0tVUF9FWENMVURFICggMHg1OCwgMHg1YyApOworCisJcGNpX2JhY2t1cCAoIHBjaSwgJmJhY2t1cCwgYmFja3VwX2V4Y2x1ZGUgKTsKKwl3cml0ZWwgKCBIRVJNT05fUkVTRVRfTUFHSUMsCisJCSAoIGhlcm1vbi0+Y29uZmlnICsgSEVSTU9OX1JFU0VUX09GRlNFVCApICk7CisJbWRlbGF5ICggSEVSTU9OX1JFU0VUX1dBSVRfVElNRV9NUyApOworCXBjaV9yZXN0b3JlICggcGNpLCAmYmFja3VwLCBiYWNrdXBfZXhjbHVkZSApOworfQorCisvKioKKyAqIFByb2JlIFBDSSBkZXZpY2UKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqIEB2IGlkCQlQQ0kgSUQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGhlcm1vbl9wcm9iZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgaGVybW9uICpoZXJtb247CisJc3RydWN0IGliX2RldmljZSAqaWJkZXY7CisJc3RydWN0IGhlcm1vbnBybV9pbml0X2hjYSBpbml0X2hjYTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmM7CisKKwkvKiBBbGxvY2F0ZSBIZXJtb24gZGV2aWNlICovCisJaGVybW9uID0gemFsbG9jICggc2l6ZW9mICggKmhlcm1vbiApICk7CisJaWYgKCAhIGhlcm1vbiApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19oZXJtb247CisJfQorCXBjaV9zZXRfZHJ2ZGF0YSAoIHBjaSwgaGVybW9uICk7CisKKwkvKiBGaXggdXAgUENJIGRldmljZSAqLworCWFkanVzdF9wY2lfZGV2aWNlICggcGNpICk7CisKKwkvKiBHZXQgUENJIEJBUnMgKi8KKwloZXJtb24tPmNvbmZpZyA9IGlvcmVtYXAgKCBwY2lfYmFyX3N0YXJ0ICggcGNpLCBIRVJNT05fUENJX0NPTkZJR19CQVIpLAorCQkJCSAgIEhFUk1PTl9QQ0lfQ09ORklHX0JBUl9TSVpFICk7CisJaGVybW9uLT51YXIgPSBpb3JlbWFwICggcGNpX2Jhcl9zdGFydCAoIHBjaSwgSEVSTU9OX1BDSV9VQVJfQkFSICksCisJCQkJSEVSTU9OX1VBUl9OT05fRVFfUEFHRSAqIEhFUk1PTl9QQUdFX1NJWkUgKTsKKworCS8qIFJlc2V0IGRldmljZSAqLworCWhlcm1vbl9yZXNldCAoIGhlcm1vbiwgcGNpICk7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgbWFpbGJveGVzICovCisJaGVybW9uLT5tYWlsYm94X2luID0gbWFsbG9jX2RtYSAoIEhFUk1PTl9NQk9YX1NJWkUsCisJCQkJCSAgSEVSTU9OX01CT1hfQUxJR04gKTsKKwlpZiAoICEgaGVybW9uLT5tYWlsYm94X2luICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX21haWxib3hfaW47CisJfQorCWhlcm1vbi0+bWFpbGJveF9vdXQgPSBtYWxsb2NfZG1hICggSEVSTU9OX01CT1hfU0laRSwKKwkJCQkJICAgSEVSTU9OX01CT1hfQUxJR04gKTsKKwlpZiAoICEgaGVybW9uLT5tYWlsYm94X291dCApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tYWlsYm94X291dDsKKwl9CisKKwkvKiBTdGFydCBmaXJtd2FyZSAqLworCWlmICggKCByYyA9IGhlcm1vbl9zdGFydF9maXJtd2FyZSAoIGhlcm1vbiApICkgIT0gMCApCisJCWdvdG8gZXJyX3N0YXJ0X2Zpcm13YXJlOworCisJLyogR2V0IGRldmljZSBsaW1pdHMgKi8KKwlpZiAoICggcmMgPSBoZXJtb25fZ2V0X2NhcCAoIGhlcm1vbiApICkgIT0gMCApCisJCWdvdG8gZXJyX2dldF9jYXA7CisKKwkvKiBBbGxvY2F0ZSBJbmZpbmliYW5kIGRldmljZXMgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBoZXJtb24tPmNhcC5udW1fcG9ydHMgOyBpKysgKSB7CisJICAgICAgICBpYmRldiA9IGFsbG9jX2liZGV2ICggMCApOworCQlpZiAoICEgaWJkZXYgKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9hbGxvY19pYmRldjsKKwkJfQorCQloZXJtb24tPmliZGV2W2ldID0gaWJkZXY7CisJCWliZGV2LT5vcCA9ICZoZXJtb25faWJfb3BlcmF0aW9uczsKKwkJaWJkZXYtPmRldiA9ICZwY2ktPmRldjsKKwkJaWJkZXYtPnBvcnQgPSAoIEhFUk1PTl9QT1JUX0JBU0UgKyBpICk7CisJCWliX3NldF9kcnZkYXRhICggaWJkZXYsIGhlcm1vbiApOworCX0KKworCS8qIEFsbG9jYXRlIElDTSAqLworCW1lbXNldCAoICZpbml0X2hjYSwgMCwgc2l6ZW9mICggaW5pdF9oY2EgKSApOworCWlmICggKCByYyA9IGhlcm1vbl9hbGxvY19pY20gKCBoZXJtb24sICZpbml0X2hjYSApICkgIT0gMCApCisJCWdvdG8gZXJyX2FsbG9jX2ljbTsKKworCS8qIEluaXRpYWxpc2UgSENBICovCisJTUxYX0ZJTExfMSAoICZpbml0X2hjYSwgMCwgdmVyc2lvbiwgMHgwMiAvKiAiTXVzdCBiZSAweDAyIiAqLyApOworCU1MWF9GSUxMXzEgKCAmaW5pdF9oY2EsIDUsIHVkcCwgMSApOworCU1MWF9GSUxMXzEgKCAmaW5pdF9oY2EsIDc0LCB1YXJfcGFyYW1ldGVycy5sb2dfbWF4X3VhcnMsIDggKTsKKwlpZiAoICggcmMgPSBoZXJtb25fY21kX2luaXRfaGNhICggaGVybW9uLCAmaW5pdF9oY2EgKSApICE9IDAgKSB7CisJCURCR0MgKCBoZXJtb24sICJIZXJtb24gJXAgY291bGQgbm90IGluaXRpYWxpc2UgSENBOiAlc1xuIiwKKwkJICAgICAgIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX2luaXRfaGNhOworCX0KKworCS8qIFNldCB1cCBtZW1vcnkgcHJvdGVjdGlvbiAqLworCWlmICggKCByYyA9IGhlcm1vbl9zZXR1cF9tcHQgKCBoZXJtb24gKSApICE9IDAgKQorCQlnb3RvIGVycl9zZXR1cF9tcHQ7CisJZm9yICggaSA9IDAgOyBpIDwgaGVybW9uLT5jYXAubnVtX3BvcnRzIDsgaSsrICkKKwkJaGVybW9uLT5pYmRldltpXS0+cmRtYV9rZXkgPSBoZXJtb24tPmxrZXk7CisKKwkvKiBTZXQgdXAgZXZlbnQgcXVldWUgKi8KKwlpZiAoICggcmMgPSBoZXJtb25fY3JlYXRlX2VxICggaGVybW9uICkgKSAhPSAwICkKKwkJZ290byBlcnJfY3JlYXRlX2VxOworCisJLyogQ29uZmlndXJlIHNwZWNpYWwgUVBzICovCisJaWYgKCAoIHJjID0gaGVybW9uX2NvbmZpZ3VyZV9zcGVjaWFsX3FwcyAoIGhlcm1vbiApICkgIT0gMCApCisJCWdvdG8gZXJyX2NvbmZfc3BlY2lhbF9xcHM7CisKKwkvKiBVcGRhdGUgSVBvSUIgTUFDIGFkZHJlc3MgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBoZXJtb24tPmNhcC5udW1fcG9ydHMgOyBpKysgKSB7CisJCWliX3NtY191cGRhdGUgKCBoZXJtb24tPmliZGV2W2ldLCBoZXJtb25fbWFkICk7CisJfQorCisJLyogUmVnaXN0ZXIgSW5maW5pYmFuZCBkZXZpY2VzICovCisJZm9yICggaSA9IDAgOyBpIDwgaGVybW9uLT5jYXAubnVtX3BvcnRzIDsgaSsrICkgeworCQlpZiAoICggcmMgPSByZWdpc3Rlcl9pYmRldiAoIGhlcm1vbi0+aWJkZXZbaV0gKSApICE9IDAgKSB7CisJCQlEQkdDICggaGVybW9uLCAiSGVybW9uICVwIGNvdWxkIG5vdCByZWdpc3RlciBJQiAiCisJCQkgICAgICAgImRldmljZTogJXNcbiIsIGhlcm1vbiwgc3RyZXJyb3IgKCByYyApICk7CisJCQlnb3RvIGVycl9yZWdpc3Rlcl9pYmRldjsKKwkJfQorCX0KKworCXJldHVybiAwOworCisJaSA9IGhlcm1vbi0+Y2FwLm51bV9wb3J0czsKKyBlcnJfcmVnaXN0ZXJfaWJkZXY6CisJZm9yICggaS0tIDsgKCBzaWduZWQgaW50ICkgaSA+PSAwIDsgaS0tICkKKwkJdW5yZWdpc3Rlcl9pYmRldiAoIGhlcm1vbi0+aWJkZXZbaV0gKTsKKyBlcnJfY29uZl9zcGVjaWFsX3FwczoKKwloZXJtb25fZGVzdHJveV9lcSAoIGhlcm1vbiApOworIGVycl9jcmVhdGVfZXE6CisgZXJyX3NldHVwX21wdDoKKwloZXJtb25fY21kX2Nsb3NlX2hjYSAoIGhlcm1vbiApOworIGVycl9pbml0X2hjYToKKwloZXJtb25fZnJlZV9pY20gKCBoZXJtb24gKTsKKyBlcnJfYWxsb2NfaWNtOgorCWkgPSBoZXJtb24tPmNhcC5udW1fcG9ydHM7CisgZXJyX2FsbG9jX2liZGV2OgorCWZvciAoIGktLSA7ICggc2lnbmVkIGludCApIGkgPj0gMCA7IGktLSApCisJCWliZGV2X3B1dCAoIGhlcm1vbi0+aWJkZXZbaV0gKTsKKyBlcnJfZ2V0X2NhcDoKKwloZXJtb25fc3RvcF9maXJtd2FyZSAoIGhlcm1vbiApOworIGVycl9zdGFydF9maXJtd2FyZToKKwlmcmVlX2RtYSAoIGhlcm1vbi0+bWFpbGJveF9vdXQsIEhFUk1PTl9NQk9YX1NJWkUgKTsKKyBlcnJfbWFpbGJveF9vdXQ6CisJZnJlZV9kbWEgKCBoZXJtb24tPm1haWxib3hfaW4sIEhFUk1PTl9NQk9YX1NJWkUgKTsKKyBlcnJfbWFpbGJveF9pbjoKKwlmcmVlICggaGVybW9uICk7CisgZXJyX2FsbG9jX2hlcm1vbjoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVtb3ZlIFBDSSBkZXZpY2UKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaGVybW9uX3JlbW92ZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgKSB7CisJc3RydWN0IGhlcm1vbiAqaGVybW9uID0gcGNpX2dldF9kcnZkYXRhICggcGNpICk7CisJaW50IGk7CisKKwlmb3IgKCBpID0gKCBoZXJtb24tPmNhcC5udW1fcG9ydHMgLSAxICkgOyBpID49IDAgOyBpLS0gKQorCQl1bnJlZ2lzdGVyX2liZGV2ICggaGVybW9uLT5pYmRldltpXSApOworCWhlcm1vbl9kZXN0cm95X2VxICggaGVybW9uICk7CisJaGVybW9uX2NtZF9jbG9zZV9oY2EgKCBoZXJtb24gKTsKKwloZXJtb25fZnJlZV9pY20gKCBoZXJtb24gKTsKKwloZXJtb25fc3RvcF9maXJtd2FyZSAoIGhlcm1vbiApOworCWhlcm1vbl9zdG9wX2Zpcm13YXJlICggaGVybW9uICk7CisJZnJlZV9kbWEgKCBoZXJtb24tPm1haWxib3hfb3V0LCBIRVJNT05fTUJPWF9TSVpFICk7CisJZnJlZV9kbWEgKCBoZXJtb24tPm1haWxib3hfaW4sIEhFUk1PTl9NQk9YX1NJWkUgKTsKKwlmb3IgKCBpID0gKCBoZXJtb24tPmNhcC5udW1fcG9ydHMgLSAxICkgOyBpID49IDAgOyBpLS0gKQorCQlpYmRldl9wdXQgKCBoZXJtb24tPmliZGV2W2ldICk7CisJZnJlZSAoIGhlcm1vbiApOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaGVybW9uX25pY3NbXSA9IHsKKwlQQ0lfUk9NICggMHgxNWIzLCAweDYzNDAsICJtdDI1NDA4IiwgIk1UMjU0MDggSENBIGRyaXZlciIsIDAgKSwKKwlQQ0lfUk9NICggMHgxNWIzLCAweDYzNGEsICJtdDI1NDE4IiwgIk1UMjU0MTggSENBIGRyaXZlciIsIDAgKSwKKwlQQ0lfUk9NICggMHgxNWIzLCAweDY3MzIsICJtdDI2NDE4IiwgIk1UMjY0MTggSENBIGRyaXZlciIsIDAgKSwKKwlQQ0lfUk9NICggMHgxNWIzLCAweDY3M2MsICJtdDI2NDI4IiwgIk1UMjY0MjggSENBIGRyaXZlciIsIDAgKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIGhlcm1vbl9kcml2ZXIgX19wY2lfZHJpdmVyID0geworCS5pZHMgPSBoZXJtb25fbmljcywKKwkuaWRfY291bnQgPSAoIHNpemVvZiAoIGhlcm1vbl9uaWNzICkgLyBzaXplb2YgKCBoZXJtb25fbmljc1swXSApICksCisJLnByb2JlID0gaGVybW9uX3Byb2JlLAorCS5yZW1vdmUgPSBoZXJtb25fcmVtb3ZlLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9oZXJtb24uaCBiL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9oZXJtb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTNmM2RhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL2hlcm1vbi5oCkBAIC0wLDAgKzEsNjEwIEBACisjaWZuZGVmIF9IRVJNT05fSAorI2RlZmluZSBfSEVSTU9OX0gKKworLyoqIEBmaWxlCisgKgorICogTWVsbGFub3ggSGVybW9uIEluZmluaWJhbmQgSENBIGRyaXZlcgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2liX3BhY2tldC5oPgorI2luY2x1ZGUgIm1seF9iaXRvcHMuaCIKKyNpbmNsdWRlICJNVDI1NDA4X1BSTS5oIgorCisvKgorICogSGFyZHdhcmUgY29uc3RhbnRzCisgKgorICovCisKKy8qIFBvcnRzIGluIGV4aXN0ZW5jZSAqLworI2RlZmluZSBIRVJNT05fTUFYX1BPUlRTCQkyCisjZGVmaW5lIEhFUk1PTl9QT1JUX0JBU0UJCTEKKworLyogUENJIEJBUnMgKi8KKyNkZWZpbmUgSEVSTU9OX1BDSV9DT05GSUdfQkFSCQlQQ0lfQkFTRV9BRERSRVNTXzAKKyNkZWZpbmUgSEVSTU9OX1BDSV9DT05GSUdfQkFSX1NJWkUJMHgxMDAwMDAKKyNkZWZpbmUgSEVSTU9OX1BDSV9VQVJfQkFSCQlQQ0lfQkFTRV9BRERSRVNTXzIKKworLyogRGV2aWNlIHJlc2V0ICovCisjZGVmaW5lIEhFUk1PTl9SRVNFVF9PRkZTRVQJCTB4MGYwMDEwCisjZGVmaW5lIEhFUk1PTl9SRVNFVF9NQUdJQwkJMHgwMTAwMDAwMFVMCisjZGVmaW5lIEhFUk1PTl9SRVNFVF9XQUlUX1RJTUVfTVMJMTAwMAorCisvKiBXb3JrIHF1ZXVlIGVudHJ5IGFuZCBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5IG9wY29kZXMgKi8KKyNkZWZpbmUgSEVSTU9OX09QQ09ERV9OT1AJCTB4MDAKKyNkZWZpbmUgSEVSTU9OX09QQ09ERV9TRU5ECQkweDBhCisjZGVmaW5lIEhFUk1PTl9PUENPREVfUkVDVl9FUlJPUgkweGZlCisjZGVmaW5lIEhFUk1PTl9PUENPREVfU0VORF9FUlJPUgkweGZmCisKKy8qIEhDQSBjb21tYW5kIHJlZ2lzdGVyIG9wY29kZXMgKi8KKyNkZWZpbmUgSEVSTU9OX0hDUl9RVUVSWV9ERVZfQ0FQCTB4MDAwMworI2RlZmluZSBIRVJNT05fSENSX1FVRVJZX0ZXCQkweDAwMDQKKyNkZWZpbmUgSEVSTU9OX0hDUl9JTklUX0hDQQkJMHgwMDA3CisjZGVmaW5lIEhFUk1PTl9IQ1JfQ0xPU0VfSENBCQkweDAwMDgKKyNkZWZpbmUgSEVSTU9OX0hDUl9JTklUX1BPUlQJCTB4MDAwOQorI2RlZmluZSBIRVJNT05fSENSX0NMT1NFX1BPUlQJCTB4MDAwYQorI2RlZmluZSBIRVJNT05fSENSX1NXMkhXX01QVAkJMHgwMDBkCisjZGVmaW5lIEhFUk1PTl9IQ1JfV1JJVEVfTVRUCQkweDAwMTEKKyNkZWZpbmUgSEVSTU9OX0hDUl9NQVBfRVEJCTB4MDAxMgorI2RlZmluZSBIRVJNT05fSENSX1NXMkhXX0VRCQkweDAwMTMKKyNkZWZpbmUgSEVSTU9OX0hDUl9IVzJTV19FUQkJMHgwMDE0CisjZGVmaW5lIEhFUk1PTl9IQ1JfUVVFUllfRVEJCTB4MDAxNQorI2RlZmluZSBIRVJNT05fSENSX1NXMkhXX0NRCQkweDAwMTYKKyNkZWZpbmUgSEVSTU9OX0hDUl9IVzJTV19DUQkJMHgwMDE3CisjZGVmaW5lIEhFUk1PTl9IQ1JfUlNUMklOSVRfUVAJCTB4MDAxOQorI2RlZmluZSBIRVJNT05fSENSX0lOSVQyUlRSX1FQCQkweDAwMWEKKyNkZWZpbmUgSEVSTU9OX0hDUl9SVFIyUlRTX1FQCQkweDAwMWIKKyNkZWZpbmUgSEVSTU9OX0hDUl9SVFMyUlRTX1FQCQkweDAwMWMKKyNkZWZpbmUgSEVSTU9OX0hDUl8yUlNUX1FQCQkweDAwMjEKKyNkZWZpbmUgSEVSTU9OX0hDUl9RVUVSWV9RUAkJMHgwMDIyCisjZGVmaW5lIEhFUk1PTl9IQ1JfQ09ORl9TUEVDSUFMX1FQCTB4MDAyMworI2RlZmluZSBIRVJNT05fSENSX01BRF9JRkMJCTB4MDAyNAorI2RlZmluZSBIRVJNT05fSENSX1JFQURfTUNHCQkweDAwMjUKKyNkZWZpbmUgSEVSTU9OX0hDUl9XUklURV9NQ0cJCTB4MDAyNgorI2RlZmluZSBIRVJNT05fSENSX01HSURfSEFTSAkJMHgwMDI3CisjZGVmaW5lIEhFUk1PTl9IQ1JfU0VOU0VfUE9SVAkJMHgwMDRkCisjZGVmaW5lIEhFUk1PTl9IQ1JfUlVOX0ZXCQkweDBmZjYKKyNkZWZpbmUgSEVSTU9OX0hDUl9ESVNBQkxFX0xBTQkJMHgwZmY3CisjZGVmaW5lIEhFUk1PTl9IQ1JfRU5BQkxFX0xBTQkJMHgwZmY4CisjZGVmaW5lIEhFUk1PTl9IQ1JfVU5NQVBfSUNNCQkweDBmZjkKKyNkZWZpbmUgSEVSTU9OX0hDUl9NQVBfSUNNCQkweDBmZmEKKyNkZWZpbmUgSEVSTU9OX0hDUl9VTk1BUF9JQ01fQVVYCTB4MGZmYgorI2RlZmluZSBIRVJNT05fSENSX01BUF9JQ01fQVVYCQkweDBmZmMKKyNkZWZpbmUgSEVSTU9OX0hDUl9TRVRfSUNNX1NJWkUJCTB4MGZmZAorI2RlZmluZSBIRVJNT05fSENSX1VOTUFQX0ZBCQkweDBmZmUKKyNkZWZpbmUgSEVSTU9OX0hDUl9NQVBfRkEJCTB4MGZmZgorCisvKiBTZXJ2aWNlIHR5cGVzICovCisjZGVmaW5lIEhFUk1PTl9TVF9SQwkJCTB4MDAKKyNkZWZpbmUgSEVSTU9OX1NUX1VECQkJMHgwMworI2RlZmluZSBIRVJNT05fU1RfTUxYCQkJMHgwNworCisvKiBNVFVzICovCisjZGVmaW5lIEhFUk1PTl9NVFVfMjA0OAkJCTB4MDQKKworI2RlZmluZSBIRVJNT05fSU5WQUxJRF9MS0VZCQkweDAwMDAwMTAwVUwKKworI2RlZmluZSBIRVJNT05fUEFHRV9TSVpFCQk0MDk2CisKKyNkZWZpbmUgSEVSTU9OX0RCX1BPU1RfU05EX09GRlNFVAkweDE0CisjZGVmaW5lIEhFUk1PTl9EQl9FUV9PRkZTRVQoX2VxbikJXAorCSggMHg4MDAgKyBIRVJNT05fUEFHRV9TSVpFICogKCAoX2VxbikgLyA0ICkgKyAweDA4ICogKCAoX2VxbikgJSA0ICkgKQorCisjZGVmaW5lIEhFUk1PTl9RUF9PUFRfUEFSQU1fUE1fU1RBVEUJMHgwMDAwMDQwMFVMCisjZGVmaW5lIEhFUk1PTl9RUF9PUFRfUEFSQU1fUUtFWQkweDAwMDAwMDIwVUwKKyNkZWZpbmUgSEVSTU9OX1FQX09QVF9QQVJBTV9BTFRfUEFUSAkweDAwMDAwMDAxVUwKKworI2RlZmluZSBIRVJNT05fTUFQX0VRCQkJKCAwVUwgPDwgMzEgKQorI2RlZmluZSBIRVJNT05fVU5NQVBfRVEJCQkoIDFVTCA8PCAzMSApCisKKyNkZWZpbmUgSEVSTU9OX0VWX1BPUlRfU1RBVEVfQ0hBTkdFCTB4MDkKKworI2RlZmluZSBIRVJNT05fU0NIRURfUVAwCQkweDNmCisjZGVmaW5lIEhFUk1PTl9TQ0hFRF9ERUZBVUxUCQkweDgzCisKKyNkZWZpbmUgSEVSTU9OX1BNX1NUQVRFX0FSTUVECQkweDAwCisjZGVmaW5lIEhFUk1PTl9QTV9TVEFURV9SRUFSTQkJMHgwMQorI2RlZmluZSBIRVJNT05fUE1fU1RBVEVfTUlHUkFURUQJMHgwMworCisjZGVmaW5lIEhFUk1PTl9SRVRSWV9NQVgJCTB4MDcKKworLyoKKyAqIERhdGF0eXBlcyB0aGF0IHNlZW0gdG8gYmUgbWlzc2luZyBmcm9tIHRoZSBhdXRvZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24KKyAqCisgKi8KK3N0cnVjdCBoZXJtb25wcm1fbWdtX2hhc2hfc3QgeworCXBzZXVkb19iaXRfdCByZXNlcnZlZDBbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworCXBzZXVkb19iaXRfdCBoYXNoWzB4MDAwMTBdOworCXBzZXVkb19iaXRfdCByZXNlcnZlZDFbMHgwMDAxMF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCitzdHJ1Y3QgaGVybW9ucHJtX21jZ19lbnRyeV9zdCB7CisJc3RydWN0IGhlcm1vbnBybV9tY2dfaGRyX3N0IGhkcjsKKwlzdHJ1Y3QgaGVybW9ucHJtX21jZ19xcF9kd19zdCBxcFs4XTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3N0cnVjdCBoZXJtb25wcm1fY3FfZGJfcmVjb3JkX3N0IHsKKwlwc2V1ZG9fYml0X3QgdXBkYXRlX2NpWzB4MDAwMThdOworCXBzZXVkb19iaXRfdCByZXNlcnZlZDBbMHgwMDAwOF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworCXBzZXVkb19iaXRfdCBhcm1fY2lbMHgwMDAxOF07CisJcHNldWRvX2JpdF90IGNtZFsweDAwMDAzXTsKKwlwc2V1ZG9fYml0X3QgcmVzZXJ2ZWQxWzB4MDAwMDFdOworCXBzZXVkb19iaXRfdCBjbWRfc25bMHgwMDAwMl07CisJcHNldWRvX2JpdF90IHJlc2VydmVkMlsweDAwMDAyXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3N0cnVjdCBoZXJtb25wcm1fc2VuZF9kYl9yZWdpc3Rlcl9zdCB7CisJcHNldWRvX2JpdF90IHJlc2VydmVkWzB4MDAwMDhdOworCXBzZXVkb19iaXRfdCBxblsweDAwMDE4XTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3N0cnVjdCBoZXJtb25wcm1fZXZlbnRfZGJfcmVnaXN0ZXJfc3QgeworCXBzZXVkb19iaXRfdCBjaVsweDAwMDE4XTsKKwlwc2V1ZG9fYml0X3QgcmVzZXJ2ZXJbMHgwMDAwN107CisJcHNldWRvX2JpdF90IGFbMHgwMDAwMV07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCitzdHJ1Y3QgaGVybW9ucHJtX3NjYWxhcl9wYXJhbWV0ZXJfc3QgeworCXBzZXVkb19iaXRfdCB2YWx1ZV9oaVsweDAwMDIwXTsKKy8qIC0tLS0tLS0tLS0tLS0tICovCisJcHNldWRvX2JpdF90IHZhbHVlWzB4MDAwMjBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworc3RydWN0IGhlcm1vbnBybV9ldmVudF9tYXNrX3N0IHsKKwlwc2V1ZG9fYml0X3QgcmVzZXJ2ZWQwWzB4MDAwMjBdOworLyogLS0tLS0tLS0tLS0tLS0gKi8KKwlwc2V1ZG9fYml0X3QgY29tcGxldGlvblsweDAwMDAxXTsKKwlwc2V1ZG9fYml0X3QgcmVzZXJ2ZWQxWzB4MDAwOF07CisJcHNldWRvX2JpdF90IHBvcnRfc3RhdGVfY2hhbmdlWzB4MDAwMDFdOworCXBzZXVkb19iaXRfdCByZXNlcnZlZDJbMHgwMDAxNl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCitzdHJ1Y3QgaGVybW9ucHJtX3BvcnRfc3RhdGVfY2hhbmdlX2V2ZW50X3N0IHsKKwlwc2V1ZG9fYml0X3QgcmVzZXJ2ZWRbMHgwMDAyMF07CisJc3RydWN0IGhlcm1vbnBybV9wb3J0X3N0YXRlX2NoYW5nZV9zdCBkYXRhOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEhlcm1vbiBzZW5zZSBwb3J0ICovCitzdHJ1Y3QgaGVybW9ucHJtX3NlbnNlX3BvcnRfc3QgeworCXBzZXVkb19iaXRfdCBwb3J0X3R5cGVbMHgwMDAyMF07CisvKiAtLS0tLS0tLS0tLS0tLSAqLworCXBzZXVkb19iaXRfdCByZXNlcnZlZFsweDAwMDIwXTsKK307CisjZGVmaW5lIEhFUk1PTl9QT1JUX1RZUEVfSUIJCTEKKworLyoKKyAqIFdyYXBwZXIgc3RydWN0dXJlcyBmb3IgaGFyZHdhcmUgZGF0YXR5cGVzCisgKgorICovCisKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fY29tcGxldGlvbl9xdWV1ZV9jb250ZXh0ICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggaGVybW9ucHJtX2NvbXBsZXRpb25fcXVldWVfZW50cnkgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fY29tcGxldGlvbl93aXRoX2Vycm9yICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggaGVybW9ucHJtX2NxX2RiX3JlY29yZCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9lcWMgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fZXZlbnRfZGJfcmVnaXN0ZXIgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fZXZlbnRfbWFzayApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9ldmVudF9xdWV1ZV9lbnRyeSApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9oY2FfY29tbWFuZF9yZWdpc3RlciApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9pbml0X2hjYSApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9pbml0X3BvcnQgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fbWFkX2lmYyApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9tY2dfZW50cnkgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fbWdtX2hhc2ggKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fbXB0ICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggaGVybW9ucHJtX210dCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9wb3J0X3N0YXRlX2NoYW5nZV9ldmVudCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9xcF9kYl9yZWNvcmQgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fcXBfZWVfc3RhdGVfdHJhbnNpdGlvbnMgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fcXVlcnlfZGV2X2NhcCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9xdWVyeV9mdyApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9xdWV1ZV9wYWlyX2VlX2NvbnRleHRfZW50cnkgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fc2NhbGFyX3BhcmFtZXRlciApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV9zZW5zZV9wb3J0ICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggaGVybW9ucHJtX3NlbmRfZGJfcmVnaXN0ZXIgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fdWRfYWRkcmVzc192ZWN0b3IgKTsKK3N0cnVjdCBNTFhfREVDTEFSRV9TVFJVQ1QgKCBoZXJtb25wcm1fdmlydHVhbF9waHlzaWNhbF9tYXBwaW5nICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggaGVybW9ucHJtX3dxZV9zZWdtZW50X2N0cmxfbWx4ICk7CitzdHJ1Y3QgTUxYX0RFQ0xBUkVfU1RSVUNUICggaGVybW9ucHJtX3dxZV9zZWdtZW50X2N0cmxfc2VuZCApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV93cWVfc2VnbWVudF9kYXRhX3B0ciApOworc3RydWN0IE1MWF9ERUNMQVJFX1NUUlVDVCAoIGhlcm1vbnBybV93cWVfc2VnbWVudF91ZCApOworCisvKgorICogQ29tcG9zaXRlIGhhcmR3YXJlIGRhdGF0eXBlcworICoKKyAqLworCitzdHJ1Y3QgaGVybW9ucHJtX3dyaXRlX210dCB7CisJc3RydWN0IGhlcm1vbnBybV9zY2FsYXJfcGFyYW1ldGVyIG10dF9iYXNlX2FkZHI7CisJc3RydWN0IGhlcm1vbnBybV9zY2FsYXJfcGFyYW1ldGVyIHJlc2VydmVkOworCXN0cnVjdCBoZXJtb25wcm1fbXR0IG10dDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKyNkZWZpbmUgSEVSTU9OX01BWF9HQVRIRVIgMgorCitzdHJ1Y3QgaGVybW9ucHJtX3VkX3NlbmRfd3FlIHsKKwlzdHJ1Y3QgaGVybW9ucHJtX3dxZV9zZWdtZW50X2N0cmxfc2VuZCBjdHJsOworCXN0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfdWQgdWQ7CisJc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9kYXRhX3B0ciBkYXRhW0hFUk1PTl9NQVhfR0FUSEVSXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3N0cnVjdCBoZXJtb25wcm1fbWx4X3NlbmRfd3FlIHsKKwlzdHJ1Y3QgaGVybW9ucHJtX3dxZV9zZWdtZW50X2N0cmxfbWx4IGN0cmw7CisJc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9kYXRhX3B0ciBkYXRhW0hFUk1PTl9NQVhfR0FUSEVSXTsKKwl1aW50OF90IGhlYWRlcnNbSUJfTUFYX0hFQURFUl9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3N0cnVjdCBoZXJtb25wcm1fcmNfc2VuZF93cWUgeworCXN0cnVjdCBoZXJtb25wcm1fd3FlX3NlZ21lbnRfY3RybF9zZW5kIGN0cmw7CisJc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9kYXRhX3B0ciBkYXRhW0hFUk1PTl9NQVhfR0FUSEVSXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKyNkZWZpbmUgSEVSTU9OX01BWF9TQ0FUVEVSIDEKKworc3RydWN0IGhlcm1vbnBybV9yZWN2X3dxZSB7CisJc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9kYXRhX3B0ciBkYXRhW0hFUk1PTl9NQVhfU0NBVFRFUl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCit1bmlvbiBoZXJtb25wcm1fY29tcGxldGlvbl9lbnRyeSB7CisJc3RydWN0IGhlcm1vbnBybV9jb21wbGV0aW9uX3F1ZXVlX2VudHJ5IG5vcm1hbDsKKwlzdHJ1Y3QgaGVybW9ucHJtX2NvbXBsZXRpb25fd2l0aF9lcnJvciBlcnJvcjsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3VuaW9uIGhlcm1vbnBybV9ldmVudF9lbnRyeSB7CisJc3RydWN0IGhlcm1vbnBybV9ldmVudF9xdWV1ZV9lbnRyeSBnZW5lcmljOworCXN0cnVjdCBoZXJtb25wcm1fcG9ydF9zdGF0ZV9jaGFuZ2VfZXZlbnQgcG9ydF9zdGF0ZV9jaGFuZ2U7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCit1bmlvbiBoZXJtb25wcm1fZG9vcmJlbGxfcmVnaXN0ZXIgeworCXN0cnVjdCBoZXJtb25wcm1fc2VuZF9kYl9yZWdpc3RlciBzZW5kOworCXN0cnVjdCBoZXJtb25wcm1fZXZlbnRfZGJfcmVnaXN0ZXIgZXZlbnQ7CisJdWludDMyX3QgZHdvcmRbMV07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCit1bmlvbiBoZXJtb25wcm1fbWFkIHsKKwlzdHJ1Y3QgaGVybW9ucHJtX21hZF9pZmMgaWZjOworCXVuaW9uIGliX21hZCBtYWQ7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKgorICogZ1BYRS1zcGVjaWZpYyBkZWZpbml0aW9ucworICoKKyAqLworCisvKiogSGVybW9uIGRldmljZSBjYXBhYmlsaXRpZXNzICovCitzdHJ1Y3QgaGVybW9uX2Rldl9jYXAgeworCS8qKiBDTVBUIGVudHJ5IHNpemUgKi8KKwlzaXplX3QgY21wdF9lbnRyeV9zaXplOworCS8qKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgUVBzICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkX3FwczsKKwkvKiogUVAgY29udGV4dCBlbnRyeSBzaXplICovCisJc2l6ZV90IHFwY19lbnRyeV9zaXplOworCS8qKiBBbHRlcm5hdGUgcGF0aCBjb250ZXh0IGVudHJ5IHNpemUgKi8KKwlzaXplX3QgYWx0Y19lbnRyeV9zaXplOworCS8qKiBBdXhpbGlhcnkgY29udGV4dCBlbnRyeSBzaXplICovCisJc2l6ZV90IGF1eGNfZW50cnlfc2l6ZTsKKwkvKiogTnVtYmVyIG9mIHJlc2VydmVkIFNSUXMgKi8KKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfc3JxczsKKwkvKiogU1JRIGNvbnRleHQgZW50cnkgc2l6ZSAqLworCXNpemVfdCBzcnFjX2VudHJ5X3NpemU7CisJLyoqIE51bWJlciBvZiByZXNlcnZlZCBDUXMgKi8KKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfY3FzOworCS8qKiBDUSBjb250ZXh0IGVudHJ5IHNpemUgKi8KKwlzaXplX3QgY3FjX2VudHJ5X3NpemU7CisJLyoqIE51bWJlciBvZiByZXNlcnZlZCBFUXMgKi8KKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfZXFzOworCS8qKiBFUSBjb250ZXh0IGVudHJ5IHNpemUgKi8KKwlzaXplX3QgZXFjX2VudHJ5X3NpemU7CisJLyoqIE51bWJlciBvZiByZXNlcnZlZCBNVFRzICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkX210dHM7CisJLyoqIE1UVCBlbnRyeSBzaXplICovCisJc2l6ZV90IG10dF9lbnRyeV9zaXplOworCS8qKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgTVJXcyAqLworCXVuc2lnbmVkIGludCByZXNlcnZlZF9tcndzOworCS8qKiBETVBUIGVudHJ5IHNpemUgKi8KKwlzaXplX3QgZG1wdF9lbnRyeV9zaXplOworCS8qKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgVUFScyAqLworCXVuc2lnbmVkIGludCByZXNlcnZlZF91YXJzOworCS8qKiBOdW1iZXIgb2YgcG9ydHMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX3BvcnRzOworCS8qKiBEdWFsLXBvcnQgZGlmZmVyZW50IHByb3RvY29sICovCisJaW50IGRwZHA7Cit9OworCisvKiogTnVtYmVyIG9mIGNNUFQgZW50cmllcyBvZiBlYWNoIHR5cGUgKi8KKyNkZWZpbmUgSEVSTU9OX0NNUFRfTUFYX0VOVFJJRVMgKCAxIDw8IDI0ICkKKworLyoqIEhlcm1vbiBJQ00gbWVtb3J5IG1hcCBlbnRyeSAqLworc3RydWN0IGhlcm1vbl9pY21fbWFwIHsKKwkvKiogT2Zmc2V0ICh2aXJ0dWFsIGFkZHJlc3Mgd2l0aGluIElDTSkgKi8KKwl1aW50NjRfdCBvZmZzZXQ7CisJLyoqIExlbmd0aCAqLworCXNpemVfdCBsZW47Cit9OworCisvKiogRGlzY29udGlndW91cyByZWdpb25zIHdpdGhpbiBIZXJtb24gSUNNICovCitlbnVtIGhlcm1vbl9pY21fbWFwX3JlZ2lvbnMgeworCUhFUk1PTl9JQ01fUVBfQ01QVCA9IDAsCisJSEVSTU9OX0lDTV9TUlFfQ01QVCwKKwlIRVJNT05fSUNNX0NRX0NNUFQsCisJSEVSTU9OX0lDTV9FUV9DTVBULAorCUhFUk1PTl9JQ01fT1RIRVIsCisJSEVSTU9OX0lDTV9OVU1fUkVHSU9OUworfTsKKworLyoqIFVBUiBwYWdlIGZvciBkb29yYmVsbCBhY2Nlc3NlcworICoKKyAqIFBhZ2VzIDAtMTI3IGFyZSByZXNlcnZlZCBmb3IgZXZlbnQgcXVldWUgZG9vcmJlbGxzIG9ubHksIHNvIHdlIHVzZQorICogcGFnZSAxMjguCisgKi8KKyNkZWZpbmUgSEVSTU9OX1VBUl9OT05fRVFfUEFHRQkxMjgKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIGFsbG9jYXRhYmxlIE1UVCBlbnRyaWVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbiwgbm90IGEgZGV2aWNlIGxpbWl0LgorICovCisjZGVmaW5lIEhFUk1PTl9NQVhfTVRUUwkJNjQKKworLyoqIEEgSGVybW9uIE1UVCBkZXNjcmlwdG9yICovCitzdHJ1Y3QgaGVybW9uX210dCB7CisJLyoqIE1UVCBvZmZzZXQgKi8KKwl1bnNpZ25lZCBpbnQgbXR0X29mZnNldDsKKwkvKiogTnVtYmVyIG9mIHBhZ2VzICovCisJdW5zaWduZWQgaW50IG51bV9wYWdlczsKKwkvKiogTVRUIGJhc2UgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBtdHRfYmFzZV9hZGRyOworCS8qKiBPZmZzZXQgd2l0aGluIHBhZ2UgKi8KKwl1bnNpZ25lZCBpbnQgcGFnZV9vZmZzZXQ7Cit9OworCisvKiogQWxpZ25tZW50IG9mIEhlcm1vbiBzZW5kIHdvcmsgcXVldWUgZW50cmllcyAqLworI2RlZmluZSBIRVJNT05fU0VORF9XUUVfQUxJR04gMTI4CisKKy8qKiBBIEhlcm1vbiBzZW5kIHdvcmsgcXVldWUgZW50cnkgKi8KK3VuaW9uIGhlcm1vbl9zZW5kX3dxZSB7CisJc3RydWN0IGhlcm1vbnBybV93cWVfc2VnbWVudF9jdHJsX3NlbmQgY3RybDsKKwlzdHJ1Y3QgaGVybW9ucHJtX3VkX3NlbmRfd3FlIHVkOworCXN0cnVjdCBoZXJtb25wcm1fbWx4X3NlbmRfd3FlIG1seDsKKwlzdHJ1Y3QgaGVybW9ucHJtX3JjX3NlbmRfd3FlIHJjOworCXVpbnQ4X3QgZm9yY2VfYWxpZ25bSEVSTU9OX1NFTkRfV1FFX0FMSUdOXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBIEhlcm1vbiBzZW5kIHdvcmsgcXVldWUgKi8KK3N0cnVjdCBoZXJtb25fc2VuZF93b3JrX3F1ZXVlIHsKKwkvKiogTnVtYmVyIG9mIHdvcmsgcXVldWUgZW50cmllcywgaW5jbHVkaW5nIGhlYWRyb29tCisJICoKKwkgKiBIZXJtb24gcmVxdWlyZXMgdXMgdG8gbGVhdmUgdW51c2VkIHNwYWNlIHdpdGhpbiB0aGUgc2VuZAorCSAqIFdRLCBzbyB3ZSBjcmVhdGUgYSBzZW5kIFdRIHdpdGggbW9yZSBlbnRyaWVzIHRoYW4gYXJlCisJICogcmVxdWVzdGVkIGluIHRoZSBjcmVhdGVfcXAoKSBjYWxsLgorCSAqLworCXVuc2lnbmVkIGludCBudW1fd3FlczsKKwkvKiogV29yayBxdWV1ZSBlbnRyaWVzICovCisJdW5pb24gaGVybW9uX3NlbmRfd3FlICp3cWU7CisJLyoqIFNpemUgb2Ygd29yayBxdWV1ZSAqLworCXNpemVfdCB3cWVfc2l6ZTsKKwkvKiogRG9vcmJlbGwgcmVnaXN0ZXIgKi8KKwl2b2lkICpkb29yYmVsbDsKK307CisKKy8qKiBBbGlnbm1lbnQgb2YgSGVybW9uIHJlY2VpdmUgd29yayBxdWV1ZSBlbnRyaWVzICovCisjZGVmaW5lIEhFUk1PTl9SRUNWX1dRRV9BTElHTiAxNgorCisvKiogQSBIZXJtb24gcmVjZWl2ZSB3b3JrIHF1ZXVlIGVudHJ5ICovCit1bmlvbiBoZXJtb25fcmVjdl93cWUgeworCXN0cnVjdCBoZXJtb25wcm1fcmVjdl93cWUgcmVjdjsKKwl1aW50OF90IGZvcmNlX2FsaWduW0hFUk1PTl9SRUNWX1dRRV9BTElHTl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBIZXJtb24gcmVjZWl2ZSB3b3JrIHF1ZXVlICovCitzdHJ1Y3QgaGVybW9uX3JlY3Zfd29ya19xdWV1ZSB7CisJLyoqIFdvcmsgcXVldWUgZW50cmllcyAqLworCXVuaW9uIGhlcm1vbl9yZWN2X3dxZSAqd3FlOworCS8qKiBTaXplIG9mIHdvcmsgcXVldWUgKi8KKwlzaXplX3Qgd3FlX3NpemU7CisJLyoqIERvb3JiZWxsICovCisJc3RydWN0IGhlcm1vbnBybV9xcF9kYl9yZWNvcmQgZG9vcmJlbGwgX19hdHRyaWJ1dGVfXyAoKCBhbGlnbmVkICg0KSApKTsKK307CisKKy8qKiBOdW1iZXIgb2Ygc3BlY2lhbCBxdWV1ZSBwYWlycyAqLworI2RlZmluZSBIRVJNT05fTlVNX1NQRUNJQUxfUVBTIDgKKworLyoqIE51bWJlciBvZiBxdWV1ZSBwYWlycyByZXNlcnZlZCBmb3IgdGhlICJzcGVjaWFsIFFQIiBibG9jaworICoKKyAqIFRoZSBzcGVjaWFsIFFQcyBtdXN0IGJlIHdpdGhpbiBhIGNvbnRpZ3VvdXMgYmxvY2sgYWxpZ25lZCBvbiBpdHMKKyAqIG93biBzaXplLgorICovCisjZGVmaW5lIEhFUk1PTl9SU1ZEX1NQRUNJQUxfUVBTCSggKCBIRVJNT05fTlVNX1NQRUNJQUxfUVBTIDw8IDEgKSAtIDEgKQorCisvKiogTWF4aW11bSBudW1iZXIgb2YgYWxsb2NhdGFibGUgcXVldWUgcGFpcnMKKyAqCisgKiBUaGlzIGlzIGEgcG9saWN5IGRlY2lzaW9uLCBub3QgYSBkZXZpY2UgbGltaXQuCisgKi8KKyNkZWZpbmUgSEVSTU9OX01BWF9RUFMJCTgKKworLyoqIFF1ZXVlIHBhaXIgbnVtYmVyIHJhbmRvbWlzYXRpb24gbWFzayAqLworI2RlZmluZSBIRVJNT05fUVBOX1JBTkRPTV9NQVNLIDB4ZmZmMDAwCisKKy8qKiBIZXJtb24gcXVldWUgcGFpciBzdGF0ZSAqLworZW51bSBoZXJtb25fcXVldWVfcGFpcl9zdGF0ZSB7CisJSEVSTU9OX1FQX1NUX1JTVCA9IDAsCisJSEVSTU9OX1FQX1NUX0lOSVQsCisJSEVSTU9OX1FQX1NUX1JUUiwKKwlIRVJNT05fUVBfU1RfUlRTLAorfTsKKworLyoqIEEgSGVybW9uIHF1ZXVlIHBhaXIgKi8KK3N0cnVjdCBoZXJtb25fcXVldWVfcGFpciB7CisJLyoqIFdvcmsgcXVldWUgYnVmZmVyICovCisJdm9pZCAqd3FlOworCS8qKiBTaXplIG9mIHdvcmsgcXVldWUgYnVmZmVyICovCisJc2l6ZV90IHdxZV9zaXplOworCS8qKiBNVFQgZGVzY3JpcHRvciAqLworCXN0cnVjdCBoZXJtb25fbXR0IG10dDsKKwkvKiogU2VuZCB3b3JrIHF1ZXVlICovCisJc3RydWN0IGhlcm1vbl9zZW5kX3dvcmtfcXVldWUgc2VuZDsKKwkvKiogUmVjZWl2ZSB3b3JrIHF1ZXVlICovCisJc3RydWN0IGhlcm1vbl9yZWN2X3dvcmtfcXVldWUgcmVjdjsKKwkvKiogUXVldWUgc3RhdGUgKi8KKwllbnVtIGhlcm1vbl9xdWV1ZV9wYWlyX3N0YXRlIHN0YXRlOworfTsKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIGFsbG9jYXRhYmxlIGNvbXBsZXRpb24gcXVldWVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbiwgbm90IGEgZGV2aWNlIGxpbWl0LgorICovCisjZGVmaW5lIEhFUk1PTl9NQVhfQ1FTCQk4CisKKy8qKiBBIEhlcm1vbiBjb21wbGV0aW9uIHF1ZXVlICovCitzdHJ1Y3QgaGVybW9uX2NvbXBsZXRpb25fcXVldWUgeworCS8qKiBDb21wbGV0aW9uIHF1ZXVlIGVudHJpZXMgKi8KKwl1bmlvbiBoZXJtb25wcm1fY29tcGxldGlvbl9lbnRyeSAqY3FlOworCS8qKiBTaXplIG9mIGNvbXBsZXRpb24gcXVldWUgKi8KKwlzaXplX3QgY3FlX3NpemU7CisJLyoqIE1UVCBkZXNjcmlwdG9yICovCisJc3RydWN0IGhlcm1vbl9tdHQgbXR0OworCS8qKiBEb29yYmVsbCAqLworCXN0cnVjdCBoZXJtb25wcm1fY3FfZGJfcmVjb3JkIGRvb3JiZWxsIF9fYXR0cmlidXRlX18gKCggYWxpZ25lZCAoOCkgKSk7Cit9OworCisvKiogTWF4aW11bSBudW1iZXIgb2YgYWxsb2NhdGFibGUgZXZlbnQgcXVldWVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbiwgbm90IGEgZGV2aWNlIGxpbWl0LgorICovCisjZGVmaW5lIEhFUk1PTl9NQVhfRVFTCQk4CisKKy8qKiBBIEhlcm1vbiBldmVudCBxdWV1ZSAqLworc3RydWN0IGhlcm1vbl9ldmVudF9xdWV1ZSB7CisJLyoqIEV2ZW50IHF1ZXVlIGVudHJpZXMgKi8KKwl1bmlvbiBoZXJtb25wcm1fZXZlbnRfZW50cnkgKmVxZTsKKwkvKiogU2l6ZSBvZiBldmVudCBxdWV1ZSAqLworCXNpemVfdCBlcWVfc2l6ZTsKKwkvKiogTVRUIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3QgaGVybW9uX210dCBtdHQ7CisJLyoqIEV2ZW50IHF1ZXVlIG51bWJlciAqLworCXVuc2lnbmVkIGxvbmcgZXFuOworCS8qKiBOZXh0IGV2ZW50IHF1ZXVlIGVudHJ5IGluZGV4ICovCisJdW5zaWduZWQgbG9uZyBuZXh0X2lkeDsKKwkvKiogRG9vcmJlbGwgcmVnaXN0ZXIgKi8KKwl2b2lkICpkb29yYmVsbDsKK307CisKKy8qKiBOdW1iZXIgb2YgZXZlbnQgcXVldWUgZW50cmllcworICoKKyAqIFRoaXMgaXMgYSBwb2xpY3kgZGVjaXNpb24uCisgKi8KKyNkZWZpbmUgSEVSTU9OX05VTV9FUUVTCQk0CisKKy8qKiBBIEhlcm1vbiByZXNvdXJjZSBiaXRtYXNrICovCit0eXBlZGVmIHVpbnQzMl90IGhlcm1vbl9iaXRtYXNrX3Q7CisKKy8qKiBTaXplIG9mIGEgaGVybW9uIHJlc291cmNlIGJpdG1hc2sgKi8KKyNkZWZpbmUgSEVSTU9OX0JJVE1BU0tfU0laRShtYXhfZW50cmllcykJCQkJICAgICBcCisJKCAoIChtYXhfZW50cmllcykgKyAoIDggKiBzaXplb2YgKCBoZXJtb25fYml0bWFza190ICkgKSAtIDEgKSAvCSAgICAgXAorCSAgKCA4ICogc2l6ZW9mICggaGVybW9uX2JpdG1hc2tfdCApICkgKQorCisvKiogQSBIZXJtb24gZGV2aWNlICovCitzdHJ1Y3QgaGVybW9uIHsKKwkvKiogUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJdm9pZCAqY29uZmlnOworCS8qKiBQQ0kgdXNlciBBY2Nlc3MgUmVnaW9uICovCisJdm9pZCAqdWFyOworCisJLyoqIENvbW1hbmQgdG9nZ2xlICovCisJdW5zaWduZWQgaW50IHRvZ2dsZTsKKwkvKiogQ29tbWFuZCBpbnB1dCBtYWlsYm94ICovCisJdm9pZCAqbWFpbGJveF9pbjsKKwkvKiogQ29tbWFuZCBvdXRwdXQgbWFpbGJveCAqLworCXZvaWQgKm1haWxib3hfb3V0OworCisJLyoqIEZpcm13YXJlIGFyZWEgaW4gZXh0ZXJuYWwgbWVtb3J5ICovCisJdXNlcnB0cl90IGZpcm13YXJlX2FyZWE7CisJLyoqIElDTSBtYXAgKi8KKwlzdHJ1Y3QgaGVybW9uX2ljbV9tYXAgaWNtX21hcFtIRVJNT05fSUNNX05VTV9SRUdJT05TXTsKKwkvKiogSUNNIGFyZWEgKi8KKwl1c2VycHRyX3QgaWNtOworCisJLyoqIEV2ZW50IHF1ZXVlICovCisJc3RydWN0IGhlcm1vbl9ldmVudF9xdWV1ZSBlcTsKKwkvKiogVW5yZXN0cmljdGVkIExLZXkKKwkgKgorCSAqIFVzZWQgdG8gZ2V0IHVucmVzdHJpY3RlZCBtZW1vcnkgYWNjZXNzLgorCSAqLworCXVuc2lnbmVkIGxvbmcgbGtleTsKKworCS8qKiBDb21wbGV0aW9uIHF1ZXVlIGluLXVzZSBiaXRtYXNrICovCisJaGVybW9uX2JpdG1hc2tfdCBjcV9pbnVzZVsgSEVSTU9OX0JJVE1BU0tfU0laRSAoIEhFUk1PTl9NQVhfQ1FTICkgXTsKKwkvKiogUXVldWUgcGFpciBpbi11c2UgYml0bWFzayAqLworCWhlcm1vbl9iaXRtYXNrX3QgcXBfaW51c2VbIEhFUk1PTl9CSVRNQVNLX1NJWkUgKCBIRVJNT05fTUFYX1FQUyApIF07CisJLyoqIE1UVCBlbnRyeSBpbi11c2UgYml0bWFzayAqLworCWhlcm1vbl9iaXRtYXNrX3QgbXR0X2ludXNlWyBIRVJNT05fQklUTUFTS19TSVpFICggSEVSTU9OX01BWF9NVFRTICkgXTsKKworCS8qKiBEZXZpY2UgY2FwYWJpbGl0aWVzICovCisJc3RydWN0IGhlcm1vbl9kZXZfY2FwIGNhcDsKKwkvKiogU3BlY2lhbCBRUE4gYmFzZSAqLworCXVuc2lnbmVkIGxvbmcgc3BlY2lhbF9xcG5fYmFzZTsKKwkvKiogUVBOIGJhc2UgKi8KKwl1bnNpZ25lZCBsb25nIHFwbl9iYXNlOworCisJLyoqIEluZmluaWJhbmQgZGV2aWNlcyAqLworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2W0hFUk1PTl9NQVhfUE9SVFNdOworfTsKKworLyoqIEdsb2JhbCBwcm90ZWN0aW9uIGRvbWFpbiAqLworI2RlZmluZSBIRVJNT05fR0xPQkFMX1BECQkweDEyMzQ1NgorCisvKiogTWVtb3J5IGtleSBwcmVmaXggKi8KKyNkZWZpbmUgSEVSTU9OX01LRVlfUFJFRklYCQkweDc3MDAwMDAwVUwKKworLyoKKyAqIEhDQSBjb21tYW5kcworICoKKyAqLworCisjZGVmaW5lIEhFUk1PTl9IQ1JfQkFTRQkJCTB4ODA2ODAKKyNkZWZpbmUgSEVSTU9OX0hDUl9SRUcoeCkJCSggSEVSTU9OX0hDUl9CQVNFICsgNCAqICh4KSApCisjZGVmaW5lIEhFUk1PTl9IQ1JfTUFYX1dBSVRfTVMJCTIwMDAKKyNkZWZpbmUgSEVSTU9OX01CT1hfQUxJR04JCTQwOTYKKyNkZWZpbmUgSEVSTU9OX01CT1hfU0laRQkJNTEyCisKKy8qIEhDQSBjb21tYW5kIGlzIHNwbGl0IGludG8KKyAqCisgKiBiaXRzICAxMTowCU9wY29kZQorICogYml0ICAgICAxMglJbnB1dCB1c2VzIG1haWxib3gKKyAqIGJpdCAgICAgMTMJT3V0cHV0IHVzZXMgbWFpbGJveAorICogYml0cyAyMjoxNAlJbnB1dCBwYXJhbWV0ZXIgbGVuZ3RoIChpbiBkd29yZHMpCisgKiBiaXRzIDMxOjIzCU91dHB1dCBwYXJhbWV0ZXIgbGVuZ3RoIChpbiBkd29yZHMpCisgKgorICogRW5jb2RpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgd2F5IGFsbG93cyB1cyB0byBjdXQgb3V0IHNldmVyYWwKKyAqIHBhcmFtZXRlcnMgdG8gdGhlIGhlcm1vbl9jb21tYW5kKCkgY2FsbC4KKyAqLworI2RlZmluZSBIRVJNT05fSENSX0lOX01CT1gJCTB4MDAwMDEwMDBVTAorI2RlZmluZSBIRVJNT05fSENSX09VVF9NQk9YCQkweDAwMDAyMDAwVUwKKyNkZWZpbmUgSEVSTU9OX0hDUl9PUENPREUoIF9jb21tYW5kICkJKCAoX2NvbW1hbmQpICYgMHhmZmYgKQorI2RlZmluZSBIRVJNT05fSENSX0lOX0xFTiggX2NvbW1hbmQgKQkoICggKF9jb21tYW5kKSA+PiAxMiApICYgMHg3ZmMgKQorI2RlZmluZSBIRVJNT05fSENSX09VVF9MRU4oIF9jb21tYW5kICkJKCAoIChfY29tbWFuZCkgPj4gMjEgKSAmIDB4N2ZjICkKKworLyoqIEJ1aWxkIEhDUiBjb21tYW5kIGZyb20gY29tcG9uZW50IHBhcnRzICovCisjZGVmaW5lIEhFUk1PTl9IQ1JfSU5PVVRfQ01EKCBfb3Bjb2RlLCBfaW5fbWJveCwgX2luX2xlbiwJCSAgICAgXAorCQkJICAgICBfb3V0X21ib3gsIF9vdXRfbGVuICkJCQkgICAgIFwKKwkoIChfb3Bjb2RlKSB8CQkJCQkJCSAgICAgXAorCSAgKCAoX2luX21ib3gpID8gSEVSTU9OX0hDUl9JTl9NQk9YIDogMCApIHwJCQkgICAgIFwKKwkgICggKCAoX2luX2xlbikgLyA0ICkgPDwgMTQgKSB8CQkJCQkgICAgIFwKKwkgICggKF9vdXRfbWJveCkgPyBIRVJNT05fSENSX09VVF9NQk9YIDogMCApIHwJCQkgICAgIFwKKwkgICggKCAoX291dF9sZW4pIC8gNCApIDw8IDIzICkgKQorCisjZGVmaW5lIEhFUk1PTl9IQ1JfSU5fQ01EKCBfb3Bjb2RlLCBfaW5fbWJveCwgX2luX2xlbiApCQkJICAgICBcCisJSEVSTU9OX0hDUl9JTk9VVF9DTUQgKCBfb3Bjb2RlLCBfaW5fbWJveCwgX2luX2xlbiwgMCwgMCApCisKKyNkZWZpbmUgSEVSTU9OX0hDUl9PVVRfQ01EKCBfb3Bjb2RlLCBfb3V0X21ib3gsIF9vdXRfbGVuICkJCSAgICAgXAorCUhFUk1PTl9IQ1JfSU5PVVRfQ01EICggX29wY29kZSwgMCwgMCwgX291dF9tYm94LCBfb3V0X2xlbiApCisKKyNkZWZpbmUgSEVSTU9OX0hDUl9WT0lEX0NNRCggX29wY29kZSApCQkJCQkgICAgIFwKKwlIRVJNT05fSENSX0lOT1VUX0NNRCAoIF9vcGNvZGUsIDAsIDAsIDAsIDAgKQorCisjZW5kaWYgLyogX0hFUk1PTl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvbGluZGEuYyBiL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9saW5kYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YTdiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvbGluZGEuYwpAQCAtMCwwICsxLDI0MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvaW5maW5pYmFuZC5oPgorI2luY2x1ZGUgPGdweGUvaTJjLmg+CisjaW5jbHVkZSA8Z3B4ZS9iaXRiYXNoLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSAibGluZGEuaCIKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFFMb2dpYyBMaW5kYSBJbmZpbmliYW5kIEhDQQorICoKKyAqLworCisvKiogQSBMaW5kYSBzZW5kIHdvcmsgcXVldWUgKi8KK3N0cnVjdCBsaW5kYV9zZW5kX3dvcmtfcXVldWUgeworCS8qKiBTZW5kIGJ1ZmZlciB1c2FnZSAqLworCXVpbnQ4X3QgKnNlbmRfYnVmOworCS8qKiBQcm9kdWNlciBpbmRleCAqLworCXVuc2lnbmVkIGludCBwcm9kOworCS8qKiBDb25zdW1lciBpbmRleCAqLworCXVuc2lnbmVkIGludCBjb25zOworfTsKKworLyoqIEEgTGluZGEgcmVjZWl2ZSB3b3JrIHF1ZXVlICovCitzdHJ1Y3QgbGluZGFfcmVjdl93b3JrX3F1ZXVlIHsKKwkvKiogUmVjZWl2ZSBoZWFkZXIgcmluZyAqLworCXZvaWQgKmhlYWRlcjsKKwkvKiogUmVjZWl2ZSBoZWFkZXIgcHJvZHVjZXIgb2Zmc2V0ICh3cml0dGVuIGJ5IGhhcmR3YXJlKSAqLworCXN0cnVjdCBRSUJfNzIyMF9zY2FsYXIgaGVhZGVyX3Byb2Q7CisJLyoqIFJlY2VpdmUgaGVhZGVyIGNvbnN1bWVyIG9mZnNldCAqLworCXVuc2lnbmVkIGludCBoZWFkZXJfY29uczsKKwkvKiogT2Zmc2V0IHdpdGhpbiByZWdpc3RlciBzcGFjZSBvZiB0aGUgZWFnZXIgYXJyYXkgKi8KKwl1bnNpZ25lZCBsb25nIGVhZ2VyX2FycmF5OworCS8qKiBOdW1iZXIgb2YgZW50cmllcyBpbiBlYWdlciBhcnJheSAqLworCXVuc2lnbmVkIGludCBlYWdlcl9lbnRyaWVzOworCS8qKiBFYWdlciBhcnJheSBwcm9kdWNlciBpbmRleCAqLworCXVuc2lnbmVkIGludCBlYWdlcl9wcm9kOworCS8qKiBFYWdlciBhcnJheSBjb25zdW1lciBpbmRleCAqLworCXVuc2lnbmVkIGludCBlYWdlcl9jb25zOworfTsKKworLyoqIEEgTGluZGEgSENBICovCitzdHJ1Y3QgbGluZGEgeworCS8qKiBSZWdpc3RlcnMgKi8KKwl2b2lkICpyZWdzOworCisJLyoqIEluLXVzZSBjb250ZXh0cyAqLworCXVpbnQ4X3QgdXNlZF9jdHhbTElOREFfTlVNX0NPTlRFWFRTXTsKKwkvKiogU2VuZCB3b3JrIHF1ZXVlcyAqLworCXN0cnVjdCBsaW5kYV9zZW5kX3dvcmtfcXVldWUgc2VuZF93cVtMSU5EQV9OVU1fQ09OVEVYVFNdOworCS8qKiBSZWNlaXZlIHdvcmsgcXVldWVzICovCisJc3RydWN0IGxpbmRhX3JlY3Zfd29ya19xdWV1ZSByZWN2X3dxW0xJTkRBX05VTV9DT05URVhUU107CisKKwkvKiogT2Zmc2V0IHdpdGhpbiByZWdpc3RlciBzcGFjZSBvZiB0aGUgZmlyc3Qgc2VuZCBidWZmZXIgKi8KKwl1bnNpZ25lZCBsb25nIHNlbmRfYnVmZmVyX2Jhc2U7CisJLyoqIFNlbmQgYnVmZmVyIGF2YWlsYWJpbGl0eSAocmVwb3J0ZWQgYnkgaGFyZHdhcmUpICovCisJc3RydWN0IFFJQl83MjIwX1NlbmRCdWZBdmFpbCAqc2VuZGJ1ZmF2YWlsOworCS8qKiBTZW5kIGJ1ZmZlciBhdmFpbGFiaWxpdHkgKG1haW50YWluZWQgYnkgc29mdHdhcmUpICovCisJdWludDhfdCBzZW5kX2J1ZltMSU5EQV9NQVhfU0VORF9CVUZTXTsKKwkvKiogU2VuZCBidWZmZXIgYXZhaWxhYmlsaXR5IHByb2R1Y2VyIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQgc2VuZF9idWZfcHJvZDsKKwkvKiogU2VuZCBidWZmZXIgYXZhaWxhYmlsaXR5IGNvbnN1bWVyIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQgc2VuZF9idWZfY29uczsKKwkvKiogTnVtYmVyIG9mIHJlc2VydmVkIHNlbmQgYnVmZmVycyAoYWNyb3NzIGFsbCBRUHMpICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkX3NlbmRfYnVmczsKKworCS8qKiBJMkMgYml0LWJhc2hpbmcgaW50ZXJmYWNlICovCisJc3RydWN0IGkyY19iaXRfYmFzaGVyIGkyYzsKKwkvKiogSTJDIHNlcmlhbCBFRVBST00gKi8KKwlzdHJ1Y3QgaTJjX2RldmljZSBlZXByb207Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTGluZGEgcmVnaXN0ZXIgYWNjZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgY2FyZCByZXF1aXJlcyBhdG9taWMgNjQtYml0IGFjY2Vzc2VzLiAgU3RyYW5nZSB0aGluZ3MgaGFwcGVuCisgKiBpZiB5b3UgdHJ5IHRvIHVzZSAzMi1iaXQgYWNjZXNzZXM7IHNvbWV0aW1lcyB0aGV5IHdvcmssIHNvbWV0aW1lcworICogdGhleSBkb24ndCwgc29tZXRpbWVzIHlvdSBnZXQgcmFuZG9tIGRhdGEuCisgKgorICogVGhlc2UgYWNjZXNzb3JzIHVzZSB0aGUgIm1vdnEiIE1NWCBpbnN0cnVjdGlvbiwgYW5kIHNvIHdvbid0IHdvcmsKKyAqIG9uIHJlYWxseSBvbGQgUGVudGl1bXMgKHdoaWNoIHdvbid0IGhhdmUgUENJZSBhbnl3YXksIHNvIHRoaXMgaXMKKyAqIHNvbWV0aGluZyBvZiBhIG1vb3QgcG9pbnQpLgorICovCisKKy8qKgorICogUmVhZCBMaW5kYSBxd29yZCByZWdpc3RlcgorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEB2IGR3b3JkcwkJUmVnaXN0ZXIgYnVmZmVyIHRvIHJlYWQgaW50bworICogQHYgb2Zmc2V0CQlSZWdpc3RlciBvZmZzZXQKKyAqLworc3RhdGljIHZvaWQgbGluZGFfcmVhZHEgKCBzdHJ1Y3QgbGluZGEgKmxpbmRhLCB1aW50MzJfdCAqZHdvcmRzLAorCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCApIHsKKwl2b2lkICphZGRyID0gKCBsaW5kYS0+cmVncyArIG9mZnNldCApOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92cSAoJTEpLCAlJW1tMFxuXHQiCisJCQkgICAgICAgIm1vdnEgJSVtbTAsICglMClcblx0IgorCQkJICAgICAgIDogOiAiciIgKCBkd29yZHMgKSwgInIiICggYWRkciApIDogIm1lbW9yeSIgKTsKKworCURCR0lPICggIlslMDhseF0gPT4gJTA4eCUwOHhcbiIsCisJCXZpcnRfdG9fcGh5cyAoIGFkZHIgKSwgZHdvcmRzWzFdLCBkd29yZHNbMF0gKTsKK30KKyNkZWZpbmUgbGluZGFfcmVhZHEoIF9saW5kYSwgX3B0ciwgX29mZnNldCApIFwKKwlsaW5kYV9yZWFkcSAoIChfbGluZGEpLCAoX3B0ciktPnUuZHdvcmRzLCAoX29mZnNldCkgKQorI2RlZmluZSBsaW5kYV9yZWFkcV9hcnJheThiKCBfbGluZGEsIF9wdHIsIF9vZmZzZXQsIF9pZHggKSBcCisJbGluZGFfcmVhZHEgKCAoX2xpbmRhKSwgKF9wdHIpLCAoIChfb2Zmc2V0KSArICggKF9pZHgpICogOCApICkgKQorI2RlZmluZSBsaW5kYV9yZWFkcV9hcnJheTY0ayggX2xpbmRhLCBfcHRyLCBfb2Zmc2V0LCBfaWR4ICkgXAorCWxpbmRhX3JlYWRxICggKF9saW5kYSksIChfcHRyKSwgKCAoX29mZnNldCkgKyAoIChfaWR4KSAqIDY1NTM2ICkgKSApCisKKy8qKgorICogV3JpdGUgTGluZGEgcXdvcmQgcmVnaXN0ZXIKKyAqCisgKiBAdiBsaW5kYQkJTGluZGEgZGV2aWNlCisgKiBAdiBkd29yZHMJCVJlZ2lzdGVyIGJ1ZmZlciB0byB3cml0ZQorICogQHYgb2Zmc2V0CQlSZWdpc3RlciBvZmZzZXQKKyAqLworc3RhdGljIHZvaWQgbGluZGFfd3JpdGVxICggc3RydWN0IGxpbmRhICpsaW5kYSwgY29uc3QgdWludDMyX3QgKmR3b3JkcywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ICkgeworCXZvaWQgKmFkZHIgPSAoIGxpbmRhLT5yZWdzICsgb2Zmc2V0ICk7CisKKwlEQkdJTyAoICJbJTA4bHhdIDw9ICUwOHglMDh4XG4iLAorCQl2aXJ0X3RvX3BoeXMgKCBhZGRyICksIGR3b3Jkc1sxXSwgZHdvcmRzWzBdICk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJtb3ZxICglMCksICUlbW0wXG5cdCIKKwkJCSAgICAgICAibW92cSAlJW1tMCwgKCUxKVxuXHQiCisJCQkgICAgICAgOiA6ICJyIiAoIGR3b3JkcyApLCAiciIgKCBhZGRyICkgOiAibWVtb3J5IiApOworfQorI2RlZmluZSBsaW5kYV93cml0ZXEoIF9saW5kYSwgX3B0ciwgX29mZnNldCApIFwKKwlsaW5kYV93cml0ZXEgKCAoX2xpbmRhKSwgKF9wdHIpLT51LmR3b3JkcywgKF9vZmZzZXQpICkKKyNkZWZpbmUgbGluZGFfd3JpdGVxX2FycmF5OGIoIF9saW5kYSwgX3B0ciwgX29mZnNldCwgX2lkeCApIFwKKwlsaW5kYV93cml0ZXEgKCAoX2xpbmRhKSwgKF9wdHIpLCAoIChfb2Zmc2V0KSArICggKF9pZHgpICogOCApICkgKQorI2RlZmluZSBsaW5kYV93cml0ZXFfYXJyYXk2NGsoIF9saW5kYSwgX3B0ciwgX29mZnNldCwgX2lkeCApIFwKKwlsaW5kYV93cml0ZXEgKCAoX2xpbmRhKSwgKF9wdHIpLCAoIChfb2Zmc2V0KSArICggKF9pZHgpICogNjU1MzYgKSApICkKKworLyoqCisgKiBXcml0ZSBMaW5kYSBkd29yZCByZWdpc3RlcgorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEB2IGR3b3JkCQlWYWx1ZSB0byB3cml0ZQorICogQHYgb2Zmc2V0CQlSZWdpc3RlciBvZmZzZXQKKyAqLworc3RhdGljIHZvaWQgbGluZGFfd3JpdGVsICggc3RydWN0IGxpbmRhICpsaW5kYSwgdWludDMyX3QgZHdvcmQsCisJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCApIHsKKwl3cml0ZWwgKCBkd29yZCwgKCBsaW5kYS0+cmVncyArIG9mZnNldCApICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBMaW5rIHN0YXRlIG1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBUZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGxpbmsgc3RhdGUKKyAqCisgKiBAdiBsaW5rX3N0YXRlCUxpbmsgc3RhdGUKKyAqIEByZXQgbGlua190ZXh0CUxpbmsgc3RhdGUgdGV4dAorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGxpbmRhX2xpbmtfc3RhdGVfdGV4dCAoIHVuc2lnbmVkIGludCBsaW5rX3N0YXRlICkgeworCXN3aXRjaCAoIGxpbmtfc3RhdGUgKSB7CisJY2FzZSBMSU5EQV9MSU5LX1NUQVRFX0RPV046CXJldHVybiAiRE9XTiI7CisJY2FzZSBMSU5EQV9MSU5LX1NUQVRFX0lOSVQ6CXJldHVybiAiSU5JVCI7CisJY2FzZSBMSU5EQV9MSU5LX1NUQVRFX0FSTToJcmV0dXJuICJBUk0iOworCWNhc2UgTElOREFfTElOS19TVEFURV9BQ1RJVkU6CXJldHVybiAiQUNUSVZFIjsKKwljYXNlIExJTkRBX0xJTktfU1RBVEVfQUNUX0RFRkVSOnJldHVybiAiQUNUX0RFRkVSIjsKKwlkZWZhdWx0OgkJCXJldHVybiAiVU5LTk9XTiI7CisJfQorfQorCisvKioKKyAqIEhhbmRsZSBsaW5rIHN0YXRlIGNoYW5nZQorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbGluZGFfbGlua19zdGF0ZV9jaGFuZ2VkICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKSB7CisJc3RydWN0IGxpbmRhICpsaW5kYSA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgUUlCXzcyMjBfSUJDU3RhdHVzIGliY3N0YXR1czsKKwlzdHJ1Y3QgUUlCXzcyMjBfRVhUQ3RybCBleHRjdHJsOworCXVuc2lnbmVkIGludCBsaW5rX3N0YXRlOworCXVuc2lnbmVkIGludCBsaW5rX3dpZHRoOworCXVuc2lnbmVkIGludCBsaW5rX3NwZWVkOworCisJLyogUmVhZCBsaW5rIHN0YXRlICovCisJbGluZGFfcmVhZHEgKCBsaW5kYSwgJmliY3N0YXR1cywgUUlCXzcyMjBfSUJDU3RhdHVzX29mZnNldCApOworCWxpbmtfc3RhdGUgPSBCSVRfR0VUICggJmliY3N0YXR1cywgTGlua1N0YXRlICk7CisJbGlua193aWR0aCA9IEJJVF9HRVQgKCAmaWJjc3RhdHVzLCBMaW5rV2lkdGhBY3RpdmUgKTsKKwlsaW5rX3NwZWVkID0gQklUX0dFVCAoICZpYmNzdGF0dXMsIExpbmtTcGVlZEFjdGl2ZSApOworCURCR0MgKCBsaW5kYSwgIkxpbmRhICVwIGxpbmsgc3RhdGUgJXMgKCVzICVzKVxuIiwgbGluZGEsCisJICAgICAgIGxpbmRhX2xpbmtfc3RhdGVfdGV4dCAoIGxpbmtfc3RhdGUgKSwKKwkgICAgICAgKCBsaW5rX3NwZWVkID8gIkREUiIgOiAiU0RSIiApLCAoIGxpbmtfd2lkdGggPyAieDQiIDogIngxIiApICk7CisKKwkvKiBTZXQgTEVEcyBhY2NvcmRpbmcgdG8gbGluayBzdGF0ZSAqLworCWxpbmRhX3JlYWRxICggbGluZGEsICZleHRjdHJsLCBRSUJfNzIyMF9FWFRDdHJsX29mZnNldCApOworCUJJVF9TRVQgKCAmZXh0Y3RybCwgTEVEUHJpUG9ydEdyZWVuT24sCisJCSAgKCAoIGxpbmtfc3RhdGUgPj0gTElOREFfTElOS19TVEFURV9JTklUICkgPyAxIDogMCApICk7CisJQklUX1NFVCAoICZleHRjdHJsLCBMRURQcmlQb3J0WWVsbG93T24sCisJCSAgKCAoIGxpbmtfc3RhdGUgPj0gTElOREFfTElOS19TVEFURV9BQ1RJVkUgKSA/IDEgOiAwICkgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJmV4dGN0cmwsIFFJQl83MjIwX0VYVEN0cmxfb2Zmc2V0ICk7CisKKwkvKiBOb3RpZnkgSW5maW5pYmFuZCBjb3JlIG9mIGxpbmsgc3RhdGUgY2hhbmdlICovCisJaWJkZXYtPnBvcnRfc3RhdGUgPSAoIGxpbmtfc3RhdGUgKyAxICk7CisJaWJkZXYtPmxpbmtfd2lkdGhfYWN0aXZlID0KKwkJKCBsaW5rX3dpZHRoID8gSUJfTElOS19XSURUSF80WCA6IElCX0xJTktfV0lEVEhfMVggKTsKKwlpYmRldi0+bGlua19zcGVlZF9hY3RpdmUgPQorCQkoIGxpbmtfc3BlZWQgPyBJQl9MSU5LX1NQRUVEX0REUiA6IElCX0xJTktfU1BFRURfU0RSICk7CisJaWJfbGlua19zdGF0ZV9jaGFuZ2VkICggaWJkZXYgKTsKK30KKworLyoqCisgKiBXYWl0IGZvciBsaW5rIHN0YXRlIGNoYW5nZSB0byB0YWtlIGVmZmVjdAorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEB2IG5ld19saW5rX3N0YXRlCUV4cGVjdGVkIGxpbmsgc3RhdGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGxpbmRhX2xpbmtfc3RhdGVfY2hlY2sgKCBzdHJ1Y3QgbGluZGEgKmxpbmRhLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbmV3X2xpbmtfc3RhdGUgKSB7CisJc3RydWN0IFFJQl83MjIwX0lCQ1N0YXR1cyBpYmNzdGF0dXM7CisJdW5zaWduZWQgaW50IGxpbmtfc3RhdGU7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBMSU5EQV9MSU5LX1NUQVRFX01BWF9XQUlUX1VTIDsgaSsrICkgeworCQlsaW5kYV9yZWFkcSAoIGxpbmRhLCAmaWJjc3RhdHVzLCBRSUJfNzIyMF9JQkNTdGF0dXNfb2Zmc2V0ICk7CisJCWxpbmtfc3RhdGUgPSBCSVRfR0VUICggJmliY3N0YXR1cywgTGlua1N0YXRlICk7CisJCWlmICggbGlua19zdGF0ZSA9PSBuZXdfbGlua19zdGF0ZSApCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5ICggMSApOworCX0KKworCURCR0MgKCBsaW5kYSwgIkxpbmRhICVwIHRpbWVkIG91dCB3YWl0aW5nIGZvciBsaW5rIHN0YXRlICVzXG4iLAorCSAgICAgICBsaW5kYSwgbGluZGFfbGlua19zdGF0ZV90ZXh0ICggbGlua19zdGF0ZSApICk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qKgorICogU2V0IHBvcnQgaW5mb3JtYXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG1hZAkJU2V0IHBvcnQgaW5mb3JtYXRpb24gTUFECisgKi8KK3N0YXRpYyBpbnQgbGluZGFfc2V0X3BvcnRfaW5mbyAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1bmlvbiBpYl9tYWQgKm1hZCApIHsKKwlzdHJ1Y3QgbGluZGEgKmxpbmRhID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0cnVjdCBpYl9wb3J0X2luZm8gKnBvcnRfaW5mbyA9ICZtYWQtPnNtcC5zbXBfZGF0YS5wb3J0X2luZm87CisJc3RydWN0IFFJQl83MjIwX0lCQ0N0cmwgaWJjY3RybDsKKwl1bnNpZ25lZCBpbnQgcG9ydF9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgbGlua19zdGF0ZTsKKworCS8qIFNldCBuZXcgbGluayBzdGF0ZSAqLworCXBvcnRfc3RhdGUgPSAoIHBvcnRfaW5mby0+bGlua19zcGVlZF9zdXBwb3J0ZWRfX3BvcnRfc3RhdGUgJiAweGYgKTsKKwlpZiAoIHBvcnRfc3RhdGUgKSB7CisJCWxpbmtfc3RhdGUgPSAoIHBvcnRfc3RhdGUgLSAxICk7CisJCURCR0MgKCBsaW5kYSwgIkxpbmRhICVwIHNldCBsaW5rIHN0YXRlIHRvICVzICgleClcbiIsIGxpbmRhLAorCQkgICAgICAgbGluZGFfbGlua19zdGF0ZV90ZXh0ICggbGlua19zdGF0ZSApLCBsaW5rX3N0YXRlICk7CisJCWxpbmRhX3JlYWRxICggbGluZGEsICZpYmNjdHJsLCBRSUJfNzIyMF9JQkNDdHJsX29mZnNldCApOworCQlCSVRfU0VUICggJmliY2N0cmwsIExpbmtDbWQsIGxpbmtfc3RhdGUgKTsKKwkJbGluZGFfd3JpdGVxICggbGluZGEsICZpYmNjdHJsLCBRSUJfNzIyMF9JQkNDdHJsX29mZnNldCApOworCisJCS8qIFdhaXQgZm9yIGxpbmsgc3RhdGUgY2hhbmdlIHRvIHRha2UgZWZmZWN0LiAgSWdub3JlCisJCSAqIGVycm9yczsgdGhlIGN1cnJlbnQgbGluayBzdGF0ZSB3aWxsIGJlIHJldHVybmVkIHZpYQorCQkgKiB0aGUgR2V0UmVzcG9uc2UgTUFELgorCQkgKi8KKwkJbGluZGFfbGlua19zdGF0ZV9jaGVjayAoIGxpbmRhLCBsaW5rX3N0YXRlICk7CisJfQorCisJLyogRGV0ZWN0IGFuZCByZXBvcnQgbGluayBzdGF0ZSBjaGFuZ2UgKi8KKwlsaW5kYV9saW5rX3N0YXRlX2NoYW5nZWQgKCBpYmRldiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2V0IHBhcnRpdGlvbiBrZXkgdGFibGUKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG1hZAkJU2V0IHBhcnRpdGlvbiBrZXkgdGFibGUgTUFECisgKi8KK3N0YXRpYyBpbnQgbGluZGFfc2V0X3BrZXlfdGFibGUgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiBfX3VudXNlZCwKKwkJCQkgIHVuaW9uIGliX21hZCAqbWFkIF9fdW51c2VkICkgeworCS8qIE5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbnRleHQgYWxsb2NhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIE1hcCBjb250ZXh0IG51bWJlciB0byBRUE4KKyAqCisgKiBAdiBjdHgJCUNvbnRleHQgaW5kZXgKKyAqIEByZXQgcXBuCQlRdWV1ZSBwYWlyIG51bWJlcgorICovCitzdGF0aWMgaW50IGxpbmRhX2N0eF90b19xcG4gKCB1bnNpZ25lZCBpbnQgY3R4ICkgeworCS8qIFRoaXMgbWFwcGluZyBpcyBmaXhlZCBieSBoYXJkd2FyZSAqLworCXJldHVybiAoIGN0eCAqIDIgKTsKK30KKworLyoqCisgKiBNYXAgUVBOIHRvIGNvbnRleHQgbnVtYmVyCisgKgorICogQHYgcXBuCQlRdWV1ZSBwYWlyIG51bWJlcgorICogQHJldCBjdHgJCUNvbnRleHQgaW5kZXgKKyAqLworc3RhdGljIGludCBsaW5kYV9xcG5fdG9fY3R4ICggdW5zaWduZWQgaW50IHFwbiApIHsKKwkvKiBUaGlzIG1hcHBpbmcgaXMgZml4ZWQgYnkgaGFyZHdhcmUgKi8KKwlyZXR1cm4gKCBxcG4gLyAyICk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBjb250ZXh0CisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHJldCBjdHgJCUNvbnRleHQgaW5kZXgsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfYWxsb2NfY3R4ICggc3RydWN0IGxpbmRhICpsaW5kYSApIHsKKwl1bnNpZ25lZCBpbnQgY3R4OworCisJZm9yICggY3R4ID0gMCA7IGN0eCA8IExJTkRBX05VTV9DT05URVhUUyA7IGN0eCsrICkgeworCisJCWlmICggISBsaW5kYS0+dXNlZF9jdHhbY3R4XSApIHsKKwkJCWxpbmRhLT51c2VkX2N0eFtjdHggXSA9IDE7CisJCQlEQkdDMiAoIGxpbmRhLCAiTGluZGEgJXAgQ1RYICVkIGFsbG9jYXRlZFxuIiwKKwkJCQlsaW5kYSwgY3R4ICk7CisJCQlyZXR1cm4gY3R4OworCQl9CisJfQorCisJREJHQyAoIGxpbmRhLCAiTGluZGEgJXAgb3V0IG9mIGF2YWlsYWJsZSBjb250ZXh0c1xuIiwgbGluZGEgKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoqCisgKiBGcmVlIGEgY29udGV4dAorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEB2IGN0eAkJQ29udGV4dCBpbmRleAorICovCitzdGF0aWMgdm9pZCBsaW5kYV9mcmVlX2N0eCAoIHN0cnVjdCBsaW5kYSAqbGluZGEsIHVuc2lnbmVkIGludCBjdHggKSB7CisKKwlsaW5kYS0+dXNlZF9jdHhbY3R4XSA9IDA7CisJREJHQzIgKCBsaW5kYSwgIkxpbmRhICVwIENUWCAlZCBmcmVlZFxuIiwgbGluZGEsIGN0eCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2VuZCBkYXRhcGF0aAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiogU2VuZCBidWZmZXIgdG9nZ2xlIGJpdAorICoKKyAqIFdlIGVuY29kZSBzZW5kIGJ1ZmZlcnMgYXMgNyBiaXRzIG9mIHNlbmQgYnVmZmVyIGluZGV4IHBsdXMgYSBzaW5nbGUKKyAqIGJpdCB3aGljaCBzaG91bGQgbWF0Y2ggdGhlICJjaGVjayIgYml0IGluIHRoZSBTZW5kQnVmQXZhaWwgYXJyYXkuCisgKi8KKyNkZWZpbmUgTElOREFfU0VORF9CVUZfVE9HR0xFIDB4ODAKKworLyoqCisgKiBBbGxvY2F0ZSBhIHNlbmQgYnVmZmVyCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHJldCBzZW5kX2J1ZglTZW5kIGJ1ZmZlcgorICoKKyAqIFlvdSBtdXN0IGd1YXJhbnRlZSB0aGF0IGEgc2VuZCBidWZmZXIgaXMgYXZhaWxhYmxlLiAgVGhpcyBpcyBkb25lCisgKiBieSByZWZ1c2luZyB0byBhbGxvY2F0ZSBtb3JlIFRYIFdRRXMgaW4gdG90YWwgdGhhbiB0aGUgbnVtYmVyIG9mCisgKiBhdmFpbGFibGUgc2VuZCBidWZmZXJzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxpbmRhX2FsbG9jX3NlbmRfYnVmICggc3RydWN0IGxpbmRhICpsaW5kYSApIHsKKwl1bnNpZ25lZCBpbnQgc2VuZF9idWY7CisKKwlzZW5kX2J1ZiA9IGxpbmRhLT5zZW5kX2J1ZltsaW5kYS0+c2VuZF9idWZfY29uc107CisJc2VuZF9idWYgXj0gTElOREFfU0VORF9CVUZfVE9HR0xFOworCWxpbmRhLT5zZW5kX2J1Zl9jb25zID0gKCAoIGxpbmRhLT5zZW5kX2J1Zl9jb25zICsgMSApICUKKwkJCQkgTElOREFfTUFYX1NFTkRfQlVGUyApOworCXJldHVybiBzZW5kX2J1ZjsKK30KKworLyoqCisgKiBGcmVlIGEgc2VuZCBidWZmZXIKKyAqCisgKiBAdiBsaW5kYQkJTGluZGEgZGV2aWNlCisgKiBAdiBzZW5kX2J1ZgkJU2VuZCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgbGluZGFfZnJlZV9zZW5kX2J1ZiAoIHN0cnVjdCBsaW5kYSAqbGluZGEsCisJCQkJICB1bnNpZ25lZCBpbnQgc2VuZF9idWYgKSB7CisJbGluZGEtPnNlbmRfYnVmW2xpbmRhLT5zZW5kX2J1Zl9wcm9kXSA9IHNlbmRfYnVmOworCWxpbmRhLT5zZW5kX2J1Zl9wcm9kID0gKCAoIGxpbmRhLT5zZW5kX2J1Zl9wcm9kICsgMSApICUKKwkJCQkgTElOREFfTUFYX1NFTkRfQlVGUyApOworfQorCisvKioKKyAqIENoZWNrIHRvIHNlZSBpZiBzZW5kIGJ1ZmZlciBpcyBpbiB1c2UKKyAqCisgKiBAdiBsaW5kYQkJTGluZGEgZGV2aWNlCisgKiBAdiBzZW5kX2J1ZgkJU2VuZCBidWZmZXIKKyAqIEByZXQgaW5fdXNlCQlTZW5kIGJ1ZmZlciBpcyBpbiB1c2UKKyAqLworc3RhdGljIGludCBsaW5kYV9zZW5kX2J1Zl9pbl91c2UgKCBzdHJ1Y3QgbGluZGEgKmxpbmRhLAorCQkJCSAgIHVuc2lnbmVkIGludCBzZW5kX2J1ZiApIHsKKwl1bnNpZ25lZCBpbnQgc2VuZF9pZHg7CisJdW5zaWduZWQgaW50IHNlbmRfY2hlY2s7CisJdW5zaWduZWQgaW50IGludXNlY2hlY2s7CisJdW5zaWduZWQgaW50IGludXNlOworCXVuc2lnbmVkIGludCBjaGVjazsKKworCXNlbmRfaWR4ID0gKCBzZW5kX2J1ZiAmIH5MSU5EQV9TRU5EX0JVRl9UT0dHTEUgKTsKKwlzZW5kX2NoZWNrID0gKCAhISAoIHNlbmRfYnVmICYgTElOREFfU0VORF9CVUZfVE9HR0xFICkgKTsKKwlpbnVzZWNoZWNrID0gQklUX0dFVCAoIGxpbmRhLT5zZW5kYnVmYXZhaWwsIEluVXNlQ2hlY2tbc2VuZF9pZHhdICk7CisJaW51c2UgPSAoICEhICggaW51c2VjaGVjayAmIDB4MDIgKSApOworCWNoZWNrID0gKCAhISAoIGludXNlY2hlY2sgJiAweDAxICkgKTsKKwlyZXR1cm4gKCBpbnVzZSB8fCAoIGNoZWNrICE9IHNlbmRfY2hlY2sgKSApOworfQorCisvKioKKyAqIENhbGN1bGF0ZSBzdGFydGluZyBvZmZzZXQgZm9yIHNlbmQgYnVmZmVyCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHYgc2VuZF9idWYJCVNlbmQgYnVmZmVyCisgKiBAcmV0IG9mZnNldAkJU3RhcnRpbmcgb2Zmc2V0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxpbmRhX3NlbmRfYnVmZmVyX29mZnNldCAoIHN0cnVjdCBsaW5kYSAqbGluZGEsCisJCQkJCQl1bnNpZ25lZCBpbnQgc2VuZF9idWYgKSB7CisJcmV0dXJuICggbGluZGEtPnNlbmRfYnVmZmVyX2Jhc2UgKworCQkgKCAoIHNlbmRfYnVmICYgfkxJTkRBX1NFTkRfQlVGX1RPR0dMRSApICoKKwkJICAgTElOREFfU0VORF9CVUZfU0laRSApICk7Cit9CisKKy8qKgorICogQ3JlYXRlIHNlbmQgd29yayBxdWV1ZQorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfY3JlYXRlX3NlbmRfd3EgKCBzdHJ1Y3QgbGluZGEgKmxpbmRhLAorCQkJCSAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBpYl93b3JrX3F1ZXVlICp3cSA9ICZxcC0+c2VuZDsKKwlzdHJ1Y3QgbGluZGFfc2VuZF93b3JrX3F1ZXVlICpsaW5kYV93cSA9IGliX3dxX2dldF9kcnZkYXRhICggd3EgKTsKKwlpbnQgcmM7CisKKwkvKiBSZXNlcnZlIHNlbmQgYnVmZmVycyAqLworCWlmICggKCBsaW5kYS0+cmVzZXJ2ZWRfc2VuZF9idWZzICsgcXAtPnNlbmQubnVtX3dxZXMgKSA+CisJICAgICBMSU5EQV9NQVhfU0VORF9CVUZTICkgeworCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCBvdXQgb2Ygc2VuZCBidWZmZXJzIChoYXZlICVkLCB1c2VkICIKKwkJICAgICAgICIlZCwgbmVlZCAlZClcbiIsIGxpbmRhLCBMSU5EQV9NQVhfU0VORF9CVUZTLAorCQkgICAgICAgbGluZGEtPnJlc2VydmVkX3NlbmRfYnVmcywgcXAtPnNlbmQubnVtX3dxZXMgKTsKKwkJcmMgPSAtRU5PQlVGUzsKKwkJZ290byBlcnJfcmVzZXJ2ZV9idWZzOworCX0KKwlsaW5kYS0+cmVzZXJ2ZWRfc2VuZF9idWZzICs9IHFwLT5zZW5kLm51bV93cWVzOworCisJLyogUmVzZXQgd29yayBxdWV1ZSAqLworCWxpbmRhX3dxLT5wcm9kID0gMDsKKwlsaW5kYV93cS0+Y29ucyA9IDA7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igc2VuZCBidWZmZXIgdWFzZ2UgbGlzdCAqLworCWxpbmRhX3dxLT5zZW5kX2J1ZiA9IHphbGxvYyAoIHFwLT5zZW5kLm51bV93cWVzICoKKwkJCQkgICAgICBzaXplb2YgKCBsaW5kYV93cS0+c2VuZF9idWZbMF0gKSApOworCWlmICggISBsaW5kYV93cS0+c2VuZF9idWYgKSB7CisJCXJjID0gLUVOT0JVRlM7CisJCWdvdG8gZXJyX2FsbG9jX3NlbmRfYnVmOworCX0KKworCXJldHVybiAwOworCisJZnJlZSAoIGxpbmRhX3dxLT5zZW5kX2J1ZiApOworIGVycl9hbGxvY19zZW5kX2J1ZjoKKwlsaW5kYS0+cmVzZXJ2ZWRfc2VuZF9idWZzIC09IHFwLT5zZW5kLm51bV93cWVzOworIGVycl9yZXNlcnZlX2J1ZnM6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIERlc3Ryb3kgc2VuZCB3b3JrIHF1ZXVlCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqLworc3RhdGljIHZvaWQgbGluZGFfZGVzdHJveV9zZW5kX3dxICggc3RydWN0IGxpbmRhICpsaW5kYSwKKwkJCQkgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBpYl93b3JrX3F1ZXVlICp3cSA9ICZxcC0+c2VuZDsKKwlzdHJ1Y3QgbGluZGFfc2VuZF93b3JrX3F1ZXVlICpsaW5kYV93cSA9IGliX3dxX2dldF9kcnZkYXRhICggd3EgKTsKKworCWZyZWUgKCBsaW5kYV93cS0+c2VuZF9idWYgKTsKKwlsaW5kYS0+cmVzZXJ2ZWRfc2VuZF9idWZzIC09IHFwLT5zZW5kLm51bV93cWVzOworfQorCisvKioKKyAqIEluaXRpYWxpc2Ugc2VuZCBkYXRhcGF0aAorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGxpbmRhX2luaXRfc2VuZCAoIHN0cnVjdCBsaW5kYSAqbGluZGEgKSB7CisJc3RydWN0IFFJQl83MjIwX1NlbmRCdWZCYXNlIHNlbmRidWZiYXNlOworCXN0cnVjdCBRSUJfNzIyMF9TZW5kQnVmQXZhaWxBZGRyIHNlbmRidWZhdmFpbGFkZHI7CisJc3RydWN0IFFJQl83MjIwX1NlbmRDdHJsIHNlbmRjdHJsOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCS8qIFJldHJpZXZlIFNlbmRCdWZCYXNlICovCisJbGluZGFfcmVhZHEgKCBsaW5kYSwgJnNlbmRidWZiYXNlLCBRSUJfNzIyMF9TZW5kQnVmQmFzZV9vZmZzZXQgKTsKKwlsaW5kYS0+c2VuZF9idWZmZXJfYmFzZSA9IEJJVF9HRVQgKCAmc2VuZGJ1ZmJhc2UsCisJCQkJCSAgICBCYXNlQWRkcl9TbWFsbFBJTyApOworCURCR0MgKCBsaW5kYSwgIkxpbmRhICVwIHNlbmQgYnVmZmVycyBhdCAlbHhcbiIsCisJICAgICAgIGxpbmRhLCBsaW5kYS0+c2VuZF9idWZmZXJfYmFzZSApOworCisJLyogSW5pdGlhbGlzZSB0aGUgc2VuZF9idWZbXSBhcnJheSAqLworCWZvciAoIGkgPSAwIDsgaSA8IExJTkRBX01BWF9TRU5EX0JVRlMgOyBpKysgKQorCQlsaW5kYS0+c2VuZF9idWZbaV0gPSBpOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBTZW5kQnVmQXZhaWwgYXJyYXkgKi8KKwlsaW5kYS0+c2VuZGJ1ZmF2YWlsID0gbWFsbG9jX2RtYSAoIHNpemVvZiAoICpsaW5kYS0+c2VuZGJ1ZmF2YWlsICksCisJCQkJCSAgIExJTkRBX1NFTkRCVUZBVkFJTF9BTElHTiApOworCWlmICggISBsaW5kYS0+c2VuZGJ1ZmF2YWlsICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX3NlbmRidWZhdmFpbDsKKwl9CisJbWVtc2V0ICggbGluZGEtPnNlbmRidWZhdmFpbCwgMCwgc2l6ZW9mICggbGluZGEtPnNlbmRidWZhdmFpbCApICk7CisKKwkvKiBQcm9ncmFtIFNlbmRCdWZBdmFpbEFkZHIgaW50byB0aGUgaGFyZHdhcmUgKi8KKwltZW1zZXQgKCAmc2VuZGJ1ZmF2YWlsYWRkciwgMCwgc2l6ZW9mICggc2VuZGJ1ZmF2YWlsYWRkciApICk7CisJQklUX0ZJTExfMSAoICZzZW5kYnVmYXZhaWxhZGRyLCBTZW5kQnVmQXZhaWxBZGRyLAorCQkgICAgICggdmlydF90b19idXMgKCBsaW5kYS0+c2VuZGJ1ZmF2YWlsICkgPj4gNiApICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZzZW5kYnVmYXZhaWxhZGRyLAorCQkgICAgICAgUUlCXzcyMjBfU2VuZEJ1ZkF2YWlsQWRkcl9vZmZzZXQgKTsKKworCS8qIEVuYWJsZSBzZW5kaW5nIGFuZCBETUEgb2YgU2VuZEJ1ZkF2YWlsICovCisJbWVtc2V0ICggJnNlbmRjdHJsLCAwLCBzaXplb2YgKCBzZW5kY3RybCApICk7CisJQklUX0ZJTExfMiAoICZzZW5kY3RybCwKKwkJICAgICBTZW5kQnVmQXZhaWxVcGQsIDEsCisJCSAgICAgU1Bpb0VuYWJsZSwgMSApOworCWxpbmRhX3dyaXRlcSAoIGxpbmRhLCAmc2VuZGN0cmwsIFFJQl83MjIwX1NlbmRDdHJsX29mZnNldCApOworCisJcmV0dXJuIDA7CisKKwlmcmVlX2RtYSAoIGxpbmRhLT5zZW5kYnVmYXZhaWwsIHNpemVvZiAoICpsaW5kYS0+c2VuZGJ1ZmF2YWlsICkgKTsKKyBlcnJfYWxsb2Nfc2VuZGJ1ZmF2YWlsOgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBTaHV0IGRvd24gc2VuZCBkYXRhcGF0aAorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbGluZGFfZmluaV9zZW5kICggc3RydWN0IGxpbmRhICpsaW5kYSApIHsKKwlzdHJ1Y3QgUUlCXzcyMjBfU2VuZEN0cmwgc2VuZGN0cmw7CisKKwkvKiBEaXNhYmxlIHNlbmRpbmcgYW5kIERNQSBvZiBTZW5kQnVmQXZhaWwgKi8KKwltZW1zZXQgKCAmc2VuZGN0cmwsIDAsIHNpemVvZiAoIHNlbmRjdHJsICkgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJnNlbmRjdHJsLCBRSUJfNzIyMF9TZW5kQ3RybF9vZmZzZXQgKTsKKwltYigpOworCisJLyogRW5zdXJlIGhhcmR3YXJlIGhhcyBzZWVuIHRoaXMgZGlzYWJsZSAqLworCWxpbmRhX3JlYWRxICggbGluZGEsICZzZW5kY3RybCwgUUlCXzcyMjBfU2VuZEN0cmxfb2Zmc2V0ICk7CisKKwlmcmVlX2RtYSAoIGxpbmRhLT5zZW5kYnVmYXZhaWwsIHNpemVvZiAoICpsaW5kYS0+c2VuZGJ1ZmF2YWlsICkgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlY2VpdmUgZGF0YXBhdGgKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBDcmVhdGUgcmVjZWl2ZSB3b3JrIHF1ZXVlCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGxpbmRhX2NyZWF0ZV9yZWN2X3dxICggc3RydWN0IGxpbmRhICpsaW5kYSwKKwkJCQkgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCApIHsKKwlzdHJ1Y3QgaWJfd29ya19xdWV1ZSAqd3EgPSAmcXAtPnJlY3Y7CisJc3RydWN0IGxpbmRhX3JlY3Zfd29ya19xdWV1ZSAqbGluZGFfd3EgPSBpYl93cV9nZXRfZHJ2ZGF0YSAoIHdxICk7CisJc3RydWN0IFFJQl83MjIwX1JjdkhkckFkZHIwIHJjdmhkcmFkZHI7CisJc3RydWN0IFFJQl83MjIwX1JjdkhkclRhaWxBZGRyMCByY3ZoZHJ0YWlsYWRkcjsKKwlzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDAgcmN2aGRyaGVhZDsKKwlzdHJ1Y3QgUUlCXzcyMjBfc2NhbGFyIHJjdmVncmluZGV4aGVhZDsKKwlzdHJ1Y3QgUUlCXzcyMjBfUmN2Q3RybCByY3ZjdHJsOworCXVuc2lnbmVkIGludCBjdHggPSBsaW5kYV9xcG5fdG9fY3R4ICggcXAtPnFwbiApOworCWludCByYzsKKworCS8qIFJlc2V0IGNvbnRleHQgaW5mb3JtYXRpb24gKi8KKwltZW1zZXQgKCAmbGluZGFfd3EtPmhlYWRlcl9wcm9kLCAwLAorCQkgc2l6ZW9mICggbGluZGFfd3EtPmhlYWRlcl9wcm9kICkgKTsKKwlsaW5kYV93cS0+aGVhZGVyX2NvbnMgPSAwOworCWxpbmRhX3dxLT5lYWdlcl9wcm9kID0gMDsKKwlsaW5kYV93cS0+ZWFnZXJfY29ucyA9IDA7CisKKwkvKiBBbGxvY2F0ZSByZWNlaXZlIGhlYWRlciBidWZmZXIgKi8KKwlsaW5kYV93cS0+aGVhZGVyID0gbWFsbG9jX2RtYSAoIExJTkRBX1JFQ1ZfSEVBREVSU19TSVpFLAorCQkJCQlMSU5EQV9SRUNWX0hFQURFUlNfQUxJR04gKTsKKwlpZiAoICEgbGluZGFfd3EtPmhlYWRlciApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19oZWFkZXI7CisJfQorCisJLyogRW5hYmxlIGNvbnRleHQgaW4gaGFyZHdhcmUgKi8KKwltZW1zZXQgKCAmcmN2aGRyYWRkciwgMCwgc2l6ZW9mICggcmN2aGRyYWRkciApICk7CisJQklUX0ZJTExfMSAoICZyY3ZoZHJhZGRyLCBSY3ZIZHJBZGRyMCwKKwkJICAgICAoIHZpcnRfdG9fYnVzICggbGluZGFfd3EtPmhlYWRlciApID4+IDIgKSApOworCWxpbmRhX3dyaXRlcV9hcnJheThiICggbGluZGEsICZyY3ZoZHJhZGRyLAorCQkJICAgICAgIFFJQl83MjIwX1JjdkhkckFkZHIwX29mZnNldCwgY3R4ICk7CisJbWVtc2V0ICggJnJjdmhkcnRhaWxhZGRyLCAwLCBzaXplb2YgKCByY3ZoZHJ0YWlsYWRkciApICk7CisJQklUX0ZJTExfMSAoICZyY3ZoZHJ0YWlsYWRkciwgUmN2SGRyVGFpbEFkZHIwLAorCQkgICAgICggdmlydF90b19idXMgKCAmbGluZGFfd3EtPmhlYWRlcl9wcm9kICkgPj4gMiApICk7CisJbGluZGFfd3JpdGVxX2FycmF5OGIgKCBsaW5kYSwgJnJjdmhkcnRhaWxhZGRyLAorCQkJICAgICAgIFFJQl83MjIwX1JjdkhkclRhaWxBZGRyMF9vZmZzZXQsIGN0eCApOworCW1lbXNldCAoICZyY3ZoZHJoZWFkLCAwLCBzaXplb2YgKCByY3ZoZHJoZWFkICkgKTsKKwlCSVRfRklMTF8xICggJnJjdmhkcmhlYWQsIGNvdW50ZXIsIDEgKTsKKwlsaW5kYV93cml0ZXFfYXJyYXk2NGsgKCBsaW5kYSwgJnJjdmhkcmhlYWQsCisJCQkJUUlCXzcyMjBfUmN2SGRySGVhZDBfb2Zmc2V0LCBjdHggKTsKKwltZW1zZXQgKCAmcmN2ZWdyaW5kZXhoZWFkLCAwLCBzaXplb2YgKCByY3ZlZ3JpbmRleGhlYWQgKSApOworCUJJVF9GSUxMXzEgKCAmcmN2ZWdyaW5kZXhoZWFkLCBWYWx1ZSwgMSApOworCWxpbmRhX3dyaXRlcV9hcnJheTY0ayAoIGxpbmRhLCAmcmN2ZWdyaW5kZXhoZWFkLAorCQkJCVFJQl83MjIwX1JjdkVnckluZGV4SGVhZDBfb2Zmc2V0LCBjdHggKTsKKwlsaW5kYV9yZWFkcSAoIGxpbmRhLCAmcmN2Y3RybCwgUUlCXzcyMjBfUmN2Q3RybF9vZmZzZXQgKTsKKwlCSVRfU0VUICggJnJjdmN0cmwsIFBvcnRFbmFibGVbY3R4XSwgMSApOworCUJJVF9TRVQgKCAmcmN2Y3RybCwgSW50ckF2YWlsW2N0eF0sIDEgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJnJjdmN0cmwsIFFJQl83MjIwX1JjdkN0cmxfb2Zmc2V0ICk7CisKKwlEQkdDICggbGluZGEsICJMaW5kYSAlcCBRUE4gJWxkIENUWCAlZCBoZHJzIFslbHgsJWx4KSBwcm9kICVseFxuIiwKKwkgICAgICAgbGluZGEsIHFwLT5xcG4sIGN0eCwgdmlydF90b19idXMgKCBsaW5kYV93cS0+aGVhZGVyICksCisJICAgICAgICggdmlydF90b19idXMgKCBsaW5kYV93cS0+aGVhZGVyICkgKyBMSU5EQV9SRUNWX0hFQURFUlNfU0laRSApLAorCSAgICAgICB2aXJ0X3RvX2J1cyAoICZsaW5kYV93cS0+aGVhZGVyX3Byb2QgKSApOworCXJldHVybiAwOworCisJZnJlZV9kbWEgKCBsaW5kYV93cS0+aGVhZGVyLCBMSU5EQV9SRUNWX0hFQURFUlNfU0laRSApOworIGVycl9hbGxvY19oZWFkZXI6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIERlc3Ryb3kgcmVjZWl2ZSB3b3JrIHF1ZXVlCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqLworc3RhdGljIHZvaWQgbGluZGFfZGVzdHJveV9yZWN2X3dxICggc3RydWN0IGxpbmRhICpsaW5kYSwKKwkJCQkgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBpYl93b3JrX3F1ZXVlICp3cSA9ICZxcC0+cmVjdjsKKwlzdHJ1Y3QgbGluZGFfcmVjdl93b3JrX3F1ZXVlICpsaW5kYV93cSA9IGliX3dxX2dldF9kcnZkYXRhICggd3EgKTsKKwlzdHJ1Y3QgUUlCXzcyMjBfUmN2Q3RybCByY3ZjdHJsOworCXVuc2lnbmVkIGludCBjdHggPSBsaW5kYV9xcG5fdG9fY3R4ICggcXAtPnFwbiApOworCisJLyogRGlzYWJsZSBjb250ZXh0IGluIGhhcmR3YXJlICovCisJbGluZGFfcmVhZHEgKCBsaW5kYSwgJnJjdmN0cmwsIFFJQl83MjIwX1JjdkN0cmxfb2Zmc2V0ICk7CisJQklUX1NFVCAoICZyY3ZjdHJsLCBQb3J0RW5hYmxlW2N0eF0sIDAgKTsKKwlCSVRfU0VUICggJnJjdmN0cmwsIEludHJBdmFpbFtjdHhdLCAwICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZyY3ZjdHJsLCBRSUJfNzIyMF9SY3ZDdHJsX29mZnNldCApOworCisJLyogTWFrZSBzdXJlIHRoZSBoYXJkd2FyZSBoYXMgc2VlbiB0aGF0IHRoZSBjb250ZXh0IGlzIGRpc2FibGVkICovCisJbGluZGFfcmVhZHEgKCBsaW5kYSwgJnJjdmN0cmwsIFFJQl83MjIwX1JjdkN0cmxfb2Zmc2V0ICk7CisJbWIoKTsKKworCS8qIEZyZWUgaGVhZGVycyByaW5nICovCisJZnJlZV9kbWEgKCBsaW5kYV93cS0+aGVhZGVyLCBMSU5EQV9SRUNWX0hFQURFUlNfU0laRSApOworCisJLyogRnJlZSBjb250ZXh0ICovCisJbGluZGFfZnJlZV9jdHggKCBsaW5kYSwgY3R4ICk7Cit9CisKKy8qKgorICogSW5pdGlhbGlzZSByZWNlaXZlIGRhdGFwYXRoCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfaW5pdF9yZWN2ICggc3RydWN0IGxpbmRhICpsaW5kYSApIHsKKwlzdHJ1Y3QgUUlCXzcyMjBfUmN2Q3RybCByY3ZjdHJsOworCXN0cnVjdCBRSUJfNzIyMF9zY2FsYXIgcmN2ZWdyYmFzZTsKKwlzdHJ1Y3QgUUlCXzcyMjBfc2NhbGFyIHJjdmhkcmVudHNpemU7CisJc3RydWN0IFFJQl83MjIwX3NjYWxhciByY3ZoZHJjbnQ7CisJc3RydWN0IFFJQl83MjIwX1JjdkJUSFFQIHJjdmJ0aHFwOworCXVuc2lnbmVkIGludCBwb3J0Y2ZnOworCXVuc2lnbmVkIGxvbmcgZWdyYmFzZTsKKwl1bnNpZ25lZCBpbnQgZWFnZXJfYXJyYXlfc2l6ZV8wOworCXVuc2lnbmVkIGludCBlYWdlcl9hcnJheV9zaXplX290aGVyOworCXVuc2lnbmVkIGludCBjdHg7CisKKwkvKiBTZWxlY3QgY29uZmlndXJhdGlvbiBiYXNlZCBvbiBudW1iZXIgb2YgY29udGV4dHMgKi8KKwlzd2l0Y2ggKCBMSU5EQV9OVU1fQ09OVEVYVFMgKSB7CisJY2FzZSA1OgorCQlwb3J0Y2ZnID0gTElOREFfUE9SVENGR181Q1RYOworCQllYWdlcl9hcnJheV9zaXplXzAgPSBMSU5EQV9FQUdFUl9BUlJBWV9TSVpFXzVDVFhfMDsKKwkJZWFnZXJfYXJyYXlfc2l6ZV9vdGhlciA9IExJTkRBX0VBR0VSX0FSUkFZX1NJWkVfNUNUWF9PVEhFUjsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQlwb3J0Y2ZnID0gTElOREFfUE9SVENGR185Q1RYOworCQllYWdlcl9hcnJheV9zaXplXzAgPSBMSU5EQV9FQUdFUl9BUlJBWV9TSVpFXzlDVFhfMDsKKwkJZWFnZXJfYXJyYXlfc2l6ZV9vdGhlciA9IExJTkRBX0VBR0VSX0FSUkFZX1NJWkVfOUNUWF9PVEhFUjsKKwkJYnJlYWs7CisJY2FzZSAxNzoKKwkJcG9ydGNmZyA9IExJTkRBX1BPUlRDRkdfMTdDVFg7CisJCWVhZ2VyX2FycmF5X3NpemVfMCA9IExJTkRBX0VBR0VSX0FSUkFZX1NJWkVfMTdDVFhfMDsKKwkJZWFnZXJfYXJyYXlfc2l6ZV9vdGhlciA9IExJTkRBX0VBR0VSX0FSUkFZX1NJWkVfMTdDVFhfT1RIRVI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbmtlcl9hc3NlcnQgKCAwLCBpbnZhbGlkX0xJTkRBX05VTV9DT05URVhUUyApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb25maWd1cmUgbnVtYmVyIG9mIGNvbnRleHRzICovCisJbWVtc2V0ICggJnJjdmN0cmwsIDAsIHNpemVvZiAoIHJjdmN0cmwgKSApOworCUJJVF9GSUxMXzMgKCAmcmN2Y3RybCwKKwkJICAgICBUYWlsVXBkLCAxLAorCQkgICAgIFBvcnRDZmcsIHBvcnRjZmcsCisJCSAgICAgUmN2UVBNYXBFbmFibGUsIDEgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJnJjdmN0cmwsIFFJQl83MjIwX1JjdkN0cmxfb2Zmc2V0ICk7CisKKwkvKiBDb25maWd1cmUgcmVjZWl2ZSBoZWFkZXIgYnVmZmVyIHNpemVzICovCisJbWVtc2V0ICggJnJjdmhkcmNudCwgMCwgc2l6ZW9mICggcmN2aGRyY250ICkgKTsKKwlCSVRfRklMTF8xICggJnJjdmhkcmNudCwgVmFsdWUsIExJTkRBX1JFQ1ZfSEVBREVSX0NPVU5UICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZyY3ZoZHJjbnQsIFFJQl83MjIwX1JjdkhkckNudF9vZmZzZXQgKTsKKwltZW1zZXQgKCAmcmN2aGRyZW50c2l6ZSwgMCwgc2l6ZW9mICggcmN2aGRyZW50c2l6ZSApICk7CisJQklUX0ZJTExfMSAoICZyY3ZoZHJlbnRzaXplLCBWYWx1ZSwgKCBMSU5EQV9SRUNWX0hFQURFUl9TSVpFID4+IDIgKSApOworCWxpbmRhX3dyaXRlcSAoIGxpbmRhLCAmcmN2aGRyZW50c2l6ZSwgUUlCXzcyMjBfUmN2SGRyRW50U2l6ZV9vZmZzZXQgKTsKKworCS8qIENhbGN1bGF0ZSBlYWdlciBhcnJheSBzdGFydCBhZGRyZXNzZXMgZm9yIGVhY2ggY29udGV4dCAqLworCWxpbmRhX3JlYWRxICggbGluZGEsICZyY3ZlZ3JiYXNlLCBRSUJfNzIyMF9SY3ZFZ3JCYXNlX29mZnNldCApOworCWVncmJhc2UgPSBCSVRfR0VUICggJnJjdmVncmJhc2UsIFZhbHVlICk7CisJbGluZGEtPnJlY3Zfd3FbMF0uZWFnZXJfYXJyYXkgPSBlZ3JiYXNlOworCWxpbmRhLT5yZWN2X3dxWzBdLmVhZ2VyX2VudHJpZXMgPSBlYWdlcl9hcnJheV9zaXplXzA7CisJZWdyYmFzZSArPSAoIGVhZ2VyX2FycmF5X3NpemVfMCAqIHNpemVvZiAoIHN0cnVjdCBRSUJfNzIyMF9SY3ZFZ3IgKSApOworCWZvciAoIGN0eCA9IDEgOyBjdHggPCBMSU5EQV9OVU1fQ09OVEVYVFMgOyBjdHgrKyApIHsKKwkJbGluZGEtPnJlY3Zfd3FbY3R4XS5lYWdlcl9hcnJheSA9IGVncmJhc2U7CisJCWxpbmRhLT5yZWN2X3dxW2N0eF0uZWFnZXJfZW50cmllcyA9IGVhZ2VyX2FycmF5X3NpemVfb3RoZXI7CisJCWVncmJhc2UgKz0gKCBlYWdlcl9hcnJheV9zaXplX290aGVyICoKKwkJCSAgICAgc2l6ZW9mICggc3RydWN0IFFJQl83MjIwX1JjdkVnciApICk7CisJfQorCWZvciAoIGN0eCA9IDAgOyBjdHggPCBMSU5EQV9OVU1fQ09OVEVYVFMgOyBjdHgrKyApIHsKKwkJREJHQyAoIGxpbmRhLCAiTGluZGEgJXAgQ1RYICVkIGVhZ2VyIGFycmF5IGF0ICVseCAoJWQgIgorCQkgICAgICAgImVudHJpZXMpXG4iLCBsaW5kYSwgY3R4LAorCQkgICAgICAgbGluZGEtPnJlY3Zfd3FbY3R4XS5lYWdlcl9hcnJheSwKKwkJICAgICAgIGxpbmRhLT5yZWN2X3dxW2N0eF0uZWFnZXJfZW50cmllcyApOworCX0KKworCS8qIFNldCB0aGUgQlRIIFFQIGZvciBJbmZpbmlwYXRoIHBhY2tldHMgdG8gYW4gdW51c2VkIHZhbHVlICovCisJbWVtc2V0ICggJnJjdmJ0aHFwLCAwLCBzaXplb2YgKCByY3ZidGhxcCApICk7CisJQklUX0ZJTExfMSAoICZyY3ZidGhxcCwgUmN2QlRIUVAsIExJTkRBX1FQX0lERVRIICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZyY3ZidGhxcCwgUUlCXzcyMjBfUmN2QlRIUVBfb2Zmc2V0ICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTaHV0IGRvd24gcmVjZWl2ZSBkYXRhcGF0aAorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbGluZGFfZmluaV9yZWN2ICggc3RydWN0IGxpbmRhICpsaW5kYSBfX3VudXNlZCApIHsKKwkvKiBOb3RoaW5nIHRvIGRvOyBhbGwgY29udGV4dHMgd2VyZSBhbHJlYWR5IGRpc2FibGVkIHdoZW4gdGhlCisJICogcXVldWUgcGFpcnMgd2VyZSBkZXN0cm95ZWQKKwkgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbXBsZXRpb24gcXVldWUgb3BlcmF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIENyZWF0ZSBjb21wbGV0aW9uIHF1ZXVlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBjcQkJQ29tcGxldGlvbiBxdWV1ZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfY3JlYXRlX2NxICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgIHN0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlICpjcSApIHsKKwlzdHJ1Y3QgbGluZGEgKmxpbmRhID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0YXRpYyBpbnQgY3FuOworCisJLyogVGhlIGhhcmR3YXJlIGhhcyBubyBjb25jZXB0IG9mIGNvbXBsZXRpb24gcXVldWVzLiAgV2UKKwkgKiBzaW1wbHkgdXNlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIENRcyBhbmQgV1FzIChhbHJlYWR5CisJICogaGFuZGxlZCBieSB0aGUgSUIgY29yZSkgdG8gZGVjaWRlIHdoaWNoIFdRcyB0byBwb2xsLgorCSAqCisJICogV2UgZG8gc2V0IGEgQ1FOLCBqdXN0IHRvIGF2b2lkIGNvbmZ1c2luZyBkZWJ1ZyBtZXNzYWdlcworCSAqIGZyb20gdGhlIElCIGNvcmUuCisJICovCisJY3EtPmNxbiA9ICsrY3FuOworCURCR0MgKCBsaW5kYSwgIkxpbmRhICVwIENRTiAlbGQgY3JlYXRlZFxuIiwgbGluZGEsIGNxLT5jcW4gKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIERlc3Ryb3kgY29tcGxldGlvbiBxdWV1ZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgY3EJCUNvbXBsZXRpb24gcXVldWUKKyAqLworc3RhdGljIHZvaWQgbGluZGFfZGVzdHJveV9jcSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgIHN0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlICpjcSApIHsKKwlzdHJ1Y3QgbGluZGEgKmxpbmRhID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCisJLyogTm90aGluZyB0byBkbyAqLworCURCR0MgKCBsaW5kYSwgIkxpbmRhICVwIENRTiAlbGQgZGVzdHJveWVkXG4iLCBsaW5kYSwgY3EtPmNxbiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUXVldWUgcGFpciBvcGVyYXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQ3JlYXRlIHF1ZXVlIHBhaXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBsaW5kYV9jcmVhdGVfcXAgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBsaW5kYSAqbGluZGEgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJaW50IGN0eDsKKwlpbnQgcmM7CisKKwkvKiBMb2NhdGUgYW4gYXZhaWxhYmxlIGNvbnRleHQgKi8KKwljdHggPSBsaW5kYV9hbGxvY19jdHggKCBsaW5kYSApOworCWlmICggY3R4IDwgMCApIHsKKwkJcmMgPSBjdHg7CisJCWdvdG8gZXJyX2FsbG9jX2N0eDsKKwl9CisKKwkvKiBTZXQgcXVldWUgcGFpciBudW1iZXIgYmFzZWQgb24gY29udGV4dCBpbmRleCAqLworCXFwLT5xcG4gPSBsaW5kYV9jdHhfdG9fcXBuICggY3R4ICk7CisKKwkvKiBTZXQgd29yay1xdWV1ZSBwcml2YXRlIGRhdGEgcG9pbnRlcnMgKi8KKwlpYl93cV9zZXRfZHJ2ZGF0YSAoICZxcC0+c2VuZCwgJmxpbmRhLT5zZW5kX3dxW2N0eF0gKTsKKwlpYl93cV9zZXRfZHJ2ZGF0YSAoICZxcC0+cmVjdiwgJmxpbmRhLT5yZWN2X3dxW2N0eF0gKTsKKworCS8qIENyZWF0ZSByZWNlaXZlIHdvcmsgcXVldWUgKi8KKwlpZiAoICggcmMgPSBsaW5kYV9jcmVhdGVfcmVjdl93cSAoIGxpbmRhLCBxcCApICkgIT0gMCApCisJCWdvdG8gZXJyX2NyZWF0ZV9yZWN2X3dxOworCisJLyogQ3JlYXRlIHNlbmQgd29yayBxdWV1ZSAqLworCWlmICggKCByYyA9IGxpbmRhX2NyZWF0ZV9zZW5kX3dxICggbGluZGEsIHFwICkgKSAhPSAwICkKKwkJZ290byBlcnJfY3JlYXRlX3NlbmRfd3E7CisKKwlyZXR1cm4gMDsKKworCWxpbmRhX2Rlc3Ryb3lfc2VuZF93cSAoIGxpbmRhLCBxcCApOworIGVycl9jcmVhdGVfc2VuZF93cToKKwlsaW5kYV9kZXN0cm95X3JlY3Zfd3EgKCBsaW5kYSwgcXAgKTsKKyBlcnJfY3JlYXRlX3JlY3Zfd3E6CisJbGluZGFfZnJlZV9jdHggKCBsaW5kYSwgY3R4ICk7CisgZXJyX2FsbG9jX2N0eDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogTW9kaWZ5IHF1ZXVlIHBhaXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBsaW5kYV9tb2RpZnlfcXAgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBsaW5kYSAqbGluZGEgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisKKwkvKiBOb3RoaW5nIHRvIGRvOyB0aGUgaGFyZHdhcmUgZG9lc24ndCBoYXZlIGEgbm90aW9uIG9mIHF1ZXVlCisJICoga2V5cworCSAqLworCURCR0MgKCBsaW5kYSwgIkxpbmRhICVwIFFQTiAlbGQgbW9kaWZpZWRcbiIsIGxpbmRhLCBxcC0+cXBuICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVzdHJveSBxdWV1ZSBwYWlyCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICovCitzdGF0aWMgdm9pZCBsaW5kYV9kZXN0cm95X3FwICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBsaW5kYSAqbGluZGEgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisKKwlsaW5kYV9kZXN0cm95X3NlbmRfd3EgKCBsaW5kYSwgcXAgKTsKKwlsaW5kYV9kZXN0cm95X3JlY3Zfd3EgKCBsaW5kYSwgcXAgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFdvcmsgcmVxdWVzdCBvcGVyYXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogUG9zdCBzZW5kIHdvcmsgcXVldWUgZW50cnkKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBhdgkJQWRkcmVzcyB2ZWN0b3IKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBsaW5kYV9wb3N0X3NlbmQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJICAgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2LAorCQkJICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApIHsKKwlzdHJ1Y3QgbGluZGEgKmxpbmRhID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0cnVjdCBpYl93b3JrX3F1ZXVlICp3cSA9ICZxcC0+c2VuZDsKKwlzdHJ1Y3QgbGluZGFfc2VuZF93b3JrX3F1ZXVlICpsaW5kYV93cSA9IGliX3dxX2dldF9kcnZkYXRhICggd3EgKTsKKwlzdHJ1Y3QgUUlCXzcyMjBfU2VuZFBiYyBzZW5kcGJjOworCXVpbnQ4X3QgaGVhZGVyX2J1ZltJQl9NQVhfSEVBREVSX1NJWkVdOworCXN0cnVjdCBpb19idWZmZXIgaGVhZGVyczsKKwl1bnNpZ25lZCBpbnQgc2VuZF9idWY7CisJdW5zaWduZWQgbG9uZyBzdGFydF9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc2l6ZV90IGxlbjsKKwlzc2l6ZV90IGZyYWdfbGVuOworCXVpbnQzMl90ICpkYXRhOworCisJLyogQWxsb2NhdGUgc2VuZCBidWZmZXIgYW5kIGNhbGN1bGF0ZSBvZmZzZXQgKi8KKwlzZW5kX2J1ZiA9IGxpbmRhX2FsbG9jX3NlbmRfYnVmICggbGluZGEgKTsKKwlzdGFydF9vZmZzZXQgPSBvZmZzZXQgPSBsaW5kYV9zZW5kX2J1ZmZlcl9vZmZzZXQgKCBsaW5kYSwgc2VuZF9idWYgKTsKKworCS8qIFN0b3JlIEkvTyBidWZmZXIgYW5kIHNlbmQgYnVmZmVyIGluZGV4ICovCisJYXNzZXJ0ICggd3EtPmlvYnVmc1tsaW5kYV93cS0+cHJvZF0gPT0gTlVMTCApOworCXdxLT5pb2J1ZnNbbGluZGFfd3EtPnByb2RdID0gaW9idWY7CisJbGluZGFfd3EtPnNlbmRfYnVmW2xpbmRhX3dxLT5wcm9kXSA9IHNlbmRfYnVmOworCisJLyogQ29uc3RydWN0IGhlYWRlcnMgKi8KKwlpb2JfcG9wdWxhdGUgKCAmaGVhZGVycywgaGVhZGVyX2J1ZiwgMCwgc2l6ZW9mICggaGVhZGVyX2J1ZiApICk7CisJaW9iX3Jlc2VydmUgKCAmaGVhZGVycywgc2l6ZW9mICggaGVhZGVyX2J1ZiApICk7CisJaWJfcHVzaCAoIGliZGV2LCAmaGVhZGVycywgcXAsIGlvYl9sZW4gKCBpb2J1ZiApLCBhdiApOworCisJLyogQ2FsY3VsYXRlIHBhY2tldCBsZW5ndGggKi8KKwlsZW4gPSAoICggc2l6ZW9mICggc2VuZHBiYyApICsgaW9iX2xlbiAoICZoZWFkZXJzICkgKworCQkgIGlvYl9sZW4gKCBpb2J1ZiApICsgMyApICYgfjMgKTsKKworCS8qIENvbnN0cnVjdCBzZW5kIHBlci1idWZmZXIgY29udHJvbCB3b3JkICovCisJbWVtc2V0ICggJnNlbmRwYmMsIDAsIHNpemVvZiAoIHNlbmRwYmMgKSApOworCUJJVF9GSUxMXzIgKCAmc2VuZHBiYywKKwkJICAgICBMZW5ndGhQMV90b2liYywgKCAoIGxlbiA+PiAyICkgLSAxICksCisJCSAgICAgVkwxNSwgMSApOworCisJLyogV3JpdGUgU2VuZFBiYyAqLworCURCR19ESVNBQkxFICggREJHTFZMX0lPICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZzZW5kcGJjLCBvZmZzZXQgKTsKKwlvZmZzZXQgKz0gc2l6ZW9mICggc2VuZHBiYyApOworCisJLyogV3JpdGUgaGVhZGVycyAqLworCWZvciAoIGRhdGEgPSBoZWFkZXJzLmRhdGEsIGZyYWdfbGVuID0gaW9iX2xlbiAoICZoZWFkZXJzICkgOworCSAgICAgIGZyYWdfbGVuID4gMCA7IGRhdGErKywgb2Zmc2V0ICs9IDQsIGZyYWdfbGVuIC09IDQgKSB7CisJCWxpbmRhX3dyaXRlbCAoIGxpbmRhLCAqZGF0YSwgb2Zmc2V0ICk7CisJfQorCisJLyogV3JpdGUgZGF0YSAqLworCWZvciAoIGRhdGEgPSBpb2J1Zi0+ZGF0YSwgZnJhZ19sZW4gPSBpb2JfbGVuICggaW9idWYgKSA7CisJICAgICAgZnJhZ19sZW4gPiAwIDsgZGF0YSsrLCBvZmZzZXQgKz0gNCwgZnJhZ19sZW4gLT0gNCApIHsKKwkJbGluZGFfd3JpdGVsICggbGluZGEsICpkYXRhLCBvZmZzZXQgKTsKKwl9CisJREJHX0VOQUJMRSAoIERCR0xWTF9JTyApOworCisJYXNzZXJ0ICggKCBzdGFydF9vZmZzZXQgKyBsZW4gKSA9PSBvZmZzZXQgKTsKKwlEQkdDMiAoIGxpbmRhLCAiTGluZGEgJXAgUVBOICVsZCBUWCAlZCglZCkgcG9zdGVkIFslbHgsJWx4KVxuIiwKKwkJbGluZGEsIHFwLT5xcG4sIHNlbmRfYnVmLCBsaW5kYV93cS0+cHJvZCwKKwkJc3RhcnRfb2Zmc2V0LCBvZmZzZXQgKTsKKworCS8qIEluY3JlbWVudCBwcm9kdWNlciBjb3VudGVyICovCisJbGluZGFfd3EtPnByb2QgPSAoICggbGluZGFfd3EtPnByb2QgKyAxICkgJiAoIHdxLT5udW1fd3FlcyAtIDEgKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29tcGxldGUgc2VuZCB3b3JrIHF1ZXVlIGVudHJ5CisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgd3FlX2lkeAkJV29yayBxdWV1ZSBlbnRyeSBpbmRleAorICovCitzdGF0aWMgdm9pZCBsaW5kYV9jb21wbGV0ZV9zZW5kICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkJICB1bnNpZ25lZCBpbnQgd3FlX2lkeCApIHsKKwlzdHJ1Y3QgbGluZGEgKmxpbmRhID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCXN0cnVjdCBpYl93b3JrX3F1ZXVlICp3cSA9ICZxcC0+c2VuZDsKKwlzdHJ1Y3QgbGluZGFfc2VuZF93b3JrX3F1ZXVlICpsaW5kYV93cSA9IGliX3dxX2dldF9kcnZkYXRhICggd3EgKTsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwl1bnNpZ25lZCBpbnQgc2VuZF9idWY7CisKKwkvKiBQYXJzZSBjb21wbGV0aW9uICovCisJc2VuZF9idWYgPSBsaW5kYV93cS0+c2VuZF9idWZbd3FlX2lkeF07CisJREJHQzIgKCBsaW5kYSwgIkxpbmRhICVwIFFQTiAlbGQgVFggJWQoJWQpIGNvbXBsZXRlXG4iLAorCQlsaW5kYSwgcXAtPnFwbiwgc2VuZF9idWYsIHdxZV9pZHggKTsKKworCS8qIENvbXBsZXRlIHdvcmsgcXVldWUgZW50cnkgKi8KKwlpb2J1ZiA9IHdxLT5pb2J1ZnNbd3FlX2lkeF07CisJYXNzZXJ0ICggaW9idWYgIT0gTlVMTCApOworCWliX2NvbXBsZXRlX3NlbmQgKCBpYmRldiwgcXAsIGlvYnVmLCAwICk7CisJd3EtPmlvYnVmc1t3cWVfaWR4XSA9IE5VTEw7CisKKwkvKiBGcmVlIHNlbmQgYnVmZmVyICovCisJbGluZGFfZnJlZV9zZW5kX2J1ZiAoIGxpbmRhLCBzZW5kX2J1ZiApOworfQorCisvKioKKyAqIFBvbGwgc2VuZCB3b3JrIHF1ZXVlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICovCitzdGF0aWMgdm9pZCBsaW5kYV9wb2xsX3NlbmRfd3EgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXN0cnVjdCBsaW5kYSAqbGluZGEgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGliX3dvcmtfcXVldWUgKndxID0gJnFwLT5zZW5kOworCXN0cnVjdCBsaW5kYV9zZW5kX3dvcmtfcXVldWUgKmxpbmRhX3dxID0gaWJfd3FfZ2V0X2RydmRhdGEgKCB3cSApOworCXVuc2lnbmVkIGludCBzZW5kX2J1ZjsKKworCS8qIExvb2sgZm9yIGNvbXBsZXRpb25zICovCisJd2hpbGUgKCB3cS0+ZmlsbCApIHsKKworCQkvKiBDaGVjayB0byBzZWUgaWYgc2VuZCBidWZmZXIgaGFzIGNvbXBsZXRlZCAqLworCQlzZW5kX2J1ZiA9IGxpbmRhX3dxLT5zZW5kX2J1ZltsaW5kYV93cS0+Y29uc107CisJCWlmICggbGluZGFfc2VuZF9idWZfaW5fdXNlICggbGluZGEsIHNlbmRfYnVmICkgKQorCQkJYnJlYWs7CisKKwkJLyogQ29tcGxldGUgdGhpcyBidWZmZXIgKi8KKwkJbGluZGFfY29tcGxldGVfc2VuZCAoIGliZGV2LCBxcCwgbGluZGFfd3EtPmNvbnMgKTsKKworCQkvKiBJbmNyZW1lbnQgY29uc3VtZXIgY291bnRlciAqLworCQlsaW5kYV93cS0+Y29ucyA9ICggKCBsaW5kYV93cS0+Y29ucyArIDEgKSAmCisJCQkJICAgKCB3cS0+bnVtX3dxZXMgLSAxICkgKTsKKwl9Cit9CisKKy8qKgorICogUG9zdCByZWNlaXZlIHdvcmsgcXVldWUgZW50cnkKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfcG9zdF9yZWN2ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCSAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKSB7CisJc3RydWN0IGxpbmRhICpsaW5kYSA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgaWJfd29ya19xdWV1ZSAqd3EgPSAmcXAtPnJlY3Y7CisJc3RydWN0IGxpbmRhX3JlY3Zfd29ya19xdWV1ZSAqbGluZGFfd3EgPSBpYl93cV9nZXRfZHJ2ZGF0YSAoIHdxICk7CisJc3RydWN0IFFJQl83MjIwX1JjdkVnciByY3ZlZ3I7CisJc3RydWN0IFFJQl83MjIwX3NjYWxhciByY3ZlZ3JpbmRleGhlYWQ7CisJdW5zaWduZWQgaW50IGN0eCA9IGxpbmRhX3Fwbl90b19jdHggKCBxcC0+cXBuICk7CisJcGh5c2FkZHJfdCBhZGRyOworCXNpemVfdCBsZW47CisJdW5zaWduZWQgaW50IHdxZV9pZHg7CisJdW5zaWduZWQgaW50IGJ1ZnNpemU7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJYWRkciA9IHZpcnRfdG9fYnVzICggaW9idWYtPmRhdGEgKTsKKwlsZW4gPSBpb2JfdGFpbHJvb20gKCBpb2J1ZiApOworCWlmICggYWRkciAmICggTElOREFfRUFHRVJfQlVGRkVSX0FMSUdOIC0gMSApICkgeworCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCBRUE4gJWxkIG1pc2FsaWduZWQgUlggYnVmZmVyICIKKwkJICAgICAgICIoJTA4bHgpXG4iLCBsaW5kYSwgcXAtPnFwbiwgYWRkciApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCBsZW4gIT0gTElOREFfUkVDVl9QQVlMT0FEX1NJWkUgKSB7CisJCURCR0MgKCBsaW5kYSwgIkxpbmRhICVwIFFQTiAlbGQgd3JvbmcgUlggYnVmZmVyIHNpemUgKCV6ZClcbiIsCisJCSAgICAgICBsaW5kYSwgcXAtPnFwbiwgbGVuICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENhbGN1bGF0ZSBlYWdlciBwcm9kdWNlciBpbmRleCBhbmQgV1FFIGluZGV4ICovCisJd3FlX2lkeCA9ICggbGluZGFfd3EtPmVhZ2VyX3Byb2QgJiAoIHdxLT5udW1fd3FlcyAtIDEgKSApOworCWFzc2VydCAoIHdxLT5pb2J1ZnNbd3FlX2lkeF0gPT0gTlVMTCApOworCisJLyogU3RvcmUgSS9PIGJ1ZmZlciAqLworCXdxLT5pb2J1ZnNbd3FlX2lkeF0gPSBpb2J1ZjsKKworCS8qIENhbGN1bGF0ZSBidWZmZXIgc2l6ZSAqLworCXN3aXRjaCAoIExJTkRBX1JFQ1ZfUEFZTE9BRF9TSVpFICkgeworCWNhc2UgMjA0ODogIGJ1ZnNpemUgPSBMSU5EQV9FQUdFUl9CVUZGRVJfMks7ICBicmVhazsKKwljYXNlIDQwOTY6ICBidWZzaXplID0gTElOREFfRUFHRVJfQlVGRkVSXzRLOyAgYnJlYWs7CisJY2FzZSA4MTkyOiAgYnVmc2l6ZSA9IExJTkRBX0VBR0VSX0JVRkZFUl84SzsgIGJyZWFrOworCWNhc2UgMTYzODQ6IGJ1ZnNpemUgPSBMSU5EQV9FQUdFUl9CVUZGRVJfMTZLOyBicmVhazsKKwljYXNlIDMyNzY4OiBidWZzaXplID0gTElOREFfRUFHRVJfQlVGRkVSXzMySzsgYnJlYWs7CisJY2FzZSA2NTUzNjogYnVmc2l6ZSA9IExJTkRBX0VBR0VSX0JVRkZFUl82NEs7IGJyZWFrOworCWRlZmF1bHQ6ICAgIGxpbmtlcl9hc3NlcnQgKCAwLCBpbnZhbGlkX3J4X3BheWxvYWRfc2l6ZSApOworCQkgICAgYnVmc2l6ZSA9IExJTkRBX0VBR0VSX0JVRkZFUl9OT05FOworCX0KKworCS8qIFBvc3QgZWFnZXIgYnVmZmVyICovCisJbWVtc2V0ICggJnJjdmVnciwgMCwgc2l6ZW9mICggcmN2ZWdyICkgKTsKKwlCSVRfRklMTF8yICggJnJjdmVnciwKKwkJICAgICBBZGRyLCAoIGFkZHIgPj4gMTEgKSwKKwkJICAgICBCdWZTaXplLCBidWZzaXplICk7CisJbGluZGFfd3JpdGVxX2FycmF5OGIgKCBsaW5kYSwgJnJjdmVnciwKKwkJCSAgICAgICBsaW5kYV93cS0+ZWFnZXJfYXJyYXksIGxpbmRhX3dxLT5lYWdlcl9wcm9kICk7CisJREJHQzIgKCBsaW5kYSwgIkxpbmRhICVwIFFQTiAlbGQgUlggZWdyICVkKCVkKSBwb3N0ZWQgWyVseCwlbHgpXG4iLAorCQlsaW5kYSwgcXAtPnFwbiwgbGluZGFfd3EtPmVhZ2VyX3Byb2QsIHdxZV9pZHgsCisJCWFkZHIsICggYWRkciArIGxlbiApICk7CisKKwkvKiBJbmNyZW1lbnQgcHJvZHVjZXIgaW5kZXggKi8KKwlsaW5kYV93cS0+ZWFnZXJfcHJvZCA9ICggKCBsaW5kYV93cS0+ZWFnZXJfcHJvZCArIDEgKSAmCisJCQkJICggbGluZGFfd3EtPmVhZ2VyX2VudHJpZXMgLSAxICkgKTsKKworCS8qIFVwZGF0ZSBoZWFkIGluZGV4ICovCisJbWVtc2V0ICggJnJjdmVncmluZGV4aGVhZCwgMCwgc2l6ZW9mICggcmN2ZWdyaW5kZXhoZWFkICkgKTsKKwlCSVRfRklMTF8xICggJnJjdmVncmluZGV4aGVhZCwKKwkJICAgICBWYWx1ZSwgKCAoIGxpbmRhX3dxLT5lYWdlcl9wcm9kICsgMSApICYKKwkJCSAgICAgICggbGluZGFfd3EtPmVhZ2VyX2VudHJpZXMgLSAxICkgKSApOworCWxpbmRhX3dyaXRlcV9hcnJheTY0ayAoIGxpbmRhLCAmcmN2ZWdyaW5kZXhoZWFkLAorCQkJCVFJQl83MjIwX1JjdkVnckluZGV4SGVhZDBfb2Zmc2V0LCBjdHggKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIENvbXBsZXRlIHJlY2VpdmUgd29yayBxdWV1ZSBlbnRyeQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGhlYWRlcl9vZmZzCUhlYWRlciBvZmZzZXQKKyAqLworc3RhdGljIHZvaWQgbGluZGFfY29tcGxldGVfcmVjdiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJCSAgdW5zaWduZWQgaW50IGhlYWRlcl9vZmZzICkgeworCXN0cnVjdCBsaW5kYSAqbGluZGEgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGliX3dvcmtfcXVldWUgKndxID0gJnFwLT5yZWN2OworCXN0cnVjdCBsaW5kYV9yZWN2X3dvcmtfcXVldWUgKmxpbmRhX3dxID0gaWJfd3FfZ2V0X2RydmRhdGEgKCB3cSApOworCXN0cnVjdCBRSUJfNzIyMF9SY3ZIZHJGbGFncyAqcmN2aGRyZmxhZ3M7CisJc3RydWN0IFFJQl83MjIwX1JjdkVnciByY3ZlZ3I7CisJc3RydWN0IGlvX2J1ZmZlciBoZWFkZXJzOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXN0cnVjdCBpYl9xdWV1ZV9wYWlyICppbnRlbmRlZF9xcDsKKwlzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgYXY7CisJdW5zaWduZWQgaW50IHJjdnR5cGU7CisJdW5zaWduZWQgaW50IHBrdGxlbjsKKwl1bnNpZ25lZCBpbnQgZWdyaW5kZXg7CisJdW5zaWduZWQgaW50IHVzZWVncmJmcjsKKwl1bnNpZ25lZCBpbnQgaWJlcnIsIG1rZXJyLCB0aWRlcnIsIGtoZHJlcnIsIG10dWVycjsKKwl1bnNpZ25lZCBpbnQgbGVuZXJyLCBwYXJpdHllcnIsIHZjcmNlcnIsIGljcmNlcnI7CisJdW5zaWduZWQgaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaGRycW9mZnNldDsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX2xlbjsKKwl1bnNpZ25lZCBpbnQgcGFkZGVkX3BheWxvYWRfbGVuOworCXVuc2lnbmVkIGludCB3cWVfaWR4OworCXNpemVfdCBwYXlsb2FkX2xlbjsKKwlpbnQgcXAwOworCWludCByYzsKKworCS8qIFJjdkhkckZsYWdzIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZW50cnkgKi8KKwlyY3ZoZHJmbGFncyA9ICggbGluZGFfd3EtPmhlYWRlciArIGhlYWRlcl9vZmZzICsKKwkJCUxJTkRBX1JFQ1ZfSEVBREVSX1NJWkUgLSBzaXplb2YgKCAqcmN2aGRyZmxhZ3MgKSApOworCXJjdnR5cGUgPSBCSVRfR0VUICggcmN2aGRyZmxhZ3MsIFJjdlR5cGUgKTsKKwlwa3RsZW4gPSAoIEJJVF9HRVQgKCByY3ZoZHJmbGFncywgUGt0TGVuICkgPDwgMiApOworCWVncmluZGV4ID0gQklUX0dFVCAoIHJjdmhkcmZsYWdzLCBFZ3JJbmRleCApOworCXVzZWVncmJmciA9IEJJVF9HRVQgKCByY3ZoZHJmbGFncywgVXNlRWdyQmZyICk7CisJaGRycW9mZnNldCA9ICggQklUX0dFVCAoIHJjdmhkcmZsYWdzLCBIZHJxT2Zmc2V0ICkgPDwgMiApOworCWliZXJyID0gQklUX0dFVCAoIHJjdmhkcmZsYWdzLCBJQkVyciApOworCW1rZXJyID0gQklUX0dFVCAoIHJjdmhkcmZsYWdzLCBNS0VyciApOworCXRpZGVyciA9IEJJVF9HRVQgKCByY3ZoZHJmbGFncywgVElERXJyICk7CisJa2hkcmVyciA9IEJJVF9HRVQgKCByY3ZoZHJmbGFncywgS0hkckVyciApOworCW10dWVyciA9IEJJVF9HRVQgKCByY3ZoZHJmbGFncywgTVRVRXJyICk7CisJbGVuZXJyID0gQklUX0dFVCAoIHJjdmhkcmZsYWdzLCBMZW5FcnIgKTsKKwlwYXJpdHllcnIgPSBCSVRfR0VUICggcmN2aGRyZmxhZ3MsIFBhcml0eUVyciApOworCXZjcmNlcnIgPSBCSVRfR0VUICggcmN2aGRyZmxhZ3MsIFZDUkNFcnIgKTsKKwlpY3JjZXJyID0gQklUX0dFVCAoIHJjdmhkcmZsYWdzLCBJQ1JDRXJyICk7CisJaGVhZGVyX2xlbiA9ICggTElOREFfUkVDVl9IRUFERVJfU0laRSAtIGhkcnFvZmZzZXQgLQorCQkgICAgICAgc2l6ZW9mICggKnJjdmhkcmZsYWdzICkgKTsKKwlwYWRkZWRfcGF5bG9hZF9sZW4gPSAoIHBrdGxlbiAtIGhlYWRlcl9sZW4gLSA0IC8qIElDUkMgKi8gKTsKKwllcnIgPSAoIGliZXJyIHwgbWtlcnIgfCB0aWRlcnIgfCBraGRyZXJyIHwgbXR1ZXJyIHwKKwkJbGVuZXJyIHwgcGFyaXR5ZXJyIHwgdmNyY2VyciB8IGljcmNlcnIgKTsKKwkvKiBJQiBoZWFkZXIgaXMgcGxhY2VkIGltbWVkaWF0ZWx5IGJlZm9yZSBSY3ZIZHJGbGFncyAqLworCWlvYl9wb3B1bGF0ZSAoICZoZWFkZXJzLCAoICggKCB2b2lkICogKSByY3ZoZHJmbGFncyApIC0gaGVhZGVyX2xlbiApLAorCQkgICAgICAgaGVhZGVyX2xlbiwgaGVhZGVyX2xlbiApOworCisJLyogRHVtcCBkaWFnbm9zdGljIGluZm9ybWF0aW9uICovCisJaWYgKCBlcnIgfHwgKCAhIHVzZWVncmJmciApICkgeworCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCBRUE4gJWxkIFJYIGVnciAlZCVzIGhkciAlZCB0eXBlICVkICIKKwkJICAgICAgICJsZW4gJWQoJWQrJWQrNCklcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLCBsaW5kYSwKKwkJICAgICAgIHFwLT5xcG4sIGVncmluZGV4LCAoIHVzZWVncmJmciA/ICIiIDogIih1bnVzZWQpIiApLAorCQkgICAgICAgKCBoZWFkZXJfb2ZmcyAvIExJTkRBX1JFQ1ZfSEVBREVSX1NJWkUgKSwgcmN2dHlwZSwKKwkJICAgICAgIHBrdGxlbiwgaGVhZGVyX2xlbiwgcGFkZGVkX3BheWxvYWRfbGVuLAorCQkgICAgICAgKCBlcnIgPyAiIFtFcnIiIDogIiIgKSwgKCBpYmVyciA/ICIgSUIiIDogIiIgKSwKKwkJICAgICAgICggbWtlcnIgPyAiIE1LIiA6ICIiICksICggdGlkZXJyID8gIiBUSUQiIDogIiIgKSwKKwkJICAgICAgICgga2hkcmVyciA/ICIgS0hkciIgOiAiIiApLCAoIG10dWVyciA/ICIgTVRVIiA6ICIiICksCisJCSAgICAgICAoIGxlbmVyciA/ICIgTGVuIiA6ICIiICksICggcGFyaXR5ZXJyID8gIiBQYXJpdHkiIDogIiIpLAorCQkgICAgICAgKCB2Y3JjZXJyID8gIiBWQ1JDIiA6ICIiICksICggaWNyY2VyciA/ICIgSUNSQyIgOiAiIiApLAorCQkgICAgICAgKCBlcnIgPyAiXSIgOiAiIiApICk7CisJfSBlbHNlIHsKKwkJREJHQzIgKCBsaW5kYSwgIkxpbmRhICVwIFFQTiAlbGQgUlggZWdyICVkIGhkciAlZCB0eXBlICVkICIKKwkJCSJsZW4gJWQoJWQrJWQrNClcbiIsIGxpbmRhLCBxcC0+cXBuLCBlZ3JpbmRleCwKKwkJCSggaGVhZGVyX29mZnMgLyBMSU5EQV9SRUNWX0hFQURFUl9TSVpFICksIHJjdnR5cGUsCisJCQlwa3RsZW4sIGhlYWRlcl9sZW4sIHBhZGRlZF9wYXlsb2FkX2xlbiApOworCX0KKwlEQkdDUF9IREEgKCBsaW5kYSwgaGRycW9mZnNldCwgaGVhZGVycy5kYXRhLAorCQkgICAgKCBoZWFkZXJfbGVuICsgc2l6ZW9mICggKnJjdmhkcmZsYWdzICkgKSApOworCisJLyogUGFyc2UgaGVhZGVyIHRvIGdlbmVyYXRlIGFkZHJlc3MgdmVjdG9yICovCisJcXAwID0gKCBxcC0+cXBuID09IDAgKTsKKwlpbnRlbmRlZF9xcCA9IE5VTEw7CisJaWYgKCAoIHJjID0gaWJfcHVsbCAoIGliZGV2LCAmaGVhZGVycywgKCBxcDAgPyAmaW50ZW5kZWRfcXAgOiBOVUxMICksCisJCQkgICAgICAmcGF5bG9hZF9sZW4sICZhdiApICkgIT0gMCApIHsKKwkJREJHQyAoIGxpbmRhLCAiTGluZGEgJXAgY291bGQgbm90IHBhcnNlIGhlYWRlcnM6ICVzXG4iLAorCQkgICAgICAgbGluZGEsIHN0cmVycm9yICggcmMgKSApOworCQllcnIgPSAxOworCX0KKwlpZiAoICEgaW50ZW5kZWRfcXAgKQorCQlpbnRlbmRlZF9xcCA9IHFwOworCisJLyogQ29tcGxldGUgdGhpcyBidWZmZXIgYW5kIGFueSBza2lwcGVkIGJ1ZmZlcnMuICBOb3RlIHRoYXQKKwkgKiB3aGVuIHRoZSBoYXJkd2FyZSBydW5zIG91dCBvZiBidWZmZXJzLCBpdCB3aWxsIHJlcGVhdGVkbHkKKwkgKiByZXBvcnQgdGhlIHNhbWUgYnVmZmVyICh0aGUgdGFpbCkgYXMgYSBUSUQgZXJyb3IsIGFuZCB0aGF0CisJICogaXQgYWxzbyBoYXMgYSBoYWJpdCBvZiBzb21ldGltZXMgc2tpcHBpbmcgb3ZlciBzZXZlcmFsCisJICogYnVmZmVycyBhdCBvbmNlLgorCSAqLworCXdoaWxlICggMSApIHsKKworCQkvKiBJZiB3ZSBoYXZlIGNhdWdodCB1cCB0byB0aGUgcHJvZHVjZXIgY291bnRlciwgc3RvcC4KKwkJICogVGhpcyB3aWxsIGhhcHBlbiB3aGVuIHRoZSBoYXJkd2FyZSBmaXJzdCBydW5zIG91dAorCQkgKiBvZiBidWZmZXJzIGFuZCBzdGFydHMgcmVwb3J0aW5nIFRJRCBlcnJvcnMgYWdhaW5zdAorCQkgKiB0aGUgZWFnZXIgYnVmZmVyIGl0IHdhbnRzIHRvIHVzZSBuZXh0LgorCQkgKi8KKwkJaWYgKCBsaW5kYV93cS0+ZWFnZXJfY29ucyA9PSBsaW5kYV93cS0+ZWFnZXJfcHJvZCApCisJCQlicmVhazsKKworCQkvKiBJZiB3ZSBoYXZlIGNhdWdodCB1cCB0byB3aGVyZSB3ZSBzaG91bGQgYmUgYWZ0ZXIKKwkJICogY29tcGxldGluZyB0aGlzIGVncmluZGV4LCBzdG9wLiAgV2UgcGhyYXNlIHRoZSB0ZXN0CisJCSAqIHRoaXMgd2F5IHRvIGF2b2lkIGNvbXBsZXRpbmcgdGhlIGVudGlyZSByaW5nIHdoZW4KKwkJICogd2UgcmVjZWl2ZSB0aGUgc2FtZSBlZ3JpbmRleCB0d2ljZSBpbiBhIHJvdy4KKwkJICovCisJCWlmICggKCBsaW5kYV93cS0+ZWFnZXJfY29ucyA9PQorCQkgICAgICAgKCAoIGVncmluZGV4ICsgMSApICYgKCBsaW5kYV93cS0+ZWFnZXJfZW50cmllcyAtIDEgKSApKSkKKwkJCWJyZWFrOworCisJCS8qIElkZW50aWZ5IHdvcmsgcXVldWUgZW50cnkgYW5kIGNvcnJlc3BvbmRpbmcgSS9PCisJCSAqIGJ1ZmZlci4KKwkJICovCisJCXdxZV9pZHggPSAoIGxpbmRhX3dxLT5lYWdlcl9jb25zICYgKCB3cS0+bnVtX3dxZXMgLSAxICkgKTsKKwkJaW9idWYgPSB3cS0+aW9idWZzW3dxZV9pZHhdOworCQlhc3NlcnQgKCBpb2J1ZiAhPSBOVUxMICk7CisJCXdxLT5pb2J1ZnNbd3FlX2lkeF0gPSBOVUxMOworCisJCS8qIENvbXBsZXRlIHRoZSBlYWdlciBidWZmZXIgKi8KKwkJaWYgKCBsaW5kYV93cS0+ZWFnZXJfY29ucyA9PSBlZ3JpbmRleCApIHsKKwkJCS8qIENvbXBsZXRpbmcgdGhlIGVhZ2VyIGJ1ZmZlciBkZXNjcmliZWQgaW4KKwkJCSAqIHRoaXMgaGVhZGVyIGVudHJ5LgorCQkJICovCisJCQlpb2JfcHV0ICggaW9idWYsIHBheWxvYWRfbGVuICk7CisJCQlyYyA9ICggZXJyID8gLUVJTyA6ICggdXNlZWdyYmZyID8gMCA6IC1FQ0FOQ0VMRUQgKSApOworCQkJLyogUmVkaXJlY3QgdG8gdGFyZ2V0IFFQIGlmIG5lY2Vzc2FyeSAqLworCQkJaWYgKCBxcCAhPSBpbnRlbmRlZF9xcCApIHsKKwkJCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCByZWRpcmVjdGluZyBRUE4gJWxkICIKKwkJCQkgICAgICAgIj0+ICVsZFxuIiwKKwkJCQkgICAgICAgbGluZGEsIHFwLT5xcG4sIGludGVuZGVkX3FwLT5xcG4gKTsKKwkJCQkvKiBDb21wZW5zYXRlIGZvciBpbmNvcnJlY3QgZmlsbCBsZXZlbHMgKi8KKwkJCQlxcC0+cmVjdi5maWxsLS07CisJCQkJaW50ZW5kZWRfcXAtPnJlY3YuZmlsbCsrOworCQkJfQorCQkJaWJfY29tcGxldGVfcmVjdiAoIGliZGV2LCBpbnRlbmRlZF9xcCwgJmF2LCBpb2J1ZiwgcmMpOworCQl9IGVsc2UgeworCQkJLyogQ29tcGxldGluZyBvbiBhIHNraXBwZWQtb3ZlciBlYWdlciBidWZmZXIgKi8KKwkJCWliX2NvbXBsZXRlX3JlY3YgKCBpYmRldiwgcXAsICZhdiwgaW9idWYsIC1FQ0FOQ0VMRUQgKTsKKwkJfQorCisJCS8qIENsZWFyIGVhZ2VyIGJ1ZmZlciAqLworCQltZW1zZXQgKCAmcmN2ZWdyLCAwLCBzaXplb2YgKCByY3ZlZ3IgKSApOworCQlsaW5kYV93cml0ZXFfYXJyYXk4YiAoIGxpbmRhLCAmcmN2ZWdyLCBsaW5kYV93cS0+ZWFnZXJfYXJyYXksCisJCQkJICAgICAgIGxpbmRhX3dxLT5lYWdlcl9jb25zICk7CisKKwkJLyogSW5jcmVtZW50IGNvbnN1bWVyIGluZGV4ICovCisJCWxpbmRhX3dxLT5lYWdlcl9jb25zID0gKCAoIGxpbmRhX3dxLT5lYWdlcl9jb25zICsgMSApICYKKwkJCQkJICggbGluZGFfd3EtPmVhZ2VyX2VudHJpZXMgLSAxICkgKTsKKwl9Cit9CisKKy8qKgorICogUG9sbCByZWNlaXZlIHdvcmsgcXVldWUKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKi8KK3N0YXRpYyB2b2lkIGxpbmRhX3BvbGxfcmVjdl93cSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAgKSB7CisJc3RydWN0IGxpbmRhICpsaW5kYSA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgaWJfd29ya19xdWV1ZSAqd3EgPSAmcXAtPnJlY3Y7CisJc3RydWN0IGxpbmRhX3JlY3Zfd29ya19xdWV1ZSAqbGluZGFfd3EgPSBpYl93cV9nZXRfZHJ2ZGF0YSAoIHdxICk7CisJc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQwIHJjdmhkcmhlYWQ7CisJdW5zaWduZWQgaW50IGN0eCA9IGxpbmRhX3Fwbl90b19jdHggKCBxcC0+cXBuICk7CisJdW5zaWduZWQgaW50IGhlYWRlcl9wcm9kOworCisJLyogQ2hlY2sgZm9yIHJlY2VpdmVkIHBhY2tldHMgKi8KKwloZWFkZXJfcHJvZCA9ICggQklUX0dFVCAoICZsaW5kYV93cS0+aGVhZGVyX3Byb2QsIFZhbHVlICkgPDwgMiApOworCWlmICggaGVhZGVyX3Byb2QgPT0gbGluZGFfd3EtPmhlYWRlcl9jb25zICkKKwkJcmV0dXJuOworCisJLyogUHJvY2VzcyBhbGwgcmVjZWl2ZWQgcGFja2V0cyAqLworCXdoaWxlICggbGluZGFfd3EtPmhlYWRlcl9jb25zICE9IGhlYWRlcl9wcm9kICkgeworCisJCS8qIENvbXBsZXRlIHRoZSByZWNlaXZlICovCisJCWxpbmRhX2NvbXBsZXRlX3JlY3YgKCBpYmRldiwgcXAsIGxpbmRhX3dxLT5oZWFkZXJfY29ucyApOworCisJCS8qIEluY3JlbWVudCB0aGUgY29uc3VtZXIgb2Zmc2V0ICovCisJCWxpbmRhX3dxLT5oZWFkZXJfY29ucyArPSBMSU5EQV9SRUNWX0hFQURFUl9TSVpFOworCQlsaW5kYV93cS0+aGVhZGVyX2NvbnMgJT0gTElOREFfUkVDVl9IRUFERVJTX1NJWkU7CisJfQorCisJLyogVXBkYXRlIGNvbnN1bWVyIG9mZnNldCAqLworCW1lbXNldCAoICZyY3ZoZHJoZWFkLCAwLCBzaXplb2YgKCByY3ZoZHJoZWFkICkgKTsKKwlCSVRfRklMTF8yICggJnJjdmhkcmhlYWQsCisJCSAgICAgUmN2SGVhZFBvaW50ZXIsICggbGluZGFfd3EtPmhlYWRlcl9jb25zID4+IDIgKSwKKwkJICAgICBjb3VudGVyLCAxICk7CisJbGluZGFfd3JpdGVxX2FycmF5NjRrICggbGluZGEsICZyY3ZoZHJoZWFkLAorCQkJCVFJQl83MjIwX1JjdkhkckhlYWQwX29mZnNldCwgY3R4ICk7Cit9CisKKy8qKgorICogUG9sbCBjb21wbGV0aW9uIHF1ZXVlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBjcQkJQ29tcGxldGlvbiBxdWV1ZQorICovCitzdGF0aWMgdm9pZCBsaW5kYV9wb2xsX2NxICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxICkgeworCXN0cnVjdCBpYl93b3JrX3F1ZXVlICp3cTsKKworCS8qIFBvbGwgYXNzb2NpYXRlZCBzZW5kIGFuZCByZWNlaXZlIHF1ZXVlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCB3cSwgJmNxLT53b3JrX3F1ZXVlcywgbGlzdCApIHsKKwkJaWYgKCB3cS0+aXNfc2VuZCApIHsKKwkJCWxpbmRhX3BvbGxfc2VuZF93cSAoIGliZGV2LCB3cS0+cXAgKTsKKwkJfSBlbHNlIHsKKwkJCWxpbmRhX3BvbGxfcmVjdl93cSAoIGliZGV2LCB3cS0+cXAgKTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEV2ZW50IHF1ZXVlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFBvbGwgZXZlbnQgcXVldWUKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbGluZGFfcG9sbF9lcSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICkgeworCXN0cnVjdCBsaW5kYSAqbGluZGEgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IFFJQl83MjIwX0VyclN0YXR1cyBlcnJzdGF0dXM7CisJc3RydWN0IFFJQl83MjIwX0VyckNsZWFyIGVycmNsZWFyOworCisJLyogQ2hlY2sgZm9yIGxpbmsgc3RhdHVzIGNoYW5nZXMgKi8KKwlEQkdfRElTQUJMRSAoIERCR0xWTF9JTyApOworCWxpbmRhX3JlYWRxICggbGluZGEsICZlcnJzdGF0dXMsIFFJQl83MjIwX0VyclN0YXR1c19vZmZzZXQgKTsKKwlEQkdfRU5BQkxFICggREJHTFZMX0lPICk7CisJaWYgKCBCSVRfR0VUICggJmVycnN0YXR1cywgSUJTdGF0dXNDaGFuZ2VkICkgKSB7CisJCWxpbmRhX2xpbmtfc3RhdGVfY2hhbmdlZCAoIGliZGV2ICk7CisJCW1lbXNldCAoICZlcnJjbGVhciwgMCwgc2l6ZW9mICggZXJyY2xlYXIgKSApOworCQlCSVRfRklMTF8xICggJmVycmNsZWFyLCBJQlN0YXR1c0NoYW5nZWRDbGVhciwgMSApOworCQlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJmVycmNsZWFyLCBRSUJfNzIyMF9FcnJDbGVhcl9vZmZzZXQgKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbmZpbmliYW5kIGxpbmstbGF5ZXIgb3BlcmF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIEluaXRpYWxpc2UgSW5maW5pYmFuZCBsaW5rCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBsaW5kYV9vcGVuICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKSB7CisJc3RydWN0IGxpbmRhICpsaW5kYSA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgUUlCXzcyMjBfQ29udHJvbCBjb250cm9sOworCisJLyogRGlzYWJsZSBsaW5rICovCisJbGluZGFfcmVhZHEgKCBsaW5kYSwgJmNvbnRyb2wsIFFJQl83MjIwX0NvbnRyb2xfb2Zmc2V0ICk7CisJQklUX1NFVCAoICZjb250cm9sLCBMaW5rRW4sIDEgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJmNvbnRyb2wsIFFJQl83MjIwX0NvbnRyb2xfb2Zmc2V0ICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2xvc2UgSW5maW5pYmFuZCBsaW5rCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGxpbmRhX2Nsb3NlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKSB7CisJc3RydWN0IGxpbmRhICpsaW5kYSA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKwlzdHJ1Y3QgUUlCXzcyMjBfQ29udHJvbCBjb250cm9sOworCisJLyogRGlzYWJsZSBsaW5rICovCisJbGluZGFfcmVhZHEgKCBsaW5kYSwgJmNvbnRyb2wsIFFJQl83MjIwX0NvbnRyb2xfb2Zmc2V0ICk7CisJQklUX1NFVCAoICZjb250cm9sLCBMaW5rRW4sIDAgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJmNvbnRyb2wsIFFJQl83MjIwX0NvbnRyb2xfb2Zmc2V0ICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNdWx0aWNhc3QgZ3JvdXAgb3BlcmF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIEF0dGFjaCB0byBtdWx0aWNhc3QgZ3JvdXAKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBnaWQJCU11bHRpY2FzdCBHSUQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGxpbmRhX21jYXN0X2F0dGFjaCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCXN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCQlzdHJ1Y3QgaWJfZ2lkICpnaWQgKSB7CisJc3RydWN0IGxpbmRhICpsaW5kYSA9IGliX2dldF9kcnZkYXRhICggaWJkZXYgKTsKKworCSggdm9pZCApIGxpbmRhOworCSggdm9pZCApIHFwOworCSggdm9pZCApIGdpZDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBEZXRhY2ggZnJvbSBtdWx0aWNhc3QgZ3JvdXAKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBnaWQJCU11bHRpY2FzdCBHSUQKKyAqLworc3RhdGljIHZvaWQgbGluZGFfbWNhc3RfZGV0YWNoICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCQkgc3RydWN0IGliX2dpZCAqZ2lkICkgeworCXN0cnVjdCBsaW5kYSAqbGluZGEgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisKKwkoIHZvaWQgKSBsaW5kYTsKKwkoIHZvaWQgKSBxcDsKKwkoIHZvaWQgKSBnaWQ7Cit9CisKKy8qKiBMaW5kYSBJbmZpbmliYW5kIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgaWJfZGV2aWNlX29wZXJhdGlvbnMgbGluZGFfaWJfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlX2NxCT0gbGluZGFfY3JlYXRlX2NxLAorCS5kZXN0cm95X2NxCT0gbGluZGFfZGVzdHJveV9jcSwKKwkuY3JlYXRlX3FwCT0gbGluZGFfY3JlYXRlX3FwLAorCS5tb2RpZnlfcXAJPSBsaW5kYV9tb2RpZnlfcXAsCisJLmRlc3Ryb3lfcXAJPSBsaW5kYV9kZXN0cm95X3FwLAorCS5wb3N0X3NlbmQJPSBsaW5kYV9wb3N0X3NlbmQsCisJLnBvc3RfcmVjdgk9IGxpbmRhX3Bvc3RfcmVjdiwKKwkucG9sbF9jcQk9IGxpbmRhX3BvbGxfY3EsCisJLnBvbGxfZXEJPSBsaW5kYV9wb2xsX2VxLAorCS5vcGVuCQk9IGxpbmRhX29wZW4sCisJLmNsb3NlCQk9IGxpbmRhX2Nsb3NlLAorCS5tY2FzdF9hdHRhY2gJPSBsaW5kYV9tY2FzdF9hdHRhY2gsCisJLm1jYXN0X2RldGFjaAk9IGxpbmRhX21jYXN0X2RldGFjaCwKKwkuc2V0X3BvcnRfaW5mbwk9IGxpbmRhX3NldF9wb3J0X2luZm8sCisJLnNldF9wa2V5X3RhYmxlCT0gbGluZGFfc2V0X3BrZXlfdGFibGUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSTJDIGJ1cyBvcGVyYXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBMaW5kYSBJMkMgYml0IHRvIEdQSU8gbWFwcGluZ3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGluZGFfaTJjX2JpdHNbXSA9IHsKKwlbSTJDX0JJVF9TQ0xdID0gKCAxIDw8IExJTkRBX0dQSU9fU0NMICksCisJW0kyQ19CSVRfU0RBXSA9ICggMSA8PCBMSU5EQV9HUElPX1NEQSApLAorfTsKKworLyoqCisgKiBSZWFkIExpbmRhIEkyQyBsaW5lIHN0YXR1cworICoKKyAqIEB2IGJhc2hlcgkJQml0LWJhc2hpbmcgaW50ZXJmYWNlCisgKiBAdiBiaXRfaWQJCUJpdCBudW1iZXIKKyAqIEByZXQgemVybwkJSW5wdXQgaXMgYSBsb2dpYyAwCisgKiBAcmV0IG5vbi16ZXJvCUlucHV0IGlzIGEgbG9naWMgMQorICovCitzdGF0aWMgaW50IGxpbmRhX2kyY19yZWFkX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsCisJCQkJdW5zaWduZWQgaW50IGJpdF9pZCApIHsKKwlzdHJ1Y3QgbGluZGEgKmxpbmRhID0KKwkJY29udGFpbmVyX29mICggYmFzaGVyLCBzdHJ1Y3QgbGluZGEsIGkyYy5iYXNoZXIgKTsKKwlzdHJ1Y3QgUUlCXzcyMjBfRVhUU3RhdHVzIGV4dHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJREJHX0RJU0FCTEUgKCBEQkdMVkxfSU8gKTsKKworCWxpbmRhX3JlYWRxICggbGluZGEsICZleHRzdGF0dXMsIFFJQl83MjIwX0VYVFN0YXR1c19vZmZzZXQgKTsKKwlzdGF0dXMgPSAoIEJJVF9HRVQgKCAmZXh0c3RhdHVzLCBHUElPSW4gKSAmIGxpbmRhX2kyY19iaXRzW2JpdF9pZF0gKTsKKworCURCR19FTkFCTEUgKCBEQkdMVkxfSU8gKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogV3JpdGUgTGluZGEgSTJDIGxpbmUgc3RhdHVzCisgKgorICogQHYgYmFzaGVyCQlCaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqIEB2IGJpdF9pZAkJQml0IG51bWJlcgorICogQHYgZGF0YQkJVmFsdWUgdG8gd3JpdGUKKyAqLworc3RhdGljIHZvaWQgbGluZGFfaTJjX3dyaXRlX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsCisJCQkJICB1bnNpZ25lZCBpbnQgYml0X2lkLCB1bnNpZ25lZCBsb25nIGRhdGEgKSB7CisJc3RydWN0IGxpbmRhICpsaW5kYSA9CisJCWNvbnRhaW5lcl9vZiAoIGJhc2hlciwgc3RydWN0IGxpbmRhLCBpMmMuYmFzaGVyICk7CisJc3RydWN0IFFJQl83MjIwX0VYVEN0cmwgZXh0Y3RybDsKKwlzdHJ1Y3QgUUlCXzcyMjBfR1BJTyBncGlvb3V0OworCXVuc2lnbmVkIGludCBiaXQgPSBsaW5kYV9pMmNfYml0c1tiaXRfaWRdOworCXVuc2lnbmVkIGludCBvdXRwdXRzID0gMDsKKwl1bnNpZ25lZCBpbnQgb3V0cHV0X2VuYWJsZXMgPSAwOworCisJREJHX0RJU0FCTEUgKCBEQkdMVkxfSU8gKTsKKworCS8qIFJlYWQgY3VycmVudCBHUElPIG1hc2sgYW5kIG91dHB1dHMgKi8KKwlsaW5kYV9yZWFkcSAoIGxpbmRhLCAmZXh0Y3RybCwgUUlCXzcyMjBfRVhUQ3RybF9vZmZzZXQgKTsKKwlsaW5kYV9yZWFkcSAoIGxpbmRhLCAmZ3Bpb291dCwgUUlCXzcyMjBfR1BJT091dF9vZmZzZXQgKTsKKworCS8qIFVwZGF0ZSBvdXRwdXRzIGFuZCBvdXRwdXQgZW5hYmxlcy4gIEkyQyBsaW5lcyBhcmUgdGllZAorCSAqIGhpZ2gsIHNvIHdlIGFsd2F5cyBzZXQgdGhlIG91dHB1dCB0byAwIGFuZCB1c2UgdGhlIG91dHB1dAorCSAqIGVuYWJsZSB0byBjb250cm9sIHRoZSBsaW5lLgorCSAqLworCW91dHB1dF9lbmFibGVzID0gQklUX0dFVCAoICZleHRjdHJsLCBHUElPT2UgKTsKKwlvdXRwdXRfZW5hYmxlcyA9ICggKCBvdXRwdXRfZW5hYmxlcyAmIH5iaXQgKSB8ICggfmRhdGEgJiBiaXQgKSApOworCW91dHB1dHMgPSBCSVRfR0VUICggJmdwaW9vdXQsIEdQSU8gKTsKKwlvdXRwdXRzID0gKCBvdXRwdXRzICYgfmJpdCApOworCUJJVF9TRVQgKCAmZXh0Y3RybCwgR1BJT09lLCBvdXRwdXRfZW5hYmxlcyApOworCUJJVF9TRVQgKCAmZ3Bpb291dCwgR1BJTywgb3V0cHV0cyApOworCisJLyogV3JpdGUgdGhlIG91dHB1dCBlbmFibGUgZmlyc3Q7IHRoYXQgd2F5IHdlIGF2b2lkIGxvZ2ljCisJICogaGF6YXJkcy4KKwkgKi8KKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJmV4dGN0cmwsIFFJQl83MjIwX0VYVEN0cmxfb2Zmc2V0ICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZncGlvb3V0LCBRSUJfNzIyMF9HUElPT3V0X29mZnNldCApOworCW1iKCk7CisKKwlEQkdfRU5BQkxFICggREJHTFZMX0lPICk7Cit9CisKKy8qKiBMaW5kYSBJMkMgYml0LWJhc2hpbmcgaW50ZXJmYWNlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgYml0X2Jhc2hlcl9vcGVyYXRpb25zIGxpbmRhX2kyY19iYXNoZXJfb3BzID0geworCS5yZWFkCT0gbGluZGFfaTJjX3JlYWRfYml0LAorCS53cml0ZQk9IGxpbmRhX2kyY193cml0ZV9iaXQsCit9OworCisvKioKKyAqIEluaXRpYWxpc2UgTGluZGEgSTJDIHN1YnN5c3RlbQorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGxpbmRhX2luaXRfaTJjICggc3RydWN0IGxpbmRhICpsaW5kYSApIHsKKwlzdGF0aWMgaW50IHRyeV9lZXByb21fYWRkcmVzc1tdID0geyAweDUxLCAweDUwIH07CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjOworCisJLyogSW5pdGlhbGlzZSBidXMgKi8KKwlpZiAoICggcmMgPSBpbml0X2kyY19iaXRfYmFzaGVyICggJmxpbmRhLT5pMmMsCisJCQkJCSAgJmxpbmRhX2kyY19iYXNoZXJfb3BzICkgKSAhPSAwICkgeworCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCBjb3VsZCBub3QgaW5pdGlhbGlzZSBJMkMgYnVzOiAlc1xuIiwKKwkJICAgICAgIGxpbmRhLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFByb2JlIGZvciBkZXZpY2VzICovCisJZm9yICggaSA9IDAgOyBpIDwgKCBzaXplb2YgKCB0cnlfZWVwcm9tX2FkZHJlc3MgKSAvCisJCQkgICAgc2l6ZW9mICggdHJ5X2VlcHJvbV9hZGRyZXNzWzBdICkgKSA7IGkrKyApIHsKKwkJaW5pdF9pMmNfZWVwcm9tICggJmxpbmRhLT5lZXByb20sIHRyeV9lZXByb21fYWRkcmVzc1tpXSApOworCQlpZiAoICggcmMgPSBpMmNfY2hlY2tfcHJlc2VuY2UgKCAmbGluZGEtPmkyYy5pMmMsCisJCQkJCQkgJmxpbmRhLT5lZXByb20gKSApID09IDAgKSB7CisJCQlEQkdDMiAoIGxpbmRhLCAiTGluZGEgJXAgZm91bmQgRUVQUk9NIGF0ICUwMnhcbiIsCisJCQkJbGluZGEsIHRyeV9lZXByb21fYWRkcmVzc1tpXSApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlEQkdDICggbGluZGEsICJMaW5kYSAlcCBjb3VsZCBub3QgZmluZCBFRVBST01cbiIsIGxpbmRhICk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qKgorICogUmVhZCBFRVBST00gcGFyYW1ldGVycworICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEB2IGd1aWQJCUdVSUQgdG8gZmlsbCBpbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfcmVhZF9lZXByb20gKCBzdHJ1Y3QgbGluZGEgKmxpbmRhLAorCQkJICAgICAgIHN0cnVjdCBpYl9naWRfaGFsZiAqZ3VpZCApIHsKKwlzdHJ1Y3QgaTJjX2ludGVyZmFjZSAqaTJjID0gJmxpbmRhLT5pMmMuaTJjOworCWludCByYzsKKworCS8qIFJlYWQgR1VJRCAqLworCWlmICggKCByYyA9IGkyYy0+cmVhZCAoIGkyYywgJmxpbmRhLT5lZXByb20sIExJTkRBX0VFUFJPTV9HVUlEX09GRlNFVCwKKwkJCQlndWlkLT51LmJ5dGVzLCBzaXplb2YgKCAqZ3VpZCApICkgKSAhPSAwICkgeworCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCBjb3VsZCBub3QgcmVhZCBHVUlEOiAlc1xuIiwKKwkJICAgICAgIGxpbmRhLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKwlEQkdDMiAoIGxpbmRhLCAiTGluZGEgJXAgaGFzIEdVSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6IgorCQkiJTAyeDolMDJ4XG4iLCBsaW5kYSwgZ3VpZC0+dS5ieXRlc1swXSwgZ3VpZC0+dS5ieXRlc1sxXSwKKwkJZ3VpZC0+dS5ieXRlc1syXSwgZ3VpZC0+dS5ieXRlc1szXSwgZ3VpZC0+dS5ieXRlc1s0XSwKKwkJZ3VpZC0+dS5ieXRlc1s1XSwgZ3VpZC0+dS5ieXRlc1s2XSwgZ3VpZC0+dS5ieXRlc1s3XSApOworCisJLyogUmVhZCBzZXJpYWwgbnVtYmVyIChkZWJ1ZyBvbmx5KSAqLworCWlmICggREJHX0xPRyApIHsKKwkJdWludDhfdCBzZXJpYWxbTElOREFfRUVQUk9NX1NFUklBTF9TSVpFICsgMV07CisKKwkJc2VyaWFsWyBzaXplb2YgKCBzZXJpYWwgKSAtIDEgXSA9ICdcMCc7CisJCWlmICggKCByYyA9IGkyYy0+cmVhZCAoIGkyYywgJmxpbmRhLT5lZXByb20sCisJCQkJCUxJTkRBX0VFUFJPTV9TRVJJQUxfT0ZGU0VULCBzZXJpYWwsCisJCQkJCSggc2l6ZW9mICggc2VyaWFsICkgLSAxICkgKSApICE9IDAgKSB7CisJCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCBjb3VsZCBub3QgcmVhZCBzZXJpYWw6ICVzXG4iLAorCQkJICAgICAgIGxpbmRhLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlEQkdDMiAoIGxpbmRhLCAiTGluZGEgJXAgaGFzIHNlcmlhbCBudW1iZXIgXCIlc1wiXG4iLAorCQkJbGluZGEsIHNlcmlhbCApOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXh0ZXJuYWwgcGFyYWxsZWwgYnVzIGFjY2VzcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFJlcXVlc3Qgb3duZXJzaGlwIG9mIHRoZSBJQiBleHRlcm5hbCBwYXJhbGxlbCBidXMKKyAqCisgKiBAdiBsaW5kYQkJTGluZGEgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBsaW5kYV9pYl9lcGJfcmVxdWVzdCAoIHN0cnVjdCBsaW5kYSAqbGluZGEgKSB7CisJc3RydWN0IFFJQl83MjIwX2lic2RfZXBiX2FjY2Vzc19jdHJsIGFjY2VzczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFJlcXVlc3Qgb3duZXJzaGlwICovCisJbWVtc2V0ICggJmFjY2VzcywgMCwgc2l6ZW9mICggYWNjZXNzICkgKTsKKwlCSVRfRklMTF8xICggJmFjY2Vzcywgc3dfaWJfZXBiX3JlcSwgMSApOworCWxpbmRhX3dyaXRlcSAoIGxpbmRhLCAmYWNjZXNzLCBRSUJfNzIyMF9pYnNkX2VwYl9hY2Nlc3NfY3RybF9vZmZzZXQgKTsKKworCS8qIFdhaXQgZm9yIG93bmVyc2hpcCB0byBiZSBncmFudGVkICovCisJZm9yICggaSA9IDAgOyBpIDwgTElOREFfRVBCX1JFUVVFU1RfTUFYX1dBSVRfVVMgOyBpKysgKSB7CisJCWxpbmRhX3JlYWRxICggbGluZGEsICZhY2Nlc3MsCisJCQkgICAgICBRSUJfNzIyMF9pYnNkX2VwYl9hY2Nlc3NfY3RybF9vZmZzZXQgKTsKKwkJaWYgKCBCSVRfR0VUICggJmFjY2Vzcywgc3dfaWJfZXBiX3JlcV9ncmFudGVkICkgKQorCQkJcmV0dXJuIDA7CisJCXVkZWxheSAoIDEgKTsKKwl9CisKKwlEQkdDICggbGluZGEsICJMaW5kYSAlcCB0aW1lZCBvdXQgd2FpdGluZyBmb3IgSUIgRVBCIHJlcXVlc3RcbiIsCisJICAgICAgIGxpbmRhICk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qKgorICogV2FpdCBmb3IgSUIgZXh0ZXJuYWwgcGFyYWxsZWwgYnVzIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHYgeGFjdAkJQnVmZmVyIHRvIGhvbGQgdHJhbnNhY3Rpb24gcmVzdWx0CisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBsaW5kYV9pYl9lcGJfd2FpdCAoIHN0cnVjdCBsaW5kYSAqbGluZGEsCisJCQkgICAgc3RydWN0IFFJQl83MjIwX2lic2RfZXBiX3RyYW5zYWN0aW9uX3JlZyAqeGFjdCApIHsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIERpc2NhcmQgZmlyc3QgcmVhZCB0byBhbGxvdyBmb3Igc2lnbmFscyBjcm9zc2luZyBjbG9jayBkb21haW5zICovCisJbGluZGFfcmVhZHEgKCBsaW5kYSwgeGFjdCwgUUlCXzcyMjBfaWJzZF9lcGJfdHJhbnNhY3Rpb25fcmVnX29mZnNldCApOworCisJZm9yICggaSA9IDAgOyBpIDwgTElOREFfRVBCX1hBQ1RfTUFYX1dBSVRfVVMgOyBpKysgKSB7CisJCWxpbmRhX3JlYWRxICggbGluZGEsIHhhY3QsCisJCQkgICAgICBRSUJfNzIyMF9pYnNkX2VwYl90cmFuc2FjdGlvbl9yZWdfb2Zmc2V0ICk7CisJCWlmICggQklUX0dFVCAoIHhhY3QsIGliX2VwYl9yZHkgKSApIHsKKwkJCWlmICggQklUX0dFVCAoIHhhY3QsIGliX2VwYl9yZXFfZXJyb3IgKSApIHsKKwkJCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCBFUEIgdHJhbnNhY3Rpb24gIgorCQkJCSAgICAgICAiZmFpbGVkXG4iLCBsaW5kYSApOworCQkJCXJldHVybiAtRUlPOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQl1ZGVsYXkgKCAxICk7CisJfQorCisJREJHQyAoIGxpbmRhLCAiTGluZGEgJXAgdGltZWQgb3V0IHdhaXRpbmcgZm9yIElCIEVQQiB0cmFuc2FjdGlvblxuIiwKKwkgICAgICAgbGluZGEgKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyoqCisgKiBSZWxlYXNlIG93bmVyc2hpcCBvZiB0aGUgSUIgZXh0ZXJuYWwgcGFyYWxsZWwgYnVzCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICovCitzdGF0aWMgdm9pZCBsaW5kYV9pYl9lcGJfcmVsZWFzZSAoIHN0cnVjdCBsaW5kYSAqbGluZGEgKSB7CisJc3RydWN0IFFJQl83MjIwX2lic2RfZXBiX2FjY2Vzc19jdHJsIGFjY2VzczsKKworCW1lbXNldCAoICZhY2Nlc3MsIDAsIHNpemVvZiAoIGFjY2VzcyApICk7CisJQklUX0ZJTExfMSAoICZhY2Nlc3MsIHN3X2liX2VwYl9yZXEsIDAgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJmFjY2VzcywgUUlCXzcyMjBfaWJzZF9lcGJfYWNjZXNzX2N0cmxfb2Zmc2V0ICk7Cit9CisKKy8qKgorICogUmVhZCBkYXRhIHZpYSBJQiBleHRlcm5hbCBwYXJhbGxlbCBidXMKKyAqCisgKiBAdiBsaW5kYQkJTGluZGEgZGV2aWNlCisgKiBAdiBsb2NhdGlvbgkJRVBCIGxvY2F0aW9uCisgKiBAcmV0IGRhdGEJCURhdGEgcmVhZCwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqCisgKiBZb3UgbXVzdCBoYXZlIGFscmVhZHkgYWNxdWlyZWQgb3duZXJzaGlwIG9mIHRoZSBJQiBleHRlcm5hbAorICogcGFyYWxsZWwgYnVzLgorICovCitzdGF0aWMgaW50IGxpbmRhX2liX2VwYl9yZWFkICggc3RydWN0IGxpbmRhICpsaW5kYSwgdW5zaWduZWQgaW50IGxvY2F0aW9uICkgeworCXN0cnVjdCBRSUJfNzIyMF9pYnNkX2VwYl90cmFuc2FjdGlvbl9yZWcgeGFjdDsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwlpbnQgcmM7CisKKwkvKiBFbnN1cmUgbm8gdHJhbnNhY3Rpb24gaXMgY3VycmVudGx5IGluIHByb2dyZXNzICovCisJaWYgKCAoIHJjID0gbGluZGFfaWJfZXBiX3dhaXQgKCBsaW5kYSwgJnhhY3QgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBQcm9jZXNzIGRhdGEgKi8KKwltZW1zZXQgKCAmeGFjdCwgMCwgc2l6ZW9mICggeGFjdCApICk7CisJQklUX0ZJTExfMyAoICZ4YWN0LAorCQkgICAgIGliX2VwYl9hZGRyZXNzLCBMSU5EQV9FUEJfTE9DX0FERFJFU1MgKCBsb2NhdGlvbiApLAorCQkgICAgIGliX2VwYl9yZWFkX3dyaXRlLCBMSU5EQV9FUEJfUkVBRCwKKwkJICAgICBpYl9lcGJfY3MsIExJTkRBX0VQQl9MT0NfQ1MgKCBsb2NhdGlvbiApICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZ4YWN0LAorCQkgICAgICAgUUlCXzcyMjBfaWJzZF9lcGJfdHJhbnNhY3Rpb25fcmVnX29mZnNldCApOworCisJLyogV2FpdCBmb3IgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUgKi8KKwlpZiAoICggcmMgPSBsaW5kYV9pYl9lcGJfd2FpdCAoIGxpbmRhLCAmeGFjdCApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCWRhdGEgPSBCSVRfR0VUICggJnhhY3QsIGliX2VwYl9kYXRhICk7CisJcmV0dXJuIGRhdGE7Cit9CisKKy8qKgorICogV3JpdGUgZGF0YSB2aWEgSUIgZXh0ZXJuYWwgcGFyYWxsZWwgYnVzCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHYgbG9jYXRpb24JCUVQQiBsb2NhdGlvbgorICogQHYgZGF0YQkJRGF0YSB0byB3cml0ZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogWW91IG11c3QgaGF2ZSBhbHJlYWR5IGFjcXVpcmVkIG93bmVyc2hpcCBvZiB0aGUgSUIgZXh0ZXJuYWwKKyAqIHBhcmFsbGVsIGJ1cy4KKyAqLworc3RhdGljIGludCBsaW5kYV9pYl9lcGJfd3JpdGUgKCBzdHJ1Y3QgbGluZGEgKmxpbmRhLCB1bnNpZ25lZCBpbnQgbG9jYXRpb24sCisJCQkJdW5zaWduZWQgaW50IGRhdGEgKSB7CisJc3RydWN0IFFJQl83MjIwX2lic2RfZXBiX3RyYW5zYWN0aW9uX3JlZyB4YWN0OworCWludCByYzsKKworCS8qIEVuc3VyZSBubyB0cmFuc2FjdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi8KKwlpZiAoICggcmMgPSBsaW5kYV9pYl9lcGJfd2FpdCAoIGxpbmRhLCAmeGFjdCApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIFByb2Nlc3MgZGF0YSAqLworCW1lbXNldCAoICZ4YWN0LCAwLCBzaXplb2YgKCB4YWN0ICkgKTsKKwlCSVRfRklMTF80ICggJnhhY3QsCisJCSAgICAgaWJfZXBiX2RhdGEsIGRhdGEsCisJCSAgICAgaWJfZXBiX2FkZHJlc3MsIExJTkRBX0VQQl9MT0NfQUREUkVTUyAoIGxvY2F0aW9uICksCisJCSAgICAgaWJfZXBiX3JlYWRfd3JpdGUsIExJTkRBX0VQQl9XUklURSwKKwkJICAgICBpYl9lcGJfY3MsIExJTkRBX0VQQl9MT0NfQ1MgKCBsb2NhdGlvbiApICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZ4YWN0LAorCQkgICAgICAgUUlCXzcyMjBfaWJzZF9lcGJfdHJhbnNhY3Rpb25fcmVnX29mZnNldCApOworCisJLyogV2FpdCBmb3IgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUgKi8KKwlpZiAoICggcmMgPSBsaW5kYV9pYl9lcGJfd2FpdCAoIGxpbmRhLCAmeGFjdCApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlYWQvbW9kaWZ5L3dyaXRlIEVQQiByZWdpc3RlcgorICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEB2IGNzCQlDaGlwIHNlbGVjdAorICogQHYgY2hhbm5lbAkJQ2hhbm5lbAorICogQHYgZWxlbWVudAkJRWxlbWVudAorICogQHYgcmVnCQlSZWdpc3RlcgorICogQHYgdmFsdWUJCVZhbHVlIHRvIHNldAorICogQHYgbWFzawkJTWFzayB0byBhcHBseSB0byBvbGQgdmFsdWUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGxpbmRhX2liX2VwYl9tb2RfcmVnICggc3RydWN0IGxpbmRhICpsaW5kYSwgdW5zaWduZWQgaW50IGNzLAorCQkJCSAgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBlbGVtZW50LAorCQkJCSAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlLAorCQkJCSAgdW5zaWduZWQgaW50IG1hc2sgKSB7CisJdW5zaWduZWQgaW50IGxvY2F0aW9uOworCWludCBvbGRfdmFsdWU7CisJaW50IHJjOworCisJREJHX0RJU0FCTEUgKCBEQkdMVkxfSU8gKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWFzc2VydCAoICggdmFsdWUgJiBtYXNrICkgPT0gdmFsdWUgKTsKKworCS8qIEFjcXVpcmUgYnVzIG93bmVyc2hpcCAqLworCWlmICggKCByYyA9IGxpbmRhX2liX2VwYl9yZXF1ZXN0ICggbGluZGEgKSApICE9IDAgKQorCQlnb3RvIG91dDsKKworCS8qIFJlYWQgZXhpc3RpbmcgdmFsdWUsIGlmIG5lY2Vzc2FyeSAqLworCWxvY2F0aW9uID0gTElOREFfRVBCX0xPQyAoIGNzLCBjaGFubmVsLCBlbGVtZW50LCByZWcgKTsKKwlpZiAoICh+bWFzaykgJiAweGZmICkgeworCQlvbGRfdmFsdWUgPSBsaW5kYV9pYl9lcGJfcmVhZCAoIGxpbmRhLCBsb2NhdGlvbiApOworCQlpZiAoIG9sZF92YWx1ZSA8IDAgKSB7CisJCQlyYyA9IG9sZF92YWx1ZTsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CisJCX0KKwl9IGVsc2UgeworCQlvbGRfdmFsdWUgPSAwOworCX0KKworCS8qIFVwZGF0ZSB2YWx1ZSAqLworCXZhbHVlID0gKCAoIG9sZF92YWx1ZSAmIH5tYXNrICkgfCB2YWx1ZSApOworCURCR0NQICggbGluZGEsICJMaW5kYSAlcCBDUyAlZCBFUEIoJWQsJWQsJSMwMngpICUjMDJ4ID0+ICUjMDJ4XG4iLAorCQlsaW5kYSwgY3MsIGNoYW5uZWwsIGVsZW1lbnQsIHJlZywgb2xkX3ZhbHVlLCB2YWx1ZSApOworCWlmICggKCByYyA9IGxpbmRhX2liX2VwYl93cml0ZSAoIGxpbmRhLCBsb2NhdGlvbiwgdmFsdWUgKSApICE9IDAgKQorCQlnb3RvIG91dF9yZWxlYXNlOworCisgb3V0X3JlbGVhc2U6CisJLyogUmVsZWFzZSBidXMgKi8KKwlsaW5kYV9pYl9lcGJfcmVsZWFzZSAoIGxpbmRhICk7Cisgb3V0OgorCURCR19FTkFCTEUgKCBEQkdMVkxfSU8gKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogVHJhbnNmZXIgZGF0YSB0by9mcm9tIG1pY3JvY29udHJvbGxlciBSQU0KKyAqCisgKiBAdiBsaW5kYQkJTGluZGEgZGV2aWNlCisgKiBAdiBhZGRyZXNzCQlTdGFydGluZyBhZGRyZXNzCisgKiBAdiB3cml0ZQkJRGF0YSB0byB3cml0ZSwgb3IgTlVMTAorICogQHYgcmVhZAkJRGF0YSB0byByZWFkLCBvciBOVUxMCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBsaW5kYV9pYl9lcGJfcmFtX3hmZXIgKCBzdHJ1Y3QgbGluZGEgKmxpbmRhLCB1bnNpZ25lZCBpbnQgYWRkcmVzcywKKwkJCQkgICBjb25zdCB2b2lkICp3cml0ZSwgdm9pZCAqcmVhZCwKKwkJCQkgICBzaXplX3QgbGVuICkgeworCXVuc2lnbmVkIGludCBjb250cm9sOworCXVuc2lnbmVkIGludCBhZGRyZXNzX2hpOworCXVuc2lnbmVkIGludCBhZGRyZXNzX2xvOworCWludCBkYXRhOworCWludCByYzsKKworCURCR19ESVNBQkxFICggREJHTFZMX0lPICk7CisKKwlhc3NlcnQgKCAhICggd3JpdGUgJiYgcmVhZCApICk7CisJYXNzZXJ0ICggKCBhZGRyZXNzICUgTElOREFfRVBCX1VDX0NIVU5LX1NJWkUgKSA9PSAwICk7CisJYXNzZXJ0ICggKCBsZW4gJSBMSU5EQV9FUEJfVUNfQ0hVTktfU0laRSApID09IDAgKTsKKworCS8qIEFjcXVpcmUgYnVzIG93bmVyc2hpcCAqLworCWlmICggKCByYyA9IGxpbmRhX2liX2VwYl9yZXF1ZXN0ICggbGluZGEgKSApICE9IDAgKQorCQlnb3RvIG91dDsKKworCS8qIFByb2Nlc3MgZGF0YSAqLworCXdoaWxlICggbGVuICkgeworCisJCS8qIFJlc2V0IHRoZSBhZGRyZXNzIGZvciBlYWNoIG5ldyBjaHVuayAqLworCQlpZiAoICggYWRkcmVzcyAlIExJTkRBX0VQQl9VQ19DSFVOS19TSVpFICkgPT0gMCApIHsKKworCQkJLyogV3JpdGUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJCWNvbnRyb2wgPSAoIHJlYWQgPyBMSU5EQV9FUEJfVUNfQ1RMX1JFQUQgOgorCQkJCSAgICBMSU5EQV9FUEJfVUNfQ1RMX1dSSVRFICk7CisJCQlpZiAoICggcmMgPSBsaW5kYV9pYl9lcGJfd3JpdGUgKCBsaW5kYSwKKwkJCQkJCQkgTElOREFfRVBCX1VDX0NUTCwKKwkJCQkJCQkgY29udHJvbCApICkgIT0gMCApCisJCQkJYnJlYWs7CisKKwkJCS8qIFdyaXRlIHRoZSBhZGRyZXNzIHJlZ2lzdGVycyAqLworCQkJYWRkcmVzc19oaSA9ICggYWRkcmVzcyA+PiA4ICk7CisJCQlpZiAoICggcmMgPSBsaW5kYV9pYl9lcGJfd3JpdGUgKCBsaW5kYSwKKwkJCQkJCQkgTElOREFfRVBCX1VDX0FERFJfSEksCisJCQkJCQkJIGFkZHJlc3NfaGkgKSApICE9IDAgKQorCQkJCWJyZWFrOworCQkJYWRkcmVzc19sbyA9ICggYWRkcmVzcyAmIDB4ZmYgKTsKKwkJCWlmICggKCByYyA9IGxpbmRhX2liX2VwYl93cml0ZSAoIGxpbmRhLAorCQkJCQkJCSBMSU5EQV9FUEJfVUNfQUREUl9MTywKKwkJCQkJCQkgYWRkcmVzc19sbyApICkgIT0gMCApCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBSZWFkIG9yIHdyaXRlIHRoZSBkYXRhICovCisJCWlmICggcmVhZCApIHsKKwkJCWRhdGEgPSBsaW5kYV9pYl9lcGJfcmVhZCAoIGxpbmRhLCBMSU5EQV9FUEJfVUNfREFUQSApOworCQkJaWYgKCBkYXRhIDwgMCApIHsKKwkJCQlyYyA9IGRhdGE7CisJCQkJYnJlYWs7CisJCQl9CisJCQkqKCAoIHVpbnQ4X3QgKiApIHJlYWQrKyApID0gZGF0YTsKKwkJfSBlbHNlIHsKKwkJCWRhdGEgPSAqKCAoIHVpbnQ4X3QgKiApIHdyaXRlKysgKTsKKwkJCWlmICggKCByYyA9IGxpbmRhX2liX2VwYl93cml0ZSAoIGxpbmRhLAorCQkJCQkJCSBMSU5EQV9FUEJfVUNfREFUQSwKKwkJCQkJCQkgZGF0YSApICkgIT0gMCApCisJCQkJYnJlYWs7CisJCX0KKwkJYWRkcmVzcysrOworCQlsZW4tLTsKKworCQkvKiBSZXNldCB0aGUgY29udHJvbCBieXRlIGFmdGVyIGVhY2ggY2h1bmsgKi8KKwkJaWYgKCAoIGFkZHJlc3MgJSBMSU5EQV9FUEJfVUNfQ0hVTktfU0laRSApID09IDAgKSB7CisJCQlpZiAoICggcmMgPSBsaW5kYV9pYl9lcGJfd3JpdGUgKCBsaW5kYSwKKwkJCQkJCQkgTElOREFfRVBCX1VDX0NUTCwKKwkJCQkJCQkgMCApICkgIT0gMCApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBSZWxlYXNlIGJ1cyAqLworCWxpbmRhX2liX2VwYl9yZWxlYXNlICggbGluZGEgKTsKKworIG91dDoKKwlEQkdfRU5BQkxFICggREJHTFZMX0lPICk7CisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW5maW5pYmFuZCBTZXJEZXMgaW5pdGlhbGlzYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIEEgTGluZGEgU2VyRGVzIHBhcmFtZXRlciAqLworc3RydWN0IGxpbmRhX3NlcmRlc19wYXJhbSB7CisJLyoqIEVQQiBhZGRyZXNzIGFzIGNvbnN0cnVjdGVkIGJ5IExJTkRBX0VQQl9BRERSRVNTKCkgKi8KKwl1aW50MTZfdCBhZGRyZXNzOworCS8qKiBWYWx1ZSB0byBzZXQgKi8KKwl1aW50OF90IHZhbHVlOworCS8qKiBNYXNrIHRvIGFwcGx5IHRvIG9sZCB2YWx1ZSAqLworCXVpbnQ4X3QgbWFzazsKK30gX19wYWNrZWQ7CisKKy8qKiBNYWdpYyAiYWxsIGNoYW5uZWxzIiBjaGFubmVsIG51bWJlciAqLworI2RlZmluZSBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTIDMxCisKKy8qKiBFbmQgb2YgU2VyRGVzIHBhcmFtZXRlciBsaXN0IG1hcmtlciAqLworI2RlZmluZSBMSU5EQV9TRVJERVNfUEFSQU1fRU5EIHsgMCwgMCwgMCB9CisKKy8qKgorICogUHJvZ3JhbSBJQiBTZXJEZXMgcmVnaXN0ZXIocykKKyAqCisgKiBAdiBsaW5kYQkJTGluZGEgZGV2aWNlCisgKiBAdiBwYXJhbQkJU2VyRGVzIHBhcmFtZXRlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfc2V0X3NlcmRlc19wYXJhbSAoIHN0cnVjdCBsaW5kYSAqbGluZGEsCisJCQkJICAgIHN0cnVjdCBsaW5kYV9zZXJkZXNfcGFyYW0gKnBhcmFtICkgeworCXVuc2lnbmVkIGludCBjaGFubmVsOworCXVuc2lnbmVkIGludCBjaGFubmVsX3N0YXJ0OworCXVuc2lnbmVkIGludCBjaGFubmVsX2VuZDsKKwl1bnNpZ25lZCBpbnQgZWxlbWVudDsKKwl1bnNpZ25lZCBpbnQgcmVnOworCWludCByYzsKKworCS8qIEJyZWFrIGRvd24gdGhlIEVQQiBhZGRyZXNzIGFuZCBkZXRlcm1pbmUgY2hhbm5lbHMgKi8KKwljaGFubmVsID0gTElOREFfRVBCX0FERFJFU1NfQ0hBTk5FTCAoIHBhcmFtLT5hZGRyZXNzICk7CisJZWxlbWVudCA9IExJTkRBX0VQQl9BRERSRVNTX0VMRU1FTlQgKCBwYXJhbS0+YWRkcmVzcyApOworCXJlZyA9IExJTkRBX0VQQl9BRERSRVNTX1JFRyAoIHBhcmFtLT5hZGRyZXNzICk7CisJaWYgKCBjaGFubmVsID09IExJTkRBX0VQQl9BTExfQ0hBTk5FTFMgKSB7CisJCWNoYW5uZWxfc3RhcnQgPSAwOworCQljaGFubmVsX2VuZCA9IDM7CisJfSBlbHNlIHsKKwkJY2hhbm5lbF9zdGFydCA9IGNoYW5uZWxfZW5kID0gY2hhbm5lbDsKKwl9CisKKwkvKiBNb2RpZnkgcmVnaXN0ZXIgZm9yIGVhY2ggc3BlY2lmaWVkIGNoYW5uZWwgKi8KKwlmb3IgKCBjaGFubmVsID0gY2hhbm5lbF9zdGFydCA7IGNoYW5uZWwgPD0gY2hhbm5lbF9lbmQgOyBjaGFubmVsKysgKSB7CisJCWlmICggKCByYyA9IGxpbmRhX2liX2VwYl9tb2RfcmVnICggbGluZGEsIExJTkRBX0VQQl9DU19TRVJERVMsCisJCQkJCQkgICBjaGFubmVsLCBlbGVtZW50LCByZWcsCisJCQkJCQkgICBwYXJhbS0+dmFsdWUsCisJCQkJCQkgICBwYXJhbS0+bWFzayApICkgIT0gMCApCisJCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUHJvZ3JhbSBJQiBTZXJEZXMgcmVnaXN0ZXJzCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHYgcGFyYW0JCVNlckRlcyBwYXJhbWV0ZXJzCisgKiBAdiBjb3VudAkJTnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGxpbmRhX3NldF9zZXJkZXNfcGFyYW1zICggc3RydWN0IGxpbmRhICpsaW5kYSwKKwkJCQkgICAgIHN0cnVjdCBsaW5kYV9zZXJkZXNfcGFyYW0gKnBhcmFtcyApIHsKKwlpbnQgcmM7CisKKwlmb3IgKCA7IHBhcmFtcy0+bWFzayAhPSAwIDsgcGFyYW1zKysgKXsKKwkJaWYgKCAoIHJjID0gbGluZGFfc2V0X3NlcmRlc19wYXJhbSAoIGxpbmRhLAorCQkJCQkJCSBwYXJhbXMgKSApICE9IDAgKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIExJTkRBX0REU19WQUwoIGFtcF9kLCBtYWluX2QsIGlwc3RfZCwgaXByZV9kLAkJCVwKKwkJICAgICAgIGFtcF9zLCBtYWluX3MsIGlwc3RfcywgaXByZV9zICkJCQlcCisJeyBMSU5EQV9FUEJfQUREUkVTUyAoIExJTkRBX0VQQl9BTExfQ0hBTk5FTFMsIDksIDB4MDAgKSwJXAorCSAgKCAoICggYW1wX2QgJiAweDFmICkgPDwgMSApIHwgMSApLCAweGZmIH0sCQkJXAorCXsgTElOREFfRVBCX0FERFJFU1MgKCBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTLCA5LCAweDAxICksCVwKKwkgICggKCAoIGFtcF9zICYgMHgxZiApIDw8IDEgKSB8IDEgKSwgMHhmZiB9LAkJCVwKKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgOSwgMHgwOSApLAlcCisJICAoICggbWFpbl9kIDw8IDMgKSB8IDQgfCAoIGlwcmVfZCA+PiAyICkgKSwgMHhmZiB9LAkJXAorCXsgTElOREFfRVBCX0FERFJFU1MgKCBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTLCA5LCAweDBhICksCVwKKwkgICggKCBtYWluX3MgPDwgMyApIHwgNCB8ICggaXByZV9zID4+IDIgKSApLCAweGZmIH0sCQlcCisJeyBMSU5EQV9FUEJfQUREUkVTUyAoIExJTkRBX0VQQl9BTExfQ0hBTk5FTFMsIDksIDB4MDYgKSwJXAorCSAgKCAoICggaXBzdF9kICYgMHhmICkgPDwgMSApIHwJCQkJCVwKKwkgICAgKCAoIGlwcmVfZCAmIDMgKSA8PCA2ICkgfCAweDIxICksIDB4ZmYgfSwJCQlcCisJeyBMSU5EQV9FUEJfQUREUkVTUyAoIExJTkRBX0VQQl9BTExfQ0hBTk5FTFMsIDksIDB4MDcgKSwJXAorCSAgKCAoICggaXBzdF9zICYgMHhmICkgPDwgMSApIHwJCQkJCVwKKwkgICAgKCAoIGlwcmVfcyAmIDMgKSA8PCA2KSB8IDB4MjEgKSwgMHhmZiB9CisKKy8qKgorICogTGluZGEgU2VyRGVzIGRlZmF1bHQgcGFyYW1ldGVycworICoKKyAqIFRoZXNlIG1hZ2ljIHN0YXJ0LW9mLWRheSB2YWx1ZXMgYXJlIHRha2VuIGZyb20gdGhlIExpbnV4IGRyaXZlci4KKyAqLworc3RhdGljIHN0cnVjdCBsaW5kYV9zZXJkZXNfcGFyYW0gbGluZGFfc2VyZGVzX2RlZmF1bHRzMVtdID0geworCS8qIFJYSFNDVFJMMCAqLworCXsgTElOREFfRVBCX0FERFJFU1MgKCBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTLCA2LCAweDAwICksIDB4ZDQsIDB4ZmYgfSwKKwkvKiBWQ0RMX0RBQzIgKi8KKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgNiwgMHgwNSApLCAweDJkLCAweGZmIH0sCisJLyogVkNETF9DVFJMMiAqLworCXsgTElOREFfRVBCX0FERFJFU1MgKCBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTLCA2LCAweDA4ICksIDB4MDMsIDB4MGYgfSwKKwkvKiBTVEFSVF9FUTEgKi8KKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgNywgMHgyNyApLCAweDEwLCAweGZmIH0sCisJLyogU1RBUlRfRVEyICovCisJeyBMSU5EQV9FUEJfQUREUkVTUyAoIExJTkRBX0VQQl9BTExfQ0hBTk5FTFMsIDcsIDB4MjggKSwgMHgzMCwgMHhmZiB9LAorCS8qIEJBQ1RSTCAqLworCXsgTElOREFfRVBCX0FERFJFU1MgKCBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTLCA2LCAweDBlICksIDB4NDAsIDB4ZmYgfSwKKwkvKiBMRE9VVENUUkwxICovCisJeyBMSU5EQV9FUEJfQUREUkVTUyAoIExJTkRBX0VQQl9BTExfQ0hBTk5FTFMsIDcsIDB4MDYgKSwgMHgwNCwgMHhmZiB9LAorCS8qIFJYSFNTVEFUVVMgKi8KKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgNiwgMHgwZiApLCAweDA0LCAweGZmIH0sCisJLyogRW5kIG9mIHRoaXMgYmxvY2sgKi8KKwlMSU5EQV9TRVJERVNfUEFSQU1fRU5ECit9Oworc3RhdGljIHN0cnVjdCBsaW5kYV9zZXJkZXNfcGFyYW0gbGluZGFfc2VyZGVzX2RlZmF1bHRzMltdID0geworCS8qIExET1VUQ1RSTDEgKi8KKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgNywgMHgwNiApLCAweDAwLCAweGZmIH0sCisJLyogRERTIHZhbHVlcyAqLworCUxJTkRBX0REU19WQUwgKCAzMSwgMTksIDEyLCAwLCAyOSwgMjIsIDksIDAgKSwKKwkvKiBTZXQgUmN2IEVxLiB0byBQcmVzZXQgbm9kZSAqLworCXsgTElOREFfRVBCX0FERFJFU1MgKCBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTLCA3LCAweDI3ICksIDB4MTAsIDB4ZmYgfSwKKwkvKiBERkVMVEhGRFIgKi8KKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgNywgMHgwOCApLCAweDAwLCAweGZmIH0sCisJLyogREZFTFRISERSICovCisJeyBMSU5EQV9FUEJfQUREUkVTUyAoIExJTkRBX0VQQl9BTExfQ0hBTk5FTFMsIDcsIDB4MjEgKSwgMHgwMCwgMHhmZiB9LAorCS8qIFRMVEhGRFIgKi8KKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgNywgMHgwOSApLCAweDAyLCAweGZmIH0sCisJLyogVExUSEhEUiAqLworCXsgTElOREFfRVBCX0FERFJFU1MgKCBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTLCA3LCAweDIzICksIDB4MDIsIDB4ZmYgfSwKKwkvKiBaRlIgKi8KKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgNywgMHgxYiApLCAweDBjLCAweGZmIH0sCisJLyogWkNOVCkgKi8KKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgNywgMHgxYyApLCAweDBjLCAweGZmIH0sCisJLyogR0ZSICovCisJeyBMSU5EQV9FUEJfQUREUkVTUyAoIExJTkRBX0VQQl9BTExfQ0hBTk5FTFMsIDcsIDB4MWUgKSwgMHgxMCwgMHhmZiB9LAorCS8qIEdIUiAqLworCXsgTElOREFfRVBCX0FERFJFU1MgKCBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTLCA3LCAweDFmICksIDB4MTAsIDB4ZmYgfSwKKwkvKiBWQ0RMX0NUUkwwIHRvZ2dsZSAqLworCXsgTElOREFfRVBCX0FERFJFU1MgKCBMSU5EQV9FUEJfQUxMX0NIQU5ORUxTLCA2LCAweDA2ICksIDB4MjAsIDB4ZmYgfSwKKwl7IExJTkRBX0VQQl9BRERSRVNTICggTElOREFfRVBCX0FMTF9DSEFOTkVMUywgNiwgMHgwNiApLCAweDAwLCAweGZmIH0sCisJLyogQ01VQ1RSTDUgKi8KKwl7IExJTkRBX0VQQl9BRERSRVNTICgJCQkgICA3LCAwLCAweDE1ICksIDB4ODAsIDB4ZmYgfSwKKwkvKiBFbmQgb2YgdGhpcyBibG9jayAqLworCUxJTkRBX1NFUkRFU19QQVJBTV9FTkQKK307CitzdGF0aWMgc3RydWN0IGxpbmRhX3NlcmRlc19wYXJhbSBsaW5kYV9zZXJkZXNfZGVmYXVsdHMzW10gPSB7CisJLyogU1RBUlRfRVExICovCisJeyBMSU5EQV9FUEJfQUREUkVTUyAoIExJTkRBX0VQQl9BTExfQ0hBTk5FTFMsIDcsIDB4MjcgKSwgMHgwMCwgMHgzOCB9LAorCS8qIEVuZCBvZiB0aGlzIGJsb2NrICovCisJTElOREFfU0VSREVTX1BBUkFNX0VORAorfTsKKworLyoqCisgKiBQcm9ncmFtIHRoZSBtaWNyb2NvbnRyb2xsZXIgUkFNCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfcHJvZ3JhbV91Y19yYW0gKCBzdHJ1Y3QgbGluZGEgKmxpbmRhICkgeworCWludCByYzsKKworCWlmICggKCByYyA9IGxpbmRhX2liX2VwYl9yYW1feGZlciAoIGxpbmRhLCAwLCBsaW5kYV9pYl9mdywgTlVMTCwKKwkJCQkJICAgIHNpemVvZiAoIGxpbmRhX2liX2Z3ICkgKSApICE9IDAgKXsKKwkJREJHQyAoIGxpbmRhLCAiTGluZGEgJXAgY291bGQgbm90IGxvYWQgSUIgZmlybXdhcmU6ICVzXG4iLAorCQkgICAgICAgbGluZGEsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVmVyaWZ5IHRoZSBtaWNyb2NvbnRyb2xsZXIgUkFNCisgKgorICogQHYgbGluZGEJCUxpbmRhIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfdmVyaWZ5X3VjX3JhbSAoIHN0cnVjdCBsaW5kYSAqbGluZGEgKSB7CisJdWludDhfdCB2ZXJpZnlbTElOREFfRVBCX1VDX0NIVU5LX1NJWkVdOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJaW50IHJjOworCisJZm9yICggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IHNpemVvZiAoIGxpbmRhX2liX2Z3ICk7CisJICAgICAgb2Zmc2V0ICs9IHNpemVvZiAoIHZlcmlmeSApICkgeworCQlpZiAoICggcmMgPSBsaW5kYV9pYl9lcGJfcmFtX3hmZXIgKCBsaW5kYSwgb2Zmc2V0LAorCQkJCQkJICAgIE5VTEwsIHZlcmlmeSwKKwkJCQkJCSAgICBzaXplb2YgKHZlcmlmeSkgKSkgIT0gMCApeworCQkJREJHQyAoIGxpbmRhLCAiTGluZGEgJXAgY291bGQgbm90IHJlYWQgYmFjayBJQiAiCisJCQkgICAgICAgImZpcm13YXJlOiAlc1xuIiwgbGluZGEsIHN0cmVycm9yICggcmMgKSApOworCQkJcmV0dXJuIHJjOworCQl9CisJCWlmICggbWVtY21wICggKCBsaW5kYV9pYl9mdyArIG9mZnNldCApLCB2ZXJpZnksCisJCQkgICAgICBzaXplb2YgKCB2ZXJpZnkgKSApICE9IDAgKSB7CisJCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCBmaXJtd2FyZSB2ZXJpZmljYXRpb24gZmFpbGVkICIKKwkJCSAgICAgICAiYXQgb2Zmc2V0ICUjeFxuIiwgbGluZGEsIG9mZnNldCApOworCQkJREJHQ19IREEgKCBsaW5kYSwgb2Zmc2V0LCAoIGxpbmRhX2liX2Z3ICsgb2Zmc2V0ICksCisJCQkJICAgc2l6ZW9mICggdmVyaWZ5ICkgKTsKKwkJCURCR0NfSERBICggbGluZGEsIG9mZnNldCwgdmVyaWZ5LCBzaXplb2YgKCB2ZXJpZnkgKSApOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlEQkdDMiAoIGxpbmRhLCAiTGluZGEgJXAgZmlybXdhcmUgdmVyaWZpZWQgb2tcbiIsIGxpbmRhICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVXNlIHRoZSBtaWNyb2NvbnRyb2xsZXIgdG8gdHJpbSB0aGUgSUIgbGluaworICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGxpbmRhX3RyaW1faWIgKCBzdHJ1Y3QgbGluZGEgKmxpbmRhICkgeworCXN0cnVjdCBRSUJfNzIyMF9JQlNlckRlc0N0cmwgY3RybDsKKwlzdHJ1Y3QgUUlCXzcyMjBfSW50U3RhdHVzIGludHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmM7CisKKwkvKiBCcmluZyB0aGUgbWljcm9jb250cm9sbGVyIG91dCBvZiByZXNldCAqLworCWxpbmRhX3JlYWRxICggbGluZGEsICZjdHJsLCBRSUJfNzIyMF9JQlNlckRlc0N0cmxfb2Zmc2V0ICk7CisJQklUX1NFVCAoICZjdHJsLCBSZXNldElCX3VDX0NvcmUsIDAgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJmN0cmwsIFFJQl83MjIwX0lCU2VyRGVzQ3RybF9vZmZzZXQgKTsKKworCS8qIFdhaXQgZm9yIHRoZSAidHJpbSBkb25lIiBzaWduYWwgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBMSU5EQV9UUklNX0RPTkVfTUFYX1dBSVRfTVMgOyBpKysgKSB7CisJCWxpbmRhX3JlYWRxICggbGluZGEsICZpbnRzdGF0dXMsIFFJQl83MjIwX0ludFN0YXR1c19vZmZzZXQgKTsKKwkJaWYgKCBCSVRfR0VUICggJmludHN0YXR1cywgSUJTZXJkZXNUcmltRG9uZSApICkgeworCQkJcmMgPSAwOworCQkJZ290byBvdXRfcmVzZXQ7CisJCX0KKwkJbWRlbGF5ICggMSApOworCX0KKworCURCR0MgKCBsaW5kYSwgIkxpbmRhICVwIHRpbWVkIG91dCB3YWl0aW5nIGZvciB0cmltIGRvbmVcbiIsIGxpbmRhICk7CisJcmMgPSAtRVRJTUVET1VUOworIG91dF9yZXNldDoKKwkvKiBQdXQgdGhlIG1pY3JvY29udHJvbGxlciBiYWNrIGludG8gcmVzZXQgKi8KKwlCSVRfU0VUICggJmN0cmwsIFJlc2V0SUJfdUNfQ29yZSwgMSApOworCWxpbmRhX3dyaXRlcSAoIGxpbmRhLCAmY3RybCwgUUlCXzcyMjBfSUJTZXJEZXNDdHJsX29mZnNldCApOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEluaXRpYWxpc2UgdGhlIElCIFNlckRlcworICoKKyAqIEB2IGxpbmRhCQlMaW5kYSBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGxpbmRhX2luaXRfaWJfc2VyZGVzICggc3RydWN0IGxpbmRhICpsaW5kYSApIHsKKwlzdHJ1Y3QgUUlCXzcyMjBfQ29udHJvbCBjb250cm9sOworCXN0cnVjdCBRSUJfNzIyMF9JQkNDdHJsIGliY2N0cmw7CisJc3RydWN0IFFJQl83MjIwX0lCQ0REUkN0cmwgaWJjZGRyY3RybDsKKwlzdHJ1Y3QgUUlCXzcyMjBfWEdYU0NmZyB4Z3hzY2ZnOworCWludCByYzsKKworCS8qIERpc2FibGUgbGluayAqLworCWxpbmRhX3JlYWRxICggbGluZGEsICZjb250cm9sLCBRSUJfNzIyMF9Db250cm9sX29mZnNldCApOworCUJJVF9TRVQgKCAmY29udHJvbCwgTGlua0VuLCAwICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZjb250cm9sLCBRSUJfNzIyMF9Db250cm9sX29mZnNldCApOworCisJLyogQ29uZmlndXJlIHNlbnNpYmxlIGRlZmF1bHRzIGZvciBJQkMgKi8KKwltZW1zZXQgKCAmaWJjY3RybCwgMCwgc2l6ZW9mICggaWJjY3RybCApICk7CisJQklUX0ZJTExfNiAoICZpYmNjdHJsLCAvKiBUdW5pbmcgdmFsdWVzIHRha2VuIGZyb20gTGludXggZHJpdmVyICovCisJCSAgICAgRmxvd0N0cmxQZXJpb2QsIDB4MDMsCisJCSAgICAgRmxvd0N0cmxXYXRlck1hcmssIDB4MDUsCisJCSAgICAgTWF4UGt0TGVuLCAoICggTElOREFfUkVDVl9IRUFERVJfU0laRSArCisJCQkJICAgIExJTkRBX1JFQ1ZfUEFZTE9BRF9TSVpFICsKKwkJCQkgICAgNCAvKiBJQ1JDICovICkgPj4gMiApLAorCQkgICAgIFBoeWVyclRocmVzaG9sZCwgMHhmLAorCQkgICAgIE92ZXJydW5UaHJlc2hvbGQsIDB4ZiwKKwkJICAgICBDcmVkaXRTY2FsZSwgMHg0ICk7CisJbGluZGFfd3JpdGVxICggbGluZGEsICZpYmNjdHJsLCBRSUJfNzIyMF9JQkNDdHJsX29mZnNldCApOworCisJLyogRm9yY2UgU0RSIG9ubHkgdG8gYXZvaWQgbmVlZGluZyBhbGwgdGhlIEREUiB0dW5pbmcsCisJICogTWVsbGFub3ggY29tcGF0aWJpbGl0eSBoYWNrcyBldGMuICBTRFIgaXMgcGxlbnR5IGZvcgorCSAqIGJvb3QtdGltZSBvcGVyYXRpb24uCisJICovCisJbGluZGFfcmVhZHEgKCBsaW5kYSwgJmliY2RkcmN0cmwsIFFJQl83MjIwX0lCQ0REUkN0cmxfb2Zmc2V0ICk7CisJQklUX1NFVCAoICZpYmNkZHJjdHJsLCBJQl9FTkhBTkNFRF9NT0RFLCAwICk7CisJQklUX1NFVCAoICZpYmNkZHJjdHJsLCBTRF9TUEVFRF9TRFIsIDEgKTsKKwlCSVRfU0VUICggJmliY2RkcmN0cmwsIFNEX1NQRUVEX0REUiwgMCApOworCUJJVF9TRVQgKCAmaWJjZGRyY3RybCwgU0RfU1BFRURfUURSLCAwICk7CisJQklUX1NFVCAoICZpYmNkZHJjdHJsLCBIUlRCVF9FTkIsIDAgKTsKKwlCSVRfU0VUICggJmliY2RkcmN0cmwsIEhSVEJUX0FVVE8sIDAgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJmliY2RkcmN0cmwsIFFJQl83MjIwX0lCQ0REUkN0cmxfb2Zmc2V0ICk7CisKKwkvKiBTZXQgZGVmYXVsdCBTZXJEZXMgcGFyYW1ldGVycyAqLworCWlmICggKCByYyA9IGxpbmRhX3NldF9zZXJkZXNfcGFyYW1zICggbGluZGEsCisJCQkJCSAgICAgIGxpbmRhX3NlcmRlc19kZWZhdWx0czEgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJdWRlbGF5ICggNDE1ICk7IC8qIE1hZ2ljIGRlbGF5IHdoaWxlIFNlckRlcyBzb3J0cyBpdHNlbGYgb3V0ICovCisJaWYgKCAoIHJjID0gbGluZGFfc2V0X3NlcmRlc19wYXJhbXMgKCBsaW5kYSwKKwkJCQkJICAgICAgbGluZGFfc2VyZGVzX2RlZmF1bHRzMiApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIFByb2dyYW0gdGhlIG1pY3JvY29udHJvbGxlciBSQU0gKi8KKwlpZiAoICggcmMgPSBsaW5kYV9wcm9ncmFtX3VjX3JhbSAoIGxpbmRhICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogVmVyaWZ5IHRoZSBtaWNyb2NvbnRyb2xsZXIgUkFNIGNvbnRlbnRzICovCisJaWYgKCBEQkdMVkxfTE9HICkgeworCQlpZiAoICggcmMgPSBsaW5kYV92ZXJpZnlfdWNfcmFtICggbGluZGEgKSApICE9IDAgKQorCQkJcmV0dXJuIHJjOworCX0KKworCS8qIE1vcmUgU2VyRGVzIHR1bmluZyAqLworCWlmICggKCByYyA9IGxpbmRhX3NldF9zZXJkZXNfcGFyYW1zICggbGluZGEsCisJCQkJCSAgICAgIGxpbmRhX3NlcmRlc19kZWZhdWx0czMgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBVc2UgdGhlIG1pY3JvY29udHJvbGxlciB0byB0cmltIHRoZSBJQiBsaW5rICovCisJaWYgKCAoIHJjID0gbGluZGFfdHJpbV9pYiAoIGxpbmRhICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogQnJpbmcgWEdYUyBvdXQgb2YgcmVzZXQgKi8KKwlsaW5kYV9yZWFkcSAoIGxpbmRhLCAmeGd4c2NmZywgUUlCXzcyMjBfWEdYU0NmZ19vZmZzZXQgKTsKKwlCSVRfU0VUICggJnhneHNjZmcsIHR4X3J4X3Jlc2V0LCAwICk7CisJQklUX1NFVCAoICZ4Z3hzY2ZnLCB4Y3ZfcmVzZXQsIDAgKTsKKwlsaW5kYV93cml0ZXEgKCBsaW5kYSwgJnhneHNjZmcsIFFJQl83MjIwX1hHWFNDZmdfb2Zmc2V0ICk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQQ0kgbGF5ZXIgaW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogUHJvYmUgUENJIGRldmljZQorICoKKyAqIEB2IHBjaQkJUENJIGRldmljZQorICogQHYgaWQJCVBDSSBJRAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbGluZGFfcHJvYmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgaWJfZGV2aWNlICppYmRldjsKKwlzdHJ1Y3QgbGluZGEgKmxpbmRhOworCXN0cnVjdCBRSUJfNzIyMF9SZXZpc2lvbiByZXZpc2lvbjsKKwlpbnQgcmM7CisKKwkvKiBBbGxvY2F0ZSBJbmZpbmliYW5kIGRldmljZSAqLworCWliZGV2ID0gYWxsb2NfaWJkZXYgKCBzaXplb2YgKCAqbGluZGEgKSApOworCWlmICggISBpYmRldiApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19pYmRldjsKKwl9CisJcGNpX3NldF9kcnZkYXRhICggcGNpLCBpYmRldiApOworCWxpbmRhID0gaWJfZ2V0X2RydmRhdGEgKCBpYmRldiApOworCWliZGV2LT5vcCA9ICZsaW5kYV9pYl9vcGVyYXRpb25zOworCWliZGV2LT5kZXYgPSAmcGNpLT5kZXY7CisJaWJkZXYtPnBvcnQgPSAxOworCisJLyogRml4IHVwIFBDSSBkZXZpY2UgKi8KKwlhZGp1c3RfcGNpX2RldmljZSAoIHBjaSApOworCisJLyogR2V0IFBDSSBCQVJzICovCisJbGluZGEtPnJlZ3MgPSBpb3JlbWFwICggcGNpLT5tZW1iYXNlLCBMSU5EQV9CQVIwX1NJWkUgKTsKKwlEQkdDMiAoIGxpbmRhLCAiTGluZGEgJXAgaGFzIEJBUiBhdCAlMDhseFxuIiwgbGluZGEsIHBjaS0+bWVtYmFzZSApOworCisJLyogUHJpbnQgc29tZSBnZW5lcmFsIGRhdGEgKi8KKwlsaW5kYV9yZWFkcSAoIGxpbmRhLCAmcmV2aXNpb24sIFFJQl83MjIwX1JldmlzaW9uX29mZnNldCApOworCURCR0MyICggbGluZGEsICJMaW5kYSAlcCBib2FyZCAlMDJseCB2JWxkLiVsZC4lbGQuJWxkXG4iLCBsaW5kYSwKKwkJQklUX0dFVCAoICZyZXZpc2lvbiwgQm9hcmRJRCApLAorCQlCSVRfR0VUICggJnJldmlzaW9uLCBSX1NXICksCisJCUJJVF9HRVQgKCAmcmV2aXNpb24sIFJfQXJjaCApLAorCQlCSVRfR0VUICggJnJldmlzaW9uLCBSX0NoaXBSZXZNYWpvciApLAorCQlCSVRfR0VUICggJnJldmlzaW9uLCBSX0NoaXBSZXZNaW5vciApICk7CisKKwkvKiBSZWNvcmQgbGluayBjYXBhYmlsaXRpZXMuICBOb3RlIHRoYXQgd2UgZm9yY2UgU0RSIG9ubHkgdG8KKwkgKiBhdm9pZCBoYXZpbmcgdG8gY2FycnkgZXh0cmEgY29kZSBmb3IgRERSIHR1bmluZyBldGMuCisJICovCisJaWJkZXYtPmxpbmtfd2lkdGhfZW5hYmxlZCA9IGliZGV2LT5saW5rX3dpZHRoX3N1cHBvcnRlZCA9CisJCSggSUJfTElOS19XSURUSF80WCB8IElCX0xJTktfV0lEVEhfMVggKTsKKwlpYmRldi0+bGlua19zcGVlZF9lbmFibGVkID0gaWJkZXYtPmxpbmtfc3BlZWRfc3VwcG9ydGVkID0KKwkJSUJfTElOS19TUEVFRF9TRFI7CisKKwkvKiBJbml0aWFsaXNlIEkyQyBzdWJzeXN0ZW0gKi8KKwlpZiAoICggcmMgPSBsaW5kYV9pbml0X2kyYyAoIGxpbmRhICkgKSAhPSAwICkKKwkJZ290byBlcnJfaW5pdF9pMmM7CisKKwkvKiBSZWFkIEVFUFJPTSBwYXJhbWV0ZXJzICovCisJaWYgKCAoIHJjID0gbGluZGFfcmVhZF9lZXByb20gKCBsaW5kYSwgJmliZGV2LT5naWQudS5oYWxmWzFdICkgKSAhPSAwICkKKwkJZ290byBlcnJfcmVhZF9lZXByb207CisKKwkvKiBJbml0aWFsaXNlIHNlbmQgZGF0YXBhdGggKi8KKwlpZiAoICggcmMgPSBsaW5kYV9pbml0X3NlbmQgKCBsaW5kYSApICkgIT0gMCApCisJCWdvdG8gZXJyX2luaXRfc2VuZDsKKworCS8qIEluaXRpYWxpc2UgcmVjZWl2ZSBkYXRhcGF0aCAqLworCWlmICggKCByYyA9IGxpbmRhX2luaXRfcmVjdiAoIGxpbmRhICkgKSAhPSAwICkKKwkJZ290byBlcnJfaW5pdF9yZWN2OworCisJLyogSW5pdGlhbGlzZSB0aGUgSUIgU2VyRGVzICovCisJaWYgKCAoIHJjID0gbGluZGFfaW5pdF9pYl9zZXJkZXMgKCBsaW5kYSApICkgIT0gMCApCisJCWdvdG8gZXJyX2luaXRfaWJfc2VyZGVzOworCisJLyogUmVnaXN0ZXIgSW5maW5pYmFuZCBkZXZpY2UgKi8KKwlpZiAoICggcmMgPSByZWdpc3Rlcl9pYmRldiAoIGliZGV2ICkgKSAhPSAwICkgeworCQlEQkdDICggbGluZGEsICJMaW5kYSAlcCBjb3VsZCBub3QgcmVnaXN0ZXIgSUIgIgorCQkgICAgICAgImRldmljZTogJXNcbiIsIGxpbmRhLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfcmVnaXN0ZXJfaWJkZXY7CisJfQorCisJcmV0dXJuIDA7CisKKwl1bnJlZ2lzdGVyX2liZGV2ICggaWJkZXYgKTsKKyBlcnJfcmVnaXN0ZXJfaWJkZXY6CisJbGluZGFfZmluaV9yZWN2ICggbGluZGEgKTsKKyBlcnJfaW5pdF9yZWN2OgorCWxpbmRhX2Zpbmlfc2VuZCAoIGxpbmRhICk7CisgZXJyX2luaXRfc2VuZDoKKyBlcnJfaW5pdF9pYl9zZXJkZXM6CisgZXJyX3JlYWRfZWVwcm9tOgorIGVycl9pbml0X2kyYzoKKwlpYmRldl9wdXQgKCBpYmRldiApOworIGVycl9hbGxvY19pYmRldjoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVtb3ZlIFBDSSBkZXZpY2UKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbGluZGFfcmVtb3ZlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKwlzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAoIHBjaSApOworCXN0cnVjdCBsaW5kYSAqbGluZGEgPSBpYl9nZXRfZHJ2ZGF0YSAoIGliZGV2ICk7CisKKwl1bnJlZ2lzdGVyX2liZGV2ICggaWJkZXYgKTsKKwlsaW5kYV9maW5pX3JlY3YgKCBsaW5kYSApOworCWxpbmRhX2Zpbmlfc2VuZCAoIGxpbmRhICk7CisJaWJkZXZfcHV0ICggaWJkZXYgKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGxpbmRhX25pY3NbXSA9IHsKKwlQQ0lfUk9NICggMHgxMDc3LCAweDcyMjAsICJpYmE3MjIwIiwgIlFMRTcyNDAvNzI4MCBIQ0EgZHJpdmVyIiwgMCApLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgbGluZGFfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzID0gbGluZGFfbmljcywKKwkuaWRfY291bnQgPSAoIHNpemVvZiAoIGxpbmRhX25pY3MgKSAvIHNpemVvZiAoIGxpbmRhX25pY3NbMF0gKSApLAorCS5wcm9iZSA9IGxpbmRhX3Byb2JlLAorCS5yZW1vdmUgPSBsaW5kYV9yZW1vdmUsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL2xpbmRhLmggYi9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvbGluZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDY4NDIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL2xpbmRhLmgKQEAgLTAsMCArMSwyNzYgQEAKKyNpZm5kZWYgX0xJTkRBX0gKKyNkZWZpbmUgX0xJTkRBX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFFMb2dpYyBMaW5kYSBJbmZpbmliYW5kIEhDQQorICoKKyAqLworCisjZGVmaW5lIEJJVE9QU19MSVRUTEVfRU5ESUFOCisjaW5jbHVkZSA8Z3B4ZS9iaXRvcHMuaD4KKyNpbmNsdWRlICJxaWJfNzIyMF9yZWdzLmgiCisKK3N0cnVjdCBpYl9kZXZpY2U7CisKKy8qKiBBIExpbmRhIEdQSU8gcmVnaXN0ZXIgKi8KK3N0cnVjdCBRSUJfNzIyMF9HUElPX3BiIHsKKwlwc2V1ZG9fYml0X3QgR1BJT1sxNl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzQ4XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfR1BJTyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfR1BJT19wYiApOworfTsKKworLyoqIEEgTGluZGEgZ2VuZXJhbCBzY2FsYXIgcmVnaXN0ZXIgKi8KK3N0cnVjdCBRSUJfNzIyMF9zY2FsYXJfcGIgeworCXBzZXVkb19iaXRfdCBWYWx1ZVs2NF07Cit9Oworc3RydWN0IFFJQl83MjIwX3NjYWxhciB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfc2NhbGFyX3BiICk7Cit9OworCisvKiogTGluZGEgc2VuZCBwZXItYnVmZmVyIGNvbnRyb2wgd29yZCAqLworc3RydWN0IFFJQl83MjIwX1NlbmRQYmNfcGIgeworCXBzZXVkb19iaXRfdCBMZW5ndGhQMV90b2liY1sxMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVs0XTsKKwlwc2V1ZG9fYml0X3QgTGVuZ3RoUDFfdHJpZ2dlclsxMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMlszXTsKKwlwc2V1ZG9fYml0X3QgVGVzdEVicFsxXTsKKwlwc2V1ZG9fYml0X3QgVGVzdFsxXTsKKwlwc2V1ZG9fYml0X3QgSW50clsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQzWzMxXTsKKwlwc2V1ZG9fYml0X3QgVkwxNVsxXTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfU2VuZFBiYyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfU2VuZFBiY19wYiApOworfTsKKworLyoqIExpbmRhIHNlbmQgYnVmZmVyIGF2YWlsYWJpbGl0eSAqLworc3RydWN0IFFJQl83MjIwX1NlbmRCdWZBdmFpbF9wYiB7CisJcHNldWRvX2JpdF90IEluVXNlQ2hlY2tbMTQ0XVsyXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMzJdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9TZW5kQnVmQXZhaWwgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1NlbmRCdWZBdmFpbF9wYiApOworfTsKKworLyoqIERNQSBhbGlnbm1lbnQgZm9yIHNlbmQgYnVmZmVyIGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBMSU5EQV9TRU5EQlVGQVZBSUxfQUxJR04gNjQKKworLyoqIEEgTGluZGEgZWFnZXIgcmVjZWl2ZSBkZXNjcmlwdG9yICovCitzdHJ1Y3QgUUlCXzcyMjBfUmN2RWdyX3BiIHsKKwlwc2V1ZG9fYml0X3QgQWRkclszN107CisJcHNldWRvX2JpdF90IEJ1ZlNpemVbM107CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzI0XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfUmN2RWdyIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9SY3ZFZ3JfcGIgKTsKK307CisKKy8qKiBMaW5kYSByZWNlaXZlIGhlYWRlciBmbGFncyAqLworc3RydWN0IFFJQl83MjIwX1JjdkhkckZsYWdzX3BiIHsKKwlwc2V1ZG9fYml0X3QgUGt0TGVuWzExXTsKKwlwc2V1ZG9fYml0X3QgUmN2VHlwZVszXTsKKwlwc2V1ZG9fYml0X3QgU29mdEJbMV07CisJcHNldWRvX2JpdF90IFNvZnRBWzFdOworCXBzZXVkb19iaXRfdCBFZ3JJbmRleFsxMl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVszXTsKKwlwc2V1ZG9fYml0X3QgVXNlRWdyQmZyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZTZXFbNF07CisJcHNldWRvX2JpdF90IEhkcnFPZmZzZXRbMTFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZDJbOF07CisJcHNldWRvX2JpdF90IElCRXJyWzFdOworCXBzZXVkb19iaXRfdCBNS0VyclsxXTsKKwlwc2V1ZG9fYml0X3QgVElERXJyWzFdOworCXBzZXVkb19iaXRfdCBLSGRyRXJyWzFdOworCXBzZXVkb19iaXRfdCBNVFVFcnJbMV07CisJcHNldWRvX2JpdF90IExlbkVyclsxXTsKKwlwc2V1ZG9fYml0X3QgUGFyaXR5RXJyWzFdOworCXBzZXVkb19iaXRfdCBWQ1JDRXJyWzFdOworCXBzZXVkb19iaXRfdCBJQ1JDRXJyWzFdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJGbGFncyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRyRmxhZ3NfcGIgKTsKK307CisKKy8qKiBMaW5kYSBtZW1vcnkgQkFSIHNpemUgKi8KKyNkZWZpbmUgTElOREFfQkFSMF9TSVpFIDB4NDAwMDAwCisKKy8qKiBMaW5kYSBJMkMgU0NMIGxpbmUgR1BJTyBudW1iZXIgKi8KKyNkZWZpbmUgTElOREFfR1BJT19TQ0wgMAorCisvKiogTGluZGEgSTJDIFNEQSBsaW5lIEdQSU8gbnVtYmVyICovCisjZGVmaW5lIExJTkRBX0dQSU9fU0RBIDEKKworLyoqIEdVSUQgb2Zmc2V0IHdpdGhpbiBFRVBST00gKi8KKyNkZWZpbmUgTElOREFfRUVQUk9NX0dVSURfT0ZGU0VUIDMKKworLyoqIEdVSUQgc2l6ZSB3aXRoaW4gRUVQUk9NICovCisjZGVmaW5lIExJTkRBX0VFUFJPTV9HVUlEX1NJWkUgOAorCisvKiogQm9hcmQgc2VyaWFsIG51bWJlciBvZmZzZXQgd2l0aGluIEVFUFJPTSAqLworI2RlZmluZSBMSU5EQV9FRVBST01fU0VSSUFMX09GRlNFVCAxMgorCisvKiogQm9hcmQgc2VyaWFsIG51bWJlciBzaXplIHdpdGhpbiBFRVBST00gKi8KKyNkZWZpbmUgTElOREFfRUVQUk9NX1NFUklBTF9TSVpFIDEyCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBzZW5kIGJ1ZmZlcnMgdXNlZAorICoKKyAqIFRoaXMgaXMgYSBwb2xpY3kgZGVjaXNpb24uICBNdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdG90YWwKKyAqIG51bWJlciBvZiBzZW5kIGJ1ZmZlcnMgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSAoMTI4KS4KKyAqLworI2RlZmluZSBMSU5EQV9NQVhfU0VORF9CVUZTIDMyCisKKy8qKiBMaW5kYSBzZW5kIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIExJTkRBX1NFTkRfQlVGX1NJWkUgNDA5NgorCisvKiogTnVtYmVyIG9mIGNvbnRleHRzIChpbmNsdWRpbmcga2VybmVsIGNvbnRleHQpCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbi4gIE11c3QgYmUgNSwgOSBvciAxNy4KKyAqLworI2RlZmluZSBMSU5EQV9OVU1fQ09OVEVYVFMgNQorCisvKiogUG9ydENmZyB2YWx1ZXMgZm9yIGRpZmZlcmVudCBudW1iZXJzIG9mIGNvbnRleHRzICovCitlbnVtIGxpbmRhX3BvcnRjZmcgeworCUxJTkRBX1BPUlRDRkdfNUNUWCA9IDAsCisJTElOREFfUE9SVENGR185Q1RYID0gMSwKKwlMSU5EQV9QT1JUQ0ZHXzE3Q1RYID0gMiwKK307CisKKy8qKiBQb3J0Q2ZnIHZhbHVlcyBmb3IgZGlmZmVyZW50IG51bWJlcnMgb2YgY29udGV4dHMgKi8KKyNkZWZpbmUgTElOREFfRUFHRVJfQVJSQVlfU0laRV81Q1RYXzAgMjA0OAorI2RlZmluZSBMSU5EQV9FQUdFUl9BUlJBWV9TSVpFXzVDVFhfT1RIRVIgNDA5NgorI2RlZmluZSBMSU5EQV9FQUdFUl9BUlJBWV9TSVpFXzlDVFhfMCAyMDQ4CisjZGVmaW5lIExJTkRBX0VBR0VSX0FSUkFZX1NJWkVfOUNUWF9PVEhFUiAyMDQ4CisjZGVmaW5lIExJTkRBX0VBR0VSX0FSUkFZX1NJWkVfMTdDVFhfMCAyMDQ4CisjZGVmaW5lIExJTkRBX0VBR0VSX0FSUkFZX1NJWkVfMTdDVFhfT1RIRVIgMTAyNAorCisvKiogRWFnZXIgYnVmZmVyIHJlcXVpcmVkIGFsaWdubWVudCAqLworI2RlZmluZSBMSU5EQV9FQUdFUl9CVUZGRVJfQUxJR04gMjA0OAorCisvKiogRWFnZXIgYnVmZmVyIHNpemUgZW5jb2RpbmdzICovCitlbnVtIGxpbmRhX2VhZ2VyX2J1ZmZlcl9zaXplIHsKKwlMSU5EQV9FQUdFUl9CVUZGRVJfTk9ORSA9IDAsCisJTElOREFfRUFHRVJfQlVGRkVSXzJLID0gMSwKKwlMSU5EQV9FQUdFUl9CVUZGRVJfNEsgPSAyLAorCUxJTkRBX0VBR0VSX0JVRkZFUl84SyA9IDMsCisJTElOREFfRUFHRVJfQlVGRkVSXzE2SyA9IDQsCisJTElOREFfRUFHRVJfQlVGRkVSXzMySyA9IDUsCisJTElOREFfRUFHRVJfQlVGRkVSXzY0SyA9IDYsCit9OworCisvKiogTnVtYmVyIG9mIFJYIGhlYWRlcnMgcGVyIGNvbnRleHQKKyAqCisgKiBUaGlzIGlzIGEgcG9saWN5IGRlY2lzaW9uLgorICovCisjZGVmaW5lIExJTkRBX1JFQ1ZfSEVBREVSX0NPVU5UIDgKKworLyoqIE1heGltdW0gc2l6ZSBvZiBlYWNoIFJYIGhlYWRlcgorICoKKyAqIFRoaXMgaXMgYSBwb2xpY3kgZGVjaXNpb24uICBNdXN0IGJlIGRpdmlzaWJsZSBieSA0LgorICovCisjZGVmaW5lIExJTkRBX1JFQ1ZfSEVBREVSX1NJWkUgOTYKKworLyoqIFRvdGFsIHNpemUgb2YgYW4gUlggaGVhZGVyIHJpbmcgKi8KKyNkZWZpbmUgTElOREFfUkVDVl9IRUFERVJTX1NJWkUgXAorCSggTElOREFfUkVDVl9IRUFERVJfU0laRSAqIExJTkRBX1JFQ1ZfSEVBREVSX0NPVU5UICkKKworLyoqIFJYIGhlYWRlciBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgTElOREFfUkVDVl9IRUFERVJTX0FMSUdOIDY0CisKKy8qKiBSWCBwYXlsb2FkIHNpemUKKyAqCisgKiBUaGlzIGlzIGEgcG9saWN5IGRlY2lzaW9uLiAgTXVzdCBiZSBhIHZhbGlkIGVhZ2VyIGJ1ZmZlciBzaXplLgorICovCisjZGVmaW5lIExJTkRBX1JFQ1ZfUEFZTE9BRF9TSVpFIDIwNDgKKworLyoqIFFQTiB1c2VkIGZvciBJbmZpbmlwYXRoIFBhY2tldHMKKyAqCisgKiBUaGlzIGlzIGEgcG9saWN5IGRlY2lzaW9uLiAgTXVzdCBoYXZlIGJpdCAwIGNsZWFyLiAgTXVzdCBub3QgYmUgYQorICogUVBOIHRoYXQgd2Ugd2lsbCB1c2UuCisgKi8KKyNkZWZpbmUgTElOREFfUVBfSURFVEggMHhkZWFkMAorCisvKiogTWF4aW11bSB0aW1lIGZvciB3YWl0IGZvciBleHRlcm5hbCBwYXJhbGxlbCBidXMgcmVxdWVzdCwgaW4gdXMgKi8KKyNkZWZpbmUgTElOREFfRVBCX1JFUVVFU1RfTUFYX1dBSVRfVVMgNTAwCisKKy8qKiBNYXhpbXVtIHRpbWUgZm9yIHdhaXQgZm9yIGV4dGVybmFsIHBhcmFsbGVsIGJ1cyB0cmFuc2FjdGlvbiwgaW4gdXMgKi8KKyNkZWZpbmUgTElOREFfRVBCX1hBQ1RfTUFYX1dBSVRfVVMgNTAwCisKKy8qKiBMaW5kYSBleHRlcm5hbCBwYXJhbGxlbCBidXMgY2hpcCBzZWxlY3RzICovCisjZGVmaW5lIExJTkRBX0VQQl9DU19TRVJERVMgMQorI2RlZmluZSBMSU5EQV9FUEJfQ1NfVUMgMgorCisvKiogTGluZGEgZXh0ZXJuYWwgcGFyYWxsZWwgYnVzIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyAqLworI2RlZmluZSBMSU5EQV9FUEJfV1JJVEUgMAorI2RlZmluZSBMSU5EQV9FUEJfUkVBRCAxCisKKy8qKiBMaW5kYSBleHRlcm5hbCBwYXJhbGxlbCBidXMgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisjZGVmaW5lIExJTkRBX0VQQl9BRERSRVNTKCBfY2hhbm5lbCwgX2VsZW1lbnQsIF9yZWcgKSBcCisJKCAoX2VsZW1lbnQpIHwgKCAoX2NoYW5uZWwpIDw8IDQgKSB8ICggKF9yZWcpIDw8IDkgKSApCisjZGVmaW5lIExJTkRBX0VQQl9BRERSRVNTX0NIQU5ORUwoIF9hZGRyZXNzICkJKCAoIChfYWRkcmVzcykgPj4gNCApICYgMHgxZiApCisjZGVmaW5lIExJTkRBX0VQQl9BRERSRVNTX0VMRU1FTlQoIF9hZGRyZXNzICkJKCAoIChfYWRkcmVzcykgPj4gMCApICYgMHgwZiApCisjZGVmaW5lIExJTkRBX0VQQl9BRERSRVNTX1JFRyggX2FkZHJlc3MgKQkoICggKF9hZGRyZXNzKSA+PiA5ICkgJiAweDNmICkKKworLyoqIExpbmRhIGV4dGVybmFsIHBhcmFsbGVsIGJ1cyBsb2NhdGlvbnMKKyAqCisgKiBUaGUgbG9jYXRpb24gaXMgdXNlZCBieSB0aGUgZHJpdmVyIHRvIGVuY29kZSBib3RoIHRoZSBjaGlwIHNlbGVjdAorICogYW5kIHRoZSBFUEIgYWRkcmVzcy4KKyAqLworI2RlZmluZSBMSU5EQV9FUEJfTE9DKCBfY3MsIF9jaGFubmVsLCBfZWxlbWVudCwgX3JlZykgXAorCSggKCAoX2NzKSA8PCAxNiApIHwgTElOREFfRVBCX0FERFJFU1MgKCBfY2hhbm5lbCwgX2VsZW1lbnQsIF9yZWcgKSApCisjZGVmaW5lIExJTkRBX0VQQl9MT0NfQUREUkVTUyggX2xvYyApCSggKF9sb2MpICYgMHhmZmZmICkKKyNkZWZpbmUgTElOREFfRVBCX0xPQ19DUyggX2xvYyApCSggKF9sb2MpID4+IDE2ICkKKworLyoqIExpbmRhIGV4dGVybmFsIHBhcmFsbGVsIGJ1cyBtaWNyb2NvbnRyb2xsZXIgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisjZGVmaW5lIExJTkRBX0VQQl9VQ19DSEFOTkVMIDYKKyNkZWZpbmUgTElOREFfRVBCX1VDX0xPQyggX3JlZyApIFwKKwlMSU5EQV9FUEJfTE9DICggTElOREFfRVBCX0NTX1VDLCBMSU5EQV9FUEJfVUNfQ0hBTk5FTCwgMCwgKF9yZWcpICkKKyNkZWZpbmUgTElOREFfRVBCX1VDX0NUTAlMSU5EQV9FUEJfVUNfTE9DICggMCApCisjZGVmaW5lIExJTkRBX0VQQl9VQ19DVExfV1JJVEUJMQorI2RlZmluZSBMSU5EQV9FUEJfVUNfQ1RMX1JFQUQJMgorI2RlZmluZSBMSU5EQV9FUEJfVUNfQUREUl9MTwlMSU5EQV9FUEJfVUNfTE9DICggMiApCisjZGVmaW5lIExJTkRBX0VQQl9VQ19BRERSX0hJCUxJTkRBX0VQQl9VQ19MT0MgKCAzICkKKyNkZWZpbmUgTElOREFfRVBCX1VDX0RBVEEJTElOREFfRVBCX1VDX0xPQyAoIDQgKQorI2RlZmluZSBMSU5EQV9FUEJfVUNfQ0hVTktfU0laRQk2NAorCitleHRlcm4gdWludDhfdCBsaW5kYV9pYl9md1s4MTkyXTsKKworLyoqIE1heGltdW0gdGltZSB0byB3YWl0IGZvciAidHJpbSBkb25lIiBzaWduYWwsIGluIG1zICovCisjZGVmaW5lIExJTkRBX1RSSU1fRE9ORV9NQVhfV0FJVF9NUyAxMDAwCisKKy8qKiBMaW5kYSBsaW5rIHN0YXRlcyAqLworZW51bSBsaW5kYV9saW5rX3N0YXRlIHsKKwlMSU5EQV9MSU5LX1NUQVRFX0RPV04gPSAwLAorCUxJTkRBX0xJTktfU1RBVEVfSU5JVCA9IDEsCisJTElOREFfTElOS19TVEFURV9BUk0gPSAyLAorCUxJTkRBX0xJTktfU1RBVEVfQUNUSVZFID0gMywKKwlMSU5EQV9MSU5LX1NUQVRFX0FDVF9ERUZFUiA9IDQsCit9OworCisvKiogTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGxpbmsgc3RhdGUgY2hhbmdlcywgaW4gdXMgKi8KKyNkZWZpbmUgTElOREFfTElOS19TVEFURV9NQVhfV0FJVF9VUyAyMAorCisjZW5kaWYgLyogX0xJTkRBX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9saW5kYV9mdy5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL2xpbmRhX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4YTVmOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9saW5kYV9mdy5jCkBAIC0wLDAgKzEsMTA2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBRTG9naWMgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTsKKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWVtb3J5IGltYWdlIGZyb20gdGhlIHZlbmRvciwgdG8gYmUgY29waWVkIGludG8KKyAqIHRoZSBJQiBTRVJERVMgb2YgdGhlIElCQTcyMjAgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICogVGhlIGZpbGUgYWxzbyBpbmNsdWRlcyB0aGUgdHdvIGZ1bmN0aW9ucyB3aGljaCB1c2UgdGhpcyBpbWFnZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGluZGEuaCIKKwordWludDhfdCBsaW5kYV9pYl9md1s4MTkyXSA9IHsKKy8qMDAwMCovMHgwMiwgMHgwQSwgMHgyOSwgMHgwMiwgMHgwQSwgMHg4NywgMHhFNSwgMHhFNiwKKwkweDMwLCAweEU2LCAweDA0LCAweDdGLCAweDAxLCAweDgwLCAweDAyLCAweDdGLAorLyowMDEwKi8weDAwLCAweEU1LCAweEUyLCAweDMwLCAweEU0LCAweDA0LCAweDdFLCAweDAxLAorCTB4ODAsIDB4MDIsIDB4N0UsIDB4MDAsIDB4RUUsIDB4NUYsIDB4NjAsIDB4MDgsCisvKjAwMjAqLzB4NTMsIDB4RjksIDB4RjcsIDB4RTQsIDB4RjUsIDB4RkUsIDB4ODAsIDB4MDgsCisJMHg3RiwgMHgwQSwgMHgxMiwgMHgxNywgMHgzMSwgMHgxMiwgMHgwRSwgMHhBMiwKKy8qMDAzMCovMHg3NSwgMHhGQywgMHgwOCwgMHhFNCwgMHhGNSwgMHhGRCwgMHhFNSwgMHhFNywKKwkweDIwLCAweEU3LCAweDAzLCAweDQzLCAweEY5LCAweDA4LCAweDIyLCAweDAwLAorLyowMDQwKi8weDAxLCAweDIwLCAweDExLCAweDAwLCAweDA0LCAweDIwLCAweDAwLCAweDc1LAorCTB4NTEsIDB4MDEsIDB4RTQsIDB4RjUsIDB4NTIsIDB4RjUsIDB4NTMsIDB4RjUsCisvKjAwNTAqLzB4NTIsIDB4RjUsIDB4N0UsIDB4N0YsIDB4MDQsIDB4MDIsIDB4MDQsIDB4MzgsCisJMHhDMiwgMHgzNiwgMHgwNSwgMHg1MiwgMHhFNSwgMHg1MiwgMHhEMywgMHg5NCwKKy8qMDA2MCovMHgwQywgMHg0MCwgMHgwNSwgMHg3NSwgMHg1MiwgMHgwMSwgMHhEMiwgMHgzNiwKKwkweDkwLCAweDA3LCAweDBDLCAweDc0LCAweDA3LCAweEYwLCAweEEzLCAweDc0LAorLyowMDcwKi8weEZGLCAweEYwLCAweEU0LCAweEY1LCAweDBDLCAweEEzLCAweEYwLCAweDkwLAorCTB4MDcsIDB4MTQsIDB4RjAsIDB4QTMsIDB4RjAsIDB4NzUsIDB4MEIsIDB4MjAsCisvKjAwODAqLzB4RjUsIDB4MDksIDB4RTQsIDB4RjUsIDB4MDgsIDB4RTUsIDB4MDgsIDB4RDMsCisJMHg5NCwgMHgzMCwgMHg0MCwgMHgwMywgMHgwMiwgMHgwNCwgMHgwNCwgMHgxMiwKKy8qMDA5MCovMHgwMCwgMHgwNiwgMHgxNSwgMHgwQiwgMHhFNSwgMHgwOCwgMHg3MCwgMHgwNCwKKwkweDdGLCAweDAxLCAweDgwLCAweDAyLCAweDdGLCAweDAwLCAweEU1LCAweDA5LAorLyowMEEwKi8weDcwLCAweDA0LCAweDdFLCAweDAxLCAweDgwLCAweDAyLCAweDdFLCAweDAwLAorCTB4RUUsIDB4NUYsIDB4NjAsIDB4MDUsIDB4MTIsIDB4MTgsIDB4NzEsIDB4RDIsCisvKjAwQjAqLzB4MzUsIDB4NTMsIDB4RTEsIDB4RjcsIDB4RTUsIDB4MDgsIDB4NDUsIDB4MDksCisJMHhGRiwgMHhFNSwgMHgwQiwgMHgyNSwgMHhFMCwgMHgyNSwgMHhFMCwgMHgyNCwKKy8qMDBDMCovMHg4MywgMHhGNSwgMHg4MiwgMHhFNCwgMHgzNCwgMHgwNywgMHhGNSwgMHg4MywKKwkweEVGLCAweEYwLCAweDg1LCAweEUyLCAweDIwLCAweEU1LCAweDUyLCAweEQzLAorLyowMEQwKi8weDk0LCAweDAxLCAweDQwLCAweDBELCAweDEyLCAweDE5LCAweEYzLCAweEUwLAorCTB4NTQsIDB4QTAsIDB4NjQsIDB4NDAsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MDMsCisvKjAwRTAqLzB4RkIsIDB4NTMsIDB4RjksIDB4RjgsIDB4OTAsIDB4OTQsIDB4NzAsIDB4RTQsCisJMHhGMCwgMHhFMCwgMHhGNSwgMHgxMCwgMHhBRiwgMHgwOSwgMHgxMiwgMHgxRSwKKy8qMDBGMCovMHhCMywgMHhBRiwgMHgwOCwgMHhFRiwgMHg0NCwgMHgwOCwgMHhGNSwgMHg4MiwKKwkweDc1LCAweDgzLCAweDgwLCAweEUwLCAweEY1LCAweDI5LCAweEVGLCAweDQ0LAorLyowMTAwKi8weDA3LCAweDEyLCAweDFBLCAweDNDLCAweEY1LCAweDIyLCAweDU0LCAweDQwLAorCTB4RDMsIDB4OTQsIDB4MDAsIDB4NDAsIDB4MUUsIDB4RTUsIDB4MjksIDB4NTQsCisvKjAxMTAqLzB4RjAsIDB4NzAsIDB4MjEsIDB4MTIsIDB4MTksIDB4RjMsIDB4RTAsIDB4NDQsCisJMHg4MCwgMHhGMCwgMHhFNSwgMHgyMiwgMHg1NCwgMHgzMCwgMHg2NSwgMHgwOCwKKy8qMDEyMCovMHg3MCwgMHgwOSwgMHgxMiwgMHgxOSwgMHhGMywgMHhFMCwgMHg1NCwgMHhCRiwKKwkweEYwLCAweDgwLCAweDA5LCAweDEyLCAweDE5LCAweEYzLCAweDc0LCAweDQwLAorLyowMTMwKi8weEYwLCAweDAyLCAweDAzLCAweEZCLCAweDEyLCAweDFBLCAweDEyLCAweDc1LAorCTB4ODMsIDB4QUUsIDB4NzQsIDB4RkYsIDB4RjAsIDB4QUYsIDB4MDgsIDB4N0UsCisvKjAxNDAqLzB4MDAsIDB4RUYsIDB4NDQsIDB4MDcsIDB4RjUsIDB4ODIsIDB4RTAsIDB4RkQsCisJMHhFNSwgMHgwQiwgMHgyNSwgMHhFMCwgMHgyNSwgMHhFMCwgMHgyNCwgMHg4MSwKKy8qMDE1MCovMHhGNSwgMHg4MiwgMHhFNCwgMHgzNCwgMHgwNywgMHhGNSwgMHg4MywgMHhFRCwKKwkweEYwLCAweDkwLCAweDA3LCAweDBFLCAweEUwLCAweDA0LCAweEYwLCAweEVGLAorLyowMTYwKi8weDQ0LCAweDA3LCAweEY1LCAweDgyLCAweDc1LCAweDgzLCAweDk4LCAweEUwLAorCTB4RjUsIDB4MjgsIDB4MTIsIDB4MUEsIDB4MjMsIDB4NDAsIDB4MEMsIDB4MTIsCisvKjAxNzAqLzB4MTksIDB4RjMsIDB4RTAsIDB4NDQsIDB4MDEsIDB4MTIsIDB4MUEsIDB4MzIsCisJMHgwMiwgMHgwMywgMHhGNiwgMHhBRiwgMHgwOCwgMHg3RSwgMHgwMCwgMHg3NCwKKy8qMDE4MCovMHg4MCwgMHhDRCwgMHhFRiwgMHhDRCwgMHg4RCwgMHg4MiwgMHhGNSwgMHg4MywKKwkweEUwLCAweDMwLCAweEUwLCAweDBBLCAweDEyLCAweDE5LCAweEYzLCAweEUwLAorLyowMTkwKi8weDQ0LCAweDIwLCAweEYwLCAweDAyLCAweDAzLCAweEZCLCAweDEyLCAweDE5LAorCTB4RjMsIDB4RTAsIDB4NTQsIDB4REYsIDB4RjAsIDB4RUUsIDB4NDQsIDB4QUUsCisvKjAxQTAqLzB4MTIsIDB4MUEsIDB4NDMsIDB4MzAsIDB4RTQsIDB4MDMsIDB4MDIsIDB4MDMsCisJMHhGQiwgMHg3NCwgMHg5RSwgMHgxMiwgMHgxQSwgMHgwNSwgMHgyMCwgMHhFMCwKKy8qMDFCMCovMHgwMywgMHgwMiwgMHgwMywgMHhGQiwgMHg4RiwgMHg4MiwgMHg4RSwgMHg4MywKKwkweEUwLCAweDIwLCAweEUwLCAweDAzLCAweDAyLCAweDAzLCAweEZCLCAweDEyLAorLyowMUMwKi8weDE5LCAweEYzLCAweEUwLCAweDQ0LCAweDEwLCAweEYwLCAweEU1LCAweEUzLAorCTB4MjAsIDB4RTcsIDB4MDgsIDB4RTUsIDB4MDgsIDB4MTIsIDB4MUEsIDB4M0EsCisvKjAxRDAqLzB4NDQsIDB4MDQsIDB4RjAsIDB4QUYsIDB4MDgsIDB4N0UsIDB4MDAsIDB4RUYsCisJMHgxMiwgMHgxQSwgMHgzQSwgMHgyMCwgMHhFMiwgMHgzNCwgMHgxMiwgMHgxOSwKKy8qMDFFMCovMHhGMywgMHhFMCwgMHg0NCwgMHgwOCwgMHhGMCwgMHhFNSwgMHhFNCwgMHgzMCwKKwkweEU2LCAweDA0LCAweDdELCAweDAxLCAweDgwLCAweDAyLCAweDdELCAweDAwLAorLyowMUYwKi8weEU1LCAweDdFLCAweEMzLCAweDk0LCAweDA0LCAweDUwLCAweDA0LCAweDdDLAorCTB4MDEsIDB4ODAsIDB4MDIsIDB4N0MsIDB4MDAsIDB4RUMsIDB4NEQsIDB4NjAsCisvKjAyMDAqLzB4MDUsIDB4QzIsIDB4MzUsIDB4MDIsIDB4MDMsIDB4RkIsIDB4RUUsIDB4NDQsCisJMHhEMiwgMHgxMiwgMHgxQSwgMHg0MywgMHg0NCwgMHg0MCwgMHhGMCwgMHgwMiwKKy8qMDIxMCovMHgwMywgMHhGQiwgMHgxMiwgMHgxOSwgMHhGMywgMHhFMCwgMHg1NCwgMHhGNywKKwkweEYwLCAweDEyLCAweDFBLCAweDEyLCAweDc1LCAweDgzLCAweEQyLCAweEUwLAorLyowMjIwKi8weDU0LCAweEJGLCAweEYwLCAweDkwLCAweDA3LCAweDE0LCAweEUwLCAweDA0LAorCTB4RjAsIDB4RTUsIDB4N0UsIDB4NzAsIDB4MDMsIDB4NzUsIDB4N0UsIDB4MDEsCisvKjAyMzAqLzB4QUYsIDB4MDgsIDB4N0UsIDB4MDAsIDB4MTIsIDB4MUEsIDB4MjMsIDB4NDAsCisJMHgxMiwgMHgxMiwgMHgxOSwgMHhGMywgMHhFMCwgMHg0NCwgMHgwMSwgMHgxMiwKKy8qMDI0MCovMHgxOSwgMHhGMiwgMHhFMCwgMHg1NCwgMHgwMiwgMHgxMiwgMHgxQSwgMHgzMiwKKwkweDAyLCAweDAzLCAweEZCLCAweDEyLCAweDE5LCAweEYzLCAweEUwLCAweDQ0LAorLyowMjUwKi8weDAyLCAweDEyLCAweDE5LCAweEYyLCAweEUwLCAweDU0LCAweEZFLCAweEYwLAorCTB4QzIsIDB4MzUsIDB4RUUsIDB4NDQsIDB4OEEsIDB4OEYsIDB4ODIsIDB4RjUsCisvKjAyNjAqLzB4ODMsIDB4RTAsIDB4RjUsIDB4MTcsIDB4NTQsIDB4OEYsIDB4NDQsIDB4NDAsCisJMHhGMCwgMHg3NCwgMHg5MCwgMHhGQywgMHhFNSwgMHgwOCwgMHg0NCwgMHgwNywKKy8qMDI3MCovMHhGRCwgMHhGNSwgMHg4MiwgMHg4QywgMHg4MywgMHhFMCwgMHg1NCwgMHgzRiwKKwkweDkwLCAweDA3LCAweDAyLCAweEYwLCAweEUwLCAweDU0LCAweEMwLCAweDhELAorLyowMjgwKi8weDgyLCAweDhDLCAweDgzLCAweEYwLCAweDc0LCAweDkyLCAweDEyLCAweDFBLAorCTB4MDUsIDB4OTAsIDB4MDcsIDB4MDMsIDB4MTIsIDB4MUEsIDB4MTksIDB4NzQsCisvKjAyOTAqLzB4ODIsIDB4MTIsIDB4MUEsIDB4MDUsIDB4OTAsIDB4MDcsIDB4MDQsIDB4MTIsCisJMHgxQSwgMHgxOSwgMHg3NCwgMHhCNCwgMHgxMiwgMHgxQSwgMHgwNSwgMHg5MCwKKy8qMDJBMCovMHgwNywgMHgwNSwgMHgxMiwgMHgxQSwgMHgxOSwgMHg3NCwgMHg5NCwgMHhGRSwKKwkweEU1LCAweDA4LCAweDQ0LCAweDA2LCAweDEyLCAweDFBLCAweDBBLCAweEY1LAorLyowMkIwKi8weDEwLCAweDMwLCAweEUwLCAweDA0LCAweEQyLCAweDM3LCAweDgwLCAweDAyLAorCTB4QzIsIDB4MzcsIDB4RTUsIDB4MTAsIDB4NTQsIDB4N0YsIDB4OEYsIDB4ODIsCisvKjAyQzAqLzB4OEUsIDB4ODMsIDB4RjAsIDB4MzAsIDB4NDQsIDB4MzAsIDB4MTIsIDB4MUEsCisJMHgwMywgMHg1NCwgMHg4MCwgMHhEMywgMHg5NCwgMHgwMCwgMHg0MCwgMHgwNCwKKy8qMDJEMCovMHhEMiwgMHgzOSwgMHg4MCwgMHgwMiwgMHhDMiwgMHgzOSwgMHg4RiwgMHg4MiwKKwkweDhFLCAweDgzLCAweEUwLCAweDQ0LCAweDgwLCAweEYwLCAweDEyLCAweDFBLAorLyowMkUwKi8weDAzLCAweDU0LCAweDQwLCAweEQzLCAweDk0LCAweDAwLCAweDQwLCAweDA0LAorCTB4RDIsIDB4M0EsIDB4ODAsIDB4MDIsIDB4QzIsIDB4M0EsIDB4OEYsIDB4ODIsCisvKjAyRjAqLzB4OEUsIDB4ODMsIDB4RTAsIDB4NDQsIDB4NDAsIDB4RjAsIDB4NzQsIDB4OTIsCisJMHhGRSwgMHhFNSwgMHgwOCwgMHg0NCwgMHgwNiwgMHgxMiwgMHgxQSwgMHgwQSwKKy8qMDMwMCovMHgzMCwgMHhFNywgMHgwNCwgMHhEMiwgMHgzOCwgMHg4MCwgMHgwMiwgMHhDMiwKKwkweDM4LCAweDhGLCAweDgyLCAweDhFLCAweDgzLCAweEUwLCAweDU0LCAweDdGLAorLyowMzEwKi8weEYwLCAweDEyLCAweDFFLCAweDQ2LCAweEU0LCAweEY1LCAweDBBLCAweDIwLAorCTB4MDMsIDB4MDIsIDB4ODAsIDB4MDMsIDB4MzAsIDB4NDMsIDB4MDMsIDB4MTIsCisvKjAzMjAqLzB4MTksIDB4OTUsIDB4MjAsIDB4MDIsIDB4MDIsIDB4ODAsIDB4MDMsIDB4MzAsCisJMHg0MiwgMHgwMywgMHgxMiwgMHgwQywgMHg4RiwgMHgzMCwgMHgzMCwgMHgwNiwKKy8qMDMzMCovMHgxMiwgMHgxOSwgMHg5NSwgMHgxMiwgMHgwQywgMHg4RiwgMHgxMiwgMHgwRCwKKwkweDQ3LCAweDEyLCAweDE5LCAweEYzLCAweEUwLCAweDU0LCAweEZCLCAweEYwLAorLyowMzQwKi8weEU1LCAweDBBLCAweEMzLCAweDk0LCAweDAxLCAweDQwLCAweDQ2LCAweDQzLAorCTB4RTEsIDB4MDgsIDB4MTIsIDB4MTksIDB4RjMsIDB4RTAsIDB4NDQsIDB4MDQsCisvKjAzNTAqLzB4RjAsIDB4RTUsIDB4RTQsIDB4MjAsIDB4RTcsIDB4MkEsIDB4MTIsIDB4MUEsCisJMHgxMiwgMHg3NSwgMHg4MywgMHhEMiwgMHhFMCwgMHg1NCwgMHgwOCwgMHhEMywKKy8qMDM2MCovMHg5NCwgMHgwMCwgMHg0MCwgMHgwNCwgMHg3RiwgMHgwMSwgMHg4MCwgMHgwMiwKKwkweDdGLCAweDAwLCAweEU1LCAweDBBLCAweEMzLCAweDk0LCAweDAxLCAweDQwLAorLyowMzcwKi8weDA0LCAweDdFLCAweDAxLCAweDgwLCAweDAyLCAweDdFLCAweDAwLCAweEVGLAorCTB4NUUsIDB4NjAsIDB4MDUsIDB4MTIsIDB4MUQsIDB4RDcsIDB4ODAsIDB4MTcsCisvKjAzODAqLzB4MTIsIDB4MUEsIDB4MTIsIDB4NzUsIDB4ODMsIDB4RDIsIDB4RTAsIDB4NDQsCisJMHgwOCwgMHhGMCwgMHgwMiwgMHgwMywgMHhGQiwgMHgxMiwgMHgxQSwgMHgxMiwKKy8qMDM5MCovMHg3NSwgMHg4MywgMHhEMiwgMHhFMCwgMHg1NCwgMHhGNywgMHhGMCwgMHgxMiwKKwkweDFFLCAweDQ2LCAweDdGLCAweDA4LCAweDEyLCAweDE3LCAweDMxLCAweDc0LAorLyowM0EwKi8weDhFLCAweEZFLCAweDEyLCAweDFBLCAweDEyLCAweDhFLCAweDgzLCAweEUwLAorCTB4RjUsIDB4MTAsIDB4NTQsIDB4RkUsIDB4RjAsIDB4RTUsIDB4MTAsIDB4NDQsCisvKjAzQjAqLzB4MDEsIDB4RkYsIDB4RTUsIDB4MDgsIDB4RkQsIDB4RUQsIDB4NDQsIDB4MDcsCisJMHhGNSwgMHg4MiwgMHhFRiwgMHhGMCwgMHhFNSwgMHgxMCwgMHg1NCwgMHhGRSwKKy8qMDNDMCovMHhGRiwgMHhFRCwgMHg0NCwgMHgwNywgMHhGNSwgMHg4MiwgMHhFRiwgMHgxMiwKKwkweDFBLCAweDExLCAweDc1LCAweDgzLCAweDg2LCAweEUwLCAweDQ0LCAweDEwLAorLyowM0QwKi8weDEyLCAweDFBLCAweDExLCAweEUwLCAweDQ0LCAweDEwLCAweEYwLCAweDEyLAorCTB4MTksIDB4RjMsIDB4RTAsIDB4NTQsIDB4RkQsIDB4NDQsIDB4MDEsIDB4RkYsCisvKjAzRTAqLzB4MTIsIDB4MTksIDB4RjMsIDB4RUYsIDB4MTIsIDB4MUEsIDB4MzIsIDB4MzAsCisJMHgzMiwgMHgwQywgMHhFNSwgMHgwOCwgMHg0NCwgMHgwOCwgMHhGNSwgMHg4MiwKKy8qMDNGMCovMHg3NSwgMHg4MywgMHg4MiwgMHg3NCwgMHgwNSwgMHhGMCwgMHhBRiwgMHgwQiwKKwkweDEyLCAweDE4LCAweEQ3LCAweDc0LCAweDEwLCAweDI1LCAweDA4LCAweEY1LAorLyowNDAwKi8weDA4LCAweDAyLCAweDAwLCAweDg1LCAweDA1LCAweDA5LCAweEU1LCAweDA5LAorCTB4RDMsIDB4OTQsIDB4MDcsIDB4NTAsIDB4MDMsIDB4MDIsIDB4MDAsIDB4ODIsCisvKjA0MTAqLzB4RTUsIDB4N0UsIDB4RDMsIDB4OTQsIDB4MDAsIDB4NDAsIDB4MDQsIDB4N0YsCisJMHgwMSwgMHg4MCwgMHgwMiwgMHg3RiwgMHgwMCwgMHhFNSwgMHg3RSwgMHhDMywKKy8qMDQyMCovMHg5NCwgMHhGQSwgMHg1MCwgMHgwNCwgMHg3RSwgMHgwMSwgMHg4MCwgMHgwMiwKKwkweDdFLCAweDAwLCAweEVFLCAweDVGLCAweDYwLCAweDAyLCAweDA1LCAweDdFLAorLyowNDMwKi8weDMwLCAweDM1LCAweDBCLCAweDQzLCAweEUxLCAweDAxLCAweDdGLCAweDA5LAorCTB4MTIsIDB4MTcsIDB4MzEsIDB4MDIsIDB4MDAsIDB4NTgsIDB4NTMsIDB4RTEsCisvKjA0NDAqLzB4RkUsIDB4MDIsIDB4MDAsIDB4NTgsIDB4OEUsIDB4NkEsIDB4OEYsIDB4NkIsCisJMHg4QywgMHg2QywgMHg4RCwgMHg2RCwgMHg3NSwgMHg2RSwgMHgwMSwgMHg3NSwKKy8qMDQ1MCovMHg2RiwgMHgwMSwgMHg3NSwgMHg3MCwgMHgwMSwgMHhFNCwgMHhGNSwgMHg3MywKKwkweEY1LCAweDc0LCAweEY1LCAweDc1LCAweDkwLCAweDA3LCAweDJGLCAweEYwLAorLyowNDYwKi8weEY1LCAweDNDLCAweEY1LCAweDNFLCAweEY1LCAweDQ2LCAweEY1LCAweDQ3LAorCTB4RjUsIDB4M0QsIDB4RjUsIDB4M0YsIDB4RjUsIDB4NkYsIDB4RTUsIDB4NkYsCisvKjA0NzAqLzB4NzAsIDB4MEYsIDB4RTUsIDB4NkIsIDB4NDUsIDB4NkEsIDB4MTIsIDB4MDcsCisJMHgyQSwgMHg3NSwgMHg4MywgMHg4MCwgMHg3NCwgMHgzQSwgMHhGMCwgMHg4MCwKKy8qMDQ4MCovMHgwOSwgMHgxMiwgMHgwNywgMHgyQSwgMHg3NSwgMHg4MywgMHg4MCwgMHg3NCwKKwkweDFBLCAweEYwLCAweEU0LCAweEY1LCAweDZFLCAweEMzLCAweDc0LCAweDNGLAorLyowNDkwKi8weDk1LCAweDZFLCAweEZGLCAweDEyLCAweDA4LCAweDY1LCAweDc1LCAweDgzLAorCTB4ODIsIDB4RUYsIDB4RjAsIDB4MTIsIDB4MUEsIDB4NEQsIDB4MTIsIDB4MDgsCisvKjA0QTAqLzB4QzYsIDB4RTUsIDB4MzMsIDB4RjAsIDB4MTIsIDB4MDgsIDB4RkEsIDB4MTIsCisJMHgwOCwgMHhCMSwgMHg0MCwgMHhFMSwgMHhFNSwgMHg2RiwgMHg3MCwgMHgwQiwKKy8qMDRCMCovMHgxMiwgMHgwNywgMHgyQSwgMHg3NSwgMHg4MywgMHg4MCwgMHg3NCwgMHgzNiwKKwkweEYwLCAweDgwLCAweDA5LCAweDEyLCAweDA3LCAweDJBLCAweDc1LCAweDgzLAorLyowNEMwKi8weDgwLCAweDc0LCAweDE2LCAweEYwLCAweDc1LCAweDZFLCAweDAxLCAweDEyLAorCTB4MDcsIDB4MkEsIDB4NzUsIDB4ODMsIDB4QjQsIDB4RTUsIDB4NkUsIDB4RjAsCisvKjA0RDAqLzB4MTIsIDB4MUEsIDB4NEQsIDB4NzQsIDB4M0YsIDB4MjUsIDB4NkUsIDB4RjUsCisJMHg4MiwgMHhFNCwgMHgzNCwgMHgwMCwgMHhGNSwgMHg4MywgMHhFNSwgMHgzMywKKy8qMDRFMCovMHhGMCwgMHg3NCwgMHhCRiwgMHgyNSwgMHg2RSwgMHhGNSwgMHg4MiwgMHhFNCwKKwkweDM0LCAweDAwLCAweDEyLCAweDA4LCAweEIxLCAweDQwLCAweEQ4LCAweEU0LAorLyowNEYwKi8weEY1LCAweDcwLCAweEY1LCAweDQ2LCAweEY1LCAweDQ3LCAweEY1LCAweDZFLAorCTB4MTIsIDB4MDgsIDB4RkEsIDB4RjUsIDB4ODMsIDB4RTAsIDB4RkUsIDB4MTIsCisvKjA1MDAqLzB4MDgsIDB4QzYsIDB4RTAsIDB4N0MsIDB4MDAsIDB4MjQsIDB4MDAsIDB4RkYsCisJMHhFQywgMHgzRSwgMHhGRSwgMHhBRCwgMHgzQiwgMHhEMywgMHhFRiwgMHg5RCwKKy8qMDUxMCovMHhFRSwgMHg5QywgMHg1MCwgMHgwNCwgMHg3QiwgMHgwMSwgMHg4MCwgMHgwMiwKKwkweDdCLCAweDAwLCAweEU1LCAweDcwLCAweDcwLCAweDA0LCAweDdBLCAweDAxLAorLyowNTIwKi8weDgwLCAweDAyLCAweDdBLCAweDAwLCAweEVCLCAweDVBLCAweDYwLCAweDA2LAorCTB4ODUsIDB4NkUsIDB4NDYsIDB4NzUsIDB4NzAsIDB4MDEsIDB4RDMsIDB4RUYsCisvKjA1MzAqLzB4OUQsIDB4RUUsIDB4OUMsIDB4NTAsIDB4MDQsIDB4N0YsIDB4MDEsIDB4ODAsCisJMHgwMiwgMHg3RiwgMHgwMCwgMHhFNSwgMHg3MCwgMHhCNCwgMHgwMSwgMHgwNCwKKy8qMDU0MCovMHg3RSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3RSwgMHgwMCwgMHhFRiwgMHg1RSwKKwkweDYwLCAweDAzLCAweDg1LCAweDZFLCAweDQ3LCAweDA1LCAweDZFLCAweEU1LAorLyowNTUwKi8weDZFLCAweDY0LCAweDdGLCAweDcwLCAweEEzLCAweEU1LCAweDQ2LCAweDYwLAorCTB4MDUsIDB4RTUsIDB4NDcsIDB4QjQsIDB4N0UsIDB4MDMsIDB4ODUsIDB4NDYsCisvKjA1NjAqLzB4NDcsIDB4RTUsIDB4NkYsIDB4NzAsIDB4MDgsIDB4ODUsIDB4NDYsIDB4NzYsCisJMHg4NSwgMHg0NywgMHg3NywgMHg4MCwgMHgwRSwgMHhDMywgMHg3NCwgMHg3RiwKKy8qMDU3MCovMHg5NSwgMHg0NiwgMHhGNSwgMHg3OCwgMHhDMywgMHg3NCwgMHg3RiwgMHg5NSwKKwkweDQ3LCAweEY1LCAweDc5LCAweEU1LCAweDZGLCAweDcwLCAweDM3LCAweEU1LAorLyowNTgwKi8weDQ2LCAweDY1LCAweDQ3LCAweDcwLCAweDBDLCAweDc1LCAweDczLCAweDAxLAorCTB4NzUsIDB4NzQsIDB4MDEsIDB4RjUsIDB4M0MsIDB4RjUsIDB4M0QsIDB4ODAsCisvKjA1OTAqLzB4MzUsIDB4RTQsIDB4RjUsIDB4NEUsIDB4QzMsIDB4RTUsIDB4NDcsIDB4OTUsCisJMHg0NiwgMHhGNSwgMHgzQywgMHhDMywgMHgxMywgMHhGNSwgMHg3MSwgMHgyNSwKKy8qMDVBMCovMHg0NiwgMHhGNSwgMHg3MiwgMHhDMywgMHg5NCwgMHgzRiwgMHg0MCwgMHgwNSwKKwkweEU0LCAweEY1LCAweDNELCAweDgwLCAweDQwLCAweEMzLCAweDc0LCAweDNGLAorLyowNUIwKi8weDk1LCAweDcyLCAweEY1LCAweDNELCAweDgwLCAweDM3LCAweEU1LCAweDQ2LAorCTB4NjUsIDB4NDcsIDB4NzAsIDB4MEYsIDB4NzUsIDB4NzMsIDB4MDEsIDB4NzUsCisvKjA1QzAqLzB4NzUsIDB4MDEsIDB4RjUsIDB4M0UsIDB4RjUsIDB4M0YsIDB4NzUsIDB4NEUsCisJMHgwMSwgMHg4MCwgMHgyMiwgMHhFNCwgMHhGNSwgMHg0RSwgMHhDMywgMHhFNSwKKy8qMDVEMCovMHg0NywgMHg5NSwgMHg0NiwgMHhGNSwgMHgzRSwgMHhDMywgMHgxMywgMHhGNSwKKwkweDcxLCAweDI1LCAweDQ2LCAweEY1LCAweDcyLCAweEQzLCAweDk0LCAweDNGLAorLyowNUUwKi8weDUwLCAweDA1LCAweEU0LCAweEY1LCAweDNGLCAweDgwLCAweDA2LCAweEU1LAorCTB4NzIsIDB4MjQsIDB4QzEsIDB4RjUsIDB4M0YsIDB4MDUsIDB4NkYsIDB4RTUsCisvKjA1RjAqLzB4NkYsIDB4QzMsIDB4OTQsIDB4MDIsIDB4NTAsIDB4MDMsIDB4MDIsIDB4MDQsCisJMHg2RSwgMHhFNSwgMHg2RCwgMHg0NSwgMHg2QywgMHg3MCwgMHgwMiwgMHg4MCwKKy8qMDYwMCovMHgwNCwgMHhFNSwgMHg3NCwgMHg0NSwgMHg3NSwgMHg5MCwgMHgwNywgMHgyRiwKKwkweEYwLCAweDdGLCAweDAxLCAweEU1LCAweDNFLCAweDYwLCAweDA0LCAweEU1LAorLyowNjEwKi8weDNDLCAweDcwLCAweDE0LCAweEU0LCAweEY1LCAweDNDLCAweEY1LCAweDNELAorCTB4RjUsIDB4M0UsIDB4RjUsIDB4M0YsIDB4MTIsIDB4MDgsIDB4RDIsIDB4NzAsCisvKjA2MjAqLzB4MDQsIDB4RjAsIDB4MDIsIDB4MDYsIDB4QTQsIDB4ODAsIDB4N0EsIDB4RTUsCisJMHgzQywgMHhDMywgMHg5NSwgMHgzRSwgMHg0MCwgMHgwNywgMHhFNSwgMHgzQywKKy8qMDYzMCovMHg5NSwgMHgzRSwgMHhGRiwgMHg4MCwgMHgwNiwgMHhDMywgMHhFNSwgMHgzRSwKKwkweDk1LCAweDNDLCAweEZGLCAweEU1LCAweDc2LCAweEQzLCAweDk1LCAweDc5LAorLyowNjQwKi8weDQwLCAweDA1LCAweDg1LCAweDc2LCAweDdBLCAweDgwLCAweDAzLCAweDg1LAorCTB4NzksIDB4N0EsIDB4RTUsIDB4NzcsIDB4QzMsIDB4OTUsIDB4NzgsIDB4NTAsCisvKjA2NTAqLzB4MDUsIDB4ODUsIDB4NzcsIDB4N0IsIDB4ODAsIDB4MDMsIDB4ODUsIDB4NzgsCisJMHg3QiwgMHhFNSwgMHg3QiwgMHhEMywgMHg5NSwgMHg3QSwgMHg0MCwgMHgzMCwKKy8qMDY2MCovMHhFNSwgMHg3QiwgMHg5NSwgMHg3QSwgMHhGNSwgMHgzQywgMHhGNSwgMHgzRSwKKwkweEMzLCAweEU1LCAweDdCLCAweDk1LCAweDdBLCAweDkwLCAweDA3LCAweDE5LAorLyowNjcwKi8weEYwLCAweEU1LCAweDNDLCAweEMzLCAweDEzLCAweEY1LCAweDcxLCAweDI1LAorCTB4N0EsIDB4RjUsIDB4NzIsIDB4QzMsIDB4OTQsIDB4M0YsIDB4NDAsIDB4MDUsCisvKjA2ODAqLzB4RTQsIDB4RjUsIDB4M0QsIDB4ODAsIDB4MUYsIDB4QzMsIDB4NzQsIDB4M0YsCisJMHg5NSwgMHg3MiwgMHhGNSwgMHgzRCwgMHhGNSwgMHgzRiwgMHg4MCwgMHgxNCwKKy8qMDY5MCovMHhFNCwgMHhGNSwgMHgzQywgMHhGNSwgMHgzRSwgMHg5MCwgMHgwNywgMHgxOSwKKwkweEYwLCAweDEyLCAweDA4LCAweEQyLCAweDcwLCAweDAzLCAweEYwLCAweDgwLAorLyowNkEwKi8weDAzLCAweDc0LCAweDAxLCAweEYwLCAweDEyLCAweDA4LCAweDY1LCAweDc1LAorCTB4ODMsIDB4RDAsIDB4RTAsIDB4NTQsIDB4MEYsIDB4RkUsIDB4QUQsIDB4M0MsCisvKjA2QjAqLzB4NzAsIDB4MDIsIDB4N0UsIDB4MDcsIDB4QkUsIDB4MEYsIDB4MDIsIDB4N0UsCisJMHg4MCwgMHhFRSwgMHhGQiwgMHhFRiwgMHhEMywgMHg5QiwgMHg3NCwgMHg4MCwKKy8qMDZDMCovMHhGOCwgMHg5OCwgMHg0MCwgMHgxRiwgMHhFNCwgMHhGNSwgMHgzQywgMHhGNSwKKwkweDNFLCAweDEyLCAweDA4LCAweEQyLCAweDcwLCAweDAzLCAweEYwLCAweDgwLAorLyowNkQwKi8weDEyLCAweDc0LCAweDAxLCAweEYwLCAweEU1LCAweDA4LCAweEZCLCAweEVCLAorCTB4NDQsIDB4MDcsIDB4RjUsIDB4ODIsIDB4NzUsIDB4ODMsIDB4RDIsIDB4RTAsCisvKjA2RTAqLzB4NDQsIDB4MTAsIDB4RjAsIDB4RTUsIDB4MDgsIDB4RkIsIDB4RUIsIDB4NDQsCisJMHgwOSwgMHhGNSwgMHg4MiwgMHg3NSwgMHg4MywgMHg5RSwgMHhFRCwgMHhGMCwKKy8qMDZGMCovMHhFQiwgMHg0NCwgMHgwNywgMHhGNSwgMHg4MiwgMHg3NSwgMHg4MywgMHhDQSwKKwkweEVELCAweEYwLCAweDEyLCAweDA4LCAweDY1LCAweDc1LCAweDgzLCAweENDLAorLyowNzAwKi8weEVGLCAweEYwLCAweDIyLCAweEU1LCAweDA4LCAweDQ0LCAweDA3LCAweEY1LAorCTB4ODIsIDB4NzUsIDB4ODMsIDB4QkMsIDB4RTAsIDB4NTQsIDB4RjAsIDB4RjAsCisvKjA3MTAqLzB4RTUsIDB4MDgsIDB4NDQsIDB4MDcsIDB4RjUsIDB4ODIsIDB4NzUsIDB4ODMsCisJMHhCRSwgMHhFMCwgMHg1NCwgMHhGMCwgMHhGMCwgMHhFNSwgMHgwOCwgMHg0NCwKKy8qMDcyMCovMHgwNywgMHhGNSwgMHg4MiwgMHg3NSwgMHg4MywgMHhDMCwgMHhFMCwgMHg1NCwKKwkweEYwLCAweEYwLCAweEU1LCAweDA4LCAweDQ0LCAweDA3LCAweEY1LCAweDgyLAorLyowNzMwKi8weDIyLCAweEYwLCAweDkwLCAweDA3LCAweDI4LCAweEUwLCAweEZFLCAweEEzLAorCTB4RTAsIDB4RjUsIDB4ODIsIDB4OEUsIDB4ODMsIDB4MjIsIDB4ODUsIDB4NDIsCisvKjA3NDAqLzB4NDIsIDB4ODUsIDB4NDEsIDB4NDEsIDB4ODUsIDB4NDAsIDB4NDAsIDB4NzQsCisJMHhDMCwgMHgyRiwgMHhGNSwgMHg4MiwgMHg3NCwgMHgwMiwgMHgzRSwgMHhGNSwKKy8qMDc1MCovMHg4MywgMHhFNSwgMHg0MiwgMHhGMCwgMHg3NCwgMHhFMCwgMHgyRiwgMHhGNSwKKwkweDgyLCAweDc0LCAweDAyLCAweDNFLCAweEY1LCAweDgzLCAweDIyLCAweEU1LAorLyowNzYwKi8weDQyLCAweDI5LCAweEZELCAweEU0LCAweDMzLCAweEZDLCAweEU1LCAweDNDLAorCTB4QzMsIDB4OUQsIDB4RUMsIDB4NjQsIDB4ODAsIDB4RjgsIDB4NzQsIDB4ODAsCisvKjA3NzAqLzB4OTgsIDB4MjIsIDB4RjUsIDB4ODMsIDB4RTAsIDB4OTAsIDB4MDcsIDB4MjIsCisJMHg1NCwgMHgxRiwgMHhGRCwgMHhFMCwgMHhGQSwgMHhBMywgMHhFMCwgMHhGNSwKKy8qMDc4MCovMHg4MiwgMHg4QSwgMHg4MywgMHhFRCwgMHhGMCwgMHgyMiwgMHg5MCwgMHgwNywKKwkweDIyLCAweEUwLCAweEZDLCAweEEzLCAweEUwLCAweEY1LCAweDgyLCAweDhDLAorLyowNzkwKi8weDgzLCAweDIyLCAweDkwLCAweDA3LCAweDI0LCAweEZGLCAweEVELCAweDQ0LAorCTB4MDcsIDB4Q0YsIDB4RjAsIDB4QTMsIDB4RUYsIDB4RjAsIDB4MjIsIDB4ODUsCisvKjA3QTAqLzB4MzgsIDB4MzgsIDB4ODUsIDB4MzksIDB4MzksIDB4ODUsIDB4M0EsIDB4M0EsCisJMHg3NCwgMHhDMCwgMHgyRiwgMHhGNSwgMHg4MiwgMHg3NCwgMHgwMiwgMHgzRSwKKy8qMDdCMCovMHhGNSwgMHg4MywgMHgyMiwgMHg5MCwgMHgwNywgMHgyNiwgMHhGRiwgMHhFRCwKKwkweDQ0LCAweDA3LCAweENGLCAweEYwLCAweEEzLCAweEVGLCAweEYwLCAweDIyLAorLyowN0MwKi8weEYwLCAweDc0LCAweEEwLCAweDJGLCAweEY1LCAweDgyLCAweDc0LCAweDAyLAorCTB4M0UsIDB4RjUsIDB4ODMsIDB4MjIsIDB4NzQsIDB4QzAsIDB4MjUsIDB4MTEsCisvKjA3RDAqLzB4RjUsIDB4ODIsIDB4RTQsIDB4MzQsIDB4MDEsIDB4RjUsIDB4ODMsIDB4MjIsCisJMHg3NCwgMHgwMCwgMHgyNSwgMHgxMSwgMHhGNSwgMHg4MiwgMHhFNCwgMHgzNCwKKy8qMDdFMCovMHgwMiwgMHhGNSwgMHg4MywgMHgyMiwgMHg3NCwgMHg2MCwgMHgyNSwgMHgxMSwKKwkweEY1LCAweDgyLCAweEU0LCAweDM0LCAweDAzLCAweEY1LCAweDgzLCAweDIyLAorLyowN0YwKi8weDc0LCAweDgwLCAweDI1LCAweDExLCAweEY1LCAweDgyLCAweEU0LCAweDM0LAorCTB4MDMsIDB4RjUsIDB4ODMsIDB4MjIsIDB4NzQsIDB4RTAsIDB4MjUsIDB4MTEsCisvKjA4MDAqLzB4RjUsIDB4ODIsIDB4RTQsIDB4MzQsIDB4MDMsIDB4RjUsIDB4ODMsIDB4MjIsCisJMHg3NCwgMHg0MCwgMHgyNSwgMHgxMSwgMHhGNSwgMHg4MiwgMHhFNCwgMHgzNCwKKy8qMDgxMCovMHgwNiwgMHhGNSwgMHg4MywgMHgyMiwgMHg3NCwgMHg4MCwgMHgyRiwgMHhGNSwKKwkweDgyLCAweDc0LCAweDAyLCAweDNFLCAweEY1LCAweDgzLCAweDIyLCAweEFGLAorLyowODIwKi8weDA4LCAweDdFLCAweDAwLCAweEVGLCAweDQ0LCAweDA3LCAweEY1LCAweDgyLAorCTB4MjIsIDB4RjUsIDB4ODMsIDB4RTUsIDB4ODIsIDB4NDQsIDB4MDcsIDB4RjUsCisvKjA4MzAqLzB4ODIsIDB4RTUsIDB4NDAsIDB4RjAsIDB4MjIsIDB4NzQsIDB4NDAsIDB4MjUsCisJMHgxMSwgMHhGNSwgMHg4MiwgMHhFNCwgMHgzNCwgMHgwMiwgMHhGNSwgMHg4MywKKy8qMDg0MCovMHgyMiwgMHg3NCwgMHhDMCwgMHgyNSwgMHgxMSwgMHhGNSwgMHg4MiwgMHhFNCwKKwkweDM0LCAweDAzLCAweEY1LCAweDgzLCAweDIyLCAweDc0LCAweDAwLCAweDI1LAorLyowODUwKi8weDExLCAweEY1LCAweDgyLCAweEU0LCAweDM0LCAweDA2LCAweEY1LCAweDgzLAorCTB4MjIsIDB4NzQsIDB4MjAsIDB4MjUsIDB4MTEsIDB4RjUsIDB4ODIsIDB4RTQsCisvKjA4NjAqLzB4MzQsIDB4MDYsIDB4RjUsIDB4ODMsIDB4MjIsIDB4RTUsIDB4MDgsIDB4RkQsCisJMHhFRCwgMHg0NCwgMHgwNywgMHhGNSwgMHg4MiwgMHgyMiwgMHhFNSwgMHg0MSwKKy8qMDg3MCovMHhGMCwgMHhFNSwgMHg2NSwgMHg2NCwgMHgwMSwgMHg0NSwgMHg2NCwgMHgyMiwKKwkweDdFLCAweDAwLCAweEZCLCAweDdBLCAweDAwLCAweEZELCAweDdDLCAweDAwLAorLyowODgwKi8weDIyLCAweDc0LCAweDIwLCAweDI1LCAweDExLCAweEY1LCAweDgyLCAweEU0LAorCTB4MzQsIDB4MDIsIDB4MjIsIDB4NzQsIDB4QTAsIDB4MjUsIDB4MTEsIDB4RjUsCisvKjA4OTAqLzB4ODIsIDB4RTQsIDB4MzQsIDB4MDMsIDB4MjIsIDB4ODUsIDB4M0UsIDB4NDIsCisJMHg4NSwgMHgzRiwgMHg0MSwgMHg4RiwgMHg0MCwgMHgyMiwgMHg4NSwgMHgzQywKKy8qMDhBMCovMHg0MiwgMHg4NSwgMHgzRCwgMHg0MSwgMHg4RiwgMHg0MCwgMHgyMiwgMHg3NSwKKwkweDQ1LCAweDNGLCAweDkwLCAweDA3LCAweDIwLCAweEU0LCAweEYwLCAweEEzLAorLyowOEIwKi8weDIyLCAweEY1LCAweDgzLCAweEU1LCAweDMyLCAweEYwLCAweDA1LCAweDZFLAorCTB4RTUsIDB4NkUsIDB4QzMsIDB4OTQsIDB4NDAsIDB4MjIsIDB4RjAsIDB4RTUsCisvKjA4QzAqLzB4MDgsIDB4NDQsIDB4MDYsIDB4RjUsIDB4ODIsIDB4MjIsIDB4NzQsIDB4MDAsCisJMHgyNSwgMHg2RSwgMHhGNSwgMHg4MiwgMHhFNCwgMHgzNCwgMHgwMCwgMHhGNSwKKy8qMDhEMCovMHg4MywgMHgyMiwgMHhFNSwgMHg2RCwgMHg0NSwgMHg2QywgMHg5MCwgMHgwNywKKwkweDJGLCAweDIyLCAweEU0LCAweEY5LCAweEU1LCAweDNDLCAweEQzLCAweDk1LAorLyowOEUwKi8weDNFLCAweDIyLCAweDc0LCAweDgwLCAweDJFLCAweEY1LCAweDgyLCAweEU0LAorCTB4MzQsIDB4MDIsIDB4RjUsIDB4ODMsIDB4RTAsIDB4MjIsIDB4NzQsIDB4QTAsCisvKjA4RjAqLzB4MkUsIDB4RjUsIDB4ODIsIDB4RTQsIDB4MzQsIDB4MDIsIDB4RjUsIDB4ODMsCisJMHhFMCwgMHgyMiwgMHg3NCwgMHg4MCwgMHgyNSwgMHg2RSwgMHhGNSwgMHg4MiwKKy8qMDkwMCovMHhFNCwgMHgzNCwgMHgwMCwgMHgyMiwgMHgyNSwgMHg0MiwgMHhGRCwgMHhFNCwKKwkweDMzLCAweEZDLCAweDIyLCAweDg1LCAweDQyLCAweDQyLCAweDg1LCAweDQxLAorLyowOTEwKi8weDQxLCAweDg1LCAweDQwLCAweDQwLCAweDIyLCAweEVELCAweDRDLCAweDYwLAorCTB4MDMsIDB4MDIsIDB4MDksIDB4RTUsIDB4RUYsIDB4NEUsIDB4NzAsIDB4MzcsCisvKjA5MjAqLzB4OTAsIDB4MDcsIDB4MjYsIDB4MTIsIDB4MDcsIDB4ODksIDB4RTAsIDB4RkQsCisJMHgxMiwgMHgwNywgMHhDQywgMHhFRCwgMHhGMCwgMHg5MCwgMHgwNywgMHgyOCwKKy8qMDkzMCovMHgxMiwgMHgwNywgMHg4OSwgMHhFMCwgMHhGRCwgMHgxMiwgMHgwNywgMHhEOCwKKwkweEVELCAweEYwLCAweDEyLCAweDA3LCAweDg2LCAweEUwLCAweDU0LCAweDFGLAorLyowOTQwKi8weEZELCAweDEyLCAweDA4LCAweDgxLCAweEY1LCAweDgzLCAweEVELCAweEYwLAorCTB4OTAsIDB4MDcsIDB4MjQsIDB4MTIsIDB4MDcsIDB4ODksIDB4RTAsIDB4NTQsCisvKjA5NTAqLzB4MUYsIDB4RkQsIDB4MTIsIDB4MDgsIDB4MzUsIDB4RUQsIDB4RjAsIDB4RUYsCisJMHg2NCwgMHgwNCwgMHg0RSwgMHg3MCwgMHgzNywgMHg5MCwgMHgwNywgMHgyNiwKKy8qMDk2MCovMHgxMiwgMHgwNywgMHg4OSwgMHhFMCwgMHhGRCwgMHgxMiwgMHgwNywgMHhFNCwKKwkweEVELCAweEYwLCAweDkwLCAweDA3LCAweDI4LCAweDEyLCAweDA3LCAweDg5LAorLyowOTcwKi8weEUwLCAweEZELCAweDEyLCAweDA3LCAweEYwLCAweEVELCAweEYwLCAweDEyLAorCTB4MDcsIDB4ODYsIDB4RTAsIDB4NTQsIDB4MUYsIDB4RkQsIDB4MTIsIDB4MDgsCisvKjA5ODAqLzB4OEIsIDB4RjUsIDB4ODMsIDB4RUQsIDB4RjAsIDB4OTAsIDB4MDcsIDB4MjQsCisJMHgxMiwgMHgwNywgMHg4OSwgMHhFMCwgMHg1NCwgMHgxRiwgMHhGRCwgMHgxMiwKKy8qMDk5MCovMHgwOCwgMHg0MSwgMHhFRCwgMHhGMCwgMHhFRiwgMHg2NCwgMHgwMSwgMHg0RSwKKwkweDcwLCAweDA0LCAweDdELCAweDAxLCAweDgwLCAweDAyLCAweDdELCAweDAwLAorLyowOUEwKi8weEVGLCAweDY0LCAweDAyLCAweDRFLCAweDcwLCAweDA0LCAweDdGLCAweDAxLAorCTB4ODAsIDB4MDIsIDB4N0YsIDB4MDAsIDB4RUYsIDB4NEQsIDB4NjAsIDB4NzgsCisvKjA5QjAqLzB4OTAsIDB4MDcsIDB4MjYsIDB4MTIsIDB4MDcsIDB4MzUsIDB4RTAsIDB4RkYsCisJMHgxMiwgMHgwNywgMHhGQywgMHhFRiwgMHgxMiwgMHgwNywgMHgzMSwgMHhFMCwKKy8qMDlDMCovMHhGRiwgMHgxMiwgMHgwOCwgMHgwOCwgMHhFRiwgMHhGMCwgMHg5MCwgMHgwNywKKwkweDIyLCAweDEyLCAweDA3LCAweDM1LCAweEUwLCAweDU0LCAweDFGLCAweEZGLAorLyowOUQwKi8weDEyLCAweDA4LCAweDRELCAweEVGLCAweEYwLCAweDkwLCAweDA3LCAweDI0LAorCTB4MTIsIDB4MDcsIDB4MzUsIDB4RTAsIDB4NTQsIDB4MUYsIDB4RkYsIDB4MTIsCisvKjA5RTAqLzB4MDgsIDB4NTksIDB4RUYsIDB4RjAsIDB4MjIsIDB4MTIsIDB4MDcsIDB4Q0MsCisJMHhFNCwgMHhGMCwgMHgxMiwgMHgwNywgMHhEOCwgMHhFNCwgMHhGMCwgMHgxMiwKKy8qMDlGMCovMHgwOCwgMHg4MSwgMHhGNSwgMHg4MywgMHhFNCwgMHhGMCwgMHgxMiwgMHgwOCwKKwkweDM1LCAweDc0LCAweDE0LCAweEYwLCAweDEyLCAweDA3LCAweEU0LCAweEU0LAorLyowQTAwKi8weEYwLCAweDEyLCAweDA3LCAweEYwLCAweEU0LCAweEYwLCAweDEyLCAweDA4LAorCTB4OEIsIDB4RjUsIDB4ODMsIDB4RTQsIDB4RjAsIDB4MTIsIDB4MDgsIDB4NDEsCisvKjBBMTAqLzB4NzQsIDB4MTQsIDB4RjAsIDB4MTIsIDB4MDcsIDB4RkMsIDB4RTQsIDB4RjAsCisJMHgxMiwgMHgwOCwgMHgwOCwgMHhFNCwgMHhGMCwgMHgxMiwgMHgwOCwgMHg0RCwKKy8qMEEyMCovMHhFNCwgMHhGMCwgMHgxMiwgMHgwOCwgMHg1OSwgMHg3NCwgMHgxNCwgMHhGMCwKKwkweDIyLCAweDUzLCAweEY5LCAweEY3LCAweDc1LCAweEZDLCAweDEwLCAweEU0LAorLyowQTMwKi8weEY1LCAweEZELCAweDc1LCAweEZFLCAweDMwLCAweEY1LCAweEZGLCAweEU1LAorCTB4RTcsIDB4MjAsIDB4RTcsIDB4MDMsIDB4NDMsIDB4RjksIDB4MDgsIDB4RTUsCisvKjBBNDAqLzB4RTYsIDB4MjAsIDB4RTcsIDB4MEIsIDB4NzgsIDB4RkYsIDB4RTQsIDB4RjYsCisJMHhEOCwgMHhGRCwgMHg1MywgMHhFNiwgMHhGRSwgMHg4MCwgMHgwOSwgMHg3OCwKKy8qMEE1MCovMHgwOCwgMHhFNCwgMHhGNiwgMHhEOCwgMHhGRCwgMHg1MywgMHhFNiwgMHhGRSwKKwkweDc1LCAweDgxLCAweDgwLCAweEU0LCAweEY1LCAweEE4LCAweEQyLCAweEE4LAorLyowQTYwKi8weEMyLCAweEE5LCAweEQyLCAweEFGLCAweEU1LCAweEUyLCAweDIwLCAweEU1LAorCTB4MDUsIDB4MjAsIDB4RTYsIDB4MDIsIDB4ODAsIDB4MDMsIDB4NDMsIDB4RTEsCisvKjBBNzAqLzB4MDIsIDB4RTUsIDB4RTIsIDB4MjAsIDB4RTAsIDB4MEUsIDB4OTAsIDB4MDAsCisJMHgwMCwgMHg3RiwgMHgwMCwgMHg3RSwgMHgwOCwgMHhFNCwgMHhGMCwgMHhBMywKKy8qMEE4MCovMHhERiwgMHhGQywgMHhERSwgMHhGQSwgMHgwMiwgMHgwQSwgMHhEQiwgMHg0MywKKwkweEZBLCAweDAxLCAweEMwLCAweEUwLCAweEMwLCAweEYwLCAweEMwLCAweDgzLAorLyowQTkwKi8weEMwLCAweDgyLCAweEMwLCAweEQwLCAweDEyLCAweDFDLCAweEU3LCAweEQwLAorCTB4RDAsIDB4RDAsIDB4ODIsIDB4RDAsIDB4ODMsIDB4RDAsIDB4RjAsIDB4RDAsCisvKjBBQTAqLzB4RTAsIDB4NTMsIDB4RkEsIDB4RkUsIDB4MzIsIDB4MDIsIDB4MUIsIDB4NTUsCisJMHhFNCwgMHg5MywgMHhBMywgMHhGOCwgMHhFNCwgMHg5MywgMHhBMywgMHhGNiwKKy8qMEFCMCovMHgwOCwgMHhERiwgMHhGOSwgMHg4MCwgMHgyOSwgMHhFNCwgMHg5MywgMHhBMywKKwkweEY4LCAweDU0LCAweDA3LCAweDI0LCAweDBDLCAweEM4LCAweEMzLCAweDMzLAorLyowQUMwKi8weEM0LCAweDU0LCAweDBGLCAweDQ0LCAweDIwLCAweEM4LCAweDgzLCAweDQwLAorCTB4MDQsIDB4RjQsIDB4NTYsIDB4ODAsIDB4MDEsIDB4NDYsIDB4RjYsIDB4REYsCisvKjBBRDAqLzB4RTQsIDB4ODAsIDB4MEIsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsCisJMHgyMCwgMHg0MCwgMHg4MCwgMHg5MCwgMHgwMCwgMHgzRiwgMHhFNCwgMHg3RSwKKy8qMEFFMCovMHgwMSwgMHg5MywgMHg2MCwgMHhDMSwgMHhBMywgMHhGRiwgMHg1NCwgMHgzRiwKKwkweDMwLCAweEU1LCAweDA5LCAweDU0LCAweDFGLCAweEZFLCAweEU0LCAweDkzLAorLyowQUYwKi8weEEzLCAweDYwLCAweDAxLCAweDBFLCAweENGLCAweDU0LCAweEMwLCAweDI1LAorCTB4RTAsIDB4NjAsIDB4QUQsIDB4NDAsIDB4QjgsIDB4ODAsIDB4RkUsIDB4OEMsCisvKjBCMDAqLzB4NjQsIDB4OEQsIDB4NjUsIDB4OEEsIDB4NjYsIDB4OEIsIDB4NjcsIDB4RTQsCisJMHhGNSwgMHg2OSwgMHhFRiwgMHg0RSwgMHg3MCwgMHgwMywgMHgwMiwgMHgxRCwKKy8qMEIxMCovMHg1NSwgMHhFNCwgMHhGNSwgMHg2OCwgMHhFNSwgMHg2NywgMHg0NSwgMHg2NiwKKwkweDcwLCAweDMyLCAweDEyLCAweDA3LCAweDJBLCAweDc1LCAweDgzLCAweDkwLAorLyowQjIwKi8weEU0LCAweDEyLCAweDA3LCAweDI5LCAweDc1LCAweDgzLCAweEMyLCAweEU0LAorCTB4MTIsIDB4MDcsIDB4MjksIDB4NzUsIDB4ODMsIDB4QzQsIDB4RTQsIDB4MTIsCisvKjBCMzAqLzB4MDgsIDB4NzAsIDB4NzAsIDB4MjksIDB4MTIsIDB4MDcsIDB4MkEsIDB4NzUsCisJMHg4MywgMHg5MiwgMHhFNCwgMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywKKy8qMEI0MCovMHhDNiwgMHhFNCwgMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywgMHhDOCwKKwkweEU0LCAweEYwLCAweDgwLCAweDExLCAweDkwLCAweDA3LCAweDI2LCAweDEyLAorLyowQjUwKi8weDA3LCAweDM1LCAweEU0LCAweDEyLCAweDA4LCAweDcwLCAweDcwLCAweDA1LAorCTB4MTIsIDB4MDcsIDB4MzIsIDB4RTQsIDB4RjAsIDB4MTIsIDB4MUQsIDB4NTUsCisvKjBCNjAqLzB4MTIsIDB4MUUsIDB4QkYsIDB4RTUsIDB4NjcsIDB4NDUsIDB4NjYsIDB4NzAsCisJMHgzMywgMHgxMiwgMHgwNywgMHgyQSwgMHg3NSwgMHg4MywgMHg5MCwgMHhFNSwKKy8qMEI3MCovMHg0MSwgMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywgMHhDMiwgMHhFNSwKKwkweDQxLCAweDEyLCAweDA3LCAweDI5LCAweDc1LCAweDgzLCAweEM0LCAweDEyLAorLyowQjgwKi8weDA4LCAweDZFLCAweDcwLCAweDI5LCAweDEyLCAweDA3LCAweDJBLCAweDc1LAorCTB4ODMsIDB4OTIsIDB4RTUsIDB4NDAsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzUsCisvKjBCOTAqLzB4ODMsIDB4QzYsIDB4RTUsIDB4NDAsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzUsCisJMHg4MywgMHhDOCwgMHg4MCwgMHgwRSwgMHg5MCwgMHgwNywgMHgyNiwgMHgxMiwKKy8qMEJBMCovMHgwNywgMHgzNSwgMHgxMiwgMHgwOCwgMHg2RSwgMHg3MCwgMHgwNiwgMHgxMiwKKwkweDA3LCAweDMyLCAweEU1LCAweDQwLCAweEYwLCAweEFGLCAweDY5LCAweDdFLAorLyowQkIwKi8weDAwLCAweEFELCAweDY3LCAweEFDLCAweDY2LCAweDEyLCAweDA0LCAweDQ0LAorCTB4MTIsIDB4MDcsIDB4MkEsIDB4NzUsIDB4ODMsIDB4Q0EsIDB4RTAsIDB4RDMsCisvKjBCQzAqLzB4OTQsIDB4MDAsIDB4NTAsIDB4MEMsIDB4MDUsIDB4NjgsIDB4RTUsIDB4NjgsCisJMHhDMywgMHg5NCwgMHgwNSwgMHg1MCwgMHgwMywgMHgwMiwgMHgwQiwgMHgxNCwKKy8qMEJEMCovMHgyMiwgMHg4QywgMHg2MCwgMHg4RCwgMHg2MSwgMHgxMiwgMHgwOCwgMHhEQSwKKwkweDc0LCAweDIwLCAweDQwLCAweDBELCAweDJGLCAweEY1LCAweDgyLCAweDc0LAorLyowQkUwKi8weDAzLCAweDNFLCAweEY1LCAweDgzLCAweEU1LCAweDNFLCAweEYwLCAweDgwLAorCTB4MEIsIDB4MkYsIDB4RjUsIDB4ODIsIDB4NzQsIDB4MDMsIDB4M0UsIDB4RjUsCisvKjBCRjAqLzB4ODMsIDB4RTUsIDB4M0MsIDB4RjAsIDB4RTUsIDB4M0MsIDB4RDMsIDB4OTUsCisJMHgzRSwgMHg0MCwgMHgzQywgMHhFNSwgMHg2MSwgMHg0NSwgMHg2MCwgMHg3MCwKKy8qMEMwMCovMHgxMCwgMHhFOSwgMHgxMiwgMHgwOSwgMHgwNCwgMHhFNSwgMHgzRSwgMHgxMiwKKwkweDA3LCAweDY4LCAweDQwLCAweDNCLCAweDEyLCAweDA4LCAweDk1LCAweDgwLAorLyowQzEwKi8weDE4LCAweEU1LCAweDNFLCAweEMzLCAweDk1LCAweDM4LCAweDQwLCAweDFELAorCTB4ODUsIDB4M0UsIDB4MzgsIDB4RTUsIDB4M0UsIDB4NjAsIDB4MDUsIDB4ODUsCisvKjBDMjAqLzB4M0YsIDB4MzksIDB4ODAsIDB4MDMsIDB4ODUsIDB4MzksIDB4MzksIDB4OEYsCisJMHgzQSwgMHgxMiwgMHgwOCwgMHgxNCwgMHhFNSwgMHgzRSwgMHgxMiwgMHgwNywKKy8qMEMzMCovMHhDMCwgMHhFNSwgMHgzRiwgMHhGMCwgMHgyMiwgMHg4MCwgMHg0MywgMHhFNSwKKwkweDYxLCAweDQ1LCAweDYwLCAweDcwLCAweDE5LCAweDEyLCAweDA3LCAweDVGLAorLyowQzQwKi8weDQwLCAweDA1LCAweDEyLCAweDA4LCAweDlFLCAweDgwLCAweDI3LCAweDEyLAorCTB4MDksIDB4MEIsIDB4MTIsIDB4MDgsIDB4MTQsIDB4RTUsIDB4NDIsIDB4MTIsCisvKjBDNTAqLzB4MDcsIDB4QzAsIDB4RTUsIDB4NDEsIDB4RjAsIDB4MjIsIDB4RTUsIDB4M0MsCisJMHhDMywgMHg5NSwgMHgzOCwgMHg0MCwgMHgxRCwgMHg4NSwgMHgzQywgMHgzOCwKKy8qMEM2MCovMHhFNSwgMHgzQywgMHg2MCwgMHgwNSwgMHg4NSwgMHgzRCwgMHgzOSwgMHg4MCwKKwkweDAzLCAweDg1LCAweDM5LCAweDM5LCAweDhGLCAweDNBLCAweDEyLCAweDA4LAorLyowQzcwKi8weDE0LCAweEU1LCAweDNDLCAweDEyLCAweDA3LCAweEMwLCAweEU1LCAweDNELAorCTB4RjAsIDB4MjIsIDB4ODUsIDB4MzgsIDB4MzgsIDB4ODUsIDB4MzksIDB4MzksCisvKjBDODAqLzB4ODUsIDB4M0EsIDB4M0EsIDB4MTIsIDB4MDgsIDB4MTQsIDB4RTUsIDB4MzgsCisJMHgxMiwgMHgwNywgMHhDMCwgMHhFNSwgMHgzOSwgMHhGMCwgMHgyMiwgMHg3RiwKKy8qMEM5MCovMHgwNiwgMHgxMiwgMHgxNywgMHgzMSwgMHgxMiwgMHgxRCwgMHgyMywgMHgxMiwKKwkweDBFLCAweDA0LCAweDEyLCAweDBFLCAweDMzLCAweEUwLCAweDQ0LCAweDBBLAorLyowQ0EwKi8weEYwLCAweDc0LCAweDhFLCAweEZFLCAweDEyLCAweDBFLCAweDA0LCAweDEyLAorCTB4MEUsIDB4MEIsIDB4RUYsIDB4RjAsIDB4RTUsIDB4MjgsIDB4MzAsIDB4RTUsCisvKjBDQjAqLzB4MDMsIDB4RDMsIDB4ODAsIDB4MDEsIDB4QzMsIDB4NDAsIDB4MDUsIDB4NzUsCisJMHgxNCwgMHgyMCwgMHg4MCwgMHgwMywgMHg3NSwgMHgxNCwgMHgwOCwgMHgxMiwKKy8qMENDMCovMHgwRSwgMHgwNCwgMHg3NSwgMHg4MywgMHg4QSwgMHhFNSwgMHgxNCwgMHhGMCwKKwkweEI0LCAweEZGLCAweDA1LCAweDc1LCAweDEyLCAweDgwLCAweDgwLCAweDA2LAorLyowQ0QwKi8weEU1LCAweDE0LCAweEMzLCAweDEzLCAweEY1LCAweDEyLCAweEU0LCAweEY1LAorCTB4MTYsIDB4RjUsIDB4N0YsIDB4MTIsIDB4MTksIDB4MzYsIDB4MTIsIDB4MTMsCisvKjBDRTAqLzB4QTMsIDB4RTUsIDB4MEEsIDB4QzMsIDB4OTQsIDB4MDEsIDB4NTAsIDB4MDksCisJMHgwNSwgMHgxNiwgMHhFNSwgMHgxNiwgMHhDMywgMHg5NCwgMHgxNCwgMHg0MCwKKy8qMENGMCovMHhFQSwgMHhFNSwgMHhFNCwgMHgyMCwgMHhFNywgMHgyOCwgMHgxMiwgMHgwRSwKKwkweDA0LCAweDc1LCAweDgzLCAweEQyLCAweEUwLCAweDU0LCAweDA4LCAweEQzLAorLyowRDAwKi8weDk0LCAweDAwLCAweDQwLCAweDA0LCAweDdGLCAweDAxLCAweDgwLCAweDAyLAorCTB4N0YsIDB4MDAsIDB4RTUsIDB4MEEsIDB4QzMsIDB4OTQsIDB4MDEsIDB4NDAsCisvKjBEMTAqLzB4MDQsIDB4N0UsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N0UsIDB4MDAsIDB4RUYsCisJMHg1RSwgMHg2MCwgMHgwMywgMHgxMiwgMHgxRCwgMHhENywgMHhFNSwgMHg3RiwKKy8qMEQyMCovMHhDMywgMHg5NCwgMHgxMSwgMHg0MCwgMHgxNCwgMHgxMiwgMHgwRSwgMHgwNCwKKwkweDc1LCAweDgzLCAweEQyLCAweEUwLCAweDQ0LCAweDgwLCAweEYwLCAweEU1LAorLyowRDMwKi8weEU0LCAweDIwLCAweEU3LCAweDBGLCAweDEyLCAweDFELCAweEQ3LCAweDgwLAorCTB4MEEsIDB4MTIsIDB4MEUsIDB4MDQsIDB4NzUsIDB4ODMsIDB4RDIsIDB4RTAsCisvKjBENDAqLzB4NTQsIDB4N0YsIDB4RjAsIDB4MTIsIDB4MUQsIDB4MjMsIDB4MjIsIDB4NzQsCisJMHg4QSwgMHg4NSwgMHgwOCwgMHg4MiwgMHhGNSwgMHg4MywgMHhFNSwgMHgxNywKKy8qMEQ1MCovMHhGMCwgMHgxMiwgMHgwRSwgMHgzQSwgMHhFNCwgMHhGMCwgMHg5MCwgMHgwNywKKwkweDAyLCAweEUwLCAweDEyLCAweDBFLCAweDE3LCAweDc1LCAweDgzLCAweDkwLAorLyowRDYwKi8weEVGLCAweEYwLCAweDc0LCAweDkyLCAweEZFLCAweEU1LCAweDA4LCAweDQ0LAorCTB4MDcsIDB4RkYsIDB4RjUsIDB4ODIsIDB4OEUsIDB4ODMsIDB4RTAsIDB4NTQsCisvKjBENzAqLzB4QzAsIDB4RkQsIDB4OTAsIDB4MDcsIDB4MDMsIDB4RTAsIDB4NTQsIDB4M0YsCisJMHg0RCwgMHg4RiwgMHg4MiwgMHg4RSwgMHg4MywgMHhGMCwgMHg5MCwgMHgwNywKKy8qMEQ4MCovMHgwNCwgMHhFMCwgMHgxMiwgMHgwRSwgMHgxNywgMHg3NSwgMHg4MywgMHg4MiwKKwkweEVGLCAweEYwLCAweDkwLCAweDA3LCAweDA1LCAweEUwLCAweEZGLCAweEVELAorLyowRDkwKi8weDQ0LCAweDA3LCAweEY1LCAweDgyLCAweDc1LCAweDgzLCAweEI0LCAweEVGLAorCTB4MTIsIDB4MEUsIDB4MDMsIDB4NzUsIDB4ODMsIDB4ODAsIDB4RTAsIDB4NTQsCisvKjBEQTAqLzB4QkYsIDB4RjAsIDB4MzAsIDB4MzcsIDB4MEEsIDB4MTIsIDB4MEUsIDB4OTEsCisJMHg3NSwgMHg4MywgMHg5NCwgMHhFMCwgMHg0NCwgMHg4MCwgMHhGMCwgMHgzMCwKKy8qMERCMCovMHgzOCwgMHgwQSwgMHgxMiwgMHgwRSwgMHg5MSwgMHg3NSwgMHg4MywgMHg5MiwKKwkweEUwLCAweDQ0LCAweDgwLCAweEYwLCAweEU1LCAweDI4LCAweDMwLCAweEU0LAorLyowREMwKi8weDFBLCAweDIwLCAweDM5LCAweDBBLCAweDEyLCAweDBFLCAweDA0LCAweDc1LAorCTB4ODMsIDB4ODgsIDB4RTAsIDB4NTQsIDB4N0YsIDB4RjAsIDB4MjAsIDB4M0EsCisvKjBERDAqLzB4MEEsIDB4MTIsIDB4MEUsIDB4MDQsIDB4NzUsIDB4ODMsIDB4ODgsIDB4RTAsCisJMHg1NCwgMHhCRiwgMHhGMCwgMHg3NCwgMHg4QywgMHhGRSwgMHgxMiwgMHgwRSwKKy8qMERFMCovMHgwNCwgMHg4RSwgMHg4MywgMHhFMCwgMHg1NCwgMHgwRiwgMHgxMiwgMHgwRSwKKwkweDAzLCAweDc1LCAweDgzLCAweDg2LCAweEUwLCAweDU0LCAweEJGLCAweEYwLAorLyowREYwKi8weEU1LCAweDA4LCAweDQ0LCAweDA2LCAweDEyLCAweDBELCAweEZELCAweDc1LAorCTB4ODMsIDB4OEEsIDB4RTQsIDB4RjAsIDB4MjIsIDB4RjUsIDB4ODIsIDB4NzUsCisvKjBFMDAqLzB4ODMsIDB4ODIsIDB4RTQsIDB4RjAsIDB4RTUsIDB4MDgsIDB4NDQsIDB4MDcsCisJMHhGNSwgMHg4MiwgMHgyMiwgMHg4RSwgMHg4MywgMHhFMCwgMHhGNSwgMHgxMCwKKy8qMEUxMCovMHg1NCwgMHhGRSwgMHhGMCwgMHhFNSwgMHgxMCwgMHg0NCwgMHgwMSwgMHhGRiwKKwkweEU1LCAweDA4LCAweEZELCAweEVELCAweDQ0LCAweDA3LCAweEY1LCAweDgyLAorLyowRTIwKi8weDIyLCAweEU1LCAweDE1LCAweEM0LCAweDU0LCAweDA3LCAweEZGLCAweEU1LAorCTB4MDgsIDB4RkQsIDB4RUQsIDB4NDQsIDB4MDgsIDB4RjUsIDB4ODIsIDB4NzUsCisvKjBFMzAqLzB4ODMsIDB4ODIsIDB4MjIsIDB4NzUsIDB4ODMsIDB4ODAsIDB4RTAsIDB4NDQsCisJMHg0MCwgMHhGMCwgMHhFNSwgMHgwOCwgMHg0NCwgMHgwOCwgMHhGNSwgMHg4MiwKKy8qMEU0MCovMHg3NSwgMHg4MywgMHg4QSwgMHgyMiwgMHhFNSwgMHgxNiwgMHgyNSwgMHhFMCwKKwkweDI1LCAweEUwLCAweDI0LCAweEFGLCAweEY1LCAweDgyLCAweEU0LCAweDM0LAorLyowRTUwKi8weDFBLCAweEY1LCAweDgzLCAweEU0LCAweDkzLCAweEY1LCAweDBELCAweDIyLAorCTB4NDMsIDB4RTEsIDB4MTAsIDB4NDMsIDB4RTEsIDB4ODAsIDB4NTMsIDB4RTEsCisvKjBFNjAqLzB4RkQsIDB4ODUsIDB4RTEsIDB4MTAsIDB4MjIsIDB4RTUsIDB4MTYsIDB4MjUsCisJMHhFMCwgMHgyNSwgMHhFMCwgMHgyNCwgMHhCMiwgMHhGNSwgMHg4MiwgMHhFNCwKKy8qMEU3MCovMHgzNCwgMHgxQSwgMHhGNSwgMHg4MywgMHhFNCwgMHg5MywgMHgyMiwgMHg4NSwKKwkweDU1LCAweDgyLCAweDg1LCAweDU0LCAweDgzLCAweEU1LCAweDE1LCAweEYwLAorLyowRTgwKi8weDIyLCAweEU1LCAweEUyLCAweDU0LCAweDIwLCAweEQzLCAweDk0LCAweDAwLAorCTB4MjIsIDB4RTUsIDB4RTIsIDB4NTQsIDB4NDAsIDB4RDMsIDB4OTQsIDB4MDAsCisvKjBFOTAqLzB4MjIsIDB4RTUsIDB4MDgsIDB4NDQsIDB4MDYsIDB4RjUsIDB4ODIsIDB4MjIsCisJMHhGRCwgMHhFNSwgMHgwOCwgMHhGQiwgMHhFQiwgMHg0NCwgMHgwNywgMHhGNSwKKy8qMEVBMCovMHg4MiwgMHgyMiwgMHg1MywgMHhGOSwgMHhGNywgMHg3NSwgMHhGRSwgMHgzMCwKKwkweDIyLCAweEVGLCAweDRFLCAweDcwLCAweDI2LCAweDEyLCAweDA3LCAweENDLAorLyowRUIwKi8weEUwLCAweEZELCAweDkwLCAweDA3LCAweDI2LCAweDEyLCAweDA3LCAweDdCLAorCTB4MTIsIDB4MDcsIDB4RDgsIDB4RTAsIDB4RkQsIDB4OTAsIDB4MDcsIDB4MjgsCisvKjBFQzAqLzB4MTIsIDB4MDcsIDB4N0IsIDB4MTIsIDB4MDgsIDB4ODEsIDB4MTIsIDB4MDcsCisJMHg3MiwgMHgxMiwgMHgwOCwgMHgzNSwgMHhFMCwgMHg5MCwgMHgwNywgMHgyNCwKKy8qMEVEMCovMHgxMiwgMHgwNywgMHg3OCwgMHhFRiwgMHg2NCwgMHgwNCwgMHg0RSwgMHg3MCwKKwkweDI5LCAweDEyLCAweDA3LCAweEU0LCAweEUwLCAweEZELCAweDkwLCAweDA3LAorLyowRUUwKi8weDI2LCAweDEyLCAweDA3LCAweDdCLCAweDEyLCAweDA3LCAweEYwLCAweEUwLAorCTB4RkQsIDB4OTAsIDB4MDcsIDB4MjgsIDB4MTIsIDB4MDcsIDB4N0IsIDB4MTIsCisvKjBFRjAqLzB4MDgsIDB4OEIsIDB4MTIsIDB4MDcsIDB4NzIsIDB4MTIsIDB4MDgsIDB4NDEsCisJMHhFMCwgMHg1NCwgMHgxRiwgMHhGRCwgMHg5MCwgMHgwNywgMHgyNCwgMHgxMiwKKy8qMEYwMCovMHgwNywgMHg3QiwgMHhFRiwgMHg2NCwgMHgwMSwgMHg0RSwgMHg3MCwgMHgwNCwKKwkweDdELCAweDAxLCAweDgwLCAweDAyLCAweDdELCAweDAwLCAweEVGLCAweDY0LAorLyowRjEwKi8weDAyLCAweDRFLCAweDcwLCAweDA0LCAweDdGLCAweDAxLCAweDgwLCAweDAyLAorCTB4N0YsIDB4MDAsIDB4RUYsIDB4NEQsIDB4NjAsIDB4MzUsIDB4MTIsIDB4MDcsCisvKjBGMjAqLzB4RkMsIDB4RTAsIDB4RkYsIDB4OTAsIDB4MDcsIDB4MjYsIDB4MTIsIDB4MDcsCisJMHg4OSwgMHhFRiwgMHhGMCwgMHgxMiwgMHgwOCwgMHgwOCwgMHhFMCwgMHhGRiwKKy8qMEYzMCovMHg5MCwgMHgwNywgMHgyOCwgMHgxMiwgMHgwNywgMHg4OSwgMHhFRiwgMHhGMCwKKwkweDEyLCAweDA4LCAweDRELCAweEUwLCAweDU0LCAweDFGLCAweEZGLCAweDEyLAorLyowRjQwKi8weDA3LCAweDg2LCAweEVGLCAweEYwLCAweDEyLCAweDA4LCAweDU5LCAweEUwLAorCTB4NTQsIDB4MUYsIDB4RkYsIDB4OTAsIDB4MDcsIDB4MjQsIDB4MTIsIDB4MDcsCisvKjBGNTAqLzB4ODksIDB4RUYsIDB4RjAsIDB4MjIsIDB4RTQsIDB4RjUsIDB4NTMsIDB4MTIsCisJMHgwRSwgMHg4MSwgMHg0MCwgMHgwNCwgMHg3RiwgMHgwMSwgMHg4MCwgMHgwMiwKKy8qMEY2MCovMHg3RiwgMHgwMCwgMHgxMiwgMHgwRSwgMHg4OSwgMHg0MCwgMHgwNCwgMHg3RSwKKwkweDAxLCAweDgwLCAweDAyLCAweDdFLCAweDAwLCAweEVFLCAweDRGLCAweDcwLAorLyowRjcwKi8weDAzLCAweDAyLCAweDBGLCAweEY2LCAweDg1LCAweEUxLCAweDEwLCAweDQzLAorCTB4RTEsIDB4MDIsIDB4NTMsIDB4RTEsIDB4MEYsIDB4ODUsIDB4RTEsIDB4MTAsCisvKjBGODAqLzB4RTQsIDB4RjUsIDB4NTEsIDB4RTUsIDB4RTMsIDB4NTQsIDB4M0YsIDB4RjUsCisJMHg1MiwgMHgxMiwgMHgwRSwgMHg4OSwgMHg0MCwgMHgxRCwgMHhBRCwgMHg1MiwKKy8qMEY5MCovMHhBRiwgMHg1MSwgMHgxMiwgMHgxMSwgMHgxOCwgMHhFRiwgMHg2MCwgMHgwOCwKKwkweDg1LCAweEUxLCAweDEwLCAweDQzLCAweEUxLCAweDQwLCAweDgwLCAweDBCLAorLyowRkEwKi8weDUzLCAweEUxLCAweEJGLCAweDEyLCAweDBFLCAweDU4LCAweDEyLCAweDAwLAorCTB4MDYsIDB4ODAsIDB4RkIsIDB4RTUsIDB4RTMsIDB4NTQsIDB4M0YsIDB4RjUsCisvKjBGQjAqLzB4NTEsIDB4RTUsIDB4RTQsIDB4NTQsIDB4M0YsIDB4RjUsIDB4NTIsIDB4MTIsCisJMHgwRSwgMHg4MSwgMHg0MCwgMHgxRCwgMHhBRCwgMHg1MiwgMHhBRiwgMHg1MSwKKy8qMEZDMCovMHgxMiwgMHgxMSwgMHgxOCwgMHhFRiwgMHg2MCwgMHgwOCwgMHg4NSwgMHhFMSwKKwkweDEwLCAweDQzLCAweEUxLCAweDIwLCAweDgwLCAweDBCLCAweDUzLCAweEUxLAorLyowRkQwKi8weERGLCAweDEyLCAweDBFLCAweDU4LCAweDEyLCAweDAwLCAweDA2LCAweDgwLAorCTB4RkIsIDB4MTIsIDB4MEUsIDB4ODEsIDB4NDAsIDB4MDQsIDB4N0YsIDB4MDEsCisvKjBGRTAqLzB4ODAsIDB4MDIsIDB4N0YsIDB4MDAsIDB4MTIsIDB4MEUsIDB4ODksIDB4NDAsCisJMHgwNCwgMHg3RSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3RSwgMHgwMCwgMHhFRSwKKy8qMEZGMCovMHg0RiwgMHg2MCwgMHgwMywgMHgxMiwgMHgwRSwgMHg1QiwgMHgyMiwgMHgxMiwKKwkweDBFLCAweDIxLCAweEVGLCAweEYwLCAweDEyLCAweDEwLCAweDkxLCAweDIyLAorLyoxMDAwKi8weDAyLCAweDExLCAweDAwLCAweDAyLCAweDEwLCAweDQwLCAweDAyLCAweDEwLAorCTB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisvKjEwMTAqLzB4MDEsIDB4MjAsIDB4MDEsIDB4MjAsIDB4RTQsIDB4RjUsIDB4NTcsIDB4MTIsCisJMHgxNiwgMHhCRCwgMHgxMiwgMHgxNiwgMHg0NCwgMHhFNCwgMHgxMiwgMHgxMCwKKy8qMTAyMCovMHg1NiwgMHgxMiwgMHgxNCwgMHhCNywgMHg5MCwgMHgwNywgMHgyNiwgMHgxMiwKKwkweDA3LCAweDM1LCAweEU0LCAweDEyLCAweDA3LCAweDMxLCAweEU0LCAweEYwLAorLyoxMDMwKi8weDEyLCAweDEwLCAweDU2LCAweDEyLCAweDE0LCAweEI3LCAweDkwLCAweDA3LAorCTB4MjYsIDB4MTIsIDB4MDcsIDB4MzUsIDB4RTUsIDB4NDEsIDB4MTIsIDB4MDcsCisvKjEwNDAqLzB4MzEsIDB4RTUsIDB4NDAsIDB4RjAsIDB4QUYsIDB4NTcsIDB4N0UsIDB4MDAsCisJMHhBRCwgMHg1NiwgMHg3QywgMHgwMCwgMHgxMiwgMHgwNCwgMHg0NCwgMHhBRiwKKy8qMTA1MCovMHg1NiwgMHg3RSwgMHgwMCwgMHgwMiwgMHgxMSwgMHhFRSwgMHhGRiwgMHg5MCwKKwkweDA3LCAweDIwLCAweEEzLCAweEUwLCAweEZELCAweEU0LCAweEY1LCAweDU2LAorLyoxMDYwKi8weEY1LCAweDQwLCAweEZFLCAweEZDLCAweEFCLCAweDU2LCAweEZBLCAweDEyLAorCTB4MTEsIDB4NTEsIDB4N0YsIDB4MEYsIDB4N0QsIDB4MTgsIDB4RTQsIDB4RjUsCisvKjEwNzAqLzB4NTYsIDB4RjUsIDB4NDAsIDB4RkUsIDB4RkMsIDB4QUIsIDB4NTYsIDB4RkEsCisJMHgxMiwgMHgxNSwgMHg0MSwgMHhBRiwgMHg1NiwgMHg3RSwgMHgwMCwgMHgxMiwKKy8qMTA4MCovMHgxQSwgMHhGRiwgMHhFNCwgMHhGRiwgMHhGNSwgMHg1NiwgMHg3RCwgMHgxRiwKKwkweEY1LCAweDQwLCAweEZFLCAweEZDLCAweEFCLCAweDU2LCAweEZBLCAweDIyLAorLyoxMDkwKi8weDIyLCAweEU0LCAweEY1LCAweDU1LCAweEU1LCAweDA4LCAweEZELCAweDc0LAorCTB4QTAsIDB4RjUsIDB4NTYsIDB4RUQsIDB4NDQsIDB4MDcsIDB4RjUsIDB4NTcsCisvKjEwQTAqLzB4RTUsIDB4MjgsIDB4MzAsIDB4RTUsIDB4MDMsIDB4RDMsIDB4ODAsIDB4MDEsCisJMHhDMywgMHg0MCwgMHgwNSwgMHg3RiwgMHgyOCwgMHhFRiwgMHg4MCwgMHgwNCwKKy8qMTBCMCovMHg3RiwgMHgxNCwgMHhFRiwgMHhDMywgMHgxMywgMHhGNSwgMHg1NCwgMHhFNCwKKwkweEY5LCAweDEyLCAweDBFLCAweDE4LCAweDc1LCAweDgzLCAweDhFLCAweEUwLAorLyoxMEMwKi8weEY1LCAweDEwLCAweENFLCAweEVGLCAweENFLCAweEVFLCAweEQzLCAweDk0LAorCTB4MDAsIDB4NDAsIDB4MjYsIDB4RTUsIDB4MTAsIDB4NTQsIDB4RkUsIDB4MTIsCisvKjEwRDAqLzB4MEUsIDB4OTgsIDB4NzUsIDB4ODMsIDB4OEUsIDB4RUQsIDB4RjAsIDB4RTUsCisJMHgxMCwgMHg0NCwgMHgwMSwgMHhGRCwgMHhFQiwgMHg0NCwgMHgwNywgMHhGNSwKKy8qMTBFMCovMHg4MiwgMHhFRCwgMHhGMCwgMHg4NSwgMHg1NywgMHg4MiwgMHg4NSwgMHg1NiwKKwkweDgzLCAweEUwLCAweDMwLCAweEUzLCAweDAxLCAweDA5LCAweDFFLCAweDgwLAorLyoxMEYwKi8weEQ0LCAweEMyLCAweDM0LCAweEU5LCAweEMzLCAweDk1LCAweDU0LCAweDQwLAorCTB4MDIsIDB4RDIsIDB4MzQsIDB4MjIsIDB4MDIsIDB4MDAsIDB4MDYsIDB4MjIsCisvKjExMDAqLzB4MzAsIDB4MzAsIDB4MTEsIDB4OTAsIDB4MTAsIDB4MDAsIDB4RTQsIDB4OTMsCisJMHhGNSwgMHgxMCwgMHg5MCwgMHgxMCwgMHgxMCwgMHhFNCwgMHg5MywgMHhGNSwKKy8qMTExMCovMHgxMCwgMHgxMiwgMHgxMCwgMHg5MCwgMHgxMiwgMHgxMSwgMHg1MCwgMHgyMiwKKwkweEU0LCAweEZDLCAweEMzLCAweEVELCAweDlGLCAweEZBLCAweEVGLCAweEY1LAorLyoxMTIwKi8weDgzLCAweDc1LCAweDgyLCAweDAwLCAweDc5LCAweEZGLCAweEU0LCAweDkzLAorCTB4Q0MsIDB4NkMsIDB4Q0MsIDB4QTMsIDB4RDksIDB4RjgsIDB4REEsIDB4RjYsCisvKjExMzAqLzB4RTUsIDB4RTIsIDB4MzAsIDB4RTQsIDB4MDIsIDB4OEMsIDB4RTUsIDB4RUQsCisJMHgyNCwgMHhGRiwgMHhGRiwgMHhFRiwgMHg3NSwgMHg4MiwgMHhGRiwgMHhGNSwKKy8qMTE0MCovMHg4MywgMHhFNCwgMHg5MywgMHg2QywgMHg3MCwgMHgwMywgMHg3RiwgMHgwMSwKKwkweDIyLCAweDdGLCAweDAwLCAweDIyLCAweDIyLCAweDExLCAweDAwLCAweDAwLAorLyoxMTUwKi8weDIyLCAweDhFLCAweDU4LCAweDhGLCAweDU5LCAweDhDLCAweDVBLCAweDhELAorCTB4NUIsIDB4OEEsIDB4NUMsIDB4OEIsIDB4NUQsIDB4NzUsIDB4NUUsIDB4MDEsCisvKjExNjAqLzB4RTQsIDB4RjUsIDB4NUYsIDB4RjUsIDB4NjAsIDB4RjUsIDB4NjIsIDB4MTIsCisJMHgwNywgMHgyQSwgMHg3NSwgMHg4MywgMHhEMCwgMHhFMCwgMHhGRiwgMHhDNCwKKy8qMTE3MCovMHg1NCwgMHgwRiwgMHhGNSwgMHg2MSwgMHgxMiwgMHgxRSwgMHhBNSwgMHg4NSwKKwkweDU5LCAweDVFLCAweEQzLCAweEU1LCAweDVFLCAweDk1LCAweDVCLCAweEU1LAorLyoxMTgwKi8weDVBLCAweDEyLCAweDA3LCAweDZCLCAweDUwLCAweDRCLCAweDEyLCAweDA3LAorCTB4MDMsIDB4NzUsIDB4ODMsIDB4QkMsIDB4RTAsIDB4NDUsIDB4NUUsIDB4MTIsCisvKjExOTAqLzB4MDcsIDB4MjksIDB4NzUsIDB4ODMsIDB4QkUsIDB4RTAsIDB4NDUsIDB4NUUsCisJMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywgMHhDMCwgMHhFMCwgMHg0NSwKKy8qMTFBMCovMHg1RSwgMHhGMCwgMHhBRiwgMHg1RiwgMHhFNSwgMHg2MCwgMHgxMiwgMHgwOCwKKwkweDc4LCAweDEyLCAweDBBLCAweEZGLCAweEFGLCAweDYyLCAweDdFLCAweDAwLAorLyoxMUIwKi8weEFELCAweDVELCAweEFDLCAweDVDLCAweDEyLCAweDA0LCAweDQ0LCAweEU1LAorCTB4NjEsIDB4QUYsIDB4NUUsIDB4N0UsIDB4MDAsIDB4QjQsIDB4MDMsIDB4MDUsCisvKjExQzAqLzB4MTIsIDB4MUUsIDB4MjEsIDB4ODAsIDB4MDcsIDB4QUQsIDB4NUQsIDB4QUMsCisJMHg1QywgMHgxMiwgMHgxMywgMHgxNywgMHgwNSwgMHg1RSwgMHgwMiwgMHgxMSwKKy8qMTFEMCovMHg3QSwgMHgxMiwgMHgwNywgMHgwMywgMHg3NSwgMHg4MywgMHhCQywgMHhFMCwKKwkweDQ1LCAweDQwLCAweDEyLCAweDA3LCAweDI5LCAweDc1LCAweDgzLCAweEJFLAorLyoxMUUwKi8weEUwLCAweDQ1LCAweDQwLCAweDEyLCAweDA3LCAweDI5LCAweDc1LCAweDgzLAorCTB4QzAsIDB4RTAsIDB4NDUsIDB4NDAsIDB4RjAsIDB4MjIsIDB4OEUsIDB4NTgsCisvKjExRjAqLzB4OEYsIDB4NTksIDB4NzUsIDB4NUEsIDB4MDEsIDB4NzksIDB4MDEsIDB4NzUsCisJMHg1QiwgMHgwMSwgMHhFNCwgMHhGQiwgMHgxMiwgMHgwNywgMHgyQSwgMHg3NSwKKy8qMTIwMCovMHg4MywgMHhBRSwgMHhFMCwgMHg1NCwgMHgxQSwgMHhGRiwgMHgxMiwgMHgwOCwKKwkweDY1LCAweEUwLCAweEM0LCAweDEzLCAweDU0LCAweDA3LCAweEZFLCAweEVGLAorLyoxMjEwKi8weDcwLCAweDBDLCAweEVFLCAweDY1LCAweDM1LCAweDcwLCAweDA3LCAweDkwLAorCTB4MDcsIDB4MkYsIDB4RTAsIDB4QjQsIDB4MDEsIDB4MEQsIDB4QUYsIDB4MzUsCisvKjEyMjAqLzB4N0UsIDB4MDAsIDB4MTIsIDB4MEUsIDB4QTksIDB4Q0YsIDB4RUIsIDB4Q0YsCisJMHgwMiwgMHgxRSwgMHg2MCwgMHhFNSwgMHg1OSwgMHg2NCwgMHgwMiwgMHg0NSwKKy8qMTIzMCovMHg1OCwgMHg3MCwgMHgwNCwgMHg3RiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3RiwKKwkweDAwLCAweEU1LCAweDU5LCAweDQ1LCAweDU4LCAweDcwLCAweDA0LCAweDdFLAorLyoxMjQwKi8weDAxLCAweDgwLCAweDAyLCAweDdFLCAweDAwLCAweEVFLCAweDRGLCAweDYwLAorCTB4MjMsIDB4ODUsIDB4NDEsIDB4NDksIDB4ODUsIDB4NDAsIDB4NEIsIDB4RTUsCisvKjEyNTAqLzB4NTksIDB4NDUsIDB4NTgsIDB4NzAsIDB4MkMsIDB4QUYsIDB4NUEsIDB4RkUsCisJMHhDRCwgMHhFOSwgMHhDRCwgMHhGQywgMHhBQiwgMHg1OSwgMHhBQSwgMHg1OCwKKy8qMTI2MCovMHgxMiwgMHgwQSwgMHhGRiwgMHhBRiwgMHg1QiwgMHg3RSwgMHgwMCwgMHgxMiwKKwkweDFFLCAweDYwLCAweDgwLCAweDE1LCAweEFGLCAweDVCLCAweDdFLCAweDAwLAorLyoxMjcwKi8weDEyLCAweDFFLCAweDYwLCAweDkwLCAweDA3LCAweDI2LCAweDEyLCAweDA3LAorCTB4MzUsIDB4RTUsIDB4NDksIDB4MTIsIDB4MDcsIDB4MzEsIDB4RTUsIDB4NEIsCisvKjEyODAqLzB4RjAsIDB4RTQsIDB4RkQsIDB4QUYsIDB4MzUsIDB4RkUsIDB4RkMsIDB4MTIsCisJMHgwOSwgMHgxNSwgMHgyMiwgMHg4QywgMHg2NCwgMHg4RCwgMHg2NSwgMHgxMiwKKy8qMTI5MCovMHgwOCwgMHhEQSwgMHg0MCwgMHgzQywgMHhFNSwgMHg2NSwgMHg0NSwgMHg2NCwKKwkweDcwLCAweDEwLCAweDEyLCAweDA5LCAweDA0LCAweEMzLCAweEU1LCAweDNFLAorLyoxMkEwKi8weDEyLCAweDA3LCAweDY5LCAweDQwLCAweDNCLCAweDEyLCAweDA4LCAweDk1LAorCTB4ODAsIDB4MTgsIDB4RTUsIDB4M0UsIDB4QzMsIDB4OTUsIDB4MzgsIDB4NDAsCisvKjEyQjAqLzB4MUQsIDB4ODUsIDB4M0UsIDB4MzgsIDB4RTUsIDB4M0UsIDB4NjAsIDB4MDUsCisJMHg4NSwgMHgzRiwgMHgzOSwgMHg4MCwgMHgwMywgMHg4NSwgMHgzOSwgMHgzOSwKKy8qMTJDMCovMHg4RiwgMHgzQSwgMHgxMiwgMHgwNywgMHhBOCwgMHhFNSwgMHgzRSwgMHgxMiwKKwkweDA3LCAweDUzLCAweEU1LCAweDNGLCAweEYwLCAweDIyLCAweDgwLCAweDNCLAorLyoxMkQwKi8weEU1LCAweDY1LCAweDQ1LCAweDY0LCAweDcwLCAweDExLCAweDEyLCAweDA3LAorCTB4NUYsIDB4NDAsIDB4MDUsIDB4MTIsIDB4MDgsIDB4OUUsIDB4ODAsIDB4MUYsCisvKjEyRTAqLzB4MTIsIDB4MDcsIDB4M0UsIDB4RTUsIDB4NDEsIDB4RjAsIDB4MjIsIDB4RTUsCisJMHgzQywgMHhDMywgMHg5NSwgMHgzOCwgMHg0MCwgMHgxRCwgMHg4NSwgMHgzQywKKy8qMTJGMCovMHgzOCwgMHhFNSwgMHgzQywgMHg2MCwgMHgwNSwgMHg4NSwgMHgzRCwgMHgzOSwKKwkweDgwLCAweDAzLCAweDg1LCAweDM5LCAweDM5LCAweDhGLCAweDNBLCAweDEyLAorLyoxMzAwKi8weDA3LCAweEE4LCAweEU1LCAweDNDLCAweDEyLCAweDA3LCAweDUzLCAweEU1LAorCTB4M0QsIDB4RjAsIDB4MjIsIDB4MTIsIDB4MDcsIDB4OUYsIDB4RTUsIDB4MzgsCisvKjEzMTAqLzB4MTIsIDB4MDcsIDB4NTMsIDB4RTUsIDB4MzksIDB4RjAsIDB4MjIsIDB4OEMsCisJMHg2MywgMHg4RCwgMHg2NCwgMHgxMiwgMHgwOCwgMHhEQSwgMHg0MCwgMHgzQywKKy8qMTMyMCovMHhFNSwgMHg2NCwgMHg0NSwgMHg2MywgMHg3MCwgMHgxMCwgMHgxMiwgMHgwOSwKKwkweDA0LCAweEMzLCAweEU1LCAweDNFLCAweDEyLCAweDA3LCAweDY5LCAweDQwLAorLyoxMzMwKi8weDNCLCAweDEyLCAweDA4LCAweDk1LCAweDgwLCAweDE4LCAweEU1LCAweDNFLAorCTB4QzMsIDB4OTUsIDB4MzgsIDB4NDAsIDB4MUQsIDB4ODUsIDB4M0UsIDB4MzgsCisvKjEzNDAqLzB4RTUsIDB4M0UsIDB4NjAsIDB4MDUsIDB4ODUsIDB4M0YsIDB4MzksIDB4ODAsCisJMHgwMywgMHg4NSwgMHgzOSwgMHgzOSwgMHg4RiwgMHgzQSwgMHgxMiwgMHgwNywKKy8qMTM1MCovMHhBOCwgMHhFNSwgMHgzRSwgMHgxMiwgMHgwNywgMHg1MywgMHhFNSwgMHgzRiwKKwkweEYwLCAweDIyLCAweDgwLCAweDNCLCAweEU1LCAweDY0LCAweDQ1LCAweDYzLAorLyoxMzYwKi8weDcwLCAweDExLCAweDEyLCAweDA3LCAweDVGLCAweDQwLCAweDA1LCAweDEyLAorCTB4MDgsIDB4OUUsIDB4ODAsIDB4MUYsIDB4MTIsIDB4MDcsIDB4M0UsIDB4RTUsCisvKjEzNzAqLzB4NDEsIDB4RjAsIDB4MjIsIDB4RTUsIDB4M0MsIDB4QzMsIDB4OTUsIDB4MzgsCisJMHg0MCwgMHgxRCwgMHg4NSwgMHgzQywgMHgzOCwgMHhFNSwgMHgzQywgMHg2MCwKKy8qMTM4MCovMHgwNSwgMHg4NSwgMHgzRCwgMHgzOSwgMHg4MCwgMHgwMywgMHg4NSwgMHgzOSwKKwkweDM5LCAweDhGLCAweDNBLCAweDEyLCAweDA3LCAweEE4LCAweEU1LCAweDNDLAorLyoxMzkwKi8weDEyLCAweDA3LCAweDUzLCAweEU1LCAweDNELCAweEYwLCAweDIyLCAweDEyLAorCTB4MDcsIDB4OUYsIDB4RTUsIDB4MzgsIDB4MTIsIDB4MDcsIDB4NTMsIDB4RTUsCisvKjEzQTAqLzB4MzksIDB4RjAsIDB4MjIsIDB4RTUsIDB4MEQsIDB4RkUsIDB4RTUsIDB4MDgsCisJMHg4RSwgMHg1NCwgMHg0NCwgMHgwNSwgMHhGNSwgMHg1NSwgMHg3NSwgMHgxNSwKKy8qMTNCMCovMHgwRiwgMHhGNSwgMHg4MiwgMHgxMiwgMHgwRSwgMHg3QSwgMHgxMiwgMHgxNywKKwkweEEzLCAweDIwLCAweDMxLCAweDA1LCAweDc1LCAweDE1LCAweDAzLCAweDgwLAorLyoxM0MwKi8weDAzLCAweDc1LCAweDE1LCAweDBCLCAweEU1LCAweDBBLCAweEMzLCAweDk0LAorCTB4MDEsIDB4NTAsIDB4MzgsIDB4MTIsIDB4MTQsIDB4MjAsIDB4MjAsIDB4MzEsCisvKjEzRDAqLzB4MDYsIDB4MDUsIDB4MTUsIDB4MDUsIDB4MTUsIDB4ODAsIDB4MDQsIDB4MTUsCisJMHgxNSwgMHgxNSwgMHgxNSwgMHhFNSwgMHgwQSwgMHhDMywgMHg5NCwgMHgwMSwKKy8qMTNFMCovMHg1MCwgMHgyMSwgMHgxMiwgMHgxNCwgMHgyMCwgMHgyMCwgMHgzMSwgMHgwNCwKKwkweDA1LCAweDE1LCAweDgwLCAweDAyLCAweDE1LCAweDE1LCAweEU1LCAweDBBLAorLyoxM0YwKi8weEMzLCAweDk0LCAweDAxLCAweDUwLCAweDBFLCAweDEyLCAweDBFLCAweDc3LAorCTB4MTIsIDB4MTcsIDB4QTMsIDB4MjAsIDB4MzEsIDB4MDUsIDB4MDUsIDB4MTUsCisvKjE0MDAqLzB4MTIsIDB4MEUsIDB4NzcsIDB4RTUsIDB4MTUsIDB4QjQsIDB4MDgsIDB4MDQsCisJMHg3RiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3RiwgMHgwMCwgMHhFNSwgMHgxNSwKKy8qMTQxMCovMHhCNCwgMHgwNywgMHgwNCwgMHg3RSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3RSwKKwkweDAwLCAweEVFLCAweDRGLCAweDYwLCAweDAyLCAweDA1LCAweDdGLCAweDIyLAorLyoxNDIwKi8weDg1LCAweDU1LCAweDgyLCAweDg1LCAweDU0LCAweDgzLCAweEU1LCAweDE1LAorCTB4RjAsIDB4MTIsIDB4MTcsIDB4QTMsIDB4MjIsIDB4MTIsIDB4MDcsIDB4MkEsCisvKjE0MzAqLzB4NzUsIDB4ODMsIDB4QUUsIDB4NzQsIDB4RkYsIDB4MTIsIDB4MDcsIDB4MjksCisJMHhFMCwgMHg1NCwgMHgxQSwgMHhGNSwgMHgzNCwgMHhFMCwgMHhDNCwgMHgxMywKKy8qMTQ0MCovMHg1NCwgMHgwNywgMHhGNSwgMHgzNSwgMHgyNCwgMHhGRSwgMHg2MCwgMHgyNCwKKwkweDI0LCAweEZFLCAweDYwLCAweDNDLCAweDI0LCAweDA0LCAweDcwLCAweDYzLAorLyoxNDUwKi8weDc1LCAweDMxLCAweDJELCAweEU1LCAweDA4LCAweEZELCAweDc0LCAweEI2LAorCTB4MTIsIDB4MDcsIDB4OTIsIDB4NzQsIDB4QkMsIDB4OTAsIDB4MDcsIDB4MjIsCisvKjE0NjAqLzB4MTIsIDB4MDcsIDB4OTUsIDB4NzQsIDB4OTAsIDB4MTIsIDB4MDcsIDB4QjMsCisJMHg3NCwgMHg5MiwgMHg4MCwgMHgzQywgMHg3NSwgMHgzMSwgMHgzQSwgMHhFNSwKKy8qMTQ3MCovMHgwOCwgMHhGRCwgMHg3NCwgMHhCQSwgMHgxMiwgMHgwNywgMHg5MiwgMHg3NCwKKwkweEMwLCAweDkwLCAweDA3LCAweDIyLCAweDEyLCAweDA3LCAweEI2LCAweDc0LAorLyoxNDgwKi8weEM0LCAweDEyLCAweDA3LCAweEIzLCAweDc0LCAweEM4LCAweDgwLCAweDIwLAorCTB4NzUsIDB4MzEsIDB4MzUsIDB4RTUsIDB4MDgsIDB4RkQsIDB4NzQsIDB4QjgsCisvKjE0OTAqLzB4MTIsIDB4MDcsIDB4OTIsIDB4NzQsIDB4QkUsIDB4RkYsIDB4RUQsIDB4NDQsCisJMHgwNywgMHg5MCwgMHgwNywgMHgyMiwgMHhDRiwgMHhGMCwgMHhBMywgMHhFRiwKKy8qMTRBMCovMHhGMCwgMHg3NCwgMHhDMiwgMHgxMiwgMHgwNywgMHhCMywgMHg3NCwgMHhDNiwKKwkweEZGLCAweEVELCAweDQ0LCAweDA3LCAweEEzLCAweENGLCAweEYwLCAweEEzLAorLyoxNEIwKi8weEVGLCAweEYwLCAweDIyLCAweDc1LCAweDM0LCAweDAxLCAweDIyLCAweDhFLAorCTB4NTgsIDB4OEYsIDB4NTksIDB4OEMsIDB4NUEsIDB4OEQsIDB4NUIsIDB4OEEsCisvKjE0QzAqLzB4NUMsIDB4OEIsIDB4NUQsIDB4NzUsIDB4NUUsIDB4MDEsIDB4RTQsIDB4RjUsCisJMHg1RiwgMHgxMiwgMHgxRSwgMHhBNSwgMHg4NSwgMHg1OSwgMHg1RSwgMHhEMywKKy8qMTREMCovMHhFNSwgMHg1RSwgMHg5NSwgMHg1QiwgMHhFNSwgMHg1QSwgMHgxMiwgMHgwNywKKwkweDZCLCAweDUwLCAweDU3LCAweEU1LCAweDVELCAweDQ1LCAweDVDLCAweDcwLAorLyoxNEUwKi8weDMwLCAweDEyLCAweDA3LCAweDJBLCAweDc1LCAweDgzLCAweDkyLCAweEU1LAorCTB4NUUsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzUsIDB4ODMsIDB4QzYsIDB4RTUsCisvKjE0RjAqLzB4NUUsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzUsIDB4ODMsIDB4QzgsIDB4RTUsCisJMHg1RSwgMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywgMHg5MCwgMHhFNSwKKy8qMTUwMCovMHg1RSwgMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywgMHhDMiwgMHhFNSwKKwkweDVFLCAweDEyLCAweDA3LCAweDI5LCAweDc1LCAweDgzLCAweEM0LCAweDgwLAorLyoxNTEwKi8weDAzLCAweDEyLCAweDA3LCAweDMyLCAweEU1LCAweDVFLCAweEYwLCAweEFGLAorCTB4NUYsIDB4N0UsIDB4MDAsIDB4QUQsIDB4NUQsIDB4QUMsIDB4NUMsIDB4MTIsCisvKjE1MjAqLzB4MDQsIDB4NDQsIDB4QUYsIDB4NUUsIDB4N0UsIDB4MDAsIDB4QUQsIDB4NUQsCisJMHhBQywgMHg1QywgMHgxMiwgMHgwQiwgMHhEMSwgMHgwNSwgMHg1RSwgMHgwMiwKKy8qMTUzMCovMHgxNCwgMHhDRiwgMHhBQiwgMHg1RCwgMHhBQSwgMHg1QywgMHhBRCwgMHg1QiwKKwkweEFDLCAweDVBLCAweEFGLCAweDU5LCAweEFFLCAweDU4LCAweDAyLCAweDFCLAorLyoxNTQwKi8weEZCLCAweDhDLCAweDVDLCAweDhELCAweDVELCAweDhBLCAweDVFLCAweDhCLAorCTB4NUYsIDB4NzUsIDB4NjAsIDB4MDEsIDB4RTQsIDB4RjUsIDB4NjEsIDB4RjUsCisvKjE1NTAqLzB4NjIsIDB4RjUsIDB4NjMsIDB4MTIsIDB4MUUsIDB4QTUsIDB4OEYsIDB4NjAsCisJMHhEMywgMHhFNSwgMHg2MCwgMHg5NSwgMHg1RCwgMHhFNSwgMHg1QywgMHgxMiwKKy8qMTU2MCovMHgwNywgMHg2QiwgMHg1MCwgMHg2MSwgMHhFNSwgMHg1RiwgMHg0NSwgMHg1RSwKKwkweDcwLCAweDI3LCAweDEyLCAweDA3LCAweDJBLCAweDc1LCAweDgzLCAweEI2LAorLyoxNTcwKi8weEU1LCAweDYwLCAweDEyLCAweDA3LCAweDI5LCAweDc1LCAweDgzLCAweEI4LAorCTB4RTUsIDB4NjAsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzUsIDB4ODMsIDB4QkEsCisvKjE1ODAqLzB4RTUsIDB4NjAsIDB4RjAsIDB4QUYsIDB4NjEsIDB4N0UsIDB4MDAsIDB4RTUsCisJMHg2MiwgMHgxMiwgMHgwOCwgMHg3QSwgMHgxMiwgMHgwQSwgMHhGRiwgMHg4MCwKKy8qMTU5MCovMHgxOSwgMHg5MCwgMHgwNywgMHgyNCwgMHgxMiwgMHgwNywgMHgzNSwgMHhFNSwKKwkweDYwLCAweDEyLCAweDA3LCAweDI5LCAweDc1LCAweDgzLCAweDhFLCAweEU0LAorLyoxNUEwKi8weDEyLCAweDA3LCAweDI5LCAweDc0LCAweDAxLCAweDEyLCAweDA3LCAweDI5LAorCTB4RTQsIDB4RjAsIDB4QUYsIDB4NjMsIDB4N0UsIDB4MDAsIDB4QUQsIDB4NUYsCisvKjE1QjAqLzB4QUMsIDB4NUUsIDB4MTIsIDB4MDQsIDB4NDQsIDB4QUYsIDB4NjAsIDB4N0UsCisJMHgwMCwgMHhBRCwgMHg1RiwgMHhBQywgMHg1RSwgMHgxMiwgMHgxMiwgMHg4QiwKKy8qMTVDMCovMHgwNSwgMHg2MCwgMHgwMiwgMHgxNSwgMHg1OCwgMHgyMiwgMHg5MCwgMHgxMSwKKwkweDRELCAweEU0LCAweDkzLCAweDkwLCAweDA3LCAweDJFLCAweEYwLCAweDEyLAorLyoxNUQwKi8weDA4LCAweDFGLCAweDc1LCAweDgzLCAweEFFLCAweEUwLCAweDU0LCAweDFBLAorCTB4RjUsIDB4MzQsIDB4NzAsIDB4NjcsIDB4RUYsIDB4NDQsIDB4MDcsIDB4RjUsCisvKjE1RTAqLzB4ODIsIDB4NzUsIDB4ODMsIDB4Q0UsIDB4RTAsIDB4RkYsIDB4MTMsIDB4MTMsCisJMHgxMywgMHg1NCwgMHgwNywgMHhGNSwgMHgzNiwgMHg1NCwgMHgwRiwgMHhEMywKKy8qMTVGMCovMHg5NCwgMHgwMCwgMHg0MCwgMHgwNiwgMHgxMiwgMHgxNCwgMHgyRCwgMHgxMiwKKwkweDFCLCAweEE5LCAweEU1LCAweDM2LCAweDU0LCAweDBGLCAweDI0LCAweEZFLAorLyoxNjAwKi8weDYwLCAweDBDLCAweDE0LCAweDYwLCAweDBDLCAweDE0LCAweDYwLCAweDE5LAorCTB4MjQsIDB4MDMsIDB4NzAsIDB4MzcsIDB4ODAsIDB4MTAsIDB4MDIsIDB4MUUsCisvKjE2MTAqLzB4OTEsIDB4MTIsIDB4MUUsIDB4OTEsIDB4MTIsIDB4MDcsIDB4MkEsIDB4NzUsCisJMHg4MywgMHhDRSwgMHhFMCwgMHg1NCwgMHhFRiwgMHhGMCwgMHgwMiwgMHgxRCwKKy8qMTYyMCovMHhBRSwgMHgxMiwgMHgxMCwgMHgxNCwgMHhFNCwgMHhGNSwgMHg1NSwgMHgxMiwKKwkweDFELCAweDg1LCAweDA1LCAweDU1LCAweEU1LCAweDU1LCAweEMzLCAweDk0LAorLyoxNjMwKi8weDA1LCAweDQwLCAweEY0LCAweDEyLCAweDA3LCAweDJBLCAweDc1LCAweDgzLAorCTB4Q0UsIDB4RTAsIDB4NTQsIDB4QzcsIDB4MTIsIDB4MDcsIDB4MjksIDB4RTAsCisvKjE2NDAqLzB4NDQsIDB4MDgsIDB4RjAsIDB4MjIsIDB4RTQsIDB4RjUsIDB4NTgsIDB4RjUsCisJMHg1OSwgMHhBRiwgMHgwOCwgMHhFRiwgMHg0NCwgMHgwNywgMHhGNSwgMHg4MiwKKy8qMTY1MCovMHg3NSwgMHg4MywgMHhEMCwgMHhFMCwgMHhGRCwgMHhDNCwgMHg1NCwgMHgwRiwKKwkweEY1LCAweDVBLCAweEVGLCAweDQ0LCAweDA3LCAweEY1LCAweDgyLCAweDc1LAorLyoxNjYwKi8weDgzLCAweDgwLCAweDc0LCAweDAxLCAweEYwLCAweDEyLCAweDA4LCAweDIxLAorCTB4NzUsIDB4ODMsIDB4ODIsIDB4RTUsIDB4NDUsIDB4RjAsIDB4RUYsIDB4NDQsCisvKjE2NzAqLzB4MDcsIDB4RjUsIDB4ODIsIDB4NzUsIDB4ODMsIDB4OEEsIDB4NzQsIDB4RkYsCisJMHhGMCwgMHgxMiwgMHgxQSwgMHg0RCwgMHgxMiwgMHgwNywgMHgyQSwgMHg3NSwKKy8qMTY4MCovMHg4MywgMHhCQywgMHhFMCwgMHg1NCwgMHhFRiwgMHgxMiwgMHgwNywgMHgyOSwKKwkweDc1LCAweDgzLCAweEJFLCAweEUwLCAweDU0LCAweEVGLCAweDEyLCAweDA3LAorLyoxNjkwKi8weDI5LCAweDc1LCAweDgzLCAweEMwLCAweEUwLCAweDU0LCAweEVGLCAweDEyLAorCTB4MDcsIDB4MjksIDB4NzUsIDB4ODMsIDB4QkMsIDB4RTAsIDB4NDQsIDB4MTAsCisvKjE2QTAqLzB4MTIsIDB4MDcsIDB4MjksIDB4NzUsIDB4ODMsIDB4QkUsIDB4RTAsIDB4NDQsCisJMHgxMCwgMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywgMHhDMCwgMHhFMCwKKy8qMTZCMCovMHg0NCwgMHgxMCwgMHhGMCwgMHhBRiwgMHg1OCwgMHhFNSwgMHg1OSwgMHgxMiwKKwkweDA4LCAweDc4LCAweDAyLCAweDBBLCAweEZGLCAweEU0LCAweEY1LCAweDU4LAorLyoxNkMwKi8weDdELCAweDAxLCAweEY1LCAweDU5LCAweEFGLCAweDM1LCAweEZFLCAweEZDLAorCTB4MTIsIDB4MDksIDB4MTUsIDB4MTIsIDB4MDcsIDB4MkEsIDB4NzUsIDB4ODMsCisvKjE2RDAqLzB4QjYsIDB4NzQsIDB4MTAsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzUsIDB4ODMsCisJMHhCOCwgMHg3NCwgMHgxMCwgMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywKKy8qMTZFMCovMHhCQSwgMHg3NCwgMHgxMCwgMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywKKwkweEJDLCAweDc0LCAweDEwLCAweDEyLCAweDA3LCAweDI5LCAweDc1LCAweDgzLAorLyoxNkYwKi8weEJFLCAweDc0LCAweDEwLCAweDEyLCAweDA3LCAweDI5LCAweDc1LCAweDgzLAorCTB4QzAsIDB4NzQsIDB4MTAsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzUsIDB4ODMsCisvKjE3MDAqLzB4OTAsIDB4RTQsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzUsIDB4ODMsIDB4QzIsCisJMHhFNCwgMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywgMHhDNCwgMHhFNCwKKy8qMTcxMCovMHgxMiwgMHgwNywgMHgyOSwgMHg3NSwgMHg4MywgMHg5MiwgMHhFNCwgMHgxMiwKKwkweDA3LCAweDI5LCAweDc1LCAweDgzLCAweEM2LCAweEU0LCAweDEyLCAweDA3LAorLyoxNzIwKi8weDI5LCAweDc1LCAweDgzLCAweEM4LCAweEU0LCAweEYwLCAweEFGLCAweDU4LAorCTB4RkUsIDB4RTUsIDB4NTksIDB4MTIsIDB4MDgsIDB4N0EsIDB4MDIsIDB4MEEsCisvKjE3MzAqLzB4RkYsIDB4RTUsIDB4RTIsIDB4MzAsIDB4RTQsIDB4NkMsIDB4RTUsIDB4RTcsCisJMHg1NCwgMHhDMCwgMHg2NCwgMHg0MCwgMHg3MCwgMHg2NCwgMHhFNSwgMHgwOSwKKy8qMTc0MCovMHhDNCwgMHg1NCwgMHgzMCwgMHhGRSwgMHhFNSwgMHgwOCwgMHgyNSwgMHhFMCwKKwkweDI1LCAweEUwLCAweDU0LCAweEMwLCAweDRFLCAweEZFLCAweEVGLCAweDU0LAorLyoxNzUwKi8weDNGLCAweDRFLCAweEZELCAweEU1LCAweDJCLCAweEFFLCAweDJBLCAweDc4LAorCTB4MDIsIDB4QzMsIDB4MzMsIDB4Q0UsIDB4MzMsIDB4Q0UsIDB4RDgsIDB4RjksCisvKjE3NjAqLzB4RjUsIDB4ODIsIDB4OEUsIDB4ODMsIDB4RUQsIDB4RjAsIDB4RTUsIDB4MkIsCisJMHhBRSwgMHgyQSwgMHg3OCwgMHgwMiwgMHhDMywgMHgzMywgMHhDRSwgMHgzMywKKy8qMTc3MCovMHhDRSwgMHhEOCwgMHhGOSwgMHhGRiwgMHhGNSwgMHg4MiwgMHg4RSwgMHg4MywKKwkweEEzLCAweEU1LCAweEZFLCAweEYwLCAweDhGLCAweDgyLCAweDhFLCAweDgzLAorLyoxNzgwKi8weEEzLCAweEEzLCAweEU1LCAweEZELCAweEYwLCAweDhGLCAweDgyLCAweDhFLAorCTB4ODMsIDB4QTMsIDB4QTMsIDB4QTMsIDB4RTUsIDB4RkMsIDB4RjAsIDB4QzMsCisvKjE3OTAqLzB4RTUsIDB4MkIsIDB4OTQsIDB4RkEsIDB4RTUsIDB4MkEsIDB4OTQsIDB4MDAsCisJMHg1MCwgMHgwOCwgMHgwNSwgMHgyQiwgMHhFNSwgMHgyQiwgMHg3MCwgMHgwMiwKKy8qMTdBMCovMHgwNSwgMHgyQSwgMHgyMiwgMHhFNCwgMHhGRiwgMHhFNCwgMHhGNSwgMHg1OCwKKwkweEY1LCAweDU2LCAweEY1LCAweDU3LCAweDc0LCAweDgyLCAweEZDLCAweDEyLAorLyoxN0IwKi8weDBFLCAweDA0LCAweDhDLCAweDgzLCAweEUwLCAweEY1LCAweDEwLCAweDU0LAorCTB4N0YsIDB4RjAsIDB4RTUsIDB4MTAsIDB4NDQsIDB4ODAsIDB4MTIsIDB4MEUsCisvKjE3QzAqLzB4OTgsIDB4RUQsIDB4RjAsIDB4N0UsIDB4MEEsIDB4MTIsIDB4MEUsIDB4MDQsCisJMHg3NSwgMHg4MywgMHhBMCwgMHhFMCwgMHgyMCwgMHhFMCwgMHgyNiwgMHhERSwKKy8qMTdEMCovMHhGNCwgMHgwNSwgMHg1NywgMHhFNSwgMHg1NywgMHg3MCwgMHgwMiwgMHgwNSwKKwkweDU2LCAweEU1LCAweDE0LCAweDI0LCAweDAxLCAweEZELCAweEU0LCAweDMzLAorLyoxN0UwKi8weEZDLCAweEQzLCAweEU1LCAweDU3LCAweDlELCAweEU1LCAweDU2LCAweDlDLAorCTB4NDAsIDB4RDksIDB4RTUsIDB4MEEsIDB4OTQsIDB4MjAsIDB4NTAsIDB4MDIsCisvKjE3RjAqLzB4MDUsIDB4MEEsIDB4NDMsIDB4RTEsIDB4MDgsIDB4QzIsIDB4MzEsIDB4MTIsCisJMHgwRSwgMHgwNCwgMHg3NSwgMHg4MywgMHhBNiwgMHhFMCwgMHg1NSwgMHgxMiwKKy8qMTgwMCovMHg2NSwgMHgxMiwgMHg3MCwgMHgwMywgMHhEMiwgMHgzMSwgMHgyMiwgMHhDMiwKKwkweDMxLCAweDIyLCAweDkwLCAweDA3LCAweDI2LCAweEUwLCAweEZBLCAweEEzLAorLyoxODEwKi8weEUwLCAweEY1LCAweDgyLCAweDhBLCAweDgzLCAweEUwLCAweEY1LCAweDQxLAorCTB4RTUsIDB4MzksIDB4QzMsIDB4OTUsIDB4NDEsIDB4NDAsIDB4MjYsIDB4RTUsCisvKjE4MjAqLzB4MzksIDB4OTUsIDB4NDEsIDB4QzMsIDB4OUYsIDB4RUUsIDB4MTIsIDB4MDcsCisJMHg2QiwgMHg0MCwgMHgwNCwgMHg3QywgMHgwMSwgMHg4MCwgMHgwMiwgMHg3QywKKy8qMTgzMCovMHgwMCwgMHhFNSwgMHg0MSwgMHg2NCwgMHgzRiwgMHg2MCwgMHgwNCwgMHg3QiwKKwkweDAxLCAweDgwLCAweDAyLCAweDdCLCAweDAwLCAweEVDLCAweDVCLCAweDYwLAorLyoxODQwKi8weDI5LCAweDA1LCAweDQxLCAweDgwLCAweDI4LCAweEMzLCAweEU1LCAweDQxLAorCTB4OTUsIDB4MzksIDB4QzMsIDB4OUYsIDB4RUUsIDB4MTIsIDB4MDcsIDB4NkIsCisvKjE4NTAqLzB4NDAsIDB4MDQsIDB4N0YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N0YsIDB4MDAsCisJMHhFNSwgMHg0MSwgMHg2MCwgMHgwNCwgMHg3RSwgMHgwMSwgMHg4MCwgMHgwMiwKKy8qMTg2MCovMHg3RSwgMHgwMCwgMHhFRiwgMHg1RSwgMHg2MCwgMHgwNCwgMHgxNSwgMHg0MSwKKwkweDgwLCAweDAzLCAweDg1LCAweDM5LCAweDQxLCAweDg1LCAweDNBLCAweDQwLAorLyoxODcwKi8weDIyLCAweEU1LCAweEUyLCAweDMwLCAweEU0LCAweDYwLCAweEU1LCAweEUxLAorCTB4MzAsIDB4RTIsIDB4NUIsIDB4RTUsIDB4MDksIDB4NzAsIDB4MDQsIDB4N0YsCisvKjE4ODAqLzB4MDEsIDB4ODAsIDB4MDIsIDB4N0YsIDB4MDAsIDB4RTUsIDB4MDgsIDB4NzAsCisJMHgwNCwgMHg3RSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3RSwgMHgwMCwgMHhFRSwKKy8qMTg5MCovMHg1RiwgMHg2MCwgMHg0MywgMHg1MywgMHhGOSwgMHhGOCwgMHhFNSwgMHhFMiwKKwkweDMwLCAweEU0LCAweDNCLCAweEU1LCAweEUxLCAweDMwLCAweEUyLCAweDJFLAorLyoxOEEwKi8weDQzLCAweEZBLCAweDAyLCAweDUzLCAweEZBLCAweEZCLCAweEU0LCAweEY1LAorCTB4MTAsIDB4OTAsIDB4OTQsIDB4NzAsIDB4RTUsIDB4MTAsIDB4RjAsIDB4RTUsCisvKjE4QjAqLzB4RTEsIDB4MzAsIDB4RTIsIDB4RTcsIDB4OTAsIDB4OTQsIDB4NzAsIDB4RTAsCisJMHg2NSwgMHgxMCwgMHg2MCwgMHgwMywgMHg0MywgMHhGQSwgMHgwNCwgMHgwNSwKKy8qMThDMCovMHgxMCwgMHg5MCwgMHg5NCwgMHg3MCwgMHhFNSwgMHgxMCwgMHhGMCwgMHg3MCwKKwkweEU2LCAweDEyLCAweDAwLCAweDA2LCAweDgwLCAweEUxLCAweDUzLCAweEZBLAorLyoxOEQwKi8weEZELCAweDUzLCAweEZBLCAweEZCLCAweDgwLCAweEMwLCAweDIyLCAweDhGLAorCTB4NTQsIDB4MTIsIDB4MDAsIDB4MDYsIDB4RTUsIDB4RTEsIDB4MzAsIDB4RTAsCisvKjE4RTAqLzB4MDQsIDB4N0YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N0YsIDB4MDAsIDB4RTUsCisJMHg3RSwgMHhEMywgMHg5NCwgMHgwNSwgMHg0MCwgMHgwNCwgMHg3RSwgMHgwMSwKKy8qMThGMCovMHg4MCwgMHgwMiwgMHg3RSwgMHgwMCwgMHhFRSwgMHg0RiwgMHg2MCwgMHgzRCwKKwkweDg1LCAweDU0LCAweDExLCAweEU1LCAweEUyLCAweDIwLCAweEUxLCAweDMyLAorLyoxOTAwKi8weDc0LCAweENFLCAweDEyLCAweDFBLCAweDA1LCAweDMwLCAweEU3LCAweDA0LAorCTB4N0QsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N0QsIDB4MDAsIDB4OEYsIDB4ODIsCisvKjE5MTAqLzB4OEUsIDB4ODMsIDB4RTAsIDB4MzAsIDB4RTYsIDB4MDQsIDB4N0YsIDB4MDEsCisJMHg4MCwgMHgwMiwgMHg3RiwgMHgwMCwgMHhFRiwgMHg1RCwgMHg3MCwgMHgxNSwKKy8qMTkyMCovMHgxMiwgMHgxNSwgMHhDNiwgMHg3NCwgMHhDRSwgMHgxMiwgMHgxQSwgMHgwNSwKKwkweDMwLCAweEU2LCAweDA3LCAweEUwLCAweDQ0LCAweDgwLCAweEYwLCAweDQzLAorLyoxOTMwKi8weEY5LCAweDgwLCAweDEyLCAweDE4LCAweDcxLCAweDIyLCAweDEyLCAweDBFLAorCTB4NDQsIDB4RTUsIDB4MTYsIDB4MjUsIDB4RTAsIDB4MjUsIDB4RTAsIDB4MjQsCisvKjE5NDAqLzB4QjAsIDB4RjUsIDB4ODIsIDB4RTQsIDB4MzQsIDB4MUEsIDB4RjUsIDB4ODMsCisJMHhFNCwgMHg5MywgMHhGNSwgMHgwRiwgMHhFNSwgMHgxNiwgMHgyNSwgMHhFMCwKKy8qMTk1MCovMHgyNSwgMHhFMCwgMHgyNCwgMHhCMSwgMHhGNSwgMHg4MiwgMHhFNCwgMHgzNCwKKwkweDFBLCAweEY1LCAweDgzLCAweEU0LCAweDkzLCAweEY1LCAweDBFLCAweDEyLAorLyoxOTYwKi8weDBFLCAweDY1LCAweEY1LCAweDEwLCAweEU1LCAweDBGLCAweDU0LCAweEYwLAorCTB4MTIsIDB4MEUsIDB4MTcsIDB4NzUsIDB4ODMsIDB4OEMsIDB4RUYsIDB4RjAsCisvKjE5NzAqLzB4RTUsIDB4MEYsIDB4MzAsIDB4RTAsIDB4MEMsIDB4MTIsIDB4MEUsIDB4MDQsCisJMHg3NSwgMHg4MywgMHg4NiwgMHhFMCwgMHg0NCwgMHg0MCwgMHhGMCwgMHg4MCwKKy8qMTk4MCovMHgwQSwgMHgxMiwgMHgwRSwgMHgwNCwgMHg3NSwgMHg4MywgMHg4NiwgMHhFMCwKKwkweDU0LCAweEJGLCAweEYwLCAweDEyLCAweDBFLCAweDkxLCAweDc1LCAweDgzLAorLyoxOTkwKi8weDgyLCAweEU1LCAweDBFLCAweEYwLCAweDIyLCAweDdGLCAweDA1LCAweDEyLAorCTB4MTcsIDB4MzEsIDB4MTIsIDB4MEUsIDB4MDQsIDB4MTIsIDB4MEUsIDB4MzMsCisvKjE5QTAqLzB4NzQsIDB4MDIsIDB4RjAsIDB4NzQsIDB4OEUsIDB4RkUsIDB4MTIsIDB4MEUsCisJMHgwNCwgMHgxMiwgMHgwRSwgMHgwQiwgMHhFRiwgMHhGMCwgMHg3NSwgMHgxNSwKKy8qMTlCMCovMHg3MCwgMHgxMiwgMHgwRiwgMHhGNywgMHgyMCwgMHgzNCwgMHgwNSwgMHg3NSwKKwkweDE1LCAweDEwLCAweDgwLCAweDAzLCAweDc1LCAweDE1LCAweDUwLCAweDEyLAorLyoxOUMwKi8weDBGLCAweEY3LCAweDIwLCAweDM0LCAweDA0LCAweDc0LCAweDEwLCAweDgwLAorCTB4MDIsIDB4NzQsIDB4RjAsIDB4MjUsIDB4MTUsIDB4RjUsIDB4MTUsIDB4MTIsCisvKjE5RDAqLzB4MEUsIDB4MjEsIDB4RUYsIDB4RjAsIDB4MTIsIDB4MTAsIDB4OTEsIDB4MjAsCisJMHgzNCwgMHgxNywgMHhFNSwgMHgxNSwgMHg2NCwgMHgzMCwgMHg2MCwgMHgwQywKKy8qMTlFMCovMHg3NCwgMHgxMCwgMHgyNSwgMHgxNSwgMHhGNSwgMHgxNSwgMHhCNCwgMHg4MCwKKwkweDAzLCAweEU0LCAweEY1LCAweDE1LCAweDEyLCAweDBFLCAweDIxLCAweEVGLAorLyoxOUYwKi8weEYwLCAweDIyLCAweEYwLCAweEU1LCAweDBCLCAweDI1LCAweEUwLCAweDI1LAorCTB4RTAsIDB4MjQsIDB4ODIsIDB4RjUsIDB4ODIsIDB4RTQsIDB4MzQsIDB4MDcsCisvKjFBMDAqLzB4RjUsIDB4ODMsIDB4MjIsIDB4NzQsIDB4ODgsIDB4RkUsIDB4RTUsIDB4MDgsCisJMHg0NCwgMHgwNywgMHhGRiwgMHhGNSwgMHg4MiwgMHg4RSwgMHg4MywgMHhFMCwKKy8qMUExMCovMHgyMiwgMHhGMCwgMHhFNSwgMHgwOCwgMHg0NCwgMHgwNywgMHhGNSwgMHg4MiwKKwkweDIyLCAweEYwLCAweEUwLCAweDU0LCAweEMwLCAweDhGLCAweDgyLCAweDhFLAorLyoxQTIwKi8weDgzLCAweEYwLCAweDIyLCAweEVGLCAweDQ0LCAweDA3LCAweEY1LCAweDgyLAorCTB4NzUsIDB4ODMsIDB4ODYsIDB4RTAsIDB4NTQsIDB4MTAsIDB4RDMsIDB4OTQsCisvKjFBMzAqLzB4MDAsIDB4MjIsIDB4RjAsIDB4OTAsIDB4MDcsIDB4MTUsIDB4RTAsIDB4MDQsCisJMHhGMCwgMHgyMiwgMHg0NCwgMHgwNiwgMHhGNSwgMHg4MiwgMHg3NSwgMHg4MywKKy8qMUE0MCovMHg5RSwgMHhFMCwgMHgyMiwgMHhGRSwgMHhFRiwgMHg0NCwgMHgwNywgMHhGNSwKKwkweDgyLCAweDhFLCAweDgzLCAweEUwLCAweDIyLCAweEU0LCAweDkwLCAweDA3LAorLyoxQTUwKi8weDJBLCAweEYwLCAweEEzLCAweEYwLCAweDEyLCAweDA3LCAweDJBLCAweDc1LAorCTB4ODMsIDB4ODIsIDB4RTAsIDB4NTQsIDB4N0YsIDB4MTIsIDB4MDcsIDB4MjksCisvKjFBNjAqLzB4RTAsIDB4NDQsIDB4ODAsIDB4RjAsIDB4MTIsIDB4MTAsIDB4RkMsIDB4MTIsCisJMHgwOCwgMHgxRiwgMHg3NSwgMHg4MywgMHhBMCwgMHhFMCwgMHgyMCwgMHhFMCwKKy8qMUE3MCovMHgxQSwgMHg5MCwgMHgwNywgMHgyQiwgMHhFMCwgMHgwNCwgMHhGMCwgMHg3MCwKKwkweDA2LCAweDkwLCAweDA3LCAweDJBLCAweEUwLCAweDA0LCAweEYwLCAweDkwLAorLyoxQTgwKi8weDA3LCAweDJBLCAweEUwLCAweEI0LCAweDEwLCAweEUxLCAweEEzLCAweEUwLAorCTB4QjQsIDB4MDAsIDB4REMsIDB4RUUsIDB4NDQsIDB4QTYsIDB4RkMsIDB4RUYsCisvKjFBOTAqLzB4NDQsIDB4MDcsIDB4RjUsIDB4ODIsIDB4OEMsIDB4ODMsIDB4RTAsIDB4RjUsCisJMHgzMiwgMHhFRSwgMHg0NCwgMHhBOCwgMHhGRSwgMHhFRiwgMHg0NCwgMHgwNywKKy8qMUFBMCovMHhGNSwgMHg4MiwgMHg4RSwgMHg4MywgMHhFMCwgMHhGNSwgMHgzMywgMHgyMiwKKwkweDAxLCAweDIwLCAweDExLCAweDAwLCAweDA0LCAweDIwLCAweDAwLCAweDkwLAorLyoxQUIwKi8weDAwLCAweDIwLCAweDBGLCAweDkyLCAweDAwLCAweDIxLCAweDBGLCAweDk0LAorCTB4MDAsIDB4MjIsIDB4MEYsIDB4OTYsIDB4MDAsIDB4MjMsIDB4MEYsIDB4OTgsCisvKjFBQzAqLzB4MDAsIDB4MjQsIDB4MEYsIDB4OUEsIDB4MDAsIDB4MjUsIDB4MEYsIDB4OUMsCisJMHgwMCwgMHgyNiwgMHgwRiwgMHg5RSwgMHgwMCwgMHgyNywgMHgwRiwgMHhBMCwKKy8qMUFEMCovMHgwMSwgMHgyMCwgMHgwMSwgMHhBMiwgMHgwMSwgMHgyMSwgMHgwMSwgMHhBNCwKKwkweDAxLCAweDIyLCAweDAxLCAweEE2LCAweDAxLCAweDIzLCAweDAxLCAweEE4LAorLyoxQUUwKi8weDAxLCAweDI0LCAweDAxLCAweEFBLCAweDAxLCAweDI1LCAweDAxLCAweEFDLAorCTB4MDEsIDB4MjYsIDB4MDEsIDB4QUUsIDB4MDEsIDB4MjcsIDB4MDEsIDB4QjAsCisvKjFBRjAqLzB4MDEsIDB4MjgsIDB4MDEsIDB4QjQsIDB4MDAsIDB4MjgsIDB4MEYsIDB4QjYsCisJMHg0MCwgMHgyOCwgMHgwRiwgMHhCOCwgMHg2MSwgMHgyOCwgMHgwMSwgMHhDQiwKKy8qMUIwMCovMHhFRiwgMHhDQiwgMHhDQSwgMHhFRSwgMHhDQSwgMHg3RiwgMHgwMSwgMHhFNCwKKwkweEZELCAweEVCLCAweDRBLCAweDcwLCAweDI0LCAweEU1LCAweDA4LCAweEY1LAorLyoxQjEwKi8weDgyLCAweDc0LCAweEI2LCAweDEyLCAweDA4LCAweDI5LCAweEU1LCAweDA4LAorCTB4RjUsIDB4ODIsIDB4NzQsIDB4QjgsIDB4MTIsIDB4MDgsIDB4MjksIDB4RTUsCisvKjFCMjAqLzB4MDgsIDB4RjUsIDB4ODIsIDB4NzQsIDB4QkEsIDB4MTIsIDB4MDgsIDB4MjksCisJMHg3RSwgMHgwMCwgMHg3QywgMHgwMCwgMHgxMiwgMHgwQSwgMHhGRiwgMHg4MCwKKy8qMUIzMCovMHgxMiwgMHg5MCwgMHgwNywgMHgyNiwgMHgxMiwgMHgwNywgMHgzNSwgMHhFNSwKKwkweDQxLCAweEYwLCAweDkwLCAweDA3LCAweDI0LCAweDEyLCAweDA3LCAweDM1LAorLyoxQjQwKi8weEU1LCAweDQwLCAweEYwLCAweDEyLCAweDA3LCAweDJBLCAweDc1LCAweDgzLAorCTB4OEUsIDB4RTQsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzQsIDB4MDEsIDB4MTIsCisvKjFCNTAqLzB4MDcsIDB4MjksIDB4RTQsIDB4RjAsIDB4MjIsIDB4RTQsIDB4RjUsIDB4MjYsCisJMHhGNSwgMHgyNywgMHg1MywgMHhFMSwgMHhGRSwgMHhGNSwgMHgyQSwgMHg3NSwKKy8qMUI2MCovMHgyQiwgMHgwMSwgMHhGNSwgMHgwOCwgMHg3RiwgMHgwMSwgMHgxMiwgMHgxNywKKwkweDMxLCAweDMwLCAweDMwLCAweDFDLCAweDkwLCAweDFBLCAweEE5LCAweEU0LAorLyoxQjcwKi8weDkzLCAweEY1LCAweDEwLCAweDkwLCAweDFGLCAweEY5LCAweEU0LCAweDkzLAorCTB4RjUsIDB4MTAsIDB4OTAsIDB4MDAsIDB4NDEsIDB4RTQsIDB4OTMsIDB4RjUsCisvKjFCODAqLzB4MTAsIDB4OTAsIDB4MUUsIDB4Q0EsIDB4RTQsIDB4OTMsIDB4RjUsIDB4MTAsCisJMHg3RiwgMHgwMiwgMHgxMiwgMHgxNywgMHgzMSwgMHgxMiwgMHgwRiwgMHg1NCwKKy8qMUI5MCovMHg3RiwgMHgwMywgMHgxMiwgMHgxNywgMHgzMSwgMHgxMiwgMHgwMCwgMHgwNiwKKwkweEU1LCAweEUyLCAweDMwLCAweEU3LCAweDA5LCAweDEyLCAweDEwLCAweDAwLAorLyoxQkEwKi8weDMwLCAweDMwLCAweDAzLCAweDEyLCAweDExLCAweDAwLCAweDAyLCAweDAwLAorCTB4NDcsIDB4MTIsIDB4MDgsIDB4MUYsIDB4NzUsIDB4ODMsIDB4RDAsIDB4RTAsCisvKjFCQjAqLzB4QzQsIDB4NTQsIDB4MEYsIDB4RkQsIDB4NzUsIDB4NDMsIDB4MDEsIDB4NzUsCisJMHg0NCwgMHhGRiwgMHgxMiwgMHgwOCwgMHhBQSwgMHg3NCwgMHgwNCwgMHhGMCwKKy8qMUJDMCovMHg3NSwgMHgzQiwgMHgwMSwgMHhFRCwgMHgxNCwgMHg2MCwgMHgwQywgMHgxNCwKKwkweDYwLCAweDBCLCAweDE0LCAweDYwLCAweDBGLCAweDI0LCAweDAzLCAweDcwLAorLyoxQkQwKi8weDBCLCAweDgwLCAweDA5LCAweDgwLCAweDAwLCAweDEyLCAweDA4LCAweEE3LAorCTB4MDQsIDB4RjAsIDB4ODAsIDB4MDYsIDB4MTIsIDB4MDgsIDB4QTcsIDB4NzQsCisvKjFCRTAqLzB4MDQsIDB4RjAsIDB4RUUsIDB4NDQsIDB4ODIsIDB4RkUsIDB4RUYsIDB4NDQsCisJMHgwNywgMHhGNSwgMHg4MiwgMHg4RSwgMHg4MywgMHhFNSwgMHg0NSwgMHgxMiwKKy8qMUJGMCovMHgwOCwgMHhCRSwgMHg3NSwgMHg4MywgMHg4MiwgMHhFNSwgMHgzMSwgMHhGMCwKKwkweDAyLCAweDExLCAweDRDLCAweDhFLCAweDYwLCAweDhGLCAweDYxLCAweDEyLAorLyoxQzAwKi8weDFFLCAweEE1LCAweEU0LCAweEZGLCAweENFLCAweEVELCAweENFLCAweEVFLAorCTB4RDMsIDB4OTUsIDB4NjEsIDB4RTUsIDB4NjAsIDB4MTIsIDB4MDcsIDB4NkIsCisvKjFDMTAqLzB4NDAsIDB4MzksIDB4NzQsIDB4MjAsIDB4MkUsIDB4RjUsIDB4ODIsIDB4RTQsCisJMHgzNCwgMHgwMywgMHhGNSwgMHg4MywgMHhFMCwgMHg3MCwgMHgwMywgMHhGRiwKKy8qMUMyMCovMHg4MCwgMHgyNiwgMHgxMiwgMHgwOCwgMHhFMiwgMHhGRCwgMHhDMywgMHg5RiwKKwkweDQwLCAweDFFLCAweENGLCAweEVELCAweENGLCAweEVCLCAweDRBLCAweDcwLAorLyoxQzMwKi8weDBCLCAweDhELCAweDQyLCAweDEyLCAweDA4LCAweEVFLCAweEY1LCAweDQxLAorCTB4OEUsIDB4NDAsIDB4ODAsIDB4MEMsIDB4MTIsIDB4MDgsIDB4RTIsIDB4RjUsCisvKjFDNDAqLzB4MzgsIDB4MTIsIDB4MDgsIDB4RUUsIDB4RjUsIDB4MzksIDB4OEUsIDB4M0EsCisJMHgxRSwgMHg4MCwgMHhCQywgMHgyMiwgMHg3NSwgMHg1OCwgMHgwMSwgMHhFNSwKKy8qMUM1MCovMHgzNSwgMHg3MCwgMHgwQywgMHgxMiwgMHgwNywgMHhDQywgMHhFMCwgMHhGNSwKKwkweDRBLCAweDEyLCAweDA3LCAweEQ4LCAweEUwLCAweEY1LCAweDRDLCAweEU1LAorLyoxQzYwKi8weDM1LCAweEI0LCAweDA0LCAweDBDLCAweDEyLCAweDA3LCAweEU0LCAweEUwLAorCTB4RjUsIDB4NEEsIDB4MTIsIDB4MDcsIDB4RjAsIDB4RTAsIDB4RjUsIDB4NEMsCisvKjFDNzAqLzB4RTUsIDB4MzUsIDB4QjQsIDB4MDEsIDB4MDQsIDB4N0YsIDB4MDEsIDB4ODAsCisJMHgwMiwgMHg3RiwgMHgwMCwgMHhFNSwgMHgzNSwgMHhCNCwgMHgwMiwgMHgwNCwKKy8qMUM4MCovMHg3RSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3RSwgMHgwMCwgMHhFRSwgMHg0RiwKKwkweDYwLCAweDBDLCAweDEyLCAweDA3LCAweEZDLCAweEUwLCAweEY1LCAweDRBLAorLyoxQzkwKi8weDEyLCAweDA4LCAweDA4LCAweEUwLCAweEY1LCAweDRDLCAweDg1LCAweDQxLAorCTB4NDksIDB4ODUsIDB4NDAsIDB4NEIsIDB4MjIsIDB4NzUsIDB4NUIsIDB4MDEsCisvKjFDQTAqLzB4OTAsIDB4MDcsIDB4MjQsIDB4MTIsIDB4MDcsIDB4MzUsIDB4RTAsIDB4NTQsCisJMHgxRiwgMHhGRiwgMHhEMywgMHg5NCwgMHgwMiwgMHg1MCwgMHgwNCwgMHg4RiwKKy8qMUNCMCovMHg1OCwgMHg4MCwgMHgwNSwgMHhFRiwgMHgyNCwgMHhGRSwgMHhGNSwgMHg1OCwKKwkweEVGLCAweEMzLCAweDk0LCAweDE4LCAweDQwLCAweDA1LCAweDc1LCAweDU5LAorLyoxQ0MwKi8weDE4LCAweDgwLCAweDA0LCAweEVGLCAweDA0LCAweEY1LCAweDU5LCAweDg1LAorCTB4NDMsIDB4NUEsIDB4QUYsIDB4NTgsIDB4N0UsIDB4MDAsIDB4QUQsIDB4NTksCisvKjFDRDAqLzB4N0MsIDB4MDAsIDB4QUIsIDB4NUIsIDB4N0EsIDB4MDAsIDB4MTIsIDB4MTUsCisJMHg0MSwgMHhBRiwgMHg1QSwgMHg3RSwgMHgwMCwgMHgxMiwgMHgxOCwgMHgwQSwKKy8qMUNFMCovMHhBRiwgMHg1QiwgMHg3RSwgMHgwMCwgMHgwMiwgMHgxQSwgMHhGRiwgMHhFNSwKKwkweEUyLCAweDMwLCAweEU3LCAweDBFLCAweDEyLCAweDEwLCAweDAzLCAweEMyLAorLyoxQ0YwKi8weDMwLCAweDMwLCAweDMwLCAweDAzLCAweDEyLCAweDEwLCAweEZGLCAweDIwLAorCTB4MzMsIDB4MjgsIDB4RTUsIDB4RTcsIDB4MzAsIDB4RTcsIDB4MDUsIDB4MTIsCisvKjFEMDAqLzB4MEUsIDB4QTIsIDB4ODAsIDB4MEQsIDB4RTUsIDB4RkUsIDB4QzMsIDB4OTQsCisJMHgyMCwgMHg1MCwgMHgwNiwgMHgxMiwgMHgwRSwgMHhBMiwgMHg0MywgMHhGOSwKKy8qMUQxMCovMHgwOCwgMHhFNSwgMHhGMiwgMHgzMCwgMHhFNywgMHgwMywgMHg1MywgMHhGOSwKKwkweDdGLCAweEU1LCAweEYxLCAweDU0LCAweDcwLCAweEQzLCAweDk0LCAweDAwLAorLyoxRDIwKi8weDUwLCAweEQ4LCAweDIyLCAweDEyLCAweDBFLCAweDA0LCAweDc1LCAweDgzLAorCTB4ODAsIDB4RTQsIDB4RjAsIDB4RTUsIDB4MDgsIDB4NDQsIDB4MDcsIDB4MTIsCisvKjFEMzAqLzB4MEQsIDB4RkQsIDB4NzUsIDB4ODMsIDB4ODQsIDB4MTIsIDB4MEUsIDB4MDIsCisJMHg3NSwgMHg4MywgMHg4NiwgMHgxMiwgMHgwRSwgMHgwMiwgMHg3NSwgMHg4MywKKy8qMUQ0MCovMHg4QywgMHhFMCwgMHg1NCwgMHhGMywgMHgxMiwgMHgwRSwgMHgwMywgMHg3NSwKKwkweDgzLCAweDhFLCAweDEyLCAweDBFLCAweDAyLCAweDc1LCAweDgzLCAweDk0LAorLyoxRDUwKi8weEUwLCAweDU0LCAweEZCLCAweEYwLCAweDIyLCAweDEyLCAweDA3LCAweDJBLAorCTB4NzUsIDB4ODMsIDB4OEUsIDB4RTQsIDB4MTIsIDB4MDcsIDB4MjksIDB4NzQsCisvKjFENjAqLzB4MDEsIDB4MTIsIDB4MDcsIDB4MjksIDB4RTQsIDB4MTIsIDB4MDgsIDB4QkUsCisJMHg3NSwgMHg4MywgMHg4QywgMHhFMCwgMHg0NCwgMHgyMCwgMHgxMiwgMHgwOCwKKy8qMUQ3MCovMHhCRSwgMHhFMCwgMHg1NCwgMHhERiwgMHhGMCwgMHg3NCwgMHg4NCwgMHg4NSwKKwkweDA4LCAweDgyLCAweEY1LCAweDgzLCAweEUwLCAweDU0LCAweDdGLCAweEYwLAorLyoxRDgwKi8weEUwLCAweDQ0LCAweDgwLCAweEYwLCAweDIyLCAweDc1LCAweDU2LCAweDAxLAorCTB4RTQsIDB4RkQsIDB4RjUsIDB4NTcsIDB4QUYsIDB4MzUsIDB4RkUsIDB4RkMsCisvKjFEOTAqLzB4MTIsIDB4MDksIDB4MTUsIDB4MTIsIDB4MUMsIDB4OUQsIDB4MTIsIDB4MUUsCisJMHg3QSwgMHgxMiwgMHgxQywgMHg0QywgMHhBRiwgMHg1NywgMHg3RSwgMHgwMCwKKy8qMURBMCovMHhBRCwgMHg1NiwgMHg3QywgMHgwMCwgMHgxMiwgMHgwNCwgMHg0NCwgMHhBRiwKKwkweDU2LCAweDdFLCAweDAwLCAweDAyLCAweDExLCAweEVFLCAweDc1LCAweDU2LAorLyoxREIwKi8weDAxLCAweEU0LCAweEZELCAweEY1LCAweDU3LCAweEFGLCAweDM1LCAweEZFLAorCTB4RkMsIDB4MTIsIDB4MDksIDB4MTUsIDB4MTIsIDB4MUMsIDB4OUQsIDB4MTIsCisvKjFEQzAqLzB4MUUsIDB4N0EsIDB4MTIsIDB4MUMsIDB4NEMsIDB4QUYsIDB4NTcsIDB4N0UsCisJMHgwMCwgMHhBRCwgMHg1NiwgMHg3QywgMHgwMCwgMHgxMiwgMHgwNCwgMHg0NCwKKy8qMUREMCovMHhBRiwgMHg1NiwgMHg3RSwgMHgwMCwgMHgwMiwgMHgxMSwgMHhFRSwgMHhFNCwKKwkweEY1LCAweDE2LCAweDEyLCAweDBFLCAweDQ0LCAweEZFLCAweEU1LCAweDA4LAorLyoxREUwKi8weDQ0LCAweDA1LCAweEZGLCAweDEyLCAweDBFLCAweDY1LCAweDhGLCAweDgyLAorCTB4OEUsIDB4ODMsIDB4RjAsIDB4MDUsIDB4MTYsIDB4RTUsIDB4MTYsIDB4QzMsCisvKjFERjAqLzB4OTQsIDB4MTQsIDB4NDAsIDB4RTYsIDB4RTUsIDB4MDgsIDB4MTIsIDB4MEUsCisJMHgyQiwgMHhFNCwgMHhGMCwgMHgyMiwgMHhFNCwgMHhGNSwgMHg1OCwgMHhGNSwKKy8qMUUwMCovMHg1OSwgMHhGNSwgMHg1QSwgMHhGRiwgMHhGRSwgMHhBRCwgMHg1OCwgMHhGQywKKwkweDEyLCAweDA5LCAweDE1LCAweDdGLCAweDA0LCAweDdFLCAweDAwLCAweEFELAorLyoxRTEwKi8weDU4LCAweDdDLCAweDAwLCAweDEyLCAweDA5LCAweDE1LCAweDdGLCAweDAyLAorCTB4N0UsIDB4MDAsIDB4QUQsIDB4NTgsIDB4N0MsIDB4MDAsIDB4MDIsIDB4MDksCisvKjFFMjAqLzB4MTUsIDB4RTUsIDB4M0MsIDB4MjUsIDB4M0UsIDB4RkMsIDB4RTUsIDB4NDIsCisJMHgyNCwgMHgwMCwgMHhGQiwgMHhFNCwgMHgzMywgMHhGQSwgMHhFQywgMHhDMywKKy8qMUUzMCovMHg5QiwgMHhFQSwgMHgxMiwgMHgwNywgMHg2QiwgMHg0MCwgMHgwQiwgMHg4QywKKwkweDQyLCAweEU1LCAweDNELCAweDI1LCAweDNGLCAweEY1LCAweDQxLCAweDhGLAorLyoxRTQwKi8weDQwLCAweDIyLCAweDEyLCAweDA5LCAweDBCLCAweDIyLCAweDc0LCAweDg0LAorCTB4RjUsIDB4MTgsIDB4ODUsIDB4MDgsIDB4MTksIDB4ODUsIDB4MTksIDB4ODIsCisvKjFFNTAqLzB4ODUsIDB4MTgsIDB4ODMsIDB4RTAsIDB4NTQsIDB4N0YsIDB4RjAsIDB4RTAsCisJMHg0NCwgMHg4MCwgMHhGMCwgMHhFMCwgMHg0NCwgMHg4MCwgMHhGMCwgMHgyMiwKKy8qMUU2MCovMHhFRiwgMHg0RSwgMHg3MCwgMHgwQiwgMHgxMiwgMHgwNywgMHgyQSwgMHg3NSwKKwkweDgzLCAweEQyLCAweEUwLCAweDU0LCAweERGLCAweEYwLCAweDIyLCAweDEyLAorLyoxRTcwKi8weDA3LCAweDJBLCAweDc1LCAweDgzLCAweEQyLCAweEUwLCAweDQ0LCAweDIwLAorCTB4RjAsIDB4MjIsIDB4NzUsIDB4NTgsIDB4MDEsIDB4OTAsIDB4MDcsIDB4MjYsCisvKjFFODAqLzB4MTIsIDB4MDcsIDB4MzUsIDB4RTAsIDB4NTQsIDB4M0YsIDB4RjUsIDB4NDEsCisJMHgxMiwgMHgwNywgMHgzMiwgMHhFMCwgMHg1NCwgMHgzRiwgMHhGNSwgMHg0MCwKKy8qMUU5MCovMHgyMiwgMHg3NSwgMHg1NiwgMHgwMiwgMHhFNCwgMHhGNSwgMHg1NywgMHgxMiwKKwkweDFELCAweEZDLCAweEFGLCAweDU3LCAweDdFLCAweDAwLCAweEFELCAweDU2LAorLyoxRUEwKi8weDdDLCAweDAwLCAweDAyLCAweDA0LCAweDQ0LCAweEU0LCAweEY1LCAweDQyLAorCTB4RjUsIDB4NDEsIDB4RjUsIDB4NDAsIDB4RjUsIDB4MzgsIDB4RjUsIDB4MzksCisvKjFFQjAqLzB4RjUsIDB4M0EsIDB4MjIsIDB4RUYsIDB4NTQsIDB4MDcsIDB4RkYsIDB4RTUsCisJMHhGOSwgMHg1NCwgMHhGOCwgMHg0RiwgMHhGNSwgMHhGOSwgMHgyMiwgMHg3RiwKKy8qMUVDMCovMHgwMSwgMHhFNCwgMHhGRSwgMHgwRiwgMHgwRSwgMHhCRSwgMHhGRiwgMHhGQiwKKwkweDIyLCAweDAxLCAweDIwLCAweDAwLCAweDAxLCAweDA0LCAweDIwLCAweDAwLAorLyoxRUQwKi8weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisvKjFFRTAqLzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qMUVGMCovMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyoxRjAwKi8weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisvKjFGMTAqLzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qMUYyMCovMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyoxRjMwKi8weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisvKjFGNDAqLzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qMUY1MCovMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyoxRjYwKi8weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisvKjFGNzAqLzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qMUY4MCovMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyoxRjkwKi8weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisvKjFGQTAqLzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qMUZCMCovMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyoxRkMwKi8weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisvKjFGRDAqLzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qMUZFMCovMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyoxRkYwKi8weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDEsIDB4MjAsIDB4MTEsIDB4MDAsIDB4MDQsIDB4MjAsIDB4MDAsIDB4ODEKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvbWx4X2JpdG9wcy5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL21seF9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWE5YmYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL21seF9iaXRvcHMuaApAQCAtMCwwICsxLDIyMyBAQAorI2lmbmRlZiBfTUxYX0JJVE9QU19ICisjZGVmaW5lIF9NTFhfQklUT1BTX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZmlsZQorICoKKyAqIE1lbGxhbm94IGJpdCBvcGVyYXRpb25zCisgKgorICovCisKKy8qIERhdGF0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGEgYml0IGluIHRoZSBNZWxsYW5veCBhdXRvZ2VuZXJhdGVkIGhlYWRlcnMgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBwc2V1ZG9fYml0X3Q7CisKKy8qKgorICogV3JhcHBlciBzdHJ1Y3R1cmUgZm9yIHBzZXVkb19iaXRfdCBzdHJ1Y3R1cmVzCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgYXV0b2dlbmVyYXRlZAorICogcHNldWRvX2JpdF90IHN0cnVjdHVyZXMuICBJdCBoYXMgdGhlIGNvcnJlY3Qgc2l6ZSwgYW5kIGFsc28KKyAqIGVuY2Fwc3VsYXRlcyB0eXBlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1bmRlcmx5aW5nIHBzZXVkb19iaXRfdAorICogc3RydWN0dXJlLCB3aGljaCBhbGxvd3MgdGhlIE1MWF9GSUxMIGV0Yy4gbWFjcm9zIHRvIHdvcmsgd2l0aG91dAorICogcmVxdWlyaW5nIGV4cGxpY2l0IHR5cGUgaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgTUxYX0RFQ0xBUkVfU1RSVUNUKCBfc3RydWN0dXJlICkJCQkJICAgICBcCisJX3N0cnVjdHVyZSB7CQkJCQkJCSAgICAgXAorCSAgICB1bmlvbiB7CQkJCQkJCSAgICAgXAorCQl1aW50OF90IGJ5dGVzWyBzaXplb2YgKCBzdHJ1Y3QgX3N0cnVjdHVyZSAjIyBfc3QgKSAvIDggXTsgICAgXAorCQl1aW50MzJfdCBkd29yZHNbIHNpemVvZiAoIHN0cnVjdCBfc3RydWN0dXJlICMjIF9zdCApIC8gMzIgXTsgXAorCQlzdHJ1Y3QgX3N0cnVjdHVyZSAjIyBfc3QgKmR1bW15WzBdOwkJCSAgICAgXAorCSAgICB9IHU7CQkJCQkJCSAgICAgXAorCX0KKworLyoqIEdldCBwc2V1ZG9fYml0X3Qgc3RydWN0dXJlIHR5cGUgZnJvbSB3cmFwcGVyIHN0cnVjdHVyZSBwb2ludGVyICovCisjZGVmaW5lIE1MWF9QU0VVRE9fU1RSVUNUKCBfcHRyICkJCQkJCSAgICAgXAorCXR5cGVvZiAoICooKF9wdHIpLT51LmR1bW15WzBdKSApCisKKy8qKiBCaXQgb2Zmc2V0IG9mIGEgZmllbGQgd2l0aGluIGEgcHNldWRvX2JpdF90IHN0cnVjdHVyZSAqLworI2RlZmluZSBNTFhfQklUX09GRlNFVCggX3N0cnVjdHVyZV9zdCwgX2ZpZWxkICkJCQkJICAgICBcCisJb2Zmc2V0b2YgKCBfc3RydWN0dXJlX3N0LCBfZmllbGQgKQorCisvKiogRHdvcmQgb2Zmc2V0IG9mIGEgZmllbGQgd2l0aGluIGEgcHNldWRvX2JpdF90IHN0cnVjdHVyZSAqLworI2RlZmluZSBNTFhfRFdPUkRfT0ZGU0VUKCBfc3RydWN0dXJlX3N0LCBfZmllbGQgKQkJCSAgICAgXAorCSggTUxYX0JJVF9PRkZTRVQgKCBfc3RydWN0dXJlX3N0LCBfZmllbGQgKSAvIDMyICkKKworLyoqIER3b3JkIGJpdCBvZmZzZXQgb2YgYSBmaWVsZCB3aXRoaW4gYSBwc2V1ZG9fYml0X3Qgc3RydWN0dXJlCisgKgorICogWWVzLCB1c2luZyBtb2QtMzIgd291bGQgd29yaywgYnV0IHdvdWxkIGxvc2UgdGhlIGNoZWNrIGZvciB0aGUKKyAqIGVycm9yIG9mIHNwZWNpZnlpbmcgYSBtaXNtYXRjaGVkIGZpZWxkIG5hbWUgYW5kIGR3b3JkIGluZGV4LgorICovCisjZGVmaW5lIE1MWF9EV09SRF9CSVRfT0ZGU0VUKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCApCQkgICAgIFwKKwkoIE1MWF9CSVRfT0ZGU0VUICggX3N0cnVjdHVyZV9zdCwgX2ZpZWxkICkgLSAoIDMyICogKF9pbmRleCkgKSApCisKKy8qKiBCaXQgd2lkdGggb2YgYSBmaWVsZCB3aXRoaW4gYSBwc2V1ZG9fYml0X3Qgc3RydWN0dXJlICovCisjZGVmaW5lIE1MWF9CSVRfV0lEVEgoIF9zdHJ1Y3R1cmVfc3QsIF9maWVsZCApCQkJCSAgICAgXAorCXNpemVvZiAoICggKCBfc3RydWN0dXJlX3N0ICogKSBOVUxMICktPl9maWVsZCApCisKKy8qKiBCaXQgbWFzayBmb3IgYSBmaWVsZCB3aXRoaW4gYSBwc2V1ZG9fYml0X3Qgc3RydWN0dXJlICovCisjZGVmaW5lIE1MWF9CSVRfTUFTSyggX3N0cnVjdHVyZV9zdCwgX2ZpZWxkICkJCQkJICAgICBcCisJKCAoIH4oICggdWludDMyX3QgKSAwICkgKSA+PgkJCQkJICAgICBcCisJICAoIDMyIC0gTUxYX0JJVF9XSURUSCAoIF9zdHJ1Y3R1cmVfc3QsIF9maWVsZCApICkgKQorCisvKgorICogQXNzZW1ibGUgbmF0aXZlLWVuZGlhbiBkd29yZCBmcm9tIG5hbWVkIGZpZWxkcyBhbmQgdmFsdWVzCisgKgorICovCisKKyNkZWZpbmUgTUxYX0FTU0VNQkxFXzEoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKQkJICAgICBcCisJKCAoX3ZhbHVlKSA8PCBNTFhfRFdPUkRfQklUX09GRlNFVCAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX2ZpZWxkICkgKQorCisjZGVmaW5lIE1MWF9BU1NFTUJMRV8yKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCwgX3ZhbHVlLCAuLi4gKQkgICAgIFwKKwkoIE1MWF9BU1NFTUJMRV8xICggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSApIHwJICAgICBcCisJICBNTFhfQVNTRU1CTEVfMSAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTUxYX0FTU0VNQkxFXzMoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCSAgICAgXAorCSggTUxYX0FTU0VNQkxFXzEgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCwgX3ZhbHVlICkgfAkgICAgIFwKKwkgIE1MWF9BU1NFTUJMRV8yICggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBNTFhfQVNTRU1CTEVfNCggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSwgLi4uICkJICAgICBcCisJKCBNTFhfQVNTRU1CTEVfMSAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CSAgICAgXAorCSAgTUxYX0FTU0VNQkxFXzMgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisjZGVmaW5lIE1MWF9BU1NFTUJMRV81KCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCwgX3ZhbHVlLCAuLi4gKQkgICAgIFwKKwkoIE1MWF9BU1NFTUJMRV8xICggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSApIHwJICAgICBcCisJICBNTFhfQVNTRU1CTEVfNCAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTUxYX0FTU0VNQkxFXzYoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCSAgICAgXAorCSggTUxYX0FTU0VNQkxFXzEgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCwgX3ZhbHVlICkgfAkgICAgIFwKKwkgIE1MWF9BU1NFTUJMRV81ICggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBNTFhfQVNTRU1CTEVfNyggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSwgLi4uICkJICAgICBcCisJKCBNTFhfQVNTRU1CTEVfMSAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CSAgICAgXAorCSAgTUxYX0FTU0VNQkxFXzYgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisvKgorICogQnVpbGQgbmF0aXZlLWVuZGlhbiAocG9zaXRpdmUpIGR3b3JkIGJpdG1hc2tzIGZyb20gbmFtZWQgZmllbGRzCisgKgorICovCisKKyNkZWZpbmUgTUxYX01BU0tfMSggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQgKQkJCSAgICAgXAorCSggTUxYX0JJVF9NQVNLICggX3N0cnVjdHVyZV9zdCwgX2ZpZWxkICkgPDwJCQkgICAgIFwKKwkgIE1MWF9EV09SRF9CSVRfT0ZGU0VUICggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQgKSApCisKKyNkZWZpbmUgTUxYX01BU0tfMiggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIC4uLiApCQkgICAgIFwKKwkoIE1MWF9NQVNLXzEgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCApIHwJCSAgICAgXAorCSAgTUxYX01BU0tfMSAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTUxYX01BU0tfMyggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIC4uLiApCQkgICAgIFwKKwkoIE1MWF9NQVNLXzEgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCApIHwJCSAgICAgXAorCSAgTUxYX01BU0tfMiAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTUxYX01BU0tfNCggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIC4uLiApCQkgICAgIFwKKwkoIE1MWF9NQVNLXzEgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCApIHwJCSAgICAgXAorCSAgTUxYX01BU0tfMyAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTUxYX01BU0tfNSggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIC4uLiApCQkgICAgIFwKKwkoIE1MWF9NQVNLXzEgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCApIHwJCSAgICAgXAorCSAgTUxYX01BU0tfNCAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTUxYX01BU0tfNiggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIC4uLiApCQkgICAgIFwKKwkoIE1MWF9NQVNLXzEgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCApIHwJCSAgICAgXAorCSAgTUxYX01BU0tfNSAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTUxYX01BU0tfNyggX3N0cnVjdHVyZV9zdCwgX2luZGV4LCBfZmllbGQsIC4uLiApCQkgICAgIFwKKwkoIE1MWF9NQVNLXzEgKCBfc3RydWN0dXJlX3N0LCBfaW5kZXgsIF9maWVsZCApIHwJCSAgICAgXAorCSAgTUxYX01BU0tfNiAoIF9zdHJ1Y3R1cmVfc3QsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKy8qCisgKiBQb3B1bGF0ZSBiaWctZW5kaWFuIGR3b3JkcyBmcm9tIG5hbWVkIGZpZWxkcyBhbmQgdmFsdWVzCisgKgorICovCisKKyNkZWZpbmUgTUxYX0ZJTEwoIF9wdHIsIF9pbmRleCwgX2Fzc2VtYmxlZCApCQkJCSAgICAgXAorCWRvIHsJCQkJCQkJCSAgICAgXAorCQl1aW50MzJfdCAqX19wdHIgPSAmKF9wdHIpLT51LmR3b3Jkc1soX2luZGV4KV07CQkgICAgIFwKKwkJdWludDMyX3QgX19hc3NlbWJsZWQgPSAoX2Fzc2VtYmxlZCk7CQkJICAgICBcCisJCSpfX3B0ciA9IGNwdV90b19iZTMyICggX19hc3NlbWJsZWQgKTsJCQkgICAgIFwKKwl9IHdoaWxlICggMCApCisKKyNkZWZpbmUgTUxYX0ZJTExfMSggX3B0ciwgX2luZGV4LCAuLi4gKQkJCQkJICAgICBcCisJTUxYX0ZJTEwgKCBfcHRyLCBfaW5kZXgsIE1MWF9BU1NFTUJMRV8xICggTUxYX1BTRVVET19TVFJVQ1QgKCBfcHRyICksXAorCQkJCQkJICBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisjZGVmaW5lIE1MWF9GSUxMXzIoIF9wdHIsIF9pbmRleCwgLi4uICkJCQkJCSAgICAgXAorCU1MWF9GSUxMICggX3B0ciwgX2luZGV4LCBNTFhfQVNTRU1CTEVfMiAoIE1MWF9QU0VVRE9fU1RSVUNUICggX3B0ciApLFwKKwkJCQkJCSAgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBNTFhfRklMTF8zKCBfcHRyLCBfaW5kZXgsIC4uLiApCQkJCQkgICAgIFwKKwlNTFhfRklMTCAoIF9wdHIsIF9pbmRleCwgTUxYX0FTU0VNQkxFXzMgKCBNTFhfUFNFVURPX1NUUlVDVCAoIF9wdHIgKSxcCisJCQkJCQkgIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTUxYX0ZJTExfNCggX3B0ciwgX2luZGV4LCAuLi4gKQkJCQkJICAgICBcCisJTUxYX0ZJTEwgKCBfcHRyLCBfaW5kZXgsIE1MWF9BU1NFTUJMRV80ICggTUxYX1BTRVVET19TVFJVQ1QgKCBfcHRyICksXAorCQkJCQkJICBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisjZGVmaW5lIE1MWF9GSUxMXzUoIF9wdHIsIF9pbmRleCwgLi4uICkJCQkJCSAgICAgXAorCU1MWF9GSUxMICggX3B0ciwgX2luZGV4LCBNTFhfQVNTRU1CTEVfNSAoIE1MWF9QU0VVRE9fU1RSVUNUICggX3B0ciApLFwKKwkJCQkJCSAgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBNTFhfRklMTF82KCBfcHRyLCBfaW5kZXgsIC4uLiApCQkJCQkgICAgIFwKKwlNTFhfRklMTCAoIF9wdHIsIF9pbmRleCwgTUxYX0FTU0VNQkxFXzYgKCBNTFhfUFNFVURPX1NUUlVDVCAoIF9wdHIgKSxcCisJCQkJCQkgIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTUxYX0ZJTExfNyggX3B0ciwgX2luZGV4LCAuLi4gKQkJCQkJICAgICBcCisJTUxYX0ZJTEwgKCBfcHRyLCBfaW5kZXgsIE1MWF9BU1NFTUJMRV83ICggTUxYX1BTRVVET19TVFJVQ1QgKCBfcHRyICksXAorCQkJCQkJICBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisvKgorICogTW9kaWZ5IGJpZy1lbmRpYW4gZHdvcmQgdXNpbmcgbmFtZWQgZmllbGQgYW5kIHZhbHVlCisgKgorICovCisKKyNkZWZpbmUgTUxYX1NFVCggX3B0ciwgX2ZpZWxkLCBfdmFsdWUgKQkJCQkJICAgICBcCisJZG8gewkJCQkJCQkJICAgICBcCisJCXVuc2lnbmVkIGludCBfX2luZGV4ID0gCQkJCQkgICAgIFwKKwkJICAgIE1MWF9EV09SRF9PRkZTRVQgKCBNTFhfUFNFVURPX1NUUlVDVCAoIF9wdHIgKSwgX2ZpZWxkICk7IFwKKwkJdWludDMyX3QgKl9fcHRyID0gJihfcHRyKS0+dS5kd29yZHNbX19pbmRleF07CQkgICAgIFwKKwkJdWludDMyX3QgX192YWx1ZSA9IGJlMzJfdG9fY3B1ICggKl9fcHRyICk7CQkgICAgIFwKKwkJX192YWx1ZSAmPSB+KCBNTFhfTUFTS18xICggTUxYX1BTRVVET19TVFJVQ1QgKCBfcHRyICksCSAgICAgXAorCQkJCQkgICBfX2luZGV4LCBfZmllbGQgKSApOwkJICAgICBcCisJCV9fdmFsdWUgfD0gTUxYX0FTU0VNQkxFXzEgKCBNTFhfUFNFVURPX1NUUlVDVCAoIF9wdHIgKSwJICAgICBcCisJCQkJCSAgICBfX2luZGV4LCBfZmllbGQsIF92YWx1ZSApOwkgICAgIFwKKwkJKl9fcHRyID0gY3B1X3RvX2JlMzIgKCBfX3ZhbHVlICk7CQkJICAgICBcCisJfSB3aGlsZSAoIDAgKQorCisvKgorICogRXh0cmFjdCB2YWx1ZSBvZiBuYW1lZCBmaWVsZAorICoKKyAqLworCisjZGVmaW5lIE1MWF9HRVQoIF9wdHIsIF9maWVsZCApCQkJCQkJICAgICBcCisJKCB7CQkJCQkJCQkgICAgIFwKKwkJdW5zaWduZWQgaW50IF9faW5kZXggPSAJCQkJCSAgICAgXAorCQkgICAgTUxYX0RXT1JEX09GRlNFVCAoIE1MWF9QU0VVRE9fU1RSVUNUICggX3B0ciApLCBfZmllbGQgKTsgXAorCQl1aW50MzJfdCAqX19wdHIgPSAmKF9wdHIpLT51LmR3b3Jkc1tfX2luZGV4XTsJCSAgICAgXAorCQl1aW50MzJfdCBfX3ZhbHVlID0gYmUzMl90b19jcHUgKCAqX19wdHIgKTsJCSAgICAgXAorCQlfX3ZhbHVlID4+PQkJCQkJCSAgICAgXAorCQkgICAgTUxYX0RXT1JEX0JJVF9PRkZTRVQgKCBNTFhfUFNFVURPX1NUUlVDVCAoIF9wdHIgKSwJICAgICBcCisJCQkJCSAgICBfX2luZGV4LCBfZmllbGQgKTsJCSAgICAgXAorCQlfX3ZhbHVlICY9CQkJCQkJICAgICBcCisJCSAgICBNTFhfQklUX01BU0sgKCBNTFhfUFNFVURPX1NUUlVDVCAoIF9wdHIgKSwgX2ZpZWxkICk7ICAgICBcCisJCV9fdmFsdWU7CQkJCQkJICAgICBcCisJfSApCisKKyNlbmRpZiAvKiBfTUxYX0JJVE9QU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvcWliXzcyMjBfcmVncy5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL3FpYl83MjIwX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM3ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9pbmZpbmliYW5kL3FpYl83MjIwX3JlZ3MuaApAQCAtMCwwICsxLDE3NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgUUxvZ2ljIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworLyogVGhpcyBmaWxlIGlzIG1lY2hhbmljYWxseSBnZW5lcmF0ZWQgZnJvbSBSVEwuIEFueSBoYW5kLWVkaXRzIHdpbGwgYmUgbG9zdCEgKi8KKworLyogVGhpcyBmaWxlIGhhcyBiZWVuIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IC4vZHJpdmVycy9pbmZpbmliYW5kL3FpYl9nZW5iaXRzLnBsICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisjZGVmaW5lIFFJQl83MjIwX1JldmlzaW9uX29mZnNldCAweDAwMDAwMDAwVUwKK3N0cnVjdCBRSUJfNzIyMF9SZXZpc2lvbl9wYiB7CisJcHNldWRvX2JpdF90IFJfQ2hpcFJldk1pbm9yWzhdOworCXBzZXVkb19iaXRfdCBSX0NoaXBSZXZNYWpvcls4XTsKKwlwc2V1ZG9fYml0X3QgUl9BcmNoWzhdOworCXBzZXVkb19iaXRfdCBSX1NXWzhdOworCXBzZXVkb19iaXRfdCBCb2FyZElEWzhdOworCXBzZXVkb19iaXRfdCBSX0VtdWxhdGlvbl9SZXZjb2RlWzIyXTsKKwlwc2V1ZG9fYml0X3QgUl9FbXVsYXRpb25bMV07CisJcHNldWRvX2JpdF90IFJfU2ltdWxhdG9yWzFdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9SZXZpc2lvbiB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfUmV2aXNpb25fcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfQ29udHJvbF9vZmZzZXQgMHgwMDAwMDAwOFVMCitzdHJ1Y3QgUUlCXzcyMjBfQ29udHJvbF9wYiB7CisJcHNldWRvX2JpdF90IFN5bmNSZXNldFsxXTsKKwlwc2V1ZG9fYml0X3QgRnJlZXplTW9kZVsxXTsKKwlwc2V1ZG9fYml0X3QgTGlua0VuWzFdOworCXBzZXVkb19iaXRfdCBQQ0lFUmV0cnlCdWZEaWFnRW5bMV07CisJcHNldWRvX2JpdF90IFR4TGF0ZW5jeVsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMV07CisJcHNldWRvX2JpdF90IFBDSUVDcGxRRGlhZ0VuWzFdOworCXBzZXVkb19iaXRfdCBTeW5jUmVzZXRFeGNlcHRQY2llSVJBTVJTVFsxXTsKKwlwc2V1ZG9fYml0X3QgX3VudXNlZF8wWzU2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfQ29udHJvbCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfQ29udHJvbF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9QYWdlQWxpZ25fb2Zmc2V0IDB4MDAwMDAwMTBVTAorCisjZGVmaW5lIFFJQl83MjIwX1BvcnRDbnRfb2Zmc2V0IDB4MDAwMDAwMThVTAorCisjZGVmaW5lIFFJQl83MjIwX0RiZ1BvcnRTZWxfb2Zmc2V0IDB4MDAwMDAwMjBVTAorc3RydWN0IFFJQl83MjIwX0RiZ1BvcnRTZWxfcGIgeworCXBzZXVkb19iaXRfdCBOaWJibGVTZWwwWzRdOworCXBzZXVkb19iaXRfdCBOaWJibGVTZWwxWzRdOworCXBzZXVkb19iaXRfdCBOaWJibGVTZWwyWzRdOworCXBzZXVkb19iaXRfdCBOaWJibGVTZWwzWzRdOworCXBzZXVkb19iaXRfdCBOaWJibGVTZWw0WzRdOworCXBzZXVkb19iaXRfdCBOaWJibGVTZWw1WzRdOworCXBzZXVkb19iaXRfdCBOaWJibGVTZWw2WzRdOworCXBzZXVkb19iaXRfdCBOaWJibGVTZWw3WzRdOworCXBzZXVkb19iaXRfdCBTcmNNdXhTZWxbMTRdOworCXBzZXVkb19iaXRfdCBEYmdDbGtQb3J0U2VsWzVdOworCXBzZXVkb19iaXRfdCBFbkRiZ1BvcnRbMV07CisJcHNldWRvX2JpdF90IEVuRW5oYW5jZWREZWJ1Z01vZGVbMV07CisJcHNldWRvX2JpdF90IEVuaE1vZGVfU3JjTXV4U2VsSW5kZXhbMTBdOworCXBzZXVkb19iaXRfdCBFbmhNb2RlX1NyY011eFNlbFdyRW5bMV07Cit9Oworc3RydWN0IFFJQl83MjIwX0RiZ1BvcnRTZWwgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX0RiZ1BvcnRTZWxfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfRGVidWdTaWdzSW50U2VsX29mZnNldCAweDAwMDAwMDI4VUwKK3N0cnVjdCBRSUJfNzIyMF9EZWJ1Z1NpZ3NJbnRTZWxfcGIgeworCXBzZXVkb19iaXRfdCBkZWJ1Z19wb3J0X3NlbF9wY3NfcGlwZV9sYW5lMDdbM107CisJcHNldWRvX2JpdF90IGRlYnVnX3BvcnRfc2VsX3Bjc19waXBlX2xhbmU4MTVbM107CisJcHNldWRvX2JpdF90IGRlYnVnX3BvcnRfc2VsX3Bjc19zZG91dFsxXTsKKwlwc2V1ZG9fYml0X3QgZGVidWdfcG9ydF9zZWxfcGNzX3N5bWxvY2tfZWxmaWZvX2xhbmVbNF07CisJcHNldWRvX2JpdF90IGRlYnVnX3BvcnRfc2VsX3Bjc19yeGRldF9lbmNkZWNfbGFuZVs0XTsKKwlwc2V1ZG9fYml0X3QgZGVidWdfcG9ydF9zZWxfcGNpZV9yeF90eFsxXTsKKwlwc2V1ZG9fYml0X3QgZGVidWdfcG9ydF9zZWxfeGd4c1s0XTsKKwlwc2V1ZG9fYml0X3QgZGVidWdfcG9ydF9zZWxfZXBiX3BjaWVbMV07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFs0M107Cit9Oworc3RydWN0IFFJQl83MjIwX0RlYnVnU2lnc0ludFNlbCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfRGVidWdTaWdzSW50U2VsX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1NlbmRSZWdCYXNlX29mZnNldCAweDAwMDAwMDMwVUwKKworI2RlZmluZSBRSUJfNzIyMF9Vc2VyUmVnQmFzZV9vZmZzZXQgMHgwMDAwMDAzOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfQ250clJlZ0Jhc2Vfb2Zmc2V0IDB4MDAwMDAwNDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1NjcmF0Y2hfb2Zmc2V0IDB4MDAwMDAwNDhVTAorCisjZGVmaW5lIFFJQl83MjIwX1JFR18wMDAwNTBfb2Zmc2V0IDB4MDAwMDAwNTBVTAorCisjZGVmaW5lIFFJQl83MjIwX0ludEJsb2NrZWRfb2Zmc2V0IDB4MDAwMDAwNjBVTAorc3RydWN0IFFJQl83MjIwX0ludEJsb2NrZWRfcGIgeworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDBJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDFJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDJJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDNJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDRJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDVJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDZJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDdJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDhJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDlJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDEwSW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxMUludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsMTJJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDEzSW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxNEludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsMTVJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDE2SW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzldOworCXBzZXVkb19iaXRfdCBKSW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgSUJTZXJkZXNUcmltRG9uZUludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IGFzc2VydEdQSU9JbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBQaW9CdWZBdmFpbEludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IFBpb1NldEludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IEVycm9ySW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnMEludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzFJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcySW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnM0ludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzRJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmc1SW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnNkludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzdJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmc4SW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnOUludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzEwSW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnMTFJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxMkludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzEzSW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnMTRJbnRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxNUludEJsb2NrZWRbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzE2SW50QmxvY2tlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTNdOworCXBzZXVkb19iaXRfdCBTRG1hRGlzYWJsZWRCbG9ja2VkWzFdOworCXBzZXVkb19iaXRfdCBTRG1hSW50QmxvY2tlZFsxXTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfSW50QmxvY2tlZCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfSW50QmxvY2tlZF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9JbnRNYXNrX29mZnNldCAweDAwMDAwMDY4VUwKK3N0cnVjdCBRSUJfNzIyMF9JbnRNYXNrX3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwwSW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxSW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwySW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwzSW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw0SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw1SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw2SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw3SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw4SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw5SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxMEludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsMTFJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDEySW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxM0ludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsMTRJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDE1SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxNkludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVs5XTsKKwlwc2V1ZG9fYml0X3QgSkludE1hc2tbMV07CisJcHNldWRvX2JpdF90IElCU2VyZGVzVHJpbURvbmVJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBhc3NlcnRHUElPSW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUGlvQnVmQXZhaWxJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBQaW9TZXRJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBFcnJvckludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzBJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxSW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnMkludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzNJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmc0SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnNUludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzZJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmc3SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnOEludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzlJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxMEludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzExSW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnMTJJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxM0ludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzE0SW50TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnMTVJbnRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxNkludE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzEzXTsKKwlwc2V1ZG9fYml0X3QgU0RtYURpc2FibGVkTWFza2VkWzFdOworCXBzZXVkb19iaXRfdCBTRG1hSW50TWFza1sxXTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfSW50TWFzayB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfSW50TWFza19wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9JbnRTdGF0dXNfb2Zmc2V0IDB4MDAwMDAwNzBVTAorc3RydWN0IFFJQl83MjIwX0ludFN0YXR1c19wYiB7CisJcHNldWRvX2JpdF90IFJjdkF2YWlsMFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDJbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsM1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw0WzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDVbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsNlsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw3WzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDhbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsOVsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxMFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxMVsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxMlsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxM1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxNFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxNVsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxNlsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzldOworCXBzZXVkb19iaXRfdCBKSW50WzFdOworCXBzZXVkb19iaXRfdCBJQlNlcmRlc1RyaW1Eb25lWzFdOworCXBzZXVkb19iaXRfdCBhc3NlcnRHUElPWzFdOworCXBzZXVkb19iaXRfdCBQaW9CdWZBdmFpbFsxXTsKKwlwc2V1ZG9fYml0X3QgUGlvU2VudFsxXTsKKwlwc2V1ZG9fYml0X3QgRXJyb3JbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzBbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzFbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzJbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzNbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzRbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzVbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzZbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzdbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzhbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzlbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzEwWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxMVsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnMTJbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzEzWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxNFsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnMTVbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzE2WzFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxM107CisJcHNldWRvX2JpdF90IFNEbWFEaXNhYmxlZFsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYUludFsxXTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfSW50U3RhdHVzIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9JbnRTdGF0dXNfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfSW50Q2xlYXJfb2Zmc2V0IDB4MDAwMDAwNzhVTAorc3RydWN0IFFJQl83MjIwX0ludENsZWFyX3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwwSW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsMUludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDJJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwzSW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsNEludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDVJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw2SW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsN0ludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDhJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWw5SW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsMTBJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxMUludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDEySW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsMTNJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2QXZhaWwxNEludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZBdmFpbDE1SW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdkF2YWlsMTZJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzldOworCXBzZXVkb19iaXRfdCBKSW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IElCU2VyZGVzVHJpbURvbmVDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgYXNzZXJ0R1BJT0ludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBQaW9CdWZBdmFpbEludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBQaW9TZXRJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgRXJyb3JJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnMEludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxSW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzJJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnM0ludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmc0SW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzVJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnNkludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmc3SW50Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdlVyZzhJbnRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VXJnOUludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxMEludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxMUludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxMkludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxM0ludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxNEludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxNUludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVcmcxNkludENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxM107CisJcHNldWRvX2JpdF90IFNEbWFEaXNhYmxlZENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBTRG1hSW50Q2xlYXJbMV07Cit9Oworc3RydWN0IFFJQl83MjIwX0ludENsZWFyIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9JbnRDbGVhcl9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9FcnJNYXNrX29mZnNldCAweDAwMDAwMDgwVUwKK3N0cnVjdCBRSUJfNzIyMF9FcnJNYXNrX3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2Rm9ybWF0RXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VkNSQ0Vyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdklDUkNFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZNaW5Qa3RMZW5FcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZNYXhQa3RMZW5FcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZMb25nUGt0TGVuRXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2U2hvcnRQa3RMZW5FcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVbmV4cGVjdGVkQ2hhckVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdlVuc3VwcG9ydGVkVkxFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZFQlBFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZJQkZsb3dFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZCYWRWZXJzaW9uRXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmN2RWdyRnVsbEVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFJjdkhkckZ1bGxFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZCYWRUaWRFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZIZHJMZW5FcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZIZHJFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSY3ZJQkxvc3RMaW5rRXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzldOworCXBzZXVkb19iaXRfdCBTZW5kU3BlY2lhbFRyaWdnZXJFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBTRG1hRGlzYWJsZWRFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBTZW5kTWluUGt0TGVuRXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZE1heFBrdExlbkVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNlbmRVbmRlclJ1bkVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNlbmRQa3RMZW5FcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBTZW5kRHJvcHBlZFNtcFBrdEVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNlbmREcm9wcGVkRGF0YVBrdEVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNlbmRQaW9Bcm1MYXVuY2hFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBTZW5kVW5leHBlY3RlZFBrdE51bUVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNlbmRVbnN1cHBvcnRlZFZMRXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZEJ1Zk1pc3VzZUVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNEbWFHZW5NaXNtYXRjaEVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNEbWFPdXRPZkJvdW5kRXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYVRhaWxPdXRPZkJvdW5kRXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYUJhc2VFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBTRG1hMXN0RGVzY0Vyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNEbWFScHlUYWdFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBTRG1hRHdFbkVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNEbWFNaXNzaW5nRHdFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBTRG1hVW5leHBEYXRhRXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgSUJTdGF0dXNDaGFuZ2VkTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgSW52YWxpZEFkZHJFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBSZXNldE5lZ2F0ZWRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBIYXJkd2FyZUVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFNEbWFEZXNjQWRkck1pc2FsaWduRXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgSW52YWxpZEVFUENtZE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzEwXTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfRXJyTWFzayB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfRXJyTWFza19wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9FcnJTdGF0dXNfb2Zmc2V0IDB4MDAwMDAwODhVTAorc3RydWN0IFFJQl83MjIwX0VyclN0YXR1c19wYiB7CisJcHNldWRvX2JpdF90IFJjdkZvcm1hdEVyclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VkNSQ0VyclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2SUNSQ0VyclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2TWluUGt0TGVuRXJyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZNYXhQa3RMZW5FcnJbMV07CisJcHNldWRvX2JpdF90IFJjdkxvbmdQa3RMZW5FcnJbMV07CisJcHNldWRvX2JpdF90IFJjdlNob3J0UGt0TGVuRXJyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZVbmV4cGVjdGVkQ2hhckVyclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2VW5zdXBwb3J0ZWRWTEVyclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2RUJQRXJyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZJQkZsb3dFcnJbMV07CisJcHNldWRvX2JpdF90IFJjdkJhZFZlcnNpb25FcnJbMV07CisJcHNldWRvX2JpdF90IFJjdkVnckZ1bGxFcnJbMV07CisJcHNldWRvX2JpdF90IFJjdkhkckZ1bGxFcnJbMV07CisJcHNldWRvX2JpdF90IFJjdkJhZFRpZEVyclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2SGRyTGVuRXJyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZIZHJFcnJbMV07CisJcHNldWRvX2JpdF90IFJjdklCTG9zdExpbmtFcnJbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVs5XTsKKwlwc2V1ZG9fYml0X3QgU2VuZFNwZWNpYWxUcmlnZ2VyRXJyWzFdOworCXBzZXVkb19iaXRfdCBTRG1hRGlzYWJsZWRFcnJbMV07CisJcHNldWRvX2JpdF90IFNlbmRNaW5Qa3RMZW5FcnJbMV07CisJcHNldWRvX2JpdF90IFNlbmRNYXhQa3RMZW5FcnJbMV07CisJcHNldWRvX2JpdF90IFNlbmRVbmRlclJ1bkVyclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZFBrdExlbkVyclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZERyb3BwZWRTbXBQa3RFcnJbMV07CisJcHNldWRvX2JpdF90IFNlbmREcm9wcGVkRGF0YVBrdEVyclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZFBpb0FybUxhdW5jaEVyclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZFVuZXhwZWN0ZWRQa3ROdW1FcnJbMV07CisJcHNldWRvX2JpdF90IFNlbmRVbnN1cHBvcnRlZFZMRXJyWzFdOworCXBzZXVkb19iaXRfdCBTZW5kQnVmTWlzdXNlRXJyWzFdOworCXBzZXVkb19iaXRfdCBTRG1hR2VuTWlzbWF0Y2hFcnJbMV07CisJcHNldWRvX2JpdF90IFNEbWFPdXRPZkJvdW5kRXJyWzFdOworCXBzZXVkb19iaXRfdCBTRG1hVGFpbE91dE9mQm91bmRFcnJbMV07CisJcHNldWRvX2JpdF90IFNEbWFCYXNlRXJyWzFdOworCXBzZXVkb19iaXRfdCBTRG1hMXN0RGVzY0VyclsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYVJweVRhZ0VyclsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYUR3RW5FcnJbMV07CisJcHNldWRvX2JpdF90IFNEbWFNaXNzaW5nRHdFcnJbMV07CisJcHNldWRvX2JpdF90IFNEbWFVbmV4cERhdGFFcnJbMV07CisJcHNldWRvX2JpdF90IElCU3RhdHVzQ2hhbmdlZFsxXTsKKwlwc2V1ZG9fYml0X3QgSW52YWxpZEFkZHJFcnJbMV07CisJcHNldWRvX2JpdF90IFJlc2V0TmVnYXRlZFsxXTsKKwlwc2V1ZG9fYml0X3QgSGFyZHdhcmVFcnJbMV07CisJcHNldWRvX2JpdF90IFNEbWFEZXNjQWRkck1pc2FsaWduRXJyWzFdOworCXBzZXVkb19iaXRfdCBJbnZhbGlkRUVQQ21kRXJyWzFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxMF07Cit9Oworc3RydWN0IFFJQl83MjIwX0VyclN0YXR1cyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfRXJyU3RhdHVzX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX0VyckNsZWFyX29mZnNldCAweDAwMDAwMDkwVUwKK3N0cnVjdCBRSUJfNzIyMF9FcnJDbGVhcl9wYiB7CisJcHNldWRvX2JpdF90IFJjdkZvcm1hdEVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZWQ1JDRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdklDUkNFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2TWluUGt0TGVuRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdk1heFBrdExlbkVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZMb25nUGt0TGVuRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdlNob3J0UGt0TGVuRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdlVuZXhwZWN0ZWRDaGFyRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdlVuc3VwcG9ydGVkVkxFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2RUJQRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdklCRmxvd0VyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZCYWRWZXJzaW9uRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdkVnckZ1bGxFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2SGRyRnVsbEVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZCYWRUaWRFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmN2SGRyTGVuRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJjdkhkckVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSY3ZJQkxvc3RMaW5rRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVs5XTsKKwlwc2V1ZG9fYml0X3QgU2VuZFNwZWNpYWxUcmlnZ2VyRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFNEbWFEaXNhYmxlZEVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBTZW5kTWluUGt0TGVuRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFNlbmRNYXhQa3RMZW5FcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZFVuZGVyUnVuRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFNlbmRQa3RMZW5FcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZERyb3BwZWRTbXBQa3RFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZERyb3BwZWREYXRhUGt0RXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFNlbmRQaW9Bcm1MYXVuY2hFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZFVuZXhwZWN0ZWRQa3ROdW1FcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZFVuc3VwcG9ydGVkVkxFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZEJ1Zk1pc3VzZUVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBTRG1hR2VuTWlzbWF0Y2hFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYU91dE9mQm91bmRFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYVRhaWxPdXRPZkJvdW5kRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFNEbWFCYXNlRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFNEbWExc3REZXNjRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFNEbWFScHlUYWdFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYUR3RW5FcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYU1pc3NpbmdEd0VyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBTRG1hVW5leHBEYXRhRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IElCU3RhdHVzQ2hhbmdlZENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBJbnZhbGlkQWRkckVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSZXNldE5lZ2F0ZWRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgSGFyZHdhcmVFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYURlc2NBZGRyTWlzYWxpZ25FcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgSW52YWxpZEVFUENtZEVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxMF07Cit9Oworc3RydWN0IFFJQl83MjIwX0VyckNsZWFyIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9FcnJDbGVhcl9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9Id0Vyck1hc2tfb2Zmc2V0IDB4MDAwMDAwOThVTAorc3RydWN0IFFJQl83MjIwX0h3RXJyTWFza19wYiB7CisJcHNldWRvX2JpdF90IFBDSWVNZW1QYXJpdHlFcnJNYXNrWzhdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZDNbMjBdOworCXBzZXVkb19iaXRfdCBTRG1hTWVtUmVhZEVyck1hc2tbMV07CisJcHNldWRvX2JpdF90IFBvaXNvbmVkVExQTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUGNpZUNwbFRpbWVvdXRNYXNrWzFdOworCXBzZXVkb19iaXRfdCBQQ0llQnVzUGFyaXR5RXJyTWFza1szXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQyWzJdOworCXBzZXVkb19iaXRfdCBQQ0lFT2N0MF91Q19NZW1vcnlQYXJpdHlFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBQQ0lFT2N0MV91Q19NZW1vcnlQYXJpdHlFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBJQl91Q19NZW1vcnlQYXJpdHlFcnJNYXNrWzFdOworCXBzZXVkb19iaXRfdCBERFNSWEVRTWVtb3J5UGFyaXR5RXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgVFhFTWVtUGFyaXR5RXJyTWFza1s0XTsKKwlwc2V1ZG9fYml0X3QgUlhFTWVtUGFyaXR5RXJyTWFza1s3XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzNdOworCXBzZXVkb19iaXRfdCBQb3dlck9uQklTVEZhaWxlZE1hc2tbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzFdOworCXBzZXVkb19iaXRfdCBQQ0lFU2VyZGVzUTBQQ2xrTm90RGV0ZWN0TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgUENJRVNlcmRlc1ExUENsa05vdERldGVjdE1hc2tbMV07CisJcHNldWRvX2JpdF90IFBDSUVTZXJkZXNRMlBDbGtOb3REZXRlY3RNYXNrWzFdOworCXBzZXVkb19iaXRfdCBQQ0lFU2VyZGVzUTNQQ2xrTm90RGV0ZWN0TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgSUJTZXJkZXNQQ2xrTm90RGV0ZWN0TWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgQ2xrX3VDX1BMTE5vdExvY2tlZE1hc2tbMV07CisJcHNldWRvX2JpdF90IElCQ0J1c1RvU1BDUGFyaXR5RXJyTWFza1sxXTsKKwlwc2V1ZG9fYml0X3QgSUJDQnVzRnJvbVNQQ1Bhcml0eUVyck1hc2tbMV07Cit9Oworc3RydWN0IFFJQl83MjIwX0h3RXJyTWFzayB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfSHdFcnJNYXNrX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX0h3RXJyU3RhdHVzX29mZnNldCAweDAwMDAwMGEwVUwKK3N0cnVjdCBRSUJfNzIyMF9Id0VyclN0YXR1c19wYiB7CisJcHNldWRvX2JpdF90IFBDSWVNZW1QYXJpdHlbOF07CisJcHNldWRvX2JpdF90IFJlc2VydmVkM1syMF07CisJcHNldWRvX2JpdF90IFNEbWFNZW1SZWFkRXJyWzFdOworCXBzZXVkb19iaXRfdCBQb2lzZW5lZFRMUFsxXTsKKwlwc2V1ZG9fYml0X3QgUGNpZUNwbFRpbWVvdXRbMV07CisJcHNldWRvX2JpdF90IFBDSWVCdXNQYXJpdHlbM107CisJcHNldWRvX2JpdF90IFJlc2VydmVkMlsyXTsKKwlwc2V1ZG9fYml0X3QgUENJRV91Q19PY3QwTWVtb3J5UGFyaXR5RXJyWzFdOworCXBzZXVkb19iaXRfdCBQQ0lFX3VDX09jdDFNZW1vcnlQYXJpdHlFcnJbMV07CisJcHNldWRvX2JpdF90IElCX3VDX01lbW9yeVBhcml0eUVyclsxXTsKKwlwc2V1ZG9fYml0X3QgRERTUlhFUU1lbW9yeVBhcml0eUVyclsxXTsKKwlwc2V1ZG9fYml0X3QgVFhFTWVtUGFyaXR5WzRdOworCXBzZXVkb19iaXRfdCBSWEVNZW1QYXJpdHlbN107CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVszXTsKKwlwc2V1ZG9fYml0X3QgUG93ZXJPbkJJU1RGYWlsZWRbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzFdOworCXBzZXVkb19iaXRfdCBQQ0lFU2VyZGVzUTBQQ2xrTm90RGV0ZWN0WzFdOworCXBzZXVkb19iaXRfdCBQQ0lFU2VyZGVzUTFQQ2xrTm90RGV0ZWN0WzFdOworCXBzZXVkb19iaXRfdCBQQ0lFU2VyZGVzUTJQQ2xrTm90RGV0ZWN0WzFdOworCXBzZXVkb19iaXRfdCBQQ0lFU2VyZGVzUTNQQ2xrTm90RGV0ZWN0WzFdOworCXBzZXVkb19iaXRfdCBJQlNlcmRlc1BDbGtOb3REZXRlY3RbMV07CisJcHNldWRvX2JpdF90IENsa191Q19QTExOb3RMb2NrZWRbMV07CisJcHNldWRvX2JpdF90IElCQ0J1c1RvU1BDUGFyaXR5RXJyWzFdOworCXBzZXVkb19iaXRfdCBJQkNCdXNGcm9tU1BDUGFyaXR5RXJyWzFdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9Id0VyclN0YXR1cyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfSHdFcnJTdGF0dXNfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfSHdFcnJDbGVhcl9vZmZzZXQgMHgwMDAwMDBhOFVMCitzdHJ1Y3QgUUlCXzcyMjBfSHdFcnJDbGVhcl9wYiB7CisJcHNldWRvX2JpdF90IFBDSWVNZW1QYXJpdHlDbHJbOF07CisJcHNldWRvX2JpdF90IFJlc2VydmVkM1syMF07CisJcHNldWRvX2JpdF90IFNEbWFNZW1SZWFkRXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFBvaXNvbmVkVExQQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFBjaWVDcGxUaW1lb3V0Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFBDSWVCdXNQYXJpdHlDbHJbM107CisJcHNldWRvX2JpdF90IFJlc2VydmVkMlsyXTsKKwlwc2V1ZG9fYml0X3QgUENJRV91Q19PY3QwTWVtb3J5UGFyaXR5RXJyQ2xlYXJbMV07CisJcHNldWRvX2JpdF90IFBDSUVfdUNfT2N0MU1lbW9yeVBhcml0eUVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBJQl91Q19NZW1vcnlQYXJpdHlFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgRERTUlhFUU1lbW9yeVBhcml0eUVyckNsZWFyWzFdOworCXBzZXVkb19iaXRfdCBUWEVNZW1QYXJpdHlDbGVhcls0XTsKKwlwc2V1ZG9fYml0X3QgUlhFTWVtUGFyaXR5Q2xlYXJbN107CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVszXTsKKwlwc2V1ZG9fYml0X3QgUG93ZXJPbkJJU1RGYWlsZWRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMV07CisJcHNldWRvX2JpdF90IFBDSUVTZXJkZXNRMFBDbGtOb3REZXRlY3RDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgUENJRVNlcmRlc1ExUENsa05vdERldGVjdENsZWFyWzFdOworCXBzZXVkb19iaXRfdCBQQ0lFU2VyZGVzUTJQQ2xrTm90RGV0ZWN0Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IFBDSUVTZXJkZXNRM1BDbGtOb3REZXRlY3RDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgSUJTZXJkZXNQQ2xrTm90RGV0ZWN0Q2xlYXJbMV07CisJcHNldWRvX2JpdF90IENsa191Q19QTExOb3RMb2NrZWRDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgSUJDQnVzVG9TUENwYXJpdHlFcnJDbGVhclsxXTsKKwlwc2V1ZG9fYml0X3QgSUJDQnVzRnJvbVNQQ1Bhcml0eUVyckNsZWFyWzFdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9Id0VyckNsZWFyIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9Id0VyckNsZWFyX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX0h3RGlhZ0N0cmxfb2Zmc2V0IDB4MDAwMDAwYjBVTAorc3RydWN0IFFJQl83MjIwX0h3RGlhZ0N0cmxfcGIgeworCXBzZXVkb19iaXRfdCBmb3JjZVBDSWVNZW1QYXJpdHlbOF07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMlsyM107CisJcHNldWRvX2JpdF90IGZvcmNlUENJZUJ1c1Bhcml0eVs0XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzFdOworCXBzZXVkb19iaXRfdCBGb3JjZVBDSUVfdUNfT2N0ME1lbW9yeVBhcml0eUVyclsxXTsKKwlwc2V1ZG9fYml0X3QgRm9yY2VQQ0lFX3VDX09jdDFNZW1vcnlQYXJpdHlFcnJbMV07CisJcHNldWRvX2JpdF90IEZvcmNlSUJfdUNfTWVtb3J5UGFyaXR5RXJyWzFdOworCXBzZXVkb19iaXRfdCBGb3JjZUREU1JYRVFNZW1vcnlQYXJpdHlFcnJbMV07CisJcHNldWRvX2JpdF90IEZvcmNlVHhNZW1wYXJpdHlFcnJbNF07CisJcHNldWRvX2JpdF90IEZvcmNlUnhNZW1QYXJpdHlFcnJbN107CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzldOworCXBzZXVkb19iaXRfdCBDb3VudGVyRGlzYWJsZVsxXTsKKwlwc2V1ZG9fYml0X3QgQ291bnRlcldyRW5hYmxlWzFdOworCXBzZXVkb19iaXRfdCBGb3JjZUlCQ0J1c1RvU1BDUGFyaXR5RXJyWzFdOworCXBzZXVkb19iaXRfdCBGb3JjZUlCQ0J1c0Zyb21TUENQYXJpdHlFcnJbMV07Cit9Oworc3RydWN0IFFJQl83MjIwX0h3RGlhZ0N0cmwgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX0h3RGlhZ0N0cmxfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUkVHXzAwMDBCOF9vZmZzZXQgMHgwMDAwMDBiOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfSUJDU3RhdHVzX29mZnNldCAweDAwMDAwMGMwVUwKK3N0cnVjdCBRSUJfNzIyMF9JQkNTdGF0dXNfcGIgeworCXBzZXVkb19iaXRfdCBMaW5rVHJhaW5pbmdTdGF0ZVs1XTsKKwlwc2V1ZG9fYml0X3QgTGlua1N0YXRlWzNdOworCXBzZXVkb19iaXRfdCBMaW5rU3BlZWRBY3RpdmVbMV07CisJcHNldWRvX2JpdF90IExpbmtXaWR0aEFjdGl2ZVsxXTsKKwlwc2V1ZG9fYml0X3QgRERTX1JYRVFfRkFJTFsxXTsKKwlwc2V1ZG9fYml0X3QgSUJfU0VSREVTX1RSSU1fRE9ORVsxXTsKKwlwc2V1ZG9fYml0X3QgSUJSeExhbmVSZXZlcnNlZFsxXTsKKwlwc2V1ZG9fYml0X3QgSUJUeExhbmVSZXZlcnNlZFsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworCXBzZXVkb19iaXRfdCBUeFJlYWR5WzFdOworCXBzZXVkb19iaXRfdCBUeENyZWRpdE9rWzFdOworCXBzZXVkb19iaXRfdCBfdW51c2VkXzBbMzJdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9JQkNTdGF0dXMgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX0lCQ1N0YXR1c19wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9JQkNDdHJsX29mZnNldCAweDAwMDAwMGM4VUwKK3N0cnVjdCBRSUJfNzIyMF9JQkNDdHJsX3BiIHsKKwlwc2V1ZG9fYml0X3QgRmxvd0N0cmxQZXJpb2RbOF07CisJcHNldWRvX2JpdF90IEZsb3dDdHJsV2F0ZXJNYXJrWzhdOworCXBzZXVkb19iaXRfdCBMaW5rSW5pdENtZFszXTsKKwlwc2V1ZG9fYml0X3QgTGlua0NtZFsyXTsKKwlwc2V1ZG9fYml0X3QgTWF4UGt0TGVuWzExXTsKKwlwc2V1ZG9fYml0X3QgUGh5ZXJyVGhyZXNob2xkWzRdOworCXBzZXVkb19iaXRfdCBPdmVycnVuVGhyZXNob2xkWzRdOworCXBzZXVkb19iaXRfdCBDcmVkaXRTY2FsZVszXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTldOworCXBzZXVkb19iaXRfdCBMaW5rRG93bkRlZmF1bHRTdGF0ZVsxXTsKKwlwc2V1ZG9fYml0X3QgTG9vcGJhY2tbMV07Cit9Oworc3RydWN0IFFJQl83MjIwX0lCQ0N0cmwgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX0lCQ0N0cmxfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfRVhUU3RhdHVzX29mZnNldCAweDAwMDAwMGQwVUwKK3N0cnVjdCBRSUJfNzIyMF9FWFRTdGF0dXNfcGIgeworCXBzZXVkb19iaXRfdCBSZXNlcnZlZDJbMTRdOworCXBzZXVkb19iaXRfdCBNZW1CSVNURW5kVGVzdFsxXTsKKwlwc2V1ZG9fYml0X3QgTWVtQklTVERpc2FibGVkWzFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZDFbMTZdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxNl07CisJcHNldWRvX2JpdF90IEdQSU9JblsxNl07Cit9Oworc3RydWN0IFFJQl83MjIwX0VYVFN0YXR1cyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfRVhUU3RhdHVzX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX0VYVEN0cmxfb2Zmc2V0IDB4MDAwMDAwZDhVTAorc3RydWN0IFFJQl83MjIwX0VYVEN0cmxfcGIgeworCXBzZXVkb19iaXRfdCBMRURHYmxFcnJSZWRPZmZbMV07CisJcHNldWRvX2JpdF90IExFREdibE9rR3JlZW5PblsxXTsKKwlwc2V1ZG9fYml0X3QgTEVEUHJpUG9ydFllbGxvd09uWzFdOworCXBzZXVkb19iaXRfdCBMRURQcmlQb3J0R3JlZW5PblsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMjhdOworCXBzZXVkb19iaXRfdCBHUElPSW52ZXJ0WzE2XTsKKwlwc2V1ZG9fYml0X3QgR1BJT09lWzE2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfRVhUQ3RybCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfRVhUQ3RybF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9HUElPT3V0X29mZnNldCAweDAwMDAwMGUwVUwKKworI2RlZmluZSBRSUJfNzIyMF9HUElPTWFza19vZmZzZXQgMHgwMDAwMDBlOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfR1BJT1N0YXR1c19vZmZzZXQgMHgwMDAwMDBmMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfR1BJT0NsZWFyX29mZnNldCAweDAwMDAwMGY4VUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZDdHJsX29mZnNldCAweDAwMDAwMTAwVUwKK3N0cnVjdCBRSUJfNzIyMF9SY3ZDdHJsX3BiIHsKKwlwc2V1ZG9fYml0X3QgUG9ydEVuYWJsZVsxN107CisJcHNldWRvX2JpdF90IEludHJBdmFpbFsxN107CisJcHNldWRvX2JpdF90IFJjdlBhcnRpdGlvbktleURpc2FibGVbMV07CisJcHNldWRvX2JpdF90IFRhaWxVcGRbMV07CisJcHNldWRvX2JpdF90IFBvcnRDZmdbMl07CisJcHNldWRvX2JpdF90IFJjdlFQTWFwRW5hYmxlWzFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsyNV07Cit9Oworc3RydWN0IFFJQl83MjIwX1JjdkN0cmwgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1JjdkN0cmxfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2QlRIUVBfb2Zmc2V0IDB4MDAwMDAxMDhVTAorc3RydWN0IFFJQl83MjIwX1JjdkJUSFFQX3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2QlRIUVBbMjRdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFs4XTsKKwlwc2V1ZG9fYml0X3QgX3VudXNlZF8wWzMyXTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfUmN2QlRIUVAgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1JjdkJUSFFQX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkclNpemVfb2Zmc2V0IDB4MDAwMDAxMTBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkckNudF9vZmZzZXQgMHgwMDAwMDExOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRyRW50U2l6ZV9vZmZzZXQgMHgwMDAwMDEyMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2VElEQmFzZV9vZmZzZXQgMHgwMDAwMDEyOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2VElEQ250X29mZnNldCAweDAwMDAwMTMwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JCYXNlX29mZnNldCAweDAwMDAwMTM4VUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JDbnRfb2Zmc2V0IDB4MDAwMDAxNDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkJ1ZkJhc2Vfb2Zmc2V0IDB4MDAwMDAxNDhVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkJ1ZlNpemVfb2Zmc2V0IDB4MDAwMDAxNTBVTAorCisjZGVmaW5lIFFJQl83MjIwX1J4SW50TWVtQmFzZV9vZmZzZXQgMHgwMDAwMDE1OFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUnhJbnRNZW1TaXplX29mZnNldCAweDAwMDAwMTYwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZQYXJ0aXRpb25LZXlfb2Zmc2V0IDB4MDAwMDAxNjhVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdlFQTXVsdGljYXN0UG9ydF9vZmZzZXQgMHgwMDAwMDE3MFVMCitzdHJ1Y3QgUUlCXzcyMjBfUmN2UVBNdWx0aWNhc3RQb3J0X3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2UXBNY1BvcnRbNV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzU5XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfUmN2UVBNdWx0aWNhc3RQb3J0IHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9SY3ZRUE11bHRpY2FzdFBvcnRfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2UGt0TEVEQ250X29mZnNldCAweDAwMDAwMTc4VUwKK3N0cnVjdCBRSUJfNzIyMF9SY3ZQa3RMRURDbnRfcGIgeworCXBzZXVkb19iaXRfdCBPRkZwZXJpb2RbMzJdOworCXBzZXVkb19iaXRfdCBPTnBlcmlvZFszMl07Cit9Oworc3RydWN0IFFJQl83MjIwX1JjdlBrdExFRENudCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfUmN2UGt0TEVEQ250X3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX0lCQ0REUkN0cmxfb2Zmc2V0IDB4MDAwMDAxODBVTAorc3RydWN0IFFJQl83MjIwX0lCQ0REUkN0cmxfcGIgeworCXBzZXVkb19iaXRfdCBJQl9FTkhBTkNFRF9NT0RFWzFdOworCXBzZXVkb19iaXRfdCBTRF9TUEVFRFsxXTsKKwlwc2V1ZG9fYml0X3QgU0RfU1BFRURfU0RSWzFdOworCXBzZXVkb19iaXRfdCBTRF9TUEVFRF9ERFJbMV07CisJcHNldWRvX2JpdF90IFNEX1NQRUVEX1FEUlsxXTsKKwlwc2V1ZG9fYml0X3QgSUJfTlVNX0NIQU5ORUxTWzJdOworCXBzZXVkb19iaXRfdCBJQl9QT0xBUklUWV9SRVZfU1VQUFsxXTsKKwlwc2V1ZG9fYml0X3QgSUJfTEFORV9SRVZfU1VQUE9SVEVEWzFdOworCXBzZXVkb19iaXRfdCBTRF9SWF9FUVVBTF9FTkFCTEVbMV07CisJcHNldWRvX2JpdF90IFNEX0FERF9FTkJbMV07CisJcHNldWRvX2JpdF90IFNEX0REU1ZbMV07CisJcHNldWRvX2JpdF90IFNEX0REU1s0XTsKKwlwc2V1ZG9fYml0X3QgSFJUQlRfRU5CWzFdOworCXBzZXVkb19iaXRfdCBIUlRCVF9BVVRPWzFdOworCXBzZXVkb19iaXRfdCBIUlRCVF9QT1JUWzhdOworCXBzZXVkb19iaXRfdCBIUlRCVF9SRVFbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzVdOworCXBzZXVkb19iaXRfdCBJQl9ETElEWzE2XTsKKwlwc2V1ZG9fYml0X3QgSUJfRExJRF9NQVNLWzE2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfSUJDRERSQ3RybCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfSUJDRERSQ3RybF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9IUlRCVF9HVUlEX29mZnNldCAweDAwMDAwMTg4VUwKKworI2RlZmluZSBRSUJfNzIyMF9JQl9TRFRFU1RfSUZfVFhfb2Zmc2V0IDB4MDAwMDAxOTBVTAorc3RydWN0IFFJQl83MjIwX0lCX1NEVEVTVF9JRl9UWF9wYiB7CisJcHNldWRvX2JpdF90IFRTX1RfVFhfVkFMSURbMV07CisJcHNldWRvX2JpdF90IFRTXzNfVFhfVkFMSURbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVs5XTsKKwlwc2V1ZG9fYml0X3QgVFNfVFhfT1BDT0RFWzJdOworCXBzZXVkb19iaXRfdCBUU19UWF9TUEVFRFszXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworCXBzZXVkb19iaXRfdCBUU19UWF9UWF9DRkdbMTZdOworCXBzZXVkb19iaXRfdCBUU19UWF9SWF9DRkdbMTZdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9JQl9TRFRFU1RfSUZfVFggeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX0lCX1NEVEVTVF9JRl9UWF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9JQl9TRFRFU1RfSUZfUlhfb2Zmc2V0IDB4MDAwMDAxOThVTAorc3RydWN0IFFJQl83MjIwX0lCX1NEVEVTVF9JRl9SWF9wYiB7CisJcHNldWRvX2JpdF90IFRTX1RfUlhfVkFMSURbMV07CisJcHNldWRvX2JpdF90IFRTXzNfUlhfVkFMSURbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzE0XTsKKwlwc2V1ZG9fYml0X3QgVFNfUlhfQVs4XTsKKwlwc2V1ZG9fYml0X3QgVFNfUlhfQls4XTsKKwlwc2V1ZG9fYml0X3QgVFNfUlhfVFhfQ0ZHWzE2XTsKKwlwc2V1ZG9fYml0X3QgVFNfUlhfUlhfQ0ZHWzE2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfSUJfU0RURVNUX0lGX1JYIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9JQl9TRFRFU1RfSUZfUlhfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfSUJDRERSQ3RybDJfb2Zmc2V0IDB4MDAwMDAxYTBVTAorc3RydWN0IFFJQl83MjIwX0lCQ0REUkN0cmwyX3BiIHsKKwlwc2V1ZG9fYml0X3QgSUJfRlJPTlRfUE9SQ0hbNV07CisJcHNldWRvX2JpdF90IElCX0JBQ0tfUE9SQ0hbNV07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFs1NF07Cit9Oworc3RydWN0IFFJQl83MjIwX0lCQ0REUkN0cmwyIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9JQkNERFJDdHJsMl9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9JQkNERFJTdGF0dXNfb2Zmc2V0IDB4MDAwMDAxYThVTAorc3RydWN0IFFJQl83MjIwX0lCQ0REUlN0YXR1c19wYiB7CisJcHNldWRvX2JpdF90IExpbmtSb3VuZFRyaXBMYXRlbmN5WzI2XTsKKwlwc2V1ZG9fYml0X3QgUmVxRERTTG9jYWxGcm9tUm10WzRdOworCXBzZXVkb19iaXRfdCBSeEVxTG9jYWxEZXZpY2VbMl07CisJcHNldWRvX2JpdF90IGhlYXJ0YmVhdF9jcm9zc3RhbGtbNF07CisJcHNldWRvX2JpdF90IGhlYXJ0YmVhdF90aW1lZF9vdXRbMV07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFsyN107Cit9Oworc3RydWN0IFFJQl83MjIwX0lCQ0REUlN0YXR1cyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfSUJDRERSU3RhdHVzX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX0pJbnRSZWxvYWRfb2Zmc2V0IDB4MDAwMDAxYjBVTAorc3RydWN0IFFJQl83MjIwX0pJbnRSZWxvYWRfcGIgeworCXBzZXVkb19iaXRfdCBKX3JlbG9hZFsxNl07CisJcHNldWRvX2JpdF90IEpfbGltaXRfcmVsb2FkWzE2XTsKKwlwc2V1ZG9fYml0X3QgX3VudXNlZF8wWzMyXTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfSkludFJlbG9hZCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfSkludFJlbG9hZF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9JQk5DTW9kZUN0cmxfb2Zmc2V0IDB4MDAwMDAxYjhVTAorc3RydWN0IFFJQl83MjIwX0lCTkNNb2RlQ3RybF9wYiB7CisJcHNldWRvX2JpdF90IFRTTUVuYWJsZV9zZW5kX1RTMVsxXTsKKwlwc2V1ZG9fYml0X3QgVFNNRW5hYmxlX3NlbmRfVFMyWzFdOworCXBzZXVkb19iaXRfdCBUU01FbmFibGVfaWdub3JlX1RTTV9vbl9yeFsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzVdOworCXBzZXVkb19iaXRfdCBUU01Db2RlX1RTMVs5XTsKKwlwc2V1ZG9fYml0X3QgVFNNQ29kZV9UUzJbOV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzM4XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfSUJOQ01vZGVDdHJsIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9JQk5DTW9kZUN0cmxfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfU2VuZEN0cmxfb2Zmc2V0IDB4MDAwMDAxYzBVTAorc3RydWN0IFFJQl83MjIwX1NlbmRDdHJsX3BiIHsKKwlwc2V1ZG9fYml0X3QgQWJvcnRbMV07CisJcHNldWRvX2JpdF90IFNlbmRJbnRCdWZBdmFpbFsxXTsKKwlwc2V1ZG9fYml0X3QgU2VuZEJ1ZkF2YWlsVXBkWzFdOworCXBzZXVkb19iaXRfdCBTUGlvRW5hYmxlWzFdOworCXBzZXVkb19iaXRfdCBTU3BlY2lhbFRyaWdnZXJFblsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQyWzRdOworCXBzZXVkb19iaXRfdCBTRG1hSW50RW5hYmxlWzFdOworCXBzZXVkb19iaXRfdCBTRG1hU2luZ2xlRGVzY3JpcHRvclsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYUVuYWJsZVsxXTsKKwlwc2V1ZG9fYml0X3QgU0RtYUhhbHRbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVszXTsKKwlwc2V1ZG9fYml0X3QgRGlzYXJtUElPQnVmWzhdOworCXBzZXVkb19iaXRfdCBBdmFpbFVwZFRobGRbNV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzJdOworCXBzZXVkb19iaXRfdCBEaXNhcm1bMV07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFszMl07Cit9Oworc3RydWN0IFFJQl83MjIwX1NlbmRDdHJsIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9TZW5kQ3RybF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9TZW5kQnVmQmFzZV9vZmZzZXQgMHgwMDAwMDFjOFVMCitzdHJ1Y3QgUUlCXzcyMjBfU2VuZEJ1ZkJhc2VfcGIgeworCXBzZXVkb19iaXRfdCBCYXNlQWRkcl9TbWFsbFBJT1syMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVsxMV07CisJcHNldWRvX2JpdF90IEJhc2VBZGRyX0xhcmdlUElPWzIxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTFdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9TZW5kQnVmQmFzZSB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfU2VuZEJ1ZkJhc2VfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfU2VuZEJ1ZlNpemVfb2Zmc2V0IDB4MDAwMDAxZDBVTAorc3RydWN0IFFJQl83MjIwX1NlbmRCdWZTaXplX3BiIHsKKwlwc2V1ZG9fYml0X3QgU2l6ZV9TbWFsbFBJT1sxMl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVsyMF07CisJcHNldWRvX2JpdF90IFNpemVfTGFyZ2VQSU9bMTNdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxOV07Cit9Oworc3RydWN0IFFJQl83MjIwX1NlbmRCdWZTaXplIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9TZW5kQnVmU2l6ZV9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9TZW5kQnVmQ250X29mZnNldCAweDAwMDAwMWQ4VUwKK3N0cnVjdCBRSUJfNzIyMF9TZW5kQnVmQ250X3BiIHsKKwlwc2V1ZG9fYml0X3QgTnVtX1NtYWxsQnVmZmVyc1s5XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzIzXTsKKwlwc2V1ZG9fYml0X3QgTnVtX0xhcmdlQnVmZmVyc1s0XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMjhdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9TZW5kQnVmQ250IHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9TZW5kQnVmQ250X3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1NlbmRCdWZBdmFpbEFkZHJfb2Zmc2V0IDB4MDAwMDAxZTBVTAorc3RydWN0IFFJQl83MjIwX1NlbmRCdWZBdmFpbEFkZHJfcGIgeworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFs2XTsKKwlwc2V1ZG9fYml0X3QgU2VuZEJ1ZkF2YWlsQWRkclszNF07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFsyNF07Cit9Oworc3RydWN0IFFJQl83MjIwX1NlbmRCdWZBdmFpbEFkZHIgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1NlbmRCdWZBdmFpbEFkZHJfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfVHhJbnRNZW1CYXNlX29mZnNldCAweDAwMDAwMWU4VUwKKworI2RlZmluZSBRSUJfNzIyMF9UeEludE1lbVNpemVfb2Zmc2V0IDB4MDAwMDAxZjBVTAorCisjZGVmaW5lIFFJQl83MjIwX1NlbmREbWFCYXNlX29mZnNldCAweDAwMDAwMWY4VUwKK3N0cnVjdCBRSUJfNzIyMF9TZW5kRG1hQmFzZV9wYiB7CisJcHNldWRvX2JpdF90IFNlbmREbWFCYXNlWzQ4XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9TZW5kRG1hQmFzZSB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYUJhc2VfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfU2VuZERtYUxlbkdlbl9vZmZzZXQgMHgwMDAwMDIwMFVMCitzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYUxlbkdlbl9wYiB7CisJcHNldWRvX2JpdF90IExlbmd0aFsxNl07CisJcHNldWRvX2JpdF90IEdlbmVyYXRpb25bM107CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzQ1XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYUxlbkdlbiB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYUxlbkdlbl9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9TZW5kRG1hVGFpbF9vZmZzZXQgMHgwMDAwMDIwOFVMCitzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYVRhaWxfcGIgeworCXBzZXVkb19iaXRfdCBTZW5kRG1hVGFpbFsxNl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzQ4XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYVRhaWwgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1NlbmREbWFUYWlsX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1NlbmREbWFIZWFkX29mZnNldCAweDAwMDAwMjEwVUwKK3N0cnVjdCBRSUJfNzIyMF9TZW5kRG1hSGVhZF9wYiB7CisJcHNldWRvX2JpdF90IFNlbmREbWFIZWFkWzE2XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzE2XTsKKwlwc2V1ZG9fYml0X3QgSW50ZXJuYWxTZW5kRG1hSGVhZFsxNl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzE2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYUhlYWQgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1NlbmREbWFIZWFkX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1NlbmREbWFIZWFkQWRkcl9vZmZzZXQgMHgwMDAwMDIxOFVMCitzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYUhlYWRBZGRyX3BiIHsKKwlwc2V1ZG9fYml0X3QgU2VuZERtYUhlYWRBZGRyWzQ4XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9TZW5kRG1hSGVhZEFkZHIgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1NlbmREbWFIZWFkQWRkcl9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9TZW5kRG1hQnVmTWFzazBfb2Zmc2V0IDB4MDAwMDAyMjBVTAorc3RydWN0IFFJQl83MjIwX1NlbmREbWFCdWZNYXNrMF9wYiB7CisJcHNldWRvX2JpdF90IEJ1Zk1hc2tfNjNfMFswXTsKKwlwc2V1ZG9fYml0X3QgX3VudXNlZF8wWzY0XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYUJ1Zk1hc2swIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9TZW5kRG1hQnVmTWFzazBfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfU2VuZERtYVN0YXR1c19vZmZzZXQgMHgwMDAwMDIzOFVMCitzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYVN0YXR1c19wYiB7CisJcHNldWRvX2JpdF90IFNwbEZpZm9EZXNjSW5kZXhbMTZdOworCXBzZXVkb19iaXRfdCBTcGxGaWZvQnVmTnVtWzhdOworCXBzZXVkb19iaXRfdCBTcGxGaWZvRnVsbFsxXTsKKwlwc2V1ZG9fYml0X3QgU3BsRmlmb0VtcHR5WzFdOworCXBzZXVkb19iaXRfdCBTcGxGaWZvRGlzYXJtZWRbMV07CisJcHNldWRvX2JpdF90IFNwbEZpZm9SZWFkeVRvR29bMV07CisJcHNldWRvX2JpdF90IFNjYkZldGNoRGVzY0ZsYWdbMV07CisJcHNldWRvX2JpdF90IFNjYkVudHJ5VmFsaWRbMV07CisJcHNldWRvX2JpdF90IFNjYkVtcHR5WzFdOworCXBzZXVkb19iaXRfdCBTY2JGdWxsWzFdOworCXBzZXVkb19iaXRfdCBScHlUYWdfN18wWzhdOworCXBzZXVkb19iaXRfdCBScHlMb3dBZGRyXzZfMFs3XTsKKwlwc2V1ZG9fYml0X3QgU2NiRGVzY0luZGV4XzEzXzBbMTRdOworCXBzZXVkb19iaXRfdCBJbnRlcm5hbFNEbWFFbmFibGVbMV07CisJcHNldWRvX2JpdF90IEFib3J0SW5Qcm9nWzFdOworCXBzZXVkb19iaXRfdCBTY29yZUJvYXJkRHJhaW5JblByb2dbMV07Cit9Oworc3RydWN0IFFJQl83MjIwX1NlbmREbWFTdGF0dXMgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1NlbmREbWFTdGF0dXNfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfU2VuZEJ1ZkVycjBfb2Zmc2V0IDB4MDAwMDAyNDBVTAorc3RydWN0IFFJQl83MjIwX1NlbmRCdWZFcnIwX3BiIHsKKwlwc2V1ZG9fYml0X3QgU2VuZEJ1ZkVycl82M18wWzBdOworCXBzZXVkb19iaXRfdCBfdW51c2VkXzBbNjRdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9TZW5kQnVmRXJyMCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfU2VuZEJ1ZkVycjBfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUkVHXzAwMDI1OF9vZmZzZXQgMHgwMDAwMDI1OFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfQXZhaWxVcGRDb3VudF9vZmZzZXQgMHgwMDAwMDI2OFVMCitzdHJ1Y3QgUUlCXzcyMjBfQXZhaWxVcGRDb3VudF9wYiB7CisJcHNldWRvX2JpdF90IEF2YWlsVXBkQ291bnRbNV07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFs1OV07Cit9Oworc3RydWN0IFFJQl83MjIwX0F2YWlsVXBkQ291bnQgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX0F2YWlsVXBkQ291bnRfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRyQWRkcjBfb2Zmc2V0IDB4MDAwMDAyNzBVTAorc3RydWN0IFFJQl83MjIwX1JjdkhkckFkZHIwX3BiIHsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMl07CisJcHNldWRvX2JpdF90IFJjdkhkckFkZHIwWzM4XTsKKwlwc2V1ZG9fYml0X3QgX3VudXNlZF8wWzI0XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRyQWRkcjAgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1JjdkhkckFkZHIwX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1JFR18wMDAyRjhfb2Zmc2V0IDB4MDAwMDAyZjhVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkclRhaWxBZGRyMF9vZmZzZXQgMHgwMDAwMDMwMFVMCitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRyVGFpbEFkZHIwX3BiIHsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMl07CisJcHNldWRvX2JpdF90IFJjdkhkclRhaWxBZGRyMFszOF07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFsyNF07Cit9Oworc3RydWN0IFFJQl83MjIwX1JjdkhkclRhaWxBZGRyMCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRyVGFpbEFkZHIwX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1JFR18wMDAzODhfb2Zmc2V0IDB4MDAwMDAzODhVTAorCisjZGVmaW5lIFFJQl83MjIwX2lic2RfZXBiX2FjY2Vzc19jdHJsX29mZnNldCAweDAwMDAwM2MwVUwKK3N0cnVjdCBRSUJfNzIyMF9pYnNkX2VwYl9hY2Nlc3NfY3RybF9wYiB7CisJcHNldWRvX2JpdF90IHN3X2liX2VwYl9yZXFbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzddOworCXBzZXVkb19iaXRfdCBzd19pYl9lcGJfcmVxX2dyYW50ZWRbMV07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFs1NV07Cit9Oworc3RydWN0IFFJQl83MjIwX2lic2RfZXBiX2FjY2Vzc19jdHJsIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9pYnNkX2VwYl9hY2Nlc3NfY3RybF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9pYnNkX2VwYl90cmFuc2FjdGlvbl9yZWdfb2Zmc2V0IDB4MDAwMDAzYzhVTAorc3RydWN0IFFJQl83MjIwX2lic2RfZXBiX3RyYW5zYWN0aW9uX3JlZ19wYiB7CisJcHNldWRvX2JpdF90IGliX2VwYl9kYXRhWzhdOworCXBzZXVkb19iaXRfdCBpYl9lcGJfYWRkcmVzc1sxNV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMlsxXTsKKwlwc2V1ZG9fYml0X3QgaWJfZXBiX3JlYWRfd3JpdGVbMV07CisJcHNldWRvX2JpdF90IGliX2VwYl9jc1syXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzFdOworCXBzZXVkb19iaXRfdCBtZW1fZGF0YV9wYXJpdHlbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzFdOworCXBzZXVkb19iaXRfdCBpYl9lcGJfcmVxX2Vycm9yWzFdOworCXBzZXVkb19iaXRfdCBpYl9lcGJfcmR5WzFdOworCXBzZXVkb19iaXRfdCBfdW51c2VkXzBbMzJdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9pYnNkX2VwYl90cmFuc2FjdGlvbl9yZWcgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX2lic2RfZXBiX3RyYW5zYWN0aW9uX3JlZ19wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9SRUdfMDAwM0QwX29mZnNldCAweDAwMDAwM2QwVUwKKworI2RlZmluZSBRSUJfNzIyMF9YR1hTQ2ZnX29mZnNldCAweDAwMDAwM2Q4VUwKK3N0cnVjdCBRSUJfNzIyMF9YR1hTQ2ZnX3BiIHsKKwlwc2V1ZG9fYml0X3QgdHhfcnhfcmVzZXRbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMlsxXTsKKwlwc2V1ZG9fYml0X3QgeGN2X3Jlc2V0WzFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZDFbNl07CisJcHNldWRvX2JpdF90IGxpbmtfc3luY19tYXNrWzEwXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbNDRdOworCXBzZXVkb19iaXRfdCBzZWxfbGlua19kb3duX2Zvcl9mY3RybF9sYW5lX3N5bmNfcmVzZXRbMV07Cit9Oworc3RydWN0IFFJQl83MjIwX1hHWFNDZmcgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1hHWFNDZmdfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfSUJTZXJEZXNDdHJsX29mZnNldCAweDAwMDAwM2UwVUwKK3N0cnVjdCBRSUJfNzIyMF9JQlNlckRlc0N0cmxfcGIgeworCXBzZXVkb19iaXRfdCBSZXNldElCX3VDX0NvcmVbMV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMls3XTsKKwlwc2V1ZG9fYml0X3QgTnVtU2VyRGVzUmVnc1RvV3JGb3JERFNbNV07CisJcHNldWRvX2JpdF90IE51bVNlckRlc1JlZ3NUb1dyRm9yUlhFUVs1XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWQxWzE0XTsKKwlwc2V1ZG9fYml0X3QgVFhJTlZbMV07CisJcHNldWRvX2JpdF90IFJYSU5WWzFdOworCXBzZXVkb19iaXRfdCBSWElETEVbMV07CisJcHNldWRvX2JpdF90IFRXQ1sxXTsKKwlwc2V1ZG9fYml0X3QgVFhPQlBEWzFdOworCXBzZXVkb19iaXRfdCBQTExNWzNdOworCXBzZXVkb19iaXRfdCBQTExOWzJdOworCXBzZXVkb19iaXRfdCBDS1NFTF91Q1syXTsKKwlwc2V1ZG9fYml0X3QgSU5UX3VDWzFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxOV07Cit9Oworc3RydWN0IFFJQl83MjIwX0lCU2VyRGVzQ3RybCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfSUJTZXJEZXNDdHJsX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX0VFUEN0bFN0YXRfb2Zmc2V0IDB4MDAwMDAzZThVTAorc3RydWN0IFFJQl83MjIwX0VFUEN0bFN0YXRfcGIgeworCXBzZXVkb19iaXRfdCBFUEFjY0VuWzJdOworCXBzZXVkb19iaXRfdCBFUFJlc2V0WzFdOworCXBzZXVkb19iaXRfdCBCeXRlUHJvZ1sxXTsKKwlwc2V1ZG9fYml0X3QgUGFnZU1vZGVbMV07CisJcHNldWRvX2JpdF90IExzdERhdFdyWzFdOworCXBzZXVkb19iaXRfdCBDbWRXckVyclsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMjRdOworCXBzZXVkb19iaXRfdCBDdGxyU3RhdFsxXTsKKwlwc2V1ZG9fYml0X3QgX3VudXNlZF8wWzMyXTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfRUVQQ3RsU3RhdCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfRUVQQ3RsU3RhdF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9FRVBBZGRyQ21kX29mZnNldCAweDAwMDAwM2YwVUwKK3N0cnVjdCBRSUJfNzIyMF9FRVBBZGRyQ21kX3BiIHsKKwlwc2V1ZG9fYml0X3QgRVBBZGRyWzI0XTsKKwlwc2V1ZG9fYml0X3QgRVBDbWRbOF07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFszMl07Cit9Oworc3RydWN0IFFJQl83MjIwX0VFUEFkZHJDbWQgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX0VFUEFkZHJDbWRfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfRUVQRGF0YV9vZmZzZXQgMHgwMDAwMDNmOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfcGNpZXNkX2VwYl9hY2Nlc3NfY3RybF9vZmZzZXQgMHgwMDAwMDQwMFVMCitzdHJ1Y3QgUUlCXzcyMjBfcGNpZXNkX2VwYl9hY2Nlc3NfY3RybF9wYiB7CisJcHNldWRvX2JpdF90IHN3X3BjaWVfZXBiX3JlcVsxXTsKKwlwc2V1ZG9fYml0X3Qgc3dfcGNpZWVwYl9zdGFyX2VuWzJdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFs1XTsKKwlwc2V1ZG9fYml0X3Qgc3dfcGNpZV9lcGJfcmVxX2dyYW50ZWRbMV07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFs1NV07Cit9Oworc3RydWN0IFFJQl83MjIwX3BjaWVzZF9lcGJfYWNjZXNzX2N0cmwgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX3BjaWVzZF9lcGJfYWNjZXNzX2N0cmxfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfcGNpZXNkX2VwYl90cmFuc2FjdGlvbl9yZWdfb2Zmc2V0IDB4MDAwMDA0MDhVTAorc3RydWN0IFFJQl83MjIwX3BjaWVzZF9lcGJfdHJhbnNhY3Rpb25fcmVnX3BiIHsKKwlwc2V1ZG9fYml0X3QgcGNpZV9lcGJfZGF0YVs4XTsKKwlwc2V1ZG9fYml0X3QgcGNpZV9lcGJfYWRkcmVzc1sxNV07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVsxXTsKKwlwc2V1ZG9fYml0X3QgcGNpZV9lcGJfcmVhZF93cml0ZVsxXTsKKwlwc2V1ZG9fYml0X3QgcGNpZV9lcGJfY3NbM107CisJcHNldWRvX2JpdF90IG1lbV9kYXRhX3Bhcml0eVsxXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMV07CisJcHNldWRvX2JpdF90IHBjaWVfZXBiX3JlcV9lcnJvclsxXTsKKwlwc2V1ZG9fYml0X3QgcGNpZV9lcGJfcmR5WzFdOworCXBzZXVkb19iaXRfdCBfdW51c2VkXzBbMzJdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9wY2llc2RfZXBiX3RyYW5zYWN0aW9uX3JlZyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfcGNpZXNkX2VwYl90cmFuc2FjdGlvbl9yZWdfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfZWZ1c2VfY29udHJvbF9yZWdfb2Zmc2V0IDB4MDAwMDA0MTBVTAorc3RydWN0IFFJQl83MjIwX2VmdXNlX2NvbnRyb2xfcmVnX3BiIHsKKwlwc2V1ZG9fYml0X3Qgc3RhcnRfb3BbMV07CisJcHNldWRvX2JpdF90IG9wZXJhdGlvblsxXTsKKwlwc2V1ZG9fYml0X3QgcmVhZF92YWxpZFsxXTsKKwlwc2V1ZG9fYml0X3QgcmVxX2Vycm9yWzFdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsyN107CisJcHNldWRvX2JpdF90IHJkeVsxXTsKKwlwc2V1ZG9fYml0X3QgX3VudXNlZF8wWzMyXTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfZWZ1c2VfY29udHJvbF9yZWcgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX2VmdXNlX2NvbnRyb2xfcmVnX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX2VmdXNlX3JkZGF0YTBfcmVnX29mZnNldCAweDAwMDAwNDE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9wcm9jbW9uX3JlZ2lzdGVyX29mZnNldCAweDAwMDAwNDM4VUwKK3N0cnVjdCBRSUJfNzIyMF9wcm9jbW9uX3JlZ2lzdGVyX3BiIHsKKwlwc2V1ZG9fYml0X3QgaW50ZXJ2YWxfdGltZVsxMl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkMVsyXTsKKwlwc2V1ZG9fYml0X3QgY2xlYXJfY291bnRlclsxXTsKKwlwc2V1ZG9fYml0X3Qgc3RhcnRfY291bnRlclsxXTsKKwlwc2V1ZG9fYml0X3QgcHJvY21vbl9jb3VudFs5XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbNl07CisJcHNldWRvX2JpdF90IHByb2Ntb25fY291bnRfdmFsaWRbMV07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFszMl07Cit9Oworc3RydWN0IFFJQl83MjIwX3Byb2Ntb25fcmVnaXN0ZXIgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX3Byb2Ntb25fcmVnaXN0ZXJfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUGNpZVJidWZUZXN0UmVnMF9vZmZzZXQgMHgwMDAwMDQ0MFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUGNpZVJCdWZUZXN0UmVnMV9vZmZzZXQgMHgwMDAwMDQ0OFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfU1BDX0pUQUdfQUNDRVNTX1JFR19vZmZzZXQgMHgwMDAwMDQ2MFVMCitzdHJ1Y3QgUUlCXzcyMjBfU1BDX0pUQUdfQUNDRVNTX1JFR19wYiB7CisJcHNldWRvX2JpdF90IHJkeVsxXTsKKwlwc2V1ZG9fYml0X3QgdGRvWzFdOworCXBzZXVkb19iaXRfdCB0ZGlbMV07CisJcHNldWRvX2JpdF90IG9wY29kZVsyXTsKKwlwc2V1ZG9fYml0X3QgYmlzdF9lbls1XTsKKwlwc2V1ZG9fYml0X3QgU1BDX0pUQUdfQUNDRVNTX0VOWzFdOworCXBzZXVkb19iaXRfdCBfdW51c2VkXzBbNTNdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9TUENfSlRBR19BQ0NFU1NfUkVHIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9TUENfSlRBR19BQ0NFU1NfUkVHX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX0xBQ29udHJvbFJlZ19vZmZzZXQgMHgwMDAwMDQ2OFVMCitzdHJ1Y3QgUUlCXzcyMjBfTEFDb250cm9sUmVnX3BiIHsKKwlwc2V1ZG9fYml0X3QgRmluaXNoZWRbMV07CisJcHNldWRvX2JpdF90IEFkZHJlc3NbOF07CisJcHNldWRvX2JpdF90IE1vZGVbMl07CisJcHNldWRvX2JpdF90IERlbGF5WzIwXTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMV07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFszMl07Cit9Oworc3RydWN0IFFJQl83MjIwX0xBQ29udHJvbFJlZyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfTEFDb250cm9sUmVnX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX0dQSU9EZWJ1Z1NlbFJlZ19vZmZzZXQgMHgwMDAwMDQ3MFVMCitzdHJ1Y3QgUUlCXzcyMjBfR1BJT0RlYnVnU2VsUmVnX3BiIHsKKwlwc2V1ZG9fYml0X3QgR1BJT1NvdXJjZVNlbERlYnVnWzE2XTsKKwlwc2V1ZG9fYml0X3QgU2VsUHVsc2VbMTZdOworCXBzZXVkb19iaXRfdCBfdW51c2VkXzBbMzJdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9HUElPRGVidWdTZWxSZWcgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX0dQSU9EZWJ1Z1NlbFJlZ19wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9EZWJ1Z1BvcnRWYWx1ZVJlZ19vZmZzZXQgMHgwMDAwMDQ3OFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfU2VuZERtYUJ1ZlVzZWQwX29mZnNldCAweDAwMDAwNDgwVUwKK3N0cnVjdCBRSUJfNzIyMF9TZW5kRG1hQnVmVXNlZDBfcGIgeworCXBzZXVkb19iaXRfdCBCdWZVc2VkXzYzXzBbMF07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFs2NF07Cit9Oworc3RydWN0IFFJQl83MjIwX1NlbmREbWFCdWZVc2VkMCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYUJ1ZlVzZWQwX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1NlbmREbWFSZXFUYWdVc2VkX29mZnNldCAweDAwMDAwNDk4VUwKK3N0cnVjdCBRSUJfNzIyMF9TZW5kRG1hUmVxVGFnVXNlZF9wYiB7CisJcHNldWRvX2JpdF90IFJlcVRhZ1VzZWRfN18wWzhdOworCXBzZXVkb19iaXRfdCBfdW51c2VkXzBbOF07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzQ4XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfU2VuZERtYVJlcVRhZ1VzZWQgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1NlbmREbWFSZXFUYWdVc2VkX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX2VmdXNlX3BnbV9kYXRhMF9vZmZzZXQgMHgwMDAwMDRhMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzAwMDRCMF9vZmZzZXQgMHgwMDAwMDRiMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfU2VyRGVzX0REU1JYRVEwX29mZnNldCAweDAwMDAwNTAwVUwKK3N0cnVjdCBRSUJfNzIyMF9TZXJEZXNfRERTUlhFUTBfcGIgeworCXBzZXVkb19iaXRfdCBlbGVtZW50X251bVs0XTsKKwlwc2V1ZG9fYml0X3QgcmVnX2FkZHJbNl07CisJcHNldWRvX2JpdF90IF91bnVzZWRfMFs1NF07Cit9Oworc3RydWN0IFFJQl83MjIwX1NlckRlc19ERFNSWEVRMCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfU2VyRGVzX0REU1JYRVEwX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX01FTV8wMDA1RjBfb2Zmc2V0IDB4MDAwMDA1ZjBVTAorCisjZGVmaW5lIFFJQl83MjIwX0xBTWVtb3J5X29mZnNldCAweDAwMDAwNjAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMDAwN0YwX29mZnNldCAweDAwMDAwN2YwVUwKKworI2RlZmluZSBRSUJfNzIyMF9TZW5kQnVmQXZhaWwwX29mZnNldCAweDAwMDAxMDAwVUwKK3N0cnVjdCBRSUJfNzIyMF9TZW5kQnVmQXZhaWwwX3BiIHsKKwlwc2V1ZG9fYml0X3QgU2VuZEJ1Zl8zMV8wWzBdOworCXBzZXVkb19iaXRfdCBfdW51c2VkXzBbNjRdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9TZW5kQnVmQXZhaWwwIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9TZW5kQnVmQXZhaWwwX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX01FTV8wMDEwMjhfb2Zmc2V0IDB4MDAwMDEwMjhVTAorCisjZGVmaW5lIFFJQl83MjIwX0xCSW50Q250X29mZnNldCAweDAwMDEzMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9MQkZsb3dTdGFsbENudF9vZmZzZXQgMHgwMDAxMzAwOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfVHhTRG1hRGVzY0NudF9vZmZzZXQgMHgwMDAxMzAxMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfVHhVbnN1cFZMRXJyQ250X29mZnNldCAweDAwMDEzMDE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9UeERhdGFQa3RDbnRfb2Zmc2V0IDB4MDAwMTMwMjBVTAorCisjZGVmaW5lIFFJQl83MjIwX1R4Rmxvd1BrdENudF9vZmZzZXQgMHgwMDAxMzAyOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfVHhEd29yZENudF9vZmZzZXQgMHgwMDAxMzAzMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfVHhMZW5FcnJDbnRfb2Zmc2V0IDB4MDAwMTMwMzhVTAorCisjZGVmaW5lIFFJQl83MjIwX1R4TWF4TWluTGVuRXJyQ250X29mZnNldCAweDAwMDEzMDQwVUwKKworI2RlZmluZSBRSUJfNzIyMF9UeFVuZGVycnVuQ250X29mZnNldCAweDAwMDEzMDQ4VUwKKworI2RlZmluZSBRSUJfNzIyMF9UeEZsb3dTdGFsbENudF9vZmZzZXQgMHgwMDAxMzA1MFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfVHhEcm9wcGVkUGt0Q250X29mZnNldCAweDAwMDEzMDU4VUwKKworI2RlZmluZSBRSUJfNzIyMF9SeERyb3BwZWRQa3RDbnRfb2Zmc2V0IDB4MDAwMTMwNjBVTAorCisjZGVmaW5lIFFJQl83MjIwX1J4RGF0YVBrdENudF9vZmZzZXQgMHgwMDAxMzA2OFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUnhGbG93UGt0Q250X29mZnNldCAweDAwMDEzMDcwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SeER3b3JkQ250X29mZnNldCAweDAwMDEzMDc4VUwKKworI2RlZmluZSBRSUJfNzIyMF9SeExlbkVyckNudF9vZmZzZXQgMHgwMDAxMzA4MFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUnhNYXhNaW5MZW5FcnJDbnRfb2Zmc2V0IDB4MDAwMTMwODhVTAorCisjZGVmaW5lIFFJQl83MjIwX1J4SUNSQ0VyckNudF9vZmZzZXQgMHgwMDAxMzA5MFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUnhWQ1JDRXJyQ250X29mZnNldCAweDAwMDEzMDk4VUwKKworI2RlZmluZSBRSUJfNzIyMF9SeEZsb3dDdHJsVmlvbENudF9vZmZzZXQgMHgwMDAxMzBhMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUnhWZXJzaW9uRXJyQ250X29mZnNldCAweDAwMDEzMGE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9SeExpbmtNYWxmb3JtQ250X29mZnNldCAweDAwMDEzMGIwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SeEVCUENudF9vZmZzZXQgMHgwMDAxMzBiOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUnhMUENSQ0VyckNudF9vZmZzZXQgMHgwMDAxMzBjMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUnhCdWZPdmZsQ250X29mZnNldCAweDAwMDEzMGM4VUwKKworI2RlZmluZSBRSUJfNzIyMF9SeFRJREZ1bGxFcnJDbnRfb2Zmc2V0IDB4MDAwMTMwZDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1J4VElEVmFsaWRFcnJDbnRfb2Zmc2V0IDB4MDAwMTMwZDhVTAorCisjZGVmaW5lIFFJQl83MjIwX1J4UEtleU1pc21hdGNoQ250X29mZnNldCAweDAwMDEzMGUwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SeFAwSGRyRWdyT3ZmbENudF9vZmZzZXQgMHgwMDAxMzBlOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfSUJTdGF0dXNDaGFuZ2VDbnRfb2Zmc2V0IDB4MDAwMTMxNzBVTAorCisjZGVmaW5lIFFJQl83MjIwX0lCTGlua0VyclJlY292ZXJ5Q250X29mZnNldCAweDAwMDEzMTc4VUwKKworI2RlZmluZSBRSUJfNzIyMF9JQkxpbmtEb3duZWRDbnRfb2Zmc2V0IDB4MDAwMTMxODBVTAorCisjZGVmaW5lIFFJQl83MjIwX0lCU3ltYm9sRXJyQ250X29mZnNldCAweDAwMDEzMTg4VUwKKworI2RlZmluZSBRSUJfNzIyMF9SeFZMMTVEcm9wcGVkUGt0Q250X29mZnNldCAweDAwMDEzMTkwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SeE90aGVyTG9jYWxQaHlFcnJDbnRfb2Zmc2V0IDB4MDAwMTMxOThVTAorCisjZGVmaW5lIFFJQl83MjIwX1BjaWVSZXRyeUJ1ZkRpYWdRd29yZENudF9vZmZzZXQgMHgwMDAxMzFhMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfRXhjZXNzQnVmZmVyT3ZmbENudF9vZmZzZXQgMHgwMDAxMzFhOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTG9jYWxMaW5rSW50ZWdyaXR5RXJyQ250X29mZnNldCAweDAwMDEzMWIwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SeFZsRXJyQ250X29mZnNldCAweDAwMDEzMWI4VUwKKworI2RlZmluZSBRSUJfNzIyMF9SeERsaWRGbHRyQ250X29mZnNldCAweDAwMDEzMWMwVUwKKworI2RlZmluZSBRSUJfNzIyMF9DTlRfMDEzMUM4X29mZnNldCAweDAwMDEzMWM4VUwKKworI2RlZmluZSBRSUJfNzIyMF9QU1N0YXRfb2Zmc2V0IDB4MDAwMTMyMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1BTU3RhcnRfb2Zmc2V0IDB4MDAwMTMyMDhVTAorCisjZGVmaW5lIFFJQl83MjIwX1BTSW50ZXJ2YWxfb2Zmc2V0IDB4MDAwMTMyMTBVTAorCisjZGVmaW5lIFFJQl83MjIwX1BTUmN2RGF0YUNvdW50X29mZnNldCAweDAwMDEzMjE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9QU1JjdlBrdHNDb3VudF9vZmZzZXQgMHgwMDAxMzIyMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUFNYbWl0RGF0YUNvdW50X29mZnNldCAweDAwMDEzMjI4VUwKKworI2RlZmluZSBRSUJfNzIyMF9QU1htaXRQa3RzQ291bnRfb2Zmc2V0IDB4MDAwMTMyMzBVTAorCisjZGVmaW5lIFFJQl83MjIwX1BTWG1pdFdhaXRDb3VudF9vZmZzZXQgMHgwMDAxMzIzOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfQ05UXzAxMzI0MF9vZmZzZXQgMHgwMDAxMzI0MFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdyQXJyYXlfb2Zmc2V0IDB4MDAwMTQwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8wMzgwMDBfb2Zmc2V0IDB4MDAwMzgwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdlRJREFycmF5MF9vZmZzZXQgMHgwMDA1MzAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUElPTGF1bmNoRklGT19vZmZzZXQgMHgwMDA2NDAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzA2NDQ4MF9vZmZzZXQgMHgwMDA2NDQ4MFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfU2VuZFBJT3BiY0NhY2hlX29mZnNldCAweDAwMDY0ODAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMDY0QzgwX29mZnNldCAweDAwMDY0YzgwVUwKKworI2RlZmluZSBRSUJfNzIyMF9QcmVMYXVuY2hGSUZPX29mZnNldCAweDAwMDY1MDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMDY1MDgwX29mZnNldCAweDAwMDY1MDgwVUwKKworI2RlZmluZSBRSUJfNzIyMF9TY29yZUJvYXJkX29mZnNldCAweDAwMDY1NDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMDY1NDQwX29mZnNldCAweDAwMDY1NDQwVUwKKworI2RlZmluZSBRSUJfNzIyMF9EZXNjcmlwdG9yRklGT19vZmZzZXQgMHgwMDA2NTgwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzA2NTg4MF9vZmZzZXQgMHgwMDA2NTg4MFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2QnVmMV9vZmZzZXQgMHgwMDA3MjAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzA3NDgwMF9vZmZzZXQgMHgwMDA3NDgwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2QnVmMl9vZmZzZXQgMHgwMDA3NTAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzA3NjQwMF9vZmZzZXQgMHgwMDA3NjQwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RmxhZ3Nfb2Zmc2V0IDB4MDAwNzcwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8wNzg0MDBfb2Zmc2V0IDB4MDAwNzg0MDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1Jjdkxvb2t1cEJ1ZjFfb2Zmc2V0IDB4MDAwNzkwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8wN0E0MDBfb2Zmc2V0IDB4MDAwN2E0MDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkRNQURhdEJ1Zl9vZmZzZXQgMHgwMDA3YjAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RE1BSGRyQnVmX29mZnNldCAweDAwMDdiODAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9NaXNjUlhFSW50TWVtX29mZnNldCAweDAwMDdjMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMDdENDAwX29mZnNldCAweDAwMDdkNDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9QQ0lFUmN2QnVmX29mZnNldCAweDAwMDgwMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9QQ0lFUmV0cnlCdWZfb2Zmc2V0IDB4MDAwODQwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1BDSUVSY3ZCdWZSZFRvV3JBZGRyX29mZnNldCAweDAwMDg4MDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9QQ0lFQ3BsQnVmX29mZnNldCAweDAwMDkwMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9JQlNlckRlc01hcHBUYWJsZV9vZmZzZXQgMHgwMDA5NDAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzA5NTAwMF9vZmZzZXQgMHgwMDA5NTAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfU2VuZEJ1ZjBfTUFfb2Zmc2V0IDB4MDAxMDAwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8xQTAwMDBfb2Zmc2V0IDB4MDAxYTAwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkclRhaWwwX29mZnNldCAweDAwMjAwMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJIZWFkMF9vZmZzZXQgMHgwMDIwMDAwOFVMCitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDBfcGIgeworCXBzZXVkb19iaXRfdCBSY3ZIZWFkUG9pbnRlclszMl07CisJcHNldWRvX2JpdF90IGNvdW50ZXJbMTZdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxNl07Cit9Oworc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQwIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleFRhaWwwX29mZnNldCAweDAwMjAwMDEwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleEhlYWQwX29mZnNldCAweDAwMjAwMDE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMjAwMDIwX29mZnNldCAweDAwMjAwMDIwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJUYWlsMV9vZmZzZXQgMHgwMDIxMDAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRySGVhZDFfb2Zmc2V0IDB4MDAyMTAwMDhVTAorc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQxX3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2SGVhZFBvaW50ZXJbMzJdOworCXBzZXVkb19iaXRfdCBjb3VudGVyWzE2XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMSB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDFfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhUYWlsMV9vZmZzZXQgMHgwMDIxMDAxMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhIZWFkMV9vZmZzZXQgMHgwMDIxMDAxOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzIxMDAyMF9vZmZzZXQgMHgwMDIxMDAyMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRyVGFpbDJfb2Zmc2V0IDB4MDAyMjAwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkckhlYWQyX29mZnNldCAweDAwMjIwMDA4VUwKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMl9wYiB7CisJcHNldWRvX2JpdF90IFJjdkhlYWRQb2ludGVyWzMyXTsKKwlwc2V1ZG9fYml0X3QgY291bnRlclsxNl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzE2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDIgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQyX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4VGFpbDJfb2Zmc2V0IDB4MDAyMjAwMTBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4SGVhZDJfb2Zmc2V0IDB4MDAyMjAwMThVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8yMjAwMjBfb2Zmc2V0IDB4MDAyMjAwMjBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkclRhaWwzX29mZnNldCAweDAwMjMwMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJIZWFkM19vZmZzZXQgMHgwMDIzMDAwOFVMCitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDNfcGIgeworCXBzZXVkb19iaXRfdCBSY3ZIZWFkUG9pbnRlclszMl07CisJcHNldWRvX2JpdF90IGNvdW50ZXJbMTZdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxNl07Cit9Oworc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQzIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkM19wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleFRhaWwzX29mZnNldCAweDAwMjMwMDEwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleEhlYWQzX29mZnNldCAweDAwMjMwMDE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMjMwMDIwX29mZnNldCAweDAwMjMwMDIwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJUYWlsNF9vZmZzZXQgMHgwMDI0MDAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRySGVhZDRfb2Zmc2V0IDB4MDAyNDAwMDhVTAorc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQ0X3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2SGVhZFBvaW50ZXJbMzJdOworCXBzZXVkb19iaXRfdCBjb3VudGVyWzE2XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkNCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDRfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhUYWlsNF9vZmZzZXQgMHgwMDI0MDAxMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhIZWFkNF9vZmZzZXQgMHgwMDI0MDAxOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzI0MDAyMF9vZmZzZXQgMHgwMDI0MDAyMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRyVGFpbDVfb2Zmc2V0IDB4MDAyNTAwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkckhlYWQ1X29mZnNldCAweDAwMjUwMDA4VUwKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkNV9wYiB7CisJcHNldWRvX2JpdF90IFJjdkhlYWRQb2ludGVyWzMyXTsKKwlwc2V1ZG9fYml0X3QgY291bnRlclsxNl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzE2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDUgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQ1X3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4VGFpbDVfb2Zmc2V0IDB4MDAyNTAwMTBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4SGVhZDVfb2Zmc2V0IDB4MDAyNTAwMThVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8yNTAwMjBfb2Zmc2V0IDB4MDAyNTAwMjBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkclRhaWw2X29mZnNldCAweDAwMjYwMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJIZWFkNl9vZmZzZXQgMHgwMDI2MDAwOFVMCitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDZfcGIgeworCXBzZXVkb19iaXRfdCBSY3ZIZWFkUG9pbnRlclszMl07CisJcHNldWRvX2JpdF90IGNvdW50ZXJbMTZdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxNl07Cit9Oworc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQ2IHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkNl9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleFRhaWw2X29mZnNldCAweDAwMjYwMDEwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleEhlYWQ2X29mZnNldCAweDAwMjYwMDE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMjYwMDIwX29mZnNldCAweDAwMjYwMDIwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJUYWlsN19vZmZzZXQgMHgwMDI3MDAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRySGVhZDdfb2Zmc2V0IDB4MDAyNzAwMDhVTAorc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQ3X3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2SGVhZFBvaW50ZXJbMzJdOworCXBzZXVkb19iaXRfdCBjb3VudGVyWzE2XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkNyB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDdfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhUYWlsN19vZmZzZXQgMHgwMDI3MDAxMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhIZWFkN19vZmZzZXQgMHgwMDI3MDAxOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzI3MDAyMF9vZmZzZXQgMHgwMDI3MDAyMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRyVGFpbDhfb2Zmc2V0IDB4MDAyODAwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkckhlYWQ4X29mZnNldCAweDAwMjgwMDA4VUwKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkOF9wYiB7CisJcHNldWRvX2JpdF90IFJjdkhlYWRQb2ludGVyWzMyXTsKKwlwc2V1ZG9fYml0X3QgY291bnRlclsxNl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzE2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDggeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQ4X3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4VGFpbDhfb2Zmc2V0IDB4MDAyODAwMTBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4SGVhZDhfb2Zmc2V0IDB4MDAyODAwMThVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8yODAwMjBfb2Zmc2V0IDB4MDAyODAwMjBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkclRhaWw5X29mZnNldCAweDAwMjkwMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJIZWFkOV9vZmZzZXQgMHgwMDI5MDAwOFVMCitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDlfcGIgeworCXBzZXVkb19iaXRfdCBSY3ZIZWFkUG9pbnRlclszMl07CisJcHNldWRvX2JpdF90IGNvdW50ZXJbMTZdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxNl07Cit9Oworc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQ5IHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkOV9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleFRhaWw5X29mZnNldCAweDAwMjkwMDEwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleEhlYWQ5X29mZnNldCAweDAwMjkwMDE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMjkwMDIwX29mZnNldCAweDAwMjkwMDIwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJUYWlsMTBfb2Zmc2V0IDB4MDAyYTAwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkckhlYWQxMF9vZmZzZXQgMHgwMDJhMDAwOFVMCitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDEwX3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2SGVhZFBvaW50ZXJbMzJdOworCXBzZXVkb19iaXRfdCBjb3VudGVyWzE2XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMTAgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQxMF9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleFRhaWwxMF9vZmZzZXQgMHgwMDJhMDAxMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhIZWFkMTBfb2Zmc2V0IDB4MDAyYTAwMThVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8yQTAwMjBfb2Zmc2V0IDB4MDAyYTAwMjBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkclRhaWwxMV9vZmZzZXQgMHgwMDJiMDAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRySGVhZDExX29mZnNldCAweDAwMmIwMDA4VUwKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMTFfcGIgeworCXBzZXVkb19iaXRfdCBSY3ZIZWFkUG9pbnRlclszMl07CisJcHNldWRvX2JpdF90IGNvdW50ZXJbMTZdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxNl07Cit9Oworc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQxMSB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDExX3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4VGFpbDExX29mZnNldCAweDAwMmIwMDEwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleEhlYWQxMV9vZmZzZXQgMHgwMDJiMDAxOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzJCMDAyMF9vZmZzZXQgMHgwMDJiMDAyMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRyVGFpbDEyX29mZnNldCAweDAwMmMwMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJIZWFkMTJfb2Zmc2V0IDB4MDAyYzAwMDhVTAorc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQxMl9wYiB7CisJcHNldWRvX2JpdF90IFJjdkhlYWRQb2ludGVyWzMyXTsKKwlwc2V1ZG9fYml0X3QgY291bnRlclsxNl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzE2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDEyIHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMTJfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhUYWlsMTJfb2Zmc2V0IDB4MDAyYzAwMTBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4SGVhZDEyX29mZnNldCAweDAwMmMwMDE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMkMwMDIwX29mZnNldCAweDAwMmMwMDIwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJUYWlsMTNfb2Zmc2V0IDB4MDAyZDAwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkckhlYWQxM19vZmZzZXQgMHgwMDJkMDAwOFVMCitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDEzX3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2SGVhZFBvaW50ZXJbMzJdOworCXBzZXVkb19iaXRfdCBjb3VudGVyWzE2XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMTMgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQxM19wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleFRhaWwxM19vZmZzZXQgMHgwMDJkMDAxMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhIZWFkMTNfb2Zmc2V0IDB4MDAyZDAwMThVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8yRDAwMjBfb2Zmc2V0IDB4MDAyZDAwMjBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkclRhaWwxNF9vZmZzZXQgMHgwMDJlMDAwMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRySGVhZDE0X29mZnNldCAweDAwMmUwMDA4VUwKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMTRfcGIgeworCXBzZXVkb19iaXRfdCBSY3ZIZWFkUG9pbnRlclszMl07CisJcHNldWRvX2JpdF90IGNvdW50ZXJbMTZdOworCXBzZXVkb19iaXRfdCBSZXNlcnZlZFsxNl07Cit9Oworc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQxNCB7CisJUFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDE0X3BiICk7Cit9OworCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4VGFpbDE0X29mZnNldCAweDAwMmUwMDEwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleEhlYWQxNF9vZmZzZXQgMHgwMDJlMDAxOFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfTUVNXzJFMDAyMF9vZmZzZXQgMHgwMDJlMDAyMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2SGRyVGFpbDE1X29mZnNldCAweDAwMmYwMDAwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJIZWFkMTVfb2Zmc2V0IDB4MDAyZjAwMDhVTAorc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQxNV9wYiB7CisJcHNldWRvX2JpdF90IFJjdkhlYWRQb2ludGVyWzMyXTsKKwlwc2V1ZG9fYml0X3QgY291bnRlclsxNl07CisJcHNldWRvX2JpdF90IFJlc2VydmVkWzE2XTsKK307CitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDE1IHsKKwlQU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMTVfcGIgKTsKK307CisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhUYWlsMTVfb2Zmc2V0IDB4MDAyZjAwMTBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkVnckluZGV4SGVhZDE1X29mZnNldCAweDAwMmYwMDE4VUwKKworI2RlZmluZSBRSUJfNzIyMF9NRU1fMkYwMDIwX29mZnNldCAweDAwMmYwMDIwVUwKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZIZHJUYWlsMTZfb2Zmc2V0IDB4MDAzMDAwMDBVTAorCisjZGVmaW5lIFFJQl83MjIwX1JjdkhkckhlYWQxNl9vZmZzZXQgMHgwMDMwMDAwOFVMCitzdHJ1Y3QgUUlCXzcyMjBfUmN2SGRySGVhZDE2X3BiIHsKKwlwc2V1ZG9fYml0X3QgUmN2SGVhZFBvaW50ZXJbMzJdOworCXBzZXVkb19iaXRfdCBjb3VudGVyWzE2XTsKKwlwc2V1ZG9fYml0X3QgUmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBRSUJfNzIyMF9SY3ZIZHJIZWFkMTYgeworCVBTRVVET19CSVRfU1RSVUNUICggc3RydWN0IFFJQl83MjIwX1JjdkhkckhlYWQxNl9wYiApOworfTsKKworI2RlZmluZSBRSUJfNzIyMF9SY3ZFZ3JJbmRleFRhaWwxNl9vZmZzZXQgMHgwMDMwMDAxMFVMCisKKyNkZWZpbmUgUUlCXzcyMjBfUmN2RWdySW5kZXhIZWFkMTZfb2Zmc2V0IDB4MDAzMDAwMThVTAorCisjZGVmaW5lIFFJQl83MjIwX01FTV8zMDAwMjBfb2Zmc2V0IDB4MDAzMDAwMjBVTAorCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvcWliX2dlbmJpdHMucGwgYi9ncHhlL3NyYy9kcml2ZXJzL2luZmluaWJhbmQvcWliX2dlbmJpdHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQ1ZWVkZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvaW5maW5pYmFuZC9xaWJfZ2VuYml0cy5wbApAQCAtMCwwICsxLDExNiBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisjIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworbXkgJG9mZnNldHMgPSB7fTsKK215ICRkZWZhdWx0cyA9IHt9OworbXkgJHN0cnVjdHVyZXMgPSB7fTsKK215ICRzdHJ1Y3R1cmUgPSAiIjsKKword2hpbGUgKCA8PiApIHsKKyAgY2hvbXA7CisgIGlmICggL15cI2RlZmluZSAoXFMrKV9PRkZTIChcUyspJC8gKSB7CisgICAgJHN0cnVjdHVyZSA9ICQxOworICAgICRvZmZzZXRzLT57JHN0cnVjdHVyZX0gPSAkMjsKKyAgfSBlbHNpZiAoIC9eXCNkZWZpbmUgJHtzdHJ1Y3R1cmV9X0RFRiAoXFMrKSQvICkgeworICAgICRkZWZhdWx0cy0+eyRzdHJ1Y3R1cmV9ID0gJDE7CisgIH0gZWxzaWYgKCAvXlwjZGVmaW5lICR7c3RydWN0dXJlfV8oXFMrKV9MU0IgKFxTKykkLyApIHsKKyAgICAkc3RydWN0dXJlcy0+eyRzdHJ1Y3R1cmV9LT57JDF9LT57TFNCfSA9ICQyOworICB9IGVsc2lmICggL15cI2RlZmluZSAke3N0cnVjdHVyZX1fKFxTKylfTVNCIChcUyspJC8gKSB7CisgICAgJHN0cnVjdHVyZXMtPnskc3RydWN0dXJlfS0+eyQxfS0+e01TQn0gPSAkMjsKKyAgfSBlbHNpZiAoIC9eXCNkZWZpbmUgJHtzdHJ1Y3R1cmV9XyhcUyspX1JNQVNLIChcUyspJC8gKSB7CisgICAgJHN0cnVjdHVyZXMtPnskc3RydWN0dXJlfS0+eyQxfS0+e1JNQVNLfSA9ICQyOworICB9IGVsc2lmICggL15ccyokLyApIHsKKyAgICAjIERvIG5vdGhpbmcKKyAgfSBlbHNlIHsKKyAgICBwcmludCAiJF9cbiI7CisgIH0KK30KKworbXkgJGRhdGEgPSBbIG1hcCB7IHsgbmFtZSA9PiAkXywgb2Zmc2V0ID0+ICRvZmZzZXRzLT57JF99LAorCQkgICAgIGRlZmF1bHQgPT4gJGRlZmF1bHRzLT57JF99IH07IH0KKwkgICAgIHNvcnQgeyBoZXggKCAkb2Zmc2V0cy0+eyRhfSApIDw9PiBoZXggKCAkb2Zmc2V0cy0+eyRifSApIH0KKwkgICAgIGtleXMgJSRvZmZzZXRzIF07CisKK2ZvcmVhY2ggbXkgJGRhdHVtICggQCRkYXRhICkgeworICBuZXh0IHVubGVzcyBleGlzdHMgJHN0cnVjdHVyZXMtPnskZGF0dW0tPntuYW1lfX07CisgICRzdHJ1Y3R1cmUgPSAkc3RydWN0dXJlcy0+eyRkYXR1bS0+e25hbWV9fTsKKyAgbXkgJGZpZWxkcyA9IFsgbWFwIHsgeyBuYW1lID0+ICRfLCBsc2IgPT4gJHN0cnVjdHVyZS0+eyRffS0+e0xTQn0sCisJCQkgbXNiID0+ICRzdHJ1Y3R1cmUtPnskX30tPntNU0J9LAorCQkJIHJtYXNrID0+ICRzdHJ1Y3R1cmUtPnskX30tPntSTUFTS30gfTsgfQorCQkgc29ydCB7IGhleCAoICRzdHJ1Y3R1cmUtPnskYX0tPntMU0J9ICkgPD0+CisJCQkgICAgaGV4ICggJHN0cnVjdHVyZS0+eyRifS0+e0xTQn0gKSB9CisJCSBrZXlzICUkc3RydWN0dXJlIF07CisgICRkYXR1bS0+e2ZpZWxkc30gPSAkZmllbGRzOworfQorCitwcmludCAiXG4vKiBUaGlzIGZpbGUgaGFzIGJlZW4gZnVydGhlciBwcm9jZXNzZWQgYnkgJDAgKi9cblxuIjsKK3ByaW50ICJGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTtcblxuIjsKKworZm9yZWFjaCBteSAkZGF0dW0gKCBAJGRhdGEgKSB7CisgIHByaW50ZiAiI2RlZmluZSAlc19vZmZzZXQgMHglMDh4VUxcbiIsCisgICAgICAkZGF0dW0tPntuYW1lfSwgaGV4ICggJGRhdHVtLT57b2Zmc2V0fSApOworICBpZiAoIGV4aXN0cyAkZGF0dW0tPntmaWVsZHN9ICkgeworICAgIG15ICRsc2IgPSAwOworICAgIG15ICRyZXNlcnZlZF9pZHggPSAwOworICAgIHByaW50ZiAic3RydWN0ICVzX3BiIHtcbiIsICRkYXR1bS0+e25hbWV9OworICAgIGZvcmVhY2ggbXkgJGZpZWxkICggQHskZGF0dW0tPntmaWVsZHN9fSApIHsKKyAgICAgIG15ICRwYWRfd2lkdGggPSAoIGhleCAoICRmaWVsZC0+e2xzYn0gKSAtICRsc2IgKTsKKyAgICAgIGRpZSAiSW5jb25zaXN0ZW50IExTQi9STUFTSyBpbiAkZGF0dW0tPntuYW1lfSBiZWZvcmUgJGZpZWxkLT57bmFtZX1cbiIKKwkgIGlmICRwYWRfd2lkdGggPCAwOworICAgICAgcHJpbnRmICJcdHBzZXVkb19iaXRfdCBfdW51c2VkXyV1WyV1XTtcbiIsICRyZXNlcnZlZF9pZHgrKywgJHBhZF93aWR0aAorCSAgaWYgJHBhZF93aWR0aDsKKyAgICAgICRsc2IgKz0gJHBhZF93aWR0aDsKKyAgICAgICMgRGFtbiBQZXJsIGNhbid0IGNvcGUgd2l0aCA2NC1iaXQgaGV4IGNvbnN0YW50cworICAgICAgbXkgJHdpZHRoID0gMDsKKyAgICAgIGRpZSAiTWlzc2luZyBSTUFTSyBpbiAkZGF0dW0tPntuYW1lfS4kZmllbGQtPntuYW1lfVxuIgorCSAgdW5sZXNzIGRlZmluZWQgJGZpZWxkLT57cm1hc2t9OworICAgICAgbXkgJHJtYXNrID0gJGZpZWxkLT57cm1hc2t9OworICAgICAgd2hpbGUgKCAkcm1hc2sgPX4gL14oMHguKylmJC9pICkgeworCSR3aWR0aCArPSA0OworCSRybWFzayA9ICQxOworICAgICAgfQorICAgICAgJHJtYXNrID0gaGV4ICggJHJtYXNrICk7CisgICAgICB3aGlsZSAoICRybWFzayApIHsKKwkkd2lkdGgrKzsKKwkkcm1hc2sgPj49IDE7CisgICAgICB9CisgICAgICBpZiAoIGRlZmluZWQgJGZpZWxkLT57bXNifSApIHsKKwlteSAkbXNiX3dpZHRoID0gKCBoZXggKCAkZmllbGQtPnttc2J9ICkgLSAkbHNiICsgMSApOworCSR3aWR0aCB8fD0gJG1zYl93aWR0aDsKKwlkaWUgIkluY29uc2lzdGVudCBMU0IvTVNCL1JNQVNLIGluICRkYXR1bS0+e25hbWV9LiRmaWVsZC0+e25hbWV9XG4iCisJICAgIHVubGVzcyAkd2lkdGggPT0gJG1zYl93aWR0aDsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAiXHRwc2V1ZG9fYml0X3QgJXNbJXVdO1xuIiwgJGZpZWxkLT57bmFtZX0sICR3aWR0aDsKKyAgICAgICRsc2IgKz0gJHdpZHRoOworICAgIH0KKyAgICBteSAkcGFkX3dpZHRoID0gKCA2NCAtICRsc2IgKTsKKyAgICBkaWUgIkluY29uc2lzdGVudCBMU0IvUk1BU0sgaW4gJGRhdHVtLT57bmFtZX0gZmluYWwgZmllbGRcbiIKKwlpZiAkcGFkX3dpZHRoIDwgMDsKKyAgICBwcmludGYgIlx0cHNldWRvX2JpdF90IF91bnVzZWRfJXVbJXVdO1xuIiwgJHJlc2VydmVkX2lkeCsrLCAkcGFkX3dpZHRoCisJaWYgJHBhZF93aWR0aDsKKyAgICBwcmludGYgIn07XG4iOworICAgIHByaW50ZiAic3RydWN0ICVzIHtcblx0UFNFVURPX0JJVF9TVFJVQ1QgKCBzdHJ1Y3QgJXNfcGIgKTtcbn07XG4iLAorCSRkYXR1bS0+e25hbWV9LCAkZGF0dW0tPntuYW1lfTsKKyAgfQorICBwcmludGYgIi8qIERlZmF1bHQgdmFsdWU6ICVzICovXG4iLCAkZGF0dW0tPntkZWZhdWx0fQorICAgICAgaWYgZGVmaW5lZCAkZGF0dW0tPntkZWZhdWx0fTsKKyAgcHJpbnQgIlxuIjsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNTAzLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzUwMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MDRkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzUwMy5jCkBAIC0wLDAgKzEsNSBAQAorLyogM0NvbSAzYzUwMywgYSBtZW1vcnktbWFwcGVkIE5TODM5MC1iYXNlZCBjYXJkICovCisjaWYgMCAvKiBDdXJyZW50bHkgYnJva2VuISAqLworI2RlZmluZSBJTkNMVURFXzNDNTAzCisjaW5jbHVkZSAibnM4MzkwLmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNTA5LWVpc2EuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNTA5LWVpc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTdjMDViCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M1MDktZWlzYS5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBTcGxpdCBvdXQgZnJvbSAzYzUwOS5jLCBzaW5jZSBFSVNBIGNhcmRzIGFyZSByZWxhdGl2ZWx5IHJhcmUsIGFuZAorICogUk9NIHNwYWNlIGluIDNjNTA5cyBpcyB2ZXJ5IGxpbWl0ZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxncHhlL2Vpc2EuaD4KKyNpbmNsdWRlIDxncHhlL2lzYS5oPgorI2luY2x1ZGUgImNvbnNvbGUuaCIKKyNpbmNsdWRlICIzYzUwOS5oIgorCisvKgorICogVGhlIEVJU0EgcHJvYmUgZnVuY3Rpb24KKyAqCisgKi8KK3N0YXRpYyBpbnQgZWwzX2Vpc2FfcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBlaXNhX2RldmljZSAqZWlzYSApIHsKKwkKKworICAgICAgICBuaWMtPmlvYWRkciA9IGVpc2EtPmlvYWRkcjsKKyAgICAgICAgbmljLT5pcnFubyA9IDA7CisgICAgICAgIGVuYWJsZV9laXNhX2RldmljZSAoIGVpc2EgKTsKKyAgICAgICAgCisJLyogSGFuZCBvZmYgdG8gZ2VuZXJpYyB0NXg5IHByb2JlIHJvdXRpbmUgKi8KKwlyZXR1cm4gdDV4OV9wcm9iZSAoIG5pYywgSVNBX1BST0RfSUQgKCBQUk9EX0lEICksIElTQV9QUk9EX0lEX01BU0sgKTsKK30KKworc3RhdGljIHZvaWQgZWwzX2Vpc2FfZGlzYWJsZSAoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGVpc2FfZGV2aWNlICplaXNhICkgeworCXQ1eDlfZGlzYWJsZSAoIG5pYyApOworCWRpc2FibGVfZWlzYV9kZXZpY2UgKCBlaXNhICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgZWwzX2Vpc2FfYWRhcHRlcnNbXSA9IHsKKwl7ICIzQ29tIDNjNTA5IEV0aGVyTGluayBJSUkgKEVJU0EpIiwgTUZHX0lELCBQUk9EX0lEIH0sCit9OworCitFSVNBX0RSSVZFUiAoIGVsM19laXNhX2RyaXZlciwgZWwzX2Vpc2FfYWRhcHRlcnMgKTsKKworRFJJVkVSICggIjNjNTA5IChFSVNBKSIsIG5pY19kcml2ZXIsIGVpc2FfZHJpdmVyLCBlbDNfZWlzYV9kcml2ZXIsCisJIGVsM19laXNhX3Byb2JlLCBlbDNfZWlzYV9kaXNhYmxlICk7CisKK0lTQV9ST00gKCAiM2M1MDktZWlzYSIsIjNjNTA5IChFSVNBKSIgKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNTA5LmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzUwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNThmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzUwOS5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogU3BsaXQgb3V0IGludG8gM2M1MDkuYyBhbmQgM2M1eDkuYywgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBidWlsZCBhCisgKiAzYzUyOSBtb2R1bGUgd2l0aG91dCBpbmNsdWRpbmcgSVNBLCBJU0FQblAgYW5kIEVJU0EgY29kZS4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggQlNEMiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2lvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3B4ZS9kZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2lzYS5oPgorI2luY2x1ZGUgIjNjNTA5LmgiCisKKy8qCisgKiAzYzUwOSBjYXJkcyBoYXZlIHRoZWlyIG93biBtZXRob2Qgb2YgY29udGVudGlvbiByZXNvbHV0aW9uOyB0aGlzCisgKiBlZmZlY3RpdmVseSBkZWZpbmVzIGFub3RoZXIgYnVzIHR5cGUgc2ltaWxhciB0byBJU0FQblAuICBFdmVuIHRoZQorICogb3JpZ2luYWwgSVNBIGNhcmRzIGNhbiBiZSBwcm9ncmFtYXRpY2FsbHkgbWFwcGVkIHRvIGFueSBJL08gYWRkcmVzcworICogaW4gdGhlIHJhbmdlIDB4MjAwLTB4M2UwLgorICogCisgKiBIb3dldmVyLCB0aGVyZSBpcyBhIHNtYWxsIHByb2JsZW06IG9uY2UgeW91J3ZlIGFjdGl2YXRlZCBhIGNhcmQsCisgKiB0aGUgb25seSB3YXlzIHRvIGRlYWN0aXZhdGUgaXQgd2lsbCBhbHNvIHdpcGUgaXRzIHRhZywgbWVhbmluZyB0aGF0CisgKiB5b3Ugd29uJ3QgYmUgYWJsZSB0byBzdWJzZXF1ZW50bHkgcmVhY3RpdmF0ZSBpdCB3aXRob3V0IGdvaW5nCisgKiB0aHJvdWdoIHRoZSB3aG9sZSBJRCBzZXF1ZW5jZSBhZ2Fpbi4gIFRoZSBzb2x1dGlvbiB3ZSBhZG9wdCBpcyB0bworICogaXNvbGF0ZSBhbmQgdGFnIGFsbCBjYXJkcyBhdCB0aGUgc3RhcnQsIGFuZCB0byBpbW1lZGlhdGVseQorICogcmUtaXNvbGF0ZSBhbmQgcmUtdGFnIGEgY2FyZCBhZnRlciBkaXNhYmxpbmcgaXQuCisgKgorICovCisKK3N0YXRpYyB2b2lkIHQ1MDlidXNfcmVtb3ZlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdDUwOV9pZF9wb3J0ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdDUwOV9tYXhfdGFnID0gMDsKKworLyoqIEEgM2M1MDkgZGV2aWNlICovCitzdHJ1Y3QgdDUwOV9kZXZpY2UgeworCS8qKiBHZW5lcmljIGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UgZGV2OworCS8qKiBUYWcgKi8KKwl1bnNpZ25lZCBpbnQgdGFnOworCS8qKiBJL08gYWRkcmVzcyAqLworCXVpbnQxNl90IGlvYWRkcjsKKwkvKiogRHJpdmVyLXByaXZhdGUgZGF0YQorCSAqCisJICogVXNlIHQ1MDlfc2V0X2RydmRhdGEoKSBhbmQgdDUwOV9nZXRfZHJ2ZGF0YSgpIHRvIGFjY2VzcworCSAqIHRoaXMgZmllbGQuCisJICovCisJdm9pZCAqcHJpdjsKK307CisKKy8qKgorICogU2V0IDNjNTA5IGRyaXZlci1wcml2YXRlIGRhdGEKKyAqCisgKiBAdiB0NTA5CQkzYzUwOSBkZXZpY2UKKyAqIEB2IHByaXYJCVByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdDUwOV9zZXRfZHJ2ZGF0YSAoIHN0cnVjdCB0NTA5X2RldmljZSAqdDUwOSwgdm9pZCAqcHJpdiApIHsKKwl0NTA5LT5wcml2ID0gcHJpdjsKK30KKworLyoqCisgKiBHZXQgM2M1MDkgZHJpdmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IHQ1MDkJCTNjNTA5IGRldmljZQorICogQHJldCBwcml2CQlQcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGlubGluZSB2b2lkICogdDUwOV9nZXRfZHJ2ZGF0YSAoIHN0cnVjdCB0NTA5X2RldmljZSAqdDUwOSApIHsKKwlyZXR1cm4gdDUwOS0+cHJpdjsKK30KKworLyoKKyAqIHQ1MDkgdXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHQ1MDlfc2V0X2lkX3BvcnQgKCB2b2lkICkgeworCW91dGIgKCAweDAwLCB0NTA5X2lkX3BvcnQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHQ1MDlfd2FpdF9mb3JfaWRfc2VxdWVuY2UgKCB2b2lkICkgeworCW91dGIgKCAweDAwLCB0NTA5X2lkX3BvcnQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHQ1MDlfZ2xvYmFsX3Jlc2V0ICggdm9pZCApIHsKKwlvdXRiICggMHhjMCwgdDUwOV9pZF9wb3J0ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0NTA5X3Jlc2V0X3RhZyAoIHZvaWQgKSB7CisJb3V0YiAoIDB4ZDAsIHQ1MDlfaWRfcG9ydCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdDUwOV9zZXRfdGFnICggdWludDhfdCB0YWcgKSB7CisJb3V0YiAoIDB4ZDAgfCB0YWcsIHQ1MDlfaWRfcG9ydCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdDUwOV9zZWxlY3RfdGFnICggdWludDhfdCB0YWcgKSB7CisJb3V0YiAoIDB4ZDggfCB0YWcsIHQ1MDlfaWRfcG9ydCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdDUwOV9hY3RpdmF0ZSAoIHVpbnQxNl90IGlvYWRkciApIHsKKwlvdXRiICggMHhlMCB8ICggaW9hZGRyID4+IDQgKSwgdDUwOV9pZF9wb3J0ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0NTA5X2RlYWN0aXZhdGVfYW5kX3Jlc2V0X3RhZyAoIHVpbnQxNl90IGlvYWRkciApIHsKKwlvdXRiICggR0xPQkFMX1JFU0VULCBpb2FkZHIgKyBFUF9DT01NQU5EICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0NTA5X2xvYWRfZWVwcm9tX3dvcmQgKCB1aW50OF90IG9mZnNldCApIHsKKwlvdXRiICggMHg4MCB8IG9mZnNldCwgdDUwOV9pZF9wb3J0ICk7Cit9CisKKy8qCisgKiBGaW5kIGEgc3VpdGFibGUgSUQgcG9ydAorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgdDUwOV9maW5kX2lkX3BvcnQgKCB2b2lkICkgeworCisJZm9yICggdDUwOV9pZF9wb3J0ID0gRVBfSURfUE9SVF9TVEFSVCA7CisJICAgICAgdDUwOV9pZF9wb3J0IDwgRVBfSURfUE9SVF9FTkQgOworCSAgICAgIHQ1MDlfaWRfcG9ydCArPSBFUF9JRF9QT1JUX0lOQyApIHsKKwkJdDUwOV9zZXRfaWRfcG9ydCAoKTsKKwkJLyogU2VlIGlmIGFueXRoaW5nJ3MgbGlzdGVuaW5nICovCisJCW91dGIgKCAweGZmLCB0NTA5X2lkX3BvcnQgKTsKKwkJaWYgKCBpbmIgKCB0NTA5X2lkX3BvcnQgKSAmIDB4MDEgKSB7CisJCQkvKiBGb3VuZCBhIHN1aXRhYmxlIHBvcnQgKi8KKwkJCURCRyAoICJUNTA5IHVzaW5nIElEIHBvcnQgYXQgJTA0eFxuIiwgdDUwOV9pZF9wb3J0ICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKiBObyBpZCBwb3J0IGF2YWlsYWJsZSAqLworCURCRyAoICJUNTA5IGZvdW5kIG5vIGF2YWlsYWJsZSBJRCBwb3J0XG4iICk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKy8qCisgKiBTZW5kIElEIHNlcXVlbmNlIHRvIHRoZSBJRCBwb3J0CisgKgorICovCitzdGF0aWMgdm9pZCB0NTA5X3NlbmRfaWRfc2VxdWVuY2UgKCB2b2lkICkgeworCXVuc2lnbmVkIHNob3J0IGxyc19zdGF0ZSwgaTsKKworCXQ1MDlfc2V0X2lkX3BvcnQgKCk7CisJLyogUmVzZXQgSURTIG9uIGNhcmRzICovCisJdDUwOV93YWl0X2Zvcl9pZF9zZXF1ZW5jZSAoKTsKKwlscnNfc3RhdGUgPSAweGZmOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDI1NTsgaSsrICkgeworICAgICAgICAgICAgICAgIG91dGIgKCBscnNfc3RhdGUsIHQ1MDlfaWRfcG9ydCApOworICAgICAgICAgICAgICAgIGxyc19zdGF0ZSA8PD0gMTsKKyAgICAgICAgICAgICAgICBscnNfc3RhdGUgPSBscnNfc3RhdGUgJiAweDEwMCA/IGxyc19zdGF0ZSBeIDB4Y2YgOiBscnNfc3RhdGU7CisgICAgICAgIH0KK30KKworLyoKKyAqIFdlIGdldCBlZXByb20gZGF0YSBmcm9tIHRoZSBpZF9wb3J0IGdpdmVuIGFuIG9mZnNldCBpbnRvIHRoZSBlZXByb20uCisgKiBCYXNpY2FsbHk7IGFmdGVyIHRoZSBJRF9zZXF1ZW5jZSBpcyBzZW50IHRvIGFsbCBvZiB0aGUgY2FyZHM7IHRoZXkgZW50ZXIKKyAqIHRoZSBJRF9DTUQgc3RhdGUgd2hlcmUgdGhleSB3aWxsIGFjY2VwdCBjb21tYW5kIHJlcXVlc3RzLiAweDgwLTB4YmYgbG9hZHMKKyAqIHRoZSBlZXByb20gZGF0YS4gIFdlIHRoZW4gcmVhZCB0aGUgcG9ydCAxNiB0aW1lcyBhbmQgd2l0aCBldmVyeSByZWFkOyB0aGUKKyAqIGNhcmRzIGNoZWNrIGZvciBjb250ZW50aW9uIChpZTogaWYgb25lIGNhcmQgd3JpdGVzIGEgMCBiaXQgYW5kIGFub3RoZXIKKyAqIHdyaXRlcyBhIDEgYml0IHRoZW4gdGhlIGhvc3Qgc2VlcyBhIDAuIEF0IHRoZSBlbmQgb2YgdGhlIGN5Y2xlOyBlYWNoIGNhcmQKKyAqIGNvbXBhcmVzIHRoZSBkYXRhIG9uIHRoZSBidXM7IGlmIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSB0aGVuIHRoYXQgY2FyZCBnb2VzCisgKiBpbnRvIElEX1dBSVQgc3RhdGUgYWdhaW4pLiBJbiB0aGUgbWVhbnRpbWU7IG9uZSBiaXQgb2YgZGF0YSBpcyByZXR1cm5lZCBpbgorICogdGhlIEFYIHJlZ2lzdGVyIHdoaWNoIGlzIGNvbnZlbmllbnRseSByZXR1cm5lZCB0byB1cyBieSBpbmIoKS4gIEhlbmNlOyB3ZQorICogcmVhZCAxNiB0aW1lcyBnZXR0aW5nIG9uZSBiaXQgb2YgZGF0YSB3aXRoIGVhY2ggcmVhZC4KKyAqLworc3RhdGljIHVpbnQxNl90IHQ1MDlfaWRfcmVhZF9lZXByb20gKCBpbnQgb2Zmc2V0ICkgeworCWludCBpLCBkYXRhID0gMDsKKworCXQ1MDlfbG9hZF9lZXByb21fd29yZCAoIG9mZnNldCApOworCS8qIERvIHdlIHJlYWxseSBuZWVkIHRoaXMgd2FpdD8gV29uJ3QgYmUgbm90aWNlYWJsZSBhbnl3YXkgKi8KKwl1ZGVsYXkoMTAwMDApOworCisJZm9yICggaSA9IDA7IGkgPCAxNjsgaSsrICkgeworCQlkYXRhID0gKCBkYXRhIDw8IDEgKSB8ICggaW53ICggdDUwOV9pZF9wb3J0ICkgJiAxICk7CisJfQorCXJldHVybiBkYXRhOworfQorCisvKgorICogSXNvbGF0ZSBhbmQgdGFnIGFsbCB0NTA5IGNhcmRzCisgKgorICovCitzdGF0aWMgaW50IHQ1MDlfaXNvbGF0ZSAoIHZvaWQgKSB7CisJdW5zaWduZWQgaW50IGk7CisJdWludDE2X3QgY29udGVuZFszXTsKKwlpbnQgcmM7CisKKwkvKiBGaW5kIGEgc3VpdGFibGUgSUQgcG9ydCAqLworCWlmICggKCByYyA9IHQ1MDlfZmluZF9pZF9wb3J0KCkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJd2hpbGUgKCAxICkgeworCisJCS8qIEFsbCBjYXJkcyBhcmUgaW4gSURfV0FJVCBzdGF0ZSBlYWNoIHRpbWUgd2UgZ28KKwkJICogdGhyb3VnaCB0aGlzIGxvb3AuCisJCSAqLworCisJCS8qIFNlbmQgdGhlIElEIHNlcXVlbmNlICovCisJCXQ1MDlfc2VuZF9pZF9zZXF1ZW5jZSgpOworCisJCS8qIEZpcnN0IHRpbWUgdGhyb3VnaCwgcmVzZXQgYWxsIHRhZ3MuICBPbiBzdWJzZXF1ZW50CisJCSAqIGl0ZXJhdGlvbnMsIGtpbGwgb2ZmIGFueSBhbHJlYWR5LXRhZ2dlZCBjYXJkcworCQkgKi8KKwkJaWYgKCB0NTA5X21heF90YWcgPT0gMCApIHsKKwkJCXQ1MDlfcmVzZXRfdGFnKCk7CisJCX0gZWxzZSB7CisJCQl0NTA5X3NlbGVjdF90YWcgKCAwICk7CisJCX0KKwkKKwkJLyogUmVhZCB0aGUgbWFudWZhY3R1cmVyIElELCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueQorCQkgKiBtb3JlIGNhcmRzCisJCSAqLworCQlpZiAoIHQ1MDlfaWRfcmVhZF9lZXByb20gKCBFRVBST01fTUZHX0lEICkgIT0gTUZHX0lEICkgeworCQkJREJHICggIlQ1MDkgc2F3ICVzIHNpZ25zIG9mIGxpZmVcbiIsCisJCQkgICAgICB0NTA5X21heF90YWcgPyAibm8gZnVydGhlciIgOiAibm8iICk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFBlcmZvcm0gY29udGVudGlvbiBzZWxlY3Rpb24gb24gdGhlIE1BQyBhZGRyZXNzICovCisJCWZvciAoIGkgPSAwIDsgaSA8IDMgOyBpKysgKSB7CisJCQljb250ZW5kW2ldID0gdDUwOV9pZF9yZWFkX2VlcHJvbSAoIGkgKTsKKwkJfQorCisJCS8qIE9ubHkgb25lIGRldmljZSB3aWxsIHN0aWxsIGJlIGxlZnQgYWxpdmUuICBUYWcgaXQuICovCisJCSsrdDUwOV9tYXhfdGFnOworCQlEQkcgKCAiVDUwOSBmb3VuZCBjYXJkICUwNHglMDR4JTA0eCwgYXNzaWduaW5nIHRhZyAlMDJ4XG4iLAorCQkgICAgICBjb250ZW5kWzBdLCBjb250ZW5kWzFdLCBjb250ZW5kWzJdLCB0NTA5X21heF90YWcgKTsKKwkJdDUwOV9zZXRfdGFnICggdDUwOV9tYXhfdGFnICk7CisKKwkJLyogUmV0dXJuIGFsbCBjYXJkcyBiYWNrIHRvIElEX1dBSVQgc3RhdGUgKi8KKwkJdDUwOV93YWl0X2Zvcl9pZF9zZXF1ZW5jZSgpOworCX0KKworCURCRyAoICJUNTA5IGZvdW5kICVkIGNhcmRzIHVzaW5nIElEIHBvcnQgJTA0eFxuIiwKKwkgICAgICB0NTA5X21heF90YWcsIHQ1MDlfaWRfcG9ydCApOworCXJldHVybiAwOworfQorCisvKgorICogQWN0aXZhdGUgYSBUNTA5IGRldmljZQorICoKKyAqIFRoZSBkZXZpY2Ugd2lsbCBiZSBlbmFibGVkIGF0IHdoYXRldmVyIGlvYWRkciBpcyBzcGVjaWZpZWQgaW4gdGhlCisgKiBzdHJ1Y3QgdDUwOV9kZXZpY2U7IHRoZXJlIGlzIG5vIG5lZWQgdG8gc3RpY2sgd2l0aCB0aGUgZGVmYXVsdAorICogaW9hZGRyIHJlYWQgZnJvbSB0aGUgRUVQUk9NLgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX3Q1MDlfZGV2aWNlICggc3RydWN0IHQ1MDlfZGV2aWNlICp0NTA5ICkgeworCXQ1MDlfc2VuZF9pZF9zZXF1ZW5jZSAoKTsKKwl0NTA5X3NlbGVjdF90YWcgKCB0NTA5LT50YWcgKTsKKwl0NTA5X2FjdGl2YXRlICggdDUwOS0+aW9hZGRyICk7CisJREJHICggIlQ1MDkgYWN0aXZhdGVkIGRldmljZSAlMDJ4IGF0IGlvYWRkciAlMDR4XG4iLAorCSAgICAgIHQ1MDktPnRhZywgdDUwOS0+aW9hZGRyICk7Cit9CisKKy8qCisgKiBEZWFjdGl2YXRlIGEgVDUwOSBkZXZpY2UKKyAqCisgKiBEaXNhYmxpbmcgYWxzbyBjbGVhcnMgdGhlIHRhZywgc28gd2UgaW1tZWRpYXRlbHkgaXNvbGF0ZSBhbmQgcmUtdGFnCisgKiB0aGlzIGNhcmQuCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVhY3RpdmF0ZV90NTA5X2RldmljZSAoIHN0cnVjdCB0NTA5X2RldmljZSAqdDUwOSApIHsKKwl0NTA5X2RlYWN0aXZhdGVfYW5kX3Jlc2V0X3RhZyAoIHQ1MDktPmlvYWRkciApOworCXVkZWxheSAoIDEwMDAgKTsKKwl0NTA5X3NlbmRfaWRfc2VxdWVuY2UgKCk7CisJdDUwOV9zZWxlY3RfdGFnICggMCApOworCXQ1MDlfc2V0X3RhZyAoIHQ1MDktPnRhZyApOworCXQ1MDlfd2FpdF9mb3JfaWRfc2VxdWVuY2UgKCk7CisJREJHICggIlQ1MDkgZGVhY3RpdmF0ZWQgZGV2aWNlIGF0ICUwNHggYW5kIHJlLXRhZ2dlZCBhcyAlMDJ4XG4iLAorCSAgICAgIHQ1MDktPmlvYWRkciwgdDUwOS0+dGFnICk7Cit9CisKKy8qCisgKiBUaGUgSVNBIHByb2JlIGZ1bmN0aW9uCisgKgorICovCitzdGF0aWMgaW50IGxlZ2FjeV90NTA5X3Byb2JlICggc3RydWN0IG5pYyAqbmljLCB2b2lkICpod2RldiApIHsKKwlzdHJ1Y3QgdDUwOV9kZXZpY2UgKnQ1MDkgPSBod2RldjsKKworCS8qIFdlIGNvdWxkIGNoYW5nZSB0NTA5LT5pb2FkZHIgaWYgd2Ugd2FudGVkIHRvICovCisJYWN0aXZhdGVfdDUwOV9kZXZpY2UgKCB0NTA5ICk7CisJbmljLT5pb2FkZHIgPSB0NTA5LT5pb2FkZHI7CisKKwkvKiBIYW5kIG9mZiB0byBnZW5lcmljIHQ1eDkgcHJvYmUgcm91dGluZSAqLworCXJldHVybiB0NXg5X3Byb2JlICggbmljLCBJU0FfUFJPRF9JRCAoIFBST0RfSUQgKSwgSVNBX1BST0RfSURfTUFTSyApOworfQorCitzdGF0aWMgdm9pZCBsZWdhY3lfdDUwOV9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljLCB2b2lkICpod2RldiApIHsKKwlzdHJ1Y3QgdDUwOV9kZXZpY2UgKnQ1MDkgPSBod2RldjsKKworCXQ1eDlfZGlzYWJsZSAoIG5pYyApOworCWRlYWN0aXZhdGVfdDUwOV9kZXZpY2UgKCB0NTA5ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZWdhY3lfdDUwOV9zZXRfZHJ2ZGF0YSAoIHZvaWQgKmh3ZGV2LCB2b2lkICpwcml2ICkgeworCXQ1MDlfc2V0X2RydmRhdGEgKCBod2RldiwgcHJpdiApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKiBsZWdhY3lfdDUwOV9nZXRfZHJ2ZGF0YSAoIHZvaWQgKmh3ZGV2ICkgeworCXJldHVybiB0NTA5X2dldF9kcnZkYXRhICggaHdkZXYgKTsKK30KKworLyoqCisgKiBQcm9iZSBhIDNjNTA5IGRldmljZQorICoKKyAqIEB2IHQ1MDkJCTNjNTA5IGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogU2VhcmNoZXMgZm9yIGEgZHJpdmVyIGZvciB0aGUgM2M1MDkgZGV2aWNlLiAgSWYgYSBkcml2ZXIgaXMgZm91bmQsCisgKiBpdHMgcHJvYmUoKSByb3V0aW5lIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIGludCB0NTA5X3Byb2JlICggc3RydWN0IHQ1MDlfZGV2aWNlICp0NTA5ICkgeworCURCRyAoICJBZGRpbmcgM2M1MDkgZGV2aWNlICUwMnggKEkvTyAlMDR4KVxuIiwKKwkgICAgICB0NTA5LT50YWcsIHQ1MDktPmlvYWRkciApOworCXJldHVybiBsZWdhY3lfcHJvYmUgKCB0NTA5LCBsZWdhY3lfdDUwOV9zZXRfZHJ2ZGF0YSwgJnQ1MDktPmRldiwKKwkJCSAgICAgIGxlZ2FjeV90NTA5X3Byb2JlLCBsZWdhY3lfdDUwOV9kaXNhYmxlICk7Cit9CisKKy8qKgorICogUmVtb3ZlIGEgM2M1MDkgZGV2aWNlCisgKgorICogQHYgdDUwOQkJM2M1MDkgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHQ1MDlfcmVtb3ZlICggc3RydWN0IHQ1MDlfZGV2aWNlICp0NTA5ICkgeworCWxlZ2FjeV9yZW1vdmUgKCB0NTA5LCBsZWdhY3lfdDUwOV9nZXRfZHJ2ZGF0YSwgbGVnYWN5X3Q1MDlfZGlzYWJsZSApOworCURCRyAoICJSZW1vdmVkIDNjNTA5IGRldmljZSAlMDJ4XG4iLCB0NTA5LT50YWcgKTsKK30KKworLyoqCisgKiBQcm9iZSAzYzUwOSByb290IGJ1cworICoKKyAqIEB2IHJvb3RkZXYJCTNjNTA5IGJ1cyByb290IGRldmljZQorICoKKyAqIFNjYW5zIHRoZSAzYzUwOSBidXMgZm9yIGRldmljZXMgYW5kIHJlZ2lzdGVycyBhbGwgZGV2aWNlcyBpdCBjYW4KKyAqIGZpbmQuCisgKi8KK3N0YXRpYyBpbnQgdDUwOWJ1c19wcm9iZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApIHsKKwlzdHJ1Y3QgdDUwOV9kZXZpY2UgKnQ1MDkgPSBOVUxMOworCXVuc2lnbmVkIGludCB0YWc7CisJdW5zaWduZWQgaW50IGlvYmFzZTsKKwlpbnQgcmM7CisKKwkvKiBQZXJmb3JtIGlzb2xhdGlvbiBhbmQgdGFnZ2luZyAqLworCWlmICggKCByYyA9IHQ1MDlfaXNvbGF0ZSgpICkgIT0gMCApCisJCXJldHVybiByYzsKKworCWZvciAoIHRhZyA9IDEgOyB0YWcgPD0gdDUwOV9tYXhfdGFnIDsgdGFnKysgKSB7CisJCS8qIEFsbG9jYXRlIHN0cnVjdCB0NTA5X2RldmljZSAqLworCQlpZiAoICEgdDUwOSApCisJCQl0NTA5ID0gbWFsbG9jICggc2l6ZW9mICggKnQ1MDkgKSApOworCQlpZiAoICEgdDUwOSApIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisJCW1lbXNldCAoIHQ1MDksIDAsIHNpemVvZiAoICp0NTA5ICkgKTsKKwkJdDUwOS0+dGFnID0gdGFnOworCisJCS8qIFNlbmQgdGhlIElEIHNlcXVlbmNlICovCisJCXQ1MDlfc2VuZF9pZF9zZXF1ZW5jZSAoKTsKKworCQkvKiBTZWxlY3QgdGhlIHNwZWNpZmllZCB0YWcgKi8KKwkJdDUwOV9zZWxlY3RfdGFnICggdDUwOS0+dGFnICk7CisKKwkJLyogUmVhZCB0aGUgZGVmYXVsdCBJL08gYWRkcmVzcyAqLworCQlpb2Jhc2UgPSB0NTA5X2lkX3JlYWRfZWVwcm9tICggRUVQUk9NX0FERFJfQ0ZHICk7CisJCXQ1MDktPmlvYWRkciA9IDB4MjAwICsgKCAoIGlvYmFzZSAmIDB4MWYgKSA8PCA0ICk7CisKKwkJLyogU2VuZCBjYXJkIGJhY2sgdG8gSURfV0FJVCAqLworCQl0NTA5X3dhaXRfZm9yX2lkX3NlcXVlbmNlKCk7CisKKwkJLyogQWRkIHRvIGRldmljZSBoaWVyYXJjaHkgKi8KKwkJc25wcmludGYgKCB0NTA5LT5kZXYubmFtZSwgc2l6ZW9mICggdDUwOS0+ZGV2Lm5hbWUgKSwKKwkJCSAgICJ0NTA5JTAyeCIsIHRhZyApOworCQl0NTA5LT5kZXYuZGVzYy5idXNfdHlwZSA9IEJVU19UWVBFX0lTQTsKKwkJdDUwOS0+ZGV2LmRlc2MudmVuZG9yID0gTUZHX0lEOworCQl0NTA5LT5kZXYuZGVzYy5kZXZpY2UgPSBQUk9EX0lEOworCQl0NTA5LT5kZXYucGFyZW50ID0gJnJvb3RkZXYtPmRldjsKKwkJbGlzdF9hZGQgKCAmdDUwOS0+ZGV2LnNpYmxpbmdzLCAmcm9vdGRldi0+ZGV2LmNoaWxkcmVuICk7CisJCUlOSVRfTElTVF9IRUFEICggJnQ1MDktPmRldi5jaGlsZHJlbiApOworCQkJCisJCS8qIExvb2sgZm9yIGEgZHJpdmVyICovCisJCWlmICggdDUwOV9wcm9iZSAoIHQ1MDkgKSA9PSAwICkgeworCQkJLyogdDUwOWRldiByZWdpc3RlcmVkLCB3ZSBjYW4gZHJvcCBvdXIgcmVmICovCisJCQl0NTA5ID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vdCByZWdpc3RlcmVkOyByZS11c2Ugc3RydWN0ICovCisJCQlsaXN0X2RlbCAoICZ0NTA5LT5kZXYuc2libGluZ3MgKTsKKwkJfQorCX0KKworCWZyZWUgKCB0NTA5ICk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJZnJlZSAoIHQ1MDkgKTsKKwl0NTA5YnVzX3JlbW92ZSAoIHJvb3RkZXYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVtb3ZlIDNjNTA5IHJvb3QgYnVzCisgKgorICogQHYgcm9vdGRldgkJM2M1MDkgYnVzIHJvb3QgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHQ1MDlidXNfcmVtb3ZlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICkgeworCXN0cnVjdCB0NTA5X2RldmljZSAqdDUwOTsKKwlzdHJ1Y3QgdDUwOV9kZXZpY2UgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAoIHQ1MDksIHRtcCwgJnJvb3RkZXYtPmRldi5jaGlsZHJlbiwKKwkJCQkgICBkZXYuc2libGluZ3MgKSB7CisJCXQ1MDlfcmVtb3ZlICggdDUwOSApOworCQlsaXN0X2RlbCAoICZ0NTA5LT5kZXYuc2libGluZ3MgKTsKKwkJZnJlZSAoIHQ1MDkgKTsKKwl9Cit9CisKKy8qKiAzYzUwOSBidXMgcm9vdCBkZXZpY2UgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHJvb3RfZHJpdmVyIHQ1MDlfcm9vdF9kcml2ZXIgPSB7CisJLnByb2JlID0gdDUwOWJ1c19wcm9iZSwKKwkucmVtb3ZlID0gdDUwOWJ1c19yZW1vdmUsCit9OworCisvKiogM2M1MDkgYnVzIHJvb3QgZGV2aWNlICovCitzdHJ1Y3Qgcm9vdF9kZXZpY2UgdDUwOV9yb290X2RldmljZSBfX3Jvb3RfZGV2aWNlID0geworCS5kZXYgPSB7IC5uYW1lID0gIjNjNTA5IiB9LAorCS5kcml2ZXIgPSAmdDUwOV9yb290X2RyaXZlciwKK307CisKK0lTQV9ST00gKCAiM2M1MDkiLCAiM2M1MDkiICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzUwOS5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M1MDkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDMwZDRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M1MDkuaApAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MyBIZXJiIFBleWVybCAoaHBleWVybEBub3ZhdGVsLmNhKSBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAyLiBUaGUgbmFtZQorICogb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3VnaCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogaWZfZXByZWcuaCx2IDEuNCAxOTk0LzExLzEzIDEwOjEyOjM3IGdpYmJzIEV4cCBNb2RpZmllZCBieToKKyAqCisgT2N0b2JlciAyLCAxOTk0CisKKyBNb2RpZmllZCBieTogQW5kcmVzIFZlZ2EgR2FyY2lhCisKKyBJTlJJQSAtIFNvcGhpYSBBbnRpcG9saXMsIEZyYW5jZQorIGUtbWFpbDogYXZlZ2FAc29waGlhLmlucmlhLmZyCisgZmluZ2VyOiBhdmVnYUBwYXguaW5yaWEuZnIKKworICovCisKK0ZJTEVfTElDRU5DRSAoIEJTRDMgKTsKKworI2luY2x1ZGUgIm5pYy5oIgorCisvKgorICogRXRoZXJuZXQgc29mdHdhcmUgc3RhdHVzIHBlciBpbnRlcmZhY2UuCisgKi8KKy8qCisgKiBTb21lIGdsb2JhbCBjb25zdGFudHMKKyAqLworCisjZGVmaW5lIFRYX0lOSVRfUkFURQkJMTYKKyNkZWZpbmUgVFhfSU5JVF9NQVhfUkFURQk2NAorI2RlZmluZSBSWF9JTklUX0xBVEVOQ1kJCTY0CisjZGVmaW5lIFJYX0lOSVRfRUFSTFlfVEhSRVNICTY0CisjZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hGCTE2CS8qIG5vdCBsZXNzIHRoYW4gZXRoZXJfaGVhZGVyICovCisjZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hMCTQKKworI2RlZmluZSBFRVBST01TSVpFCTB4NDAKKyNkZWZpbmUgTUFYX0VFUFJPTUJVU1kJMTAwMAorI2RlZmluZSBFUF9JRF9QT1JUX1NUQVJUIDB4MTEwICAvKiBhdm9pZCAweDEwMCB0byBhdm9pZCBjb25mbGljdCB3aXRoIFNCMTYgKi8KKyNkZWZpbmUgRVBfSURfUE9SVF9JTkMgMHgxMAorI2RlZmluZSBFUF9JRF9QT1JUX0VORCAweDIwMAorI2RlZmluZSBFUF9UQUdfTUFYCQkweDcgLyogbXVzdCBiZSAyXm4gLSAxICovCisKKy8qCisgKiBDb21tYW5kcyB0byByZWFkL3dyaXRlIEVFUFJPTSB0cm91Z2ggRUVQUk9NIGNvbW1hbmQgcmVnaXN0ZXIgKFdpbmRvdyAwLAorICogT2Zmc2V0IDB4YSkKKyAqLworI2RlZmluZSBFRVBST01fQ01EX1JECTB4MDA4MAkvKiBSZWFkOiAgQWRkcmVzcyByZXF1aXJlZCAoNSBiaXRzKSAqLworI2RlZmluZSBFRVBST01fQ01EX1dSCTB4MDA0MAkvKiBXcml0ZTogQWRkcmVzcyByZXF1aXJlZCAoNSBiaXRzKSAqLworI2RlZmluZSBFRVBST01fQ01EX0VSQVNFIDB4MDBjMAkvKiBFcmFzZTogQWRkcmVzcyByZXF1aXJlZCAoNSBiaXRzKSAqLworI2RlZmluZSBFRVBST01fQ01EX0VXRU4JMHgwMDMwCS8qIEVyYXNlL1dyaXRlIEVuYWJsZTogTm8gZGF0YSByZXF1aXJlZCAqLworCisjZGVmaW5lIEVFUFJPTV9CVVNZCQkoMTw8MTUpCisjZGVmaW5lIEVFUFJPTV9UU1RfTU9ERQkJKDE8PDE0KQorCisvKgorICogU29tZSBzaG9ydCBmdW5jdGlvbnMsIHdvcnRoIHRvIGxldCB0aGVtIGJlIGEgbWFjcm8KKyAqLworI2RlZmluZSBpc19lZXByb21fYnVzeShiKSAoaW53KChiKStFUF9XMF9FRVBST01fQ09NTUFORCkmRUVQUk9NX0JVU1kpCisjZGVmaW5lIEdPX1dJTkRPVyhiLHgpCW91dHcoV0lORE9XX1NFTEVDVHwoeCksIChiKStFUF9DT01NQU5EKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGVzZSBkZWZpbmUgdGhlIEVFUFJPTSBkYXRhIHN0cnVjdHVyZS4gIFRoZXkgYXJlIHVzZWQgaW4gdGhlIHByb2JlCisgKiBmdW5jdGlvbiB0byB2ZXJpZnkgdGhlIGV4aXN0YW5jZSBvZiB0aGUgYWRhcHRlciBhZnRlciBoYXZpbmcgc2VudAorICogdGhlIElEX1NlcXVlbmNlLgorICoKKyAqIFRoZXJlIGFyZSBvdGhlcnMgYnV0IG9ubHkgdGhlIG9uZXMgd2UgdXNlIGFyZSBkZWZpbmVkIGhlcmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVFUFJPTV9OT0RFX0FERFJfMAkweDAJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fTk9ERV9BRERSXzEJMHgxCS8qIFdvcmQgKi8KKyNkZWZpbmUgRUVQUk9NX05PREVfQUREUl8yCTB4MgkvKiBXb3JkICovCisjZGVmaW5lIEVFUFJPTV9QUk9EX0lECQkweDMJLyogMHg5WzAtZl01MCAqLworI2RlZmluZSBFRVBST01fTUZHX0lECQkweDcJLyogMHg2ZDUwICovCisjZGVmaW5lIEVFUFJPTV9BRERSX0NGRwkJMHg4CS8qIEJhc2UgYWRkciAqLworI2RlZmluZSBFRVBST01fUkVTT1VSQ0VfQ0ZHCTB4OQkvKiBJUlEuIEJpdHMgMTItMTUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlc2UgYXJlIHRoZSByZWdpc3RlcnMgZm9yIHRoZSAzQ29tIDNjNTA5IGFuZCB0aGVpciBiaXQgcGF0dGVybnMgd2hlbgorICogYXBwbGljYWJsZS4gIFRoZXkgaGF2ZSBiZWVuIHRha2VuIG91dCB0aGUgdGhlICJFdGhlckxpbmsgSUlJIFBhcmFsbGVsCisgKiBUYXNraW5nIEVJU0EgYW5kIElTQSBUZWNobmljYWwgUmVmZXJlbmNlIiAiQmV0YSBEcmFmdCAxMC8zMC85MiIgbWFudWFsCisgKiBmcm9tIDNjb20uCisgKgorICogR2V0dGluZyB0aGlzIGRvY3VtZW50IG91dCBvZiAzQ29tIGlzIGFsbW9zdCBpbXBvc3NpYmxlLiAgSG93ZXZlciwKKyAqIGFyY2hpdmVkIGNvcGllcyBhcmUgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3Lm9zZGV2ZXIubmV0L2NvdHRvbnRhaWwvZG93bmxvYWRzL2RvY3MvM2M1eDliLnppcCBhbmQKKyAqIHNldmVyYWwgb3RoZXIgcGxhY2VzIG9uIHRoZSB3ZWIgKHNlYXJjaCBmb3IgM2M1eDliLnBkZikuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVQX0NPTU1BTkQJCTB4MGUJLyogV3JpdGUuIEJBU0UrMHgwZSBpcyBhbHdheXMgYQorCQkJCQkgKiBjb21tYW5kIHJlZy4gKi8KKyNkZWZpbmUgRVBfU1RBVFVTCQkweDBlCS8qIFJlYWQuIEJBU0UrMHgwZSBpcyBhbHdheXMgc3RhdHVzCisJCQkJCSAqIHJlZy4gKi8KKyNkZWZpbmUgRVBfV0lORE9XCQkweDBmCS8qIFJlYWQuIEJBU0UrMHgwZiBpcyBhbHdheXMgd2luZG93CisJCQkJCSAqIHJlZy4gKi8KKy8qCisgKiBXaW5kb3cgMCByZWdpc3RlcnMuIFNldHVwLgorICovCisvKiBXcml0ZSAqLworI2RlZmluZSBFUF9XMF9FRVBST01fREFUQQkweDBjCisjZGVmaW5lIEVQX1cwX0VFUFJPTV9DT01NQU5ECTB4MGEKKyNkZWZpbmUgRVBfVzBfUkVTT1VSQ0VfQ0ZHCTB4MDgKKyNkZWZpbmUgRVBfVzBfQUREUkVTU19DRkcJMHgwNgorI2RlZmluZSBFUF9XMF9DT05GSUdfQ1RSTAkweDA0CisvKiBSZWFkICovCisjZGVmaW5lIEVQX1cwX1BST0RVQ1RfSUQJMHgwMgorI2RlZmluZSBFUF9XMF9NRkdfSUQJCTB4MDAKKworLyoKKyAqIFdpbmRvdyAxIHJlZ2lzdGVycy4gT3BlcmF0aW5nIFNldC4KKyAqLworLyogV3JpdGUgKi8KKyNkZWZpbmUgRVBfVzFfVFhfUElPX1dSXzIJMHgwMgorI2RlZmluZSBFUF9XMV9UWF9QSU9fV1JfMQkweDAwCisvKiBSZWFkICovCisjZGVmaW5lIEVQX1cxX0ZSRUVfVFgJCTB4MGMKKyNkZWZpbmUgRVBfVzFfVFhfU1RBVFVTCQkweDBiCS8qIGJ5dGUgKi8KKyNkZWZpbmUgRVBfVzFfVElNRVIJCTB4MGEJLyogYnl0ZSAqLworI2RlZmluZSBFUF9XMV9SWF9TVEFUVVMJCTB4MDgKKyNkZWZpbmUgRVBfVzFfUlhfUElPX1JEXzIJMHgwMgorI2RlZmluZSBFUF9XMV9SWF9QSU9fUkRfMQkweDAwCisKKy8qCisgKiBXaW5kb3cgMiByZWdpc3RlcnMuIFN0YXRpb24gQWRkcmVzcyBTZXR1cC9SZWFkCisgKi8KKy8qIFJlYWQvV3JpdGUgKi8KKyNkZWZpbmUgRVBfVzJfQUREUl81CQkweDA1CisjZGVmaW5lIEVQX1cyX0FERFJfNAkJMHgwNAorI2RlZmluZSBFUF9XMl9BRERSXzMJCTB4MDMKKyNkZWZpbmUgRVBfVzJfQUREUl8yCQkweDAyCisjZGVmaW5lIEVQX1cyX0FERFJfMQkJMHgwMQorI2RlZmluZSBFUF9XMl9BRERSXzAJCTB4MDAKKworLyoKKyAqIFdpbmRvdyAzIHJlZ2lzdGVycy4gIEZJRk8gTWFuYWdlbWVudC4KKyAqLworLyogUmVhZCAqLworI2RlZmluZSBFUF9XM19GUkVFX1RYCQkweDBjCisjZGVmaW5lIEVQX1czX0ZSRUVfUlgJCTB4MGEKKworLyoKKyAqIFdpbmRvdyA0IHJlZ2lzdGVycy4gRGlhZ25vc3RpY3MuCisgKi8KKy8qIFJlYWQvV3JpdGUgKi8KKyNkZWZpbmUgRVBfVzRfTUVESUFfVFlQRQkweDBhCisjZGVmaW5lIEVQX1c0X0NUUkxSX1NUQVRVUwkweDA4CisjZGVmaW5lIEVQX1c0X05FVF9ESUFHCQkweDA2CisjZGVmaW5lIEVQX1c0X0ZJRk9fRElBRwkJMHgwNAorI2RlZmluZSBFUF9XNF9IT1NUX0RJQUcJCTB4MDIKKyNkZWZpbmUgRVBfVzRfVFhfRElBRwkJMHgwMAorCisvKgorICogV2luZG93IDUgUmVnaXN0ZXJzLiAgUmVzdWx0cyBhbmQgSW50ZXJuYWwgc3RhdHVzLgorICovCisvKiBSZWFkICovCisjZGVmaW5lIEVQX1c1X1JFQURfMF9NQVNLCTB4MGMKKyNkZWZpbmUgRVBfVzVfSU5UUl9NQVNLCQkweDBhCisjZGVmaW5lIEVQX1c1X1JYX0ZJTFRFUgkJMHgwOAorI2RlZmluZSBFUF9XNV9SWF9FQVJMWV9USFJFU0gJMHgwNgorI2RlZmluZSBFUF9XNV9UWF9BVkFJTF9USFJFU0gJMHgwMgorI2RlZmluZSBFUF9XNV9UWF9TVEFSVF9USFJFU0gJMHgwMAorCisvKgorICogV2luZG93IDYgcmVnaXN0ZXJzLiBTdGF0aXN0aWNzLgorICovCisvKiBSZWFkL1dyaXRlICovCisjZGVmaW5lIFRYX1RPVEFMX09LCQkweDBjCisjZGVmaW5lIFJYX1RPVEFMX09LCQkweDBhCisjZGVmaW5lIFRYX0RFRkVSUkFMUwkJMHgwOAorI2RlZmluZSBSWF9GUkFNRVNfT0sJCTB4MDcKKyNkZWZpbmUgVFhfRlJBTUVTX09LCQkweDA2CisjZGVmaW5lIFJYX09WRVJSVU5TCQkweDA1CisjZGVmaW5lIFRYX0NPTExJU0lPTlMJCTB4MDQKKyNkZWZpbmUgVFhfQUZURVJfMV9DT0xMSVNJT04JMHgwMworI2RlZmluZSBUWF9BRlRFUl9YX0NPTExJU0lPTlMJMHgwMgorI2RlZmluZSBUWF9OT19TUUUJCTB4MDEKKyNkZWZpbmUgVFhfQ0RfTE9TVAkJMHgwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlZ2lzdGVyIGRlZmluaXRpb25zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29tbWFuZCByZWdpc3Rlci4gQWxsIHdpbmRvd3MuCisgKgorICogMTYgYml0IHJlZ2lzdGVyLgorICogICAgIDE1LTExOiAgNS1iaXQgY29kZSBmb3IgY29tbWFuZCB0byBiZSBleGVjdXRlZC4KKyAqICAgICAxMC0wOiAgIDExLWJpdCBhcmcgaWYgYW55LiBGb3IgY29tbWFuZHMgd2l0aCBubyBhcmdzOworICoJICAgICAgdGhpcyBjYW4gYmUgc2V0IHRvIGFueXRoaW5nLgorICovCisjZGVmaW5lIEdMT0JBTF9SRVNFVAkJKHVuc2lnbmVkIHNob3J0KSAweDAwMDAJLyogV2FpdCBhdCBsZWFzdCAxbXMKKwkJCQkJCQkgKiBhZnRlciBpc3N1aW5nICovCisjZGVmaW5lIFdJTkRPV19TRUxFQ1QJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTw8MTEpCisjZGVmaW5lIFNUQVJUX1RSQU5TQ0VJVkVSCSh1bnNpZ25lZCBzaG9ydCkgKDB4Mjw8MTEpCS8qIFJlYWQgQUREUl9DRkcgcmVnIHRvCisJCQkJCQkJICogZGV0ZXJtaW5lIHdoZXRoZXIKKwkJCQkJCQkgKiB0aGlzIGlzIG5lZWRlZC4gSWYKKwkJCQkJCQkgKiBzbzsgd2FpdCA4MDAgdVNlYworCQkJCQkJCSAqIGJlZm9yZSB1c2luZyB0cmFucy0KKwkJCQkJCQkgKiBjZWl2ZXIuICovCisjZGVmaW5lIFJYX0RJU0FCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Mzw8MTEpCS8qIHN0YXRlIGRpc2FibGVkIG9uCisJCQkJCQkJICogcG93ZXItdXAgKi8KKyNkZWZpbmUgUlhfRU5BQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDQ8PDExKQorI2RlZmluZSBSWF9SRVNFVAkJKHVuc2lnbmVkIHNob3J0KSAoMHg1PDwxMSkKKyNkZWZpbmUgUlhfRElTQ0FSRF9UT1BfUEFDSwkodW5zaWduZWQgc2hvcnQpICgweDg8PDExKQorI2RlZmluZSBUWF9FTkFCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4OTw8MTEpCisjZGVmaW5lIFRYX0RJU0FCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4YTw8MTEpCisjZGVmaW5lIFRYX1JFU0VUCQkodW5zaWduZWQgc2hvcnQpICgweGI8PDExKQorI2RlZmluZSBSRVFfSU5UUgkJKHVuc2lnbmVkIHNob3J0KSAoMHhjPDwxMSkKKyNkZWZpbmUgU0VUX0lOVFJfTUFTSwkJKHVuc2lnbmVkIHNob3J0KSAoMHhlPDwxMSkKKyNkZWZpbmUgU0VUX1JEXzBfTUFTSwkJKHVuc2lnbmVkIHNob3J0KSAoMHhmPDwxMSkKKyNkZWZpbmUgU0VUX1JYX0ZJTFRFUgkJKHVuc2lnbmVkIHNob3J0KSAoMHgxMDw8MTEpCisjZGVmaW5lIEZJTF9JTkRJVklEVUFMCSh1bnNpZ25lZCBzaG9ydCkgKDB4MSkKKyNkZWZpbmUgRklMX0dST1VQCQkodW5zaWduZWQgc2hvcnQpICgweDIpCisjZGVmaW5lIEZJTF9CUkRDU1QJKHVuc2lnbmVkIHNob3J0KSAoMHg0KQorI2RlZmluZSBGSUxfQUxMCQkodW5zaWduZWQgc2hvcnQpICgweDgpCisjZGVmaW5lIFNFVF9SWF9FQVJMWV9USFJFU0gJKHVuc2lnbmVkIHNob3J0KSAoMHgxMTw8MTEpCisjZGVmaW5lIFNFVF9UWF9BVkFJTF9USFJFU0gJKHVuc2lnbmVkIHNob3J0KSAoMHgxMjw8MTEpCisjZGVmaW5lIFNFVF9UWF9TVEFSVF9USFJFU0gJKHVuc2lnbmVkIHNob3J0KSAoMHgxMzw8MTEpCisjZGVmaW5lIFNUQVRTX0VOQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgxNTw8MTEpCisjZGVmaW5lIFNUQVRTX0RJU0FCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTY8PDExKQorI2RlZmluZSBTVE9QX1RSQU5TQ0VJVkVSCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTc8PDExKQorLyoKKyAqIFRoZSBmb2xsb3dpbmcgQ18qIGFja25vd2xlZGdlIHRoZSB2YXJpb3VzIGludGVycnVwdHMuIFNvbWUgb2YgdGhlbSBkb24ndAorICogZG8gYW55dGhpbmcuICBTZWUgdGhlIG1hbnVhbC4KKyAqLworI2RlZmluZSBBQ0tfSU5UUgkJKHVuc2lnbmVkIHNob3J0KSAoMHg2ODAwKQorI2RlZmluZSBDX0lOVFJfTEFUQ0gJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgxKQorI2RlZmluZSBDX0NBUkRfRkFJTFVSRQkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDIpCisjZGVmaW5lIENfVFhfQ09NUExFVEUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHg0KQorI2RlZmluZSBDX1RYX0FWQUlMCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4OCkKKyNkZWZpbmUgQ19SWF9DT01QTEVURQkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDEwKQorI2RlZmluZSBDX1JYX0VBUkxZCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MjApCisjZGVmaW5lIENfSU5UX1JRRAkJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHg0MCkKKyNkZWZpbmUgQ19VUERfU1RBVFMJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHg4MCkKKworLyoKKyAqIFN0YXR1cyByZWdpc3Rlci4gQWxsIHdpbmRvd3MuCisgKgorICogICAgIDE1LTEzOiAgV2luZG93IG51bWJlcigwLTcpLgorICogICAgIDEyOiAgICAgQ29tbWFuZF9pbl9wcm9ncmVzcy4KKyAqICAgICAxMTogICAgIHJlc2VydmVkLgorICogICAgIDEwOiAgICAgcmVzZXJ2ZWQuCisgKiAgICAgOTogICAgICByZXNlcnZlZC4KKyAqICAgICA4OiAgICAgIHJlc2VydmVkLgorICogICAgIDc6ICAgICAgVXBkYXRlIFN0YXRpc3RpY3MuCisgKiAgICAgNjogICAgICBJbnRlcnJ1cHQgUmVxdWVzdGVkLgorICogICAgIDU6ICAgICAgUlggRWFybHkuCisgKiAgICAgNDogICAgICBSWCBDb21wbGV0ZS4KKyAqICAgICAzOiAgICAgIFRYIEF2YWlsYWJsZS4KKyAqICAgICAyOiAgICAgIFRYIENvbXBsZXRlLgorICogICAgIDE6ICAgICAgQWRhcHRlciBGYWlsdXJlLgorICogICAgIDA6ICAgICAgSW50ZXJydXB0IExhdGNoLgorICovCisjZGVmaW5lIFNfSU5UUl9MQVRDSAkJKHVuc2lnbmVkIHNob3J0KSAoMHgxKQorI2RlZmluZSBTX0NBUkRfRkFJTFVSRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgyKQorI2RlZmluZSBTX1RYX0NPTVBMRVRFCQkodW5zaWduZWQgc2hvcnQpICgweDQpCisjZGVmaW5lIFNfVFhfQVZBSUwJCSh1bnNpZ25lZCBzaG9ydCkgKDB4OCkKKyNkZWZpbmUgU19SWF9DT01QTEVURQkJKHVuc2lnbmVkIHNob3J0KSAoMHgxMCkKKyNkZWZpbmUgU19SWF9FQVJMWQkJKHVuc2lnbmVkIHNob3J0KSAoMHgyMCkKKyNkZWZpbmUgU19JTlRfUlFECQkodW5zaWduZWQgc2hvcnQpICgweDQwKQorI2RlZmluZSBTX1VQRF9TVEFUUwkJKHVuc2lnbmVkIHNob3J0KSAoMHg4MCkKKyNkZWZpbmUgU181X0lOVFMJCShTX0NBUkRfRkFJTFVSRXxTX1RYX0NPTVBMRVRFfFwKKwkJCQkgU19UWF9BVkFJTHxTX1JYX0NPTVBMRVRFfFNfUlhfRUFSTFkpCisjZGVmaW5lIFNfQ09NTUFORF9JTl9QUk9HUkVTUwkodW5zaWduZWQgc2hvcnQpICgweDEwMDApCisKKy8qCisgKiBGSUZPIFJlZ2lzdGVycy4KKyAqIFJYIFN0YXR1cy4gV2luZG93IDEvUG9ydCAwOAorICoKKyAqICAgICAxNTogICAgIEluY29tcGxldGUgb3IgRklGTyBlbXB0eS4KKyAqICAgICAxNDogICAgIDE6IEVycm9yIGluIFJYIFBhY2tldCAgIDA6IEluY29tcGxldGUgb3Igbm8gZXJyb3IuCisgKiAgICAgMTMtMTE6ICBUeXBlIG9mIGVycm9yLgorICoJICAgICAgMTAwMCA9IE92ZXJydW4uCisgKgkgICAgICAxMDExID0gUnVuIFBhY2tldCBFcnJvci4KKyAqCSAgICAgIDExMDAgPSBBbGlnbm1lbnQgRXJyb3IuCisgKgkgICAgICAxMTAxID0gQ1JDIEVycm9yLgorICoJICAgICAgMTAwMSA9IE92ZXJzaXplIFBhY2tldCBFcnJvciAoPjE1MTQgYnl0ZXMpCisgKgkgICAgICAwMDEwID0gRHJpYmJsZSBCaXRzLgorICoJICAgICAgKGFsbCBvdGhlciBlcnJvciBjb2Rlcywgbm8gZXJyb3JzLikKKyAqCisgKiAgICAgMTAtMDogICBSWCBCeXRlcyAoMC0xNTE0KQorICovCisjZGVmaW5lIEVSUl9SWF9JTkNPTVBMRVRFCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTw8MTUpCisjZGVmaW5lIEVSUl9SWAkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTw8MTQpCisjZGVmaW5lIEVSUl9SWF9PVkVSUlVOCQkodW5zaWduZWQgc2hvcnQpICgweDg8PDExKQorI2RlZmluZSBFUlJfUlhfUlVOX1BLVAkJKHVuc2lnbmVkIHNob3J0KSAoMHhiPDwxMSkKKyNkZWZpbmUgRVJSX1JYX0FMSUdOCQkodW5zaWduZWQgc2hvcnQpICgweGM8PDExKQorI2RlZmluZSBFUlJfUlhfQ1JDCQkodW5zaWduZWQgc2hvcnQpICgweGQ8PDExKQorI2RlZmluZSBFUlJfUlhfT1ZFUlNJWkUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4OTw8MTEpCisjZGVmaW5lIEVSUl9SWF9EUklCQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDI8PDExKQorCisvKgorICogRklGTyBSZWdpc3RlcnMuCisgKiBUWCBTdGF0dXMuIFdpbmRvdyAxL1BvcnQgMEIKKyAqCisgKiAgIFJlcG9ydHMgdGhlIHRyYW5zbWl0IHN0YXR1cyBvZiBhIGNvbXBsZXRlZCB0cmFuc21pc3Npb24uIFdyaXRpbmcgdGhpcworICogICByZWdpc3RlciBwb3BzIHRoZSB0cmFuc21pdCBjb21wbGV0aW9uIHN0YWNrLgorICoKKyAqICAgV2luZG93IDEvUG9ydCAweDBiLgorICoKKyAqICAgICA3OiAgICAgIENvbXBsZXRlCisgKiAgICAgNjogICAgICBJbnRlcnJ1cHQgb24gc3VjY2Vzc2Z1bCB0cmFuc21pc3Npb24gcmVxdWVzdGVkLgorICogICAgIDU6ICAgICAgSmFiYmVyIEVycm9yIChUUCBPbmx5LCBUWCBSZXNldCByZXF1aXJlZC4gKQorICogICAgIDQ6ICAgICAgVW5kZXJydW4gKFRYIFJlc2V0IHJlcXVpcmVkLiApCisgKiAgICAgMzogICAgICBNYXhpbXVtIENvbGxpc2lvbnMuCisgKiAgICAgMjogICAgICBUWCBTdGF0dXMgT3ZlcmZsb3cuCisgKiAgICAgMS0wOiAgICBVbmRlZmluZWQuCisgKgorICovCisjZGVmaW5lIFRYU19DT01QTEVURQkJMHg4MAorI2RlZmluZSBUWFNfU1VDQ0VTX0lOVFJfUkVRCQkweDQwCisjZGVmaW5lIFRYU19KQUJCRVIJCTB4MjAKKyNkZWZpbmUgVFhTX1VOREVSUlVOCQkweDEwCisjZGVmaW5lIFRYU19NQVhfQ09MTElTSU9OCTB4OAorI2RlZmluZSBUWFNfU1RBVFVTX09WRVJGTE9XCTB4NAorCisvKgorICogQ29uZmlndXJhdGlvbiBjb250cm9sIHJlZ2lzdGVyLgorICogV2luZG93IDAvUG9ydCAwNAorICovCisvKiBSZWFkICovCisjZGVmaW5lIElTX0FVSQkJCQkoMTw8MTMpCisjZGVmaW5lIElTX0JOQwkJCQkoMTw8MTIpCisjZGVmaW5lIElTX1VUUAkJCQkoMTw8OSkKKy8qIFdyaXRlICovCisjZGVmaW5lIEVOQUJMRV9EUlFfSVJRCQkJMHgwMDAxCisjZGVmaW5lIFcwX1A0X0NNRF9SRVNFVF9BREFQVEVSCQkweDQKKyNkZWZpbmUgVzBfUDRfQ01EX0VOQUJMRV9BREFQVEVSCTB4MQorLyoKKyAqIE1lZGlhIHR5cGUgYW5kIHN0YXR1cy4KKyAqIFdpbmRvdyA0L1BvcnQgMEEKKyAqLworI2RlZmluZSBFTkFCTEVfVVRQCQkJMHhjMAorI2RlZmluZSBESVNBQkxFX1VUUAkJCTB4MAorCisvKgorICogUmVzb3VyY2UgY29udHJvbCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgU0VUX0lSUShpKQkoICgoaSk8PDEyKSB8IDB4RjAwKSAvKiBzZXQgSVJRIGkgKi8KKworLyoKKyAqIFJlY2VpdmUgc3RhdHVzIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSWF9CWVRFU19NQVNLCQkJKHVuc2lnbmVkIHNob3J0KSAoMHgwN2ZmKQorI2RlZmluZSBSWF9FUlJPUgkweDQwMDAKKyNkZWZpbmUgUlhfSU5DT01QTEVURQkweDgwMDAKKworLyoKKyAqIE1pc2MgZGVmaW5lcyBmb3IgdmFyaW91cyB0aGluZ3MuCisgKi8KKyNkZWZpbmUgTUZHX0lECQkJCTB4NmQ1MCAvKiBpbiBFRVBST00gYW5kIFcwIEFERFJfQ09ORklHICovCisjZGVmaW5lIFBST0RfSUQJCQkJMHg5MTUwCisKKyNkZWZpbmUgQVVJCQkJCTB4MQorI2RlZmluZSBCTkMJCQkJMHgyCisjZGVmaW5lIFVUUAkJCQkweDQKKworI2RlZmluZSBSWF9CWVRFU19NQVNLCQkJKHVuc2lnbmVkIHNob3J0KSAoMHgwN2ZmKQorCisvKgorICogRnVuY3Rpb24gc2hhcmVkIGJldHdlZW4gM2M1MDkuYyBhbmQgM2M1MjkuYworICovCitleHRlcm4gaW50IHQ1eDlfcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsCisJCQl1aW50MTZfdCBwcm9kX2lkX2NoZWNrLCB1aW50MTZfdCBwcm9kX2lkX21hc2sgKTsKK2V4dGVybiB2b2lkIHQ1eDlfZGlzYWJsZSAoIHN0cnVjdCBuaWMgKm5pYyApOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNTE1LmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzUxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTU2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzUxNS5jCkBAIC0wLDAgKzEsNzYzIEBACisvKgorKiAgICAzYzUxNS5jIC0tIDNDT00gM0M1MTUgRmFzdCBFdGhlcmxpbmsgSVNBIDEwLzEwMEJBU0UtVFggZHJpdmVyIGZvciBldGhlcmJvb3QKKyogICAgQ29weXJpZ2h0IChDKSAyMDAyIFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogUG9ydGlvbnMgb2YgdGhpcyBjb2RlOgorKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBEb25hbGQgQmVja2VyICAzYzUxNS5jOiBBIDNDb20gSVNBIEV0aGVyTGluayBYTCAiQ29ya3NjcmV3IiBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LgorKiBDb3B5cmlnaHQgKEMpIDIwMDEgUC5KLkguRm94IChmb3hAcm9lc3RvY2suZGVtb24uY28udWspIElTQVBOUCBUb29scworKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiAgSVNBIFBsdWcgJiBQbGF5IHN1cHBvcnQgTGludXggS2VybmVsCisqIENvcHlyaWdodCAoQykgMjAwMCBTaHVzdWtlIE5pc2l5YW1hIDxzaHVAYXRoZW5hLnFlLmVuZy5ob2t1ZGFpLmFjLmpwPiBldGhlcmJvb3QtNS4wLjUgM2M1OTUuYworKiBDb3B0cmlnaHQgKEMpIDE5OTUgTWFydGluIFJlbnRlcnMgZXRoZXJib290LTUuMC41IDNjNTA5LmMKKyogQ29weXJpZ2h0IChDKSAxOTk5IExpZ2h0U3lzIFRlY2hub2xvZ3kgU2VydmljZXMsIEluYy4gZXRoZXJib290LTUuMC41IDNjOTB4LmMKKyogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAxOTk5IFN0ZXZlIFNtaXRoIGV0aGVyYm9vdC01LjAuNSAzYzkweC5jCisqCisqIFRoZSBwcm9iZSBhbmQgcmVzZXQgZnVuY3Rpb25zIGFuZCBkZWZpbmVzIGFyZSBkaXJlY3QgY29waWVzIGZyb20gdGhlCisqIEJlY2tlciBjb2RlIG1vZGlmaWVkIHdoZXJlIG5lY2Vzc2FyeSB0byBtYWtlIGl0IHdvcmsgZm9yIGV0aGVyYm9vdAorKgorKiBUaGUgcG9sbCBhbmQgdHJhbnNtaXQgZnVuY3Rpb25zIGVpdGhlciBjb250YWluIGNvZGUgZnJvbSBvciB3ZXJlIHdyaXR0ZW4gYnkgcmVmZXJlbmNpbmcKKyogdGhlIGFib3ZlIHJlZmVyZW5jZWQgZXRoZXJib290IGRyaXZlcnMuICBUaGlzIGRyaXZlciB3b3VsZCBub3QgaGF2ZSBiZWVuCisqIHBvc3NpYmxlIHdpdGhvdXQgdGhpcyBwcmlvciB3b3JrCisqCisqIFJFVklTSU9OIEhJU1RPUlk6CisqID09PT09PT09PT09PT09PT0KKyogdjAuMTAJNC0xNy0yMDAyCVRKTAlJbml0aWFsIGltcGxlbWVudGF0aW9uLgorKiB2MC4xMSA0LTE3LTIwMDIgICAgICAgVEpMICAgICBDbGVhbnVwIG9mIHRoZSBjb2RlCisqIHYwLjEyIDQtMjYtMjAwMiAgICAgICBUSkwgICAgIEFkZGVkIElTQSBQbHVnIGFuZCBQbGF5IGZvciBOb24tUE5QIEJpb3NlcworKiB2MC4xMyA2LTEwLTIwMDIgICAgICAgVEpMICAgICBGaXhlZCBJU0FfUE5QIE1BQyBBZGRyZXNzIHByb2JsZW0KKyogdjAuMTQgOS0yMy0yMDAzCVRKTAlSZXBsYWNlZCBkZWxheSB3aXRoIGN1cnJ0aWNrcworKgorKiBJbmRlbnQgT3B0aW9uczogaW5kZW50IC1rciAtaTgKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlIDxncHhlL2lzYXBucC5oPgorI2luY2x1ZGUgPGdweGUvaXNhLmg+IC8qIGZvciBJU0FfUk9NICovCisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorCitzdGF0aWMgdm9pZCB0M2M1MTVfd2FpdCh1bnNpZ25lZCBpbnQgbnRpY2tzKQoreworCXVuc2lnbmVkIGludCB0byA9IGN1cnJ0aWNrcygpICsgbnRpY2tzOworCXdoaWxlIChjdXJydGlja3MoKSA8IHRvKQorCQkvKiB3YWl0ICovIDsKK30KKworLyogVEpMIGRlZmluYXRpb25zICovCisjZGVmaW5lIEhaICAgICAgMTAwCitzdGF0aWMgaW50IGlmX3BvcnQ7CitzdGF0aWMgc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICp2cDsKKy8qIEJyb3VnaHQgZGlyZWN0bHkgZnJvbSAzYzUxNS5jIGJ5IEJlY2tlciAqLworI2RlZmluZSBDT1JLU0NSRVcgMQorCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0Lgorc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyMDsKKyovCisKKy8qIEVuYWJsZSB0aGUgYXV0b21hdGljIG1lZGlhIHNlbGVjdGlvbiBjb2RlIC0tIHVzdWFsbHkgc2V0LiAqLworI2RlZmluZSBBVVRPTUVESUEgMQorCisvKiBBbGxvdyB0aGUgdXNlIG9mIGZyYWdtZW50IGJ1cyBtYXN0ZXIgdHJhbnNmZXJzIGluc3RlYWQgb2Ygb25seQorICAgcHJvZ3JhbW1lZC1JL08gZm9yIFZvcnRleCBjYXJkcy4gIEZ1bGwtYnVzLW1hc3RlciB0cmFuc2ZlcnMgYXJlIGFsd2F5cworICAgZW5hYmxlZCBieSBkZWZhdWx0IG9uIEJvb21lcmFuZyBjYXJkcy4gIElmIFZPUlRFWF9CVVNfTUFTVEVSIGlzIGRlZmluZWQsCisgICB0aGUgZmVhdHVyZSBtYXkgYmUgdHVybmVkIG9uIHVzaW5nICdvcHRpb25zJy4gKi8KKyNkZWZpbmUgVk9SVEVYX0JVU19NQVNURVIKKworLyogQSBmZXcgdmFsdWVzIHRoYXQgbWF5IGJlIHR3ZWFrZWQuICovCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBlZmZpY2llbmN5LiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMTYKKyNkZWZpbmUgUlhfUklOR19TSVpFCTE2CisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuICovCisKKy8qICJLbm9icyIgZm9yIGFkanVzdGluZyBpbnRlcm5hbCBwYXJhbWV0ZXJzLiAqLworLyogUHV0IG91dCBzb21ld2hhdCBtb3JlIGRlYnVnZ2luZyBtZXNzYWdlcy4gKDAgLSBubyBtc2csIDEgbWluaW1hbCBtc2dzKS4gKi8KKyNkZWZpbmUgRFJJVkVSX0RFQlVHIDEKKy8qIFNvbWUgdmFsdWVzIGhlcmUgb25seSBmb3IgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiBhbmQgcGF0aC1jb3ZlcmFnZQorICAgZGVidWdnaW5nLgorc3RhdGljIGludCByeF9ub2NvcHksIHJ4X2NvcHksIHF1ZXVlZF9wYWNrZXQ7CisqLworCisjZGVmaW5lIENPUktTQ1JFV19JRCAxMAorCisjZGVmaW5lIEVMM1dJTkRPVyh3aW5fbnVtKSBcCisJb3V0dyhTZWxlY3RXaW5kb3cgKyAod2luX251bSksIG5pYy0+aW9hZGRyICsgRUwzX0NNRCkKKyNkZWZpbmUgRUwzX0NNRCAweDBlCisjZGVmaW5lIEVMM19TVEFUVVMgMHgwZQorI2RlZmluZSBSWF9CWVRFU19NQVNLCQkJKHVuc2lnbmVkIHNob3J0KSAoMHgwN2ZmKQorCitlbnVtIGNvcmtzY3Jld19jbWQgeworCVRvdGFsUmVzZXQgPSAwIDw8IDExLCBTZWxlY3RXaW5kb3cgPSAxIDw8IDExLCBTdGFydENvYXggPSAyIDw8IDExLAorCVJ4RGlzYWJsZSA9IDMgPDwgMTEsIFJ4RW5hYmxlID0gNCA8PCAxMSwgUnhSZXNldCA9IDUgPDwgMTEsCisJVXBTdGFsbCA9IDYgPDwgMTEsIFVwVW5zdGFsbCA9ICg2IDw8IDExKSArIDEsCisJRG93blN0YWxsID0gKDYgPDwgMTEpICsgMiwgRG93blVuc3RhbGwgPSAoNiA8PCAxMSkgKyAzLAorCVJ4RGlzY2FyZCA9IDggPDwgMTEsIFR4RW5hYmxlID0gOSA8PCAxMSwgVHhEaXNhYmxlID0KKwkgICAgMTAgPDwgMTEsIFR4UmVzZXQgPSAxMSA8PCAxMSwKKwlGYWtlSW50ciA9IDEyIDw8IDExLCBBY2tJbnRyID0gMTMgPDwgMTEsIFNldEludHJFbmIgPSAxNCA8PCAxMSwKKwlTZXRTdGF0dXNFbmIgPSAxNSA8PCAxMSwgU2V0UnhGaWx0ZXIgPSAxNiA8PCAxMSwgU2V0UnhUaHJlc2hvbGQgPQorCSAgICAxNyA8PCAxMSwKKwlTZXRUeFRocmVzaG9sZCA9IDE4IDw8IDExLCBTZXRUeFN0YXJ0ID0gMTkgPDwgMTEsCisJU3RhcnRETUFVcCA9IDIwIDw8IDExLCBTdGFydERNQURvd24gPSAoMjAgPDwgMTEpICsgMSwgU3RhdHNFbmFibGUgPQorCSAgICAyMSA8PCAxMSwKKwlTdGF0c0Rpc2FibGUgPSAyMiA8PCAxMSwgU3RvcENvYXggPSAyMyA8PCAxMSwKK307CisKKy8qIFRoZSBTZXRSeEZpbHRlciBjb21tYW5kIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOiAqLworZW51bSBSeEZpbHRlciB7CisJUnhTdGF0aW9uID0gMSwgUnhNdWx0aWNhc3QgPSAyLCBSeEJyb2FkY2FzdCA9IDQsIFJ4UHJvbSA9IDgKK307CisKKy8qIEJpdHMgaW4gdGhlIGdlbmVyYWwgc3RhdHVzIHJlZ2lzdGVyLiAqLworZW51bSBjb3Jrc2NyZXdfc3RhdHVzIHsKKwlJbnRMYXRjaCA9IDB4MDAwMSwgQWRhcHRlckZhaWx1cmUgPSAweDAwMDIsIFR4Q29tcGxldGUgPSAweDAwMDQsCisJVHhBdmFpbGFibGUgPSAweDAwMDgsIFJ4Q29tcGxldGUgPSAweDAwMTAsIFJ4RWFybHkgPSAweDAwMjAsCisJSW50UmVxID0gMHgwMDQwLCBTdGF0c0Z1bGwgPSAweDAwODAsCisJRE1BRG9uZSA9IDEgPDwgOCwgRG93bkNvbXBsZXRlID0gMSA8PCA5LCBVcENvbXBsZXRlID0gMSA8PCAxMCwKKwlETUFJblByb2dyZXNzID0gMSA8PCAxMSwJLyogRE1BIGNvbnRyb2xsZXIgaXMgc3RpbGwgYnVzeS4gKi8KKwlDbWRJblByb2dyZXNzID0gMSA8PCAxMiwJLyogRUwzX0NNRCBpcyBzdGlsbCBidXN5LiAqLworfTsKKworLyogUmVnaXN0ZXIgd2luZG93IDEgb2Zmc2V0cywgdGhlIHdpbmRvdyB1c2VkIGluIG5vcm1hbCBvcGVyYXRpb24uCisgICBPbiB0aGUgQ29ya3NjcmV3IHRoaXMgd2luZG93IGlzIGFsd2F5cyBtYXBwZWQgYXQgb2Zmc2V0cyAweDEwLTB4MWYuICovCitlbnVtIFdpbmRvdzEgeworCVRYX0ZJRk8gPSAweDEwLCBSWF9GSUZPID0gMHgxMCwgUnhFcnJvcnMgPSAweDE0LAorCVJ4U3RhdHVzID0gMHgxOCwgVGltZXIgPSAweDFBLCBUeFN0YXR1cyA9IDB4MUIsCisJVHhGcmVlID0gMHgxQywJCS8qIFJlbWFpbmluZyBmcmVlIGJ5dGVzIGluIFR4IGJ1ZmZlci4gKi8KK307CitlbnVtIFdpbmRvdzAgeworCVduMElSUSA9IDB4MDgsCisjaWYgZGVmaW5lZChDT1JLU0NSRVcpCisJV24wRWVwcm9tQ21kID0gMHgyMDBBLAkvKiBDb3Jrc2NyZXcgRUVQUk9NIGNvbW1hbmQgcmVnaXN0ZXIuICovCisJV24wRWVwcm9tRGF0YSA9IDB4MjAwQywJLyogQ29ya3NjcmV3IEVFUFJPTSByZXN1bHRzIHJlZ2lzdGVyLiAqLworI2Vsc2UKKwlXbjBFZXByb21DbWQgPSAxMCwJLyogV2luZG93IDA6IEVFUFJPTSBjb21tYW5kIHJlZ2lzdGVyLiAqLworCVduMEVlcHJvbURhdGEgPSAxMiwJLyogV2luZG93IDA6IEVFUFJPTSByZXN1bHRzIHJlZ2lzdGVyLiAqLworI2VuZGlmCit9OworZW51bSBXaW4wX0VFUFJPTV9iaXRzIHsKKwlFRVBST01fUmVhZCA9IDB4ODAsIEVFUFJPTV9XUklURSA9IDB4NDAsIEVFUFJPTV9FUkFTRSA9IDB4QzAsCisJRUVQUk9NX0VXRU5CID0gMHgzMCwJLyogRW5hYmxlIGVyYXNpbmcvd3JpdGluZyBmb3IgMTAgbXNlYy4gKi8KKwlFRVBST01fRVdESVMgPSAweDAwLAkvKiBEaXNhYmxlIEVXRU5CIGJlZm9yZSAxMCBtc2VjIHRpbWVvdXQuICovCit9OworCitlbnVtIFdpbmRvdzMgewkJCS8qIFdpbmRvdyAzOiBNQUMvY29uZmlnIGJpdHMuICovCisJV24zX0NvbmZpZyA9IDAsIFduM19NQUNfQ3RybCA9IDYsIFduM19PcHRpb25zID0gOCwKK307Cit1bmlvbiB3bjNfY29uZmlnIHsKKwlpbnQgaTsKKwlzdHJ1Y3QgdzNfY29uZmlnX2ZpZWxkcyB7CisJCXVuc2lnbmVkIGludCByYW1fc2l6ZTozLCByYW1fd2lkdGg6MSwgcmFtX3NwZWVkOjIsCisJCSAgICByb21fc2l6ZToyOworCQlpbnQgcGFkODo4OworCQl1bnNpZ25lZCBpbnQgcmFtX3NwbGl0OjIsIHBhZDE4OjIsIHhjdnI6MywgcGFkMjE6MSwKKwkJICAgIGF1dG9zZWxlY3Q6MTsKKwkJaW50IHBhZDI0Ojc7CisJfSB1OworfTsKKworZW51bSBXaW5kb3c0IHsKKwlXbjRfTmV0RGlhZyA9IDYsIFduNF9NZWRpYSA9IDEwLAkvKiBXaW5kb3cgNDogWGN2ci9tZWRpYSBiaXRzLiAqLworfTsKK2VudW0gV2luNF9NZWRpYV9iaXRzIHsKKwlNZWRpYV9TUUUgPSAweDAwMDgsCS8qIEVuYWJsZSBTUUUgZXJyb3IgY291bnRpbmcgZm9yIEFVSS4gKi8KKwlNZWRpYV8xMFRQID0gMHgwMEMwLAkvKiBFbmFibGUgbGluayBiZWF0IGFuZCBqYWJiZXIgZm9yIDEwYmFzZVQuICovCisJTWVkaWFfTG5rID0gMHgwMDgwLAkvKiBFbmFibGUganVzdCBsaW5rIGJlYXQgZm9yIDEwMFRYLzEwMEZYLiAqLworCU1lZGlhX0xua0JlYXQgPSAweDA4MDAsCit9OworZW51bSBXaW5kb3c3IHsJCQkvKiBXaW5kb3cgNzogQnVzIE1hc3RlciBjb250cm9sLiAqLworCVduN19NYXN0ZXJBZGRyID0gMCwgV243X01hc3RlckxlbiA9IDYsIFduN19NYXN0ZXJTdGF0dXMgPSAxMiwKK307CisKKy8qIEJvb21lcmFuZy1zdHlsZSBidXMgbWFzdGVyIGNvbnRyb2wgcmVnaXN0ZXJzLiAgTm90ZSBJU0EgYWxpYXNlcyEgKi8KK2VudW0gTWFzdGVyQ3RybCB7CisJUGt0U3RhdHVzID0gMHg0MDAsIERvd25MaXN0UHRyID0gMHg0MDQsIEZyYWdBZGRyID0gMHg0MDgsIEZyYWdMZW4gPQorCSAgICAweDQwYywKKwlUeEZyZWVUaHJlc2hvbGQgPSAweDQwZiwgVXBQa3RTdGF0dXMgPSAweDQxMCwgVXBMaXN0UHRyID0gMHg0MTgsCit9OworCisvKiBUaGUgUnggYW5kIFR4IGRlc2NyaXB0b3IgbGlzdHMuCisgICBDYXV0aW9uIEFscGhhIGhhY2tlcnM6IHRoZXNlIHR5cGVzIGFyZSAzMiBiaXRzISAgTm90ZSBhbHNvIHRoZSA4IGJ5dGUKKyAgIGFsaWdubWVudCBjb250cmFpbnQgb24gdHhfcmluZ1tdIGFuZCByeF9yaW5nW10uICovCitzdHJ1Y3QgYm9vbV9yeF9kZXNjIHsKKwl1MzIgbmV4dDsKKwlzMzIgc3RhdHVzOworCXUzMiBhZGRyOworCXMzMiBsZW5ndGg7Cit9OworCisvKiBWYWx1ZXMgZm9yIHRoZSBSeCBzdGF0dXMgZW50cnkuICovCitlbnVtIHJ4X2Rlc2Nfc3RhdHVzIHsKKwlSeERDb21wbGV0ZSA9IDB4MDAwMDgwMDAsIFJ4REVycm9yID0gMHg0MDAwLAorCS8qIFNlZSBib29tZXJhbmdfcngoKSBmb3IgYWN0dWFsIGVycm9yIGJpdHMgKi8KK307CisKK3N0cnVjdCBib29tX3R4X2Rlc2MgeworCXUzMiBuZXh0OworCXMzMiBzdGF0dXM7CisJdTMyIGFkZHI7CisJczMyIGxlbmd0aDsKK307CisKK3N0cnVjdCBjb3Jrc2NyZXdfcHJpdmF0ZSB7CisJY29uc3QgY2hhciAqcHJvZHVjdF9uYW1lOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X21vZHVsZTsKKwkvKiBUaGUgUnggYW5kIFR4IHJpbmdzIGFyZSBoZXJlIHRvIGtlZXAgdGhlbSBxdWFkLXdvcmQtYWxpZ25lZC4gKi8KKwlzdHJ1Y3QgYm9vbV9yeF9kZXNjIHJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgYm9vbV90eF9kZXNjIHR4X3JpbmdbVFhfUklOR19TSVpFXTsKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHRyYW5zbWl0LSBhbmQgcmVjZWl2ZS1pbi1wbGFjZSBza2J1ZmZzLiAqLworCXN0cnVjdCBza19idWZmICpyeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwl1bnNpZ25lZCBpbnQgZGlydHlfcngsIGRpcnR5X3R4OwkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLworCXN0cnVjdCBza19idWZmICp0eF9za2I7CS8qIFBhY2tldCBiZWluZyBlYXRlbiBieSBidXMgbWFzdGVyIGN0cmwuICAqLworCWludCBjYXBhYmlsaXRpZXM7CS8qIEFkYXB0ZXIgY2FwYWJpbGl0aWVzIHdvcmQuICovCisJaW50IG9wdGlvbnM7CQkvKiBVc2VyLXNldHRhYmxlIG1pc2MuIGRyaXZlciBvcHRpb25zLiAqLworCWludCBsYXN0X3J4X3BhY2tldHM7CS8qIEZvciBtZWRpYSBhdXRvc2VsZWN0aW9uLiAqLworCXVuc2lnbmVkIGludCBhdmFpbGFibGVfbWVkaWE6OCwJLyogRnJvbSBXbjNfT3B0aW9ucyAqLworCSBtZWRpYV9vdmVycmlkZTozLAkvKiBQYXNzZWQtaW4gbWVkaWEgdHlwZS4gKi8KKwkgZGVmYXVsdF9tZWRpYTozLAkvKiBSZWFkIGZyb20gdGhlIEVFUFJPTS4gKi8KKwkgZnVsbF9kdXBsZXg6MSwgYXV0b3NlbGVjdDoxLCBidXNfbWFzdGVyOjEsCS8qIFZvcnRleCBjYW4gb25seSBkbyBhIGZyYWdtZW50IGJ1cy1tLiAqLworCSBmdWxsX2J1c19tYXN0ZXJfdHg6MSwgZnVsbF9idXNfbWFzdGVyX3J4OjEsCS8qIEJvb21lcmFuZyAgKi8KKwkgdHhfZnVsbDoxOworfTsKKworLyogVGhlIGFjdGlvbiB0byB0YWtlIHdpdGggYSBtZWRpYSBzZWxlY3Rpb24gdGltZXIgdGljay4KKyAgIE5vdGUgdGhhdCB3ZSBkZXZpYXRlIGZyb20gdGhlIDNDb20gb3JkZXIgYnkgY2hlY2tpbmcgMTBiYXNlMiBiZWZvcmUgQVVJLgorICovCitlbnVtIHhjdnJfdHlwZXMgeworCVhDVlJfMTBiYXNlVCA9CisJICAgIDAsIFhDVlJfQVVJLCBYQ1ZSXzEwYmFzZVRPbmx5LCBYQ1ZSXzEwYmFzZTIsIFhDVlJfMTAwYmFzZVR4LAorCVhDVlJfMTAwYmFzZUZ4LCBYQ1ZSX01JSSA9IDYsIFhDVlJfRGVmYXVsdCA9IDgsCit9OworCitzdGF0aWMgc3RydWN0IG1lZGlhX3RhYmxlIHsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBtZWRpYV9iaXRzOjE2LAkvKiBCaXRzIHRvIHNldCBpbiBXbjRfTWVkaWEgcmVnaXN0ZXIuICovCisJIG1hc2s6OCwJCS8qIFRoZSB0cmFuc2NlaXZlci1wcmVzZW50IGJpdCBpbiBXbjNfQ29uZmlnLiAqLworCSBuZXh0Ojg7CQkvKiBUaGUgbWVkaWEgdHlwZSB0byB0cnkgbmV4dC4gKi8KKwlzaG9ydCB3YWl0OwkJLyogVGltZSBiZWZvcmUgd2UgY2hlY2sgbWVkaWEgc3RhdHVzLiAqLworfSBtZWRpYV90YmxbXSA9IHsKKwl7CisJIjEwYmFzZVQiLCBNZWRpYV8xMFRQLCAweDA4LCBYQ1ZSXzEwYmFzZTIsICgxNCAqIEhaKSAvIDEwfQorCSwgeworCSIxME1icyBBVUkiLCBNZWRpYV9TUUUsIDB4MjAsIFhDVlJfRGVmYXVsdCwgKDEgKiBIWikgLyAxMH0KKwksIHsKKwkidW5kZWZpbmVkIiwgMCwgMHg4MCwgWENWUl8xMGJhc2VULCAxMDAwMH0KKwksIHsKKwkiMTBiYXNlMiIsIDAsIDB4MTAsIFhDVlJfQVVJLCAoMSAqIEhaKSAvIDEwfQorCSwgeworCSIxMDBiYXNlVFgiLCBNZWRpYV9MbmssIDB4MDIsIFhDVlJfMTAwYmFzZUZ4LAorCQkgICAgKDE0ICogSFopIC8gMTB9CisJLCB7CisJIjEwMGJhc2VGWCIsIE1lZGlhX0xuaywgMHgwNCwgWENWUl9NSUksICgxNCAqIEhaKSAvIDEwfQorCSwgeworCSJNSUkiLCAwLCAweDQwLCBYQ1ZSXzEwYmFzZVQsIDMgKiBIWn0KKwksIHsKKwkidW5kZWZpbmVkIiwgMCwgMHgwMSwgWENWUl8xMGJhc2VULCAxMDAwMH0KKwksIHsKKwkiRGVmYXVsdCIsIDAsIDB4RkYsIFhDVlJfMTBiYXNlVCwgMTAwMDB9CissfTsKKworLyogVElMRUcgTW9kaWZpZWQgdG8gcmVtb3ZlIHJlZmVyZW5jZSB0byBkZXYgKi8KK3N0YXRpYyBpbnQgY29ya3NjcmV3X2ZvdW5kX2RldmljZShpbnQgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcHJvZHVjdF9pbmRleCwKKwkJCQkgIGludCBvcHRpb25zLCBzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCBjb3Jrc2NyZXdfcHJvYmUxKGludCBpb2FkZHIsIGludCBpcnEsIGludCBwcm9kdWN0X2luZGV4LAorCQkJICAgIHN0cnVjdCBuaWMgKm5pYyk7CisKKy8qIFRoaXMgZHJpdmVyIHVzZXMgJ29wdGlvbnMnIHRvIHBhc3MgdGhlIG1lZGlhIHR5cGUsIGZ1bGwtZHVwbGV4IGZsYWcsIGV0Yy4gKi8KKy8qIE5vdGU6IHRoaXMgaXMgdGhlIG9ubHkgbGltaXQgb24gdGhlIG51bWJlciBvZiBjYXJkcyBzdXBwb3J0ZWQhISAqLworc3RhdGljIGludCBvcHRpb25zID0gLTE7CisKKy8qIEVuZCBCcm91Z2h0IGRpcmVjdGx5IGZyb20gM2M1MTUuYyBieSBCZWNrZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHQ1MTVfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCXVuaW9uIHduM19jb25maWcgY29uZmlnOworCWludCBpOworCisJLyogQmVmb3JlIGluaXRpYWxpemluZyBzZWxlY3QgdGhlIGFjdGl2ZSBtZWRpYSBwb3J0LiAqLworCUVMM1dJTkRPVygzKTsKKwlpZiAodnAtPmZ1bGxfZHVwbGV4KQorCQlvdXRiKDB4MjAsIG5pYy0+aW9hZGRyICsgV24zX01BQ19DdHJsKTsJLyogU2V0IHRoZSBmdWxsLWR1cGxleCBiaXQuICovCisJY29uZmlnLmkgPSBpbmwobmljLT5pb2FkZHIgKyBXbjNfQ29uZmlnKTsKKworCWlmICh2cC0+bWVkaWFfb3ZlcnJpZGUgIT0gNykgeworCQlEQkcgKCAiTWVkaWEgb3ZlcnJpZGUgdG8gdHJhbnNjZWl2ZXIgJWQgKCVzKS5cbiIsCisJCSAgICAgIHZwLT5tZWRpYV9vdmVycmlkZSwKKwkJICAgICAgbWVkaWFfdGJsW3ZwLT5tZWRpYV9vdmVycmlkZV0ubmFtZSk7CisJCWlmX3BvcnQgPSB2cC0+bWVkaWFfb3ZlcnJpZGU7CisJfSBlbHNlIGlmICh2cC0+YXV0b3NlbGVjdCkgeworCQkvKiBGaW5kIGZpcnN0IGF2YWlsYWJsZSBtZWRpYSB0eXBlLCBzdGFydGluZyB3aXRoIDEwMGJhc2VUeC4gKi8KKwkJaWZfcG9ydCA9IDQ7CisJCXdoaWxlICghKHZwLT5hdmFpbGFibGVfbWVkaWEgJiBtZWRpYV90YmxbaWZfcG9ydF0ubWFzaykpCisJCQlpZl9wb3J0ID0gbWVkaWFfdGJsW2lmX3BvcnRdLm5leHQ7CisKKwkJREJHICggIkluaXRpYWwgbWVkaWEgdHlwZSAlcy5cbiIsCisJCSAgICAgIG1lZGlhX3RibFtpZl9wb3J0XS5uYW1lKTsKKwl9IGVsc2UKKwkJaWZfcG9ydCA9IHZwLT5kZWZhdWx0X21lZGlhOworCisJY29uZmlnLnUueGN2ciA9IGlmX3BvcnQ7CisJb3V0bChjb25maWcuaSwgbmljLT5pb2FkZHIgKyBXbjNfQ29uZmlnKTsKKworCURCRyAoICJjb3Jrc2NyZXdfb3BlbigpIEludGVybmFsQ29uZmlnIDB4JWhYLlxuIiwKKwkgICAgICBjb25maWcuaSk7CisKKwlvdXR3KFR4UmVzZXQsIG5pYy0+aW9hZGRyICsgRUwzX0NNRCk7CisJZm9yIChpID0gMjA7IGkgPj0gMDsgaS0tKQorCQlpZiAoIShpbncobmljLT5pb2FkZHIgKyBFTDNfU1RBVFVTKSAmIENtZEluUHJvZ3Jlc3MpKQorCQkJYnJlYWs7CisKKwlvdXR3KFJ4UmVzZXQsIG5pYy0+aW9hZGRyICsgRUwzX0NNRCk7CisJLyogV2FpdCBhIGZldyB0aWNrcyBmb3IgdGhlIFJ4UmVzZXQgY29tbWFuZCB0byBjb21wbGV0ZS4gKi8KKwlmb3IgKGkgPSAyMDsgaSA+PSAwOyBpLS0pCisJCWlmICghKGludyhuaWMtPmlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcykpCisJCQlicmVhazsKKworCW91dHcoU2V0U3RhdHVzRW5iIHwgMHgwMCwgbmljLT5pb2FkZHIgKyBFTDNfQ01EKTsKKworI2lmZGVmIGRlYnVnXzNjNTE1CisJCUVMM1dJTkRPVyg0KTsKKwkJREJHICggIkZJWE1FOiBmaXggcHJpbnQgZm9yIGlycSwgbm90IDkiICk7CisJCURCRyAoICJjb3Jrc2NyZXdfb3BlbigpIGlycSAlZCBtZWRpYSBzdGF0dXMgMHglaFguXG4iLAorCQkgICAgICA5LCBpbncobmljLT5pb2FkZHIgKyBXbjRfTWVkaWEpICk7CisjZW5kaWYKKworCS8qIFNldCB0aGUgc3RhdGlvbiBhZGRyZXNzIGFuZCBtYXNrIGluIHdpbmRvdyAyIGVhY2ggdGltZSBvcGVuZWQuICovCisJRUwzV0lORE9XKDIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCW91dGIobmljLT5ub2RlX2FkZHJbaV0sIG5pYy0+aW9hZGRyICsgaSk7CisJZm9yICg7IGkgPCAxMjsgaSArPSAyKQorCQlvdXR3KDAsIG5pYy0+aW9hZGRyICsgaSk7CisKKwlpZiAoaWZfcG9ydCA9PSAzKQorCQkvKiBTdGFydCB0aGUgdGhpbm5ldCB0cmFuc2NlaXZlci4gV2Ugc2hvdWxkIHJlYWxseSB3YWl0IDUwbXMuLi4gKi8KKwkJb3V0dyhTdGFydENvYXgsIG5pYy0+aW9hZGRyICsgRUwzX0NNRCk7CisJRUwzV0lORE9XKDQpOworCW91dHcoKGludyhuaWMtPmlvYWRkciArIFduNF9NZWRpYSkgJiB+KE1lZGlhXzEwVFAgfCBNZWRpYV9TUUUpKSB8CisJICAgICBtZWRpYV90YmxbaWZfcG9ydF0ubWVkaWFfYml0cywgbmljLT5pb2FkZHIgKyBXbjRfTWVkaWEpOworCisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCBjbGVhciBhbGwgc3RhdHMgYnkgcmVhZGluZy4gKi8KKy8qCW91dHcoU3RhdHNEaXNhYmxlLCBuaWMtPmlvYWRkciArIEVMM19DTUQpOyovCisJRUwzV0lORE9XKDYpOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlpbmIobmljLT5pb2FkZHIgKyBpKTsKKwlpbncobmljLT5pb2FkZHIgKyAxMCk7CisJaW53KG5pYy0+aW9hZGRyICsgMTIpOworCS8qIE5ldzogT24gdGhlIFZvcnRleCB3ZSBtdXN0IGFsc28gY2xlYXIgdGhlIEJhZFNTRCBjb3VudGVyLiAqLworCUVMM1dJTkRPVyg0KTsKKwlpbmIobmljLT5pb2FkZHIgKyAxMik7CisJLyogLi5hbmQgb24gdGhlIEJvb21lcmFuZyB3ZSBlbmFibGUgdGhlIGV4dHJhIHN0YXRpc3RpY3MgYml0cy4gKi8KKwlvdXR3KDB4MDA0MCwgbmljLT5pb2FkZHIgKyBXbjRfTmV0RGlhZyk7CisKKwkvKiBTd2l0Y2ggdG8gcmVnaXN0ZXIgc2V0IDcgZm9yIG5vcm1hbCB1c2UuICovCisJRUwzV0lORE9XKDcpOworCisJLyogVGVtcG9yYXJpbHkgbGVmdCBpbiBwbGFjZS4gIElmIHRoZXNlIEZJWE1FcyBhcmUgcHJpbnRlZAorCSAgIGl0IG1lYW5kIHRoYXQgc3BlY2lhbCBsb2dpYyBmb3IgdGhhdCBjYXJkIG1heSBuZWVkIHRvIGJlIGFkZGVkCisJICAgc2VlIEJlY2tlcidzIDNjNTE1LmMgZHJpdmVyICovCisJaWYgKHZwLT5mdWxsX2J1c19tYXN0ZXJfcngpIHsJLyogQm9vbWVyYW5nIGJ1cyBtYXN0ZXIuICovCisJCXByaW50ZigiRklYTUU6IElzIHRoaXMgaWYgbmVjZXNzYXJ5Iik7CisJCXZwLT5jdXJfcnggPSB2cC0+ZGlydHlfcnggPSAwOworCQlEQkcgKCAiICAgRmlsbGluZyBpbiB0aGUgUnggcmluZy5cbiIgKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGYoIkZJWE1FOiBJcyB0aGlzIGlmIG5lY2Vzc2FyeSIpOworCQl9CisJfQorCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7CS8qIEJvb21lcmFuZyBidXMgbWFzdGVyIFR4LiAqLworCQl2cC0+Y3VyX3R4ID0gdnAtPmRpcnR5X3R4ID0gMDsKKwkJb3V0YihQS1RfQlVGX1NaID4+IDgsIG5pYy0+aW9hZGRyICsgVHhGcmVlVGhyZXNob2xkKTsJLyogUm9vbSBmb3IgYSBwYWNrZXQuICovCisJCS8qIENsZWFyIHRoZSBUeCByaW5nLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQl2cC0+dHhfc2tidWZmW2ldID0gMDsKKwkJb3V0bCgwLCBuaWMtPmlvYWRkciArIERvd25MaXN0UHRyKTsKKwl9CisJLyogU2V0IHJlY2VpdmVyIG1vZGU6IHByZXN1bWFibHkgYWNjZXB0IGItY2FzZSBhbmQgcGh5cyBhZGRyIG9ubHkuICovCisJb3V0dyhTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4TXVsdGljYXN0IHwgUnhCcm9hZGNhc3QgfCBSeFByb20sCisJICAgICBuaWMtPmlvYWRkciArIEVMM19DTUQpOworCisJb3V0dyhSeEVuYWJsZSwgbmljLT5pb2FkZHIgKyBFTDNfQ01EKTsJLyogRW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwlvdXR3KFR4RW5hYmxlLCBuaWMtPmlvYWRkciArIEVMM19DTUQpOwkvKiBFbmFibGUgdHJhbnNtaXR0ZXIuICovCisJLyogQWxsb3cgc3RhdHVzIGJpdHMgdG8gYmUgc2Vlbi4gKi8KKwlvdXR3KFNldFN0YXR1c0VuYiB8IEFkYXB0ZXJGYWlsdXJlIHwgSW50UmVxIHwgU3RhdHNGdWxsIHwKKwkgICAgICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4ID8gRG93bkNvbXBsZXRlIDogVHhBdmFpbGFibGUpIHwKKwkgICAgICh2cC0+ZnVsbF9idXNfbWFzdGVyX3J4ID8gVXBDb21wbGV0ZSA6IFJ4Q29tcGxldGUpIHwKKwkgICAgICh2cC0+YnVzX21hc3RlciA/IERNQURvbmUgOiAwKSwgbmljLT5pb2FkZHIgKyBFTDNfQ01EKTsKKwkvKiBBY2sgYWxsIHBlbmRpbmcgZXZlbnRzLCBhbmQgc2V0IGFjdGl2ZSBpbmRpY2F0b3IgbWFzay4gKi8KKwlvdXR3KEFja0ludHIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhFYXJseSB8IEludFJlcSwKKwkgICAgIG5pYy0+aW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyhTZXRJbnRyRW5iIHwgSW50TGF0Y2ggfCBUeEF2YWlsYWJsZSB8IFJ4Q29tcGxldGUgfCBTdGF0c0Z1bGwKKwkgICAgIHwgKHZwLT5idXNfbWFzdGVyID8gRE1BRG9uZSA6IDApIHwgVXBDb21wbGV0ZSB8IERvd25Db21wbGV0ZSwKKwkgICAgIG5pYy0+aW9hZGRyICsgRUwzX0NNRCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB0NTE1X3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisJc2hvcnQgc3RhdHVzLCBjc3Q7CisJcmVnaXN0ZXIgc2hvcnQgcnhfZmlmbzsKKworCWNzdCA9IGludyhuaWMtPmlvYWRkciArIEVMM19TVEFUVVMpOworCisJaWYgKChjc3QgJiBSeENvbXBsZXRlKSA9PSAwKSB7CisJCS8qIEFjayBhbGwgcGVuZGluZyBldmVudHMsIGFuZCBzZXQgYWN0aXZlIGluZGljYXRvciBtYXNrLiAqLworCQlvdXR3KEFja0ludHIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhFYXJseSB8IEludFJlcSwKKwkJICAgICBuaWMtPmlvYWRkciArIEVMM19DTUQpOworCQlvdXR3KFNldEludHJFbmIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhDb21wbGV0ZSB8CisJCSAgICAgU3RhdHNGdWxsIHwgKHZwLT4KKwkJCQkgIGJ1c19tYXN0ZXIgPyBETUFEb25lIDogMCkgfCBVcENvbXBsZXRlIHwKKwkJICAgICBEb3duQ29tcGxldGUsIG5pYy0+aW9hZGRyICsgRUwzX0NNRCk7CisJCXJldHVybiAwOworCX0KKwlzdGF0dXMgPSBpbncobmljLT5pb2FkZHIgKyBSeFN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgUnhERXJyb3IpIHsKKwkJcHJpbnRmKCJSeERFcnJvclxuIik7CisJCW91dHcoUnhEaXNjYXJkLCBuaWMtPmlvYWRkciArIEVMM19DTUQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyeF9maWZvID0gc3RhdHVzICYgUlhfQllURVNfTUFTSzsKKwlpZiAocnhfZmlmbyA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJREJHICggIltsPSVkIiwgcnhfZmlmbyApOworCWluc3cobmljLT5pb2FkZHIgKyBSWF9GSUZPLCBuaWMtPnBhY2tldCwgcnhfZmlmbyAvIDIpOworCWlmIChyeF9maWZvICYgMSkKKwkJbmljLT5wYWNrZXRbcnhfZmlmbyAtIDFdID0gaW5iKG5pYy0+aW9hZGRyICsgUlhfRklGTyk7CisJbmljLT5wYWNrZXRsZW4gPSByeF9maWZvOworCisJd2hpbGUgKDEpIHsKKwkJc3RhdHVzID0gaW53KG5pYy0+aW9hZGRyICsgUnhTdGF0dXMpOworCQlEQkcgKCAiMHglaFgqIiwgc3RhdHVzICk7CisJCXJ4X2ZpZm8gPSBzdGF0dXMgJiBSWF9CWVRFU19NQVNLOworCisJCWlmIChyeF9maWZvID4gMCkgeworCQkJaW5zdyhuaWMtPmlvYWRkciArIFJYX0ZJRk8sIG5pYy0+cGFja2V0ICsgbmljLT5wYWNrZXRsZW4sCisJCQkgICAgIHJ4X2ZpZm8gLyAyKTsKKwkJCWlmIChyeF9maWZvICYgMSkKKwkJCQluaWMtPnBhY2tldFtuaWMtPnBhY2tldGxlbiArIHJ4X2ZpZm8gLSAxXSA9CisJCQkJICAgIGluYihuaWMtPmlvYWRkciArIFJYX0ZJRk8pOworCQkJbmljLT5wYWNrZXRsZW4gKz0gcnhfZmlmbzsKKwkJCURCRyAoICIrJWQiLCByeF9maWZvICk7CisJCX0KKwkJaWYgKChzdGF0dXMgJiBSeENvbXBsZXRlKSA9PSAwKSB7CisJCQlEQkcgKCAiPSVkIiwgbmljLT5wYWNrZXRsZW4gKTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDAwKTsKKwl9CisKKwkvKiBhY2tub3dsZWRnZSByZWNlcHRpb24gb2YgcGFja2V0ICovCisJb3V0dyhSeERpc2NhcmQsIG5pYy0+aW9hZGRyICsgRUwzX0NNRCk7CisJd2hpbGUgKGludyhuaWMtPmlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcyk7CisjaWZkZWYgZGVidWdfM2M1MTUKKwl7CisJCXVuc2lnbmVkIHNob3J0IHR5cGUgPSAwOworCQl0eXBlID0gKG5pYy0+cGFja2V0WzEyXSA8PCA4KSB8IG5pYy0+cGFja2V0WzEzXTsKKwkJaWYgKG5pYy0+cGFja2V0WzBdICsgbmljLT5wYWNrZXRbMV0gKyBuaWMtPnBhY2tldFsyXSArCisJCSAgICBuaWMtPnBhY2tldFszXSArIG5pYy0+cGFja2V0WzRdICsgbmljLT5wYWNrZXRbNV0gPT0KKwkJICAgIDB4RkYgKiBFVEhfQUxFTikKKwkJCURCRyAoICIsdD0weCVoWCxiXSIsIHR5cGUgKTsKKwkJZWxzZQorCQkJREJHICggIix0PTB4JWhYXSIsIHR5cGUgKTsKKwl9CisjZW5kaWYKKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCTNDb20gNTE1IC0gc3BlY2lmaWMgcm91dGluZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNoYXIgcGFkbWFwW10gPSB7CisJMCwgMywgMiwgMQorfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0NTE1X3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgdW5zaWduZWQgaW50IHQsCS8qIFR5cGUgKi8KKwkJCSAgdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KKwkJCSAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJcmVnaXN0ZXIgaW50IGxlbjsKKwlpbnQgcGFkOworCWludCBzdGF0dXM7CisKKwlEQkcgKCAie2w9JWQsdD0weCVoWH0iLCBzICsgRVRIX0hMRU4sIHQgKTsKKworCS8qIHN3YXAgYnl0ZXMgb2YgdHlwZSAqLworCXQgPSBodG9ucyh0KTsKKworCWxlbiA9IHMgKyBFVEhfSExFTjsJLyogYWN0dWFsIGxlbmd0aCBvZiBwYWNrZXQgKi8KKwlwYWQgPSBwYWRtYXBbbGVuICYgM107CisKKwkvKgorCSAqIFRoZSAzYzUxNSBhdXRvbWF0aWNhbGx5IHBhZHMgc2hvcnQgcGFja2V0cyB0byBtaW5pbXVtIGV0aGVybmV0IGxlbmd0aCwKKwkgKiBidXQgd2UgZHJvcCBwYWNrZXRzIHRoYXQgYXJlIHRvbyBsYXJnZS4gUGVyaGFwcyB3ZSBzaG91bGQgdHJ1bmNhdGUKKwkgKiB0aGVtIGluc3RlYWQ/CisJIENvcGllZCBmcm9tIDNjNTk1LiAgSXMgdGhpcyB0cnVlIGZvciB0aGUgM2M1MTU/CisJICovCisJaWYgKGxlbiArIHBhZCA+IEVUSF9GUkFNRV9MRU4pIHsKKwkJcmV0dXJuOworCX0KKwkvKiBkcm9wIGFja25vd2xlZGdlbWVudHMgKi8KKwl3aGlsZSAoKHN0YXR1cyA9IGluYihuaWMtPmlvYWRkciArIFR4U3RhdHVzKSkgJiBUeENvbXBsZXRlKSB7CisJCS8qaWYoc3RhdHVzICYgKFRYU19VTkRFUlJVTnwweDg4fFRYU19TVEFUVVNfT1ZFUkZMT1cpKSB7ICovCisJCW91dHcoVHhSZXNldCwgbmljLT5pb2FkZHIgKyBFTDNfQ01EKTsKKwkJb3V0dyhUeEVuYWJsZSwgbmljLT5pb2FkZHIgKyBFTDNfQ01EKTsKKy8qCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwkJb3V0YigweDAsIG5pYy0+aW9hZGRyICsgVHhTdGF0dXMpOworCX0KKworCXdoaWxlIChpbncobmljLT5pb2FkZHIgKyBUeEZyZWUpIDwgbGVuICsgcGFkICsgNCkgeworCQkvKiBubyByb29tIGluIEZJRk8gKi8KKwl9CisKKwlvdXR3KGxlbiwgbmljLT5pb2FkZHIgKyBUWF9GSUZPKTsKKwlvdXR3KDB4MCwgbmljLT5pb2FkZHIgKyBUWF9GSUZPKTsJLyogU2Vjb25kIGR3b3JkIG1lYW5pbmdsZXNzICovCisKKwkvKiB3cml0ZSBwYWNrZXQgKi8KKwlvdXRzdyhuaWMtPmlvYWRkciArIFRYX0ZJRk8sIGQsIEVUSF9BTEVOIC8gMik7CisJb3V0c3cobmljLT5pb2FkZHIgKyBUWF9GSUZPLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4gLyAyKTsKKwlvdXR3KHQsIG5pYy0+aW9hZGRyICsgVFhfRklGTyk7CisJb3V0c3cobmljLT5pb2FkZHIgKyBUWF9GSUZPLCBwLCBzIC8gMik7CisKKwlpZiAocyAmIDEpCisJCW91dGIoKihwICsgcyAtIDEpLCBuaWMtPmlvYWRkciArIFRYX0ZJRk8pOworCisJd2hpbGUgKHBhZC0tKQorCQlvdXRiKDAsIG5pYy0+aW9hZGRyICsgVFhfRklGTyk7CS8qIFBhZGRpbmcgKi8KKworCS8qIHdhaXQgZm9yIFR4IGNvbXBsZXRlICovCisJd2hpbGUgKChpbncobmljLT5pb2FkZHIgKyBFTDNfU1RBVFVTKSAmIENtZEluUHJvZ3Jlc3MpICE9IDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHQ1MTVfZGlzYWJsZSAoIHN0cnVjdCBuaWMgKm5pYywKKwkJCSAgIHN0cnVjdCBpc2FwbnBfZGV2aWNlICppc2FwbnAgKSB7CisKKwl0NTE1X3Jlc2V0KG5pYyk7CisKKwkvKiBUaGlzIGlzIGEgaGFjay4gIFNpbmNlIGx0c3Agd29ya2VkIG9uIG15CisJICAgc3lzdGVtIHdpdGhvdXQgYW55IGRpc2FibGUgZnVuY3Rpb25hbGl0eSBJCisJICAgaGF2ZSBubyB3YXkgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgd29ya3MgKi8KKworCS8qIERpc2FibGUgdGhlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlci4gKi8KKwlvdXR3KFJ4RGlzYWJsZSwgbmljLT5pb2FkZHIgKyBFTDNfQ01EKTsKKwlvdXR3KFR4RGlzYWJsZSwgbmljLT5pb2FkZHIgKyBFTDNfQ01EKTsKKworCWlmIChpZl9wb3J0ID09IFhDVlJfMTBiYXNlMikKKwkJLyogVHVybiBvZmYgdGhpbm5ldCBwb3dlci4gIEdyZWVuISAqLworCQlvdXR3KFN0b3BDb2F4LCBuaWMtPmlvYWRkciArIEVMM19DTUQpOworCisKKwlvdXR3KFNldEludHJFbmIgfCAweDAwMDAsIG5pYy0+aW9hZGRyICsgRUwzX0NNRCk7CisKKwlkZWFjdGl2YXRlX2lzYXBucF9kZXZpY2UgKCBpc2FwbnAgKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHQ1MTVfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgdDUxNV9vcGVyYXRpb25zID0geworCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKKwkucG9sbAkJPSB0NTE1X3BvbGwsCisJLnRyYW5zbWl0CT0gdDUxNV90cmFuc21pdCwKKwkuaXJxCQk9IHQ1MTVfaXJxLAorCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorWW91IHNob3VsZCBvbWl0IHRoZSBsYXN0IGFyZ3VtZW50IHN0cnVjdCBwY2lfZGV2aWNlICogZm9yIGEgbm9uLVBDSSBOSUMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdDUxNV9wcm9iZSAoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGlzYXBucF9kZXZpY2UgKmlzYXBucCApIHsKKworCS8qIERpcmVjdCBjb3B5IGZyb20gQmVja2VycyAzYzUxNS5jIHJlbW92aW5nIGFueSBJU0FQTlAgc2VjdGlvbnMgKi8KKworCW5pYy0+aW9hZGRyID0gaXNhcG5wLT5pb2FkZHI7CisJbmljLT5pcnFubyA9IGlzYXBucC0+aXJxbm87CisJYWN0aXZhdGVfaXNhcG5wX2RldmljZSAoIGlzYXBucCApOworCisJLyogQ2hlY2sgdGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gZm9yIGEgbWF0Y2hpbmcgaW9hZGRyLiAqLworCWlmICgodW5zaWduZWQpKGludyhuaWMtPmlvYWRkciArIDB4MjAwMikgJiAweDFmMCkKKwkgICAgIT0gKG5pYy0+aW9hZGRyICYgMHgxZjApKSB7CisJCURCRyAoICIzYzUxNSBpb2FkZHIgbWlzbWF0Y2hcbiIgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVmVyaWZ5IGJ5IHJlYWRpbmcgdGhlIGRldmljZSBJRCBmcm9tIHRoZSBFRVBST00uICovCisJeworCQlpbnQgdGltZXI7CisJCW91dHcoRUVQUk9NX1JlYWQgKyA3LCBuaWMtPmlvYWRkciArIFduMEVlcHJvbUNtZCk7CisJCS8qIFBhdXNlIGZvciBhdCBsZWFzdCAxNjIgdXMuIGZvciB0aGUgcmVhZCB0byB0YWtlIHBsYWNlLiAqLworCQlmb3IgKHRpbWVyID0gNDsgdGltZXIgPj0gMDsgdGltZXItLSkgeworCQkJdDNjNTE1X3dhaXQoMSk7CisJCQlpZiAoKGludyhuaWMtPmlvYWRkciArIFduMEVlcHJvbUNtZCkgJiAweDAyMDApID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGludyhuaWMtPmlvYWRkciArIFduMEVlcHJvbURhdGEpICE9IDB4NmQ1MCkgeworCQkJREJHICggIjNjNTE1IHJlYWQgaW5jb3JyZWN0IHZlbmRvciBJRCBmcm9tIEVFUFJPTSIgKTsKKwkJCXJldHVybiAwOworCQl9CisKKwl9CisJREJHICggIjNjNTE1IFJlc291cmNlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMHglWCwgRENSIDB4JWhYLlxuIiwKKwkgICAgICBpbmwobmljLT5pb2FkZHIgKyAweDIwMDIpLCBpbncobmljLT5pb2FkZHIgKyAweDIwMDApICk7CisJY29ya3NjcmV3X2ZvdW5kX2RldmljZShuaWMtPmlvYWRkciwgbmljLT5pcnFubywgQ09SS1NDUkVXX0lELAorCQkJICAgICAgIG9wdGlvbnMsIG5pYyk7CisJCisJdDUxNV9yZXNldChuaWMpOwkKKwluaWMtPm5pY19vcAk9ICZ0NTE1X29wZXJhdGlvbnM7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2NvcmtzY3Jld19mb3VuZF9kZXZpY2UoaW50IGlvYWRkciwgaW50IGlycSwKKwkJICAgICAgIGludCBwcm9kdWN0X2luZGV4LCBpbnQgb3B0aW9ucywgc3RydWN0IG5pYyAqbmljKQoreworCS8qIERpcmVjdCBjb3B5IGZyb20gQmVja2VyIDNjNTE1LmMgd2l0aCB1bmVjZXNzYXJ5IHBhcnRzIHJlbW92ZWQgKi8KKwl2cC0+cHJvZHVjdF9uYW1lID0gIjNjNTE1IjsKKwl2cC0+b3B0aW9ucyA9IG9wdGlvbnM7CisJaWYgKG9wdGlvbnMgPj0gMCkgeworCQl2cC0+bWVkaWFfb3ZlcnJpZGUgPQorCQkgICAgKChvcHRpb25zICYgNykgPT0gMikgPyAwIDogb3B0aW9ucyAmIDc7CisJCXZwLT5mdWxsX2R1cGxleCA9IChvcHRpb25zICYgOCkgPyAxIDogMDsKKwkJdnAtPmJ1c19tYXN0ZXIgPSAob3B0aW9ucyAmIDE2KSA/IDEgOiAwOworCX0gZWxzZSB7CisJCXZwLT5tZWRpYV9vdmVycmlkZSA9IDc7CisJCXZwLT5mdWxsX2R1cGxleCA9IDA7CisJCXZwLT5idXNfbWFzdGVyID0gMDsKKwl9CisKKwljb3Jrc2NyZXdfcHJvYmUxKGlvYWRkciwgaXJxLCBwcm9kdWN0X2luZGV4LCBuaWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citjb3Jrc2NyZXdfcHJvYmUxKGludCBpb2FkZHIsIGludCBpcnEsIGludCBwcm9kdWN0X2luZGV4IF9fdW51c2VkLAorCQkgc3RydWN0IG5pYyAqbmljKQoreworCXVuc2lnbmVkIGludCBlZXByb21bMHg0MF0sIGNoZWNrc3VtID0gMDsJLyogRUVQUk9NIGNvbnRlbnRzICovCisJaW50IGk7CisKKwlwcmludGYoIjNDb20gJXMgYXQgMHglaFgsICIsIHZwLT5wcm9kdWN0X25hbWUsIGlvYWRkcik7CisKKwkvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NLiAqLworCUVMM1dJTkRPVygwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgxODsgaSsrKSB7CisJCXNob3J0ICpwaHlzX2FkZHIgPSAoc2hvcnQgKikgbmljLT5ub2RlX2FkZHI7CisJCWludCB0aW1lcjsKKwkJb3V0dyhFRVBST01fUmVhZCArIGksIGlvYWRkciArIFduMEVlcHJvbUNtZCk7CisJCS8qIFBhdXNlIGZvciBhdCBsZWFzdCAxNjIgdXMuIGZvciB0aGUgcmVhZCB0byB0YWtlIHBsYWNlLiAqLworCQlmb3IgKHRpbWVyID0gNDsgdGltZXIgPj0gMDsgdGltZXItLSkgeworCQkJdDNjNTE1X3dhaXQoMSk7CisJCQlpZiAoKGludyhpb2FkZHIgKyBXbjBFZXByb21DbWQpICYgMHgwMjAwKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWVlcHJvbVtpXSA9IGludyhpb2FkZHIgKyBXbjBFZXByb21EYXRhKTsKKwkJREJHICggIlZhbHVlICVkOiAlaFggICAgICAgICIsIGksIGVlcHJvbVtpXSApOworCQljaGVja3N1bSBePSBlZXByb21baV07CisJCWlmIChpIDwgMykKKwkJCXBoeXNfYWRkcltpXSA9IGh0b25zKGVlcHJvbVtpXSk7CisJfQorCWNoZWNrc3VtID0gKGNoZWNrc3VtIF4gKGNoZWNrc3VtID4+IDgpKSAmIDB4ZmY7CisJaWYgKGNoZWNrc3VtICE9IDB4MDApCisJCXByaW50ZigiICoqKklOVkFMSUQgQ0hFQ0tTVU0gMHglaFgqKiogIiwgY2hlY2tzdW0pOworCisgICAgICAgIERCRyAoICIlcyIsIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIgKSApOworCisJaWYgKGVlcHJvbVsxNl0gPT0gMHgxMWM3KSB7CS8qIENvcmtzY3JldyAqLworCisJfQorCXByaW50ZigiLCBJUlEgJWRcbiIsIGlycSk7CisJLyogVGVsbCB0aGVtIGFib3V0IGFuIGludmFsaWQgSVJRLiAqLworCWlmICggKGlycSA8PSAwIHx8IGlycSA+IDE1KSApIHsKKwkJREJHICgiICoqKiBXYXJuaW5nOiB0aGlzIElSUSBpcyB1bmxpa2VseSB0byB3b3JrISAqKipcbiIgKTsKKwl9CisKKwl7CisJCWNoYXIgKnJhbV9zcGxpdFtdID0geyAiNTozIiwgIjM6MSIsICIxOjEiLCAiMzo1IiB9OworCQl1bmlvbiB3bjNfY29uZmlnIGNvbmZpZzsKKwkJRUwzV0lORE9XKDMpOworCQl2cC0+YXZhaWxhYmxlX21lZGlhID0gaW53KGlvYWRkciArIFduM19PcHRpb25zKTsKKwkJY29uZmlnLmkgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisJCURCRyAoICIgIEludGVybmFsIGNvbmZpZyByZWdpc3RlciBpcyAlNC40eCwgIgorCQkgICAgICAidHJhbnNjZWl2ZXJzIDB4JWhYLlxuIiwKKwkJICAgICAgY29uZmlnLmksIGludyhpb2FkZHIgKyBXbjNfT3B0aW9ucykgKTsKKwkJcHJpbnRmCisJCSAgICAoIiAgJWRLICVzLXdpZGUgUkFNICVzIFJ4OlR4IHNwbGl0LCAlcyVzIGludGVyZmFjZS5cbiIsCisJCSAgICAgOCA8PCBjb25maWcudS5yYW1fc2l6ZSwKKwkJICAgICBjb25maWcudS5yYW1fd2lkdGggPyAid29yZCIgOiAiYnl0ZSIsCisJCSAgICAgcmFtX3NwbGl0W2NvbmZpZy51LnJhbV9zcGxpdF0sCisJCSAgICAgY29uZmlnLnUuYXV0b3NlbGVjdCA/ICJhdXRvc2VsZWN0LyIgOiAiIiwKKwkJICAgICBtZWRpYV90YmxbY29uZmlnLnUueGN2cl0ubmFtZSk7CisJCWlmX3BvcnQgPSBjb25maWcudS54Y3ZyOworCQl2cC0+ZGVmYXVsdF9tZWRpYSA9IGNvbmZpZy51LnhjdnI7CisJCXZwLT5hdXRvc2VsZWN0ID0gY29uZmlnLnUuYXV0b3NlbGVjdDsKKwl9CisJaWYgKHZwLT5tZWRpYV9vdmVycmlkZSAhPSA3KSB7CisJCXByaW50ZigiICBNZWRpYSBvdmVycmlkZSB0byB0cmFuc2NlaXZlciB0eXBlICVkICglcykuXG4iLAorCQkgICAgICAgdnAtPm1lZGlhX292ZXJyaWRlLAorCQkgICAgICAgbWVkaWFfdGJsW3ZwLT5tZWRpYV9vdmVycmlkZV0ubmFtZSk7CisJCWlmX3BvcnQgPSB2cC0+bWVkaWFfb3ZlcnJpZGU7CisJfQorCisJdnAtPmNhcGFiaWxpdGllcyA9IGVlcHJvbVsxNl07CisJdnAtPmZ1bGxfYnVzX21hc3Rlcl90eCA9ICh2cC0+Y2FwYWJpbGl0aWVzICYgMHgyMCkgPyAxIDogMDsKKwkvKiBSeCBpcyBicm9rZW4gYXQgMTBtYnBzLCBzbyB3ZSBhbHdheXMgZGlzYWJsZSBpdC4gKi8KKwkvKiB2cC0+ZnVsbF9idXNfbWFzdGVyX3J4ID0gMDsgKi8KKwl2cC0+ZnVsbF9idXNfbWFzdGVyX3J4ID0gKHZwLT5jYXBhYmlsaXRpZXMgJiAweDIwKSA/IDEgOiAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNhcG5wX2RldmljZV9pZCB0NTE1X2FkYXB0ZXJzW10gPSB7CisJeyAiM2M1MTUgKElTQVBuUCkiLCBJU0FQTlBfVkVORE9SKCdUJywnQycsJ00nKSwgMHg1MDUxIH0sCit9OworCitJU0FQTlBfRFJJVkVSICggdDUxNV9kcml2ZXIsIHQ1MTVfYWRhcHRlcnMgKTsKKworRFJJVkVSICggIjNjNTE1IiwgbmljX2RyaXZlciwgaXNhcG5wX2RyaXZlciwgdDUxNV9kcml2ZXIsCisJIHQ1MTVfcHJvYmUsIHQ1MTVfZGlzYWJsZSApOworCitJU0FfUk9NICggIjNjNTE1IiwgIjNjNTE1IEZhc3QgRXRoZXJMaW5rIElTQVBuUCIgKTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNTE1LnR4dCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNTE1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjdiM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M1MTUudHh0CkBAIC0wLDAgKzEsMzEgQEAKKzNjNTE1LmMgLS0gM0NPTSAzQzUxNSBGYXN0IEV0aGVybGluayBJU0EgMTAvMTAwQkFTRS1UWCBkcml2ZXIgZm9yIGV0aGVyYm9vdAorQ29weXJpZ2h0IChDKSAyMDAyIFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorCitUaGlzIGRyaXZlciBpcyBmb3IgdGhlIDNDT00gM0M1MTUgRmFzdCBFdGhlcmxpbmsgSVNBIDEwLzEwMEJBU0UtVFgKKworUkVWSVNJT04gSElTVE9SWToKKz09PT09PT09PT09PT09PT0KK3YwLjEwIDQtMTctMjAwMiAgICAgICBUSkwgICAgICAgSW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KK3YwLjExIDQtMTctMjAwMiAgICAgICBUSkwgICAgICAgQ2xlYW51cCBvZiB0aGUgY29kZQordjAuMTIgNC0yNi0yMDAyICAgICAgIFRKTCAgICAgICBBZGRlZCBJU0EgUGx1ZyBhbmQgUGxheSBmb3IgTm9uLVBOUCBCaW9zZXMKK3YwLjEzIDMtMzEtMjAwMwkgICAgICBUSkwJRml4ZWQgaXNzdWUgMSBhbmQgMiBiZWxvdworCitUaGUgZHJpdmVyIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIHdvcmsgb2Ygb3RoZXJzIGFyZSByZWZlcmVuY2VkIGluIHRoZSAzYzUxNS5jIGZpbGUuCisKK0lTQSBQbHVnIGFuZCBQbGF5IChJU0FQTlApIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgZm9yIE5vbi1QTlAgQmlvc2VzLiAgVGhlIElTQVBOUCBjb2RlIHJlcXVpcmVzIHRoZSBkZWZpbmF0aW9uIG9mIElTQV9QTlAgYXM6CisKKyNkZWZpbmUgSVNBX1BOUAorCitJc3N1ZXM6Cis9PT09PT09CisxKSBSRVNPTFZFRCAtIFdoZW4gSVNBUE5QIGlzIGRlZmluZWQsIHRoZSBldGhlcmJvb3QgcHJvYmUgaXMgdW5hYmxlIHRvIGZpbmQgdGhlIGNhcmQgZHVyaW5nIHRoZSBmaXJzdCBwcm9iZS4gIFRoaXMgaXMgdHJ1ZSBldmVuIHRob3VnaCB0aGUgSVNBIFBOUCBjb2RlIGFjdHVhbGx5IGZvdW5kIGFuZCBhY3RpdmF0ZWQgdGhlIGRyaXZlci4KKworMikgUkVTT0xWRUQgLSBXaGVuIElTQV9QTlAgaXMgZGVmaW5lZCwgdGhlIGV0aGVyYm9vdCBwcm9iZSBmaW5kcyB0aGUgaW5jb3JyZWN0IE1BQyBhZGRyZXNzIGZvciB0aGUgY2FyZC4gSG93ZXZlciwgd2hlbiB0aGUgbGludXgga2VybmVsIGJvb3RzIGFuZCBsb2FkcyB0aGUgbGludXggM2M1MTUgZHJpdmVyIHRoZSBjb3JyZWN0IE1BQyBhZGRyZXNzIGlzIGZvdW5kLiBUaGlzIG1lYW5zIHRoYXQgd2l0aCBJU0FfUE5QIGRlZmluZWQsIHlvdSByZXF1aXJlIGJvdGggTUFDIGFkZHJlc3NlcyBkZWZpbmVkIGluIHRoZSAvZXRjL2RoY3BkLmNvbmYgZmlsZS4gIFRoZSBmaXJzdCBNQUMgYWRkcmVzcyBhbGxvd3MgdGhlIGRyaXZlciB0byBsb2FkIHRoZSBMVFNQIExpbnV4IGtlcm5lbC4gIFRoZSBzZWNvbmQgYWxsb3dzIHRoZSBMaW51eCBkaGNsaWVudCB0byByZXNvbHZlIGl0cyBJUCBhZGRyZXNzLgorCiszKSBBbHRob3VnaCB0aGUgSVNBIFBOUCBkb2NzIHNwZWNpZnkgdGhhdCB0aGUgSVJRLCBETUEgYW5kIElPIEFkZHJlc3MgbmVlZHMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGNhcmQgYmVmb3JlIGl0IGlzIGFjdGl2YXRlZCwgRXRoZXJib290IGRvZXMgbm90IHNlZW0gdG8gY2FyZS4gIFRoZXJlZm9yZSB0aGUgY29kZSBkb2VzIG5vdCBhc3NpZ24gdGhlIGNhcmQgd2l0aCB0aGVzZSB2YWx1ZXMuCisKK0lmIHlvdSBjYW4gaGVscCBhZGRyZXNzIGFueSBvZiB0aHNlIGlzc3VlcywgcGxlYXNlIGZlZWwgZnJlZS4KKworVGltb3RoeSBMZWdnZQordGltbGVnZ2VAdXNlcnMuc291cmNlZm9yZ2UubmV0CitBcHJpbCA5LCAyMDAzCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzUyOS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M1MjkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjgyNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M1MjkuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogU3BsaXQgb3V0IGZyb20gM2M1MDkuYyB0byBtYWtlIGJ1aWxkIHByb2Nlc3MgbW9yZSBzYW5lCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEJTRDIgKTsKKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgPGdweGUvbWNhLmg+CisjaW5jbHVkZSA8Z3B4ZS9pc2EuaD4gLyogZm9yIElTQV9ST00gKi8KKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICIzYzUwOS5oIgorCisvKgorICogU2V2ZXJhbCBvdGhlciBwaWVjZXMgb2YgdGhlIE1DQSBzdXBwb3J0IGNvZGUgd2VyZSBzaGFtZWxlc3NseQorICogYm9ycm93ZWQgZnJvbSB0aGUgTGludXgga2VybmVsIHNvdXJjZS4KKyAqCisgKiBNQ0Egc3VwcG9ydCBhZGRlZCBieSBBZGFtIEZyaXR6bGVyIChtaWRAYXVrLmN4KQorICoKKyAqIEdlbmVyYWxpc2VkIG91dCBvZiB0aGUgM2M1MjkgZHJpdmVyIGFuZCBpbnRvIGEgYnVzIHR5cGUgYnkgTWljaGFlbAorICogQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPgorICoKKyAqLworCitzdGF0aWMgaW50IHQ1MjlfcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBtY2FfZGV2aWNlICptY2EgKSB7CisKKwkvKiBSZXRyaWV2ZSBOSUMgcGFyYW1ldGVycyBmcm9tIE1DQSBkZXZpY2UgcGFyYW1ldGVycyAqLworCW5pYy0+aW9hZGRyID0gKCAoIG1jYS0+cG9zWzRdICYgMHhmYyApIHwgMHgwMiApIDw8IDg7CisJbmljLT5pcnFubyA9IG1jYS0+cG9zWzVdICYgMHgwZjsKKwlwcmludGYgKCAiM2M1MjkgYm9hcmQgZm91bmQgb24gTUNBIGF0ICUjaHggSVJRICVkIC0iLAorCQkgbmljLT5pb2FkZHIsIG5pYy0+aXJxbm8gKTsKKworCS8qIEhhbmQgb2ZmIHRvIGdlbmVyaWMgdDV4OSBwcm9iZSByb3V0aW5lICovCisJcmV0dXJuIHQ1eDlfcHJvYmUgKCBuaWMsIE1DQV9JRCAoIG1jYSApLCAweGZmZmYgKTsKK30KKworc3RhdGljIHZvaWQgdDUyOV9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgbWNhX2RldmljZSAqbWNhIF9fdW51c2VkICkgeworCXQ1eDlfZGlzYWJsZSAoIG5pYyApOworfQorCitzdGF0aWMgc3RydWN0IG1jYV9kZXZpY2VfaWQgZWwzX21jYV9hZGFwdGVyc1tdID0geworICAgICAgICB7ICIzQ29tIDNjNTI5IEV0aGVyTGluayBJSUkgKDEwYmFzZTIpIiwgMHg2MjdjIH0sCisgICAgICAgIHsgIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAoMTBiYXNlVCkiLCAweDYyN2QgfSwKKyAgICAgICAgeyAiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJICh0ZXN0IG1vZGUpIiwgMHg2MmRiIH0sCisgICAgICAgIHsgIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAoVFAgb3IgY29heCkiLCAweDYyZjYgfSwKKyAgICAgICAgeyAiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJIChUUCkiLCAweDYyZjcgfSwKK307CisKK01DQV9EUklWRVIgKCB0NTI5X2RyaXZlciwgZWwzX21jYV9hZGFwdGVycyApOworCitEUklWRVIgKCAiM2M1MjkiLCBuaWNfZHJpdmVyLCBtY2FfZHJpdmVyLCB0NTI5X2RyaXZlciwKKwkgdDUyOV9wcm9iZSwgdDUyOV9kaXNhYmxlICk7CisKK0lTQV9ST00oICIzYzUyOSIsICIzYzUyOSA9PSBNQ0EgM2M1MDkiICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzU5NS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M1OTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M4NWQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M1OTUuYwpAQCAtMCwwICsxLDU1MyBAQAorLyoKKyogM2M1OTUuYyAtLSAzQ09NIDNDNTk1IEZhc3QgRXRoZXJsaW5rIElJSSBQQ0kgZHJpdmVyIGZvciBldGhlcmJvb3QKKyoKKyogQ29weXJpZ2h0IChDKSAyMDAwIFNodXN1a2UgTmlzaXlhbWEgPHNodUBhdGhlbmEucWUuZW5nLmhva3VkYWkuYWMuanA+CisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIE1hci4gMTQsIDIwMDAKKyoKKyogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQsIG1vZGlmaWVkLCBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgc29sZCwgaW4KKyogIGJvdGggc291cmNlIGFuZCBiaW5hcnkgZm9ybSBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgYW5kIHRoZXNlCisqICB0ZXJtcyBhcmUgcmV0YWluZWQuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYXJlIHRoZSBhdXRob3JzIHJlc3BvbnNpYmxlIGZvcgorKiAgdGhlIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGlzIHNvZnR3YXJlLCBub3IgZG8gdGhlIGF1dGhvcnMgYXNzdW1lIGFueQorKiAgcmVzcG9uc2liaWxpdHkgZm9yIGRhbWFnZXMgaW5jdXJyZWQgd2l0aCBpdHMgdXNlLgorKgorKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gTWFydGluIFJlbnRlcnMnIGV0aGVyYm9vdC00LjQuMyAzYzUwOS5jIGFuZCAKKyogSGVyYiBQZXllcmwncyBGcmVlQlNEIDMuNC1SRUxFQVNFIGlmX3Z4LmMgZHJpdmVyLgorKgorKiAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTQsIERhdmlkIEdyZWVubWFuLCBNYXJ0aW4gUmVudGVycy4KKyogIENvcHlyaWdodCAoQykgMTk5My0xOTk1LCBBbmRyZXMgVmVnYSBHYXJjaWEuCisqICBDb3B5cmlnaHQgKEMpIDE5OTUsIFNlcmdlIEJhYmtpbi4KKyoKKyogIENvcHlyaWdodCAoYykgMTk5NCBIZXJiIFBleWVybCA8aHBleWVybEBub3ZhdGVsLmNhPgorKgorKiB0aW1sZWdnZQkwOC0yNC0yMDAzCUFkZCBNdWx0aWNhc3QgU3VwcG9ydAorKi8KKworRklMRV9MSUNFTkNFICggQlNEMiApOworCisvKiAjZGVmaW5lIEVERUJVRyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSAiM2M1OTUuaCIKKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyB0NTk1X29wZXJhdGlvbnM7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbmljX2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJdnhfY29ubmVjdG9yLCB2eF9jb25uZWN0b3JzOworCitzdGF0aWMgc3RydWN0IGNvbm5lY3Rvcl9lbnRyeSB7CisgIGludCBiaXQ7CisgIGNoYXIgKm5hbWU7Cit9IGNvbm5fdGFiW1ZYX0NPTk5FQ1RPUlNdID0geworI2RlZmluZSBDT05ORUNUT1JfVVRQICAgMAorICB7IDB4MDgsICJ1dHAifSwKKyNkZWZpbmUgQ09OTkVDVE9SX0FVSSAgIDEKKyAgeyAweDIwLCAiYXVpIn0sCisvKiBkdW1teSAqLworICB7IDAsICI/Pz8ifSwKKyNkZWZpbmUgQ09OTkVDVE9SX0JOQyAgIDMKKyAgeyAweDEwLCAiYm5jIn0sCisjZGVmaW5lIENPTk5FQ1RPUl9UWCAgICA0CisgIHsgMHgwMiwgInR4In0sCisjZGVmaW5lIENPTk5FQ1RPUl9GWCAgICA1CisgIHsgMHgwNCwgImZ4In0sCisjZGVmaW5lIENPTk5FQ1RPUl9NSUkgICA2CisgIHsgMHg0MCwgIm1paSJ9LAorICB7IDAsICI/Pz8ifQorfTsKKworc3RhdGljIHZvaWQgdnhnZXRsaW5rKHZvaWQpOworc3RhdGljIHZvaWQgdnhzZXRsaW5rKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHQ1OTVfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCWludCBpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlSZXNldCAzQ29tIDU5NSBjYXJkCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIHN0b3AgY2FyZCAqLworCW91dHcoUlhfRElTQUJMRSwgQkFTRSArIFZYX0NPTU1BTkQpOworCW91dHcoUlhfRElTQ0FSRF9UT1BfUEFDSywgQkFTRSArIFZYX0NPTU1BTkQpOworCVZYX0JVU1lfV0FJVDsKKwlvdXR3KFRYX0RJU0FCTEUsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwlvdXR3KFNUT1BfVFJBTlNDRUlWRVIsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwl1ZGVsYXkoODAwMCk7CisJb3V0dyhSWF9SRVNFVCwgQkFTRSArIFZYX0NPTU1BTkQpOworCVZYX0JVU1lfV0FJVDsKKwlvdXR3KFRYX1JFU0VULCBCQVNFICsgVlhfQ09NTUFORCk7CisJVlhfQlVTWV9XQUlUOworCW91dHcoQ19JTlRSX0xBVENILCBCQVNFICsgVlhfQ09NTUFORCk7CisJb3V0dyhTRVRfUkRfMF9NQVNLLCBCQVNFICsgVlhfQ09NTUFORCk7CisJb3V0dyhTRVRfSU5UUl9NQVNLLCBCQVNFICsgVlhfQ09NTUFORCk7CisJb3V0dyhTRVRfUlhfRklMVEVSLCBCQVNFICsgVlhfQ09NTUFORCk7CisKKwkvKgorCSogaW5pdGlhbGl6ZSBjYXJkCisJKi8KKwlWWF9CVVNZX1dBSVQ7CisKKwlHT19XSU5ET1coMCk7CisKKwkvKiBEaXNhYmxlIHRoZSBjYXJkICovCisvKglvdXR3KDAsIEJBU0UgKyBWWF9XMF9DT05GSUdfQ1RSTCk7ICovCisKKwkvKiBDb25maWd1cmUgSVJRIHRvIG5vbmUgKi8KKy8qCW91dHcoU0VUX0lSUSgwKSwgQkFTRSArIFZYX1cwX1JFU09VUkNFX0NGRyk7ICovCisKKwkvKiBFbmFibGUgdGhlIGNhcmQgKi8KKy8qCW91dHcoRU5BQkxFX0RSUV9JUlEsIEJBU0UgKyBWWF9XMF9DT05GSUdfQ1RSTCk7ICovCisKKwlHT19XSU5ET1coMik7CisKKwkvKiBSZWxvYWQgdGhlIGV0aGVyX2FkZHIuICovCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCW91dGIobmljLT5ub2RlX2FkZHJbaV0sIEJBU0UgKyBWWF9XMl9BRERSXzAgKyBpKTsKKworCW91dHcoUlhfUkVTRVQsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwlWWF9CVVNZX1dBSVQ7CisJb3V0dyhUWF9SRVNFVCwgQkFTRSArIFZYX0NPTU1BTkQpOworCVZYX0JVU1lfV0FJVDsKKworCS8qIFdpbmRvdyAxIGlzIG9wZXJhdGluZyB3aW5kb3cgKi8KKwlHT19XSU5ET1coMSk7CisJZm9yIChpID0gMDsgaSA8IDMxOyBpKyspCisJCWluYihCQVNFICsgVlhfVzFfVFhfU1RBVFVTKTsKKworCW91dHcoU0VUX1JEXzBfTUFTSyB8IFNfQ0FSRF9GQUlMVVJFIHwgU19SWF9DT01QTEVURSB8CisJCVNfVFhfQ09NUExFVEUgfCBTX1RYX0FWQUlMLCBCQVNFICsgVlhfQ09NTUFORCk7CisJb3V0dyhTRVRfSU5UUl9NQVNLIHwgU19DQVJEX0ZBSUxVUkUgfCBTX1JYX0NPTVBMRVRFIHwKKwkJU19UWF9DT01QTEVURSB8IFNfVFhfQVZBSUwsIEJBU0UgKyBWWF9DT01NQU5EKTsKKworLyoKKyAqIEF0dGVtcHQgdG8gZ2V0IHJpZCBvZiBhbnkgc3RyYXkgaW50ZXJydXB0cyB0aGF0IG9jY3VyZWQgZHVyaW5nCisgKiBjb25maWd1cmF0aW9uLiAgT24gdGhlIGkzODYgdGhpcyBpc24ndCBwb3NzaWJsZSBiZWNhdXNlIG9uZSBtYXkKKyAqIGFscmVhZHkgYmUgcXVldWVkLiAgSG93ZXZlciwgYSBzaW5nbGUgc3RyYXkgaW50ZXJydXB0IGlzCisgKiB1bmltcG9ydGFudC4KKyAqLworCisJb3V0dyhBQ0tfSU5UUiB8IDB4ZmYsIEJBU0UgKyBWWF9DT01NQU5EKTsKKworCW91dHcoU0VUX1JYX0ZJTFRFUiB8IEZJTF9JTkRJVklEVUFMIHwKKwkgICAgRklMX0JSRENTVHxGSUxfTVVMVElDQVNULCBCQVNFICsgVlhfQ09NTUFORCk7CisKKwl2eHNldGxpbmsoKTsKKy8qeworCWludCBpLGo7CisJaSA9IENPTk5FQ1RPUl9UWDsKKwlHT19XSU5ET1coMyk7CisJaiA9IGlubChCQVNFICsgVlhfVzNfSU5URVJOQUxfQ0ZHKSAmIH5JTlRFUk5BTF9DT05ORUNUT1JfTUFTSzsKKwlvdXRsKEJBU0UgKyBWWF9XM19JTlRFUk5BTF9DRkcsIGogfCAoaSA8PElOVEVSTkFMX0NPTk5FQ1RPUl9CSVRTKSk7CisgICAgICAgIEdPX1dJTkRPVyg0KTsKKyAgICAgICAgb3V0dyhMSU5LQkVBVF9FTkFCTEUsIEJBU0UgKyBWWF9XNF9NRURJQV9UWVBFKTsKKyAgICAgICAgR09fV0lORE9XKDEpOworfSovCisKKwkvKiBzdGFydCB0cmFuY2lldmVyIGFuZCByZWNlaXZlciAqLworCW91dHcoUlhfRU5BQkxFLCBCQVNFICsgVlhfQ09NTUFORCk7CisJb3V0dyhUWF9FTkFCTEUsIEJBU0UgKyBWWF9DT01NQU5EKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9UUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBjaGFyIHBhZG1hcFtdID0geworCTAsIDMsIDIsIDF9OworCitzdGF0aWMgdm9pZCB0NTk1X3RyYW5zbWl0KAorc3RydWN0IG5pYyAqbmljLAorY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwordW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwordW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLworY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KK3sKKwlyZWdpc3RlciBpbnQgbGVuOworCWludCBwYWQ7CisJaW50IHN0YXR1czsKKworI2lmZGVmIEVERUJVRworCXByaW50Zigie2w9JWQsdD0laFh9IixzK0VUSF9ITEVOLHQpOworI2VuZGlmCisKKwkvKiBzd2FwIGJ5dGVzIG9mIHR5cGUgKi8KKwl0PSBodG9ucyh0KTsKKworCWxlbj1zK0VUSF9ITEVOOyAvKiBhY3R1YWwgbGVuZ3RoIG9mIHBhY2tldCAqLworCXBhZCA9IHBhZG1hcFtsZW4gJiAzXTsKKworCS8qCisJKiBUaGUgM2M1OTUgYXV0b21hdGljYWxseSBwYWRzIHNob3J0IHBhY2tldHMgdG8gbWluaW11bSBldGhlcm5ldCBsZW5ndGgsCisJKiBidXQgd2UgZHJvcCBwYWNrZXRzIHRoYXQgYXJlIHRvbyBsYXJnZS4gUGVyaGFwcyB3ZSBzaG91bGQgdHJ1bmNhdGUKKwkqIHRoZW0gaW5zdGVhZD8KKwkqLworCWlmIChsZW4gKyBwYWQgPiBFVEhfRlJBTUVfTEVOKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBkcm9wIGFja25vd2xlZGdlbWVudHMgKi8KKwl3aGlsZSgoIHN0YXR1cz1pbmIoQkFTRSArIFZYX1cxX1RYX1NUQVRVUykgKSYgVFhTX0NPTVBMRVRFICkgeworCQlpZihzdGF0dXMgJiAoVFhTX1VOREVSUlVOfFRYU19NQVhfQ09MTElTSU9OfFRYU19TVEFUVVNfT1ZFUkZMT1cpKSB7CisJCQlvdXR3KFRYX1JFU0VULCBCQVNFICsgVlhfQ09NTUFORCk7CisJCQlvdXR3KFRYX0VOQUJMRSwgQkFTRSArIFZYX0NPTU1BTkQpOworCQl9CisKKwkJb3V0YigweDAsIEJBU0UgKyBWWF9XMV9UWF9TVEFUVVMpOworCX0KKworCXdoaWxlIChpbncoQkFTRSArIFZYX1cxX0ZSRUVfVFgpIDwgbGVuICsgcGFkICsgNCkgeworCQkvKiBubyByb29tIGluIEZJRk8gKi8KKwl9CisKKwlvdXR3KGxlbiwgQkFTRSArIFZYX1cxX1RYX1BJT19XUl8xKTsKKwlvdXR3KDB4MCwgQkFTRSArIFZYX1cxX1RYX1BJT19XUl8xKTsJLyogU2Vjb25kIGR3b3JkIG1lYW5pbmdsZXNzICovCisKKwkvKiB3cml0ZSBwYWNrZXQgKi8KKwlvdXRzdyhCQVNFICsgVlhfVzFfVFhfUElPX1dSXzEsIGQsIEVUSF9BTEVOLzIpOworCW91dHN3KEJBU0UgKyBWWF9XMV9UWF9QSU9fV1JfMSwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOLzIpOworCW91dHcodCwgQkFTRSArIFZYX1cxX1RYX1BJT19XUl8xKTsKKwlvdXRzdyhCQVNFICsgVlhfVzFfVFhfUElPX1dSXzEsIHAsIHMgLyAyKTsKKwlpZiAocyAmIDEpCisJCW91dGIoKihwK3MgLSAxKSwgQkFTRSArIFZYX1cxX1RYX1BJT19XUl8xKTsKKworCXdoaWxlIChwYWQtLSkKKwkJb3V0YigwLCBCQVNFICsgVlhfVzFfVFhfUElPX1dSXzEpOwkvKiBQYWRkaW5nICovCisKKyAgICAgICAgLyogd2FpdCBmb3IgVHggY29tcGxldGUgKi8KKyAgICAgICAgd2hpbGUoKGludyhCQVNFICsgVlhfU1RBVFVTKSAmIFNfQ09NTUFORF9JTl9QUk9HUkVTUykgIT0gMCkKKyAgICAgICAgICAgICAgICA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHQ1OTVfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKwkvKiBjb21tb24gdmFyaWFibGVzICovCisJLyogdmFyaWFibGVzIGZvciAzQzU5NSAqLworCXNob3J0IHN0YXR1cywgY3N0OworCXJlZ2lzdGVyIHNob3J0IHJ4X2ZpZm87CisKKwljc3Q9aW53KEJBU0UgKyBWWF9TVEFUVVMpOworCisjaWZkZWYgRURFQlVHCisJaWYoY3N0ICYgMHgxRkZGKQorCQlwcmludGYoIi0laFgtIixjc3QpOworI2VuZGlmCisKKwlpZiggKGNzdCAmIFNfUlhfQ09NUExFVEUpPT0wICkgeworCQkvKiBhY2tub3dsZWRnZSAgZXZlcnl0aGluZyAqLworCQlvdXR3KEFDS19JTlRSIHwgY3N0LCBCQVNFICsgVlhfQ09NTUFORCk7CisJCW91dHcoQ19JTlRSX0xBVENILCBCQVNFICsgVlhfQ09NTUFORCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJc3RhdHVzID0gaW53KEJBU0UgKyBWWF9XMV9SWF9TVEFUVVMpOworI2lmZGVmIEVERUJVRworCXByaW50ZigiKiVoWCoiLHN0YXR1cyk7CisjZW5kaWYKKworCWlmIChzdGF0dXMgJiBFUlJfUlgpIHsKKwkJb3V0dyhSWF9ESVNDQVJEX1RPUF9QQUNLLCBCQVNFICsgVlhfQ09NTUFORCk7CisJCXJldHVybiAwOworCX0KKworCXJ4X2ZpZm8gPSBzdGF0dXMgJiBSWF9CWVRFU19NQVNLOworCWlmIChyeF9maWZvPT0wKQorCQlyZXR1cm4gMDsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJCS8qIHJlYWQgcGFja2V0ICovCisjaWZkZWYgRURFQlVHCisJcHJpbnRmKCJbbD0lZCIscnhfZmlmbyk7CisjZW5kaWYKKwlpbnN3KEJBU0UgKyBWWF9XMV9SWF9QSU9fUkRfMSwgbmljLT5wYWNrZXQsIHJ4X2ZpZm8gLyAyKTsKKwlpZihyeF9maWZvICYgMSkKKwkJbmljLT5wYWNrZXRbcnhfZmlmby0xXT1pbmIoQkFTRSArIFZYX1cxX1JYX1BJT19SRF8xKTsKKwluaWMtPnBhY2tldGxlbj1yeF9maWZvOworCisJd2hpbGUoMSkgeworCQlzdGF0dXMgPSBpbncoQkFTRSArIFZYX1cxX1JYX1NUQVRVUyk7CisjaWZkZWYgRURFQlVHCisJCXByaW50ZigiKiVoWCoiLHN0YXR1cyk7CisjZW5kaWYKKwkJcnhfZmlmbyA9IHN0YXR1cyAmIFJYX0JZVEVTX01BU0s7CisKKwkJaWYocnhfZmlmbz4wKSB7CisJCQlpbnN3KEJBU0UgKyBWWF9XMV9SWF9QSU9fUkRfMSwgbmljLT5wYWNrZXQrbmljLT5wYWNrZXRsZW4sIHJ4X2ZpZm8gLyAyKTsKKwkJCWlmKHJ4X2ZpZm8gJiAxKQorCQkJCW5pYy0+cGFja2V0W25pYy0+cGFja2V0bGVuK3J4X2ZpZm8tMV09aW5iKEJBU0UgKyBWWF9XMV9SWF9QSU9fUkRfMSk7CisJCQluaWMtPnBhY2tldGxlbis9cnhfZmlmbzsKKyNpZmRlZiBFREVCVUcKKwkJCXByaW50ZigiKyVkIixyeF9maWZvKTsKKyNlbmRpZgorCQl9CisJCWlmKCggc3RhdHVzICYgUlhfSU5DT01QTEVURSApPT0wKSB7CisjaWZkZWYgRURFQlVHCisJCQlwcmludGYoIj0lZCIsbmljLT5wYWNrZXRsZW4pOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoMTAwMCk7CisJfQorCisJLyogYWNrbm93bGVkZ2UgcmVjZXB0aW9uIG9mIHBhY2tldCAqLworCW91dHcoUlhfRElTQ0FSRF9UT1BfUEFDSywgQkFTRSArIFZYX0NPTU1BTkQpOworCXdoaWxlIChpbncoQkFTRSArIFZYX1NUQVRVUykgJiBTX0NPTU1BTkRfSU5fUFJPR1JFU1MpOworI2lmZGVmIEVERUJVRworeworCXVuc2lnbmVkIHNob3J0IHR5cGUgPSAwOwkvKiB1c2VkIGJ5IEVERUJVRyAqLworCXR5cGUgPSAobmljLT5wYWNrZXRbMTJdPDw4KSB8IG5pYy0+cGFja2V0WzEzXTsKKwlpZihuaWMtPnBhY2tldFswXStuaWMtPnBhY2tldFsxXStuaWMtPnBhY2tldFsyXStuaWMtPnBhY2tldFszXStuaWMtPnBhY2tldFs0XSsKKwkgICAgbmljLT5wYWNrZXRbNV0gPT0gMHhGRipFVEhfQUxFTikKKwkJcHJpbnRmKCIsdD0laFgsYl0iLHR5cGUpOworCWVsc2UKKwkJcHJpbnRmKCIsdD0laFhdIix0eXBlKTsKK30KKyNlbmRpZgorCXJldHVybiAxOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJM0NvbSA1OTUgLSBzcGVjaWZpYyByb3V0aW5lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2VlcHJvbV9yZHkoKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaXNfZWVwcm9tX2J1c3koQkFTRSkgJiYgaSA8IE1BWF9FRVBST01CVVNZOyBpKyspCisJCXVkZWxheSgxMDAwKTsKKwlpZiAoaSA+PSBNQVhfRUVQUk9NQlVTWSkgeworCSAgICAgICAgLyogcHJpbnRmKCIzYzU5NTogZWVwcm9tIGZhaWxlZCB0byBjb21lIHJlYWR5LlxuIik7ICovCisJCXByaW50ZigiM2M1OTU6IGVlcHJvbSBpcyBidXN5LlxuIik7IC8qIG1lbW9yeSBpbiBFUFJPTSBpcyB0aWdodCAqLworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogZ2V0X2U6IGdldHMgYSAxNiBiaXRzIHdvcmQgZnJvbSB0aGUgRUVQUk9NLiB3ZSBtdXN0IGhhdmUgc2V0IHRoZSB3aW5kb3cKKyAqIGJlZm9yZQorICovCitzdGF0aWMgaW50CitnZXRfZShvZmZzZXQpCitpbnQgb2Zmc2V0OworeworCWlmICghZWVwcm9tX3JkeSgpKQorCQlyZXR1cm4gKDB4ZmZmZik7CisJb3V0dyhFRVBST01fQ01EX1JEIHwgb2Zmc2V0LCBCQVNFICsgVlhfVzBfRUVQUk9NX0NPTU1BTkQpOworCWlmICghZWVwcm9tX3JkeSgpKQorCQlyZXR1cm4gKDB4ZmZmZik7CisJcmV0dXJuIChpbncoQkFTRSArIFZYX1cwX0VFUFJPTV9EQVRBKSk7Cit9CisKK3N0YXRpYyB2b2lkICAgICAgICAgICAgCit2eGdldGxpbmsodm9pZCkKK3sKKyAgICBpbnQgbiwgazsKKworICAgIEdPX1dJTkRPVygzKTsKKyAgICB2eF9jb25uZWN0b3JzID0gaW53KEJBU0UgKyBWWF9XM19SRVNFVF9PUFQpICYgMHg3ZjsKKyAgICBmb3IgKG4gPSAwLCBrID0gMDsgayA8IFZYX0NPTk5FQ1RPUlM7IGsrKykgeworICAgICAgaWYgKHZ4X2Nvbm5lY3RvcnMgJiBjb25uX3RhYltrXS5iaXQpIHsKKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgcHJpbnRmKCIvIik7CisJfQorICAgICAgICBwcmludGYoIiVzIiwgY29ubl90YWJba10ubmFtZSApOworICAgICAgICBuKys7CisgICAgICB9CisgICAgfQorICAgIGlmICh2eF9jb25uZWN0b3JzID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJubyBjb25uZWN0b3JzISIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEdPX1dJTkRPVygzKTsKKyAgICB2eF9jb25uZWN0b3IgPSAoaW5sKEJBU0UgKyBWWF9XM19JTlRFUk5BTF9DRkcpIAorICAgICAgICAgICAgICAgICAgICAgICAgJiBJTlRFUk5BTF9DT05ORUNUT1JfTUFTSykgCisgICAgICAgICAgICAgICAgICAgICAgICA+PiBJTlRFUk5BTF9DT05ORUNUT1JfQklUUzsKKyAgICBpZiAodnhfY29ubmVjdG9yICYgMHgxMCkgeworICAgICAgICB2eF9jb25uZWN0b3IgJj0gMHgwZjsKKyAgICAgICAgcHJpbnRmKCJbKiVzKl0iLCBjb25uX3RhYlt2eF9jb25uZWN0b3JdLm5hbWUpOworICAgICAgICBwcmludGYoIjogZGlzYWJsZSAnYXV0byBzZWxlY3QnIHdpdGggRE9TIHV0aWwhIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJbKiVzKl0iLCBjb25uX3RhYlt2eF9jb25uZWN0b3JdLm5hbWUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgICAgICAgICAgICAKK3Z4c2V0bGluayh2b2lkKQoreyAgICAgICAKKyAgICBpbnQgaSwgajsKKyAgICBjaGFyICpyZWFzb24sICp3YXJuaW5nOworICAgIHN0YXRpYyBjaGFyIHByZXZfY29ubiA9IC0xOworCisgICAgaWYgKHByZXZfY29ubiA9PSAtMSkgeworICAgICAgICBwcmV2X2Nvbm4gPSB2eF9jb25uZWN0b3I7CisgICAgfQorCisgICAgaSA9IHZ4X2Nvbm5lY3RvcjsgICAgICAgLyogZGVmYXVsdCBpbiBFRVBST00gKi8KKyAgICByZWFzb24gPSAiZGVmYXVsdCI7CisgICAgd2FybmluZyA9IDA7CisKKyAgICBpZiAoKHZ4X2Nvbm5lY3RvcnMgJiBjb25uX3RhYlt2eF9jb25uZWN0b3JdLmJpdCkgPT0gMCkgeworICAgICAgICB3YXJuaW5nID0gInN0cmFuZ2UgY29ubmVjdG9yIHR5cGUgaW4gRUVQUk9NLiI7CisgICAgICAgIHJlYXNvbiA9ICJmb3JjZWQiOworICAgICAgICBpID0gQ09OTkVDVE9SX1VUUDsKKyAgICB9CisKKyAgICAgICAgaWYgKHdhcm5pbmcgIT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCJ3YXJuaW5nOiAlc1xuIiwgd2FybmluZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJzZWxlY3RlZCAlcy4gKCVzKVxuIiwgY29ubl90YWJbaV0ubmFtZSwgcmVhc29uKTsKKworICAgIC8qIFNldCB0aGUgc2VsZWN0ZWQgY29ubmVjdG9yLiAqLworICAgIEdPX1dJTkRPVygzKTsKKyAgICBqID0gaW5sKEJBU0UgKyBWWF9XM19JTlRFUk5BTF9DRkcpICYgfklOVEVSTkFMX0NPTk5FQ1RPUl9NQVNLOworICAgIG91dGwoaiB8IChpIDw8SU5URVJOQUxfQ09OTkVDVE9SX0JJVFMpLCBCQVNFICsgVlhfVzNfSU5URVJOQUxfQ0ZHKTsKKworICAgIC8qIEZpcnN0LCBkaXNhYmxlIGFsbC4gKi8KKyAgICBvdXR3KFNUT1BfVFJBTlNDRUlWRVIsIEJBU0UgKyBWWF9DT01NQU5EKTsKKyAgICB1ZGVsYXkoODAwMCk7CisgICAgR09fV0lORE9XKDQpOworICAgIG91dHcoMCwgQkFTRSArIFZYX1c0X01FRElBX1RZUEUpOworCisgICAgLyogU2Vjb25kLCBlbmFibGUgdGhlIHNlbGVjdGVkIG9uZS4gKi8KKyAgICBzd2l0Y2goaSkgeworICAgICAgY2FzZSBDT05ORUNUT1JfVVRQOgorICAgICAgICBHT19XSU5ET1coNCk7CisgICAgICAgIG91dHcoRU5BQkxFX1VUUCwgQkFTRSArIFZYX1c0X01FRElBX1RZUEUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ09OTkVDVE9SX0JOQzoKKyAgICAgICAgb3V0dyhTVEFSVF9UUkFOU0NFSVZFUixCQVNFICsgVlhfQ09NTUFORCk7CisgICAgICAgIHVkZWxheSg4MDAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENPTk5FQ1RPUl9UWDoKKyAgICAgIGNhc2UgQ09OTkVDVE9SX0ZYOgorICAgICAgICBHT19XSU5ET1coNCk7CisgICAgICAgIG91dHcoTElOS0JFQVRfRU5BQkxFLCBCQVNFICsgVlhfVzRfTUVESUFfVFlQRSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogIC8qIEFVSSBhbmQgTUlJIGZhbGwgaGVyZSAqLworICAgICAgICBicmVhazsKKyAgICB9CisgICAgR09fV0lORE9XKDEpOyAKK30KKworc3RhdGljIHZvaWQgdDU5NV9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljICkgeworCisJdDU5NV9yZXNldChuaWMpOworCisJb3V0dyhTVE9QX1RSQU5TQ0VJVkVSLCBCQVNFICsgVlhfQ09NTUFORCk7CisJdWRlbGF5KDgwMDApOworCUdPX1dJTkRPVyg0KTsKKwlvdXR3KDAsIEJBU0UgKyBWWF9XNF9NRURJQV9UWVBFKTsKKwlHT19XSU5ET1coMSk7Cit9CisKK3N0YXRpYyB2b2lkIHQ1OTVfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB0NTk1X3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgKnA7CisKKwlpZiAocGNpLT5pb2FkZHIgPT0gMCkKKwkJcmV0dXJuIDA7CisJZXRoX25pY19iYXNlID0gcGNpLT5pb2FkZHI7CisKKwluaWMtPmlycW5vICA9IDA7CisJbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkcjsKKworCUdPX1dJTkRPVygwKTsKKwlvdXR3KEdMT0JBTF9SRVNFVCwgQkFTRSArIFZYX0NPTU1BTkQpOworCVZYX0JVU1lfV0FJVDsKKworCXZ4Z2V0bGluaygpOworCisvKgorCXByaW50ZigiXG5FRVBST006Iik7CisJZm9yIChpID0gMDsgaSA8IChFRVBST01TSVpFLzIpOyBpKyspIHsKKwkgIHByaW50ZigiJWhYOiIsIGdldF9lKGkpKTsKKwl9CisJcHJpbnRmKCJcbiIpOworKi8KKwkvKgorCSogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIGZyb20gdGhlIGVlcHJvbQorCSovCisJcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBuaWMtPm5vZGVfYWRkcjsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCUdPX1dJTkRPVygwKTsKKwkJcFtpXSA9IGh0b25zKGdldF9lKEVFUFJPTV9PRU1fQUREUl8wICsgaSkpOworCQlHT19XSU5ET1coMik7CisJCW91dHcobnRvaHMocFtpXSksIEJBU0UgKyBWWF9XMl9BRERSXzAgKyAoaSAqIDIpKTsKKwl9CisKKwlEQkcgKCAiRXRoZXJuZXQgYWRkcmVzczogJXNcbiIsIGV0aF9udG9hIChuaWMtPm5vZGVfYWRkcikgKTsKKworCXQ1OTVfcmVzZXQobmljKTsKKwluaWMtPm5pY19vcAk9ICZ0NTk1X29wZXJhdGlvbnM7CisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyB0NTk1X29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QJPSBkdW1teV9jb25uZWN0LAorCS5wb2xsCQk9IHQ1OTVfcG9sbCwKKwkudHJhbnNtaXQJPSB0NTk1X3RyYW5zbWl0LAorCS5pcnEJCT0gdDU5NV9pcnEsCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0NTk1X25pY3NbXSA9IHsKK1BDSV9ST00oMHgxMGI3LCAweDU5MDAsICIzYzU5MCIsICAgICAgICAgICAiM0NvbTU5MCIsIDApLAkJLyogVm9ydGV4IDEwTWJwcyAqLworUENJX1JPTSgweDEwYjcsIDB4NTk1MCwgIjNjNTk1IiwgICAgICAgICAgICIzQ29tNTk1IiwgMCksCQkvKiBWb3J0ZXggMTAwYmFzZVR4ICovCitQQ0lfUk9NKDB4MTBiNywgMHg1OTUxLCAiM2M1OTUtMSIsICAgICAgICAgIjNDb201OTUiLCAwKSwJCS8qIFZvcnRleCAxMDBiYXNlVDQgKi8KK1BDSV9ST00oMHgxMGI3LCAweDU5NTIsICIzYzU5NS0yIiwgICAgICAgICAiM0NvbTU5NSIsIDApLAkJLyogVm9ydGV4IDEwMGJhc2UtTUlJICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDAwLCAiM2M5MDAtdHBvIiwgICAgICAgIjNDb205MDAtVFBPIiwgMCksCS8qIDEwIEJhc2UgVFBPICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDAxLCAiM2M5MDAtdDQiLCAgICAgICAgIjNDb205MDAtQ29tYm8iLCAwKSwJLyogMTAvMTAwIFQ0ICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDA0LCAiM2M5MDBiLXRwbyIsICAgICAgIjNDb205MDBCLVRQTyIsIDApLAkvKiAxMCBCYXNlIFRQTyAqLworUENJX1JPTSgweDEwYjcsIDB4OTAwNSwgIjNjOTAwYi1jb21ibyIsICAgICIzQ29tOTAwQi1Db21ibyIsIDApLAkvKiAxMCBCYXNlIENvbWJvICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDA2LCAiM2M5MDBiLXRwYjIiLCAgICAgIjNDb205MDBCLTIvVCIsIDApLAkvKiAxMCBCYXNlIFRQIGFuZCBCYXNlMiAqLworUENJX1JPTSgweDEwYjcsIDB4OTAwYSwgIjNjOTAwYi1mbCIsICAgICAgICIzQ29tOTAwQi1GTCIsIDApLAkvKiAxMCBCYXNlIEYgKi8KK1BDSV9ST00oMHgxMGI3LCAweDk4MDAsICIzYzk4MC1jeWNsb25lLTEiLCAiM0NvbTk4MC1DeWNsb25lIiwgMCksCS8qIEN5Y2xvbmUgKi8KK1BDSV9ST00oMHgxMGI3LCAweDk4MDUsICIzYzk4MDUtMSIsICAgICAgICAiM0NvbTk4MDUiLCAwKSwJCS8qIER1YWwgUG9ydCBTZXJ2ZXIgQ3ljbG9uZSAqLworUENJX1JPTSgweDEwYjcsIDB4NzY0NiwgIjNjc29obzEwMC10eC0xIiwgICIzQ1NPSE8xMDAtVFgiLCAwKSwJLyogSHVycmljYW5lICovCitQQ0lfUk9NKDB4MTBiNywgMHg0NTAwLCAiM2M0NTAtMSIsICAgICAgICAgIjNDb200NTAgSG9tZVBOQSBUb3JuYWRvIiwgMCksCit9OworCitQQ0lfRFJJVkVSICggdDU5NV9kcml2ZXIsIHQ1OTVfbmljcywgUENJX05PX0NMQVNTICk7CisKK0RSSVZFUiAoICIzQzU5NSIsIG5pY19kcml2ZXIsIHBjaV9kcml2ZXIsIHQ1OTVfZHJpdmVyLAorCSB0NTk1X3Byb2JlLCB0NTk1X2Rpc2FibGUgKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNTk1LmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzU5NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyN2QyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzU5NS5oCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzIEhlcmIgUGV5ZXJsIChocGV5ZXJsQG5vdmF0ZWwuY2EpIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIDIuIFRoZSBuYW1lCisgKiBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyBPY3RvYmVyIDIsIDE5OTQKKworIE1vZGlmaWVkIGJ5OiBBbmRyZXMgVmVnYSBHYXJjaWEKKworIElOUklBIC0gU29waGlhIEFudGlwb2xpcywgRnJhbmNlCisgZS1tYWlsOiBhdmVnYUBzb3BoaWEuaW5yaWEuZnIKKyBmaW5nZXI6IGF2ZWdhQHBheC5pbnJpYS5mcgorCisgKi8KKworRklMRV9MSUNFTkNFICggQlNEMyApOworCisvKgorICogQ3JlYXRlZCBmcm9tIGlmX2VwcmVnLmggYnkgRnJlZCBHcmF5IChmZ3JheUByaWNlLmVkdSkgdG8gc3VwcG9ydCB0aGUKKyAqIDNjNTkwIGZhbWlseS4KKyAqLworCisvKgorICogTW9kaWZpZWQgYnkgU2h1c3VrZSBOaXNpeWFtYSA8c2h1QGF0aGVuYS5xZS5lbmcuaG9rdWRhaS5hYy5qcD4KKyAqIGZvciBldGhlcmJvb3QKKyAqIE1hci4gMTQsIDIwMDAKKyovCisKKy8qCisgKiBFdGhlcm5ldCBzb2Z0d2FyZSBzdGF0dXMgcGVyIGludGVyZmFjZS4KKyAqLworCisvKgorICogU29tZSBnbG9iYWwgY29uc3RhbnRzCisgKi8KKworI2RlZmluZSBUWF9JTklUX1JBVEUgICAgICAgICAxNgorI2RlZmluZSBUWF9JTklUX01BWF9SQVRFICAgICA2NAorI2RlZmluZSBSWF9JTklUX0xBVEVOQ1kgICAgICA2NAorI2RlZmluZSBSWF9JTklUX0VBUkxZX1RIUkVTSCA2NAorI2RlZmluZSBNSU5fUlhfRUFSTFlfVEhSRVNIRiAgIDE2IC8qIG5vdCBsZXNzIHRoYW4gZXRoZXJfaGVhZGVyICovCisjZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hMICAgNAorCisjZGVmaW5lIEVFUFJPTVNJWkUgICAgICAweDQwCisjZGVmaW5lIE1BWF9FRVBST01CVVNZICAxMDAwCisjZGVmaW5lIFZYX0xBU1RfVEFHICAgICAweGQ3CisjZGVmaW5lIFZYX01BWF9CT0FSRFMgICAxNgorI2RlZmluZSBWWF9JRF9QT1JUICAgICAgMHgxMDAKKworLyoKKyAqIHNvbWUgbWFjcm9zIHRvIGFjY2VzIGxvbmcgbmFtZWQgZmllbGRzCisgKi8KKyNkZWZpbmUgQkFTRSAJKGV0aF9uaWNfYmFzZSkKKworLyoKKyAqIENvbW1hbmRzIHRvIHJlYWQvd3JpdGUgRUVQUk9NIHRyb3VnaCBFRVBST00gY29tbWFuZCByZWdpc3RlciAoV2luZG93IDAsCisgKiBPZmZzZXQgMHhhKQorICovCisjZGVmaW5lIEVFUFJPTV9DTURfUkQgICAgMHgwMDgwCS8qIFJlYWQ6ICBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfV1IgICAgMHgwMDQwCS8qIFdyaXRlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfRVJBU0UgMHgwMGMwCS8qIEVyYXNlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfRVdFTiAgMHgwMDMwCS8qIEVyYXNlL1dyaXRlIEVuYWJsZTogTm8gZGF0YSByZXF1aXJlZCAqLworCisjZGVmaW5lIEVFUFJPTV9CVVNZCQkoMTw8MTUpCisKKy8qCisgKiBTb21lIHNob3J0IGZ1bmN0aW9ucywgd29ydGggdG8gbGV0IHRoZW0gYmUgYSBtYWNybworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkgICoKKyAqIFRoZXNlIGRlZmluZSB0aGUgRUVQUk9NIGRhdGEgc3RydWN0dXJlLiAgVGhleSBhcmUgdXNlZCBpbiB0aGUgcHJvYmUKKyAqIGZ1bmN0aW9uIHRvIHZlcmlmeSB0aGUgZXhpc3RlbmNlIG9mIHRoZSBhZGFwdGVyIGFmdGVyIGhhdmluZyBzZW50CisgKiB0aGUgSURfU2VxdWVuY2UuCisgKgorICogVGhlcmUgYXJlIG90aGVycyBidXQgb25seSB0aGUgb25lcyB3ZSB1c2UgYXJlIGRlZmluZWQgaGVyZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRUVQUk9NX05PREVfQUREUl8wCTB4MAkvKiBXb3JkICovCisjZGVmaW5lIEVFUFJPTV9OT0RFX0FERFJfMQkweDEJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fTk9ERV9BRERSXzIJMHgyCS8qIFdvcmQgKi8KKyNkZWZpbmUgRUVQUk9NX1BST0RfSUQJCTB4MwkvKiAweDlbMC1mXTUwICovCisjZGVmaW5lIEVFUFJPTV9NRkdfSUQJCTB4NwkvKiAweDZkNTAgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFJfQ0ZHCQkweDgJLyogQmFzZSBhZGRyICovCisjZGVmaW5lIEVFUFJPTV9SRVNPVVJDRV9DRkcJMHg5CS8qIElSUS4gQml0cyAxMi0xNSAqLworI2RlZmluZSBFRVBST01fT0VNX0FERFJfMAkweGEJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fT0VNX0FERFJfMQkweGIJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fT0VNX0FERFJfMgkweGMJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fU09GVF9JTkZPXzIJMHhmICAgICAvKiBTb2Z0d2FyZSBpbmZvcm1hdGlvbiAyICovCisKKyNkZWZpbmUgTk9fUlhfT1ZOX0FOT01BTFkgICAgICAgKDE8PDUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkJICAqCisgKiBUaGVzZSBhcmUgdGhlIHJlZ2lzdGVycyBmb3IgdGhlIDNDb20gM2M1MDkgYW5kIHRoZWlyIGJpdCBwYXR0ZXJucyB3aGVuICoKKyAqIGFwcGxpY2FibGUuICBUaGV5IGhhdmUgYmVlbiB0YWtlbiBvdXQgdGhlIHRoZSAiRXRoZXJMaW5rIElJSSBQYXJhbGxlbCAgKgorICogVGFza2luZyBFSVNBIGFuZCBJU0EgVGVjaG5pY2FsIFJlZmVyZW5jZSIgIkJldGEgRHJhZnQgMTAvMzAvOTIiIG1hbnVhbCAqCisgKiBmcm9tIDNjb20uCQkJCQkJCQkgICoKKyAqCQkJCQkJCQkJCSAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFZYX0NPTU1BTkQJCTB4MGUJLyogV3JpdGUuIEJBU0UrMHgwZSBpcyBhbHdheXMgYQorCQkJCQkgKiBjb21tYW5kIHJlZy4gKi8KKyNkZWZpbmUgVlhfU1RBVFVTCQkweDBlCS8qIFJlYWQuIEJBU0UrMHgwZSBpcyBhbHdheXMgc3RhdHVzCisJCQkJCSAqIHJlZy4gKi8KKyNkZWZpbmUgVlhfV0lORE9XCQkweDBmCS8qIFJlYWQuIEJBU0UrMHgwZiBpcyBhbHdheXMgd2luZG93CisJCQkJCSAqIHJlZy4gKi8KKy8qCisgKiBXaW5kb3cgMCByZWdpc3RlcnMuIFNldHVwLgorICovCisvKiBXcml0ZSAqLworI2RlZmluZSBWWF9XMF9FRVBST01fREFUQQkweDBjCisjZGVmaW5lIFZYX1cwX0VFUFJPTV9DT01NQU5ECTB4MGEKKyNkZWZpbmUgVlhfVzBfUkVTT1VSQ0VfQ0ZHCTB4MDgKKyNkZWZpbmUgVlhfVzBfQUREUkVTU19DRkcJMHgwNiAKKyNkZWZpbmUgVlhfVzBfQ09ORklHX0NUUkwJMHgwNAorICAgICAgICAvKiBSZWFkICovCisjZGVmaW5lIFZYX1cwX1BST0RVQ1RfSUQJMHgwMgorI2RlZmluZSBWWF9XMF9NRkdfSUQJCTB4MDAKKworCisvKgorICogV2luZG93IDEgcmVnaXN0ZXJzLiBPcGVyYXRpbmcgU2V0LgorICovCisvKiBXcml0ZSAqLworI2RlZmluZSBWWF9XMV9UWF9QSU9fV1JfMgkweDAyCisjZGVmaW5lIFZYX1cxX1RYX1BJT19XUl8xCTB4MDAKKy8qIFJlYWQgKi8KKyNkZWZpbmUgVlhfVzFfRlJFRV9UWAkJMHgwYworI2RlZmluZSBWWF9XMV9UWF9TVEFUVVMJCTB4MGIJLyogYnl0ZSAqLworI2RlZmluZSBWWF9XMV9USU1FUgkJMHgwYQkvKiBieXRlICovCisjZGVmaW5lIFZYX1cxX1JYX1NUQVRVUwkJMHgwOAorI2RlZmluZSBWWF9XMV9SWF9QSU9fUkRfMgkweDAyCisjZGVmaW5lIFZYX1cxX1JYX1BJT19SRF8xCTB4MDAKKworLyoKKyAqIFdpbmRvdyAyIHJlZ2lzdGVycy4gU3RhdGlvbiBBZGRyZXNzIFNldHVwL1JlYWQKKyAqLworLyogUmVhZC9Xcml0ZSAqLworI2RlZmluZSBWWF9XMl9BRERSXzUJCTB4MDUKKyNkZWZpbmUgVlhfVzJfQUREUl80CQkweDA0CisjZGVmaW5lIFZYX1cyX0FERFJfMwkJMHgwMworI2RlZmluZSBWWF9XMl9BRERSXzIJCTB4MDIKKyNkZWZpbmUgVlhfVzJfQUREUl8xCQkweDAxCisjZGVmaW5lIFZYX1cyX0FERFJfMAkJMHgwMAorCisvKgorICogV2luZG93IDMgcmVnaXN0ZXJzLiBGSUZPIE1hbmFnZW1lbnQuCisgKi8KKy8qIFJlYWQgKi8KKyNkZWZpbmUgVlhfVzNfSU5URVJOQUxfQ0ZHCTB4MDAKKyNkZWZpbmUgVlhfVzNfUkVTRVRfT1BUCQkweDA4CisjZGVmaW5lIFZYX1czX0ZSRUVfVFgJCTB4MGMKKyNkZWZpbmUgVlhfVzNfRlJFRV9SWAkJMHgwYQorCisvKgorICogV2luZG93IDQgcmVnaXN0ZXJzLiBEaWFnbm9zdGljcy4KKyAqLworLyogUmVhZC9Xcml0ZSAqLworI2RlZmluZSBWWF9XNF9NRURJQV9UWVBFCTB4MGEKKyNkZWZpbmUgVlhfVzRfQ1RSTFJfU1RBVFVTCTB4MDgKKyNkZWZpbmUgVlhfVzRfTkVUX0RJQUcJCTB4MDYKKyNkZWZpbmUgVlhfVzRfRklGT19ESUFHCQkweDA0CisjZGVmaW5lIFZYX1c0X0hPU1RfRElBRwkJMHgwMgorI2RlZmluZSBWWF9XNF9UWF9ESUFHCQkweDAwCisKKy8qCisgKiBXaW5kb3cgNSBSZWdpc3RlcnMuICBSZXN1bHRzIGFuZCBJbnRlcm5hbCBzdGF0dXMuCisgKi8KKy8qIFJlYWQgKi8KKyNkZWZpbmUgVlhfVzVfUkVBRF8wX01BU0sJMHgwYworI2RlZmluZSBWWF9XNV9JTlRSX01BU0sJCTB4MGEKKyNkZWZpbmUgVlhfVzVfUlhfRklMVEVSCQkweDA4CisjZGVmaW5lIFZYX1c1X1JYX0VBUkxZX1RIUkVTSAkweDA2CisjZGVmaW5lIFZYX1c1X1RYX0FWQUlMX1RIUkVTSAkweDAyCisjZGVmaW5lIFZYX1c1X1RYX1NUQVJUX1RIUkVTSAkweDAwCisKKy8qCisgKiBXaW5kb3cgNiByZWdpc3RlcnMuIFN0YXRpc3RpY3MuCisgKi8KKy8qIFJlYWQvV3JpdGUgKi8KKyNkZWZpbmUgVFhfVE9UQUxfT0sJCTB4MGMKKyNkZWZpbmUgUlhfVE9UQUxfT0sJCTB4MGEKKyNkZWZpbmUgVFhfREVGRVJSQUxTCQkweDA4CisjZGVmaW5lIFJYX0ZSQU1FU19PSwkJMHgwNworI2RlZmluZSBUWF9GUkFNRVNfT0sJCTB4MDYKKyNkZWZpbmUgUlhfT1ZFUlJVTlMJCTB4MDUKKyNkZWZpbmUgVFhfQ09MTElTSU9OUwkJMHgwNAorI2RlZmluZSBUWF9BRlRFUl8xX0NPTExJU0lPTgkweDAzCisjZGVmaW5lIFRYX0FGVEVSX1hfQ09MTElTSU9OUwkweDAyCisjZGVmaW5lIFRYX05PX1NRRQkJMHgwMQorI2RlZmluZSBUWF9DRF9MT1NUCQkweDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb21tYW5kIHJlZ2lzdGVyLiBBbGwgd2luZG93cy4KKyAqCisgKiAxNiBiaXQgcmVnaXN0ZXIuCisgKiAgICAgMTUtMTE6ICA1LWJpdCBjb2RlIGZvciBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLgorICogICAgIDEwLTA6ICAgMTEtYml0IGFyZyBpZiBhbnkuIEZvciBjb21tYW5kcyB3aXRoIG5vIGFyZ3M7CisgKgkgICAgICB0aGlzIGNhbiBiZSBzZXQgdG8gYW55dGhpbmcuCisgKi8KKyNkZWZpbmUgR0xPQkFMX1JFU0VUCQkodW5zaWduZWQgc2hvcnQpIDB4MDAwMAkvKiBXYWl0IGF0IGxlYXN0IDFtcworCQkJCQkJCSAqIGFmdGVyIGlzc3VpbmcgKi8KKyNkZWZpbmUgV0lORE9XX1NFTEVDVAkJKHVuc2lnbmVkIHNob3J0KSAoMHgxPDwxMSkKKyNkZWZpbmUgU1RBUlRfVFJBTlNDRUlWRVIJKHVuc2lnbmVkIHNob3J0KSAoMHgyPDwxMSkJLyogUmVhZCBBRERSX0NGRyByZWcgdG8KKwkJCQkJCQkgKiBkZXRlcm1pbmUgd2hldGhlcgorCQkJCQkJCSAqIHRoaXMgaXMgbmVlZGVkLiBJZgorCQkJCQkJCSAqIHNvOyB3YWl0IDgwMCB1U2VjCisJCQkJCQkJICogYmVmb3JlIHVzaW5nIHRyYW5zLQorCQkJCQkJCSAqIGNlaXZlci4gKi8KKyNkZWZpbmUgUlhfRElTQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgzPDwxMSkJLyogc3RhdGUgZGlzYWJsZWQgb24KKwkJCQkJCQkgKiBwb3dlci11cCAqLworI2RlZmluZSBSWF9FTkFCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4NDw8MTEpCisjZGVmaW5lIFJYX1JFU0VUCQkodW5zaWduZWQgc2hvcnQpICgweDU8PDExKQorI2RlZmluZSBSWF9ESVNDQVJEX1RPUF9QQUNLCSh1bnNpZ25lZCBzaG9ydCkgKDB4ODw8MTEpCisjZGVmaW5lIFRYX0VOQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHg5PDwxMSkKKyNkZWZpbmUgVFhfRElTQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHhhPDwxMSkKKyNkZWZpbmUgVFhfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Yjw8MTEpCisjZGVmaW5lIFJFUV9JTlRSCQkodW5zaWduZWQgc2hvcnQpICgweGM8PDExKQorLyoKKyAqIFRoZSBmb2xsb3dpbmcgQ18qIGFja25vd2xlZGdlIHRoZSB2YXJpb3VzIGludGVycnVwdHMuIFNvbWUgb2YgdGhlbSBkb24ndAorICogZG8gYW55dGhpbmcuICBTZWUgdGhlIG1hbnVhbC4KKyAqLworI2RlZmluZSBBQ0tfSU5UUgkJKHVuc2lnbmVkIHNob3J0KSAoMHg2ODAwKQorIwlkZWZpbmUgQ19JTlRSX0xBVENICSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MSkKKyMJZGVmaW5lIENfQ0FSRF9GQUlMVVJFCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MikKKyMJZGVmaW5lIENfVFhfQ09NUExFVEUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHg0KQorIwlkZWZpbmUgQ19UWF9BVkFJTAkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDgpCisjCWRlZmluZSBDX1JYX0NPTVBMRVRFCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MTApCisjCWRlZmluZSBDX1JYX0VBUkxZCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MjApCisjCWRlZmluZSBDX0lOVF9SUUQJCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4NDApCisjCWRlZmluZSBDX1VQRF9TVEFUUwkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDgwKQorI2RlZmluZSBTRVRfSU5UUl9NQVNLCQkodW5zaWduZWQgc2hvcnQpICgweGU8PDExKQorI2RlZmluZSBTRVRfUkRfMF9NQVNLCQkodW5zaWduZWQgc2hvcnQpICgweGY8PDExKQorI2RlZmluZSBTRVRfUlhfRklMVEVSCQkodW5zaWduZWQgc2hvcnQpICgweDEwPDwxMSkKKyMJZGVmaW5lIEZJTF9JTkRJVklEVUFMCSh1bnNpZ25lZCBzaG9ydCkgKDB4MSkKKyMJZGVmaW5lIEZJTF9NVUxUSUNBU1QgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4MDIpCisjCWRlZmluZSBGSUxfQlJEQ1NUICAgICAgICAodW5zaWduZWQgc2hvcnQpICgweDA0KQorIwlkZWZpbmUgRklMX1BST01JU0MgICAgICAgKHVuc2lnbmVkIHNob3J0KSAoMHgwOCkKKyNkZWZpbmUgU0VUX1JYX0VBUkxZX1RIUkVTSAkodW5zaWduZWQgc2hvcnQpICgweDExPDwxMSkKKyNkZWZpbmUgU0VUX1RYX0FWQUlMX1RIUkVTSAkodW5zaWduZWQgc2hvcnQpICgweDEyPDwxMSkKKyNkZWZpbmUgU0VUX1RYX1NUQVJUX1RIUkVTSAkodW5zaWduZWQgc2hvcnQpICgweDEzPDwxMSkKKyNkZWZpbmUgU1RBVFNfRU5BQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDE1PDwxMSkKKyNkZWZpbmUgU1RBVFNfRElTQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgxNjw8MTEpCisjZGVmaW5lIFNUT1BfVFJBTlNDRUlWRVIJKHVuc2lnbmVkIHNob3J0KSAoMHgxNzw8MTEpCisKKy8qCisgKiBTdGF0dXMgcmVnaXN0ZXIuIEFsbCB3aW5kb3dzLgorICoKKyAqICAgICAxNS0xMzogIFdpbmRvdyBudW1iZXIoMC03KS4KKyAqICAgICAxMjogICAgIENvbW1hbmRfaW5fcHJvZ3Jlc3MuCisgKiAgICAgMTE6ICAgICByZXNlcnZlZC4KKyAqICAgICAxMDogICAgIHJlc2VydmVkLgorICogICAgIDk6ICAgICAgcmVzZXJ2ZWQuCisgKiAgICAgODogICAgICByZXNlcnZlZC4KKyAqICAgICA3OiAgICAgIFVwZGF0ZSBTdGF0aXN0aWNzLgorICogICAgIDY6ICAgICAgSW50ZXJydXB0IFJlcXVlc3RlZC4KKyAqICAgICA1OiAgICAgIFJYIEVhcmx5LgorICogICAgIDQ6ICAgICAgUlggQ29tcGxldGUuCisgKiAgICAgMzogICAgICBUWCBBdmFpbGFibGUuCisgKiAgICAgMjogICAgICBUWCBDb21wbGV0ZS4KKyAqICAgICAxOiAgICAgIEFkYXB0ZXIgRmFpbHVyZS4KKyAqICAgICAwOiAgICAgIEludGVycnVwdCBMYXRjaC4KKyAqLworI2RlZmluZSBTX0lOVFJfTEFUQ0gJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MSkKKyNkZWZpbmUgU19DQVJEX0ZBSUxVUkUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MikKKyNkZWZpbmUgU19UWF9DT01QTEVURQkJKHVuc2lnbmVkIHNob3J0KSAoMHg0KQorI2RlZmluZSBTX1RYX0FWQUlMCQkodW5zaWduZWQgc2hvcnQpICgweDgpCisjZGVmaW5lIFNfUlhfQ09NUExFVEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTApCisjZGVmaW5lIFNfUlhfRUFSTFkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MjApCisjZGVmaW5lIFNfSU5UX1JRRAkJKHVuc2lnbmVkIHNob3J0KSAoMHg0MCkKKyNkZWZpbmUgU19VUERfU1RBVFMJCSh1bnNpZ25lZCBzaG9ydCkgKDB4ODApCisjZGVmaW5lIFNfQ09NTUFORF9JTl9QUk9HUkVTUwkodW5zaWduZWQgc2hvcnQpICgweDEwMDApCisKKyNkZWZpbmUgVlhfQlVTWV9XQUlUIHdoaWxlIChpbncoQkFTRSArIFZYX1NUQVRVUykgJiBTX0NPTU1BTkRfSU5fUFJPR1JFU1MpCisKKy8qIEFkZHJlc3MgQ29uZmlnLiBSZWdpc3Rlci4gICAgCisgKiBXaW5kb3cgMC9Qb3J0IDA2CisgKi8KKworI2RlZmluZSBBQ0ZfQ09OTkVDVE9SX0JJVFMJMTQgIAorI2RlZmluZSBBQ0ZfQ09OTkVDVE9SX1VUUAkwCisjZGVmaW5lIEFDRl9DT05ORUNUT1JfQVVJCTEKKyNkZWZpbmUgQUNGX0NPTk5FQ1RPUl9CTkMJMworICAgCisjZGVmaW5lIElOVEVSTkFMX0NPTk5FQ1RPUl9CSVRTIDIwCisjZGVmaW5lIElOVEVSTkFMX0NPTk5FQ1RPUl9NQVNLIDB4MDE3MDAwMDAKKworLyoKKyAqIEZJRk8gUmVnaXN0ZXJzLiBSWCBTdGF0dXMuCisgKgorICogICAgIDE1OiAgICAgSW5jb21wbGV0ZSBvciBGSUZPIGVtcHR5LgorICogICAgIDE0OiAgICAgMTogRXJyb3IgaW4gUlggUGFja2V0ICAgMDogSW5jb21wbGV0ZSBvciBubyBlcnJvci4KKyAqICAgICAxMy0xMTogIFR5cGUgb2YgZXJyb3IuCisgKgkgICAgICAxMDAwID0gT3ZlcnJ1bi4KKyAqCSAgICAgIDEwMTEgPSBSdW4gUGFja2V0IEVycm9yLgorICoJICAgICAgMTEwMCA9IEFsaWdubWVudCBFcnJvci4KKyAqCSAgICAgIDExMDEgPSBDUkMgRXJyb3IuCisgKgkgICAgICAxMDAxID0gT3ZlcnNpemUgUGFja2V0IEVycm9yICg+MTUxNCBieXRlcykKKyAqCSAgICAgIDAwMTAgPSBEcmliYmxlIEJpdHMuCisgKgkgICAgICAoYWxsIG90aGVyIGVycm9yIGNvZGVzLCBubyBlcnJvcnMuKQorICoKKyAqICAgICAxMC0wOiAgIFJYIEJ5dGVzICgwLTE1MTQpCisgKi8KKyNkZWZpbmUgRVJSX0lOQ09NUExFVEUgICh1bnNpZ25lZCBzaG9ydCkgKDB4ODAwMCkKKyNkZWZpbmUgRVJSX1JYICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NDAwMCkKKyNkZWZpbmUgRVJSX01BU0sgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NzgwMCkKKyNkZWZpbmUgRVJSX09WRVJSVU4gICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NDAwMCkKKyNkZWZpbmUgRVJSX1JVTlQgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NTgwMCkKKyNkZWZpbmUgRVJSX0FMSUdOTUVOVCAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NjAwMCkKKyNkZWZpbmUgRVJSX0NSQyAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NjgwMCkKKyNkZWZpbmUgRVJSX09WRVJTSVpFICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NDgwMCkKKyNkZWZpbmUgRVJSX0RSSUJCTEUgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4MTAwMCkKKworLyoKKyAqIFRYIFN0YXR1cy4gCisgKgorICogICBSZXBvcnRzIHRoZSB0cmFuc21pdCBzdGF0dXMgb2YgYSBjb21wbGV0ZWQgdHJhbnNtaXNzaW9uLiBXcml0aW5nIHRoaXMKKyAqICAgcmVnaXN0ZXIgcG9wcyB0aGUgdHJhbnNtaXQgY29tcGxldGlvbiBzdGFjay4KKyAqCisgKiAgIFdpbmRvdyAxL1BvcnQgMHgwYi4KKyAqCisgKiAgICAgNzogICAgICBDb21wbGV0ZQorICogICAgIDY6ICAgICAgSW50ZXJydXB0IG9uIHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIHJlcXVlc3RlZC4KKyAqICAgICA1OiAgICAgIEphYmJlciBFcnJvciAoVFAgT25seSwgVFggUmVzZXQgcmVxdWlyZWQuICkKKyAqICAgICA0OiAgICAgIFVuZGVycnVuIChUWCBSZXNldCByZXF1aXJlZC4gKQorICogICAgIDM6ICAgICAgTWF4aW11bSBDb2xsaXNpb25zLgorICogICAgIDI6ICAgICAgVFggU3RhdHVzIE92ZXJmbG93LgorICogICAgIDEtMDogICAgVW5kZWZpbmVkLgorICoKKyAqLworI2RlZmluZSBUWFNfQ09NUExFVEUJCTB4ODAKKyNkZWZpbmUgVFhTX0lOVFJfUkVRCQkweDQwCisjZGVmaW5lIFRYU19KQUJCRVIJCTB4MjAKKyNkZWZpbmUgVFhTX1VOREVSUlVOCQkweDEwCisjZGVmaW5lIFRYU19NQVhfQ09MTElTSU9OCTB4OAorI2RlZmluZSBUWFNfU1RBVFVTX09WRVJGTE9XCTB4NAorCisjZGVmaW5lIFJTX0FVSQkJCSgxPDw1KQorI2RlZmluZSBSU19CTkMJCQkoMTw8NCkKKyNkZWZpbmUgUlNfVVRQCQkJKDE8PDMpCisjZGVmaW5lCVJTX1Q0CQkJKDE8PDApCisjZGVmaW5lCVJTX1RYCQkJKDE8PDEpCisjZGVmaW5lCVJTX0ZYCQkJKDE8PDIpCisjZGVmaW5lCVJTX01JSQkJCSgxPDw2KQorCisKKy8qCisgKiBGSUZPIFN0YXR1cyAoV2luZG93IDQpCisgKgorICogICBTdXBwb3J0cyBGSUZPIGRpYWdub3N0aWNzCisgKgorICogICBXaW5kb3cgNC9Qb3J0IDB4MDQuMQorICoKKyAqICAgICAxNToJMT1SWCByZWNlaXZpbmcgKFJPKS4gU2V0IHdoZW4gYSBwYWNrZXQgaXMgYmVpbmcgcmVjZWl2ZWQKKyAqCQlpbnRvIHRoZSBSWCBGSUZPLgorICogICAgIDE0OglSZXNlcnZlZAorICogICAgIDEzOgkxPVJYIHVuZGVycnVuIChSTykuIEdlbmVyYXRlcyBBZGFwdGVyIEZhaWx1cmUgaW50ZXJydXB0LgorICoJCVJlcXVpcmVzIFJYIFJlc2V0IG9yIEdsb2JhbCBSZXNldCBjb21tYW5kIHRvIHJlY292ZXIuCisgKgkJSXQgaXMgZ2VuZXJhdGVkIHdoZW4geW91IHJlYWQgcGFzdCB0aGUgZW5kIG9mIGEgcGFja2V0IC0KKyAqCQlyZWFkaW5nIHBhc3Qgd2hhdCBoYXMgYmVlbiByZWNlaXZlZCBzbyBmYXIgd2lsbCBnaXZlIGJhZAorICoJCWRhdGEuCisgKiAgICAgMTI6CTE9Ulggc3RhdHVzIG92ZXJydW4gKFJPKS4gU2V0IHdoZW4gdGhlcmUgYXJlIGFscmVhZHkgOAorICoJCXBhY2tldHMgaW4gdGhlIFJYIEZJRk8uIFdoaWxlIHRoaXMgYml0IGlzIHNldCwgbm8gYWRkaXRpb25hbAorICoJCXBhY2tldHMgYXJlIHJlY2VpdmVkLiBSZXF1aXJlcyBubyBhY3Rpb24gb24gdGhlIHBhcnQgb2YKKyAqCQl0aGUgaG9zdC4gVGhlIGNvbmRpdGlvbiBpcyBjbGVhcmVkIG9uY2UgYSBwYWNrZXQgaGFzIGJlZW4KKyAqCQlyZWFkIG91dCBvZiB0aGUgUlggRklGTy4KKyAqICAgICAxMToJMT1SWCBvdmVycnVuIChSTykuIFNldCB3aGVuIHRoZSBSWCBGSUZPIGlzIGZ1bGwgKHRoZXJlCisgKgkJbWF5IG5vdCBiZSBhbiBvdmVycnVuIHBhY2tldCB5ZXQpLiBXaGlsZSB0aGlzIGJpdCBpcyBzZXQsCisgKgkJbm8gYWRkaXRpb25hbCBwYWNrZXRzIHdpbGwgYmUgcmVjZWl2ZWQgKHNvbWUgYWRkaXRpb25hbAorICoJCWJ5dGVzIGNhbiBzdGlsbCBiZSBwZW5kaW5nIGJldHdlZW4gdGhlIHdpcmUgYW5kIHRoZSBSWAorICoJCUZJRk8pLiBSZXF1aXJlcyBubyBhY3Rpb24gb24gdGhlIHBhcnQgb2YgdGhlIGhvc3QuIFRoZQorICoJCWNvbmRpdGlvbiBpcyBjbGVhcmVkIG9uY2UgYSBmZXcgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgb3V0CisgKgkJZnJvbSB0aGUgUlggRklGTy4KKyAqICAgICAxMDoJMT1UWCBvdmVycnVuIChSTykuIEdlbmVyYXRlcyBhZGFwdGVyIGZhaWx1cmUgaW50ZXJydXB0LgorICoJCVJlcXVpcmVzIFRYIFJlc2V0IG9yIEdsb2JhbCBSZXNldCBjb21tYW5kIHRvIHJlY292ZXIuCisgKgkJRGlzYWJsZXMgVHJhbnNtaXR0ZXIuCisgKiAgICAgOS04OglVbmFzc2lnbmVkLgorICogICAgIDctMDoJQnVpbHQgaW4gc2VsZiB0ZXN0IGJpdHMgZm9yIHRoZSBSWCBhbmQgVFggRklGTydzLgorICovCisjZGVmaW5lIEZJRk9TX1JYX1JFQ0VJVklORwkodW5zaWduZWQgc2hvcnQpIDB4ODAwMAorI2RlZmluZSBGSUZPU19SWF9VTkRFUlJVTgkodW5zaWduZWQgc2hvcnQpIDB4MjAwMAorI2RlZmluZSBGSUZPU19SWF9TVEFUVVNfT1ZFUlJVTgkodW5zaWduZWQgc2hvcnQpIDB4MTAwMAorI2RlZmluZSBGSUZPU19SWF9PVkVSUlVOCSh1bnNpZ25lZCBzaG9ydCkgMHgwODAwCisjZGVmaW5lIEZJRk9TX1RYX09WRVJSVU4JKHVuc2lnbmVkIHNob3J0KSAweDA0MDAKKworLyoKKyAqIE1pc2MgZGVmaW5lcyBmb3IgdmFyaW91cyB0aGluZ3MuCisgKi8KKyNkZWZpbmUgVEFHX0FEQVBURVIgICAgICAgICAgICAgICAgICAgICAweGQwCisjZGVmaW5lIEFDVElWQVRFX0FEQVBURVJfVE9fQ09ORklHICAgICAgMHhmZgorI2RlZmluZSBFTkFCTEVfRFJRX0lSUSAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNRkdfSUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTA2ZCAgLyogYFRDTScgKi8KKyNkZWZpbmUgUFJPRF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAweDUwOTAKKyNkZWZpbmUgR09fV0lORE9XKHgpCQlvdXR3KFdJTkRPV19TRUxFQ1R8KHgpLEJBU0UrVlhfQ09NTUFORCkKKyNkZWZpbmUgSkFCQkVSX0dVQVJEX0VOQUJMRQkweDQwCisjZGVmaW5lIExJTktCRUFUX0VOQUJMRQkJMHg4MAorI2RlZmluZQlFTkFCTEVfVVRQCQkoSkFCQkVSX0dVQVJEX0VOQUJMRSB8IExJTktCRUFUX0VOQUJMRSkKKyNkZWZpbmUgRElTQUJMRV9VVFAJCTB4MAorI2RlZmluZSBSWF9CWVRFU19NQVNLCQkodW5zaWduZWQgc2hvcnQpICgweDA3ZmYpCisjZGVmaW5lIFJYX0VSUk9SICAgICAgICAweDQwMDAKKyNkZWZpbmUgUlhfSU5DT01QTEVURSAgIDB4ODAwMAorI2RlZmluZSBUWF9JTkRJQ0FURQkJMTw8MTUKKyNkZWZpbmUgaXNfZWVwcm9tX2J1c3koYikJKGludygoYikrVlhfVzBfRUVQUk9NX0NPTU1BTkQpJkVFUFJPTV9CVVNZKQorCisjZGVmaW5lCVZYX0lPU0laRQkweDIwCisKKyNkZWZpbmUgVlhfQ09OTkVDVE9SUyA4CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M1eDkuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNXg5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjOWYyOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjNXg5LmMKQEAgLTAsMCArMSw0MTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIRVJCT09UIC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KKworQXV0aG9yOiBNYXJ0aW4gUmVudGVycy4KKyAgRGF0ZTogTWFyIDIyIDE5OTUKKworIFRoaXMgY29kZSBpcyBiYXNlZCBoZWF2aWx5IG9uIERhdmlkIEdyZWVubWFuJ3MgaWZfZWQuYyBkcml2ZXIgYW5kCisgIEFuZHJlcyBWZWdhIEdhcmNpYSdzIGlmX2VwLmMgZHJpdmVyLgorCisgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTQsIERhdmlkIEdyZWVubWFuLCBNYXJ0aW4gUmVudGVycy4KKyBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NSwgQW5kcmVzIFZlZ2EgR2FyY2lhLgorIENvcHlyaWdodCAoQykgMTk5NSwgU2VyZ2UgQmFia2luLgorICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkLCBtb2RpZmllZCwgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIHNvbGQsIGluCisgIGJvdGggc291cmNlIGFuZCBiaW5hcnkgZm9ybSBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgYW5kIHRoZXNlCisgIHRlcm1zIGFyZSByZXRhaW5lZC4gVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhcmUgdGhlIGF1dGhvcnMgcmVzcG9uc2libGUgZm9yCisgIHRoZSBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgdGhpcyBzb2Z0d2FyZSwgbm9yIGRvIHRoZSBhdXRob3JzIGFzc3VtZSBhbnkKKyAgcmVzcG9uc2liaWxpdHkgZm9yIGRhbWFnZXMgaW5jdXJyZWQgd2l0aCBpdHMgdXNlLgorCiszYzUwOSBzdXBwb3J0IGFkZGVkIGJ5IFNlcmdlIEJhYmtpbiAoYmFia2luQGhxLmljYi5jaGVsLnN1KQorCiskSWQkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggQlNEMiApOworCisvKiAjZGVmaW5lIEVERUJVRyAqLworCisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgPGdweGUvaXNhLmg+CisjaW5jbHVkZSAiM2M1MDkuaCIKKworc3RhdGljIGVudW0geyBub25lLCBibmMsIHV0cCB9IGNvbm5lY3RvciA9IG5vbmU7CS8qIGZvciAzQzUwOSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdDV4OV9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljICkgeworCS8qIHN0b3AgY2FyZCAqLworCW91dHcoUlhfRElTQUJMRSwgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKwlvdXR3KFJYX0RJU0NBUkRfVE9QX1BBQ0ssIG5pYy0+aW9hZGRyICsgRVBfQ09NTUFORCk7CisJd2hpbGUgKGludyhuaWMtPmlvYWRkciArIEVQX1NUQVRVUykgJiBTX0NPTU1BTkRfSU5fUFJPR1JFU1MpCisJCTsKKwlvdXR3KFRYX0RJU0FCTEUsIG5pYy0+aW9hZGRyICsgRVBfQ09NTUFORCk7CisJb3V0dyhTVE9QX1RSQU5TQ0VJVkVSLCBuaWMtPmlvYWRkciArIEVQX0NPTU1BTkQpOworCXVkZWxheSgxMDAwKTsKKwlvdXR3KFJYX1JFU0VULCBuaWMtPmlvYWRkciArIEVQX0NPTU1BTkQpOworCW91dHcoVFhfUkVTRVQsIG5pYy0+aW9hZGRyICsgRVBfQ09NTUFORCk7CisJb3V0dyhDX0lOVFJfTEFUQ0gsIG5pYy0+aW9hZGRyICsgRVBfQ09NTUFORCk7CisJb3V0dyhTRVRfUkRfMF9NQVNLLCBuaWMtPmlvYWRkciArIEVQX0NPTU1BTkQpOworCW91dHcoU0VUX0lOVFJfTUFTSywgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKwlvdXR3KFNFVF9SWF9GSUxURVIsIG5pYy0+aW9hZGRyICsgRVBfQ09NTUFORCk7CisKKwkvKgorCSAqIHdhaXQgZm9yIHJlc2V0IHRvIGNvbXBsZXRlCisJICovCisJd2hpbGUgKGludyhuaWMtPmlvYWRkciArIEVQX1NUQVRVUykgJiBTX0NPTU1BTkRfSU5fUFJPR1JFU1MpCisJCTsKKworCUdPX1dJTkRPVyhuaWMtPmlvYWRkciwwKTsKKworCS8qIERpc2FibGUgdGhlIGNhcmQgKi8KKwlvdXR3KDAsIG5pYy0+aW9hZGRyICsgRVBfVzBfQ09ORklHX0NUUkwpOworCisJLyogQ29uZmlndXJlIElSUSB0byBub25lICovCisJb3V0dyhTRVRfSVJRKDApLCBuaWMtPmlvYWRkciArIEVQX1cwX1JFU09VUkNFX0NGRyk7Cit9CisKK3N0YXRpYyB2b2lkIHQ1MDlfZW5hYmxlICggc3RydWN0IG5pYyAqbmljICkgeworCWludCBpOworCisJLyogRW5hYmxlIHRoZSBjYXJkICovCisJR09fV0lORE9XKG5pYy0+aW9hZGRyLDApOworCW91dHcoRU5BQkxFX0RSUV9JUlEsIG5pYy0+aW9hZGRyICsgRVBfVzBfQ09ORklHX0NUUkwpOworCisJR09fV0lORE9XKG5pYy0+aW9hZGRyLDIpOworCisJLyogUmVsb2FkIHRoZSBldGhlcl9hZGRyLiAqLworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlvdXRiKG5pYy0+bm9kZV9hZGRyW2ldLCBuaWMtPmlvYWRkciArIEVQX1cyX0FERFJfMCArIGkpOworCisJb3V0dyhSWF9SRVNFVCwgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKwlvdXR3KFRYX1JFU0VULCBuaWMtPmlvYWRkciArIEVQX0NPTU1BTkQpOworCisJLyogV2luZG93IDEgaXMgb3BlcmF0aW5nIHdpbmRvdyAqLworCUdPX1dJTkRPVyhuaWMtPmlvYWRkciwxKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzE7IGkrKykKKwkJaW5iKG5pYy0+aW9hZGRyICsgRVBfVzFfVFhfU1RBVFVTKTsKKworCS8qIGdldCByaWQgb2Ygc3RyYXkgaW50cidzICovCisJb3V0dyhBQ0tfSU5UUiB8IDB4ZmYsIG5pYy0+aW9hZGRyICsgRVBfQ09NTUFORCk7CisKKwlvdXR3KFNFVF9SRF8wX01BU0sgfCBTXzVfSU5UUywgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKworCW91dHcoU0VUX0lOVFJfTUFTSywgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKworCW91dHcoU0VUX1JYX0ZJTFRFUiB8IEZJTF9HUk9VUCB8IEZJTF9JTkRJVklEVUFMIHwgRklMX0JSRENTVCwKKwkgICAgIG5pYy0+aW9hZGRyICsgRVBfQ09NTUFORCk7CisKKwkvKiBjb25maWd1cmUgQk5DICovCisJaWYgKGNvbm5lY3RvciA9PSBibmMpIHsKKwkJb3V0dyhTVEFSVF9UUkFOU0NFSVZFUiwgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKwkJdWRlbGF5KDEwMDApOworCX0KKwkvKiBjb25maWd1cmUgVVRQICovCisJZWxzZSBpZiAoY29ubmVjdG9yID09IHV0cCkgeworCQlHT19XSU5ET1cobmljLT5pb2FkZHIsNCk7CisJCW91dHcoRU5BQkxFX1VUUCwgbmljLT5pb2FkZHIgKyBFUF9XNF9NRURJQV9UWVBFKTsKKwkJc2xlZXAoMik7CS8qIEdpdmUgdGltZSBmb3IgbWVkaWEgdG8gbmVnb3RpYXRlICovCisJCUdPX1dJTkRPVyhuaWMtPmlvYWRkciwxKTsKKwl9CisKKwkvKiBzdGFydCB0cmFuc2NlaXZlciBhbmQgcmVjZWl2ZXIgKi8KKwlvdXR3KFJYX0VOQUJMRSwgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKwlvdXR3KFRYX0VOQUJMRSwgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKworCS8qIHNldCBlYXJseSB0aHJlc2hvbGQgZm9yIG1pbmltYWwgcGFja2V0IGxlbmd0aCAqLworCW91dHcoU0VUX1JYX0VBUkxZX1RIUkVTSCB8IEVUSF9aTEVOLCBuaWMtPmlvYWRkciArIEVQX0NPTU1BTkQpOworCW91dHcoU0VUX1RYX1NUQVJUX1RIUkVTSCB8IDE2LCBuaWMtPmlvYWRkciArIEVQX0NPTU1BTkQpOworfQorCitzdGF0aWMgdm9pZCB0NTA5X3Jlc2V0ICggc3RydWN0IG5pYyAqbmljICkgeworCXQ1eDlfZGlzYWJsZSAoIG5pYyApOworCXQ1MDlfZW5hYmxlICggbmljICk7Cit9ICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9UUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBjaGFyIHBhZG1hcFtdID0geworCTAsIDMsIDIsIDF9OworCitzdGF0aWMgdm9pZCB0NTA5X3RyYW5zbWl0KAorc3RydWN0IG5pYyAqbmljLAorY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwordW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwordW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLworY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuOworCWludCBwYWQ7CisJaW50IHN0YXR1czsKKworI2lmZGVmCUVERUJVRworCXByaW50Zigie2w9JWQsdD0laFh9IixzK0VUSF9ITEVOLHQpOworI2VuZGlmCisKKwkvKiBzd2FwIGJ5dGVzIG9mIHR5cGUgKi8KKwl0PSBodG9ucyh0KTsKKworCWxlbj1zK0VUSF9ITEVOOyAvKiBhY3R1YWwgbGVuZ3RoIG9mIHBhY2tldCAqLworCXBhZCA9IHBhZG1hcFtsZW4gJiAzXTsKKworCS8qCisJKiBUaGUgM2M1MDkgYXV0b21hdGljYWxseSBwYWRzIHNob3J0IHBhY2tldHMgdG8gbWluaW11bSBldGhlcm5ldCBsZW5ndGgsCisJKiBidXQgd2UgZHJvcCBwYWNrZXRzIHRoYXQgYXJlIHRvbyBsYXJnZS4gUGVyaGFwcyB3ZSBzaG91bGQgdHJ1bmNhdGUKKwkqIHRoZW0gaW5zdGVhZD8KKwkqLworCWlmIChsZW4gKyBwYWQgPiBFVEhfRlJBTUVfTEVOKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBkcm9wIGFja25vd2xlZGdlbWVudHMgKi8KKwl3aGlsZSAoKHN0YXR1cz1pbmIobmljLT5pb2FkZHIgKyBFUF9XMV9UWF9TVEFUVVMpKSAmIFRYU19DT01QTEVURSApIHsKKwkJaWYgKHN0YXR1cyAmIChUWFNfVU5ERVJSVU58VFhTX01BWF9DT0xMSVNJT058VFhTX1NUQVRVU19PVkVSRkxPVykpIHsKKwkJCW91dHcoVFhfUkVTRVQsIG5pYy0+aW9hZGRyICsgRVBfQ09NTUFORCk7CisJCQlvdXR3KFRYX0VOQUJMRSwgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKwkJfQorCQlvdXRiKDB4MCwgbmljLT5pb2FkZHIgKyBFUF9XMV9UWF9TVEFUVVMpOworCX0KKworCXdoaWxlIChpbncobmljLT5pb2FkZHIgKyBFUF9XMV9GUkVFX1RYKSA8ICh1bnNpZ25lZCBzaG9ydClsZW4gKyBwYWQgKyA0KQorCQk7IC8qIG5vIHJvb20gaW4gRklGTyAqLworCisJb3V0dyhsZW4sIG5pYy0+aW9hZGRyICsgRVBfVzFfVFhfUElPX1dSXzEpOworCW91dHcoMHgwLCBuaWMtPmlvYWRkciArIEVQX1cxX1RYX1BJT19XUl8xKTsJLyogU2Vjb25kIGR3b3JkIG1lYW5pbmdsZXNzICovCisKKwkvKiB3cml0ZSBwYWNrZXQgKi8KKwlvdXRzdyhuaWMtPmlvYWRkciArIEVQX1cxX1RYX1BJT19XUl8xLCBkLCBFVEhfQUxFTi8yKTsKKwlvdXRzdyhuaWMtPmlvYWRkciArIEVQX1cxX1RYX1BJT19XUl8xLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4vMik7CisJb3V0dyh0LCBuaWMtPmlvYWRkciArIEVQX1cxX1RYX1BJT19XUl8xKTsKKwlvdXRzdyhuaWMtPmlvYWRkciArIEVQX1cxX1RYX1BJT19XUl8xLCBwLCBzIC8gMik7CisJaWYgKHMgJiAxKQorCQlvdXRiKCoocCtzIC0gMSksIG5pYy0+aW9hZGRyICsgRVBfVzFfVFhfUElPX1dSXzEpOworCisJd2hpbGUgKHBhZC0tKQorCQlvdXRiKDAsIG5pYy0+aW9hZGRyICsgRVBfVzFfVFhfUElPX1dSXzEpOwkvKiBQYWRkaW5nICovCisKKwkvKiB3YWl0IGZvciBUeCBjb21wbGV0ZSAqLworCXdoaWxlKChpbncobmljLT5pb2FkZHIgKyBFUF9TVEFUVVMpICYgU19DT01NQU5EX0lOX1BST0dSRVNTKSAhPSAwKQorCQk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHQ1MDlfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKwkvKiBjb21tb24gdmFyaWFibGVzICovCisJLyogdmFyaWFibGVzIGZvciAzQzUwOSAqLworCXNob3J0IHN0YXR1cywgY3N0OworCXJlZ2lzdGVyIHNob3J0IHJ4X2ZpZm87CisKKwljc3Q9aW53KG5pYy0+aW9hZGRyICsgRVBfU1RBVFVTKTsKKworI2lmZGVmCUVERUJVRworCWlmKGNzdCAmIDB4MUZGRikKKwkJcHJpbnRmKCItJWhYLSIsY3N0KTsKKyNlbmRpZgorCisJaWYoIChjc3QgJiBTX1JYX0NPTVBMRVRFKT09MCApIHsKKwkJLyogYWNrbm93bGVkZ2UgIGV2ZXJ5dGhpbmcgKi8KKwkJb3V0dyhBQ0tfSU5UUnwgKGNzdCAmIFNfNV9JTlRTKSwgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKwkJb3V0dyhDX0lOVFJfTEFUQ0gsIG5pYy0+aW9hZGRyICsgRVBfQ09NTUFORCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJc3RhdHVzID0gaW53KG5pYy0+aW9hZGRyICsgRVBfVzFfUlhfU1RBVFVTKTsKKyNpZmRlZglFREVCVUcKKwlwcmludGYoIiolaFgqIixzdGF0dXMpOworI2VuZGlmCisKKwlpZiAoc3RhdHVzICYgRVJSX1JYKSB7CisJCW91dHcoUlhfRElTQ0FSRF9UT1BfUEFDSywgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcnhfZmlmbyA9IHN0YXR1cyAmIFJYX0JZVEVTX01BU0s7CisJaWYgKHJ4X2ZpZm89PTApCisJCXJldHVybiAwOworCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKwkJLyogcmVhZCBwYWNrZXQgKi8KKyNpZmRlZglFREVCVUcKKwlwcmludGYoIltsPSVkIixyeF9maWZvKTsKKyNlbmRpZgorCWluc3cobmljLT5pb2FkZHIgKyBFUF9XMV9SWF9QSU9fUkRfMSwgbmljLT5wYWNrZXQsIHJ4X2ZpZm8gLyAyKTsKKwlpZihyeF9maWZvICYgMSkKKwkJbmljLT5wYWNrZXRbcnhfZmlmby0xXT1pbmIobmljLT5pb2FkZHIgKyBFUF9XMV9SWF9QSU9fUkRfMSk7CisJbmljLT5wYWNrZXRsZW49cnhfZmlmbzsKKworCXdoaWxlKDEpIHsKKwkJc3RhdHVzID0gaW53KG5pYy0+aW9hZGRyICsgRVBfVzFfUlhfU1RBVFVTKTsKKyNpZmRlZglFREVCVUcKKwkJcHJpbnRmKCIqJWhYKiIsc3RhdHVzKTsKKyNlbmRpZgorCQlyeF9maWZvID0gc3RhdHVzICYgUlhfQllURVNfTUFTSzsKKwkJaWYocnhfZmlmbz4wKSB7CisJCQlpbnN3KG5pYy0+aW9hZGRyICsgRVBfVzFfUlhfUElPX1JEXzEsIG5pYy0+cGFja2V0K25pYy0+cGFja2V0bGVuLCByeF9maWZvIC8gMik7CisJCQlpZihyeF9maWZvICYgMSkKKwkJCQluaWMtPnBhY2tldFtuaWMtPnBhY2tldGxlbityeF9maWZvLTFdPWluYihuaWMtPmlvYWRkciArIEVQX1cxX1JYX1BJT19SRF8xKTsKKwkJCW5pYy0+cGFja2V0bGVuKz1yeF9maWZvOworI2lmZGVmCUVERUJVRworCQkJcHJpbnRmKCIrJWQiLHJ4X2ZpZm8pOworI2VuZGlmCisJCX0KKwkJaWYoKCBzdGF0dXMgJiBSWF9JTkNPTVBMRVRFICk9PTApIHsKKyNpZmRlZglFREVCVUcKKwkJCXByaW50ZigiPSVkIixuaWMtPnBhY2tldGxlbik7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDAwKTsJLyogaWYgaW5jb21wbGV0ZSB3YWl0IDEgbXMgKi8KKwl9CisJLyogYWNrbm93bGVkZ2UgcmVjZXB0aW9uIG9mIHBhY2tldCAqLworCW91dHcoUlhfRElTQ0FSRF9UT1BfUEFDSywgbmljLT5pb2FkZHIgKyBFUF9DT01NQU5EKTsKKwl3aGlsZSAoaW53KG5pYy0+aW9hZGRyICsgRVBfU1RBVFVTKSAmIFNfQ09NTUFORF9JTl9QUk9HUkVTUykKKwkJOworI2lmZGVmCUVERUJVRworeworCXVuc2lnbmVkIHNob3J0IHR5cGUgPSAwOwkvKiB1c2VkIGJ5IEVERUJVRyAqLworCXR5cGUgPSAobmljLT5wYWNrZXRbMTJdPDw4KSB8IG5pYy0+cGFja2V0WzEzXTsKKwlpZihuaWMtPnBhY2tldFswXStuaWMtPnBhY2tldFsxXStuaWMtPnBhY2tldFsyXStuaWMtPnBhY2tldFszXStuaWMtPnBhY2tldFs0XSsKKwkgICAgbmljLT5wYWNrZXRbNV0gPT0gMHhGRipFVEhfQUxFTikKKwkJcHJpbnRmKCIsdD0laFgsYl0iLHR5cGUpOworCWVsc2UKKwkJcHJpbnRmKCIsdD0laFhdIix0eXBlKTsKK30KKyNlbmRpZgorCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX0lSUSAtIGludGVycnVwdCBoYW5kbGluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdDUwOV9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkzQ29tIDUwOSAtIHNwZWNpZmljIHJvdXRpbmVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBlZXByb21fcmR5ICggdWludDE2X3QgaW9hZGRyICkgeworCWludCBpOworCisJZm9yIChpID0gMDsgaXNfZWVwcm9tX2J1c3koaW9hZGRyKSAmJiBpIDwgTUFYX0VFUFJPTUJVU1k7IGkrKyk7CisJaWYgKGkgPj0gTUFYX0VFUFJPTUJVU1kpIHsKKwkJLyogcHJpbnRmKCIzYzUwOTogZWVwcm9tIGZhaWxlZCB0byBjb21lIHJlYWR5LlxuIik7ICovCisJCS8qIG1lbW9yeSBpbiBFUFJPTSBpcyB0aWdodCAqLworCQkvKiBwcmludGYoIjNjNTA5OiBlZXByb20gYnVzeS5cbiIpOyAqLworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogZ2V0X2U6IGdldHMgYSAxNiBiaXRzIHdvcmQgZnJvbSB0aGUgRUVQUk9NLgorICovCitzdGF0aWMgaW50IGdldF9lICggdWludDE2X3QgaW9hZGRyLCBpbnQgb2Zmc2V0ICkgeworCUdPX1dJTkRPVyhpb2FkZHIsMCk7CisJaWYgKCFlZXByb21fcmR5KGlvYWRkcikpCisJCXJldHVybiAoMHhmZmZmKTsKKwlvdXR3KEVFUFJPTV9DTURfUkQgfCBvZmZzZXQsIGlvYWRkciArIEVQX1cwX0VFUFJPTV9DT01NQU5EKTsKKwlpZiAoIWVlcHJvbV9yZHkoaW9hZGRyKSkKKwkJcmV0dXJuICgweGZmZmYpOworCXJldHVybiAoaW53KGlvYWRkciArIEVQX1cwX0VFUFJPTV9EQVRBKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgdDUwOV9vcGVyYXRpb25zID0geworCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKKwkucG9sbAkJPSB0NTA5X3BvbGwsCisJLnRyYW5zbWl0CT0gdDUwOV90cmFuc21pdCwKKwkuaXJxCQk9IHQ1MDlfaXJxLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdDV4OV9wcm9iZSAoIHN0cnVjdCBuaWMgKm5pYywKKwkJIHVpbnQxNl90IHByb2RfaWRfY2hlY2ssIHVpbnQxNl90IHByb2RfaWRfbWFzayApIHsKKwl1aW50MTZfdCBwcm9kX2lkOworCWludCBpLGo7CisJdW5zaWduZWQgc2hvcnQgKnA7CisJCisJLyogQ2hlY2sgcHJvZHVjdCBJRCAqLworCXByb2RfaWQgPSBnZXRfZSAoIG5pYy0+aW9hZGRyLCBFRVBST01fUFJPRF9JRCApOworCWlmICggKCBwcm9kX2lkICYgcHJvZF9pZF9tYXNrICkgIT0gcHJvZF9pZF9jaGVjayApIHsKKwkJcHJpbnRmICggIkVFUFJPTSBQcm9kdWN0IElEIGlzIGluY29ycmVjdCAoJWh4ICYgJWh4ICE9ICVoeClcbiIsCisJCQkgcHJvZF9pZCwgcHJvZF9pZF9tYXNrLCBwcm9kX2lkX2NoZWNrICk7CisJCXJldHVybiAwOworCX0KKworCS8qIHRlc3QgZm9yIHByZXNlbmNlIG9mIGNvbm5lY3RvcnMgKi8KKwlHT19XSU5ET1cobmljLT5pb2FkZHIsMCk7CisJaSA9IGludyhuaWMtPmlvYWRkciArIEVQX1cwX0NPTkZJR19DVFJMKTsKKwlqID0gKGludyhuaWMtPmlvYWRkciArIEVQX1cwX0FERFJFU1NfQ0ZHKSA+PiAxNCkgJiAweDM7CisKKwlzd2l0Y2goaikgeworCWNhc2UgMDoKKwkJaWYgKGkgJiBJU19VVFApIHsKKwkJCXByaW50ZigiMTBiYXNlVFxuIik7CisJCQljb25uZWN0b3IgPSB1dHA7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIjEwYmFzZVQgbm90IHByZXNlbnRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAoaSAmIElTX0FVSSkgeworCQkJcHJpbnRmKCIxMGJhc2U1XG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiMTBiYXNlNSBub3QgcHJlc2VudFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIDM6CisJCWlmIChpICYgSVNfQk5DKSB7CisJCQlwcmludGYoIjEwYmFzZTJcbiIpOworCQkJY29ubmVjdG9yID0gYm5jOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIxMGJhc2UyIG5vdCBwcmVzZW50XG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigidW5rbm93biBjb25uZWN0b3JcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIGZyb20gdGhlIGVlcHJvbQorCSovCisJcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBuaWMtPm5vZGVfYWRkcjsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU4gLyAyOyBpKyspIHsKKwkJcFtpXSA9IGh0b25zKGdldF9lKG5pYy0+aW9hZGRyLGkpKTsKKwkJR09fV0lORE9XKG5pYy0+aW9hZGRyLDIpOworCQlvdXR3KG50b2hzKHBbaV0pLCBuaWMtPmlvYWRkciArIEVQX1cyX0FERFJfMCArIChpICogMikpOworCX0KKworCURCRyAoICJFdGhlcm5ldCBBZGRyZXNzOiAlc1xuIiwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApICk7CisKKwl0NTA5X3Jlc2V0KG5pYyk7CisKKwluaWMtPm5pY19vcCA9ICZ0NTA5X29wZXJhdGlvbnM7CisJcmV0dXJuIDE7CisKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC8zYzkweC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M5MHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzE4NzliCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M5MHguYwpAQCAtMCwwICsxLDk5NCBAQAorLyoKKyAqIDNjOTB4LmMgLS0gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBnUFhFIEFQSSAzYzkweCBkcml2ZXIKKyAqCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIGV0aGVyYm9vdCBieToKKyAqICAgR3JlZyBCZWVsZXksIEdyZWcuQmVlbGV5QExpZ2h0U3lzLm9yZworICogTW9kaWZpZWQgYnkgU3RldmUgU21pdGgsCisgKiAgIFN0ZXZlLlNtaXRoQEp1bm8uQ29tLiBBbGlnbm1lbnQgYnVnIGZpeCBOZWlsIE5ld2VsbCAobm5AaWNlbm9pci5uZXQpLgorICogQWxtb3N0IHRvdGFsbHkgUmV3cml0dGVuIHRvIHVzZSBnUFhFIEFQSSwgaW1wbGVtZW50YXRpb24gb2YgdHgvcnggcmluZyBzdXBwb3J0CisgKiAgIGJ5IFRob21hcyBNaWxldGljaCwgdGhvbWFzLm1pbGV0aWNoQGdtYWlsLmNvbQorICogICBUaGFua3MgdG8gTWFydHkgQ29ubm9yIGFuZCBTdGVmYW4gSGFqbm9jemkgZm9yIHRoZWlyIGhlbHAgYW5kIGZlZWRiYWNrLAorICogICBhbmQgdG8gRGFuaWVsIFZlcmthbXAgZm9yIGhpcyBoZWxwIHdpdGggdGVzdGluZy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgVGhvbWFzIE1pbGV0aWNoCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IExpZ2h0U3lzIFRlY2hub2xvZ3kgU2VydmljZXMsIEluYy4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5OSBTdGV2ZSBTbWl0aAorICoKKyAqIFRoaXMgcHJvZ3JhbSBtYXkgYmUgcmUtZGlzdHJpYnV0ZWQgaW4gc291cmNlIG9yIGJpbmFyeSBmb3JtLCBtb2RpZmllZCwKKyAqIHNvbGQsIG9yIGNvcGllZCBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBtZXNzYWdlCisgKiBhbmQgdGhpcyB0ZXh0IGFyZSBpbmNsdWRlZCB3aXRoIGFsbCBzb3VyY2UgY29waWVzIG9yIGRlcml2YXRpdmUgd29ya3MsIGFuZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG1lc3NhZ2UgYW5kIHRoaXMgdGV4dCBhcmUgaW5jbHVkZWQgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIG9mIGFueSBiaW5hcnktb25seSBkaXN0cmlidXRpb25zLiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkCisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgd2l0aG91dCBldmVuIHRoZSB3YXJyYW50eSBvZiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ugb3IgTUVSQ0hBTlRBQklMSVRZLiAgUGxlYXNlIHJlYWQgdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogIjNjOTB4LnR4dCIgYmVmb3JlIGNvbXBpbGluZyBhbmQgdXNpbmcgdGhpcyBkcml2ZXIuCisgKgorICogWyAtLW1kYyAyMDA5MDMxMyBUaGUgM2M5MHgudHh0IGZpbGUgaXMgbm93IGF0OgorICogICBodHRwOi8vZXRoZXJib290Lm9yZy93aWtpL2FwcG5vdGVzLzNjOTB4X2lzc3VlcyBdCisgKgorICogVGhpcyBwcm9ncmFtIHdhcyB3cml0dGVuIHdpdGggdGhlIGFzc2lzdGFuY2Ugb2YgdGhlIDNjb20gZG9jdW1lbnRhdGlvbiBmb3IKKyAqIHRoZSAzYzkwNUItVFggY2FyZCwgYXMgd2VsbCBhcyB3aXRoIHNvbWUgYXNzaXN0YW5jZSBmcm9tIHRoZSAzYzU5eAorICogZHJpdmVyIERvbmFsZCBCZWNrZXIgd3JvdGUgZm9yIHRoZSBMaW51eCBrZXJuZWwsIGFuZCB3aXRoIHNvbWUgYXNzaXN0YW5jZQorICogZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBFdGhlcmJvb3QgZGlzdHJpYnV0aW9uLgorICoKKyAqIEluZGVudGVkIHdpdGggdW5peCAnaW5kZW50JyBjb21tYW5kOiAKKyAqICAgJCBpbmRlbnQgLWtyIC1pOCAzYzkweC5jCisgKi8KKworRklMRV9MSUNFTkNFICggQlNEMiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL2lvLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvbWFsbG9jLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvdGltZXIuaD4KKyNpbmNsdWRlIDxncHhlL252cy5oPgorCisjaW5jbHVkZSAiM2M5MHguaCIKKworLyoqCisgKiBhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kOiBzZW5kcyBhIGNvbW1hbmQgdG8gdGhlIDNjOTB4IGNhcmQKKyAqIGFuZCB3YWl0cyBmb3IgaXQncyBjb21wbGV0aW9uCisgKgorICogQHYgaW9hZGRyCUlPQWRkcmVzcyBvZiB0aGUgTklDCisgKiBAdiBjbWQJQ29tbWFuZCB0byBiZSBpc3N1ZWQKKyAqIEB2IHBhcmFtCUNvbW1hbmQgcGFyYW1ldGVyCisgKi8KK3N0YXRpYyB2b2lkIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoaW50IGlvYWRkciwgaW50IGNtZCwgaW50IHBhcmFtKQoreworCXVuc2lnbmVkIGludCB2YWwgPSAoY21kIDw8IDExKSB8IHBhcmFtOworCWludCBjbnQgPSAwOworCisJREJHUCgiYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZFxuIik7CisKKwkvKiBTZW5kIHRoZSBjbWQgdG8gdGhlIGNtZCByZWdpc3RlciAqLworCW91dHcodmFsLCBpb2FkZHIgKyByZWdDb21tYW5kSW50U3RhdHVzX3cpOworCisJLyogV2FpdCBmb3IgdGhlIGNtZCB0byBjb21wbGV0ZSAqLworCWZvciAoY250ID0gMDsgY250IDwgMTAwMDAwOyBjbnQrKykgeworCQlpZiAoaW53KGlvYWRkciArIHJlZ0NvbW1hbmRJbnRTdGF0dXNfdykgJiBJTlRfQ01ESU5QUk9HUkVTUykgeworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlEQkcyKCJDb21tYW5kIDB4JTA0WCBmaW5pc2hlZCBpbiB0aW1lLiBjbnQgPSAlZC5cbiIsIGNtZCwgY250KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCURCRygiQ29tbWFuZCAweCUwNFggRElEIE5PVCBmaW5pc2ggaW4gdGltZS4gY250ID0gJWQuXG4iLCBjbWQsIGNudCk7Cit9CisKKy8qKgorICogYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdzogc2VsZWN0cyBhIHJlZ2lzdGVyIHdpbmRvdyBzZXQuCisgKgorICogQHYgaW5mXzNjOTB4CXByaXZhdGUgTklDIGRhdGEKKyAqIEB2IHdpbmRvdwl3aW5kb3cgdG8gYmUgc2VsZWN0ZWQKKyAqLworc3RhdGljIHZvaWQgYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhzdHJ1Y3QgSU5GXzNDOTBYICppbmZfM2M5MHgsIGludCB3aW5kb3cpCit7CisJREJHUCgiYTNjOTB4X2ludGVybmFsX1NldFdpbmRvd1xuIik7CisJLyogV2luZG93IGFscmVhZHkgYXMgc2V0PyAqLworCWlmIChpbmZfM2M5MHgtPkN1cnJlbnRXaW5kb3cgPT0gd2luZG93KQorCQlyZXR1cm47CisKKwkvKiBJc3N1ZSB0aGUgd2luZG93IGNvbW1hbmQuICovCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChpbmZfM2M5MHgtPklPQWRkciwKKwkJCQkgICAgIGNtZFNlbGVjdFJlZ2lzdGVyV2luZG93LCB3aW5kb3cpOworCWluZl8zYzkweC0+Q3VycmVudFdpbmRvdyA9IHdpbmRvdzsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYTNjOTB4X2ludGVybmFsX1dhaXRGb3JFZXByb20oc3RydWN0IElORl8zQzkwWCAqaW5mXzNjOTB4KQoreworCWludCBjbnQgPSAwOworCisJREJHUCgiYTNjOTB4X2ludGVybmFsX1dhaXRGb3JFZXByb21cbiIpOworCisJd2hpbGUgKGVlcHJvbUJ1c3kgJiBpbncoaW5mXzNjOTB4LT5JT0FkZHIgKyByZWdFZXByb21Db21tYW5kXzBfdykpIHsKKwkJaWYgKGNudCA9PSBFRVBST01fVElNRU9VVCkgeworCQkJREJHKCJSZWFkIGZyb20gZWVwcm9tIGZhaWxlZDogdGltZW91dFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJdWRlbGF5KDEpOworCQljbnQrKzsKKwl9Cit9CisKKy8qKgorICogYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20gLSBudnMgcm91dGluZSB0byByZWFkIGVlcHJvbSBkYXRhCisgKiBXZSBvbmx5IHN1cHBvcnQgcmVhZGluZyBvbmUgd29yZCgyIGJ5dGUpLiBUaGUgbnZzIHN1YnN5c3RlbSB3aWxsIG1ha2Ugc3VyZQorICogdGhhdCB0aGUgcm91dGluZSB3aWxsIG5ldmVyIGJlIGNhbGxlZCB3aXRoIGxlbiAhPSAyLgorICoKKyAqIEB2IG52cwludnMgZGF0YS4KKyAqIEB2IGFkZHJlc3MJZWVwcm9tIGFkZHJlc3MgdG8gcmVhZCBkYXRhIGZyb20uCisgKiBAdiBkYXRhCWRhdGEgaXMgcHV0IGhlcmUuCisgKiBAdiBsZW4JbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKi8KK3N0YXRpYyBpbnQKK2EzYzkweF9pbnRlcm5hbF9SZWFkRWVwcm9tKHN0cnVjdCBudnNfZGV2aWNlICpudnMsIHVuc2lnbmVkIGludCBhZGRyZXNzLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCXVuc2lnbmVkIHNob3J0ICpkZXN0ID0gKHVuc2lnbmVkIHNob3J0ICopIGRhdGE7CisJc3RydWN0IElORl8zQzkwWCAqaW5mXzNjOTB4ID0KKwkgICAgY29udGFpbmVyX29mKG52cywgc3RydWN0IElORl8zQzkwWCwgbnZzKTsKKworCURCR1AoImEzYzkweF9pbnRlcm5hbF9SZWFkRWVwcm9tXG4iKTsKKworCS8qIHdlIHN1cHBvcnQgcmVhZGluZyAyIGJ5dGVzIG9ubHkgKi8KKwlhc3NlcnQobGVuID09IDIpOworCisJLyogU2VsZWN0IGNvcnJlY3Qgd2luZG93ICovCisJYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhpbmZfM2M5MHgsIHdpbkVlcHJvbUJpb3MwKTsKKworCS8qIHNldCBlZXByb21SZWFkIGJpdHMgaW4gY29tbWFuZCBzZW50IHRvIE5JQyAqLworCWFkZHJlc3MgKz0gKGluZl8zYzkweC0+aXMzYzU1NiA/IGVlcHJvbVJlYWRfNTU2IDogZWVwcm9tUmVhZCk7CisKKwlhM2M5MHhfaW50ZXJuYWxfV2FpdEZvckVlcHJvbShpbmZfM2M5MHgpOworCS8qIHNlbmQgYWRkcmVzcyB0byBOSUMgKi8KKwlvdXR3KGFkZHJlc3MsIGluZl8zYzkweC0+SU9BZGRyICsgcmVnRWVwcm9tQ29tbWFuZF8wX3cpOworCWEzYzkweF9pbnRlcm5hbF9XYWl0Rm9yRWVwcm9tKGluZl8zYzkweCk7CisKKwkvKiByZWFkIHZhbHVlICovCisJKmRlc3QgPSBpbncoaW5mXzNjOTB4LT5JT0FkZHIgKyByZWdFZXByb21EYXRhXzBfdyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhM2M5MHhfaW50ZXJuYWxfV3JpdGVFZXByb20gLSBudnMgcm91dGluZSB0byB3cml0ZSBlZXByb20gZGF0YQorICogY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZAorICoKKyAqIEB2IG52cwludnMgZGF0YS4KKyAqIEB2IGFkZHJlc3MJZWVwcm9tIGFkZHJlc3MgdG8gcmVhZCBkYXRhIGZyb20uCisgKiBAdiBkYXRhCWRhdGEgaXMgcHV0IGhlcmUuCisgKiBAdiBsZW4JbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKi8KK3N0YXRpYyBpbnQKK2EzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbShzdHJ1Y3QgbnZzX2RldmljZSAqbnZzIF9fdW51c2VkLAorCQkJICAgIHVuc2lnbmVkIGludCBhZGRyZXNzIF9fdW51c2VkLAorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEgX191bnVzZWQsIHNpemVfdCBsZW4gX191bnVzZWQpCit7CisJcmV0dXJuIC1FTk9UU1VQOworfQorCitzdGF0aWMgdm9pZCBhM2M5MHhfaW50ZXJuYWxfUmVhZEVlcHJvbUNvbnRlbnRzKHN0cnVjdCBJTkZfM0M5MFggKmluZl8zYzkweCkKK3sKKwlpbnQgZWVwcm9tX3NpemUgPSAoaW5mXzNjOTB4LT5pc0JyZXYgPyAweDIwIDogMHgxNykgKiAyOworCisJREJHUCgiYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb21Db250ZW50c1xuIik7CisKKwludnNfcmVhZCgmaW5mXzNjOTB4LT5udnMsIDAsIGluZl8zYzkweC0+ZWVwcm9tLCBlZXByb21fc2l6ZSk7Cit9CisKKy8qKgorICogYTNjOTB4X3Jlc2V0OiBleHBvcnRlZCBmdW5jdGlvbiB0aGF0IHJlc2V0cyB0aGUgY2FyZCB0byBpdHMgZGVmYXVsdAorICogc3RhdGUuICBUaGlzIGlzIHNvIHRoZSBMaW51eCBkcml2ZXIgY2FuIHJlLXNldCB0aGUgY2FyZCB1cCB0aGUgd2F5CisgKiBpdCB3YW50cyB0by4gIElmIENGR18zQzkwWF9QUkVTRVJWRV9YQ1ZSIGlzIGRlZmluZWQsIHRoZW4gdGhlIHJlc2V0IHdpbGwKKyAqIG5vdCBhbHRlciB0aGUgc2VsZWN0ZWQgdHJhbnNjZWl2ZXIgdGhhdCB3ZSB1c2VkIHRvIGRvd25sb2FkIHRoZSBib290CisgKiBpbWFnZS4KKyAqCisgKiBAdiBpbmZfM2M5MHgJUHJpdmF0ZSBOSUMgZGF0YQorICovCitzdGF0aWMgdm9pZCBhM2M5MHhfcmVzZXQoc3RydWN0IElORl8zQzkwWCAqaW5mXzNjOTB4KQoreworCURCR1AoImEzYzkweF9yZXNldFxuIik7CisJLyogU2VuZCB0aGUgcmVzZXQgY29tbWFuZCB0byB0aGUgY2FyZCAqLworCURCRygiM2M5MHg6IElzc3VpbmcgUkVTRVRcbiIpOworCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoaW5mXzNjOTB4LT5JT0FkZHIsIGNtZEdsb2JhbFJlc2V0LCAwKTsKKworCS8qIGdsb2JhbCByZXNldCBjb21tYW5kIHJlc2V0cyBzdGF0aW9uIG1hc2ssIG5vbi1CIHJldmlzaW9uIGNhcmRzCisJICogcmVxdWlyZSBleHBsaWNpdCByZXNldCBvZiB2YWx1ZXMKKwkgKi8KKwlhM2M5MHhfaW50ZXJuYWxfU2V0V2luZG93KGluZl8zYzkweCwgd2luQWRkcmVzc2luZzIpOworCW91dHcoMCwgaW5mXzNjOTB4LT5JT0FkZHIgKyByZWdTdGF0aW9uTWFza18yXzN3ICsgMCk7CisJb3V0dygwLCBpbmZfM2M5MHgtPklPQWRkciArIHJlZ1N0YXRpb25NYXNrXzJfM3cgKyAyKTsKKwlvdXR3KDAsIGluZl8zYzkweC0+SU9BZGRyICsgcmVnU3RhdGlvbk1hc2tfMl8zdyArIDQpOworCisJLyogSXNzdWUgdHJhbnNtaXQgcmVzZXQsIHdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGlvbiAqLworCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoaW5mXzNjOTB4LT5JT0FkZHIsIGNtZFR4UmVzZXQsIDApOworCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChpbmZfM2M5MHgtPklPQWRkciwgY21kVHhFbmFibGUsIDApOworCisJLyoKKwkgKiByZXNldCBvZiB0aGUgcmVjZWl2ZXIgb24gQi1yZXZpc2lvbiBjYXJkcyByZS1uZWdvdGlhdGVzIHRoZSBsaW5rCisJICogdGFrZXMgc2V2ZXJhbCBzZWNvbmRzIChhIGNvbXB1dGVyIGV0ZXJuaXR5KQorCSAqLworCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoaW5mXzNjOTB4LT5JT0FkZHIsIGNtZFJ4UmVzZXQsCisJCQkJICAgICBpbmZfM2M5MHgtPmlzQnJldiA/IDB4MDQgOiAweDAwKTsKKworCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoaW5mXzNjOTB4LT5JT0FkZHIsIGNtZFJ4RW5hYmxlLCAwKTsKKworCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoaW5mXzNjOTB4LT5JT0FkZHIsCisJCQkJICAgICBjbWRTZXRJbnRlcnJ1cHRFbmFibGUsIDApOworCS8qIGVuYWJsZSByeENvbXBsZXRlIGFuZCB0eENvbXBsZXRlICovCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChpbmZfM2M5MHgtPklPQWRkciwKKwkJCQkgICAgIGNtZFNldEluZGljYXRpb25FbmFibGUsCisJCQkJICAgICBJTlRfVFhDT01QTEVURSB8IElOVF9VUENPTVBMRVRFKTsKKwkvKiBhY2tub3dsZWRnZSBhbnkgcGVuZGluZyBzdGF0dXMgZmxhZ3MgKi8KKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKGluZl8zYzkweC0+SU9BZGRyLAorCQkJCSAgICAgY21kQWNrbm93bGVkZ2VJbnRlcnJ1cHQsIDB4NjYxKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBhM2M5MHhfc2V0dXBfdHhfcmluZyAtIEFsbG9jYXRlcyBUWCByaW5nLCBpbml0aWFsaXplIHR4X2Rlc2MgdmFsdWVzCisgKgorICogQHYgcAlQcml2YXRlIE5JQyBkYXRhCisgKgorICogQHJldCBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGEzYzkweF9zZXR1cF90eF9yaW5nKHN0cnVjdCBJTkZfM0M5MFggKnApCit7CisJREJHUCgiYTNjOTB4X3NldHVwX3R4X3JpbmdcbiIpOworCXAtPnR4X3JpbmcgPQorCSAgICBtYWxsb2NfZG1hKFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgVFhEKSwgVFhfUklOR19BTElHTik7CisKKwlpZiAoIXAtPnR4X3JpbmcpIHsKKwkJREJHKCJDb3VsZCBub3QgYWxsb2NhdGUgVFgtcmluZ1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChwLT50eF9yaW5nLCAwLCBUWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IFRYRCkpOworCXAtPnR4X2N1ciA9IDA7CisJcC0+dHhfY250ID0gMDsKKwlwLT50eF90YWlsID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGEzYzkweF9wcm9jZXNzX3R4X3BhY2tldHMgLSBDaGVja3MgZm9yIHN1Y2Nlc3NmdWxseSBzZW50IHBhY2tldHMsCisgKiByZXBvcnRzIHRoZW0gdG8gZ1BYRSB3aXRoIG5ldGRldl90eF9jb21wbGV0ZSgpOworICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZSBpbmZvCisgKi8KK3N0YXRpYyB2b2lkIGEzYzkweF9wcm9jZXNzX3R4X3BhY2tldHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgSU5GXzNDOTBYICpwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBpbnQgZG93bmxpc3RfcHRyOworCisJREJHUCgiYTNjOTB4X3Byb2Nlc3NfdHhfcGFja2V0c1xuIik7CisKKwlEQkcoIiAgICB0eF9jbnQ6ICVkXG4iLCBwLT50eF9jbnQpOworCisJd2hpbGUgKHAtPnR4X3RhaWwgIT0gcC0+dHhfY3VyKSB7CisKKwkJZG93bmxpc3RfcHRyID0gaW5sKHAtPklPQWRkciArIHJlZ0RuTGlzdFB0cl9sKTsKKworCQlEQkcoIiAgICBkb3dubGlzdF9wdHI6ICUjMDh4XG4iLCBkb3dubGlzdF9wdHIpOworCQlEQkcoIiAgICB0eF90YWlsOiAlZCB0eF9jdXI6ICVkXG4iLCBwLT50eF90YWlsLCBwLT50eF9jdXIpOworCisJCS8qIE5JQyBpcyBjdXJyZW50bHkgd29ya2luZyBvbiB0aGlzIHR4IGRlc2MgKi8KKwkJaWYoZG93bmxpc3RfcHRyID09IHZpcnRfdG9fYnVzKHAtPnR4X3JpbmcgKyBwLT50eF90YWlsKSkKKwkJCXJldHVybjsKKworCQluZXRkZXZfdHhfY29tcGxldGUobmV0ZGV2LCBwLT50eF9pb2J1ZltwLT50eF90YWlsXSk7CisKKwkJREJHKCJ0cmFuc21pdHRlZCBwYWNrZXRcbiIpOworCQlEQkcoIiAgICBzaXplOiAlemRcbiIsIGlvYl9sZW4ocC0+dHhfaW9idWZbcC0+dHhfdGFpbF0pKTsKKworCQlwLT50eF90YWlsID0gKHAtPnR4X3RhaWwgKyAxKSAlIFRYX1JJTkdfU0laRTsKKwkJcC0+dHhfY250LS07CisJfQorfQorCitzdGF0aWMgdm9pZCBhM2M5MHhfZnJlZV90eF9yaW5nKHN0cnVjdCBJTkZfM0M5MFggKnApCit7CisJREJHUCgiYTNjOTB4X2ZyZWVfdHhfcmluZ1xuIik7CisKKwlmcmVlX2RtYShwLT50eF9yaW5nLCBUWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IFRYRCkpOworCXAtPnR4X3JpbmcgPSBOVUxMOworCS8qIGlvX2J1ZmZlcnMgYXJlIGZyZWUoKWVkIGJ5IG5ldGRldl90eF9jb21wbGV0ZVssX2Vycl0oKSAqLworfQorCisvKioKKyAqIGEzYzkweF90cmFuc21pdCAtIFRyYW5zbWl0cyBhIHBhY2tldC4KKyAqCisgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UgaW5mbworICogQHYgaW9iCQlpb19idWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBzZW5kCisgKgorICogQHJldAlSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGEzYzkweF90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgc3RydWN0IGlvX2J1ZmZlciAqaW9iKQoreworCXN0cnVjdCBJTkZfM0M5MFggKmluZl8zYzkweCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IFRYRCAqdHhfY3VyX2Rlc2M7CisJc3RydWN0IFRYRCAqdHhfcHJldl9kZXNjOworCisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgZG93bmxpc3RfcHRyOworCisJREJHUCgiYTNjOTB4X3RyYW5zbWl0XG4iKTsKKworCWlmIChpbmZfM2M5MHgtPnR4X2NudCA9PSBUWF9SSU5HX1NJWkUpIHsKKwkJREJHKCJUWC1SaW5nIG92ZXJmbG93XG4iKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCWluZl8zYzkweC0+dHhfaW9idWZbaW5mXzNjOTB4LT50eF9jdXJdID0gaW9iOworCXR4X2N1cl9kZXNjID0gaW5mXzNjOTB4LT50eF9yaW5nICsgaW5mXzNjOTB4LT50eF9jdXI7CisKKwl0eF9wcmV2X2Rlc2MgPSBpbmZfM2M5MHgtPnR4X3JpbmcgKworCSAgICAoKChpbmZfM2M5MHgtPnR4X2N1ciArIFRYX1JJTkdfU0laRSkgLSAxKSAlIFRYX1JJTkdfU0laRSk7CisKKwlsZW4gPSBpb2JfbGVuKGlvYik7CisKKwkvKiBTZXR1cCB0aGUgRFBEIChkb3dubG9hZCBkZXNjcmlwdG9yKSAqLworCXR4X2N1cl9kZXNjLT5Ebk5leHRQdHIgPSAwOworCisJLyogRnJhbWVTdGFydEhlYWRlciBkaWZmZXJzIGluIDkweCBhbmQgPj0gOTB4QgorCSAqIEl0IGNvbnRhaW5zIGxlbmd0aCBpbiA5MHggYW5kIGEgcm91bmQgdXAgYm91bmRhcnkgYW5kIHBhY2tldCBJRCBmb3IKKwkgKiA5MHhCIGFuZCA5MHhDLiBXZSBjYW4gbGVhdmUgdGhpcyB0byAwIGZvciA5MHhCIGFuZCA5MHhDLgorCSAqLworCXR4X2N1cl9kZXNjLT5GcmFtZVN0YXJ0SGVhZGVyID0KKwkgICAgZnNoVHhJbmRpY2F0ZSB8IChpbmZfM2M5MHgtPmlzQnJldiA/IDB4MDAgOiBsZW4pOworCisJdHhfY3VyX2Rlc2MtPkRhdGFBZGRyID0gdmlydF90b19idXMoaW9iLT5kYXRhKTsKKwl0eF9jdXJfZGVzYy0+RGF0YUxlbmd0aCA9IGxlbiB8IGRvd25MYXN0RnJhZzsKKworCS8qIFdlIGhhdmUgdG8gc3RhbGwgdGhlIGRvd25sb2FkIGVuZ2luZSwgc28gdGhlIE5JQyB3b24ndCBhY2Nlc3MgdGhlCisJICogdHggZGVzY3JpcHRvciB3aGlsZSB3ZSBtb2RpZnkgaXQuIFRoZXJlIGlzIGEgd2F5IGFyb3VuZCB0aGlzCisJICogZnJvbSByZXZpc2lvbiBCIGFuZCB1cHdhcmRzLiBUbyBzdGF5IGNvbXBhdGlibGUgd2l0aCBvbGRlciByZXZpc2lvbnMKKwkgKiB3ZSBkb24ndCB1c2UgaXQgaGVyZS4KKwkgKi8KKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKGluZl8zYzkweC0+SU9BZGRyLCBjbWRTdGFsbEN0bCwKKwkJCQkgICAgIGRuU3RhbGwpOworCisJdHhfcHJldl9kZXNjLT5Ebk5leHRQdHIgPSB2aXJ0X3RvX2J1cyh0eF9jdXJfZGVzYyk7CisKKwlkb3dubGlzdF9wdHIgPSBpbmwoaW5mXzNjOTB4LT5JT0FkZHIgKyByZWdEbkxpc3RQdHJfbCk7CisJaWYgKGRvd25saXN0X3B0ciA9PSAwKSB7CisJCS8qIGN1cnJlbnRseSBubyBEb3duTGlzdCwgc2VuZGluZyBhIG5ldyBvbmUgKi8KKwkJb3V0bCh2aXJ0X3RvX2J1cyh0eF9jdXJfZGVzYyksCisJCSAgICAgaW5mXzNjOTB4LT5JT0FkZHIgKyByZWdEbkxpc3RQdHJfbCk7CisJfQorCisJLyogRW5kIFN0YWxsICovCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChpbmZfM2M5MHgtPklPQWRkciwgY21kU3RhbGxDdGwsCisJCQkJICAgICBkblVuU3RhbGwpOworCisJaW5mXzNjOTB4LT50eF9jdXIgPSAoaW5mXzNjOTB4LT50eF9jdXIgKyAxKSAlIFRYX1JJTkdfU0laRTsKKwlpbmZfM2M5MHgtPnR4X2NudCsrOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYTNjOTB4X3ByZXBhcmVfcnhfZGVzYyAtIGZpbGxzIHRoZSByeCBkZXNjIHdpdGggaW5pdGlhbCBkYXRhCisgKgorICogQHYgcAkJTklDIHByaXZhdGUgZGF0YQorICogQHYgaW5kZXgJSW5kZXggZm9yIHJ4X2lvYnVmIGFuZCByeF9yaW5nIGFycmF5CisgKi8KKworc3RhdGljIHZvaWQgYTNjOTB4X3ByZXBhcmVfcnhfZGVzYyhzdHJ1Y3QgSU5GXzNDOTBYICpwLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJREJHUCgiYTNjOTB4X3ByZXBhcmVfcnhfZGVzY1xuIik7CisJREJHKCJQb3B1bGF0aW5nIHJ4X2Rlc2MgJWRcbiIsIGluZGV4KTsKKworCS8qIFdlIGhhdmUgdG8gc3RhbGwgdGhlIHVwbG9hZCBlbmdpbmUsIHNvIHRoZSBOSUMgd29uJ3QgYWNjZXNzIHRoZQorCSAqIHJ4IGRlc2NyaXB0b3Igd2hpbGUgd2UgbW9kaWZ5IGl0LiBUaGVyZSBpcyBhIHdheSBhcm91bmQgdGhpcworCSAqIGZyb20gcmV2aXNpb24gQiBhbmQgdXB3YXJkcy4gVG8gc3RheSBjb21wYXRpYmxlIHdpdGggb2xkZXIgcmV2aXNpb25zCisJICogd2UgZG9uJ3QgdXNlIGl0IGhlcmUuCisJICovCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChwLT5JT0FkZHIsIGNtZFN0YWxsQ3RsLCB1cFN0YWxsKTsKKworCXAtPnJ4X3JpbmdbaW5kZXhdLkRhdGFBZGRyID0gdmlydF90b19idXMocC0+cnhfaW9idWZbaW5kZXhdLT5kYXRhKTsKKwlwLT5yeF9yaW5nW2luZGV4XS5EYXRhTGVuZ3RoID0gUlhfQlVGX1NJWkUgfCB1cExhc3RGcmFnOworCXAtPnJ4X3JpbmdbaW5kZXhdLlVwUGt0U3RhdHVzID0gMDsKKworCS8qIHVuc3RhbGwgdXBsb2FkIGVuZ2luZSAqLworCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQocC0+SU9BZGRyLCBjbWRTdGFsbEN0bCwgdXBVblN0YWxsKTsKK30KKworLyoqCisgKiBhM2M5MHhfcmVmaWxsX3J4X3JpbmcgLWNoZWNrcyBldmVyeSBlbnRyeSBpbiB0aGUgcnggcmluZyBhbmQgcmVhbGxvY2F0ZXMKKyAqIHRoZW0gYXMgbmVjZXNzYXJ5LiBUaGVuIGl0IGNhbGxzIGEzYzkweF9wcmVwYXJlX3J4X2Rlc2MgdG8gZmlsbCB0aGUgcnggZGVzYworICogd2l0aCBpbml0aWFsIGRhdGEuCisgKgorICogQHYgcAkJTklDIHByaXZhdGUgZGF0YQorICovCitzdGF0aWMgdm9pZCBhM2M5MHhfcmVmaWxsX3J4X3Jpbmcoc3RydWN0IElORl8zQzkwWCAqcCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXN0cnVjdCBSWEQgKnJ4X2N1cl9kZXNjOworCisJREJHUCgiYTNjOTB4X3JlZmlsbF9yeF9yaW5nXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlyeF9jdXJfZGVzYyA9IHAtPnJ4X3JpbmcgKyBpOworCQlzdGF0dXMgPSByeF9jdXJfZGVzYy0+VXBQa3RTdGF0dXM7CisKKwkJLyogb25seSByZWZpbGwgdXNlZCBkZXNjcmlwdG9yICovCisJCWlmICghKHN0YXR1cyAmIHVwQ29tcGxldGUpKQorCQkJY29udGludWU7CisKKwkJLyogd2Ugc3RpbGwgbmVlZCB0byBwcm9jZXNzIHRoaXMgZGVzY3JpcHRvciAqLworCQlpZiAocC0+cnhfaW9idWZbaV0gIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXAtPnJ4X2lvYnVmW2ldID0gYWxsb2NfaW9iKFJYX0JVRl9TSVpFKTsKKwkJaWYgKHAtPnJ4X2lvYnVmW2ldID09IE5VTEwpIHsKKwkJCURCRygiYWxsb2NfaW9iKCkgZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYTNjOTB4X3ByZXBhcmVfcnhfZGVzYyhwLCBpKTsKKwl9Cit9CisKKy8qKgorICogYTNjOTB4X3NldHVwX3J4X3JpbmcgLSBBbGxvY2F0ZXMgUlggcmluZywgaW5pdGlhbGl6ZSByeF9kZXNjIHZhbHVlcworICoKKyAqIEB2IHAJUHJpdmF0ZSBOSUMgZGF0YQorICoKKyAqIEByZXQgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBhM2M5MHhfc2V0dXBfcnhfcmluZyhzdHJ1Y3QgSU5GXzNDOTBYICpwKQoreworCWludCBpOworCisJREJHUCgiYTNjOTB4X3NldHVwX3J4X3JpbmdcbiIpOworCisJcC0+cnhfcmluZyA9CisJICAgIG1hbGxvY19kbWEoUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBSWEQpLCBSWF9SSU5HX0FMSUdOKTsKKworCWlmICghcC0+cnhfcmluZykgeworCQlEQkcoIkNvdWxkIG5vdCBhbGxvY2F0ZSBSWC1yaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcC0+cnhfY3VyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlwLT5yeF9yaW5nW2ldLlVwTmV4dFB0ciA9CisJCSAgICB2aXJ0X3RvX2J1cyhwLT5yeF9yaW5nICsgKGkgKyAxKSk7CisKKwkJLyogdGhlc2UgYXJlIG5lZWRlZCBzbyByZWZpbGxfcnhfcmluZyBpbml0aWFsaXplcyB0aGUgcmluZyAqLworCQlwLT5yeF9yaW5nW2ldLlVwUGt0U3RhdHVzID0gdXBDb21wbGV0ZTsKKwkJcC0+cnhfaW9idWZbaV0gPSBOVUxMOworCX0KKworCS8qIExvb3AgdGhlIHJpbmcgKi8KKwlwLT5yeF9yaW5nW2kgLSAxXS5VcE5leHRQdHIgPSB2aXJ0X3RvX2J1cyhwLT5yeF9yaW5nKTsKKworCWEzYzkweF9yZWZpbGxfcnhfcmluZyhwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhM2M5MHhfZnJlZV9yeF9yaW5nKHN0cnVjdCBJTkZfM0M5MFggKnApCit7CisJREJHUCgiYTNjOTB4X2ZyZWVfcnhfcmluZ1xuIik7CisKKwlmcmVlX2RtYShwLT5yeF9yaW5nLCBSWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IFJYRCkpOworCXAtPnJ4X3JpbmcgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBhM2M5MHhfZnJlZV9yeF9pb2J1ZihzdHJ1Y3QgSU5GXzNDOTBYICpwKQoreworCWludCBpOworCisJREJHUCgiYTNjOTB4X2ZyZWVfcnhfaW9idWZcbiIpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWZyZWVfaW9iKHAtPnJ4X2lvYnVmW2ldKTsKKwkJcC0+cnhfaW9idWZbaV0gPSBOVUxMOworCX0KK30KKworLyoqCisgKiBhM2M5MHhfcHJvY2Vzc19yeF9wYWNrZXRzIC0gQ2hlY2tzIGZvciByZWNlaXZlZCBwYWNrZXRzLAorICogcmVwb3J0cyB0aGVtIHRvIGdQWEUgd2l0aCBuZXRkZXZfcngoKSBvciBuZXRkZXZfcnhfZXJyKCkgaWYgdGhlcmUgd2FzIGFuCisgKiBlcnJvciB3aGlsZSByZWNlaXZpbmcgdGhlIHBhY2tldAorICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZSBpbmZvCisgKi8KK3N0YXRpYyB2b2lkIGEzYzkweF9wcm9jZXNzX3J4X3BhY2tldHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcnhfc3RhdHVzOworCXN0cnVjdCBJTkZfM0M5MFggKnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBSWEQgKnJ4X2N1cl9kZXNjOworCisJREJHUCgiYTNjOTB4X3Byb2Nlc3NfcnhfcGFja2V0c1xuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJcnhfY3VyX2Rlc2MgPSBwLT5yeF9yaW5nICsgcC0+cnhfY3VyOworCQlyeF9zdGF0dXMgPSByeF9jdXJfZGVzYy0+VXBQa3RTdGF0dXM7CisKKwkJaWYgKCEocnhfc3RhdHVzICYgdXBDb21wbGV0ZSkgJiYgIShyeF9zdGF0dXMgJiB1cEVycm9yKSkKKwkJCWJyZWFrOworCisJCWlmIChwLT5yeF9pb2J1ZltwLT5yeF9jdXJdID09IE5VTEwpCisJCQlicmVhazsKKworCQlpZiAocnhfc3RhdHVzICYgdXBFcnJvcikgeworCQkJREJHKCJDb3JydXB0ZWQgcGFja2V0IHJlY2VpdmVkXG4iKTsKKwkJCW5ldGRldl9yeF9lcnIobmV0ZGV2LCBwLT5yeF9pb2J1ZltwLT5yeF9jdXJdLAorCQkJCSAgICAgIC1FSU5WQUwpOworCQl9IGVsc2UgeworCQkJLyogaWYgd2UncmUgaGVyZSwgd2UndmUgZ290IGdvb2QgcGFja2V0ICovCisJCQlpbnQgcGFja2V0X2xlbjsKKworCQkJcGFja2V0X2xlbiA9IHJ4X3N0YXR1cyAmIDB4MUZGRjsKKwkJCWlvYl9wdXQocC0+cnhfaW9idWZbcC0+cnhfY3VyXSwgcGFja2V0X2xlbik7CisKKwkJCURCRygicmVjZWl2ZWQgcGFja2V0XG4iKTsKKwkJCURCRygiICAgIHNpemU6ICVkXG4iLCBwYWNrZXRfbGVuKTsKKworCQkJbmV0ZGV2X3J4KG5ldGRldiwgcC0+cnhfaW9idWZbcC0+cnhfY3VyXSk7CisJCX0KKworCQlwLT5yeF9pb2J1ZltwLT5yeF9jdXJdID0gTlVMTDsJLyogaW52YWxpZGF0ZSByeCBkZXNjICovCisJCXAtPnJ4X2N1ciA9IChwLT5yeF9jdXIgKyAxKSAlIFJYX1JJTkdfU0laRTsKKwl9CisJYTNjOTB4X3JlZmlsbF9yeF9yaW5nKHApOworCit9CisKKy8qKgorICogYTNjOTB4X3BvbGwgLSBSb3V0aW5lIHRoYXQgZ2V0cyBjYWxsZWQgcGVyaW9kaWNhbGx5LgorICogSGVyZSB3ZSBoYW5sZSB0cmFuc21pdHRlZCBhbmQgcmVjZWl2ZWQgcGFja2V0cy4KKyAqIFdlIGNvdWxkIGFsc28gY2hlY2sgdGhlIGxpbmsgc3RhdHVzIGZyb20gdGltZSB0byB0aW1lLCB3aGljaCB3ZQorICogY3VycmVudGx5IGRvbid0IGRvLgorICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZSBpbmZvCisgKi8KK3N0YXRpYyB2b2lkIGEzYzkweF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IElORl8zQzkwWCAqcCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdWludDE2X3QgcmF3X3N0YXR1cywgaW50X3N0YXR1czsKKworCURCR1AoImEzYzkweF9wb2xsXG4iKTsKKworCXJhd19zdGF0dXMgPSBpbncocC0+SU9BZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KTsKKwlpbnRfc3RhdHVzID0gKHJhd19zdGF0dXMgJiAweDBGRkYpOworCisJaWYgKCBpbnRfc3RhdHVzID09IDAgKQorCQlyZXR1cm47CisKKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKHAtPklPQWRkciwgY21kQWNrbm93bGVkZ2VJbnRlcnJ1cHQsCisJCQkJICAgICBpbnRfc3RhdHVzKTsKKworCWlmIChpbnRfc3RhdHVzICYgSU5UX1RYQ09NUExFVEUpCisJCW91dGIoMHgwMCwgcC0+SU9BZGRyICsgcmVnVHhTdGF0dXNfYik7CisKKwlEQkcoInBvbGw6IHN0YXR1cyA9ICUjMDR4XG4iLCByYXdfc3RhdHVzKTsKKworCWEzYzkweF9wcm9jZXNzX3R4X3BhY2tldHMobmV0ZGV2KTsKKworCWEzYzkweF9wcm9jZXNzX3J4X3BhY2tldHMobmV0ZGV2KTsKK30KKworCisKK3N0YXRpYyB2b2lkIGEzYzkweF9mcmVlX3Jlc291cmNlcyhzdHJ1Y3QgSU5GXzNDOTBYICpwKQoreworCURCR1AoImEzYzkweF9mcmVlX3Jlc291cmNlc1xuIik7CisKKwlhM2M5MHhfZnJlZV90eF9yaW5nKHApOworCWEzYzkweF9mcmVlX3J4X3JpbmcocCk7CisJYTNjOTB4X2ZyZWVfcnhfaW9idWYocCk7Cit9CisKKy8qKgorICogYTNjOTB4X3JlbW92ZSAtIFJvdXRpbmUgdG8gcmVtb3ZlIHRoZSBjYXJkLiBVbnJlZ2lzdGVycworICogdGhlIE5JQyBmcm9tIGdQWEUsIGRpc2FibGVzIFJYL1RYIGFuZCByZXNldHMgdGhlIGNhcmQuCisgKgorICogQHYgcGNpCVBDSSBkZXZpY2UgaW5mbworICovCitzdGF0aWMgdm9pZCBhM2M5MHhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOworCXN0cnVjdCBJTkZfM0M5MFggKmluZl8zYzkweCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlEQkdQKCJhM2M5MHhfcmVtb3ZlXG4iKTsKKworCWEzYzkweF9yZXNldChpbmZfM2M5MHgpOworCisJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLiAqLworCW91dHcoY21kUnhEaXNhYmxlLCBpbmZfM2M5MHgtPklPQWRkciArIHJlZ0NvbW1hbmRJbnRTdGF0dXNfdyk7CisJb3V0dyhjbWRUeERpc2FibGUsIGluZl8zYzkweC0+SU9BZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJbmV0ZGV2X251bGxpZnkobmV0ZGV2KTsKKwluZXRkZXZfcHV0KG5ldGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGEzYzkweF9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgSU5GXzNDOTBYICpwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCURCR1AoImEzYzkweF9pcnFcbiIpOworCisJaWYgKGVuYWJsZSA9PSAwKSB7CisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKHAtPklPQWRkciwKKwkJCQkJICAgICBjbWRTZXRJbnRlcnJ1cHRFbmFibGUsIDApOworCX0gZWxzZSB7CisJCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQocC0+SU9BZGRyLAorCQkJCQkgICAgIGNtZFNldEludGVycnVwdEVuYWJsZSwKKwkJCQkJICAgICBJTlRfVFhDT01QTEVURSB8CisJCQkJCSAgICAgSU5UX1VQQ09NUExFVEUpOworCQlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKHAtPklPQWRkciwKKwkJCQkJICAgICBjbWRBY2tub3dsZWRnZUludGVycnVwdCwKKwkJCQkJICAgICAweDY2MSk7CisJfQorfQorCisvKioKKyAqIGEzYzkweF9od19zdGFydCAtIEluaXRpYWxpemUgaGFyZHdhcmUsIGNvcHkgTUFDIGFkZHJlc3MKKyAqIHRvIE5JQyByZWdpc3RlcnMsIHNldCBkZWZhdWx0IHJlY2VpdmVyCisgKi8KK3N0YXRpYyB2b2lkIGEzYzkweF9od19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCWludCBpLCBjOworCXVuc2lnbmVkIGludCBjZmc7CisJdW5zaWduZWQgaW50IG1vcHQ7CisJdW5zaWduZWQgc2hvcnQgbGlua3R5cGU7CisJc3RydWN0IElORl8zQzkwWCAqaW5mXzNjOTB4ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCURCR1AoImEzYzkweF9od19zdGFydFxuIik7CisKKwkvKiAzQzU1NjogSW52ZXJ0IE1JSSBwb3dlciAqLworCWlmIChpbmZfM2M5MHgtPmlzM2M1NTYpIHsKKwkJdW5zaWduZWQgaW50IHRtcDsKKwkJYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhpbmZfM2M5MHgsIHdpbkFkZHJlc3NpbmcyKTsKKwkJdG1wID0gaW53KGluZl8zYzkweC0+SU9BZGRyICsgcmVnUmVzZXRPcHRpb25zXzJfdyk7CisJCXRtcCB8PSAweDQwMDA7CisJCW91dHcodG1wLCBpbmZfM2M5MHgtPklPQWRkciArIHJlZ1Jlc2V0T3B0aW9uc18yX3cpOworCX0KKworCS8qIENvcHkgTUFDIGFkZHJlc3MgaW50byB0aGUgTklDIHJlZ2lzdGVycyAqLworCWEzYzkweF9pbnRlcm5hbF9TZXRXaW5kb3coaW5mXzNjOTB4LCB3aW5BZGRyZXNzaW5nMik7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCW91dGIobmV0ZGV2LT5sbF9hZGRyW2ldLAorCQkgICAgIGluZl8zYzkweC0+SU9BZGRyICsgcmVnU3RhdGlvbkFkZHJlc3NfMl8zdyArIGkpOworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlvdXRiKDAsIGluZl8zYzkweC0+SU9BZGRyICsgcmVnU3RhdGlvbk1hc2tfMl8zdyArIGkpOworCisJLyogUmVhZCB0aGUgbWVkaWEgb3B0aW9ucyByZWdpc3RlciwgcHJpbnQgYSBtZXNzYWdlIGFuZCBzZXQgZGVmYXVsdAorCSogeGN2ci4KKwkqCisJKiBVc2VzIE1lZGlhIE9wdGlvbiBjb21tYW5kIG9uIEIgcmV2aXNpb24sIFJlc2V0IE9wdGlvbiBvbiBub24tQgorCSogcmV2aXNpb24gY2FyZHMgLS0gc2FtZSByZWdpc3RlciBhZGRyZXNzCisJKi8KKwlhM2M5MHhfaW50ZXJuYWxfU2V0V2luZG93KGluZl8zYzkweCwgd2luVHhSeE9wdGlvbnMzKTsKKwltb3B0ID0gaW53KGluZl8zYzkweC0+SU9BZGRyICsgcmVnUmVzZXRNZWRpYU9wdGlvbnNfM193KTsKKworCS8qIG1hc2sgb3V0IFZDTyBiaXQgdGhhdCBpcyBkZWZpbmVkIGFzIDEwYmFzZUZMIGJpdCBvbiBCLXJldiBjYXJkcyAqLworCWlmICghaW5mXzNjOTB4LT5pc0JyZXYpIHsKKwkJbW9wdCAmPSAweDdGOworCX0KKworCURCRygiQ29ubmVjdG9ycyBwcmVzZW50OiAiKTsKKwljID0gMDsKKwlsaW5rdHlwZSA9IDB4MDAwODsKKwlpZiAobW9wdCAmIDB4MDEpIHsKKwkJREJHKCIlczEwMEJhc2UtVDQiLCAoYysrKSA/ICIsICIgOiAiIik7CisJCWxpbmt0eXBlID0gbGlua01JSTsKKwl9CisJaWYgKG1vcHQgJiAweDA0KSB7CisJCURCRygiJXMxMDBCYXNlLUZYIiwgKGMrKykgPyAiLCAiIDogIiIpOworCQlsaW5rdHlwZSA9IGxpbmsxMDBCYXNlRlg7CisJfQorCWlmIChtb3B0ICYgMHgxMCkgeworCQlEQkcoIiVzMTBCYXNlLTIiLCAoYysrKSA/ICIsICIgOiAiIik7CisJCWxpbmt0eXBlID0gbGluazEwQmFzZTI7CisJfQorCWlmIChtb3B0ICYgMHgyMCkgeworCQlEQkcoIiVzQVVJIiwgKGMrKykgPyAiLCAiIDogIiIpOworCQlsaW5rdHlwZSA9IGxpbmtBVUk7CisJfQorCWlmIChtb3B0ICYgMHg0MCkgeworCQlEQkcoIiVzTUlJIiwgKGMrKykgPyAiLCAiIDogIiIpOworCQlsaW5rdHlwZSA9IGxpbmtNSUk7CisJfQorCWlmICgobW9wdCAmIDB4QSkgPT0gMHhBKSB7CisJCURCRygiJXMxMEJhc2UtVCAvIDEwMEJhc2UtVFgiLCAoYysrKSA/ICIsICIgOiAiIik7CisJCWxpbmt0eXBlID0gbGlua0F1dG9uZWc7CisJfSBlbHNlIGlmICgobW9wdCAmIDB4QSkgPT0gMHgyKSB7CisJCURCRygiJXMxMDBCYXNlLVRYIiwgKGMrKykgPyAiLCAiIDogIiIpOworCQlsaW5rdHlwZSA9IGxpbmtBdXRvbmVnOworCX0gZWxzZSBpZiAoKG1vcHQgJiAweEEpID09IDB4OCkgeworCQlEQkcoIiVzMTBCYXNlLVQiLCAoYysrKSA/ICIsICIgOiAiIik7CisJCWxpbmt0eXBlID0gbGlua0F1dG9uZWc7CisJfQorCURCRygiLlxuIik7CisKKwkvKiBEZXRlcm1pbmUgdHJhbnNjZWl2ZXIgdHlwZSB0byB1c2UsIGRlcGVuZGluZyBvbiB2YWx1ZSBzdG9yZWQgaW4KKwkqIGVlcHJvbSAweDE2CisJKi8KKwlpZiAoaW5mXzNjOTB4LT5pc0JyZXYpIHsKKwkJaWYgKChpbmZfM2M5MHgtPmVlcHJvbVsweDE2XSAmIDB4RkYwMCkgPT0gWENWUl9NQUdJQykgeworCQkJLyogVXNlci1kZWZpbmVkICovCisJCQlsaW5rdHlwZSA9IGluZl8zYzkweC0+ZWVwcm9tWzB4MTZdICYgMHgwMDBGOworCQl9CisJfSBlbHNlIHsKKwkJLyogSSBkb24ndCBrbm93IHdoYXQgTUlJIE1BQyBvbmx5IG1vZGUgaXMhISEgKi8KKwkJaWYgKGxpbmt0eXBlID09IGxpbmtFeHRlcm5hbE1JSSkgeworCQkJaWYgKGluZl8zYzkweC0+aXNCcmV2KQorCQkJCURCRygiV0FSTklORzogTUlJIEV4dGVybmFsIE1BQyBNb2RlIG9ubHkgc3VwcG9ydGVkIG9uIEItcmV2aXNpb24gIiAiY2FyZHMhISEhXG5GYWxsaW5nIEJhY2sgdG8gTUlJIE1vZGVcbiIpOworCQkJbGlua3R5cGUgPSBsaW5rTUlJOworCQl9CisJfQorCisJLyogZW5hYmxlIERDIGNvbnZlcnRlciBmb3IgMTAtQmFzZS1UICovCisJaWYgKGxpbmt0eXBlID09IGxpbmsxMEJhc2UyKSB7CisJCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoaW5mXzNjOTB4LT5JT0FkZHIsCisJCQkJCSAgICAgY21kRW5hYmxlRGNDb252ZXJ0ZXIsIDApOworCX0KKworCS8qIFNldCB0aGUgbGluayB0byB0aGUgdHlwZSB3ZSBqdXN0IGRldGVybWluZWQuICovCisJYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhpbmZfM2M5MHgsIHdpblR4UnhPcHRpb25zMyk7CisJY2ZnID0gaW5sKGluZl8zYzkweC0+SU9BZGRyICsgcmVnSW50ZXJuYWxDb25maWdfM19sKTsKKwljZmcgJj0gfigweEYgPDwgMjApOworCWNmZyB8PSAobGlua3R5cGUgPDwgMjApOworCisJREJHKCJTZXR0aW5nIGludGVybmFsIGNmZyByZWdpc3RlcjogMHglMDhYIChsaW5rdHlwZTogMHglMDJYKVxuIiwKKwkgICAgY2ZnLCBsaW5rdHlwZSk7CisKKwlvdXRsKGNmZywgaW5mXzNjOTB4LT5JT0FkZHIgKyByZWdJbnRlcm5hbENvbmZpZ18zX2wpOworCisJLyogTm93IHRoYXQgd2Ugc2V0IHRoZSB4Y3ZyIHR5cGUsIHJlc2V0IHRoZSBUeCBhbmQgUnggKi8KKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKGluZl8zYzkweC0+SU9BZGRyLCBjbWRUeFJlc2V0LCAweDAwKTsKKworCWlmICghaW5mXzNjOTB4LT5pc0JyZXYpCisJCW91dGIoMHgwMSwgaW5mXzNjOTB4LT5JT0FkZHIgKyByZWdUeEZyZWVUaHJlc2hfYik7CisKKwkvKiBTZXQgdGhlIFJYIGZpbHRlciA9IHJlY2VpdmUgb25seSBpbmRpdmlkdWFsIHBrdHMgJiBtdWx0aWNhc3QgJiBiY2FzdC4gKi8KKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKGluZl8zYzkweC0+SU9BZGRyLCBjbWRTZXRSeEZpbHRlciwKKwkJCQkgICAgIDB4MDEgKyAweDAyICsgMHgwNCk7CisKKworCS8qCisJKiBzZXQgSW5kaWNhdGlvbiBhbmQgSW50ZXJydXB0IGZsYWdzICwgYWNrbm93bGVkZ2UgYW55IElSUSdzCisJKi8KKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKGluZl8zYzkweC0+SU9BZGRyLAorCQkJCSAgICAgY21kU2V0SW50ZXJydXB0RW5hYmxlLAorCSBJTlRfVFhDT01QTEVURSB8IElOVF9VUENPTVBMRVRFKTsKKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKGluZl8zYzkweC0+SU9BZGRyLAorCQkJCSAgICAgY21kU2V0SW5kaWNhdGlvbkVuYWJsZSwKKwkgSU5UX1RYQ09NUExFVEUgfCBJTlRfVVBDT01QTEVURSk7CisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChpbmZfM2M5MHgtPklPQWRkciwKKwkJCQkgICAgIGNtZEFja25vd2xlZGdlSW50ZXJydXB0LCAweDY2MSk7Cit9CisKKy8qKgorICogYTNjOTB4X29wZW4gLSBSb3V0aW5lIHRvIGluaXRpYWxpemUgdGhlIGNhcmQuIEluaXRpYWxpemUgaGFyZHdhcmUsCisgKiBhbGxvY2F0ZSBUWCBhbmQgUlggcmluZywgc2VuZCBSWCByaW5nIGFkZHJlc3MgdG8gdGhlIE5JQy4KKyAqCisgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UgaW5mbworICoKKyAqIEByZXQgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBhM2M5MHhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCWludCByYzsKKwlzdHJ1Y3QgSU5GXzNDOTBYICppbmZfM2M5MHggPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJREJHUCgiYTNjOTB4X29wZW5cbiIpOworCisJYTNjOTB4X2h3X3N0YXJ0KG5ldGRldik7CisKKwlyYyA9IGEzYzkweF9zZXR1cF90eF9yaW5nKGluZl8zYzkweCk7CisJaWYgKHJjICE9IDApIHsKKwkJREJHKCJFcnJvciBzZXR0aW5nIHVwIFRYIFJpbmdcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXJjID0gYTNjOTB4X3NldHVwX3J4X3JpbmcoaW5mXzNjOTB4KTsKKwlpZiAocmMgIT0gMCkgeworCQlEQkcoIkVycm9yIHNldHRpbmcgdXAgUlggUmluZ1xuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogc2VuZCByeF9yaW5nIGFkZHJlc3MgdG8gTklDICovCisJb3V0bCh2aXJ0X3RvX2J1cyhpbmZfM2M5MHgtPnJ4X3JpbmcpLAorCSAgICAgaW5mXzNjOTB4LT5JT0FkZHIgKyByZWdVcExpc3RQdHJfbCk7CisKKwkvKiBlbmFibGUgcGFja2V0IHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uICovCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChpbmZfM2M5MHgtPklPQWRkciwgY21kVHhFbmFibGUsIDApOworCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoaW5mXzNjOTB4LT5JT0FkZHIsIGNtZFJ4RW5hYmxlLCAwKTsKKworCXJldHVybiAwOworCisgICAgICBlcnJvcjoKKwlhM2M5MHhfZnJlZV9yZXNvdXJjZXMoaW5mXzNjOTB4KTsKKwlhM2M5MHhfcmVzZXQoaW5mXzNjOTB4KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogYTNjOTB4X2Nsb3NlIC0gZnJlZSgpcyBUWCBhbmQgUlggcmluZywgZGlzYWJsZXggUlgvVFgsIHJlc2V0cyBOSUMKKyAqCisgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UgaW5mbworICovCitzdGF0aWMgdm9pZCBhM2M5MHhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgSU5GXzNDOTBYICppbmZfM2M5MHggPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJREJHUCgiYTNjOTB4X2Nsb3NlXG4iKTsKKworCWEzYzkweF9yZXNldChpbmZfM2M5MHgpOworCW91dHcoY21kUnhEaXNhYmxlLCBpbmZfM2M5MHgtPklPQWRkciArIHJlZ0NvbW1hbmRJbnRTdGF0dXNfdyk7CisJb3V0dyhjbWRUeERpc2FibGUsIGluZl8zYzkweC0+SU9BZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KTsKKwlhM2M5MHhfZnJlZV9yZXNvdXJjZXMoaW5mXzNjOTB4KTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgYTNjOTB4X29wZXJhdGlvbnMgPSB7CisJLm9wZW4gPSBhM2M5MHhfb3BlbiwKKwkuY2xvc2UgPSBhM2M5MHhfY2xvc2UsCisJLnBvbGwgPSBhM2M5MHhfcG9sbCwKKwkudHJhbnNtaXQgPSBhM2M5MHhfdHJhbnNtaXQsCisJLmlycSA9IGEzYzkweF9pcnEsCit9OworCisvKioKKyAqIGEzYzkweF9wcm9iZTogZXhwb3J0ZWQgcm91dGluZSB0byBwcm9iZSBmb3IgdGhlIDNjOTA1IGNhcmQuCisgKiBJZiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgcGNpIGZ1bmN0aW9ucyBkaWQgZmluZCB0aGUKKyAqIGNhcmQuICBXZSByZWFkIHRoZSBlZXByb20gaGVyZSBhbmQgZ2V0IHRoZSBNQUMgYWRkcmVzcy4KKyAqIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gYTNjOTB4X29wZW4oKS4KKyAqCisgKiBAdiBwY2kJUENJIGRldmljZSBpbmZvCisgKiBAIHBjaV9pZAlQQ0kgZGV2aWNlIElEcworICoKKyAqIEByZXQgcmMJUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBhM2M5MHhfcHJvYmUoc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQgX191bnVzZWQpCit7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBJTkZfM0M5MFggKmluZl8zYzkweDsKKwl1bnNpZ25lZCBjaGFyICpIV0FkZHI7CisJaW50IHJjOworCisJREJHUCgiYTNjOTB4X3Byb2JlXG4iKTsKKworCWlmIChwY2ktPmlvYWRkciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqaW5mXzNjOTB4KSk7CisJaWYgKCFuZXRkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJbmV0ZGV2X2luaXQobmV0ZGV2LCAmYTNjOTB4X29wZXJhdGlvbnMpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIG5ldGRldik7CisJbmV0ZGV2LT5kZXYgPSAmcGNpLT5kZXY7CisKKwlpbmZfM2M5MHggPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCW1lbXNldChpbmZfM2M5MHgsIDAsIHNpemVvZigqaW5mXzNjOTB4KSk7CisKKwlhZGp1c3RfcGNpX2RldmljZShwY2kpOworCisJaW5mXzNjOTB4LT5pczNjNTU2ID0gKHBjaS0+ZGV2aWNlID09IDB4NjA1NSk7CisJaW5mXzNjOTB4LT5JT0FkZHIgPSBwY2ktPmlvYWRkcjsKKwlpbmZfM2M5MHgtPkN1cnJlbnRXaW5kb3cgPSB3aW5Ob25lOworCisJaW5mXzNjOTB4LT5pc0JyZXYgPSAxOworCXN3aXRjaCAocGNpLT5kZXZpY2UpIHsKKwljYXNlIDB4OTAwMDoJCS8qIDEwIEJhc2UgVFBPICAgICAgICAgICAgICovCisJY2FzZSAweDkwMDE6CQkvKiAxMC8xMDAgVDQgICAgICAgICAgICAgICAqLworCWNhc2UgMHg5MDUwOgkJLyogMTAvMTAwIFRQTyAgICAgICAgICAgICAgKi8KKwljYXNlIDB4OTA1MToJCS8qIDEwIEJhc2UgQ29tYm8gICAgICAgICAgICovCisJCWluZl8zYzkweC0+aXNCcmV2ID0gMDsKKwkJYnJlYWs7CisJfQorCisJREJHKCJbM2M5MHhdOiBmb3VuZCBOSUMoMHglMDRYLCAweCUwNFgpLCBpc0JyZXY9JWQsIGlzM2M1NTY9JWRcbiIsCisJICAgIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSwgaW5mXzNjOTB4LT5pc0JyZXYsCisJICAgIGluZl8zYzkweC0+aXMzYzU1Nik7CisKKwkvKiBpbml0aWFsaXplIG52cyBkZXZpY2UgKi8KKwlpbmZfM2M5MHgtPm52cy53b3JkX2xlbl9sb2cyID0gMTsJLyogd29yZCAqLworCWluZl8zYzkweC0+bnZzLnNpemUgPSAoaW5mXzNjOTB4LT5pc0JyZXYgPyAweDIwIDogMHgxNyk7CisJaW5mXzNjOTB4LT5udnMuYmxvY2tfc2l6ZSA9IDE7CisJaW5mXzNjOTB4LT5udnMucmVhZCA9IGEzYzkweF9pbnRlcm5hbF9SZWFkRWVwcm9tOworCWluZl8zYzkweC0+bnZzLndyaXRlID0gYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tOworCisJLyogcmVzZXQgTklDIGJlZm9yZSBhY2Nlc3NpbmcgYW55IGRhdGEgZnJvbSBpdCAqLworCWEzYzkweF9yZXNldChpbmZfM2M5MHgpOworCisJLyogbG9hZCBlZXByb20gY29udGVudHMgdG8gaW5mXzNjOTB4LT5lZXByb20gKi8KKwlhM2M5MHhfaW50ZXJuYWxfUmVhZEVlcHJvbUNvbnRlbnRzKGluZl8zYzkweCk7CisKKwlIV0FkZHIgPSBuZXRkZXYtPmh3X2FkZHI7CisKKwkvKiBSZXRyaWV2ZSB0aGUgSGFyZHdhcmUgYWRkcmVzcyAqLworCUhXQWRkclswXSA9IGluZl8zYzkweC0+ZWVwcm9tW2VlcHJvbUh3QWRkck9mZnNldCArIDBdID4+IDg7CisJSFdBZGRyWzFdID0gaW5mXzNjOTB4LT5lZXByb21bZWVwcm9tSHdBZGRyT2Zmc2V0ICsgMF0gJiAweEZGOworCUhXQWRkclsyXSA9IGluZl8zYzkweC0+ZWVwcm9tW2VlcHJvbUh3QWRkck9mZnNldCArIDFdID4+IDg7CisJSFdBZGRyWzNdID0gaW5mXzNjOTB4LT5lZXByb21bZWVwcm9tSHdBZGRyT2Zmc2V0ICsgMV0gJiAweEZGOworCUhXQWRkcls0XSA9IGluZl8zYzkweC0+ZWVwcm9tW2VlcHJvbUh3QWRkck9mZnNldCArIDJdID4+IDg7CisJSFdBZGRyWzVdID0gaW5mXzNjOTB4LT5lZXByb21bZWVwcm9tSHdBZGRyT2Zmc2V0ICsgMl0gJiAweEZGOworCisJLyogd2UgZG9uJ3QgaGFuZGxlIGxpbmtzdGF0ZXMgeWV0LCBzbyB3ZSdyZSBhbHdheXMgdXAgKi8KKwluZXRkZXZfbGlua191cChuZXRkZXYpOworCisJaWYgKChyYyA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpKSAhPSAwKSB7CisJCURCRygiM2M5MHg6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJCW5ldGRldl9wdXQobmV0ZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYTNjOTB4X25pY3NbXSA9IHsKKy8qIE9yaWdpbmFsIDkweCByZXZpc2lvbnM6ICovCisJUENJX1JPTSgweDEwYjcsIDB4NjA1NSwgIjNjNTU2IiwgIjNDNTU2IiwgMCksCS8qIEh1cmljYW5lICovCisJUENJX1JPTSgweDEwYjcsIDB4OTAwMCwgIjNjOTA1LXRwbyIsICIzQ29tOTAwLVRQTyIsIDApLAkvKiAxMCBCYXNlIFRQTyAqLworCVBDSV9ST00oMHgxMGI3LCAweDkwMDEsICIzYzkwNS10NCIsICIzQ29tOTAwLUNvbWJvIiwgMCksCS8qIDEwLzEwMCBUNCAqLworCVBDSV9ST00oMHgxMGI3LCAweDkwNTAsICIzYzkwNS10cG8xMDAiLCAiM0NvbTkwNS1UWCIsIDApLAkvKiAxMDAgQmFzZSBUWCAvIDEwLzEwMCBUUE8gKi8KKwlQQ0lfUk9NKDB4MTBiNywgMHg5MDUxLCAiM2M5MDUtY29tYm8iLCAiM0NvbTkwNS1UNCIsIDApLAkvKiAxMDAgQmFzZSBUNCAvIDEwIEJhc2UgQ29tYm8gKi8KKy8qIE5ld2VyIDkweEIgcmV2aXNpb25zOiAqLworCVBDSV9ST00oMHgxMGI3LCAweDkwMDQsICIzYzkwNWItdHBvIiwgIjNDb205MDBCLVRQTyIsIDApLAkvKiAxMCBCYXNlIFRQTyAqLworCVBDSV9ST00oMHgxMGI3LCAweDkwMDUsICIzYzkwNWItY29tYm8iLCAiM0NvbTkwMEItQ29tYm8iLCAwKSwJLyogMTAgQmFzZSBDb21ibyAqLworCVBDSV9ST00oMHgxMGI3LCAweDkwMDYsICIzYzkwNWItdHBiMiIsICIzQ29tOTAwQi0yL1QiLCAwKSwJLyogMTAgQmFzZSBUUCBhbmQgQmFzZTIgKi8KKwlQQ0lfUk9NKDB4MTBiNywgMHg5MDBhLCAiM2M5MDViLWZsIiwgIjNDb205MDBCLUZMIiwgMCksCS8qIDEwIEJhc2UgRkwgKi8KKwlQQ0lfUk9NKDB4MTBiNywgMHg5MDU1LCAiM2M5MDViLXRwbzEwMCIsICIzQ29tOTA1Qi1UWCIsIDApLAkvKiAxMC8xMDAgVFBPICovCisJUENJX1JPTSgweDEwYjcsIDB4OTA1NiwgIjNjOTA1Yi10NCIsICIzQ29tOTA1Qi1UNCIsIDApLAkvKiAxMC8xMDAgVDQgKi8KKwlQQ0lfUk9NKDB4MTBiNywgMHg5MDU4LCAiM2M5MDViLTkwNTgiLCAiM0NvbTkwNUItOTA1OCIsIDApLAkvKiBDeWNsb25lIDEwLzEwMC9CTkMgKi8KKwlQQ0lfUk9NKDB4MTBiNywgMHg5MDVhLCAiM2M5MDViLWZ4IiwgIjNDb205MDVCLUZMIiwgMCksCS8qIDEwMCBCYXNlIEZYIC8gMTAgQmFzZSBGWCAqLworLyogTmV3ZXIgOTB4QyByZXZpc2lvbjogKi8KKwlQQ0lfUk9NKDB4MTBiNywgMHg5MjAwLCAiM2M5MDVjLXRwbyIsICIzQ29tOTA1Qy1UWE0iLCAwKSwJLyogMTAvMTAwIFRQTyAoM0M5MDVDLVRYTSkgKi8KKwlQQ0lfUk9NKDB4MTBiNywgMHg5MjAyLCAiM2M5MjBiLWVtYi1hdGkiLCAiM2M5MjBCLUVNQi1XTk0gKEFUSSBSYWRlb24gOTEwMCBJR1ApIiwgMCksCS8qIDNjOTIwQi1FTUItV05NIChBVEkgUmFkZW9uIDkxMDAgSUdQKSAqLworCVBDSV9ST00oMHgxMGI3LCAweDkyMTAsICIzYzkyMGItZW1iLXdubSIsICIzQ29tMjBCLUVNQiBXTk0iLCAwKSwKKwlQQ0lfUk9NKDB4MTBiNywgMHg5ODAwLCAiM2M5ODAiLCAiM0NvbTk4MC1DeWNsb25lIiwgMCksCS8qIEN5Y2xvbmUgKi8KKwlQQ0lfUk9NKDB4MTBiNywgMHg5ODA1LCAiM2M5ODA1IiwgIjNDb205ODA1IiwgMCksCS8qIER1YWwgUG9ydCBTZXJ2ZXIgQ3ljbG9uZSAqLworCVBDSV9ST00oMHgxMGI3LCAweDc2NDYsICIzY3NvaG8xMDAtdHgiLCAiM0NTT0hPMTAwLVRYIiwgMCksCS8qIEh1cnJpY2FuZSAqLworCVBDSV9ST00oMHgxMGI3LCAweDQ1MDAsICIzYzQ1MCIsICIzQ29tNDUwIEhvbWVQTkEgVG9ybmFkbyIsIDApLAorCVBDSV9ST00oMHgxMGI3LCAweDEyMDEsICIzYzk4MmEiLCAiM0NvbTk4MkEiLCAwKSwKKwlQQ0lfUk9NKDB4MTBiNywgMHgxMjAyLCAiM2M5ODJiIiwgIjNDb205ODJCIiwgMCksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBhM2M5MHhfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzID0gYTNjOTB4X25pY3MsCisJLmlkX2NvdW50ID0gKHNpemVvZihhM2M5MHhfbmljcykgLyBzaXplb2YoYTNjOTB4X25pY3NbMF0pKSwKKwkucHJvYmUgPSBhM2M5MHhfcHJvYmUsCisJLnJlbW92ZSA9IGEzYzkweF9yZW1vdmUsCit9OworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvM2M5MHguaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjOTB4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYjI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0LzNjOTB4LmgKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiAzYzkweC5jIC0tIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSAzYzkweCBkcml2ZXIgZm9yIGV0aGVyYm9vdC4gIFdyaXR0ZW4KKyAqIGJ5IEdyZWcgQmVlbGV5LCBHcmVnLkJlZWxleUBMaWdodFN5cy5vcmcuICBNb2RpZmllZCBieSBTdGV2ZSBTbWl0aCwKKyAqIFN0ZXZlLlNtaXRoQEp1bm8uQ29tLiBBbGlnbm1lbnQgYnVnIGZpeCBOZWlsIE5ld2VsbCAobm5AaWNlbm9pci5uZXQpLgorICoKKyAqIFBvcnQgZnJvbSBldGhlcmJvb3QgdG8gZ1BYRSBBUEksIGltcGxlbWVudGF0aW9uIG9mIHR4L3J4IHJpbmcgc3VwcG9ydAorICogYnkgVGhvbWFzIE1pbGV0aWNoLCB0aG9tYXMubWlsZXRpY2hAZ21haWwuY29tCisgKiBUaGFua3MgdG8gTWFydHkgQ29ubm9yIGFuZCBTdGVmYW4gSGFqbm9jemkgZm9yIHRoZWlyIGhlbHAgYW5kIGZlZWRiYWNrLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBDb3B5cmlnaHQgKEMpIDE5OTkgTGlnaHRTeXMgVGVjaG5vbG9neSBTZXJ2aWNlcywgSW5jLgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAxOTk5IFN0ZXZlIFNtaXRoCisgKgorICogVGhpcyBwcm9ncmFtIG1heSBiZSByZS1kaXN0cmlidXRlZCBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0sIG1vZGlmaWVkLAorICogc29sZCwgb3IgY29waWVkIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG1lc3NhZ2UKKyAqIGFuZCB0aGlzIHRleHQgYXJlIGluY2x1ZGVkIHdpdGggYWxsIHNvdXJjZSBjb3BpZXMgb3IgZGVyaXZhdGl2ZSB3b3JrcywgYW5kCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbWVzc2FnZSBhbmQgdGhpcyB0ZXh0IGFyZSBpbmNsdWRlZCBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gb2YgYW55IGJpbmFyeS1vbmx5IGRpc3RyaWJ1dGlvbnMuICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB3aXRob3V0IGV2ZW4gdGhlIHdhcnJhbnR5IG9mIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBvciBNRVJDSEFOVEFCSUxJVFkuICBQbGVhc2UgcmVhZCB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAiM2M5MHgudHh0IiBiZWZvcmUgY29tcGlsaW5nIGFuZCB1c2luZyB0aGlzIGRyaXZlci4KKyAqCisgKiAtLS0tLS0tLQorICoKKyAqIFByb2dyYW0gd3JpdHRlbiB3aXRoIHRoZSBhc3Npc3RhbmNlIG9mIHRoZSAzY29tIGRvY3VtZW50YXRpb24gZm9yCisgKiB0aGUgM2M5MDVCLVRYIGNhcmQsIGFzIHdlbGwgYXMgd2l0aCBzb21lIGFzc2lzdGFuY2UgZnJvbSB0aGUgM2M1OXgKKyAqIGRyaXZlciBEb25hbGQgQmVja2VyIHdyb3RlIGZvciB0aGUgTGludXgga2VybmVsLCBhbmQgd2l0aCBzb21lIGFzc2lzdGFuY2UKKyAqIGZyb20gdGhlIHJlbWFpbmRlciBvZiB0aGUgRXRoZXJib290IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBSRVZJU0lPTiBISVNUT1JZOgorICoKKyAqIHYwLjEwCTEtMjYtMTk5OAlHUkIJSW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KKyAqIHYwLjkwCTEtMjctMTk5OAlHUkIJU3lzdGVtIHdvcmtzLgorICogdjEuMDBwcmUxCTItMTEtMTk5OAlHUkIJR290IHByb20gYm9vdCBpc3N1ZSBmaXhlZC4KKyAqIHYyLjAJCTktMjQtMTk5OQlTQ1MJTW9kaWZpZWQgZm9yIDNjOTA1IChmcm9tIDNjOTA1YiBjb2RlKQorICoJCQkJCVJlLXdyb3RlIHBvbGwgYW5kIHRyYW5zbWl0IGZvcgorICoJCQkJCWJldHRlciBlcnJvciByZWNvdmVyeSBhbmQgaGVhdnkKKyAqCQkJCQluZXR3b3JrIHRyYWZmaWMgb3BlcmF0aW9uCisgKiB2Mi4wMSAgICA1LTI2LTIwMDMgTk4gRml4ZWQgZHJpdmVyIGFsaWdubWVudCBpc3N1ZSB3aGljaAorICogICAgICAgICAgICAgICAgICBjYXVzZWQgc3lzdGVtIGxvY2t1cHMgaWYgZHJpdmVyIHN0cnVjdHVyZXMKKyAqICAgICAgICAgICAgICAgICAgbm90IDgtYnl0ZSBhbGlnbmVkLgorICogdjIuMDIgICAxMS0yOC0yMDA3IEdTdCBHb3QgcG9sbGluZyB3b3JraW5nIGFnYWluIGJ5IHJlcGxhY2luZworICogCQkJImZvcihpPTA7aTw0MDAwMDtpKyspOyIgd2l0aCAibWRlbGF5KDEpOyIKKyAqCisgKgorICogaW5kZW50IG9wdGlvbnM6IGluZGVudCAta3IgLWk4IDNjOTB4LmMKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBCU0QyICk7CisKKyNpZm5kZWYgX18zQzkwWF9IXworI2RlZmluZSBfXzNDOTBYX0hfCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcGVyYXRpb25zIGEzYzkweF9vcGVyYXRpb25zOworCisjZGVmaW5lCVhDVlJfTUFHSUMJKDB4NUEwMCkKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSAzYzkwNSAqLworZW51bSBSZWdpc3RlcnMgeworCXJlZ1Bvd2VyTWdtdEN0cmxfdyA9IDB4N2MsCS8qIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKi8KKwlyZWdVcE1heEJ1cnN0X3cgPSAweDdhLAkvKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICovCisJcmVnRG5NYXhCdXJzdF93ID0gMHg3OCwJLyogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqLworCXJlZ0RlYnVnQ29udHJvbF93ID0gMHg3NCwJLyogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqLworCXJlZ0RlYnVnRGF0YV9sID0gMHg3MCwJLyogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqLworCXJlZ1JlYWxUaW1lQ250X2wgPSAweDQwLAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcmVnVXBCdXJzdFRocmVzaF9iID0gMHgzZSwJLyogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqLworCXJlZ1VwUG9sbF9iID0gMHgzZCwJLyogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqLworCXJlZ1VwUHJpb3JpdHlUaHJlc2hfYiA9IDB4M2MsCS8qIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKi8KKwlyZWdVcExpc3RQdHJfbCA9IDB4MzgsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdDb3VudGRvd25fdyA9IDB4MzYsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdGcmVlVGltZXJfdyA9IDB4MzQsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdVcFBrdFN0YXR1c19sID0gMHgzMCwJLyogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9uLCBwZyAxMzAgICAqLworCXJlZ1R4RnJlZVRocmVzaF9iID0gMHgyZiwJLyogOTBYIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICAqLworCXJlZ0RuUG9sbF9iID0gMHgyZCwJLyogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqLworCXJlZ0RuUHJpb3JpdHlUaHJlc2hfYiA9IDB4MmMsCS8qIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKi8KKwlyZWdEbkJ1cnN0VGhyZXNoX2IgPSAweDJhLAkvKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICovCisJcmVnRG5MaXN0UHRyX2wgPSAweDI0LAkvKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb24sIHBnIDEwNyAgICovCisJcmVnRG1hQ3RybF9sID0gMHgyMCwJLyogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9uLCBwZyAxMDYgICAqLworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdJbnRTdGF0dXNBdXRvX3cgPSAweDFlLAkvKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICovCisJcmVnVHhTdGF0dXNfYiA9IDB4MWIsCS8qIFVuaXZlcnNhbCB3aXRoIEV4Y2VwdGlvbiwgcGcgMTEzICAgKi8KKwlyZWdUaW1lcl9iID0gMHgxYSwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXJlZ1R4UGt0SWRfYiA9IDB4MTgsCS8qIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKi8KKwlyZWdDb21tYW5kSW50U3RhdHVzX3cgPSAweDBlLAkvKiBVbml2ZXJzYWwgKENvbW1hbmQgVmFyaWF0aW9ucykgICAgICovCit9OworCisvKiBmb2xsb3dpbmcgYXJlIHdpbmRvd2VkIHJlZ2lzdGVycyAqLworZW51bSBSZWdpc3RlcnM3IHsKKwlyZWdQb3dlck1nbXRFdmVudF83X3cgPSAweDBjLAkvKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICovCisJcmVnVmxhbkV0aGVyVHlwZV83X3cgPSAweDA0LAkvKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICovCisJcmVnVmxhbk1hc2tfN193ID0gMHgwMCwJLyogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqLworfTsKKworZW51bSBSZWdpc3RlcnM2IHsKKwlyZWdCeXRlc1htaXR0ZWRPa182X3cgPSAweDBjLAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcmVnQnl0ZXNSY3ZkT2tfNl93ID0gMHgwYSwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXJlZ1VwcGVyRnJhbWVzT2tfNl9iID0gMHgwOSwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXJlZ0ZyYW1lc0RlZmVycmVkXzZfYiA9IDB4MDgsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdGcmFtZXNSZWNkT2tfNl9iID0gMHgwNywJLyogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9ucywgcGcgMTQyICAqLworCXJlZ0ZyYW1lc1htaXR0ZWRPa182X2IgPSAweDA2LAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcmVnUnhPdmVycnVuc182X2IgPSAweDA1LAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcmVnTGF0ZUNvbGxpc2lvbnNfNl9iID0gMHgwNCwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXJlZ1NpbmdsZUNvbGxpc2lvbnNfNl9iID0gMHgwMywJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXJlZ011bHRpcGxlQ29sbGlzaW9uc182X2IgPSAweDAyLAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcmVnU3FlRXJyb3JzXzZfYiA9IDB4MDEsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdDYXJyaWVyTG9zdF82X2IgPSAweDAwLAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCitlbnVtIFJlZ2lzdGVyczUgeworCXJlZ0luZGljYXRpb25FbmFibGVfNV93ID0gMHgwYywJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXJlZ0ludGVycnVwdEVuYWJsZV81X3cgPSAweDBhLAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcmVnVHhSZWNsYWltVGhyZXNoXzVfYiA9IDB4MDksCS8qIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKi8KKwlyZWdSeEZpbHRlcl81X2IgPSAweDA4LAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcmVnUnhFYXJseVRocmVzaF81X3cgPSAweDA2LAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcmVnVHhTdGFydFRocmVzaF81X3cgPSAweDAwLAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCitlbnVtIFJlZ2lzdGVyczQgeworCXJlZ1VwcGVyQnl0ZXNPa180X2IgPSAweDBkLAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcmVnQmFkU1NEXzRfYiA9IDB4MGMsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdNZWRpYVN0YXR1c180X3cgPSAweDBhLAkvKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb25zLCBwZyAyMDEgICovCisJcmVnUGh5c2ljYWxNZ210XzRfdyA9IDB4MDgsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdOZXR3b3JrRGlhZ25vc3RpY180X3cgPSAweDA2LAkvKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb25zLCBwZyAyMDMgICovCisJcmVnRmlmb0RpYWdub3N0aWNfNF93ID0gMHgwNCwJLyogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9ucywgcGcgMTk2ICAqLworCXJlZ1Zjb0RpYWdub3N0aWNfNF93ID0gMHgwMiwJLyogVW5kb2N1bWVudGVkPyAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworZW51bSBSZWdpc3RlcnMzIHsKKwlyZWdUeEZyZWVfM193ID0gMHgwYywJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXJlZ1J4RnJlZV8zX3cgPSAweDBhLAkvKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb25zLCBwZyAxMjUgICovCisJcmVnUmVzZXRNZWRpYU9wdGlvbnNfM193ID0gMHgwOCwJLyogTWVkaWEgT3B0aW9ucyBvbiBCIFJldmlzaW9uLCAgICAgICAqLworCS8qIFJlc2V0IE9wdGlvbnMgb24gTm9uLUIgUmV2aXNpb24gICAgKi8KKwlyZWdNYWNDb250cm9sXzNfdyA9IDB4MDYsCS8qIFVuaXZlcnNhbCB3aXRoIEV4Y2VwdGlvbnMsIHBnIDE5OSAgKi8KKwlyZWdNYXhQa3RTaXplXzNfdyA9IDB4MDQsCS8qIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKi8KKwlyZWdJbnRlcm5hbENvbmZpZ18zX2wgPSAweDAwLAkvKiBVbml2ZXJzYWwsIGRpZmZlcmVudCBiaXQgICAgICAgICAgICovCisJLyogZGVmaW5pdGlvbnMsIHBnIDU5ICAgICAgICAgICAgICAgICAqLworfTsKKworZW51bSBSZWdpc3RlcnMyIHsKKwlyZWdSZXNldE9wdGlvbnNfMl93ID0gMHgwYywJLyogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqLworCXJlZ1N0YXRpb25NYXNrXzJfM3cgPSAweDA2LAkvKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb25zLCBwZyAxMjcgICovCisJcmVnU3RhdGlvbkFkZHJlc3NfMl8zdyA9IDB4MDAsCS8qIFVuaXZlcnNhbCB3aXRoIEV4Y2VwdGlvbnMsIHBnIDEyNyAgKi8KK307CisKK2VudW0gUmVnaXN0ZXJzMSB7CisJcmVnUnhTdGF0dXNfMV93ID0gMHgwYSwJLyogOTBYIFJldmlzaW9uIE9ubHksIFBnIDEyNiAgICAgICAgICAqLworfTsKKworZW51bSBSZWdpc3RlcnMwIHsKKwlyZWdFZXByb21EYXRhXzBfdyA9IDB4MGMsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdFZXByb21Db21tYW5kXzBfdyA9IDB4MGEsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlyZWdCaW9zUm9tRGF0YV8wX2IgPSAweDA4LAkvKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICovCisJcmVnQmlvc1JvbUFkZHJfMF9sID0gMHgwNCwJLyogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqLworfTsKKworCisvKiBUaGUgbmFtZXMgZm9yIHRoZSBlaWdodCByZWdpc3RlciB3aW5kb3dzICovCitlbnVtIFdpbmRvd3MgeworCXdpbk5vbmUgPSAweGZmLAorCXdpblBvd2VyVmxhbjcgPSAweDA3LAorCXdpblN0YXRpc3RpY3M2ID0gMHgwNiwKKwl3aW5UeFJ4Q29udHJvbDUgPSAweDA1LAorCXdpbkRpYWdub3N0aWNzNCA9IDB4MDQsCisJd2luVHhSeE9wdGlvbnMzID0gMHgwMywKKwl3aW5BZGRyZXNzaW5nMiA9IDB4MDIsCisJd2luVW51c2VkMSA9IDB4MDEsCisJd2luRWVwcm9tQmlvczAgPSAweDAwLAorfTsKKworCisvKiBDb21tYW5kIGRlZmluaXRpb25zIGZvciB0aGUgM2M5MFggKi8KK2VudW0gQ29tbWFuZHMgeworCWNtZEdsb2JhbFJlc2V0ID0gMHgwMCwJLyogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9ucywgcGcgMTUxICovCisJY21kU2VsZWN0UmVnaXN0ZXJXaW5kb3cgPSAweDAxLAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwljbWRFbmFibGVEY0NvbnZlcnRlciA9IDB4MDIsCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWNtZFJ4RGlzYWJsZSA9IDB4MDMsCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWNtZFJ4RW5hYmxlID0gMHgwNCwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICovCisJY21kUnhSZXNldCA9IDB4MDUsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWNtZFN0YWxsQ3RsID0gMHgwNiwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICovCisJY21kVHhFbmFibGUgPSAweDA5LAkvKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwljbWRUeERpc2FibGUgPSAweDBBLAkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwljbWRUeFJlc2V0ID0gMHgwQiwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICovCisJY21kUmVxdWVzdEludGVycnVwdCA9IDB4MEMsCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWNtZEFja25vd2xlZGdlSW50ZXJydXB0ID0gMHgwRCwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICovCisJY21kU2V0SW50ZXJydXB0RW5hYmxlID0gMHgwRSwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICovCisJY21kU2V0SW5kaWNhdGlvbkVuYWJsZSA9IDB4MEYsCS8qIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWNtZFNldFJ4RmlsdGVyID0gMHgxMCwJLyogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICovCisJY21kU2V0UnhFYXJseVRocmVzaCA9IDB4MTEsCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWNtZFNldFR4U3RhcnRUaHJlc2ggPSAweDEzLAkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwljbWRTdGF0aXN0aWNzRW5hYmxlID0gMHgxNSwJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJY21kU3RhdGlzdGljc0Rpc2FibGUgPSAweDE2LAkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwljbWREaXNhYmxlRGNDb252ZXJ0ZXIgPSAweDE3LAkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwljbWRTZXRUeFJlY2xhaW1UaHJlc2ggPSAweDE4LAkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwljbWRTZXRIYXNoRmlsdGVyQml0ID0gMHgxOSwJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCitlbnVtIEZyYW1lU3RhcnRIZWFkZXIgeworCWZzaFR4SW5kaWNhdGUgPSAweDgwMDAsCisJZnNoRG5Db21wbGV0ZSA9IDB4MTAwMDAsCit9OworCitlbnVtIFVwRG93bkRlc2MgeworCXVwTGFzdEZyYWcgPSAoMSA8PCAzMSksCisJZG93bkxhc3RGcmFnID0gKDEgPDwgMzEpLAorfTsKKworZW51bSBVcFBrdFN0YXR1cyB7CisJdXBDb21wbGV0ZSA9ICgxIDw8IDE1KSwKKwl1cEVycm9yID0gKDEgPDwgMTQpLAorfTsKKworZW51bSBTdGFsbHMgeworCXVwU3RhbGwgPSAweDAwLAorCXVwVW5TdGFsbCA9IDB4MDEsCisKKwlkblN0YWxsID0gMHgwMiwKKwlkblVuU3RhbGwgPSAweDAzLAorfTsKKworZW51bSBSZXNvdXJjZXMgeworCXJlc1J4UmluZyA9IDB4MDAsCisJcmVzVHhSaW5nID0gMHgwMiwKKwlyZXNSeElPQnVmID0gMHgwNAorfTsKKworZW51bSBlZXByb20geworCWVlcHJvbUJ1c3kgPSAoMSA8PCAxNSksCisJZWVwcm9tUmVhZCA9ICgoMHgwMikgPDwgNiksCisJZWVwcm9tUmVhZF81NTYgPSAweDIzMCwKKwllZXByb21Id0FkZHJPZmZzZXQgPSAweDBhLAorfTsKKworLyogQml0IDQgaXMgb25seSB1c2VkIGluIHJldmlzb24gQiBhbmQgdXB3YXJkcyAqLworZW51bSBsaW5rdHlwZSB7CisJbGluazEwQmFzZVQgPSAweDAwLAorCWxpbmtBVUkgPSAweDAxLAorCWxpbmsxMEJhc2UyID0gMHgwMywKKwlsaW5rMTAwQmFzZUZYID0gMHgwNSwKKwlsaW5rTUlJID0gMHgwNiwKKwlsaW5rQXV0b25lZyA9IDB4MDgsCisJbGlua0V4dGVybmFsTUlJID0gMHgwOSwKK307CisKKy8qIFZhbHVlcyBmb3IgaW50IHN0YXR1cyByZWdpc3RlciBiaXRtYXNrICovCisjZGVmaW5lCUlOVF9JTlRFUlJVUFRMQVRDSAkoMTw8MCkKKyNkZWZpbmUgSU5UX0hPU1RFUlJPUgkJKDE8PDEpCisjZGVmaW5lIElOVF9UWENPTVBMRVRFCQkoMTw8MikKKyNkZWZpbmUgSU5UX1JYQ09NUExFVEUJCSgxPDw0KQorI2RlZmluZSBJTlRfUlhFQVJMWQkJKDE8PDUpCisjZGVmaW5lIElOVF9JTlRSRVFVRVNURUQJKDE8PDYpCisjZGVmaW5lIElOVF9VUERBVEVTVEFUUwkJKDE8PDcpCisjZGVmaW5lIElOVF9MSU5LRVZFTlQJCSgxPDw4KQorI2RlZmluZSBJTlRfRE5DT01QTEVURQkJKDE8PDkpCisjZGVmaW5lIElOVF9VUENPTVBMRVRFCQkoMTw8MTApCisjZGVmaW5lIElOVF9DTURJTlBST0dSRVNTCSgxPDwxMikKKyNkZWZpbmUgSU5UX1dJTkRPV05VTUJFUgkoNzw8MTMpCisKKy8qIEJ1ZmZlciBzaXplcyAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUgOAorI2RlZmluZSBSWF9SSU5HX1NJWkUgOAorI2RlZmluZSBUWF9SSU5HX0FMSUdOIDE2CisjZGVmaW5lIFJYX1JJTkdfQUxJR04gMTYKKyNkZWZpbmUgUlhfQlVGX1NJWkUgMTUzNgorCisvKiBUaW1lb3V0cyBmb3IgZWVwcm9tIGFuZCBjb21tYW5kIGNvbXBsZXRpb24gKi8KKy8qIFRpbWVvdXQgMSBzZWNvbmQsIHRvIGJlIHNhdmUgKi8KKyNkZWZpbmUgRUVQUk9NX1RJTUVPVVQJCTEgKiAxMDAwICogMTAwMAorCisvKiBUWCBkZXNjcmlwdG9yICovCitzdHJ1Y3QgVFhEIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRG5OZXh0UHRyOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBGcmFtZVN0YXJ0SGVhZGVyOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEYXRhQWRkcjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGF0YUxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsJLyogNjQtYml0IGFsaWduZWQgZm9yIGJ1cyBtYXN0ZXJpbmcgKi8KKworLyogUlggZGVzY3JpcHRvciAqLworc3RydWN0IFJYRCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFVwTmV4dFB0cjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgVXBQa3RTdGF0dXM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IERhdGFBZGRyOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEYXRhTGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOwkvKiA2NC1iaXQgYWxpZ25lZCBmb3IgYnVzIG1hc3RlcmluZyAqLworCisvKiBQcml2YXRlIE5JQyBkYXRzICovCitzdHJ1Y3QgSU5GXzNDOTBYIHsKKwl1bnNpZ25lZCBpbnQgaXMzYzU1NjsKKwl1bnNpZ25lZCBjaGFyIGlzQnJldjsKKwl1bnNpZ25lZCBjaGFyIEN1cnJlbnRXaW5kb3c7CisJdW5zaWduZWQgaW50IElPQWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBlZXByb21bMHgyMV07CisJdW5zaWduZWQgaW50IHR4X2N1cjsJLyogY3VycmVudCBlbnRyeSBpbiB0eF9yaW5nICovCisJdW5zaWduZWQgaW50IHR4X2NudDsJLyogY3VycmVudCBudW1iZXIgb2YgdXNlZCB0eCBkZXNjcmlwdG9ycyAqLworCXVuc2lnbmVkIGludCB0eF90YWlsOwkvKiBlbnRyeSBvZiBsYXN0IGZpbmlzaGVkIHBhY2tldCAqLworCXVuc2lnbmVkIGludCByeF9jdXI7CisJc3RydWN0IFRYRCAqdHhfcmluZzsKKwlzdHJ1Y3QgUlhEICpyeF9yaW5nOworCXN0cnVjdCBpb19idWZmZXIgKnR4X2lvYnVmW1RYX1JJTkdfU0laRV07CisJc3RydWN0IGlvX2J1ZmZlciAqcnhfaW9idWZbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgbnZzX2RldmljZSBudnM7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWZkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCkBAIC0wLDAgKzEsNjkzIEBACisvKiBBZHZhbmNlZCAgTWljcm8gRGV2aWNlcyBJbmMuIEFNRDgxMTFFIExpbnV4IE5ldHdvcmsgRHJpdmVyIAorICogQ29weXJpZ2h0IChDKSAyMDA0IEFkdmFuY2VkIE1pY3JvIERldmljZXMgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTGl1IFRhbyA8bGl1dGFvMTk4MEBnbWFpbC5jb20+IFtldGhlcmJvb3QgcG9ydF0KKyAqIAorICogQ29weXJpZ2h0IDIwMDEsMjAwMiBKZWZmIEdhcnppayA8amdhcnppa0BtYW5kcmFrZXNvZnQuY29tPiBbIDgxMzljcC5jLHRnMy5jIF0KKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pWyB0ZzMuY10KKyAqIENvcHlyaWdodCAxOTk2LTE5OTkgVGhvbWFzIEJvZ2VuZG9lcmZlciBbIHBjbmV0MzIuYyBdCisgKiBEZXJpdmVkIGZyb20gdGhlIGxhbmNlIGRyaXZlciB3cml0dGVuIDE5OTMsMTk5NCwxOTk1IGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKglEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LlsgcGNuZXQzMi5jIF0KKyAqIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbSBbIHBjbmV0MzIuYyBdCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAKKyAqIFVTQQorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgIm1paS5oIgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGludC5oIgorI2luY2x1ZGUgImFtZDgxMTFlLmgiCisKKworLyogZHJpdmVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIE5VTV9UWF9TTE9UUwkyCisjZGVmaW5lIE5VTV9SWF9TTE9UUwk0CisjZGVmaW5lIFRYX1NMT1RTX01BU0sJMQorI2RlZmluZSBSWF9TTE9UU19NQVNLCTMKKworI2RlZmluZSBUWF9CVUZfTEVOCTE1MzYKKyNkZWZpbmUgUlhfQlVGX0xFTgkxNTM2CisKKyNkZWZpbmUgVFhfUEtUX0xFTl9NQVgJKEVUSF9GUkFNRV9MRU4gLSBFVEhfSExFTikKKyNkZWZpbmUgUlhfUEtUX0xFTl9NSU4JNjAKKyNkZWZpbmUgUlhfUEtUX0xFTl9NQVgJRVRIX0ZSQU1FX0xFTgorCisjZGVmaW5lIFRYX1RJTUVPVVQJMzAwMAorI2RlZmluZSBUWF9QUk9DRVNTX1RJTUUJMTAKKyNkZWZpbmUgVFhfUkVUUlkJKFRYX1RJTUVPVVQgLyBUWF9QUk9DRVNTX1RJTUUpCisKKyNkZWZpbmUgUEhZX1JXX1JFVFJZCTEwCisKKworc3RydWN0IGFtZDgxMTFlX3R4X2Rlc2MgeworCXUxNiBidWZfbGVuOworCXUxNiB0eF9mbGFnczsKKwl1MTYgdGFnX2N0cmxfaW5mbzsKKwl1MTYgdGFnX2N0cmxfY21kOworCXUzMiBidWZfcGh5X2FkZHI7CisJdTMyIHJlc2VydmVkOworfTsgCisKK3N0cnVjdCBhbWQ4MTExZV9yeF9kZXNjIHsKKwl1MzIgcmVzZXJ2ZWQ7CisJdTE2IG1zZ19sZW47CisJdTE2IHRhZ19jdHJsX2luZm87IAorCXUxNiBidWZfbGVuOworCXUxNiByeF9mbGFnczsKKwl1MzIgYnVmX3BoeV9hZGRyOworfTsKKworc3RydWN0IGV0aF9mcmFtZSB7CisJdTggZHN0X2FkZHJbRVRIX0FMRU5dOworCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKKwl1MTYgdHlwZTsKKwl1OCBkYXRhW0VUSF9GUkFNRV9MRU4gLSBFVEhfSExFTl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYW1kODExMWVfcHJpdiB7CisJc3RydWN0IGFtZDgxMTFlX3R4X2Rlc2MgdHhfcmluZ1tOVU1fVFhfU0xPVFNdOworCXN0cnVjdCBhbWQ4MTExZV9yeF9kZXNjIHJ4X3JpbmdbTlVNX1JYX1NMT1RTXTsKKwl1bnNpZ25lZCBjaGFyIHR4X2J1ZltOVU1fVFhfU0xPVFNdW1RYX0JVRl9MRU5dOworCXVuc2lnbmVkIGNoYXIgcnhfYnVmW05VTV9SWF9TTE9UU11bUlhfQlVGX0xFTl07CisJdW5zaWduZWQgbG9uZyB0eF9pZHgsIHJ4X2lkeDsKKwlpbnQgdHhfY29uc2lzdGVudDsKKworCWNoYXIgb3BlbmVkOworCWNoYXIgbGluazsKKwljaGFyIHNwZWVkOworCWNoYXIgZHVwbGV4OworCWludCBleHRfcGh5X2FkZHI7CisJdTMyIGV4dF9waHlfaWQ7CisKKwlzdHJ1Y3QgcGNpX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgbmljICpuaWM7CisJdm9pZCAqbW1pbzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYW1kODExMWVfcHJpdiBhbWQ4MTExZTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJbG9jYWxlIGZ1bmN0aW9ucwkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2luaXRfaHdfZGVmYXVsdChzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHApOworc3RhdGljIGludCBhbWQ4MTExZV9zdGFydChzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHApOworc3RhdGljIGludCBhbWQ4MTExZV9yZWFkX3BoeShzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAsIGludCBwaHlfYWRkciwgaW50IHJlZywgdTMyICp2YWwpOworI2lmIDAKK3N0YXRpYyBpbnQgYW1kODExMWVfd3JpdGVfcGh5KHN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCwgaW50IHBoeV9hZGRyLCBpbnQgcmVnLCB1MzIgdmFsKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgYW1kODExMWVfcHJvYmVfZXh0X3BoeShzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHApOworc3RhdGljIHZvaWQgYW1kODExMWVfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKTsKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKTsKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2ZvcmNlX2ludGVycnVwdChzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHApOworc3RhdGljIGludCBhbWQ4MTExZV9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKTsKK3N0YXRpYyBpbnQgYW1kODExMWVfaW5pdF9yeF9yaW5nKHN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCk7CitzdGF0aWMgaW50IGFtZDgxMTFlX2luaXRfdHhfcmluZyhzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHApOworc3RhdGljIGludCBhbWQ4MTExZV93YWl0X3R4X3Jpbmcoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwLCB1bnNpZ25lZCBpbnQgaW5kZXgpOworc3RhdGljIHZvaWQgYW1kODExMWVfd2FpdF9saW5rKHN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCk7CitzdGF0aWMgdm9pZCBhbWQ4MTExZV9wb2xsX2xpbmsoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKTsKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3Jlc3RhcnQoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKTsKKworCisvKiAKKyAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIG5lY2Vzc2FyeSB0aGUgZGV2aWNlIHJlZ2lzdGVycy4gCisgKi8JCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9pbml0X2h3X2RlZmF1bHQoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKQoreworCXVuc2lnbmVkIGludCByZWdfdmFsOworCXZvaWQgKm1taW8gPSBscC0+bW1pbzsKKworICAgICAgICAvKiBzdG9wIHRoZSBjaGlwICovCisJd3JpdGVsKFJVTiwgbW1pbyArIENNRDApOworCisJLyogQ2xlYXIgUkNWX1JJTkdfQkFTRV9BRERSICovCisJd3JpdGVsKDAsIG1taW8gKyBSQ1ZfUklOR19CQVNFX0FERFIwKTsKKworCS8qIENsZWFyIFhNVF9SSU5HX0JBU0VfQUREUiAqLworCXdyaXRlbCgwLCBtbWlvICsgWE1UX1JJTkdfQkFTRV9BRERSMCk7CisJd3JpdGVsKDAsIG1taW8gKyBYTVRfUklOR19CQVNFX0FERFIxKTsKKwl3cml0ZWwoMCwgbW1pbyArIFhNVF9SSU5HX0JBU0VfQUREUjIpOworCXdyaXRlbCgwLCBtbWlvICsgWE1UX1JJTkdfQkFTRV9BRERSMyk7CisKKwkvKiBDbGVhciBDTUQwICAqLworCXdyaXRlbChDTUQwX0NMRUFSLCBtbWlvICsgQ01EMCk7CisJCisJLyogQ2xlYXIgQ01EMiAqLworCXdyaXRlbChDTUQyX0NMRUFSLCBtbWlvICsgQ01EMik7CisKKwkvKiBDbGVhciBDTUQ3ICovCisJd3JpdGVsKENNRDdfQ0xFQVIsIG1taW8gKyBDTUQ3KTsKKworCS8qIENsZWFyIERMWV9JTlRfQSBhbmQgRExZX0lOVF9CICovCisJd3JpdGVsKDB4MCwgbW1pbyArIERMWV9JTlRfQSk7CisJd3JpdGVsKDB4MCwgbW1pbyArIERMWV9JTlRfQik7CisKKwkvKiBDbGVhciBGTE9XX0NPTlRST0wgKi8KKwl3cml0ZWwoMHgwLCBtbWlvICsgRkxPV19DT05UUk9MKTsKKworCS8qIENsZWFyIElOVDAgIHdyaXRlIDEgdG8gY2xlYXIgcmVnaXN0ZXIgKi8KKwlyZWdfdmFsID0gcmVhZGwobW1pbyArIElOVDApOworCXdyaXRlbChyZWdfdmFsLCBtbWlvICsgSU5UMCk7CisKKwkvKiBDbGVhciBTVFZBTCAqLworCXdyaXRlbCgweDAsIG1taW8gKyBTVFZBTCk7CisKKwkvKiBDbGVhciBJTlRFTjAgKi8KKwl3cml0ZWwoSU5URU4wX0NMRUFSLCBtbWlvICsgSU5URU4wKTsKKworCS8qIENsZWFyIExBRFJGICovCisJd3JpdGVsKDB4MCwgbW1pbyArIExBRFJGKTsKKworCS8qIFNldCBTUkFNX1NJWkUgJiBTUkFNX0JPVU5EQVJZIHJlZ2lzdGVycyAgKi8KKwl3cml0ZWwoMHg4MDAxMCwgbW1pbyArIFNSQU1fU0laRSk7CisKKwkvKiBDbGVhciBSQ1ZfUklORzBfTEVOICovCisJd3JpdGVsKDB4MCwgbW1pbyArICBSQ1ZfUklOR19MRU4wKTsKKworCS8qIENsZWFyIFhNVF9SSU5HMC8xLzIvM19MRU4gKi8KKwl3cml0ZWwoMHgwLCBtbWlvICsgIFhNVF9SSU5HX0xFTjApOworCXdyaXRlbCgweDAsIG1taW8gKyAgWE1UX1JJTkdfTEVOMSk7CisJd3JpdGVsKDB4MCwgbW1pbyArICBYTVRfUklOR19MRU4yKTsKKwl3cml0ZWwoMHgwLCBtbWlvICsgIFhNVF9SSU5HX0xFTjMpOworCisJLyogQ2xlYXIgWE1UX1JJTkdfTElNSVQgKi8KKwl3cml0ZWwoMHgwLCBtbWlvICsgWE1UX1JJTkdfTElNSVQpOworCisJLyogQ2xlYXIgTUlCICovCisJd3JpdGV3KE1JQl9DTEVBUiwgbW1pbyArIE1JQl9BRERSKTsKKworCS8qIENsZWFyIExBUkYgKi8KKwl3cml0ZWwoIDAsIG1taW8gKyBMQURSRik7CisJd3JpdGVsKCAwLCBtbWlvICsgTEFEUkYgKyA0KTsKKworCS8qIFNSQU1fU0laRSByZWdpc3RlciAqLworCXJlZ192YWwgPSByZWFkbChtbWlvICsgU1JBTV9TSVpFKTsKKwkKKwkvKiBTZXQgZGVmYXVsdCB2YWx1ZSB0byBDVFJMMSBSZWdpc3RlciAqLworCXdyaXRlbChDVFJMMV9ERUZBVUxULCBtbWlvICsgQ1RSTDEpOworCisJLyogVG8gYXZvaWQgUENJIHBvc3RpbmcgYnVnICovCisJcmVhZGwobW1pbyArIENNRDIpOworfQorCisvKiAKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGRldmljZSByZWdpc3RlcnMgIGFuZCBzdGFydHMgdGhlIGRldmljZS4gIAorICovCitzdGF0aWMgaW50IGFtZDgxMTFlX3N0YXJ0KHN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBscC0+bmljOworCXZvaWQgKm1taW8gPSBscC0+bW1pbzsKKwlpbnQgaSwgcmVnX3ZhbDsKKworCS8qIHN0b3AgdGhlIGNoaXAgKi8KKwl3cml0ZWwoUlVOLCBtbWlvICsgQ01EMCk7CisKKwkvKiBBVVRPUE9MTDAgUmVnaXN0ZXIgKi8vKlRCRCBkZWZhdWx0IHZhbHVlIGlzIDgxMDAgaW4gRlBTICovCisJd3JpdGV3KDB4ODEwMCB8IGxwLT5leHRfcGh5X2FkZHIsIG1taW8gKyBBVVRPUE9MTDApOworCisJLyogZW5hYmxlIHRoZSBwb3J0IG1hbmFnZXIgYW5kIHNldCBhdXRvIG5lZ290aWF0aW9uIGFsd2F5cyAqLworCXdyaXRlbChWQUwxIHwgRU5fUE1HUiwgbW1pbyArIENNRDMgKTsKKwl3cml0ZWwoWFBIWUFORSB8IFhQSFlSU1QsIG1taW8gKyBDVFJMMik7IAorCisJLyogc2V0IGNvbnRyb2wgcmVnaXN0ZXJzICovCisJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBDVFJMMSk7CisJcmVnX3ZhbCAmPSB+WE1UU1BfTUFTSzsKKwl3cml0ZWwocmVnX3ZhbCB8IFhNVFNQXzEyOCB8IENBQ0hFX0FMSUdOLCBtbWlvICsgQ1RSTDEpOworCisJLyogaW5pdGlhbGl6ZSB0eCBhbmQgcnggcmluZyBiYXNlIGFkZHJlc3NlcyAqLworCWFtZDgxMTFlX2luaXRfdHhfcmluZyhscCk7CisJYW1kODExMWVfaW5pdF9yeF9yaW5nKGxwKTsKKwl3cml0ZWwodmlydF90b19idXMobHAtPnR4X3JpbmcpLCBtbWlvICsgWE1UX1JJTkdfQkFTRV9BRERSMCk7CisJd3JpdGVsKHZpcnRfdG9fYnVzKGxwLT5yeF9yaW5nKSwgbW1pbyArIFJDVl9SSU5HX0JBU0VfQUREUjApOworCXdyaXRldyhOVU1fVFhfU0xPVFMsIG1taW8gKyBYTVRfUklOR19MRU4wKTsKKwl3cml0ZXcoTlVNX1JYX1NMT1RTLCBtbWlvICsgUkNWX1JJTkdfTEVOMCk7CisJCisJLyogc2V0IGRlZmF1bHQgSVBHIHRvIDk2ICovCisJd3JpdGV3KERFRkFVTFRfSVBHLCBtbWlvICsgSVBHKTsKKwl3cml0ZXcoREVGQVVMVF9JUEcgLSBJRlMxX0RFTFRBLCBtbWlvICsgSUZTMSk7IAorCisJLyogQXV0b1BBRCB0cmFuc21pdCwgUmV0cmFuc21pdCBvbiBVbmRlcmZsb3cgKi8KKwl3cml0ZWwoVkFMMCB8IEFQQURfWE1UIHwgUkVYX1JUUlkgfCBSRVhfVUZMTywgbW1pbyArIENNRDIpOworCQorCS8qIEpVTUJPIGRpc2FibGVkICovCisJd3JpdGVsKEpVTUJPLCBtbWlvICsgQ01EMyk7CisKKwkvKiBTZXR0aW5nIHRoZSBNQUMgYWRkcmVzcyB0byB0aGUgZGV2aWNlICovCisJZm9yKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJd3JpdGViKG5pYy0+bm9kZV9hZGRyW2ldLCBtbWlvICsgUEFEUiArIGkpOyAKKworCS8qIHNldCBSVU4gYml0IHRvIHN0YXJ0IHRoZSBjaGlwLCBpbnRlcnJ1cHQgbm90IGVuYWJsZWQgKi8KKwl3cml0ZWwoVkFMMiB8IFJETUQwIHwgVkFMMCB8IFJVTiwgbW1pbyArIENNRDApOworCQorCS8qIFRvIGF2b2lkIFBDSSBwb3N0aW5nIGJ1ZyAqLworCXJlYWRsKG1taW8gKyBDTUQwKTsKKwlyZXR1cm4gMDsKK30KKworLyogCitUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgUEhZIHJlZ2lzdGVycy4KKyovCitzdGF0aWMgaW50IGFtZDgxMTFlX3JlYWRfcGh5KHN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCwgaW50IHBoeV9hZGRyLCBpbnQgcmVnLCB1MzIgKnZhbCkKK3sKKwl2b2lkICptbWlvID0gbHAtPm1taW87CisJdW5zaWduZWQgaW50IHJlZ192YWw7CisJdW5zaWduZWQgaW50IHJldHJ5ID0gUEhZX1JXX1JFVFJZOworCisJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBQSFlfQUNDRVNTKTsKKwl3aGlsZSAocmVnX3ZhbCAmIFBIWV9DTURfQUNUSVZFKQorCQlyZWdfdmFsID0gcmVhZGwobW1pbyArIFBIWV9BQ0NFU1MpOworCisJd3JpdGVsKFBIWV9SRF9DTUQgfCAoKHBoeV9hZGRyICYgMHgxZikgPDwgMjEpIHwgKChyZWcgJiAweDFmKSA8PCAxNiksCisJCW1taW8gKyBQSFlfQUNDRVNTKTsKKwlkbyB7CisJCXJlZ192YWwgPSByZWFkbChtbWlvICsgUEhZX0FDQ0VTUyk7CisJCXVkZWxheSgzMCk7ICAvKiBJdCB0YWtlcyAzMCB1cyB0byByZWFkL3dyaXRlIGRhdGEgKi8KKwl9IHdoaWxlICgtLXJldHJ5ICYmIChyZWdfdmFsICYgUEhZX0NNRF9BQ1RJVkUpKTsKKworCWlmIChyZWdfdmFsICYgUEhZX1JEX0VSUikgeworCQkqdmFsID0gMDsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkqdmFsID0gcmVnX3ZhbCAmIDB4ZmZmZjsKKwlyZXR1cm4gMDsKK30KKworLyogCitUaGlzIGZ1bmN0aW9uIHdpbGwgd3JpdGUgaW50byBQSFkgcmVnaXN0ZXJzLiAKKyovCisjaWYgMAorc3RhdGljIGludCBhbWQ4MTExZV93cml0ZV9waHkoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwLCBpbnQgcGh5X2FkZHIsIGludCByZWcsIHUzMiB2YWwpCit7CisJdm9pZCAqbW1pbyA9IGxwLT5tbWlvOworCXVuc2lnbmVkIGludCByZWdfdmFsOworCXVuc2lnbmVkIGludCByZXRyeSA9IFBIWV9SV19SRVRSWTsKKworCXJlZ192YWwgPSByZWFkbChtbWlvICsgUEhZX0FDQ0VTUyk7CisJd2hpbGUgKHJlZ192YWwgJiBQSFlfQ01EX0FDVElWRSkKKwkJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBQSFlfQUNDRVNTKTsKKworCXdyaXRlbChQSFlfV1JfQ01EIHwgKChwaHlfYWRkciAmIDB4MWYpIDw8IDIxKSB8ICgocmVnICYgMHgxZikgPDwgMTYpIHwgdmFsLAorCQltbWlvICsgUEhZX0FDQ0VTUyk7CisJZG8geworCQlyZWdfdmFsID0gcmVhZGwobW1pbyArIFBIWV9BQ0NFU1MpOworCQl1ZGVsYXkoMzApOyAgLyogSXQgdGFrZXMgMzAgdXMgdG8gcmVhZC93cml0ZSB0aGUgZGF0YSAqLworCX0gd2hpbGUgKC0tcmV0cnkgJiYgKHJlZ192YWwgJiBQSFlfQ01EX0FDVElWRSkpOworCQorCWlmKHJlZ192YWwgJiBQSFlfUkRfRVJSKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9wcm9iZV9leHRfcGh5KHN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCkKK3sKKwlpbnQgaTsKKworCWxwLT5leHRfcGh5X2lkID0gMDsKKwlscC0+ZXh0X3BoeV9hZGRyID0gMTsKKwkKKwlmb3IgKGkgPSAweDFlOyBpID49IDA7IGktLSkgeworCQl1MzIgaWQxLCBpZDI7CisKKwkJaWYgKGFtZDgxMTFlX3JlYWRfcGh5KGxwLCBpLCBNSUlfUEhZU0lEMSwgJmlkMSkpCisJCQljb250aW51ZTsKKwkJaWYgKGFtZDgxMTFlX3JlYWRfcGh5KGxwLCBpLCBNSUlfUEhZU0lEMiwgJmlkMikpCisJCQljb250aW51ZTsKKwkJbHAtPmV4dF9waHlfaWQgPSAoaWQxIDw8IDE2KSB8IGlkMjsKKwkJbHAtPmV4dF9waHlfYWRkciA9IGk7CisJCWJyZWFrOworCX0KKworCWlmIChscC0+ZXh0X3BoeV9pZCkKKwkJcHJpbnRmKCJGb3VuZCBNSUkgUEhZIElEIDB4JTA4eCBhdCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpIGxwLT5leHRfcGh5X2lkLCBscC0+ZXh0X3BoeV9hZGRyKTsKKwllbHNlCisJCXByaW50ZigiQ291bGRuJ3QgZGV0ZWN0IE1JSSBQSFksIGFzc3VtaW5nIGFkZHJlc3MgMHgwMVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCkKK3sKKwl2b2lkICptbWlvID0gbHAtPm1taW87CisJdW5zaWduZWQgaW50IGludDA7CisKKwl3cml0ZWwoSU5UUkVOLCBtbWlvICsgQ01EMCk7CisJd3JpdGVsKElOVEVOMF9DTEVBUiwgbW1pbyArIElOVEVOMCk7CisJaW50MCA9IHJlYWRsKG1taW8gKyBJTlQwKTsKKwl3cml0ZWwoaW50MCwgbW1pbyArIElOVDApOworCXJlYWRsKG1taW8gKyBJTlQwKTsKK30KKworc3RhdGljIHZvaWQgYW1kODExMWVfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHApCit7CisJdm9pZCAqbW1pbyA9IGxwLT5tbWlvOworCisJd3JpdGVsKFZBTDMgfCBMQ0lOVEVOIHwgVkFMMSB8IFRJTlRFTjAgfCBWQUwwIHwgUklOVEVOMCwgbW1pbyArIElOVEVOMCk7CisJd3JpdGVsKFZBTDAgfCBJTlRSRU4sIG1taW8gKyBDTUQwKTsKKwlyZWFkbChtbWlvICsgQ01EMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2ZvcmNlX2ludGVycnVwdChzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHApCit7CisJdm9pZCAqbW1pbyA9IGxwLT5tbWlvOworCisJd3JpdGVsKFZBTDAgfCBVSU5UQ01ELCBtbWlvICsgQ01EMCk7CisJcmVhZGwobW1pbyArIENNRDApOworfQorCitzdGF0aWMgaW50IGFtZDgxMTFlX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHApCit7CisJc3RydWN0IG5pYyAqbmljID0gbHAtPm5pYzsKKwl2b2lkICptbWlvID0gbHAtPm1taW87CisJaW50IGk7CisKKwkvKiBCSU9TIHNob3VsZCBoYXZlIHNldCBtYWMgYWRkcmVzcyB0byBQQURSIHJlZ2lzdGVyLAorCSAqIHNvIHdlIHJlYWQgUEFEUiB0byBnZXQgaXQuCisJICovCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCW5pYy0+bm9kZV9hZGRyW2ldID0gcmVhZGIobW1pbyArIFBBRFIgKyBpKTsKKworCURCRyAoICJFdGhlcm5ldCBhZGRyOiAlc1xuIiwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWQ4MTExZV9pbml0X3J4X3Jpbmcoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKQoreworCWludCBpOworCisJbHAtPnJ4X2lkeCA9IDA7CisJCisgICAgICAgIC8qIEluaXRpbGFpemluZyByZWNlaXZlIGRlc2NyaXB0b3JzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9TTE9UUzsgaSsrKSB7CisJCWxwLT5yeF9yaW5nW2ldLmJ1Zl9waHlfYWRkciA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKGxwLT5yeF9idWZbaV0pKTsKKwkJbHAtPnJ4X3JpbmdbaV0uYnVmX2xlbiA9IGNwdV90b19sZTE2KFJYX0JVRl9MRU4pOworCQl3bWIoKTsKKwkJbHAtPnJ4X3JpbmdbaV0ucnhfZmxhZ3MgPSBjcHVfdG9fbGUxNihPV05fQklUKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWQ4MTExZV9pbml0X3R4X3Jpbmcoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKQoreworCWludCBpOworCisJbHAtPnR4X2lkeCA9IDA7CisJbHAtPnR4X2NvbnNpc3RlbnQgPSAxOworCQorCS8qIEluaXRpYWxpemluZyB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfU0xPVFM7IGkrKykgeworCQlscC0+dHhfcmluZ1tpXS50eF9mbGFncyA9IDA7CisJCWxwLT50eF9yaW5nW2ldLmJ1Zl9waHlfYWRkciA9IDA7CisJCWxwLT50eF9yaW5nW2ldLmJ1Zl9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZDgxMTFlX3dhaXRfdHhfcmluZyhzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl2b2xhdGlsZSB1MTYgc3RhdHVzOworCWludCByZXRyeSA9IFRYX1JFVFJZOworCisJc3RhdHVzID0gbGUxNl90b19jcHUobHAtPnR4X3JpbmdbaW5kZXhdLnR4X2ZsYWdzKTsKKwl3aGlsZSAoLS1yZXRyeSAmJiAoc3RhdHVzICYgT1dOX0JJVCkpIHsKKwkJbWRlbGF5KFRYX1BST0NFU1NfVElNRSk7CisJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGxwLT50eF9yaW5nW2luZGV4XS50eF9mbGFncyk7CisJfQorCWlmIChzdGF0dXMgJiBPV05fQklUKSB7CisJCXByaW50ZigiRXJyb3I6IHR4IHNsb3QgJWQgdGltZW91dCwgc3RhdCA9IDB4JXhcbiIsIGluZGV4LCBzdGF0dXMpOworCQlhbWQ4MTExZV9yZXN0YXJ0KGxwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbWQ4MTExZV93YWl0X2xpbmsoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdTMyIHJlZ192YWw7CisKKwlkbyB7CisJCS8qIHJlYWQgcGh5IHRvIHVwZGF0ZSBTVEFUMCByZWdpc3RlciAqLworCQlhbWQ4MTExZV9yZWFkX3BoeShscCwgbHAtPmV4dF9waHlfYWRkciwgTUlJX0JNQ1IsICZyZWdfdmFsKTsKKwkJYW1kODExMWVfcmVhZF9waHkobHAsIGxwLT5leHRfcGh5X2FkZHIsIE1JSV9CTVNSLCAmcmVnX3ZhbCk7CisJCWFtZDgxMTFlX3JlYWRfcGh5KGxwLCBscC0+ZXh0X3BoeV9hZGRyLCBNSUlfQURWRVJUSVNFLCAmcmVnX3ZhbCk7CisJCWFtZDgxMTFlX3JlYWRfcGh5KGxwLCBscC0+ZXh0X3BoeV9hZGRyLCBNSUlfTFBBLCAmcmVnX3ZhbCk7CisJCXN0YXR1cyA9IHJlYWRsKGxwLT5tbWlvICsgU1RBVDApOworCX0gd2hpbGUgKCEoc3RhdHVzICYgQVVUT05FR19DT01QTEVURSkgfHwgIShzdGF0dXMgJiBMSU5LX1NUQVRTKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3BvbGxfbGluayhzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHApCit7CisJdW5zaWduZWQgaW50IHN0YXR1cywgc3BlZWQ7CisJdTMyIHJlZ192YWw7CisKKwlpZiAoIWxwLT5saW5rKSB7CisJCS8qIHJlYWQgcGh5IHRvIHVwZGF0ZSBTVEFUMCByZWdpc3RlciAqLworCQlhbWQ4MTExZV9yZWFkX3BoeShscCwgbHAtPmV4dF9waHlfYWRkciwgTUlJX0JNQ1IsICZyZWdfdmFsKTsKKwkJYW1kODExMWVfcmVhZF9waHkobHAsIGxwLT5leHRfcGh5X2FkZHIsIE1JSV9CTVNSLCAmcmVnX3ZhbCk7CisJCWFtZDgxMTFlX3JlYWRfcGh5KGxwLCBscC0+ZXh0X3BoeV9hZGRyLCBNSUlfQURWRVJUSVNFLCAmcmVnX3ZhbCk7CisJCWFtZDgxMTFlX3JlYWRfcGh5KGxwLCBscC0+ZXh0X3BoeV9hZGRyLCBNSUlfTFBBLCAmcmVnX3ZhbCk7CisJCXN0YXR1cyA9IHJlYWRsKGxwLT5tbWlvICsgU1RBVDApOworCisJCWlmIChzdGF0dXMgJiBMSU5LX1NUQVRTKSB7CisJCQlscC0+bGluayA9IDE7CisJCQlzcGVlZCA9IChzdGF0dXMgJiBTUEVFRF9NQVNLKSA+PiA3OworCQkJaWYgKHNwZWVkID09IFBIWV9TUEVFRF8xMDApCisJCQkJbHAtPnNwZWVkID0gMTsKKwkJCWVsc2UKKwkJCQlscC0+c3BlZWQgPSAwOworCQkJaWYgKHN0YXR1cyAmIEZVTExfRFBMWCkKKwkJCQlscC0+ZHVwbGV4ID0gMTsKKwkJCWVsc2UKKwkJCQlscC0+ZHVwbGV4ID0gMDsKKworCQkJcHJpbnRmKCJMaW5rIGlzIHVwOiAlcyBNYnBzICVzIGR1cGxleFxuIiwKKwkJCQlscC0+c3BlZWQgPyAiMTAwIiA6ICIxMCIsIGxwLT5kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gcmVhZGwobHAtPm1taW8gKyBTVEFUMCk7CisJCWlmICghKHN0YXR1cyAmIExJTktfU1RBVFMpKSB7CisJCQlscC0+bGluayA9IDA7CisJCQlwcmludGYoIkxpbmsgaXMgZG93blxuIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3Jlc3RhcnQoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwKQoreworCXByaW50ZigiXG5TdGFydGluZyBuaWMuLi5cbiIpOworCWFtZDgxMTFlX2Rpc2FibGVfaW50ZXJydXB0KGxwKTsKKwlhbWQ4MTExZV9pbml0X2h3X2RlZmF1bHQobHApOworCWFtZDgxMTFlX3Byb2JlX2V4dF9waHkobHApOworCWFtZDgxMTFlX2dldF9tYWNfYWRkcmVzcyhscCk7CisJYW1kODExMWVfc3RhcnQobHApOworCisJcHJpbnRmKCJXYWl0aW5nIGxpbmsgdXAuLi5cbiIpOworCWxwLT5saW5rID0gMDsKKwlhbWQ4MTExZV93YWl0X2xpbmsobHApOworCWFtZDgxMTFlX3BvbGxfbGluayhscCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCUludGVyZmFjZSBGdW5jdGlvbnMJCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZHN0X2FkZHIsCisJCXVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqcGFja2V0KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5pYy0+cHJpdl9kYXRhOworCXN0cnVjdCBldGhfZnJhbWUgKmZyYW1lOworCXVuc2lnbmVkIGludCBpbmRleDsKKworCS8qIGNoZWNrIHBhY2tldCBzaXplICovCisJaWYgKHNpemUgPiBUWF9QS1RfTEVOX01BWCkgeworCQlwcmludGYoImFtZDgxMTFlX3RyYW5zbWl0KCk6IHRvbyBsYXJnZSBwYWNrZXQsIGRyb3BcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogZ2V0IHR4IHNsb3QgKi8KKwlpbmRleCA9IGxwLT50eF9pZHg7CisJaWYgKGFtZDgxMTFlX3dhaXRfdHhfcmluZyhscCwgaW5kZXgpKQorCQlyZXR1cm47CisKKwkvKiBmaWxsIGZyYW1lICovCisJZnJhbWUgPSAoc3RydWN0IGV0aF9mcmFtZSAqKWxwLT50eF9idWZbaW5kZXhdOworCW1lbXNldChmcmFtZS0+ZGF0YSwgMCwgVFhfUEtUX0xFTl9NQVgpOworCW1lbWNweShmcmFtZS0+ZHN0X2FkZHIsIGRzdF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGZyYW1lLT5zcmNfYWRkciwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKwlmcmFtZS0+dHlwZSA9IGh0b25zKHR5cGUpOworCW1lbWNweShmcmFtZS0+ZGF0YSwgcGFja2V0LCBzaXplKTsKKworCS8qIHN0YXJ0IHhtaXQgKi8KKwlscC0+dHhfcmluZ1tpbmRleF0uYnVmX2xlbiA9IGNwdV90b19sZTE2KEVUSF9ITEVOICsgc2l6ZSk7CisJbHAtPnR4X3JpbmdbaW5kZXhdLmJ1Zl9waHlfYWRkciA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKGZyYW1lKSk7CisJd21iKCk7CisJbHAtPnR4X3JpbmdbaW5kZXhdLnR4X2ZsYWdzID0gCisJCWNwdV90b19sZTE2KE9XTl9CSVQgfCBTVFBfQklUIHwgRU5QX0JJVCB8IEFERF9GQ1NfQklUIHwgTFRJTlRfQklUKTsKKwl3cml0ZWwoVkFMMSB8IFRETUQwLCBscC0+bW1pbyArIENNRDApOworCXJlYWRsKGxwLT5tbWlvICsgQ01EMCk7CisKKwkvKiB1cGRhdGUgc2xvdCBwb2ludGVyICovCisJbHAtPnR4X2lkeCA9IChscC0+dHhfaWR4ICsgMSkgJiBUWF9TTE9UU19NQVNLOworfQorCitzdGF0aWMgaW50IGFtZDgxMTFlX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5pYy0+cHJpdl9kYXRhOworCXUxNiBzdGF0dXMsIHBrdF9sZW47CisJdW5zaWduZWQgaW50IGluZGV4LCBwa3Rfb2s7CisKKwlhbWQ4MTExZV9wb2xsX2xpbmsobHApOworCisJaW5kZXggPSBscC0+cnhfaWR4OworCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW2luZGV4XS5yeF9mbGFncyk7CisJcGt0X2xlbiA9IGxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW2luZGV4XS5tc2dfbGVuKSAtIDQ7CS8qIHJlbW92ZSA0Ynl0ZXMgRkNTICovCisJCisJaWYgKHN0YXR1cyAmIE9XTl9CSVQpCisJCXJldHVybiAwOworCisJaWYgKHN0YXR1cyAmIEVSUl9CSVQpCisJCXBrdF9vayA9IDA7CisJZWxzZSBpZiAoIShzdGF0dXMgJiBTVFBfQklUKSkKKwkJcGt0X29rID0gMDsKKwllbHNlIGlmICghKHN0YXR1cyAmIEVOUF9CSVQpKQorCQlwa3Rfb2sgPSAwOworCWVsc2UgaWYgKHBrdF9sZW4gPCBSWF9QS1RfTEVOX01JTikKKwkJcGt0X29rID0gMDsKKwllbHNlIGlmIChwa3RfbGVuID4gUlhfUEtUX0xFTl9NQVgpCisJCXBrdF9vayA9IDA7CisJZWxzZQorCQlwa3Rfb2sgPSAxOworCisJaWYgKHBrdF9vaykgeworCQlpZiAoIXJldHJpZXZlKQorCQkJcmV0dXJuIDE7CisJCW5pYy0+cGFja2V0bGVuID0gcGt0X2xlbjsKKwkJbWVtY3B5KG5pYy0+cGFja2V0LCBscC0+cnhfYnVmW2luZGV4XSwgbmljLT5wYWNrZXRsZW4pOworCX0KKworCWxwLT5yeF9yaW5nW2luZGV4XS5idWZfcGh5X2FkZHIgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhscC0+cnhfYnVmW2luZGV4XSkpOworCWxwLT5yeF9yaW5nW2luZGV4XS5idWZfbGVuID0gY3B1X3RvX2xlMTYoUlhfQlVGX0xFTik7CisJd21iKCk7CisJbHAtPnJ4X3JpbmdbaW5kZXhdLnJ4X2ZsYWdzID0gY3B1X3RvX2xlMTYoT1dOX0JJVCk7CisJd3JpdGVsKFZBTDIgfCBSRE1EMCwgbHAtPm1taW8gKyBDTUQwKTsKKwlyZWFkbChscC0+bW1pbyArIENNRDApOworCisJbHAtPnJ4X2lkeCA9IChscC0+cnhfaWR4ICsgMSkgJiBSWF9TTE9UU19NQVNLOworCXJldHVybiBwa3Rfb2s7Cit9CisKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5pYy0+cHJpdl9kYXRhOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwlhbWQ4MTExZV9kaXNhYmxlX2ludGVycnVwdChscCk7CisKKwkvKiBzdG9wIGNoaXAgKi8KKwlhbWQ4MTExZV9pbml0X2h3X2RlZmF1bHQobHApOworCisJLyogdW5tYXAgbW1pbyAqLworCWlvdW5tYXAobHAtPm1taW8pOworCisJLyogdXBkYXRlIHN0YXR1cyAqLworCWxwLT5vcGVuZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9pcnEoc3RydWN0IG5pYyAqbmljLCBpcnFfYWN0aW9uX3QgYWN0aW9uKQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5pYy0+cHJpdl9kYXRhOworCQkKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgRElTQUJMRToKKwkJYW1kODExMWVfZGlzYWJsZV9pbnRlcnJ1cHQobHApOworCQlicmVhazsKKwljYXNlIEVOQUJMRToKKwkJYW1kODExMWVfZW5hYmxlX2ludGVycnVwdChscCk7CisJCWJyZWFrOworCWNhc2UgRk9SQ0U6CisJCWFtZDgxMTFlX2ZvcmNlX2ludGVycnVwdChscCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyBhbWQ4MTExZV9vcGVyYXRpb25zID0geworCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKKwkucG9sbAkJPSBhbWQ4MTExZV9wb2xsLAorCS50cmFuc21pdAk9IGFtZDgxMTFlX3RyYW5zbWl0LAorCS5pcnEJCT0gYW1kODExMWVfaXJxLAorfTsKKworc3RhdGljIGludCBhbWQ4MTExZV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9ICZhbWQ4MTExZTsKKwl1bnNpZ25lZCBsb25nIG1taW9fc3RhcnQsIG1taW9fbGVuOworCisgICAgICAgIG5pYy0+aW9hZGRyID0gcGRldi0+aW9hZGRyOworICAgICAgICBuaWMtPmlycW5vICA9IHBkZXYtPmlycTsKKwkKKwltbWlvX3N0YXJ0ID0gcGNpX2Jhcl9zdGFydChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzApOworCW1taW9fbGVuID0gcGNpX2Jhcl9zaXplKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCk7CisKKwltZW1zZXQobHAsIDAsIHNpemVvZigqbHApKTsKKwlscC0+cGRldiA9IHBkZXY7CisJbHAtPm5pYyA9IG5pYzsKKwlscC0+bW1pbyA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCWxwLT5vcGVuZWQgPSAxOworCWFkanVzdF9wY2lfZGV2aWNlKHBkZXYpOworCisJbmljLT5wcml2X2RhdGEgPSBscDsKKworCWFtZDgxMTFlX3Jlc3RhcnQobHApOworCisJbmljLT5uaWNfb3AJPSAmYW1kODExMWVfb3BlcmF0aW9uczsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFtZDgxMTFlX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTAyMiwgMHg3NDYyLCAiYW1kODExMWUiLAkiQU1EODExMUUiLCAwKSwKK307CisKK1BDSV9EUklWRVIgKCBhbWQ4MTExZV9kcml2ZXIsIGFtZDgxMTFlX25pY3MsIFBDSV9OT19DTEFTUyApOworCitEUklWRVIgKCAiQU1EODExMUUiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCBhbWQ4MTExZV9kcml2ZXIsCisJIGFtZDgxMTFlX3Byb2JlLCBhbWQ4MTExZV9kaXNhYmxlICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hbWQ4MTExZS5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYW1kODExMWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDAyYTYzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYW1kODExMWUuaApAQCAtMCwwICsxLDYzMSBAQAorLyoKKyAqIEFkdmFuY2VkICBNaWNybyBEZXZpY2VzIEluYy4gQU1EODExMUUgTGludXggTmV0d29yayBEcml2ZXIgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQWR2YW5jZWQgTWljcm8gRGV2aWNlcyAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAKKyAqIFVTQQorCitNb2R1bGUgTmFtZToKKworICAgIGFtZDgxMTFlLmgKKworQWJzdHJhY3Q6CisJCisgCSBBTUQ4MTExIGJhc2VkIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyIGRyaXZlciBkZWZpbml0aW9ucy4gCisKK0Vudmlyb25tZW50OgorICAgIAorCUtlcm5lbCBNb2RlCisKK1JldmlzaW9uIEhpc3Rvcnk6CisgCTMuMC4wCisJICAgSW5pdGlhbCBSZXZpc2lvbi4KKwkzLjAuMQorKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaWZuZGVmIF9BTUQ4MTFFX0gKKyNkZWZpbmUgX0FNRDgxMUVfSAorCisvKiBDb21tYW5kIHN0eWxlIHJlZ2lzdGVyIGFjY2VzcworCitSZWdpc3RlcnMgQ01EMCwgQ01EMiwgQ01EMyxDTUQ3IGFuZCBJTlRFTjAgdXNlcyBhIHdyaXRlIGFjY2VzcyB0ZWNobmlxdWUgY2FsbGVkIGNvbW1hbmQgc3R5bGUgYWNjZXNzLiBJdCBhbGxvd3MgdGhlIHdyaXRlIHRvIHNlbGVjdGVkIGJpdHMgb2YgdGhpcyByZWdpc3RlciB3aXRob3V0IGFsdGVyaW5nIHRoZSBiaXRzIHRoYXQgYXJlIG5vdCBzZWxlY3RlZC4gQ29tbWFuZCBzdHlsZSByZWdpc3RlcnMgYXJlIGRpdmlkZWQgaW50byA0IGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gaW5kZXBlbmRlbnRseS4gSGlnaGVyIG9yZGVyIGJpdCBvZiBlYWNoIGJ5dGUgaXMgdGhlICB2YWx1ZSBiaXQgdGhhdCBzcGVjaWZpZXMgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB3cml0dGVuIGludG8gdGhlIHNlbGVjdGVkIGJpdHMgb2YgcmVnaXN0ZXIuIAorCitlZy4sIGlmIHRoZSB2YWx1ZSAxMDAxMTAxMGIgaXMgd3JpdHRlbiBpbnRvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9mIGEgY29tbWFuZCBzdHlsZSByZWdpc3RlciwgYml0cyAxLDMgYW5kIDQgb2YgdGhlIHJlZ2lzdGVyIHdpbGwgYmUgc2V0IHRvIDEsIGFuZCB0aGUgb3RoZXIgYml0cyB3aWxsIG5vdCBiZSBhbHRlcmVkLiBJZiB0aGUgdmFsdWUgMDAwMTEwMTBiIGlzIHdyaXR0ZW4gaW50byB0aGUgc2FtZSBieXRlLCBiaXRzIDEsMyBhbmQgNCB3aWxsIGJlIGNsZWFyZWQgdG8gMCBhbmQgdGhlIG90aGVyIGJpdHMgd2lsbCBub3QgYmUgYWx0ZXJlZC4KKworKi8KKworLyogIE9mZnNldCBmb3IgTWVtb3J5IE1hcHBlZCBSZWdpc3RlcnMuICovCisvKiAzMiBiaXQgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgIEFTRl9TVEFUCQkweDAwCS8qIEFTRiBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ0hJUElECQkJMHgwNAkvKiBDaGlwIElEIHJlZ3NpdGVyICovCisjZGVmaW5lCU1JQl9EQVRBCQkweDEwCS8qIE1JQiBkYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JQl9BRERSCQkweDE0CS8qIE1JQiBhZGRyZXNzIHJlZ2lzdGVyICovCisjZGVmaW5lIFNUQVQwCQkJMHgzMAkvKiBTdGF0dXMwIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVDAJCQkweDM4CS8qIEludGVycnVwdDAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5URU4wCQkJMHg0MAkvKiBJbnRlcnJ1cHQwICBlbmFibGUgcmVnaXN0ZXIqLworI2RlZmluZSBDTUQwCQkJMHg0OAkvKiBDb21tYW5kMCByZWdpc3RlciAqLworI2RlZmluZSBDTUQyCQkJMHg1MAkvKiBDb21tYW5kMiByZWdpc3RlciAqLworI2RlZmluZSBDTUQzCQkJMHg1NAkvKiBDb21tYW5kMyByZXNpdGVyICovCisjZGVmaW5lIENNRDcJCQkweDY0CS8qIENvbW1hbmQ3IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQ1RSTDEgCQkJMHg2QwkvKiBDb250cm9sMSByZWdpc3RlciAqLworI2RlZmluZSBDVFJMMiAJCQkweDcwCS8qIENvbnRyb2wyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgWE1UX1JJTkdfTElNSVQJCTB4N0MJLyogVHJhbnNtaXQgcmluZyBsaW1pdCByZWdpc3RlciAqLworCisjZGVmaW5lIEFVVE9QT0xMMAkJMHg4OAkvKiBBdXRvLXBvbGwwIHJlZ2lzdGVyICovCisjZGVmaW5lIEFVVE9QT0xMMQkJMHg4QQkvKiBBdXRvLXBvbGwxIHJlZ2lzdGVyICovCisjZGVmaW5lIEFVVE9QT0xMMgkJMHg4QwkvKiBBdXRvLXBvbGwyIHJlZ2lzdGVyICovCisjZGVmaW5lIEFVVE9QT0xMMwkJMHg4RQkvKiBBdXRvLXBvbGwzIHJlZ2lzdGVyICovCisjZGVmaW5lIEFVVE9QT0xMNAkJMHg5MAkvKiBBdXRvLXBvbGw0IHJlZ2lzdGVyICovCisjZGVmaW5lCUFVVE9QT0xMNQkJMHg5MgkvKiBBdXRvLXBvbGw1IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVBfVkFMVUUJCTB4OTgJLyogQXV0by1wb2xsIHZhbHVlIHJlZ2lzdGVyICovCisjZGVmaW5lIERMWV9JTlRfQQkJMHhBOAkvKiBHcm91cCBBIGRlbGF5ZWQgaW50ZXJydXB0IHJlZ2lzdGVyICovCisjZGVmaW5lIERMWV9JTlRfQgkJMHhBQwkvKiBHcm91cCBCIGRlbGF5ZWQgaW50ZXJydXB0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgRkxPV19DT05UUk9MCQkweEM4CS8qIEZsb3cgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBQSFlfQUNDRVNTCQkweEQwCS8qIFBIWSBhY2Nlc3MgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBTVFZBTAkJCTB4RDgJLyogU29mdHdhcmUgdGltZXIgdmFsdWUgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBYTVRfUklOR19CQVNFX0FERFIwCTB4MTAwCS8qIFRyYW5zbWl0IHJpbmcwIGJhc2UgYWRkciByZWdpc3RlciAqLworI2RlZmluZSBYTVRfUklOR19CQVNFX0FERFIxCTB4MTA4CS8qIFRyYW5zbWl0IHJpbmcxIGJhc2UgYWRkciByZWdpc3RlciAqLworI2RlZmluZSBYTVRfUklOR19CQVNFX0FERFIyCTB4MTEwCS8qIFRyYW5zbWl0IHJpbmcyIGJhc2UgYWRkciByZWdpc3RlciAqLworI2RlZmluZSBYTVRfUklOR19CQVNFX0FERFIzCTB4MTE4CS8qIFRyYW5zbWl0IHJpbmcyIGJhc2UgYWRkciByZWdpc3RlciAqLworCisjZGVmaW5lIFJDVl9SSU5HX0JBU0VfQUREUjAJMHgxMjAJLyogVHJhbnNtaXQgcmluZzAgYmFzZSBhZGRyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgUE1BVDAJCQkweDE5MAkvKiBPbk5vdyBwYXR0ZXJuIHJlZ2lzdGVyMCAqLworI2RlZmluZSBQTUFUMQkJCTB4MTk0CS8qIE9uTm93IHBhdHRlcm4gcmVnaXN0ZXIxICovCisKKy8qIDE2Yml0IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFhNVF9SSU5HX0xFTjAJCTB4MTQwCS8qIFRyYW5zbWl0IFJpbmcwIGxlbmd0aCByZWdpc3RlciAqLworI2RlZmluZSBYTVRfUklOR19MRU4xCQkweDE0NAkvKiBUcmFuc21pdCBSaW5nMSBsZW5ndGggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1UX1JJTkdfTEVOMgkJMHgxNDggCS8qIFRyYW5zbWl0IFJpbmcyIGxlbmd0aCByZWdpc3RlciAqLworI2RlZmluZSBYTVRfUklOR19MRU4zCQkweDE0QwkvKiBUcmFuc21pdCBSaW5nMyBsZW5ndGggcmVnaXN0ZXIgKi8KKworI2RlZmluZSBSQ1ZfUklOR19MRU4wCQkweDE1MAkvKiBSZWNlaXZlIFJpbmcwIGxlbmd0aCByZWdpc3RlciAqLworCisjZGVmaW5lIFNSQU1fU0laRQkJMHgxNzgJLyogU1JBTSBzaXplIHJlZ2lzdGVyICovCisjZGVmaW5lIFNSQU1fQk9VTkRBUlkJCTB4MTdBCS8qIFNSQU0gYm91bmRhcnkgcmVnaXN0ZXIgKi8KKworLyogNDhiaXQgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBQQURSCQkJMHgxNjAJLyogUGh5c2ljYWwgYWRkcmVzcyByZWdpc3RlciAqLworCisjZGVmaW5lIElGUzEJCQkweDE4QwkvKiBJbnRlci1mcmFtZSBzcGFjaW5nIFBhcnQxIHJlZ2lzdGVyICovCisjZGVmaW5lIElGUwkJCTB4MThECS8qIEludGVyLWZyYW1lIHNwYWNpbmcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVBHCQkJMHgxOEUJLyogSW50ZXItZnJhbWUgZ2FwIHJlZ2lzdGVyICovCisvKiA2NGJpdCByZWdpc3RlciAqLworCisjZGVmaW5lIExBRFJGCQkJMHgxNjgJLyogTG9naWNhbCBhZGRyZXNzIGZpbHRlciByZWdpc3RlciAqLworCisKKy8qIFJlZ2lzdGVyIEJpdCBEZWZpbml0aW9ucyAqLwordHlwZWRlZiBlbnVtIHsKKworCUFTRl9JTklUX0RPTkUJCT0gKDEgPDwgMSksCisJQVNGX0lOSVRfUFJFU0VOVAk9ICgxIDw8IDApLAorCit9U1RBVF9BU0ZfQklUUzsgCisgICAKK3R5cGVkZWYgZW51bSB7CisKKwlNSUJfQ01EX0FDVElWRQkJPSAoMSA8PCAxNSApLAorCU1JQl9SRF9DTUQJCT0gKDEgPDwgMTMgKSwKKwlNSUJfQ0xFQVIJCT0gKDEgPDwgMTIgKSwKKwlNSUJfQUREUkVTUwkJPSAoMSA8PCAwKSB8ICgxIDw8IDEpIHwgKDEgPDwgMikgfCAoMSA8PCAzKXwKKwkJCQkJKDEgPDwgNCkgfCAoMSA8PCA1KSwKK31NSUJfQUREUl9CSVRTOworCisKK3R5cGVkZWYgZW51bSB7CisJCisJUE1BVF9ERVQJCT0gKDEgPDwgMTIpLAorCU1QX0RFVAkJICAgICAgICA9ICgxIDw8IDExKSwKKwlMQ19ERVQJCQk9ICgxIDw8IDEwKSwKKwlTUEVFRF9NQVNLCQk9ICgxIDw8IDkpfCgxIDw8IDgpfCgxIDw8IDcpLAorCUZVTExfRFBMWAkJPSAoMSA8PCA2KSwKKwlMSU5LX1NUQVRTCQk9ICgxIDw8IDUpLAorCUFVVE9ORUdfQ09NUExFVEUJPSAoMSA8PCA0KSwKKwlNSUlQRAkJCT0gKDEgPDwgMyksCisJUlhfU1VTUEVOREVECQk9ICgxIDw8IDIpLAorCVRYX1NVU1BFTkRFRAkJPSAoMSA8PCAxKSwKKwlSVU5OSU5HCQkJPSAoMSA8PCAwKSwKKworfVNUQVQwX0JJVFM7CisKKyNkZWZpbmUgUEhZX1NQRUVEXzEwCQkweDIKKyNkZWZpbmUgUEhZX1NQRUVEXzEwMAkJMHgzCisKKy8qIElOVDAJCQkJMHgzOCwgMzJiaXQgcmVnaXN0ZXIgKi8KK3R5cGVkZWYgZW51bSB7CisKKwlJTlRSCQkJPSAoMSA8PCAzMSksCisJUENTSU5UCQkJPSAoMSA8PCAyOCksIAorCUxDSU5UCQkJPSAoMSA8PCAyNyksCisJQVBJTlQ1CQkJPSAoMSA8PCAyNiksCisJQVBJTlQ0CQkJPSAoMSA8PCAyNSksCisJQVBJTlQzCQkJPSAoMSA8PCAyNCksCisJVElOVF9TVU0JCT0gKDEgPDwgMjMpLAorCUFQSU5UMgkJCT0gKDEgPDwgMjIpLAorCUFQSU5UMQkJCT0gKDEgPDwgMjEpLAorCUFQSU5UMAkJCT0gKDEgPDwgMjApLAorCU1JSVBEVElOVAkJPSAoMSA8PCAxOSksCisJTUNDSU5UCQkJPSAoMSA8PCAxNyksCisJTVJFSU5UCQkJPSAoMSA8PCAxNiksCisJUklOVF9TVU0JCT0gKDEgPDwgMTUpLAorCVNQTkRJTlQJCQk9ICgxIDw8IDE0KSwKKwlNUElOVAkJCT0gKDEgPDwgMTMpLAorCVNJTlQJCQk9ICgxIDw8IDEyKSwKKwlUSU5UMwkJCT0gKDEgPDwgMTEpLAorCVRJTlQyCQkJPSAoMSA8PCAxMCksCisJVElOVDEJCQk9ICgxIDw8IDkpLAorCVRJTlQwCQkJPSAoMSA8PCA4KSwKKwlVSU5UCQkJPSAoMSA8PCA3KSwKKwlTVElOVAkJCT0gKDEgPDwgNCksCisJUklOVDAJCQk9ICgxIDw8IDApLAorCit9SU5UMF9CSVRTOworCit0eXBlZGVmIGVudW0geworCisJVkFMMwkJCT0gKDEgPDwgMzEpLCAgIC8qIFZBTCBiaXQgZm9yIGJ5dGUgMyAqLworCVZBTDIJCQk9ICgxIDw8IDIzKSwgICAvKiBWQUwgYml0IGZvciBieXRlIDIgKi8KKwlWQUwxCQkJPSAoMSA8PCAxNSksICAgLyogVkFMIGJpdCBmb3IgYnl0ZSAxICovCisJVkFMMAkJCT0gKDEgPDwgNyksICAgIC8qIFZBTCBiaXQgZm9yIGJ5dGUgMCAqLworCit9VkFMX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisKKwkvKiBWQUwzICovCisJTENJTlRFTgkJCT0gKDEgPDwgMjcpLAorCUFQSU5UNUVOCQk9ICgxIDw8IDI2KSwKKwlBUElOVDRFTgkJPSAoMSA8PCAyNSksCisJQVBJTlQzRU4JCT0gKDEgPDwgMjQpLAorCS8qIFZBTDIgKi8KKwlBUElOVDJFTgkJPSAoMSA8PCAyMiksCisJQVBJTlQxRU4JCT0gKDEgPDwgMjEpLAorCUFQSU5UMEVOCQk9ICgxIDw8IDIwKSwKKwlNSUlQRFRJTlRFTgkJPSAoMSA8PCAxOSksCisJTUNDSUlOVEVOCQk9ICgxIDw8IDE4KSwKKwlNQ0NJTlRFTgkJPSAoMSA8PCAxNyksCisJTVJFSU5URU4JCT0gKDEgPDwgMTYpLAorCS8qIFZBTDEgKi8KKwlTUE5ESU5URU4JCT0gKDEgPDwgMTQpLAorCU1QSU5URU4JCQk9ICgxIDw8IDEzKSwKKwlUSU5URU4zCQkJPSAoMSA8PCAxMSksCisJU0lOVEVOCQkJPSAoMSA8PCAxMiksCisJVElOVEVOMgkJCT0gKDEgPDwgMTApLAorCVRJTlRFTjEJCQk9ICgxIDw8IDkpLAorCVRJTlRFTjAJCQk9ICgxIDw8IDgpLAorCS8qIFZBTDAgKi8KKwlTVElOVEVOCQkJPSAoMSA8PCA0KSwKKwlSSU5URU4wCQkJPSAoMSA8PCAwKSwKKworCUlOVEVOMF9DTEVBUiAJCT0gMHgxRjdGN0YxRiwgLyogQ29tbWFuZCBzdHlsZSByZWdpc3RlciAqLworCit9SU5URU4wX0JJVFM7CQkKKwordHlwZWRlZiBlbnVtIHsKKwkvKiBWQUwyICovCisJUkRNRDAJCQk9ICgxIDw8IDE2KSwKKwkvKiBWQUwxICovCisJVERNRDMJCQk9ICgxIDw8IDExKSwKKwlURE1EMgkJCT0gKDEgPDwgMTApLAorCVRETUQxCQkJPSAoMSA8PCA5KSwKKwlURE1EMAkJCT0gKDEgPDwgOCksCisJLyogVkFMMCAqLworCVVJTlRDTUQJCQk9ICgxIDw8IDYpLAorCVJYX0ZBU1RfU1BORAkJPSAoMSA8PCA1KSwKKwlUWF9GQVNUX1NQTkQJCT0gKDEgPDwgNCksCisJUlhfU1BORAkJCT0gKDEgPDwgMyksCisJVFhfU1BORAkJCT0gKDEgPDwgMiksCisJSU5UUkVOCQkJPSAoMSA8PCAxKSwKKwlSVU4JCQk9ICgxIDw8IDApLAorCisJQ01EMF9DTEVBUiAJCT0gMHgwMDBGMEY3RiwgICAvKiBDb21tYW5kIHN0eWxlIHJlZ2lzdGVyICovCQorCit9Q01EMF9CSVRTOworCit0eXBlZGVmIGVudW0geworCisJLyogVkFMMyAqLworCUNPTkRVSVRfTU9ERQkJPSAoMSA8PCAyOSksCisJLyogVkFMMiAqLworCVJQQQkJCT0gKDEgPDwgMTkpLAorCURSQ1ZQQQkJCT0gKDEgPDwgMTgpLAorCURSQ1ZCQwkJCT0gKDEgPDwgMTcpLAorCVBST00JCQk9ICgxIDw8IDE2KSwKKwkvKiBWQUwxICovCisJQVNUUlBfUkNWCQk9ICgxIDw8IDEzKSwKKwlSQ1ZfRFJPUDAJICAJPSAoMSA8PCAxMiksCisJRU1CQQkJCT0gKDEgPDwgMTEpLAorCURYTVQyUEQJCQk9ICgxIDw8IDEwKSwKKwlMVElOVEVOCQkJPSAoMSA8PCA5KSwKKwlEWE1URkNTCQkJPSAoMSA8PCA4KSwKKwkvKiBWQUwwICovCisJQVBBRF9YTVQJCT0gKDEgPDwgNiksCisJRFJUWQkJCT0gKDEgPDwgNSksCisJSU5MT09QCQkJPSAoMSA8PCA0KSwKKwlFWExPT1AJCQk9ICgxIDw8IDMpLAorCVJFWF9SVFJZCQk9ICgxIDw8IDIpLAorCVJFWF9VRkxPCQk9ICgxIDw8IDEpLAorCVJFWF9MQ09MCQk9ICgxIDw8IDApLAorCisJQ01EMl9DTEVBUiAJCT0gMHgzRjdGM0Y3RiwgICAvKiBDb21tYW5kIHN0eWxlIHJlZ2lzdGVyICovCisKK31DTUQyX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisKKwkvKiBWQUwzICovCisJQVNGX0lOSVRfRE9ORV9BTElBUwk9ICgxIDw8IDI5KSwKKwkvKiBWQUwyICovCisJSlVNQk8JCQk9ICgxIDw8IDIxKSwKKwlWU0laRQkJCT0gKDEgPDwgMjApLAkKKwlWTE9OTFkJCQk9ICgxIDw8IDE5KSwKKwlWTF9UQUdfREVMCQk9ICgxIDw8IDE4KSwJCisJLyogVkFMMSAqLworCUVOX1BNR1IJCQk9ICgxIDw8IDE0KSwJCQkKKwlJTlRMRVZFTAkJPSAoMSA8PCAxMyksCisJRk9SQ0VfRlVMTF9EVVBMRVgJPSAoMSA8PCAxMiksCQorCUZPUkNFX0xJTktfU1RBVFVTCT0gKDEgPDwgMTEpLAkKKwlBUEVQCQkJPSAoMSA8PCAxMCksCQorCU1QUExCQQkJCT0gKDEgPDwgOSksCQorCS8qIFZBTDAgKi8KKwlSRVNFVF9QSFlfUFVMU0UJCT0gKDEgPDwgMiksCQorCVJFU0VUX1BIWQkJPSAoMSA8PCAxKSwJCisJUEhZX1JTVF9QT0wJCT0gKDEgPDwgMCksCQorCit9Q01EM19CSVRTOworCisKK3R5cGVkZWYgZW51bSB7CisKKwkvKiBWQUwwICovCisJUE1BVF9TQVZFX01BVENICQk9ICgxIDw8IDQpLAorCVBNQVRfTU9ERQkJPSAoMSA8PCAzKSwKKwlNUEVOX1NXCQkJPSAoMSA8PCAxKSwKKwlMQ01PREVfU1cJCT0gKDEgPDwgMCksCisKKwlDTUQ3X0NMRUFSICAJCT0gMHgwMDAwMDAxQgkvKiBDb21tYW5kIHN0eWxlIHJlZ2lzdGVyICovCisKK31DTUQ3X0JJVFM7CisKKwordHlwZWRlZiBlbnVtIHsKKworCVJFU0VUX1BIWV9XSURUSAkJPSAoMHhGIDw8IDE2KSB8ICgweEY8PCAyMCksIC8qIDB4MDBGRjAwMDAgKi8KKwlYTVRTUF9NQVNLCQk9ICgxIDw8IDkpIHwgKDEgPDwgOCksCS8qIDk6OCAqLworCVhNVFNQXzEyOAkJPSAoMSA8PCA5KSwJLyogOSAqLwkKKwlYTVRTUF82NAkJPSAoMSA8PCA4KSwKKwlDQUNIRV9BTElHTgkJPSAoMSA8PCA0KSwKKwlCVVJTVF9MSU1JVF9NQVNLCT0gKDB4RiA8PCAwICksCisJQ1RSTDFfREVGQVVMVAkJPSAweDAwMDEwMTExLAorCit9Q1RSTDFfQklUUzsKKwordHlwZWRlZiBlbnVtIHsKKworCUZNRENfTUFTSwkJPSAoMSA8PCA5KXwoMSA8PCA4KSwJLyogOTo4ICovCisJWFBIWVJTVAkJCT0gKDEgPDwgNyksCisJWFBIWUFORQkJCT0gKDEgPDwgNiksCisJWFBIWUZECQkJPSAoMSA8PCA1KSwKKwlYUEhZU1AJCQk9ICgxIDw8IDQpIHwgKDEgPDwgMyksCS8qIDQ6MyAqLworCUFQRFdfTUFTSwkJPSAoMSA8PAkyKSB8ICgxIDw8IDEpIHwgKDEgPDwgMCksIC8qIDI6MCAqLworCit9Q1RSTDJfQklUUzsKKworLyogWE1UX1JJTkdfTElNSVQJCTB4N0MsIDMyYml0IHJlZ2lzdGVyICovCit0eXBlZGVmIGVudW0geworCisJWE1UX1JJTkcyX0xJTUlUCQk9ICgweEZGIDw8IDE2KSwJLyogMjM6MTYgKi8KKwlYTVRfUklORzFfTElNSVQJCT0gKDB4RkYgPDwgOCksCS8qIDE1OjggKi8KKwlYTVRfUklORzBfTElNSVQJCT0gKDB4RkYgPDwgMCksIAkvKiA3OjAgKi8KKworfVhNVF9SSU5HX0xJTUlUX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisKKwlBUF9SRUcwX0VOCQk9ICgxIDw8IDE1KSwKKwlBUF9SRUcwX0FERFJfTUFTSwk9ICgweEYgPDwgOCkgfCgxIDw8IDEyKSwvKiAxMjo4ICovCisJQVBfUEhZMF9BRERSX01BU0sJPSAoMHhGIDw8IDApIHwoMSA8PCA0KSwvKiA0OjAgKi8KKworfUFVVE9QT0xMMF9CSVRTOworCisvKiBBVVRPUE9MTDEJCQkweDhBLCAxNmJpdCByZWdpc3RlciAqLwordHlwZWRlZiBlbnVtIHsKKworCUFQX1JFRzFfRU4JCT0gKDEgPDwgMTUpLAorCUFQX1JFRzFfQUREUl9NQVNLCT0gKDB4RiA8PCA4KSB8KDEgPDwgMTIpLC8qIDEyOjggKi8KKwlBUF9QUkVfU1VQMQkJPSAoMSA8PCA2KSwKKwlBUF9QSFkxX0RGTFQJCT0gKDEgPDwgNSksCisJQVBfUEhZMV9BRERSX01BU0sJPSAoMHhGIDw8IDApIHwoMSA8PCA0KSwvKiA0OjAgKi8KKworfUFVVE9QT0xMMV9CSVRTOworCisKK3R5cGVkZWYgZW51bSB7CisKKwlBUF9SRUcyX0VOCQk9ICgxIDw8IDE1KSwKKwlBUF9SRUcyX0FERFJfTUFTSwk9ICgweEYgPDwgOCkgfCgxIDw8IDEyKSwvKiAxMjo4ICovCisJQVBfUFJFX1NVUDIJCT0gKDEgPDwgNiksCisJQVBfUEhZMl9ERkxUCQk9ICgxIDw8IDUpLAorCUFQX1BIWTJfQUREUl9NQVNLCT0gKDB4RiA8PCAwKSB8KDEgPDwgNCksLyogNDowICovCisKK31BVVRPUE9MTDJfQklUUzsKKwordHlwZWRlZiBlbnVtIHsKKworCUFQX1JFRzNfRU4JCT0gKDEgPDwgMTUpLAorCUFQX1JFRzNfQUREUl9NQVNLCT0gKDB4RiA8PCA4KSB8KDEgPDwgMTIpLC8qIDEyOjggKi8KKwlBUF9QUkVfU1VQMwkJPSAoMSA8PCA2KSwKKwlBUF9QSFkzX0RGTFQJCT0gKDEgPDwgNSksCisJQVBfUEhZM19BRERSX01BU0sJPSAoMHhGIDw8IDApIHwoMSA8PCA0KSwvKiA0OjAgKi8KKworfUFVVE9QT0xMM19CSVRTOworCisKK3R5cGVkZWYgZW51bSB7CisKKwlBUF9SRUc0X0VOCQk9ICgxIDw8IDE1KSwKKwlBUF9SRUc0X0FERFJfTUFTSwk9ICgweEYgPDwgOCkgfCgxIDw8IDEyKSwvKiAxMjo4ICovCisJQVBfUFJFX1NVUDQJCT0gKDEgPDwgNiksCisJQVBfUEhZNF9ERkxUCQk9ICgxIDw8IDUpLAorCUFQX1BIWTRfQUREUl9NQVNLCT0gKDB4RiA8PCAwKSB8KDEgPDwgNCksLyogNDowICovCisKK31BVVRPUE9MTDRfQklUUzsKKworCit0eXBlZGVmIGVudW0geworCisJQVBfUkVHNV9FTgkJPSAoMSA8PCAxNSksCisJQVBfUkVHNV9BRERSX01BU0sJPSAoMHhGIDw8IDgpIHwoMSA8PCAxMiksLyogMTI6OCAqLworCUFQX1BSRV9TVVA1CQk9ICgxIDw8IDYpLAorCUFQX1BIWTVfREZMVAkJPSAoMSA8PCA1KSwKKwlBUF9QSFk1X0FERFJfTUFTSwk9ICgweEYgPDwgMCkgfCgxIDw8IDQpLC8qIDQ6MCAqLworCit9QVVUT1BPTEw1X0JJVFM7CisKKworCisKKy8qIEFQX1ZBTFVFIAkJCTB4OTgsIDMyYml0IHJhZ2lzdGVyICovCit0eXBlZGVmIGVudW0geworCisJQVBfVkFMX0FDVElWRQkJPSAoMSA8PCAzMSksCisJQVBfVkFMX1JEX0NNRAkJPSAoIDEgPDwgMjkpLAorCUFQX0FERFIJCQk9ICgxIDw8IDE4KXwoMSA8PCAxNyl8KDEgPDwgMTYpLCAvKiAxODoxNiAqLworCUFQX1ZBTAkJCT0gKDB4RiA8PCAwKSB8ICgweEYgPDwgNCkgfCggMHhGIDw8IDgpIHwKKwkJCQkgICgweEYgPDwgMTIpLAkvKiAxNTowICovCisKK31BUF9WQUxVRV9CSVRTOworCit0eXBlZGVmIGVudW0geworCisJRExZX0lOVF9BX1IzCQk9ICgxIDw8IDMxKSwKKwlETFlfSU5UX0FfUjIJCT0gKDEgPDwgMzApLAorCURMWV9JTlRfQV9SMQkJPSAoMSA8PCAyOSksCisJRExZX0lOVF9BX1IwCQk9ICgxIDw8IDI4KSwKKwlETFlfSU5UX0FfVDMJCT0gKDEgPDwgMjcpLAorCURMWV9JTlRfQV9UMgkJPSAoMSA8PCAyNiksCisJRExZX0lOVF9BX1QxCQk9ICgxIDw8IDI1KSwKKwlETFlfSU5UX0FfVDAJCT0gKCAxIDw8IDI0KSwKKwlFVkVOVF9DT1VOVF9BCQk9ICgweEYgPDwgMTYpIHwgKDB4MSA8PCAyMCksLyogMjA6MTYgKi8KKwlNQVhfREVMQVlfVElNRV9BCT0gKDB4RiA8PCAwKSB8ICgweEYgPDwgNCkgfCAoMSA8PCA4KXwKKwkJCQkgICgxIDw8IDkpIHwgKDEgPDwgMTApLAkvKiAxMDowICovCisKK31ETFlfSU5UX0FfQklUUzsKKwordHlwZWRlZiBlbnVtIHsKKworCURMWV9JTlRfQl9SMwkJPSAoMSA8PCAzMSksCisJRExZX0lOVF9CX1IyCQk9ICgxIDw8IDMwKSwKKwlETFlfSU5UX0JfUjEJCT0gKDEgPDwgMjkpLAorCURMWV9JTlRfQl9SMAkJPSAoMSA8PCAyOCksCisJRExZX0lOVF9CX1QzCQk9ICgxIDw8IDI3KSwKKwlETFlfSU5UX0JfVDIJCT0gKDEgPDwgMjYpLAorCURMWV9JTlRfQl9UMQkJPSAoMSA8PCAyNSksCisJRExZX0lOVF9CX1QwCQk9ICggMSA8PCAyNCksCisJRVZFTlRfQ09VTlRfQgkJPSAoMHhGIDw8IDE2KSB8ICgweDEgPDwgMjApLC8qIDIwOjE2ICovCisJTUFYX0RFTEFZX1RJTUVfQgk9ICgweEYgPDwgMCkgfCAoMHhGIDw8IDQpIHwgKDEgPDwgOCl8IAorCQkJCSAgKDEgPDwgOSkgfCAoMSA8PCAxMCksCS8qIDEwOjAgKi8KK31ETFlfSU5UX0JfQklUUzsKKworCisvKiBGTE9XX0NPTlRST0wgCQkweEM4LCAzMmJpdCByZWdpc3RlciAqLwordHlwZWRlZiBlbnVtIHsKKworCVBBVVNFX0xFTl9DSEcJCT0gKDEgPDwgMzApLAorCUZUUEUJCQk9ICgxIDw8IDIyKSwKKwlGUlBFCQkJPSAoMSA8PCAyMSksCisJTkFQQQkJCT0gKDEgPDwgMjApLAorCU5QQQkJCT0gKDEgPDwgMTkpLAorCUZJWFAJCQk9ICggMSA8PCAxOCksCisJRkNDTUQJCQk9ICggMSA8PCAxNiksCisJUEFVU0VfTEVOCQk9ICgweEYgPDwgMCkgfCAoMHhGIDw8IDQpIHwoIDB4RiA8PCA4KSB8CSAJCQkJICAoMHhGIDw8IDEyKSwJLyogMTU6MCAqLworCit9RkxPV19DT05UUk9MX0JJVFM7CisKKy8qIFBIWV8gQUNDRVNTCQkJMHhEMCwgMzJiaXQgcmVnaXN0ZXIgKi8KK3R5cGVkZWYgZW51bSB7CisKKwlQSFlfQ01EX0FDVElWRQkJPSAoMSA8PCAzMSksCisJUEhZX1dSX0NNRAkJPSAoMSA8PCAzMCksCisJUEhZX1JEX0NNRAkJPSAoMSA8PCAyOSksCisJUEhZX1JEX0VSUgkJPSAoMSA8PCAyOCksCisJUEhZX1BSRV9TVVAJCT0gKDEgPDwgMjcpLAorCVBIWV9BRERSCQk9ICgxIDw8IDIxKSB8ICgxIDw8IDIyKSB8ICgxIDw8IDIzKXwKKwkJCQkgIAkoMSA8PCAyNCkgfCgxIDw8IDI1KSwvKiAyNToyMSAqLworCVBIWV9SRUdfQUREUgkJPSAoMSA8PCAxNikgfCAoMSA8PCAxNykgfCAoMSA8PCAxOCl8CSAJCQkgIAkgICAJICAJKDEgPDwgMTkpIHwgKDEgPDwgMjApLC8qIDIwOjE2ICovCisJUEhZX0RBVEEJCT0gKDB4RiA8PCAwKXwoMHhGIDw8IDQpIHwoMHhGIDw8IDgpfAorCQkJCQkoMHhGIDw8IDEyKSwvKiAxNTowICovCisKK31QSFlfQUNDRVNTX0JJVFM7CisKKworLyogUE1BVDAJCQkweDE5MCwJIDMyYml0IHJlZ2lzdGVyICovCit0eXBlZGVmIGVudW0geworCVBNUl9BQ1RJVkUJCT0gKDEgPDwgMzEpLAorCVBNUl9XUl9DTUQJCT0gKDEgPDwgMzApLAorCVBNUl9SRF9DTUQJCT0gKDEgPDwgMjkpLAorCVBNUl9CQU5LCQk9ICgxIDw8MjgpLAorCVBNUl9BRERSCQk9ICgweEYgPDwgMTYpfCgxIDw8IDIwKXwoMSA8PCAyMSl8CisJCQkJICAJKDEgPDwgMjIpLC8qIDIyOjE2ICovCisJUE1SX0I0CQkJPSAoMHhGIDw8IDApIHwgKDB4RiA8PCA0KSwvKiAxNTowICovCit9UE1BVDBfQklUUzsKKworCisvKiBQTUFUMQkJCTB4MTk0LAkgMzJiaXQgcmVnaXN0ZXIgKi8KK3R5cGVkZWYgZW51bSB7CisJUE1SX0IzCQkJPSAoMHhGIDw8IDI0KSB8ICgweEYgPDwyOCksLyogMzE6MjQgKi8KKwlQTVJfQjIJCQk9ICgweEYgPDwgMTYpIHwoMHhGIDw8IDIwKSwvKiAyMzoxNiAqLworCVBNUl9CMQkJCT0gKDB4RiA8PCA4KSB8ICgweEYgPDwxMiksIC8qIDE1OjggKi8KKwlQTVJfQjAJCQk9ICgweEYgPDwgMCl8KDB4RiA8PCA0KSwvKiA3OjAgKi8KK31QTUFUMV9CSVRTOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIE1JQiBjb3VudGVyIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSByY3ZfbWlzc19wa3RzCQkJCTB4MDAKKyNkZWZpbmUgcmN2X29jdGV0cwkJCQkweDAxCisjZGVmaW5lIHJjdl9icm9hZGNhc3RfcGt0cwkJCTB4MDIKKyNkZWZpbmUgcmN2X211bHRpY2FzdF9wa3RzCQkJMHgwMworI2RlZmluZSByY3ZfdW5kZXJzaXplX3BrdHMJCQkweDA0CisjZGVmaW5lIHJjdl9vdmVyc2l6ZV9wa3RzCQkJMHgwNQorI2RlZmluZSByY3ZfZnJhZ21lbnRzCQkJCTB4MDYKKyNkZWZpbmUgcmN2X2phYmJlcnMJCQkJMHgwNworI2RlZmluZSByY3ZfdW5pY2FzdF9wa3RzCQkJMHgwOAorI2RlZmluZSByY3ZfYWxpZ25tZW50X2Vycm9ycwkJCTB4MDkKKyNkZWZpbmUgcmN2X2Zjc19lcnJvcnMJCQkJMHgwQQorI2RlZmluZSByY3ZfZ29vZF9vY3RldHMJCQkJMHgwQgorI2RlZmluZSByY3ZfbWFjX2N0cmwJCQkJMHgwQworI2RlZmluZSByY3ZfZmxvd19jdHJsCQkJCTB4MEQKKyNkZWZpbmUgcmN2X3BrdHNfNjRfb2N0ZXRzCQkJMHgwRQorI2RlZmluZSByY3ZfcGt0c182NXRvMTI3X29jdGV0cwkJCTB4MEYKKyNkZWZpbmUgcmN2X3BrdHNfMTI4dG8yNTVfb2N0ZXRzCQkweDEwCisjZGVmaW5lIHJjdl9wa3RzXzI1NnRvNTExX29jdGV0cwkJMHgxMQorI2RlZmluZSByY3ZfcGt0c181MTJ0bzEwMjNfb2N0ZXRzCQkweDEyCisjZGVmaW5lIHJjdl9wa3RzXzEwMjR0bzE1MThfb2N0ZXRzCQkweDEzCisjZGVmaW5lIHJjdl91bnN1cHBvcnRlZF9vcGNvZGUJCQkweDE0CisjZGVmaW5lIHJjdl9zeW1ib2xfZXJyb3JzCQkJMHgxNQorI2RlZmluZSByY3ZfZHJvcF9wa3RzX3JpbmcxCQkJMHgxNgorI2RlZmluZSByY3ZfZHJvcF9wa3RzX3JpbmcyCQkJMHgxNworI2RlZmluZSByY3ZfZHJvcF9wa3RzX3JpbmczCQkJMHgxOAorI2RlZmluZSByY3ZfZHJvcF9wa3RzX3Jpbmc0CQkJMHgxOQorI2RlZmluZSByY3ZfanVtYm9fcGt0cwkJCQkweDFBCisKKyNkZWZpbmUgeG10X3VuZGVycnVuX3BrdHMJCQkweDIwCisjZGVmaW5lIHhtdF9vY3RldHMJCQkJMHgyMQorI2RlZmluZSB4bXRfcGFja2V0cwkJCQkweDIyCisjZGVmaW5lIHhtdF9icm9hZGNhc3RfcGt0cwkJCTB4MjMKKyNkZWZpbmUgeG10X211bHRpY2FzdF9wa3RzCQkJMHgyNAorI2RlZmluZSB4bXRfY29sbGlzaW9ucwkJCQkweDI1CisjZGVmaW5lIHhtdF91bmljYXN0X3BrdHMJCQkweDI2CisjZGVmaW5lIHhtdF9vbmVfY29sbGlzaW9uCQkJMHgyNworI2RlZmluZSB4bXRfbXVsdGlwbGVfY29sbGlzaW9uCQkJMHgyOAorI2RlZmluZSB4bXRfZGVmZXJyZWRfdHJhbnNtaXQJCQkweDI5CisjZGVmaW5lIHhtdF9sYXRlX2NvbGxpc2lvbgkJCTB4MkEKKyNkZWZpbmUgeG10X2V4Y2Vzc2l2ZV9kZWZlcgkJCTB4MkIKKyNkZWZpbmUgeG10X2xvc3NfY2FycmllcgkJCTB4MkMKKyNkZWZpbmUgeG10X2V4Y2Vzc2l2ZV9jb2xsaXNpb24JCQkweDJECisjZGVmaW5lIHhtdF9iYWNrX3ByZXNzdXJlCQkJMHgyRQorI2RlZmluZSB4bXRfZmxvd19jdHJsCQkJCTB4MkYKKyNkZWZpbmUgeG10X3BrdHNfNjRfb2N0ZXRzCQkJMHgzMAorI2RlZmluZSB4bXRfcGt0c182NXRvMTI3X29jdGV0cwkJCTB4MzEKKyNkZWZpbmUgeG10X3BrdHNfMTI4dG8yNTVfb2N0ZXRzCQkweDMyCisjZGVmaW5lIHhtdF9wa3RzXzI1NnRvNTExX29jdGV0cwkJMHgzMworI2RlZmluZSB4bXRfcGt0c181MTJ0bzEwMjNfb2N0ZXRzCQkweDM0CisjZGVmaW5lIHhtdF9wa3RzXzEwMjR0bzE1MThfb2N0ZXQJCTB4MzUKKyNkZWZpbmUgeG10X292ZXJzaXplX3BrdHMJCQkweDM2CisjZGVmaW5lIHhtdF9qdW1ib19wa3RzCQkJCTB4MzcKKworLyogaXBnIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgREVGQVVMVF9JUEcJCQkweDYwCisjZGVmaW5lIElGUzFfREVMVEEJCQkzNgorI2RlZmluZQlJUEdfQ09OVkVSR0VfSklGRklFUyAoSFovMikKKyNkZWZpbmUJSVBHX1NUQUJMRV9USU1FCTUKKyNkZWZpbmUJTUlOX0lQRwk5NgorI2RlZmluZQlNQVhfSVBHCTI1NQorI2RlZmluZSBJUEdfU1RFUAkxNgorI2RlZmluZSBDU1RBVEUgIDEgCisjZGVmaW5lIFNTVEFURSAgMiAKKworLyogYW1kODExMWUgZGVjcmlwdG9yIGZsYWcgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgZW51bSB7CisKKwlPV05fQklUCQk9CSgxIDw8IDE1KSwKKwlBRERfRkNTX0JJVAk9CSgxIDw8IDEzKSwKKwlMVElOVF9CSVQJPQkoMSA8PCAxMiksCisJU1RQX0JJVAkJPQkoMSA8PCA5KSwKKwlFTlBfQklUCQk9CSgxIDw8IDgpLAorCUtJTExfQklUCT0gCSgxIDw8IDYpLAorCVRDQ19WTEFOX0lOU0VSVAk9CSgxIDw8IDEpLAorCVRDQ19WTEFOX1JFUExBQ0UgPQkoMSA8PCAxKSB8KCAxPDwgMCksCisKK31UWF9GTEFHX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisJRVJSX0JJVCAJPQkoMSA8PCAxNCksCisJRlJBTV9CSVQJPSAgCSgxIDw8IDEzKSwKKwlPRkxPX0JJVAk9ICAgICAgICgxIDw8IDEyKSwKKwlDUkNfQklUCQk9CSgxIDw8IDExKSwKKwlQQU1fQklUCQk9CSgxIDw8IDYpLAorCUxBRk1fQklUCT0gCSgxIDw8IDUpLAorCUJBTV9CSVQJCT0JKDEgPDwgNCksCisJVFRfVkxBTl9UQUdHRUQJPSAJKDEgPDwgMykgfCgxIDw8IDIpLC8qIDB4MDAwICovCisJVFRfUFJUWV9UQUdHRUQJPQkoMSA8PCAzKSwvKiAweDAwMDggKi8KKworfVJYX0ZMQUdfQklUUzsKKworI2RlZmluZSBSRVNFVF9SWF9GTEFHUwkJMHgwMDAwCisjZGVmaW5lIFRUX01BU0sJCQkweDAwMGMKKyNkZWZpbmUgVENDX01BU0sJCTB4MDAwMworCisvKiBkcml2ZXIgaW9jdGwgcGFyYW1ldGVycyAqLworI2RlZmluZSBBTUQ4MTExRV9SRUdfRFVNUF9MRU4JIDEzKnNpemVvZih1MzIpIAorCisvKiBjcmMgZ2VuZXJhdG9yIGNvbnN0YW50cyAqLworI2RlZmluZSBDUkMzMiAweGVkYjg4MzIwCisjZGVmaW5lIElOSVRDUkMgMHhGRkZGRkZGRgorCisvKiBrZXJuZWwgcHJvdmlkZWQgd3JpdGVxIGRvZXMgbm90IHdyaXRlIDY0IGJpdHMgaW50byB0aGUgYW1kODExMWUgZGV2aWNlIHJlZ2lzdGVyIGluc3RlYWQgd3JpdGVzIG9ubHkgaGlnaGVyIDMyYml0cyBkYXRhIGludG8gbG93ZXIgMzJiaXRzIG9mIHRoZSByZWdpc3Rlci4KK0JVRz8gKi8KKyNkZWZpbmUgIGFtZDgxMTFlX3dyaXRlcShfVWxEYXRhLF9tZW1NYXApICAgXAorCQl3cml0ZWwoKih1MzIqKSgmX1VsRGF0YSksIF9tZW1NYXApOwlcCisJCXdyaXRlbCgqKHUzMiopKCh1OCopKCZfVWxEYXRhKSs0KSwgX21lbU1hcCs0KQkKKworLyogbWFwcyB0aGUgZXh0ZXJuYWwgc3BlZWQgb3B0aW9ucyB0byBpbnRlcm5hbCB2YWx1ZSAqLwordHlwZWRlZiBlbnVtIHsKKwlTUEVFRF9BVVRPTkVHLAorCVNQRUVEMTBfSEFMRiwKKwlTUEVFRDEwX0ZVTEwsCisJU1BFRUQxMDBfSEFMRiwKKwlTUEVFRDEwMF9GVUxMLAorfUVYVF9QSFlfT1BUSU9OOworCisKKyNlbmRpZiAvKiBfQU1EODExMUVfSCAqLworCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1ay5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2RlZmNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWsuYwpAQCAtMCwwICsxLDE3MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBTYW0gTGVmZmxlciwgRXJybm8gQ29uc3VsdGluZworICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA2IERldmljZXNjYXBlIFNvZnR3YXJlLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSmlyaSBTbGFieSA8amlyaXNsYWJ5QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHdpbmxhYi5ydXRnZXJzLmVkdT4KKyAqCisgKiBNb2RpZmllZCBmb3IgZ1BYRSwgSnVseSAyMDA5LCBieSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0PgorICogT3JpZ2luYWwgZnJvbSBMaW51eCBrZXJuZWwgMi42LjMwLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdyAoIkRpc2NsYWltZXIiKSBhbmQgYW55CisgKiAgICByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24gaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseQorICogICAgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBOT05JTkZSSU5HRU1FTlQsIE1FUkNIQU5USUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAqIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggQlNEMyApOworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL3RpbWVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvcGNpX2lvLmg+CisKKyNpbmNsdWRlICJiYXNlLmgiCisjaW5jbHVkZSAicmVnLmgiCisKKyNkZWZpbmUgQVRINUtfQ0FMSUJfSU5URVJWQUwJMTAgLyogQ2FsaWJyYXRlIFBIWSBldmVyeSAxMCBzZWNvbmRzICovCisjZGVmaW5lIEFUSDVLX1JFVFJJRVMJCTQgIC8qIE51bWJlciBvZiB0aW1lcyB0byByZXRyeSBwYWNrZXQgc2VuZHMgKi8KKyNkZWZpbmUgQVRINUtfREVTQ19BTElHTgkxNiAvKiBBbGlnbm1lbnQgZm9yIFRYL1JYIGRlc2NyaXB0b3JzICovCisKKy8qKioqKioqKioqKioqKioqKipcCisqIEludGVybmFsIGRlZmluZXMgKgorXCoqKioqKioqKioqKioqKioqKi8KKworLyogS25vd24gUENJIGlkcyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGF0aDVrX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTY4YywgMHgwMjA3LCAiYXRoNTIxMGUiLCAiQXRoZXJvcyA1MjEwIGVhcmx5IiwgQVI1S19BUjUyMTApLAorCVBDSV9ST00oMHgxNjhjLCAweDAwMDcsICJhdGg1MjEwIiwgIkF0aGVyb3MgNTIxMCIsIEFSNUtfQVI1MjEwKSwKKwlQQ0lfUk9NKDB4MTY4YywgMHgwMDExLCAiYXRoNTMxMSIsICJBdGhlcm9zIDUzMTEgKEFIQikiLCBBUjVLX0FSNTIxMSksCisJUENJX1JPTSgweDE2OGMsIDB4MDAxMiwgImF0aDUyMTEiLCAiQXRoZXJvcyA1MjExIiwgQVI1S19BUjUyMTEpLAorCVBDSV9ST00oMHgxNjhjLCAweDAwMTMsICJhdGg1MjEyIiwgIkF0aGVyb3MgNTIxMiIsIEFSNUtfQVI1MjEyKSwKKwlQQ0lfUk9NKDB4YTcyNywgMHgwMDEzLCAiYXRoNTIxMmMiLCIzY29tIEF0aCA1MjEyIiwgQVI1S19BUjUyMTIpLAorCVBDSV9ST00oMHgxMGI3LCAweDAwMTMsICJyZGFnNjc1IiwgIjNjb20gM0NSREFHNjc1IiwgQVI1S19BUjUyMTIpLAorCVBDSV9ST00oMHgxNjhjLCAweDEwMTQsICJhdGg1MjEybSIsICJBdGggNTIxMiBtaW5pUENJIiwgQVI1S19BUjUyMTIpLAorCVBDSV9ST00oMHgxNjhjLCAweDAwMTQsICJhdGg1MjEyeDE0IiwgIkF0aGVyb3MgNTIxMiB4MTQiLCBBUjVLX0FSNTIxMiksCisJUENJX1JPTSgweDE2OGMsIDB4MDAxNSwgImF0aDUyMTJ4MTUiLCAiQXRoZXJvcyA1MjEyIHgxNSIsIEFSNUtfQVI1MjEyKSwKKwlQQ0lfUk9NKDB4MTY4YywgMHgwMDE2LCAiYXRoNTIxMngxNiIsICJBdGhlcm9zIDUyMTIgeDE2IiwgQVI1S19BUjUyMTIpLAorCVBDSV9ST00oMHgxNjhjLCAweDAwMTcsICJhdGg1MjEyeDE3IiwgIkF0aGVyb3MgNTIxMiB4MTciLCBBUjVLX0FSNTIxMiksCisJUENJX1JPTSgweDE2OGMsIDB4MDAxOCwgImF0aDUyMTJ4MTgiLCAiQXRoZXJvcyA1MjEyIHgxOCIsIEFSNUtfQVI1MjEyKSwKKwlQQ0lfUk9NKDB4MTY4YywgMHgwMDE5LCAiYXRoNTIxMngxOSIsICJBdGhlcm9zIDUyMTIgeDE5IiwgQVI1S19BUjUyMTIpLAorCVBDSV9ST00oMHgxNjhjLCAweDAwMWEsICJhdGgyNDEzIiwgIkF0aGVyb3MgMjQxMyBHcmlmZmluIiwgQVI1S19BUjUyMTIpLAorCVBDSV9ST00oMHgxNjhjLCAweDAwMWIsICJhdGg1NDEzIiwgIkF0aGVyb3MgNTQxMyBFYWdsZSIsIEFSNUtfQVI1MjEyKSwKKwlQQ0lfUk9NKDB4MTY4YywgMHgwMDFjLCAiYXRoNTIxMmUiLCAiQXRoZXJvcyA1MjEyIFBDSS1FIiwgQVI1S19BUjUyMTIpLAorCVBDSV9ST00oMHgxNjhjLCAweDAwMWQsICJhdGgyNDE3IiwgIkF0aGVyb3MgMjQxNyBOYWxhIiwgQVI1S19BUjUyMTIpLAorfTsKKworLyogS25vd24gU1JFVnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfc3Jldl9uYW1lIHNyZXZfbmFtZXNbXSA9IHsKKwl7ICI1MjEwIiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSNTIxMCB9LAorCXsgIjUzMTEiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVI1MzExIH0sCisJeyAiNTMxMUEiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVI1MzExQSB9LAorCXsgIjUzMTFCIiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSNTMxMUIgfSwKKwl7ICI1MjExIiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSNTIxMSB9LAorCXsgIjUyMTIiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVI1MjEyIH0sCisJeyAiNTIxMyIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjUyMTMgfSwKKwl7ICI1MjEzQSIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjUyMTNBIH0sCisJeyAiMjQxMyIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjI0MTMgfSwKKwl7ICIyNDE0IiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSMjQxNCB9LAorCXsgIjU0MjQiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVI1NDI0IH0sCisJeyAiNTQxMyIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjU0MTMgfSwKKwl7ICI1NDE0IiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSNTQxNCB9LAorCXsgIjI0MTUiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVIyNDE1IH0sCisJeyAiNTQxNiIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjU0MTYgfSwKKwl7ICI1NDE4IiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSNTQxOCB9LAorCXsgIjI0MjUiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVIyNDI1IH0sCisJeyAiMjQxNyIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjI0MTcgfSwKKwl7ICJ4eHh4eCIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9VTktOT1dOIH0sCisJeyAiNTExMCIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfNTExMCB9LAorCXsgIjUxMTEiLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEXzUxMTEgfSwKKwl7ICI1MTExQSIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfNTExMUEgfSwKKwl7ICIyMTExIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF8yMTExIH0sCisJeyAiNTExMiIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfNTExMiB9LAorCXsgIjUxMTJBIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF81MTEyQSB9LAorCXsgIjUxMTJCIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF81MTEyQiB9LAorCXsgIjIxMTIiLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEXzIxMTIgfSwKKwl7ICIyMTEyQSIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfMjExMkEgfSwKKwl7ICIyMTEyQiIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfMjExMkIgfSwKKwl7ICIyNDEzIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF8yNDEzIH0sCisJeyAiNTQxMyIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfNTQxMyB9LAorCXsgIjIzMTYiLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEXzIzMTYgfSwKKwl7ICIyMzE3IiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF8yMzE3IH0sCisJeyAiNTQyNCIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfNTQyNCB9LAorCXsgIjUxMzMiLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEXzUxMzMgfSwKKwl7ICJ4eHh4eCIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9VTktOT1dOIH0sCit9OworCisjZGVmaW5lIEFUSDVLX1NQTUJMX05PICAgMQorI2RlZmluZSBBVEg1S19TUE1CTF9ZRVMgIDIKKyNkZWZpbmUgQVRINUtfU1BNQkxfQk9USCAzCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXUxNiBiaXRyYXRlOworCXU4IHNob3J0X3BtYmw7CisJdTggaHdfY29kZTsKK30gYXRoNWtfcmF0ZXNbXSA9IHsKKwl7IDEwLCBBVEg1S19TUE1CTF9CT1RILCBBVEg1S19SQVRFX0NPREVfMU0gfSwKKwl7IDIwLCBBVEg1S19TUE1CTF9OTywgQVRINUtfUkFURV9DT0RFXzJNIH0sCisJeyA1NSwgQVRINUtfU1BNQkxfTk8sIEFUSDVLX1JBVEVfQ09ERV81XzVNIH0sCisJeyAxMTAsIEFUSDVLX1NQTUJMX05PLCBBVEg1S19SQVRFX0NPREVfMTFNIH0sCisJeyA2MCwgQVRINUtfU1BNQkxfQk9USCwgQVRINUtfUkFURV9DT0RFXzZNIH0sCisJeyA5MCwgQVRINUtfU1BNQkxfQk9USCwgQVRINUtfUkFURV9DT0RFXzlNIH0sCisJeyAxMjAsIEFUSDVLX1NQTUJMX0JPVEgsIEFUSDVLX1JBVEVfQ09ERV8xMk0gfSwKKwl7IDE4MCwgQVRINUtfU1BNQkxfQk9USCwgQVRINUtfUkFURV9DT0RFXzE4TSB9LAorCXsgMjQwLCBBVEg1S19TUE1CTF9CT1RILCBBVEg1S19SQVRFX0NPREVfMjRNIH0sCisJeyAzNjAsIEFUSDVLX1NQTUJMX0JPVEgsIEFUSDVLX1JBVEVfQ09ERV8zNk0gfSwKKwl7IDQ4MCwgQVRINUtfU1BNQkxfQk9USCwgQVRINUtfUkFURV9DT0RFXzQ4TSB9LAorCXsgNTQwLCBBVEg1S19TUE1CTF9CT1RILCBBVEg1S19SQVRFX0NPREVfNTRNIH0sCisJeyAyMCwgQVRINUtfU1BNQkxfWUVTLCBBVEg1S19SQVRFX0NPREVfMk0gfCBBUjVLX1NFVF9TSE9SVF9QUkVBTUJMRSB9LAorCXsgNTUsIEFUSDVLX1NQTUJMX1lFUywgQVRINUtfUkFURV9DT0RFXzVfNU0gfCBBUjVLX1NFVF9TSE9SVF9QUkVBTUJMRSB9LAorCXsgMTEwLCBBVEg1S19TUE1CTF9ZRVMsIEFUSDVLX1JBVEVfQ09ERV8xMU0gfCBBUjVLX1NFVF9TSE9SVF9QUkVBTUJMRSB9LAorCXsgMCwgMCwgMCB9LAorfTsKKworI2RlZmluZSBBVEg1S19OUl9SQVRFUyAxNQorCisvKgorICogUHJvdG90eXBlcyAtIFBDSSBzdGFjayByZWxhdGVkIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50IAkJYXRoNWtfcHJvYmUoc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZAkJYXRoNWtfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KTsKKworc3RydWN0IHBjaV9kcml2ZXIgYXRoNWtfcGNpX2RyaXZlciBfX3BjaV9kcml2ZXIgPSB7CisJLmlkcwkJPSBhdGg1a19uaWNzLAorCS5pZF9jb3VudAk9IHNpemVvZihhdGg1a19uaWNzKSAvIHNpemVvZihhdGg1a19uaWNzWzBdKSwKKwkucHJvYmUJCT0gYXRoNWtfcHJvYmUsCisJLnJlbW92ZQkJPSBhdGg1a19yZW1vdmUsCit9OworCisKKworLyoKKyAqIFByb3RvdHlwZXMgLSBNQUMgODAyLjExIHN0YWNrIHJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgYXRoNWtfdHgoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICpza2IpOworc3RhdGljIGludCBhdGg1a19yZXNldChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbik7CitzdGF0aWMgaW50IGF0aDVrX3Jlc2V0X3dha2Uoc3RydWN0IGF0aDVrX3NvZnRjICpzYyk7CitzdGF0aWMgaW50IGF0aDVrX3N0YXJ0KHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhdGg1a19zdG9wKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGF0aDVrX2NvbmZpZyhzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCBjaGFuZ2VkKTsKK3N0YXRpYyB2b2lkIGF0aDVrX3BvbGwoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGF0aDVrX2lycShzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCBlbmFibGUpOworCitzdGF0aWMgc3RydWN0IG5ldDgwMjExX2RldmljZV9vcGVyYXRpb25zIGF0aDVrX29wcyA9IHsKKwkub3BlbgkJPSBhdGg1a19zdGFydCwKKwkuY2xvc2UJCT0gYXRoNWtfc3RvcCwKKwkudHJhbnNtaXQJPSBhdGg1a190eCwKKwkucG9sbAkJPSBhdGg1a19wb2xsLAorCS5pcnEJCT0gYXRoNWtfaXJxLAorCS5jb25maWcJCT0gYXRoNWtfY29uZmlnLAorfTsKKworLyoKKyAqIFByb3RvdHlwZXMgLSBJbnRlcm5hbCBmdW5jdGlvbnMKKyAqLworLyogQXR0YWNoIGRldGFjaCAqLworc3RhdGljIGludCAJYXRoNWtfYXR0YWNoKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJYXRoNWtfZGV0YWNoKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldik7CisvKiBDaGFubmVsL21vZGUgc2V0dXAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRoNWtfY29weV9jaGFubmVscyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJCXN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVscywKKwkJCQl1bnNpZ25lZCBpbnQgbW9kZSwKKwkJCQl1bnNpZ25lZCBpbnQgbWF4KTsKK3N0YXRpYyBpbnQgCWF0aDVrX3NldHVwX2JhbmRzKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAlhdGg1a19jaGFuX3NldChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLAorCQkJCXN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFuKTsKK3N0YXRpYyB2b2lkCWF0aDVrX3NldGN1cm1vZGUoc3RydWN0IGF0aDVrX3NvZnRjICpzYywKKwkJCQl1bnNpZ25lZCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZAlhdGg1a19tb2RlX3NldHVwKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOworCisvKiBEZXNjcmlwdG9yIHNldHVwICovCitzdGF0aWMgaW50CWF0aDVrX2Rlc2NfYWxsb2Moc3RydWN0IGF0aDVrX3NvZnRjICpzYyk7CitzdGF0aWMgdm9pZAlhdGg1a19kZXNjX2ZyZWUoc3RydWN0IGF0aDVrX3NvZnRjICpzYyk7CisvKiBCdWZmZXJzIHNldHVwICovCitzdGF0aWMgaW50IAlhdGg1a19yeGJ1Zl9zZXR1cChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfYnVmICpiZik7CitzdGF0aWMgaW50IAlhdGg1a190eGJ1Zl9zZXR1cChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfYnVmICpiZik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a190eGJ1Zl9mcmVlKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsCisJCQkJICAgIHN0cnVjdCBhdGg1a19idWYgKmJmKQoreworCWlmICghYmYtPmlvYikKKwkJcmV0dXJuOworCisJbmV0ODAyMTFfdHhfY29tcGxldGUoc2MtPmRldiwgYmYtPmlvYiwgMCwgRUNBTkNFTEVEKTsKKwliZi0+aW9iID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0aDVrX3J4YnVmX2ZyZWUoc3RydWN0IGF0aDVrX3NvZnRjICpzYyBfX3VudXNlZCwKKwkJCQkgICAgc3RydWN0IGF0aDVrX2J1ZiAqYmYpCit7CisJZnJlZV9pb2IoYmYtPmlvYik7CisJYmYtPmlvYiA9IE5VTEw7Cit9CisKKy8qIFF1ZXVlcyBzZXR1cCAqLworc3RhdGljIGludCAJYXRoNWtfdHhxX3NldHVwKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsCisJCQkJCSAgIGludCBxdHlwZSwgaW50IHN1YnR5cGUpOworc3RhdGljIHZvaWQgCWF0aDVrX3R4cV9kcmFpbnEoc3RydWN0IGF0aDVrX3NvZnRjICpzYywKKwkJCQkgc3RydWN0IGF0aDVrX3R4cSAqdHhxKTsKK3N0YXRpYyB2b2lkIAlhdGg1a190eHFfY2xlYW51cChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKK3N0YXRpYyB2b2lkIAlhdGg1a190eHFfcmVsZWFzZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKKy8qIFJ4IGhhbmRsaW5nICovCitzdGF0aWMgaW50IAlhdGg1a19yeF9zdGFydChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKK3N0YXRpYyB2b2lkIAlhdGg1a19yeF9zdG9wKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOworLyogVHggaGFuZGxpbmcgKi8KK3N0YXRpYyB2b2lkIAlhdGg1a190eF9wcm9jZXNzcShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLAorCQkJCSAgc3RydWN0IGF0aDVrX3R4cSAqdHhxKTsKKworLyogSW50ZXJydXB0IGhhbmRsaW5nICovCitzdGF0aWMgaW50IAlhdGg1a19pbml0KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOworc3RhdGljIGludCAJYXRoNWtfc3RvcF9odyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKKworc3RhdGljIHZvaWQgCWF0aDVrX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKKworLyogRmlsdGVyICovCitzdGF0aWMgdm9pZAlhdGg1a19jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOworCisvKioqKioqKioqKioqKioqKioqKipcCisqIFBDSSBJbml0aWFsaXphdGlvbiAqCitcKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBEQkdMVkxfTUFYCitzdGF0aWMgY29uc3QgY2hhciAqCithdGg1a19jaGlwX25hbWUoZW51bSBhdGg1a19zcmV2X3R5cGUgdHlwZSwgdTE2IHZhbCkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gInh4eHh4IjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNyZXZfbmFtZXMpOyBpKyspIHsKKwkJaWYgKHNyZXZfbmFtZXNbaV0uc3JfdHlwZSAhPSB0eXBlKQorCQkJY29udGludWU7CisKKwkJaWYgKCh2YWwgJiAweGYwKSA9PSBzcmV2X25hbWVzW2ldLnNyX3ZhbCkKKwkJCW5hbWUgPSBzcmV2X25hbWVzW2ldLnNyX25hbWU7CisKKwkJaWYgKCh2YWwgJiAweGZmKSA9PSBzcmV2X25hbWVzW2ldLnNyX3ZhbCkgeworCQkJbmFtZSA9IHNyZXZfbmFtZXNbaV0uc3JfbmFtZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIG5hbWU7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhdGg1a19wcm9iZShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwl2b2lkICptZW07CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYzsKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXY7CisJaW50IHJldDsKKwl1OCBjc3o7CisKKwlhZGp1c3RfcGNpX2RldmljZShwZGV2KTsKKworCS8qCisJICogQ2FjaGUgbGluZSBzaXplIGlzIHVzZWQgdG8gc2l6ZSBhbmQgYWxpZ24gdmFyaW91cworCSAqIHN0cnVjdHVyZXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAmY3N6KTsKKwlpZiAoY3N6ID09IDApIHsKKwkJLyoKKwkJICogV2UgbXVzdCBoYXZlIHRoaXMgc2V0dXAgcHJvcGVybHkgZm9yIHJ4IGJ1ZmZlcgorCQkgKiBETUEgdG8gd29yayBzbyBmb3JjZSBhIHJlYXNvbmFibGUgdmFsdWUgaGVyZSBpZiBpdAorCQkgKiBjb21lcyB1cCB6ZXJvLgorCQkgKi8KKwkJY3N6ID0gMTY7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCBjc3opOworCX0KKwkvKgorCSAqIFRoZSBkZWZhdWx0IHNldHRpbmcgb2YgbGF0ZW5jeSB0aW1lciB5aWVsZHMgcG9vciByZXN1bHRzLAorCSAqIHNldCBpdCB0byB0aGUgdmFsdWUgdXNlZCBieSBvdGhlciBzeXN0ZW1zLiAgSXQgbWF5IGJlIHdvcnRoCisJICogdHdlYWtpbmcgdGhpcyBzZXR0aW5nIG1vcmUuCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweGE4KTsKKworCS8qCisJICogRGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAorCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUuCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDEsIDApOworCisJbWVtID0gaW9yZW1hcChwZGV2LT5tZW1iYXNlLCAweDEwMDAwKTsKKwlpZiAoIW1lbSkgeworCQlEQkcoImF0aDVrOiBjYW5ub3QgcmVtYXAgUENJIG1lbW9yeSByZWdpb25cbiIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGRldiAobmV0ODAyMTEgbWFpbiBzdHJ1Y3QpCisJICogYW5kIGRldi0+cHJpdiAoZHJpdmVyIHByaXZhdGUgZGF0YSkKKwkgKi8KKwlkZXYgPSBuZXQ4MDIxMV9hbGxvYyhzaXplb2YoKnNjKSk7CisJaWYgKCFkZXYpIHsKKwkJREJHKCJhdGg1azogY2Fubm90IGFsbG9jYXRlIDgwMi4xMSBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tYXA7CisJfQorCisJLyogSW5pdGlhbGl6ZSBkcml2ZXIgcHJpdmF0ZSBkYXRhICovCisJc2MgPSBkZXYtPnByaXY7CisJc2MtPmRldiA9IGRldjsKKwlzYy0+cGRldiA9IHBkZXY7CisKKwlzYy0+aHdpbmZvID0gemFsbG9jKHNpemVvZigqc2MtPmh3aW5mbykpOworCWlmICghc2MtPmh3aW5mbykgeworCQlEQkcoImF0aDVrOiBjYW5ub3QgYWxsb2NhdGUgODAyLjExIGhhcmR3YXJlIGluZm8gc3RydWN0dXJlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlzYy0+aHdpbmZvLT5mbGFncyA9IE5FVDgwMjExX0hXX1JYX0hBU19GQ1M7CisJc2MtPmh3aW5mby0+c2lnbmFsX3R5cGUgPSBORVQ4MDIxMV9TSUdOQUxfREI7CisJc2MtPmh3aW5mby0+c2lnbmFsX21heCA9IDQwOyAvKiAzNWRCIHNob3VsZCBnaXZlIHBlcmZlY3QgNTRNYnBzICovCisJc2MtPmh3aW5mby0+Y2hhbm5lbF9jaGFuZ2VfdGltZSA9IDUwMDA7CisKKwkvKiBBdm9pZCB3b3JraW5nIHdpdGggdGhlIGRldmljZSB1bnRpbCBzZXR1cCBpcyBjb21wbGV0ZSAqLworCXNjLT5zdGF0dXMgfD0gQVRIX1NUQVRfSU5WQUxJRDsKKworCXNjLT5pb2Jhc2UgPSBtZW07CisJc2MtPmNhY2hlbHN6ID0gY3N6ICogNDsgLyogY29udmVydCB0byBieXRlcyAqLworCisJREJHKCJhdGg1azogcmVnaXN0ZXIgYmFzZSBhdCAlcCAoJTA4bHgpXG4iLCBzYy0+aW9iYXNlLCBwZGV2LT5tZW1iYXNlKTsKKwlEQkcoImF0aDVrOiBjYWNoZSBsaW5lIHNpemUgJWRcbiIsIHNjLT5jYWNoZWxzeik7CisKKwkvKiBTZXQgcHJpdmF0ZSBkYXRhICovCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJZGV2LT5uZXRkZXYtPmRldiA9IChzdHJ1Y3QgZGV2aWNlICopcGRldjsKKworCS8qIEluaXRpYWxpemUgZGV2aWNlICovCisJcmV0ID0gYXRoNWtfaHdfYXR0YWNoKHNjLCBpZC0+ZHJpdmVyX2RhdGEsICZzYy0+YWgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfaHdpbmZvOworCisJLyogRmluaXNoIHByaXZhdGUgZHJpdmVyIGRhdGEgaW5pdGlhbGl6YXRpb24gKi8KKwlyZXQgPSBhdGg1a19hdHRhY2goZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9haDsKKworI2lmIERCR0xWTF9NQVgKKwlEQkcoIkF0aGVyb3MgQVIlcyBjaGlwIGZvdW5kIChNQUM6IDB4JXgsIFBIWTogMHgleClcbiIsCisJICAgIGF0aDVrX2NoaXBfbmFtZShBUjVLX1ZFUlNJT05fTUFDLCBzYy0+YWgtPmFoX21hY19zcmV2KSwKKwkgICAgc2MtPmFoLT5haF9tYWNfc3Jldiwgc2MtPmFoLT5haF9waHlfcmV2aXNpb24pOworCisJaWYgKCFzYy0+YWgtPmFoX3NpbmdsZV9jaGlwKSB7CisJCS8qIFNpbmdsZSBjaGlwIHJhZGlvICghUkY1MTExKSAqLworCQlpZiAoc2MtPmFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uICYmCisJCSAgICAhc2MtPmFoLT5haF9yYWRpb18yZ2h6X3JldmlzaW9uKSB7CisJCQkvKiBObyA1R0h6IHN1cHBvcnQgLT4gcmVwb3J0IDJHSHogcmFkaW8gKi8KKwkJCWlmICghKHNjLT5haC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlICYgQVI1S19NT0RFX0JJVF8xMUEpKSB7CisJCQkJREJHKCJSRiVzIDJHSHogcmFkaW8gZm91bmQgKDB4JXgpXG4iLAorCQkJCSAgICBhdGg1a19jaGlwX25hbWUoQVI1S19WRVJTSU9OX1JBRCwKKwkJCQkJCSAgICBzYy0+YWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pLAorCQkJCSAgICBzYy0+YWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pOworCQkJLyogTm8gMkdIeiBzdXBwb3J0ICg1MTEwIGFuZCBzb21lCisJCQkgKiA1R2h6IG9ubHkgY2FyZHMpIC0+IHJlcG9ydCA1R2h6IHJhZGlvICovCisJCQl9IGVsc2UgaWYgKCEoc2MtPmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUgJiBBUjVLX01PREVfQklUXzExQikpIHsKKwkJCQlEQkcoIlJGJXMgNUdIeiByYWRpbyBmb3VuZCAoMHgleClcbiIsCisJCQkJICAgIGF0aDVrX2NoaXBfbmFtZShBUjVLX1ZFUlNJT05fUkFELAorCQkJCQkJICAgIHNjLT5haC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiksCisJCQkJICAgIHNjLT5haC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbik7CisJCQkvKiBNdWx0aWJhbmQgcmFkaW8gKi8KKwkJCX0gZWxzZSB7CisJCQkJREJHKCJSRiVzIG11bHRpYmFuZCByYWRpbyBmb3VuZCAoMHgleClcbiIsCisJCQkJICAgIGF0aDVrX2NoaXBfbmFtZShBUjVLX1ZFUlNJT05fUkFELAorCQkJCQkJICAgIHNjLT5haC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiksCisJCQkJICAgIHNjLT5haC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbik7CisJCQl9CisJCX0KKwkJLyogTXVsdGkgY2hpcCByYWRpbyAoUkY1MTExIC0gUkYyMTExKSAtPgorCQkgKiByZXBvcnQgYm90aCAyR0h6LzVHSHogcmFkaW9zICovCisJCWVsc2UgaWYgKHNjLT5haC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiAmJgorCQkJIHNjLT5haC0+YWhfcmFkaW9fMmdoel9yZXZpc2lvbikgeworCQkJREJHKCJSRiVzIDVHSHogcmFkaW8gZm91bmQgKDB4JXgpXG4iLAorCQkJICAgIGF0aDVrX2NoaXBfbmFtZShBUjVLX1ZFUlNJT05fUkFELAorCQkJCQkgICAgc2MtPmFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uKSwKKwkJCSAgICBzYy0+YWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pOworCQkJREJHKCJSRiVzIDJHSHogcmFkaW8gZm91bmQgKDB4JXgpXG4iLAorCQkJICAgIGF0aDVrX2NoaXBfbmFtZShBUjVLX1ZFUlNJT05fUkFELAorCQkJCQkgICAgc2MtPmFoLT5haF9yYWRpb18yZ2h6X3JldmlzaW9uKSwKKwkJCSAgICBzYy0+YWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24pOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBSZWFkeSB0byBnbyAqLworCXNjLT5zdGF0dXMgJj0gfkFUSF9TVEFUX0lOVkFMSUQ7CisKKwlyZXR1cm4gMDsKK2Vycl9haDoKKwlhdGg1a19od19kZXRhY2goc2MtPmFoKTsKK2Vycl9mcmVlX2h3aW5mbzoKKwlmcmVlKHNjLT5od2luZm8pOworZXJyX2ZyZWU6CisJbmV0ODAyMTFfZnJlZShkZXYpOworZXJyX21hcDoKKwlpb3VubWFwKG1lbSk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXRoNWtfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2LT5wcml2OworCisJYXRoNWtfZGV0YWNoKGRldik7CisJYXRoNWtfaHdfZGV0YWNoKHNjLT5haCk7CisJaW91bm1hcChzYy0+aW9iYXNlKTsKKwlmcmVlKHNjLT5od2luZm8pOworCW5ldDgwMjExX2ZyZWUoZGV2KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKipcCisqIERyaXZlciBJbml0aWFsaXphdGlvbiAqCitcKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2F0aDVrX2F0dGFjaChzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCWludCByZXQ7CisKKwkvKgorCSAqIENvbGxlY3QgdGhlIGNoYW5uZWwgbGlzdC4gIFRoZSA4MDIuMTEgbGF5ZXIKKwkgKiBpcyByZXNwb3NpYmxlIGZvciBmaWx0ZXJpbmcgdGhpcyBsaXN0IGJhc2VkCisJICogb24gc2V0dGluZ3MgbGlrZSB0aGUgcGh5IG1vZGUgYW5kIHJlZ3VsYXRvcnkKKwkgKiBkb21haW4gcmVzdHJpY3Rpb25zLgorCSAqLworCXJldCA9IGF0aDVrX3NldHVwX2JhbmRzKGRldik7CisJaWYgKHJldCkgeworCQlEQkcoImF0aDVrOiBjYW4ndCBnZXQgY2hhbm5lbHNcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBOQjogc2V0dXAgaGVyZSBzbyBhdGg1a19yYXRlX3VwZGF0ZSBpcyBoYXBweSAqLworCWlmIChhaC0+YWhfbW9kZXMgJiBBUjVLX01PREVfQklUXzExQSkKKwkJYXRoNWtfc2V0Y3VybW9kZShzYywgQVI1S19NT0RFXzExQSk7CisJZWxzZQorCQlhdGg1a19zZXRjdXJtb2RlKHNjLCBBUjVLX01PREVfMTFCKTsKKworCS8qCisJICogQWxsb2NhdGUgdHgrcnggZGVzY3JpcHRvcnMgYW5kIHBvcHVsYXRlIHRoZSBsaXN0cy4KKwkgKi8KKwlyZXQgPSBhdGg1a19kZXNjX2FsbG9jKHNjKTsKKwlpZiAocmV0KSB7CisJCURCRygiYXRoNWs6IGNhbid0IGFsbG9jYXRlIGRlc2NyaXB0b3JzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBoYXJkd2FyZSB0cmFuc21pdCBxdWV1ZXMuIE5vdGUgdGhhdCBodyBmdW5jdGlvbnMKKwkgKiBoYW5kbGUgcmVzZXRpbmcgdGhlc2UgcXVldWVzIGF0IHRoZSBuZWVkZWQgdGltZS4KKwkgKi8KKwlyZXQgPSBhdGg1a190eHFfc2V0dXAoc2MsIEFSNUtfVFhfUVVFVUVfREFUQSwgQVI1S19XTUVfQUNfQkUpOworCWlmIChyZXQpIHsKKwkJREJHKCJhdGg1azogY2FuJ3Qgc2V0dXAgeG1pdCBxdWV1ZVxuIik7CisJCWdvdG8gZXJyX2Rlc2M7CisJfQorCisJc2MtPmxhc3RfY2FsaWJfdGlja3MgPSBjdXJydGlja3MoKTsKKworCXJldCA9IGF0aDVrX2VlcHJvbV9yZWFkX21hYyhhaCwgc2MtPmh3aW5mby0+aHdhZGRyKTsKKwlpZiAocmV0KSB7CisJCURCRygiYXRoNWs6IHVuYWJsZSB0byByZWFkIGFkZHJlc3MgZnJvbSBFRVBST006IDB4JTA0eFxuIiwKKwkJICAgIHNjLT5wZGV2LT5kZXZpY2UpOworCQlnb3RvIGVycl9xdWV1ZXM7CisJfQorCisJbWVtc2V0KHNjLT5ic3NpZG1hc2ssIDB4ZmYsIEVUSF9BTEVOKTsKKwlhdGg1a19od19zZXRfYnNzaWRfbWFzayhzYy0+YWgsIHNjLT5ic3NpZG1hc2spOworCisJcmV0ID0gbmV0ODAyMTFfcmVnaXN0ZXIoc2MtPmRldiwgJmF0aDVrX29wcywgc2MtPmh3aW5mbyk7CisJaWYgKHJldCkgeworCQlEQkcoImF0aDVrOiBjYW4ndCByZWdpc3RlciBpZWVlODAyMTEgaHdcbiIpOworCQlnb3RvIGVycl9xdWV1ZXM7CisJfQorCisJcmV0dXJuIDA7CitlcnJfcXVldWVzOgorCWF0aDVrX3R4cV9yZWxlYXNlKHNjKTsKK2Vycl9kZXNjOgorCWF0aDVrX2Rlc2NfZnJlZShzYyk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2F0aDVrX2RldGFjaChzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldi0+cHJpdjsKKworCW5ldDgwMjExX3VucmVnaXN0ZXIoZGV2KTsKKwlhdGg1a19kZXNjX2ZyZWUoc2MpOworCWF0aDVrX3R4cV9yZWxlYXNlKHNjKTsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqXAorKiBDaGFubmVsL21vZGUgc2V0dXAgKgorXCoqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29udmVydCBJRUVFIGNoYW5uZWwgbnVtYmVyIHRvIE1IeiBmcmVxdWVuY3kuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2hvcnQKK2F0aDVrX2llZWUybWh6KHNob3J0IGNoYW4pCit7CisJaWYgKGNoYW4gPCAxNCkKKwkJcmV0dXJuIDI0MDcgKyA1ICogY2hhbjsKKwlpZiAoY2hhbiA9PSAxNCkKKwkJcmV0dXJuIDI0ODQ7CisJaWYgKGNoYW4gPCAyNykKKwkJcmV0dXJuIDIyMTIgKyAyMCAqIGNoYW47CisJcmV0dXJuIDUwMDAgKyA1ICogY2hhbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorYXRoNWtfY29weV9jaGFubmVscyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkgICAgc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWxzLAorCQkgICAgdW5zaWduZWQgaW50IG1vZGUsIHVuc2lnbmVkIGludCBtYXgpCit7CisJdW5zaWduZWQgaW50IGksIGNvdW50LCBzaXplLCBjaGZyZXEsIGZyZXEsIGNoOworCisJaWYgKCEoYWgtPmFoX21vZGVzICYgKDEgPDwgbW9kZSkpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQVI1S19NT0RFXzExQToKKwljYXNlIEFSNUtfTU9ERV8xMUFfVFVSQk86CisJCS8qIDEuLjIyMCwgYnV0IDJHSHogZnJlcXVlbmNpZXMgYXJlIGZpbHRlcmVkIGJ5IGNoZWNrX2NoYW5uZWwgKi8KKwkJc2l6ZSA9IDIyMDsKKwkJY2hmcmVxID0gQ0hBTk5FTF81R0haOworCQlicmVhazsKKwljYXNlIEFSNUtfTU9ERV8xMUI6CisJY2FzZSBBUjVLX01PREVfMTFHOgorCWNhc2UgQVI1S19NT0RFXzExR19UVVJCTzoKKwkJc2l6ZSA9IDI2OworCQljaGZyZXEgPSBDSEFOTkVMXzJHSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDAsIGNvdW50ID0gMDsgaSA8IHNpemUgJiYgbWF4ID4gMDsgaSsrKSB7CisJCWNoID0gaSArIDEgOworCQlmcmVxID0gYXRoNWtfaWVlZTJtaHooY2gpOworCisJCS8qIENoZWNrIGlmIGNoYW5uZWwgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwc2V0ICovCisJCWlmICghYXRoNWtfY2hhbm5lbF9vayhhaCwgZnJlcSwgY2hmcmVxKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFdyaXRlIGNoYW5uZWwgaW5mbyBhbmQgaW5jcmVtZW50IGNvdW50ZXIgKi8KKwkJY2hhbm5lbHNbY291bnRdLmNlbnRlcl9mcmVxID0gZnJlcTsKKwkJY2hhbm5lbHNbY291bnRdLm1heHBvd2VyID0gMDsgLyogdXNlIHJlZ3VsYXRvcnkgKi8KKwkJY2hhbm5lbHNbY291bnRdLmJhbmQgPSAoY2hmcmVxID09IENIQU5ORUxfMkdIWikgPworCQkJTkVUODAyMTFfQkFORF8yR0haIDogTkVUODAyMTFfQkFORF81R0haOworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBBUjVLX01PREVfMTFBOgorCQljYXNlIEFSNUtfTU9ERV8xMUc6CisJCQljaGFubmVsc1tjb3VudF0uaHdfdmFsdWUgPSBjaGZyZXEgfCBDSEFOTkVMX09GRE07CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX01PREVfMTFBX1RVUkJPOgorCQljYXNlIEFSNUtfTU9ERV8xMUdfVFVSQk86CisJCQljaGFubmVsc1tjb3VudF0uaHdfdmFsdWUgPSBjaGZyZXEgfAorCQkJCUNIQU5ORUxfT0ZETSB8IENIQU5ORUxfVFVSQk87CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX01PREVfMTFCOgorCQkJY2hhbm5lbHNbY291bnRdLmh3X3ZhbHVlID0gQ0hBTk5FTF9COworCQl9CisKKwkJY291bnQrKzsKKwkJbWF4LS07CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CithdGg1a19zZXR1cF9iYW5kcyhzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCWludCBtYXhfYywgY291bnRfYyA9IDA7CisJaW50IGk7CisJaW50IGJhbmQ7CisKKwltYXhfYyA9IHNpemVvZihzYy0+aHdpbmZvLT5jaGFubmVscykgLyBzaXplb2Yoc2MtPmh3aW5mby0+Y2hhbm5lbHNbMF0pOworCisJLyogMkdIeiBiYW5kICovCisJaWYgKHNjLT5haC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlICYgQVI1S19NT0RFX0JJVF8xMUcpIHsKKwkJLyogRyBtb2RlICovCisJCWJhbmQgPSBORVQ4MDIxMV9CQU5EXzJHSFo7CisJCXNjLT5od2luZm8tPmJhbmRzID0gTkVUODAyMTFfQkFORF9CSVRfMkdIWjsKKwkJc2MtPmh3aW5mby0+bW9kZXMgPSAoTkVUODAyMTFfTU9ERV9HIHwgTkVUODAyMTFfTU9ERV9CKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKwkJCXNjLT5od2luZm8tPnJhdGVzW2JhbmRdW2ldID0gYXRoNWtfcmF0ZXNbaV0uYml0cmF0ZTsKKwkJc2MtPmh3aW5mby0+bnJfcmF0ZXNbYmFuZF0gPSAxMjsKKworCQlzYy0+aHdpbmZvLT5ucl9jaGFubmVscyA9CisJCQlhdGg1a19jb3B5X2NoYW5uZWxzKGFoLCBzYy0+aHdpbmZvLT5jaGFubmVscywKKwkJCQkJICAgIEFSNUtfTU9ERV8xMUcsIG1heF9jKTsKKwkJY291bnRfYyA9IHNjLT5od2luZm8tPm5yX2NoYW5uZWxzOworCQltYXhfYyAtPSBjb3VudF9jOworCX0gZWxzZSBpZiAoc2MtPmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUgJiBBUjVLX01PREVfQklUXzExQikgeworCQkvKiBCIG1vZGUgKi8KKwkJYmFuZCA9IE5FVDgwMjExX0JBTkRfMkdIWjsKKwkJc2MtPmh3aW5mby0+YmFuZHMgPSBORVQ4MDIxMV9CQU5EX0JJVF8yR0haOworCQlzYy0+aHdpbmZvLT5tb2RlcyA9IE5FVDgwMjExX01PREVfQjsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJc2MtPmh3aW5mby0+cmF0ZXNbYmFuZF1baV0gPSBhdGg1a19yYXRlc1tpXS5iaXRyYXRlOworCQlzYy0+aHdpbmZvLT5ucl9yYXRlc1tiYW5kXSA9IDQ7CisKKwkJc2MtPmh3aW5mby0+bnJfY2hhbm5lbHMgPQorCQkJYXRoNWtfY29weV9jaGFubmVscyhhaCwgc2MtPmh3aW5mby0+Y2hhbm5lbHMsCisJCQkJCSAgICBBUjVLX01PREVfMTFCLCBtYXhfYyk7CisJCWNvdW50X2MgPSBzYy0+aHdpbmZvLT5ucl9jaGFubmVsczsKKwkJbWF4X2MgLT0gY291bnRfYzsKKwl9CisKKwkvKiA1R0h6IGJhbmQsIEEgbW9kZSAqLworCWlmIChzYy0+YWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSAmIEFSNUtfTU9ERV9CSVRfMTFBKSB7CisJCWJhbmQgPSBORVQ4MDIxMV9CQU5EXzVHSFo7CisJCXNjLT5od2luZm8tPmJhbmRzIHw9IE5FVDgwMjExX0JBTkRfQklUXzVHSFo7CisJCXNjLT5od2luZm8tPm1vZGVzIHw9IE5FVDgwMjExX01PREVfQTsKKworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJc2MtPmh3aW5mby0+cmF0ZXNbYmFuZF1baV0gPSBhdGg1a19yYXRlc1tpKzRdLmJpdHJhdGU7CisJCXNjLT5od2luZm8tPm5yX3JhdGVzW2JhbmRdID0gODsKKworCQlzYy0+aHdpbmZvLT5ucl9jaGFubmVscyA9CisJCQlhdGg1a19jb3B5X2NoYW5uZWxzKGFoLCBzYy0+aHdpbmZvLT5jaGFubmVscywKKwkJCQkJICAgIEFSNUtfTU9ERV8xMUIsIG1heF9jKTsKKwkJY291bnRfYyA9IHNjLT5od2luZm8tPm5yX2NoYW5uZWxzOworCQltYXhfYyAtPSBjb3VudF9jOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogU2V0L2NoYW5nZSBjaGFubmVscy4gIElmIHRoZSBjaGFubmVsIGlzIHJlYWxseSBiZWluZyBjaGFuZ2VkLAorICogaXQncyBkb25lIGJ5IHJlc2V0aW5nIHRoZSBjaGlwLiAgVG8gYWNjb21wbGlzaCB0aGlzIHdlIG11c3QKKyAqIGZpcnN0IGNsZWFudXAgYW55IHBlbmRpbmcgRE1BLCB0aGVuIHJlc3RhcnQgc3R1ZmYgYWZ0ZXIgYSBsYQorICogYXRoNWtfaW5pdC4KKyAqLworc3RhdGljIGludAorYXRoNWtfY2hhbl9zZXQoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW4pCit7CisJaWYgKGNoYW4tPmNlbnRlcl9mcmVxICE9IHNjLT5jdXJjaGFuLT5jZW50ZXJfZnJlcSB8fAorCSAgICBjaGFuLT5od192YWx1ZSAhPSBzYy0+Y3VyY2hhbi0+aHdfdmFsdWUpIHsKKwkJLyoKKwkJICogVG8gc3dpdGNoIGNoYW5uZWxzIGNsZWFyIGFueSBwZW5kaW5nIERNQSBvcGVyYXRpb25zOworCQkgKiB3YWl0IGxvbmcgZW5vdWdoIGZvciB0aGUgUlggZmlmbyB0byBkcmFpbiwgcmVzZXQgdGhlCisJCSAqIGhhcmR3YXJlIGF0IHRoZSBuZXcgZnJlcXVlbmN5LCBhbmQgdGhlbiByZS1lbmFibGUKKwkJICogdGhlIHJlbGV2YW50IGJpdHMgb2YgdGhlIGgvdy4KKwkJICovCisJCURCRzIoImF0aDVrOiByZXNldHRpbmcgZm9yIGNoYW5uZWwgY2hhbmdlICglZCAtPiAlZCBNSHopXG4iLAorCQkgICAgIHNjLT5jdXJjaGFuLT5jZW50ZXJfZnJlcSwgY2hhbi0+Y2VudGVyX2ZyZXEpOworCQlyZXR1cm4gYXRoNWtfcmVzZXQoc2MsIGNoYW4pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXRoNWtfc2V0Y3VybW9kZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzYy0+Y3VybW9kZSA9IG1vZGU7CisKKwlpZiAobW9kZSA9PSBBUjVLX01PREVfMTFBKSB7CisJCXNjLT5jdXJiYW5kID0gTkVUODAyMTFfQkFORF81R0haOworCX0gZWxzZSB7CisJCXNjLT5jdXJiYW5kID0gTkVUODAyMTFfQkFORF8yR0haOworCX0KK30KKworc3RhdGljIHZvaWQKK2F0aDVrX21vZGVfc2V0dXAoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXUzMiByZmlsdDsKKworCS8qIGNvbmZpZ3VyZSByeCBmaWx0ZXIgKi8KKwlyZmlsdCA9IHNjLT5maWx0ZXJfZmxhZ3M7CisJYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcihhaCwgcmZpbHQpOworCisJaWYgKGF0aDVrX2h3X2hhc2Jzc2lkbWFzayhhaCkpCisJCWF0aDVrX2h3X3NldF9ic3NpZF9tYXNrKGFoLCBzYy0+YnNzaWRtYXNrKTsKKworCS8qIGNvbmZpZ3VyZSBvcGVyYXRpb25hbCBtb2RlICovCisJYXRoNWtfaHdfc2V0X29wbW9kZShhaCk7CisKKwlhdGg1a19od19zZXRfbWNhc3RfZmlsdGVyKGFoLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2F0aDVrX2h3X3JpeF90b19iaXRyYXRlKGludCBod19yaXgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRINUtfTlJfUkFURVM7IGkrKykgeworCQlpZiAoYXRoNWtfcmF0ZXNbaV0uaHdfY29kZSA9PSBod19yaXgpCisJCQlyZXR1cm4gYXRoNWtfcmF0ZXNbaV0uYml0cmF0ZTsKKwl9CisKKwlEQkcoImF0aDVrOiBpbnZhbGlkIHJpeCAlMDJ4XG4iLCBod19yaXgpOworCXJldHVybiAxMDsJCS8qIHVzZSBsb3dlc3QgcmF0ZSAqLworfQorCitpbnQgYXRoNWtfYml0cmF0ZV90b19od19yaXgoaW50IGJpdHJhdGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRINUtfTlJfUkFURVM7IGkrKykgeworCQlpZiAoYXRoNWtfcmF0ZXNbaV0uYml0cmF0ZSA9PSBiaXRyYXRlKQorCQkJcmV0dXJuIGF0aDVrX3JhdGVzW2ldLmh3X2NvZGU7CisJfQorCisJREJHKCJhdGg1azogaW52YWxpZCBiaXRyYXRlICVkXG4iLCBiaXRyYXRlKTsKKwlyZXR1cm4gQVRINUtfUkFURV9DT0RFXzFNOyAvKiB1c2UgbG93ZXN0IHJhdGUgKi8KK30KKworLyoqKioqKioqKioqKioqKlwKKyogQnVmZmVycyBzZXR1cCAqCitcKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqCithdGg1a19yeF9pb2JfYWxsb2Moc3RydWN0IGF0aDVrX3NvZnRjICpzYywgdTMyICppb2JfYWRkcikKK3sKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2I7CisJdW5zaWduZWQgaW50IG9mZjsKKworCS8qCisJICogQWxsb2NhdGUgYnVmZmVyIHdpdGggaGVhZHJvb21fbmVlZGVkIHNwYWNlIGZvciB0aGUKKwkgKiBmYWtlIHBoeXNpY2FsIGxheWVyIGhlYWRlciBhdCB0aGUgc3RhcnQuCisJICovCisJaW9iID0gYWxsb2NfaW9iKHNjLT5yeGJ1ZnNpemUgKyBzYy0+Y2FjaGVsc3ogLSAxKTsKKworCWlmICghaW9iKSB7CisJCURCRygiYXRoNWs6IGNhbid0IGFsbG9jIGlvYnVmIG9mIHNpemUgJWRcbiIsCisJCSAgICBzYy0+cnhidWZzaXplICsgc2MtPmNhY2hlbHN6IC0gMSk7CisJCXJldHVybiBOVUxMOworCX0KKworCSppb2JfYWRkciA9IHZpcnRfdG9fYnVzKGlvYi0+ZGF0YSk7CisKKwkvKgorCSAqIENhY2hlLWxpbmUtYWxpZ24uICBUaGlzIGlzIGltcG9ydGFudCAoZm9yIHRoZQorCSAqIDUyMTAgYXQgbGVhc3QpIGFzIG5vdCBkb2luZyBzbyBjYXVzZXMgYm9ndXMgZGF0YQorCSAqIGluIHJ4J2QgZnJhbWVzLgorCSAqLworCW9mZiA9ICppb2JfYWRkciAlIHNjLT5jYWNoZWxzejsKKwlpZiAob2ZmICE9IDApIHsKKwkJaW9iX3Jlc2VydmUoaW9iLCBzYy0+Y2FjaGVsc3ogLSBvZmYpOworCQkqaW9iX2FkZHIgKz0gc2MtPmNhY2hlbHN6IC0gb2ZmOworCX0KKworCXJldHVybiBpb2I7Cit9CisKK3N0YXRpYyBpbnQKK2F0aDVrX3J4YnVmX3NldHVwKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBhdGg1a19idWYgKmJmKQoreworCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gYmYtPmlvYjsKKwlzdHJ1Y3QgYXRoNWtfZGVzYyAqZHM7CisKKwlpZiAoIWlvYikgeworCQlpb2IgPSBhdGg1a19yeF9pb2JfYWxsb2Moc2MsICZiZi0+aW9iYWRkcik7CisJCWlmICghaW9iKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWJmLT5pb2IgPSBpb2I7CisJfQorCisJLyoKKwkgKiBTZXR1cCBkZXNjcmlwdG9ycy4gIEZvciByZWNlaXZlIHdlIGFsd2F5cyB0ZXJtaW5hdGUKKwkgKiB0aGUgZGVzY3JpcHRvciBsaXN0IHdpdGggYSBzZWxmLWxpbmtlZCBlbnRyeSBzbyB3ZSdsbAorCSAqIG5vdCBnZXQgb3ZlcnJ1biB1bmRlciBoaWdoIGxvYWQgKGFzIGNhbiBoYXBwZW4gd2l0aCBhCisJICogNTIxMiB3aGVuIEFOSSBwcm9jZXNzaW5nIGVuYWJsZXMgUEhZIGVycm9yIGZyYW1lcykuCisJICoKKwkgKiBUbyBpbnN1cmUgdGhlIGxhc3QgZGVzY3JpcHRvciBpcyBzZWxmLWxpbmtlZCB3ZSBjcmVhdGUKKwkgKiBlYWNoIGRlc2NyaXB0b3IgYXMgc2VsZi1saW5rZWQgYW5kIGFkZCBpdCB0byB0aGUgZW5kLiAgQXMKKwkgKiBlYWNoIGFkZGl0aW9uYWwgZGVzY3JpcHRvciBpcyBhZGRlZCB0aGUgcHJldmlvdXMgc2VsZi1saW5rZWQKKwkgKiBlbnRyeSBpcyBgYGZpeGVkJycgbmF0dXJhbGx5LiAgVGhpcyBzaG91bGQgYmUgc2FmZSBldmVuCisJICogaWYgRE1BIGlzIGhhcHBlbmluZy4gIFdoZW4gcHJvY2Vzc2luZyBSWCBpbnRlcnJ1cHRzIHdlCisJICogbmV2ZXIgcmVtb3ZlL3Byb2Nlc3MgdGhlIGxhc3QsIHNlbGYtbGlua2VkLCBlbnRyeSBvbiB0aGUKKwkgKiBkZXNjcmlwdG9yIGxpc3QuICBUaGlzIGluc3VyZXMgdGhlIGhhcmR3YXJlIGFsd2F5cyBoYXMKKwkgKiBzb21lcGxhY2UgdG8gd3JpdGUgYSBuZXcgZnJhbWUuCisJICovCisJZHMgPSBiZi0+ZGVzYzsKKwlkcy0+ZHNfbGluayA9IGJmLT5kYWRkcjsJLyogbGluayB0byBzZWxmICovCisJZHMtPmRzX2RhdGEgPSBiZi0+aW9iYWRkcjsKKwlpZiAoYWgtPmFoX3NldHVwX3J4X2Rlc2MoYWgsIGRzLAorCQkJCSBpb2JfdGFpbHJvb20oaW9iKSwJLyogYnVmZmVyIHNpemUgKi8KKwkJCQkgMCkgIT0gMCkgeworCQlEQkcoImF0aDVrOiBlcnJvciBzZXR0aW5nIHVwIFJYIGRlc2NyaXB0b3IgZm9yICVkIGJ5dGVzXG4iLCBpb2JfdGFpbHJvb20oaW9iKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzYy0+cnhsaW5rICE9IE5VTEwpCisJCSpzYy0+cnhsaW5rID0gYmYtPmRhZGRyOworCXNjLT5yeGxpbmsgPSAmZHMtPmRzX2xpbms7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2F0aDVrX3R4YnVmX3NldHVwKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBhdGg1a19idWYgKmJmKQoreworCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisJc3RydWN0IGF0aDVrX3R4cSAqdHhxID0gJnNjLT50eHE7CisJc3RydWN0IGF0aDVrX2Rlc2MgKmRzID0gYmYtPmRlc2M7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gYmYtPmlvYjsKKwl1bnNpZ25lZCBpbnQgcGt0bGVuLCBmbGFnczsKKwlpbnQgcmV0OworCXUxNiBkdXJhdGlvbiA9IDA7CisJdTE2IGN0c19yYXRlID0gMDsKKworCWZsYWdzID0gQVI1S19UWERFU0NfSU5UUkVRIHwgQVI1S19UWERFU0NfQ0xSRE1BU0s7CisJYmYtPmlvYmFkZHIgPSB2aXJ0X3RvX2J1cyhpb2ItPmRhdGEpOworCXBrdGxlbiA9IGlvYl9sZW4oaW9iKTsKKworCS8qIEZJWE1FOiBJZiB3ZSBhcmUgaW4gZyBtb2RlIGFuZCByYXRlIGlzIGEgQ0NLIHJhdGUKKwkgKiBzdWJ0cmFjdCBhaC0+YWhfdHhwb3dlci50eHBfY2NrX29mZG1fcHdyX2RlbHRhCisJICogZnJvbSB0eCBwb3dlciAodmFsdWUgaXMgaW4gZEIgdW5pdHMgYWxyZWFkeSkgKi8KKwlpZiAoc2MtPmRldi0+cGh5X2ZsYWdzICYgTkVUODAyMTFfUEhZX1VTRV9QUk9URUNUSU9OKSB7CisJCXN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiA9IHNjLT5kZXY7CisKKwkJZmxhZ3MgfD0gQVI1S19UWERFU0NfQ1RTRU5BOworCQljdHNfcmF0ZSA9IHNjLT5od19ydHNjdHNfcmF0ZTsKKwkJZHVyYXRpb24gPSBuZXQ4MDIxMV9jdHNfZHVyYXRpb24oZGV2LCBwa3RsZW4pOworCX0KKwlyZXQgPSBhaC0+YWhfc2V0dXBfdHhfZGVzYyhhaCwgZHMsIHBrdGxlbiwKKwkJCQkgICBJRUVFODAyMTFfVFlQX0ZSQU1FX0hFQURFUl9MRU4sCisJCQkJICAgQVI1S19QS1RfVFlQRV9OT1JNQUwsIHNjLT5wb3dlcl9sZXZlbCAqIDIsCisJCQkJICAgc2MtPmh3X3JhdGUsIEFUSDVLX1JFVFJJRVMsCisJCQkJICAgQVI1S19UWEtFWUlYX0lOVkFMSUQsIDAsIGZsYWdzLAorCQkJCSAgIGN0c19yYXRlLCBkdXJhdGlvbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRzLT5kc19saW5rID0gMDsKKwlkcy0+ZHNfZGF0YSA9IGJmLT5pb2JhZGRyOworCisJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZ0eHEtPnEpOworCWlmICh0eHEtPmxpbmsgPT0gTlVMTCkgLyogaXMgdGhpcyBmaXJzdCBwYWNrZXQ/ICovCisJCWF0aDVrX2h3X3NldF90eGRwKGFoLCB0eHEtPnFudW0sIGJmLT5kYWRkcik7CisJZWxzZSAvKiBubywgc28gb25seSBsaW5rIGl0ICovCisJCSp0eHEtPmxpbmsgPSBiZi0+ZGFkZHI7CisKKwl0eHEtPmxpbmsgPSAmZHMtPmRzX2xpbms7CisJYXRoNWtfaHdfc3RhcnRfdHhfZG1hKGFoLCB0eHEtPnFudW0pOworCW1iKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKipcCisqIERlc2NyaXB0b3JzIHNldHVwICoKK1wqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CithdGg1a19kZXNjX2FsbG9jKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aDVrX2Rlc2MgKmRzOworCXN0cnVjdCBhdGg1a19idWYgKmJmOworCXUzMiBkYTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJLyogYWxsb2NhdGUgZGVzY3JpcHRvcnMgKi8KKwlzYy0+ZGVzY19sZW4gPSBzaXplb2Yoc3RydWN0IGF0aDVrX2Rlc2MpICogKEFUSF9UWEJVRiArIEFUSF9SWEJVRiArIDEpOworCXNjLT5kZXNjID0gbWFsbG9jX2RtYShzYy0+ZGVzY19sZW4sIEFUSDVLX0RFU0NfQUxJR04pOworCWlmIChzYy0+ZGVzYyA9PSBOVUxMKSB7CisJCURCRygiYXRoNWs6IGNhbid0IGFsbG9jYXRlIGRlc2NyaXB0b3JzXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCW1lbXNldChzYy0+ZGVzYywgMCwgc2MtPmRlc2NfbGVuKTsKKwlzYy0+ZGVzY19kYWRkciA9IHZpcnRfdG9fYnVzKHNjLT5kZXNjKTsKKworCWRzID0gc2MtPmRlc2M7CisJZGEgPSBzYy0+ZGVzY19kYWRkcjsKKworCWJmID0gY2FsbG9jKEFUSF9UWEJVRiArIEFUSF9SWEJVRiArIDEsIHNpemVvZihzdHJ1Y3QgYXRoNWtfYnVmKSk7CisJaWYgKGJmID09IE5VTEwpIHsKKwkJREJHKCJhdGg1azogY2FuJ3QgYWxsb2NhdGUgYnVmZmVyIHBvaW50ZXJzXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisJc2MtPmJ1ZnB0ciA9IGJmOworCisJSU5JVF9MSVNUX0hFQUQoJnNjLT5yeGJ1Zik7CisJZm9yIChpID0gMDsgaSA8IEFUSF9SWEJVRjsgaSsrLCBiZisrLCBkcysrLCBkYSArPSBzaXplb2YoKmRzKSkgeworCQliZi0+ZGVzYyA9IGRzOworCQliZi0+ZGFkZHIgPSBkYTsKKwkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZzYy0+cnhidWYpOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZzYy0+dHhidWYpOworCXNjLT50eGJ1Zl9sZW4gPSBBVEhfVFhCVUY7CisJZm9yIChpID0gMDsgaSA8IEFUSF9UWEJVRjsgaSsrLCBiZisrLCBkcysrLCBkYSArPSBzaXplb2YoKmRzKSkgeworCQliZi0+ZGVzYyA9IGRzOworCQliZi0+ZGFkZHIgPSBkYTsKKwkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZzYy0+dHhidWYpOworCX0KKworCXJldHVybiAwOworCitlcnJfZnJlZToKKwlmcmVlX2RtYShzYy0+ZGVzYywgc2MtPmRlc2NfbGVuKTsKK2VycjoKKwlzYy0+ZGVzYyA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2F0aDVrX2Rlc2NfZnJlZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCXN0cnVjdCBhdGg1a19idWYgKmJmOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShiZiwgJnNjLT50eGJ1ZiwgbGlzdCkKKwkJYXRoNWtfdHhidWZfZnJlZShzYywgYmYpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmYsICZzYy0+cnhidWYsIGxpc3QpCisJCWF0aDVrX3J4YnVmX2ZyZWUoc2MsIGJmKTsKKworCS8qIEZyZWUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhbGwgZGVzY3JpcHRvcnMgKi8KKwlmcmVlX2RtYShzYy0+ZGVzYywgc2MtPmRlc2NfbGVuKTsKKworCWZyZWUoc2MtPmJ1ZnB0cik7CisJc2MtPmJ1ZnB0ciA9IE5VTEw7Cit9CisKKworCisKKworLyoqKioqKioqKioqKioqXAorKiBRdWV1ZXMgc2V0dXAgKgorXCoqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CithdGg1a190eHFfc2V0dXAoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgaW50IHF0eXBlLCBpbnQgc3VidHlwZSkKK3sKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXN0cnVjdCBhdGg1a190eHEgKnR4cTsKKwlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gcWkgPSB7CisJCS50cWlfc3VidHlwZSA9IHN1YnR5cGUsCisJCS50cWlfYWlmcyA9IEFSNUtfVFhRX1VTRURFRkFVTFQsCisJCS50cWlfY3dfbWluID0gQVI1S19UWFFfVVNFREVGQVVMVCwKKwkJLnRxaV9jd19tYXggPSBBUjVLX1RYUV9VU0VERUZBVUxUCisJfTsKKwlpbnQgcW51bTsKKworCS8qCisJICogRW5hYmxlIGludGVycnVwdHMgb25seSBmb3IgRU9MIGFuZCBERVNDIGNvbmRpdGlvbnMuCisJICogV2UgbWFyayB0eCBkZXNjcmlwdG9ycyB0byByZWNlaXZlIGEgREVTQyBpbnRlcnJ1cHQKKwkgKiB3aGVuIGEgdHggcXVldWUgZ2V0cyBkZWVwOyBvdGhlcndpc2Ugd2FpdGluZyBmb3IgdGhlCisJICogRU9MIHRvIHJlYXAgZGVzY3JpcHRvcnMuICBOb3RlIHRoYXQgdGhpcyBpcyBkb25lIHRvCisJICogcmVkdWNlIGludGVycnVwdCBsb2FkIGFuZCB0aGlzIG9ubHkgZGVmZXJzIHJlYXBpbmcKKwkgKiBkZXNjcmlwdG9ycywgbmV2ZXIgdHJhbnNtaXR0aW5nIGZyYW1lcy4gIEFzaWRlIGZyb20KKwkgKiByZWR1Y2luZyBpbnRlcnJ1cHRzIHRoaXMgYWxzbyBwZXJtaXRzIG1vcmUgY29uY3VycmVuY3kuCisJICogVGhlIG9ubHkgcG90ZW50aWFsIGRvd25zaWRlIGlzIGlmIHRoZSB0eCBxdWV1ZSBiYWNrcworCSAqIHVwIGluIHdoaWNoIGNhc2UgdGhlIHRvcCBoYWxmIG9mIHRoZSBrZXJuZWwgbWF5IGJhY2t1cAorCSAqIGR1ZSB0byBhIGxhY2sgb2YgdHggZGVzY3JpcHRvcnMuCisJICovCisJcWkudHFpX2ZsYWdzID0gQVI1S19UWFFfRkxBR19UWEVPTElOVF9FTkFCTEUgfAorCQkJCUFSNUtfVFhRX0ZMQUdfVFhERVNDSU5UX0VOQUJMRTsKKwlxbnVtID0gYXRoNWtfaHdfc2V0dXBfdHhfcXVldWUoYWgsIHF0eXBlLCAmcWkpOworCWlmIChxbnVtIDwgMCkgeworCQlEQkcoImF0aDVrOiBjYW4ndCBzZXQgdXAgYSBUWCBxdWV1ZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXR4cSA9ICZzYy0+dHhxOworCWlmICghdHhxLT5zZXR1cCkgeworCQl0eHEtPnFudW0gPSBxbnVtOworCQl0eHEtPmxpbmsgPSBOVUxMOworCQlJTklUX0xJU1RfSEVBRCgmdHhxLT5xKTsKKwkJdHhxLT5zZXR1cCA9IDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXRoNWtfdHhxX2RyYWlucShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfdHhxICp0eHEpCit7CisJc3RydWN0IGF0aDVrX2J1ZiAqYmYsICpiZjA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmYsIGJmMCwgJnR4cS0+cSwgbGlzdCkgeworCQlhdGg1a190eGJ1Zl9mcmVlKHNjLCBiZik7CisKKwkJbGlzdF9kZWwoJmJmLT5saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZzYy0+dHhidWYpOworCQlzYy0+dHhidWZfbGVuKys7CisJfQorCXR4cS0+bGluayA9IE5VTEw7Cit9CisKKy8qCisgKiBEcmFpbiB0aGUgdHJhbnNtaXQgcXVldWVzIGFuZCByZWNsYWltIHJlc291cmNlcy4KKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX3R4cV9jbGVhbnVwKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKKworCWlmICghKHNjLT5zdGF0dXMgJiBBVEhfU1RBVF9JTlZBTElEKSkgeworCQkvKiBkb24ndCB0b3VjaCB0aGUgaGFyZHdhcmUgaWYgbWFya2VkIGludmFsaWQgKi8KKwkJaWYgKHNjLT50eHEuc2V0dXApIHsKKwkJCWF0aDVrX2h3X3N0b3BfdHhfZG1hKGFoLCBzYy0+dHhxLnFudW0pOworCQkJREJHKCJhdGg1azogdHhxIFslZF0gJXgsIGxpbmsgJXBcbiIsCisJCQkgICAgc2MtPnR4cS5xbnVtLAorCQkJICAgIGF0aDVrX2h3X2dldF90eGRwKGFoLCBzYy0+dHhxLnFudW0pLAorCQkJICAgIHNjLT50eHEubGluayk7CisJCX0KKwl9CisKKwlpZiAoc2MtPnR4cS5zZXR1cCkKKwkJYXRoNWtfdHhxX2RyYWlucShzYywgJnNjLT50eHEpOworfQorCitzdGF0aWMgdm9pZAorYXRoNWtfdHhxX3JlbGVhc2Uoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3sKKwlpZiAoc2MtPnR4cS5zZXR1cCkgeworCQlhdGg1a19od19yZWxlYXNlX3R4X3F1ZXVlKHNjLT5haCk7CisJCXNjLT50eHEuc2V0dXAgPSAwOworCX0KK30KKworCisKKworLyoqKioqKioqKioqKipcCisqIFJYIEhhbmRsaW5nICoKK1wqKioqKioqKioqKioqLworCisvKgorICogRW5hYmxlIHRoZSByZWNlaXZlIGgvdyBmb2xsb3dpbmcgYSByZXNldC4KKyAqLworc3RhdGljIGludAorYXRoNWtfcnhfc3RhcnQoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXN0cnVjdCBhdGg1a19idWYgKmJmOworCWludCByZXQ7CisKKwlzYy0+cnhidWZzaXplID0gSUVFRTgwMjExX01BWF9MRU47CisJaWYgKHNjLT5yeGJ1ZnNpemUgJSBzYy0+Y2FjaGVsc3ogIT0gMCkKKwkJc2MtPnJ4YnVmc2l6ZSArPSBzYy0+Y2FjaGVsc3ogLSAoc2MtPnJ4YnVmc2l6ZSAlIHNjLT5jYWNoZWxzeik7CisKKwlzYy0+cnhsaW5rID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmYsICZzYy0+cnhidWYsIGxpc3QpIHsKKwkJcmV0ID0gYXRoNWtfcnhidWZfc2V0dXAoc2MsIGJmKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwliZiA9IGxpc3RfZW50cnkoc2MtPnJ4YnVmLm5leHQsIHN0cnVjdCBhdGg1a19idWYsIGxpc3QpOworCisJYXRoNWtfaHdfc2V0X3J4ZHAoYWgsIGJmLT5kYWRkcik7CisJYXRoNWtfaHdfc3RhcnRfcnhfZG1hKGFoKTsJLyogZW5hYmxlIHJlY3YgZGVzY3JpcHRvcnMgKi8KKwlhdGg1a19tb2RlX3NldHVwKHNjKTsJCS8qIHNldCBmaWx0ZXJzLCBldGMuICovCisJYXRoNWtfaHdfc3RhcnRfcnhfcGN1KGFoKTsJLyogcmUtZW5hYmxlIFBDVS9ETUEgZW5naW5lICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERpc2FibGUgdGhlIHJlY2VpdmUgaC93IGluIHByZXBhcmF0aW9uIGZvciBhIHJlc2V0LgorICovCitzdGF0aWMgdm9pZAorYXRoNWtfcnhfc3RvcChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisKKwlhdGg1a19od19zdG9wX3J4X3BjdShhaCk7CS8qIGRpc2FibGUgUENVICovCisJYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcihhaCwgMCk7CS8qIGNsZWFyIHJlY3YgZmlsdGVyICovCisJYXRoNWtfaHdfc3RvcF9yeF9kbWEoYWgpOwkvKiBkaXNhYmxlIERNQSBlbmdpbmUgKi8KKworCXNjLT5yeGxpbmsgPSBOVUxMOwkJLyoganVzdCBpbiBjYXNlICovCit9CisKK3N0YXRpYyB2b2lkCithdGg1a19oYW5kbGVfcngoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzIHJzOworCXN0cnVjdCBpb19idWZmZXIgKmlvYiwgKm5leHRfaW9iOworCXUzMiBuZXh0X2lvYl9hZGRyOworCXN0cnVjdCBhdGg1a19idWYgKmJmLCAqYmZfbGFzdDsKKwlzdHJ1Y3QgYXRoNWtfZGVzYyAqZHM7CisJaW50IHJldDsKKworCW1lbXNldCgmcnMsIDAsIHNpemVvZihycykpOworCisJaWYgKGxpc3RfZW1wdHkoJnNjLT5yeGJ1ZikpIHsKKwkJREJHKCJhdGg1azogZW1wdHkgcnggYnVmIHBvb2xcbiIpOworCQlyZXR1cm47CisJfQorCisJYmZfbGFzdCA9IGxpc3RfZW50cnkoc2MtPnJ4YnVmLnByZXYsIHN0cnVjdCBhdGg1a19idWYsIGxpc3QpOworCisJZG8geworCQliZiA9IGxpc3RfZW50cnkoc2MtPnJ4YnVmLm5leHQsIHN0cnVjdCBhdGg1a19idWYsIGxpc3QpOworCQlhc3NlcnQoYmYtPmlvYiAhPSBOVUxMKTsKKwkJaW9iID0gYmYtPmlvYjsKKwkJZHMgPSBiZi0+ZGVzYzsKKworCQkvKgorCQkgKiBsYXN0IGJ1ZmZlciBtdXN0IG5vdCBiZSBmcmVlZCB0byBlbnN1cmUgcHJvcGVyIGhhcmR3YXJlCisJCSAqIGZ1bmN0aW9uLiBXaGVuIHRoZSBoYXJkd2FyZSBmaW5pc2hlcyBhbHNvIGEgcGFja2V0IG5leHQgdG8KKwkJICogaXQsIHdlIGFyZSBzdXJlLCBpdCBkb2Vzbid0IHVzZSBpdCBhbnltb3JlIGFuZCB3ZSBjYW4gZ28gb24uCisJCSAqLworCQlpZiAoYmZfbGFzdCA9PSBiZikKKwkJCWJmLT5mbGFncyB8PSAxOworCQlpZiAoYmYtPmZsYWdzKSB7CisJCQlzdHJ1Y3QgYXRoNWtfYnVmICpiZl9uZXh0ID0gbGlzdF9lbnRyeShiZi0+bGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3QgYXRoNWtfYnVmLCBsaXN0KTsKKwkJCXJldCA9IHNjLT5haC0+YWhfcHJvY19yeF9kZXNjKHNjLT5haCwgYmZfbmV4dC0+ZGVzYywKKwkJCQkJJnJzKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQliZi0+ZmxhZ3MgJj0gfjE7CisJCQkvKiBza2lwIHRoZSBvdmVyd3JpdHRlbiBvbmUgKGV2ZW4gc3RhdHVzIGlzIG1hcnRpYW4pICovCisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlyZXQgPSBzYy0+YWgtPmFoX3Byb2NfcnhfZGVzYyhzYy0+YWgsIGRzLCAmcnMpOworCQlpZiAocmV0KSB7CisJCQlpZiAocmV0ICE9IC1FSU5QUk9HUkVTUykgeworCQkJCURCRygiYXRoNWs6IGVycm9yIGluIHByb2Nlc3NpbmcgcnggZGVzYzogJXNcbiIsCisJCQkJICAgIHN0cmVycm9yKHJldCkpOworCQkJCW5ldDgwMjExX3J4X2VycihzYy0+ZGV2LCBOVUxMLCAtcmV0KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogbm9ybWFsIHJldHVybiwgcmVhY2hlZCBlbmQgb2YKKwkJCQkgICBhdmFpbGFibGUgZGVzY3JpcHRvcnMgKi8KKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChycy5yc19tb3JlKSB7CisJCQlEQkcoImF0aDVrOiB1bnN1cHBvcnRlZCBmcmFnbWVudGVkIHJ4XG4iKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmIChycy5yc19zdGF0dXMpIHsKKwkJCWlmIChycy5yc19zdGF0dXMgJiBBUjVLX1JYRVJSX1BIWSkgeworCQkJCS8qIFRoZXNlIGFyZSB1bmNvbW1vbiwgYW5kIG1heSBpbmRpY2F0ZSBhIHJlYWwgcHJvYmxlbS4gKi8KKwkJCQluZXQ4MDIxMV9yeF9lcnIoc2MtPmRldiwgTlVMTCwgRUlPKTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlpZiAocnMucnNfc3RhdHVzICYgQVI1S19SWEVSUl9DUkMpIHsKKwkJCQkvKiBUaGVzZSBvY2N1ciAqYWxsIHRoZSB0aW1lKi4gKi8KKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlpZiAocnMucnNfc3RhdHVzICYgQVI1S19SWEVSUl9ERUNSWVBUKSB7CisJCQkJLyoKKwkJCQkgKiBEZWNyeXB0IGVycm9yLiAgSWYgdGhlIGVycm9yIG9jY3VycmVkCisJCQkJICogYmVjYXVzZSB0aGVyZSB3YXMgbm8gaGFyZHdhcmUga2V5LCB0aGVuCisJCQkJICogbGV0IHRoZSBmcmFtZSB0aHJvdWdoIHNvIHRoZSB1cHBlciBsYXllcnMKKwkJCQkgKiBjYW4gcHJvY2VzcyBpdC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciA1MjEwCisJCQkJICogcGFydHMgd2hpY2ggaGF2ZSBubyB3YXkgdG8gc2V0dXAgYSBgYGNsZWFyJycKKwkJCQkgKiBrZXkgY2FjaGUgZW50cnkuCisJCQkJICoKKwkJCQkgKiBYWFggZG8ga2V5IGNhY2hlIGZhdWx0aW5nCisJCQkJICovCisJCQkJaWYgKHJzLnJzX2tleWl4ID09IEFSNUtfUlhLRVlJWF9JTlZBTElEICYmCisJCQkJICAgICEocnMucnNfc3RhdHVzICYgQVI1S19SWEVSUl9DUkMpKQorCQkJCQlnb3RvIGFjY2VwdDsKKwkJCX0KKworCQkJLyogYW55IG90aGVyIGVycm9yLCB1bmhhbmRsZWQgKi8KKwkJCURCRygiYXRoNWs6IHBhY2tldCByeCBzdGF0dXMgJXhcbiIsIHJzLnJzX3N0YXR1cyk7CisJCQlnb3RvIG5leHQ7CisJCX0KK2FjY2VwdDoKKwkJbmV4dF9pb2IgPSBhdGg1a19yeF9pb2JfYWxsb2Moc2MsICZuZXh0X2lvYl9hZGRyKTsKKworCQkvKgorCQkgKiBJZiB3ZSBjYW4ndCByZXBsYWNlIGJmLT5pb2Igd2l0aCBhIG5ldyBpb2IgdW5kZXIgbWVtb3J5CisJCSAqIHByZXNzdXJlLCBqdXN0IHNraXAgdGhpcyBwYWNrZXQKKwkJICovCisJCWlmICghbmV4dF9pb2IpIHsKKwkJCURCRygiYXRoNWs6IGRyb3BwaW5nIHBhY2tldCB1bmRlciBtZW1vcnkgcHJlc3N1cmVcbiIpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJaW9iX3B1dChpb2IsIHJzLnJzX2RhdGFsZW4pOworCisJCS8qIFRoZSBNQUMgaGVhZGVyIGlzIHBhZGRlZCB0byBoYXZlIDMyLWJpdCBib3VuZGFyeSBpZiB0aGUKKwkJICogcGFja2V0IHBheWxvYWQgaXMgbm9uLXplcm8uIEhvd2V2ZXIsIGdQWEUgb25seQorCQkgKiBzdXBwb3J0cyBzdGFuZGFyZCA4MDIuMTEgcGFja2V0cyB3aXRoIDI0LWJ5dGUKKwkJICogaGVhZGVyLCBzbyBubyBwYWRkaW5nIGNvcnJlY3Rpb24gc2hvdWxkIGJlIG5lZWRlZC4KKwkJICovCisKKwkJREJHMigiYXRoNWs6IHJ4ICVkIGJ5dGVzLCBzaWduYWwgJWRcbiIsIHJzLnJzX2RhdGFsZW4sCisJCSAgICAgcnMucnNfcnNzaSk7CisKKwkJbmV0ODAyMTFfcngoc2MtPmRldiwgaW9iLCBycy5yc19yc3NpLAorCQkJICAgIGF0aDVrX2h3X3JpeF90b19iaXRyYXRlKHJzLnJzX3JhdGUpKTsKKworCQliZi0+aW9iID0gbmV4dF9pb2I7CisJCWJmLT5pb2JhZGRyID0gbmV4dF9pb2JfYWRkcjsKK25leHQ6CisJCWxpc3RfZGVsKCZiZi0+bGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJmJmLT5saXN0LCAmc2MtPnJ4YnVmKTsKKwl9IHdoaWxlIChhdGg1a19yeGJ1Zl9zZXR1cChzYywgYmYpID09IDApOworfQorCisKKworCisvKioqKioqKioqKioqKlwKKyogVFggSGFuZGxpbmcgKgorXCoqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCithdGg1a190eF9wcm9jZXNzcShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfdHhxICp0eHEpCit7CisJc3RydWN0IGF0aDVrX3R4X3N0YXR1cyB0czsKKwlzdHJ1Y3QgYXRoNWtfYnVmICpiZiwgKmJmMDsKKwlzdHJ1Y3QgYXRoNWtfZGVzYyAqZHM7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iOworCWludCByZXQ7CisKKwltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShiZiwgYmYwLCAmdHhxLT5xLCBsaXN0KSB7CisJCWRzID0gYmYtPmRlc2M7CisKKwkJcmV0ID0gc2MtPmFoLT5haF9wcm9jX3R4X2Rlc2Moc2MtPmFoLCBkcywgJnRzKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHJldCAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJCQlEQkcoImF0aDVrOiBlcnJvciBpbiBwcm9jZXNzaW5nIHR4IGRlc2M6ICVzXG4iLAorCQkJCSAgICBzdHJlcnJvcihyZXQpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogbm9ybWFsIHJldHVybiwgcmVhY2hlZCBlbmQgb2YgdHggY29tcGxldGlvbnMgKi8KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaW9iID0gYmYtPmlvYjsKKwkJYmYtPmlvYiA9IE5VTEw7CisKKwkJREJHMigiYXRoNWs6IHR4ICVkIGJ5dGVzIGNvbXBsZXRlLCAlZCByZXRyaWVzXG4iLAorCQkgICAgIGlvYl9sZW4oaW9iKSwgdHMudHNfcmV0cnlbMF0pOworCisJCW5ldDgwMjExX3R4X2NvbXBsZXRlKHNjLT5kZXYsIGlvYiwgdHMudHNfcmV0cnlbMF0sCisJCQkJICAgICB0cy50c19zdGF0dXMgPyBFSU8gOiAwKTsKKworCQlsaXN0X2RlbCgmYmYtPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZiZi0+bGlzdCwgJnNjLT50eGJ1Zik7CisJCXNjLT50eGJ1Zl9sZW4rKzsKKwl9CisKKwlpZiAobGlzdF9lbXB0eSgmdHhxLT5xKSkKKwkJdHhxLT5saW5rID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2F0aDVrX2hhbmRsZV90eChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCWF0aDVrX3R4X3Byb2Nlc3NxKHNjLCAmc2MtPnR4cSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqXAorKiBJbnRlcnJ1cHQgaGFuZGxpbmcgKgorXCoqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYXRoNWtfaXJxKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2LT5wcml2OworCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisKKwlzYy0+aXJxX2VuYSA9IGVuYWJsZTsKKwlhaC0+YWhfaWVyID0gZW5hYmxlID8gQVI1S19JRVJfRU5BQkxFIDogQVI1S19JRVJfRElTQUJMRTsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX2llciwgQVI1S19JRVIpOworCWF0aDVrX2h3X3NldF9pbXIoYWgsIHNjLT5pbWFzayk7Cit9CisKK3N0YXRpYyBpbnQKK2F0aDVrX2luaXQoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCWludCByZXQsIGk7CisKKwkvKgorCSAqIFN0b3AgYW55dGhpbmcgcHJldmlvdXNseSBzZXR1cC4gIFRoaXMgaXMgc2FmZQorCSAqIG5vIG1hdHRlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggb3Igbm90LgorCSAqLworCWF0aDVrX3N0b3BfaHcoc2MpOworCisJLyoKKwkgKiBUaGUgYmFzaWMgaW50ZXJmYWNlIHRvIHNldHRpbmcgdGhlIGhhcmR3YXJlIGluIGEgZ29vZAorCSAqIHN0YXRlIGlzIGBgcmVzZXQnJy4gIE9uIHJldHVybiB0aGUgaGFyZHdhcmUgaXMga25vd24gdG8KKwkgKiBiZSBwb3dlcmVkIHVwIGFuZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuICBUaGlzIG11c3QKKwkgKiBiZSBmb2xsb3dlZCBieSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYXBwcm9wcmlhdGUgYml0cworCSAqIGFuZCB0aGVuIHNldHVwIG9mIHRoZSBpbnRlcnJ1cHQgbWFzay4KKwkgKi8KKwlzYy0+Y3VyY2hhbiA9IHNjLT5kZXYtPmNoYW5uZWxzICsgc2MtPmRldi0+Y2hhbm5lbDsKKwlzYy0+Y3VyYmFuZCA9IHNjLT5jdXJjaGFuLT5iYW5kOworCXNjLT5pbWFzayA9IEFSNUtfSU5UX1JYT0sgfCBBUjVLX0lOVF9SWEVSUiB8IEFSNUtfSU5UX1JYRU9MIHwKKwkJQVI1S19JTlRfUlhPUk4gfCBBUjVLX0lOVF9UWERFU0MgfCBBUjVLX0lOVF9UWEVPTCB8CisJCUFSNUtfSU5UX0ZBVEFMIHwgQVI1S19JTlRfR0xPQkFMOworCXJldCA9IGF0aDVrX3Jlc2V0KHNjLCBOVUxMKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlhdGg1a19yZmtpbGxfaHdfc3RhcnQoYWgpOworCisJLyoKKwkgKiBSZXNldCB0aGUga2V5IGNhY2hlIHNpbmNlIHNvbWUgcGFydHMgZG8gbm90IHJlc2V0IHRoZQorCSAqIGNvbnRlbnRzIG9uIGluaXRpYWwgcG93ZXIgdXAgb3IgcmVzdW1lIGZyb20gc3VzcGVuZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVI1S19LRVlUQUJMRV9TSVpFOyBpKyspCisJCWF0aDVrX2h3X3Jlc2V0X2tleShhaCwgaSk7CisKKwkvKiBTZXQgYWNrIHRvIGJlIHNlbnQgYXQgbG93IGJpdC1yYXRlcyAqLworCWF0aDVrX2h3X3NldF9hY2tfYml0cmF0ZV9oaWdoKGFoLCAwKTsKKworCXJldCA9IDA7Citkb25lOgorCW1iKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYXRoNWtfc3RvcF9odyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisKKwkvKgorCSAqIFNodXRkb3duIHRoZSBoYXJkd2FyZSBhbmQgZHJpdmVyOgorCSAqICAgIHN0b3Agb3V0cHV0IGZyb20gYWJvdmUKKwkgKiAgICBkaXNhYmxlIGludGVycnVwdHMKKwkgKiAgICB0dXJuIG9mZiB0aW1lcnMKKwkgKiAgICB0dXJuIG9mZiB0aGUgcmFkaW8KKwkgKiAgICBjbGVhciB0cmFuc21pdCBtYWNoaW5lcnkKKwkgKiAgICBjbGVhciByZWNlaXZlIG1hY2hpbmVyeQorCSAqICAgIGRyYWluIGFuZCByZWxlYXNlIHR4IHF1ZXVlcworCSAqICAgIHJlY2xhaW0gYmVhY29uIHJlc291cmNlcworCSAqICAgIHBvd2VyIGRvd24gaGFyZHdhcmUKKwkgKgorCSAqIE5vdGUgdGhhdCBzb21lIG9mIHRoaXMgd29yayBpcyBub3QgcG9zc2libGUgaWYgdGhlCisJICogaGFyZHdhcmUgaXMgZ29uZSAoaW52YWxpZCkuCisJICovCisKKwlpZiAoIShzYy0+c3RhdHVzICYgQVRIX1NUQVRfSU5WQUxJRCkpIHsKKwkJYXRoNWtfaHdfc2V0X2ltcihhaCwgMCk7CisJfQorCWF0aDVrX3R4cV9jbGVhbnVwKHNjKTsKKwlpZiAoIShzYy0+c3RhdHVzICYgQVRIX1NUQVRfSU5WQUxJRCkpIHsKKwkJYXRoNWtfcnhfc3RvcChzYyk7CisJCWF0aDVrX2h3X3BoeV9kaXNhYmxlKGFoKTsKKwl9IGVsc2UKKwkJc2MtPnJ4bGluayA9IE5VTEw7CisKKwlhdGg1a19yZmtpbGxfaHdfc3RvcChzYy0+YWgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithdGg1a19wb2xsKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2LT5wcml2OworCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisJZW51bSBhdGg1a19pbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBjb3VudGVyID0gMTAwMDsKKworCWlmIChjdXJydGlja3MoKSAtIHNjLT5sYXN0X2NhbGliX3RpY2tzID4KKwkgICAgQVRINUtfQ0FMSUJfSU5URVJWQUwgKiB0aWNrc19wZXJfc2VjKCkpIHsKKwkJYXRoNWtfY2FsaWJyYXRlKHNjKTsKKwkJc2MtPmxhc3RfY2FsaWJfdGlja3MgPSBjdXJydGlja3MoKTsKKwl9CisKKwlpZiAoKHNjLT5zdGF0dXMgJiBBVEhfU1RBVF9JTlZBTElEKSB8fAorCSAgICAoc2MtPmlycV9lbmEgJiYgIWF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhhaCkpKQorCQlyZXR1cm47CisKKwlkbyB7CisJCWF0aDVrX2h3X2dldF9pc3IoYWgsICZzdGF0dXMpOwkJLyogTkI6IGNsZWFycyBJUlEgdG9vICovCisJCURCR1AoImF0aDVrOiBzdGF0dXMgJSN4LyUjeFxuIiwgc3RhdHVzLCBzYy0+aW1hc2spOworCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfRkFUQUwpIHsKKwkJCS8qCisJCQkgKiBGYXRhbCBlcnJvcnMgYXJlIHVucmVjb3ZlcmFibGUuCisJCQkgKiBUeXBpY2FsbHkgdGhlc2UgYXJlIGNhdXNlZCBieSBETUEgZXJyb3JzLgorCQkJICovCisJCQlEQkcoImF0aDVrOiBmYXRhbCBlcnJvciwgcmVzZXR0aW5nXG4iKTsKKwkJCWF0aDVrX3Jlc2V0X3dha2Uoc2MpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIEFSNUtfSU5UX1JYT1JOKSB7CisJCQlEQkcoImF0aDVrOiByeCBvdmVycnVuLCByZXNldHRpbmdcbiIpOworCQkJYXRoNWtfcmVzZXRfd2FrZShzYyk7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfUlhFT0wpIHsKKwkJCQkvKgorCQkJCSAqIE5COiB0aGUgaGFyZHdhcmUgc2hvdWxkIHJlLXJlYWQgdGhlIGxpbmsgd2hlbgorCQkJCSAqICAgICBSWEUgYml0IGlzIHdyaXR0ZW4sIGJ1dCBpdCBkb2Vzbid0IHdvcmsgYXQKKwkJCQkgKiAgICAgbGVhc3Qgb24gb2xkZXIgaGFyZHdhcmUgcmV2cy4KKwkJCQkgKi8KKwkJCQlEQkcoImF0aDVrOiByeCBFT0xcbiIpOworCQkJCXNjLT5yeGxpbmsgPSBOVUxMOworCQkJfQorCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX1RYVVJOKSB7CisJCQkJLyogYnVtcCB0eCB0cmlnZ2VyIGxldmVsICovCisJCQkJREJHKCJhdGg1azogdHggdW5kZXJydW5cbiIpOworCQkJCWF0aDVrX2h3X3VwZGF0ZV90eF90cmlnbGV2ZWwoYWgsIDEpOworCQkJfQorCQkJaWYgKHN0YXR1cyAmIChBUjVLX0lOVF9SWE9LIHwgQVI1S19JTlRfUlhFUlIpKQorCQkJCWF0aDVrX2hhbmRsZV9yeChzYyk7CisJCQlpZiAoc3RhdHVzICYgKEFSNUtfSU5UX1RYT0sgfCBBUjVLX0lOVF9UWERFU0MKKwkJCQkgICAgICB8IEFSNUtfSU5UX1RYRVJSIHwgQVI1S19JTlRfVFhFT0wpKQorCQkJCWF0aDVrX2hhbmRsZV90eChzYyk7CisJCX0KKwl9IHdoaWxlIChhdGg1a19od19pc19pbnRyX3BlbmRpbmcoYWgpICYmIGNvdW50ZXItLSA+IDApOworCisJaWYgKCFjb3VudGVyKQorCQlEQkcoImF0aDVrOiB0b28gbWFueSBpbnRlcnJ1cHRzLCBnaXZpbmcgdXAgZm9yIG5vd1xuIik7Cit9CisKKy8qCisgKiBQZXJpb2RpY2FsbHkgcmVjYWxpYnJhdGUgdGhlIFBIWSB0byBhY2NvdW50CisgKiBmb3IgdGVtcGVyYXR1cmUvZW52aXJvbm1lbnQgY2hhbmdlcy4KKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisKKwlpZiAoYXRoNWtfaHdfZ2FpbmZfY2FsaWJyYXRlKGFoKSA9PSBBUjVLX1JGR0FJTl9ORUVEX0NIQU5HRSkgeworCQkvKgorCQkgKiBSZmdhaW4gaXMgb3V0IG9mIGJvdW5kcywgcmVzZXQgdGhlIGNoaXAKKwkJICogdG8gbG9hZCBuZXcgZ2FpbiB2YWx1ZXMuCisJCSAqLworCQlEQkcoImF0aDVrOiByZXNldHRpbmcgZm9yIGNhbGlicmF0aW9uXG4iKTsKKwkJYXRoNWtfcmVzZXRfd2FrZShzYyk7CisJfQorCWlmIChhdGg1a19od19waHlfY2FsaWJyYXRlKGFoLCBzYy0+Y3VyY2hhbikpCisJCURCRygiYXRoNWs6IGNhbGlicmF0aW9uIG9mIGNoYW5uZWwgJWQgZmFpbGVkXG4iLAorCQkgICAgc2MtPmN1cmNoYW4tPmNoYW5uZWxfbnIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKlwKKyogTmV0ODAyMTEgZnVuY3Rpb25zICoKK1wqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorYXRoNWtfdHgoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IpCit7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXRoNWtfYnVmICpiZjsKKwlpbnQgcmM7CisKKwkvKgorCSAqIFRoZSBoYXJkd2FyZSBleHBlY3RzIHRoZSBoZWFkZXIgcGFkZGVkIHRvIDQgYnl0ZSBib3VuZGFyaWVzLgorCSAqIGdQWEUgb25seSBldmVyIHNlbmRzIDI0LWJ5dGUgaGVhZGVycywgc28gbm8gYWN0aW9uIG5lY2Vzc2FyeS4KKwkgKi8KKworCWlmIChsaXN0X2VtcHR5KCZzYy0+dHhidWYpKSB7CisJCURCRygiYXRoNWs6IGRyb3BwaW5nIHBhY2tldCBiZWNhdXNlIG5vIHR4IGJ1ZnMgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCWJmID0gbGlzdF9lbnRyeShzYy0+dHhidWYubmV4dCwgc3RydWN0IGF0aDVrX2J1ZiwgbGlzdCk7CisJbGlzdF9kZWwoJmJmLT5saXN0KTsKKwlzYy0+dHhidWZfbGVuLS07CisKKwliZi0+aW9iID0gaW9iOworCisJaWYgKChyYyA9IGF0aDVrX3R4YnVmX3NldHVwKHNjLCBiZikpICE9IDApIHsKKwkJYmYtPmlvYiA9IE5VTEw7CisJCWxpc3RfYWRkX3RhaWwoJmJmLT5saXN0LCAmc2MtPnR4YnVmKTsKKwkJc2MtPnR4YnVmX2xlbisrOworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogUmVzZXQgdGhlIGhhcmR3YXJlLiAgSWYgY2hhbiBpcyBub3QgTlVMTCwgdGhlbiBhbHNvIHBhdXNlIHJ4L3R4CisgKiBhbmQgY2hhbmdlIHRvIHRoZSBnaXZlbiBjaGFubmVsLgorICovCitzdGF0aWMgaW50CithdGg1a19yZXNldChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCWludCByZXQ7CisKKwlpZiAoY2hhbikgeworCQlhdGg1a19od19zZXRfaW1yKGFoLCAwKTsKKwkJYXRoNWtfdHhxX2NsZWFudXAoc2MpOworCQlhdGg1a19yeF9zdG9wKHNjKTsKKworCQlzYy0+Y3VyY2hhbiA9IGNoYW47CisJCXNjLT5jdXJiYW5kID0gY2hhbi0+YmFuZDsKKwl9CisKKwlyZXQgPSBhdGg1a19od19yZXNldChhaCwgc2MtPmN1cmNoYW4sIDEpOworCWlmIChyZXQpIHsKKwkJREJHKCJhdGg1azogY2FuJ3QgcmVzZXQgaGFyZHdhcmU6ICVzXG4iLCBzdHJlcnJvcihyZXQpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBhdGg1a19yeF9zdGFydChzYyk7CisJaWYgKHJldCkgeworCQlEQkcoImF0aDVrOiBjYW4ndCBzdGFydCByeCBsb2dpYzogJXNcbiIsIHN0cmVycm9yKHJldCkpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogQ2hhbmdlIGNoYW5uZWxzIGFuZCB1cGRhdGUgdGhlIGgvdyByYXRlIG1hcCBpZiB3ZSdyZSBzd2l0Y2hpbmc7CisJICogZS5nLiAxMWEgdG8gMTFiL2cuCisJICoKKwkgKiBXZSBtYXkgYmUgZG9pbmcgYSByZXNldCBpbiByZXNwb25zZSB0byBhbiBpb2N0bCB0aGF0IGNoYW5nZXMgdGhlCisJICogY2hhbm5lbCBzbyB1cGRhdGUgYW55IHN0YXRlIHRoYXQgbWlnaHQgY2hhbmdlIGFzIGEgcmVzdWx0LgorCSAqCisJICogWFhYIG5lZWRlZD8KKwkgKi8KKy8qCWF0aDVrX2NoYW5fY2hhbmdlKHNjLCBjKTsgKi8KKworCS8qIFJlZW5hYmxlIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5ICovCisJYXRoNWtfaXJxKHNjLT5kZXYsIHNjLT5pcnFfZW5hKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDVrX3Jlc2V0X3dha2Uoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3sKKwlyZXR1cm4gYXRoNWtfcmVzZXQoc2MsIHNjLT5jdXJjaGFuKTsKK30KKworc3RhdGljIGludCBhdGg1a19zdGFydChzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldi0+cHJpdjsKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBhdGg1a19pbml0KHNjKSkgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXNjLT5hc3NvYyA9IDA7CisJYXRoNWtfY29uZmlndXJlX2ZpbHRlcihzYyk7CisJYXRoNWtfaHdfc2V0X2xsYWRkcihzYy0+YWgsIGRldi0+bmV0ZGV2LT5sbF9hZGRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGg1a19zdG9wKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2LT5wcml2OworCXU4IG1hY1tFVEhfQUxFTl0gPSB7fTsKKworCWF0aDVrX2h3X3NldF9sbGFkZHIoc2MtPmFoLCBtYWMpOworCisJYXRoNWtfc3RvcF9odyhzYyk7Cit9CisKK3N0YXRpYyBpbnQKK2F0aDVrX2NvbmZpZyhzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCBjaGFuZ2VkKQoreworCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBkZXYtPnByaXY7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKKwlzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbiA9ICZkZXYtPmNoYW5uZWxzW2Rldi0+Y2hhbm5lbF07CisJaW50IHJldDsKKworCWlmIChjaGFuZ2VkICYgTkVUODAyMTFfQ0ZHX0NIQU5ORUwpIHsKKwkJc2MtPnBvd2VyX2xldmVsID0gY2hhbi0+bWF4cG93ZXI7CisJCWlmICgocmV0ID0gYXRoNWtfY2hhbl9zZXQoc2MsIGNoYW4pKSAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoKGNoYW5nZWQgJiBORVQ4MDIxMV9DRkdfUkFURSkgfHwKKwkgICAgKGNoYW5nZWQgJiBORVQ4MDIxMV9DRkdfUEhZX1BBUkFNUykpIHsKKwkJaW50IHNwbWJsID0gQVRINUtfU1BNQkxfTk87CisJCXUxNiByYXRlID0gZGV2LT5yYXRlc1tkZXYtPnJhdGVdOworCQl1MTYgc2xvd3JhdGUgPSBkZXYtPnJhdGVzW2Rldi0+cnRzY3RzX3JhdGVdOworCQlpbnQgaTsKKworCQlpZiAoZGV2LT5waHlfZmxhZ3MgJiBORVQ4MDIxMV9QSFlfVVNFX1NIT1JUX1BSRUFNQkxFKQorCQkJc3BtYmwgPSBBVEg1S19TUE1CTF9ZRVM7CisKKwkJZm9yIChpID0gMDsgaSA8IEFUSDVLX05SX1JBVEVTOyBpKyspIHsKKwkJCWlmIChhdGg1a19yYXRlc1tpXS5iaXRyYXRlID09IHJhdGUgJiYKKwkJCSAgICAoYXRoNWtfcmF0ZXNbaV0uc2hvcnRfcG1ibCAmIHNwbWJsKSkKKwkJCQlzYy0+aHdfcmF0ZSA9IGF0aDVrX3JhdGVzW2ldLmh3X2NvZGU7CisKKwkJCWlmIChhdGg1a19yYXRlc1tpXS5iaXRyYXRlID09IHNsb3dyYXRlICYmCisJCQkgICAgKGF0aDVrX3JhdGVzW2ldLnNob3J0X3BtYmwgJiBzcG1ibCkpCisJCQkJc2MtPmh3X3J0c2N0c19yYXRlID0gYXRoNWtfcmF0ZXNbaV0uaHdfY29kZTsKKwkJfQorCX0KKworCWlmIChjaGFuZ2VkICYgTkVUODAyMTFfQ0ZHX0FTU09DKSB7CisJCXNjLT5hc3NvYyA9ICEhKGRldi0+c3RhdGUgJiBORVQ4MDIxMV9BU1NPQ0lBVEVEKTsKKwkJaWYgKHNjLT5hc3NvYykgeworCQkJbWVtY3B5KGFoLT5haF9ic3NpZCwgZGV2LT5ic3NpZCwgRVRIX0FMRU4pOworCQl9IGVsc2UgeworCQkJbWVtc2V0KGFoLT5haF9ic3NpZCwgMHhmZiwgRVRIX0FMRU4pOworCQl9CisJCWF0aDVrX2h3X3NldF9hc3NvY2lkKGFoLCBhaC0+YWhfYnNzaWQsIDApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogbyBhbHdheXMgYWNjZXB0IHVuaWNhc3QsIGJyb2FkY2FzdCwgYW5kIG11bHRpY2FzdCB0cmFmZmljCisgKiBvIG11bHRpY2FzdCB0cmFmZmljIGZvciBhbGwgQlNTSURzIHdpbGwgYmUgZW5hYmxlZCBpZiBtYWM4MDIxMQorICogICBzYXlzIGl0IHNob3VsZCBiZQorICogbyBtYWludGFpbiBjdXJyZW50IHN0YXRlIG9mIHBoeSBvZmRtIG9yIHBoeSBjY2sgZXJyb3IgcmVjZXB0aW9uLgorICogICBJZiB0aGUgaGFyZHdhcmUgZGV0ZWN0cyBhbnkgb2YgdGhlc2UgdHlwZSBvZiBlcnJvcnMgdGhlbgorICogICBhdGg1a19od19nZXRfcnhfZmlsdGVyKCkgd2lsbCBwYXNzIHRvIHVzIHRoZSByZXNwZWN0aXZlCisgKiAgIGhhcmR3YXJlIGZpbHRlcnMgdG8gYmUgYWJsZSB0byByZWNlaXZlIHRoZXNlIHR5cGUgb2YgZnJhbWVzLgorICogbyBwcm9iZSByZXF1ZXN0IGZyYW1lcyBhcmUgYWNjZXB0ZWQgb25seSB3aGVuIG9wZXJhdGluZyBpbgorICogICBob3N0YXAsIGFkaG9jLCBvciBtb25pdG9yIG1vZGVzCisgKiBvIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlIGFjY29yZGluZyB0byB0aGUgaW50ZXJmYWNlIHN0YXRlCisgKiBvIGFjY2VwdCBiZWFjb25zOgorICogICAtIHdoZW4gb3BlcmF0aW5nIGluIGFkaG9jIG1vZGUgc28gdGhlIDgwMi4xMSBsYXllciBjcmVhdGVzCisgKiAgICAgbm9kZSB0YWJsZSBlbnRyaWVzIGZvciBwZWVycywKKyAqICAgLSB3aGVuIG9wZXJhdGluZyBpbiBzdGF0aW9uIG1vZGUgZm9yIGNvbGxlY3RpbmcgcnNzaSBkYXRhIHdoZW4KKyAqICAgICB0aGUgc3RhdGlvbiBpcyBvdGhlcndpc2UgcXVpZXQsIG9yCisgKiAgIC0gd2hlbiBzY2FubmluZworICovCitzdGF0aWMgdm9pZCBhdGg1a19jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKKwl1MzIgbWZpbHRbMl0sIHJmaWx0OworCisJLyogRW5hYmxlIGFsbCBtdWx0aWNhc3QgKi8KKwltZmlsdFswXSA9IH4wOworCW1maWx0WzFdID0gfjA7CisKKwkvKiBFbmFibGUgZGF0YSBmcmFtZXMgYW5kIGJlYWNvbnMgKi8KKwlyZmlsdCA9IChBUjVLX1JYX0ZJTFRFUl9VQ0FTVCB8IEFSNUtfUlhfRklMVEVSX0JDQVNUIHwKKwkJIEFSNUtfUlhfRklMVEVSX01DQVNUIHwgQVI1S19SWF9GSUxURVJfQkVBQ09OKTsKKworCS8qIFNldCBmaWx0ZXJzICovCisJYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcihhaCwgcmZpbHQpOworCisJLyogU2V0IG11bHRpY2FzdCBiaXRzICovCisJYXRoNWtfaHdfc2V0X21jYXN0X2ZpbHRlcihhaCwgbWZpbHRbMF0sIG1maWx0WzFdKTsKKworCS8qIFNldCB0aGUgY2FjaGVkIGh3IGZpbHRlciBmbGFncywgdGhpcyB3aWxsIGFsdGVyIGFjdHVhbGx5CisJICogYmUgc2V0IGluIEhXICovCisJc2MtPmZpbHRlcl9mbGFncyA9IHJmaWx0OworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWsuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0NDMzZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrLmgKQEAgLTAsMCArMSwxMjc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDcgUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgorICoKKyAqIE1vZGlmaWVkIGZvciBnUFhFLCBKdWx5IDIwMDksIGJ5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+CisgKiBPcmlnaW5hbCBmcm9tIExpbnV4IGtlcm5lbCAyLjYuMzAuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfQVRINUtfSAorI2RlZmluZSBfQVRINUtfSAorCitGSUxFX0xJQ0VOQ0UgKCBNSVQgKTsKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXQ4MDIxMS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIEtlZXAgYWxsIGF0aDVrIGZpbGVzIHVuZGVyIG9uZSBlcnJmaWxlIElEICovCisjdW5kZWYgRVJSRklMRQorI2RlZmluZSBFUlJGSUxFIEVSUkZJTEVfYXRoNWsKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkvc2l6ZW9mKChhKVswXSkpCisKKy8qIFJYL1RYIGRlc2NyaXB0b3IgaHcgc3RydWN0cyAqLworI2luY2x1ZGUgImRlc2MuaCIKKworLyogRUVQUk9NIHN0cnVjdHMvb2Zmc2V0cyAqLworI2luY2x1ZGUgImVlcHJvbS5oIgorCisvKiBQQ0kgSURzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTAgCQkweDAwMDcgLyogQVI1MjEwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUzMTEgCQkweDAwMTEgLyogQVI1MzExICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTEgCQkweDAwMTIgLyogQVI1MjExICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTIgCQkweDAwMTMgLyogQVI1MjEyICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1JEQUc2NzUgCQkweDAwMTMgLyogM0NSREFHNjc1IChBdGhlcm9zIEFSNTIxMikgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzJfM0NSUEFHMTc1IAkJMHgwMDEzIC8qIDNDUlBBRzE3NSAoQXRoZXJvcyBBUjUyMTIpICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTBfQVAgCTB4MDIwNyAvKiBBUjUyMTAgKEVhcmx5KSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyX0lCTQkweDEwMTQgLyogQVI1MjEyIChJQk0gTWluaVBDSSkgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMF9ERUZBVUxUIAkweDExMDcgLyogQVI1MjEwIChubyBlZXByb20pICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfREVGQVVMVCAJMHgxMTEzIC8qIEFSNTIxMiAobm8gZWVwcm9tKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjExX0RFRkFVTFQgCTB4MTExMiAvKiBBUjUyMTEgKG5vIGVlcHJvbSkgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMl9GUEdBIAkweGYwMTMgLyogQVI1MjEyIChlbXVsYXRpb24gYm9hcmQpICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTFfTEVHQUNZIAkweGZmMTIgLyogQVI1MjExIChlbXVsYXRpb24gYm9hcmQpICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTFfRlBHQTExQiAJMHhmMTFiIC8qIEFSNTIxMSAoZW11bGF0aW9uIGJvYXJkKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MzEyX1JFVjIgCTB4MDA1MiAvKiBBUjUzMTIgV01BQyAoQVAzMSkgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTMxMl9SRVY3IAkweDAwNTcgLyogQVI1MzEyIFdNQUMgKEFQMzAtMDQwKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MzEyX1JFVjggCTB4MDA1OCAvKiBBUjUzMTIgV01BQyAoQVA0My0wMzApICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfMDAxNCAJMHgwMDE0IC8qIEFSNTIxMiBjb21wYXRpYmxlICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfMDAxNSAJMHgwMDE1IC8qIEFSNTIxMiBjb21wYXRpYmxlICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfMDAxNiAJMHgwMDE2IC8qIEFSNTIxMiBjb21wYXRpYmxlICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfMDAxNyAJMHgwMDE3IC8qIEFSNTIxMiBjb21wYXRpYmxlICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfMDAxOCAJMHgwMDE4IC8qIEFSNTIxMiBjb21wYXRpYmxlICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfMDAxOSAJMHgwMDE5IC8qIEFSNTIxMiBjb21wYXRpYmxlICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjI0MTMgCQkweDAwMWEgLyogQVIyNDEzIChHcmlmZmluLWxpdGUpICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjU0MTMgCQkweDAwMWIgLyogQVI1NDEzIChFYWdsZSkgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTQyNCAJCTB4MDAxYyAvKiBBUjU0MjQgKENvbmRvciBQQ0ktRSkgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTQxNiAJCTB4MDAyMyAvKiBBUjU0MTYgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTQxOCAJCTB4MDAyNCAvKiBBUjU0MTggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIEdFTkVSSUMgRFJJVkVSIERFRklOSVRJT05TCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEFSNUsgUkVHSVNURVIgQUNDRVNTCisgKi8KKworLyogU29tZSBtYWNyb3MgdG8gcmVhZC93cml0ZSBmaWVsZHMgKi8KKworLyogRmlyc3Qgc2hpZnQsIHRoZW4gbWFzayAqLworI2RlZmluZSBBUjVLX1JFR19TTShfdmFsLCBfZmxhZ3MpCQkJCQlcCisJKCgoX3ZhbCkgPDwgX2ZsYWdzIyNfUykgJiAoX2ZsYWdzKSkKKworLyogRmlyc3QgbWFzaywgdGhlbiBzaGlmdCAqLworI2RlZmluZSBBUjVLX1JFR19NUyhfdmFsLCBfZmxhZ3MpCQkJCQlcCisJKCgoX3ZhbCkgJiAoX2ZsYWdzKSkgPj4gX2ZsYWdzIyNfUykKKworLyogU29tZSByZWdpc3RlcnMgY2FuIGhvbGQgbXVsdGlwbGUgdmFsdWVzIG9mIGludGVyZXN0LiBGb3IgdGhpcworICogcmVhc29uIHdoZW4gd2Ugd2FudCB0byB3cml0ZSB0byB0aGVzZSByZWdpc3RlcnMgd2UgbXVzdCBmaXJzdAorICogcmV0cmlldmUgdGhlIHZhbHVlcyB3aGljaCB3ZSBkbyBub3Qgd2FudCB0byBjbGVhciAobGV0cyBjYWxsIHRoaXMKKyAqIG9sZF9kYXRhKSBhbmQgdGhlbiBzZXQgdGhlIHJlZ2lzdGVyIHdpdGggdGhpcyBhbmQgb3VyIG5ld192YWx1ZToKKyAqICggb2xkX2RhdGEgfCBuZXdfdmFsdWUpICovCisjZGVmaW5lIEFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIF9yZWcsIF9mbGFncywgX3ZhbCkJCQlcCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIF9yZWcpICYgfihfZmxhZ3MpKSB8IFwKKwkgICAgKCgoX3ZhbCkgPDwgX2ZsYWdzIyNfUykgJiAoX2ZsYWdzKSksIF9yZWcpCisKKyNkZWZpbmUgQVI1S19SRUdfTUFTS0VEX0JJVFMoYWgsIF9yZWcsIF9mbGFncywgX21hc2spCQkJXAorCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBfcmVnKSAmCQlcCisJCQkoX21hc2spKSB8IChfZmxhZ3MpLCBfcmVnKQorCisjZGVmaW5lIEFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBfcmVnLCBfZmxhZ3MpCQkJCVwKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBfcmVnKSB8IChfZmxhZ3MpLCBfcmVnKQorCisjZGVmaW5lIEFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgX3JlZywgX2ZsYWdzKQkJCVwKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBfcmVnKSAmIH4oX2ZsYWdzKSwgX3JlZykKKworLyogQWNjZXNzIHRvIFBIWSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVI1S19QSFlfUkVBRChhaCwgX3JlZykJCQkJCVwKKwlhdGg1a19od19yZWdfcmVhZChhaCwgKGFoKS0+YWhfcGh5ICsgKChfcmVnKSA8PCAyKSkKKworI2RlZmluZSBBUjVLX1BIWV9XUklURShhaCwgX3JlZywgX3ZhbCkJCQkJCVwKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIF92YWwsIChhaCktPmFoX3BoeSArICgoX3JlZykgPDwgMikpCisKKy8qIEFjY2VzcyBRQ1UgcmVnaXN0ZXJzIHBlciBxdWV1ZSAqLworI2RlZmluZSBBUjVLX1JFR19SRUFEX1EoYWgsIF9yZWcsIF9xdWV1ZSkJCQkJXAorCShhdGg1a19od19yZWdfcmVhZChhaCwgX3JlZykgJiAoMSA8PCBfcXVldWUpKQkJCVwKKworI2RlZmluZSBBUjVLX1JFR19XUklURV9RKGFoLCBfcmVnLCBfcXVldWUpCQkJCVwKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsICgxIDw8IF9xdWV1ZSksIF9yZWcpCisKKyNkZWZpbmUgQVI1S19RX0VOQUJMRV9CSVRTKF9yZWcsIF9xdWV1ZSkgZG8gewkJCQlcCisJX3JlZyB8PSAxIDw8IF9xdWV1ZTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFSNUtfUV9ESVNBQkxFX0JJVFMoX3JlZywgX3F1ZXVlKSBkbyB7CQkJCVwKKwlfcmVnICY9IH4oMSA8PCBfcXVldWUpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFVzZWQgd2hpbGUgd3JpdGluZyBpbml0dmFscyAqLworI2RlZmluZSBBUjVLX1JFR19XQUlUKF9pKSBkbyB7CQkJCQkJXAorCWlmIChfaSAlIDY0KQkJCQkJCQlcCisJCXVkZWxheSgxKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBSZWdpc3RlciBkdW1wcyBhcmUgZG9uZSBwZXIgb3BlcmF0aW9uIG1vZGUgKi8KKyNkZWZpbmUgQVI1S19JTklfUkZHQUlOXzVHSFoJCTAKKyNkZWZpbmUgQVI1S19JTklfUkZHQUlOXzJHSFoJCTEKKworLyogVE9ETzogQ2xlYW4gdGhpcyB1cCAqLworI2RlZmluZSBBUjVLX0lOSV9WQUxfMTFBCQkwCisjZGVmaW5lIEFSNUtfSU5JX1ZBTF8xMUFfVFVSQk8JCTEKKyNkZWZpbmUgQVI1S19JTklfVkFMXzExQgkJMgorI2RlZmluZSBBUjVLX0lOSV9WQUxfMTFHCQkzCisjZGVmaW5lIEFSNUtfSU5JX1ZBTF8xMUdfVFVSQk8JCTQKKyNkZWZpbmUgQVI1S19JTklfVkFMX1hSCQkJMAorI2RlZmluZSBBUjVLX0lOSV9WQUxfTUFYCQk1CisKKy8qIFVzZWQgZm9yIEJTU0lEIGV0YyBtYW5pcHVsYXRpb24gKi8KKyNkZWZpbmUgQVI1S19MT1dfSUQoX2EpKAkJCQlcCisoX2EpWzBdIHwgKF9hKVsxXSA8PCA4IHwgKF9hKVsyXSA8PCAxNiB8IChfYSlbM10gPDwgMjQJXAorKQorCisjZGVmaW5lIEFSNUtfSElHSF9JRChfYSkJKChfYSlbNF0gfCAoX2EpWzVdIDw8IDgpCisKKyNkZWZpbmUgSUVFRTgwMjExX01BWF9MRU4JMjM1MgorCisvKgorICogU29tZSB0dW5lYWJsZSB2YWx1ZXMgKHRoZXNlIHNob3VsZCBiZSBjaGFuZ2VhYmxlIGJ5IHRoZSB1c2VyKQorICovCisjZGVmaW5lIEFSNUtfVFVORV9ETUFfQkVBQ09OX1JFU1AJCTIKKyNkZWZpbmUgQVI1S19UVU5FX1NXX0JFQUNPTl9SRVNQCQkxMAorI2RlZmluZSBBUjVLX1RVTkVfQURESVRJT05BTF9TV0JBX0JBQ0tPRkYJMAorI2RlZmluZSBBUjVLX1RVTkVfUkFEQVJfQUxFUlQJCQkwCisjZGVmaW5lIEFSNUtfVFVORV9NSU5fVFhfRklGT19USFJFUwkJMQorI2RlZmluZSBBUjVLX1RVTkVfTUFYX1RYX0ZJRk9fVEhSRVMJCSgoSUVFRTgwMjExX01BWF9MRU4gLyA2NCkgKyAxKQorI2RlZmluZSBBUjVLX1RVTkVfUkVHSVNURVJfVElNRU9VVAkJMjAwMDAKKy8qIFJlZ2lzdGVyIGZvciBSU1NJIHRocmVzaG9sZCBoYXMgYSBtYXNrIG9mIDB4ZmYsIHNvIDI1NSBzZWVtcyB0bworICogYmUgdGhlIG1heCB2YWx1ZS4gKi8KKyNkZWZpbmUgQVI1S19UVU5FX1JTU0lfVEhSRVMJCQkxMjkKKy8qIFRoaXMgbXVzdCBiZSBzZXQgd2hlbiBzZXR0aW5nIHRoZSBSU1NJIHRocmVzaG9sZCBvdGhlcndpc2UgaXQgY2FuCisgKiBwcmV2ZW50IGEgcmVzZXQuIElmIEFSNUtfUlNTSV9USFIgaXMgcmVhZCBhZnRlciB3cml0aW5nIHRvIGl0CisgKiB0aGUgQk1JU1NfVEhSRVMgd2lsbCBiZSBzZWVuIGFzIDAsIHNlZW1zIGhhcndhcmUgZG9lc24ndCBrZWVwCisgKiB0cmFjayBvZiBpdC4gTWF4IHZhbHVlIGRlcGVuZHMgb24gaGFyd2FyZS4gRm9yIEFSNTIxMCB0aGlzIGlzIGp1c3QgNy4KKyAqIEZvciBBUjUyMTErIHRoaXMgc2VlbXMgdG8gYmUgdXAgdG8gMjU1LiAqLworI2RlZmluZSBBUjVLX1RVTkVfQk1JU1NfVEhSRVMJCQk3CisjZGVmaW5lIEFSNUtfVFVORV9SRUdJU1RFUl9EV0VMTF9USU1FCQkyMDAwMAorI2RlZmluZSBBUjVLX1RVTkVfQkVBQ09OX0lOVEVSVkFMCQkxMDAKKyNkZWZpbmUgQVI1S19UVU5FX0FJRlMJCQkJMgorI2RlZmluZSBBUjVLX1RVTkVfQUlGU18xMUIJCQkyCisjZGVmaW5lIEFSNUtfVFVORV9BSUZTX1hSCQkJMAorI2RlZmluZSBBUjVLX1RVTkVfQ1dNSU4JCQkJMTUKKyNkZWZpbmUgQVI1S19UVU5FX0NXTUlOXzExQgkJCTMxCisjZGVmaW5lIEFSNUtfVFVORV9DV01JTl9YUgkJCTMKKyNkZWZpbmUgQVI1S19UVU5FX0NXTUFYCQkJCTEwMjMKKyNkZWZpbmUgQVI1S19UVU5FX0NXTUFYXzExQgkJCTEwMjMKKyNkZWZpbmUgQVI1S19UVU5FX0NXTUFYX1hSCQkJNworI2RlZmluZSBBUjVLX1RVTkVfTk9JU0VfRkxPT1IJCQktNzIKKyNkZWZpbmUgQVI1S19UVU5FX01BWF9UWFBPV0VSCQkJNjMKKyNkZWZpbmUgQVI1S19UVU5FX0RFRkFVTFRfVFhQT1dFUgkJMjUKKyNkZWZpbmUgQVI1S19UVU5FX1RQQ19UWFBPV0VSCQkJMAorI2RlZmluZSBBUjVLX1RVTkVfQU5UX0RJVkVSU0lUWQkJCTEKKyNkZWZpbmUgQVI1S19UVU5FX0hXVFhUUklFUwkJCTQKKworI2RlZmluZSBBUjVLX0lOSVRfQ0FSUl9TRU5TRV9FTgkJCTEKKworLypTd2FwIFJYL1RYIERlc2NyaXB0b3IgZm9yIGJpZyBlbmRpYW4gYXJjaHMqLworI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgQVI1S19JTklUX0NGRwkoCQlcCisJQVI1S19DRkdfU1dURCB8IEFSNUtfQ0ZHX1NXUkQJXAorKQorI2Vsc2UKKyNkZWZpbmUgQVI1S19JTklUX0NGRwkweDAwMDAwMDAwCisjZW5kaWYKKworLyogSW5pdGlhbCB2YWx1ZXMgKi8KKyNkZWZpbmUJQVI1S19JTklUX0NZQ1JTU0lfVEhSMQkJCTIKKyNkZWZpbmUgQVI1S19JTklUX1RYX0xBVEVOQ1kJCQk1MDIKKyNkZWZpbmUgQVI1S19JTklUX1VTRUMJCQkJMzkKKyNkZWZpbmUgQVI1S19JTklUX1VTRUNfVFVSQk8JCQk3OQorI2RlZmluZSBBUjVLX0lOSVRfVVNFQ18zMgkJCTMxCisjZGVmaW5lIEFSNUtfSU5JVF9TTE9UX1RJTUUJCQkzOTYKKyNkZWZpbmUgQVI1S19JTklUX1NMT1RfVElNRV9UVVJCTwkJNDgwCisjZGVmaW5lIEFSNUtfSU5JVF9BQ0tfQ1RTX1RJTUVPVVQJCTEwMjQKKyNkZWZpbmUgQVI1S19JTklUX0FDS19DVFNfVElNRU9VVF9UVVJCTwkJMHgwODAwMDgwMAorI2RlZmluZSBBUjVLX0lOSVRfUFJPR19JRlMJCQk5MjAKKyNkZWZpbmUgQVI1S19JTklUX1BST0dfSUZTX1RVUkJPCQk5NjAKKyNkZWZpbmUgQVI1S19JTklUX0VJRlMJCQkJMzQ0MAorI2RlZmluZSBBUjVLX0lOSVRfRUlGU19UVVJCTwkJCTY4ODAKKyNkZWZpbmUgQVI1S19JTklUX1NJRlMJCQkJNTYwCisjZGVmaW5lIEFSNUtfSU5JVF9TSUZTX1RVUkJPCQkJNDgwCisjZGVmaW5lIEFSNUtfSU5JVF9TSF9SRVRSWQkJCTEwCisjZGVmaW5lIEFSNUtfSU5JVF9MR19SRVRSWQkJCUFSNUtfSU5JVF9TSF9SRVRSWQorI2RlZmluZSBBUjVLX0lOSVRfU1NIX1JFVFJZCQkJMzIKKyNkZWZpbmUgQVI1S19JTklUX1NMR19SRVRSWQkJCUFSNUtfSU5JVF9TU0hfUkVUUlkKKyNkZWZpbmUgQVI1S19JTklUX1RYX1JFVFJZCQkJMTAKKworI2RlZmluZSBBUjVLX0lOSVRfVFJBTlNNSVRfTEFURU5DWQkJKAkJCVwKKwkoQVI1S19JTklUX1RYX0xBVEVOQ1kgPDwgMTQpIHwgKEFSNUtfSU5JVF9VU0VDXzMyIDw8IDcpIHwJXAorCShBUjVLX0lOSVRfVVNFQykJCQkJCQlcCispCisjZGVmaW5lIEFSNUtfSU5JVF9UUkFOU01JVF9MQVRFTkNZX1RVUkJPCSgJCQlcCisJKEFSNUtfSU5JVF9UWF9MQVRFTkNZIDw8IDE0KSB8IChBUjVLX0lOSVRfVVNFQ18zMiA8PCA3KSB8CVwKKwkoQVI1S19JTklUX1VTRUNfVFVSQk8pCQkJCQkJXAorKQorI2RlZmluZSBBUjVLX0lOSVRfUFJPVE9fVElNRV9DTlRSTAkJKAkJCVwKKwkoQVI1S19JTklUX0NBUlJfU0VOU0VfRU4gPDwgMjYpIHwgKEFSNUtfSU5JVF9FSUZTIDw8IDEyKSB8CVwKKwkoQVI1S19JTklUX1BST0dfSUZTKQkJCQkJCVwKKykKKyNkZWZpbmUgQVI1S19JTklUX1BST1RPX1RJTUVfQ05UUkxfVFVSQk8JKAkJCVwKKwkoQVI1S19JTklUX0NBUlJfU0VOU0VfRU4gPDwgMjYpIHwgKEFSNUtfSU5JVF9FSUZTX1RVUkJPIDw8IDEyKSB8IFwKKwkoQVI1S19JTklUX1BST0dfSUZTX1RVUkJPKQkJCQkJXAorKQorCisvKiB0b2tlbiB0byB1c2UgZm9yIGFpZnMsIGN3bWluLCBjd21heCBpbiBNYWRXaUZpICovCisjZGVmaW5lCUFSNUtfVFhRX1VTRURFRkFVTFQJKCh1MzIpIC0xKQorCisvKiBHRU5FUklDIENISVBTRVQgREVGSU5JVElPTlMgKi8KKworLyogTUFDIENoaXBzICovCitlbnVtIGF0aDVrX3ZlcnNpb24geworCUFSNUtfQVI1MjEwCT0gMCwKKwlBUjVLX0FSNTIxMQk9IDEsCisJQVI1S19BUjUyMTIJPSAyLAorfTsKKworLyogUEhZIENoaXBzICovCitlbnVtIGF0aDVrX3JhZGlvIHsKKwlBUjVLX1JGNTExMAk9IDAsCisJQVI1S19SRjUxMTEJPSAxLAorCUFSNUtfUkY1MTEyCT0gMiwKKwlBUjVLX1JGMjQxMwk9IDMsCisJQVI1S19SRjU0MTMJPSA0LAorCUFSNUtfUkYyMzE2CT0gNSwKKwlBUjVLX1JGMjMxNwk9IDYsCisJQVI1S19SRjI0MjUJPSA3LAorfTsKKworLyoKKyAqIENvbW1vbiBzaWxpY29uIHJldmlzaW9uL3ZlcnNpb24gdmFsdWVzCisgKi8KKworZW51bSBhdGg1a19zcmV2X3R5cGUgeworCUFSNUtfVkVSU0lPTl9NQUMsCisJQVI1S19WRVJTSU9OX1JBRCwKK307CisKK3N0cnVjdCBhdGg1a19zcmV2X25hbWUgeworCWNvbnN0IGNoYXIJCSpzcl9uYW1lOworCWVudW0gYXRoNWtfc3Jldl90eXBlCXNyX3R5cGU7CisJdW5zaWduZWQJCXNyX3ZhbDsKK307CisKKyNkZWZpbmUgQVI1S19TUkVWX1VOS05PV04JMHhmZmZmCisKKyNkZWZpbmUgQVI1S19TUkVWX0FSNTIxMAkweDAwIC8qIENyZXRlICovCisjZGVmaW5lIEFSNUtfU1JFVl9BUjUzMTEJMHgxMCAvKiBNYXVpIDEgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTMxMUEJMHgyMCAvKiBNYXVpIDIgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTMxMUIJMHgzMCAvKiBTcGlyaXQgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTIxMQkweDQwIC8qIE9haHUgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTIxMgkweDUwIC8qIFZlbmljZSAqLworI2RlZmluZSBBUjVLX1NSRVZfQVI1MjEzCTB4NTUgLyogPz8/ICovCisjZGVmaW5lIEFSNUtfU1JFVl9BUjUyMTNBCTB4NTkgLyogSGFpbmFuICovCisjZGVmaW5lIEFSNUtfU1JFVl9BUjI0MTMJMHg3OCAvKiBHcmlmZmluIGxpdGUgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSMjQxNAkweDcwIC8qIEdyaWZmaW4gKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTQyNAkweDkwIC8qIENvbmRvciAqLworI2RlZmluZSBBUjVLX1NSRVZfQVI1NDEzCTB4YTQgLyogRWFnbGUgbGl0ZSAqLworI2RlZmluZSBBUjVLX1NSRVZfQVI1NDE0CTB4YTAgLyogRWFnbGUgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSMjQxNQkweGIwIC8qIFRhbG9uICovCisjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MTYJMHhjMCAvKiBQQ0ktRSAqLworI2RlZmluZSBBUjVLX1NSRVZfQVI1NDE4CTB4Y2EgLyogUENJLUUgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSMjQyNQkweGUwIC8qIFN3YW4gKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSMjQxNwkweGYwIC8qIE5hbGEgKi8KKworI2RlZmluZSBBUjVLX1NSRVZfUkFEXzUxMTAJMHgwMAorI2RlZmluZSBBUjVLX1NSRVZfUkFEXzUxMTEJMHgxMAorI2RlZmluZSBBUjVLX1NSRVZfUkFEXzUxMTFBCTB4MTUKKyNkZWZpbmUgQVI1S19TUkVWX1JBRF8yMTExCTB4MjAKKyNkZWZpbmUgQVI1S19TUkVWX1JBRF81MTEyCTB4MzAKKyNkZWZpbmUgQVI1S19TUkVWX1JBRF81MTEyQQkweDM1CisjZGVmaW5lCUFSNUtfU1JFVl9SQURfNTExMkIJMHgzNgorI2RlZmluZSBBUjVLX1NSRVZfUkFEXzIxMTIJMHg0MAorI2RlZmluZSBBUjVLX1NSRVZfUkFEXzIxMTJBCTB4NDUKKyNkZWZpbmUJQVI1S19TUkVWX1JBRF8yMTEyQgkweDQ2CisjZGVmaW5lIEFSNUtfU1JFVl9SQURfMjQxMwkweDUwCisjZGVmaW5lIEFSNUtfU1JFVl9SQURfNTQxMwkweDYwCisjZGVmaW5lIEFSNUtfU1JFVl9SQURfMjMxNgkweDcwIC8qIENvYnJhIFNvQyAqLworI2RlZmluZSBBUjVLX1NSRVZfUkFEXzIzMTcJMHg4MAorI2RlZmluZSBBUjVLX1NSRVZfUkFEXzU0MjQJMHhhMCAvKiBNb3N0bHkgc2FtZSBhcyA1NDEzICovCisjZGVmaW5lIEFSNUtfU1JFVl9SQURfMjQyNQkweGEyCisjZGVmaW5lIEFSNUtfU1JFVl9SQURfNTEzMwkweGMwCisKKyNkZWZpbmUgQVI1S19TUkVWX1BIWV81MjExCTB4MzAKKyNkZWZpbmUgQVI1S19TUkVWX1BIWV81MjEyCTB4NDEKKyNkZWZpbmUJQVI1S19TUkVWX1BIWV81MjEyQQkweDQyCisjZGVmaW5lIEFSNUtfU1JFVl9QSFlfNTIxMkIJMHg0MworI2RlZmluZSBBUjVLX1NSRVZfUEhZXzI0MTMJMHg0NQorI2RlZmluZSBBUjVLX1NSRVZfUEhZXzU0MTMJMHg2MQorI2RlZmluZSBBUjVLX1NSRVZfUEhZXzI0MjUJMHg3MAorCisvKgorICogU29tZSBvZiB0aGlzIGluZm9ybWF0aW9uIGlzIGJhc2VkIG9uIERvY3VtZW50YXRpb24gZnJvbToKKyAqCisgKiBodHRwOi8vbWFkd2lmaS5vcmcvd2lraS9DaGlwc2V0RmVhdHVyZXMvU3VwZXJBRworICoKKyAqIE1vZHVsYXRpb24gZm9yIEF0aGVyb3MnIGVYdGVuZGVkIFJhbmdlIC0gcmFuZ2UgZW5oYW5jaW5nIGV4dGVuc2lvbiB0aGF0IGlzCisgKiBzdXBwb3NlZCB0byBkb3VibGUgdGhlIGRpc3RhbmNlIGFuIEF0aGVyb3MgY2xpZW50IGRldmljZSBjYW4ga2VlcCBhCisgKiBjb25uZWN0aW9uIHdpdGggYW4gQXRoZXJvcyBhY2Nlc3MgcG9pbnQuIFRoaXMgaXMgYWNoaWV2ZWQgYnkgaW5jcmVhc2luZworICogdGhlIHJlY2VpdmVyIHNlbnNpdGl2aXR5IHVwIHRvLCAtMTA1ZEJtLCB3aGljaCBpcyBhYm91dCAyMGRCIGFib3ZlIHdoYXQKKyAqIHRoZSA4MDIuMTEgc3BlY2lmaWNhdGlvbnMgZGVtYW5kLiBJbiBhZGRpdGlvbiwgbmV3IChwcm9wcmlldGFyeSkgZGF0YSByYXRlcworICogYXJlIGludHJvZHVjZWQ6IDMsIDIsIDEsIDAuNSBhbmQgMC4yNSBNQml0L3MuCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCBjYW4geW91IGVpdGhlciB1c2UgWFIgb3IgVFVSQk8gYnV0IHlvdSBjYW5ub3QgdXNlIGJvdGgsCisgKiB0aGV5IGFyZSBleGNsdXNpdmUuCisgKgorICovCisjZGVmaW5lIE1PRFVMQVRJT05fWFIgCQkweDAwMDAwMjAwCisKKy8qCisgKiBNb2R1bGF0aW9uIGZvciBBdGhlcm9zJyBUdXJibyBHIGFuZCBUdXJibyBBLCBpdHMgc3VwcG9zZWQgdG8gcHJvdmlkZSBhCisgKiB0aHJvdWdocHV0IHRyYW5zbWlzc2lvbiBzcGVlZCB1cCB0byA0ME1iaXQvcy02ME1iaXQvcyBhdCBhIDEwOE1iaXQvcworICogc2lnbmFsaW5nIHJhdGUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgYm9uZGluZyBvZiB0d28gNTRNYml0L3MgODAyLjExZworICogY2hhbm5lbHMuIFRvIHVzZSB0aGlzIGZlYXR1cmUgeW91ciBBY2Nlc3MgUG9pbnQgbXVzdCBhbHNvIHN1cG9ydCBpdC4KKyAqIFRoZXJlIGlzIGFsc28gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuICJzdGF0aWMiIGFuZCAiZHluYW1pYyIgdHVyYm8gbW9kZXM6CisgKgorICogLSBTdGF0aWM6IGlzIHRoZSBkdW1iIHZlcnNpb246IGRldmljZXMgc2V0IHRvIHRoaXMgbW9kZSBzdGljayB0byBpdCB1bnRpbAorICogICAgIHRoZSBtb2RlIGlzIHR1cm5lZCBvZmYuCisgKiAtIER5bmFtaWM6IGlzIHRoZSBpbnRlbGxpZ2VudCB2ZXJzaW9uLCB0aGUgbmV0d29yayBkZWNpZGVzIGl0c2VsZiBpZiBpdAorICogICAgIGlzIG9rIHRvIHVzZSB0dXJiby4gQXMgc29vbiBhcyB0cmFmZmljIGlzIGRldGVjdGVkIG9uIGFkamFjZW50IGNoYW5uZWxzCisgKiAgICAgKHdoaWNoIHdvdWxkIGdldCB1c2VkIGluIHR1cmJvIG1vZGUpLCBvciB3aGVuIGEgbm9uLXR1cmJvIHN0YXRpb24gam9pbnMKKyAqICAgICB0aGUgbmV0d29yaywgdHVyYm8gbW9kZSB3b24ndCBiZSB1c2VkIHVudGlsIHRoZSBzaXR1YXRpb24gY2hhbmdlcyBhZ2Fpbi4KKyAqICAgICBEeW5hbWljIG1vZGUgaXMgYWNoaWV2ZWQgYnkgQXRoZXJvcycgQWRhcHRpdmUgUmFkaW8gKEFSKSBmZWF0dXJlIHdoaWNoCisgKiAgICAgbW9uaXRvcnMgdGhlIHVzZWQgcmFkaW8gYmFuZCBpbiBvcmRlciB0byBkZWNpZGUgd2hldGhlciB0dXJibyBtb2RlIG1heQorICogICAgIGJlIHVzZWQgb3Igbm90LgorICoKKyAqIFRoaXMgYXJ0aWNsZSBjbGFpbXMgU3VwZXIgRyBzdGlja3MgdG8gYm9uZGluZyBvZiBjaGFubmVscyA1IGFuZCA2IGZvcgorICogVVNBOgorICoKKyAqIGh0dHA6Ly93d3cucGN3b3JsZC5jb20vYXJ0aWNsZS9pZCwxMTM0MjgtcGFnZSwxL2FydGljbGUuaHRtbAorICoKKyAqIFRoZSBjaGFubmVsIGJvbmRpbmcgc2VlbXMgdG8gYmUgZHJpdmVyIHNwZWNpZmljIHRob3VnaC4gSW4gYWRkaXRpb24gdG8KKyAqIGRlY2lkaW5nIHdoYXQgY2hhbm5lbHMgd2lsbCBiZSB1c2VkLCB0aGVzZSAiVHVyYm8iIG1vZGVzIGFyZSBhY2NvbXBsaXNoZWQKKyAqIGJ5IGFsc28gZW5hYmxpbmcgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKyAqCisgKiAtIEJ1cnN0aW5nOiBhbGxvd3MgbXVsdGlwbGUgZnJhbWVzIHRvIGJlIHNlbnQgYXQgb25jZSwgcmF0aGVyIHRoYW4gcGF1c2luZworICogICAgIGFmdGVyIGVhY2ggZnJhbWUuIEJ1cnN0aW5nIGlzIGEgc3RhbmRhcmRzLWNvbXBsaWFudCBmZWF0dXJlIHRoYXQgY2FuIGJlCisgKiAgICAgdXNlZCB3aXRoIGFueSBBY2Nlc3MgUG9pbnQuCisgKiAtIEZhc3QgZnJhbWVzOiBpbmNyZWFzZXMgdGhlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBzZW50IHBlcgorICogICAgIGZyYW1lLCBhbHNvIHJlc3VsdGluZyBpbiBhIHJlZHVjdGlvbiBvZiB0cmFuc21pc3Npb24gb3ZlcmhlYWQuIEl0IGlzIGEKKyAqICAgICBwcm9wcmlldGFyeSBmZWF0dXJlIHRoYXQgbmVlZHMgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZSBBY2Nlc3MgUG9pbnQuCisgKiAtIENvbXByZXNzaW9uOiBkYXRhIGZyYW1lcyBhcmUgY29tcHJlc3NlZCBpbiByZWFsIHRpbWUgdXNpbmcgYSBMZW1wZWwgWml2CisgKiAgICAgYWxnb3JpdGhtLiBUaGlzIGlzIGRvbmUgdHJhbnNwYXJlbnRseS4gT25jZSB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwKKyAqICAgICBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiB0YWtlcyBwbGFjZSBpbnNpZGUgdGhlIGNoaXBzZXQsIHdpdGhvdXQKKyAqICAgICBwdXR0aW5nIGFkZGl0aW9uYWwgbG9hZCBvbiB0aGUgaG9zdCBDUFUuCisgKgorICovCisjZGVmaW5lIE1PRFVMQVRJT05fVFVSQk8JMHgwMDAwMDA4MAorCitlbnVtIGF0aDVrX2RyaXZlcl9tb2RlIHsKKwlBUjVLX01PREVfMTFBCQk9IDAsCisJQVI1S19NT0RFXzExQV9UVVJCTwk9IDEsCisJQVI1S19NT0RFXzExQgkJPSAyLAorCUFSNUtfTU9ERV8xMUcJCT0gMywKKwlBUjVLX01PREVfMTFHX1RVUkJPCT0gNCwKKwlBUjVLX01PREVfWFIJCT0gNSwKK307CisKK2VudW0geworCUFSNUtfTU9ERV9CSVRfMTFBCT0gKDEgPDwgQVI1S19NT0RFXzExQSksCisJQVI1S19NT0RFX0JJVF8xMUFfVFVSQk8JPSAoMSA8PCBBUjVLX01PREVfMTFBX1RVUkJPKSwKKwlBUjVLX01PREVfQklUXzExQgk9ICgxIDw8IEFSNUtfTU9ERV8xMUIpLAorCUFSNUtfTU9ERV9CSVRfMTFHCT0gKDEgPDwgQVI1S19NT0RFXzExRyksCisJQVI1S19NT0RFX0JJVF8xMUdfVFVSQk8JPSAoMSA8PCBBUjVLX01PREVfMTFHX1RVUkJPKSwKKwlBUjVLX01PREVfQklUX1hSCT0gKDEgPDwgQVI1S19NT0RFX1hSKSwKK307CisKKy8qKioqKioqKioqKioqKioqXAorICBUWCBERUZJTklUSU9OUworXCoqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUWCBTdGF0dXMgZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgYXRoNWtfdHhfc3RhdHVzIHsKKwl1MTYJdHNfc2VxbnVtOworCXUxNgl0c190c3RhbXA7CisJdTgJdHNfc3RhdHVzOworCXU4CXRzX3JhdGVbNF07CisJdTgJdHNfcmV0cnlbNF07CisJdTgJdHNfZmluYWxfaWR4OworCXM4CXRzX3Jzc2k7CisJdTgJdHNfc2hvcnRyZXRyeTsKKwl1OAl0c19sb25ncmV0cnk7CisJdTgJdHNfdmlydGNvbDsKKwl1OAl0c19hbnRlbm5hOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgQVI1S19UWFNUQVRfQUxUUkFURQkweDgwCisjZGVmaW5lIEFSNUtfVFhFUlJfWFJFVFJZCTB4MDEKKyNkZWZpbmUgQVI1S19UWEVSUl9GSUxUCQkweDAyCisjZGVmaW5lIEFSNUtfVFhFUlJfRklGTwkJMHgwNAorCisvKioKKyAqIGVudW0gYXRoNWtfdHhfcXVldWUgLSBRdWV1ZSB0eXBlcyB1c2VkIHRvIGNsYXNzaWZ5IHR4IHF1ZXVlcy4KKyAqIEBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFOiBxIGlzIHVudXNlZCAtLSBzZWUgYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZQorICogQEFSNUtfVFhfUVVFVUVfREFUQTogQSBub3JtYWwgZGF0YSBxdWV1ZQorICogQEFSNUtfVFhfUVVFVUVfWFJfREFUQTogQW4gWFItZGF0YSBxdWV1ZQorICogQEFSNUtfVFhfUVVFVUVfQkVBQ09OOiBUaGUgYmVhY29uIHF1ZXVlCisgKiBAQVI1S19UWF9RVUVVRV9DQUI6IFRoZSBhZnRlci1iZWFjb24gcXVldWUKKyAqIEBBUjVLX1RYX1FVRVVFX1VBUFNEOiBVbnNjaGVkdWxlZCBBdXRvbWF0aWMgUG93ZXIgU2F2ZSBEZWxpdmVyeSBxdWV1ZQorICovCitlbnVtIGF0aDVrX3R4X3F1ZXVlIHsKKwlBUjVLX1RYX1FVRVVFX0lOQUNUSVZFID0gMCwKKwlBUjVLX1RYX1FVRVVFX0RBVEEsCisJQVI1S19UWF9RVUVVRV9YUl9EQVRBLAorCUFSNUtfVFhfUVVFVUVfQkVBQ09OLAorCUFSNUtfVFhfUVVFVUVfQ0FCLAorCUFSNUtfVFhfUVVFVUVfVUFQU0QsCit9OworCisvKgorICogUXVldWUgc3liLXR5cGVzIHRvIGNsYXNzaWZ5IG5vcm1hbCBkYXRhIHF1ZXVlcy4KKyAqIFRoZXNlIGFyZSB0aGUgNCBBY2Nlc3MgQ2F0ZWdvcmllcyBhcyBkZWZpbmVkIGluCisgKiBXTUUgc3BlYy4gMCBpcyB0aGUgbG93ZXN0IHByaW9yaXR5IGFuZCA0IGlzIHRoZQorICogaGlnaGVzdC4gTm9ybWFsIGRhdGEgdGhhdCBoYXNuJ3QgYmVlbiBjbGFzc2lmaWVkCisgKiBnb2VzIHRvIHRoZSBCZXN0IEVmZm9ydCBBQy4KKyAqLworZW51bSBhdGg1a190eF9xdWV1ZV9zdWJ0eXBlIHsKKwlBUjVLX1dNRV9BQ19CSyA9IDAsCS8qQmFja2dyb3VuZCB0cmFmZmljKi8KKwlBUjVLX1dNRV9BQ19CRSwgCS8qQmVzdC1lZmZvcnQgKG5vcm1hbCkgdHJhZmZpYykqLworCUFSNUtfV01FX0FDX1ZJLCAJLypWaWRlbyB0cmFmZmljKi8KKwlBUjVLX1dNRV9BQ19WTywgCS8qVm9pY2UgdHJhZmZpYyovCit9OworCisvKgorICogUXVldWUgSUQgbnVtYmVycyBhcyByZXR1cm5lZCBieSB0aGUgaHcgZnVuY3Rpb25zLCBlYWNoIG51bWJlcgorICogcmVwcmVzZW50cyBhIGh3IHF1ZXVlLiBJZiBodyBkb2VzIG5vdCBzdXBwb3J0IGh3IHF1ZXVlcworICogKGVnIDUyMTApIGFsbCBkYXRhIGdvZXMgaW4gb25lIHF1ZXVlLiBUaGVzZSBtYXRjaAorICogZDgwMjExIGRlZmluaXRpb25zIChuZXQ4MDIxMS9NYWRXaUZpIGRvbid0IHVzZSB0aGVtKS4KKyAqLworZW51bSBhdGg1a190eF9xdWV1ZV9pZCB7CisJQVI1S19UWF9RVUVVRV9JRF9OT1FDVV9EQVRBCT0gMCwKKwlBUjVLX1RYX1FVRVVFX0lEX05PUUNVX0JFQUNPTgk9IDEsCisJQVI1S19UWF9RVUVVRV9JRF9EQVRBX01JTgk9IDAsIC8qSUVFRTgwMjExX1RYX1FVRVVFX0RBVEEwKi8KKwlBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUFYCT0gNCwgLypJRUVFODAyMTFfVFhfUVVFVUVfREFUQTQqLworCUFSNUtfVFhfUVVFVUVfSURfREFUQV9TVlAJPSA1LCAvKklFRUU4MDIxMV9UWF9RVUVVRV9TVlAgLSBTcGVjdHJhbGluayBWb2ljZSBQcm90b2NvbCovCisJQVI1S19UWF9RVUVVRV9JRF9DQUIJCT0gNiwgLypJRUVFODAyMTFfVFhfUVVFVUVfQUZURVJfQkVBQ09OKi8KKwlBUjVLX1RYX1FVRVVFX0lEX0JFQUNPTgkJPSA3LCAvKklFRUU4MDIxMV9UWF9RVUVVRV9CRUFDT04qLworCUFSNUtfVFhfUVVFVUVfSURfVUFQU0QJCT0gOCwKKwlBUjVLX1RYX1FVRVVFX0lEX1hSX0RBVEEJPSA5LAorfTsKKworLyoKKyAqIEZsYWdzIHRvIHNldCBodyBxdWV1ZSdzIHBhcmFtZXRlcnMuLi4KKyAqLworI2RlZmluZSBBUjVLX1RYUV9GTEFHX1RYT0tJTlRfRU5BQkxFCQkweDAwMDEJLyogRW5hYmxlIFRYT0sgaW50ZXJydXB0ICovCisjZGVmaW5lIEFSNUtfVFhRX0ZMQUdfVFhFUlJJTlRfRU5BQkxFCQkweDAwMDIJLyogRW5hYmxlIFRYRVJSIGludGVycnVwdCAqLworI2RlZmluZSBBUjVLX1RYUV9GTEFHX1RYRU9MSU5UX0VOQUJMRQkJMHgwMDA0CS8qIEVuYWJsZSBUWEVPTCBpbnRlcnJ1cHQgLW5vdCB1c2VkLSAqLworI2RlZmluZSBBUjVLX1RYUV9GTEFHX1RYREVTQ0lOVF9FTkFCTEUJCTB4MDAwOAkvKiBFbmFibGUgVFhERVNDIGludGVycnVwdCAtbm90IHVzZWQtICovCisjZGVmaW5lIEFSNUtfVFhRX0ZMQUdfVFhVUk5JTlRfRU5BQkxFCQkweDAwMTAJLyogRW5hYmxlIFRYVVJOIGludGVycnVwdCAqLworI2RlZmluZSBBUjVLX1RYUV9GTEFHX0NCUk9STklOVF9FTkFCTEUJCTB4MDAyMAkvKiBFbmFibGUgQ0JST1JOIGludGVycnVwdCAqLworI2RlZmluZSBBUjVLX1RYUV9GTEFHX0NCUlVSTklOVF9FTkFCTEUJCTB4MDA0MAkvKiBFbmFibGUgQ0JSVVJOIGludGVycnVwdCAqLworI2RlZmluZSBBUjVLX1RYUV9GTEFHX1FUUklHSU5UX0VOQUJMRQkJMHgwMDgwCS8qIEVuYWJsZSBRVFJJRyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQVI1S19UWFFfRkxBR19UWE5PRlJNSU5UX0VOQUJMRQkJMHgwMTAwCS8qIEVuYWJsZSBUWE5PRlJNIGludGVycnVwdCAqLworI2RlZmluZSBBUjVLX1RYUV9GTEFHX0JBQ0tPRkZfRElTQUJMRQkJMHgwMjAwCS8qIERpc2FibGUgcmFuZG9tIHBvc3QtYmFja29mZiAqLworI2RlZmluZSBBUjVLX1RYUV9GTEFHX1JEWVRJTUVfRVhQX1BPTElDWV9FTkFCTEUJMHgwMzAwCS8qIEVuYWJsZSByZWFkeSB0aW1lIGV4cGlyeSBwb2xpY3kgKD8pKi8KKyNkZWZpbmUgQVI1S19UWFFfRkxBR19GUkFHX0JVUlNUX0JBQ0tPRkZfRU5BQkxFCTB4MDgwMAkvKiBFbmFibGUgYmFja29mZiB3aGlsZSBidXJzdGluZyAqLworI2RlZmluZSBBUjVLX1RYUV9GTEFHX1BPU1RfRlJfQktPRkZfRElTCQkweDEwMDAJLyogRGlzYWJsZSBiYWNrb2ZmIHdoaWxlIGJ1cnN0aW5nICovCisjZGVmaW5lIEFSNUtfVFhRX0ZMQUdfQ09NUFJFU1NJT05fRU5BQkxFCTB4MjAwMAkvKiBFbmFibGUgaHcgY29tcHJlc3Npb24gLW5vdCBpbXBsZW1lbnRlZC0qLworCisvKgorICogQSBzdHJ1Y3QgdG8gaG9sZCB0eCBxdWV1ZSdzIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IGF0aDVrX3R4cV9pbmZvIHsKKwllbnVtIGF0aDVrX3R4X3F1ZXVlIHRxaV90eXBlOworCWVudW0gYXRoNWtfdHhfcXVldWVfc3VidHlwZSB0cWlfc3VidHlwZTsKKwl1MTYJdHFpX2ZsYWdzOwkvKiBUeCBxdWV1ZSBmbGFncyAoc2VlIGFib3ZlKSAqLworCXUzMgl0cWlfYWlmczsJLyogQXJiaXRyYXRlZCBJbnRlcmZyYW1lIFNwYWNlICovCisJczMyCXRxaV9jd19taW47CS8qIE1pbmltdW0gQ29udGVudGlvbiBXaW5kb3cgKi8KKwlzMzIJdHFpX2N3X21heDsJLyogTWF4aW11bSBDb250ZW50aW9uIFdpbmRvdyAqLworCXUzMgl0cWlfY2JyX3BlcmlvZDsgLyogQ29uc3RhbnQgYml0IHJhdGUgcGVyaW9kICovCisJdTMyCXRxaV9jYnJfb3ZlcmZsb3dfbGltaXQ7CisJdTMyCXRxaV9idXJzdF90aW1lOworCXUzMgl0cWlfcmVhZHlfdGltZTsgLyogTm90IHVzZWQgKi8KK307CisKKy8qCisgKiBUcmFuc21pdCBwYWNrZXQgdHlwZXMuCisgKiB1c2VkIG9uIHR4IGNvbnRyb2wgZGVzY3JpcHRvcgorICogVE9ETzogVXNlIHRoZW0gaW5zaWRlIGJhc2UuYyBjb3JlY3RseQorICovCitlbnVtIGF0aDVrX3BrdF90eXBlIHsKKwlBUjVLX1BLVF9UWVBFX05PUk1BTAkJPSAwLAorCUFSNUtfUEtUX1RZUEVfQVRJTQkJPSAxLAorCUFSNUtfUEtUX1RZUEVfUFNQT0xMCQk9IDIsCisJQVI1S19QS1RfVFlQRV9CRUFDT04JCT0gMywKKwlBUjVLX1BLVF9UWVBFX1BST0JFX1JFU1AJPSA0LAorCUFSNUtfUEtUX1RZUEVfUElGUwkJPSA1LAorfTsKKworLyoKKyAqIFRYIHBvd2VyIGFuZCBUUEMgc2V0dGluZ3MKKyAqLworI2RlZmluZSBBUjVLX1RYUE9XRVJfT0ZETShfciwgX3YpCSgJCQlcCisJKCgwICYgMSkgPDwgKChfdikgKyA2KSkgfAkJCQlcCisJKCgoYWgtPmFoX3R4cG93ZXIudHhwX3JhdGVzX3Bvd2VyX3RhYmxlWyhfcildKSAmIDB4M2YpIDw8IChfdikpCVwKKykKKworI2RlZmluZSBBUjVLX1RYUE9XRVJfQ0NLKF9yLCBfdikJKAkJCVwKKwkoYWgtPmFoX3R4cG93ZXIudHhwX3JhdGVzX3Bvd2VyX3RhYmxlWyhfcildICYgMHgzZikgPDwgKF92KQlcCispCisKKy8qCisgKiBETUEgc2l6ZSBkZWZpbml0aW9ucyAoMl5uKzIpCisgKi8KK2VudW0gYXRoNWtfZG1hc2l6ZSB7CisJQVI1S19ETUFTSVpFXzRCCT0gMCwKKwlBUjVLX0RNQVNJWkVfOEIsCisJQVI1S19ETUFTSVpFXzE2QiwKKwlBUjVLX0RNQVNJWkVfMzJCLAorCUFSNUtfRE1BU0laRV82NEIsCisJQVI1S19ETUFTSVpFXzEyOEIsCisJQVI1S19ETUFTSVpFXzI1NkIsCisJQVI1S19ETUFTSVpFXzUxMkIKK307CisKKworLyoqKioqKioqKioqKioqKipcCisgIFJYIERFRklOSVRJT05TCitcKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFJYIFN0YXR1cyBkZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBhdGg1a19yeF9zdGF0dXMgeworCXUxNglyc19kYXRhbGVuOworCXUxNglyc190c3RhbXA7CisJdTgJcnNfc3RhdHVzOworCXU4CXJzX3BoeWVycjsKKwlzOAlyc19yc3NpOworCXU4CXJzX2tleWl4OworCXU4CXJzX3JhdGU7CisJdTgJcnNfYW50ZW5uYTsKKwl1OAlyc19tb3JlOworfTsKKworI2RlZmluZSBBUjVLX1JYRVJSX0NSQwkJMHgwMQorI2RlZmluZSBBUjVLX1JYRVJSX1BIWQkJMHgwMgorI2RlZmluZSBBUjVLX1JYRVJSX0ZJRk8JCTB4MDQKKyNkZWZpbmUgQVI1S19SWEVSUl9ERUNSWVBUCTB4MDgKKyNkZWZpbmUgQVI1S19SWEVSUl9NSUMJCTB4MTAKKyNkZWZpbmUgQVI1S19SWEtFWUlYX0lOVkFMSUQJKCh1OCkgLSAxKQorI2RlZmluZSBBUjVLX1RYS0VZSVhfSU5WQUxJRAkoKHUzMikgLSAxKQorCisKKy8qCisgKiBUU0YgdG8gVFUgY29udmVyc2lvbjoKKyAqCisgKiBUU0YgaXMgYSA2NGJpdCB2YWx1ZSBpbiB1c2VjIChtaWNyb3NlY29uZHMpLgorICogVFUgaXMgYSAzMmJpdCB2YWx1ZSBhbmQgZGVmaW5lZCBieSBJRUVFODAyLjExIChwYWdlIDYpIGFzICJBIG1lYXN1cmVtZW50IG9mCisgKiB0aW1lIGVxdWFsIHRvIDEwMjQgdXNlYyIsIHNvIGl0J3Mgcm91Z2hseSBtaWxsaXNlY29uZHMgKHVzZWMgLyAxMDI0KS4KKyAqLworI2RlZmluZSBUU0ZfVE9fVFUoX3RzZikgKHUzMikoKF90c2YpID4+IDEwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICBHQUlOIE9QVElNSVpBVElPTiBERUZJTklUSU9OUworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0gYXRoNWtfcmZnYWluIHsKKwlBUjVLX1JGR0FJTl9JTkFDVElWRSA9IDAsCisJQVI1S19SRkdBSU5fQUNUSVZFLAorCUFSNUtfUkZHQUlOX1JFQURfUkVRVUVTVEVELAorCUFSNUtfUkZHQUlOX05FRURfQ0hBTkdFLAorfTsKKworc3RydWN0IGF0aDVrX2dhaW4geworCXU4CQkJZ19zdGVwX2lkeDsKKwl1OAkJCWdfY3VycmVudDsKKwl1OAkJCWdfdGFyZ2V0OworCXU4CQkJZ19sb3c7CisJdTgJCQlnX2hpZ2g7CisJdTgJCQlnX2ZfY29ycjsKKwl1OAkJCWdfc3RhdGU7Cit9OworCisvKioqKioqKioqKioqKioqKioqKipcCisgIENPTU1PTiBERUZJTklUSU9OUworXCoqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEFSNUtfU0xPVF9USU1FXzkJMzk2CisjZGVmaW5lIEFSNUtfU0xPVF9USU1FXzIwCTg4MAorI2RlZmluZSBBUjVLX1NMT1RfVElNRV9NQVgJMHhmZmZmCisKKy8qIGNoYW5uZWxfZmxhZ3MgKi8KKyNkZWZpbmUJQ0hBTk5FTF9DV19JTlQJMHgwMDA4CS8qIENvbnRlbnRpb24gV2luZG93IGludGVyZmVyZW5jZSBkZXRlY3RlZCAqLworI2RlZmluZQlDSEFOTkVMX1RVUkJPCTB4MDAxMAkvKiBUdXJibyBDaGFubmVsICovCisjZGVmaW5lCUNIQU5ORUxfQ0NLCTB4MDAyMAkvKiBDQ0sgY2hhbm5lbCAqLworI2RlZmluZQlDSEFOTkVMX09GRE0JMHgwMDQwCS8qIE9GRE0gY2hhbm5lbCAqLworI2RlZmluZQlDSEFOTkVMXzJHSFoJMHgwMDgwCS8qIDJHSHogY2hhbm5lbC4gKi8KKyNkZWZpbmUJQ0hBTk5FTF81R0haCTB4MDEwMAkvKiA1R0h6IGNoYW5uZWwgKi8KKyNkZWZpbmUJQ0hBTk5FTF9QQVNTSVZFCTB4MDIwMAkvKiBPbmx5IHBhc3NpdmUgc2NhbiBhbGxvd2VkICovCisjZGVmaW5lCUNIQU5ORUxfRFlOCTB4MDQwMAkvKiBEeW5hbWljIENDSy1PRkRNIGNoYW5uZWwgKGZvciBnIG9wZXJhdGlvbikgKi8KKyNkZWZpbmUJQ0hBTk5FTF9YUgkweDA4MDAJLyogWFIgY2hhbm5lbCAqLworCisjZGVmaW5lCUNIQU5ORUxfQQkoQ0hBTk5FTF81R0hafENIQU5ORUxfT0ZETSkKKyNkZWZpbmUJQ0hBTk5FTF9CCShDSEFOTkVMXzJHSFp8Q0hBTk5FTF9DQ0spCisjZGVmaW5lCUNIQU5ORUxfRwkoQ0hBTk5FTF8yR0hafENIQU5ORUxfT0ZETSkKKyNkZWZpbmUJQ0hBTk5FTF9UCShDSEFOTkVMXzVHSFp8Q0hBTk5FTF9PRkRNfENIQU5ORUxfVFVSQk8pCisjZGVmaW5lCUNIQU5ORUxfVEcJKENIQU5ORUxfMkdIWnxDSEFOTkVMX09GRE18Q0hBTk5FTF9UVVJCTykKKyNkZWZpbmUJQ0hBTk5FTF8xMDhBCUNIQU5ORUxfVAorI2RlZmluZQlDSEFOTkVMXzEwOEcJQ0hBTk5FTF9URworI2RlZmluZQlDSEFOTkVMX1gJKENIQU5ORUxfNUdIWnxDSEFOTkVMX09GRE18Q0hBTk5FTF9YUikKKworI2RlZmluZQlDSEFOTkVMX0FMTCAJKENIQU5ORUxfT0ZETXxDSEFOTkVMX0NDS3xDSEFOTkVMXzJHSFp8Q0hBTk5FTF81R0hafCBcCisJCUNIQU5ORUxfVFVSQk8pCisKKyNkZWZpbmUJQ0hBTk5FTF9BTExfTk9UVVJCTyAJKENIQU5ORUxfQUxMICYgfkNIQU5ORUxfVFVSQk8pCisjZGVmaW5lIENIQU5ORUxfTU9ERVMJCUNIQU5ORUxfQUxMCisKKy8qCisgKiBVc2VkIGludGVybmFseSBmb3IgcmVzZXRfdHhfcXVldWUpLgorICogQWxzbyBzZWUgc3RydWN0IHN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsLgorICovCisjZGVmaW5lIElTX0NIQU5fWFIoX2MpCSgoX2MtPmh3X3ZhbHVlICYgQ0hBTk5FTF9YUikgIT0gMCkKKyNkZWZpbmUgSVNfQ0hBTl9CKF9jKQkoKF9jLT5od192YWx1ZSAmIENIQU5ORUxfQikgIT0gMCkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFwIDJHSHogY2hhbm5lbHMgdG8KKyAqIDVHSHogQXRoZXJvcyBjaGFubmVscy4KKyAqIFRPRE86IENsZWFuIHVwCisgKi8KK3N0cnVjdCBhdGg1a19hdGhjaGFuXzJnaHogeworCXUzMglhMl9mbGFnczsKKwl1MTYJYTJfYXRoY2hhbjsKK307CisKKworLyoqKioqKioqKioqKioqKioqKlwKKyAgUkFURSBERUZJTklUSU9OUworXCoqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBTZWVtcyB0aGUgYXI1eHh4IGhhcndhcmUgc3VwcG9ydHMgdXAgdG8gMzIgcmF0ZXMsIGluZGV4ZWQgYnkgMS0zMi4KKyAqCisgKiBUaGUgcmF0ZSBjb2RlIGlzIHVzZWQgdG8gZ2V0IHRoZSBSWCByYXRlIG9yIHNldCB0aGUgVFggcmF0ZSBvbiB0aGUKKyAqIGhhcmR3YXJlIGRlc2NyaXB0b3JzLiBJdCBpcyBhbHNvIHVzZWQgZm9yIGludGVybmFsIG1vZHVsYXRpb24gY29udHJvbAorICogYW5kIHNldHRpbmdzLgorICoKKyAqIFRoaXMgaXMgdGhlIGhhcmR3YXJlIHJhdGUgbWFwIHdlIGFyZSBhd2FyZSBvZjoKKyAqCisgKiByYXRlX2NvZGUgICAweDAxICAgIDB4MDIgICAgMHgwMyAgICAweDA0ICAgIDB4MDUgICAgMHgwNiAgICAweDA3ICAgIDB4MDgKKyAqIHJhdGVfa2JwcyAgIDMwMDAgICAgMTAwMCAgICA/ICAgICAgID8gICAgICAgPyAgICAgICAyMDAwICAgIDUwMCAgICAgNDgwMDAKKyAqCisgKiByYXRlX2NvZGUgICAweDA5ICAgIDB4MEEgICAgMHgwQiAgICAweDBDICAgIDB4MEQgICAgMHgwRSAgICAweDBGICAgIDB4MTAKKyAqIHJhdGVfa2JwcyAgIDI0MDAwICAgMTIwMDAgICA2MDAwICAgIDU0MDAwICAgMzYwMDAgICAxODAwMCAgIDkwMDAgICAgPworICoKKyAqIHJhdGVfY29kZSAgIDE3ICAgICAgMTggICAgICAxOSAgICAgIDIwICAgICAgMjEgICAgICAyMiAgICAgIDIzICAgICAgMjQKKyAqIHJhdGVfa2JwcyAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgMTEwMDAKKyAqCisgKiByYXRlX2NvZGUgICAyNSAgICAgIDI2ICAgICAgMjcgICAgICAyOCAgICAgIDI5ICAgICAgMzAgICAgICAzMSAgICAgIDMyCisgKiByYXRlX2ticHMgICA1NTAwICAgIDIwMDAgICAgMTAwMCAgICAxMTAwMFMgIDU1MDBTICAgMjAwMFMgICA/ICAgICAgID8KKyAqCisgKiAiUyIgaW5kaWNhdGVzIENDSyByYXRlcyB3aXRoIHNob3J0IHByZWFtYmxlLgorICoKKyAqIEFSNTIxMSBoYXMgZGlmZmVyZW50IHJhdGUgY29kZXMgZm9yIENDSyAoODAyLjExQikgcmF0ZXMuIEl0IG9ubHkgdXNlcyB0aGUKKyAqIGxvd2VzdCA0IGJpdHMsIHNvIHRoZXkgYXJlIHRoZSBzYW1lIGFzIGJlbG93IHdpdGggYSAweEYgbWFzay4KKyAqICgweEIsIDB4QSwgMHg5IGFuZCAweDggZm9yIDFNLCAyTSwgNS41TSBhbmQgMTFNKS4KKyAqIFdlIGhhbmRsZSB0aGlzIGluIGF0aDVrX3NldHVwX2JhbmRzKCkuCisgKi8KKyNkZWZpbmUgQVI1S19NQVhfUkFURVMgMzIKKworLyogQiAqLworI2RlZmluZSBBVEg1S19SQVRFX0NPREVfMU0JMHgxQgorI2RlZmluZSBBVEg1S19SQVRFX0NPREVfMk0JMHgxQQorI2RlZmluZSBBVEg1S19SQVRFX0NPREVfNV81TQkweDE5CisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV8xMU0JMHgxOAorLyogQSBhbmQgRyAqLworI2RlZmluZSBBVEg1S19SQVRFX0NPREVfNk0JMHgwQgorI2RlZmluZSBBVEg1S19SQVRFX0NPREVfOU0JMHgwRgorI2RlZmluZSBBVEg1S19SQVRFX0NPREVfMTJNCTB4MEEKKyNkZWZpbmUgQVRINUtfUkFURV9DT0RFXzE4TQkweDBFCisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV8yNE0JMHgwOQorI2RlZmluZSBBVEg1S19SQVRFX0NPREVfMzZNCTB4MEQKKyNkZWZpbmUgQVRINUtfUkFURV9DT0RFXzQ4TQkweDA4CisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV81NE0JMHgwQworLyogWFIgKi8KKyNkZWZpbmUgQVRINUtfUkFURV9DT0RFX1hSXzUwMEsJMHgwNworI2RlZmluZSBBVEg1S19SQVRFX0NPREVfWFJfMU0JMHgwMgorI2RlZmluZSBBVEg1S19SQVRFX0NPREVfWFJfMk0JMHgwNgorI2RlZmluZSBBVEg1S19SQVRFX0NPREVfWFJfM00JMHgwMQorCisvKiBhZGRpbmcgdGhpcyBmbGFnIHRvIHJhdGVfY29kZSBlbmFibGVzIHNob3J0IHByZWFtYmxlICovCisjZGVmaW5lIEFSNUtfU0VUX1NIT1JUX1BSRUFNQkxFIDB4MDQKKworLyoKKyAqIENyeXB0byBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgQVI1S19LRVlDQUNIRV9TSVpFCTgKKworLyoqKioqKioqKioqKioqKioqKioqKioqXAorIEhXIFJFTEFURUQgREVGSU5JVElPTlMKK1wqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1pc2MgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZQlBUjVLX1JTU0lfRVBfTVVMVElQTElFUgkoMTw8NykKKworI2RlZmluZSBBUjVLX0FTU0VSVF9FTlRSWShfZSwgX3MpIGRvIHsJCVwKKwlpZiAoX2UgPj0gX3MpCQkJCVwKKwkJcmV0dXJuIDA7CQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIEhhcmR3YXJlIGludGVycnVwdCBhYnN0cmFjdGlvbgorICovCisKKy8qKgorICogZW51bSBhdGg1a19pbnQgLSBIYXJkd2FyZSBpbnRlcnJ1cHQgbWFza3MgaGVscGVycworICoKKyAqIEBBUjVLX0lOVF9SWDogbWFzayB0byBpZGVudGlmeSByZWNlaXZlZCBmcmFtZSBpbnRlcnJ1cHRzLCBvZiB0eXBlCisgKiAJQVI1S19JU1JfUlhPSyBvciBBUjVLX0lTUl9SWEVSUgorICogQEFSNUtfSU5UX1JYREVTQzogUmVxdWVzdCBSWCBkZXNjcmlwdG9yL1JlYWQgUlggZGVzY3JpcHRvciAoPykKKyAqIEBBUjVLX0lOVF9SWE5PRlJNOiBObyBmcmFtZSByZWNlaXZlZCAoPykKKyAqIEBBUjVLX0lOVF9SWEVPTDogcmVjZWl2ZWQgRW5kIE9mIExpc3QgZm9yIFZFT0wgKFZpcnR1YWwgRW5kIE9mIExpc3QpLiBUaGUKKyAqIAlRdWV1ZSBDb250cm9sIFVuaXQgKFFDVSkgc2lnbmFscyBhbiBFT0wgaW50ZXJydXB0IG9ubHkgaWYgYSBkZXNjcmlwdG9yJ3MKKyAqIAlMaW5rUHRyIGlzIE5VTEwuIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvOgorICogCWh0dHA6Ly93d3cuZnJlZXBhdGVudHNvbmxpbmUuY29tLzIwMDMwMjI1NzM5Lmh0bWwKKyAqIEBBUjVLX0lOVF9SWE9STjogSW5kaWNhdGVzIHdlIGdvdCBSWCBvdmVycnVuIChlZy4gbm8gbW9yZSBkZXNjcmlwdG9ycykuCisgKiAJTm90ZSB0aGF0IFJ4IG92ZXJydW4gaXMgbm90IGFsd2F5cyBmYXRhbCwgb24gc29tZSBjaGlwcyB3ZSBjYW4gY29udGludWUKKyAqIAlvcGVyYXRpb24gd2l0aG91dCByZXNldGluZyB0aGUgY2FyZCwgdGhhdCdzIHdoeSBpbnRfZmF0YWwgaXMgbm90CisgKiAJY29tbW9uIGZvciBhbGwgY2hpcHMuCisgKiBAQVI1S19JTlRfVFg6IG1hc2sgdG8gaWRlbnRpZnkgcmVjZWl2ZWQgZnJhbWUgaW50ZXJydXB0cywgb2YgdHlwZQorICogCUFSNUtfSVNSX1RYT0sgb3IgQVI1S19JU1JfVFhFUlIKKyAqIEBBUjVLX0lOVF9UWERFU0M6IFJlcXVlc3QgVFggZGVzY3JpcHRvci9SZWFkIFRYIHN0YXR1cyBkZXNjcmlwdG9yICg/KQorICogQEFSNUtfSU5UX1RYVVJOOiByZWNlaXZlZCB3aGVuIHdlIHNob3VsZCBpbmNyZWFzZSB0aGUgVFggdHJpZ2dlciB0aHJlc2hvbGQKKyAqIAlXZSBjdXJyZW50bHkgZG8gaW5jcmVtZW50cyBvbiBpbnRlcnJ1cHQgYnkKKyAqIAkoQVI1S19UVU5FX01BWF9UWF9GSUZPX1RIUkVTIC0gY3VycmVudF90cmlnZ2VyX2xldmVsKSAvIDIKKyAqIEBBUjVLX0lOVF9NSUI6IEluZGljYXRlcyB0aGUgTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBCYXNlIGNvdW50ZXJzIHNob3VsZCBiZQorICogCWNoZWNrZWQuIFdlIHNob3VsZCBkbyB0aGlzIHdpdGggYXRoNWtfaHdfdXBkYXRlX21pYl9jb3VudGVycygpIGJ1dAorICogCWl0IHNlZW1zIHdlIHNob3VsZCBhbHNvIHRoZW4gZG8gc29tZSBub2lzZSBpbW11bml0eSB3b3JrLgorICogQEFSNUtfSU5UX1JYUEhZOiBSWCBQSFkgRXJyb3IKKyAqIEBBUjVLX0lOVF9SWEtDTTogUlggS2V5IGNhY2hlIG1pc3MKKyAqIEBBUjVLX0lOVF9TV0JBOiBTb2Z0V2FyZSBCZWFjb24gQWxlcnQgLSBpbmRpY2F0ZXMgaXRzIHRpbWUgdG8gc2VuZCBhCisgKiAJYmVhY29uIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGluIHNvZnR3YXJlLiBUaGUgYWx0ZXJuYXRpdmUgaXMgaWYgeW91CisgKiAJaGF2ZSBWRU9MIHN1cHBvcnQsIGluIHRoYXQgY2FzZSB5b3UgbGV0IHRoZSBoYXJkd2FyZSBkZWFsIHdpdGggdGhpbmdzLgorICogQEFSNUtfSU5UX0JNSVNTOiBJZiBpbiBTVEEgbW9kZSB0aGlzIGluZGljYXRlcyB3ZSBoYXZlIHN0b3BwZWQgc2VlaW5nCisgKiAJYmVhY29ucyBmcm9tIHRoZSBBUCBoYXZlIGFzc29jaWF0ZWQgd2l0aCwgd2Ugc2hvdWxkIHByb2JhYmx5IHRyeSB0bworICogCXJlYXNzb2NpYXRlLiBXaGVuIGluIElCU1MgbW9kZSB0aGlzIG1pZ2h0IG1lYW4gd2UgaGF2ZSBub3QgcmVjZWl2ZWQKKyAqIAlhbnkgYmVhY29ucyBmcm9tIGFueSBsb2NhbCBzdGF0aW9ucy4gTm90ZSB0aGF0IGV2ZXJ5IHN0YXRpb24gaW4gYW4KKyAqIAlJQlNTIHNjaGVkdWxlcyB0byBzZW5kIGJlYWNvbnMgYXQgdGhlIFRhcmdldCBCZWFjb24gVHJhbnNtaXNzaW9uIFRpbWUKKyAqIAkoVEJUVCkgd2l0aCBhIHJhbmRvbSBiYWNrb2ZmLgorICogQEFSNUtfSU5UX0JOUjogQmVhY29uIE5vdCBSZWFkeSBpbnRlcnJ1cHQgLSA/PworICogQEFSNUtfSU5UX0dQSU86IEdQSU8gaW50ZXJydXB0IGlzIHVzZWQgZm9yIFJGIEtpbGwsIGRpc2FibGVkIGZvciBub3cKKyAqIAl1bnRpbCBwcm9wZXJseSBoYW5kbGVkCisgKiBAQVI1S19JTlRfRkFUQUw6IEZhdGFsIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkLCB0eXBpY2FsbHkgY2F1c2VkIGJ5IERNQQorICogCWVycm9ycy4gVGhlc2UgdHlwZXMgb2YgZXJyb3JzIHdlIGNhbiBlbmFibGUgc2VlbSB0byBiZSBvZiB0eXBlCisgKiAJQVI1S19TSU1SMl9NQ0FCVCwgQVI1S19TSU1SMl9TU0VSUiBhbmQgQVI1S19TSU1SMl9EUEVSUi4KKyAqIEBBUjVLX0lOVF9HTE9CQUw6IFVzZWQgdG8gY2xlYXIgYW5kIHNldCB0aGUgSUVSCisgKiBAQVI1S19JTlRfTk9DQVJEOiBzaWduYWxzIHRoZSBjYXJkIGhhcyBiZWVuIHJlbW92ZWQKKyAqIEBBUjVLX0lOVF9DT01NT046IGNvbW1vbiBpbnRlcnJ1cHRzIHNoYXJlZCBhbW9nc3QgTUFDcyB3aXRoIHRoZSBzYW1lCisgKiAJYml0IHZhbHVlCisgKgorICogVGhlc2UgYXJlIG1hcHBlZCB0byB0YWtlIGFkdmFudGFnZSBvZiBzb21lIGNvbW1vbiBiaXRzCisgKiBiZXR3ZWVuIHRoZSBNQUNzLCB0byBiZSBhYmxlIHRvIHNldCBpbnRyIHByb3BlcnRpZXMKKyAqIGVhc2llci4gU29tZSBvZiB0aGVtIGFyZSBub3QgdXNlZCB5ZXQgaW5zaWRlIGh3LmMuIE1vc3QgbWFwCisgKiB0byB0aGUgcmVzcGVjdGl2ZSBodyBpbnRlcnJ1cHQgdmFsdWUgYXMgdGhleSBhcmUgY29tbW9uIGFtb2dzdCBkaWZmZXJlbnQKKyAqIE1BQ3MuCisgKi8KK2VudW0gYXRoNWtfaW50IHsKKwlBUjVLX0lOVF9SWE9LCT0gMHgwMDAwMDAwMSwKKwlBUjVLX0lOVF9SWERFU0MJPSAweDAwMDAwMDAyLAorCUFSNUtfSU5UX1JYRVJSCT0gMHgwMDAwMDAwNCwKKwlBUjVLX0lOVF9SWE5PRlJNID0gMHgwMDAwMDAwOCwKKwlBUjVLX0lOVF9SWEVPTAk9IDB4MDAwMDAwMTAsCisJQVI1S19JTlRfUlhPUk4JPSAweDAwMDAwMDIwLAorCUFSNUtfSU5UX1RYT0sJPSAweDAwMDAwMDQwLAorCUFSNUtfSU5UX1RYREVTQwk9IDB4MDAwMDAwODAsCisJQVI1S19JTlRfVFhFUlIJPSAweDAwMDAwMTAwLAorCUFSNUtfSU5UX1RYTk9GUk0gPSAweDAwMDAwMjAwLAorCUFSNUtfSU5UX1RYRU9MCT0gMHgwMDAwMDQwMCwKKwlBUjVLX0lOVF9UWFVSTgk9IDB4MDAwMDA4MDAsCisJQVI1S19JTlRfTUlCCT0gMHgwMDAwMTAwMCwKKwlBUjVLX0lOVF9TV0kJPSAweDAwMDAyMDAwLAorCUFSNUtfSU5UX1JYUEhZCT0gMHgwMDAwNDAwMCwKKwlBUjVLX0lOVF9SWEtDTQk9IDB4MDAwMDgwMDAsCisJQVI1S19JTlRfU1dCQQk9IDB4MDAwMTAwMDAsCisJQVI1S19JTlRfQlJTU0kJPSAweDAwMDIwMDAwLAorCUFSNUtfSU5UX0JNSVNTCT0gMHgwMDA0MDAwMCwKKwlBUjVLX0lOVF9GQVRBTAk9IDB4MDAwODAwMDAsIC8qIE5vbiBjb21tb24gKi8KKwlBUjVLX0lOVF9CTlIJPSAweDAwMTAwMDAwLCAvKiBOb24gY29tbW9uICovCisJQVI1S19JTlRfVElNCT0gMHgwMDIwMDAwMCwgLyogTm9uIGNvbW1vbiAqLworCUFSNUtfSU5UX0RUSU0JPSAweDAwNDAwMDAwLCAvKiBOb24gY29tbW9uICovCisJQVI1S19JTlRfRFRJTV9TWU5DID0JMHgwMDgwMDAwMCwgLyogTm9uIGNvbW1vbiAqLworCUFSNUtfSU5UX0dQSU8JPQkweDAxMDAwMDAwLAorCUFSNUtfSU5UX0JDTl9USU1FT1VUID0JMHgwMjAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLworCUFSNUtfSU5UX0NBQl9USU1FT1VUID0JMHgwNDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLworCUFSNUtfSU5UX1JYX0RPUFBMRVIgPQkweDA4MDAwMDAwLCAvKiBOb24gY29tbW9uICovCisJQVI1S19JTlRfUUNCUk9STiA9CTB4MTAwMDAwMDAsIC8qIE5vbiBjb21tb24gKi8KKwlBUjVLX0lOVF9RQ0JSVVJOID0JMHgyMDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLworCUFSNUtfSU5UX1FUUklHCT0JMHg0MDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLworCUFSNUtfSU5UX0dMT0JBTCA9CTB4ODAwMDAwMDAsCisKKwlBUjVLX0lOVF9DT01NT04gID0gQVI1S19JTlRfUlhPSworCQl8IEFSNUtfSU5UX1JYREVTQworCQl8IEFSNUtfSU5UX1JYRVJSCisJCXwgQVI1S19JTlRfUlhOT0ZSTQorCQl8IEFSNUtfSU5UX1JYRU9MCisJCXwgQVI1S19JTlRfUlhPUk4KKwkJfCBBUjVLX0lOVF9UWE9LCisJCXwgQVI1S19JTlRfVFhERVNDCisJCXwgQVI1S19JTlRfVFhFUlIKKwkJfCBBUjVLX0lOVF9UWE5PRlJNCisJCXwgQVI1S19JTlRfVFhFT0wKKwkJfCBBUjVLX0lOVF9UWFVSTgorCQl8IEFSNUtfSU5UX01JQgorCQl8IEFSNUtfSU5UX1NXSQorCQl8IEFSNUtfSU5UX1JYUEhZCisJCXwgQVI1S19JTlRfUlhLQ00KKwkJfCBBUjVLX0lOVF9TV0JBCisJCXwgQVI1S19JTlRfQlJTU0kKKwkJfCBBUjVLX0lOVF9CTUlTUworCQl8IEFSNUtfSU5UX0dQSU8KKwkJfCBBUjVLX0lOVF9HTE9CQUwsCisKKwlBUjVLX0lOVF9OT0NBUkQJPSAweGZmZmZmZmZmCit9OworCisvKgorICogUG93ZXIgbWFuYWdlbWVudAorICovCitlbnVtIGF0aDVrX3Bvd2VyX21vZGUgeworCUFSNUtfUE1fVU5ERUZJTkVEID0gMCwKKwlBUjVLX1BNX0FVVE8sCisJQVI1S19QTV9BV0FLRSwKKwlBUjVLX1BNX0ZVTExfU0xFRVAsCisJQVI1S19QTV9ORVRXT1JLX1NMRUVQLAorfTsKKworLyogR1BJTy1jb250cm9sbGVkIHNvZnR3YXJlIExFRCAqLworI2RlZmluZSBBUjVLX1NPRlRMRURfUElOCTAKKyNkZWZpbmUgQVI1S19TT0ZUTEVEX09OCQkwCisjZGVmaW5lIEFSNUtfU09GVExFRF9PRkYJMQorCisvKgorICogQ2hpcHNldCBjYXBhYmlsaXRpZXMgLXNlZSBhdGg1a19od19nZXRfY2FwYWJpbGl0eS0KKyAqIGdldF9jYXBhYmlsaXR5IGZ1bmN0aW9uIGlzIG5vdCB5ZXQgZnVsbHkgaW1wbGVtZW50ZWQKKyAqIGluIGF0aDVrIHNvIG1vc3Qgb2YgdGhlc2UgZG9uJ3Qgd29yayB5ZXQuLi4KKyAqIFRPRE86IEltcGxlbWVudCB0aGVzZSAmIG1lcmdlIHdpdGggX1RVTkVfIHN0dWZmIGFib3ZlCisgKi8KK2VudW0gYXRoNWtfY2FwYWJpbGl0eV90eXBlIHsKKwlBUjVLX0NBUF9SRUdfRE1OCQk9IDAsCS8qIFVzZWQgdG8gZ2V0IGN1cnJlbnQgcmVnLiBkb21haW4gaWQgKi8KKwlBUjVLX0NBUF9US0lQX01JQwkJPSAyLAkvKiBDYW4gaGFuZGxlIFRLSVAgTUlDIGluIGhhcmR3YXJlICovCisJQVI1S19DQVBfVEtJUF9TUExJVAkJPSAzLAkvKiBUS0lQIHVzZXMgc3BsaXQga2V5cyAqLworCUFSNUtfQ0FQX1BIWUNPVU5URVJTCQk9IDQsCS8qIFBIWSBlcnJvciBjb3VudGVycyAqLworCUFSNUtfQ0FQX0RJVkVSU0lUWQkJPSA1LAkvKiBTdXBwb3J0cyBmYXN0IGRpdmVyc2l0eSAqLworCUFSNUtfQ0FQX05VTV9UWFFVRVVFUwkJPSA2LAkvKiBVc2VkIHRvIGdldCBtYXggbnVtYmVyIG9mIGh3IHR4cXVldWVzICovCisJQVI1S19DQVBfVkVPTAkJCT0gNywJLyogU3VwcG9ydHMgdmlydHVhbCBFT0wgKi8KKwlBUjVLX0NBUF9DT01QUkVTU0lPTgkJPSA4LAkvKiBTdXBwb3J0cyBjb21wcmVzc2lvbiAqLworCUFSNUtfQ0FQX0JVUlNUCQkJPSA5LAkvKiBTdXBwb3J0cyBwYWNrZXQgYnVyc3RpbmcgKi8KKwlBUjVLX0NBUF9GQVNURlJBTUUJCT0gMTAsCS8qIFN1cHBvcnRzIGZhc3QgZnJhbWVzICovCisJQVI1S19DQVBfVFhQT1cJCQk9IDExLAkvKiBVc2VkIHRvIGdldCBnbG9iYWwgdHggcG93ZXIgbGltaXQgKi8KKwlBUjVLX0NBUF9UUEMJCQk9IDEyLAkvKiBDYW4gZG8gcGVyLXBhY2tldCB0eCBwb3dlciBjb250cm9sIChuZWVkZWQgZm9yIDgwMi4xMWEpICovCisJQVI1S19DQVBfQlNTSURNQVNLCQk9IDEzLAkvKiBTdXBwb3J0cyBic3NpZCBtYXNrICovCisJQVI1S19DQVBfTUNBU1RfS0VZU1JDSAkJPSAxNCwJLyogU3VwcG9ydHMgbXVsdGljYXN0IGtleSBzZWFyY2ggKi8KKwlBUjVLX0NBUF9UU0ZfQURKVVNUCQk9IDE1LAkvKiBTdXBwb3J0cyBiZWFjb24gdHNmIGFkanVzdCAqLworCUFSNUtfQ0FQX1hSCQkJPSAxNiwJLyogU3VwcG9ydHMgWFIgbW9kZSAqLworCUFSNUtfQ0FQX1dNRV9US0lQTUlDIAkJPSAxNywJLyogU3VwcG9ydHMgVEtJUCBNSUMgd2hlbiB1c2luZyBXTU0gKi8KKwlBUjVLX0NBUF9DSEFOX0hBTEZSQVRFIAkJPSAxOCwJLyogU3VwcG9ydHMgaGFsZiByYXRlIGNoYW5uZWxzICovCisJQVI1S19DQVBfQ0hBTl9RVUFSVEVSUkFURSAJPSAxOSwJLyogU3VwcG9ydHMgcXVhcnRlciByYXRlIGNoYW5uZWxzICovCisJQVI1S19DQVBfUkZTSUxFTlQJCT0gMjAsCS8qIFN1cHBvcnRzIFJGc2lsZW50ICovCit9OworCisKKy8qIFhYWDogd2UgKm1heSogbW92ZSBjYXBfcmFuZ2Ugc3R1ZmYgdG8gc3RydWN0IHdpcGh5ICovCitzdHJ1Y3QgYXRoNWtfY2FwYWJpbGl0aWVzIHsKKwkvKgorCSAqIFN1cHBvcnRlZCBQSFkgbW9kZXMKKwkgKiAoaWUuIENIQU5ORUxfQSwgQ0hBTk5FTF9CLCAuLi4pCisJICovCisJdTE2IGNhcF9tb2RlOworCisJLyoKKwkgKiBGcmVxdWVuY3kgcmFuZ2UgKHdpdGhvdXQgcmVndWxhdGlvbiByZXN0cmljdGlvbnMpCisJICovCisJc3RydWN0IHsKKwkJdTE2CXJhbmdlXzJnaHpfbWluOworCQl1MTYJcmFuZ2VfMmdoel9tYXg7CisJCXUxNglyYW5nZV81Z2h6X21pbjsKKwkJdTE2CXJhbmdlXzVnaHpfbWF4OworCX0gY2FwX3JhbmdlOworCisJLyoKKwkgKiBWYWx1ZXMgc3RvcmVkIGluIHRoZSBFRVBST00gKHNvbWUgb2YgdGhlbS4uLikKKwkgKi8KKwlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8JY2FwX2VlcHJvbTsKKworCS8qCisJICogUXVldWUgaW5mb3JtYXRpb24KKwkgKi8KKwlzdHJ1Y3QgeworCQl1OAlxX3R4X251bTsKKwl9IGNhcF9xdWV1ZXM7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIEhBUkRXQVJFIEFCU1RSQUNUSU9OIExBWUVSIFNUUlVDVFVSRQorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1pc2MgZGVmaW5lcworICovCisKKyNkZWZpbmUgQVI1S19NQVhfR1BJTwkJMTAKKyNkZWZpbmUgQVI1S19NQVhfUkZfQkFOS1MJOAorCisvKiBUT0RPOiBDbGVhbiB1cCBhbmQgbWVyZ2Ugd2l0aCBhdGg1a19zb2Z0YyAqLworc3RydWN0IGF0aDVrX2h3IHsKKwlzdHJ1Y3QgYXRoNWtfc29mdGMJKmFoX3NjOworCXZvaWQJCQkqYWhfaW9iYXNlOworCisJZW51bSBhdGg1a19pbnQJCWFoX2ltcjsKKwlpbnQJCQlhaF9pZXI7CisKKwlzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbAkqYWhfY3VycmVudF9jaGFubmVsOworCWludAkJCWFoX3R1cmJvOworCWludAkJCWFoX2NhbGlicmF0aW9uOworCWludAkJCWFoX3J1bm5pbmc7CisJaW50CQkJYWhfc2luZ2xlX2NoaXA7CisJaW50CQkJYWhfY29tYmluZWRfbWljOworCisJdTMyCQkJYWhfbWFjX3NyZXY7CisJdTE2CQkJYWhfbWFjX3ZlcnNpb247CisJdTE2CQkJYWhfbWFjX3JldmlzaW9uOworCXUxNgkJCWFoX3BoeV9yZXZpc2lvbjsKKwl1MTYJCQlhaF9yYWRpb181Z2h6X3JldmlzaW9uOworCXUxNgkJCWFoX3JhZGlvXzJnaHpfcmV2aXNpb247CisKKwllbnVtIGF0aDVrX3ZlcnNpb24JYWhfdmVyc2lvbjsKKwllbnVtIGF0aDVrX3JhZGlvCWFoX3JhZGlvOworCXUzMgkJCWFoX3BoeTsKKworCWludAkJCWFoXzVnaHo7CisJaW50CQkJYWhfMmdoejsKKworI2RlZmluZSBhaF9yZWdkb21haW4JCWFoX2NhcGFiaWxpdGllcy5jYXBfcmVnZG9tYWluLnJlZ19jdXJyZW50CisjZGVmaW5lIGFoX3JlZ2RvbWFpbl9odwkJYWhfY2FwYWJpbGl0aWVzLmNhcF9yZWdkb21haW4ucmVnX2h3CisjZGVmaW5lIGFoX21vZGVzCQlhaF9jYXBhYmlsaXRpZXMuY2FwX21vZGUKKyNkZWZpbmUgYWhfZWVfdmVyc2lvbgkJYWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uZWVfdmVyc2lvbgorCisJdTMyCQkJYWhfYXRpbV93aW5kb3c7CisJdTMyCQkJYWhfYWlmczsKKwl1MzIJCQlhaF9jd19taW47CisJdTMyCQkJYWhfY3dfbWF4OworCWludAkJCWFoX3NvZnR3YXJlX3JldHJ5OworCXUzMgkJCWFoX2xpbWl0X3R4X3JldHJpZXM7CisKKwl1MzIJCQlhaF9hbnRlbm5hW0FSNUtfRUVQUk9NX05fTU9ERVNdW0FSNUtfQU5UX01BWF07CisJaW50CQkJYWhfYW50X2RpdmVyc2l0eTsKKworCXU4CQkJYWhfc3RhX2lkW0VUSF9BTEVOXTsKKworCS8qIEN1cnJlbnQgQlNTSUQgd2UgYXJlIHRyeWluZyB0byBhc3NvYyB0byAvIGNyZWF0ZS4KKwkgKiBUaGlzIGlzIHBhc3NlZCBieSBtYWM4MDIxMSBvbiBjb25maWdfaW50ZXJmYWNlKCkgYW5kIGNhY2hlZCBoZXJlIGZvcgorCSAqIHVzZSBpbiByZXNldHMgKi8KKwl1OAkJCWFoX2Jzc2lkW0VUSF9BTEVOXTsKKwl1OAkJCWFoX2Jzc2lkX21hc2tbRVRIX0FMRU5dOworCisJdTMyCQkJYWhfZ3Bpb1tBUjVLX01BWF9HUElPXTsKKwlpbnQJCQlhaF9ncGlvX25waW5zOworCisJc3RydWN0IGF0aDVrX2NhcGFiaWxpdGllcyBhaF9jYXBhYmlsaXRpZXM7CisKKwlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8JYWhfdHhxOworCXUzMgkJCWFoX3R4cV9zdGF0dXM7CisJdTMyCQkJYWhfdHhxX2ltcl90eG9rOworCXUzMgkJCWFoX3R4cV9pbXJfdHhlcnI7CisJdTMyCQkJYWhfdHhxX2ltcl90eHVybjsKKwl1MzIJCQlhaF90eHFfaW1yX3R4ZGVzYzsKKwl1MzIJCQlhaF90eHFfaW1yX3R4ZW9sOworCXUzMgkJCWFoX3R4cV9pbXJfY2Jyb3JuOworCXUzMgkJCWFoX3R4cV9pbXJfY2JydXJuOworCXUzMgkJCWFoX3R4cV9pbXJfcXRyaWc7CisJdTMyCQkJYWhfdHhxX2ltcl9ub2ZybTsKKwl1MzIJCQlhaF90eHFfaXNyOworCXUzMgkJCSphaF9yZl9iYW5rczsKKwlzaXplX3QJCQlhaF9yZl9iYW5rc19zaXplOworCXNpemVfdAkJCWFoX3JmX3JlZ3NfY291bnQ7CisJc3RydWN0IGF0aDVrX2dhaW4JYWhfZ2FpbjsKKwl1OAkJCWFoX29mZnNldFtBUjVLX01BWF9SRl9CQU5LU107CisKKworCXN0cnVjdCB7CisJCS8qIFRlbXBvcmFyeSB0YWJsZXMgdXNlZCBmb3IgaW50ZXJwb2xhdGlvbiAqLworCQl1OAkJdG1wTFtBUjVLX0VFUFJPTV9OX1BEX0dBSU5TXQorCQkJCQlbQVI1S19FRVBST01fUE9XRVJfVEFCTEVfU0laRV07CisJCXU4CQl0bXBSW0FSNUtfRUVQUk9NX05fUERfR0FJTlNdCisJCQkJCVtBUjVLX0VFUFJPTV9QT1dFUl9UQUJMRV9TSVpFXTsKKwkJdTgJCXR4cF9wZF90YWJsZVtBUjVLX0VFUFJPTV9QT1dFUl9UQUJMRV9TSVpFICogMl07CisJCXUxNgkJdHhwX3JhdGVzX3Bvd2VyX3RhYmxlW0FSNUtfTUFYX1JBVEVTXTsKKwkJdTgJCXR4cF9taW5faWR4OworCQlpbnQJCXR4cF90cGM7CisJCS8qIFZhbHVlcyBpbiAwLjI1ZEIgdW5pdHMgKi8KKwkJczE2CQl0eHBfbWluX3B3cjsKKwkJczE2CQl0eHBfbWF4X3B3cjsKKwkJczE2CQl0eHBfb2Zmc2V0OworCQlzMTYJCXR4cF9vZmRtOworCQkvKiBWYWx1ZXMgaW4gZEIgdW5pdHMgKi8KKwkJczE2CQl0eHBfY2NrX29mZG1fcHdyX2RlbHRhOworCQlzMTYJCXR4cF9jY2tfb2ZkbV9nYWluZl9kZWx0YTsKKwl9IGFoX3R4cG93ZXI7CisKKwkvKiBub2lzZSBmbG9vciBmcm9tIGxhc3QgcGVyaW9kaWMgY2FsaWJyYXRpb24gKi8KKwlzMzIJCQlhaF9ub2lzZV9mbG9vcjsKKworCS8qCisJICogRnVuY3Rpb24gcG9pbnRlcnMKKwkgKi8KKwlpbnQgKCphaF9zZXR1cF9yeF9kZXNjKShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCQl1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKKwlpbnQgKCphaF9zZXR1cF90eF9kZXNjKShzdHJ1Y3QgYXRoNWtfaHcgKiwgc3RydWN0IGF0aDVrX2Rlc2MgKiwKKwkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGVudW0gYXRoNWtfcGt0X3R5cGUsIHVuc2lnbmVkIGludCwKKwkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAorCQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKKwlpbnQgKCphaF9wcm9jX3R4X2Rlc2MpKHN0cnVjdCBhdGg1a19odyAqLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqLAorCQlzdHJ1Y3QgYXRoNWtfdHhfc3RhdHVzICopOworCWludCAoKmFoX3Byb2NfcnhfZGVzYykoc3RydWN0IGF0aDVrX2h3ICosIHN0cnVjdCBhdGg1a19kZXNjICosCisJCXN0cnVjdCBhdGg1a19yeF9zdGF0dXMgKik7Cit9OworCisvKgorICogUHJvdG90eXBlcworICovCisKK2V4dGVybiBpbnQgYXRoNWtfYml0cmF0ZV90b19od19yaXgoaW50IGJpdHJhdGUpOworCisvKiBBdHRhY2gvRGV0YWNoIEZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBhdGg1a19od19hdHRhY2goc3RydWN0IGF0aDVrX3NvZnRjICpzYywgdTggbWFjX3ZlcnNpb24sIHN0cnVjdCBhdGg1a19odyAqKmFoKTsKK2V4dGVybiB2b2lkIGF0aDVrX2h3X2RldGFjaChzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKKworLyogTEVEIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBhdGg1a19pbml0X2xlZHMoc3RydWN0IGF0aDVrX3NvZnRjICpzYyk7CitleHRlcm4gdm9pZCBhdGg1a19sZWRfZW5hYmxlKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOworZXh0ZXJuIHZvaWQgYXRoNWtfbGVkX29mZihzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKK2V4dGVybiB2b2lkIGF0aDVrX3VucmVnaXN0ZXJfbGVkcyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKKworLyogUmVzZXQgRnVuY3Rpb25zICovCitleHRlcm4gaW50IGF0aDVrX2h3X25pY193YWtldXAoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IGZsYWdzLCBpbnQgaW5pdGlhbCk7CitleHRlcm4gaW50IGF0aDVrX2h3X3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVsLCBpbnQgY2hhbmdlX2NoYW5uZWwpOworLyogUG93ZXIgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgYXRoNWtfaHdfc2V0X3Bvd2VyKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfcG93ZXJfbW9kZSBtb2RlLCBpbnQgc2V0X2NoaXAsIHUxNiBzbGVlcF9kdXJhdGlvbik7CisKKy8qIERNQSBSZWxhdGVkIEZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgYXRoNWtfaHdfc3RhcnRfcnhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgpOworZXh0ZXJuIGludCBhdGg1a19od19zdG9wX3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2V4dGVybiB1MzIgYXRoNWtfaHdfZ2V0X3J4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCk7CitleHRlcm4gdm9pZCBhdGg1a19od19zZXRfcnhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgcGh5c19hZGRyKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfc3RhcnRfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSk7CitleHRlcm4gaW50IGF0aDVrX2h3X3N0b3BfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSk7CitleHRlcm4gdTMyIGF0aDVrX2h3X2dldF90eGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSk7CitleHRlcm4gaW50IGF0aDVrX2h3X3NldF90eGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSwKKwkJCQl1MzIgcGh5c19hZGRyKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgaW5jcmVhc2UpOworLyogSW50ZXJydXB0IGhhbmRsaW5nICovCitleHRlcm4gaW50IGF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfZ2V0X2lzcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX2ludCAqaW50ZXJydXB0X21hc2spOworZXh0ZXJuIGVudW0gYXRoNWtfaW50IGF0aDVrX2h3X3NldF9pbXIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgbmV3X21hc2spOworCisvKiBFRVBST00gYWNjZXNzIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBhdGg1a19lZXByb21faW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2V4dGVybiB2b2lkIGF0aDVrX2VlcHJvbV9kZXRhY2goc3RydWN0IGF0aDVrX2h3ICphaCk7CitleHRlcm4gaW50IGF0aDVrX2VlcHJvbV9yZWFkX21hYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCAqbWFjKTsKK2V4dGVybiBpbnQgYXRoNWtfZWVwcm9tX2lzX2hiNjMoc3RydWN0IGF0aDVrX2h3ICphaCk7CisKKy8qIFByb3RvY29sIENvbnRyb2wgVW5pdCBGdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgYXRoNWtfaHdfc2V0X29wbW9kZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKKy8qIEJTU0lEIEZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgYXRoNWtfaHdfZ2V0X2xsYWRkcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCAqbWFjKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfc2V0X2xsYWRkcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBjb25zdCB1OCAqbWFjKTsKK2V4dGVybiB2b2lkIGF0aDVrX2h3X3NldF9hc3NvY2lkKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICpic3NpZCwgdTE2IGFzc29jX2lkKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2soc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKm1hc2spOworLyogUmVjZWl2ZSBzdGFydC9zdG9wIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgYXRoNWtfaHdfc3RhcnRfcnhfcGN1KHN0cnVjdCBhdGg1a19odyAqYWgpOworZXh0ZXJuIHZvaWQgYXRoNWtfaHdfc3RvcF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCk7CisvKiBSWCBGaWx0ZXIgZnVuY3Rpb25zICovCitleHRlcm4gdm9pZCBhdGg1a19od19zZXRfbWNhc3RfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIwLCB1MzIgZmlsdGVyMSk7CitleHRlcm4gdTMyIGF0aDVrX2h3X2dldF9yeF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCk7CitleHRlcm4gdm9pZCBhdGg1a19od19zZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIpOworLyogQUNLIGJpdCByYXRlICovCit2b2lkIGF0aDVrX2h3X3NldF9hY2tfYml0cmF0ZV9oaWdoKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBoaWdoKTsKKy8qIEFDSy9DVFMgVGltZW91dHMgKi8KK2V4dGVybiBpbnQgYXRoNWtfaHdfc2V0X2Fja190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRoNWtfaHdfZ2V0X2Fja190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgpOworZXh0ZXJuIGludCBhdGg1a19od19zZXRfY3RzX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHRpbWVvdXQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBhdGg1a19od19nZXRfY3RzX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCk7CisvKiBLZXkgdGFibGUgKFdFUCkgZnVuY3Rpb25zICovCitleHRlcm4gaW50IGF0aDVrX2h3X3Jlc2V0X2tleShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgZW50cnkpOworCisvKiBRdWV1ZSBDb250cm9sIFVuaXQsIERGUyBDb250cm9sIFVuaXQgRnVuY3Rpb25zICovCitleHRlcm4gaW50IGF0aDVrX2h3X3NldF90eF9xdWV1ZXByb3BzKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbyk7CitleHRlcm4gaW50IGF0aDVrX2h3X3NldHVwX3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQkJZW51bSBhdGg1a190eF9xdWV1ZSBxdWV1ZV90eXBlLAorCQkJCXN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbyk7CitleHRlcm4gdTMyIGF0aDVrX2h3X251bV90eF9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgpOworZXh0ZXJuIHZvaWQgYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfcmVzZXRfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCk7CitleHRlcm4gaW50IGF0aDVrX2h3X3NldF9zbG90X3RpbWUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHNsb3RfdGltZSk7CisKKy8qIEhhcmR3YXJlIERlc2NyaXB0b3IgRnVuY3Rpb25zICovCitleHRlcm4gaW50IGF0aDVrX2h3X2luaXRfZGVzY19mdW5jdGlvbnMoc3RydWN0IGF0aDVrX2h3ICphaCk7CisKKy8qIEdQSU8gRnVuY3Rpb25zICovCitleHRlcm4gaW50IGF0aDVrX2h3X3NldF9ncGlvX2lucHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfc2V0X2dwaW9fb3V0cHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKTsKK2V4dGVybiB1MzIgYXRoNWtfaHdfZ2V0X2dwaW8oc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pOworZXh0ZXJuIGludCBhdGg1a19od19zZXRfZ3BpbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbywgdTMyIHZhbCk7CitleHRlcm4gdm9pZCBhdGg1a19od19zZXRfZ3Bpb19pbnRyKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBncGlvLCB1MzIgaW50ZXJydXB0X2xldmVsKTsKKworLyogcmZraWxsIEZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgYXRoNWtfcmZraWxsX2h3X3N0YXJ0KHN0cnVjdCBhdGg1a19odyAqYWgpOworZXh0ZXJuIHZvaWQgYXRoNWtfcmZraWxsX2h3X3N0b3Aoc3RydWN0IGF0aDVrX2h3ICphaCk7CisKKy8qIE1pc2MgZnVuY3Rpb25zICovCitpbnQgYXRoNWtfaHdfc2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfZ2V0X2NhcGFiaWxpdHkoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19jYXBhYmlsaXR5X3R5cGUgY2FwX3R5cGUsIHUzMiBjYXBhYmlsaXR5LCB1MzIgKnJlc3VsdCk7CitleHRlcm4gaW50IGF0aDVrX2h3X2VuYWJsZV9wc3BvbGwoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggKmJzc2lkLCB1MTYgYXNzb2NfaWQpOworZXh0ZXJuIGludCBhdGg1a19od19kaXNhYmxlX3BzcG9sbChzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKKworLyogSW5pdGlhbCByZWdpc3RlciBzZXR0aW5ncyBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgYXRoNWtfaHdfd3JpdGVfaW5pdHZhbHMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggbW9kZSwgaW50IGNoYW5nZV9jaGFubmVsKTsKKworLyogSW5pdGlhbGl6ZSBSRiAqLworZXh0ZXJuIGludCBhdGg1a19od19yZnJlZ3NfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJCXN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVsLAorCQkJCXVuc2lnbmVkIGludCBtb2RlKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfcmZnYWluX2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IGZyZXEpOworZXh0ZXJuIGVudW0gYXRoNWtfcmZnYWluIGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfcmZnYWluX29wdF9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgpOworLyogUEhZL1JGIGNoYW5uZWwgZnVuY3Rpb25zICovCitleHRlcm4gaW50IGF0aDVrX2NoYW5uZWxfb2soc3RydWN0IGF0aDVrX2h3ICphaCwgdTE2IGZyZXEsIHVuc2lnbmVkIGludCBmbGFncyk7CitleHRlcm4gaW50IGF0aDVrX2h3X2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwpOworLyogUEhZIGNhbGlicmF0aW9uICovCitleHRlcm4gaW50IGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwpOworZXh0ZXJuIGludCBhdGg1a19od19ub2lzZV9mbG9vcl9jYWxpYnJhdGlvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzaG9ydCBmcmVxKTsKKy8qIE1pc2MgUEhZIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHUxNiBhdGg1a19od19yYWRpb19yZXZpc2lvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgY2hhbik7CitleHRlcm4gdm9pZCBhdGg1a19od19zZXRfZGVmX2FudGVubmEoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IGFudCk7CitleHRlcm4gdW5zaWduZWQgaW50IGF0aDVrX2h3X2dldF9kZWZfYW50ZW5uYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfcGh5X2Rpc2FibGUoc3RydWN0IGF0aDVrX2h3ICphaCk7CisvKiBUWCBwb3dlciBzZXR1cCAqLworZXh0ZXJuIGludCBhdGg1a19od190eHBvd2VyKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVsLCB1OCBlZV9tb2RlLCB1OCB0eHBvd2VyKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggZWVfbW9kZSwgdTggdHhwb3dlcik7CisKKy8qCisgKiBGdW5jdGlvbnMgdXNlZCBpbnRlcm5hbHkKKyAqLworCisvKgorICogVHJhbnNsYXRlIHVzZWMgdG8gaHcgY2xvY2sgdW5pdHMKKyAqIFRPRE86IEhhbGYvcXVhcnRlciByYXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0aDVrX2h3X2h0b2Nsb2NrKHVuc2lnbmVkIGludCB1c2VjLCBpbnQgdHVyYm8pCit7CisJcmV0dXJuIHR1cmJvID8gKHVzZWMgKiA4MCkgOiAodXNlYyAqIDQwKTsKK30KKworLyoKKyAqIFRyYW5zbGF0ZSBodyBjbG9jayB1bml0cyB0byB1c2VjCisgKiBUT0RPOiBIYWxmL3F1YXJ0ZXIgcmF0ZQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdGg1a19od19jbG9ja3RvaCh1bnNpZ25lZCBpbnQgY2xvY2ssIGludCB0dXJibykKK3sKKwlyZXR1cm4gdHVyYm8gPyAoY2xvY2sgLyA4MCkgOiAoY2xvY2sgLyA0MCk7Cit9CisKKy8qCisgKiBSZWFkIGZyb20gYSByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIHUzMiBhdGg1a19od19yZWdfcmVhZChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgcmVnKQoreworCXJldHVybiByZWFkbChhaC0+YWhfaW9iYXNlICsgcmVnKTsKK30KKworLyoKKyAqIFdyaXRlIHRvIGEgcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0aDVrX2h3X3JlZ193cml0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgdmFsLCB1MTYgcmVnKQoreworCXdyaXRlbCh2YWwsIGFoLT5haF9pb2Jhc2UgKyByZWcpOworfQorCisjaWYgZGVmaW5lZChfQVRINUtfUkVTRVQpIHx8IGRlZmluZWQoX0FUSDVLX1BIWSkKKy8qCisgKiBDaGVjayBpZiBhIHJlZ2lzdGVyIHdyaXRlIGhhcyBiZWVuIGNvbXBsZXRlZAorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3JlZ2lzdGVyX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHJlZywgdTMyIGZsYWcsCisJCXUzMiB2YWwsIGludCBpc19zZXQpCit7CisJaW50IGk7CisJdTMyIGRhdGE7CisKKwlmb3IgKGkgPSBBUjVLX1RVTkVfUkVHSVNURVJfVElNRU9VVDsgaSA+IDA7IGktLSkgeworCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIHJlZyk7CisJCWlmIChpc19zZXQgJiYgKGRhdGEgJiBmbGFnKSkKKwkJCWJyZWFrOworCQllbHNlIGlmICgoZGF0YSAmIGZsYWcpID09IHZhbCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTUpOworCX0KKworCXJldHVybiAoaSA8PSAwKSA/IC1FQUdBSU4gOiAwOworfQorCisvKgorICogQ29udmVydCBjaGFubmVsIGZyZXF1ZW5jeSB0byBjaGFubmVsIG51bWJlcgorICovCitzdGF0aWMgaW5saW5lIGludCBhdGg1a19mcmVxX3RvX2NoYW5uZWwoaW50IGZyZXEpCit7CisJaWYgKGZyZXEgPT0gMjQ4NCkKKwkJcmV0dXJuIDE0OworCisJaWYgKGZyZXEgPCAyNDg0KQorCQlyZXR1cm4gKGZyZXEgLSAyNDA3KSAvIDU7CisKKwlyZXR1cm4gZnJlcS81IC0gMTAwMDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdTMyIGF0aDVrX2h3X2JpdHN3YXAodTMyIHZhbCwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJdTMyIHJldHZhbCA9IDAsIGJpdCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBiaXRzOyBpKyspIHsKKwkJYml0ID0gKHZhbCA+PiBpKSAmIDE7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCBiaXQ7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19hdHRhY2guYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrX2F0dGFjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGMyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19hdHRhY2guYwpAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqCisgKiBNb2RpZmllZCBmb3IgZ1BYRSwgSnVseSAyMDA5LCBieSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0PgorICogT3JpZ2luYWwgZnJvbSBMaW51eCBrZXJuZWwgMi42LjMwLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBNSVQgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIEF0dGFjaC9EZXRhY2ggRnVuY3Rpb25zIGFuZCBoZWxwZXJzICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImJhc2UuaCIKKworLyoqCisgKiBhdGg1a19od19wb3N0IC0gUG93ZXIgT24gU2VsZiBUZXN0IGhlbHBlciBmdW5jdGlvbgorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqLworc3RhdGljIGludCBhdGg1a19od19wb3N0KHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisKKwlzdGF0aWMgY29uc3QgdTMyIHN0YXRpY19wYXR0ZXJuWzRdID0geworCQkweDU1NTU1NTU1LAkweGFhYWFhYWFhLAorCQkweDY2NjY2NjY2LAkweDk5OTk5OTk5CisJfTsKKwlzdGF0aWMgY29uc3QgdTE2IHJlZ3NbMl0gPSB7IEFSNUtfU1RBX0lEMCwgQVI1S19QSFkoOCkgfTsKKwlpbnQgaSwgYzsKKwl1MTYgY3VyX3JlZzsKKwl1MzIgdmFyX3BhdHRlcm47CisJdTMyIGluaXRfdmFsOworCXUzMiBjdXJfdmFsOworCisJZm9yIChjID0gMDsgYyA8IDI7IGMrKykgeworCisJCWN1cl9yZWcgPSByZWdzW2NdOworCisJCS8qIFNhdmUgcHJldmlvdXMgdmFsdWUgKi8KKwkJaW5pdF92YWwgPSBhdGg1a19od19yZWdfcmVhZChhaCwgY3VyX3JlZyk7CisKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQl2YXJfcGF0dGVybiA9IGkgPDwgMTYgfCBpOworCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB2YXJfcGF0dGVybiwgY3VyX3JlZyk7CisJCQljdXJfdmFsID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIGN1cl9yZWcpOworCisJCQlpZiAoY3VyX3ZhbCAhPSB2YXJfcGF0dGVybikgeworCQkJCURCRygiYXRoNWs6IFBPU1QgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisKKwkJCS8qIEZvdW5kIG9uIG5kaXN3cmFwcGVyIGR1bXBzICovCisJCQl2YXJfcGF0dGVybiA9IDB4MDAzOTA4MGY7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHZhcl9wYXR0ZXJuLCBjdXJfcmVnKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXZhcl9wYXR0ZXJuID0gc3RhdGljX3BhdHRlcm5baV07CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHZhcl9wYXR0ZXJuLCBjdXJfcmVnKTsKKwkJCWN1cl92YWwgPSBhdGg1a19od19yZWdfcmVhZChhaCwgY3VyX3JlZyk7CisKKwkJCWlmIChjdXJfdmFsICE9IHZhcl9wYXR0ZXJuKSB7CisJCQkJREJHKCJhdGg1azogUE9TVCBmYWlsZWQhXG4iKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKworCQkJLyogRm91bmQgb24gbmRpc3dyYXBwZXIgZHVtcHMgKi8KKwkJCXZhcl9wYXR0ZXJuID0gMHgwMDNiMDgwZjsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdmFyX3BhdHRlcm4sIGN1cl9yZWcpOworCQl9CisKKwkJLyogUmVzdG9yZSBwcmV2aW91cyB2YWx1ZSAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGluaXRfdmFsLCBjdXJfcmVnKTsKKworCX0KKworCXJldHVybiAwOworCit9CisKKy8qKgorICogYXRoNWtfaHdfYXR0YWNoIC0gQ2hlY2sgaWYgaHcgaXMgc3VwcG9ydGVkIGFuZCBpbml0IHRoZSBuZWVkZWQgc3RydWN0cworICoKKyAqIEBzYzogVGhlICZzdHJ1Y3QgYXRoNWtfc29mdGMgd2UgZ290IGZyb20gdGhlIGRyaXZlcidzIGF0dGFjaCBmdW5jdGlvbgorICogQG1hY192ZXJzaW9uOiBUaGUgbWFjIHZlcnNpb24gaWQgKGNoZWNrIG91dCBhdGg1ay5oKSBiYXNlZCBvbiBwY2kgaWQKKyAqIEBodzogUmV0dXJuZWQgbmV3bHkgYWxsb2NhdGVkIGhhcmR3YXJlIHN0cnVjdHVyZSwgb24gc3VjY2VzcworICoKKyAqIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkLCBwZXJmb3JtIGEgUE9TVCBhbmQgaW5pdGlhbGl6ZSB0aGUgbmVlZGVkCisgKiBzdHJ1Y3RzLiBSZXR1cm5zIC1FTk9NRU0gaWYgd2UgZG9uJ3QgaGF2ZSBtZW1vcnkgZm9yIHRoZSBuZWVkZWQgc3RydWN0cywKKyAqIC1FTk9ERVYgaWYgdGhlIGRldmljZSBpcyBub3Qgc3VwcG9ydGVkIG9yIHByaW50cyBhbiBlcnJvciBtc2cgaWYgc29tZXRoaW5nCisgKiBlbHNlIHdlbnQgd3JvbmcuCisgKi8KK2ludCBhdGg1a19od19hdHRhY2goc3RydWN0IGF0aDVrX3NvZnRjICpzYywgdTggbWFjX3ZlcnNpb24sCisJCSAgICBzdHJ1Y3QgYXRoNWtfaHcgKipodykKK3sKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoOworCXN0cnVjdCBwY2lfZGV2aWNlICpwZGV2ID0gc2MtPnBkZXY7CisJaW50IHJldDsKKwl1MzIgc3JldjsKKworCWFoID0gemFsbG9jKHNpemVvZihzdHJ1Y3QgYXRoNWtfaHcpKTsKKwlpZiAoYWggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlEQkcoImF0aDVrOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJYWgtPmFoX3NjID0gc2M7CisJYWgtPmFoX2lvYmFzZSA9IHNjLT5pb2Jhc2U7CisKKwkvKgorCSAqIEhXIGluZm9ybWF0aW9uCisJICovCisJYWgtPmFoX3R1cmJvID0gMDsKKwlhaC0+YWhfdHhwb3dlci50eHBfdHBjID0gMDsKKwlhaC0+YWhfaW1yID0gMDsKKwlhaC0+YWhfYXRpbV93aW5kb3cgPSAwOworCWFoLT5haF9haWZzID0gQVI1S19UVU5FX0FJRlM7CisJYWgtPmFoX2N3X21pbiA9IEFSNUtfVFVORV9DV01JTjsKKwlhaC0+YWhfbGltaXRfdHhfcmV0cmllcyA9IEFSNUtfSU5JVF9UWF9SRVRSWTsKKwlhaC0+YWhfc29mdHdhcmVfcmV0cnkgPSAwOworCWFoLT5haF9hbnRfZGl2ZXJzaXR5ID0gQVI1S19UVU5FX0FOVF9ESVZFUlNJVFk7CisKKwkvKgorCSAqIFNldCB0aGUgbWFjIHZlcnNpb24gYmFzZWQgb24gdGhlIHBjaSBpZAorCSAqLworCWFoLT5haF92ZXJzaW9uID0gbWFjX3ZlcnNpb247CisKKwkvKkZpbGwgdGhlIGF0aDVrX2h3IHN0cnVjdCB3aXRoIHRoZSBuZWVkZWQgZnVuY3Rpb25zKi8KKwlyZXQgPSBhdGg1a19od19pbml0X2Rlc2NfZnVuY3Rpb25zKGFoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJLyogQnJpbmcgZGV2aWNlIG91dCBvZiBzbGVlcCBhbmQgcmVzZXQgaXQncyB1bml0cyAqLworCXJldCA9IGF0aDVrX2h3X25pY193YWtldXAoYWgsIENIQU5ORUxfQiwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZTsKKworCS8qIEdldCBNQUMsIFBIWSBhbmQgUkFESU8gcmV2aXNpb25zICovCisJc3JldiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NSRVYpOworCWFoLT5haF9tYWNfc3JldiA9IHNyZXY7CisJYWgtPmFoX21hY192ZXJzaW9uID0gQVI1S19SRUdfTVMoc3JldiwgQVI1S19TUkVWX1ZFUik7CisJYWgtPmFoX21hY19yZXZpc2lvbiA9IEFSNUtfUkVHX01TKHNyZXYsIEFSNUtfU1JFVl9SRVYpOworCWFoLT5haF9waHlfcmV2aXNpb24gPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfQ0hJUF9JRCk7CisJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPSBhdGg1a19od19yYWRpb19yZXZpc2lvbihhaCwgQ0hBTk5FTF81R0haKTsKKwlhaC0+YWhfcGh5ID0gQVI1S19QSFkoMCk7CisKKwkvKiBUcnkgdG8gaWRlbnRpZnkgcmFkaW8gY2hpcCBiYXNlZCBvbiBpdCdzIHNyZXYgKi8KKwlzd2l0Y2ggKGFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uICYgMHhmMCkgeworCWNhc2UgQVI1S19TUkVWX1JBRF81MTExOgorCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGNTExMTsKKwkJYWgtPmFoX3NpbmdsZV9jaGlwID0gMDsKKwkJYWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24gPSBhdGg1a19od19yYWRpb19yZXZpc2lvbihhaCwKKwkJCQkJCQlDSEFOTkVMXzJHSFopOworCQlicmVhazsKKwljYXNlIEFSNUtfU1JFVl9SQURfNTExMjoKKwljYXNlIEFSNUtfU1JFVl9SQURfMjExMjoKKwkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjUxMTI7CisJCWFoLT5haF9zaW5nbGVfY2hpcCA9IDA7CisJCWFoLT5haF9yYWRpb18yZ2h6X3JldmlzaW9uID0gYXRoNWtfaHdfcmFkaW9fcmV2aXNpb24oYWgsCisJCQkJCQkJQ0hBTk5FTF8yR0haKTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1NSRVZfUkFEXzI0MTM6CisJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkYyNDEzOworCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSAxOworCQlicmVhazsKKwljYXNlIEFSNUtfU1JFVl9SQURfNTQxMzoKKwkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjU0MTM7CisJCWFoLT5haF9zaW5nbGVfY2hpcCA9IDE7CisJCWJyZWFrOworCWNhc2UgQVI1S19TUkVWX1JBRF8yMzE2OgorCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGMjMxNjsKKwkJYWgtPmFoX3NpbmdsZV9jaGlwID0gMTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1NSRVZfUkFEXzIzMTc6CisJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkYyMzE3OworCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSAxOworCQlicmVhazsKKwljYXNlIEFSNUtfU1JFVl9SQURfNTQyNDoKKwkJaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSBBUjVLX1NSRVZfQVIyNDI1IHx8CisJCSAgICBhaC0+YWhfbWFjX3ZlcnNpb24gPT0gQVI1S19TUkVWX0FSMjQxNykgeworCQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjI0MjU7CisJCX0gZWxzZSB7CisJCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGNTQxMzsKKwkJfQorCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZGVudGlmeSByYWRpbyBiYXNlZCBvbiBtYWMvcGh5IHNyZXYgKi8KKwkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGNTExMDsKKwkJCWFoLT5haF9zaW5nbGVfY2hpcCA9IDA7CisJCX0gZWxzZSBpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTEpIHsKKwkJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkY1MTExOworCQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gMDsKKwkJCWFoLT5haF9yYWRpb18yZ2h6X3JldmlzaW9uID0gYXRoNWtfaHdfcmFkaW9fcmV2aXNpb24oYWgsCisJCQkJCQkJCUNIQU5ORUxfMkdIWik7CisJCX0gZWxzZSBpZiAoYWgtPmFoX21hY192ZXJzaW9uID09IChBUjVLX1NSRVZfQVIyNDI1ID4+IDQpIHx8CisJCQkgICBhaC0+YWhfbWFjX3ZlcnNpb24gPT0gKEFSNUtfU1JFVl9BUjI0MTcgPj4gNCkgfHwKKwkJCSAgIGFoLT5haF9waHlfcmV2aXNpb24gPT0gQVI1S19TUkVWX1BIWV8yNDI1KSB7CisJCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGMjQyNTsKKwkJCWFoLT5haF9zaW5nbGVfY2hpcCA9IDE7CisJCQlhaC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiA9IEFSNUtfU1JFVl9SQURfMjQyNTsKKwkJfSBlbHNlIGlmIChzcmV2ID09IEFSNUtfU1JFVl9BUjUyMTNBICYmCisJCQkgICBhaC0+YWhfcGh5X3JldmlzaW9uID09IEFSNUtfU1JFVl9QSFlfNTIxMkIpIHsKKwkJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkY1MTEyOworCQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gMDsKKwkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uID0gQVI1S19TUkVWX1JBRF81MTEyQjsKKwkJfSBlbHNlIGlmIChhaC0+YWhfbWFjX3ZlcnNpb24gPT0gKEFSNUtfU1JFVl9BUjI0MTUgPj4gNCkpIHsKKwkJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkYyMzE2OworCQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gMTsKKwkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uID0gQVI1S19TUkVWX1JBRF8yMzE2OworCQl9IGVsc2UgaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSAoQVI1S19TUkVWX0FSNTQxNCA+PiA0KSB8fAorCQkJICAgYWgtPmFoX3BoeV9yZXZpc2lvbiA9PSBBUjVLX1NSRVZfUEhZXzU0MTMpIHsKKwkJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkY1NDEzOworCQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gMTsKKwkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uID0gQVI1S19TUkVWX1JBRF81NDEzOworCQl9IGVsc2UgaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSAoQVI1S19TUkVWX0FSMjQxNCA+PiA0KSB8fAorCQkJICAgYWgtPmFoX3BoeV9yZXZpc2lvbiA9PSBBUjVLX1NSRVZfUEhZXzI0MTMpIHsKKwkJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkYyNDEzOworCQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gMTsKKwkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uID0gQVI1S19TUkVWX1JBRF8yNDEzOworCQl9IGVsc2UgeworCQkJREJHKCJhdGg1azogQ291bGRuJ3QgaWRlbnRpZnkgcmFkaW8gcmV2aXNpb24uXG4iKTsKKwkJCXJldCA9IC1FTk9UU1VQOworCQkJZ290byBlcnJfZnJlZTsKKwkJfQorCX0KKworCS8qIFJldHVybiBvbiB1bnN1cG9ydGVkIGNoaXBzICh1bnN1cHBvcnRlZCBlZXByb20gZXRjKSAqLworCWlmICgoc3JldiA+PSBBUjVLX1NSRVZfQVI1NDE2KSAmJgorCSAgICAoc3JldiA8IEFSNUtfU1JFVl9BUjI0MjUpKSB7CisJCURCRygiYXRoNWs6IERldmljZSBub3QgeWV0IHN1cHBvcnRlZC5cbiIpOworCQlyZXQgPSAtRU5PVFNVUDsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwkvKgorCSAqIFdyaXRlIFBDSS1FIHBvd2VyIHNhdmUgc2V0dGluZ3MKKwkgKi8KKwlpZiAoKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSAmJgorCSAgICBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKSkgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4OTI0OGZjMDAsIEFSNUtfUENJRV9TRVJERVMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MjQ5MjQ5MjQsIEFSNUtfUENJRV9TRVJERVMpOworCQkvKiBTaHV0IG9mZiBSWCB3aGVuIGVsZWNpZGxlIGlzIGFzc2VydGVkICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgyODAwMDAzOSwgQVI1S19QQ0lFX1NFUkRFUyk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHg1MzE2MDgyNCwgQVI1S19QQ0lFX1NFUkRFUyk7CisJCS8qIFRPRE86IEVFUFJPTSB3b3JrICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHhlNTk4MDU3OSwgQVI1S19QQ0lFX1NFUkRFUyk7CisJCS8qIFNodXQgb2ZmIFBMTCBhbmQgQ0xLUkVRIGFjdGl2ZSBpbiBMMSAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAxZGVmZmYsIEFSNUtfUENJRV9TRVJERVMpOworCQkvKiBQcmVzZXJjZSBvdGhlciBzZXR0aW5ncyAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MWFhYWJlNDAsIEFSNUtfUENJRV9TRVJERVMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4YmUxMDU1NTQsIEFSNUtfUENJRV9TRVJERVMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwZTMwMDcsIEFSNUtfUENJRV9TRVJERVMpOworCQkvKiBSZXNldCBTRVJERVMgdG8gbG9hZCBuZXcgc2V0dGluZ3MgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMDAwMDAwLCBBUjVLX1BDSUVfU0VSREVTX1JFU0VUKTsKKwkJbWRlbGF5KDEpOworCX0KKworCS8qCisJICogUE9TVAorCSAqLworCXJldCA9IGF0aDVrX2h3X3Bvc3QoYWgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwkvKiBFbmFibGUgcGNpIGNvcmUgcmV0cnkgZml4IG9uIEhhaW5hbiAoNTIxM0EpIGFuZCBsYXRlciBjaGlwcyAqLworCWlmIChzcmV2ID49IEFSNUtfU1JFVl9BUjUyMTNBKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUENJQ0ZHX1JFVFJZX0ZJWCwgQVI1S19QQ0lDRkcpOworCisJLyoKKwkgKiBHZXQgY2FyZCBjYXBhYmlsaXRpZXMsIGNhbGlicmF0aW9uIHZhbHVlcyBldGMKKwkgKiBUT0RPOiBFRVBST00gd29yaworCSAqLworCXJldCA9IGF0aDVrX2VlcHJvbV9pbml0KGFoKTsKKwlpZiAocmV0KSB7CisJCURCRygiYXRoNWs6IHVuYWJsZSB0byBpbml0IEVFUFJPTVxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJLyogR2V0IG1pc2MgY2FwYWJpbGl0aWVzICovCisJcmV0ID0gYXRoNWtfaHdfc2V0X2NhcGFiaWxpdGllcyhhaCk7CisJaWYgKHJldCkgeworCQlEQkcoImF0aDVrOiB1bmFibGUgdG8gZ2V0IGRldmljZSBjYXBhYmlsaXRpZXM6IDB4JTA0eFxuIiwKKwkJICAgIHNjLT5wZGV2LT5kZXZpY2UpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCWlmIChzcmV2ID49IEFSNUtfU1JFVl9BUjI0MTQpIHsKKwkJYWgtPmFoX2NvbWJpbmVkX21pYyA9IDE7CisJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX01JU0NfTU9ERSwKKwkJCQkgICAgIEFSNUtfTUlTQ19NT0RFX0NPTUJJTkVEX01JQyk7CisJfQorCisJLyogU2V0IEJTU0lEIHRvIGJjYXN0IGFkZHJlc3M6IGZmOmZmOmZmOmZmOmZmOmZmIGZvciBub3cgKi8KKwltZW1zZXQoYWgtPmFoX2Jzc2lkLCAweGZmLCBFVEhfQUxFTik7CisJYXRoNWtfaHdfc2V0X2Fzc29jaWQoYWgsIGFoLT5haF9ic3NpZCwgMCk7CisJYXRoNWtfaHdfc2V0X29wbW9kZShhaCk7CisKKwlhdGg1a19od19yZmdhaW5fb3B0X2luaXQoYWgpOworCisJKmh3ID0gYWg7CisJcmV0dXJuIDA7CitlcnJfZnJlZToKKwlmcmVlKGFoKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGF0aDVrX2h3X2RldGFjaCAtIEZyZWUgdGhlIGF0aDVrX2h3IHN0cnVjdAorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqLwordm9pZCBhdGg1a19od19kZXRhY2goc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwlmcmVlKGFoLT5haF9yZl9iYW5rcyk7CisJYXRoNWtfZWVwcm9tX2RldGFjaChhaCk7CisJZnJlZShhaCk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19jYXBzLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19jYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2MGQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrX2NhcHMuYwpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CisgKgorICogTGlnaHRseSBtb2RpZmllZCBmb3IgZ1BYRSwgSnVseSAyMDA5LCBieSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0Pi4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggTUlUICk7CisKKy8qKioqKioqKioqKioqKlwKKyogQ2FwYWJpbGl0aWVzICoKK1wqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImF0aDVrLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiYmFzZS5oIgorCisvKgorICogRmlsbCB0aGUgY2FwYWJpbGl0aWVzIHN0cnVjdAorICogVE9ETzogTWVyZ2UgdGhpcyB3aXRoIEVFUFJPTSBjb2RlIHdoZW4gd2UgYXJlIGRvbmUgd2l0aCBpdAorICovCitpbnQgYXRoNWtfaHdfc2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXUxNiBlZV9oZWFkZXI7CisKKwkvKiBDYXBhYmlsaXRpZXMgc3RvcmVkIGluIHRoZSBFRVBST00gKi8KKwllZV9oZWFkZXIgPSBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uZWVfaGVhZGVyOworCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCS8qCisJCSAqIFNldCByYWRpbyBjYXBhYmlsaXRpZXMKKwkJICogKFRoZSBBUjUxMTAgb25seSBzdXBwb3J0cyB0aGUgbWlkZGxlIDVHSHogYmFuZCkKKwkJICovCisJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzVnaHpfbWluID0gNTEyMDsKKwkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfNWdoel9tYXggPSA1NDMwOworCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9yYW5nZS5yYW5nZV8yZ2h6X21pbiA9IDA7CisJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzJnaHpfbWF4ID0gMDsKKworCQkvKiBTZXQgc3VwcG9ydGVkIG1vZGVzICovCisJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUgfD0gQVI1S19NT0RFX0JJVF8xMUE7CisJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUgfD0gQVI1S19NT0RFX0JJVF8xMUFfVFVSQk87CisJfSBlbHNlIHsKKwkJLyoKKwkJICogWFhYIFRoZSB0cmFuY2VpdmVyIHN1cHBvcnRzIGZyZXF1ZW5jaWVzIGZyb20gNDkyMCB0byA2MTAwR0h6CisJCSAqIFhYWCBhbmQgZnJvbSAyMzEyIHRvIDI3MzJHSHouIFRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZQorCQkgKiBYWFggY3VycmVudCBpZWVlODAyMTEgaW1wbGVtZW50YXRpb24gYmVjYXVzZSB0aGUgSUVFRQorCQkgKiBYWFggY2hhbm5lbCBtYXBwaW5nIGRvZXMgbm90IHN1cHBvcnQgbmVnYXRpdmUgY2hhbm5lbAorCQkgKiBYWFggbnVtYmVycyAoMjMxMk1IeiBpcyBjaGFubmVsIC0xOSkuIE9mIGNvdXJzZSwgdGhpcworCQkgKiBYWFggZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSB0aGVzZSBjaGFubmVscyBhcmUgb3V0IG9mIHJhbmdlCisJCSAqIFhYWCBidXQgc29tZSByZWd1bGF0aW9uIGRvbWFpbnMgbGlrZSBNS0sgKEphcGFuKSB3aWxsCisJCSAqIFhYWCBzdXBwb3J0IGZyZXF1ZW5jaWVzIHNvbWV3aGVyZSBhcm91bmQgNC44R0h6LgorCQkgKi8KKworCQkvKgorCQkgKiBTZXQgcmFkaW8gY2FwYWJpbGl0aWVzCisJCSAqLworCisJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFBKGVlX2hlYWRlcikpIHsKKwkJCS8qIDQ5MjAgKi8KKwkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzVnaHpfbWluID0gNTAwNTsKKwkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzVnaHpfbWF4ID0gNjEwMDsKKworCQkJLyogU2V0IHN1cHBvcnRlZCBtb2RlcyAqLworCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSB8PSBBUjVLX01PREVfQklUXzExQTsKKwkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUgfD0gQVI1S19NT0RFX0JJVF8xMUFfVFVSQk87CisJCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCisJCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSB8PQorCQkJCQlBUjVLX01PREVfQklUXzExR19UVVJCTzsKKwkJfQorCisJCS8qIEVuYWJsZSAgODAyLjExYiBpZiBhIDJHSHogY2FwYWJsZSByYWRpbyAoMjExMS81MTEyKSBpcworCQkgKiBjb25uZWN0ZWQgKi8KKwkJaWYgKEFSNUtfRUVQUk9NX0hEUl8xMUIoZWVfaGVhZGVyKSB8fAorCQkgICAgKEFSNUtfRUVQUk9NX0hEUl8xMUcoZWVfaGVhZGVyKSAmJgorCQkgICAgIGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjExKSkgeworCQkJLyogMjMxMiAqLworCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfMmdoel9taW4gPSAyNDEyOworCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfMmdoel9tYXggPSAyNzMyOworCisJCQlpZiAoQVI1S19FRVBST01fSERSXzExQihlZV9oZWFkZXIpKQorCQkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUgfD0KKwkJCQkJQVI1S19NT0RFX0JJVF8xMUI7CisKKwkJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFHKGVlX2hlYWRlcikgJiYKKwkJCSAgICBhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMSkKKwkJCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlIHw9CisJCQkJCUFSNUtfTU9ERV9CSVRfMTFHOworCQl9CisJfQorCisJLyogR1BJTyAqLworCWFoLT5haF9ncGlvX25waW5zID0gQVI1S19OVU1fR1BJTzsKKworCS8qIFNldCBudW1iZXIgb2Ygc3VwcG9ydGVkIFRYIHF1ZXVlcyAqLworCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogTWFpbiBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBkcml2ZXIgcGFydCB0byBjaGVjayBjYXBzICovCitpbnQgYXRoNWtfaHdfZ2V0X2NhcGFiaWxpdHkoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJZW51bSBhdGg1a19jYXBhYmlsaXR5X3R5cGUgY2FwX3R5cGUsCisJCXUzMiBjYXBhYmlsaXR5IF9fdW51c2VkLCB1MzIgKnJlc3VsdCkKK3sKKwlzd2l0Y2ggKGNhcF90eXBlKSB7CisJY2FzZSBBUjVLX0NBUF9OVU1fVFhRVUVVRVM6CisJCWlmIChyZXN1bHQpIHsKKwkJCSpyZXN1bHQgPSAxOworCQkJZ290byB5ZXM7CisJCX0KKwljYXNlIEFSNUtfQ0FQX1ZFT0w6CisJCWdvdG8geWVzOworCWNhc2UgQVI1S19DQVBfQ09NUFJFU1NJT046CisJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikKKwkJCWdvdG8geWVzOworCQllbHNlCisJCQlnb3RvIG5vOworCWNhc2UgQVI1S19DQVBfQlVSU1Q6CisJCWdvdG8geWVzOworCWNhc2UgQVI1S19DQVBfVFBDOgorCQlnb3RvIHllczsKKwljYXNlIEFSNUtfQ0FQX0JTU0lETUFTSzoKKwkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQorCQkJZ290byB5ZXM7CisJCWVsc2UKKwkJCWdvdG8gbm87CisJY2FzZSBBUjVLX0NBUF9YUjoKKwkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQorCQkJZ290byB5ZXM7CisJCWVsc2UKKwkJCWdvdG8gbm87CisJZGVmYXVsdDoKKwkJZ290byBubzsKKwl9CisKK25vOgorCXJldHVybiAtRUlOVkFMOworeWVzOgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfZGVzYy5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfZGVzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDBjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19kZXNjLmMKQEAgLTAsMCArMSw1NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPgorICoKKyAqIExpZ2h0bHkgbW9kaWZpZWQgZm9yIGdQWEUsIEp1bHkgMjAwOSwgYnkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIE1JVCApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorIEhhcmR3YXJlIERlc2NyaXB0b3IgRnVuY3Rpb25zCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYXRoNWsuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJiYXNlLmgiCisKKy8qCisgKiBUWCBEZXNjcmlwdG9ycworICovCisKKyNkZWZpbmUgRkNTX0xFTgk0CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSAyLXdvcmQgdHggY29udHJvbCBkZXNjcmlwdG9yIG9uIDUyMTAvNTIxMQorICovCitzdGF0aWMgaW50CithdGg1a19od19zZXR1cF8yd29yZF90eF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAorCXVuc2lnbmVkIGludCBwa3RfbGVuLCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwgZW51bSBhdGg1a19wa3RfdHlwZSB0eXBlLAorCXVuc2lnbmVkIGludCB0eF9wb3dlciBfX3VudXNlZCwgdW5zaWduZWQgaW50IHR4X3JhdGUwLCB1bnNpZ25lZCBpbnQgdHhfdHJpZXMwLAorCXVuc2lnbmVkIGludCBrZXlfaW5kZXggX191bnVzZWQsIHVuc2lnbmVkIGludCBhbnRlbm5hX21vZGUsIHVuc2lnbmVkIGludCBmbGFncywKKwl1bnNpZ25lZCBpbnQgcnRzY3RzX3JhdGUgX191bnVzZWQsIHVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCit7CisJdTMyIGZyYW1lX3R5cGU7CisJc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bCAqdHhfY3RsOworCXVuc2lnbmVkIGludCBmcmFtZV9sZW47CisKKwl0eF9jdGwgPSAmZGVzYy0+dWQuZHNfdHg1MjEwLnR4X2N0bDsKKworCS8qCisJICogVmFsaWRhdGUgaW5wdXQKKwkgKiAtIFplcm8gcmV0cmllcyBkb24ndCBtYWtlIHNlbnNlLgorCSAqIC0gQSB6ZXJvIHJhdGUgd2lsbCBwdXQgdGhlIEhXIGludG8gYSBtb2RlIHdoZXJlIGl0IGNvbnRpbm91c2x5IHNlbmRzCisJICogICBub2lzZSBvbiB0aGUgY2hhbm5lbCwgc28gaXQgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHRoaXMuCisJICovCisJaWYgKHR4X3RyaWVzMCA9PSAwKSB7CisJCURCRygiYXRoNWs6IHplcm8gcmV0cmllc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodHhfcmF0ZTAgPT0gMCkgeworCQlEQkcoImF0aDVrOiB6ZXJvIHJhdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDbGVhciBkZXNjcmlwdG9yICovCisJbWVtc2V0KCZkZXNjLT51ZC5kc190eDUyMTAsIDAsIHNpemVvZihzdHJ1Y3QgYXRoNWtfaHdfNTIxMF90eF9kZXNjKSk7CisKKwkvKiBTZXR1cCBjb250cm9sIGRlc2NyaXB0b3IgKi8KKworCS8qIFZlcmlmeSBhbmQgc2V0IGZyYW1lIGxlbmd0aCAqLworCisJZnJhbWVfbGVuID0gcGt0X2xlbiArIEZDU19MRU47CisKKwlpZiAoZnJhbWVfbGVuICYgfkFSNUtfMldfVFhfREVTQ19DVEwwX0ZSQU1FX0xFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eF9jdGwtPnR4X2NvbnRyb2xfMCA9IGZyYW1lX2xlbiAmIEFSNUtfMldfVFhfREVTQ19DVEwwX0ZSQU1FX0xFTjsKKworCS8qIFZlcmlmeSBhbmQgc2V0IGJ1ZmZlciBsZW5ndGggKi8KKworCWlmIChwa3RfbGVuICYgfkFSNUtfMldfVFhfREVTQ19DVEwxX0JVRl9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJdHhfY3RsLT50eF9jb250cm9sXzEgPSBwa3RfbGVuICYgQVI1S18yV19UWF9ERVNDX0NUTDFfQlVGX0xFTjsKKworCS8qCisJICogVmVyaWZ5IGFuZCBzZXQgaGVhZGVyIGxlbmd0aAorCSAqIFhYWDogSSBvbmx5IGZvdW5kIHRoYXQgb24gNTIxMCBjb2RlLCBkb2VzIGl0IHdvcmsgb24gNTIxMSA/CisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCWlmIChoZHJfbGVuICYgfkFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdHhfY3RsLT50eF9jb250cm9sXzAgfD0KKwkJCUFSNUtfUkVHX1NNKGhkcl9sZW4sIEFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU4pOworCX0KKworCS8qRGlmZXJlbmNlcyBiZXR3ZWVuIDUyMTAtNTIxMSovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIEFSNUtfUEtUX1RZUEVfQkVBQ09OOgorCQljYXNlIEFSNUtfUEtUX1RZUEVfUFJPQkVfUkVTUDoKKwkJCWZyYW1lX3R5cGUgPSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfTk9fREVMQVk7CisJCWNhc2UgQVI1S19QS1RfVFlQRV9QSUZTOgorCQkJZnJhbWVfdHlwZSA9IEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9QSUZTOworCQlkZWZhdWx0OgorCQkJZnJhbWVfdHlwZSA9IHR5cGUgLyo8PCAyID8qLzsKKwkJfQorCisJCXR4X2N0bC0+dHhfY29udHJvbF8wIHw9CisJCUFSNUtfUkVHX1NNKGZyYW1lX3R5cGUsIEFSNUtfMldfVFhfREVTQ19DVEwwX0ZSQU1FX1RZUEUpIHwKKwkJQVI1S19SRUdfU00odHhfcmF0ZTAsIEFSNUtfMldfVFhfREVTQ19DVEwwX1hNSVRfUkFURSk7CisKKwl9IGVsc2UgeworCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PQorCQkJQVI1S19SRUdfU00odHhfcmF0ZTAsIEFSNUtfMldfVFhfREVTQ19DVEwwX1hNSVRfUkFURSkgfAorCQkJQVI1S19SRUdfU00oYW50ZW5uYV9tb2RlLAorCQkJCUFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVQpOworCQl0eF9jdGwtPnR4X2NvbnRyb2xfMSB8PQorCQkJQVI1S19SRUdfU00odHlwZSwgQVI1S18yV19UWF9ERVNDX0NUTDFfRlJBTUVfVFlQRSk7CisJfQorI2RlZmluZSBfVFhfRkxBR1MoX2MsIF9mbGFnKQkJCQkJXAorCWlmIChmbGFncyAmIEFSNUtfVFhERVNDXyMjX2ZsYWcpIHsJCQlcCisJCXR4X2N0bC0+dHhfY29udHJvbF8jI19jIHw9CQkJXAorCQkJQVI1S18yV19UWF9ERVNDX0NUTCMjX2MjI18jI19mbGFnOwlcCisJfQorCisJX1RYX0ZMQUdTKDAsIENMUkRNQVNLKTsKKwlfVFhfRkxBR1MoMCwgVkVPTCk7CisJX1RYX0ZMQUdTKDAsIElOVFJFUSk7CisJX1RYX0ZMQUdTKDAsIFJUU0VOQSk7CisJX1RYX0ZMQUdTKDEsIE5PQUNLKTsKKworI3VuZGVmIF9UWF9GTEFHUworCisJLyoKKwkgKiBSVFMvQ1RTIER1cmF0aW9uIFs1MjEwID9dCisJICovCisJaWYgKChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgJiYKKwkJCShmbGFncyAmIChBUjVLX1RYREVTQ19SVFNFTkEgfCBBUjVLX1RYREVTQ19DVFNFTkEpKSkKKwkJdHhfY3RsLT50eF9jb250cm9sXzEgfD0gcnRzY3RzX2R1cmF0aW9uICYKKwkJCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9SVFNfRFVSQVRJT047CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIDQtd29yZCB0eCBjb250cm9sIGRlc2NyaXB0b3Igb24gNTIxMgorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3NldHVwXzR3b3JkX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwKKwlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IHBrdF9sZW4sIHVuc2lnbmVkIGludCBoZHJfbGVuIF9fdW51c2VkLAorCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwgdW5zaWduZWQgaW50IHR4X3Bvd2VyLCB1bnNpZ25lZCBpbnQgdHhfcmF0ZTAsCisJdW5zaWduZWQgaW50IHR4X3RyaWVzMCwgdW5zaWduZWQgaW50IGtleV9pbmRleCBfX3VudXNlZCwKKwl1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLAorCXVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCit7CisJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOworCXVuc2lnbmVkIGludCBmcmFtZV9sZW47CisKKwl0eF9jdGwgPSAmZGVzYy0+dWQuZHNfdHg1MjEyLnR4X2N0bDsKKworCS8qCisJICogVmFsaWRhdGUgaW5wdXQKKwkgKiAtIFplcm8gcmV0cmllcyBkb24ndCBtYWtlIHNlbnNlLgorCSAqIC0gQSB6ZXJvIHJhdGUgd2lsbCBwdXQgdGhlIEhXIGludG8gYSBtb2RlIHdoZXJlIGl0IGNvbnRpbm91c2x5IHNlbmRzCisJICogICBub2lzZSBvbiB0aGUgY2hhbm5lbCwgc28gaXQgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHRoaXMuCisJICovCisJaWYgKHR4X3RyaWVzMCA9PSAwKSB7CisJCURCRygiYXRoNWs6IHplcm8gcmV0cmllc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodHhfcmF0ZTAgPT0gMCkgeworCQlEQkcoImF0aDVrOiB6ZXJvIHJhdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0eF9wb3dlciArPSBhaC0+YWhfdHhwb3dlci50eHBfb2Zmc2V0OworCWlmICh0eF9wb3dlciA+IEFSNUtfVFVORV9NQVhfVFhQT1dFUikKKwkJdHhfcG93ZXIgPSBBUjVLX1RVTkVfTUFYX1RYUE9XRVI7CisKKwkvKiBDbGVhciBkZXNjcmlwdG9yICovCisJbWVtc2V0KCZkZXNjLT51ZC5kc190eDUyMTIsIDAsIHNpemVvZihzdHJ1Y3QgYXRoNWtfaHdfNTIxMl90eF9kZXNjKSk7CisKKwkvKiBTZXR1cCBjb250cm9sIGRlc2NyaXB0b3IgKi8KKworCS8qIFZlcmlmeSBhbmQgc2V0IGZyYW1lIGxlbmd0aCAqLworCisJZnJhbWVfbGVuID0gcGt0X2xlbiArIEZDU19MRU47CisKKwlpZiAoZnJhbWVfbGVuICYgfkFSNUtfNFdfVFhfREVTQ19DVEwwX0ZSQU1FX0xFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eF9jdGwtPnR4X2NvbnRyb2xfMCA9IGZyYW1lX2xlbiAmIEFSNUtfNFdfVFhfREVTQ19DVEwwX0ZSQU1FX0xFTjsKKworCS8qIFZlcmlmeSBhbmQgc2V0IGJ1ZmZlciBsZW5ndGggKi8KKworCWlmIChwa3RfbGVuICYgfkFSNUtfNFdfVFhfREVTQ19DVEwxX0JVRl9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJdHhfY3RsLT50eF9jb250cm9sXzEgPSBwa3RfbGVuICYgQVI1S180V19UWF9ERVNDX0NUTDFfQlVGX0xFTjsKKworCXR4X2N0bC0+dHhfY29udHJvbF8wIHw9CisJCUFSNUtfUkVHX1NNKHR4X3Bvd2VyLCBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9YTUlUX1BPV0VSKSB8CisJCUFSNUtfUkVHX1NNKGFudGVubmFfbW9kZSwgQVI1S180V19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVCk7CisJdHhfY3RsLT50eF9jb250cm9sXzEgfD0gQVI1S19SRUdfU00odHlwZSwKKwkJCQkJQVI1S180V19UWF9ERVNDX0NUTDFfRlJBTUVfVFlQRSk7CisJdHhfY3RsLT50eF9jb250cm9sXzIgPSBBUjVLX1JFR19TTSh0eF90cmllczAgKyBBUjVLX1RVTkVfSFdUWFRSSUVTLAorCQkJCQlBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMCk7CisJdHhfY3RsLT50eF9jb250cm9sXzMgPSB0eF9yYXRlMCAmIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTA7CisKKyNkZWZpbmUgX1RYX0ZMQUdTKF9jLCBfZmxhZykJCQkJCVwKKwlpZiAoZmxhZ3MgJiBBUjVLX1RYREVTQ18jI19mbGFnKSB7CQkJXAorCQl0eF9jdGwtPnR4X2NvbnRyb2xfIyNfYyB8PQkJCVwKKwkJCUFSNUtfNFdfVFhfREVTQ19DVEwjI19jIyNfIyNfZmxhZzsJXAorCX0KKworCV9UWF9GTEFHUygwLCBDTFJETUFTSyk7CisJX1RYX0ZMQUdTKDAsIFZFT0wpOworCV9UWF9GTEFHUygwLCBJTlRSRVEpOworCV9UWF9GTEFHUygwLCBSVFNFTkEpOworCV9UWF9GTEFHUygwLCBDVFNFTkEpOworCV9UWF9GTEFHUygxLCBOT0FDSyk7CisKKyN1bmRlZiBfVFhfRkxBR1MKKworCS8qCisJICogUlRTL0NUUworCSAqLworCWlmIChmbGFncyAmIChBUjVLX1RYREVTQ19SVFNFTkEgfCBBUjVLX1RYREVTQ19DVFNFTkEpKSB7CisJCWlmICgoZmxhZ3MgJiBBUjVLX1RYREVTQ19SVFNFTkEpICYmCisJCQkJKGZsYWdzICYgQVI1S19UWERFU0NfQ1RTRU5BKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl0eF9jdGwtPnR4X2NvbnRyb2xfMiB8PSBydHNjdHNfZHVyYXRpb24gJgorCQkJCUFSNUtfNFdfVFhfREVTQ19DVEwyX1JUU19EVVJBVElPTjsKKwkJdHhfY3RsLT50eF9jb250cm9sXzMgfD0gQVI1S19SRUdfU00ocnRzY3RzX3JhdGUsCisJCQkJQVI1S180V19UWF9ERVNDX0NUTDNfUlRTX0NUU19SQVRFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2NjZXNzIHRoZSB0eCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEwLzUyMTEKKyAqLworc3RhdGljIGludCBhdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoIF9fdW51c2VkLAorCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCit7CisJc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bCAqdHhfY3RsOworCXN0cnVjdCBhdGg1a19od190eF9zdGF0dXMgKnR4X3N0YXR1czsKKworCXR4X2N0bCA9ICZkZXNjLT51ZC5kc190eDUyMTAudHhfY3RsOworCXR4X3N0YXR1cyA9ICZkZXNjLT51ZC5kc190eDUyMTAudHhfc3RhdDsKKworCS8qIE5vIGZyYW1lIGhhcyBiZWVuIHNlbmQgb3IgZXJyb3IgKi8KKwlpZiAoKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMV9ET05FKSA9PSAwKQorCQlyZXR1cm4gLUVJTlBST0dSRVNTOworCisJLyoKKwkgKiBHZXQgZGVzY3JpcHRvciBzdGF0dXMKKwkgKi8KKwl0cy0+dHNfdHN0YW1wID0gQVI1S19SRUdfTVModHhfc3RhdHVzLT50eF9zdGF0dXNfMCwKKwkJQVI1S19ERVNDX1RYX1NUQVRVUzBfU0VORF9USU1FU1RBTVApOworCXRzLT50c19zaG9ydHJldHJ5ID0gQVI1S19SRUdfTVModHhfc3RhdHVzLT50eF9zdGF0dXNfMCwKKwkJQVI1S19ERVNDX1RYX1NUQVRVUzBfU0hPUlRfUkVUUllfQ09VTlQpOworCXRzLT50c19sb25ncmV0cnkgPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18wLAorCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9MT05HX1JFVFJZX0NPVU5UKTsKKwkvKlRPRE86IHRzLT50c192aXJ0Y29sICsgdGVzdCovCisJdHMtPnRzX3NlcW51bSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEsCisJCUFSNUtfREVTQ19UWF9TVEFUVVMxX1NFUV9OVU0pOworCXRzLT50c19yc3NpID0gQVI1S19SRUdfTVModHhfc3RhdHVzLT50eF9zdGF0dXNfMSwKKwkJQVI1S19ERVNDX1RYX1NUQVRVUzFfQUNLX1NJR19TVFJFTkdUSCk7CisJdHMtPnRzX2FudGVubmEgPSAxOworCXRzLT50c19zdGF0dXMgPSAwOworCXRzLT50c19yYXRlWzBdID0gQVI1S19SRUdfTVModHhfY3RsLT50eF9jb250cm9sXzAsCisJCUFSNUtfMldfVFhfREVTQ19DVEwwX1hNSVRfUkFURSk7CisJdHMtPnRzX3JldHJ5WzBdID0gdHMtPnRzX2xvbmdyZXRyeTsKKwl0cy0+dHNfZmluYWxfaWR4ID0gMDsKKworCWlmICghKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GUkFNRV9YTUlUX09LKSkgeworCQlpZiAodHhfc3RhdHVzLT50eF9zdGF0dXNfMCAmCisJCQkJQVI1S19ERVNDX1RYX1NUQVRVUzBfRVhDRVNTSVZFX1JFVFJJRVMpCisJCQl0cy0+dHNfc3RhdHVzIHw9IEFSNUtfVFhFUlJfWFJFVFJZOworCisJCWlmICh0eF9zdGF0dXMtPnR4X3N0YXR1c18wICYgQVI1S19ERVNDX1RYX1NUQVRVUzBfRklGT19VTkRFUlJVTikKKwkJCXRzLT50c19zdGF0dXMgfD0gQVI1S19UWEVSUl9GSUZPOworCisJCWlmICh0eF9zdGF0dXMtPnR4X3N0YXR1c18wICYgQVI1S19ERVNDX1RYX1NUQVRVUzBfRklMVEVSRUQpCisJCQl0cy0+dHNfc3RhdHVzIHw9IEFSNUtfVFhFUlJfRklMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2NjZXNzIGEgdHggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMgorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3Byb2NfNHdvcmRfdHhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWggX191bnVzZWQsCisJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLCBzdHJ1Y3QgYXRoNWtfdHhfc3RhdHVzICp0cykKK3sKKwlzdHJ1Y3QgYXRoNWtfaHdfNHdfdHhfY3RsICp0eF9jdGw7CisJc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cyAqdHhfc3RhdHVzOworCisJdHhfY3RsID0gJmRlc2MtPnVkLmRzX3R4NTIxMi50eF9jdGw7CisJdHhfc3RhdHVzID0gJmRlc2MtPnVkLmRzX3R4NTIxMi50eF9zdGF0OworCisJLyogTm8gZnJhbWUgaGFzIGJlZW4gc2VuZCBvciBlcnJvciAqLworCWlmICghKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMV9ET05FKSkKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKworCS8qCisJICogR2V0IGRlc2NyaXB0b3Igc3RhdHVzCisJICovCisJdHMtPnRzX3RzdGFtcCA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAsCisJCUFSNUtfREVTQ19UWF9TVEFUVVMwX1NFTkRfVElNRVNUQU1QKTsKKwl0cy0+dHNfc2hvcnRyZXRyeSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAsCisJCUFSNUtfREVTQ19UWF9TVEFUVVMwX1NIT1JUX1JFVFJZX0NPVU5UKTsKKwl0cy0+dHNfbG9uZ3JldHJ5ID0gQVI1S19SRUdfTVModHhfc3RhdHVzLT50eF9zdGF0dXNfMCwKKwkJQVI1S19ERVNDX1RYX1NUQVRVUzBfTE9OR19SRVRSWV9DT1VOVCk7CisJdHMtPnRzX3NlcW51bSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEsCisJCUFSNUtfREVTQ19UWF9TVEFUVVMxX1NFUV9OVU0pOworCXRzLT50c19yc3NpID0gQVI1S19SRUdfTVModHhfc3RhdHVzLT50eF9zdGF0dXNfMSwKKwkJQVI1S19ERVNDX1RYX1NUQVRVUzFfQUNLX1NJR19TVFJFTkdUSCk7CisJdHMtPnRzX2FudGVubmEgPSAodHhfc3RhdHVzLT50eF9zdGF0dXNfMSAmCisJCUFSNUtfREVTQ19UWF9TVEFUVVMxX1hNSVRfQU5URU5OQSkgPyAyIDogMTsKKwl0cy0+dHNfc3RhdHVzID0gMDsKKworCXRzLT50c19maW5hbF9pZHggPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18xLAorCQkJQVI1S19ERVNDX1RYX1NUQVRVUzFfRklOQUxfVFNfSU5ERVgpOworCisJdHMtPnRzX3JldHJ5WzBdID0gdHMtPnRzX2xvbmdyZXRyeTsKKwl0cy0+dHNfcmF0ZVswXSA9IHR4X2N0bC0+dHhfY29udHJvbF8zICYKKwkJQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMDsKKworCS8qIFRYIGVycm9yICovCisJaWYgKCEodHhfc3RhdHVzLT50eF9zdGF0dXNfMCAmIEFSNUtfREVTQ19UWF9TVEFUVVMwX0ZSQU1FX1hNSVRfT0spKSB7CisJCWlmICh0eF9zdGF0dXMtPnR4X3N0YXR1c18wICYKKwkJCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9FWENFU1NJVkVfUkVUUklFUykKKwkJCXRzLT50c19zdGF0dXMgfD0gQVI1S19UWEVSUl9YUkVUUlk7CisKKwkJaWYgKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUZPX1VOREVSUlVOKQorCQkJdHMtPnRzX3N0YXR1cyB8PSBBUjVLX1RYRVJSX0ZJRk87CisKKwkJaWYgKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUxURVJFRCkKKwkJCXRzLT50c19zdGF0dXMgfD0gQVI1S19UWEVSUl9GSUxUOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUlggRGVzY3JpcHRvcnMKKyAqLworCisvKgorICogSW5pdGlhbGl6ZSBhbiByeCBjb250cm9sIGRlc2NyaXB0b3IKKyAqLworc3RhdGljIGludCBhdGg1a19od19zZXR1cF9yeF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWggX191bnVzZWQsCisJCQkJICBzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCQkgIHUzMiBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGF0aDVrX2h3X3J4X2N0bCAqcnhfY3RsOworCisJcnhfY3RsID0gJmRlc2MtPnVkLmRzX3J4LnJ4X2N0bDsKKworCS8qCisJICogQ2xlYXIgdGhlIGRlc2NyaXB0b3IKKwkgKiBJZiB3ZSBkb24ndCBjbGVhbiB0aGUgc3RhdHVzIGRlc2NyaXB0b3IsCisJICogd2hpbGUgc2Nhbm5pbmcgd2UgZ2V0IHRvbyBtYW55IHJlc3VsdHMsCisJICogbW9zdCBvZiB0aGVtIHZpcnR1YWwsIGFmdGVyIHNvbWUgc2VjcworCSAqIG9mIHNjYW5uaW5nIHN5c3RlbSBoYW5ncy4gTS5GLgorCSovCisJbWVtc2V0KCZkZXNjLT51ZC5kc19yeCwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg1a19od19hbGxfcnhfZGVzYykpOworCisJLyogU2V0dXAgZGVzY3JpcHRvciAqLworCXJ4X2N0bC0+cnhfY29udHJvbF8xID0gc2l6ZSAmIEFSNUtfREVTQ19SWF9DVEwxX0JVRl9MRU47CisJaWYgKHJ4X2N0bC0+cnhfY29udHJvbF8xICE9IHNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZsYWdzICYgQVI1S19SWERFU0NfSU5UUkVRKQorCQlyeF9jdGwtPnJ4X2NvbnRyb2xfMSB8PSBBUjVLX0RFU0NfUlhfQ1RMMV9JTlRSRVE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2NjZXNzIHRoZSByeCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEwLzUyMTEKKyAqLworc3RhdGljIGludCBhdGg1a19od19wcm9jXzUyMTBfcnhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWggX191bnVzZWQsCisJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLCBzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKK3sKKwlzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzICpyeF9zdGF0dXM7CisKKwlyeF9zdGF0dXMgPSAmZGVzYy0+dWQuZHNfcngudS5yeF9zdGF0OworCisJLyogTm8gZnJhbWUgcmVjZWl2ZWQgLyBub3QgcmVhZHkgKi8KKwlpZiAoIShyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9ET05FKSkKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKworCS8qCisJICogRnJhbWUgcmVjZWl2ZSBzdGF0dXMKKwkgKi8KKwlycy0+cnNfZGF0YWxlbiA9IHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgorCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX0RBVEFfTEVOOworCXJzLT5yc19yc3NpID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMCwKKwkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTCk7CisJcnMtPnJzX3JhdGUgPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18wLAorCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfUkFURSk7CisJcnMtPnJzX2FudGVubmEgPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18wLAorCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfQU5URU5OQSk7CisJcnMtPnJzX21vcmUgPSAhIShyeF9zdGF0dXMtPnJ4X3N0YXR1c18wICYKKwkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9NT1JFKTsKKwkvKiBUT0RPOiB0aGlzIHRpbWVzdGFtcCBpcyAxMyBiaXQsIGxhdGVyIG9uIHdlIGFzc3VtZSAxNSBiaXQgKi8KKwlycy0+cnNfdHN0YW1wID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSwKKwkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUCk7CisJcnMtPnJzX3N0YXR1cyA9IDA7CisJcnMtPnJzX3BoeWVyciA9IDA7CisJcnMtPnJzX2tleWl4ID0gQVI1S19SWEtFWUlYX0lOVkFMSUQ7CisKKwkvKgorCSAqIFJlY2VpdmUvZGVzY3JpcHRvciBlcnJvcnMKKwkgKi8KKwlpZiAoIShyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwkgICAgICBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0spKSB7CisJCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwkJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0NSQ19FUlJPUikKKwkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9DUkM7CisKKwkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgorCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRklGT19PVkVSUlVOKQorCQkJcnMtPnJzX3N0YXR1cyB8PSBBUjVLX1JYRVJSX0ZJRk87CisKKwkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgorCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SKSB7CisJCQlycy0+cnNfc3RhdHVzIHw9IEFSNUtfUlhFUlJfUEhZOworCQkJcnMtPnJzX3BoeWVyciB8PSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18xLAorCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SKTsKKwkJfQorCisJCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwkJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0RFQ1JZUFRfQ1JDX0VSUk9SKQorCQkJcnMtPnJzX3N0YXR1cyB8PSBBUjVLX1JYRVJSX0RFQ1JZUFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jY2VzcyB0aGUgcnggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMgorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3Byb2NfNTIxMl9yeF9zdGF0dXMoc3RydWN0IGF0aDVrX2h3ICphaCBfX3VudXNlZCwKKwkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgKnJzKQoreworCXN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgKnJ4X3N0YXR1czsKKwlzdHJ1Y3QgYXRoNWtfaHdfcnhfZXJyb3IgKnJ4X2VycjsKKworCXJ4X3N0YXR1cyA9ICZkZXNjLT51ZC5kc19yeC51LnJ4X3N0YXQ7CisKKwkvKiBPdmVybGF5IG9uIGVycm9yICovCisJcnhfZXJyID0gJmRlc2MtPnVkLmRzX3J4LnUucnhfZXJyOworCisJLyogTm8gZnJhbWUgcmVjZWl2ZWQgLyBub3QgcmVhZHkgKi8KKwlpZiAoIShyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9ET05FKSkKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKworCS8qCisJICogRnJhbWUgcmVjZWl2ZSBzdGF0dXMKKwkgKi8KKwlycy0+cnNfZGF0YWxlbiA9IHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgorCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX0RBVEFfTEVOOworCXJzLT5yc19yc3NpID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMCwKKwkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTCk7CisJcnMtPnJzX3JhdGUgPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18wLAorCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfUkFURSk7CisJcnMtPnJzX2FudGVubmEgPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18wLAorCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfQU5URU5OQSk7CisJcnMtPnJzX21vcmUgPSAhIShyeF9zdGF0dXMtPnJ4X3N0YXR1c18wICYKKwkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9NT1JFKTsKKwlycy0+cnNfdHN0YW1wID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSwKKwkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUCk7CisJcnMtPnJzX3N0YXR1cyA9IDA7CisJcnMtPnJzX3BoeWVyciA9IDA7CisJcnMtPnJzX2tleWl4ID0gQVI1S19SWEtFWUlYX0lOVkFMSUQ7CisKKwkvKgorCSAqIFJlY2VpdmUvZGVzY3JpcHRvciBlcnJvcnMKKwkgKi8KKwlpZiAoIShyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwkgICAgICBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0spKSB7CisJCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwkJCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0NSQ19FUlJPUikKKwkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9DUkM7CisKKwkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgorCQkJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SKSB7CisJCQlycy0+cnNfc3RhdHVzIHw9IEFSNUtfUlhFUlJfUEhZOworCQkJcnMtPnJzX3BoeWVyciB8PSBBUjVLX1JFR19NUyhyeF9lcnItPnJ4X2Vycm9yXzEsCisJCQkJCSAgIEFSNUtfUlhfREVTQ19FUlJPUjFfUEhZX0VSUk9SX0NPREUpOworCQl9CisKKwkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgorCQkJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfREVDUllQVF9DUkNfRVJST1IpCisJCQlycy0+cnNfc3RhdHVzIHw9IEFSNUtfUlhFUlJfREVDUllQVDsKKworCQlpZiAocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmCisJCQkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9NSUNfRVJST1IpCisJCQlycy0+cnNfc3RhdHVzIHw9IEFSNUtfUlhFUlJfTUlDOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogSW5pdCBmdW5jdGlvbiBwb2ludGVycyBpbnNpZGUgYXRoNWtfaHcgc3RydWN0CisgKi8KK2ludCBhdGg1a19od19pbml0X2Rlc2NfZnVuY3Rpb25zKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTAgJiYKKwkgICAgYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTEgJiYKKwkgICAgYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTIpCisJCXJldHVybiAtRU5PVFNVUDsKKworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgeworCQlhaC0+YWhfc2V0dXBfcnhfZGVzYyA9IGF0aDVrX2h3X3NldHVwX3J4X2Rlc2M7CisJCWFoLT5haF9zZXR1cF90eF9kZXNjID0gYXRoNWtfaHdfc2V0dXBfNHdvcmRfdHhfZGVzYzsKKwkJYWgtPmFoX3Byb2NfdHhfZGVzYyA9IGF0aDVrX2h3X3Byb2NfNHdvcmRfdHhfc3RhdHVzOworCX0gZWxzZSB7CisJCWFoLT5haF9zZXR1cF9yeF9kZXNjID0gYXRoNWtfaHdfc2V0dXBfcnhfZGVzYzsKKwkJYWgtPmFoX3NldHVwX3R4X2Rlc2MgPSBhdGg1a19od19zZXR1cF8yd29yZF90eF9kZXNjOworCQlhaC0+YWhfcHJvY190eF9kZXNjID0gYXRoNWtfaHdfcHJvY18yd29yZF90eF9zdGF0dXM7CisJfQorCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQorCQlhaC0+YWhfcHJvY19yeF9kZXNjID0gYXRoNWtfaHdfcHJvY181MjEyX3J4X3N0YXR1czsKKwllbHNlIGlmIChhaC0+YWhfdmVyc2lvbiA8PSBBUjVLX0FSNTIxMSkKKwkJYWgtPmFoX3Byb2NfcnhfZGVzYyA9IGF0aDVrX2h3X3Byb2NfNTIxMF9yeF9zdGF0dXM7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfZG1hLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2M0Y2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfZG1hLmMKQEAgLTAsMCArMSw2MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKgorICogTGlnaHRseSBtb2RpZmllZCBmb3IgZ1BYRSwgSnVseSAyMDA5LCBieSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0Pi4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggTUlUICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBETUEgYW5kIGludGVycnVwdCBtYXNraW5nIGZ1bmN0aW9ucyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGRtYS5jIC0gRE1BIGFuZCBpbnRlcnJ1cHQgbWFza2luZyBmdW5jdGlvbnMKKyAqCisgKiBIZXJlIHdlIHNldHVwIGRlc2NyaXB0b3IgcG9pbnRlcnMgKHJ4ZHAvdHhkcCkgc3RhcnQvc3RvcCBkbWEgZW5naW5lIGFuZAorICogaGFuZGxlIHF1ZXVlIHNldHVwIGZvciA1MjEwIGNoaXBzZXQgKHJlc3QgYXJlIGhhbmRsZWQgb24gcWN1LmMpLgorICogQWxzbyB3ZSBzZXR1cCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAoSU1SKSBhbmQgcmVhZCB0aGUgdmFyaW91cyBpdGVycnVwdAorICogc3RhdHVzIHJlZ2lzdGVycyAoSVNSKS4KKyAqCisgKiBUT0RPOiBIYW5kbGUgU0lTUiBvbiA1MjExKyBhbmQgaW50cm9kdWNlIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBxdWV1ZQorICogbnVtYmVyIHRoYXQgcmVzdWx0ZWQgdGhlIGludGVycnVwdC4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImJhc2UuaCIKKworLyoqKioqKioqKlwKKyogUmVjZWl2ZSAqCitcKioqKioqKioqLworCisvKioKKyAqIGF0aDVrX2h3X3N0YXJ0X3J4X2RtYSAtIFN0YXJ0IERNQSByZWNlaXZlCisgKgorICogQGFoOglUaGUgJnN0cnVjdCBhdGg1a19odworICovCit2b2lkIGF0aDVrX2h3X3N0YXJ0X3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19DUl9SWEUsIEFSNUtfQ1IpOworCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0NSKTsKK30KKworLyoqCisgKiBhdGg1a19od19zdG9wX3J4X2RtYSAtIFN0b3AgRE1BIHJlY2VpdmUKKyAqCisgKiBAYWg6CVRoZSAmc3RydWN0IGF0aDVrX2h3CisgKi8KK2ludCBhdGg1a19od19zdG9wX3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXVuc2lnbmVkIGludCBpOworCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0NSX1JYRCwgQVI1S19DUik7CisKKwkvKgorCSAqIEl0IG1heSB0YWtlIHNvbWUgdGltZSB0byBkaXNhYmxlIHRoZSBETUEgcmVjZWl2ZSB1bml0CisJICovCisJZm9yIChpID0gMTAwMDsgaSA+IDAgJiYKKwkJCShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUikgJiBBUjVLX0NSX1JYRSkgIT0gMDsKKwkJCWktLSkKKwkJdWRlbGF5KDEwKTsKKworCXJldHVybiBpID8gMCA6IC1FQlVTWTsKK30KKworLyoqCisgKiBhdGg1a19od19nZXRfcnhkcCAtIEdldCBSWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcworICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBYWFg6IElzIFJYRFAgcmVhZCBhbmQgY2xlYXIgPworICovCit1MzIgYXRoNWtfaHdfZ2V0X3J4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwlyZXR1cm4gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUlhEUCk7Cit9CisKKy8qKgorICogYXRoNWtfaHdfc2V0X3J4ZHAgLSBTZXQgUlggRGVzY3JpcHRvcidzIGFkZHJlc3MKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcGh5c19hZGRyOiBSWCBkZXNjcmlwdG9yIGFkZHJlc3MKKyAqCisgKiBYWFg6IFNob3VsZCB3ZSBjaGVjayBpZiByeCBpcyBlbmFibGVkIGJlZm9yZSBzZXR0aW5nIHJ4ZHAgPworICovCit2b2lkIGF0aDVrX2h3X3NldF9yeGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBwaHlzX2FkZHIpCit7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBwaHlzX2FkZHIsIEFSNUtfUlhEUCk7Cit9CisKKworLyoqKioqKioqKipcCisqIFRyYW5zbWl0ICoKK1wqKioqKioqKioqLworCisvKioKKyAqIGF0aDVrX2h3X3N0YXJ0X3R4X2RtYSAtIFN0YXJ0IERNQSB0cmFuc21pdCBmb3IgYSBzcGVjaWZpYyBxdWV1ZQorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBxdWV1ZTogVGhlIGh3IHF1ZXVlIG51bWJlcgorICoKKyAqIFN0YXJ0IERNQSB0cmFuc21pdCBmb3IgYSBzcGVjaWZpYyBxdWV1ZSBhbmQgc2luY2UgNTIxMCBkb2Vzbid0IGhhdmUKKyAqIFFDVS9EQ1UsIHNldCB1cCBxdWV1ZSBwYXJhbWV0ZXJzIGZvciA1MjEwIGhlcmUgYmFzZWQgb24gcXVldWUgdHlwZSAob25lCisgKiBxdWV1ZSBmb3Igbm9ybWFsIGRhdGEgYW5kIG9uZSBxdWV1ZSBmb3IgYmVhY29ucykuIEZvciBxdWV1ZSBzZXR1cAorICogb24gbmV3ZXIgY2hpcHMgY2hlY2sgb3V0IHFjdS5jLiBSZXR1cm5zIC1FSU5WQUwgaWYgcXVldWUgbnVtYmVyIGlzIG91dAorICogb2YgcmFuZ2Ugb3IgaWYgcXVldWUgaXMgYWxyZWFkeSBkaXNhYmxlZC4KKyAqCisgKiBOT1RFOiBNdXN0IGJlIGNhbGxlZCBhZnRlciBzZXR0aW5nIHVwIHR4IGNvbnRyb2wgZGVzY3JpcHRvciBmb3IgdGhhdAorICogcXVldWUgKHNlZSBiZWxvdykuCisgKi8KK2ludCBhdGg1a19od19zdGFydF90eF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQoreworCXUzMiB0eF9xdWV1ZTsKKworCS8qIFJldHVybiBpZiBxdWV1ZSBpcyBkZWNsYXJlZCBpbmFjdGl2ZSAqLworCWlmIChhaC0+YWhfdHhxLnRxaV90eXBlID09IEFSNUtfVFhfUVVFVUVfSU5BQ1RJVkUpCisJCXJldHVybiAtRUlPOworCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCXR4X3F1ZXVlID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQ1IpOworCisJCS8qIEFzc3VtZSBhbHdheXMgYSBkYXRhIHF1ZXVlICovCisJCXR4X3F1ZXVlIHw9IEFSNUtfQ1JfVFhFMCAmIH5BUjVLX0NSX1RYRDA7CisKKwkJLyogU3RhcnQgcXVldWUgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB0eF9xdWV1ZSwgQVI1S19DUik7CisJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0NSKTsKKwl9IGVsc2UgeworCQkvKiBSZXR1cm4gaWYgcXVldWUgaXMgZGlzYWJsZWQgKi8KKwkJaWYgKEFSNUtfUkVHX1JFQURfUShhaCwgQVI1S19RQ1VfVFhELCBxdWV1ZSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQkvKiBTdGFydCBxdWV1ZSAqLworCQlBUjVLX1JFR19XUklURV9RKGFoLCBBUjVLX1FDVV9UWEUsIHF1ZXVlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhdGg1a19od19zdG9wX3R4X2RtYSAtIFN0b3AgRE1BIHRyYW5zbWl0IG9uIGEgc3BlY2lmaWMgcXVldWUKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKKyAqCisgKiBTdG9wIERNQSB0cmFuc21pdCBvbiBhIHNwZWNpZmljIGh3IHF1ZXVlIGFuZCBkcmFpbiBxdWV1ZSBzbyB3ZSBkb24ndAorICogaGF2ZSBhbnkgcGVuZGluZyBmcmFtZXMuIFJldHVybnMgLUVCVVNZIGlmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBmcmFtZXMsCisgKiAtRUlOVkFMIGlmIHF1ZXVlIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UuCisgKgorICovCitpbnQgYXRoNWtfaHdfc3RvcF90eF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQoreworCXVuc2lnbmVkIGludCBpID0gNDA7CisJdTMyIHR4X3F1ZXVlLCBwZW5kaW5nOworCisJLyogUmV0dXJuIGlmIHF1ZXVlIGlzIGRlY2xhcmVkIGluYWN0aXZlICovCisJaWYgKGFoLT5haF90eHEudHFpX3R5cGUgPT0gQVI1S19UWF9RVUVVRV9JTkFDVElWRSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJdHhfcXVldWUgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUik7CisKKwkJLyogQXNzdW1lIGEgZGF0YSBxdWV1ZSAqLworCQl0eF9xdWV1ZSB8PSBBUjVLX0NSX1RYRDAgJiB+QVI1S19DUl9UWEUwOworCisJCS8qIFN0b3AgcXVldWUgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB0eF9xdWV1ZSwgQVI1S19DUik7CisJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0NSKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTY2hlZHVsZSBUWCBkaXNhYmxlIGFuZCB3YWl0IHVudGlsIHF1ZXVlIGlzIGVtcHR5CisJCSAqLworCQlBUjVLX1JFR19XUklURV9RKGFoLCBBUjVLX1FDVV9UWEQsIHF1ZXVlKTsKKworCQkvKkNoZWNrIGZvciBwZW5kaW5nIGZyYW1lcyovCisJCWRvIHsKKwkJCXBlbmRpbmcgPSBhdGg1a19od19yZWdfcmVhZChhaCwKKwkJCQlBUjVLX1FVRVVFX1NUQVRVUyhxdWV1ZSkpICYKKwkJCQlBUjVLX1FDVV9TVFNfRlJNUEVORENOVDsKKwkJCXVkZWxheSgxMDApOworCQl9IHdoaWxlICgtLWkgJiYgcGVuZGluZyk7CisKKwkJLyogRm9yIDI0MTMrIG9yZGVyIFBDVSB0byBkcm9wIHBhY2tldHMgdXNpbmcKKwkJICogUVVJRVQgbWVjaGFuaXNtICovCisJCWlmIChhaC0+YWhfbWFjX3ZlcnNpb24gPj0gKEFSNUtfU1JFVl9BUjI0MTQgPj4gNCkgJiYgcGVuZGluZykgeworCQkJLyogU2V0IHBlcmlvZGljaXR5IGFuZCBkdXJhdGlvbiAqLworCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJCUFSNUtfUkVHX1NNKDEwMCwgQVI1S19RVUlFVF9DVEwyX1FUX1BFUil8CisJCQkJQVI1S19SRUdfU00oMTAsIEFSNUtfUVVJRVRfQ1RMMl9RVF9EVVIpLAorCQkJCUFSNUtfUVVJRVRfQ1RMMik7CisKKwkJCS8qIEVuYWJsZSBxdWlldCBwZXJpb2QgZm9yIGN1cnJlbnQgVFNGICovCisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCisJCQkJQVI1S19RVUlFVF9DVEwxX1FUX0VOIHwKKwkJCQlBUjVLX1JFR19TTShhdGg1a19od19yZWdfcmVhZChhaCwKKwkJCQkJCUFSNUtfVFNGX0wzMl81MjExKSA+PiAxMCwKKwkJCQkJCUFSNUtfUVVJRVRfQ1RMMV9ORVhUX1FUX1RTRiksCisJCQkJQVI1S19RVUlFVF9DVEwxKTsKKworCQkJLyogRm9yY2UgY2hhbm5lbCBpZGxlIGhpZ2ggKi8KKwkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX0RJQUdfU1dfNTIxMSwKKwkJCQkJQVI1S19ESUFHX1NXX0NIQU5FTF9JRExFX0hJR0gpOworCisJCQkvKiBXYWl0IGEgd2hpbGUgYW5kIGRpc2FibGUgbWVjaGFuaXNtICovCisJCQl1ZGVsYXkoMjAwKTsKKwkJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19RVUlFVF9DVEwxLAorCQkJCQkJQVI1S19RVUlFVF9DVEwxX1FUX0VOKTsKKworCQkJLyogUmUtY2hlY2sgZm9yIHBlbmRpbmcgZnJhbWVzICovCisJCQlpID0gNDA7CisJCQlkbyB7CisJCQkJcGVuZGluZyA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLAorCQkJCQlBUjVLX1FVRVVFX1NUQVRVUyhxdWV1ZSkpICYKKwkJCQkJQVI1S19RQ1VfU1RTX0ZSTVBFTkRDTlQ7CisJCQkJdWRlbGF5KDEwMCk7CisJCQl9IHdoaWxlICgtLWkgJiYgcGVuZGluZyk7CisKKwkJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19ESUFHX1NXXzUyMTEsCisJCQkJCUFSNUtfRElBR19TV19DSEFORUxfSURMRV9ISUdIKTsKKwkJfQorCisJCS8qIENsZWFyIHJlZ2lzdGVyICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19RQ1VfVFhEKTsKKwkJaWYgKHBlbmRpbmcpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIFRPRE86IENoZWNrIGZvciBzdWNjZXNzIG9uIDUyMTAgZWxzZSByZXR1cm4gZXJyb3IgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhdGg1a19od19nZXRfdHhkcCAtIEdldCBUWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZQorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBxdWV1ZTogVGhlIGh3IHF1ZXVlIG51bWJlcgorICoKKyAqIEdldCBUWCBkZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZS4gRm9yIDUyMTAgd2UgaWdub3JlCisgKiB0aGUgcXVldWUgbnVtYmVyIGFuZCB1c2UgdHggcXVldWUgdHlwZSBzaW5jZSB3ZSBvbmx5IGhhdmUgMiBxdWV1ZXMuCisgKiBXZSB1c2UgVFhEUDAgZm9yIG5vcm1hbCBkYXRhIHF1ZXVlIGFuZCBUWERQMSBmb3IgYmVhY29uIHF1ZXVlLgorICogRm9yIG5ld2VyIGNoaXBzIHdpdGggUUNVL0RDVSB3ZSBqdXN0IHJlYWQgdGhlIGNvcnJlc3BvbmRpbmcgVFhEUCByZWdpc3Rlci4KKyAqCisgKiBYWFg6IElzIFRYRFAgcmVhZCBhbmQgY2xlYXIgPworICovCit1MzIgYXRoNWtfaHdfZ2V0X3R4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQoreworCXUxNiB0eF9yZWc7CisKKwkvKgorCSAqIEdldCB0aGUgdHJhbnNtaXQgcXVldWUgZGVzY3JpcHRvciBwb2ludGVyIGZyb20gdGhlIHNlbGVjdGVkIHF1ZXVlCisJICovCisJLyo1MjEwIGRvZXNuJ3QgaGF2ZSBRQ1UqLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQkvKiBBc3N1bWUgYSBkYXRhIHF1ZXVlICovCisJCXR4X3JlZyA9IEFSNUtfTk9RQ1VfVFhEUDA7CisJfSBlbHNlIHsKKwkJdHhfcmVnID0gQVI1S19RVUVVRV9UWERQKHF1ZXVlKTsKKwl9CisKKwlyZXR1cm4gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIHR4X3JlZyk7Cit9CisKKy8qKgorICogYXRoNWtfaHdfc2V0X3R4ZHAgLSBTZXQgVFggRGVzY3JpcHRvcidzIGFkZHJlc3MgZm9yIGEgc3BlY2lmaWMgcXVldWUKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKKyAqCisgKiBTZXQgVFggZGVzY3JpcHRvcidzIGFkZHJlc3MgZm9yIGEgc3BlY2lmaWMgcXVldWUuIEZvciA1MjEwIHdlIGlnbm9yZQorICogdGhlIHF1ZXVlIG51bWJlciBhbmQgd2UgdXNlIHR4IHF1ZXVlIHR5cGUgc2luY2Ugd2Ugb25seSBoYXZlIDIgcXVldWVzCisgKiBzbyBhcyBhYm92ZSB3ZSB1c2UgVFhEUDAgZm9yIG5vcm1hbCBkYXRhIHF1ZXVlIGFuZCBUWERQMSBmb3IgYmVhY29uIHF1ZXVlLgorICogRm9yIG5ld2VyIGNoaXBzIHdpdGggUUNVL0RDVSB3ZSBqdXN0IHNldCB0aGUgY29ycmVzcG9uZGluZyBUWERQIHJlZ2lzdGVyLgorICogUmV0dXJucyAtRUlOVkFMIGlmIHF1ZXVlIHR5cGUgaXMgaW52YWxpZCBmb3IgNTIxMCBhbmQgLUVJTyBpZiBxdWV1ZSBpcyBzdGlsbAorICogYWN0aXZlLgorICovCitpbnQgYXRoNWtfaHdfc2V0X3R4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlLCB1MzIgcGh5c19hZGRyKQoreworCXUxNiB0eF9yZWc7CisKKwkvKgorCSAqIFNldCB0aGUgdHJhbnNtaXQgcXVldWUgZGVzY3JpcHRvciBwb2ludGVyIHJlZ2lzdGVyIGJ5IHR5cGUKKwkgKiBvbiA1MjEwCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCS8qIEFzc3VtZSBhIGRhdGEgcXVldWUgKi8KKwkJdHhfcmVnID0gQVI1S19OT1FDVV9UWERQMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTZXQgdGhlIHRyYW5zbWl0IHF1ZXVlIGRlc2NyaXB0b3IgcG9pbnRlciBmb3IKKwkJICogdGhlIHNlbGVjdGVkIHF1ZXVlIG9uIFFDVSBmb3IgNTIxMSsKKwkJICogKHRoaXMgd29uJ3Qgd29yayBpZiB0aGUgcXVldWUgaXMgc3RpbGwgYWN0aXZlKQorCQkgKi8KKwkJaWYgKEFSNUtfUkVHX1JFQURfUShhaCwgQVI1S19RQ1VfVFhFLCBxdWV1ZSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQl0eF9yZWcgPSBBUjVLX1FVRVVFX1RYRFAocXVldWUpOworCX0KKworCS8qIFNldCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHBoeXNfYWRkciwgdHhfcmVnKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGF0aDVrX2h3X3VwZGF0ZV90eF90cmlnbGV2ZWwgLSBVcGRhdGUgdHggdHJpZ2dlciBsZXZlbAorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBpbmNyZWFzZTogRmxhZyB0byBmb3JjZSBpbmNyZWFzZSBvZiB0cmlnZ2VyIGxldmVsCisgKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZWFzZXMvZGVjcmVhc2VzIHRoZSB0eCB0cmlnZ2VyIGxldmVsIGZvciB0aGUgdHggZmlmbworICogYnVmZmVyIChha2EgRklGTyB0aHJlc2hvbGQpIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGVuIFBDVSBmbHVzaGVzCisgKiB0aGUgYnVmZmVyIGFuZCB0cmFuc21pdHMgaXQncyBkYXRhLiBMb3dlcmluZyB0aGlzIHJlc3VsdHMgc2VuZGluZyBzbWFsbAorICogZnJhbWVzIG1vcmUgcXVpY2tseSBidXQgY2FuIGxlYWQgdG8gdHggdW5kZXJydW5zLCByYWlzaW5nIGl0IGEgbG90IGNhbgorICogcmVzdWx0IG90aGVyIHByb2JsZW1zIChpIHRoaW5rIGJtaXNzIGlzIHJlbGF0ZWQpLiBSaWdodCBub3cgd2Ugc3RhcnQgd2l0aAorICogdGhlIGxvd2VzdCBwb3NzaWJsZSAoNjRCeXRlcykgYW5kIGlmIHdlIGdldCB0eCB1bmRlcnJ1biB3ZSBpbmNyZWFzZSBpdCB1c2luZworICogdGhlIGluY3JlYXNlIGZsYWcuIFJldHVybnMgLUVJTyBpZiB3ZSBoYXZlIGhhdmUgcmVhY2hlZCBtYXhpbXVtL21pbmltdW0uCisgKgorICogWFhYOiBMaW5rIHRoaXMgd2l0aCB0eCBETUEgc2l6ZSA/CisgKiBYWFg6IFVzZSBpdCB0byBzYXZlIGludGVycnVwdHMgPworICogVE9ETzogTmVlZHMgdGVzdGluZywgaSB0aGluayBpdCdzIHJlbGF0ZWQgdG8gYm1pc3MuLi4KKyAqLworaW50IGF0aDVrX2h3X3VwZGF0ZV90eF90cmlnbGV2ZWwoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IGluY3JlYXNlKQoreworCXUzMiB0cmlnZ2VyX2xldmVsLCBpbXI7CisJaW50IHJldCA9IC1FSU87CisKKwkvKgorCSAqIERpc2FibGUgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBtYXNrCisJICovCisJaW1yID0gYXRoNWtfaHdfc2V0X2ltcihhaCwgYWgtPmFoX2ltciAmIH5BUjVLX0lOVF9HTE9CQUwpOworCisJdHJpZ2dlcl9sZXZlbCA9IEFSNUtfUkVHX01TKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1RYQ0ZHKSwKKwkJCUFSNUtfVFhDRkdfVFhGVUxMKTsKKworCWlmICghaW5jcmVhc2UpIHsKKwkJaWYgKC0tdHJpZ2dlcl9sZXZlbCA8IEFSNUtfVFVORV9NSU5fVFhfRklGT19USFJFUykKKwkJCWdvdG8gZG9uZTsKKwl9IGVsc2UKKwkJdHJpZ2dlcl9sZXZlbCArPQorCQkJKChBUjVLX1RVTkVfTUFYX1RYX0ZJRk9fVEhSRVMgLSB0cmlnZ2VyX2xldmVsKSAvIDIpOworCisJLyoKKwkgKiBVcGRhdGUgdHJpZ2dlciBsZXZlbCBvbiBzdWNjZXNzCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHRyaWdnZXJfbGV2ZWwsIEFSNUtfVFJJR19MVkwpOworCWVsc2UKKwkJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19UWENGRywKKwkJCQlBUjVLX1RYQ0ZHX1RYRlVMTCwgdHJpZ2dlcl9sZXZlbCk7CisKKwlyZXQgPSAwOworCitkb25lOgorCS8qCisJICogUmVzdG9yZSBpbnRlcnJ1cHQgbWFzaworCSAqLworCWF0aDVrX2h3X3NldF9pbXIoYWgsIGltcik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKlwKKyogSW50ZXJydXB0IG1hc2tpbmcgKgorXCoqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nIC0gQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGludGVycnVwdHMKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGludGVycnVwdHMgdG8gcHJvY2Vzcy4gUmV0dXJucyAxIGlmIHdlCisgKiBoYXZlIHBlbmRpbmcgaW50ZXJydXB0cyBhbmQgMCBpZiB3ZSBoYXZlbid0LgorICovCitpbnQgYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0lOVFBFTkQpID09IDEgPyAxIDogMDsKK30KKworLyoqCisgKiBhdGg1a19od19nZXRfaXNyIC0gR2V0IGludGVycnVwdCBzdGF0dXMKKyAqCisgKiBAYWg6IFRoZSBAc3RydWN0IGF0aDVrX2h3CisgKiBAaW50ZXJydXB0X21hc2s6IERyaXZlcidzIGludGVycnVwdCBtYXNrIHVzZWQgdG8gZmlsdGVyIG91dAorICogaW50ZXJydXB0cyBpbiBzdy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zaWRlIG91ciBpbnRlcnJ1cHQgaGFuZGxlciB0byBkZXRlcm1pbmUgdGhlIHJlYXNvbgorICogZm9yIHRoZSBpbnRlcnJ1cHQgYnkgcmVhZGluZyBQcmltYXJ5IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIuIFJldHVybnMgYW4KKyAqIGFic3RyYWN0IGludGVycnVwdCBzdGF0dXMgbWFzayB3aGljaCBpcyBtb3N0bHkgSVNSIHdpdGggc29tZSB1bmNvbW1vbiBiaXRzCisgKiBiZWluZyBtYXBwZWQgb24gc29tZSBzdGFuZGFyZCBub24gaHctc3BlY2lmaWMgcG9zaXRpb25zCisgKiAoY2hlY2sgb3V0ICZhdGg1a19pbnQpLgorICoKKyAqIE5PVEU6IFdlIHVzZSByZWFkLWFuZC1jbGVhciByZWdpc3Rlciwgc28gYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgSVNSCisgKiBpcyB6ZXJvZWQuCisgKi8KK2ludCBhdGg1a19od19nZXRfaXNyKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50ICppbnRlcnJ1cHRfbWFzaykKK3sKKwl1MzIgZGF0YTsKKworCS8qCisJICogUmVhZCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gdGhlIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIKKwkgKiBvbiA1MjEwCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCWRhdGEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19JU1IpOworCQlpZiAoZGF0YSA9PSBBUjVLX0lOVF9OT0NBUkQpIHsKKwkJCSppbnRlcnJ1cHRfbWFzayA9IGRhdGE7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlYWQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIEludGVycnVwdAorCQkgKiBTdGF0dXMgUmVnaXN0ZXIgc2hhZG93IGNvcHkgKFJlYWQgQW5kIENsZWFyKQorCQkgKgorCQkgKiBOb3RlOiBQSVNSL1NJU1IgTm90IGF2YWlsYWJsZSBvbiA1MjEwCisJCSAqLworCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1BJU1IpOworCQlpZiAoZGF0YSA9PSBBUjVLX0lOVF9OT0NBUkQpIHsKKwkJCSppbnRlcnJ1cHRfbWFzayA9IGRhdGE7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qCisJICogR2V0IGFic3RyYWN0IGludGVycnVwdCBtYXNrIChkcml2ZXItY29tcGF0aWJsZSkKKwkgKi8KKwkqaW50ZXJydXB0X21hc2sgPSAoZGF0YSAmIEFSNUtfSU5UX0NPTU1PTikgJiBhaC0+YWhfaW1yOworCisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7CisJCXUzMiBzaXNyMiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSMik7CisKKwkJLypISVUgPSBIb3N0IEludGVyZmFjZSBVbml0IChQQ0kgZXRjKSovCisJCWlmIChkYXRhICYgKEFSNUtfSVNSX0hJVUVSUikpCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisKKwkJLypCZWFjb24gTm90IFJlYWR5Ki8KKwkJaWYgKGRhdGEgJiAoQVI1S19JU1JfQk5SKSkKKwkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9CTlI7CisKKwkJaWYgKHNpc3IyICYgKEFSNUtfU0lTUjJfU1NFUlIgfCBBUjVLX1NJU1IyX0RQRVJSIHwKKwkJCSAgICAgQVI1S19TSVNSMl9NQ0FCVCkpCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisKKwkJaWYgKGRhdGEgJiBBUjVLX0lTUl9USU0pCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfVElNOworCisJCWlmIChkYXRhICYgQVI1S19JU1JfQkNOTUlTQykgeworCQkJaWYgKHNpc3IyICYgQVI1S19TSVNSMl9USU0pCisJCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1RJTTsKKwkJCWlmIChzaXNyMiAmIEFSNUtfU0lTUjJfRFRJTSkKKwkJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRFRJTTsKKwkJCWlmIChzaXNyMiAmIEFSNUtfU0lTUjJfRFRJTV9TWU5DKQorCQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9EVElNX1NZTkM7CisJCQlpZiAoc2lzcjIgJiBBUjVLX1NJU1IyX0JDTl9USU1FT1VUKQorCQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9CQ05fVElNRU9VVDsKKwkJCWlmIChzaXNyMiAmIEFSNUtfU0lTUjJfQ0FCX1RJTUVPVVQpCisJCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX0NBQl9USU1FT1VUOworCQl9CisKKwkJaWYgKGRhdGEgJiBBUjVLX0lTUl9SWERPUFBMRVIpCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfUlhfRE9QUExFUjsKKwkJaWYgKGRhdGEgJiBBUjVLX0lTUl9RQ0JST1JOKSB7CisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfUUNCUk9STjsKKwkJCWFoLT5haF90eHFfaXNyIHw9IEFSNUtfUkVHX01TKAorCQkJCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjMpLAorCQkJCQlBUjVLX1NJU1IzX1FDQlJPUk4pOworCQl9CisJCWlmIChkYXRhICYgQVI1S19JU1JfUUNCUlVSTikgeworCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJVUk47CisJCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKKwkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IzKSwKKwkJCQkJQVI1S19TSVNSM19RQ0JSVVJOKTsKKwkJfQorCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1FUUklHKSB7CisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfUVRSSUc7CisJCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKKwkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1I0KSwKKwkJCQkJQVI1S19TSVNSNF9RVFJJRyk7CisJCX0KKworCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RYT0spCisJCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKKwkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IwKSwKKwkJCQkJQVI1S19TSVNSMF9RQ1VfVFhPSyk7CisKKwkJaWYgKGRhdGEgJiBBUjVLX0lTUl9UWERFU0MpCisJCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKKwkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IwKSwKKwkJCQkJQVI1S19TSVNSMF9RQ1VfVFhERVNDKTsKKworCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RYRVJSKQorCQkJYWgtPmFoX3R4cV9pc3IgfD0gQVI1S19SRUdfTVMoCisJCQkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSMSksCisJCQkJCUFSNUtfU0lTUjFfUUNVX1RYRVJSKTsKKworCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RYRU9MKQorCQkJYWgtPmFoX3R4cV9pc3IgfD0gQVI1S19SRUdfTVMoCisJCQkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSMSksCisJCQkJCUFSNUtfU0lTUjFfUUNVX1RYRU9MKTsKKworCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RYVVJOKQorCQkJYWgtPmFoX3R4cV9pc3IgfD0gQVI1S19SRUdfTVMoCisJCQkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSMiksCisJCQkJCUFSNUtfU0lTUjJfUUNVX1RYVVJOKTsKKwl9IGVsc2UgeworCQlpZiAoZGF0YSAmIChBUjVLX0lTUl9TU0VSUiB8IEFSNUtfSVNSX01DQUJUIHwKKwkJCSAgICBBUjVLX0lTUl9ISVVFUlIgfCBBUjVLX0lTUl9EUEVSUikpCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisKKwkJLyoKKwkJICogWFhYOiBCTUlTUyBpbnRlcnJ1cHRzIG1heSBvY2N1ciBhZnRlciBhc3NvY2lhdGlvbi4KKwkJICogSSBmb3VuZCB0aGlzIG9uIDUyMTAgY29kZSBidXQgaXQgbmVlZHMgdGVzdGluZy4gSWYgdGhpcyBpcworCQkgKiB0cnVlIHdlIHNob3VsZCBkaXNhYmxlIHRoZW0gYmVmb3JlIGFzc29jIGFuZCByZS1lbmFibGUgdGhlbQorCQkgKiBhZnRlciBhIHN1Y2Nlc3NmdWwgYXNzb2MgKyBzb21lIGppZmZpZXMuCisJCQlpbnRlcnJ1cHRfbWFzayAmPSB+QVI1S19JTlRfQk1JU1M7CisJCSAqLworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGF0aDVrX2h3X3NldF9pbXIgLSBTZXQgaW50ZXJydXB0IG1hc2sKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbmV3X21hc2s6IFRoZSBuZXcgaW50ZXJydXB0IG1hc2sgdG8gYmUgc2V0CisgKgorICogU2V0IHRoZSBpbnRlcnJ1cHQgbWFzayBpbiBodyB0byBzYXZlIGludGVycnVwdHMuIFdlIGRvIHRoYXQgYnkgbWFwcGluZworICogYXRoNWtfaW50IGJpdHMgdG8gaHctc3BlY2lmaWMgYml0cyB0byByZW1vdmUgYWJzdHJhY3Rpb24gYW5kIHdyaXRpbmcKKyAqIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLgorICovCitlbnVtIGF0aDVrX2ludCBhdGg1a19od19zZXRfaW1yKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50IG5ld19tYXNrKQoreworCWVudW0gYXRoNWtfaW50IG9sZF9tYXNrLCBpbnRfbWFzazsKKworCW9sZF9tYXNrID0gYWgtPmFoX2ltcjsKKworCS8qCisJICogRGlzYWJsZSBjYXJkIGludGVycnVwdHMgdG8gcHJldmVudCBhbnkgcmFjZSBjb25kaXRpb25zCisJICogKHRoZXkgd2lsbCBiZSByZS1lbmFibGVkIGFmdGVyd2FyZHMgaWYgQVI1S19JTlQgR0xPQkFMCisJICogaXMgc2V0IGFnYWluIG9uIHRoZSBuZXcgbWFzaykuCisJICovCisJaWYgKG9sZF9tYXNrICYgQVI1S19JTlRfR0xPQkFMKSB7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19JRVJfRElTQUJMRSwgQVI1S19JRVIpOworCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19JRVIpOworCX0KKworCS8qCisJICogQWRkIGFkZGl0aW9uYWwsIGNoaXBzZXQtZGVwZW5kZW50IGludGVycnVwdCBtYXNrIGZsYWdzCisJICogYW5kIHdyaXRlIHRoZW0gdG8gdGhlIElNUiAoaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIpLgorCSAqLworCWludF9tYXNrID0gbmV3X21hc2sgJiBBUjVLX0lOVF9DT01NT047CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKKwkJLyogUHJlc2VydmUgcGVyIHF1ZXVlIFRYVVJOIGludGVycnVwdCBtYXNrICovCisJCXUzMiBzaW1yMiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NJTVIyKQorCQkJCSYgQVI1S19TSU1SMl9RQ1VfVFhVUk47CisKKwkJaWYgKG5ld19tYXNrICYgQVI1S19JTlRfRkFUQUwpIHsKKwkJCWludF9tYXNrIHw9IEFSNUtfSU1SX0hJVUVSUjsKKwkJCXNpbXIyIHw9IChBUjVLX1NJTVIyX01DQUJUIHwgQVI1S19TSU1SMl9TU0VSUgorCQkJCXwgQVI1S19TSU1SMl9EUEVSUik7CisJCX0KKworCQkvKkJlYWNvbiBOb3QgUmVhZHkqLworCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9CTlIpCisJCQlpbnRfbWFzayB8PSBBUjVLX0lOVF9CTlI7CisKKwkJaWYgKG5ld19tYXNrICYgQVI1S19JTlRfVElNKQorCQkJaW50X21hc2sgfD0gQVI1S19JTVJfVElNOworCisJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX1RJTSkKKwkJCXNpbXIyIHw9IEFSNUtfU0lTUjJfVElNOworCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9EVElNKQorCQkJc2ltcjIgfD0gQVI1S19TSVNSMl9EVElNOworCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9EVElNX1NZTkMpCisJCQlzaW1yMiB8PSBBUjVLX1NJU1IyX0RUSU1fU1lOQzsKKwkJaWYgKG5ld19tYXNrICYgQVI1S19JTlRfQkNOX1RJTUVPVVQpCisJCQlzaW1yMiB8PSBBUjVLX1NJU1IyX0JDTl9USU1FT1VUOworCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9DQUJfVElNRU9VVCkKKwkJCXNpbXIyIHw9IEFSNUtfU0lTUjJfQ0FCX1RJTUVPVVQ7CisKKwkJaWYgKG5ld19tYXNrICYgQVI1S19JTlRfUlhfRE9QUExFUikKKwkJCWludF9tYXNrIHw9IEFSNUtfSU1SX1JYRE9QUExFUjsKKworCQkvKiBOb3RlOiBQZXIgcXVldWUgaW50ZXJydXB0IG1hc2tzCisJCSAqIGFyZSBzZXQgdmlhIHJlc2V0X3R4X3F1ZXVlIChxY3UuYykgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBpbnRfbWFzaywgQVI1S19QSU1SKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzaW1yMiwgQVI1S19TSU1SMik7CisKKwl9IGVsc2UgeworCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9GQVRBTCkKKwkJCWludF9tYXNrIHw9IChBUjVLX0lNUl9TU0VSUiB8IEFSNUtfSU1SX01DQUJUCisJCQkJfCBBUjVLX0lNUl9ISVVFUlIgfCBBUjVLX0lNUl9EUEVSUik7CisKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBpbnRfbWFzaywgQVI1S19JTVIpOworCX0KKworCS8qIElmIFJYTk9GUk0gaW50ZXJydXB0IGlzIG1hc2tlZCBkaXNhYmxlIGl0CisJICogYnkgc2V0dGluZyBBUjVLX1JYTk9GUk0gdG8gemVybyAqLworCWlmICghKG5ld19tYXNrICYgQVI1S19JTlRfUlhOT0ZSTSkpCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19SWE5PRlJNKTsKKworCS8qIFN0b3JlIG5ldyBpbnRlcnJ1cHQgbWFzayAqLworCWFoLT5haF9pbXIgPSBuZXdfbWFzazsKKworCS8qIC4ucmUtZW5hYmxlIGludGVycnVwdHMgaWYgQVI1S19JTlRfR0xPQkFMIGlzIHNldCAqLworCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX0dMT0JBTCkgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF9pZXIsIEFSNUtfSUVSKTsKKwkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfSUVSKTsKKwl9CisKKwlyZXR1cm4gb2xkX21hc2s7Cit9CisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrX2VlcHJvbS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfZWVwcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2MmM0YwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrX2VlcHJvbS5jCkBAIC0wLDAgKzEsMTc2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IEZlbGl4IEZpZXRrYXUgPG5iZEBvcGVud3J0Lm9yZz4KKyAqCisgKiBMaWdodGx5IG1vZGlmaWVkIGZvciBnUFhFLCBKdWx5IDIwMDksIGJ5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBNSVQgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIEVFUFJPTSBhY2Nlc3MgZnVuY3Rpb25zIGFuZCBoZWxwZXJzICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImJhc2UuaCIKKworLyoKKyAqIFJlYWQgZnJvbSBlZXByb20KKyAqLworc3RhdGljIGludCBhdGg1a19od19lZXByb21fcmVhZChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpCit7CisJdTMyIHN0YXR1cywgdGltZW91dDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBFRVBST00gYWNjZXNzCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1BDSUNGRywgQVI1S19QQ0lDRkdfRUVBRSk7CisJCSh2b2lkKWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0VFUFJPTV9CQVNFICsgKDQgKiBvZmZzZXQpKTsKKwl9IGVsc2UgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIG9mZnNldCwgQVI1S19FRVBST01fQkFTRSk7CisJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX0VFUFJPTV9DTUQsCisJCQkJQVI1S19FRVBST01fQ01EX1JFQUQpOworCX0KKworCWZvciAodGltZW91dCA9IEFSNUtfVFVORV9SRUdJU1RFUl9USU1FT1VUOyB0aW1lb3V0ID4gMDsgdGltZW91dC0tKSB7CisJCXN0YXR1cyA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0VFUFJPTV9TVEFUVVMpOworCQlpZiAoc3RhdHVzICYgQVI1S19FRVBST01fU1RBVF9SRERPTkUpIHsKKwkJCWlmIChzdGF0dXMgJiBBUjVLX0VFUFJPTV9TVEFUX1JERVJSKQorCQkJCXJldHVybiAtRUlPOworCQkJKmRhdGEgPSAodTE2KShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19FRVBST01fREFUQSkgJgorCQkJCQkweGZmZmYpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdWRlbGF5KDE1KTsKKwl9CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyoKKyAqIFRyYW5zbGF0ZSBiaW5hcnkgY2hhbm5lbCByZXByZXNlbnRhdGlvbiBpbiBFRVBST00gdG8gZnJlcXVlbmN5CisgKi8KK3N0YXRpYyB1MTYgYXRoNWtfZWVwcm9tX2JpbjJmcmVxKHN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUsIHUxNiBiaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwl1MTYgdmFsOworCisJaWYgKGJpbiA9PSBBUjVLX0VFUFJPTV9DSEFOTkVMX0RJUykKKwkJcmV0dXJuIGJpbjsKKworCWlmIChtb2RlID09IEFSNUtfRUVQUk9NX01PREVfMTFBKSB7CisJCWlmIChlZS0+ZWVfdmVyc2lvbiA+IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18yKQorCQkJdmFsID0gKDUgKiBiaW4pICsgNDgwMDsKKwkJZWxzZQorCQkJdmFsID0gYmluID4gNjIgPyAoMTAgKiA2MikgKyAoNSAqIChiaW4gLSA2MikpICsgNTEwMCA6CisJCQkJKGJpbiAqIDEwKSArIDUxMDA7CisJfSBlbHNlIHsKKwkJaWYgKGVlLT5lZV92ZXJzaW9uID4gQVI1S19FRVBST01fVkVSU0lPTl8zXzIpCisJCQl2YWwgPSBiaW4gKyAyMzAwOworCQllbHNlCisJCQl2YWwgPSBiaW4gKyAyNDAwOworCX0KKworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGVlcHJvbSAmIGNhcGFiaWxpdGllcyBzdHJ1Y3RzCisgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX2VlcHJvbV9pbml0X2hlYWRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCWludCByZXQ7CisJdTE2IHZhbDsKKworCS8qCisJICogUmVhZCB2YWx1ZXMgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRoZW0gaW4gdGhlIGNhcGFiaWxpdHkgc3RydWN0dXJlCisJICovCisJQVI1S19FRVBST01fUkVBRF9IRFIoQVI1S19FRVBST01fTUFHSUMsIGVlX21hZ2ljKTsKKwlBUjVLX0VFUFJPTV9SRUFEX0hEUihBUjVLX0VFUFJPTV9QUk9URUNULCBlZV9wcm90ZWN0KTsKKwlBUjVLX0VFUFJPTV9SRUFEX0hEUihBUjVLX0VFUFJPTV9SRUdfRE9NQUlOLCBlZV9yZWdkb21haW4pOworCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX1ZFUlNJT04sIGVlX3ZlcnNpb24pOworCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX0hEUiwgZWVfaGVhZGVyKTsKKworCS8qIFJldHVybiBpZiB3ZSBoYXZlIGFuIG9sZCBFRVBST00gKi8KKwlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPCBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMCkKKwkJcmV0dXJuIDA7CisKKwlBUjVLX0VFUFJPTV9SRUFEX0hEUihBUjVLX0VFUFJPTV9BTlRfR0FJTihhaC0+YWhfZWVfdmVyc2lvbiksCisJICAgIGVlX2FudF9nYWluKTsKKworCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMCkgeworCQlBUjVLX0VFUFJPTV9SRUFEX0hEUihBUjVLX0VFUFJPTV9NSVNDMCwgZWVfbWlzYzApOworCQlBUjVLX0VFUFJPTV9SRUFEX0hEUihBUjVLX0VFUFJPTV9NSVNDMSwgZWVfbWlzYzEpOworCisJCS8qIFhYWDogRG9uJ3Qga25vdyB3aGljaCB2ZXJzaW9ucyBpbmNsdWRlIHRoZXNlIHR3byAqLworCQlBUjVLX0VFUFJPTV9SRUFEX0hEUihBUjVLX0VFUFJPTV9NSVNDMiwgZWVfbWlzYzIpOworCisJCWlmIChlZS0+ZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMykKKwkJCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX01JU0MzLCBlZV9taXNjMyk7CisKKwkJaWYgKGVlLT5lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNV8wKSB7CisJCQlBUjVLX0VFUFJPTV9SRUFEX0hEUihBUjVLX0VFUFJPTV9NSVNDNCwgZWVfbWlzYzQpOworCQkJQVI1S19FRVBST01fUkVBRF9IRFIoQVI1S19FRVBST01fTUlTQzUsIGVlX21pc2M1KTsKKwkJCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX01JU0M2LCBlZV9taXNjNik7CisJCX0KKwl9CisKKwlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPCBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMykgeworCQlBUjVLX0VFUFJPTV9SRUFEKEFSNUtfRUVQUk9NX09CREIwXzJHSFosIHZhbCk7CisJCWVlLT5lZV9vYltBUjVLX0VFUFJPTV9NT0RFXzExQl1bMF0gPSB2YWwgJiAweDc7CisJCWVlLT5lZV9kYltBUjVLX0VFUFJPTV9NT0RFXzExQl1bMF0gPSAodmFsID4+IDMpICYgMHg3OworCisJCUFSNUtfRUVQUk9NX1JFQUQoQVI1S19FRVBST01fT0JEQjFfMkdIWiwgdmFsKTsKKwkJZWUtPmVlX29iW0FSNUtfRUVQUk9NX01PREVfMTFHXVswXSA9IHZhbCAmIDB4NzsKKwkJZWUtPmVlX2RiW0FSNUtfRUVQUk9NX01PREVfMTFHXVswXSA9ICh2YWwgPj4gMykgJiAweDc7CisJfQorCisJQVI1S19FRVBST01fUkVBRChBUjVLX0VFUFJPTV9JU19IQjYzLCB2YWwpOworCisJaWYgKChhaC0+YWhfbWFjX3ZlcnNpb24gPT0gKEFSNUtfU1JFVl9BUjI0MjUgPj4gNCkpICYmIHZhbCkKKwkJZWUtPmVlX2lzX2hiNjMgPSAxOworCWVsc2UKKwkJZWUtPmVlX2lzX2hiNjMgPSAwOworCisJQVI1S19FRVBST01fUkVBRChBUjVLX0VFUFJPTV9SRktJTEwsIHZhbCk7CisJZWUtPmVlX3Jma2lsbF9waW4gPSAodTgpIEFSNUtfUkVHX01TKHZhbCwgQVI1S19FRVBST01fUkZLSUxMX0dQSU9fU0VMKTsKKwllZS0+ZWVfcmZraWxsX3BvbCA9IHZhbCAmIEFSNUtfRUVQUk9NX1JGS0lMTF9QT0xBUklUWSA/IDEgOiAwOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFJlYWQgYW50ZW5uYSBpbmZvcyBmcm9tIGVlcHJvbQorICovCitzdGF0aWMgaW50IGF0aDVrX2VlcHJvbV9yZWFkX2FudHMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyICpvZmZzZXQsCisJCXVuc2lnbmVkIGludCBtb2RlKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXUzMiBvID0gKm9mZnNldDsKKwl1MTYgdmFsOworCWludCByZXQsIGkgPSAwOworCisJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisJZWUtPmVlX3N3aXRjaF9zZXR0bGluZ1ttb2RlXQk9ICh2YWwgPj4gOCkgJiAweDdmOworCWVlLT5lZV9hdG5fdHhfcnhbbW9kZV0JCT0gKHZhbCA+PiAyKSAmIDB4M2Y7CisJZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2ldCT0gKHZhbCA8PCA0KSAmIDB4M2Y7CisKKwlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQl8PSAodmFsID4+IDEyKSAmIDB4ZjsKKwllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQk9ICh2YWwgPj4gNikgJiAweDNmOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCT0gdmFsICYgMHgzZjsKKworCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCT0gKHZhbCA+PiAxMCkgJiAweDNmOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCT0gKHZhbCA+PiA0KSAmIDB4M2Y7CisJZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2ldCT0gKHZhbCA8PCAyKSAmIDB4M2Y7CisKKwlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQl8PSAodmFsID4+IDE0KSAmIDB4MzsKKwllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQk9ICh2YWwgPj4gOCkgJiAweDNmOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCT0gKHZhbCA+PiAyKSAmIDB4M2Y7CisJZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2ldCT0gKHZhbCA8PCA0KSAmIDB4M2Y7CisKKwlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQl8PSAodmFsID4+IDEyKSAmIDB4ZjsKKwllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQk9ICh2YWwgPj4gNikgJiAweDNmOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCT0gdmFsICYgMHgzZjsKKworCS8qIEdldCBhbnRlbm5hIG1vZGVzICovCisJYWgtPmFoX2FudGVubmFbbW9kZV1bMF0gPQorCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzBdIDw8IDQpOworCWFoLT5haF9hbnRlbm5hW21vZGVdW0FSNUtfQU5UX0ZJWEVEX0FdID0KKwkgICAgIGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVsxXSAJfAorCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzJdIDw8IDYpIAl8CisJICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bM10gPDwgMTIpIHwKKwkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVs0XSA8PCAxOCkgfAorCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzVdIDw8IDI0KTsKKwlhaC0+YWhfYW50ZW5uYVttb2RlXVtBUjVLX0FOVF9GSVhFRF9CXSA9CisJICAgICBlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bNl0gCXwKKwkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVs3XSA8PCA2KSAJfAorCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzhdIDw8IDEyKSB8CisJICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bOV0gPDwgMTgpIHwKKwkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVsxMF0gPDwgMjQpOworCisJLyogcmV0dXJuIG5ldyBvZmZzZXQgKi8KKwkqb2Zmc2V0ID0gbzsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBzdXBwb3J0ZWQgbW9kZXMgYW5kIHNvbWUgbW9kZS1zcGVjaWZpYyBjYWxpYnJhdGlvbiBkYXRhCisgKiBmcm9tIGVlcHJvbQorICovCitzdGF0aWMgaW50IGF0aDVrX2VlcHJvbV9yZWFkX21vZGVzKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiAqb2Zmc2V0LAorCQl1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKKwl1MzIgbyA9ICpvZmZzZXQ7CisJdTE2IHZhbDsKKwlpbnQgcmV0OworCisJZWUtPmVlX25fcGllcnNbbW9kZV0gPSAwOworCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCWVlLT5lZV9hZGNfZGVzaXJlZF9zaXplW21vZGVdCT0gKHM4KSgodmFsID4+IDgpICYgMHhmZik7CisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFBOgorCQllZS0+ZWVfb2JbbW9kZV1bM10JPSAodmFsID4+IDUpICYgMHg3OworCQllZS0+ZWVfZGJbbW9kZV1bM10JPSAodmFsID4+IDIpICYgMHg3OworCQllZS0+ZWVfb2JbbW9kZV1bMl0JPSAodmFsIDw8IDEpICYgMHg3OworCisJCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCQllZS0+ZWVfb2JbbW9kZV1bMl0JfD0gKHZhbCA+PiAxNSkgJiAweDE7CisJCWVlLT5lZV9kYlttb2RlXVsyXQk9ICh2YWwgPj4gMTIpICYgMHg3OworCQllZS0+ZWVfb2JbbW9kZV1bMV0JPSAodmFsID4+IDkpICYgMHg3OworCQllZS0+ZWVfZGJbbW9kZV1bMV0JPSAodmFsID4+IDYpICYgMHg3OworCQllZS0+ZWVfb2JbbW9kZV1bMF0JPSAodmFsID4+IDMpICYgMHg3OworCQllZS0+ZWVfZGJbbW9kZV1bMF0JPSB2YWwgJiAweDc7CisJCWJyZWFrOworCWNhc2UgQVI1S19FRVBST01fTU9ERV8xMUc6CisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQjoKKwkJZWUtPmVlX29iW21vZGVdWzFdCT0gKHZhbCA+PiA0KSAmIDB4NzsKKwkJZWUtPmVlX2RiW21vZGVdWzFdCT0gdmFsICYgMHg3OworCQlicmVhazsKKwl9CisKKwlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwllZS0+ZWVfdHhfZW5kMnhsbmFfZW5hYmxlW21vZGVdCT0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJZWUtPmVlX3Rocl82Mlttb2RlXQkJPSB2YWwgJiAweGZmOworCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uIDw9IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18yKQorCQllZS0+ZWVfdGhyXzYyW21vZGVdID0gbW9kZSA9PSBBUjVLX0VFUFJPTV9NT0RFXzExQSA/IDE1IDogMjg7CisKKwlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwllZS0+ZWVfdHhfZW5kMnhwYV9kaXNhYmxlW21vZGVdCT0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJZWUtPmVlX3R4X2ZybTJ4cGFfZW5hYmxlW21vZGVdCT0gdmFsICYgMHhmZjsKKworCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCWVlLT5lZV9wZ2FfZGVzaXJlZF9zaXplW21vZGVdCT0gKHZhbCA+PiA4KSAmIDB4ZmY7CisKKwlpZiAoKHZhbCAmIDB4ZmYpICYgMHg4MCkKKwkJZWUtPmVlX25vaXNlX2Zsb29yX3Roclttb2RlXSA9IC0oKCgodmFsICYgMHhmZikgXiAweGZmKSkgKyAxKTsKKwllbHNlCisJCWVlLT5lZV9ub2lzZV9mbG9vcl90aHJbbW9kZV0gPSB2YWwgJiAweGZmOworCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uIDw9IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18yKQorCQllZS0+ZWVfbm9pc2VfZmxvb3JfdGhyW21vZGVdID0KKwkJICAgIG1vZGUgPT0gQVI1S19FRVBST01fTU9ERV8xMUEgPyAtNTQgOiAtMTsKKworCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCWVlLT5lZV94bG5hX2dhaW5bbW9kZV0JCT0gKHZhbCA+PiA1KSAmIDB4ZmY7CisJZWUtPmVlX3hfZ2Fpblttb2RlXQkJPSAodmFsID4+IDEpICYgMHhmOworCWVlLT5lZV94cGRbbW9kZV0JCT0gdmFsICYgMHgxOworCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8wKQorCQllZS0+ZWVfZml4ZWRfYmlhc1ttb2RlXSA9ICh2YWwgPj4gMTMpICYgMHgxOworCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18zKSB7CisJCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCQllZS0+ZWVfZmFsc2VfZGV0ZWN0W21vZGVdID0gKHZhbCA+PiA2KSAmIDB4N2Y7CisKKwkJaWYgKG1vZGUgPT0gQVI1S19FRVBST01fTU9ERV8xMUEpCisJCQllZS0+ZWVfeHJfcG93ZXJbbW9kZV0gPSB2YWwgJiAweDNmOworCQllbHNlIHsKKwkJCWVlLT5lZV9vYlttb2RlXVswXSA9IHZhbCAmIDB4NzsKKwkJCWVlLT5lZV9kYlttb2RlXVswXSA9ICh2YWwgPj4gMykgJiAweDc7CisJCX0KKwl9CisKKwlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPCBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfNCkgeworCQllZS0+ZWVfaV9nYWluW21vZGVdID0gQVI1S19FRVBST01fSV9HQUlOOworCQllZS0+ZWVfY2NrX29mZG1fcG93ZXJfZGVsdGEgPSBBUjVLX0VFUFJPTV9DQ0tfT0ZETV9ERUxUQTsKKwl9IGVsc2UgeworCQllZS0+ZWVfaV9nYWluW21vZGVdID0gKHZhbCA+PiAxMykgJiAweDc7CisKKwkJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisJCWVlLT5lZV9pX2dhaW5bbW9kZV0gfD0gKHZhbCA8PCAzKSAmIDB4Mzg7CisKKwkJaWYgKG1vZGUgPT0gQVI1S19FRVBST01fTU9ERV8xMUcpIHsKKwkJCWVlLT5lZV9jY2tfb2ZkbV9wb3dlcl9kZWx0YSA9ICh2YWwgPj4gMykgJiAweGZmOworCQkJaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF82KQorCQkJCWVlLT5lZV9zY2FsZWRfY2NrX2RlbHRhID0gKHZhbCA+PiAxMSkgJiAweDFmOworCQl9CisJfQorCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8wICYmCisJCQltb2RlID09IEFSNUtfRUVQUk9NX01PREVfMTFBKSB7CisJCWVlLT5lZV9pX2NhbFttb2RlXSA9ICh2YWwgPj4gOCkgJiAweDNmOworCQllZS0+ZWVfcV9jYWxbbW9kZV0gPSAodmFsID4+IDMpICYgMHgxZjsKKwl9CisKKwlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPCBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMCkKKwkJZ290byBkb25lOworCisJLyogTm90ZTogPj0gdjUgaGF2ZSBiZyBmcmVxIHBpZXJzIG9uIGFub3RoZXIgbG9jYXRpb24KKwkgKiBzbyB0aGVzZSBmcmVxIHBpZXJzIGFyZSBpZ25vcmVkIGZvciA+PSB2NSAoc2hvdWxkIGJlIDB4ZmYKKwkgKiBhbnl3YXkpICovCisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFBOgorCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPCBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMSkKKwkJCWJyZWFrOworCisJCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCQllZS0+ZWVfbWFyZ2luX3R4X3J4W21vZGVdID0gdmFsICYgMHgzZjsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQjoKKwkJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisKKwkJZWUtPmVlX3B3cl9jYWxfYlswXS5mcmVxID0KKwkJCWF0aDVrX2VlcHJvbV9iaW4yZnJlcShlZSwgdmFsICYgMHhmZiwgbW9kZSk7CisJCWlmIChlZS0+ZWVfcHdyX2NhbF9iWzBdLmZyZXEgIT0gQVI1S19FRVBST01fQ0hBTk5FTF9ESVMpCisJCQllZS0+ZWVfbl9waWVyc1ttb2RlXSsrOworCisJCWVlLT5lZV9wd3JfY2FsX2JbMV0uZnJlcSA9CisJCQlhdGg1a19lZXByb21fYmluMmZyZXEoZWUsICh2YWwgPj4gOCkgJiAweGZmLCBtb2RlKTsKKwkJaWYgKGVlLT5lZV9wd3JfY2FsX2JbMV0uZnJlcSAhPSBBUjVLX0VFUFJPTV9DSEFOTkVMX0RJUykKKwkJCWVlLT5lZV9uX3BpZXJzW21vZGVdKys7CisKKwkJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisJCWVlLT5lZV9wd3JfY2FsX2JbMl0uZnJlcSA9CisJCQlhdGg1a19lZXByb21fYmluMmZyZXEoZWUsIHZhbCAmIDB4ZmYsIG1vZGUpOworCQlpZiAoZWUtPmVlX3B3cl9jYWxfYlsyXS5mcmVxICE9IEFSNUtfRUVQUk9NX0NIQU5ORUxfRElTKQorCQkJZWUtPmVlX25fcGllcnNbbW9kZV0rKzsKKworCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzEpCisJCQllZS0+ZWVfbWFyZ2luX3R4X3J4W21vZGVdID0gKHZhbCA+PiA4KSAmIDB4M2Y7CisJCWJyZWFrOworCWNhc2UgQVI1S19FRVBST01fTU9ERV8xMUc6CisJCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCisJCWVlLT5lZV9wd3JfY2FsX2dbMF0uZnJlcSA9CisJCQlhdGg1a19lZXByb21fYmluMmZyZXEoZWUsIHZhbCAmIDB4ZmYsIG1vZGUpOworCQlpZiAoZWUtPmVlX3B3cl9jYWxfZ1swXS5mcmVxICE9IEFSNUtfRUVQUk9NX0NIQU5ORUxfRElTKQorCQkJZWUtPmVlX25fcGllcnNbbW9kZV0rKzsKKworCQllZS0+ZWVfcHdyX2NhbF9nWzFdLmZyZXEgPQorCQkJYXRoNWtfZWVwcm9tX2JpbjJmcmVxKGVlLCAodmFsID4+IDgpICYgMHhmZiwgbW9kZSk7CisJCWlmIChlZS0+ZWVfcHdyX2NhbF9nWzFdLmZyZXEgIT0gQVI1S19FRVBST01fQ0hBTk5FTF9ESVMpCisJCQllZS0+ZWVfbl9waWVyc1ttb2RlXSsrOworCisJCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCQllZS0+ZWVfdHVyYm9fbWF4X3Bvd2VyW21vZGVdID0gdmFsICYgMHg3ZjsKKwkJZWUtPmVlX3hyX3Bvd2VyW21vZGVdID0gKHZhbCA+PiA3KSAmIDB4M2Y7CisKKwkJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisJCWVlLT5lZV9wd3JfY2FsX2dbMl0uZnJlcSA9CisJCQlhdGg1a19lZXByb21fYmluMmZyZXEoZWUsIHZhbCAmIDB4ZmYsIG1vZGUpOworCQlpZiAoZWUtPmVlX3B3cl9jYWxfZ1syXS5mcmVxICE9IEFSNUtfRUVQUk9NX0NIQU5ORUxfRElTKQorCQkJZWUtPmVlX25fcGllcnNbbW9kZV0rKzsKKworCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzEpCisJCQllZS0+ZWVfbWFyZ2luX3R4X3J4W21vZGVdID0gKHZhbCA+PiA4KSAmIDB4M2Y7CisKKwkJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisJCWVlLT5lZV9pX2NhbFttb2RlXSA9ICh2YWwgPj4gOCkgJiAweDNmOworCQllZS0+ZWVfcV9jYWxbbW9kZV0gPSAodmFsID4+IDMpICYgMHgxZjsKKworCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzIpIHsKKwkJCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCQkJZWUtPmVlX2Nja19vZmRtX2dhaW5fZGVsdGEgPSB2YWwgJiAweGZmOworCQl9CisJCWJyZWFrOworCX0KKworZG9uZToKKwkvKiByZXR1cm4gbmV3IG9mZnNldCAqLworCSpvZmZzZXQgPSBvOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHR1cmJvIG1vZGUgaW5mb3JtYXRpb24gb24gbmV3ZXIgRUVQUk9NIHZlcnNpb25zCisgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX2VlcHJvbV9yZWFkX3R1cmJvX21vZGVzKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQkgICAgICB1MzIgKm9mZnNldCwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CisJdTMyIG8gPSAqb2Zmc2V0OworCXUxNiB2YWw7CisJaW50IHJldDsKKworCWlmIChlZS0+ZWVfdmVyc2lvbiA8IEFSNUtfRUVQUk9NX1ZFUlNJT05fNV8wKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAobW9kZSl7CisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQToKKwkJZWUtPmVlX3N3aXRjaF9zZXR0bGluZ190dXJib1ttb2RlXSA9ICh2YWwgPj4gNikgJiAweDdmOworCisJCWVlLT5lZV9hdG5fdHhfcnhfdHVyYm9bbW9kZV0gPSAodmFsID4+IDEzKSAmIDB4NzsKKwkJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisJCWVlLT5lZV9hdG5fdHhfcnhfdHVyYm9bbW9kZV0gfD0gKHZhbCAmIDB4NykgPDwgMzsKKwkJZWUtPmVlX21hcmdpbl90eF9yeF90dXJib1ttb2RlXSA9ICh2YWwgPj4gMykgJiAweDNmOworCisJCWVlLT5lZV9hZGNfZGVzaXJlZF9zaXplX3R1cmJvW21vZGVdID0gKHZhbCA+PiA5KSAmIDB4N2Y7CisJCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCQllZS0+ZWVfYWRjX2Rlc2lyZWRfc2l6ZV90dXJib1ttb2RlXSB8PSAodmFsICYgMHgxKSA8PCA3OworCQllZS0+ZWVfcGdhX2Rlc2lyZWRfc2l6ZV90dXJib1ttb2RlXSA9ICh2YWwgPj4gMSkgJiAweGZmOworCisJCWlmIChBUjVLX0VFUFJPTV9FRU1BUChlZS0+ZWVfbWlzYzApID49MikKKwkJCWVlLT5lZV9wZF9nYWluX292ZXJsYXAgPSAodmFsID4+IDkpICYgMHhmOworCQlicmVhazsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFHOgorCQllZS0+ZWVfc3dpdGNoX3NldHRsaW5nX3R1cmJvW21vZGVdID0gKHZhbCA+PiA4KSAmIDB4N2Y7CisKKwkJZWUtPmVlX2F0bl90eF9yeF90dXJib1ttb2RlXSA9ICh2YWwgPj4gMTUpICYgMHg3OworCQlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwkJZWUtPmVlX2F0bl90eF9yeF90dXJib1ttb2RlXSB8PSAodmFsICYgMHgxZikgPDwgMTsKKwkJZWUtPmVlX21hcmdpbl90eF9yeF90dXJib1ttb2RlXSA9ICh2YWwgPj4gNSkgJiAweDNmOworCisJCWVlLT5lZV9hZGNfZGVzaXJlZF9zaXplX3R1cmJvW21vZGVdID0gKHZhbCA+PiAxMSkgJiAweDdmOworCQlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwkJZWUtPmVlX2FkY19kZXNpcmVkX3NpemVfdHVyYm9bbW9kZV0gfD0gKHZhbCAmIDB4NykgPDwgNTsKKwkJZWUtPmVlX3BnYV9kZXNpcmVkX3NpemVfdHVyYm9bbW9kZV0gPSAodmFsID4+IDMpICYgMHhmZjsKKwkJYnJlYWs7CisJfQorCisJLyogcmV0dXJuIG5ldyBvZmZzZXQgKi8KKwkqb2Zmc2V0ID0gbzsKKworCXJldHVybiAwOworfQorCisvKiBSZWFkIG1vZGUtc3BlY2lmaWMgZGF0YSAoZXhjZXB0IHBvd2VyIGNhbGlicmF0aW9uIGRhdGEpICovCitzdGF0aWMgaW50CithdGg1a19lZXByb21faW5pdF9tb2RlcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXUzMiBtb2RlX29mZnNldFszXTsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwl1MzIgb2Zmc2V0OworCWludCByZXQ7CisKKwkvKgorCSAqIEdldCB2YWx1ZXMgZm9yIGFsbCBtb2RlcworCSAqLworCW1vZGVfb2Zmc2V0W0FSNUtfRUVQUk9NX01PREVfMTFBXSA9IEFSNUtfRUVQUk9NX01PREVTXzExQShhaC0+YWhfZWVfdmVyc2lvbik7CisJbW9kZV9vZmZzZXRbQVI1S19FRVBST01fTU9ERV8xMUJdID0gQVI1S19FRVBST01fTU9ERVNfMTFCKGFoLT5haF9lZV92ZXJzaW9uKTsKKwltb2RlX29mZnNldFtBUjVLX0VFUFJPTV9NT0RFXzExR10gPSBBUjVLX0VFUFJPTV9NT0RFU18xMUcoYWgtPmFoX2VlX3ZlcnNpb24pOworCisJZWUtPmVlX3R1cmJvX21heF9wb3dlcltBUjVLX0VFUFJPTV9NT0RFXzExQV0gPQorCQlBUjVLX0VFUFJPTV9IRFJfVF81R0haX0RCTShlZS0+ZWVfaGVhZGVyKTsKKworCWZvciAobW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFBOyBtb2RlIDw9IEFSNUtfRUVQUk9NX01PREVfMTFHOyBtb2RlKyspIHsKKwkJb2Zmc2V0ID0gbW9kZV9vZmZzZXRbbW9kZV07CisKKwkJcmV0ID0gYXRoNWtfZWVwcm9tX3JlYWRfYW50cyhhaCwgJm9mZnNldCwgbW9kZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGF0aDVrX2VlcHJvbV9yZWFkX21vZGVzKGFoLCAmb2Zmc2V0LCBtb2RlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYXRoNWtfZWVwcm9tX3JlYWRfdHVyYm9fbW9kZXMoYWgsICZvZmZzZXQsIG1vZGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBvdmVycmlkZSBmb3Igb2xkZXIgZWVwcm9tIHZlcnNpb25zIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgKi8KKwlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPD0gQVI1S19FRVBST01fVkVSU0lPTl8zXzIpIHsKKwkJZWUtPmVlX3Rocl82MltBUjVLX0VFUFJPTV9NT0RFXzExQV0gPSAxNTsKKwkJZWUtPmVlX3Rocl82MltBUjVLX0VFUFJPTV9NT0RFXzExQl0gPSAyODsKKwkJZWUtPmVlX3Rocl82MltBUjVLX0VFUFJPTV9NT0RFXzExR10gPSAyODsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCB0aGUgZnJlcXVlbmN5IHBpZXJzIGZvciBlYWNoIG1vZGUgKG1vc3RseSB1c2VkIG9uIG5ld2VyIGVlcHJvbXMgd2l0aCAweGZmCisgKiBmcmVxdWVuY3kgbWFzaykgKi8KK3N0YXRpYyBpbmxpbmUgaW50CithdGg1a19lZXByb21fcmVhZF9mcmVxX2xpc3Qoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50ICpvZmZzZXQsIGludCBtYXgsCisJCQlzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8gKnBjLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKKwlpbnQgbyA9ICpvZmZzZXQ7CisJaW50IGkgPSAwOworCXU4IGZyZXExLCBmcmVxMjsKKwlpbnQgcmV0OworCXUxNiB2YWw7CisKKwllZS0+ZWVfbl9waWVyc1ttb2RlXSA9IDA7CisJd2hpbGUoaSA8IG1heCkgeworCQlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKworCQlmcmVxMSA9IHZhbCAmIDB4ZmY7CisJCWlmICghZnJlcTEpCisJCQlicmVhazsKKworCQlwY1tpKytdLmZyZXEgPSBhdGg1a19lZXByb21fYmluMmZyZXEoZWUsCisJCQkJZnJlcTEsIG1vZGUpOworCQllZS0+ZWVfbl9waWVyc1ttb2RlXSsrOworCisJCWZyZXEyID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWlmICghZnJlcTIpCisJCQlicmVhazsKKworCQlwY1tpKytdLmZyZXEgPSBhdGg1a19lZXByb21fYmluMmZyZXEoZWUsCisJCQkJZnJlcTIsIG1vZGUpOworCQllZS0+ZWVfbl9waWVyc1ttb2RlXSsrOworCX0KKworCS8qIHJldHVybiBuZXcgb2Zmc2V0ICovCisJKm9mZnNldCA9IG87CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCBmcmVxdWVuY3kgcGllcnMgZm9yIDgwMi4xMWEgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX2VlcHJvbV9pbml0XzExYV9wY2FsX2ZyZXEoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKKwlzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8gKnBjYWwgPSBlZS0+ZWVfcHdyX2NhbF9hOworCWludCBpLCByZXQ7CisJdTE2IHZhbDsKKwl1OCBtYXNrOworCisJaWYgKGVlLT5lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18zKSB7CisJCWF0aDVrX2VlcHJvbV9yZWFkX2ZyZXFfbGlzdChhaCwgJm9mZnNldCwKKwkJCUFSNUtfRUVQUk9NX05fNUdIWl9DSEFOLCBwY2FsLAorCQkJQVI1S19FRVBST01fTU9ERV8xMUEpOworCX0gZWxzZSB7CisJCW1hc2sgPSBBUjVLX0VFUFJPTV9GUkVRX00oYWgtPmFoX2VlX3ZlcnNpb24pOworCisJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCXBjYWxbMF0uZnJlcSAgPSAodmFsID4+IDkpICYgbWFzazsKKwkJcGNhbFsxXS5mcmVxICA9ICh2YWwgPj4gMikgJiBtYXNrOworCQlwY2FsWzJdLmZyZXEgID0gKHZhbCA8PCA1KSAmIG1hc2s7CisKKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJcGNhbFsyXS5mcmVxIHw9ICh2YWwgPj4gMTEpICYgMHgxZjsKKwkJcGNhbFszXS5mcmVxICA9ICh2YWwgPj4gNCkgJiBtYXNrOworCQlwY2FsWzRdLmZyZXEgID0gKHZhbCA8PCAzKSAmIG1hc2s7CisKKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJcGNhbFs0XS5mcmVxIHw9ICh2YWwgPj4gMTMpICYgMHg3OworCQlwY2FsWzVdLmZyZXEgID0gKHZhbCA+PiA2KSAmIG1hc2s7CisJCXBjYWxbNl0uZnJlcSAgPSAodmFsIDw8IDEpICYgbWFzazsKKworCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQlwY2FsWzZdLmZyZXEgfD0gKHZhbCA+PiAxNSkgJiAweDE7CisJCXBjYWxbN10uZnJlcSAgPSAodmFsID4+IDgpICYgbWFzazsKKwkJcGNhbFs4XS5mcmVxICA9ICh2YWwgPj4gMSkgJiBtYXNrOworCQlwY2FsWzldLmZyZXEgID0gKHZhbCA8PCA2KSAmIG1hc2s7CisKKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJcGNhbFs5XS5mcmVxIHw9ICh2YWwgPj4gMTApICYgMHgzZjsKKworCQkvKiBGaXhlZCBudW1iZXIgb2YgcGllcnMgKi8KKwkJZWUtPmVlX25fcGllcnNbQVI1S19FRVBST01fTU9ERV8xMUFdID0gMTA7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSNUtfRUVQUk9NX05fNUdIWl9DSEFOOyBpKyspIHsKKwkJCXBjYWxbaV0uZnJlcSA9IGF0aDVrX2VlcHJvbV9iaW4yZnJlcShlZSwKKwkJCQlwY2FsW2ldLmZyZXEsIEFSNUtfRUVQUk9NX01PREVfMTFBKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBSZWFkIGZyZXF1ZW5jeSBwaWVycyBmb3IgODAyLjExYmcgb24gZWVwcm9tIHZlcnNpb25zID49IDUgYW5kIGVlbWFwID49IDIgKi8KK3N0YXRpYyBpbmxpbmUgaW50CithdGg1a19lZXByb21faW5pdF8xMWJnXzI0MTMoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IG1vZGUsIGludCBvZmZzZXQpCit7CisJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CisJc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvICpwY2FsOworCisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFCOgorCQlwY2FsID0gZWUtPmVlX3B3cl9jYWxfYjsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExRzoKKwkJcGNhbCA9IGVlLT5lZV9wd3JfY2FsX2c7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWF0aDVrX2VlcHJvbV9yZWFkX2ZyZXFfbGlzdChhaCwgJm9mZnNldCwKKwkJQVI1S19FRVBST01fTl8yR0haX0NIQU5fMjQxMywgcGNhbCwKKwkJbW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgcG93ZXIgY2FsaWJyYXRpb24gZm9yIFJGNTExMSBjaGlwcworICoKKyAqIEZvciBSRjUxMTEgd2UgaGF2ZSBhbiBYUEQgLWVYdGVybmFsIFBvd2VyIERldGVjdG9yLSBjdXJ2ZQorICogZm9yIGVhY2ggY2FsaWJyYXRlZCBjaGFubmVsLiBFYWNoIGN1cnZlIGhhcyAwLDVkQiBQb3dlciBzdGVwcworICogb24geCBheGlzIGFuZCBQQ0RBQyBzdGVwcyAob2Zmc2V0cykgb24geSBheGlzIGFuZCBsb29rcyBsaWtlIGFuCisgKiBleHBvbmVudGlhbCBmdW5jdGlvbi4gVG8gcmVjcmVhdGUgdGhlIGN1cnZlIHdlIHJlYWQgMTEgcG9pbnRzCisgKiBoZXJlIGFuZCBpbnRlcnBvbGF0ZSBsYXRlci4KKyAqLworCisvKiBVc2VkIHRvIG1hdGNoIFBDREFDIHN0ZXBzIHdpdGggcG93ZXIgdmFsdWVzIG9uIFJGNTExMSBjaGlwcworICogKGVlcHJvbSB2ZXJzaW9ucyA8IDQpLiBGb3IgUkY1MTExIHdlIGhhdmUgMTEgcHJlLWRlZmluZWQgUENEQUMKKyAqIHN0ZXBzIHRoYXQgbWF0Y2ggd2l0aCB0aGUgcG93ZXIgdmFsdWVzIHdlIHJlYWQgZnJvbSBlZXByb20uIE9uCisgKiBvbGRlciBlZXByb20gdmVyc2lvbnMgKDwgMy4yKSB0aGVzZSBzdGVwcyBhcmUgZXF1YWx5IHNwYWNlZCBhdAorICogMTAlIG9mIHRoZSBwY2RhYyBjdXJ2ZSAtdW50aWwgdGhlIGN1cnZlIHJlYWNoZXMgaXQncyBtYXhpbXVtLQorICogKDExIHN0ZXBzIGZyb20gMCB0byAxMDAlKSBidXQgb24gbmV3ZXIgZWVwcm9tIHZlcnNpb25zICg+PSAzLjIpCisgKiB0aGVzZSAxMSBzdGVwcyBhcmUgc3BhY2VkIGluIGEgZGlmZmVyZW50IHdheS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiB0aGUgcGNkYWMgc3RlcHMgYmFzZWQgb24gZWVwcm9tIHZlcnNpb24gYW5kIGN1cnZlIG1pbi9tYXggc28gdGhhdCB3ZQorICogY2FuIGhhdmUgcGNkYWMvcHdyIHBvaW50cy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCithdGg1a19nZXRfcGNkYWNfaW50ZXJjZXB0cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBtaW4sIHU4IG1heCwgdTggKnZwKQoreworCXN0YXRpYyBjb25zdCB1MTYgaW50ZXJjZXB0czNbXSA9CisJCXsgMCwgNSwgMTAsIDIwLCAzMCwgNTAsIDcwLCA4NSwgOTAsIDk1LCAxMDAgfTsKKwlzdGF0aWMgY29uc3QgdTE2IGludGVyY2VwdHMzXzJbXSA9CisJCXsgMCwgMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwIH07CisJY29uc3QgdTE2ICppcDsKKwl1bnNpZ25lZCBpOworCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18yKQorCQlpcCA9IGludGVyY2VwdHMzXzI7CisJZWxzZQorCQlpcCA9IGludGVyY2VwdHMzOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50ZXJjZXB0czMpOyBpKyspCisJCXZwW2ldID0gKGlwW2ldICogbWF4ICsgKDEwMCAtIGlwW2ldKSAqIG1pbikgLyAxMDA7Cit9CisKKy8qIENvbnZlcnQgUkY1MTExIHNwZWNpZmljIGRhdGEgdG8gZ2VuZXJpYyByYXcgZGF0YQorICogdXNlZCBieSBpbnRlcnBvbGF0aW9uIGNvZGUgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX2VlcHJvbV9jb252ZXJ0X3BjYWxfaW5mb181MTExKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBtb2RlLAorCQkJCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mbyAqY2hpbmZvKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mb19yZjUxMTEgKnBjaW5mbzsKKwlzdHJ1Y3QgYXRoNWtfcGRnYWluX2luZm8gKnBkOworCXU4IHBpZXIsIHBvaW50LCBpZHg7CisJdTggKnBkZ2Fpbl9pZHggPSBlZS0+ZWVfcGRjX3RvX2lkeFttb2RlXTsKKworCS8qIEZpbGwgcmF3IGRhdGEgZm9yIGVhY2ggY2FsaWJyYXRpb24gcGllciAqLworCWZvciAocGllciA9IDA7IHBpZXIgPCBlZS0+ZWVfbl9waWVyc1ttb2RlXTsgcGllcisrKSB7CisKKwkJcGNpbmZvID0gJmNoaW5mb1twaWVyXS5yZjUxMTFfaW5mbzsKKworCQkvKiBBbGxvY2F0ZSBwZF9jdXJ2ZXMgZm9yIHRoaXMgY2FsIHBpZXIgKi8KKwkJY2hpbmZvW3BpZXJdLnBkX2N1cnZlcyA9CisJCQljYWxsb2MoQVI1S19FRVBST01fTl9QRF9DVVJWRVMsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhdGg1a19wZGdhaW5faW5mbykpOworCisJCWlmICghY2hpbmZvW3BpZXJdLnBkX2N1cnZlcykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIE9ubHkgb25lIGN1cnZlIGZvciBSRjUxMTEKKwkJICogZmluZCBvdXQgd2hpY2ggb25lIGFuZCBwbGFjZQorCQkgKiBpbiBpbiBwZF9jdXJ2ZXMuCisJCSAqIE5vdGU6IGVlX3hfZ2FpbiBpcyByZXZlcnNlZCBoZXJlICovCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVI1S19FRVBST01fTl9QRF9DVVJWRVM7IGlkeCsrKSB7CisKKwkJCWlmICghKChlZS0+ZWVfeF9nYWluW21vZGVdID4+IGlkeCkgJiAweDEpKSB7CisJCQkJcGRnYWluX2lkeFswXSA9IGlkeDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWVlLT5lZV9wZF9nYWluc1ttb2RlXSA9IDE7CisKKwkJcGQgPSAmY2hpbmZvW3BpZXJdLnBkX2N1cnZlc1tpZHhdOworCisJCXBkLT5wZF9wb2ludHMgPSBBUjVLX0VFUFJPTV9OX1BXUl9QT0lOVFNfNTExMTsKKworCQkvKiBBbGxvY2F0ZSBwZCBwb2ludHMgZm9yIHRoaXMgY3VydmUgKi8KKwkJcGQtPnBkX3N0ZXAgPSBjYWxsb2MoQVI1S19FRVBST01fTl9QV1JfUE9JTlRTXzUxMTEsIHNpemVvZih1OCkpOworCQlpZiAoIXBkLT5wZF9zdGVwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcGQtPnBkX3B3ciA9IGNhbGxvYyhBUjVLX0VFUFJPTV9OX1BXUl9QT0lOVFNfNTExMSwgc2l6ZW9mKHMxNikpOworCQlpZiAoIXBkLT5wZF9wd3IpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBGaWxsIHJhdyBkYXRhc2V0CisJCSAqIChjb252ZXJ0IHBvd2VyIHRvIDAuMjVkQiB1bml0cworCQkgKiBmb3IgUkY1MTEyIGNvbWJhdGliaWxpdHkpICovCisJCWZvciAocG9pbnQgPSAwOyBwb2ludCA8IHBkLT5wZF9wb2ludHM7IHBvaW50KyspIHsKKworCQkJLyogQWJzb2x1dGUgdmFsdWVzICovCisJCQlwZC0+cGRfcHdyW3BvaW50XSA9IDIgKiBwY2luZm8tPnB3cltwb2ludF07CisKKwkJCS8qIEFscmVhZHkgc29ydGVkICovCisJCQlwZC0+cGRfc3RlcFtwb2ludF0gPSBwY2luZm8tPnBjZGFjW3BvaW50XTsKKwkJfQorCisJCS8qIFNldCBtaW4vbWF4IHB3ciAqLworCQljaGluZm9bcGllcl0ubWluX3B3ciA9IHBkLT5wZF9wd3JbMF07CisJCWNoaW5mb1twaWVyXS5tYXhfcHdyID0gcGQtPnBkX3B3clsxMF07CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUGFyc2UgRUVQUk9NIGRhdGEgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX2VlcHJvbV9yZWFkX3BjYWxfaW5mb181MTExKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBtb2RlKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mbyAqcGNhbDsKKwlpbnQgb2Zmc2V0LCByZXQ7CisJaW50IGk7CisJdTE2IHZhbDsKKworCW9mZnNldCA9IEFSNUtfRUVQUk9NX0dST1VQU19TVEFSVChlZS0+ZWVfdmVyc2lvbik7CisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFBOgorCQlpZiAoIUFSNUtfRUVQUk9NX0hEUl8xMUEoZWUtPmVlX2hlYWRlcikpCisJCQlyZXR1cm4gMDsKKworCQlyZXQgPSBhdGg1a19lZXByb21faW5pdF8xMWFfcGNhbF9mcmVxKGFoLAorCQkJb2Zmc2V0ICsgQVI1S19FRVBST01fR1JPVVAxX09GRlNFVCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlvZmZzZXQgKz0gQVI1S19FRVBST01fR1JPVVAyX09GRlNFVDsKKwkJcGNhbCA9IGVlLT5lZV9wd3JfY2FsX2E7CisJCWJyZWFrOworCWNhc2UgQVI1S19FRVBST01fTU9ERV8xMUI6CisJCWlmICghQVI1S19FRVBST01fSERSXzExQihlZS0+ZWVfaGVhZGVyKSAmJgorCQkgICAgIUFSNUtfRUVQUk9NX0hEUl8xMUcoZWUtPmVlX2hlYWRlcikpCisJCQlyZXR1cm4gMDsKKworCQlwY2FsID0gZWUtPmVlX3B3cl9jYWxfYjsKKwkJb2Zmc2V0ICs9IEFSNUtfRUVQUk9NX0dST1VQM19PRkZTRVQ7CisKKwkJLyogZml4ZWQgcGllcnMgKi8KKwkJcGNhbFswXS5mcmVxID0gMjQxMjsKKwkJcGNhbFsxXS5mcmVxID0gMjQ0NzsKKwkJcGNhbFsyXS5mcmVxID0gMjQ4NDsKKwkJZWUtPmVlX25fcGllcnNbbW9kZV0gPSAzOworCQlicmVhazsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFHOgorCQlpZiAoIUFSNUtfRUVQUk9NX0hEUl8xMUcoZWUtPmVlX2hlYWRlcikpCisJCQlyZXR1cm4gMDsKKworCQlwY2FsID0gZWUtPmVlX3B3cl9jYWxfZzsKKwkJb2Zmc2V0ICs9IEFSNUtfRUVQUk9NX0dST1VQNF9PRkZTRVQ7CisKKwkJLyogZml4ZWQgcGllcnMgKi8KKwkJcGNhbFswXS5mcmVxID0gMjMxMjsKKwkJcGNhbFsxXS5mcmVxID0gMjQxMjsKKwkJcGNhbFsyXS5mcmVxID0gMjQ4NDsKKwkJZWUtPmVlX25fcGllcnNbbW9kZV0gPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZWUtPmVlX25fcGllcnNbbW9kZV07IGkrKykgeworCQlzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm9fcmY1MTExICpjZGF0YSA9CisJCQkmcGNhbFtpXS5yZjUxMTFfaW5mbzsKKworCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQljZGF0YS0+cGNkYWNfbWF4ID0gKCh2YWwgPj4gMTApICYgQVI1S19FRVBST01fUENEQUNfTSk7CisJCWNkYXRhLT5wY2RhY19taW4gPSAoKHZhbCA+PiA0KSAmIEFSNUtfRUVQUk9NX1BDREFDX00pOworCQljZGF0YS0+cHdyWzBdID0gKCh2YWwgPDwgMikgJiBBUjVLX0VFUFJPTV9QT1dFUl9NKTsKKworCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQljZGF0YS0+cHdyWzBdIHw9ICgodmFsID4+IDE0KSAmIDB4Myk7CisJCWNkYXRhLT5wd3JbMV0gPSAoKHZhbCA+PiA4KSAmIEFSNUtfRUVQUk9NX1BPV0VSX00pOworCQljZGF0YS0+cHdyWzJdID0gKCh2YWwgPj4gMikgJiBBUjVLX0VFUFJPTV9QT1dFUl9NKTsKKwkJY2RhdGEtPnB3clszXSA9ICgodmFsIDw8IDQpICYgQVI1S19FRVBST01fUE9XRVJfTSk7CisKKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJY2RhdGEtPnB3clszXSB8PSAoKHZhbCA+PiAxMikgJiAweGYpOworCQljZGF0YS0+cHdyWzRdID0gKCh2YWwgPj4gNikgJiBBUjVLX0VFUFJPTV9QT1dFUl9NKTsKKwkJY2RhdGEtPnB3cls1XSA9ICh2YWwgICYgQVI1S19FRVBST01fUE9XRVJfTSk7CisKKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJY2RhdGEtPnB3cls2XSA9ICgodmFsID4+IDEwKSAmIEFSNUtfRUVQUk9NX1BPV0VSX00pOworCQljZGF0YS0+cHdyWzddID0gKCh2YWwgPj4gNCkgJiBBUjVLX0VFUFJPTV9QT1dFUl9NKTsKKwkJY2RhdGEtPnB3cls4XSA9ICgodmFsIDw8IDIpICYgQVI1S19FRVBST01fUE9XRVJfTSk7CisKKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJY2RhdGEtPnB3cls4XSB8PSAoKHZhbCA+PiAxNCkgJiAweDMpOworCQljZGF0YS0+cHdyWzldID0gKCh2YWwgPj4gOCkgJiBBUjVLX0VFUFJPTV9QT1dFUl9NKTsKKwkJY2RhdGEtPnB3clsxMF0gPSAoKHZhbCA+PiAyKSAmIEFSNUtfRUVQUk9NX1BPV0VSX00pOworCisJCWF0aDVrX2dldF9wY2RhY19pbnRlcmNlcHRzKGFoLCBjZGF0YS0+cGNkYWNfbWluLAorCQkJY2RhdGEtPnBjZGFjX21heCwgY2RhdGEtPnBjZGFjKTsKKwl9CisKKwlyZXR1cm4gYXRoNWtfZWVwcm9tX2NvbnZlcnRfcGNhbF9pbmZvXzUxMTEoYWgsIG1vZGUsIHBjYWwpOworfQorCisKKy8qCisgKiBSZWFkIHBvd2VyIGNhbGlicmF0aW9uIGZvciBSRjUxMTIgY2hpcHMKKyAqCisgKiBGb3IgUkY1MTEyIHdlIGhhdmUgNCBYUEQgLWVYdGVybmFsIFBvd2VyIERldGVjdG9yLSBjdXJ2ZXMKKyAqIGZvciBlYWNoIGNhbGlicmF0ZWQgY2hhbm5lbCBvbiAwLCAtNiwgLTEyIGFuZCAtMThkYm0gYnV0IHdlIG9ubHkKKyAqIHVzZSB0aGUgaGlnaGVyICgzKSBhbmQgdGhlIGxvd2VyICgwKSBjdXJ2ZXMuIEVhY2ggY3VydmUgaGFzIDAuNWRCCisgKiBwb3dlciBzdGVwcyBvbiB4IGF4aXMgYW5kIFBDREFDIHN0ZXBzIG9uIHkgYXhpcyBhbmQgbG9va3MgbGlrZSBhCisgKiBsaW5lYXIgZnVuY3Rpb24uIFRvIHJlY3JlYXRlIHRoZSBjdXJ2ZSBhbmQgcGFzcyB0aGUgcG93ZXIgdmFsdWVzCisgKiBvbiBodywgd2UgcmVhZCA0IHBvaW50cyBmb3IgeHBkIDAgKGxvd2VyIGdhaW4gLT4gbWF4IHBvd2VyKQorICogYW5kIDMgcG9pbnRzIGZvciB4cGQgMyAoaGlnaGVyIGdhaW4gLT4gbG93ZXIgcG93ZXIpIGhlcmUgYW5kCisgKiBpbnRlcnBvbGF0ZSBsYXRlci4KKyAqCisgKiBOb3RlOiBNYW55IHZlbmRvcnMganVzdCB1c2UgeHBkIDAgc28geHBkIDMgaXMgemVyb2VkLgorICovCisKKy8qIENvbnZlcnQgUkY1MTEyIHNwZWNpZmljIGRhdGEgdG8gZ2VuZXJpYyByYXcgZGF0YQorICogdXNlZCBieSBpbnRlcnBvbGF0aW9uIGNvZGUgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX2VlcHJvbV9jb252ZXJ0X3BjYWxfaW5mb181MTEyKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBtb2RlLAorCQkJCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mbyAqY2hpbmZvKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mb19yZjUxMTIgKnBjaW5mbzsKKwl1OCAqcGRnYWluX2lkeCA9IGVlLT5lZV9wZGNfdG9faWR4W21vZGVdOworCXVuc2lnbmVkIGludCBwaWVyLCBwZGcsIHBvaW50OworCisJLyogRmlsbCByYXcgZGF0YSBmb3IgZWFjaCBjYWxpYnJhdGlvbiBwaWVyICovCisJZm9yIChwaWVyID0gMDsgcGllciA8IGVlLT5lZV9uX3BpZXJzW21vZGVdOyBwaWVyKyspIHsKKworCQlwY2luZm8gPSAmY2hpbmZvW3BpZXJdLnJmNTExMl9pbmZvOworCisJCS8qIEFsbG9jYXRlIHBkX2N1cnZlcyBmb3IgdGhpcyBjYWwgcGllciAqLworCQljaGluZm9bcGllcl0ucGRfY3VydmVzID0KKwkJCQljYWxsb2MoQVI1S19FRVBST01fTl9QRF9DVVJWRVMsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYXRoNWtfcGRnYWluX2luZm8pKTsKKworCQlpZiAoIWNoaW5mb1twaWVyXS5wZF9jdXJ2ZXMpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBGaWxsIHBkX2N1cnZlcyAqLworCQlmb3IgKHBkZyA9IDA7IHBkZyA8IGVlLT5lZV9wZF9nYWluc1ttb2RlXTsgcGRnKyspIHsKKworCQkJdTggaWR4ID0gcGRnYWluX2lkeFtwZGddOworCQkJc3RydWN0IGF0aDVrX3BkZ2Fpbl9pbmZvICpwZCA9CisJCQkJCSZjaGluZm9bcGllcl0ucGRfY3VydmVzW2lkeF07CisKKwkJCS8qIExvd2VzdCBnYWluIGN1cnZlIChtYXggcG93ZXIpICovCisJCQlpZiAocGRnID09IDApIHsKKwkJCQkvKiBPbmUgbW9yZSBwb2ludCBmb3IgYmV0dGVyIGFjY3VyYWN5ICovCisJCQkJcGQtPnBkX3BvaW50cyA9IEFSNUtfRUVQUk9NX05fWFBEMF9QT0lOVFM7CisKKwkJCQkvKiBBbGxvY2F0ZSBwZCBwb2ludHMgZm9yIHRoaXMgY3VydmUgKi8KKwkJCQlwZC0+cGRfc3RlcCA9IGNhbGxvYyhwZC0+cGRfcG9pbnRzLCBzaXplb2YodTgpKTsKKworCQkJCWlmICghcGQtPnBkX3N0ZXApCisJCQkJCXJldHVybiAtRU5PTUVNOworCisJCQkJcGQtPnBkX3B3ciA9IGNhbGxvYyhwZC0+cGRfcG9pbnRzLCBzaXplb2YoczE2KSk7CisKKwkJCQlpZiAoIXBkLT5wZF9wd3IpCisJCQkJCXJldHVybiAtRU5PTUVNOworCisKKwkJCQkvKiBGaWxsIHJhdyBkYXRhc2V0CisJCQkJICogKGFsbCBwb3dlciBsZXZlbHMgYXJlIGluIDAuMjVkQiB1bml0cykgKi8KKwkJCQlwZC0+cGRfc3RlcFswXSA9IHBjaW5mby0+cGNkYWNfeDBbMF07CisJCQkJcGQtPnBkX3B3clswXSA9IHBjaW5mby0+cHdyX3gwWzBdOworCisJCQkJZm9yIChwb2ludCA9IDE7IHBvaW50IDwgcGQtPnBkX3BvaW50czsKKwkJCQlwb2ludCsrKSB7CisJCQkJCS8qIEFic29sdXRlIHZhbHVlcyAqLworCQkJCQlwZC0+cGRfcHdyW3BvaW50XSA9CisJCQkJCQlwY2luZm8tPnB3cl94MFtwb2ludF07CisKKwkJCQkJLyogRGVsdGFzICovCisJCQkJCXBkLT5wZF9zdGVwW3BvaW50XSA9CisJCQkJCQlwZC0+cGRfc3RlcFtwb2ludCAtIDFdICsKKwkJCQkJCXBjaW5mby0+cGNkYWNfeDBbcG9pbnRdOworCQkJCX0KKworCQkJCS8qIFNldCBtaW4gcG93ZXIgZm9yIHRoaXMgZnJlcXVlbmN5ICovCisJCQkJY2hpbmZvW3BpZXJdLm1pbl9wd3IgPSBwZC0+cGRfcHdyWzBdOworCisJCQkvKiBIaWdoZXN0IGdhaW4gY3VydmUgKG1pbiBwb3dlcikgKi8KKwkJCX0gZWxzZSBpZiAocGRnID09IDEpIHsKKworCQkJCXBkLT5wZF9wb2ludHMgPSBBUjVLX0VFUFJPTV9OX1hQRDNfUE9JTlRTOworCisJCQkJLyogQWxsb2NhdGUgcGQgcG9pbnRzIGZvciB0aGlzIGN1cnZlICovCisJCQkJcGQtPnBkX3N0ZXAgPSBjYWxsb2MocGQtPnBkX3BvaW50cywgc2l6ZW9mKHU4KSk7CisKKwkJCQlpZiAoIXBkLT5wZF9zdGVwKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJCXBkLT5wZF9wd3IgPSBjYWxsb2MocGQtPnBkX3BvaW50cywgc2l6ZW9mKHMxNikpOworCisJCQkJaWYgKCFwZC0+cGRfcHdyKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJCS8qIEZpbGwgcmF3IGRhdGFzZXQKKwkJCQkgKiAoYWxsIHBvd2VyIGxldmVscyBhcmUgaW4gMC4yNWRCIHVuaXRzKSAqLworCQkJCWZvciAocG9pbnQgPSAwOyBwb2ludCA8IHBkLT5wZF9wb2ludHM7CisJCQkJcG9pbnQrKykgeworCQkJCQkvKiBBYnNvbHV0ZSB2YWx1ZXMgKi8KKwkJCQkJcGQtPnBkX3B3cltwb2ludF0gPQorCQkJCQkJcGNpbmZvLT5wd3JfeDNbcG9pbnRdOworCisJCQkJCS8qIEZpeGVkIHBvaW50cyAqLworCQkJCQlwZC0+cGRfc3RlcFtwb2ludF0gPQorCQkJCQkJcGNpbmZvLT5wY2RhY194M1twb2ludF07CisJCQkJfQorCisJCQkJLyogU2luY2Ugd2UgaGF2ZSBhIGhpZ2hlciBnYWluIGN1cnZlCisJCQkJICogb3ZlcnJpZGUgbWluIHBvd2VyICovCisJCQkJY2hpbmZvW3BpZXJdLm1pbl9wd3IgPSBwZC0+cGRfcHdyWzBdOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFBhcnNlIEVFUFJPTSBkYXRhICovCitzdGF0aWMgaW50CithdGg1a19lZXByb21fcmVhZF9wY2FsX2luZm9fNTExMihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKKwlzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm9fcmY1MTEyICpjaGFuX3BjYWxfaW5mbzsKKwlzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8gKmdlbl9jaGFuX2luZm87CisJdTggKnBkZ2Fpbl9pZHggPSBlZS0+ZWVfcGRjX3RvX2lkeFttb2RlXTsKKwl1MzIgb2Zmc2V0OworCXU4IGksIGM7CisJdTE2IHZhbDsKKwlpbnQgcmV0OworCXU4IHBkX2dhaW5zID0gMDsKKworCS8qIENvdW50IGhvdyBtYW55IGN1cnZlcyB3ZSBoYXZlIGFuZAorCSAqIGlkZW50aWZ5IHRoZW0gKHdoaWNoIG9uZSBvZiB0aGUgNAorCSAqIGF2YWlsYWJsZSBjdXJ2ZXMgd2UgaGF2ZSBvbiBlYWNoIGNvdW50KS4KKwkgKiBDdXJ2ZXMgYXJlIHN0b3JlZCBmcm9tIGxvd2VyICh4MCkgdG8KKwkgKiBoaWdoZXIgKHgzKSBnYWluICovCisJZm9yIChpID0gMDsgaSA8IEFSNUtfRUVQUk9NX05fUERfQ1VSVkVTOyBpKyspIHsKKwkJLyogZWVfeF9nYWluW21vZGVdIGlzIHggZ2FpbiBtYXNrICovCisJCWlmICgoZWUtPmVlX3hfZ2Fpblttb2RlXSA+PiBpKSAmIDB4MSkKKwkJCXBkZ2Fpbl9pZHhbcGRfZ2FpbnMrK10gPSBpOworCX0KKwllZS0+ZWVfcGRfZ2FpbnNbbW9kZV0gPSBwZF9nYWluczsKKworCWlmIChwZF9nYWlucyA9PSAwIHx8IHBkX2dhaW5zID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFBOgorCQkvKgorCQkgKiBSZWFkIDVHSHogRUVQUk9NIGNoYW5uZWxzCisJCSAqLworCQlvZmZzZXQgPSBBUjVLX0VFUFJPTV9HUk9VUFNfU1RBUlQoZWUtPmVlX3ZlcnNpb24pOworCQlhdGg1a19lZXByb21faW5pdF8xMWFfcGNhbF9mcmVxKGFoLCBvZmZzZXQpOworCisJCW9mZnNldCArPSBBUjVLX0VFUFJPTV9HUk9VUDJfT0ZGU0VUOworCQlnZW5fY2hhbl9pbmZvID0gZWUtPmVlX3B3cl9jYWxfYTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQjoKKwkJb2Zmc2V0ID0gQVI1S19FRVBST01fR1JPVVBTX1NUQVJUKGVlLT5lZV92ZXJzaW9uKTsKKwkJaWYgKEFSNUtfRUVQUk9NX0hEUl8xMUEoZWUtPmVlX2hlYWRlcikpCisJCQlvZmZzZXQgKz0gQVI1S19FRVBST01fR1JPVVAzX09GRlNFVDsKKworCQkvKiBOQjogZnJlcXVlbmN5IHBpZXJzIHBhcnNlZCBkdXJpbmcgbW9kZSBpbml0ICovCisJCWdlbl9jaGFuX2luZm8gPSBlZS0+ZWVfcHdyX2NhbF9iOworCQlicmVhazsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFHOgorCQlvZmZzZXQgPSBBUjVLX0VFUFJPTV9HUk9VUFNfU1RBUlQoZWUtPmVlX3ZlcnNpb24pOworCQlpZiAoQVI1S19FRVBST01fSERSXzExQShlZS0+ZWVfaGVhZGVyKSkKKwkJCW9mZnNldCArPSBBUjVLX0VFUFJPTV9HUk9VUDRfT0ZGU0VUOworCQllbHNlIGlmIChBUjVLX0VFUFJPTV9IRFJfMTFCKGVlLT5lZV9oZWFkZXIpKQorCQkJb2Zmc2V0ICs9IEFSNUtfRUVQUk9NX0dST1VQMl9PRkZTRVQ7CisKKwkJLyogTkI6IGZyZXF1ZW5jeSBwaWVycyBwYXJzZWQgZHVyaW5nIG1vZGUgaW5pdCAqLworCQlnZW5fY2hhbl9pbmZvID0gZWUtPmVlX3B3cl9jYWxfZzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGVlLT5lZV9uX3BpZXJzW21vZGVdOyBpKyspIHsKKwkJY2hhbl9wY2FsX2luZm8gPSAmZ2VuX2NoYW5faW5mb1tpXS5yZjUxMTJfaW5mbzsKKworCQkvKiBQb3dlciB2YWx1ZXMgaW4gcXVhcnRlciBkQgorCQkgKiBmb3IgdGhlIGxvd2VyIHhwZCBnYWluIGN1cnZlCisJCSAqICgwIGRCbSAtPiBoaWdoZXIgb3V0cHV0IHBvd2VyKSAqLworCQlmb3IgKGMgPSAwOyBjIDwgQVI1S19FRVBST01fTl9YUEQwX1BPSU5UUzsgYysrKSB7CisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJY2hhbl9wY2FsX2luZm8tPnB3cl94MFtjXSA9IChzOCkgKHZhbCAmIDB4ZmYpOworCQkJY2hhbl9wY2FsX2luZm8tPnB3cl94MFsrK2NdID0gKHM4KSAoKHZhbCA+PiA4KSAmIDB4ZmYpOworCQl9CisKKwkJLyogUENEQUMgc3RlcHMKKwkJICogY29ycmVzcG9uZGluZyB0byB0aGUgYWJvdmUgcG93ZXIKKwkJICogbWVhc3VyZW1lbnRzICovCisJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCWNoYW5fcGNhbF9pbmZvLT5wY2RhY194MFsxXSA9ICh2YWwgJiAweDFmKTsKKwkJY2hhbl9wY2FsX2luZm8tPnBjZGFjX3gwWzJdID0gKCh2YWwgPj4gNSkgJiAweDFmKTsKKwkJY2hhbl9wY2FsX2luZm8tPnBjZGFjX3gwWzNdID0gKCh2YWwgPj4gMTApICYgMHgxZik7CisKKwkJLyogUG93ZXIgdmFsdWVzIGluIHF1YXJ0ZXIgZEIKKwkJICogZm9yIHRoZSBoaWdoZXIgeHBkIGdhaW4gY3VydmUKKwkJICogKDE4IGRCbSAtPiBsb3dlciBvdXRwdXQgcG93ZXIpICovCisJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCWNoYW5fcGNhbF9pbmZvLT5wd3JfeDNbMF0gPSAoczgpICh2YWwgJiAweGZmKTsKKwkJY2hhbl9wY2FsX2luZm8tPnB3cl94M1sxXSA9IChzOCkgKCh2YWwgPj4gOCkgJiAweGZmKTsKKworCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQljaGFuX3BjYWxfaW5mby0+cHdyX3gzWzJdID0gKHZhbCAmIDB4ZmYpOworCisJCS8qIFBDREFDIHN0ZXBzCisJCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFib3ZlIHBvd2VyCisJCSAqIG1lYXN1cmVtZW50cyAoZml4ZWQpICovCisJCWNoYW5fcGNhbF9pbmZvLT5wY2RhY194M1swXSA9IDIwOworCQljaGFuX3BjYWxfaW5mby0+cGNkYWNfeDNbMV0gPSAzNTsKKwkJY2hhbl9wY2FsX2luZm8tPnBjZGFjX3gzWzJdID0gNjM7CisKKwkJaWYgKGVlLT5lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8zKSB7CisJCQljaGFuX3BjYWxfaW5mby0+cGNkYWNfeDBbMF0gPSAoKHZhbCA+PiA4KSAmIDB4M2YpOworCisJCQkvKiBMYXN0IHhwZDAgcG93ZXIgbGV2ZWwgaXMgYWxzbyBjaGFubmVsIG1heGltdW0gKi8KKwkJCWdlbl9jaGFuX2luZm9baV0ubWF4X3B3ciA9IGNoYW5fcGNhbF9pbmZvLT5wd3JfeDBbM107CisJCX0gZWxzZSB7CisJCQljaGFuX3BjYWxfaW5mby0+cGNkYWNfeDBbMF0gPSAxOworCQkJZ2VuX2NoYW5faW5mb1tpXS5tYXhfcHdyID0gKHM4KSAoKHZhbCA+PiA4KSAmIDB4ZmYpOworCQl9CisKKwl9CisKKwlyZXR1cm4gYXRoNWtfZWVwcm9tX2NvbnZlcnRfcGNhbF9pbmZvXzUxMTIoYWgsIG1vZGUsIGdlbl9jaGFuX2luZm8pOworfQorCisKKy8qCisgKiBSZWFkIHBvd2VyIGNhbGlicmF0aW9uIGZvciBSRjI0MTMgY2hpcHMKKyAqCisgKiBGb3IgUkYyNDEzIHdlIGhhdmUgYSBQb3dlciB0byBQRERBQyB0YWJsZSAoUG93ZXIgRGV0ZWN0b3IpCisgKiBpbnN0ZWFkIG9mIGEgUENEQUMgYW5kIDQgcGQgZ2FpbiBjdXJ2ZXMgZm9yIGVhY2ggY2FsaWJyYXRlZCBjaGFubmVsLgorICogRWFjaCBjdXJ2ZSBoYXMgcG93ZXIgb24geCBheGlzIGluIDAuNSBkYiBzdGVwcyBhbmQgUEREQURDIHN0ZXBzIG9uIHkKKyAqIGF4aXMgYW5kIGxvb2tzIGxpa2UgYW4gZXhwb25lbnRpYWwgZnVuY3Rpb24gbGlrZSB0aGUgUkY1MTExIGN1cnZlLgorICoKKyAqIFRvIHJlY3JlYXRlIHRoZSBjdXJ2ZXMgd2UgcmVhZCBoZXJlIHRoZSBwb2ludHMgYW5kIGludGVycG9sYXRlCisgKiBsYXRlci4gTm90ZSB0aGF0IGluIG1vc3QgY2FzZXMgb25seSAyIChoaWdoZXIgYW5kIGxvd2VyKSBjdXJ2ZXMgYXJlCisgKiB1c2VkIChsaWtlIFJGNTExMikgYnV0IHZlbmRvcnMgaGF2ZSB0aGUgb3BvcnR1bml0eSB0byBpbmNsdWRlIGFsbAorICogNCBjdXJ2ZXMgb24gZWVwcm9tLiBUaGUgZmluYWwgY3VydmUgKGhpZ2hlciBwb3dlcikgaGFzIGFuIGV4dHJhCisgKiBwb2ludCBmb3IgYmV0dGVyIGFjY3VyYWN5IGxpa2UgUkY1MTEyLgorICovCisKKy8qIEZvciBSRjI0MTMgcG93ZXIgY2FsaWJyYXRpb24gZGF0YSBkb2Vzbid0IHN0YXJ0IG9uIGEgZml4ZWQgbG9jYXRpb24gYW5kCisgKiBpZiBhIG1vZGUgaXMgbm90IHN1cHBvcnRlZCwgaXQncyBzZWN0aW9uIGlzIG1pc3NpbmcgLW5vdCB6ZXJvZWQtLgorICogU28gd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHN0YXJ0aW5nIG9mZnNldCBmb3IgZWFjaCBzZWN0aW9uIGJ5IHVzaW5nCisgKiB0aGVzZSB0d28gZnVuY3Rpb25zICovCisKKy8qIFJldHVybiB0aGUgc2l6ZSBvZiBlYWNoIHNlY3Rpb24gYmFzZWQgb24gdGhlIG1vZGUgYW5kIHRoZSBudW1iZXIgb2YgcGQKKyAqIGdhaW5zIGF2YWlsYWJsZSAobWF4aW11bSA0KS4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CithdGg1a19wZGdhaW5zX3NpemVfMjQxMyhzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBkZ2FpbnNfc2l6ZVtdID0geyA0LCA2LCA5LCAxMiB9OworCXVuc2lnbmVkIGludCBzejsKKworCXN6ID0gcGRnYWluc19zaXplW2VlLT5lZV9wZF9nYWluc1ttb2RlXSAtIDFdOworCXN6ICo9IGVlLT5lZV9uX3BpZXJzW21vZGVdOworCisJcmV0dXJuIHN6OworfQorCisvKiBSZXR1cm4gdGhlIHN0YXJ0aW5nIG9mZnNldCBmb3IgYSBzZWN0aW9uIGJhc2VkIG9uIHRoZSBtb2RlcyBzdXBwb3J0ZWQKKyAqIGFuZCBlYWNoIHNlY3Rpb24ncyBzaXplLiAqLworc3RhdGljIHVuc2lnbmVkIGludAorYXRoNWtfY2FsX2RhdGFfb2Zmc2V0XzI0MTMoc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSwgaW50IG1vZGUpCit7CisJdTMyIG9mZnNldCA9IEFSNUtfRUVQUk9NX0NBTF9EQVRBX1NUQVJUKGVlLT5lZV9taXNjNCk7CisKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgQVI1S19FRVBST01fTU9ERV8xMUc6CisJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFCKGVlLT5lZV9oZWFkZXIpKQorCQkJb2Zmc2V0ICs9IGF0aDVrX3BkZ2FpbnNfc2l6ZV8yNDEzKGVlLAorCQkJCQlBUjVLX0VFUFJPTV9NT0RFXzExQikgKworCQkJCQlBUjVLX0VFUFJPTV9OXzJHSFpfQ0hBTl8yNDEzIC8gMjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQjoKKwkJaWYgKEFSNUtfRUVQUk9NX0hEUl8xMUEoZWUtPmVlX2hlYWRlcikpCisJCQlvZmZzZXQgKz0gYXRoNWtfcGRnYWluc19zaXplXzI0MTMoZWUsCisJCQkJCUFSNUtfRUVQUk9NX01PREVfMTFBKSArCisJCQkJCUFSNUtfRUVQUk9NX05fNUdIWl9DSEFOIC8gMjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogQ29udmVydCBSRjI0MTMgc3BlY2lmaWMgZGF0YSB0byBnZW5lcmljIHJhdyBkYXRhCisgKiB1c2VkIGJ5IGludGVycG9sYXRpb24gY29kZSAqLworc3RhdGljIGludAorYXRoNWtfZWVwcm9tX2NvbnZlcnRfcGNhbF9pbmZvXzI0MTMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IG1vZGUsCisJCQkJc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvICpjaGluZm8pCit7CisJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CisJc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvX3JmMjQxMyAqcGNpbmZvOworCXU4ICpwZGdhaW5faWR4ID0gZWUtPmVlX3BkY190b19pZHhbbW9kZV07CisJdW5zaWduZWQgaW50IHBpZXIsIHBvaW50OworCWludCBwZGc7CisKKwkvKiBGaWxsIHJhdyBkYXRhIGZvciBlYWNoIGNhbGlicmF0aW9uIHBpZXIgKi8KKwlmb3IgKHBpZXIgPSAwOyBwaWVyIDwgZWUtPmVlX25fcGllcnNbbW9kZV07IHBpZXIrKykgeworCisJCXBjaW5mbyA9ICZjaGluZm9bcGllcl0ucmYyNDEzX2luZm87CisKKwkJLyogQWxsb2NhdGUgcGRfY3VydmVzIGZvciB0aGlzIGNhbCBwaWVyICovCisJCWNoaW5mb1twaWVyXS5wZF9jdXJ2ZXMgPQorCQkJCWNhbGxvYyhBUjVLX0VFUFJPTV9OX1BEX0NVUlZFUywKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhdGg1a19wZGdhaW5faW5mbykpOworCisJCWlmICghY2hpbmZvW3BpZXJdLnBkX2N1cnZlcykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIEZpbGwgcGRfY3VydmVzICovCisJCWZvciAocGRnID0gMDsgcGRnIDwgZWUtPmVlX3BkX2dhaW5zW21vZGVdOyBwZGcrKykgeworCisJCQl1OCBpZHggPSBwZGdhaW5faWR4W3BkZ107CisJCQlzdHJ1Y3QgYXRoNWtfcGRnYWluX2luZm8gKnBkID0KKwkJCQkJJmNoaW5mb1twaWVyXS5wZF9jdXJ2ZXNbaWR4XTsKKworCQkJLyogT25lIG1vcmUgcG9pbnQgZm9yIHRoZSBoaWdoZXN0IHBvd2VyCisJCQkgKiBjdXJ2ZSAobG93ZXN0IGdhaW4pICovCisJCQlpZiAocGRnID09IGVlLT5lZV9wZF9nYWluc1ttb2RlXSAtIDEpCisJCQkJcGQtPnBkX3BvaW50cyA9IEFSNUtfRUVQUk9NX05fUERfUE9JTlRTOworCQkJZWxzZQorCQkJCXBkLT5wZF9wb2ludHMgPSBBUjVLX0VFUFJPTV9OX1BEX1BPSU5UUyAtIDE7CisKKwkJCS8qIEFsbG9jYXRlIHBkIHBvaW50cyBmb3IgdGhpcyBjdXJ2ZSAqLworCQkJcGQtPnBkX3N0ZXAgPSBjYWxsb2MocGQtPnBkX3BvaW50cywgc2l6ZW9mKHU4KSk7CisKKwkJCWlmICghcGQtPnBkX3N0ZXApCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCXBkLT5wZF9wd3IgPSBjYWxsb2MocGQtPnBkX3BvaW50cywgc2l6ZW9mKHMxNikpOworCisJCQlpZiAoIXBkLT5wZF9wd3IpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCS8qIEZpbGwgcmF3IGRhdGFzZXQKKwkJCSAqIGNvbnZlcnQgYWxsIHB3ciBsZXZlbHMgdG8KKwkJCSAqIHF1YXJ0ZXIgZEIgZm9yIFJGNTExMiBjb21iYXRpYmlsaXR5ICovCisJCQlwZC0+cGRfc3RlcFswXSA9IHBjaW5mby0+cGRkYWNfaVtwZGddOworCQkJcGQtPnBkX3B3clswXSA9IDQgKiBwY2luZm8tPnB3cl9pW3BkZ107CisKKwkJCWZvciAocG9pbnQgPSAxOyBwb2ludCA8IHBkLT5wZF9wb2ludHM7IHBvaW50KyspIHsKKworCQkJCXBkLT5wZF9wd3JbcG9pbnRdID0gcGQtPnBkX3B3cltwb2ludCAtIDFdICsKKwkJCQkJMiAqIHBjaW5mby0+cHdyW3BkZ11bcG9pbnQgLSAxXTsKKworCQkJCXBkLT5wZF9zdGVwW3BvaW50XSA9IHBkLT5wZF9zdGVwW3BvaW50IC0gMV0gKworCQkJCQkJcGNpbmZvLT5wZGRhY1twZGddW3BvaW50IC0gMV07CisKKwkJCX0KKworCQkJLyogSGlnaGVzdCBnYWluIGN1cnZlIC0+IG1pbiBwb3dlciAqLworCQkJaWYgKHBkZyA9PSAwKQorCQkJCWNoaW5mb1twaWVyXS5taW5fcHdyID0gcGQtPnBkX3B3clswXTsKKworCQkJLyogTG93ZXN0IGdhaW4gY3VydmUgLT4gbWF4IHBvd2VyICovCisJCQlpZiAocGRnID09IGVlLT5lZV9wZF9nYWluc1ttb2RlXSAtIDEpCisJCQkJY2hpbmZvW3BpZXJdLm1heF9wd3IgPQorCQkJCQlwZC0+cGRfcHdyW3BkLT5wZF9wb2ludHMgLSAxXTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBQYXJzZSBFRVBST00gZGF0YSAqLworc3RhdGljIGludAorYXRoNWtfZWVwcm9tX3JlYWRfcGNhbF9pbmZvXzI0MTMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IG1vZGUpCit7CisJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CisJc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvX3JmMjQxMyAqcGNpbmZvOworCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mbyAqY2hpbmZvOworCXU4ICpwZGdhaW5faWR4ID0gZWUtPmVlX3BkY190b19pZHhbbW9kZV07CisJdTMyIG9mZnNldDsKKwlpbnQgaWR4LCBpLCByZXQ7CisJdTE2IHZhbDsKKwl1OCBwZF9nYWlucyA9IDA7CisKKwkvKiBDb3VudCBob3cgbWFueSBjdXJ2ZXMgd2UgaGF2ZSBhbmQKKwkgKiBpZGVudGlmeSB0aGVtICh3aGljaCBvbmUgb2YgdGhlIDQKKwkgKiBhdmFpbGFibGUgY3VydmVzIHdlIGhhdmUgb24gZWFjaCBjb3VudCkuCisJICogQ3VydmVzIGFyZSBzdG9yZWQgZnJvbSBoaWdoZXIgdG8KKwkgKiBsb3dlciBnYWluIHNvIHdlIGdvIGJhY2t3YXJkcyAqLworCWZvciAoaWR4ID0gQVI1S19FRVBST01fTl9QRF9DVVJWRVMgLSAxOyBpZHggPj0gMDsgaWR4LS0pIHsKKwkJLyogZWVfeF9nYWluW21vZGVdIGlzIHggZ2FpbiBtYXNrICovCisJCWlmICgoZWUtPmVlX3hfZ2Fpblttb2RlXSA+PiBpZHgpICYgMHgxKQorCQkJcGRnYWluX2lkeFtwZF9nYWlucysrXSA9IGlkeDsKKworCX0KKwllZS0+ZWVfcGRfZ2FpbnNbbW9kZV0gPSBwZF9nYWluczsKKworCWlmIChwZF9nYWlucyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZnNldCA9IGF0aDVrX2NhbF9kYXRhX29mZnNldF8yNDEzKGVlLCBtb2RlKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFBOgorCQlpZiAoIUFSNUtfRUVQUk9NX0hEUl8xMUEoZWUtPmVlX2hlYWRlcikpCisJCQlyZXR1cm4gMDsKKworCQlhdGg1a19lZXByb21faW5pdF8xMWFfcGNhbF9mcmVxKGFoLCBvZmZzZXQpOworCQlvZmZzZXQgKz0gQVI1S19FRVBST01fTl81R0haX0NIQU4gLyAyOworCQljaGluZm8gPSBlZS0+ZWVfcHdyX2NhbF9hOworCQlicmVhazsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFCOgorCQlpZiAoIUFSNUtfRUVQUk9NX0hEUl8xMUIoZWUtPmVlX2hlYWRlcikpCisJCQlyZXR1cm4gMDsKKworCQlhdGg1a19lZXByb21faW5pdF8xMWJnXzI0MTMoYWgsIG1vZGUsIG9mZnNldCk7CisJCW9mZnNldCArPSBBUjVLX0VFUFJPTV9OXzJHSFpfQ0hBTl8yNDEzIC8gMjsKKwkJY2hpbmZvID0gZWUtPmVlX3B3cl9jYWxfYjsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExRzoKKwkJaWYgKCFBUjVLX0VFUFJPTV9IRFJfMTFHKGVlLT5lZV9oZWFkZXIpKQorCQkJcmV0dXJuIDA7CisKKwkJYXRoNWtfZWVwcm9tX2luaXRfMTFiZ18yNDEzKGFoLCBtb2RlLCBvZmZzZXQpOworCQlvZmZzZXQgKz0gQVI1S19FRVBST01fTl8yR0haX0NIQU5fMjQxMyAvIDI7CisJCWNoaW5mbyA9IGVlLT5lZV9wd3JfY2FsX2c7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlZS0+ZWVfbl9waWVyc1ttb2RlXTsgaSsrKSB7CisJCXBjaW5mbyA9ICZjaGluZm9baV0ucmYyNDEzX2luZm87CisKKwkJLyoKKwkJICogUmVhZCBwd3JfaSwgcGRkYWNfaSBhbmQgdGhlIGZpcnN0CisJCSAqIDIgcGQgcG9pbnRzIChwd3IsIHBkZGFjKQorCQkgKi8KKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJcGNpbmZvLT5wd3JfaVswXSA9IHZhbCAmIDB4MWY7CisJCXBjaW5mby0+cGRkYWNfaVswXSA9ICh2YWwgPj4gNSkgJiAweDdmOworCQlwY2luZm8tPnB3clswXVswXSA9ICh2YWwgPj4gMTIpICYgMHhmOworCisJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCXBjaW5mby0+cGRkYWNbMF1bMF0gPSB2YWwgJiAweDNmOworCQlwY2luZm8tPnB3clswXVsxXSA9ICh2YWwgPj4gNikgJiAweGY7CisJCXBjaW5mby0+cGRkYWNbMF1bMV0gPSAodmFsID4+IDEwKSAmIDB4M2Y7CisKKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJcGNpbmZvLT5wd3JbMF1bMl0gPSB2YWwgJiAweGY7CisJCXBjaW5mby0+cGRkYWNbMF1bMl0gPSAodmFsID4+IDQpICYgMHgzZjsKKworCQlwY2luZm8tPnB3clswXVszXSA9IDA7CisJCXBjaW5mby0+cGRkYWNbMF1bM10gPSAwOworCisJCWlmIChwZF9nYWlucyA+IDEpIHsKKwkJCS8qCisJCQkgKiBQZCBnYWluIDAgaXMgbm90IHRoZSBsYXN0IHBkIGdhaW4KKwkJCSAqIHNvIGl0IG9ubHkgaGFzIDIgcGQgcG9pbnRzLgorCQkJICogQ29udGludWUgd2loIHBkIGdhaW4gMS4KKwkJCSAqLworCQkJcGNpbmZvLT5wd3JfaVsxXSA9ICh2YWwgPj4gMTApICYgMHgxZjsKKworCQkJcGNpbmZvLT5wZGRhY19pWzFdID0gKHZhbCA+PiAxNSkgJiAweDE7CisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJcGNpbmZvLT5wZGRhY19pWzFdIHw9ICh2YWwgJiAweDNGKSA8PCAxOworCisJCQlwY2luZm8tPnB3clsxXVswXSA9ICh2YWwgPj4gNikgJiAweGY7CisJCQlwY2luZm8tPnBkZGFjWzFdWzBdID0gKHZhbCA+PiAxMCkgJiAweDNmOworCisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJcGNpbmZvLT5wd3JbMV1bMV0gPSB2YWwgJiAweGY7CisJCQlwY2luZm8tPnBkZGFjWzFdWzFdID0gKHZhbCA+PiA0KSAmIDB4M2Y7CisJCQlwY2luZm8tPnB3clsxXVsyXSA9ICh2YWwgPj4gMTApICYgMHhmOworCisJCQlwY2luZm8tPnBkZGFjWzFdWzJdID0gKHZhbCA+PiAxNCkgJiAweDM7CisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJcGNpbmZvLT5wZGRhY1sxXVsyXSB8PSAodmFsICYgMHhGKSA8PCAyOworCisJCQlwY2luZm8tPnB3clsxXVszXSA9IDA7CisJCQlwY2luZm8tPnBkZGFjWzFdWzNdID0gMDsKKwkJfSBlbHNlIGlmIChwZF9nYWlucyA9PSAxKSB7CisJCQkvKgorCQkJICogUGQgZ2FpbiAwIGlzIHRoZSBsYXN0IG9uZSBzbworCQkJICogcmVhZCB0aGUgZXh0cmEgcG9pbnQuCisJCQkgKi8KKwkJCXBjaW5mby0+cHdyWzBdWzNdID0gKHZhbCA+PiAxMCkgJiAweGY7CisKKwkJCXBjaW5mby0+cGRkYWNbMF1bM10gPSAodmFsID4+IDE0KSAmIDB4MzsKKwkJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCQlwY2luZm8tPnBkZGFjWzBdWzNdIHw9ICh2YWwgJiAweEYpIDw8IDI7CisJCX0KKworCQkvKgorCQkgKiBQcm9jZWVkIHdpdGggdGhlIG90aGVyIHBkX2dhaW5zCisJCSAqIGFzIGFib3ZlLgorCQkgKi8KKwkJaWYgKHBkX2dhaW5zID4gMikgeworCQkJcGNpbmZvLT5wd3JfaVsyXSA9ICh2YWwgPj4gNCkgJiAweDFmOworCQkJcGNpbmZvLT5wZGRhY19pWzJdID0gKHZhbCA+PiA5KSAmIDB4N2Y7CisKKwkJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCQlwY2luZm8tPnB3clsyXVswXSA9ICh2YWwgPj4gMCkgJiAweGY7CisJCQlwY2luZm8tPnBkZGFjWzJdWzBdID0gKHZhbCA+PiA0KSAmIDB4M2Y7CisJCQlwY2luZm8tPnB3clsyXVsxXSA9ICh2YWwgPj4gMTApICYgMHhmOworCisJCQlwY2luZm8tPnBkZGFjWzJdWzFdID0gKHZhbCA+PiAxNCkgJiAweDM7CisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJcGNpbmZvLT5wZGRhY1syXVsxXSB8PSAodmFsICYgMHhGKSA8PCAyOworCisJCQlwY2luZm8tPnB3clsyXVsyXSA9ICh2YWwgPj4gNCkgJiAweGY7CisJCQlwY2luZm8tPnBkZGFjWzJdWzJdID0gKHZhbCA+PiA4KSAmIDB4M2Y7CisKKwkJCXBjaW5mby0+cHdyWzJdWzNdID0gMDsKKwkJCXBjaW5mby0+cGRkYWNbMl1bM10gPSAwOworCQl9IGVsc2UgaWYgKHBkX2dhaW5zID09IDIpIHsKKwkJCXBjaW5mby0+cHdyWzFdWzNdID0gKHZhbCA+PiA0KSAmIDB4ZjsKKwkJCXBjaW5mby0+cGRkYWNbMV1bM10gPSAodmFsID4+IDgpICYgMHgzZjsKKwkJfQorCisJCWlmIChwZF9nYWlucyA+IDMpIHsKKwkJCXBjaW5mby0+cHdyX2lbM10gPSAodmFsID4+IDE0KSAmIDB4MzsKKwkJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCQlwY2luZm8tPnB3cl9pWzNdIHw9ICgodmFsID4+IDApICYgMHg3KSA8PCAyOworCisJCQlwY2luZm8tPnBkZGFjX2lbM10gPSAodmFsID4+IDMpICYgMHg3ZjsKKwkJCXBjaW5mby0+cHdyWzNdWzBdID0gKHZhbCA+PiAxMCkgJiAweGY7CisJCQlwY2luZm8tPnBkZGFjWzNdWzBdID0gKHZhbCA+PiAxNCkgJiAweDM7CisKKwkJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCQlwY2luZm8tPnBkZGFjWzNdWzBdIHw9ICh2YWwgJiAweEYpIDw8IDI7CisJCQlwY2luZm8tPnB3clszXVsxXSA9ICh2YWwgPj4gNCkgJiAweGY7CisJCQlwY2luZm8tPnBkZGFjWzNdWzFdID0gKHZhbCA+PiA4KSAmIDB4M2Y7CisKKwkJCXBjaW5mby0+cHdyWzNdWzJdID0gKHZhbCA+PiAxNCkgJiAweDM7CisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJcGNpbmZvLT5wd3JbM11bMl0gfD0gKCh2YWwgPj4gMCkgJiAweDMpIDw8IDI7CisKKwkJCXBjaW5mby0+cGRkYWNbM11bMl0gPSAodmFsID4+IDIpICYgMHgzZjsKKwkJCXBjaW5mby0+cHdyWzNdWzNdID0gKHZhbCA+PiA4KSAmIDB4ZjsKKworCQkJcGNpbmZvLT5wZGRhY1szXVszXSA9ICh2YWwgPj4gMTIpICYgMHhGOworCQkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJCXBjaW5mby0+cGRkYWNbM11bM10gfD0gKCh2YWwgPj4gMCkgJiAweDMpIDw8IDQ7CisJCX0gZWxzZSBpZiAocGRfZ2FpbnMgPT0gMykgeworCQkJcGNpbmZvLT5wd3JbMl1bM10gPSAodmFsID4+IDE0KSAmIDB4MzsKKwkJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCQlwY2luZm8tPnB3clsyXVszXSB8PSAoKHZhbCA+PiAwKSAmIDB4MykgPDwgMjsKKworCQkJcGNpbmZvLT5wZGRhY1syXVszXSA9ICh2YWwgPj4gMikgJiAweDNmOworCQl9CisJfQorCisJcmV0dXJuIGF0aDVrX2VlcHJvbV9jb252ZXJ0X3BjYWxfaW5mb18yNDEzKGFoLCBtb2RlLCBjaGluZm8pOworfQorCisKKy8qCisgKiBSZWFkIHBlciByYXRlIHRhcmdldCBwb3dlciAodGhpcyBpcyB0aGUgbWF4aW11bSB0eCBwb3dlcgorICogc3VwcG9ydGVkIGJ5IHRoZSBjYXJkKS4gVGhpcyBpbmZvIGlzIHVzZWQgd2hlbiBzZXR0aW5nCisgKiB0eCBwb3dlciwgbm8gbWF0dGVyIHRoZSBjaGFubmVsLgorICoKKyAqIFRoaXMgYWxzbyB3b3JrcyBmb3IgdjUgRUVQUk9Ncy4KKyAqLworc3RhdGljIGludAorYXRoNWtfZWVwcm9tX3JlYWRfdGFyZ2V0X3JhdGVfcHdyX2luZm8oc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CisJc3RydWN0IGF0aDVrX3JhdGVfcGNhbF9pbmZvICpyYXRlX3BjYWxfaW5mbzsKKwl1OCAqcmF0ZV90YXJnZXRfcHdyX251bTsKKwl1MzIgb2Zmc2V0OworCXUxNiB2YWw7CisJaW50IHJldCwgaTsKKworCW9mZnNldCA9IEFSNUtfRUVQUk9NX1RBUkdFVF9QV1JTVEFSVChlZS0+ZWVfbWlzYzEpOworCXJhdGVfdGFyZ2V0X3B3cl9udW0gPSAmZWUtPmVlX3JhdGVfdGFyZ2V0X3B3cl9udW1bbW9kZV07CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQToKKwkJb2Zmc2V0ICs9IEFSNUtfRUVQUk9NX1RBUkdFVF9QV1JfT0ZGXzExQShlZS0+ZWVfdmVyc2lvbik7CisJCXJhdGVfcGNhbF9pbmZvID0gZWUtPmVlX3JhdGVfdHB3cl9hOworCQllZS0+ZWVfcmF0ZV90YXJnZXRfcHdyX251bVttb2RlXSA9IEFSNUtfRUVQUk9NX05fNUdIWl9DSEFOOworCQlicmVhazsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFCOgorCQlvZmZzZXQgKz0gQVI1S19FRVBST01fVEFSR0VUX1BXUl9PRkZfMTFCKGVlLT5lZV92ZXJzaW9uKTsKKwkJcmF0ZV9wY2FsX2luZm8gPSBlZS0+ZWVfcmF0ZV90cHdyX2I7CisJCWVlLT5lZV9yYXRlX3RhcmdldF9wd3JfbnVtW21vZGVdID0gMjsgLyogM3JkIGlzIGcgbW9kZSdzIDFzdCAqLworCQlicmVhazsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFHOgorCQlvZmZzZXQgKz0gQVI1S19FRVBST01fVEFSR0VUX1BXUl9PRkZfMTFHKGVlLT5lZV92ZXJzaW9uKTsKKwkJcmF0ZV9wY2FsX2luZm8gPSBlZS0+ZWVfcmF0ZV90cHdyX2c7CisJCWVlLT5lZV9yYXRlX3RhcmdldF9wd3JfbnVtW21vZGVdID0gQVI1S19FRVBST01fTl8yR0haX0NIQU47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIERpZmZlcmVudCBmcmVxIG1hc2sgZm9yIG9sZGVyIGVlcHJvbXMgKDw9IHYzLjIpICovCisJaWYgKGVlLT5lZV92ZXJzaW9uIDw9IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18yKSB7CisJCWZvciAoaSA9IDA7IGkgPCAoKnJhdGVfdGFyZ2V0X3B3cl9udW0pOyBpKyspIHsKKwkJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCQlyYXRlX3BjYWxfaW5mb1tpXS5mcmVxID0KKwkJCSAgICBhdGg1a19lZXByb21fYmluMmZyZXEoZWUsICh2YWwgPj4gOSkgJiAweDdmLCBtb2RlKTsKKworCQkJcmF0ZV9wY2FsX2luZm9baV0udGFyZ2V0X3Bvd2VyXzZ0bzI0ID0gKCh2YWwgPj4gMykgJiAweDNmKTsKKwkJCXJhdGVfcGNhbF9pbmZvW2ldLnRhcmdldF9wb3dlcl8zNiA9ICh2YWwgPDwgMykgJiAweDNmOworCisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCisJCQlpZiAocmF0ZV9wY2FsX2luZm9baV0uZnJlcSA9PSBBUjVLX0VFUFJPTV9DSEFOTkVMX0RJUyB8fAorCQkJICAgIHZhbCA9PSAwKSB7CisJCQkJKCpyYXRlX3RhcmdldF9wd3JfbnVtKSA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJhdGVfcGNhbF9pbmZvW2ldLnRhcmdldF9wb3dlcl8zNiB8PSAoKHZhbCA+PiAxMykgJiAweDcpOworCQkJcmF0ZV9wY2FsX2luZm9baV0udGFyZ2V0X3Bvd2VyXzQ4ID0gKCh2YWwgPj4gNykgJiAweDNmKTsKKwkJCXJhdGVfcGNhbF9pbmZvW2ldLnRhcmdldF9wb3dlcl81NCA9ICgodmFsID4+IDEpICYgMHgzZik7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgKCpyYXRlX3RhcmdldF9wd3JfbnVtKTsgaSsrKSB7CisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJcmF0ZV9wY2FsX2luZm9baV0uZnJlcSA9CisJCQkgICAgYXRoNWtfZWVwcm9tX2JpbjJmcmVxKGVlLCAodmFsID4+IDgpICYgMHhmZiwgbW9kZSk7CisKKwkJCXJhdGVfcGNhbF9pbmZvW2ldLnRhcmdldF9wb3dlcl82dG8yNCA9ICgodmFsID4+IDIpICYgMHgzZik7CisJCQlyYXRlX3BjYWxfaW5mb1tpXS50YXJnZXRfcG93ZXJfMzYgPSAodmFsIDw8IDQpICYgMHgzZjsKKworCQkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKworCQkJaWYgKHJhdGVfcGNhbF9pbmZvW2ldLmZyZXEgPT0gQVI1S19FRVBST01fQ0hBTk5FTF9ESVMgfHwKKwkJCSAgICB2YWwgPT0gMCkgeworCQkJCSgqcmF0ZV90YXJnZXRfcHdyX251bSkgPSBpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlyYXRlX3BjYWxfaW5mb1tpXS50YXJnZXRfcG93ZXJfMzYgfD0gKHZhbCA+PiAxMikgJiAweGY7CisJCQlyYXRlX3BjYWxfaW5mb1tpXS50YXJnZXRfcG93ZXJfNDggPSAoKHZhbCA+PiA2KSAmIDB4M2YpOworCQkJcmF0ZV9wY2FsX2luZm9baV0udGFyZ2V0X3Bvd2VyXzU0ID0gKHZhbCAmIDB4M2YpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHBlciBjaGFubmVsIGNhbGlicmF0aW9uIGluZm8gZnJvbSBFRVBST00KKyAqCisgKiBUaGlzIGluZm8gaXMgdXNlZCB0byBjYWxpYnJhdGUgdGhlIGJhc2ViYW5kIHBvd2VyIHRhYmxlLiBJbWFnaW5lCisgKiB0aGF0IGZvciBlYWNoIGNoYW5uZWwgdGhlcmUgaXMgYSBwb3dlciBjdXJ2ZSB0aGF0J3MgaHcgc3BlY2lmaWMKKyAqIChkZXBlbmRzIG9uIGFtcGxpZmllciBldGMpIGFuZCB3ZSB0cnkgdG8gImNvcnJlY3QiIHRoaXMgY3VydmUgdXNpbmcKKyAqIG9mZmVzdHMgd2UgcGFzcyBvbiB0byBwaHkgY2hpcCAoYmFzZWJhbmQgLT4gYmVmb3JlIGFtcGxpZmllcikgc28gdGhhdAorICogaXQgY2FuIHVzZSBhY2N1cmF0ZSBwb3dlciB2YWx1ZXMgd2hlbiBzZXR0aW5nIHR4IHBvd2VyICh0YWtlcyBhbXBsaWZpZXIncworICogcGVyZm9ybWFuY2Ugb24gZWFjaCBjaGFubmVsIGludG8gYWNjb3VudCkuCisgKgorICogRUVQUk9NIHByb3ZpZGVzIHVzIHdpdGggdGhlIG9mZnNldHMgZm9yIHNvbWUgcHJlLWNhbGlicmF0ZWQgY2hhbm5lbHMKKyAqIGFuZCB3ZSBoYXZlIHRvIGludGVycG9sYXRlIHRvIGNyZWF0ZSB0aGUgZnVsbCB0YWJsZSBmb3IgdGhlc2UgY2hhbm5lbHMgYW5kCisgKiBhbHNvIHRoZSB0YWJsZSBmb3IgYW55IGNoYW5uZWwuCisgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX2VlcHJvbV9yZWFkX3BjYWxfaW5mbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCWludCAoKnJlYWRfcGNhbCkoc3RydWN0IGF0aDVrX2h3ICpodywgaW50IG1vZGUpOworCWludCBtb2RlOworCWludCBlcnI7CisKKwlpZiAoKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8wKSAmJgorCQkJKEFSNUtfRUVQUk9NX0VFTUFQKGVlLT5lZV9taXNjMCkgPT0gMSkpCisJCXJlYWRfcGNhbCA9IGF0aDVrX2VlcHJvbV9yZWFkX3BjYWxfaW5mb181MTEyOworCWVsc2UgaWYgKChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzVfMCkgJiYKKwkJCShBUjVLX0VFUFJPTV9FRU1BUChlZS0+ZWVfbWlzYzApID09IDIpKQorCQlyZWFkX3BjYWwgPSBhdGg1a19lZXByb21fcmVhZF9wY2FsX2luZm9fMjQxMzsKKwllbHNlCisJCXJlYWRfcGNhbCA9IGF0aDVrX2VlcHJvbV9yZWFkX3BjYWxfaW5mb181MTExOworCisKKwlmb3IgKG1vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsgbW9kZSA8PSBBUjVLX0VFUFJPTV9NT0RFXzExRzsKKwltb2RlKyspIHsKKwkJZXJyID0gcmVhZF9wY2FsKGFoLCBtb2RlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZXJyID0gYXRoNWtfZWVwcm9tX3JlYWRfdGFyZ2V0X3JhdGVfcHdyX2luZm8oYWgsIG1vZGUpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2F0aDVrX2VlcHJvbV9mcmVlX3BjYWxfaW5mbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKKwlzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8gKmNoaW5mbzsKKwl1OCBwaWVyLCBwZGc7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFBOgorCQlpZiAoIUFSNUtfRUVQUk9NX0hEUl8xMUEoZWUtPmVlX2hlYWRlcikpCisJCQlyZXR1cm4gMDsKKwkJY2hpbmZvID0gZWUtPmVlX3B3cl9jYWxfYTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQjoKKwkJaWYgKCFBUjVLX0VFUFJPTV9IRFJfMTFCKGVlLT5lZV9oZWFkZXIpKQorCQkJcmV0dXJuIDA7CisJCWNoaW5mbyA9IGVlLT5lZV9wd3JfY2FsX2I7CisJCWJyZWFrOworCWNhc2UgQVI1S19FRVBST01fTU9ERV8xMUc6CisJCWlmICghQVI1S19FRVBST01fSERSXzExRyhlZS0+ZWVfaGVhZGVyKSkKKwkJCXJldHVybiAwOworCQljaGluZm8gPSBlZS0+ZWVfcHdyX2NhbF9nOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKHBpZXIgPSAwOyBwaWVyIDwgZWUtPmVlX25fcGllcnNbbW9kZV07IHBpZXIrKykgeworCQlpZiAoIWNoaW5mb1twaWVyXS5wZF9jdXJ2ZXMpCisJCQljb250aW51ZTsKKworCQlmb3IgKHBkZyA9IDA7IHBkZyA8IGVlLT5lZV9wZF9nYWluc1ttb2RlXTsgcGRnKyspIHsKKwkJCXN0cnVjdCBhdGg1a19wZGdhaW5faW5mbyAqcGQgPQorCQkJCQkmY2hpbmZvW3BpZXJdLnBkX2N1cnZlc1twZGddOworCisJCQlpZiAocGQgIT0gTlVMTCkgeworCQkJCWZyZWUocGQtPnBkX3N0ZXApOworCQkJCWZyZWUocGQtPnBkX3B3cik7CisJCQl9CisJCX0KKworCQlmcmVlKGNoaW5mb1twaWVyXS5wZF9jdXJ2ZXMpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkCithdGg1a19lZXByb21fZGV0YWNoKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJdTggbW9kZTsKKworCWZvciAobW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFBOyBtb2RlIDw9IEFSNUtfRUVQUk9NX01PREVfMTFHOyBtb2RlKyspCisJCWF0aDVrX2VlcHJvbV9mcmVlX3BjYWxfaW5mbyhhaCwgbW9kZSk7Cit9CisKKy8qIFJlYWQgY29uZm9ybWFuY2UgdGVzdCBsaW1pdHMgdXNlZCBmb3IgcmVndWxhdG9yeSBjb250cm9sICovCitzdGF0aWMgaW50CithdGg1a19lZXByb21fcmVhZF9jdGxfaW5mbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXN0cnVjdCBhdGg1a19lZGdlX3Bvd2VyICpyZXA7CisJdW5zaWduZWQgaW50IGZtYXNrLCBwbWFzazsKKwl1bnNpZ25lZCBpbnQgY3RsX21vZGU7CisJaW50IHJldCwgaSwgajsKKwl1MzIgb2Zmc2V0OworCXUxNiB2YWw7CisKKwlwbWFzayA9IEFSNUtfRUVQUk9NX1BPV0VSX007CisJZm1hc2sgPSBBUjVLX0VFUFJPTV9GUkVRX00oZWUtPmVlX3ZlcnNpb24pOworCW9mZnNldCA9IEFSNUtfRUVQUk9NX0NUTChlZS0+ZWVfdmVyc2lvbik7CisJZWUtPmVlX2N0bHMgPSBBUjVLX0VFUFJPTV9OX0NUTFMoZWUtPmVlX3ZlcnNpb24pOworCWZvciAoaSA9IDA7IGkgPCBlZS0+ZWVfY3RsczsgaSArPSAyKSB7CisJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCWVlLT5lZV9jdGxbaV0gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJZWUtPmVlX2N0bFtpICsgMV0gPSB2YWwgJiAweGZmOworCX0KKworCW9mZnNldCA9IEFSNUtfRUVQUk9NX0dST1VQOF9PRkZTRVQ7CisJaWYgKGVlLT5lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8wKQorCQlvZmZzZXQgKz0gQVI1S19FRVBST01fVEFSR0VUX1BXUlNUQVJUKGVlLT5lZV9taXNjMSkgLQorCQkJQVI1S19FRVBST01fR1JPVVA1X09GRlNFVDsKKwllbHNlCisJCW9mZnNldCArPSBBUjVLX0VFUFJPTV9HUk9VUFNfU1RBUlQoZWUtPmVlX3ZlcnNpb24pOworCisJcmVwID0gZWUtPmVlX2N0bF9wd3I7CisJZm9yKGkgPSAwOyBpIDwgZWUtPmVlX2N0bHM7IGkrKykgeworCQlzd2l0Y2goZWUtPmVlX2N0bFtpXSAmIEFSNUtfQ1RMX01PREVfTSkgeworCQljYXNlIEFSNUtfQ1RMXzExQToKKwkJY2FzZSBBUjVLX0NUTF9UVVJCTzoKKwkJCWN0bF9tb2RlID0gQVI1S19FRVBST01fTU9ERV8xMUE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWN0bF9tb2RlID0gQVI1S19FRVBST01fTU9ERV8xMUc7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZWUtPmVlX2N0bFtpXSA9PSAwKSB7CisJCQlpZiAoZWUtPmVlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl8zXzMpCisJCQkJb2Zmc2V0ICs9IDg7CisJCQllbHNlCisJCQkJb2Zmc2V0ICs9IDc7CisJCQlyZXAgKz0gQVI1S19FRVBST01fTl9FREdFUzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChlZS0+ZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMykgeworCQkJZm9yIChqID0gMDsgaiA8IEFSNUtfRUVQUk9NX05fRURHRVM7IGogKz0gMikgeworCQkJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCQkJcmVwW2pdLmZyZXEgPSAodmFsID4+IDgpICYgZm1hc2s7CisJCQkJcmVwW2ogKyAxXS5mcmVxID0gdmFsICYgZm1hc2s7CisJCQl9CisJCQlmb3IgKGogPSAwOyBqIDwgQVI1S19FRVBST01fTl9FREdFUzsgaiArPSAyKSB7CisJCQkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJCQlyZXBbal0uZWRnZSA9ICh2YWwgPj4gOCkgJiBwbWFzazsKKwkJCQlyZXBbal0uZmxhZyA9ICh2YWwgPj4gMTQpICYgMTsKKwkJCQlyZXBbaiArIDFdLmVkZ2UgPSB2YWwgJiBwbWFzazsKKwkJCQlyZXBbaiArIDFdLmZsYWcgPSAodmFsID4+IDYpICYgMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCQlyZXBbMF0uZnJlcSA9ICh2YWwgPj4gOSkgJiBmbWFzazsKKwkJCXJlcFsxXS5mcmVxID0gKHZhbCA+PiAyKSAmIGZtYXNrOworCQkJcmVwWzJdLmZyZXEgPSAodmFsIDw8IDUpICYgZm1hc2s7CisKKwkJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCQlyZXBbMl0uZnJlcSB8PSAodmFsID4+IDExKSAmIDB4MWY7CisJCQlyZXBbM10uZnJlcSA9ICh2YWwgPj4gNCkgJiBmbWFzazsKKwkJCXJlcFs0XS5mcmVxID0gKHZhbCA8PCAzKSAmIGZtYXNrOworCisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJcmVwWzRdLmZyZXEgfD0gKHZhbCA+PiAxMykgJiAweDc7CisJCQlyZXBbNV0uZnJlcSA9ICh2YWwgPj4gNikgJiBmbWFzazsKKwkJCXJlcFs2XS5mcmVxID0gKHZhbCA8PCAxKSAmIGZtYXNrOworCisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJcmVwWzZdLmZyZXEgfD0gKHZhbCA+PiAxNSkgJiAweDE7CisJCQlyZXBbN10uZnJlcSA9ICh2YWwgPj4gOCkgJiBmbWFzazsKKworCQkJcmVwWzBdLmVkZ2UgPSAodmFsID4+IDIpICYgcG1hc2s7CisJCQlyZXBbMV0uZWRnZSA9ICh2YWwgPDwgNCkgJiBwbWFzazsKKworCQkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJCXJlcFsxXS5lZGdlIHw9ICh2YWwgPj4gMTIpICYgMHhmOworCQkJcmVwWzJdLmVkZ2UgPSAodmFsID4+IDYpICYgcG1hc2s7CisJCQlyZXBbM10uZWRnZSA9IHZhbCAmIHBtYXNrOworCisJCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQkJcmVwWzRdLmVkZ2UgPSAodmFsID4+IDEwKSAmIHBtYXNrOworCQkJcmVwWzVdLmVkZ2UgPSAodmFsID4+IDQpICYgcG1hc2s7CisJCQlyZXBbNl0uZWRnZSA9ICh2YWwgPDwgMikgJiBwbWFzazsKKworCQkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJCXJlcFs2XS5lZGdlIHw9ICh2YWwgPj4gMTQpICYgMHgzOworCQkJcmVwWzddLmVkZ2UgPSAodmFsID4+IDgpICYgcG1hc2s7CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IEFSNUtfRUVQUk9NX05fRURHRVM7IGorKykgeworCQkJcmVwW2pdLmZyZXEgPSBhdGg1a19lZXByb21fYmluMmZyZXEoZWUsCisJCQkJcmVwW2pdLmZyZXEsIGN0bF9tb2RlKTsKKwkJfQorCQlyZXAgKz0gQVI1S19FRVBST01fTl9FREdFUzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBlZXByb20gcG93ZXIgdGFibGVzCisgKi8KK2ludAorYXRoNWtfZWVwcm9tX2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYXRoNWtfZWVwcm9tX2luaXRfaGVhZGVyKGFoKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGF0aDVrX2VlcHJvbV9pbml0X21vZGVzKGFoKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGF0aDVrX2VlcHJvbV9yZWFkX3BjYWxfaW5mbyhhaCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBhdGg1a19lZXByb21fcmVhZF9jdGxfaW5mbyhhaCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgdGhlIE1BQyBhZGRyZXNzIGZyb20gZWVwcm9tCisgKi8KK2ludCBhdGg1a19lZXByb21fcmVhZF9tYWMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggKm1hYykKK3sKKwl1OCBtYWNfZFtFVEhfQUxFTl0gPSB7fTsKKwl1MzIgdG90YWwsIG9mZnNldDsKKwl1MTYgZGF0YTsKKwlpbnQgb2N0ZXQsIHJldDsKKworCXJldCA9IGF0aDVrX2h3X2VlcHJvbV9yZWFkKGFoLCAweDIwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAob2Zmc2V0ID0gMHgxZiwgb2N0ZXQgPSAwLCB0b3RhbCA9IDA7IG9mZnNldCA+PSAweDFkOyBvZmZzZXQtLSkgeworCQlyZXQgPSBhdGg1a19od19lZXByb21fcmVhZChhaCwgb2Zmc2V0LCAmZGF0YSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXRvdGFsICs9IGRhdGE7CisJCW1hY19kW29jdGV0ICsgMV0gPSBkYXRhICYgMHhmZjsKKwkJbWFjX2Rbb2N0ZXRdID0gZGF0YSA+PiA4OworCQlvY3RldCArPSAyOworCX0KKworCWlmICghdG90YWwgfHwgdG90YWwgPT0gMyAqIDB4ZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkobWFjLCBtYWNfZCwgRVRIX0FMRU4pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBhdGg1a19lZXByb21faXNfaGI2MyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXUxNiBkYXRhOworCisJYXRoNWtfaHdfZWVwcm9tX3JlYWQoYWgsIEFSNUtfRUVQUk9NX0lTX0hCNjMsICZkYXRhKTsKKworCWlmICgoYWgtPmFoX21hY192ZXJzaW9uID09IChBUjVLX1NSRVZfQVIyNDI1ID4+IDQpKSAmJiBkYXRhKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19ncGlvLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4YTNlNgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrX2dwaW8uYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqCisgKiBMaWdodGx5IG1vZGlmaWVkIGZvciBnUFhFLCBKdWx5IDIwMDksIGJ5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBNSVQgKTsKKworLyoqKioqKioqKioqKioqKipcCisgIEdQSU8gRnVuY3Rpb25zCitcKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImF0aDVrLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiYmFzZS5oIgorCisvKgorICogU2V0IEdQSU8gaW5wdXRzCisgKi8KK2ludCBhdGg1a19od19zZXRfZ3Bpb19pbnB1dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbykKK3sKKwlpZiAoZ3BpbyA+PSBBUjVLX05VTV9HUElPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKKwkJKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0dQSU9DUikgJiB+QVI1S19HUElPQ1JfT1VUKGdwaW8pKQorCQl8IEFSNUtfR1BJT0NSX0lOKGdwaW8pLCBBUjVLX0dQSU9DUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCBHUElPIG91dHB1dHMKKyAqLworaW50IGF0aDVrX2h3X3NldF9ncGlvX291dHB1dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbykKK3sKKwlpZiAoZ3BpbyA+PSBBUjVLX05VTV9HUElPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKKwkJKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0dQSU9DUikgJiB+QVI1S19HUElPQ1JfT1VUKGdwaW8pKQorCQl8IEFSNUtfR1BJT0NSX09VVChncGlvKSwgQVI1S19HUElPQ1IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgR1BJTyBzdGF0ZQorICovCit1MzIgYXRoNWtfaHdfZ2V0X2dwaW8oc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pCit7CisJaWYgKGdwaW8gPj0gQVI1S19OVU1fR1BJTykKKwkJcmV0dXJuIDB4ZmZmZmZmZmY7CisKKwkvKiBHUElPIGlucHV0IG1hZ2ljICovCisJcmV0dXJuICgoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfR1BJT0RJKSAmIEFSNUtfR1BJT0RJX00pID4+IGdwaW8pICYKKwkJMHgxOworfQorCisvKgorICogU2V0IEdQSU8gc3RhdGUKKyAqLworaW50IGF0aDVrX2h3X3NldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvLCB1MzIgdmFsKQoreworCXUzMiBkYXRhOworCisJaWYgKGdwaW8gPj0gQVI1S19OVU1fR1BJTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHUElPIG91dHB1dCBtYWdpYyAqLworCWRhdGEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19HUElPRE8pOworCisJZGF0YSAmPSB+KDEgPDwgZ3Bpbyk7CisJZGF0YSB8PSAodmFsICYgMSkgPDwgZ3BpbzsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgQVI1S19HUElPRE8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBHUElPIGludGVycnVwdCAoUkZLaWxsIHN3aXRjaCkKKyAqLwordm9pZCBhdGg1a19od19zZXRfZ3Bpb19pbnRyKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBncGlvLAorCQl1MzIgaW50ZXJydXB0X2xldmVsKQoreworCXUzMiBkYXRhOworCisJaWYgKGdwaW8gPj0gQVI1S19OVU1fR1BJTykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTZXQgdGhlIEdQSU8gaW50ZXJydXB0CisJICovCisJZGF0YSA9IChhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19HUElPQ1IpICYKKwkJfihBUjVLX0dQSU9DUl9JTlRfU0VMKGdwaW8pIHwgQVI1S19HUElPQ1JfSU5UX1NFTEggfAorCQlBUjVLX0dQSU9DUl9JTlRfRU5BIHwgQVI1S19HUElPQ1JfT1VUKGdwaW8pKSkgfAorCQkoQVI1S19HUElPQ1JfSU5UX1NFTChncGlvKSB8IEFSNUtfR1BJT0NSX0lOVF9FTkEpOworCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBpbnRlcnJ1cHRfbGV2ZWwgPyBkYXRhIDoKKwkJKGRhdGEgfCBBUjVLX0dQSU9DUl9JTlRfU0VMSCksIEFSNUtfR1BJT0NSKTsKKworCWFoLT5haF9pbXIgfD0gQVI1S19JTVJfR1BJTzsKKworCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgKi8KKwlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSU1SLCBBUjVLX0lNUl9HUElPKTsKK30KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfaW5pdHZhbHMuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrX2luaXR2YWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwMTFjOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrX2luaXR2YWxzLmMKQEAgLTAsMCArMSwxNTYwIEBACisvKgorICogSW5pdGlhbCByZWdpc3RlciBzZXR0aW5ncyBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgorICoKKyAqIExpZ2h0bHkgbW9kaWZpZWQgZm9yIGdQWEUsIEp1bHkgMjAwOSwgYnkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIE1JVCApOworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImJhc2UuaCIKKworLyoKKyAqIE1vZGUtaW5kZXBlbmRlbnQgaW5pdGlhbCByZWdpc3RlciB3cml0ZXMKKyAqLworCitzdHJ1Y3QgYXRoNWtfaW5pIHsKKwl1MTYJaW5pX3JlZ2lzdGVyOworCXUzMglpbmlfdmFsdWU7CisKKwllbnVtIHsKKwkJQVI1S19JTklfV1JJVEUgPSAwLAkvKiBEZWZhdWx0ICovCisJCUFSNUtfSU5JX1JFQUQgPSAxLAkvKiBDbGVhcmVkIG9uIHJlYWQgKi8KKwl9IGluaV9tb2RlOworfTsKKworLyoKKyAqIE1vZGUgc3BlY2lmaWMgaW5pdGlhbCByZWdpc3RlciB2YWx1ZXMKKyAqLworCitzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgeworCXUxNgltb2RlX3JlZ2lzdGVyOworCXUzMgltb2RlX3ZhbHVlWzVdOworfTsKKworLyogSW5pdGlhbCByZWdpc3RlciBzZXR0aW5ncyBmb3IgQVI1MjEwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaSBhcjUyMTBfaW5pW10gPSB7CisJLyogUENVIGFuZCBNQUMgcmVnaXN0ZXJzICovCisJeyBBUjVLX05PUUNVX1RYRFAwLAkwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19OT1FDVV9UWERQMSwJMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUlhEUCwJCTAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0NSLAkJMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfSVNSLAkJMCwgQVI1S19JTklfUkVBRCB9LAorCXsgQVI1S19JTVIsCQkwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19JRVIsCQlBUjVLX0lFUl9ESVNBQkxFLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CU1IsCQkwLCBBUjVLX0lOSV9SRUFEIH0sCisJeyBBUjVLX1RYQ0ZHLAkJQVI1S19ETUFTSVpFXzEyOEIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JYQ0ZHLAkJQVI1S19ETUFTSVpFXzEyOEIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0NGRywJCUFSNUtfSU5JVF9DRkcsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1RPUFMsCQk4LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SWE5PRlJNLAkJOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUlBHVE8sCQkwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19UWE5PRlJNLAkJMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfU0ZSLAkJMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfTUlCQywJCTAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX01JU0MsCQkwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SWF9GSUxURVJfNTIxMCwJMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfTUNBU1RfRklMVEVSMF81MjEwLCAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19NQ0FTVF9GSUxURVIxXzUyMTAsIDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1RYX01BU0swLAkwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19UWF9NQVNLMSwJMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQ0xSX1RNQVNLLAkwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19UUklHX0xWTCwJQVI1S19UVU5FX01JTl9UWF9GSUZPX1RIUkVTLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19ESUFHX1NXXzUyMTAsCTAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JTU0lfVEhSLAlBUjVLX1RVTkVfUlNTSV9USFJFUywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVFNGX0wzMl81MjEwLAkwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19USU1FUjBfNTIxMCwJMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVElNRVIxXzUyMTAsCTB4ZmZmZmZmZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1RJTUVSMl81MjEwLAkweGZmZmZmZmZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19USU1FUjNfNTIxMCwJMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQ0ZQX0RVUl81MjEwLAkwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19DRlBfUEVSSU9EXzUyMTAsCTAsIEFSNUtfSU5JX1dSSVRFIH0sCisJLyogUEhZIHJlZ2lzdGVycyAqLworCXsgQVI1S19QSFkoMCksCTB4MDAwMDAwNDcsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9BR0MsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSgzKSwJMHgwOTg0OGVhNiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDQpLAkweDNkMzJlMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNSksCTB4MDAwMDA3NmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9BQ1QsCUFSNUtfUEhZX0FDVF9ESVNBQkxFLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoOCksCTB4MDIwMjAyMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg5KSwJMHgwMDAwMGUwZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDEwKSwJMHgwYTAyMDIwMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDExKSwJMHgwMDAzNmZmYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDEyKSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDEzKSwJMHgwMDAwMGUwZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDE0KSwJMHgwMDAwMDAwNywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDE1KSwJMHgwMDAyMDEwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDE2KSwJMHg4OTYzMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDE3KSwJMHgxMzcyMTY5YywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDE4KSwJMHgwMDE4YjYzMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDE5KSwJMHgxMjg0NjEzYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDIwKSwJMHgwZGU4YjhlMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDIxKSwJMHgwMDA3NDg1OSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDIyKSwJMHg3ZTgwYmViYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDIzKSwJMHgzMTNhNjY1ZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0FHQ0NUTCwgMHgwMDAwMWQwOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDI1KSwJMHgwMDAxY2UwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDI2KSwJMHg0MDlhNDE5MCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDI4KSwJMHgwMDAwMDAwZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDI5KSwJMHgwMDAwMDA4MCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDMwKSwJMHgwMDAwMDAwNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDMxKSwJMHgwMDAwMDAxOCwgQVI1S19JTklfV1JJVEUgfSwgCS8qIDB4OTg3YyAqLworCXsgQVI1S19QSFkoNjQpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LCAJLyogMHg5OTAwICovCisJeyBBUjVLX1BIWSg2NSksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg2NiksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg2NyksCTB4MDA4MDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg2OCksCTB4MDAwMDAwMDMsIEFSNUtfSU5JX1dSSVRFIH0sCisJLyogQkIgZ2FpbiB0YWJsZSAoNjRieXRlcykgKi8KKwl7IEFSNUtfQkJfR0FJTigwKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxKSwgMHgwMDAwMDAyMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyKSwgMHgwMDAwMDAxMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzKSwgMHgwMDAwMDAzMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0KSwgMHgwMDAwMDAwOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1KSwgMHgwMDAwMDAyOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig2KSwgMHgwMDAwMDAyOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig3KSwgMHgwMDAwMDAwNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig4KSwgMHgwMDAwMDAyNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig5KSwgMHgwMDAwMDAxNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxMCksIDB4MDAwMDAwMzQsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTEpLCAweDAwMDAwMDBjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDEyKSwgMHgwMDAwMDAyYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxMyksIDB4MDAwMDAwMDIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTQpLCAweDAwMDAwMDIyLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDE1KSwgMHgwMDAwMDAxMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxNiksIDB4MDAwMDAwMzIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTcpLCAweDAwMDAwMDBhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDE4KSwgMHgwMDAwMDAyYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxOSksIDB4MDAwMDAwMDEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjApLCAweDAwMDAwMDIxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDIxKSwgMHgwMDAwMDAxMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyMiksIDB4MDAwMDAwMzEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjMpLCAweDAwMDAwMDA5LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDI0KSwgMHgwMDAwMDAyOSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyNSksIDB4MDAwMDAwMDUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjYpLCAweDAwMDAwMDI1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDI3KSwgMHgwMDAwMDAxNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyOCksIDB4MDAwMDAwMzUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjkpLCAweDAwMDAwMDBkLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDMwKSwgMHgwMDAwMDAyZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzMSksIDB4MDAwMDAwMDMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMzIpLCAweDAwMDAwMDIzLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDMzKSwgMHgwMDAwMDAxMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzNCksIDB4MDAwMDAwMzMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMzUpLCAweDAwMDAwMDBiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDM2KSwgMHgwMDAwMDAyYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzNyksIDB4MDAwMDAwMDcsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMzgpLCAweDAwMDAwMDI3LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDM5KSwgMHgwMDAwMDAxNywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0MCksIDB4MDAwMDAwMzcsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDEpLCAweDAwMDAwMDBmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDQyKSwgMHgwMDAwMDAyZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0MyksIDB4MDAwMDAwMmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDQpLCAweDAwMDAwMDJmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDQ1KSwgMHgwMDAwMDAyZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0NiksIDB4MDAwMDAwMmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDcpLCAweDAwMDAwMDJmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDQ4KSwgMHgwMDAwMDAyZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0OSksIDB4MDAwMDAwMmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTApLCAweDAwMDAwMDJmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDUxKSwgMHgwMDAwMDAyZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1MiksIDB4MDAwMDAwMmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTMpLCAweDAwMDAwMDJmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDU0KSwgMHgwMDAwMDAyZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1NSksIDB4MDAwMDAwMmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTYpLCAweDAwMDAwMDJmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDU3KSwgMHgwMDAwMDAyZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1OCksIDB4MDAwMDAwMmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTkpLCAweDAwMDAwMDJmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDYwKSwgMHgwMDAwMDAyZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig2MSksIDB4MDAwMDAwMmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNjIpLCAweDAwMDAwMDJmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDYzKSwgMHgwMDAwMDAyZiwgQVI1S19JTklfV1JJVEUgfSwKKwkvKiA1MTEwIFJGIGdhaW4gdGFibGUgKDY0YnRlcykgKi8KKwl7IEFSNUtfUkZfR0FJTigwKSwgMHgwMDAwMDAxZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigxKSwgMHgwMDAwMDA1ZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigyKSwgMHgwMDAwMDA5ZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigzKSwgMHgwMDAwMDBkZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig0KSwgMHgwMDAwMDExZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig1KSwgMHgwMDAwMDAyMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig2KSwgMHgwMDAwMDA2MSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig3KSwgMHgwMDAwMDBhMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig4KSwgMHgwMDAwMDBlMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig5KSwgMHgwMDAwMDAzMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigxMCksIDB4MDAwMDAwNzEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMTEpLCAweDAwMDAwMGIxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDEyKSwgMHgwMDAwMDAxYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigxMyksIDB4MDAwMDAwNWMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMTQpLCAweDAwMDAwMDI5LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDE1KSwgMHgwMDAwMDA2OSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigxNiksIDB4MDAwMDAwYTksIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMTcpLCAweDAwMDAwMDIwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDE4KSwgMHgwMDAwMDAxOSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigxOSksIDB4MDAwMDAwNTksIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMjApLCAweDAwMDAwMDk5LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDIxKSwgMHgwMDAwMDAzMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigyMiksIDB4MDAwMDAwMDUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMjMpLCAweDAwMDAwMDI1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDI0KSwgMHgwMDAwMDA2NSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigyNSksIDB4MDAwMDAwYTUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMjYpLCAweDAwMDAwMDI4LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDI3KSwgMHgwMDAwMDA2OCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigyOCksIDB4MDAwMDAwMWYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMjkpLCAweDAwMDAwMDFlLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDMwKSwgMHgwMDAwMDAxOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigzMSksIDB4MDAwMDAwNTgsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMzIpLCAweDAwMDAwMDk4LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDMzKSwgMHgwMDAwMDAwMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigzNCksIDB4MDAwMDAwMDQsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMzUpLCAweDAwMDAwMDQ0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDM2KSwgMHgwMDAwMDA4NCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTigzNyksIDB4MDAwMDAwMTMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oMzgpLCAweDAwMDAwMDEyLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDM5KSwgMHgwMDAwMDA1MiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig0MCksIDB4MDAwMDAwOTIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oNDEpLCAweDAwMDAwMGQyLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDQyKSwgMHgwMDAwMDAyYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig0MyksIDB4MDAwMDAwMmEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oNDQpLCAweDAwMDAwMDZhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDQ1KSwgMHgwMDAwMDBhYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig0NiksIDB4MDAwMDAwMWIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oNDcpLCAweDAwMDAwMDFhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDQ4KSwgMHgwMDAwMDA1YSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig0OSksIDB4MDAwMDAwOWEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oNTApLCAweDAwMDAwMGRhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDUxKSwgMHgwMDAwMDAwNiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig1MiksIDB4MDAwMDAwMDYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oNTMpLCAweDAwMDAwMDA2LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDU0KSwgMHgwMDAwMDAwNiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig1NSksIDB4MDAwMDAwMDYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oNTYpLCAweDAwMDAwMDA2LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDU3KSwgMHgwMDAwMDAwNiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig1OCksIDB4MDAwMDAwMDYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oNTkpLCAweDAwMDAwMDA2LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDYwKSwgMHgwMDAwMDAwNiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZfR0FJTig2MSksIDB4MDAwMDAwMDYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JGX0dBSU4oNjIpLCAweDAwMDAwMDA2LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRl9HQUlOKDYzKSwgMHgwMDAwMDAwNiwgQVI1S19JTklfV1JJVEUgfSwKKwkvKiBQSFkgYWN0aXZhdGlvbiAqLworCXsgQVI1S19QSFkoNTMpLCAweDAwMDAwMDIwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNTEpLCAweDAwMDAwMDA0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNTApLCAweDAwMDYwMTA2LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMzkpLCAweDAwMDAwMDZkLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNDgpLCAweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNTIpLCAweDAwMDAwMDE0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfQUNULCBBUjVLX1BIWV9BQ1RfRU5BQkxFLCBBUjVLX0lOSV9XUklURSB9LAorfTsKKworLyogSW5pdGlhbCByZWdpc3RlciBzZXR0aW5ncyBmb3IgQVI1MjExICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaSBhcjUyMTFfaW5pW10gPSB7CisJeyBBUjVLX1JYRFAsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SVFNEMCwJCTB4ODQ4NDljOWMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JUU0QxLAkJMHg3YzdjN2M3YywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUlhDRkcsCQkweDAwMDAwMDA1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19NSUJDLAkJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVE9QUywJCTB4MDAwMDAwMDgsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JYTk9GUk0sCQkweDAwMDAwMDA4LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19UWE5PRlJNLAkJMHgwMDAwMDAxMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUlBHVE8sCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SRkNOVCwJCTB4MDAwMDAwMWYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoMCksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoMSksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoMiksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoMyksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoNCksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoNSksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoNiksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoNyksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoOCksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVRVVFX1RYRFAoOSksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0RDVV9GUCwJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1NUQV9JRDEsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CU1NfSUQwLAkJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQlNTX0lEMSwJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JTU0lfVEhSLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19DRlBfUEVSSU9EXzUyMTEsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1RJTUVSMF81MjExLAkweDAwMDAwMDMwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19USU1FUjFfNTIxMSwJMHgwMDA3ZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVElNRVIyXzUyMTEsCTB4MDFmZmZmZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1RJTUVSM181MjExLAkweDAwMDAwMDMxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19DRlBfRFVSXzUyMTEsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JYX0ZJTFRFUl81MjExLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19NQ0FTVF9GSUxURVIwXzUyMTEsIDB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX01DQVNUX0ZJTFRFUjFfNTIxMSwgMHgwMDAwMDAwMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRElBR19TV181MjExLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19BRERBQ19URVNULAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19ERUZBVUxUX0FOVEVOTkEsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJLyogUEhZIHJlZ2lzdGVycyAqLworCXsgQVI1S19QSFlfQUdDLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMyksCTB4MmQ4NDkwOTMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg0KSwJMHg3ZDMyZTAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDUpLAkweDAwMDAwZjZiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfQUNULAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMTEpLAkweDAwMDI2ZmZlLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMTIpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMTUpLAkweDAwMDIwMTAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMTYpLAkweDIwNmEwMTdhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMTkpLAkweDEyODQ2MTNjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMjEpLAkweDAwMDAwODU5LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMjYpLAkweDQwOWE0MTkwLCBBUjVLX0lOSV9XUklURSB9LAkvKiAweDk4NjggKi8KKwl7IEFSNUtfUEhZKDI3KSwJMHgwNTBjYjA4MSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDI4KSwJMHgwMDAwMDAwZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDI5KSwJMHgwMDAwMDA4MCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDMwKSwJMHgwMDAwMDAwYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDY0KSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDY1KSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDY2KSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDY3KSwJMHgwMDgwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDY4KSwJMHgwMDAwMDAwMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDcxKSwJMHgwMDAwMDkyYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0lRLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNzMpLAkweDAwMDU4YTA1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNzQpLAkweDAwMDAwMDAxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNzUpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUEFQRF9QUk9CRSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDc3KSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwJLyogMHg5OTM0ICovCisJeyBBUjVLX1BIWSg3OCksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCS8qIDB4OTkzOCAqLworCXsgQVI1S19QSFkoNzkpLAkweDAwMDAwMDNmLCBBUjVLX0lOSV9XUklURSB9LAkvKiAweDk5M2MgKi8KKwl7IEFSNUtfUEhZKDgwKSwJMHgwMDAwMDAwNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDgyKSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDgzKSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDg0KSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1JBREFSLCAweDVkNTBmMTRjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoODYpLAkweDAwMDAwMDE4LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoODcpLAkweDAwNGI2YThlLCBBUjVLX0lOSV9XUklURSB9LAorCS8qIEluaXRpYWwgUG93ZXIgdGFibGUgKDMyYnl0ZXMpCisJICogY29tbW9uIG9uIGFsbCBjYXJkcy9tb2Rlcy4KKwkgKiBOb3RlOiBUYWJsZSBpcyByZXdyaXR0ZW4gZHVyaW5nCisJICogdHhwb3dlciBzZXR1cCBsYXRlciB1c2luZyBjYWxpYnJhdGlvbgorCSAqIGRhdGEgZXRjLiBzbyBuZXh0IHdyaXRlIGlzIG5vbi1jb21tb24gKi8KKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoMSksIDB4MDZmZjA1ZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDIpLCAweDA3ZmYwN2ZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUigzKSwgMHgwOGZmMDhmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoNCksIDB4MDlmZjA5ZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDUpLCAweDBhZmYwYWZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUig2KSwgMHgwYmZmMGJmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoNyksIDB4MGNmZjBjZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDgpLCAweDBkZmYwZGZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUig5KSwgMHgwZmZmMGVmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoMTApLCAweDEyZmYxMmZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUigxMSksIDB4MTRmZjEzZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDEyKSwgMHgxNmZmMTVmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoMTMpLCAweDE5ZmYxN2ZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUigxNCksIDB4MWJmZjFhZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDE1KSwgMHgxZWZmMWRmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoMTYpLCAweDIzZmYyMGZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUigxNyksIDB4MjdmZjI1ZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDE4KSwgMHgyY2ZmMjlmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoMTkpLCAweDMxZmYyZmZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUigyMCksIDB4MzdmZjM0ZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDIxKSwgMHgzYWZmM2FmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoMjIpLCAweDNhZmYzYWZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUigyMyksIDB4M2FmZjNhZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDI0KSwgMHgzYWZmM2FmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoMjUpLCAweDNhZmYzYWZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUigyNiksIDB4M2FmZjNhZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDI3KSwgMHgzYWZmM2FmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoMjgpLCAweDNhZmYzYWZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUigyOSksIDB4M2FmZjNhZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKDMwKSwgMHgzYWZmM2FmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BDREFDX1RYUE9XRVIoMzEpLCAweDNhZmYzYWZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfQ0NLVFhDVEwsIDB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg2NDIpLCAweDUwM2U0NjQ2LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfR0FJTl8yR0haLCAweDY0ODA0MTZjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNjQ0KSwgMHgwMTk5YTAwMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDY0NSksIDB4MDQ0Y2Q2MTAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg2NDYpLCAweDEzODAwMDQwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNjQ3KSwgMHgxYmUwMDA2MCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDY0OCksIDB4MGM1MzgwMGEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg2NDkpLCAweDAwMTRkZjNiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNjUwKSwgMHgwMDAwMDFiNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDY1MSksIDB4MDAwMDAwMjAsIEFSNUtfSU5JX1dSSVRFIH0sCit9OworCisvKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIEFSNTIxMQorICogNTIxMSBzdXBwb3J0cyBPRkRNLW9ubHkgZyAoZHJhZnQgZykgYnV0IHdlCisgKiBuZWVkIHRvIHRlc3QgaXQgIQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIGFyNTIxMV9pbmlfbW9kZVtdID0geworCXsgQVI1S19UWENGRywKKwkvKgkgIGEJICAgIGFUdXJibwkgIGIJICBnIChPRkRNKSAgICAqLworCSAgIHsgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxZCwgMHgwMDAwMDAxNSB9IH0sCisJeyBBUjVLX1FVRVVFX0RGU19MT0NBTF9JRlMoMCksCisJICAgeyAweDAwMmZmYzBmLCAweDAwMmZmYzBmLCAweDAwMmZmYzFmLCAweDAwMmZmYzBmIH0gfSwKKwl7IEFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUygxKSwKKwkgICB7IDB4MDAyZmZjMGYsIDB4MDAyZmZjMGYsIDB4MDAyZmZjMWYsIDB4MDAyZmZjMGYgfSB9LAorCXsgQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKDIpLAorCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiB9IH0sCisJeyBBUjVLX1FVRVVFX0RGU19MT0NBTF9JRlMoMyksCisJICAgeyAweDAwMmZmYzBmLCAweDAwMmZmYzBmLCAweDAwMmZmYzFmLCAweDAwMmZmYzBmIH0gfSwKKwl7IEFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUyg0KSwKKwkgICB7IDB4MDAyZmZjMGYsIDB4MDAyZmZjMGYsIDB4MDAyZmZjMWYsIDB4MDAyZmZjMGYgfSB9LAorCXsgQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKDUpLAorCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiB9IH0sCisJeyBBUjVLX1FVRVVFX0RGU19MT0NBTF9JRlMoNiksCisJICAgeyAweDAwMmZmYzBmLCAweDAwMmZmYzBmLCAweDAwMmZmYzFmLCAweDAwMmZmYzBmIH0gfSwKKwl7IEFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUyg3KSwKKwkgICB7IDB4MDAyZmZjMGYsIDB4MDAyZmZjMGYsIDB4MDAyZmZjMWYsIDB4MDAyZmZjMGYgfSB9LAorCXsgQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKDgpLAorCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiB9IH0sCisJeyBBUjVLX1FVRVVFX0RGU19MT0NBTF9JRlMoOSksCisJICAgeyAweDAwMmZmYzBmLCAweDAwMmZmYzBmLCAweDAwMmZmYzFmLCAweDAwMmZmYzBmIH0gfSwKKwl7IEFSNUtfRENVX0dCTF9JRlNfU0xPVCwKKwkgICB7IDB4MDAwMDAxNjgsIDB4MDAwMDAxZTAsIDB4MDAwMDAxYjgsIDB4MDAwMDAxNjggfSB9LAorCXsgQVI1S19EQ1VfR0JMX0lGU19TSUZTLAorCSAgIHsgMHgwMDAwMDIzMCwgMHgwMDAwMDFlMCwgMHgwMDAwMDBiMCwgMHgwMDAwMDIzMCB9IH0sCisJeyBBUjVLX0RDVV9HQkxfSUZTX0VJRlMsCisJICAgeyAweDAwMDAwZDk4LCAweDAwMDAxMTgwLCAweDAwMDAxZjQ4LCAweDAwMDAwZDk4IH0gfSwKKwl7IEFSNUtfRENVX0dCTF9JRlNfTUlTQywKKwkgICB7IDB4MDAwMGEwZTAsIDB4MDAwMTQwNjgsIDB4MDAwMDU4ODAsIDB4MDAwMGEwZTAgfSB9LAorCXsgQVI1S19USU1FX09VVCwKKwkgICB7IDB4MDQwMDA0MDAsIDB4MDgwMDA4MDAsIDB4MjAwMDMwMDAsIDB4MDQwMDA0MDAgfSB9LAorCXsgQVI1S19VU0VDXzUyMTEsCisJICAgeyAweDBlOGQ4ZmE3LCAweDBlOGQ4ZmNmLCAweDAxNjA4Zjk1LCAweDBlOGQ4ZmE3IH0gfSwKKwl7IEFSNUtfUEhZX1RVUkJPLAorCSAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyBBUjVLX1BIWSg4KSwKKwkgICB7IDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMTAyMDAsIDB4MDIwMjAyMDAgfSB9LAorCXsgQVI1S19QSFkoOSksCisJICAgeyAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwNzA3LCAweDAwMDAwZTBlIH0gfSwKKwl7IEFSNUtfUEhZKDEwKSwKKwkgICB7IDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MDUwMTAwMDAsIDB4MGEwMjAwMDEgfSB9LAorCXsgQVI1S19QSFkoMTMpLAorCSAgIHsgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSB9IH0sCisJeyBBUjVLX1BIWSgxNCksCisJICAgeyAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDBiLCAweDAwMDAwMDBiIH0gfSwKKwl7IEFSNUtfUEhZKDE3KSwKKwkgICB7IDB4MTM3MjE2OWMsIDB4MTM3MjE2YTUsIDB4MTM3MjE2YTgsIDB4MTM3MjE2OWMgfSB9LAorCXsgQVI1S19QSFkoMTgpLAorCSAgIHsgMHgwMDE4YmE2NywgMHgwMDE4YmE2NywgMHgwMDE4YmE2OSwgMHgwMDE4YmE2OSB9IH0sCisJeyBBUjVLX1BIWSgyMCksCisJICAgeyAweDBjMjhiNGUwLCAweDBjMjhiNGUwLCAweDBjMjhiNGUwLCAweDBjMjhiNGUwIH0gfSwKKwl7IEFSNUtfUEhZX1NJRywKKwkgICB7IDB4N2U4MDBkMmUsIDB4N2U4MDBkMmUsIDB4N2VjMDBkMmUsIDB4N2U4MDBkMmUgfSB9LAorCXsgQVI1S19QSFlfQUdDQ09BUlNFLAorCSAgIHsgMHgzMTM3NWQ1ZSwgMHgzMTM3NWQ1ZSwgMHgzMTNhNWQ1ZSwgMHgzMTM3NWQ1ZSB9IH0sCisJeyBBUjVLX1BIWV9BR0NDVEwsCisJICAgeyAweDAwMDBiZDEwLCAweDAwMDBiZDEwLCAweDAwMDBiZDM4LCAweDAwMDBiZDEwIH0gfSwKKwl7IEFSNUtfUEhZX05GLAorCSAgIHsgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCB9IH0sCisJeyBBUjVLX1BIWV9SWF9ERUxBWSwKKwkgICB7IDB4MDAwMDI3MTAsIDB4MDAwMDI3MTAsIDB4MDAwMDE1N2MsIDB4MDAwMDI3MTAgfSB9LAorCXsgQVI1S19QSFkoNzApLAorCSAgIHsgMHgwMDAwMDE5MCwgMHgwMDAwMDE5MCwgMHgwMDAwMDA4NCwgMHgwMDAwMDE5MCB9IH0sCisJeyBBUjVLX1BIWV9GUkFNRV9DVExfNTIxMSwKKwkgICB7IDB4NmZlMDEwMjAsIDB4NmZlMDEwMjAsIDB4NmZlMDA5MjAsIDB4NmZlMDEwMjAgfSB9LAorCXsgQVI1S19QSFlfUENEQUNfVFhQT1dFUl9CQVNFLAorCSAgIHsgMHgwNWZmMTRmZiwgMHgwNWZmMTRmZiwgMHgwNWZmMTRmZiwgMHgwNWZmMTlmZiB9IH0sCisJeyBBUjVLX1JGX0JVRkZFUl9DT05UUk9MXzQsCisJICAgeyAweDAwMDAwMDEwLCAweDAwMDAwMDE0LCAweDAwMDAwMDEwLCAweDAwMDAwMDEwIH0gfSwKK307CisKKy8qIEluaXRpYWwgcmVnaXN0ZXIgc2V0dGluZ3MgZm9yIEFSNTIxMiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmkgYXI1MjEyX2luaV9jb21tb25fc3RhcnRbXSA9IHsKKwl7IEFSNUtfUlhEUCwJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JYQ0ZHLAkJMHgwMDAwMDAwNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfTUlCQywJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1RPUFMsCQkweDAwMDAwMDA4LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SWE5PRlJNLAkJMHgwMDAwMDAwOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVFhOT0ZSTSwJCTB4MDAwMDAwMTAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JQR1RPLAkJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkZDTlQsCQkweDAwMDAwMDFmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDApLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDEpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDIpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDMpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDQpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDUpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDYpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDcpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDgpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUVVRV9UWERQKDkpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19EQ1VfRlAsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19EQ1VfVFhQLAkJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwkvKiBUeCBmaWx0ZXIgdGFibGUgMCAoMzIgZW50cmllcykgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDApLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwgLyogRENVIDAgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDEpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDIpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDMpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDQpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwgLyogRENVIDEgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDUpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDYpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDcpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDgpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwgLyogRENVIDIgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDkpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDEwKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDExKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDEyKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwgLyogRENVIDMgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDEzKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDE0KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDE1KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDE2KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwgLyogRENVIDQgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDE3KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDE4KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDE5KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDIwKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwgLyogRENVIDUgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDIxKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDIyKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDIzKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDI0KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwgLyogRENVIDYgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDI1KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDI2KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDI3KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDI4KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwgLyogRENVIDcgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDI5KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDMwKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8wKDMxKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwkvKiBUeCBmaWx0ZXIgdGFibGUgMSAoMTYgZW50cmllcykgKi8KKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDApLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDEpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDIpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDMpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDQpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDUpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDYpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDcpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDgpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDkpLCAgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDEwKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDExKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDEyKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDEzKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDE0KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl8xKDE1KSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl9DTFIsIDB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0RDVV9UWF9GSUxURVJfU0VULCAweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19EQ1VfVFhfRklMVEVSX0NMUiwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRENVX1RYX0ZJTFRFUl9TRVQsIDB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1NUQV9JRDEsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CU1NfSUQwLAkJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQlNTX0lEMSwJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JFQUNPTl81MjExLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19DRlBfUEVSSU9EXzUyMTEsIDB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1RJTUVSMF81MjExLAkweDAwMDAwMDMwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19USU1FUjFfNTIxMSwJMHgwMDA3ZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVElNRVIyXzUyMTEsCTB4MDFmZmZmZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1RJTUVSM181MjExLAkweDAwMDAwMDMxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19DRlBfRFVSXzUyMTEsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JYX0ZJTFRFUl81MjExLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19ESUFHX1NXXzUyMTEsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0FEREFDX1RFU1QsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0RFRkFVTFRfQU5URU5OQSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfRlJBTUVfQ1RMX1FPU00sIAkweDAwMGZjNzhmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19YUk1PREUsCQkweDJhODIzMDFhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19YUkRFTEFZLAkJMHgwNWRjMDFlMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfWFJUSU1FT1VULAkweDFmNDAyNzEwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19YUkNISVJQLAkJMHgwMWY0MDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfWFJTVE9NUCwJCTB4MDAwMDFlMWMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1NMRUVQMCwJCTB4MDAwMmFhYWEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1NMRUVQMSwJCTB4MDIwMDU1NTUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1NMRUVQMiwJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JTU19JRE0wLAkweGZmZmZmZmZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CU1NfSURNMSwJMHgwMDAwZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVFhQQywJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BST0ZDTlRfVFgsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BST0ZDTlRfUlgsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BST0ZDTlRfUlhDTFIsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BST0ZDTlRfQ1lDTEUsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1FVSUVUX0NUTDEsCTB4MDAwMDAwODgsIEFSNUtfSU5JX1dSSVRFIH0sCisJLyogSW5pdGlhbCByYXRlIGR1cmF0aW9uIHRhYmxlICgzMiBlbnRyaWVzICkqLworCXsgQVI1S19SQVRFX0RVUigwKSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoMSksCTB4MDAwMDAwOGMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDIpLAkweDAwMDAwMGU0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUigzKSwJMHgwMDAwMDJkNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoNCksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDUpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUig2KSwJMHgwMDAwMDBhMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoNyksCTB4MDAwMDAxYzksIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDgpLAkweDAwMDAwMDJjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUig5KSwJMHgwMDAwMDAyYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoMTApLAkweDAwMDAwMDMwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUigxMSksCTB4MDAwMDAwM2MsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDEyKSwJMHgwMDAwMDAyYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoMTMpLAkweDAwMDAwMDJjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUigxNCksCTB4MDAwMDAwMzAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDE1KSwJMHgwMDAwMDAzYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoMTYpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUigxNyksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDE4KSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoMTkpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUigyMCksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDIxKSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoMjIpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUigyMyksCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDI0KSwJMHgwMDAwMDBkNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoMjUpLAkweDAwMDAwMGRmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUigyNiksCTB4MDAwMDAxMDIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDI3KSwJMHgwMDAwMDEzYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoMjgpLAkweDAwMDAwMDc1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFX0RVUigyOSksCTB4MDAwMDAwN2YsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1JBVEVfRFVSKDMwKSwJMHgwMDAwMDBhMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUkFURV9EVVIoMzEpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19RVUlFVF9DVEwyLAkweDAwMDEwMDAyLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19UU0ZfUEFSTSwJMHgwMDAwMDAwMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUU9TX05PQUNLLAkweDAwMDAwMGMwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfRVJSX0ZJTCwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfWFJMQVRfVFgsCTB4MDAwMDAxNjgsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0FDS1NJRlMsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCS8qIFJhdGUgLT4gZGIgdGFibGUKKwkgKiBub3RpY2UgLi4uMDM8LTAyPC0wMTwtMDAgISAqLworCXsgQVI1S19SQVRFMkRCKDApLAkweDAzMDIwMTAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFMkRCKDEpLAkweDA3MDYwNTA0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFMkRCKDIpLAkweDBiMGEwOTA4LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFMkRCKDMpLAkweDBmMGUwZDBjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFMkRCKDQpLAkweDEzMTIxMTEwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFMkRCKDUpLAkweDE3MTYxNTE0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFMkRCKDYpLAkweDFiMWExOTE4LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19SQVRFMkRCKDcpLAkweDFmMWUxZDFjLCBBUjVLX0lOSV9XUklURSB9LAorCS8qIERiIC0+IFJhdGUgdGFibGUgKi8KKwl7IEFSNUtfREIyUkFURSgwKSwJMHgwMzAyMDEwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfREIyUkFURSgxKSwJMHgwNzA2MDUwNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfREIyUkFURSgyKSwJMHgwYjBhMDkwOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfREIyUkFURSgzKSwJMHgwZjBlMGQwYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfREIyUkFURSg0KSwJMHgxMzEyMTExMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfREIyUkFURSg1KSwJMHgxNzE2MTUxNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfREIyUkFURSg2KSwJMHgxYjFhMTkxOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfREIyUkFURSg3KSwJMHgxZjFlMWQxYywgQVI1S19JTklfV1JJVEUgfSwKKwkvKiBQSFkgcmVnaXN0ZXJzIChDb21tb24gc2V0dGluZ3MKKwkgKiBmb3IgYWxsIGNoaXBzL21vZGVzKSAqLworCXsgQVI1S19QSFkoMyksCQkweGFkODQ4ZTE5LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNCksCQkweDdkMjhlMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfVElNSU5HXzMsCTB4OWMwYTlmNmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9BQ1QsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoMTYpLAkJMHgyMDZhMDE3YSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZKDIxKSwJCTB4MDAwMDA4NTksIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9CSU5fTUFTS18xLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfQklOX01BU0tfMiwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0JJTl9NQVNLXzMsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9CSU5fTUFTS19DVEwsIDB4MDA4MDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9BTlRfQ1RMLAkweDAwMDAwMDAxLCBBUjVLX0lOSV9XUklURSB9LAorCS8qeyBBUjVLX1BIWSg3MSksIDB4MDAwMDA5MmEsIEFSNUtfSU5JX1dSSVRFIH0sKi8gLyogT2xkIHZhbHVlICovCisJeyBBUjVLX1BIWV9NQVhfUlhfTEVOLAkweDAwMDAwYzgwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfSVEsCQkweDA1MTAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfV0FSTV9SRVNFVCwJMHgwMDAwMDAwMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0NUTCwJCTB4MDAwMDAwMDQsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9UWFBPV0VSX1JBVEUxLCAweDFlMWYyMDIyLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfVFhQT1dFUl9SQVRFMiwgMHgwYTBiMGMwZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1RYUE9XRVJfUkFURV9NQVgsIDB4MDAwMDAwM2YsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg4MiksCQkweDkyODBiMjEyLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUkFEQVIsCTB4NWQ1MGUxODgsIEFSNUtfSU5JX1dSSVRFIH0sCisJLyp7IEFSNUtfUEhZKDg2KSwgMHgwMDAwMDBmZiwgQVI1S19JTklfV1JJVEUgfSwqLworCXsgQVI1S19QSFkoODcpLAkJMHgwMDRiNmE4ZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX05GVEhSRVMsCTB4MDAwMDAzY2UsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9SRVNUQVJULAkweDE5MmZiNTE1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoOTQpLAkJMHgwMDAwMDAwMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1JGQlVTX1JFUSwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwkvKnsgQVI1S19QSFkoNjQ0KSwgMHgwMDgwYTMzMywgQVI1S19JTklfV1JJVEUgfSwqLyAvKiBPbGQgdmFsdWUgKi8KKwkvKnsgQVI1S19QSFkoNjQ1KSwgMHgwMDIwNmMxMCwgQVI1S19JTklfV1JJVEUgfSwqLyAvKiBPbGQgdmFsdWUgKi8KKwl7IEFSNUtfUEhZKDY0NCksCTB4MDA4MDYzMzMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg2NDUpLAkweDAwMTA2YzEwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNjQ2KSwJMHgwMDljNDA2MCwgQVI1S19JTklfV1JJVEUgfSwKKwkvKiB7IEFSNUtfUEhZKDY0NyksIDB4MTQ4MzgwMGEsIEFSNUtfSU5JX1dSSVRFIH0sICovCisJLyogeyBBUjVLX1BIWSg2NDgpLCAweDAxODMxMDYxLCBBUjVLX0lOSV9XUklURSB9LCAqLyAvKiBPbGQgdmFsdWUgKi8KKwl7IEFSNUtfUEhZKDY0OCksCTB4MDE4ODMwYzYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg2NDkpLAkweDAwMDAwNDAwLCBBUjVLX0lOSV9XUklURSB9LAorCS8qeyBBUjVLX1BIWSg2NTApLCAweDAwMDAwMWI1LCBBUjVLX0lOSV9XUklURSB9LCovCisJeyBBUjVLX1BIWSg2NTEpLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfVFhQT1dFUl9SQVRFMywgMHgyMDIwMjAyMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1RYUE9XRVJfUkFURTIsIDB4MjAyMDIwMjAsIEFSNUtfSU5JX1dSSVRFIH0sCisJLyp7IEFSNUtfUEhZKDY1NSksIDB4MTNjODg5YWYsIEFSNUtfSU5JX1dSSVRFIH0sKi8KKwl7IEFSNUtfUEhZKDY1NiksCTB4Mzg0OTBhMjAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWSg2NTcpLAkweDAwMDA3YmI2LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFkoNjU4KSwJMHgwZmZmM2ZmYywgQVI1S19JTklfV1JJVEUgfSwKK307CisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjEyIChXcml0dGVuIGJlZm9yZSBhcjUyMTJfaW5pKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfbW9kZSBhcjUyMTJfaW5pX21vZGVfc3RhcnRbXSA9IHsKKwl7IEFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUygwKSwKKwkvKglhL1hSCSAgIGFUdXJibwkgIGIJICAgZyAoRFlOKSAgICAgZ1R1cmJvICAgICAqLworCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiB9IH0sCisJeyBBUjVLX1FVRVVFX0RGU19MT0NBTF9JRlMoMSksCisJICAgeyAweDAwMmZmYzBmLCAweDAwMmZmYzBmLCAweDAwMmZmYzFmLCAweDAwMmZmYzBmLCAweDAwMmZmYzBmIH0gfSwKKwl7IEFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUygyKSwKKwkgICB7IDB4MDAyZmZjMGYsIDB4MDAyZmZjMGYsIDB4MDAyZmZjMWYsIDB4MDAyZmZjMGYsIDB4MDAyZmZjMGYgfSB9LAorCXsgQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKDMpLAorCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiB9IH0sCisJeyBBUjVLX1FVRVVFX0RGU19MT0NBTF9JRlMoNCksCisJICAgeyAweDAwMmZmYzBmLCAweDAwMmZmYzBmLCAweDAwMmZmYzFmLCAweDAwMmZmYzBmLCAweDAwMmZmYzBmIH0gfSwKKwl7IEFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUyg1KSwKKwkgICB7IDB4MDAyZmZjMGYsIDB4MDAyZmZjMGYsIDB4MDAyZmZjMWYsIDB4MDAyZmZjMGYsIDB4MDAyZmZjMGYgfSB9LAorCXsgQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKDYpLAorCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiB9IH0sCisJeyBBUjVLX1FVRVVFX0RGU19MT0NBTF9JRlMoNyksCisJICAgeyAweDAwMmZmYzBmLCAweDAwMmZmYzBmLCAweDAwMmZmYzFmLCAweDAwMmZmYzBmLCAweDAwMmZmYzBmIH0gfSwKKwl7IEFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUyg4KSwKKwkgICB7IDB4MDAyZmZjMGYsIDB4MDAyZmZjMGYsIDB4MDAyZmZjMWYsIDB4MDAyZmZjMGYsIDB4MDAyZmZjMGYgfSB9LAorCXsgQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKDkpLAorCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiwgMHgwMDJmZmMwZiB9IH0sCisJeyBBUjVLX0RDVV9HQkxfSUZTX1NJRlMsCisJICAgeyAweDAwMDAwMjMwLCAweDAwMDAwMWUwLCAweDAwMDAwMGIwLCAweDAwMDAwMTYwLCAweDAwMDAwMWUwIH0gfSwKKwl7IEFSNUtfRENVX0dCTF9JRlNfU0xPVCwKKwkgICB7IDB4MDAwMDAxNjgsIDB4MDAwMDAxZTAsIDB4MDAwMDAxYjgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTAgfSB9LAorCXsgQVI1S19EQ1VfR0JMX0lGU19FSUZTLAorCSAgIHsgMHgwMDAwMGU2MCwgMHgwMDAwMTE4MCwgMHgwMDAwMWYxYywgMHgwMDAwM2UzOCwgMHgwMDAwMTE4MCB9IH0sCisJeyBBUjVLX0RDVV9HQkxfSUZTX01JU0MsCisJICAgeyAweDAwMDBhMGUwLCAweDAwMDE0MDY4LCAweDAwMDA1ODgwLCAweDAwMDBiMGUwLCAweDAwMDE0MDY4IH0gfSwKKwl7IEFSNUtfVElNRV9PVVQsCisJICAgeyAweDAzZTgwM2U4LCAweDA2ZTAwNmUwLCAweDA0MjAwNDIwLCAweDA4NDAwODQwLCAweDA2ZTAwNmUwIH0gfSwKKwl7IEFSNUtfUEhZX1RVUkJPLAorCSAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMyB9IH0sCisJeyBBUjVLX1BIWSg4KSwKKwkgICB7IDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMTAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAgfSB9LAorCXsgQVI1S19QSFlfUkZfQ1RMMiwKKwkgICB7IDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDA3MDcsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSB9LAorCXsgQVI1S19QSFlfU0VUVExJTkcsCisJICAgeyAweDEzNzIxNjFjLCAweDEzNzIxYzI1LCAweDEzNzIxNzIyLCAweDEzNzIxNmEyLCAweDEzNzIxYzI1IH0gfSwKKwl7IEFSNUtfUEhZX0FHQ0NUTCwKKwkgICB7IDB4MDAwMDlkMTAsIDB4MDAwMDlkMTAsIDB4MDAwMDlkMTgsIDB4MDAwMDlkMTgsIDB4MDAwMDlkMTAgfSB9LAorCXsgQVI1S19QSFlfTkYsCisJICAgeyAweDAwMDFjZTAwLCAweDAwMDFjZTAwLCAweDAwMDFjZTAwLCAweDAwMDFjZTAwLCAweDAwMDFjZTAwIH0gfSwKKwl7IEFSNUtfUEhZX1dFQUtfT0ZETV9ISUdIX1RIUiwKKwkgICB7IDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAgfSB9LAorCXsgQVI1S19QSFkoNzApLAorCSAgIHsgMHgwMDAwMDFiOCwgMHgwMDAwMDFiOCwgMHgwMDAwMDA4NCwgMHgwMDAwMDEwOCwgMHgwMDAwMDFiOCB9IH0sCisJeyBBUjVLX1BIWV9PRkRNX1NFTEZDT1JSLAorCSAgIHsgMHgxMDA1OGEwNSwgMHgxMDA1OGEwNSwgMHgxMDA1OGEwNSwgMHgxMDA1OGEwNSwgMHgxMDA1OGEwNSB9IH0sCisJeyAweGEyMzAsCisJICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMTA4LCAweDAwMDAwMDAwIH0gfSwKK307CisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjEyICsgUkY1MTExIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIHJmNTExMV9pbmlfbW9kZV9lbmRbXSA9IHsKKwl7IEFSNUtfVFhDRkcsCisJLyoJYS9YUgkgICBhVHVyYm8JICBiCSAgIGcgKERZTikgICAgIGdUdXJibyAgICAgKi8KKwkgICB7IDB4MDAwMDgwMTUsIDB4MDAwMDgwMTUsIDB4MDAwMDgwMTUsIDB4MDAwMDgwMTUsIDB4MDAwMDgwMTUgfSB9LAorCXsgQVI1S19VU0VDXzUyMTEsCisJICAgeyAweDEyOGQ4ZmE3LCAweDA5ODgwZmNmLCAweDA0ZTAwZjk1LCAweDEyZTAwZmFiLCAweDA5ODgwZmNmIH0gfSwKKwl7IEFSNUtfUEhZX1JGX0NUTDMsCisJICAgeyAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDA1MDEwMTAwLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxIH0gfSwKKwl7IEFSNUtfUEhZX1JGX0NUTDQsCisJICAgeyAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlIH0gfSwKKwl7IEFSNUtfUEhZX1BBX0NUTCwKKwkgICB7IDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIgfSB9LAorCXsgQVI1S19QSFlfR0FJTiwKKwkgICB7IDB4MDAxOGRhNWEsIDB4MDAxOGRhNWEsIDB4MDAxOGNhNjksIDB4MDAxOGNhNjksIDB4MDAxOGNhNjkgfSB9LAorCXsgQVI1S19QSFlfREVTSVJFRF9TSVpFLAorCSAgIHsgMHgwZGU4YjRlMCwgMHgwZGU4YjRlMCwgMHgwZGU4YjRlMCwgMHgwZGU4YjRlMCwgMHgwZGU4YjRlMCB9IH0sCisJeyBBUjVLX1BIWV9TSUcsCisJICAgeyAweDdlODAwZDJlLCAweDdlODAwZDJlLCAweDdlZTg0ZDJlLCAweDdlZTg0ZDJlLCAweDdlODAwZDJlIH0gfSwKKwl7IEFSNUtfUEhZX0FHQ0NPQVJTRSwKKwkgICB7IDB4MzEzNzY2NWUsIDB4MzEzNzY2NWUsIDB4MzEzNzY2NWUsIDB4MzEzNzY2NWUsIDB4MzEzNzYxNWUgfSB9LAorCXsgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFIsCisJICAgeyAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgwLCAweDA1MGNiMDgwIH0gfSwKKwl7IEFSNUtfUEhZX1JYX0RFTEFZLAorCSAgIHsgMHgwMDAwMjcxMCwgMHgwMDAwMjcxMCwgMHgwMDAwMTU3YywgMHgwMDAwMmFmOCwgMHgwMDAwMjcxMCB9IH0sCisJeyBBUjVLX1BIWV9GUkFNRV9DVExfNTIxMSwKKwkgICB7IDB4ZjdiODEwMjAsIDB4ZjdiODEwMjAsIDB4ZjdiODBkMjAsIDB4ZjdiODEwMjAsIDB4ZjdiODEwMjAgfSB9LAorCXsgQVI1S19QSFlfR0FJTl8yR0haLAorCSAgIHsgMHg2NDJjNDE2YSwgMHg2NDJjNDE2YSwgMHg2NDQwNDE2YSwgMHg2NDQwNDE2YSwgMHg2NDQwNDE2YSB9IH0sCisJeyBBUjVLX1BIWV9DQ0tfUlhfQ1RMXzQsCisJICAgeyAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4NzM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhIH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pIHJmNTExMV9pbmlfY29tbW9uX2VuZFtdID0geworCXsgQVI1S19EQ1VfRlAsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfQUdDLCAJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0FEQ19DVEwsIAkweDAwMDIyZmZlLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg5ODNjLCAJCTB4MDAwMjAxMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9HQUlOX09GRlNFVCwJMHgxMjg0NjEzYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1BBUERfUFJPQkUsCTB4MDAwMDQ4ODMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweDk5NDAsCQkweDAwMDAwMDA0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg5OTU4LAkJMHgwMDAwMDBmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTk3NCwJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TUEVORElORywJMHgwMDAwMDAxOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0NDS1RYQ1RMLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfQ0NLX0NST1NTQ09SUiwgMHhkMDNlNjc4OCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0RBR19DQ0tfQ1RMLAkweDAwMDAwMWI1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjNjLAkJMHgxM2M4ODlhZiwgQVI1S19JTklfV1JJVEUgfSwKK307CisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjEyICsgUkY1MTEyIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIHJmNTExMl9pbmlfbW9kZV9lbmRbXSA9IHsKKwl7IEFSNUtfVFhDRkcsCisJLyoJYS9YUgkgICBhVHVyYm8JICBiCSAgIGcgKERZTikgICAgIGdUdXJibyAgICAgKi8KKwkgICB7IDB4MDAwMDgwMTUsIDB4MDAwMDgwMTUsIDB4MDAwMDgwMTUsIDB4MDAwMDgwMTUsIDB4MDAwMDgwMTUgfSB9LAorCXsgQVI1S19VU0VDXzUyMTEsCisJICAgeyAweDEyOGQ5M2E3LCAweDA5ODgxM2NmLCAweDA0ZTAxMzk1LCAweDEyZTAxM2FiLCAweDA5ODgxM2NmIH0gfSwKKwl7IEFSNUtfUEhZX1JGX0NUTDMsCisJICAgeyAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDA1MDIwMTAwLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxIH0gfSwKKwl7IEFSNUtfUEhZX1JGX0NUTDQsCisJICAgeyAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlIH0gfSwKKwl7IEFSNUtfUEhZX1BBX0NUTCwKKwkgICB7IDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIgfSB9LAorCXsgQVI1S19QSFlfR0FJTiwKKwkgICB7IDB4MDAxOGRhNmQsIDB4MDAxOGRhNmQsIDB4MDAxOGNhNzUsIDB4MDAxOGNhNzUsIDB4MDAxOGNhNzUgfSB9LAorCXsgQVI1S19QSFlfREVTSVJFRF9TSVpFLAorCSAgIHsgMHgwZGU4YjRlMCwgMHgwZGU4YjRlMCwgMHgwZGU4YjRlMCwgMHgwZGU4YjRlMCwgMHgwZGU4YjRlMCB9IH0sCisJeyBBUjVLX1BIWV9TSUcsCisJICAgeyAweDdlODAwZDJlLCAweDdlODAwZDJlLCAweDdlZTgwZDJlLCAweDdlZTgwZDJlLCAweDdlODAwZDJlIH0gfSwKKwl7IEFSNUtfUEhZX0FHQ0NPQVJTRSwKKwkgICB7IDB4MzEzNzY2NWUsIDB4MzEzNzY2NWUsIDB4MzEzNzY2NWUsIDB4MzEzNzY2NWUsIDB4MzEzNzY2NWUgfSB9LAorCXsgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFIsCisJICAgeyAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxIH0gfSwKKwl7IEFSNUtfUEhZX1JYX0RFTEFZLAorCSAgIHsgMHgwMDAwMDdkMCwgMHgwMDAwMDdkMCwgMHgwMDAwMDQ0YywgMHgwMDAwMDg5OCwgMHgwMDAwMDdkMCB9IH0sCisJeyBBUjVLX1BIWV9GUkFNRV9DVExfNTIxMSwKKwkgICB7IDB4ZjdiODEwMjAsIDB4ZjdiODEwMjAsIDB4ZjdiODBkMTAsIDB4ZjdiODEwMTAsIDB4ZjdiODEwMTAgfSB9LAorCXsgQVI1S19QSFlfQ0NLVFhDVEwsCisJICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDA4LCAweDAwMDAwMDA4LCAweDAwMDAwMDA4IH0gfSwKKwl7IEFSNUtfUEhZX0NDS19DUk9TU0NPUlIsCisJICAgeyAweGQ2YmU2Nzg4LCAweGQ2YmU2Nzg4LCAweGQwM2U2Nzg4LCAweGQwM2U2Nzg4LCAweGQwM2U2Nzg4IH0gfSwKKwl7IEFSNUtfUEhZX0dBSU5fMkdIWiwKKwkgICB7IDB4NjQyYzAxNDAsIDB4NjQyYzAxNDAsIDB4NjQ0MmMxNjAsIDB4NjQ0MmMxNjAsIDB4NjQ0MmMxNjAgfSB9LAorCXsgQVI1S19QSFlfQ0NLX1JYX0NUTF80LAorCSAgIHsgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODczODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSB9IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaSByZjUxMTJfaW5pX2NvbW1vbl9lbmRbXSA9IHsKKwl7IEFSNUtfRENVX0ZQLAkJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0FHQywJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9BRENfQ1RMLAkweDAwMDIyZmZlLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg5ODNjLAkJMHgwMDAyMDEwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0dBSU5fT0ZGU0VULAkweDEyODQ2MTNjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfUEFQRF9QUk9CRSwJMHgwMDAwNDg4MiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTk0MCwJCTB4MDAwMDAwMDQsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweDk5NTgsCQkweDAwMDAwMGZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg5OTc0LAkJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0RBR19DQ0tfQ1RMLAkweDAwMDAwMWI1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjNjLAkJMHgxM2M4ODlhZiwgQVI1S19JTklfV1JJVEUgfSwKK307CisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgUkY1NDEzLzU0MTQgKFdyaXR0ZW4gYWZ0ZXIgYXI1MjEyX2luaSkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgcmY1NDEzX2luaV9tb2RlX2VuZFtdID0geworCXsgQVI1S19UWENGRywKKwkvKglhL1hSCSAgIGFUdXJibwkgIGIJICAgZyAoRFlOKSAgICAgZ1R1cmJvICAgICAqLworCSAgIHsgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSB9IH0sCisJeyBBUjVLX1VTRUNfNTIxMSwKKwkgICB7IDB4MTI4ZDkzYTcsIDB4MDk4ODEzY2YsIDB4MDRlMDEzOTUsIDB4MTJlMDEzYWIsIDB4MDk4ODEzY2YgfSB9LAorCXsgQVI1S19QSFlfUkZfQ1RMMywKKwkgICB7IDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MDUwMjAxMDAsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEgfSB9LAorCXsgQVI1S19QSFlfUkZfQ1RMNCwKKwkgICB7IDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSB9LAorCXsgQVI1S19QSFlfUEFfQ1RMLAorCSAgIHsgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwYiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAwYiB9IH0sCisJeyBBUjVLX1BIWV9HQUlOLAorCSAgIHsgMHgwMDE4ZmE2MSwgMHgwMDE4ZmE2MSwgMHgwMDFhMWE2MywgMHgwMDFhMWE2MywgMHgwMDFhMWE2MyB9IH0sCisJeyBBUjVLX1BIWV9ERVNJUkVEX1NJWkUsCisJICAgeyAweDBjOThiNGUwLCAweDBjOThiNGUwLCAweDBjOThiMGRhLCAweDBjOThiMGRhLCAweDBjOThiMGRhIH0gfSwKKwl7IEFSNUtfUEhZX1NJRywKKwkgICB7IDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUgfSB9LAorCXsgQVI1S19QSFlfQUdDQ09BUlNFLAorCSAgIHsgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSB9IH0sCisJeyBBUjVLX1BIWV9XRUFLX09GRE1fTE9XX1RIUiwKKwkgICB7IDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEgfSB9LAorCXsgQVI1S19QSFlfUlhfREVMQVksCisJICAgeyAweDAwMDAwN2QwLCAweDAwMDAwN2QwLCAweDAwMDAwNDRjLCAweDAwMDAwODk4LCAweDAwMDAwN2QwIH0gfSwKKwl7IEFSNUtfUEhZX0ZSQU1FX0NUTF81MjExLAorCSAgIHsgMHhmN2I4MTAwMCwgMHhmN2I4MTAwMCwgMHhmN2I4MGQwMCwgMHhmN2I4MTAwMCwgMHhmN2I4MTAwMCB9IH0sCisJeyBBUjVLX1BIWV9DQ0tUWENUTCwKKwkgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgQVI1S19QSFlfQ0NLX0NST1NTQ09SUiwKKwkgICB7IDB4ZDZiZTY3ODgsIDB4ZDZiZTY3ODgsIDB4ZDAzZTY3ODgsIDB4ZDAzZTY3ODgsIDB4ZDAzZTY3ODggfSB9LAorCXsgQVI1S19QSFlfR0FJTl8yR0haLAorCSAgIHsgMHgwMDJlYzFlMCwgMHgwMDJlYzFlMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCB9IH0sCisJeyBBUjVLX1BIWV9DQ0tfUlhfQ1RMXzQsCisJICAgeyAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4NjM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhIH0gfSwKKwl7IDB4YTMwMCwKKwkgICB7IDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAgfSB9LAorCXsgMHhhMzA0LAorCSAgIHsgMHgzMDAzMjYwMiwgMHgzMDAzMjYwMiwgMHgzMDAzMjYwMiwgMHgzMDAzMjYwMiwgMHgzMDAzMjYwMiB9IH0sCisJeyAweGEzMDgsCisJICAgeyAweDQ4MDczZTA2LCAweDQ4MDczZTA2LCAweDQ4MDczZTA2LCAweDQ4MDczZTA2LCAweDQ4MDczZTA2IH0gfSwKKwl7IDB4YTMwYywKKwkgICB7IDB4NTYwYjRjMGEsIDB4NTYwYjRjMGEsIDB4NTYwYjRjMGEsIDB4NTYwYjRjMGEsIDB4NTYwYjRjMGEgfSB9LAorCXsgMHhhMzEwLAorCSAgIHsgMHg2NDFhNjAwZiwgMHg2NDFhNjAwZiwgMHg2NDFhNjAwZiwgMHg2NDFhNjAwZiwgMHg2NDFhNjAwZiB9IH0sCisJeyAweGEzMTQsCisJICAgeyAweDc4NGY2ZTFiLCAweDc4NGY2ZTFiLCAweDc4NGY2ZTFiLCAweDc4NGY2ZTFiLCAweDc4NGY2ZTFiIH0gfSwKKwl7IDB4YTMxOCwKKwkgICB7IDB4ODY4ZjdjNWEsIDB4ODY4ZjdjNWEsIDB4ODY4ZjdjNWEsIDB4ODY4ZjdjNWEsIDB4ODY4ZjdjNWEgfSB9LAorCXsgMHhhMzFjLAorCSAgIHsgMHg5MGNmODY1YiwgMHg5MGNmODY1YiwgMHg4ZWNmODY1YiwgMHg4ZWNmODY1YiwgMHg4ZWNmODY1YiB9IH0sCisJeyAweGEzMjAsCisJICAgeyAweDlkNGY5NzBmLCAweDlkNGY5NzBmLCAweDliNGY5NzBmLCAweDliNGY5NzBmLCAweDliNGY5NzBmIH0gfSwKKwl7IDB4YTMyNCwKKwkgICB7IDB4YTdjZmEzOGYsIDB4YTdjZmEzOGYsIDB4YTNjZjlmOGYsIDB4YTNjZjlmOGYsIDB4YTNjZjlmOGYgfSB9LAorCXsgMHhhMzI4LAorCSAgIHsgMHhiNTVmYWYxZiwgMHhiNTVmYWYxZiwgMHhiMzVmYWYxZiwgMHhiMzVmYWYxZiwgMHhiMzVmYWYxZiB9IH0sCisJeyAweGEzMmMsCisJICAgeyAweGJkZGZiOTlmLCAweGJkZGZiOTlmLCAweGJiZGZiOTlmLCAweGJiZGZiOTlmLCAweGJiZGZiOTlmIH0gfSwKKwl7IDB4YTMzMCwKKwkgICB7IDB4Y2I3ZmM1M2YsIDB4Y2I3ZmM1M2YsIDB4Y2I3ZmM3M2YsIDB4Y2I3ZmM3M2YsIDB4Y2I3ZmM3M2YgfSB9LAorCXsgMHhhMzM0LAorCSAgIHsgMHhkNWZmZDFiZiwgMHhkNWZmZDFiZiwgMHhkM2ZmZDFiZiwgMHhkM2ZmZDFiZiwgMHhkM2ZmZDFiZiB9IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaSByZjU0MTNfaW5pX2NvbW1vbl9lbmRbXSA9IHsKKwl7IEFSNUtfRENVX0ZQLAkJMHgwMDAwMDNlMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfNTQxNF9DQkNGRywJMHgwMDAwMDAxMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfU0VRX01BU0ssCTB4MDAwMDAwMGYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweDgwOWMsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg4MGEwLAkJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfTUlDX1FPU19DVEwsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX01JQ19RT1NfU0VMLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19NSVNDX01PREUsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX09GRE1fRklMX0NOVCwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQ0NLX0ZJTF9DTlQsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWUVSUl9DTlQxLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlFUlJfQ05UMV9NQVNLLCAweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlFUlJfQ05UMiwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZRVJSX0NOVDJfTUFTSywgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVFNGX1RIUkVTLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg4MTQwLAkJMHg4MDAwMDNmOSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4ODE0NCwJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9BR0MsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfQURDX0NUTCwJMHgwMDAwYTAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTgzYywJCTB4MDAyMDA0MDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9HQUlOX09GRlNFVCwgMHgxMjg0MjMzYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1NDUiwJCTB4MDAwMDAwMWYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TTE1ULAkweDAwMDAwMDgwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfU0NBTCwJMHgwMDAwMDAwZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTk1OCwJCTB4MDAwODFmZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9USU1JTkdfNywJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1RJTUlOR184LAkweDAyODAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfVElNSU5HXzExLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfSEVBVllfQ0xJUF9FTkFCTEUsIDB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweDk5ZTQsCQkweGFhYWFhYWFhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg5OWU4LAkJMHgzYzQ2NjQ3OCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTllYywJCTB4MDAwMDAwYWEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TQ0xPQ0ssCTB4MDAwMDAwMGMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TREVMQVksCTB4MDAwMDAwZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TUEVORElORywJMHgwMDAwMDAxNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0RBR19DQ0tfQ1RMLCAweDAwMDAwOWI1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjNjLAkJMHg5M2M4ODlhZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0ZBU1RfQURDLAkweDAwMDAwMDAxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjUwLAkJMHgwMDAwYTAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0JMVUVUT09USCwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1RQQ19SRzEsCTB4MGNjNzUzODAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweGEyNWMsCQkweDBmMGYwZjAxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjYwLAkJMHg1ZjY5MGYwMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI2NCwJCTB4MDA0MThhMTEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweGEyNjgsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfVFBDX1JHNSwJMHgwYzMwYzE2YSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3MCwgMHgwMDgyMDgyMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3NCwgMHgwODFiN2NhYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3OCwgMHgxY2U3MzljZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3YywgMHgwNTE3MDFjZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMzOCwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMzYywgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0MCwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0NCwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0OCwgMHgzZmZmZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0YywgMHgzZmZmZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1MCwgMHgzZmZmZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1NCwgMHgwMDAzZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1OCwgMHg3OWE4YWExZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1YywgMHgwNjZjNDIwZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2MCwgMHgwZjI4MjIwNywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2NCwgMHgxNzYwMTY4NSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2OCwgMHgxZjgwMTEwNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2YywgMHgzN2EwMGMwMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3MCwgMHgzZmM0MDg4MywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3NCwgMHg1N2MwMDgwMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3OCwgMHg1ZmQ4MDY4MiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3YywgMHg3ZmUwMDQ4MiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM4MCwgMHg3ZjNjN2JiYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM4NCwgMHhmMzMwN2ZmMCwgQVI1S19JTklfV1JJVEUgfSwKK307CisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgUkYyNDEzLzI0MTQgKFdyaXR0ZW4gYWZ0ZXIgYXI1MjEyX2luaSkgKi8KKy8qIFhYWDogYSBtb2RlID8gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgcmYyNDEzX2luaV9tb2RlX2VuZFtdID0geworCXsgQVI1S19UWENGRywKKwkvKglhL1hSCSAgIGFUdXJibwkgIGIJICAgZyAoRFlOKSAgICAgZ1R1cmJvICAgICAqLworCSAgIHsgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSB9IH0sCisJeyBBUjVLX1VTRUNfNTIxMSwKKwkgICB7IDB4MTI4ZDkzYTcsIDB4MDk4ODEzY2YsIDB4MDRlMDEzOTUsIDB4MTJlMDEzYWIsIDB4MDk4ODEzY2YgfSB9LAorCXsgQVI1S19QSFlfUkZfQ1RMMywKKwkgICB7IDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MDUwMjAwMDAsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEgfSB9LAorCXsgQVI1S19QSFlfUkZfQ1RMNCwKKwkgICB7IDB4MDAwMDBlMDAsIDB4MDAwMDBlMDAsIDB4MDAwMDBlMDAsIDB4MDAwMDBlMDAsIDB4MDAwMDBlMDAgfSB9LAorCXsgQVI1S19QSFlfUEFfQ1RMLAorCSAgIHsgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwYSB9IH0sCisJeyBBUjVLX1BIWV9HQUlOLAorCSAgIHsgMHgwMDE4ZGE2ZCwgMHgwMDE4ZGE2ZCwgMHgwMDFhNmE2NCwgMHgwMDFhNmE2NCwgMHgwMDFhNmE2NCB9IH0sCisJeyBBUjVLX1BIWV9ERVNJUkVEX1NJWkUsCisJICAgeyAweDBkZThiNGUwLCAweDBkZThiNGUwLCAweDBkZThiMGRhLCAweDBjOThiMGRhLCAweDBkZThiMGRhIH0gfSwKKwl7IEFSNUtfUEhZX1NJRywKKwkgICB7IDB4N2U4MDBkMmUsIDB4N2U4MDBkMmUsIDB4N2VlODBkMmUsIDB4N2VjODBkMmUsIDB4N2U4MDBkMmUgfSB9LAorCXsgQVI1S19QSFlfQUdDQ09BUlNFLAorCSAgIHsgMHgzMTM3NjY1ZSwgMHgzMTM3NjY1ZSwgMHgzMTM3NjY1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM3NjY1ZSB9IH0sCisJeyBBUjVLX1BIWV9XRUFLX09GRE1fTE9XX1RIUiwKKwkgICB7IDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEgfSB9LAorCXsgQVI1S19QSFlfUlhfREVMQVksCisJICAgeyAweDAwMDAwN2QwLCAweDAwMDAwN2QwLCAweDAwMDAwNDRjLCAweDAwMDAwODk4LCAweDAwMDAwN2QwIH0gfSwKKwl7IEFSNUtfUEhZX0ZSQU1FX0NUTF81MjExLAorCSAgIHsgMHhmN2I4MTAwMCwgMHhmN2I4MTAwMCwgMHhmN2I4MGQwMCwgMHhmN2I4MTAwMCwgMHhmN2I4MTAwMCB9IH0sCisJeyBBUjVLX1BIWV9DQ0tUWENUTCwKKwkgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgQVI1S19QSFlfQ0NLX0NST1NTQ09SUiwKKwkgICB7IDB4ZDZiZTY3ODgsIDB4ZDZiZTY3ODgsIDB4ZDAzZTY3ODgsIDB4ZDAzZTY3ODgsIDB4ZDAzZTY3ODggfSB9LAorCXsgQVI1S19QSFlfR0FJTl8yR0haLAorCSAgIHsgMHgwMDJjMDE0MCwgMHgwMDJjMDE0MCwgMHgwMDQyYzE0MCwgMHgwMDQyYzE0MCwgMHgwMDQyYzE0MCB9IH0sCisJeyBBUjVLX1BIWV9DQ0tfUlhfQ1RMXzQsCisJICAgeyAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4NjM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhIH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pIHJmMjQxM19pbmlfY29tbW9uX2VuZFtdID0geworCXsgQVI1S19EQ1VfRlAsCQkweDAwMDAwM2UwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19TRVFfTUFTSywJMHgwMDAwMDAwZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfTUlDX1FPU19DVEwsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX01JQ19RT1NfU0VMLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19NSVNDX01PREUsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX09GRE1fRklMX0NOVCwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQ0NLX0ZJTF9DTlQsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWUVSUl9DTlQxLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlFUlJfQ05UMV9NQVNLLCAweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlFUlJfQ05UMiwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZRVJSX0NOVDJfTUFTSywgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVFNGX1RIUkVTLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg4MTQwLAkJMHg4MDAwMDBhOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4ODE0NCwJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9BR0MsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfQURDX0NUTCwJMHgwMDAwYTAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTgzYywJCTB4MDAyMDA0MDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9HQUlOX09GRlNFVCwJMHgxMjg0MjMzYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1NDUiwJCTB4MDAwMDAwMWYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TTE1ULAkweDAwMDAwMDgwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfU0NBTCwJMHgwMDAwMDAwZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTk1OCwJCTB4MDAwMDAwZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9USU1JTkdfNywJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1RJTUlOR184LAkweDAyODAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfVElNSU5HXzExLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfSEVBVllfQ0xJUF9FTkFCTEUsIDB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweDk5ZTQsCQkweGFhYWFhYWFhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg5OWU4LAkJMHgzYzQ2NjQ3OCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTllYywJCTB4MDAwMDAwYWEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TQ0xPQ0ssCTB4MDAwMDAwMGMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TREVMQVksCTB4MDAwMDAwZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TUEVORElORywJMHgwMDAwMDAxNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0RBR19DQ0tfQ1RMLAkweDAwMDAwOWI1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjNjLAkJMHg5M2M4ODlhZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0ZBU1RfQURDLAkweDAwMDAwMDAxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjUwLAkJMHgwMDAwYTAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0JMVUVUT09USCwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1RQQ19SRzEsCTB4MGNjNzUzODAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweGEyNWMsCQkweDBmMGYwZjAxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjYwLAkJMHg1ZjY5MGYwMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI2NCwJCTB4MDA0MThhMTEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweGEyNjgsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfVFBDX1JHNSwJMHgwYzMwYzE2YSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3MCwgMHgwMDgyMDgyMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3NCwgMHgwMDFiN2NhYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3OCwgMHgxY2U3MzljZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3YywgMHgwNTE3MDFjZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMwMCwgMHgxODAxMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMwNCwgMHgzMDAzMjYwMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMwOCwgMHg0ODA3M2UwNiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMwYywgMHg1NjBiNGMwYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMxMCwgMHg2NDFhNjAwZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMxNCwgMHg3ODRmNmUxYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMxOCwgMHg4NjhmN2M1YSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMxYywgMHg4ZWNmODY1YiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMyMCwgMHg5ZDRmOTcwZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMyNCwgMHhhNWNmYTE4ZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMyOCwgMHhiNTVmYWYxZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMyYywgMHhiZGRmYjk5ZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMzMCwgMHhjZDdmYzczZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMzNCwgMHhkNWZmZDFiZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMzOCwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMzYywgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0MCwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0NCwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0OCwgMHgzZmZmZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0YywgMHgzZmZmZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1MCwgMHgzZmZmZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1NCwgMHgwMDAzZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1OCwgMHg3OWE4YWExZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1YywgMHgwNjZjNDIwZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2MCwgMHgwZjI4MjIwNywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2NCwgMHgxNzYwMTY4NSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2OCwgMHgxZjgwMTEwNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2YywgMHgzN2EwMGMwMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3MCwgMHgzZmM0MDg4MywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3NCwgMHg1N2MwMDgwMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3OCwgMHg1ZmQ4MDY4MiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3YywgMHg3ZmUwMDQ4MiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM4MCwgMHg3ZjNjN2JiYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM4NCwgMHhmMzMwN2ZmMCwgQVI1S19JTklfV1JJVEUgfSwKK307CisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgUkYyNDI1IChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisvKiBYWFg6IGEgbW9kZSA/ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIHJmMjQyNV9pbmlfbW9kZV9lbmRbXSA9IHsKKwl7IEFSNUtfVFhDRkcsCisJLyoJYS9YUgkgICBhVHVyYm8JICBiCSAgIGcgKERZTikgICAgIGdUdXJibyAgICAgKi8KKwkgICB7IDB4MDAwMDAwMTUsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMTUgfSB9LAorCXsgQVI1S19VU0VDXzUyMTEsCisJICAgeyAweDEyOGQ5M2E3LCAweDA5ODgxM2NmLCAweDA0ZTAxMzk1LCAweDEyZTAxM2FiLCAweDA5ODgxM2NmIH0gfSwKKwl7IEFSNUtfUEhZX1RVUkJPLAorCSAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSB9IH0sCisJeyBBUjVLX1BIWV9SRl9DVEwzLAorCSAgIHsgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwNTAyMDEwMCwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSB9IH0sCisJeyBBUjVLX1BIWV9SRl9DVEw0LAorCSAgIHsgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSB9IH0sCisJeyBBUjVLX1BIWV9QQV9DVEwsCisJICAgeyAweDAwMDAwMDAzLCAweDAwMDAwMDAzLCAweDAwMDAwMDBiLCAweDAwMDAwMDBiLCAweDAwMDAwMDBiIH0gfSwKKwl7IEFSNUtfUEhZX1NFVFRMSU5HLAorCSAgIHsgMHgxMzcyMTYxYywgMHgxMzcyMWMyNSwgMHgxMzcyMTcyMiwgMHgxMzcyMTQyMiwgMHgxMzcyMWMyNSB9IH0sCisJeyBBUjVLX1BIWV9HQUlOLAorCSAgIHsgMHgwMDE4ZmE2MSwgMHgwMDE4ZmE2MSwgMHgwMDE5OWE2NSwgMHgwMDE5OWE2NSwgMHgwMDE5OWE2NSB9IH0sCisJeyBBUjVLX1BIWV9ERVNJUkVEX1NJWkUsCisJICAgeyAweDBjOThiNGUwLCAweDBjOThiNGUwLCAweDBjOThiMGRhLCAweDBjOThiMGRhLCAweDBjOThiMGRhIH0gfSwKKwl7IEFSNUtfUEhZX1NJRywKKwkgICB7IDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUgfSB9LAorCXsgQVI1S19QSFlfQUdDQ09BUlNFLAorCSAgIHsgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSB9IH0sCisJeyBBUjVLX1BIWV9XRUFLX09GRE1fTE9XX1RIUiwKKwkgICB7IDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEgfSB9LAorCXsgQVI1S19QSFlfUlhfREVMQVksCisJICAgeyAweDAwMDAwN2QwLCAweDAwMDAwN2QwLCAweDAwMDAwNDRjLCAweDAwMDAwODk4LCAweDAwMDAwN2QwIH0gfSwKKwl7IEFSNUtfUEhZX0ZSQU1FX0NUTF81MjExLAorCSAgIHsgMHhmN2I4MTAwMCwgMHhmN2I4MTAwMCwgMHhmN2I4MGQwMCwgMHhmN2I4MTAwMCwgMHhmN2I4MTAwMCB9IH0sCisJeyBBUjVLX1BIWV9DQ0tUWENUTCwKKwkgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgQVI1S19QSFlfQ0NLX0NST1NTQ09SUiwKKwkgICB7IDB4ZDZiZTY3ODgsIDB4ZDZiZTY3ODgsIDB4ZDAzZTY3ODgsIDB4ZDAzZTY3ODgsIDB4ZDAzZTY3ODggfSB9LAorCXsgQVI1S19QSFlfR0FJTl8yR0haLAorCSAgIHsgMHgwMDAwMDE0MCwgMHgwMDAwMDE0MCwgMHgwMDUyYzE0MCwgMHgwMDUyYzE0MCwgMHgwMDUyYzE0MCB9IH0sCisJeyBBUjVLX1BIWV9DQ0tfUlhfQ1RMXzQsCisJICAgeyAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4NjM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhIH0gfSwKKwl7IDB4YTMyNCwKKwkgICB7IDB4YTdjZmE3Y2YsIDB4YTdjZmE3Y2YsIDB4YTdjZmE3Y2YsIDB4YTdjZmE3Y2YsIDB4YTdjZmE3Y2YgfSB9LAorCXsgMHhhMzI4LAorCSAgIHsgMHhhN2NmYTdjZiwgMHhhN2NmYTdjZiwgMHhhN2NmYTdjZiwgMHhhN2NmYTdjZiwgMHhhN2NmYTdjZiB9IH0sCisJeyAweGEzMmMsCisJICAgeyAweGE3Y2ZhN2NmLCAweGE3Y2ZhN2NmLCAweGE3Y2ZhN2NmLCAweGE3Y2ZhN2NmLCAweGE3Y2ZhN2NmIH0gfSwKKwl7IDB4YTMzMCwKKwkgICB7IDB4YTdjZmE3Y2YsIDB4YTdjZmE3Y2YsIDB4YTdjZmE3Y2YsIDB4YTdjZmE3Y2YsIDB4YTdjZmE3Y2YgfSB9LAorCXsgMHhhMzM0LAorCSAgIHsgMHhhN2NmYTdjZiwgMHhhN2NmYTdjZiwgMHhhN2NmYTdjZiwgMHhhN2NmYTdjZiwgMHhhN2NmYTdjZiB9IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaSByZjI0MjVfaW5pX2NvbW1vbl9lbmRbXSA9IHsKKwl7IEFSNUtfRENVX0ZQLAkJMHgwMDAwMDNlMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfU0VRX01BU0ssCTB4MDAwMDAwMGYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweDgwOWMsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg4MGEwLAkJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfTUlDX1FPU19DVEwsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX01JQ19RT1NfU0VMLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19NSVNDX01PREUsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX09GRE1fRklMX0NOVCwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQ0NLX0ZJTF9DTlQsCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWUVSUl9DTlQxLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlFUlJfQ05UMV9NQVNLLCAweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlFUlJfQ05UMiwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZRVJSX0NOVDJfTUFTSywgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfVFNGX1RIUkVTLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg4MTQwLAkJMHg4MDAwMDNmOSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4ODE0NCwJCTB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9BR0MsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfQURDX0NUTCwJMHgwMDAwYTAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTgzYywJCTB4MDAyMDA0MDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9HQUlOX09GRlNFVCwgMHgxMjg0MjMzYywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1NDUiwJCTB4MDAwMDAwMWYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9TTE1ULAkweDAwMDAwMDgwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfU0NBTCwJMHgwMDAwMDAwZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTk1OCwJCTB4MDAwODFmZmYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9USU1JTkdfNywJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1RJTUlOR184LAkweDAyODAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfVElNSU5HXzExLAkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg5OWRjLAkJMHhmZWJhZGJlOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0hFQVZZX0NMSVBfRU5BQkxFLCAweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHg5OWU0LAkJMHhhYWFhYWFhYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4OTllOCwJCTB4M2M0NjY0NzgsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweDk5ZWMsCQkweDAwMDAwMGFhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfU0NMT0NLLAkweDAwMDAwMDBjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfU0RFTEFZLAkweDAwMDAwMGZmLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfU1BFTkRJTkcsCTB4MDAwMDAwMTQsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9EQUdfQ0NLX0NUTCwJMHgwMDAwMDliNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1RYUE9XRVJfUkFURTMsIDB4MjAyMDIwMjAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX1BIWV9UWFBPV0VSX1JBVEU0LCAweDIwMjAyMDIwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjNjLAkJMHg5M2M4ODlhZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0ZBU1RfQURDLAkweDAwMDAwMDAxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjUwLAkJMHgwMDAwYTAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX0JMVUVUT09USCwJMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfUEhZX1RQQ19SRzEsCTB4MGNjNzUzODAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweGEyNWMsCQkweDBmMGYwZjAxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgMHhhMjYwLAkJMHg1ZjY5MGYwMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI2NCwJCTB4MDA0MThhMTEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyAweGEyNjgsCQkweDAwMDAwMDAwLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19QSFlfVFBDX1JHNSwJMHgwYzMwYzE2NiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3MCwgMHgwMDgyMDgyMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3NCwgMHgwODFhM2NhYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3OCwgMHgxY2U3MzljZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTI3YywgMHgwNTE3MDFjZSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMwMCwgMHgxNjAxMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMwNCwgMHgyYzAzMjQwMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMwOCwgMHg0ODQzM2U0MiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMwYywgMHg1YTBmNTAwYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMxMCwgMHg2YzRiNjI0YSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMxNCwgMHg3ZThiNzQ4YSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMxOCwgMHg5NmNmOGNjYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMxYywgMHhhMzRmOWQwZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTMyMCwgMHhhN2NmYTU4ZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0OCwgMHgzZmZmZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM0YywgMHgzZmZmZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1MCwgMHgzZmZmZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1NCwgMHgwMDAzZmZmZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1OCwgMHg3OWE4YWExZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM1YywgMHgwNjZjNDIwZiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2MCwgMHgwZjI4MjIwNywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2NCwgMHgxNzYwMTY4NSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2OCwgMHgxZjgwMTEwNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM2YywgMHgzN2EwMGMwMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3MCwgMHgzZmM0MDg4MywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3NCwgMHg1N2MwMDgwMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3OCwgMHg1ZmQ4MDY4MiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM3YywgMHg3ZmUwMDQ4MiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM4MCwgMHg3ZjNjN2JiYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IDB4YTM4NCwgMHhmMzMwN2ZmMCwgQVI1S19JTklfV1JJVEUgfSwKK307CisKKy8qCisgKiBJbml0aWFsIEJhc2VCYW5kIEdhaW4gc2V0dGluZ3MgZm9yIFJGNTExMS81MTEyIChBUjUyMTAgY29tZXMgd2l0aAorICogUkY1MTEwIG9ubHkgc28gaW5pdGlhbCBCQiBHYWluIHNldHRpbmdzIGFyZSBpbmNsdWRlZCBpbiBBUjVLX0FSNTIxMF9JTkkpCisgKi8KKworLyogUkY1MTExIEluaXRpYWwgQmFzZUJhbmQgR2FpbiBzZXR0aW5ncyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmkgcmY1MTExX2luaV9iYmdhaW5bXSA9IHsKKwl7IEFSNUtfQkJfR0FJTigwKSwgMHgwMDAwMDAwMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxKSwgMHgwMDAwMDAyMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyKSwgMHgwMDAwMDAxMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzKSwgMHgwMDAwMDAzMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0KSwgMHgwMDAwMDAwOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1KSwgMHgwMDAwMDAyOCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig2KSwgMHgwMDAwMDAwNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig3KSwgMHgwMDAwMDAyNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig4KSwgMHgwMDAwMDAxNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig5KSwgMHgwMDAwMDAzNCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxMCksIDB4MDAwMDAwMGMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTEpLCAweDAwMDAwMDJjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDEyKSwgMHgwMDAwMDAwMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxMyksIDB4MDAwMDAwMjIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTQpLCAweDAwMDAwMDEyLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDE1KSwgMHgwMDAwMDAzMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxNiksIDB4MDAwMDAwMGEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTcpLCAweDAwMDAwMDJhLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDE4KSwgMHgwMDAwMDAwNiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxOSksIDB4MDAwMDAwMjYsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjApLCAweDAwMDAwMDE2LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDIxKSwgMHgwMDAwMDAzNiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyMiksIDB4MDAwMDAwMGUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjMpLCAweDAwMDAwMDJlLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDI0KSwgMHgwMDAwMDAwMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyNSksIDB4MDAwMDAwMjEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjYpLCAweDAwMDAwMDExLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDI3KSwgMHgwMDAwMDAzMSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyOCksIDB4MDAwMDAwMDksIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjkpLCAweDAwMDAwMDI5LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDMwKSwgMHgwMDAwMDAwNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzMSksIDB4MDAwMDAwMjUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMzIpLCAweDAwMDAwMDE1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDMzKSwgMHgwMDAwMDAzNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzNCksIDB4MDAwMDAwMGQsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMzUpLCAweDAwMDAwMDJkLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDM2KSwgMHgwMDAwMDAwMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzNyksIDB4MDAwMDAwMjMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMzgpLCAweDAwMDAwMDEzLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDM5KSwgMHgwMDAwMDAzMywgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0MCksIDB4MDAwMDAwMGIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDEpLCAweDAwMDAwMDJiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDQyKSwgMHgwMDAwMDAyYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0MyksIDB4MDAwMDAwMmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDQpLCAweDAwMDAwMDJiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDQ1KSwgMHgwMDAwMDAyYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0NiksIDB4MDAwMDAwMmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDcpLCAweDAwMDAwMDJiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDQ4KSwgMHgwMDAwMDAyYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0OSksIDB4MDAwMDAwMmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTApLCAweDAwMDAwMDJiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDUxKSwgMHgwMDAwMDAyYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1MiksIDB4MDAwMDAwMmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTMpLCAweDAwMDAwMDJiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDU0KSwgMHgwMDAwMDAyYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1NSksIDB4MDAwMDAwMmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTYpLCAweDAwMDAwMDJiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDU3KSwgMHgwMDAwMDAyYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1OCksIDB4MDAwMDAwMmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTkpLCAweDAwMDAwMDJiLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDYwKSwgMHgwMDAwMDAyYiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig2MSksIDB4MDAwMDAwMmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNjIpLCAweDAwMDAwMDAyLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDYzKSwgMHgwMDAwMDAxNiwgQVI1S19JTklfV1JJVEUgfSwKK307CisKKy8qIFJGNTExMiBJbml0aWFsIEJhc2VCYW5kIEdhaW4gc2V0dGluZ3MgKFNhbWUgZm9yIFJGNTQxMy81NDE0KykgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pIHJmNTExMl9pbmlfYmJnYWluW10gPSB7CisJeyBBUjVLX0JCX0dBSU4oMCksIDB4MDAwMDAwMDAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMSksIDB4MDAwMDAwMDEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMiksIDB4MDAwMDAwMDIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMyksIDB4MDAwMDAwMDMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNCksIDB4MDAwMDAwMDQsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNSksIDB4MDAwMDAwMDUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNiksIDB4MDAwMDAwMDgsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNyksIDB4MDAwMDAwMDksIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oOCksIDB4MDAwMDAwMGEsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oOSksIDB4MDAwMDAwMGIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTApLCAweDAwMDAwMDBjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDExKSwgMHgwMDAwMDAwZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxMiksIDB4MDAwMDAwMTAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTMpLCAweDAwMDAwMDExLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDE0KSwgMHgwMDAwMDAxMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxNSksIDB4MDAwMDAwMTMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTYpLCAweDAwMDAwMDE0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDE3KSwgMHgwMDAwMDAxNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigxOCksIDB4MDAwMDAwMTgsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMTkpLCAweDAwMDAwMDE5LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDIwKSwgMHgwMDAwMDAxYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyMSksIDB4MDAwMDAwMWIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjIpLCAweDAwMDAwMDFjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDIzKSwgMHgwMDAwMDAxZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyNCksIDB4MDAwMDAwMjAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjUpLCAweDAwMDAwMDIxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDI2KSwgMHgwMDAwMDAyMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigyNyksIDB4MDAwMDAwMjMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMjgpLCAweDAwMDAwMDI0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDI5KSwgMHgwMDAwMDAyNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzMCksIDB4MDAwMDAwMjgsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMzEpLCAweDAwMDAwMDI5LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDMyKSwgMHgwMDAwMDAyYSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzMyksIDB4MDAwMDAwMmIsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMzQpLCAweDAwMDAwMDJjLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDM1KSwgMHgwMDAwMDAyZCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzNiksIDB4MDAwMDAwMzAsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oMzcpLCAweDAwMDAwMDMxLCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDM4KSwgMHgwMDAwMDAzMiwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTigzOSksIDB4MDAwMDAwMzMsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDApLCAweDAwMDAwMDM0LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDQxKSwgMHgwMDAwMDAzNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0MiksIDB4MDAwMDAwMzUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDMpLCAweDAwMDAwMDM1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDQ0KSwgMHgwMDAwMDAzNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0NSksIDB4MDAwMDAwMzUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDYpLCAweDAwMDAwMDM1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDQ3KSwgMHgwMDAwMDAzNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig0OCksIDB4MDAwMDAwMzUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNDkpLCAweDAwMDAwMDM1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDUwKSwgMHgwMDAwMDAzNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1MSksIDB4MDAwMDAwMzUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTIpLCAweDAwMDAwMDM1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDUzKSwgMHgwMDAwMDAzNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1NCksIDB4MDAwMDAwMzUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTUpLCAweDAwMDAwMDM1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDU2KSwgMHgwMDAwMDAzNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig1NyksIDB4MDAwMDAwMzUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNTgpLCAweDAwMDAwMDM1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDU5KSwgMHgwMDAwMDAzNSwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig2MCksIDB4MDAwMDAwMzUsIEFSNUtfSU5JX1dSSVRFIH0sCisJeyBBUjVLX0JCX0dBSU4oNjEpLCAweDAwMDAwMDM1LCBBUjVLX0lOSV9XUklURSB9LAorCXsgQVI1S19CQl9HQUlOKDYyKSwgMHgwMDAwMDAxMCwgQVI1S19JTklfV1JJVEUgfSwKKwl7IEFSNUtfQkJfR0FJTig2MyksIDB4MDAwMDAwMWEsIEFSNUtfSU5JX1dSSVRFIH0sCit9OworCisKKy8qCisgKiBXcml0ZSBpbml0aWFsIHJlZ2lzdGVyIGR1bXAKKyAqLworc3RhdGljIHZvaWQgYXRoNWtfaHdfaW5pX3JlZ2lzdGVycyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJY29uc3Qgc3RydWN0IGF0aDVrX2luaSAqaW5pX3JlZ3MsIGludCBjaGFuZ2VfY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFdyaXRlIGluaXRpYWwgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkvKiBPbiBjaGFubmVsIGNoYW5nZSB0aGVyZSBpcworCQkgKiBubyBuZWVkIHRvIG1lc3Mgd2l0aCBQQ1UgKi8KKwkJaWYgKGNoYW5nZV9jaGFubmVsICYmCisJCQkJaW5pX3JlZ3NbaV0uaW5pX3JlZ2lzdGVyID49IEFSNUtfUENVX01JTiAmJgorCQkJCWluaV9yZWdzW2ldLmluaV9yZWdpc3RlciA8PSBBUjVLX1BDVV9NQVgpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGluaV9yZWdzW2ldLmluaV9tb2RlKSB7CisJCWNhc2UgQVI1S19JTklfUkVBRDoKKwkJCS8qIENsZWFyZWQgb24gcmVhZCAqLworCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIGluaV9yZWdzW2ldLmluaV9yZWdpc3Rlcik7CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX0lOSV9XUklURToKKwkJZGVmYXVsdDoKKwkJCUFSNUtfUkVHX1dBSVQoaSk7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGluaV9yZWdzW2ldLmluaV92YWx1ZSwKKwkJCQkJaW5pX3JlZ3NbaV0uaW5pX3JlZ2lzdGVyKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYXRoNWtfaHdfaW5pX21vZGVfcmVnaXN0ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCXVuc2lnbmVkIGludCBzaXplLCBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgKmluaV9tb2RlLAorCQl1OCBtb2RlKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlBUjVLX1JFR19XQUlUKGkpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGluaV9tb2RlW2ldLm1vZGVfdmFsdWVbbW9kZV0sCisJCQkodTMyKWluaV9tb2RlW2ldLm1vZGVfcmVnaXN0ZXIpOworCX0KK30KKworaW50IGF0aDVrX2h3X3dyaXRlX2luaXR2YWxzKHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IG1vZGUsIGludCBjaGFuZ2VfY2hhbm5lbCkKK3sKKwkvKgorCSAqIFdyaXRlIGluaXRpYWwgcmVnaXN0ZXIgc2V0dGluZ3MKKwkgKi8KKworCS8qIEZvciBBUjUyMTIgYW5kIGNvbWJhdGlibGUgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKworCQkvKiBGaXJzdCBzZXQgb2YgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyAqLworCQlhdGg1a19od19pbmlfbW9kZV9yZWdpc3RlcnMoYWgsCisJCQlBUlJBWV9TSVpFKGFyNTIxMl9pbmlfbW9kZV9zdGFydCksCisJCQlhcjUyMTJfaW5pX21vZGVfc3RhcnQsIG1vZGUpOworCisJCS8qCisJCSAqIFdyaXRlIGluaXRpYWwgc2V0dGluZ3MgY29tbW9uIGZvciBhbGwgbW9kZXMKKwkJICovCisJCWF0aDVrX2h3X2luaV9yZWdpc3RlcnMoYWgsIEFSUkFZX1NJWkUoYXI1MjEyX2luaV9jb21tb25fc3RhcnQpLAorCQkJCWFyNTIxMl9pbmlfY29tbW9uX3N0YXJ0LCBjaGFuZ2VfY2hhbm5lbCk7CisKKwkJLyogU2Vjb25kIHNldCBvZiBtb2RlLXNwZWNpZmljIHNldHRpbmdzICovCisJCXN3aXRjaCAoYWgtPmFoX3JhZGlvKSB7CisJCWNhc2UgQVI1S19SRjUxMTE6CisKKwkJCWF0aDVrX2h3X2luaV9tb2RlX3JlZ2lzdGVycyhhaCwKKwkJCQkJQVJSQVlfU0laRShyZjUxMTFfaW5pX21vZGVfZW5kKSwKKwkJCQkJcmY1MTExX2luaV9tb2RlX2VuZCwgbW9kZSk7CisKKwkJCWF0aDVrX2h3X2luaV9yZWdpc3RlcnMoYWgsCisJCQkJCUFSUkFZX1NJWkUocmY1MTExX2luaV9jb21tb25fZW5kKSwKKwkJCQkJcmY1MTExX2luaV9jb21tb25fZW5kLCBjaGFuZ2VfY2hhbm5lbCk7CisKKwkJCS8qIEJhc2ViYW5kIGdhaW4gdGFibGUgKi8KKwkJCWF0aDVrX2h3X2luaV9yZWdpc3RlcnMoYWgsCisJCQkJCUFSUkFZX1NJWkUocmY1MTExX2luaV9iYmdhaW4pLAorCQkJCQlyZjUxMTFfaW5pX2JiZ2FpbiwgY2hhbmdlX2NoYW5uZWwpOworCisJCQlicmVhazsKKwkJY2FzZSBBUjVLX1JGNTExMjoKKworCQkJYXRoNWtfaHdfaW5pX21vZGVfcmVnaXN0ZXJzKGFoLAorCQkJCQlBUlJBWV9TSVpFKHJmNTExMl9pbmlfbW9kZV9lbmQpLAorCQkJCQlyZjUxMTJfaW5pX21vZGVfZW5kLCBtb2RlKTsKKworCQkJYXRoNWtfaHdfaW5pX3JlZ2lzdGVycyhhaCwKKwkJCQkJQVJSQVlfU0laRShyZjUxMTJfaW5pX2NvbW1vbl9lbmQpLAorCQkJCQlyZjUxMTJfaW5pX2NvbW1vbl9lbmQsIGNoYW5nZV9jaGFubmVsKTsKKworCQkJYXRoNWtfaHdfaW5pX3JlZ2lzdGVycyhhaCwKKwkJCQkJQVJSQVlfU0laRShyZjUxMTJfaW5pX2JiZ2FpbiksCisJCQkJCXJmNTExMl9pbmlfYmJnYWluLCBjaGFuZ2VfY2hhbm5lbCk7CisKKwkJCWJyZWFrOworCQljYXNlIEFSNUtfUkY1NDEzOgorCisJCQlhdGg1a19od19pbmlfbW9kZV9yZWdpc3RlcnMoYWgsCisJCQkJCUFSUkFZX1NJWkUocmY1NDEzX2luaV9tb2RlX2VuZCksCisJCQkJCXJmNTQxM19pbmlfbW9kZV9lbmQsIG1vZGUpOworCisJCQlhdGg1a19od19pbmlfcmVnaXN0ZXJzKGFoLAorCQkJCQlBUlJBWV9TSVpFKHJmNTQxM19pbmlfY29tbW9uX2VuZCksCisJCQkJCXJmNTQxM19pbmlfY29tbW9uX2VuZCwgY2hhbmdlX2NoYW5uZWwpOworCisJCQlhdGg1a19od19pbmlfcmVnaXN0ZXJzKGFoLAorCQkJCQlBUlJBWV9TSVpFKHJmNTExMl9pbmlfYmJnYWluKSwKKwkJCQkJcmY1MTEyX2luaV9iYmdhaW4sIGNoYW5nZV9jaGFubmVsKTsKKworCQkJYnJlYWs7CisJCWNhc2UgQVI1S19SRjIzMTY6CisJCWNhc2UgQVI1S19SRjI0MTM6CisKKwkJCWF0aDVrX2h3X2luaV9tb2RlX3JlZ2lzdGVycyhhaCwKKwkJCQkJQVJSQVlfU0laRShyZjI0MTNfaW5pX21vZGVfZW5kKSwKKwkJCQkJcmYyNDEzX2luaV9tb2RlX2VuZCwgbW9kZSk7CisKKwkJCWF0aDVrX2h3X2luaV9yZWdpc3RlcnMoYWgsCisJCQkJCUFSUkFZX1NJWkUocmYyNDEzX2luaV9jb21tb25fZW5kKSwKKwkJCQkJcmYyNDEzX2luaV9jb21tb25fZW5kLCBjaGFuZ2VfY2hhbm5lbCk7CisKKwkJCS8qIE92ZXJyaWRlIHNldHRpbmdzIGZyb20gcmYyNDEzX2luaV9jb21tb25fZW5kICovCisJCQlpZiAoYWgtPmFoX3JhZGlvID09IEFSNUtfUkYyMzE2KSB7CisJCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMDA0MDAwLAorCQkJCQkJCUFSNUtfUEhZX0FHQyk7CisJCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDA4MWI3Y2FhLAorCQkJCQkJCTB4YTI3NCk7CisJCQl9CisKKwkJCWF0aDVrX2h3X2luaV9yZWdpc3RlcnMoYWgsCisJCQkJCUFSUkFZX1NJWkUocmY1MTEyX2luaV9iYmdhaW4pLAorCQkJCQlyZjUxMTJfaW5pX2JiZ2FpbiwgY2hhbmdlX2NoYW5uZWwpOworCQkJYnJlYWs7CisJCWNhc2UgQVI1S19SRjIzMTc6CisJCWNhc2UgQVI1S19SRjI0MjU6CisKKwkJCWF0aDVrX2h3X2luaV9tb2RlX3JlZ2lzdGVycyhhaCwKKwkJCQkJQVJSQVlfU0laRShyZjI0MjVfaW5pX21vZGVfZW5kKSwKKwkJCQkJcmYyNDI1X2luaV9tb2RlX2VuZCwgbW9kZSk7CisKKwkJCWF0aDVrX2h3X2luaV9yZWdpc3RlcnMoYWgsCisJCQkJCUFSUkFZX1NJWkUocmYyNDI1X2luaV9jb21tb25fZW5kKSwKKwkJCQkJcmYyNDI1X2luaV9jb21tb25fZW5kLCBjaGFuZ2VfY2hhbm5lbCk7CisKKwkJCWF0aDVrX2h3X2luaV9yZWdpc3RlcnMoYWgsCisJCQkJCUFSUkFZX1NJWkUocmY1MTEyX2luaV9iYmdhaW4pLAorCQkJCQlyZjUxMTJfaW5pX2JiZ2FpbiwgY2hhbmdlX2NoYW5uZWwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisKKwkvKiBGb3IgQVI1MjExICovCisJfSBlbHNlIGlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMSkgeworCisJCS8qIEFSNUtfTU9ERV8xMUIgKi8KKwkJaWYgKG1vZGUgPiAyKSB7CisJCQlEQkcoImF0aDVrOiB1bnN1cHBvcnRlZCBjaGFubmVsIG1vZGUgJWRcbiIsIG1vZGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBNb2RlLXNwZWNpZmljIHNldHRpbmdzICovCisJCWF0aDVrX2h3X2luaV9tb2RlX3JlZ2lzdGVycyhhaCwgQVJSQVlfU0laRShhcjUyMTFfaW5pX21vZGUpLAorCQkJCWFyNTIxMV9pbmlfbW9kZSwgbW9kZSk7CisKKwkJLyoKKwkJICogV3JpdGUgaW5pdGlhbCBzZXR0aW5ncyBjb21tb24gZm9yIGFsbCBtb2RlcworCQkgKi8KKwkJYXRoNWtfaHdfaW5pX3JlZ2lzdGVycyhhaCwgQVJSQVlfU0laRShhcjUyMTFfaW5pKSwKKwkJCQlhcjUyMTFfaW5pLCBjaGFuZ2VfY2hhbm5lbCk7CisKKwkJLyogQVI1MjExIG9ubHkgY29tZXMgd2l0aCA1MTExICovCisKKwkJLyogQmFzZWJhbmQgZ2FpbiB0YWJsZSAqLworCQlhdGg1a19od19pbmlfcmVnaXN0ZXJzKGFoLCBBUlJBWV9TSVpFKHJmNTExMV9pbmlfYmJnYWluKSwKKwkJCQlyZjUxMTFfaW5pX2JiZ2FpbiwgY2hhbmdlX2NoYW5uZWwpOworCS8qIEZvciBBUjUyMTAgKGZvciBtb2RlIHNldHRpbmdzIGNoZWNrIG91dCBhdGg1a19od19yZXNldF90eF9xdWV1ZSkgKi8KKwl9IGVsc2UgaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCWF0aDVrX2h3X2luaV9yZWdpc3RlcnMoYWgsIEFSUkFZX1NJWkUoYXI1MjEwX2luaSksCisJCQkJYXI1MjEwX2luaSwgY2hhbmdlX2NoYW5uZWwpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfcGN1LmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19wY3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2UxNDRjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfcGN1LmMKQEAgLTAsMCArMSw1MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBNYXR0aGV3IFcuIFMuIEJlbGwgIDxtZW50b3JAbWFkd2lmaS5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBMdWlzIFJvZHJpZ3VleiA8bWNncm9mQHdpbmxhYi5ydXRnZXJzLmVkdT4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgorICoKKyAqIExpZ2h0bHkgbW9kaWZpZWQgZm9yIGdQWEUsIEp1bHkgMjAwOSwgYnkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIE1JVCApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBQcm90b2NvbCBDb250cm9sIFVuaXQgRnVuY3Rpb25zICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImJhc2UuaCIKKworLyoqKioqKioqKioqKioqKioqKipcCisqIEdlbmVyaWMgZnVuY3Rpb25zICoKK1wqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGF0aDVrX2h3X3NldF9vcG1vZGUgLSBTZXQgUENVIG9wZXJhdGluZyBtb2RlCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIEluaXRpYWxpemUgUENVIGZvciB0aGUgdmFyaW91cyBvcGVyYXRpbmcgbW9kZXMgKEFQL1NUQSBldGMpCisgKgorICogRm9yIGdQWEUgd2UgYWx3YXlzIGFzc3VtZSBTVEEgbW9kZS4KKyAqLworaW50IGF0aDVrX2h3X3NldF9vcG1vZGUoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwl1MzIgcGN1X3JlZywgYmVhY29uX3JlZywgbG93X2lkLCBoaWdoX2lkOworCisKKwkvKiBQcmVzZXJ2ZSByZXN0IHNldHRpbmdzICovCisJcGN1X3JlZyA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NUQV9JRDEpICYgMHhmZmZmMDAwMDsKKwlwY3VfcmVnICY9IH4oQVI1S19TVEFfSUQxX0FESE9DIHwgQVI1S19TVEFfSUQxX0FQCisJCQl8IEFSNUtfU1RBX0lEMV9LRVlTUkNIX01PREUKKwkJCXwgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8KKwkJCShBUjVLX1NUQV9JRDFfUFdSX1NWIHwgQVI1S19TVEFfSUQxX05PX1BTUE9MTCkgOiAwKSk7CisKKwliZWFjb25fcmVnID0gMDsKKworCXBjdV9yZWcgfD0gQVI1S19TVEFfSUQxX0tFWVNSQ0hfTU9ERQorCQl8IChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/CisJCSAgIEFSNUtfU1RBX0lEMV9QV1JfU1YgOiAwKTsKKworCS8qCisJICogU2V0IFBDVSByZWdpc3RlcnMKKwkgKi8KKwlsb3dfaWQgPSBBUjVLX0xPV19JRChhaC0+YWhfc3RhX2lkKTsKKwloaWdoX2lkID0gQVI1S19ISUdIX0lEKGFoLT5haF9zdGFfaWQpOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgbG93X2lkLCBBUjVLX1NUQV9JRDApOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgcGN1X3JlZyB8IGhpZ2hfaWQsIEFSNUtfU1RBX0lEMSk7CisKKwkvKgorCSAqIFNldCBCZWFjb24gQ29udHJvbCBSZWdpc3RlciBvbiA1MjEwCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGJlYWNvbl9yZWcsIEFSNUtfQkNSKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGF0aDVrX2h3X3NldF9hY2tfYml0cmF0ZSAtIHNldCBiaXRyYXRlIGZvciBBQ0tzCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGhpZ2g6IEZsYWcgdG8gZGV0ZXJtaW5lIGlmIHdlIHdhbnQgdG8gdXNlIGhpZ2ggdHJhbnNtaXRpb24gcmF0ZQorICogZm9yIEFDS3Mgb3Igbm90CisgKgorICogSWYgaGlnaCBmbGFnIGlzIHNldCwgd2UgdGVsbCBodyB0byB1c2UgYSBzZXQgb2YgY29udHJvbCByYXRlcyBiYXNlZCBvbgorICogdGhlIGN1cnJlbnQgdHJhbnNtaXRpb24gcmF0ZSAoY2hlY2sgb3V0IGNvbnRyb2xfcmF0ZXMgYXJyYXkgaW5zaWRlIHJlc2V0LmMpLgorICogSWYgbm90IGh3IGp1c3QgdXNlcyB0aGUgbG93ZXN0IHJhdGUgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBtb2R1bGF0aW9uCisgKiBzY2hlbWUgYmVpbmcgdXNlZCAoMU1iaXQgZm9yIENDSyBhbmQgNk1iaXRzIGZvciBPRkRNKS4KKyAqLwordm9pZCBhdGg1a19od19zZXRfYWNrX2JpdHJhdGVfaGlnaChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgaGlnaCkKK3sKKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTIpCisJCXJldHVybjsKKwllbHNlIHsKKwkJdTMyIHZhbCA9IEFSNUtfU1RBX0lEMV9CQVNFX1JBVEVfMTFCIHwgQVI1S19TVEFfSUQxX0FDS0NUU182TUI7CisJCWlmIChoaWdoKQorCQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwgdmFsKTsKKwkJZWxzZQorCQkJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1NUQV9JRDEsIHZhbCk7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKipcCisqIEFDSy9DVFMgVGltZW91dHMgKgorXCoqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBhdGg1a19od19oZXRfYWNrX3RpbWVvdXQgLSBHZXQgQUNLIHRpbWVvdXQgZnJvbSBQQ1UgaW4gdXNlYworICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqLwordW5zaWduZWQgaW50IGF0aDVrX2h3X2dldF9hY2tfdGltZW91dChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXJldHVybiBhdGg1a19od19jbG9ja3RvaChBUjVLX1JFR19NUyhhdGg1a19od19yZWdfcmVhZChhaCwKKwkJCUFSNUtfVElNRV9PVVQpLCBBUjVLX1RJTUVfT1VUX0FDSyksIGFoLT5haF90dXJibyk7Cit9CisKKy8qKgorICogYXRoNWtfaHdfc2V0X2Fja190aW1lb3V0IC0gU2V0IEFDSyB0aW1lb3V0IG9uIFBDVQorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEB0aW1lb3V0OiBUaW1lb3V0IGluIHVzZWMKKyAqLworaW50IGF0aDVrX2h3X3NldF9hY2tfdGltZW91dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlpZiAoYXRoNWtfaHdfY2xvY2t0b2goQVI1S19SRUdfTVMoMHhmZmZmZmZmZiwgQVI1S19USU1FX09VVF9BQ0spLAorCQkJYWgtPmFoX3R1cmJvKSA8PSB0aW1lb3V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfVElNRV9PVVQsIEFSNUtfVElNRV9PVVRfQUNLLAorCQlhdGg1a19od19odG9jbG9jayh0aW1lb3V0LCBhaC0+YWhfdHVyYm8pKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGF0aDVrX2h3X2dldF9jdHNfdGltZW91dCAtIEdldCBDVFMgdGltZW91dCBmcm9tIFBDVSBpbiB1c2VjCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCit1bnNpZ25lZCBpbnQgYXRoNWtfaHdfZ2V0X2N0c190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJcmV0dXJuIGF0aDVrX2h3X2Nsb2NrdG9oKEFSNUtfUkVHX01TKGF0aDVrX2h3X3JlZ19yZWFkKGFoLAorCQkJQVI1S19USU1FX09VVCksIEFSNUtfVElNRV9PVVRfQ1RTKSwgYWgtPmFoX3R1cmJvKTsKK30KKworLyoqCisgKiBhdGg1a19od19zZXRfY3RzX3RpbWVvdXQgLSBTZXQgQ1RTIHRpbWVvdXQgb24gUENVCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHRpbWVvdXQ6IFRpbWVvdXQgaW4gdXNlYworICovCitpbnQgYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCWlmIChhdGg1a19od19jbG9ja3RvaChBUjVLX1JFR19NUygweGZmZmZmZmZmLCBBUjVLX1RJTUVfT1VUX0NUUyksCisJCQlhaC0+YWhfdHVyYm8pIDw9IHRpbWVvdXQpCisJCXJldHVybiAtRUlOVkFMOworCisJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19USU1FX09VVCwgQVI1S19USU1FX09VVF9DVFMsCisJCQlhdGg1a19od19odG9jbG9jayh0aW1lb3V0LCBhaC0+YWhfdHVyYm8pKTsKKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqXAorKiBCU1NJRCBoYW5kbGluZyAqCitcKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBhdGg1a19od19nZXRfbGxhZGRyIC0gR2V0IHN0YXRpb24gaWQKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbWFjOiBUaGUgY2FyZCdzIG1hYyBhZGRyZXNzCisgKgorICogSW5pdGlhbGl6ZSBhaC0+YWhfc3RhX2lkIHVzaW5nIHRoZSBtYWMgYWRkcmVzcyBwcm92aWRlZAorICogKGp1c3QgYSBtZW1jcHkpLgorICoKKyAqIFRPRE86IFJlbW92ZSBpdCBvbmNlIHdlIG1lcmdlIGF0aDVrX3NvZnRjIGFuZCBhdGg1a19odworICovCit2b2lkIGF0aDVrX2h3X2dldF9sbGFkZHIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggKm1hYykKK3sKKwltZW1jcHkobWFjLCBhaC0+YWhfc3RhX2lkLCBFVEhfQUxFTik7Cit9CisKKy8qKgorICogYXRoNWtfaHdfc2V0X2xsYWRkciAtIFNldCBzdGF0aW9uIGlkCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQG1hYzogVGhlIGNhcmQncyBtYWMgYWRkcmVzcworICoKKyAqIFNldCBzdGF0aW9uIGlkIG9uIGh3IHVzaW5nIHRoZSBwcm92aWRlZCBtYWMgYWRkcmVzcworICovCitpbnQgYXRoNWtfaHdfc2V0X2xsYWRkcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBjb25zdCB1OCAqbWFjKQoreworCXUzMiBsb3dfaWQsIGhpZ2hfaWQ7CisJdTMyIHBjdV9yZWc7CisKKwkvKiBTZXQgbmV3IHN0YXRpb24gSUQgKi8KKwltZW1jcHkoYWgtPmFoX3N0YV9pZCwgbWFjLCBFVEhfQUxFTik7CisKKwlwY3VfcmVnID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU1RBX0lEMSkgJiAweGZmZmYwMDAwOworCisJbG93X2lkID0gQVI1S19MT1dfSUQobWFjKTsKKwloaWdoX2lkID0gQVI1S19ISUdIX0lEKG1hYyk7CisKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxvd19pZCwgQVI1S19TVEFfSUQwKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHBjdV9yZWcgfCBoaWdoX2lkLCBBUjVLX1NUQV9JRDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYXRoNWtfaHdfc2V0X2Fzc29jaWQgLSBTZXQgQlNTSUQgZm9yIGFzc29jaWF0aW9uCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGJzc2lkOiBCU1NJRAorICogQGFzc29jX2lkOiBBc3NvYyBpZAorICoKKyAqIFNldHMgdGhlIEJTU0lEIHdoaWNoIHRyaWdlcnMgdGhlICJTTUUgSm9pbiIgb3BlcmF0aW9uCisgKi8KK3ZvaWQgYXRoNWtfaHdfc2V0X2Fzc29jaWQoc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKmJzc2lkLCB1MTYgYXNzb2NfaWQpCit7CisJdTMyIGxvd19pZCwgaGlnaF9pZDsKKworCS8qCisJICogU2V0IHNpbXBsZSBCU1NJRCBtYXNrIG9uIDUyMTIKKwkgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0xPV19JRChhaC0+YWhfYnNzaWRfbWFzayksCisJCQkJCQkJQVI1S19CU1NfSURNMCk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19ISUdIX0lEKGFoLT5haF9ic3NpZF9tYXNrKSwKKwkJCQkJCQlBUjVLX0JTU19JRE0xKTsKKwl9CisKKwkvKgorCSAqIFNldCBCU1NJRCB3aGljaCB0cmlnZ2VycyB0aGUgIlNNRSBKb2luIiBvcGVyYXRpb24KKwkgKi8KKwlsb3dfaWQgPSBBUjVLX0xPV19JRChic3NpZCk7CisJaGlnaF9pZCA9IEFSNUtfSElHSF9JRChic3NpZCk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBsb3dfaWQsIEFSNUtfQlNTX0lEMCk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBoaWdoX2lkIHwgKChhc3NvY19pZCAmIDB4M2ZmZikgPDwKKwkJCQlBUjVLX0JTU19JRDFfQUlEX1MpLCBBUjVLX0JTU19JRDEpOworfQorCisvKioKKyAqIGF0aDVrX2h3X3NldF9ic3NpZF9tYXNrIC0gZmlsdGVyIG91dCBic3NpZHMgd2UgbGlzdGVuCisgKgorICogQGFoOiB0aGUgJnN0cnVjdCBhdGg1a19odworICogQG1hc2s6IHRoZSBic3NpZF9tYXNrLCBhIHU4IGFycmF5IG9mIHNpemUgRVRIX0FMRU4KKyAqCisgKiBCU1NJRCBtYXNraW5nIGlzIGEgbWV0aG9kIHVzZWQgYnkgQVI1MjEyIGFuZCBuZXdlciBoYXJkd2FyZSB0byBpbmZvcm0gUENVCisgKiB3aGljaCBiaXRzIG9mIHRoZSBpbnRlcmZhY2UncyBNQUMgYWRkcmVzcyBzaG91bGQgYmUgbG9va2VkIGF0IHdoZW4gdHJ5aW5nCisgKiB0byBkZWNpZGUgd2hpY2ggcGFja2V0cyB0byBBQ0suIEluIHN0YXRpb24gbW9kZSBhbmQgQVAgbW9kZSB3aXRoIGEgc2luZ2xlCisgKiBCU1MgZXZlcnkgYml0IG1hdHRlcnMgc2luY2Ugd2UgbG9jayB0byBvbmx5IG9uZSBCU1MuIEluIEFQIG1vZGUgd2l0aAorICogbXVsdGlwbGUgQlNTZXMgKHZpcnR1YWwgaW50ZXJmYWNlcykgbm90IGV2ZXJ5IGJpdCBtYXR0ZXJzIGJlY2F1c2UgaHcgbXVzdAorICogYWNjZXB0IGZyYW1lcyBmb3IgYWxsIEJTU2VzIGFuZCBzbyB3ZSB0d2VhayBzb21lIGJpdHMgb2Ygb3VyIG1hYyBhZGRyZXNzCisgKiBpbiBvcmRlciB0byBoYXZlIG11bHRpcGxlIEJTU2VzLgorICoKKyAqIE5PVEU6IFRoaXMgaXMgYSBzaW1wbGUgZmlsdGVyIGFuZCBkb2VzICpub3QqIGZpbHRlciBvdXQgYWxsCisgKiByZWxldmFudCBmcmFtZXMuIFNvbWUgZnJhbWVzIHRoYXQgYXJlIG5vdCBmb3IgdXMgbWlnaHQgZ2V0IEFDS2VkIGZyb20gdXMKKyAqIGJ5IFBDVSBiZWNhdXNlIHRoZXkganVzdCBtYXRjaCB0aGUgbWFzay4KKyAqCisgKiBXaGVuIGhhbmRsaW5nIG11bHRpcGxlIEJTU2VzIHlvdSBjYW4gZ2V0IHRoZSBCU1NJRCBtYXNrIGJ5IGNvbXB1dGluZyB0aGUKKyAqIHNldCBvZiAgfiAoIE1BQyBYT1IgQlNTSUQgKSBmb3IgYWxsIGJzc2lkcyB3ZSBoYW5kbGUuCisgKgorICogV2hlbiB5b3UgZG8gdGhpcyB5b3UgYXJlIGVzc2VudGlhbGx5IGNvbXB1dGluZyB0aGUgY29tbW9uIGJpdHMgb2YgYWxsIHlvdXIKKyAqIEJTU2VzLiBMYXRlciBpdCBpcyBhc3N1bWVkIHRoZSBoYXJ3YXJlIHdpbGwgImFuZCIgKCYpIHRoZSBCU1NJRCBtYXNrIHdpdGgKKyAqIHRoZSBNQUMgYWRkcmVzcyB0byBvYnRhaW4gdGhlIHJlbGV2YW50IGJpdHMgYW5kIGNvbXBhcmUgdGhlIHJlc3VsdCB3aXRoCisgKiAoZnJhbWUncyBCU1NJRCAmIG1hc2spIHRvIHNlZSBpZiB0aGV5IG1hdGNoLgorICovCisvKgorICogU2ltcGxlIGV4YW1wbGU6IG9uIHlvdXIgY2FyZCB5b3UgaGF2ZSBoYXZlIHR3byBCU1NlcyB5b3UgaGF2ZSBjcmVhdGVkIHdpdGgKKyAqIEJTU0lELTAxIGFuZCBCU1NJRC0wMi4gTGV0cyBhc3N1bWUgQlNTSUQtMDEgd2lsbCBub3QgdXNlIHRoZSBNQUMgYWRkcmVzcy4KKyAqIFRoZXJlIGlzIGFub3RoZXIgQlNTSUQtMDMgYnV0IHlvdSBhcmUgbm90IHBhcnQgb2YgaXQuIEZvciBzaW1wbGljaXR5J3Mgc2FrZSwKKyAqIGFzc3VtaW5nIG9ubHkgNCBiaXRzIGZvciBhIG1hYyBhZGRyZXNzIGFuZCBmb3IgQlNTSURzIHlvdSBjYW4gdGhlbiBoYXZlOgorICoKKyAqICAgICAgICAgICAgICAgICAgXAorICogTUFDOiAgICAgICAgICAgICAgICAwMDAxIHwKKyAqIEJTU0lELTAxOiAgIDAxMDAgfCAtLT4gQmVsb25ncyB0byB1cworICogQlNTSUQtMDI6ICAgMTAwMSB8CisgKiAgICAgICAgICAgICAgICAgIC8KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJTU0lELTAzOiAgIDAxMTAgIHwgLS0+IEV4dGVybmFsCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogT3VyIGJzc2lkX21hc2sgd291bGQgdGhlbiBiZToKKyAqCisgKiAgICAgICAgICAgICBPbiBsb29wIGl0ZXJhdGlvbiBmb3IgQlNTSUQtMDE6CisgKiAgICAgICAgICAgICB+KDAwMDEgXiAwMTAwKSAgLT4gfigwMTAxKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAgMTAxMAorICogICAgICAgICAgICAgYnNzaWRfbWFzayAgICAgID0gICAgMTAxMAorICoKKyAqICAgICAgICAgICAgIE9uIGxvb3AgaXRlcmF0aW9uIGZvciBCU1NJRC0wMjoKKyAqICAgICAgICAgICAgIGJzc2lkX21hc2sgJj0gfigwMDAxICAgXiAgIDEwMDEpCisgKiAgICAgICAgICAgICBic3NpZF9tYXNrID0gICAoMTAxMCkgICYgfigwMDAxIF4gMTAwMSkKKyAqICAgICAgICAgICAgIGJzc2lkX21hc2sgPSAgICgxMDEwKSAgJiB+KDEwMDEpCisgKiAgICAgICAgICAgICBic3NpZF9tYXNrID0gICAoMTAxMCkgICYgICgwMTEwKQorICogICAgICAgICAgICAgYnNzaWRfbWFzayA9ICAgMDAxMAorICoKKyAqIEEgYnNzaWRfbWFzayBvZiAwMDEwIG1lYW5zICJvbmx5IHBheSBhdHRlbnRpb24gdG8gdGhlIHNlY29uZCBsZWFzdAorICogc2lnbmlmaWNhbnQgYml0Ii4gVGhpcyBpcyBiZWNhdXNlIGl0cyB0aGUgb25seSBiaXQgY29tbW9uCisgKiBhbW9uZ3N0IHRoZSBNQUMgYW5kIGFsbCBCU1NJRHMgd2Ugc3VwcG9ydC4gVG8gZmluZG91dCB3aGF0IHRoZSByZWFsCisgKiBjb21tb24gYml0IGlzIHdlIGNhbiBzaW1wbHkgIiYiIHRoZSBic3NpZF9tYXNrIG5vdyB3aXRoIGFueSBCU1NJRCB3ZSBoYXZlCisgKiBvciBvdXIgTUFDIGFkZHJlc3MgKHdlIGFzc3VtZSB0aGUgaGFyZHdhcmUgdXNlcyB0aGUgTUFDIGFkZHJlc3MpLgorICoKKyAqIE5vdywgc3VwcG9zZSB0aGVyZSdzIGFuIGluY29taW5nIGZyYW1lIGZvciBCU1NJRC0wMzoKKyAqCisgKiBJRlJBTUUtMDE6ICAwMTEwCisgKgorICogQW4gZWFzeSBleWUtaW5zcGVjaXRvbiBvZiB0aGlzIGFscmVhZHkgc2hvdWxkIHRlbGwgeW91IHRoYXQgdGhpcyBmcmFtZQorICogd2lsbCBub3QgcGFzcyBvdXIgY2hlY2suIFRoaXMgaXMgYmVhY3VzZSB0aGUgYnNzaWRfbWFzayB0ZWxscyB0aGUKKyAqIGhhcmR3YXJlIHRvIG9ubHkgbG9vayBhdCB0aGUgc2Vjb25kIGxlYXN0IHNpZ25pZmljYW50IGJpdCBhbmQgdGhlCisgKiBjb21tb24gYml0IGFtb25nc3QgdGhlIE1BQyBhbmQgQlNTSURzIGlzIDAsIHRoaXMgZnJhbWUgaGFzIHRoZSAybmQgTFNCCisgKiBhcyAxLCB3aGljaCBkb2VzIG5vdCBtYXRjaCAwLgorICoKKyAqIFNvIHdpdGggSUZSQU1FLTAxIHdlICphc3N1bWUqIHRoZSBoYXJkd2FyZSB3aWxsIGRvOgorICoKKyAqICAgICBhbGxvdyA9IChJRlJBTUUtMDEgJiBic3NpZF9tYXNrKSA9PSAoYnNzaWRfbWFzayAmIE1BQykgPyAxIDogMDsKKyAqICAtLT4gYWxsb3cgPSAoMDExMCAmIDAwMTApID09ICgwMDEwICYgMDAwMSkgPyAxIDogMDsKKyAqICAtLT4gYWxsb3cgPSAoMDAxMCkgPT0gMDAwMCA/IDEgOiAwOworICogIC0tPiBhbGxvdyA9IDAKKyAqCisgKiAgTGV0cyBub3cgdGVzdCBhIGZyYW1lIHRoYXQgc2hvdWxkIHdvcms6CisgKgorICogSUZSQU1FLTAyOiAgMDAwMSAod2Ugc2hvdWxkIGFsbG93KQorICoKKyAqICAgICBhbGxvdyA9ICgwMDAxICYgMTAxMCkgPT0gMTAxMAorICoKKyAqICAgICBhbGxvdyA9IChJRlJBTUUtMDIgJiBic3NpZF9tYXNrKSA9PSAoYnNzaWRfbWFzayAmIE1BQykgPyAxIDogMDsKKyAqICAtLT4gYWxsb3cgPSAoMDAwMSAmIDAwMTApID09ICAoMDAxMCAmIDAwMDEpID8gMSA6MDsKKyAqICAtLT4gYWxsb3cgPSAoMDAxMCkgPT0gKDAwMTApCisgKiAgLS0+IGFsbG93ID0gMQorICoKKyAqIE90aGVyIGV4YW1wbGVzOgorICoKKyAqIElGUkFNRS0wMzogIDAxMDAgLS0+IGFsbG93ZWQKKyAqIElGUkFNRS0wNDogIDEwMDEgLS0+IGFsbG93ZWQKKyAqIElGUkFNRS0wNTogIDExMDEgLS0+IGFsbG93ZWQgYnV0IGl0cyBub3QgZm9yIHVzISEhCisgKgorICovCitpbnQgYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2soc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKm1hc2spCit7CisJdTMyIGxvd19pZCwgaGlnaF9pZDsKKworCS8qIENhY2hlIGJzc2lkIG1hc2sgc28gdGhhdCB3ZSBjYW4gcmVzdG9yZSBpdAorCSAqIG9uIHJlc2V0ICovCisJbWVtY3B5KGFoLT5haF9ic3NpZF9tYXNrLCBtYXNrLCBFVEhfQUxFTik7CisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB7CisJCWxvd19pZCA9IEFSNUtfTE9XX0lEKG1hc2spOworCQloaWdoX2lkID0gQVI1S19ISUdIX0lEKG1hc2spOworCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgbG93X2lkLCBBUjVLX0JTU19JRE0wKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBoaWdoX2lkLCBBUjVLX0JTU19JRE0xKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTzsKK30KKworCisvKioqKioqKioqKioqXAorKiBSWCBDb250cm9sICoKK1wqKioqKioqKioqKiovCisKKy8qKgorICogYXRoNWtfaHdfc3RhcnRfcnhfcGN1IC0gU3RhcnQgUlggZW5naW5lCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIFN0YXJ0cyBSWCBlbmdpbmUgb24gUENVIHNvIHRoYXQgaHcgY2FuIHByb2Nlc3MgUlhlZCBmcmFtZXMKKyAqIChBQ0sgZXRjKS4KKyAqCisgKiBOT1RFOiBSWCBETUEgc2hvdWxkIGJlIGFscmVhZHkgZW5hYmxlZCB1c2luZyBhdGg1a19od19zdGFydF9yeF9kbWEKKyAqIFRPRE86IEluaXQgQU5JIGhlcmUKKyAqLwordm9pZCBhdGg1a19od19zdGFydF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfRElBR19TVywgQVI1S19ESUFHX1NXX0RJU19SWCk7Cit9CisKKy8qKgorICogYXQ1a19od19zdG9wX3J4X3BjdSAtIFN0b3AgUlggZW5naW5lCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIFN0b3BzIFJYIGVuZ2luZSBvbiBQQ1UKKyAqCisgKiBUT0RPOiBEZXRhY2ggQU5JIGhlcmUKKyAqLwordm9pZCBhdGg1a19od19zdG9wX3J4X3BjdShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX0RJQUdfU1csIEFSNUtfRElBR19TV19ESVNfUlgpOworfQorCisvKgorICogU2V0IG11bHRpY2FzdCBmaWx0ZXIKKyAqLwordm9pZCBhdGg1a19od19zZXRfbWNhc3RfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIwLCB1MzIgZmlsdGVyMSkKK3sKKwkvKiBTZXQgdGhlIG11bHRpY2F0IGZpbHRlciAqLworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZmlsdGVyMCwgQVI1S19NQ0FTVF9GSUxURVIwKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGZpbHRlcjEsIEFSNUtfTUNBU1RfRklMVEVSMSk7Cit9CisKKy8qKgorICogYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlciAtIEdldCBjdXJyZW50IHJ4IGZpbHRlcgorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBSZXR1cm5zIHRoZSBSWCBmaWx0ZXIgYnkgcmVhZGluZyByeCBmaWx0ZXIgYW5kCisgKiBwaHkgZXJyb3IgZmlsdGVyIHJlZ2lzdGVycy4gUlggZmlsdGVyIGlzIHVzZWQKKyAqIHRvIHNldCB0aGUgYWxsb3dlZCBmcmFtZSB0eXBlcyB0aGF0IFBDVSB3aWxsIGFjY2VwdAorICogYW5kIHBhc3MgdG8gdGhlIGRyaXZlci4gRm9yIGEgbGlzdCBvZiBmcmFtZSB0eXBlcworICogY2hlY2sgb3V0IHJlZy5oLgorICovCit1MzIgYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXUzMiBkYXRhLCBmaWx0ZXIgPSAwOworCisJZmlsdGVyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUlhfRklMVEVSKTsKKworCS8qUmFkYXIgZGV0ZWN0aW9uIGZvciA1MjEyKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJZGF0YSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9FUlJfRklMKTsKKworCQlpZiAoZGF0YSAmIEFSNUtfUEhZX0VSUl9GSUxfUkFEQVIpCisJCQlmaWx0ZXIgfD0gQVI1S19SWF9GSUxURVJfUkFEQVJFUlI7CisJCWlmIChkYXRhICYgKEFSNUtfUEhZX0VSUl9GSUxfT0ZETSB8IEFSNUtfUEhZX0VSUl9GSUxfQ0NLKSkKKwkJCWZpbHRlciB8PSBBUjVLX1JYX0ZJTFRFUl9QSFlFUlI7CisJfQorCisJcmV0dXJuIGZpbHRlcjsKK30KKworLyoqCisgKiBhdGg1a19od19zZXRfcnhfZmlsdGVyIC0gU2V0IHJ4IGZpbHRlcgorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBmaWx0ZXI6IFJYIGZpbHRlciBtYXNrIChzZWUgcmVnLmgpCisgKgorICogU2V0cyBSWCBmaWx0ZXIgcmVnaXN0ZXIgYW5kIGFsc28gaGFuZGxlcyBQSFkgZXJyb3IgZmlsdGVyCisgKiByZWdpc3RlciBvbiA1MjEyIGFuZCBuZXdlciBjaGlwcyBzbyB0aGF0IHdlIGhhdmUgcHJvcGVyIFBIWQorICogZXJyb3IgcmVwb3J0aW5nLgorICovCit2b2lkIGF0aDVrX2h3X3NldF9yeF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGZpbHRlcikKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwkvKiBTZXQgUEhZIGVycm9yIGZpbHRlciByZWdpc3RlciBvbiA1MjEyKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJaWYgKGZpbHRlciAmIEFSNUtfUlhfRklMVEVSX1JBREFSRVJSKQorCQkJZGF0YSB8PSBBUjVLX1BIWV9FUlJfRklMX1JBREFSOworCQlpZiAoZmlsdGVyICYgQVI1S19SWF9GSUxURVJfUEhZRVJSKQorCQkJZGF0YSB8PSBBUjVLX1BIWV9FUlJfRklMX09GRE0gfCBBUjVLX1BIWV9FUlJfRklMX0NDSzsKKwl9CisKKwkvKgorCSAqIFRoZSBBUjUyMTAgdXNlcyBwcm9taXNjb3VzIG1vZGUgdG8gZGV0ZWN0IHJhZGFyIGFjdGl2aXR5CisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwICYmCisJCQkoZmlsdGVyICYgQVI1S19SWF9GSUxURVJfUkFEQVJFUlIpKSB7CisJCWZpbHRlciAmPSB+QVI1S19SWF9GSUxURVJfUkFEQVJFUlI7CisJCWZpbHRlciB8PSBBUjVLX1JYX0ZJTFRFUl9QUk9NOworCX0KKworCS8qWmVybyBsZW5ndGggRE1BIChwaHkgZXJyb3IgcmVwb3J0aW5nKSAqLworCWlmIChkYXRhKQorCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19SWENGRywgQVI1S19SWENGR19aTEZETUEpOworCWVsc2UKKwkJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1JYQ0ZHLCBBUjVLX1JYQ0ZHX1pMRkRNQSk7CisKKwkvKldyaXRlIFJYIEZpbHRlciByZWdpc3RlciovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBmaWx0ZXIgJiAweGZmLCBBUjVLX1JYX0ZJTFRFUik7CisKKwkvKldyaXRlIFBIWSBlcnJvciBmaWx0ZXIgcmVnaXN0ZXIgb24gNTIxMiovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfUEhZX0VSUl9GSUwpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKipcCisqIEtleSB0YWJsZSBmdW5jdGlvbnMgKgorXCoqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFJlc2V0IGEga2V5IGVudHJ5IG9uIHRoZSB0YWJsZQorICovCitpbnQgYXRoNWtfaHdfcmVzZXRfa2V5KHN0cnVjdCBhdGg1a19odyAqYWgsIHUxNiBlbnRyeSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgdHlwZTsKKwl1MTYgbWljZW50cnkgPSBlbnRyeSArIEFSNUtfS0VZVEFCTEVfTUlDX09GRlNFVDsKKworCXR5cGUgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19LRVlUQUJMRV9UWVBFKGVudHJ5KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVI1S19LRVlDQUNIRV9TSVpFOyBpKyspCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19LRVlUQUJMRV9PRkYoZW50cnksIGkpKTsKKworCS8qIFJlc2V0IGFzc29jaWF0ZWQgTUlDIGVudHJ5IGlmIFRLSVAKKwkgKiBpcyBlbmFibGVkIGxvY2F0ZWQgYXQgb2Zmc2V0IChlbnRyeSArIDY0KSAqLworCWlmICh0eXBlID09IEFSNUtfS0VZVEFCTEVfVFlQRV9US0lQKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUjVLX0tFWUNBQ0hFX1NJWkUgLyAyIDsgaSsrKQorCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLAorCQkJCUFSNUtfS0VZVEFCTEVfT0ZGKG1pY2VudHJ5LCBpKSk7CisJfQorCisJLyoKKwkgKiBTZXQgTlVMTCBlbmNyeXB0aW9uIG9uIEFSNTIxMisKKwkgKgorCSAqIE5vdGU6IEFSNUtfS0VZVEFCTEVfVFlQRSAtPiBBUjVLX0tFWVRBQkxFX09GRihlbnRyeSwgNSkKKwkgKiAgICAgICBBUjVLX0tFWVRBQkxFX1RZUEVfTlVMTCAtPiAweDAwMDAwMDA3CisJICoKKwkgKiBOb3RlMjogV2luZG93cyBkcml2ZXIgKG5kaXN3cmFwcGVyKSBzZXRzIHRoaXMgdG8KKwkgKiAgICAgICAgMHgwMDAwMDcxNCBpbnN0ZWFkIG9mIDB4MDAwMDAwMDcKKwkgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPj0gQVI1S19BUjUyMTEpIHsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0tFWVRBQkxFX1RZUEVfTlVMTCwKKwkJCQlBUjVLX0tFWVRBQkxFX1RZUEUoZW50cnkpKTsKKworCQlpZiAodHlwZSA9PSBBUjVLX0tFWVRBQkxFX1RZUEVfVEtJUCkgeworCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0tFWVRBQkxFX1RZUEVfTlVMTCwKKwkJCQlBUjVLX0tFWVRBQkxFX1RZUEUobWljZW50cnkpKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfcGh5LmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19waHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODU2ZmEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfcGh5LmMKQEAgLTAsMCArMSwyNTg2IEBACisvKgorICogUEhZIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA3IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+CisgKgorICogTGlnaHRseSBtb2RpZmllZCBmb3IgZ1BYRSwgSnVseSAyMDA5LCBieSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0Pi4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggTUlUICk7CisKKyNkZWZpbmUgX0FUSDVLX1BIWQorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImJhc2UuaCIKKyNpbmNsdWRlICJyZmJ1ZmZlci5oIgorI2luY2x1ZGUgInJmZ2Fpbi5oIgorCitzdGF0aWMgaW5saW5lIGludCBtaW4oaW50IHgsIGludCB5KQoreworCXJldHVybiAoeCA8IHkpID8geCA6IHk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1heChpbnQgeCwgaW50IHkpCit7CisJcmV0dXJuICh4ID4geSkgPyB4IDogeTsKK30KKworLyoKKyAqIFVzZWQgdG8gbW9kaWZ5IFJGIEJhbmtzIGJlZm9yZSB3cml0aW5nIHRoZW0gdG8gQVI1S19SRl9CVUZGRVIKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhdGg1a19od19yZmJfb3Aoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQkJY29uc3Qgc3RydWN0IGF0aDVrX3JmX3JlZyAqcmZfcmVncywKKwkJCQkJdTMyIHZhbCwgdTggcmVnX2lkLCBpbnQgc2V0KQoreworCWNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgKnJmcmVnID0gTlVMTDsKKwl1OCBvZmZzZXQsIGJhbmssIG51bV9iaXRzLCBjb2wsIHBvc2l0aW9uOworCXUxNiBlbnRyeTsKKwl1MzIgbWFzaywgZGF0YSwgbGFzdF9iaXQsIGJpdHNfc2hpZnRlZCwgZmlyc3RfYml0OworCXUzMiAqcmZiOworCXMzMiBiaXRzX2xlZnQ7CisJdW5zaWduZWQgaTsKKworCWRhdGEgPSAwOworCXJmYiA9IGFoLT5haF9yZl9iYW5rczsKKworCWZvciAoaSA9IDA7IGkgPCBhaC0+YWhfcmZfcmVnc19jb3VudDsgaSsrKSB7CisJCWlmIChyZl9yZWdzW2ldLmluZGV4ID09IHJlZ19pZCkgeworCQkJcmZyZWcgPSAmcmZfcmVnc1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJmYiA9PSBOVUxMIHx8IHJmcmVnID09IE5VTEwpIHsKKwkJREJHKCJhdGg1azogUkYgcmVnaXN0ZXIgbm90IGZvdW5kIVxuIik7CisJCS8qIHNob3VsZCBub3QgaGFwcGVuICovCisJCXJldHVybiAwOworCX0KKworCWJhbmsgPSByZnJlZy0+YmFuazsKKwludW1fYml0cyA9IHJmcmVnLT5maWVsZC5sZW47CisJZmlyc3RfYml0ID0gcmZyZWctPmZpZWxkLnBvczsKKwljb2wgPSByZnJlZy0+ZmllbGQuY29sOworCisJLyogZmlyc3RfYml0IGlzIGFuIG9mZnNldCBmcm9tIGJhbmsncworCSAqIHN0YXJ0LiBTaW5jZSB3ZSBoYXZlIGFsbCBiYW5rcyBvbgorCSAqIHRoZSBzYW1lIGFycmF5LCB3ZSB1c2UgdGhpcyBvZmZzZXQKKwkgKiB0byBtYXJrIGVhY2ggYmFuaydzIHN0YXJ0ICovCisJb2Zmc2V0ID0gYWgtPmFoX29mZnNldFtiYW5rXTsKKworCS8qIEJvdW5kYXJ5IGNoZWNrICovCisJaWYgKCEoY29sIDw9IDMgJiYgbnVtX2JpdHMgPD0gMzIgJiYgZmlyc3RfYml0ICsgbnVtX2JpdHMgPD0gMzE5KSkgeworCQlEQkcoImF0aDVrOiBSRiBpbnZhbGlkIHZhbHVlcyBhdCBvZmZzZXQgJWRcbiIsIG9mZnNldCk7CisJCXJldHVybiAwOworCX0KKworCWVudHJ5ID0gKChmaXJzdF9iaXQgLSAxKSAvIDgpICsgb2Zmc2V0OworCXBvc2l0aW9uID0gKGZpcnN0X2JpdCAtIDEpICUgODsKKworCWlmIChzZXQpCisJCWRhdGEgPSBhdGg1a19od19iaXRzd2FwKHZhbCwgbnVtX2JpdHMpOworCisJZm9yIChiaXRzX3NoaWZ0ZWQgPSAwLCBiaXRzX2xlZnQgPSBudW1fYml0czsgYml0c19sZWZ0ID4gMDsKKwlwb3NpdGlvbiA9IDAsIGVudHJ5KyspIHsKKworCQlsYXN0X2JpdCA9IChwb3NpdGlvbiArIGJpdHNfbGVmdCA+IDgpID8gOCA6CisJCQkJCXBvc2l0aW9uICsgYml0c19sZWZ0OworCisJCW1hc2sgPSAoKCgxIDw8IGxhc3RfYml0KSAtIDEpIF4gKCgxIDw8IHBvc2l0aW9uKSAtIDEpKSA8PAorCQkJCQkJCQkoY29sICogOCk7CisKKwkJaWYgKHNldCkgeworCQkJcmZiW2VudHJ5XSAmPSB+bWFzazsKKwkJCXJmYltlbnRyeV0gfD0gKChkYXRhIDw8IHBvc2l0aW9uKSA8PCAoY29sICogOCkpICYgbWFzazsKKwkJCWRhdGEgPj49ICg4IC0gcG9zaXRpb24pOworCQl9IGVsc2UgeworCQkJZGF0YSB8PSAoKChyZmJbZW50cnldICYgbWFzaykgPj4gKGNvbCAqIDgpKSA+PiBwb3NpdGlvbikKKwkJCQk8PCBiaXRzX3NoaWZ0ZWQ7CisJCQliaXRzX3NoaWZ0ZWQgKz0gbGFzdF9iaXQgLSBwb3NpdGlvbjsKKwkJfQorCisJCWJpdHNfbGVmdCAtPSA4IC0gcG9zaXRpb247CisJfQorCisJZGF0YSA9IHNldCA/IDEgOiBhdGg1a19od19iaXRzd2FwKGRhdGEsIG51bV9iaXRzKTsKKworCXJldHVybiBkYXRhOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKlwKKyogUkYgR2FpbiBvcHRpbWl6YXRpb24gKgorXCoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBvcHRpbWl6ZSByZiBnYWluIG9uIGRpZmZlcmVudCBlbnZpcm9ubWVudHMKKyAqICh0ZW1wcmF0dXJlIG1vc3RseSkgYmFzZWQgb24gZmVlZGJhY2sgZnJvbSBhIHBvd2VyIGRldGVjdG9yLgorICoKKyAqIEl0J3Mgb25seSB1c2VkIG9uIFJGNTExMSBhbmQgUkY1MTEyLCBsYXRlciBSRiBjaGlwcyBzZWVtIHRvIGhhdmUKKyAqIGF1dG8gYWRqdXN0bWVudCBvbiBodyAtbm90aWNlIHRoZXkgaGF2ZSBhIG11Y2ggc21hbGxlciBCQU5LIDcgYW5kCisgKiBubyBnYWluIG9wdGltaXphdGlvbiBsYWRkZXItLgorICoKKyAqIEZvciBtb3JlIGluZm9zIGNoZWNrIG91dCB0aGlzIHBhdGVudCBkb2MKKyAqIGh0dHA6Ly93d3cuZnJlZXBhdGVudHNvbmxpbmUuY29tLzc0MDA2OTEuaHRtbAorICoKKyAqIFRoaXMgcGFwZXIgZGVzY3JpYmVzIHBvd2VyIGRyb3BzIGFzIHNlZW4gb24gdGhlIHJlY2VpdmVyIGR1ZSB0bworICogcHJvYmUgcGFja2V0cworICogaHR0cDovL3d3dy5jbnJpLmRpdC5pZS9wdWJsaWNhdGlvbnMvSUNUMDglMjAtJTIwUHJhY3RpY2FsJTIwSXNzdWVzCisgKiAlMjBvZiUyMFBvd2VyJTIwQ29udHJvbC5wZGYKKyAqCisgKiBBbmQgdGhpcyBpcyB0aGUgTWFkV2lGaSBidWcgZW50cnkgcmVsYXRlZCB0byB0aGUgYWJvdmUKKyAqIGh0dHA6Ly9tYWR3aWZpLXByb2plY3Qub3JnL3RpY2tldC8xNjU5CisgKiB3aXRoIHZhcmlvdXMgbWVhc3VyZW1lbnRzIGFuZCBkaWFncmFtcworICoKKyAqIFRPRE86IERlYWwgd2l0aCBwb3dlciBkcm9wcyBkdWUgdG8gcHJvYmVzIGJ5IHNldHRpbmcgYW4gYXByb3ByaWF0ZQorICogdHggcG93ZXIgb24gdGhlIHByb2JlIHBhY2tldHMgISBNYWtlIHRoaXMgcGFydCBvZiB0aGUgY2FsaWJyYXRpb24gcHJvY2Vzcy4KKyAqLworCisvKiBJbml0aWFsaXplIGFoX2dhaW4gZHVycmluZyBhdHRhY2ggKi8KK2ludCBhdGg1a19od19yZmdhaW5fb3B0X2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwkvKiBJbml0aWFsaXplIHRoZSBnYWluIG9wdGltaXphdGlvbiB2YWx1ZXMgKi8KKwlzd2l0Y2ggKGFoLT5haF9yYWRpbykgeworCWNhc2UgQVI1S19SRjUxMTE6CisJCWFoLT5haF9nYWluLmdfc3RlcF9pZHggPSByZmdhaW5fb3B0XzUxMTEuZ29fZGVmYXVsdDsKKwkJYWgtPmFoX2dhaW4uZ19sb3cgPSAyMDsKKwkJYWgtPmFoX2dhaW4uZ19oaWdoID0gMzU7CisJCWFoLT5haF9nYWluLmdfc3RhdGUgPSBBUjVLX1JGR0FJTl9BQ1RJVkU7CisJCWJyZWFrOworCWNhc2UgQVI1S19SRjUxMTI6CisJCWFoLT5haF9nYWluLmdfc3RlcF9pZHggPSByZmdhaW5fb3B0XzUxMTIuZ29fZGVmYXVsdDsKKwkJYWgtPmFoX2dhaW4uZ19sb3cgPSAyMDsKKwkJYWgtPmFoX2dhaW4uZ19oaWdoID0gODU7CisJCWFoLT5haF9nYWluLmdfc3RhdGUgPSBBUjVLX1JGR0FJTl9BQ1RJVkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBTY2hlZHVsZSBhIGdhaW4gcHJvYmUgY2hlY2sgb24gdGhlIG5leHQgdHJhbnNtaXRlZCBwYWNrZXQuCisgKiBUaGF0IG1lYW5zIG91ciBuZXh0IHBhY2tldCBpcyBnb2luZyB0byBiZSBzZW50IHdpdGggbG93ZXIKKyAqIHR4IHBvd2VyIGFuZCBhIFBlYWsgdG8gQXZlcmFnZSBQb3dlciBEZXRlY3RvciAoUEFQRCkgd2lsbCB0cnkKKyAqIHRvIG1lYXN1cmUgdGhlIGdhaW4uCisgKgorICogVE9ETzogVXNlIHByb3BwZXIgdHggcG93ZXIgc2V0dGluZyBmb3IgdGhlIHByb2JlIHBhY2tldCBzbworICogdGhhdCB3ZSBkb24ndCBvYnNlcnZlIGEgc2VyaW91cyBwb3dlciBkcm9wIG9uIHRoZSByZWNlaXZlcgorICoKKyAqIFhYWDogIEhvdyBhYm91dCBmb3JjaW5nIGEgdHggcGFja2V0IChieXBhc3NpbmcgUENVIGFyYml0cmF0b3IgZXRjKQorICoganVzdCBhZnRlciB3ZSBlbmFibGUgdGhlIHByb2JlIHNvIHRoYXQgd2UgZG9uJ3QgbWVzcyB3aXRoCisgKiBzdGFuZGFyZCB0cmFmZmljID8gTWF5YmUgaXQncyB0aW1lIHRvIHVzZSBzdyBpbnRlcnJ1cHRzIGFuZAorICogYSBwcm9iZSB0YXNrbGV0ICEhIQorICovCitzdGF0aWMgdm9pZCBhdGg1a19od19yZXF1ZXN0X3JmZ2Fpbl9wcm9iZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCisJLyogU2tpcCBpZiBnYWluIGNhbGlicmF0aW9uIGlzIGluYWN0aXZlIG9yCisJICogd2UgYWxyZWFkeSBoYW5kbGUgYSBwcm9iZSByZXF1ZXN0ICovCisJaWYgKGFoLT5haF9nYWluLmdfc3RhdGUgIT0gQVI1S19SRkdBSU5fQUNUSVZFKQorCQlyZXR1cm47CisKKwkvKiBTZW5kIHRoZSBwYWNrZXQgd2l0aCAyZEIgYmVsb3cgbWF4IHBvd2VyIGFzCisJICogcGF0ZW50IGRvYyBzdWdnZXN0ICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTShhaC0+YWhfdHhwb3dlci50eHBfbWF4X3B3ciAtIDQsCisJCQlBUjVLX1BIWV9QQVBEX1BST0JFX1RYUE9XRVIpIHwKKwkJCUFSNUtfUEhZX1BBUERfUFJPQkVfVFhfTkVYVCwgQVI1S19QSFlfUEFQRF9QUk9CRSk7CisKKwlhaC0+YWhfZ2Fpbi5nX3N0YXRlID0gQVI1S19SRkdBSU5fUkVBRF9SRVFVRVNURUQ7CisKK30KKworLyogQ2FsY3VsYXRlIGdhaW5fRiBtZWFzdXJlbWVudCBjb3JyZWN0aW9uCisgKiBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGVwIGZvciBSRjUxMTIgcmV2LiAyICovCitzdGF0aWMgdTMyIGF0aDVrX2h3X3JmX2dhaW5mX2NvcnIoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwl1MzIgbWl4LCBzdGVwOworCXUzMiAqcmY7CisJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0ICpnbzsKKwljb25zdCBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcCAqZ19zdGVwOworCWNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgKnJmX3JlZ3M7CisKKwkvKiBPbmx5IFJGNTExMiBSZXYuIDIgc3VwcG9ydHMgaXQgKi8KKwlpZiAoKGFoLT5haF9yYWRpbyAhPSBBUjVLX1JGNTExMikgfHwKKwkoYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPD0gQVI1S19TUkVWX1JBRF81MTEyQSkpCisJCXJldHVybiAwOworCisJZ28gPSAmcmZnYWluX29wdF81MTEyOworCXJmX3JlZ3MgPSByZl9yZWdzXzUxMTJhOworCWFoLT5haF9yZl9yZWdzX2NvdW50ID0gQVJSQVlfU0laRShyZl9yZWdzXzUxMTJhKTsKKworCWdfc3RlcCA9ICZnby0+Z29fc3RlcFthaC0+YWhfZ2Fpbi5nX3N0ZXBfaWR4XTsKKworCWlmIChhaC0+YWhfcmZfYmFua3MgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZiA9IGFoLT5haF9yZl9iYW5rczsKKwlhaC0+YWhfZ2Fpbi5nX2ZfY29yciA9IDA7CisKKwkvKiBObyBWR0EgKFZhcmlhYmxlIEdhaW4gQW1wbGlmaWVyKSBvdmVycmlkZSwgc2tpcCAqLworCWlmIChhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIDAsIEFSNUtfUkZfTUlYVkdBX09WUiwgMCkgIT0gMSkKKwkJcmV0dXJuIDA7CisKKwkvKiBNaXggZ2FpbiBzdGVwcGluZyAqLworCXN0ZXAgPSBhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIDAsIEFSNUtfUkZfTUlYR0FJTl9TVEVQLCAwKTsKKworCS8qIE1peCBnYWluIG92ZXJyaWRlICovCisJbWl4ID0gZ19zdGVwLT5nb3NfcGFyYW1bMF07CisKKwlzd2l0Y2ggKG1peCkgeworCWNhc2UgMzoKKwkJYWgtPmFoX2dhaW4uZ19mX2NvcnIgPSBzdGVwICogMjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlhaC0+YWhfZ2Fpbi5nX2ZfY29yciA9IChzdGVwIC0gNSkgKiAyOworCQlicmVhazsKKwljYXNlIDE6CisJCWFoLT5haF9nYWluLmdfZl9jb3JyID0gc3RlcDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYWgtPmFoX2dhaW4uZ19mX2NvcnIgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYWgtPmFoX2dhaW4uZ19mX2NvcnI7Cit9CisKKy8qIENoZWNrIGlmIGN1cnJlbnQgZ2Fpbl9GIG1lYXN1cmVtZW50IGlzIGluIHRoZSByYW5nZSBvZiBvdXIKKyAqIHBvd2VyIGRldGVjdG9yIHdpbmRvd3MuIElmIHdlIGdldCBhIG1lYXN1cmVtZW50IG91dHNpZGUgcmFuZ2UKKyAqIHdlIGtub3cgaXQncyBub3QgYWNjdXJhdGUgKGRldGVjdG9ycyBjYW4ndCBtZWFzdXJlIGFueXRoaW5nIG91dHNpZGUKKyAqIHRoZWlyIGRldGVjdGlvbiB3aW5kb3cpIHNvIHdlIG11c3QgaWdub3JlIGl0ICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3JmX2NoZWNrX2dhaW5mX3JlYWRiYWNrKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJY29uc3Qgc3RydWN0IGF0aDVrX3JmX3JlZyAqcmZfcmVnczsKKwl1MzIgc3RlcCwgbWl4X292ciwgbGV2ZWxbNF07CisJdTMyICpyZjsKKworCWlmIChhaC0+YWhfcmZfYmFua3MgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZiA9IGFoLT5haF9yZl9iYW5rczsKKworCWlmIChhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTEpIHsKKworCQlyZl9yZWdzID0gcmZfcmVnc181MTExOworCQlhaC0+YWhfcmZfcmVnc19jb3VudCA9IEFSUkFZX1NJWkUocmZfcmVnc181MTExKTsKKworCQlzdGVwID0gYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCAwLCBBUjVLX1JGX1JGR0FJTl9TVEVQLAorCQkJMCk7CisKKwkJbGV2ZWxbMF0gPSAwOworCQlsZXZlbFsxXSA9IChzdGVwID09IDYzKSA/IDUwIDogc3RlcCArIDQ7CisJCWxldmVsWzJdID0gKHN0ZXAgIT0gNjMpID8gNjQgOiBsZXZlbFswXTsKKwkJbGV2ZWxbM10gPSBsZXZlbFsyXSArIDUwIDsKKworCQlhaC0+YWhfZ2Fpbi5nX2hpZ2ggPSBsZXZlbFszXSAtCisJCQkoc3RlcCA9PSA2MyA/IEFSNUtfR0FJTl9EWU5fQURKVVNUX0hJX01BUkdJTiA6IC01KTsKKwkJYWgtPmFoX2dhaW4uZ19sb3cgPSBsZXZlbFswXSArCisJCQkoc3RlcCA9PSA2MyA/IEFSNUtfR0FJTl9EWU5fQURKVVNUX0xPX01BUkdJTiA6IDApOworCX0gZWxzZSB7CisKKwkJcmZfcmVncyA9IHJmX3JlZ3NfNTExMjsKKwkJYWgtPmFoX3JmX3JlZ3NfY291bnQgPSBBUlJBWV9TSVpFKHJmX3JlZ3NfNTExMik7CisKKwkJbWl4X292ciA9IGF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgMCwgQVI1S19SRl9NSVhWR0FfT1ZSLAorCQkJMCk7CisKKwkJbGV2ZWxbMF0gPSBsZXZlbFsyXSA9IDA7CisKKwkJaWYgKG1peF9vdnIgPT0gMSkgeworCQkJbGV2ZWxbMV0gPSBsZXZlbFszXSA9IDgzOworCQl9IGVsc2UgeworCQkJbGV2ZWxbMV0gPSBsZXZlbFszXSA9IDEwNzsKKwkJCWFoLT5haF9nYWluLmdfaGlnaCA9IDU1OworCQl9CisJfQorCisJcmV0dXJuIChhaC0+YWhfZ2Fpbi5nX2N1cnJlbnQgPj0gbGV2ZWxbMF0gJiYKKwkJCWFoLT5haF9nYWluLmdfY3VycmVudCA8PSBsZXZlbFsxXSkgfHwKKwkJKGFoLT5haF9nYWluLmdfY3VycmVudCA+PSBsZXZlbFsyXSAmJgorCQkJYWgtPmFoX2dhaW4uZ19jdXJyZW50IDw9IGxldmVsWzNdKTsKK30KKworLyogUGVyZm9ybSBnYWluX0YgYWRqdXN0bWVudCBieSBjaG9vc2luZyB0aGUgcmlnaHQgc2V0CisgKiBvZiBwYXJhbWV0ZXJzIGZyb20gcmYgZ2FpbiBvcHRpbWl6YXRpb24gbGFkZGVyICovCitzdGF0aWMgczggYXRoNWtfaHdfcmZfZ2FpbmZfYWRqdXN0KHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0ICpnbzsKKwljb25zdCBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcCAqZ19zdGVwOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChhaC0+YWhfcmFkaW8pIHsKKwljYXNlIEFSNUtfUkY1MTExOgorCQlnbyA9ICZyZmdhaW5fb3B0XzUxMTE7CisJCWJyZWFrOworCWNhc2UgQVI1S19SRjUxMTI6CisJCWdvID0gJnJmZ2Fpbl9vcHRfNTExMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJZ19zdGVwID0gJmdvLT5nb19zdGVwW2FoLT5haF9nYWluLmdfc3RlcF9pZHhdOworCisJaWYgKGFoLT5haF9nYWluLmdfY3VycmVudCA+PSBhaC0+YWhfZ2Fpbi5nX2hpZ2gpIHsKKworCQkvKiBSZWFjaGVkIG1heGltdW0gKi8KKwkJaWYgKGFoLT5haF9nYWluLmdfc3RlcF9pZHggPT0gMCkKKwkJCXJldHVybiAtMTsKKworCQlmb3IgKGFoLT5haF9nYWluLmdfdGFyZ2V0ID0gYWgtPmFoX2dhaW4uZ19jdXJyZW50OworCQkJCWFoLT5haF9nYWluLmdfdGFyZ2V0ID49ICBhaC0+YWhfZ2Fpbi5nX2hpZ2ggJiYKKwkJCQlhaC0+YWhfZ2Fpbi5nX3N0ZXBfaWR4ID4gMDsKKwkJCQlnX3N0ZXAgPSAmZ28tPmdvX3N0ZXBbYWgtPmFoX2dhaW4uZ19zdGVwX2lkeF0pCisJCQlhaC0+YWhfZ2Fpbi5nX3RhcmdldCAtPSAyICoKKwkJCSAgICAoZ28tPmdvX3N0ZXBbLS0oYWgtPmFoX2dhaW4uZ19zdGVwX2lkeCldLmdvc19nYWluIC0KKwkJCSAgICBnX3N0ZXAtPmdvc19nYWluKTsKKworCQlyZXQgPSAxOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGFoLT5haF9nYWluLmdfY3VycmVudCA8PSBhaC0+YWhfZ2Fpbi5nX2xvdykgeworCisJCS8qIFJlYWNoZWQgbWluaW11bSAqLworCQlpZiAoYWgtPmFoX2dhaW4uZ19zdGVwX2lkeCA9PSAoZ28tPmdvX3N0ZXBzX2NvdW50IC0gMSkpCisJCQlyZXR1cm4gLTI7CisKKwkJZm9yIChhaC0+YWhfZ2Fpbi5nX3RhcmdldCA9IGFoLT5haF9nYWluLmdfY3VycmVudDsKKwkJCQlhaC0+YWhfZ2Fpbi5nX3RhcmdldCA8PSBhaC0+YWhfZ2Fpbi5nX2xvdyAmJgorCQkJCWFoLT5haF9nYWluLmdfc3RlcF9pZHggPCBnby0+Z29fc3RlcHNfY291bnQtMTsKKwkJCQlnX3N0ZXAgPSAmZ28tPmdvX3N0ZXBbYWgtPmFoX2dhaW4uZ19zdGVwX2lkeF0pCisJCQlhaC0+YWhfZ2Fpbi5nX3RhcmdldCAtPSAyICoKKwkJCSAgICAoZ28tPmdvX3N0ZXBbKythaC0+YWhfZ2Fpbi5nX3N0ZXBfaWR4XS5nb3NfZ2FpbiAtCisJCQkgICAgZ19zdGVwLT5nb3NfZ2Fpbik7CisKKwkJcmV0ID0gMjsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlEQkcyKCJhdGg1ayBSRiBhZGp1c3Q6IHJldCAlZCwgZ2FpbiBzdGVwICVkLCBjdXJyZW50IGdhaW4gJWQsICIKKwkgICAgICJ0YXJnZXQgZ2FpbiAlZFxuIiwgcmV0LCBhaC0+YWhfZ2Fpbi5nX3N0ZXBfaWR4LAorCSAgICAgYWgtPmFoX2dhaW4uZ19jdXJyZW50LCBhaC0+YWhfZ2Fpbi5nX3RhcmdldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBNYWluIGNhbGxiYWNrIGZvciB0aGVybWFsIHJmIGdhaW4gY2FsaWJyYXRpb24gZW5naW5lCisgKiBDaGVjayBmb3IgYSBuZXcgZ2FpbiByZWFkaW5nIGFuZCBzY2hlZHVsZSBhbiBhZGp1c3RtZW50CisgKiBpZiBuZWVkZWQuCisgKgorICogVE9ETzogVXNlIHN3IGludGVycnVwdCB0byBzY2hlZHVsZSByZXNldCBpZiBnYWluX0YgbmVlZHMKKyAqIGFkanVzdG1lbnQgKi8KK2VudW0gYXRoNWtfcmZnYWluIGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXUzMiBkYXRhLCB0eXBlOworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCisJaWYgKGFoLT5haF9yZl9iYW5rcyA9PSBOVUxMIHx8CisJYWgtPmFoX2dhaW4uZ19zdGF0ZSA9PSBBUjVLX1JGR0FJTl9JTkFDVElWRSkKKwkJcmV0dXJuIEFSNUtfUkZHQUlOX0lOQUNUSVZFOworCisJLyogTm8gY2hlY2sgcmVxdWVzdGVkLCBlaXRoZXIgZW5naW5lIGlzIGluYWN0aXZlCisJICogb3IgYW4gYWRqdXN0bWVudCBpcyBhbHJlYWR5IHJlcXVlc3RlZCAqLworCWlmIChhaC0+YWhfZ2Fpbi5nX3N0YXRlICE9IEFSNUtfUkZHQUlOX1JFQURfUkVRVUVTVEVEKQorCQlnb3RvIGRvbmU7CisKKwkvKiBSZWFkIHRoZSBQQVBEIChQZWFrIHRvIEF2ZXJhZ2UgUG93ZXIgRGV0ZWN0b3IpCisJICogcmVnaXN0ZXIgKi8KKwlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1BBUERfUFJPQkUpOworCisJLyogTm8gcHJvYmUgaXMgc2NoZWR1bGVkLCByZWFkIGdhaW5fRiBtZWFzdXJlbWVudCAqLworCWlmICghKGRhdGEgJiBBUjVLX1BIWV9QQVBEX1BST0JFX1RYX05FWFQpKSB7CisJCWFoLT5haF9nYWluLmdfY3VycmVudCA9IGRhdGEgPj4gQVI1S19QSFlfUEFQRF9QUk9CRV9HQUlORl9TOworCQl0eXBlID0gQVI1S19SRUdfTVMoZGF0YSwgQVI1S19QSFlfUEFQRF9QUk9CRV9UWVBFKTsKKworCQkvKiBJZiB0eCBwYWNrZXQgaXMgQ0NLIGNvcnJlY3QgdGhlIGdhaW5fRiBtZWFzdXJlbWVudAorCQkgKiBieSBjY2sgb2ZkbSBnYWluIGRlbHRhICovCisJCWlmICh0eXBlID09IEFSNUtfUEhZX1BBUERfUFJPQkVfVFlQRV9DQ0spIHsKKwkJCWlmIChhaC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiA+PSBBUjVLX1NSRVZfUkFEXzUxMTJBKQorCQkJCWFoLT5haF9nYWluLmdfY3VycmVudCArPQorCQkJCQllZS0+ZWVfY2NrX29mZG1fZ2Fpbl9kZWx0YTsKKwkJCWVsc2UKKwkJCQlhaC0+YWhfZ2Fpbi5nX2N1cnJlbnQgKz0KKwkJCQkJQVI1S19HQUlOX0NDS19QUk9CRV9DT1JSOworCQl9CisKKwkJLyogRnVydGhlciBjb3JyZWN0IGdhaW5fRiBtZWFzdXJlbWVudCBmb3IKKwkJICogUkY1MTEyQSByYWRpb3MgKi8KKwkJaWYgKGFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uID49IEFSNUtfU1JFVl9SQURfNTExMkEpIHsKKwkJCWF0aDVrX2h3X3JmX2dhaW5mX2NvcnIoYWgpOworCQkJYWgtPmFoX2dhaW4uZ19jdXJyZW50ID0KKwkJCQlhaC0+YWhfZ2Fpbi5nX2N1cnJlbnQgPj0gYWgtPmFoX2dhaW4uZ19mX2NvcnIgPworCQkJCShhaC0+YWhfZ2Fpbi5nX2N1cnJlbnQtYWgtPmFoX2dhaW4uZ19mX2NvcnIpIDoKKwkJCQkwOworCQl9CisKKwkJLyogQ2hlY2sgaWYgbWVhc3VyZW1lbnQgaXMgb2sgYW5kIGlmIHdlIG5lZWQKKwkJICogdG8gYWRqdXN0IGdhaW4sIHNjaGVkdWxlIGEgZ2FpbiBhZGp1c3RtZW50LAorCQkgKiBlbHNlIHN3aXRjaCBiYWNrIHRvIHRoZSBhY2l2ZSBzdGF0ZSAqLworCQlpZiAoYXRoNWtfaHdfcmZfY2hlY2tfZ2FpbmZfcmVhZGJhY2soYWgpICYmCisJCUFSNUtfR0FJTl9DSEVDS19BREpVU1QoJmFoLT5haF9nYWluKSAmJgorCQlhdGg1a19od19yZl9nYWluZl9hZGp1c3QoYWgpKSB7CisJCQlhaC0+YWhfZ2Fpbi5nX3N0YXRlID0gQVI1S19SRkdBSU5fTkVFRF9DSEFOR0U7CisJCX0gZWxzZSB7CisJCQlhaC0+YWhfZ2Fpbi5nX3N0YXRlID0gQVI1S19SRkdBSU5fQUNUSVZFOworCQl9CisJfQorCitkb25lOgorCXJldHVybiBhaC0+YWhfZ2Fpbi5nX3N0YXRlOworfQorCisvKiBXcml0ZSBpbml0aWFsIHJmIGdhaW4gdGFibGUgdG8gc2V0IHRoZSBSRiBzZW5zaXRpdml0eQorICogdGhpcyBvbmUgd29ya3Mgb24gYWxsIFJGIGNoaXBzIGFuZCBoYXMgbm90aGluZyB0byBkbworICogd2l0aCBnYWluX0YgY2FsaWJyYXRpb24gKi8KK2ludCBhdGg1a19od19yZmdhaW5faW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgZnJlcSkKK3sKKwljb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmZ2FpbiAqYXRoNWtfcmZnOworCXVuc2lnbmVkIGludCBpLCBzaXplOworCisJc3dpdGNoIChhaC0+YWhfcmFkaW8pIHsKKwljYXNlIEFSNUtfUkY1MTExOgorCQlhdGg1a19yZmcgPSByZmdhaW5fNTExMTsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUocmZnYWluXzUxMTEpOworCQlicmVhazsKKwljYXNlIEFSNUtfUkY1MTEyOgorCQlhdGg1a19yZmcgPSByZmdhaW5fNTExMjsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUocmZnYWluXzUxMTIpOworCQlicmVhazsKKwljYXNlIEFSNUtfUkYyNDEzOgorCQlhdGg1a19yZmcgPSByZmdhaW5fMjQxMzsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUocmZnYWluXzI0MTMpOworCQlicmVhazsKKwljYXNlIEFSNUtfUkYyMzE2OgorCQlhdGg1a19yZmcgPSByZmdhaW5fMjMxNjsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUocmZnYWluXzIzMTYpOworCQlicmVhazsKKwljYXNlIEFSNUtfUkY1NDEzOgorCQlhdGg1a19yZmcgPSByZmdhaW5fNTQxMzsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUocmZnYWluXzU0MTMpOworCQlicmVhazsKKwljYXNlIEFSNUtfUkYyMzE3OgorCWNhc2UgQVI1S19SRjI0MjU6CisJCWF0aDVrX3JmZyA9IHJmZ2Fpbl8yNDI1OworCQlzaXplID0gQVJSQVlfU0laRShyZmdhaW5fMjQyNSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZnJlcSkgeworCWNhc2UgQVI1S19JTklfUkZHQUlOXzJHSFo6CisJY2FzZSBBUjVLX0lOSV9SRkdBSU5fNUdIWjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlBUjVLX1JFR19XQUlUKGkpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGF0aDVrX3JmZ1tpXS5yZmdfdmFsdWVbZnJlcV0sCisJCQkodTMyKWF0aDVrX3JmZ1tpXS5yZmdfcmVnaXN0ZXIpOworCX0KKworCXJldHVybiAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqXAorKiBSRiBSZWdpc3RlcnMgc2V0dXAgKgorXCoqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKiBTZXR1cCBSRiByZWdpc3RlcnMgYnkgd3JpdGluZyByZiBidWZmZXIgb24gaHcKKyAqLworaW50IGF0aDVrX2h3X3JmcmVnc19pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVsLAorCQl1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwljb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnICpyZl9yZWdzOworCWNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZidWZmZXIgKmluaV9yZmI7CisJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0ICpnbyA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0X3N0ZXAgKmdfc3RlcDsKKwlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKKwl1OCBlZV9tb2RlID0gMDsKKwl1MzIgKnJmYjsKKwlpbnQgb2JkYiA9IC0xLCBiYW5rID0gLTE7CisJdW5zaWduZWQgaTsKKworCXN3aXRjaCAoYWgtPmFoX3JhZGlvKSB7CisJY2FzZSBBUjVLX1JGNTExMToKKwkJcmZfcmVncyA9IHJmX3JlZ3NfNTExMTsKKwkJYWgtPmFoX3JmX3JlZ3NfY291bnQgPSBBUlJBWV9TSVpFKHJmX3JlZ3NfNTExMSk7CisJCWluaV9yZmIgPSByZmJfNTExMTsKKwkJYWgtPmFoX3JmX2JhbmtzX3NpemUgPSBBUlJBWV9TSVpFKHJmYl81MTExKTsKKwkJZ28gPSAmcmZnYWluX29wdF81MTExOworCQlicmVhazsKKwljYXNlIEFSNUtfUkY1MTEyOgorCQlpZiAoYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPj0gQVI1S19TUkVWX1JBRF81MTEyQSkgeworCQkJcmZfcmVncyA9IHJmX3JlZ3NfNTExMmE7CisJCQlhaC0+YWhfcmZfcmVnc19jb3VudCA9IEFSUkFZX1NJWkUocmZfcmVnc181MTEyYSk7CisJCQlpbmlfcmZiID0gcmZiXzUxMTJhOworCQkJYWgtPmFoX3JmX2JhbmtzX3NpemUgPSBBUlJBWV9TSVpFKHJmYl81MTEyYSk7CisJCX0gZWxzZSB7CisJCQlyZl9yZWdzID0gcmZfcmVnc181MTEyOworCQkJYWgtPmFoX3JmX3JlZ3NfY291bnQgPSBBUlJBWV9TSVpFKHJmX3JlZ3NfNTExMik7CisJCQlpbmlfcmZiID0gcmZiXzUxMTI7CisJCQlhaC0+YWhfcmZfYmFua3Nfc2l6ZSA9IEFSUkFZX1NJWkUocmZiXzUxMTIpOworCQl9CisJCWdvID0gJnJmZ2Fpbl9vcHRfNTExMjsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1JGMjQxMzoKKwkJcmZfcmVncyA9IHJmX3JlZ3NfMjQxMzsKKwkJYWgtPmFoX3JmX3JlZ3NfY291bnQgPSBBUlJBWV9TSVpFKHJmX3JlZ3NfMjQxMyk7CisJCWluaV9yZmIgPSByZmJfMjQxMzsKKwkJYWgtPmFoX3JmX2JhbmtzX3NpemUgPSBBUlJBWV9TSVpFKHJmYl8yNDEzKTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1JGMjMxNjoKKwkJcmZfcmVncyA9IHJmX3JlZ3NfMjMxNjsKKwkJYWgtPmFoX3JmX3JlZ3NfY291bnQgPSBBUlJBWV9TSVpFKHJmX3JlZ3NfMjMxNik7CisJCWluaV9yZmIgPSByZmJfMjMxNjsKKwkJYWgtPmFoX3JmX2JhbmtzX3NpemUgPSBBUlJBWV9TSVpFKHJmYl8yMzE2KTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1JGNTQxMzoKKwkJcmZfcmVncyA9IHJmX3JlZ3NfNTQxMzsKKwkJYWgtPmFoX3JmX3JlZ3NfY291bnQgPSBBUlJBWV9TSVpFKHJmX3JlZ3NfNTQxMyk7CisJCWluaV9yZmIgPSByZmJfNTQxMzsKKwkJYWgtPmFoX3JmX2JhbmtzX3NpemUgPSBBUlJBWV9TSVpFKHJmYl81NDEzKTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1JGMjMxNzoKKwkJcmZfcmVncyA9IHJmX3JlZ3NfMjQyNTsKKwkJYWgtPmFoX3JmX3JlZ3NfY291bnQgPSBBUlJBWV9TSVpFKHJmX3JlZ3NfMjQyNSk7CisJCWluaV9yZmIgPSByZmJfMjMxNzsKKwkJYWgtPmFoX3JmX2JhbmtzX3NpemUgPSBBUlJBWV9TSVpFKHJmYl8yMzE3KTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1JGMjQyNToKKwkJcmZfcmVncyA9IHJmX3JlZ3NfMjQyNTsKKwkJYWgtPmFoX3JmX3JlZ3NfY291bnQgPSBBUlJBWV9TSVpFKHJmX3JlZ3NfMjQyNSk7CisJCWlmIChhaC0+YWhfbWFjX3NyZXYgPCBBUjVLX1NSRVZfQVIyNDE3KSB7CisJCQlpbmlfcmZiID0gcmZiXzI0MjU7CisJCQlhaC0+YWhfcmZfYmFua3Nfc2l6ZSA9IEFSUkFZX1NJWkUocmZiXzI0MjUpOworCQl9IGVsc2UgeworCQkJaW5pX3JmYiA9IHJmYl8yNDE3OworCQkJYWgtPmFoX3JmX2JhbmtzX3NpemUgPSBBUlJBWV9TSVpFKHJmYl8yNDE3KTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBpdCdzIHRoZSBmaXJzdCB0aW1lIHdlIHNldCByZiBidWZmZXIsIGFsbG9jYXRlCisJICogYWgtPmFoX3JmX2JhbmtzIGJhc2VkIG9uIGFoLT5haF9yZl9iYW5rc19zaXplCisJICogd2Ugc2V0IGFib3ZlICovCisJaWYgKGFoLT5haF9yZl9iYW5rcyA9PSBOVUxMKSB7CisJCWFoLT5haF9yZl9iYW5rcyA9IG1hbGxvYyhzaXplb2YodTMyKSAqIGFoLT5haF9yZl9iYW5rc19zaXplKTsKKwkJaWYgKGFoLT5haF9yZl9iYW5rcyA9PSBOVUxMKSB7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCS8qIENvcHkgdmFsdWVzIHRvIG1vZGlmeSB0aGVtICovCisJcmZiID0gYWgtPmFoX3JmX2JhbmtzOworCisJZm9yIChpID0gMDsgaSA8IGFoLT5haF9yZl9iYW5rc19zaXplOyBpKyspIHsKKwkJaWYgKGluaV9yZmJbaV0ucmZiX2JhbmsgPj0gQVI1S19NQVhfUkZfQkFOS1MpIHsKKwkJCURCRygiYXRoNWs6IGludmFsaWQgUkYgcmVnaXN0ZXIgYmFua1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIEJhbmsgY2hhbmdlZCwgd3JpdGUgZG93biB0aGUgb2Zmc2V0ICovCisJCWlmIChiYW5rICE9IGluaV9yZmJbaV0ucmZiX2JhbmspIHsKKwkJCWJhbmsgPSBpbmlfcmZiW2ldLnJmYl9iYW5rOworCQkJYWgtPmFoX29mZnNldFtiYW5rXSA9IGk7CisJCX0KKworCQlyZmJbaV0gPSBpbmlfcmZiW2ldLnJmYl9tb2RlX2RhdGFbbW9kZV07CisJfQorCisJLyogU2V0IE91dHB1dCBhbmQgRHJpdmVyIGJpYXMgY3VycmVudCAoT0IvREIpICovCisJaWYgKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF8yR0haKSB7CisKKwkJaWYgKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9DQ0spCisJCQllZV9tb2RlID0gQVI1S19FRVBST01fTU9ERV8xMUI7CisJCWVsc2UKKwkJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExRzsKKworCQkvKiBGb3IgUkY1MTFYL1JGMjExWCBjb21iaW5hdGlvbiB3ZQorCQkgKiB1c2UgYl9PQiBhbmQgYl9EQiBwYXJhbWV0ZXJzIHN0b3JlZAorCQkgKiBpbiBlZXByb20gb24gZWUtPmVlX29iW2VlX21vZGVdWzBdCisJCSAqCisJCSAqIEZvciBhbGwgb3RoZXIgY2hpcHMgd2UgdXNlIE9CL0RCIGZvciAyR2h6CisJCSAqIHN0b3JlZCBpbiB0aGUgYi9nIG1vZGFsIHNlY3Rpb24ganVzdCBsaWtlCisJCSAqIDgwMi4xMWEgb24gZWUtPmVlX29iW2VlX21vZGVdWzFdICovCisJCWlmICgoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTExKSB8fAorCQkoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTEyKSkKKwkJCW9iZGIgPSAwOworCQllbHNlCisJCQlvYmRiID0gMTsKKworCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGVlLT5lZV9vYltlZV9tb2RlXVtvYmRiXSwKKwkJCQkJCUFSNUtfUkZfT0JfMkdIWiwgMSk7CisKKwkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCBlZS0+ZWVfZGJbZWVfbW9kZV1bb2JkYl0sCisJCQkJCQlBUjVLX1JGX0RCXzJHSFosIDEpOworCisJLyogUkY1MTExIGFsd2F5cyBuZWVkcyBPQi9EQiBmb3IgNUdIeiwgZXZlbiBpZiB3ZSB1c2UgMkdIeiAqLworCX0gZWxzZSBpZiAoKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF81R0haKSB8fAorCQkJKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMSkpIHsKKworCQkvKiBGb3IgMTFhLCBUdXJibyBhbmQgWFIgd2UgbmVlZCB0byBjaG9vc2UKKwkJICogT0IvREIgYmFzZWQgb24gZnJlcXVlbmN5IHJhbmdlICovCisJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsKKwkJb2JkYiA9CSBjaGFubmVsLT5jZW50ZXJfZnJlcSA+PSA1NzI1ID8gMyA6CisJCQkoY2hhbm5lbC0+Y2VudGVyX2ZyZXEgPj0gNTUwMCA/IDIgOgorCQkJKGNoYW5uZWwtPmNlbnRlcl9mcmVxID49IDUyNjAgPyAxIDoKKwkJCSAoY2hhbm5lbC0+Y2VudGVyX2ZyZXEgPiA0MDAwID8gMCA6IC0xKSkpOworCisJCWlmIChvYmRiIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgZWUtPmVlX29iW2VlX21vZGVdW29iZGJdLAorCQkJCQkJQVI1S19SRl9PQl81R0haLCAxKTsKKworCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGVlLT5lZV9kYltlZV9tb2RlXVtvYmRiXSwKKwkJCQkJCUFSNUtfUkZfREJfNUdIWiwgMSk7CisJfQorCisJZ19zdGVwID0gJmdvLT5nb19zdGVwW2FoLT5haF9nYWluLmdfc3RlcF9pZHhdOworCisJLyogQmFuayBNb2RpZmljYXRpb25zIChjaGlwLXNwZWNpZmljKSAqLworCWlmIChhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTEpIHsKKworCQkvKiBTZXQgZ2Fpbl9GIHNldHRpbmdzIGFjY29yZGluZyB0byBjdXJyZW50IHN0ZXAgKi8KKwkJaWYgKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9PRkRNKSB7CisKKwkJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX0ZSQU1FX0NUTCwKKwkJCQkJQVI1S19QSFlfRlJBTUVfQ1RMX1RYX0NMSVAsCisJCQkJCWdfc3RlcC0+Z29zX3BhcmFtWzBdKTsKKworCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCBnX3N0ZXAtPmdvc19wYXJhbVsxXSwKKwkJCQkJCQlBUjVLX1JGX1BXRF85MCwgMSk7CisKKwkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgZ19zdGVwLT5nb3NfcGFyYW1bMl0sCisJCQkJCQkJQVI1S19SRl9QV0RfODQsIDEpOworCisJCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGdfc3RlcC0+Z29zX3BhcmFtWzNdLAorCQkJCQkJQVI1S19SRl9SRkdBSU5fU0VMLCAxKTsKKworCQkJLyogV2UgcHJvZ3JhbW1lZCBnYWluX0YgcGFyYW1ldGVycywgc3dpdGNoIGJhY2sKKwkJCSAqIHRvIGFjdGl2ZSBzdGF0ZSAqLworCQkJYWgtPmFoX2dhaW4uZ19zdGF0ZSA9IEFSNUtfUkZHQUlOX0FDVElWRTsKKworCQl9CisKKwkJLyogQmFuayA2Lzcgc2V0dXAgKi8KKworCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsICFlZS0+ZWVfeHBkW2VlX21vZGVdLAorCQkJCQkJQVI1S19SRl9QV0RfWFBELCAxKTsKKworCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGVlLT5lZV94X2dhaW5bZWVfbW9kZV0sCisJCQkJCQlBUjVLX1JGX1hQRF9HQUlOLCAxKTsKKworCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGVlLT5lZV9pX2dhaW5bZWVfbW9kZV0sCisJCQkJCQlBUjVLX1JGX0dBSU5fSSwgMSk7CisKKwkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCBlZS0+ZWVfeHBkW2VlX21vZGVdLAorCQkJCQkJQVI1S19SRl9QTE9fU0VMLCAxKTsKKworCQkvKiBUT0RPOiBIYWxmL3F1YXJ0ZXIgY2hhbm5lbCBzdXBwb3J0ICovCisJfQorCisJaWYgKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMikgeworCisJCS8qIFNldCBnYWluX0Ygc2V0dGluZ3MgYWNjb3JkaW5nIHRvIGN1cnJlbnQgc3RlcCAqLworCQlpZiAoY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMX09GRE0pIHsKKworCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCBnX3N0ZXAtPmdvc19wYXJhbVswXSwKKwkJCQkJCUFSNUtfUkZfTUlYR0FJTl9PVlIsIDEpOworCisJCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGdfc3RlcC0+Z29zX3BhcmFtWzFdLAorCQkJCQkJQVI1S19SRl9QV0RfMTM4LCAxKTsKKworCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCBnX3N0ZXAtPmdvc19wYXJhbVsyXSwKKwkJCQkJCUFSNUtfUkZfUFdEXzEzNywgMSk7CisKKwkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgZ19zdGVwLT5nb3NfcGFyYW1bM10sCisJCQkJCQlBUjVLX1JGX1BXRF8xMzYsIDEpOworCisJCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGdfc3RlcC0+Z29zX3BhcmFtWzRdLAorCQkJCQkJQVI1S19SRl9QV0RfMTMyLCAxKTsKKworCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCBnX3N0ZXAtPmdvc19wYXJhbVs1XSwKKwkJCQkJCUFSNUtfUkZfUFdEXzEzMSwgMSk7CisKKwkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgZ19zdGVwLT5nb3NfcGFyYW1bNl0sCisJCQkJCQlBUjVLX1JGX1BXRF8xMzAsIDEpOworCisJCQkvKiBXZSBwcm9ncmFtbWVkIGdhaW5fRiBwYXJhbWV0ZXJzLCBzd2l0Y2ggYmFjaworCQkJICogdG8gYWN0aXZlIHN0YXRlICovCisJCQlhaC0+YWhfZ2Fpbi5nX3N0YXRlID0gQVI1S19SRkdBSU5fQUNUSVZFOworCQl9CisKKwkJLyogQmFuayA2Lzcgc2V0dXAgKi8KKworCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGVlLT5lZV94cGRbZWVfbW9kZV0sCisJCQkJCQlBUjVLX1JGX1hQRF9TRUwsIDEpOworCisJCWlmIChhaC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiA8IEFSNUtfU1JFVl9SQURfNTExMkEpIHsKKwkJCS8qIFJldi4gMSBzdXBwb3J0cyBvbmx5IG9uZSB4cGQgKi8KKwkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywKKwkJCQkJCWVlLT5lZV94X2dhaW5bZWVfbW9kZV0sCisJCQkJCQlBUjVLX1JGX1hQRF9HQUlOLCAxKTsKKworCQl9IGVsc2UgeworCQkJLyogVE9ETzogU2V0IGhpZ2ggYW5kIGxvdyBnYWluIGJpdHMgKi8KKwkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywKKwkJCQkJCWVlLT5lZV94X2dhaW5bZWVfbW9kZV0sCisJCQkJCQlBUjVLX1JGX1BEX0dBSU5fTE8sIDEpOworCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLAorCQkJCQkJZWUtPmVlX3hfZ2FpbltlZV9tb2RlXSwKKwkJCQkJCUFSNUtfUkZfUERfR0FJTl9ISSwgMSk7CisKKwkJCS8qIExvd2VyIHN5bnRoIHZvbHRhZ2Ugb24gUmV2IDIgKi8KKwkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgMiwKKwkJCQkJQVI1S19SRl9ISUdIX1ZDX0NQLCAxKTsKKworCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCAyLAorCQkJCQlBUjVLX1JGX01JRF9WQ19DUCwgMSk7CisKKwkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgMiwKKwkJCQkJQVI1S19SRl9MT1dfVkNfQ1AsIDEpOworCisJCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIDIsCisJCQkJCUFSNUtfUkZfUFVTSF9VUCwgMSk7CisKKwkJCS8qIERlY3JlYXNlIHBvd2VyIGNvbnN1bXB0aW9uIG9uIDUyMTMrIEJhc2VCYW5kICovCisJCQlpZiAoYWgtPmFoX3BoeV9yZXZpc2lvbiA+PSBBUjVLX1NSRVZfUEhZXzUyMTJBKSB7CisJCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCAxLAorCQkJCQkJQVI1S19SRl9QQUQyR05ELCAxKTsKKworCQkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgMSwKKwkJCQkJCUFSNUtfUkZfWEIyX0xWTCwgMSk7CisKKwkJCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIDEsCisJCQkJCQlBUjVLX1JGX1hCNV9MVkwsIDEpOworCisJCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCAxLAorCQkJCQkJQVI1S19SRl9QV0RfMTY3LCAxKTsKKworCQkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgMSwKKwkJCQkJCUFSNUtfUkZfUFdEXzE2NiwgMSk7CisJCQl9CisJCX0KKworCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGVlLT5lZV9pX2dhaW5bZWVfbW9kZV0sCisJCQkJCQlBUjVLX1JGX0dBSU5fSSwgMSk7CisKKwkJLyogVE9ETzogSGFsZi9xdWFydGVyIGNoYW5uZWwgc3VwcG9ydCAqLworCisJfQorCisJaWYgKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTQxMyAmJgorCWNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF8yR0haKSB7CisKKwkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCAxLCBBUjVLX1JGX0RFUkJZX0NIQU5fU0VMX01PREUsCisJCQkJCQkJCQkxKTsKKworCQkvKiBTZXQgb3B0aW11bSB2YWx1ZSBmb3IgZWFybHkgcmV2aXNpb25zIChvbiBwY2ktZSBjaGlwcykgKi8KKwkJaWYgKGFoLT5haF9tYWNfc3JldiA+PSBBUjVLX1NSRVZfQVI1NDI0ICYmCisJCWFoLT5haF9tYWNfc3JldiA8IEFSNUtfU1JFVl9BUjU0MTMpCisJCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIGF0aDVrX2h3X2JpdHN3YXAoNiwgMyksCisJCQkJCQlBUjVLX1JGX1BXRF9JQ0xPQlVGXzJHLCAxKTsKKworCX0KKworCS8qIFdyaXRlIFJGIGJhbmtzIG9uIGh3ICovCisJZm9yIChpID0gMDsgaSA8IGFoLT5haF9yZl9iYW5rc19zaXplOyBpKyspIHsKKwkJQVI1S19SRUdfV0FJVChpKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCByZmJbaV0sIGluaV9yZmJbaV0ucmZiX2N0cmxfcmVnaXN0ZXIpOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgUEhZL1JGIGNoYW5uZWwgZnVuY3Rpb25zCitcKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDaGVjayBpZiBhIGNoYW5uZWwgaXMgc3VwcG9ydGVkCisgKi8KK2ludCBhdGg1a19jaGFubmVsX29rKHN0cnVjdCBhdGg1a19odyAqYWgsIHUxNiBmcmVxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJLyogQ2hlY2sgaWYgdGhlIGNoYW5uZWwgaXMgaW4gb3VyIHN1cHBvcnRlZCByYW5nZSAqLworCWlmIChmbGFncyAmIENIQU5ORUxfMkdIWikgeworCQlpZiAoKGZyZXEgPj0gYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfMmdoel9taW4pICYmCisJCSAgICAoZnJlcSA8PSBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9yYW5nZS5yYW5nZV8yZ2h6X21heCkpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGZsYWdzICYgQ0hBTk5FTF81R0haKQorCQlpZiAoKGZyZXEgPj0gYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfNWdoel9taW4pICYmCisJCSAgICAoZnJlcSA8PSBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9yYW5nZS5yYW5nZV81Z2h6X21heCkpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29udmVydGlvbiBuZWVkZWQgZm9yIFJGNTExMAorICovCitzdGF0aWMgdTMyIGF0aDVrX2h3X3JmNTExMF9jaGFuMmF0aGNoYW4oc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJdTMyIGF0aGNoYW47CisKKwkvKgorCSAqIENvbnZlcnQgSUVFRSBjaGFubmVsL01IeiB0byBhbiBpbnRlcm5hbCBjaGFubmVsIHZhbHVlIHVzZWQKKwkgKiBieSB0aGUgQVI1MjEwIGNoaXBzZXQuIFRoaXMgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIHdpdGgKKwkgKiBuZXdlciBjaGlwc2V0cyBsaWtlIHRoZSBBUjUyMTJBIHdobyBoYXZlIGEgY29tcGxldGVseQorCSAqIGRpZmZlcmVudCBSRi9QSFkgcGFydC4KKwkgKi8KKwlhdGhjaGFuID0gKGF0aDVrX2h3X2JpdHN3YXAoKGF0aDVrX2ZyZXFfdG9fY2hhbm5lbChjaGFubmVsLT5jZW50ZXJfZnJlcSkKKwkJCQkgICAgIC0gMjQpIC8gMiwgNSkgPDwgMSkKKwkJfCAoMSA8PCA2KSB8IDB4MTsKKwlyZXR1cm4gYXRoY2hhbjsKK30KKworLyoKKyAqIFNldCBjaGFubmVsIG9uIFJGNTExMAorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMF9jaGFubmVsKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCXN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVsKQoreworCXUzMiBkYXRhOworCisJLyoKKwkgKiBTZXQgdGhlIGNoYW5uZWwgYW5kIHdhaXQKKwkgKi8KKwlkYXRhID0gYXRoNWtfaHdfcmY1MTEwX2NoYW4yYXRoY2hhbihjaGFubmVsKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfUkZfQlVGRkVSKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIDAsIEFSNUtfUkZfQlVGRkVSX0NPTlRST0xfMCk7CisJbWRlbGF5KDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb252ZXJ0aW9uIG5lZWRlZCBmb3IgNTExMQorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMV9jaGFuMmF0aGNoYW4odW5zaWduZWQgaW50IGllZWUsCisJCXN0cnVjdCBhdGg1a19hdGhjaGFuXzJnaHogKmF0aGNoYW4pCit7CisJaW50IGNoYW5uZWw7CisKKwkvKiBDYXN0IHRoaXMgdmFsdWUgdG8gY2F0Y2ggbmVnYXRpdmUgY2hhbm5lbCBudW1iZXJzICg+PSAtMTkpICovCisJY2hhbm5lbCA9IChpbnQpaWVlZTsKKworCS8qCisJICogTWFwIDJHSHogSUVFRSBjaGFubmVsIHRvIDVHSHogQXRoZXJvcyBjaGFubmVsCisJICovCisJaWYgKGNoYW5uZWwgPD0gMTMpIHsKKwkJYXRoY2hhbi0+YTJfYXRoY2hhbiA9IDExNSArIGNoYW5uZWw7CisJCWF0aGNoYW4tPmEyX2ZsYWdzID0gMHg0NjsKKwl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMTQpIHsKKwkJYXRoY2hhbi0+YTJfYXRoY2hhbiA9IDEyNDsKKwkJYXRoY2hhbi0+YTJfZmxhZ3MgPSAweDQ0OworCX0gZWxzZSBpZiAoY2hhbm5lbCA+PSAxNSAmJiBjaGFubmVsIDw9IDI2KSB7CisJCWF0aGNoYW4tPmEyX2F0aGNoYW4gPSAoKGNoYW5uZWwgLSAxNCkgKiA0KSArIDEzMjsKKwkJYXRoY2hhbi0+YTJfZmxhZ3MgPSAweDQ2OworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IGNoYW5uZWwgb24gNTExMQorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMV9jaGFubmVsKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCXN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGg1a19hdGhjaGFuXzJnaHogYXRoNWtfY2hhbm5lbF8yZ2h6OworCXVuc2lnbmVkIGludCBhdGg1a19jaGFubmVsID0gYXRoNWtfZnJlcV90b19jaGFubmVsKGNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwl1MzIgZGF0YTAsIGRhdGExLCBjbG9jazsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBTZXQgdGhlIGNoYW5uZWwgb24gdGhlIFJGNTExMSByYWRpbworCSAqLworCWRhdGEwID0gZGF0YTEgPSAwOworCisJaWYgKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF8yR0haKSB7CisJCS8qIE1hcCAyR0h6IGNoYW5uZWwgdG8gNUdIeiBBdGhlcm9zIGNoYW5uZWwgSUQgKi8KKwkJcmV0ID0gYXRoNWtfaHdfcmY1MTExX2NoYW4yYXRoY2hhbihhdGg1a19jaGFubmVsLAorCQkJCQkJICAgJmF0aDVrX2NoYW5uZWxfMmdoeik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWF0aDVrX2NoYW5uZWwgPSBhdGg1a19jaGFubmVsXzJnaHouYTJfYXRoY2hhbjsKKwkJZGF0YTAgPSAoKGF0aDVrX2h3X2JpdHN3YXAoYXRoNWtfY2hhbm5lbF8yZ2h6LmEyX2ZsYWdzLCA4KSAmIDB4ZmYpCisJCSAgICA8PCA1KSB8ICgxIDw8IDQpOworCX0KKworCWlmIChhdGg1a19jaGFubmVsIDwgMTQ1IHx8ICEoYXRoNWtfY2hhbm5lbCAmIDEpKSB7CisJCWNsb2NrID0gMTsKKwkJZGF0YTEgPSAoKGF0aDVrX2h3X2JpdHN3YXAoYXRoNWtfY2hhbm5lbCAtIDI0LCA4KSAmIDB4ZmYpIDw8IDIpIHwKKwkJCShjbG9jayA8PCAxKSB8ICgxIDw8IDEwKSB8IDE7CisJfSBlbHNlIHsKKwkJY2xvY2sgPSAwOworCQlkYXRhMSA9ICgoYXRoNWtfaHdfYml0c3dhcCgoYXRoNWtfY2hhbm5lbCAtIDI0KSAvIDIsIDgpICYgMHhmZikKKwkJCTw8IDIpIHwgKGNsb2NrIDw8IDEpIHwgKDEgPDwgMTApIHwgMTsKKwl9CisKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIChkYXRhMSAmIDB4ZmYpIHwgKChkYXRhMCAmIDB4ZmYpIDw8IDgpLAorCQkJQVI1S19SRl9CVUZGRVIpOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKChkYXRhMSA+PiA4KSAmIDB4ZmYpIHwgKGRhdGEwICYgMHhmZjAwKSwKKwkJCUFSNUtfUkZfQlVGRkVSX0NPTlRST0xfMyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCBjaGFubmVsIG9uIDUxMTIgYW5kIG5ld2VyCisgKi8KK3N0YXRpYyBpbnQgYXRoNWtfaHdfcmY1MTEyX2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJdTMyIGRhdGEsIGRhdGEwLCBkYXRhMSwgZGF0YTI7CisJdTE2IGM7CisKKwlkYXRhID0gZGF0YTAgPSBkYXRhMSA9IGRhdGEyID0gMDsKKwljID0gY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisKKwlpZiAoYyA8IDQ4MDApIHsKKwkJaWYgKCEoKGMgLSAyMjI0KSAlIDUpKSB7CisJCQlkYXRhMCA9ICgoMiAqIChjIC0gNzA0KSkgLSAzMDQwKSAvIDEwOworCQkJZGF0YTEgPSAxOworCQl9IGVsc2UgaWYgKCEoKGMgLSAyMTkyKSAlIDUpKSB7CisJCQlkYXRhMCA9ICgoMiAqIChjIC0gNjcyKSkgLSAzMDQwKSAvIDEwOworCQkJZGF0YTEgPSAwOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRhdGEwID0gYXRoNWtfaHdfYml0c3dhcCgoZGF0YTAgPDwgMikgJiAweGZmLCA4KTsKKwl9IGVsc2UgaWYgKChjIC0gKGMgJSA1KSkgIT0gMiB8fCBjID4gNTQzNSkgeworCQlpZiAoIShjICUgMjApICYmIGMgPj0gNTEyMCkgeworCQkJZGF0YTAgPSBhdGg1a19od19iaXRzd2FwKCgoYyAtIDQ4MDApIC8gMjAgPDwgMiksIDgpOworCQkJZGF0YTIgPSBhdGg1a19od19iaXRzd2FwKDMsIDIpOworCQl9IGVsc2UgaWYgKCEoYyAlIDEwKSkgeworCQkJZGF0YTAgPSBhdGg1a19od19iaXRzd2FwKCgoYyAtIDQ4MDApIC8gMTAgPDwgMSksIDgpOworCQkJZGF0YTIgPSBhdGg1a19od19iaXRzd2FwKDIsIDIpOworCQl9IGVsc2UgaWYgKCEoYyAlIDUpKSB7CisJCQlkYXRhMCA9IGF0aDVrX2h3X2JpdHN3YXAoKGMgLSA0ODAwKSAvIDUsIDgpOworCQkJZGF0YTIgPSBhdGg1a19od19iaXRzd2FwKDEsIDIpOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWRhdGEwID0gYXRoNWtfaHdfYml0c3dhcCgoMTAgKiAoYyAtIDIpIC0gNDgwMCkgLyAyNSArIDEsIDgpOworCQlkYXRhMiA9IGF0aDVrX2h3X2JpdHN3YXAoMCwgMik7CisJfQorCisJZGF0YSA9IChkYXRhMCA8PCA0KSB8IChkYXRhMSA8PCAxKSB8IChkYXRhMiA8PCAyKSB8IDB4MTAwMTsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSAmIDB4ZmYsIEFSNUtfUkZfQlVGRkVSKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIChkYXRhID4+IDgpICYgMHg3ZiwgQVI1S19SRl9CVUZGRVJfQ09OVFJPTF81KTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSBjaGFubmVsIG9uIHRoZSBSRjI0MjUKKyAqLworc3RhdGljIGludCBhdGg1a19od19yZjI0MjVfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQlzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwl1MzIgZGF0YSwgZGF0YTAsIGRhdGEyOworCXUxNiBjOworCisJZGF0YSA9IGRhdGEwID0gZGF0YTIgPSAwOworCWMgPSBjaGFubmVsLT5jZW50ZXJfZnJlcTsKKworCWlmIChjIDwgNDgwMCkgeworCQlkYXRhMCA9IGF0aDVrX2h3X2JpdHN3YXAoKGMgLSAyMjcyKSwgOCk7CisJCWRhdGEyID0gMDsKKwkvKiA/IDVHSHogPyAqLworCX0gZWxzZSBpZiAoKGMgLSAoYyAlIDUpKSAhPSAyIHx8IGMgPiA1NDM1KSB7CisJCWlmICghKGMgJSAyMCkgJiYgYyA8IDUxMjApCisJCQlkYXRhMCA9IGF0aDVrX2h3X2JpdHN3YXAoKChjIC0gNDgwMCkgLyAyMCA8PCAyKSwgOCk7CisJCWVsc2UgaWYgKCEoYyAlIDEwKSkKKwkJCWRhdGEwID0gYXRoNWtfaHdfYml0c3dhcCgoKGMgLSA0ODAwKSAvIDEwIDw8IDEpLCA4KTsKKwkJZWxzZSBpZiAoIShjICUgNSkpCisJCQlkYXRhMCA9IGF0aDVrX2h3X2JpdHN3YXAoKGMgLSA0ODAwKSAvIDUsIDgpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZGF0YTIgPSBhdGg1a19od19iaXRzd2FwKDEsIDIpOworCX0gZWxzZSB7CisJCWRhdGEwID0gYXRoNWtfaHdfYml0c3dhcCgoMTAgKiAoYyAtIDIpIC0gNDgwMCkgLyAyNSArIDEsIDgpOworCQlkYXRhMiA9IGF0aDVrX2h3X2JpdHN3YXAoMCwgMik7CisJfQorCisJZGF0YSA9IChkYXRhMCA8PCA0KSB8IGRhdGEyIDw8IDIgfCAweDEwMDE7CisKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEgJiAweGZmLCBBUjVLX1JGX0JVRkZFUik7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAoZGF0YSA+PiA4KSAmIDB4N2YsIEFSNUtfUkZfQlVGRkVSX0NPTlRST0xfNSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCBhIGNoYW5uZWwgb24gdGhlIHJhZGlvIGNoaXAKKyAqLworaW50IGF0aDVrX2h3X2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaW50IHJldDsKKwkvKgorCSAqIENoZWNrIGJvdW5kcyBzdXBwb3J0ZWQgYnkgdGhlIFBIWSAod2UgZG9uJ3QgY2FyZSBhYm91dCByZWd1bHRvcnkKKwkgKiByZXN0cmljdGlvbnMgYXQgdGhpcyBwb2ludCkuIE5vdGU6IGh3X3ZhbHVlIGFscmVhZHkgaGFzIHRoZSBiYW5kCisJICogKENIQU5ORUxfMkdIWiwgb3IgQ0hBTk5FTF81R0haKSBzbyB3ZSBpbmZvcm0gYXRoNWtfY2hhbm5lbF9vaygpCisJICogb2YgdGhlIGJhbmQgYnkgdGhhdCAqLworCWlmICghYXRoNWtfY2hhbm5lbF9vayhhaCwgY2hhbm5lbC0+Y2VudGVyX2ZyZXEsIGNoYW5uZWwtPmh3X3ZhbHVlKSkgeworCQlEQkcoImF0aDVrOiBjaGFubmVsIGZyZXF1ZW5jeSAoJWQgTUh6KSBvdXQgb2Ygc3VwcG9ydGVkICIKKwkJICAgICJyYW5nZVxuIiwgY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFNldCB0aGUgY2hhbm5lbCBhbmQgd2FpdAorCSAqLworCXN3aXRjaCAoYWgtPmFoX3JhZGlvKSB7CisJY2FzZSBBUjVLX1JGNTExMDoKKwkJcmV0ID0gYXRoNWtfaHdfcmY1MTEwX2NoYW5uZWwoYWgsIGNoYW5uZWwpOworCQlicmVhazsKKwljYXNlIEFSNUtfUkY1MTExOgorCQlyZXQgPSBhdGg1a19od19yZjUxMTFfY2hhbm5lbChhaCwgY2hhbm5lbCk7CisJCWJyZWFrOworCWNhc2UgQVI1S19SRjI0MjU6CisJCXJldCA9IGF0aDVrX2h3X3JmMjQyNV9jaGFubmVsKGFoLCBjaGFubmVsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gYXRoNWtfaHdfcmY1MTEyX2NoYW5uZWwoYWgsIGNoYW5uZWwpOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0KSB7CisJCURCRygiYXRoNWs6IHNldHRpbmcgY2hhbm5lbCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihyZXQpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBTZXQgSkFQQU4gc2V0dGluZyBmb3IgY2hhbm5lbCAxNCAqLworCWlmIChjaGFubmVsLT5jZW50ZXJfZnJlcSA9PSAyNDg0KSB7CisJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1BIWV9DQ0tUWENUTCwKKwkJCQlBUjVLX1BIWV9DQ0tUWENUTF9KQVBBTik7CisJfSBlbHNlIHsKKwkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0NDS1RYQ1RMLAorCQkJCUFSNUtfUEhZX0NDS1RYQ1RMX1dPUkxEKTsKKwl9CisKKwlhaC0+YWhfY3VycmVudF9jaGFubmVsID0gY2hhbm5lbDsKKwlhaC0+YWhfdHVyYm8gPSAoY2hhbm5lbC0+aHdfdmFsdWUgPT0gQ0hBTk5FTF9UID8gMSA6IDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKlwKKyAgUEhZIGNhbGlicmF0aW9uCitcKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogYXRoNWtfaHdfbm9pc2VfZmxvb3JfY2FsaWJyYXRpb24gLSBwZXJmb3JtIFBIWSBub2lzZSBmbG9vciBjYWxpYnJhdGlvbgorICoKKyAqIEBhaDogc3RydWN0IGF0aDVrX2h3IHBvaW50ZXIgd2UgYXJlIG9wZXJhdGluZyBvbgorICogQGZyZXE6IHRoZSBjaGFubmVsIGZyZXF1ZW5jeSwganVzdCB1c2VkIGZvciBlcnJvciBsb2dnaW5nCisgKgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIG5vaXNlIGZsb29yIGNhbGlicmF0aW9uIG9mIHRoZSBQSFkgYW5kIHdhaXRzIGZvcgorICogaXQgdG8gY29tcGxldGUuIFRoZW4gdGhlIG5vaXNlIGZsb29yIHZhbHVlIGlzIGNvbXBhcmVkIHRvIHNvbWUgbWF4aW11bQorICogbm9pc2UgZmxvb3Igd2UgY29uc2lkZXIgdmFsaWQuCisgKgorICogTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUgbWFkd2lmaSBIQUwgZG9lczogaXQgcmVhZHMgdGhlCisgKiBub2lzZSBmbG9vciBhbmQgYWZ0ZXJ3YXJkcyBpbml0aWF0ZXMgdGhlIGNhbGlicmF0aW9uLiBTaW5jZSB0aGUgbm9pc2UgZmxvb3IKKyAqIGNhbGlicmF0aW9uIGNhbiB0YWtlIHNvbWUgdGltZSB0byBmaW5pc2gsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjaGFubmVsCisgKiB1c2UsIHRoYXQgYXZvaWRzIHRoZSBvY2Nhc2lvbmFsIHRpbWVvdXQgd2FybmluZ3Mgd2UgYXJlIHNlZWluZyBub3cuCisgKgorICogU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgYW4gQXRoZXJvcyBwYXRlbnQgb24gbm9pc2UgZmxvb3IgY2FsaWJyYXRpb246CisgKiBodHRwOi8vcGF0ZnQudXNwdG8uZ292L25ldGFjZ2kvbnBoLVBhcnNlcj9TZWN0MT1QVE8xJlNlY3QyPUhJVE9GRiZkPVBBTEwgXAorICogJnA9MSZ1PSUyRm5ldGFodG1sJTJGUFRPJTJGc3JjaG51bS5odG0mcj0xJmY9RyZsPTUwJnMxPTcyNDU4OTMuUE4uJk9TPVBOLzcKKyAqCisgKiBYWFg6IFNpbmNlIGR1cmluZyBub2lzZSBmbG9vciBjYWxpYnJhdGlvbiBhbnRlbm5hcyBhcmUgZGV0YWNoZWQgYWNjb3JkaW5nIHRvCisgKiB0aGUgcGF0ZW50LCB3ZSBzaG91bGQgc3RvcCB0eCBxdWV1ZXMgaGVyZS4KKyAqLworaW50CithdGg1a19od19ub2lzZV9mbG9vcl9jYWxpYnJhdGlvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzaG9ydCBmcmVxKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGk7CisJczMyIG5vaXNlX2Zsb29yOworCisJLyoKKwkgKiBFbmFibGUgbm9pc2UgZmxvb3IgY2FsaWJyYXRpb24KKwkgKi8KKwlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfQUdDQ1RMLAorCQkJCUFSNUtfUEhZX0FHQ0NUTF9ORik7CisKKwlyZXQgPSBhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KGFoLCBBUjVLX1BIWV9BR0NDVEwsCisJCQlBUjVLX1BIWV9BR0NDVExfTkYsIDAsIDApOworCisJaWYgKHJldCkgeworCQlEQkcoImF0aDVrOiBub2lzZSBmbG9vciBjYWxpYnJhdGlvbiB0aW1lb3V0ICglZCBNSHopXG4iLCBmcmVxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogV2FpdCB1bnRpbCB0aGUgbm9pc2UgZmxvb3IgaXMgY2FsaWJyYXRlZCBhbmQgcmVhZCB0aGUgdmFsdWUgKi8KKwlmb3IgKGkgPSAyMDsgaSA+IDA7IGktLSkgeworCQltZGVsYXkoMSk7CisJCW5vaXNlX2Zsb29yID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX05GKTsKKwkJbm9pc2VfZmxvb3IgPSBBUjVLX1BIWV9ORl9SVkFMKG5vaXNlX2Zsb29yKTsKKwkJaWYgKG5vaXNlX2Zsb29yICYgQVI1S19QSFlfTkZfQUNUSVZFKSB7CisJCQlub2lzZV9mbG9vciA9IEFSNUtfUEhZX05GX0FWQUwobm9pc2VfZmxvb3IpOworCisJCQlpZiAobm9pc2VfZmxvb3IgPD0gQVI1S19UVU5FX05PSVNFX0ZMT09SKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJREJHMigiYXRoNWs6IG5vaXNlIGZsb29yICVkXG4iLCBub2lzZV9mbG9vcik7CisKKwlpZiAobm9pc2VfZmxvb3IgPiBBUjVLX1RVTkVfTk9JU0VfRkxPT1IpIHsKKwkJREJHKCJhdGg1azogbm9pc2UgZmxvb3IgY2FsaWJyYXRpb24gZmFpbGVkICglZCBNSHopXG4iLCBmcmVxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJYWgtPmFoX25vaXNlX2Zsb29yID0gbm9pc2VfZmxvb3I7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gYSBQSFkgY2FsaWJyYXRpb24gb24gUkY1MTEwCisgKiAtRml4IEJQU0svUUFNIENvbnN0ZWxsYXRpb24gKEkvUSBjb3JyZWN0aW9uKQorICogLUNhbGN1bGF0ZSBOb2lzZSBGbG9vcgorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJdTMyIHBoeV9zaWcsIHBoeV9hZ2MsIHBoeV9zYXQsIGJlYWNvbjsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBEaXNhYmxlIGJlYWNvbnMgYW5kIFJYL1RYIHF1ZXVlcywgd2FpdAorCSAqLworCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX0RJQUdfU1dfNTIxMCwKKwkJQVI1S19ESUFHX1NXX0RJU19UWCB8IEFSNUtfRElBR19TV19ESVNfUlhfNTIxMCk7CisJYmVhY29uID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQkVBQ09OXzUyMTApOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYmVhY29uICYgfkFSNUtfQkVBQ09OX0VOQUJMRSwgQVI1S19CRUFDT05fNTIxMCk7CisKKwltZGVsYXkoMik7CisKKwkvKgorCSAqIFNldCB0aGUgY2hhbm5lbCAod2l0aCBBR0MgdHVybmVkIG9mZikKKwkgKi8KKwlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfQUdDLCBBUjVLX1BIWV9BR0NfRElTQUJMRSk7CisJdWRlbGF5KDEwKTsKKwlyZXQgPSBhdGg1a19od19jaGFubmVsKGFoLCBjaGFubmVsKTsKKworCS8qCisJICogQWN0aXZhdGUgUEhZIGFuZCB3YWl0CisJICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9BQ1RfRU5BQkxFLCBBUjVLX1BIWV9BQ1QpOworCW1kZWxheSgxKTsKKworCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19QSFlfQUdDLCBBUjVLX1BIWV9BR0NfRElTQUJMRSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBDYWxpYnJhdGUgdGhlIHJhZGlvIGNoaXAKKwkgKi8KKworCS8qIFJlbWVtYmVyIG5vcm1hbCBzdGF0ZSAqLworCXBoeV9zaWcgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfU0lHKTsKKwlwaHlfYWdjID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0FHQ0NPQVJTRSk7CisJcGh5X3NhdCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9BRENTQVQpOworCisJLyogVXBkYXRlIHJhZGlvIHJlZ2lzdGVycyAqLworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKHBoeV9zaWcgJiB+KEFSNUtfUEhZX1NJR19GSVJQV1IpKSB8CisJCUFSNUtfUkVHX1NNKC0xLCBBUjVLX1BIWV9TSUdfRklSUFdSKSwgQVI1S19QSFlfU0lHKTsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKHBoeV9hZ2MgJiB+KEFSNUtfUEhZX0FHQ0NPQVJTRV9ISSB8CisJCQlBUjVLX1BIWV9BR0NDT0FSU0VfTE8pKSB8CisJCUFSNUtfUkVHX1NNKC0xLCBBUjVLX1BIWV9BR0NDT0FSU0VfSEkpIHwKKwkJQVI1S19SRUdfU00oLTEyNywgQVI1S19QSFlfQUdDQ09BUlNFX0xPKSwgQVI1S19QSFlfQUdDQ09BUlNFKTsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKHBoeV9zYXQgJiB+KEFSNUtfUEhZX0FEQ1NBVF9JQ05UIHwKKwkJCUFSNUtfUEhZX0FEQ1NBVF9USFIpKSB8CisJCUFSNUtfUkVHX1NNKDIsIEFSNUtfUEhZX0FEQ1NBVF9JQ05UKSB8CisJCUFSNUtfUkVHX1NNKDEyLCBBUjVLX1BIWV9BRENTQVRfVEhSKSwgQVI1S19QSFlfQURDU0FUKTsKKworCXVkZWxheSgyMCk7CisKKwlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfQUdDLCBBUjVLX1BIWV9BR0NfRElTQUJMRSk7CisJdWRlbGF5KDEwKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX1JGU1RHX0RJU0FCTEUsIEFSNUtfUEhZX1JGU1RHKTsKKwlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0FHQywgQVI1S19QSFlfQUdDX0RJU0FCTEUpOworCisJbWRlbGF5KDEpOworCisJLyoKKwkgKiBFbmFibGUgY2FsaWJyYXRpb24gYW5kIHdhaXQgdW50aWwgY29tcGxldGlvbgorCSAqLworCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1BIWV9BR0NDVEwsIEFSNUtfUEhZX0FHQ0NUTF9DQUwpOworCisJcmV0ID0gYXRoNWtfaHdfcmVnaXN0ZXJfdGltZW91dChhaCwgQVI1S19QSFlfQUdDQ1RMLAorCQkJQVI1S19QSFlfQUdDQ1RMX0NBTCwgMCwgMCk7CisKKwkvKiBSZXNldCB0byBub3JtYWwgc3RhdGUgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHBoeV9zaWcsIEFSNUtfUEhZX1NJRyk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBwaHlfYWdjLCBBUjVLX1BIWV9BR0NDT0FSU0UpOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgcGh5X3NhdCwgQVI1S19QSFlfQURDU0FUKTsKKworCWlmIChyZXQpIHsKKwkJREJHKCJhdGg1azogY2FsaWJyYXRpb24gdGltZW91dCAoJWQgTUh6KVxuIiwKKwkJICAgIGNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhdGg1a19od19ub2lzZV9mbG9vcl9jYWxpYnJhdGlvbihhaCwgY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCisJLyoKKwkgKiBSZS1lbmFibGUgUlgvVFggYW5kIGJlYWNvbnMKKwkgKi8KKwlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfRElBR19TV181MjEwLAorCQlBUjVLX0RJQUdfU1dfRElTX1RYIHwgQVI1S19ESUFHX1NXX0RJU19SWF81MjEwKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGJlYWNvbiwgQVI1S19CRUFDT05fNTIxMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gYSBQSFkgY2FsaWJyYXRpb24gb24gUkY1MTExLzUxMTIgYW5kIG5ld2VyIGNoaXBzCisgKi8KK3N0YXRpYyBpbnQgYXRoNWtfaHdfcmY1MTF4X2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQlzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwl1MzIgaV9wd3IsIHFfcHdyOworCXMzMiBpcV9jb3JyLCBpX2NvZmYsIGlfY29mZmQsIHFfY29mZiwgcV9jb2ZmZDsKKwlpbnQgaTsKKworCWlmICghYWgtPmFoX2NhbGlicmF0aW9uIHx8CisJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9JUSkgJiBBUjVLX1BIWV9JUV9SVU4pCisJCWdvdG8gZG9uZTsKKworCS8qIENhbGlicmF0aW9uIGhhcyBmaW5pc2hlZCwgZ2V0IHRoZSByZXN1bHRzIGFuZCByZS1ydW4gKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDEwOyBpKyspIHsKKwkJaXFfY29yciA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9JUVJFU19DQUxfQ09SUik7CisJCWlfcHdyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0lRUkVTX0NBTF9QV1JfSSk7CisJCXFfcHdyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0lRUkVTX0NBTF9QV1JfUSk7CisJfQorCisJaV9jb2ZmZCA9ICgoaV9wd3IgPj4gMSkgKyAocV9wd3IgPj4gMSkpID4+IDc7CisJcV9jb2ZmZCA9IHFfcHdyID4+IDc7CisKKwkvKiBObyBjb3JyZWN0aW9uICovCisJaWYgKGlfY29mZmQgPT0gMCB8fCBxX2NvZmZkID09IDApCisJCWdvdG8gZG9uZTsKKworCWlfY29mZiA9ICgoLWlxX2NvcnIpIC8gaV9jb2ZmZCkgJiAweDNmOworCisJLyogQm91bmRhcnkgY2hlY2sgKi8KKwlpZiAoaV9jb2ZmID4gMzEpCisJCWlfY29mZiA9IDMxOworCWlmIChpX2NvZmYgPCAtMzIpCisJCWlfY29mZiA9IC0zMjsKKworCXFfY29mZiA9ICgoKHMzMilpX3B3ciAvIHFfY29mZmQpIC0gMTI4KSAmIDB4MWY7CisKKwkvKiBCb3VuZGFyeSBjaGVjayAqLworCWlmIChxX2NvZmYgPiAxNSkKKwkJcV9jb2ZmID0gMTU7CisJaWYgKHFfY29mZiA8IC0xNikKKwkJcV9jb2ZmID0gLTE2OworCisJLyogQ29tbWl0IG5ldyBJL1EgdmFsdWUgKi8KKwlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfSVEsIEFSNUtfUEhZX0lRX0NPUlJfRU5BQkxFIHwKKwkJKCh1MzIpcV9jb2ZmKSB8ICgodTMyKWlfY29mZiA8PCBBUjVLX1BIWV9JUV9DT1JSX1FfSV9DT0ZGX1MpKTsKKworCS8qIFJlLWVuYWJsZSBjYWxpYnJhdGlvbiAtaWYgd2UgZG9uJ3Qgd2UnbGwgY29tbWl0CisJICogdGhlIHNhbWUgdmFsdWVzIGFnYWluIGFuZCBhZ2FpbiAqLworCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX0lRLAorCQkJQVI1S19QSFlfSVFfQ0FMX05VTV9MT0dfTUFYLCAxNSk7CisJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0lRLCBBUjVLX1BIWV9JUV9SVU4pOworCitkb25lOgorCisJLyogVE9ETzogU2VwYXJhdGUgbm9pc2UgZmxvb3IgY2FsaWJyYXRpb24gZnJvbSBJL1EgY2FsaWJyYXRpb24KKwkgKiBzaW5jZSBub2lzZSBmbG9vciBjYWxpYnJhdGlvbiBpbnRlcnJ1cHRzIHJ4IHBhdGggd2hpbGUgSS9RCisJICogY2FsaWJyYXRpb24gZG9lc24ndC4gV2UgZG9uJ3QgbmVlZCB0byBydW4gbm9pc2UgZmxvb3IgY2FsaWJyYXRpb24KKwkgKiBhcyBvZnRlbiBhcyBJL1EgY2FsaWJyYXRpb24uKi8KKwlhdGg1a19od19ub2lzZV9mbG9vcl9jYWxpYnJhdGlvbihhaCwgY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCisJLyogSW5pdGlhdGUgYSBnYWluX0YgY2FsaWJyYXRpb24gKi8KKwlhdGg1a19od19yZXF1ZXN0X3JmZ2Fpbl9wcm9iZShhaCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gYSBQSFkgY2FsaWJyYXRpb24KKyAqLworaW50IGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaW50IHJldDsKKworCWlmIChhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTApCisJCXJldCA9IGF0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoYWgsIGNoYW5uZWwpOworCWVsc2UKKwkJcmV0ID0gYXRoNWtfaHdfcmY1MTF4X2NhbGlicmF0ZShhaCwgY2hhbm5lbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYXRoNWtfaHdfcGh5X2Rpc2FibGUoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX0FDVF9ESVNBQkxFLCBBUjVLX1BIWV9BQ1QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKlwKKyAgTWlzYyBQSFkgZnVuY3Rpb25zCitcKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBHZXQgdGhlIFBIWSBDaGlwIHJldmlzaW9uCisgKi8KK3UxNiBhdGg1a19od19yYWRpb19yZXZpc2lvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgc3JldjsKKwl1MTYgcmV0OworCisJLyoKKwkgKiBTZXQgdGhlIHJhZGlvIGNoaXAgYWNjZXNzIHJlZ2lzdGVyCisJICovCisJc3dpdGNoIChjaGFuKSB7CisJY2FzZSBDSEFOTkVMXzJHSFo6CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfU0hJRlRfMkdIWiwgQVI1S19QSFkoMCkpOworCQlicmVhazsKKwljYXNlIENIQU5ORUxfNUdIWjoKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9TSElGVF81R0haLCBBUjVLX1BIWSgwKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCW1kZWxheSgyKTsKKworCS8qIC4uLndhaXQgdW50aWwgUEhZIGlzIHJlYWR5IGFuZCByZWFkIHRoZSBzZWxlY3RlZCByYWRpbyByZXZpc2lvbiAqLworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMWMxNiwgQVI1S19QSFkoMHgzNCkpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMDEwMDAwLCBBUjVLX1BIWSgweDIwKSk7CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJc3JldiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWSgyNTYpID4+IDI4KSAmIDB4ZjsKKwkJcmV0ID0gKHUxNilhdGg1a19od19iaXRzd2FwKHNyZXYsIDQpICsgMTsKKwl9IGVsc2UgeworCQlzcmV2ID0gKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWSgweDEwMCkpID4+IDI0KSAmIDB4ZmY7CisJCXJldCA9ICh1MTYpYXRoNWtfaHdfYml0c3dhcCgoKHNyZXYgJiAweGYwKSA+PiA0KSB8CisJCQkJKChzcmV2ICYgMHgwZikgPDwgNCksIDgpOworCX0KKworCS8qIFJlc2V0IHRvIHRoZSA1R0h6IG1vZGUgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX1NISUZUXzVHSFosIEFSNUtfUEhZKDApKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgLypUT0RPOkJvdW5kYXJ5IGNoZWNrKi8KK2F0aDVrX2h3X3NldF9kZWZfYW50ZW5uYShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgYW50KQoreworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhbnQsIEFSNUtfREVGQVVMVF9BTlRFTk5BKTsKK30KKwordW5zaWduZWQgaW50IGF0aDVrX2h3X2dldF9kZWZfYW50ZW5uYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkKKwkJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0RFRkFVTFRfQU5URU5OQSk7CisKKwlyZXR1cm4gMDsgLypYWFg6IFdoYXQgZG8gd2UgcmV0dXJuIGZvciA1MjEwID8qLworfQorCisKKy8qKioqKioqKioqKioqKioqXAorKiBUWCBwb3dlciBzZXR1cCAqCitcKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbnMKKyAqLworCisvKgorICogRG8gbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gZ2l2ZW4gKHgsIHkpIHBvaW50cworICovCitzdGF0aWMgczE2CithdGg1a19nZXRfaW50ZXJwb2xhdGVkX3ZhbHVlKHMxNiB0YXJnZXQsIHMxNiB4X2xlZnQsIHMxNiB4X3JpZ2h0LAorCQkJCQlzMTYgeV9sZWZ0LCBzMTYgeV9yaWdodCkKK3sKKwlzMTYgcmF0aW8sIHJlc3VsdDsKKworCS8qIEF2b2lkIGRpdmlkZSBieSB6ZXJvIGFuZCBza2lwIGludGVycG9sYXRpb24KKwkgKiBpZiB3ZSBoYXZlIHRoZSBzYW1lIHBvaW50ICovCisJaWYgKCh4X2xlZnQgPT0geF9yaWdodCkgfHwgKHlfbGVmdCA9PSB5X3JpZ2h0KSkKKwkJcmV0dXJuIHlfbGVmdDsKKworCS8qCisJICogU2luY2Ugd2UgdXNlIGludHMgYW5kIG5vdCBmcHMsIHdlIG5lZWQgdG8gc2NhbGUgdXAgaW4KKwkgKiBvcmRlciB0byBnZXQgYSBzYW5lIHJhdGlvIHZhbHVlIChvciBlbHNlIHdlICdsbCBlZy4gZ2V0CisJICogYWx3YXlzIDEgaW5zdGVhZCBvZiAxLjI1LCAxLjc1IGV0YykuIFdlIHNjYWxlIHVwIGJ5IDEwMAorCSAqIHRvIGhhdmUgc29tZSBhY2N1cmFjeSBib3RoIGZvciAwLjUgYW5kIDAuMjUgc3RlcHMuCisJICovCisJcmF0aW8gPSAoKDEwMCAqIHlfcmlnaHQgLSAxMDAgKiB5X2xlZnQpLyh4X3JpZ2h0IC0geF9sZWZ0KSk7CisKKwkvKiBOb3cgc2NhbGUgZG93biB0byBiZSBpbiByYW5nZSAqLworCXJlc3VsdCA9IHlfbGVmdCArIChyYXRpbyAqICh0YXJnZXQgLSB4X2xlZnQpIC8gMTAwKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBGaW5kIHZlcnRpY2FsIGJvdW5kYXJ5IChtaW4gcHdyKSBmb3IgdGhlIGxpbmVhciBQQ0RBQyBjdXJ2ZS4KKyAqCisgKiBTaW5jZSB3ZSBoYXZlIHRoZSB0b3Agb2YgdGhlIGN1cnZlIGFuZCB3ZSBkcmF3IHRoZSBsaW5lIGJlbG93CisgKiB1bnRpbCB3ZSByZWFjaCAxICgxIHBjZGFjIHN0ZXApIHdlIG5lZWQgdG8ga25vdyB3aGljaCBwb2ludAorICogKHggdmFsdWUpIHRoYXQgaXMgc28gdGhhdCB3ZSBkb24ndCBnbyBiZWxvdyB5IGF4aXMgYW5kIGhhdmUgbmVnYXRpdmUKKyAqIHBjZGFjIHZhbHVlcyB3aGVuIGNyZWF0aW5nIHRoZSBjdXJ2ZSwgb3IgZmlsbCB0aGUgdGFibGUgd2l0aCB6ZXJvZXMuCisgKi8KK3N0YXRpYyBzMTYKK2F0aDVrX2dldF9saW5lYXJfcGNkYWNfbWluKGNvbnN0IHU4ICpzdGVwTCwgY29uc3QgdTggKnN0ZXBSLAorCQkJCWNvbnN0IHMxNiAqcHdyTCwgY29uc3QgczE2ICpwd3JSKQoreworCXM4IHRtcDsKKwlzMTYgbWluX3B3ckwsIG1pbl9wd3JSOworCXMxNiBwd3JfaTsKKworCWlmIChwd3JMWzBdID09IHB3ckxbMV0pCisJCW1pbl9wd3JMID0gcHdyTFswXTsKKwllbHNlIHsKKwkJcHdyX2kgPSBwd3JMWzBdOworCQlkbyB7CisJCQlwd3JfaS0tOworCQkJdG1wID0gKHM4KSBhdGg1a19nZXRfaW50ZXJwb2xhdGVkX3ZhbHVlKHB3cl9pLAorCQkJCQkJCXB3ckxbMF0sIHB3ckxbMV0sCisJCQkJCQkJc3RlcExbMF0sIHN0ZXBMWzFdKTsKKwkJfSB3aGlsZSAodG1wID4gMSk7CisKKwkJbWluX3B3ckwgPSBwd3JfaTsKKwl9CisKKwlpZiAocHdyUlswXSA9PSBwd3JSWzFdKQorCQltaW5fcHdyUiA9IHB3clJbMF07CisJZWxzZSB7CisJCXB3cl9pID0gcHdyUlswXTsKKwkJZG8geworCQkJcHdyX2ktLTsKKwkJCXRtcCA9IChzOCkgYXRoNWtfZ2V0X2ludGVycG9sYXRlZF92YWx1ZShwd3JfaSwKKwkJCQkJCQlwd3JSWzBdLCBwd3JSWzFdLAorCQkJCQkJCXN0ZXBSWzBdLCBzdGVwUlsxXSk7CisJCX0gd2hpbGUgKHRtcCA+IDEpOworCisJCW1pbl9wd3JSID0gcHdyX2k7CisJfQorCisJLyogS2VlcCB0aGUgcmlnaHQgYm91bmRhcnkgc28gdGhhdCBpdCB3b3JrcyBmb3IgYm90aCBjdXJ2ZXMgKi8KKwlyZXR1cm4gbWF4KG1pbl9wd3JMLCBtaW5fcHdyUik7Cit9CisKKy8qCisgKiBJbnRlcnBvbGF0ZSAocHdyLHZwZCkgcG9pbnRzIHRvIGNyZWF0ZSBhIFBvd2VyIHRvIFBEQURDIG9yIGEKKyAqIFBvd2VyIHRvIFBDREFDIGN1cnZlLgorICoKKyAqIEVhY2ggY3VydmUgaGFzIHBvd2VyIG9uIHggYXhpcyAoaW4gMC41ZEIgdW5pdHMpIGFuZCBQQ0RBQy9QREFEQworICogc3RlcHMgKG9mZnNldHMpIG9uIHkgYXhpcy4gUG93ZXIgY2FuIGdvIHVwIHRvIDMxLjVkQiBhbmQgbWF4CisgKiBQQ0RBQy9QREFEQyBzdGVwIGZvciBlYWNoIGN1cnZlIGlzIDY0IGJ1dCB3ZSBjYW4gd3JpdGUgbW9yZSB0aGFuCisgKiBvbmUgY3VydmVzIG9uIGh3IHNvIHdlIGNhbiBnbyB1cCB0byAxMjggKHdoaWNoIGlzIHRoZSBtYXggc3RlcCB3ZQorICogY2FuIHdyaXRlIG9uIHRoZSBmaW5hbCB0YWJsZSkuCisgKgorICogV2Ugd3JpdGUgeSB2YWx1ZXMgKFBDREFDL1BEQURDIHN0ZXBzKSBvbiBody4KKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX2NyZWF0ZV9wb3dlcl9jdXJ2ZShzMTYgcG1pbiwgczE2IHBtYXgsCisJCQljb25zdCBzMTYgKnB3ciwgY29uc3QgdTggKnZwZCwKKwkJCXU4IG51bV9wb2ludHMsCisJCQl1OCAqdnBkX3RhYmxlLCB1OCB0eXBlKQoreworCXU4IGlkeFsyXSA9IHsgMCwgMSB9OworCXMxNiBwd3JfaSA9IDIqcG1pbjsKKwlpbnQgaTsKKworCWlmIChudW1fcG9pbnRzIDwgMikKKwkJcmV0dXJuOworCisJLyogV2Ugd2FudCB0aGUgd2hvbGUgbGluZSwgc28gYWRqdXN0IGJvdW5kYXJpZXMKKwkgKiB0byBjb3ZlciB0aGUgZW50aXJlIHBvd2VyIHJhbmdlLiBOb3RlIHRoYXQKKwkgKiBwb3dlciB2YWx1ZXMgYXJlIGFscmVhZHkgMC4yNWRCIHNvIG5vIG5lZWQKKwkgKiB0byBtdWx0aXBseSBwd3JfaSBieSAyICovCisJaWYgKHR5cGUgPT0gQVI1S19QV1JUQUJMRV9MSU5FQVJfUENEQUMpIHsKKwkJcHdyX2kgPSBwbWluOworCQlwbWluID0gMDsKKwkJcG1heCA9IDYzOworCX0KKworCS8qIEZpbmQgc3Vycm91bmRpbmcgdHVybmluZyBwb2ludHMgKFRQcykKKwkgKiBhbmQgaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGVtICovCisJZm9yIChpID0gMDsgKGkgPD0gKHUxNikgKHBtYXggLSBwbWluKSkgJiYKKwkoaSA8IEFSNUtfRUVQUk9NX1BPV0VSX1RBQkxFX1NJWkUpOyBpKyspIHsKKworCQkvKiBXZSBwYXNzZWQgdGhlIHJpZ2h0IFRQLCBtb3ZlIHRvIHRoZSBuZXh0IHNldCBvZiBUUHMKKwkJICogaWYgd2UgcGFzcyB0aGUgbGFzdCBUUCwgZXh0cmFwb2xhdGUgYWJvdmUgdXNpbmcgdGhlIGxhc3QKKwkJICogdHdvIFRQcyBmb3IgcmF0aW8gKi8KKwkJaWYgKChwd3JfaSA+IHB3cltpZHhbMV1dKSAmJiAoaWR4WzFdIDwgbnVtX3BvaW50cyAtIDEpKSB7CisJCQlpZHhbMF0rKzsKKwkJCWlkeFsxXSsrOworCQl9CisKKwkJdnBkX3RhYmxlW2ldID0gKHU4KSBhdGg1a19nZXRfaW50ZXJwb2xhdGVkX3ZhbHVlKHB3cl9pLAorCQkJCQkJcHdyW2lkeFswXV0sIHB3cltpZHhbMV1dLAorCQkJCQkJdnBkW2lkeFswXV0sIHZwZFtpZHhbMV1dKTsKKworCQkvKiBJbmNyZWFzZSBieSAwLjVkQgorCQkgKiAoMC4yNSBkQiB1bml0cykgKi8KKwkJcHdyX2kgKz0gMjsKKwl9Cit9CisKKy8qCisgKiBHZXQgdGhlIHN1cnJvdW5kaW5nIHBlci1jaGFubmVsIHBvd2VyIGNhbGlicmF0aW9uIHBpZXJzCisgKiBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgc28gdGhhdCB3ZSBjYW4gaW50ZXJwb2xhdGUgYmV0d2VlbgorICogdGhlbSBhbmQgY29tZSB1cCB3aXRoIGFuIGFwcm9wcmlhdGUgZGF0YXNldCBmb3Igb3VyIGN1cnJlbnQKKyAqIGNoYW5uZWwuCisgKi8KK3N0YXRpYyB2b2lkCithdGg1a19nZXRfY2hhbl9wY2FsX3N1cnJvdW5kaW5nX3BpZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQlzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mbyAqKnBjaW5mb19sLAorCQkJc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvICoqcGNpbmZvX3IpCit7CisJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CisJc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvICpwY2luZm87CisJdTggaWR4X2wsIGlkeF9yOworCXU4IG1vZGUsIG1heCwgaTsKKwl1MzIgdGFyZ2V0ID0gY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisKKwlpZHhfbCA9IDA7CisJaWR4X3IgPSAwOworCisJaWYgKCEoY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMX09GRE0pKSB7CisJCXBjaW5mbyA9IGVlLT5lZV9wd3JfY2FsX2I7CisJCW1vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQjsKKwl9IGVsc2UgaWYgKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF8yR0haKSB7CisJCXBjaW5mbyA9IGVlLT5lZV9wd3JfY2FsX2c7CisJCW1vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExRzsKKwl9IGVsc2UgeworCQlwY2luZm8gPSBlZS0+ZWVfcHdyX2NhbF9hOworCQltb2RlID0gQVI1S19FRVBST01fTU9ERV8xMUE7CisJfQorCW1heCA9IGVlLT5lZV9uX3BpZXJzW21vZGVdIC0gMTsKKworCS8qIEZyZXF1ZW5jeSBpcyBiZWxvdyBvdXIgY2FsaWJyYXRlZAorCSAqIHJhbmdlLiBVc2UgdGhlIGxvd2VzdCBwb3dlciBjdXJ2ZQorCSAqIHdlIGhhdmUgKi8KKwlpZiAodGFyZ2V0IDwgcGNpbmZvWzBdLmZyZXEpIHsKKwkJaWR4X2wgPSBpZHhfciA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBGcmVxdWVuY3kgaXMgYWJvdmUgb3VyIGNhbGlicmF0ZWQKKwkgKiByYW5nZS4gVXNlIHRoZSBoaWdoZXN0IHBvd2VyIGN1cnZlCisJICogd2UgaGF2ZSAqLworCWlmICh0YXJnZXQgPiBwY2luZm9bbWF4XS5mcmVxKSB7CisJCWlkeF9sID0gaWR4X3IgPSBtYXg7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBGcmVxdWVuY3kgaXMgaW5zaWRlIG91ciBjYWxpYnJhdGVkCisJICogY2hhbm5lbCByYW5nZS4gUGljayB0aGUgc3Vycm91bmRpbmcKKwkgKiBjYWxpYnJhdGlvbiBwaWVycyBzbyB0aGF0IHdlIGNhbgorCSAqIGludGVycG9sYXRlICovCisJZm9yIChpID0gMDsgaSA8PSBtYXg7IGkrKykgeworCisJCS8qIEZyZXF1ZW5jeSBtYXRjaGVzIG9uZSBvZiBvdXIgY2FsaWJyYXRpb24KKwkJICogcGllcnMsIG5vIG5lZWQgdG8gaW50ZXJwb2xhdGUsIGp1c3QgdXNlCisJCSAqIHRoYXQgY2FsaWJyYXRpb24gcGllciAqLworCQlpZiAocGNpbmZvW2ldLmZyZXEgPT0gdGFyZ2V0KSB7CisJCQlpZHhfbCA9IGlkeF9yID0gaTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8qIFdlIGZvdW5kIGEgY2FsaWJyYXRpb24gcGllciB0aGF0J3MgYWJvdmUKKwkJICogZnJlcXVlbmN5LCB1c2UgdGhpcyBwaWVyIGFuZCB0aGUgcHJldmlvdXMKKwkJICogb25lIHRvIGludGVycG9sYXRlICovCisJCWlmICh0YXJnZXQgPCBwY2luZm9baV0uZnJlcSkgeworCQkJaWR4X3IgPSBpOworCQkJaWR4X2wgPSBpZHhfciAtIDE7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKK2RvbmU6CisJKnBjaW5mb19sID0gJnBjaW5mb1tpZHhfbF07CisJKnBjaW5mb19yID0gJnBjaW5mb1tpZHhfcl07CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBHZXQgdGhlIHN1cnJvdW5kaW5nIHBlci1yYXRlIHBvd2VyIGNhbGlicmF0aW9uIGRhdGEKKyAqIGZvciBhIGdpdmVuIGZyZXF1ZW5jeSBhbmQgaW50ZXJwb2xhdGUgYmV0d2VlbiBwb3dlcgorICogdmFsdWVzIHRvIHNldCBtYXggdGFyZ2V0IHBvd2VyIHN1cHBvcnRlZCBieSBodyBmb3IKKyAqIGVhY2ggcmF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX2dldF9yYXRlX3BjYWxfZGF0YShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCisJCQlzdHJ1Y3QgYXRoNWtfcmF0ZV9wY2FsX2luZm8gKnJhdGVzKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXN0cnVjdCBhdGg1a19yYXRlX3BjYWxfaW5mbyAqcnBpbmZvOworCXU4IGlkeF9sLCBpZHhfcjsKKwl1OCBtb2RlLCBtYXgsIGk7CisJdTMyIHRhcmdldCA9IGNoYW5uZWwtPmNlbnRlcl9mcmVxOworCisJaWR4X2wgPSAwOworCWlkeF9yID0gMDsKKworCWlmICghKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9PRkRNKSkgeworCQlycGluZm8gPSBlZS0+ZWVfcmF0ZV90cHdyX2I7CisJCW1vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQjsKKwl9IGVsc2UgaWYgKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF8yR0haKSB7CisJCXJwaW5mbyA9IGVlLT5lZV9yYXRlX3Rwd3JfZzsKKwkJbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFHOworCX0gZWxzZSB7CisJCXJwaW5mbyA9IGVlLT5lZV9yYXRlX3Rwd3JfYTsKKwkJbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFBOworCX0KKwltYXggPSBlZS0+ZWVfcmF0ZV90YXJnZXRfcHdyX251bVttb2RlXSAtIDE7CisKKwkvKiBHZXQgdGhlIHN1cnJvdW5kaW5nIGNhbGlicmF0aW9uCisJICogcGllcnMgLSBzYW1lIGFzIGFib3ZlICovCisJaWYgKHRhcmdldCA8IHJwaW5mb1swXS5mcmVxKSB7CisJCWlkeF9sID0gaWR4X3IgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHRhcmdldCA+IHJwaW5mb1ttYXhdLmZyZXEpIHsKKwkJaWR4X2wgPSBpZHhfciA9IG1heDsKKwkJZ290byBkb25lOworCX0KKworCWZvciAoaSA9IDA7IGkgPD0gbWF4OyBpKyspIHsKKworCQlpZiAocnBpbmZvW2ldLmZyZXEgPT0gdGFyZ2V0KSB7CisJCQlpZHhfbCA9IGlkeF9yID0gaTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmICh0YXJnZXQgPCBycGluZm9baV0uZnJlcSkgeworCQkJaWR4X3IgPSBpOworCQkJaWR4X2wgPSBpZHhfciAtIDE7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKK2RvbmU6CisJLyogTm93IGludGVycG9sYXRlIHBvd2VyIHZhbHVlLCBiYXNlZCBvbiB0aGUgZnJlcXVlbmN5ICovCisJcmF0ZXMtPmZyZXEgPSB0YXJnZXQ7CisKKwlyYXRlcy0+dGFyZ2V0X3Bvd2VyXzZ0bzI0ID0KKwkJYXRoNWtfZ2V0X2ludGVycG9sYXRlZF92YWx1ZSh0YXJnZXQsIHJwaW5mb1tpZHhfbF0uZnJlcSwKKwkJCQkJcnBpbmZvW2lkeF9yXS5mcmVxLAorCQkJCQlycGluZm9baWR4X2xdLnRhcmdldF9wb3dlcl82dG8yNCwKKwkJCQkJcnBpbmZvW2lkeF9yXS50YXJnZXRfcG93ZXJfNnRvMjQpOworCisJcmF0ZXMtPnRhcmdldF9wb3dlcl8zNiA9CisJCWF0aDVrX2dldF9pbnRlcnBvbGF0ZWRfdmFsdWUodGFyZ2V0LCBycGluZm9baWR4X2xdLmZyZXEsCisJCQkJCXJwaW5mb1tpZHhfcl0uZnJlcSwKKwkJCQkJcnBpbmZvW2lkeF9sXS50YXJnZXRfcG93ZXJfMzYsCisJCQkJCXJwaW5mb1tpZHhfcl0udGFyZ2V0X3Bvd2VyXzM2KTsKKworCXJhdGVzLT50YXJnZXRfcG93ZXJfNDggPQorCQlhdGg1a19nZXRfaW50ZXJwb2xhdGVkX3ZhbHVlKHRhcmdldCwgcnBpbmZvW2lkeF9sXS5mcmVxLAorCQkJCQlycGluZm9baWR4X3JdLmZyZXEsCisJCQkJCXJwaW5mb1tpZHhfbF0udGFyZ2V0X3Bvd2VyXzQ4LAorCQkJCQlycGluZm9baWR4X3JdLnRhcmdldF9wb3dlcl80OCk7CisKKwlyYXRlcy0+dGFyZ2V0X3Bvd2VyXzU0ID0KKwkJYXRoNWtfZ2V0X2ludGVycG9sYXRlZF92YWx1ZSh0YXJnZXQsIHJwaW5mb1tpZHhfbF0uZnJlcSwKKwkJCQkJcnBpbmZvW2lkeF9yXS5mcmVxLAorCQkJCQlycGluZm9baWR4X2xdLnRhcmdldF9wb3dlcl81NCwKKwkJCQkJcnBpbmZvW2lkeF9yXS50YXJnZXRfcG93ZXJfNTQpOworfQorCisvKgorICogR2V0IHRoZSBtYXggZWRnZSBwb3dlciBmb3IgdGhpcyBjaGFubmVsIGlmCisgKiB3ZSBoYXZlIHN1Y2ggZGF0YSBmcm9tIEVFUFJPTSdzIENvbmZvcm1hbmNlIFRlc3QKKyAqIExpbWl0cyAoQ1RMKSwgYW5kIGxpbWl0IG1heCBwb3dlciBpZiBuZWVkZWQuCisgKgorICogRklYTUU6IE9ubHkgd29ya3MgZm9yIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWlucworICovCitzdGF0aWMgdm9pZAorYXRoNWtfZ2V0X21heF9jdGxfcG93ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCXN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXN0cnVjdCBhdGg1a19lZGdlX3Bvd2VyICpyZXAgPSBlZS0+ZWVfY3RsX3B3cjsKKwl1OCAqY3RsX3ZhbCA9IGVlLT5lZV9jdGw7CisJczE2IG1heF9jaGFuX3B3ciA9IGFoLT5haF90eHBvd2VyLnR4cF9tYXhfcHdyIC8gNDsKKwlzMTYgZWRnZV9wd3IgPSAwOworCXU4IHJlcF9pZHg7CisJdTggaSwgY3RsX21vZGU7CisJdTggY3RsX2lkeCA9IDB4RkY7CisJdTMyIHRhcmdldCA9IGNoYW5uZWwtPmNlbnRlcl9mcmVxOworCisJLyogRmluZCBvdXQgYSBDVEwgZm9yIG91ciBtb2RlIHRoYXQncyBub3QgbWFwcGVkCisJICogb24gYSBzcGVjaWZpYyByZWcgZG9tYWluLgorCSAqCisJICogVE9ETzogTWFwIG91ciBjdXJyZW50IHJlZyBkb21haW4gdG8gb25lIG9mIHRoZSAzIGF2YWlsYWJsZQorCSAqIHJlZyBkb21haW4gaWRzIHNvIHRoYXQgd2UgY2FuIHN1cHBvcnQgbW9yZSBDVExzLiAqLworCXN3aXRjaCAoY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMX01PREVTKSB7CisJY2FzZSBDSEFOTkVMX0E6CisJCWN0bF9tb2RlID0gQVI1S19DVExfMTFBIHwgQVI1S19DVExfTk9fUkVHRE9NQUlOOworCQlicmVhazsKKwljYXNlIENIQU5ORUxfRzoKKwkJY3RsX21vZGUgPSBBUjVLX0NUTF8xMUcgfCBBUjVLX0NUTF9OT19SRUdET01BSU47CisJCWJyZWFrOworCWNhc2UgQ0hBTk5FTF9COgorCQljdGxfbW9kZSA9IEFSNUtfQ1RMXzExQiB8IEFSNUtfQ1RMX05PX1JFR0RPTUFJTjsKKwkJYnJlYWs7CisJY2FzZSBDSEFOTkVMX1Q6CisJCWN0bF9tb2RlID0gQVI1S19DVExfVFVSQk8gfCBBUjVLX0NUTF9OT19SRUdET01BSU47CisJCWJyZWFrOworCWNhc2UgQ0hBTk5FTF9URzoKKwkJY3RsX21vZGUgPSBBUjVLX0NUTF9UVVJCT0cgfCBBUjVLX0NUTF9OT19SRUdET01BSU47CisJCWJyZWFrOworCWNhc2UgQ0hBTk5FTF9YUjoKKwkJLyogRmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlZS0+ZWVfY3RsczsgaSsrKSB7CisJCWlmIChjdGxfdmFsW2ldID09IGN0bF9tb2RlKSB7CisJCQljdGxfaWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSWYgd2UgaGF2ZSBhIENUTCBkYXRhc2V0IGF2YWlsYWJsZSBncmFiIGl0IGFuZCBmaW5kIHRoZQorCSAqIGVkZ2UgcG93ZXIgZm9yIG91ciBmcmVxdWVuY3kgKi8KKwlpZiAoY3RsX2lkeCA9PSAweEZGKQorCQlyZXR1cm47CisKKwkvKiBFZGdlIHBvd2VycyBhcmUgc29ydGVkIGJ5IGZyZXF1ZW5jeSBmcm9tIGxvd2VyCisJICogdG8gaGlnaGVyLiBFYWNoIENUTCBjb3JyZXNwb25kcyB0byA4IGVkZ2UgcG93ZXIKKwkgKiBtZWFzdXJlbWVudHMuICovCisJcmVwX2lkeCA9IGN0bF9pZHggKiBBUjVLX0VFUFJPTV9OX0VER0VTOworCisJLyogRG9uJ3QgZG8gYm91bmRhcmllcyBjaGVjayBiZWNhdXNlIHdlCisJICogbWlnaHQgaGF2ZSBtb3JlIHRoYXQgb25lIGJhbmRzIGRlZmluZWQKKwkgKiBmb3IgdGhpcyBtb2RlICovCisKKwkvKiBHZXQgdGhlIGVkZ2UgcG93ZXIgdGhhdCdzIGNsb3NlciB0byBvdXIKKwkgKiBmcmVxdWVuY3kgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVI1S19FRVBST01fTl9FREdFUzsgaSsrKSB7CisJCXJlcF9pZHggKz0gaTsKKwkJaWYgKHRhcmdldCA8PSByZXBbcmVwX2lkeF0uZnJlcSkKKwkJCWVkZ2VfcHdyID0gKHMxNikgcmVwW3JlcF9pZHhdLmVkZ2U7CisJfQorCisJaWYgKGVkZ2VfcHdyKSB7CisJCWFoLT5haF90eHBvd2VyLnR4cF9tYXhfcHdyID0gNCptaW4oZWRnZV9wd3IsIG1heF9jaGFuX3B3cik7CisJfQorfQorCisKKy8qCisgKiBQb3dlciB0byBQQ0RBQyB0YWJsZSBmdW5jdGlvbnMKKyAqLworCisvKgorICogRmlsbCBQb3dlciB0byBQQ0RBQyB0YWJsZSBvbiBSRjUxMTEKKyAqCisgKiBObyBmdXJ0aGVyIHByb2Nlc3NpbmcgaXMgbmVlZGVkIGZvciBSRjUxMTEsIHRoZSBvbmx5IHRoaW5nIHdlIGhhdmUgdG8KKyAqIGRvIGlzIGZpbGwgdGhlIHZhbHVlcyBiZWxvdyBhbmQgYWJvdmUgY2FsaWJyYXRpb24gcmFuZ2Ugc2luY2UgZWVwcm9tIGRhdGEKKyAqIG1heSBub3QgY292ZXIgdGhlIGVudGlyZSBQQ0RBQyB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX2ZpbGxfcHdyX3RvX3BjZGFjX3RhYmxlKHN0cnVjdCBhdGg1a19odyAqYWgsIHMxNiogdGFibGVfbWluLAorCQkJCQkJCXMxNiAqdGFibGVfbWF4KQoreworCXU4IAkqcGNkYWNfb3V0ID0gYWgtPmFoX3R4cG93ZXIudHhwX3BkX3RhYmxlOworCXU4CSpwY2RhY190bXAgPSBhaC0+YWhfdHhwb3dlci50bXBMWzBdOworCXU4CXBjZGFjXzAsIHBjZGFjX24sIHBjZGFjX2ksIHB3cl9pZHgsIGk7CisJczE2CW1pbl9wd3IsIG1heF9wd3I7CisKKwkvKiBHZXQgdGFibGUgYm91bmRhcmllcyAqLworCW1pbl9wd3IgPSB0YWJsZV9taW5bMF07CisJcGNkYWNfMCA9IHBjZGFjX3RtcFswXTsKKworCW1heF9wd3IgPSB0YWJsZV9tYXhbMF07CisJcGNkYWNfbiA9IHBjZGFjX3RtcFt0YWJsZV9tYXhbMF0gLSB0YWJsZV9taW5bMF1dOworCisJLyogRXh0cmFwb2xhdGUgYmVsb3cgbWluaW11bSB1c2luZyBwY2RhY18wICovCisJcGNkYWNfaSA9IDA7CisJZm9yIChpID0gMDsgaSA8IG1pbl9wd3I7IGkrKykKKwkJcGNkYWNfb3V0W3BjZGFjX2krK10gPSBwY2RhY18wOworCisJLyogQ29weSB2YWx1ZXMgZnJvbSBwY2RhY190bXAgKi8KKwlwd3JfaWR4ID0gbWluX3B3cjsKKwlmb3IgKGkgPSAwIDsgcHdyX2lkeCA8PSBtYXhfcHdyICYmCisJcGNkYWNfaSA8IEFSNUtfRUVQUk9NX1BPV0VSX1RBQkxFX1NJWkU7IGkrKykgeworCQlwY2RhY19vdXRbcGNkYWNfaSsrXSA9IHBjZGFjX3RtcFtpXTsKKwkJcHdyX2lkeCsrOworCX0KKworCS8qIEV4dHJhcG9sYXRlIGFib3ZlIG1heGltdW0gKi8KKwl3aGlsZSAocGNkYWNfaSA8IEFSNUtfRUVQUk9NX1BPV0VSX1RBQkxFX1NJWkUpCisJCXBjZGFjX291dFtwY2RhY19pKytdID0gcGNkYWNfbjsKKworfQorCisvKgorICogQ29tYmluZSBhdmFpbGFibGUgWFBEIEN1cnZlcyBhbmQgZmlsbCBMaW5lYXIgUG93ZXIgdG8gUENEQUMgdGFibGUKKyAqIG9uIFJGNTExMgorICoKKyAqIFJGWDExMiBjYW4gaGF2ZSB1cCB0byAyIGN1cnZlcyAob25lIGZvciBsb3cgdHhwb3dlciByYW5nZSBhbmQgb25lIGZvcgorICogaGlnaGVyIHR4cG93ZXIgcmFuZ2UpLiBXZSBuZWVkIHRvIHB1dCB0aGVtIGJvdGggb24gcGNkYWNfb3V0IGFuZCBwbGFjZQorICogdGhlbSBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4gSW4gY2FzZSB3ZSBvbmx5IGhhdmUgb25lIGN1cnZlIGF2YWlsYWJsZQorICoganVzdCBmaXQgaXQgb24gcGNkYWNfb3V0IChpdCdzIHN1cHBvc2VkIHRvIGNvdmVyIHRoZSBlbnRpcmUgcmFuZ2Ugb2YKKyAqIGF2YWlsYWJsZSBwd3IgbGV2ZWxzIHNpbmNlIGl0J3MgYWx3YXlzIHRoZSBoaWdoZXIgcG93ZXIgY3VydmUpLiBFeHRyYXBvbGF0ZQorICogYmVsb3cgYW5kIGFib3ZlIGZpbmFsIHRhYmxlIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX2NvbWJpbmVfbGluZWFyX3BjZGFjX2N1cnZlcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzMTYqIHRhYmxlX21pbiwKKwkJCQkJCXMxNiAqdGFibGVfbWF4LCB1OCBwZGN1cnZlcykKK3sKKwl1OCAJKnBjZGFjX291dCA9IGFoLT5haF90eHBvd2VyLnR4cF9wZF90YWJsZTsKKwl1OAkqcGNkYWNfbG93X3B3cjsKKwl1OAkqcGNkYWNfaGlnaF9wd3I7CisJdTgJKnBjZGFjX3RtcDsKKwl1OAlwd3I7CisJczE2CW1heF9wd3JfaWR4OworCXMxNgltaW5fcHdyX2lkeDsKKwlzMTYJbWlkX3B3cl9pZHggPSAwOworCS8qIEVkZ2UgZmxhZyB0dXJzIG9uIHRoZSA3bnRoIGJpdCBvbiB0aGUgUENEQUMKKwkgKiB0byBkZWxjYXJlIHRoZSBoaWdoZXIgcG93ZXIgY3VydmUgKGZvcmNlIHZhbHVlcworCSAqIHRvIGJlIGdyZWF0ZXIgdGhhbiA2NCkuIElmIHdlIG9ubHkgaGF2ZSBvbmUgY3VydmUKKwkgKiB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGlzLCBpZiB3ZSBoYXZlIDIgY3VydmVzIGFuZAorCSAqIGZpbGwgdGhlIHRhYmxlIGJhY2t3YXJkcyB0aGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8KKwkgKiBzd2l0Y2ggZnJvbSBoaWdoZXIgcG93ZXIgY3VydmUgdG8gbG93ZXIgcG93ZXIgY3VydmUgKi8KKwl1OAllZGdlX2ZsYWc7CisJaW50CWk7CisKKwkvKiBXaGVuIHdlIGhhdmUgb25seSBvbmUgY3VydmUgYXZhaWxhYmxlCisJICogdGhhdCdzIHRoZSBoaWdoZXIgcG93ZXIgY3VydmUuIElmIHdlIGhhdmUKKwkgKiB0d28gY3VydmVzIHRoZSBmaXJzdCBpcyB0aGUgaGlnaCBwb3dlciBjdXJ2ZQorCSAqIGFuZCB0aGUgbmV4dCBpcyB0aGUgbG93IHBvd2VyIGN1cnZlLiAqLworCWlmIChwZGN1cnZlcyA+IDEpIHsKKwkJcGNkYWNfbG93X3B3ciA9IGFoLT5haF90eHBvd2VyLnRtcExbMV07CisJCXBjZGFjX2hpZ2hfcHdyID0gYWgtPmFoX3R4cG93ZXIudG1wTFswXTsKKwkJbWlkX3B3cl9pZHggPSB0YWJsZV9tYXhbMV0gLSB0YWJsZV9taW5bMV0gLSAxOworCQltYXhfcHdyX2lkeCA9ICh0YWJsZV9tYXhbMF0gLSB0YWJsZV9taW5bMF0pIC8gMjsKKworCQkvKiBJZiB0YWJsZSBzaXplIGdvZXMgYmV5b25kIDMxLjVkQiwga2VlcCB0aGUKKwkJICogdXBwZXIgMzEuNWRCIHJhbmdlIHdoZW4gc2V0dGluZyB0eCBwb3dlci4KKwkJICogTm90ZTogMTI2ID0gMzEuNSBkQiBpbiBxdWFydGVyIGRCIHN0ZXBzICovCisJCWlmICh0YWJsZV9tYXhbMF0gLSB0YWJsZV9taW5bMV0gPiAxMjYpCisJCQltaW5fcHdyX2lkeCA9IHRhYmxlX21heFswXSAtIDEyNjsKKwkJZWxzZQorCQkJbWluX3B3cl9pZHggPSB0YWJsZV9taW5bMV07CisKKwkJLyogU2luY2Ugd2UgZmlsbCB0YWJsZSBiYWNrd2FyZHMKKwkJICogc3RhcnQgZnJvbSBoaWdoIHBvd2VyIGN1cnZlICovCisJCXBjZGFjX3RtcCA9IHBjZGFjX2hpZ2hfcHdyOworCisJCWVkZ2VfZmxhZyA9IDB4NDA7CisJfSBlbHNlIHsKKwkJcGNkYWNfbG93X3B3ciA9IGFoLT5haF90eHBvd2VyLnRtcExbMV07IC8qIFplcm9lZCAqLworCQlwY2RhY19oaWdoX3B3ciA9IGFoLT5haF90eHBvd2VyLnRtcExbMF07CisJCW1pbl9wd3JfaWR4ID0gdGFibGVfbWluWzBdOworCQltYXhfcHdyX2lkeCA9ICh0YWJsZV9tYXhbMF0gLSB0YWJsZV9taW5bMF0pIC8gMjsKKwkJcGNkYWNfdG1wID0gcGNkYWNfaGlnaF9wd3I7CisJCWVkZ2VfZmxhZyA9IDA7CisJfQorCisJLyogVGhpcyBpcyB1c2VkIHdoZW4gc2V0dGluZyB0eCBwb3dlciovCisJYWgtPmFoX3R4cG93ZXIudHhwX21pbl9pZHggPSBtaW5fcHdyX2lkeC8yOworCisJLyogRmlsbCBQb3dlciB0byBQQ0RBQyB0YWJsZSBiYWNrd2FyZHMgKi8KKwlwd3IgPSBtYXhfcHdyX2lkeDsKKwlmb3IgKGkgPSA2MzsgaSA+PSAwOyBpLS0pIHsKKwkJLyogRW50ZXJpbmcgbG93ZXIgcG93ZXIgcmFuZ2UsIHJlc2V0CisJCSAqIGVkZ2UgZmxhZyBhbmQgc2V0IHBjZGFjX3RtcCB0byBsb3dlcgorCQkgKiBwb3dlciBjdXJ2ZS4qLworCQlpZiAoZWRnZV9mbGFnID09IDB4NDAgJiYKKwkJKDIqcHdyIDw9ICh0YWJsZV9tYXhbMV0gLSB0YWJsZV9taW5bMF0pIHx8IHB3ciA9PSAwKSkgeworCQkJZWRnZV9mbGFnID0gMHgwMDsKKwkJCXBjZGFjX3RtcCA9IHBjZGFjX2xvd19wd3I7CisJCQlwd3IgPSBtaWRfcHdyX2lkeC8yOworCQl9CisKKwkJLyogRG9uJ3QgZ28gYmVsb3cgMSwgZXh0cmFwb2xhdGUgYmVsb3cgaWYgd2UgaGF2ZQorCQkgKiBhbHJlYWR5IHN3aXRoY2VkIHRvIHRoZSBsb3dlciBwb3dlciBjdXJ2ZSAtb3IKKwkJICogd2Ugb25seSBoYXZlIG9uZSBjdXJ2ZSBhbmQgZWRnZV9mbGFnIGlzIHplcm8KKwkJICogYW55d2F5ICovCisJCWlmIChwY2RhY190bXBbcHdyXSA8IDEgJiYgKGVkZ2VfZmxhZyA9PSAweDAwKSkgeworCQkJd2hpbGUgKGkgPj0gMCkgeworCQkJCXBjZGFjX291dFtpXSA9IHBjZGFjX291dFtpICsgMV07CisJCQkJaS0tOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlwY2RhY19vdXRbaV0gPSBwY2RhY190bXBbcHdyXSB8IGVkZ2VfZmxhZzsKKworCQkvKiBFeHRyYXBvbGF0ZSBhYm92ZSBpZiBwY2RhYyBpcyBncmVhdGVyIHRoYW4KKwkJICogMTI2IC10aGlzIGNhbiBoYXBwZW4gYmVjYXVzZSB3ZSBPUiBwY2RhY19vdXQKKwkJICogdmFsdWUgd2l0aCBlZGdlX2ZsYWcgb24gaGlnaCBwb3dlciBjdXJ2ZSAqLworCQlpZiAocGNkYWNfb3V0W2ldID4gMTI2KQorCQkJcGNkYWNfb3V0W2ldID0gMTI2OworCisJCS8qIERlY3JlYXNlIGJ5IGEgMC41ZEIgc3RlcCAqLworCQlwd3ItLTsKKwl9Cit9CisKKy8qIFdyaXRlIFBDREFDIHZhbHVlcyBvbiBodyAqLworc3RhdGljIHZvaWQKK2F0aDVrX3NldHVwX3BjZGFjX3RhYmxlKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJdTggCSpwY2RhY19vdXQgPSBhaC0+YWhfdHhwb3dlci50eHBfcGRfdGFibGU7CisJaW50CWk7CisKKwkvKgorCSAqIFdyaXRlIFRYIHBvd2VyIHZhbHVlcworCSAqLworCWZvciAoaSA9IDA7IGkgPCAoQVI1S19FRVBST01fUE9XRVJfVEFCTEVfU0laRSAvIDIpOyBpKyspIHsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJKCgocGNkYWNfb3V0WzIqaSArIDBdIDw8IDggfCAweGZmKSAmIDB4ZmZmZikgPDwgMCkgfAorCQkJKCgocGNkYWNfb3V0WzIqaSArIDFdIDw8IDggfCAweGZmKSAmIDB4ZmZmZikgPDwgMTYpLAorCQkJQVI1S19QSFlfUENEQUNfVFhQT1dFUihpKSk7CisJfQorfQorCisKKy8qCisgKiBQb3dlciB0byBQREFEQyB0YWJsZSBmdW5jdGlvbnMKKyAqLworCisvKgorICogU2V0IHRoZSBnYWluIGJvdW5kYXJpZXMgYW5kIGNyZWF0ZSBmaW5hbCBQb3dlciB0byBQREFEQyB0YWJsZQorICoKKyAqIFdlIGNhbiBoYXZlIHVwIHRvIDQgcGQgY3VydmVzLCB3ZSBuZWVkIHRvIGRvIGEgc2ltbWlsYXIgcHJvY2VzcworICogYXMgd2UgZG8gZm9yIFJGNTExMi4gVGhpcyB0aW1lIHdlIGRvbid0IGhhdmUgYW4gZWRnZV9mbGFnIGJ1dCB3ZQorICogc2V0IHRoZSBnYWluIGJvdW5kYXJpZXMgb24gYSBzZXBhcmF0ZSByZWdpc3Rlci4KKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX2NvbWJpbmVfcHdyX3RvX3BkYWRjX2N1cnZlcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJczE2ICpwd3JfbWluLCBzMTYgKnB3cl9tYXgsIHU4IHBkY3VydmVzKQoreworCXU4IGdhaW5fYm91bmRhcmllc1tBUjVLX0VFUFJPTV9OX1BEX0dBSU5TXTsKKwl1OCAqcGRhZGNfb3V0ID0gYWgtPmFoX3R4cG93ZXIudHhwX3BkX3RhYmxlOworCXU4ICpwZGFkY190bXA7CisJczE2IHBkYWRjXzA7CisJdTggcGRhZGNfaSwgcGRhZGNfbiwgcHdyX3N0ZXAsIHBkZywgbWF4X2lkeCwgdGFibGVfc2l6ZTsKKwl1OCBwZF9nYWluX292ZXJsYXA7CisKKwkvKiBOb3RlOiBSZWdpc3RlciB2YWx1ZSBpcyBpbml0aWFsaXplZCBvbiBpbml0dmFscworCSAqIHRoZXJlIGlzIG5vIGZlZWRiYWNrIGZyb20gaHcuCisJICogWFhYOiBXaGF0IGFib3V0IHBkX2dhaW5fb3ZlcmxhcCBmcm9tIEVFUFJPTSA/ICovCisJcGRfZ2Fpbl9vdmVybGFwID0gKHU4KSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfVFBDX1JHNSkgJgorCQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fT1ZFUkxBUDsKKworCS8qIENyZWF0ZSBmaW5hbCBQREFEQyB0YWJsZSAqLworCWZvciAocGRnID0gMCwgcGRhZGNfaSA9IDA7IHBkZyA8IHBkY3VydmVzOyBwZGcrKykgeworCQlwZGFkY190bXAgPSBhaC0+YWhfdHhwb3dlci50bXBMW3BkZ107CisKKwkJaWYgKHBkZyA9PSBwZGN1cnZlcyAtIDEpCisJCQkvKiAyIGRCIGJvdW5kYXJ5IHN0cmV0Y2ggZm9yIGxhc3QKKwkJCSAqIChoaWdoZXIgcG93ZXIpIGN1cnZlICovCisJCQlnYWluX2JvdW5kYXJpZXNbcGRnXSA9IHB3cl9tYXhbcGRnXSArIDQ7CisJCWVsc2UKKwkJCS8qIFNldCBnYWluIGJvdW5kYXJ5IGluIHRoZSBtaWRkbGUKKwkJCSAqIGJldHdlZW4gdGhpcyBjdXJ2ZSBhbmQgdGhlIG5leHQgb25lICovCisJCQlnYWluX2JvdW5kYXJpZXNbcGRnXSA9CisJCQkJKHB3cl9tYXhbcGRnXSArIHB3cl9taW5bcGRnICsgMV0pIC8gMjsKKworCQkvKiBTYW5pdHkgY2hlY2sgaW4gY2FzZSBvdXIgMiBkYiBzdHJldGNoIGdvdCBvdXQgb2YKKwkJICogcmFuZ2UuICovCisJCWlmIChnYWluX2JvdW5kYXJpZXNbcGRnXSA+IEFSNUtfVFVORV9NQVhfVFhQT1dFUikKKwkJCWdhaW5fYm91bmRhcmllc1twZGddID0gQVI1S19UVU5FX01BWF9UWFBPV0VSOworCisJCS8qIEZvciB0aGUgZmlyc3QgY3VydmUgKGxvd2VyIHBvd2VyKQorCQkgKiBzdGFydCBmcm9tIDAgZEIgKi8KKwkJaWYgKHBkZyA9PSAwKQorCQkJcGRhZGNfMCA9IDA7CisJCWVsc2UKKwkJCS8qIEZvciB0aGUgb3RoZXIgY3VydmVzIHVzZSB0aGUgZ2FpbiBvdmVybGFwICovCisJCQlwZGFkY18wID0gKGdhaW5fYm91bmRhcmllc1twZGcgLSAxXSAtIHB3cl9taW5bcGRnXSkgLQorCQkJCQkJCXBkX2dhaW5fb3ZlcmxhcDsKKworCQkvKiBGb3JjZSBlYWNoIHBvd2VyIHN0ZXAgdG8gYmUgYXQgbGVhc3QgMC41IGRCICovCisJCWlmICgocGRhZGNfdG1wWzFdIC0gcGRhZGNfdG1wWzBdKSA+IDEpCisJCQlwd3Jfc3RlcCA9IHBkYWRjX3RtcFsxXSAtIHBkYWRjX3RtcFswXTsKKwkJZWxzZQorCQkJcHdyX3N0ZXAgPSAxOworCisJCS8qIElmIHBkYWRjXzAgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gZXh0cmFwb2xhdGUKKwkJICogYmVsb3cgdGhpcyBwZGdhaW4gYnkgYSBudW1iZXIgb2YgcHdyX3N0ZXBzICovCisJCXdoaWxlICgocGRhZGNfMCA8IDApICYmIChwZGFkY19pIDwgMTI4KSkgeworCQkJczE2IHRtcCA9IHBkYWRjX3RtcFswXSArIHBkYWRjXzAgKiBwd3Jfc3RlcDsKKwkJCXBkYWRjX291dFtwZGFkY19pKytdID0gKHRtcCA8IDApID8gMCA6ICh1OCkgdG1wOworCQkJcGRhZGNfMCsrOworCQl9CisKKwkJLyogU2V0IGxhc3QgcHdyIGxldmVsLCB1c2luZyBnYWluIGJvdW5kYXJpZXMgKi8KKwkJcGRhZGNfbiA9IGdhaW5fYm91bmRhcmllc1twZGddICsgcGRfZ2Fpbl9vdmVybGFwIC0gcHdyX21pbltwZGddOworCQkvKiBMaW1pdCBpdCB0byBiZSBpbnNpZGUgcHdyIHJhbmdlICovCisJCXRhYmxlX3NpemUgPSBwd3JfbWF4W3BkZ10gLSBwd3JfbWluW3BkZ107CisJCW1heF9pZHggPSAocGRhZGNfbiA8IHRhYmxlX3NpemUpID8gcGRhZGNfbiA6IHRhYmxlX3NpemU7CisKKwkJLyogRmlsbCBwZGFkY19vdXQgdGFibGUgKi8KKwkJd2hpbGUgKHBkYWRjXzAgPCBtYXhfaWR4KQorCQkJcGRhZGNfb3V0W3BkYWRjX2krK10gPSBwZGFkY190bXBbcGRhZGNfMCsrXTsKKworCQkvKiBOZWVkIHRvIGV4dHJhcG9sYXRlIGFib3ZlIHRoaXMgcGRnYWluPyAqLworCQlpZiAocGRhZGNfbiA8PSBtYXhfaWR4KQorCQkJY29udGludWU7CisKKwkJLyogRm9yY2UgZWFjaCBwb3dlciBzdGVwIHRvIGJlIGF0IGxlYXN0IDAuNSBkQiAqLworCQlpZiAoKHBkYWRjX3RtcFt0YWJsZV9zaXplIC0gMV0gLSBwZGFkY190bXBbdGFibGVfc2l6ZSAtIDJdKSA+IDEpCisJCQlwd3Jfc3RlcCA9IHBkYWRjX3RtcFt0YWJsZV9zaXplIC0gMV0gLQorCQkJCQkJcGRhZGNfdG1wW3RhYmxlX3NpemUgLSAyXTsKKwkJZWxzZQorCQkJcHdyX3N0ZXAgPSAxOworCisJCS8qIEV4dHJhcG9sYXRlIGFib3ZlICovCisJCXdoaWxlICgocGRhZGNfMCA8IChzMTYpIHBkYWRjX24pICYmCisJCShwZGFkY19pIDwgQVI1S19FRVBST01fUE9XRVJfVEFCTEVfU0laRSAqIDIpKSB7CisJCQlzMTYgdG1wID0gcGRhZGNfdG1wW3RhYmxlX3NpemUgLSAxXSArCisJCQkJCShwZGFkY18wIC0gbWF4X2lkeCkgKiBwd3Jfc3RlcDsKKwkJCXBkYWRjX291dFtwZGFkY19pKytdID0gKHRtcCA+IDEyNykgPyAxMjcgOiAodTgpIHRtcDsKKwkJCXBkYWRjXzArKzsKKwkJfQorCX0KKworCXdoaWxlIChwZGcgPCBBUjVLX0VFUFJPTV9OX1BEX0dBSU5TKSB7CisJCWdhaW5fYm91bmRhcmllc1twZGddID0gZ2Fpbl9ib3VuZGFyaWVzW3BkZyAtIDFdOworCQlwZGcrKzsKKwl9CisKKwl3aGlsZSAocGRhZGNfaSA8IEFSNUtfRUVQUk9NX1BPV0VSX1RBQkxFX1NJWkUgKiAyKSB7CisJCXBkYWRjX291dFtwZGFkY19pXSA9IHBkYWRjX291dFtwZGFkY19pIC0gMV07CisJCXBkYWRjX2krKzsKKwl9CisKKwkvKiBTZXQgZ2FpbiBib3VuZGFyaWVzICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQlBUjVLX1JFR19TTShwZF9nYWluX292ZXJsYXAsCisJCQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fT1ZFUkxBUCkgfAorCQlBUjVLX1JFR19TTShnYWluX2JvdW5kYXJpZXNbMF0sCisJCQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfMSkgfAorCQlBUjVLX1JFR19TTShnYWluX2JvdW5kYXJpZXNbMV0sCisJCQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfMikgfAorCQlBUjVLX1JFR19TTShnYWluX2JvdW5kYXJpZXNbMl0sCisJCQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfMykgfAorCQlBUjVLX1JFR19TTShnYWluX2JvdW5kYXJpZXNbM10sCisJCQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfNCksCisJCUFSNUtfUEhZX1RQQ19SRzUpOworCisJLyogVXNlZCBmb3Igc2V0dGluZyByYXRlIHBvd2VyIHRhYmxlICovCisJYWgtPmFoX3R4cG93ZXIudHhwX21pbl9pZHggPSBwd3JfbWluWzBdOworCit9CisKKy8qIFdyaXRlIFBEQURDIHZhbHVlcyBvbiBodyAqLworc3RhdGljIHZvaWQKK2F0aDVrX3NldHVwX3B3cl90b19wZGFkY190YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJdTggcGRjdXJ2ZXMsIHU4ICpwZGdfdG9faWR4KQoreworCXU4ICpwZGFkY19vdXQgPSBhaC0+YWhfdHhwb3dlci50eHBfcGRfdGFibGU7CisJdTMyIHJlZzsKKwl1OCBpOworCisJLyogU2VsZWN0IHRoZSByaWdodCBwZGdhaW4gY3VydmVzICovCisKKwkvKiBDbGVhciBjdXJyZW50IHNldHRpbmdzICovCisJcmVnID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1RQQ19SRzEpOworCXJlZyAmPSB+KEFSNUtfUEhZX1RQQ19SRzFfUERHQUlOXzEgfAorCQlBUjVLX1BIWV9UUENfUkcxX1BER0FJTl8yIHwKKwkJQVI1S19QSFlfVFBDX1JHMV9QREdBSU5fMyB8CisJCUFSNUtfUEhZX1RQQ19SRzFfTlVNX1BEX0dBSU4pOworCisJLyoKKwkgKiBVc2UgcGRfZ2FpbnMgY3VydmUgZnJvbSBlZXByb20KKwkgKgorCSAqIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNldHRpbmcgZnJvbSBpbml0dmFscworCSAqIGluIGNhc2Ugc29tZSB2ZW5kb3JzIChlLmcuIFpjb21heCkgZG9uJ3QgdXNlIHRoZSBkZWZhdWx0CisJICogY3VydmVzLiBJZiB3ZSBkb24ndCBob25vciB0aGVpciBzZXR0aW5ncyB3ZSAnbGwgZ2V0IGEKKwkgKiA1ZEIgKDEgKiBnYWluIG92ZXJsYXAgPykgZHJvcC4KKwkgKi8KKwlyZWcgfD0gQVI1S19SRUdfU00ocGRjdXJ2ZXMsIEFSNUtfUEhZX1RQQ19SRzFfTlVNX1BEX0dBSU4pOworCisJc3dpdGNoIChwZGN1cnZlcykgeworCWNhc2UgMzoKKwkJcmVnIHw9IEFSNUtfUkVHX1NNKHBkZ190b19pZHhbMl0sIEFSNUtfUEhZX1RQQ19SRzFfUERHQUlOXzMpOworCQkvKiBGYWxsIHRocm91Z2ggKi8KKwljYXNlIDI6CisJCXJlZyB8PSBBUjVLX1JFR19TTShwZGdfdG9faWR4WzFdLCBBUjVLX1BIWV9UUENfUkcxX1BER0FJTl8yKTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSAxOgorCQlyZWcgfD0gQVI1S19SRUdfU00ocGRnX3RvX2lkeFswXSwgQVI1S19QSFlfVFBDX1JHMV9QREdBSU5fMSk7CisJCWJyZWFrOworCX0KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHJlZywgQVI1S19QSFlfVFBDX1JHMSk7CisKKwkvKgorCSAqIFdyaXRlIFRYIHBvd2VyIHZhbHVlcworCSAqLworCWZvciAoaSA9IDA7IGkgPCAoQVI1S19FRVBST01fUE9XRVJfVEFCTEVfU0laRSAvIDIpOyBpKyspIHsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJKChwZGFkY19vdXRbNCppICsgMF0gJiAweGZmKSA8PCAwKSB8CisJCQkoKHBkYWRjX291dFs0KmkgKyAxXSAmIDB4ZmYpIDw8IDgpIHwKKwkJCSgocGRhZGNfb3V0WzQqaSArIDJdICYgMHhmZikgPDwgMTYpIHwKKwkJCSgocGRhZGNfb3V0WzQqaSArIDNdICYgMHhmZikgPDwgMjQpLAorCQkJQVI1S19QSFlfUERBRENfVFhQT1dFUihpKSk7CisJfQorfQorCisKKy8qCisgKiBDb21tb24gY29kZSBmb3IgUENEQUMvUERBREMgdGFibGVzCisgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdGhhdCB1c2VzIGFsbCBvZiB0aGUgYWJvdmUKKyAqIHRvIHNldCBQQ0RBQy9QREFEQyB0YWJsZSBvbiBodyBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbC4KKyAqIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgdHggcG93ZXIgY2FsaWJyYXRpb24gb24gdGhlIGJhc2JhbmQsCisgKiB3aXRob3V0IGl0IHdlIGdldCB3ZWlyZCB0eCBwb3dlciBsZXZlbHMgYW5kIGluIHNvbWUgY2FzZXMKKyAqIGRpc3RvcnRlZCBzcGVjdHJhbCBtYXNrCisgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX3NldHVwX2NoYW5uZWxfcG93ZXJ0YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCisJCQl1OCBlZV9tb2RlLCB1OCB0eXBlKQoreworCXN0cnVjdCBhdGg1a19wZGdhaW5faW5mbyAqcGRnX0wsICpwZGdfUjsKKwlzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8gKnBjaW5mb19MOworCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mbyAqcGNpbmZvX1I7CisJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CisJdTggKnBkZ19jdXJ2ZV90b19pZHggPSBlZS0+ZWVfcGRjX3RvX2lkeFtlZV9tb2RlXTsKKwlzMTYgdGFibGVfbWluW0FSNUtfRUVQUk9NX05fUERfR0FJTlNdOworCXMxNiB0YWJsZV9tYXhbQVI1S19FRVBST01fTl9QRF9HQUlOU107CisJdTggKnRtcEw7CisJdTggKnRtcFI7CisJdTMyIHRhcmdldCA9IGNoYW5uZWwtPmNlbnRlcl9mcmVxOworCWludCBwZGcsIGk7CisKKwkvKiBHZXQgc3Vyb3VuZGluZyBmcmVxIHBpZXJzIGZvciB0aGlzIGNoYW5uZWwgKi8KKwlhdGg1a19nZXRfY2hhbl9wY2FsX3N1cnJvdW5kaW5nX3BpZXJzKGFoLCBjaGFubmVsLAorCQkJCQkJJnBjaW5mb19MLAorCQkJCQkJJnBjaW5mb19SKTsKKworCS8qIExvb3Agb3ZlciBwZCBnYWluIGN1cnZlcyBvbgorCSAqIHN1cm91bmRpbmcgZnJlcSBwaWVycyBieSBpbmRleCAqLworCWZvciAocGRnID0gMDsgcGRnIDwgZWUtPmVlX3BkX2dhaW5zW2VlX21vZGVdOyBwZGcrKykgeworCisJCS8qIEZpbGwgY3VydmVzIGluIHJldmVyc2Ugb3JkZXIKKwkJICogZnJvbSBsb3dlciBwb3dlciAobWF4IGdhaW4pCisJCSAqIHRvIGhpZ2hlciBwb3dlci4gVXNlIGN1cnZlIC0+IGlkeAorCQkgKiBiYWNrbWFwaW5nIHdlIGRpZCBvbiBlZXByb20gaW5pdCAqLworCQl1OCBpZHggPSBwZGdfY3VydmVfdG9faWR4W3BkZ107CisKKwkJLyogR3JhYiB0aGUgbmVlZGVkIGN1cnZlcyBieSBpbmRleCAqLworCQlwZGdfTCA9ICZwY2luZm9fTC0+cGRfY3VydmVzW2lkeF07CisJCXBkZ19SID0gJnBjaW5mb19SLT5wZF9jdXJ2ZXNbaWR4XTsKKworCQkvKiBJbml0aWFsaXplIHRoZSB0ZW1wIHRhYmxlcyAqLworCQl0bXBMID0gYWgtPmFoX3R4cG93ZXIudG1wTFtwZGddOworCQl0bXBSID0gYWgtPmFoX3R4cG93ZXIudG1wUltwZGddOworCisJCS8qIFNldCBjdXJ2ZSdzIHggYm91bmRhcmllcyBhbmQgY3JlYXRlCisJCSAqIGN1cnZlcyBzbyB0aGF0IHRoZXkgY292ZXIgdGhlIHNhbWUKKwkJICogcmFuZ2UgKGlmIHdlIGRvbid0IGRvIHRoYXQgb25lIHRhYmxlCisJCSAqIHdpbGwgaGF2ZSB2YWx1ZXMgb24gc29tZSByYW5nZSBhbmQgdGhlCisJCSAqIG90aGVyIG9uZSB3b24ndCBoYXZlIGFueSBzbyBpbnRlcnBvbGF0aW9uCisJCSAqIHdpbGwgZmFpbCkgKi8KKwkJdGFibGVfbWluW3BkZ10gPSBtaW4ocGRnX0wtPnBkX3B3clswXSwKKwkJCQkJcGRnX1ItPnBkX3B3clswXSkgLyAyOworCisJCXRhYmxlX21heFtwZGddID0gbWF4KHBkZ19MLT5wZF9wd3JbcGRnX0wtPnBkX3BvaW50cyAtIDFdLAorCQkJCXBkZ19SLT5wZF9wd3JbcGRnX1ItPnBkX3BvaW50cyAtIDFdKSAvIDI7CisKKwkJLyogTm93IGNyZWF0ZSB0aGUgY3VydmVzIG9uIHN1cnJvdW5kaW5nIGNoYW5uZWxzCisJCSAqIGFuZCBpbnRlcnBvbGF0ZSBpZiBuZWVkZWQgdG8gZ2V0IHRoZSBmaW5hbAorCQkgKiBjdXJ2ZSBmb3IgdGhpcyBnYWluIG9uIHRoaXMgY2hhbm5lbCAqLworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBBUjVLX1BXUlRBQkxFX0xJTkVBUl9QQ0RBQzoKKwkJCS8qIE92ZXJyaWRlIG1pbi9tYXggc28gdGhhdCB3ZSBkb24ndCBsb29zZQorCQkJICogYWNjdXJhY3kgKGRvbid0IGRpdmlkZSBieSAyKSAqLworCQkJdGFibGVfbWluW3BkZ10gPSBtaW4ocGRnX0wtPnBkX3B3clswXSwKKwkJCQkJCXBkZ19SLT5wZF9wd3JbMF0pOworCisJCQl0YWJsZV9tYXhbcGRnXSA9CisJCQkJbWF4KHBkZ19MLT5wZF9wd3JbcGRnX0wtPnBkX3BvaW50cyAtIDFdLAorCQkJCQlwZGdfUi0+cGRfcHdyW3BkZ19SLT5wZF9wb2ludHMgLSAxXSk7CisKKwkJCS8qIE92ZXJyaWRlIG1pbmltdW0gc28gdGhhdCB3ZSBkb24ndCBnZXQKKwkJCSAqIG91dCBvZiBib3VuZHMgd2hpbGUgZXh0cmFwb2xhdGluZworCQkJICogYmVsb3cuIERvbid0IGRvIHRoaXMgd2hlbiB3ZSBoYXZlIDIKKwkJCSAqIGN1cnZlcyBhbmQgd2UgYXJlIG9uIHRoZSBoaWdoIHBvd2VyIGN1cnZlCisJCQkgKiBiZWNhdXNlIHRhYmxlX21pbiBpcyBvayBpbiB0aGlzIGNhc2UgKi8KKwkJCWlmICghKGVlLT5lZV9wZF9nYWluc1tlZV9tb2RlXSA+IDEgJiYgcGRnID09IDApKSB7CisKKwkJCQl0YWJsZV9taW5bcGRnXSA9CisJCQkJCWF0aDVrX2dldF9saW5lYXJfcGNkYWNfbWluKHBkZ19MLT5wZF9zdGVwLAorCQkJCQkJCQlwZGdfUi0+cGRfc3RlcCwKKwkJCQkJCQkJcGRnX0wtPnBkX3B3ciwKKwkJCQkJCQkJcGRnX1ItPnBkX3B3cik7CisKKwkJCQkvKiBEb24ndCBnbyB0b28gbG93IGJlY2F1c2Ugd2Ugd2lsbAorCQkJCSAqIG1pc3MgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIGN1cnZlLgorCQkJCSAqIE5vdGU6IDEyNiA9IDMxLjVkQiAobWF4IHBvd2VyIHN1cHBvcnRlZCkKKwkJCQkgKiBpbiAwLjI1ZEIgdW5pdHMgKi8KKwkJCQlpZiAodGFibGVfbWF4W3BkZ10gLSB0YWJsZV9taW5bcGRnXSA+IDEyNikKKwkJCQkJdGFibGVfbWluW3BkZ10gPSB0YWJsZV9tYXhbcGRnXSAtIDEyNjsKKwkJCX0KKworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCWNhc2UgQVI1S19QV1JUQUJMRV9QV1JfVE9fUENEQUM6CisJCWNhc2UgQVI1S19QV1JUQUJMRV9QV1JfVE9fUERBREM6CisKKwkJCWF0aDVrX2NyZWF0ZV9wb3dlcl9jdXJ2ZSh0YWJsZV9taW5bcGRnXSwKKwkJCQkJCXRhYmxlX21heFtwZGddLAorCQkJCQkJcGRnX0wtPnBkX3B3ciwKKwkJCQkJCXBkZ19MLT5wZF9zdGVwLAorCQkJCQkJcGRnX0wtPnBkX3BvaW50cywgdG1wTCwgdHlwZSk7CisKKwkJCS8qIFdlIGFyZSBpbiBhIGNhbGlicmF0aW9uCisJCQkgKiBwaWVyLCBubyBuZWVkIHRvIGludGVycG9sYXRlCisJCQkgKiBiZXR3ZWVuIGZyZXEgcGllcnMgKi8KKwkJCWlmIChwY2luZm9fTCA9PSBwY2luZm9fUikKKwkJCQljb250aW51ZTsKKworCQkJYXRoNWtfY3JlYXRlX3Bvd2VyX2N1cnZlKHRhYmxlX21pbltwZGddLAorCQkJCQkJdGFibGVfbWF4W3BkZ10sCisJCQkJCQlwZGdfUi0+cGRfcHdyLAorCQkJCQkJcGRnX1ItPnBkX3N0ZXAsCisJCQkJCQlwZGdfUi0+cGRfcG9pbnRzLCB0bXBSLCB0eXBlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBJbnRlcnBvbGF0ZSBiZXR3ZWVuIGN1cnZlcworCQkgKiBvZiBzdXJvdW5kaW5nIGZyZXEgcGllcnMgdG8KKwkJICogZ2V0IHRoZSBmaW5hbCBjdXJ2ZSBmb3IgdGhpcworCQkgKiBwZCBnYWluLiBSZS11c2UgdG1wTCBmb3IgaW50ZXJwb2xhdGlvbgorCQkgKiBvdXRwdXQgKi8KKwkJZm9yIChpID0gMDsgKGkgPCAodTE2KSAodGFibGVfbWF4W3BkZ10gLSB0YWJsZV9taW5bcGRnXSkpICYmCisJCShpIDwgQVI1S19FRVBST01fUE9XRVJfVEFCTEVfU0laRSk7IGkrKykgeworCQkJdG1wTFtpXSA9ICh1OCkgYXRoNWtfZ2V0X2ludGVycG9sYXRlZF92YWx1ZSh0YXJnZXQsCisJCQkJCQkJKHMxNikgcGNpbmZvX0wtPmZyZXEsCisJCQkJCQkJKHMxNikgcGNpbmZvX1ItPmZyZXEsCisJCQkJCQkJKHMxNikgdG1wTFtpXSwKKwkJCQkJCQkoczE2KSB0bXBSW2ldKTsKKwkJfQorCX0KKworCS8qIE5vdyB3ZSBoYXZlIGEgc2V0IG9mIGN1cnZlcyBmb3IgdGhpcworCSAqIGNoYW5uZWwgb24gdG1wTCAoeCByYW5nZSBpcyB0YWJsZV9tYXggLSB0YWJsZV9taW4KKwkgKiBhbmQgeSB2YWx1ZXMgYXJlIHRtcExbcGRnXVtdKSBzb3J0ZWQgaW4gdGhlIHNhbWUKKwkgKiBvcmRlciBhcyBFRVBST00gKGJlY2F1c2Ugd2UndmUgdXNlZCB0aGUgYmFja21hcGluZykuCisJICogU28gZm9yIFJGNTExMiBpdCdzIGZyb20gaGlnaGVyIHBvd2VyIHRvIGxvd2VyIHBvd2VyCisJICogYW5kIGZvciBSRjI0MTMgaXQncyBmcm9tIGxvd2VyIHBvd2VyIHRvIGhpZ2hlciBwb3dlci4KKwkgKiBGb3IgUkY1MTExIHdlIG9ubHkgaGF2ZSBvbmUgY3VydmUuICovCisKKwkvKiBGaWxsIG1pbiBhbmQgbWF4IHBvd2VyIGxldmVscyBmb3IgdGhpcworCSAqIGNoYW5uZWwgYnkgaW50ZXJwb2xhdGluZyB0aGUgdmFsdWVzIG9uCisJICogc3Vyb3VuZGluZyBjaGFubmVscyB0byBjb21wbGV0ZSB0aGUgZGF0YXNldCAqLworCWFoLT5haF90eHBvd2VyLnR4cF9taW5fcHdyID0gYXRoNWtfZ2V0X2ludGVycG9sYXRlZF92YWx1ZSh0YXJnZXQsCisJCQkJCShzMTYpIHBjaW5mb19MLT5mcmVxLAorCQkJCQkoczE2KSBwY2luZm9fUi0+ZnJlcSwKKwkJCQkJcGNpbmZvX0wtPm1pbl9wd3IsIHBjaW5mb19SLT5taW5fcHdyKTsKKworCWFoLT5haF90eHBvd2VyLnR4cF9tYXhfcHdyID0gYXRoNWtfZ2V0X2ludGVycG9sYXRlZF92YWx1ZSh0YXJnZXQsCisJCQkJCShzMTYpIHBjaW5mb19MLT5mcmVxLAorCQkJCQkoczE2KSBwY2luZm9fUi0+ZnJlcSwKKwkJCQkJcGNpbmZvX0wtPm1heF9wd3IsIHBjaW5mb19SLT5tYXhfcHdyKTsKKworCS8qIFdlIGFyZSByZWFkeSB0byBnbywgZmlsbCBQQ0RBQy9QREFEQworCSAqIHRhYmxlIGFuZCB3cml0ZSBzZXR0aW5ncyBvbiBoYXJkd2FyZSAqLworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQVI1S19QV1JUQUJMRV9MSU5FQVJfUENEQUM6CisJCS8qIEZvciBSRjUxMTIgd2UgY2FuIGhhdmUgb25lIG9yIHR3byBjdXJ2ZXMKKwkJICogYW5kIGVhY2ggY3VydmUgY292ZXJzIGEgY2VydGFpbiBwb3dlciBsdmwKKwkJICogcmFuZ2Ugc28gd2UgbmVlZCB0byBkbyBzb21lIG1vcmUgcHJvY2Vzc2luZyAqLworCQlhdGg1a19jb21iaW5lX2xpbmVhcl9wY2RhY19jdXJ2ZXMoYWgsIHRhYmxlX21pbiwgdGFibGVfbWF4LAorCQkJCQkJZWUtPmVlX3BkX2dhaW5zW2VlX21vZGVdKTsKKworCQkvKiBTZXQgdHhwLm9mZnNldCBzbyB0aGF0IHdlIGNhbgorCQkgKiBtYXRjaCBtYXggcG93ZXIgdmFsdWUgd2l0aCBtYXgKKwkJICogdGFibGUgaW5kZXggKi8KKwkJYWgtPmFoX3R4cG93ZXIudHhwX29mZnNldCA9IDY0IC0gKHRhYmxlX21heFswXSAvIDIpOworCisJCS8qIFdyaXRlIHNldHRpbmdzIG9uIGh3ICovCisJCWF0aDVrX3NldHVwX3BjZGFjX3RhYmxlKGFoKTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1BXUlRBQkxFX1BXUl9UT19QQ0RBQzoKKwkJLyogV2UgYXJlIGRvbmUgZm9yIFJGNTExMSBzaW5jZSBpdCBoYXMgb25seQorCQkgKiBvbmUgY3VydmUsIGp1c3QgZml0IHRoZSBjdXJ2ZSBvbiB0aGUgdGFibGUgKi8KKwkJYXRoNWtfZmlsbF9wd3JfdG9fcGNkYWNfdGFibGUoYWgsIHRhYmxlX21pbiwgdGFibGVfbWF4KTsKKworCQkvKiBObyByYXRlIHBvd2VydGFibGUgYWRqdXN0bWVudCBmb3IgUkY1MTExICovCisJCWFoLT5haF90eHBvd2VyLnR4cF9taW5faWR4ID0gMDsKKwkJYWgtPmFoX3R4cG93ZXIudHhwX29mZnNldCA9IDA7CisKKwkJLyogV3JpdGUgc2V0dGluZ3Mgb24gaHcgKi8KKwkJYXRoNWtfc2V0dXBfcGNkYWNfdGFibGUoYWgpOworCQlicmVhazsKKwljYXNlIEFSNUtfUFdSVEFCTEVfUFdSX1RPX1BEQURDOgorCQkvKiBTZXQgUERBREMgYm91bmRhcmllcyBhbmQgZmlsbAorCQkgKiBmaW5hbCBQREFEQyB0YWJsZSAqLworCQlhdGg1a19jb21iaW5lX3B3cl90b19wZGFkY19jdXJ2ZXMoYWgsIHRhYmxlX21pbiwgdGFibGVfbWF4LAorCQkJCQkJZWUtPmVlX3BkX2dhaW5zW2VlX21vZGVdKTsKKworCQkvKiBXcml0ZSBzZXR0aW5ncyBvbiBodyAqLworCQlhdGg1a19zZXR1cF9wd3JfdG9fcGRhZGNfdGFibGUoYWgsIHBkZywgcGRnX2N1cnZlX3RvX2lkeCk7CisKKwkJLyogU2V0IHR4cC5vZmZzZXQsIG5vdGUgdGhhdCB0YWJsZV9taW4KKwkJICogY2FuIGJlIG5lZ2F0aXZlICovCisJCWFoLT5haF90eHBvd2VyLnR4cF9vZmZzZXQgPSB0YWJsZV9taW5bMF07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBQZXItcmF0ZSB0eCBwb3dlciBzZXR0aW5nCisgKgorICogVGhpcyBpcyB0aGUgY29kZSB0aGF0IHNldHMgdGhlIGRlc2lyZWQgdHggcG93ZXIgKGJlbG93CisgKiBtYXhpbXVtKSBvbiBodyBmb3IgZWFjaCByYXRlICh3ZSBhbHNvIGhhdmUgVFBDIHRoYXQgc2V0cworICogcG93ZXIgcGVyIHBhY2tldCkuIFdlIGRvIHRoYXQgYnkgcHJvdmlkaW5nIGFuIGluZGV4IG9uIHRoZQorICogUENEQUMvUERBREMgdGFibGUgd2Ugc2V0IHVwLgorICovCisKKy8qCisgKiBTZXQgcmF0ZSBwb3dlciB0YWJsZQorICoKKyAqIEZvciBub3cgd2Ugb25seSBsaW1pdCB0eHBvd2VyIGJhc2VkIG9uIG1heGltdW0gdHggcG93ZXIKKyAqIHN1cHBvcnRlZCBieSBodyAod2hhdCdzIGluc2lkZSByYXRlX2luZm8pLiBXZSBuZWVkIHRvIGxpbWl0CisgKiB0aGlzIGV2ZW4gbW9yZSwgYmFzZWQgb24gcmVndWxhdG9yeSBkb21haW4gZXRjLgorICoKKyAqIFJhdGUgcG93ZXIgdGFibGUgY29udGFpbnMgaW5kaWNlcyB0byBQQ0RBQy9QREFEQyB0YWJsZSAoMC41ZEIgc3RlcHMpCisgKiBhbmQgaXMgaW5kZXhlZCBhcyBmb2xsb3dzOgorICogcmF0ZXNbMF0gLSByYXRlc1s3XSAtPiBPRkRNIHJhdGVzCisgKiByYXRlc1s4XSAtIHJhdGVzWzE0XSAtPiBDQ0sgcmF0ZXMKKyAqIHJhdGVzWzE1XSAtPiBYUiByYXRlcyAodGhleSBhbGwgaGF2ZSB0aGUgc2FtZSBwb3dlcikKKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX3NldHVwX3JhdGVfcG93ZXJ0YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgbWF4X3B3ciwKKwkJCXN0cnVjdCBhdGg1a19yYXRlX3BjYWxfaW5mbyAqcmF0ZV9pbmZvLAorCQkJdTggZWVfbW9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MTYgKnJhdGVzOworCisJLyogbWF4X3B3ciBpcyBwb3dlciBsZXZlbCB3ZSBnb3QgZnJvbSBkcml2ZXIvdXNlciBpbiAwLjVkQgorCSAqIHVuaXRzLCBzd2l0Y2ggdG8gMC4yNWRCIHVuaXRzIHNvIHdlIGNhbiBjb21wYXJlICovCisJbWF4X3B3ciAqPSAyOworCW1heF9wd3IgPSBtaW4obWF4X3B3ciwgKHUxNikgYWgtPmFoX3R4cG93ZXIudHhwX21heF9wd3IpIC8gMjsKKworCS8qIGFwcGx5IHJhdGUgbGltaXRzICovCisJcmF0ZXMgPSBhaC0+YWhfdHhwb3dlci50eHBfcmF0ZXNfcG93ZXJfdGFibGU7CisKKwkvKiBPRkRNIHJhdGVzIDYgdG8gMjRNYi9zICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJcmF0ZXNbaV0gPSBtaW4obWF4X3B3ciwgcmF0ZV9pbmZvLT50YXJnZXRfcG93ZXJfNnRvMjQpOworCisJLyogUmVzdCBPRkRNIHJhdGVzICovCisJcmF0ZXNbNV0gPSBtaW4ocmF0ZXNbMF0sIHJhdGVfaW5mby0+dGFyZ2V0X3Bvd2VyXzM2KTsKKwlyYXRlc1s2XSA9IG1pbihyYXRlc1swXSwgcmF0ZV9pbmZvLT50YXJnZXRfcG93ZXJfNDgpOworCXJhdGVzWzddID0gbWluKHJhdGVzWzBdLCByYXRlX2luZm8tPnRhcmdldF9wb3dlcl81NCk7CisKKwkvKiBDQ0sgcmF0ZXMgKi8KKwkvKiAxTCAqLworCXJhdGVzWzhdID0gbWluKHJhdGVzWzBdLCByYXRlX2luZm8tPnRhcmdldF9wb3dlcl82dG8yNCk7CisJLyogMkwgKi8KKwlyYXRlc1s5XSA9IG1pbihyYXRlc1swXSwgcmF0ZV9pbmZvLT50YXJnZXRfcG93ZXJfMzYpOworCS8qIDJTICovCisJcmF0ZXNbMTBdID0gbWluKHJhdGVzWzBdLCByYXRlX2luZm8tPnRhcmdldF9wb3dlcl8zNik7CisJLyogNUwgKi8KKwlyYXRlc1sxMV0gPSBtaW4ocmF0ZXNbMF0sIHJhdGVfaW5mby0+dGFyZ2V0X3Bvd2VyXzQ4KTsKKwkvKiA1UyAqLworCXJhdGVzWzEyXSA9IG1pbihyYXRlc1swXSwgcmF0ZV9pbmZvLT50YXJnZXRfcG93ZXJfNDgpOworCS8qIDExTCAqLworCXJhdGVzWzEzXSA9IG1pbihyYXRlc1swXSwgcmF0ZV9pbmZvLT50YXJnZXRfcG93ZXJfNTQpOworCS8qIDExUyAqLworCXJhdGVzWzE0XSA9IG1pbihyYXRlc1swXSwgcmF0ZV9pbmZvLT50YXJnZXRfcG93ZXJfNTQpOworCisJLyogWFIgcmF0ZXMgKi8KKwlyYXRlc1sxNV0gPSBtaW4ocmF0ZXNbMF0sIHJhdGVfaW5mby0+dGFyZ2V0X3Bvd2VyXzZ0bzI0KTsKKworCS8qIENDSyByYXRlcyBoYXZlIGRpZmZlcmVudCBwZWFrIHRvIGF2ZXJhZ2UgcmF0aW8KKwkgKiBzbyB3ZSBoYXZlIHRvIHR3ZWFrIHRoZWlyIHBvd2VyIHNvIHRoYXQgZ2FpbmYKKwkgKiBjb3JyZWN0aW9uIHdvcmtzIG9rLiBGb3IgdGhpcyB3ZSB1c2UgT0ZETSB0bworCSAqIENDSyBkZWx0YSBmcm9tIGVlcHJvbSAqLworCWlmICgoZWVfbW9kZSA9PSBBUjVLX0VFUFJPTV9NT0RFXzExRykgJiYKKwkoYWgtPmFoX3BoeV9yZXZpc2lvbiA8IEFSNUtfU1JFVl9QSFlfNTIxMkEpKQorCQlmb3IgKGkgPSA4OyBpIDw9IDE1OyBpKyspCisJCQlyYXRlc1tpXSAtPSBhaC0+YWhfdHhwb3dlci50eHBfY2NrX29mZG1fZ2FpbmZfZGVsdGE7CisKKwlhaC0+YWhfdHhwb3dlci50eHBfbWluX3B3ciA9IHJhdGVzWzddOworCWFoLT5haF90eHBvd2VyLnR4cF9tYXhfcHdyID0gcmF0ZXNbMF07CisJYWgtPmFoX3R4cG93ZXIudHhwX29mZG0gPSByYXRlc1s3XTsKK30KKworCisvKgorICogU2V0IHRyYW5zbWl0aW9uIHBvd2VyCisgKi8KK2ludAorYXRoNWtfaHdfdHhwb3dlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJdTggZWVfbW9kZSwgdTggdHhwb3dlcikKK3sKKwlzdHJ1Y3QgYXRoNWtfcmF0ZV9wY2FsX2luZm8gcmF0ZV9pbmZvOworCXU4IHR5cGU7CisJaW50IHJldDsKKworCWlmICh0eHBvd2VyID4gQVI1S19UVU5FX01BWF9UWFBPV0VSKSB7CisJCURCRygiYXRoNWs6IGludmFsaWQgdHggcG93ZXIgJWRcbiIsIHR4cG93ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHR4cG93ZXIgPT0gMCkKKwkJdHhwb3dlciA9IEFSNUtfVFVORV9ERUZBVUxUX1RYUE9XRVI7CisKKwkvKiBSZXNldCBUWCBwb3dlciB2YWx1ZXMgKi8KKwltZW1zZXQoJmFoLT5haF90eHBvd2VyLCAwLCBzaXplb2YoYWgtPmFoX3R4cG93ZXIpKTsKKwlhaC0+YWhfdHhwb3dlci50eHBfdHBjID0gQVI1S19UVU5FX1RQQ19UWFBPV0VSOworCWFoLT5haF90eHBvd2VyLnR4cF9taW5fcHdyID0gMDsKKwlhaC0+YWhfdHhwb3dlci50eHBfbWF4X3B3ciA9IEFSNUtfVFVORV9NQVhfVFhQT1dFUjsKKworCS8qIEluaXRpYWxpemUgVFggcG93ZXIgdGFibGUgKi8KKwlzd2l0Y2ggKGFoLT5haF9yYWRpbykgeworCWNhc2UgQVI1S19SRjUxMTE6CisJCXR5cGUgPSBBUjVLX1BXUlRBQkxFX1BXUl9UT19QQ0RBQzsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1JGNTExMjoKKwkJdHlwZSA9IEFSNUtfUFdSVEFCTEVfTElORUFSX1BDREFDOworCQlicmVhazsKKwljYXNlIEFSNUtfUkYyNDEzOgorCWNhc2UgQVI1S19SRjU0MTM6CisJY2FzZSBBUjVLX1JGMjMxNjoKKwljYXNlIEFSNUtfUkYyMzE3OgorCWNhc2UgQVI1S19SRjI0MjU6CisJCXR5cGUgPSBBUjVLX1BXUlRBQkxFX1BXUl9UT19QREFEQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRklYTUU6IE9ubHkgb24gY2hhbm5lbC9tb2RlIGNoYW5nZSAqLworCXJldCA9IGF0aDVrX3NldHVwX2NoYW5uZWxfcG93ZXJ0YWJsZShhaCwgY2hhbm5lbCwgZWVfbW9kZSwgdHlwZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIExpbWl0IG1heCBwb3dlciBpZiB3ZSBoYXZlIGEgQ1RMIGF2YWlsYWJsZSAqLworCWF0aDVrX2dldF9tYXhfY3RsX3Bvd2VyKGFoLCBjaGFubmVsKTsKKworCS8qIEZJWE1FOiBUeCBwb3dlciBsaW1pdCBmb3IgdGhpcyByZWdkb21haW4KKwkgKiBYWFg6IE1hYzgwMjExL0NSREEgd2lsbCBkbyB0aGF0IGFueXdheSA/ICovCisKKwkvKiBGSVhNRTogQW50ZW5uYSByZWR1Y3Rpb24gc3R1ZmYgKi8KKworCS8qIEZJWE1FOiBMaW1pdCBwb3dlciBvbiB0dXJibyBtb2RlcyAqLworCisJLyogRklYTUU6IFRQQyBzY2FsZSByZWR1Y3Rpb24gKi8KKworCS8qIEdldCBzdXJvdW5kaW5nIGNoYW5uZWxzIGZvciBwZXItcmF0ZSBwb3dlciB0YWJsZQorCSAqIGNhbGlicmF0aW9uICovCisJYXRoNWtfZ2V0X3JhdGVfcGNhbF9kYXRhKGFoLCBjaGFubmVsLCAmcmF0ZV9pbmZvKTsKKworCS8qIFNldHVwIHJhdGUgcG93ZXIgdGFibGUgKi8KKwlhdGg1a19zZXR1cF9yYXRlX3Bvd2VydGFibGUoYWgsIHR4cG93ZXIsICZyYXRlX2luZm8sIGVlX21vZGUpOworCisJLyogV3JpdGUgcmF0ZSBwb3dlciB0YWJsZSBvbiBodyAqLworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19UWFBPV0VSX09GRE0oMywgMjQpIHwKKwkJQVI1S19UWFBPV0VSX09GRE0oMiwgMTYpIHwgQVI1S19UWFBPV0VSX09GRE0oMSwgOCkgfAorCQlBUjVLX1RYUE9XRVJfT0ZETSgwLCAwKSwgQVI1S19QSFlfVFhQT1dFUl9SQVRFMSk7CisKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfVFhQT1dFUl9PRkRNKDcsIDI0KSB8CisJCUFSNUtfVFhQT1dFUl9PRkRNKDYsIDE2KSB8IEFSNUtfVFhQT1dFUl9PRkRNKDUsIDgpIHwKKwkJQVI1S19UWFBPV0VSX09GRE0oNCwgMCksIEFSNUtfUEhZX1RYUE9XRVJfUkFURTIpOworCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1RYUE9XRVJfQ0NLKDEwLCAyNCkgfAorCQlBUjVLX1RYUE9XRVJfQ0NLKDksIDE2KSB8IEFSNUtfVFhQT1dFUl9DQ0soMTUsIDgpIHwKKwkJQVI1S19UWFBPV0VSX0NDSyg4LCAwKSwgQVI1S19QSFlfVFhQT1dFUl9SQVRFMyk7CisKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfVFhQT1dFUl9DQ0soMTQsIDI0KSB8CisJCUFSNUtfVFhQT1dFUl9DQ0soMTMsIDE2KSB8IEFSNUtfVFhQT1dFUl9DQ0soMTIsIDgpIHwKKwkJQVI1S19UWFBPV0VSX0NDSygxMSwgMCksIEFSNUtfUEhZX1RYUE9XRVJfUkFURTQpOworCisJLyogRklYTUU6IFRQQyBzdXBwb3J0ICovCisJaWYgKGFoLT5haF90eHBvd2VyLnR4cF90cGMpIHsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9UWFBPV0VSX1JBVEVfTUFYX1RQQ19FTkFCTEUgfAorCQkJQVI1S19UVU5FX01BWF9UWFBPV0VSLCBBUjVLX1BIWV9UWFBPV0VSX1JBVEVfTUFYKTsKKworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCisJCQlBUjVLX1JFR19NUyhBUjVLX1RVTkVfTUFYX1RYUE9XRVIsIEFSNUtfVFBDX0FDSykgfAorCQkJQVI1S19SRUdfTVMoQVI1S19UVU5FX01BWF9UWFBPV0VSLCBBUjVLX1RQQ19DVFMpIHwKKwkJCUFSNUtfUkVHX01TKEFSNUtfVFVORV9NQVhfVFhQT1dFUiwgQVI1S19UUENfQ0hJUlApLAorCQkJQVI1S19UUEMpOworCX0gZWxzZSB7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfVFhQT1dFUl9SQVRFX01BWCB8CisJCQlBUjVLX1RVTkVfTUFYX1RYUE9XRVIsIEFSNUtfUEhZX1RYUE9XRVJfUkFURV9NQVgpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggbW9kZSwgdTggdHhwb3dlcikKK3sKKwlzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGFoLT5haF9jdXJyZW50X2NoYW5uZWw7CisKKwlEQkcyKCJhdGg1azogY2hhbmdpbmcgdHhwb3dlciB0byAlZFxuIiwgdHhwb3dlcik7CisKKwlyZXR1cm4gYXRoNWtfaHdfdHhwb3dlcihhaCwgY2hhbm5lbCwgbW9kZSwgdHhwb3dlcik7Cit9CisKKyN1bmRlZiBfQVRINUtfUEhZCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19xY3UuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrX3FjdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NzRiODUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19xY3UuYwpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqCisgKiBMaWdodGx5IG1vZGlmaWVkIGZvciBnUFhFLCBKdWx5IDIwMDksIGJ5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBNSVQgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorUXVldWUgQ29udHJvbCBVbml0LCBERlMgQ29udHJvbCBVbml0IEZ1bmN0aW9ucworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYXRoNWsuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJiYXNlLmgiCisKKy8qCisgKiBTZXQgcHJvcGVydGllcyBmb3IgYSB0cmFuc21pdCBxdWV1ZQorICovCitpbnQgYXRoNWtfaHdfc2V0X3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQljb25zdCBzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnF1ZXVlX2luZm8pCit7CisJaWYgKGFoLT5haF90eHEudHFpX3R5cGUgPT0gQVI1S19UWF9RVUVVRV9JTkFDVElWRSkKKwkJcmV0dXJuIC1FSU87CisKKwltZW1jcHkoJmFoLT5haF90eHEsIHF1ZXVlX2luZm8sIHNpemVvZihzdHJ1Y3QgYXRoNWtfdHhxX2luZm8pKTsKKworCS8qWFhYOiBJcyB0aGlzIHN1cHBvcnRlZCBvbiA1MjEwID8qLworCWlmICgocXVldWVfaW5mby0+dHFpX3R5cGUgPT0gQVI1S19UWF9RVUVVRV9EQVRBICYmCisJCQkoKHF1ZXVlX2luZm8tPnRxaV9zdWJ0eXBlID09IEFSNUtfV01FX0FDX1ZJKSB8fAorCQkJKHF1ZXVlX2luZm8tPnRxaV9zdWJ0eXBlID09IEFSNUtfV01FX0FDX1ZPKSkpIHx8CisJCQlxdWV1ZV9pbmZvLT50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX1VBUFNEKQorCQlhaC0+YWhfdHhxLnRxaV9mbGFncyB8PSBBUjVLX1RYUV9GTEFHX1BPU1RfRlJfQktPRkZfRElTOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgdHJhbnNtaXQgcXVldWUKKyAqLworaW50IGF0aDVrX2h3X3NldHVwX3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfdHhfcXVldWUgcXVldWVfdHlwZSwKKwkJc3RydWN0IGF0aDVrX3R4cV9pbmZvICpxdWV1ZV9pbmZvKQoreworCXVuc2lnbmVkIGludCBxdWV1ZTsKKwlpbnQgcmV0OworCisJLyogV2Ugb25seSB1c2Ugb25lIHF1ZXVlICovCisJcXVldWUgPSAwOworCisJLyoKKwkgKiBTZXR1cCBpbnRlcm5hbCBxdWV1ZSBzdHJ1Y3R1cmUKKwkgKi8KKwltZW1zZXQoJmFoLT5haF90eHEsIDAsIHNpemVvZihzdHJ1Y3QgYXRoNWtfdHhxX2luZm8pKTsKKwlhaC0+YWhfdHhxLnRxaV90eXBlID0gcXVldWVfdHlwZTsKKworCWlmIChxdWV1ZV9pbmZvICE9IE5VTEwpIHsKKwkJcXVldWVfaW5mby0+dHFpX3R5cGUgPSBxdWV1ZV90eXBlOworCQlyZXQgPSBhdGg1a19od19zZXRfdHhfcXVldWVwcm9wcyhhaCwgcXVldWVfaW5mbyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogV2UgdXNlIGFoX3R4cV9zdGF0dXMgdG8gaG9sZCBhIHRlbXAgdmFsdWUgZm9yCisJICogdGhlIFNlY29uZGFyeSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcnMgb24gNTIxMSsKKwkgKiBjaGVjayBvdXQgYXRoNWtfaHdfcmVzZXRfdHhfcXVldWUKKwkgKi8KKwlBUjVLX1FfRU5BQkxFX0JJVFMoYWgtPmFoX3R4cV9zdGF0dXMsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgYSB0cmFuc21pdCBxdWV1ZSBpbmFjdGl2ZQorICovCit2b2lkIGF0aDVrX2h3X3JlbGVhc2VfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwkvKiBUaGlzIHF1ZXVlIHdpbGwgYmUgc2tpcHBlZCBpbiBmdXJ0aGVyIG9wZXJhdGlvbnMgKi8KKwlhaC0+YWhfdHhxLnRxaV90eXBlID0gQVI1S19UWF9RVUVVRV9JTkFDVElWRTsKKwkvKkZvciBTSU1SIHNldHVwKi8KKwlBUjVLX1FfRElTQUJMRV9CSVRTKGFoLT5haF90eHFfc3RhdHVzLCAwKTsKK30KKworLyoKKyAqIFNldCBERlMgcHJvcGVydGllcyBmb3IgYSB0cmFuc21pdCBxdWV1ZSBvbiBEQ1UKKyAqLworaW50IGF0aDVrX2h3X3Jlc2V0X3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJdTMyIGN3X21pbiwgY3dfbWF4LCByZXRyeV9sZywgcmV0cnlfc2g7CisJc3RydWN0IGF0aDVrX3R4cV9pbmZvICp0cSA9ICZhaC0+YWhfdHhxOworCWNvbnN0IGludCBxdWV1ZSA9IDA7CisKKwl0cSA9ICZhaC0+YWhfdHhxOworCisJaWYgKHRxLT50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFKQorCQlyZXR1cm4gMDsKKworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQkvKiBPbmx5IGhhbmRsZSBkYXRhIHF1ZXVlcywgb3RoZXJzIHdpbGwgYmUgaWdub3JlZCAqLworCQlpZiAodHEtPnRxaV90eXBlICE9IEFSNUtfVFhfUVVFVUVfREFUQSkKKwkJCXJldHVybiAwOworCisJCS8qIFNldCBTbG90IHRpbWUgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfdHVyYm8gPworCQkJQVI1S19JTklUX1NMT1RfVElNRV9UVVJCTyA6IEFSNUtfSU5JVF9TTE9UX1RJTUUsCisJCQlBUjVLX1NMT1RfVElNRSk7CisJCS8qIFNldCBBQ0tfQ1RTIHRpbWVvdXQgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfdHVyYm8gPworCQkJQVI1S19JTklUX0FDS19DVFNfVElNRU9VVF9UVVJCTyA6CisJCQlBUjVLX0lOSVRfQUNLX0NUU19USU1FT1VULCBBUjVLX1NMT1RfVElNRSk7CisJCS8qIFNldCBUcmFuc21pdCBMYXRlbmN5ICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX3R1cmJvID8KKwkJCUFSNUtfSU5JVF9UUkFOU01JVF9MQVRFTkNZX1RVUkJPIDoKKwkJCUFSNUtfSU5JVF9UUkFOU01JVF9MQVRFTkNZLCBBUjVLX1VTRUNfNTIxMCk7CisKKwkJLyogU2V0IElGUzAgKi8KKwkJaWYgKGFoLT5haF90dXJibykgeworCQkJIGF0aDVrX2h3X3JlZ193cml0ZShhaCwgKChBUjVLX0lOSVRfU0lGU19UVVJCTyArCisJCQkJKGFoLT5haF9haWZzICsgdHEtPnRxaV9haWZzKSAqCisJCQkJQVI1S19JTklUX1NMT1RfVElNRV9UVVJCTykgPDwKKwkJCQlBUjVLX0lGUzBfRElGU19TKSB8IEFSNUtfSU5JVF9TSUZTX1RVUkJPLAorCQkJCUFSNUtfSUZTMCk7CisJCX0gZWxzZSB7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsICgoQVI1S19JTklUX1NJRlMgKworCQkJCShhaC0+YWhfYWlmcyArIHRxLT50cWlfYWlmcykgKgorCQkJCUFSNUtfSU5JVF9TTE9UX1RJTUUpIDw8IEFSNUtfSUZTMF9ESUZTX1MpIHwKKwkJCQlBUjVLX0lOSVRfU0lGUywgQVI1S19JRlMwKTsKKwkJfQorCisJCS8qIFNldCBJRlMxICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX3R1cmJvID8KKwkJCUFSNUtfSU5JVF9QUk9UT19USU1FX0NOVFJMX1RVUkJPIDoKKwkJCUFSNUtfSU5JVF9QUk9UT19USU1FX0NOVFJMLCBBUjVLX0lGUzEpOworCQkvKiBTZXQgQVI1S19QSFlfU0VUVExJTkcgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfdHVyYm8gPworCQkJKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9TRVRUTElORykgJiB+MHg3RikKKwkJCXwgMHgzOCA6CisJCQkoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1NFVFRMSU5HKSAmIH4weDdGKQorCQkJfCAweDFDLAorCQkJQVI1S19QSFlfU0VUVExJTkcpOworCQkvKiBTZXQgRnJhbWUgQ29udHJvbCBSZWdpc3RlciAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF90dXJibyA/CisJCQkoQVI1S19QSFlfRlJBTUVfQ1RMX0lOSSB8IEFSNUtfUEhZX1RVUkJPX01PREUgfAorCQkJQVI1S19QSFlfVFVSQk9fU0hPUlQgfCAweDIwMjApIDoKKwkJCShBUjVLX1BIWV9GUkFNRV9DVExfSU5JIHwgMHgxMDIwKSwKKwkJCUFSNUtfUEhZX0ZSQU1FX0NUTF81MjEwKTsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSBjd21pbi9tYXggYnkgY2hhbm5lbCBtb2RlCisJICovCisJY3dfbWluID0gYWgtPmFoX2N3X21pbiA9IEFSNUtfVFVORV9DV01JTjsKKwljd19tYXggPSBhaC0+YWhfY3dfbWF4ID0gQVI1S19UVU5FX0NXTUFYOworCWFoLT5haF9haWZzID0gQVI1S19UVU5FX0FJRlM7CisJLypYUiBpcyBvbmx5IHN1cHBvcnRlZCBvbiA1MjEyKi8KKwlpZiAoSVNfQ0hBTl9YUihhaC0+YWhfY3VycmVudF9jaGFubmVsKSAmJgorCQkJYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJY3dfbWluID0gYWgtPmFoX2N3X21pbiA9IEFSNUtfVFVORV9DV01JTl9YUjsKKwkJY3dfbWF4ID0gYWgtPmFoX2N3X21heCA9IEFSNUtfVFVORV9DV01BWF9YUjsKKwkJYWgtPmFoX2FpZnMgPSBBUjVLX1RVTkVfQUlGU19YUjsKKwkvKkIgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIG9uIDUyMTAqLworCX0gZWxzZSBpZiAoSVNfQ0hBTl9CKGFoLT5haF9jdXJyZW50X2NoYW5uZWwpICYmCisJCQlhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCQljd19taW4gPSBhaC0+YWhfY3dfbWluID0gQVI1S19UVU5FX0NXTUlOXzExQjsKKwkJY3dfbWF4ID0gYWgtPmFoX2N3X21heCA9IEFSNUtfVFVORV9DV01BWF8xMUI7CisJCWFoLT5haF9haWZzID0gQVI1S19UVU5FX0FJRlNfMTFCOworCX0KKworCWN3X21pbiA9IDE7CisJd2hpbGUgKGN3X21pbiA8IGFoLT5haF9jd19taW4pCisJCWN3X21pbiA9IChjd19taW4gPDwgMSkgfCAxOworCisJY3dfbWluID0gdHEtPnRxaV9jd19taW4gPCAwID8gKGN3X21pbiA+PiAoLXRxLT50cWlfY3dfbWluKSkgOgorCQkoKGN3X21pbiA8PCB0cS0+dHFpX2N3X21pbikgKyAoMSA8PCB0cS0+dHFpX2N3X21pbikgLSAxKTsKKwljd19tYXggPSB0cS0+dHFpX2N3X21heCA8IDAgPyAoY3dfbWF4ID4+ICgtdHEtPnRxaV9jd19tYXgpKSA6CisJCSgoY3dfbWF4IDw8IHRxLT50cWlfY3dfbWF4KSArICgxIDw8IHRxLT50cWlfY3dfbWF4KSAtIDEpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgYW5kIHNldCByZXRyeSBsaW1pdHMKKwkgKi8KKwlpZiAoYWgtPmFoX3NvZnR3YXJlX3JldHJ5KSB7CisJCS8qIFhYWCBOZWVkIHRvIHRlc3QgdGhpcyAqLworCQlyZXRyeV9sZyA9IGFoLT5haF9saW1pdF90eF9yZXRyaWVzOworCQlyZXRyeV9zaCA9IHJldHJ5X2xnID0gcmV0cnlfbGcgPiBBUjVLX0RDVV9SRVRSWV9MTVRfU0hfUkVUUlkgPworCQkJQVI1S19EQ1VfUkVUUllfTE1UX1NIX1JFVFJZIDogcmV0cnlfbGc7CisJfSBlbHNlIHsKKwkJcmV0cnlfbGcgPSBBUjVLX0lOSVRfTEdfUkVUUlk7CisJCXJldHJ5X3NoID0gQVI1S19JTklUX1NIX1JFVFJZOworCX0KKworCS8qTm8gUUNVL0RDVSBbNTIxMF0qLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCisJCQkoY3dfbWluIDw8IEFSNUtfTk9EQ1VfUkVUUllfTE1UX0NXX01JTl9TKQorCQkJfCBBUjVLX1JFR19TTShBUjVLX0lOSVRfU0xHX1JFVFJZLAorCQkJCUFSNUtfTk9EQ1VfUkVUUllfTE1UX1NMR19SRVRSWSkKKwkJCXwgQVI1S19SRUdfU00oQVI1S19JTklUX1NTSF9SRVRSWSwKKwkJCQlBUjVLX05PRENVX1JFVFJZX0xNVF9TU0hfUkVUUlkpCisJCQl8IEFSNUtfUkVHX1NNKHJldHJ5X2xnLCBBUjVLX05PRENVX1JFVFJZX0xNVF9MR19SRVRSWSkKKwkJCXwgQVI1S19SRUdfU00ocmV0cnlfc2gsIEFSNUtfTk9EQ1VfUkVUUllfTE1UX1NIX1JFVFJZKSwKKwkJCUFSNUtfTk9EQ1VfUkVUUllfTE1UKTsKKwl9IGVsc2UgeworCQkvKlFDVS9EQ1UgWzUyMTErXSovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKKwkJCUFSNUtfUkVHX1NNKEFSNUtfSU5JVF9TTEdfUkVUUlksCisJCQkJQVI1S19EQ1VfUkVUUllfTE1UX1NMR19SRVRSWSkgfAorCQkJQVI1S19SRUdfU00oQVI1S19JTklUX1NTSF9SRVRSWSwKKwkJCQlBUjVLX0RDVV9SRVRSWV9MTVRfU1NIX1JFVFJZKSB8CisJCQlBUjVLX1JFR19TTShyZXRyeV9sZywgQVI1S19EQ1VfUkVUUllfTE1UX0xHX1JFVFJZKSB8CisJCQlBUjVLX1JFR19TTShyZXRyeV9zaCwgQVI1S19EQ1VfUkVUUllfTE1UX1NIX1JFVFJZKSwKKwkJCUFSNUtfUVVFVUVfREZTX1JFVFJZX0xJTUlUKHF1ZXVlKSk7CisKKwkvKj09PVJlc3QgaXMgYWxzbyBmb3IgUUNVL0RDVSBvbmx5IFs1MjExK109PT0qLworCisJCS8qCisJCSAqIFNldCBpbml0aWFsIGNvbnRlbnQgd2luZG93IChjd19taW4vY3dfbWF4KQorCQkgKiBhbmQgYXJiaXRyYXRlZCBpbnRlcmZyYW1lIHNwYWNlIChhaWZzKS4uLgorCQkgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJQVI1S19SRUdfU00oY3dfbWluLCBBUjVLX0RDVV9MQ0xfSUZTX0NXX01JTikgfAorCQkJQVI1S19SRUdfU00oY3dfbWF4LCBBUjVLX0RDVV9MQ0xfSUZTX0NXX01BWCkgfAorCQkJQVI1S19SRUdfU00oYWgtPmFoX2FpZnMgKyB0cS0+dHFpX2FpZnMsCisJCQkJQVI1S19EQ1VfTENMX0lGU19BSUZTKSwKKwkJCUFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUyhxdWV1ZSkpOworCisJCS8qCisJCSAqIFNldCBtaXNjIHJlZ2lzdGVycworCQkgKi8KKwkJLyogRW5hYmxlIERDVSBlYXJseSB0ZXJtaW5hdGlvbiBmb3IgdGhpcyBxdWV1ZSAqLworCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19RVUVVRV9NSVNDKHF1ZXVlKSwKKwkJCQkJQVI1S19RQ1VfTUlTQ19EQ1VfRUFSTFkpOworCisJCS8qIEVuYWJsZSBEQ1UgdG8gd2FpdCBmb3IgbmV4dCBmcmFnbWVudCBmcm9tIFFDVSAqLworCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19RVUVVRV9ERlNfTUlTQyhxdWV1ZSksCisJCQkJCUFSNUtfRENVX01JU0NfRlJBR19XQUlUKTsKKworCQkvKiBPbiBNYXVpIGFuZCBTcGlyaXQgdXNlIHRoZSBnbG9iYWwgc2VxbnVtIG9uIERDVSAqLworCQlpZiAoYWgtPmFoX21hY192ZXJzaW9uIDwgQVI1S19TUkVWX0FSNTIxMSkKKwkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1FVRVVFX0RGU19NSVNDKHF1ZXVlKSwKKwkJCQkJCUFSNUtfRENVX01JU0NfU0VRTlVNX0NUTCk7CisKKwkJaWYgKHRxLT50cWlfY2JyX3BlcmlvZCkgeworCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTSh0cS0+dHFpX2Nicl9wZXJpb2QsCisJCQkJQVI1S19RQ1VfQ0JSQ0ZHX0lOVFZBTCkgfAorCQkJCUFSNUtfUkVHX1NNKHRxLT50cWlfY2JyX292ZXJmbG93X2xpbWl0LAorCQkJCUFSNUtfUUNVX0NCUkNGR19PUk5fVEhSRVMpLAorCQkJCUFSNUtfUVVFVUVfQ0JSQ0ZHKHF1ZXVlKSk7CisJCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19RVUVVRV9NSVNDKHF1ZXVlKSwKKwkJCQlBUjVLX1FDVV9NSVNDX0ZSU0hFRF9DQlIpOworCQkJaWYgKHRxLT50cWlfY2JyX292ZXJmbG93X2xpbWl0KQorCQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLAorCQkJCQlBUjVLX1FVRVVFX01JU0MocXVldWUpLAorCQkJCQlBUjVLX1FDVV9NSVNDX0NCUl9USFJFU19FTkFCTEUpOworCQl9CisKKwkJaWYgKHRxLT50cWlfcmVhZHlfdGltZSAmJgorCQkodHEtPnRxaV90eXBlICE9IEFSNUtfVFhfUVVFVUVfSURfQ0FCKSkKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19SRUdfU00odHEtPnRxaV9yZWFkeV90aW1lLAorCQkJCUFSNUtfUUNVX1JEWVRJTUVDRkdfSU5UVkFMKSB8CisJCQkJQVI1S19RQ1VfUkRZVElNRUNGR19FTkFCTEUsCisJCQkJQVI1S19RVUVVRV9SRFlUSU1FQ0ZHKHF1ZXVlKSk7CisKKwkJaWYgKHRxLT50cWlfYnVyc3RfdGltZSkgeworCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTSh0cS0+dHFpX2J1cnN0X3RpbWUsCisJCQkJQVI1S19EQ1VfQ0hBTl9USU1FX0RVUikgfAorCQkJCUFSNUtfRENVX0NIQU5fVElNRV9FTkFCTEUsCisJCQkJQVI1S19RVUVVRV9ERlNfQ0hBTk5FTF9USU1FKHF1ZXVlKSk7CisKKwkJCWlmICh0cS0+dHFpX2ZsYWdzCisJCQkmIEFSNUtfVFhRX0ZMQUdfUkRZVElNRV9FWFBfUE9MSUNZX0VOQUJMRSkKKwkJCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwKKwkJCQkJQVI1S19RVUVVRV9NSVNDKHF1ZXVlKSwKKwkJCQkJQVI1S19RQ1VfTUlTQ19SRFlfVkVPTF9QT0xJQ1kpOworCQl9CisKKwkJaWYgKHRxLT50cWlfZmxhZ3MgJiBBUjVLX1RYUV9GTEFHX0JBQ0tPRkZfRElTQUJMRSkKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19EQ1VfTUlTQ19QT1NUX0ZSX0JLT0ZGX0RJUywKKwkJCQlBUjVLX1FVRVVFX0RGU19NSVNDKHF1ZXVlKSk7CisKKwkJaWYgKHRxLT50cWlfZmxhZ3MgJiBBUjVLX1RYUV9GTEFHX0ZSQUdfQlVSU1RfQkFDS09GRl9FTkFCTEUpCisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfRENVX01JU0NfQkFDS09GRl9GUkFHLAorCQkJCUFSNUtfUVVFVUVfREZTX01JU0MocXVldWUpKTsKKworCQkvKiBUT0RPOiBIYW5kbGUgZnJhbWUgY29tcHJlc3Npb24gKi8KKworCQkvKgorCQkgKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgdGhpcyB0eCBxdWV1ZQorCQkgKiBpbiB0aGUgc2Vjb25kYXJ5IGludGVycnVwdCBtYXNrIHJlZ2lzdGVycworCQkgKi8KKwkJaWYgKHRxLT50cWlfZmxhZ3MgJiBBUjVLX1RYUV9GTEFHX1RYT0tJTlRfRU5BQkxFKQorCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3R4b2ssIHF1ZXVlKTsKKworCQlpZiAodHEtPnRxaV9mbGFncyAmIEFSNUtfVFhRX0ZMQUdfVFhFUlJJTlRfRU5BQkxFKQorCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3R4ZXJyLCBxdWV1ZSk7CisKKwkJaWYgKHRxLT50cWlfZmxhZ3MgJiBBUjVLX1RYUV9GTEFHX1RYVVJOSU5UX0VOQUJMRSkKKwkJCUFSNUtfUV9FTkFCTEVfQklUUyhhaC0+YWhfdHhxX2ltcl90eHVybiwgcXVldWUpOworCisJCWlmICh0cS0+dHFpX2ZsYWdzICYgQVI1S19UWFFfRkxBR19UWERFU0NJTlRfRU5BQkxFKQorCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3R4ZGVzYywgcXVldWUpOworCisJCWlmICh0cS0+dHFpX2ZsYWdzICYgQVI1S19UWFFfRkxBR19UWEVPTElOVF9FTkFCTEUpCisJCQlBUjVLX1FfRU5BQkxFX0JJVFMoYWgtPmFoX3R4cV9pbXJfdHhlb2wsIHF1ZXVlKTsKKworCQlpZiAodHEtPnRxaV9mbGFncyAmIEFSNUtfVFhRX0ZMQUdfQ0JST1JOSU5UX0VOQUJMRSkKKwkJCUFSNUtfUV9FTkFCTEVfQklUUyhhaC0+YWhfdHhxX2ltcl9jYnJvcm4sIHF1ZXVlKTsKKworCQlpZiAodHEtPnRxaV9mbGFncyAmIEFSNUtfVFhRX0ZMQUdfQ0JSVVJOSU5UX0VOQUJMRSkKKwkJCUFSNUtfUV9FTkFCTEVfQklUUyhhaC0+YWhfdHhxX2ltcl9jYnJ1cm4sIHF1ZXVlKTsKKworCQlpZiAodHEtPnRxaV9mbGFncyAmIEFSNUtfVFhRX0ZMQUdfUVRSSUdJTlRfRU5BQkxFKQorCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3F0cmlnLCBxdWV1ZSk7CisKKwkJaWYgKHRxLT50cWlfZmxhZ3MgJiBBUjVLX1RYUV9GTEFHX1RYTk9GUk1JTlRfRU5BQkxFKQorCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX25vZnJtLCBxdWV1ZSk7CisKKwkJLyogVXBkYXRlIHNlY29uZGFyeSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcnMgKi8KKworCQkvKiBGaWx0ZXIgb3V0IGluYWN0aXZlIHF1ZXVlcyAqLworCQlhaC0+YWhfdHhxX2ltcl90eG9rICY9IGFoLT5haF90eHFfc3RhdHVzOworCQlhaC0+YWhfdHhxX2ltcl90eGVyciAmPSBhaC0+YWhfdHhxX3N0YXR1czsKKwkJYWgtPmFoX3R4cV9pbXJfdHh1cm4gJj0gYWgtPmFoX3R4cV9zdGF0dXM7CisJCWFoLT5haF90eHFfaW1yX3R4ZGVzYyAmPSBhaC0+YWhfdHhxX3N0YXR1czsKKwkJYWgtPmFoX3R4cV9pbXJfdHhlb2wgJj0gYWgtPmFoX3R4cV9zdGF0dXM7CisJCWFoLT5haF90eHFfaW1yX2Nicm9ybiAmPSBhaC0+YWhfdHhxX3N0YXR1czsKKwkJYWgtPmFoX3R4cV9pbXJfY2JydXJuICY9IGFoLT5haF90eHFfc3RhdHVzOworCQlhaC0+YWhfdHhxX2ltcl9xdHJpZyAmPSBhaC0+YWhfdHhxX3N0YXR1czsKKwkJYWgtPmFoX3R4cV9pbXJfbm9mcm0gJj0gYWgtPmFoX3R4cV9zdGF0dXM7CisKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTShhaC0+YWhfdHhxX2ltcl90eG9rLAorCQkJQVI1S19TSU1SMF9RQ1VfVFhPSykgfAorCQkJQVI1S19SRUdfU00oYWgtPmFoX3R4cV9pbXJfdHhkZXNjLAorCQkJQVI1S19TSU1SMF9RQ1VfVFhERVNDKSwgQVI1S19TSU1SMCk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19SRUdfU00oYWgtPmFoX3R4cV9pbXJfdHhlcnIsCisJCQlBUjVLX1NJTVIxX1FDVV9UWEVSUikgfAorCQkJQVI1S19SRUdfU00oYWgtPmFoX3R4cV9pbXJfdHhlb2wsCisJCQlBUjVLX1NJTVIxX1FDVV9UWEVPTCksIEFSNUtfU0lNUjEpOworCQkvKiBVcGRhdGUgc2ltcjIgYnV0IGRvbid0IG92ZXJ3cml0ZSByZXN0IHNpbXIyIHNldHRpbmdzICovCisJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19TSU1SMiwgQVI1S19TSU1SMl9RQ1VfVFhVUk4pOworCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19TSU1SMiwKKwkJCUFSNUtfUkVHX1NNKGFoLT5haF90eHFfaW1yX3R4dXJuLAorCQkJQVI1S19TSU1SMl9RQ1VfVFhVUk4pKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTShhaC0+YWhfdHhxX2ltcl9jYnJvcm4sCisJCQlBUjVLX1NJTVIzX1FDQlJPUk4pIHwKKwkJCUFSNUtfUkVHX1NNKGFoLT5haF90eHFfaW1yX2NicnVybiwKKwkJCUFSNUtfU0lNUjNfUUNCUlVSTiksIEFSNUtfU0lNUjMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUkVHX1NNKGFoLT5haF90eHFfaW1yX3F0cmlnLAorCQkJQVI1S19TSU1SNF9RVFJJRyksIEFSNUtfU0lNUjQpOworCQkvKiBTZXQgVFhOT0ZSTV9RQ1UgZm9yIHRoZSBxdWV1ZXMgd2l0aCBUWE5PRlJNIGVuYWJsZWQgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTShhaC0+YWhfdHhxX2ltcl9ub2ZybSwKKwkJCUFSNUtfVFhOT0ZSTV9RQ1UpLCBBUjVLX1RYTk9GUk0pOworCQkvKiBObyBxdWV1ZSBoYXMgVFhOT0ZSTSBlbmFibGVkLCBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQKKwkJICogYnkgc2V0dGluZyBBUjVLX1RYTk9GUk0gdG8gemVybyAqLworCQlpZiAoYWgtPmFoX3R4cV9pbXJfbm9mcm0gPT0gMCkKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19UWE5PRlJNKTsKKworCQkvKiBTZXQgUUNVIG1hc2sgZm9yIHRoaXMgRENVIHRvIHNhdmUgcG93ZXIgKi8KKwkJQVI1S19SRUdfV1JJVEVfUShhaCwgQVI1S19RVUVVRV9RQ1VNQVNLKHF1ZXVlKSwgcXVldWUpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHNsb3QgdGltZSBvbiBEQ1UKKyAqLworaW50IGF0aDVrX2h3X3NldF9zbG90X3RpbWUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHNsb3RfdGltZSkKK3sKKwlpZiAoc2xvdF90aW1lIDwgQVI1S19TTE9UX1RJTUVfOSB8fCBzbG90X3RpbWUgPiBBUjVLX1NMT1RfVElNRV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGF0aDVrX2h3X2h0b2Nsb2NrKHNsb3RfdGltZSwKKwkJCQlhaC0+YWhfdHVyYm8pLCBBUjVLX1NMT1RfVElNRSk7CisJZWxzZQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNsb3RfdGltZSwgQVI1S19EQ1VfR0JMX0lGU19TTE9UKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19yZXNldC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfcmVzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzgwMDkzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYXRoNWtfcmVzZXQuYwpAQCAtMCwwICsxLDExNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBMdWlzIFJvZHJpZ3VleiA8bWNncm9mQHdpbmxhYi5ydXRnZXJzLmVkdT4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgorICoKKyAqIExpZ2h0bHkgbW9kaWZpZWQgZm9yIGdQWEUsIEp1bHkgMjAwOSwgYnkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIE1JVCApOworCisjZGVmaW5lIF9BVEg1S19SRVNFVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIFJlc2V0IGZ1bmN0aW9ucyBhbmQgaGVscGVycworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4gCQkvKiBUbyBkZXRlcm1pbmUgaWYgYSBjYXJkIGlzIHBjaS1lICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImJhc2UuaCIKKworLyogRmluZCBsYXN0IHNldCBiaXQ7IGZscygwKSA9IDAsIGZscygxKSA9IDEsIGZscygweDgwMDAwMDAwKSA9IDMyICovCitzdGF0aWMgaW50IGZscyhpbnQgeCkKK3sKKyAgICAgICAgaW50IHIgPSAzMjsKKworICAgICAgICBpZiAoIXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICghKHggJiAweGZmZmYwMDAwdSkpIHsKKyAgICAgICAgICAgICAgICB4IDw8PSAxNjsKKyAgICAgICAgICAgICAgICByIC09IDE2OworICAgICAgICB9CisgICAgICAgIGlmICghKHggJiAweGZmMDAwMDAwdSkpIHsKKyAgICAgICAgICAgICAgICB4IDw8PSA4OworICAgICAgICAgICAgICAgIHIgLT0gODsKKyAgICAgICAgfQorICAgICAgICBpZiAoISh4ICYgMHhmMDAwMDAwMHUpKSB7CisgICAgICAgICAgICAgICAgeCA8PD0gNDsKKyAgICAgICAgICAgICAgICByIC09IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoeCAmIDB4YzAwMDAwMDB1KSkgeworICAgICAgICAgICAgICAgIHggPDw9IDI7CisgICAgICAgICAgICAgICAgciAtPSAyOworICAgICAgICB9CisgICAgICAgIGlmICghKHggJiAweDgwMDAwMDAwdSkpIHsKKyAgICAgICAgICAgICAgICB4IDw8PSAxOworICAgICAgICAgICAgICAgIHIgLT0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcjsKK30KKworCisvKioKKyAqIGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncyAtIHNldCBPRkRNIHRpbWluZ3Mgb24gQVI1MjEyCisgKgorICogQGFoOiB0aGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IHRoZSBjdXJyZW50bHkgc2V0IGNoYW5uZWwgdXBvbiByZXNldAorICoKKyAqIFdyaXRlIHRoZSBkZWx0YSBzbG9wZSBjb2VmZmljaWVudCAodXNlZCBvbiBwaWxvdCB0cmFja2luZyA/KSBmb3IgT0ZETQorICogb3BlcmF0aW9uIG9uIHRoZSBBUjUyMTIgdXBvbiByZXNldC4gVGhpcyBpcyBhIGhlbHBlciBmb3IgYXRoNWtfaHdfcmVzZXQoKS4KKyAqCisgKiBTaW5jZSBkZWx0YSBzbG9wZSBpcyBmbG9hdGluZyBwb2ludCB3ZSBzcGxpdCBpdCBvbiBpdHMgZXhwb25lbnQgYW5kCisgKiBtYW50aXNzYSBhbmQgcHJvdmlkZSB0aGVzZSB2YWx1ZXMgb24gaHcuCisgKgorICogRm9yIG1vcmUgaW5mb3MgaSB0aGluayB0aGlzIHBhdGVudCBpcyByZWxhdGVkCisgKiBodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS83MTg0NDk1Lmh0bWwKKyAqLworc3RhdGljIGludCBhdGg1a19od193cml0ZV9vZmRtX3RpbWluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKKwlzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwkvKiBHZXQgZXhwb25lbnQgYW5kIG1hbnRpc3NhIGFuZCBzZXQgaXQgKi8KKwl1MzIgY29lZl9zY2FsZWQsIGNvZWZfZXhwLCBjb2VmX21hbiwKKwkJZHNfY29lZl9leHAsIGRzX2NvZWZfbWFuLCBjbG9jazsKKworCWlmICghKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB8fAorCSAgICAhKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9PRkRNKSkgeworCQlEQkcoImF0aDVrOiBhdHRlbXB0IHRvIHNldCBPRkRNIHRpbWluZ3Mgb24gbm9uLU9GRE0gY2hhbm5lbFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIEdldCBjb2VmZmljaWVudAorCSAqIEFMR086IGNvZWYgPSAoNSAqIGNsb2NrICogY2Fycmllcl9mcmVxKSAvIDIpCisJICogd2Ugc2NhbGUgY29lZiBieSBzaGlmdGluZyBjbG9jayB2YWx1ZSBieSAyNCBmb3IKKwkgKiBiZXR0ZXIgcHJlY2lzaW9uIHNpbmNlIHdlIHVzZSBpbnRlZ2VycyAqLworCS8qIFRPRE86IEhhbGYvcXVhcnRlciByYXRlICovCisJY2xvY2sgPSAgYXRoNWtfaHdfaHRvY2xvY2soMSwgY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMX1RVUkJPKTsKKworCWNvZWZfc2NhbGVkID0gKCg1ICogKGNsb2NrIDw8IDI0KSkgLyAyKSAvIGNoYW5uZWwtPmNlbnRlcl9mcmVxOworCisJLyogR2V0IGV4cG9uZW50CisJICogQUxHTzogY29lZl9leHAgPSAxNCAtIGhpZ2hlc3Qgc2V0IGJpdCBwb3NpdGlvbiAqLworCWNvZWZfZXhwID0gZmxzKGNvZWZfc2NhbGVkKSAtIDE7CisKKwkvKiBEb2Vzbid0IG1ha2Ugc2Vuc2UgaWYgaXQncyB6ZXJvKi8KKwlpZiAoIWNvZWZfc2NhbGVkIHx8ICFjb2VmX2V4cCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBOb3RlOiB3ZSd2ZSBzaGlmdGVkIGNvZWZfc2NhbGVkIGJ5IDI0ICovCisJY29lZl9leHAgPSAxNCAtIChjb2VmX2V4cCAtIDI0KTsKKworCisJLyogR2V0IG1hbnRpc3NhIChzaWduaWZpY2FudCBkaWdpdHMpCisJICogQUxHTzogY29lZl9tYW50ID0gZmxvb3IoY29lZl9zY2FsZWQqIDJeY29lZl9leHArMC41KSAqLworCWNvZWZfbWFuID0gY29lZl9zY2FsZWQgKworCQkoMSA8PCAoMjQgLSBjb2VmX2V4cCAtIDEpKTsKKworCS8qIENhbGN1bGF0ZSBkZWx0YSBzbG9wZSBjb2VmZmljaWVudCBleHBvbmVudAorCSAqIGFuZCBtYW50aXNzYSAocmVtb3ZlIHNjYWxpbmcpIGFuZCBzZXQgdGhlbSBvbiBodyAqLworCWRzX2NvZWZfbWFuID0gY29lZl9tYW4gPj4gKDI0IC0gY29lZl9leHApOworCWRzX2NvZWZfZXhwID0gY29lZl9leHAgLSAxNjsKKworCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX1RJTUlOR18zLAorCQlBUjVLX1BIWV9USU1JTkdfM19EU0NfTUFOLCBkc19jb2VmX21hbik7CisJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfVElNSU5HXzMsCisJCUFSNUtfUEhZX1RJTUlOR18zX0RTQ19FWFAsIGRzX2NvZWZfZXhwKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBpbmRleCBpbnRvIHJhdGVzIGZvciBjb250cm9sIHJhdGVzLCB3ZSBjYW4gc2V0IGl0IHVwIGxpa2UgdGhpcyBiZWNhdXNlCisgKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgQVI1MjEyIGFuZCB3ZSBrbm93IGl0IHN1cHBvcnRzIEcgbW9kZQorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvbnRyb2xfcmF0ZXNbXSA9CisJeyAwLCAxLCAxLCAxLCA0LCA0LCA2LCA2LCA4LCA4LCA4LCA4IH07CisKKy8qKgorICogYXRoNWtfaHdfd3JpdGVfcmF0ZV9kdXJhdGlvbiAtIGZpbGwgcmF0ZSBjb2RlIHRvIGR1cmF0aW9uIHRhYmxlCisgKgorICogQGFoOiB0aGUgJnN0cnVjdCBhdGg1a19odworICogQG1vZGU6IG9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKgorICogV3JpdGUgdGhlIHJhdGUgY29kZSB0byBkdXJhdGlvbiB0YWJsZSB1cG9uIGh3IHJlc2V0LiBUaGlzIGlzIGEgaGVscGVyIGZvcgorICogYXRoNWtfaHdfcmVzZXQoKS4gSXQgc2VlbXMgYWxsIHRoaXMgaXMgZG9pbmcgaXMgc2V0dGluZyBhbiBBQ0sgdGltZW91dCBvbgorICogdGhlIGhhcmR3YXJlLCBiYXNlZCBvbiBjdXJyZW50IG1vZGUsIGZvciBlYWNoIHJhdGUuIFRoZSByYXRlcyB3aGljaCBhcmUKKyAqIGNhcGFibGUgb2Ygc2hvcnQgcHJlYW1ibGUgKDgwMi4xMWIgcmF0ZXMgMk1icHMsIDUuNU1icHMsIGFuZCAxMU1icHMpIGhhdmUKKyAqIGRpZmZlcmVudCByYXRlIGNvZGUgc28gd2Ugd3JpdGUgdGhlaXIgdmFsdWUgdHdpY2UgKG9uZSBmb3IgbG9uZyBwcmVhbXBsZQorICogYW5kIG9uZSBmb3Igc2hvcnQpLgorICoKKyAqIE5vdGU6IEJhbmQgZG9lc24ndCBtYXR0ZXIgaGVyZSwgaWYgd2Ugc2V0IHRoZSB2YWx1ZXMgZm9yIE9GRE0gaXQgd29ya3MKKyAqIG9uIGJvdGggYSBhbmQgZyBtb2Rlcy4gU28gYWxsIHdlIGhhdmUgdG8gZG8gaXMgc2V0IHZhbHVlcyBmb3IgYWxsIGcgcmF0ZXMKKyAqIHRoYXQgaW5jbHVkZSBhbGwgT0ZETSBhbmQgQ0NLIHJhdGVzLiBJZiB3ZSBvcGVyYXRlIGluIHR1cmJvIG9yIHhyL2hhbGYvCisgKiBxdWFydGVyIHJhdGUgbW9kZSwgd2UgbmVlZCB0byB1c2UgYW5vdGhlciBzZXQgb2YgYml0cmF0ZXMgKHRoYXQncyB3aHkgd2UKKyAqIG5lZWQgdGhlIG1vZGUgcGFyYW1ldGVyKSBidXQgd2UgZG9uJ3QgaGFuZGxlIHRoZXNlIHByb3ByaWV0YXJ5IG1vZGVzIHlldC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0aDVrX2h3X3dyaXRlX3JhdGVfZHVyYXRpb24oc3RydWN0IGF0aDVrX2h3ICphaCwKKyAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSBfX3VudXNlZCkKK3sKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gYWgtPmFoX3NjOworCXUxNiByYXRlOworCWludCBpOworCisJLyogV3JpdGUgcmF0ZSBkdXJhdGlvbiB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBzYy0+aHdpbmZvLT5ucl9yYXRlc1tORVQ4MDIxMV9CQU5EXzJHSFpdOyBpKyspIHsKKwkJdTMyIHJlZzsKKwkJdTE2IHR4X3RpbWU7CisKKwkJcmF0ZSA9IHNjLT5od2luZm8tPnJhdGVzW05FVDgwMjExX0JBTkRfMkdIWl1baV07CisKKwkJLyogU2V0IEFDSyB0aW1lb3V0ICovCisJCXJlZyA9IEFSNUtfUkFURV9EVVIoYXRoNWtfYml0cmF0ZV90b19od19yaXgocmF0ZSkpOworCisJCS8qIEFuIEFDSyBmcmFtZSBjb25zaXN0cyBvZiAxMCBieXRlcy4gSWYgeW91IGFkZCB0aGUgRkNTLAorCQkgKiBpdCdzIDE0IGJ5dGVzLiBOb3RlIHdlIHVzZSB0aGUgY29udHJvbCByYXRlIGFuZCBub3QgdGhlCisJCSAqIGFjdHVhbCByYXRlIGZvciB0aGlzIHJhdGUuIFNlZSBtYWM4MDIxMSB0eC5jCisJCSAqIGllZWU4MDIxMV9kdXJhdGlvbigpIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mCisJCSAqIHdoYXQgcmF0ZSB3ZSBzaG91bGQgY2hvb3NlIHRvIFRYIEFDS3MuICovCisJCXR4X3RpbWUgPSBuZXQ4MDIxMV9kdXJhdGlvbihzYy0+ZGV2LCAxNCwgcmF0ZSk7CisKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB0eF90aW1lLCByZWcpOworCisJCWlmIChyYXRlICE9IDIwICYmIHJhdGUgIT0gNTUgJiYgcmF0ZSAhPSAxMTApCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBXZSdyZSBub3QgZGlzdGluZ3Vpc2hpbmcgc2hvcnQgcHJlYW1ibGUgaGVyZSwKKwkJICogVGhpcyBpcyB0cnVlLCBhbGwgd2UnbGwgZ2V0IGlzIGEgbG9uZ2VyIHZhbHVlIGhlcmUKKwkJICogd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWxseSBiYWQuCisJCSAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHR4X3RpbWUsCisJCQlyZWcgKyAoQVI1S19TRVRfU0hPUlRfUFJFQU1CTEUgPDwgMikpOworCX0KK30KKworLyoKKyAqIFJlc2V0IGNoaXBzZXQKKyAqLworc3RhdGljIGludCBhdGg1a19od19uaWNfcmVzZXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHZhbCkKK3sKKwlpbnQgcmV0OworCXUzMiBtYXNrID0gdmFsID8gdmFsIDogfjBVOworCisJLyogUmVhZC1hbmQtY2xlYXIgUlggRGVzY3JpcHRvciBQb2ludGVyKi8KKwlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SWERQKTsKKworCS8qCisJICogUmVzZXQgdGhlIGRldmljZSBhbmQgd2FpdCB1bnRpbCBzdWNjZXNzCisJICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB2YWwsIEFSNUtfUkVTRVRfQ1RMKTsKKworCS8qIFdhaXQgYXQgbGVhc3QgMTI4IFBDSSBjbG9ja3MgKi8KKwl1ZGVsYXkoMTUpOworCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCXZhbCAmPSBBUjVLX1JFU0VUX0NUTF9QQ1UgfCBBUjVLX1JFU0VUX0NUTF9ETUEKKwkJCXwgQVI1S19SRVNFVF9DVExfTUFDIHwgQVI1S19SRVNFVF9DVExfUEhZOworCQltYXNrICY9IEFSNUtfUkVTRVRfQ1RMX1BDVSB8IEFSNUtfUkVTRVRfQ1RMX0RNQQorCQkJfCBBUjVLX1JFU0VUX0NUTF9NQUMgfCBBUjVLX1JFU0VUX0NUTF9QSFk7CisJfSBlbHNlIHsKKwkJdmFsICY9IEFSNUtfUkVTRVRfQ1RMX1BDVSB8IEFSNUtfUkVTRVRfQ1RMX0JBU0VCQU5EOworCQltYXNrICY9IEFSNUtfUkVTRVRfQ1RMX1BDVSB8IEFSNUtfUkVTRVRfQ1RMX0JBU0VCQU5EOworCX0KKworCXJldCA9IGF0aDVrX2h3X3JlZ2lzdGVyX3RpbWVvdXQoYWgsIEFSNUtfUkVTRVRfQ1RMLCBtYXNrLCB2YWwsIDApOworCisJLyoKKwkgKiBSZXNldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIChmb3IgaHcgYnl0ZS1zd2FwKS4gTm90ZSB0aGF0IHRoaXMKKwkgKiBpcyBvbmx5IHNldCBmb3IgYmlnIGVuZGlhbi4gV2UgZG8gdGhlIG5lY2Vzc2FyeSBtYWdpYyBpbgorCSAqIEFSNUtfSU5JVF9DRkcuCisJICovCisJaWYgKCh2YWwgJiBBUjVLX1JFU0VUX0NUTF9QQ1UpID09IDApCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19JTklUX0NGRywgQVI1S19DRkcpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFNsZWVwIGNvbnRyb2wKKyAqLworaW50IGF0aDVrX2h3X3dha2Uoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgc3RhaWQsIGRhdGE7CisKKwlzdGFpZCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NUQV9JRDEpOworCXN0YWlkICY9IH5BUjVLX1NUQV9JRDFfUFdSX1NWOworCisJLyogUHJlc2VydmUgc2xlZXAgZHVyYXRpb24gKi8KKwlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU0xFRVBfQ1RMKTsKKwlpZiAoZGF0YSAmIDB4ZmZjMDAwMDApCisJCWRhdGEgPSAwOworCWVsc2UKKwkJZGF0YSA9IGRhdGEgJiAweGZmZmNmZmZmOworCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBkYXRhLCBBUjVLX1NMRUVQX0NUTCk7CisJdWRlbGF5KDE1KTsKKworCWZvciAoaSA9IDUwOyBpID4gMDsgaS0tKSB7CisJCS8qIENoZWNrIGlmIHRoZSBjaGlwIGRpZCB3YWtlIHVwICovCisJCWlmICgoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUENJQ0ZHKSAmCisJCSAgICAgQVI1S19QQ0lDRkdfU1BXUl9ETikgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIFdhaXQgYSBiaXQgYW5kIHJldHJ5ICovCisJCXVkZWxheSgyMDApOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfU0xFRVBfQ1RMKTsKKwl9CisKKwkvKiBGYWlsIGlmIHRoZSBjaGlwIGRpZG4ndCB3YWtlIHVwICovCisJaWYgKGkgPD0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHN0YWlkLCBBUjVLX1NUQV9JRDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBCcmluZyB1cCBNQUMgKyBQSFkgQ2hpcHMgYW5kIHByb2dyYW0gUExMCisgKiBUT0RPOiBIYWxmL1F1YXJ0ZXIgcmF0ZSBzdXBwb3J0CisgKi8KK2ludCBhdGg1a19od19uaWNfd2FrZXVwKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBmbGFncywgaW50IGluaXRpYWwgX191bnVzZWQpCit7CisJc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYgPSBhaC0+YWhfc2MtPnBkZXY7CisJdTMyIHR1cmJvLCBtb2RlLCBjbG9jaywgYnVzX2ZsYWdzOworCWludCByZXQ7CisKKwl0dXJibyA9IDA7CisJbW9kZSA9IDA7CisJY2xvY2sgPSAwOworCisJLyogV2FrZXVwIHRoZSBkZXZpY2UgKi8KKwlyZXQgPSBhdGg1a19od193YWtlKGFoKTsKKwlpZiAocmV0KSB7CisJCURCRygiYXRoNWs6IGZhaWxlZCB0byB3YWtlIHVwIHRoZSBNQUMgY2hpcFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7CisJCS8qCisJCSAqIEdldCBjaGFubmVsIG1vZGUgZmxhZ3MKKwkJICovCisKKwkJaWYgKGFoLT5haF9yYWRpbyA+PSBBUjVLX1JGNTExMikgeworCQkJbW9kZSA9IEFSNUtfUEhZX01PREVfUkFEX1JGNTExMjsKKwkJCWNsb2NrID0gQVI1S19QSFlfUExMX1JGNTExMjsKKwkJfSBlbHNlIHsKKwkJCW1vZGUgPSBBUjVLX1BIWV9NT0RFX1JBRF9SRjUxMTE7CS8qWmVybyovCisJCQljbG9jayA9IEFSNUtfUEhZX1BMTF9SRjUxMTE7CQkvKlplcm8qLworCQl9CisKKwkJaWYgKGZsYWdzICYgQ0hBTk5FTF8yR0haKSB7CisJCQltb2RlIHw9IEFSNUtfUEhZX01PREVfRlJFUV8yR0haOworCQkJY2xvY2sgfD0gQVI1S19QSFlfUExMXzQ0TUhaOworCisJCQlpZiAoZmxhZ3MgJiBDSEFOTkVMX0NDSykgeworCQkJCW1vZGUgfD0gQVI1S19QSFlfTU9ERV9NT0RfQ0NLOworCQkJfSBlbHNlIGlmIChmbGFncyAmIENIQU5ORUxfT0ZETSkgeworCQkJCS8qIFhYWCBEeW5hbWljIE9GRE0vQ0NLIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisJCQkJICogQVI1MjExIHNvIHdlIHNldCBNT0RfT0ZETSBmb3IgcGxhaW4gZyAobm8KKwkJCQkgKiBDQ0sgaGVhZGVycykgb3BlcmF0aW9uLiBXZSBuZWVkIHRvIHRlc3QKKwkJCQkgKiB0aGlzLCA1MjExIG1pZ2h0IHN1cHBvcnQgb2ZkbS1vbmx5IGcgYWZ0ZXIKKwkJCQkgKiBhbGwsIHRoZXJlIGFyZSBhbHNvIGluaXRpYWwgcmVnaXN0ZXIgdmFsdWVzCisJCQkJICogaW4gdGhlIGNvZGUgZm9yIGcgbW9kZSAoc2VlIGluaXR2YWxzLmMpLiAqLworCQkJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMSkKKwkJCQkJbW9kZSB8PSBBUjVLX1BIWV9NT0RFX01PRF9PRkRNOworCQkJCWVsc2UKKwkJCQkJbW9kZSB8PSBBUjVLX1BIWV9NT0RFX01PRF9EWU47CisJCQl9IGVsc2UgeworCQkJCURCRygiYXRoNWs6IGludmFsaWQgcmFkaW8gbW9kdWxhdGlvbiBtb2RlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIGlmIChmbGFncyAmIENIQU5ORUxfNUdIWikgeworCQkJbW9kZSB8PSBBUjVLX1BIWV9NT0RFX0ZSRVFfNUdIWjsKKworCQkJaWYgKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTQxMykKKwkJCQljbG9jayA9IEFSNUtfUEhZX1BMTF80ME1IWl81NDEzOworCQkJZWxzZQorCQkJCWNsb2NrIHw9IEFSNUtfUEhZX1BMTF80ME1IWjsKKworCQkJaWYgKGZsYWdzICYgQ0hBTk5FTF9PRkRNKQorCQkJCW1vZGUgfD0gQVI1S19QSFlfTU9ERV9NT0RfT0ZETTsKKwkJCWVsc2UgeworCQkJCURCRygiYXRoNWs6IGludmFsaWQgcmFkaW8gbW9kdWxhdGlvbiBtb2RlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURCRygiYXRoNWs6IGludmFsaWQgcmFkaW8gZnJlcXVlbmN5IG1vZGVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBDSEFOTkVMX1RVUkJPKQorCQkJdHVyYm8gPSBBUjVLX1BIWV9UVVJCT19NT0RFIHwgQVI1S19QSFlfVFVSQk9fU0hPUlQ7CisJfSBlbHNlIHsgLyogUmVzZXQgdGhlIGRldmljZSAqLworCisJCS8qIC4uLmVuYWJsZSBBdGhlcm9zIHR1cmJvIG1vZGUgaWYgcmVxdWVzdGVkICovCisJCWlmIChmbGFncyAmIENIQU5ORUxfVFVSQk8pCisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX1RVUkJPX01PREUsCisJCQkJCUFSNUtfUEhZX1RVUkJPKTsKKwl9CisKKwkvKiByZXNldGluZyBQQ0kgb24gUENJLUUgY2FyZHMgcmVzdWx0cyBjYXJkIHRvIGhhbmcKKwkgKiBhbmQgYWx3YXlzIHJldHVybiAweGZmZmYuLi4gc28gd2UgaW5nb3JlIHRoYXQgZmxhZworCSAqIGZvciBQQ0ktRSBjYXJkcyAqLworCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKSkKKwkJYnVzX2ZsYWdzID0gMDsKKwllbHNlCisJCWJ1c19mbGFncyA9IEFSNUtfUkVTRVRfQ1RMX1BDSTsKKworCS8qIFJlc2V0IGNoaXBzZXQgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJcmV0ID0gYXRoNWtfaHdfbmljX3Jlc2V0KGFoLCBBUjVLX1JFU0VUX0NUTF9QQ1UgfAorCQkJQVI1S19SRVNFVF9DVExfTUFDIHwgQVI1S19SRVNFVF9DVExfRE1BIHwKKwkJCUFSNUtfUkVTRVRfQ1RMX1BIWSB8IEFSNUtfUkVTRVRfQ1RMX1BDSSk7CisJCW1kZWxheSgyKTsKKwl9IGVsc2UgeworCQlyZXQgPSBhdGg1a19od19uaWNfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8CisJCQlBUjVLX1JFU0VUX0NUTF9CQVNFQkFORCB8IGJ1c19mbGFncyk7CisJfQorCWlmIChyZXQpIHsKKwkJREJHKCJhdGg1azogZmFpbGVkIHRvIHJlc2V0IHRoZSBNQUMgY2hpcFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIC4uLndha2V1cCBhZ2FpbiEqLworCXJldCA9IGF0aDVrX2h3X3dha2UoYWgpOworCWlmIChyZXQpIHsKKwkJREJHKCJhdGg1azogZmFpbGVkIHRvIHJlc3VtZSB0aGUgTUFDIGNoaXBcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIC4uLmZpbmFsIHdhcm0gcmVzZXQgKi8KKwlpZiAoYXRoNWtfaHdfbmljX3Jlc2V0KGFoLCAwKSkgeworCQlEQkcoImF0aDVrOiBmYWlsZWQgdG8gd2FybSByZXNldCB0aGUgTUFDIGNoaXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKKworCQkvKiAuLi51cGRhdGUgUExMIGlmIG5lZWRlZCAqLworCQlpZiAoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1BMTCkgIT0gY2xvY2spIHsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgY2xvY2ssIEFSNUtfUEhZX1BMTCk7CisJCQl1ZGVsYXkoMzAwKTsKKwkJfQorCisJCS8qIC4uLnNldCB0aGUgUEhZIG9wZXJhdGluZyBtb2RlICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgbW9kZSwgQVI1S19QSFlfTU9ERSk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdHVyYm8sIEFSNUtfUEhZX1RVUkJPKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg1a19od19jaGFuX2hhc19zcHVyX25vaXNlKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQkJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJdTggcmVmY2xrX2ZyZXE7CisKKwlpZiAoKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMikgfHwKKwkoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1NDEzKSB8fAorCShhaC0+YWhfbWFjX3ZlcnNpb24gPT0gKEFSNUtfU1JFVl9BUjI0MTcgPj4gNCkpKQorCQlyZWZjbGtfZnJlcSA9IDQwOworCWVsc2UKKwkJcmVmY2xrX2ZyZXEgPSAzMjsKKworCWlmICgoY2hhbm5lbC0+Y2VudGVyX2ZyZXEgJSByZWZjbGtfZnJlcSAhPSAwKSAmJgorCSgoY2hhbm5lbC0+Y2VudGVyX2ZyZXEgJSByZWZjbGtfZnJlcSA8IDEwKSB8fAorCShjaGFubmVsLT5jZW50ZXJfZnJlcSAlIHJlZmNsa19mcmVxID4gMjIpKSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyogVE9ETzogSGFsZi9RdWFydGVyIHJhdGUgKi8KK3N0YXRpYyB2b2lkIGF0aDVrX2h3X3R3ZWFrX2luaXR2YWxfc2V0dGluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQlzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIgJiYKKwkgICAgYWgtPmFoX3BoeV9yZXZpc2lvbiA+PSBBUjVLX1NSRVZfUEhZXzUyMTJBKSB7CisKKwkJLyogU2V0dXAgQURDIGNvbnRyb2wgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJCShBUjVLX1JFR19TTSgyLAorCQkJCUFSNUtfUEhZX0FEQ19DVExfSU5CVUZHQUlOX09GRikgfAorCQkJCUFSNUtfUkVHX1NNKDIsCisJCQkJQVI1S19QSFlfQURDX0NUTF9JTkJVRkdBSU5fT04pIHwKKwkJCQlBUjVLX1BIWV9BRENfQ1RMX1BXRF9EQUNfT0ZGIHwKKwkJCQlBUjVLX1BIWV9BRENfQ1RMX1BXRF9BRENfT0ZGKSwKKwkJCQlBUjVLX1BIWV9BRENfQ1RMKTsKKworCisKKwkJLyogRGlzYWJsZSBiYXJrZXIgUlNTSSB0aHJlc2hvbGQgKi8KKwkJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1BIWV9EQUdfQ0NLX0NUTCwKKwkJCQlBUjVLX1BIWV9EQUdfQ0NLX0NUTF9FTl9SU1NJX1RIUik7CisKKwkJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfREFHX0NDS19DVEwsCisJCQlBUjVLX1BIWV9EQUdfQ0NLX0NUTF9SU1NJX1RIUiwgMik7CisKKwkJLyogU2V0IHRoZSBtdXRlIG1hc2sgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMDAwMDBmLCBBUjVLX1NFUV9NQVNLKTsKKwl9CisKKwkvKiBDbGVhciBQSFlfQkxVRVRPT1RIIHRvIGFsbG93IFJYX0NMRUFSIGxpbmUgZGVidWcgKi8KKwlpZiAoYWgtPmFoX3BoeV9yZXZpc2lvbiA+PSBBUjVLX1NSRVZfUEhZXzUyMTJCKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDAsIEFSNUtfUEhZX0JMVUVUT09USCk7CisKKwkvKiBFbmFibGUgRENVIGRvdWJsZSBidWZmZXJpbmcgKi8KKwlpZiAoYWgtPmFoX3BoeV9yZXZpc2lvbiA+IEFSNUtfU1JFVl9QSFlfNTIxMkIpCisJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19UWENGRywKKwkJCQlBUjVLX1RYQ0ZHX0RDVV9EQkxfQlVGX0RJUyk7CisKKwkvKiBTZXQgREFDL0FEQyBkZWxheXMgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJdTMyIHNjYWw7CisJCWlmIChhaC0+YWhfbWFjX3ZlcnNpb24gPT0gKEFSNUtfU1JFVl9BUjI0MTcgPj4gNCkpCisJCQlzY2FsID0gQVI1S19QSFlfU0NBTF8zMk1IWl8yNDE3OworCQllbHNlIGlmIChhdGg1a19lZXByb21faXNfaGI2MyhhaCkpCisJCQlzY2FsID0gQVI1S19QSFlfU0NBTF8zMk1IWl9IQjYzOworCQllbHNlCisJCQlzY2FsID0gQVI1S19QSFlfU0NBTF8zMk1IWjsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzY2FsLCBBUjVLX1BIWV9TQ0FMKTsKKwl9CisKKwkvKiBTZXQgZmFzdCBBREMgKi8KKwlpZiAoKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTQxMykgfHwKKwkoYWgtPmFoX21hY192ZXJzaW9uID09IChBUjVLX1NSRVZfQVIyNDE3ID4+IDQpKSkgeworCQl1MzIgZmFzdF9hZGMgPSAxOworCisJCWlmIChjaGFubmVsLT5jZW50ZXJfZnJlcSA9PSAyNDYyIHx8CisJCWNoYW5uZWwtPmNlbnRlcl9mcmVxID09IDI0NjcpCisJCQlmYXN0X2FkYyA9IDA7CisKKwkJLyogT25seSB1cGRhdGUgaWYgbmVlZGVkICovCisJCWlmIChhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfRkFTVF9BREMpICE9IGZhc3RfYWRjKQorCQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZmFzdF9hZGMsCisJCQkJCQlBUjVLX1BIWV9GQVNUX0FEQyk7CisJfQorCisJLyogRml4IGZvciBmaXJzdCByZXZpc2lvbiBvZiB0aGUgUkY1MTEyIFJGIGNoaXBzZXQgKi8KKwlpZiAoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTEyICYmCisJCQlhaC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiA8CisJCQlBUjVLX1NSRVZfUkFEXzUxMTJBKSB7CisJCXUzMiBkYXRhOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX0NDS1RYQ1RMX1dPUkxELAorCQkJCUFSNUtfUEhZX0NDS1RYQ1RMKTsKKwkJaWYgKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF81R0haKQorCQkJZGF0YSA9IDB4ZmZiODEwMjA7CisJCWVsc2UKKwkJCWRhdGEgPSAweGZmYjgwZDIwOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfUEhZX0ZSQU1FX0NUTCk7CisJfQorCisJaWYgKGFoLT5haF9tYWNfc3JldiA8IEFSNUtfU1JFVl9BUjUyMTEpIHsKKwkJdTMyIHVzZWNfcmVnOworCQkvKiA1MzExIGhhcyBkaWZmZXJlbnQgdHgvcnggbGF0ZW5jeSBtYXNrcworCQkgKiBmcm9tIDUyMTEsIHNpbmNlIHdlIGRlYWwgNTMxMSB0aGUgc2FtZQorCQkgKiBhcyA1MjExIHdoZW4gc2V0dGluZyBpbml0dmFscywgc2hpZnQKKwkJICogdmFsdWVzIGhlcmUgdG8gdGhlaXIgcHJvcGVyIGxvY2F0aW9ucyAqLworCQl1c2VjX3JlZyA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1VTRUNfNTIxMSk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdXNlY19yZWcgJiAoQVI1S19VU0VDXzEgfAorCQkJCUFSNUtfVVNFQ18zMiB8CisJCQkJQVI1S19VU0VDX1RYX0xBVEVOQ1lfNTIxMSB8CisJCQkJQVI1S19SRUdfU00oMjksCisJCQkJQVI1S19VU0VDX1JYX0xBVEVOQ1lfNTIxMCkpLAorCQkJCUFSNUtfVVNFQ181MjExKTsKKwkJLyogQ2xlYXIgUUNVL0RDVSBjbG9jayBnYXRpbmcgcmVnaXN0ZXIgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX1FDVURDVV9DTEtHVCk7CisJCS8qIFNldCBEQUMvQURDIGRlbGF5cyAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDgsIEFSNUtfUEhZX1NDQUwpOworCQkvKiBFbmFibGUgUENVIEZJRk8gY29ycnVwdGlvbiBFQ08gKi8KKwkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfRElBR19TV181MjExLAorCQkJCQlBUjVLX0RJQUdfU1dfRUNPX0VOQUJMRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGg1a19od19jb21taXRfZWVwcm9tX3NldHRpbmdzKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCXN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVsLCB1OCAqYW50LCB1OCBlZV9tb2RlKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXMxNiBjY2tfb2ZkbV9wd3JfZGVsdGE7CisKKwkvKiBBZGp1c3QgcG93ZXIgZGVsdGEgZm9yIGNoYW5uZWwgMTQgKi8KKwlpZiAoY2hhbm5lbC0+Y2VudGVyX2ZyZXEgPT0gMjQ4NCkKKwkJY2NrX29mZG1fcHdyX2RlbHRhID0KKwkJCSgoZWUtPmVlX2Nja19vZmRtX3Bvd2VyX2RlbHRhIC0KKwkJCWVlLT5lZV9zY2FsZWRfY2NrX2RlbHRhKSAqIDIpIC8gMTA7CisJZWxzZQorCQljY2tfb2ZkbV9wd3JfZGVsdGEgPQorCQkJKGVlLT5lZV9jY2tfb2ZkbV9wb3dlcl9kZWx0YSAqIDIpIC8gMTA7CisKKwkvKiBTZXQgQ0NLIHRvIE9GRE0gcG93ZXIgZGVsdGEgb24gdHggcG93ZXIKKwkgKiBhZGp1c3RtZW50IHJlZ2lzdGVyICovCisJaWYgKGFoLT5haF9waHlfcmV2aXNpb24gPj0gQVI1S19TUkVWX1BIWV81MjEyQSkgeworCQlpZiAoY2hhbm5lbC0+aHdfdmFsdWUgPT0gQ0hBTk5FTF9HKQorCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJQVI1S19SRUdfU00oKGVlLT5lZV9jY2tfb2ZkbV9nYWluX2RlbHRhICogLTEpLAorCQkJCUFSNUtfUEhZX1RYX1BXUl9BREpfQ0NLX0dBSU5fREVMVEEpIHwKKwkJCUFSNUtfUkVHX1NNKChjY2tfb2ZkbV9wd3JfZGVsdGEgKiAtMSksCisJCQkJQVI1S19QSFlfVFhfUFdSX0FESl9DQ0tfUENEQUNfSU5ERVgpLAorCQkJCUFSNUtfUEhZX1RYX1BXUl9BREopOworCQllbHNlCisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDAsIEFSNUtfUEhZX1RYX1BXUl9BREopOworCX0gZWxzZSB7CisJCS8qIEZvciBvbGRlciByZXZzIHdlIHNjYWxlIHBvd2VyIG9uIHN3IGR1cmluZyB0eCBwb3dlcgorCQkgKiBzZXR1cCAqLworCQlhaC0+YWhfdHhwb3dlci50eHBfY2NrX29mZG1fcHdyX2RlbHRhID0gY2NrX29mZG1fcHdyX2RlbHRhOworCQlhaC0+YWhfdHhwb3dlci50eHBfY2NrX29mZG1fZ2FpbmZfZGVsdGEgPQorCQkJCQkJZWUtPmVlX2Nja19vZmRtX2dhaW5fZGVsdGE7CisJfQorCisJLyogU2V0IGFudGVubmEgaWRsZSBzd2l0Y2ggdGFibGUgKi8KKwlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9BTlRfQ1RMLAorCQkJQVI1S19QSFlfQU5UX0NUTF9TV1RBQkxFX0lETEUsCisJCQkoYWgtPmFoX2FudGVubmFbZWVfbW9kZV1bMF0gfAorCQkJQVI1S19QSFlfQU5UX0NUTF9UWFJYX0VOKSk7CisKKwkvKiBTZXQgYW50ZW5uYSBzd2l0Y2ggdGFibGUgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF9hbnRlbm5hW2VlX21vZGVdW2FudFswXV0sCisJCUFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEVfMCk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfYW50ZW5uYVtlZV9tb2RlXVthbnRbMV1dLAorCQlBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzEpOworCisJLyogTm9pc2UgZmxvb3IgdGhyZXNob2xkICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQlBUjVLX1BIWV9ORl9TVkFMKGVlLT5lZV9ub2lzZV9mbG9vcl90aHJbZWVfbW9kZV0pLAorCQlBUjVLX1BIWV9ORlRIUkVTKTsKKworCWlmICgoY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMX1RVUkJPKSAmJgorCShhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzVfMCkpIHsKKwkJLyogU3dpdGNoIHNldHRsaW5nIHRpbWUgKFR1cmJvKSAqLworCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9TRVRUTElORywKKwkJCQlBUjVLX1BIWV9TRVRUTElOR19TV0lUQ0gsCisJCQkJZWUtPmVlX3N3aXRjaF9zZXR0bGluZ190dXJib1tlZV9tb2RlXSk7CisKKwkJLyogVHgvUnggYXR0ZW51YXRpb24gKFR1cmJvKSAqLworCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9HQUlOLAorCQkJCUFSNUtfUEhZX0dBSU5fVFhSWF9BVFRFTiwKKwkJCQllZS0+ZWVfYXRuX3R4X3J4X3R1cmJvW2VlX21vZGVdKTsKKworCQkvKiBBREMvUEdBIGRlc2lyZWQgc2l6ZSAoVHVyYm8pICovCisJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX0RFU0lSRURfU0laRSwKKwkJCQlBUjVLX1BIWV9ERVNJUkVEX1NJWkVfQURDLAorCQkJCWVlLT5lZV9hZGNfZGVzaXJlZF9zaXplX3R1cmJvW2VlX21vZGVdKTsKKworCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9ERVNJUkVEX1NJWkUsCisJCQkJQVI1S19QSFlfREVTSVJFRF9TSVpFX1BHQSwKKwkJCQllZS0+ZWVfcGdhX2Rlc2lyZWRfc2l6ZV90dXJib1tlZV9tb2RlXSk7CisKKwkJLyogVHgvUnggbWFyZ2luIChUdXJibykgKi8KKwkJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfR0FJTl8yR0haLAorCQkJCUFSNUtfUEhZX0dBSU5fMkdIWl9NQVJHSU5fVFhSWCwKKwkJCQllZS0+ZWVfbWFyZ2luX3R4X3J4X3R1cmJvW2VlX21vZGVdKTsKKworCX0gZWxzZSB7CisJCS8qIFN3aXRjaCBzZXR0bGluZyB0aW1lICovCisJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX1NFVFRMSU5HLAorCQkJCUFSNUtfUEhZX1NFVFRMSU5HX1NXSVRDSCwKKwkJCQllZS0+ZWVfc3dpdGNoX3NldHRsaW5nW2VlX21vZGVdKTsKKworCQkvKiBUeC9SeCBhdHRlbnVhdGlvbiAqLworCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9HQUlOLAorCQkJCUFSNUtfUEhZX0dBSU5fVFhSWF9BVFRFTiwKKwkJCQllZS0+ZWVfYXRuX3R4X3J4W2VlX21vZGVdKTsKKworCQkvKiBBREMvUEdBIGRlc2lyZWQgc2l6ZSAqLworCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9ERVNJUkVEX1NJWkUsCisJCQkJQVI1S19QSFlfREVTSVJFRF9TSVpFX0FEQywKKwkJCQllZS0+ZWVfYWRjX2Rlc2lyZWRfc2l6ZVtlZV9tb2RlXSk7CisKKwkJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfREVTSVJFRF9TSVpFLAorCQkJCUFSNUtfUEhZX0RFU0lSRURfU0laRV9QR0EsCisJCQkJZWUtPmVlX3BnYV9kZXNpcmVkX3NpemVbZWVfbW9kZV0pOworCisJCS8qIFR4L1J4IG1hcmdpbiAqLworCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzEpCisJCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9HQUlOXzJHSFosCisJCQkJQVI1S19QSFlfR0FJTl8yR0haX01BUkdJTl9UWFJYLAorCQkJCWVlLT5lZV9tYXJnaW5fdHhfcnhbZWVfbW9kZV0pOworCX0KKworCS8qIFhQQSBkZWxheXMgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsCisJCShlZS0+ZWVfdHhfZW5kMnhwYV9kaXNhYmxlW2VlX21vZGVdIDw8IDI0KSB8CisJCShlZS0+ZWVfdHhfZW5kMnhwYV9kaXNhYmxlW2VlX21vZGVdIDw8IDE2KSB8CisJCShlZS0+ZWVfdHhfZnJtMnhwYV9lbmFibGVbZWVfbW9kZV0gPDwgOCkgfAorCQkoZWUtPmVlX3R4X2ZybTJ4cGFfZW5hYmxlW2VlX21vZGVdKSwgQVI1S19QSFlfUkZfQ1RMNCk7CisKKwkvKiBYTE5BIGRlbGF5ICovCisJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfUkZfQ1RMMywKKwkJCUFSNUtfUEhZX1JGX0NUTDNfVFhFMlhMTkFfT04sCisJCQllZS0+ZWVfdHhfZW5kMnhsbmFfZW5hYmxlW2VlX21vZGVdKTsKKworCS8qIFRocmVzaDY0IChBTkkpICovCisJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfTkYsCisJCQlBUjVLX1BIWV9ORl9USFJFU0g2MiwKKwkJCWVlLT5lZV90aHJfNjJbZWVfbW9kZV0pOworCisKKwkvKiBGYWxzZSBkZXRlY3QgYmFja29mZiBmb3IgY2hhbm5lbHMKKwkgKiB0aGF0IGhhdmUgc3B1ciBub2lzZS4gV3JpdGUgdGhlIG5ldworCSAqIGN5Y2xpYyBwb3dlciBSU1NJIHRocmVzaG9sZC4gKi8KKwlpZiAoYXRoNWtfaHdfY2hhbl9oYXNfc3B1cl9ub2lzZShhaCwgY2hhbm5lbCkpCisJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX09GRE1fU0VMRkNPUlIsCisJCQkJQVI1S19QSFlfT0ZETV9TRUxGQ09SUl9DWVBXUl9USFIxLAorCQkJCUFSNUtfSU5JVF9DWUNSU1NJX1RIUjEgKworCQkJCWVlLT5lZV9mYWxzZV9kZXRlY3RbZWVfbW9kZV0pOworCWVsc2UKKwkJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfT0ZETV9TRUxGQ09SUiwKKwkJCQlBUjVLX1BIWV9PRkRNX1NFTEZDT1JSX0NZUFdSX1RIUjEsCisJCQkJQVI1S19JTklUX0NZQ1JTU0lfVEhSMSk7CisKKwkvKiBJL1EgY29ycmVjdGlvbgorCSAqIFRPRE86IFBlciBjaGFubmVsIGkvcSBpbmZvcyA/ICovCisJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0lRLAorCQlBUjVLX1BIWV9JUV9DT1JSX0VOQUJMRSB8CisJCShlZS0+ZWVfaV9jYWxbZWVfbW9kZV0gPDwgQVI1S19QSFlfSVFfQ09SUl9RX0lfQ09GRl9TKSB8CisJCWVlLT5lZV9xX2NhbFtlZV9tb2RlXSk7CisKKwkvKiBIZWF2eSBjbGlwcGluZyAtZGlzYWJsZSBmb3Igbm93ICovCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNV8xKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDAsIEFSNUtfUEhZX0hFQVZZX0NMSVBfRU5BQkxFKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIE1haW4gcmVzZXQgZnVuY3Rpb24KKyAqLworaW50IGF0aDVrX2h3X3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsCisJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW5uZWwsIGludCBjaGFuZ2VfY2hhbm5lbCkKK3sKKwl1MzIgc19zZXFbMTBdLCBzX2FudCwgc19sZWRbM10sIHN0YWlkMV9mbGFncywgdHNmX3VwLCB0c2ZfbG87CisJdTMyIHBoeV90c3QxOworCXU4IG1vZGUsIGZyZXEsIGVlX21vZGUsIGFudFsyXTsKKwlpbnQgaSwgcmV0OworCisJc19hbnQgPSAwOworCWVlX21vZGUgPSAwOworCXN0YWlkMV9mbGFncyA9IDA7CisJdHNmX3VwID0gMDsKKwl0c2ZfbG8gPSAwOworCWZyZXEgPSAwOworCW1vZGUgPSAwOworCisJLyoKKwkgKiBTYXZlIHNvbWUgcmVnaXN0ZXJzIGJlZm9yZSBhIHJlc2V0CisJICovCisJLypEQ1UvQW50ZW5uYSBzZWxlY3Rpb24gbm90IGF2YWlsYWJsZSBvbiA1MjEwKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKKworCQlzd2l0Y2ggKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9NT0RFUykgeworCQljYXNlIENIQU5ORUxfQToKKwkJCW1vZGUgPSBBUjVLX01PREVfMTFBOworCQkJZnJlcSA9IEFSNUtfSU5JX1JGR0FJTl81R0haOworCQkJZWVfbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFBOworCQkJYnJlYWs7CisJCWNhc2UgQ0hBTk5FTF9HOgorCQkJbW9kZSA9IEFSNUtfTU9ERV8xMUc7CisJCQlmcmVxID0gQVI1S19JTklfUkZHQUlOXzJHSFo7CisJCQllZV9tb2RlID0gQVI1S19FRVBST01fTU9ERV8xMUc7CisJCQlicmVhazsKKwkJY2FzZSBDSEFOTkVMX0I6CisJCQltb2RlID0gQVI1S19NT0RFXzExQjsKKwkJCWZyZXEgPSBBUjVLX0lOSV9SRkdBSU5fMkdIWjsKKwkJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQjsKKwkJCWJyZWFrOworCQljYXNlIENIQU5ORUxfVDoKKwkJCW1vZGUgPSBBUjVLX01PREVfMTFBX1RVUkJPOworCQkJZnJlcSA9IEFSNUtfSU5JX1JGR0FJTl81R0haOworCQkJZWVfbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFBOworCQkJYnJlYWs7CisJCWNhc2UgQ0hBTk5FTF9URzoKKwkJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMSkgeworCQkJCURCRygiYXRoNWs6IFR1cmJvRyBub3QgYXZhaWxhYmxlIG9uIDUyMTFcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJbW9kZSA9IEFSNUtfTU9ERV8xMUdfVFVSQk87CisJCQlmcmVxID0gQVI1S19JTklfUkZHQUlOXzJHSFo7CisJCQllZV9tb2RlID0gQVI1S19FRVBST01fTU9ERV8xMUc7CisJCQlicmVhazsKKwkJY2FzZSBDSEFOTkVMX1hSOgorCQkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjExKSB7CisJCQkJREJHKCJhdGg1azogWFIgbW9kZSBub3QgYXZhaWxhYmxlIG9uIDUyMTFcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJbW9kZSA9IEFSNUtfTU9ERV9YUjsKKwkJCWZyZXEgPSBBUjVLX0lOSV9SRkdBSU5fNUdIWjsKKwkJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHKCJhdGg1azogaW52YWxpZCBjaGFubmVsICglZCBNSHopXG4iLAorCQkJICAgIGNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNoYW5nZV9jaGFubmVsKSB7CisJCQkvKgorCQkJICogU2F2ZSBmcmFtZSBzZXF1ZW5jZSBjb3VudAorCQkJICogRm9yIHJldnMuIGFmdGVyIE9haHUsIG9ubHkgc2F2ZQorCQkJICogc2VxIG51bSBmb3IgRENVIDAgKEdsb2JhbCBzZXEgbnVtKQorCQkJICovCisJCQlpZiAoYWgtPmFoX21hY19zcmV2IDwgQVI1S19TUkVWX0FSNTIxMSkgeworCisJCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCQkJCXNfc2VxW2ldID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsCisJCQkJCQlBUjVLX1FVRVVFX0RDVV9TRVFOVU0oaSkpOworCisJCQl9IGVsc2UgeworCQkJCXNfc2VxWzBdID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsCisJCQkJCQlBUjVLX1FVRVVFX0RDVV9TRVFOVU0oMCkpOworCQkJfQorCQl9CisKKwkJLyogU2F2ZSBkZWZhdWx0IGFudGVubmEgKi8KKwkJc19hbnQgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19ERUZBVUxUX0FOVEVOTkEpOworCisJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgeworCQkJLyogU2luY2Ugd2UgYXJlIGdvaW5nIHRvIHdyaXRlIHJmIGJ1ZmZlcgorCQkJICogY2hlY2sgaWYgd2UgaGF2ZSBhbnkgcGVuZGluZyBnYWluX0YKKwkJCSAqIG9wdGltaXphdGlvbiBzZXR0aW5ncyAqLworCQkJaWYgKGNoYW5nZV9jaGFubmVsICYmIGFoLT5haF9yZl9iYW5rcyAhPSBOVUxMKQorCQkJCWF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShhaCk7CisJCX0KKwl9CisKKwkvKkdQSU9zKi8KKwlzX2xlZFswXSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BDSUNGRykgJgorCQkJCQlBUjVLX1BDSUNGR19MRURTVEFURTsKKwlzX2xlZFsxXSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0dQSU9DUik7CisJc19sZWRbMl0gPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19HUElPRE8pOworCisJLyogQVI1S19TVEFfSUQxIGZsYWdzLCBvbmx5IHByZXNlcnZlIGFudGVubmEKKwkgKiBzZXR0aW5ncyBhbmQgYWNrL2N0cyByYXRlIG1vZGUgKi8KKwlzdGFpZDFfZmxhZ3MgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19TVEFfSUQxKSAmCisJCQkoQVI1S19TVEFfSUQxX0RFRkFVTFRfQU5URU5OQSB8CisJCQlBUjVLX1NUQV9JRDFfREVTQ19BTlRFTk5BIHwKKwkJCUFSNUtfU1RBX0lEMV9SVFNfREVGX0FOVEVOTkEgfAorCQkJQVI1S19TVEFfSUQxX0FDS0NUU182TUIgfAorCQkJQVI1S19TVEFfSUQxX0JBU0VfUkFURV8xMUIgfAorCQkJQVI1S19TVEFfSUQxX1NFTEZHRU5fREVGX0FOVCk7CisKKwkvKiBXYWtldXAgdGhlIGRldmljZSAqLworCXJldCA9IGF0aDVrX2h3X25pY193YWtldXAoYWgsIGNoYW5uZWwtPmh3X3ZhbHVlLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogUEhZIGFjY2VzcyBlbmFibGUgKi8KKwlpZiAoYWgtPmFoX21hY19zcmV2ID49IEFSNUtfU1JFVl9BUjUyMTEpCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfU0hJRlRfNUdIWiwgQVI1S19QSFkoMCkpOworCWVsc2UKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9TSElGVF81R0haIHwgMHg0MCwKKwkJCQkJCQlBUjVLX1BIWSgwKSk7CisKKwkvKiBXcml0ZSBpbml0aWFsIHNldHRpbmdzICovCisJcmV0ID0gYXRoNWtfaHdfd3JpdGVfaW5pdHZhbHMoYWgsIG1vZGUsIGNoYW5nZV9jaGFubmVsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiA1MjExLzUyMTIgU3BlY2lmaWMKKwkgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKKworCQkvKgorCQkgKiBXcml0ZSBpbml0aWFsIFJGIGdhaW4gc2V0dGluZ3MKKwkJICogVGhpcyBzaG91bGQgd29yayBmb3IgYm90aCA1MTExLzUxMTIKKwkJICovCisJCXJldCA9IGF0aDVrX2h3X3JmZ2Fpbl9pbml0KGFoLCBmcmVxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJbWRlbGF5KDEpOworCisJCS8qCisJCSAqIFR3ZWFrIGluaXR2YWwgc2V0dGluZ3MgZm9yIHJldmlzZWQKKwkJICogY2hpcHNldHMgYW5kIGFkZCBzb21lIG1vcmUgY29uZmlnCisJCSAqIGJpdHMKKwkJICovCisJCWF0aDVrX2h3X3R3ZWFrX2luaXR2YWxfc2V0dGluZ3MoYWgsIGNoYW5uZWwpOworCisJCS8qCisJCSAqIFNldCBUWCBwb3dlciAoRklYTUUpCisJCSAqLworCQlyZXQgPSBhdGg1a19od190eHBvd2VyKGFoLCBjaGFubmVsLCBlZV9tb2RlLAorCQkJCQlBUjVLX1RVTkVfREVGQVVMVF9UWFBPV0VSKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogV3JpdGUgcmF0ZSBkdXJhdGlvbiB0YWJsZSBvbmx5IG9uIEFSNTIxMiAqLworCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCisJCQlhdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uKGFoLCBtb2RlKTsKKworCQkvKgorCQkgKiBXcml0ZSBSRiBidWZmZXIKKwkJICovCisJCXJldCA9IGF0aDVrX2h3X3JmcmVnc19pbml0KGFoLCBjaGFubmVsLCBtb2RlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKworCQkvKiBXcml0ZSBPRkRNIHRpbWluZ3Mgb24gNTIxMiovCisJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMiAmJgorCQkJY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMX09GRE0pIHsKKwkJCXJldCA9IGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncyhhaCwgY2hhbm5lbCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKkVuYWJsZS9kaXNhYmxlIDgwMi4xMWIgbW9kZSBvbiA1MTExCisJCShlbmFibGUgMjExMSBmcmVxdWVuY3kgY29udmVydGVyICsgQ0NLKSovCisJCWlmIChhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTEpIHsKKwkJCWlmIChtb2RlID09IEFSNUtfTU9ERV8xMUIpCisJCQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfVFhDRkcsCisJCQkJICAgIEFSNUtfVFhDRkdfQl9NT0RFKTsKKwkJCWVsc2UKKwkJCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfVFhDRkcsCisJCQkJICAgIEFSNUtfVFhDRkdfQl9NT0RFKTsKKwkJfQorCisJCS8qCisJCSAqIEluIGNhc2UgYSBmaXhlZCBhbnRlbm5hIHdhcyBzZXQgYXMgZGVmYXVsdAorCQkgKiB3cml0ZSB0aGUgc2FtZSBzZXR0aW5ncyBvbiBib3RoIEFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEUKKwkJICogcmVnaXN0ZXJzLgorCQkgKi8KKwkJaWYgKHNfYW50ICE9IDApIHsKKwkJCWlmIChzX2FudCA9PSBBUjVLX0FOVF9GSVhFRF9BKSAvKiAxIC0gTWFpbiAqLworCQkJCWFudFswXSA9IGFudFsxXSA9IEFSNUtfQU5UX0ZJWEVEX0E7CisJCQllbHNlCS8qIDIgLSBBdXggKi8KKwkJCQlhbnRbMF0gPSBhbnRbMV0gPSBBUjVLX0FOVF9GSVhFRF9COworCQl9IGVsc2UgeworCQkJYW50WzBdID0gQVI1S19BTlRfRklYRURfQTsKKwkJCWFudFsxXSA9IEFSNUtfQU5UX0ZJWEVEX0I7CisJCX0KKworCQkvKiBDb21taXQgdmFsdWVzIGZyb20gRUVQUk9NICovCisJCWF0aDVrX2h3X2NvbW1pdF9lZXByb21fc2V0dGluZ3MoYWgsIGNoYW5uZWwsIGFudCwgZWVfbW9kZSk7CisKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3IgNTIxMCB3ZSBkbyBhbGwgaW5pdGlhbGl6YXRpb24gdXNpbmcKKwkJICogaW5pdHZhbHMsIHNvIHdlIGRvbid0IGhhdmUgdG8gbW9kaWZ5CisJCSAqIGFueSBzZXR0aW5ncyAoNTIxMCBhbHNvIG9ubHkgc3VwcG9ydHMKKwkJICogYS9hdHVyYm8gbW9kZXMpCisJCSAqLworCQltZGVsYXkoMSk7CisJCS8qIERpc2FibGUgcGh5IGFuZCB3YWl0ICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfQUNUX0RJU0FCTEUsIEFSNUtfUEhZX0FDVCk7CisJCW1kZWxheSgxKTsKKwl9CisKKwkvKgorCSAqIFJlc3RvcmUgc2F2ZWQgdmFsdWVzCisJICovCisKKwkvKkRDVS9BbnRlbm5hIHNlbGVjdGlvbiBub3QgYXZhaWxhYmxlIG9uIDUyMTAqLworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCisJCWlmIChjaGFuZ2VfY2hhbm5lbCkgeworCQkJaWYgKGFoLT5haF9tYWNfc3JldiA8IEFSNUtfU1JFVl9BUjUyMTEpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzX3NlcVtpXSwKKwkJCQkJCUFSNUtfUVVFVUVfRENVX1NFUU5VTShpKSk7CisJCQl9IGVsc2UgeworCQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc19zZXFbMF0sCisJCQkJCUFSNUtfUVVFVUVfRENVX1NFUU5VTSgwKSk7CisJCQl9CisJCX0KKworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNfYW50LCBBUjVLX0RFRkFVTFRfQU5URU5OQSk7CisJfQorCisJLyogTGVkc3RhdGUgKi8KKwlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QQ0lDRkcsIHNfbGVkWzBdKTsKKworCS8qIEdwaW8gc2V0dGluZ3MgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNfbGVkWzFdLCBBUjVLX0dQSU9DUik7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzX2xlZFsyXSwgQVI1S19HUElPRE8pOworCisJLyogUmVzdG9yZSBzdGFfaWQgZmxhZ3MgYW5kIHByZXNlcnZlIG91ciBtYWMgYWRkcmVzcyovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0xPV19JRChhaC0+YWhfc3RhX2lkKSwKKwkJCQkJCUFSNUtfU1RBX0lEMCk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzdGFpZDFfZmxhZ3MgfCBBUjVLX0hJR0hfSUQoYWgtPmFoX3N0YV9pZCksCisJCQkJCQlBUjVLX1NUQV9JRDEpOworCisKKwkvKgorCSAqIENvbmZpZ3VyZSBQQ1UKKwkgKi8KKworCS8qIFJlc3RvcmUgYnNzaWQgYW5kIGJzc2lkIG1hc2sgKi8KKwkvKiBYWFg6IGFkZCBhaC0+YWlkIG9uY2UgbWFjODAyMTEgZ2l2ZXMgdGhpcyB0byB1cyAqLworCWF0aDVrX2h3X3NldF9hc3NvY2lkKGFoLCBhaC0+YWhfYnNzaWQsIDApOworCisJLyogU2V0IFBDVSBjb25maWcgKi8KKwlhdGg1a19od19zZXRfb3Btb2RlKGFoKTsKKworCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMKKwkgKiBQSVNSL1NJU1IgTm90IGF2YWlsYWJsZSBvbiA1MjEwICovCisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4ZmZmZmZmZmYsIEFSNUtfUElTUik7CisKKwkvKiBTZXQgUlNTSS9CUlNTSSB0aHJlc2hvbGRzCisJICoKKwkgKiBOb3RlOiBJZiB3ZSBkZWNpZGUgdG8gc2V0IHRoaXMgdmFsdWUKKwkgKiBkeW5hbWljYWx5LCBoYXZlIGluIG1pbmQgdGhhdCB3aGVuIEFSNUtfUlNTSV9USFIKKwkgKiByZWdpc3RlciBpcyByZWFkIGl0IG1pZ2h0IHJldHVybiAweDQwIGlmIHdlIGhhdmVuJ3QKKwkgKiB3cm90ZSBhbnl0aGluZyB0byBpdCBwbHVzIEJNSVNTIFJTU0kgdGhyZXNob2xkIGlzIHplcm9lZC4KKwkgKiBTbyBkb2luZyBhIHNhdmUvcmVzdG9yZSBwcm9jZWR1cmUgaGVyZSBpc24ndCB0aGUgcmlnaHQKKwkgKiBjaG9pY2UuIEluc3RlYWQgc3RvcmUgaXQgb24gYXRoNWtfaHcgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIChBUjVLX1RVTkVfUlNTSV9USFJFUyB8CisJCQkJQVI1S19UVU5FX0JNSVNTX1RIUkVTIDw8CisJCQkJQVI1S19SU1NJX1RIUl9CTUlTU19TKSwKKwkJCQlBUjVLX1JTU0lfVEhSKTsKKworCS8qIE1JQyBRb1Mgc3VwcG9ydCAqLworCWlmIChhaC0+YWhfbWFjX3NyZXYgPj0gQVI1S19TUkVWX0FSMjQxMykgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMTAwYWEsIEFSNUtfTUlDX1FPU19DVEwpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDMyMTAsIEFSNUtfTUlDX1FPU19TRUwpOworCX0KKworCS8qIFFvUyBOT0FDSyBQb2xpY3kgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJQVI1S19SRUdfU00oMiwgQVI1S19RT1NfTk9BQ0tfMkJJVF9WQUxVRVMpIHwKKwkJCUFSNUtfUkVHX1NNKDUsIEFSNUtfUU9TX05PQUNLX0JJVF9PRkZTRVQpICB8CisJCQlBUjVLX1JFR19TTSgwLCBBUjVLX1FPU19OT0FDS19CWVRFX09GRlNFVCksCisJCQlBUjVLX1FPU19OT0FDSyk7CisJfQorCisKKwkvKgorCSAqIENvbmZpZ3VyZSBQSFkKKwkgKi8KKworCS8qIFNldCBjaGFubmVsIG9uIFBIWSAqLworCXJldCA9IGF0aDVrX2h3X2NoYW5uZWwoYWgsIGNoYW5uZWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEVuYWJsZSB0aGUgUEhZIGFuZCB3YWl0IHVudGlsIGNvbXBsZXRpb24KKwkgKiBUaGlzIGluY2x1ZGVzIEJhc2VCYW5kIGFuZCBTeW50aGVzaXplcgorCSAqIGFjdGl2YXRpb24uCisJICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9BQ1RfRU5BQkxFLCBBUjVLX1BIWV9BQ1QpOworCisJLyoKKwkgKiBPbiA1MjExKyByZWFkIGFjdGl2YXRpb24gLT4gcnggZGVsYXkKKwkgKiBhbmQgdXNlIGl0LgorCSAqCisJICogVE9ETzogSGFsZi9xdWFydGVyIHJhdGUgc3VwcG9ydAorCSAqLworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCQl1MzIgZGVsYXk7CisJCWRlbGF5ID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1JYX0RFTEFZKSAmCisJCQlBUjVLX1BIWV9SWF9ERUxBWV9NOworCQlkZWxheSA9IChjaGFubmVsLT5od192YWx1ZSAmIENIQU5ORUxfQ0NLKSA/CisJCQkoKGRlbGF5IDw8IDIpIC8gMjIpIDogKGRlbGF5IC8gMTApOworCisJCXVkZWxheSgxMDAgKyAoMiAqIGRlbGF5KSk7CisJfSBlbHNlIHsKKwkJbWRlbGF5KDEpOworCX0KKworCS8qCisJICogUGVyZm9ybSBBREMgdGVzdCB0byBzZWUgaWYgYmFzZWJhbmQgaXMgcmVhZHkKKwkgKiBTZXQgdHggaG9sZCBhbmQgY2hlY2sgYWRjIHRlc3QgcmVnaXN0ZXIKKwkgKi8KKwlwaHlfdHN0MSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9UU1QxKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX1RTVDFfVFhIT0xELCBBUjVLX1BIWV9UU1QxKTsKKwlmb3IgKGkgPSAwOyBpIDw9IDIwOyBpKyspIHsKKwkJaWYgKCEoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0FEQ19URVNUKSAmIDB4MTApKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMDApOworCX0KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHBoeV90c3QxLCBBUjVLX1BIWV9UU1QxKTsKKworCS8qCisJICogU3RhcnQgYXV0b21hdGljIGdhaW4gY29udHJvbCBjYWxpYnJhdGlvbgorCSAqCisJICogRHVyaW5nIEFHQyBjYWxpYnJhdGlvbiBSWCBwYXRoIGlzIHJlLXJvdXRlZCB0bworCSAqIGEgcG93ZXIgZGV0ZWN0b3Igc28gd2UgZG9uJ3QgcmVjZWl2ZSBhbnl0aGluZy4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY2FsaWJyYXRlIHNvbWUgc3RhdGljIG9mZnNldHMKKwkgKiB1c2VkIHRvZ2V0aGVyIHdpdGggb24tdGhlIGZseSBJL1EgY2FsaWJyYXRpb24gKHRoZQorCSAqIG9uZSBwZXJmb3JtZWQgdmlhIGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUpLCB0aGF0IGRvZXNuJ3QKKwkgKiBpbnRlcnJ1cHQgcnggcGF0aC4KKwkgKgorCSAqIFdoaWxlIHJ4IHBhdGggaXMgcmUtcm91dGVkIHRvIHRoZSBwb3dlciBkZXRlY3RvciB3ZSBhbHNvCisJICogc3RhcnQgYSBub2lzZSBmbG9vciBjYWxpYnJhdGlvbiwgdG8gbWVhc3VyZSB0aGUKKwkgKiBjYXJkJ3Mgbm9pc2UgZmxvb3IgKHRoZSBub2lzZSB3ZSBtZWFzdXJlIHdoZW4gd2UgYXJlIG5vdAorCSAqIHRyYW5zbWl0aW5nIG9yIHJlY2VpdmluZyBhbnl0aGluZykuCisJICoKKwkgKiBJZiB3ZSBhcmUgaW4gYSBub2lzeSBlbnZpcm9ubWVudCBBR0MgY2FsaWJyYXRpb24gbWF5IHRpbWUKKwkgKiBvdXQgYW5kL29yIG5vaXNlIGZsb29yIGNhbGlicmF0aW9uIG1pZ2h0IHRpbWVvdXQuCisJICovCisJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0FHQ0NUTCwKKwkJCQlBUjVLX1BIWV9BR0NDVExfQ0FMKTsKKworCS8qIEF0IHRoZSBzYW1lIHRpbWUgc3RhcnQgSS9RIGNhbGlicmF0aW9uIGZvciBRQU0gY29uc3RlbGxhdGlvbgorCSAqIC1ubyBuZWVkIGZvciBDQ0stICovCisJYWgtPmFoX2NhbGlicmF0aW9uID0gMDsKKwlpZiAoIShtb2RlID09IEFSNUtfTU9ERV8xMUIpKSB7CisJCWFoLT5haF9jYWxpYnJhdGlvbiA9IDE7CisJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX0lRLAorCQkJCUFSNUtfUEhZX0lRX0NBTF9OVU1fTE9HX01BWCwgMTUpOworCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfSVEsCisJCQkJQVI1S19QSFlfSVFfUlVOKTsKKwl9CisKKwkvKiBXYWl0IGZvciBnYWluIGNhbGlicmF0aW9uIHRvIGZpbmlzaCAod2UgY2hlY2sgZm9yIEkvUSBjYWxpYnJhdGlvbgorCSAqIGR1cmluZyBhdGg1a19waHlfY2FsaWJyYXRlKSAqLworCWlmIChhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KGFoLCBBUjVLX1BIWV9BR0NDVEwsCisJCQlBUjVLX1BIWV9BR0NDVExfQ0FMLCAwLCAwKSkgeworCQlEQkcoImF0aDVrOiBnYWluIGNhbGlicmF0aW9uIHRpbWVvdXQgKCVkIE1IeilcbiIsCisJCSAgICBjaGFubmVsLT5jZW50ZXJfZnJlcSk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBydW4gTkYgY2FsaWJyYXRpb24gYmVmb3JlIEFHQywgaXQgYWx3YXlzIHRpbWVzIG91dC4KKwkgKiBCaW5hcnkgSEFMIHN0YXJ0cyBORiBhbmQgQUdDIGNhbGlicmF0aW9uIGF0IHRoZSBzYW1lIHRpbWUKKwkgKiBhbmQgb25seSB3YWl0cyBmb3IgQUdDIHRvIGZpbmlzaC4gQWxzbyBpZiBBR0Mgb3IgTkYgY2FsLgorCSAqIHRpbWVzIG91dCwgcmVzZXQgZG9lc24ndCBmYWlsIG9uIGJpbmFyeSBIQUwuIEkgYmVsaWV2ZQorCSAqIHRoYXQncyB3cm9uZyBiZWNhdXNlIHNpbmNlIHJ4IHBhdGggaXMgcm91dGVkIHRvIGEgZGV0ZWN0b3IsCisJICogaWYgY2FsLiBkb2Vzbid0IGZpbmlzaCB3ZSB3b24ndCBoYXZlIFJYLiBTYW0ncyBIQUwgZm9yIEFSNTIxMC81MjExCisJICogZW5hYmxlcyBub2lzZSBmbG9vciBjYWxpYnJhdGlvbiBhZnRlciBvZmZzZXQgY2FsaWJyYXRpb24gYW5kIGlmIG5vaXNlCisJICogZmxvb3IgY2FsaWJyYXRpb24gZmFpbHMsIHJlc2V0IGZhaWxzLiBJIGJlbGlldmUgdGhhdCdzCisJICogYSBiZXR0ZXIgYXBwcm9hY2gsIHdlIGp1c3QgbmVlZCB0byBmaW5kIGEgcG9sbGluZyBpbnRlcnZhbAorCSAqIHRoYXQgc3VpdHMgYmVzdCwgZXZlbiBpZiByZXNldCBjb250aW51ZXMgd2UgbmVlZCB0byBtYWtlCisJICogc3VyZSB0aGF0IHJ4IHBhdGggaXMgcmVhZHkuCisJICovCisJYXRoNWtfaHdfbm9pc2VfZmxvb3JfY2FsaWJyYXRpb24oYWgsIGNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKworCisJLyoKKwkgKiBDb25maWd1cmUgUUNVcy9EQ1VzCisJICovCisKKwkvKiBUT0RPOiBIVyBDb21wcmVzc2lvbiBzdXBwb3J0IGZvciBkYXRhIHF1ZXVlcyAqLworCS8qIFRPRE86IEJ1cnN0IHByZWZldGNoIGZvciBkYXRhIHF1ZXVlcyAqLworCisJLyoKKwkgKiBSZXNldCBxdWV1ZXMgYW5kIHN0YXJ0IGJlYWNvbiB0aW1lcnMgYXQgdGhlIGVuZCBvZiB0aGUgcmVzZXQgcm91dGluZQorCSAqIFRoaXMgYWxzbyBzZXRzIFFDVSBtYXNrIG9uIGVhY2ggRENVIGZvciAxOjEgcWN1IHRvIGRjdSBtYXBwaW5nCisJICogTm90ZTogSWYgd2Ugd2FudCB3ZSBjYW4gYXNzaWduIG11bHRpcGxlIHFjdXMgb24gb25lIGRjdS4KKwkgKi8KKwlyZXQgPSBhdGg1a19od19yZXNldF90eF9xdWV1ZShhaCk7CisJaWYgKHJldCkgeworCQlEQkcoImF0aDVrOiBmYWlsZWQgdG8gcmVzZXQgVFggcXVldWVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogQ29uZmlndXJlIERNQS9JbnRlcnJ1cHRzCisJICovCisKKwkvKgorCSAqIFNldCBSeC9UeCBETUEgQ29uZmlndXJhdGlvbgorCSAqCisJICogU2V0IHN0YW5kYXJkIERNQSBzaXplICgxMjgpLiBOb3RlIHRoYXQKKwkgKiBhIERNQSBzaXplIG9mIDUxMiBjYXVzZXMgcnggb3ZlcnJ1bnMgYW5kIHR4IGVycm9ycworCSAqIG9uIHBjaS1lIGNhcmRzICh0ZXN0ZWQgb24gNTQyNCBidXQgc2luY2Ugcnggb3ZlcnJ1bnMKKwkgKiBhbHNvIG9jY3VyIG9uIDU0MTYvNTQxOCB3aXRoIG1hZHdpZmkgd2Ugc2V0IDEyOAorCSAqIGZvciBhbGwgUENJLUUgY2FyZHMgdG8gYmUgc2FmZSkuCisJICoKKwkgKiBYWFg6IG5lZWQgdG8gY2hlY2sgNTIxMCBmb3IgdGhpcworCSAqIFRPRE86IENoZWNrIG91dCB0eCB0cmlnZXIgbGV2ZWwsIGl0J3MgYWx3YXlzIDY0IG9uIGR1bXBzIGJ1dCBJCisJICogZ3Vlc3Mgd2UgY2FuIHR3ZWFrIGl0IGFuZCBzZWUgaG93IGl0IGdvZXMgOy0pCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7CisJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfVFhDRkcsCisJCQlBUjVLX1RYQ0ZHX1NETUFNUiwgQVI1S19ETUFTSVpFXzEyOEIpOworCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1JYQ0ZHLAorCQkJQVI1S19SWENGR19TRE1BTVcsIEFSNUtfRE1BU0laRV8xMjhCKTsKKwl9CisKKwkvKiBQcmUtZW5hYmxlIGludGVycnVwdHMgb24gNTIxMS81MjEyKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApCisJCWF0aDVrX2h3X3NldF9pbXIoYWgsIGFoLT5haF9pbXIpOworCisJLyoKKwkgKiBTZXR1cCBSRktpbGwgaW50ZXJydXB0IGlmIHJma2lsbCBmbGFnIGlzIHNldCBvbiBlZXByb20uCisJICogVE9ETzogVXNlIGdwaW8gcGluIGFuZCBwb2xhcml0eSBpbmZvcyBmcm9tIGVlcHJvbQorCSAqIFRPRE86IEhhbmRsZSB0aGlzIGluIGF0aDVrX2ludHIgYmVjYXVzZSBpdCdsbCByZXN1bHQKKwkgKiAJIGEgbmFzdHkgaW50ZXJydXB0IHN0b3JtLgorCSAqLworI2lmIDAKKwlpZiAoQVI1S19FRVBST01fSERSX1JGS0lMTChhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uZWVfaGVhZGVyKSkgeworCQlhdGg1a19od19zZXRfZ3Bpb19pbnB1dChhaCwgMCk7CisJCWFoLT5haF9ncGlvWzBdID0gYXRoNWtfaHdfZ2V0X2dwaW8oYWgsIDApOworCQlpZiAoYWgtPmFoX2dwaW9bMF0gPT0gMCkKKwkJCWF0aDVrX2h3X3NldF9ncGlvX2ludHIoYWgsIDAsIDEpOworCQllbHNlCisJCQlhdGg1a19od19zZXRfZ3Bpb19pbnRyKGFoLCAwLCAwKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogRGlzYWJsZSBiZWFjb25zIGFuZCByZXNldCB0aGUgcmVnaXN0ZXIKKwkgKi8KKwlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfQkVBQ09OLCBBUjVLX0JFQUNPTl9FTkFCTEUgfAorCQkJQVI1S19CRUFDT05fUkVTRVRfVFNGKTsKKworCXJldHVybiAwOworfQorCisjdW5kZWYgX0FUSDVLX1JFU0VUCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19yZmtpbGwuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2F0aDVrX3Jma2lsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGEyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9hdGg1a19yZmtpbGwuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIFJGS0lMTCBzdXBwb3J0IGZvciBhdGg1aworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBUb2JpYXMgRG9lcmZmZWwgPHRvYmlhcy5kb2VyZmZlbEBnbWFpbC5jb20+CisgKiBMaWdodGx5IG1vZGlmaWVkIGZvciBnUFhFLCBTZXAgMjAwOCBieSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0PgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdyAoIkRpc2NsYWltZXIiKSBhbmQgYW55CisgKiAgICByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24gaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseQorICogICAgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTklORlJJTkdFTUVOVCwgTUVSQ0hBTlRJQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICogT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKK0ZJTEVfTElDRU5DRSAoIE1JVCApOworCisjaW5jbHVkZSAiYmFzZS5oIgorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19yZmtpbGxfZGlzYWJsZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCURCRygiYXRoNWs6IHJma2lsbCBkaXNhYmxlIChncGlvOiVkIHBvbGFyaXR5OiVkKVxuIiwKKwkgICAgc2MtPnJmX2tpbGwuZ3Bpbywgc2MtPnJmX2tpbGwucG9sYXJpdHkpOworCWF0aDVrX2h3X3NldF9ncGlvX291dHB1dChzYy0+YWgsIHNjLT5yZl9raWxsLmdwaW8pOworCWF0aDVrX2h3X3NldF9ncGlvKHNjLT5haCwgc2MtPnJmX2tpbGwuZ3BpbywgIXNjLT5yZl9raWxsLnBvbGFyaXR5KTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNWtfcmZraWxsX2VuYWJsZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCURCRygiYXRoNWs6IHJma2lsbCBlbmFibGUgKGdwaW86JWQgcG9sYXJpdHk6JWQpXG4iLAorCSAgICBzYy0+cmZfa2lsbC5ncGlvLCBzYy0+cmZfa2lsbC5wb2xhcml0eSk7CisJYXRoNWtfaHdfc2V0X2dwaW9fb3V0cHV0KHNjLT5haCwgc2MtPnJmX2tpbGwuZ3Bpbyk7CisJYXRoNWtfaHdfc2V0X2dwaW8oc2MtPmFoLCBzYy0+cmZfa2lsbC5ncGlvLCBzYy0+cmZfa2lsbC5wb2xhcml0eSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19yZmtpbGxfc2V0X2ludHIoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXUzMiBjdXJ2YWw7CisKKwlhdGg1a19od19zZXRfZ3Bpb19pbnB1dChhaCwgc2MtPnJmX2tpbGwuZ3Bpbyk7CisJY3VydmFsID0gYXRoNWtfaHdfZ2V0X2dwaW8oYWgsIHNjLT5yZl9raWxsLmdwaW8pOworCWF0aDVrX2h3X3NldF9ncGlvX2ludHIoYWgsIHNjLT5yZl9raWxsLmdwaW8sIGVuYWJsZSA/CisJCQkgICAgICAgISFjdXJ2YWwgOiAhY3VydmFsKTsKK30KKworc3RhdGljIGludCBfX3VudXNlZAorYXRoNWtfaXNfcmZraWxsX3NldChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCS8qIGNvbmZpZ3VyaW5nIEdQSU8gZm9yIGlucHV0IGZvciBzb21lIHJlYXNvbiBkaXNhYmxlcyByZmtpbGwgKi8KKwkvKmF0aDVrX2h3X3NldF9ncGlvX2lucHV0KHNjLT5haCwgc2MtPnJmX2tpbGwuZ3Bpbyk7Ki8KKwlyZXR1cm4gKGF0aDVrX2h3X2dldF9ncGlvKHNjLT5haCwgc2MtPnJmX2tpbGwuZ3BpbykgPT0KKwkJc2MtPnJmX2tpbGwucG9sYXJpdHkpOworfQorCit2b2lkCithdGg1a19yZmtpbGxfaHdfc3RhcnQoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gYWgtPmFoX3NjOworCisJLyogcmVhZCByZmtpbGwgR1BJTyBjb25maWd1cmF0aW9uIGZyb20gRUVQUk9NIGhlYWRlciAqLworCXNjLT5yZl9raWxsLmdwaW8gPSBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uZWVfcmZraWxsX3BpbjsKKwlzYy0+cmZfa2lsbC5wb2xhcml0eSA9IGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbS5lZV9yZmtpbGxfcG9sOworCisJYXRoNWtfcmZraWxsX2Rpc2FibGUoc2MpOworCisJLyogZW5hYmxlIGludGVycnVwdCBmb3IgcmZraWxsIHN3aXRjaCAqLworCWlmIChBUjVLX0VFUFJPTV9IRFJfUkZLSUxMKGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbS5lZV9oZWFkZXIpKQorCQlhdGg1a19yZmtpbGxfc2V0X2ludHIoc2MsIDEpOworfQorCisKK3ZvaWQKK2F0aDVrX3Jma2lsbF9od19zdG9wKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGFoLT5haF9zYzsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0IGZvciByZmtpbGwgc3dpdGNoICovCisJaWYgKEFSNUtfRUVQUk9NX0hEUl9SRktJTEwoYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tLmVlX2hlYWRlcikpCisJCWF0aDVrX3Jma2lsbF9zZXRfaW50cihzYywgMCk7CisKKwkvKiBlbmFibGUgUkZLSUxMIHdoZW4gc3RvcHBpbmcgSFcgc28gV2lmaSBMRUQgaXMgdHVybmVkIG9mZiAqLworCWF0aDVrX3Jma2lsbF9lbmFibGUoc2MpOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYmFzZS5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGIwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9iYXNlLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDcgU2FtIExlZmZsZXIsIEVycm5vIENvbnN1bHRpbmcKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTW9kaWZpZWQgZm9yIGdQWEUsIEp1bHkgMjAwOSwgYnkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4KKyAqIE9yaWdpbmFsIGZyb20gTGludXgga2VybmVsIDIuNi4zMC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93ICgiRGlzY2xhaW1lciIpIGFuZCBhbnkKKyAqICAgIHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbiBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5CisgKiAgICBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTklORlJJTkdFTUVOVCwgTUVSQ0hBTlRJQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICogT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqLworCisvKgorICogRGVmaW50aW9ucyBmb3IgdGhlIEF0aGVyb3MgV2lyZWxlc3MgTEFOIGNvbnRyb2xsZXIgZHJpdmVyLgorICovCisjaWZuZGVmIF9ERVZfQVRIX0FUSFZBUl9ICisjZGVmaW5lIF9ERVZfQVRIX0FUSFZBUl9ICisKK0ZJTEVfTElDRU5DRSAoIEJTRDMgKTsKKworI2luY2x1ZGUgImF0aDVrLmgiCisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorCisjZGVmaW5lCUFUSF9SWEJVRgkxNgkJLyogbnVtYmVyIG9mIFJYIGJ1ZmZlcnMgKi8KKyNkZWZpbmUJQVRIX1RYQlVGCTE2CQkvKiBudW1iZXIgb2YgVFggYnVmZmVycyAqLworCitzdHJ1Y3QgYXRoNWtfYnVmIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJdW5zaWduZWQgaW50CQlmbGFnczsJLyogcnggZGVzY3JpcHRvciBmbGFncyAqLworCXN0cnVjdCBhdGg1a19kZXNjCSpkZXNjOwkvKiB2aXJ0dWFsIGFkZHIgb2YgZGVzYyAqLworCXUzMgkJCWRhZGRyOwkvKiBwaHlzaWNhbCBhZGRyIG9mIGRlc2MgKi8KKwlzdHJ1Y3QgaW9fYnVmZmVyCSppb2I7CS8qIEkvTyBidWZmZXIgZm9yIGJ1ZiAqLworCXUzMgkJCWlvYmFkZHI7LyogcGh5c2ljYWwgYWRkciBvZiBpb2IgZGF0YSAqLworfTsKKworLyoKKyAqIERhdGEgdHJhbnNtaXQgcXVldWUgc3RhdGUuICBPbmUgb2YgdGhlc2UgZXhpc3RzIGZvciBlYWNoCisgKiBoYXJkd2FyZSB0cmFuc21pdCBxdWV1ZS4gIFBhY2tldHMgc2VudCB0byB1cyBmcm9tIGFib3ZlCisgKiBhcmUgYXNzaWduZWQgdG8gcXVldWVzIGJhc2VkIG9uIHRoZWlyIHByaW9yaXR5LiAgTm90IGFsbAorICogZGV2aWNlcyBzdXBwb3J0IGEgY29tcGxldGUgc2V0IG9mIGhhcmR3YXJlIHRyYW5zbWl0IHF1ZXVlcy4KKyAqIEZvciB0aG9zZSBkZXZpY2VzIHRoZSBhcnJheSBzY19hYzJxIHdpbGwgbWFwIG11bHRpcGxlCisgKiBwcmlvcml0aWVzIHRvIGZld2VyIGhhcmR3YXJlIHF1ZXVlcyAodHlwaWNhbGx5IGFsbCB0byBvbmUKKyAqIGhhcmR3YXJlIHF1ZXVlKS4KKyAqLworc3RydWN0IGF0aDVrX3R4cSB7CisJdW5zaWduZWQgaW50CQlxbnVtOwkvKiBoYXJkd2FyZSBxIG51bWJlciAqLworCXUzMgkJCSpsaW5rOwkvKiBsaW5rIHB0ciBpbiBsYXN0IFRYIGRlc2MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXE7CS8qIHRyYW5zbWl0IHF1ZXVlICovCisJaW50CQkJc2V0dXA7Cit9OworCisjaWYgQ0hBTl9ERUJVRworI2RlZmluZSBBVEhfQ0hBTl9NQVgJKDI2KzI2KzI2KzIwMCsyMDApCisjZWxzZQorI2RlZmluZSBBVEhfQ0hBTl9NQVgJKDE0KzE0KzE0KzI1MisyMCkKKyNlbmRpZgorCisvKiBTb2Z0d2FyZSBDYXJyaWVyLCBrZWVwcyB0cmFjayBvZiB0aGUgZHJpdmVyIHN0YXRlCisgKiBhc3NvY2lhdGVkIHdpdGggYW4gaW5zdGFuY2Ugb2YgYSBkZXZpY2UgKi8KK3N0cnVjdCBhdGg1a19zb2Z0YyB7CisJc3RydWN0IHBjaV9kZXZpY2UJKnBkZXY7CQkvKiBmb3IgZG1hIG1hcHBpbmcgKi8KKwl2b2lkCQkJKmlvYmFzZTsJLyogYWRkcmVzcyBvZiB0aGUgZGV2aWNlICovCisJc3RydWN0IG5ldDgwMjExX2RldmljZQkqZGV2OwkJLyogSUVFRSA4MDIuMTEgY29tbW9uICovCisJc3RydWN0IGF0aDVrX2h3CQkqYWg7CQkvKiBBdGhlcm9zIEhXICovCisJc3RydWN0IG5ldDgwMjExX2h3X2luZm8JKmh3aW5mbzsKKwlpbnQJCQljdXJiYW5kOworCWludAkJCWlycV9lbmE7IAkvKiBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KKworCXN0cnVjdCBhdGg1a19idWYJKmJ1ZnB0cjsJLyogYWxsb2NhdGVkIGJ1ZmZlciBwdHIgKi8KKwlzdHJ1Y3QgYXRoNWtfZGVzYwkqZGVzYzsJCS8qIFRYL1JYIGRlc2NyaXB0b3JzICovCisJdTMyCQkJZGVzY19kYWRkcjsJLyogRE1BIChwaHlzaWNhbCkgYWRkcmVzcyAqLworCXNpemVfdAkJCWRlc2NfbGVuOwkvKiBzaXplIG9mIFRYL1JYIGRlc2NyaXB0b3JzICovCisJdTE2CQkJY2FjaGVsc3o7CS8qIGNhY2hlIGxpbmUgc2l6ZSAqLworCisJaW50CQkJc3RhdHVzOworI2RlZmluZSBBVEhfU1RBVF9JTlZBTElECTB4MDEJCS8qIGRpc2FibGUgaGFyZHdhcmUgYWNjZXNzZXMgKi8KKyNkZWZpbmUgQVRIX1NUQVRfTVJSRVRSWQkweDAyCQkvKiBtdWx0aS1yYXRlIHJldHJ5IHN1cHBvcnQgKi8KKyNkZWZpbmUgQVRIX1NUQVRfUFJPTUlTQwkweDA0CisjZGVmaW5lIEFUSF9TVEFUX0xFRFNPRlQJMHgwOAkJLyogZW5hYmxlIExFRCBncGlvIHN0YXR1cyAqLworI2RlZmluZSBBVEhfU1RBVF9TVEFSVEVECTB4MTAJCS8qIG9wZW5lZCAmIGlycXMgZW5hYmxlZCAqLworCisJdW5zaWduZWQgaW50CQlmaWx0ZXJfZmxhZ3M7CS8qIEhXIGZsYWdzLCBBUjVLX1JYX0ZJTFRFUl8qICovCisJdW5zaWduZWQgaW50CQljdXJtb2RlOwkvKiBjdXJyZW50IHBoeSBtb2RlICovCisJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwJKmN1cmNoYW47CS8qIGN1cnJlbnQgaC93IGNoYW5uZWwgKi8KKworCWVudW0gYXRoNWtfaW50CQlpbWFzazsJCS8qIGludGVycnVwdCBtYXNrIGNvcHkgKi8KKworCXU4CQkJYnNzaWRtYXNrW0VUSF9BTEVOXTsKKworCXVuc2lnbmVkIGludAkJcnhidWZzaXplOwkvKiByeCBzaXplIGJhc2VkIG9uIG10dSAqLworCXN0cnVjdCBsaXN0X2hlYWQJcnhidWY7CQkvKiByZWNlaXZlIGJ1ZmZlciAqLworCXUzMgkJCSpyeGxpbms7CS8qIGxpbmsgcHRyIGluIGxhc3QgUlggZGVzYyAqLworCisJc3RydWN0IGxpc3RfaGVhZAl0eGJ1ZjsJCS8qIHRyYW5zbWl0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGludAkJdHhidWZfbGVuOwkvKiBidWYgY291bnQgaW4gdHhidWYgbGlzdCAqLworCXN0cnVjdCBhdGg1a190eHEJdHhxOwkJLyogdHggcXVldWUgKi8KKworCXN0cnVjdCB7CisJCXUxNiBncGlvOworCQl1bnNpZ25lZCBwb2xhcml0eTsKKwl9IHJmX2tpbGw7CisKKwlpbnQJCQlsYXN0X2NhbGliX3RpY2tzOworCisJaW50IAkJCXBvd2VyX2xldmVsOwkvKiBSZXF1ZXN0ZWQgdHggcG93ZXIgaW4gZGJtICovCisJaW50CQkJYXNzb2M7CQkvKiBhc3NvY2F0ZSBzdGF0ZSAqLworCisJaW50CQkJaHdfcmF0ZTsJLyogSGFyZHdhcmUgdHggcmF0ZSBjb2RlICovCisJaW50CQkJaHdfcnRzY3RzX3JhdGU7CS8qIEhhcmR3YXJlIHJ0cy9jdHMgcmF0ZSBjb2RlICovCit9OworCisjZGVmaW5lIGF0aDVrX2h3X2hhc2Jzc2lkbWFzayhfYWgpIFwKKwkoYXRoNWtfaHdfZ2V0X2NhcGFiaWxpdHkoX2FoLCBBUjVLX0NBUF9CU1NJRE1BU0ssIDAsIE5VTEwpID09IDApCisjZGVmaW5lIGF0aDVrX2h3X2hhc3Zlb2woX2FoKSBcCisJKGF0aDVrX2h3X2dldF9jYXBhYmlsaXR5KF9haCwgQVI1S19DQVBfVkVPTCwgMCwgTlVMTCkgPT0gMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9kZXNjLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9kZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxMWIwZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL2Rlc2MuaApAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoKKyAqIEludGVybmFsIFJYL1RYIGRlc2NyaXB0b3Igc3RydWN0dXJlcworICogKHJYOiByZXNlcnZlZCBmaWVsZHMgcG9zc2liaWx5IHVzZWQgYnkgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBhcjVrIGNoaXBzZXQpCisgKi8KKworLyoKKyAqIGNvbW1vbiBoYXJkd2FyZSBSWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGF0aDVrX2h3X3J4X2N0bCB7CisJdTMyCXJ4X2NvbnRyb2xfMDsgLyogUlggY29udHJvbCB3b3JkIDAgKi8KKwl1MzIJcnhfY29udHJvbF8xOyAvKiBSWCBjb250cm9sIHdvcmQgMSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFJYIGNvbnRyb2wgd29yZCAwIGZpZWxkL3NmbGFncyAqLworI2RlZmluZSBBUjVLX0RFU0NfUlhfQ1RMMAkJCTB4MDAwMDAwMDAKKworLyogUlggY29udHJvbCB3b3JkIDEgZmllbGRzL2ZsYWdzICovCisjZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwxX0JVRl9MRU4JCTB4MDAwMDBmZmYKKyNkZWZpbmUgQVI1S19ERVNDX1JYX0NUTDFfSU5UUkVRCQkweDAwMDAyMDAwCisKKy8qCisgKiBjb21tb24gaGFyZHdhcmUgUlggc3RhdHVzIGRlc2NyaXB0b3IKKyAqIDUyMTAvMTEgYW5kIDUyMTIgZGlmZmVyIG9ubHkgaW4gdGhlIGZsYWdzIGRlZmluZWQgYmVsb3cKKyAqLworc3RydWN0IGF0aDVrX2h3X3J4X3N0YXR1cyB7CisJdTMyCXJ4X3N0YXR1c18wOyAvKiBSWCBzdGF0dXMgd29yZCAwICovCisJdTMyCXJ4X3N0YXR1c18xOyAvKiBSWCBzdGF0dXMgd29yZCAxICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogNTIxMC81MjExICovCisvKiBSWCBzdGF0dXMgd29yZCAwIGZpZWxkcy9mbGFncyAqLworI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX0RBVEFfTEVOCQkweDAwMDAwZmZmCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfTU9SRQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEUJCTB4MDAwNzgwMDAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEVfUwkxNQorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMCTB4MDdmODAwMDAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTF9TCTE5CisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRFTk5BCTB4MzgwMDAwMDAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX0FOVEVOTkFfUwkyNworCisvKiBSWCBzdGF0dXMgd29yZCAxIGZpZWxkcy9mbGFncyAqLworI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0RPTkUJCQkweDAwMDAwMDAxCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRlJBTUVfUkVDRUlWRV9PSwkweDAwMDAwMDAyCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfQ1JDX0VSUk9SCQkweDAwMDAwMDA0CisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRklGT19PVkVSUlVOCQkweDAwMDAwMDA4CisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfREVDUllQVF9DUkNfRVJST1IJMHgwMDAwMDAxMAorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUgkJMHgwMDAwMDBlMAorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUl9TCQk1CisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1ZBTElECTB4MDAwMDAxMDAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVgJCTB4MDAwMDdlMDAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVhfUwkJOQorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1JFQ0VJVkVfVElNRVNUQU1QCTB4MGZmZjgwMDAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUF9TCTE1CisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0NBQ0hFX01JU1MJMHgxMDAwMDAwMAorCisvKiA1MjEyICovCisvKiBSWCBzdGF0dXMgd29yZCAwIGZpZWxkcy9mbGFncyAqLworI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX0RBVEFfTEVOCQkweDAwMDAwZmZmCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfTU9SRQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9ERUNPTVBfQ1JDX0VSUk9SCTB4MDAwMDIwMDAKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEUJCTB4MDAwZjgwMDAKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEVfUwkxNQorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMCTB4MGZmMDAwMDAKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTF9TCTIwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRFTk5BCTB4ZjAwMDAwMDAKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX0FOVEVOTkFfUwkyOAorCisvKiBSWCBzdGF0dXMgd29yZCAxIGZpZWxkcy9mbGFncyAqLworI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0RPTkUJCQkweDAwMDAwMDAxCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfRlJBTUVfUkVDRUlWRV9PSwkweDAwMDAwMDAyCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfQ1JDX0VSUk9SCQkweDAwMDAwMDA0CisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfREVDUllQVF9DUkNfRVJST1IJMHgwMDAwMDAwOAorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUgkJMHgwMDAwMDAxMAorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX01JQ19FUlJPUgkJMHgwMDAwMDAyMAorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWF9WQUxJRAkweDAwMDAwMTAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYCQkweDAwMDBmZTAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1MJCTkKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUAkweDdmZmYwMDAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUkVDRUlWRV9USU1FU1RBTVBfUwkxNgorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9DQUNIRV9NSVNTCTB4ODAwMDAwMDAKKworLyoKKyAqIGNvbW1vbiBoYXJkd2FyZSBSWCBlcnJvciBkZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBhdGg1a19od19yeF9lcnJvciB7CisJdTMyCXJ4X2Vycm9yXzA7IC8qIFJYIHN0YXR1cyB3b3JkIDAgKi8KKwl1MzIJcnhfZXJyb3JfMTsgLyogUlggc3RhdHVzIHdvcmQgMSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFJYIGVycm9yIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S19SWF9ERVNDX0VSUk9SMAkJCTB4MDAwMDAwMDAKKworLyogUlggZXJyb3Igd29yZCAxIGZpZWxkcy9mbGFncyAqLworI2RlZmluZSBBUjVLX1JYX0RFU0NfRVJST1IxX1BIWV9FUlJPUl9DT0RFCTB4MDAwMGZmMDAKKyNkZWZpbmUgQVI1S19SWF9ERVNDX0VSUk9SMV9QSFlfRVJST1JfQ09ERV9TCTgKKworLyogUEhZIEVycm9yIGNvZGVzICovCisjZGVmaW5lIEFSNUtfREVTQ19SWF9QSFlfRVJST1JfTk9ORQkJMHgwMAorI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX1RJTUlORwkJMHgyMAorI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX1BBUklUWQkJMHg0MAorI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX1JBVEUJCTB4NjAKKyNkZWZpbmUgQVI1S19ERVNDX1JYX1BIWV9FUlJPUl9MRU5HVEgJCTB4ODAKKyNkZWZpbmUgQVI1S19ERVNDX1JYX1BIWV9FUlJPUl82NFFBTQkJMHhhMAorI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX1NFUlZJQ0UJCTB4YzAKKyNkZWZpbmUgQVI1S19ERVNDX1JYX1BIWV9FUlJPUl9UUkFOU01JVE9WUgkweGUwCisKKy8qCisgKiA1MjEwLzUyMTEgaGFyZHdhcmUgMi13b3JkIFRYIGNvbnRyb2wgZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgYXRoNWtfaHdfMndfdHhfY3RsIHsKKwl1MzIJdHhfY29udHJvbF8wOyAvKiBUWCBjb250cm9sIHdvcmQgMCAqLworCXUzMgl0eF9jb250cm9sXzE7IC8qIFRYIGNvbnRyb2wgd29yZCAxICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVFggY29udHJvbCB3b3JkIDAgZmllbGRzL2ZsYWdzICovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0ZSQU1FX0xFTgkJMHgwMDAwMGZmZgorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9IRUFERVJfTEVOCQkweDAwMDNmMDAwIC8qWzUyMTAgP10qLworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9IRUFERVJfTEVOX1MJMTIKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfWE1JVF9SQVRFCQkweDAwM2MwMDAwCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX1hNSVRfUkFURV9TCTE4CisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX1JUU0VOQQkJMHgwMDQwMDAwMAorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9DTFJETUFTSwkJMHgwMTAwMDAwMAorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9MT05HX1BBQ0tFVAkweDAwODAwMDAwIC8qWzUyMTBdKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfVkVPTAkJMHgwMDgwMDAwMCAvKls1MjExXSovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0ZSQU1FX1RZUEUJCTB4MWMwMDAwMDAgLypbNTIxMF0qLworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9GUkFNRV9UWVBFX1MJMjYKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVF81MjEwCTB4MDIwMDAwMDAKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVF81MjExCTB4MWUwMDAwMDAKKworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUCQkJXAorCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPwkJXAorCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUXzUyMTAgOglcCisJCUFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfNTIxMSkKKworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUX1MJMjUKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfSU5UUkVRCQkweDIwMDAwMDAwCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0VOQ1JZUFRfS0VZX1ZBTElECTB4NDAwMDAwMDAKKworLyogVFggY29udHJvbCB3b3JkIDEgZmllbGRzL2ZsYWdzICovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0JVRl9MRU4JCTB4MDAwMDBmZmYKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfTU9SRQkJMHgwMDAwMTAwMAorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWF81MjEwCTB4MDAwN2UwMDAKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DUllQVF9LRVlfSU5ERVhfNTIxMQkweDAwMGZlMDAwCisKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DUllQVF9LRVlfSU5ERVgJCQkJXAorCQkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8JCVwKKwkJCUFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYXzUyMTAgOglcCisJCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWF81MjExKQorCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYX1MJMTMKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRlJBTUVfVFlQRQkJMHgwMDcwMDAwMCAvKls1MjExXSovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0ZSQU1FX1RZUEVfUwkyMAorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9OT0FDSwkJMHgwMDgwMDAwMCAvKls1MjExXSovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX1JUU19EVVJBVElPTgkweGZmZjgwMDAwIC8qWzUyMTAgP10qLworCisvKiBGcmFtZSB0eXBlcyAqLworI2RlZmluZSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfTk9STUFMICAgMHgwMAorI2RlZmluZSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfQVRJTSAgICAgMHgwNAorI2RlZmluZSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfUFNQT0xMICAgMHgwOAorI2RlZmluZSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfTk9fREVMQVkgMHgwYworI2RlZmluZSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfUElGUyAgICAgMHgxMAorCisvKgorICogNTIxMiBoYXJkd2FyZSA0LXdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBhdGg1a19od180d190eF9jdGwgeworCXUzMgl0eF9jb250cm9sXzA7IC8qIFRYIGNvbnRyb2wgd29yZCAwICovCisKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfRlJBTUVfTEVOCQkweDAwMDAwZmZmCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX1hNSVRfUE9XRVIJCTB4MDAzZjAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfWE1JVF9QT1dFUl9TCTE2CisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX1JUU0VOQQkJMHgwMDQwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9WRU9MCQkweDAwODAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0NMUkRNQVNLCQkweDAxMDAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVQJMHgxZTAwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUX1MJMjUKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfSU5UUkVRCQkweDIwMDAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0VOQ1JZUFRfS0VZX1ZBTElECTB4NDAwMDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfQ1RTRU5BCQkweDgwMDAwMDAwCisKKwl1MzIJdHhfY29udHJvbF8xOyAvKiBUWCBjb250cm9sIHdvcmQgMSAqLworCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0JVRl9MRU4JCTB4MDAwMDBmZmYKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfTU9SRQkJMHgwMDAwMTAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWAkweDAwMGZlMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYX1MJMTMKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfRlJBTUVfVFlQRQkJMHgwMGYwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9GUkFNRV9UWVBFX1MJMjAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfTk9BQ0sJCTB4MDEwMDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9QUk9DCQkweDA2MDAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0NPTVBfUFJPQ19TCTI1CisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0NPTVBfSVZfTEVOCTB4MTgwMDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9JVl9MRU5fUwkyNworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9DT01QX0lDVl9MRU4JMHg2MDAwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9DT01QX0lDVl9MRU5fUwkyOQorCisJdTMyCXR4X2NvbnRyb2xfMjsgLyogVFggY29udHJvbCB3b3JkIDIgKi8KKworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9SVFNfRFVSQVRJT04JCTB4MDAwMDdmZmYKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfRFVSQVRJT05fVVBEQVRFX0VOQUJMRQkweDAwMDA4MDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMwCQkweDAwMGYwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMwX1MJCTE2CisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMxCQkweDAwZjAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMxX1MJCTIwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMyCQkweDBmMDAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMyX1MJCTI0CisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMzCQkweGYwMDAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMzX1MJCTI4CisKKwl1MzIJdHhfY29udHJvbF8zOyAvKiBUWCBjb250cm9sIHdvcmQgMyAqLworCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTAJCTB4MDAwMDAwMWYKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMQkJMHgwMDAwMDNlMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUxX1MJNQorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUyCQkweDAwMDA3YzAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTJfUwkxMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUzCQkweDAwMGY4MDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTNfUwkxNQorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19SVFNfQ1RTX1JBVEUJMHgwMWYwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19SVFNfQ1RTX1JBVEVfUwkyMAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBDb21tb24gVFggc3RhdHVzIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cyB7CisJdTMyCXR4X3N0YXR1c18wOyAvKiBUWCBzdGF0dXMgd29yZCAwICovCisJdTMyCXR4X3N0YXR1c18xOyAvKiBUWCBzdGF0dXMgd29yZCAxICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVFggc3RhdHVzIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfRlJBTUVfWE1JVF9PSwkweDAwMDAwMDAxCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0VYQ0VTU0lWRV9SRVRSSUVTCTB4MDAwMDAwMDIKKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfRklGT19VTkRFUlJVTgkweDAwMDAwMDA0CisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0ZJTFRFUkVECQkweDAwMDAwMDA4CisvKj8/PworI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9SVFNfRkFJTF9DT1VOVAkweDAwMDAwMGYwCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX1JUU19GQUlMX0NPVU5UX1MJNAorKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfU0hPUlRfUkVUUllfQ09VTlQJMHgwMDAwMDBmMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TSE9SVF9SRVRSWV9DT1VOVF9TCTQKKy8qPz8/CisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0RBVEFfRkFJTF9DT1VOVAkweDAwMDAwZjAwCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0RBVEFfRkFJTF9DT1VOVF9TCTgKKyovCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0xPTkdfUkVUUllfQ09VTlQJMHgwMDAwMGYwMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9MT05HX1JFVFJZX0NPVU5UX1MJOAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9WSVJUX0NPTExfQ09VTlQJMHgwMDAwZjAwMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9WSVJUX0NPTExfQ09VTlRfUwkxMgorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TRU5EX1RJTUVTVEFNUAkweGZmZmYwMDAwCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX1NFTkRfVElNRVNUQU1QX1MJMTYKKworLyogVFggc3RhdHVzIHdvcmQgMSBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfRE9ORQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9TRVFfTlVNCQkweDAwMDAxZmZlCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX1NFUV9OVU1fUwkJMQorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9BQ0tfU0lHX1NUUkVOR1RICTB4MDAxZmUwMDAKKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfQUNLX1NJR19TVFJFTkdUSF9TCTEzCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0ZJTkFMX1RTX0lOREVYCTB4MDA2MDAwMDAKKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfRklOQUxfVFNfSU5ERVhfUwkyMQorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9DT01QX1NVQ0NFU1MJMHgwMDgwMDAwMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9YTUlUX0FOVEVOTkEJMHgwMTAwMDAwMAorCisvKgorICogNTIxMC81MjExIGhhcmR3YXJlIFRYIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGF0aDVrX2h3XzUyMTBfdHhfZGVzYyB7CisJc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bAl0eF9jdGw7CisJc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwl0eF9zdGF0OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiA1MjEyIGhhcmR3YXJlIFRYIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGF0aDVrX2h3XzUyMTJfdHhfZGVzYyB7CisJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bAl0eF9jdGw7CisJc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwl0eF9zdGF0OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBjb21tb24gaGFyZHdhcmUgUlggZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgYXRoNWtfaHdfYWxsX3J4X2Rlc2MgeworCXN0cnVjdCBhdGg1a19od19yeF9jdGwJCQlyeF9jdGw7CisJdW5pb24geworCQlzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzCXJ4X3N0YXQ7CisJCXN0cnVjdCBhdGg1a19od19yeF9lcnJvcglyeF9lcnI7CisJfSB1OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBBdGhlcm9zIGhhcmR3YXJlIGRlc2NyaXB0b3IKKyAqIFRoaXMgaXMgcmVhZCBhbmQgd3JpdHRlbiB0byBieSB0aGUgaGFyZHdhcmUKKyAqLworc3RydWN0IGF0aDVrX2Rlc2MgeworCXUzMglkc19saW5rOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KKwl1MzIJZHNfZGF0YTsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciAoc2tiKSAqLworCisJdW5pb24geworCQlzdHJ1Y3QgYXRoNWtfaHdfNTIxMF90eF9kZXNjCWRzX3R4NTIxMDsKKwkJc3RydWN0IGF0aDVrX2h3XzUyMTJfdHhfZGVzYwlkc190eDUyMTI7CisJCXN0cnVjdCBhdGg1a19od19hbGxfcnhfZGVzYwlkc19yeDsKKwl9IHVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgQVI1S19SWERFU0NfSU5UUkVRCTB4MDAyMAorCisjZGVmaW5lIEFSNUtfVFhERVNDX0NMUkRNQVNLCTB4MDAwMQorI2RlZmluZSBBUjVLX1RYREVTQ19OT0FDSwkweDAwMDIJLypbNTIxMStdKi8KKyNkZWZpbmUgQVI1S19UWERFU0NfUlRTRU5BCTB4MDAwNAorI2RlZmluZSBBUjVLX1RYREVTQ19DVFNFTkEJMHgwMDA4CisjZGVmaW5lIEFSNUtfVFhERVNDX0lOVFJFUQkweDAwMTAKKyNkZWZpbmUgQVI1S19UWERFU0NfVkVPTAkweDAwMjAJLypbNTIxMStdKi8KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvZWVwcm9tLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9lZXByb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ1NDMzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvZWVwcm9tLmgKQEAgLTAsMCArMSw0NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKKy8qCisgKiBDb21tb24gYXI1eHh4IEVFUFJPTSBkYXRhIG9mZnNldHMgKHNldCB0aGVzZSBvbiBBUjVLX0VFUFJPTV9CQVNFKQorICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX01BR0lDCQkweDAwM2QJLyogRUVQUk9NIE1hZ2ljIG51bWJlciAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9NQUdJQ19WQUxVRQkJMHg1YWE1CS8qIERlZmF1bHQgLSBmb3VuZCBvbiBFRVBST00gKi8KKyNkZWZpbmUgQVI1S19FRVBST01fTUFHSUNfNTIxMgkJMHgwMDAwMTQ1YyAvKiA1MjEyICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX01BR0lDXzUyMTEJCTB4MDAwMDE0NWIgLyogNTIxMSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9NQUdJQ181MjEwCQkweDAwMDAxNDVhIC8qIDUyMTAgKi8KKworI2RlZmluZQlBUjVLX0VFUFJPTV9JU19IQjYzCQkweDAwMGIJLyogVGFsb24gZGV0ZWN0ICovCisKKyNkZWZpbmUgQVI1S19FRVBST01fUkZLSUxMCQkweDBmCisjZGVmaW5lIEFSNUtfRUVQUk9NX1JGS0lMTF9HUElPX1NFTAkweDAwMDAwMDFjCisjZGVmaW5lIEFSNUtfRUVQUk9NX1JGS0lMTF9HUElPX1NFTF9TCTIKKyNkZWZpbmUgQVI1S19FRVBST01fUkZLSUxMX1BPTEFSSVRZCTB4MDAwMDAwMDIKKyNkZWZpbmUgQVI1S19FRVBST01fUkZLSUxMX1BPTEFSSVRZX1MJMQorCisjZGVmaW5lIEFSNUtfRUVQUk9NX1JFR19ET01BSU4JCTB4MDBiZgkvKiBFRVBST00gcmVnZG9tICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NIRUNLU1VNCQkweDAwYzAJLyogRUVQUk9NIGNoZWNrc3VtICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0lORk9fQkFTRQkJMHgwMGMwCS8qIEVFUFJPTSBoZWFkZXIgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fSU5GT19NQVgJCSgweDQwMCAtIEFSNUtfRUVQUk9NX0lORk9fQkFTRSkKKyNkZWZpbmUgQVI1S19FRVBST01fSU5GT19DS1NVTQkJMHhmZmZmCisjZGVmaW5lIEFSNUtfRUVQUk9NX0lORk8oX24pCQkoQVI1S19FRVBST01fSU5GT19CQVNFICsgKF9uKSkKKworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OCQlBUjVLX0VFUFJPTV9JTkZPKDEpCS8qIEVFUFJPTSBWZXJzaW9uICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fM18wCQkweDMwMDAJLyogTm8gaWRlYSB3aGF0J3MgZ29pbmcgb24gYmVmb3JlIHRoaXMgdmVyc2lvbiAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMQkJMHgzMDAxCS8qIG9iL2RiIHZhbHVlcyBmb3IgMkdoeiAoYXI1MjExX3JmcmVncykgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl8zXzIJCTB4MzAwMgkvKiBkaWZmZXJlbnQgZnJlcXVlbmN5IHJlcHJlc2VudGF0aW9uIChlZXByb21fYmluMmZyZXEpICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fM18zCQkweDMwMDMJLyogb2Zmc2V0cyBjaGFuZ2VkLCBoYXMgMzIgQ1RMcyAoc2VlIGJlbG93KSBhbmQgZWVfZmFsc2VfZGV0ZWN0IChlZXByb21fcmVhZF9tb2RlcykgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl8zXzQJCTB4MzAwNAkvKiBoYXMgZWVfaV9nYWluLCBlZV9jY2tfb2ZkbV9wb3dlcl9kZWx0YSAoZWVwcm9tX3JlYWRfbW9kZXMpICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8wCQkweDQwMDAJLyogaGFzIGVlX21pc2MsIGVlX2NhbF9waWVyLCBlZV90dXJib19tYXhfcG93ZXIgYW5kIGVlX3hyX3Bvd2VyIChlZXByb21faW5pdCkgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl80XzEJCTB4NDAwMQkvKiBoYXMgZWVfbWFyZ2luX3R4X3J4IChlZXByb21faW5pdCkgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl80XzIJCTB4NDAwMgkvKiBoYXMgZWVfY2NrX29mZG1fZ2Fpbl9kZWx0YSAoZWVwcm9tX2luaXQpICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8zCQkweDQwMDMJLyogcG93ZXIgY2FsaWJyYXRpb24gY2hhbmdlcyAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfNAkJMHg0MDA0CisjZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fNF81CQkweDQwMDUKKyNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl80XzYJCTB4NDAwNgkvKiBoYXMgZWVfc2NhbGVkX2Nja19kZWx0YSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfNwkJMHgzMDA3CS8qIDQwMDcgPyAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfOQkJMHg0MDA5CS8qIEVBUiBmdXR1cmVwcm9vZmluZyAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzVfMAkJMHg1MDAwCS8qIEhhcyAyNDEzIFBEQURDIGNhbGlicmF0aW9uIGV0YyAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzVfMQkJMHg1MDAxCS8qIEhhcyBjYXBhYmlsaXR5IHZhbHVlcyAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzVfMwkJMHg1MDAzCS8qIEhhcyBzcHVyIG1pdGlnYXRpb24gdGFibGVzICovCisKKyNkZWZpbmUgQVI1S19FRVBST01fTU9ERV8xMUEJCTAKKyNkZWZpbmUgQVI1S19FRVBST01fTU9ERV8xMUIJCTEKKyNkZWZpbmUgQVI1S19FRVBST01fTU9ERV8xMUcJCTIKKworI2RlZmluZSBBUjVLX0VFUFJPTV9IRFIJCQlBUjVLX0VFUFJPTV9JTkZPKDIpCS8qIEhlYWRlciB0aGF0IGNvbnRhaW5zIHRoZSBkZXZpY2UgY2FwcyAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfMTFBKF92KQkJKCgoX3YpID4+IEFSNUtfRUVQUk9NX01PREVfMTFBKSAmIDB4MSkKKyNkZWZpbmUgQVI1S19FRVBST01fSERSXzExQihfdikJCSgoKF92KSA+PiBBUjVLX0VFUFJPTV9NT0RFXzExQikgJiAweDEpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0hEUl8xMUcoX3YpCQkoKChfdikgPj4gQVI1S19FRVBST01fTU9ERV8xMUcpICYgMHgxKQorI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfVF8yR0haX0RJUyhfdikJKCgoX3YpID4+IDMpICYgMHgxKQkvKiBEaXNhYmxlIHR1cmJvIGZvciAyR2h6ICg/KSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfVF81R0haX0RCTShfdikJKCgoX3YpID4+IDQpICYgMHg3ZikJLyogTWF4IHR1cmJvIHBvd2VyIGZvciBhL1hSIG1vZGUgKGVlcHJvbV9pbml0KSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfREVWSUNFKF92KQkoKChfdikgPj4gMTEpICYgMHg3KQorI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfUkZLSUxMKF92KQkoKChfdikgPj4gMTQpICYgMHgxKQkvKiBEZXZpY2UgaGFzIFJGS2lsbCBzdXBwb3J0ICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0hEUl9UXzVHSFpfRElTKF92KQkoKChfdikgPj4gMTUpICYgMHgxKQkvKiBEaXNhYmxlIHR1cmJvIGZvciA1R2h6ICovCisKKyNkZWZpbmUgQVI1S19FRVBST01fUkZLSUxMX0dQSU9fU0VMCTB4MDAwMDAwMWMKKyNkZWZpbmUgQVI1S19FRVBST01fUkZLSUxMX0dQSU9fU0VMX1MJMgorI2RlZmluZSBBUjVLX0VFUFJPTV9SRktJTExfUE9MQVJJVFkJMHgwMDAwMDAwMgorI2RlZmluZSBBUjVLX0VFUFJPTV9SRktJTExfUE9MQVJJVFlfUwkxCisKKy8qIE5ld2VyIEVFUFJPTXMgYXJlIHVzaW5nIGEgZGlmZmVyZW50IG9mZnNldCAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9PRkYoX3YsIF92M18wLCBfdjNfMykgXAorCSgoKF92KSA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMykgPyBfdjNfMyA6IF92M18wKQorCisjZGVmaW5lIEFSNUtfRUVQUk9NX0FOVF9HQUlOKF92KQlBUjVLX0VFUFJPTV9PRkYoX3YsIDB4MDBjNCwgMHgwMGMzKQorI2RlZmluZSBBUjVLX0VFUFJPTV9BTlRfR0FJTl81R0haKF92KQkoKHM4KSgoKF92KSA+PiA4KSAmIDB4ZmYpKQorI2RlZmluZSBBUjVLX0VFUFJPTV9BTlRfR0FJTl8yR0haKF92KQkoKHM4KSgoX3YpICYgMHhmZikpCisKKy8qIE1pc2MgdmFsdWVzIGF2YWlsYWJsZSBzaW5jZSBFRVBST00gNC4wICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX01JU0MwCQlBUjVLX0VFUFJPTV9JTkZPKDQpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0VBUlNUQVJUKF92KQkoKF92KSAmIDB4ZmZmKQorI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfWFIyX0RJUyhfdikJKCgoX3YpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgQVI1S19FRVBST01fSERSX1hSNV9ESVMoX3YpCSgoKF92KSA+PiAxMykgJiAweDEpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0VFTUFQKF92KQkJKCgoX3YpID4+IDE0KSAmIDB4MykKKworI2RlZmluZSBBUjVLX0VFUFJPTV9NSVNDMQkJCUFSNUtfRUVQUk9NX0lORk8oNSkKKyNkZWZpbmUgQVI1S19FRVBST01fVEFSR0VUX1BXUlNUQVJUKF92KQkJKChfdikgJiAweGZmZikKKyNkZWZpbmUgQVI1S19FRVBST01fSEFTMzJLSFpDUllTVEFMKF92KQkJKCgoX3YpID4+IDE0KSAmIDB4MSkKKyNkZWZpbmUgQVI1S19FRVBST01fSEFTMzJLSFpDUllTVEFMX09MRChfdikJKCgoX3YpID4+IDE1KSAmIDB4MSkKKworI2RlZmluZSBBUjVLX0VFUFJPTV9NSVNDMgkJCUFSNUtfRUVQUk9NX0lORk8oNikKKyNkZWZpbmUgQVI1S19FRVBST01fRUVQX0ZJTEVfVkVSU0lPTihfdikJKCgoX3YpID4+IDgpICYgMHhmZikKKyNkZWZpbmUgQVI1S19FRVBST01fRUFSX0ZJTEVfVkVSU0lPTihfdikJKChfdikgJiAweGZmKQorCisjZGVmaW5lIEFSNUtfRUVQUk9NX01JU0MzCQlBUjVLX0VFUFJPTV9JTkZPKDcpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0FSVF9CVUlMRF9OVU0oX3YpCSgoKF92KSA+PiAxMCkgJiAweDNmKQorI2RlZmluZSBBUjVLX0VFUFJPTV9FQVJfRklMRV9JRChfdikJKChfdikgJiAweGZmKQorCisjZGVmaW5lIEFSNUtfRUVQUk9NX01JU0M0CQlBUjVLX0VFUFJPTV9JTkZPKDgpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NBTF9EQVRBX1NUQVJUKF92KQkoKChfdikgPj4gNCkgJiAweGZmZikKKyNkZWZpbmUgQVI1S19FRVBST01fTUFTS19SMChfdikJCSgoKF92KSA+PiAyKSAmIDB4MykKKyNkZWZpbmUgQVI1S19FRVBST01fTUFTS19SMShfdikJCSgoX3YpICYgMHgzKQorCisjZGVmaW5lIEFSNUtfRUVQUk9NX01JU0M1CQlBUjVLX0VFUFJPTV9JTkZPKDkpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NPTVBfRElTKF92KQkoKF92KSAmIDB4MSkKKyNkZWZpbmUgQVI1S19FRVBST01fQUVTX0RJUyhfdikJCSgoKF92KSA+PiAxKSAmIDB4MSkKKyNkZWZpbmUgQVI1S19FRVBST01fRkZfRElTKF92KQkJKCgoX3YpID4+IDIpICYgMHgxKQorI2RlZmluZSBBUjVLX0VFUFJPTV9CVVJTVF9ESVMoX3YpCSgoKF92KSA+PiAzKSAmIDB4MSkKKyNkZWZpbmUgQVI1S19FRVBST01fTUFYX1FDVShfdikJCSgoKF92KSA+PiA0KSAmIDB4ZikKKyNkZWZpbmUgQVI1S19FRVBST01fSEVBVllfQ0xJUF9FTihfdikJKCgoX3YpID4+IDgpICYgMHgxKQorI2RlZmluZSBBUjVLX0VFUFJPTV9LRVlfQ0FDSEVfU0laRShfdikJKCgoX3YpID4+IDEyKSAmIDB4ZikKKworI2RlZmluZSBBUjVLX0VFUFJPTV9NSVNDNgkJQVI1S19FRVBST01fSU5GTygxMCkKKyNkZWZpbmUgQVI1S19FRVBST01fVFhfQ0hBSU5fRElTCSgoX3YpICYgMHg4KQorI2RlZmluZSBBUjVLX0VFUFJPTV9SWF9DSEFJTl9ESVMJKCgoX3YpID4+IDMpICYgMHg4KQorI2RlZmluZSBBUjVLX0VFUFJPTV9GQ0NfTUlEX0VOCQkoKChfdikgPj4gNikgJiAweDEpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0pBUF9VMUVWRU5fRU4JKCgoX3YpID4+IDcpICYgMHgxKQorI2RlZmluZSBBUjVLX0VFUFJPTV9KQVBfVTJfRU4JCSgoKF92KSA+PiA4KSAmIDB4MSkKKyNkZWZpbmUgQVI1S19FRVBST01fSkFQX1UxT0REX0VOCSgoKF92KSA+PiA5KSAmIDB4MSkKKyNkZWZpbmUgQVI1S19FRVBST01fSkFQXzExQV9ORVdfRU4JKCgoX3YpID4+IDEwKSAmIDB4MSkKKworLyogY2FsaWJyYXRpb24gc2V0dGluZ3MgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fTU9ERVNfMTFBKF92KQlBUjVLX0VFUFJPTV9PRkYoX3YsIDB4MDBjNSwgMHgwMGQ0KQorI2RlZmluZSBBUjVLX0VFUFJPTV9NT0RFU18xMUIoX3YpCUFSNUtfRUVQUk9NX09GRihfdiwgMHgwMGQwLCAweDAwZjIpCisjZGVmaW5lIEFSNUtfRUVQUk9NX01PREVTXzExRyhfdikJQVI1S19FRVBST01fT0ZGKF92LCAweDAwZGEsIDB4MDEwZCkKKyNkZWZpbmUgQVI1S19FRVBST01fQ1RMKF92KQkJQVI1S19FRVBST01fT0ZGKF92LCAweDAwZTQsIDB4MDEyOCkJLyogQ29uZm9ybWFuY2UgdGVzdCBsaW1pdHMgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fR1JPVVBTX1NUQVJUKF92KQlBUjVLX0VFUFJPTV9PRkYoX3YsIDB4MDEwMCwgMHgwMTUwKQkvKiBTdGFydCBvZiBHcm91cHMgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fR1JPVVAxX09GRlNFVAkweDAKKyNkZWZpbmUgQVI1S19FRVBST01fR1JPVVAyX09GRlNFVAkweDUKKyNkZWZpbmUgQVI1S19FRVBST01fR1JPVVAzX09GRlNFVAkweDM3CisjZGVmaW5lIEFSNUtfRUVQUk9NX0dST1VQNF9PRkZTRVQJMHg0NgorI2RlZmluZSBBUjVLX0VFUFJPTV9HUk9VUDVfT0ZGU0VUCTB4NTUKKyNkZWZpbmUgQVI1S19FRVBST01fR1JPVVA2X09GRlNFVAkweDY1CisjZGVmaW5lIEFSNUtfRUVQUk9NX0dST1VQN19PRkZTRVQJMHg2OQorI2RlZmluZSBBUjVLX0VFUFJPTV9HUk9VUDhfT0ZGU0VUCTB4NmYKKworI2RlZmluZSBBUjVLX0VFUFJPTV9UQVJHRVRfUFdSX09GRl8xMUEoX3YpCUFSNUtfRUVQUk9NX09GRihfdiwgQVI1S19FRVBST01fR1JPVVBTX1NUQVJUKF92KSArIFwKKwkJCQkJCQkJQVI1S19FRVBST01fR1JPVVA1X09GRlNFVCwgMHgwMDAwKQorI2RlZmluZSBBUjVLX0VFUFJPTV9UQVJHRVRfUFdSX09GRl8xMUIoX3YpCUFSNUtfRUVQUk9NX09GRihfdiwgQVI1S19FRVBST01fR1JPVVBTX1NUQVJUKF92KSArIFwKKwkJCQkJCQkJQVI1S19FRVBST01fR1JPVVA2X09GRlNFVCwgMHgwMDEwKQorI2RlZmluZSBBUjVLX0VFUFJPTV9UQVJHRVRfUFdSX09GRl8xMUcoX3YpCUFSNUtfRUVQUk9NX09GRihfdiwgQVI1S19FRVBST01fR1JPVVBTX1NUQVJUKF92KSArIFwKKwkJCQkJCQkJQVI1S19FRVBST01fR1JPVVA3X09GRlNFVCwgMHgwMDE0KQorCisvKiBbMy4xIC0gMy4zXSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9PQkRCMF8yR0haCQkweDAwZWMKKyNkZWZpbmUgQVI1S19FRVBST01fT0JEQjFfMkdIWgkJMHgwMGVkCisKKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVAkJMHgwMDNmCS8qIEVFUFJPTSBwcm90ZWN0IHN0YXR1cyAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzBfMzEJMHgwMDAxCS8qIFJlYWQgcHJvdGVjdGlvbiBiaXQgZm9yIG9mZnNldHMgMHgwIC0gMHgxZiAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1dSXzBfMzEJMHgwMDAyCS8qIFdyaXRlIHByb3RlY3Rpb24gYml0IGZvciBvZmZzZXRzIDB4MCAtIDB4MWYgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9SRF8zMl82MwkweDAwMDQJLyogMHgyMCAtIDB4M2YgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9XUl8zMl82MwkweDAwMDgKKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9SRF82NF8xMjcJMHgwMDEwCS8qIDB4NDAgLSAweDdmICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfV1JfNjRfMTI3CTB4MDAyMAorI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzEyOF8xOTEJMHgwMDQwCS8qIDB4ODAgLSAweGJmIChyZWdkb20pICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfV1JfMTI4XzE5MQkweDAwODAKKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9SRF8xOTJfMjA3CTB4MDEwMAkvKiAweGMwIC0gMHhjZiAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1dSXzE5Ml8yMDcJMHgwMjAwCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfUkRfMjA4XzIyMwkweDA0MDAJLyogMHhkMCAtIDB4ZGYgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9XUl8yMDhfMjIzCTB4MDgwMAorI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzIyNF8yMzkJMHgxMDAwCS8qIDB4ZTAgLSAweGVmICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfV1JfMjI0XzIzOQkweDIwMDAKKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9SRF8yNDBfMjU1CTB4NDAwMAkvKiAweGYwIC0gMHhmZiAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1dSXzI0MF8yNTUJMHg4MDAwCisKKy8qIFNvbWUgRUVQUk9NIGRlZmluZXMgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fRUVQX1NDQUxFCQkxMDAKKyNkZWZpbmUgQVI1S19FRVBST01fRUVQX0RFTFRBCQkxMAorI2RlZmluZSBBUjVLX0VFUFJPTV9OX01PREVTCQkzCisjZGVmaW5lIEFSNUtfRUVQUk9NX05fNUdIWl9DSEFOCQkxMAorI2RlZmluZSBBUjVLX0VFUFJPTV9OXzJHSFpfQ0hBTgkJMworI2RlZmluZSBBUjVLX0VFUFJPTV9OXzJHSFpfQ0hBTl8yNDEzCTQKKyNkZWZpbmUJQVI1S19FRVBST01fTl8yR0haX0NIQU5fTUFYCTQKKyNkZWZpbmUgQVI1S19FRVBST01fTUFYX0NIQU4JCTEwCisjZGVmaW5lIEFSNUtfRUVQUk9NX05fUFdSX1BPSU5UU181MTExCTExCisjZGVmaW5lIEFSNUtfRUVQUk9NX05fUENEQUMJCTExCisjZGVmaW5lIEFSNUtfRUVQUk9NX05fUEhBU0VfQ0FMCQk1CisjZGVmaW5lIEFSNUtfRUVQUk9NX05fVEVTVF9GUkVRCQk4CisjZGVmaW5lIEFSNUtfRUVQUk9NX05fRURHRVMJCTgKKyNkZWZpbmUgQVI1S19FRVBST01fTl9JTlRFUkNFUFRTCTExCisjZGVmaW5lIEFSNUtfRUVQUk9NX0ZSRVFfTShfdikJCUFSNUtfRUVQUk9NX09GRihfdiwgMHg3ZiwgMHhmZikKKyNkZWZpbmUgQVI1S19FRVBST01fUENEQUNfTQkJMHgzZgorI2RlZmluZSBBUjVLX0VFUFJPTV9QQ0RBQ19TVEFSVAkJMQorI2RlZmluZSBBUjVLX0VFUFJPTV9QQ0RBQ19TVE9QCQk2MworI2RlZmluZSBBUjVLX0VFUFJPTV9QQ0RBQ19TVEVQCQkxCisjZGVmaW5lIEFSNUtfRUVQUk9NX05PTl9FREdFX00JCTB4NDAKKyNkZWZpbmUgQVI1S19FRVBST01fQ0hBTk5FTF9QT1dFUgk4CisjZGVmaW5lIEFSNUtfRUVQUk9NX05fT0JEQgkJNAorI2RlZmluZSBBUjVLX0VFUFJPTV9PQkRCX0RJUwkJMHhmZmZmCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NIQU5ORUxfRElTCQkweGZmCisjZGVmaW5lIEFSNUtfRUVQUk9NX1NDQUxFX09DX0RFTFRBKF94KQkoKChfeCkgKiAyKSAvIDEwKQorI2RlZmluZSBBUjVLX0VFUFJPTV9OX0NUTFMoX3YpCQlBUjVLX0VFUFJPTV9PRkYoX3YsIDE2LCAzMikKKyNkZWZpbmUgQVI1S19FRVBST01fTUFYX0NUTFMJCTMyCisjZGVmaW5lIEFSNUtfRUVQUk9NX05fUERfQ1VSVkVTCQk0CisjZGVmaW5lIEFSNUtfRUVQUk9NX05fWFBEMF9QT0lOVFMJNAorI2RlZmluZSBBUjVLX0VFUFJPTV9OX1hQRDNfUE9JTlRTCTMKKyNkZWZpbmUgQVI1S19FRVBST01fTl9QRF9HQUlOUwkJNAorI2RlZmluZSBBUjVLX0VFUFJPTV9OX1BEX1BPSU5UUwkJNQorI2RlZmluZSBBUjVLX0VFUFJPTV9OX0lOVEVSQ0VQVF8xMF8yR0haCTM1CisjZGVmaW5lIEFSNUtfRUVQUk9NX05fSU5URVJDRVBUXzEwXzVHSFoJNTUKKyNkZWZpbmUgQVI1S19FRVBST01fUE9XRVJfTQkJMHgzZgorI2RlZmluZSBBUjVLX0VFUFJPTV9QT1dFUl9NSU4JCTAKKyNkZWZpbmUgQVI1S19FRVBST01fUE9XRVJfTUFYCQkzMTUwCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BPV0VSX1NURVAJCTUwCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BPV0VSX1RBQkxFX1NJWkUJNjQKKyNkZWZpbmUgQVI1S19FRVBST01fTl9QT1dFUl9MT0NfMTFCCTQKKyNkZWZpbmUgQVI1S19FRVBST01fTl9QT1dFUl9MT0NfMTFHCTYKKyNkZWZpbmUgQVI1S19FRVBST01fSV9HQUlOCQkxMAorI2RlZmluZSBBUjVLX0VFUFJPTV9DQ0tfT0ZETV9ERUxUQQkxNQorI2RlZmluZSBBUjVLX0VFUFJPTV9OX0lRX0NBTAkJMgorCisjZGVmaW5lIEFSNUtfRUVQUk9NX1JFQUQoX28sIF92KSBkbyB7CQkJXAorCXJldCA9IGF0aDVrX2h3X2VlcHJvbV9yZWFkKGFoLCAoX28pLCAmKF92KSk7CVwKKwlpZiAocmV0KQkJCQkJXAorCQlyZXR1cm4gcmV0OwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFSNUtfRUVQUk9NX1JFQURfSERSKF9vLCBfdikJCQkJCVwKKwlBUjVLX0VFUFJPTV9SRUFEKF9vLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uX3YpOwlcCisKK2VudW0gYXRoNWtfYW50X3NldHRpbmcgeworCUFSNUtfQU5UX1ZBUklBQkxFCT0gMCwJLyogdmFyaWFibGUgYnkgcHJvZ3JhbW1pbmcgKi8KKwlBUjVLX0FOVF9GSVhFRF9BCT0gMSwJLyogZml4ZWQgdG8gMTFhIGZyZXF1ZW5jaWVzICovCisJQVI1S19BTlRfRklYRURfQgk9IDIsCS8qIGZpeGVkIHRvIDExYiBmcmVxdWVuY2llcyAqLworCUFSNUtfQU5UX01BWAkJPSAzLAorfTsKKworZW51bSBhdGg1a19jdGxfbW9kZSB7CisJQVI1S19DVExfMTFBID0gMCwKKwlBUjVLX0NUTF8xMUIgPSAxLAorCUFSNUtfQ1RMXzExRyA9IDIsCisJQVI1S19DVExfVFVSQk8gPSAzLAorCUFSNUtfQ1RMX1RVUkJPRyA9IDQsCisJQVI1S19DVExfMkdIVDIwID0gNSwKKwlBUjVLX0NUTF81R0hUMjAgPSA2LAorCUFSNUtfQ1RMXzJHSFQ0MCA9IDcsCisJQVI1S19DVExfNUdIVDQwID0gOCwKKwlBUjVLX0NUTF9NT0RFX00gPSAxNSwKK307CisKKy8qIERlZmF1bHQgQ1RMIGlkcyBmb3IgdGhlIDMgbWFpbiByZWcgZG9tYWlucy4KKyAqIEF0aGVyb3Mgb25seSB1c2VzIHRoZXNlIGJ5IGRlZmF1bHQgYnV0IHZlbmRvcnMKKyAqIGNhbiBoYXZlIHVwIHRvIDMyIGRpZmZlcmVudCBDVExzIGZvciBkaWZmZXJlbnQKKyAqIHNjZW5hcmlvcy4gTm90ZSB0aGF0IHRoZWVzZSB2YWx1ZXMgYXJlIE9SZWQgd2l0aAorICogdGhlIG1vZGUgaWQgKGFib3ZlKSBzbyB3ZSBjYW4gaGF2ZSB1cCB0byAyNCBDVEwKKyAqIGRhdGFzZXRzIG91dCBvZiB0aGVzZSAzIG1haW4gcmVnZG9tYWlucy4gVGhhdCBsZWF2ZXMKKyAqIDggaWRzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdmVuZG9ycyBhbmQgc2luY2UgMHgyMCBpcworICogbWlzc2luZyBmcm9tIEhBTCBzb3VyY2VzIGkgZ3Vlc3MgdGhpcyBpcyB0aGUgc2V0IG9mCisgKiBjdXN0b20gQ1RMcyB2ZW5kb3JzIGNhbiB1c2UuICovCisjZGVmaW5lCUFSNUtfQ1RMX0ZDQwkweDEwCisjZGVmaW5lCUFSNUtfQ1RMX0NVU1RPTQkweDIwCisjZGVmaW5lCUFSNUtfQ1RMX0VUU0kJMHgzMAorI2RlZmluZQlBUjVLX0NUTF9NS0sJMHg0MAorCisvKiBJbmRpY2F0ZXMgYSBDVEwgd2l0aCBvbmx5IG1vZGUgc2V0IGFuZAorICogbm8gcmVnIGRvbWFpbiBtYXBwaW5nLCBzdWNoIENUTHMgYXJlIHVzZWQKKyAqIGZvciB3b3JsZCByb2FtaW5nIGRvbWFpbnMgb3Igc2ltcGx5IHdoZW4KKyAqIGEgcmVnIGRvbWFpbiBpcyBub3Qgc2V0ICovCisjZGVmaW5lCUFSNUtfQ1RMX05PX1JFR0RPTUFJTgkweGYwCisKKy8qIEluZGljYXRlcyBhbiBlbXB0eSAoaW52YWxpZCkgQ1RMICovCisjZGVmaW5lIEFSNUtfQ1RMX05PX0NUTAkJMHhmZgorCisvKiBQZXIgY2hhbm5lbCBjYWxpYnJhdGlvbiBkYXRhLCB1c2VkIGZvciBwb3dlciB0YWJsZSBzZXR1cCAqLworc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvX3JmNTExMSB7CisJLyogUG93ZXIgbGV2ZWxzIGluIGhhbGYgZGJtIHVuaXRzCisJICogZm9yIG9uZSBwb3dlciBjdXJ2ZS4gKi8KKwl1OCBwd3JbQVI1S19FRVBST01fTl9QV1JfUE9JTlRTXzUxMTFdOworCS8qIFBDREFDIHRhYmxlIHN0ZXBzCisJICogZm9yIHRoZSBhYm92ZSB2YWx1ZXMgKi8KKwl1OCBwY2RhY1tBUjVLX0VFUFJPTV9OX1BXUl9QT0lOVFNfNTExMV07CisJLyogU3RhcnRpbmcgUENEQUMgc3RlcCAqLworCXU4IHBjZGFjX21pbjsKKwkvKiBGaW5hbCBQQ0RBQyBzdGVwICovCisJdTggcGNkYWNfbWF4OworfTsKKworc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvX3JmNTExMiB7CisJLyogUG93ZXIgbGV2ZWxzIGluIHF1YXJ0ZXIgZEJtIHVuaXRzCisJICogZm9yIGxvd2VyICgwKSBhbmQgaGlnaGVyICgzKQorCSAqIGxldmVsIGN1cnZlcyBpbiAwLjI1ZEIgdW5pdHMgKi8KKwlzOCBwd3JfeDBbQVI1S19FRVBST01fTl9YUEQwX1BPSU5UU107CisJczggcHdyX3gzW0FSNUtfRUVQUk9NX05fWFBEM19QT0lOVFNdOworCS8qIFBDREFDIHRhYmxlIHN0ZXBzCisJICogZm9yIHRoZSBhYm92ZSB2YWx1ZXMgKi8KKwl1OCBwY2RhY194MFtBUjVLX0VFUFJPTV9OX1hQRDBfUE9JTlRTXTsKKwl1OCBwY2RhY194M1tBUjVLX0VFUFJPTV9OX1hQRDNfUE9JTlRTXTsKK307CisKK3N0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mb19yZjI0MTMgeworCS8qIFN0YXJ0aW5nIHB3ci9wZGRhYyB2YWx1ZXMgKi8KKwlzOCBwd3JfaVtBUjVLX0VFUFJPTV9OX1BEX0dBSU5TXTsKKwl1OCBwZGRhY19pW0FSNUtfRUVQUk9NX05fUERfR0FJTlNdOworCS8qIChwd3IscGRkYWMpIHBvaW50cworCSAqIHBvd2VyIGxldmVscyBpbiAwLjVkQiB1bml0cyAqLworCXM4IHB3cltBUjVLX0VFUFJPTV9OX1BEX0dBSU5TXQorCQlbQVI1S19FRVBST01fTl9QRF9QT0lOVFNdOworCXU4IHBkZGFjW0FSNUtfRUVQUk9NX05fUERfR0FJTlNdCisJCVtBUjVLX0VFUFJPTV9OX1BEX1BPSU5UU107Cit9OworCitlbnVtIGF0aDVrX3Bvd2VydGFibGVfdHlwZSB7CisJQVI1S19QV1JUQUJMRV9QV1JfVE9fUENEQUMgPSAwLAorCUFSNUtfUFdSVEFCTEVfTElORUFSX1BDREFDID0gMSwKKwlBUjVLX1BXUlRBQkxFX1BXUl9UT19QREFEQyA9IDIsCit9OworCitzdHJ1Y3QgYXRoNWtfcGRnYWluX2luZm8geworCXU4IHBkX3BvaW50czsKKwl1OCAqcGRfc3RlcDsKKwkvKiBQb3dlciB2YWx1ZXMgYXJlIGluCisJICogMC4yNWRCIHVuaXRzICovCisJczE2ICpwZF9wd3I7Cit9OworCitzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8geworCS8qIEZyZXF1ZW5jeSAqLworCXUxNglmcmVxOworCS8qIFR4IHBvd2VyIGJvdW5kYXJpZXMgKi8KKwlzMTYJbWF4X3B3cjsKKwlzMTYJbWluX3B3cjsKKwl1bmlvbiB7CisJCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mb19yZjUxMTEgcmY1MTExX2luZm87CisJCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mb19yZjUxMTIgcmY1MTEyX2luZm87CisJCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mb19yZjI0MTMgcmYyNDEzX2luZm87CisJfTsKKwkvKiBSYXcgdmFsdWVzIHVzZWQgYnkgcGh5IGNvZGUKKwkgKiBDdXJ2ZXMgYXJlIHN0b3JlZCBpbiBvcmRlciBmcm9tIGxvd2VyCisJICogZ2FpbiB0byBoaWdoZXIgZ2FpbiAobWF4IHR4cG93ZXIgLT4gbWluIHR4cG93ZXIpICovCisJc3RydWN0IGF0aDVrX3BkZ2Fpbl9pbmZvICpwZF9jdXJ2ZXM7Cit9OworCisvKiBQZXIgcmF0ZSBjYWxpYnJhdGlvbiBkYXRhIGZvciBlYWNoIG1vZGUsCisgKiB1c2VkIGZvciByYXRlIHBvd2VyIHRhYmxlIHNldHVwLgorICogTm90ZTogVmFsdWVzIGluIDAuNWRCIHVuaXRzICovCitzdHJ1Y3QgYXRoNWtfcmF0ZV9wY2FsX2luZm8geworCXUxNglmcmVxOyAvKiBGcmVxdWVuY3kgKi8KKwkvKiBQb3dlciBsZXZlbCBmb3IgNi0yNE1iaXQvcyByYXRlcyBvcgorCSAqIDFNYiByYXRlICovCisJdTE2CXRhcmdldF9wb3dlcl82dG8yNDsKKwkvKiBQb3dlciBsZXZlbCBmb3IgMzZNYml0IHJhdGUgb3IKKwkgKiAyTWIgcmF0ZSAqLworCXUxNgl0YXJnZXRfcG93ZXJfMzY7CisJLyogUG93ZXIgbGV2ZWwgZm9yIDQ4TWJpdCByYXRlIG9yCisJICogNS41TWJpdCByYXRlICovCisJdTE2CXRhcmdldF9wb3dlcl80ODsKKwkvKiBQb3dlciBsZXZlbCBmb3IgNTRNYml0IHJhdGUgb3IKKwkgKiAxMU1iaXQgcmF0ZSAqLworCXUxNgl0YXJnZXRfcG93ZXJfNTQ7Cit9OworCisvKiBQb3dlciBlZGdlcyBmb3IgY29uZm9ybWFuY2UgdGVzdCBsaW1pdHMgKi8KK3N0cnVjdCBhdGg1a19lZGdlX3Bvd2VyIHsKKwl1MTYgZnJlcTsKKwl1MTYgZWRnZTsgLyogaW4gaGFsZiBkQm0gKi8KKwlpbnQgZmxhZzsKK307CisKKy8qIEVFUFJPTSBjYWxpYnJhdGlvbiBkYXRhICovCitzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8geworCisJLyogSGVhZGVyIGluZm9ybWF0aW9uICovCisJdTE2CWVlX21hZ2ljOworCXUxNgllZV9wcm90ZWN0OworCXUxNgllZV9yZWdkb21haW47CisJdTE2CWVlX3ZlcnNpb247CisJdTE2CWVlX2hlYWRlcjsKKwl1MTYJZWVfYW50X2dhaW47CisJdTgJZWVfcmZraWxsX3BpbjsKKwlpbnQJZWVfcmZraWxsX3BvbDsKKwlpbnQJZWVfaXNfaGI2MzsKKwl1MTYJZWVfbWlzYzA7CisJdTE2CWVlX21pc2MxOworCXUxNgllZV9taXNjMjsKKwl1MTYJZWVfbWlzYzM7CisJdTE2CWVlX21pc2M0OworCXUxNgllZV9taXNjNTsKKwl1MTYJZWVfbWlzYzY7CisJdTE2CWVlX2Nja19vZmRtX2dhaW5fZGVsdGE7CisJdTE2CWVlX2Nja19vZmRtX3Bvd2VyX2RlbHRhOworCXUxNgllZV9zY2FsZWRfY2NrX2RlbHRhOworCisJLyogUkYgQ2FsaWJyYXRpb24gc2V0dGluZ3MgKHJlc2V0LCByZnJlZ3MpICovCisJdTE2CWVlX2lfY2FsW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV9xX2NhbFtBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfZml4ZWRfYmlhc1tBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfdHVyYm9fbWF4X3Bvd2VyW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV94cl9wb3dlcltBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfc3dpdGNoX3NldHRsaW5nW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV9hdG5fdHhfcnhbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX2FudF9jb250cm9sW0FSNUtfRUVQUk9NX05fTU9ERVNdW0FSNUtfRUVQUk9NX05fUENEQUNdOworCXUxNgllZV9vYltBUjVLX0VFUFJPTV9OX01PREVTXVtBUjVLX0VFUFJPTV9OX09CREJdOworCXUxNgllZV9kYltBUjVLX0VFUFJPTV9OX01PREVTXVtBUjVLX0VFUFJPTV9OX09CREJdOworCXUxNgllZV90eF9lbmQyeGxuYV9lbmFibGVbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX3R4X2VuZDJ4cGFfZGlzYWJsZVtBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfdHhfZnJtMnhwYV9lbmFibGVbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX3Rocl82MltBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfeGxuYV9nYWluW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV94cGRbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX3hfZ2FpbltBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfaV9nYWluW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV9tYXJnaW5fdHhfcnhbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX3N3aXRjaF9zZXR0bGluZ190dXJib1tBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfbWFyZ2luX3R4X3J4X3R1cmJvW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV9hdG5fdHhfcnhfdHVyYm9bQVI1S19FRVBST01fTl9NT0RFU107CisKKwkvKiBQb3dlciBjYWxpYnJhdGlvbiBkYXRhICovCisJdTE2CWVlX2ZhbHNlX2RldGVjdFtBUjVLX0VFUFJPTV9OX01PREVTXTsKKworCS8qIE51bWJlciBvZiBwZCBnYWluIGN1cnZlcyBwZXIgbW9kZSAqLworCXU4CWVlX3BkX2dhaW5zW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCS8qIEJhY2sgbWFwcGluZyBwZGN1cnZlIG51bWJlciAtPiBwZGN1cnZlIGluZGV4IGluIHBkLT5wZF9jdXJ2ZXMgKi8KKwl1OAllZV9wZGNfdG9faWR4W0FSNUtfRUVQUk9NX05fTU9ERVNdW0FSNUtfRUVQUk9NX05fUERfR0FJTlNdOworCisJdTgJZWVfbl9waWVyc1tBUjVLX0VFUFJPTV9OX01PREVTXTsKKwlzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8JZWVfcHdyX2NhbF9hW0FSNUtfRUVQUk9NX05fNUdIWl9DSEFOXTsKKwlzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8JZWVfcHdyX2NhbF9iW0FSNUtfRUVQUk9NX05fMkdIWl9DSEFOX01BWF07CisJc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvCWVlX3B3cl9jYWxfZ1tBUjVLX0VFUFJPTV9OXzJHSFpfQ0hBTl9NQVhdOworCisJLyogUGVyIHJhdGUgdGFyZ2V0IHBvd2VyIGxldmVscyAqLworCXU4CWVlX3JhdGVfdGFyZ2V0X3B3cl9udW1bQVI1S19FRVBST01fTl9NT0RFU107CisJc3RydWN0IGF0aDVrX3JhdGVfcGNhbF9pbmZvCWVlX3JhdGVfdHB3cl9hW0FSNUtfRUVQUk9NX05fNUdIWl9DSEFOXTsKKwlzdHJ1Y3QgYXRoNWtfcmF0ZV9wY2FsX2luZm8JZWVfcmF0ZV90cHdyX2JbQVI1S19FRVBST01fTl8yR0haX0NIQU5fTUFYXTsKKwlzdHJ1Y3QgYXRoNWtfcmF0ZV9wY2FsX2luZm8JZWVfcmF0ZV90cHdyX2dbQVI1S19FRVBST01fTl8yR0haX0NIQU5fTUFYXTsKKworCS8qIENvbmZvcm1hbmNlIHRlc3QgbGltaXRzIChVbnVzZWQpICovCisJdTgJZWVfY3RsczsKKwl1OAllZV9jdGxbQVI1S19FRVBST01fTUFYX0NUTFNdOworCXN0cnVjdCBhdGg1a19lZGdlX3Bvd2VyIGVlX2N0bF9wd3JbQVI1S19FRVBST01fTl9FREdFUyAqIEFSNUtfRUVQUk9NX01BWF9DVExTXTsKKworCS8qIE5vaXNlIEZsb29yIENhbGlicmF0aW9uIHNldHRpbmdzICovCisJczE2CWVlX25vaXNlX2Zsb29yX3RocltBUjVLX0VFUFJPTV9OX01PREVTXTsKKwlzOAllZV9hZGNfZGVzaXJlZF9zaXplW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXM4CWVlX3BnYV9kZXNpcmVkX3NpemVbQVI1S19FRVBST01fTl9NT0RFU107CisJczgJZWVfYWRjX2Rlc2lyZWRfc2l6ZV90dXJib1tBUjVLX0VFUFJPTV9OX01PREVTXTsKKwlzOAllZV9wZ2FfZGVzaXJlZF9zaXplX3R1cmJvW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXM4CWVlX3BkX2dhaW5fb3ZlcmxhcDsKKworCXUzMgllZV9hbnRlbm5hW0FSNUtfRUVQUk9NX05fTU9ERVNdW0FSNUtfQU5UX01BWF07Cit9OworCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9yZWcuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNzBkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9yZWcuaApAQCAtMCwwICsxLDI1ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBNaWNoYWVsIFRheWxvciA8bWlrZS50YXlsb3JAYXBwcmlvbi5jb20+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKKy8qCisgKiBSZWdpc3RlciB2YWx1ZXMgZm9yIEF0aGVyb3MgNTIxMC81MjExLzUyMTIgY2FyZHMgZnJvbSBPcGVuQlNEJ3MgYXI1aworICogbWFpbnRhaW5lZCBieSBSZXlrIEZsb2V0ZXIKKyAqCisgKiBJIHRyaWVkIHRvIGRvY3VtZW50IHRob3NlIHJlZ2lzdGVycyBieSBsb29raW5nIGF0IGFyNWsgY29kZSwgc29tZQorICogODAyLjExICg4MDIuMTFlIG1vc3RseSkgcGFwZXJzIGFuZCBieSByZWFkaW5nIHZhcmlvdXMgcHVibGljIGF2YWlsYWJsZQorICogQXRoZXJvcyBwcmVzZW50YXRpb25zIGFuZCBwYXBlcnMgbGlrZSB0aGVzZToKKyAqCisgKiA1MjEwIC0gaHR0cDovL25vdmEuc3RhbmZvcmQuZWR1L35iYmFhcy9wcy9pc3NjYzIwMDJfc2xpZGVzLnBkZgorICogICAgICAgIGh0dHA6Ly93d3cuaXQuaWl0Yi5hYy5pbi9+amFuYWsvd2lmaXJlLzAxMjIyNzM0LnBkZgorICoKKyAqIDUyMTEgLSBodHRwOi8vd3d3LmhvdGNoaXBzLm9yZy9hcmNoaXZlcy9oYzE0LzNfVHVlLzE2X21jZmFybGFuZC5wZGYKKyAqCisgKiBUaGlzIGZpbGUgYWxzbyBjb250YWlucyByZWdpc3RlciB2YWx1ZXMgZm91bmQgb24gYSBtZW1vcnkgZHVtcCBvZgorICogQXRoZXJvcydzIEFSVCBwcm9ncmFtIChBdGhlcm9zIFJhZGlvIFRlc3QpLCBvbiBhdGg5aywgb24gbGVnYWN5LWhhbAorICogcmVsZWFzZWQgYnkgQXRoZXJvcyBhbmQgb24gdmFyaW91cyBkZWJ1ZyBtZXNzYWdlcyBmb3VuZCBvbiB0aGUgbmV0LgorICovCisKKworCisvKj09PT1NQUMgRE1BIFJFR0lTVEVSUz09PT0qLworCisvKgorICogQVI1MjEwLVNwZWNpZmljIFRYRFAgcmVnaXN0ZXJzCisgKiA1MjEwIGhhcyBvbmx5IDIgdHJhbnNtaXQgcXVldWVzIHNvIG5vIERDVS9RQ1UsIGp1c3QKKyAqIDIgdHJhbnNtaXQgZGVzY3JpcHRvciBwb2ludGVycy4uLgorICovCisjZGVmaW5lIEFSNUtfTk9RQ1VfVFhEUDAJMHgwMDAwCQkvKiBRdWV1ZSAwIC0gZGF0YSAqLworI2RlZmluZSBBUjVLX05PUUNVX1RYRFAxCTB4MDAwNAkJLyogUXVldWUgMSAtIGJlYWNvbnMgKi8KKworLyoKKyAqIE1hYyBDb250cm9sIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJQVI1S19DUgkJMHgwMDA4CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX0NSX1RYRTAJMHgwMDAwMDAwMQkvKiBUWCBFbmFibGUgZm9yIHF1ZXVlIDAgb24gNTIxMCAqLworI2RlZmluZSBBUjVLX0NSX1RYRTEJMHgwMDAwMDAwMgkvKiBUWCBFbmFibGUgZm9yIHF1ZXVlIDEgb24gNTIxMCAqLworI2RlZmluZQlBUjVLX0NSX1JYRQkweDAwMDAwMDA0CS8qIFJYIEVuYWJsZSAqLworI2RlZmluZSBBUjVLX0NSX1RYRDAJMHgwMDAwMDAwOAkvKiBUWCBEaXNhYmxlIGZvciBxdWV1ZSAwIG9uIDUyMTAgKi8KKyNkZWZpbmUgQVI1S19DUl9UWEQxCTB4MDAwMDAwMTAJLyogVFggRGlzYWJsZSBmb3IgcXVldWUgMSBvbiA1MjEwICovCisjZGVmaW5lCUFSNUtfQ1JfUlhECTB4MDAwMDAwMjAJLyogUlggRGlzYWJsZSAqLworI2RlZmluZQlBUjVLX0NSX1NXSQkweDAwMDAwMDQwCS8qIFNvZnR3YXJlIEludGVycnVwdCAqLworCisvKgorICogUlggRGVzY3JpcHRvciBQb2ludGVyIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJQVI1S19SWERQCTB4MDAwYworCisvKgorICogQ29uZmlndXJhdGlvbiBhbmQgc3RhdHVzIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJQVI1S19DRkcJCTB4MDAxNAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19DRkdfU1dURAkJMHgwMDAwMDAwMQkvKiBCeXRlLXN3YXAgVFggZGVzY3JpcHRvciAoZm9yIGJpZyBlbmRpYW4gYXJjaHMpICovCisjZGVmaW5lCUFSNUtfQ0ZHX1NXVEIJCTB4MDAwMDAwMDIJLyogQnl0ZS1zd2FwIFRYIGJ1ZmZlciAqLworI2RlZmluZQlBUjVLX0NGR19TV1JECQkweDAwMDAwMDA0CS8qIEJ5dGUtc3dhcCBSWCBkZXNjcmlwdG9yICovCisjZGVmaW5lCUFSNUtfQ0ZHX1NXUkIJCTB4MDAwMDAwMDgJLyogQnl0ZS1zd2FwIFJYIGJ1ZmZlciAqLworI2RlZmluZQlBUjVLX0NGR19TV1JHCQkweDAwMDAwMDEwCS8qIEJ5dGUtc3dhcCBSZWdpc3RlciBhY2Nlc3MgKi8KKyNkZWZpbmUgQVI1S19DRkdfSUJTUwkJMHgwMDAwMDAyMCAJLyogMC1CU1MsIDEtSUJTUyBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfQ0ZHX1BIWV9PSwkJMHgwMDAwMDEwMAkvKiBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfQ0ZHX0VFQlMJCTB4MDAwMDAyMDAJLyogRUVQUk9NIGlzIGJ1c3kgKi8KKyNkZWZpbmUJQVI1S19DRkdfQ0xLR0QJCTB4MDAwMDA0MDAJLyogQ2xvY2sgZ2F0ZWQgKERpc2FibGUgZHluYW1pYyBjbG9jaykgKi8KKyNkZWZpbmUgQVI1S19DRkdfVFhDTlQJCTB4MDAwMDc4MDAJLyogVHggZnJhbWUgY291bnQgKD8pIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0NGR19UWENOVF9TCTExCisjZGVmaW5lIEFSNUtfQ0ZHX1RYRlNUQVQJMHgwMDAwODAwMAkvKiBUeCBmcmFtZSBzdGF0dXMgKD8pIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0NGR19UWEZTVFJUCTB4MDAwMTAwMDAJLyogWzUyMTBdICovCisjZGVmaW5lCUFSNUtfQ0ZHX1BDSV9USFJFUwkweDAwMDYwMDAwCS8qIFBDSSBNYXN0ZXIgcmVxIHEgdGhyZXNob2xkIFs1MjExK10gKi8KKyNkZWZpbmUJQVI1S19DRkdfUENJX1RIUkVTX1MJMTcKKworLyoKKyAqIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0lFUgkJMHgwMDI0CQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfSUVSX0RJU0FCTEUJMHgwMDAwMDAwMAkvKiBEaXNhYmxlIGNhcmQgaW50ZXJydXB0cyAqLworI2RlZmluZSBBUjVLX0lFUl9FTkFCTEUJCTB4MDAwMDAwMDEJLyogRW5hYmxlIGNhcmQgaW50ZXJydXB0cyAqLworCisKKy8qCisgKiAweDAwMjggaXMgQmVhY29uIENvbnRyb2wgUmVnaXN0ZXIgb24gNTIxMAorICogYW5kIGZpcnN0IFJUUyBkdXJhdGlvbiByZWdpc3RlciBvbiA1MjExCisgKi8KKworLyoKKyAqIEJlYWNvbiBjb250cm9sIHJlZ2lzdGVyIFs1MjEwXQorICovCisjZGVmaW5lIEFSNUtfQkNSCQkweDAwMjgJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19CQ1JfQVAJCTB4MDAwMDAwMDAJLyogQVAgbW9kZSAqLworI2RlZmluZSBBUjVLX0JDUl9BREhPQwkJMHgwMDAwMDAwMQkvKiBBZC1Ib2MgbW9kZSAqLworI2RlZmluZSBBUjVLX0JDUl9CRE1BRQkJMHgwMDAwMDAwMgkvKiBETUEgZW5hYmxlICovCisjZGVmaW5lIEFSNUtfQkNSX1RRMUZWCQkweDAwMDAwMDA0CS8qIFVzZSBRdWV1ZTEgZm9yIENBQiB0cmFmZmljICovCisjZGVmaW5lIEFSNUtfQkNSX1RRMVYJCTB4MDAwMDAwMDgJLyogVXNlIFF1ZXVlMSBmb3IgQmVhY29uIHRyYWZmaWMgKi8KKyNkZWZpbmUgQVI1S19CQ1JfQkNHRVQJCTB4MDAwMDAwMTAKKworLyoKKyAqIEZpcnN0IFJUUyBkdXJhdGlvbiByZWdpc3RlciBbNTIxMV0KKyAqLworI2RlZmluZSBBUjVLX1JUU0QwCQkweDAwMjgJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19SVFNEMF82CQkweDAwMDAwMGZmCS8qIDZNYiBSVFMgZHVyYXRpb24gbWFzayAoPykgKi8KKyNkZWZpbmUJQVI1S19SVFNEMF82X1MJCTAJCS8qIDZNYiBSVFMgZHVyYXRpb24gc2hpZnQgKD8pICovCisjZGVmaW5lCUFSNUtfUlRTRDBfOQkJMHgwMDAwZmYwMAkvKiA5TWIqLworI2RlZmluZQlBUjVLX1JUU0QwXzlfUwkJOAorI2RlZmluZQlBUjVLX1JUU0QwXzEyCQkweDAwZmYwMDAwCS8qIDEyTWIqLworI2RlZmluZQlBUjVLX1JUU0QwXzEyX1MJCTE2CisjZGVmaW5lCUFSNUtfUlRTRDBfMTgJCTB4ZmYwMDAwMDAJLyogMTZNYiovCisjZGVmaW5lCUFSNUtfUlRTRDBfMThfUwkJMjQKKworCisvKgorICogMHgwMDJjIGlzIEJlYWNvbiBTdGF0dXMgUmVnaXN0ZXIgb24gNTIxMAorICogYW5kIHNlY29uZCBSVFMgZHVyYXRpb24gcmVnaXN0ZXIgb24gNTIxMQorICovCisKKy8qCisgKiBCZWFjb24gc3RhdHVzIHJlZ2lzdGVyIFs1MjEwXQorICoKKyAqIEFzIGkgY2FuIHNlZSBpbiBhcjVrX2FyNTIxMF90eF9zdGFydCBSZXlrIHVzZXMgc29tZSBvZiB0aGUgdmFsdWVzIG9mIEJDUgorICogZm9yIHRoaXMgcmVnaXN0ZXIsIHNvIGkgZ3Vlc3MgVFExVixUUTFGViBhbmQgQkRNQUUgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nCisgKiBoZXJlIGFuZCBTTlAvU05BUCBtZWFucyAic25hcHNob3QiIChzbyB0aGlzIHJlZ2lzdGVyIGdldHMgc3luY2VkIHdpdGggQkNSKS4KKyAqIFNvIFNOQVBQRURCQ1JWQUxJRCBzb3VsZCBhbHNvIHN0YW5kIGZvciAic25hcHBlZCBCQ1IgLXZhbHVlcy0gdmFsaWQiLCBzbyBpCisgKiByZW5hbWVkIGl0IHRvIFNOQVBTSE9UU1ZBTElEIHRvIG1ha2UgbW9yZSBzZW5zZS4gSSByZWFseSBoYXZlIG5vIGlkZWEgd2hhdAorICogZWxzZSBjYW4gaXQgYmUuIEkgYWxzbyByZW5hbWVkIFNOUEJDTUQgdG8gU05QQURIT0MgdG8gbWF0Y2ggQkNSLgorICovCisjZGVmaW5lIEFSNUtfQlNSCQkweDAwMmMJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfQlNSX0JETFlTVwkJMHgwMDAwMDAwMQkvKiBTVyBCZWFjb24gZGVsYXkgKD8pICovCisjZGVmaW5lIEFSNUtfQlNSX0JETFlETUEJMHgwMDAwMDAwMgkvKiBETUEgQmVhY29uIGRlbGF5ICg/KSAqLworI2RlZmluZSBBUjVLX0JTUl9UWFExRgkJMHgwMDAwMDAwNAkvKiBCZWFjb24gcXVldWUgKDEpIGZpbmlzaGVkICovCisjZGVmaW5lIEFSNUtfQlNSX0FUSU1ETFkJMHgwMDAwMDAwOAkvKiBBVElNIGRlbGF5ICg/KSAqLworI2RlZmluZSBBUjVLX0JTUl9TTlBBREhPQwkweDAwMDAwMTAwCS8qIEFkLWhvYyBtb2RlIHNldCAoPykgKi8KKyNkZWZpbmUgQVI1S19CU1JfU05QQkRNQUUJMHgwMDAwMDIwMAkvKiBCZWFjb24gRE1BIGVuYWJsZWQgKD8pICovCisjZGVmaW5lIEFSNUtfQlNSX1NOUFRRMUZWCTB4MDAwMDA0MDAJLyogUXVldWUxIGlzIHVzZWQgZm9yIENBQiB0cmFmZmljICg/KSAqLworI2RlZmluZSBBUjVLX0JTUl9TTlBUUTFWCTB4MDAwMDA4MDAJLyogUXVldWUxIGlzIHVzZWQgZm9yIEJlYWNvbiB0cmFmZmljICg/KSAqLworI2RlZmluZSBBUjVLX0JTUl9TTkFQU0hPVFNWQUxJRAkweDAwMDAxMDAwCS8qIEJDUiBzbmFwc2hvdHMgYXJlIHZhbGlkICg/KSAqLworI2RlZmluZSBBUjVLX0JTUl9TV0JBX0NOVAkweDAwZmYwMDAwCisKKy8qCisgKiBTZWNvbmQgUlRTIGR1cmF0aW9uIHJlZ2lzdGVyIFs1MjExXQorICovCisjZGVmaW5lIEFSNUtfUlRTRDEJCTB4MDAyYwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19SVFNEMV8yNAkJMHgwMDAwMDBmZgkvKiAyNE1iICovCisjZGVmaW5lCUFSNUtfUlRTRDFfMjRfUwkJMAorI2RlZmluZQlBUjVLX1JUU0QxXzM2CQkweDAwMDBmZjAwCS8qIDM2TWIgKi8KKyNkZWZpbmUJQVI1S19SVFNEMV8zNl9TCQk4CisjZGVmaW5lCUFSNUtfUlRTRDFfNDgJCTB4MDBmZjAwMDAJLyogNDhNYiAqLworI2RlZmluZQlBUjVLX1JUU0QxXzQ4X1MJCTE2CisjZGVmaW5lCUFSNUtfUlRTRDFfNTQJCTB4ZmYwMDAwMDAJLyogNTRNYiAqLworI2RlZmluZQlBUjVLX1JUU0QxXzU0X1MJCTI0CisKKworLyoKKyAqIFRyYW5zbWl0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1RYQ0ZHCQkJMHgwMDMwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX1RYQ0ZHX1NETUFNUgkJMHgwMDAwMDAwNwkvKiBETUEgc2l6ZSAocmVhZCkgKi8KKyNkZWZpbmUgQVI1S19UWENGR19TRE1BTVJfUwkJMAorI2RlZmluZSBBUjVLX1RYQ0ZHX0JfTU9ERQkJMHgwMDAwMDAwOAkvKiBTZXQgYiBtb2RlIGZvciA1MTExIChlbmFibGUgMjExMSkgKi8KKyNkZWZpbmUgQVI1S19UWENGR19UWEZTVFAJCTB4MDAwMDAwMDgJLyogVFggRE1BIGZ1bGwgU3RvcCBbNTIxMF0gKi8KKyNkZWZpbmUgQVI1S19UWENGR19UWEZVTEwJCTB4MDAwMDAzZjAJLyogVFggVHJpZ2VyIGxldmVsIG1hc2sgKi8KKyNkZWZpbmUgQVI1S19UWENGR19UWEZVTExfUwkJNAorI2RlZmluZSBBUjVLX1RYQ0ZHX1RYRlVMTF8wQgkJMHgwMDAwMDAwMAorI2RlZmluZSBBUjVLX1RYQ0ZHX1RYRlVMTF82NEIJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQVI1S19UWENGR19UWEZVTExfMTI4QgkJMHgwMDAwMDAyMAorI2RlZmluZSBBUjVLX1RYQ0ZHX1RYRlVMTF8xOTJCCQkweDAwMDAwMDMwCisjZGVmaW5lIEFSNUtfVFhDRkdfVFhGVUxMXzI1NkIJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQVI1S19UWENGR19UWENPTlRfRU4JCTB4MDAwMDAwODAKKyNkZWZpbmUgQVI1S19UWENGR19ETUFTSVpFCQkweDAwMDAwMTAwCS8qIEZsYWcgZm9yIHBhc3NpbmcgRE1BIHNpemUgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfVFhDRkdfSlVNQk9fREVTQ19FTgkweDAwMDAwNDAwCS8qIEVuYWJsZSBqdW1ibyB0eCBkZXNjcmlwdG9ycyBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfVFhDRkdfQURIT0NfQkNOX0FUSU0JMHgwMDAwMDgwMAkvKiBBZGhvYyBCZWFjb24gQVRJTSBQb2xpY3kgKi8KKyNkZWZpbmUgQVI1S19UWENGR19BVElNX1dJTkRPV19ERUZfRElTCTB4MDAwMDEwMDAJLyogRGlzYWJsZSBBVElNIHdpbmRvdyBkZWZlciBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfVFhDRkdfUlRTUk5ECQkweDAwMDAxMDAwCS8qIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19UWENGR19GUk1QQURfRElTCQkweDAwMDAyMDAwCS8qIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19UWENGR19SRFlfQ0JSX0RJUwkJMHgwMDAwNDAwMAkvKiBSZWFkeSB0aW1lIENCUiBkaXNhYmxlIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19UWENGR19KVU1CT19GUk1fTU9ERQkweDAwMDA4MDAwCS8qIEp1bWJvIGZyYW1lIG1vZGUgWzUyMTErXSAqLworI2RlZmluZQlBUjVLX1RYQ0ZHX0RDVV9EQkxfQlVGX0RJUwkweDAwMDA4MDAwCS8qIERpc2FibGUgZG91YmxlIGJ1ZmZlcmluZyBvbiBEQ1UgKi8KKyNkZWZpbmUgQVI1S19UWENGR19EQ1VfQ0FDSElOR19ESVMJMHgwMDAxMDAwMAkvKiBEaXNhYmxlIERDVSBjYWNoaW5nICovCisKKy8qCisgKiBSZWNlaXZlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1JYQ0ZHCQkweDAwMzQJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfUlhDRkdfU0RNQU1XCTB4MDAwMDAwMDcJLyogRE1BIHNpemUgKHdyaXRlKSAqLworI2RlZmluZSBBUjVLX1JYQ0ZHX1NETUFNV19TCTAKKyNkZWZpbmUgQVI1S19SWENGR19aTEZETUEJMHgwMDAwMDAwOAkvKiBFbmFibGUgWmVyby1sZW5ndGggZnJhbWUgRE1BICovCisjZGVmaW5lCUFSNUtfUlhDRkdfREVGX0FOVEVOTkEJMHgwMDAwMDAxMAkvKiBEZWZhdWx0IGFudGVubmEgKD8pICovCisjZGVmaW5lIEFSNUtfUlhDRkdfSlVNQk9fUlhFCTB4MDAwMDAwMjAJLyogRW5hYmxlIGp1bWJvIHJ4IGRlc2NyaXB0b3JzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19SWENGR19KVU1CT19XUkFQCTB4MDAwMDAwNDAJLyogV3JhcCBqdW1ibyBmcmFtZXMgWzUyMTErXSAqLworI2RlZmluZSBBUjVLX1JYQ0ZHX1NMRV9FTlRSWQkweDAwMDAwMDgwCS8qIFNsZWVwIGVudHJ5IHBvbGljeSAqLworCisvKgorICogUmVjZWl2ZSBqdW1ibyBkZXNjcmlwdG9yIGxhc3QgYWRkcmVzcyByZWdpc3RlcgorICogT25seSBmb3VuZCBpbiA1MjExICg/KQorICovCisjZGVmaW5lIEFSNUtfUlhKTEEJCTB4MDAzOAorCisvKgorICogTUlCIGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX01JQkMJCTB4MDA0MAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19NSUJDX0NPVwkJMHgwMDAwMDAwMQkvKiBXYXJuIHRlc3QgaW5kaWNhdG9yICovCisjZGVmaW5lIEFSNUtfTUlCQ19GTUMJCTB4MDAwMDAwMDIJLyogRnJlZXplIE1JQiBDb3VudGVycyAgKi8KKyNkZWZpbmUgQVI1S19NSUJDX0NNQwkJMHgwMDAwMDAwNAkvKiBDbGVhbiBNSUIgQ291bnRlcnMgICovCisjZGVmaW5lIEFSNUtfTUlCQ19NQ1MJCTB4MDAwMDAwMDgJLyogTUlCIGNvdW50ZXIgc3Ryb2JlICovCisKKy8qCisgKiBUaW1lb3V0IHByZXNjYWxlIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19UT1BTCQkweDAwNDQKKyNkZWZpbmUJQVI1S19UT1BTX00JCTB4MDAwMGZmZmYKKworLyoKKyAqIFJlY2VpdmUgdGltZW91dCByZWdpc3RlciAobm8gZnJhbWUgcmVjZWl2ZWQpCisgKi8KKyNkZWZpbmUgQVI1S19SWE5PRlJNCQkweDAwNDgKKyNkZWZpbmUJQVI1S19SWE5PRlJNX00JCTB4MDAwMDAzZmYKKworLyoKKyAqIFRyYW5zbWl0IHRpbWVvdXQgcmVnaXN0ZXIgKG5vIGZyYW1lIHNlbnQpCisgKi8KKyNkZWZpbmUgQVI1S19UWE5PRlJNCQkweDAwNGMKKyNkZWZpbmUJQVI1S19UWE5PRlJNX00JCTB4MDAwMDAzZmYKKyNkZWZpbmUJQVI1S19UWE5PRlJNX1FDVQkweDAwMGZmYzAwCisjZGVmaW5lCUFSNUtfVFhOT0ZSTV9RQ1VfUwkxMAorCisvKgorICogUmVjZWl2ZSBmcmFtZSBnYXAgdGltZW91dCByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfUlBHVE8JCTB4MDA1MAorI2RlZmluZSBBUjVLX1JQR1RPX00JCTB4MDAwMDAzZmYKKworLyoKKyAqIFJlY2VpdmUgZnJhbWUgY291bnQgbGltaXQgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1JGQ05UCQkweDAwNTQKKyNkZWZpbmUgQVI1S19SRkNOVF9NCQkweDAwMDAwMDFmCS8qIFs1MjExK10gKD8pICovCisjZGVmaW5lIEFSNUtfUkZDTlRfUkZDTAkJMHgwMDAwMDAwZgkvKiBbNTIxMF0gKi8KKworLyoKKyAqIE1pc2Mgc2V0dGluZ3MgcmVnaXN0ZXIKKyAqIChyZXNlcnZlZDAtMykKKyAqLworI2RlZmluZSBBUjVLX01JU0MJCTB4MDA1OAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19NSVNDX0RNQV9PQlNfTQkweDAwMDAwMWUwCisjZGVmaW5lCUFSNUtfTUlTQ19ETUFfT0JTX1MJNQorI2RlZmluZQlBUjVLX01JU0NfTUlTQ19PQlNfTQkweDAwMDAwZTAwCisjZGVmaW5lCUFSNUtfTUlTQ19NSVNDX09CU19TCTkKKyNkZWZpbmUJQVI1S19NSVNDX01BQ19PQlNfTFNCX00JMHgwMDAwNzAwMAorI2RlZmluZQlBUjVLX01JU0NfTUFDX09CU19MU0JfUwkxMgorI2RlZmluZQlBUjVLX01JU0NfTUFDX09CU19NU0JfTQkweDAwMDM4MDAwCisjZGVmaW5lCUFSNUtfTUlTQ19NQUNfT0JTX01TQl9TCTE1CisjZGVmaW5lIEFSNUtfTUlTQ19MRURfREVDQVkJMHgwMDFjMDAwMAkvKiBbNTIxMF0gKi8KKyNkZWZpbmUgQVI1S19NSVNDX0xFRF9CTElOSwkweDAwZTAwMDAwCS8qIFs1MjEwXSAqLworCisvKgorICogUUNVL0RDVSBjbG9jayBnYXRpbmcgcmVnaXN0ZXIgKDUzMTEpCisgKiAocmVzZXJ2ZWQ0LTUpCisgKi8KKyNkZWZpbmUJQVI1S19RQ1VEQ1VfQ0xLR1QJMHgwMDVjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAoPykgKi8KKyNkZWZpbmUJQVI1S19RQ1VEQ1VfQ0xLR1RfUUNVCTB4MDAwMGZmZmYJLyogTWFzayBmb3IgUUNVIGNsb2NrICovCisjZGVmaW5lCUFSNUtfUUNVRENVX0NMS0dUX0RDVQkweDA3ZmYwMDAwCS8qIE1hc2sgZm9yIERDVSBjbG9jayAqLworCisvKgorICogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcnMKKyAqCisgKiBGb3IgNTIxMCB0aGVyZSBpcyBvbmx5IG9uZSBzdGF0dXMgcmVnaXN0ZXIgYnV0IGZvcgorICogNTIxMS81MjEyIHdlIGhhdmUgb25lIHByaW1hcnkgYW5kIDQgc2Vjb25kYXJ5IHJlZ2lzdGVycy4KKyAqIFNvIHdlIGhhdmUgQVI1S19JU1IgZm9yIDUyMTAgYW5kIEFSNUtfUElTUiAvU0lTUnggZm9yIDUyMTEvNTIxMi4KKyAqIE1vc3Qgb2YgdGhlc2UgYml0cyBhcmUgY29tbW9uIGZvciBhbGwgY2hpcHNldHMuCisgKi8KKyNkZWZpbmUgQVI1S19JU1IJCTB4MDAxYwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfUElTUgkJMHgwMDgwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSVNSX1JYT0sJCTB4MDAwMDAwMDEJLyogRnJhbWUgc3VjY2Vzc2Z1bHkgcmVjaWV2ZWQgKi8KKyNkZWZpbmUgQVI1S19JU1JfUlhERVNDCQkweDAwMDAwMDAyCS8qIFJYIGRlc2NyaXB0b3IgcmVxdWVzdCAqLworI2RlZmluZSBBUjVLX0lTUl9SWEVSUgkJMHgwMDAwMDAwNAkvKiBSZWNlaXZlIGVycm9yICovCisjZGVmaW5lIEFSNUtfSVNSX1JYTk9GUk0JMHgwMDAwMDAwOAkvKiBObyBmcmFtZSByZWNlaXZlZCAocmVjZWl2ZSB0aW1lb3V0KSAqLworI2RlZmluZSBBUjVLX0lTUl9SWEVPTAkJMHgwMDAwMDAxMAkvKiBFbXB0eSBSWCBkZXNjcmlwdG9yICovCisjZGVmaW5lIEFSNUtfSVNSX1JYT1JOCQkweDAwMDAwMDIwCS8qIFJlY2VpdmUgRklGTyBvdmVycnVuICovCisjZGVmaW5lIEFSNUtfSVNSX1RYT0sJCTB4MDAwMDAwNDAJLyogRnJhbWUgc3VjY2Vzc2Z1bHkgdHJhbnNtaXRlZCAqLworI2RlZmluZSBBUjVLX0lTUl9UWERFU0MJCTB4MDAwMDAwODAJLyogVFggZGVzY3JpcHRvciByZXF1ZXN0ICovCisjZGVmaW5lIEFSNUtfSVNSX1RYRVJSCQkweDAwMDAwMTAwCS8qIFRyYW5zbWl0IGVycm9yICovCisjZGVmaW5lIEFSNUtfSVNSX1RYTk9GUk0JMHgwMDAwMDIwMAkvKiBObyBmcmFtZSB0cmFuc21pdGVkICh0cmFuc21pdCB0aW1lb3V0KSAqLworI2RlZmluZSBBUjVLX0lTUl9UWEVPTAkJMHgwMDAwMDQwMAkvKiBFbXB0eSBUWCBkZXNjcmlwdG9yICovCisjZGVmaW5lIEFSNUtfSVNSX1RYVVJOCQkweDAwMDAwODAwCS8qIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gKi8KKyNkZWZpbmUgQVI1S19JU1JfTUlCCQkweDAwMDAxMDAwCS8qIFVwZGF0ZSBNSUIgY291bnRlcnMgKi8KKyNkZWZpbmUgQVI1S19JU1JfU1dJCQkweDAwMDAyMDAwCS8qIFNvZnR3YXJlIGludGVycnVwdCAqLworI2RlZmluZSBBUjVLX0lTUl9SWFBIWQkJMHgwMDAwNDAwMAkvKiBQSFkgZXJyb3IgKi8KKyNkZWZpbmUgQVI1S19JU1JfUlhLQ00JCTB4MDAwMDgwMDAJLyogUlggS2V5IGNhY2hlIG1pc3MgKi8KKyNkZWZpbmUgQVI1S19JU1JfU1dCQQkJMHgwMDAxMDAwMAkvKiBTb2Z0d2FyZSBiZWFjb24gYWxlcnQgKi8KKyNkZWZpbmUgQVI1S19JU1JfQlJTU0kJCTB4MDAwMjAwMDAJLyogQmVhY29uIHJzc2kgYmVsb3cgdGhyZXNob2xkICg/KSAqLworI2RlZmluZSBBUjVLX0lTUl9CTUlTUwkJMHgwMDA0MDAwMAkvKiBCZWFjb24gbWlzc2VkICovCisjZGVmaW5lIEFSNUtfSVNSX0hJVUVSUgkJMHgwMDA4MDAwMAkvKiBIb3N0IEludGVyZmFjZSBVbml0IGVycm9yIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19JU1JfQk5SCQkweDAwMTAwMDAwIAkvKiBCZWFjb24gbm90IHJlYWR5IFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19JU1JfTUNBQlQJCTB4MDAxMDAwMDAJLyogTWFzdGVyIEN5Y2xlIEFib3J0IFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0lTUl9SWENISVJQCTB4MDAyMDAwMDAJLyogQ0hJUlAgUmVjZWl2ZWQgWzUyMTIrXSAqLworI2RlZmluZSBBUjVLX0lTUl9TU0VSUgkJMHgwMDIwMDAwMAkvKiBTaWduYWxlZCBTeXN0ZW0gRXJyb3IgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfSVNSX0RQRVJSCQkweDAwNDAwMDAwCS8qIERldCBwYXIgRXJyb3IgKD8pIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0lTUl9SWERPUFBMRVIJMHgwMDQwMDAwMAkvKiBEb3BwbGVyIGNoaXJwIHJlY2VpdmVkIFs1MjEyK10gKi8KKyNkZWZpbmUgQVI1S19JU1JfVElNCQkweDAwODAwMDAwCS8qIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19JU1JfQkNOTUlTQwkweDAwODAwMDAwCS8qICdvcicgb2YgVElNLCBDQUJfRU5ELCBEVElNX1NZTkMsIEJDTl9USU1FT1VULAorCQkJCQkJQ0FCX1RJTUVPVVQgYW5kIERUSU0gYml0cyBmcm9tIFNJU1IyIFs1MjEyK10gKi8KKyNkZWZpbmUgQVI1S19JU1JfR1BJTwkJMHgwMTAwMDAwMAkvKiBHUElPIChyZiBraWxsKSAqLworI2RlZmluZSBBUjVLX0lTUl9RQ0JST1JOCTB4MDIwMDAwMDAJLyogUUNVIENCUiBvdmVycnVuIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19JU1JfUUNCUlVSTgkweDA0MDAwMDAwCS8qIFFDVSBDQlIgdW5kZXJydW4gWzUyMTErXSAqLworI2RlZmluZSBBUjVLX0lTUl9RVFJJRwkJMHgwODAwMDAwMAkvKiBRQ1Ugc2NoZWR1bGluZyB0cmlnZ2VyIFs1MjExK10gKi8KKworLyoKKyAqIFNlY29uZGFyeSBzdGF0dXMgcmVnaXN0ZXJzIFs1MjExK10gKDAgLSA0KQorICoKKyAqIFRoZXNlIGdpdmUgdGhlIHN0YXR1cyBmb3IgZWFjaCBRQ1UsIG9ubHkgUUNVcyAwLTkgYXJlCisgKiByZXByZXNlbnRlZC4KKyAqLworI2RlZmluZSBBUjVLX1NJU1IwCQkweDAwODQJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSVNSMF9RQ1VfVFhPSwkweDAwMDAwM2ZmCS8qIE1hc2sgZm9yIFFDVV9UWE9LICovCisjZGVmaW5lIEFSNUtfU0lTUjBfUUNVX1RYT0tfUwkwCisjZGVmaW5lIEFSNUtfU0lTUjBfUUNVX1RYREVTQwkweDAzZmYwMDAwCS8qIE1hc2sgZm9yIFFDVV9UWERFU0MgKi8KKyNkZWZpbmUgQVI1S19TSVNSMF9RQ1VfVFhERVNDX1MJMTYKKworI2RlZmluZSBBUjVLX1NJU1IxCQkweDAwODgJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSVNSMV9RQ1VfVFhFUlIJMHgwMDAwMDNmZgkvKiBNYXNrIGZvciBRQ1VfVFhFUlIgKi8KKyNkZWZpbmUgQVI1S19TSVNSMV9RQ1VfVFhFUlJfUwkwCisjZGVmaW5lIEFSNUtfU0lTUjFfUUNVX1RYRU9MCTB4MDNmZjAwMDAJLyogTWFzayBmb3IgUUNVX1RYRU9MICovCisjZGVmaW5lIEFSNUtfU0lTUjFfUUNVX1RYRU9MX1MJMTYKKworI2RlZmluZSBBUjVLX1NJU1IyCQkweDAwOGMJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSVNSMl9RQ1VfVFhVUk4JMHgwMDAwMDNmZgkvKiBNYXNrIGZvciBRQ1VfVFhVUk4gKi8KKyNkZWZpbmUJQVI1S19TSVNSMl9RQ1VfVFhVUk5fUwkwCisjZGVmaW5lCUFSNUtfU0lTUjJfTUNBQlQJMHgwMDEwMDAwMAkvKiBNYXN0ZXIgQ3ljbGUgQWJvcnQgKi8KKyNkZWZpbmUJQVI1S19TSVNSMl9TU0VSUgkweDAwMjAwMDAwCS8qIFNpZ25hbGVkIFN5c3RlbSBFcnJvciAqLworI2RlZmluZQlBUjVLX1NJU1IyX0RQRVJSCTB4MDA0MDAwMDAJLyogQnVzIHBhcml0eSBlcnJvciAqLworI2RlZmluZQlBUjVLX1NJU1IyX1RJTQkJMHgwMTAwMDAwMAkvKiBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lTUjJfQ0FCX0VORAkweDAyMDAwMDAwCS8qIFs1MjEyK10gKi8KKyNkZWZpbmUJQVI1S19TSVNSMl9EVElNX1NZTkMJMHgwNDAwMDAwMAkvKiBEVElNIHN5bmMgbG9zdCBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lTUjJfQkNOX1RJTUVPVVQJMHgwODAwMDAwMAkvKiBCZWFjb24gVGltZW91dCBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lTUjJfQ0FCX1RJTUVPVVQJMHgxMDAwMDAwMAkvKiBDQUIgVGltZW91dCBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lTUjJfRFRJTQkJMHgyMDAwMDAwMAkvKiBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lTUjJfVFNGT09SCTB4ODAwMDAwMDAJLyogVFNGIE9PUiAoPykgKi8KKworI2RlZmluZSBBUjVLX1NJU1IzCQkweDAwOTAJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSVNSM19RQ0JST1JOCTB4MDAwMDAzZmYJLyogTWFzayBmb3IgUUNCUk9STiAqLworI2RlZmluZSBBUjVLX1NJU1IzX1FDQlJPUk5fUwkwCisjZGVmaW5lIEFSNUtfU0lTUjNfUUNCUlVSTgkweDAzZmYwMDAwCS8qIE1hc2sgZm9yIFFDQlJVUk4gKi8KKyNkZWZpbmUgQVI1S19TSVNSM19RQ0JSVVJOX1MJMTYKKworI2RlZmluZSBBUjVLX1NJU1I0CQkweDAwOTQJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSVNSNF9RVFJJRwkweDAwMDAwM2ZmCS8qIE1hc2sgZm9yIFFUUklHICovCisjZGVmaW5lIEFSNUtfU0lTUjRfUVRSSUdfUwkwCisKKy8qCisgKiBTaGFkb3cgcmVhZC1hbmQtY2xlYXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMgWzUyMTErXQorICovCisjZGVmaW5lIEFSNUtfUkFDX1BJU1IJCTB4MDBjMAkJLyogUmVhZCBhbmQgY2xlYXIgUElTUiAqLworI2RlZmluZSBBUjVLX1JBQ19TSVNSMAkJMHgwMGM0CQkvKiBSZWFkIGFuZCBjbGVhciBTSVNSMCAqLworI2RlZmluZSBBUjVLX1JBQ19TSVNSMQkJMHgwMGM4CQkvKiBSZWFkIGFuZCBjbGVhciBTSVNSMSAqLworI2RlZmluZSBBUjVLX1JBQ19TSVNSMgkJMHgwMGNjCQkvKiBSZWFkIGFuZCBjbGVhciBTSVNSMiAqLworI2RlZmluZSBBUjVLX1JBQ19TSVNSMwkJMHgwMGQwCQkvKiBSZWFkIGFuZCBjbGVhciBTSVNSMyAqLworI2RlZmluZSBBUjVLX1JBQ19TSVNSNAkJMHgwMGQ0CQkvKiBSZWFkIGFuZCBjbGVhciBTSVNSNCAqLworCisvKgorICogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXJzCisgKgorICogQXMgd2hpdGggSVNScyA1MjEwIGhhcyBvbmUgSU1SIChBUjVLX0lNUikgYW5kIDUyMTEvNTIxMiBoYXMgb25lIHByaW1hcnkKKyAqIChBUjVLX1BJTVIpIGFuZCA0IHNlY29uZGFyeSBJTVJzIChBUjVLX1NJTVJ4KS4gTm90ZSB0aGF0IElTUi9JTVIgZmxhZ3MgbWF0Y2guCisgKi8KKyNkZWZpbmUJQVI1S19JTVIJCTB4MDAyMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfUElNUgkJMHgwMGEwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSU1SX1JYT0sJCTB4MDAwMDAwMDEJLyogRnJhbWUgc3VjY2Vzc2Z1bHkgcmVjaWV2ZWQqLworI2RlZmluZSBBUjVLX0lNUl9SWERFU0MJCTB4MDAwMDAwMDIJLyogUlggZGVzY3JpcHRvciByZXF1ZXN0Ki8KKyNkZWZpbmUgQVI1S19JTVJfUlhFUlIJCTB4MDAwMDAwMDQJLyogUmVjZWl2ZSBlcnJvciovCisjZGVmaW5lIEFSNUtfSU1SX1JYTk9GUk0JMHgwMDAwMDAwOAkvKiBObyBmcmFtZSByZWNlaXZlZCAocmVjZWl2ZSB0aW1lb3V0KSovCisjZGVmaW5lIEFSNUtfSU1SX1JYRU9MCQkweDAwMDAwMDEwCS8qIEVtcHR5IFJYIGRlc2NyaXB0b3IqLworI2RlZmluZSBBUjVLX0lNUl9SWE9STgkJMHgwMDAwMDAyMAkvKiBSZWNlaXZlIEZJRk8gb3ZlcnJ1biovCisjZGVmaW5lIEFSNUtfSU1SX1RYT0sJCTB4MDAwMDAwNDAJLyogRnJhbWUgc3VjY2Vzc2Z1bHkgdHJhbnNtaXRlZCovCisjZGVmaW5lIEFSNUtfSU1SX1RYREVTQwkJMHgwMDAwMDA4MAkvKiBUWCBkZXNjcmlwdG9yIHJlcXVlc3QqLworI2RlZmluZSBBUjVLX0lNUl9UWEVSUgkJMHgwMDAwMDEwMAkvKiBUcmFuc21pdCBlcnJvciovCisjZGVmaW5lIEFSNUtfSU1SX1RYTk9GUk0JMHgwMDAwMDIwMAkvKiBObyBmcmFtZSB0cmFuc21pdGVkICh0cmFuc21pdCB0aW1lb3V0KSovCisjZGVmaW5lIEFSNUtfSU1SX1RYRU9MCQkweDAwMDAwNDAwCS8qIEVtcHR5IFRYIGRlc2NyaXB0b3IqLworI2RlZmluZSBBUjVLX0lNUl9UWFVSTgkJMHgwMDAwMDgwMAkvKiBUcmFuc21pdCBGSUZPIHVuZGVycnVuKi8KKyNkZWZpbmUgQVI1S19JTVJfTUlCCQkweDAwMDAxMDAwCS8qIFVwZGF0ZSBNSUIgY291bnRlcnMqLworI2RlZmluZSBBUjVLX0lNUl9TV0kJCTB4MDAwMDIwMDAJLyogU29mdHdhcmUgaW50ZXJydXB0ICovCisjZGVmaW5lIEFSNUtfSU1SX1JYUEhZCQkweDAwMDA0MDAwCS8qIFBIWSBlcnJvciovCisjZGVmaW5lIEFSNUtfSU1SX1JYS0NNCQkweDAwMDA4MDAwCS8qIFJYIEtleSBjYWNoZSBtaXNzICovCisjZGVmaW5lIEFSNUtfSU1SX1NXQkEJCTB4MDAwMTAwMDAJLyogU29mdHdhcmUgYmVhY29uIGFsZXJ0Ki8KKyNkZWZpbmUgQVI1S19JTVJfQlJTU0kJCTB4MDAwMjAwMDAJLyogQmVhY29uIHJzc2kgYmVsb3cgdGhyZXNob2xkICg/KSAqLworI2RlZmluZSBBUjVLX0lNUl9CTUlTUwkJMHgwMDA0MDAwMAkvKiBCZWFjb24gbWlzc2VkKi8KKyNkZWZpbmUgQVI1S19JTVJfSElVRVJSCQkweDAwMDgwMDAwCS8qIEhvc3QgSW50ZXJmYWNlIFVuaXQgZXJyb3IgWzUyMTErXSAqLworI2RlZmluZSBBUjVLX0lNUl9CTlIJCTB4MDAxMDAwMDAgCS8qIEJlYWNvbiBub3QgcmVhZHkgWzUyMTErXSAqLworI2RlZmluZSBBUjVLX0lNUl9NQ0FCVAkJMHgwMDEwMDAwMAkvKiBNYXN0ZXIgQ3ljbGUgQWJvcnQgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfSU1SX1JYQ0hJUlAJMHgwMDIwMDAwMAkvKiBDSElSUCBSZWNlaXZlZCBbNTIxMitdKi8KKyNkZWZpbmUgQVI1S19JTVJfU1NFUlIJCTB4MDAyMDAwMDAJLyogU2lnbmFsZWQgU3lzdGVtIEVycm9yIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0lNUl9EUEVSUgkJMHgwMDQwMDAwMAkvKiBEZXQgcGFyIEVycm9yICg/KSBbNTIxMF0gKi8KKyNkZWZpbmUgQVI1S19JTVJfUlhET1BQTEVSCTB4MDA0MDAwMDAJLyogRG9wcGxlciBjaGlycCByZWNlaXZlZCBbNTIxMitdICovCisjZGVmaW5lIEFSNUtfSU1SX1RJTQkJMHgwMDgwMDAwMAkvKiBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSU1SX0JDTk1JU0MJMHgwMDgwMDAwMAkvKiAnb3InIG9mIFRJTSwgQ0FCX0VORCwgRFRJTV9TWU5DLCBCQ05fVElNRU9VVCwKKwkJCQkJCUNBQl9USU1FT1VUIGFuZCBEVElNIGJpdHMgZnJvbSBTSVNSMiBbNTIxMitdICovCisjZGVmaW5lIEFSNUtfSU1SX0dQSU8JCTB4MDEwMDAwMDAJLyogR1BJTyAocmYga2lsbCkqLworI2RlZmluZSBBUjVLX0lNUl9RQ0JST1JOCTB4MDIwMDAwMDAJLyogUUNVIENCUiBvdmVycnVuICg/KSBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSU1SX1FDQlJVUk4JMHgwNDAwMDAwMAkvKiBRQ1UgQ0JSIHVuZGVycnVuICg/KSBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSU1SX1FUUklHCQkweDA4MDAwMDAwCS8qIFFDVSBzY2hlZHVsaW5nIHRyaWdnZXIgWzUyMTErXSAqLworCisvKgorICogU2Vjb25kYXJ5IGludGVycnVwdCBtYXNrIHJlZ2lzdGVycyBbNTIxMStdICgwIC0gNCkKKyAqLworI2RlZmluZSBBUjVLX1NJTVIwCQkweDAwYTQJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSU1SMF9RQ1VfVFhPSwkweDAwMDAwM2ZmCS8qIE1hc2sgZm9yIFFDVV9UWE9LICovCisjZGVmaW5lIEFSNUtfU0lNUjBfUUNVX1RYT0tfUwkwCisjZGVmaW5lIEFSNUtfU0lNUjBfUUNVX1RYREVTQwkweDAzZmYwMDAwCS8qIE1hc2sgZm9yIFFDVV9UWERFU0MgKi8KKyNkZWZpbmUgQVI1S19TSU1SMF9RQ1VfVFhERVNDX1MJMTYKKworI2RlZmluZSBBUjVLX1NJTVIxCQkweDAwYTgJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSU1SMV9RQ1VfVFhFUlIJMHgwMDAwMDNmZgkvKiBNYXNrIGZvciBRQ1VfVFhFUlIgKi8KKyNkZWZpbmUgQVI1S19TSU1SMV9RQ1VfVFhFUlJfUwkwCisjZGVmaW5lIEFSNUtfU0lNUjFfUUNVX1RYRU9MCTB4MDNmZjAwMDAJLyogTWFzayBmb3IgUUNVX1RYRU9MICovCisjZGVmaW5lIEFSNUtfU0lNUjFfUUNVX1RYRU9MX1MJMTYKKworI2RlZmluZSBBUjVLX1NJTVIyCQkweDAwYWMJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSU1SMl9RQ1VfVFhVUk4JMHgwMDAwMDNmZgkvKiBNYXNrIGZvciBRQ1VfVFhVUk4gKi8KKyNkZWZpbmUgQVI1S19TSU1SMl9RQ1VfVFhVUk5fUwkwCisjZGVmaW5lCUFSNUtfU0lNUjJfTUNBQlQJMHgwMDEwMDAwMAkvKiBNYXN0ZXIgQ3ljbGUgQWJvcnQgKi8KKyNkZWZpbmUJQVI1S19TSU1SMl9TU0VSUgkweDAwMjAwMDAwCS8qIFNpZ25hbGVkIFN5c3RlbSBFcnJvciAqLworI2RlZmluZQlBUjVLX1NJTVIyX0RQRVJSCTB4MDA0MDAwMDAJLyogQnVzIHBhcml0eSBlcnJvciAqLworI2RlZmluZQlBUjVLX1NJTVIyX1RJTQkJMHgwMTAwMDAwMAkvKiBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lNUjJfQ0FCX0VORAkweDAyMDAwMDAwCS8qIFs1MjEyK10gKi8KKyNkZWZpbmUJQVI1S19TSU1SMl9EVElNX1NZTkMJMHgwNDAwMDAwMAkvKiBEVElNIFN5bmMgbG9zdCBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lNUjJfQkNOX1RJTUVPVVQJMHgwODAwMDAwMAkvKiBCZWFjb24gVGltZW91dCBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lNUjJfQ0FCX1RJTUVPVVQJMHgxMDAwMDAwMAkvKiBDQUIgVGltZW91dCBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lNUjJfRFRJTQkJMHgyMDAwMDAwMAkvKiBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfU0lNUjJfVFNGT09SCTB4ODAwMDAwMDAJLyogVFNGIE9PUiAoPykgKi8KKworI2RlZmluZSBBUjVLX1NJTVIzCQkweDAwYjAJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSU1SM19RQ0JST1JOCTB4MDAwMDAzZmYJLyogTWFzayBmb3IgUUNCUk9STiAqLworI2RlZmluZSBBUjVLX1NJTVIzX1FDQlJPUk5fUwkwCisjZGVmaW5lIEFSNUtfU0lNUjNfUUNCUlVSTgkweDAzZmYwMDAwCS8qIE1hc2sgZm9yIFFDQlJVUk4gKi8KKyNkZWZpbmUgQVI1S19TSU1SM19RQ0JSVVJOX1MJMTYKKworI2RlZmluZSBBUjVLX1NJTVI0CQkweDAwYjQJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TSU1SNF9RVFJJRwkweDAwMDAwM2ZmCS8qIE1hc2sgZm9yIFFUUklHICovCisjZGVmaW5lIEFSNUtfU0lNUjRfUVRSSUdfUwkwCisKKy8qCisgKiBETUEgRGVidWcgcmVnaXN0ZXJzIDAtNworICogMHhlMCAtIDB4ZmMKKyAqLworCisvKgorICogRGVjb21wcmVzc2lvbiBtYXNrIHJlZ2lzdGVycyBbNTIxMitdCisgKi8KKyNkZWZpbmUgQVI1S19EQ01fQUREUgkJMHgwNDAwCQkvKkRlY29tcHJlc3Npb24gbWFzayBhZGRyZXNzIChpbmRleCkgKi8KKyNkZWZpbmUgQVI1S19EQ01fREFUQQkJMHgwNDA0CQkvKkRlY29tcHJlc3Npb24gbWFzayBkYXRhICovCisKKy8qCisgKiBXYWtlIE9uIFdpcmVsZXNzIHBhdHRlcm4gY29udHJvbCByZWdpc3RlciBbNTIxMitdCisgKi8KKyNkZWZpbmUJQVI1S19XT1dfUENGRwkJCTB4MDQxMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19XT1dfUENGR19QQVRfTUFUQ0hfRU4JMHgwMDAwMDAwMQkvKiBQYXR0ZXJuIG1hdGNoIGVuYWJsZSAqLworI2RlZmluZQlBUjVLX1dPV19QQ0ZHX0xPTkdfRlJBTUVfUE9MCTB4MDAwMDAwMDIJLyogTG9uZyBmcmFtZSBwb2xpY3kgKi8KKyNkZWZpbmUJQVI1S19XT1dfUENGR19XT0JNSVNTCQkweDAwMDAwMDA0CS8qIFdha2Ugb24gYmVhKGNvbikgbWlzcyAoPykgKi8KKyNkZWZpbmUJQVI1S19XT1dfUENGR19QQVRfMF9FTgkJMHgwMDAwMDEwMAkvKiBFbmFibGUgcGF0dGVybiAwICovCisjZGVmaW5lCUFSNUtfV09XX1BDRkdfUEFUXzFfRU4JCTB4MDAwMDAyMDAJLyogRW5hYmxlIHBhdHRlcm4gMSAqLworI2RlZmluZQlBUjVLX1dPV19QQ0ZHX1BBVF8yX0VOCQkweDAwMDAwNDAwCS8qIEVuYWJsZSBwYXR0ZXJuIDIgKi8KKyNkZWZpbmUJQVI1S19XT1dfUENGR19QQVRfM19FTgkJMHgwMDAwMDgwMAkvKiBFbmFibGUgcGF0dGVybiAzICovCisjZGVmaW5lCUFSNUtfV09XX1BDRkdfUEFUXzRfRU4JCTB4MDAwMDEwMDAJLyogRW5hYmxlIHBhdHRlcm4gNCAqLworI2RlZmluZQlBUjVLX1dPV19QQ0ZHX1BBVF81X0VOCQkweDAwMDAyMDAwCS8qIEVuYWJsZSBwYXR0ZXJuIDUgKi8KKworLyoKKyAqIFdha2UgT24gV2lyZWxlc3MgcGF0dGVybiBpbmRleCByZWdpc3RlciAoPykgWzUyMTIrXQorICovCisjZGVmaW5lCUFSNUtfV09XX1BBVF9JRFgJMHgwNDE0CisKKy8qCisgKiBXYWtlIE9uIFdpcmVsZXNzIHBhdHRlcm4gZGF0YSByZWdpc3RlciBbNTIxMitdCisgKi8KKyNkZWZpbmUJQVI1S19XT1dfUEFUX0RBVEEJMHgwNDE4CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX1dPV19QQVRfREFUQV8wXzNfVgkweDAwMDAwMDAxCS8qIFBhdHRlcm4gMCwgMyB2YWx1ZSAqLworI2RlZmluZQlBUjVLX1dPV19QQVRfREFUQV8xXzRfVgkweDAwMDAwMTAwCS8qIFBhdHRlcm4gMSwgNCB2YWx1ZSAqLworI2RlZmluZQlBUjVLX1dPV19QQVRfREFUQV8yXzVfVgkweDAwMDEwMDAwCS8qIFBhdHRlcm4gMiwgNSB2YWx1ZSAqLworI2RlZmluZQlBUjVLX1dPV19QQVRfREFUQV8wXzNfTQkweDAxMDAwMDAwCS8qIFBhdHRlcm4gMCwgMyBtYXNrICovCisjZGVmaW5lCUFSNUtfV09XX1BBVF9EQVRBXzFfNF9NCTB4MDQwMDAwMDAJLyogUGF0dGVybiAxLCA0IG1hc2sgKi8KKyNkZWZpbmUJQVI1S19XT1dfUEFUX0RBVEFfMl81X00JMHgxMDAwMDAwMAkvKiBQYXR0ZXJuIDIsIDUgbWFzayAqLworCisvKgorICogRGVjb21wcmVzc2lvbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBbNTIxMitdCisgKi8KKyNkZWZpbmUgQVI1S19EQ0NGRwkJMHgwNDIwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX0RDQ0ZHX0dMT0JBTF9FTgkweDAwMDAwMDAxCS8qIEVuYWJsZSBkZWNvbXByZXNzaW9uIG9uIGFsbCBxdWV1ZXMgKi8KKyNkZWZpbmUgQVI1S19EQ0NGR19CWVBBU1NfRU4JMHgwMDAwMDAwMgkvKiBCeXBhc3MgZGVjb21wcmVzc2lvbiAqLworI2RlZmluZSBBUjVLX0RDQ0ZHX0JDQVNUX0VOCTB4MDAwMDAwMDQJLyogRW5hYmxlIGRlY29tcHJlc3Npb24gZm9yIGJjYXN0IGZyYW1lcyAqLworI2RlZmluZSBBUjVLX0RDQ0ZHX01DQVNUX0VOCTB4MDAwMDAwMDgJLyogRW5hYmxlIGRlY29tcHJlc3Npb24gZm9yIG1jYXN0IGZyYW1lcyAqLworCisvKgorICogQ29tcHJlc3Npb24gY29uZmlndXJhdGlvbiByZWdpc3RlcnMgWzUyMTIrXQorICovCisjZGVmaW5lIEFSNUtfQ0NGRwkJMHgwNjAwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX0NDRkdfV0lORE9XX1NJWkUJMHgwMDAwMDAwNwkvKiBDb21wcmVzc2lvbiB3aW5kb3cgc2l6ZSAqLworI2RlZmluZQlBUjVLX0NDRkdfQ1BDX0VOCTB4MDAwMDAwMDgJLyogRW5hYmxlIHBlcmZvcm1hbmNlIGNvdW50ZXJzICovCisKKyNkZWZpbmUgQVI1S19DQ0ZHX0NDVQkJMHgwNjA0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX0NDRkdfQ0NVX0NVUF9FTgkweDAwMDAwMDAxCS8qIENDVSBDYXRjaHVwIGVuYWJsZSAqLworI2RlZmluZSBBUjVLX0NDRkdfQ0NVX0NSRURJVAkweDAwMDAwMDAyCS8qIENDVSBDcmVkaXQgKGZpZWxkKSAqLworI2RlZmluZSBBUjVLX0NDRkdfQ0NVX0NEX1RIUkVTCTB4MDAwMDAwODAJLyogQ0NVIEN5YyhsaWM/KSBkZWJ0IHRocmVzaG9sZCAoZmllbGQpICovCisjZGVmaW5lIEFSNUtfQ0NGR19DQ1VfQ1VQX0xDTlQJMHgwMDAxMDAwMAkvKiBDQ1UgQ2F0Y2h1cCBsaXQoPykgY291bnQgKi8KKyNkZWZpbmUJQVI1S19DQ0ZHX0NDVV9JTklUCTB4MDAxMDAyMDAJLyogSW5pdGlhbCB2YWx1ZSBkdXJpbmcgcmVzZXQgKi8KKworLyoKKyAqIENvbXByZXNzaW9uIHBlcmZvcm1hbmNlIGNvdW50ZXIgcmVnaXN0ZXJzIFs1MjEyK10KKyAqLworI2RlZmluZSBBUjVLX0NQQzAJCTB4MDYxMAkJLyogQ29tcHJlc3Npb24gcGVyZm9ybWFuY2UgY291bnRlciAwICovCisjZGVmaW5lIEFSNUtfQ1BDMQkJMHgwNjE0CQkvKiBDb21wcmVzc2lvbiBwZXJmb3JtYW5jZSBjb3VudGVyIDEqLworI2RlZmluZSBBUjVLX0NQQzIJCTB4MDYxOAkJLyogQ29tcHJlc3Npb24gcGVyZm9ybWFuY2UgY291bnRlciAyICovCisjZGVmaW5lIEFSNUtfQ1BDMwkJMHgwNjFjCQkvKiBDb21wcmVzc2lvbiBwZXJmb3JtYW5jZSBjb3VudGVyIDMgKi8KKyNkZWZpbmUgQVI1S19DUENPVkYJCTB4MDYyMAkJLyogQ29tcHJlc3Npb24gcGVyZm9ybWFuY2Ugb3ZlcmZsb3cgKi8KKworCisvKgorICogUXVldWUgY29udHJvbCB1bml0IChRQ1UpIHJlZ2lzdGVycyBbNTIxMStdCisgKgorICogQ2FyZCBoYXMgMTIgVFggUXVldWVzIGJ1dCBpIHNlZSB0aGF0IG9ubHkgMC05IGFyZSB1c2VkICg/KQorICogYm90aCBpbiBiaW5hcnkgSEFMIChzZWUgYWguaCkgYW5kIGFyNWsuIEVhY2ggcXVldWUgaGFzIGl0J3Mgb3duCisgKiBUWERQIGF0IGFkZHJlc3NlcyAweDA4MDAgLSAweDA4MmMsIGEgQ0JSIChDb25zdGFudCBCaXQgUmF0ZSkKKyAqIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKDB4MDhjMCAtIDB4MDhlYyksIGEgcmVhZHkgdGltZSBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlciAoMHgwOTAwIC0gMHgwOTJjKSwgYSBtaXNjIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKDB4MDljMCAtCisgKiAweDA5ZWMpIGFuZCBhIHN0YXR1cyByZWdpc3RlciAoMHgwYTAwIC0gMHgwYTJjKS4gV2UgYWxzbyBoYXZlIHNvbWUKKyAqIGdsb2JhbCByZWdpc3RlcnMsIFFDVSB0cmFuc21pdCBlbmFibGUvZGlzYWJsZSBhbmQgIm9uZSBzaG90IGFybSAoPykiCisgKiBzZXQvY2xlYXIsIHdoaWNoIGNvbnRhaW4gc3RhdHVzIGZvciBhbGwgcXVldWVzICh3ZSBzaGlmdCBieSAxIGZvciBlYWNoCisgKiBxdWV1ZSkuIFRvIGFjY2VzcyB0aGVzZSByZWdpc3RlcnMgZWFzaWx5IHdlIGRlZmluZSBzb21lIG1hY3JvcyBoZXJlCisgKiB0aGF0IGFyZSB1c2VkIGluc2lkZSBIQUwuIEZvciBtb3JlIGluZm9zIGNoZWNrIG91dCAqX3R4X3F1ZXVlIGZ1bmN0cy4KKyAqLworCisvKgorICogR2VuZXJpYyBRQ1UgUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcworICovCisjZGVmaW5lCUFSNUtfUVVFVUVfUkVHKF9yLCBfcSkJCSgoKF9xKSA8PCAyKSArIF9yKQorI2RlZmluZSBBUjVLX1FDVV9HTE9CQUxfUkVBRChfciwgX3EpCShBUjVLX1JFR19SRUFEKF9yKSAmICgxIDw8IF9xKSkKKyNkZWZpbmUgQVI1S19RQ1VfR0xPQkFMX1dSSVRFKF9yLCBfcSkJQVI1S19SRUdfV1JJVEUoX3IsICgxIDw8IF9xKSkKKworLyoKKyAqIFFDVSBUcmFuc21pdCBkZXNjcmlwdG9yIHBvaW50ZXIgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgQVI1S19RQ1VfVFhEUF9CQVNFCTB4MDgwMAkJLyogUmVnaXN0ZXIgQWRkcmVzcyAtIFF1ZXVlMCBUWERQICovCisjZGVmaW5lIEFSNUtfUVVFVUVfVFhEUChfcSkJQVI1S19RVUVVRV9SRUcoQVI1S19RQ1VfVFhEUF9CQVNFLCBfcSkKKworLyoKKyAqIFFDVSBUcmFuc21pdCBlbmFibGUgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1FDVV9UWEUJCTB4MDg0MAorI2RlZmluZSBBUjVLX0VOQUJMRV9RVUVVRShfcSkJQVI1S19RQ1VfR0xPQkFMX1dSSVRFKEFSNUtfUUNVX1RYRSwgX3EpCisjZGVmaW5lIEFSNUtfUVVFVUVfRU5BQkxFRChfcSkJQVI1S19RQ1VfR0xPQkFMX1JFQUQoQVI1S19RQ1VfVFhFLCBfcSkKKworLyoKKyAqIFFDVSBUcmFuc21pdCBkaXNhYmxlIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19RQ1VfVFhECQkweDA4ODAKKyNkZWZpbmUgQVI1S19ESVNBQkxFX1FVRVVFKF9xKQlBUjVLX1FDVV9HTE9CQUxfV1JJVEUoQVI1S19RQ1VfVFhELCBfcSkKKyNkZWZpbmUgQVI1S19RVUVVRV9ESVNBQkxFRChfcSkJQVI1S19RQ1VfR0xPQkFMX1JFQUQoQVI1S19RQ1VfVFhELCBfcSkKKworLyoKKyAqIFFDVSBDb25zdGFudCBCaXQgUmF0ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICovCisjZGVmaW5lCUFSNUtfUUNVX0NCUkNGR19CQVNFCQkweDA4YzAJLyogUmVnaXN0ZXIgQWRkcmVzcyAtIFF1ZXVlMCBDQlJDRkcgKi8KKyNkZWZpbmUJQVI1S19RQ1VfQ0JSQ0ZHX0lOVFZBTAkJMHgwMGZmZmZmZgkvKiBDQlIgSW50ZXJ2YWwgbWFzayAqLworI2RlZmluZSBBUjVLX1FDVV9DQlJDRkdfSU5UVkFMX1MJMAorI2RlZmluZQlBUjVLX1FDVV9DQlJDRkdfT1JOX1RIUkVTCTB4ZmYwMDAwMDAJLyogQ0JSIG92ZXJydW4gdGhyZXNob2xkIG1hc2sgKi8KKyNkZWZpbmUgQVI1S19RQ1VfQ0JSQ0ZHX09STl9USFJFU19TCTI0CisjZGVmaW5lCUFSNUtfUVVFVUVfQ0JSQ0ZHKF9xKQkJQVI1S19RVUVVRV9SRUcoQVI1S19RQ1VfQ0JSQ0ZHX0JBU0UsIF9xKQorCisvKgorICogUUNVIFJlYWR5IHRpbWUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKKyAqLworI2RlZmluZQlBUjVLX1FDVV9SRFlUSU1FQ0ZHX0JBU0UJMHgwOTAwCS8qIFJlZ2lzdGVyIEFkZHJlc3MgLSBRdWV1ZTAgUkRZVElNRUNGRyAqLworI2RlZmluZQlBUjVLX1FDVV9SRFlUSU1FQ0ZHX0lOVFZBTAkweDAwZmZmZmZmCS8qIFJlYWR5IHRpbWUgaW50ZXJ2YWwgbWFzayAqLworI2RlZmluZSBBUjVLX1FDVV9SRFlUSU1FQ0ZHX0lOVFZBTF9TCTAKKyNkZWZpbmUJQVI1S19RQ1VfUkRZVElNRUNGR19FTkFCTEUJMHgwMTAwMDAwMAkvKiBSZWFkeSB0aW1lIGVuYWJsZSBtYXNrICovCisjZGVmaW5lIEFSNUtfUVVFVUVfUkRZVElNRUNGRyhfcSkJQVI1S19RVUVVRV9SRUcoQVI1S19RQ1VfUkRZVElNRUNGR19CQVNFLCBfcSkKKworLyoKKyAqIFFDVSBvbmUgc2hvdCBhcm0gc2V0IHJlZ2lzdGVycworICovCisjZGVmaW5lCUFSNUtfUUNVX09ORVNIT1RBUk1fU0VUCQkweDA5NDAJLyogUmVnaXN0ZXIgQWRkcmVzcyAtUUNVICJvbmUgc2hvdCBhcm0gc2V0ICg/KSIgKi8KKyNkZWZpbmUJQVI1S19RQ1VfT05FU0hPVEFSTV9TRVRfTQkweDAwMDBmZmZmCisKKy8qCisgKiBRQ1Ugb25lIHNob3QgYXJtIGNsZWFyIHJlZ2lzdGVycworICovCisjZGVmaW5lCUFSNUtfUUNVX09ORVNIT1RBUk1fQ0xFQVIJMHgwOTgwCS8qIFJlZ2lzdGVyIEFkZHJlc3MgLVFDVSAib25lIHNob3QgYXJtIGNsZWFyICg/KSIgKi8KKyNkZWZpbmUJQVI1S19RQ1VfT05FU0hPVEFSTV9DTEVBUl9NCTB4MDAwMGZmZmYKKworLyoKKyAqIFFDVSBtaXNjIHJlZ2lzdGVycworICovCisjZGVmaW5lIEFSNUtfUUNVX01JU0NfQkFTRQkJMHgwOWMwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAtUXVldWUwIE1JU0MgKi8KKyNkZWZpbmUJQVI1S19RQ1VfTUlTQ19GUlNIRURfTQkJMHgwMDAwMDAwZgkvKiBGcmFtZSBzaGVkdWxpbmcgbWFzayAqLworI2RlZmluZQlBUjVLX1FDVV9NSVNDX0ZSU0hFRF9BU0FQCQkwCS8qIEFTQVAgKi8KKyNkZWZpbmUJQVI1S19RQ1VfTUlTQ19GUlNIRURfQ0JSCQkxCS8qIENvbnN0YW50IEJpdCBSYXRlICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX0RCQV9HVAkJMgkvKiBETUEgQmVhY29uIGFsZXJ0IGdhdGVkICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX1RJTV9HVAkJMwkvKiBUSU1UIGdhdGVkICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX0JDTl9TRU5UX0dUCTQJLyogQmVhY29uIHNlbnQgZ2F0ZWQgKi8KKyNkZWZpbmUJQVI1S19RQ1VfTUlTQ19PTkVTSE9UX0VOQUJMRQkweDAwMDAwMDEwCS8qIE9uZXNob3QgZW5hYmxlICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfQ0JSRVhQX0RJUwkweDAwMDAwMDIwCS8qIERpc2FibGUgQ0JSIGV4cGlyZWQgY291bnRlciAobm9ybWFsIHF1ZXVlKSAqLworI2RlZmluZQlBUjVLX1FDVV9NSVNDX0NCUkVYUF9CQ05fRElTCTB4MDAwMDAwNDAJLyogRGlzYWJsZSBDQlIgZXhwaXJlZCBjb3VudGVyIChiZWFjb24gcXVldWUpICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfQkNOX0VOQUJMRQkweDAwMDAwMDgwCS8qIEVuYWJsZSBCZWFjb24gdXNlICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfQ0JSX1RIUkVTX0VOQUJMRQkweDAwMDAwMTAwCS8qIENCUiBleHBpcmVkIHRocmVzaG9sZCBlbmFibGVkICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfUkRZX1ZFT0xfUE9MSUNZCTB4MDAwMDAyMDAJLyogVFhFIHJlc2V0IHdoZW4gUkRZVElNRSBleHBpcmVkIG9yIFZFT0wgKi8KKyNkZWZpbmUJQVI1S19RQ1VfTUlTQ19DQlJfUkVTRVRfQ05UCTB4MDAwMDA0MDAJLyogQ0JSIHRocmVzaG9sZCAoY291bnRlcikgcmVzZXQgKi8KKyNkZWZpbmUJQVI1S19RQ1VfTUlTQ19EQ1VfRUFSTFkJCTB4MDAwMDA4MDAJLyogRENVIGVhcmx5IHRlcm1pbmF0aW9uICovCisjZGVmaW5lIEFSNUtfUUNVX01JU0NfRENVX0NNUF9FTgkweDAwMDAxMDAwCS8qIEVuYWJsZSBmcmFtZSBjb21wcmVzc2lvbiAqLworI2RlZmluZSBBUjVLX1FVRVVFX01JU0MoX3EpCQlBUjVLX1FVRVVFX1JFRyhBUjVLX1FDVV9NSVNDX0JBU0UsIF9xKQorCisKKy8qCisgKiBRQ1Ugc3RhdHVzIHJlZ2lzdGVycworICovCisjZGVmaW5lIEFSNUtfUUNVX1NUU19CQVNFCTB4MGEwMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgLSBRdWV1ZTAgU1RTICovCisjZGVmaW5lCUFSNUtfUUNVX1NUU19GUk1QRU5EQ05UCTB4MDAwMDAwMDMJLyogRnJhbWVzIHBlbmRpbmcgY291bnRlciAqLworI2RlZmluZQlBUjVLX1FDVV9TVFNfQ0JSRVhQQ05UCTB4MDAwMGZmMDAJLyogQ0JSIGV4cGlyZWQgY291bnRlciAqLworI2RlZmluZQlBUjVLX1FVRVVFX1NUQVRVUyhfcSkJQVI1S19RVUVVRV9SRUcoQVI1S19RQ1VfU1RTX0JBU0UsIF9xKQorCisvKgorICogUUNVIHJlYWR5IHRpbWUgc2h1dGRvd24gcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1FDVV9SRFlUSU1FU0hETgkweDBhNDAKKyNkZWZpbmUgQVI1S19RQ1VfUkRZVElNRVNIRE5fTQkweDAwMDAwM2ZmCisKKy8qCisgKiBRQ1UgY29tcHJlc3Npb24gYnVmZmVyIGJhc2UgcmVnaXN0ZXJzIFs1MjEyK10KKyAqLworI2RlZmluZSBBUjVLX1FDVV9DQkJfU0VMRUNUCTB4MGIwMAorI2RlZmluZSBBUjVLX1FDVV9DQkJfQUREUgkweDBiMDQKKyNkZWZpbmUgQVI1S19RQ1VfQ0JCX0FERFJfUwk5CisKKy8qCisgKiBRQ1UgY29tcHJlc3Npb24gYnVmZmVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgWzUyMTIrXQorICogKGJ1ZmZlciBzaXplKQorICovCisjZGVmaW5lIEFSNUtfUUNVX0NCQ0ZHCQkweDBiMDgKKworCisKKy8qCisgKiBEaXN0cmlidXRlZCBDb29yZGluYXRpb24gRnVuY3Rpb24gKERDRikgY29udHJvbCB1bml0IChEQ1UpCisgKiByZWdpc3RlcnMgWzUyMTErXQorICoKKyAqIFRoZXNlIHJlZ2lzdGVycyBjb250cm9sIHRoZSB2YXJpb3VzIGNoYXJhY3RlcmlzdGljcyBvZiBlYWNoIHF1ZXVlCisgKiBmb3IgODAyLjExZSAoV01FKSBjb21iYXRpYmlsaXR5IHNvIHRoZXkgZ28gdG9nZXRoZXIgd2l0aAorICogUUNVIHJlZ2lzdGVycyBpbiBwYWlycy4gRm9yIGVhY2ggcXVldWUgd2UgaGF2ZSBhIFFDVSBtYXNrIHJlZ2lzdGVyLAorICogKDB4MTAwMCAtIDB4MTAyYyksIGEgbG9jYWwtSUZTIHNldHRpbmdzIHJlZ2lzdGVyICgweDEwNDAgLSAweDEwNmMpLAorICogYSByZXRyeSBsaW1pdCByZWdpc3RlciAoMHgxMDgwIC0gMHgxMGFjKSwgYSBjaGFubmVsIHRpbWUgcmVnaXN0ZXIKKyAqICgweDEwYzAgLSAweDEwZWMpLCBhIG1pc2Mtc2V0dGluZ3MgcmVnaXN0ZXIgKDB4MTEwMCAtIDB4MTEyYykgYW5kCisgKiBhIHNlcXVlbmNlIG51bWJlciByZWdpc3RlciAoMHgxMTQwIC0gMHgxMTZjKS4gSXQgc2VlbXMgdGhhdCAiZ2xvYmFsIgorICogcmVnaXN0ZXJzIGhlcmUgYWZlY3QgYWxsIHF1ZXVlcyAoc2VlIHVzZSBvZiBEQ1VfR0JMX0lGU19TTE9UIGluIGFyNWspLgorICogV2UgdXNlIHRoZSBzYW1lIG1hY3JvcyBoZXJlIGZvciBlYXNpZXIgcmVnaXN0ZXIgYWNjZXNzLgorICoKKyAqLworCisvKgorICogRENVIFFDVSBtYXNrIHJlZ2lzdGVycworICovCisjZGVmaW5lIEFSNUtfRENVX1FDVU1BU0tfQkFTRQkweDEwMDAJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgLVF1ZXVlMCBEQ1VfUUNVTUFTSyAqLworI2RlZmluZSBBUjVLX0RDVV9RQ1VNQVNLX00JMHgwMDAwMDNmZgorI2RlZmluZSBBUjVLX1FVRVVFX1FDVU1BU0soX3EpCUFSNUtfUVVFVUVfUkVHKEFSNUtfRENVX1FDVU1BU0tfQkFTRSwgX3EpCisKKy8qCisgKiBEQ1UgbG9jYWwgSW50ZXIgRnJhbWUgU3BhY2Ugc2V0dGluZ3MgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0RDVV9MQ0xfSUZTX0JBU0UJCTB4MTA0MAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgLVF1ZXVlMCBEQ1VfTENMX0lGUyAqLworI2RlZmluZQlBUjVLX0RDVV9MQ0xfSUZTX0NXX01JTgkgICAgICAgIDB4MDAwMDAzZmYJLyogTWluaW11bSBDb250ZW50aW9uIFdpbmRvdyAqLworI2RlZmluZQlBUjVLX0RDVV9MQ0xfSUZTX0NXX01JTl9TCTAKKyNkZWZpbmUJQVI1S19EQ1VfTENMX0lGU19DV19NQVgJICAgICAgICAweDAwMGZmYzAwCS8qIE1heGltdW0gQ29udGVudGlvbiBXaW5kb3cgKi8KKyNkZWZpbmUJQVI1S19EQ1VfTENMX0lGU19DV19NQVhfUwkxMAorI2RlZmluZQlBUjVLX0RDVV9MQ0xfSUZTX0FJRlMJCTB4MGZmMDAwMDAJLyogQXJiaXRyYXRlZCBJbnRlcmZyYW1lIFNwYWNlICovCisjZGVmaW5lCUFSNUtfRENVX0xDTF9JRlNfQUlGU19TCQkyMAorI2RlZmluZQlBUjVLX0RDVV9MQ0xfSUZTX0FJRlNfTUFYCTB4ZmMJCS8qIEFueXRoaW5nIGFib3ZlIHRoYXQgY2FuIGNhdXNlIERDVSB0byBoYW5nICovCisjZGVmaW5lCUFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUyhfcSkJQVI1S19RVUVVRV9SRUcoQVI1S19EQ1VfTENMX0lGU19CQVNFLCBfcSkKKworLyoKKyAqIERDVSByZXRyeSBsaW1pdCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBBUjVLX0RDVV9SRVRSWV9MTVRfQkFTRQkJMHgxMDgwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAtUXVldWUwIERDVV9SRVRSWV9MTVQgKi8KKyNkZWZpbmUgQVI1S19EQ1VfUkVUUllfTE1UX1NIX1JFVFJZCTB4MDAwMDAwMGYJLyogU2hvcnQgcmV0cnkgbGltaXQgbWFzayAqLworI2RlZmluZSBBUjVLX0RDVV9SRVRSWV9MTVRfU0hfUkVUUllfUwkwCisjZGVmaW5lIEFSNUtfRENVX1JFVFJZX0xNVF9MR19SRVRSWQkweDAwMDAwMGYwCS8qIExvbmcgcmV0cnkgbGltaXQgbWFzayAqLworI2RlZmluZSBBUjVLX0RDVV9SRVRSWV9MTVRfTEdfUkVUUllfUwk0CisjZGVmaW5lIEFSNUtfRENVX1JFVFJZX0xNVF9TU0hfUkVUUlkJMHgwMDAwM2YwMAkvKiBTdGF0aW9uIHNob3J0IHJldHJ5IGxpbWl0IG1hc2sgKD8pICovCisjZGVmaW5lIEFSNUtfRENVX1JFVFJZX0xNVF9TU0hfUkVUUllfUwk4CisjZGVmaW5lIEFSNUtfRENVX1JFVFJZX0xNVF9TTEdfUkVUUlkJMHgwMDBmYzAwMAkvKiBTdGF0aW9uIGxvbmcgcmV0cnkgbGltaXQgbWFzayAoPykgKi8KKyNkZWZpbmUgQVI1S19EQ1VfUkVUUllfTE1UX1NMR19SRVRSWV9TCTE0CisjZGVmaW5lCUFSNUtfUVVFVUVfREZTX1JFVFJZX0xJTUlUKF9xKQlBUjVLX1FVRVVFX1JFRyhBUjVLX0RDVV9SRVRSWV9MTVRfQkFTRSwgX3EpCisKKy8qCisgKiBEQ1UgY2hhbm5lbCB0aW1lIHJlZ2lzdGVycworICovCisjZGVmaW5lIEFSNUtfRENVX0NIQU5fVElNRV9CQVNFCQkweDEwYzAJCQkvKiBSZWdpc3RlciBBZGRyZXNzIC1RdWV1ZTAgRENVX0NIQU5fVElNRSAqLworI2RlZmluZQlBUjVLX0RDVV9DSEFOX1RJTUVfRFVSCQkweDAwMGZmZmZmCS8qIENoYW5uZWwgdGltZSBkdXJhdGlvbiAqLworI2RlZmluZQlBUjVLX0RDVV9DSEFOX1RJTUVfRFVSX1MJMAorI2RlZmluZQlBUjVLX0RDVV9DSEFOX1RJTUVfRU5BQkxFCTB4MDAxMDAwMDAJLyogRW5hYmxlIGNoYW5uZWwgdGltZSAqLworI2RlZmluZSBBUjVLX1FVRVVFX0RGU19DSEFOTkVMX1RJTUUoX3EpCUFSNUtfUVVFVUVfUkVHKEFSNUtfRENVX0NIQU5fVElNRV9CQVNFLCBfcSkKKworLyoKKyAqIERDVSBtaXNjIHJlZ2lzdGVycyBbNTIxMStdCisgKgorICogTm90ZTogQXJiaXRlciBsb2Nrb3V0IGNvbnRyb2wgY29udHJvbHMgdGhlCisgKiBiZWhhdmlvdXIgb24gbG93IHByaW9yaXR5IHF1ZXVlcyB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgcXVldWVzCisgKiB3aXRoIHBlbmRpbmcgZnJhbWVzLiBJbnRyYS1mcmFtZSBsb2Nrb3V0IG1lYW5zIHdlIHdhaXQgdW50aWwKKyAqIHRoZSBxdWV1ZSdzIGN1cnJlbnQgZnJhbWUgdHJhbnNtaXRzICh3aXRoIHBvc3QgZnJhbWUgYmFja29mZiBhbmQgYnVyc3RpbmcpCisgKiBiZWZvcmUgd2UgdHJhbnNtaXQgYW55dGhpbmcgZWxzZSBhbmQgZ2xvYmFsIGxvY2tvdXQgbWVhbnMgd2UKKyAqIHdhaXQgZm9yIHRoZSB3aG9sZSBxdWV1ZSB0byBmaW5pc2ggYmVmb3JlIGhpZ2hlciBwcmlvcml0eSBxdWV1ZXMKKyAqIGNhbiB0cmFuc21pdCAodGhpcyBpcyB1c2VkIG9uIGJlYWNvbiBhbmQgQ0FCIHF1ZXVlcykuCisgKiBObyBsb2Nrb3V0IG1lYW5zIHRoZXJlIGlzIG5vIHNwZWNpYWwgaGFuZGxpbmcuCisgKi8KKyNkZWZpbmUgQVI1S19EQ1VfTUlTQ19CQVNFCQkweDExMDAJCQkvKiBSZWdpc3RlciBBZGRyZXNzIC1RdWV1ZTAgRENVX01JU0MgKi8KKyNkZWZpbmUJQVI1S19EQ1VfTUlTQ19CQUNLT0ZGCQkweDAwMDAwMDNmCS8qIE1hc2sgZm9yIGJhY2tvZmYgdGhyZXNob2xkICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfRVRTX1JUU19QT0wJMHgwMDAwMDA0MAkvKiBFbmQgb2YgdHJhbnNtaXNzaW9uIHNlcmllcworCQkJCQkJCXN0YXRpb24gUlRTL2RhdGEgZmFpbHVyZSBjb3VudAorCQkJCQkJCXJlc2V0IHBvbGljeSAoPykgKi8KKyNkZWZpbmUgQVI1S19EQ1VfTUlTQ19FVFNfQ1dfUE9MCTB4MDAwMDAwODAJLyogRW5kIG9mIHRyYW5zbWlzc2lvbiBzZXJpZXMKKwkJCQkJCQlDVyByZXNldCBwb2xpY3kgKi8KKyNkZWZpbmUJQVI1S19EQ1VfTUlTQ19GUkFHX1dBSVQJCTB4MDAwMDAxMDAJLyogV2FpdCBmb3IgbmV4dCBmcmFnbWVudCAqLworI2RlZmluZSBBUjVLX0RDVV9NSVNDX0JBQ0tPRkZfRlJBRwkweDAwMDAwMjAwCS8qIEVuYWJsZSBiYWNrb2ZmIHdoaWxlIGJ1cnN0aW5nICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfSENGUE9MTF9FTkFCTEUJMHgwMDAwMDgwMAkvKiBDRiAtIFBvbGwgZW5hYmxlICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfQkFDS09GRl9QRVJTSVNUCTB4MDAwMDEwMDAJLyogUGVyc2lzdGVudCBiYWNrb2ZmICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfRlJNUFJGVENIX0VOQUJMRQkweDAwMDAyMDAwCS8qIEVuYWJsZSBmcmFtZSBwcmUtZmV0Y2ggKi8KKyNkZWZpbmUJQVI1S19EQ1VfTUlTQ19WSVJUQ09MCQkweDAwMDBjMDAwCS8qIE1hc2sgZm9yIFZpcnR1YWwgQ29sbGlzaW9uICg/KSAqLworI2RlZmluZQlBUjVLX0RDVV9NSVNDX1ZJUlRDT0xfTk9STUFMCTAKKyNkZWZpbmUJQVI1S19EQ1VfTUlTQ19WSVJUQ09MX0lHTk9SRQkxCisjZGVmaW5lCUFSNUtfRENVX01JU0NfQkNOX0VOQUJMRQkweDAwMDEwMDAwCS8qIEVuYWJsZSBCZWFjb24gdXNlICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfQVJCTE9DS19DVEwJMHgwMDA2MDAwMAkvKiBBcmJpdGVyIGxvY2tvdXQgY29udHJvbCBtYXNrICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfQVJCTE9DS19DVExfUwkxNworI2RlZmluZQlBUjVLX0RDVV9NSVNDX0FSQkxPQ0tfQ1RMX05PTkUJCTAJLyogTm8gYXJiaXRlciBsb2Nrb3V0ICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfQVJCTE9DS19DVExfSU5URlJNCTEJLyogSW50cmEtZnJhbWUgbG9ja291dCAqLworI2RlZmluZQlBUjVLX0RDVV9NSVNDX0FSQkxPQ0tfQ1RMX0dMT0JBTAkyCS8qIEdsb2JhbCBsb2Nrb3V0ICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfQVJCTE9DS19JR05PUkUJMHgwMDA4MDAwMAkvKiBJZ25vcmUgQXJiaXRlciBsb2Nrb3V0ICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfU0VRX05VTV9JTkNSX0RJUwkweDAwMTAwMDAwCS8qIERpc2FibGUgc2VxdWVuY2UgbnVtYmVyIGluY3JlbWVudCAqLworI2RlZmluZQlBUjVLX0RDVV9NSVNDX1BPU1RfRlJfQktPRkZfRElTCTB4MDAyMDAwMDAJLyogRGlzYWJsZSBwb3N0LWZyYW1lIGJhY2tvZmYgKi8KKyNkZWZpbmUJQVI1S19EQ1VfTUlTQ19WSVJUX0NPTExfUE9MSUNZCTB4MDA0MDAwMDAJLyogVmlydHVhbCBDb2xsaXNpb24gY3cgcG9saWN5ICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfQkxPV05fSUZTX1BPTElDWQkweDAwODAwMDAwCS8qIEJsb3duIElGUyBwb2xpY3kgKD8pICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfU0VRTlVNX0NUTAkweDAxMDAwMDAwCS8qIFNlcXVlbmNlIG51bWJlciBjb250cm9sICg/KSAqLworI2RlZmluZSBBUjVLX1FVRVVFX0RGU19NSVNDKF9xKQkJQVI1S19RVUVVRV9SRUcoQVI1S19EQ1VfTUlTQ19CQVNFLCBfcSkKKworLyoKKyAqIERDVSBmcmFtZSBzZXF1ZW5jZSBudW1iZXIgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgQVI1S19EQ1VfU0VRTlVNX0JBU0UJCTB4MTE0MAorI2RlZmluZQlBUjVLX0RDVV9TRVFOVU1fTQkJMHgwMDAwMGZmZgorI2RlZmluZQlBUjVLX1FVRVVFX0RDVV9TRVFOVU0oX3EpCUFSNUtfUVVFVUVfUkVHKEFSNUtfRENVX1NFUU5VTV9CQVNFLCBfcSkKKworLyoKKyAqIERDVSBnbG9iYWwgSUZTIFNJRlMgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0RDVV9HQkxfSUZTX1NJRlMJMHgxMDMwCisjZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfU0lGU19NCTB4MDAwMGZmZmYKKworLyoKKyAqIERDVSBnbG9iYWwgSUZTIHNsb3QgaW50ZXJ2YWwgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0RDVV9HQkxfSUZTX1NMT1QJMHgxMDcwCisjZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfU0xPVF9NCTB4MDAwMGZmZmYKKworLyoKKyAqIERDVSBnbG9iYWwgSUZTIEVJRlMgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0RDVV9HQkxfSUZTX0VJRlMJMHgxMGIwCisjZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfRUlGU19NCTB4MDAwMGZmZmYKKworLyoKKyAqIERDVSBnbG9iYWwgSUZTIG1pc2MgcmVnaXN0ZXIKKyAqCisgKiBMRlNSIHN0YW5kcyBmb3IgTGluZWFyIEZlZWRiYWNrIFNoaWZ0IFJlZ2lzdGVyCisgKiBhbmQgaXQncyB1c2VkIGZvciBnZW5lcmF0aW5nIHBzZXVkby1yYW5kb20KKyAqIG51bWJlciBzZXF1ZW5jZXMuCisgKgorICogKElmIGkgdW5kZXJzdGFuZCBjb3JlY3RseSwgcmFuZG9tIG51bWJlcnMgYXJlCisgKiB1c2VkIGZvciBpZGxlIHNlbnNpbmcgLW11bHRpcGxpZWQgd2l0aCBjd21pbi9tYXggZXRjLSkKKyAqLworI2RlZmluZSBBUjVLX0RDVV9HQkxfSUZTX01JU0MJCQkweDEwZjAJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfRENVX0dCTF9JRlNfTUlTQ19MRlNSX1NMSUNFCTB4MDAwMDAwMDcJLyogTEZTUiBTbGljZSBTZWxlY3QgKi8KKyNkZWZpbmUJQVI1S19EQ1VfR0JMX0lGU19NSVNDX1RVUkJPX01PREUJMHgwMDAwMDAwOAkvKiBUdXJibyBtb2RlICovCisjZGVmaW5lCUFSNUtfRENVX0dCTF9JRlNfTUlTQ19TSUZTX0RVUl9VU0VDCTB4MDAwMDAzZjAJLyogU0lGUyBEdXJhdGlvbiBtYXNrICovCisjZGVmaW5lCUFSNUtfRENVX0dCTF9JRlNfTUlTQ19VU0VDX0RVUgkJMHgwMDBmZmMwMAkvKiBVU0VDIER1cmF0aW9uIG1hc2sgKi8KKyNkZWZpbmUJQVI1S19EQ1VfR0JMX0lGU19NSVNDX1VTRUNfRFVSX1MJMTAKKyNkZWZpbmUJQVI1S19EQ1VfR0JMX0lGU19NSVNDX0RDVV9BUkJfREVMQVkJMHgwMDMwMDAwMAkvKiBEQ1UgQXJiaXRlciBkZWxheSBtYXNrICovCisjZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfTUlTQ19TSUZTX0NOVF9SU1QJMHgwMDQwMDAwMAkvKiBTSUZTIGNudCByZXNldCBwb2xpY3kgKD8pICovCisjZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfTUlTQ19BSUZTX0NOVF9SU1QJMHgwMDgwMDAwMAkvKiBBSUZTIGNudCByZXNldCBwb2xpY3kgKD8pICovCisjZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfTUlTQ19STkRfTEZTUl9TTF9ESVMJMHgwMTAwMDAwMAkvKiBEaXNhYmxlIHJhbmRvbSBMRlNSIHNsaWNlICovCisKKy8qCisgKiBEQ1UgZnJhbWUgcHJlZmV0Y2ggY29udHJvbCByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfRENVX0ZQCQkJMHgxMjMwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX0RDVV9GUF9OT0JVUlNUX0RDVV9FTgkweDAwMDAwMDAxCS8qIEVuYWJsZSBub24tYnVyc3QgcHJlZmV0Y2ggb24gRENVICg/KSAqLworI2RlZmluZSBBUjVLX0RDVV9GUF9OT0JVUlNUX0VOCQkweDAwMDAwMDEwCS8qIEVuYWJsZSBub24tYnVyc3QgcHJlZmV0Y2ggKD8pICovCisjZGVmaW5lIEFSNUtfRENVX0ZQX0JVUlNUX0RDVV9FTgkweDAwMDAwMDIwCS8qIEVuYWJsZSBidXJzdCBwcmVmZXRjaCBvbiBEQ1UgKD8pICovCisKKy8qCisgKiBEQ1UgdHJhbnNtaXQgcGF1c2UgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0RDVV9UWFAJCTB4MTI3MAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19EQ1VfVFhQX00JCTB4MDAwMDAzZmYJLyogVHggcGF1c2UgbWFzayAqLworI2RlZmluZQlBUjVLX0RDVV9UWFBfU1RBVFVTCTB4MDAwMTAwMDAJLyogVHggcGF1c2Ugc3RhdHVzICovCisKKy8qCisgKiBEQ1UgdHJhbnNtaXQgZmlsdGVyIHRhYmxlIDAgKDMyIGVudHJpZXMpCisgKiBlYWNoIGVudHJ5IGNvbnRhaW5zIGEgMzJiaXQgc2xpY2Ugb2YgdGhlCisgKiAxMjhiaXQgdHggZmlsdGVyIGZvciBlYWNoIERDVSAoNCBzbGljZXMgcGVyIERDVSkKKyAqLworI2RlZmluZSBBUjVLX0RDVV9UWF9GSUxURVJfMF9CQVNFCTB4MTAzOAorI2RlZmluZQlBUjVLX0RDVV9UWF9GSUxURVJfMChfbikJKEFSNUtfRENVX1RYX0ZJTFRFUl8wX0JBU0UgKyAoX24gKiA2NCkpCisKKy8qCisgKiBEQ1UgdHJhbnNtaXQgZmlsdGVyIHRhYmxlIDEgKDE2IGVudHJpZXMpCisgKi8KKyNkZWZpbmUgQVI1S19EQ1VfVFhfRklMVEVSXzFfQkFTRQkweDEwM2MKKyNkZWZpbmUJQVI1S19EQ1VfVFhfRklMVEVSXzEoX24pCShBUjVLX0RDVV9UWF9GSUxURVJfMV9CQVNFICsgKF9uICogNjQpKQorCisvKgorICogRENVIGNsZWFyIHRyYW5zbWl0IGZpbHRlciByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfRENVX1RYX0ZJTFRFUl9DTFIJMHgxNDNjCisKKy8qCisgKiBEQ1Ugc2V0IHRyYW5zbWl0IGZpbHRlciByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfRENVX1RYX0ZJTFRFUl9TRVQJMHgxNDdjCisKKy8qCisgKiBSZXNldCBjb250cm9sIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19SRVNFVF9DVEwJCTB4NDAwMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19SRVNFVF9DVExfUENVCTB4MDAwMDAwMDEJLyogUHJvdG9jb2wgQ29udHJvbCBVbml0IHJlc2V0ICovCisjZGVmaW5lIEFSNUtfUkVTRVRfQ1RMX0RNQQkweDAwMDAwMDAyCS8qIERNQSAoUngvVHgpIHJlc2V0IFs1MjEwXSAqLworI2RlZmluZQlBUjVLX1JFU0VUX0NUTF9CQVNFQkFORAkweDAwMDAwMDAyCS8qIEJhc2ViYW5kIHJlc2V0IFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19SRVNFVF9DVExfTUFDCTB4MDAwMDAwMDQJLyogTUFDIHJlc2V0IChQQ1UrQmFzZWJhbmQgPykgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfUkVTRVRfQ1RMX1BIWQkweDAwMDAwMDA4CS8qIFBIWSByZXNldCBbNTIxMF0gKi8KKyNkZWZpbmUgQVI1S19SRVNFVF9DVExfUENJCTB4MDAwMDAwMTAJLyogUENJIENvcmUgcmVzZXQgKGludGVycnVwdHMgZXRjKSAqLworCisvKgorICogU2xlZXAgY29udHJvbCByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfU0xFRVBfQ1RMCQkJMHg0MDA0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX1NMRUVQX0NUTF9TTERVUgkJMHgwMDAwZmZmZgkvKiBTbGVlcCBkdXJhdGlvbiBtYXNrICovCisjZGVmaW5lIEFSNUtfU0xFRVBfQ1RMX1NMRFVSX1MJCTAKKyNkZWZpbmUgQVI1S19TTEVFUF9DVExfU0xFCQkweDAwMDMwMDAwCS8qIFNsZWVwIGVuYWJsZSBtYXNrICovCisjZGVmaW5lIEFSNUtfU0xFRVBfQ1RMX1NMRV9TCQkxNgorI2RlZmluZSBBUjVLX1NMRUVQX0NUTF9TTEVfV0FLRQkJMHgwMDAwMDAwMAkvKiBGb3JjZSBjaGlwIGF3YWtlICovCisjZGVmaW5lIEFSNUtfU0xFRVBfQ1RMX1NMRV9TTFAJCTB4MDAwMTAwMDAJLyogRm9yY2UgY2hpcCBzbGVlcCAqLworI2RlZmluZSBBUjVLX1NMRUVQX0NUTF9TTEVfQUxMT1cJMHgwMDAyMDAwMAkvKiBOb3JtYWwgc2xlZXAgcG9saWN5ICovCisjZGVmaW5lIEFSNUtfU0xFRVBfQ1RMX1NMRV9VTklUUwkweDAwMDAwMDA4CS8qIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TTEVFUF9DVExfRFVSX1RJTV9QT0wJMHgwMDA0MDAwMAkvKiBTbGVlcCBkdXJhdGlvbiB0aW1pbmcgcG9saWN5ICovCisjZGVmaW5lIEFSNUtfU0xFRVBfQ1RMX0RVUl9XUklURV9QT0wJMHgwMDA4MDAwMAkvKiBTbGVlcCBkdXJhdGlvbiB3cml0ZSBwb2xpY3kgKi8KKyNkZWZpbmUgQVI1S19TTEVFUF9DVExfU0xFX1BPTAkJMHgwMDEwMDAwMAkvKiBTbGVlcCBwb2xpY3kgbW9kZSAqLworCisvKgorICogSW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0lOVFBFTkQJMHg0MDA4CisjZGVmaW5lIEFSNUtfSU5UUEVORF9NCTB4MDAwMDAwMDEKKworLyoKKyAqIFNsZWVwIGZvcmNlIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19TRlIJMHg0MDBjCisjZGVmaW5lIEFSNUtfU0ZSX0VOCTB4MDAwMDAwMDEKKworLyoKKyAqIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKiBUT0RPOiBGaXggTEVEIHN0dWZmCisgKi8KKyNkZWZpbmUgQVI1S19QQ0lDRkcJCQkweDQwMTAJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0VFQUUJCTB4MDAwMDAwMDEJLyogRWVwcm9tIGFjY2VzcyBlbmFibGUgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX1NMRUVQX0NMT0NLX0VOCTB4MDAwMDAwMDIJLyogRW5hYmxlIHNsZWVwIGNsb2NrICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0NMS1JVTkVOCQkweDAwMDAwMDA0CS8qIENMS1JVTiBlbmFibGUgWzUyMTErXSAqLworI2RlZmluZSBBUjVLX1BDSUNGR19FRVNJWkUJCTB4MDAwMDAwMTgJLyogTWFzayBmb3IgRUVQUk9NIHNpemUgWzUyMTErXSAqLworI2RlZmluZSBBUjVLX1BDSUNGR19FRVNJWkVfUwkJMworI2RlZmluZSBBUjVLX1BDSUNGR19FRVNJWkVfNEsJCTAJCS8qIDRLICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0VFU0laRV84SwkJMQkJLyogOEsgKi8KKyNkZWZpbmUgQVI1S19QQ0lDRkdfRUVTSVpFXzE2SwkJMgkJLyogMTZLICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0VFU0laRV9GQUlMCQkzCQkvKiBGYWlsZWQgdG8gZ2V0IHNpemUgWzUyMTErXSAqLworI2RlZmluZSBBUjVLX1BDSUNGR19MRUQJCQkweDAwMDAwMDYwCS8qIExlZCBzdGF0dXMgWzUyMTErXSAqLworI2RlZmluZSBBUjVLX1BDSUNGR19MRURfTk9ORQkJMHgwMDAwMDAwMAkvKiBEZWZhdWx0IFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19QQ0lDRkdfTEVEX1BFTkQJCTB4MDAwMDAwMjAJLyogU2NhbiAvIEF1dGggcGVuZGluZyAqLworI2RlZmluZSBBUjVLX1BDSUNGR19MRURfQVNTT0MJCTB4MDAwMDAwNDAJLyogQXNzb2NpYXRlZCAqLworI2RlZmluZQlBUjVLX1BDSUNGR19CVVNfU0VMCQkweDAwMDAwMzgwCS8qIE1hc2sgZm9yICJidXMgc2VsZWN0IiBbNTIxMStdICg/KSAqLworI2RlZmluZSBBUjVLX1BDSUNGR19DQkVGSVhfRElTCQkweDAwMDAwNDAwCS8qIERpc2FibGUgQ0JFIGZpeCAqLworI2RlZmluZSBBUjVLX1BDSUNGR19TTF9JTlRFTgkJMHgwMDAwMDgwMAkvKiBFbmFibGUgaW50ZXJydXB0cyB3aGVuIGFzbGVlcCAqLworI2RlZmluZSBBUjVLX1BDSUNGR19MRURfQkNUTAkJMHgwMDAwMTAwMAkvKiBMZWQgYmxpbmsgKD8pIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX1BDSUNGR19SRVRSWV9GSVgJCTB4MDAwMDEwMDAJLyogRW5hYmxlIHBjaSBjb3JlIHJldHJ5IGZpeCAqLworI2RlZmluZSBBUjVLX1BDSUNGR19TTF9JTlBFTgkJMHgwMDAwMjAwMAkvKiBTbGVlcCBldmVuIHdoaXRoIHBlbmRpbmcgaW50ZXJydXB0cyovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX1NQV1JfRE4JCTB4MDAwMTAwMDAJLyogTWFzayBmb3IgcG93ZXIgc3RhdHVzICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFRE1PREUJCTB4MDAwZTAwMDAJLyogTGVkbW9kZSBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFRE1PREVfUFJPUAkweDAwMDAwMDAwCS8qIEJsaW5rIG9uIHN0YW5kYXJkIHRyYWZmaWMgWzUyMTErXSAqLworI2RlZmluZSBBUjVLX1BDSUNGR19MRURNT0RFX1BST00JMHgwMDAyMDAwMAkvKiBEZWZhdWx0IG1vZGUgKGJsaW5rIG9uIGFueSB0cmFmZmljKSBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFRE1PREVfUFdSCQkweDAwMDQwMDAwCS8qIFNvbWUgb3RoZXIgYmxpbmtpbmcgbW9kZSAgKD8pIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19QQ0lDRkdfTEVETU9ERV9SQU5ECTB4MDAwNjAwMDAJLyogUmFuZG9tIGJsaW5raW5nICg/KSBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFREJMSU5LCQkweDAwNzAwMDAwCS8qIExlZCBibGluayByYXRlICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFREJMSU5LX1MJCTIwCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFRFNMT1cJCTB4MDA4MDAwMDAJLyogU2xvd2VzdCBsZWQgYmxpbmsgcmF0ZSBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFRFNUQVRFCQkJCVwKKwkoQVI1S19QQ0lDRkdfTEVEIHwgQVI1S19QQ0lDRkdfTEVETU9ERSB8CVwKKwlBUjVLX1BDSUNGR19MRURCTElOSyB8IEFSNUtfUENJQ0ZHX0xFRFNMT1cpCisjZGVmaW5lCUFSNUtfUENJQ0ZHX1NMRUVQX0NMT0NLX1JBVEUJMHgwMzAwMDAwMAkvKiBTbGVlcCBjbG9jayByYXRlICovCisjZGVmaW5lCUFSNUtfUENJQ0ZHX1NMRUVQX0NMT0NLX1JBVEVfUwkyNAorCisvKgorICogIkdlbmVyYWwgUHVycG9zZSBJbnB1dC9PdXRwdXQiIChHUElPKSBjb250cm9sIHJlZ2lzdGVyCisgKgorICogSSdtIG5vdCBzdXJlIGFib3V0IHRoaXMgYnV0IGFmdGVyIGxvb2tpbmcgYXQgdGhlIGNvZGUKKyAqIGZvciBhbGwgY2hpcHNldHMgaGVyZSBpcyB3aGF0IGkgZ290LgorICoKKyAqIFdlIGhhdmUgNiBHUElPcyAocGlucyksIGVhY2ggR1BJTyBoYXMgNCBtb2RlcyAoMiBiaXRzKQorICogTW9kZSAwIC0+IGFsd2F5cyBpbnB1dAorICogTW9kZSAxIC0+IG91dHB1dCB3aGVuIEdQSU9ETyBmb3IgdGhpcyBHUElPIGlzIHNldCB0byAwCisgKiBNb2RlIDIgLT4gb3V0cHV0IHdoZW4gR1BJT0RPIGZvciB0aGlzIEdQSU8gaXMgc2V0IHRvIDEKKyAqIE1vZGUgMyAtPiBhbHdheXMgb3V0cHV0CisgKgorICogRm9yIG1vcmUgaW5mb3MgY2hlY2sgb3V0IGdldF9ncGlvL3NldF9ncGlvIGFuZAorICogc2V0X2dwaW9faW5wdXQvc2V0X2dwaW9fb3V0cHV0IGZ1bmN0cy4KKyAqIEZvciBtb3JlIGluZm9zIG9uIGdwaW8gaW50ZXJydXB0IGNoZWNrIG91dCBzZXRfZ3Bpb19pbnRyLgorICovCisjZGVmaW5lIEFSNUtfTlVNX0dQSU8JNgorCisjZGVmaW5lIEFSNUtfR1BJT0NSCQkweDQwMTQJCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX0dQSU9DUl9JTlRfRU5BCTB4MDAwMDgwMDAJCS8qIEVuYWJsZSBHUElPIGludGVycnVwdCAqLworI2RlZmluZSBBUjVLX0dQSU9DUl9JTlRfU0VMTAkweDAwMDAwMDAwCQkvKiBHZW5lcmF0ZSBpbnRlcnJ1cHQgd2hlbiBwaW4gaXMgbG93ICovCisjZGVmaW5lIEFSNUtfR1BJT0NSX0lOVF9TRUxICTB4MDAwMTAwMDAJCS8qIEdlbmVyYXRlIGludGVycnVwdCB3aGVuIHBpbiBpcyBoaWdoICovCisjZGVmaW5lIEFSNUtfR1BJT0NSX0lOKG4pCSgwIDw8ICgobikgKiAyKSkJLyogTW9kZSAwIGZvciBwaW4gbiAqLworI2RlZmluZSBBUjVLX0dQSU9DUl9PVVQwKG4pCSgxIDw8ICgobikgKiAyKSkJLyogTW9kZSAxIGZvciBwaW4gbiAqLworI2RlZmluZSBBUjVLX0dQSU9DUl9PVVQxKG4pCSgyIDw8ICgobikgKiAyKSkJLyogTW9kZSAyIGZvciBwaW4gbiAqLworI2RlZmluZSBBUjVLX0dQSU9DUl9PVVQobikJKDMgPDwgKChuKSAqIDIpKQkvKiBNb2RlIDMgZm9yIHBpbiBuICovCisjZGVmaW5lIEFSNUtfR1BJT0NSX0lOVF9TRUwobikJKChuKSA8PCAxMikJCS8qIEludGVycnVwdCBmb3IgR1BJTyBwaW4gbiAqLworCisvKgorICogIkdlbmVyYWwgUHVycG9zZSBJbnB1dC9PdXRwdXQiIChHUElPKSBkYXRhIG91dHB1dCByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfR1BJT0RPCTB4NDAxOAorCisvKgorICogIkdlbmVyYWwgUHVycG9zZSBJbnB1dC9PdXRwdXQiIChHUElPKSBkYXRhIGlucHV0IHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19HUElPREkJMHg0MDFjCisjZGVmaW5lIEFSNUtfR1BJT0RJX00JMHgwMDAwMDAyZgorCisvKgorICogU2lsaWNvbiByZXZpc2lvbiByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfU1JFVgkJMHg0MDIwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX1NSRVZfUkVWCQkweDAwMDAwMDBmCS8qIE1hc2sgZm9yIHJldmlzaW9uICovCisjZGVmaW5lIEFSNUtfU1JFVl9SRVZfUwkJMAorI2RlZmluZSBBUjVLX1NSRVZfVkVSCQkweDAwMDAwMGZmCS8qIE1hc2sgZm9yIHZlcnNpb24gKi8KKyNkZWZpbmUgQVI1S19TUkVWX1ZFUl9TCQk0CisKKy8qCisgKiBUWEUgd3JpdGUgcG9zdGluZyByZWdpc3RlcgorICovCisjZGVmaW5lCUFSNUtfVFhFUE9TVAkweDQwMjgKKworLyoKKyAqIFFDVSBzbGVlcCBtYXNrCisgKi8KKyNkZWZpbmUJQVI1S19RQ1VfU0xFRVBfTUFTSwkweDQwMmMKKworLyogMHg0MDY4IGlzIGNvbXByZXNzaW9uIGJ1ZmZlciBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlciBvbiA1NDE0IGFuZCBwbSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKiBvbiA1NDI0IGFuZCBuZXdlciBwY2ktZSBjaGlwcy4gKi8KKworLyoKKyAqIENvbXByZXNzaW9uIGJ1ZmZlciBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlciAoZW5hYmxlL2Rpc2FibGUpIFs1NDE0XQorICovCisjZGVmaW5lIEFSNUtfNTQxNF9DQkNGRwkJMHg0MDY4CisjZGVmaW5lIEFSNUtfNTQxNF9DQkNGR19CVUZfRElTCTB4MTAJLyogRGlzYWJsZSBidWZmZXIgKi8KKworLyoKKyAqIFBDSS1FIFBvd2VyIG1hbmFnbWVudCBjb25maWd1cmF0aW9uCisgKiBhbmQgc3RhdHVzIHJlZ2lzdGVyIFs1NDI0K10KKyAqLworI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMCQkweDQwNjgJCQkvKiBSZWdpc3RlciBhZGRyZXNzICovCisvKiBPbmx5IDU0MjQgKi8KKyNkZWZpbmUJQVI1S19QQ0lFX1BNX0NUTF9MMV9XSEVOX0QyCTB4MDAwMDAwMDEJLyogZW5hYmxlIFBDSWUgY29yZSBlbnRlciBMMQorCQkJCQkJCXdoZW4gZDJfc2xlZXBfZW4gaXMgYXNzZXJ0ZWQgKi8KKyNkZWZpbmUJQVI1S19QQ0lFX1BNX0NUTF9MMF9MMFNfQ0xFQVIJMHgwMDAwMDAwMgkvKiBDbGVhciBMMCBhbmQgTDBTIGNvdW50ZXJzICovCisjZGVmaW5lCUFSNUtfUENJRV9QTV9DVExfTDBfTDBTX0VOCTB4MDAwMDAwMDQJLyogU3RhcnQgTDAgbmQgTDBTIGNvdW50ZXJzICovCisjZGVmaW5lCUFSNUtfUENJRV9QTV9DVExfTERSRVNFVF9FTgkweDAwMDAwMDA4CS8qIEVuYWJsZSByZXNldCB3aGVuIGxpbmsgZ29lcworCQkJCQkJCWRvd24gKi8KKy8qIFdha2UgT24gV2lyZWxlc3MgKi8KKyNkZWZpbmUJQVI1S19QQ0lFX1BNX0NUTF9QTUVfRU4JCTB4MDAwMDAwMTAJLyogUE1FIEVuYWJsZSAqLworI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX0FVWF9QV1JfREVUCTB4MDAwMDAwMjAJLyogQXV4IHBvd2VyIGRldGVjdCAqLworI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BNRV9DTEVBUgkweDAwMDAwMDQwCS8qIENsZWFyIFBNRSAqLworI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BTTV9EMAkJMHgwMDAwMDA4MAorI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BTTV9EMQkJMHgwMDAwMDEwMAorI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BTTV9EMgkJMHgwMDAwMDIwMAorI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BTTV9EMwkJMHgwMDAwMDQwMAorCisvKgorICogUENJLUUgV29ya2Fyb3VuZCBlbmFibGUgcmVnaXN0ZXIKKyAqLworI2RlZmluZQlBUjVLX1BDSUVfV0FFTgkweDQwN2MKKworLyoKKyAqIFBDSS1FIFNlcmlhbGl6ZXIvRGVzaXJpYWxpemVyCisgKiByZWdpc3RlcnMKKyAqLworI2RlZmluZQlBUjVLX1BDSUVfU0VSREVTCTB4NDA4MAorI2RlZmluZQlBUjVLX1BDSUVfU0VSREVTX1JFU0VUCTB4NDA4NAorCisvKj09PT1FRVBST00gUkVHSVNURVJTPT09PSovCisKKy8qCisgKiBFRVBST00gYWNjZXNzIHJlZ2lzdGVycworICoKKyAqIEhlcmUgd2UgZ290IGEgZGlmZmVyZW5jZSBiZXR3ZWVuIDUyMTAvNTIxMS0xMgorICogcmVhZCBkYXRhIHJlZ2lzdGVyIGZvciA1MjEwIGlzIGF0IDB4NjgwMCBhbmQKKyAqIHN0YXR1cyByZWdpc3RlciBpcyBhdCAweDZjMDAuIFRoZXJlIGlzIGFsc28KKyAqIG5vIGVlcHJvbSBjb21tYW5kIHJlZ2lzdGVyIG9uIDUyMTAgYW5kIHRoZQorICogb2Zmc2V0cyBhcmUgZGlmZmVyZW50LgorICoKKyAqIFRvIHJlYWQgZWVwcm9tIGRhdGEgZm9yIGEgc3BlY2lmaWMgb2Zmc2V0OgorICogNTIxMCAtIGVuYWJsZSBlZXByb20gYWNjZXNzIChBUjVLX1BDSUNGR19FRUFFKQorICogICAgICAgIHJlYWQgQVI1S19FRVBST01fQkFTRSArKDQgKiBvZmZzZXQpCisgKiAgICAgICAgY2hlY2sgdGhlIGVlcHJvbSBzdGF0dXMgcmVnaXN0ZXIKKyAqICAgICAgICBhbmQgcmVhZCBlZXByb20gZGF0YSByZWdpc3Rlci4KKyAqCisgKiA1MjExIC0gd3JpdGUgb2Zmc2V0IHRvIEFSNUtfRUVQUk9NX0JBU0UKKyAqIDUyMTIgICB3cml0ZSBBUjVLX0VFUFJPTV9DTURfUkVBRCBvbiBBUjVLX0VFUFJPTV9DTUQKKyAqICAgICAgICBjaGVjayB0aGUgZWVwcm9tIHN0YXR1cyByZWdpc3RlcgorICogICAgICAgIGFuZCByZWFkIGVlcHJvbSBkYXRhIHJlZ2lzdGVyLgorICoKKyAqIFRvIHdyaXRlIGVlcHJvbSBkYXRhIGZvciBhIHNwZWNpZmljIG9mZnNldDoKKyAqIDUyMTAgLSBlbmFibGUgZWVwcm9tIGFjY2VzcyAoQVI1S19QQ0lDRkdfRUVBRSkKKyAqICAgICAgICB3cml0ZSBkYXRhIHRvIEFSNUtfRUVQUk9NX0JBU0UgKyg0ICogb2Zmc2V0KQorICogICAgICAgIGNoZWNrIHRoZSBlZXByb20gc3RhdHVzIHJlZ2lzdGVyCisgKiA1MjExIC0gd3JpdGUgQVI1S19FRVBST01fQ01EX1JFU0VUIG9uIEFSNUtfRUVQUk9NX0NNRAorICogNTIxMiAgIHdyaXRlIG9mZnNldCB0byBBUjVLX0VFUFJPTV9CQVNFCisgKiAgICAgICAgd3JpdGUgZGF0YSB0byBkYXRhIHJlZ2lzdGVyCisgKgkgIHdyaXRlIEFSNUtfRUVQUk9NX0NNRF9XUklURSBvbiBBUjVLX0VFUFJPTV9DTUQKKyAqICAgICAgICBjaGVjayB0aGUgZWVwcm9tIHN0YXR1cyByZWdpc3RlcgorICoKKyAqIEZvciBtb3JlIGluZm9zIGNoZWNrIGVlcHJvbV8qIGZ1bmN0cyBhbmQgdGhlIGFyNWsuYworICogZmlsZSBwb3N0ZWQgaW4gbWFkd2lmaS1kZXZlbCBtYWlsaW5nIGxpc3QuCisgKiBodHRwOi8vc291cmNlZm9yZ2UubmV0L21haWxhcmNoaXZlL21lc3NhZ2UucGhwP21zZ19pZD04OTY2NTI1CisgKgorICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0JBU0UJMHg2MDAwCisKKy8qCisgKiBFRVBST00gZGF0YSByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0RBVEFfNTIxMQkweDYwMDQKKyNkZWZpbmUgQVI1S19FRVBST01fREFUQV81MjEwCTB4NjgwMAorI2RlZmluZQlBUjVLX0VFUFJPTV9EQVRBCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQlBUjVLX0VFUFJPTV9EQVRBXzUyMTAgOiBBUjVLX0VFUFJPTV9EQVRBXzUyMTEpCisKKy8qCisgKiBFRVBST00gY29tbWFuZCByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NNRAkJMHg2MDA4CQkJLyogUmVnaXN0ZXIgQWRkcmVzICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NNRF9SRUFECTB4MDAwMDAwMDEJLyogRUVQUk9NIHJlYWQgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fQ01EX1dSSVRFCTB4MDAwMDAwMDIJLyogRUVQUk9NIHdyaXRlICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NNRF9SRVNFVAkweDAwMDAwMDA0CS8qIEVFUFJPTSByZXNldCAqLworCisvKgorICogRUVQUk9NIHN0YXR1cyByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1NUQVRfNTIxMAkweDZjMDAJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9TVEFUXzUyMTEJMHg2MDBjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCisjZGVmaW5lCUFSNUtfRUVQUk9NX1NUQVRVUwkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJQVI1S19FRVBST01fU1RBVF81MjEwIDogQVI1S19FRVBST01fU1RBVF81MjExKQorI2RlZmluZSBBUjVLX0VFUFJPTV9TVEFUX1JERVJSCTB4MDAwMDAwMDEJLyogRUVQUk9NIHJlYWQgZmFpbGVkICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1NUQVRfUkRET05FCTB4MDAwMDAwMDIJLyogRUVQUk9NIHJlYWQgc3VjY2Vzc2Z1bCAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9TVEFUX1dSRVJSCTB4MDAwMDAwMDQJLyogRUVQUk9NIHdyaXRlIGZhaWxlZCAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9TVEFUX1dSRE9ORQkweDAwMDAwMDA4CS8qIEVFUFJPTSB3cml0ZSBzdWNjZXNzZnVsICovCisKKy8qCisgKiBFRVBST00gY29uZmlnIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHCQkJMHg2MDEwCQkJLyogUmVnaXN0ZXIgQWRkcmVzICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19TSVpFCQkweDAwMDAwMDAzCQkvKiBTaXplIGRldGVybWluYXRpb24gb3ZlcnJpZGUgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX1NJWkVfQVVUTwkwCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19TSVpFXzRLQklUCTEKKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX1NJWkVfOEtCSVQJMgorI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfU0laRV8xNktCSVQJMworI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfV1JfV0FJVF9ESVMJMHgwMDAwMDAwNAkvKiBEaXNhYmxlIHdyaXRlIHdhaXQgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX0NMS19SQVRFCTB4MDAwMDAwMTgJLyogQ2xvY2sgcmF0ZSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfQ0xLX1JBVEVfUwkJMworI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfQ0xLX1JBVEVfMTU2S0haCTAKKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX0NMS19SQVRFXzMxMktIWgkxCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19DTEtfUkFURV82MjVLSFoJMgorI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfUFJPVF9LRVkJMHgwMGZmZmYwMCAgICAgIC8qIFByb3RlY3Rpb24ga2V5ICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19QUk9UX0tFWV9TCTgKKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX0xJTkRfRU4JCTB4MDEwMDAwMDAJLyogRW5hYmxlIGxlbmd0aCBpbmRpY2F0b3IgKD8pICovCisKKworLyoKKyAqIFRPRE86IFdha2UgT24gV2lyZWxlc3MgcmVnaXN0ZXJzCisgKiBSYW5nZSAweDcwMDAgLSAweDdjZTAKKyAqLworCisvKgorICogUHJvdG9jb2wgQ29udHJvbCBVbml0IChQQ1UpIHJlZ2lzdGVycworICovCisvKgorICogVXNlZCBmb3IgY2hlY2tpbmcgaW5pdGlhbCByZWdpc3RlciB3cml0ZXMKKyAqIGR1cmluZyBjaGFubmVsIHJlc2V0IChzZWUgcmVzZXQgZnVuYykKKyAqLworI2RlZmluZSBBUjVLX1BDVV9NSU4JMHg4MDAwCisjZGVmaW5lIEFSNUtfUENVX01BWAkweDhmZmYKKworLyoKKyAqIEZpcnN0IHN0YXRpb24gaWQgcmVnaXN0ZXIgKExvd2VyIDMyIGJpdHMgb2YgTUFDIGFkZHJlc3MpCisgKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQwCQkweDgwMDAKKyNkZWZpbmUJQVI1S19TVEFfSUQwX0FSUkRfTDMyCTB4ZmZmZmZmZmYKKworLyoKKyAqIFNlY29uZCBzdGF0aW9uIGlkIHJlZ2lzdGVyIChVcHBlciAxNiBiaXRzIG9mIE1BQyBhZGRyZXNzICsgUENVIHNldHRpbmdzKQorICovCisjZGVmaW5lIEFSNUtfU1RBX0lEMQkJCTB4ODAwNAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19TVEFfSUQxX0FERFJfVTE2CQkweDAwMDBmZmZmCS8qIFVwcGVyIDE2IGJpdHMgb2YgTUFDIGFkZHJlcyAqLworI2RlZmluZSBBUjVLX1NUQV9JRDFfQVAJCQkweDAwMDEwMDAwCS8qIFNldCBBUCBtb2RlICovCisjZGVmaW5lIEFSNUtfU1RBX0lEMV9BREhPQwkJMHgwMDAyMDAwMAkvKiBTZXQgQWQtSG9jIG1vZGUgKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQxX1BXUl9TVgkJMHgwMDA0MDAwMAkvKiBQb3dlciBzYXZlIHJlcG9ydGluZyAqLworI2RlZmluZSBBUjVLX1NUQV9JRDFfTk9fS0VZU1JDSAkJMHgwMDA4MDAwMAkvKiBObyBrZXkgc2VhcmNoICovCisjZGVmaW5lIEFSNUtfU1RBX0lEMV9OT19QU1BPTEwJCTB4MDAxMDAwMDAJLyogTm8gcG93ZXIgc2F2ZSBwb2xsaW5nIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX1NUQV9JRDFfUENGXzUyMTEJCTB4MDAxMDAwMDAJLyogRW5hYmxlIFBDRiBvbiBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfU1RBX0lEMV9QQ0ZfNTIxMAkJMHgwMDIwMDAwMAkvKiBFbmFibGUgUENGIG9uIFs1MjEwXSovCisjZGVmaW5lCUFSNUtfU1RBX0lEMV9QQ0YJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQkJQVI1S19TVEFfSUQxX1BDRl81MjEwIDogQVI1S19TVEFfSUQxX1BDRl81MjExKQorI2RlZmluZSBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BCTB4MDAyMDAwMDAJLyogVXNlIGRlZmF1bHQgYW50ZW5uYSAqLworI2RlZmluZSBBUjVLX1NUQV9JRDFfREVTQ19BTlRFTk5BCTB4MDA0MDAwMDAJLyogVXBkYXRlIGFudGVubmEgZnJvbSBkZXNjcmlwdG9yICovCisjZGVmaW5lIEFSNUtfU1RBX0lEMV9SVFNfREVGX0FOVEVOTkEJMHgwMDgwMDAwMAkvKiBVc2UgZGVmYXVsdCBhbnRlbm5hIGZvciBSVFMgKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQxX0FDS0NUU182TUIJCTB4MDEwMDAwMDAJLyogVXNlIDZNYml0L3MgZm9yIEFDSy9DVFMgKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQxX0JBU0VfUkFURV8xMUIJMHgwMjAwMDAwMAkvKiBVc2UgMTFiIGJhc2UgcmF0ZSBmb3IgQUNLL0NUUyBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfU1RBX0lEMV9TRUxGR0VOX0RFRl9BTlQJMHgwNDAwMDAwMAkvKiBVc2UgZGVmLiBhbnRlbm5hIGZvciBzZWxmIGdlbmVyYXRlZCBmcmFtZXMgKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQxX0NSWVBUX01JQ19FTgkweDA4MDAwMDAwCS8qIEVuYWJsZSBNSUMgKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQxX0tFWVNSQ0hfTU9ERQkweDEwMDAwMDAwCS8qIExvb2sgdXAga2V5IHdoZW4ga2V5IGlkICE9IDAgKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQxX1BSRVNFUlZFX1NFUV9OVU0JMHgyMDAwMDAwMAkvKiBQcmVzZXJ2ZSBzZXF1ZW5jZSBudW1iZXIgKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQxX0NCQ0lWX0VORElBTgkweDQwMDAwMDAwCS8qID8/PyAqLworI2RlZmluZSBBUjVLX1NUQV9JRDFfS0VZU1JDSF9NQ0FTVAkweDgwMDAwMDAwCS8qIERvIGtleSBjYWNoZSBzZWFyY2ggZm9yIG1jYXN0IGZyYW1lcyAqLworCisvKgorICogRmlyc3QgQlNTSUQgcmVnaXN0ZXIgKE1BQyBhZGRyZXNzLCBsb3dlciAzMmJpdHMpCisgKi8KKyNkZWZpbmUgQVI1S19CU1NfSUQwCTB4ODAwOAorCisvKgorICogU2Vjb25kIEJTU0lEIHJlZ2lzdGVyIChNQUMgYWRkcmVzcyBpbiB1cHBlciAxNiBiaXRzKQorICoKKyAqIEFJRDogQXNzb2NpYXRpb24gSUQKKyAqLworI2RlZmluZSBBUjVLX0JTU19JRDEJCTB4ODAwYworI2RlZmluZSBBUjVLX0JTU19JRDFfQUlECTB4ZmZmZjAwMDAKKyNkZWZpbmUgQVI1S19CU1NfSUQxX0FJRF9TCTE2CisKKy8qCisgKiBCYWNrb2ZmIHNsb3QgdGltZSByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfU0xPVF9USU1FCTB4ODAxMAorCisvKgorICogQUNLL0NUUyB0aW1lb3V0IHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19USU1FX09VVAkJMHg4MDE0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX1RJTUVfT1VUX0FDSwkweDAwMDAxZmZmCS8qIEFDSyB0aW1lb3V0IG1hc2sgKi8KKyNkZWZpbmUgQVI1S19USU1FX09VVF9BQ0tfUwkwCisjZGVmaW5lIEFSNUtfVElNRV9PVVRfQ1RTCTB4MWZmZjAwMDAJLyogQ1RTIHRpbWVvdXQgbWFzayAqLworI2RlZmluZSBBUjVLX1RJTUVfT1VUX0NUU19TCTE2CisKKy8qCisgKiBSU1NJIHRocmVzaG9sZCByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfUlNTSV9USFIJCQkweDgwMTgJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19SU1NJX1RIUl9NCQkJMHgwMDAwMDBmZgkvKiBNYXNrIGZvciBSU1NJIHRocmVzaG9sZCBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfUlNTSV9USFJfQk1JU1NfNTIxMAkweDAwMDAwNzAwCS8qIE1hc2sgZm9yIEJlYWNvbiBNaXNzZWQgdGhyZXNob2xkIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX1JTU0lfVEhSX0JNSVNTXzUyMTBfUwk4CisjZGVmaW5lIEFSNUtfUlNTSV9USFJfQk1JU1NfNTIxMQkweDAwMDBmZjAwCS8qIE1hc2sgZm9yIEJlYWNvbiBNaXNzZWQgdGhyZXNob2xkIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19SU1NJX1RIUl9CTUlTU181MjExX1MJOAorI2RlZmluZQlBUjVLX1JTU0lfVEhSX0JNSVNTCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJCUFSNUtfUlNTSV9USFJfQk1JU1NfNTIxMCA6IEFSNUtfUlNTSV9USFJfQk1JU1NfNTIxMSkKKyNkZWZpbmUJQVI1S19SU1NJX1RIUl9CTUlTU19TCQk4CisKKy8qCisgKiA1MjEwIGhhcyBtb3JlIFBDVSByZWdpc3RlcnMgYmVjYXVzZSB0aGVyZSBpcyBubyBRQ1UvRENVCisgKiBzbyBxdWV1ZSBwYXJhbWV0ZXJzIGFyZSBzZXQgaGVyZSwgdGhpcyB3YXkgYSBsb3QgY29tbW9uCisgKiByZWdpc3RlcnMgaGF2ZSBkaWZmZXJlbnQgYWRkcmVzcyBmb3IgNTIxMC4gVG8gbWFrZSB0aGluZ3MKKyAqIGVhc2llciB3ZSBkZWZpbmUgYSBtYWNybyBiYXNlZCBvbiBhaC0+YWhfdmVyc2lvbiBmb3IgY29tbW9uCisgKiByZWdpc3RlcnMgd2l0aCBkaWZmZXJlbnQgYWRkcmVzc2VzIGFuZCBjb21tb24gZmxhZ3MuCisgKi8KKworLyoKKyAqIFJldHJ5IGxpbWl0IHJlZ2lzdGVyCisgKgorICogUmV0cnkgbGltaXQgcmVnaXN0ZXIgZm9yIDUyMTAgKG5vIFFDVS9EQ1Ugc28gaXQncyBkb25lIGluIFBDVSkKKyAqLworI2RlZmluZSBBUjVLX05PRENVX1JFVFJZX0xNVAkJMHg4MDFjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX05PRENVX1JFVFJZX0xNVF9TSF9SRVRSWQkweDAwMDAwMDBmCS8qIFNob3J0IHJldHJ5IGxpbWl0IG1hc2sgKi8KKyNkZWZpbmUgQVI1S19OT0RDVV9SRVRSWV9MTVRfU0hfUkVUUllfUwkwCisjZGVmaW5lIEFSNUtfTk9EQ1VfUkVUUllfTE1UX0xHX1JFVFJZCTB4MDAwMDAwZjAJLyogTG9uZyByZXRyeSBtYXNrICovCisjZGVmaW5lIEFSNUtfTk9EQ1VfUkVUUllfTE1UX0xHX1JFVFJZX1MJNAorI2RlZmluZSBBUjVLX05PRENVX1JFVFJZX0xNVF9TU0hfUkVUUlkJMHgwMDAwM2YwMAkvKiBTdGF0aW9uIHNob3J0IHJldHJ5IGxpbWl0IG1hc2sgKi8KKyNkZWZpbmUgQVI1S19OT0RDVV9SRVRSWV9MTVRfU1NIX1JFVFJZX1MJOAorI2RlZmluZSBBUjVLX05PRENVX1JFVFJZX0xNVF9TTEdfUkVUUlkJMHgwMDBmYzAwMAkvKiBTdGF0aW9uIGxvbmcgcmV0cnkgbGltaXQgbWFzayAqLworI2RlZmluZSBBUjVLX05PRENVX1JFVFJZX0xNVF9TTEdfUkVUUllfUwkxNAorI2RlZmluZSBBUjVLX05PRENVX1JFVFJZX0xNVF9DV19NSU4JMHgzZmYwMDAwMAkvKiBNaW5pbXVtIGNvbnRlbnRpb24gd2luZG93IG1hc2sgKi8KKyNkZWZpbmUgQVI1S19OT0RDVV9SRVRSWV9MTVRfQ1dfTUlOX1MJMjAKKworLyoKKyAqIFRyYW5zbWl0IGxhdGVuY3kgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1VTRUNfNTIxMAkJCTB4ODAyMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfVVNFQ181MjExCQkJMHg4MDFjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfVVNFQwkJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQkJQVI1S19VU0VDXzUyMTAgOiBBUjVLX1VTRUNfNTIxMSkKKyNkZWZpbmUgQVI1S19VU0VDXzEJCQkweDAwMDAwMDdmCS8qIGNsb2NrIGN5Y2xlcyBmb3IgMXVzICovCisjZGVmaW5lIEFSNUtfVVNFQ18xX1MJCQkwCisjZGVmaW5lIEFSNUtfVVNFQ18zMgkJCTB4MDAwMDNmODAJLyogY2xvY2sgY3ljbGVzIGZvciAxdXMgd2hpbGUgb24gMzJNaHogY2xvY2sgKi8KKyNkZWZpbmUgQVI1S19VU0VDXzMyX1MJCQk3CisjZGVmaW5lIEFSNUtfVVNFQ19UWF9MQVRFTkNZXzUyMTEJMHgwMDdmYzAwMAorI2RlZmluZSBBUjVLX1VTRUNfVFhfTEFURU5DWV81MjExX1MJMTQKKyNkZWZpbmUgQVI1S19VU0VDX1JYX0xBVEVOQ1lfNTIxMQkweDFmODAwMDAwCisjZGVmaW5lIEFSNUtfVVNFQ19SWF9MQVRFTkNZXzUyMTFfUwkyMworI2RlZmluZSBBUjVLX1VTRUNfVFhfTEFURU5DWV81MjEwCTB4MDAwZmMwMDAJLyogYWxzbyBmb3IgNTMxMSAqLworI2RlZmluZSBBUjVLX1VTRUNfVFhfTEFURU5DWV81MjEwX1MJMTQKKyNkZWZpbmUgQVI1S19VU0VDX1JYX0xBVEVOQ1lfNTIxMAkweDAzZjAwMDAwCS8qIGFsc28gZm9yIDUzMTEgKi8KKyNkZWZpbmUgQVI1S19VU0VDX1JYX0xBVEVOQ1lfNTIxMF9TCTIwCisKKy8qCisgKiBQQ1UgYmVhY29uIGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0JFQUNPTl81MjEwCTB4ODAyNAkJCS8qUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMF0gKi8KKyNkZWZpbmUgQVI1S19CRUFDT05fNTIxMQkweDgwMjAJCQkvKlJlZ2lzdGVyIEFkZHJlc3MgWzUyMTErXSAqLworI2RlZmluZSBBUjVLX0JFQUNPTgkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8gXAorCQkJCUFSNUtfQkVBQ09OXzUyMTAgOiBBUjVLX0JFQUNPTl81MjExKQorI2RlZmluZSBBUjVLX0JFQUNPTl9QRVJJT0QJMHgwMDAwZmZmZgkvKiBNYXNrIGZvciBiZWFjb24gcGVyaW9kICovCisjZGVmaW5lIEFSNUtfQkVBQ09OX1BFUklPRF9TCTAKKyNkZWZpbmUgQVI1S19CRUFDT05fVElNCQkweDAwN2YwMDAwCS8qIE1hc2sgZm9yIFRJTSBvZmZzZXQgKi8KKyNkZWZpbmUgQVI1S19CRUFDT05fVElNX1MJMTYKKyNkZWZpbmUgQVI1S19CRUFDT05fRU5BQkxFCTB4MDA4MDAwMDAJLyogRW5hYmxlIGJlYWNvbnMgKi8KKyNkZWZpbmUgQVI1S19CRUFDT05fUkVTRVRfVFNGCTB4MDEwMDAwMDAJLyogRm9yY2UgVFNGIHJlc2V0ICovCisKKy8qCisgKiBDRlAgcGVyaW9kIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19DRlBfUEVSSU9EXzUyMTAJMHg4MDI4CisjZGVmaW5lIEFSNUtfQ0ZQX1BFUklPRF81MjExCTB4ODAyNAorI2RlZmluZSBBUjVLX0NGUF9QRVJJT0QJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQlBUjVLX0NGUF9QRVJJT0RfNTIxMCA6IEFSNUtfQ0ZQX1BFUklPRF81MjExKQorCisvKgorICogTmV4dCBiZWFjb24gdGltZSByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfVElNRVIwXzUyMTAJMHg4MDJjCisjZGVmaW5lIEFSNUtfVElNRVIwXzUyMTEJMHg4MDI4CisjZGVmaW5lIEFSNUtfVElNRVIwCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJQVI1S19USU1FUjBfNTIxMCA6IEFSNUtfVElNRVIwXzUyMTEpCisKKy8qCisgKiBOZXh0IERNQSBiZWFjb24gYWxlcnQgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1RJTUVSMV81MjEwCTB4ODAzMAorI2RlZmluZSBBUjVLX1RJTUVSMV81MjExCTB4ODAyYworI2RlZmluZSBBUjVLX1RJTUVSMQkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8gXAorCQkJCUFSNUtfVElNRVIxXzUyMTAgOiBBUjVLX1RJTUVSMV81MjExKQorCisvKgorICogTmV4dCBzb2Z0d2FyZSBiZWFjb24gYWxlcnQgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1RJTUVSMl81MjEwCTB4ODAzNAorI2RlZmluZSBBUjVLX1RJTUVSMl81MjExCTB4ODAzMAorI2RlZmluZSBBUjVLX1RJTUVSMgkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8gXAorCQkJCUFSNUtfVElNRVIyXzUyMTAgOiBBUjVLX1RJTUVSMl81MjExKQorCisvKgorICogTmV4dCBBVElNIHdpbmRvdyB0aW1lIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19USU1FUjNfNTIxMAkweDgwMzgKKyNkZWZpbmUgQVI1S19USU1FUjNfNTIxMQkweDgwMzQKKyNkZWZpbmUgQVI1S19USU1FUjMJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQlBUjVLX1RJTUVSM181MjEwIDogQVI1S19USU1FUjNfNTIxMSkKKworCisvKgorICogNTIxMCBGaXJzdCBpbnRlciBmcmFtZSBzcGFjaW5nIHJlZ2lzdGVyIChJRlMpCisgKi8KKyNkZWZpbmUgQVI1S19JRlMwCQkweDgwNDAKKyNkZWZpbmUgQVI1S19JRlMwX1NJRlMJCTB4MDAwMDA3ZmYKKyNkZWZpbmUgQVI1S19JRlMwX1NJRlNfUwkwCisjZGVmaW5lIEFSNUtfSUZTMF9ESUZTCQkweDAwN2ZmODAwCisjZGVmaW5lIEFSNUtfSUZTMF9ESUZTX1MJMTEKKworLyoKKyAqIDUyMTAgU2Vjb25kIGludGVyIGZyYW1lIHNwYWNpbmcgcmVnaXN0ZXIgKElGUykKKyAqLworI2RlZmluZSBBUjVLX0lGUzEJCTB4ODA0NAorI2RlZmluZSBBUjVLX0lGUzFfUElGUwkJMHgwMDAwMGZmZgorI2RlZmluZSBBUjVLX0lGUzFfUElGU19TCTAKKyNkZWZpbmUgQVI1S19JRlMxX0VJRlMJCTB4MDNmZmYwMDAKKyNkZWZpbmUgQVI1S19JRlMxX0VJRlNfUwkxMgorI2RlZmluZSBBUjVLX0lGUzFfQ1NfRU4JCTB4MDQwMDAwMDAKKworCisvKgorICogQ0ZQIGR1cmF0aW9uIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19DRlBfRFVSXzUyMTAJMHg4MDQ4CisjZGVmaW5lIEFSNUtfQ0ZQX0RVUl81MjExCTB4ODAzOAorI2RlZmluZSBBUjVLX0NGUF9EVVIJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQlBUjVLX0NGUF9EVVJfNTIxMCA6IEFSNUtfQ0ZQX0RVUl81MjExKQorCisvKgorICogUmVjZWl2ZSBmaWx0ZXIgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1JYX0ZJTFRFUl81MjEwCTB4ODA0YwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfUlhfRklMVEVSXzUyMTEJMHg4MDNjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfUlhfRklMVEVSCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJQVI1S19SWF9GSUxURVJfNTIxMCA6IEFSNUtfUlhfRklMVEVSXzUyMTEpCisjZGVmaW5lCUFSNUtfUlhfRklMVEVSX1VDQVNUIAkweDAwMDAwMDAxCS8qIERvbid0IGZpbHRlciB1bmljYXN0IGZyYW1lcyAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9NQ0FTVCAJMHgwMDAwMDAwMgkvKiBEb24ndCBmaWx0ZXIgbXVsdGljYXN0IGZyYW1lcyAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9CQ0FTVCAJMHgwMDAwMDAwNAkvKiBEb24ndCBmaWx0ZXIgYnJvYWRjYXN0IGZyYW1lcyAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9DT05UUk9MIAkweDAwMDAwMDA4CS8qIERvbid0IGZpbHRlciBjb250cm9sIGZyYW1lcyAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9CRUFDT04gCTB4MDAwMDAwMTAJLyogRG9uJ3QgZmlsdGVyIGJlYWNvbiBmcmFtZXMgKi8KKyNkZWZpbmUJQVI1S19SWF9GSUxURVJfUFJPTSAJMHgwMDAwMDAyMAkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9YUlBPTEwgCTB4MDAwMDAwNDAJLyogRG9uJ3QgZmlsdGVyIFhSIHBvbGwgZnJhbWUgWzUyMTIrXSAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9QUk9CRVJFUSAweDAwMDAwMDgwCS8qIERvbid0IGZpbHRlciBwcm9iZSByZXF1ZXN0cyBbNTIxMitdICovCisjZGVmaW5lCUFSNUtfUlhfRklMVEVSX1BIWUVSUl81MjEyCTB4MDAwMDAxMDAJLyogRG9uJ3QgZmlsdGVyIHBoeSBlcnJvcnMgWzUyMTIrXSAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9SQURBUkVSUl81MjEyIAkweDAwMDAwMjAwCS8qIERvbid0IGZpbHRlciBwaHkgcmFkYXIgZXJyb3JzIFs1MjEyK10gKi8KKyNkZWZpbmUgQVI1S19SWF9GSUxURVJfUEhZRVJSXzUyMTEJMHgwMDAwMDA0MAkvKiBbNTIxMV0gKi8KKyNkZWZpbmUgQVI1S19SWF9GSUxURVJfUkFEQVJFUlJfNTIxMQkweDAwMDAwMDgwCS8qIFs1MjExXSAqLworI2RlZmluZSBBUjVLX1JYX0ZJTFRFUl9QSFlFUlIgIFwKKwkoKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjExID8gXAorCUFSNUtfUlhfRklMVEVSX1BIWUVSUl81MjExIDogQVI1S19SWF9GSUxURVJfUEhZRVJSXzUyMTIpKQorI2RlZmluZSAgICAgICAgQVI1S19SWF9GSUxURVJfUkFEQVJFUlIgXAorCSgoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTEgPyBcCisJQVI1S19SWF9GSUxURVJfUkFEQVJFUlJfNTIxMSA6IEFSNUtfUlhfRklMVEVSX1JBREFSRVJSXzUyMTIpKQorCisvKgorICogTXVsdGljYXN0IGZpbHRlciByZWdpc3RlciAobG93ZXIgMzIgYml0cykKKyAqLworI2RlZmluZSBBUjVLX01DQVNUX0ZJTFRFUjBfNTIxMAkweDgwNTAKKyNkZWZpbmUgQVI1S19NQ0FTVF9GSUxURVIwXzUyMTEJMHg4MDQwCisjZGVmaW5lIEFSNUtfTUNBU1RfRklMVEVSMAkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJQVI1S19NQ0FTVF9GSUxURVIwXzUyMTAgOiBBUjVLX01DQVNUX0ZJTFRFUjBfNTIxMSkKKworLyoKKyAqIE11bHRpY2FzdCBmaWx0ZXIgcmVnaXN0ZXIgKGhpZ2hlciAxNiBiaXRzKQorICovCisjZGVmaW5lIEFSNUtfTUNBU1RfRklMVEVSMV81MjEwCTB4ODA1NAorI2RlZmluZSBBUjVLX01DQVNUX0ZJTFRFUjFfNTIxMQkweDgwNDQKKyNkZWZpbmUgQVI1S19NQ0FTVF9GSUxURVIxCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQlBUjVLX01DQVNUX0ZJTFRFUjFfNTIxMCA6IEFSNUtfTUNBU1RfRklMVEVSMV81MjExKQorCisKKy8qCisgKiBUcmFuc21pdCBtYXNrIHJlZ2lzdGVyIChsb3dlciAzMiBiaXRzKSBbNTIxMF0KKyAqLworI2RlZmluZSBBUjVLX1RYX01BU0swCTB4ODA1OAorCisvKgorICogVHJhbnNtaXQgbWFzayByZWdpc3RlciAoaGlnaGVyIDE2IGJpdHMpIFs1MjEwXQorICovCisjZGVmaW5lIEFSNUtfVFhfTUFTSzEJMHg4MDVjCisKKy8qCisgKiBDbGVhciB0cmFuc21pdCBtYXNrIFs1MjEwXQorICovCisjZGVmaW5lIEFSNUtfQ0xSX1RNQVNLCTB4ODA2MAorCisvKgorICogVHJpZ2dlciBsZXZlbCByZWdpc3RlciAoYmVmb3JlIHRyYW5zbWlzc2lvbikgWzUyMTBdCisgKi8KKyNkZWZpbmUgQVI1S19UUklHX0xWTAkweDgwNjQKKworCisvKgorICogUENVIGNvbnRyb2wgcmVnaXN0ZXIKKyAqCisgKiBPbmx5IERJU19SWCBpcyB1c2VkIGluIHRoZSBjb2RlLCB0aGUgcmVzdCBpIGd1ZXNzIGFyZQorICogZm9yIHR3ZWFraW5nL2RpYWdub3N0aWNzLgorICovCisjZGVmaW5lIEFSNUtfRElBR19TV181MjEwCQkweDgwNjgJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0RJQUdfU1dfNTIxMQkJMHg4MDQ4CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfRElBR19TVwkJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQkJQVI1S19ESUFHX1NXXzUyMTAgOiBBUjVLX0RJQUdfU1dfNTIxMSkKKyNkZWZpbmUgQVI1S19ESUFHX1NXX0RJU19XRVBfQUNLCTB4MDAwMDAwMDEJLyogRGlzYWJsZSBBQ0tzIGlmIFdFUCBrZXkgaXMgaW52YWxpZCAqLworI2RlZmluZSBBUjVLX0RJQUdfU1dfRElTX0FDSwkJMHgwMDAwMDAwMgkvKiBEaXNhYmxlIEFDS3MgKi8KKyNkZWZpbmUgQVI1S19ESUFHX1NXX0RJU19DVFMJCTB4MDAwMDAwMDQJLyogRGlzYWJsZSBDVFNzICovCisjZGVmaW5lIEFSNUtfRElBR19TV19ESVNfRU5DCQkweDAwMDAwMDA4CS8qIERpc2FibGUgZW5jcnlwdGlvbiAqLworI2RlZmluZSBBUjVLX0RJQUdfU1dfRElTX0RFQwkJMHgwMDAwMDAxMAkvKiBEaXNhYmxlIGRlY3J5cHRpb24gKi8KKyNkZWZpbmUgQVI1S19ESUFHX1NXX0RJU19UWAkJMHgwMDAwMDAyMAkvKiBEaXNhYmxlIHRyYW5zbWl0IFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0RJQUdfU1dfRElTX1JYXzUyMTAJMHgwMDAwMDA0MAkvKiBEaXNhYmxlIHJlY2lldmUgKi8KKyNkZWZpbmUgQVI1S19ESUFHX1NXX0RJU19SWF81MjExCTB4MDAwMDAwMjAKKyNkZWZpbmUJQVI1S19ESUFHX1NXX0RJU19SWAkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8gXAorCQkJCQlBUjVLX0RJQUdfU1dfRElTX1JYXzUyMTAgOiBBUjVLX0RJQUdfU1dfRElTX1JYXzUyMTEpCisjZGVmaW5lIEFSNUtfRElBR19TV19MT09QX0JBQ0tfNTIxMAkweDAwMDAwMDgwCS8qIExvb3BiYWNrIChpIGd1ZXNzIGl0IGdvZXMgd2l0aCBESVNfVFgpIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0RJQUdfU1dfTE9PUF9CQUNLXzUyMTEJMHgwMDAwMDA0MAorI2RlZmluZSBBUjVLX0RJQUdfU1dfTE9PUF9CQUNLCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJCUFSNUtfRElBR19TV19MT09QX0JBQ0tfNTIxMCA6IEFSNUtfRElBR19TV19MT09QX0JBQ0tfNTIxMSkKKyNkZWZpbmUgQVI1S19ESUFHX1NXX0NPUlJfRkNTXzUyMTAJMHgwMDAwMDEwMAkvKiBDb3JydXB0ZWQgRkNTICovCisjZGVmaW5lIEFSNUtfRElBR19TV19DT1JSX0ZDU181MjExCTB4MDAwMDAwODAKKyNkZWZpbmUgQVI1S19ESUFHX1NXX0NPUlJfRkNTCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJCUFSNUtfRElBR19TV19DT1JSX0ZDU181MjEwIDogQVI1S19ESUFHX1NXX0NPUlJfRkNTXzUyMTEpCisjZGVmaW5lIEFSNUtfRElBR19TV19DSEFOX0lORk9fNTIxMAkweDAwMDAwMjAwCS8qIER1bXAgY2hhbm5lbCBpbmZvICovCisjZGVmaW5lIEFSNUtfRElBR19TV19DSEFOX0lORk9fNTIxMQkweDAwMDAwMTAwCisjZGVmaW5lIEFSNUtfRElBR19TV19DSEFOX0lORk8JCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQkJQVI1S19ESUFHX1NXX0NIQU5fSU5GT181MjEwIDogQVI1S19ESUFHX1NXX0NIQU5fSU5GT181MjExKQorI2RlZmluZSBBUjVLX0RJQUdfU1dfRU5fU0NSQU1fU0VFRF81MjEwCTB4MDAwMDA0MDAJLyogRW5hYmxlIGZpeGVkIHNjcmFtYmxlciBzZWVkICovCisjZGVmaW5lIEFSNUtfRElBR19TV19FTl9TQ1JBTV9TRUVEXzUyMTEJMHgwMDAwMDIwMAorI2RlZmluZSBBUjVLX0RJQUdfU1dfRU5fU0NSQU1fU0VFRAkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJCUFSNUtfRElBR19TV19FTl9TQ1JBTV9TRUVEXzUyMTAgOiBBUjVLX0RJQUdfU1dfRU5fU0NSQU1fU0VFRF81MjExKQorI2RlZmluZSBBUjVLX0RJQUdfU1dfRUNPX0VOQUJMRQkJMHgwMDAwMDQwMAkvKiBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfRElBR19TV19TQ1ZSQU1fU0VFRAkweDAwMDNmODAwCS8qIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0RJQUdfU1dfU0NSQU1fU0VFRF9NCTB4MDAwMWZjMDAJLyogU2NyYW1ibGVyIHNlZWQgbWFzayAqLworI2RlZmluZSBBUjVLX0RJQUdfU1dfU0NSQU1fU0VFRF9TCTEwCisjZGVmaW5lIEFSNUtfRElBR19TV19ESVNfU0VRX0lOQwkweDAwMDQwMDAwCS8qIERpc2FibGUgc2VxbnVtIGluY3JlbWVudCAoPylbNTIxMF0gKi8KKyNkZWZpbmUgQVI1S19ESUFHX1NXX0ZSQU1FX05WMF81MjEwCTB4MDAwODAwMDAKKyNkZWZpbmUgQVI1S19ESUFHX1NXX0ZSQU1FX05WMF81MjExCTB4MDAwMjAwMDAJLyogQWNjZXB0IGZyYW1lcyBvZiBub24temVybyBwcm90b2NvbCBudW1iZXIgKi8KKyNkZWZpbmUJQVI1S19ESUFHX1NXX0ZSQU1FX05WMAkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8gXAorCQkJCQlBUjVLX0RJQUdfU1dfRlJBTUVfTlYwXzUyMTAgOiBBUjVLX0RJQUdfU1dfRlJBTUVfTlYwXzUyMTEpCisjZGVmaW5lIEFSNUtfRElBR19TV19PQlNQVF9NCQkweDAwMGMwMDAwCS8qIE9ic2VydmF0aW9uIHBvaW50IHNlbGVjdCAoPykgKi8KKyNkZWZpbmUgQVI1S19ESUFHX1NXX09CU1BUX1MJCTE4CisjZGVmaW5lIEFSNUtfRElBR19TV19SWF9DTEVBUl9ISUdICTB4MDAxMDAwMAkvKiBGb3JjZSBSWCBDbGVhciBoaWdoICovCisjZGVmaW5lIEFSNUtfRElBR19TV19JR05PUkVfQ0FSUl9TRU5TRQkweDAwMjAwMDAJLyogSWdub3JlIHZpcnR1YWwgY2FycmllciBzZW5zZSAqLworI2RlZmluZSBBUjVLX0RJQUdfU1dfQ0hBTkVMX0lETEVfSElHSAkweDAwNDAwMDAJLyogRm9yY2UgY2hhbm5lbCBpZGxlIGhpZ2ggKi8KKyNkZWZpbmUgQVI1S19ESUFHX1NXX1BIRUFSX01FCQkweDAwODAwMDAJLyogPz8/ICovCisKKy8qCisgKiBUU0YgKGNsb2NrKSByZWdpc3RlciAobG93ZXIgMzIgYml0cykKKyAqLworI2RlZmluZSBBUjVLX1RTRl9MMzJfNTIxMAkweDgwNmMKKyNkZWZpbmUgQVI1S19UU0ZfTDMyXzUyMTEJMHg4MDRjCisjZGVmaW5lCUFSNUtfVFNGX0wzMgkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8gXAorCQkJCUFSNUtfVFNGX0wzMl81MjEwIDogQVI1S19UU0ZfTDMyXzUyMTEpCisKKy8qCisgKiBUU0YgKGNsb2NrKSByZWdpc3RlciAoaGlnaGVyIDMyIGJpdHMpCisgKi8KKyNkZWZpbmUgQVI1S19UU0ZfVTMyXzUyMTAJMHg4MDcwCisjZGVmaW5lIEFSNUtfVFNGX1UzMl81MjExCTB4ODA1MAorI2RlZmluZQlBUjVLX1RTRl9VMzIJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQlBUjVLX1RTRl9VMzJfNTIxMCA6IEFSNUtfVFNGX1UzMl81MjExKQorCisvKgorICogTGFzdCBiZWFjb24gdGltZXN0YW1wIHJlZ2lzdGVyIChSZWFkIE9ubHkpCisgKi8KKyNkZWZpbmUgQVI1S19MQVNUX1RTVFAJMHg4MDgwCisKKy8qCisgKiBBRERBQyB0ZXN0IHJlZ2lzdGVyIFs1MjExK10KKyAqLworI2RlZmluZSBBUjVLX0FEREFDX1RFU1QJCQkweDgwNTQJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfQUREQUNfVEVTVF9UWENPTlQgCQkweDAwMDAwMDAxCS8qIFRlc3QgY29udGludW91cyB0eCAqLworI2RlZmluZSBBUjVLX0FEREFDX1RFU1RfVFNUX01PREUJMHgwMDAwMDAwMgkvKiBUZXN0IG1vZGUgKi8KKyNkZWZpbmUgQVI1S19BRERBQ19URVNUX0xPT1BfRU4JCTB4MDAwMDAwMDQJLyogRW5hYmxlIGxvb3AgKi8KKyNkZWZpbmUgQVI1S19BRERBQ19URVNUX0xPT1BfTEVOCTB4MDAwMDAwMDgJLyogTG9vcCBsZW5ndGggKGZpZWxkKSAqLworI2RlZmluZSBBUjVLX0FEREFDX1RFU1RfVVNFX1U4CQkweDAwMDA0MDAwCS8qIFVzZSB1cHBlciA4IGJpdHMgKi8KKyNkZWZpbmUgQVI1S19BRERBQ19URVNUX01TQgkJMHgwMDAwODAwMAkvKiBTdGF0ZSBvZiBNU0IgKi8KKyNkZWZpbmUgQVI1S19BRERBQ19URVNUX1RSSUdfU0VMCTB4MDAwMTAwMDAJLyogVHJpZ2dlciBzZWxlY3QgKi8KKyNkZWZpbmUgQVI1S19BRERBQ19URVNUX1RSSUdfUFRZCTB4MDAwMjAwMDAJLyogVHJpZ2dlciBwb2xhcml0eSAqLworI2RlZmluZSBBUjVLX0FEREFDX1RFU1RfUlhDT05UCQkweDAwMDQwMDAwCS8qIENvbnRpbnVvdXMgY2FwdHVyZSAqLworI2RlZmluZSBBUjVLX0FEREFDX1RFU1RfQ0FQVFVSRQkJMHgwMDA4MDAwMAkvKiBCZWdpbiBjYXB0dXJlICovCisjZGVmaW5lIEFSNUtfQUREQUNfVEVTVF9UU1RfQVJNCQkweDAwMTAwMDAwCS8qIEFSTSByeCBidWZmZXIgZm9yIGNhcHR1cmUgKi8KKworLyoKKyAqIERlZmF1bHQgYW50ZW5uYSByZWdpc3RlciBbNTIxMStdCisgKi8KKyNkZWZpbmUgQVI1S19ERUZBVUxUX0FOVEVOTkEJMHg4MDU4CisKKy8qCisgKiBGcmFtZSBjb250cm9sIFFvUyBtYXNrIHJlZ2lzdGVyICg/KSBbNTIxMStdCisgKiAoRkNfUU9TX01BU0spCisgKi8KKyNkZWZpbmUgQVI1S19GUkFNRV9DVExfUU9TTQkweDgwNWMKKworLyoKKyAqIFNlcSBtYXNrIHJlZ2lzdGVyICg/KSBbNTIxMStdCisgKi8KKyNkZWZpbmUgQVI1S19TRVFfTUFTSwkweDgwNjAKKworLyoKKyAqIFJldHJ5IGNvdW50IHJlZ2lzdGVyIFs1MjEwXQorICovCisjZGVmaW5lIEFSNUtfUkVUUllfQ05UCQkweDgwODQJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX1JFVFJZX0NOVF9TU0gJMHgwMDAwMDAzZgkvKiBTdGF0aW9uIHNob3J0IHJldHJ5IGNvdW50ICg/KSAqLworI2RlZmluZSBBUjVLX1JFVFJZX0NOVF9TTEcJMHgwMDAwMGZjMAkvKiBTdGF0aW9uIGxvbmcgcmV0cnkgY291bnQgKD8pICovCisKKy8qCisgKiBCYWNrLW9mZiBzdGF0dXMgcmVnaXN0ZXIgWzUyMTBdCisgKi8KKyNkZWZpbmUgQVI1S19CQUNLT0ZGCQkweDgwODgJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0JBQ0tPRkZfQ1cJCTB4MDAwMDAzZmYJLyogQmFja29mZiBDb250ZW50aW9uIFdpbmRvdyAoPykgKi8KKyNkZWZpbmUgQVI1S19CQUNLT0ZGX0NOVAkweDAzZmYwMDAwCS8qIEJhY2tvZmYgY291bnQgKD8pICovCisKKworCisvKgorICogTkFWIHJlZ2lzdGVyIChjdXJyZW50KQorICovCisjZGVmaW5lIEFSNUtfTkFWXzUyMTAJCTB4ODA4YworI2RlZmluZSBBUjVLX05BVl81MjExCQkweDgwODQKKyNkZWZpbmUJQVI1S19OQVYJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQlBUjVLX05BVl81MjEwIDogQVI1S19OQVZfNTIxMSkKKworLyoKKyAqIFJUUyBzdWNjZXNzIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19SVFNfT0tfNTIxMAkweDgwOTAKKyNkZWZpbmUgQVI1S19SVFNfT0tfNTIxMQkweDgwODgKKyNkZWZpbmUJQVI1S19SVFNfT0sJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQlBUjVLX1JUU19PS181MjEwIDogQVI1S19SVFNfT0tfNTIxMSkKKworLyoKKyAqIFJUUyBmYWlsdXJlIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19SVFNfRkFJTF81MjEwCTB4ODA5NAorI2RlZmluZSBBUjVLX1JUU19GQUlMXzUyMTEJMHg4MDhjCisjZGVmaW5lCUFSNUtfUlRTX0ZBSUwJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQlBUjVLX1JUU19GQUlMXzUyMTAgOiBBUjVLX1JUU19GQUlMXzUyMTEpCisKKy8qCisgKiBBQ0sgZmFpbHVyZSByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfQUNLX0ZBSUxfNTIxMAkweDgwOTgKKyNkZWZpbmUgQVI1S19BQ0tfRkFJTF81MjExCTB4ODA5MAorI2RlZmluZQlBUjVLX0FDS19GQUlMCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJQVI1S19BQ0tfRkFJTF81MjEwIDogQVI1S19BQ0tfRkFJTF81MjExKQorCisvKgorICogRkNTIGZhaWx1cmUgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0ZDU19GQUlMXzUyMTAJMHg4MDljCisjZGVmaW5lIEFSNUtfRkNTX0ZBSUxfNTIxMQkweDgwOTQKKyNkZWZpbmUJQVI1S19GQ1NfRkFJTAkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8gXAorCQkJCUFSNUtfRkNTX0ZBSUxfNTIxMCA6IEFSNUtfRkNTX0ZBSUxfNTIxMSkKKworLyoKKyAqIEJlYWNvbiBjb3VudCByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfQkVBQ09OX0NOVF81MjEwCTB4ODBhMAorI2RlZmluZSBBUjVLX0JFQUNPTl9DTlRfNTIxMQkweDgwOTgKKyNkZWZpbmUJQVI1S19CRUFDT05fQ05UCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCisJCQkJQVI1S19CRUFDT05fQ05UXzUyMTAgOiBBUjVLX0JFQUNPTl9DTlRfNTIxMSkKKworCisvKj09PTUyMTIgU3BlY2lmaWMgUENVIHJlZ2lzdGVycz09PSovCisKKy8qCisgKiBUcmFuc21pdCBwb3dlciBjb250cm9sIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19UUEMJCQkweDgwZTgKKyNkZWZpbmUgQVI1S19UUENfQUNLCQkJMHgwMDAwMDAzZgkvKiBhY2sgZnJhbWVzICovCisjZGVmaW5lIEFSNUtfVFBDX0FDS19TCQkJMAorI2RlZmluZSBBUjVLX1RQQ19DVFMJCQkweDAwMDAzZjAwCS8qIGN0cyBmcmFtZXMgKi8KKyNkZWZpbmUgQVI1S19UUENfQ1RTX1MJCQk4CisjZGVmaW5lIEFSNUtfVFBDX0NISVJQCQkJMHgwMDNmMDAwMAkvKiBjaGlycCBmcmFtZXMgKi8KKyNkZWZpbmUgQVI1S19UUENfQ0hJUlBfUwkJMTYKKyNkZWZpbmUgQVI1S19UUENfRE9QUExFUgkJMHgwZjAwMDAwMAkvKiBkb3BwbGVyIGNoaXJwIHNwYW4gKi8KKyNkZWZpbmUgQVI1S19UUENfRE9QUExFUl9TCQkyNAorCisvKgorICogWFIgKGVYdGVuZGVkIFJhbmdlKSBtb2RlIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19YUk1PREUJCQkweDgwYzAJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfWFJNT0RFX1BPTExfVFlQRV9NCQkweDAwMDAwMDNmCS8qIE1hc2sgZm9yIFBvbGwgdHlwZSAoPykgKi8KKyNkZWZpbmUJQVI1S19YUk1PREVfUE9MTF9UWVBFX1MJCTAKKyNkZWZpbmUJQVI1S19YUk1PREVfUE9MTF9TVUJUWVBFX00JMHgwMDAwMDAzYwkvKiBNYXNrIGZvciBQb2xsIHN1YnR5cGUgKD8pICovCisjZGVmaW5lCUFSNUtfWFJNT0RFX1BPTExfU1VCVFlQRV9TCTIKKyNkZWZpbmUJQVI1S19YUk1PREVfUE9MTF9XQUlUX0FMTAkweDAwMDAwMDgwCS8qIFdhaXQgZm9yIHBvbGwgKi8KKyNkZWZpbmUJQVI1S19YUk1PREVfU0lGU19ERUxBWQkJMHgwMDBmZmYwMAkvKiBNYXNrIGZvciBTSUZTIGRlbGF5ICovCisjZGVmaW5lCUFSNUtfWFJNT0RFX0ZSQU1FX0hPTERfTQkweGZmZjAwMDAwCS8qIE1hc2sgZm9yIGZyYW1lIGhvbGQgKD8pICovCisjZGVmaW5lCUFSNUtfWFJNT0RFX0ZSQU1FX0hPTERfUwkyMAorCisvKgorICogWFIgZGVsYXkgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1hSREVMQVkJCQkweDgwYzQJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfWFJERUxBWV9TTE9UX0RFTEFZX00JMHgwMDAwZmZmZgkvKiBNYXNrIGZvciBzbG90IGRlbGF5ICovCisjZGVmaW5lIEFSNUtfWFJERUxBWV9TTE9UX0RFTEFZX1MJMAorI2RlZmluZSBBUjVLX1hSREVMQVlfQ0hJUlBfREVMQVlfTQkweGZmZmYwMDAwCS8qIE1hc2sgZm9yIENISVJQIGRhdGEgZGVsYXkgKi8KKyNkZWZpbmUgQVI1S19YUkRFTEFZX0NISVJQX0RFTEFZX1MJMTYKKworLyoKKyAqIFhSIHRpbWVvdXQgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1hSVElNRU9VVAkJCTB4ODBjOAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19YUlRJTUVPVVRfQ0hJUlBfTQkJMHgwMDAwZmZmZgkvKiBNYXNrIGZvciBDSElSUCB0aW1lb3V0ICovCisjZGVmaW5lIEFSNUtfWFJUSU1FT1VUX0NISVJQX1MJCTAKKyNkZWZpbmUgQVI1S19YUlRJTUVPVVRfUE9MTF9NCQkweGZmZmYwMDAwCS8qIE1hc2sgZm9yIFBvbGwgdGltZW91dCAqLworI2RlZmluZSBBUjVLX1hSVElNRU9VVF9QT0xMX1MJCTE2CisKKy8qCisgKiBYUiBjaGlycCByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfWFJDSElSUAkJCTB4ODBjYwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19YUkNISVJQX1NFTkQJCTB4MDAwMDAwMDEJLyogU2VuZCBDSElSUCAqLworI2RlZmluZSBBUjVLX1hSQ0hJUlBfR0FQCQkweGZmZmYwMDAwCS8qIE1hc2sgZm9yIENISVJQIGdhcCAoPykgKi8KKworLyoKKyAqIFhSIHN0b21wIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19YUlNUT01QCQkJMHg4MGQwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX1hSU1RPTVBfVFgJCQkweDAwMDAwMDAxCS8qIFN0b21wIFR4ICg/KSAqLworI2RlZmluZSBBUjVLX1hSU1RPTVBfUlgJCQkweDAwMDAwMDAyCS8qIFN0b21wIFJ4ICg/KSAqLworI2RlZmluZSBBUjVLX1hSU1RPTVBfVFhfUlNTSQkJMHgwMDAwMDAwNAkvKiBTdG9tcCBUeCBSU1NJICg/KSAqLworI2RlZmluZSBBUjVLX1hSU1RPTVBfVFhfQlNTSUQJCTB4MDAwMDAwMDgJLyogU3RvbXAgVHggQlNTSUQgKD8pICovCisjZGVmaW5lIEFSNUtfWFJTVE9NUF9EQVRBCQkweDAwMDAwMDEwCS8qIFN0b21wIGRhdGEgKD8pKi8KKyNkZWZpbmUgQVI1S19YUlNUT01QX1JTU0lfVEhSRVMJCTB4MDAwMGZmMDAJLyogTWFzayBmb3IgWFIgUlNTSSB0aHJlc2hvbGQgKi8KKworLyoKKyAqIEZpcnN0IGVuaGFuY2VkIHNsZWVwIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19TTEVFUDAJCQkweDgwZDQJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfU0xFRVAwX05FWFRfRFRJTQkJMHgwMDA3ZmZmZgkvKiBNYXNrIGZvciBuZXh0IERUSU0gKD8pICovCisjZGVmaW5lIEFSNUtfU0xFRVAwX05FWFRfRFRJTV9TCQkwCisjZGVmaW5lIEFSNUtfU0xFRVAwX0FTU1VNRV9EVElNCQkweDAwMDgwMDAwCS8qIEFzc3VtZSBEVElNICovCisjZGVmaW5lIEFSNUtfU0xFRVAwX0VOSF9TTEVFUF9FTgkweDAwMTAwMDAwCS8qIEVuYWJsZSBlbmNoYW5jZWQgc2xlZXAgY29udHJvbCAqLworI2RlZmluZSBBUjVLX1NMRUVQMF9DQUJUTwkJMHhmZjAwMDAwMAkvKiBNYXNrIGZvciBDQUIgVGltZSBPdXQgKi8KKyNkZWZpbmUgQVI1S19TTEVFUDBfQ0FCVE9fUwkJMjQKKworLyoKKyAqIFNlY29uZCBlbmhhbmNlZCBzbGVlcCByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfU0xFRVAxCQkJMHg4MGQ4CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX1NMRUVQMV9ORVhUX1RJTQkJMHgwMDA3ZmZmZgkvKiBNYXNrIGZvciBuZXh0IFRJTSAoPykgKi8KKyNkZWZpbmUgQVI1S19TTEVFUDFfTkVYVF9USU1fUwkJMAorI2RlZmluZSBBUjVLX1NMRUVQMV9CRUFDT05fVE8JCTB4ZmYwMDAwMDAJLyogTWFzayBmb3IgQmVhY29uIFRpbWUgT3V0ICovCisjZGVmaW5lIEFSNUtfU0xFRVAxX0JFQUNPTl9UT19TCQkyNAorCisvKgorICogVGhpcmQgZW5oYW5jZWQgc2xlZXAgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1NMRUVQMgkJCTB4ODBkYwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19TTEVFUDJfVElNX1BFUgkJMHgwMDAwZmZmZgkvKiBNYXNrIGZvciBUSU0gcGVyaW9kICg/KSAqLworI2RlZmluZSBBUjVLX1NMRUVQMl9USU1fUEVSX1MJCTAKKyNkZWZpbmUgQVI1S19TTEVFUDJfRFRJTV9QRVIJCTB4ZmZmZjAwMDAJLyogTWFzayBmb3IgRFRJTSBwZXJpb2QgKD8pICovCisjZGVmaW5lIEFSNUtfU0xFRVAyX0RUSU1fUEVSX1MJCTE2CisKKy8qCisgKiBCU1NJRCBtYXNrIHJlZ2lzdGVycworICovCisjZGVmaW5lIEFSNUtfQlNTX0lETTAJCQkweDgwZTAJLyogVXBwZXIgYml0cyAqLworI2RlZmluZSBBUjVLX0JTU19JRE0xCQkJMHg4MGU0CS8qIExvd2VyIGJpdHMgKi8KKworLyoKKyAqIFRYIHBvd2VyIGNvbnRyb2wgKFRQQykgcmVnaXN0ZXIKKyAqCisgKiBYWFg6IFBDREFDIHN0ZXBzICgwLjVkYm0pIG9yIERCTSA/CisgKgorICovCisjZGVmaW5lIEFSNUtfVFhQQwkJCTB4ODBlOAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19UWFBDX0FDS19NCQkJMHgwMDAwMDAzZgkvKiBBQ0sgdHggcG93ZXIgKi8KKyNkZWZpbmUgQVI1S19UWFBDX0FDS19TCQkJMAorI2RlZmluZSBBUjVLX1RYUENfQ1RTX00JCQkweDAwMDAzZjAwCS8qIENUUyB0eCBwb3dlciAqLworI2RlZmluZSBBUjVLX1RYUENfQ1RTX1MJCQk4CisjZGVmaW5lIEFSNUtfVFhQQ19DSElSUF9NCQkweDAwM2YwMDAwCS8qIENISVJQIHR4IHBvd2VyICovCisjZGVmaW5lIEFSNUtfVFhQQ19DSElSUF9TCQkxNgorI2RlZmluZSBBUjVLX1RYUENfRE9QUExFUgkJMHgwZjAwMDAwMAkvKiBEb3BwbGVyIGNoaXJwIHNwYW4gKD8pICovCisjZGVmaW5lIEFSNUtfVFhQQ19ET1BQTEVSX1MJCTI0CisKKy8qCisgKiBQcm9maWxlIGNvdW50IHJlZ2lzdGVycworICovCisjZGVmaW5lIEFSNUtfUFJPRkNOVF9UWAkJCTB4ODBlYwkvKiBUeCBjb3VudCAqLworI2RlZmluZSBBUjVLX1BST0ZDTlRfUlgJCQkweDgwZjAJLyogUnggY291bnQgKi8KKyNkZWZpbmUgQVI1S19QUk9GQ05UX1JYQ0xSCQkweDgwZjQJLyogQ2xlYXIgUnggY291bnQgKi8KKyNkZWZpbmUgQVI1S19QUk9GQ05UX0NZQ0xFCQkweDgwZjgJLyogQ3ljbGUgY291bnQgKD8pICovCisKKy8qCisgKiBRdWlldCBwZXJpb2QgY29udHJvbCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBBUjVLX1FVSUVUX0NUTDEJCQkweDgwZmMJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMV9ORVhUX1FUX1RTRgkweDAwMDBmZmZmCS8qIE5leHQgcXVpZXQgcGVyaW9kIFRTRiAoVFUpICovCisjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMV9ORVhUX1FUX1RTRl9TCTAKKyNkZWZpbmUgQVI1S19RVUlFVF9DVEwxX1FUX0VOCQkweDAwMDEwMDAwCS8qIEVuYWJsZSBxdWlldCBwZXJpb2QgKi8KKyNkZWZpbmUgQVI1S19RVUlFVF9DVEwxX0FDS19DVFNfRU4JMHgwMDAyMDAwMAkvKiBTZW5kIEFDSy9DVFMgZHVyaW5nIHF1aWV0IHBlcmlvZCAqLworCisjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMgkJCTB4ODEwMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19RVUlFVF9DVEwyX1FUX1BFUgkJMHgwMDAwZmZmZgkvKiBNYXNrIGZvciBxdWlldCBwZXJpb2QgcGVyaW9kaWNpdHkgKi8KKyNkZWZpbmUgQVI1S19RVUlFVF9DVEwyX1FUX1BFUl9TCTAKKyNkZWZpbmUgQVI1S19RVUlFVF9DVEwyX1FUX0RVUgkJMHhmZmZmMDAwMAkvKiBNYXNrIGZvciBxdWlldCBwZXJpb2QgZHVyYXRpb24gKi8KKyNkZWZpbmUgQVI1S19RVUlFVF9DVEwyX1FUX0RVUl9TCTE2CisKKy8qCisgKiBUU0YgcGFyYW1ldGVyIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19UU0ZfUEFSTQkJCTB4ODEwNAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19UU0ZfUEFSTV9JTkMJCTB4MDAwMDAwZmYJLyogTWFzayBmb3IgVFNGIGluY3JlbWVudCAqLworI2RlZmluZSBBUjVLX1RTRl9QQVJNX0lOQ19TCQkwCisKKy8qCisgKiBRb1MgTk9BQ0sgcG9saWN5CisgKi8KKyNkZWZpbmUgQVI1S19RT1NfTk9BQ0sJCQkweDgxMDgJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfUU9TX05PQUNLXzJCSVRfVkFMVUVTCTB4MDAwMDAwMGYJLyogPz8/ICovCisjZGVmaW5lIEFSNUtfUU9TX05PQUNLXzJCSVRfVkFMVUVTX1MJMAorI2RlZmluZSBBUjVLX1FPU19OT0FDS19CSVRfT0ZGU0VUCTB4MDAwMDAwNzAJLyogPz8/ICovCisjZGVmaW5lIEFSNUtfUU9TX05PQUNLX0JJVF9PRkZTRVRfUwk0CisjZGVmaW5lIEFSNUtfUU9TX05PQUNLX0JZVEVfT0ZGU0VUCTB4MDAwMDAxODAJLyogPz8/ICovCisjZGVmaW5lIEFSNUtfUU9TX05PQUNLX0JZVEVfT0ZGU0VUX1MJNworCisvKgorICogUEhZIGVycm9yIGZpbHRlciByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfUEhZX0VSUl9GSUwJCTB4ODEwYworI2RlZmluZSBBUjVLX1BIWV9FUlJfRklMX1JBREFSCQkweDAwMDAwMDIwCS8qIFJhZGFyIHNpZ25hbCAqLworI2RlZmluZSBBUjVLX1BIWV9FUlJfRklMX09GRE0JCTB4MDAwMjAwMDAJLyogT0ZETSBmYWxzZSBkZXRlY3QgKEFOSSkgKi8KKyNkZWZpbmUgQVI1S19QSFlfRVJSX0ZJTF9DQ0sJCTB4MDIwMDAwMDAJLyogQ0NLIGZhbHNlIGRldGVjdCAoQU5JKSAqLworCisvKgorICogWFIgbGF0ZW5jeSByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfWFJMQVRfVFgJCTB4ODExMAorCisvKgorICogQUNLIFNJRlMgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX0FDS1NJRlMJCTB4ODExNAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19BQ0tTSUZTX0lOQwkweDAwMDAwMDAwCS8qIEFDSyBTSUZTIEluY3JlbWVudCAoZmllbGQpICovCisKKy8qCisgKiBNSUMgUW9TIGNvbnRyb2wgcmVnaXN0ZXIgKD8pCisgKi8KKyNkZWZpbmUJQVI1S19NSUNfUU9TX0NUTAkJMHg4MTE4CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX01JQ19RT1NfQ1RMX09GRihfbikJKDEgPDwgKF9uICogMikpCisjZGVmaW5lCUFSNUtfTUlDX1FPU19DVExfTVFfRU4JCTB4MDAwMTAwMDAJLyogRW5hYmxlIE1JQyBRb1MgKi8KKworLyoKKyAqIE1JQyBRb1Mgc2VsZWN0IHJlZ2lzdGVyICg/KQorICovCisjZGVmaW5lCUFSNUtfTUlDX1FPU19TRUwJCTB4ODExYworI2RlZmluZQlBUjVLX01JQ19RT1NfU0VMX09GRihfbikJKDEgPDwgKF9uICogNCkpCisKKy8qCisgKiBNaXNjIG1vZGUgY29udHJvbCByZWdpc3RlciAoPykKKyAqLworI2RlZmluZQlBUjVLX01JU0NfTU9ERQkJCTB4ODEyMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19NSVNDX01PREVfRkJTU0lEX01BVENICTB4MDAwMDAwMDEJLyogRm9yY2UgQlNTSUQgbWF0Y2ggKi8KKyNkZWZpbmUJQVI1S19NSVNDX01PREVfQUNLU0lGU19NRU0JMHgwMDAwMDAwMgkvKiBBQ0sgU0lGUyBtZW1vcnkgKD8pICovCisjZGVmaW5lCUFSNUtfTUlTQ19NT0RFX0NPTUJJTkVEX01JQwkweDAwMDAwMDA0CS8qIHVzZSByeC90eCBNSUMga2V5ICovCisvKiBtb3JlIGJpdHMgKi8KKworLyoKKyAqIE9GRE0gRmlsdGVyIGNvdW50ZXIKKyAqLworI2RlZmluZQlBUjVLX09GRE1fRklMX0NOVAkJMHg4MTI0CisKKy8qCisgKiBDQ0sgRmlsdGVyIGNvdW50ZXIKKyAqLworI2RlZmluZQlBUjVLX0NDS19GSUxfQ05UCQkweDgxMjgKKworLyoKKyAqIFBIWSBFcnJvciBDb3VudGVycyAoPykKKyAqLworI2RlZmluZQlBUjVLX1BIWUVSUl9DTlQxCQkweDgxMmMKKyNkZWZpbmUJQVI1S19QSFlFUlJfQ05UMV9NQVNLCQkweDgxMzAKKworI2RlZmluZQlBUjVLX1BIWUVSUl9DTlQyCQkweDgxMzQKKyNkZWZpbmUJQVI1S19QSFlFUlJfQ05UMl9NQVNLCQkweDgxMzgKKworLyoKKyAqIFRTRiBUaHJlc2hvbGQgcmVnaXN0ZXIgKD8pCisgKi8KKyNkZWZpbmUJQVI1S19UU0ZfVEhSRVMJCQkweDgxM2MKKworLyoKKyAqIFRPRE86IFdha2UgT24gV2lyZWxlc3MgcmVnaXN0ZXJzCisgKiBSYW5nZTogMHg4MTQ3IC0gMHg4MThjCisgKi8KKworLyoKKyAqIFJhdGUgLT4gQUNLIFNJRlMgbWFwcGluZyB0YWJsZSAoMzIgZW50cmllcykKKyAqLworI2RlZmluZQlBUjVLX1JBVEVfQUNLU0lGU19CQVNFCQkweDg2ODAJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUkFURV9BQ0tTSUZTKF9uKQkJKEFSNUtfUkFURV9BQ0tTSUZTX0JTRSArICgoX24pIDw8IDIpKQorI2RlZmluZQlBUjVLX1JBVEVfQUNLU0lGU19OT1JNQUwJMHgwMDAwMDAwMQkvKiBOb3JtYWwgU0lGUyAoZmllbGQpICovCisjZGVmaW5lCUFSNUtfUkFURV9BQ0tTSUZTX1RVUkJPCQkweDAwMDAwNDAwCS8qIFR1cmJvIFNJRlMgKGZpZWxkKSAqLworCisvKgorICogUmF0ZSAtPiBkdXJhdGlvbiBtYXBwaW5nIHRhYmxlICgzMiBlbnRyaWVzKQorICovCisjZGVmaW5lIEFSNUtfUkFURV9EVVJfQkFTRQkJMHg4NzAwCisjZGVmaW5lIEFSNUtfUkFURV9EVVIoX24pCQkoQVI1S19SQVRFX0RVUl9CQVNFICsgKChfbikgPDwgMikpCisKKy8qCisgKiBSYXRlIC0+IGRiIG1hcHBpbmcgdGFibGUKKyAqICg4IGVudHJpZXMsIGVhY2ggb25lIGhhcyA0IDhiaXQgZmllbGRzKQorICovCisjZGVmaW5lIEFSNUtfUkFURTJEQl9CQVNFCQkweDg3YzAKKyNkZWZpbmUgQVI1S19SQVRFMkRCKF9uKQkJKEFSNUtfUkFURTJEQl9CQVNFICsgKChfbikgPDwgMikpCisKKy8qCisgKiBkYiAtPiBSYXRlIG1hcHBpbmcgdGFibGUKKyAqICg4IGVudHJpZXMsIGVhY2ggb25lIGhhcyA0IDhiaXQgZmllbGRzKQorICovCisjZGVmaW5lIEFSNUtfREIyUkFURV9CQVNFCQkweDg3ZTAKKyNkZWZpbmUgQVI1S19EQjJSQVRFKF9uKQkJKEFSNUtfREIyUkFURV9CQVNFICsgKChfbikgPDwgMikpCisKKy8qPT09NTIxMiBlbmQ9PT0qLworCisvKgorICogS2V5IHRhYmxlIChXRVApIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19LRVlUQUJMRV8wXzUyMTAJCTB4OTAwMAorI2RlZmluZSBBUjVLX0tFWVRBQkxFXzBfNTIxMQkJMHg4ODAwCisjZGVmaW5lIEFSNUtfS0VZVEFCTEVfNTIxMChfbikJCShBUjVLX0tFWVRBQkxFXzBfNTIxMCArICgoX24pIDw8IDUpKQorI2RlZmluZSBBUjVLX0tFWVRBQkxFXzUyMTEoX24pCQkoQVI1S19LRVlUQUJMRV8wXzUyMTEgKyAoKF9uKSA8PCA1KSkKKyNkZWZpbmUJQVI1S19LRVlUQUJMRShfbikJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQkJQVI1S19LRVlUQUJMRV81MjEwKF9uKSA6IEFSNUtfS0VZVEFCTEVfNTIxMShfbikpCisjZGVmaW5lIEFSNUtfS0VZVEFCTEVfT0ZGKF9uLCB4KQkoQVI1S19LRVlUQUJMRShfbikgKyAoeCA8PCAyKSkKKyNkZWZpbmUgQVI1S19LRVlUQUJMRV9UWVBFKF9uKQkJQVI1S19LRVlUQUJMRV9PRkYoX24sIDUpCisjZGVmaW5lIEFSNUtfS0VZVEFCTEVfVFlQRV80MAkJMHgwMDAwMDAwMAorI2RlZmluZSBBUjVLX0tFWVRBQkxFX1RZUEVfMTA0CQkweDAwMDAwMDAxCisjZGVmaW5lIEFSNUtfS0VZVEFCTEVfVFlQRV8xMjgJCTB4MDAwMDAwMDMKKyNkZWZpbmUgQVI1S19LRVlUQUJMRV9UWVBFX1RLSVAJCTB4MDAwMDAwMDQJLyogWzUyMTIrXSAqLworI2RlZmluZSBBUjVLX0tFWVRBQkxFX1RZUEVfQUVTCQkweDAwMDAwMDA1CS8qIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19LRVlUQUJMRV9UWVBFX0NDTQkJMHgwMDAwMDAwNgkvKiBbNTIxMitdICovCisjZGVmaW5lIEFSNUtfS0VZVEFCTEVfVFlQRV9OVUxMCQkweDAwMDAwMDA3CS8qIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19LRVlUQUJMRV9BTlRFTk5BCQkweDAwMDAwMDA4CS8qIFs1MjEyK10gKi8KKyNkZWZpbmUgQVI1S19LRVlUQUJMRV9NQUMwKF9uKQkJQVI1S19LRVlUQUJMRV9PRkYoX24sIDYpCisjZGVmaW5lIEFSNUtfS0VZVEFCTEVfTUFDMShfbikJCUFSNUtfS0VZVEFCTEVfT0ZGKF9uLCA3KQorI2RlZmluZSBBUjVLX0tFWVRBQkxFX1ZBTElECQkweDAwMDA4MDAwCisKKy8qIElmIGtleSB0eXBlIGlzIFRLSVAgYW5kIE1JQyBpcyBlbmFibGVkCisgKiBNSUMga2V5IGdvZXMgaW4gb2Zmc2V0IGVudHJ5ICsgNjQgKi8KKyNkZWZpbmUJQVI1S19LRVlUQUJMRV9NSUNfT0ZGU0VUCTY0CisKKy8qIFdFUCA0MC1iaXQJPSA0MC1iaXQgIGVudGVyZWQga2V5ICsgMjQgYml0IElWID0gNjQtYml0CisgKiBXRVAgMTA0LWJpdAk9IDEwNC1iaXQgZW50ZXJlZCBrZXkgKyAyNC1iaXQgSVYgPSAxMjgtYml0CisgKiBXRVAgMTI4LWJpdAk9IDEyOC1iaXQgZW50ZXJlZCBrZXkgKyAyNCBiaXQgSVYgPSAxNTItYml0CisgKgorICogU29tZSB2ZW5kb3JzIGhhdmUgaW50cm9kdWNlZCBiaWdnZXIgV0VQIGtleXMgdG8gYWRkcmVzcworICogc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIGluIFdFUC4gVGhpcyBpbmNsdWRlczoKKyAqCisgKiBXRVAgMjMyLWJpdCA9IDIzMi1iaXQgZW50ZXJlZCBrZXkgKyAyNCBiaXQgSVYgPSAyNTYtYml0CisgKgorICogV2UgY2FuIGV4cGFuZCB0aGlzIGlmIHdlIGZpbmQgYXI1ayBBdGhlcm9zIGNhcmRzIHdpdGggYSBsYXJnZXIKKyAqIGtleSB0YWJsZSBzaXplLgorICovCisjZGVmaW5lIEFSNUtfS0VZVEFCTEVfU0laRV81MjEwCQk2NAorI2RlZmluZSBBUjVLX0tFWVRBQkxFX1NJWkVfNTIxMQkJMTI4CisjZGVmaW5lCUFSNUtfS0VZVEFCTEVfU0laRQkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8gXAorCQkJCQlBUjVLX0tFWVRBQkxFX1NJWkVfNTIxMCA6IEFSNUtfS0VZVEFCTEVfU0laRV81MjExKQorCisKKy8qPT09UEhZIFJFR0lTVEVSUz09PSovCisKKy8qCisgKiBQSFkgcmVnaXN0ZXJzIHN0YXJ0CisgKi8KKyNkZWZpbmUJQVI1S19QSFlfQkFTRQkJCTB4OTgwMAorI2RlZmluZQlBUjVLX1BIWShfbikJCQkoQVI1S19QSFlfQkFTRSArICgoX24pIDw8IDIpKQorCisvKgorICogVFNUXzIgKE1pc2MgY29uZmlnIHBhcmFtZXRlcnMpCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfVFNUMgkJCTB4OTgwMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19QSFlfVFNUMl9UUklHX1NFTAkJMHgwMDAwMDAwNwkvKiBUcmlnZ2VyIHNlbGVjdCAoPykqLworI2RlZmluZSBBUjVLX1BIWV9UU1QyX1RSSUcJCTB4MDAwMDAwMTAJLyogVHJpZ2dlciAoPykgKi8KKyNkZWZpbmUgQVI1S19QSFlfVFNUMl9DQlVTX01PREUJCTB4MDAwMDAwNjAJLyogQ2FyZGJ1cyBtb2RlICg/KSAqLworI2RlZmluZSBBUjVLX1BIWV9UU1QyX0NMSzMyCQkweDAwMDAwNDAwCS8qIENMS19PVVQgaXMgQ0xLMzIgKDMyS2h6IGV4dGVybmFsKSAqLworI2RlZmluZSBBUjVLX1BIWV9UU1QyX0NIQU5DT1JfRFVNUF9FTgkweDAwMDAwODAwCS8qIEVuYWJsZSBDaGFuY29yIGR1bXAgKD8pICovCisjZGVmaW5lIEFSNUtfUEhZX1RTVDJfRVZFTl9DSEFOQ09SX0RVTVAJMHgwMDAwMTAwMAkvKiBFdmVuIENoYW5jb3IgZHVtcCAoPykgKi8KKyNkZWZpbmUgQVI1S19QSFlfVFNUMl9SRlNJTEVOVF9FTgkweDAwMDAyMDAwCS8qIEVuYWJsZSBSRlNJTEVOVCAqLworI2RlZmluZSBBUjVLX1BIWV9UU1QyX0FMVF9SRkRBVEEJMHgwMDAwNDAwMAkvKiBBbHRlcm5hdGUgUkZEQVRBICg1LTJHSHogc3dpdGNoID8pICovCisjZGVmaW5lIEFSNUtfUEhZX1RTVDJfTUlOSV9PQlNfRU4JMHgwMDAwODAwMAkvKiBFbmFibGUgbWluaSBPQlMgKD8pICovCisjZGVmaW5lIEFSNUtfUEhZX1RTVDJfUlgyX0lTX1JYNV9JTlYJMHgwMDAxMDAwMAkvKiAyR0h6IHJ4IHBhdGggaXMgdGhlIDVHSHogcGF0aCBpbnZlcnRlZCAoPykgKi8KKyNkZWZpbmUgQVI1S19QSFlfVFNUMl9TTE9XX0NMSzE2MAkweDAwMDIwMDAwCS8qIFNsb3cgQ0xLMTYwICg/KSAqLworI2RlZmluZSBBUjVLX1BIWV9UU1QyX0FHQ19PQlNfU0VMXzMJMHgwMDA0MDAwMAkvKiBBR0MgT0JTIFNlbGVjdCAzICg/KSAqLworI2RlZmluZSBBUjVLX1BIWV9UU1QyX0JCQl9PQlNfU0VMCTB4MDAwODAwMDAJLyogQkIgT0JTIFNlbGVjdCAoZmllbGQgPykgKi8KKyNkZWZpbmUgQVI1S19QSFlfVFNUMl9BRENfT0JTX1NFTAkweDAwODAwMDAwCS8qIEFEQyBPQlMgU2VsZWN0IChmaWVsZCA/KSAqLworI2RlZmluZSBBUjVLX1BIWV9UU1QyX1JYX0NMUl9TRUwJMHgwODAwMDAwMAkvKiBSWCBDbGVhciBTZWxlY3QgKD8pICovCisjZGVmaW5lIEFSNUtfUEhZX1RTVDJfRk9SQ0VfQUdDX0NMUgkweDEwMDAwMDAwCS8qIEZvcmNlIEFHQyBjbGVhciAoPykgKi8KKyNkZWZpbmUgQVI1S19QSFlfU0hJRlRfMkdIWgkJMHgwMDAwNDAwNwkvKiBVc2VkIHRvIGFjY2VzcyAyR0h6IHJhZGlvcyAqLworI2RlZmluZSBBUjVLX1BIWV9TSElGVF81R0haCQkweDAwMDAwMDA3CS8qIFVzZWQgdG8gYWNjZXNzIDVHSHogcmFkaW9zIChkZWZhdWx0KSAqLworCisvKgorICogUEhZIGZyYW1lIGNvbnRyb2wgcmVnaXN0ZXIgWzUxMTBdIC90dXJibyBtb2RlIHJlZ2lzdGVyIFs1MTExK10KKyAqCisgKiBUaGVyZSBpcyBhbm90aGVyIGZyYW1lIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIFs1MTExK10KKyAqIGF0IGFkZHJlc3MgMHg5OTQ0IChzZWUgYmVsb3cpIGJ1dCB0aGUgMiBmaXJzdCBmbGFncworICogYXJlIGNvbW1vbiBoZXJlIGJldHdlZW4gNTExMCBmcmFtZSBjb250cm9sIHJlZ2lzdGVyCisgKiBhbmQgWzUxMTErXSB0dXJibyBtb2RlIHJlZ2lzdGVyLCBzbyB0aGlzIGFsc28gd29ya3MgYXMKKyAqIGEgInR1cmJvIG1vZGUgcmVnaXN0ZXIiIGZvciA1MTEwLiBXZSB0cmVhdCB0aGlzIG9uZSBhcworICogYSBmcmFtZSBjb250cm9sIHJlZ2lzdGVyIGZvciA1MTEwIGJlbG93LgorICovCisjZGVmaW5lCUFSNUtfUEhZX1RVUkJPCQkJMHg5ODA0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX1BIWV9UVVJCT19NT0RFCQkweDAwMDAwMDAxCS8qIEVuYWJsZSB0dXJibyBtb2RlICovCisjZGVmaW5lCUFSNUtfUEhZX1RVUkJPX1NIT1JUCQkweDAwMDAwMDAyCS8qIFNldCBzaG9ydCBzeW1ib2xzIHRvIHR1cmJvIG1vZGUgKi8KKyNkZWZpbmUJQVI1S19QSFlfVFVSQk9fTUlNTwkJMHgwMDAwMDAwNAkvKiBTZXQgdHVyYm8gZm9yIG1pbW8gbWltbyAqLworCisvKgorICogUEhZIGFnaWxpdHkgY29tbWFuZCByZWdpc3RlcgorICogKGFrYSBUU1RfMSkKKyAqLworI2RlZmluZQlBUjVLX1BIWV9BR0MJCQkweDk4MDgJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUEhZX1RTVDEJCQkweDk4MDgKKyNkZWZpbmUJQVI1S19QSFlfQUdDX0RJU0FCTEUJCTB4MDgwMDAwMDAJLyogRGlzYWJsZSBBR0MgdG8gQTIgKD8pKi8KKyNkZWZpbmUJQVI1S19QSFlfVFNUMV9UWEhPTEQJCTB4MDAwMDM4MDAJLyogU2V0IHR4IGhvbGQgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX1RTVDFfVFhTUkNfU1JDCQkweDAwMDAwMDAyCS8qIFVzZWQgd2l0aCBiaXQgNyAoPykgKi8KKyNkZWZpbmUJQVI1S19QSFlfVFNUMV9UWFNSQ19TUkNfUwkxCisjZGVmaW5lCUFSNUtfUEhZX1RTVDFfVFhTUkNfQUxUCQkweDAwMDAwMDgwCS8qIFNldCBpbnB1dCB0byB0c2RhYyAoPykgKi8KKyNkZWZpbmUJQVI1S19QSFlfVFNUMV9UWFNSQ19BTFRfUwk3CisKKworLyoKKyAqIFBIWSB0aW1pbmcgcmVnaXN0ZXIgMyBbNTExMitdCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfVElNSU5HXzMJCTB4OTgxNAorI2RlZmluZQlBUjVLX1BIWV9USU1JTkdfM19EU0NfTUFOCTB4ZmZmZTAwMDAKKyNkZWZpbmUJQVI1S19QSFlfVElNSU5HXzNfRFNDX01BTl9TCTE3CisjZGVmaW5lCUFSNUtfUEhZX1RJTUlOR18zX0RTQ19FWFAJMHgwMDAxZTAwMAorI2RlZmluZQlBUjVLX1BIWV9USU1JTkdfM19EU0NfRVhQX1MJMTMKKworLyoKKyAqIFBIWSBjaGlwIHJldmlzaW9uIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfQ0hJUF9JRAkJMHg5ODE4CisKKy8qCisgKiBQSFkgYWN0aXZhdGlvbiByZWdpc3RlcgorICovCisjZGVmaW5lCUFSNUtfUEhZX0FDVAkJCTB4OTgxYwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19QSFlfQUNUX0VOQUJMRQkJMHgwMDAwMDAwMQkvKiBBY3RpdmF0ZSBQSFkgKi8KKyNkZWZpbmUJQVI1S19QSFlfQUNUX0RJU0FCTEUJCTB4MDAwMDAwMDIJLyogRGVhY3RpdmF0ZSBQSFkgKi8KKworLyoKKyAqIFBIWSBSRiBjb250cm9sIHJlZ2lzdGVycworICovCisjZGVmaW5lIEFSNUtfUEhZX1JGX0NUTDIJCTB4OTgyNAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19QSFlfUkZfQ1RMMl9UWEYyVFhEX1NUQVJUCTB4MDAwMDAwMGYJLyogVFggZnJhbWUgdG8gVFggZGF0YSBzdGFydCAqLworI2RlZmluZQlBUjVLX1BIWV9SRl9DVEwyX1RYRjJUWERfU1RBUlRfUwkwCisKKyNkZWZpbmUgQVI1S19QSFlfUkZfQ1RMMwkJMHg5ODI4CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSBBUjVLX1BIWV9SRl9DVEwzX1RYRTJYTE5BX09OCTB4MDAwMGZmMDAJLyogVFggZW5kIHRvIFhMTkEgb24gKi8KKyNkZWZpbmUJQVI1S19QSFlfUkZfQ1RMM19UWEUyWExOQV9PTl9TCTgKKworI2RlZmluZQlBUjVLX1BIWV9BRENfQ1RMCQkJMHg5ODJjCisjZGVmaW5lCUFSNUtfUEhZX0FEQ19DVExfSU5CVUZHQUlOX09GRgkJMHgwMDAwMDAwMworI2RlZmluZQlBUjVLX1BIWV9BRENfQ1RMX0lOQlVGR0FJTl9PRkZfUwkwCisjZGVmaW5lCUFSNUtfUEhZX0FEQ19DVExfUFdEX0RBQ19PRkYJCTB4MDAwMDIwMDAKKyNkZWZpbmUJQVI1S19QSFlfQURDX0NUTF9QV0RfQkFORF9HQVBfT0ZGCTB4MDAwMDQwMDAKKyNkZWZpbmUJQVI1S19QSFlfQURDX0NUTF9QV0RfQURDX09GRgkJMHgwMDAwODAwMAorI2RlZmluZQlBUjVLX1BIWV9BRENfQ1RMX0lOQlVGR0FJTl9PTgkJMHgwMDAzMDAwMAorI2RlZmluZQlBUjVLX1BIWV9BRENfQ1RMX0lOQlVGR0FJTl9PTl9TCQkxNgorCisjZGVmaW5lIEFSNUtfUEhZX1JGX0NUTDQJCTB4OTgzNAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19QSFlfUkZfQ1RMNF9UWEYyWFBBX0FfT04JMHgwMDAwMDAwMQkvKiBUWCBmcmFtZSB0byBYUEEgQSBvbiAoZmllbGQpICovCisjZGVmaW5lIEFSNUtfUEhZX1JGX0NUTDRfVFhGMlhQQV9CX09OCTB4MDAwMDAxMDAJLyogVFggZnJhbWUgdG8gWFBBIEIgb24gKGZpZWxkKSAqLworI2RlZmluZQlBUjVLX1BIWV9SRl9DVEw0X1RYRTJYUEFfQV9PRkYJMHgwMDAxMDAwMAkvKiBUWCBlbmQgdG8gWFBBIEEgb2ZmIChmaWVsZCkgKi8KKyNkZWZpbmUgQVI1S19QSFlfUkZfQ1RMNF9UWEUyWFBBX0JfT0ZGCTB4MDEwMDAwMDAJLyogVFggZW5kIHRvIFhQQSBCIG9mZiAoZmllbGQpICovCisKKy8qCisgKiBQcmUtQW1wbGlmaWVyIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIChYUEEgLT4gZXh0ZXJuYWwgcHJlLWFtcGxpZmllcikKKyAqLworI2RlZmluZQlBUjVLX1BIWV9QQV9DVEwJCQkweDk4MzgJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUEhZX1BBX0NUTF9YUEFfQV9ISQkweDAwMDAwMDAxCS8qIFhQQSBBIGhpZ2ggKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX1BBX0NUTF9YUEFfQl9ISQkweDAwMDAwMDAyCS8qIFhQQSBCIGhpZ2ggKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX1BBX0NUTF9YUEFfQV9FTgkweDAwMDAwMDA0CS8qIEVuYWJsZSBYUEEgQSAqLworI2RlZmluZQlBUjVLX1BIWV9QQV9DVExfWFBBX0JfRU4JMHgwMDAwMDAwOAkvKiBFbmFibGUgWFBBIEIgKi8KKworLyoKKyAqIFBIWSBzZXR0bGluZyByZWdpc3RlcgorICovCisjZGVmaW5lIEFSNUtfUEhZX1NFVFRMSU5HCQkweDk4NDQJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUEhZX1NFVFRMSU5HX0FHQwkJMHgwMDAwMDA3ZgkvKiBBR0Mgc2V0dGxpbmcgdGltZSAqLworI2RlZmluZQlBUjVLX1BIWV9TRVRUTElOR19BR0NfUwkJMAorI2RlZmluZQlBUjVLX1BIWV9TRVRUTElOR19TV0lUQ0gJMHgwMDAwM2Y4MAkvKiBTd2l0Y2ggc2V0dGxpZyB0aW1lICovCisjZGVmaW5lCUFSNUtfUEhZX1NFVFRMSU5HX1NXSVRDSF9TCTcKKworLyoKKyAqIFBIWSBHYWluIHJlZ2lzdGVycworICovCisjZGVmaW5lIEFSNUtfUEhZX0dBSU4JCQkweDk4NDgJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUEhZX0dBSU5fVFhSWF9BVFRFTgkweDAwMDNmMDAwCS8qIFRYLVJYIEF0dGVudWF0aW9uICovCisjZGVmaW5lCUFSNUtfUEhZX0dBSU5fVFhSWF9BVFRFTl9TCTEyCisjZGVmaW5lCUFSNUtfUEhZX0dBSU5fVFhSWF9SRl9NQVgJMHgwMDdjMDAwMAorI2RlZmluZQlBUjVLX1BIWV9HQUlOX1RYUlhfUkZfTUFYX1MJMTgKKworI2RlZmluZQlBUjVLX1BIWV9HQUlOX09GRlNFVAkJMHg5ODRjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX1BIWV9HQUlOX09GRlNFVF9SWFRYX0ZMQUcJMHgwMDAyMDAwMAkvKiBSWC1UWCBmbGFnICg/KSAqLworCisvKgorICogRGVzaXJlZCBBREMvUEdBIHNpemUgcmVnaXN0ZXIKKyAqIChmb3IgbW9yZSBpbmZvcyByZWFkIEFOSSBwYXRlbnQpCisgKi8KKyNkZWZpbmUgQVI1S19QSFlfREVTSVJFRF9TSVpFCQkweDk4NTAJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUEhZX0RFU0lSRURfU0laRV9BREMJMHgwMDAwMDBmZgkvKiBBREMgZGVzaXJlZCBzaXplICovCisjZGVmaW5lCUFSNUtfUEhZX0RFU0lSRURfU0laRV9BRENfUwkwCisjZGVmaW5lCUFSNUtfUEhZX0RFU0lSRURfU0laRV9QR0EJMHgwMDAwZmYwMAkvKiBQR0EgZGVzaXJlZCBzaXplICovCisjZGVmaW5lCUFSNUtfUEhZX0RFU0lSRURfU0laRV9QR0FfUwk4CisjZGVmaW5lCUFSNUtfUEhZX0RFU0lSRURfU0laRV9UT1QJMHgwZmYwMDAwMAkvKiBUb3RhbCBkZXNpcmVkIHNpemUgKi8KKyNkZWZpbmUJQVI1S19QSFlfREVTSVJFRF9TSVpFX1RPVF9TCTIwCisKKy8qCisgKiBQSFkgc2lnbmFsIHJlZ2lzdGVyCisgKiAoZm9yIG1vcmUgaW5mb3MgcmVhZCBBTkkgcGF0ZW50KQorICovCisjZGVmaW5lCUFSNUtfUEhZX1NJRwkJCTB4OTg1OAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19QSFlfU0lHX0ZJUlNURVAJCTB4MDAwM2YwMDAJLyogRklSU1RFUCAqLworI2RlZmluZQlBUjVLX1BIWV9TSUdfRklSU1RFUF9TCQkxMgorI2RlZmluZQlBUjVLX1BIWV9TSUdfRklSUFdSCQkweDAzZmMwMDAwCS8qIEZJUFdSICovCisjZGVmaW5lCUFSNUtfUEhZX1NJR19GSVJQV1JfUwkJMTgKKworLyoKKyAqIFBIWSBjb2Fyc2UgYWdpbGl0eSBjb250cm9sIHJlZ2lzdGVyCisgKiAoZm9yIG1vcmUgaW5mb3MgcmVhZCBBTkkgcGF0ZW50KQorICovCisjZGVmaW5lCUFSNUtfUEhZX0FHQ0NPQVJTRQkJMHg5ODVjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX1BIWV9BR0NDT0FSU0VfTE8JCTB4MDAwMDdmODAJLyogQUdDIENvYXJzZSBsb3cgKi8KKyNkZWZpbmUJQVI1S19QSFlfQUdDQ09BUlNFX0xPX1MJCTcKKyNkZWZpbmUJQVI1S19QSFlfQUdDQ09BUlNFX0hJCQkweDAwM2Y4MDAwCS8qIEFHQyBDb2Fyc2UgaGlnaCAqLworI2RlZmluZQlBUjVLX1BIWV9BR0NDT0FSU0VfSElfUwkJMTUKKworLyoKKyAqIFBIWSBhZ2lsaXR5IGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworI2RlZmluZQlBUjVLX1BIWV9BR0NDVEwJCQkweDk4NjAJCQkvKiBSZWdpc3RlciBhZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUEhZX0FHQ0NUTF9DQUwJCTB4MDAwMDAwMDEJLyogRW5hYmxlIFBIWSBjYWxpYnJhdGlvbiAqLworI2RlZmluZQlBUjVLX1BIWV9BR0NDVExfTkYJCTB4MDAwMDAwMDIJLyogRW5hYmxlIE5vaXNlIEZsb29yIGNhbGlicmF0aW9uICovCisjZGVmaW5lCUFSNUtfUEhZX0FHQ0NUTF9ORl9FTgkJMHgwMDAwODAwMAkvKiBFbmFibGUgbmYgY2FsaWJyYXRpb24gdG8gaGFwcGVuICg/KSAqLworI2RlZmluZQlBUjVLX1BIWV9BR0NDVExfTkZfTk9VUERBVEUJMHgwMDAyMDAwMAkvKiBEb24ndCB1cGRhdGUgbmYgYXV0b21hdGljYWx5ICovCisKKy8qCisgKiBQSFkgbm9pc2UgZmxvb3Igc3RhdHVzIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19QSFlfTkYJCQkweDk4NjQJCQkvKiBSZWdpc3RlciBhZGRyZXNzICovCisjZGVmaW5lIEFSNUtfUEhZX05GX00JCQkweDAwMDAwMWZmCS8qIE5vaXNlIGZsb29yIG1hc2sgKi8KKyNkZWZpbmUgQVI1S19QSFlfTkZfQUNUSVZFCQkweDAwMDAwMTAwCS8qIE5vaXNlIGZsb29yIGNhbGlicmF0aW9uIHN0aWxsIGFjdGl2ZSAqLworI2RlZmluZSBBUjVLX1BIWV9ORl9SVkFMKF9uKQkJKCgoX24pID4+IDE5KSAmIEFSNUtfUEhZX05GX00pCisjZGVmaW5lIEFSNUtfUEhZX05GX0FWQUwoX24pCQkoLSgoX24pIF4gQVI1S19QSFlfTkZfTSkgKyAxKQorI2RlZmluZSBBUjVLX1BIWV9ORl9TVkFMKF9uKQkJKCgoX24pICYgQVI1S19QSFlfTkZfTSkgfCAoMSA8PCA5KSkKKyNkZWZpbmUJQVI1S19QSFlfTkZfVEhSRVNINjIJCTB4MDAwN2YwMDAJLyogVGhyZXNoNjIgLWNoZWNrIEFOSSBwYXRlbnQtIChmaWVsZCkgKi8KKyNkZWZpbmUJQVI1S19QSFlfTkZfVEhSRVNINjJfUwkJMTIKKyNkZWZpbmUJQVI1S19QSFlfTkZfTUlOQ0NBX1BXUgkJMHgwZmY4MDAwMAkvKiA/Pz8gKi8KKyNkZWZpbmUJQVI1S19QSFlfTkZfTUlOQ0NBX1BXUl9TCTE5CisKKy8qCisgKiBQSFkgQURDIHNhdHVyYXRpb24gcmVnaXN0ZXIgWzUxMTBdCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfQURDU0FUCQkJMHg5ODY4CisjZGVmaW5lCUFSNUtfUEhZX0FEQ1NBVF9JQ05UCQkweDAwMDFmODAwCisjZGVmaW5lCUFSNUtfUEhZX0FEQ1NBVF9JQ05UX1MJCTExCisjZGVmaW5lCUFSNUtfUEhZX0FEQ1NBVF9USFIJCTB4MDAwMDA3ZTAKKyNkZWZpbmUJQVI1S19QSFlfQURDU0FUX1RIUl9TCQk1CisKKy8qCisgKiBQSFkgV2VhayBvZmRtIHNpZ25hbCBkZXRlY3Rpb24gdGhyZXNob2xkIHJlZ2lzdGVycyAoQU5JKSBbNTIxMitdCisgKi8KKworLyogSGlnaCB0aHJlc2hvbGRzICovCisjZGVmaW5lIEFSNUtfUEhZX1dFQUtfT0ZETV9ISUdIX1RIUgkJMHg5ODY4CisjZGVmaW5lIEFSNUtfUEhZX1dFQUtfT0ZETV9ISUdIX1RIUl9NMl9DT1VOVAkweDAwMDAwMDFmCisjZGVmaW5lIEFSNUtfUEhZX1dFQUtfT0ZETV9ISUdIX1RIUl9NMl9DT1VOVF9TCTAKKyNkZWZpbmUgQVI1S19QSFlfV0VBS19PRkRNX0hJR0hfVEhSX00xCQkweDAwZmUwMDAwCisjZGVmaW5lIEFSNUtfUEhZX1dFQUtfT0ZETV9ISUdIX1RIUl9NMV9TCTE3CisjZGVmaW5lIEFSNUtfUEhZX1dFQUtfT0ZETV9ISUdIX1RIUl9NMgkJMHg3ZjAwMDAwMAorI2RlZmluZSBBUjVLX1BIWV9XRUFLX09GRE1fSElHSF9USFJfTTJfUwkyNAorCisvKiBMb3cgdGhyZXNob2xkcyAqLworI2RlZmluZSBBUjVLX1BIWV9XRUFLX09GRE1fTE9XX1RIUiAJCTB4OTg2YworI2RlZmluZSBBUjVLX1BIWV9XRUFLX09GRE1fTE9XX1RIUl9TRUxGQ09SX0VOCTB4MDAwMDAwMDEKKyNkZWZpbmUgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFJfTTJfQ09VTlQJMHgwMDAwM2YwMAorI2RlZmluZSBBUjVLX1BIWV9XRUFLX09GRE1fTE9XX1RIUl9NMl9DT1VOVF9TCTgKKyNkZWZpbmUgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFJfTTEJCTB4MDAxZmMwMDAKKyNkZWZpbmUgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFJfTTFfUwkJMTQKKyNkZWZpbmUgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFJfTTIJCTB4MGZlMDAwMDAKKyNkZWZpbmUgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFJfTTJfUwkJMjEKKworCisvKgorICogUEhZIHNsZWVwIHJlZ2lzdGVycyBbNTExMitdCisgKi8KKyNkZWZpbmUgQVI1S19QSFlfU0NSCQkJMHg5ODcwCisKKyNkZWZpbmUgQVI1S19QSFlfU0xNVAkJCTB4OTg3NAorI2RlZmluZSBBUjVLX1BIWV9TTE1UXzMyTUhaCQkweDAwMDAwMDdmCisKKyNkZWZpbmUgQVI1S19QSFlfU0NBTAkJCTB4OTg3OAorI2RlZmluZSBBUjVLX1BIWV9TQ0FMXzMyTUhaCQkweDAwMDAwMDBlCisjZGVmaW5lCUFSNUtfUEhZX1NDQUxfMzJNSFpfMjQxNwkweDAwMDAwMDBhCisjZGVmaW5lCUFSNUtfUEhZX1NDQUxfMzJNSFpfSEI2MwkweDAwMDAwMDMyCisKKy8qCisgKiBQSFkgUExMIChQaGFzZSBMb2NrZWQgTG9vcCkgY29udHJvbCByZWdpc3RlcgorICovCisjZGVmaW5lCUFSNUtfUEhZX1BMTAkJCTB4OTg3YworI2RlZmluZQlBUjVLX1BIWV9QTExfMjBNSFoJCTB4MDAwMDAwMTMJLyogRm9yIGhhbGYgcmF0ZSAoPykgKi8KKy8qIDQwTUh6IC0+IDVHSHogYmFuZCAqLworI2RlZmluZQlBUjVLX1BIWV9QTExfNDBNSFpfNTIxMQkJMHgwMDAwMDAxOAorI2RlZmluZQlBUjVLX1BIWV9QTExfNDBNSFpfNTIxMgkJMHgwMDAwMDBhYQorI2RlZmluZQlBUjVLX1BIWV9QTExfNDBNSFpfNTQxMwkJMHgwMDAwMDAwNAorI2RlZmluZQlBUjVLX1BIWV9QTExfNDBNSFoJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMSA/IFwKKwkJCQkJQVI1S19QSFlfUExMXzQwTUhaXzUyMTEgOiBBUjVLX1BIWV9QTExfNDBNSFpfNTIxMikKKy8qIDQ0TUh6IC0+IDIuNEdIeiBiYW5kICovCisjZGVmaW5lCUFSNUtfUEhZX1BMTF80NE1IWl81MjExCQkweDAwMDAwMDE5CisjZGVmaW5lCUFSNUtfUEhZX1BMTF80NE1IWl81MjEyCQkweDAwMDAwMGFiCisjZGVmaW5lCUFSNUtfUEhZX1BMTF80NE1IWgkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjExID8gXAorCQkJCQlBUjVLX1BIWV9QTExfNDRNSFpfNTIxMSA6IEFSNUtfUEhZX1BMTF80NE1IWl81MjEyKQorCisjZGVmaW5lIEFSNUtfUEhZX1BMTF9SRjUxMTEJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQVI1S19QSFlfUExMX1JGNTExMgkJMHgwMDAwMDA0MAorI2RlZmluZQlBUjVLX1BIWV9QTExfSEFMRl9SQVRFCQkweDAwMDAwMTAwCisjZGVmaW5lCUFSNUtfUEhZX1BMTF9RVUFSVEVSX1JBVEUJMHgwMDAwMDIwMAorCisvKgorICogUkYgQnVmZmVyIHJlZ2lzdGVyCisgKgorICogSXQncyBvYnZpb3VzIGZyb20gdGhlIGNvZGUgdGhhdCAweDk4OWMgaXMgdGhlIGJ1ZmZlciByZWdpc3RlciBidXQKKyAqIGZvciB0aGUgb3RoZXIgc3BlY2lhbCByZWdpc3RlcnMgdGhhdCB3ZSB3cml0ZSB0byBhZnRlciBzZW5kaW5nIGVhY2gKKyAqIHBhY2tldCwgaSBoYXZlIG5vIGlkZWEuIFNvIGknbGwgbmFtZSB0aGVtIEJVRkZFUl9DT05UUk9MX1ggcmVnaXN0ZXJzCisgKiBmb3Igbm93LiBJdCdzIGludGVyZXN0aW5nIHRoYXQgdGhleSBhcmUgYWxzbyB1c2VkIGZvciBzb21lIG90aGVyIG9wZXJhdGlvbnMuCisgKi8KKworI2RlZmluZSBBUjVLX1JGX0JVRkZFUgkJCTB4OTg5YworI2RlZmluZSBBUjVLX1JGX0JVRkZFUl9DT05UUk9MXzAJMHg5OGMwCS8qIENoYW5uZWwgb24gNTExMCAqLworI2RlZmluZSBBUjVLX1JGX0JVRkZFUl9DT05UUk9MXzEJMHg5OGM0CS8qIEJhbmsgNyBvbiA1MTEyICovCisjZGVmaW5lIEFSNUtfUkZfQlVGRkVSX0NPTlRST0xfMgkweDk4Y2MJLyogQmFuayA3IG9uIDUxMTEgKi8KKworI2RlZmluZSBBUjVLX1JGX0JVRkZFUl9DT05UUk9MXzMJMHg5OGQwCS8qIEJhbmsgMiBvbiA1MTEyICovCisJCQkJCQkvKiBDaGFubmVsIHNldCBvbiA1MTExICovCisJCQkJCQkvKiBVc2VkIHRvIHJlYWQgcmFkaW8gcmV2aXNpb24qLworCisjZGVmaW5lIEFSNUtfUkZfQlVGRkVSX0NPTlRST0xfNAkweDk4ZDQgIC8qIFJGIFN0YWdlIHJlZ2lzdGVyIG9uIDUxMTAgKi8KKwkJCQkJCS8qIEJhbmsgMCwxLDIsNiBvbiA1MTExICovCisJCQkJCQkvKiBCYW5rIDEgb24gNTExMiAqLworCQkJCQkJLyogVXNlZCBkdXJpbmcgYWN0aXZhdGlvbiBvbiA1MTExICovCisKKyNkZWZpbmUgQVI1S19SRl9CVUZGRVJfQ09OVFJPTF81CTB4OThkOAkvKiBCYW5rIDMgb24gNTExMSAqLworCQkJCQkJLyogVXNlZCBkdXJpbmcgYWN0aXZhdGlvbiBvbiA1MTExICovCisJCQkJCQkvKiBDaGFubmVsIG9uIDUxMTIgKi8KKwkJCQkJCS8qIEJhbmsgNiBvbiA1MTEyICovCisKKyNkZWZpbmUgQVI1S19SRl9CVUZGRVJfQ09OVFJPTF82CTB4OThkYwkvKiBCYW5rIDMgb24gNTExMiAqLworCisvKgorICogUEhZIFJGIHN0YWdlIHJlZ2lzdGVyIFs1MjEwXQorICovCisjZGVmaW5lIEFSNUtfUEhZX1JGU1RHCQkJMHg5OGQ0CisjZGVmaW5lIEFSNUtfUEhZX1JGU1RHX0RJU0FCTEUJCTB4MDAwMDAwMjEKKworLyoKKyAqIEJJTiBtYXNrcyAoPykKKyAqLworI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS18xCTB4OTkwMAorI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS18yCTB4OTkwNAorI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS18zCTB4OTkwOAorCisjZGVmaW5lCUFSNUtfUEhZX0JJTl9NQVNLX0NUTAkJMHg5OTBjCisjZGVmaW5lCUFSNUtfUEhZX0JJTl9NQVNLX0NUTF9NQVNLXzQJMHgwMDAwM2ZmZgorI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS19DVExfTUFTS180X1MJMAorI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS19DVExfUkFURQkweGZmMDAwMDAwCisjZGVmaW5lCUFSNUtfUEhZX0JJTl9NQVNLX0NUTF9SQVRFX1MJMjQKKworLyoKKyAqIFBIWSBBbnRlbm5hIGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBUjVLX1BIWV9BTlRfQ1RMCQkweDk5MTAJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUEhZX0FOVF9DVExfVFhSWF9FTgkweDAwMDAwMDAxCS8qIEVuYWJsZSBUWC9SWCAoPykgKi8KKyNkZWZpbmUJQVI1S19QSFlfQU5UX0NUTF9TRUNUT1JFRF9BTlQJMHgwMDAwMDAwNAkvKiBTZWN0b3JlZCBBbnRlbm5hICovCisjZGVmaW5lCUFSNUtfUEhZX0FOVF9DVExfSElUVU5FNQkweDAwMDAwMDA4CS8qIEhpdHVuZTUgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX0FOVF9DVExfU1dUQUJMRV9JRExFCTB4MDAwMDAzZjAJLyogU3dpdGNoIHRhYmxlIGlkbGUgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX0FOVF9DVExfU1dUQUJMRV9JRExFX1MJNAorCisvKgorICogUEhZIHJlY2VpdmVyIGRlbGF5IHJlZ2lzdGVyIFs1MTExK10KKyAqLworI2RlZmluZQlBUjVLX1BIWV9SWF9ERUxBWQkJMHg5OTE0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX1BIWV9SWF9ERUxBWV9NCQkweDAwMDAzZmZmCS8qIE1hc2sgZm9yIFJYIGFjdGl2YXRlIHRvIHJlY2VpdmUgZGVsYXkgKC8xMDBucykgKi8KKworLyoKKyAqIFBIWSBtYXggcnggbGVuZ3RoIHJlZ2lzdGVyICg/KSBbNTExMV0KKyAqLworI2RlZmluZQlBUjVLX1BIWV9NQVhfUlhfTEVOCQkweDk5MWMKKworLyoKKyAqIFBIWSB0aW1pbmcgcmVnaXN0ZXIgNAorICogSShucGhhc2UpL1EoYWRyYXR1cmUpIGNhbGlicmF0aW9uIHJlZ2lzdGVyIFs1MTExK10KKyAqLworI2RlZmluZQlBUjVLX1BIWV9JUQkJCTB4OTkyMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUJQVI1S19QSFlfSVFfQ09SUl9RX1FfQ09GRgkweDAwMDAwMDFmCS8qIE1hc2sgZm9yIHEgY29ycmVjdGlvbiBpbmZvICovCisjZGVmaW5lCUFSNUtfUEhZX0lRX0NPUlJfUV9JX0NPRkYJMHgwMDAwMDdlMAkvKiBNYXNrIGZvciBpIGNvcnJlY3Rpb24gaW5mbyAqLworI2RlZmluZQlBUjVLX1BIWV9JUV9DT1JSX1FfSV9DT0ZGX1MJNQorI2RlZmluZQlBUjVLX1BIWV9JUV9DT1JSX0VOQUJMRQkJMHgwMDAwMDgwMAkvKiBFbmFibGUgaS9xIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUJQVI1S19QSFlfSVFfQ0FMX05VTV9MT0dfTUFYCTB4MDAwMGYwMDAJLyogTWFzayBmb3IgbWF4IG51bWJlciBvZiBzYW1wbGVzIGluIGxvZyBzY2FsZSAqLworI2RlZmluZQlBUjVLX1BIWV9JUV9DQUxfTlVNX0xPR19NQVhfUwkxMgorI2RlZmluZQlBUjVLX1BIWV9JUV9SVU4JCQkweDAwMDEwMDAwCS8qIFJ1biBpL3EgY2FsaWJyYXRpb24gKi8KKyNkZWZpbmUJQVI1S19QSFlfSVFfVVNFX1BUX0RGCQkweDAwMDIwMDAwCS8qIFVzZSBwaWxvdCB0cmFjayBkZiAoPykgKi8KKyNkZWZpbmUJQVI1S19QSFlfSVFfRUFSTFlfVFJJR19USFIJMHgwMDIwMDAwMAkvKiBFYXJseSB0cmlnZ2VyIHRocmVzaG9sZCAoPykgKGZpZWxkKSAqLworI2RlZmluZQlBUjVLX1BIWV9JUV9QSUxPVF9NQVNLX0VOCTB4MTAwMDAwMDAJLyogRW5hYmxlIHBpbG90IG1hc2sgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX0lRX0NIQU5fTUFTS19FTgkweDIwMDAwMDAwCS8qIEVuYWJsZSBjaGFubmVsIG1hc2sgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX0lRX1NQVVJfRklMVF9FTgkweDQwMDAwMDAwCS8qIEVuYWJsZSBzcHVyIGZpbHRlciAqLworI2RlZmluZQlBUjVLX1BIWV9JUV9TUFVSX1JTU0lfRU4JMHg4MDAwMDAwMAkvKiBFbmFibGUgc3B1ciByc3NpICovCisKKy8qCisgKiBQSFkgdGltaW5nIHJlZ2lzdGVyIDUKKyAqIE9GRE0gU2VsZi1jb3JyZWxhdG9yIEN5Y2xpYyBSU1NJIHRocmVzaG9sZCBwYXJhbXMKKyAqIChDaGVjayBvdXQgYmJfY3ljcHdyX3RocjEgb24gQU5JIHBhdGVudCkKKyAqLworI2RlZmluZQlBUjVLX1BIWV9PRkRNX1NFTEZDT1JSCQkJMHg5OTI0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX1BIWV9PRkRNX1NFTEZDT1JSX0NZUFdSX1RIUjFfRU4JMHgwMDAwMDAwMQkvKiBFbmFibGUgY3ljbGljIFJTU0kgdGhyIDEgKi8KKyNkZWZpbmUJQVI1S19QSFlfT0ZETV9TRUxGQ09SUl9DWVBXUl9USFIxCTB4MDAwMDAwZmUJLyogTWFzayBmb3IgQ3ljbGljIFJTU0kgdGhyZXNob2xkIDEgKi8KKyNkZWZpbmUJQVI1S19QSFlfT0ZETV9TRUxGQ09SUl9DWVBXUl9USFIxX1MJMQorI2RlZmluZQlBUjVLX1BIWV9PRkRNX1NFTEZDT1JSX0NZUFdSX1RIUjMJMHgwMDAwMDEwMAkvKiBDeWNsaWMgUlNTSSB0aHJlc2hvbGQgMyAoZmllbGQpICg/KSAqLworI2RlZmluZQlBUjVLX1BIWV9PRkRNX1NFTEZDT1JSX1JTU0lfMUFUSFJfRU4JMHgwMDAwODAwMAkvKiBFbmFibGUgMUEgUlNTSSB0aHJlc2hvbGQgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX09GRE1fU0VMRkNPUlJfUlNTSV8xQVRIUgkweDAwMDEwMDAwCS8qIDFBIFJTU0kgdGhyZXNob2xkIChmaWVsZCkgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX09GRE1fU0VMRkNPUlJfTFNDVEhSX0hJUlNTSQkweDAwODAwMDAwCS8qIExvbmcgc2MgdGhyZXNob2xkIGhpIHJzc2kgKD8pICovCisKKy8qCisgKiBQSFktb25seSB3YXJtIHJlc2V0IHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfV0FSTV9SRVNFVAkJMHg5OTI4CisKKy8qCisgKiBQSFktb25seSBjb250cm9sIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVI1S19QSFlfQ1RMCQkJMHg5OTJjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX1BIWV9DVExfUlhfRFJBSU5fUkFURQkweDAwMDAwMDAxCS8qIFJYIGRyYWluIHJhdGUgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX0NUTF9MQVRFX1RYX1NJR19TWU0JMHgwMDAwMDAwMgkvKiBMYXRlIHR4IHNpZ25hbCBzeW1ib2wgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX0NUTF9HRU5fU0NSQU1CTEVSCTB4MDAwMDAwMDQJLyogR2VuZXJhdGUgc2NyYW1ibGVyICovCisjZGVmaW5lCUFSNUtfUEhZX0NUTF9UWF9BTlRfU0VMCQkweDAwMDAwMDA4CS8qIFRYIGFudGVubmEgc2VsZWN0ICovCisjZGVmaW5lCUFSNUtfUEhZX0NUTF9UWF9BTlRfU1RBVElDCTB4MDAwMDAwMTAJLyogU3RhdGljIFRYIGFudGVubmEgKi8KKyNkZWZpbmUJQVI1S19QSFlfQ1RMX1JYX0FOVF9TRUwJCTB4MDAwMDAwMjAJLyogUlggYW50ZW5uYSBzZWxlY3QgKi8KKyNkZWZpbmUJQVI1S19QSFlfQ1RMX1JYX0FOVF9TVEFUSUMJMHgwMDAwMDA0MAkvKiBTdGF0aWMgUlggYW50ZW5uYSAqLworI2RlZmluZQlBUjVLX1BIWV9DVExfTE9XX0ZSRVFfU0xFX0VOCTB4MDAwMDAwODAJLyogRW5hYmxlIGxvdyBmcmVxIHNsZWVwICovCisKKy8qCisgKiBQSFkgUEFQRCBwcm9iZSByZWdpc3RlciBbNTExMStdCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfUEFQRF9QUk9CRQkJMHg5OTMwCisjZGVmaW5lCUFSNUtfUEhZX1BBUERfUFJPQkVfU0hfSElfUEFSCTB4MDAwMDAwMDEKKyNkZWZpbmUJQVI1S19QSFlfUEFQRF9QUk9CRV9QQ0RBQ19CSUFTCTB4MDAwMDAwMDIKKyNkZWZpbmUJQVI1S19QSFlfUEFQRF9QUk9CRV9DT01QX0dBSU4JMHgwMDAwMDA0MAorI2RlZmluZQlBUjVLX1BIWV9QQVBEX1BST0JFX1RYUE9XRVIJMHgwMDAwN2UwMAorI2RlZmluZQlBUjVLX1BIWV9QQVBEX1BST0JFX1RYUE9XRVJfUwk5CisjZGVmaW5lCUFSNUtfUEhZX1BBUERfUFJPQkVfVFhfTkVYVAkweDAwMDA4MDAwCisjZGVmaW5lCUFSNUtfUEhZX1BBUERfUFJPQkVfUFJFRElTVF9FTgkweDAwMDEwMDAwCisjZGVmaW5lCUFSNUtfUEhZX1BBUERfUFJPQkVfVFlQRQkweDAxODAwMDAwCS8qIFs1MTEyK10gKi8KKyNkZWZpbmUJQVI1S19QSFlfUEFQRF9QUk9CRV9UWVBFX1MJMjMKKyNkZWZpbmUJQVI1S19QSFlfUEFQRF9QUk9CRV9UWVBFX09GRE0JMAorI2RlZmluZQlBUjVLX1BIWV9QQVBEX1BST0JFX1RZUEVfWFIJMQorI2RlZmluZQlBUjVLX1BIWV9QQVBEX1BST0JFX1RZUEVfQ0NLCTIKKyNkZWZpbmUJQVI1S19QSFlfUEFQRF9QUk9CRV9HQUlORgkweGZlMDAwMDAwCisjZGVmaW5lCUFSNUtfUEhZX1BBUERfUFJPQkVfR0FJTkZfUwkyNQorI2RlZmluZQlBUjVLX1BIWV9QQVBEX1BST0JFX0lOSV81MTExCTB4MDAwMDQ4ODMJLyogWzUyMTIrXSAqLworI2RlZmluZQlBUjVLX1BIWV9QQVBEX1BST0JFX0lOSV81MTEyCTB4MDAwMDQ4ODIJLyogWzUyMTIrXSAqLworCisvKgorICogUEhZIFRYIHJhdGUgcG93ZXIgcmVnaXN0ZXJzIFs1MTEyK10KKyAqLworI2RlZmluZQlBUjVLX1BIWV9UWFBPV0VSX1JBVEUxCQkJMHg5OTM0CisjZGVmaW5lCUFSNUtfUEhZX1RYUE9XRVJfUkFURTIJCQkweDk5MzgKKyNkZWZpbmUJQVI1S19QSFlfVFhQT1dFUl9SQVRFX01BWAkJMHg5OTNjCisjZGVmaW5lCUFSNUtfUEhZX1RYUE9XRVJfUkFURV9NQVhfVFBDX0VOQUJMRQkweDAwMDAwMDQwCisjZGVmaW5lCUFSNUtfUEhZX1RYUE9XRVJfUkFURTMJCQkweGEyMzQKKyNkZWZpbmUJQVI1S19QSFlfVFhQT1dFUl9SQVRFNAkJCTB4YTIzOAorCisvKgorICogUEhZIGZyYW1lIGNvbnRyb2wgcmVnaXN0ZXIgWzUxMTErXQorICovCisjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF81MjEwCQkweDk4MDQKKyNkZWZpbmUJQVI1S19QSFlfRlJBTUVfQ1RMXzUyMTEJCTB4OTk0NAorI2RlZmluZQlBUjVLX1BIWV9GUkFNRV9DVEwJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKKwkJCQkJQVI1S19QSFlfRlJBTUVfQ1RMXzUyMTAgOiBBUjVLX1BIWV9GUkFNRV9DVExfNTIxMSkKKy8qLS0tWzUxMTErXS0tLSovCisjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9UWF9DTElQCTB4MDAwMDAwMzgJLyogTWFzayBmb3IgdHggY2xpcCAoPykgKi8KKyNkZWZpbmUJQVI1S19QSFlfRlJBTUVfQ1RMX1RYX0NMSVBfUwkzCisjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9QUkVQX0NISU5GTwkweDAwMDEwMDAwCS8qIFByZXBlbmQgY2hhbiBpbmZvICovCisjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9FTVUJCTB4ODAwMDAwMDAKKyNkZWZpbmUJQVI1S19QSFlfRlJBTUVfQ1RMX0VNVV9TCTMxCisvKi0tLVs1MTEwLzUxMTFdLS0tKi8KKyNkZWZpbmUJQVI1S19QSFlfRlJBTUVfQ1RMX1RJTUlOR19FUlIJMHgwMTAwMDAwMAkvKiBQSFkgdGltaW5nIGVycm9yICovCisjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9QQVJJVFlfRVJSCTB4MDIwMDAwMDAJLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9JTExSQVRFX0VSUgkweDA0MDAwMDAwCS8qIElsbGVnYWwgcmF0ZSAqLworI2RlZmluZQlBUjVLX1BIWV9GUkFNRV9DVExfSUxMTEVOX0VSUgkweDA4MDAwMDAwCS8qIElsbGVnYWwgbGVuZ3RoICovCisjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9TRVJWSUNFX0VSUgkweDIwMDAwMDAwCisjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9UWFVSTl9FUlIJMHg0MDAwMDAwMAkvKiBUWCB1bmRlcnJ1biAqLworI2RlZmluZSBBUjVLX1BIWV9GUkFNRV9DVExfSU5JCQlBUjVLX1BIWV9GUkFNRV9DVExfU0VSVklDRV9FUlIgfCBcCisJCQlBUjVLX1BIWV9GUkFNRV9DVExfVFhVUk5fRVJSIHwgXAorCQkJQVI1S19QSFlfRlJBTUVfQ1RMX0lMTExFTl9FUlIgfCBcCisJCQlBUjVLX1BIWV9GUkFNRV9DVExfSUxMUkFURV9FUlIgfCBcCisJCQlBUjVLX1BIWV9GUkFNRV9DVExfUEFSSVRZX0VSUiB8IFwKKwkJCUFSNUtfUEhZX0ZSQU1FX0NUTF9USU1JTkdfRVJSCisKKy8qCisgKiBQSFkgVHggUG93ZXIgYWRqdXN0bWVudCByZWdpc3RlciBbNTIxMkErXQorICovCisjZGVmaW5lCUFSNUtfUEhZX1RYX1BXUl9BREoJCQkweDk5NGMKKyNkZWZpbmUJQVI1S19QSFlfVFhfUFdSX0FESl9DQ0tfR0FJTl9ERUxUQQkweDAwMDAwZmMwCisjZGVmaW5lCUFSNUtfUEhZX1RYX1BXUl9BREpfQ0NLX0dBSU5fREVMVEFfUwk2CisjZGVmaW5lCUFSNUtfUEhZX1RYX1BXUl9BREpfQ0NLX1BDREFDX0lOREVYCTB4MDBmYzAwMDAKKyNkZWZpbmUJQVI1S19QSFlfVFhfUFdSX0FESl9DQ0tfUENEQUNfSU5ERVhfUwkxOAorCisvKgorICogUEhZIHJhZGFyIGRldGVjdGlvbiByZWdpc3RlciBbNTExMStdCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfUkFEQVIJCQkweDk5NTQKKyNkZWZpbmUJQVI1S19QSFlfUkFEQVJfRU5BQkxFCQkweDAwMDAwMDAxCisjZGVmaW5lCUFSNUtfUEhZX1JBREFSX0RJU0FCTEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfSU5CQU5EVEhSICAgIAkweDAwMDAwMDNlCS8qIEluYmFuZCB0aHJlc2hvbGQKKwkJCQkJCQk1LWJpdHMsIHVuaXRzIHVua25vd24gezAuLjMxfQorCQkJCQkJCSg/IE1IeiA/KSAqLworI2RlZmluZSBBUjVLX1BIWV9SQURBUl9JTkJBTkRUSFJfUwkxCisKKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfUFJTU0lfVEhSICAgIAkweDAwMDAwZmMwCS8qIFB1bHNlIFJTU0kvU05SIHRocmVzaG9sZAorCQkJCQkJCTYtYml0cywgZEJtIHJhbmdlIHswLi42M30KKwkJCQkJCQlpbiBkQm0gdW5pdHMuICovCisjZGVmaW5lIEFSNUtfUEhZX1JBREFSX1BSU1NJX1RIUl9TCTYKKworI2RlZmluZSBBUjVLX1BIWV9SQURBUl9QSEVJR0hUX1RIUiAgIAkweDAwMDNmMDAwCS8qIFB1bHNlIGhlaWdodCB0aHJlc2hvbGQKKwkJCQkJCQk2LWJpdHMsIGRCbSByYW5nZSB7MC4uNjN9CisJCQkJCQkJaW4gZEJtIHVuaXRzLiAqLworI2RlZmluZSBBUjVLX1BIWV9SQURBUl9QSEVJR0hUX1RIUl9TCTEyCisKKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfUlNTSV9USFIgICAgCTB4MDBmYzAwMDAJLyogUmFkYXIgUlNTSS9TTlIgdGhyZXNob2xkLgorCQkJCQkJCTYtYml0cywgZEJtIHJhbmdlIHswLi42M30KKwkJCQkJCQlpbiBkQm0gdW5pdHMuICovCisjZGVmaW5lIEFSNUtfUEhZX1JBREFSX1JTU0lfVEhSX1MJMTgKKworI2RlZmluZSBBUjVLX1BIWV9SQURBUl9GSVJQV1JfVEhSCTB4N2YwMDAwMDAJLyogRmluaXRlIEltcHVsc2UgUmVzcG9uc2UKKwkJCQkJCQlmaWx0ZXIgcG93ZXIgb3V0IHRocmVzaG9sZC4KKwkJCQkJCQk3LWJpdHMsIHN0YW5kYXJkIHBvd2VyIHJhbmdlCisJCQkJCQkJezAuLjEyN30gaW4gMS8yIGRCbSB1bml0cy4gKi8KKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfRklSUFdSX1RIUlMJMjQKKworLyoKKyAqIFBIWSBhbnRlbm5hIHN3aXRjaCB0YWJsZSByZWdpc3RlcnMKKyAqLworI2RlZmluZSBBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzAJMHg5OTYwCisjZGVmaW5lIEFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEVfMQkweDk5NjQKKworLyoKKyAqIFBIWSBOb2lzZSBmbG9vciB0aHJlc2hvbGQKKyAqLworI2RlZmluZSBBUjVLX1BIWV9ORlRIUkVTCQkweDk5NjgKKworLyoKKyAqIFNpZ21hIERlbHRhIHJlZ2lzdGVyICg/KSBbNTIxM10KKyAqLworI2RlZmluZSBBUjVLX1BIWV9TSUdNQV9ERUxUQQkJMHg5OTZDCisjZGVmaW5lIEFSNUtfUEhZX1NJR01BX0RFTFRBX0FEQ19TRUwJMHgwMDAwMDAwMworI2RlZmluZSBBUjVLX1BIWV9TSUdNQV9ERUxUQV9BRENfU0VMX1MJMAorI2RlZmluZSBBUjVLX1BIWV9TSUdNQV9ERUxUQV9GSUxUMgkweDAwMDAwMGY4CisjZGVmaW5lIEFSNUtfUEhZX1NJR01BX0RFTFRBX0ZJTFQyX1MJMworI2RlZmluZSBBUjVLX1BIWV9TSUdNQV9ERUxUQV9GSUxUMQkweDAwMDAxZjAwCisjZGVmaW5lIEFSNUtfUEhZX1NJR01BX0RFTFRBX0ZJTFQxX1MJOAorI2RlZmluZSBBUjVLX1BIWV9TSUdNQV9ERUxUQV9BRENfQ0xJUAkweDAxZmZlMDAwCisjZGVmaW5lIEFSNUtfUEhZX1NJR01BX0RFTFRBX0FEQ19DTElQX1MJMTMKKworLyoKKyAqIFJGIHJlc3RhcnQgcmVnaXN0ZXIgWzUxMTIrXSAoPykKKyAqLworI2RlZmluZSBBUjVLX1BIWV9SRVNUQVJUCQkweDk5NzAJCS8qIHJlc3RhcnQgKi8KKyNkZWZpbmUgQVI1S19QSFlfUkVTVEFSVF9ESVZfR0MJCTB4MDAxYzAwMDAJLyogRmFzdCBkaXZlcnNpdHkgZ2NfbGltaXQgKD8pICovCisjZGVmaW5lIEFSNUtfUEhZX1JFU1RBUlRfRElWX0dDX1MJMTgKKworLyoKKyAqIFJGIEJ1cyBhY2Nlc3MgcmVxdWVzdCByZWdpc3RlciAoZm9yIHN5bnRoLW9seSBjaGFubmVsIHN3aXRjaGluZykKKyAqLworI2RlZmluZSBBUjVLX1BIWV9SRkJVU19SRVEJCTB4OTk3QworI2RlZmluZSBBUjVLX1BIWV9SRkJVU19SRVFfUkVRVUVTVAkweDAwMDAwMDAxCisKKy8qCisgKiBTcHVyIG1pdGlnYXRpb24gbWFza3MgKD8pCisgKi8KKyNkZWZpbmUgQVI1S19QSFlfVElNSU5HXzcJCTB4OTk4MAorI2RlZmluZSBBUjVLX1BIWV9USU1JTkdfOAkJMHg5OTg0CisjZGVmaW5lIEFSNUtfUEhZX1RJTUlOR184X1BJTE9UX01BU0tfMgkJMHgwMDBmZmZmZgorI2RlZmluZSBBUjVLX1BIWV9USU1JTkdfOF9QSUxPVF9NQVNLXzJfUwkwCisKKyNkZWZpbmUgQVI1S19QSFlfQklOX01BU0syXzEJCTB4OTk4OAorI2RlZmluZSBBUjVLX1BIWV9CSU5fTUFTSzJfMgkJMHg5OThjCisjZGVmaW5lIEFSNUtfUEhZX0JJTl9NQVNLMl8zCQkweDk5OTAKKworI2RlZmluZSBBUjVLX1BIWV9CSU5fTUFTSzJfNAkJMHg5OTk0CisjZGVmaW5lIEFSNUtfUEhZX0JJTl9NQVNLMl80X01BU0tfNAkweDAwMDAzZmZmCisjZGVmaW5lIEFSNUtfUEhZX0JJTl9NQVNLMl80X01BU0tfNF9TCTAKKworI2RlZmluZSBBUjVLX1BIWV9USU1JTkdfOQkJCTB4OTk5OAorI2RlZmluZSBBUjVLX1BIWV9USU1JTkdfMTAJCQkweDk5OWMKKyNkZWZpbmUgQVI1S19QSFlfVElNSU5HXzEwX1BJTE9UX01BU0tfMgkJMHgwMDBmZmZmZgorI2RlZmluZSBBUjVLX1BIWV9USU1JTkdfMTBfUElMT1RfTUFTS18yX1MJMAorCisvKgorICogU3B1ciBtaXRpZ2F0aW9uIGNvbnRyb2wKKyAqLworI2RlZmluZSBBUjVLX1BIWV9USU1JTkdfMTEJCQkweDk5YTAJCS8qIFJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgQVI1S19QSFlfVElNSU5HXzExX1NQVVJfREVMVEFfUEhBU0UJMHgwMDBmZmZmZgkvKiBTcHVyIGRlbHRhIHBoYXNlICovCisjZGVmaW5lIEFSNUtfUEhZX1RJTUlOR18xMV9TUFVSX0RFTFRBX1BIQVNFX1MJMAorI2RlZmluZSBBUjVLX1BIWV9USU1JTkdfMTFfU1BVUl9GUkVRX1NECQkweDNmZjAwMDAwCS8qIEZyZXEgc2lnbWEgZGVsdGEgKi8KKyNkZWZpbmUgQVI1S19QSFlfVElNSU5HXzExX1NQVVJfRlJFUV9TRF9TCTIwCisjZGVmaW5lIEFSNUtfUEhZX1RJTUlOR18xMV9VU0VfU1BVUl9JTl9BR0MJMHg0MDAwMDAwMAkvKiBTcHVyIGZpbHRlciBpbiBBR0MgZGV0ZWN0b3IgKi8KKyNkZWZpbmUgQVI1S19QSFlfVElNSU5HXzExX1VTRV9TUFVSX0lOX1NFTEZDT1IJMHg4MDAwMDAwMAkvKiBTcHVyIGZpbHRlciBpbiBPRkRNIHNlbGYgY29ycmVsYXRvciAqLworCisvKgorICogR2FpbiB0YWJsZXMKKyAqLworI2RlZmluZQlBUjVLX0JCX0dBSU5fQkFTRQkJMHg5YjAwCS8qIEJhc2VCYW5kIEFtcGxpZmllciBHYWluIHRhYmxlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBBUjVLX0JCX0dBSU4oX24pCQkoQVI1S19CQl9HQUlOX0JBU0UgKyAoKF9uKSA8PCAyKSkKKyNkZWZpbmUJQVI1S19SRl9HQUlOX0JBU0UJCTB4OWEwMAkvKiBSRiBBbXBscmlmaWVyIEdhaW4gdGFibGUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEFSNUtfUkZfR0FJTihfbikJCShBUjVLX1JGX0dBSU5fQkFTRSArICgoX24pIDw8IDIpKQorCisvKgorICogUEhZIHRpbWluZyBJUSBjYWxpYnJhdGlvbiByZXN1bHQgcmVnaXN0ZXIgWzUxMTErXQorICovCisjZGVmaW5lCUFSNUtfUEhZX0lRUkVTX0NBTF9QV1JfSQkweDljMTAJLyogSSAoSW5waGFzZSkgcG93ZXIgdmFsdWUgKi8KKyNkZWZpbmUJQVI1S19QSFlfSVFSRVNfQ0FMX1BXUl9RCTB4OWMxNAkvKiBRIChRdWFkcmF0dXJlKSBwb3dlciB2YWx1ZSAqLworI2RlZmluZQlBUjVLX1BIWV9JUVJFU19DQUxfQ09SUgkJMHg5YzE4CS8qIEkvUSBDb3JyZWxhdGlvbiAqLworCisvKgorICogUEhZIGN1cnJlbnQgUlNTSSByZWdpc3RlciBbNTExMStdCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfQ1VSUkVOVF9SU1NJCTB4OWMxYworCisvKgorICogUEhZIFJGIEJ1cyBncmFudCByZWdpc3RlcgorICovCisjZGVmaW5lCUFSNUtfUEhZX1JGQlVTX0dSQU5UCTB4OWMyMAorI2RlZmluZQlBUjVLX1BIWV9SRkJVU19HUkFOVF9PSwkweDAwMDAwMDAxCisKKy8qCisgKiBQSFkgQURDIHRlc3QgcmVnaXN0ZXIKKyAqLworI2RlZmluZQlBUjVLX1BIWV9BRENfVEVTVAkweDljMjQKKyNkZWZpbmUJQVI1S19QSFlfQURDX1RFU1RfSQkweDAwMDAwMDAxCisjZGVmaW5lCUFSNUtfUEhZX0FEQ19URVNUX1EJMHgwMDAwMDIwMAorCisvKgorICogUEhZIERBQyB0ZXN0IHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfREFDX1RFU1QJMHg5YzI4CisjZGVmaW5lCUFSNUtfUEhZX0RBQ19URVNUX0kJMHgwMDAwMDAwMQorI2RlZmluZQlBUjVLX1BIWV9EQUNfVEVTVF9RCTB4MDAwMDAyMDAKKworLyoKKyAqIFBIWSBQVEFUIHJlZ2lzdGVyICg/KQorICovCisjZGVmaW5lCUFSNUtfUEhZX1BUQVQJCTB4OWMyYworCisvKgorICogUEhZIElsbGVnYWwgVFggcmF0ZSByZWdpc3RlciBbNTExMitdCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfQkFEX1RYX1JBVEUJMHg5YzMwCisKKy8qCisgKiBQSFkgU1BVUiBQb3dlciByZWdpc3RlciBbNTExMitdCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfU1BVUl9QV1IJMHg5YzM0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX1BIWV9TUFVSX1BXUl9JCTB4MDAwMDAwMDEJLyogU1BVUiBQb3dlciBlc3RpbWF0ZSBmb3IgSSAoZmllbGQpICovCisjZGVmaW5lCUFSNUtfUEhZX1NQVVJfUFdSX1EJMHgwMDAwMDEwMAkvKiBTUFVSIFBvd2VyIGVzdGltYXRlIGZvciBRIChmaWVsZCkgKi8KKyNkZWZpbmUJQVI1S19QSFlfU1BVUl9QV1JfRklMVAkweDAwMDEwMDAwCS8qIFBvd2VyIHdpdGggU1BVUiByZW1vdmVkIChmaWVsZCkgKi8KKworLyoKKyAqIFBIWSBDaGFubmVsIHN0YXR1cyByZWdpc3RlciBbNTExMitdICg/KQorICovCisjZGVmaW5lCUFSNUtfUEhZX0NIQU5fU1RBVFVTCQkweDljMzgKKyNkZWZpbmUJQVI1S19QSFlfQ0hBTl9TVEFUVVNfQlRfQUNUCTB4MDAwMDAwMDEKKyNkZWZpbmUJQVI1S19QSFlfQ0hBTl9TVEFUVVNfUlhfQ0xSX1JBVwkweDAwMDAwMDAyCisjZGVmaW5lCUFSNUtfUEhZX0NIQU5fU1RBVFVTX1JYX0NMUl9NQUMJMHgwMDAwMDAwNAorI2RlZmluZQlBUjVLX1BIWV9DSEFOX1NUQVRVU19SWF9DTFJfUEFQCTB4MDAwMDAwMDgKKworLyoKKyAqIEhlYXZ5IGNsaXAgZW5hYmxlIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfSEVBVllfQ0xJUF9FTkFCTEUJMHg5OWUwCisKKy8qCisgKiBQSFkgY2xvY2sgc2xlZXAgcmVnaXN0ZXJzIFs1MTEyK10KKyAqLworI2RlZmluZSBBUjVLX1BIWV9TQ0xPQ0sJCQkweDk5ZjAKKyNkZWZpbmUgQVI1S19QSFlfU0NMT0NLXzMyTUhaCQkweDAwMDAwMDBjCisjZGVmaW5lIEFSNUtfUEhZX1NERUxBWQkJCTB4OTlmNAorI2RlZmluZSBBUjVLX1BIWV9TREVMQVlfMzJNSFoJCTB4MDAwMDAwZmYKKyNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkcJCTB4OTlmOAorCisKKy8qCisgKiBQSFkgUEFQRCBJIChwb3dlcj8pIHRhYmxlICg/KQorICogKDkyISBlbnRyaWVzKQorICovCisjZGVmaW5lCUFSNUtfUEhZX1BBUERfSV9CQVNFCTB4YTAwMAorI2RlZmluZQlBUjVLX1BIWV9QQVBEX0koX24pCShBUjVLX1BIWV9QQVBEX0lfQkFTRSArICgoX24pIDw8IDIpKQorCisvKgorICogUEhZIFBDREFDIFRYIHBvd2VyIHRhYmxlCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfUENEQUNfVFhQT1dFUl9CQVNFCTB4YTE4MAorI2RlZmluZQlBUjVLX1BIWV9QQ0RBQ19UWFBPV0VSKF9uKQkoQVI1S19QSFlfUENEQUNfVFhQT1dFUl9CQVNFICsgKChfbikgPDwgMikpCisKKy8qCisgKiBQSFkgbW9kZSByZWdpc3RlciBbNTExMStdCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfTU9ERQkJCTB4MGEyMDAJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUEhZX01PREVfTU9ECQkweDAwMDAwMDAxCS8qIFBIWSBNb2R1bGF0aW9uIGJpdCAqLworI2RlZmluZSBBUjVLX1BIWV9NT0RFX01PRF9PRkRNCQkwCisjZGVmaW5lIEFSNUtfUEhZX01PREVfTU9EX0NDSwkJMQorI2RlZmluZSBBUjVLX1BIWV9NT0RFX0ZSRVEJCTB4MDAwMDAwMDIJLyogRnJlcSBtb2RlIGJpdCAqLworI2RlZmluZQlBUjVLX1BIWV9NT0RFX0ZSRVFfNUdIWgkJMAorI2RlZmluZQlBUjVLX1BIWV9NT0RFX0ZSRVFfMkdIWgkJMgorI2RlZmluZSBBUjVLX1BIWV9NT0RFX01PRF9EWU4JCTB4MDAwMDAwMDQJLyogRW5hYmxlIER5bmFtaWMgT0ZETS9DQ0sgbW9kZSBbNTExMitdICovCisjZGVmaW5lIEFSNUtfUEhZX01PREVfUkFECQkweDAwMDAwMDA4CS8qIFs1MjEyK10gKi8KKyNkZWZpbmUgQVI1S19QSFlfTU9ERV9SQURfUkY1MTExCTAKKyNkZWZpbmUgQVI1S19QSFlfTU9ERV9SQURfUkY1MTEyCTgKKyNkZWZpbmUgQVI1S19QSFlfTU9ERV9YUgkJMHgwMDAwMDAxMAkvKiBFbmFibGUgWFIgbW9kZSBbNTExMitdICovCisjZGVmaW5lCUFSNUtfUEhZX01PREVfSEFMRl9SQVRFCQkweDAwMDAwMDIwCS8qIEVuYWJsZSBIYWxmIHJhdGUgKHRlc3QpICovCisjZGVmaW5lCUFSNUtfUEhZX01PREVfUVVBUlRFUl9SQVRFCTB4MDAwMDAwNDAJLyogRW5hYmxlIFF1YXJ0ZXIgcmF0ICh0ZXN0KSAqLworCisvKgorICogUEhZIENDSyB0cmFuc21pdCBjb250cm9sIHJlZ2lzdGVyIFs1MTExKyAoPyldCisgKi8KKyNkZWZpbmUgQVI1S19QSFlfQ0NLVFhDVEwJCTB4YTIwNAorI2RlZmluZSBBUjVLX1BIWV9DQ0tUWENUTF9XT1JMRAkJMHgwMDAwMDAwMAorI2RlZmluZSBBUjVLX1BIWV9DQ0tUWENUTF9KQVBBTgkJMHgwMDAwMDAxMAorI2RlZmluZQlBUjVLX1BIWV9DQ0tUWENUTF9TQ1JBTUJMRVJfRElTCTB4MDAwMDAwMDEKKyNkZWZpbmUJQVI1S19QSFlfQ0NLVFhDVEtfREFDX1NDQUxFCTB4MDAwMDAwMDQKKworLyoKKyAqIFBIWSBDQ0sgQ3Jvc3MtY29ycmVsYXRvciBCYXJrZXIgUlNTSSB0aHJlc2hvbGQgcmVnaXN0ZXIgWzUyMTIrXQorICovCisjZGVmaW5lIEFSNUtfUEhZX0NDS19DUk9TU0NPUlIJCQkweGEyMDgKKyNkZWZpbmUgQVI1S19QSFlfQ0NLX0NST1NTQ09SUl9XRUFLX1NJR19USFIJMHgwMDAwMDAwZgorI2RlZmluZSBBUjVLX1BIWV9DQ0tfQ1JPU1NDT1JSX1dFQUtfU0lHX1RIUl9TCTAKKworLyogU2FtZSBhZGRyZXNzIGlzIHVzZWQgZm9yIGFudGVubmEgZGl2ZXJzaXR5IGFjdGl2YXRpb24gKi8KKyNkZWZpbmUJQVI1S19QSFlfRkFTVF9BTlRfRElWCQkweGEyMDgKKyNkZWZpbmUJQVI1S19QSFlfRkFTVF9BTlRfRElWX0VOCTB4MDAwMDIwMDAKKworLyoKKyAqIFBIWSAyR0h6IGdhaW4gcmVnaXN0ZXIgWzUxMTErXQorICovCisjZGVmaW5lCUFSNUtfUEhZX0dBSU5fMkdIWgkJCTB4YTIwYworI2RlZmluZQlBUjVLX1BIWV9HQUlOXzJHSFpfTUFSR0lOX1RYUlgJCTB4MDBmYzAwMDAKKyNkZWZpbmUJQVI1S19QSFlfR0FJTl8yR0haX01BUkdJTl9UWFJYX1MJMTgKKyNkZWZpbmUJQVI1S19QSFlfR0FJTl8yR0haX0lOSV81MTExCQkweDY0ODA0MTZjCisKKyNkZWZpbmUJQVI1S19QSFlfQ0NLX1JYX0NUTF80CQkJMHhhMjFjCisjZGVmaW5lCUFSNUtfUEhZX0NDS19SWF9DVExfNF9GUkVRX0VTVF9TSE9SVAkweDAxZjgwMDAwCisjZGVmaW5lCUFSNUtfUEhZX0NDS19SWF9DVExfNF9GUkVRX0VTVF9TSE9SVF9TCTE5CisKKyNkZWZpbmUJQVI1S19QSFlfREFHX0NDS19DVEwJCQkweGEyMjgKKyNkZWZpbmUJQVI1S19QSFlfREFHX0NDS19DVExfRU5fUlNTSV9USFIJMHgwMDAwMDIwMAorI2RlZmluZQlBUjVLX1BIWV9EQUdfQ0NLX0NUTF9SU1NJX1RIUgkJMHgwMDAxZmMwMAorI2RlZmluZQlBUjVLX1BIWV9EQUdfQ0NLX0NUTF9SU1NJX1RIUl9TCQkxMAorCisjZGVmaW5lCUFSNUtfUEhZX0ZBU1RfQURDCTB4YTI0YworCisjZGVmaW5lCUFSNUtfUEhZX0JMVUVUT09USAkweGEyNTQKKworLyoKKyAqIFRyYW5zbWl0IFBvd2VyIENvbnRyb2wgcmVnaXN0ZXIKKyAqIFsyNDEzK10KKyAqLworI2RlZmluZQlBUjVLX1BIWV9UUENfUkcxCQkweGEyNTgKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHMV9OVU1fUERfR0FJTgkweDAwMDBjMDAwCisjZGVmaW5lCUFSNUtfUEhZX1RQQ19SRzFfTlVNX1BEX0dBSU5fUwkxNAorI2RlZmluZSBBUjVLX1BIWV9UUENfUkcxX1BER0FJTl8xCTB4MDAwMzAwMDAKKyNkZWZpbmUgQVI1S19QSFlfVFBDX1JHMV9QREdBSU5fMV9TCTE2CisjZGVmaW5lIEFSNUtfUEhZX1RQQ19SRzFfUERHQUlOXzIJMHgwMDBjMDAwMAorI2RlZmluZSBBUjVLX1BIWV9UUENfUkcxX1BER0FJTl8yX1MJMTgKKyNkZWZpbmUgQVI1S19QSFlfVFBDX1JHMV9QREdBSU5fMwkweDAwMzAwMDAwCisjZGVmaW5lIEFSNUtfUEhZX1RQQ19SRzFfUERHQUlOXzNfUwkyMAorCisjZGVmaW5lCUFSNUtfUEhZX1RQQ19SRzUJCQkweGEyNkMKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHNV9QRF9HQUlOX09WRVJMQVAJMHgwMDAwMDAwRgorI2RlZmluZQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fT1ZFUkxBUF9TCTAKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHNV9QRF9HQUlOX0JPVU5EQVJZXzEJMHgwMDAwMDNGMAorI2RlZmluZQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfMV9TCTQKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHNV9QRF9HQUlOX0JPVU5EQVJZXzIJMHgwMDAwRkMwMAorI2RlZmluZQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfMl9TCTEwCisjZGVmaW5lCUFSNUtfUEhZX1RQQ19SRzVfUERfR0FJTl9CT1VOREFSWV8zCTB4MDAzRjAwMDAKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHNV9QRF9HQUlOX0JPVU5EQVJZXzNfUwkxNgorI2RlZmluZQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfNAkweDBGQzAwMDAwCisjZGVmaW5lCUFSNUtfUEhZX1RQQ19SRzVfUERfR0FJTl9CT1VOREFSWV80X1MJMjIKKworLyoKKyAqIFBIWSBQREFEQyBUeCBwb3dlciB0YWJsZQorICovCisjZGVmaW5lIEFSNUtfUEhZX1BEQURDX1RYUE9XRVJfQkFTRQkweGEyODAKKyNkZWZpbmUJQVI1S19QSFlfUERBRENfVFhQT1dFUihfbikJKEFSNUtfUEhZX1BEQURDX1RYUE9XRVJfQkFTRSArICgoX24pIDw8IDIpKQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRoNWsvcmZidWZmZXIuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL3JmYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwYmFmZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL3JmYnVmZmVyLmgKQEAgLTAsMCArMSwxMTgxIEBACisvKgorICogUkYgQnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKKworLyoKKyAqIFRoZXJlIGFyZSBzb21lIHNwZWNpYWwgcmVnaXN0ZXJzIG9uIHRoZSBSRiBjaGlwCisgKiB0aGF0IGNvbnRyb2wgdmFyaW91cyBvcGVyYXRpb24gc2V0dGluZ3MgcmVsYXRlZCBtb3N0bHkgdG8KKyAqIHRoZSBhbmFsb2cgcGFydHMgKGNoYW5uZWwsIGdhaW4gYWRqdXN0bWVudCBldGMpLgorICoKKyAqIFdlIGRvbid0IHdyaXRlIG9uIHRob3NlIHJlZ2lzdGVycyBkaXJlY3RseSBidXQKKyAqIHdlIHNlbmQgYSBkYXRhIHBhY2tldCBvbiB0aGUgY2hpcCwgdXNpbmcgYSBzcGVjaWFsIHJlZ2lzdGVyLAorICogdGhhdCBob2xkcyBhbGwgdGhlIHNldHRpbmdzIHdlIG5lZWQuIEFmdGVyIHdlICd2ZSBzZW50IHRoZQorICogZGF0YSBwYWNrZXQsIHdlIHdyaXRlIG9uIGFub3RoZXIgc3BlY2lhbCByZWdpc3RlciB0byBub3RpZnkgaHcKKyAqIHRvIGFwcGx5IHRoZSBzZXR0aW5ncy4gVGhpcyBpcyBkb25lIHNvIHRoYXQgY29udHJvbCByZWdpc3RlcnMKKyAqIGNhbiBiZSBkeW5hbWljYWx5IHByb2dyYW1tZWQgZHVyaW5nIG9wZXJhdGlvbiBhbmQgdGhlIHNldHRpbmdzCisgKiBhcmUgYXBwbGllZCBmYXN0ZXIgb24gdGhlIGh3LgorICoKKyAqIFdlIGNhbGwgZWFjaCBkYXRhIHBhY2tldCBhbiAiUkYgQmFuayIgYW5kIGFsbCB0aGUgZGF0YSB3ZSB3cml0ZQorICogKGFsbCBSRiBCYW5rcykgIlJGIEJ1ZmZlciIuIFRoaXMgZmlsZSBob2xkcyBpbml0aWFsIFJGIEJ1ZmZlcgorICogZGF0YSBmb3IgdGhlIGRpZmZlcmVudCBSRiBjaGlwcywgYW5kIHZhcmlvdXMgaW5mbyB0byBtYXRjaCBSRgorICogQnVmZmVyIG9mZnNldHMgd2l0aCBzcGVjaWZpYyBSRiByZWdpc3RlcnMgc28gdGhhdCB3ZSBjYW4gYWNjZXNzCisgKiB0aGVtLiBXZSB0d2VhayB0aGVzZSBzZXR0aW5ncyBvbiByZnJlZ3NfaW5pdCBmdW5jdGlvbi4KKyAqCisgKiBBbHNvIGNoZWNrIG91dCByZWcuaCBhbmQgVS5TLiBQYXRlbnQgNjY3Nzc3OSBCMSAoYWJvdXQgYnVmZmVyCisgKiByZWdpc3RlcnMgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzKToKKyAqCisgKiBodHRwOi8vd3d3Lmdvb2dsZS5jb20vcGF0ZW50cz9pZD1xTlVSQUFBQUVCQUoKKyAqLworCisKKy8qCisgKiBTdHJ1Y3QgdG8gaG9sZCBkZWZhdWx0IG1vZGUgc3BlY2lmaWMgUkYKKyAqIHJlZ2lzdGVyIHZhbHVlcyAoUkYgQmFua3MpCisgKi8KK3N0cnVjdCBhdGg1a19pbmlfcmZidWZmZXIgeworCXU4CXJmYl9iYW5rOwkJLyogUkYgQmFuayBudW1iZXIgKi8KKwl1MTYJcmZiX2N0cmxfcmVnaXN0ZXI7CS8qIFJGIEJ1ZmZlciBjb250cm9sIHJlZ2lzdGVyICovCisJdTMyCXJmYl9tb2RlX2RhdGFbNV07CS8qIFJGIEJ1ZmZlciBkYXRhIGZvciBlYWNoIG1vZGUgKi8KK307CisKKy8qCisgKiBTdHJ1Y3QgdG8gaG9sZCBSRiBCdWZmZXIgZmllbGQKKyAqIGluZm9zIHVzZWQgdG8gYWNjZXNzIGNlcnRhaW4gUkYKKyAqIGFuYWxvZyByZWdpc3RlcnMKKyAqLworc3RydWN0IGF0aDVrX3JmYl9maWVsZCB7CisJdTgJbGVuOwkvKiBGaWVsZCBsZW5ndGggKi8KKwl1MTYJcG9zOwkvKiBPZmZzZXQgb24gdGhlIHJhdyBwYWNrZXQgKi8KKwl1OAljb2w7CS8qIENvbHVtbiAtdXNlZCBmb3Igc2hpZnRpbmcgKi8KK307CisKKy8qCisgKiBSRiBhbmFsb2cgcmVnaXN0ZXIgZGVmaW5pdGlvbgorICovCitzdHJ1Y3QgYXRoNWtfcmZfcmVnIHsKKwl1OAkJCWJhbms7CS8qIFJGIEJ1ZmZlciBCYW5rIG51bWJlciAqLworCXU4CQkJaW5kZXg7CS8qIFJlZ2lzdGVyJ3MgaW5kZXggb24gcmZfcmVnc19pZHggKi8KKwlzdHJ1Y3QgYXRoNWtfcmZiX2ZpZWxkCWZpZWxkOwkvKiBSRiBCdWZmZXIgZmllbGQgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KK307CisKKy8qIE1hcCBSRiByZWdpc3RlcnMgdG8gaW5kZXhlcworICogV2UgZG8gdGhpcyB0byBoYW5kbGUgY29tbW9uIGJpdHMgYW5kIG1ha2Ugb3VyCisgKiBsaWZlIGVhc2llciBieSB1c2luZyBhbiBpbmRleCBmb3IgZWFjaCByZWdpc3RlcgorICogaW5zdGVhZCBvZiBhIGZ1bGwgcmZiX2ZpZWxkICovCitlbnVtIGF0aDVrX3JmX3JlZ3NfaWR4IHsKKwkvKiBCQU5LIDYgKi8KKwlBUjVLX1JGX09CXzJHSFogPSAwLAorCUFSNUtfUkZfT0JfNUdIWiwKKwlBUjVLX1JGX0RCXzJHSFosCisJQVI1S19SRl9EQl81R0haLAorCUFSNUtfUkZfRklYRURfQklBU19BLAorCUFSNUtfUkZfRklYRURfQklBU19CLAorCUFSNUtfUkZfUFdEX1hQRCwKKwlBUjVLX1JGX1hQRF9TRUwsCisJQVI1S19SRl9YUERfR0FJTiwKKwlBUjVLX1JGX1BEX0dBSU5fTE8sCisJQVI1S19SRl9QRF9HQUlOX0hJLAorCUFSNUtfUkZfSElHSF9WQ19DUCwKKwlBUjVLX1JGX01JRF9WQ19DUCwKKwlBUjVLX1JGX0xPV19WQ19DUCwKKwlBUjVLX1JGX1BVU0hfVVAsCisJQVI1S19SRl9QQUQyR05ELAorCUFSNUtfUkZfWEIyX0xWTCwKKwlBUjVLX1JGX1hCNV9MVkwsCisJQVI1S19SRl9QV0RfSUNMT0JVRl8yRywKKwlBUjVLX1JGX1BXRF84NCwKKwlBUjVLX1JGX1BXRF85MCwKKwlBUjVLX1JGX1BXRF8xMzAsCisJQVI1S19SRl9QV0RfMTMxLAorCUFSNUtfUkZfUFdEXzEzMiwKKwlBUjVLX1JGX1BXRF8xMzYsCisJQVI1S19SRl9QV0RfMTM3LAorCUFSNUtfUkZfUFdEXzEzOCwKKwlBUjVLX1JGX1BXRF8xNjYsCisJQVI1S19SRl9QV0RfMTY3LAorCUFSNUtfUkZfREVSQllfQ0hBTl9TRUxfTU9ERSwKKwkvKiBCQU5LIDcgKi8KKwlBUjVLX1JGX0dBSU5fSSwKKwlBUjVLX1JGX1BMT19TRUwsCisJQVI1S19SRl9SRkdBSU5fU0VMLAorCUFSNUtfUkZfUkZHQUlOX1NURVAsCisJQVI1S19SRl9XQUlUX1MsCisJQVI1S19SRl9XQUlUX0ksCisJQVI1S19SRl9NQVhfVElNRSwKKwlBUjVLX1JGX01JWFZHQV9PVlIsCisJQVI1S19SRl9NSVhHQUlOX09WUiwKKwlBUjVLX1JGX01JWEdBSU5fU1RFUCwKKwlBUjVLX1JGX1BEX0RFTEFZX0EsCisJQVI1S19SRl9QRF9ERUxBWV9CLAorCUFSNUtfUkZfUERfREVMQVlfWFIsCisJQVI1S19SRl9QRF9QRVJJT0RfQSwKKwlBUjVLX1JGX1BEX1BFUklPRF9CLAorCUFSNUtfUkZfUERfUEVSSU9EX1hSLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKlwKKyogUkY1MTExIChTb21icmVybykgKgorXCoqKioqKioqKioqKioqKioqKiovCisKKy8qIEJBTksgNgkJCQlsZW4gIHBvcyBjb2wgKi8KKyNkZWZpbmUJQVI1S19SRjUxMTFfT0JfMkdIWgkJeyAzLCAxMTksIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMV9EQl8yR0haCQl7IDMsIDEyMiwgMCB9CisKKyNkZWZpbmUJQVI1S19SRjUxMTFfT0JfNUdIWgkJeyAzLCAxMDQsIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMV9EQl81R0haCQl7IDMsIDEwNywgMCB9CisKKyNkZWZpbmUJQVI1S19SRjUxMTFfUFdEX1hQRAkJeyAxLCA5NSwgIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMV9YUERfR0FJTgkJeyA0LCA5NiwgIDAgfQorCisvKiBBY2Nlc3MgdG8gUFdEIHJlZ2lzdGVycyAqLworI2RlZmluZSBBUjVLX1JGNTExMV9QV0QoX24pCQl7IDEsICgxMzUgLSBfbiksIDMgfQorCisvKiBCQU5LIDcJCQkJbGVuICBwb3MgY29sICovCisjZGVmaW5lCUFSNUtfUkY1MTExX0dBSU5fSQkJeyA2LCAyOSwgIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMV9QTE9fU0VMCQl7IDEsIDQsICAgMCB9CisjZGVmaW5lCUFSNUtfUkY1MTExX1JGR0FJTl9TRUwJCXsgMSwgMzYsICAwIH0KKyNkZWZpbmUgQVI1S19SRjUxMTFfUkZHQUlOX1NURVAJCXsgNiwgMzcsICAwIH0KKy8qIE9ubHkgb24gQVI1MjEyIEJhc2VCYW5kIGFuZCB1cCAqLworI2RlZmluZQlBUjVLX1JGNTExMV9XQUlUX1MJCXsgNSwgMTksICAwIH0KKyNkZWZpbmUJQVI1S19SRjUxMTFfV0FJVF9JCQl7IDUsIDI0LCAgMCB9CisjZGVmaW5lCUFSNUtfUkY1MTExX01BWF9USU1FCQl7IDIsIDQ5LCAgMCB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnIHJmX3JlZ3NfNTExMVtdID0geworCXs2LCBBUjVLX1JGX09CXzJHSFosCQlBUjVLX1JGNTExMV9PQl8yR0hafSwKKwl7NiwgQVI1S19SRl9EQl8yR0haLAkJQVI1S19SRjUxMTFfREJfMkdIWn0sCisJezYsIEFSNUtfUkZfT0JfNUdIWiwJCUFSNUtfUkY1MTExX09CXzVHSFp9LAorCXs2LCBBUjVLX1JGX0RCXzVHSFosCQlBUjVLX1JGNTExMV9EQl81R0hafSwKKwl7NiwgQVI1S19SRl9QV0RfWFBELAkJQVI1S19SRjUxMTFfUFdEX1hQRH0sCisJezYsIEFSNUtfUkZfWFBEX0dBSU4sCQlBUjVLX1JGNTExMV9YUERfR0FJTn0sCisJezYsIEFSNUtfUkZfUFdEXzg0LAkJQVI1S19SRjUxMTFfUFdEKDg0KX0sCisJezYsIEFSNUtfUkZfUFdEXzkwLAkJQVI1S19SRjUxMTFfUFdEKDkwKX0sCisJezcsIEFSNUtfUkZfR0FJTl9JLAkJQVI1S19SRjUxMTFfR0FJTl9JfSwKKwl7NywgQVI1S19SRl9QTE9fU0VMLAkJQVI1S19SRjUxMTFfUExPX1NFTH0sCisJezcsIEFSNUtfUkZfUkZHQUlOX1NFTCwJCUFSNUtfUkY1MTExX1JGR0FJTl9TRUx9LAorCXs3LCBBUjVLX1JGX1JGR0FJTl9TVEVQLAlBUjVLX1JGNTExMV9SRkdBSU5fU1RFUH0sCisJezcsIEFSNUtfUkZfV0FJVF9TLAkJQVI1S19SRjUxMTFfV0FJVF9TfSwKKwl7NywgQVI1S19SRl9XQUlUX0ksCQlBUjVLX1JGNTExMV9XQUlUX0l9LAorCXs3LCBBUjVLX1JGX01BWF9USU1FLAkJQVI1S19SRjUxMTFfTUFYX1RJTUV9Cit9OworCisvKiBEZWZhdWx0IG1vZGUgc3BlY2lmaWMgc2V0dGluZ3MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmYnVmZmVyIHJmYl81MTExW10gPSB7CisJeyAwLCAweDk4OWMsCisJLyogICAgIG1vZGUgYS9YUiAgbW9kZSBhVHVyYm8gICAgbW9kZSBiICAgICBtb2RlIGcgICAgbW9kZSBnVHVyYm8gKi8KKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMzgwMDAwLCAweDAwMzgwMDAwLCAweDAwMzgwMDAwLCAweDAwMzgwMDAwLCAweDAwMzgwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMGMwLCAweDAwMDAwMDgwLCAweDAwMDAwMDgwIH0gfSwKKwl7IDAsIDB4OTg5YywKKwkgICAgeyAweDAwMDQwMGY5LCAweDAwMDQwMGY5LCAweDAwMDQwMGZmLCAweDAwMDQwMGZkLCAweDAwMDQwMGZkIH0gfSwKKwl7IDAsIDB4OThkNCwKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0IH0gfSwKKwl7IDEsIDB4OThkNCwKKwkgICAgeyAweDAwMDAwMDIwLCAweDAwMDAwMDIwLCAweDAwMDAwMDIwLCAweDAwMDAwMDIwLCAweDAwMDAwMDIwIH0gfSwKKwl7IDIsIDB4OThkNCwKKwkgICAgeyAweDAwMDAwMDEwLCAweDAwMDAwMDE0LCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDE0IH0gfSwKKwl7IDMsIDB4OThkOCwKKwkgICAgeyAweDAwNjAxMDY4LCAweDAwNjAxMDY4LCAweDAwNjAxMDY4LCAweDAwNjAxMDY4LCAweDAwNjAxMDY4IH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDEwMDAwMDAwLCAweDEwMDAwMDAwLCAweDEwMDAwMDAwLCAweDEwMDAwMDAwLCAweDEwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDA0MDAwMDAwLCAweDA0MDAwMDAwLCAweDA0MDAwMDAwLCAweDA0MDAwMDAwLCAweDA0MDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDBhMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMzgwMGMwLCAweDAwMzgwMDgwLCAweDAyMzgwMGMwLCAweDAwMzgwMGMwLCAweDAwMzgwMGMwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDIwMDA2LCAweDAwMDIwMDA2LCAweDAwMDAwMDA2LCAweDAwMDIwMDA2LCAweDAwMDIwMDA2IH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDg5LCAweDAwMDAwMDg5LCAweDAwMDAwMDg5LCAweDAwMDAwMDg5LCAweDAwMDAwMDg5IH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMGEwLCAweDAwMDAwMGEwLCAweDAwMDAwMGEwLCAweDAwMDAwMGEwLCAweDAwMDAwMGEwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDQwMDA3LCAweDAwMDQwMDA3LCAweDAwMDQwMDA3LCAweDAwMDQwMDA3LCAweDAwMDQwMDA3IH0gfSwKKwl7IDYsIDB4OThkNCwKKwkgICAgeyAweDAwMDAwMDFhLCAweDAwMDAwMDFhLCAweDAwMDAwMDFhLCAweDAwMDAwMDFhLCAweDAwMDAwMDFhIH0gfSwKKwl7IDcsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDQwLCAweDAwMDAwMDQ4LCAweDAwMDAwMDQwLCAweDAwMDAwMDQwLCAweDAwMDAwMDQwIH0gfSwKKwl7IDcsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwIH0gfSwKKwl7IDcsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDA4LCAweDAwMDAwMDA4LCAweDAwMDAwMDA4LCAweDAwMDAwMDA4LCAweDAwMDAwMDA4IH0gfSwKKwl7IDcsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDRmLCAweDAwMDAwMDRmLCAweDAwMDAwMDRmLCAweDAwMDAwMDRmLCAweDAwMDAwMDRmIH0gfSwKKwl7IDcsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMGYxLCAweDAwMDAwMGYxLCAweDAwMDAwMDYxLCAweDAwMDAwMGYxLCAweDAwMDAwMGYxIH0gfSwKKwl7IDcsIDB4OTg5YywKKwkgICAgeyAweDAwMDA5MDRmLCAweDAwMDA5MDRmLCAweDAwMDA5MDRjLCAweDAwMDA5MDRmLCAweDAwMDA5MDRmIH0gfSwKKwl7IDcsIDB4OTg5YywKKwkgICAgeyAweDAwMDAxMjVhLCAweDAwMDAxMjVhLCAweDAwMDAxMjlhLCAweDAwMDAxMjVhLCAweDAwMDAxMjVhIH0gfSwKKwl7IDcsIDB4OThjYywKKwkgICAgeyAweDAwMDAwMDBlLCAweDAwMDAwMDBlLCAweDAwMDAwMDBmLCAweDAwMDAwMDBlLCAweDAwMDAwMDBlIH0gfSwKK307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKipcCisqIFJGNTExMi9SRjIxMTIgKERlcmJ5KSAqCitcKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEJBTksgNyAoQ29tbW9uKQkJCWxlbiAgcG9zIGNvbCAqLworI2RlZmluZQlBUjVLX1JGNTExMlhfR0FJTl9JCQl7IDYsIDE0LCAgMCB9CisjZGVmaW5lCUFSNUtfUkY1MTEyWF9NSVhWR0FfT1ZSCQl7IDEsIDM2LCAgMCB9CisjZGVmaW5lCUFSNUtfUkY1MTEyWF9NSVhHQUlOX09WUgl7IDIsIDM3LCAgMCB9CisjZGVmaW5lIEFSNUtfUkY1MTEyWF9NSVhHQUlOX1NURVAJeyA0LCAzMiwgIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMlhfUERfREVMQVlfQQkJeyA0LCA1OCwgIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMlhfUERfREVMQVlfQgkJeyA0LCA2MiwgIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMlhfUERfREVMQVlfWFIJeyA0LCA2NiwgIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMlhfUERfUEVSSU9EX0EJeyA0LCA3MCwgIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMlhfUERfUEVSSU9EX0IJeyA0LCA3NCwgIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMlhfUERfUEVSSU9EX1hSCXsgNCwgNzgsICAwIH0KKworLyogUkZYMTEyIChEZXJieSAxKSAqLworCisvKiBCQU5LIDYgCQkJCWxlbiAgcG9zIGNvbCAqLworI2RlZmluZQlBUjVLX1JGNTExMl9PQl8yR0haCQl7IDMsIDI2OSwgMCB9CisjZGVmaW5lCUFSNUtfUkY1MTEyX0RCXzJHSFoJCXsgMywgMjcyLCAwIH0KKworI2RlZmluZQlBUjVLX1JGNTExMl9PQl81R0haCQl7IDMsIDI2MSwgMCB9CisjZGVmaW5lCUFSNUtfUkY1MTEyX0RCXzVHSFoJCXsgMywgMjY0LCAwIH0KKworI2RlZmluZQlBUjVLX1JGNTExMl9GSVhFRF9CSUFTX0EJeyAxLCAyNjAsIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMl9GSVhFRF9CSUFTX0IJeyAxLCAyNTksIDAgfQorCisjZGVmaW5lCUFSNUtfUkY1MTEyX1hQRF9TRUwJCXsgMSwgMjg0LCAwIH0KKyNkZWZpbmUJQVI1S19SRjUxMTJfWFBEX0dBSU4JCXsgMiwgMjUyLCAwIH0KKworLyogQWNjZXNzIHRvIFBXRCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVI1S19SRjUxMTJfUFdEKF9uKQkJeyAxLCAoMzAyIC0gX24pLCAzIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgcmZfcmVnc181MTEyW10gPSB7CisJezYsIEFSNUtfUkZfT0JfMkdIWiwJCUFSNUtfUkY1MTEyX09CXzJHSFp9LAorCXs2LCBBUjVLX1JGX0RCXzJHSFosCQlBUjVLX1JGNTExMl9EQl8yR0hafSwKKwl7NiwgQVI1S19SRl9PQl81R0haLAkJQVI1S19SRjUxMTJfT0JfNUdIWn0sCisJezYsIEFSNUtfUkZfREJfNUdIWiwJCUFSNUtfUkY1MTEyX0RCXzVHSFp9LAorCXs2LCBBUjVLX1JGX0ZJWEVEX0JJQVNfQSwJQVI1S19SRjUxMTJfRklYRURfQklBU19BfSwKKwl7NiwgQVI1S19SRl9GSVhFRF9CSUFTX0IsCUFSNUtfUkY1MTEyX0ZJWEVEX0JJQVNfQn0sCisJezYsIEFSNUtfUkZfWFBEX1NFTCwJCUFSNUtfUkY1MTEyX1hQRF9TRUx9LAorCXs2LCBBUjVLX1JGX1hQRF9HQUlOLAkJQVI1S19SRjUxMTJfWFBEX0dBSU59LAorCXs2LCBBUjVLX1JGX1BXRF8xMzAsCQlBUjVLX1JGNTExMl9QV0QoMTMwKX0sCisJezYsIEFSNUtfUkZfUFdEXzEzMSwJCUFSNUtfUkY1MTEyX1BXRCgxMzEpfSwKKwl7NiwgQVI1S19SRl9QV0RfMTMyLAkJQVI1S19SRjUxMTJfUFdEKDEzMil9LAorCXs2LCBBUjVLX1JGX1BXRF8xMzYsCQlBUjVLX1JGNTExMl9QV0QoMTM2KX0sCisJezYsIEFSNUtfUkZfUFdEXzEzNywJCUFSNUtfUkY1MTEyX1BXRCgxMzcpfSwKKwl7NiwgQVI1S19SRl9QV0RfMTM4LAkJQVI1S19SRjUxMTJfUFdEKDEzOCl9LAorCXs3LCBBUjVLX1JGX0dBSU5fSSwJCUFSNUtfUkY1MTEyWF9HQUlOX0l9LAorCXs3LCBBUjVLX1JGX01JWFZHQV9PVlIsCQlBUjVLX1JGNTExMlhfTUlYVkdBX09WUn0sCisJezcsIEFSNUtfUkZfTUlYR0FJTl9PVlIsCUFSNUtfUkY1MTEyWF9NSVhHQUlOX09WUn0sCisJezcsIEFSNUtfUkZfTUlYR0FJTl9TVEVQLAlBUjVLX1JGNTExMlhfTUlYR0FJTl9TVEVQfSwKKwl7NywgQVI1S19SRl9QRF9ERUxBWV9BLAkJQVI1S19SRjUxMTJYX1BEX0RFTEFZX0F9LAorCXs3LCBBUjVLX1JGX1BEX0RFTEFZX0IsCQlBUjVLX1JGNTExMlhfUERfREVMQVlfQn0sCisJezcsIEFSNUtfUkZfUERfREVMQVlfWFIsCUFSNUtfUkY1MTEyWF9QRF9ERUxBWV9YUn0sCisJezcsIEFSNUtfUkZfUERfUEVSSU9EX0EsCUFSNUtfUkY1MTEyWF9QRF9QRVJJT0RfQX0sCisJezcsIEFSNUtfUkZfUERfUEVSSU9EX0IsCUFSNUtfUkY1MTEyWF9QRF9QRVJJT0RfQn0sCisJezcsIEFSNUtfUkZfUERfUEVSSU9EX1hSLAlBUjVLX1JGNTExMlhfUERfUEVSSU9EX1hSfSwKK307CisKKy8qIERlZmF1bHQgbW9kZSBzcGVjaWZpYyBzZXR0aW5ncyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZidWZmZXIgcmZiXzUxMTJbXSA9IHsKKwl7IDEsIDB4OThkNCwKKwkvKiAgICAgbW9kZSBhL1hSICBtb2RlIGFUdXJibyAgICBtb2RlIGIgICAgIG1vZGUgZyAgICBtb2RlIGdUdXJibyAqLworCSAgICB7IDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAgfSB9LAorCXsgMiwgMHg5OGQwLAorCSAgICB7IDB4MDMwNjA0MDgsIDB4MDMwNzA0MDgsIDB4MDMwNjA0MDgsIDB4MDMwNjA0MDgsIDB4MDMwNzA0MDggfSB9LAorCXsgMywgMHg5OGRjLAorCSAgICB7IDB4MDBhMGMwYzAsIDB4MDBhMGMwYzAsIDB4MDBlMGMwYzAsIDB4MDBlMGMwYzAsIDB4MDBlMGMwYzAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBhMDAwMDAsIDB4MDBhMDAwMDAsIDB4MDBhMDAwMDAsIDB4MDBhMDAwMDAsIDB4MDBhMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwYTAwMDAsIDB4MDAwYTAwMDAsIDB4MDAwYTAwMDAsIDB4MDAwYTAwMDAsIDB4MDAwYTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA2NjAwMDAsIDB4MDA2NjAwMDAsIDB4MDA2NjAwMDAsIDB4MDA2NjAwMDAsIDB4MDA2NjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBkYjAwMDAsIDB4MDBkYjAwMDAsIDB4MDBkYjAwMDAsIDB4MDBkYjAwMDAsIDB4MDBkYjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBmMTAwMDAsIDB4MDBmMTAwMDAsIDB4MDBmMTAwMDAsIDB4MDBmMTAwMDAsIDB4MDBmMTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAxMjAwMDAsIDB4MDAxMjAwMDAsIDB4MDAxMjAwMDAsIDB4MDAxMjAwMDAsIDB4MDAxMjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAxMjAwMDAsIDB4MDAxMjAwMDAsIDB4MDAxMjAwMDAsIDB4MDAxMjAwMDAsIDB4MDAxMjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA3MzAwMDAsIDB4MDA3MzAwMDAsIDB4MDA3MzAwMDAsIDB4MDA3MzAwMDAsIDB4MDA3MzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwYzAwMDAsIDB4MDAwYzAwMDAsIDB4MDAwYzAwMDAsIDB4MDAwYzAwMDAsIDB4MDAwYzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA4YjAwMDAsIDB4MDA4YjAwMDAsIDB4MDA4YjAwMDAsIDB4MDA4YjAwMDAsIDB4MDA4YjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA2MDAwMDAsIDB4MDA2MDAwMDAsIDB4MDA2MDAwMDAsIDB4MDA2MDAwMDAsIDB4MDA2MDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwYzAwMDAsIDB4MDAwYzAwMDAsIDB4MDAwYzAwMDAsIDB4MDAwYzAwMDAsIDB4MDAwYzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA4NDAwMDAsIDB4MDA4NDAwMDAsIDB4MDA4NDAwMDAsIDB4MDA4NDAwMDAsIDB4MDA4NDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA2NDAwMDAsIDB4MDA2NDAwMDAsIDB4MDA2NDAwMDAsIDB4MDA2NDAwMDAsIDB4MDA2NDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAyMDAwMDAsIDB4MDAyMDAwMDAsIDB4MDAyMDAwMDAsIDB4MDAyMDAwMDAsIDB4MDAyMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAyNDAwMDAsIDB4MDAyNDAwMDAsIDB4MDAyNDAwMDAsIDB4MDAyNDAwMDAsIDB4MDAyNDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAyNTAwMDAsIDB4MDAyNTAwMDAsIDB4MDAyNTAwMDAsIDB4MDAyNTAwMDAsIDB4MDAyNTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAxMTAwMDAsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAxMTAwMDAsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA1MTAwMDAsIDB4MDA1MTAwMDAsIDB4MDA1MTAwMDAsIDB4MDA1MTAwMDAsIDB4MDA1MTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MWMwNDAwMDAsIDB4MWMwNDAwMDAsIDB4MWMwNDAwMDAsIDB4MWMwNDAwMDAsIDB4MWMwNDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwYTAwMDAsIDB4MDAwYTAwMDAsIDB4MDAwYTAwMDAsIDB4MDAwYTAwMDAsIDB4MDAwYTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBhMTAwMDAsIDB4MDBhMTAwMDAsIDB4MDBhMTAwMDAsIDB4MDBhMTAwMDAsIDB4MDBhMTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA0MDAwMDAsIDB4MDA0MDAwMDAsIDB4MDA0MDAwMDAsIDB4MDA0MDAwMDAsIDB4MDA0MDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDMwOTAwMDAsIDB4MDMwOTAwMDAsIDB4MDMwOTAwMDAsIDB4MDMwOTAwMDAsIDB4MDMwOTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDYwMDAwMDAsIDB4MDYwMDAwMDAsIDB4MDYwMDAwMDAsIDB4MDYwMDAwMDAsIDB4MDYwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwYjAsIDB4MDAwMDAwYjAsIDB4MDAwMDAwYTgsIDB4MDAwMDAwYTgsIDB4MDAwMDAwYTggfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMmUsIDB4MDAwMDAwMmUsIDB4MDAwMDAwMmUsIDB4MDAwMDAwMmUsIDB4MDAwMDAwMmUgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA2YzRhNDEsIDB4MDA2YzRhNDEsIDB4MDA2YzRhZjEsIDB4MDA2YzRhNjEsIDB4MDA2YzRhNjEgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA1MDg5MmEsIDB4MDA1MDg5MmEsIDB4MDA1MDg5MmIsIDB4MDA1MDg5MmIsIDB4MDA1MDg5MmIgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA4NDI0MDAsIDB4MDA4NDI0MDAsIDB4MDA4NDI0MDAsIDB4MDA4NDI0MDAsIDB4MDA4NDI0MDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBjNjkyMDAsIDB4MDBjNjkyMDAsIDB4MDBjNjkyMDAsIDB4MDBjNjkyMDAsIDB4MDBjNjkyMDAgfSB9LAorCXsgNiwgMHg5OGQwLAorCSAgICB7IDB4MDAwMjAwMGMsIDB4MDAwMjAwMGMsIDB4MDAwMjAwMGMsIDB4MDAwMjAwMGMsIDB4MDAwMjAwMGMgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwOTQsIDB4MDAwMDAwOTQsIDB4MDAwMDAwOTQsIDB4MDAwMDAwOTQsIDB4MDAwMDAwOTQgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwOTEsIDB4MDAwMDAwOTEsIDB4MDAwMDAwOTEsIDB4MDAwMDAwOTEsIDB4MDAwMDAwOTEgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMGEsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTIsIDB4MDAwMDAwMTIsIDB4MDAwMDAwMTIgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwODAsIDB4MDAwMDAwODAsIDB4MDAwMDAwODAsIDB4MDAwMDAwODAsIDB4MDAwMDAwODAgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwYzEsIDB4MDAwMDAwYzEsIDB4MDAwMDAwYzEsIDB4MDAwMDAwYzEsIDB4MDAwMDAwYzEgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwNjAsIDB4MDAwMDAwNjAsIDB4MDAwMDAwNjAsIDB4MDAwMDAwNjAsIDB4MDAwMDAwNjAgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwZjAsIDB4MDAwMDAwZjAsIDB4MDAwMDAwZjAsIDB4MDAwMDAwZjAsIDB4MDAwMDAwZjAgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMjIsIDB4MDAwMDAwMjIsIDB4MDAwMDAwMjIsIDB4MDAwMDAwMjIsIDB4MDAwMDAwMjIgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwOTIsIDB4MDAwMDAwOTIsIDB4MDAwMDAwOTIsIDB4MDAwMDAwOTIsIDB4MDAwMDAwOTIgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwZDQsIDB4MDAwMDAwZDQsIDB4MDAwMDAwZDQsIDB4MDAwMDAwZDQsIDB4MDAwMDAwZDQgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDE0Y2MsIDB4MDAwMDE0Y2MsIDB4MDAwMDE0Y2MsIDB4MDAwMDE0Y2MsIDB4MDAwMDE0Y2MgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDA0OGMsIDB4MDAwMDA0OGMsIDB4MDAwMDA0OGMsIDB4MDAwMDA0OGMsIDB4MDAwMDA0OGMgfSB9LAorCXsgNywgMHg5OGM0LAorCSAgICB7IDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMgfSB9LAorfTsKKworLyogUkZYMTEyQSAoRGVyYnkgMikgKi8KKworLyogQkFOSyA2CQkJCWxlbiAgcG9zIGNvbCAqLworI2RlZmluZQlBUjVLX1JGNTExMkFfT0JfMkdIWgkJeyAzLCAyODcsIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMkFfREJfMkdIWgkJeyAzLCAyOTAsIDAgfQorCisjZGVmaW5lCUFSNUtfUkY1MTEyQV9PQl81R0haCQl7IDMsIDI3OSwgMCB9CisjZGVmaW5lCUFSNUtfUkY1MTEyQV9EQl81R0haCQl7IDMsIDI4MiwgMCB9CisKKyNkZWZpbmUJQVI1S19SRjUxMTJBX0ZJWEVEX0JJQVNfQQl7IDEsIDI3OCwgMCB9CisjZGVmaW5lCUFSNUtfUkY1MTEyQV9GSVhFRF9CSUFTX0IJeyAxLCAyNzcsIDAgfQorCisjZGVmaW5lCUFSNUtfUkY1MTEyQV9YUERfU0VMCQl7IDEsIDMwMiwgMCB9CisjZGVmaW5lCUFSNUtfUkY1MTEyQV9QREdBSU5MTwkJeyAyLCAyNzAsIDAgfQorI2RlZmluZQlBUjVLX1JGNTExMkFfUERHQUlOSEkJCXsgMiwgMjU3LCAwIH0KKworLyogQWNjZXNzIHRvIFBXRCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVI1S19SRjUxMTJBX1BXRChfbikJCXsgMSwgKDMwNiAtIF9uKSwgMyB9CisKKy8qIFZvbHRhZ2UgcmVndWxhdG9ycyAqLworI2RlZmluZQlBUjVLX1JGNTExMkFfSElHSF9WQ19DUAkJeyAyLCA5MCwgIDIgfQorI2RlZmluZQlBUjVLX1JGNTExMkFfTUlEX1ZDX0NQCQl7IDIsIDkyLCAgMiB9CisjZGVmaW5lCUFSNUtfUkY1MTEyQV9MT1dfVkNfQ1AJCXsgMiwgOTQsICAyIH0KKyNkZWZpbmUJQVI1S19SRjUxMTJBX1BVU0hfVVAJCXsgMSwgMjU0LCAgMiB9CisKKy8qIFBvd2VyIGNvbnN1bXB0aW9uICovCisjZGVmaW5lCUFSNUtfUkY1MTEyQV9QQUQyR05ECQl7IDEsIDI4MSwgMSB9CisjZGVmaW5lCUFSNUtfUkY1MTEyQV9YQjJfTFZMCQl7IDIsIDEsCSAgMyB9CisjZGVmaW5lCUFSNUtfUkY1MTEyQV9YQjVfTFZMCQl7IDIsIDMsCSAgMyB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnIHJmX3JlZ3NfNTExMmFbXSA9IHsKKwl7NiwgQVI1S19SRl9PQl8yR0haLAkJQVI1S19SRjUxMTJBX09CXzJHSFp9LAorCXs2LCBBUjVLX1JGX0RCXzJHSFosCQlBUjVLX1JGNTExMkFfREJfMkdIWn0sCisJezYsIEFSNUtfUkZfT0JfNUdIWiwJCUFSNUtfUkY1MTEyQV9PQl81R0hafSwKKwl7NiwgQVI1S19SRl9EQl81R0haLAkJQVI1S19SRjUxMTJBX0RCXzVHSFp9LAorCXs2LCBBUjVLX1JGX0ZJWEVEX0JJQVNfQSwJQVI1S19SRjUxMTJBX0ZJWEVEX0JJQVNfQX0sCisJezYsIEFSNUtfUkZfRklYRURfQklBU19CLAlBUjVLX1JGNTExMkFfRklYRURfQklBU19CfSwKKwl7NiwgQVI1S19SRl9YUERfU0VMLAkJQVI1S19SRjUxMTJBX1hQRF9TRUx9LAorCXs2LCBBUjVLX1JGX1BEX0dBSU5fTE8sCQlBUjVLX1JGNTExMkFfUERHQUlOTE99LAorCXs2LCBBUjVLX1JGX1BEX0dBSU5fSEksCQlBUjVLX1JGNTExMkFfUERHQUlOSEl9LAorCXs2LCBBUjVLX1JGX1BXRF8xMzAsCQlBUjVLX1JGNTExMkFfUFdEKDEzMCl9LAorCXs2LCBBUjVLX1JGX1BXRF8xMzEsCQlBUjVLX1JGNTExMkFfUFdEKDEzMSl9LAorCXs2LCBBUjVLX1JGX1BXRF8xMzIsCQlBUjVLX1JGNTExMkFfUFdEKDEzMil9LAorCXs2LCBBUjVLX1JGX1BXRF8xMzYsCQlBUjVLX1JGNTExMkFfUFdEKDEzNil9LAorCXs2LCBBUjVLX1JGX1BXRF8xMzcsCQlBUjVLX1JGNTExMkFfUFdEKDEzNyl9LAorCXs2LCBBUjVLX1JGX1BXRF8xMzgsCQlBUjVLX1JGNTExMkFfUFdEKDEzOCl9LAorCXs2LCBBUjVLX1JGX1BXRF8xNjYsCQlBUjVLX1JGNTExMkFfUFdEKDE2Nil9LAorCXs2LCBBUjVLX1JGX1BXRF8xNjcsCQlBUjVLX1JGNTExMkFfUFdEKDE2Nyl9LAorCXs2LCBBUjVLX1JGX0hJR0hfVkNfQ1AsCQlBUjVLX1JGNTExMkFfSElHSF9WQ19DUH0sCisJezYsIEFSNUtfUkZfTUlEX1ZDX0NQLAkJQVI1S19SRjUxMTJBX01JRF9WQ19DUH0sCisJezYsIEFSNUtfUkZfTE9XX1ZDX0NQLAkJQVI1S19SRjUxMTJBX0xPV19WQ19DUH0sCisJezYsIEFSNUtfUkZfUFVTSF9VUCwJCUFSNUtfUkY1MTEyQV9QVVNIX1VQfSwKKwl7NiwgQVI1S19SRl9QQUQyR05ELAkJQVI1S19SRjUxMTJBX1BBRDJHTkR9LAorCXs2LCBBUjVLX1JGX1hCMl9MVkwsCQlBUjVLX1JGNTExMkFfWEIyX0xWTH0sCisJezYsIEFSNUtfUkZfWEI1X0xWTCwJCUFSNUtfUkY1MTEyQV9YQjVfTFZMfSwKKwl7NywgQVI1S19SRl9HQUlOX0ksCQlBUjVLX1JGNTExMlhfR0FJTl9JfSwKKwl7NywgQVI1S19SRl9NSVhWR0FfT1ZSLAkJQVI1S19SRjUxMTJYX01JWFZHQV9PVlJ9LAorCXs3LCBBUjVLX1JGX01JWEdBSU5fT1ZSLAlBUjVLX1JGNTExMlhfTUlYR0FJTl9PVlJ9LAorCXs3LCBBUjVLX1JGX01JWEdBSU5fU1RFUCwJQVI1S19SRjUxMTJYX01JWEdBSU5fU1RFUH0sCisJezcsIEFSNUtfUkZfUERfREVMQVlfQSwJCUFSNUtfUkY1MTEyWF9QRF9ERUxBWV9BfSwKKwl7NywgQVI1S19SRl9QRF9ERUxBWV9CLAkJQVI1S19SRjUxMTJYX1BEX0RFTEFZX0J9LAorCXs3LCBBUjVLX1JGX1BEX0RFTEFZX1hSLAlBUjVLX1JGNTExMlhfUERfREVMQVlfWFJ9LAorCXs3LCBBUjVLX1JGX1BEX1BFUklPRF9BLAlBUjVLX1JGNTExMlhfUERfUEVSSU9EX0F9LAorCXs3LCBBUjVLX1JGX1BEX1BFUklPRF9CLAlBUjVLX1JGNTExMlhfUERfUEVSSU9EX0J9LAorCXs3LCBBUjVLX1JGX1BEX1BFUklPRF9YUiwJQVI1S19SRjUxMTJYX1BEX1BFUklPRF9YUn0sCit9OworCisvKiBEZWZhdWx0IG1vZGUgc3BlY2lmaWMgc2V0dGluZ3MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmYnVmZmVyIHJmYl81MTEyYVtdID0geworCXsgMSwgMHg5OGQ0LAorCS8qICAgICBtb2RlIGEvWFIgIG1vZGUgYVR1cmJvICAgIG1vZGUgYiAgICAgbW9kZSBnICAgIG1vZGUgZ1R1cmJvICovCisJICAgIHsgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCB9IH0sCisJeyAyLCAweDk4ZDAsCisJICAgIHsgMHgwMzA2MDQwOCwgMHgwMzA3MDQwOCwgMHgwMzA2MDQwOCwgMHgwMzA2MDQwOCwgMHgwMzA3MDQwOCB9IH0sCisJeyAzLCAweDk4ZGMsCisJICAgIHsgMHgwMGEwMjBjMCwgMHgwMGEwMjBjMCwgMHgwMGUwMjBjMCwgMHgwMGUwMjBjMCwgMHgwMGUwMjBjMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwZjAwMDAwMCwgMHgwZjAwMDAwMCwgMHgwZjAwMDAwMCwgMHgwZjAwMDAwMCwgMHgwZjAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDE4MDAwMCwgMHgwMDE4MDAwMCwgMHgwMDE4MDAwMCwgMHgwMDE4MDAwMCwgMHgwMDE4MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDYwMDAwMCwgMHgwMDYwMDAwMCwgMHgwMDZlMDAwMCwgMHgwMDZlMDAwMCwgMHgwMDZlMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGM3MDAwMCwgMHgwMGM3MDAwMCwgMHgwMGM3MDAwMCwgMHgwMGM3MDAwMCwgMHgwMGM3MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDRiMDAwMCwgMHgwMDRiMDAwMCwgMHgwMDRiMDAwMCwgMHgwMDRiMDAwMCwgMHgwMDRiMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwNDQ4MDAwMCwgMHgwNDQ4MDAwMCwgMHgwNDQ4MDAwMCwgMHgwNDQ4MDAwMCwgMHgwNDQ4MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDRjMDAwMCwgMHgwMDRjMDAwMCwgMHgwMDRjMDAwMCwgMHgwMDRjMDAwMCwgMHgwMDRjMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGU0MDAwMCwgMHgwMGU0MDAwMCwgMHgwMGU0MDAwMCwgMHgwMGU0MDAwMCwgMHgwMGU0MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGZjMDAwMCwgMHgwMGZjMDAwMCwgMHgwMGZjMDAwMCwgMHgwMGZjMDAwMCwgMHgwMGZjMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwNDNmMDAwMCwgMHgwNDNmMDAwMCwgMHgwNDNmMDAwMCwgMHgwNDNmMDAwMCwgMHgwNDNmMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDBjMDAwMCwgMHgwMDBjMDAwMCwgMHgwMDBjMDAwMCwgMHgwMDBjMDAwMCwgMHgwMDBjMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMjE5MDAwMCwgMHgwMjE5MDAwMCwgMHgwMjE5MDAwMCwgMHgwMjE5MDAwMCwgMHgwMjE5MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDI0MDAwMCwgMHgwMDI0MDAwMCwgMHgwMDI0MDAwMCwgMHgwMDI0MDAwMCwgMHgwMDI0MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGI0MDAwMCwgMHgwMGI0MDAwMCwgMHgwMGI0MDAwMCwgMHgwMGI0MDAwMCwgMHgwMGI0MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDk5MDAwMCwgMHgwMDk5MDAwMCwgMHgwMDk5MDAwMCwgMHgwMDk5MDAwMCwgMHgwMDk5MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDUwMDAwMCwgMHgwMDUwMDAwMCwgMHgwMDUwMDAwMCwgMHgwMDUwMDAwMCwgMHgwMDUwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDEyMDAwMCwgMHgwMDEyMDAwMCwgMHgwMDEyMDAwMCwgMHgwMDEyMDAwMCwgMHgwMDEyMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHhjMDMyMDAwMCwgMHhjMDMyMDAwMCwgMHhjMDMyMDAwMCwgMHhjMDMyMDAwMCwgMHhjMDMyMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMTc0MDAwMCwgMHgwMTc0MDAwMCwgMHgwMTc0MDAwMCwgMHgwMTc0MDAwMCwgMHgwMTc0MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDExMDAwMCwgMHgwMDExMDAwMCwgMHgwMDExMDAwMCwgMHgwMDExMDAwMCwgMHgwMDExMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHg4NjI4MDAwMCwgMHg4NjI4MDAwMCwgMHg4NjI4MDAwMCwgMHg4NjI4MDAwMCwgMHg4NjI4MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgzMTg0MDAwMCwgMHgzMTg0MDAwMCwgMHgzMTg0MDAwMCwgMHgzMTg0MDAwMCwgMHgzMTg0MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGYyMDA4MCwgMHgwMGYyMDA4MCwgMHgwMGYyMDA4MCwgMHgwMGYyMDA4MCwgMHgwMGYyMDA4MCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDI3MDAxOSwgMHgwMDI3MDAxOSwgMHgwMDI3MDAxOSwgMHgwMDI3MDAxOSwgMHgwMDI3MDAxOSB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMyB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDBiMiwgMHgwMDAwMDBiMiwgMHgwMDAwMDBiMiwgMHgwMDAwMDBiMiwgMHgwMDAwMDBiMiB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGIwMjA4NCwgMHgwMGIwMjA4NCwgMHgwMGIwMjA4NCwgMHgwMGIwMjA4NCwgMHgwMGIwMjA4NCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDQxMjVhNCwgMHgwMDQxMjVhNCwgMHgwMDQxMjVhNCwgMHgwMDQxMjVhNCwgMHgwMDQxMjVhNCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDExOTIyMCwgMHgwMDExOTIyMCwgMHgwMDExOTIyMCwgMHgwMDExOTIyMCwgMHgwMDExOTIyMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDFhNDgwMCwgMHgwMDFhNDgwMCwgMHgwMDFhNDgwMCwgMHgwMDFhNDgwMCwgMHgwMDFhNDgwMCB9IH0sCisJeyA2LCAweDk4ZDgsCisJICAgIHsgMHgwMDBiMDIzMCwgMHgwMDBiMDIzMCwgMHgwMDBiMDIzMCwgMHgwMDBiMDIzMCwgMHgwMDBiMDIzMCB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDA5NCwgMHgwMDAwMDA5NCwgMHgwMDAwMDA5NCwgMHgwMDAwMDA5NCwgMHgwMDAwMDA5NCB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDA5MSwgMHgwMDAwMDA5MSwgMHgwMDAwMDA5MSwgMHgwMDAwMDA5MSwgMHgwMDAwMDA5MSB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDBkOSwgMHgwMDAwMDBkOSwgMHgwMDAwMDBkOSwgMHgwMDAwMDBkOSwgMHgwMDAwMDBkOSB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDA2MCwgMHgwMDAwMDA2MCwgMHgwMDAwMDA2MCwgMHgwMDAwMDA2MCwgMHgwMDAwMDA2MCB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDBmMCwgMHgwMDAwMDBmMCwgMHgwMDAwMDBmMCwgMHgwMDAwMDBmMCwgMHgwMDAwMDBmMCB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDBhMiwgMHgwMDAwMDBhMiwgMHgwMDAwMDBhMiwgMHgwMDAwMDBhMiwgMHgwMDAwMDBhMiB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDA1MiwgMHgwMDAwMDA1MiwgMHgwMDAwMDA1MiwgMHgwMDAwMDA1MiwgMHgwMDAwMDA1MiB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDBkNCwgMHgwMDAwMDBkNCwgMHgwMDAwMDBkNCwgMHgwMDAwMDBkNCwgMHgwMDAwMDBkNCB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMTRjYywgMHgwMDAwMTRjYywgMHgwMDAwMTRjYywgMHgwMDAwMTRjYywgMHgwMDAwMTRjYyB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDQ4YywgMHgwMDAwMDQ4YywgMHgwMDAwMDQ4YywgMHgwMDAwMDQ4YywgMHgwMDAwMDQ4YyB9IH0sCisJeyA3LCAweDk4YzQsCisJICAgIHsgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMyB9IH0sCit9OworCisKKworLyoqKioqKioqKioqKioqKioqKlwKKyogUkYyNDEzIChHcmlmZmluKSAqCitcKioqKioqKioqKioqKioqKioqLworCisvKiBCQU5LIDYgCQkJCWxlbiAgcG9zIGNvbCAqLworI2RlZmluZQlBUjVLX1JGMjQxM19PQl8yR0haCQl7IDMsIDE2OCwgMCB9CisjZGVmaW5lCUFSNUtfUkYyNDEzX0RCXzJHSFoJCXsgMywgMTY1LCAwIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgcmZfcmVnc18yNDEzW10gPSB7CisJezYsIEFSNUtfUkZfT0JfMkdIWiwJCUFSNUtfUkYyNDEzX09CXzJHSFp9LAorCXs2LCBBUjVLX1JGX0RCXzJHSFosCQlBUjVLX1JGMjQxM19EQl8yR0hafSwKK307CisKKy8qIERlZmF1bHQgbW9kZSBzcGVjaWZpYyBzZXR0aW5ncworICogWFhYOiBhL2FUdXJibyA/Pz8KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZidWZmZXIgcmZiXzI0MTNbXSA9IHsKKwl7IDEsIDB4OThkNCwKKwkvKiAgICAgbW9kZSBhL1hSICBtb2RlIGFUdXJibyAgICBtb2RlIGIgICAgIG1vZGUgZyAgICBtb2RlIGdUdXJibyAqLworCSAgICB7IDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAgfSB9LAorCXsgMiwgMHg5OGQwLAorCSAgICB7IDB4MDIwMDE0MDgsIDB4MDIwMTE0MDgsIDB4MDIwMDE0MDgsIDB4MDIwMDE0MDgsIDB4MDIwMTE0MDggfSB9LAorCXsgMywgMHg5OGRjLAorCSAgICB7IDB4MDBhMDIwYzAsIDB4MDBhMDIwYzAsIDB4MDBlMDIwYzAsIDB4MDBlMDIwYzAsIDB4MDBlMDIwYzAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4ZjAwMDAwMDAsIDB4ZjAwMDAwMDAsIDB4ZjAwMDAwMDAsIDB4ZjAwMDAwMDAsIDB4ZjAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDMwMDAwMDAsIDB4MDMwMDAwMDAsIDB4MDMwMDAwMDAsIDB4MDMwMDAwMDAsIDB4MDMwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4NDA0MDAwMDAsIDB4NDA0MDAwMDAsIDB4NDA0MDAwMDAsIDB4NDA0MDAwMDAsIDB4NDA0MDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4NjUwNTAwMDAsIDB4NjUwNTAwMDAsIDB4NjUwNTAwMDAsIDB4NjUwNTAwMDAsIDB4NjUwNTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA0MjAwMDAsIDB4MDA0MjAwMDAsIDB4MDA0MjAwMDAsIDB4MDA0MjAwMDAsIDB4MDA0MjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBiNTAwMDAsIDB4MDBiNTAwMDAsIDB4MDBiNTAwMDAsIDB4MDBiNTAwMDAsIDB4MDBiNTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMzAwMDAsIDB4MDAwMzAwMDAsIDB4MDAwMzAwMDAsIDB4MDAwMzAwMDAsIDB4MDAwMzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBmNzAwMDAsIDB4MDBmNzAwMDAsIDB4MDBmNzAwMDAsIDB4MDBmNzAwMDAsIDB4MDBmNzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA5ZDAwMDAsIDB4MDA5ZDAwMDAsIDB4MDA5ZDAwMDAsIDB4MDA5ZDAwMDAsIDB4MDA5ZDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAyMjAwMDAsIDB4MDAyMjAwMDAsIDB4MDAyMjAwMDAsIDB4MDAyMjAwMDAsIDB4MDAyMjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDQyMjAwMDAsIDB4MDQyMjAwMDAsIDB4MDQyMjAwMDAsIDB4MDQyMjAwMDAsIDB4MDQyMjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAyMzAwMTgsIDB4MDAyMzAwMTgsIDB4MDAyMzAwMTgsIDB4MDAyMzAwMTgsIDB4MDAyMzAwMTggfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAyODAwMDAsIDB4MDAyODAwMDAsIDB4MDAyODAwNjAsIDB4MDAyODAwNjAsIDB4MDAyODAwNjAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA1MDAwYzAsIDB4MDA1MDAwYzAsIDB4MDA1MDAwYzMsIDB4MDA1MDAwYzMsIDB4MDA1MDAwYzMgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwNDAwN2YsIDB4MDAwNDAwN2YsIDB4MDAwNDAwN2YsIDB4MDAwNDAwN2YsIDB4MDAwNDAwN2YgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDA0NTgsIDB4MDAwMDA0NTgsIDB4MDAwMDA0NTgsIDB4MDAwMDA0NTgsIDB4MDAwMDA0NTggfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMGMwMDAsIDB4MDAwMGMwMDAsIDB4MDAwMGMwMDAsIDB4MDAwMGMwMDAsIDB4MDAwMGMwMDAgfSB9LAorCXsgNiwgMHg5OGQ4LAorCSAgICB7IDB4MDA0MDAyMzAsIDB4MDA0MDAyMzAsIDB4MDA0MDAyMzAsIDB4MDA0MDAyMzAsIDB4MDA0MDAyMzAgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAgfSB9LAorCXsgNywgMHg5OGNjLAorCSAgICB7IDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUgfSB9LAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFJGMjMxNS9SRjIzMTYgKENvYnJhIFNvQykgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQkFOSyA2CQkJCWxlbiAgcG9zIGNvbCAqLworI2RlZmluZQlBUjVLX1JGMjMxNl9PQl8yR0haCQl7IDMsIDE3OCwgMCB9CisjZGVmaW5lCUFSNUtfUkYyMzE2X0RCXzJHSFoJCXsgMywgMTc1LCAwIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgcmZfcmVnc18yMzE2W10gPSB7CisJezYsIEFSNUtfUkZfT0JfMkdIWiwJCUFSNUtfUkYyMzE2X09CXzJHSFp9LAorCXs2LCBBUjVLX1JGX0RCXzJHSFosCQlBUjVLX1JGMjMxNl9EQl8yR0hafSwKK307CisKKy8qIERlZmF1bHQgbW9kZSBzcGVjaWZpYyBzZXR0aW5ncyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZidWZmZXIgcmZiXzIzMTZbXSA9IHsKKwl7IDEsIDB4OThkNCwKKwkvKiAgICAgbW9kZSBhL1hSICBtb2RlIGFUdXJibyAgICBtb2RlIGIgICAgIG1vZGUgZyAgICBtb2RlIGdUdXJibyAqLworCSAgICB7IDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAgfSB9LAorCXsgMiwgMHg5OGQwLAorCSAgICB7IDB4MDIwMDE0MDgsIDB4MDIwMTE0MDgsIDB4MDIwMDE0MDgsIDB4MDIwMDE0MDgsIDB4MDIwMTE0MDggfSB9LAorCXsgMywgMHg5OGRjLAorCSAgICB7IDB4MDBhMDIwYzAsIDB4MDBhMDIwYzAsIDB4MDBlMDIwYzAsIDB4MDBlMDIwYzAsIDB4MDBlMDIwYzAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4YzAwMDAwMDAsIDB4YzAwMDAwMDAsIDB4YzAwMDAwMDAsIDB4YzAwMDAwMDAsIDB4YzAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsIDB4MGYwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDIwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDIwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4ZjgwMDAwMDAsIDB4ZjgwMDAwMDAsIDB4ZjgwMDAwMDAsIDB4ZjgwMDAwMDAsIDB4ZjgwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4OTUxNTAwMDAsIDB4OTUxNTAwMDAsIDB4OTUxNTAwMDAsIDB4OTUxNTAwMDAsIDB4OTUxNTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4YzEwMDAwMDAsIDB4YzEwMDAwMDAsIDB4YzEwMDAwMDAsIDB4YzEwMDAwMDAsIDB4YzEwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwODAwMDAsIDB4MDAwODAwMDAsIDB4MDAwODAwMDAsIDB4MDAwODAwMDAsIDB4MDAwODAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBkNTAwMDAsIDB4MDBkNTAwMDAsIDB4MDBkNTAwMDAsIDB4MDBkNTAwMDAsIDB4MDBkNTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwZTAwMDAsIDB4MDAwZTAwMDAsIDB4MDAwZTAwMDAsIDB4MDAwZTAwMDAsIDB4MDAwZTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBkYzAwMDAsIDB4MDBkYzAwMDAsIDB4MDBkYzAwMDAsIDB4MDBkYzAwMDAsIDB4MDBkYzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA3NzAwMDAsIDB4MDA3NzAwMDAsIDB4MDA3NzAwMDAsIDB4MDA3NzAwMDAsIDB4MDA3NzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA4YTAwMDAsIDB4MDA4YTAwMDAsIDB4MDA4YTAwMDAsIDB4MDA4YTAwMDAsIDB4MDA4YTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MTA4ODAwMDAsIDB4MTA4ODAwMDAsIDB4MTA4ODAwMDAsIDB4MTA4ODAwMDAsIDB4MTA4ODAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA4YzAwNjAsIDB4MDA4YzAwNjAsIDB4MDA4YzAwNjAsIDB4MDA4YzAwNjAsIDB4MDA4YzAwNjAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBhMDAwMDAsIDB4MDBhMDAwMDAsIDB4MDBhMDAwODAsIDB4MDBhMDAwODAsIDB4MDBhMDAwODAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA0MDAwMDAsIDB4MDA0MDAwMDAsIDB4MDA0MDAwMGQsIDB4MDA0MDAwMGQsIDB4MDA0MDAwMGQgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAxMTA0MDAsIDB4MDAxMTA0MDAsIDB4MDAxMTA0MDAsIDB4MDAxMTA0MDAsIDB4MDAxMTA0MDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwNjAsIDB4MDAwMDAwNjAsIDB4MDAwMDAwNjAsIDB4MDAwMDAwNjAsIDB4MDAwMDAwNjAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDBiMDAsIDB4MDAwMDBiMDAsIDB4MDAwMDBiMDAsIDB4MDAwMDBiMDAsIDB4MDAwMDBiMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDBiZTgsIDB4MDAwMDBiZTgsIDB4MDAwMDBiZTgsIDB4MDAwMDBiZTgsIDB4MDAwMDBiZTggfSB9LAorCXsgNiwgMHg5OGMwLAorCSAgICB7IDB4MDAwMTAwMDAsIDB4MDAwMTAwMDAsIDB4MDAwMTAwMDAsIDB4MDAwMTAwMDAsIDB4MDAwMTAwMDAgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAgfSB9LAorCXsgNywgMHg5OGNjLAorCSAgICB7IDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUgfSB9LAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFJGNTQxMy9SRjU0MjQgKEVhZ2xlL0NvbmRvcikgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQkFOSyA2CQkJCWxlbiAgcG9zIGNvbCAqLworI2RlZmluZQlBUjVLX1JGNTQxM19PQl8yR0haCQl7IDMsIDI0MSwgMCB9CisjZGVmaW5lCUFSNUtfUkY1NDEzX0RCXzJHSFoJCXsgMywgMjM4LCAwIH0KKworI2RlZmluZQlBUjVLX1JGNTQxM19PQl81R0haCQl7IDMsIDI0NywgMCB9CisjZGVmaW5lCUFSNUtfUkY1NDEzX0RCXzVHSFoJCXsgMywgMjQ0LCAwIH0KKworI2RlZmluZQlBUjVLX1JGNTQxM19QV0RfSUNMT0JVRjJHCXsgMywgMTMxLCAzIH0KKyNkZWZpbmUJQVI1S19SRjU0MTNfREVSQllfQ0hBTl9TRUxfTU9ERQl7IDEsIDI5MSwgMiB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnIHJmX3JlZ3NfNTQxM1tdID0geworCXs2LCBBUjVLX1JGX09CXzJHSFosCQkgQVI1S19SRjU0MTNfT0JfMkdIWn0sCisJezYsIEFSNUtfUkZfREJfMkdIWiwJCSBBUjVLX1JGNTQxM19EQl8yR0hafSwKKwl7NiwgQVI1S19SRl9PQl81R0haLAkJIEFSNUtfUkY1NDEzX09CXzVHSFp9LAorCXs2LCBBUjVLX1JGX0RCXzVHSFosCQkgQVI1S19SRjU0MTNfREJfNUdIWn0sCisJezYsIEFSNUtfUkZfUFdEX0lDTE9CVUZfMkcsCSBBUjVLX1JGNTQxM19QV0RfSUNMT0JVRjJHfSwKKwl7NiwgQVI1S19SRl9ERVJCWV9DSEFOX1NFTF9NT0RFLCBBUjVLX1JGNTQxM19ERVJCWV9DSEFOX1NFTF9NT0RFfSwKK307CisKKy8qIERlZmF1bHQgbW9kZSBzcGVjaWZpYyBzZXR0aW5ncyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZidWZmZXIgcmZiXzU0MTNbXSA9IHsKKwl7IDEsIDB4OThkNCwKKwkvKiAgICAgbW9kZSBhL1hSICBtb2RlIGFUdXJibyAgICBtb2RlIGIgICAgIG1vZGUgZyAgICBtb2RlIGdUdXJibyAqLworCSAgICB7IDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAgfSB9LAorCXsgMiwgMHg5OGQwLAorCSAgICB7IDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDggfSB9LAorCXsgMywgMHg5OGRjLAorCSAgICB7IDB4MDBhMDAwYzAsIDB4MDBhMDAwYzAsIDB4MDBlMDAwYzAsIDB4MDBlMDAwYzAsIDB4MDBlMDAwYzAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MzMwMDAwMDAsIDB4MzMwMDAwMDAsIDB4MzMwMDAwMDAsIDB4MzMwMDAwMDAsIDB4MzMwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDEwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDEwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MWYwMDAwMDAsIDB4MWYwMDAwMDAsIDB4MWYwMDAwMDAsIDB4MWYwMDAwMDAsIDB4MWYwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBiODAwMDAsIDB4MDBiODAwMDAsIDB4MDBiODAwMDAsIDB4MDBiODAwMDAsIDB4MDBiODAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBiNzAwMDAsIDB4MDBiNzAwMDAsIDB4MDBiNzAwMDAsIDB4MDBiNzAwMDAsIDB4MDBiNzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA4NDAwMDAsIDB4MDA4NDAwMDAsIDB4MDA4NDAwMDAsIDB4MDA4NDAwMDAsIDB4MDA4NDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA5ODAwMDAsIDB4MDA5ODAwMDAsIDB4MDA5ODAwMDAsIDB4MDA5ODAwMDAsIDB4MDA5ODAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBjMDAwMDAsIDB4MDBjMDAwMDAsIDB4MDBjMDAwMDAsIDB4MDBjMDAwMDAsIDB4MDBjMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBkNzAwMDAsIDB4MDBkNzAwMDAsIDB4MDBkNzAwMDAsIDB4MDBkNzAwMDAsIDB4MDBkNzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA2MTAwMDAsIDB4MDA2MTAwMDAsIDB4MDA2MTAwMDAsIDB4MDA2MTAwMDAsIDB4MDA2MTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBmZTAwMDAsIDB4MDBmZTAwMDAsIDB4MDBmZTAwMDAsIDB4MDBmZTAwMDAsIDB4MDBmZTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDBkZTAwMDAsIDB4MDBkZTAwMDAsIDB4MDBkZTAwMDAsIDB4MDBkZTAwMDAsIDB4MDBkZTAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA3ZjAwMDAsIDB4MDA3ZjAwMDAsIDB4MDA3ZjAwMDAsIDB4MDA3ZjAwMDAsIDB4MDA3ZjAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDQzZDAwMDAsIDB4MDQzZDAwMDAsIDB4MDQzZDAwMDAsIDB4MDQzZDAwMDAsIDB4MDQzZDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA3NzAwMDAsIDB4MDA3NzAwMDAsIDB4MDA3NzAwMDAsIDB4MDA3NzAwMDAsIDB4MDA3NzAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA0NDAwMDAsIDB4MDA0NDAwMDAsIDB4MDA0NDAwMDAsIDB4MDA0NDAwMDAsIDB4MDA0NDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA5ODAwMDAsIDB4MDA5ODAwMDAsIDB4MDA5ODAwMDAsIDB4MDA5ODAwMDAsIDB4MDA5ODAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAxMDAwODAsIDB4MDAxMDAwODAsIDB4MDAxMDAwODAsIDB4MDAxMDAwODAsIDB4MDAxMDAwODAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwNWMwMzQsIDB4MDAwNWMwMzQsIDB4MDAwNWMwMzQsIDB4MDAwNWMwMzQsIDB4MDAwNWMwMzQgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAzMTAwZjAsIDB4MDAzMTAwZjAsIDB4MDAzMTAwZjAsIDB4MDAzMTAwZjAsIDB4MDAzMTAwZjAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwYzAxMWYsIDB4MDAwYzAxMWYsIDB4MDAwYzAxMWYsIDB4MDAwYzAxMWYsIDB4MDAwYzAxMWYgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA1MTAwNDAsIDB4MDA1MTAwNDAsIDB4MDA1MTAwNDAsIDB4MDA1MTAwNDAsIDB4MDA1MTAwNDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDA1MDAwZGEsIDB4MDA1MDAwZGEsIDB4MDA1MDAwZGEsIDB4MDA1MDAwZGEsIDB4MDA1MDAwZGEgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDQwNDQsIDB4MDAwMDQwNDQsIDB4MDAwMDQwNDQsIDB4MDAwMDQwNDQsIDB4MDAwMDQwNDQgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDYwYzAsIDB4MDAwMDYwYzAsIDB4MDAwMDYwYzAsIDB4MDAwMDYwYzAsIDB4MDAwMDYwYzAgfSB9LAorCXsgNiwgMHg5ODljLAorCSAgICB7IDB4MDAwMDJjMDAsIDB4MDAwMDJjMDAsIDB4MDAwMDM2MDAsIDB4MDAwMDM2MDAsIDB4MDAwMDJjMDAgfSB9LAorCXsgNiwgMHg5OGM4LAorCSAgICB7IDB4MDAwMDA0MDMsIDB4MDAwMDA0MDMsIDB4MDAwNDA0MDMsIDB4MDAwNDA0MDMsIDB4MDAwNDA0MDMgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAsIDB4MDAwMDY0MDAgfSB9LAorCXsgNywgMHg5ODljLAorCSAgICB7IDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA4MDAgfSB9LAorCXsgNywgMHg5OGNjLAorCSAgICB7IDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUgfSB9LAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFJGMjQyNS9SRjI0MTcgKFN3YW4vTmFsYSkgKgorKiBBUjIzMTcgKFNwaWRlciBTb0MpICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEJBTksgNgkJCQlsZW4gIHBvcyBjb2wgKi8KKyNkZWZpbmUJQVI1S19SRjI0MjVfT0JfMkdIWgkJeyAzLCAxOTMsIDAgfQorI2RlZmluZQlBUjVLX1JGMjQyNV9EQl8yR0haCQl7IDMsIDE5MCwgMCB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnIHJmX3JlZ3NfMjQyNVtdID0geworCXs2LCBBUjVLX1JGX09CXzJHSFosCQlBUjVLX1JGMjQyNV9PQl8yR0hafSwKKwl7NiwgQVI1S19SRl9EQl8yR0haLAkJQVI1S19SRjI0MjVfREJfMkdIWn0sCit9OworCisvKiBEZWZhdWx0IG1vZGUgc3BlY2lmaWMgc2V0dGluZ3MKKyAqIFhYWDogYS9hVHVyYm8gPworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9yZmJ1ZmZlciByZmJfMjQyNVtdID0geworCXsgMSwgMHg5OGQ0LAorCS8qICAgICBtb2RlIGEvWFIgIG1vZGUgYVR1cmJvICAgIG1vZGUgYiAgICAgbW9kZSBnICAgIG1vZGUgZ1R1cmJvICovCisJICAgIHsgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCB9IH0sCisJeyAyLCAweDk4ZDAsCisJICAgIHsgMHgwMjAwMTQwOCwgMHgwMjAwMTQwOCwgMHgwMjAwMTQwOCwgMHgwMjAwMTQwOCwgMHgwMjAwMTQwOCB9IH0sCisJeyAzLCAweDk4ZGMsCisJICAgIHsgMHgwMGEwMjBjMCwgMHgwMGEwMjBjMCwgMHgwMGUwMjBjMCwgMHgwMGUwMjBjMCwgMHgwMGUwMjBjMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDEwMDAwMCwgMHgwMDEwMDAwMCwgMHgwMDEwMDAwMCwgMHgwMDEwMDAwMCwgMHgwMDEwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDczMDAwMCwgMHgwMDczMDAwMCwgMHgwMDczMDAwMCwgMHgwMDczMDAwMCwgMHgwMDczMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGY4MDAwMCwgMHgwMGY4MDAwMCwgMHgwMGY4MDAwMCwgMHgwMGY4MDAwMCwgMHgwMGY4MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGU3MDAwMCwgMHgwMGU3MDAwMCwgMHgwMGU3MDAwMCwgMHgwMGU3MDAwMCwgMHgwMGU3MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDE0MDAwMCwgMHgwMDE0MDAwMCwgMHgwMDE0MDAwMCwgMHgwMDE0MDAwMCwgMHgwMDE0MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDkxMDA0MCwgMHgwMDkxMDA0MCwgMHgwMDkxMDA0MCwgMHgwMDkxMDA0MCwgMHgwMDkxMDA0MCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDA3MDAxYSwgMHgwMDA3MDAxYSwgMHgwMDA3MDAxYSwgMHgwMDA3MDAxYSwgMHgwMDA3MDAxYSB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDQxMDAwMCwgMHgwMDQxMDAwMCwgMHgwMDQxMDAwMCwgMHgwMDQxMDAwMCwgMHgwMDQxMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDgxMDAwMCwgMHgwMDgxMDAwMCwgMHgwMDgxMDA2MCwgMHgwMDgxMDA2MCwgMHgwMDgxMDA2MCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAyMDgwMCwgMHgwMDAyMDgwMCwgMHgwMDAyMDgwMywgMHgwMDAyMDgwMywgMHgwMDAyMDgwMyB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMTY2MCwgMHgwMDAwMTY2MCwgMHgwMDAwMTY2MCwgMHgwMDAwMTY2MCwgMHgwMDAwMTY2MCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMTY4OCwgMHgwMDAwMTY4OCwgMHgwMDAwMTY4OCwgMHgwMDAwMTY4OCwgMHgwMDAwMTY4OCB9IH0sCisJeyA2LCAweDk4YzQsCisJICAgIHsgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwNjQwMCwgMHgwMDAwNjQwMCwgMHgwMDAwNjQwMCwgMHgwMDAwNjQwMCwgMHgwMDAwNjQwMCB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDgwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDgwMCB9IH0sCisJeyA3LCAweDk4Y2MsCisJICAgIHsgMHgwMDAwMDAwZSwgMHgwMDAwMDAwZSwgMHgwMDAwMDAwZSwgMHgwMDAwMDAwZSwgMHgwMDAwMDAwZSB9IH0sCit9OworCisvKgorICogVE9ETzogSGFuZGxlIHRoZSBmZXcgZGlmZmVyZW5jZXMgd2l0aCBzd2FuIGR1cmluZworICogYmFuayBtb2RpZmljYXRpb24gYW5kIGdldCByaWQgb2YgdGhpcworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9yZmJ1ZmZlciByZmJfMjMxN1tdID0geworCXsgMSwgMHg5OGQ0LAorCS8qICAgICBtb2RlIGEvWFIgIG1vZGUgYVR1cmJvICAgIG1vZGUgYiAgICAgbW9kZSBnICAgIG1vZGUgZ1R1cmJvICovCisJICAgIHsgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCB9IH0sCisJeyAyLCAweDk4ZDAsCisJICAgIHsgMHgwMjAwMTQwOCwgMHgwMjAxMTQwOCwgMHgwMjAwMTQwOCwgMHgwMjAwMTQwOCwgMHgwMjAxMTQwOCB9IH0sCisJeyAzLCAweDk4ZGMsCisJICAgIHsgMHgwMGEwMjBjMCwgMHgwMGEwMjBjMCwgMHgwMGUwMjBjMCwgMHgwMGUwMjBjMCwgMHgwMGUwMjBjMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCwgMHgwMDJhMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDEwMDAwMCwgMHgwMDEwMDAwMCwgMHgwMDEwMDAwMCwgMHgwMDEwMDAwMCwgMHgwMDEwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDczMDAwMCwgMHgwMDczMDAwMCwgMHgwMDczMDAwMCwgMHgwMDczMDAwMCwgMHgwMDczMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGY4MDAwMCwgMHgwMGY4MDAwMCwgMHgwMGY4MDAwMCwgMHgwMGY4MDAwMCwgMHgwMGY4MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMGU3MDAwMCwgMHgwMGU3MDAwMCwgMHgwMGU3MDAwMCwgMHgwMGU3MDAwMCwgMHgwMGU3MDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDE0MDEwMCwgMHgwMDE0MDEwMCwgMHgwMDE0MDEwMCwgMHgwMDE0MDEwMCwgMHgwMDE0MDEwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDkxMDA0MCwgMHgwMDkxMDA0MCwgMHgwMDkxMDA0MCwgMHgwMDkxMDA0MCwgMHgwMDkxMDA0MCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDA3MDAxYSwgMHgwMDA3MDAxYSwgMHgwMDA3MDAxYSwgMHgwMDA3MDAxYSwgMHgwMDA3MDAxYSB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDQxMDAwMCwgMHgwMDQxMDAwMCwgMHgwMDQxMDAwMCwgMHgwMDQxMDAwMCwgMHgwMDQxMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDgxMDAwMCwgMHgwMDgxMDAwMCwgMHgwMDgxMDA2MCwgMHgwMDgxMDA2MCwgMHgwMDgxMDA2MCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAyMDgwMCwgMHgwMDAyMDgwMCwgMHgwMDAyMDgwMywgMHgwMDAyMDgwMywgMHgwMDAyMDgwMyB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMTY2MCwgMHgwMDAwMTY2MCwgMHgwMDAwMTY2MCwgMHgwMDAwMTY2MCwgMHgwMDAwMTY2MCB9IH0sCisJeyA2LCAweDk4OWMsCisJICAgIHsgMHgwMDAwOTY4OCwgMHgwMDAwOTY4OCwgMHgwMDAwOTY4OCwgMHgwMDAwOTY4OCwgMHgwMDAwOTY4OCB9IH0sCisJeyA2LCAweDk4YzQsCisJICAgIHsgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwNjQwMCwgMHgwMDAwNjQwMCwgMHgwMDAwNjQwMCwgMHgwMDAwNjQwMCwgMHgwMDAwNjQwMCB9IH0sCisJeyA3LCAweDk4OWMsCisJICAgIHsgMHgwMDAwMDgwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDgwMCB9IH0sCisJeyA3LCAweDk4Y2MsCisJICAgIHsgMHgwMDAwMDAwZSwgMHgwMDAwMDAwZSwgMHgwMDAwMDAwZSwgMHgwMDAwMDAwZSwgMHgwMDAwMDAwZSB9IH0sCit9OworCisvKgorICogVE9ETzogSGFuZGxlIHRoZSBmZXcgZGlmZmVyZW5jZXMgd2l0aCBzd2FuIGR1cmluZworICogYmFuayBtb2RpZmljYXRpb24gYW5kIGdldCByaWQgb2YgdGhpcworICogWFhYOiBhL2FUdXJibyA/CisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmYnVmZmVyIHJmYl8yNDE3W10gPSB7CisJeyAxLCAweDk4ZDQsCisJLyogICAgIG1vZGUgYS9YUiAgbW9kZSBhVHVyYm8gICAgbW9kZSBiICAgICBtb2RlIGcgICAgbW9kZSBnVHVyYm8gKi8KKwkgICAgeyAweDAwMDAwMDIwLCAweDAwMDAwMDIwLCAweDAwMDAwMDIwLCAweDAwMDAwMDIwLCAweDAwMDAwMDIwIH0gfSwKKwl7IDIsIDB4OThkMCwKKwkgICAgeyAweDAyMDAxNDA4LCAweDAyMDAxNDA4LCAweDAyMDAxNDA4LCAweDAyMDAxNDA4LCAweDAyMDAxNDA4IH0gfSwKKwl7IDMsIDB4OThkYywKKwkgICAgeyAweDAwYTAyMGMwLCAweDAwYTAyMGMwLCAweDAwZTAyMGMwLCAweDAwZTAyMGMwLCAweDAwZTAyMGMwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDEwMDAwMDAwLCAweDEwMDAwMDAwLCAweDEwMDAwMDAwLCAweDEwMDAwMDAwLCAweDEwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMmEwMDAwLCAweDAwMmEwMDAwLCAweDAwMmEwMDAwLCAweDAwMmEwMDAwLCAweDAwMmEwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMTAwMDAwLCAweDAwMTAwMDAwLCAweDAwMTAwMDAwLCAweDAwMTAwMDAwLCAweDAwMTAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDIwMDAwLCAweDAwMDIwMDAwLCAweDAwMDIwMDAwLCAweDAwMDIwMDAwLCAweDAwMDIwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwNzMwMDAwLCAweDAwNzMwMDAwLCAweDAwNzMwMDAwLCAweDAwNzMwMDAwLCAweDAwNzMwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwZjgwMDAwLCAweDAwZjgwMDAwLCAweDAwZjgwMDAwLCAweDAwZjgwMDAwLCAweDAwZjgwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwZTcwMDAwLCAweDAwZTcwMDAwLCAweDgwZTcwMDAwLCAweDgwZTcwMDAwLCAweDAwZTcwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMTQwMDAwLCAweDAwMTQwMDAwLCAweDAwMTQwMDAwLCAweDAwMTQwMDAwLCAweDAwMTQwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwOTEwMDQwLCAweDAwOTEwMDQwLCAweDAwOTEwMDQwLCAweDAwOTEwMDQwLCAweDAwOTEwMDQwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDcwMDFhLCAweDAwMDcwMDFhLCAweDAyMDcwMDFhLCAweDAyMDcwMDFhLCAweDAwMDcwMDFhIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwNDEwMDAwLCAweDAwNDEwMDAwLCAweDAwNDEwMDAwLCAweDAwNDEwMDAwLCAweDAwNDEwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwODEwMDAwLCAweDAwODEwMDAwLCAweDAwODEwMDYwLCAweDAwODEwMDYwLCAweDAwODEwMDYwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDIwODAwLCAweDAwMDIwODAwLCAweDAwMDIwODAzLCAweDAwMDIwODAzLCAweDAwMDIwODAzIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAxNjYwLCAweDAwMDAxNjYwLCAweDAwMDAxNjYwLCAweDAwMDAxNjYwLCAweDAwMDAxNjYwIH0gfSwKKwl7IDYsIDB4OTg5YywKKwkgICAgeyAweDAwMDAxNjg4LCAweDAwMDAxNjg4LCAweDAwMDAxNjg4LCAweDAwMDAxNjg4LCAweDAwMDAxNjg4IH0gfSwKKwl7IDYsIDB4OThjNCwKKwkgICAgeyAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxIH0gfSwKKwl7IDcsIDB4OTg5YywKKwkgICAgeyAweDAwMDA2NDAwLCAweDAwMDA2NDAwLCAweDAwMDA2NDAwLCAweDAwMDA2NDAwLCAweDAwMDA2NDAwIH0gfSwKKwl7IDcsIDB4OTg5YywKKwkgICAgeyAweDAwMDAwODAwLCAweDAwMDAwODAwLCAweDAwMDAwODAwLCAweDAwMDAwODAwLCAweDAwMDAwODAwIH0gfSwKKwl7IDcsIDB4OThjYywKKwkgICAgeyAweDAwMDAwMDBlLCAweDAwMDAwMDBlLCAweDAwMDAwMDBlLCAweDAwMDAwMDBlLCAweDAwMDAwMDBlIH0gfSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9yZmdhaW4uaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0aDVrL3JmZ2Fpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNTRkOGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGg1ay9yZmdhaW4uaApAQCAtMCwwICsxLDUxNiBAQAorLyoKKyAqIFJGIEdhaW4gb3B0aW1pemF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDkgUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDkgTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCisvKgorICogTW9kZS1zcGVjaWZpYyBSRiBHYWluIHRhYmxlICg2NGJ5dGVzKSBmb3IgUkY1MTExLzUxMTIKKyAqIChSRjUxMTAgb25seSBjb21lcyB3aXRoIEFSNTIxMCBhbmQgb25seSBzdXBwb3J0cyBhL3R1cmJvIGEgbW9kZSBzbyBpbml0aWFsCisgKiBSRiBHYWluIHZhbHVlcyBhcmUgaW5jbHVkZWQgaW4gQVI1S19BUjUyMTBfSU5JKQorICovCitzdHJ1Y3QgYXRoNWtfaW5pX3JmZ2FpbiB7CisJdTE2CXJmZ19yZWdpc3RlcjsJLyogUkYgR2FpbiByZWdpc3RlciBhZGRyZXNzICovCisJdTMyCXJmZ192YWx1ZVsyXTsJLyogW2ZyZXEgKHNlZSBiZWxvdyldICovCit9OworCisvKiBJbml0aWFsIFJGIEdhaW4gc2V0dGluZ3MgZm9yIFJGNTExMSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZnYWluIHJmZ2Fpbl81MTExW10gPSB7CisJLyoJCQkgICAgICA1R2h6CTJHaHoJKi8KKwl7IEFSNUtfUkZfR0FJTigwKSwJeyAweDAwMDAwMWE5LCAweDAwMDAwMDAwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxKSwJeyAweDAwMDAwMWU5LCAweDAwMDAwMDQwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyKSwJeyAweDAwMDAwMDI5LCAweDAwMDAwMDgwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzKSwJeyAweDAwMDAwMDY5LCAweDAwMDAwMTUwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0KSwJeyAweDAwMDAwMTk5LCAweDAwMDAwMTkwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1KSwJeyAweDAwMDAwMWQ5LCAweDAwMDAwMWQwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig2KSwJeyAweDAwMDAwMDE5LCAweDAwMDAwMDEwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig3KSwJeyAweDAwMDAwMDU5LCAweDAwMDAwMDQ0IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig4KSwJeyAweDAwMDAwMDk5LCAweDAwMDAwMDg0IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig5KSwJeyAweDAwMDAwMWE1LCAweDAwMDAwMTQ4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxMCksCXsgMHgwMDAwMDFlNSwgMHgwMDAwMDE4OCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTEpLAl7IDB4MDAwMDAwMjUsIDB4MDAwMDAxYzggfSB9LAorCXsgQVI1S19SRl9HQUlOKDEyKSwJeyAweDAwMDAwMWM4LCAweDAwMDAwMDE0IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxMyksCXsgMHgwMDAwMDAwOCwgMHgwMDAwMDA0MiB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTQpLAl7IDB4MDAwMDAwNDgsIDB4MDAwMDAwODIgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE1KSwJeyAweDAwMDAwMDg4LCAweDAwMDAwMTc4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNiksCXsgMHgwMDAwMDE5OCwgMHgwMDAwMDFiOCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTcpLAl7IDB4MDAwMDAxZDgsIDB4MDAwMDAxZjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDE4KSwJeyAweDAwMDAwMDE4LCAweDAwMDAwMDEyIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxOSksCXsgMHgwMDAwMDA1OCwgMHgwMDAwMDA1MiB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjApLAl7IDB4MDAwMDAwOTgsIDB4MDAwMDAwOTIgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIxKSwJeyAweDAwMDAwMWE0LCAweDAwMDAwMTdjIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMiksCXsgMHgwMDAwMDFlNCwgMHgwMDAwMDFiYyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjMpLAl7IDB4MDAwMDAwMjQsIDB4MDAwMDAxZmMgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI0KSwJeyAweDAwMDAwMDY0LCAweDAwMDAwMDBhIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyNSksCXsgMHgwMDAwMDBhNCwgMHgwMDAwMDA0YSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjYpLAl7IDB4MDAwMDAwZTQsIDB4MDAwMDAwOGEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI3KSwJeyAweDAwMDAwMTBhLCAweDAwMDAwMTVhIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyOCksCXsgMHgwMDAwMDE0YSwgMHgwMDAwMDE5YSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjkpLAl7IDB4MDAwMDAxOGEsIDB4MDAwMDAxZGEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDMwKSwJeyAweDAwMDAwMWNhLCAweDAwMDAwMDBlIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzMSksCXsgMHgwMDAwMDAwYSwgMHgwMDAwMDA0ZSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzIpLAl7IDB4MDAwMDAwNGEsIDB4MDAwMDAwOGUgfSB9LAorCXsgQVI1S19SRl9HQUlOKDMzKSwJeyAweDAwMDAwMDhhLCAweDAwMDAwMTVlIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzNCksCXsgMHgwMDAwMDFiYSwgMHgwMDAwMDE5ZSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzUpLAl7IDB4MDAwMDAxZmEsIDB4MDAwMDAxZGUgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM2KSwJeyAweDAwMDAwMDNhLCAweDAwMDAwMDA5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzNyksCXsgMHgwMDAwMDA3YSwgMHgwMDAwMDA0OSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzgpLAl7IDB4MDAwMDAxODYsIDB4MDAwMDAwODkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM5KSwJeyAweDAwMDAwMWM2LCAweDAwMDAwMTc5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0MCksCXsgMHgwMDAwMDAwNiwgMHgwMDAwMDFiOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDEpLAl7IDB4MDAwMDAwNDYsIDB4MDAwMDAxZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQyKSwJeyAweDAwMDAwMDg2LCAweDAwMDAwMDM5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0MyksCXsgMHgwMDAwMDBjNiwgMHgwMDAwMDA3OSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDQpLAl7IDB4MDAwMDAwYzYsIDB4MDAwMDAwYjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ1KSwJeyAweDAwMDAwMGM2LCAweDAwMDAwMWJkIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NiksCXsgMHgwMDAwMDBjNiwgMHgwMDAwMDFmZCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDcpLAl7IDB4MDAwMDAwYzYsIDB4MDAwMDAwM2QgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ4KSwJeyAweDAwMDAwMGM2LCAweDAwMDAwMDdkIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0OSksCXsgMHgwMDAwMDBjNiwgMHgwMDAwMDBiZCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTApLAl7IDB4MDAwMDAwYzYsIDB4MDAwMDAwZmQgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUxKSwJeyAweDAwMDAwMGM2LCAweDAwMDAwMGZkIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MiksCXsgMHgwMDAwMDBjNiwgMHgwMDAwMDBmZCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTMpLAl7IDB4MDAwMDAwYzYsIDB4MDAwMDAwZmQgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU0KSwJeyAweDAwMDAwMGM2LCAweDAwMDAwMGZkIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1NSksCXsgMHgwMDAwMDBjNiwgMHgwMDAwMDBmZCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTYpLAl7IDB4MDAwMDAwYzYsIDB4MDAwMDAwZmQgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU3KSwJeyAweDAwMDAwMGM2LCAweDAwMDAwMGZkIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1OCksCXsgMHgwMDAwMDBjNiwgMHgwMDAwMDBmZCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTkpLAl7IDB4MDAwMDAwYzYsIDB4MDAwMDAwZmQgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYwKSwJeyAweDAwMDAwMGM2LCAweDAwMDAwMGZkIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig2MSksCXsgMHgwMDAwMDBjNiwgMHgwMDAwMDBmZCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjIpLAl7IDB4MDAwMDAwYzYsIDB4MDAwMDAwZmQgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYzKSwJeyAweDAwMDAwMGM2LCAweDAwMDAwMGZkIH0gfSwKK307CisKKy8qIEluaXRpYWwgUkYgR2FpbiBzZXR0aW5ncyBmb3IgUkY1MTEyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9yZmdhaW4gcmZnYWluXzUxMTJbXSA9IHsKKwkvKgkJCSAgICAgIDVHaHoJMkdoegkqLworCXsgQVI1S19SRl9HQUlOKDApLAl7IDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcgfSB9LAorCXsgQVI1S19SRl9HQUlOKDEpLAl7IDB4MDAwMDAwNDcsIDB4MDAwMDAwNDcgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIpLAl7IDB4MDAwMDAwODcsIDB4MDAwMDAwODcgfSB9LAorCXsgQVI1S19SRl9HQUlOKDMpLAl7IDB4MDAwMDAxYTAsIDB4MDAwMDAxYTAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQpLAl7IDB4MDAwMDAxZTAsIDB4MDAwMDAxZTAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUpLAl7IDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYpLAl7IDB4MDAwMDAwNjAsIDB4MDAwMDAwNjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDcpLAl7IDB4MDAwMDAxYTEsIDB4MDAwMDAxYTEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDgpLAl7IDB4MDAwMDAxZTEsIDB4MDAwMDAxZTEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDkpLAl7IDB4MDAwMDAwMjEsIDB4MDAwMDAwMjEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDEwKSwJeyAweDAwMDAwMDYxLCAweDAwMDAwMDYxIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxMSksCXsgMHgwMDAwMDE2MiwgMHgwMDAwMDE2MiB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTIpLAl7IDB4MDAwMDAxYTIsIDB4MDAwMDAxYTIgfSB9LAorCXsgQVI1S19SRl9HQUlOKDEzKSwJeyAweDAwMDAwMWUyLCAweDAwMDAwMWUyIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNCksCXsgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTUpLAl7IDB4MDAwMDAwNjIsIDB4MDAwMDAwNjIgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE2KSwJeyAweDAwMDAwMTYzLCAweDAwMDAwMTYzIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNyksCXsgMHgwMDAwMDFhMywgMHgwMDAwMDFhMyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTgpLAl7IDB4MDAwMDAxZTMsIDB4MDAwMDAxZTMgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE5KSwJeyAweDAwMDAwMDIzLCAweDAwMDAwMDIzIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMCksCXsgMHgwMDAwMDA2MywgMHgwMDAwMDA2MyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjEpLAl7IDB4MDAwMDAxODQsIDB4MDAwMDAxODQgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIyKSwJeyAweDAwMDAwMWM0LCAweDAwMDAwMWM0IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMyksCXsgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjQpLAl7IDB4MDAwMDAxZWEsIDB4MDAwMDAwMGIgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI1KSwJeyAweDAwMDAwMDJhLCAweDAwMDAwMDRiIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyNiksCXsgMHgwMDAwMDA2YSwgMHgwMDAwMDA4YiB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjcpLAl7IDB4MDAwMDAwYWEsIDB4MDAwMDAxYWMgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI4KSwJeyAweDAwMDAwMWFiLCAweDAwMDAwMWVjIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyOSksCXsgMHgwMDAwMDFlYiwgMHgwMDAwMDAyYyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzApLAl7IDB4MDAwMDAwMmIsIDB4MDAwMDAwMTIgfSB9LAorCXsgQVI1S19SRl9HQUlOKDMxKSwJeyAweDAwMDAwMDZiLCAweDAwMDAwMDUyIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzMiksCXsgMHgwMDAwMDBhYiwgMHgwMDAwMDA5MiB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzMpLAl7IDB4MDAwMDAxYWMsIDB4MDAwMDAxOTMgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM0KSwJeyAweDAwMDAwMWVjLCAweDAwMDAwMWQzIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzNSksCXsgMHgwMDAwMDAyYywgMHgwMDAwMDAxMyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzYpLAl7IDB4MDAwMDAwM2EsIDB4MDAwMDAwNTMgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM3KSwJeyAweDAwMDAwMDdhLCAweDAwMDAwMDkzIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzOCksCXsgMHgwMDAwMDBiYSwgMHgwMDAwMDE5NCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzkpLAl7IDB4MDAwMDAxYmIsIDB4MDAwMDAxZDQgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQwKSwJeyAweDAwMDAwMWZiLCAweDAwMDAwMDE0IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0MSksCXsgMHgwMDAwMDAzYiwgMHgwMDAwMDAzYSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDIpLAl7IDB4MDAwMDAwN2IsIDB4MDAwMDAwN2EgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQzKSwJeyAweDAwMDAwMGJiLCAweDAwMDAwMGJhIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NCksCXsgMHgwMDAwMDFiYywgMHgwMDAwMDFiYiB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDUpLAl7IDB4MDAwMDAxZmMsIDB4MDAwMDAxZmIgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ2KSwJeyAweDAwMDAwMDNjLCAweDAwMDAwMDNiIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NyksCXsgMHgwMDAwMDA3YywgMHgwMDAwMDA3YiB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDgpLAl7IDB4MDAwMDAwYmMsIDB4MDAwMDAwYmIgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ5KSwJeyAweDAwMDAwMGZjLCAweDAwMDAwMWJjIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MCksCXsgMHgwMDAwMDBmYywgMHgwMDAwMDFmYyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTEpLAl7IDB4MDAwMDAwZmMsIDB4MDAwMDAwM2MgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUyKSwJeyAweDAwMDAwMGZjLCAweDAwMDAwMDdjIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MyksCXsgMHgwMDAwMDBmYywgMHgwMDAwMDBiYyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTQpLAl7IDB4MDAwMDAwZmMsIDB4MDAwMDAwZmMgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU1KSwJeyAweDAwMDAwMGZjLCAweDAwMDAwMGZjIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1NiksCXsgMHgwMDAwMDBmYywgMHgwMDAwMDBmYyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTcpLAl7IDB4MDAwMDAwZmMsIDB4MDAwMDAwZmMgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU4KSwJeyAweDAwMDAwMGZjLCAweDAwMDAwMGZjIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1OSksCXsgMHgwMDAwMDBmYywgMHgwMDAwMDBmYyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjApLAl7IDB4MDAwMDAwZmMsIDB4MDAwMDAwZmMgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYxKSwJeyAweDAwMDAwMGZjLCAweDAwMDAwMGZjIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig2MiksCXsgMHgwMDAwMDBmYywgMHgwMDAwMDBmYyB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjMpLAl7IDB4MDAwMDAwZmMsIDB4MDAwMDAwZmMgfSB9LAorfTsKKworLyogSW5pdGlhbCBSRiBHYWluIHNldHRpbmdzIGZvciBSRjI0MTMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmZ2FpbiByZmdhaW5fMjQxM1tdID0geworCXsgQVI1S19SRl9HQUlOKDApLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDEpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNDAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwODAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDMpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxODEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxYzEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNDEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDcpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwODEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDgpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxNjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDkpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxYTggfSB9LAorCXsgQVI1S19SRl9HQUlOKDEwKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMWU4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxMSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAyOCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTIpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDEzKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMTg5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDFjOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTUpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE2KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDQ5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA4OSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTgpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxOTAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE5KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMWQwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjEpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNTAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIyKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDkwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDE5MSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjQpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxZDEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI1KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDExIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyNiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA1MSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjcpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwOTEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI4KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMTc4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyOSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDFiOCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzApLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxZjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDMxKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDM4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzMiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA3OCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzMpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxOTkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM0KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMWQ5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzNSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAxOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzYpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNTkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM3KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDk5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzOCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBkOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzkpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQwKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0MSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDIpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQzKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDUpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ2KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDgpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ5KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTEpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUyKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTQpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU1KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1NiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTcpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU4KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1OSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjApLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYxKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig2MiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjMpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorfTsKKworLyogSW5pdGlhbCBSRiBHYWluIHNldHRpbmdzIGZvciBBUjIzMTYgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmZ2FpbiByZmdhaW5fMjMxNltdID0geworCXsgQVI1S19SRl9HQUlOKDApLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDEpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNDAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwODAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDMpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwYzAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZTAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZTAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxMjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDcpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxMjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDgpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxMjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDkpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxNjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDEwKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMWE4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxMSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDFlOCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTIpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDEzKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDY4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBhOCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTUpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZTggfSB9LAorCXsgQVI1S19SRl9HQUlOKDE2KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGU4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDEzMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTgpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxMzAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE5KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMTcwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDFiMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjEpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIyKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDMwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA3MCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjQpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwYjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI1KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyNiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjcpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI4KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyOSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzApLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDMxKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzMiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzMpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM0KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzNSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzYpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM3KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzOCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzkpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQwKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0MSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDIpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQzKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDUpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ2KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDgpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ5KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTEpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUyKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTQpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU1KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1NiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTcpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU4KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1OSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjApLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYxKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig2MiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjMpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjAgfSB9LAorfTsKKworCisvKiBJbml0aWFsIFJGIEdhaW4gc2V0dGluZ3MgZm9yIFJGNTQxMyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZnYWluIHJmZ2Fpbl81NDEzW10gPSB7CisJLyoJCQkgICAgICA1R2h6CTJHaHoJKi8KKwl7IEFSNUtfUkZfR0FJTigwKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxKSwJeyAweDAwMDAwMDQwLCAweDAwMDAwMDQwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyKSwJeyAweDAwMDAwMDgwLCAweDAwMDAwMDgwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzKSwJeyAweDAwMDAwMWExLCAweDAwMDAwMTYxIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0KSwJeyAweDAwMDAwMWUxLCAweDAwMDAwMWExIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1KSwJeyAweDAwMDAwMDIxLCAweDAwMDAwMWUxIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig2KSwJeyAweDAwMDAwMDYxLCAweDAwMDAwMDIxIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig3KSwJeyAweDAwMDAwMTg4LCAweDAwMDAwMDYxIH0gfSwKKwl7IEFSNUtfUkZfR0FJTig4KSwJeyAweDAwMDAwMWM4LCAweDAwMDAwMTg4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig5KSwJeyAweDAwMDAwMDA4LCAweDAwMDAwMWM4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxMCksCXsgMHgwMDAwMDA0OCwgMHgwMDAwMDAwOCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTEpLAl7IDB4MDAwMDAwODgsIDB4MDAwMDAwNDggfSB9LAorCXsgQVI1S19SRl9HQUlOKDEyKSwJeyAweDAwMDAwMWE5LCAweDAwMDAwMDg4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxMyksCXsgMHgwMDAwMDFlOSwgMHgwMDAwMDE2OSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTQpLAl7IDB4MDAwMDAwMjksIDB4MDAwMDAxYTkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE1KSwJeyAweDAwMDAwMDY5LCAweDAwMDAwMWU5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNiksCXsgMHgwMDAwMDFkMCwgMHgwMDAwMDAyOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTcpLAl7IDB4MDAwMDAwMTAsIDB4MDAwMDAwNjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE4KSwJeyAweDAwMDAwMDUwLCAweDAwMDAwMTkwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxOSksCXsgMHgwMDAwMDA5MCwgMHgwMDAwMDFkMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjApLAl7IDB4MDAwMDAxYjEsIDB4MDAwMDAwMTAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIxKSwJeyAweDAwMDAwMWYxLCAweDAwMDAwMDUwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMiksCXsgMHgwMDAwMDAzMSwgMHgwMDAwMDA5MCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjMpLAl7IDB4MDAwMDAwNzEsIDB4MDAwMDAxNzEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI0KSwJeyAweDAwMDAwMWI4LCAweDAwMDAwMWIxIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyNSksCXsgMHgwMDAwMDFmOCwgMHgwMDAwMDFmMSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjYpLAl7IDB4MDAwMDAwMzgsIDB4MDAwMDAwMzEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI3KSwJeyAweDAwMDAwMDc4LCAweDAwMDAwMDcxIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyOCksCXsgMHgwMDAwMDE5OSwgMHgwMDAwMDE5OCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjkpLAl7IDB4MDAwMDAxZDksIDB4MDAwMDAxZDggfSB9LAorCXsgQVI1S19SRl9HQUlOKDMwKSwJeyAweDAwMDAwMDE5LCAweDAwMDAwMDE4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzMSksCXsgMHgwMDAwMDA1OSwgMHgwMDAwMDA1OCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzIpLAl7IDB4MDAwMDAwOTksIDB4MDAwMDAwOTggfSB9LAorCXsgQVI1S19SRl9HQUlOKDMzKSwJeyAweDAwMDAwMGQ5LCAweDAwMDAwMTc5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzNCksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDFiOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzUpLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAxZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM2KSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMDM5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzNyksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDA3OSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzgpLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAwYjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM5KSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0MCksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDEpLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQyKSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0MyksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDQpLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ1KSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NiksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDcpLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ4KSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0OSksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTApLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUxKSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MiksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTMpLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU0KSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1NSksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTYpLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU3KSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1OCksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTkpLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYwKSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig2MSksCXsgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjIpLAl7IDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYzKSwJeyAweDAwMDAwMGY5LCAweDAwMDAwMGY5IH0gfSwKK307CisKKworLyogSW5pdGlhbCBSRiBHYWluIHNldHRpbmdzIGZvciBSRjI0MjUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmZ2FpbiByZmdhaW5fMjQyNVtdID0geworCXsgQVI1S19SRl9HQUlOKDApLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDEpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNDAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwODAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDMpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxODEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxYzEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNDEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDcpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwODEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDgpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxODggfSB9LAorCXsgQVI1S19SRl9HQUlOKDkpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxYzggfSB9LAorCXsgQVI1S19SRl9HQUlOKDEwKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDA4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxMSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA0OCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTIpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwODggfSB9LAorCXsgQVI1S19SRl9HQUlOKDEzKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMTg5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDFjOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTUpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE2KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDQ5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigxNyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA4OSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMTgpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxYjAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDE5KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMWYwIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAzMCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjEpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNzAgfSB9LAorCXsgQVI1S19SRl9HQUlOKDIyKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMTcxIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyMyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDFiMSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjQpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxZjEgfSB9LAorCXsgQVI1S19SRl9HQUlOKDI1KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDMxIH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyNiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA3MSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMjcpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxYjggfSB9LAorCXsgQVI1S19SRl9HQUlOKDI4KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMWY4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigyOSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAzOCB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzApLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwNzggfSB9LAorCXsgQVI1S19SRl9HQUlOKDMxKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGI4IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzMiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDFiOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzMpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAxZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM0KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDM5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzNSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA3OSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzYpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwYjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDM3KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTigzOCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oMzkpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQwKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0MSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDIpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQzKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDUpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ2KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig0NyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNDgpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDQ5KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MCksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTEpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDUyKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1MyksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTQpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU1KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1NiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNTcpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDU4KSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig1OSksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjApLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorCXsgQVI1S19SRl9HQUlOKDYxKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMGY5IH0gfSwKKwl7IEFSNUtfUkZfR0FJTig2MiksCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDBmOSB9IH0sCisJeyBBUjVLX1JGX0dBSU4oNjMpLAl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwZjkgfSB9LAorfTsKKworI2RlZmluZSBBUjVLX0dBSU5fQ1JOX0ZJWF9CSVRTXzUxMTEJCTQKKyNkZWZpbmUgQVI1S19HQUlOX0NSTl9GSVhfQklUU181MTEyCQk3CisjZGVmaW5lIEFSNUtfR0FJTl9DUk5fTUFYX0ZJWF9CSVRTCQlBUjVLX0dBSU5fQ1JOX0ZJWF9CSVRTXzUxMTIKKyNkZWZpbmUgQVI1S19HQUlOX0RZTl9BREpVU1RfSElfTUFSR0lOCQkxNQorI2RlZmluZSBBUjVLX0dBSU5fRFlOX0FESlVTVF9MT19NQVJHSU4JCTIwCisjZGVmaW5lIEFSNUtfR0FJTl9DQ0tfUFJPQkVfQ09SUgkJNQorI2RlZmluZSBBUjVLX0dBSU5fQ0NLX09GRE1fR0FJTl9ERUxUQQkJMTUKKyNkZWZpbmUgQVI1S19HQUlOX1NURVBfQ09VTlQJCQkxMAorCisvKiBDaGVjayBpZiBvdXIgY3VycmVudCBtZWFzdXJlbWVudCBpcyBpbnNpZGUgb3VyCisgKiBjdXJyZW50IHZhcmlhYmxlIGF0dGVudWF0aW9uIHdpbmRvdyAqLworI2RlZmluZSBBUjVLX0dBSU5fQ0hFQ0tfQURKVVNUKF9nKSAJCVwKKwkoKF9nKS0+Z19jdXJyZW50IDw9IChfZyktPmdfbG93IHx8IChfZyktPmdfY3VycmVudCA+PSAoX2cpLT5nX2hpZ2gpCisKK3N0cnVjdCBhdGg1a19nYWluX29wdF9zdGVwIHsKKwlzOAkJCQlnb3NfcGFyYW1bQVI1S19HQUlOX0NSTl9NQVhfRklYX0JJVFNdOworCXM4CQkJCWdvc19nYWluOworfTsKKworc3RydWN0IGF0aDVrX2dhaW5fb3B0IHsKKwl1OAkJCQlnb19kZWZhdWx0OworCXU4CQkJCWdvX3N0ZXBzX2NvdW50OworCWNvbnN0IHN0cnVjdCBhdGg1a19nYWluX29wdF9zdGVwCWdvX3N0ZXBbQVI1S19HQUlOX1NURVBfQ09VTlRdOworfTsKKworLyoKKyAqIFBhcmFtZXRlcnMgb24gZ29zX3BhcmFtOgorICogMSkgVHggY2xpcCBQSFkgcmVnaXN0ZXIKKyAqIDIpIFBXRCA5MCBSRiByZWdpc3RlcgorICogMykgUFdEIDg0IFJGIHJlZ2lzdGVyCisgKiA0KSBSRkdhaW5TZWwgUkYgcmVnaXN0ZXIKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19nYWluX29wdCByZmdhaW5fb3B0XzUxMTEgPSB7CisJNCwKKwk5LAorCXsKKwkJeyB7IDQsIDEsIDEsIDEgfSwgNiB9LAorCQl7IHsgNCwgMCwgMSwgMSB9LCA0IH0sCisJCXsgeyAzLCAxLCAxLCAxIH0sIDMgfSwKKwkJeyB7IDQsIDAsIDAsIDEgfSwgMSB9LAorCQl7IHsgNCwgMSwgMSwgMCB9LCAwIH0sCisJCXsgeyA0LCAwLCAxLCAwIH0sIC0yIH0sCisJCXsgeyAzLCAxLCAxLCAwIH0sIC0zIH0sCisJCXsgeyA0LCAwLCAwLCAwIH0sIC00IH0sCisJCXsgeyAyLCAxLCAxLCAwIH0sIC02IH0KKwl9Cit9OworCisvKgorICogUGFyYW1ldGVycyBvbiBnb3NfcGFyYW06CisgKiAxKSBNaXhnYWluIG92ciBSRiByZWdpc3RlcgorICogMikgUFdEIDEzOCBSRiByZWdpc3RlcgorICogMykgUFdEIDEzNyBSRiByZWdpc3RlcgorICogNCkgUFdEIDEzNiBSRiByZWdpc3RlcgorICogNSkgUFdEIDEzMiBSRiByZWdpc3RlcgorICogNikgUFdEIDEzMSBSRiByZWdpc3RlcgorICogNykgUFdEIDEzMCBSRiByZWdpc3RlcgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0IHJmZ2Fpbl9vcHRfNTExMiA9IHsKKwkxLAorCTgsCisJeworCQl7IHsgMywgMCwgMCwgMCwgMCwgMCwgMCB9LCA2IH0sCisJCXsgeyAyLCAwLCAwLCAwLCAwLCAwLCAwIH0sIDAgfSwKKwkJeyB7IDEsIDAsIDAsIDAsIDAsIDAsIDAgfSwgLTMgfSwKKwkJeyB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgLTYgfSwKKwkJeyB7IDAsIDEsIDEsIDAsIDAsIDAsIDAgfSwgLTggfSwKKwkJeyB7IDAsIDEsIDEsIDAsIDEsIDEsIDAgfSwgLTEwIH0sCisJCXsgeyAwLCAxLCAwLCAxLCAxLCAxLCAwIH0sIC0xMyB9LAorCQl7IHsgMCwgMSwgMCwgMSwgMSwgMCwgMSB9LCAtMTYgfSwKKwl9Cit9OworCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9hdGwxZS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRsMWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzBiMDUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRsMWUuYwpAQCAtMCwwICsxLDE3NTggQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAwNyBBdGhlcm9zIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERlcml2ZWQgZnJvbSBJbnRlbCBlMTAwMCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBNb2RpZmllZCBmb3IgZ1BYRSwgT2N0b2JlciAyMDA5IGJ5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgImF0bDFlLmgiCisKKy8qIFVzZXItdHdlYWthYmxlIHBhcmFtZXRlcnM6ICovCisjZGVmaW5lIFRYX0RFU0NfQ09VTlQJMzIJLyogVFggZGVzY3JpcHRvcnMsIG1pbmltdW0gMzIgKi8KKyNkZWZpbmUgUlhfTUVNX1NJWkUJODE5MgkvKiBSWCBhcmVhIHNpemUsIG1pbmltdW0gOGtiICovCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFCTE1MDAJLyogTWF4aW11bSBNVFUgc3VwcG9ydGVkLCBtaW5pbXVtIDE1MDAgKi8KKworLyogQXJjYW5lIHBhcmFtZXRlcnM6ICovCisjZGVmaW5lIFBSRUFNQkxFX0xFTgk3CisjZGVmaW5lIFJYX0pVTUJPX1RIUkVTSAkoKE1BWF9GUkFNRV9TSVpFICsgRVRIX0hMRU4gKyBcCisJCQkgIFZMQU5fSExFTiArIEVUSF9GQ1NfTEVOICsgNykgPj4gMykKKyNkZWZpbmUgSU1UX1ZBTAkJMTAwCS8qIGludGVycnVwdCBtb2RlcmF0b3IgdGltZXIsIHVzICovCisjZGVmaW5lIElDVF9WQUwJCTUwMDAwCS8qIGludGVycnVwdCBjbGVhciB0aW1lciwgdXMgKi8KKyNkZWZpbmUgU01CX1RJTUVSCTIwMDAwMAorI2RlZmluZSBSUkRfVEhSRVNICTEJLyogcGFja2V0cyB0byBxdWV1ZSBiZWZvcmUgaW50ZXJydXB0ICovCisjZGVmaW5lIFRQRF9CVVJTVAk1CisjZGVmaW5lIFRQRF9USFJFU0gJKFRYX0RFU0NfQ09VTlQgLyAyKQorI2RlZmluZSBSWF9DT1VOVF9ET1dOCTQKKyNkZWZpbmUgVFhfQ09VTlRfRE9XTgkoSU1UX1ZBTCAqIDQgLyAzKQorI2RlZmluZSBETUFSX0RMWV9DTlQJMTUKKyNkZWZpbmUgRE1BV19ETFlfQ05UCTQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUVEFOU0lDX0wxRSAgICAgIDB4MTAyNgorCisvKgorICogYXRsMWVfcGNpX3RibCAtIFBDSSBEZXZpY2UgSUQgVGFibGUKKyAqCisgKiBXaWxkY2FyZCBlbnRyaWVzIChQQ0lfQU5ZX0lEKSBzaG91bGQgY29tZSBsYXN0CisgKiBMYXN0IGVudHJ5IG11c3QgYmUgYWxsIDBzCisgKgorICogeyBWZW5kb3IgSUQsIERldmljZSBJRCwgU3ViVmVuZG9yIElELCBTdWJEZXZpY2UgSUQsCisgKiAgIENsYXNzLCBDbGFzcyBNYXNrLCBwcml2YXRlIGRhdGEgKG5vdCB1c2VkKSB9CisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdGwxZV9wY2lfdGJsW10gPSB7CisJUENJX1JPTSgweDE5NjksIDB4MTAyNiwgImF0bDFlXzI2IiwgIkF0dGFuc2ljIEwxRSAweDEwMjYiLCAwKSwKKwlQQ0lfUk9NKDB4MTk2OSwgMHgxMDY2LCAiYXRsMWVfNjYiLCAiQXR0YW5zaWMgTDFFIDB4MTA2NiIsIDApLAorfTsKKworc3RhdGljIHZvaWQgYXRsMWVfc2V0dXBfbWFjX2N0cmwoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIpOworCitzdGF0aWMgY29uc3QgdTE2CithdGwxZV9yeF9wYWdlX3ZsZF9yZWdzW0FUX1BBR0VfTlVNX1BFUl9RVUVVRV0gPQoreworCVJFR19IT1NUX1JYRjBfUEFHRTBfVkxELCBSRUdfSE9TVF9SWEYwX1BBR0UxX1ZMRAorfTsKKworc3RhdGljIGNvbnN0IHUxNgorYXRsMWVfcnhfcGFnZV9sb19hZGRyX3JlZ3NbQVRfUEFHRV9OVU1fUEVSX1FVRVVFXSA9Cit7CisJUkVHX0hPU1RfUlhGMF9QQUdFMF9MTywgUkVHX0hPU1RfUlhGMF9QQUdFMV9MTworfTsKKworc3RhdGljIGNvbnN0IHUxNgorYXRsMWVfcnhfcGFnZV93cml0ZV9vZmZzZXRfcmVnc1tBVF9QQUdFX05VTV9QRVJfUVVFVUVdID0KK3sKKwlSRUdfSE9TVF9SWEYwX01CMF9MTywgIFJFR19IT1NUX1JYRjBfTUIxX0xPCit9OworCitzdGF0aWMgY29uc3QgdTE2IGF0bDFlX3BheV9sb2FkX3NpemVbXSA9IHsKKwkxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCA0MDk2LAorfTsKKworLyoKKyAqIGF0bDFlX2lycV9lbmFibGUgLSBFbmFibGUgZGVmYXVsdCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBzZXR0aW5ncworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGwxZV9pcnFfZW5hYmxlKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCUFUX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19JU1IsIDApOworCUFUX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19JTVIsIElNUl9OT1JNQUxfTUFTSyk7CisJQVRfV1JJVEVfRkxVU0goJmFkYXB0ZXItPmh3KTsKK30KKworLyoKKyAqIGF0bDFlX2lycV9kaXNhYmxlIC0gTWFzayBvZmYgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gdGhlIE5JQworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGwxZV9pcnFfZGlzYWJsZShzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlBVF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfSU1SLCAwKTsKKwlBVF9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOworfQorCisvKgorICogYXRsMWVfaXJxX3Jlc2V0IC0gcmVzZXQgaW50ZXJydXB0IGNvbmZpdXJlIG9uIHRoZSBOSUMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXRsMWVfaXJxX3Jlc2V0KHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCUFUX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19JU1IsIDApOworCUFUX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19JTVIsIDApOworCUFUX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFlX3Jlc2V0KHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCWF0bDFlX2Rvd24oYWRhcHRlcik7CisJYXRsMWVfdXAoYWRhcHRlcik7Cit9CisKK3N0YXRpYyBpbnQgYXRsMWVfY2hlY2tfbGluayhzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMWVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJaW50IGVyciA9IDA7CisJdTE2IHNwZWVkLCBkdXBsZXgsIHBoeV9kYXRhOworCisJLyogTUlJX0JNU1IgbXVzdCByZWFkIHR3aXNlICovCisJYXRsMWVfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlhdGwxZV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCisJaWYgKChwaHlfZGF0YSAmIEJNU1JfTFNUQVRVUykgPT0gMCkgeworCQkvKiBsaW5rIGRvd24gKi8KKwkJaWYgKG5ldGRldl9saW5rX29rKG5ldGRldikpIHsgLyogb2xkIGxpbmsgc3RhdGU6IFVwICovCisJCQl1MzIgdmFsdWU7CisJCQkvKiBkaXNhYmxlIHJ4ICovCisJCQl2YWx1ZSA9IEFUX1JFQURfUkVHKGh3LCBSRUdfTUFDX0NUUkwpOworCQkJdmFsdWUgJj0gfk1BQ19DVFJMX1JYX0VOOworCQkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfTUFDX0NUUkwsIHZhbHVlKTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCisJCQlEQkcoImF0bDFlOiAlcyBsaW5rIGlzIGRvd25cbiIsIG5ldGRldi0+bmFtZSk7CisJCQluZXRkZXZfbGlua19kb3duKG5ldGRldik7CisJCX0KKwl9IGVsc2UgeworCQkvKiBMaW5rIFVwICovCisJCWVyciA9IGF0bDFlX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQkvKiBsaW5rIHJlc3VsdCBpcyBvdXIgc2V0dGluZyAqLworCQlpZiAoYWRhcHRlci0+bGlua19zcGVlZCAhPSBzcGVlZCB8fAorCQkgICAgYWRhcHRlci0+bGlua19kdXBsZXggIT0gZHVwbGV4KSB7CisJCQlhZGFwdGVyLT5saW5rX3NwZWVkICA9IHNwZWVkOworCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSBkdXBsZXg7CisJCQlhdGwxZV9zZXR1cF9tYWNfY3RybChhZGFwdGVyKTsKKworCQkJREJHKCJhdGwxZTogJXMgbGluayBpcyB1cCwgJWQgTWJwcywgJXMgZHVwbGV4XG4iLAorCQkJICAgIG5ldGRldi0+bmFtZSwgYWRhcHRlci0+bGlua19zcGVlZCwKKwkJCSAgICBhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCA/CisJCQkgICAgImZ1bGwiIDogImhhbGYiKTsKKwkJCW5ldGRldl9saW5rX3VwKG5ldGRldik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRsMWVfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQgX191bnVzZWQsCisJCQkgICBpbnQgcmVnX251bSkKK3sKKwlzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTE2IHJlc3VsdDsKKworCWF0bDFlX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIHJlZ19udW0gJiBNRElPX1JFR19BRERSX01BU0ssICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFlX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCBfX3VudXNlZCwKKwkJCSAgICAgaW50IHJlZ19udW0sIGludCB2YWwpCit7CisJc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYXRsMWVfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIHJlZ19udW0gJiBNRElPX1JFR19BRERSX01BU0ssIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFlX3NldHVwX3BjaWNtZChzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwl1MTYgY21kOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCWNtZCB8PSAgKFBDSV9DT01NQU5EX01FTSB8IFBDSV9DT01NQU5EX01BU1RFUik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBjbWQpOworCisJLyoKKwkgKiBzb21lIG1vdGhlcmJvYXJkcyBCSU9TKFBYRS9FRkkpIGRyaXZlciBtYXkgc2V0IFBNRQorCSAqIHdoaWxlIHRoZXkgdHJhbnNmZXIgY29udHJvbCB0byBPUyAoV2luZG93cy9MaW51eCkKKwkgKiBzbyB3ZSBzaG91bGQgY2xlYXIgdGhpcyBiaXQgYmVmb3JlIE5JQyB3b3JrIG5vcm1hbGx5CisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBSRUdfUE1fQ1RSTFNUQVQsIDApOworCW1kZWxheSgxKTsKK30KKworLyoKKyAqIGF0bDFlX3N3X2luaXQgLSBJbml0aWFsaXplIGdlbmVyYWwgc29mdHdhcmUgc3RydWN0dXJlcyAoc3RydWN0IGF0bDFlX2FkYXB0ZXIpCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQorICoKKyAqIGF0bDFlX3N3X2luaXQgaW5pdGlhbGl6ZXMgdGhlIEFkYXB0ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZS4KKyAqIEZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24gUENJIGRldmljZSBpbmZvcm1hdGlvbiBhbmQKKyAqIE9TIG5ldHdvcmsgZGV2aWNlIHNldHRpbmdzIChNVFUgc2l6ZSkuCisgKi8KK3N0YXRpYyBpbnQgYXRsMWVfc3dfaW5pdChzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMWVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBwY2lfZGV2aWNlICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwl1MzIgcGh5X3N0YXR1c19kYXRhID0gMDsKKwl1OCByZXZfaWQgPSAwOworCisJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7ICAgLyogaGFyZHdhcmUgaW5pdCAqLworCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisKKwkvKiBQQ0kgY29uZmlnIHNwYWNlIGluZm8gKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZyZXZfaWQpOworCisJcGh5X3N0YXR1c19kYXRhID0gQVRfUkVBRF9SRUcoaHcsIFJFR19QSFlfU1RBVFVTKTsKKwkvKiBuaWMgdHlwZSAqLworCWlmIChyZXZfaWQgPj0gMHhGMCkgeworCQlody0+bmljX3R5cGUgPSBhdGhyX2wyZV9yZXZCOworCX0gZWxzZSB7CisJCWlmIChwaHlfc3RhdHVzX2RhdGEgJiBQSFlfU1RBVFVTXzEwME0pCisJCQlody0+bmljX3R5cGUgPSBhdGhyX2wxZTsKKwkJZWxzZQorCQkJaHctPm5pY190eXBlID0gYXRocl9sMmVfcmV2QTsKKwl9CisKKwlwaHlfc3RhdHVzX2RhdGEgPSBBVF9SRUFEX1JFRyhodywgUkVHX1BIWV9TVEFUVVMpOworCisJaHctPmVtaV9jYSA9ICEhKHBoeV9zdGF0dXNfZGF0YSAmIFBIWV9TVEFUVVNfRU1JX0NBKTsKKworCWh3LT5waHlfY29uZmlndXJlZCA9IDA7CisKKwkvKiBuZWVkIGNvbmZpcm0gKi8KKworCWh3LT5kbWFyX2Jsb2NrID0gYXRsMWVfZG1hX3JlcV8xMDI0OworCWh3LT5kbWF3X2Jsb2NrID0gYXRsMWVfZG1hX3JlcV8xMDI0OworCisJbmV0ZGV2X2xpbmtfZG93bihhZGFwdGVyLT5uZXRkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhdGwxZV9jbGVhbl90eF9yaW5nIC0gZnJlZSBhbGwgVHggYnVmZmVycyBmb3IgZGV2aWNlIGNsb3NlCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMWVfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMWVfdHhfcmluZyAqdHhfcmluZyA9IChzdHJ1Y3QgYXRsMWVfdHhfcmluZyAqKQorCQkJCSZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBhdGwxZV90eF9idWZmZXIgKnR4X2J1ZmZlciA9IE5VTEw7CisJdTE2IGluZGV4LCByaW5nX2NvdW50ID0gdHhfcmluZy0+Y291bnQ7CisKKwlpZiAodHhfcmluZy0+ZGVzYyA9PSBOVUxMIHx8IHR4X3JpbmctPnR4X2J1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCByaW5nX2NvdW50OyBpbmRleCsrKSB7CisJCXR4X2J1ZmZlciA9ICZ0eF9yaW5nLT50eF9idWZmZXJbaW5kZXhdOworCQlpZiAodHhfYnVmZmVyLT5pb2IpIHsKKwkJCW5ldGRldl90eF9jb21wbGV0ZShhZGFwdGVyLT5uZXRkZXYsIHR4X2J1ZmZlci0+aW9iKTsKKwkJCXR4X2J1ZmZlci0+ZG1hID0gMDsKKwkJCXR4X2J1ZmZlci0+aW9iID0gTlVMTDsKKwkJfQorCX0KKworCS8qIFplcm8gb3V0IFR4LWJ1ZmZlcnMgKi8KKwltZW1zZXQodHhfcmluZy0+ZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCBhdGwxZV90cGRfZGVzYykgKgorCSAgICAgICByaW5nX2NvdW50KTsKKwltZW1zZXQodHhfcmluZy0+dHhfYnVmZmVyLCAwLCBzaXplb2Yoc3RydWN0IGF0bDFlX3R4X2J1ZmZlcikgKgorCSAgICAgICByaW5nX2NvdW50KTsKK30KKworLyoKKyAqIGF0bDFlX2NsZWFuX3J4X3JpbmcgLSBGcmVlIHJ4LXJlc2VydmF0aW9uIGlvYnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBhdGwxZV9jbGVhbl9yeF9yaW5nKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxZV9yeF9yaW5nICpyeF9yaW5nID0KKwkJKHN0cnVjdCBhdGwxZV9yeF9yaW5nICopJmFkYXB0ZXItPnJ4X3Jpbmc7CisJc3RydWN0IGF0bDFlX3J4X3BhZ2VfZGVzYyAqcnhfcGFnZV9kZXNjID0gJnJ4X3JpbmctPnJ4X3BhZ2VfZGVzYzsKKwl1MTYgajsKKworCWlmIChhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIFplcm8gb3V0IHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KKwlmb3IgKGogPSAwOyBqIDwgQVRfUEFHRV9OVU1fUEVSX1FVRVVFOyBqKyspIHsKKwkJaWYgKHJ4X3BhZ2VfZGVzYy0+cnhfcGFnZVtqXS5hZGRyICE9IE5VTEwpIHsKKwkJCW1lbXNldChyeF9wYWdlX2Rlc2MtPnJ4X3BhZ2Vbal0uYWRkciwgMCwKKwkJCSAgICAgICByeF9yaW5nLT5yZWFsX3BhZ2Vfc2l6ZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFlX2NhbF9yaW5nX3NpemUoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiAqcmluZ19zaXplKQoreworCSpyaW5nX3NpemUgPSAoKHUzMikoYWRhcHRlci0+dHhfcmluZy5jb3VudCAqCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBhdGwxZV90cGRfZGVzYykgKyA3CisJCQkvKiB0eCByaW5nLCBxd29yZCBhbGlnbiAqLworCQkgICAgICsgYWRhcHRlci0+cnhfcmluZy5yZWFsX3BhZ2Vfc2l6ZSAqIEFUX1BBR0VfTlVNX1BFUl9RVUVVRQorCQkgICAgICsgMzEKKwkJCS8qIHJ4IHJpbmcsICAzMiBieXRlcyBhbGlnbiAqLworCQkgICAgICsgKDEgKyBBVF9QQUdFX05VTV9QRVJfUVVFVUUpICoKKwkJCXNpemVvZih1MzIpICsgMykpOworCQkJLyogdHgsIHJ4IGNtZCwgZHdvcmQgYWxpZ24gICAqLworfQorCitzdGF0aWMgdm9pZCBhdGwxZV9pbml0X3JpbmdfcmVzb3VyY2VzKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxZV90eF9yaW5nICp0eF9yaW5nID0gTlVMTDsKKwlzdHJ1Y3QgYXRsMWVfcnhfcmluZyAqcnhfcmluZyA9IE5VTEw7CisKKwl0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCisJcnhfcmluZy0+cmVhbF9wYWdlX3NpemUgPSBhZGFwdGVyLT5yeF9yaW5nLnBhZ2Vfc2l6ZQorCQkJCSArIE1BWF9GUkFNRV9TSVpFCisJCQkJICsgRVRIX0hMRU4gKyBWTEFOX0hMRU4gKyBFVEhfRkNTX0xFTjsKKwlyeF9yaW5nLT5yZWFsX3BhZ2Vfc2l6ZSA9IChyeF9yaW5nLT5yZWFsX3BhZ2Vfc2l6ZSArIDMxKSAmIH4zMTsKKwlhdGwxZV9jYWxfcmluZ19zaXplKGFkYXB0ZXIsICZhZGFwdGVyLT5yaW5nX3NpemUpOworCisJYWRhcHRlci0+cmluZ192aXJfYWRkciA9IE5VTEw7CisJYWRhcHRlci0+cnhfcmluZy5kZXNjID0gTlVMTDsKKworCXJldHVybjsKK30KKworLyoKKyAqIFJlYWQgLyBXcml0ZSBQdHIgSW5pdGlhbGl6ZToKKyAqLworc3RhdGljIHZvaWQgYXRsMWVfaW5pdF9yaW5nX3B0cnMoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFlX3R4X3JpbmcgKnR4X3JpbmcgPSBOVUxMOworCXN0cnVjdCBhdGwxZV9yeF9yaW5nICpyeF9yaW5nID0gTlVMTDsKKwlzdHJ1Y3QgYXRsMWVfcnhfcGFnZV9kZXNjICpyeF9wYWdlX2Rlc2MgPSBOVUxMOworCWludCBqOworCisJdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCXJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlyeF9wYWdlX2Rlc2MgPSAmcnhfcmluZy0+cnhfcGFnZV9kZXNjOworCisJdHhfcmluZy0+bmV4dF90b191c2UgPSAwOworCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCisJcnhfcGFnZV9kZXNjLT5yeF91c2luZyAgPSAwOworCXJ4X3BhZ2VfZGVzYy0+cnhfbnhzZXEgPSAwOworCWZvciAoaiA9IDA7IGogPCBBVF9QQUdFX05VTV9QRVJfUVVFVUU7IGorKykgeworCQkqcnhfcGFnZV9kZXNjLT5yeF9wYWdlW2pdLndyaXRlX29mZnNldF9hZGRyID0gMDsKKwkJcnhfcGFnZV9kZXNjLT5yeF9wYWdlW2pdLnJlYWRfb2Zmc2V0ID0gMDsKKwl9Cit9CisKKy8qCisgKiBhdGwxZV9mcmVlX3JpbmdfcmVzb3VyY2VzIC0gRnJlZSBUeCAvIFJYIGRlc2NyaXB0b3IgUmVzb3VyY2VzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBGcmVlIGFsbCB0cmFuc21pdCBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqLworc3RhdGljIHZvaWQgYXRsMWVfZnJlZV9yaW5nX3Jlc291cmNlcyhzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhdGwxZV9jbGVhbl90eF9yaW5nKGFkYXB0ZXIpOworCWF0bDFlX2NsZWFuX3J4X3JpbmcoYWRhcHRlcik7CisKKwlpZiAoYWRhcHRlci0+cmluZ192aXJfYWRkcikgeworCQlmcmVlX2RtYShhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyLCBhZGFwdGVyLT5yaW5nX3NpemUpOworCQlhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyID0gTlVMTDsKKwkJYWRhcHRlci0+cmluZ19kbWEgPSAwOworCX0KKworCWlmIChhZGFwdGVyLT50eF9yaW5nLnR4X2J1ZmZlcikgeworCQlmcmVlKGFkYXB0ZXItPnR4X3JpbmcudHhfYnVmZmVyKTsKKwkJYWRhcHRlci0+dHhfcmluZy50eF9idWZmZXIgPSBOVUxMOworCX0KK30KKworLyoKKyAqIGF0bDFlX3NldHVwX21lbV9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBUeCAvIFJYIGRlc2NyaXB0b3IgcmVzb3VyY2VzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgYXRsMWVfc2V0dXBfcmluZ19yZXNvdXJjZXMoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFlX3R4X3JpbmcgKnR4X3Jpbmc7CisJc3RydWN0IGF0bDFlX3J4X3JpbmcgKnJ4X3Jpbmc7CisJc3RydWN0IGF0bDFlX3J4X3BhZ2VfZGVzYyAgKnJ4X3BhZ2VfZGVzYzsKKwlpbnQgc2l6ZSwgajsKKwl1MzIgb2Zmc2V0ID0gMDsKKwlpbnQgZXJyID0gMDsKKworCWlmIChhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyICE9IE5VTEwpCisJCXJldHVybiAwOyAvKiBhbGxvY2VkIGFscmVhZHkgKi8KKworCXR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZzsKKwlyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisKKwkvKiByZWFsIHJpbmcgRE1BIGJ1ZmZlciAqLworCisJc2l6ZSA9IGFkYXB0ZXItPnJpbmdfc2l6ZTsKKwlhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyID0gbWFsbG9jX2RtYShhZGFwdGVyLT5yaW5nX3NpemUsIDMyKTsKKworCWlmIChhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyID09IE5VTEwpIHsKKwkJREJHKCJhdGwxZTogb3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nICVkIGJ5dGVzIGZvciAlcyByaW5nXG4iLAorCQkgICAgYWRhcHRlci0+cmluZ19zaXplLCBhZGFwdGVyLT5uZXRkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhZGFwdGVyLT5yaW5nX2RtYSA9IHZpcnRfdG9fYnVzKGFkYXB0ZXItPnJpbmdfdmlyX2FkZHIpOworCW1lbXNldChhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyLCAwLCBhZGFwdGVyLT5yaW5nX3NpemUpOworCisJcnhfcGFnZV9kZXNjID0gJnJ4X3JpbmctPnJ4X3BhZ2VfZGVzYzsKKworCS8qIEluaXQgVFBEIFJpbmcgKi8KKwl0eF9yaW5nLT5kbWEgPSAoYWRhcHRlci0+cmluZ19kbWEgKyA3KSAmIH43OworCW9mZnNldCA9IHR4X3JpbmctPmRtYSAtIGFkYXB0ZXItPnJpbmdfZG1hOworCXR4X3JpbmctPmRlc2MgPSAoc3RydWN0IGF0bDFlX3RwZF9kZXNjICopCisJCQkoYWRhcHRlci0+cmluZ192aXJfYWRkciArIG9mZnNldCk7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXRsMWVfdHhfYnVmZmVyKSAqICh0eF9yaW5nLT5jb3VudCk7CisJdHhfcmluZy0+dHhfYnVmZmVyID0gemFsbG9jKHNpemUpOworCWlmICh0eF9yaW5nLT50eF9idWZmZXIgPT0gTlVMTCkgeworCQlEQkcoImF0bDFlOiBvdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgJWQgYnl0ZXMgZm9yICVzIHR4YnVmXG4iLAorCQkgICAgc2l6ZSwgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJLyogSW5pdCBSWEYtUGFnZXMgKi8KKwlvZmZzZXQgKz0gKHNpemVvZihzdHJ1Y3QgYXRsMWVfdHBkX2Rlc2MpICogdHhfcmluZy0+Y291bnQpOworCW9mZnNldCA9IChvZmZzZXQgKyAzMSkgJiB+MzE7CisKKwlmb3IgKGogPSAwOyBqIDwgQVRfUEFHRV9OVU1fUEVSX1FVRVVFOyBqKyspIHsKKwkJcnhfcGFnZV9kZXNjLT5yeF9wYWdlW2pdLmRtYSA9CisJCQlhZGFwdGVyLT5yaW5nX2RtYSArIG9mZnNldDsKKwkJcnhfcGFnZV9kZXNjLT5yeF9wYWdlW2pdLmFkZHIgPQorCQkJYWRhcHRlci0+cmluZ192aXJfYWRkciArIG9mZnNldDsKKwkJb2Zmc2V0ICs9IHJ4X3JpbmctPnJlYWxfcGFnZV9zaXplOworCX0KKworCS8qIEluaXQgQ01CIGRtYSBhZGRyZXNzICovCisJdHhfcmluZy0+Y21iX2RtYSA9IGFkYXB0ZXItPnJpbmdfZG1hICsgb2Zmc2V0OworCXR4X3JpbmctPmNtYiAgICAgPSAodTMyICopKGFkYXB0ZXItPnJpbmdfdmlyX2FkZHIgKyBvZmZzZXQpOworCW9mZnNldCArPSBzaXplb2YodTMyKTsKKworCWZvciAoaiA9IDA7IGogPCBBVF9QQUdFX05VTV9QRVJfUVVFVUU7IGorKykgeworCQlyeF9wYWdlX2Rlc2MtPnJ4X3BhZ2Vbal0ud3JpdGVfb2Zmc2V0X2RtYSA9CisJCQlhZGFwdGVyLT5yaW5nX2RtYSArIG9mZnNldDsKKwkJcnhfcGFnZV9kZXNjLT5yeF9wYWdlW2pdLndyaXRlX29mZnNldF9hZGRyID0KKwkJCWFkYXB0ZXItPnJpbmdfdmlyX2FkZHIgKyBvZmZzZXQ7CisJCW9mZnNldCArPSBzaXplb2YodTMyKTsKKwl9CisKKwlpZiAob2Zmc2V0ID4gYWRhcHRlci0+cmluZ19zaXplKSB7CisJCURCRygiYXRsMWU6IHJpbmcgbWlzY2FsY3VsYXRpb24hIG5lZWQgJWQgPiAlZCBieXRlc1xuIiwKKwkJICAgIG9mZnNldCwgYWRhcHRlci0+cmluZ19zaXplKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJcmV0dXJuIDA7CitmYWlsZWQ6CisJYXRsMWVfZnJlZV9yaW5nX3Jlc291cmNlcyhhZGFwdGVyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRsMWVfY29uZmlndXJlX2Rlc19yaW5nKGNvbnN0IHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCisJc3RydWN0IGF0bDFlX2h3ICpodyA9IChzdHJ1Y3QgYXRsMWVfaHcgKikmYWRhcHRlci0+aHc7CisJc3RydWN0IGF0bDFlX3J4X3JpbmcgKnJ4X3JpbmcgPQorCQkJKHN0cnVjdCBhdGwxZV9yeF9yaW5nICopJmFkYXB0ZXItPnJ4X3Jpbmc7CisJc3RydWN0IGF0bDFlX3R4X3JpbmcgKnR4X3JpbmcgPQorCQkJKHN0cnVjdCBhdGwxZV90eF9yaW5nICopJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGF0bDFlX3J4X3BhZ2VfZGVzYyAqcnhfcGFnZV9kZXNjID0gTlVMTDsKKwlpbnQgajsKKworCUFUX1dSSVRFX1JFRyhodywgUkVHX0RFU0NfQkFTRV9BRERSX0hJLCAwKTsKKwlBVF9XUklURV9SRUcoaHcsIFJFR19UUERfQkFTRV9BRERSX0xPLCB0eF9yaW5nLT5kbWEpOworCUFUX1dSSVRFX1JFRyhodywgUkVHX1RQRF9SSU5HX1NJWkUsICh1MTYpKHR4X3JpbmctPmNvdW50KSk7CisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfSE9TVF9UWF9DTUJfTE8sIHR4X3JpbmctPmNtYl9kbWEpOworCisJcnhfcGFnZV9kZXNjID0gJnJ4X3JpbmctPnJ4X3BhZ2VfZGVzYzsKKworCS8qIFJYRiBQYWdlIFBoeXNpY2FsIGFkZHJlc3MgLyBQYWdlIExlbmd0aCAqLworCUFUX1dSSVRFX1JFRyhodywgUkVHX1JYRjBfQkFTRV9BRERSX0hJLCAwKTsKKworCWZvciAoaiA9IDA7IGogPCBBVF9QQUdFX05VTV9QRVJfUVVFVUU7IGorKykgeworCQl1MzIgcGFnZV9waHlfYWRkcjsKKwkJdTMyIG9mZnNldF9waHlfYWRkcjsKKworCQlwYWdlX3BoeV9hZGRyID0gcnhfcGFnZV9kZXNjLT5yeF9wYWdlW2pdLmRtYTsKKwkJb2Zmc2V0X3BoeV9hZGRyID0gcnhfcGFnZV9kZXNjLT5yeF9wYWdlW2pdLndyaXRlX29mZnNldF9kbWE7CisKKwkJQVRfV1JJVEVfUkVHKGh3LCBhdGwxZV9yeF9wYWdlX2xvX2FkZHJfcmVnc1tqXSwgcGFnZV9waHlfYWRkcik7CisJCUFUX1dSSVRFX1JFRyhodywgYXRsMWVfcnhfcGFnZV93cml0ZV9vZmZzZXRfcmVnc1tqXSwKKwkJCSAgICAgb2Zmc2V0X3BoeV9hZGRyKTsKKwkJQVRfV1JJVEVfUkVHQihodywgYXRsMWVfcnhfcGFnZV92bGRfcmVnc1tqXSwgMSk7CisJfQorCisJLyogUGFnZSBMZW5ndGggKi8KKwlBVF9XUklURV9SRUcoaHcsIFJFR19IT1NUX1JYRlBBR0VfU0laRSwgcnhfcmluZy0+cGFnZV9zaXplKTsKKwkvKiBMb2FkIGFsbCBvZiBiYXNlIGFkZHJlc3MgYWJvdmUgKi8KKwlBVF9XUklURV9SRUcoaHcsIFJFR19MT0FEX1BUUiwgMSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGwxZV9jb25maWd1cmVfdHgoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFlX2h3ICpodyA9IChzdHJ1Y3QgYXRsMWVfaHcgKikmYWRhcHRlci0+aHc7CisJdTMyIGRldl9jdHJsX2RhdGEgPSAwOworCXUzMiBtYXhfcGF5X2xvYWQgPSAwOworCXUzMiBqdW1ib190aHJlc2ggPSAwOworCXUzMiBleHRyYV9zaXplID0gMDsgICAgIC8qIEp1bWJvIGZyYW1lIHRocmVzaG9sZCBpbiBRV09SRCB1bml0ICovCisKKwkvKiBjb25maWd1cmUgVFhRIHBhcmFtICovCisJaWYgKGh3LT5uaWNfdHlwZSAhPSBhdGhyX2wyZV9yZXZCKSB7CisJCWV4dHJhX3NpemUgPSBFVEhfSExFTiArIFZMQU5fSExFTiArIEVUSF9GQ1NfTEVOOworCQlqdW1ib190aHJlc2ggPSBNQVhfRlJBTUVfU0laRSArIGV4dHJhX3NpemU7CisJCUFUX1dSSVRFX1JFRyhodywgUkVHX1RYX0VBUkxZX1RILCAoanVtYm9fdGhyZXNoICsgNykgPj4gMyk7CisJfQorCisJZGV2X2N0cmxfZGF0YSA9IEFUX1JFQURfUkVHKGh3LCBSRUdfREVWSUNFX0NUUkwpOworCisJbWF4X3BheV9sb2FkICA9ICgoZGV2X2N0cmxfZGF0YSA+PiBERVZJQ0VfQ1RSTF9NQVhfUEFZTE9BRF9TSElGVCkpICYKKwkJCURFVklDRV9DVFJMX01BWF9QQVlMT0FEX01BU0s7CisJaWYgKG1heF9wYXlfbG9hZCA8IGh3LT5kbWF3X2Jsb2NrKQorCQlody0+ZG1hd19ibG9jayA9IG1heF9wYXlfbG9hZDsKKworCW1heF9wYXlfbG9hZCAgPSAoKGRldl9jdHJsX2RhdGEgPj4gREVWSUNFX0NUUkxfTUFYX1JSRVFfU1pfU0hJRlQpKSAmCisJCQlERVZJQ0VfQ1RSTF9NQVhfUlJFUV9TWl9NQVNLOworCWlmIChtYXhfcGF5X2xvYWQgPCBody0+ZG1hcl9ibG9jaykKKwkJaHctPmRtYXJfYmxvY2sgPSBtYXhfcGF5X2xvYWQ7CisKKwlpZiAoaHctPm5pY190eXBlICE9IGF0aHJfbDJlX3JldkIpCisJCUFUX1dSSVRFX1JFR1coaHcsIFJFR19UWFFfQ1RSTCArIDIsCisJCQkgICAgICBhdGwxZV9wYXlfbG9hZF9zaXplW2h3LT5kbWFyX2Jsb2NrXSk7CisJLyogZW5hYmxlIFRYUSAqLworCUFUX1dSSVRFX1JFR1coaHcsIFJFR19UWFFfQ1RSTCwKKwkJCSgoVFBEX0JVUlNUICYgVFhRX0NUUkxfTlVNX1RQRF9CVVJTVF9NQVNLKQorCQkJIDw8IFRYUV9DVFJMX05VTV9UUERfQlVSU1RfU0hJRlQpCisJCQl8IFRYUV9DVFJMX0VOSF9NT0RFIHwgVFhRX0NUUkxfRU4pOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0bDFlX2NvbmZpZ3VyZV9yeChzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMWVfaHcgKmh3ID0gKHN0cnVjdCBhdGwxZV9odyAqKSZhZGFwdGVyLT5odzsKKwl1MzIgcnhmX2xlbiAgPSAwOworCXUzMiByeGZfbG93ICA9IDA7CisJdTMyIHJ4Zl9oaWdoID0gMDsKKwl1MzIgcnhmX3RocmVzaF9kYXRhID0gMDsKKwl1MzIgcnhxX2N0cmxfZGF0YSA9IDA7CisKKwlpZiAoaHctPm5pY190eXBlICE9IGF0aHJfbDJlX3JldkIpIHsKKwkJQVRfV1JJVEVfUkVHVyhodywgUkVHX1JYUV9KTUJPU1pfUlJEVElNLAorCQkJICAgICAgKHUxNikoKFJYX0pVTUJPX1RIUkVTSCAmIFJYUV9KTUJPU1pfVEhfTUFTSykgPDwKKwkJCSAgICAgIFJYUV9KTUJPU1pfVEhfU0hJRlQgfAorCQkJICAgICAgKDEgJiBSWFFfSk1CT19MS0FIX01BU0spIDw8CisJCQkgICAgICBSWFFfSk1CT19MS0FIX1NISUZUKSk7CisKKwkJcnhmX2xlbiAgPSBBVF9SRUFEX1JFRyhodywgUkVHX1NSQU1fUlhGX0xFTik7CisJCXJ4Zl9oaWdoID0gcnhmX2xlbiAqIDQgLyA1OworCQlyeGZfbG93ICA9IHJ4Zl9sZW4gLyA1OworCQlyeGZfdGhyZXNoX2RhdGEgPSAoKHJ4Zl9oaWdoICAmIFJYUV9SWEZfUEFVU0VfVEhfSElfTUFTSykKKwkJCQkgIDw8IFJYUV9SWEZfUEFVU0VfVEhfSElfU0hJRlQpIHwKKwkJCQkgICgocnhmX2xvdyAmIFJYUV9SWEZfUEFVU0VfVEhfTE9fTUFTSykKKwkJCQkgIDw8IFJYUV9SWEZfUEFVU0VfVEhfTE9fU0hJRlQpOworCisJCUFUX1dSSVRFX1JFRyhodywgUkVHX1JYUV9SWEZfUEFVU0VfVEhSRVNILCByeGZfdGhyZXNoX2RhdGEpOworCX0KKworCS8qIFJSUyAqLworCUFUX1dSSVRFX1JFRyhodywgUkVHX0lEVF9UQUJMRSwgMCk7CisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfQkFTRV9DUFVfTlVNQkVSLCAwKTsKKworCXJ4cV9jdHJsX2RhdGEgfD0gUlhRX0NUUkxfUEJBX0FMSUdOXzMyIHwKKwkJCSBSWFFfQ1RSTF9DVVRfVEhSVV9FTiB8IFJYUV9DVFJMX0VOOworCisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfUlhRX0NUUkwsIHJ4cV9jdHJsX2RhdGEpOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0bDFlX2NvbmZpZ3VyZV9kbWEoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgZG1hX2N0cmxfZGF0YSA9IDA7CisKKwlkbWFfY3RybF9kYXRhID0gRE1BX0NUUkxfUlhDTUJfRU47CisJZG1hX2N0cmxfZGF0YSB8PSAoKCh1MzIpaHctPmRtYXJfYmxvY2spICYgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fTUFTSykKKwkJPDwgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fU0hJRlQ7CisJZG1hX2N0cmxfZGF0YSB8PSAoKCh1MzIpaHctPmRtYXdfYmxvY2spICYgRE1BX0NUUkxfRE1BV19CVVJTVF9MRU5fTUFTSykKKwkJPDwgRE1BX0NUUkxfRE1BV19CVVJTVF9MRU5fU0hJRlQ7CisJZG1hX2N0cmxfZGF0YSB8PSBETUFfQ1RSTF9ETUFSX1JFUV9QUkkgfCBETUFfQ1RSTF9ETUFSX09VVF9PUkRFUjsKKwlkbWFfY3RybF9kYXRhIHw9IChETUFSX0RMWV9DTlQgJiBETUFfQ1RSTF9ETUFSX0RMWV9DTlRfTUFTSykKKwkJPDwgRE1BX0NUUkxfRE1BUl9ETFlfQ05UX1NISUZUOworCWRtYV9jdHJsX2RhdGEgfD0gKERNQVdfRExZX0NOVCAmIERNQV9DVFJMX0RNQVdfRExZX0NOVF9NQVNLKQorCQk8PCBETUFfQ1RSTF9ETUFXX0RMWV9DTlRfU0hJRlQ7CisKKwlBVF9XUklURV9SRUcoaHcsIFJFR19ETUFfQ1RSTCwgZG1hX2N0cmxfZGF0YSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBhdGwxZV9zZXR1cF9tYWNfY3RybChzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgdmFsdWU7CisJc3RydWN0IGF0bDFlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKworCS8qIENvbmZpZyBNQUMgQ1RSTCBSZWdpc3RlciAqLworCXZhbHVlID0gTUFDX0NUUkxfVFhfRU4gfAorCQlNQUNfQ1RSTF9SWF9FTiA7CisKKwlpZiAoRlVMTF9EVVBMRVggPT0gYWRhcHRlci0+bGlua19kdXBsZXgpCisJCXZhbHVlIHw9IE1BQ19DVFJMX0RVUExYOworCisJdmFsdWUgfD0gKCh1MzIpKChTUEVFRF8xMDAwID09IGFkYXB0ZXItPmxpbmtfc3BlZWQpID8KKwkJCSAgTUFDX0NUUkxfU1BFRURfMTAwMCA6IE1BQ19DVFJMX1NQRUVEXzEwXzEwMCkgPDwKKwkJCSAgTUFDX0NUUkxfU1BFRURfU0hJRlQpOworCXZhbHVlIHw9IChNQUNfQ1RSTF9UWF9GTE9XIHwgTUFDX0NUUkxfUlhfRkxPVyk7CisKKwl2YWx1ZSB8PSAoTUFDX0NUUkxfQUREX0NSQyB8IE1BQ19DVFJMX1BBRCk7CisJdmFsdWUgfD0gKChQUkVBTUJMRV9MRU4gJiBNQUNfQ1RSTF9QUk1MRU5fTUFTSykgPDwgTUFDX0NUUkxfUFJNTEVOX1NISUZUKTsKKworCXZhbHVlIHw9IE1BQ19DVFJMX0JDX0VOOworCXZhbHVlIHw9IE1BQ19DVFJMX01DX0FMTF9FTjsKKworCUFUX1dSSVRFX1JFRyhodywgUkVHX01BQ19DVFJMLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBhdGwxZV9jb25maWd1cmUgLSBDb25maWd1cmUgVHJhbnNtaXQmUmVjZWl2ZSBVbml0IGFmdGVyIFJlc2V0CisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBDb25maWd1cmUgdGhlIFR4IC9SeCB1bml0IG9mIHRoZSBNQUMgYWZ0ZXIgYSByZXNldC4KKyAqLworc3RhdGljIGludCBhdGwxZV9jb25maWd1cmUoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgaW50cl9zdGF0dXNfZGF0YSA9IDA7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfSVNSLCB+MCk7CisKKwkvKiAxLiBzZXQgTUFDIEFkZHJlc3MgKi8KKwlhdGwxZV9od19zZXRfbWFjX2FkZHIoaHcpOworCisJLyogMi4gSW5pdCB0aGUgTXVsdGljYXN0IEhBU0ggdGFibGUgKGNsZWFyKSAqLworCUFUX1dSSVRFX1JFRyhodywgUkVHX1JYX0hBU0hfVEFCTEUsIDApOworCUFUX1dSSVRFX1JFR19BUlJBWShodywgUkVHX1JYX0hBU0hfVEFCTEUsIDEsIDApOworCisJLyogMy4gQ2xlYXIgYW55IFdPTCBzdGF0dXMgKi8KKwlBVF9XUklURV9SRUcoaHcsIFJFR19XT0xfQ1RSTCwgMCk7CisKKwkvKiA0LiBEZXNjcmlwdGVyIFJpbmcgQmFzZU1lbS9MZW5ndGgvUmVhZCBwdHIvV3JpdGUgcHRyCisJICogICAgVFBEIFJpbmcvU01CL1JYRjAgUGFnZSBDTUJzLCB0aGV5IHVzZSB0aGUgc2FtZQorCSAqICAgIEhpZ2ggMzJiaXRzIG1lbW9yeSAqLworCWF0bDFlX2NvbmZpZ3VyZV9kZXNfcmluZyhhZGFwdGVyKTsKKworCS8qIDUuIHNldCBJbnRlcnJ1cHQgTW9kZXJhdG9yIFRpbWVyICovCisJQVRfV1JJVEVfUkVHVyhodywgUkVHX0lSUV9NT0RVX1RJTUVSX0lOSVQsIElNVF9WQUwpOworCUFUX1dSSVRFX1JFR1coaHcsIFJFR19JUlFfTU9EVV9USU1FUjJfSU5JVCwgSU1UX1ZBTCk7CisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfTUFTVEVSX0NUUkwsIE1BU1RFUl9DVFJMX0xFRF9NT0RFIHwKKwkJCU1BU1RFUl9DVFJMX0lUSU1FUl9FTiB8IE1BU1RFUl9DVFJMX0lUSU1FUjJfRU4pOworCisJLyogNi4gcngvdHggdGhyZXNob2xkIHRvIHRyaWcgaW50ZXJydXB0ICovCisJQVRfV1JJVEVfUkVHVyhodywgUkVHX1RSSUdfUlJEX1RIUkVTSCwgUlJEX1RIUkVTSCk7CisJQVRfV1JJVEVfUkVHVyhodywgUkVHX1RSSUdfVFBEX1RIUkVTSCwgVFBEX1RIUkVTSCk7CisJQVRfV1JJVEVfUkVHVyhodywgUkVHX1RSSUdfUlhUSU1FUiwgUlhfQ09VTlRfRE9XTik7CisJQVRfV1JJVEVfUkVHVyhodywgUkVHX1RSSUdfVFhUSU1FUiwgVFhfQ09VTlRfRE9XTik7CisKKwkvKiA3LiBzZXQgSW50ZXJydXB0IENsZWFyIFRpbWVyICovCisJQVRfV1JJVEVfUkVHVyhodywgUkVHX0NNQkRJU0RNQV9USU1FUiwgSUNUX1ZBTCk7CisKKwkvKiA4LiBzZXQgTVRVICovCisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfTVRVLCBNQVhfRlJBTUVfU0laRSArIEVUSF9ITEVOICsKKwkJCVZMQU5fSExFTiArIEVUSF9GQ1NfTEVOKTsKKworCS8qIDkuIGNvbmZpZyBUWFEgZWFybHkgdHggdGhyZXNob2xkICovCisJYXRsMWVfY29uZmlndXJlX3R4KGFkYXB0ZXIpOworCisJLyogMTAuIGNvbmZpZyBSWFEgKi8KKwlhdGwxZV9jb25maWd1cmVfcngoYWRhcHRlcik7CisKKwkvKiAxMS4gY29uZmlnICBETUEgRW5naW5lICovCisJYXRsMWVfY29uZmlndXJlX2RtYShhZGFwdGVyKTsKKworCS8qIDEyLiBzbWIgdGltZXIgdG8gdHJpZyBpbnRlcnJ1cHQgKi8KKwlBVF9XUklURV9SRUcoaHcsIFJFR19TTUJfU1RBVF9USU1FUiwgU01CX1RJTUVSKTsKKworCWludHJfc3RhdHVzX2RhdGEgPSBBVF9SRUFEX1JFRyhodywgUkVHX0lTUik7CisJaWYgKChpbnRyX3N0YXR1c19kYXRhICYgSVNSX1BIWV9MSU5LRE9XTikgIT0gMCkgeworCQlEQkcoImF0bDFlOiBjb25maWd1cmUgZmFpbGVkLCBQQ0lFIHBoeSBsaW5rIGRvd25cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfSVNSLCAweDdmZmZmZmZmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0bDFlX2NsZWFyX3BoeV9pbnQoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTE2IHBoeV9kYXRhOworCisJYXRsMWVfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgTUlJX0lOVF9TVEFUVVMsICZwaHlfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgYXRsMWVfY2xlYW5fdHhfaXJxKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxZV90eF9yaW5nICp0eF9yaW5nID0gKHN0cnVjdCBhdGwxZV90eF9yaW5nICopCisJCQkJCSZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBhdGwxZV90eF9idWZmZXIgKnR4X2J1ZmZlciA9IE5VTEw7CisJdTE2IGh3X25leHRfdG9fY2xlYW4gPSBBVF9SRUFEX1JFR1coJmFkYXB0ZXItPmh3LCBSRUdfVFBEX0NPTlNfSURYKTsKKwl1MTYgbmV4dF90b19jbGVhbiA9IHR4X3JpbmctPm5leHRfdG9fY2xlYW47CisKKwl3aGlsZSAobmV4dF90b19jbGVhbiAhPSBod19uZXh0X3RvX2NsZWFuKSB7CisJCXR4X2J1ZmZlciA9ICZ0eF9yaW5nLT50eF9idWZmZXJbbmV4dF90b19jbGVhbl07CisKKwkJdHhfYnVmZmVyLT5kbWEgPSAwOworCQlpZiAodHhfYnVmZmVyLT5pb2IpIHsKKwkJCW5ldGRldl90eF9jb21wbGV0ZShhZGFwdGVyLT5uZXRkZXYsIHR4X2J1ZmZlci0+aW9iKTsKKwkJCXR4X2J1ZmZlci0+aW9iID0gTlVMTDsKKwkJfQorCisJCWlmICgrK25leHRfdG9fY2xlYW4gPT0gdHhfcmluZy0+Y291bnQpCisJCQluZXh0X3RvX2NsZWFuID0gMDsKKwl9CisKKwl0eF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gbmV4dF90b19jbGVhbjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGF0bDFlX3J4X3BhZ2UgKmF0bDFlX2dldF9yeF9wYWdlKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxZV9yeF9wYWdlX2Rlc2MgKnJ4X3BhZ2VfZGVzYyA9CisJCShzdHJ1Y3QgYXRsMWVfcnhfcGFnZV9kZXNjICopICZhZGFwdGVyLT5yeF9yaW5nLnJ4X3BhZ2VfZGVzYzsKKwl1OCByeF91c2luZyA9IHJ4X3BhZ2VfZGVzYy0+cnhfdXNpbmc7CisKKwlyZXR1cm4gKHN0cnVjdCBhdGwxZV9yeF9wYWdlICopJihyeF9wYWdlX2Rlc2MtPnJ4X3BhZ2VbcnhfdXNpbmddKTsKK30KKworc3RhdGljIHZvaWQgYXRsMWVfY2xlYW5fcnhfaXJxKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBhdGwxZV9yeF9yaW5nICpyeF9yaW5nID0gKHN0cnVjdCBhdGwxZV9yeF9yaW5nICopCisJCQkJCSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgYXRsMWVfcnhfcGFnZV9kZXNjICpyeF9wYWdlX2Rlc2MgPQorCQkoc3RydWN0IGF0bDFlX3J4X3BhZ2VfZGVzYyAqKSAmcnhfcmluZy0+cnhfcGFnZV9kZXNjOworCXN0cnVjdCBpb19idWZmZXIgKmlvYiA9IE5VTEw7CisJc3RydWN0IGF0bDFlX3J4X3BhZ2UgKnJ4X3BhZ2UgPSBhdGwxZV9nZXRfcnhfcGFnZShhZGFwdGVyKTsKKwl1MzIgcGFja2V0X3NpemUsIHdyaXRlX29mZnNldDsKKwlzdHJ1Y3QgYXRsMWVfcmVjdl9yZXRfc3RhdHVzICpwcnJzOworCisJd3JpdGVfb2Zmc2V0ID0gKihyeF9wYWdlLT53cml0ZV9vZmZzZXRfYWRkcik7CisJaWYgKHJ4X3BhZ2UtPnJlYWRfb2Zmc2V0ID49IHdyaXRlX29mZnNldCkKKwkJcmV0dXJuOworCisJZG8geworCQkvKiBnZXQgbmV3IHBhY2tldCdzICBycnMgKi8KKwkJcHJycyA9IChzdHJ1Y3QgYXRsMWVfcmVjdl9yZXRfc3RhdHVzICopIChyeF9wYWdlLT5hZGRyICsKKwkJCQkJCQkgcnhfcGFnZS0+cmVhZF9vZmZzZXQpOworCQkvKiBjaGVjayBzZXF1ZW5jZSBudW1iZXIgKi8KKwkJaWYgKHBycnMtPnNlcV9udW0gIT0gcnhfcGFnZV9kZXNjLT5yeF9ueHNlcSkgeworCQkJREJHKCJhdGwxZSAlczogUlggc2VxdWVuY2UgbnVtYmVyIGVycm9yICglZCAhPSAlZClcbiIsCisJCQkgICAgbmV0ZGV2LT5uYW1lLCBwcnJzLT5zZXFfbnVtLAorCQkJICAgIHJ4X3BhZ2VfZGVzYy0+cnhfbnhzZXEpOworCQkJcnhfcGFnZV9kZXNjLT5yeF9ueHNlcSsrOworCQkJZ290byBmYXRhbF9lcnI7CisJCX0KKworCQlyeF9wYWdlX2Rlc2MtPnJ4X254c2VxKys7CisKKwkJLyogZXJyb3IgcGFja2V0ICovCisJCWlmIChwcnJzLT5wa3RfZmxhZyAmIFJSU19JU19FUlJfRlJBTUUpIHsKKwkJCWlmIChwcnJzLT5lcnJfZmxhZyAmIChSUlNfRVJSX0JBRF9DUkMgfAorCQkJCQkgICAgICBSUlNfRVJSX0RSSUJCTEUgfCBSUlNfRVJSX0NPREUgfAorCQkJCQkgICAgICBSUlNfRVJSX1RSVU5DKSkgeworCQkJCS8qIGhhcmR3YXJlIGVycm9yLCBkaXNjYXJkIHRoaXMKKwkJCQkgICBwYWNrZXQgKi8KKwkJCQluZXRkZXZfcnhfZXJyKG5ldGRldiwgTlVMTCwgRUlPKTsKKwkJCQlnb3RvIHNraXBfcGt0OworCQkJfQorCQl9CisKKwkJcGFja2V0X3NpemUgPSAoKHBycnMtPndvcmQxID4+IFJSU19QS1RfU0laRV9TSElGVCkgJgorCQkJICAgICAgIFJSU19QS1RfU0laRV9NQVNLKSAtIEVUSF9GQ1NfTEVOOworCQlpb2IgPSBhbGxvY19pb2IocGFja2V0X3NpemUgKyBORVRfSVBfQUxJR04pOworCQlpZiAoaW9iID09IE5VTEwpIHsKKwkJCURCRygiYXRsMWUgJXM6IGRyb3BwaW5nIHBhY2tldCB1bmRlciBtZW1vcnkgcHJlc3N1cmVcbiIsCisJCQkgICAgbmV0ZGV2LT5uYW1lKTsKKwkJCWdvdG8gc2tpcF9wa3Q7CisJCX0KKwkJaW9iX3Jlc2VydmUoaW9iLCBORVRfSVBfQUxJR04pOworCQltZW1jcHkoaW9iLT5kYXRhLCAodTggKikocHJycyArIDEpLCBwYWNrZXRfc2l6ZSk7CisJCWlvYl9wdXQoaW9iLCBwYWNrZXRfc2l6ZSk7CisKKwkJbmV0ZGV2X3J4KG5ldGRldiwgaW9iKTsKKworc2tpcF9wa3Q6CisJCS8qIHNraXAgY3VycmVudCBwYWNrZXQgd2hldGhlciBpdCdzIG9rIG9yIG5vdC4gKi8KKwkJcnhfcGFnZS0+cmVhZF9vZmZzZXQgKz0KKwkJCSgoKHUzMikoKHBycnMtPndvcmQxID4+IFJSU19QS1RfU0laRV9TSElGVCkgJgorCQkJCVJSU19QS1RfU0laRV9NQVNLKSArCisJCQkgIHNpemVvZihzdHJ1Y3QgYXRsMWVfcmVjdl9yZXRfc3RhdHVzKSArIDMxKSAmCisJCQkgMHhGRkZGRkZFMCk7CisKKwkJaWYgKHJ4X3BhZ2UtPnJlYWRfb2Zmc2V0ID49IHJ4X3JpbmctPnBhZ2Vfc2l6ZSkgeworCQkJLyogbWFyayB0aGlzIHBhZ2UgY2xlYW4gKi8KKwkJCXUxNiByZWdfYWRkcjsKKwkJCXU4ICByeF91c2luZzsKKworCQkJcnhfcGFnZS0+cmVhZF9vZmZzZXQgPQorCQkJCSoocnhfcGFnZS0+d3JpdGVfb2Zmc2V0X2FkZHIpID0gMDsKKwkJCXJ4X3VzaW5nID0gcnhfcGFnZV9kZXNjLT5yeF91c2luZzsKKwkJCXJlZ19hZGRyID0KKwkJCQlhdGwxZV9yeF9wYWdlX3ZsZF9yZWdzW3J4X3VzaW5nXTsKKwkJCUFUX1dSSVRFX1JFR0IoJmFkYXB0ZXItPmh3LCByZWdfYWRkciwgMSk7CisJCQlyeF9wYWdlX2Rlc2MtPnJ4X3VzaW5nIF49IDE7CisJCQlyeF9wYWdlID0gYXRsMWVfZ2V0X3J4X3BhZ2UoYWRhcHRlcik7CisJCX0KKwkJd3JpdGVfb2Zmc2V0ID0gKihyeF9wYWdlLT53cml0ZV9vZmZzZXRfYWRkcik7CisJfSB3aGlsZSAocnhfcGFnZS0+cmVhZF9vZmZzZXQgPCB3cml0ZV9vZmZzZXQpOworCisJcmV0dXJuOworCitmYXRhbF9lcnI6CisJaWYgKCFuZXRkZXZfbGlua19vayhhZGFwdGVyLT5uZXRkZXYpKQorCQlhdGwxZV9yZXNldChhZGFwdGVyKTsKK30KKworLyoKKyAqIGF0bDFlX3BvbGwgLSBwb2xsIGZvciBjb21wbGV0ZWQgdHJhbnNtaXNzaW9ucyBhbmQgcmVjZWl2ZWQgcGFja2V0cworICogQG5ldGRldjogbmV0d29yayBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgYXRsMWVfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMWVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCWludCBtYXhfaW50cyA9IDY0OworCXUzMiBzdGF0dXM7CisKKwlkbyB7CisJCXN0YXR1cyA9IEFUX1JFQURfUkVHKGh3LCBSRUdfSVNSKTsKKwkJaWYgKChzdGF0dXMgJiBJTVJfTk9STUFMX01BU0spID09IDApCisJCQlicmVhazsKKworCQkvKiBsaW5rIGV2ZW50ICovCisJCWlmIChzdGF0dXMgJiBJU1JfR1BIWSkKKwkJCWF0bDFlX2NsZWFyX3BoeV9pbnQoYWRhcHRlcik7CisJCS8qIEFjayBJU1IgKi8KKwkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfSVNSLCBzdGF0dXMgfCBJU1JfRElTX0lOVCk7CisKKwkJLyogY2hlY2sgaWYgUENJRSBQSFkgTGluayBkb3duICovCisJCWlmIChzdGF0dXMgJiBJU1JfUEhZX0xJTktET1dOKSB7CisJCQlEQkcoImF0bDFlOiBQQ0ktRSBQSFkgbGluayBkb3duOiAleFxuIiwgc3RhdHVzKTsKKwkJCWlmIChuZXRkZXZfbGlua19vayhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCQkJLyogcmVzZXQgTUFDICovCisJCQkJYXRsMWVfaXJxX3Jlc2V0KGFkYXB0ZXIpOworCQkJCWF0bDFlX3Jlc2V0KGFkYXB0ZXIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogY2hlY2sgaWYgRE1BIHJlYWQvd3JpdGUgZXJyb3IgKi8KKwkJaWYgKHN0YXR1cyAmIChJU1JfRE1BUl9UT19SU1QgfCBJU1JfRE1BV19UT19SU1QpKSB7CisJCQlEQkcoImF0bDFlOiBQQ0ktRSBETUEgUlcgZXJyb3I6ICV4XG4iLCBzdGF0dXMpOworCQkJYXRsMWVfaXJxX3Jlc2V0KGFkYXB0ZXIpOworCQkJYXRsMWVfcmVzZXQoYWRhcHRlcik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGxpbmsgZXZlbnQgKi8KKwkJaWYgKHN0YXR1cyAmIChJU1JfR1BIWSB8IElTUl9NQU5VQUwpKSB7CisJCQlhdGwxZV9jaGVja19saW5rKGFkYXB0ZXIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB0cmFuc21pdCBldmVudCAqLworCQlpZiAoc3RhdHVzICYgSVNSX1RYX0VWRU5UKQorCQkJYXRsMWVfY2xlYW5fdHhfaXJxKGFkYXB0ZXIpOworCisJCWlmIChzdGF0dXMgJiBJU1JfUlhfRVZFTlQpCisJCQlhdGwxZV9jbGVhbl9yeF9pcnEoYWRhcHRlcik7CisJfSB3aGlsZSAoLS1tYXhfaW50cyA+IDApOworCisJLyogcmUtZW5hYmxlIEludGVycnVwdCovCisJQVRfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkVHX0lTUiwgMCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bDFlX3RwZF9hdmFpbChzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMWVfdHhfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCXUxNiBuZXh0X3RvX3VzZSA9IDA7CisJdTE2IG5leHRfdG9fY2xlYW4gPSAwOworCisJbmV4dF90b19jbGVhbiA9IHR4X3JpbmctPm5leHRfdG9fY2xlYW47CisJbmV4dF90b191c2UgICA9IHR4X3JpbmctPm5leHRfdG9fdXNlOworCisJcmV0dXJuICh1MTYpKG5leHRfdG9fY2xlYW4gPiBuZXh0X3RvX3VzZSkgPworCQkobmV4dF90b19jbGVhbiAtIG5leHRfdG9fdXNlIC0gMSkgOgorCQkodHhfcmluZy0+Y291bnQgKyBuZXh0X3RvX2NsZWFuIC0gbmV4dF90b191c2UgLSAxKTsKK30KKworLyoKKyAqIGdldCBuZXh0IHVzYWJsZSB0cGQKKyAqIE5vdGU6IHNob3VsZCBjYWxsIGF0bDFlX3RkcF9hdmFpbCB0byBtYWtlIHN1cmUKKyAqIHRoZXJlIGlzIGVub3VnaCB0cGQgdG8gdXNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXRsMWVfdHBkX2Rlc2MgKmF0bDFlX2dldF90cGQoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFlX3R4X3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZzsKKwl1MTYgbmV4dF90b191c2UgPSAwOworCisJbmV4dF90b191c2UgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKKwlpZiAoKyt0eF9yaW5nLT5uZXh0X3RvX3VzZSA9PSB0eF9yaW5nLT5jb3VudCkKKwkJdHhfcmluZy0+bmV4dF90b191c2UgPSAwOworCisJbWVtc2V0KCZ0eF9yaW5nLT5kZXNjW25leHRfdG9fdXNlXSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGwxZV90cGRfZGVzYykpOworCXJldHVybiAoc3RydWN0IGF0bDFlX3RwZF9kZXNjICopJnR4X3JpbmctPmRlc2NbbmV4dF90b191c2VdOworfQorCitzdGF0aWMgc3RydWN0IGF0bDFlX3R4X2J1ZmZlciAqCithdGwxZV9nZXRfdHhfYnVmZmVyKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYXRsMWVfdHBkX2Rlc2MgKnRwZCkKK3sKKwlzdHJ1Y3QgYXRsMWVfdHhfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCisJcmV0dXJuICZ0eF9yaW5nLT50eF9idWZmZXJbdHBkIC0gdHhfcmluZy0+ZGVzY107Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFlX3R4X21hcChzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9iLCBzdHJ1Y3QgYXRsMWVfdHBkX2Rlc2MgKnRwZCkKK3sKKwlzdHJ1Y3QgYXRsMWVfdHhfYnVmZmVyICp0eF9idWZmZXIgPSBOVUxMOworCXUxNiBidWZfbGVuID0gaW9iX2xlbihpb2IpOworCisJdHhfYnVmZmVyID0gYXRsMWVfZ2V0X3R4X2J1ZmZlcihhZGFwdGVyLCB0cGQpOworCXR4X2J1ZmZlci0+aW9iID0gaW9iOworCXR4X2J1ZmZlci0+bGVuZ3RoID0gYnVmX2xlbjsKKwl0eF9idWZmZXItPmRtYSA9IHZpcnRfdG9fYnVzKGlvYi0+ZGF0YSk7CisJdHBkLT5idWZmZXJfYWRkciA9IGNwdV90b19sZTY0KHR4X2J1ZmZlci0+ZG1hKTsKKwl0cGQtPndvcmQyID0gKCh0cGQtPndvcmQyICYgflRQRF9CVUZMRU5fTUFTSykgfAorCQkgICAgICAoKGNwdV90b19sZTMyKGJ1Zl9sZW4pICYgVFBEX0JVRkxFTl9NQVNLKSA8PAorCQkgICAgICAgVFBEX0JVRkxFTl9TSElGVCkpOworCXRwZC0+d29yZDMgfD0gMSA8PCBUUERfRU9QX1NISUZUOworfQorCitzdGF0aWMgdm9pZCBhdGwxZV90eF9xdWV1ZShzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlciwgdTE2IGNvdW50IF9fdW51c2VkLAorCQkJICAgc3RydWN0IGF0bDFlX3RwZF9kZXNjICp0cGQgX191bnVzZWQpCit7CisJc3RydWN0IGF0bDFlX3R4X3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZzsKKwl3bWIoKTsKKwlBVF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfTUJfVFBEX1BST0RfSURYLCB0eF9yaW5nLT5uZXh0X3RvX3VzZSk7Cit9CisKK3N0YXRpYyBpbnQgYXRsMWVfeG1pdF9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IpCit7CisJc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUxNiB0cGRfcmVxID0gMTsKKwlzdHJ1Y3QgYXRsMWVfdHBkX2Rlc2MgKnRwZDsKKworCWlmICghbmV0ZGV2X2xpbmtfb2sobmV0ZGV2KSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYXRsMWVfdHBkX2F2YWlsKGFkYXB0ZXIpIDwgdHBkX3JlcSkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXRwZCA9IGF0bDFlX2dldF90cGQoYWRhcHRlcik7CisKKwlhdGwxZV90eF9tYXAoYWRhcHRlciwgaW9iLCB0cGQpOworCWF0bDFlX3R4X3F1ZXVlKGFkYXB0ZXIsIHRwZF9yZXEsIHRwZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGF0bDFlX3VwKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJaW50IGVyciA9IDA7CisJdTMyIHZhbDsKKworCS8qIGhhcmR3YXJlIGhhcyBiZWVuIHJlc2V0LCB3ZSBuZWVkIHRvIHJlbG9hZCBzb21lIHRoaW5ncyAqLworCWVyciA9IGF0bDFlX2luaXRfaHcoJmFkYXB0ZXItPmh3KTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiAtRUlPOworCX0KKwlhdGwxZV9pbml0X3JpbmdfcHRycyhhZGFwdGVyKTsKKworCW1lbWNweShhZGFwdGVyLT5ody5tYWNfYWRkciwgbmV0ZGV2LT5sbF9hZGRyLCBFVEhfQUxFTik7CisKKwlpZiAoYXRsMWVfY29uZmlndXJlKGFkYXB0ZXIpICE9IDApIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJYXRsMWVfaXJxX2Rpc2FibGUoYWRhcHRlcik7CisKKwl2YWwgPSBBVF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQVNURVJfQ1RSTCk7CisJQVRfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkVHX01BU1RFUl9DVFJMLAorCQkgICAgICB2YWwgfCBNQVNURVJfQ1RSTF9NQU5VQUxfSU5UKTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgYXRsMWVfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBlbmFibGUpCit7CisJc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKGVuYWJsZSkKKwkJYXRsMWVfaXJxX2VuYWJsZShhZGFwdGVyKTsKKwllbHNlCisJCWF0bDFlX2lycV9kaXNhYmxlKGFkYXB0ZXIpOworfQorCit2b2lkIGF0bDFlX2Rvd24oc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCS8qIHJlc2V0IE1BQyB0byBkaXNhYmxlIGFsbCBSWC9UWCAqLworCWF0bDFlX3Jlc2V0X2h3KCZhZGFwdGVyLT5odyk7CisJbWRlbGF5KDEpOworCisJbmV0ZGV2X2xpbmtfZG93bihuZXRkZXYpOworCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gLTE7CisKKwlhdGwxZV9jbGVhbl90eF9yaW5nKGFkYXB0ZXIpOworCWF0bDFlX2NsZWFuX3J4X3JpbmcoYWRhcHRlcik7Cit9CisKKy8qCisgKiBhdGwxZV9vcGVuIC0gQ2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlIGFjdGl2ZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlCisgKgorICogVGhlIG9wZW4gZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlCisgKiBhY3RpdmUgYnkgdGhlIHN5c3RlbSAoSUZGX1VQKS4gIEF0IHRoaXMgcG9pbnQgYWxsIHJlc291cmNlcyBuZWVkZWQKKyAqIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZSBvcGVyYXRpb25zIGFyZSBhbGxvY2F0ZWQsIHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPUywgdGhlIHdhdGNoZG9nIHRpbWVyIGlzIHN0YXJ0ZWQsCisgKiBhbmQgdGhlIHN0YWNrIGlzIG5vdGlmaWVkIHRoYXQgdGhlIGludGVyZmFjZSBpcyByZWFkeS4KKyAqLworc3RhdGljIGludCBhdGwxZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnI7CisKKwkvKiBhbGxvY2F0ZSByeC90eCBkbWEgYnVmZmVyICYgZGVzY3JpcHRvcnMgKi8KKwlhdGwxZV9pbml0X3JpbmdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWVyciA9IGF0bDFlX3NldHVwX3JpbmdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBhdGwxZV91cChhZGFwdGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl91cDsKKworCXJldHVybiAwOworCitlcnJfdXA6CisJYXRsMWVfZnJlZV9yaW5nX3Jlc291cmNlcyhhZGFwdGVyKTsKKwlhdGwxZV9yZXNldF9odygmYWRhcHRlci0+aHcpOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGF0bDFlX2Nsb3NlIC0gRGlzYWJsZXMgYSBuZXR3b3JrIGludGVyZmFjZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCwgdGhpcyBpcyBub3QgYWxsb3dlZCB0byBmYWlsCisgKgorICogVGhlIGNsb3NlIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGFuIGludGVyZmFjZSBpcyBkZS1hY3RpdmF0ZWQKKyAqIGJ5IHRoZSBPUy4gIFRoZSBoYXJkd2FyZSBpcyBzdGlsbCB1bmRlciB0aGUgZHJpdmVycyBjb250cm9sLCBidXQKKyAqIG5lZWRzIHRvIGJlIGRpc2FibGVkLiAgQSBnbG9iYWwgTUFDIHJlc2V0IGlzIGlzc3VlZCB0byBzdG9wIHRoZQorICogaGFyZHdhcmUsIGFuZCBhbGwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcmVzb3VyY2VzIGFyZSBmcmVlZC4KKyAqLworc3RhdGljIHZvaWQgYXRsMWVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlhdGwxZV9kb3duKGFkYXB0ZXIpOworCWF0bDFlX2ZyZWVfcmluZ19yZXNvdXJjZXMoYWRhcHRlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcGVyYXRpb25zIGF0bDFlX25ldGRldl9vcHMgPSB7CisJLm9wZW4JCT0gYXRsMWVfb3BlbiwKKwkuY2xvc2UJCT0gYXRsMWVfY2xvc2UsCisJLnRyYW5zbWl0CT0gYXRsMWVfeG1pdF9mcmFtZSwKKwkucG9sbAkJPSBhdGwxZV9wb2xsLAorCS5pcnEJCT0gYXRsMWVfaXJxLAorfTsKKworc3RhdGljIHZvaWQgYXRsMWVfaW5pdF9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJbmV0ZGV2X2luaXQobmV0ZGV2LCAmYXRsMWVfbmV0ZGV2X29wcyk7CisKKwluZXRkZXYtPmRldiA9ICZwZGV2LT5kZXY7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7Cit9CisKKy8qCisgKiBhdGwxZV9wcm9iZSAtIERldmljZSBJbml0aWFsaXphdGlvbiBSb3V0aW5lCisgKiBAcGRldjogUENJIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3QKKyAqIEBlbnQ6IGVudHJ5IGluIGF0bDFlX3BjaV90YmwKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoKKyAqIGF0bDFlX3Byb2JlIGluaXRpYWxpemVzIGFuIGFkYXB0ZXIgaWRlbnRpZmllZCBieSBhIHBjaV9kZXZpY2Ugc3RydWN0dXJlLgorICogVGhlIE9TIGluaXRpYWxpemF0aW9uLCBjb25maWd1cmluZyBvZiB0aGUgYWRhcHRlciBwcml2YXRlIHN0cnVjdHVyZSwKKyAqIGFuZCBhIGhhcmR3YXJlIHJlc2V0IG9jY3VyLgorICovCitzdGF0aWMgaW50IGF0bDFlX3Byb2JlKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2LAorCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCBfX3VudXNlZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyID0gTlVMTDsKKwlzdGF0aWMgaW50IGNhcmRzX2ZvdW5kOworCisJaW50IGVyciA9IDA7CisKKwlhZGp1c3RfcGNpX2RldmljZShwZGV2KTsKKworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYXRsMWVfYWRhcHRlcikpOworCWlmIChuZXRkZXYgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlEQkcoImF0bDFlOiBvdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgbmV0X2RldmljZVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWF0bDFlX2luaXRfbmV0ZGV2KG5ldGRldiwgcGRldik7CisKKwlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlhZGFwdGVyLT5iZF9udW1iZXIgPSBjYXJkc19mb3VuZDsKKwlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisJYWRhcHRlci0+aHcuYWRhcHRlciA9IGFkYXB0ZXI7CisJaWYgKCFwZGV2LT5tZW1iYXNlKSB7CisJCWVyciA9IC1FSU87CisJCURCRygiYXRsMWU6IGNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZXJyX2ZyZWVfbmV0ZGV2OworCX0KKwlhZGFwdGVyLT5ody5od19hZGRyID0gYnVzX3RvX3ZpcnQocGRldi0+bWVtYmFzZSk7CisKKwkvKiBpbml0IG1paSBkYXRhICovCisJYWRhcHRlci0+bWlpLmRldiA9IG5ldGRldjsKKwlhZGFwdGVyLT5taWkubWRpb19yZWFkICA9IGF0bDFlX21kaW9fcmVhZDsKKwlhZGFwdGVyLT5taWkubWRpb193cml0ZSA9IGF0bDFlX21kaW9fd3JpdGU7CisJYWRhcHRlci0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlhZGFwdGVyLT5taWkucmVnX251bV9tYXNrID0gTURJT19SRUdfQUREUl9NQVNLOworCisJLyogZ2V0IHVzZXIgc2V0dGluZ3MgKi8KKwlhZGFwdGVyLT50eF9yaW5nLmNvdW50ID0gVFhfREVTQ19DT1VOVDsKKwlhZGFwdGVyLT5yeF9yaW5nLnBhZ2Vfc2l6ZSA9IFJYX01FTV9TSVpFOworCisJYXRsMWVfc2V0dXBfcGNpY21kKHBkZXYpOworCisJLyogc2V0dXAgdGhlIHByaXZhdGUgc3RydWN0dXJlICovCisJZXJyID0gYXRsMWVfc3dfaW5pdChhZGFwdGVyKTsKKwlpZiAoZXJyKSB7CisJCURCRygiYXRsMWU6IHByaXZhdGUgZGF0YSBpbml0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWVfbmV0ZGV2OworCX0KKworCS8qIEluaXQgR1BIWSBhcyBlYXJseSBhcyBwb3NzaWJsZSBkdWUgdG8gcG93ZXIgc2F2aW5nIGlzc3VlICAqLworCWF0bDFlX3BoeV9pbml0KCZhZGFwdGVyLT5odyk7CisKKwkvKiByZXNldCB0aGUgY29udHJvbGxlciB0bworCSAqIHB1dCB0aGUgZGV2aWNlIGluIGEga25vd24gZ29vZCBzdGFydGluZyBzdGF0ZSAqLworCWVyciA9IGF0bDFlX3Jlc2V0X2h3KCZhZGFwdGVyLT5odyk7CisJaWYgKGVycikgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9mcmVlX25ldGRldjsKKwl9CisKKwkvKiBUaGlzIG1heSBoYXZlIGJlZW4gcnVuIGJ5IGEgemVyby13YWl0IHRpbWVyIGFyb3VuZAorCSAgIG5vdy4uLiB1bmNsZWFyLiAqLworCWF0bDFlX3Jlc3RhcnRfYXV0b25lZygmYWRhcHRlci0+aHcpOworCisJaWYgKGF0bDFlX3JlYWRfbWFjX2FkZHIoJmFkYXB0ZXItPmh3KSAhPSAwKSB7CisJCURCRygiYXRsMWU6IGNhbm5vdCByZWFkIE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfZnJlZV9uZXRkZXY7CisJfQorCisJbWVtY3B5KG5ldGRldi0+aHdfYWRkciwgYWRhcHRlci0+aHcucGVybV9tYWNfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShuZXRkZXYtPmxsX2FkZHIsIGFkYXB0ZXItPmh3Lm1hY19hZGRyLCBFVEhfQUxFTik7CisJREJHKCJhdGwxZTogQXR0YW5zaWMgTDFFIEV0aGVybmV0IGNvbnRyb2xsZXIgb24gJXMsICIKKwkgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsCisJICAgIGFkYXB0ZXItPmh3Lm1hY19hZGRyWzBdLCBhZGFwdGVyLT5ody5tYWNfYWRkclsxXSwKKwkgICAgYWRhcHRlci0+aHcubWFjX2FkZHJbMl0sIGFkYXB0ZXItPmh3Lm1hY19hZGRyWzNdLAorCSAgICBhZGFwdGVyLT5ody5tYWNfYWRkcls0XSwgYWRhcHRlci0+aHcubWFjX2FkZHJbNV0pOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJaWYgKGVycikgeworCQlEQkcoImF0bDFlOiBjYW5ub3QgcmVnaXN0ZXIgbmV0d29yayBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9mcmVlX25ldGRldjsKKwl9CisKKwluZXRkZXZfbGlua19kb3duKG5ldGRldik7CisKKwljYXJkc19mb3VuZCsrOworCXJldHVybiAwOworCitlcnJfZnJlZV9uZXRkZXY6CisJbmV0ZGV2X251bGxpZnkobmV0ZGV2KTsKKwluZXRkZXZfcHV0KG5ldGRldik7CitlcnI6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGF0bDFlX3JlbW92ZSAtIERldmljZSBSZW1vdmFsIFJvdXRpbmUKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdAorICoKKyAqIGF0bDFlX3JlbW92ZSBpcyBjYWxsZWQgYnkgdGhlIFBDSSBzdWJzeXN0ZW0gdG8gYWxlcnQgdGhlIGRyaXZlcgorICogdGhhdCBpdCBzaG91bGQgcmVsZWFzZSBhIFBDSSBkZXZpY2UuICBUaGUgY291bGQgYmUgY2F1c2VkIGJ5IGEKKyAqIEhvdC1QbHVnIGV2ZW50LCBvciBiZWNhdXNlIHRoZSBkcml2ZXIgaXMgZ29pbmcgdG8gYmUgcmVtb3ZlZCBmcm9tCisgKiBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJYXRsMWVfZnJlZV9yaW5nX3Jlc291cmNlcyhhZGFwdGVyKTsKKwlhdGwxZV9mb3JjZV9wcygmYWRhcHRlci0+aHcpOworCW5ldGRldl9udWxsaWZ5KG5ldGRldik7CisJbmV0ZGV2X3B1dChuZXRkZXYpOworfQorCitzdHJ1Y3QgcGNpX2RyaXZlciBhdGwxZV9kcml2ZXIgX19wY2lfZHJpdmVyID0geworCS5pZHMgICAgICA9IGF0bDFlX3BjaV90YmwsCisJLmlkX2NvdW50ID0gKHNpemVvZihhdGwxZV9wY2lfdGJsKSAvIHNpemVvZihhdGwxZV9wY2lfdGJsWzBdKSksCisJLnByb2JlICAgID0gYXRsMWVfcHJvYmUsCisJLnJlbW92ZSAgID0gYXRsMWVfcmVtb3ZlLAorfTsKKworLyoqKioqKioqKiogSGFyZHdhcmUtbGV2ZWwgZnVuY3Rpb25zOiAqKioqKioqKioqLworCisvKgorICogY2hlY2tfZWVwcm9tX2V4aXN0CisgKiByZXR1cm4gMCBpZiBlZXByb20gZXhpc3QKKyAqLworaW50IGF0bDFlX2NoZWNrX2VlcHJvbV9leGlzdChzdHJ1Y3QgYXRsMWVfaHcgKmh3KQoreworCXUzMiB2YWx1ZTsKKworCXZhbHVlID0gQVRfUkVBRF9SRUcoaHcsIFJFR19TUElfRkxBU0hfQ1RSTCk7CisJaWYgKHZhbHVlICYgU1BJX0ZMQVNIX0NUUkxfRU5fVlBEKSB7CisJCXZhbHVlICY9IH5TUElfRkxBU0hfQ1RSTF9FTl9WUEQ7CisJCUFUX1dSSVRFX1JFRyhodywgUkVHX1NQSV9GTEFTSF9DVFJMLCB2YWx1ZSk7CisJfQorCXZhbHVlID0gQVRfUkVBRF9SRUdXKGh3LCBSRUdfUENJRV9DQVBfTElTVCk7CisJcmV0dXJuICgodmFsdWUgJiAweEZGMDApID09IDB4NkMwMCkgPyAwIDogMTsKK30KKwordm9pZCBhdGwxZV9od19zZXRfbWFjX2FkZHIoc3RydWN0IGF0bDFlX2h3ICpodykKK3sKKwl1MzIgdmFsdWU7CisJLyoKKwkgKiAwMC0wQi02QS1GNi0wMC1EQworCSAqIDA6ICA2QUY2MDBEQyAxOiAwMDBCCisJICogbG93IGR3b3JkCisJICovCisJdmFsdWUgPSAoKCh1MzIpaHctPm1hY19hZGRyWzJdKSA8PCAyNCkgfAorCQkoKCh1MzIpaHctPm1hY19hZGRyWzNdKSA8PCAxNikgfAorCQkoKCh1MzIpaHctPm1hY19hZGRyWzRdKSA8PCA4KSAgfAorCQkoKCh1MzIpaHctPm1hY19hZGRyWzVdKSkgOworCUFUX1dSSVRFX1JFR19BUlJBWShodywgUkVHX01BQ19TVEFfQUREUiwgMCwgdmFsdWUpOworCS8qIGhpZ2h0IGR3b3JkICovCisJdmFsdWUgPSAoKCh1MzIpaHctPm1hY19hZGRyWzBdKSA8PCA4KSB8CisJCSgoKHUzMilody0+bWFjX2FkZHJbMV0pKSA7CisJQVRfV1JJVEVfUkVHX0FSUkFZKGh3LCBSRUdfTUFDX1NUQV9BRERSLCAxLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBhdGwxZV9nZXRfcGVybWFuZW50X2FkZHJlc3MKKyAqIHJldHVybiAwIGlmIGdldCB2YWxpZCBtYWMgYWRkcmVzcywKKyAqLworc3RhdGljIGludCBhdGwxZV9nZXRfcGVybWFuZW50X2FkZHJlc3Moc3RydWN0IGF0bDFlX2h3ICpodykKK3sKKwl1bmlvbiB7CisJCXUzMiBkd29yZFsyXTsKKwkJdTggYnl0ZVs4XTsKKwl9IGh3X2FkZHI7CisJdTMyIGk7CisJdTMyIHR3c2lfY3RybF9kYXRhOworCXU4ICBldGhfYWRkcltFVEhfQUxFTl07CisKKwlpZiAoIWF0bDFlX2NoZWNrX2VlcHJvbV9leGlzdChodykpIHsKKwkJLyogZWVwcm9tIGV4aXN0ICovCisJCXR3c2lfY3RybF9kYXRhID0gQVRfUkVBRF9SRUcoaHcsIFJFR19UV1NJX0NUUkwpOworCQl0d3NpX2N0cmxfZGF0YSB8PSBUV1NJX0NUUkxfU1dfTERTVEFSVDsKKwkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfVFdTSV9DVFJMLCB0d3NpX2N0cmxfZGF0YSk7CisJCWZvciAoaSA9IDA7IGkgPCBBVF9UV1NJX0VFUFJPTV9USU1FT1VUOyBpKyspIHsKKwkJCW1kZWxheSgxMCk7CisJCQl0d3NpX2N0cmxfZGF0YSA9IEFUX1JFQURfUkVHKGh3LCBSRUdfVFdTSV9DVFJMKTsKKwkJCWlmICgodHdzaV9jdHJsX2RhdGEgJiBUV1NJX0NUUkxfU1dfTERTVEFSVCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA+PSBBVF9UV1NJX0VFUFJPTV9USU1FT1VUKQorCQkJcmV0dXJuIEFUX0VSUl9USU1FT1VUOworCX0KKworCS8qIG1heWJlIE1BQy1hZGRyZXNzIGlzIGZyb20gQklPUyAqLworCWh3X2FkZHIuZHdvcmRbMF0gPSBBVF9SRUFEX1JFRyhodywgUkVHX01BQ19TVEFfQUREUik7CisJaHdfYWRkci5kd29yZFsxXSA9IEFUX1JFQURfUkVHKGh3LCBSRUdfTUFDX1NUQV9BRERSICsgNCk7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJZXRoX2FkZHJbRVRIX0FMRU4gLSBpIC0gMV0gPSBod19hZGRyLmJ5dGVbaV07CisJfQorCisJbWVtY3B5KGh3LT5wZXJtX21hY19hZGRyLCBldGhfYWRkciwgRVRIX0FMRU4pOworCXJldHVybiAwOworfQorCit2b2lkIGF0bDFlX2ZvcmNlX3BzKHN0cnVjdCBhdGwxZV9odyAqaHcpCit7CisJQVRfV1JJVEVfUkVHVyhodywgUkVHX0dQSFlfQ1RSTCwKKwkJCUdQSFlfQ1RSTF9QV19XT0xfRElTIHwgR1BIWV9DVFJMX0VYVF9SRVNFVCk7Cit9CisKKy8qCisgKiBSZWFkcyB0aGUgYWRhcHRlcidzIE1BQyBhZGRyZXNzIGZyb20gdGhlIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKi8KK2ludCBhdGwxZV9yZWFkX21hY19hZGRyKHN0cnVjdCBhdGwxZV9odyAqaHcpCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgPSBhdGwxZV9nZXRfcGVybWFuZW50X2FkZHJlc3MoaHcpOworCWlmIChlcnIpCisJCXJldHVybiBBVF9FUlJfRUVQUk9NOworCW1lbWNweShody0+bWFjX2FkZHIsIGh3LT5wZXJtX21hY19hZGRyLCBzaXplb2YoaHctPnBlcm1fbWFjX2FkZHIpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWRzIHRoZSB2YWx1ZSBmcm9tIGEgUEhZIHJlZ2lzdGVyCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogcmVnX2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBQSFkgcmVnaXN0ZXIgdG8gcmVhZAorICovCitpbnQgYXRsMWVfcmVhZF9waHlfcmVnKHN0cnVjdCBhdGwxZV9odyAqaHcsIHUxNiByZWdfYWRkciwgdTE2ICpwaHlfZGF0YSkKK3sKKwl1MzIgdmFsOworCWludCBpOworCisJdmFsID0gKCh1MzIpKHJlZ19hZGRyICYgTURJT19SRUdfQUREUl9NQVNLKSkgPDwgTURJT19SRUdfQUREUl9TSElGVCB8CisJCU1ESU9fU1RBUlQgfCBNRElPX1NVUF9QUkVBTUJMRSB8IE1ESU9fUlcgfAorCQlNRElPX0NMS18yNV80IDw8IE1ESU9fQ0xLX1NFTF9TSElGVDsKKworCUFUX1dSSVRFX1JFRyhodywgUkVHX01ESU9fQ1RSTCwgdmFsKTsKKworCXdtYigpOworCisJZm9yIChpID0gMDsgaSA8IE1ESU9fV0FJVF9USU1FUzsgaSsrKSB7CisJCXVkZWxheSgyKTsKKwkJdmFsID0gQVRfUkVBRF9SRUcoaHcsIFJFR19NRElPX0NUUkwpOworCQlpZiAoISh2YWwgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpKQorCQkJYnJlYWs7CisJCXdtYigpOworCX0KKwlpZiAoISh2YWwgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpKSB7CisJCSpwaHlfZGF0YSA9ICh1MTYpdmFsOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gQVRfRVJSX1BIWTsKK30KKworLyoKKyAqIFdyaXRlcyBhIHZhbHVlIHRvIGEgUEhZIHJlZ2lzdGVyCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogcmVnX2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBQSFkgcmVnaXN0ZXIgdG8gd3JpdGUKKyAqIGRhdGEgLSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBQSFkKKyAqLworaW50IGF0bDFlX3dyaXRlX3BoeV9yZWcoc3RydWN0IGF0bDFlX2h3ICpodywgdTMyIHJlZ19hZGRyLCB1MTYgcGh5X2RhdGEpCit7CisJaW50IGk7CisJdTMyIHZhbDsKKworCXZhbCA9ICgodTMyKShwaHlfZGF0YSAmIE1ESU9fREFUQV9NQVNLKSkgPDwgTURJT19EQVRBX1NISUZUIHwKKwkgICAgICAgKHJlZ19hZGRyJk1ESU9fUkVHX0FERFJfTUFTSykgPDwgTURJT19SRUdfQUREUl9TSElGVCB8CisJICAgICAgIE1ESU9fU1VQX1BSRUFNQkxFIHwKKwkgICAgICAgTURJT19TVEFSVCB8CisJICAgICAgIE1ESU9fQ0xLXzI1XzQgPDwgTURJT19DTEtfU0VMX1NISUZUOworCisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfTURJT19DVFJMLCB2YWwpOworCXdtYigpOworCisJZm9yIChpID0gMDsgaSA8IE1ESU9fV0FJVF9USU1FUzsgaSsrKSB7CisJCXVkZWxheSgyKTsKKwkJdmFsID0gQVRfUkVBRF9SRUcoaHcsIFJFR19NRElPX0NUUkwpOworCQlpZiAoISh2YWwgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpKQorCQkJYnJlYWs7CisJCXdtYigpOworCX0KKworCWlmICghKHZhbCAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIEFUX0VSUl9QSFk7Cit9CisKKy8qCisgKiBhdGwxZV9pbml0X3BjaWUgLSBpbml0IFBDSUUgbW9kdWxlCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFlX2luaXRfcGNpZShzdHJ1Y3QgYXRsMWVfaHcgKmh3KQoreworCXUzMiB2YWx1ZTsKKwkvKiBjb21tZW50IDJsaW5lcyBiZWxvdyB0byBzYXZlIG1vcmUgcG93ZXIgd2hlbiBzdXN1c3BlbmQKKwkgICB2YWx1ZSA9IExUU1NNX1RFU1RfTU9ERV9ERUY7CisJICAgQVRfV1JJVEVfUkVHKGh3LCBSRUdfTFRTU01fVEVTVF9NT0RFLCB2YWx1ZSk7CisJICovCisKKwkvKiBwY2llIGZsb3cgY29udHJvbCBtb2RlIGNoYW5nZSAqLworCXZhbHVlID0gQVRfUkVBRF9SRUcoaHcsIDB4MTAwOCk7CisJdmFsdWUgfD0gMHg4MDAwOworCUFUX1dSSVRFX1JFRyhodywgMHgxMDA4LCB2YWx1ZSk7Cit9CisvKgorICogQ29uZmlndXJlcyBQSFkgYXV0b25lZyBhbmQgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQgc2V0dGluZ3MKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICovCitzdGF0aWMgaW50IGF0bDFlX3BoeV9zZXR1cF9hdXRvbmVnX2FkdihzdHJ1Y3QgYXRsMWVfaHcgKmh3KQoreworCXMzMiByZXRfdmFsOworCXUxNiBtaWlfYXV0b25lZ19hZHZfcmVnOworCXUxNiBtaWlfMTAwMHRfY3RybF9yZWc7CisKKwlpZiAoMCAhPSBody0+bWlpX2F1dG9uZWdfYWR2X3JlZykKKwkJcmV0dXJuIDA7CisJLyogUmVhZCB0aGUgTUlJIEF1dG8tTmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNC85KS4gKi8KKwltaWlfYXV0b25lZ19hZHZfcmVnID0gTUlJX0FSX0RFRkFVTFRfQ0FQX01BU0s7CisJbWlpXzEwMDB0X2N0cmxfcmVnICA9IE1JSV9BVDAwMV9DUl8xMDAwVF9ERUZBVUxUX0NBUF9NQVNLOworCisJLyoKKwkgKiBGaXJzdCB3ZSBjbGVhciBhbGwgdGhlIDEwLzEwMCBtYiBzcGVlZCBiaXRzIGluIHRoZSBBdXRvLU5lZworCSAqIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkgYW5kIHRoZSAxMDAwIG1iIHNwZWVkIGJpdHMgaW4KKwkgKiB0aGUgIDEwMDBCYXNlLVQgY29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4KKwkgKi8KKwltaWlfYXV0b25lZ19hZHZfcmVnICY9IH5NSUlfQVJfU1BFRURfTUFTSzsKKwltaWlfMTAwMHRfY3RybF9yZWcgICY9IH5NSUlfQVQwMDFfQ1JfMTAwMFRfU1BFRURfTUFTSzsKKworCS8qIEFzc3VtZSBhdXRvLWRldGVjdCBtZWRpYSB0eXBlICovCisJbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSAoTUlJX0FSXzEwVF9IRF9DQVBTICAgfAorCQkJCU1JSV9BUl8xMFRfRkRfQ0FQUyAgIHwKKwkJCQlNSUlfQVJfMTAwVFhfSERfQ0FQUyB8CisJCQkJTUlJX0FSXzEwMFRYX0ZEX0NBUFMpOworCWlmIChody0+bmljX3R5cGUgPT0gYXRocl9sMWUpIHsKKwkJbWlpXzEwMDB0X2N0cmxfcmVnIHw9IE1JSV9BVDAwMV9DUl8xMDAwVF9GRF9DQVBTOworCX0KKworCS8qIGZsb3cgY29udHJvbCBmaXhlZCB0byBlbmFibGUgYWxsICovCisJbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSAoTUlJX0FSX0FTTV9ESVIgfCBNSUlfQVJfUEFVU0UpOworCisJaHctPm1paV9hdXRvbmVnX2Fkdl9yZWcgPSBtaWlfYXV0b25lZ19hZHZfcmVnOworCWh3LT5taWlfMTAwMHRfY3RybF9yZWcgID0gbWlpXzEwMDB0X2N0cmxfcmVnOworCisJcmV0X3ZhbCA9IGF0bDFlX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9BRFZFUlRJU0UsIG1paV9hdXRvbmVnX2Fkdl9yZWcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCWlmIChody0+bmljX3R5cGUgPT0gYXRocl9sMWUgfHwgaHctPm5pY190eXBlID09IGF0aHJfbDJlX3JldkEpIHsKKwkJcmV0X3ZhbCA9IGF0bDFlX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9BVDAwMV9DUiwKKwkJCQkJICAgbWlpXzEwMDB0X2N0cmxfcmVnKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUmVzZXRzIHRoZSBQSFkgYW5kIG1ha2UgYWxsIGNvbmZpZyB2YWxpZGF0ZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogU2V0cyBiaXQgMTUgYW5kIDEyIG9mIHRoZSBNSUkgY29udHJvbCByZWdpc2VyIChmb3IgRjAwMSBidWcpCisgKi8KK2ludCBhdGwxZV9waHlfY29tbWl0KHN0cnVjdCBhdGwxZV9odyAqaHcpCit7CisJaW50IHJldF92YWw7CisJdTE2IHBoeV9kYXRhOworCisJcGh5X2RhdGEgPSBNSUlfQ1JfUkVTRVQgfCBNSUlfQ1JfQVVUT19ORUdfRU4gfCBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRzsKKworCXJldF92YWwgPSBhdGwxZV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQk1DUiwgcGh5X2RhdGEpOworCWlmIChyZXRfdmFsKSB7CisJCXUzMiB2YWw7CisJCWludCBpOworCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJICogcGNpZSBzZXJkZXMgbGluayBtYXkgYmUgZG93biAhCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJZm9yIChpID0gMDsgaSA8IDI1OyBpKyspIHsKKwkJCW1kZWxheSgxKTsKKwkJCXZhbCA9IEFUX1JFQURfUkVHKGh3LCBSRUdfTURJT19DVFJMKTsKKwkJCWlmICghKHZhbCAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoMCAhPSAodmFsICYgKE1ESU9fU1RBUlQgfCBNRElPX0JVU1kpKSkgeworCQkJREJHKCJhdGwxZTogUENJLUUgbGluayBkb3duIGZvciBhdCBsZWFzdCAyNW1zXG4iKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisKKwkJREJHKCJhdGwxZTogUENJLUUgbGluayB1cCBhZnRlciAlZCBtc1xuIiwgaSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgYXRsMWVfcGh5X2luaXQoc3RydWN0IGF0bDFlX2h3ICpodykKK3sKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgcGh5X3ZhbDsKKworCWlmIChody0+cGh5X2NvbmZpZ3VyZWQpIHsKKwkJaWYgKGh3LT5yZV9hdXRvbmVnKSB7CisJCQlody0+cmVfYXV0b25lZyA9IDA7CisJCQlyZXR1cm4gYXRsMWVfcmVzdGFydF9hdXRvbmVnKGh3KTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSRVNFVCBHUEhZIENvcmUgKi8KKwlBVF9XUklURV9SRUdXKGh3LCBSRUdfR1BIWV9DVFJMLCBHUEhZX0NUUkxfREVGQVVMVCk7CisJbWRlbGF5KDIpOworCUFUX1dSSVRFX1JFR1coaHcsIFJFR19HUEhZX0NUUkwsIEdQSFlfQ1RSTF9ERUZBVUxUIHwKKwkJICAgICAgR1BIWV9DVFJMX0VYVF9SRVNFVCk7CisJbWRlbGF5KDIpOworCisJLyogcGF0Y2hlcyAqLworCS8qIHAxLiBlYWJsZSBoaWJlcm5hdGlvbiBtb2RlICovCisJcmV0X3ZhbCA9IGF0bDFlX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfQUREUiwgMHhCKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisJcmV0X3ZhbCA9IGF0bDFlX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfREFUQSwgMHhCQzAwKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisJLyogcDIuIHNldCBDbGFzcyBBL0IgZm9yIGFsbCBtb2RlcyAqLworCXJldF92YWwgPSBhdGwxZV93cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0FERFIsIDApOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlwaHlfdmFsID0gMHgwMmVmOworCS8qIHJlbW92ZSBDbGFzcyBBQiAqLworCS8qIHBoeV92YWwgPSBody0+ZW1pX2NhID8gMHgwMmVmIDogMHgwMmRmOyAqLworCXJldF92YWwgPSBhdGwxZV93cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0RBVEEsIHBoeV92YWwpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwkvKiBwMy4gMTBCID8/PyAqLworCXJldF92YWwgPSBhdGwxZV93cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0FERFIsIDB4MTIpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlyZXRfdmFsID0gYXRsMWVfd3JpdGVfcGh5X3JlZyhodywgTUlJX0RCR19EQVRBLCAweDRDMDQpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwkvKiBwNC4gMTAwMFQgcG93ZXIgKi8KKwlyZXRfdmFsID0gYXRsMWVfd3JpdGVfcGh5X3JlZyhodywgTUlJX0RCR19BRERSLCAweDQpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlyZXRfdmFsID0gYXRsMWVfd3JpdGVfcGh5X3JlZyhodywgTUlJX0RCR19EQVRBLCAweDhCQkIpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXJldF92YWwgPSBhdGwxZV93cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0FERFIsIDB4NSk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCXJldF92YWwgPSBhdGwxZV93cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0RBVEEsIDB4MkM0Nik7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJbWRlbGF5KDEpOworCisJLypFbmFibGUgUEhZIExpbmtDaGFuZ2UgSW50ZXJydXB0ICovCisJcmV0X3ZhbCA9IGF0bDFlX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9JTlRfQ1RSTCwgMHhDMDApOworCWlmIChyZXRfdmFsKSB7CisJCURCRygiYXRsMWU6IEVycm9yIGVuYWJsZSBQSFkgbGlua0NoYW5nZSBJbnRlcnJ1cHRcbiIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisJLyogc2V0dXAgQXV0b05lZyBwYXJhbWV0ZXJzICovCisJcmV0X3ZhbCA9IGF0bDFlX3BoeV9zZXR1cF9hdXRvbmVnX2Fkdihodyk7CisJaWYgKHJldF92YWwpIHsKKwkJREJHKCJhdGwxZTogRXJyb3IgU2V0dGluZyB1cCBBdXRvLU5lZ290aWF0aW9uXG4iKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCS8qIFNXLlJlc2V0ICYgRW4tQXV0by1OZWcgdG8gcmVzdGFydCBBdXRvLU5lZyovCisJREJHKCJhdGwxZTogUmVzdGFydGluZyBBdXRvLU5lZyIpOworCXJldF92YWwgPSBhdGwxZV9waHlfY29tbWl0KGh3KTsKKwlpZiAocmV0X3ZhbCkgeworCQlEQkcoImF0bDFlOiBFcnJvciBSZXNldHRpbmcgdGhlIHBoeSIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlody0+cGh5X2NvbmZpZ3VyZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHM7IG1hc2sgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHJldHVybiA6IDAgIG9yICBpZGxlIHN0YXR1cyAoaWYgZXJyb3IpCisgKi8KK2ludCBhdGwxZV9yZXNldF9odyhzdHJ1Y3QgYXRsMWVfaHcgKmh3KQoreworCXN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyID0gaHctPmFkYXB0ZXI7CisJc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWludCB0aW1lb3V0ID0gMDsKKwl1MzIgaWRsZV9zdGF0dXNfZGF0YSA9IDA7CisJdTE2IHBjaV9jZmdfY21kX3dvcmQgPSAwOworCisJLyogV29ya2Fyb3VuZCBmb3IgUENJIHByb2JsZW0gd2hlbiBCSU9TIHNldHMgTU1SQkMgaW5jb3JyZWN0bHkuICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY2ZnX2NtZF93b3JkKTsKKwlpZiAoKHBjaV9jZmdfY21kX3dvcmQgJiAoUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU0gfAorCQkJCSBQQ0lfQ09NTUFORF9NQVNURVIpKQorCQkJIT0gKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNIHwKKwkJCSAgICBQQ0lfQ09NTUFORF9NQVNURVIpKSB7CisJCXBjaV9jZmdfY21kX3dvcmQgfD0gKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNIHwKKwkJCQkgICAgIFBDSV9DT01NQU5EX01BU1RFUik7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NmZ19jbWRfd29yZCk7CisJfQorCisJLyoKKwkgKiBJc3N1ZSBTb2Z0IFJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncworCSAqIHRyYW5zbWl0LCByZWNlaXZlLCBETUEuICBJdCB3aWxsIG5vdCBlZmZlY3QKKwkgKiB0aGUgY3VycmVudCBQQ0kgY29uZmlndXJhdGlvbi4gIFRoZSBnbG9iYWwgcmVzZXQgYml0IGlzIHNlbGYtCisJICogY2xlYXJpbmcsIGFuZCBzaG91bGQgY2xlYXIgd2l0aGluIGEgbWljcm9zZWNvbmQuCisJICovCisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfTUFTVEVSX0NUUkwsCisJCQlNQVNURVJfQ1RSTF9MRURfTU9ERSB8IE1BU1RFUl9DVFJMX1NPRlRfUlNUKTsKKwl3bWIoKTsKKwltZGVsYXkoMSk7CisKKwkvKiBXYWl0IGF0IGxlYXN0IDEwbXMgZm9yIEFsbCBtb2R1bGUgdG8gYmUgSWRsZSAqLworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCBBVF9IV19NQVhfSURMRV9ERUxBWTsgdGltZW91dCsrKSB7CisJCWlkbGVfc3RhdHVzX2RhdGEgPSBBVF9SRUFEX1JFRyhodywgUkVHX0lETEVfU1RBVFVTKTsKKwkJaWYgKGlkbGVfc3RhdHVzX2RhdGEgPT0gMCkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCisJaWYgKHRpbWVvdXQgPj0gQVRfSFdfTUFYX0lETEVfREVMQVkpIHsKKwkJREJHKCJhdGwxZTogTUFDIHJlc2V0IHRpbWVvdXRcbiIpOworCQlyZXR1cm4gQVRfRVJSX1RJTUVPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFBlcmZvcm1zIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGFkYXB0ZXIuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIEFzc3VtZXMgdGhhdCB0aGUgY29udHJvbGxlciBoYXMgcHJldmlvdXNseSBiZWVuIHJlc2V0IGFuZCBpcyBpbiBhCisgKiBwb3N0LXJlc2V0IHVuaW5pdGlhbGl6ZWQgc3RhdGUuIEluaXRpYWxpemVzIG11bHRpY2FzdCB0YWJsZSwKKyAqIGFuZCAgQ2FsbHMgcm91dGluZXMgdG8gc2V0dXAgbGluaworICogTGVhdmVzIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0cyBkaXNhYmxlZCBhbmQgdW5pbml0aWFsaXplZC4KKyAqLworaW50IGF0bDFlX2luaXRfaHcoc3RydWN0IGF0bDFlX2h3ICpodykKK3sKKwlzMzIgcmV0X3ZhbCA9IDA7CisKKwlhdGwxZV9pbml0X3BjaWUoaHcpOworCisJLyogWmVybyBvdXQgdGhlIE11bHRpY2FzdCBIQVNIIHRhYmxlICovCisJLyogY2xlYXIgdGhlIG9sZCBzZXR0aW5ncyBmcm9tIHRoZSBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLworCUFUX1dSSVRFX1JFRyhodywgUkVHX1JYX0hBU0hfVEFCTEUsIDApOworCUFUX1dSSVRFX1JFR19BUlJBWShodywgUkVHX1JYX0hBU0hfVEFCTEUsIDEsIDApOworCisJcmV0X3ZhbCA9IGF0bDFlX3BoeV9pbml0KGh3KTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRGV0ZWN0cyB0aGUgY3VycmVudCBzcGVlZCBhbmQgZHVwbGV4IHNldHRpbmdzIG9mIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogc3BlZWQgLSBTcGVlZCBvZiB0aGUgY29ubmVjdGlvbgorICogZHVwbGV4IC0gRHVwbGV4IHNldHRpbmcgb2YgdGhlIGNvbm5lY3Rpb24KKyAqLworaW50IGF0bDFlX2dldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBhdGwxZV9odyAqaHcsIHUxNiAqc3BlZWQsIHUxNiAqZHVwbGV4KQoreworCWludCBlcnI7CisJdTE2IHBoeV9kYXRhOworCisJLyogUmVhZCAgIFBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnaXN0ZXIgKDE3KSAqLworCWVyciA9IGF0bDFlX3JlYWRfcGh5X3JlZyhodywgTUlJX0FUMDAxX1BTU1IsICZwaHlfZGF0YSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICghKHBoeV9kYXRhICYgTUlJX0FUMDAxX1BTU1JfU1BEX0RQTFhfUkVTT0xWRUQpKQorCQlyZXR1cm4gQVRfRVJSX1BIWV9SRVM7CisKKwlzd2l0Y2ggKHBoeV9kYXRhICYgTUlJX0FUMDAxX1BTU1JfU1BFRUQpIHsKKwljYXNlIE1JSV9BVDAwMV9QU1NSXzEwMDBNQlM6CisJCSpzcGVlZCA9IFNQRUVEXzEwMDA7CisJCWJyZWFrOworCWNhc2UgTUlJX0FUMDAxX1BTU1JfMTAwTUJTOgorCQkqc3BlZWQgPSBTUEVFRF8xMDA7CisJCWJyZWFrOworCWNhc2UgTUlJX0FUMDAxX1BTU1JfMTBNQlM6CisJCSpzcGVlZCA9IFNQRUVEXzEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gQVRfRVJSX1BIWV9TUEVFRDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHBoeV9kYXRhICYgTUlJX0FUMDAxX1BTU1JfRFBMWCkKKwkJKmR1cGxleCA9IEZVTExfRFVQTEVYOworCWVsc2UKKwkJKmR1cGxleCA9IEhBTEZfRFVQTEVYOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBhdGwxZV9yZXN0YXJ0X2F1dG9uZWcoc3RydWN0IGF0bDFlX2h3ICpodykKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciA9IGF0bDFlX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9BRFZFUlRJU0UsIGh3LT5taWlfYXV0b25lZ19hZHZfcmVnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxZSB8fCBody0+bmljX3R5cGUgPT0gYXRocl9sMmVfcmV2QSkgeworCQllcnIgPSBhdGwxZV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQVQwMDFfQ1IsCisJCQkJICAgICAgIGh3LT5taWlfMTAwMHRfY3RybF9yZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBhdGwxZV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQk1DUiwKKwkJCU1JSV9DUl9SRVNFVCB8IE1JSV9DUl9BVVRPX05FR19FTiB8CisJCQlNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyk7CisJcmV0dXJuIGVycjsKK30KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYXRsMWUuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0bDFlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5YzMyMwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2F0bDFlLmgKQEAgLTAsMCArMSwxMDMxIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDcgQXRoZXJvcyBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDA3IHhpb25nIGh1YW5nIDx4aW9uZy5odWFuZ0BhdGhlcm9zLmNvbT4KKyAqCisgKiBEZXJpdmVkIGZyb20gSW50ZWwgZTEwMDAgZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTW9kaWZpZWQgZm9yIGdQWEUsIE9jdG9iZXIgMjAwOSBieSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0FUTDFFX0hfCisjZGVmaW5lIF9BVEwxRV9IXworCisjaW5jbHVkZSA8bWlpLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvbWFsbG9jLmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL3BjaV9pby5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorCisjZGVmaW5lIEVUSF9GQ1NfTEVOCTQKKyNkZWZpbmUgVkxBTl9ITEVOCTQKKyNkZWZpbmUgTkVUX0lQX0FMSUdOCTIKKworI2RlZmluZSBTUEVFRF8wCQkgICAweGZmZmYKKyNkZWZpbmUgU1BFRURfMTAJICAgMTAKKyNkZWZpbmUgU1BFRURfMTAwCSAgIDEwMAorI2RlZmluZSBTUEVFRF8xMDAwCSAgIDEwMDAKKyNkZWZpbmUgSEFMRl9EVVBMRVggICAgICAgIDEKKyNkZWZpbmUgRlVMTF9EVVBMRVggICAgICAgIDIKKworLyogRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUgQVRfRVJSX0VFUFJPTSAgICAgIDEKKyNkZWZpbmUgQVRfRVJSX1BIWSAgICAgICAgIDIKKyNkZWZpbmUgQVRfRVJSX0NPTkZJRyAgICAgIDMKKyNkZWZpbmUgQVRfRVJSX1BBUkFNICAgICAgIDQKKyNkZWZpbmUgQVRfRVJSX01BQ19UWVBFICAgIDUKKyNkZWZpbmUgQVRfRVJSX1BIWV9UWVBFICAgIDYKKyNkZWZpbmUgQVRfRVJSX1BIWV9TUEVFRCAgIDcKKyNkZWZpbmUgQVRfRVJSX1BIWV9SRVMgICAgIDgKKyNkZWZpbmUgQVRfRVJSX1RJTUVPVVQgICAgIDkKKworI2RlZmluZSBBVF9NQVhfUkVDRUlWRV9RVUVVRSAgICA0CisjZGVmaW5lIEFUX1BBR0VfTlVNX1BFUl9RVUVVRSAgIDIKKworI2RlZmluZSBBVF9UV1NJX0VFUFJPTV9USU1FT1VUIAkxMDAKKyNkZWZpbmUgQVRfSFdfTUFYX0lETEVfREVMQVkgCTEwCisKKyNkZWZpbmUgQVRfUkVHU19MRU4JNzUKKyNkZWZpbmUgQVRfRUVQUk9NX0xFTiAJNTEyCisKKy8qIHRwZCB3b3JkIDIgKi8KKyNkZWZpbmUgVFBEX0JVRkxFTl9NQVNLIAkweDNGRkYKKyNkZWZpbmUgVFBEX0JVRkxFTl9TSElGVCAgICAgICAgMAorCisvKiB0cGQgd29yZCAzIGJpdHMgMDo0ICovCisjZGVmaW5lIFRQRF9FT1BfTUFTSyAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUUERfRU9QX1NISUZUICAgICAgICAgICAwCisKK3N0cnVjdCBhdGwxZV90cGRfZGVzYyB7CisJdTY0IGJ1ZmZlcl9hZGRyOworCXUzMiB3b3JkMjsKKwl1MzIgd29yZDM7Cit9OworCisjZGVmaW5lIE1BWF9UWF9CVUZfTEVOICAgICAgMHgyMDAwCisjZGVmaW5lIE1BWF9UWF9CVUZfU0hJRlQgICAgMTMKKworLyogcnJzIHdvcmQgMSBiaXQgMDozMSAqLworI2RlZmluZSBSUlNfUlhfQ1NVTV9NQVNLCTB4RkZGRgorI2RlZmluZSBSUlNfUlhfQ1NVTV9TSElGVAkwCisjZGVmaW5lIFJSU19QS1RfU0laRV9NQVNLCTB4M0ZGRgorI2RlZmluZSBSUlNfUEtUX1NJWkVfU0hJRlQJMTYKKyNkZWZpbmUgUlJTX0NQVV9OVU1fTUFTSwkweDAwMDMKKyNkZWZpbmUJUlJTX0NQVV9OVU1fU0hJRlQJMzAKKworI2RlZmluZQlSUlNfSVNfUlNTX0lQVjQJCTB4MDAwMQorI2RlZmluZSBSUlNfSVNfUlNTX0lQVjRfVENQCTB4MDAwMgorI2RlZmluZSBSUlNfSVNfUlNTX0lQVjYJCTB4MDAwNAorI2RlZmluZSBSUlNfSVNfUlNTX0lQVjZfVENQCTB4MDAwOAorI2RlZmluZSBSUlNfSVNfSVBWNgkJMHgwMDEwCisjZGVmaW5lIFJSU19JU19JUF9GUkFHCQkweDAwMjAKKyNkZWZpbmUgUlJTX0lTX0lQX0RGCQkweDAwNDAKKyNkZWZpbmUgUlJTX0lTXzgwMl8zCQkweDAwODAKKyNkZWZpbmUgUlJTX0lTX1ZMQU5fVEFHCQkweDAxMDAKKyNkZWZpbmUgUlJTX0lTX0VSUl9GUkFNRQkweDAyMDAKKyNkZWZpbmUgUlJTX0lTX0lQVjQJCTB4MDQwMAorI2RlZmluZSBSUlNfSVNfVURQCQkweDA4MDAKKyNkZWZpbmUgUlJTX0lTX1RDUAkJMHgxMDAwCisjZGVmaW5lIFJSU19JU19CQ0FTVAkJMHgyMDAwCisjZGVmaW5lIFJSU19JU19NQ0FTVAkJMHg0MDAwCisjZGVmaW5lIFJSU19JU19QQVVTRQkJMHg4MDAwCisKKyNkZWZpbmUgUlJTX0VSUl9CQURfQ1JDCQkweDAwMDEKKyNkZWZpbmUgUlJTX0VSUl9DT0RFCQkweDAwMDIKKyNkZWZpbmUgUlJTX0VSUl9EUklCQkxFCQkweDAwMDQKKyNkZWZpbmUgUlJTX0VSUl9SVU5UCQkweDAwMDgKKyNkZWZpbmUgUlJTX0VSUl9SWF9PVkVSRkxPVwkweDAwMTAKKyNkZWZpbmUgUlJTX0VSUl9UUlVOQwkJMHgwMDIwCisjZGVmaW5lIFJSU19FUlJfSVBfQ1NVTQkJMHgwMDQwCisjZGVmaW5lIFJSU19FUlJfTDRfQ1NVTQkJMHgwMDgwCisjZGVmaW5lIFJSU19FUlJfTEVOR1RICQkweDAxMDAKKyNkZWZpbmUgUlJTX0VSUl9ERVNfQUREUgkweDAyMDAKKworc3RydWN0IGF0bDFlX3JlY3ZfcmV0X3N0YXR1cyB7CisJdTE2IHNlcV9udW07CisJdTE2IGhhc2hfbG87CisJdTMyIHdvcmQxOworCXUxNiBwa3RfZmxhZzsKKwl1MTYgZXJyX2ZsYWc7CisJdTE2IGhhc2hfaGk7CisJdTE2IHZ0YWc7Cit9OworCitlbnVtIGF0bDFlX2RtYV9yZXFfYmxvY2sgeworCWF0bDFlX2RtYV9yZXFfMTI4ID0gMCwKKwlhdGwxZV9kbWFfcmVxXzI1NiA9IDEsCisJYXRsMWVfZG1hX3JlcV81MTIgPSAyLAorCWF0bDFlX2RtYV9yZXFfMTAyNCA9IDMsCisJYXRsMWVfZG1hX3JlcV8yMDQ4ID0gNCwKKwlhdGwxZV9kbWFfcmVxXzQwOTYgPSA1Cit9OworCitlbnVtIGF0bDFlX25pY190eXBlIHsKKwlhdGhyX2wxZSA9IDAsCisJYXRocl9sMmVfcmV2QSA9IDEsCisJYXRocl9sMmVfcmV2QiA9IDIKK307CisKK3N0cnVjdCBhdGwxZV9odyB7CisJdTggKmh3X2FkZHI7ICAgICAgICAgICAgLyogaW5uZXIgcmVnaXN0ZXIgYWRkcmVzcyAqLworCXN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyOworCWVudW0gYXRsMWVfbmljX3R5cGUgIG5pY190eXBlOworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBwZXJtX21hY19hZGRyW0VUSF9BTEVOXTsKKworCXUxNiBtaWlfYXV0b25lZ19hZHZfcmVnOworCXUxNiBtaWlfMTAwMHRfY3RybF9yZWc7CisKKwllbnVtIGF0bDFlX2RtYV9yZXFfYmxvY2sgZG1hcl9ibG9jazsKKwllbnVtIGF0bDFlX2RtYV9yZXFfYmxvY2sgZG1hd19ibG9jazsKKworCWludCBwaHlfY29uZmlndXJlZDsKKwlpbnQgcmVfYXV0b25lZzsKKwlpbnQgZW1pX2NhOworfTsKKworLyoKKyAqIHdyYXBwZXIgYXJvdW5kIGEgcG9pbnRlciB0byBhIHNvY2tldCBidWZmZXIsCisgKiBzbyBhIERNQSBoYW5kbGUgY2FuIGJlIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBidWZmZXIKKyAqLworc3RydWN0IGF0bDFlX3R4X2J1ZmZlciB7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iOworCXUxNiBsZW5ndGg7CisJdTMyIGRtYTsKK307CisKK3N0cnVjdCBhdGwxZV9yeF9wYWdlIHsKKwl1MzIJCWRtYTsgICAgLyogcmVjZWl2ZSByYWdlIERNQSBhZGRyZXNzICovCisJdTgJCSphZGRyOyAgIC8qIHJlY2VpdmUgcmFnZSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl1MzIJCXdyaXRlX29mZnNldF9kbWE7ICAvKiB0aGUgRE1BIGFkZHJlc3Mgd2hpY2ggY29udGFpbiB0aGUKKwkJCQkJICAgICAgcmVjZWl2ZSBkYXRhIG9mZnNldCBpbiB0aGUgcGFnZSAqLworCXUzMgkJKndyaXRlX29mZnNldF9hZGRyOyAvKiB0aGUgdmlydGF1bCBhZGRyZXNzIHdoaWNoIGNvbnRhaW4KKwkJCQkJICAgICB0aGUgcmVjZWl2ZSBkYXRhIG9mZnNldCBpbiB0aGUgcGFnZSAqLworCXUzMgkJcmVhZF9vZmZzZXQ7ICAgICAgIC8qIHRoZSBvZmZzZXQgd2hlcmUgd2UgaGF2ZSByZWFkICovCit9OworCitzdHJ1Y3QgYXRsMWVfcnhfcGFnZV9kZXNjIHsKKwlzdHJ1Y3QgYXRsMWVfcnhfcGFnZSAgIHJ4X3BhZ2VbQVRfUEFHRV9OVU1fUEVSX1FVRVVFXTsKKwl1OCAgcnhfdXNpbmc7CisJdTE2IHJ4X254c2VxOworfTsKKworLyogdHJhbnNtaXQgcGFja2V0IGRlc2NyaXB0b3IgKHRwZCkgcmluZyAqLworc3RydWN0IGF0bDFlX3R4X3JpbmcgeworCXN0cnVjdCBhdGwxZV90cGRfZGVzYyAqZGVzYzsgIC8qIGRlc2NyaXB0b3IgcmluZyB2aXJ0dWFsIGFkZHJlc3MgICovCisJdTMyCQkgICBkbWE7ICAgIC8qIGRlc2NyaXB0b3IgcmluZyBwaHlzaWNhbCBhZGRyZXNzICovCisJdTE2ICAgICAgIAkgICBjb3VudDsgIC8qIHRoZSBjb3VudCBvZiB0cmFuc21pdCByaW5ncyAgKi8KKwl1MTYJCSAgIG5leHRfdG9fdXNlOworCXUxNgkJICAgbmV4dF90b19jbGVhbjsKKwlzdHJ1Y3QgYXRsMWVfdHhfYnVmZmVyICp0eF9idWZmZXI7CisJdTMyCQkgICBjbWJfZG1hOworCXUzMgkJICAgKmNtYjsKK307CisKKy8qIHJlY2VpdmUgcGFja2V0IGRlc2NyaXB0b3IgcmluZyAqLworc3RydWN0IGF0bDFlX3J4X3JpbmcgeworCXZvaWQgICAgICAgIAkqZGVzYzsKKwl1MzIJICAJZG1hOworCWludCAgICAgICAgIAlzaXplOworCXUzMgkgICAgCXBhZ2Vfc2l6ZTsgLyogYnl0ZXMgbGVuZ3RoIG9mIHJ4ZiBwYWdlICovCisJdTMyCQlyZWFsX3BhZ2Vfc2l6ZTsgLyogcmVhbF9wYWdlX3NpemUgPSBwYWdlX3NpemUgKyBqdW1ibyArIGFsaWFnbiAqLworCXN0cnVjdCBhdGwxZV9yeF9wYWdlX2Rlc2MgcnhfcGFnZV9kZXNjOworfTsKKworLyogYm9hcmQgc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGF0bDFlX2FkYXB0ZXIgeworCXN0cnVjdCBuZXRfZGV2aWNlICAgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldmljZSAgICpwZGV2OworCXN0cnVjdCBtaWlfaWZfaW5mbyAgbWlpOyAgICAvKiBNSUkgaW50ZXJmYWNlIGluZm8gKi8KKwlzdHJ1Y3QgYXRsMWVfaHcgICAgICAgIGh3OworCisJdTE2IGxpbmtfc3BlZWQ7CisJdTE2IGxpbmtfZHVwbGV4OworCisJLyogQWxsIERlc2NyaXB0b3IgbWVtb3J5ICovCisJdTMyCSAgCXJpbmdfZG1hOworCXZvaWQgICAgIAkqcmluZ192aXJfYWRkcjsKKwl1MzIgICAgICAgICAgICAgcmluZ19zaXplOworCisJc3RydWN0IGF0bDFlX3R4X3JpbmcgdHhfcmluZzsKKwlzdHJ1Y3QgYXRsMWVfcnhfcmluZyByeF9yaW5nOworCisJaW50IGJkX251bWJlcjsgICAgIC8qIGJvYXJkIG51bWJlcjsqLworfTsKKworI2RlZmluZSBBVF9XUklURV9SRUcoYSwgcmVnLCB2YWx1ZSkgXAorCQl3cml0ZWwoKHZhbHVlKSwgKChhKS0+aHdfYWRkciArIHJlZykpCisKKyNkZWZpbmUgQVRfV1JJVEVfRkxVU0goYSkgXAorCQlyZWFkbCgoYSktPmh3X2FkZHIpCisKKyNkZWZpbmUgQVRfUkVBRF9SRUcoYSwgcmVnKSBcCisJCXJlYWRsKChhKS0+aHdfYWRkciArIHJlZykKKworI2RlZmluZSBBVF9XUklURV9SRUdCKGEsIHJlZywgdmFsdWUpIFwKKwkJd3JpdGViKCh2YWx1ZSksICgoYSktPmh3X2FkZHIgKyByZWcpKQorCisjZGVmaW5lIEFUX1JFQURfUkVHQihhLCByZWcpIFwKKwkJcmVhZGIoKGEpLT5od19hZGRyICsgcmVnKQorCisjZGVmaW5lIEFUX1dSSVRFX1JFR1coYSwgcmVnLCB2YWx1ZSkgXAorCQl3cml0ZXcoKHZhbHVlKSwgKChhKS0+aHdfYWRkciArIHJlZykpCisKKyNkZWZpbmUgQVRfUkVBRF9SRUdXKGEsIHJlZykgXAorCQlyZWFkdygoYSktPmh3X2FkZHIgKyByZWcpCisKKyNkZWZpbmUgQVRfV1JJVEVfUkVHX0FSUkFZKGEsIHJlZywgb2Zmc2V0LCB2YWx1ZSkgXAorCQl3cml0ZWwoKHZhbHVlKSwgKCgoYSktPmh3X2FkZHIgKyByZWcpICsgKChvZmZzZXQpIDw8IDIpKSkKKworI2RlZmluZSBBVF9SRUFEX1JFR19BUlJBWShhLCByZWcsIG9mZnNldCkgXAorCQlyZWFkbCgoKGEpLT5od19hZGRyICsgcmVnKSArICgob2Zmc2V0KSA8PCAyKSkKKworZXh0ZXJuIGludCBhdGwxZV91cChzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBhdGwxZV9kb3duKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKTsKK2V4dGVybiBzMzIgYXRsMWVfcmVzZXRfaHcoc3RydWN0IGF0bDFlX2h3ICpodyk7CisKKy8qKioqKioqKioqIEhhcmR3YXJlLWxldmVsIGZ1bmN0aW9uYWxpdHk6ICoqKioqKioqKiovCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZSAqLworczMyIGF0bDFlX3Jlc2V0X2h3KHN0cnVjdCBhdGwxZV9odyAqaHcpOworczMyIGF0bDFlX3JlYWRfbWFjX2FkZHIoc3RydWN0IGF0bDFlX2h3ICpodyk7CitzMzIgYXRsMWVfaW5pdF9odyhzdHJ1Y3QgYXRsMWVfaHcgKmh3KTsKK3MzMiBhdGwxZV9waHlfY29tbWl0KHN0cnVjdCBhdGwxZV9odyAqaHcpOworczMyIGF0bDFlX2dldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBhdGwxZV9odyAqaHcsIHUxNiAqc3BlZWQsIHUxNiAqZHVwbGV4KTsKK3UzMiBhdGwxZV9hdXRvX2dldF9mYyhzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlciwgdTE2IGR1cGxleCk7CitzMzIgYXRsMWVfcmVhZF9waHlfcmVnKHN0cnVjdCBhdGwxZV9odyAqaHcsIHUxNiByZWdfYWRkciwgdTE2ICpwaHlfZGF0YSk7CitzMzIgYXRsMWVfd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgYXRsMWVfaHcgKmh3LCB1MzIgcmVnX2FkZHIsIHUxNiBwaHlfZGF0YSk7CitzMzIgYXRsMWVfdmFsaWRhdGVfbWRpX3NldHRpbmcoc3RydWN0IGF0bDFlX2h3ICpodyk7Cit2b2lkIGF0bDFlX2h3X3NldF9tYWNfYWRkcihzdHJ1Y3QgYXRsMWVfaHcgKmh3KTsKK3MzMiBhdGwxZV9waHlfZW50ZXJfcG93ZXJfc2F2aW5nKHN0cnVjdCBhdGwxZV9odyAqaHcpOworczMyIGF0bDFlX3BoeV9sZWF2ZV9wb3dlcl9zYXZpbmcoc3RydWN0IGF0bDFlX2h3ICpodyk7CitzMzIgYXRsMWVfcGh5X2luaXQoc3RydWN0IGF0bDFlX2h3ICpodyk7CitpbnQgYXRsMWVfY2hlY2tfZWVwcm9tX2V4aXN0KHN0cnVjdCBhdGwxZV9odyAqaHcpOwordm9pZCBhdGwxZV9mb3JjZV9wcyhzdHJ1Y3QgYXRsMWVfaHcgKmh3KTsKK3MzMiBhdGwxZV9yZXN0YXJ0X2F1dG9uZWcoc3RydWN0IGF0bDFlX2h3ICpodyk7CisKKy8qIHJlZ2lzdGVyIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgUkVHX1BNX0NUUkxTVEFUICAgICAgICAgICAgIDB4NDQKKworI2RlZmluZSBSRUdfUENJRV9DQVBfTElTVCAgICAgICAgICAgMHg1OAorCisjZGVmaW5lIFJFR19ERVZJQ0VfQ0FQICAgICAgICAgICAgICAweDVDCisjZGVmaW5lICAgICBERVZJQ0VfQ0FQX01BWF9QQVlMT0FEX01BU0sgICAgIDB4NworI2RlZmluZSAgICAgREVWSUNFX0NBUF9NQVhfUEFZTE9BRF9TSElGVCAgICAwCisKKyNkZWZpbmUgUkVHX0RFVklDRV9DVFJMICAgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgICAgIERFVklDRV9DVFJMX01BWF9QQVlMT0FEX01BU0sgICAgMHg3CisjZGVmaW5lICAgICBERVZJQ0VfQ1RSTF9NQVhfUEFZTE9BRF9TSElGVCAgIDUKKyNkZWZpbmUgICAgIERFVklDRV9DVFJMX01BWF9SUkVRX1NaX01BU0sgICAgMHg3CisjZGVmaW5lICAgICBERVZJQ0VfQ1RSTF9NQVhfUlJFUV9TWl9TSElGVCAgIDEyCisKKyNkZWZpbmUgUkVHX1ZQRF9DQVAgICAgICAgICAgICAgICAgIDB4NkMKKyNkZWZpbmUgICAgIFZQRF9DQVBfSURfTUFTSyAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSAgICAgVlBEX0NBUF9JRF9TSElGVCAgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICBWUERfQ0FQX05FWFRfUFRSX01BU0sgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgICAgIFZQRF9DQVBfTkVYVF9QVFJfU0hJRlQgICAgICAgICAgOAorI2RlZmluZSAgICAgVlBEX0NBUF9WUERfQUREUl9NQVNLICAgICAgICAgICAweDdGRkYKKyNkZWZpbmUgICAgIFZQRF9DQVBfVlBEX0FERFJfU0hJRlQgICAgICAgICAgMTYKKyNkZWZpbmUgICAgIFZQRF9DQVBfVlBEX0ZMQUcgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIFJFR19WUERfREFUQSAgICAgICAgICAgICAgICAweDcwCisKKyNkZWZpbmUgUkVHX1NQSV9GTEFTSF9DVFJMICAgICAgICAgIDB4MjAwCisjZGVmaW5lICAgICBTUElfRkxBU0hfQ1RSTF9TVFNfTk9OX1JEWSAgICAgIDB4MQorI2RlZmluZSAgICAgU1BJX0ZMQVNIX0NUUkxfU1RTX1dFTiAgICAgICAgICAweDIKKyNkZWZpbmUgICAgIFNQSV9GTEFTSF9DVFJMX1NUU19XUEVOICAgICAgICAgMHg4MAorI2RlZmluZSAgICAgU1BJX0ZMQVNIX0NUUkxfREVWX1NUU19NQVNLICAgICAweEZGCisjZGVmaW5lICAgICBTUElfRkxBU0hfQ1RSTF9ERVZfU1RTX1NISUZUICAgIDAKKyNkZWZpbmUgICAgIFNQSV9GTEFTSF9DVFJMX0lOU19NQVNLICAgICAgICAgMHg3CisjZGVmaW5lICAgICBTUElfRkxBU0hfQ1RSTF9JTlNfU0hJRlQgICAgICAgIDgKKyNkZWZpbmUgICAgIFNQSV9GTEFTSF9DVFJMX1NUQVJUICAgICAgICAgICAgMHg4MDAKKyNkZWZpbmUgICAgIFNQSV9GTEFTSF9DVFJMX0VOX1ZQRCAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lICAgICBTUElfRkxBU0hfQ1RSTF9MRFNUQVJUICAgICAgICAgIDB4ODAwMAorI2RlZmluZSAgICAgU1BJX0ZMQVNIX0NUUkxfQ1NfSElfTUFTSyAgICAgICAweDMKKyNkZWZpbmUgICAgIFNQSV9GTEFTSF9DVFJMX0NTX0hJX1NISUZUICAgICAgMTYKKyNkZWZpbmUgICAgIFNQSV9GTEFTSF9DVFJMX0NTX0hPTERfTUFTSyAgICAgMHgzCisjZGVmaW5lICAgICBTUElfRkxBU0hfQ1RSTF9DU19IT0xEX1NISUZUICAgIDE4CisjZGVmaW5lICAgICBTUElfRkxBU0hfQ1RSTF9DTEtfTE9fTUFTSyAgICAgIDB4MworI2RlZmluZSAgICAgU1BJX0ZMQVNIX0NUUkxfQ0xLX0xPX1NISUZUICAgICAyMAorI2RlZmluZSAgICAgU1BJX0ZMQVNIX0NUUkxfQ0xLX0hJX01BU0sgICAgICAweDMKKyNkZWZpbmUgICAgIFNQSV9GTEFTSF9DVFJMX0NMS19ISV9TSElGVCAgICAgMjIKKyNkZWZpbmUgICAgIFNQSV9GTEFTSF9DVFJMX0NTX1NFVFVQX01BU0sgICAgMHgzCisjZGVmaW5lICAgICBTUElfRkxBU0hfQ1RSTF9DU19TRVRVUF9TSElGVCAgIDI0CisjZGVmaW5lICAgICBTUElfRkxBU0hfQ1RSTF9FUk9NX1BHU1pfTUFTSyAgIDB4MworI2RlZmluZSAgICAgU1BJX0ZMQVNIX0NUUkxfRVJPTV9QR1NaX1NISUZUICAyNgorI2RlZmluZSAgICAgU1BJX0ZMQVNIX0NUUkxfV0FJVF9SRUFEWSAgICAgICAweDEwMDAwMDAwCisKKyNkZWZpbmUgUkVHX1NQSV9BRERSICAgICAgICAgICAgICAgIDB4MjA0CisKKyNkZWZpbmUgUkVHX1NQSV9EQVRBICAgICAgICAgICAgICAgIDB4MjA4CisKKyNkZWZpbmUgUkVHX1NQSV9GTEFTSF9DT05GSUcgICAgICAgIDB4MjBDCisjZGVmaW5lICAgICBTUElfRkxBU0hfQ09ORklHX0xEX0FERFJfTUFTSyAgIDB4RkZGRkZGCisjZGVmaW5lICAgICBTUElfRkxBU0hfQ09ORklHX0xEX0FERFJfU0hJRlQgIDAKKyNkZWZpbmUgICAgIFNQSV9GTEFTSF9DT05GSUdfVlBEX0FERFJfTUFTSyAgMHgzCisjZGVmaW5lICAgICBTUElfRkxBU0hfQ09ORklHX1ZQRF9BRERSX1NISUZUIDI0CisjZGVmaW5lICAgICBTUElfRkxBU0hfQ09ORklHX0xEX0VYSVNUICAgICAgIDB4NDAwMDAwMAorCisKKyNkZWZpbmUgUkVHX1NQSV9GTEFTSF9PUF9QUk9HUkFNICAgIDB4MjEwCisjZGVmaW5lIFJFR19TUElfRkxBU0hfT1BfU0NfRVJBU0UgICAweDIxMQorI2RlZmluZSBSRUdfU1BJX0ZMQVNIX09QX0NISVBfRVJBU0UgMHgyMTIKKyNkZWZpbmUgUkVHX1NQSV9GTEFTSF9PUF9SRElEICAgICAgIDB4MjEzCisjZGVmaW5lIFJFR19TUElfRkxBU0hfT1BfV1JFTiAgICAgICAweDIxNAorI2RlZmluZSBSRUdfU1BJX0ZMQVNIX09QX1JEU1IgICAgICAgMHgyMTUKKyNkZWZpbmUgUkVHX1NQSV9GTEFTSF9PUF9XUlNSICAgICAgIDB4MjE2CisjZGVmaW5lIFJFR19TUElfRkxBU0hfT1BfUkVBRCAgICAgICAweDIxNworCisjZGVmaW5lIFJFR19UV1NJX0NUUkwgICAgICAgICAgICAgICAweDIxOAorI2RlZmluZSAgICAgVFdTSV9DVFJMX0xEX09GRlNFVF9NQVNLICAgICAgICAweEZGCisjZGVmaW5lICAgICBUV1NJX0NUUkxfTERfT0ZGU0VUX1NISUZUICAgICAgIDAKKyNkZWZpbmUgICAgIFRXU0lfQ1RSTF9MRF9TTFZfQUREUl9NQVNLICAgICAgMHg3CisjZGVmaW5lICAgICBUV1NJX0NUUkxfTERfU0xWX0FERFJfU0hJRlQgICAgIDgKKyNkZWZpbmUgICAgIFRXU0lfQ1RSTF9TV19MRFNUQVJUICAgICAgICAgICAgMHg4MDAKKyNkZWZpbmUgICAgIFRXU0lfQ1RSTF9IV19MRFNUQVJUICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lICAgICBUV1NJX0NUUkxfU01CX1NMVl9BRERSX01BU0sgICAgIDB4MHg3RgorI2RlZmluZSAgICAgVFdTSV9DVFJMX1NNQl9TTFZfQUREUl9TSElGVCAgICAxNQorI2RlZmluZSAgICAgVFdTSV9DVFJMX0xEX0VYSVNUICAgICAgICAgICAgICAweDQwMDAwMAorI2RlZmluZSAgICAgVFdTSV9DVFJMX1JFQURfRlJFUV9TRUxfTUFTSyAgICAweDMKKyNkZWZpbmUgICAgIFRXU0lfQ1RSTF9SRUFEX0ZSRVFfU0VMX1NISUZUICAgMjMKKyNkZWZpbmUgICAgIFRXU0lfQ1RSTF9GUkVRX1NFTF8xMDBLICAgICAgICAgMAorI2RlZmluZSAgICAgVFdTSV9DVFJMX0ZSRVFfU0VMXzIwMEsgICAgICAgICAxCisjZGVmaW5lICAgICBUV1NJX0NUUkxfRlJFUV9TRUxfMzAwSyAgICAgICAgIDIKKyNkZWZpbmUgICAgIFRXU0lfQ1RSTF9GUkVRX1NFTF80MDBLICAgICAgICAgMworI2RlZmluZSAgICAgVFdTSV9DVFJMX1NNQl9TTFZfQUREUgorI2RlZmluZSAgICAgVFdTSV9DVFJMX1dSSVRFX0ZSRVFfU0VMX01BU0sgICAweDMKKyNkZWZpbmUgICAgIFRXU0lfQ1RSTF9XUklURV9GUkVRX1NFTF9TSElGVCAgMjQKKworCisjZGVmaW5lIFJFR19QQ0lFX0RFVl9NSVNDX0NUUkwgICAgICAweDIxQworI2RlZmluZSAgICAgUENJRV9ERVZfTUlTQ19DVFJMX0VYVF9QSVBFICAgICAweDIKKyNkZWZpbmUgICAgIFBDSUVfREVWX01JU0NfQ1RSTF9SRVRSWV9CVUZESVMgMHgxCisjZGVmaW5lICAgICBQQ0lFX0RFVl9NSVNDX0NUUkxfU1BJUk9NX0VYSVNUIDB4NAorI2RlZmluZSAgICAgUENJRV9ERVZfTUlTQ19DVFJMX1NFUkRFU19FTkRJQU4gICAgMHg4CisjZGVmaW5lICAgICBQQ0lFX0RFVl9NSVNDX0NUUkxfU0VSREVTX1NFTF9ESU4gICAweDEwCisKKyNkZWZpbmUgUkVHX1BDSUVfUEhZTUlTQwkgICAgMHgxMDAwCisjZGVmaW5lIFBDSUVfUEhZTUlTQ19GT1JDRV9SQ1ZfREVUCTB4NAorCisjZGVmaW5lIFJFR19MVFNTTV9URVNUX01PREUgICAgICAgICAweDEyRkMKKyNkZWZpbmUgICAgICAgICBMVFNTTV9URVNUX01PREVfREVGICAgICAweEUwMDAKKworLyogU2VsZW5lIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19NQVNURVJfQ1RSTCAgICAgICAgICAgICAweDE0MDAKKyNkZWZpbmUgICAgIE1BU1RFUl9DVFJMX1NPRlRfUlNUICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgICBNQVNURVJfQ1RSTF9NVElNRVJfRU4gICAgICAgICAgIDB4MgorI2RlZmluZSAgICAgTUFTVEVSX0NUUkxfSVRJTUVSX0VOICAgICAgICAgICAweDQKKyNkZWZpbmUgICAgIE1BU1RFUl9DVFJMX01BTlVBTF9JTlQgICAgICAgICAgMHg4CisjZGVmaW5lICAgICBNQVNURVJfQ1RSTF9JVElNRVIyX0VOICAgICAgICAgIDB4MjAKKyNkZWZpbmUgICAgIE1BU1RFUl9DVFJMX0lOVF9SRENMUiAgICAgICAgICAgMHg0MAorI2RlZmluZSAgICAgTUFTVEVSX0NUUkxfTEVEX01PREUJICAgIDB4MjAwCisjZGVmaW5lICAgICBNQVNURVJfQ1RSTF9SRVZfTlVNX1NISUZUICAgICAgIDE2CisjZGVmaW5lICAgICBNQVNURVJfQ1RSTF9SRVZfTlVNX01BU0sgICAgICAgIDB4ZmYKKyNkZWZpbmUgICAgIE1BU1RFUl9DVFJMX0RFVl9JRF9TSElGVCAgICAgICAgMjQKKyNkZWZpbmUgICAgIE1BU1RFUl9DVFJMX0RFVl9JRF9NQVNLICAgICAgICAgMHhmZgorCisvKiBUaW1lciBJbml0aWFsIFZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19NQU5VQUxfVElNRVJfSU5JVCAgICAgICAweDE0MDQKKworCisvKiBJUlEgTW9kZXJhdG9yVGltZXIgSW5pdGlhbCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfSVJRX01PRFVfVElNRVJfSU5JVCAgICAgMHgxNDA4ICAgLyogdyAqLworI2RlZmluZSBSRUdfSVJRX01PRFVfVElNRVIyX0lOSVQgICAgMHgxNDBBICAgLyogdyAqLworCisKKyNkZWZpbmUgUkVHX0dQSFlfQ1RSTCAgICAgICAgICAgICAgIDB4MTQwQworI2RlZmluZSAgICAgR1BIWV9DVFJMX0VYVF9SRVNFVCAgICAgICAgIDEKKyNkZWZpbmUgICAgIEdQSFlfQ1RSTF9QSVBFX01PRCAgICAgICAgICAyCisjZGVmaW5lICAgICBHUEhZX0NUUkxfVEVTVF9NT0RFX01BU0sgICAgMworI2RlZmluZSAgICAgR1BIWV9DVFJMX1RFU1RfTU9ERV9TSElGVCAgIDIKKyNkZWZpbmUgICAgIEdQSFlfQ1RSTF9CRVJUX1NUQVJUICAgICAgICAweDEwCisjZGVmaW5lICAgICBHUEhZX0NUUkxfR0FURV8yNU1fRU4gICAgICAgMHgyMAorI2RlZmluZSAgICAgR1BIWV9DVFJMX0xQV19FWElUICAgICAgICAgIDB4NDAKKyNkZWZpbmUgICAgIEdQSFlfQ1RSTF9QSFlfSUREUSAgICAgICAgICAweDgwCisjZGVmaW5lICAgICBHUEhZX0NUUkxfUEhZX0lERFFfRElTICAgICAgMHgxMDAKKyNkZWZpbmUgICAgIEdQSFlfQ1RSTF9QQ0xLX1NFTF9ESVMgICAgICAweDIwMAorI2RlZmluZSAgICAgR1BIWV9DVFJMX0hJQl9FTiAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lICAgICBHUEhZX0NUUkxfSElCX1BVTFNFICAgICAgICAgMHg4MDAKKyNkZWZpbmUgICAgIEdQSFlfQ1RSTF9TRUxfQU5BX1JTVCAgICAgICAweDEwMDAKKyNkZWZpbmUgICAgIEdQSFlfQ1RSTF9QSFlfUExMX09OICAgICAgICAweDIwMDAKKyNkZWZpbmUgICAgIEdQSFlfQ1RSTF9QV0RPV05fSFcJCTB4NDAwMAorI2RlZmluZSAgICAgR1BIWV9DVFJMX0RFRkFVTFQgKFwKKwkJR1BIWV9DVFJMX1BIWV9QTExfT04JfFwKKwkJR1BIWV9DVFJMX1NFTF9BTkFfUlNUCXxcCisJCUdQSFlfQ1RSTF9ISUJfUFVMU0UJfFwKKwkJR1BIWV9DVFJMX0hJQl9FTikKKworI2RlZmluZSAgICAgR1BIWV9DVFJMX1BXX1dPTF9ESVMgKFwKKwkJR1BIWV9DVFJMX1BIWV9QTExfT04JfFwKKwkJR1BIWV9DVFJMX1NFTF9BTkFfUlNUCXxcCisJCUdQSFlfQ1RSTF9ISUJfUFVMU0UJfFwKKwkJR1BIWV9DVFJMX0hJQl9FTgl8XAorCQlHUEhZX0NUUkxfUFdET1dOX0hXCXxcCisJCUdQSFlfQ1RSTF9QQ0xLX1NFTF9ESVMJfFwKKwkJR1BIWV9DVFJMX1BIWV9JRERRKQorCisvKiBJUlEgQW50aS1Mb3N0IFRpbWVyIEluaXRpYWwgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0NNQkRJU0RNQV9USU1FUiAgICAgICAgIDB4MTQwRQorCisKKy8qIEJsb2NrIElETEUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19JRExFX1NUQVRVUyAgCTB4MTQxMAorI2RlZmluZSAgICAgSURMRV9TVEFUVVNfUlhNQUMgICAgICAgMSAgICAvKiAxOiBSWE1BQyBzdGF0ZSBtYWNoaW5lIGlzIGluIG5vbi1JRExFIHN0YXRlLiAwOiBSWE1BQyBpcyBpZGxpbmcgKi8KKyNkZWZpbmUgICAgIElETEVfU1RBVFVTX1RYTUFDICAgICAgIDIgICAgLyogMTogVFhNQUMgc3RhdGUgbWFjaGluZSBpcyBpbiBub24tSURMRSBzdGF0ZS4gMDogVFhNQUMgaXMgaWRsaW5nICovCisjZGVmaW5lICAgICBJRExFX1NUQVRVU19SWFEgICAgICAgICA0ICAgIC8qIDE6IFJYUSBzdGF0ZSBtYWNoaW5lIGlzIGluIG5vbi1JRExFIHN0YXRlLiAgIDA6IFJYUSBpcyBpZGxpbmcgICAqLworI2RlZmluZSAgICAgSURMRV9TVEFUVVNfVFhRICAgICAgICAgOCAgICAvKiAxOiBUWFEgc3RhdGUgbWFjaGluZSBpcyBpbiBub24tSURMRSBzdGF0ZS4gICAwOiBUWFEgaXMgaWRsaW5nICAgKi8KKyNkZWZpbmUgICAgIElETEVfU1RBVFVTX0RNQVIgICAgICAgIDB4MTAgLyogMTogRE1BUiBzdGF0ZSBtYWNoaW5lIGlzIGluIG5vbi1JRExFIHN0YXRlLiAgMDogRE1BUiBpcyBpZGxpbmcgICovCisjZGVmaW5lICAgICBJRExFX1NUQVRVU19ETUFXICAgICAgICAweDIwIC8qIDE6IERNQVcgc3RhdGUgbWFjaGluZSBpcyBpbiBub24tSURMRSBzdGF0ZS4gIDA6IERNQVcgaXMgaWRsaW5nICAqLworI2RlZmluZSAgICAgSURMRV9TVEFUVVNfU01CICAgICAgICAgMHg0MCAvKiAxOiBTTUIgc3RhdGUgbWFjaGluZSBpcyBpbiBub24tSURMRSBzdGF0ZS4gICAwOiBTTUIgaXMgaWRsaW5nICAgKi8KKyNkZWZpbmUgICAgIElETEVfU1RBVFVTX0NNQiAgICAgICAgIDB4ODAgLyogMTogQ01CIHN0YXRlIG1hY2hpbmUgaXMgaW4gbm9uLUlETEUgc3RhdGUuICAgMDogQ01CIGlzIGlkbGluZyAgICovCisKKy8qIE1ESU8gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfTURJT19DVFJMICAgICAgICAgICAweDE0MTQKKyNkZWZpbmUgICAgIE1ESU9fREFUQV9NQVNLICAgICAgICAgIDB4ZmZmZiAgLyogT24gTURJTyB3cml0ZSwgdGhlIDE2LWJpdCBjb250cm9sIGRhdGEgdG8gd3JpdGUgdG8gUEhZIE1JSSBtYW5hZ2VtZW50IHJlZ2lzdGVyICovCisjZGVmaW5lICAgICBNRElPX0RBVEFfU0hJRlQgICAgICAgICAwICAgICAgIC8qIE9uIE1ESU8gcmVhZCwgdGhlIDE2LWJpdCBzdGF0dXMgZGF0YSB0aGF0IHdhcyByZWFkIGZyb20gdGhlIFBIWSBNSUkgbWFuYWdlbWVudCByZWdpc3RlciovCisjZGVmaW5lICAgICBNRElPX1JFR19BRERSX01BU0sgICAgICAweDFmICAgIC8qIE1ESU8gcmVnaXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZSAgICAgTURJT19SRUdfQUREUl9TSElGVCAgICAgMTYKKyNkZWZpbmUgICAgIE1ESU9fUlcgICAgICAgICAgICAgICAgIDB4MjAwMDAwICAgICAgLyogMTogcmVhZCwgMDogd3JpdGUgKi8KKyNkZWZpbmUgICAgIE1ESU9fU1VQX1BSRUFNQkxFICAgICAgIDB4NDAwMDAwICAgICAgLyogU3VwcHJlc3MgcHJlYW1ibGUgKi8KKyNkZWZpbmUgICAgIE1ESU9fU1RBUlQgICAgICAgICAgICAgIDB4ODAwMDAwICAgICAgLyogV3JpdGUgMSB0byBpbml0aWF0ZSB0aGUgTURJTyBtYXN0ZXIuIEFuZCB0aGlzIGJpdCBpcyBzZWxmIGNsZWFyZWQgYWZ0ZXIgb25lIGN5Y2xlKi8KKyNkZWZpbmUgICAgIE1ESU9fQ0xLX1NFTF9TSElGVCAgICAgIDI0CisjZGVmaW5lICAgICBNRElPX0NMS18yNV80ICAgICAgICAgICAwCisjZGVmaW5lICAgICBNRElPX0NMS18yNV82ICAgICAgICAgICAyCisjZGVmaW5lICAgICBNRElPX0NMS18yNV84ICAgICAgICAgICAzCisjZGVmaW5lICAgICBNRElPX0NMS18yNV8xMCAgICAgICAgICA0CisjZGVmaW5lICAgICBNRElPX0NMS18yNV8xNCAgICAgICAgICA1CisjZGVmaW5lICAgICBNRElPX0NMS18yNV8yMCAgICAgICAgICA2CisjZGVmaW5lICAgICBNRElPX0NMS18yNV8yOCAgICAgICAgICA3CisjZGVmaW5lICAgICBNRElPX0JVU1kgICAgICAgICAgICAgICAweDgwMDAwMDAKKyNkZWZpbmUgICAgIE1ESU9fQVBfRU4gICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgTURJT19XQUlUX1RJTUVTICAgICAgICAgMTAKKworLyogTUlJIFBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1BIWV9TVEFUVVMgICAgICAgICAgIDB4MTQxOAorI2RlZmluZSAgICAgUEhZX1NUQVRVU18xMDBNCSAgICAgIDB4MjAwMDAKKyNkZWZpbmUgICAgIFBIWV9TVEFUVVNfRU1JX0NBCSAgICAgIDB4NDAwMDAKKworLyogQklTVCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIwIChmb3IgdGhlIFBhY2tldCBNZW1vcnkpICovCisjZGVmaW5lIFJFR19CSVNUMF9DVFJMICAgICAgICAgICAgICAweDE0MWMKKyNkZWZpbmUgICAgIEJJU1QwX05PVyAgICAgICAgICAgICAgICAgICAweDEgLyogMTogVG8gdHJpZ2dlciBCSVNUMCBsb2dpYy4gVGhpcyBiaXQgc3RheXMgaGlnaCBkdXJpbmcgdGhlICovCisvKiBCSVNUIHByb2Nlc3MgYW5kIHJlc2V0IHRvIHplcm8gd2hlbiBCSVNUIGlzIGRvbmUgKi8KKyNkZWZpbmUgICAgIEJJU1QwX1NSQU1fRkFJTCAgICAgICAgICAgICAweDIgLyogMTogVGhlIFNSQU0gZmFpbHVyZSBpcyB1bi1yZXBhaXJhYmxlIGJlY2F1c2UgaXQgaGFzIGFkZHJlc3MgKi8KKy8qIGRlY29kZXIgZmFpbHVyZSBvciBtb3JlIHRoYW4gMSBjZWxsIHN0dWNrLXRvLXggZmFpbHVyZSAqLworI2RlZmluZSAgICAgQklTVDBfRlVTRV9GTEFHICAgICAgICAgICAgIDB4NCAvKiAxOiBJbmRpY2F0aW5nIG9uZSBjZWxsIGhhcyBiZWVuIGZpeGVkICovCisKKy8qIEJJU1QgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyMShmb3IgdGhlIHJldHJ5IGJ1ZmZlciBvZiBQQ0kgRXhwcmVzcykgKi8KKyNkZWZpbmUgUkVHX0JJU1QxX0NUUkwgICAgICAgICAgICAgIDB4MTQyMAorI2RlZmluZSAgICAgQklTVDFfTk9XICAgICAgICAgICAgICAgICAgIDB4MSAvKiAxOiBUbyB0cmlnZ2VyIEJJU1QwIGxvZ2ljLiBUaGlzIGJpdCBzdGF5cyBoaWdoIGR1cmluZyB0aGUgKi8KKy8qIEJJU1QgcHJvY2VzcyBhbmQgcmVzZXQgdG8gemVybyB3aGVuIEJJU1QgaXMgZG9uZSAqLworI2RlZmluZSAgICAgQklTVDFfU1JBTV9GQUlMICAgICAgICAgICAgIDB4MiAvKiAxOiBUaGUgU1JBTSBmYWlsdXJlIGlzIHVuLXJlcGFpcmFibGUgYmVjYXVzZSBpdCBoYXMgYWRkcmVzcyAqLworLyogZGVjb2RlciBmYWlsdXJlIG9yIG1vcmUgdGhhbiAxIGNlbGwgc3R1Y2stdG8teCBmYWlsdXJlLiovCisjZGVmaW5lICAgICBCSVNUMV9GVVNFX0ZMQUcgICAgICAgICAgICAgMHg0CisKKy8qIFNlckRlcyBMb2NrIERldGVjdCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1NFUkRFU19MT0NLICAgICAgICAgICAgIDB4MTQyNAorI2RlZmluZSAgICAgU0VSREVTX0xPQ0tfREVURUNUICAgICAgICAgIDEgIC8qIDE6IFNlckRlcyBsb2NrIGRldGVjdGVkIC4gVGhpcyBzaWduYWwgY29tZXMgZnJvbSBBbmFsb2cgU2VyRGVzICovCisjZGVmaW5lICAgICBTRVJERVNfTE9DS19ERVRFQ1RfRU4gICAgICAgMiAgLyogMTogRW5hYmxlIFNlckRlcyBMb2NrIGRldGVjdCBmdW5jdGlvbiAqLworCisvKiBNQUMgQ29udHJvbCBSZWdpc3RlciAgKi8KKyNkZWZpbmUgUkVHX01BQ19DVFJMICAgICAgICAgICAgICAgIDB4MTQ4MAorI2RlZmluZSAgICAgTUFDX0NUUkxfVFhfRU4gICAgICAgICAgICAgIDEgIC8qIDE6IFRyYW5zbWl0IEVuYWJsZSAqLworI2RlZmluZSAgICAgTUFDX0NUUkxfUlhfRU4gICAgICAgICAgICAgIDIgIC8qIDE6IFJlY2VpdmUgRW5hYmxlICovCisjZGVmaW5lICAgICBNQUNfQ1RSTF9UWF9GTE9XICAgICAgICAgICAgNCAgLyogMTogVHJhbnNtaXQgRmxvdyBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSAgICAgTUFDX0NUUkxfUlhfRkxPVyAgICAgICAgICAgIDggIC8qIDE6IFJlY2VpdmUgRmxvdyBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSAgICAgTUFDX0NUUkxfTE9PUEJBQ0sgICAgICAgICAgIDB4MTAgICAgICAvKiAxOiBMb29wIGJhY2sgYXQgRy9NSUkgSW50ZXJmYWNlICovCisjZGVmaW5lICAgICBNQUNfQ1RSTF9EVVBMWCAgICAgICAgICAgICAgMHgyMCAgICAgIC8qIDE6IEZ1bGwtZHVwbGV4IG1vZGUgIDA6IEhhbGYtZHVwbGV4IG1vZGUgKi8KKyNkZWZpbmUgICAgIE1BQ19DVFJMX0FERF9DUkMgICAgICAgICAgICAweDQwICAgICAgLyogMTogSW5zdHJ1Y3QgTUFDIHRvIGF0dGFjaCBDUkMgb24gYWxsIGVncmVzcyBFdGhlcm5ldCBmcmFtZXMgKi8KKyNkZWZpbmUgICAgIE1BQ19DVFJMX1BBRCAgICAgICAgICAgICAgICAweDgwICAgICAgLyogMTogSW5zdHJ1Y3QgTUFDIHRvIHBhZCBzaG9ydCBmcmFtZXMgdG8gNjAtYnl0ZXMsIGFuZCB0aGVuIGF0dGFjaCBDUkMuIFRoaXMgYml0IGhhcyBoaWdoZXIgcHJpb3JpdHkgb3ZlciBDUkNfRU4gKi8KKyNkZWZpbmUgICAgIE1BQ19DVFJMX0xFTkNISyAgICAgICAgICAgICAweDEwMCAgICAgLyogMTogSW5zdHJ1Y3QgTUFDIHRvIGNoZWNrIGlmIGxlbmd0aCBmaWVsZCBtYXRjaGVzIHRoZSByZWFsIHBhY2tldCBsZW5ndGggKi8KKyNkZWZpbmUgICAgIE1BQ19DVFJMX0hVR0VfRU4gICAgICAgICAgICAweDIwMCAgICAgLyogMTogcmVjZWl2ZSBKdW1ibyBmcmFtZSBlbmFibGUgKi8KKyNkZWZpbmUgICAgIE1BQ19DVFJMX1BSTUxFTl9TSElGVCAgICAgICAxMCAgICAgICAgLyogUHJlYW1ibGUgbGVuZ3RoICovCisjZGVmaW5lICAgICBNQUNfQ1RSTF9QUk1MRU5fTUFTSyAgICAgICAgMHhmCisjZGVmaW5lICAgICBNQUNfQ1RSTF9STVZfVkxBTiAgICAgICAgICAgMHg0MDAwICAgIC8qIDE6IHRvIHJlbW92ZSBWTEFOIFRhZyBhdXRvbWF0aWNhbGx5IGZyb20gYWxsIHJlY2VpdmUgcGFja2V0cyAqLworI2RlZmluZSAgICAgTUFDX0NUUkxfUFJPTUlTX0VOICAgICAgICAgIDB4ODAwMCAgICAvKiAxOiBQcm9taXNjdW91cyBNb2RlIEVuYWJsZSAqLworI2RlZmluZSAgICAgTUFDX0NUUkxfVFhfUEFVU0UgICAgICAgICAgIDB4MTAwMDAgICAvKiAxOiB0cmFuc21pdCB0ZXN0IHBhdXNlICovCisjZGVmaW5lICAgICBNQUNfQ1RSTF9TQ05UICAgICAgICAgICAgICAgMHgyMDAwMCAgIC8qIDE6IHNob3J0Y3V0IHNsb3QgdGltZSBjb3VudGVyICovCisjZGVmaW5lICAgICBNQUNfQ1RSTF9TUlNUX1RYICAgICAgICAgICAgMHg0MDAwMCAgIC8qIDE6IHN5bmNocm9uaXplZCByZXNldCBUcmFuc21pdCBNQUMgbW9kdWxlICovCisjZGVmaW5lICAgICBNQUNfQ1RSTF9UWF9TSU1VUlNUICAgICAgICAgMHg4MDAwMCAgIC8qIDE6IHRyYW5zbWl0IHNpbXVsYXRpb24gcmVzZXQgKi8KKyNkZWZpbmUgICAgIE1BQ19DVFJMX1NQRUVEX1NISUZUICAgICAgICAyMCAgICAgICAgLyogMTA6IGdpZ2FiaXQgMDE6MTBNLzEwME0gKi8KKyNkZWZpbmUgICAgIE1BQ19DVFJMX1NQRUVEX01BU0sgICAgICAgICAweDMwMDAwMAorI2RlZmluZSAgICAgTUFDX0NUUkxfU1BFRURfMTAwMCAgICAgICAgIDIKKyNkZWZpbmUgICAgIE1BQ19DVFJMX1NQRUVEXzEwXzEwMCAgICAgICAxCisjZGVmaW5lICAgICBNQUNfQ1RSTF9EQkdfVFhfQktQUkVTVVJFICAgMHg0MDAwMDAgIC8qIDE6IHRyYW5zbWl0IG1heGltdW0gYmFja29mZiAoaGFsZi1kdXBsZXggdGVzdCBiaXQpICovCisjZGVmaW5lICAgICBNQUNfQ1RSTF9UWF9IVUdFICAgICAgICAgICAgMHg4MDAwMDAgIC8qIDE6IHRyYW5zbWl0IGh1Z2UgZW5hYmxlICovCisjZGVmaW5lICAgICBNQUNfQ1RSTF9SWF9DSEtTVU1fRU4gICAgICAgMHgxMDAwMDAwIC8qIDE6IFJYIGNoZWNrc3VtIGVuYWJsZSAqLworI2RlZmluZSAgICAgTUFDX0NUUkxfTUNfQUxMX0VOICAgICAgICAgIDB4MjAwMDAwMCAvKiAxOiB1cGxvYWQgYWxsIG11bHRpY2FzdCBmcmFtZSB3aXRob3V0IGVycm9yIHRvIHN5c3RlbSAqLworI2RlZmluZSAgICAgTUFDX0NUUkxfQkNfRU4gICAgICAgICAgICAgIDB4NDAwMDAwMCAvKiAxOiB1cGxvYWQgYWxsIGJyb2FkY2FzdCBmcmFtZSB3aXRob3V0IGVycm9yIHRvIHN5c3RlbSAqLworI2RlZmluZSAgICAgTUFDX0NUUkxfREJHICAgICAgICAgICAgICAgIDB4ODAwMDAwMCAvKiAxOiB1cGxvYWQgYWxsIHJlY2VpdmVkIGZyYW1lIHRvIHN5c3RlbSAoRGVidWcgTW9kZSkgKi8KKworLyogTUFDIElQRy9JRkcgQ29udHJvbCBSZWdpc3RlciAgKi8KKyNkZWZpbmUgUkVHX01BQ19JUEdfSUZHICAgICAgICAgICAgIDB4MTQ4NAorI2RlZmluZSAgICAgTUFDX0lQR19JRkdfSVBHVF9TSElGVCAgICAgIDAgICAgIC8qIERlc2lyZWQgYmFjayB0byBiYWNrIGludGVyLXBhY2tldCBnYXAuIFRoZSBkZWZhdWx0IGlzIDk2LWJpdCB0aW1lICovCisjZGVmaW5lICAgICBNQUNfSVBHX0lGR19JUEdUX01BU0sgICAgICAgMHg3ZgorI2RlZmluZSAgICAgTUFDX0lQR19JRkdfTUlGR19TSElGVCAgICAgIDggICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIElGRyB0byBlbmZvcmNlIGluIGJldHdlZW4gUlggZnJhbWVzICovCisjZGVmaW5lICAgICBNQUNfSVBHX0lGR19NSUZHX01BU0sgICAgICAgMHhmZiAgLyogRnJhbWUgZ2FwIGJlbG93IHN1Y2ggSUZQIGlzIGRyb3BwZWQgKi8KKyNkZWZpbmUgICAgIE1BQ19JUEdfSUZHX0lQR1IxX1NISUZUICAgICAxNiAgICAvKiA2NGJpdCBDYXJyaWVyLVNlbnNlIHdpbmRvdyAqLworI2RlZmluZSAgICAgTUFDX0lQR19JRkdfSVBHUjFfTUFTSyAgICAgIDB4N2YKKyNkZWZpbmUgICAgIE1BQ19JUEdfSUZHX0lQR1IyX1NISUZUICAgICAyNCAgICAvKiA5Ni1iaXQgSVBHIHdpbmRvdyAqLworI2RlZmluZSAgICAgTUFDX0lQR19JRkdfSVBHUjJfTUFTSyAgICAgIDB4N2YKKworLyogTUFDIFNUQVRJT04gQUREUkVTUyAgKi8KKyNkZWZpbmUgUkVHX01BQ19TVEFfQUREUiAgICAgICAgICAgIDB4MTQ4OAorCisvKiBIYXNoIHRhYmxlIGZvciBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBSRUdfUlhfSEFTSF9UQUJMRSAgICAgICAgICAgMHgxNDkwCisKKworLyogTUFDIEhhbGYtRHVwbGV4IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX01BQ19IQUxGX0RVUExYX0NUUkwgICAgIDB4MTQ5OAorI2RlZmluZSAgICAgTUFDX0hBTEZfRFVQTFhfQ1RSTF9MQ09MX1NISUZUICAgMCAgICAgIC8qIENvbGxpc2lvbiBXaW5kb3cgKi8KKyNkZWZpbmUgICAgIE1BQ19IQUxGX0RVUExYX0NUUkxfTENPTF9NQVNLICAgIDB4M2ZmCisjZGVmaW5lICAgICBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX1NISUZUICAxMiAgICAgLyogUmV0cmFuc21pc3Npb24gbWF4aW11bSwgYWZ0ZXJ3YXJkcyB0aGUgcGFja2V0IHdpbGwgYmUgZGlzY2FyZGVkICovCisjZGVmaW5lICAgICBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX01BU0sgICAweGYKKyNkZWZpbmUgICAgIE1BQ19IQUxGX0RVUExYX0NUUkxfRVhDX0RFRl9FTiAgIDB4MTAwMDAgLyogMTogQWxsb3cgdGhlIHRyYW5zbWlzc2lvbiBvZiBhIHBhY2tldCB3aGljaCBoYXMgYmVlbiBleGNlc3NpdmVseSBkZWZlcnJlZCAqLworI2RlZmluZSAgICAgTUFDX0hBTEZfRFVQTFhfQ1RSTF9OT19CQUNLX0MgICAgMHgyMDAwMCAvKiAxOiBObyBiYWNrLW9mZiBvbiBjb2xsaXNpb24sIGltbWVkaWF0ZWx5IHN0YXJ0IHRoZSByZXRyYW5zbWlzc2lvbiAqLworI2RlZmluZSAgICAgTUFDX0hBTEZfRFVQTFhfQ1RSTF9OT19CQUNLX1AgICAgMHg0MDAwMCAvKiAxOiBObyBiYWNrLW9mZiBvbiBiYWNrcHJlc3N1cmUsIGltbWVkaWF0ZWx5IHN0YXJ0IHRoZSB0cmFuc21pc3Npb24gYWZ0ZXIgYmFjayBwcmVzc3VyZSAqLworI2RlZmluZSAgICAgTUFDX0hBTEZfRFVQTFhfQ1RSTF9BQkVCRSAgICAgICAgMHg4MDAwMCAvKiAxOiBBbHRlcm5hdGl2ZSBCaW5hcnkgRXhwb25lbnRpYWwgQmFjay1vZmYgRW5hYmxlZCAqLworI2RlZmluZSAgICAgTUFDX0hBTEZfRFVQTFhfQ1RSTF9BQkVCVF9TSElGVCAgMjAgICAgICAvKiBNYXhpbXVtIGJpbmFyeSBleHBvbmVudGlhbCBudW1iZXIgKi8KKyNkZWZpbmUgICAgIE1BQ19IQUxGX0RVUExYX0NUUkxfQUJFQlRfTUFTSyAgIDB4ZgorI2RlZmluZSAgICAgTUFDX0hBTEZfRFVQTFhfQ1RSTF9KQU1JUEdfU0hJRlQgMjQgICAgICAvKiBJUEcgdG8gc3RhcnQgSkFNIGZvciBjb2xsaXNpb24gYmFzZWQgZmxvdyBjb250cm9sIGluIGhhbGYtZHVwbGV4ICovCisjZGVmaW5lICAgICBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19NQVNLICAweGYgICAgIC8qIG1vZGUuIEluIHVuaXQgb2YgOC1iaXQgdGltZSAqLworCisvKiBNYXhpbXVtIEZyYW1lIExlbmd0aCBDb250cm9sIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgUkVHX01UVSAgICAgICAgICAgICAgICAgICAgIDB4MTQ5YworCisvKiBXYWtlLU9uLUxhbiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19XT0xfQ1RSTCAgICAgICAgICAgICAgICAweDE0YTAKKyNkZWZpbmUgICAgIFdPTF9QQVRURVJOX0VOICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSAgICAgV09MX1BBVFRFUk5fUE1FX0VOICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lICAgICBXT0xfTUFHSUNfRU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgICAgIFdPTF9NQUdJQ19QTUVfRU4gICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSAgICAgV09MX0xJTktfQ0hHX0VOICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lICAgICBXT0xfTElOS19DSEdfUE1FX0VOICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgICAgIFdPTF9QQVRURVJOX1NUICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSAgICAgV09MX01BR0lDX1NUICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lICAgICBXT0xfTElOS0NIR19TVCAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgICAgIFdPTF9DTEtfU1dJVENIX0VOICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSAgICAgV09MX1BUMF9FTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lICAgICBXT0xfUFQxX0VOICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgICAgIFdPTF9QVDJfRU4gICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSAgICAgV09MX1BUM19FTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lICAgICBXT0xfUFQ0X0VOICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgICAgIFdPTF9QVDVfRU4gICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSAgICAgV09MX1BUNl9FTiAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisvKiBXT0wgTGVuZ3RoICggMiBEV09SRCApICovCisjZGVmaW5lIFJFR19XT0xfUEFUVEVSTl9MRU4gICAgICAgICAweDE0YTQKKyNkZWZpbmUgICAgIFdPTF9QVF9MRU5fTUFTSyAgICAgICAgICAgICAgICAgMHg3ZgorI2RlZmluZSAgICAgV09MX1BUMF9MRU5fU0hJRlQgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICBXT0xfUFQxX0xFTl9TSElGVCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgICAgIFdPTF9QVDJfTEVOX1NISUZUICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgICAgIFdPTF9QVDNfTEVOX1NISUZUICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgICAgIFdPTF9QVDRfTEVOX1NISUZUICAgICAgICAgICAgICAgMAorI2RlZmluZSAgICAgV09MX1BUNV9MRU5fU0hJRlQgICAgICAgICAgICAgICA4CisjZGVmaW5lICAgICBXT0xfUFQ2X0xFTl9TSElGVCAgICAgICAgICAgICAgIDE2CisKKy8qIEludGVybmFsIFNSQU0gUGFydGl0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19TUkFNX1RSRF9BRERSICAgICAgICAgICAweDE1MTgKKyNkZWZpbmUgUkVHX1NSQU1fVFJEX0xFTiAgICAgICAgICAgIDB4MTUxQworI2RlZmluZSBSRUdfU1JBTV9SWEZfQUREUiAgICAgICAgICAgMHgxNTIwCisjZGVmaW5lIFJFR19TUkFNX1JYRl9MRU4gICAgICAgICAgICAweDE1MjQKKyNkZWZpbmUgUkVHX1NSQU1fVFhGX0FERFIgICAgICAgICAgIDB4MTUyOAorI2RlZmluZSBSRUdfU1JBTV9UWEZfTEVOICAgICAgICAgICAgMHgxNTJDCisjZGVmaW5lIFJFR19TUkFNX1RDUEhfQUREUiAgICAgICAgICAweDE1MzAKKyNkZWZpbmUgUkVHX1NSQU1fUEtUSF9BRERSICAgICAgICAgIDB4MTUzMgorCisvKiBMb2FkIFB0ciBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfTE9BRF9QVFIgICAgICAgICAgICAgICAgMHgxNTM0ICAvKiBTb2Z0d2FyZSBzZXRzIHRoaXMgYml0IGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgaGVhZCBhbmQgdGFpbCAqLworCisvKgorICogYWRkcmVzc2VzIG9mIGFsbCBkZXNjcmlwdG9ycywgYXMgd2VsbCBhcyB0aGUgZm9sbG93aW5nIGRlc2NyaXB0b3IKKyAqIGNvbnRyb2wgcmVnaXN0ZXIsIHdoaWNoIHRyaWdnZXJzIGVhY2ggZnVuY3Rpb24gYmxvY2sgdG8gbG9hZCB0aGUgaGVhZAorICogcG9pbnRlciB0byBwcmVwYXJlIGZvciB0aGUgb3BlcmF0aW9uLiBUaGlzIGJpdCBpcyB0aGVuIHNlbGYtY2xlYXJlZAorICogYWZ0ZXIgb25lIGN5Y2xlLgorICovCisKKy8qIERlc2NyaXB0b3IgQ29udHJvbCByZWdpc3RlciAgKi8KKyNkZWZpbmUgUkVHX1JYRjNfQkFTRV9BRERSX0hJICAgICAgICAgICAweDE1M0MKKyNkZWZpbmUgUkVHX0RFU0NfQkFTRV9BRERSX0hJICAgICAgICAgICAweDE1NDAKKyNkZWZpbmUgUkVHX1JYRjBfQkFTRV9BRERSX0hJICAgICAgICAgICAweDE1NDAgLyogc2hhcmUgd2l0aCBERVNDIEJBU0UgQUREUiBISSAqLworI2RlZmluZSBSRUdfSE9TVF9SWEYwX1BBR0UwX0xPICAgICAgICAgIDB4MTU0NAorI2RlZmluZSBSRUdfSE9TVF9SWEYwX1BBR0UxX0xPICAgICAgICAgIDB4MTU0OAorI2RlZmluZSBSRUdfVFBEX0JBU0VfQUREUl9MTyAgICAgICAgICAgIDB4MTU0QworI2RlZmluZSBSRUdfUlhGMV9CQVNFX0FERFJfSEkgICAgICAgICAgIDB4MTU1MAorI2RlZmluZSBSRUdfUlhGMl9CQVNFX0FERFJfSEkgICAgICAgICAgIDB4MTU1NAorI2RlZmluZSBSRUdfSE9TVF9SWEZQQUdFX1NJWkUgICAgICAgICAgIDB4MTU1OAorI2RlZmluZSBSRUdfVFBEX1JJTkdfU0laRSAgICAgICAgICAgICAgIDB4MTU1QworLyogUlNTIGFib3V0ICovCisjZGVmaW5lIFJFR19SU1NfS0VZMCAgICAgICAgICAgICAgICAgICAgMHgxNEIwCisjZGVmaW5lIFJFR19SU1NfS0VZMSAgICAgICAgICAgICAgICAgICAgMHgxNEI0CisjZGVmaW5lIFJFR19SU1NfS0VZMiAgICAgICAgICAgICAgICAgICAgMHgxNEI4CisjZGVmaW5lIFJFR19SU1NfS0VZMyAgICAgICAgICAgICAgICAgICAgMHgxNEJDCisjZGVmaW5lIFJFR19SU1NfS0VZNCAgICAgICAgICAgICAgICAgICAgMHgxNEMwCisjZGVmaW5lIFJFR19SU1NfS0VZNSAgICAgICAgICAgICAgICAgICAgMHgxNEM0CisjZGVmaW5lIFJFR19SU1NfS0VZNiAgICAgICAgICAgICAgICAgICAgMHgxNEM4CisjZGVmaW5lIFJFR19SU1NfS0VZNyAgICAgICAgICAgICAgICAgICAgMHgxNENDCisjZGVmaW5lIFJFR19SU1NfS0VZOCAgICAgICAgICAgICAgICAgICAgMHgxNEQwCisjZGVmaW5lIFJFR19SU1NfS0VZOSAgICAgICAgICAgICAgICAgICAgMHgxNEQ0CisjZGVmaW5lIFJFR19JRFRfVEFCTEU0ICAgICAgICAgICAgICAgICAgMHgxNEUwCisjZGVmaW5lIFJFR19JRFRfVEFCTEU1ICAgICAgICAgICAgICAgICAgMHgxNEU0CisjZGVmaW5lIFJFR19JRFRfVEFCTEU2ICAgICAgICAgICAgICAgICAgMHgxNEU4CisjZGVmaW5lIFJFR19JRFRfVEFCTEU3ICAgICAgICAgICAgICAgICAgMHgxNEVDCisjZGVmaW5lIFJFR19JRFRfVEFCTEUwICAgICAgICAgICAgICAgICAgMHgxNTYwCisjZGVmaW5lIFJFR19JRFRfVEFCTEUxICAgICAgICAgICAgICAgICAgMHgxNTY0CisjZGVmaW5lIFJFR19JRFRfVEFCTEUyICAgICAgICAgICAgICAgICAgMHgxNTY4CisjZGVmaW5lIFJFR19JRFRfVEFCTEUzICAgICAgICAgICAgICAgICAgMHgxNTZDCisjZGVmaW5lIFJFR19JRFRfVEFCTEUgICAgICAgICAgICAgICAgICAgUkVHX0lEVF9UQUJMRTAKKyNkZWZpbmUgUkVHX1JTU19IQVNIX1ZBTFVFICAgICAgICAgICAgICAweDE1NzAKKyNkZWZpbmUgUkVHX1JTU19IQVNIX0ZMQUcgICAgICAgICAgICAgICAweDE1NzQKKyNkZWZpbmUgUkVHX0JBU0VfQ1BVX05VTUJFUiAgICAgICAgICAgICAweDE1N0MKKworCisvKiBUWFEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfVFhRX0NUUkwgICAgICAgICAgICAgICAgMHgxNTgwCisjZGVmaW5lICAgICBUWFFfQ1RSTF9OVU1fVFBEX0JVUlNUX01BU0sgICAgIDB4RgorI2RlZmluZSAgICAgVFhRX0NUUkxfTlVNX1RQRF9CVVJTVF9TSElGVCAgICAwCisjZGVmaW5lICAgICBUWFFfQ1RSTF9FTiAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8qIDE6IEVuYWJsZSBUWFEgKi8KKyNkZWZpbmUgICAgIFRYUV9DVFJMX0VOSF9NT0RFICAgICAgICAgICAgICAgMHg0MCAgLyogUGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQgbW9kZSwgaW4gd2hpY2ggdXAgdG8gdHdvIGJhY2stdG8tYmFjayBETUEgcmVhZCBjb21tYW5kcyBtaWdodCBiZSBkaXNwYXRjaGVkLiAqLworI2RlZmluZSAgICAgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9TSElGVCAgICAxNiAgICAvKiBOdW1iZXIgb2YgZGF0YSBieXRlIHRvIHJlYWQgaW4gYSBjYWNoZS1hbGlnbmVkIGJ1cnN0LiBFYWNoIFNSQU0gZW50cnkgaXMgOC1ieXRlIGluIGxlbmd0aC4gKi8KKyNkZWZpbmUgICAgIFRYUV9DVFJMX1RYRl9CVVJTVF9OVU1fTUFTSyAgICAgMHhmZmZmCisKKy8qIEp1bWJvIHBhY2tldCBUaHJlc2hvbGQgZm9yIHRhc2sgb2ZmbG9hZCAqLworI2RlZmluZSBSRUdfVFhfRUFSTFlfVEggICAgICAgICAgICAgICAgICAgICAweDE1ODQgLyogSnVtYm8gZnJhbWUgdGhyZXNob2xkIGluIFFXT1JEIHVuaXQuIFBhY2tldCBncmVhdGVyIHRoYW4gKi8KKy8qIEpVTUJPX1RBU0tfT0ZGTE9BRF9USFJFU0hPTEQgd2lsbCBub3QgYmUgdGFzayBvZmZsb2FkZWQuICovCisjZGVmaW5lICAgICBUWF9UWF9FQVJMWV9USF9NQVNLICAgICAgICAgICAgIDB4N2ZmCisjZGVmaW5lICAgICBUWF9UWF9FQVJMWV9USF9TSElGVCAgICAgICAgICAgIDAKKworCisvKiBSWFEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfUlhRX0NUUkwgICAgICAgICAgICAgICAgMHgxNUEwCisjZGVmaW5lICAgICAgICAgUlhRX0NUUkxfUEJBX0FMSUdOXzMyICAgICAgICAgICAgICAgICAgIDAgICAvKiByeC1wYWNrZXQgYWxpZ25tZW50ICovCisjZGVmaW5lICAgICAgICAgUlhRX0NUUkxfUEJBX0FMSUdOXzY0ICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgICAgICBSWFFfQ1RSTF9QQkFfQUxJR05fMTI4ICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSAgICAgICAgIFJYUV9DVFJMX1BCQV9BTElHTl8yNTYgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lICAgICAgICAgUlhRX0NUUkxfUTFfRU4JCQkJMHgxMAorI2RlZmluZSAgICAgICAgIFJYUV9DVFJMX1EyX0VOCQkJCTB4MjAKKyNkZWZpbmUgICAgICAgICBSWFFfQ1RSTF9RM19FTgkJCQkweDQwCisjZGVmaW5lICAgICAgICAgUlhRX0NUUkxfSVBWNl9YU1VNX1ZFUklGWV9FTgkJMHg4MAorI2RlZmluZSAgICAgICAgIFJYUV9DVFJMX0hBU0hfVExFTl9TSElGVCAgICAgICAgICAgICAgICA4CisjZGVmaW5lICAgICAgICAgUlhRX0NUUkxfSEFTSF9UTEVOX01BU0sgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgICAgICAgICBSWFFfQ1RSTF9IQVNIX1RZUEVfSVBWNCAgICAgICAgICAgICAgICAgMHgxMDAwMAorI2RlZmluZSAgICAgICAgIFJYUV9DVFJMX0hBU0hfVFlQRV9JUFY0X1RDUCAgICAgICAgICAgICAweDIwMDAwCisjZGVmaW5lICAgICAgICAgUlhRX0NUUkxfSEFTSF9UWVBFX0lQVjYgICAgICAgICAgICAgICAgIDB4NDAwMDAKKyNkZWZpbmUgICAgICAgICBSWFFfQ1RSTF9IQVNIX1RZUEVfSVBWNl9UQ1AgICAgICAgICAgICAgMHg4MDAwMAorI2RlZmluZSAgICAgICAgIFJYUV9DVFJMX1JTU19NT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICAgICAgUlhRX0NUUkxfUlNTX01PREVfU1FTSU5UICAgICAgICAgICAgICAgIDB4NDAwMDAwMAorI2RlZmluZSAgICAgICAgIFJYUV9DVFJMX1JTU19NT0RFX01RVUVTSU5UICAgICAgICAgICAgICAweDgwMDAwMDAKKyNkZWZpbmUgICAgICAgICBSWFFfQ1RSTF9SU1NfTU9ERV9NUVVFTUlOVCAgICAgICAgICAgICAgMHhDMDAwMDAwCisjZGVmaW5lICAgICAgICAgUlhRX0NUUkxfTklQX1FVRVVFX1NFTF9UQkwgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgICAgICAgICBSWFFfQ1RSTF9IQVNIX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSAgICAgICAgIFJYUV9DVFJMX0NVVF9USFJVX0VOICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lICAgICAgICAgUlhRX0NUUkxfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworLyogUngganVtYm8gcGFja2V0IHRocmVzaG9sZCBhbmQgcnJkICByZXRpcmVtZW50IHRpbWVyICAqLworI2RlZmluZSBSRUdfUlhRX0pNQk9TWl9SUkRUSU0gICAgICAgMHgxNUE0CisvKgorICogSnVtYm8gcGFja2V0IHRocmVzaG9sZCBmb3Igbm9uLVZMQU4gcGFja2V0LCBpbiBRV09SRCAoNjQtYml0KSB1bml0LgorICogV2hlbiB0aGUgcGFja2V0IGxlbmd0aCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZSwgUlhRCisgKiBzaGFsbCBzdGFydCBjdXQtdGhyb3VnaCBmb3J3YXJkaW5nIG9mIHRoZSByZWNlaXZlZCBwYWNrZXQuCisgKi8KKyNkZWZpbmUgICAgICAgICBSWFFfSk1CT1NaX1RIX01BU0sgICAgICAweDdmZgorI2RlZmluZSAgICAgICAgIFJYUV9KTUJPU1pfVEhfU0hJRlQgICAgICAgICAwICAvKiBSUkQgcmV0aXJlbWVudCB0aW1lci4gRGVjcmVtZW50IGJ5IDEgYWZ0ZXIgZXZlcnkgNTEybnMgcGFzc2VzKi8KKyNkZWZpbmUgICAgICAgICBSWFFfSk1CT19MS0FIX01BU0sgICAgICAgICAgMHhmCisjZGVmaW5lICAgICAgICAgUlhRX0pNQk9fTEtBSF9TSElGVCAgICAgICAgIDExCisKKy8qIFJYRiBmbG93IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1JYUV9SWEZfUEFVU0VfVEhSRVNIICAgIDB4MTVBOAorI2RlZmluZSAgICAgUlhRX1JYRl9QQVVTRV9USF9ISV9TSElGVCAgICAgICAwCisjZGVmaW5lICAgICBSWFFfUlhGX1BBVVNFX1RIX0hJX01BU0sgICAgICAgIDB4ZmZmCisjZGVmaW5lICAgICBSWFFfUlhGX1BBVVNFX1RIX0xPX1NISUZUICAgICAgIDE2CisjZGVmaW5lICAgICBSWFFfUlhGX1BBVVNFX1RIX0xPX01BU0sgICAgICAgIDB4ZmZmCisKKworLyogRE1BIEVuZ2luZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19ETUFfQ1RSTCAgICAgICAgICAgICAgICAweDE1QzAKKyNkZWZpbmUgICAgIERNQV9DVFJMX0RNQVJfSU5fT1JERVIgICAgICAgICAgMHgxCisjZGVmaW5lICAgICBETUFfQ1RSTF9ETUFSX0VOSF9PUkRFUiAgICAgICAgIDB4MgorI2RlZmluZSAgICAgRE1BX0NUUkxfRE1BUl9PVVRfT1JERVIgICAgICAgICAweDQKKyNkZWZpbmUgICAgIERNQV9DVFJMX1JDQl9WQUxVRSAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgICBETUFfQ1RSTF9ETUFSX0JVUlNUX0xFTl9TSElGVCAgIDQKKyNkZWZpbmUgICAgIERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX01BU0sgICAgNworI2RlZmluZSAgICAgRE1BX0NUUkxfRE1BV19CVVJTVF9MRU5fU0hJRlQgICA3CisjZGVmaW5lICAgICBETUFfQ1RSTF9ETUFXX0JVUlNUX0xFTl9NQVNLICAgIDcKKyNkZWZpbmUgICAgIERNQV9DVFJMX0RNQVJfUkVRX1BSSSAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgICAgIERNQV9DVFJMX0RNQVJfRExZX0NOVF9NQVNLICAgICAgMHgxRgorI2RlZmluZSAgICAgRE1BX0NUUkxfRE1BUl9ETFlfQ05UX1NISUZUICAgICAxMQorI2RlZmluZSAgICAgRE1BX0NUUkxfRE1BV19ETFlfQ05UX01BU0sgICAgICAweEYKKyNkZWZpbmUgICAgIERNQV9DVFJMX0RNQVdfRExZX0NOVF9TSElGVCAgICAgMTYKKyNkZWZpbmUgICAgIERNQV9DVFJMX1RYQ01CX0VOICAgICAgICAgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgICAgIERNQV9DVFJMX1JYQ01CX0VOCQkJCTB4MjAwMDAwCisKKworLyogQ01CL1NNQiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19TTUJfU1RBVF9USU1FUiAgICAgICAgICAgICAgICAgICAgICAweDE1QzQKKyNkZWZpbmUgUkVHX1RSSUdfUlJEX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgIDB4MTVDQQorI2RlZmluZSBSRUdfVFJJR19UUERfVEhSRVNIICAgICAgICAgICAgICAgICAgICAgMHgxNUM4CisjZGVmaW5lIFJFR19UUklHX1RYVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAweDE1Q0MKKyNkZWZpbmUgUkVHX1RSSUdfUlhUSU1FUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MTVDRQorCisvKiBIT1NUIFJYRiBQYWdlIDEsMiwzIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkVHX0hPU1RfUlhGMV9QQUdFMF9MTyAgICAgICAgICAgICAgICAgIDB4MTVEMAorI2RlZmluZSBSRUdfSE9TVF9SWEYxX1BBR0UxX0xPICAgICAgICAgICAgICAgICAgMHgxNUQ0CisjZGVmaW5lIFJFR19IT1NUX1JYRjJfUEFHRTBfTE8gICAgICAgICAgICAgICAgICAweDE1RDgKKyNkZWZpbmUgUkVHX0hPU1RfUlhGMl9QQUdFMV9MTyAgICAgICAgICAgICAgICAgIDB4MTVEQworI2RlZmluZSBSRUdfSE9TVF9SWEYzX1BBR0UwX0xPICAgICAgICAgICAgICAgICAgMHgxNUUwCisjZGVmaW5lIFJFR19IT1NUX1JYRjNfUEFHRTFfTE8gICAgICAgICAgICAgICAgICAweDE1RTQKKworLyogTWFpbCBib3ggKi8KKyNkZWZpbmUgUkVHX01CX1JYRjFfUkFERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MTVCNAorI2RlZmluZSBSRUdfTUJfUlhGMl9SQUREUiAgICAgICAgICAgICAgICAgICAgICAgMHgxNUI4CisjZGVmaW5lIFJFR19NQl9SWEYzX1JBRERSICAgICAgICAgICAgICAgICAgICAgICAweDE1QkMKKyNkZWZpbmUgUkVHX01CX1RQRF9QUk9EX0lEWCAgICAgICAgICAgICAgICAgICAgIDB4MTVGMAorCisvKiBSWEYtUGFnZSAwLTMgIFBhZ2VObyAmIFZhbGlkIGJpdCAqLworI2RlZmluZSBSRUdfSE9TVF9SWEYwX1BBR0UwX1ZMRCAgICAgMHgxNUY0CisjZGVmaW5lICAgICBIT1NUX1JYRl9WQUxJRCAgICAgICAgICAgICAgMQorI2RlZmluZSAgICAgSE9TVF9SWEZfUEFHRU5PX1NISUZUICAgICAgIDEKKyNkZWZpbmUgICAgIEhPU1RfUlhGX1BBR0VOT19NQVNLICAgICAgICAweDdGCisjZGVmaW5lIFJFR19IT1NUX1JYRjBfUEFHRTFfVkxEICAgICAweDE1RjUKKyNkZWZpbmUgUkVHX0hPU1RfUlhGMV9QQUdFMF9WTEQgICAgIDB4MTVGNgorI2RlZmluZSBSRUdfSE9TVF9SWEYxX1BBR0UxX1ZMRCAgICAgMHgxNUY3CisjZGVmaW5lIFJFR19IT1NUX1JYRjJfUEFHRTBfVkxEICAgICAweDE1RjgKKyNkZWZpbmUgUkVHX0hPU1RfUlhGMl9QQUdFMV9WTEQgICAgIDB4MTVGOQorI2RlZmluZSBSRUdfSE9TVF9SWEYzX1BBR0UwX1ZMRCAgICAgMHgxNUZBCisjZGVmaW5lIFJFR19IT1NUX1JYRjNfUEFHRTFfVkxEICAgICAweDE1RkIKKworLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfSVNSICAgIDB4MTYwMAorI2RlZmluZSAgSVNSX1NNQiAgIAkJMQorI2RlZmluZSAgSVNSX1RJTUVSCQkyICAgICAgIC8qIEludGVycnVwdCB3aGVuIFRpbWVyIGlzIGNvdW50ZWQgZG93biB0byB6ZXJvICovCisvKgorICogU29mdHdhcmUgbWFudWFsIGludGVycnVwdCwgZm9yIGRlYnVnLiBTZXQgd2hlbiBTV19NQU5fSU5UX0VOIGlzIHNldAorICogaW4gVGFibGUgNTEgU2VsZW5lIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyIChPZmZzZXQgMHgxNDAwKS4KKyAqLworI2RlZmluZSAgSVNSX01BTlVBTCAgICAgICAgIAk0CisjZGVmaW5lICBJU1JfSFdfUlhGX09WICAgICAgICAgIDggICAgICAgIC8qIFJYRiBvdmVyZmxvdyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIElTUl9IT1NUX1JYRjBfT1YgICAgICAgMHgxMAorI2RlZmluZSAgSVNSX0hPU1RfUlhGMV9PViAgICAgICAweDIwCisjZGVmaW5lICBJU1JfSE9TVF9SWEYyX09WICAgICAgIDB4NDAKKyNkZWZpbmUgIElTUl9IT1NUX1JYRjNfT1YgICAgICAgMHg4MAorI2RlZmluZSAgSVNSX1RYRl9VTiAgICAgICAgICAgICAweDEwMAorI2RlZmluZSAgSVNSX1JYMF9QQUdFX0ZVTEwgICAgICAweDIwMAorI2RlZmluZSAgSVNSX0RNQVJfVE9fUlNUICAgICAgICAweDQwMAorI2RlZmluZSAgSVNSX0RNQVdfVE9fUlNUICAgICAgICAweDgwMAorI2RlZmluZSAgSVNSX0dQSFkgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgIElTUl9UWF9DUkVESVQgICAgICAgICAgMHgyMDAwCisjZGVmaW5lICBJU1JfR1BIWV9MUFcgICAgICAgICAgIDB4NDAwMCAgICAvKiBHUEhZIGxvdyBwb3dlciBzdGF0ZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIElTUl9SWF9QS1QgICAgICAgICAgICAgMHgxMDAwMCAgIC8qIE9uZSBwYWNrZXQgcmVjZWl2ZWQsIHRyaWdnZXJlZCBieSBSRkQgKi8KKyNkZWZpbmUgIElTUl9UWF9QS1QgICAgICAgICAgICAgMHgyMDAwMCAgIC8qIE9uZSBwYWNrZXQgdHJhbnNtaXR0ZWQsIHRyaWdnZXJlZCBieSBUUEQgKi8KKyNkZWZpbmUgIElTUl9UWF9ETUEgICAgICAgICAgICAgMHg0MDAwMAorI2RlZmluZSAgSVNSX1JYX1BLVF8xICAgICAgICAgICAweDgwMDAwCisjZGVmaW5lICBJU1JfUlhfUEtUXzIgICAgICAgICAgIDB4MTAwMDAwCisjZGVmaW5lICBJU1JfUlhfUEtUXzMgICAgICAgICAgIDB4MjAwMDAwCisjZGVmaW5lICBJU1JfTUFDX1JYICAgICAgICAgICAgIDB4NDAwMDAwCisjZGVmaW5lICBJU1JfTUFDX1RYICAgICAgICAgICAgIDB4ODAwMDAwCisjZGVmaW5lICBJU1JfVVJfREVURUNURUQgICAgICAgIDB4MTAwMDAwMAorI2RlZmluZSAgSVNSX0ZFUlJfREVURUNURUQgICAgICAweDIwMDAwMDAKKyNkZWZpbmUgIElTUl9ORkVSUl9ERVRFQ1RFRCAgICAgMHg0MDAwMDAwCisjZGVmaW5lICBJU1JfQ0VSUl9ERVRFQ1RFRCAgICAgIDB4ODAwMDAwMAorI2RlZmluZSAgSVNSX1BIWV9MSU5LRE9XTiAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lICBJU1JfRElTX0lOVCAgICAgICAgICAgIDB4ODAwMDAwMDAKKworCisvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfSU1SIDB4MTYwNAorCisKKyNkZWZpbmUgSU1SX05PUk1BTF9NQVNLIChcCisJCUlTUl9TTUIJICAgICAgICB8XAorCQlJU1JfVFhGX1VOICAgICAgfFwKKwkJSVNSX0hXX1JYRl9PViAgIHxcCisJCUlTUl9IT1NUX1JYRjBfT1Z8XAorCQlJU1JfTUFOVUFMICAgICAgfFwKKwkJSVNSX0dQSFkgICAgICAgIHxcCisJCUlTUl9HUEhZX0xQVyAgICB8XAorCQlJU1JfRE1BUl9UT19SU1QgfFwKKwkJSVNSX0RNQVdfVE9fUlNUIHxcCisJCUlTUl9QSFlfTElOS0RPV058XAorCQlJU1JfUlhfUEtUICAgICAgfFwKKwkJSVNSX1RYX1BLVCkKKworI2RlZmluZSBJU1JfVFhfRVZFTlQgKElTUl9UWEZfVU4gfCBJU1JfVFhfUEtUKQorI2RlZmluZSBJU1JfUlhfRVZFTlQgKElTUl9IT1NUX1JYRjBfT1YgfCBJU1JfSFdfUlhGX09WIHwgSVNSX1JYX1BLVCkKKworI2RlZmluZSBSRUdfTUFDX1JYX1NUQVRVU19CSU4gMHgxNzAwCisjZGVmaW5lIFJFR19NQUNfUlhfU1RBVFVTX0VORCAweDE3NWMKKyNkZWZpbmUgUkVHX01BQ19UWF9TVEFUVVNfQklOIDB4MTc2MAorI2RlZmluZSBSRUdfTUFDX1RYX1NUQVRVU19FTkQgMHgxN2MwCisKKy8qIEhhcmR3YXJlIE9mZnNldCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfSE9TVF9SWEYwX1BBR0VPRkYgMHgxODAwCisjZGVmaW5lIFJFR19UUERfQ09OU19JRFggICAgICAweDE4MDQKKyNkZWZpbmUgUkVHX0hPU1RfUlhGMV9QQUdFT0ZGIDB4MTgwOAorI2RlZmluZSBSRUdfSE9TVF9SWEYyX1BBR0VPRkYgMHgxODBDCisjZGVmaW5lIFJFR19IT1NUX1JYRjNfUEFHRU9GRiAweDE4MTAKKworLyogUlhGLVBhZ2UgMC0zIE9mZnNldCBETUEgQWRkcmVzcyAqLworI2RlZmluZSBSRUdfSE9TVF9SWEYwX01CMF9MTyAgMHgxODIwCisjZGVmaW5lIFJFR19IT1NUX1JYRjBfTUIxX0xPICAweDE4MjQKKyNkZWZpbmUgUkVHX0hPU1RfUlhGMV9NQjBfTE8gIDB4MTgyOAorI2RlZmluZSBSRUdfSE9TVF9SWEYxX01CMV9MTyAgMHgxODJDCisjZGVmaW5lIFJFR19IT1NUX1JYRjJfTUIwX0xPICAweDE4MzAKKyNkZWZpbmUgUkVHX0hPU1RfUlhGMl9NQjFfTE8gIDB4MTgzNAorI2RlZmluZSBSRUdfSE9TVF9SWEYzX01CMF9MTyAgMHgxODM4CisjZGVmaW5lIFJFR19IT1NUX1JYRjNfTUIxX0xPICAweDE4M0MKKworLyogVHBkIENNQiBETUEgQWRkcmVzcyAqLworI2RlZmluZSBSRUdfSE9TVF9UWF9DTUJfTE8gICAgMHgxODQwCisjZGVmaW5lIFJFR19IT1NUX1NNQl9BRERSX0xPICAweDE4NDQKKworLyogREVCVUcgQUREUiAqLworI2RlZmluZSBSRUdfREVCVUdfREFUQTAgMHgxOTAwCisjZGVmaW5lIFJFR19ERUJVR19EQVRBMSAweDE5MDQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1JSSBkZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBIWSBDb21tb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JNQ1IgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIE1JSV9CTVNSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBNSUlfUEhZU0lEMSAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUlJX1BIWVNJRDIgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIE1JSV9BRFZFUlRJU0UgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBNSUlfTFBBICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgTUlJX0VYUEFOU0lPTiAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIE1JSV9BVDAwMV9DUiAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBNSUlfQVQwMDFfU1IgICAgICAgICAgICAgICAgICAgIDB4MEEKKyNkZWZpbmUgTUlJX0FUMDAxX0VTUiAgICAgICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBNSUlfQVQwMDFfUFNTUiAgICAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgTUlJX0lOVF9DVFJMICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIE1JSV9JTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBNSUlfU01BUlRTUEVFRCAgICAgICAgICAgICAgICAgIDB4MTQKKyNkZWZpbmUgTUlJX1JFUlJDT1VOVEVSICAgICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIE1JSV9TUkVWSVNJT04gICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBNSUlfUkVTVjEgICAgICAgICAgICAgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgTUlJX0xCUkVSUk9SICAgICAgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIE1JSV9QSFlBRERSICAgICAgICAgICAgICAgICAgICAgMHgxOQorI2RlZmluZSBNSUlfUkVTVjIgICAgICAgICAgICAgICAgICAgICAgIDB4MWEKKyNkZWZpbmUgTUlJX1RQSVNUQVRVUyAgICAgICAgICAgICAgICAgICAweDFiCisjZGVmaW5lIE1JSV9OQ09ORklHICAgICAgICAgICAgICAgICAgICAgMHgxYworCisjZGVmaW5lIE1JSV9EQkdfQUREUgkJCTB4MUQKKyNkZWZpbmUgTUlJX0RCR19EQVRBCQkJMHgxRQorCisKKy8qIFBIWSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9DUl9TUEVFRF9TRUxFQ1RfTVNCICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBiaXRzIDYsMTM6IDEwPTEwMDAsIDAxPTEwMCwgMDA9MTAgKi8KKyNkZWZpbmUgTUlJX0NSX0NPTExfVEVTVF9FTkFCTEUgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIENvbGxpc2lvbiB0ZXN0IGVuYWJsZSAqLworI2RlZmluZSBNSUlfQ1JfRlVMTF9EVVBMRVggICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRkRYID0xLCBoYWxmIGR1cGxleCA9MCAqLworI2RlZmluZSBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogUmVzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisjZGVmaW5lIE1JSV9DUl9JU09MQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBJc29sYXRlIFBIWSBmcm9tIE1JSSAqLworI2RlZmluZSBNSUlfQ1JfUE9XRVJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogUG93ZXIgZG93biAqLworI2RlZmluZSBNSUlfQ1JfQVVUT19ORUdfRU4gICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogQXV0byBOZWcgRW5hYmxlICovCisjZGVmaW5lIE1JSV9DUl9TUEVFRF9TRUxFQ1RfTFNCICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBiaXRzIDYsMTM6IDEwPTEwMDAsIDAxPTEwMCwgMDA9MTAgKi8KKyNkZWZpbmUgTUlJX0NSX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIDAgPSBub3JtYWwsIDEgPSBsb29wYmFjayAqLworI2RlZmluZSBNSUlfQ1JfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogMCA9IG5vcm1hbCwgMSA9IFBIWSByZXNldCAqLworI2RlZmluZSBNSUlfQ1JfU1BFRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA0MAorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAwMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorCisKKy8qIFBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1NSX0VYVEVOREVEX0NBUFMgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEV4dGVuZGVkIHJlZ2lzdGVyIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBNSUlfU1JfSkFCQkVSX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSmFiYmVyIERldGVjdGVkICovCisjZGVmaW5lIE1JSV9TUl9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBMaW5rIFN0YXR1cyAxID0gbGluayAqLworI2RlZmluZSBNSUlfU1JfQVVUT05FR19DQVBTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQXV0byBOZWcgQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfUkVNT1RFX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogUmVtb3RlIEZhdWx0IERldGVjdCAqLworI2RlZmluZSBNSUlfU1JfQVVUT05FR19DT01QTEVURSAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQXV0byBOZWcgQ29tcGxldGUgKi8KKyNkZWZpbmUgTUlJX1NSX1BSRUFNQkxFX1NVUFBSRVNTICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFByZWFtYmxlIG1heSBiZSBzdXBwcmVzc2VkICovCisjZGVmaW5lIE1JSV9TUl9FWFRFTkRFRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBFeHQuIHN0YXR1cyBpbmZvIGluIFJlZyAweDBGICovCisjZGVmaW5lIE1JSV9TUl8xMDBUMl9IRF9DQVBTICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiAxMDBUMiBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBUMl9GRF9DQVBTICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiAxMDBUMiBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMFRfSERfQ0FQUyAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMFRfRkRfQ0FQUyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiAxMFQgICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBYX0hEX0NBUFMgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiAxMDBYICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBYX0ZEX0NBUFMgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiAxMDBYICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBUNF9DQVBTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiAxMDBUNCBDYXBhYmxlICovCisKKy8qIExpbmsgcGFydG5lciBhYmlsaXR5IHJlZ2lzdGVyLiAqLworI2RlZmluZSBNSUlfTFBBX1NMQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxZiAgLyogU2FtZSBhcyBhZHZlcnRpc2Ugc2VsZWN0b3IgICovCisjZGVmaW5lIE1JSV9MUEFfMTBIQUxGICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBDYW4gZG8gMTBtYnBzIGhhbGYtZHVwbGV4ICAgKi8KKyNkZWZpbmUgTUlJX0xQQV8xMEZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIENhbiBkbyAxMG1icHMgZnVsbC1kdXBsZXggICAqLworI2RlZmluZSBNSUlfTFBBXzEwMEhBTEYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQ2FuIGRvIDEwMG1icHMgaGFsZi1kdXBsZXggICovCisjZGVmaW5lIE1JSV9MUEFfMTAwRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBDYW4gZG8gMTAwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgTUlJX0xQQV8xMDBCQVNFNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIDEwMEJBU0UtVDQgICovCisjZGVmaW5lIE1JSV9MUEFfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBQQVVTRSAqLworI2RlZmluZSBNSUlfTFBBX0FTWVBBVVNFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogQXN5bW1ldHJpY2FsIFBBVVNFICovCisjZGVmaW5lIE1JSV9MUEFfUkZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBMaW5rIHBhcnRuZXIgZmF1bHRlZCAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0xQQV9MUEFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIExpbmsgcGFydG5lciBhY2tlZCB1cyAgICAgICAqLworI2RlZmluZSBNSUlfTFBBX05QQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTmV4dCBwYWdlIGJpdCAgICAgICAgICAgICAgICovCisKKy8qIEF1dG9uZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVJfU0VMRUNUT1JfRklFTEQgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBpbmRpY2F0ZXMgSUVFRSA4MDIuMyBDU01BL0NEICovCisjZGVmaW5lIE1JSV9BUl8xMFRfSERfQ0FQUyAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FSXzEwVF9GRF9DQVBTICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVJfMTAwVFhfSERfQ0FQUyAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9BUl8xMDBUWF9GRF9DQVBTICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIDEwMFRYIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FSXzEwMFQ0X0NBUFMgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogMTAwVDQgQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVJfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLworI2RlZmluZSBNSUlfQVJfQVNNX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBBc3ltbWV0cmljIFBhdXNlIERpcmVjdGlvbiBiaXQgKi8KKyNkZWZpbmUgTUlJX0FSX1JFTU9URV9GQVVMVCAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogUmVtb3RlIEZhdWx0IGRldGVjdGVkICovCisjZGVmaW5lIE1JSV9BUl9ORVhUX1BBR0UgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIE5leHQgUGFnZSBhYmlsaXR5IHN1cHBvcnRlZCAqLworI2RlZmluZSBNSUlfQVJfU1BFRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMUUwCisjZGVmaW5lIE1JSV9BUl9ERUZBVUxUX0NBUF9NQVNLICAgICAgICAgICAgICAgICAweDBERTAKKworLyogMTAwMEJBU0UtVCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9IRF9DQVBTICAgICAgICAgICAgICAweDAxMDAgIC8qIEFkdmVydGlzZSAxMDAwVCBIRCBjYXBhYmlsaXR5ICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9GRF9DQVBTICAgICAgICAgICAgICAweDAyMDAgIC8qIEFkdmVydGlzZSAxMDAwVCBGRCBjYXBhYmlsaXR5ICAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfUkVQRUFURVJfRFRFICAgICAgICAgMHgwNDAwICAvKiAxPVJlcGVhdGVyL3N3aXRjaCBkZXZpY2UgcG9ydCAqLworLyogMD1EVEUgZGV2aWNlICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9NU19WQUxVRSAgICAgICAgICAgICAweDA4MDAgIC8qIDE9Q29uZmlndXJlIFBIWSBhcyBNYXN0ZXIgKi8KKy8qIDA9Q29uZmlndXJlIFBIWSBhcyBTbGF2ZSAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfTVNfRU5BQkxFICAgICAgICAgICAgMHgxMDAwICAvKiAxPU1hc3Rlci9TbGF2ZSBtYW51YWwgY29uZmlnIHZhbHVlICovCisvKiAwPUF1dG9tYXRpYyBNYXN0ZXIvU2xhdmUgY29uZmlnICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9URVNUX01PREVfTk9STUFMICAgICAweDAwMDAgIC8qIE5vcm1hbCBPcGVyYXRpb24gKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX1RFU1RfTU9ERV8xICAgICAgICAgIDB4MjAwMCAgLyogVHJhbnNtaXQgV2F2ZWZvcm0gdGVzdCAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfVEVTVF9NT0RFXzIgICAgICAgICAgMHg0MDAwICAvKiBNYXN0ZXIgVHJhbnNtaXQgSml0dGVyIHRlc3QgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX1RFU1RfTU9ERV8zICAgICAgICAgIDB4NjAwMCAgLyogU2xhdmUgVHJhbnNtaXQgSml0dGVyIHRlc3QgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX1RFU1RfTU9ERV80ICAgICAgICAgIDB4ODAwMCAgLyogVHJhbnNtaXR0ZXIgRGlzdG9ydGlvbiB0ZXN0ICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9TUEVFRF9NQVNLICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX0RFRkFVTFRfQ0FQX01BU0sgICAgIDB4MDMwMAorCisvKiAxMDAwQkFTRS1UIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVQwMDFfU1JfMTAwMFRfTFBfSERfQ0FQUyAgICAgICAgICAgMHgwNDAwICAvKiBMUCBpcyAxMDAwVCBIRCBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9BVDAwMV9TUl8xMDAwVF9MUF9GRF9DQVBTICAgICAgICAgICAweDA4MDAgIC8qIExQIGlzIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1NSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVMgICAgIDB4MTAwMCAgLyogUmVtb3RlIHJlY2VpdmVyIE9LICovCisjZGVmaW5lIE1JSV9BVDAwMV9TUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVMgICAgICAweDIwMDAgIC8qIExvY2FsIHJlY2VpdmVyIE9LICovCisjZGVmaW5lIE1JSV9BVDAwMV9TUl8xMDAwVF9NU19DT05GSUdfUkVTICAgICAgICAweDQwMDAgIC8qIDE9TG9jYWwgVFggaXMgTWFzdGVyLCAwPVNsYXZlICovCisjZGVmaW5lIE1JSV9BVDAwMV9TUl8xMDAwVF9NU19DT05GSUdfRkFVTFQgICAgICAweDgwMDAgIC8qIE1hc3Rlci9TbGF2ZSBjb25maWcgZmF1bHQgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1NSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVNfU0hJRlQgICAxMgorI2RlZmluZSBNSUlfQVQwMDFfU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTX1NISUZUICAgIDEzCisKKy8qIEV4dGVuZGVkIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVQwMDFfRVNSXzEwMDBUX0hEX0NBUFMgICAgICAgICAgICAgMHgxMDAwICAvKiAxMDAwVCBIRCBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9BVDAwMV9FU1JfMTAwMFRfRkRfQ0FQUyAgICAgICAgICAgICAweDIwMDAgIC8qIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0VTUl8xMDAwWF9IRF9DQVBTICAgICAgICAgICAgIDB4NDAwMCAgLyogMTAwMFggSEQgY2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVQwMDFfRVNSXzEwMDBYX0ZEX0NBUFMgICAgICAgICAgICAgMHg4MDAwICAvKiAxMDAwWCBGRCBjYXBhYmxlICovCisKKy8qIEFUMDAxIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX0pBQkJFUl9ESVNBQkxFICAgICAgICAgICAweDAwMDEgIC8qIDE9SmFiYmVyIEZ1bmN0aW9uIGRpc2FibGVkICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMICAgICAgICAweDAwMDIgIC8qIDE9UG9sYXJpdHkgUmV2ZXJzYWwgZW5hYmxlZCAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9TUUVfVEVTVCAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiAxPVNRRSBUZXN0IGVuYWJsZWQgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfTUFDX1BPV0VSRE9XTiAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9DTEsxMjVfRElTQUJMRSAgICAgICAgICAgMHgwMDEwICAvKiAxPUNMSzEyNSBsb3csCisJCQkJCQkJICogMD1DTEsxMjUgdG9nZ2xpbmcKKwkJCQkJCQkgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfTURJX01BTlVBTF9NT0RFICAgICAgICAgIDB4MDAwMCAgLyogTURJIENyb3Nzb3ZlciBNb2RlIGJpdHMgNjo1ICovCisvKiBNYW51YWwgTURJIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfTURJWF9NQU5VQUxfTU9ERSAgICAgICAgIDB4MDAyMCAgLyogTWFudWFsIE1ESVggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9BVVRPX1hfMTAwMFQgICAgICAgICAgICAgMHgwMDQwICAvKiAxMDAwQkFTRS1UOiBBdXRvIGNyb3Nzb3ZlciwKKwkJCQkJCQkgKiAgMTAwQkFTRS1UWC8xMEJBU0UtVDoKKwkJCQkJCQkgKiAgTURJIE1vZGUKKwkJCQkJCQkgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfQVVUT19YX01PREUgICAgICAgICAgICAgIDB4MDA2MCAgLyogQXV0byBjcm9zc292ZXIgZW5hYmxlZAorCQkJCQkJCSAqIGFsbCBzcGVlZHMuCisJCQkJCQkJICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFICAgICAweDAwODAKKy8qIDE9RW5hYmxlIEV4dGVuZGVkIDEwQkFTRS1UIGRpc3RhbmNlCisgKiAoTG93ZXIgMTBCQVNFLVQgUlggVGhyZXNob2xkKQorICogMD1Ob3JtYWwgMTBCQVNFLVQgUlggVGhyZXNob2xkICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX01JSV81QklUX0VOQUJMRSAgICAgICAgICAweDAxMDAKKy8qIDE9NS1CaXQgaW50ZXJmYWNlIGluIDEwMEJBU0UtVFgKKyAqIDA9TUlJIGludGVyZmFjZSBpbiAxMDBCQVNFLVRYICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX1NDUkFNQkxFUl9ESVNBQkxFICAgICAgICAweDAyMDAgIC8qIDE9U2NyYW1ibGVyIGRpc2FibGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfRk9SQ0VfTElOS19HT09EICAgICAgICAgIDB4MDQwMCAgLyogMT1Gb3JjZSBsaW5rIGdvb2QgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfQVNTRVJUX0NSU19PTl9UWCAgICAgICAgIDB4MDgwMCAgLyogMT1Bc3NlcnQgQ1JTIG9uIFRyYW5zbWl0ICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMX1NISUZUICAgIDEKKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfQVVUT19YX01PREVfU0hJRlQgICAgICAgICAgNQorI2RlZmluZSBNSUlfQVQwMDFfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRV9TSElGVCA3CisvKiBBVDAwMSBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU1NSX1NQRF9EUExYX1JFU09MVkVEICAgICAgICAweDA4MDAgIC8qIDE9U3BlZWQgJiBEdXBsZXggcmVzb2x2ZWQgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTU1JfRFBMWCAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogMT1EdXBsZXggMD1IYWxmIER1cGxleCAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNTUl9TUEVFRCAgICAgICAgICAgICAgICAgICAgMHhDMDAwICAvKiBTcGVlZCwgYml0cyAxNDoxNSAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNTUl8xME1CUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwICAvKiAwMD0xME1icyAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNTUl8xMDBNQlMgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiAwMT0xMDBNYnMgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTU1JfMTAwME1CUyAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogMTA9MTAwME1icyAqLworCisKKyNlbmRpZiAvKiBfQVRMMV9FX0hfICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9iNDQuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2I0NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OGIzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9iNDQuYwpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gSGFqbm9jemkgPHN0ZWZhbmhhQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBQYW50ZWxpcyBLb3Vrb3Vzb3VsYXMgPHBrdG9zc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGEgcG9ydCBvZiB0aGUgYjQ0IGxpbnV4IGRyaXZlciB2ZXJzaW9uIDEuMDEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPgorICogQ29weXJpZ2h0IChjKSBQZWtrYSBQaWV0aWthaW5lbiA8cHBAZWUub3VsdS5maT4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBTb21lIHNzYiBiaXRzIGNvcGllZCBmcm9tIHZlcnNpb24gMi4wIG9mIHRoZSBiNDQgZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIE1pY2hhZWwgQnVlc2NoCisgKgorICogQ29weXJpZ2h0IChjKSBhIGxvdCBvZiBwZW9wbGUgdG9vLiBQbGVhc2UgcmVzcGVjdCB0aGVpciB3b3JrLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxtaWkuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL21lbW1hcC5oPgorI2luY2x1ZGUgImI0NC5oIgorCisKK3N0YXRpYyBpbmxpbmUgaW50IHJpbmdfbmV4dChpbnQgaW5kZXgpCit7CisJLyogQjQ0X1JJTkdfU0laRSBpcyBhIHBvd2VyIG9mIDIgOikgKi8KKwlyZXR1cm4gKGluZGV4ICsgMSkgJiAoQjQ0X1JJTkdfU0laRSAtIDEpOworfQorCisKKy8qIE1lbW9yeS1tYXBwZWQgSS9PIHdyYXBwZXJzICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIGJyMzIoY29uc3Qgc3RydWN0IGI0NF9wcml2YXRlICpicCwgdTMyIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoYnAtPnJlZ3MgKyByZWcpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidzMyKGNvbnN0IHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgYnAtPnJlZ3MgKyByZWcpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZmx1c2goY29uc3Qgc3RydWN0IGI0NF9wcml2YXRlICpicCwgdTMyIHJlZywgdTMyIHRpbWVvdXQpCit7CisJcmVhZGwoYnAtPnJlZ3MgKyByZWcpOworCXVkZWxheSh0aW1lb3V0KTsKK30KKworCisjZGVmaW5lIFZJUlRfVE9fQjQ0KGFkZHIpCSggdmlydF90b19idXMoYWRkcikgKyBTQl9QQ0lfRE1BICkKKworCisvKioKKyAqIFJldHVybiBub24temVybyBpZiB0aGUgaW5zdGFsbGVkIFJBTSBpcyB3aXRoaW4KKyAqIHRoZSBsaW1pdCBnaXZlbiBhbmQgemVybyBpZiBpdCBpcyBvdXRzaWRlLgorICogSG9wZWZ1bGx5IHdpbGwgYmUgcmVtb3ZlZCBzb29uLgorICovCitpbnQgcGh5c19yYW1fd2l0aGluX2xpbWl0KHU2NCBsaW1pdCkKK3sKKwlzdHJ1Y3QgbWVtb3J5X21hcCBtZW1tYXA7CisJc3RydWN0IG1lbW9yeV9yZWdpb24gKmhpZ2hlc3QgPSBOVUxMOworCWdldF9tZW1tYXAoJm1lbW1hcCk7CisKKwloaWdoZXN0ID0gJm1lbW1hcC5yZWdpb25zW21lbW1hcC5jb3VudCAtIDFdOworCisJcmV0dXJuIChoaWdoZXN0LT5lbmQgPCBsaW1pdCk7Cit9CisKKworLyoqCisgKiBSaW5nIGNlbGxzIHdhaXRpbmcgdG8gYmUgcHJvY2Vzc2VkIGFyZSBiZXR3ZWVuICd0eF9jdXInIGFuZCAncGVuZGluZycKKyAqIGluZGV4ZXMgaW4gdGhlIHJpbmcuCisgKi8KK3N0YXRpYyB1MzIgcGVuZGluZ190eF9pbmRleChzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwKQoreworCXUzMiBwZW5kaW5nID0gYnIzMihicCwgQjQ0X0RNQVRYX1NUQVQpOworCXBlbmRpbmcgJj0gRE1BVFhfU1RBVF9DRE1BU0s7CisKKwlwZW5kaW5nIC89IHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpOworCXJldHVybiBwZW5kaW5nICYgKEI0NF9SSU5HX1NJWkUgLSAxKTsKK30KKworCisvKioKKyAqIFJpbmcgY2VsbHMgd2FpdGluZyB0byBiZSBwcm9jZXNzZWQgYXJlIGJldHdlZW4gJ3J4X2N1cicgYW5kICdwZW5kaW5nJworICogaW5kZXhlcyBpbiB0aGUgcmluZy4KKyAqLworc3RhdGljIHUzMiBwZW5kaW5nX3J4X2luZGV4KHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnApCit7CisJdTMyIHBlbmRpbmcgPSBicjMyKGJwLCBCNDRfRE1BUlhfU1RBVCk7CisJcGVuZGluZyAmPSBETUFSWF9TVEFUX0NETUFTSzsKKworCXBlbmRpbmcgLz0gc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYyk7CisJcmV0dXJuIHBlbmRpbmcgJiAoQjQ0X1JJTkdfU0laRSAtIDEpOworfQorCisKKy8qKgorICogV2FpdCB1bnRpbCB0aGUgZ2l2ZW4gYml0IGlzIHNldC9jbGVhcmVkLgorICovCitzdGF0aWMgaW50IGI0NF93YWl0X2JpdChzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwLCB1bnNpZ25lZCBsb25nIHJlZywgdTMyIGJpdCwKKwkJCSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCwgY29uc3QgaW50IGNsZWFyKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKKwkJdTMyIHZhbCA9IGJyMzIoYnAsIHJlZyk7CisKKwkJaWYgKGNsZWFyICYmICEodmFsICYgYml0KSkKKwkJCWJyZWFrOworCisJCWlmICghY2xlYXIgJiYgKHZhbCAmIGJpdCkpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA9PSB0aW1lb3V0KSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogU29uaWNzIFNpbGljb24gQmFja3BsYW5lIHN1cHBvcnQuIFNTQiBpcyBhIG1pbmktYnVzIGludGVyY29ubmVjdGluZworICogc28tY2FsbGVkIElQIENvcmVzLiBPbmUgb2YgdGhvc2UgY29yZXMgaW1wbGVtZW50cyB0aGUgRmFzdCBFdGhlcm5ldAorICogZnVuY3Rpb25hbGl0eSBhbmQgYW5vdGhlciBvbmUgdGhlIFBDSSBlbmdpbmUuCisgKgorICogWW91IG5lZWQgdG8gc3dpdGNoIHRvIHRoZSBjb3JlIHlvdSB3YW50IHRvIHRhbGsgdG8gYmVmb3JlIGFjdHVhbGx5CisgKiBzZW5kaW5nIGNvbW1hbmRzLgorICoKKyAqIFNlZTogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0L0JhY2twbGFuZSBmb3IgKHJldmVyc2UtZW5naW5lZXJlZCkKKyAqIHNwZWNzLgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIHNzYl9nZXRfY29yZV9yZXYoc3RydWN0IGI0NF9wcml2YXRlICpicCkKK3sKKwlyZXR1cm4gKGJyMzIoYnAsIEI0NF9TQklESElHSCkgJiBTQklESElHSF9SQ19NQVNLKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBzc2JfaXNfY29yZV91cChzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwKQoreworCXJldHVybiAoKGJyMzIoYnAsIEI0NF9TQlRNU0xPVykgJiAoU1NCX0NPUkVfRE9XTiB8IFNCVE1TTE9XX0NMT0NLKSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBTQlRNU0xPV19DTE9DSyk7Cit9CisKKworc3RhdGljIHUzMiBzc2JfcGNpX3NldHVwKHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAsIHUzMiBjb3JlcykKK3sKKwl1MzIgYmFyX29yaWcsIHBjaV9yZXYsIHZhbDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicC0+cGNpLCBTU0JfQkFSMF9XSU4sICZiYXJfb3JpZyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicC0+cGNpLCBTU0JfQkFSMF9XSU4sCisJICAgICAgICAgICAgICAgICAgICAgICBCQ000NDAwX1BDSV9DT1JFX0FERFIpOworCXBjaV9yZXYgPSBzc2JfZ2V0X2NvcmVfcmV2KGJwKTsKKworCXZhbCA9IGJyMzIoYnAsIEI0NF9TQklOVFZFQyk7CisJdmFsIHw9IGNvcmVzOworCWJ3MzIoYnAsIEI0NF9TQklOVFZFQywgdmFsKTsKKworCXZhbCA9IGJyMzIoYnAsIFNTQl9QQ0lfVFJBTlNfMik7CisJdmFsIHw9IFNTQl9QQ0lfUFJFRiB8IFNTQl9QQ0lfQlVSU1Q7CisJYnczMihicCwgU1NCX1BDSV9UUkFOU18yLCB2YWwpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicC0+cGNpLCBTU0JfQkFSMF9XSU4sIGJhcl9vcmlnKTsKKworCXJldHVybiBwY2lfcmV2OworfQorCisKK3N0YXRpYyB2b2lkIHNzYl9jb3JlX2Rpc2FibGUoc3RydWN0IGI0NF9wcml2YXRlICpicCkKK3sKKwlpZiAoYnIzMihicCwgQjQ0X1NCVE1TTE9XKSAmIFNCVE1TTE9XX1JFU0VUKQorCQlyZXR1cm47CisKKwlidzMyKGJwLCBCNDRfU0JUTVNMT1csIChTQlRNU0xPV19SRUpFQ1QgfCBTQlRNU0xPV19DTE9DSykpOworCWI0NF93YWl0X2JpdChicCwgQjQ0X1NCVE1TTE9XLCBTQlRNU0xPV19SRUpFQ1QsIDEwMDAwMCwgMCk7CisJYjQ0X3dhaXRfYml0KGJwLCBCNDRfU0JUTVNISUdILCBTQlRNU0hJR0hfQlVTWSwgMTAwMDAwLCAxKTsKKworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgKFNCVE1TTE9XX0ZHQyB8IFNCVE1TTE9XX0NMT0NLIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NCX0NPUkVfRE9XTikpOworCWJmbHVzaChicCwgQjQ0X1NCVE1TTE9XLCAxKTsKKworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgU1NCX0NPUkVfRE9XTik7CisJYmZsdXNoKGJwLCBCNDRfU0JUTVNMT1csIDEpOworfQorCisKK3N0YXRpYyB2b2lkIHNzYl9jb3JlX3Jlc2V0KHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnApCit7CisJdTMyIHZhbDsKKwljb25zdCB1MzIgbWFzayA9IChTQlRNU0xPV19DTE9DSyB8IFNCVE1TTE9XX0ZHQyB8IFNCVE1TTE9XX1JFU0VUKTsKKworCXNzYl9jb3JlX2Rpc2FibGUoYnApOworCisJYnczMihicCwgQjQ0X1NCVE1TTE9XLCBtYXNrKTsKKwliZmx1c2goYnAsIEI0NF9TQlRNU0xPVywgMSk7CisKKwkvKiBDbGVhciBTRVJSIGlmIHNldCwgdGhpcyBpcyBhIGh3IGJ1ZyB3b3JrYXJvdW5kLiAgKi8KKwlpZiAoYnIzMihicCwgQjQ0X1NCVE1TSElHSCkgJiBTQlRNU0hJR0hfU0VSUikKKwkJYnczMihicCwgQjQ0X1NCVE1TSElHSCwgMCk7CisKKwl2YWwgPSBicjMyKGJwLCBCNDRfU0JJTVNUQVRFKTsKKwlpZiAodmFsICYgKFNCSU1TVEFURV9CQUQpKSB7CisJCWJ3MzIoYnAsIEI0NF9TQklNU1RBVEUsIHZhbCAmIH5TQklNU1RBVEVfQkFEKTsKKwl9CisKKwlidzMyKGJwLCBCNDRfU0JUTVNMT1csIChTQlRNU0xPV19DTE9DSyB8IFNCVE1TTE9XX0ZHQykpOworCWJmbHVzaChicCwgQjQ0X1NCVE1TTE9XLCAxKTsKKworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgKFNCVE1TTE9XX0NMT0NLKSk7CisJYmZsdXNoKGJwLCBCNDRfU0JUTVNMT1csIDEpOworfQorCisKKy8qCisgKiBEcml2ZXIgaGVscGVyIGZ1bmN0aW9ucworICovCisKKy8qCisgKiBDaGlwIHJlc2V0IHByb3ZpZGVzIHBvd2VyIHRvIHRoZSBiNDQgTUFDICYgUENJIGNvcmVzLCB3aGljaAorICogaXMgbmVjZXNzYXJ5IGZvciBNQUMgcmVnaXN0ZXIgYWNjZXNzLiBXZSBvbmx5IGRvIGEgcGFydGlhbAorICogcmVzZXQgaW4gY2FzZSBvZiB0cmFuc21pdC9yZWNlaXZlIGVycm9ycyAoSVNUQVRfRVJST1JTKSB0bworICogYXZvaWQgdGhlIGNoaXAgYmVpbmcgaHVuZyBmb3IgYW4gdW5uZWNlc3NhcnkgbG9uZyB0aW1lIGluCisgKiB0aGlzIGNhc2UuCisgKgorICogQ2FsbGVkLWJ5OiBiNDRfY2xvc2UsIGI0NF9oYWx0LCBiNDRfaW5pdGh3KGI0NF9vcGVuKSwgYjQ0X3Byb2JlCisgKi8KK3N0YXRpYyB2b2lkIGI0NF9jaGlwX3Jlc2V0KHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAsIGludCByZXNldF9raW5kKQoreworCWlmIChzc2JfaXNfY29yZV91cChicCkpIHsKKwkJYnczMihicCwgQjQ0X1JDVl9MQVpZLCAwKTsKKworCQlidzMyKGJwLCBCNDRfRU5FVF9DVFJMLCBFTkVUX0NUUkxfRElTQUJMRSk7CisKKwkJYjQ0X3dhaXRfYml0KGJwLCBCNDRfRU5FVF9DVFJMLCBFTkVUX0NUUkxfRElTQUJMRSwgMjAwLCAxKTsKKworCQlidzMyKGJwLCBCNDRfRE1BVFhfQ1RSTCwgMCk7CisKKwkJYnAtPnR4X2RpcnR5ID0gYnAtPnR4X2N1ciA9IDA7CisKKwkJaWYgKGJyMzIoYnAsIEI0NF9ETUFSWF9TVEFUKSAmIERNQVJYX1NUQVRfRU1BU0spCisJCQliNDRfd2FpdF9iaXQoYnAsIEI0NF9ETUFSWF9TVEFULCBETUFSWF9TVEFUX1NJRExFLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAwKTsKKworCQlidzMyKGJwLCBCNDRfRE1BUlhfQ1RSTCwgMCk7CisKKwkJYnAtPnJ4X2N1ciA9IDA7CisJfSBlbHNlIHsKKwkJc3NiX3BjaV9zZXR1cChicCwgU0JJTlRWRUNfRU5FVDApOworCX0KKworCXNzYl9jb3JlX3Jlc2V0KGJwKTsKKworCS8qIERvbid0IGVuYWJsZSBQSFkgaWYgd2UgYXJlIG9ubHkgZG9pbmcgYSBwYXJ0aWFsIHJlc2V0LiAqLworCWlmIChyZXNldF9raW5kID09IEI0NF9DSElQX1JFU0VUX1BBUlRJQUwpCisJCXJldHVybjsKKworCS8qIE1ha2UgUEhZIGFjY2Vzc2libGUuICovCisJYnczMihicCwgQjQ0X01ESU9fQ1RSTCwKKwkgICAgIChNRElPX0NUUkxfUFJFQU1CTEUgfCAoMHgwZCAmIE1ESU9fQ1RSTF9NQVhGX01BU0spKSk7CisJYmZsdXNoKGJwLCBCNDRfTURJT19DVFJMLCAxKTsKKworCS8qIEVuYWJsZSBpbnRlcm5hbCBvciBleHRlcm5hbCBQSFkgKi8KKwlpZiAoIShicjMyKGJwLCBCNDRfREVWQ1RSTCkgJiBERVZDVFJMX0lQUCkpIHsKKwkJYnczMihicCwgQjQ0X0VORVRfQ1RSTCwgRU5FVF9DVFJMX0VQU0VMKTsKKwkJYmZsdXNoKGJwLCBCNDRfRU5FVF9DVFJMLCAxKTsKKwl9IGVsc2UgeworCQl1MzIgdmFsID0gYnIzMihicCwgQjQ0X0RFVkNUUkwpOworCQlpZiAodmFsICYgREVWQ1RSTF9FUFIpIHsKKwkJCWJ3MzIoYnAsIEI0NF9ERVZDVFJMLCAodmFsICYgfkRFVkNUUkxfRVBSKSk7CisJCQliZmx1c2goYnAsIEI0NF9ERVZDVFJMLCAxMDApOworCQl9CisJfQorfQorCisKKy8qKgorICogY2FsbGVkIGJ5IGI0NF9wb2xsIGluIHRoZSBlcnJvciBwYXRoCisgKi8KK3N0YXRpYyB2b2lkIGI0NF9oYWx0KHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnApCit7CisJLyogZGlzYWJsZSBpbnRzICovCisJYnczMihicCwgQjQ0X0lNQVNLLCAwKTsKKwliZmx1c2goYnAsIEI0NF9JTUFTSywgMSk7CisKKwlEQkcoImI0NDogcG93ZXJpbmcgZG93biBQSFlcbiIpOworCWJ3MzIoYnAsIEI0NF9NQUNfQ1RSTCwgTUFDX0NUUkxfUEhZX1BET1dOKTsKKworCS8qCisJICogTm93IHJlc2V0IHRoZSBjaGlwLCBidXQgd2l0aG91dCBlbmFibGluZworCSAqIHRoZSBNQUMmUEhZIHBhcnQgb2YgaXQuCisJICogVGhpcyBoYXMgdG8gYmUgZG9uZSBfYWZ0ZXJfIHdlIHNodXQgZG93biB0aGUgUEhZCisJICovCisJYjQ0X2NoaXBfcmVzZXQoYnAsIEI0NF9DSElQX1JFU0VUX1BBUlRJQUwpOworfQorCisKKworLyoKKyAqIENhbGxlZCBhdCBkZXZpY2Ugb3BlbiB0aW1lIHRvIGdldCB0aGUgY2hpcCByZWFkeSBmb3IKKyAqIHBhY2tldCBwcm9jZXNzaW5nLgorICoKKyAqIENhbGxlZC1ieTogYjQ0X29wZW4KKyAqLworc3RhdGljIHZvaWQgYjQ0X2luaXRfaHcoc3RydWN0IGI0NF9wcml2YXRlICpicCwgaW50IHJlc2V0X2tpbmQpCit7CisJdTMyIHZhbDsKKyNkZWZpbmUgQ1RSTF9NQVNLIChETUFSWF9DVFJMX0VOQUJMRSB8IChSWF9QS1RfT0ZGU0VUIDw8IERNQVJYX0NUUkxfUk9TSElGVCkpCisKKwliNDRfY2hpcF9yZXNldChicCwgQjQ0X0NISVBfUkVTRVRfRlVMTCk7CisJaWYgKHJlc2V0X2tpbmQgPT0gQjQ0X0ZVTExfUkVTRVQpIHsKKwkJYjQ0X3BoeV9yZXNldChicCk7CisJfQorCisJLyogRW5hYmxlIENSQzMyLCBzZXQgcHJvcGVyIExFRCBtb2RlcyBhbmQgcG93ZXIgb24gUEhZICovCisJYnczMihicCwgQjQ0X01BQ19DVFJMLCBNQUNfQ1RSTF9DUkMzMl9FTkFCIHwgTUFDX0NUUkxfUEhZX0xFRENUUkwpOworCWJ3MzIoYnAsIEI0NF9SQ1ZfTEFaWSwgKDEgPDwgUkNWX0xBWllfRkNfU0hJRlQpKTsKKworCS8qIFRoaXMgc2V0cyB0aGUgTUFDIGFkZHJlc3MgdG9vLiAgKi8KKwliNDRfc2V0X3J4X21vZGUoYnAtPm5ldGRldik7CisKKwkvKiBNVFUgKyBldGggaGVhZGVyICsgcG9zc2libGUgVkxBTiB0YWcgKyBzdHJ1Y3QgcnhfaGVhZGVyICovCisJYnczMihicCwgQjQ0X1JYTUFYTEVOLCBCNDRfTUFYX01UVSArIEVUSF9ITEVOICsgOCArIFJYX0hFQURFUl9MRU4pOworCWJ3MzIoYnAsIEI0NF9UWE1BWExFTiwgQjQ0X01BWF9NVFUgKyBFVEhfSExFTiArIDggKyBSWF9IRUFERVJfTEVOKTsKKworCWJ3MzIoYnAsIEI0NF9UWF9ISVdNQVJLLCBUWF9ISVdNQVJLX0RFRkxUKTsKKwlpZiAocmVzZXRfa2luZCA9PSBCNDRfUEFSVElBTF9SRVNFVCkgeworCQlidzMyKGJwLCBCNDRfRE1BUlhfQ1RSTCwgQ1RSTF9NQVNLKTsKKwl9IGVsc2UgeworCQlidzMyKGJwLCBCNDRfRE1BVFhfQ1RSTCwgRE1BVFhfQ1RSTF9FTkFCTEUpOworCQlidzMyKGJwLCBCNDRfRE1BVFhfQUREUiwgVklSVF9UT19CNDQoYnAtPnR4KSk7CisKKwkJYnczMihicCwgQjQ0X0RNQVJYX0NUUkwsIENUUkxfTUFTSyk7CisJCWJ3MzIoYnAsIEI0NF9ETUFSWF9BRERSLCBWSVJUX1RPX0I0NChicC0+cngpKTsKKwkJYnczMihicCwgQjQ0X0RNQVJYX1BUUiwgQjQ0X1JYX1JJTkdfTEVOX0JZVEVTKTsKKworCQlidzMyKGJwLCBCNDRfTUlCX0NUUkwsIE1JQl9DVFJMX0NMUl9PTl9SRUFEKTsKKwl9CisKKwl2YWwgPSBicjMyKGJwLCBCNDRfRU5FVF9DVFJMKTsKKwlidzMyKGJwLCBCNDRfRU5FVF9DVFJMLCAodmFsIHwgRU5FVF9DVFJMX0VOQUJMRSkpOworI3VuZGVmIENUUkxfTUFTSworfQorCisKKy8qKiogIE1hbmFnZW1lbnQgb2YgcmluZyBkZXNjcmlwdG9ycyAgKioqLworCisKK3N0YXRpYyB2b2lkIGI0NF9wb3B1bGF0ZV9yeF9kZXNjcmlwdG9yKHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAsIHUzMiBpZHgpCit7CisJc3RydWN0IHJ4X2hlYWRlciAqcmg7CisJdTMyIGN0cmwsIGFkZHI7CisKKwlyaCA9IGJwLT5yeF9pb2J1ZltpZHhdLT5kYXRhOworCXJoLT5sZW4gPSAwOworCXJoLT5mbGFncyA9IDA7CisJY3RybCA9IERFU0NfQ1RSTF9MRU4gJiAoUlhfUEtUX0JVRl9TWiAtIFJYX1BLVF9PRkZTRVQpOworCWlmIChpZHggPT0gQjQ0X1JJTkdfTEFTVCkgeworCQljdHJsIHw9IERFU0NfQ1RSTF9FT1Q7CisJfQorCWFkZHIgPSBWSVJUX1RPX0I0NChicC0+cnhfaW9idWZbaWR4XS0+ZGF0YSk7CisKKwlicC0+cnhbaWR4XS5jdHJsID0gY3B1X3RvX2xlMzIoY3RybCk7CisJYnAtPnJ4W2lkeF0uYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCWJ3MzIoYnAsIEI0NF9ETUFSWF9QVFIsIGlkeCAqIHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpKTsKK30KKworCisvKgorICogUmVmaWxsIFJYIHJpbmcgZGVzY3JpcHRvcnMgd2l0aCBidWZmZXJzLiBUaGlzIGlzIG5lZWRlZAorICogYmVjYXVzZSBkdXJpbmcgcnggd2UgYXJlIHBhc3Npbmcgb3duZXJzaGlwIG9mIGRlc2NyaXB0b3IKKyAqIGJ1ZmZlcnMgdG8gdGhlIG5ldHdvcmsgc3RhY2suCisgKi8KK3N0YXRpYyB2b2lkIGI0NF9yeF9yZWZpbGwoc3RydWN0IGI0NF9wcml2YXRlICpicCwgdTMyIHBlbmRpbmcpCit7CisJdTMyIGk7CisKKwkvLyBza2lwIHBlbmRpbmcKKwlmb3IgKGkgPSBwZW5kaW5nICsgMTsgaSAhPSBicC0+cnhfY3VyOyBpID0gcmluZ19uZXh0KGkpKSB7CisJCWlmIChicC0+cnhfaW9idWZbaV0gIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWJwLT5yeF9pb2J1ZltpXSA9IGFsbG9jX2lvYihSWF9QS1RfQlVGX1NaKTsKKwkJaWYgKCFicC0+cnhfaW9idWZbaV0pIHsKKwkJCURCRygiUmVmaWxsIHJ4IHJpbmcgZmFpbGVkISFcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQliNDRfcG9wdWxhdGVfcnhfZGVzY3JpcHRvcihicCwgaSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGI0NF9mcmVlX3J4X3Jpbmcoc3RydWN0IGI0NF9wcml2YXRlICpicCkKK3sKKwl1MzIgaTsKKworCWlmIChicC0+cngpIHsKKwkJZm9yIChpID0gMDsgaSA8IEI0NF9SSU5HX1NJWkU7IGkrKykgeworCQkJZnJlZV9pb2IoYnAtPnJ4X2lvYnVmW2ldKTsKKwkJCWJwLT5yeF9pb2J1ZltpXSA9IE5VTEw7CisJCX0KKwkJZnJlZV9kbWEoYnAtPnJ4LCBCNDRfUlhfUklOR19MRU5fQllURVMpOworCQlicC0+cnggPSBOVUxMOworCX0KK30KKworCitzdGF0aWMgaW50IGI0NF9pbml0X3J4X3Jpbmcoc3RydWN0IGI0NF9wcml2YXRlICpicCkKK3sKKwliNDRfZnJlZV9yeF9yaW5nKGJwKTsKKworCWJwLT5yeCA9IG1hbGxvY19kbWEoQjQ0X1JYX1JJTkdfTEVOX0JZVEVTLCBCNDRfRE1BX0FMSUdOTUVOVCk7CisJaWYgKCFicC0+cngpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGJwLT5yeF9pb2J1ZiwgMCwgc2l6ZW9mKGJwLT5yeF9pb2J1ZikpOworCisJYnAtPnJ4X2lvYnVmWzBdID0gYWxsb2NfaW9iKFJYX1BLVF9CVUZfU1opOworCWI0NF9wb3B1bGF0ZV9yeF9kZXNjcmlwdG9yKGJwLCAwKTsKKwliNDRfcnhfcmVmaWxsKGJwLCAwKTsKKworCURCRygiSW5pdCBSWCByaW5nczogcng9MHglMDhseFxuIiwgVklSVF9UT19CNDQoYnAtPnJ4KSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYjQ0X2ZyZWVfdHhfcmluZyhzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwKQoreworCWlmIChicC0+dHgpIHsKKwkJZnJlZV9kbWEoYnAtPnR4LCBCNDRfVFhfUklOR19MRU5fQllURVMpOworCQlicC0+dHggPSBOVUxMOworCX0KK30KKworCitzdGF0aWMgaW50IGI0NF9pbml0X3R4X3Jpbmcoc3RydWN0IGI0NF9wcml2YXRlICpicCkKK3sKKwliNDRfZnJlZV90eF9yaW5nKGJwKTsKKworCWJwLT50eCA9IG1hbGxvY19kbWEoQjQ0X1RYX1JJTkdfTEVOX0JZVEVTLCBCNDRfRE1BX0FMSUdOTUVOVCk7CisJaWYgKCFicC0+dHgpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGJwLT50eCwgMCwgQjQ0X1RYX1JJTkdfTEVOX0JZVEVTKTsKKwltZW1zZXQoYnAtPnR4X2lvYnVmLCAwLCBzaXplb2YoYnAtPnR4X2lvYnVmKSk7CisKKwlEQkcoIkluaXQgVFggcmluZ3M6IHR4PTB4JTA4bHhcbiIsIFZJUlRfVE9fQjQ0KGJwLT50eCkpOworCXJldHVybiAwOworfQorCisKKy8qKiogSW50ZXJhY3Rpb24gd2l0aCB0aGUgUEhZICoqKi8KKworCitzdGF0aWMgaW50IGI0NF9waHlfcmVhZChzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwLCBpbnQgcmVnLCB1MzIgKiB2YWwpCit7CisJaW50IGVycjsKKworCXUzMiBhcmcxID0gKE1ESU9fT1BfUkVBRCA8PCBNRElPX0RBVEFfT1BfU0hJRlQpOworCXUzMiBhcmcyID0gKGJwLT5waHlfYWRkciA8PCBNRElPX0RBVEFfUE1EX1NISUZUKTsKKwl1MzIgYXJnMyA9IChyZWcgPDwgTURJT19EQVRBX1JBX1NISUZUKTsKKwl1MzIgYXJnNCA9IChNRElPX1RBX1ZBTElEIDw8IE1ESU9fREFUQV9UQV9TSElGVCk7CisJdTMyIGFyZ3YgPSBhcmcxIHwgYXJnMiB8IGFyZzMgfCBhcmc0OworCisJYnczMihicCwgQjQ0X0VNQUNfSVNUQVQsIEVNQUNfSU5UX01JSSk7CisJYnczMihicCwgQjQ0X01ESU9fREFUQSwgKE1ESU9fREFUQV9TQl9TVEFSVCB8IGFyZ3YpKTsKKwllcnIgPSBiNDRfd2FpdF9iaXQoYnAsIEI0NF9FTUFDX0lTVEFULCBFTUFDX0lOVF9NSUksIDEwMCwgMCk7CisJKnZhbCA9IGJyMzIoYnAsIEI0NF9NRElPX0RBVEEpICYgTURJT19EQVRBX0RBVEE7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgYjQ0X3BoeV93cml0ZShzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwLCBpbnQgcmVnLCB1MzIgdmFsKQoreworCXUzMiBhcmcxID0gKE1ESU9fT1BfV1JJVEUgPDwgTURJT19EQVRBX09QX1NISUZUKTsKKwl1MzIgYXJnMiA9IChicC0+cGh5X2FkZHIgPDwgTURJT19EQVRBX1BNRF9TSElGVCk7CisJdTMyIGFyZzMgPSAocmVnIDw8IE1ESU9fREFUQV9SQV9TSElGVCk7CisJdTMyIGFyZzQgPSAoTURJT19UQV9WQUxJRCA8PCBNRElPX0RBVEFfVEFfU0hJRlQpOworCXUzMiBhcmc1ID0gKHZhbCAmIE1ESU9fREFUQV9EQVRBKTsKKwl1MzIgYXJndiA9IGFyZzEgfCBhcmcyIHwgYXJnMyB8IGFyZzQgfCBhcmc1OworCisKKwlidzMyKGJwLCBCNDRfRU1BQ19JU1RBVCwgRU1BQ19JTlRfTUlJKTsKKwlidzMyKGJwLCBCNDRfTURJT19EQVRBLCAoTURJT19EQVRBX1NCX1NUQVJUIHwgYXJndikpOworCXJldHVybiBiNDRfd2FpdF9iaXQoYnAsIEI0NF9FTUFDX0lTVEFULCBFTUFDX0lOVF9NSUksIDEwMCwgMCk7Cit9CisKKworc3RhdGljIGludCBiNDRfcGh5X3Jlc2V0KHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnApCit7CisJdTMyIHZhbDsKKwlpbnQgZXJyOworCisJZXJyID0gYjQ0X3BoeV93cml0ZShicCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwl1ZGVsYXkoMTAwKTsKKwllcnIgPSBiNDRfcGh5X3JlYWQoYnAsIE1JSV9CTUNSLCAmdmFsKTsKKwlpZiAoIWVycikgeworCQlpZiAodmFsICYgQk1DUl9SRVNFVCkgeworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVGhlIEJDTTQ0eHggQ0FNIChDb250ZW50IEFkZHJlc3NhYmxlIE1lbW9yeSkgc3RvcmVzIHRoZSBNQUMKKyAqIGFuZCBQSFkgYWRkcmVzcy4KKyAqLworc3RhdGljIHZvaWQgYjQ0X2NhbV93cml0ZShzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwLCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KQoreworCXUzMiB2YWw7CisKKwl2YWwgID0gKCh1MzIpIGRhdGFbMl0pIDw8IDI0OworCXZhbCB8PSAoKHUzMikgZGF0YVszXSkgPDwgMTY7CisJdmFsIHw9ICgodTMyKSBkYXRhWzRdKSA8PCA4OworCXZhbCB8PSAoKHUzMikgZGF0YVs1XSkgPDwgMDsKKwlidzMyKGJwLCBCNDRfQ0FNX0RBVEFfTE8sIHZhbCk7CisKKworCXZhbCA9IChDQU1fREFUQV9ISV9WQUxJRCB8CisJICAgICAgICgoKHUzMikgZGF0YVswXSkgPDwgOCkgfCAoKCh1MzIpIGRhdGFbMV0pIDw8IDApKTsKKworCWJ3MzIoYnAsIEI0NF9DQU1fREFUQV9ISSwgdmFsKTsKKworCXZhbCA9IENBTV9DVFJMX1dSSVRFIHwgKGluZGV4IDw8IENBTV9DVFJMX0lOREVYX1NISUZUKTsKKwlidzMyKGJwLCBCNDRfQ0FNX0NUUkwsIHZhbCk7CisKKwliNDRfd2FpdF9iaXQoYnAsIEI0NF9DQU1fQ1RSTCwgQ0FNX0NUUkxfQlVTWSwgMTAwLCAxKTsKK30KKworCitzdGF0aWMgdm9pZCBiNDRfc2V0X21hY19hZGRyKHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnApCit7CisJdTMyIHZhbDsKKwlidzMyKGJwLCBCNDRfQ0FNX0NUUkwsIDApOworCWI0NF9jYW1fd3JpdGUoYnAsIGJwLT5uZXRkZXYtPmxsX2FkZHIsIDApOworCXZhbCA9IGJyMzIoYnAsIEI0NF9DQU1fQ1RSTCk7CisJYnczMihicCwgQjQ0X0NBTV9DVFJMLCB2YWwgfCBDQU1fQ1RSTF9FTkFCTEUpOworfQorCisKKy8qIFJlYWQgMTI4LWJ5dGVzIG9mIEVFUFJPTS4gKi8KK3N0YXRpYyB2b2lkIGI0NF9yZWFkX2VlcHJvbShzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwLCB1OCAqIGRhdGEpCit7CisJbG9uZyBpOworCXUxNiAqcHRyID0gKHUxNiAqKSBkYXRhOworCisJZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKQorCQlwdHJbaSAvIDJdID0gY3B1X3RvX2xlMTYocmVhZHcoYnAtPnJlZ3MgKyA0MDk2ICsgaSkpOworfQorCisKK3N0YXRpYyB2b2lkIGI0NF9sb2FkX21hY19hbmRfcGh5X2FkZHIoc3RydWN0IGI0NF9wcml2YXRlICpicCkKK3sKKwl1OCBlZXByb21bMTI4XTsKKworCS8qIExvYWQgTUFDIGFkZHJlc3MsIG5vdGUgYnl0ZXN3YXBwaW5nICovCisJYjQ0X3JlYWRfZWVwcm9tKGJwLCAmZWVwcm9tWzBdKTsKKwlicC0+bmV0ZGV2LT5od19hZGRyWzBdID0gZWVwcm9tWzc5XTsKKwlicC0+bmV0ZGV2LT5od19hZGRyWzFdID0gZWVwcm9tWzc4XTsKKwlicC0+bmV0ZGV2LT5od19hZGRyWzJdID0gZWVwcm9tWzgxXTsKKwlicC0+bmV0ZGV2LT5od19hZGRyWzNdID0gZWVwcm9tWzgwXTsKKwlicC0+bmV0ZGV2LT5od19hZGRyWzRdID0gZWVwcm9tWzgzXTsKKwlicC0+bmV0ZGV2LT5od19hZGRyWzVdID0gZWVwcm9tWzgyXTsKKworCS8qIExvYWQgUEhZIGFkZHJlc3MgKi8KKwlicC0+cGh5X2FkZHIgPSBlZXByb21bOTBdICYgMHgxZjsKK30KKworCitzdGF0aWMgdm9pZCBiNDRfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBjaGFyIHplcm9bNl0gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKwl1MzIgdmFsOworCWludCBpOworCisJdmFsID0gYnIzMihicCwgQjQ0X1JYQ09ORklHKTsKKwl2YWwgJj0gflJYQ09ORklHX1BST01JU0M7CisJdmFsIHw9IFJYQ09ORklHX0FMTE1VTFRJOworCisJYjQ0X3NldF9tYWNfYWRkcihicCk7CisKKwlmb3IgKGkgPSAxOyBpIDwgNjQ7IGkrKykKKwkJYjQ0X2NhbV93cml0ZShicCwgemVybywgaSk7CisKKwlidzMyKGJwLCBCNDRfUlhDT05GSUcsIHZhbCk7CisJdmFsID0gYnIzMihicCwgQjQ0X0NBTV9DVFJMKTsKKwlidzMyKGJwLCBCNDRfQ0FNX0NUUkwsIHZhbCB8IENBTV9DVFJMX0VOQUJMRSk7Cit9CisKKworLyoqKiBJbXBsZW1lbnRhdGlvbiBvZiBnUFhFIGRyaXZlciBjYWxsYmFja3MgKioqLworCisvKioKKyAqIFByb2JlIGRldmljZQorICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiBpZAlNYXRjaGluZyBlbnRyeSBpbiBJRCB0YWJsZQorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBiNDRfcHJvYmUoc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGI0NF9wcml2YXRlICpicDsKKwlpbnQgcmM7CisKKwkvKgorCSAqIEJhaWwgb3V0IGlmIG1vcmUgdGhhbiAxR0Igb2YgcGh5c2ljYWwgUkFNIGlzIGluc3RhbGxlZC4KKwkgKiBUaGlzIGxpbWl0YXRpb24gd2lsbCBiZSByZW1vdmVkIGxhdGVyIHdoZW4gZG1hIG1hcHBpbmcKKwkgKiBpcyBtZXJnZWQgaW50byBtYWlubGluZS4KKwkgKi8KKwlpZiAoIXBoeXNfcmFtX3dpdGhpbl9saW1pdChCNDRfMzBCSVRfRE1BX01BU0spKSB7CisJCURCRygiU29ycnksIHRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGRvZXMgbm90XG4iCisJCSAgICAic3VwcG9ydCBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIDFHQiBvZiBSQU0uXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogU2V0IHVwIG5ldGRldiAqLworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqYnApKTsKKwlpZiAoIW5ldGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZXRkZXZfaW5pdChuZXRkZXYsICZiNDRfb3BlcmF0aW9ucyk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgbmV0ZGV2KTsKKwluZXRkZXYtPmRldiA9ICZwY2ktPmRldjsKKworCS8qIFNldCB1cCBwcml2YXRlIGRhdGEgKi8KKwlicCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJbWVtc2V0KGJwLCAwLCBzaXplb2YoKmJwKSk7CisJYnAtPm5ldGRldiA9IG5ldGRldjsKKwlicC0+cGNpID0gcGNpOworCisJLyogTWFwIGRldmljZSByZWdpc3RlcnMgKi8KKwlicC0+cmVncyA9IGlvcmVtYXAocGNpLT5tZW1iYXNlLCBCNDRfUkVHU19TSVpFKTsKKwlpZiAoIWJwLT5yZWdzKSB7CisJCW5ldGRldl9wdXQobmV0ZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogRW5hYmxlIFBDSSBidXMgbWFzdGVyaW5nICovCisJYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworCWI0NF9sb2FkX21hY19hbmRfcGh5X2FkZHIoYnApOworCisJLyogTGluayBtYW5hZ2VtZW50IGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQgKi8KKwluZXRkZXZfbGlua191cChuZXRkZXYpOworCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAocmMgIT0gMCkgeworCQlpb3VubWFwKGJwLT5yZWdzKTsKKwkJbmV0ZGV2X3B1dChuZXRkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJYjQ0X2NoaXBfcmVzZXQoYnAsIEI0NF9DSElQX1JFU0VUX0ZVTEwpOworCisJREJHKCJiNDQgJXMgKCUwNHg6JTA0eCkgcmVncz0lcCBNQUM9JXNcbiIsIGlkLT5uYW1lLCBpZC0+dmVuZG9yLAorCSAgICBpZC0+ZGV2aWNlLCBicC0+cmVncywgZXRoX250b2EobmV0ZGV2LT5sbF9hZGRyKSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIFJlbW92ZSBkZXZpY2UKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICovCitzdGF0aWMgdm9pZCBiNDRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOworCXN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJc3NiX2NvcmVfZGlzYWJsZShicCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpb3VubWFwKGJwLT5yZWdzKTsKKwluZXRkZXZfbnVsbGlmeShuZXRkZXYpOworCW5ldGRldl9wdXQobmV0ZGV2KTsKK30KKworCisvKiogRW5hYmxlIG9yIGRpc2FibGUgaW50ZXJydXB0cworICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorICogQHYgZW5hYmxlCUludGVycnVwdHMgc2hvdWxkIGJlIGVuYWJsZWQKKyAqLworc3RhdGljIHZvaWQgYjQ0X2lycShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogSW50ZXJydXB0IG1hc2sgc3BlY2lmaWVzIHdoaWNoIGV2ZW50cyBnZW5lcmF0ZSBpbnRlcnJ1cHRzICovCisJYnczMihicCwgQjQ0X0lNQVNLLCBlbmFibGUgPyBJTUFTS19ERUYgOiBJTUFTS19ESVNBQkxFKTsKK30KKworCisvKiogT3BlbiBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBiNDRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByYzsKKworCXJjID0gYjQ0X2luaXRfdHhfcmluZyhicCk7CisJaWYgKHJjICE9IDApCisJCXJldHVybiByYzsKKworCXJjID0gYjQ0X2luaXRfcnhfcmluZyhicCk7CisJaWYgKHJjICE9IDApCisJCXJldHVybiByYzsKKworCWI0NF9pbml0X2h3KGJwLCBCNDRfRlVMTF9SRVNFVCk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwliNDRfaXJxKG5ldGRldiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiogQ2xvc2UgbmV0d29yayBkZXZpY2UKKyAqCisgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgYjQ0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGI0NF9wcml2YXRlICpicCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwliNDRfY2hpcF9yZXNldChicCwgQjQ0X0ZVTExfUkVTRVQpOworCWI0NF9mcmVlX3R4X3JpbmcoYnApOworCWI0NF9mcmVlX3J4X3JpbmcoYnApOworfQorCisKKy8qKiBUcmFuc21pdCBwYWNrZXQKKyAqCisgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UKKyAqIEB2IGlvYnVmCUkvTyBidWZmZXIKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYjQ0X3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmKQoreworCXN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiBjdXIgPSBicC0+dHhfY3VyOworCXUzMiBjdHJsOworCisJLyogQ2hlY2sgZm9yIFRYIHJpbmcgb3ZlcmZsb3cgKi8KKwlpZiAoYnAtPnR4W2N1cl0uY3RybCkgeworCQlEQkcoInR4IG92ZXJmbG93XG4iKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCS8qIFdpbGwgY2FsbCBuZXRkZXZfdHhfY29tcGxldGUoKSBvbiB0aGUgaW9idWYgbGF0ZXIgKi8KKwlicC0+dHhfaW9idWZbY3VyXSA9IGlvYnVmOworCisJLyogU2V0IHVwIFRYIGRlc2NyaXB0b3IgKi8KKwljdHJsID0gKGlvYl9sZW4oaW9idWYpICYgREVTQ19DVFJMX0xFTikgfAorCSAgICBERVNDX0NUUkxfSU9DIHwgREVTQ19DVFJMX1NPRiB8IERFU0NfQ1RSTF9FT0Y7CisKKwlpZiAoY3VyID09IEI0NF9SSU5HX0xBU1QpCisJCWN0cmwgfD0gREVTQ19DVFJMX0VPVDsKKworCWJwLT50eFtjdXJdLmN0cmwgPSBjcHVfdG9fbGUzMihjdHJsKTsKKwlicC0+dHhbY3VyXS5hZGRyID0gY3B1X3RvX2xlMzIoVklSVF9UT19CNDQoaW9idWYtPmRhdGEpKTsKKworCS8qIFVwZGF0ZSBuZXh0IGF2YWlsYWJsZSBkZXNjcmlwdG9yIGluZGV4ICovCisJY3VyID0gcmluZ19uZXh0KGN1cik7CisJYnAtPnR4X2N1ciA9IGN1cjsKKwl3bWIoKTsKKworCS8qIFRlbGwgY2FyZCB0aGF0IGEgbmV3IFRYIGRlc2NyaXB0b3IgaXMgcmVhZHkgKi8KKwlidzMyKGJwLCBCNDRfRE1BVFhfUFRSLCBjdXIgKiBzaXplb2Yoc3RydWN0IGRtYV9kZXNjKSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqIFJlY3ljbGVzIHNlbnQgVFggZGVzY3JpcHRvcnMgYW5kIG5vdGlmaWVzIG5ldHdvcmsgc3RhY2sKKyAqCisgKiBAdiBicCBEcml2ZXIgc3RhdGUKKyAqLworc3RhdGljIHZvaWQgYjQ0X3R4X2NvbXBsZXRlKHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnApCit7CisJdTMyIGN1ciwgaTsKKworCWN1ciA9IHBlbmRpbmdfdHhfaW5kZXgoYnApOworCisJZm9yIChpID0gYnAtPnR4X2RpcnR5OyBpICE9IGN1cjsgaSA9IHJpbmdfbmV4dChpKSkgeworCQkvKiBGcmVlIGZpbmlzaGVkIGZyYW1lICovCisJCW5ldGRldl90eF9jb21wbGV0ZShicC0+bmV0ZGV2LCBicC0+dHhfaW9idWZbaV0pOworCQlicC0+dHhfaW9idWZbaV0gPSBOVUxMOworCisJCS8qIENsZWFyIFRYIGRlc2NyaXB0b3IgKi8KKwkJYnAtPnR4W2ldLmN0cmwgPSAwOworCQlicC0+dHhbaV0uYWRkciA9IDA7CisJfQorCWJwLT50eF9kaXJ0eSA9IGN1cjsKK30KKworCitzdGF0aWMgdm9pZCBiNDRfcHJvY2Vzc19yeF9wYWNrZXRzKHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnApCit7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iOwkvKiByZWNlaXZlZCBkYXRhICovCisJc3RydWN0IHJ4X2hlYWRlciAqcmg7CisJdTMyIHBlbmRpbmcsIGk7CisJdTE2IGxlbjsKKworCXBlbmRpbmcgPSBwZW5kaW5nX3J4X2luZGV4KGJwKTsKKworCWZvciAoaSA9IGJwLT5yeF9jdXI7IGkgIT0gcGVuZGluZzsgaSA9IHJpbmdfbmV4dChpKSkgeworCQlpb2IgPSBicC0+cnhfaW9idWZbaV07CisJCWlmIChpb2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXJoID0gaW9iLT5kYXRhOworCQlsZW4gPSBsZTE2X3RvX2NwdShyaC0+bGVuKTsKKworCQkvKgorCQkgKiBHdWFyZCBhZ2FpbnN0IGluY29tcGxldGVseSB3cml0dGVuIFJYIGRlc2NyaXB0b3JzLgorCQkgKiBXaXRob3V0IHRoaXMsIHRoaW5ncyBjYW4gZ2V0IHJlYWxseSBzbG93IQorCQkgKi8KKwkJaWYgKGxlbiA9PSAwKQorCQkJYnJlYWs7CisKKwkJLyogRGlzY2FyZCBDUkMgdGhhdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIGNhcmQgKi8KKwkJbGVuIC09IDQ7CisKKwkJLyogQ2hlY2sgZm9yIGludmFsaWQgcGFja2V0cyBhbmQgZXJyb3JzICovCisJCWlmIChsZW4gPiBSWF9QS1RfQlVGX1NaIC0gUlhfUEtUX09GRlNFVCB8fAorCQkgICAgKHJoLT5mbGFncyAmIGNwdV90b19sZTE2KFJYX0ZMQUdfRVJST1JTKSkpIHsKKwkJCURCRygicnggZXJyb3IgbGVuPSVkIGZsYWdzPSUwNHhcbiIsIGxlbiwKKwkJCSAgICAgICAgICAgICAgICAgY3B1X3RvX2xlMTYocmgtPmZsYWdzKSk7CisJCQlyaC0+bGVuID0gMDsKKwkJCXJoLT5mbGFncyA9IDA7CisJCQluZXRkZXZfcnhfZXJyKGJwLT5uZXRkZXYsIGlvYiwgLUVJTlZBTCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENsZWFyIFJYIGRlc2NyaXB0b3IgKi8KKwkJcmgtPmxlbiA9IDA7CisJCXJoLT5mbGFncyA9IDA7CisJCWJwLT5yeF9pb2J1ZltpXSA9IE5VTEw7CisKKwkJLyogSGFuZCBvZmYgdGhlIElPIGJ1ZmZlciB0byB0aGUgbmV0d29yayBzdGFjayAqLworCQlpb2JfcmVzZXJ2ZShpb2IsIFJYX1BLVF9PRkZTRVQpOworCQlpb2JfcHV0KGlvYiwgbGVuKTsKKwkJbmV0ZGV2X3J4KGJwLT5uZXRkZXYsIGlvYik7CisJfQorCWJwLT5yeF9jdXIgPSBpOworCWI0NF9yeF9yZWZpbGwoYnAsIHBlbmRpbmdfcnhfaW5kZXgoYnApKTsKK30KKworCisvKiogUG9sbCBmb3IgY29tcGxldGVkIGFuZCByZWNlaXZlZCBwYWNrZXRzCisgKgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGI0NF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGI0NF9wcml2YXRlICpicCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIGlzdGF0OworCisJLyogSW50ZXJydXB0IHN0YXR1cyAqLworCWlzdGF0ID0gYnIzMihicCwgQjQ0X0lTVEFUKTsKKwlpc3RhdCAmPSBJTUFTS19ERUY7CS8qIG9ubHkgdGhlIGV2ZW50cyB3ZSBjYXJlIGFib3V0ICovCisKKwlpZiAoIWlzdGF0KQorCQlyZXR1cm47CisJaWYgKGlzdGF0ICYgSVNUQVRfVFgpCisJCWI0NF90eF9jb21wbGV0ZShicCk7CisJaWYgKGlzdGF0ICYgSVNUQVRfUlgpCisJCWI0NF9wcm9jZXNzX3J4X3BhY2tldHMoYnApOworCWlmIChpc3RhdCAmIElTVEFUX0VSUk9SUykgeworCQlEQkcoImI0NCBlcnJvciBpc3RhdD0weCUwOHhcbiIsIGlzdGF0KTsKKworCQkvKiBSZXNldCBCNDQgY29yZSBwYXJ0aWFsbHkgdG8gYXZvaWQgbG9uZyB3YWl0cyAqLworCQliNDRfaXJxKGJwLT5uZXRkZXYsIDApOworCQliNDRfaGFsdChicCk7CisJCWI0NF9pbml0X3R4X3JpbmcoYnApOworCQliNDRfaW5pdF9yeF9yaW5nKGJwKTsKKwkJYjQ0X2luaXRfaHcoYnAsIEI0NF9GVUxMX1JFU0VUX1NLSVBfUEhZKTsKKwl9CisKKwkvKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKwlidzMyKGJwLCBCNDRfSVNUQVQsIDApOworCWJmbHVzaChicCwgQjQ0X0lTVEFULCAxKTsKK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BlcmF0aW9ucyBiNDRfb3BlcmF0aW9ucyA9IHsKKwkub3BlbiA9IGI0NF9vcGVuLAorCS5jbG9zZSA9IGI0NF9jbG9zZSwKKwkudHJhbnNtaXQgPSBiNDRfdHJhbnNtaXQsCisJLnBvbGwgPSBiNDRfcG9sbCwKKwkuaXJxID0gYjQ0X2lycSwKK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGI0NF9uaWNzW10gPSB7CisJUENJX1JPTSgweDE0ZTQsIDB4NDQwMSwgIkJDTTQ0MDEiLCAiQkNNNDQwMSIsIDApLAorCVBDSV9ST00oMHgxNGU0LCAweDE3MGMsICJCQ000NDAxLUIwIiwgIkJDTTQ0MDEtQjAiLCAwKSwKKwlQQ0lfUk9NKDB4MTRlNCwgMHg0NDAyLCAiQkNNNDQwMS1CMSIsICJCQ000NDAxLUIxIiwgMCksCit9OworCisKK3N0cnVjdCBwY2lfZHJpdmVyIGI0NF9kcml2ZXIgX19wY2lfZHJpdmVyID0geworCS5pZHMgPSBiNDRfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YgYjQ0X25pY3MgLyBzaXplb2YgYjQ0X25pY3NbMF0sCisJLnByb2JlID0gYjQ0X3Byb2JlLAorCS5yZW1vdmUgPSBiNDRfcmVtb3ZlLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2I0NC5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYjQ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhZmNiZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2I0NC5oCkBAIC0wLDAgKzEsNDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFN0ZWZhbiBIYWpub2N6aSA8c3RlZmFuaGFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA4IFBhbnRlbGlzIEtvdWtvdXNvdWxhcyA8cGt0b3NzQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogVGhpcyBkcml2ZXIgaXMgYSBwb3J0IG9mIHRoZSBiNDQgbGludXggZHJpdmVyIHZlcnNpb24gMS4wMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQHJlZGhhdC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIFBla2thIFBpZXRpa2FpbmVuIDxwcEBlZS5vdWx1LmZpPgorICogQ29weXJpZ2h0IChDKSAyMDA2IEJyb2FkY29tIENvcnBvcmF0aW9uLgorICoKKyAqIFNvbWUgc3NiIGJpdHMgY29waWVkIGZyb20gdmVyc2lvbiAyLjAgb2YgdGhlIGI0NCBkcml2ZXIKKyAqIENvcHlyaWdodCAoYykgTWljaGFlbCBCdWVzY2gKKyAqCisgKiBDb3B5cmlnaHQgKGMpIGEgbG90IG9mIHBlb3BsZSB0b28uIFBsZWFzZSByZXNwZWN0IHRoZWlyIHdvcmsuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaWZuZGVmIF9CNDRfSAorI2RlZmluZSBfQjQ0X0gKKworLyogQkNNNDR4eCBSZWdpc3RlciBsYXlvdXQgKi8KKyNkZWZpbmUJQjQ0X0RFVkNUUkwJCTB4MDAwMFVMIC8qIERldmljZSBDb250cm9sICovCisjZGVmaW5lICBERVZDVFJMX01QTQkJMHgwMDAwMDA0MCAvKiBNUCBQTUUgRW5hYmxlIChCMCBvbmx5KSAqLworI2RlZmluZSAgREVWQ1RSTF9QRkUJCTB4MDAwMDAwODAgLyogUGF0dGVybiBGaWx0ZXJpbmcgRW5hYmxlICovCisjZGVmaW5lICBERVZDVFJMX0lQUAkJMHgwMDAwMDQwMCAvKiBJbnRlcm5hbCBFUEhZIFByZXNlbnQgKi8KKyNkZWZpbmUgIERFVkNUUkxfRVBSCQkweDAwMDA4MDAwIC8qIEVQSFkgUmVzZXQgKi8KKyNkZWZpbmUgIERFVkNUUkxfUE1FCQkweDAwMDAxMDAwIC8qIFBIWSBNb2RlIEVuYWJsZSAqLworI2RlZmluZSAgREVWQ1RSTF9QTUNFCQkweDAwMDAyMDAwIC8qIFBIWSBNb2RlIENsb2NrcyBFbmFibGUgKi8KKyNkZWZpbmUgIERFVkNUUkxfUEFERFIJCTB4MDAwN2MwMDAgLyogUEhZIEFkZHJlc3MgKi8KKyNkZWZpbmUgIERFVkNUUkxfUEFERFJfU0hJRlQJMTgKKyNkZWZpbmUgQjQ0X0JJU1RfU1RBVAkJMHgwMDBDVUwgLyogQnVpbHQtSW4gU2VsZi1UZXN0IFN0YXR1cyAqLworI2RlZmluZSBCNDRfV0tVUF9MRU4JCTB4MDAxMFVMIC8qIFdha2V1cCBMZW5ndGggKi8KKyNkZWZpbmUgIFdLVVBfTEVOX1AwX01BU0sJMHgwMDAwMDA3ZiAvKiBQYXR0ZXJuIDAgKi8KKyNkZWZpbmUgIFdLVVBfTEVOX0QwCQkweDAwMDAwMDgwCisjZGVmaW5lICBXS1VQX0xFTl9QMV9NQVNLCTB4MDAwMDdmMDAgLyogUGF0dGVybiAxICovCisjZGVmaW5lICBXS1VQX0xFTl9QMV9TSElGVAk4CisjZGVmaW5lICBXS1VQX0xFTl9EMQkJMHgwMDAwODAwMAorI2RlZmluZSAgV0tVUF9MRU5fUDJfTUFTSwkweDAwN2YwMDAwIC8qIFBhdHRlcm4gMiAqLworI2RlZmluZSAgV0tVUF9MRU5fUDJfU0hJRlQJMTYKKyNkZWZpbmUgIFdLVVBfTEVOX0QyCQkweDAwMDAwMDAwCisjZGVmaW5lICBXS1VQX0xFTl9QM19NQVNLCTB4N2YwMDAwMDAgLyogUGF0dGVybiAzICovCisjZGVmaW5lICBXS1VQX0xFTl9QM19TSElGVAkyNAorI2RlZmluZSAgV0tVUF9MRU5fRDMJCTB4ODAwMDAwMDAKKyNkZWZpbmUgIFdLVVBfTEVOX0RJU0FCTEUJMHg4MDgwODA4MAorI2RlZmluZSAgV0tVUF9MRU5fRU5BQkxFX1RXTwkweDgwODAwMDAwCisjZGVmaW5lICBXS1VQX0xFTl9FTkFCTEVfVEhSRUUJMHg4MDAwMDAwMAorI2RlZmluZSBCNDRfSVNUQVQJCTB4MDAyMFVMIC8qIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgIElTVEFUX0xTCQkweDAwMDAwMDIwIC8qIExpbmsgQ2hhbmdlIChCMCBvbmx5KSAqLworI2RlZmluZSAgSVNUQVRfUE1FCQkweDAwMDAwMDQwIC8qIFBvd2VyIE1hbmFnZW1lbnQgRXZlbnQgKi8KKyNkZWZpbmUgIElTVEFUX1RPCQkweDAwMDAwMDgwIC8qIEdlbmVyYWwgUHVycG9zZSBUaW1lb3V0ICovCisjZGVmaW5lICBJU1RBVF9EU0NFCQkweDAwMDAwNDAwIC8qIERlc2NyaXB0b3IgRXJyb3IgKi8KKyNkZWZpbmUgIElTVEFUX0RBVEFFCQkweDAwMDAwODAwIC8qIERhdGEgRXJyb3IgKi8KKyNkZWZpbmUgIElTVEFUX0RQRQkJMHgwMDAwMTAwMCAvKiBEZXNjci4gUHJvdG9jb2wgRXJyb3IgKi8KKyNkZWZpbmUgIElTVEFUX1JEVQkJMHgwMDAwMjAwMCAvKiBSZWNlaXZlIERlc2NyLiBVbmRlcmZsb3cgKi8KKyNkZWZpbmUgIElTVEFUX1JGTwkJMHgwMDAwNDAwMCAvKiBSZWNlaXZlIEZJRk8gT3ZlcmZsb3cgKi8KKyNkZWZpbmUgIElTVEFUX1RGVQkJMHgwMDAwODAwMCAvKiBUcmFuc21pdCBGSUZPIFVuZGVyZmxvdyAqLworI2RlZmluZSAgSVNUQVRfUlgJCTB4MDAwMTAwMDAgLyogUlggSW50ZXJydXB0ICovCisjZGVmaW5lICBJU1RBVF9UWAkJMHgwMTAwMDAwMCAvKiBUWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIElTVEFUX0VNQUMJCTB4MDQwMDAwMDAgLyogRU1BQyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIElTVEFUX01JSV9XUklURQkweDA4MDAwMDAwIC8qIE1JSSBXcml0ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIElTVEFUX01JSV9SRUFECQkweDEwMDAwMDAwIC8qIE1JSSBSZWFkIEludGVycnVwdCAqLworI2RlZmluZSAgSVNUQVRfRVJST1JTICAgICAgICAgICAoSVNUQVRfRFNDRXxJU1RBVF9EQVRBRXxJU1RBVF9EUEV8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNUQVRfUkRVfElTVEFUX1JGT3xJU1RBVF9URlUpCisjZGVmaW5lIEI0NF9JTUFTSwkJMHgwMDI0VUwgLyogSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgIElNQVNLX0RFRgkJKElTVEFUX0VSUk9SUyB8IElTVEFUX1JYIHwgSVNUQVRfVFgpCisjZGVmaW5lICBJTUFTS19ESVNBQkxFICAgICAgICAgIDAKKyNkZWZpbmUgQjQ0X0dQVElNRVIJCTB4MDAyOFVMIC8qIEdlbmVyYWwgUHVycG9zZSBUaW1lciAqLworI2RlZmluZSBCNDRfQUREUl9MTwkJMHgwMDg4VUwgLyogRU5FVCBBZGRyZXNzIExvIChCMCBvbmx5KSAqLworI2RlZmluZSBCNDRfQUREUl9ISQkJMHgwMDhDVUwgLyogRU5FVCBBZGRyZXNzIEhpIChCMCBvbmx5KSAqLworI2RlZmluZSBCNDRfRklMVF9BRERSCQkweDAwOTBVTCAvKiBFTkVUIEZpbHRlciBBZGRyZXNzICovCisjZGVmaW5lIEI0NF9GSUxUX0RBVEEJCTB4MDA5NFVMIC8qIEVORVQgRmlsdGVyIERhdGEgKi8KKyNkZWZpbmUgQjQ0X1RYQlVSU1QJCTB4MDBBMFVMIC8qIFRYIE1heCBCdXJzdCBMZW5ndGggKi8KKyNkZWZpbmUgQjQ0X1JYQlVSU1QJCTB4MDBBNFVMIC8qIFJYIE1heCBCdXJzdCBMZW5ndGggKi8KKyNkZWZpbmUgQjQ0X01BQ19DVFJMCQkweDAwQThVTCAvKiBNQUMgQ29udHJvbCAqLworI2RlZmluZSAgTUFDX0NUUkxfQ1JDMzJfRU5BQgkweDAwMDAwMDAxIC8qIENSQzMyIEdlbmVyYXRpb24gRW5hYmxlICovCisjZGVmaW5lICBNQUNfQ1RSTF9QSFlfUERPV04JMHgwMDAwMDAwNCAvKiBPbmNoaXAgRVBIWSBQb3dlcmRvd24gKi8KKyNkZWZpbmUgIE1BQ19DVFJMX1BIWV9FREVUCTB4MDAwMDAwMDggLyogT25jaGlwIEVQSFkgRW5lcmd5IERldGVjdGVkKi8KKyNkZWZpbmUgIE1BQ19DVFJMX1BIWV9MRURDVFJMCTB4MDAwMDAwZTAgLyogT25jaGlwIEVQSFkgTEVEIENvbnRyb2wgKi8KKyNkZWZpbmUgIE1BQ19DVFJMX1BIWV9MRURDVFJMX1NISUZUIDUKKyNkZWZpbmUgQjQ0X01BQ19GTE9XCQkweDAwQUNVTCAvKiBNQUMgRmxvdyBDb250cm9sICovCisjZGVmaW5lICBNQUNfRkxPV19SWF9ISV9XQVRFUgkweDAwMDAwMGZmIC8qIFJlY2VpdmUgRklGTyBISSBXYXRlciBNYXJrICovCisjZGVmaW5lICBNQUNfRkxPV19QQVVTRV9FTkFCCTB4MDAwMDgwMDAgLyogRW5ibCBQYXVzZSBGcm0gR2VuZXJhdGlvbiAqLworI2RlZmluZSBCNDRfUkNWX0xBWlkJCTB4MDEwMFVMIC8qIExhenkgSW50ZXJydXB0IENvbnRyb2wgKi8KKyNkZWZpbmUgIFJDVl9MQVpZX1RPX01BU0sJMHgwMGZmZmZmZiAvKiBUaW1lb3V0ICovCisjZGVmaW5lICBSQ1ZfTEFaWV9GQ19NQVNLCTB4ZmYwMDAwMDAgLyogRnJhbWUgQ291bnQgKi8KKyNkZWZpbmUgIFJDVl9MQVpZX0ZDX1NISUZUCTI0CisjZGVmaW5lIEI0NF9ETUFUWF9DVFJMCQkweDAyMDBVTCAvKiBETUEgVFggQ29udHJvbCAqLworI2RlZmluZSAgRE1BVFhfQ1RSTF9FTkFCTEUJMHgwMDAwMDAwMSAvKiBFbmFibGUgKi8KKyNkZWZpbmUgIERNQVRYX0NUUkxfU1VTUEVORAkweDAwMDAwMDAyIC8qIFN1ZXBlbmQgUmVxdWVzdCAqLworI2RlZmluZSAgRE1BVFhfQ1RSTF9MUEJBQ0sJMHgwMDAwMDAwNCAvKiBMb29wYmFjayBFbmFibGUgKi8KKyNkZWZpbmUgIERNQVRYX0NUUkxfRkFJUlBSSU9SCTB4MDAwMDAwMDggLyogRmFpciBQcmlvcml0eSAqLworI2RlZmluZSAgRE1BVFhfQ1RSTF9GTFVTSAkweDAwMDAwMDEwIC8qIEZsdXNoIFJlcXVlc3QgKi8KKyNkZWZpbmUgQjQ0X0RNQVRYX0FERFIJCTB4MDIwNFVMIC8qIERNQSBUWCBEZXNjcmlwdG9yIFJpbmcgQWRkciAqLworI2RlZmluZSBCNDRfRE1BVFhfUFRSCQkweDAyMDhVTCAvKiBETUEgVFggTGFzdCBQb3N0ZWQgRGVzYy4gKi8KKyNkZWZpbmUgQjQ0X0RNQVRYX1NUQVQJCTB4MDIwQ1VMIC8qIERNQSBUWCBDdXIgQWN0dmUgRGVzYy4gKyBTdHMgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfQ0RNQVNLCTB4MDAwMDBmZmYgLyogQ3VycmVudCBEZXNjcmlwdG9yIE1hc2sgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfU01BU0sJMHgwMDAwZjAwMCAvKiBTdGF0ZSBNYXNrICovCisjZGVmaW5lICBETUFUWF9TVEFUX1NESVNBQkxFRAkweDAwMDAwMDAwIC8qIFN0YXRlIERpc2FibGVkICovCisjZGVmaW5lICBETUFUWF9TVEFUX1NBQ1RJVkUJMHgwMDAwMTAwMCAvKiBTdGF0ZSBBY3RpdmUgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfU0lETEUJMHgwMDAwMjAwMCAvKiBTdGF0ZSBJZGxlIFdhaXQgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfU1NUT1BQRUQJMHgwMDAwMzAwMCAvKiBTdGF0ZSBTdG9wcGVkICovCisjZGVmaW5lICBETUFUWF9TVEFUX1NTVVNQCTB4MDAwMDQwMDAgLyogU3RhdGUgU3VzcGVuZCBQZW5kaW5nICovCisjZGVmaW5lICBETUFUWF9TVEFUX0VNQVNLCTB4MDAwZjAwMDAgLyogRXJyb3IgTWFzayAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9FTk9ORQkweDAwMDAwMDAwIC8qIEVycm9yIE5vbmUgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfRURQRQkweDAwMDEwMDAwIC8qIEVycm9yIERlc2MuIFByb3RvY29sIEVycm9yICovCisjZGVmaW5lICBETUFUWF9TVEFUX0VERlUJMHgwMDAyMDAwMCAvKiBFcnJvciBEYXRhIEZJRk8gVW5kZXJydW4gKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfRUJFQlIJMHgwMDAzMDAwMCAvKiBCdXMgRXJyb3Igb24gQnVmZmVyIFJlYWQgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfRUJFREEJMHgwMDA0MDAwMCAvKiBCdXMgRXJyb3Igb24gRGVzYy4gQWNjZXNzICovCisjZGVmaW5lICBETUFUWF9TVEFUX0ZMVVNIRUQJMHgwMDEwMDAwMCAvKiBGbHVzaGVkICovCisjZGVmaW5lIEI0NF9ETUFSWF9DVFJMCQkweDAyMTBVTCAvKiBETUEgUlggQ29udHJvbCAqLworI2RlZmluZSAgRE1BUlhfQ1RSTF9FTkFCTEUJMHgwMDAwMDAwMSAvKiBFbmFibGUgKi8KKyNkZWZpbmUgIERNQVJYX0NUUkxfUk9NQVNLCTB4MDAwMDAwZmUgLyogUmVjZWl2ZSBPZmZzZXQgTWFzayAqLworI2RlZmluZSAgRE1BUlhfQ1RSTF9ST1NISUZUCTEgCSAgIC8qIFJlY2VpdmUgT2Zmc2V0IFNoaWZ0ICovCisjZGVmaW5lIEI0NF9ETUFSWF9BRERSCQkweDAyMTRVTCAvKiBETUEgUlggRGVzY3JpcHRvciBSaW5nIEFkZHIgKi8KKyNkZWZpbmUgQjQ0X0RNQVJYX1BUUgkJMHgwMjE4VUwgLyogRE1BIFJYIExhc3QgUG9zdGVkIERlc2MgKi8KKyNkZWZpbmUgQjQ0X0RNQVJYX1NUQVQJCTB4MDIxQ1VMIC8qIEN1ciBBY3RpdmUgRGVzYy4gKyBTdGF0dXMgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfQ0RNQVNLCTB4MDAwMDBmZmYgLyogQ3VycmVudCBEZXNjcmlwdG9yIE1hc2sgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfU01BU0sJMHgwMDAwZjAwMCAvKiBTdGF0ZSBNYXNrICovCisjZGVmaW5lICBETUFSWF9TVEFUX1NESVNBQkxFRAkweDAwMDAwMDAwIC8qIFN0YXRlIERpc2JhbGVkICovCisjZGVmaW5lICBETUFSWF9TVEFUX1NBQ1RJVkUJMHgwMDAwMTAwMCAvKiBTdGF0ZSBBY3RpdmUgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfU0lETEUJMHgwMDAwMjAwMCAvKiBTdGF0ZSBJZGxlIFdhaXQgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfU1NUT1BQRUQJMHgwMDAwMzAwMCAvKiBTdGF0ZSBTdG9wcGVkICovCisjZGVmaW5lICBETUFSWF9TVEFUX0VNQVNLCTB4MDAwZjAwMDAgLyogRXJyb3IgTWFzayAqLworI2RlZmluZSAgRE1BUlhfU1RBVF9FTk9ORQkweDAwMDAwMDAwIC8qIEVycm9yIE5vbmUgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfRURQRQkweDAwMDEwMDAwIC8qIEVycm9yIERlc2MuIFByb3RvY29sIEVycm9yICovCisjZGVmaW5lICBETUFSWF9TVEFUX0VERk8JMHgwMDAyMDAwMCAvKiBFcnJvciBEYXRhIEZJRk8gT3ZlcmZsb3cgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfRUJFQlcJMHgwMDAzMDAwMCAvKiBFcnJvciBvbiBCdWZmZXIgV3JpdGUgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfRUJFREEJMHgwMDA0MDAwMCAvKiBCdXMgRXJyb3Igb24gRGVzYy4gQWNjZXNzICovCisjZGVmaW5lIEI0NF9ETUFGSUZPX0FECQkweDAyMjBVTCAvKiBETUEgRklGTyBEaWFnIEFkZHJlc3MgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfT01BU0sJMHgwMDAwZmZmZiAvKiBPZmZzZXQgTWFzayAqLworI2RlZmluZSAgRE1BRklGT19BRF9TTUFTSwkweDAwMGYwMDAwIC8qIFNlbGVjdCBNYXNrICovCisjZGVmaW5lICBETUFGSUZPX0FEX1NYREQJMHgwMDAwMDAwMCAvKiBTZWxlY3QgVHJhbnNtaXQgRE1BIERhdGEgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1hEUAkweDAwMDEwMDAwIC8qIFNlbCBUcmFuc21pdCBETUEgUG9pbnRlcnMgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1JERAkweDAwMDQwMDAwIC8qIFNlbGVjdCBSZWNlaXZlIERNQSBEYXRhICovCisjZGVmaW5lICBETUFGSUZPX0FEX1NSRFAJMHgwMDA1MDAwMCAvKiBTZWwgUmVjZWl2ZSBETUEgUG9pbnRlcnMgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1hGRAkweDAwMDgwMDAwIC8qIFNlbGVjdCBUcmFuc21pdCBGSUZPIERhdGEgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1hGUAkweDAwMDkwMDAwIC8qIFNlbCBUcmFuc21pdCBGSUZPIFBvaW50ZXJzICovCisjZGVmaW5lICBETUFGSUZPX0FEX1NSRkQJMHgwMDBjMDAwMCAvKiBTZWxlY3QgUmVjZWl2ZSBGSUZPIERhdGEgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1JGUAkweDAwMGMwMDAwIC8qIFNlbCBSZWNlaXZlIEZJRk8gUG9pbnRlcnMgKi8KKyNkZWZpbmUgQjQ0X0RNQUZJRk9fTE8JCTB4MDIyNFVMIC8qIERNQSBGSUZPIERpYWcgTG93IERhdGEgKi8KKyNkZWZpbmUgQjQ0X0RNQUZJRk9fSEkJCTB4MDIyOFVMIC8qIERNQSBGSUZPIERpYWcgSGlnaCBEYXRhICovCisjZGVmaW5lIEI0NF9SWENPTkZJRwkJMHgwNDAwVUwgLyogRU1BQyBSWCBDb25maWcgKi8KKyNkZWZpbmUgIFJYQ09ORklHX0RCQ0FTVAkweDAwMDAwMDAxIC8qIERpc2FibGUgQnJvYWRjYXN0ICovCisjZGVmaW5lICBSWENPTkZJR19BTExNVUxUSQkweDAwMDAwMDAyIC8qIEFjY2VwdCBBbGwgTXVsdGljYXN0ICovCisjZGVmaW5lICBSWENPTkZJR19OT1JYX1dISUxFX1RYCTB4MDAwMDAwMDQgLyogUmN2IERpc2JsZSBXaGlsZSBUWCAqLworI2RlZmluZSAgUlhDT05GSUdfUFJPTUlTQwkweDAwMDAwMDA4IC8qIFByb21pc2N1b3VzIEVuYWJsZSAqLworI2RlZmluZSAgUlhDT05GSUdfTFBCQUNLCTB4MDAwMDAwMTAgLyogTG9vcGJhY2sgRW5hYmxlICovCisjZGVmaW5lICBSWENPTkZJR19GTE9XCQkweDAwMDAwMDIwIC8qIEZsb3cgQ29udHJvbCBFbmFibGUgKi8KKyNkZWZpbmUgIFJYQ09ORklHX0ZMT1dfQUNDRVBUCTB4MDAwMDAwNDAgLyogQWNjZXB0IFVGQyBGcmFtZSAqLworI2RlZmluZSAgUlhDT05GSUdfUkZJTFQJCTB4MDAwMDAwODAgLyogUmVqZWN0IEZpbHRlciAqLworI2RlZmluZSBCNDRfUlhNQVhMRU4JCTB4MDQwNFVMIC8qIEVNQUMgUlggTWF4IFBhY2tldCBMZW5ndGggKi8KKyNkZWZpbmUgQjQ0X1RYTUFYTEVOCQkweDA0MDhVTCAvKiBFTUFDIFRYIE1heCBQYWNrZXQgTGVuZ3RoICovCisjZGVmaW5lIEI0NF9NRElPX0NUUkwJCTB4MDQxMFVMIC8qIEVNQUMgTURJTyBDb250cm9sICovCisjZGVmaW5lICBNRElPX0NUUkxfTUFYRl9NQVNLCTB4MDAwMDAwN2YgLyogTURDIEZyZXF1ZW5jeSAqLworI2RlZmluZSAgTURJT19DVFJMX1BSRUFNQkxFCTB4MDAwMDAwODAgLyogTUlJIFByZWFtYmxlIEVuYWJsZSAqLworI2RlZmluZSBCNDRfTURJT19EQVRBCQkweDA0MTRVTCAvKiBFTUFDIE1ESU8gRGF0YSAqLworI2RlZmluZSAgTURJT19EQVRBX0RBVEEJCTB4MDAwMGZmZmYgLyogUi9XIERhdGEgKi8KKyNkZWZpbmUgIE1ESU9fREFUQV9UQV9NQVNLCTB4MDAwMzAwMDAgLyogVHVybmFyb3VuZCBWYWx1ZSAqLworI2RlZmluZSAgTURJT19EQVRBX1RBX1NISUZUCTE2CisjZGVmaW5lICBNRElPX1RBX1ZBTElECQkyCisjZGVmaW5lICBNRElPX0RBVEFfUkFfTUFTSwkweDAwN2MwMDAwIC8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgIE1ESU9fREFUQV9SQV9TSElGVAkxOAorI2RlZmluZSAgTURJT19EQVRBX1BNRF9NQVNLCTB4MGY4MDAwMDAgLyogUGh5c2ljYWwgTWVkaWEgRGV2aWNlICovCisjZGVmaW5lICBNRElPX0RBVEFfUE1EX1NISUZUCTIzCisjZGVmaW5lICBNRElPX0RBVEFfT1BfTUFTSwkweDMwMDAwMDAwIC8qIE9wY29kZSAqLworI2RlZmluZSAgTURJT19EQVRBX09QX1NISUZUCTI4CisjZGVmaW5lICBNRElPX09QX1dSSVRFCQkxCisjZGVmaW5lICBNRElPX09QX1JFQUQJCTIKKyNkZWZpbmUgIE1ESU9fREFUQV9TQl9NQVNLCTB4YzAwMDAwMDAgLyogU3RhcnQgQml0cyAqLworI2RlZmluZSAgTURJT19EQVRBX1NCX1NISUZUCTMwCisjZGVmaW5lICBNRElPX0RBVEFfU0JfU1RBUlQJMHg0MDAwMDAwMCAvKiBTdGFydCBPZiBGcmFtZSAqLworI2RlZmluZSBCNDRfRU1BQ19JTUFTSwkJMHgwNDE4VUwgLyogRU1BQyBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBCNDRfRU1BQ19JU1RBVAkJMHgwNDFDVUwgLyogRU1BQyBJbnRlcnJ1cHQgU3RhdHVzICovCisjZGVmaW5lICBFTUFDX0lOVF9NSUkJCTB4MDAwMDAwMDEgLyogTUlJIE1ESU8gSW50ZXJydXB0ICovCisjZGVmaW5lICBFTUFDX0lOVF9NSUIJCTB4MDAwMDAwMDIgLyogTUlCIEludGVycnVwdCAqLworI2RlZmluZSAgRU1BQ19JTlRfRkxPVwkJMHgwMDAwMDAwMyAvKiBGbG93IENvbnRyb2wgSW50ZXJydXB0ICovCisjZGVmaW5lIEI0NF9DQU1fREFUQV9MTwkJMHgwNDIwVUwgLyogRU1BQyBDQU0gRGF0YSBMb3cgKi8KKyNkZWZpbmUgQjQ0X0NBTV9EQVRBX0hJCQkweDA0MjRVTCAvKiBFTUFDIENBTSBEYXRhIEhpZ2ggKi8KKyNkZWZpbmUgIENBTV9EQVRBX0hJX1ZBTElECTB4MDAwMTAwMDAgLyogVmFsaWQgQml0ICovCisjZGVmaW5lIEI0NF9DQU1fQ1RSTAkJMHgwNDI4VUwgLyogRU1BQyBDQU0gQ29udHJvbCAqLworI2RlZmluZSAgQ0FNX0NUUkxfRU5BQkxFCTB4MDAwMDAwMDEgLyogQ0FNIEVuYWJsZSAqLworI2RlZmluZSAgQ0FNX0NUUkxfTVNFTAkJMHgwMDAwMDAwMiAvKiBNYXNrIFNlbGVjdCAqLworI2RlZmluZSAgQ0FNX0NUUkxfUkVBRAkJMHgwMDAwMDAwNCAvKiBSZWFkICovCisjZGVmaW5lICBDQU1fQ1RSTF9XUklURQkJMHgwMDAwMDAwOCAvKiBSZWFkICovCisjZGVmaW5lICBDQU1fQ1RSTF9JTkRFWF9NQVNLCTB4MDAzZjAwMDAgLyogSW5kZXggTWFzayAqLworI2RlZmluZSAgQ0FNX0NUUkxfSU5ERVhfU0hJRlQJMTYKKyNkZWZpbmUgIENBTV9DVFJMX0JVU1kJCTB4ODAwMDAwMDAgLyogQ0FNIEJ1c3kgKi8KKyNkZWZpbmUgQjQ0X0VORVRfQ1RSTAkJMHgwNDJDVUwgLyogRU1BQyBFTkVUIENvbnRyb2wgKi8KKyNkZWZpbmUgIEVORVRfQ1RSTF9FTkFCTEUJMHgwMDAwMDAwMSAvKiBFTUFDIEVuYWJsZSAqLworI2RlZmluZSAgRU5FVF9DVFJMX0RJU0FCTEUJMHgwMDAwMDAwMiAvKiBFTUFDIERpc2FibGUgKi8KKyNkZWZpbmUgIEVORVRfQ1RSTF9TUlNUCQkweDAwMDAwMDA0IC8qIEVNQUMgU29mdCBSZXNldCAqLworI2RlZmluZSAgRU5FVF9DVFJMX0VQU0VMCTB4MDAwMDAwMDggLyogRXh0ZXJuYWwgUEhZIFNlbGVjdCAqLworI2RlZmluZSBCNDRfVFhfQ1RSTAkJMHgwNDMwVUwgLyogRU1BQyBUWCBDb250cm9sICovCisjZGVmaW5lICBUWF9DVFJMX0RVUExFWAkJMHgwMDAwMDAwMSAvKiBGdWxsIER1cGxleCAqLworI2RlZmluZSAgVFhfQ1RSTF9GTU9ERQkJMHgwMDAwMDAwMiAvKiBGbG93IE1vZGUgKi8KKyNkZWZpbmUgIFRYX0NUUkxfU0JFTkFCCQkweDAwMDAwMDA0IC8qIFNpbmdsZSBCYWNrb2ZmIEVuYWJsZSAqLworI2RlZmluZSAgVFhfQ1RSTF9TTUFMTF9TTE9UCTB4MDAwMDAwMDggLyogU21hbGwgU2xvdHRpbWUgKi8KKyNkZWZpbmUgQjQ0X1RYX0hJV01BUksJCTB4MDQzNFVMIC8qIEVNQUMgVFggSGlnaCBXYXRlcm1hcmsgKi8KKyNkZWZpbmUgIFRYX0hJV01BUktfREVGTFQJNTYgIC8qIERlZmF1bHQgdXNlZCBpbiBhbGwgZHJpdmVycyAqLworI2RlZmluZSBCNDRfTUlCX0NUUkwJCTB4MDQzOFVMIC8qIEVNQUMgTUlCIENvbnRyb2wgKi8KKyNkZWZpbmUgIE1JQl9DVFJMX0NMUl9PTl9SRUFECTB4MDAwMDAwMDEgLyogQXV0b2NsZWFyIG9uIFJlYWQgKi8KKyNkZWZpbmUgQjQ0X1RYX0dPT0RfTwkJMHgwNTAwVUwgLyogTUlCIFRYIEdvb2QgT2N0ZXRzICovCisjZGVmaW5lIEI0NF9UWF9HT09EX1AJCTB4MDUwNFVMIC8qIE1JQiBUWCBHb29kIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX08JCTB4MDUwOFVMIC8qIE1JQiBUWCBPY3RldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX1AJCTB4MDUwQ1VMIC8qIE1JQiBUWCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF9CQ0FTVAkJMHgwNTEwVUwgLyogTUlCIFRYIEJyb2FkY2FzdCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF9NQ0FTVAkJMHgwNTE0VUwgLyogTUlCIFRYIE11bHRpY2FzdCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF82NAkJMHgwNTE4VUwgLyogTUlCIFRYIDw9IDY0IGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfNjVfMTI3CQkweDA1MUNVTCAvKiBNSUIgVFggNjUgdG8gMTI3IGJ5dGUgUGt0cyAqLworI2RlZmluZSBCNDRfVFhfMTI4XzI1NQkJMHgwNTIwVUwgLyogTUlCIFRYIDEyOCB0byAyNTUgYnl0ZSBQa3RzICovCisjZGVmaW5lIEI0NF9UWF8yNTZfNTExCQkweDA1MjRVTCAvKiBNSUIgVFggMjU2IHRvIDUxMSBieXRlIFBrdHMgKi8KKyNkZWZpbmUgQjQ0X1RYXzUxMl8xMDIzCQkweDA1MjhVTCAvKiBNSUIgVFggNTEyIHRvIDEwMjMgYnl0ZSBQa3RzICovCisjZGVmaW5lIEI0NF9UWF8xMDI0X01BWAkJMHgwNTJDVUwgLyogTUlCIFRYIDEwMjQgdG8gbWF4IGJ5dGUgUGt0cyAqLworI2RlZmluZSBCNDRfVFhfSkFCQkVSCQkweDA1MzBVTCAvKiBNSUIgVFggSmFiYmVyIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX09TSVpFCQkweDA1MzRVTCAvKiBNSUIgVFggT3ZlcnNpemUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfRlJBRwkJMHgwNTM4VUwgLyogTUlCIFRYIEZyYWdtZW50IFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX1VSVU5TCQkweDA1M0NVTCAvKiBNSUIgVFggVW5kZXJydW5zICovCisjZGVmaW5lIEI0NF9UWF9UQ09MUwkJMHgwNTQwVUwgLyogTUlCIFRYIFRvdGFsIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgQjQ0X1RYX1NDT0xTCQkweDA1NDRVTCAvKiBNSUIgVFggU2luZ2xlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgQjQ0X1RYX01DT0xTCQkweDA1NDhVTCAvKiBNSUIgVFggTXVsdGlwbGUgQ29sbGlzaW9ucyAqLworI2RlZmluZSBCNDRfVFhfRUNPTFMJCTB4MDU0Q1VMIC8qIE1JQiBUWCBFeGNlc3NpdmUgQ29sbGlzaW9ucyAqLworI2RlZmluZSBCNDRfVFhfTENPTFMJCTB4MDU1MFVMIC8qIE1JQiBUWCBMYXRlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgQjQ0X1RYX0RFRkVSRUQJCTB4MDU1NFVMIC8qIE1JQiBUWCBEZWZlcmVkIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX0NMT1NUCQkweDA1NThVTCAvKiBNSUIgVFggQ2FycmllciBMb3N0ICovCisjZGVmaW5lIEI0NF9UWF9QQVVTRQkJMHgwNTVDVUwgLyogTUlCIFRYIFBhdXNlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX0dPT0RfTwkJMHgwNTgwVUwgLyogTUlCIFJYIEdvb2QgT2N0ZXRzICovCisjZGVmaW5lIEI0NF9SWF9HT09EX1AJCTB4MDU4NFVMIC8qIE1JQiBSWCBHb29kIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX08JCTB4MDU4OFVMIC8qIE1JQiBSWCBPY3RldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX1AJCTB4MDU4Q1VMIC8qIE1JQiBSWCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF9CQ0FTVAkJMHgwNTkwVUwgLyogTUlCIFJYIEJyb2FkY2FzdCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF9NQ0FTVAkJMHgwNTk0VUwgLyogTUlCIFJYIE11bHRpY2FzdCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF82NAkJMHgwNTk4VUwgLyogTUlCIFJYIDw9IDY0IGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfNjVfMTI3CQkweDA1OUNVTCAvKiBNSUIgUlggNjUgdG8gMTI3IGJ5dGUgUGt0cyAqLworI2RlZmluZSBCNDRfUlhfMTI4XzI1NQkJMHgwNUEwVUwgLyogTUlCIFJYIDEyOCB0byAyNTUgYnl0ZSBQa3RzICovCisjZGVmaW5lIEI0NF9SWF8yNTZfNTExCQkweDA1QTRVTCAvKiBNSUIgUlggMjU2IHRvIDUxMSBieXRlIFBrdHMgKi8KKyNkZWZpbmUgQjQ0X1JYXzUxMl8xMDIzCQkweDA1QThVTCAvKiBNSUIgUlggNTEyIHRvIDEwMjMgYnl0ZSBQa3RzICovCisjZGVmaW5lIEI0NF9SWF8xMDI0X01BWAkJMHgwNUFDVUwgLyogTUlCIFJYIDEwMjQgdG8gbWF4IGJ5dGUgUGt0cyAqLworI2RlZmluZSBCNDRfUlhfSkFCQkVSCQkweDA1QjBVTCAvKiBNSUIgUlggSmFiYmVyIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX09TSVpFCQkweDA1QjRVTCAvKiBNSUIgUlggT3ZlcnNpemUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfRlJBRwkJMHgwNUI4VUwgLyogTUlCIFJYIEZyYWdtZW50IFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX01JU1MJCTB4MDVCQ1VMIC8qIE1JQiBSWCBNaXNzZWQgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfQ1JDQQkJMHgwNUMwVUwgLyogTUlCIFJYIENSQyBBbGlnbiBFcnJvcnMgKi8KKyNkZWZpbmUgQjQ0X1JYX1VTSVpFCQkweDA1QzRVTCAvKiBNSUIgUlggVW5kZXJzaXplIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX0NSQwkJMHgwNUM4VUwgLyogTUlCIFJYIENSQyBFcnJvcnMgKi8KKyNkZWZpbmUgQjQ0X1JYX0FMSUdOCQkweDA1Q0NVTCAvKiBNSUIgUlggQWxpZ24gRXJyb3JzICovCisjZGVmaW5lIEI0NF9SWF9TWU0JCTB4MDVEMFVMIC8qIE1JQiBSWCBTeW1ib2wgRXJyb3JzICovCisjZGVmaW5lIEI0NF9SWF9QQVVTRQkJMHgwNUQ0VUwgLyogTUlCIFJYIFBhdXNlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX05QQVVTRQkJMHgwNUQ4VUwgLyogTUlCIFJYIE5vbi1QYXVzZSBQYWNrZXRzICovCisKKy8qIFNvbmljcyBTaWxpY29uIGJhY2twbGFuZSByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBCNDRfU0JJTVNUQVRFCQkweDBGOTBVTCAvKiBTQiBJbml0aWF0b3IgQWdlbnQgU3RhdGUgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9QQwkJMHgwMDAwMDAwZiAvKiBQaXBlIENvdW50ICovCisjZGVmaW5lICBTQklNU1RBVEVfQVBfTUFTSwkweDAwMDAwMDMwIC8qIEFyYml0cmF0aW9uIFByaW9yaXR5ICovCisjZGVmaW5lICBTQklNU1RBVEVfQVBfQk9USAkweDAwMDAwMDAwIC8qIGJvdGggdGltZXNsaWNlcyBhbmQgdG9rZW4gKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9BUF9UUwkweDAwMDAwMDEwIC8qIFVzZSB0aW1lc2xpY2VzIG9ubHkgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9BUF9USwkweDAwMDAwMDIwIC8qIFVzZSB0b2tlbiBvbmx5ICovCisjZGVmaW5lICBTQklNU1RBVEVfQVBfUlNWCTB4MDAwMDAwMzAgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9JQkUJCTB4MDAwMjAwMDAgLyogSW4gQmFuZCBFcnJvciAqLworI2RlZmluZSAgU0JJTVNUQVRFX1RPCQkweDAwMDQwMDAwIC8qIFRpbWVvdXQgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9CQUQgICAgICAoIFNCSU1TVEFURV9JQkUgfCBTQklNU1RBVEVfVE8gKQorI2RlZmluZSBCNDRfU0JJTlRWRUMJCTB4MEY5NFVMIC8qIFNCIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lICBTQklOVFZFQ19QQ0kJCTB4MDAwMDAwMDEgLyogRW5hYmxlIGludGVycnVwdHMgZm9yIFBDSSAqLworI2RlZmluZSAgU0JJTlRWRUNfRU5FVDAJCTB4MDAwMDAwMDIgLyogRW5hYmxlIGludHMgZm9yIGVuZXQgMCAqLworI2RlZmluZSAgU0JJTlRWRUNfSUxJTkUyMAkweDAwMDAwMDA0IC8qIEVuYWJsZSBpbnRzIGZvciBpbGluZTIwICovCisjZGVmaW5lICBTQklOVFZFQ19DT0RFQwkJMHgwMDAwMDAwOCAvKiBFbmFibGUgaW50cyBmb3IgdjkwIGNvZGVjICovCisjZGVmaW5lICBTQklOVFZFQ19VU0IJCTB4MDAwMDAwMTAgLyogRW5hYmxlIGludHRzIGZvciB1c2IgKi8KKyNkZWZpbmUgIFNCSU5UVkVDX0VYVElGCQkweDAwMDAwMDIwIC8qIEVuYWJsZSBpbnRzIGZvciBleHQgaS9mICovCisjZGVmaW5lICBTQklOVFZFQ19FTkVUMQkJMHgwMDAwMDA0MCAvKiBFbmFibGUgaW50cyBmb3IgZW5ldCAxICovCisjZGVmaW5lIEI0NF9TQlRNU0xPVwkJMHgwRjk4VUwgLyogU0IgVGFyZ2V0IFN0YXRlIExvdyAqLworI2RlZmluZSAgU0JUTVNMT1dfUkVTRVQJCTB4MDAwMDAwMDEgLyogUmVzZXQgKi8KKyNkZWZpbmUgIFNCVE1TTE9XX1JFSkVDVAkweDAwMDAwMDAyIC8qIFJlamVjdCAqLworI2RlZmluZSAgU0JUTVNMT1dfQ0xPQ0sJCTB4MDAwMTAwMDAgLyogQ2xvY2sgRW5hYmxlICovCisjZGVmaW5lICBTQlRNU0xPV19GR0MJCTB4MDAwMjAwMDAgLyogRm9yY2UgR2F0ZWQgQ2xvY2tzIE9uICovCisjZGVmaW5lICBTQlRNU0xPV19QRQkJMHg0MDAwMDAwMCAvKiBQb3dlciBNYW5hZ2VtZW50IEVuYWJsZSAqLworI2RlZmluZSAgU0JUTVNMT1dfQkUJCTB4ODAwMDAwMDAgLyogQklTVCBFbmFibGUgKi8KKyNkZWZpbmUgQjQ0X1NCVE1TSElHSAkJMHgwRjlDVUwgLyogU0IgVGFyZ2V0IFN0YXRlIEhpZ2ggKi8KKyNkZWZpbmUgIFNCVE1TSElHSF9TRVJSCQkweDAwMDAwMDAxIC8qIFMtZXJyb3IgKi8KKyNkZWZpbmUgIFNCVE1TSElHSF9JTlQJCTB4MDAwMDAwMDIgLyogSW50ZXJydXB0ICovCisjZGVmaW5lICBTQlRNU0hJR0hfQlVTWQkJMHgwMDAwMDAwNCAvKiBCdXN5ICovCisjZGVmaW5lICBTQlRNU0hJR0hfR0NSCQkweDIwMDAwMDAwIC8qIEdhdGVkIENsb2NrIFJlcXVlc3QgKi8KKyNkZWZpbmUgIFNCVE1TSElHSF9CSVNURgkweDQwMDAwMDAwIC8qIEJJU1QgRmFpbGVkICovCisjZGVmaW5lICBTQlRNU0hJR0hfQklTVEQJMHg4MDAwMDAwMCAvKiBCSVNUIERvbmUgKi8KKyNkZWZpbmUgQjQ0X1NCSURISUdICQkweDBGRkNVTCAvKiBTQiBJZGVudGlmaWNhdGlvbiBIaWdoICovCisjZGVmaW5lICBTQklESElHSF9SQ19NQVNLCTB4MDAwMDAwMGYgLyogUmV2aXNpb24gQ29kZSAqLworI2RlZmluZSAgU0JJREhJR0hfQ0NfTUFTSwkweDAwMDBmZmYwIC8qIENvcmUgQ29kZSAqLworI2RlZmluZSAgU0JJREhJR0hfQ0NfU0hJRlQJNAorI2RlZmluZSAgU0JJREhJR0hfVkNfTUFTSwkweGZmZmYwMDAwIC8qIFZlbmRvciBDb2RlICovCisjZGVmaW5lICBTQklESElHSF9WQ19TSElGVAkxNgorCisvKiBTU0IgUENJIGNvbmZpZyBzcGFjZSByZWdpc3RlcnMuICAqLworI2RlZmluZSBTU0JfUE1DU1IJCTB4NDQKKyNkZWZpbmUgIFNTQl9QRQkJCTB4MTAwCisjZGVmaW5lCVNTQl9CQVIwX1dJTgkJMHg4MAorI2RlZmluZQlTU0JfQkFSMV9XSU4JCTB4ODQKKyNkZWZpbmUJU1NCX1NQUk9NX0NPTlRST0wJMHg4OAorI2RlZmluZQlTU0JfQkFSMV9DT05UUk9MCTB4OGMKKworLyogU1NCIGNvcmUgYW5kIGhvc3QgY29udHJvbCByZWdpc3RlcnMuICAqLworI2RlZmluZSBTU0JfQ09OVFJPTAkJMHgwMDAwVUwKKyNkZWZpbmUgU1NCX0FSQkNPTlRST0wJCTB4MDAxMFVMCisjZGVmaW5lIFNTQl9JU1RBVAkJMHgwMDIwVUwKKyNkZWZpbmUgU1NCX0lNQVNLCQkweDAwMjRVTAorI2RlZmluZSBTU0JfTUJPWAkJMHgwMDI4VUwKKyNkZWZpbmUgU1NCX0JDQVNUX0FERFIJCTB4MDA1MFVMCisjZGVmaW5lIFNTQl9CQ0FTVF9EQVRBCQkweDAwNTRVTAorI2RlZmluZSBTU0JfUENJX1RSQU5TXzAJCTB4MDEwMFVMCisjZGVmaW5lIFNTQl9QQ0lfVFJBTlNfMQkJMHgwMTA0VUwKKyNkZWZpbmUgU1NCX1BDSV9UUkFOU18yCQkweDAxMDhVTAorI2RlZmluZSBTU0JfU1BST00JCTB4MDgwMFVMCisKKyNkZWZpbmUgU1NCX1BDSV9NRU0JCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1NCX1BDSV9JTwkJMHgwMDAwMDAwMQorI2RlZmluZSBTU0JfUENJX0NGRzAJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1NCX1BDSV9DRkcxCQkweDAwMDAwMDAzCisjZGVmaW5lIFNTQl9QQ0lfUFJFRgkJMHgwMDAwMDAwNAorI2RlZmluZSBTU0JfUENJX0JVUlNUCQkweDAwMDAwMDA4CisjZGVmaW5lIFNTQl9QQ0lfTUFTSzAJCTB4ZmMwMDAwMDAKKyNkZWZpbmUgU1NCX1BDSV9NQVNLMQkJMHhmYzAwMDAwMAorI2RlZmluZSBTU0JfUENJX01BU0syCQkweGMwMDAwMDAwCisKKy8qIDQ0MDAgUEhZIHJlZ2lzdGVycyAqLworI2RlZmluZSBCNDRfTUlJX0FVWENUUkwJCTI0CS8qIEF1eGlsaWFyeSBDb250cm9sICovCisjZGVmaW5lICBNSUlfQVVYQ1RSTF9EVVBMRVgJMHgwMDAxICAvKiBGdWxsIER1cGxleCAqLworI2RlZmluZSAgTUlJX0FVWENUUkxfU1BFRUQJMHgwMDAyICAvKiAxPTEwME1icHMsIDA9MTBNYnBzICovCisjZGVmaW5lICBNSUlfQVVYQ1RSTF9GT1JDRUQJMHgwMDA0CS8qIEZvcmNlZCAxMC8xMDAgKi8KKyNkZWZpbmUgQjQ0X01JSV9BTEVEQ1RSTAkyNgkvKiBBY3Rpdml0eSBMRUQgKi8KKyNkZWZpbmUgIE1JSV9BTEVEQ1RSTF9BTExNU0sJMHg3ZmZmCisjZGVmaW5lIEI0NF9NSUlfVExFRENUUkwJMjcJLyogVHJhZmZpYyBNZXRlciBMRUQgKi8KKyNkZWZpbmUgIE1JSV9UTEVEQ1RSTF9FTkFCTEUJMHgwMDQwCisKKy8qIFJYL1RYIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBkbWFfZGVzYyB7CisJdTMyIGN0cmw7IC8qIGxlbmd0aCBvZiBkYXRhIGFuZCBmbGFncyAqLworCXUzMiBhZGRyOyAvKiBhZGRyZXNzIG9mIGRhdGEgKi8KK307CisKKy8qIFRoZXJlIGFyZSBvbmx5IDEyIGJpdHMgaW4gdGhlIERNQSBlbmdpbmUgZm9yIGRlc2NyaXB0b3Igb2Zmc2V0dGluZworICogc28gdGhlIHRhYmxlIG11c3QgYmUgYWxpZ25lZCBvbiBhIGJvdW5kYXJ5IG9mIHRoaXMuCisgKi8KKyNkZWZpbmUgQjQ0X0RNQV9BTElHTk1FTlQJNDA5NgorCisvKiBUaGUgRE1BIGVuZ2luZSBjYW4gb25seSBhZGRyZXNzIHRoZSBmaXJzdCBnaWdhYnl0ZSBvZiBhZGRyZXNzIHNwYWNlCisgKi8KKyNkZWZpbmUgQjQ0XzMwQklUX0RNQV9NQVNLCTB4M2ZmZmZmZmYKKworI2RlZmluZSBERVNDX0NUUkxfTEVOCQkweDAwMDAxZmZmCisjZGVmaW5lIERFU0NfQ1RSTF9DTUFTSwkJMHgwZmYwMDAwMCAvKiBDb3JlIHNwZWNpZmljIGJpdHMgKi8KKyNkZWZpbmUgREVTQ19DVFJMX0VPVAkJMHgxMDAwMDAwMCAvKiBFbmQgb2YgVGFibGUgKi8KKyNkZWZpbmUgREVTQ19DVFJMX0lPQwkJMHgyMDAwMDAwMCAvKiBJbnRlcnJ1cHQgT24gQ29tcGxldGlvbiAqLworI2RlZmluZSBERVNDX0NUUkxfRU9GCQkweDQwMDAwMDAwIC8qIEVuZCBvZiBGcmFtZSAqLworI2RlZmluZSBERVNDX0NUUkxfU09GCQkweDgwMDAwMDAwIC8qIFN0YXJ0IG9mIEZyYW1lICovCisKK3N0cnVjdCByeF9oZWFkZXIgeworCXUxNiBsZW47CisJdTE2IGZsYWdzOworCXUxNiBwYWRbMTJdOworfTsKKyNkZWZpbmUgUlhfSEVBREVSX0xFTgkyOAorCisjZGVmaW5lIFJYX0ZMQUdfT0ZJRk8JMHgwMDAwMDAwMSAvKiBGSUZPIE92ZXJmbG93ICovCisjZGVmaW5lIFJYX0ZMQUdfQ1JDRVJSCTB4MDAwMDAwMDIgLyogQ1JDIEVycm9yICovCisjZGVmaW5lIFJYX0ZMQUdfU0VSUgkweDAwMDAwMDA0IC8qIFJlY2VpdmUgU3ltYm9sIEVycm9yICovCisjZGVmaW5lIFJYX0ZMQUdfT0RECTB4MDAwMDAwMDggLyogRnJhbWUgaGFzIG9kZCBudW1iZXIgb2YgbmliYmxlcyAqLworI2RlZmluZSBSWF9GTEFHX0xBUkdFCTB4MDAwMDAwMTAgLyogRnJhbWUgaXMgPiBSWCBNQVggTGVuZ3RoICovCisjZGVmaW5lIFJYX0ZMQUdfTUNBU1QJMHgwMDAwMDAyMCAvKiBEZXN0IGlzIE11bHRpY2FzdCBBZGRyZXNzICovCisjZGVmaW5lIFJYX0ZMQUdfQkNBU1QJMHgwMDAwMDA0MCAvKiBEZXN0IGlzIEJyb2FkY2FzdCBBZGRyZXNzICovCisjZGVmaW5lIFJYX0ZMQUdfTUlTUwkweDAwMDAwMDgwIC8qIFJlY2VpdmVkIGR1ZSB0byBwcm9taXNjIG1vZGUgKi8KKyNkZWZpbmUgUlhfRkxBR19MQVNUCTB4MDAwMDA4MDAgLyogTGFzdCBidWZmZXIgaW4gZnJhbWUgKi8KKyNkZWZpbmUgUlhfRkxBR19FUlJPUlMJKFJYX0ZMQUdfT0REIHwgUlhfRkxBR19TRVJSIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgUlhfRkxBR19DUkNFUlIgfCBSWF9GTEFHX09GSUZPKQorCisvKiBDbGllbnQgTW9kZSBQQ0kgbWVtb3J5IGFjY2VzcyBzcGFjZSAoMSBHQikgKi8KKyNkZWZpbmUgU0JfUENJX0RNQSAgICAgICAgICAgICAgMHg0MDAwMDAwMAorCisgLyogQWRkcmVzcyBvZiBQQ0kgY29yZSBvbiBCQ000NDAwIGNhcmRzICovCisjZGVmaW5lIEJDTTQ0MDBfUENJX0NPUkVfQUREUiAgIDB4MTgwMDIwMDAKKworLyogSGFyZHdhcmUgbWluaW11bSBhbmQgbWF4aW11bSBmb3IgYSBzaW5nbGUgZnJhbWUncyBkYXRhIHBheWxvYWQgKi8KKyNkZWZpbmUgQjQ0X01JTl9NVFUJCTYwCisjZGVmaW5lIEI0NF9NQVhfTVRVCQkxNTAwCisKKyNkZWZpbmUgQjQ0X1JJTkdfU0laRSAgICAgICAgICAgOAorI2RlZmluZSBCNDRfUklOR19MQVNUICAgICAgICAgICAoIEI0NF9SSU5HX1NJWkUgLSAxICkKKworI2RlZmluZSBCNDRfUlhfUklOR19MRU5fQllURVMJKCBzaXplb2YgYnAtPnJ4WzBdICogQjQ0X1JJTkdfU0laRSApCisjZGVmaW5lIEI0NF9UWF9SSU5HX0xFTl9CWVRFUwkoIHNpemVvZiBicC0+dHhbMF0gKiBCNDRfUklOR19TSVpFICkKKworI2RlZmluZSBSWF9QS1RfT0ZGU0VUCQkzMAorI2RlZmluZSBSWF9QS1RfQlVGX1NaCQkoMTUzNiArIFJYX1BLVF9PRkZTRVQgKyA2NCkKKworI2RlZmluZSBCNDRfRlVMTF9SRVNFVAkJMQorI2RlZmluZSBCNDRfRlVMTF9SRVNFVF9TS0lQX1BIWQkyCisjZGVmaW5lIEI0NF9QQVJUSUFMX1JFU0VUCTMKKyNkZWZpbmUgQjQ0X0NISVBfUkVTRVRfRlVMTCAgICAgNAorI2RlZmluZSBCNDRfQ0hJUF9SRVNFVF9QQVJUSUFMICA1CisKKyNkZWZpbmUgU1NCX0NPUkVfRE9XTiAgICAgICAgICAgKCBTQlRNU0xPV19SRVNFVCB8IFNCVE1TTE9XX1JFSkVDVCApCisKKyNkZWZpbmUgQjQ0X1JFR1NfU0laRSAgICAgICAgICAgODE5MgorCisvKiogRHJpdmVyIHByaXZhdGUgc3RhdGUgKi8KK3N0cnVjdCBiNDRfcHJpdmF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldmljZSAqcGNpOworCXU4ICpyZWdzOyAvKiBtZW1vcnktbWFwcGVkIHJlZ2lzdGVycyAqLworCXU4IHBoeV9hZGRyOworCisJc3RydWN0IGRtYV9kZXNjICp0eDsKKwlzdHJ1Y3QgaW9fYnVmZmVyICp0eF9pb2J1ZltCNDRfUklOR19TSVpFXTsKKwl1MzIgdHhfY3VyOyAvKiBuZXh0IGF2YWlsYWJsZSBkZXNjcmlwdG9yICovCisJdTMyIHR4X2RpcnR5OyAvKiBvbGRlc3QgcGVuZGluZyBkZXNjcmlwdG9yICovCisKKwlzdHJ1Y3QgZG1hX2Rlc2MgKnJ4OworCXN0cnVjdCBpb19idWZmZXIgKnJ4X2lvYnVmW0I0NF9SSU5HX1NJWkVdOworCXUzMiByeF9jdXI7IC8qIG5leHQgZGVzY3JpcHRvciB0byByZWFkICovCit9OworCisKK3N0YXRpYyB2b2lkIHNzYl9jb3JlX3Jlc2V0ICggc3RydWN0IGI0NF9wcml2YXRlICpicCApOworc3RhdGljIHZvaWQgc3NiX2NvcmVfZGlzYWJsZSAoIHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAgKTsKK3N0YXRpYyB1MzIgc3NiX3BjaV9zZXR1cCAoIHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAsIHUzMiBjb3JlcyApOworCitzdGF0aWMgdm9pZCBiNDRfY2hpcF9yZXNldCAoIHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAsIGludCByZXNldF9raW5kICk7CitzdGF0aWMgdm9pZCBiNDRfaW5pdF9odyAoIHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAsIGludCByZXNldF9raW5kICk7CitzdGF0aWMgdm9pZCBiNDRfY2FtX3dyaXRlICggc3RydWN0IGI0NF9wcml2YXRlICpicCwgdTggKmRhdGEsIGludCBpbmRleCApOworc3RhdGljIHZvaWQgYjQ0X3NldF9tYWNfYWRkciAoIHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAgKTsKK3N0YXRpYyB2b2lkIGI0NF9zZXRfcnhfbW9kZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKTsKK3N0YXRpYyB2b2lkIGI0NF9oYWx0KHN0cnVjdCBiNDRfcHJpdmF0ZSAqKTsKKworc3RhdGljIGludCBiNDRfcGh5X3Jlc2V0ICggc3RydWN0IGI0NF9wcml2YXRlICpicCApOworc3RhdGljIGludCBiNDRfcGh5X3dyaXRlICggc3RydWN0IGI0NF9wcml2YXRlICpicCwgaW50IHJlZywgdTMyIHZhbCApOworc3RhdGljIGludCBiNDRfcGh5X3JlYWQgKCBzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwLCBpbnQgcmVnLCB1MzIgKnZhbCApOworCitzdGF0aWMgaW50IGI0NF9pbml0X3R4X3JpbmcgKCBzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwICk7CitzdGF0aWMgdm9pZCBiNDRfZnJlZV90eF9yaW5nICggc3RydWN0IGI0NF9wcml2YXRlICpicCApOworc3RhdGljIGludCBiNDRfaW5pdF9yeF9yaW5nICggc3RydWN0IGI0NF9wcml2YXRlICpicCApOworc3RhdGljIHZvaWQgYjQ0X2ZyZWVfcnhfcmluZyAoIHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAgKTsKK3N0YXRpYyB2b2lkIGI0NF9yeF9yZWZpbGwgKCBzdHJ1Y3QgYjQ0X3ByaXZhdGUgKmJwLCB1MzIgcGVuZGluZyApOworc3RhdGljIHZvaWQgYjQ0X3BvcHVsYXRlX3J4X2Rlc2NyaXB0b3IgKHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAsIHUzMiBpbmRleCk7CisKK3N0YXRpYyBpbnQgYjQ0X3Byb2JlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkICk7CitzdGF0aWMgdm9pZCBiNDRfcmVtb3ZlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApOworCitzdGF0aWMgaW50IGI0NF9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworc3RhdGljIHZvaWQgYjQ0X2Nsb3NlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworc3RhdGljIHZvaWQgYjQ0X2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBlbmFibGUgKTsKK3N0YXRpYyB2b2lkIGI0NF9wb2xsICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworc3RhdGljIHZvaWQgYjQ0X3Byb2Nlc3NfcnhfcGFja2V0cyAoIHN0cnVjdCBiNDRfcHJpdmF0ZSAqYnAgKTsKK3N0YXRpYyBpbnQgYjQ0X3RyYW5zbWl0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgYjQ0X29wZXJhdGlvbnM7CisKKyNlbmRpZiAvKiBfQjQ0X0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2JueDIuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2JueDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzg1ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYm54Mi5jCkBAIC0wLDAgKzEsMjY5NyBAQAorLyogYm54Mi5jOiBCcm9hZGNvbSBOWDIgbmV0d29yayBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1LCAyMDA2IEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFdyaXR0ZW4gYnk6IE1pY2hhZWwgQ2hhbiAgKG1jaGFuQGJyb2FkY29tLmNvbSkKKyAqCisgKiBFdGhlcmJvb3QgcG9ydCBieSBSeWFuIEphY2tzb24gKHJqYWNrc29uQGxueGkuY29tKSwgYmFzZWQgb24gZHJpdmVyCisgKiB2ZXJzaW9uIDEuNC40MCBmcm9tIGxpbnV4IDIuNi4xNworICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTF9BTlkgKTsKKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSA8bWlpLmg+CisjaW5jbHVkZSAiYm54Mi5oIgorI2luY2x1ZGUgImJueDJfZncuaCIKKworI2lmIDAKKy8qIER1bW15IGRlZmluZXMgZm9yIGVycm9yIGhhbmRsaW5nICovCisjZGVmaW5lIEVCVVNZICAxCisjZGVmaW5lIEVOT0RFViAyCisjZGVmaW5lIEVJTlZBTCAzCisjZGVmaW5lIEVOT01FTSA0CisjZGVmaW5lIEVJTyAgICA1CisjZW5kaWYKKworLyogVGhlIGJueDIgc2VlbXMgdG8gYmUgcGlja3kgYWJvdXQgdGhlIGFsaWdubWVudCBvZiB0aGUgcmVjZWl2ZSBidWZmZXJzCisgKiBhbmQgcG9zc2libHkgdGhlIHN0YXR1cyBibG9jay4KKyAqLworc3RhdGljIHN0cnVjdCBic3MgeworCXN0cnVjdCB0eF9iZCB0eF9kZXNjX3JpbmdbVFhfREVTQ19DTlRdOworCXN0cnVjdCByeF9iZCByeF9kZXNjX3JpbmdbUlhfREVTQ19DTlRdOworCXVuc2lnbmVkIGNoYXIgcnhfYnVmW1JYX0JVRl9DTlRdW1JYX0JVRl9TSVpFXTsKKwlzdHJ1Y3Qgc3RhdHVzX2Jsb2NrIHN0YXR1c19ibGs7CisJc3RydWN0IHN0YXRpc3RpY3NfYmxvY2sgc3RhdHNfYmxrOworfSBibngyX2JzczsKKworc3RhdGljIHN0cnVjdCBibngyIGJueDI7CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfc3BlYyBmbGFzaF90YWJsZVtdID0KK3sKKwkvKiBTbG93IEVFUFJPTSAqLworCXsweDAwMDAwMDAwLCAweDQwODMwMzgwLCAweDAwOWYwMDgxLCAweGExODRhMDUzLCAweGFmMDAwNDAwLAorCSAxLCBTRUVQUk9NX1BBR0VfQklUUywgU0VFUFJPTV9QQUdFX1NJWkUsCisJIFNFRVBST01fQllURV9BRERSX01BU0ssIFNFRVBST01fVE9UQUxfU0laRSwKKwkgIkVFUFJPTSAtIHNsb3cifSwKKwkvKiBFeHBhbnNpb24gZW50cnkgMDAwMSAqLworCXsweDA4MDAwMDAyLCAweDRiODA4MjAxLCAweDAwMDUwMDgxLCAweDAzODQwMjUzLCAweGFmMDIwNDA2LAorCSAwLCBTQUlGVU5fRkxBU0hfUEFHRV9CSVRTLCBTQUlGVU5fRkxBU0hfUEFHRV9TSVpFLAorCSBTQUlGVU5fRkxBU0hfQllURV9BRERSX01BU0ssIDAsCisJICJFbnRyeSAwMDAxIn0sCisJLyogU2FpZnVuIFNBMjVGMDEwIChub24tYnVmZmVyZWQgZmxhc2gpICovCisJLyogc3RyYXAsIGNmZzEsICYgd3JpdGUxIG5lZWQgdXBkYXRlcyAqLworCXsweDA0MDAwMDAxLCAweDQ3ODA4MjAxLCAweDAwMDUwMDgxLCAweDAzODQwMjUzLCAweGFmMDIwNDA2LAorCSAwLCBTQUlGVU5fRkxBU0hfUEFHRV9CSVRTLCBTQUlGVU5fRkxBU0hfUEFHRV9TSVpFLAorCSBTQUlGVU5fRkxBU0hfQllURV9BRERSX01BU0ssIFNBSUZVTl9GTEFTSF9CQVNFX1RPVEFMX1NJWkUqMiwKKwkgIk5vbi1idWZmZXJlZCBmbGFzaCAoMTI4a0IpIn0sCisJLyogU2FpZnVuIFNBMjVGMDIwIChub24tYnVmZmVyZWQgZmxhc2gpICovCisJLyogc3RyYXAsIGNmZzEsICYgd3JpdGUxIG5lZWQgdXBkYXRlcyAqLworCXsweDBjMDAwMDAzLCAweDRmODA4MjAxLCAweDAwMDUwMDgxLCAweDAzODQwMjUzLCAweGFmMDIwNDA2LAorCSAwLCBTQUlGVU5fRkxBU0hfUEFHRV9CSVRTLCBTQUlGVU5fRkxBU0hfUEFHRV9TSVpFLAorCSBTQUlGVU5fRkxBU0hfQllURV9BRERSX01BU0ssIFNBSUZVTl9GTEFTSF9CQVNFX1RPVEFMX1NJWkUqNCwKKwkgIk5vbi1idWZmZXJlZCBmbGFzaCAoMjU2a0IpIn0sCisJLyogRXhwYW5zaW9uIGVudHJ5IDAxMDAgKi8KKwl7MHgxMTAwMDAwMCwgMHg1MzgwODIwMSwgMHgwMDA1MDA4MSwgMHgwMzg0MDI1MywgMHhhZjAyMDQwNiwKKwkgMCwgU0FJRlVOX0ZMQVNIX1BBR0VfQklUUywgU0FJRlVOX0ZMQVNIX1BBR0VfU0laRSwKKwkgU0FJRlVOX0ZMQVNIX0JZVEVfQUREUl9NQVNLLCAwLAorCSAiRW50cnkgMDEwMCJ9LAorCS8qIEVudHJ5IDAxMDE6IFNUIE00NVBFMTAgKG5vbi1idWZmZXJlZCBmbGFzaCwgVGV0b25JSSBCMCkgKi8KKwl7MHgxOTAwMDAwMiwgMHg1YjgwODIwMSwgMHgwMDA1MDBkYiwgMHgwMzg0MDI1MywgMHhhZjAyMDQwNiwgICAgICAgIAorCSAwLCBTVF9NSUNST19GTEFTSF9QQUdFX0JJVFMsIFNUX01JQ1JPX0ZMQVNIX1BBR0VfU0laRSwKKwkgU1RfTUlDUk9fRkxBU0hfQllURV9BRERSX01BU0ssIFNUX01JQ1JPX0ZMQVNIX0JBU0VfVE9UQUxfU0laRSoyLAorCSAiRW50cnkgMDEwMTogU1QgTTQ1UEUxMCAoMTI4a0Igbm9uLWJ1ZmZlcnJlZCkifSwKKwkvKiBFbnRyeSAwMTEwOiBTVCBNNDVQRTIwIChub24tYnVmZmVyZWQgZmxhc2gpKi8KKwl7MHgxNTAwMDAwMSwgMHg1NzgwODIwMSwgMHgwMDA1MDBkYiwgMHgwMzg0MDI1MywgMHhhZjAyMDQwNiwKKwkgMCwgU1RfTUlDUk9fRkxBU0hfUEFHRV9CSVRTLCBTVF9NSUNST19GTEFTSF9QQUdFX1NJWkUsCisJIFNUX01JQ1JPX0ZMQVNIX0JZVEVfQUREUl9NQVNLLCBTVF9NSUNST19GTEFTSF9CQVNFX1RPVEFMX1NJWkUqNCwKKwkgIkVudHJ5IDAxMTA6IFNUIE00NVBFMjAgKDI1NmtCIG5vbi1idWZmZXJyZWQpIn0sCisJLyogU2FpZnVuIFNBMjVGMDA1IChub24tYnVmZmVyZWQgZmxhc2gpICovCisJLyogc3RyYXAsIGNmZzEsICYgd3JpdGUxIG5lZWQgdXBkYXRlcyAqLworCXsweDFkMDAwMDAzLCAweDVmODA4MjAxLCAweDAwMDUwMDgxLCAweDAzODQwMjUzLCAweGFmMDIwNDA2LAorCSAwLCBTQUlGVU5fRkxBU0hfUEFHRV9CSVRTLCBTQUlGVU5fRkxBU0hfUEFHRV9TSVpFLAorCSBTQUlGVU5fRkxBU0hfQllURV9BRERSX01BU0ssIFNBSUZVTl9GTEFTSF9CQVNFX1RPVEFMX1NJWkUsCisJICJOb24tYnVmZmVyZWQgZmxhc2ggKDY0a0IpIn0sCisJLyogRmFzdCBFRVBST00gKi8KKwl7MHgyMjAwMDAwMCwgMHg2MjgwODM4MCwgMHgwMDlmMDA4MSwgMHhhMTg0YTA1MywgMHhhZjAwMDQwMCwKKwkgMSwgU0VFUFJPTV9QQUdFX0JJVFMsIFNFRVBST01fUEFHRV9TSVpFLAorCSBTRUVQUk9NX0JZVEVfQUREUl9NQVNLLCBTRUVQUk9NX1RPVEFMX1NJWkUsCisJICJFRVBST00gLSBmYXN0In0sCisJLyogRXhwYW5zaW9uIGVudHJ5IDEwMDEgKi8KKwl7MHgyYTAwMDAwMiwgMHg2YjgwODIwMSwgMHgwMDA1MDA4MSwgMHgwMzg0MDI1MywgMHhhZjAyMDQwNiwKKwkgMCwgU0FJRlVOX0ZMQVNIX1BBR0VfQklUUywgU0FJRlVOX0ZMQVNIX1BBR0VfU0laRSwKKwkgU0FJRlVOX0ZMQVNIX0JZVEVfQUREUl9NQVNLLCAwLAorCSAiRW50cnkgMTAwMSJ9LAorCS8qIEV4cGFuc2lvbiBlbnRyeSAxMDEwICovCisJezB4MjYwMDAwMDEsIDB4Njc4MDgyMDEsIDB4MDAwNTAwODEsIDB4MDM4NDAyNTMsIDB4YWYwMjA0MDYsCisJIDAsIFNBSUZVTl9GTEFTSF9QQUdFX0JJVFMsIFNBSUZVTl9GTEFTSF9QQUdFX1NJWkUsCisJIFNBSUZVTl9GTEFTSF9CWVRFX0FERFJfTUFTSywgMCwKKwkgIkVudHJ5IDEwMTAifSwKKwkvKiBBVE1FTCBBVDQ1REIwMTFCIChidWZmZXJlZCBmbGFzaCkgKi8KKwl7MHgyZTAwMDAwMywgMHg2ZTgwODI3MywgMHgwMDU3MDA4MSwgMHg2ODg0ODM1MywgMHhhZjAwMDQwMCwKKwkgMSwgQlVGRkVSRURfRkxBU0hfUEFHRV9CSVRTLCBCVUZGRVJFRF9GTEFTSF9QQUdFX1NJWkUsCisJIEJVRkZFUkVEX0ZMQVNIX0JZVEVfQUREUl9NQVNLLCBCVUZGRVJFRF9GTEFTSF9UT1RBTF9TSVpFLAorCSAiQnVmZmVyZWQgZmxhc2ggKDEyOGtCKSJ9LAorCS8qIEV4cGFuc2lvbiBlbnRyeSAxMTAwICovCisJezB4MzMwMDAwMDAsIDB4NzM4MDgyMDEsIDB4MDAwNTAwODEsIDB4MDM4NDAyNTMsIDB4YWYwMjA0MDYsCisJIDAsIFNBSUZVTl9GTEFTSF9QQUdFX0JJVFMsIFNBSUZVTl9GTEFTSF9QQUdFX1NJWkUsCisJIFNBSUZVTl9GTEFTSF9CWVRFX0FERFJfTUFTSywgMCwKKwkgIkVudHJ5IDExMDAifSwKKwkvKiBFeHBhbnNpb24gZW50cnkgMTEwMSAqLworCXsweDNiMDAwMDAyLCAweDdiODA4MjAxLCAweDAwMDUwMDgxLCAweDAzODQwMjUzLCAweGFmMDIwNDA2LAorCSAwLCBTQUlGVU5fRkxBU0hfUEFHRV9CSVRTLCBTQUlGVU5fRkxBU0hfUEFHRV9TSVpFLAorCSBTQUlGVU5fRkxBU0hfQllURV9BRERSX01BU0ssIDAsCisJICJFbnRyeSAxMTAxIn0sCisJLyogQXRlbWwgRXhwYW5zaW9uIGVudHJ5IDExMTAgKi8KKwl7MHgzNzAwMDAwMSwgMHg3NjgwODI3MywgMHgwMDU3MDA4MSwgMHg2ODg0ODM1MywgMHhhZjAwMDQwMCwKKwkgMSwgQlVGRkVSRURfRkxBU0hfUEFHRV9CSVRTLCBCVUZGRVJFRF9GTEFTSF9QQUdFX1NJWkUsCisJIEJVRkZFUkVEX0ZMQVNIX0JZVEVfQUREUl9NQVNLLCAwLAorCSAiRW50cnkgMTExMCAoQXRtZWwpIn0sCisJLyogQVRNRUwgQVQ0NURCMDIxQiAoYnVmZmVyZWQgZmxhc2gpICovCisJezB4M2YwMDAwMDMsIDB4N2U4MDgyNzMsIDB4MDA1NzAwODEsIDB4Njg4NDgzNTMsIDB4YWYwMDA0MDAsCisJIDEsIEJVRkZFUkVEX0ZMQVNIX1BBR0VfQklUUywgQlVGRkVSRURfRkxBU0hfUEFHRV9TSVpFLAorCSBCVUZGRVJFRF9GTEFTSF9CWVRFX0FERFJfTUFTSywgQlVGRkVSRURfRkxBU0hfVE9UQUxfU0laRSoyLAorCSAiQnVmZmVyZWQgZmxhc2ggKDI1NmtCKSJ9LAorfTsKKworc3RhdGljIHUzMgorYm54Ml9yZWdfcmRfaW5kKHN0cnVjdCBibngyICpicCwgdTMyIG9mZnNldCkKK3sKKwlSRUdfV1IoYnAsIEJOWDJfUENJQ0ZHX1JFR19XSU5ET1dfQUREUkVTUywgb2Zmc2V0KTsKKwlyZXR1cm4gKFJFR19SRChicCwgQk5YMl9QQ0lDRkdfUkVHX1dJTkRPVykpOworfQorCitzdGF0aWMgdm9pZAorYm54Ml9yZWdfd3JfaW5kKHN0cnVjdCBibngyICpicCwgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3sKKwlSRUdfV1IoYnAsIEJOWDJfUENJQ0ZHX1JFR19XSU5ET1dfQUREUkVTUywgb2Zmc2V0KTsKKwlSRUdfV1IoYnAsIEJOWDJfUENJQ0ZHX1JFR19XSU5ET1csIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitibngyX2N0eF93cihzdHJ1Y3QgYm54MiAqYnAsIHUzMiBjaWRfYWRkciwgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3sKKwlvZmZzZXQgKz0gY2lkX2FkZHI7CisJUkVHX1dSKGJwLCBCTlgyX0NUWF9EQVRBX0FEUiwgb2Zmc2V0KTsKKwlSRUdfV1IoYnAsIEJOWDJfQ1RYX0RBVEEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfcmVhZF9waHkoc3RydWN0IGJueDIgKmJwLCB1MzIgcmVnLCB1MzIgKnZhbCkKK3sKKwl1MzIgdmFsMTsKKwlpbnQgaSwgcmV0OworCisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfSU5UX01PREVfQVVUT19QT0xMSU5HX0ZMQUcpIHsKKwkJdmFsMSA9IFJFR19SRChicCwgQk5YMl9FTUFDX01ESU9fTU9ERSk7CisJCXZhbDEgJj0gfkJOWDJfRU1BQ19NRElPX01PREVfQVVUT19QT0xMOworCisJCVJFR19XUihicCwgQk5YMl9FTUFDX01ESU9fTU9ERSwgdmFsMSk7CisJCVJFR19SRChicCwgQk5YMl9FTUFDX01ESU9fTU9ERSk7CisKKwkJdWRlbGF5KDQwKTsKKwl9CisKKwl2YWwxID0gKGJwLT5waHlfYWRkciA8PCAyMSkgfCAocmVnIDw8IDE2KSB8CisJCUJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORF9SRUFEIHwgQk5YMl9FTUFDX01ESU9fQ09NTV9ESVNFWFQgfAorCQlCTlgyX0VNQUNfTURJT19DT01NX1NUQVJUX0JVU1k7CisJUkVHX1dSKGJwLCBCTlgyX0VNQUNfTURJT19DT01NLCB2YWwxKTsKKworCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisJCXVkZWxheSgxMCk7CisKKwkJdmFsMSA9IFJFR19SRChicCwgQk5YMl9FTUFDX01ESU9fQ09NTSk7CisJCWlmICghKHZhbDEgJiBCTlgyX0VNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpKSB7CisJCQl1ZGVsYXkoNSk7CisKKwkJCXZhbDEgPSBSRUdfUkQoYnAsIEJOWDJfRU1BQ19NRElPX0NPTU0pOworCQkJdmFsMSAmPSBCTlgyX0VNQUNfTURJT19DT01NX0RBVEE7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHZhbDEgJiBCTlgyX0VNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpIHsKKwkJKnZhbCA9IDB4MDsKKwkJcmV0ID0gLUVCVVNZOworCX0KKwllbHNlIHsKKwkJKnZhbCA9IHZhbDE7CisJCXJldCA9IDA7CisJfQorCisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfSU5UX01PREVfQVVUT19QT0xMSU5HX0ZMQUcpIHsKKwkJdmFsMSA9IFJFR19SRChicCwgQk5YMl9FTUFDX01ESU9fTU9ERSk7CisJCXZhbDEgfD0gQk5YMl9FTUFDX01ESU9fTU9ERV9BVVRPX1BPTEw7CisKKwkJUkVHX1dSKGJwLCBCTlgyX0VNQUNfTURJT19NT0RFLCB2YWwxKTsKKwkJUkVHX1JEKGJwLCBCTlgyX0VNQUNfTURJT19NT0RFKTsKKworCQl1ZGVsYXkoNDApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfd3JpdGVfcGh5KHN0cnVjdCBibngyICpicCwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwl1MzIgdmFsMTsKKwlpbnQgaSwgcmV0OworCisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfSU5UX01PREVfQVVUT19QT0xMSU5HX0ZMQUcpIHsKKwkJdmFsMSA9IFJFR19SRChicCwgQk5YMl9FTUFDX01ESU9fTU9ERSk7CisJCXZhbDEgJj0gfkJOWDJfRU1BQ19NRElPX01PREVfQVVUT19QT0xMOworCisJCVJFR19XUihicCwgQk5YMl9FTUFDX01ESU9fTU9ERSwgdmFsMSk7CisJCVJFR19SRChicCwgQk5YMl9FTUFDX01ESU9fTU9ERSk7CisKKwkJdWRlbGF5KDQwKTsKKwl9CisKKwl2YWwxID0gKGJwLT5waHlfYWRkciA8PCAyMSkgfCAocmVnIDw8IDE2KSB8IHZhbCB8CisJCUJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORF9XUklURSB8CisJCUJOWDJfRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSB8IEJOWDJfRU1BQ19NRElPX0NPTU1fRElTRVhUOworCVJFR19XUihicCwgQk5YMl9FTUFDX01ESU9fQ09NTSwgdmFsMSk7CisgICAgCisJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsKKwkJdWRlbGF5KDEwKTsKKworCQl2YWwxID0gUkVHX1JEKGJwLCBCTlgyX0VNQUNfTURJT19DT01NKTsKKwkJaWYgKCEodmFsMSAmIEJOWDJfRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkpIHsKKwkJCXVkZWxheSg1KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHZhbDEgJiBCTlgyX0VNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpCisgICAgICAgIAlyZXQgPSAtRUJVU1k7CisJZWxzZQorCQlyZXQgPSAwOworCisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfSU5UX01PREVfQVVUT19QT0xMSU5HX0ZMQUcpIHsKKwkJdmFsMSA9IFJFR19SRChicCwgQk5YMl9FTUFDX01ESU9fTU9ERSk7CisJCXZhbDEgfD0gQk5YMl9FTUFDX01ESU9fTU9ERV9BVVRPX1BPTEw7CisKKwkJUkVHX1dSKGJwLCBCTlgyX0VNQUNfTURJT19NT0RFLCB2YWwxKTsKKwkJUkVHX1JEKGJwLCBCTlgyX0VNQUNfTURJT19NT0RFKTsKKworCQl1ZGVsYXkoNDApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitibngyX2Rpc2FibGVfaW50KHN0cnVjdCBibngyICpicCkKK3sKKwlSRUdfV1IoYnAsIEJOWDJfUENJQ0ZHX0lOVF9BQ0tfQ01ELAorCSAgICAgICBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9NQVNLX0lOVCk7CisJUkVHX1JEKGJwLCBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRCk7CisKK30KKworc3RhdGljIGludAorYm54Ml9hbGxvY19tZW0oc3RydWN0IGJueDIgKmJwKQoreworCWJwLT50eF9kZXNjX3JpbmcgPSBibngyX2Jzcy50eF9kZXNjX3Jpbmc7CisJYnAtPnR4X2Rlc2NfbWFwcGluZyA9IHZpcnRfdG9fYnVzKGJwLT50eF9kZXNjX3JpbmcpOworCisJYnAtPnJ4X2Rlc2NfcmluZyA9IGJueDJfYnNzLnJ4X2Rlc2NfcmluZzsKKwltZW1zZXQoYnAtPnJ4X2Rlc2NfcmluZywgMCwgc2l6ZW9mKHN0cnVjdCByeF9iZCkgKiBSWF9ERVNDX0NOVCk7CisJYnAtPnJ4X2Rlc2NfbWFwcGluZyA9IHZpcnRfdG9fYnVzKGJwLT5yeF9kZXNjX3JpbmcpOworCisJbWVtc2V0KCZibngyX2Jzcy5zdGF0dXNfYmxrLCAwLCBzaXplb2Yoc3RydWN0IHN0YXR1c19ibG9jaykpOworCWJwLT5zdGF0dXNfYmxrID0gJmJueDJfYnNzLnN0YXR1c19ibGs7CisJYnAtPnN0YXR1c19ibGtfbWFwcGluZyA9IHZpcnRfdG9fYnVzKCZibngyX2Jzcy5zdGF0dXNfYmxrKTsKKworCWJwLT5zdGF0c19ibGsgPSAmYm54Ml9ic3Muc3RhdHNfYmxrOworCW1lbXNldCgmYm54Ml9ic3Muc3RhdHNfYmxrLCAwLCBzaXplb2Yoc3RydWN0IHN0YXRpc3RpY3NfYmxvY2spKTsKKwlicC0+c3RhdHNfYmxrX21hcHBpbmcgPSB2aXJ0X3RvX2J1cygmYm54Ml9ic3Muc3RhdHNfYmxrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYm54Ml9yZXBvcnRfZndfbGluayhzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIGZ3X2xpbmtfc3RhdHVzID0gMDsKKworCWlmIChicC0+bGlua191cCkgeworCQl1MzIgYm1zcjsKKworCQlzd2l0Y2ggKGJwLT5saW5lX3NwZWVkKSB7CisJCWNhc2UgU1BFRURfMTA6CisJCQlpZiAoYnAtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJCQlmd19saW5rX3N0YXR1cyA9IEJOWDJfTElOS19TVEFUVVNfMTBIQUxGOworCQkJZWxzZQorCQkJCWZ3X2xpbmtfc3RhdHVzID0gQk5YMl9MSU5LX1NUQVRVU18xMEZVTEw7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQlpZiAoYnAtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJCQlmd19saW5rX3N0YXR1cyA9IEJOWDJfTElOS19TVEFUVVNfMTAwSEFMRjsKKwkJCWVsc2UKKwkJCQlmd19saW5rX3N0YXR1cyA9IEJOWDJfTElOS19TVEFUVVNfMTAwRlVMTDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDA6CisJCQlpZiAoYnAtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJCQlmd19saW5rX3N0YXR1cyA9IEJOWDJfTElOS19TVEFUVVNfMTAwMEhBTEY7CisJCQllbHNlCisJCQkJZndfbGlua19zdGF0dXMgPSBCTlgyX0xJTktfU1RBVFVTXzEwMDBGVUxMOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMjUwMDoKKwkJCWlmIChicC0+ZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQkJCWZ3X2xpbmtfc3RhdHVzID0gQk5YMl9MSU5LX1NUQVRVU18yNTAwSEFMRjsKKwkJCWVsc2UKKwkJCQlmd19saW5rX3N0YXR1cyA9IEJOWDJfTElOS19TVEFUVVNfMjUwMEZVTEw7CisJCQlicmVhazsKKwkJfQorCisJCWZ3X2xpbmtfc3RhdHVzIHw9IEJOWDJfTElOS19TVEFUVVNfTElOS19VUDsKKworCQlpZiAoYnAtPmF1dG9uZWcpIHsKKwkJCWZ3X2xpbmtfc3RhdHVzIHw9IEJOWDJfTElOS19TVEFUVVNfQU5fRU5BQkxFRDsKKworCQkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNU1IsICZibXNyKTsKKwkJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTVNSLCAmYm1zcik7CisKKwkJCWlmICghKGJtc3IgJiBCTVNSX0FORUdDT01QTEVURSkgfHwKKwkJCSAgICBicC0+cGh5X2ZsYWdzICYgUEhZX1BBUkFMTEVMX0RFVEVDVF9GTEFHKQorCQkJCWZ3X2xpbmtfc3RhdHVzIHw9IEJOWDJfTElOS19TVEFUVVNfUEFSQUxMRUxfREVUOworCQkJZWxzZQorCQkJCWZ3X2xpbmtfc3RhdHVzIHw9IEJOWDJfTElOS19TVEFUVVNfQU5fQ09NUExFVEU7CisJCX0KKwl9CisJZWxzZQorCQlmd19saW5rX3N0YXR1cyA9IEJOWDJfTElOS19TVEFUVVNfTElOS19ET1dOOworCisJUkVHX1dSX0lORChicCwgYnAtPnNobWVtX2Jhc2UgKyBCTlgyX0xJTktfU1RBVFVTLCBmd19saW5rX3N0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCitibngyX3JlcG9ydF9saW5rKHN0cnVjdCBibngyICpicCkKK3sKKwlpZiAoYnAtPmxpbmtfdXApIHsKKwkJcHJpbnRmKCJOSUMgTGluayBpcyBVcCwgIik7CisKKwkJcHJpbnRmKCIlZCBNYnBzICIsIGJwLT5saW5lX3NwZWVkKTsKKworCQlpZiAoYnAtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCXByaW50ZigiZnVsbCBkdXBsZXgiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJoYWxmIGR1cGxleCIpOworCisJCWlmIChicC0+Zmxvd19jdHJsKSB7CisJCQlpZiAoYnAtPmZsb3dfY3RybCAmIEZMT1dfQ1RSTF9SWCkgeworCQkJCXByaW50ZigiLCByZWNlaXZlICIpOworCQkJCWlmIChicC0+Zmxvd19jdHJsICYgRkxPV19DVFJMX1RYKQorCQkJCQlwcmludGYoIiYgdHJhbnNtaXQgIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwcmludGYoIiwgdHJhbnNtaXQgIik7CisJCQl9CisJCQlwcmludGYoImZsb3cgY29udHJvbCBPTiIpOworCQl9CisJCXByaW50ZigiXG4iKTsKKwl9CisJZWxzZSB7CisJCXByaW50ZigiTklDIExpbmsgaXMgRG93blxuIik7CisJfQorCisJYm54Ml9yZXBvcnRfZndfbGluayhicCk7Cit9CisKK3N0YXRpYyB2b2lkCitibngyX3Jlc29sdmVfZmxvd19jdHJsKHN0cnVjdCBibngyICpicCkKK3sKKwl1MzIgbG9jYWxfYWR2LCByZW1vdGVfYWR2OworCisJYnAtPmZsb3dfY3RybCA9IDA7CisJaWYgKChicC0+YXV0b25lZyAmIChBVVRPTkVHX1NQRUVEIHwgQVVUT05FR19GTE9XX0NUUkwpKSAhPSAKKwkJKEFVVE9ORUdfU1BFRUQgfCBBVVRPTkVHX0ZMT1dfQ1RSTCkpIHsKKworCQlpZiAoYnAtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgeworCQkJYnAtPmZsb3dfY3RybCA9IGJwLT5yZXFfZmxvd19jdHJsOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoYnAtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkgeworCQlyZXR1cm47CisJfQorCisJaWYgKChicC0+cGh5X2ZsYWdzICYgUEhZX1NFUkRFU19GTEFHKSAmJgorCSAgICAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDgpKSB7CisJCXUzMiB2YWw7CisKKwkJYm54Ml9yZWFkX3BoeShicCwgQkNNNTcwOFNfMTAwMFhfU1RBVDEsICZ2YWwpOworCQlpZiAodmFsICYgQkNNNTcwOFNfMTAwMFhfU1RBVDFfVFhfUEFVU0UpCisJCQlicC0+Zmxvd19jdHJsIHw9IEZMT1dfQ1RSTF9UWDsKKwkJaWYgKHZhbCAmIEJDTTU3MDhTXzEwMDBYX1NUQVQxX1JYX1BBVVNFKQorCQkJYnAtPmZsb3dfY3RybCB8PSBGTE9XX0NUUkxfUlg7CisJCXJldHVybjsKKwl9CisKKwlibngyX3JlYWRfcGh5KGJwLCBNSUlfQURWRVJUSVNFLCAmbG9jYWxfYWR2KTsKKwlibngyX3JlYWRfcGh5KGJwLCBNSUlfTFBBLCAmcmVtb3RlX2Fkdik7CisKKwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9TRVJERVNfRkxBRykgeworCQl1MzIgbmV3X2xvY2FsX2FkdiA9IDA7CisJCXUzMiBuZXdfcmVtb3RlX2FkdiA9IDA7CisKKwkJaWYgKGxvY2FsX2FkdiAmIEFEVkVSVElTRV8xMDAwWFBBVVNFKQorCQkJbmV3X2xvY2FsX2FkdiB8PSBBRFZFUlRJU0VfUEFVU0VfQ0FQOworCQlpZiAobG9jYWxfYWR2ICYgQURWRVJUSVNFXzEwMDBYUFNFX0FTWU0pCisJCQluZXdfbG9jYWxfYWR2IHw9IEFEVkVSVElTRV9QQVVTRV9BU1lNOworCQlpZiAocmVtb3RlX2FkdiAmIEFEVkVSVElTRV8xMDAwWFBBVVNFKQorCQkJbmV3X3JlbW90ZV9hZHYgfD0gQURWRVJUSVNFX1BBVVNFX0NBUDsKKwkJaWYgKHJlbW90ZV9hZHYgJiBBRFZFUlRJU0VfMTAwMFhQU0VfQVNZTSkKKwkJCW5ld19yZW1vdGVfYWR2IHw9IEFEVkVSVElTRV9QQVVTRV9BU1lNOworCisJCWxvY2FsX2FkdiA9IG5ld19sb2NhbF9hZHY7CisJCXJlbW90ZV9hZHYgPSBuZXdfcmVtb3RlX2FkdjsKKwl9CisKKwkvKiBTZWUgVGFibGUgMjhCLTMgb2YgODAyLjNhYi0xOTk5IHNwZWMuICovCisJaWYgKGxvY2FsX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9DQVApIHsKKwkJaWYobG9jYWxfYWR2ICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pIHsKKwkgICAgICAgICAgICAgICAgaWYgKHJlbW90ZV9hZHYgJiBBRFZFUlRJU0VfUEFVU0VfQ0FQKSB7CisJCQkJYnAtPmZsb3dfY3RybCA9IEZMT1dfQ1RSTF9UWCB8IEZMT1dfQ1RSTF9SWDsKKwkJCX0KKwkJCWVsc2UgaWYgKHJlbW90ZV9hZHYgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgeworCQkJCWJwLT5mbG93X2N0cmwgPSBGTE9XX0NUUkxfUlg7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAocmVtb3RlX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9DQVApIHsKKwkJCQlicC0+Zmxvd19jdHJsID0gRkxPV19DVFJMX1RYIHwgRkxPV19DVFJMX1JYOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKGxvY2FsX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSB7CisJCWlmICgocmVtb3RlX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9DQVApICYmCisJCQkocmVtb3RlX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSkgeworCisJCQlicC0+Zmxvd19jdHJsID0gRkxPV19DVFJMX1RYOworCQl9CisJfQorfQorCitzdGF0aWMgaW50CitibngyXzU3MDhzX2xpbmt1cChzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIHZhbDsKKworCWJwLT5saW5rX3VwID0gMTsKKwlibngyX3JlYWRfcGh5KGJwLCBCQ001NzA4U18xMDAwWF9TVEFUMSwgJnZhbCk7CisJc3dpdGNoICh2YWwgJiBCQ001NzA4U18xMDAwWF9TVEFUMV9TUEVFRF9NQVNLKSB7CisJCWNhc2UgQkNNNTcwOFNfMTAwMFhfU1RBVDFfU1BFRURfMTA6CisJCQlicC0+bGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQkJYnJlYWs7CisJCWNhc2UgQkNNNTcwOFNfMTAwMFhfU1RBVDFfU1BFRURfMTAwOgorCQkJYnAtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBCQ001NzA4U18xMDAwWF9TVEFUMV9TUEVFRF8xRzoKKwkJCWJwLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDsKKwkJCWJyZWFrOworCQljYXNlIEJDTTU3MDhTXzEwMDBYX1NUQVQxX1NQRUVEXzJHNToKKwkJCWJwLT5saW5lX3NwZWVkID0gU1BFRURfMjUwMDsKKwkJCWJyZWFrOworCX0KKwlpZiAodmFsICYgQkNNNTcwOFNfMTAwMFhfU1RBVDFfRkQpCisJCWJwLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwllbHNlCisJCWJwLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitibngyXzU3MDZzX2xpbmt1cChzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIGJtY3IsIGxvY2FsX2FkdiwgcmVtb3RlX2FkdiwgY29tbW9uOworCisJYnAtPmxpbmtfdXAgPSAxOworCWJwLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDsKKworCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7CisJaWYgKGJtY3IgJiBCTUNSX0ZVTExEUExYKSB7CisJCWJwLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwl9CisJZWxzZSB7CisJCWJwLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwl9CisKKwlpZiAoIShibWNyICYgQk1DUl9BTkVOQUJMRSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJYm54Ml9yZWFkX3BoeShicCwgTUlJX0FEVkVSVElTRSwgJmxvY2FsX2Fkdik7CisJYm54Ml9yZWFkX3BoeShicCwgTUlJX0xQQSwgJnJlbW90ZV9hZHYpOworCisJY29tbW9uID0gbG9jYWxfYWR2ICYgcmVtb3RlX2FkdjsKKwlpZiAoY29tbW9uICYgKEFEVkVSVElTRV8xMDAwWEhBTEYgfCBBRFZFUlRJU0VfMTAwMFhGVUxMKSkgeworCisJCWlmIChjb21tb24gJiBBRFZFUlRJU0VfMTAwMFhGVUxMKSB7CisJCQlicC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCX0KKwkJZWxzZSB7CisJCQlicC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm54Ml9jb3BwZXJfbGlua3VwKHN0cnVjdCBibngyICpicCkKK3sKKwl1MzIgYm1jcjsKKworCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7CisJaWYgKGJtY3IgJiBCTUNSX0FORU5BQkxFKSB7CisJCXUzMiBsb2NhbF9hZHYsIHJlbW90ZV9hZHYsIGNvbW1vbjsKKworCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQ1RSTDEwMDAsICZsb2NhbF9hZHYpOworCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfU1RBVDEwMDAsICZyZW1vdGVfYWR2KTsKKworCQljb21tb24gPSBsb2NhbF9hZHYgJiAocmVtb3RlX2FkdiA+PiAyKTsKKwkJaWYgKGNvbW1vbiAmIEFEVkVSVElTRV8xMDAwRlVMTCkgeworCQkJYnAtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOworCQkJYnAtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl9CisJCWVsc2UgaWYgKGNvbW1vbiAmIEFEVkVSVElTRV8xMDAwSEFMRikgeworCQkJYnAtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOworCQkJYnAtPmR1cGxleCA9IERVUExFWF9IQUxGOworCQl9CisJCWVsc2UgeworCQkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0FEVkVSVElTRSwgJmxvY2FsX2Fkdik7CisJCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfTFBBLCAmcmVtb3RlX2Fkdik7CisKKwkJCWNvbW1vbiA9IGxvY2FsX2FkdiAmIHJlbW90ZV9hZHY7CisJCQlpZiAoY29tbW9uICYgQURWRVJUSVNFXzEwMEZVTEwpIHsKKwkJCQlicC0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDsKKwkJCQlicC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCQl9CisJCQllbHNlIGlmIChjb21tb24gJiBBRFZFUlRJU0VfMTAwSEFMRikgeworCQkJCWJwLT5saW5lX3NwZWVkID0gU1BFRURfMTAwOworCQkJCWJwLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJCX0KKwkJCWVsc2UgaWYgKGNvbW1vbiAmIEFEVkVSVElTRV8xMEZVTEwpIHsKKwkJCQlicC0+bGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQkJCWJwLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJCX0KKwkJCWVsc2UgaWYgKGNvbW1vbiAmIEFEVkVSVElTRV8xMEhBTEYpIHsKKwkJCQlicC0+bGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQkJCWJwLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWJwLT5saW5lX3NwZWVkID0gMDsKKwkJCQlicC0+bGlua191cCA9IDA7CisJCQl9CisJCX0KKwl9CisJZWxzZSB7CisJCWlmIChibWNyICYgQk1DUl9TUEVFRDEwMCkgeworCQkJYnAtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDA7CisJCX0KKwkJZWxzZSB7CisJCQlicC0+bGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQl9CisJCWlmIChibWNyICYgQk1DUl9GVUxMRFBMWCkgeworCQkJYnAtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl9CisJCWVsc2UgeworCQkJYnAtPmR1cGxleCA9IERVUExFWF9IQUxGOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfc2V0X21hY19saW5rKHN0cnVjdCBibngyICpicCkKK3sKKwl1MzIgdmFsOworCisJUkVHX1dSKGJwLCBCTlgyX0VNQUNfVFhfTEVOR1RIUywgMHgyNjIwKTsKKwlpZiAoYnAtPmxpbmtfdXAgJiYgKGJwLT5saW5lX3NwZWVkID09IFNQRUVEXzEwMDApICYmCisJCShicC0+ZHVwbGV4ID09IERVUExFWF9IQUxGKSkgeworCQlSRUdfV1IoYnAsIEJOWDJfRU1BQ19UWF9MRU5HVEhTLCAweDI2ZmYpOworCX0KKworCS8qIENvbmZpZ3VyZSB0aGUgRU1BQyBtb2RlIHJlZ2lzdGVyLiAqLworCXZhbCA9IFJFR19SRChicCwgQk5YMl9FTUFDX01PREUpOworCisJdmFsICY9IH4oQk5YMl9FTUFDX01PREVfUE9SVCB8IEJOWDJfRU1BQ19NT0RFX0hBTEZfRFVQTEVYIHwKKwkJQk5YMl9FTUFDX01PREVfTUFDX0xPT1AgfCBCTlgyX0VNQUNfTU9ERV9GT1JDRV9MSU5LIHwKKwkJQk5YMl9FTUFDX01PREVfMjVHKTsKKworCWlmIChicC0+bGlua191cCkgeworCQlzd2l0Y2ggKGJwLT5saW5lX3NwZWVkKSB7CisJCQljYXNlIFNQRUVEXzEwOgorCQkJCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOCkgeworCQkJCQl2YWwgfD0gQk5YMl9FTUFDX01PREVfUE9SVF9NSUlfMTA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCWNhc2UgU1BFRURfMTAwOgorCQkJCXZhbCB8PSBCTlgyX0VNQUNfTU9ERV9QT1JUX01JSTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1BFRURfMjUwMDoKKwkJCQl2YWwgfD0gQk5YMl9FTUFDX01PREVfMjVHOworCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJY2FzZSBTUEVFRF8xMDAwOgorCQkJCXZhbCB8PSBCTlgyX0VNQUNfTU9ERV9QT1JUX0dNSUk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSB7CisJCXZhbCB8PSBCTlgyX0VNQUNfTU9ERV9QT1JUX0dNSUk7CisJfQorCisJLyogU2V0IHRoZSBNQUMgdG8gb3BlcmF0ZSBpbiB0aGUgYXBwcm9wcmlhdGUgZHVwbGV4IG1vZGUuICovCisJaWYgKGJwLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCXZhbCB8PSBCTlgyX0VNQUNfTU9ERV9IQUxGX0RVUExFWDsKKwlSRUdfV1IoYnAsIEJOWDJfRU1BQ19NT0RFLCB2YWwpOworCisJLyogRW5hYmxlL2Rpc2FibGUgcnggUEFVU0UuICovCisJYnAtPnJ4X21vZGUgJj0gfkJOWDJfRU1BQ19SWF9NT0RFX0ZMT1dfRU47CisKKwlpZiAoYnAtPmZsb3dfY3RybCAmIEZMT1dfQ1RSTF9SWCkKKwkJYnAtPnJ4X21vZGUgfD0gQk5YMl9FTUFDX1JYX01PREVfRkxPV19FTjsKKwlSRUdfV1IoYnAsIEJOWDJfRU1BQ19SWF9NT0RFLCBicC0+cnhfbW9kZSk7CisKKwkvKiBFbmFibGUvZGlzYWJsZSB0eCBQQVVTRS4gKi8KKwl2YWwgPSBSRUdfUkQoYnAsIEJOWDJfRU1BQ19UWF9NT0RFKTsKKwl2YWwgJj0gfkJOWDJfRU1BQ19UWF9NT0RFX0ZMT1dfRU47CisKKwlpZiAoYnAtPmZsb3dfY3RybCAmIEZMT1dfQ1RSTF9UWCkKKwkJdmFsIHw9IEJOWDJfRU1BQ19UWF9NT0RFX0ZMT1dfRU47CisJUkVHX1dSKGJwLCBCTlgyX0VNQUNfVFhfTU9ERSwgdmFsKTsKKworCS8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQuICovCisJUkVHX1dSKGJwLCBCTlgyX0VNQUNfU1RBVFVTLCBCTlgyX0VNQUNfU1RBVFVTX0xJTktfQ0hBTkdFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitibngyX3NldF9saW5rKHN0cnVjdCBibngyICpicCkKK3sKKwl1MzIgYm1zcjsKKwl1OCBsaW5rX3VwOworCisJaWYgKGJwLT5sb29wYmFjayA9PSBNQUNfTE9PUEJBQ0spIHsKKwkJYnAtPmxpbmtfdXAgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlsaW5rX3VwID0gYnAtPmxpbmtfdXA7CisKKwlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1TUiwgJmJtc3IpOworCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTVNSLCAmYm1zcik7CisKKwlpZiAoKGJwLT5waHlfZmxhZ3MgJiBQSFlfU0VSREVTX0ZMQUcpICYmCisJICAgIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwNikpIHsKKwkJdTMyIHZhbDsKKworCQl2YWwgPSBSRUdfUkQoYnAsIEJOWDJfRU1BQ19TVEFUVVMpOworCQlpZiAodmFsICYgQk5YMl9FTUFDX1NUQVRVU19MSU5LKQorCQkJYm1zciB8PSBCTVNSX0xTVEFUVVM7CisJCWVsc2UKKwkJCWJtc3IgJj0gfkJNU1JfTFNUQVRVUzsKKwl9CisKKwlpZiAoYm1zciAmIEJNU1JfTFNUQVRVUykgeworCQlicC0+bGlua191cCA9IDE7CisKKwkJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfU0VSREVTX0ZMQUcpIHsKKwkJCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwNikKKwkJCQlibngyXzU3MDZzX2xpbmt1cChicCk7CisJCQllbHNlIGlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOCkKKwkJCQlibngyXzU3MDhzX2xpbmt1cChicCk7CisJCX0KKwkJZWxzZSB7CisJCQlibngyX2NvcHBlcl9saW5rdXAoYnApOworCQl9CisJCWJueDJfcmVzb2x2ZV9mbG93X2N0cmwoYnApOworCX0KKwllbHNlIHsKKwkJaWYgKChicC0+cGh5X2ZsYWdzICYgUEhZX1NFUkRFU19GTEFHKSAmJgorCQkJKGJwLT5hdXRvbmVnICYgQVVUT05FR19TUEVFRCkpIHsKKworCQkJdTMyIGJtY3I7CisKKwkJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7CisJCQlpZiAoIShibWNyICYgQk1DUl9BTkVOQUJMRSkpIHsKKwkJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIGJtY3IgfAorCQkJCQlCTUNSX0FORU5BQkxFKTsKKwkJCX0KKwkJfQorCQlicC0+cGh5X2ZsYWdzICY9IH5QSFlfUEFSQUxMRUxfREVURUNUX0ZMQUc7CisJCWJwLT5saW5rX3VwID0gMDsKKwl9CisKKwlpZiAoYnAtPmxpbmtfdXAgIT0gbGlua191cCkgeworCQlibngyX3JlcG9ydF9saW5rKGJwKTsKKwl9CisKKwlibngyX3NldF9tYWNfbGluayhicCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm54Ml9yZXNldF9waHkoc3RydWN0IGJueDIgKmJwKQoreworCWludCBpOworCXUzMiByZWc7CisKKyAgICAgICAgYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKworI2RlZmluZSBQSFlfUkVTRVRfTUFYX1dBSVQgMTAwCisJZm9yIChpID0gMDsgaSA8IFBIWV9SRVNFVF9NQVhfV0FJVDsgaSsrKSB7CisJCXVkZWxheSgxMCk7CisKKwkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNQ1IsICZyZWcpOworCQlpZiAoIShyZWcgJiBCTUNSX1JFU0VUKSkgeworCQkJdWRlbGF5KDIwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IFBIWV9SRVNFVF9NQVhfV0FJVCkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMgorYm54Ml9waHlfZ2V0X3BhdXNlX2FkdihzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIGFkdiA9IDA7CisKKwlpZiAoKGJwLT5yZXFfZmxvd19jdHJsICYgKEZMT1dfQ1RSTF9SWCB8IEZMT1dfQ1RSTF9UWCkpID09CisJCShGTE9XX0NUUkxfUlggfCBGTE9XX0NUUkxfVFgpKSB7CisKKwkJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfU0VSREVTX0ZMQUcpIHsKKwkJCWFkdiA9IEFEVkVSVElTRV8xMDAwWFBBVVNFOworCQl9CisJCWVsc2UgeworCQkJYWR2ID0gQURWRVJUSVNFX1BBVVNFX0NBUDsKKwkJfQorCX0KKwllbHNlIGlmIChicC0+cmVxX2Zsb3dfY3RybCAmIEZMT1dfQ1RSTF9UWCkgeworCQlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9TRVJERVNfRkxBRykgeworCQkJYWR2ID0gQURWRVJUSVNFXzEwMDBYUFNFX0FTWU07CisJCX0KKwkJZWxzZSB7CisJCQlhZHYgPSBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKwkJfQorCX0KKwllbHNlIGlmIChicC0+cmVxX2Zsb3dfY3RybCAmIEZMT1dfQ1RSTF9SWCkgeworCQlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9TRVJERVNfRkxBRykgeworCQkJYWR2ID0gQURWRVJUSVNFXzEwMDBYUEFVU0UgfCBBRFZFUlRJU0VfMTAwMFhQU0VfQVNZTTsKKwkJfQorCQllbHNlIHsKKwkJCWFkdiA9IEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKwkJfQorCX0KKwlyZXR1cm4gYWR2OworfQorCitzdGF0aWMgaW50CitibngyX3NldHVwX3NlcmRlc19waHkoc3RydWN0IGJueDIgKmJwKQoreworCXUzMiBhZHYsIGJtY3IsIHVwMTsKKwl1MzIgbmV3X2FkdiA9IDA7CisKKwlpZiAoIShicC0+YXV0b25lZyAmIEFVVE9ORUdfU1BFRUQpKSB7CisJCXUzMiBuZXdfYm1jcjsKKwkJaW50IGZvcmNlX2xpbmtfZG93biA9IDA7CisKKwkJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA4KSB7CisJCQlibngyX3JlYWRfcGh5KGJwLCBCQ001NzA4U19VUDEsICZ1cDEpOworCQkJaWYgKHVwMSAmIEJDTTU3MDhTX1VQMV8yRzUpIHsKKwkJCQl1cDEgJj0gfkJDTTU3MDhTX1VQMV8yRzU7CisJCQkJYm54Ml93cml0ZV9waHkoYnAsIEJDTTU3MDhTX1VQMSwgdXAxKTsKKwkJCQlmb3JjZV9saW5rX2Rvd24gPSAxOworCQkJfQorCQl9CisKKwkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0FEVkVSVElTRSwgJmFkdik7CisJCWFkdiAmPSB+KEFEVkVSVElTRV8xMDAwWEZVTEwgfCBBRFZFUlRJU0VfMTAwMFhIQUxGKTsKKworCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1DUiwgJmJtY3IpOworCQluZXdfYm1jciA9IGJtY3IgJiB+Qk1DUl9BTkVOQUJMRTsKKwkJbmV3X2JtY3IgfD0gQk1DUl9TUEVFRDEwMDA7CisJCWlmIChicC0+cmVxX2R1cGxleCA9PSBEVVBMRVhfRlVMTCkgeworCQkJYWR2IHw9IEFEVkVSVElTRV8xMDAwWEZVTEw7CisJCQluZXdfYm1jciB8PSBCTUNSX0ZVTExEUExYOworCQl9CisJCWVsc2UgeworCQkJYWR2IHw9IEFEVkVSVElTRV8xMDAwWEhBTEY7CisJCQluZXdfYm1jciAmPSB+Qk1DUl9GVUxMRFBMWDsKKwkJfQorCQlpZiAoKG5ld19ibWNyICE9IGJtY3IpIHx8IChmb3JjZV9saW5rX2Rvd24pKSB7CisJCQkvKiBGb3JjZSBhIGxpbmsgZG93biB2aXNpYmxlIG9uIHRoZSBvdGhlciBzaWRlICovCisJCQlpZiAoYnAtPmxpbmtfdXApIHsKKwkJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0FEVkVSVElTRSwgYWR2ICYKKwkJCQkJICAgICAgIH4oQURWRVJUSVNFXzEwMDBYRlVMTCB8CisJCQkJCQkgQURWRVJUSVNFXzEwMDBYSEFMRikpOworCQkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgYm1jciB8CisJCQkJCUJNQ1JfQU5SRVNUQVJUIHwgQk1DUl9BTkVOQUJMRSk7CisKKwkJCQlicC0+bGlua191cCA9IDA7CisJCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBuZXdfYm1jcik7CisJCQl9CisJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0FEVkVSVElTRSwgYWR2KTsKKwkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgbmV3X2JtY3IpOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZXzJfNUdfQ0FQQUJMRV9GTEFHKSB7CisJCWJueDJfcmVhZF9waHkoYnAsIEJDTTU3MDhTX1VQMSwgJnVwMSk7CisJCXVwMSB8PSBCQ001NzA4U19VUDFfMkc1OworCQlibngyX3dyaXRlX3BoeShicCwgQkNNNTcwOFNfVVAxLCB1cDEpOworCX0KKworCWlmIChicC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDAwWEZVTEw7CisKKwluZXdfYWR2IHw9IGJueDJfcGh5X2dldF9wYXVzZV9hZHYoYnApOworCisJYm54Ml9yZWFkX3BoeShicCwgTUlJX0FEVkVSVElTRSwgJmFkdik7CisJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNQ1IsICZibWNyKTsKKworCWJwLT5zZXJkZXNfYW5fcGVuZGluZyA9IDA7CisJaWYgKChhZHYgIT0gbmV3X2FkdikgfHwgKChibWNyICYgQk1DUl9BTkVOQUJMRSkgPT0gMCkpIHsKKwkJLyogRm9yY2UgYSBsaW5rIGRvd24gdmlzaWJsZSBvbiB0aGUgb3RoZXIgc2lkZSAqLworCQlpZiAoYnAtPmxpbmtfdXApIHsKKwkJCWludCBpOworCisJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIEJNQ1JfTE9PUEJBQ0spOworCQkJZm9yIChpID0gMDsgaSA8IDExMDsgaSsrKSB7CisJCQkJdWRlbGF5KDEwMCk7CisJCQl9CisJCX0KKworCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0FEVkVSVElTRSwgbmV3X2Fkdik7CisJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgYm1jciB8IEJNQ1JfQU5SRVNUQVJUIHwKKwkJCUJNQ1JfQU5FTkFCTEUpOworI2lmIDAKKwkJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA2KSB7CisJCQkvKiBTcGVlZCB1cCBsaW5rLXVwIHRpbWUgd2hlbiB0aGUgbGluayBwYXJ0bmVyCisJCQkgKiBkb2VzIG5vdCBhdXRvbmVnb3RpYXRlIHdoaWNoIGlzIHZlcnkgY29tbW9uCisJCQkgKiBpbiBibGFkZSBzZXJ2ZXJzLiBTb21lIGJsYWRlIHNlcnZlcnMgdXNlCisJCQkgKiBJUE1JIGZvciBrZXJib2FyZCBpbnB1dCBhbmQgaXQncyBpbXBvcnRhbnQKKwkJCSAqIHRvIG1pbmltaXplIGxpbmsgZGlzcnVwdGlvbnMuIEF1dG9uZWcuIGludm9sdmVzCisJCQkgKiBleGNoYW5naW5nIGJhc2UgcGFnZXMgcGx1cyAzIG5leHQgcGFnZXMgYW5kCisJCQkgKiBub3JtYWxseSBjb21wbGV0ZXMgaW4gYWJvdXQgMTIwIG1zZWMuCisJCQkgKi8KKwkJCWJwLT5jdXJyZW50X2ludGVydmFsID0gU0VSREVTX0FOX1RJTUVPVVQ7CisJCQlicC0+c2VyZGVzX2FuX3BlbmRpbmcgPSAxOworCQkJbW9kX3RpbWVyKCZicC0+dGltZXIsIGppZmZpZXMgKyBicC0+Y3VycmVudF9pbnRlcnZhbCk7CisJCX0KKyNlbmRpZgorCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEVUSFRPT0xfQUxMX0ZJQlJFX1NQRUVECQkJCQkJXAorCShBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCisjZGVmaW5lIEVUSFRPT0xfQUxMX0NPUFBFUl9TUEVFRAkJCQkJXAorCShBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwJCVwKKwlBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAkJXAorCUFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCisKKyNkZWZpbmUgUEhZX0FMTF8xMF8xMDBfU1BFRUQgKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXAorCUFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfQ1NNQSkKKwkKKyNkZWZpbmUgUEhZX0FMTF8xMDAwX1NQRUVEIChBRFZFUlRJU0VfMTAwMEhBTEYgfCBBRFZFUlRJU0VfMTAwMEZVTEwpCisKK3N0YXRpYyBpbnQKK2JueDJfc2V0dXBfY29wcGVyX3BoeShzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIGJtY3I7CisJdTMyIG5ld19ibWNyOworCisJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNQ1IsICZibWNyKTsKKworCWlmIChicC0+YXV0b25lZyAmIEFVVE9ORUdfU1BFRUQpIHsKKwkJdTMyIGFkdl9yZWcsIGFkdjEwMDBfcmVnOworCQl1MzIgbmV3X2Fkdl9yZWcgPSAwOworCQl1MzIgbmV3X2FkdjEwMDBfcmVnID0gMDsKKworCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQURWRVJUSVNFLCAmYWR2X3JlZyk7CisJCWFkdl9yZWcgJj0gKFBIWV9BTExfMTBfMTAwX1NQRUVEIHwgQURWRVJUSVNFX1BBVVNFX0NBUCB8CisJCQlBRFZFUlRJU0VfUEFVU0VfQVNZTSk7CisKKwkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0NUUkwxMDAwLCAmYWR2MTAwMF9yZWcpOworCQlhZHYxMDAwX3JlZyAmPSBQSFlfQUxMXzEwMDBfU1BFRUQ7CisKKwkJaWYgKGJwLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQkJbmV3X2Fkdl9yZWcgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwkJaWYgKGJwLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQkJbmV3X2Fkdl9yZWcgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwkJaWYgKGJwLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJCW5ld19hZHZfcmVnIHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQlpZiAoYnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQkJbmV3X2Fkdl9yZWcgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCWlmIChicC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQkJbmV3X2FkdjEwMDBfcmVnIHw9IEFEVkVSVElTRV8xMDAwRlVMTDsKKwkJCisJCW5ld19hZHZfcmVnIHw9IEFEVkVSVElTRV9DU01BOworCisJCW5ld19hZHZfcmVnIHw9IGJueDJfcGh5X2dldF9wYXVzZV9hZHYoYnApOworCisJCWlmICgoYWR2MTAwMF9yZWcgIT0gbmV3X2FkdjEwMDBfcmVnKSB8fAorCQkJKGFkdl9yZWcgIT0gbmV3X2Fkdl9yZWcpIHx8CisJCQkoKGJtY3IgJiBCTUNSX0FORU5BQkxFKSA9PSAwKSkgeworCisJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0FEVkVSVElTRSwgbmV3X2Fkdl9yZWcpOworCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9DVFJMMTAwMCwgbmV3X2FkdjEwMDBfcmVnKTsKKwkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgQk1DUl9BTlJFU1RBUlQgfAorCQkJCUJNQ1JfQU5FTkFCTEUpOworCQl9CisJCWVsc2UgaWYgKGJwLT5saW5rX3VwKSB7CisJCQkvKiBGbG93IGN0cmwgbWF5IGhhdmUgY2hhbmdlZCBmcm9tIGF1dG8gdG8gZm9yY2VkICovCisJCQkvKiBvciB2aWNlLXZlcnNhLiAqLworCisJCQlibngyX3Jlc29sdmVfZmxvd19jdHJsKGJwKTsKKwkJCWJueDJfc2V0X21hY19saW5rKGJwKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwluZXdfYm1jciA9IDA7CisJaWYgKGJwLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMDApIHsKKwkJbmV3X2JtY3IgfD0gQk1DUl9TUEVFRDEwMDsKKwl9CisJaWYgKGJwLT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CisJCW5ld19ibWNyIHw9IEJNQ1JfRlVMTERQTFg7CisJfQorCWlmIChuZXdfYm1jciAhPSBibWNyKSB7CisJCXUzMiBibXNyOworCQlpbnQgaSA9IDA7CisKKwkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNU1IsICZibXNyKTsKKwkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNU1IsICZibXNyKTsKKwkJCisJCWlmIChibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCQkvKiBGb3JjZSBsaW5rIGRvd24gKi8KKwkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgQk1DUl9MT09QQkFDSyk7CisJCQlkbyB7CisJCQkJdWRlbGF5KDEwMCk7CisJCQkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNU1IsICZibXNyKTsKKwkJCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1TUiwgJmJtc3IpOworCQkJCWkrKzsKKwkJCX0gd2hpbGUgKChibXNyICYgQk1TUl9MU1RBVFVTKSAmJiAoaSA8IDYyMCkpOworCQl9CisKKwkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBuZXdfYm1jcik7CisKKwkJLyogTm9ybWFsbHksIHRoZSBuZXcgc3BlZWQgaXMgc2V0dXAgYWZ0ZXIgdGhlIGxpbmsgaGFzCisJCSAqIGdvbmUgZG93biBhbmQgdXAgYWdhaW4uIEluIHNvbWUgY2FzZXMsIGxpbmsgd2lsbCBub3QgZ28KKwkJICogZG93biBzbyB3ZSBuZWVkIHRvIHNldCB1cCB0aGUgbmV3IHNwZWVkIGhlcmUuCisJCSAqLworCQlpZiAoYm1zciAmIEJNU1JfTFNUQVRVUykgeworCQkJYnAtPmxpbmVfc3BlZWQgPSBicC0+cmVxX2xpbmVfc3BlZWQ7CisJCQlicC0+ZHVwbGV4ID0gYnAtPnJlcV9kdXBsZXg7CisJCQlibngyX3Jlc29sdmVfZmxvd19jdHJsKGJwKTsKKwkJCWJueDJfc2V0X21hY19saW5rKGJwKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm54Ml9zZXR1cF9waHkoc3RydWN0IGJueDIgKmJwKQoreworCWlmIChicC0+bG9vcGJhY2sgPT0gTUFDX0xPT1BCQUNLKQorCQlyZXR1cm4gMDsKKworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX1NFUkRFU19GTEFHKSB7CisJCXJldHVybiAoYm54Ml9zZXR1cF9zZXJkZXNfcGh5KGJwKSk7CisJfQorCWVsc2UgeworCQlyZXR1cm4gKGJueDJfc2V0dXBfY29wcGVyX3BoeShicCkpOworCX0KK30KKworc3RhdGljIGludAorYm54Ml9pbml0XzU3MDhzX3BoeShzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIHZhbDsKKworCWJueDJfd3JpdGVfcGh5KGJwLCBCQ001NzA4U19CTEtfQUREUiwgQkNNNTcwOFNfQkxLX0FERFJfRElHMyk7CisJYm54Ml93cml0ZV9waHkoYnAsIEJDTTU3MDhTX0RJR18zXzAsIEJDTTU3MDhTX0RJR18zXzBfVVNFX0lFRUUpOworCWJueDJfd3JpdGVfcGh5KGJwLCBCQ001NzA4U19CTEtfQUREUiwgQkNNNTcwOFNfQkxLX0FERFJfRElHKTsKKworCWJueDJfcmVhZF9waHkoYnAsIEJDTTU3MDhTXzEwMDBYX0NUTDEsICZ2YWwpOworCXZhbCB8PSBCQ001NzA4U18xMDAwWF9DVEwxX0ZJQkVSX01PREUgfCBCQ001NzA4U18xMDAwWF9DVEwxX0FVVE9ERVRfRU47CisJYm54Ml93cml0ZV9waHkoYnAsIEJDTTU3MDhTXzEwMDBYX0NUTDEsIHZhbCk7CisKKwlibngyX3JlYWRfcGh5KGJwLCBCQ001NzA4U18xMDAwWF9DVEwyLCAmdmFsKTsKKwl2YWwgfD0gQkNNNTcwOFNfMTAwMFhfQ1RMMl9QTExFTF9ERVRfRU47CisJYm54Ml93cml0ZV9waHkoYnAsIEJDTTU3MDhTXzEwMDBYX0NUTDIsIHZhbCk7CisKKwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV8yXzVHX0NBUEFCTEVfRkxBRykgeworCQlibngyX3JlYWRfcGh5KGJwLCBCQ001NzA4U19VUDEsICZ2YWwpOworCQl2YWwgfD0gQkNNNTcwOFNfVVAxXzJHNTsKKwkJYm54Ml93cml0ZV9waHkoYnAsIEJDTTU3MDhTX1VQMSwgdmFsKTsKKwl9CisKKwlpZiAoKENISVBfSUQoYnApID09IENISVBfSURfNTcwOF9BMCkgfHwKKwkgICAgKENISVBfSUQoYnApID09IENISVBfSURfNTcwOF9CMCkgfHwKKwkgICAgKENISVBfSUQoYnApID09IENISVBfSURfNTcwOF9CMSkpIHsKKwkJLyogaW5jcmVhc2UgdHggc2lnbmFsIGFtcGxpdHVkZSAqLworCQlibngyX3dyaXRlX3BoeShicCwgQkNNNTcwOFNfQkxLX0FERFIsCisJCQkgICAgICAgQkNNNTcwOFNfQkxLX0FERFJfVFhfTUlTQyk7CisJCWJueDJfcmVhZF9waHkoYnAsIEJDTTU3MDhTX1RYX0FDVEwxLCAmdmFsKTsKKwkJdmFsICY9IH5CQ001NzA4U19UWF9BQ1RMMV9EUklWRVJfVkNNOworCQlibngyX3dyaXRlX3BoeShicCwgQkNNNTcwOFNfVFhfQUNUTDEsIHZhbCk7CisJCWJueDJfd3JpdGVfcGh5KGJwLCBCQ001NzA4U19CTEtfQUREUiwgQkNNNTcwOFNfQkxLX0FERFJfRElHKTsKKwl9CisKKwl2YWwgPSBSRUdfUkRfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArIEJOWDJfUE9SVF9IV19DRkdfQ09ORklHKSAmCisJICAgICAgQk5YMl9QT1JUX0hXX0NGR19DRkdfVFhDVEwzX01BU0s7CisKKwlpZiAodmFsKSB7CisJCXUzMiBpc19iYWNrcGxhbmU7CisKKwkJaXNfYmFja3BsYW5lID0gUkVHX1JEX0lORChicCwgYnAtPnNobWVtX2Jhc2UgKworCQkJCQkgIEJOWDJfU0hBUkVEX0hXX0NGR19DT05GSUcpOworCQlpZiAoaXNfYmFja3BsYW5lICYgQk5YMl9TSEFSRURfSFdfQ0ZHX1BIWV9CQUNLUExBTkUpIHsKKwkJCWJueDJfd3JpdGVfcGh5KGJwLCBCQ001NzA4U19CTEtfQUREUiwKKwkJCQkgICAgICAgQkNNNTcwOFNfQkxLX0FERFJfVFhfTUlTQyk7CisJCQlibngyX3dyaXRlX3BoeShicCwgQkNNNTcwOFNfVFhfQUNUTDMsIHZhbCk7CisJCQlibngyX3dyaXRlX3BoeShicCwgQkNNNTcwOFNfQkxLX0FERFIsCisJCQkJICAgICAgIEJDTTU3MDhTX0JMS19BRERSX0RJRyk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfaW5pdF81NzA2c19waHkoc3RydWN0IGJueDIgKmJwKQoreworCXUzMiB2YWw7CisKKwlicC0+cGh5X2ZsYWdzICY9IH5QSFlfUEFSQUxMRUxfREVURUNUX0ZMQUc7CisKKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDYpIHsKKyAgICAgICAgCVJFR19XUihicCwgQk5YMl9NSVNDX1VOVVNFRDAsIDB4MzAwKTsKKwl9CisKKworCWJueDJfd3JpdGVfcGh5KGJwLCAweDE4LCAweDcpOworCWJueDJfcmVhZF9waHkoYnAsIDB4MTgsICZ2YWwpOworCWJueDJfd3JpdGVfcGh5KGJwLCAweDE4LCB2YWwgJiB+MHg0MDA3KTsKKworCWJueDJfd3JpdGVfcGh5KGJwLCAweDFjLCAweDZjMDApOworCWJueDJfcmVhZF9waHkoYnAsIDB4MWMsICZ2YWwpOworCWJueDJfd3JpdGVfcGh5KGJwLCAweDFjLCAodmFsICYgMHgzZmQpIHwgMHhlYzAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitibngyX2luaXRfY29wcGVyX3BoeShzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIHZhbDsKKworCWJwLT5waHlfZmxhZ3MgfD0gUEhZX0NSQ19GSVhfRkxBRzsKKworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX0NSQ19GSVhfRkxBRykgeworCQlibngyX3dyaXRlX3BoeShicCwgMHgxOCwgMHgwYzAwKTsKKwkJYm54Ml93cml0ZV9waHkoYnAsIDB4MTcsIDB4MDAwYSk7CisJCWJueDJfd3JpdGVfcGh5KGJwLCAweDE1LCAweDMxMGIpOworCQlibngyX3dyaXRlX3BoeShicCwgMHgxNywgMHgyMDFmKTsKKwkJYm54Ml93cml0ZV9waHkoYnAsIDB4MTUsIDB4OTUwNik7CisJCWJueDJfd3JpdGVfcGh5KGJwLCAweDE3LCAweDQwMWYpOworCQlibngyX3dyaXRlX3BoeShicCwgMHgxNSwgMHgxNGUyKTsKKwkJYm54Ml93cml0ZV9waHkoYnAsIDB4MTgsIDB4MDQwMCk7CisJfQorCisJYm54Ml93cml0ZV9waHkoYnAsIDB4MTgsIDB4Nyk7CisJYm54Ml9yZWFkX3BoeShicCwgMHgxOCwgJnZhbCk7CisJYm54Ml93cml0ZV9waHkoYnAsIDB4MTgsIHZhbCAmIH4weDQwMDcpOworCisJYm54Ml9yZWFkX3BoeShicCwgMHgxMCwgJnZhbCk7CisJYm54Ml93cml0ZV9waHkoYnAsIDB4MTAsIHZhbCAmIH4weDEpOworCisJLyogZXRoZXJuZXRAd2lyZXNwZWVkICovCisJYm54Ml93cml0ZV9waHkoYnAsIDB4MTgsIDB4NzAwNyk7CisJYm54Ml9yZWFkX3BoeShicCwgMHgxOCwgJnZhbCk7CisJYm54Ml93cml0ZV9waHkoYnAsIDB4MTgsIHZhbCB8ICgxIDw8IDE1KSB8ICgxIDw8IDQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm54Ml9pbml0X3BoeShzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIHZhbDsKKwlpbnQgcmMgPSAwOworCisJYnAtPnBoeV9mbGFncyAmPSB+UEhZX0lOVF9NT0RFX01BU0tfRkxBRzsKKwlicC0+cGh5X2ZsYWdzIHw9IFBIWV9JTlRfTU9ERV9MSU5LX1JFQURZX0ZMQUc7CisKKyAgICAgICAgUkVHX1dSKGJwLCBCTlgyX0VNQUNfQVRURU5USU9OX0VOQSwgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkFfTElOSyk7CisKKwlibngyX3Jlc2V0X3BoeShicCk7CisKKwlibngyX3JlYWRfcGh5KGJwLCBNSUlfUEhZU0lEMSwgJnZhbCk7CisJYnAtPnBoeV9pZCA9IHZhbCA8PCAxNjsKKwlibngyX3JlYWRfcGh5KGJwLCBNSUlfUEhZU0lEMiwgJnZhbCk7CisJYnAtPnBoeV9pZCB8PSB2YWwgJiAweGZmZmY7CisKKwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9TRVJERVNfRkxBRykgeworCQlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDYpCisJCQlyYyA9IGJueDJfaW5pdF81NzA2c19waHkoYnApOworCQllbHNlIGlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOCkKKwkJCXJjID0gYm54Ml9pbml0XzU3MDhzX3BoeShicCk7CisJfQorCWVsc2UgeworCQlyYyA9IGJueDJfaW5pdF9jb3BwZXJfcGh5KGJwKTsKKwl9CisKKwlibngyX3NldHVwX3BoeShicCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfZndfc3luYyhzdHJ1Y3QgYm54MiAqYnAsIHUzMiBtc2dfZGF0YSwgaW50IHNpbGVudCkKK3sKKwlpbnQgaTsKKwl1MzIgdmFsOworCisJYnAtPmZ3X3dyX3NlcSsrOworCW1zZ19kYXRhIHw9IGJwLT5md193cl9zZXE7CisKKwlSRUdfV1JfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArIEJOWDJfRFJWX01CLCBtc2dfZGF0YSk7CisKKwkvKiB3YWl0IGZvciBhbiBhY2tub3dsZWRnZW1lbnQuICovCisJZm9yIChpID0gMDsgaSA8IChGV19BQ0tfVElNRV9PVVRfTVMgLyA1MCk7IGkrKykgeworCQltZGVsYXkoNTApOworCisJCXZhbCA9IFJFR19SRF9JTkQoYnAsIGJwLT5zaG1lbV9iYXNlICsgQk5YMl9GV19NQik7CisKKwkJaWYgKCh2YWwgJiBCTlgyX0ZXX01TR19BQ0spID09IChtc2dfZGF0YSAmIEJOWDJfRFJWX01TR19TRVEpKQorCQkJYnJlYWs7CisJfQorCWlmICgobXNnX2RhdGEgJiBCTlgyX0RSVl9NU0dfREFUQSkgPT0gQk5YMl9EUlZfTVNHX0RBVEFfV0FJVDApCisJCXJldHVybiAwOworCisJLyogSWYgd2UgdGltZWQgb3V0LCBpbmZvcm0gdGhlIGZpcm13YXJlIHRoYXQgdGhpcyBpcyB0aGUgY2FzZS4gKi8KKwlpZiAoKHZhbCAmIEJOWDJfRldfTVNHX0FDSykgIT0gKG1zZ19kYXRhICYgQk5YMl9EUlZfTVNHX1NFUSkpIHsKKwkJaWYgKCFzaWxlbnQpCisJCSAgcHJpbnRmKCJmdyBzeW5jIHRpbWVvdXQsIHJlc2V0IGNvZGUgPSAleFxuIiwgKHVuc2lnbmVkIGludCkgbXNnX2RhdGEpOworCisJCW1zZ19kYXRhICY9IH5CTlgyX0RSVl9NU0dfQ09ERTsKKwkJbXNnX2RhdGEgfD0gQk5YMl9EUlZfTVNHX0NPREVfRldfVElNRU9VVDsKKworCQlSRUdfV1JfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArIEJOWDJfRFJWX01CLCBtc2dfZGF0YSk7CisKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoKHZhbCAmIEJOWDJfRldfTVNHX1NUQVRVU19NQVNLKSAhPSBCTlgyX0ZXX01TR19TVEFUVVNfT0spCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitibngyX2luaXRfY29udGV4dChzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIHZjaWQ7CisKKwl2Y2lkID0gOTY7CisJd2hpbGUgKHZjaWQpIHsKKwkJdTMyIHZjaWRfYWRkciwgcGNpZF9hZGRyLCBvZmZzZXQ7CisKKwkJdmNpZC0tOworCisJCWlmIChDSElQX0lEKGJwKSA9PSBDSElQX0lEXzU3MDZfQTApIHsKKwkJCXUzMiBuZXdfdmNpZDsKKworCQkJdmNpZF9hZGRyID0gR0VUX1BDSURfQUREUih2Y2lkKTsKKwkJCWlmICh2Y2lkICYgMHg4KSB7CisJCQkJbmV3X3ZjaWQgPSAweDYwICsgKHZjaWQgJiAweGYwKSArICh2Y2lkICYgMHg3KTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCW5ld192Y2lkID0gdmNpZDsKKwkJCX0KKwkJCXBjaWRfYWRkciA9IEdFVF9QQ0lEX0FERFIobmV3X3ZjaWQpOworCQl9CisJCWVsc2UgeworCSAgICAJCXZjaWRfYWRkciA9IEdFVF9DSURfQUREUih2Y2lkKTsKKwkJCXBjaWRfYWRkciA9IHZjaWRfYWRkcjsKKwkJfQorCisJCVJFR19XUihicCwgQk5YMl9DVFhfVklSVF9BRERSLCAweDAwKTsKKwkJUkVHX1dSKGJwLCBCTlgyX0NUWF9QQUdFX1RCTCwgcGNpZF9hZGRyKTsKKworCQkvKiBaZXJvIG91dCB0aGUgY29udGV4dC4gKi8KKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBQSFlfQ1RYX1NJWkU7IG9mZnNldCArPSA0KSB7CisJCQlDVFhfV1IoYnAsIDB4MDAsIG9mZnNldCwgMCk7CisJCX0KKworCQlSRUdfV1IoYnAsIEJOWDJfQ1RYX1ZJUlRfQUREUiwgdmNpZF9hZGRyKTsKKwkJUkVHX1dSKGJwLCBCTlgyX0NUWF9QQUdFX1RCTCwgcGNpZF9hZGRyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfYWxsb2NfYmFkX3JidWYoc3RydWN0IGJueDIgKmJwKQoreworCXUxNiBnb29kX21idWZbNTEyXTsKKwl1MzIgZ29vZF9tYnVmX2NudDsKKwl1MzIgdmFsOworCisJUkVHX1dSKGJwLCBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTLAorCQlCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX1JYX01CVUZfRU5BQkxFKTsKKworCWdvb2RfbWJ1Zl9jbnQgPSAwOworCisJLyogQWxsb2NhdGUgYSBidW5jaCBvZiBtYnVmcyBhbmQgc2F2ZSB0aGUgZ29vZCBvbmVzIGluIGFuIGFycmF5LiAqLworCXZhbCA9IFJFR19SRF9JTkQoYnAsIEJOWDJfUkJVRl9TVEFUVVMxKTsKKwl3aGlsZSAodmFsICYgQk5YMl9SQlVGX1NUQVRVUzFfRlJFRV9DT1VOVCkgeworCQlSRUdfV1JfSU5EKGJwLCBCTlgyX1JCVUZfQ09NTUFORCwgQk5YMl9SQlVGX0NPTU1BTkRfQUxMT0NfUkVRKTsKKworCQl2YWwgPSBSRUdfUkRfSU5EKGJwLCBCTlgyX1JCVUZfRldfQlVGX0FMTE9DKTsKKworCQl2YWwgJj0gQk5YMl9SQlVGX0ZXX0JVRl9BTExPQ19WQUxVRTsKKworCQkvKiBUaGUgYWRkcmVzc2VzIHdpdGggQml0IDkgc2V0IGFyZSBiYWQgbWVtb3J5IGJsb2Nrcy4gKi8KKwkJaWYgKCEodmFsICYgKDEgPDwgOSkpKSB7CisJCQlnb29kX21idWZbZ29vZF9tYnVmX2NudF0gPSAodTE2KSB2YWw7CisJCQlnb29kX21idWZfY250Kys7CisJCX0KKworCQl2YWwgPSBSRUdfUkRfSU5EKGJwLCBCTlgyX1JCVUZfU1RBVFVTMSk7CisJfQorCisJLyogRnJlZSB0aGUgZ29vZCBvbmVzIGJhY2sgdG8gdGhlIG1idWYgcG9vbCB0aHVzIGRpc2NhcmRpbmcKKwkgKiBhbGwgdGhlIGJhZCBvbmVzLiAqLworCXdoaWxlIChnb29kX21idWZfY250KSB7CisJCWdvb2RfbWJ1Zl9jbnQtLTsKKworCQl2YWwgPSBnb29kX21idWZbZ29vZF9tYnVmX2NudF07CisJCXZhbCA9ICh2YWwgPDwgOSkgfCB2YWwgfCAxOworCisJCVJFR19XUl9JTkQoYnAsIEJOWDJfUkJVRl9GV19CVUZfRlJFRSwgdmFsKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitibngyX3NldF9tYWNfYWRkcihzdHJ1Y3QgYm54MiAqYnApIAoreworCXUzMiB2YWw7CisJdTggKm1hY19hZGRyID0gYnAtPm5pYy0+bm9kZV9hZGRyOworCisJdmFsID0gKG1hY19hZGRyWzBdIDw8IDgpIHwgbWFjX2FkZHJbMV07CisKKwlSRUdfV1IoYnAsIEJOWDJfRU1BQ19NQUNfTUFUQ0gwLCB2YWwpOworCisJdmFsID0gKG1hY19hZGRyWzJdIDw8IDI0KSB8IChtYWNfYWRkclszXSA8PCAxNikgfCAKKwkJKG1hY19hZGRyWzRdIDw8IDgpIHwgbWFjX2FkZHJbNV07CisKKwlSRUdfV1IoYnAsIEJOWDJfRU1BQ19NQUNfTUFUQ0gxLCB2YWwpOworfQorCitzdGF0aWMgdm9pZAorYm54Ml9zZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJc3RydWN0IGJueDIgKmJwID0gJmJueDI7CisJdTMyIHJ4X21vZGUsIHNvcnRfbW9kZTsKKwlpbnQgaTsKKworCXJ4X21vZGUgPSBicC0+cnhfbW9kZSAmIH4oQk5YMl9FTUFDX1JYX01PREVfUFJPTUlTQ1VPVVMgfAorCQkJCSAgQk5YMl9FTUFDX1JYX01PREVfS0VFUF9WTEFOX1RBRyk7CisJc29ydF9tb2RlID0gMSB8IEJOWDJfUlBNX1NPUlRfVVNFUjBfQkNfRU47CisKKwlpZiAoIShicC0+ZmxhZ3MgJiBBU0ZfRU5BQkxFX0ZMQUcpKSB7CisJCXJ4X21vZGUgfD0gQk5YMl9FTUFDX1JYX01PREVfS0VFUF9WTEFOX1RBRzsKKwl9CisKKwkvKiBBY2NlcHQgYWxsIG11bHRpY2FzdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX01DX0hBU0hfUkVHSVNURVJTOyBpKyspIHsKKwkJUkVHX1dSKGJwLCBCTlgyX0VNQUNfTVVMVElDQVNUX0hBU0gwICsgKGkgKiA0KSwKKwkJICAgICAgIDB4ZmZmZmZmZmYpOworICAgICAgIAl9CisJc29ydF9tb2RlIHw9IEJOWDJfUlBNX1NPUlRfVVNFUjBfTUNfRU47CisKKwlpZiAocnhfbW9kZSAhPSBicC0+cnhfbW9kZSkgeworCQlicC0+cnhfbW9kZSA9IHJ4X21vZGU7CisJCVJFR19XUihicCwgQk5YMl9FTUFDX1JYX01PREUsIHJ4X21vZGUpOworCX0KKworCVJFR19XUihicCwgQk5YMl9SUE1fU09SVF9VU0VSMCwgMHgwKTsKKwlSRUdfV1IoYnAsIEJOWDJfUlBNX1NPUlRfVVNFUjAsIHNvcnRfbW9kZSk7CisJUkVHX1dSKGJwLCBCTlgyX1JQTV9TT1JUX1VTRVIwLCBzb3J0X21vZGUgfCBCTlgyX1JQTV9TT1JUX1VTRVIwX0VOQSk7Cit9CisKK3N0YXRpYyB2b2lkCitsb2FkX3J2MnBfZncoc3RydWN0IGJueDIgKmJwLCB1MzIgKnJ2MnBfY29kZSwgdTMyIHJ2MnBfY29kZV9sZW4sIHUzMiBydjJwX3Byb2MpCit7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIHZhbDsKKworCisJZm9yIChpID0gMDsgaSA8IHJ2MnBfY29kZV9sZW47IGkgKz0gOCkgeworCQlSRUdfV1IoYnAsIEJOWDJfUlYyUF9JTlNUUl9ISUdILCAqcnYycF9jb2RlKTsKKwkJcnYycF9jb2RlKys7CisJCVJFR19XUihicCwgQk5YMl9SVjJQX0lOU1RSX0xPVywgKnJ2MnBfY29kZSk7CisJCXJ2MnBfY29kZSsrOworCisJCWlmIChydjJwX3Byb2MgPT0gUlYyUF9QUk9DMSkgeworCQkJdmFsID0gKGkgLyA4KSB8IEJOWDJfUlYyUF9QUk9DMV9BRERSX0NNRF9SRFdSOworCQkJUkVHX1dSKGJwLCBCTlgyX1JWMlBfUFJPQzFfQUREUl9DTUQsIHZhbCk7CisJCX0KKwkJZWxzZSB7CisJCQl2YWwgPSAoaSAvIDgpIHwgQk5YMl9SVjJQX1BST0MyX0FERFJfQ01EX1JEV1I7CisJCQlSRUdfV1IoYnAsIEJOWDJfUlYyUF9QUk9DMl9BRERSX0NNRCwgdmFsKTsKKwkJfQorCX0KKworCS8qIFJlc2V0IHRoZSBwcm9jZXNzb3IsIHVuLXN0YWxsIGlzIGRvbmUgbGF0ZXIuICovCisJaWYgKHJ2MnBfcHJvYyA9PSBSVjJQX1BST0MxKSB7CisJCVJFR19XUihicCwgQk5YMl9SVjJQX0NPTU1BTkQsIEJOWDJfUlYyUF9DT01NQU5EX1BST0MxX1JFU0VUKTsKKwl9CisJZWxzZSB7CisJCVJFR19XUihicCwgQk5YMl9SVjJQX0NPTU1BTkQsIEJOWDJfUlYyUF9DT01NQU5EX1BST0MyX1JFU0VUKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitsb2FkX2NwdV9mdyhzdHJ1Y3QgYm54MiAqYnAsIHN0cnVjdCBjcHVfcmVnICpjcHVfcmVnLCBzdHJ1Y3QgZndfaW5mbyAqZncpCit7CisJdTMyIG9mZnNldDsKKwl1MzIgdmFsOworCisJLyogSGFsdCB0aGUgQ1BVLiAqLworCXZhbCA9IFJFR19SRF9JTkQoYnAsIGNwdV9yZWctPm1vZGUpOworCXZhbCB8PSBjcHVfcmVnLT5tb2RlX3ZhbHVlX2hhbHQ7CisJUkVHX1dSX0lORChicCwgY3B1X3JlZy0+bW9kZSwgdmFsKTsKKwlSRUdfV1JfSU5EKGJwLCBjcHVfcmVnLT5zdGF0ZSwgY3B1X3JlZy0+c3RhdGVfdmFsdWVfY2xlYXIpOworCisJLyogTG9hZCB0aGUgVGV4dCBhcmVhLiAqLworCW9mZnNldCA9IGNwdV9yZWctPnNwYWRfYmFzZSArIChmdy0+dGV4dF9hZGRyIC0gY3B1X3JlZy0+bWlwc192aWV3X2Jhc2UpOworCWlmIChmdy0+dGV4dCkgeworCQl1bnNpZ25lZCBpbnQgajsKKworCQlmb3IgKGogPSAwOyBqIDwgKGZ3LT50ZXh0X2xlbiAvIDQpOyBqKyssIG9mZnNldCArPSA0KSB7CisJCQlSRUdfV1JfSU5EKGJwLCBvZmZzZXQsIGZ3LT50ZXh0W2pdKTsKKwkgICAgICAgIH0KKwl9CisKKwkvKiBMb2FkIHRoZSBEYXRhIGFyZWEuICovCisJb2Zmc2V0ID0gY3B1X3JlZy0+c3BhZF9iYXNlICsgKGZ3LT5kYXRhX2FkZHIgLSBjcHVfcmVnLT5taXBzX3ZpZXdfYmFzZSk7CisJaWYgKGZ3LT5kYXRhKSB7CisJCXVuc2lnbmVkIGludCBqOworCisJCWZvciAoaiA9IDA7IGogPCAoZnctPmRhdGFfbGVuIC8gNCk7IGorKywgb2Zmc2V0ICs9IDQpIHsKKwkJCVJFR19XUl9JTkQoYnAsIG9mZnNldCwgZnctPmRhdGFbal0pOworCQl9CisJfQorCisJLyogTG9hZCB0aGUgU0JTUyBhcmVhLiAqLworCW9mZnNldCA9IGNwdV9yZWctPnNwYWRfYmFzZSArIChmdy0+c2Jzc19hZGRyIC0gY3B1X3JlZy0+bWlwc192aWV3X2Jhc2UpOworCWlmIChmdy0+c2JzcykgeworCQl1bnNpZ25lZCBpbnQgajsKKworCQlmb3IgKGogPSAwOyBqIDwgKGZ3LT5zYnNzX2xlbiAvIDQpOyBqKyssIG9mZnNldCArPSA0KSB7CisJCQlSRUdfV1JfSU5EKGJwLCBvZmZzZXQsIGZ3LT5zYnNzW2pdKTsKKwkJfQorCX0KKworCS8qIExvYWQgdGhlIEJTUyBhcmVhLiAqLworCW9mZnNldCA9IGNwdV9yZWctPnNwYWRfYmFzZSArIChmdy0+YnNzX2FkZHIgLSBjcHVfcmVnLT5taXBzX3ZpZXdfYmFzZSk7CisJaWYgKGZ3LT5ic3MpIHsKKwkJdW5zaWduZWQgaW50IGo7CisKKwkJZm9yIChqID0gMDsgaiA8IChmdy0+YnNzX2xlbi80KTsgaisrLCBvZmZzZXQgKz0gNCkgeworCQkJUkVHX1dSX0lORChicCwgb2Zmc2V0LCBmdy0+YnNzW2pdKTsKKwkJfQorCX0KKworCS8qIExvYWQgdGhlIFJlYWQtT25seSBhcmVhLiAqLworCW9mZnNldCA9IGNwdV9yZWctPnNwYWRfYmFzZSArCisJCShmdy0+cm9kYXRhX2FkZHIgLSBjcHVfcmVnLT5taXBzX3ZpZXdfYmFzZSk7CisJaWYgKGZ3LT5yb2RhdGEpIHsKKwkJdW5zaWduZWQgaW50IGo7CisKKwkJZm9yIChqID0gMDsgaiA8IChmdy0+cm9kYXRhX2xlbiAvIDQpOyBqKyssIG9mZnNldCArPSA0KSB7CisJCQlSRUdfV1JfSU5EKGJwLCBvZmZzZXQsIGZ3LT5yb2RhdGFbal0pOworCQl9CisJfQorCisJLyogQ2xlYXIgdGhlIHByZS1mZXRjaCBpbnN0cnVjdGlvbi4gKi8KKwlSRUdfV1JfSU5EKGJwLCBjcHVfcmVnLT5pbnN0LCAwKTsKKwlSRUdfV1JfSU5EKGJwLCBjcHVfcmVnLT5wYywgZnctPnN0YXJ0X2FkZHIpOworCisJLyogU3RhcnQgdGhlIENQVS4gKi8KKwl2YWwgPSBSRUdfUkRfSU5EKGJwLCBjcHVfcmVnLT5tb2RlKTsKKwl2YWwgJj0gfmNwdV9yZWctPm1vZGVfdmFsdWVfaGFsdDsKKwlSRUdfV1JfSU5EKGJwLCBjcHVfcmVnLT5zdGF0ZSwgY3B1X3JlZy0+c3RhdGVfdmFsdWVfY2xlYXIpOworCVJFR19XUl9JTkQoYnAsIGNwdV9yZWctPm1vZGUsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitibngyX2luaXRfY3B1cyhzdHJ1Y3QgYm54MiAqYnApCit7CisJc3RydWN0IGNwdV9yZWcgY3B1X3JlZzsKKwlzdHJ1Y3QgZndfaW5mbyBmdzsKKworCS8qIFVuZm9ydHVuYXRlbHksIGl0IGxvb2tzIGxpa2Ugd2UgbmVlZCB0byBsb2FkIHRoZSBmaXJtd2FyZQorCSAqIGJlZm9yZSB0aGUgY2FyZCB3aWxsIHdvcmsgcHJvcGVybHkuICBUaGF0IG1lYW5zIHRoaXMgZHJpdmVyCisJICogd2lsbCBiZSBodWdlIGJ5IEV0aGVyYm9vdCBzdGFuZGFyZHMgKGFwcHJveC4gNTBLIGNvbXByZXNzZWQpLgorCSAqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgUlYyUCBwcm9jZXNzb3IuICovCisJbG9hZF9ydjJwX2Z3KGJwLCBibngyX3J2MnBfcHJvYzEsIHNpemVvZihibngyX3J2MnBfcHJvYzEpLCBSVjJQX1BST0MxKTsKKwlsb2FkX3J2MnBfZncoYnAsIGJueDJfcnYycF9wcm9jMiwgc2l6ZW9mKGJueDJfcnYycF9wcm9jMiksIFJWMlBfUFJPQzIpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgUlggUHJvY2Vzc29yLiAqLworCWNwdV9yZWcubW9kZSA9IEJOWDJfUlhQX0NQVV9NT0RFOworCWNwdV9yZWcubW9kZV92YWx1ZV9oYWx0ID0gQk5YMl9SWFBfQ1BVX01PREVfU09GVF9IQUxUOworCWNwdV9yZWcubW9kZV92YWx1ZV9zc3RlcCA9IEJOWDJfUlhQX0NQVV9NT0RFX1NURVBfRU5BOworCWNwdV9yZWcuc3RhdGUgPSBCTlgyX1JYUF9DUFVfU1RBVEU7CisJY3B1X3JlZy5zdGF0ZV92YWx1ZV9jbGVhciA9IDB4ZmZmZmZmOworCWNwdV9yZWcuZ3ByMCA9IEJOWDJfUlhQX0NQVV9SRUdfRklMRTsKKwljcHVfcmVnLmV2bWFzayA9IEJOWDJfUlhQX0NQVV9FVkVOVF9NQVNLOworCWNwdV9yZWcucGMgPSBCTlgyX1JYUF9DUFVfUFJPR1JBTV9DT1VOVEVSOworCWNwdV9yZWcuaW5zdCA9IEJOWDJfUlhQX0NQVV9JTlNUUlVDVElPTjsKKwljcHVfcmVnLmJwID0gQk5YMl9SWFBfQ1BVX0hXX0JSRUFLUE9JTlQ7CisJY3B1X3JlZy5zcGFkX2Jhc2UgPSBCTlgyX1JYUF9TQ1JBVENIOworCWNwdV9yZWcubWlwc192aWV3X2Jhc2UgPSAweDgwMDAwMDA7CisKKwlmdy52ZXJfbWFqb3IgPSBibngyX1JYUF9iMDZGd1JlbGVhc2VNYWpvcjsKKwlmdy52ZXJfbWlub3IgPSBibngyX1JYUF9iMDZGd1JlbGVhc2VNaW5vcjsKKwlmdy52ZXJfZml4ID0gYm54Ml9SWFBfYjA2RndSZWxlYXNlRml4OworCWZ3LnN0YXJ0X2FkZHIgPSBibngyX1JYUF9iMDZGd1N0YXJ0QWRkcjsKKworCWZ3LnRleHRfYWRkciA9IGJueDJfUlhQX2IwNkZ3VGV4dEFkZHI7CisJZncudGV4dF9sZW4gPSBibngyX1JYUF9iMDZGd1RleHRMZW47CisJZncudGV4dF9pbmRleCA9IDA7CisJZncudGV4dCA9IGJueDJfUlhQX2IwNkZ3VGV4dDsKKworCWZ3LmRhdGFfYWRkciA9IGJueDJfUlhQX2IwNkZ3RGF0YUFkZHI7CisJZncuZGF0YV9sZW4gPSBibngyX1JYUF9iMDZGd0RhdGFMZW47CisJZncuZGF0YV9pbmRleCA9IDA7CisJZncuZGF0YSA9IGJueDJfUlhQX2IwNkZ3RGF0YTsKKworCWZ3LnNic3NfYWRkciA9IGJueDJfUlhQX2IwNkZ3U2Jzc0FkZHI7CisJZncuc2Jzc19sZW4gPSBibngyX1JYUF9iMDZGd1Nic3NMZW47CisJZncuc2Jzc19pbmRleCA9IDA7CisJZncuc2JzcyA9IGJueDJfUlhQX2IwNkZ3U2JzczsKKworCWZ3LmJzc19hZGRyID0gYm54Ml9SWFBfYjA2RndCc3NBZGRyOworCWZ3LmJzc19sZW4gPSBibngyX1JYUF9iMDZGd0Jzc0xlbjsKKwlmdy5ic3NfaW5kZXggPSAwOworCWZ3LmJzcyA9IGJueDJfUlhQX2IwNkZ3QnNzOworCisJZncucm9kYXRhX2FkZHIgPSBibngyX1JYUF9iMDZGd1JvZGF0YUFkZHI7CisJZncucm9kYXRhX2xlbiA9IGJueDJfUlhQX2IwNkZ3Um9kYXRhTGVuOworCWZ3LnJvZGF0YV9pbmRleCA9IDA7CisJZncucm9kYXRhID0gYm54Ml9SWFBfYjA2RndSb2RhdGE7CisKKwlsb2FkX2NwdV9mdyhicCwgJmNwdV9yZWcsICZmdyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBUWCBQcm9jZXNzb3IuICovCisJY3B1X3JlZy5tb2RlID0gQk5YMl9UWFBfQ1BVX01PREU7CisJY3B1X3JlZy5tb2RlX3ZhbHVlX2hhbHQgPSBCTlgyX1RYUF9DUFVfTU9ERV9TT0ZUX0hBTFQ7CisJY3B1X3JlZy5tb2RlX3ZhbHVlX3NzdGVwID0gQk5YMl9UWFBfQ1BVX01PREVfU1RFUF9FTkE7CisJY3B1X3JlZy5zdGF0ZSA9IEJOWDJfVFhQX0NQVV9TVEFURTsKKwljcHVfcmVnLnN0YXRlX3ZhbHVlX2NsZWFyID0gMHhmZmZmZmY7CisJY3B1X3JlZy5ncHIwID0gQk5YMl9UWFBfQ1BVX1JFR19GSUxFOworCWNwdV9yZWcuZXZtYXNrID0gQk5YMl9UWFBfQ1BVX0VWRU5UX01BU0s7CisJY3B1X3JlZy5wYyA9IEJOWDJfVFhQX0NQVV9QUk9HUkFNX0NPVU5URVI7CisJY3B1X3JlZy5pbnN0ID0gQk5YMl9UWFBfQ1BVX0lOU1RSVUNUSU9OOworCWNwdV9yZWcuYnAgPSBCTlgyX1RYUF9DUFVfSFdfQlJFQUtQT0lOVDsKKwljcHVfcmVnLnNwYWRfYmFzZSA9IEJOWDJfVFhQX1NDUkFUQ0g7CisJY3B1X3JlZy5taXBzX3ZpZXdfYmFzZSA9IDB4ODAwMDAwMDsKKyAgICAKKwlmdy52ZXJfbWFqb3IgPSBibngyX1RYUF9iMDZGd1JlbGVhc2VNYWpvcjsKKwlmdy52ZXJfbWlub3IgPSBibngyX1RYUF9iMDZGd1JlbGVhc2VNaW5vcjsKKwlmdy52ZXJfZml4ID0gYm54Ml9UWFBfYjA2RndSZWxlYXNlRml4OworCWZ3LnN0YXJ0X2FkZHIgPSBibngyX1RYUF9iMDZGd1N0YXJ0QWRkcjsKKworCWZ3LnRleHRfYWRkciA9IGJueDJfVFhQX2IwNkZ3VGV4dEFkZHI7CisJZncudGV4dF9sZW4gPSBibngyX1RYUF9iMDZGd1RleHRMZW47CisJZncudGV4dF9pbmRleCA9IDA7CisJZncudGV4dCA9IGJueDJfVFhQX2IwNkZ3VGV4dDsKKworCWZ3LmRhdGFfYWRkciA9IGJueDJfVFhQX2IwNkZ3RGF0YUFkZHI7CisJZncuZGF0YV9sZW4gPSBibngyX1RYUF9iMDZGd0RhdGFMZW47CisJZncuZGF0YV9pbmRleCA9IDA7CisJZncuZGF0YSA9IGJueDJfVFhQX2IwNkZ3RGF0YTsKKworCWZ3LnNic3NfYWRkciA9IGJueDJfVFhQX2IwNkZ3U2Jzc0FkZHI7CisJZncuc2Jzc19sZW4gPSBibngyX1RYUF9iMDZGd1Nic3NMZW47CisJZncuc2Jzc19pbmRleCA9IDA7CisJZncuc2JzcyA9IGJueDJfVFhQX2IwNkZ3U2JzczsKKworCWZ3LmJzc19hZGRyID0gYm54Ml9UWFBfYjA2RndCc3NBZGRyOworCWZ3LmJzc19sZW4gPSBibngyX1RYUF9iMDZGd0Jzc0xlbjsKKwlmdy5ic3NfaW5kZXggPSAwOworCWZ3LmJzcyA9IGJueDJfVFhQX2IwNkZ3QnNzOworCisJZncucm9kYXRhX2FkZHIgPSBibngyX1RYUF9iMDZGd1JvZGF0YUFkZHI7CisJZncucm9kYXRhX2xlbiA9IGJueDJfVFhQX2IwNkZ3Um9kYXRhTGVuOworCWZ3LnJvZGF0YV9pbmRleCA9IDA7CisJZncucm9kYXRhID0gYm54Ml9UWFBfYjA2RndSb2RhdGE7CisKKwlsb2FkX2NwdV9mdyhicCwgJmNwdV9yZWcsICZmdyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBUWCBQYXRjaC11cCBQcm9jZXNzb3IuICovCisJY3B1X3JlZy5tb2RlID0gQk5YMl9UUEFUX0NQVV9NT0RFOworCWNwdV9yZWcubW9kZV92YWx1ZV9oYWx0ID0gQk5YMl9UUEFUX0NQVV9NT0RFX1NPRlRfSEFMVDsKKwljcHVfcmVnLm1vZGVfdmFsdWVfc3N0ZXAgPSBCTlgyX1RQQVRfQ1BVX01PREVfU1RFUF9FTkE7CisJY3B1X3JlZy5zdGF0ZSA9IEJOWDJfVFBBVF9DUFVfU1RBVEU7CisJY3B1X3JlZy5zdGF0ZV92YWx1ZV9jbGVhciA9IDB4ZmZmZmZmOworCWNwdV9yZWcuZ3ByMCA9IEJOWDJfVFBBVF9DUFVfUkVHX0ZJTEU7CisJY3B1X3JlZy5ldm1hc2sgPSBCTlgyX1RQQVRfQ1BVX0VWRU5UX01BU0s7CisJY3B1X3JlZy5wYyA9IEJOWDJfVFBBVF9DUFVfUFJPR1JBTV9DT1VOVEVSOworCWNwdV9yZWcuaW5zdCA9IEJOWDJfVFBBVF9DUFVfSU5TVFJVQ1RJT047CisJY3B1X3JlZy5icCA9IEJOWDJfVFBBVF9DUFVfSFdfQlJFQUtQT0lOVDsKKwljcHVfcmVnLnNwYWRfYmFzZSA9IEJOWDJfVFBBVF9TQ1JBVENIOworCWNwdV9yZWcubWlwc192aWV3X2Jhc2UgPSAweDgwMDAwMDA7CisgICAgCisJZncudmVyX21ham9yID0gYm54Ml9UUEFUX2IwNkZ3UmVsZWFzZU1ham9yOworCWZ3LnZlcl9taW5vciA9IGJueDJfVFBBVF9iMDZGd1JlbGVhc2VNaW5vcjsKKwlmdy52ZXJfZml4ID0gYm54Ml9UUEFUX2IwNkZ3UmVsZWFzZUZpeDsKKwlmdy5zdGFydF9hZGRyID0gYm54Ml9UUEFUX2IwNkZ3U3RhcnRBZGRyOworCisJZncudGV4dF9hZGRyID0gYm54Ml9UUEFUX2IwNkZ3VGV4dEFkZHI7CisJZncudGV4dF9sZW4gPSBibngyX1RQQVRfYjA2RndUZXh0TGVuOworCWZ3LnRleHRfaW5kZXggPSAwOworCWZ3LnRleHQgPSBibngyX1RQQVRfYjA2RndUZXh0OworCisJZncuZGF0YV9hZGRyID0gYm54Ml9UUEFUX2IwNkZ3RGF0YUFkZHI7CisJZncuZGF0YV9sZW4gPSBibngyX1RQQVRfYjA2RndEYXRhTGVuOworCWZ3LmRhdGFfaW5kZXggPSAwOworCWZ3LmRhdGEgPSBibngyX1RQQVRfYjA2RndEYXRhOworCisJZncuc2Jzc19hZGRyID0gYm54Ml9UUEFUX2IwNkZ3U2Jzc0FkZHI7CisJZncuc2Jzc19sZW4gPSBibngyX1RQQVRfYjA2RndTYnNzTGVuOworCWZ3LnNic3NfaW5kZXggPSAwOworCWZ3LnNic3MgPSBibngyX1RQQVRfYjA2RndTYnNzOworCisJZncuYnNzX2FkZHIgPSBibngyX1RQQVRfYjA2RndCc3NBZGRyOworCWZ3LmJzc19sZW4gPSBibngyX1RQQVRfYjA2RndCc3NMZW47CisJZncuYnNzX2luZGV4ID0gMDsKKwlmdy5ic3MgPSBibngyX1RQQVRfYjA2RndCc3M7CisKKwlmdy5yb2RhdGFfYWRkciA9IGJueDJfVFBBVF9iMDZGd1JvZGF0YUFkZHI7CisJZncucm9kYXRhX2xlbiA9IGJueDJfVFBBVF9iMDZGd1JvZGF0YUxlbjsKKwlmdy5yb2RhdGFfaW5kZXggPSAwOworCWZ3LnJvZGF0YSA9IGJueDJfVFBBVF9iMDZGd1JvZGF0YTsKKworCWxvYWRfY3B1X2Z3KGJwLCAmY3B1X3JlZywgJmZ3KTsKKworCS8qIEluaXRpYWxpemUgdGhlIENvbXBsZXRpb24gUHJvY2Vzc29yLiAqLworCWNwdV9yZWcubW9kZSA9IEJOWDJfQ09NX0NQVV9NT0RFOworCWNwdV9yZWcubW9kZV92YWx1ZV9oYWx0ID0gQk5YMl9DT01fQ1BVX01PREVfU09GVF9IQUxUOworCWNwdV9yZWcubW9kZV92YWx1ZV9zc3RlcCA9IEJOWDJfQ09NX0NQVV9NT0RFX1NURVBfRU5BOworCWNwdV9yZWcuc3RhdGUgPSBCTlgyX0NPTV9DUFVfU1RBVEU7CisJY3B1X3JlZy5zdGF0ZV92YWx1ZV9jbGVhciA9IDB4ZmZmZmZmOworCWNwdV9yZWcuZ3ByMCA9IEJOWDJfQ09NX0NQVV9SRUdfRklMRTsKKwljcHVfcmVnLmV2bWFzayA9IEJOWDJfQ09NX0NQVV9FVkVOVF9NQVNLOworCWNwdV9yZWcucGMgPSBCTlgyX0NPTV9DUFVfUFJPR1JBTV9DT1VOVEVSOworCWNwdV9yZWcuaW5zdCA9IEJOWDJfQ09NX0NQVV9JTlNUUlVDVElPTjsKKwljcHVfcmVnLmJwID0gQk5YMl9DT01fQ1BVX0hXX0JSRUFLUE9JTlQ7CisJY3B1X3JlZy5zcGFkX2Jhc2UgPSBCTlgyX0NPTV9TQ1JBVENIOworCWNwdV9yZWcubWlwc192aWV3X2Jhc2UgPSAweDgwMDAwMDA7CisgICAgCisJZncudmVyX21ham9yID0gYm54Ml9DT01fYjA2RndSZWxlYXNlTWFqb3I7CisJZncudmVyX21pbm9yID0gYm54Ml9DT01fYjA2RndSZWxlYXNlTWlub3I7CisJZncudmVyX2ZpeCA9IGJueDJfQ09NX2IwNkZ3UmVsZWFzZUZpeDsKKwlmdy5zdGFydF9hZGRyID0gYm54Ml9DT01fYjA2RndTdGFydEFkZHI7CisKKwlmdy50ZXh0X2FkZHIgPSBibngyX0NPTV9iMDZGd1RleHRBZGRyOworCWZ3LnRleHRfbGVuID0gYm54Ml9DT01fYjA2RndUZXh0TGVuOworCWZ3LnRleHRfaW5kZXggPSAwOworCWZ3LnRleHQgPSBibngyX0NPTV9iMDZGd1RleHQ7CisKKwlmdy5kYXRhX2FkZHIgPSBibngyX0NPTV9iMDZGd0RhdGFBZGRyOworCWZ3LmRhdGFfbGVuID0gYm54Ml9DT01fYjA2RndEYXRhTGVuOworCWZ3LmRhdGFfaW5kZXggPSAwOworCWZ3LmRhdGEgPSBibngyX0NPTV9iMDZGd0RhdGE7CisKKwlmdy5zYnNzX2FkZHIgPSBibngyX0NPTV9iMDZGd1Nic3NBZGRyOworCWZ3LnNic3NfbGVuID0gYm54Ml9DT01fYjA2RndTYnNzTGVuOworCWZ3LnNic3NfaW5kZXggPSAwOworCWZ3LnNic3MgPSBibngyX0NPTV9iMDZGd1Nic3M7CisKKwlmdy5ic3NfYWRkciA9IGJueDJfQ09NX2IwNkZ3QnNzQWRkcjsKKwlmdy5ic3NfbGVuID0gYm54Ml9DT01fYjA2RndCc3NMZW47CisJZncuYnNzX2luZGV4ID0gMDsKKwlmdy5ic3MgPSBibngyX0NPTV9iMDZGd0JzczsKKworCWZ3LnJvZGF0YV9hZGRyID0gYm54Ml9DT01fYjA2RndSb2RhdGFBZGRyOworCWZ3LnJvZGF0YV9sZW4gPSBibngyX0NPTV9iMDZGd1JvZGF0YUxlbjsKKwlmdy5yb2RhdGFfaW5kZXggPSAwOworCWZ3LnJvZGF0YSA9IGJueDJfQ09NX2IwNkZ3Um9kYXRhOworCisJbG9hZF9jcHVfZncoYnAsICZjcHVfcmVnLCAmZncpOworCit9CisKK3N0YXRpYyBpbnQKK2JueDJfc2V0X3Bvd2VyX3N0YXRlXzAoc3RydWN0IGJueDIgKmJwKQoreworCXUxNiBwbWNzcjsKKwl1MzIgdmFsOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnAtPnBkZXYsIGJwLT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwgJnBtY3NyKTsKKworCXBjaV93cml0ZV9jb25maWdfd29yZChicC0+cGRldiwgYnAtPnBtX2NhcCArIFBDSV9QTV9DVFJMLAorCQkocG1jc3IgJiB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSykgfAorCQlQQ0lfUE1fQ1RSTF9QTUVfU1RBVFVTKTsKKworCWlmIChwbWNzciAmIFBDSV9QTV9DVFJMX1NUQVRFX01BU0spCisJCS8qIGRlbGF5IHJlcXVpcmVkIGR1cmluZyB0cmFuc2l0aW9uIG91dCBvZiBEM2hvdCAqLworCQltZGVsYXkoMjApOworCisJdmFsID0gUkVHX1JEKGJwLCBCTlgyX0VNQUNfTU9ERSk7CisJdmFsIHw9IEJOWDJfRU1BQ19NT0RFX01QS1RfUkNWRCB8IEJOWDJfRU1BQ19NT0RFX0FDUElfUkNWRDsKKwl2YWwgJj0gfkJOWDJfRU1BQ19NT0RFX01QS1Q7CisJUkVHX1dSKGJwLCBCTlgyX0VNQUNfTU9ERSwgdmFsKTsKKworCXZhbCA9IFJFR19SRChicCwgQk5YMl9SUE1fQ09ORklHKTsKKwl2YWwgJj0gfkJOWDJfUlBNX0NPTkZJR19BQ1BJX0VOQTsKKwlSRUdfV1IoYnAsIEJOWDJfUlBNX0NPTkZJRywgdmFsKTsKKwkJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitibngyX2VuYWJsZV9udnJhbV9hY2Nlc3Moc3RydWN0IGJueDIgKmJwKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBSRUdfUkQoYnAsIEJOWDJfTlZNX0FDQ0VTU19FTkFCTEUpOworCS8qIEVuYWJsZSBib3RoIGJpdHMsIGV2ZW4gb24gcmVhZC4gKi8KKwlSRUdfV1IoYnAsIEJOWDJfTlZNX0FDQ0VTU19FTkFCTEUsIAorCSAgICAgICB2YWwgfCBCTlgyX05WTV9BQ0NFU1NfRU5BQkxFX0VOIHwgQk5YMl9OVk1fQUNDRVNTX0VOQUJMRV9XUl9FTik7Cit9CisKK3N0YXRpYyB2b2lkCitibngyX2Rpc2FibGVfbnZyYW1fYWNjZXNzKHN0cnVjdCBibngyICpicCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gUkVHX1JEKGJwLCBCTlgyX05WTV9BQ0NFU1NfRU5BQkxFKTsKKwkvKiBEaXNhYmxlIGJvdGggYml0cywgZXZlbiBhZnRlciByZWFkLiAqLworCVJFR19XUihicCwgQk5YMl9OVk1fQUNDRVNTX0VOQUJMRSwgCisJCXZhbCAmIH4oQk5YMl9OVk1fQUNDRVNTX0VOQUJMRV9FTiB8CisJCQlCTlgyX05WTV9BQ0NFU1NfRU5BQkxFX1dSX0VOKSk7Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfaW5pdF9udnJhbShzdHJ1Y3QgYm54MiAqYnApCit7CisJdTMyIHZhbDsKKwlpbnQgaiwgZW50cnlfY291bnQsIHJjOworCXN0cnVjdCBmbGFzaF9zcGVjICpmbGFzaDsKKworCS8qIERldGVybWluZSB0aGUgc2VsZWN0ZWQgaW50ZXJmYWNlLiAqLworCXZhbCA9IFJFR19SRChicCwgQk5YMl9OVk1fQ0ZHMSk7CisKKwllbnRyeV9jb3VudCA9IHNpemVvZihmbGFzaF90YWJsZSkgLyBzaXplb2Yoc3RydWN0IGZsYXNoX3NwZWMpOworCisJcmMgPSAwOworCWlmICh2YWwgJiAweDQwMDAwMDAwKSB7CisJCS8qIEZsYXNoIGludGVyZmFjZSBoYXMgYmVlbiByZWNvbmZpZ3VyZWQgKi8KKwkJZm9yIChqID0gMCwgZmxhc2ggPSAmZmxhc2hfdGFibGVbMF07IGogPCBlbnRyeV9jb3VudDsKKwkJICAgICBqKyssIGZsYXNoKyspIHsKKwkJCWlmICgodmFsICYgRkxBU0hfQkFDS1VQX1NUUkFQX01BU0spID09CisJCQkgICAgKGZsYXNoLT5jb25maWcxICYgRkxBU0hfQkFDS1VQX1NUUkFQX01BU0spKSB7CisJCQkJYnAtPmZsYXNoX2luZm8gPSBmbGFzaDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwllbHNlIHsKKwkJdTMyIG1hc2s7CisJCS8qIE5vdCB5ZXQgYmVlbiByZWNvbmZpZ3VyZWQgKi8KKworCQlpZiAodmFsICYgKDEgPDwgMjMpKQorCQkJbWFzayA9IEZMQVNIX0JBQ0tVUF9TVFJBUF9NQVNLOworCQllbHNlCisJCQltYXNrID0gRkxBU0hfU1RSQVBfTUFTSzsKKworCQlmb3IgKGogPSAwLCBmbGFzaCA9ICZmbGFzaF90YWJsZVswXTsgaiA8IGVudHJ5X2NvdW50OworCQkJaisrLCBmbGFzaCsrKSB7CisKKwkJCWlmICgodmFsICYgbWFzaykgPT0gKGZsYXNoLT5zdHJhcHBpbmcgJiBtYXNrKSkgeworCQkJCWJwLT5mbGFzaF9pbmZvID0gZmxhc2g7CisKKwkJCQkvKiBFbmFibGUgYWNjZXNzIHRvIGZsYXNoIGludGVyZmFjZSAqLworCQkJCWJueDJfZW5hYmxlX252cmFtX2FjY2VzcyhicCk7CisKKwkJCQkvKiBSZWNvbmZpZ3VyZSB0aGUgZmxhc2ggaW50ZXJmYWNlICovCisJCQkJUkVHX1dSKGJwLCBCTlgyX05WTV9DRkcxLCBmbGFzaC0+Y29uZmlnMSk7CisJCQkJUkVHX1dSKGJwLCBCTlgyX05WTV9DRkcyLCBmbGFzaC0+Y29uZmlnMik7CisJCQkJUkVHX1dSKGJwLCBCTlgyX05WTV9DRkczLCBmbGFzaC0+Y29uZmlnMyk7CisJCQkJUkVHX1dSKGJwLCBCTlgyX05WTV9XUklURTEsIGZsYXNoLT53cml0ZTEpOworCisJCQkJLyogRGlzYWJsZSBhY2Nlc3MgdG8gZmxhc2ggaW50ZXJmYWNlICovCisJCQkJYm54Ml9kaXNhYmxlX252cmFtX2FjY2VzcyhicCk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gLyogaWYgKHZhbCAmIDB4NDAwMDAwMDApICovCisKKwlpZiAoaiA9PSBlbnRyeV9jb3VudCkgeworCQlicC0+Zmxhc2hfaW5mbyA9IE5VTEw7CisJCXByaW50ZigiVW5rbm93biBmbGFzaC9FRVBST00gdHlwZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl2YWwgPSBSRUdfUkRfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArIEJOWDJfU0hBUkVEX0hXX0NGR19DT05GSUcyKTsKKwl2YWwgJj0gQk5YMl9TSEFSRURfSFdfQ0ZHMl9OVk1fU0laRV9NQVNLOworCWlmICh2YWwpIHsKKwkJYnAtPmZsYXNoX3NpemUgPSB2YWw7CisJfQorCWVsc2UgeworCQlicC0+Zmxhc2hfc2l6ZSA9IGJwLT5mbGFzaF9pbmZvLT50b3RhbF9zaXplOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorYm54Ml9yZXNldF9jaGlwKHN0cnVjdCBibngyICpicCwgdTMyIHJlc2V0X2NvZGUpCit7CisJdTMyIHZhbDsKKwlpbnQgaSwgcmMgPSAwOworCisJLyogV2FpdCBmb3IgdGhlIGN1cnJlbnQgUENJIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlIGJlZm9yZQorCSAqIGlzc3VpbmcgYSByZXNldC4gKi8KKwlSRUdfV1IoYnAsIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFMsCisJICAgICAgIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfVFhfRE1BX0VOQUJMRSB8CisJICAgICAgIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfRE1BX0VOR0lORV9FTkFCTEUgfAorCSAgICAgICBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX1JYX0RNQV9FTkFCTEUgfAorCSAgICAgICBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX0hPU1RfQ09BTEVTQ0VfRU5BQkxFKTsKKwl2YWwgPSBSRUdfUkQoYnAsIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFMpOworCXVkZWxheSg1KTsKKworCisJLyogV2FpdCBmb3IgdGhlIGZpcm13YXJlIHRvIHRlbGwgdXMgaXQgaXMgb2sgdG8gaXNzdWUgYSByZXNldC4gKi8KKwlibngyX2Z3X3N5bmMoYnAsIEJOWDJfRFJWX01TR19EQVRBX1dBSVQwIHwgcmVzZXRfY29kZSwgMSk7CisKKwkvKiBEZXBvc2l0IGEgZHJpdmVyIHJlc2V0IHNpZ25hdHVyZSBzbyB0aGUgZmlybXdhcmUga25vd3MgdGhhdAorCSAqIHRoaXMgaXMgYSBzb2Z0IHJlc2V0LiAqLworCVJFR19XUl9JTkQoYnAsIGJwLT5zaG1lbV9iYXNlICsgQk5YMl9EUlZfUkVTRVRfU0lHTkFUVVJFLAorCQkgICBCTlgyX0RSVl9SRVNFVF9TSUdOQVRVUkVfTUFHSUMpOworCisJLyogRG8gYSBkdW1teSByZWFkIHRvIGZvcmNlIHRoZSBjaGlwIHRvIGNvbXBsZXRlIGFsbCBjdXJyZW50IHRyYW5zYWN0aW9uCisJICogYmVmb3JlIHdlIGlzc3VlIGEgcmVzZXQuICovCisJdmFsID0gUkVHX1JEKGJwLCBCTlgyX01JU0NfSUQpOworCisJdmFsID0gQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfUkVRIHwKKwkgICAgICBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19SRUdfV0lORE9XX0VOQSB8CisJICAgICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfVEFSR0VUX01CX1dPUkRfU1dBUDsKKworCS8qIENoaXAgcmVzZXQuICovCisJUkVHX1dSKGJwLCBCTlgyX1BDSUNGR19NSVNDX0NPTkZJRywgdmFsKTsKKworCWlmICgoQ0hJUF9JRChicCkgPT0gQ0hJUF9JRF81NzA2X0EwKSB8fAorCSAgICAoQ0hJUF9JRChicCkgPT0gQ0hJUF9JRF81NzA2X0ExKSkKKwkJbWRlbGF5KDE1KTsKKworCS8qIFJlc2V0IHRha2VzIGFwcHJveGltYXRlIDMwIHVzZWMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQl2YWwgPSBSRUdfUkQoYnAsIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHKTsKKwkJaWYgKCh2YWwgJiAoQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfUkVRIHwKKwkJCSAgICBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9CU1kpKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KKworCWlmICh2YWwgJiAoQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfUkVRIHwKKwkJICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfQlNZKSkgeworCQlwcmludGYoIkNoaXAgcmVzZXQgZGlkIG5vdCBjb21wbGV0ZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogTWFrZSBzdXJlIGJ5dGUgc3dhcHBpbmcgaXMgcHJvcGVybHkgY29uZmlndXJlZC4gKi8KKwl2YWwgPSBSRUdfUkQoYnAsIEJOWDJfUENJX1NXQVBfRElBRzApOworCWlmICh2YWwgIT0gMHgwMTAyMDMwNCkgeworCQlwcmludGYoIkNoaXAgbm90IGluIGNvcnJlY3QgZW5kaWFuIG1vZGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgZmlybXdhcmUgdG8gZmluaXNoIGl0cyBpbml0aWFsaXphdGlvbi4gKi8KKwlyYyA9IGJueDJfZndfc3luYyhicCwgQk5YMl9EUlZfTVNHX0RBVEFfV0FJVDEgfCByZXNldF9jb2RlLCAwKTsKKwlpZiAocmMpIHsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChDSElQX0lEKGJwKSA9PSBDSElQX0lEXzU3MDZfQTApIHsKKwkJLyogQWRqdXN0IHRoZSB2b2x0YWdlIHJlZ3VsYXIgdG8gdHdvIHN0ZXBzIGxvd2VyLiAgVGhlIGRlZmF1bHQKKwkJICogb2YgdGhpcyByZWdpc3RlciBpcyAweDAwMDAwMDBlLiAqLworCQlSRUdfV1IoYnAsIEJOWDJfTUlTQ19WUkVHX0NPTlRST0wsIDB4MDAwMDAwZmEpOworCisJCS8qIFJlbW92ZSBiYWQgcmJ1ZiBtZW1vcnkgZnJvbSB0aGUgZnJlZSBwb29sLiAqLworCQlyYyA9IGJueDJfYWxsb2NfYmFkX3JidWYoYnApOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2JueDJfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJc3RydWN0IGJueDIqIGJwID0gJmJueDI7CisKKwlpZiAoYnAtPnJlZ3ZpZXcpIHsKKwkJYm54Ml9yZXNldF9jaGlwKGJwLCBCTlgyX0RSVl9NU0dfQ09ERV9VTkxPQUQpOworCQlpb3VubWFwKGJwLT5yZWd2aWV3KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfaW5pdF9jaGlwKHN0cnVjdCBibngyICpicCkKK3sKKwl1MzIgdmFsOworCWludCByYzsKKworCS8qIE1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGlzIG5vdCBhY3RpdmUuICovCisJUkVHX1dSKGJwLCBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRCwgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTURfTUFTS19JTlQpOworCisJdmFsID0gQk5YMl9ETUFfQ09ORklHX0RBVEFfQllURV9TV0FQIHwKKwkgICAgICBCTlgyX0RNQV9DT05GSUdfREFUQV9XT1JEX1NXQVAgfAorI2lmIF9fQllURV9PUkRFUiA9PSAgX19CSUdfRU5ESUFOCisJICAgICAgQk5YMl9ETUFfQ09ORklHX0NOVExfQllURV9TV0FQIHwgCisjZW5kaWYKKwkgICAgICBCTlgyX0RNQV9DT05GSUdfQ05UTF9XT1JEX1NXQVAgfCAKKwkgICAgICBETUFfUkVBRF9DSEFOUyA8PCAxMiB8CisJICAgICAgRE1BX1dSSVRFX0NIQU5TIDw8IDE2OworCisJdmFsIHw9ICgweDIgPDwgMjApIHwgKDEgPDwgMTEpOworCisJaWYgKChicC0+ZmxhZ3MgJiBQQ0lYX0ZMQUcpICYmIChicC0+YnVzX3NwZWVkX21oeiA9PSAxMzMpKQorCQl2YWwgfD0gKDEgPDwgMjMpOworCisJaWYgKChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwNikgJiYKKwkgICAgKENISVBfSUQoYnApICE9IENISVBfSURfNTcwNl9BMCkgJiYgIShicC0+ZmxhZ3MgJiBQQ0lYX0ZMQUcpKQorCQl2YWwgfD0gQk5YMl9ETUFfQ09ORklHX0NOVExfUElOR19QT05HX0RNQTsKKworCVJFR19XUihicCwgQk5YMl9ETUFfQ09ORklHLCB2YWwpOworCisJaWYgKENISVBfSUQoYnApID09IENISVBfSURfNTcwNl9BMCkgeworCQl2YWwgPSBSRUdfUkQoYnAsIEJOWDJfVERNQV9DT05GSUcpOworCQl2YWwgfD0gQk5YMl9URE1BX0NPTkZJR19PTkVfRE1BOworCQlSRUdfV1IoYnAsIEJOWDJfVERNQV9DT05GSUcsIHZhbCk7CisJfQorCisJaWYgKGJwLT5mbGFncyAmIFBDSVhfRkxBRykgeworCQl1MTYgdmFsMTY7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnAtPnBkZXYsIGJwLT5wY2l4X2NhcCArIFBDSV9YX0NNRCwKKwkJCQkgICAgICZ2YWwxNik7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChicC0+cGRldiwgYnAtPnBjaXhfY2FwICsgUENJX1hfQ01ELAorCQkJCSAgICAgIHZhbDE2ICYgflBDSV9YX0NNRF9FUk8pOworCX0KKworCVJFR19XUihicCwgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUUywKKwkgICAgICAgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19IT1NUX0NPQUxFU0NFX0VOQUJMRSB8CisJICAgICAgIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfUlhfVjJQX0VOQUJMRSB8CisJICAgICAgIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfQ09OVEVYVF9FTkFCTEUpOworCisJLyogSW5pdGlhbGl6ZSBjb250ZXh0IG1hcHBpbmcgYW5kIHplcm8gb3V0IHRoZSBxdWljayBjb250ZXh0cy4gIFRoZQorCSAqIGNvbnRleHQgYmxvY2sgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBlbmFibGVkLiAqLworCWJueDJfaW5pdF9jb250ZXh0KGJwKTsKKworCWJueDJfaW5pdF9udnJhbShicCk7CisJYm54Ml9pbml0X2NwdXMoYnApOworCisJYm54Ml9zZXRfbWFjX2FkZHIoYnApOworCisJdmFsID0gUkVHX1JEKGJwLCBCTlgyX01RX0NPTkZJRyk7CisJdmFsICY9IH5CTlgyX01RX0NPTkZJR19LTkxfQllQX0JMS19TSVpFOworCXZhbCB8PSBCTlgyX01RX0NPTkZJR19LTkxfQllQX0JMS19TSVpFXzI1NjsKKwlSRUdfV1IoYnAsIEJOWDJfTVFfQ09ORklHLCB2YWwpOworCisJdmFsID0gMHgxMDAwMCArIChNQVhfQ0lEX0NOVCAqIE1CX0tFUk5FTF9DVFhfU0laRSk7CisJUkVHX1dSKGJwLCBCTlgyX01RX0tOTF9CWVBfV0lORF9TVEFSVCwgdmFsKTsKKwlSRUdfV1IoYnAsIEJOWDJfTVFfS05MX1dJTkRfRU5ELCB2YWwpOworCisJdmFsID0gKEJDTV9QQUdFX0JJVFMgLSA4KSA8PCAyNDsKKwlSRUdfV1IoYnAsIEJOWDJfUlYyUF9DT05GSUcsIHZhbCk7CisKKwkvKiBDb25maWd1cmUgcGFnZSBzaXplLiAqLworCXZhbCA9IFJFR19SRChicCwgQk5YMl9UQkRSX0NPTkZJRyk7CisJdmFsICY9IH5CTlgyX1RCRFJfQ09ORklHX1BBR0VfU0laRTsKKwl2YWwgfD0gKEJDTV9QQUdFX0JJVFMgLSA4KSA8PCAyNCB8IDB4NDA7CisJUkVHX1dSKGJwLCBCTlgyX1RCRFJfQ09ORklHLCB2YWwpOworCisJdmFsID0gYnAtPm1hY19hZGRyWzBdICsKKwkgICAgICAoYnAtPm1hY19hZGRyWzFdIDw8IDgpICsKKwkgICAgICAoYnAtPm1hY19hZGRyWzJdIDw8IDE2KSArCisJICAgICAgYnAtPm1hY19hZGRyWzNdICsKKwkgICAgICAoYnAtPm1hY19hZGRyWzRdIDw8IDgpICsKKwkgICAgICAoYnAtPm1hY19hZGRyWzVdIDw8IDE2KTsKKwlSRUdfV1IoYnAsIEJOWDJfRU1BQ19CQUNLT0ZGX1NFRUQsIHZhbCk7CisKKwkvKiBQcm9ncmFtIHRoZSBNVFUuICBBbHNvIGluY2x1ZGUgNCBieXRlcyBmb3IgQ1JDMzIuICovCisJdmFsID0gRVRIX01BWF9NVFUgKyBFVEhfSExFTiArIDQ7CisJaWYgKHZhbCA+IChNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkUgKyA0KSkKKwkJdmFsIHw9IEJOWDJfRU1BQ19SWF9NVFVfU0laRV9KVU1CT19FTkE7CisJUkVHX1dSKGJwLCBCTlgyX0VNQUNfUlhfTVRVX1NJWkUsIHZhbCk7CisKKwlicC0+bGFzdF9zdGF0dXNfaWR4ID0gMDsKKwlicC0+cnhfbW9kZSA9IEJOWDJfRU1BQ19SWF9NT0RFX1NPUlRfTU9ERTsKKworCS8qIFNldCB1cCBob3cgdG8gZ2VuZXJhdGUgYSBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICovCisJUkVHX1dSKGJwLCBCTlgyX0VNQUNfQVRURU5USU9OX0VOQSwgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkFfTElOSyk7CisKKwlSRUdfV1IoYnAsIEJOWDJfSENfU1RBVFVTX0FERFJfTCwKKwkgICAgICAgKHU2NCkgYnAtPnN0YXR1c19ibGtfbWFwcGluZyAmIDB4ZmZmZmZmZmYpOworCVJFR19XUihicCwgQk5YMl9IQ19TVEFUVVNfQUREUl9ILCAodTY0KSBicC0+c3RhdHVzX2Jsa19tYXBwaW5nID4+IDMyKTsKKworCVJFR19XUihicCwgQk5YMl9IQ19TVEFUSVNUSUNTX0FERFJfTCwKKwkgICAgICAgKHU2NCkgYnAtPnN0YXRzX2Jsa19tYXBwaW5nICYgMHhmZmZmZmZmZik7CisJUkVHX1dSKGJwLCBCTlgyX0hDX1NUQVRJU1RJQ1NfQUREUl9ILAorCSAgICAgICAodTY0KSBicC0+c3RhdHNfYmxrX21hcHBpbmcgPj4gMzIpOworCisJUkVHX1dSKGJwLCBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUCwgCisJICAgICAgIChicC0+dHhfcXVpY2tfY29uc190cmlwX2ludCA8PCAxNikgfCBicC0+dHhfcXVpY2tfY29uc190cmlwKTsKKworCVJFR19XUihicCwgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVAsCisJICAgICAgIChicC0+cnhfcXVpY2tfY29uc190cmlwX2ludCA8PCAxNikgfCBicC0+cnhfcXVpY2tfY29uc190cmlwKTsKKworCVJFR19XUihicCwgQk5YMl9IQ19DT01QX1BST0RfVFJJUCwKKwkgICAgICAgKGJwLT5jb21wX3Byb2RfdHJpcF9pbnQgPDwgMTYpIHwgYnAtPmNvbXBfcHJvZF90cmlwKTsKKworCVJFR19XUihicCwgQk5YMl9IQ19UWF9USUNLUywgKGJwLT50eF90aWNrc19pbnQgPDwgMTYpIHwgYnAtPnR4X3RpY2tzKTsKKworCVJFR19XUihicCwgQk5YMl9IQ19SWF9USUNLUywgKGJwLT5yeF90aWNrc19pbnQgPDwgMTYpIHwgYnAtPnJ4X3RpY2tzKTsKKworCVJFR19XUihicCwgQk5YMl9IQ19DT01fVElDS1MsCisJICAgICAgIChicC0+Y29tX3RpY2tzX2ludCA8PCAxNikgfCBicC0+Y29tX3RpY2tzKTsKKworCVJFR19XUihicCwgQk5YMl9IQ19DTURfVElDS1MsCisJICAgICAgIChicC0+Y21kX3RpY2tzX2ludCA8PCAxNikgfCBicC0+Y21kX3RpY2tzKTsKKworCVJFR19XUihicCwgQk5YMl9IQ19TVEFUU19USUNLUywgYnAtPnN0YXRzX3RpY2tzICYgMHhmZmZmMDApOworCVJFR19XUihicCwgQk5YMl9IQ19TVEFUX0NPTExFQ1RfVElDS1MsIDB4YmI4KTsgIC8qIDNtcyAqLworCisJaWYgKENISVBfSUQoYnApID09IENISVBfSURfNTcwNl9BMSkKKwkJUkVHX1dSKGJwLCBCTlgyX0hDX0NPTkZJRywgQk5YMl9IQ19DT05GSUdfQ09MTEVDVF9TVEFUUyk7CisJZWxzZSB7CisJCVJFR19XUihicCwgQk5YMl9IQ19DT05GSUcsIEJOWDJfSENfQ09ORklHX1JYX1RNUl9NT0RFIHwKKwkJICAgICAgIEJOWDJfSENfQ09ORklHX1RYX1RNUl9NT0RFIHwKKwkJICAgICAgIEJOWDJfSENfQ09ORklHX0NPTExFQ1RfU1RBVFMpOworCX0KKworCS8qIENsZWFyIGludGVybmFsIHN0YXRzIGNvdW50ZXJzLiAqLworCVJFR19XUihicCwgQk5YMl9IQ19DT01NQU5ELCBCTlgyX0hDX0NPTU1BTkRfQ0xSX1NUQVRfTk9XKTsKKworCVJFR19XUihicCwgQk5YMl9IQ19BVFROX0JJVFNfRU5BQkxFLCBTVEFUVVNfQVRUTl9CSVRTX0xJTktfU1RBVEUpOworCisJaWYgKFJFR19SRF9JTkQoYnAsIGJwLT5zaG1lbV9iYXNlICsgQk5YMl9QT1JUX0ZFQVRVUkUpICYKKwkgICAgQk5YMl9QT1JUX0ZFQVRVUkVfQVNGX0VOQUJMRUQpCisJCWJwLT5mbGFncyB8PSBBU0ZfRU5BQkxFX0ZMQUc7CisKKwkvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIGZpbHRlci4gKi8KKwlibngyX3NldF9yeF9tb2RlKGJwLT5uaWMpOworCisJcmMgPSBibngyX2Z3X3N5bmMoYnAsIEJOWDJfRFJWX01TR19EQVRBX1dBSVQyIHwgQk5YMl9EUlZfTVNHX0NPREVfUkVTRVQsCisJCQkgIDApOworCisJUkVHX1dSKGJwLCBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTLCAweDVmZmZmZmYpOworCVJFR19SRChicCwgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUUyk7CisKKwl1ZGVsYXkoMjApOworCisJYnAtPmhjX2NtZCA9IFJFR19SRChicCwgQk5YMl9IQ19DT01NQU5EKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2JueDJfaW5pdF90eF9yaW5nKHN0cnVjdCBibngyICpicCkKK3sKKwlzdHJ1Y3QgdHhfYmQgKnR4YmQ7CisJdTMyIHZhbDsKKworCXR4YmQgPSAmYnAtPnR4X2Rlc2NfcmluZ1tNQVhfVFhfREVTQ19DTlRdOworCQkKKwkvKiBFdGhlcmJvb3QgbGl2ZXMgYmVsb3cgNEdCLCBzbyBoaSBpcyBhbHdheXMgMCAqLworCXR4YmQtPnR4X2JkX2hhZGRyX2hpID0gMDsKKwl0eGJkLT50eF9iZF9oYWRkcl9sbyA9IGJwLT50eF9kZXNjX21hcHBpbmc7CisKKwlicC0+dHhfcHJvZCA9IDA7CisJYnAtPnR4X2NvbnMgPSAwOworCWJwLT5od190eF9jb25zID0gMDsKKwlicC0+dHhfcHJvZF9ic2VxID0gMDsKKwkKKwl2YWwgPSBCTlgyX0wyQ1RYX1RZUEVfVFlQRV9MMjsKKwl2YWwgfD0gQk5YMl9MMkNUWF9UWVBFX1NJWkVfTDI7CisJQ1RYX1dSKGJwLCBHRVRfQ0lEX0FERFIoVFhfQ0lEKSwgQk5YMl9MMkNUWF9UWVBFLCB2YWwpOworCisJdmFsID0gQk5YMl9MMkNUWF9DTURfVFlQRV9UWVBFX0wyOworCXZhbCB8PSA4IDw8IDE2OworCUNUWF9XUihicCwgR0VUX0NJRF9BRERSKFRYX0NJRCksIEJOWDJfTDJDVFhfQ01EX1RZUEUsIHZhbCk7CisKKwkvKiBFdGhlcmJvb3QgbGl2ZXMgYmVsb3cgNEdCLCBzbyBoaSBpcyBhbHdheXMgMCAqLworCUNUWF9XUihicCwgR0VUX0NJRF9BRERSKFRYX0NJRCksIEJOWDJfTDJDVFhfVEJEUl9CSEFERFJfSEksIDApOworCisJdmFsID0gKHU2NCkgYnAtPnR4X2Rlc2NfbWFwcGluZyAmIDB4ZmZmZmZmZmY7CisJQ1RYX1dSKGJwLCBHRVRfQ0lEX0FERFIoVFhfQ0lEKSwgQk5YMl9MMkNUWF9UQkRSX0JIQUREUl9MTywgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK2JueDJfaW5pdF9yeF9yaW5nKHN0cnVjdCBibngyICpicCkKK3sKKwlzdHJ1Y3QgcnhfYmQgKnJ4YmQ7CisJdW5zaWduZWQgaW50IGk7CisJdTE2IHByb2QsIHJpbmdfcHJvZDsKKwl1MzIgdmFsOworCisJYnAtPnJ4X2J1Zl91c2Vfc2l6ZSA9IFJYX0JVRl9VU0VfU0laRTsKKwlicC0+cnhfYnVmX3NpemUgPSBSWF9CVUZfU0laRTsKKworCXJpbmdfcHJvZCA9IHByb2QgPSBicC0+cnhfcHJvZCA9IDA7CisJYnAtPnJ4X2NvbnMgPSAwOworCWJwLT5od19yeF9jb25zID0gMDsKKwlicC0+cnhfcHJvZF9ic2VxID0gMDsKKworCW1lbXNldChibngyX2Jzcy5yeF9idWYsIDAsIHNpemVvZihibngyX2Jzcy5yeF9idWYpKTsKKwkJCisJcnhiZCA9ICZicC0+cnhfZGVzY19yaW5nWzBdOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUlhfREVTQ19DTlQ7IGkrKywgcnhiZCsrKSB7CisJCXJ4YmQtPnJ4X2JkX2xlbiA9IGJwLT5yeF9idWZfdXNlX3NpemU7CisJCXJ4YmQtPnJ4X2JkX2ZsYWdzID0gUlhfQkRfRkxBR1NfU1RBUlQgfCBSWF9CRF9GTEFHU19FTkQ7CisJfQorCXJ4YmQtPnJ4X2JkX2hhZGRyX2hpID0gMDsKKwlyeGJkLT5yeF9iZF9oYWRkcl9sbyA9ICh1NjQpIGJwLT5yeF9kZXNjX21hcHBpbmcgJiAweGZmZmZmZmZmOworCisJdmFsID0gQk5YMl9MMkNUWF9DVFhfVFlQRV9DVFhfQkRfQ0hOX1RZUEVfVkFMVUU7CisJdmFsIHw9IEJOWDJfTDJDVFhfQ1RYX1RZUEVfU0laRV9MMjsKKwl2YWwgfD0gMHgwMiA8PCA4OworCUNUWF9XUihicCwgR0VUX0NJRF9BRERSKFJYX0NJRCksIEJOWDJfTDJDVFhfQ1RYX1RZUEUsIHZhbCk7CisKKwkvKiBFdGhlcmJvb3QgZG9lc24ndCB1c2UgbWVtb3J5IGFib3ZlIDRHQiwgc28gdGhpcyBpcyBhbHdheXMgMCAqLworCUNUWF9XUihicCwgR0VUX0NJRF9BRERSKFJYX0NJRCksIEJOWDJfTDJDVFhfTlhfQkRIQUREUl9ISSwgMCk7CisKKwl2YWwgPSBicC0+cnhfZGVzY19tYXBwaW5nICYgMHhmZmZmZmZmZjsKKwlDVFhfV1IoYnAsIEdFVF9DSURfQUREUihSWF9DSUQpLCBCTlgyX0wyQ1RYX05YX0JESEFERFJfTE8sIHZhbCk7CisKKwlmb3IgKGkgPSAwOyAoaW50KSBpIDwgYnAtPnJ4X3Jpbmdfc2l6ZTsgaSsrKSB7CisJCXJ4YmQgPSAmYnAtPnJ4X2Rlc2NfcmluZ1tSWF9SSU5HX0lEWChyaW5nX3Byb2QpXTsKKwkJcnhiZC0+cnhfYmRfaGFkZHJfaGkgPSAwOworCQlyeGJkLT5yeF9iZF9oYWRkcl9sbyA9IHZpcnRfdG9fYnVzKCZibngyX2Jzcy5yeF9idWZbcmluZ19wcm9kXVswXSk7CisJCWJwLT5yeF9wcm9kX2JzZXEgKz0gYnAtPnJ4X2J1Zl91c2Vfc2l6ZTsKKwkJcHJvZCA9IE5FWFRfUlhfQkQocHJvZCk7CisJCXJpbmdfcHJvZCA9IFJYX1JJTkdfSURYKHByb2QpOworCX0KKwlicC0+cnhfcHJvZCA9IHByb2Q7CisKKwlSRUdfV1IxNihicCwgTUJfUlhfQ0lEX0FERFIgKyBCTlgyX0wyQ1RYX0hPU1RfQkRJRFgsIGJwLT5yeF9wcm9kKTsKKworCVJFR19XUihicCwgTUJfUlhfQ0lEX0FERFIgKyBCTlgyX0wyQ1RYX0hPU1RfQlNFUSwgYnAtPnJ4X3Byb2RfYnNlcSk7Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfcmVzZXRfbmljKHN0cnVjdCBibngyICpicCwgdTMyIHJlc2V0X2NvZGUpCit7CisJaW50IHJjOworCisJcmMgPSBibngyX3Jlc2V0X2NoaXAoYnAsIHJlc2V0X2NvZGUpOworCWlmIChyYykgeworCQlyZXR1cm4gcmM7CisJfQorCisJYm54Ml9pbml0X2NoaXAoYnApOworCWJueDJfaW5pdF90eF9yaW5nKGJwKTsKKwlibngyX2luaXRfcnhfcmluZyhicCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfaW5pdF9uaWMoc3RydWN0IGJueDIgKmJwKQoreworCWludCByYzsKKworCWlmICgocmMgPSBibngyX3Jlc2V0X25pYyhicCwgQk5YMl9EUlZfTVNHX0NPREVfUkVTRVQpKSAhPSAwKQorCQlyZXR1cm4gcmM7CisKKwlibngyX2luaXRfcGh5KGJwKTsKKwlibngyX3NldF9saW5rKGJwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm54Ml9pbml0X2JvYXJkKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgbG9uZyBibngycmVnX2Jhc2UsIGJueDJyZWdfbGVuOworCXN0cnVjdCBibngyICpicCA9ICZibngyOworCWludCByYzsKKwl1MzIgcmVnOworCisJYnAtPmZsYWdzID0gMDsKKwlicC0+cGh5X2ZsYWdzID0gMDsKKworCS8qIGVuYWJsZSBkZXZpY2UgKGluY2wuIFBDSSBQTSB3YWtldXApLCBhbmQgYnVzLW1hc3RlcmluZyAqLworCWFkanVzdF9wY2lfZGV2aWNlKHBkZXYpOworCisJbmljLT5pb2FkZHIgPSBwZGV2LT5pb2FkZHIgJiB+MzsKKwluaWMtPmlycW5vID0gMDsKKworCXJjID0gMDsKKwlicC0+cG1fY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKKwlpZiAoYnAtPnBtX2NhcCA9PSAwKSB7CisJCXByaW50ZigiQ2Fubm90IGZpbmQgcG93ZXIgbWFuYWdlbWVudCBjYXBhYmlsaXR5LCBhYm9ydGluZy5cbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKworCWJwLT5wY2l4X2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QQ0lYKTsKKwlpZiAoYnAtPnBjaXhfY2FwID09IDApIHsKKwkJcHJpbnRmKCJDYW5ub3QgZmluZCBQQ0lYIGNhcGFiaWxpdHksIGFib3J0aW5nLlxuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJYnAtPnBkZXYgPSBwZGV2OworCWJwLT5uaWMgPSBuaWM7CisKKwlibngycmVnX2Jhc2UgPSBwY2lfYmFyX3N0YXJ0KHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCk7CisJYm54MnJlZ19sZW4gPSBNQl9HRVRfQ0lEX0FERFIoMTcpOworCisJYnAtPnJlZ3ZpZXcgPSBpb3JlbWFwKGJueDJyZWdfYmFzZSwgYm54MnJlZ19sZW4pOworCisJaWYgKCFicC0+cmVndmlldykgeworCQlwcmludGYoIkNhbm5vdCBtYXAgcmVnaXN0ZXIgc3BhY2UsIGFib3J0aW5nLlxuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJLyogQ29uZmlndXJlIGJ5dGUgc3dhcCBhbmQgZW5hYmxlIHdyaXRlIHRvIHRoZSByZWdfd2luZG93IHJlZ2lzdGVycy4KKwkgKiBSZWx5IG9uIENQVSB0byBkbyB0YXJnZXQgYnl0ZSBzd2FwcGluZyBvbiBiaWcgZW5kaWFuIHN5c3RlbXMKKwkgKiBUaGUgY2hpcCdzIHRhcmdldCBhY2Nlc3Mgc3dhcHBpbmcgd2lsbCBub3Qgc3dhcCBhbGwgYWNjZXNzZXMKKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBCTlgyX1BDSUNGR19NSVNDX0NPTkZJRywKKwkJCSAgICAgICBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19SRUdfV0lORE9XX0VOQSB8CisJCQkgICAgICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfVEFSR0VUX01CX1dPUkRfU1dBUCk7CisKKwlibngyX3NldF9wb3dlcl9zdGF0ZV8wKGJwKTsKKworCWJwLT5jaGlwX2lkID0gUkVHX1JEKGJwLCBCTlgyX01JU0NfSUQpOworCisJLyogR2V0IGJ1cyBpbmZvcm1hdGlvbi4gKi8KKwlyZWcgPSBSRUdfUkQoYnAsIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTKTsKKwlpZiAocmVnICYgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVNfUENJWF9ERVQpIHsKKwkJdTMyIGNsa3JlZzsKKworCQlicC0+ZmxhZ3MgfD0gUENJWF9GTEFHOworCisJCWNsa3JlZyA9IFJFR19SRChicCwgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUUyk7CisJCQorCQljbGtyZWcgJj0gQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVQ7CisJCXN3aXRjaCAoY2xrcmVnKSB7CisJCWNhc2UgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVRfMTMzTUhaOgorCQkJYnAtPmJ1c19zcGVlZF9taHogPSAxMzM7CisJCQlicmVhazsKKworCQljYXNlIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUENJX0NMS19TUERfREVUXzk1TUhaOgorCQkJYnAtPmJ1c19zcGVlZF9taHogPSAxMDA7CisJCQlicmVhazsKKworCQljYXNlIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUENJX0NMS19TUERfREVUXzY2TUhaOgorCQljYXNlIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUENJX0NMS19TUERfREVUXzgwTUhaOgorCQkJYnAtPmJ1c19zcGVlZF9taHogPSA2NjsKKwkJCWJyZWFrOworCisJCWNhc2UgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVRfNDhNSFo6CisJCWNhc2UgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVRfNTVNSFo6CisJCQlicC0+YnVzX3NwZWVkX21oeiA9IDUwOworCQkJYnJlYWs7CisKKwkJY2FzZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF9MT1c6CisJCWNhc2UgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVRfMzJNSFo6CisJCWNhc2UgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVRfMzhNSFo6CisJCQlicC0+YnVzX3NwZWVkX21oeiA9IDMzOworCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSB7CisJCWlmIChyZWcgJiBCTlgyX1BDSUNGR19NSVNDX1NUQVRVU19NNjZFTikKKwkJCWJwLT5idXNfc3BlZWRfbWh6ID0gNjY7CisJCWVsc2UKKwkJCWJwLT5idXNfc3BlZWRfbWh6ID0gMzM7CisJfQorCisJaWYgKHJlZyAmIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTXzMyQklUX0RFVCkKKwkJYnAtPmZsYWdzIHw9IFBDSV8zMkJJVF9GTEFHOworCisJLyogNTcwNkEwIG1heSBmYWxzZWx5IGRldGVjdCBTRVJSIGFuZCBQRVJSLiAqLworCWlmIChDSElQX0lEKGJwKSA9PSBDSElQX0lEXzU3MDZfQTApIHsKKwkJcmVnID0gUkVHX1JEKGJwLCBQQ0lfQ09NTUFORCk7CisJCXJlZyAmPSB+KFBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9QQVJJVFkpOworCQlSRUdfV1IoYnAsIFBDSV9DT01NQU5ELCByZWcpOworCX0KKwllbHNlIGlmICgoQ0hJUF9JRChicCkgPT0gQ0hJUF9JRF81NzA2X0ExKSAmJgorCQkhKGJwLT5mbGFncyAmIFBDSVhfRkxBRykpIHsKKworCQlwcmludGYoIjU3MDYgQTEgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIFBDSVggYnVzLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwlibngyX2luaXRfbnZyYW0oYnApOworCisJcmVnID0gUkVHX1JEX0lORChicCwgQk5YMl9TSE1fSERSX1NJR05BVFVSRSk7CisKKwlpZiAoKHJlZyAmIEJOWDJfU0hNX0hEUl9TSUdOQVRVUkVfU0lHX01BU0spID09CisJICAgIEJOWDJfU0hNX0hEUl9TSUdOQVRVUkVfU0lHKQorCQlicC0+c2htZW1fYmFzZSA9IFJFR19SRF9JTkQoYnAsIEJOWDJfU0hNX0hEUl9BRERSXzApOworCWVsc2UKKwkJYnAtPnNobWVtX2Jhc2UgPSBIT1NUX1ZJRVdfU0hNRU1fQkFTRTsKKworCS8qIEdldCB0aGUgcGVybWFuZW50IE1BQyBhZGRyZXNzLiAgRmlyc3Qgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlCisJICogZmlybXdhcmUgaXMgYWN0dWFsbHkgcnVubmluZy4KKwkgKi8KKwlyZWcgPSBSRUdfUkRfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArIEJOWDJfREVWX0lORk9fU0lHTkFUVVJFKTsKKworCWlmICgocmVnICYgQk5YMl9ERVZfSU5GT19TSUdOQVRVUkVfTUFHSUNfTUFTSykgIT0KKwkgICAgQk5YMl9ERVZfSU5GT19TSUdOQVRVUkVfTUFHSUMpIHsKKwkJcHJpbnRmKCJGaXJtd2FyZSBub3QgcnVubmluZywgYWJvcnRpbmcuXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwlicC0+ZndfdmVyID0gUkVHX1JEX0lORChicCwgYnAtPnNobWVtX2Jhc2UgKyBCTlgyX0RFVl9JTkZPX0JDX1JFVik7CisKKwlyZWcgPSBSRUdfUkRfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArIEJOWDJfUE9SVF9IV19DRkdfTUFDX1VQUEVSKTsKKwlicC0+bWFjX2FkZHJbMF0gPSAodTgpIChyZWcgPj4gOCk7CisJYnAtPm1hY19hZGRyWzFdID0gKHU4KSByZWc7CisKKwlyZWcgPSBSRUdfUkRfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArIEJOWDJfUE9SVF9IV19DRkdfTUFDX0xPV0VSKTsKKwlicC0+bWFjX2FkZHJbMl0gPSAodTgpIChyZWcgPj4gMjQpOworCWJwLT5tYWNfYWRkclszXSA9ICh1OCkgKHJlZyA+PiAxNik7CisJYnAtPm1hY19hZGRyWzRdID0gKHU4KSAocmVnID4+IDgpOworCWJwLT5tYWNfYWRkcls1XSA9ICh1OCkgcmVnOworCisJYnAtPnR4X3Jpbmdfc2l6ZSA9IE1BWF9UWF9ERVNDX0NOVDsKKwlicC0+cnhfcmluZ19zaXplID0gUlhfQlVGX0NOVDsKKwlicC0+cnhfbWF4X3JpbmdfaWR4ID0gTUFYX1JYX0RFU0NfQ05UOworCisJYnAtPnJ4X29mZnNldCA9IFJYX09GRlNFVDsKKworCWJwLT50eF9xdWlja19jb25zX3RyaXBfaW50ID0gMjA7CisJYnAtPnR4X3F1aWNrX2NvbnNfdHJpcCA9IDIwOworCWJwLT50eF90aWNrc19pbnQgPSA4MDsKKwlicC0+dHhfdGlja3MgPSA4MDsKKwkJCisJYnAtPnJ4X3F1aWNrX2NvbnNfdHJpcF9pbnQgPSA2OworCWJwLT5yeF9xdWlja19jb25zX3RyaXAgPSA2OworCWJwLT5yeF90aWNrc19pbnQgPSAxODsKKwlicC0+cnhfdGlja3MgPSAxODsKKworCWJwLT5zdGF0c190aWNrcyA9IDEwMDAwMDAgJiAweGZmZmYwMDsKKworCWJwLT5waHlfYWRkciA9IDE7CisKKwkvKiBObyBuZWVkIGZvciBXT0wgc3VwcG9ydCBpbiBFdGhlcmJvb3QgKi8KKwlicC0+ZmxhZ3MgfD0gTk9fV09MX0ZMQUc7CisKKwkvKiBEaXNhYmxlIFdPTCBzdXBwb3J0IGlmIHdlIGFyZSBydW5uaW5nIG9uIGEgU0VSREVTIGNoaXAuICovCisJaWYgKENISVBfQk9ORF9JRChicCkgJiBDSElQX0JPTkRfSURfU0VSREVTX0JJVCkgeworCQlicC0+cGh5X2ZsYWdzIHw9IFBIWV9TRVJERVNfRkxBRzsKKwkJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA4KSB7CisJCQlicC0+cGh5X2FkZHIgPSAyOworCQkJcmVnID0gUkVHX1JEX0lORChicCwgYnAtPnNobWVtX2Jhc2UgKworCQkJCQkgQk5YMl9TSEFSRURfSFdfQ0ZHX0NPTkZJRyk7CisJCQlpZiAocmVnICYgQk5YMl9TSEFSRURfSFdfQ0ZHX1BIWV8yXzVHKQorCQkJCWJwLT5waHlfZmxhZ3MgfD0gUEhZXzJfNUdfQ0FQQUJMRV9GTEFHOworCQl9CisJfQorCisJaWYgKENISVBfSUQoYnApID09IENISVBfSURfNTcwNl9BMCkgeworCQlicC0+dHhfcXVpY2tfY29uc190cmlwX2ludCA9CisJCQlicC0+dHhfcXVpY2tfY29uc190cmlwOworCQlicC0+dHhfdGlja3NfaW50ID0gYnAtPnR4X3RpY2tzOworCQlicC0+cnhfcXVpY2tfY29uc190cmlwX2ludCA9CisJCQlicC0+cnhfcXVpY2tfY29uc190cmlwOworCQlicC0+cnhfdGlja3NfaW50ID0gYnAtPnJ4X3RpY2tzOworCQlicC0+Y29tcF9wcm9kX3RyaXBfaW50ID0gYnAtPmNvbXBfcHJvZF90cmlwOworCQlicC0+Y29tX3RpY2tzX2ludCA9IGJwLT5jb21fdGlja3M7CisJCWJwLT5jbWRfdGlja3NfaW50ID0gYnAtPmNtZF90aWNrczsKKwl9CisKKwlicC0+YXV0b25lZyA9IEFVVE9ORUdfU1BFRUQgfCBBVVRPTkVHX0ZMT1dfQ1RSTDsKKwlicC0+cmVxX2xpbmVfc3BlZWQgPSAwOworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX1NFUkRFU19GTEFHKSB7CisJCWJwLT5hZHZlcnRpc2luZyA9IEVUSFRPT0xfQUxMX0ZJQlJFX1NQRUVEIHwgQURWRVJUSVNFRF9BdXRvbmVnOworCisJCXJlZyA9IFJFR19SRF9JTkQoYnAsIGJwLT5zaG1lbV9iYXNlICsgQk5YMl9QT1JUX0hXX0NGR19DT05GSUcpOworCQlyZWcgJj0gQk5YMl9QT1JUX0hXX0NGR19DRkdfREZMVF9MSU5LX01BU0s7CisJCWlmIChyZWcgPT0gQk5YMl9QT1JUX0hXX0NGR19DRkdfREZMVF9MSU5LXzFHKSB7CisJCQlicC0+YXV0b25lZyA9IDA7CisJCQlicC0+cmVxX2xpbmVfc3BlZWQgPSBicC0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQlicC0+cmVxX2R1cGxleCA9IERVUExFWF9GVUxMOworCQl9CisJfQorCWVsc2UgeworCQlicC0+YWR2ZXJ0aXNpbmcgPSBFVEhUT09MX0FMTF9DT1BQRVJfU1BFRUQgfCBBRFZFUlRJU0VEX0F1dG9uZWc7CisJfQorCisJYnAtPnJlcV9mbG93X2N0cmwgPSBGTE9XX0NUUkxfUlggfCBGTE9XX0NUUkxfVFg7CisKKwkvKiBEaXNhYmxlIGRyaXZlciBoZWFydGJlYXQgY2hlY2tpbmcgKi8KKwlSRUdfV1JfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArIEJOWDJfRFJWX1BVTFNFX01CLAorCQkJQk5YMl9EUlZfTVNHX0RBVEFfUFVMU0VfQ09ERV9BTFdBWVNfQUxJVkUpOworCVJFR19SRF9JTkQoYnAsIGJwLT5zaG1lbV9iYXNlICsgQk5YMl9EUlZfUFVMU0VfTUIpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZGlzYWJsZToKKwlibngyX2Rpc2FibGUobmljKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2JueDJfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkc3RfYWRkciwKKwkJdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBzaXplLCBjb25zdCBjaGFyICpwYWNrZXQpCit7CisJLyogU29tZXRpbWVzIHRoZSBuaWMgd2lsbCBiZSBiZWhpbmQgYnkgYSBmcmFtZS4gIFVzaW5nIHR3byB0cmFuc21pdAorCSAqIGJ1ZmZlcnMgcHJldmVudHMgdXMgZnJvbSB0aW1pbmcgb3V0IGluIHRoYXQgY2FzZS4KKwkgKi8KKwlzdGF0aWMgc3RydWN0IGV0aF9mcmFtZSB7CisJCXVpbnQ4X3QgIGRzdF9hZGRyW0VUSF9BTEVOXTsKKwkJdWludDhfdCAgc3JjX2FkZHJbRVRIX0FMRU5dOworCQl1aW50MTZfdCB0eXBlOworCQl1aW50OF90ICBkYXRhIFtFVEhfRlJBTUVfTEVOIC0gRVRIX0hMRU5dOworCX0gZnJhbWVbMl07CisJc3RhdGljIGludCBmcmFtZV9pZHggPSAwOworCQorCS8qIHNlbmQgdGhlIHBhY2tldCB0byBkZXN0aW5hdGlvbiAqLworCXN0cnVjdCB0eF9iZCAqdHhiZDsKKwlzdHJ1Y3QgYm54MiAqYnAgPSAmYm54MjsKKwl1MTYgcHJvZCwgcmluZ19wcm9kOworCXUxNiBod19jb25zOworCWludCBpID0gMDsKKworCXByb2QgPSBicC0+dHhfcHJvZDsKKwlyaW5nX3Byb2QgPSBUWF9SSU5HX0lEWChwcm9kKTsKKwlod19jb25zID0gYnAtPnN0YXR1c19ibGstPnN0YXR1c190eF9xdWlja19jb25zdW1lcl9pbmRleDA7CisJaWYgKChod19jb25zICYgTUFYX1RYX0RFU0NfQ05UKSA9PSBNQVhfVFhfREVTQ19DTlQpIHsKKwkJaHdfY29ucysrOworCX0KKworCXdoaWxlKChod19jb25zICE9IHByb2QpICYmIChod19jb25zICE9IChQUkVWX1RYX0JEKHByb2QpKSkpIHsKKwkJbWRlbGF5KDEwKTsJLyogZ2l2ZSB0aGUgbmljIGEgY2hhbmNlICovCisJCS8vcG9sbF9pbnRlcnJ1cHRpb25zKCk7CisJCWlmICgrK2kgPiA1MDApIHsgLyogdGltZW91dCA1cyBmb3IgdHJhbnNtaXQgKi8KKwkJCXByaW50ZigidHJhbnNtaXQgdGltZWQgb3V0XG4iKTsKKwkJCWJueDJfZGlzYWJsZShicC0+bmljKTsKKwkJCWJueDJfaW5pdF9ib2FyZChicC0+cGRldiwgYnAtPm5pYyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKGkgIT0gMCkgeworCQlwcmludGYoIiMiKTsKKwl9CisKKwkvKiBDb3B5IHRoZSBwYWNrZXQgdG8gdGhlIG91ciBsb2NhbCBidWZmZXIgKi8KKwltZW1jcHkoJmZyYW1lW2ZyYW1lX2lkeF0uZHN0X2FkZHIsIGRzdF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KCZmcmFtZVtmcmFtZV9pZHhdLnNyY19hZGRyLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCWZyYW1lW2ZyYW1lX2lkeF0udHlwZSA9IGh0b25zKHR5cGUpOworCW1lbXNldCgmZnJhbWVbZnJhbWVfaWR4XS5kYXRhLCAwLCBzaXplb2YoZnJhbWVbZnJhbWVfaWR4XS5kYXRhKSk7CisJbWVtY3B5KCZmcmFtZVtmcmFtZV9pZHhdLmRhdGEsIHBhY2tldCwgc2l6ZSk7CisKKwkvKiBTZXR1cCB0aGUgcmluZyBidWZmZXIgZW50cnkgdG8gdHJhbnNtaXQgKi8KKwl0eGJkID0gJmJwLT50eF9kZXNjX3JpbmdbcmluZ19wcm9kXTsKKwl0eGJkLT50eF9iZF9oYWRkcl9oaSA9IDA7IC8qIEV0aGVyYm9vdCBydW5zIHVuZGVyIDRHQiAqLworCXR4YmQtPnR4X2JkX2hhZGRyX2xvID0gdmlydF90b19idXMoJmZyYW1lW2ZyYW1lX2lkeF0pOworCXR4YmQtPnR4X2JkX21zc19uYnl0ZXMgPSAoc2l6ZSArIEVUSF9ITEVOKTsKKwl0eGJkLT50eF9iZF92bGFuX3RhZ19mbGFncyA9IFRYX0JEX0ZMQUdTX1NUQVJUIHwgVFhfQkRfRkxBR1NfRU5EOworCisJLyogQWR2YW5jZSB0byB0aGUgbmV4dCBlbnRyeSAqLworCXByb2QgPSBORVhUX1RYX0JEKHByb2QpOworCWZyYW1lX2lkeCBePSAxOworCisJYnAtPnR4X3Byb2RfYnNlcSArPSAoc2l6ZSArIEVUSF9ITEVOKTsKKworCVJFR19XUjE2KGJwLCBNQl9UWF9DSURfQUREUiArIEJOWDJfTDJDVFhfVFhfSE9TVF9CSURYLCBwcm9kKTsKKwlSRUdfV1IoYnAsIE1CX1RYX0NJRF9BRERSICsgQk5YMl9MMkNUWF9UWF9IT1NUX0JTRVEsIGJwLT50eF9wcm9kX2JzZXEpOworCisJd21iKCk7CisKKwlicC0+dHhfcHJvZCA9IHByb2Q7Cit9CisKK3N0YXRpYyBpbnQKK2JueDJfcG9sbF9saW5rKHN0cnVjdCBibngyICpicCkKK3sKKwl1MzIgbmV3X2xpbmtfc3RhdGUsIG9sZF9saW5rX3N0YXRlLCBlbWFjX3N0YXR1czsKKworCW5ld19saW5rX3N0YXRlID0gYnAtPnN0YXR1c19ibGstPnN0YXR1c19hdHRuX2JpdHMgJgorCQlTVEFUVVNfQVRUTl9CSVRTX0xJTktfU1RBVEU7CisKKwlvbGRfbGlua19zdGF0ZSA9IGJwLT5zdGF0dXNfYmxrLT5zdGF0dXNfYXR0bl9iaXRzX2FjayAmCisJCVNUQVRVU19BVFROX0JJVFNfTElOS19TVEFURTsKKworCWlmICghbmV3X2xpbmtfc3RhdGUgJiYgIW9sZF9saW5rX3N0YXRlKSB7CisJCS8qIEZvciBzb21lIHJlYXNvbiB0aGUgY2FyZCBkb2Vzbid0IGFsd2F5cyB1cGRhdGUgdGhlIGxpbmsKKwkJICogc3RhdHVzIGJpdHMgcHJvcGVybHkuICBLaWNrIHRoZSBzdHVwaWQgdGhpbmcgYW5kIHRyeSBhZ2Fpbi4KKwkJICovCisJCXUzMiBibXNyOworCisJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTVNSLCAmYm1zcik7CisJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTVNSLCAmYm1zcik7CisKKwkJaWYgKChicC0+cGh5X2ZsYWdzICYgUEhZX1NFUkRFU19GTEFHKSAmJgorCQkgICAgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA2KSkgeworCQkJUkVHX1JEKGJwLCBCTlgyX0VNQUNfU1RBVFVTKTsKKwkJfQorCisJCW5ld19saW5rX3N0YXRlID0gYnAtPnN0YXR1c19ibGstPnN0YXR1c19hdHRuX2JpdHMgJgorCQkJU1RBVFVTX0FUVE5fQklUU19MSU5LX1NUQVRFOworCisJCW9sZF9saW5rX3N0YXRlID0gYnAtPnN0YXR1c19ibGstPnN0YXR1c19hdHRuX2JpdHNfYWNrICYKKwkJCVNUQVRVU19BVFROX0JJVFNfTElOS19TVEFURTsKKworCQkvKiBPa2F5LCBmb3Igc29tZSByZWFzb24gdGhlIGFib3ZlIGRvZXNuJ3Qgd29yayB3aXRoIHNvbWUKKwkJICogc3dpdGNoZXMgKGxpa2UgSFAgUHJvQ3VydmUpLiBJZiB0aGUgYWJvdmUgZG9lc24ndCB3b3JrLAorCQkgKiBjaGVjayB0aGUgTUFDIGRpcmVjdGx5IHRvIHNlZSBpZiB3ZSBoYXZlIGEgbGluay4gIFBlcmhhcHMgd2UKKwkJICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGUgTUFDIGluc3RlYWQgcHJvYmluZyB0aGUgTUlJLgorCQkgKi8KKwkJaWYgKCFuZXdfbGlua19zdGF0ZSAmJiAhb2xkX2xpbmtfc3RhdGUpIHsKKwkJCWVtYWNfc3RhdHVzID0gUkVHX1JEKGJwLCBCTlgyX0VNQUNfU1RBVFVTKTsKKwkJCWlmIChlbWFjX3N0YXR1cyAmIEJOWDJfRU1BQ19TVEFUVVNfTElOS19DSEFOR0UpIHsKKwkJCQkvKiBBY2tub3dsZWRnZSB0aGUgbGluayBjaGFuZ2UgKi8KKwkJCQlSRUdfV1IoYnAsIEJOWDJfRU1BQ19TVEFUVVMsIEJOWDJfRU1BQ19TVEFUVVNfTElOS19DSEFOR0UpOworCQkJfSBlbHNlIGlmIChlbWFjX3N0YXR1cyAmIEJOWDJfRU1BQ19TVEFUVVNfTElOSykgeworCQkJCW5ld19saW5rX3N0YXRlID0gIW9sZF9saW5rX3N0YXRlOworCQkJfQorCQl9CisKKwl9CisKKwlpZiAobmV3X2xpbmtfc3RhdGUgIT0gb2xkX2xpbmtfc3RhdGUpIHsKKwkJaWYgKG5ld19saW5rX3N0YXRlKSB7CisJCQlSRUdfV1IoYnAsIEJOWDJfUENJQ0ZHX1NUQVRVU19CSVRfU0VUX0NNRCwKKwkJCQlTVEFUVVNfQVRUTl9CSVRTX0xJTktfU1RBVEUpOworCQl9CisJCWVsc2UgeworCQkJUkVHX1dSKGJwLCBCTlgyX1BDSUNGR19TVEFUVVNfQklUX0NMRUFSX0NNRCwKKwkJCQlTVEFUVVNfQVRUTl9CSVRTX0xJTktfU1RBVEUpOworCQl9CisKKwkJYm54Ml9zZXRfbGluayhicCk7CisKKwkJLyogVGhpcyBpcyBuZWVkZWQgdG8gdGFrZSBjYXJlIG9mIHRyYW5zaWVudCBzdGF0dXMKKwkJICogZHVyaW5nIGxpbmsgY2hhbmdlcy4KKwkJICovCisKKwkJUkVHX1dSKGJwLCBCTlgyX0hDX0NPTU1BTkQsCisJCSAgICAgICBicC0+aGNfY21kIHwgQk5YMl9IQ19DT01NQU5EX0NPQUxfTk9XX1dPX0lOVCk7CisJCVJFR19SRChicCwgQk5YMl9IQ19DT01NQU5EKTsKKworCX0KKworCXJldHVybiBicC0+bGlua191cDsKK30KKworc3RhdGljIGludAorYm54Ml9wb2xsKHN0cnVjdCBuaWMqIG5pYywgaW50IHJldHJpZXZlKQoreworCXN0cnVjdCBibngyICpicCA9ICZibngyOworCXN0cnVjdCByeF9iZCAqY29uc19iZCwgKnByb2RfYmQ7CisJdTE2IGh3X2NvbnMsIHN3X2NvbnMsIHN3X3JpbmdfY29ucywgc3dfcHJvZCwgc3dfcmluZ19wcm9kOworCXN0cnVjdCBsMl9maGRyICpyeF9oZHI7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXUzMiBzdGF0dXM7CisJCisjaWYgMAorCWlmICgoYnAtPnN0YXR1c19ibGstPnN0YXR1c19pZHggPT0gYnAtPmxhc3Rfc3RhdHVzX2lkeCkgJiYKKwkgICAgKFJFR19SRChicCwgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVMpICYKKwkgICAgIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTX0lOVEFfVkFMVUUpKSB7CisKKwkJYnAtPmxhc3Rfc3RhdHVzX2lkeCA9IGJwLT5zdGF0dXNfYmxrLT5zdGF0dXNfaWR4OworCQlSRUdfV1IoYnAsIEJOWDJfUENJQ0ZHX0lOVF9BQ0tfQ01ELAorCSAgICAgICBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9JTkRFWF9WQUxJRCB8CisJICAgICAgIEJOWDJfUENJQ0ZHX0lOVF9BQ0tfQ01EX01BU0tfSU5UIHwKKwkgICAgICAgYnAtPmxhc3Rfc3RhdHVzX2lkeCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJaWYgKChicC0+c3RhdHVzX2Jsay0+c3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MCAhPSBicC0+cnhfY29ucykgJiYgIXJldHJpZXZlKQorCQlyZXR1cm4gMTsKKworCWlmIChicC0+c3RhdHVzX2Jsay0+c3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MCAhPSBicC0+cnhfY29ucykgeworCisJCWh3X2NvbnMgPSBicC0+aHdfcnhfY29ucyA9IGJwLT5zdGF0dXNfYmxrLT5zdGF0dXNfcnhfcXVpY2tfY29uc3VtZXJfaW5kZXgwOworCQlpZiAoKGh3X2NvbnMgJiBNQVhfUlhfREVTQ19DTlQpID09IE1BWF9SWF9ERVNDX0NOVCkgeworCQkJaHdfY29ucysrOworCQl9CisJCXN3X2NvbnMgPSBicC0+cnhfY29uczsKKwkJc3dfcHJvZCA9IGJwLT5yeF9wcm9kOworCisJCXJtYigpOworCQlpZiAoc3dfY29ucyAhPSBod19jb25zKSB7CisKKwkJCXN3X3JpbmdfY29ucyA9IFJYX1JJTkdfSURYKHN3X2NvbnMpOworCQkJc3dfcmluZ19wcm9kID0gUlhfUklOR19JRFgoc3dfcHJvZCk7CisKKwkJCWRhdGEgPSBidXNfdG9fdmlydChicC0+cnhfZGVzY19yaW5nW3N3X3JpbmdfY29uc10ucnhfYmRfaGFkZHJfbG8pOworCisJCQlyeF9oZHIgPSAoc3RydWN0IGwyX2ZoZHIgKilkYXRhOworCQkJbGVuID0gcnhfaGRyLT5sMl9maGRyX3BrdF9sZW4gLSA0OworCQkJaWYgKChsZW4gPiAoRVRIX01BWF9NVFUgKyBFVEhfSExFTikpIHx8CisJCQkJKChzdGF0dXMgPSByeF9oZHItPmwyX2ZoZHJfc3RhdHVzKSAmCisJCQkJKEwyX0ZIRFJfRVJST1JTX0JBRF9DUkMgfAorCQkJCUwyX0ZIRFJfRVJST1JTX1BIWV9ERUNPREUgfAorCQkJCUwyX0ZIRFJfRVJST1JTX0FMSUdOTUVOVCB8CisJCQkJTDJfRkhEUl9FUlJPUlNfVE9PX1NIT1JUIHwKKwkJCQlMMl9GSERSX0VSUk9SU19HSUFOVF9GUkFNRSkpKSB7CisJCQkJcmVzdWx0ID0gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluaWMtPnBhY2tldGxlbiA9IGxlbjsKKwkJCQltZW1jcHkobmljLT5wYWNrZXQsIGRhdGEgKyBicC0+cnhfb2Zmc2V0LCBsZW4pOworCQkJCXJlc3VsdCA9IDE7CisJCQl9CisKKwkJCS8qIFJldXNlIHRoZSBidWZmZXIgKi8KKwkJCWJwLT5yeF9wcm9kX2JzZXEgKz0gYnAtPnJ4X2J1Zl91c2Vfc2l6ZTsKKwkJCWlmIChzd19jb25zICE9IHN3X3Byb2QpIHsKKwkJCQljb25zX2JkID0gJmJwLT5yeF9kZXNjX3Jpbmdbc3dfcmluZ19jb25zXTsKKwkJCQlwcm9kX2JkID0gJmJwLT5yeF9kZXNjX3Jpbmdbc3dfcmluZ19wcm9kXTsKKwkJCQlwcm9kX2JkLT5yeF9iZF9oYWRkcl9oaSA9IDA7IC8qIEV0aGVyYm9vdCBydW5zIHVuZGVyIDRHQiAqLworCQkJCXByb2RfYmQtPnJ4X2JkX2hhZGRyX2xvID0gY29uc19iZC0+cnhfYmRfaGFkZHJfbG87CisJCQl9CisKKwkJCXN3X2NvbnMgPSBORVhUX1JYX0JEKHN3X2NvbnMpOworCQkJc3dfcHJvZCA9IE5FWFRfUlhfQkQoc3dfcHJvZCk7CisKKwkJfQorCisJCWJwLT5yeF9jb25zID0gc3dfY29uczsKKwkJYnAtPnJ4X3Byb2QgPSBzd19wcm9kOworCisJCVJFR19XUjE2KGJwLCBNQl9SWF9DSURfQUREUiArIEJOWDJfTDJDVFhfSE9TVF9CRElEWCwgYnAtPnJ4X3Byb2QpOworCisJCVJFR19XUihicCwgTUJfUlhfQ0lEX0FERFIgKyBCTlgyX0wyQ1RYX0hPU1RfQlNFUSwgYnAtPnJ4X3Byb2RfYnNlcSk7CisKKwkJd21iKCk7CisKKwl9CisKKwlibngyX3BvbGxfbGluayhicCk7CisKKyNpZiAwCisJYnAtPmxhc3Rfc3RhdHVzX2lkeCA9IGJwLT5zdGF0dXNfYmxrLT5zdGF0dXNfaWR4OworCXJtYigpOworCisJUkVHX1dSKGJwLCBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRCwKKwkgICAgICAgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTURfSU5ERVhfVkFMSUQgfAorCSAgICAgICBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9NQVNLX0lOVCB8CisJICAgICAgIGJwLT5sYXN0X3N0YXR1c19pZHgpOworCisJUkVHX1dSKGJwLCBCTlgyX0hDX0NPTU1BTkQsIGJwLT5oY19jbWQgfCBCTlgyX0hDX0NPTU1BTkRfQ09BTF9OT1dfV09fSU5UKTsKKyNlbmRpZgorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2JueDJfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKwlzd2l0Y2ggKCBhY3Rpb24gKSB7CisJCWNhc2UgRElTQUJMRTogYnJlYWs7CisJCWNhc2UgRU5BQkxFOiBicmVhazsKKwkJY2FzZSBGT1JDRTogYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIGJueDJfb3BlcmF0aW9ucyA9IHsKKwkuY29ubmVjdAk9IGR1bW15X2Nvbm5lY3QsCisJLnBvbGwJCT0gYm54Ml9wb2xsLAorCS50cmFuc21pdAk9IGJueDJfdHJhbnNtaXQsCisJLmlycQkJPSBibngyX2lycSwKK307CisKK3N0YXRpYyBpbnQKK2JueDJfcHJvYmUoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYm54MiAqYnAgPSAmYm54MjsKKwlpbnQgaSwgcmM7CisKKwlpZiAocGRldiA9PSAwKQorCQlyZXR1cm4gMDsKKworCW1lbXNldChicCwgMCwgc2l6ZW9mKCpicCkpOworCisJcmMgPSBibngyX2luaXRfYm9hcmQocGRldiwgbmljKTsKKwlpZiAocmMgPCAwKSB7CisJCXJldHVybiAwOworCX0KKworCS8qCisJbmljLT5kaXNhYmxlID0gYm54Ml9kaXNhYmxlOworCW5pYy0+dHJhbnNtaXQgPSBibngyX3RyYW5zbWl0OworCW5pYy0+cG9sbCA9IGJueDJfcG9sbDsKKwluaWMtPmlycSA9IGJueDJfaXJxOworCSovCisJCisJbmljLT5uaWNfb3AJPSAmYm54Ml9vcGVyYXRpb25zOworCisJbWVtY3B5KG5pYy0+bm9kZV9hZGRyLCBicC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKKwlwcmludGYoIkV0aGVybmV0IGFkZHI6ICVzXG4iLCBldGhfbnRvYSggbmljLT5ub2RlX2FkZHIgKSApOworCXByaW50ZigiQnJvYWRjb20gTmV0WHRyZW1lIElJICglYyVkKSBQQ0klcyAlcyAlZE1IelxuIiwKKwkgICAgICAgIChpbnQpICgoQ0hJUF9JRChicCkgJiAweGYwMDApID4+IDEyKSArICdBJywKKwkgICAgICAgIChpbnQpICgoQ0hJUF9JRChicCkgJiAweDBmZjApID4+IDQpLAorCQkoKGJwLT5mbGFncyAmIFBDSVhfRkxBRykgPyAiLVgiIDogIiIpLAorCQkoKGJwLT5mbGFncyAmIFBDSV8zMkJJVF9GTEFHKSA/ICIzMi1iaXQiIDogIjY0LWJpdCIpLAorCQlicC0+YnVzX3NwZWVkX21oeik7CisKKwlibngyX3NldF9wb3dlcl9zdGF0ZV8wKGJwKTsKKwlibngyX2Rpc2FibGVfaW50KGJwKTsKKworCWJueDJfYWxsb2NfbWVtKGJwKTsKKworCXJjID0gYm54Ml9pbml0X25pYyhicCk7CisJaWYgKHJjKSB7CisJCXJldHVybiAwOworCX0KKworCWJueDJfcG9sbF9saW5rKGJwKTsKKwlmb3IoaSA9IDA7ICFicC0+bGlua191cCAmJiAoaSA8IFZBTElEX0xJTktfVElNRU9VVCoxMDApOyBpKyspIHsKKwkJbWRlbGF5KDEpOworCQlibngyX3BvbGxfbGluayhicCk7CisJfQorI2lmIDEKKwlpZiAoIWJwLT5saW5rX3VwKXsKKwkJcHJpbnRmKCJWYWxpZCBsaW5rIG5vdCBlc3RhYmxpc2hlZFxuIik7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKyNlbmRpZgorCQorCXJldHVybiAxOworCitlcnJfb3V0X2Rpc2FibGU6CisJYm54Ml9kaXNhYmxlKG5pYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBibngyX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTRlNCwgMHgxNjRhLCAiYm54Mi01NzA2IiwgICAgICAgICJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgQkNNNTcwNiIsIDApLAorCVBDSV9ST00oMHgxNGU0LCAweDE2NGMsICJibngyLTU3MDgiLCAgICAgICAgIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBCQ001NzA4IiwgMCksCisJUENJX1JPTSgweDE0ZTQsIDB4MTZhYSwgImJueDItNTcwNlMiLCAgICAgICAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3MDZTIiwgMCksCisJUENJX1JPTSgweDE0ZTQsIDB4MTZhYywgImJueDItNTcwOFMiLCAgICAgICAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3MDhTIiwgMCksCit9OworCitQQ0lfRFJJVkVSICggYm54Ml9kcml2ZXIsIGJueDJfbmljcywgUENJX05PX0NMQVNTICk7CisKK0RSSVZFUiAoICJCTlgyIiwgbmljX2RyaXZlciwgcGNpX2RyaXZlciwgYm54Ml9kcml2ZXIsIGJueDJfcHJvYmUsIGJueDJfZGlzYWJsZSApOworCisvKgorc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGJueDJfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgICA9ICJCTlgyIiwgICAgICAgICAgICAgIAorCS5wcm9iZSAgICA9IGJueDJfcHJvYmUsCisJLmlkcyAgICAgID0gYm54Ml9uaWNzLCAgICAgICAgICAgICAgICAgIAorCS5pZF9jb3VudCA9IHNpemVvZihibngyX25pY3MpL3NpemVvZihibngyX25pY3NbMF0pLCAKKwkuY2xhc3MgICAgPSAwLCAgICAKK307CisqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYm54Mi5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYm54Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjc4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ibngyLmgKQEAgLTAsMCArMSw0NTk4IEBACisvKiBibngyLmg6IEJyb2FkY29tIE5YMiBuZXR3b3JrIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUsIDIwMDYgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogV3JpdHRlbiBieTogTWljaGFlbCBDaGFuICAobWNoYW5AYnJvYWRjb20uY29tKQorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTF9BTlkgKTsKKworI2lmbmRlZiBCTlgyX0gKKyNkZWZpbmUgQk5YMl9ICisKKyNkZWZpbmUgTDFfQ0FDSEVfQllURVMgMTI4IC8qIFJvdWdoIGFwcHJveGltYWl0aW9uIG9mIHRoZSBjYWNoZSBsaW5lIHNpemUgKi8KKyNkZWZpbmUgTDFfQ0FDSEVfQUxJR04oWCkgKCgoWCkgKyBMMV9DQUNIRV9CWVRFUy0xKSZ+KEwxX0NBQ0hFX0JZVEVTIC0xKSkKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRtYV9hZGRyX3Q7CisKKy8qIEZyb20gcGNpLmggKi8KK3R5cGVkZWYgaW50IHBjaV9wb3dlcl90OworCisjZGVmaW5lIFBDSV9EMCAgICAgICAgICAoKHBjaV9wb3dlcl90KSAwKQorI2RlZmluZSBQQ0lfRDEgICAgICAgICAgKChwY2lfcG93ZXJfdCkgMSkKKyNkZWZpbmUgUENJX0QyICAgICAgICAgICgocGNpX3Bvd2VyX3QpIDIpCisjZGVmaW5lIFBDSV9EM2hvdCAgICAgICAoKHBjaV9wb3dlcl90KSAzKQorI2RlZmluZSBQQ0lfRDNjb2xkICAgICAgKChwY2lfcG93ZXJfdCkgNCkKKyNkZWZpbmUgUENJX1VOS05PV04gICAgICgocGNpX3Bvd2VyX3QpIDUpCisjZGVmaW5lIFBDSV9QT1dFUl9FUlJPUiAoKHBjaV9wb3dlcl90KSAtMSkKKworLyogRnJvbSBwY2lfcmVncy5oICovCisKKyNkZWZpbmUgIFBDSV9DQVBfSURfUENJWAkweDA3CS8qIFBDSS1YICovCisjZGVmaW5lICBQQ0lfWF9DTUQJCTIJLyogTW9kZXMgJiBGZWF0dXJlcyAqLworI2RlZmluZSAgUENJX1hfQ01EX0VSTwkJMHgwMDAyCS8qIEVuYWJsZSBSZWxheGVkIE9yZGVyaW5nICovCisKKy8qIEZyb20gbWlpLmggKi8KKworLyogSW5kaWNhdGVzIHdoYXQgZmVhdHVyZXMgYXJlIGFkdmVydGlzZWQgYnkgdGhlIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYJCSgxIDw8IDApCisjZGVmaW5lIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsCQkoMSA8PCAxKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYJKDEgPDwgMikKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsCSgxIDw8IDMpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYJKDEgPDwgNCkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbAkoMSA8PCA1KQorI2RlZmluZSBBRFZFUlRJU0VEX0F1dG9uZWcJCSgxIDw8IDYpCisjZGVmaW5lIEFEVkVSVElTRURfVFAJCQkoMSA8PCA3KQorI2RlZmluZSBBRFZFUlRJU0VEX0FVSQkJCSgxIDw8IDgpCisjZGVmaW5lIEFEVkVSVElTRURfTUlJCQkJKDEgPDwgOSkKKyNkZWZpbmUgQURWRVJUSVNFRF9GSUJSRQkJKDEgPDwgMTApCisjZGVmaW5lIEFEVkVSVElTRURfQk5DCQkJKDEgPDwgMTEpCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGFsbCBpbnZvbHZlZCBpbiBmb3JjaW5nIGEgcGFydGljdWxhciBsaW5rCisgKiBtb2RlIGZvciB0aGUgZGV2aWNlIGZvciBzZXR0aW5nIHRoaW5ncy4gIFdoZW4gZ2V0dGluZyB0aGUKKyAqIGRldmljZXMgc2V0dGluZ3MsIHRoZXNlIGluZGljYXRlIHRoZSBjdXJyZW50IG1vZGUgYW5kIHdoZXRoZXIKKyAqIGl0IHdhcyBmb2NlZCB1cCBpbnRvIHRoaXMgbW9kZSBvciBhdXRvbmVnb3RpYXRlZC4KKyAqLworCisvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbC4gKi8KKyNkZWZpbmUgRFVQTEVYX0hBTEYJCTB4MDAKKyNkZWZpbmUgRFVQTEVYX0ZVTEwJCTB4MDEKKyNkZWZpbmUgRFVQTEVYX0lOVkFMSUQgICAgICAgICAgMHgwMgorCisvKiBXaGljaCBjb25uZWN0b3IgcG9ydC4gKi8KKyNkZWZpbmUgUE9SVF9UUAkJCTB4MDAKKyNkZWZpbmUgUE9SVF9BVUkJCTB4MDEKKyNkZWZpbmUgUE9SVF9NSUkJCTB4MDIKKyNkZWZpbmUgUE9SVF9GSUJSRQkJMHgwMworI2RlZmluZSBQT1JUX0JOQwkJMHgwNAorCisvKiBXaGljaCB0cmFuY2VpdmVyIHRvIHVzZS4gKi8KKyNkZWZpbmUgWENWUl9JTlRFUk5BTAkJMHgwMAorI2RlZmluZSBYQ1ZSX0VYVEVSTkFMCQkweDAxCisjZGVmaW5lIFhDVlJfRFVNTVkxCQkweDAyCisjZGVmaW5lIFhDVlJfRFVNTVkyCQkweDAzCisjZGVmaW5lIFhDVlJfRFVNTVkzCQkweDA0CisKKy8qIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9uZWdvdGlhdGlvbi4gIElmIHRoaXMgaXMgc2V0IHRvIGVuYWJsZSwKKyAqIHRoZSBmb3JjZWQgbGluayBtb2RlcyBhYm92ZSBhcmUgY29tcGxldGVseSBpZ25vcmVkLgorICovCisjZGVmaW5lIEFVVE9ORUdfRElTQUJMRQkJMHgwMAorI2RlZmluZSBBVVRPTkVHX0VOQUJMRQkJMHgwMQorCisvKiBXYWtlLU9uLUxhbiBvcHRpb25zLiAqLworI2RlZmluZSBXQUtFX1BIWQkJKDEgPDwgMCkKKyNkZWZpbmUgV0FLRV9VQ0FTVAkJKDEgPDwgMSkKKyNkZWZpbmUgV0FLRV9NQ0FTVAkJKDEgPDwgMikKKyNkZWZpbmUgV0FLRV9CQ0FTVAkJKDEgPDwgMykKKyNkZWZpbmUgV0FLRV9BUlAJCSgxIDw8IDQpCisjZGVmaW5lIFdBS0VfTUFHSUMJCSgxIDw8IDUpCisjZGVmaW5lIFdBS0VfTUFHSUNTRUNVUkUJKDEgPDwgNikgLyogb25seSBtZWFuaW5nZnVsIGlmIFdBS0VfTUFHSUMgKi8KKworLyogVGhlIGZvbGxvd2luZyBhcmUgYWxsIGludm9sdmVkIGluIGZvcmNpbmcgYSBwYXJ0aWN1bGFyIGxpbmsKKyAqICAqIG1vZGUgZm9yIHRoZSBkZXZpY2UgZm9yIHNldHRpbmcgdGhpbmdzLiAgV2hlbiBnZXR0aW5nIHRoZQorICogICAqIGRldmljZXMgc2V0dGluZ3MsIHRoZXNlIGluZGljYXRlIHRoZSBjdXJyZW50IG1vZGUgYW5kIHdoZXRoZXIKKyAqICAgICogaXQgd2FzIGZvY2VkIHVwIGludG8gdGhpcyBtb2RlIG9yIGF1dG9uZWdvdGlhdGVkLgorICogICAgICovCisKKy8qIFRoZSBmb3JjZWQgc3BlZWQsIDEwTWIsIDEwME1iLCBnaWdhYml0LiAqLworI2RlZmluZSBTUEVFRF8xMCAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBTUEVFRF8xMDAgICAgICAgICAgICAgICAxMDAKKyNkZWZpbmUgU1BFRURfMTAwMCAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBTUEVFRF8yNTAwCQkyNTAwCisjZGVmaW5lIFNQRUVEX0lOVkFMSUQgICAgICAgICAgIDAgLyogWFhYIHdhcyAzICovCisKKworLyogRHVwbGV4LCBoYWxmIG9yIGZ1bGwuICovCisjZGVmaW5lIERVUExFWF9IQUxGICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRFVQTEVYX0ZVTEwgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBEVVBMRVhfSU5WQUxJRCAgICAgICAgICAweDAyCisKKy8qIFdoaWNoIGNvbm5lY3RvciBwb3J0LiAqLworI2RlZmluZSBQT1JUX1RQICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFBPUlRfQVVJICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUE9SVF9NSUkgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBQT1JUX0ZJQlJFICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFBPUlRfQk5DICAgICAgICAgICAgICAgIDB4MDQKKworLyogV2hpY2ggdHJhbmNlaXZlciB0byB1c2UuICovCisjZGVmaW5lIFhDVlJfSU5URVJOQUwgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgWENWUl9FWFRFUk5BTCAgICAgICAgICAgMHgwMQorI2RlZmluZSBYQ1ZSX0RVTU1ZMSAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFhDVlJfRFVNTVkyICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgWENWUl9EVU1NWTMgICAgICAgICAgICAgMHgwNAorCisvKiBFbmFibGUgb3IgZGlzYWJsZSBhdXRvbmVnb3RpYXRpb24uICBJZiB0aGlzIGlzIHNldCB0byBlbmFibGUsCisgKiAgKiB0aGUgZm9yY2VkIGxpbmsgbW9kZXMgYWJvdmUgYXJlIGNvbXBsZXRlbHkgaWdub3JlZC4KKyAqICAgKi8KKyNkZWZpbmUgQVVUT05FR19ESVNBQkxFICAgICAgICAgMHgwMAorI2RlZmluZSBBVVRPTkVHX0VOQUJMRSAgICAgICAgICAweDAxCisKKy8qIFdha2UtT24tTGFuIG9wdGlvbnMuICovCisjZGVmaW5lIFdBS0VfUEhZICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIFdBS0VfVUNBU1QgICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIFdBS0VfTUNBU1QgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFdBS0VfQkNBU1QgICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIFdBS0VfQVJQICAgICAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIFdBS0VfTUFHSUMgICAgICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIFdBS0VfTUFHSUNTRUNVUkUgICAgICAgICgxIDw8IDYpIC8qIG9ubHkgbWVhbmluZ2Z1bCBpZiBXQUtFX01BR0lDICovCisKKy8qIEhhcmR3YXJlIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgYXV0b21hdGljYWxseQorICogZ2VuZXJhdGVkIGZyb20gUlRMIGNvZGUuIERvIG5vdCBtb2RpZnkuCisgKi8KKworLyoKKyAqICB0eF9iZCBkZWZpbml0aW9uCisgKi8KK3N0cnVjdCB0eF9iZCB7CisJdTMyIHR4X2JkX2hhZGRyX2hpOworCXUzMiB0eF9iZF9oYWRkcl9sbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXUzMiB0eF9iZF9tc3NfbmJ5dGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl1MzIgdHhfYmRfdmxhbl90YWdfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJI2RlZmluZSBUWF9CRF9GTEFHU19DT05OX0ZBVUxUCQkoMTw8MCkKKwkJI2RlZmluZSBUWF9CRF9GTEFHU19UQ1BfVURQX0NLU1VNCSgxPDwxKQorCQkjZGVmaW5lIFRYX0JEX0ZMQUdTX0lQX0NLU1VNCQkoMTw8MikKKwkJI2RlZmluZSBUWF9CRF9GTEFHU19WTEFOX1RBRwkJKDE8PDMpCisJCSNkZWZpbmUgVFhfQkRfRkxBR1NfQ09BTF9OT1cJCSgxPDw0KQorCQkjZGVmaW5lIFRYX0JEX0ZMQUdTX0RPTlRfR0VOX0NSQwkoMTw8NSkKKwkJI2RlZmluZSBUWF9CRF9GTEFHU19FTkQJCQkoMTw8NikKKwkJI2RlZmluZSBUWF9CRF9GTEFHU19TVEFSVAkJKDE8PDcpCisJCSNkZWZpbmUgVFhfQkRfRkxBR1NfU1dfT1BUSU9OX1dPUkQJKDB4MWY8PDgpCisJCSNkZWZpbmUgVFhfQkRfRkxBR1NfU1dfRkxBR1MJCSgxPDwxMykKKwkJI2RlZmluZSBUWF9CRF9GTEFHU19TV19TTkFQCQkoMTw8MTQpCisJCSNkZWZpbmUgVFhfQkRfRkxBR1NfU1dfTFNPCQkoMTw8MTUpCisKK307CisKKworLyoKKyAqICByeF9iZCBkZWZpbml0aW9uCisgKi8KK3N0cnVjdCByeF9iZCB7CisJdTMyIHJ4X2JkX2hhZGRyX2hpOworCXUzMiByeF9iZF9oYWRkcl9sbzsKKwl1MzIgcnhfYmRfbGVuOworCXUzMiByeF9iZF9mbGFnczsKKwkJI2RlZmluZSBSWF9CRF9GTEFHU19OT1BVU0gJCSgxPDwwKQorCQkjZGVmaW5lIFJYX0JEX0ZMQUdTX0RVTU1ZCQkoMTw8MSkKKwkJI2RlZmluZSBSWF9CRF9GTEFHU19FTkQJCQkoMTw8MikKKwkJI2RlZmluZSBSWF9CRF9GTEFHU19TVEFSVAkJKDE8PDMpCisKK307CisKKworLyoKKyAqICBzdGF0dXNfYmxvY2sgZGVmaW5pdGlvbgorICovCitzdHJ1Y3Qgc3RhdHVzX2Jsb2NrIHsKKwl1MzIgc3RhdHVzX2F0dG5fYml0czsKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX0xJTktfU1RBVEUJCSgxTDw8MCkKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX1RYX1NDSEVEVUxFUl9BQk9SVAkoMUw8PDEpCisJCSNkZWZpbmUgU1RBVFVTX0FUVE5fQklUU19UWF9CRF9SRUFEX0FCT1JUCSgxTDw8MikKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX1RYX0JEX0NBQ0hFX0FCT1JUCSgxTDw8MykKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX1RYX1BST0NFU1NPUl9BQk9SVAkoMUw8PDQpCisJCSNkZWZpbmUgU1RBVFVTX0FUVE5fQklUU19UWF9ETUFfQUJPUlQJCSgxTDw8NSkKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX1RYX1BBVENIVVBfQUJPUlQJKDFMPDw2KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfVFhfQVNTRU1CTEVSX0FCT1JUCSgxTDw8NykKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX1JYX1BBUlNFUl9NQUNfQUJPUlQJKDFMPDw4KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfUlhfUEFSU0VSX0NBVENIVVBfQUJPUlQJKDFMPDw5KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfUlhfTUJVRl9BQk9SVAkJKDFMPDwxMCkKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX1JYX0xPT0tVUF9BQk9SVAkoMUw8PDExKQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfUlhfUFJPQ0VTU09SX0FCT1JUCSgxTDw8MTIpCisJCSNkZWZpbmUgU1RBVFVTX0FUVE5fQklUU19SWF9WMlBfQUJPUlQJCSgxTDw8MTMpCisJCSNkZWZpbmUgU1RBVFVTX0FUVE5fQklUU19SWF9CRF9DQUNIRV9BQk9SVAkoMUw8PDE0KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfUlhfRE1BX0FCT1JUCQkoMUw8PDE1KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfQ09NUExFVElPTl9BQk9SVAkoMUw8PDE2KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfSE9TVF9DT0FMRVNDRV9BQk9SVAkoMUw8PDE3KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfTUFJTEJPWF9RVUVVRV9BQk9SVAkoMUw8PDE4KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfQ09OVEVYVF9BQk9SVAkJKDFMPDwxOSkKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX0NNRF9TQ0hFRFVMRVJfQUJPUlQJKDFMPDwyMCkKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX0NNRF9QUk9DRVNTT1JfQUJPUlQJKDFMPDwyMSkKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX01HTVRfUFJPQ0VTU09SX0FCT1JUCSgxTDw8MjIpCisJCSNkZWZpbmUgU1RBVFVTX0FUVE5fQklUU19NQUNfQUJPUlQJCSgxTDw8MjMpCisJCSNkZWZpbmUgU1RBVFVTX0FUVE5fQklUU19USU1FUl9BQk9SVAkJKDFMPDwyNCkKKwkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX0RNQUVfQUJPUlQJCSgxTDw8MjUpCisJCSNkZWZpbmUgU1RBVFVTX0FUVE5fQklUU19GTFNIX0FCT1JUCQkoMUw8PDI2KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfR1JDX0FCT1JUCQkoMUw8PDI3KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfUEFSSVRZX0VSUk9SCQkoMUw8PDMxKQorCisJdTMyIHN0YXR1c19hdHRuX2JpdHNfYWNrOworI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1MTYgc3RhdHVzX3R4X3F1aWNrX2NvbnN1bWVyX2luZGV4MDsKKwl1MTYgc3RhdHVzX3R4X3F1aWNrX2NvbnN1bWVyX2luZGV4MTsKKwl1MTYgc3RhdHVzX3R4X3F1aWNrX2NvbnN1bWVyX2luZGV4MjsKKwl1MTYgc3RhdHVzX3R4X3F1aWNrX2NvbnN1bWVyX2luZGV4MzsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MDsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MTsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MjsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MzsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4NDsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4NTsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4NjsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4NzsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4ODsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4OTsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MTA7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDExOworCXUxNiBzdGF0dXNfcnhfcXVpY2tfY29uc3VtZXJfaW5kZXgxMjsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MTM7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDE0OworCXUxNiBzdGF0dXNfcnhfcXVpY2tfY29uc3VtZXJfaW5kZXgxNTsKKwl1MTYgc3RhdHVzX2NvbXBsZXRpb25fcHJvZHVjZXJfaW5kZXg7CisJdTE2IHN0YXR1c19jbWRfY29uc3VtZXJfaW5kZXg7CisJdTE2IHN0YXR1c19pZHg7CisJdTE2IHN0YXR1c191bnVzZWQ7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdTE2IHN0YXR1c190eF9xdWlja19jb25zdW1lcl9pbmRleDE7CisJdTE2IHN0YXR1c190eF9xdWlja19jb25zdW1lcl9pbmRleDA7CisJdTE2IHN0YXR1c190eF9xdWlja19jb25zdW1lcl9pbmRleDM7CisJdTE2IHN0YXR1c190eF9xdWlja19jb25zdW1lcl9pbmRleDI7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDE7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDA7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDM7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDI7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDU7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDQ7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDc7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDY7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDk7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDg7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDExOworCXUxNiBzdGF0dXNfcnhfcXVpY2tfY29uc3VtZXJfaW5kZXgxMDsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MTM7CisJdTE2IHN0YXR1c19yeF9xdWlja19jb25zdW1lcl9pbmRleDEyOworCXUxNiBzdGF0dXNfcnhfcXVpY2tfY29uc3VtZXJfaW5kZXgxNTsKKwl1MTYgc3RhdHVzX3J4X3F1aWNrX2NvbnN1bWVyX2luZGV4MTQ7CisJdTE2IHN0YXR1c19jbWRfY29uc3VtZXJfaW5kZXg7CisJdTE2IHN0YXR1c19jb21wbGV0aW9uX3Byb2R1Y2VyX2luZGV4OworCXUxNiBzdGF0dXNfdW51c2VkOworCXUxNiBzdGF0dXNfaWR4OworI2VuZGlmCit9OworCisKKy8qCisgKiAgc3RhdGlzdGljc19ibG9jayBkZWZpbml0aW9uCisgKi8KK3N0cnVjdCBzdGF0aXN0aWNzX2Jsb2NrIHsKKwl1MzIgc3RhdF9JZkhDSW5PY3RldHNfaGk7CisJdTMyIHN0YXRfSWZIQ0luT2N0ZXRzX2xvOworCXUzMiBzdGF0X0lmSENJbkJhZE9jdGV0c19oaTsKKwl1MzIgc3RhdF9JZkhDSW5CYWRPY3RldHNfbG87CisJdTMyIHN0YXRfSWZIQ091dE9jdGV0c19oaTsKKwl1MzIgc3RhdF9JZkhDT3V0T2N0ZXRzX2xvOworCXUzMiBzdGF0X0lmSENPdXRCYWRPY3RldHNfaGk7CisJdTMyIHN0YXRfSWZIQ091dEJhZE9jdGV0c19sbzsKKwl1MzIgc3RhdF9JZkhDSW5VY2FzdFBrdHNfaGk7CisJdTMyIHN0YXRfSWZIQ0luVWNhc3RQa3RzX2xvOworCXUzMiBzdGF0X0lmSENJbk11bHRpY2FzdFBrdHNfaGk7CisJdTMyIHN0YXRfSWZIQ0luTXVsdGljYXN0UGt0c19sbzsKKwl1MzIgc3RhdF9JZkhDSW5Ccm9hZGNhc3RQa3RzX2hpOworCXUzMiBzdGF0X0lmSENJbkJyb2FkY2FzdFBrdHNfbG87CisJdTMyIHN0YXRfSWZIQ091dFVjYXN0UGt0c19oaTsKKwl1MzIgc3RhdF9JZkhDT3V0VWNhc3RQa3RzX2xvOworCXUzMiBzdGF0X0lmSENPdXRNdWx0aWNhc3RQa3RzX2hpOworCXUzMiBzdGF0X0lmSENPdXRNdWx0aWNhc3RQa3RzX2xvOworCXUzMiBzdGF0X0lmSENPdXRCcm9hZGNhc3RQa3RzX2hpOworCXUzMiBzdGF0X0lmSENPdXRCcm9hZGNhc3RQa3RzX2xvOworCXUzMiBzdGF0X2VtYWNfdHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzOworCXUzMiBzdGF0X0RvdDNTdGF0c0NhcnJpZXJTZW5zZUVycm9yczsKKwl1MzIgc3RhdF9Eb3QzU3RhdHNGQ1NFcnJvcnM7CisJdTMyIHN0YXRfRG90M1N0YXRzQWxpZ25tZW50RXJyb3JzOworCXUzMiBzdGF0X0RvdDNTdGF0c1NpbmdsZUNvbGxpc2lvbkZyYW1lczsKKwl1MzIgc3RhdF9Eb3QzU3RhdHNNdWx0aXBsZUNvbGxpc2lvbkZyYW1lczsKKwl1MzIgc3RhdF9Eb3QzU3RhdHNEZWZlcnJlZFRyYW5zbWlzc2lvbnM7CisJdTMyIHN0YXRfRG90M1N0YXRzRXhjZXNzaXZlQ29sbGlzaW9uczsKKwl1MzIgc3RhdF9Eb3QzU3RhdHNMYXRlQ29sbGlzaW9uczsKKwl1MzIgc3RhdF9FdGhlclN0YXRzQ29sbGlzaW9uczsKKwl1MzIgc3RhdF9FdGhlclN0YXRzRnJhZ21lbnRzOworCXUzMiBzdGF0X0V0aGVyU3RhdHNKYWJiZXJzOworCXUzMiBzdGF0X0V0aGVyU3RhdHNVbmRlcnNpemVQa3RzOworCXUzMiBzdGF0X0V0aGVyU3RhdHNPdmVycnNpemVQa3RzOworCXUzMiBzdGF0X0V0aGVyU3RhdHNQa3RzUng2NE9jdGV0czsKKwl1MzIgc3RhdF9FdGhlclN0YXRzUGt0c1J4NjVPY3RldHN0bzEyN09jdGV0czsKKwl1MzIgc3RhdF9FdGhlclN0YXRzUGt0c1J4MTI4T2N0ZXRzdG8yNTVPY3RldHM7CisJdTMyIHN0YXRfRXRoZXJTdGF0c1BrdHNSeDI1Nk9jdGV0c3RvNTExT2N0ZXRzOworCXUzMiBzdGF0X0V0aGVyU3RhdHNQa3RzUng1MTJPY3RldHN0bzEwMjNPY3RldHM7CisJdTMyIHN0YXRfRXRoZXJTdGF0c1BrdHNSeDEwMjRPY3RldHN0bzE1MjJPY3RldHM7CisJdTMyIHN0YXRfRXRoZXJTdGF0c1BrdHNSeDE1MjNPY3RldHN0bzkwMjJPY3RldHM7CisJdTMyIHN0YXRfRXRoZXJTdGF0c1BrdHNUeDY0T2N0ZXRzOworCXUzMiBzdGF0X0V0aGVyU3RhdHNQa3RzVHg2NU9jdGV0c3RvMTI3T2N0ZXRzOworCXUzMiBzdGF0X0V0aGVyU3RhdHNQa3RzVHgxMjhPY3RldHN0bzI1NU9jdGV0czsKKwl1MzIgc3RhdF9FdGhlclN0YXRzUGt0c1R4MjU2T2N0ZXRzdG81MTFPY3RldHM7CisJdTMyIHN0YXRfRXRoZXJTdGF0c1BrdHNUeDUxMk9jdGV0c3RvMTAyM09jdGV0czsKKwl1MzIgc3RhdF9FdGhlclN0YXRzUGt0c1R4MTAyNE9jdGV0c3RvMTUyMk9jdGV0czsKKwl1MzIgc3RhdF9FdGhlclN0YXRzUGt0c1R4MTUyM09jdGV0c3RvOTAyMk9jdGV0czsKKwl1MzIgc3RhdF9Yb25QYXVzZUZyYW1lc1JlY2VpdmVkOworCXUzMiBzdGF0X1hvZmZQYXVzZUZyYW1lc1JlY2VpdmVkOworCXUzMiBzdGF0X091dFhvblNlbnQ7CisJdTMyIHN0YXRfT3V0WG9mZlNlbnQ7CisJdTMyIHN0YXRfRmxvd0NvbnRyb2xEb25lOworCXUzMiBzdGF0X01hY0NvbnRyb2xGcmFtZXNSZWNlaXZlZDsKKwl1MzIgc3RhdF9Yb2ZmU3RhdGVFbnRlcmVkOworCXUzMiBzdGF0X0lmSW5GcmFtZXNMMkZpbHRlckRpc2NhcmRzOworCXUzMiBzdGF0X0lmSW5SdWxlQ2hlY2tlckRpc2NhcmRzOworCXUzMiBzdGF0X0lmSW5GVFFEaXNjYXJkczsKKwl1MzIgc3RhdF9JZkluTUJVRkRpc2NhcmRzOworCXUzMiBzdGF0X0lmSW5SdWxlQ2hlY2tlclA0SGl0OworCXUzMiBzdGF0X0NhdGNodXBJblJ1bGVDaGVja2VyRGlzY2FyZHM7CisJdTMyIHN0YXRfQ2F0Y2h1cEluRlRRRGlzY2FyZHM7CisJdTMyIHN0YXRfQ2F0Y2h1cEluTUJVRkRpc2NhcmRzOworCXUzMiBzdGF0X0NhdGNodXBJblJ1bGVDaGVja2VyUDRIaXQ7CisJdTMyIHN0YXRfR2VuU3RhdDAwOworCXUzMiBzdGF0X0dlblN0YXQwMTsKKwl1MzIgc3RhdF9HZW5TdGF0MDI7CisJdTMyIHN0YXRfR2VuU3RhdDAzOworCXUzMiBzdGF0X0dlblN0YXQwNDsKKwl1MzIgc3RhdF9HZW5TdGF0MDU7CisJdTMyIHN0YXRfR2VuU3RhdDA2OworCXUzMiBzdGF0X0dlblN0YXQwNzsKKwl1MzIgc3RhdF9HZW5TdGF0MDg7CisJdTMyIHN0YXRfR2VuU3RhdDA5OworCXUzMiBzdGF0X0dlblN0YXQxMDsKKwl1MzIgc3RhdF9HZW5TdGF0MTE7CisJdTMyIHN0YXRfR2VuU3RhdDEyOworCXUzMiBzdGF0X0dlblN0YXQxMzsKKwl1MzIgc3RhdF9HZW5TdGF0MTQ7CisJdTMyIHN0YXRfR2VuU3RhdDE1OworfTsKKworCisvKgorICogIGwyX2ZoZHIgZGVmaW5pdGlvbgorICovCitzdHJ1Y3QgbDJfZmhkciB7CisJdTMyIGwyX2ZoZHJfc3RhdHVzOworCQkjZGVmaW5lIEwyX0ZIRFJfU1RBVFVTX1JVTEVfQ0xBU1MJKDB4Nzw8MCkKKwkJI2RlZmluZSBMMl9GSERSX1NUQVRVU19SVUxFX1AyCQkoMTw8MykKKwkJI2RlZmluZSBMMl9GSERSX1NUQVRVU19SVUxFX1AzCQkoMTw8NCkKKwkJI2RlZmluZSBMMl9GSERSX1NUQVRVU19SVUxFX1A0CQkoMTw8NSkKKwkJI2RlZmluZSBMMl9GSERSX1NUQVRVU19MMl9WTEFOX1RBRwkoMTw8NikKKwkJI2RlZmluZSBMMl9GSERSX1NUQVRVU19MMl9MTENfU05BUAkoMTw8NykKKwkJI2RlZmluZSBMMl9GSERSX1NUQVRVU19SU1NfSEFTSAkJKDE8PDgpCisJCSNkZWZpbmUgTDJfRkhEUl9TVEFUVVNfSVBfREFUQUdSQU0JKDE8PDEzKQorCQkjZGVmaW5lIEwyX0ZIRFJfU1RBVFVTX1RDUF9TRUdNRU5UCSgxPDwxNCkKKwkJI2RlZmluZSBMMl9GSERSX1NUQVRVU19VRFBfREFUQUdSQU0JKDE8PDE1KQorCisJCSNkZWZpbmUgTDJfRkhEUl9FUlJPUlNfQkFEX0NSQwkJKDE8PDE3KQorCQkjZGVmaW5lIEwyX0ZIRFJfRVJST1JTX1BIWV9ERUNPREUJKDE8PDE4KQorCQkjZGVmaW5lIEwyX0ZIRFJfRVJST1JTX0FMSUdOTUVOVAkoMTw8MTkpCisJCSNkZWZpbmUgTDJfRkhEUl9FUlJPUlNfVE9PX1NIT1JUCSgxPDwyMCkKKwkJI2RlZmluZSBMMl9GSERSX0VSUk9SU19HSUFOVF9GUkFNRQkoMTw8MjEpCisJCSNkZWZpbmUgTDJfRkhEUl9FUlJPUlNfVENQX1hTVU0JCSgxPDwyOCkKKwkJI2RlZmluZSBMMl9GSERSX0VSUk9SU19VRFBfWFNVTQkJKDE8PDMxKQorCisJdTMyIGwyX2ZoZHJfaGFzaDsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdTE2IGwyX2ZoZHJfcGt0X2xlbjsKKwl1MTYgbDJfZmhkcl92bGFuX3RhZzsKKwl1MTYgbDJfZmhkcl9pcF94c3VtOworCXUxNiBsMl9maGRyX3RjcF91ZHBfeHN1bTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1MTYgbDJfZmhkcl92bGFuX3RhZzsKKwl1MTYgbDJfZmhkcl9wa3RfbGVuOworCXUxNiBsMl9maGRyX3RjcF91ZHBfeHN1bTsKKwl1MTYgbDJfZmhkcl9pcF94c3VtOworI2VuZGlmCit9OworCisKKy8qCisgKiAgbDJfY29udGV4dCBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgQk5YMl9MMkNUWF9UWVBFCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIEJOWDJfTDJDVFhfVFlQRV9TSVpFX0wyCQkJCSAoKDB4YzAvMHgyMCk8PDE2KQorI2RlZmluZSBCTlgyX0wyQ1RYX1RZUEVfVFlQRQkJCQkgKDB4Zjw8MjgpCisjZGVmaW5lIEJOWDJfTDJDVFhfVFlQRV9UWVBFX0VNUFRZCQkJICgwPDwyOCkKKyNkZWZpbmUgQk5YMl9MMkNUWF9UWVBFX1RZUEVfTDIJCQkJICgxPDwyOCkKKworI2RlZmluZSBCTlgyX0wyQ1RYX1RYX0hPU1RfQklEWAkJCQkweDAwMDAwMDg4CisjZGVmaW5lIEJOWDJfTDJDVFhfRVNUX05CRAkJCQkweDAwMDAwMDg4CisjZGVmaW5lIEJOWDJfTDJDVFhfQ01EX1RZUEUJCQkJMHgwMDAwMDA4OAorI2RlZmluZSBCTlgyX0wyQ1RYX0NNRF9UWVBFX1RZUEUJCQkgKDB4Zjw8MjQpCisjZGVmaW5lIEJOWDJfTDJDVFhfQ01EX1RZUEVfVFlQRV9MMgkJCSAoMDw8MjQpCisjZGVmaW5lIEJOWDJfTDJDVFhfQ01EX1RZUEVfVFlQRV9UQ1AJCQkgKDE8PDI0KQorCisjZGVmaW5lIEJOWDJfTDJDVFhfVFhfSE9TVF9CU0VRCQkJCTB4MDAwMDAwOTAKKyNkZWZpbmUgQk5YMl9MMkNUWF9UU0NIX0JTRVEJCQkJMHgwMDAwMDA5NAorI2RlZmluZSBCTlgyX0wyQ1RYX1RCRFJfQlNFUQkJCQkweDAwMDAwMDk4CisjZGVmaW5lIEJOWDJfTDJDVFhfVEJEUl9CT0ZGCQkJCTB4MDAwMDAwOWMKKyNkZWZpbmUgQk5YMl9MMkNUWF9UQkRSX0JJRFgJCQkJMHgwMDAwMDA5YworI2RlZmluZSBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0hJCQkJMHgwMDAwMDBhMAorI2RlZmluZSBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0xPCQkJMHgwMDAwMDBhNAorI2RlZmluZSBCTlgyX0wyQ1RYX1RYUF9CT0ZGCQkJCTB4MDAwMDAwYTgKKyNkZWZpbmUgQk5YMl9MMkNUWF9UWFBfQklEWAkJCQkweDAwMDAwMGE4CisjZGVmaW5lIEJOWDJfTDJDVFhfVFhQX0JTRVEJCQkJMHgwMDAwMDBhYworCisKKy8qCisgKiAgbDJfYmRfY2hhaW5fY29udGV4dCBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgQk5YMl9MMkNUWF9CRF9QUkVfUkVBRAkJCQkweDAwMDAwMDAwCisjZGVmaW5lIEJOWDJfTDJDVFhfQ1RYX1NJWkUJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBCTlgyX0wyQ1RYX0NUWF9UWVBFCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQk5YMl9MMkNUWF9DVFhfVFlQRV9TSVpFX0wyCQkJICgoMHgyMC8yMCk8PDE2KQorI2RlZmluZSBCTlgyX0wyQ1RYX0NUWF9UWVBFX0NUWF9CRF9DSE5fVFlQRQkJICgweGY8PDI4KQorI2RlZmluZSBCTlgyX0wyQ1RYX0NUWF9UWVBFX0NUWF9CRF9DSE5fVFlQRV9VTkRFRklORUQJICgwPDwyOCkKKyNkZWZpbmUgQk5YMl9MMkNUWF9DVFhfVFlQRV9DVFhfQkRfQ0hOX1RZUEVfVkFMVUUJICgxPDwyOCkKKworI2RlZmluZSBCTlgyX0wyQ1RYX0hPU1RfQkRJRFgJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBCTlgyX0wyQ1RYX0hPU1RfQlNFUQkJCQkweDAwMDAwMDA4CisjZGVmaW5lIEJOWDJfTDJDVFhfTlhfQlNFUQkJCQkweDAwMDAwMDBjCisjZGVmaW5lIEJOWDJfTDJDVFhfTlhfQkRIQUREUl9ISQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQk5YMl9MMkNUWF9OWF9CREhBRERSX0xPCQkJMHgwMDAwMDAxNAorI2RlZmluZSBCTlgyX0wyQ1RYX05YX0JESURYCQkJCTB4MDAwMDAwMTgKKworCisvKgorICogIHBjaV9jb25maWdfbCBkZWZpbml0aW9uCisgKiAgb2Zmc2V0OiAwMDAwCisgKi8KKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUcJCQkJMHgwMDAwMDA2OAorI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19UQVJHRVRfQllURV9TV0FQCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX1RBUkdFVF9NQl9XT1JEX1NXQVAJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ0xPQ0tfQ1RMX0VOQQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfVEFSR0VUX0dSQ19XT1JEX1NXQVAJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfUkVHX1dJTkRPV19FTkEJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0NPUkVfUlNUX1JFUQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfQlNZCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19BU0lDX01FVEFMX1JFVgkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0FTSUNfQkFTRV9SRVYJCSAoMHhmTDw8MjQpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0FTSUNfSUQJCQkgKDB4Zkw8PDI4KQorCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTCQkJCTB4MDAwMDAwNmMKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVNfSU5UQV9WQUxVRQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVNfMzJCSVRfREVUCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX1NUQVRVU19NNjZFTgkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTX1BDSVhfREVUCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX1NUQVRVU19QQ0lYX1NQRUVECQkgKDB4M0w8PDQpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTX1BDSVhfU1BFRURfNjYJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTX1BDSVhfU1BFRURfMTAwCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX1NUQVRVU19QQ0lYX1NQRUVEXzEzMwkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVNfUENJWF9TUEVFRF9QQ0lfTU9ERQkgKDNMPDw0KQorCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFMJCTB4MDAwMDAwNzAKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVQJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF8zMk1IWgkgKDBMPDwwKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF8zOE1IWgkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF80OE1IWgkgKDJMPDwwKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF81NU1IWgkgKDNMPDwwKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF82Nk1IWgkgKDRMPDwwKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF84ME1IWgkgKDVMPDwwKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF85NU1IWgkgKDZMPDwwKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF8xMzNNSFoJICg3TDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVRfTE9XCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19ESVNBQkxFCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUX1NSQwkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUX1NSQ19VTkRFRgkgKDBMPDw4KQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX0FMVF9TUkNfMTIJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzYJICgyTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzYyCSAoNEw8PDgpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUExBWV9ERUFECSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRAkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF8xMDAJICgwTDw8MTIpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1NQRUVEXzgwCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF81MAkgKDJMPDwxMikKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRURfNDAJICg0TDw8MTIpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1NQRUVEXzI1CSAoOEw8PDEyKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TVE9QCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9QTExfU1RPUAkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19SRVNFUlZFRF8xOAkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19VU0VfU1BEX0RFVAkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19SRVNFUlZFRAkgKDB4ZmZmTDw8MjApCisKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUkVHX1dJTkRPV19BRERSRVNTCQkJMHgwMDAwMDA3OAorI2RlZmluZSBCTlgyX1BDSUNGR19SRUdfV0lORE9XCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTUQJCQkJMHgwMDAwMDA4NAorI2RlZmluZSBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9JTkRFWAkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTURfSU5ERVhfVkFMSUQJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9VU0VfSU5UX0hDX1BBUkFNCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9NQVNLX0lOVAkJICgxTDw8MTgpCisKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfU1RBVFVTX0JJVF9TRVRfQ01ECQkJMHgwMDAwMDA4OAorI2RlZmluZSBCTlgyX1BDSUNGR19TVEFUVVNfQklUX0NMRUFSX0NNRAkJMHgwMDAwMDA4YworI2RlZmluZSBCTlgyX1BDSUNGR19NQUlMQk9YX1FVRVVFX0FERFIJCQkweDAwMDAwMDkwCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01BSUxCT1hfUVVFVUVfREFUQQkJCTB4MDAwMDAwOTQKKworCisvKgorICogIHBjaV9yZWcgZGVmaW5pdGlvbgorICogIG9mZnNldDogMHg0MDAKKyAqLworI2RlZmluZSBCTlgyX1BDSV9HUkNfV0lORE9XX0FERFIJCQkweDAwMDAwNDAwCisjZGVmaW5lIEJOWDJfUENJX0dSQ19XSU5ET1dfQUREUl9QQ0lfR1JDX1dJTkRPV19BRERSX1ZBTFVFCSAoMHgzZmZmZkw8PDgpCisKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzEJCQkJMHgwMDAwMDQwNAorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMV9SRUFEX0JPVU5EQVJZCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMV9SRUFEX0JPVU5EQVJZX09GRgkJICgwTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVBRF9CT1VOREFSWV8xNgkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVBRF9CT1VOREFSWV8zMgkJICgyTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVBRF9CT1VOREFSWV82NAkJICgzTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVBRF9CT1VOREFSWV8xMjgJCSAoNEw8PDgpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18xX1JFQURfQk9VTkRBUllfMjU2CQkgKDVMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMV9SRUFEX0JPVU5EQVJZXzUxMgkJICg2TDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVBRF9CT1VOREFSWV8xMDI0CQkgKDdMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMV9XUklURV9CT1VOREFSWQkJICgweDdMPDwxMSkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfT0ZGCQkgKDBMPDwxMSkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfMTYJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMV9XUklURV9CT1VOREFSWV8zMgkJICgyTDw8MTEpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18xX1dSSVRFX0JPVU5EQVJZXzY0CQkgKDNMPDwxMSkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfMTI4CQkgKDRMPDwxMSkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfMjU2CQkgKDVMPDwxMSkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfNTEyCQkgKDZMPDwxMSkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfMTAyNAkJICg3TDw8MTEpCisKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzIJCQkJMHgwMDAwMDQwOAorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9CQVIxX1NJWkUJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfU0laRV9ESVNBQkxFRAkJICgwTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfQkFSMV9TSVpFXzY0SwkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfU0laRV8xMjhLCQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9CQVIxX1NJWkVfMjU2SwkJICgzTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfQkFSMV9TSVpFXzUxMksJCSAoNEw8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfU0laRV8xTQkJCSAoNUw8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfU0laRV8yTQkJCSAoNkw8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfU0laRV80TQkJCSAoN0w8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfU0laRV84TQkJCSAoOEw8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfU0laRV8xNk0JCQkgKDlMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9CQVIxX1NJWkVfMzJNCQkJICgxMEw8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfU0laRV82NE0JCQkgKDExTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfQkFSMV9TSVpFXzEyOE0JCSAoMTJMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9CQVIxX1NJWkVfMjU2TQkJICgxM0w8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfU0laRV81MTJNCQkgKDE0TDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfQkFSMV9TSVpFXzFHCQkJICgxNUw8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0JBUjFfNjRFTkEJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9FWFBfUk9NX1JFVFJZCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfQ0ZHX0NZQ0xFX1JFVFJZCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9GSVJTVF9DRkdfRE9ORQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfRVhQX1JPTV9TSVpFCQkJICgweGZmTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfRVhQX1JPTV9TSVpFX0RJU0FCTEVECQkgKDBMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9FWFBfUk9NX1NJWkVfMUsJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0VYUF9ST01fU0laRV8ySwkJICgyTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfRVhQX1JPTV9TSVpFXzRLCQkgKDNMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9FWFBfUk9NX1NJWkVfOEsJCSAoNEw8PDgpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0VYUF9ST01fU0laRV8xNksJCSAoNUw8PDgpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0VYUF9ST01fU0laRV8zMksJCSAoNkw8PDgpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0VYUF9ST01fU0laRV82NEsJCSAoN0w8PDgpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0VYUF9ST01fU0laRV8xMjhLCQkgKDhMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9FWFBfUk9NX1NJWkVfMjU2SwkJICg5TDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfRVhQX1JPTV9TSVpFXzUxMksJCSAoMTBMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9FWFBfUk9NX1NJWkVfMU0JCSAoMTFMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9FWFBfUk9NX1NJWkVfMk0JCSAoMTJMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9FWFBfUk9NX1NJWkVfNE0JCSAoMTNMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9FWFBfUk9NX1NJWkVfOE0JCSAoMTRMPDw4KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9FWFBfUk9NX1NJWkVfMTZNCQkgKDE1TDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfTUFYX1NQTElUX0xJTUlUCQkgKDB4MWZMPDwxNikKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfTUFYX1JFQURfTElNSVQJCSAoMHgzTDw8MjEpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX01BWF9SRUFEX0xJTUlUXzUxMgkJICgwTDw8MjEpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX01BWF9SRUFEX0xJTUlUXzFLCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfTUFYX1JFQURfTElNSVRfMksJCSAoMkw8PDIxKQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9NQVhfUkVBRF9MSU1JVF80SwkJICgzTDw8MjEpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0ZPUkNFXzMyX0JJVF9NU1RSCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfRk9SQ0VfMzJfQklUX1RHVAkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0tFRVBfUkVRX0FTU0VSVAkJICgxTDw8MjUpCisKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzMJCQkJMHgwMDAwMDQwYworI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfM19TVElDS1lfQllURQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18zX0ZPUkNFX1BNRQkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfM19QTUVfU1RBVFVTCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18zX1BNRV9FTkFCTEUJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzNfUE1fU1RBVEUJCQkgKDB4M0w8PDI3KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfM19WQVVYX1BSRVNFVAkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfM19QQ0lfUE9XRVIJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1BDSV9QTV9EQVRBX0EJCQkJMHgwMDAwMDQxMAorI2RlZmluZSBCTlgyX1BDSV9QTV9EQVRBX0FfUE1fREFUQV8wX1BSRwkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfUE1fREFUQV9BX1BNX0RBVEFfMV9QUkcJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfUENJX1BNX0RBVEFfQV9QTV9EQVRBXzJfUFJHCQkgKDB4ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9QQ0lfUE1fREFUQV9BX1BNX0RBVEFfM19QUkcJCSAoMHhmZkw8PDI0KQorCisjZGVmaW5lIEJOWDJfUENJX1BNX0RBVEFfQgkJCQkweDAwMDAwNDE0CisjZGVmaW5lIEJOWDJfUENJX1BNX0RBVEFfQl9QTV9EQVRBXzRfUFJHCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9QTV9EQVRBX0JfUE1fREFUQV81X1BSRwkJICgweGZmTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfUE1fREFUQV9CX1BNX0RBVEFfNl9QUkcJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1BDSV9QTV9EQVRBX0JfUE1fREFUQV83X1BSRwkJICgweGZmTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9QQ0lfU1dBUF9ESUFHMAkJCQkweDAwMDAwNDE4CisjZGVmaW5lIEJOWDJfUENJX1NXQVBfRElBRzEJCQkJMHgwMDAwMDQxYworI2RlZmluZSBCTlgyX1BDSV9FWFBfUk9NX0FERFIJCQkJMHgwMDAwMDQyMAorI2RlZmluZSBCTlgyX1BDSV9FWFBfUk9NX0FERFJfQUREUkVTUwkJCSAoMHgzZmZmZmZMPDwyKQorI2RlZmluZSBCTlgyX1BDSV9FWFBfUk9NX0FERFJfUkVRCQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9QQ0lfRVhQX1JPTV9EQVRBCQkJCTB4MDAwMDA0MjQKKyNkZWZpbmUgQk5YMl9QQ0lfVlBEX0lOVEYJCQkJMHgwMDAwMDQyOAorI2RlZmluZSBCTlgyX1BDSV9WUERfSU5URl9JTlRGX1JFUQkJCSAoMUw8PDApCisKKyNkZWZpbmUgQk5YMl9QQ0lfVlBEX0FERFJfRkxBRwkJCQkweDAwMDAwNDJjCisjZGVmaW5lIEJOWDJfUENJX1ZQRF9BRERSX0ZMQUdfQUREUkVTUwkJCSAoMHgxZmZmPDwyKQorI2RlZmluZSBCTlgyX1BDSV9WUERfQUREUl9GTEFHX1dSCQkJICgxPDwxNSkKKworI2RlZmluZSBCTlgyX1BDSV9WUERfREFUQQkJCQkweDAwMDAwNDMwCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDEJCQkJMHgwMDAwMDQzNAorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUwxX0RFVklDRV9JRAkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMMV9WRU5ET1JfSUQJCQkgKDB4ZmZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDIJCQkJMHgwMDAwMDQzOAorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUwyX1NVQlNZU1RFTV9WRU5ET1JfSUQJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMMl9TVUJTWVNURU1fSUQJCQkgKDB4ZmZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDMJCQkJMHgwMDAwMDQzYworI2RlZmluZSBCTlgyX1BDSV9JRF9WQUwzX0NMQVNTX0NPREUJCQkgKDB4ZmZmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMM19SRVZJU0lPTl9JRAkJCSAoMHhmZkw8PDI0KQorCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDQJCQkJMHgwMDAwMDQ0MAorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X0NBUF9FTkEJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfQ0FQX0VOQV8wCQkJICgwTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9DQVBfRU5BXzEJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X0NBUF9FTkFfMgkJCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfQ0FQX0VOQV8zCQkJICgzTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9DQVBfRU5BXzQJCQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X0NBUF9FTkFfNQkJCSAoNUw8PDApCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfQ0FQX0VOQV82CQkJICg2TDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9DQVBfRU5BXzcJCQkgKDdMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X0NBUF9FTkFfOAkJCSAoOEw8PDApCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfQ0FQX0VOQV85CQkJICg5TDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9DQVBfRU5BXzEwCQkJICgxMEw8PDApCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfQ0FQX0VOQV8xMQkJCSAoMTFMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X0NBUF9FTkFfMTIJCQkgKDEyTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9DQVBfRU5BXzEzCQkJICgxM0w8PDApCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfQ0FQX0VOQV8xNAkJCSAoMTRMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X0NBUF9FTkFfMTUJCQkgKDE1TDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9QTV9TQ0FMRV9QUkcJCQkgKDB4M0w8PDYpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfUE1fU0NBTEVfUFJHXzAJCQkgKDBMPDw2KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X1BNX1NDQUxFX1BSR18xCQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9QTV9TQ0FMRV9QUkdfMgkJCSAoMkw8PDYpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfUE1fU0NBTEVfUFJHXzMJCQkgKDNMPDw2KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01TSV9MSU1JVAkJCSAoMHg3TDw8OSkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NU0lfQURWRVJUSVpFCQkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NU0lfRU5BQkxFCQkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTUFYXzY0X0FEVkVSVElaRQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTUFYXzEzM19BRFZFUlRJWkUJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF9NRU1fUkVBRF9TSVpFCQkgKDB4M0w8PDIxKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF9TUExJVF9TSVpFCQkJICgweDdMPDwyMykKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NQVhfQ1VNVUxBVElWRV9TSVpFCQkgKDB4N0w8PDI2KQorCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDUJCQkJMHgwMDAwMDQ0NAorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X0QxX1NVUFBPUlQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X0QyX1NVUFBPUlQJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X1BNRV9JTl9EMAkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDVfUE1FX0lOX0QxCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNV9QTUVfSU5fRDIJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X1BNRV9JTl9EM19IT1QJCQkgKDFMPDw1KQorCisjZGVmaW5lIEJOWDJfUENJX1BDSVhfRVhURU5ERURfU1RBVFVTCQkJMHgwMDAwMDQ0OAorI2RlZmluZSBCTlgyX1BDSV9QQ0lYX0VYVEVOREVEX1NUQVRVU19OT19TTk9PUAkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9QQ0lfUENJWF9FWFRFTkRFRF9TVEFUVVNfTE9OR19CVVJTVAkgKDFMPDw5KQorI2RlZmluZSBCTlgyX1BDSV9QQ0lYX0VYVEVOREVEX1NUQVRVU19TUExJVF9DT01QX01TR19DTEFTUwkgKDB4Zkw8PDE2KQorI2RlZmluZSBCTlgyX1BDSV9QQ0lYX0VYVEVOREVEX1NUQVRVU19TUExJVF9DT01QX01TR19JRFgJICgweGZmTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNgkJCQkweDAwMDAwNDRjCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDZfTUFYX0xBVAkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDZfTUlOX0dOVAkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDZfQklTVAkJCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX1BDSV9NU0lfREFUQQkJCQkweDAwMDAwNDUwCisjZGVmaW5lIEJOWDJfUENJX01TSV9EQVRBX1BDSV9NU0lfREFUQQkJCSAoMHhmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1BDSV9NU0lfQUREUl9ICQkJCTB4MDAwMDA0NTQKKyNkZWZpbmUgQk5YMl9QQ0lfTVNJX0FERFJfTAkJCQkweDAwMDAwNDU4CisKKworLyoKKyAqICBtaXNjX3JlZyBkZWZpbml0aW9uCisgKiAgb2Zmc2V0OiAweDgwMAorICovCisjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5ECQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfRU5BQkxFX0FMTAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0RJU0FCTEVfQUxMCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfQ09SRV9SRVNFVAkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0hBUkRfUkVTRVQJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9QQVJfRVJST1IJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9QQVJfRVJSX1JBTQkJCSAoMHg3Zkw8PDE2KQorCisjZGVmaW5lIEJOWDJfTUlTQ19DRkcJCQkJCTB4MDAwMDA4MDQKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19QQ0lfR1JDX1RNT1VUCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19OVk1fV1JfRU4JCQkJICgweDNMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX05WTV9XUl9FTl9QUk9URUNUCQkJICgwTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19OVk1fV1JfRU5fUENJCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19OVk1fV1JfRU5fQUxMT1cJCQkgKDJMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX05WTV9XUl9FTl9BTExPVzIJCQkgKDNMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0JJU1RfRU4JCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19DSzI1X09VVF9BTFRfU1JDCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19CWVBBU1NfQlNDQU4JCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0JZUEFTU19FSlRBRwkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfQ0xLX0NUTF9PVkVSUklERQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERQkJCQkgKDB4M0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9NQUMJCQkgKDBMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfR1BIWTEJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfR1BIWTIJCQkgKDJMPDw4KQorCisjZGVmaW5lIEJOWDJfTUlTQ19JRAkJCQkJMHgwMDAwMDgwOAorI2RlZmluZSBCTlgyX01JU0NfSURfQk9ORF9JRAkJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19JRF9DSElQX01FVEFMCQkJCSAoMHhmZkw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19JRF9DSElQX1JFVgkJCQkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfSURfQ0hJUF9OVU0JCQkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTCQkJMHgwMDAwMDgwYworI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1RYX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TVEFUVVNfQklUU19UWF9CRF9SRUFEX0VOQUJMRQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1RYX0JEX0NBQ0hFX0VOQUJMRQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1RYX1BST0NFU1NPUl9FTkFCTEUJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TVEFUVVNfQklUU19UWF9ETUFfRU5BQkxFCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfVFhfUEFUQ0hVUF9FTkFCTEUJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TVEFUVVNfQklUU19UWF9QQVlMT0FEX1FfRU5BQkxFCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfVFhfSEVBREVSX1FfRU5BQkxFCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfVFhfQVNTRU1CTEVSX0VOQUJMRQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX0VNQUNfRU5BQkxFCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfUlhfUEFSU0VSX01BQ19FTkFCTEUJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfUlhfUEFSU0VSX0NBVENIVVBfRU5BQkxFCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1JYX01CVUZfRU5BQkxFCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1JYX0xPT0tVUF9FTkFCTEUJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfUlhfUFJPQ0VTU09SX0VOQUJMRQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TVEFUVVNfQklUU19SWF9WMlBfRU5BQkxFCSAoMUw8PDE1KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1JYX0JEX0NBQ0hFX0VOQUJMRQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TVEFUVVNfQklUU19SWF9ETUFfRU5BQkxFCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX0NPTVBMRVRJT05fRU5BQkxFCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX0hPU1RfQ09BTEVTQ0VfRU5BQkxFCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX01BSUxCT1hfUVVFVUVfRU5BQkxFCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX0NPTlRFWFRfRU5BQkxFCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX0NNRF9TQ0hFRFVMRVJfRU5BQkxFCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX0NNRF9QUk9DRVNTT1JfRU5BQkxFCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX01HTVRfUFJPQ0VTU09SX0VOQUJMRQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TVEFUVVNfQklUU19USU1FUl9FTkFCTEUJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfRE1BX0VOR0lORV9FTkFCTEUJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfVU1QX0VOQUJMRQkJICgxTDw8MjcpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUUwkJCTB4MDAwMDA4MTAKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19UWF9TQ0hFRFVMRVJfRU5BQkxFCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfVFhfQkRfUkVBRF9FTkFCTEUJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19UWF9CRF9DQUNIRV9FTkFCTEUJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19UWF9QUk9DRVNTT1JfRU5BQkxFCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfVFhfRE1BX0VOQUJMRQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19UWF9QQVRDSFVQX0VOQUJMRQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX1RYX1BBWUxPQURfUV9FTkFCTEUJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19UWF9IRUFERVJfUV9FTkFCTEUJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19UWF9BU1NFTUJMRVJfRU5BQkxFCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfRU1BQ19FTkFCTEUJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfUlhfUEFSU0VSX01BQ19FTkFCTEUJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfUlhfUEFSU0VSX0NBVENIVVBfRU5BQkxFCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX1JYX01CVUZfRU5BQkxFCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX1JYX0xPT0tVUF9FTkFCTEUJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfUlhfUFJPQ0VTU09SX0VOQUJMRQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19SWF9WMlBfRU5BQkxFCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19SWF9CRF9DQUNIRV9FTkFCTEUJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfUlhfRE1BX0VOQUJMRQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfQ09NUExFVElPTl9FTkFCTEUJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfSE9TVF9DT0FMRVNDRV9FTkFCTEUJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfTUFJTEJPWF9RVUVVRV9FTkFCTEUJICgxTDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfQ09OVEVYVF9FTkFCTEUJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfQ01EX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfQ01EX1BST0NFU1NPUl9FTkFCTEUJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfTUdNVF9QUk9DRVNTT1JfRU5BQkxFCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX1RJTUVSX0VOQUJMRQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfRE1BX0VOR0lORV9FTkFCTEUJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfVU1QX0VOQUJMRQkJICgxTDw8MjcpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUUwkJCTB4MDAwMDA4MTQKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19UWF9TQ0hFRFVMRVJfRU5BQkxFCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfVFhfQkRfUkVBRF9FTkFCTEUJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19UWF9CRF9DQUNIRV9FTkFCTEUJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19UWF9QUk9DRVNTT1JfRU5BQkxFCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfVFhfRE1BX0VOQUJMRQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19UWF9QQVRDSFVQX0VOQUJMRQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX1RYX1BBWUxPQURfUV9FTkFCTEUJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19UWF9IRUFERVJfUV9FTkFCTEUJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19UWF9BU1NFTUJMRVJfRU5BQkxFCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfRU1BQ19FTkFCTEUJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfUlhfUEFSU0VSX01BQ19FTkFCTEUJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfUlhfUEFSU0VSX0NBVENIVVBfRU5BQkxFCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX1JYX01CVUZfRU5BQkxFCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX1JYX0xPT0tVUF9FTkFCTEUJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfUlhfUFJPQ0VTU09SX0VOQUJMRQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19SWF9WMlBfRU5BQkxFCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19SWF9CRF9DQUNIRV9FTkFCTEUJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfUlhfRE1BX0VOQUJMRQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfQ09NUExFVElPTl9FTkFCTEUJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfSE9TVF9DT0FMRVNDRV9FTkFCTEUJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfTUFJTEJPWF9RVUVVRV9FTkFCTEUJICgxTDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfQ09OVEVYVF9FTkFCTEUJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfQ01EX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfQ01EX1BST0NFU1NPUl9FTkFCTEUJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfTUdNVF9QUk9DRVNTT1JfRU5BQkxFCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX1RJTUVSX0VOQUJMRQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfRE1BX0VOR0lORV9FTkFCTEUJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfVU1QX0VOQUJMRQkJICgxTDw8MjcpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUUwkJCTB4MDAwMDA4MTgKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVQJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF8zMk1IWgkgKDBMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF8zOE1IWgkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF80OE1IWgkgKDJMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF81NU1IWgkgKDNMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF82Nk1IWgkgKDRMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF84ME1IWgkgKDVMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF85NU1IWgkgKDZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9DTEtfU1BEX0RFVF8xMzNNSFoJICg3TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVRfTE9XCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19ESVNBQkxFCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUX1NSQwkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUX1NSQ19VTkRFRgkgKDBMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX0FMVF9TUkNfMTIJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzYJICgyTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzYyCSAoNEw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfUExBWV9ERUFECQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRUQJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRURfMTAwCSAoMEw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF84MAkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRURfNTAJICgyTDw8MTIpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1NQRUVEXzQwCSAoNEw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF8yNQkgKDhMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1RPUAkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfUExMX1NUT1AJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRURfMTgJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfVVNFX1NQRF9ERVQJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRUQJCSAoMHhmZmZMPDwyMCkKKworI2RlZmluZSBCTlgyX01JU0NfR1BJTwkJCQkJMHgwMDAwMDgxYworI2RlZmluZSBCTlgyX01JU0NfR1BJT19WQUxVRQkJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfR1BJT19TRVQJCQkJICgweGZmTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fQ0xSCQkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfR1BJT19GTE9BVAkJCQkgKDB4ZmZMPDwyNCkKKworI2RlZmluZSBCTlgyX01JU0NfR1BJT19JTlQJCQkJMHgwMDAwMDgyMAorI2RlZmluZSBCTlgyX01JU0NfR1BJT19JTlRfSU5UX1NUQVRFCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfR1BJT19JTlRfT0xEX1ZBTFVFCQkJICgweGZMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfR1BJT19JTlRfT0xEX1NFVAkJCSAoMHhmTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19HUElPX0lOVF9PTERfQ0xSCQkJICgweGZMPDwyNCkKKworI2RlZmluZSBCTlgyX01JU0NfQ09ORklHX0xGU1IJCQkJMHgwMDAwMDgyNAorI2RlZmluZSBCTlgyX01JU0NfQ09ORklHX0xGU1JfRElWCQkJICgweGZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUUwkJCTB4MDAwMDA4MjgKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1RYX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1RYX0JEX1JFQURfRU5BQkxFCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19UWF9CRF9DQUNIRV9FTkFCTEUJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1RYX1BST0NFU1NPUl9FTkFCTEUJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1RYX0RNQV9FTkFCTEUJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19UWF9QQVRDSFVQX0VOQUJMRQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfVFhfUEFZTE9BRF9RX0VOQUJMRQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfVFhfSEVBREVSX1FfRU5BQkxFCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19UWF9BU1NFTUJMRVJfRU5BQkxFCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19FTUFDX0VOQUJMRQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1JYX1BBUlNFUl9NQUNfRU5BQkxFCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfUlhfUEFSU0VSX0NBVENIVVBfRU5BQkxFCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfUlhfTUJVRl9FTkFCTEUJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfUlhfTE9PS1VQX0VOQUJMRQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1JYX1BST0NFU1NPUl9FTkFCTEUJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19SWF9WMlBfRU5BQkxFCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1JYX0JEX0NBQ0hFX0VOQUJMRQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1JYX0RNQV9FTkFCTEUJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfQ09NUExFVElPTl9FTkFCTEUJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19IT1NUX0NPQUxFU0NFX0VOQUJMRQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX01BSUxCT1hfUVVFVUVfRU5BQkxFCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfQ09OVEVYVF9FTkFCTEUJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfQ01EX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19DTURfUFJPQ0VTU09SX0VOQUJMRQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX01HTVRfUFJPQ0VTU09SX0VOQUJMRQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1RJTUVSX0VOQUJMRQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19ETUFfRU5HSU5FX0VOQUJMRQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX1VNUF9FTkFCTEUJCSAoMUw8PDI3KQorCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfUkVRMAkJCQkweDAwMDAwODJjCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfUkVRMQkJCQkweDAwMDAwODMwCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfUkVRMgkJCQkweDAwMDAwODM0CisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfUkVRMwkJCQkweDAwMDAwODM4CisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfUkVRNAkJCQkweDAwMDAwODNjCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfRlJFRTAJCQkJMHgwMDAwMDg0MAorI2RlZmluZSBCTlgyX01JU0NfQVJCX0ZSRUUxCQkJCTB4MDAwMDA4NDQKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9GUkVFMgkJCQkweDAwMDAwODQ4CisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfRlJFRTMJCQkJMHgwMDAwMDg0YworI2RlZmluZSBCTlgyX01JU0NfQVJCX0ZSRUU0CQkJCTB4MDAwMDA4NTAKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9SRVFfU1RBVFVTMAkJCTB4MDAwMDA4NTQKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9SRVFfU1RBVFVTMQkJCTB4MDAwMDA4NTgKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9SRVFfU1RBVFVTMgkJCTB4MDAwMDA4NWMKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9SRVFfU1RBVFVTMwkJCTB4MDAwMDA4NjAKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9SRVFfU1RBVFVTNAkJCTB4MDAwMDA4NjQKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQwCQkJCTB4MDAwMDA4NjgKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQwXzAJCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDBfMQkJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMF8yCQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQwXzMJCQkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQwXzQJCQkJICgweDdMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQwXzUJCQkJICgweDdMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQwXzYJCQkJICgweDdMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQwXzcJCQkJICgweDdMPDwyOCkKKworI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDEJCQkJMHgwMDAwMDg2YworI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDFfOAkJCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMV85CQkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQxXzEwCQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQxXzExCQkJCSAoMHg3TDw8MTIpCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMV8xMgkJCQkgKDB4N0w8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDFfMTMJCQkJICgweDdMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQxXzE0CQkJCSAoMHg3TDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMV8xNQkJCQkgKDB4N0w8PDI4KQorCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMgkJCQkweDAwMDAwODcwCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMl8xNgkJCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMl8xNwkJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMl8xOAkJCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMl8xOQkJCQkgKDB4N0w8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDJfMjAJCQkJICgweDdMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQyXzIxCQkJCSAoMHg3TDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UMl8yMgkJCQkgKDB4N0w8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDJfMjMJCQkJICgweDdMPDwyOCkKKworI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDMJCQkJMHgwMDAwMDg3NAorI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDNfMjQJCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDNfMjUJCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDNfMjYJCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDNfMjcJCQkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQzXzI4CQkJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19BUkJfR05UM18yOQkJCQkgKDB4N0w8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDNfMzAJCQkJICgweDdMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQzXzMxCQkJCSAoMHg3TDw8MjgpCisKKyNkZWZpbmUgQk5YMl9NSVNDX1BSQlNfQ09OVFJPTAkJCQkweDAwMDAwODc4CisjZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfRU4JCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfUFJCU19DT05UUk9MX1JTVEIJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfUFJCU19DT05UUk9MX0lOVgkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfRVJSX0NMUgkJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfT1JERVIJCQkgKDB4M0w8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfT1JERVJfN1RICQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUFJCU19DT05UUk9MX09SREVSXzE1VEgJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfT1JERVJfMjNSRAkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BSQlNfQ09OVFJPTF9PUkRFUl8zMVNUCQkgKDNMPDw0KQorCisjZGVmaW5lIEJOWDJfTUlTQ19QUkJTX1NUQVRVUwkJCQkweDAwMDAwODdjCisjZGVmaW5lIEJOWDJfTUlTQ19QUkJTX1NUQVRVU19MT0NLCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BSQlNfU1RBVFVTX1NUS1kJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfUFJCU19TVEFUVVNfRVJST1JTCQkJICgweDNmZmZMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfUFJCU19TVEFUVVNfU1RBVEUJCQkgKDB4Zkw8PDE2KQorCisjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTAkJCTB4MDAwMDA4ODAKKyNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX0FTRl9SU1QJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9UU0NfRU4JCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfV0dfVE8JCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfSEJfVE8JCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfUEFfVE8JCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfUExfVE8JCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfUlRfVE8JCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfU01CX0VWRU5UCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfUkVTCQkJICgweGZMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfU01CX0VOCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9TTUJfQkJfRU4JCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfU01CX05PX0FERFJfRklMVAkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NNQl9BVVRPUkVBRAkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9OSUNfU01CX0FERFIxCQkgKDB4M2ZMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX05JQ19TTUJfQUREUjIJCSAoMHgzZkw8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfRU5fTklDX1NNQl9BRERSXzAJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9TTUJfRUFSTFlfQVRUTgkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9JTgkJCQkweDAwMDAwODg0CisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfSU5fREFUX0lOCQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfSU5fUkRZCQkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfSU5fRE9ORQkJCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfU01CX0lOX0ZJUlNUQllURQkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX0lOX1NUQVRVUwkJCQkgKDB4N0w8PDExKQorI2RlZmluZSBCTlgyX01JU0NfU01CX0lOX1NUQVRVU19PSwkJCSAoMHgwTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfSU5fU1RBVFVTX1BFQwkJCSAoMHgxTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfSU5fU1RBVFVTX09GTE9XCQkJICgweDJMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9JTl9TVEFUVVNfU1RPUAkJCSAoMHgzTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfSU5fU1RBVFVTX1RJTUVPVVQJCQkgKDB4NEw8PDExKQorCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUCQkJCTB4MDAwMDA4ODgKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfREFUX09VVAkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1JEWQkJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TVEFSVAkJCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9MQVNUCQkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9BQ0NfVFlQRQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9FTkJfUEVDCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX0dFVF9SWF9MRU4JCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfU01CX1JFQURfTEVOCQkJICgweDNmTDw8MTQpCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19PSwkJICgwTDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTX0ZJUlNUX05BQ0sJICgxTDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTX1NVQl9OQUNLCSAoOUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19VRkxPVwkJICgyTDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTX1NUT1AJCSAoM0w8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19USU1FT1VUCSAoNEw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19GSVJTVF9MT1NUCSAoNUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19TVUJfTE9TVAkgKDB4ZEw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19CQURBQ0sJCSAoMHg2TDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU0xBVkVNT0RFCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfU01CX09VVF9EQVRfRU4JCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX0RBVF9JTgkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfQ0xLX0VOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfU01CX09VVF9DTEtfSU4JCSAoMUw8PDI4KQorCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfV0FUQ0hET0cJCQkJMHgwMDAwMDg4YworI2RlZmluZSBCTlgyX01JU0NfU01CX1dBVENIRE9HX1dBVENIRE9HCQkJICgweGZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfSEVBUlRCRUFUCQkJCTB4MDAwMDA4OTAKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9IRUFSVEJFQVRfSEVBUlRCRUFUCQkgKDB4ZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9QT0xMX0FTRgkJCQkweDAwMDAwODk0CisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfUE9MTF9BU0ZfUE9MTF9BU0YJCQkgKDB4ZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9QT0xMX0xFR0FDWQkJCTB4MDAwMDA4OTgKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9QT0xMX0xFR0FDWV9QT0xMX0xFR0FDWQkJICgweGZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfUkVUUkFOCQkJCTB4MDAwMDA4OWMKKyNkZWZpbmUgQk5YMl9NSVNDX1NNQl9SRVRSQU5fUkVUUkFOCQkJICgweGZmTDw8MCkKKworI2RlZmluZSBCTlgyX01JU0NfU01CX1RJTUVTVEFNUAkJCQkweDAwMDAwOGEwCisjZGVmaW5lIEJOWDJfTUlTQ19TTUJfVElNRVNUQU1QX1RJTUVTVEFNUAkJICgweGZmZmZmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwCQkJCTB4MDAwMDA4YTQKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DT01fTUlTQ19DVFhDCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NPTV9NSVNDX1JFR0YJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfQ09NX01JU0NfU0NQQUQJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfQ1BfTUlTQ19DVFhDCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NQX01JU0NfUkVHRgkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DUF9NSVNDX1NDUEFECQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NTX01JU0NfVE1FTQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DVFhfTUlTQ19BQ0NNMAkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DVFhfTUlTQ19BQ0NNMQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DVFhfTUlTQ19BQ0NNMgkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DVFhfTUlTQ19BQ0NNMwkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfQ1RYX01JU0NfQUNDTTQJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NUWF9NSVNDX0FDQ001CQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DVFhfTUlTQ19QR1RCTAkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfRE1BRV9NSVNDX0RSMAkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfRE1BRV9NSVNDX0RSMQkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfRE1BRV9NSVNDX0RSMgkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfRE1BRV9NSVNDX0RSMwkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfRE1BRV9NSVNDX0RSNAkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfRE1BRV9NSVNDX0RXMAkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfRE1BRV9NSVNDX0RXMQkJICgxTDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfRE1BRV9NSVNDX0RXMgkJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfSENfTUlTQ19ETUEJCQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9NQ1BfTUlTQ19SRUdGCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9NQ1BfTUlTQ19TQ1BBRAkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfTVFfTUlTQ19DVFgJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SQkRDX01JU0MJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SQlVGX01JU0NfTUIJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JCVUZfTUlTQ19QVFIJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JERV9NSVNDX1JQQwkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfUkRFX01JU0NfUlBNCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SVjJQX01JU0NfQ0IwUkVHUwkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMQkJCQkweDAwMDAwOGE4CisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlYyUF9NSVNDX0NCMVJFR1MJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlYyUF9NSVNDX1AxSVJBTQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9SVjJQX01JU0NfUDJJUkFNCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JYUF9NSVNDX0NUWEMJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlhQX01JU0NfUkVHRgkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9SWFBfTUlTQ19TQ1BBRAkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9SWFBfTUlTQ19SQlVGQwkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9UQkRDX01JU0MJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RETUFfTUlTQwkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVEhCVUZfTUlTQ19NQjAJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVEhCVUZfTUlTQ19NQjEJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RQQVRfTUlTQ19SRUdGCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9UUEFUX01JU0NfU0NQQUQJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RQQlVGX01JU0NfTUIJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RTQ0hfTUlTQ19MUgkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVFhQX01JU0NfQ1RYQwkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVFhQX01JU0NfUkVHRgkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVFhQX01JU0NfU0NQQUQJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1VNUF9NSVNDX0ZJT1JYCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9VTVBfTUlTQ19GSU9UWAkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVU1QX01JU0NfUlgJCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9VTVBfTUlTQ19UWAkJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JETUFRX01JU0MJCQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9DU1FfTUlTQwkJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX0NQUV9NSVNDCQkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfTUNQUV9NSVNDCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlYyUE1RX01JU0MJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9SVjJQUFFfTUlTQwkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JWMlBUUV9NSVNDCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlhQUV9NSVNDCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlhQQ1FfTUlTQwkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JMVVBRX01JU0MJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyCQkJCTB4MDAwMDA4YWMKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMl9DT01RX01JU0MJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX0NPTVhRX01JU0MJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX0NPTVRRX01JU0MJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX1RTQ0hRX01JU0MJCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX1RCRFJRX01JU0MJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX1RYUFFfTUlTQwkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfVERNQVFfTUlTQwkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfVFBBVFFfTUlTQwkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfVEFTUV9NSVNDCQkJICgxTDw8OCkKKworI2RlZmluZSBCTlgyX01JU0NfREVCVUdfVkVDVE9SX1NFTAkJCTB4MDAwMDA4YjAKKyNkZWZpbmUgQk5YMl9NSVNDX0RFQlVHX1ZFQ1RPUl9TRUxfMAkJCSAoMHhmZmZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfREVCVUdfVkVDVE9SX1NFTF8xCQkJICgweGZmZkw8PDEyKQorCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0wJCQkJMHgwMDAwMDhiNAorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMgkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzUJCQkgKDB4Zkw8PDQpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0ZJTkFMX0NMS19DVExfVkFMCQkJMHgwMDAwMDhiOAorI2RlZmluZSBCTlgyX01JU0NfRklOQUxfQ0xLX0NUTF9WQUxfTUlTQ19GSU5BTF9DTEtfQ1RMX1ZBTAkgKDB4M2ZmZmZmZkw8PDYpCisKKyNkZWZpbmUgQk5YMl9NSVNDX1VOVVNFRDAJCQkJMHgwMDAwMDhiYworCisKKy8qCisgKiAgbnZtX3JlZyBkZWZpbml0aW9uCisgKiAgb2Zmc2V0OiAweDY0MDAKKyAqLworI2RlZmluZSBCTlgyX05WTV9DT01NQU5ECQkJCTB4MDAwMDY0MDAKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9SU1QJCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9ET05FCQkJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTlZNX0NPTU1BTkRfRE9JVAkJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX05WTV9DT01NQU5EX1dSCQkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfTlZNX0NPTU1BTkRfRVJBU0UJCQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9GSVJTVAkJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX05WTV9DT01NQU5EX0xBU1QJCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9XUkVOCQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX05WTV9DT01NQU5EX1dSREkJCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTlZNX0NPTU1BTkRfRVdTUgkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9XUlNSCQkJCSAoMUw8PDE5KQorCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVUwkJCQkJMHgwMDAwNjQwNAorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfUElfRlNNX1NUQVRFCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfRUVfRlNNX1NUQVRFCQkJICgweGZMPDw0KQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfRVFfRlNNX1NUQVRFCQkJICgweGZMPDw4KQorCisjZGVmaW5lIEJOWDJfTlZNX1dSSVRFCQkJCQkweDAwMDA2NDA4CisjZGVmaW5lIEJOWDJfTlZNX1dSSVRFX05WTV9XUklURV9WQUxVRQkJCSAoMHhmZmZmZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1dSSVRFX05WTV9XUklURV9WQUxVRV9CSVRfQkFORwkJICgwTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFX0VFQ0xLCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9XUklURV9OVk1fV1JJVEVfVkFMVUVfRUVEQVRBCQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX05WTV9XUklURV9OVk1fV1JJVEVfVkFMVUVfU0NMSwkJICg0TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFX0NTX0IJCSAoOEw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1dSSVRFX05WTV9XUklURV9WQUxVRV9TTwkJICgxNkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1dSSVRFX05WTV9XUklURV9WQUxVRV9TSQkJICgzMkw8PDApCisKKyNkZWZpbmUgQk5YMl9OVk1fQUREUgkJCQkJMHgwMDAwNjQwYworI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFCQkJICgweGZmZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUVfQklUX0JBTkcJCSAoMEw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUVfRUVDTEsJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUVfRUVEQVRBCQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX1NDTEsJCSAoNEw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUVfQ1NfQgkJICg4TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fQUREUl9OVk1fQUREUl9WQUxVRV9TTwkJCSAoMTZMPDwwKQorI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX1NJCQkJICgzMkw8PDApCisKKyNkZWZpbmUgQk5YMl9OVk1fUkVBRAkJCQkJMHgwMDAwNjQxMAorI2RlZmluZSBCTlgyX05WTV9SRUFEX05WTV9SRUFEX1ZBTFVFCQkJICgweGZmZmZmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fUkVBRF9OVk1fUkVBRF9WQUxVRV9CSVRfQkFORwkJICgwTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fUkVBRF9OVk1fUkVBRF9WQUxVRV9FRUNMSwkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fUkVBRF9OVk1fUkVBRF9WQUxVRV9FRURBVEEJCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfU0NMSwkJICg0TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fUkVBRF9OVk1fUkVBRF9WQUxVRV9DU19CCQkgKDhMPDwwKQorI2RlZmluZSBCTlgyX05WTV9SRUFEX05WTV9SRUFEX1ZBTFVFX1NPCQkJICgxNkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfU0kJCQkgKDMyTDw8MCkKKworI2RlZmluZSBCTlgyX05WTV9DRkcxCQkJCQkweDAwMDA2NDE0CisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfRkxBU0hfTU9ERQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfQlVGRkVSX01PREUJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX05WTV9DRkcxX1BBU1NfTU9ERQkJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX05WTV9DRkcxX0JJVEJBTkdfTU9ERQkJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfU1RBVFVTX0JJVAkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHMV9TVEFUVVNfQklUX0ZMQVNIX1JEWQkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHMV9TVEFUVVNfQklUX0JVRkZFUl9SRFkJCSAoN0w8PDQpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfU1BJX0NMS19ESVYJCQkgKDB4Zkw8PDcpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfU0VFX0NMS19ESVYJCQkgKDB4N2ZmTDw8MTEpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfUFJPVEVDVF9NT0RFCQkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfRkxBU0hfU0laRQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX05WTV9DRkcxX0NPTVBBVF9CWVBBU1NTCQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHMgkJCQkJMHgwMDAwNjQxOAorI2RlZmluZSBCTlgyX05WTV9DRkcyX0VSQVNFX0NNRAkJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkcyX0RVTU1ZCQkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzJfU1RBVFVTX0NNRAkJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfTlZNX0NGRzMJCQkJCTB4MDAwMDY0MWMKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHM19CVUZGRVJfUkRfQ01ECQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHM19XUklURV9DTUQJCQkJICgweGZmTDw8OCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHM19CVUZGRVJfV1JJVEVfQ01ECQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzNfUkVBRF9DTUQJCQkJICgweGZmTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9OVk1fU1dfQVJCCQkJCQkweDAwMDA2NDIwCisjZGVmaW5lIEJOWDJfTlZNX1NXX0FSQl9BUkJfUkVRX1NFVDAJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TV19BUkJfQVJCX1JFUV9TRVQxCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9OVk1fU1dfQVJCX0FSQl9SRVFfU0VUMgkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTlZNX1NXX0FSQl9BUkJfUkVRX1NFVDMJCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX05WTV9TV19BUkJfQVJCX1JFUV9DTFIwCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9OVk1fU1dfQVJCX0FSQl9SRVFfQ0xSMQkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfTlZNX1NXX0FSQl9BUkJfUkVRX0NMUjIJCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX05WTV9TV19BUkJfQVJCX1JFUV9DTFIzCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9OVk1fU1dfQVJCX0FSQl9BUkIwCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9OVk1fU1dfQVJCX0FSQl9BUkIxCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9OVk1fU1dfQVJCX0FSQl9BUkIyCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTlZNX1NXX0FSQl9BUkJfQVJCMwkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX05WTV9TV19BUkJfUkVRMAkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9OVk1fU1dfQVJCX1JFUTEJCQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTlZNX1NXX0FSQl9SRVEyCQkJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX05WTV9TV19BUkJfUkVRMwkJCQkgKDFMPDwxNSkKKworI2RlZmluZSBCTlgyX05WTV9BQ0NFU1NfRU5BQkxFCQkJCTB4MDAwMDY0MjQKKyNkZWZpbmUgQk5YMl9OVk1fQUNDRVNTX0VOQUJMRV9FTgkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0FDQ0VTU19FTkFCTEVfV1JfRU4JCQkgKDFMPDwxKQorCisjZGVmaW5lIEJOWDJfTlZNX1dSSVRFMQkJCQkJMHgwMDAwNjQyOAorI2RlZmluZSBCTlgyX05WTV9XUklURTFfV1JFTl9DTUQJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX05WTV9XUklURTFfV1JESV9DTUQJCQkgKDB4ZmZMPDw4KQorI2RlZmluZSBCTlgyX05WTV9XUklURTFfU1JfREFUQQkJCQkgKDB4ZmZMPDwxNikKKworCisKKy8qCisgKiAgZG1hX3JlZyBkZWZpbml0aW9uCisgKiAgb2Zmc2V0OiAweGMwMAorICovCisjZGVmaW5lIEJOWDJfRE1BX0NPTU1BTkQJCQkJMHgwMDAwMGMwMAorI2RlZmluZSBCTlgyX0RNQV9DT01NQU5EX0VOQUJMRQkJCQkgKDFMPDwwKQorCisjZGVmaW5lIEJOWDJfRE1BX1NUQVRVUwkJCQkJMHgwMDAwMGMwNAorI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfUEFSX0VSUk9SX1NUQVRFCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfU1RBVFVTX1JFQURfVFJBTlNGRVJTX1NUQVQJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfUkVBRF9ERUxBWV9QQ0lfQ0xLU19TVEFUCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfQklHX1JFQURfVFJBTlNGRVJTX1NUQVQJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfQklHX1JFQURfREVMQVlfUENJX0NMS1NfU1RBVAkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9ETUFfU1RBVFVTX0JJR19SRUFEX1JFVFJZX0FGVEVSX0RBVEFfU1RBVAkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9ETUFfU1RBVFVTX1dSSVRFX1RSQU5TRkVSU19TVEFUCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9ETUFfU1RBVFVTX1dSSVRFX0RFTEFZX1BDSV9DTEtTX1NUQVQJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfRE1BX1NUQVRVU19CSUdfV1JJVEVfVFJBTlNGRVJTX1NUQVQJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfRE1BX1NUQVRVU19CSUdfV1JJVEVfREVMQVlfUENJX0NMS1NfU1RBVAkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9ETUFfU1RBVFVTX0JJR19XUklURV9SRVRSWV9BRlRFUl9EQVRBX1NUQVQJICgxTDw8MjUpCisKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHCQkJCQkweDAwMDAwYzA4CisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19EQVRBX0JZVEVfU1dBUAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19EQVRBX1dPUkRfU1dBUAkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19DTlRMX0JZVEVfU1dBUAkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19DTlRMX1dPUkRfU1dBUAkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19PTkVfRE1BCQkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19DTlRMX1RXT19ETUEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfQ05UTF9GUEdBX01PREUJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfQ05UTF9QSU5HX1BPTkdfRE1BCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX0NOVExfUENJX0NPTVBfRExZCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX05PX1JDSEFOU19JTl9VU0UJCSAoMHhmTDw8MTIpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19OT19XQ0hBTlNfSU5fVVNFCQkgKDB4Zkw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfUENJX0NMS19DTVBfQklUUwkJICgweDdMPDwyMCkKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX1BDSV9GQVNUX0NMS19DTVAJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfQklHX1NJWkUJCQkgKDB4Zkw8PDI0KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfQklHX1NJWkVfTk9ORQkJCSAoMHgwTDw8MjQpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19CSUdfU0laRV82NAkJCSAoMHgxTDw8MjQpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19CSUdfU0laRV8xMjgJCQkgKDB4Mkw8PDI0KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfQklHX1NJWkVfMjU2CQkJICgweDRMPDwyNCkKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX0JJR19TSVpFXzUxMgkJCSAoMHg4TDw8MjQpCisKKyNkZWZpbmUgQk5YMl9ETUFfQkxBQ0tPVVQJCQkJMHgwMDAwMGMwYworI2RlZmluZSBCTlgyX0RNQV9CTEFDS09VVF9SRF9SRVRSWV9CTEFDS09VVAkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfQkxBQ0tPVVRfMk5EX1JEX1JFVFJZX0JMQUNLT1VUCQkgKDB4ZmZMPDw4KQorI2RlZmluZSBCTlgyX0RNQV9CTEFDS09VVF9XUl9SRVRSWV9CTEFDS09VVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVAkJCQkweDAwMDAwYzMwCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfQ09NUF9DT0RFXzAJCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfUEFSX0VSUl8wCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9DT01QX0NPREVfMQkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9QQVJfRVJSXzEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX0NPTVBfQ09ERV8yCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX1BBUl9FUlJfMgkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX0NPTVBfQ09ERV8zCQkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9QQVJfRVJSXzMJCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9DT01QX0NPREVfNAkJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfUEFSX0VSUl80CQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfQ09NUF9DT0RFXzUJCQkgKDB4N0w8PDIwKQorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX1BBUl9FUlJfNQkJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX0NPTVBfQ09ERV82CQkJICgweDdMPDwyNCkKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9QQVJfRVJSXzYJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9DT01QX0NPREVfNwkJCSAoMHg3TDw8MjgpCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfUEFSX0VSUl83CQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVAkJCQkweDAwMDAwYzM0CisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfQ09NUF9DT0RFXzAJCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfUEFSX0VSUl8wCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9DT01QX0NPREVfMQkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9QQVJfRVJSXzEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX0NPTVBfQ09ERV8yCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX1BBUl9FUlJfMgkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX0NPTVBfQ09ERV8zCQkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9QQVJfRVJSXzMJCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9DT01QX0NPREVfNAkJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfUEFSX0VSUl80CQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfQ09NUF9DT0RFXzUJCQkgKDB4N0w8PDIwKQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX1BBUl9FUlJfNQkJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX0NPTVBfQ09ERV82CQkJICgweDdMPDwyNCkKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9QQVJfRVJSXzYJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9DT01QX0NPREVfNwkJCSAoMHg3TDw8MjgpCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfUEFSX0VSUl83CQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fQVNTSUdOTUVOVAkJCTB4MDAwMDBjMzgKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fQVNTSUdOTUVOVF8wCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzEJCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX0FTU0lHTk1FTlRfMgkJCSAoMHhmTDw8OCkKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fQVNTSUdOTUVOVF8zCQkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fQVNTSUdOTUVOVF80CQkJICgweGZMPDwxNikKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fQVNTSUdOTUVOVF81CQkJICgweGZMPDwyMCkKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fQVNTSUdOTUVOVF82CQkJICgweGZMPDwyNCkKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fQVNTSUdOTUVOVF83CQkJICgweGZMPDwyOCkKKworI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UCQkJMHgwMDAwMGMzYworI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzAJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX0FTU0lHTk1FTlRfMQkJCSAoMHhmTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fQVNTSUdOTUVOVF8yCQkJICgweGZMPDw4KQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzMJCQkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzQJCQkgKDB4Zkw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzUJCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzYJCQkgKDB4Zkw8PDI0KQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzcJCQkgKDB4Zkw8PDI4KQorCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDAJCQkJMHgwMDAwMGM0MAorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzAwX1JDSEFOX1NUQV9IT1NUX0FERFJfTE9XCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8wMQkJCQkweDAwMDAwYzQ0CisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDFfUkNIQU5fU1RBX0hPU1RfQUREUl9ISUdICSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8wMgkJCQkweDAwMDAwYzQ4CisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDJfTEVOR1RICQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzAyX1dPUkRfU1dBUAkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDJfQllURV9TV0FQCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8wMl9QUklPUklUWV9MVkwJCSAoMUw8PDE4KQorCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMTAJCQkJMHgwMDAwMGM0YworI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzExCQkJCTB4MDAwMDBjNTAKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8xMgkJCQkweDAwMDAwYzU0CisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMjAJCQkJMHgwMDAwMGM1OAorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzIxCQkJCTB4MDAwMDBjNWMKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8yMgkJCQkweDAwMDAwYzYwCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMzAJCQkJMHgwMDAwMGM2NAorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzMxCQkJCTB4MDAwMDBjNjgKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8zMgkJCQkweDAwMDAwYzZjCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfNDAJCQkJMHgwMDAwMGM3MAorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzQxCQkJCTB4MDAwMDBjNzQKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF80MgkJCQkweDAwMDAwYzc4CisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfNTAJCQkJMHgwMDAwMGM3YworI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzUxCQkJCTB4MDAwMDBjODAKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF81MgkJCQkweDAwMDAwYzg0CisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfNjAJCQkJMHgwMDAwMGM4OAorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzYxCQkJCTB4MDAwMDBjOGMKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF82MgkJCQkweDAwMDAwYzkwCisjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfNzAJCQkJMHgwMDAwMGM5NAorI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzcxCQkJCTB4MDAwMDBjOTgKKyNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF83MgkJCQkweDAwMDAwYzljCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfMDAJCQkJMHgwMDAwMGNhMAorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUXzAwX1dDSEFOX1NUQV9IT1NUX0FERFJfTE9XCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF8wMQkJCQkweDAwMDAwY2E0CisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfMDFfV0NIQU5fU1RBX0hPU1RfQUREUl9ISUdICSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF8wMgkJCQkweDAwMDAwY2E4CisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfMDJfTEVOR1RICQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUXzAyX1dPUkRfU1dBUAkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfMDJfQllURV9TV0FQCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF8wMl9QUklPUklUWV9MVkwJCSAoMUw8PDE4KQorCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfMTAJCQkJMHgwMDAwMGNhYworI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUXzExCQkJCTB4MDAwMDBjYjAKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF8xMgkJCQkweDAwMDAwY2I0CisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfMjAJCQkJMHgwMDAwMGNiOAorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUXzIxCQkJCTB4MDAwMDBjYmMKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF8yMgkJCQkweDAwMDAwY2MwCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfMzAJCQkJMHgwMDAwMGNjNAorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUXzMxCQkJCTB4MDAwMDBjYzgKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF8zMgkJCQkweDAwMDAwY2NjCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfNDAJCQkJMHgwMDAwMGNkMAorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUXzQxCQkJCTB4MDAwMDBjZDQKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF80MgkJCQkweDAwMDAwY2Q4CisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfNTAJCQkJMHgwMDAwMGNkYworI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUXzUxCQkJCTB4MDAwMDBjZTAKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF81MgkJCQkweDAwMDAwY2U0CisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfNjAJCQkJMHgwMDAwMGNlOAorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUXzYxCQkJCTB4MDAwMDBjZWMKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF82MgkJCQkweDAwMDAwY2YwCisjZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfNzAJCQkJMHgwMDAwMGNmNAorI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUXzcxCQkJCTB4MDAwMDBjZjgKKyNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF83MgkJCQkweDAwMDAwY2ZjCisjZGVmaW5lIEJOWDJfRE1BX0FSQl9TVEFUXzAwCQkJCTB4MDAwMDBkMDAKKyNkZWZpbmUgQk5YMl9ETUFfQVJCX1NUQVRfMDBfTUFTVEVSCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9BUkJfU1RBVF8wMF9NQVNURVJfRU5DCQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX0FSQl9TVEFUXzAwX0NVUl9CSU5NU1RSCQkgKDB4ZmZMPDwyNCkKKworI2RlZmluZSBCTlgyX0RNQV9BUkJfU1RBVF8wMQkJCQkweDAwMDAwZDA0CisjZGVmaW5lIEJOWDJfRE1BX0FSQl9TVEFUXzAxX0xQUl9SUFRSCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9BUkJfU1RBVF8wMV9MUFJfV1BUUgkJCSAoMHhmTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCX1NUQVRfMDFfTFBCX1JQVFIJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfRE1BX0FSQl9TVEFUXzAxX0xQQl9XUFRSCQkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfQVJCX1NUQVRfMDFfSFBSX1JQVFIJCQkgKDB4Zkw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9BUkJfU1RBVF8wMV9IUFJfV1BUUgkJCSAoMHhmTDw8MjApCisjZGVmaW5lIEJOWDJfRE1BX0FSQl9TVEFUXzAxX0hQQl9SUFRSCQkJICgweGZMPDwyNCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCX1NUQVRfMDFfSFBCX1dQVFIJCQkgKDB4Zkw8PDI4KQorCisjZGVmaW5lIEJOWDJfRE1BX0ZVU0VfQ1RSTDBfQ01ECQkJCTB4MDAwMDBmMDAKKyNkZWZpbmUgQk5YMl9ETUFfRlVTRV9DVFJMMF9DTURfUFdSVVBfRE9ORQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfRlVTRV9DVFJMMF9DTURfU0hJRlRfRE9ORQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9ETUFfRlVTRV9DVFJMMF9DTURfU0hJRlQJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0RNQV9GVVNFX0NUUkwwX0NNRF9MT0FECQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9ETUFfRlVTRV9DVFJMMF9DTURfU0VMCQkJICgweGZMPDw4KQorCisjZGVmaW5lIEJOWDJfRE1BX0ZVU0VfQ1RSTDBfREFUQQkJCTB4MDAwMDBmMDQKKyNkZWZpbmUgQk5YMl9ETUFfRlVTRV9DVFJMMV9DTUQJCQkJMHgwMDAwMGYwOAorI2RlZmluZSBCTlgyX0RNQV9GVVNFX0NUUkwxX0NNRF9QV1JVUF9ET05FCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9GVVNFX0NUUkwxX0NNRF9TSElGVF9ET05FCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0RNQV9GVVNFX0NUUkwxX0NNRF9TSElGVAkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfRE1BX0ZVU0VfQ1RSTDFfQ01EX0xPQUQJCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0RNQV9GVVNFX0NUUkwxX0NNRF9TRUwJCQkgKDB4Zkw8PDgpCisKKyNkZWZpbmUgQk5YMl9ETUFfRlVTRV9DVFJMMV9EQVRBCQkJMHgwMDAwMGYwYworI2RlZmluZSBCTlgyX0RNQV9GVVNFX0NUUkwyX0NNRAkJCQkweDAwMDAwZjEwCisjZGVmaW5lIEJOWDJfRE1BX0ZVU0VfQ1RSTDJfQ01EX1BXUlVQX0RPTkUJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRE1BX0ZVU0VfQ1RSTDJfQ01EX1NISUZUX0RPTkUJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfRE1BX0ZVU0VfQ1RSTDJfQ01EX1NISUZUCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9ETUFfRlVTRV9DVFJMMl9DTURfTE9BRAkJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfRE1BX0ZVU0VfQ1RSTDJfQ01EX1NFTAkJCSAoMHhmTDw8OCkKKworI2RlZmluZSBCTlgyX0RNQV9GVVNFX0NUUkwyX0RBVEEJCQkweDAwMDAwZjE0CisKKworLyoKKyAqICBjb250ZXh0X3JlZyBkZWZpbml0aW9uCisgKiAgb2Zmc2V0OiAweDEwMDAKKyAqLworI2RlZmluZSBCTlgyX0NUWF9DT01NQU5ECQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9FTkFCTEVECQkJICgxTDw8MCkKKworI2RlZmluZSBCTlgyX0NUWF9TVEFUVVMJCQkJCTB4MDAwMDEwMDQKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0xPQ0tfV0FJVAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX1NUQVRVU19SRUFEX1NUQVQJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX1dSSVRFX1NUQVQJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0FDQ19TVEFMTF9TVEFUCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfQ1RYX1NUQVRVU19MT0NLX1NUQUxMX1NUQVQJCQkgKDFMPDwxOSkKKworI2RlZmluZSBCTlgyX0NUWF9WSVJUX0FERFIJCQkJMHgwMDAwMTAwOAorI2RlZmluZSBCTlgyX0NUWF9WSVJUX0FERFJfVklSVF9BRERSCQkJICgweDdmZmZMPDw2KQorCisjZGVmaW5lIEJOWDJfQ1RYX1BBR0VfVEJMCQkJCTB4MDAwMDEwMGMKKyNkZWZpbmUgQk5YMl9DVFhfUEFHRV9UQkxfUEFHRV9UQkwJCQkgKDB4M2ZmZkw8PDYpCisKKyNkZWZpbmUgQk5YMl9DVFhfREFUQV9BRFIJCQkJMHgwMDAwMTAxMAorI2RlZmluZSBCTlgyX0NUWF9EQVRBX0FEUl9EQVRBX0FEUgkJCSAoMHg3ZmZmZkw8PDIpCisKKyNkZWZpbmUgQk5YMl9DVFhfREFUQQkJCQkJMHgwMDAwMTAxNAorI2RlZmluZSBCTlgyX0NUWF9MT0NLCQkJCQkweDAwMDAxMDE4CisjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfVFlQRQkJCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfVFlQRV9MT0NLX1RZUEVfVk9JRAkJICgweDBMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfTE9DS19UWVBFX0NPTVBMRVRFCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfVFlQRV9MT0NLX1RZUEVfUFJPVE9DT0wJCSAoMHgxTDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFX0xPQ0tfVFlQRV9UWAkJCSAoMHgyTDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFX0xPQ0tfVFlQRV9USU1FUgkJICgweDRMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX0NJRF9WQUxVRQkJCQkgKDB4M2ZmZkw8PDcpCisjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfR1JBTlRFRAkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9DVFhfTE9DS19NT0RFCQkJCSAoMHg3TDw8MjcpCisjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfTU9ERV9VTkxPQ0sJCQkgKDB4MEw8PDI3KQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX01PREVfSU1NRURJQVRFCQkJICgweDFMPDwyNykKKyNkZWZpbmUgQk5YMl9DVFhfTE9DS19NT0RFX1NVUkUJCQkJICgweDJMPDwyNykKKyNkZWZpbmUgQk5YMl9DVFhfTE9DS19TVEFUVVMJCQkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfUkVRCQkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfQ1RYX0FDQ0VTU19TVEFUVVMJCQkJMHgwMDAwMTA0MAorI2RlZmluZSBCTlgyX0NUWF9BQ0NFU1NfU1RBVFVTX01BU1RFUkVOQ09ERUQJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfQUNDRVNTX1NUQVRVU19BQ0NFU1NNRU1PUllTTQkJICgweDNMPDwxMCkKKyNkZWZpbmUgQk5YMl9DVFhfQUNDRVNTX1NUQVRVU19QQUdFVEFCTEVJTklUU00JCSAoMHgzTDw8MTIpCisjZGVmaW5lIEJOWDJfQ1RYX0FDQ0VTU19TVEFUVVNfQUNDRVNTTUVNT1JZSU5JVFNNCSAoMHgzTDw8MTQpCisjZGVmaW5lIEJOWDJfQ1RYX0FDQ0VTU19TVEFUVVNfUVVBTElGSUVEX1JFUVVFU1QJICgweDdmZkw8PDE3KQorCisjZGVmaW5lIEJOWDJfQ1RYX0RCR19MT0NLX1NUQVRVUwkJCTB4MDAwMDEwNDQKKyNkZWZpbmUgQk5YMl9DVFhfREJHX0xPQ0tfU1RBVFVTX1NNCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0RCR19MT0NLX1NUQVRVU19NQVRDSAkJCSAoMHgzZmZMPDwyMikKKworI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzAJCQkweDAwMDAxMDgwCisjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfMF9DSUQJCQkgKDB4M2ZmZkw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfMF9UWVBFCQkgKDB4M0w8PDE0KQorI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzBfTU9ERQkJICgxTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU18xCQkJMHgwMDAwMTA4NAorI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzIJCQkweDAwMDAxMDg4CisjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfMwkJCTB4MDAwMDEwOGMKKyNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU180CQkJMHgwMDAwMTA5MAorI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzUJCQkweDAwMDAxMDk0CisjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfNgkJCTB4MDAwMDEwOTgKKyNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU183CQkJMHgwMDAwMTA5YworI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzgJCQkweDAwMDAxMGEwCisKKworLyoKKyAqICBlbWFjX3JlZyBkZWZpbml0aW9uCisgKiAgb2Zmc2V0OiAweDE0MDAKKyAqLworI2RlZmluZSBCTlgyX0VNQUNfTU9ERQkJCQkJMHgwMDAwMTQwMAorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9SRVNFVAkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9IQUxGX0RVUExFWAkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1BPUlQJCQkJICgweDNMPDwyKQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9QT1JUX05PTkUJCQkgKDBMPDwyKQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9QT1JUX01JSQkJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9QT1JUX0dNSUkJCQkgKDJMPDwyKQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9QT1JUX01JSV8xMAkJCSAoM0w8PDIpCisjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX01BQ19MT09QCQkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRU1BQ19NT0RFXzI1RwkJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9UQUdHRURfTUFDX0NUTAkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1RYX0JVUlNUCQkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX01BWF9ERUZFUl9EUk9QX0VOQQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9FTUFDX01PREVfRVhUX0xJTktfUE9MCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX0ZPUkNFX0xJTksJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9FTUFDX01PREVfTVBLVAkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9FTUFDX01PREVfTVBLVF9SQ1ZECQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX0FDUElfUkNWRAkJCSAoMUw8PDIwKQorCisjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVMJCQkJMHgwMDAwMTQwNAorI2RlZmluZSBCTlgyX0VNQUNfU1RBVFVTX0xJTksJCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVNfTElOS19DSEFOR0UJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19NSV9DT01QTEVURQkJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX0VNQUNfU1RBVFVTX01JX0lOVAkJCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19BUF9FUlJPUgkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX0VNQUNfU1RBVFVTX1BBUklUWV9FUlJPUl9TVEFURQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkEJCQkJMHgwMDAwMTQwOAorI2RlZmluZSBCTlgyX0VNQUNfQVRURU5USU9OX0VOQV9MSU5LCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX01JX0NPTVBMRVRFCQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkFfTUlfSU5UCQkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX0FQX0VSUk9SCQkgKDFMPDwyNCkKKworI2RlZmluZSBCTlgyX0VNQUNfTEVECQkJCQkweDAwMDAxNDBjCisjZGVmaW5lIEJOWDJfRU1BQ19MRURfT1ZFUlJJREUJCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF8xMDAwTUJfT1ZFUlJJREUJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0VNQUNfTEVEXzEwME1CX09WRVJSSURFCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF8xME1CX09WRVJSSURFCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF9UUkFGRklDX09WRVJSSURFCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF9CTE5LX1RSQUZGSUMJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX0VNQUNfTEVEX1RSQUZGSUMJCQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF8xMDAwTUIJCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF8xMDBNQgkJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX0VNQUNfTEVEXzEwTUIJCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF9UUkFGRklDX1NUQVQJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF9CTE5LX1JBVEUJCQkJICgweGZmZkw8PDE5KQorI2RlZmluZSBCTlgyX0VNQUNfTEVEX0JMTktfUkFURV9FTkEJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX0VNQUNfTUFDX01BVENIMAkJCQkweDAwMDAxNDEwCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxCQkJCTB4MDAwMDE0MTQKKyNkZWZpbmUgQk5YMl9FTUFDX01BQ19NQVRDSDIJCQkJMHgwMDAwMTQxOAorI2RlZmluZSBCTlgyX0VNQUNfTUFDX01BVENIMwkJCQkweDAwMDAxNDFjCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0g0CQkJCTB4MDAwMDE0MjAKKyNkZWZpbmUgQk5YMl9FTUFDX01BQ19NQVRDSDUJCQkJMHgwMDAwMTQyNAorI2RlZmluZSBCTlgyX0VNQUNfTUFDX01BVENINgkJCQkweDAwMDAxNDI4CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0g3CQkJCTB4MDAwMDE0MmMKKyNkZWZpbmUgQk5YMl9FTUFDX01BQ19NQVRDSDgJCQkJMHgwMDAwMTQzMAorI2RlZmluZSBCTlgyX0VNQUNfTUFDX01BVENIOQkJCQkweDAwMDAxNDM0CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxMAkJCQkweDAwMDAxNDM4CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxMQkJCQkweDAwMDAxNDNjCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxMgkJCQkweDAwMDAxNDQwCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxMwkJCQkweDAwMDAxNDQ0CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxNAkJCQkweDAwMDAxNDQ4CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxNQkJCQkweDAwMDAxNDRjCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxNgkJCQkweDAwMDAxNDUwCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxNwkJCQkweDAwMDAxNDU0CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxOAkJCQkweDAwMDAxNDU4CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gxOQkJCQkweDAwMDAxNDVjCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyMAkJCQkweDAwMDAxNDYwCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyMQkJCQkweDAwMDAxNDY0CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyMgkJCQkweDAwMDAxNDY4CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyMwkJCQkweDAwMDAxNDZjCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyNAkJCQkweDAwMDAxNDcwCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyNQkJCQkweDAwMDAxNDc0CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyNgkJCQkweDAwMDAxNDc4CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyNwkJCQkweDAwMDAxNDdjCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyOAkJCQkweDAwMDAxNDgwCisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gyOQkJCQkweDAwMDAxNDg0CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gzMAkJCQkweDAwMDAxNDg4CisjZGVmaW5lIEJOWDJfRU1BQ19NQUNfTUFUQ0gzMQkJCQkweDAwMDAxNDhjCisjZGVmaW5lIEJOWDJfRU1BQ19CQUNLT0ZGX1NFRUQJCQkJMHgwMDAwMTQ5OAorI2RlZmluZSBCTlgyX0VNQUNfQkFDS09GRl9TRUVEX0VNQUNfQkFDS09GRl9TRUVECSAoMHgzZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9NVFVfU0laRQkJCQkweDAwMDAxNDljCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9NVFVfU0laRV9NVFVfU0laRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX01UVV9TSVpFX0pVTUJPX0VOQQkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfRU1BQ19TRVJERVNfQ05UTAkJCQkweDAwMDAxNGE0CisjZGVmaW5lIEJOWDJfRU1BQ19TRVJERVNfQ05UTF9SWFIJCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19TRVJERVNfQ05UTF9SWEcJCQkgKDB4M0w8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19TRVJERVNfQ05UTF9SWENLU0VMCQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9FTUFDX1NFUkRFU19DTlRMX1RYQklBUwkJCSAoMHg3TDw8NykKKyNkZWZpbmUgQk5YMl9FTUFDX1NFUkRFU19DTlRMX0JHTUFYCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfRU1BQ19TRVJERVNfQ05UTF9CR01JTgkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0VNQUNfU0VSREVTX0NOVExfVFhNT0RFCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfRU1BQ19TRVJERVNfQ05UTF9UWEVER0UJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9FTUFDX1NFUkRFU19DTlRMX1NFUkRFU19NT0RFCQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9FTUFDX1NFUkRFU19DTlRMX1BMTFRFU1QJCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9FTUFDX1NFUkRFU19DTlRMX0NERVRfRU4JCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1NFUkRFU19DTlRMX1RCSV9MQksJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9FTUFDX1NFUkRFU19DTlRMX1JFTU9URV9MQksJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0VNQUNfU0VSREVTX0NOVExfUkVWX1BIQVNFCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfRU1BQ19TRVJERVNfQ05UTF9SRUdDVEwxMgkJCSAoMHgzTDw8MjApCisjZGVmaW5lIEJOWDJfRU1BQ19TRVJERVNfQ05UTF9SRUdDVEwyNQkJCSAoMHgzTDw8MjIpCisKKyNkZWZpbmUgQk5YMl9FTUFDX1NFUkRFU19TVEFUVVMJCQkJMHgwMDAwMTRhOAorI2RlZmluZSBCTlgyX0VNQUNfU0VSREVTX1NUQVRVU19SWF9TVEFUCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1NFUkRFU19TVEFUVVNfQ09NTUFfREVUCQkgKDFMPDw4KQorCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU0JCQkJMHgwMDAwMTRhYworI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0RBVEEJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fUkVHX0FERFIJCQkgKDB4MWZMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9QSFlfQUREUgkJCSAoMHgxZkw8PDIxKQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkQJCQkgKDB4M0w8PDI2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkRfVU5ERUZJTkVEXzAJCSAoMEw8PDI2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkRfV1JJVEUJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkRfUkVBRAkJICgyTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORF9VTkRFRklORURfMwkJICgzTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fRkFJTAkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX1NUQVJUX0JVU1kJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9ESVNFWFQJCQkgKDFMPDwzMCkKKworI2RlZmluZSBCTlgyX0VNQUNfTURJT19TVEFUVVMJCQkJMHgwMDAwMTRiMAorI2RlZmluZSBCTlgyX0VNQUNfTURJT19TVEFUVVNfTElOSwkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX1NUQVRVU18xME1CCQkJICgxTDw8MSkKKworI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFCQkJCTB4MDAwMDE0YjQKKyNkZWZpbmUgQk5YMl9FTUFDX01ESU9fTU9ERV9TSE9SVF9QUkVBTUJMRQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9FTUFDX01ESU9fTU9ERV9BVVRPX1BPTEwJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX0JJVF9CQU5HCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9FTUFDX01ESU9fTU9ERV9NRElPCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9FTUFDX01ESU9fTU9ERV9NRElPX09FCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX01PREVfTURDCQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX01ESU5UCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX01PREVfQ0xPQ0tfQ05UCQkJICgweDFmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQVVUT19TVEFUVVMJCQkweDAwMDAxNGI4CisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0FVVE9fU1RBVFVTX0FVVE9fRVJSCQkgKDFMPDwwKQorCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9NT0RFCQkJCTB4MDAwMDE0YmMKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX01PREVfUkVTRVQJCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX01PREVfRVhUX1BBVVNFX0VOCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX01PREVfRkxPV19FTgkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9NT0RFX0JJR19CQUNLT0ZGCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX01PREVfTE9OR19QQVVTRQkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9NT0RFX0xJTktfQVdBUkUJCQkgKDFMPDw3KQorCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUVVMJCQkJMHgwMDAwMTRjMAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVFVTX1hPRkZFRAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUVVNfWE9GRl9TRU5UCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRVU19YT05fU0VOVAkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUVVNfTElOS19VUAkJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUVVNfVU5ERVJSVU4JCQkgKDFMPDw0KQorCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9MRU5HVEhTCQkJCTB4MDAwMDE0YzQKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX0xFTkdUSFNfU0xPVAkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9MRU5HVEhTX0lQRwkJCSAoMHhmTDw8OCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX0xFTkdUSFNfSVBHX0NSUwkJCSAoMHgzTDw8MTIpCisKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX01PREUJCQkJMHgwMDAwMTRjOAorI2RlZmluZSBCTlgyX0VNQUNfUlhfTU9ERV9SRVNFVAkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfUlhfTU9ERV9GTE9XX0VOCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX01PREVfS0VFUF9NQUNfQ09OVFJPTAkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX01PREVfS0VFUF9QQVVTRQkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9NT0RFX0FDQ0VQVF9PVkVSU0laRQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX01PREVfQUNDRVBUX1JVTlRTCQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX01PREVfTExDX0NISwkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9NT0RFX1BST01JU0NVT1VTCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX01PREVfTk9fQ1JDX0NISwkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9NT0RFX0tFRVBfVkxBTl9UQUcJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX01PREVfRklMVF9CUk9BRENBU1QJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0VNQUNfUlhfTU9ERV9TT1JUX01PREUJCQkgKDFMPDwxMikKKworI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVFVTCQkJCTB4MDAwMDE0Y2MKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRVU19GRkVECQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRVU19GRl9SRUNFSVZFRAkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUVVNfTl9SRUNFSVZFRAkJCSAoMUw8PDIpCisKKyNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNIMAkJCTB4MDAwMDE0ZDAKKyNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNIMQkJCTB4MDAwMDE0ZDQKKyNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNIMgkJCTB4MDAwMDE0ZDgKKyNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNIMwkJCTB4MDAwMDE0ZGMKKyNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINAkJCTB4MDAwMDE0ZTAKKyNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINQkJCTB4MDAwMDE0ZTQKKyNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINgkJCTB4MDAwMDE0ZTgKKyNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINwkJCTB4MDAwMDE0ZWMKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfSUZIQ0lOT0NURVRTCQkJMHgwMDAwMTUwMAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9JRkhDSU5CQURPQ1RFVFMJCTB4MDAwMDE1MDQKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU0ZSQUdNRU5UUwkJMHgwMDAwMTUwOAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9JRkhDSU5VQ0FTVFBLVFMJCTB4MDAwMDE1MGMKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfSUZIQ0lOTVVMVElDQVNUUEtUUwkJMHgwMDAwMTUxMAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9JRkhDSU5CUk9BRENBU1RQS1RTCQkweDAwMDAxNTE0CisjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0RPVDNTVEFUU0ZDU0VSUk9SUwkJMHgwMDAwMTUxOAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9ET1QzU1RBVFNBTElHTk1FTlRFUlJPUlMJMHgwMDAwMTUxYworI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9ET1QzU1RBVFNDQVJSSUVSU0VOU0VFUlJPUlMJMHgwMDAwMTUyMAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9YT05QQVVTRUZSQU1FU1JFQ0VJVkVECTB4MDAwMDE1MjQKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfWE9GRlBBVVNFRlJBTUVTUkVDRUlWRUQJMHgwMDAwMTUyOAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9NQUNDT05UUk9MRlJBTUVTUkVDRUlWRUQJMHgwMDAwMTUyYworI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9YT0ZGU1RBVEVFTlRFUkVECQkweDAwMDAxNTMwCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0RPVDNTVEFUU0ZSQU1FU1RPT0xPTkcJMHgwMDAwMTUzNAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9FVEhFUlNUQVRTSkFCQkVSUwkJMHgwMDAwMTUzOAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9FVEhFUlNUQVRTVU5ERVJTSVpFUEtUUwkweDAwMDAxNTNjCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0VUSEVSU1RBVFNQS1RTNjRPQ1RFVFMJMHgwMDAwMTU0MAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9FVEhFUlNUQVRTUEtUUzY1T0NURVRTVE8xMjdPQ1RFVFMJMHgwMDAwMTU0NAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9FVEhFUlNUQVRTUEtUUzEyOE9DVEVUU1RPMjU1T0NURVRTCTB4MDAwMDE1NDgKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFMyNTZPQ1RFVFNUTzUxMU9DVEVUUwkweDAwMDAxNTRjCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0VUSEVSU1RBVFNQS1RTNTEyT0NURVRTVE8xMDIzT0NURVRTCTB4MDAwMDE1NTAKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFMxMDI0T0NURVRTVE8xNTIyT0NURVRTCTB4MDAwMDE1NTQKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFMxNTIzT0NURVRTVE85MDIyT0NURVRTCTB4MDAwMDE1NTgKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMAkJCQkweDAwMDAxNTVjCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzEJCQkJMHgwMDAwMTU2MAorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcxX0xFTkdUSF9ORV9CWVRFX0NPVU5UCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzFfTEVOR1RIX09VVF9SQU5HRQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMV9CQURfQ1JDCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMV9SWF9FUlJPUgkJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzFfQUxJR05fRVJST1IJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzFfTEFTVF9EQVRBCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcxX09ERF9CWVRFX1NUQVJUCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcxX0JZVEVfQ09VTlQJCSAoMHhmZmZmTDw8NykKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMV9TTE9UX1RJTUUJCSAoMHhmZkw8PDIzKQorCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzIJCQkJMHgwMDAwMTU2NAorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcyX1NNX1NUQVRFCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcyX1NNX1NUQVRFX0lETEUJCSAoMHgwTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9TTV9TVEFURV9TRkQJCSAoMHgxTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9TTV9TVEFURV9EQVRBCQkgKDB4Mkw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfU01fU1RBVEVfU0tFRVAJCSAoMHgzTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9TTV9TVEFURV9FWFQJCSAoMHg0TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9TTV9TVEFURV9EUk9QCQkgKDB4NUw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfU01fU1RBVEVfU0RST1AJCSAoMHg2TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9TTV9TVEFURV9GQwkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcyX0lESV9TVEFURQkJICgweGZMPDwzKQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcyX0lESV9TVEFURV9JRExFCQkgKDB4MEw8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfSURJX1NUQVRFX0RBVEEwCQkgKDB4MUw8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfSURJX1NUQVRFX0RBVEExCQkgKDB4Mkw8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfSURJX1NUQVRFX0RBVEEyCQkgKDB4M0w8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfSURJX1NUQVRFX0RBVEEzCQkgKDB4NEw8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfSURJX1NUQVRFX0FCT1JUCQkgKDB4NUw8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfSURJX1NUQVRFX1dBSVQJCSAoMHg2TDw8MykKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9JRElfU1RBVEVfU1RBVFVTCQkgKDB4N0w8PDMpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfSURJX1NUQVRFX0xBU1QJCSAoMHg4TDw8MykKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9CWVRFX0lOCQkJICgweGZmTDw8NykKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9GQUxTRUMJCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9UQUdHRUQJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMl9QQVVTRV9TVEFURQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfUEFVU0VfU1RBVEVfSURMRQkJICgwTDw8MTgpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfUEFVU0VfU1RBVEVfUEFVU0VECSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcyX1NFX0NPVU5URVIJCSAoMHhmTDw8MTkpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzJfUVVBTlRBCQkJICgweDFmTDw8MjMpCisKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMwkJCQkweDAwMDAxNTY4CisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzNfUEFVU0VfQ1RSCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzNfVE1QX1BBVVNFX0NUUgkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0CQkJCTB4MDAwMDE1NmMKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9UWVBFX0ZJRUxECQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURQkJICgweDNmTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9JRExFCQkgKDB4MEw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfVU1BQzIJCSAoMHgxTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9VTUFDMwkJICgweDJMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1VOSQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX01NQUMyCQkgKDB4N0w8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfTU1BQzMJCSAoMHg1TDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9QU0ExCQkgKDB4Nkw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfUFNBMgkJICgweDdMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1BTQTMJCSAoMHg4TDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9NQzIJCSAoMHg5TDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9NQzMJCSAoMHhhTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9NV0FJVDEJICgweGVMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX01XQUlUMgkgKDB4Zkw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfTUNIRUNLCSAoMHgxMEw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfTUMJCSAoMHgxMUw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfQkMyCQkgKDB4MTJMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX0JDMwkJICgweDEzTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9CU0ExCQkgKDB4MTRMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX0JTQTIJCSAoMHgxNUw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfQlNBMwkJICgweDE2TDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9CVFlQRQkJICgweDE3TDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9CQwkJICgweDE4TDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9QVFlQRQkJICgweDE5TDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9DTUQJCSAoMHgxYUw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfTUFDCQkgKDB4MWJMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX0xBVENICQkgKDB4MWNMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1hPRkYJCSAoMHgxZEw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfWE9OCQkgKDB4MWVMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1BBVVNFRAkgKDB4MWZMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX05QQVVTRUQJICgweDIwTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9UVFlQRQkJICgweDIxTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9UVkFMCQkgKDB4MjJMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1VTQTEJCSAoMHgyM0w8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfVVNBMgkJICgweDI0TDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9VU0EzCQkgKDB4MjVMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1VUWVBFCQkgKDB4MjZMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1VUVFlQRQkgKDB4MjdMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1VUVkFMCQkgKDB4MjhMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX01UWVBFCQkgKDB4MjlMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX0RST1AJCSAoMHgyYUw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0RST1BfUEtUCQkJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfU0xPVF9GSUxMRUQJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZBTFNFX0NBUlJJRVIJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0xBU1RfREFUQQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfc2ZkX0ZPVU5ECQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9BRFZBTkNFCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfU1RBUlQJCQkgKDFMPDwyOCkKKworI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc1CQkJCTB4MDAwMDE1NzAKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9QU19JRElTTQkJCSAoMHg3TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9QU19JRElTTV9JRExFCQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc1X1BTX0lESVNNX1dBSVRfRU9GCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzVfUFNfSURJU01fV0FJVF9TVEFUCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzVfUFNfSURJU01fU0VUX0VPRjRGQ1JDCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzVfUFNfSURJU01fU0VUX0VPRjRSREUJICg0TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9QU19JRElTTV9TRVRfRU9GNEFMTAkgKDVMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc1X1BTX0lESVNNXzFXRF9XQUlUX1NUQVQJICg2TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9DQ09ERV9CVUYxCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzVfQ0NPREVfQlVGMV9WRFcJCSAoMHgwTDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9DQ09ERV9CVUYxX1NUQVQJCSAoMHgxTDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9DQ09ERV9CVUYxX0FFT0YJCSAoMHgyTDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9DQ09ERV9CVUYxX05FT0YJCSAoMHgzTDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9DQ09ERV9CVUYxX1NPRgkJICgweDRMPDw0KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc1X0NDT0RFX0JVRjFfU0FFT0YJCSAoMHg2TDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9DQ09ERV9CVUYxX1NORU9GCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzVfRU9GX0RFVEVDVEVECQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc1X0NDT0RFX0JVRjAJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9SUE1fSURJX0ZJRk9fRlVMTAkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9MT0FEX0NDT0RFCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9MT0FEX0RBVEEJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc1X0xPQURfU1RBVAkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzVfQ0xSX1NUQVQJCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9JRElfUlBNX0NDT0RFCQkgKDB4M0w8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc1X0lESV9SUE1fQUNDRVBUCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9GTUxFTgkJCSAoMHhmZmZMPDwyMCkKKworI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzAJCQkJMHgwMDAwMTU4MAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzEJCQkJMHgwMDAwMTU4NAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzIJCQkJMHgwMDAwMTU4OAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzMJCQkJMHgwMDAwMTU4YworI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzQJCQkJMHgwMDAwMTU5MAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzUJCQkJMHgwMDAwMTU5NAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzYJCQkJMHgwMDAwMTU5OAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzcJCQkJMHgwMDAwMTU5YworI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzgJCQkJMHgwMDAwMTVhMAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzkJCQkJMHgwMDAwMTVhNAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzEwCQkJCTB4MDAwMDE1YTgKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfQUMxMQkJCQkweDAwMDAxNWFjCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMTIJCQkJMHgwMDAwMTViMAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzEzCQkJCTB4MDAwMDE1YjQKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfQUMxNAkJCQkweDAwMDAxNWI4CisjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMTUJCQkJMHgwMDAwMTViYworI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzE2CQkJCTB4MDAwMDE1YzAKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfQUMxNwkJCQkweDAwMDAxNWM0CisjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMTgJCQkJMHgwMDAwMTVjOAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzE5CQkJCTB4MDAwMDE1Y2MKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfQUMyMAkJCQkweDAwMDAxNWQwCisjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMjEJCQkJMHgwMDAwMTVkNAorI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzIyCQkJCTB4MDAwMDE1ZDgKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX1NVQ19EQkdfT1ZFUlJVTlZFQwkJMHgwMDAwMTVkYworI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9JRkhDT1VUT0NURVRTCQkJMHgwMDAwMTYwMAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9JRkhDT1VUQkFET0NURVRTCQkweDAwMDAxNjA0CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0VUSEVSU1RBVFNDT0xMSVNJT05TCQkweDAwMDAxNjA4CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX09VVFhPTlNFTlQJCQkweDAwMDAxNjBjCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX09VVFhPRkZTRU5UCQkJMHgwMDAwMTYxMAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9GTE9XQ09OVFJPTERPTkUJCTB4MDAwMDE2MTQKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRE9UM1NUQVRTU0lOR0xFQ09MTElTSU9ORlJBTUVTCTB4MDAwMDE2MTgKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRE9UM1NUQVRTTVVMVElQTEVDT0xMSVNJT05GUkFNRVMJMHgwMDAwMTYxYworI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9ET1QzU1RBVFNERUZFUlJFRFRSQU5TTUlTU0lPTlMJMHgwMDAwMTYyMAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9ET1QzU1RBVFNFWENFU1NJVkVDT0xMSVNJT05TCTB4MDAwMDE2MjQKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRE9UM1NUQVRTTEFURUNPTExJU0lPTlMJMHgwMDAwMTYyOAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9JRkhDT1VUVUNBU1RQS1RTCQkweDAwMDAxNjJjCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0lGSENPVVRNVUxUSUNBU1RQS1RTCQkweDAwMDAxNjMwCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0lGSENPVVRCUk9BRENBU1RQS1RTCQkweDAwMDAxNjM0CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0VUSEVSU1RBVFNQS1RTNjRPQ1RFVFMJMHgwMDAwMTYzOAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUUzY1T0NURVRTVE8xMjdPQ1RFVFMJMHgwMDAwMTYzYworI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUUzEyOE9DVEVUU1RPMjU1T0NURVRTCTB4MDAwMDE2NDAKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRVRIRVJTVEFUU1BLVFMyNTZPQ1RFVFNUTzUxMU9DVEVUUwkweDAwMDAxNjQ0CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0VUSEVSU1RBVFNQS1RTNTEyT0NURVRTVE8xMDIzT0NURVRTCTB4MDAwMDE2NDgKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRVRIRVJTVEFUU1BLVFMxMDI0T0NURVRTVE8xNTIyT0NURVRTCTB4MDAwMDE2NGMKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRVRIRVJTVEFUU1BLVFMxNTIzT0NURVRTVE85MDIyT0NURVRTCTB4MDAwMDE2NTAKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRE9UM1NUQVRTSU5URVJOQUxNQUNUUkFOU01JVEVSUk9SUwkweDAwMDAxNjU0CisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzAJCQkJMHgwMDAwMTY1OAorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUcxCQkJCTB4MDAwMDE2NWMKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9PRElfU1RBVEUJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9PRElfU1RBVEVfSURMRQkJICgweDBMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUcxX09ESV9TVEFURV9TVEFSVDAJCSAoMHgxTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9PRElfU1RBVEVfREFUQTAJCSAoMHg0TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9PRElfU1RBVEVfREFUQTEJCSAoMHg1TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9PRElfU1RBVEVfREFUQTIJCSAoMHg2TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9PRElfU1RBVEVfREFUQTMJCSAoMHg3TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9PRElfU1RBVEVfV0FJVDAJCSAoMHg4TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9PRElfU1RBVEVfV0FJVDEJCSAoMHg5TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9DUlNfRU5BQkxFCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUcxX0JBRF9DUkMJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUcxX1NFX0NPVU5URVIJCSAoMHhmTDw8NikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9TRU5EX1BBVVNFCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9MQVRFX0NPTExJU0lPTgkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzFfTUFYX0RFRkVSCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMV9ERUZFUlJFRAkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUcxX09ORV9CWVRFCQkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzFfSVBHX1RJTUUJCQkgKDB4Zkw8PDE1KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUcxX1NMT1RfVElNRQkJICgweGZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMgkJCQkweDAwMDAxNjYwCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzJfQkFDS19PRkYJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHMl9CWVRFX0NPVU5UCQkgKDB4ZmZmZkw8PDEwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUcyX0NPTF9DT1VOVAkJICgweDFmTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzJfQ09MX0JJVAkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzMJCQkJMHgwMDAwMTY2NAorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX1NNX1NUQVRFCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX1NNX1NUQVRFX0lETEUJCSAoMHgwTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19TTV9TVEFURV9QUkUxCQkgKDB4MUw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzNfU01fU1RBVEVfUFJFMgkJICgweDJMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX1NNX1NUQVRFX1NGRAkJICgweDNMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX1NNX1NUQVRFX0RBVEEJCSAoMHg0TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19TTV9TVEFURV9DUkMxCQkgKDB4NUw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzNfU01fU1RBVEVfQ1JDMgkJICgweDZMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX1NNX1NUQVRFX0VYVAkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX1NNX1NUQVRFX1NUQVRCCQkgKDB4OEw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzNfU01fU1RBVEVfU1RBVEcJCSAoMHg5TDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19TTV9TVEFURV9KQU0JCSAoMHhhTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19TTV9TVEFURV9FSkFNCQkgKDB4Ykw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzNfU01fU1RBVEVfQkpBTQkJICgweGNMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX1NNX1NUQVRFX1NXQUlUCQkgKDB4ZEw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzNfU01fU1RBVEVfQkFDS09GRgkJICgweGVMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX0ZJTFRfU1RBVEUJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19GSUxUX1NUQVRFX0lETEUJCSAoMHgwTDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19GSUxUX1NUQVRFX1dBSVQJCSAoMHgxTDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19GSUxUX1NUQVRFX1VOSQkJICgweDJMPDw0KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX0ZJTFRfU1RBVEVfTUMJCSAoMHgzTDw8NCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19GSUxUX1NUQVRFX0JDMgkJICgweDRMPDw0KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX0ZJTFRfU1RBVEVfQkMzCQkgKDB4NUw8PDQpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzNfRklMVF9TVEFURV9CQwkJICgweDZMPDw0KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUczX0NSU19ET05FCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19YT0ZGCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHM19TRV9DT1VOVEVSCQkgKDB4Zkw8PDkpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzNfUVVBTlRBX0NPVU5URVIJCSAoMHgxZkw8PDEzKQorCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzQJCQkJMHgwMDAwMTY2OAorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX0NPVU5URVIJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURQkJICgweGZMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9JRExFCQkgKDB4MEw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX01DQTEJCSAoMHgyTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfTUNBMgkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9NQ0EzCQkgKDB4Nkw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1NSQzEJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfU1JDMgkJICgweDVMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9TUkMzCQkgKDB4NEw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1RZUEUJCSAoMHhjTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfQ01ECQkgKDB4ZUw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1RJTUUJCSAoMHhhTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfQ1JDMQkJICgweDhMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9DUkMyCQkgKDB4OUw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1dBSVQJCSAoMHhkTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfU1RBVFMwX1ZBTElECQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9BUFBFTkRfQ1JDCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9TTE9UX0ZJTExFRAkJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfTUFYX0RFRkVSCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9TRU5EX0VYVEVORAkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfU0VORF9QQURESU5HCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9FT0ZfTE9DCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfQ09MTElESU5HCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9DT0xfSU4JCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9CVVJTVElORwkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X0FEVkFOQ0UJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9HTwkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMAkJCQkweDAwMDAxNjgwCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMQkJCQkweDAwMDAxNjg0CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMgkJCQkweDAwMDAxNjg4CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMwkJCQkweDAwMDAxNjhjCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDNAkJCQkweDAwMDAxNjkwCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDNQkJCQkweDAwMDAxNjk0CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDNgkJCQkweDAwMDAxNjk4CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDNwkJCQkweDAwMDAxNjljCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDOAkJCQkweDAwMDAxNmEwCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDOQkJCQkweDAwMDAxNmE0CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMTAJCQkJMHgwMDAwMTZhOAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9BQzExCQkJCTB4MDAwMDE2YWMKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfQUMxMgkJCQkweDAwMDAxNmIwCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMTMJCQkJMHgwMDAwMTZiNAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9BQzE0CQkJCTB4MDAwMDE2YjgKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfQUMxNQkJCQkweDAwMDAxNmJjCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMTYJCQkJMHgwMDAwMTZjMAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9BQzE3CQkJCTB4MDAwMDE2YzQKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfQUMxOAkJCQkweDAwMDAxNmM4CisjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMTkJCQkJMHgwMDAwMTZjYworI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9BQzIwCQkJCTB4MDAwMDE2ZDAKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfQUMyMQkJCQkweDAwMDAxNmQ0CisjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19TVUNfREJHX09WRVJSVU5WRUMJCTB4MDAwMDE2ZDgKKworCisvKgorICogIHJwbV9yZWcgZGVmaW5pdGlvbgorICogIG9mZnNldDogMHgxODAwCisgKi8KKyNkZWZpbmUgQk5YMl9SUE1fQ09NTUFORAkJCQkweDAwMDAxODAwCisjZGVmaW5lIEJOWDJfUlBNX0NPTU1BTkRfRU5BQkxFRAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0NPTU1BTkRfT1ZFUlJVTl9BQk9SVAkJCSAoMUw8PDQpCisKKyNkZWZpbmUgQk5YMl9SUE1fU1RBVFVTCQkJCQkweDAwMDAxODA0CisjZGVmaW5lIEJOWDJfUlBNX1NUQVRVU19NQlVGX1dBSVQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9TVEFUVVNfRlJFRV9XQUlUCQkJICgxTDw8MSkKKworI2RlZmluZSBCTlgyX1JQTV9DT05GSUcJCQkJCTB4MDAwMDE4MDgKKyNkZWZpbmUgQk5YMl9SUE1fQ09ORklHX05PX1BTRF9IRFJfQ0tTVU0JCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0NPTkZJR19BQ1BJX0VOQQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfUlBNX0NPTkZJR19BQ1BJX0tFRVAJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1JQTV9DT05GSUdfTVBfS0VFUAkJCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX1JQTV9DT05GSUdfU09SVF9WRUNUX1ZBTAkJCSAoMHhmTDw8NCkKKyNkZWZpbmUgQk5YMl9SUE1fQ09ORklHX0lHTk9SRV9WTEFOCQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9SUE1fVkxBTl9NQVRDSDAJCQkJMHgwMDAwMTgxMAorI2RlZmluZSBCTlgyX1JQTV9WTEFOX01BVENIMF9SUE1fVkxBTl9NVENIMF9WQUxVRQkgKDB4ZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1JQTV9WTEFOX01BVENIMQkJCQkweDAwMDAxODE0CisjZGVmaW5lIEJOWDJfUlBNX1ZMQU5fTUFUQ0gxX1JQTV9WTEFOX01UQ0gxX1ZBTFVFCSAoMHhmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfUlBNX1ZMQU5fTUFUQ0gyCQkJCTB4MDAwMDE4MTgKKyNkZWZpbmUgQk5YMl9SUE1fVkxBTl9NQVRDSDJfUlBNX1ZMQU5fTVRDSDJfVkFMVUUJICgweGZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9SUE1fVkxBTl9NQVRDSDMJCQkJMHgwMDAwMTgxYworI2RlZmluZSBCTlgyX1JQTV9WTEFOX01BVENIM19SUE1fVkxBTl9NVENIM19WQUxVRQkgKDB4ZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIwCQkJCTB4MDAwMDE4MjAKKyNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSMF9QTV9FTgkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSMF9CQ19FTgkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIwX01DX0VOCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfTUNfSFNIX0VOCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfUFJPTV9FTgkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIwX1ZMQU5fRU4JCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIwX1BST01fVkxBTgkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIwX0VOQQkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIxCQkJCTB4MDAwMDE4MjQKKyNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSMV9QTV9FTgkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSMV9CQ19FTgkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIxX01DX0VOCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjFfTUNfSFNIX0VOCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjFfUFJPTV9FTgkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIxX1ZMQU5fRU4JCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIxX1BST01fVkxBTgkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIxX0VOQQkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIyCQkJCTB4MDAwMDE4MjgKKyNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSMl9QTV9FTgkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSMl9CQ19FTgkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIyX01DX0VOCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjJfTUNfSFNIX0VOCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjJfUFJPTV9FTgkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIyX1ZMQU5fRU4JCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIyX1BST01fVkxBTgkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIyX0VOQQkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIzCQkJCTB4MDAwMDE4MmMKKyNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSM19QTV9FTgkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSM19CQ19FTgkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIzX01DX0VOCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjNfTUNfSFNIX0VOCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjNfUFJPTV9FTgkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIzX1ZMQU5fRU4JCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIzX1BST01fVkxBTgkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1JQTV9TT1JUX1VTRVIzX0VOQQkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9TVEFUX0wyX0ZJTFRFUl9ESVNDQVJEUwkJMHgwMDAwMTg0MAorI2RlZmluZSBCTlgyX1JQTV9TVEFUX1JVTEVfQ0hFQ0tFUl9ESVNDQVJEUwkJMHgwMDAwMTg0NAorI2RlZmluZSBCTlgyX1JQTV9TVEFUX0lGSU5GVFFESVNDQVJEUwkJCTB4MDAwMDE4NDgKKyNkZWZpbmUgQk5YMl9SUE1fU1RBVF9JRklOTUJVRkRJU0NBUkQJCQkweDAwMDAxODRjCisjZGVmaW5lIEJOWDJfUlBNX1NUQVRfUlVMRV9DSEVDS0VSX1A0X0hJVAkJMHgwMDAwMTg1MAorI2RlZmluZSBCTlgyX1JQTV9TVEFUX0FDMAkJCQkweDAwMDAxODgwCisjZGVmaW5lIEJOWDJfUlBNX1NUQVRfQUMxCQkJCTB4MDAwMDE4ODQKKyNkZWZpbmUgQk5YMl9SUE1fU1RBVF9BQzIJCQkJMHgwMDAwMTg4OAorI2RlZmluZSBCTlgyX1JQTV9TVEFUX0FDMwkJCQkweDAwMDAxODhjCisjZGVmaW5lIEJOWDJfUlBNX1NUQVRfQUM0CQkJCTB4MDAwMDE4OTAKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wCQkJCTB4MDAwMDE5MDAKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX09GRlNFVAkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9DTEFTUwkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX1BSSU9SSVRZCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9QNAkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0hEUl9UWVBFCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0hEUl9UWVBFX1NUQVJUCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0hEUl9UWVBFX0lQCQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9IRFJfVFlQRV9UQ1AJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0hEUl9UWVBFX1VEUAkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfSERSX1RZUEVfREFUQQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9DT01QCQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9DT01QX0VRVUFMCQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9DT01QX05FUVVBTAkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ09NUF9HUkVBVEVSCQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9DT01QX0xFU1MJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX1NCSVQJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9DTURTRUwJCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfTUFQCQkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfRElTQ0FSRAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfTUFTSwkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX1AxCQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfUDIJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9QMwkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX05CSVQJCQkJICgxTDw8MzApCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18wCQkJMHgwMDAwMTkwNAorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzBfVkFMVUUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMF9NQVNLCQkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEJCQkJMHgwMDAwMTkwOAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xCQkJMHgwMDAwMTkwYworI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzIJCQkJMHgwMDAwMTkxMAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18yCQkJMHgwMDAwMTkxNAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzMJCQkJMHgwMDAwMTkxOAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18zCQkJMHgwMDAwMTkxYworI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzQJCQkJMHgwMDAwMTkyMAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS180CQkJMHgwMDAwMTkyNAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzUJCQkJMHgwMDAwMTkyOAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS181CQkJMHgwMDAwMTkyYworI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzYJCQkJMHgwMDAwMTkzMAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS182CQkJMHgwMDAwMTkzNAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzcJCQkJMHgwMDAwMTkzOAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS183CQkJMHgwMDAwMTkzYworI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzgJCQkJMHgwMDAwMTk0MAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS184CQkJMHgwMDAwMTk0NAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzkJCQkJMHgwMDAwMTk0OAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS185CQkJMHgwMDAwMTk0YworI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwCQkJCTB4MDAwMDE5NTAKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9BCQkJCSAoMHgzZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMAkJCTB4MDAwMDE5NTQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMQkJCQkweDAwMDAxOTU4CisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0IJCQkJICgweGZmZkw8PDE5KQorCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMTEJCQkweDAwMDAxOTVjCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTIJCQkJMHgwMDAwMTk2MAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0EJCQkJICgweDNmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9CCQkJCSAoMHhmZmZMPDwxOSkKKworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzEyCQkJMHgwMDAwMTk2NAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzCQkJCTB4MDAwMDE5NjgKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19BCQkJCSAoMHgzZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQgkJCQkgKDB4ZmZmTDw8MTkpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMwkJCTB4MDAwMDE5NmMKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNAkJCQkweDAwMDAxOTcwCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQQkJCQkgKDB4M2ZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0IJCQkJICgweGZmZkw8PDE5KQorCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMTQJCQkweDAwMDAxOTc0CisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTUJCQkJMHgwMDAwMTk3OAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0EJCQkJICgweDNmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9CCQkJCSAoMHhmZmZMPDwxOSkKKworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzE1CQkJMHgwMDAwMTk3YworI2RlZmluZSBCTlgyX1JQTV9SQ19DT05GSUcJCQkJMHgwMDAwMTk4MAorI2RlZmluZSBCTlgyX1JQTV9SQ19DT05GSUdfUlVMRV9FTkFCTEUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NPTkZJR19ERUZfQ0xBU1MJCQkgKDB4N0w8PDI0KQorCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMAkJCQkJMHgwMDAwMTk4NAorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzBfRk1fQkNOVAkJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMF9UX0RBVEFfT0ZTVF9WTEQJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcwX1RfVURQX09GU1RfVkxECQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMF9UX1RDUF9PRlNUX1ZMRAkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzBfVF9JUF9PRlNUX1ZMRAkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzBfSVBfTU9SRV9GUkdNVAkJCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzBfVF9JUF9OT19UQ1BfVURQX0hEUgkJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMF9MTENfU05BUAkJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzBfRk1fU1RBUlRFRAkJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzBfRE9ORQkJCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcwX1dBSVRfNF9ET05FCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMF9VU0VfVFBCVUZfQ0tTVU0JCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcwX1JYX05PX1BTRF9IRFJfQ0tTVU0JCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzBfSUdOT1JFX1ZMQU4JCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcwX1JQX0VOQV9BQ1RJVkUJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9ERUJVRzEJCQkJCTB4MDAwMDE5ODgKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcxX0ZTTV9DVVJfU1QJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMV9GU01fQ1VSX1NUX0lETEUJCQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzFfRlNNX0NVUl9TVF9FVFlQRV9CNl9BTEwJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMV9GU01fQ1VSX1NUX0VUWVBFX0IyX0lQTExDCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMV9GU01fQ1VSX1NUX0VUWVBFX0I2X0lQCQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzFfRlNNX0NVUl9TVF9FVFlQRV9CMl9JUAkJICg4TDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcxX0ZTTV9DVVJfU1RfSVBfU1RBUlQJCSAoMTZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzFfRlNNX0NVUl9TVF9JUAkJCSAoMzJMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzFfRlNNX0NVUl9TVF9UQ1AJCQkgKDY0TDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcxX0ZTTV9DVVJfU1RfVURQCQkJICgxMjhMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzFfRlNNX0NVUl9TVF9BSAkJCSAoMjU2TDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcxX0ZTTV9DVVJfU1RfRVNQCQkJICg1MTJMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzFfRlNNX0NVUl9TVF9FU1BfUEFZTE9BRAkJICgxMDI0TDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcxX0ZTTV9DVVJfU1RfREFUQQkJCSAoMjA0OEw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMV9GU01fQ1VSX1NUX0FERF9DQVJSWQkJICgweDIwMDBMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzFfRlNNX0NVUl9TVF9BRERfQ0FSUllPVVQJCSAoMHg0MDAwTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcxX0ZTTV9DVVJfU1RfTEFUQ0hfUkVTVUxUCQkgKDB4ODAwMEw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMV9IRFJfQkNOVAkJCSAoMHg3ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcxX1VOS05PV05fRVRZUEVfRAkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzFfVkxBTl9SRU1PVkVEX0QyCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMV9WTEFOX1JFTU9WRURfRDEJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcxX0VPRl8wWFRSQV9XRAkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMgkJCQkJMHgwMDAwMTk4YworI2RlZmluZSBCTlgyX1JQTV9ERUJVRzJfQ01EX0hJVF9WRUMJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMl9JUF9CQ05UCQkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzJfVEhJU19DTURfTTQJCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcyX1RISVNfQ01EX00zCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMl9USElTX0NNRF9NMgkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzJfVEhJU19DTURfTTEJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUcyX0lQSVBFX0VNUFRZCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMl9GTV9ESVNDQVJECQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMl9MQVNUX1JVTEVfSU5fRk1fRDIJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzJfTEFTVF9SVUxFX0lOX0ZNX0QxCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9ERUJVRzMJCQkJCTB4MDAwMDE5OTAKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUczX0FWQUlMX01CVUZfUFRSCQkJICgweDFmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19SREVfUkxVUFFfV1JfUkVRX0lOVAkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUczX1JERV9SQlVGX1dSX0xBU1RfSU5UCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUczX1JERV9SQlVGX1dSX1JFUV9JTlQJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfUkRFX1JCVUZfRlJFRV9SRVEJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfUkRFX1JCVUZfQUxMT0NfUkVRCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUczX0RGU01fTUJVRl9OT1RBVkFJTAkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19SQlVGX1JERV9TT0ZfRFJPUAkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19ERklGT19WTERfRU5UUllfQ1QJCSAoMHhmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19SREVfU1JDX0ZJRk9fQUxNRlVMTAkJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19EUk9QX05YVF9WTEQJCQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUczX0RST1BfTlhUCQkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19GVFFfRlNNCQkJCSAoMHgzTDw8MjQpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19GVFFfRlNNX0lETEUJCQkgKDB4MEw8PDI0KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfRlRRX0ZTTV9XQUlUX0FDSwkJICgweDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUczX0ZUUV9GU01fV0FJVF9GUkVFCQkgKDB4Mkw8PDI0KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfTUJXUklURV9GU00JCQkgKDB4M0w8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfTUJXUklURV9GU01fV0FJVF9TT0YJCSAoMHgwTDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19NQldSSVRFX0ZTTV9HRVRfTUJVRgkJICgweDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUczX01CV1JJVEVfRlNNX0RNQV9EQVRBCQkgKDB4Mkw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfTUJXUklURV9GU01fV0FJVF9EQVRBCQkgKDB4M0w8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfTUJXUklURV9GU01fV0FJVF9FT0YJCSAoMHg0TDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19NQldSSVRFX0ZTTV9XQUlUX01GX0FDSwkJICgweDVMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUczX01CV1JJVEVfRlNNX1dBSVRfRFJPUF9OWFRfVkxECSAoMHg2TDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19NQldSSVRFX0ZTTV9ET05FCQkgKDB4N0w8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfTUJGUkVFX0ZTTQkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfTUJGUkVFX0ZTTV9JRExFCQkJICgwTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19NQkZSRUVfRlNNX1dBSVRfQUNLCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUczX01CQUxMT0NfRlNNCQkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19NQkFMTE9DX0ZTTV9FVF9NQlVGCQkgKDB4MEw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzNfTUJBTExPQ19GU01fSVZFX01CVUYJCSAoMHgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHM19DQ09ERV9FT0ZfRVJST1IJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9ERUJVRzQJCQkJCTB4MDAwMDE5OTQKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc0X0RGU01fTUJVRl9DTFVTVEVSCQkgKDB4MWZmZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHNF9ERklGT19DVVJfQ0NPREUJCQkgKDB4N0w8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzRfTUJXUklURV9GU00JCQkgKDB4N0w8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzRfREZJRk9fRU1QVFkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9ERUJVRzUJCQkJCTB4MDAwMDE5OTgKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc1X1JEUk9QX1dQVFIJCQkgKDB4MWZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzVfUkRST1BfQUNQSV9SUFRSCQkJICgweDFmTDw8NSkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc1X1JEUk9QX01DX1JQVFIJCQkgKDB4MWZMPDwxMCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc1X1JEUk9QX1JDX1JQVFIJCQkgKDB4MWZMPDwxNSkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc1X1JEUk9QX0FDUElfRU1QVFkJCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzVfUkRST1BfTUNfRU1QVFkJCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc1X1JEUk9QX0FFT0ZfVkVDX0FUX1JEUk9QX01DX1JQVFIJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHNV9IT0xEUkVHX1dPTF9EUk9QX0lOVAkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHNV9IT0xEUkVHX0RJU0NBUkQJCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc1X0hPTERSRUdfTUJVRl9OT1RBVkFJTAkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHNV9IT0xEUkVHX01DX0VNUFRZCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc1X0hPTERSRUdfUkNfRU1QVFkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzVfSE9MRFJFR19GQ19FTVBUWQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHNV9IT0xEUkVHX0FDUElfRU1QVFkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzVfSE9MRFJFR19GVUxMX1QJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc1X0hPTERSRUdfUkQJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9ERUJVRzYJCQkJCTB4MDAwMDE5OWMKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc2X0FDUElfVkVDCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzZfVkVDCQkJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc3CQkJCQkweDAwMDAxOWEwCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHN19SUE1fREJHN19MQVNUX0NSQwkJICgweGZmZmZmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1JQTV9ERUJVRzgJCQkJCTB4MDAwMDE5YTQKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc4X1BTX0FDUElfRlNNCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfUFNfQUNQSV9GU01fSURMRQkJICgwTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc4X1BTX0FDUElfRlNNX1NPRl9XMV9BRERSCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfUFNfQUNQSV9GU01fU09GX1cyX0FERFIJCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOF9QU19BQ1BJX0ZTTV9TT0ZfVzNfQUREUgkJICgzTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc4X1BTX0FDUElfRlNNX1NPRl9XQUlUX1RIQlVGCSAoNEw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOF9QU19BQ1BJX0ZTTV9XM19EQVRBCQkgKDVMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfUFNfQUNQSV9GU01fVzBfQUREUgkJICg2TDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc4X1BTX0FDUElfRlNNX1cxX0FERFIJCSAoN0w8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOF9QU19BQ1BJX0ZTTV9XMl9BRERSCQkgKDhMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfUFNfQUNQSV9GU01fVzNfQUREUgkJICg5TDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc4X1BTX0FDUElfRlNNX1dBSVRfVEhCVUYJCSAoMTBMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfQ09NUEFSRV9BVF9XMAkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOF9DT01QQVJFX0FUX1czX0RBVEEJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOF9DT01QQVJFX0FUX1NPRl9XQUlUCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfQ09NUEFSRV9BVF9TT0ZfVzMJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOF9DT01QQVJFX0FUX1NPRl9XMgkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc4X0VPRl9XX0xURVE2X1ZMREJZVEVTCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfRU9GX1dfTFRFUTRfVkxEQllURVMJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfTlhUX0VPRl9XXzEyX1ZMREJZVEVTCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc4X0VPRl9ERVQJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOF9TT0ZfREVUCQkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfV0FJVF80X1NPRgkJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzhfQUxMX0RPTkUJCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc4X1RIQlVGX0FERFIJCQkgKDB4N2ZMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc4X0JZVEVfQ1RSCQkJICgweGZmTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc5CQkJCQkweDAwMDAxOWE4CisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9PVVRGSUZPX0NPVU5UCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfUkRFX0FDUElfUkRZCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc5X1ZMRF9SRF9FTlRSWV9DVAkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc5X09VVEZJRk9fT1ZFUlJVTl9PQ0NVUlJFRAkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc5X0lORklGT19PVkVSUlVOX09DQ1VSUkVECQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fREVCVUc5X0FDUElfTUFUQ0hfSU5UCQkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9BQ1BJX0VOQUJMRV9TWU4JCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzAwCQkJMHgwMDAwMTljMAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzAxCQkJMHgwMDAwMTljNAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzAyCQkJMHgwMDAwMTljOAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzAzCQkJMHgwMDAwMTljYworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzEwCQkJMHgwMDAwMTlkMAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzExCQkJMHgwMDAwMTlkNAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzEyCQkJMHgwMDAwMTlkOAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzEzCQkJMHgwMDAwMTlkYworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzIwCQkJMHgwMDAwMTllMAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzIxCQkJMHgwMDAwMTllNAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzIyCQkJMHgwMDAwMTllOAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzIzCQkJMHgwMDAwMTllYworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMwCQkJMHgwMDAwMTlmMAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMxCQkJMHgwMDAwMTlmNAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMyCQkJMHgwMDAwMTlmOAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMzCQkJMHgwMDAwMTlmYworCisKKy8qCisgKiAgcmJ1Zl9yZWcgZGVmaW5pdGlvbgorICogIG9mZnNldDogMHgyMDAwMDAKKyAqLworI2RlZmluZSBCTlgyX1JCVUZfQ09NTUFORAkJCQkweDAwMjAwMDAwCisjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0VOQUJMRUQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1JCVUZfQ09NTUFORF9GUkVFX0lOSVQJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1JCVUZfQ09NTUFORF9SQU1fSU5JVAkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX09WRVJfRlJFRQkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0FMTE9DX1JFUQkJCSAoMUw8PDUpCisKKyNkZWZpbmUgQk5YMl9SQlVGX1NUQVRVUzEJCQkJMHgwMDIwMDAwNAorI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMV9GUkVFX0NPVU5UCQkJICgweDNmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9SQlVGX1NUQVRVUzIJCQkJMHgwMDIwMDAwOAorI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMl9GUkVFX1RBSUwJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SQlVGX1NUQVRVUzJfRlJFRV9IRUFECQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfUkJVRl9DT05GSUcJCQkJMHgwMDIwMDAwYworI2RlZmluZSBCTlgyX1JCVUZfQ09ORklHX1hPRkZfVFJJUAkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX1JCVUZfQ09ORklHX1hPTl9UUklQCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfUkJVRl9GV19CVUZfQUxMT0MJCQkJMHgwMDIwMDAxMAorI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX0FMTE9DX1ZBTFVFCQkJICgweDFmZkw8PDcpCisKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9GUkVFCQkJCTB4MDAyMDAwMTQKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9GUkVFX0NPVU5UCQkJICgweDdmTDw8MCkKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9GUkVFX1RBSUwJCQkgKDB4MWZmTDw8NykKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9GUkVFX0hFQUQJCQkgKDB4MWZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9TRUwJCQkJMHgwMDIwMDAxOAorI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX1NFTF9DT1VOVAkJCSAoMHg3Zkw8PDApCisjZGVmaW5lIEJOWDJfUkJVRl9GV19CVUZfU0VMX1RBSUwJCQkgKDB4MWZmTDw8NykKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9TRUxfSEVBRAkJCSAoMHgxZmZMPDwxNikKKworI2RlZmluZSBCTlgyX1JCVUZfQ09ORklHMgkJCQkweDAwMjAwMDFjCisjZGVmaW5lIEJOWDJfUkJVRl9DT05GSUcyX01BQ19EUk9QX1RSSVAJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SQlVGX0NPTkZJRzJfTUFDX0tFRVBfVFJJUAkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX1JCVUZfQ09ORklHMwkJCQkweDAwMjAwMDIwCisjZGVmaW5lIEJOWDJfUkJVRl9DT05GSUczX0NVX0RST1BfVFJJUAkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX1JCVUZfQ09ORklHM19DVV9LRUVQX1RSSVAJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SQlVGX1BLVF9EQVRBCQkJCTB4MDAyMDgwMDAKKyNkZWZpbmUgQk5YMl9SQlVGX0NMSVNUX0RBVEEJCQkJMHgwMDIxMDAwMAorI2RlZmluZSBCTlgyX1JCVUZfQlVGX0RBVEEJCQkJMHgwMDIyMDAwMAorCisKKy8qCisgKiAgcnYycF9yZWcgZGVmaW5pdGlvbgorICogIG9mZnNldDogMHgyODAwCisgKi8KKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkQJCQkJMHgwMDAwMjgwMAorI2RlZmluZSBCTlgyX1JWMlBfQ09NTUFORF9FTkFCTEVECQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfUFJPQzFfSU5UUlBUCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfUFJPQzJfSU5UUlBUCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfQUJPUlQwCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfQUJPUlQxCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfQUJPUlQyCQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfQUJPUlQzCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfQUJPUlQ0CQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfQUJPUlQ1CQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfUFJPQzFfUkVTRVQJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfUFJPQzJfUkVTRVQJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTU1BTkRfQ1RYSUZfUkVTRVQJCQkgKDFMPDwxOCkKKworI2RlZmluZSBCTlgyX1JWMlBfU1RBVFVTCQkJCTB4MDAwMDI4MDQKKyNkZWZpbmUgQk5YMl9SVjJQX1NUQVRVU19BTFdBWVNfMAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfUlYyUF9TVEFUVVNfUlYyUF9HRU5fU1RBVDBfQ05UCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX1JWMlBfU1RBVFVTX1JWMlBfR0VOX1NUQVQxX0NOVAkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9SVjJQX1NUQVRVU19SVjJQX0dFTl9TVEFUMl9DTlQJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1JWMlBfU1RBVFVTX1JWMlBfR0VOX1NUQVQzX0NOVAkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlYyUF9TVEFUVVNfUlYyUF9HRU5fU1RBVDRfQ05UCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SVjJQX1NUQVRVU19SVjJQX0dFTl9TVEFUNV9DTlQJCSAoMUw8PDEzKQorCisjZGVmaW5lIEJOWDJfUlYyUF9DT05GSUcJCQkJMHgwMDAwMjgwOAorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1NUQUxMX1BST0MxCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19TVEFMTF9QUk9DMgkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfUlYyUF9DT05GSUdfUFJPQzFfU1RBTExfT05fQUJPUlQwCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BST0MxX1NUQUxMX09OX0FCT1JUMQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QUk9DMV9TVEFMTF9PTl9BQk9SVDIJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BST0MxX1NUQUxMX09OX0FCT1JUMwkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlYyUF9DT05GSUdfUFJPQzFfU1RBTExfT05fQUJPUlQ0CQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QUk9DMV9TVEFMTF9PTl9BQk9SVDUJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BST0MyX1NUQUxMX09OX0FCT1JUMAkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUlYyUF9DT05GSUdfUFJPQzJfU1RBTExfT05fQUJPUlQxCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QUk9DMl9TVEFMTF9PTl9BQk9SVDIJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BST0MyX1NUQUxMX09OX0FCT1JUMwkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlYyUF9DT05GSUdfUFJPQzJfU1RBTExfT05fQUJPUlQ0CQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QUk9DMl9TVEFMTF9PTl9BQk9SVDUJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BBR0VfU0laRQkJCSAoMHhmTDw8MjQpCisjZGVmaW5lIEJOWDJfUlYyUF9DT05GSUdfUEFHRV9TSVpFXzI1NgkJCSAoMEw8PDI0KQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BBR0VfU0laRV81MTIJCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QQUdFX1NJWkVfMUsJCQkgKDJMPDwyNCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QQUdFX1NJWkVfMksJCQkgKDNMPDwyNCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QQUdFX1NJWkVfNEsJCQkgKDRMPDwyNCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QQUdFX1NJWkVfOEsJCQkgKDVMPDwyNCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QQUdFX1NJWkVfMTZLCQkJICg2TDw8MjQpCisjZGVmaW5lIEJOWDJfUlYyUF9DT05GSUdfUEFHRV9TSVpFXzMySwkJCSAoN0w8PDI0KQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BBR0VfU0laRV82NEsJCQkgKDhMPDwyNCkKKyNkZWZpbmUgQk5YMl9SVjJQX0NPTkZJR19QQUdFX1NJWkVfMTI4SwkJCSAoOUw8PDI0KQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BBR0VfU0laRV8yNTZLCQkJICgxMEw8PDI0KQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BBR0VfU0laRV81MTJLCQkJICgxMUw8PDI0KQorI2RlZmluZSBCTlgyX1JWMlBfQ09ORklHX1BBR0VfU0laRV8xTQkJCSAoMTJMPDwyNCkKKworI2RlZmluZSBCTlgyX1JWMlBfR0VOX0JGUl9BRERSXzAJCQkweDAwMDAyODEwCisjZGVmaW5lIEJOWDJfUlYyUF9HRU5fQkZSX0FERFJfMF9WQUxVRQkJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SVjJQX0dFTl9CRlJfQUREUl8xCQkJMHgwMDAwMjgxNAorI2RlZmluZSBCTlgyX1JWMlBfR0VOX0JGUl9BRERSXzFfVkFMVUUJCQkgKDB4ZmZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfUlYyUF9HRU5fQkZSX0FERFJfMgkJCTB4MDAwMDI4MTgKKyNkZWZpbmUgQk5YMl9SVjJQX0dFTl9CRlJfQUREUl8yX1ZBTFVFCQkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX1JWMlBfR0VOX0JGUl9BRERSXzMJCQkweDAwMDAyODFjCisjZGVmaW5lIEJOWDJfUlYyUF9HRU5fQkZSX0FERFJfM19WQUxVRQkJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SVjJQX0lOU1RSX0hJR0gJCQkJMHgwMDAwMjgzMAorI2RlZmluZSBCTlgyX1JWMlBfSU5TVFJfSElHSF9ISUdICQkJICgweDFmTDw8MCkKKworI2RlZmluZSBCTlgyX1JWMlBfSU5TVFJfTE9XCQkJCTB4MDAwMDI4MzQKKyNkZWZpbmUgQk5YMl9SVjJQX1BST0MxX0FERFJfQ01ECQkJMHgwMDAwMjgzOAorI2RlZmluZSBCTlgyX1JWMlBfUFJPQzFfQUREUl9DTURfQURECQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfUlYyUF9QUk9DMV9BRERSX0NNRF9SRFdSCQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9SVjJQX1BST0MyX0FERFJfQ01ECQkJMHgwMDAwMjgzYworI2RlZmluZSBCTlgyX1JWMlBfUFJPQzJfQUREUl9DTURfQURECQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfUlYyUF9QUk9DMl9BRERSX0NNRF9SRFdSCQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9SVjJQX1BST0MxX0dSQ19ERUJVRwkJCTB4MDAwMDI4NDAKKyNkZWZpbmUgQk5YMl9SVjJQX1BST0MyX0dSQ19ERUJVRwkJCTB4MDAwMDI4NDQKKyNkZWZpbmUgQk5YMl9SVjJQX0dSQ19QUk9DX0RFQlVHCQkJMHgwMDAwMjg0OAorI2RlZmluZSBCTlgyX1JWMlBfREVCVUdfVkVDVF9QRUVLCQkJMHgwMDAwMjg0YworI2RlZmluZSBCTlgyX1JWMlBfREVCVUdfVkVDVF9QRUVLXzFfVkFMVUUJCSAoMHg3ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JWMlBfREVCVUdfVkVDVF9QRUVLXzFfUEVFS19FTgkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlYyUF9ERUJVR19WRUNUX1BFRUtfMV9TRUwJCQkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX1JWMlBfREVCVUdfVkVDVF9QRUVLXzJfVkFMVUUJCSAoMHg3ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SVjJQX0RFQlVHX1ZFQ1RfUEVFS18yX1BFRUtfRU4JCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JWMlBfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkJICgweGZMPDwyOCkKKworI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9EQVRBCQkJCTB4MDAwMDJiNDAKKyNkZWZpbmUgQk5YMl9SVjJQX1BGVFFfQ01ECQkJCTB4MDAwMDJiNzgKKyNkZWZpbmUgQk5YMl9SVjJQX1BGVFFfQ01EX09GRlNFVAkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NNRF9XUl9UT1BfMAkJCSAoMEw8PDEwKQorI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9DTURfV1JfVE9QXzEJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9SVjJQX1BGVFFfQ01EX1NGVF9SRVNFVAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9DTURfUkRfREFUQQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9DTURfQUREX0lOVEVSVkVOCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NNRF9BRERfREFUQQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9DTURfSU5URVJWRU5FX0NMUgkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NNRF9QT1AJCQkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NNRF9CVVNZCQkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NUTAkJCQkweDAwMDAyYjdjCisjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NUTF9JTlRFUlZFTkUJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9DVExfT1ZFUkZMT1cJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9DVExfRk9SQ0VfSU5URVJWRU5FCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9DVExfTUFYX0RFUFRICQkJICgweDNmZkw8PDEyKQorI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9DVExfQ1VSX0RFUFRICQkJICgweDNmZkw8PDIyKQorCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0RBVEEJCQkJMHgwMDAwMmI4MAorI2RlZmluZSBCTlgyX1JWMlBfVEZUUV9DTUQJCQkJMHgwMDAwMmJiOAorI2RlZmluZSBCTlgyX1JWMlBfVEZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NNRF9XUl9UT1AJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ01EX1dSX1RPUF8wCQkJICgwTDw8MTApCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NNRF9XUl9UT1BfMQkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1JWMlBfVEZUUV9DTURfU0ZUX1JFU0VUCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NNRF9SRF9EQVRBCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NNRF9BRERfSU5URVJWRU4JCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ01EX0FERF9EQVRBCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NNRF9JTlRFUlZFTkVfQ0xSCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ01EX1BPUAkJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ01EX0JVU1kJCQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ1RMCQkJCTB4MDAwMDJiYmMKKyNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ1RMX0lOVEVSVkVORQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NUTF9PVkVSRkxPVwkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NUTF9GT1JDRV9JTlRFUlZFTkUJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NUTF9NQVhfREVQVEgJCQkgKDB4M2ZmTDw8MTIpCisjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NUTF9DVVJfREVQVEgJCQkgKDB4M2ZmTDw8MjIpCisKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfREFUQQkJCQkweDAwMDAyYmMwCisjZGVmaW5lIEJOWDJfUlYyUF9NRlRRX0NNRAkJCQkweDAwMDAyYmY4CisjZGVmaW5lIEJOWDJfUlYyUF9NRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1JWMlBfTUZUUV9DTURfV1JfVE9QXzAJCQkgKDBMPDwxMCkKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ01EX1dSX1RPUF8xCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfUlYyUF9NRlRRX0NNRF9TRlRfUkVTRVQJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ01EX1JEX0RBVEEJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ01EX0FERF9JTlRFUlZFTgkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JWMlBfTUZUUV9DTURfQUREX0RBVEEJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ01EX0lOVEVSVkVORV9DTFIJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JWMlBfTUZUUV9DTURfUE9QCQkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JWMlBfTUZUUV9DTURfQlVTWQkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JWMlBfTUZUUV9DVEwJCQkJMHgwMDAwMmJmYworI2RlZmluZSBCTlgyX1JWMlBfTUZUUV9DVExfSU5URVJWRU5FCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ1RMX09WRVJGTE9XCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ1RMX0ZPUkNFX0lOVEVSVkVORQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ1RMX01BWF9ERVBUSAkJCSAoMHgzZmZMPDwxMikKKyNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKKworCisKKy8qCisgKiAgbXFfcmVnIGRlZmluaXRpb24KKyAqICBvZmZzZXQ6IDB4M2MwMAorICovCisjZGVmaW5lIEJOWDJfTVFfQ09NTUFORAkJCQkJMHgwMDAwM2MwMAorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfRU5BQkxFRAkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfT1ZFUkZMT1cJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfV1JfRVJST1IJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfUkRfRVJST1IJCQkgKDFMPDw2KQorCisjZGVmaW5lIEJOWDJfTVFfU1RBVFVTCQkJCQkweDAwMDAzYzA0CisjZGVmaW5lIEJOWDJfTVFfU1RBVFVTX0NUWF9BQ0NFU1NfU1RBVAkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX01RX1NUQVRVU19DVFhfQUNDRVNTNjRfU1RBVAkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTVFfU1RBVFVTX1BDSV9TVEFMTF9TVEFUCQkJICgxTDw8MTgpCisKKyNkZWZpbmUgQk5YMl9NUV9DT05GSUcJCQkJCTB4MDAwMDNjMDgKKyNkZWZpbmUgQk5YMl9NUV9DT05GSUdfVFhfSElHSF9QUkkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01RX0NPTkZJR19IQUxUX0RJUwkJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01RX0NPTkZJR19LTkxfQllQX0JMS19TSVpFCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX01RX0NPTkZJR19LTkxfQllQX0JMS19TSVpFXzI1NgkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9NUV9DT05GSUdfS05MX0JZUF9CTEtfU0laRV81MTIJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0tOTF9CWVBfQkxLX1NJWkVfMUsJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0tOTF9CWVBfQkxLX1NJWkVfMksJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0tOTF9CWVBfQkxLX1NJWkVfNEsJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfTVFfQ09ORklHX01BWF9ERVBUSAkJCSAoMHg3Zkw8PDgpCisjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0NVUl9ERVBUSAkJCSAoMHg3Zkw8PDIwKQorCisjZGVmaW5lIEJOWDJfTVFfRU5RVUVVRTEJCQkJMHgwMDAwM2MwYworI2RlZmluZSBCTlgyX01RX0VOUVVFVUUxX09GRlNFVAkJCQkgKDB4M2ZMPDwyKQorI2RlZmluZSBCTlgyX01RX0VOUVVFVUUxX0NJRAkJCQkgKDB4M2ZmZkw8PDgpCisjZGVmaW5lIEJOWDJfTVFfRU5RVUVVRTFfQllURV9NQVNLCQkJICgweGZMPDwyNCkKKyNkZWZpbmUgQk5YMl9NUV9FTlFVRVVFMV9LTkxfTU9ERQkJCSAoMUw8PDI4KQorCisjZGVmaW5lIEJOWDJfTVFfRU5RVUVVRTIJCQkJMHgwMDAwM2MxMAorI2RlZmluZSBCTlgyX01RX0JBRF9XUl9BRERSCQkJCTB4MDAwMDNjMTQKKyNkZWZpbmUgQk5YMl9NUV9CQURfUkRfQUREUgkJCQkweDAwMDAzYzE4CisjZGVmaW5lIEJOWDJfTVFfS05MX0JZUF9XSU5EX1NUQVJUCQkJMHgwMDAwM2MxYworI2RlZmluZSBCTlgyX01RX0tOTF9CWVBfV0lORF9TVEFSVF9WQUxVRQkJICgweGZmZmZmTDw8MTIpCisKKyNkZWZpbmUgQk5YMl9NUV9LTkxfV0lORF9FTkQJCQkJMHgwMDAwM2MyMAorI2RlZmluZSBCTlgyX01RX0tOTF9XSU5EX0VORF9WQUxVRQkJCSAoMHhmZmZmZmZMPDw4KQorCisjZGVmaW5lIEJOWDJfTVFfS05MX1dSSVRFX01BU0sxCQkJCTB4MDAwMDNjMjQKKyNkZWZpbmUgQk5YMl9NUV9LTkxfVFhfTUFTSzEJCQkJMHgwMDAwM2MyOAorI2RlZmluZSBCTlgyX01RX0tOTF9DTURfTUFTSzEJCQkJMHgwMDAwM2MyYworI2RlZmluZSBCTlgyX01RX0tOTF9DT05EX0VOUVVFVUVfTUFTSzEJCQkweDAwMDAzYzMwCisjZGVmaW5lIEJOWDJfTVFfS05MX1JYX1YyUF9NQVNLMQkJCTB4MDAwMDNjMzQKKyNkZWZpbmUgQk5YMl9NUV9LTkxfV1JJVEVfTUFTSzIJCQkJMHgwMDAwM2MzOAorI2RlZmluZSBCTlgyX01RX0tOTF9UWF9NQVNLMgkJCQkweDAwMDAzYzNjCisjZGVmaW5lIEJOWDJfTVFfS05MX0NNRF9NQVNLMgkJCQkweDAwMDAzYzQwCisjZGVmaW5lIEJOWDJfTVFfS05MX0NPTkRfRU5RVUVVRV9NQVNLMgkJCTB4MDAwMDNjNDQKKyNkZWZpbmUgQk5YMl9NUV9LTkxfUlhfVjJQX01BU0syCQkJMHgwMDAwM2M0OAorI2RlZmluZSBCTlgyX01RX0tOTF9CWVBfV1JJVEVfTUFTSzEJCQkweDAwMDAzYzRjCisjZGVmaW5lIEJOWDJfTVFfS05MX0JZUF9UWF9NQVNLMQkJCTB4MDAwMDNjNTAKKyNkZWZpbmUgQk5YMl9NUV9LTkxfQllQX0NNRF9NQVNLMQkJCTB4MDAwMDNjNTQKKyNkZWZpbmUgQk5YMl9NUV9LTkxfQllQX0NPTkRfRU5RVUVVRV9NQVNLMQkJMHgwMDAwM2M1OAorI2RlZmluZSBCTlgyX01RX0tOTF9CWVBfUlhfVjJQX01BU0sxCQkJMHgwMDAwM2M1YworI2RlZmluZSBCTlgyX01RX0tOTF9CWVBfV1JJVEVfTUFTSzIJCQkweDAwMDAzYzYwCisjZGVmaW5lIEJOWDJfTVFfS05MX0JZUF9UWF9NQVNLMgkJCTB4MDAwMDNjNjQKKyNkZWZpbmUgQk5YMl9NUV9LTkxfQllQX0NNRF9NQVNLMgkJCTB4MDAwMDNjNjgKKyNkZWZpbmUgQk5YMl9NUV9LTkxfQllQX0NPTkRfRU5RVUVVRV9NQVNLMgkJMHgwMDAwM2M2YworI2RlZmluZSBCTlgyX01RX0tOTF9CWVBfUlhfVjJQX01BU0syCQkJMHgwMDAwM2M3MAorI2RlZmluZSBCTlgyX01RX01FTV9XUl9BRERSCQkJCTB4MDAwMDNjNzQKKyNkZWZpbmUgQk5YMl9NUV9NRU1fV1JfQUREUl9WQUxVRQkJCSAoMHgzZkw8PDApCisKKyNkZWZpbmUgQk5YMl9NUV9NRU1fV1JfREFUQTAJCQkJMHgwMDAwM2M3OAorI2RlZmluZSBCTlgyX01RX01FTV9XUl9EQVRBMF9WQUxVRQkJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9NUV9NRU1fV1JfREFUQTEJCQkJMHgwMDAwM2M3YworI2RlZmluZSBCTlgyX01RX01FTV9XUl9EQVRBMV9WQUxVRQkJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9NUV9NRU1fV1JfREFUQTIJCQkJMHgwMDAwM2M4MAorI2RlZmluZSBCTlgyX01RX01FTV9XUl9EQVRBMl9WQUxVRQkJCSAoMHgzZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9NUV9NRU1fUkRfQUREUgkJCQkweDAwMDAzYzg0CisjZGVmaW5lIEJOWDJfTVFfTUVNX1JEX0FERFJfVkFMVUUJCQkgKDB4M2ZMPDwwKQorCisjZGVmaW5lIEJOWDJfTVFfTUVNX1JEX0RBVEEwCQkJCTB4MDAwMDNjODgKKyNkZWZpbmUgQk5YMl9NUV9NRU1fUkRfREFUQTBfVkFMVUUJCQkgKDB4ZmZmZmZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfTVFfTUVNX1JEX0RBVEExCQkJCTB4MDAwMDNjOGMKKyNkZWZpbmUgQk5YMl9NUV9NRU1fUkRfREFUQTFfVkFMVUUJCQkgKDB4ZmZmZmZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfTVFfTUVNX1JEX0RBVEEyCQkJCTB4MDAwMDNjOTAKKyNkZWZpbmUgQk5YMl9NUV9NRU1fUkRfREFUQTJfVkFMVUUJCQkgKDB4M2ZmZmZmZmZMPDwwKQorCisKKworLyoKKyAqICB0YmRyX3JlZyBkZWZpbml0aW9uCisgKiAgb2Zmc2V0OiAweDUwMDAKKyAqLworI2RlZmluZSBCTlgyX1RCRFJfQ09NTUFORAkJCQkweDAwMDA1MDAwCisjZGVmaW5lIEJOWDJfVEJEUl9DT01NQU5EX0VOQUJMRQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfVEJEUl9DT01NQU5EX1NPRlRfUlNUCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9UQkRSX0NPTU1BTkRfTVNUUl9BQk9SVAkJCSAoMUw8PDQpCisKKyNkZWZpbmUgQk5YMl9UQkRSX1NUQVRVUwkJCQkweDAwMDA1MDA0CisjZGVmaW5lIEJOWDJfVEJEUl9TVEFUVVNfRE1BX1dBSVQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1RCRFJfU1RBVFVTX0ZUUV9XQUlUCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9UQkRSX1NUQVRVU19GSUZPX09WRVJGTE9XCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9UQkRSX1NUQVRVU19GSUZPX1VOREVSRkxPVwkJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfVEJEUl9TVEFUVVNfU0VBUkNITUlTU19FUlJPUgkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9UQkRSX1NUQVRVU19GVFFfRU5UUllfQ05UCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9UQkRSX1NUQVRVU19CVVJTVF9DTlQJCQkgKDFMPDw2KQorCisjZGVmaW5lIEJOWDJfVEJEUl9DT05GSUcJCQkJMHgwMDAwNTAwOAorI2RlZmluZSBCTlgyX1RCRFJfQ09ORklHX01BWF9CRFMJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1RCRFJfQ09ORklHX1NXQVBfTU9ERQkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfVEJEUl9DT05GSUdfUFJJT1JJVFkJCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX1RCRFJfQ09ORklHX0NBQ0hFX05FWFRfUEFHRV9QVFJTCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9UQkRSX0NPTkZJR19QQUdFX1NJWkUJCQkgKDB4Zkw8PDI0KQorI2RlZmluZSBCTlgyX1RCRFJfQ09ORklHX1BBR0VfU0laRV8yNTYJCQkgKDBMPDwyNCkKKyNkZWZpbmUgQk5YMl9UQkRSX0NPTkZJR19QQUdFX1NJWkVfNTEyCQkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfVEJEUl9DT05GSUdfUEFHRV9TSVpFXzFLCQkJICgyTDw8MjQpCisjZGVmaW5lIEJOWDJfVEJEUl9DT05GSUdfUEFHRV9TSVpFXzJLCQkJICgzTDw8MjQpCisjZGVmaW5lIEJOWDJfVEJEUl9DT05GSUdfUEFHRV9TSVpFXzRLCQkJICg0TDw8MjQpCisjZGVmaW5lIEJOWDJfVEJEUl9DT05GSUdfUEFHRV9TSVpFXzhLCQkJICg1TDw8MjQpCisjZGVmaW5lIEJOWDJfVEJEUl9DT05GSUdfUEFHRV9TSVpFXzE2SwkJCSAoNkw8PDI0KQorI2RlZmluZSBCTlgyX1RCRFJfQ09ORklHX1BBR0VfU0laRV8zMksJCQkgKDdMPDwyNCkKKyNkZWZpbmUgQk5YMl9UQkRSX0NPTkZJR19QQUdFX1NJWkVfNjRLCQkJICg4TDw8MjQpCisjZGVmaW5lIEJOWDJfVEJEUl9DT05GSUdfUEFHRV9TSVpFXzEyOEsJCQkgKDlMPDwyNCkKKyNkZWZpbmUgQk5YMl9UQkRSX0NPTkZJR19QQUdFX1NJWkVfMjU2SwkJCSAoMTBMPDwyNCkKKyNkZWZpbmUgQk5YMl9UQkRSX0NPTkZJR19QQUdFX1NJWkVfNTEySwkJCSAoMTFMPDwyNCkKKyNkZWZpbmUgQk5YMl9UQkRSX0NPTkZJR19QQUdFX1NJWkVfMU0JCQkgKDEyTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9UQkRSX0RFQlVHX1ZFQ1RfUEVFSwkJCTB4MDAwMDUwMGMKKyNkZWZpbmUgQk5YMl9UQkRSX0RFQlVHX1ZFQ1RfUEVFS18xX1ZBTFVFCQkgKDB4N2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9UQkRSX0RFQlVHX1ZFQ1RfUEVFS18xX1BFRUtfRU4JCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1RCRFJfREVCVUdfVkVDVF9QRUVLXzFfU0VMCQkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9UQkRSX0RFQlVHX1ZFQ1RfUEVFS18yX1ZBTFVFCQkgKDB4N2ZmTDw8MTYpCisjZGVmaW5lIEJOWDJfVEJEUl9ERUJVR19WRUNUX1BFRUtfMl9QRUVLX0VOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9UQkRSX0RFQlVHX1ZFQ1RfUEVFS18yX1NFTAkJCSAoMHhmTDw8MjgpCisKKyNkZWZpbmUgQk5YMl9UQkRSX0ZUUV9EQVRBCQkJCTB4MDAwMDUzYzAKKyNkZWZpbmUgQk5YMl9UQkRSX0ZUUV9DTUQJCQkJMHgwMDAwNTNmOAorI2RlZmluZSBCTlgyX1RCRFJfRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9UQkRSX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfVEJEUl9GVFFfQ01EX1dSX1RPUF8wCQkJICgwTDw8MTApCisjZGVmaW5lIEJOWDJfVEJEUl9GVFFfQ01EX1dSX1RPUF8xCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfVEJEUl9GVFFfQ01EX1NGVF9SRVNFVAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1RCRFJfRlRRX0NNRF9SRF9EQVRBCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfVEJEUl9GVFFfQ01EX0FERF9JTlRFUlZFTgkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1RCRFJfRlRRX0NNRF9BRERfREFUQQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1RCRFJfRlRRX0NNRF9JTlRFUlZFTkVfQ0xSCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfVEJEUl9GVFFfQ01EX1BPUAkJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9UQkRSX0ZUUV9DTURfQlVTWQkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1RCRFJfRlRRX0NUTAkJCQkweDAwMDA1M2ZjCisjZGVmaW5lIEJOWDJfVEJEUl9GVFFfQ1RMX0lOVEVSVkVORQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfVEJEUl9GVFFfQ1RMX09WRVJGTE9XCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9UQkRSX0ZUUV9DVExfRk9SQ0VfSU5URVJWRU5FCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1RCRFJfRlRRX0NUTF9NQVhfREVQVEgJCQkgKDB4M2ZmTDw8MTIpCisjZGVmaW5lIEJOWDJfVEJEUl9GVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKKworCisKKy8qCisgKiAgdGRtYV9yZWcgZGVmaW5pdGlvbgorICogIG9mZnNldDogMHg1YzAwCisgKi8KKyNkZWZpbmUgQk5YMl9URE1BX0NPTU1BTkQJCQkJMHgwMDAwNWMwMAorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9FTkFCTEVECQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTU1BTkRfTUFTVEVSX0FCT1JUCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTU1BTkRfQkFEX0wyX0xFTkdUSF9BQk9SVAkJICgxTDw8NykKKworI2RlZmluZSBCTlgyX1RETUFfU1RBVFVTCQkJCTB4MDAwMDVjMDQKKyNkZWZpbmUgQk5YMl9URE1BX1NUQVRVU19ETUFfV0FJVAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfVERNQV9TVEFUVVNfUEFZTE9BRF9XQUlUCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9URE1BX1NUQVRVU19QQVRDSF9GVFFfV0FJVAkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfVERNQV9TVEFUVVNfTE9DS19XQUlUCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9URE1BX1NUQVRVU19GVFFfRU5UUllfQ05UCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfVERNQV9TVEFUVVNfQlVSU1RfQ05UCQkJICgxTDw8MTcpCisKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJRwkJCQkweDAwMDA1YzA4CisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfT05FX0RNQQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfT05FX1JFQ09SRAkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTElNSVRfU1oJCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTElNSVRfU1pfNjQJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xJTUlUX1NaXzEyOAkJCSAoMHg0TDw8NCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19MSU1JVF9TWl8yNTYJCQkgKDB4Nkw8PDQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTElNSVRfU1pfNTEyCQkJICgweDhMPDw0KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xJTkVfU1oJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTElORV9TWl82NAkJCSAoMEw8PDgpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTElORV9TWl8xMjgJCQkgKDRMPDw4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xJTkVfU1pfMjU2CQkJICg2TDw8OCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19MSU5FX1NaXzUxMgkJCSAoOEw8PDgpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfQUxJR05fRU5BCQkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfQ0hLX0wyX0JECQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfRklGT19DTVAJCQkgKDB4Zkw8PDIwKQorCisjZGVmaW5lIEJOWDJfVERNQV9QQVlMT0FEX1BST0QJCQkJMHgwMDAwNWMwYworI2RlZmluZSBCTlgyX1RETUFfUEFZTE9BRF9QUk9EX1ZBTFVFCQkJICgweDFmZmZMPDwzKQorCisjZGVmaW5lIEJOWDJfVERNQV9EQkdfV0FUQ0hET0cJCQkJMHgwMDAwNWMxMAorI2RlZmluZSBCTlgyX1RETUFfREJHX1RSSUdHRVIJCQkJMHgwMDAwNWMxNAorI2RlZmluZSBCTlgyX1RETUFfRE1BRF9GU00JCQkJMHgwMDAwNWM4MAorI2RlZmluZSBCTlgyX1RETUFfRE1BRF9GU01fQkRfSU5WTEQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1RETUFfRE1BRF9GU01fUFVTSAkJCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfVERNQV9ETUFEX0ZTTV9BUkJfVEJEQwkJCSAoMHgzTDw8OCkKKyNkZWZpbmUgQk5YMl9URE1BX0RNQURfRlNNX0FSQl9DVFgJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9URE1BX0RNQURfRlNNX0RSX0lOVEYJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9URE1BX0RNQURfRlNNX0RNQUQJCQkJICgweDdMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0RNQURfRlNNX0JECQkJCSAoMHhmTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9URE1BX0RNQURfU1RBVFVTCQkJCTB4MDAwMDVjODQKKyNkZWZpbmUgQk5YMl9URE1BX0RNQURfU1RBVFVTX1JIT0xEX1BVU0hfRU5UUlkJCSAoMHgzTDw8MCkKKyNkZWZpbmUgQk5YMl9URE1BX0RNQURfU1RBVFVTX1JIT0xEX0RNQURfRU5UUlkJCSAoMHgzTDw8NCkKKyNkZWZpbmUgQk5YMl9URE1BX0RNQURfU1RBVFVTX1JIT0xEX0JEX0VOVFJZCQkgKDB4M0w8PDgpCisjZGVmaW5lIEJOWDJfVERNQV9ETUFEX1NUQVRVU19JRlRRX0VOVU0JCQkgKDB4Zkw8PDEyKQorCisjZGVmaW5lIEJOWDJfVERNQV9EUl9JTlRGX0ZTTQkJCQkweDAwMDA1Yzg4CisjZGVmaW5lIEJOWDJfVERNQV9EUl9JTlRGX0ZTTV9MMl9DT01QCQkJICgweDNMPDwwKQorI2RlZmluZSBCTlgyX1RETUFfRFJfSU5URl9GU01fVFBBVFEJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfVERNQV9EUl9JTlRGX0ZTTV9UUEJVRgkJCSAoMHgzTDw8OCkKKyNkZWZpbmUgQk5YMl9URE1BX0RSX0lOVEZfRlNNX0RSX0JVRgkJCSAoMHg3TDw8MTIpCisjZGVmaW5lIEJOWDJfVERNQV9EUl9JTlRGX0ZTTV9ETUFECQkJICgweDdMPDwxNikKKworI2RlZmluZSBCTlgyX1RETUFfRFJfSU5URl9TVEFUVVMJCQkweDAwMDA1YzhjCisjZGVmaW5lIEJOWDJfVERNQV9EUl9JTlRGX1NUQVRVU19IT0xFX1BIQVNFCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfVERNQV9EUl9JTlRGX1NUQVRVU19EQVRBX0FWQUlMCQkgKDB4M0w8PDQpCisjZGVmaW5lIEJOWDJfVERNQV9EUl9JTlRGX1NUQVRVU19TSElGVF9BRERSCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfVERNQV9EUl9JTlRGX1NUQVRVU19OWFRfUE5UUgkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9URE1BX0RSX0lOVEZfU1RBVFVTX0JZVEVfQ09VTlQJCSAoMHg3TDw8MTYpCisKKyNkZWZpbmUgQk5YMl9URE1BX0ZUUV9EQVRBCQkJCTB4MDAwMDVmYzAKKyNkZWZpbmUgQk5YMl9URE1BX0ZUUV9DTUQJCQkJMHgwMDAwNWZmOAorI2RlZmluZSBCTlgyX1RETUFfRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9URE1BX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ01EX1dSX1RPUF8wCQkJICgwTDw8MTApCisjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ01EX1dSX1RPUF8xCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ01EX1NGVF9SRVNFVAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1RETUFfRlRRX0NNRF9SRF9EQVRBCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ01EX0FERF9JTlRFUlZFTgkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1RETUFfRlRRX0NNRF9BRERfREFUQQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfRlRRX0NNRF9JTlRFUlZFTkVfQ0xSCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ01EX1BPUAkJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9URE1BX0ZUUV9DTURfQlVTWQkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1RETUFfRlRRX0NUTAkJCQkweDAwMDA1ZmZjCisjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ1RMX0lOVEVSVkVORQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ1RMX09WRVJGTE9XCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9URE1BX0ZUUV9DVExfRk9SQ0VfSU5URVJWRU5FCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1RETUFfRlRRX0NUTF9NQVhfREVQVEgJCQkgKDB4M2ZmTDw8MTIpCisjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKKworCisKKy8qCisgKiAgaGNfcmVnIGRlZmluaXRpb24KKyAqICBvZmZzZXQ6IDB4NjgwMAorICovCisjZGVmaW5lIEJOWDJfSENfQ09NTUFORAkJCQkJMHgwMDAwNjgwMAorI2RlZmluZSBCTlgyX0hDX0NPTU1BTkRfRU5BQkxFCQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NTUFORF9TS0lQX0FCT1JUCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX0NPQUxfTk9XCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfQ09NTUFORF9DT0FMX05PV19XT19JTlQJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX1NUQVRTX05PVwkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX0NPTU1BTkRfRk9SQ0VfSU5UCQkJICgweDNMPDwxOSkKKyNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX0ZPUkNFX0lOVF9OVUxMCQkJICgwTDw8MTkpCisjZGVmaW5lIEJOWDJfSENfQ09NTUFORF9GT1JDRV9JTlRfSElHSAkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX0hDX0NPTU1BTkRfRk9SQ0VfSU5UX0xPVwkJCSAoMkw8PDE5KQorI2RlZmluZSBCTlgyX0hDX0NPTU1BTkRfRk9SQ0VfSU5UX0ZSRUUJCQkgKDNMPDwxOSkKKyNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX0NMUl9TVEFUX05PVwkJCSAoMUw8PDIxKQorCisjZGVmaW5lIEJOWDJfSENfU1RBVFVTCQkJCQkweDAwMDA2ODA0CisjZGVmaW5lIEJOWDJfSENfU1RBVFVTX01BU1RFUl9BQk9SVAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVFVTX1BBUklUWV9FUlJPUl9TVEFURQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUVVNfUENJX0NMS19DTlRfU1RBVAkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NUQVRVU19DT1JFX0NMS19DTlRfU1RBVAkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfSENfU1RBVFVTX05VTV9TVEFUVVNfQkxPQ0tTX1NUQVQJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX1NUQVRVU19OVU1fSU5UX0dFTl9TVEFUCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfSENfU1RBVFVTX05VTV9JTlRfTUJPWF9XUl9TVEFUCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUVVNfQ09SRV9DTEtTX1RPX0hXX0lOVEFDS19TVEFUCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX0hDX1NUQVRVU19DT1JFX0NMS1NfVE9fU1dfSU5UQUNLX1NUQVQJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfSENfU1RBVFVTX0NPUkVfQ0xLU19EVVJJTkdfU1dfSU5UQUNLX1NUQVQJICgxTDw8MjUpCisKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUcJCQkJCTB4MDAwMDY4MDgKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfQ09MTEVDVF9TVEFUUwkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1JYX1RNUl9NT0RFCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfVFhfVE1SX01PREUJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19DT01fVE1SX01PREUJCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19DTURfVE1SX01PREUJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19TVEFUSVNUSUNfUFJJT1JJVFkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1NUQVRVU19QUklPUklUWQkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1NUQVRfTUVNX0FERFIJCQkgKDB4ZmZMPDw4KQorCisjZGVmaW5lIEJOWDJfSENfQVRUTl9CSVRTX0VOQUJMRQkJCTB4MDAwMDY4MGMKKyNkZWZpbmUgQk5YMl9IQ19TVEFUVVNfQUREUl9MCQkJCTB4MDAwMDY4MTAKKyNkZWZpbmUgQk5YMl9IQ19TVEFUVVNfQUREUl9ICQkJCTB4MDAwMDY4MTQKKyNkZWZpbmUgQk5YMl9IQ19TVEFUSVNUSUNTX0FERFJfTAkJCTB4MDAwMDY4MTgKKyNkZWZpbmUgQk5YMl9IQ19TVEFUSVNUSUNTX0FERFJfSAkJCTB4MDAwMDY4MWMKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVAJCQkweDAwMDA2ODIwCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQX1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF9JTlQJCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQCQkJCTB4MDAwMDY4MjQKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF9WQUxVRQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfSU5UCQkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVAJCQkweDAwMDA2ODI4CisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQX1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF9JTlQJCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTCQkJCTB4MDAwMDY4MmMKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU19WQUxVRQkJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU19JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1MJCQkJMHgwMDAwNjgzMAorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTX1ZBTFVFCQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTX0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1MJCQkJMHgwMDAwNjgzNAorI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU19WQUxVRQkJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLUwkJCQkweDAwMDA2ODM4CisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTX1ZBTFVFCQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU19JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1MJCQkJMHgwMDAwNjgzYworI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTX0hDX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX0hDX1NUQVRfQ09MTEVDVF9USUNLUwkJCTB4MDAwMDY4NDAKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0NPTExFQ1RfVElDS1NfSENfU1RBVF9DT0xMX1RJQ0tTCSAoMHhmZkw8PDQpCisKKyNkZWZpbmUgQk5YMl9IQ19TVEFUU19USUNLUwkJCQkweDAwMDA2ODQ0CisjZGVmaW5lIEJOWDJfSENfU1RBVFNfVElDS1NfSENfU1RBVF9USUNLUwkJICgweGZmZmZMPDw4KQorCisjZGVmaW5lIEJOWDJfSENfU1RBVF9NRU1fREFUQQkJCQkweDAwMDA2ODRjCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzAJCQkJMHgwMDAwNjg1MAorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMAkJICgweDdmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlhQX1NUQVQwCSAoMEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JYUF9TVEFUMQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SWFBfU1RBVDIJICgyTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlhQX1NUQVQzCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JYUF9TVEFUNAkgKDRMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SWFBfU1RBVDUJICg1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlhQX1NUQVQ2CSAoNkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JYUF9TVEFUNwkgKDdMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SWFBfU1RBVDgJICg4TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlhQX1NUQVQ5CSAoOUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JYUF9TVEFUMTAJICgxMEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JYUF9TVEFUMTEJICgxMUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RYUF9TVEFUMAkgKDEyTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVFhQX1NUQVQxCSAoMTNMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UWFBfU1RBVDIJICgxNEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RYUF9TVEFUMwkgKDE1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVFhQX1NUQVQ0CSAoMTZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UWFBfU1RBVDUJICgxN0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RYUF9TVEFUNgkgKDE4TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVFhQX1NUQVQ3CSAoMTlMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DT01fU1RBVDAJICgyMEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NPTV9TVEFUMQkgKDIxTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ09NX1NUQVQyCSAoMjJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DT01fU1RBVDMJICgyM0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NPTV9TVEFUNAkgKDI0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ09NX1NUQVQ1CSAoMjVMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DT01fU1RBVDYJICgyNkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NPTV9TVEFUNwkgKDI3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ09NX1NUQVQ4CSAoMjhMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DT01fU1RBVDkJICgyOUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NPTV9TVEFUMTAJICgzMEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NPTV9TVEFUMTEJICgzMUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RQQVRfU1RBVDAJICgzMkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RQQVRfU1RBVDEJICgzM0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RQQVRfU1RBVDIJICgzNEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RQQVRfU1RBVDMJICgzNUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NQX1NUQVQwCSAoMzZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DUF9TVEFUMQkgKDM3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ1BfU1RBVDIJICgzOEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NQX1NUQVQzCSAoMzlMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DUF9TVEFUNAkgKDQwTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ1BfU1RBVDUJICg0MUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NQX1NUQVQ2CSAoNDJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DUF9TVEFUNwkgKDQzTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfTUNQX1NUQVQwCSAoNDRMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9NQ1BfU1RBVDEJICg0NUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX01DUF9TVEFUMgkgKDQ2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfTUNQX1NUQVQzCSAoNDdMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9NQ1BfU1RBVDQJICg0OEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX01DUF9TVEFUNQkgKDQ5TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfTUNQX1NUQVQ2CSAoNTBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9NQ1BfU1RBVDcJICg1MUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1BDSV9DTEtfQ05UCSAoNTJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DT1JFX0NMS19DTlQJICg1M0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9TVEFUVVNfQkxPQ0tTCSAoNTRMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX0dFTgkgKDU1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9NQk9YX1dSCSAoNTZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fSFdfSU5UQUNLCSAoNTlMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fU1dfSU5UQUNLCSAoNjBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfRFVSSU5HX1NXX0lOVEFDSwkgKDYxTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVFNDSF9DTURfQ05UCSAoNjJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UU0NIX1NMT1RfQ05UCSAoNjNMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DU0NIX0NNRF9DTlQJICg2NEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NTQ0hfU0xPVF9DTlQJICg2NUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JMVVBRX1ZBTElEX0NOVAkgKDY2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlhQUV9WQUxJRF9DTlQJICg2N0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JYUENRX1ZBTElEX0NOVAkgKDY4TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlYyUFBRX1ZBTElEX0NOVAkgKDY5TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlYyUE1RX1ZBTElEX0NOVAkgKDcwTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlYyUFRRX1ZBTElEX0NOVAkgKDcxTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUkRNQVFfVkFMSURfQ05UCSAoNzJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UU0NIUV9WQUxJRF9DTlQJICg3M0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RCRFJRX1ZBTElEX0NOVAkgKDc0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVFhQUV9WQUxJRF9DTlQJICg3NUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RETUFRX1ZBTElEX0NOVAkgKDc2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVFBBVFFfVkFMSURfQ05UCSAoNzdMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UQVNRX1ZBTElEX0NOVAkgKDc4TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ1NRX1ZBTElEX0NOVAkgKDc5TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ1BRX1ZBTElEX0NOVAkgKDgwTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ09NWFFfVkFMSURfQ05UCSAoODFMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DT01UUV9WQUxJRF9DTlQJICg4Mkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NPTVFfVkFMSURfQ05UCSAoODNMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9NR01RX1ZBTElEX0NOVAkgKDg0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfRE1BRV9SRUFEX1RSQU5TRkVSU19DTlQJICg4NUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0RNQUVfUkVBRF9ERUxBWV9QQ0lfQ0xLU19DTlQJICg4Nkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0RNQUVfQklHX1JFQURfVFJBTlNGRVJTX0NOVAkgKDg3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfRE1BRV9CSUdfUkVBRF9ERUxBWV9QQ0lfQ0xLU19DTlQJICg4OEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0RNQUVfQklHX1JFQURfUkVUUllfQUZURVJfREFUQV9DTlQJICg4OUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0RNQUVfV1JJVEVfVFJBTlNGRVJTX0NOVAkgKDkwTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfRE1BRV9XUklURV9ERUxBWV9QQ0lfQ0xLU19DTlQJICg5MUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0RNQUVfQklHX1dSSVRFX1RSQU5TRkVSU19DTlQJICg5Mkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0RNQUVfQklHX1dSSVRFX0RFTEFZX1BDSV9DTEtTX0NOVAkgKDkzTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfRE1BRV9CSUdfV1JJVEVfUkVUUllfQUZURVJfREFUQV9DTlQJICg5NEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NUWF9XUl9DTlQ2NAkgKDk1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ1RYX1JEX0NOVDY0CSAoOTZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DVFhfQUNDX1NUQUxMX0NMS1MJICg5N0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NUWF9MT0NLX1NUQUxMX0NMS1MJICg5OEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX01CUV9DVFhfQUNDRVNTX1NUQVQJICg5OUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX01CUV9DVFhfQUNDRVNTNjRfU1RBVAkgKDEwMEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX01CUV9QQ0lfU1RBTExfU1RBVAkgKDEwMUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RCRFJfRlRRX0VOVFJZX0NOVAkgKDEwMkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1RCRFJfQlVSU1RfQ05UCSAoMTAzTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVERNQV9GVFFfRU5UUllfQ05UCSAoMTA0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVERNQV9CVVJTVF9DTlQJICgxMDVMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SRE1BX0ZUUV9FTlRSWV9DTlQJICgxMDZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SRE1BX0JVUlNUX0NOVAkgKDEwN0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JMVVBfTUFUQ0hfQ05UCSAoMTA4TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVE1SX1BPTExfUEFTU19DTlQJICgxMDlMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UTVJfVE1SMV9DTlQJICgxMTBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UTVJfVE1SMl9DTlQJICgxMTFMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UTVJfVE1SM19DTlQJICgxMTJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UTVJfVE1SNF9DTlQJICgxMTNMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9UTVJfVE1SNV9DTlQJICgxMTRMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SVjJQX1NUQVQwCSAoMTE1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlYyUF9TVEFUMQkgKDExNkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JWMlBfU1RBVDIJICgxMTdMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SVjJQX1NUQVQzCSAoMTE4TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlYyUF9TVEFUNAkgKDExOUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JWMlBfU1RBVDUJICgxMjBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SQkRDX1BST0MxX01JU1MJICgxMjFMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SQkRDX1BST0MyX01JU1MJICgxMjJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9SQkRDX0JVUlNUX0NOVAkgKDEyN0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8xCQkgKDB4N2ZMPDw4KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMgkJICgweDdmTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8zCQkgKDB4N2ZMPDwyNCkKKworI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xCQkJCTB4MDAwMDY4NTQKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMV9HRU5fU0VMXzQJCSAoMHg3Zkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzFfR0VOX1NFTF81CQkgKDB4N2ZMPDw4KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xX0dFTl9TRUxfNgkJICgweDdmTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzFfR0VOX1NFTF83CQkgKDB4N2ZMPDwyNCkKKworI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8yCQkJCTB4MDAwMDY4NTgKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMl9HRU5fU0VMXzgJCSAoMHg3Zkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzJfR0VOX1NFTF85CQkgKDB4N2ZMPDw4KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8yX0dFTl9TRUxfMTAJCSAoMHg3Zkw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8yX0dFTl9TRUxfMTEJCSAoMHg3Zkw8PDI0KQorCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzMJCQkJMHgwMDAwNjg1YworI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8zX0dFTl9TRUxfMTIJCSAoMHg3Zkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzNfR0VOX1NFTF8xMwkJICgweDdmTDw8OCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfM19HRU5fU0VMXzE0CQkgKDB4N2ZMPDwxNikKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfM19HRU5fU0VMXzE1CQkgKDB4N2ZMPDwyNCkKKworI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVQwCQkJCTB4MDAwMDY4ODgKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUMQkJCQkweDAwMDA2ODhjCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVDIJCQkJMHgwMDAwNjg5MAorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVQzCQkJCTB4MDAwMDY4OTQKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUNAkJCQkweDAwMDA2ODk4CisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVDUJCQkJMHgwMDAwNjg5YworI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVQ2CQkJCTB4MDAwMDY4YTAKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUNwkJCQkweDAwMDA2OGE0CisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVDgJCQkJMHgwMDAwNjhhOAorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVQ5CQkJCTB4MDAwMDY4YWMKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUMTAJCQkJMHgwMDAwNjhiMAorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVQxMQkJCQkweDAwMDA2OGI0CisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVDEyCQkJCTB4MDAwMDY4YjgKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUMTMJCQkJMHgwMDAwNjhiYworI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVQxNAkJCQkweDAwMDA2OGMwCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVDE1CQkJCTB4MDAwMDY4YzQKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDMAkJCTB4MDAwMDY4YzgKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDMQkJCTB4MDAwMDY4Y2MKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDMgkJCTB4MDAwMDY4ZDAKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDMwkJCTB4MDAwMDY4ZDQKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDNAkJCTB4MDAwMDY4ZDgKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDNQkJCTB4MDAwMDY4ZGMKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDNgkJCTB4MDAwMDY4ZTAKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDNwkJCTB4MDAwMDY4ZTQKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDOAkJCTB4MDAwMDY4ZTgKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDOQkJCTB4MDAwMDY4ZWMKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDMTAJCQkweDAwMDA2OGYwCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVF9BQzExCQkJMHgwMDAwNjhmNAorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVRfQUMxMgkJCTB4MDAwMDY4ZjgKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDMTMJCQkweDAwMDA2OGZjCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVF9BQzE0CQkJMHgwMDAwNjkwMAorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVRfQUMxNQkJCTB4MDAwMDY5MDQKKyNkZWZpbmUgQk5YMl9IQ19WSVMJCQkJCTB4MDAwMDY5MDgKKyNkZWZpbmUgQk5YMl9IQ19WSVNfU1RBVF9CVUlMRF9TVEFURQkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19WSVNfU1RBVF9CVUlMRF9TVEFURV9JRExFCQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1ZJU19TVEFUX0JVSUxEX1NUQVRFX1NUQVJUCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0hDX1ZJU19TVEFUX0JVSUxEX1NUQVRFX1JFUVVFU1QJCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfSENfVklTX1NUQVRfQlVJTERfU1RBVEVfVVBEQVRFNjQJCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfSENfVklTX1NUQVRfQlVJTERfU1RBVEVfVVBEQVRFMzIJCSAoNEw8PDApCisjZGVmaW5lIEJOWDJfSENfVklTX1NUQVRfQlVJTERfU1RBVEVfVVBEQVRFX0RPTkUJICg1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19WSVNfU1RBVF9CVUlMRF9TVEFURV9ETUEJCSAoNkw8PDApCisjZGVmaW5lIEJOWDJfSENfVklTX1NUQVRfQlVJTERfU1RBVEVfTVNJX0NPTlRST0wJICg3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19WSVNfU1RBVF9CVUlMRF9TVEFURV9NU0lfTE9XCQkgKDhMPDwwKQorI2RlZmluZSBCTlgyX0hDX1ZJU19TVEFUX0JVSUxEX1NUQVRFX01TSV9ISUdICQkgKDlMPDwwKQorI2RlZmluZSBCTlgyX0hDX1ZJU19TVEFUX0JVSUxEX1NUQVRFX01TSV9EQVRBCQkgKDEwTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19WSVNfRE1BX1NUQVRfU1RBVEUJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfSENfVklTX0RNQV9TVEFUX1NUQVRFX0lETEUJCQkgKDBMPDw4KQorI2RlZmluZSBCTlgyX0hDX1ZJU19ETUFfU1RBVF9TVEFURV9TVEFUVVNfUEFSQU0JCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfSENfVklTX0RNQV9TVEFUX1NUQVRFX1NUQVRVU19ETUEJCSAoMkw8PDgpCisjZGVmaW5lIEJOWDJfSENfVklTX0RNQV9TVEFUX1NUQVRFX1dSSVRFX0NPTVAJCSAoM0w8PDgpCisjZGVmaW5lIEJOWDJfSENfVklTX0RNQV9TVEFUX1NUQVRFX0NPTVAJCQkgKDRMPDw4KQorI2RlZmluZSBCTlgyX0hDX1ZJU19ETUFfU1RBVF9TVEFURV9TVEFUSVNUSUNfUEFSQU0JICg1TDw8OCkKKyNkZWZpbmUgQk5YMl9IQ19WSVNfRE1BX1NUQVRfU1RBVEVfU1RBVElTVElDX0RNQQkgKDZMPDw4KQorI2RlZmluZSBCTlgyX0hDX1ZJU19ETUFfU1RBVF9TVEFURV9XUklURV9DT01QXzEJCSAoN0w8PDgpCisjZGVmaW5lIEJOWDJfSENfVklTX0RNQV9TVEFUX1NUQVRFX1dSSVRFX0NPTVBfMgkJICg4TDw8OCkKKyNkZWZpbmUgQk5YMl9IQ19WSVNfRE1BX1NUQVRfU1RBVEVfV0FJVAkJCSAoOUw8PDgpCisjZGVmaW5lIEJOWDJfSENfVklTX0RNQV9TVEFUX1NUQVRFX0FCT1JUCQkgKDE1TDw8OCkKKyNkZWZpbmUgQk5YMl9IQ19WSVNfRE1BX01TSV9TVEFURQkJCSAoMHg3TDw8MTIpCisjZGVmaW5lIEJOWDJfSENfVklTX1NUQVRJU1RJQ19ETUFfRU5fU1RBVEUJCSAoMHgzTDw8MTUpCisjZGVmaW5lIEJOWDJfSENfVklTX1NUQVRJU1RJQ19ETUFfRU5fU1RBVEVfSURMRQkJICgwTDw8MTUpCisjZGVmaW5lIEJOWDJfSENfVklTX1NUQVRJU1RJQ19ETUFfRU5fU1RBVEVfQ09VTlQJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfSENfVklTX1NUQVRJU1RJQ19ETUFfRU5fU1RBVEVfU1RBUlQJICgyTDw8MTUpCisKKyNkZWZpbmUgQk5YMl9IQ19WSVNfMQkJCQkJMHgwMDAwNjkwYworI2RlZmluZSBCTlgyX0hDX1ZJU18xX0hXX0lOVEFDS19TVEFURQkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfSFdfSU5UQUNLX1NUQVRFX0lETEUJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfSFdfSU5UQUNLX1NUQVRFX0NPVU5UCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX1NXX0lOVEFDS19TVEFURQkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfU1dfSU5UQUNLX1NUQVRFX0lETEUJCSAoMEw8PDUpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfU1dfSU5UQUNLX1NUQVRFX0NPVU5UCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX0RVUklOR19TV19JTlRBQ0tfU1RBVEUJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfRFVSSU5HX1NXX0lOVEFDS19TVEFURV9JRExFCSAoMEw8PDYpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfRFVSSU5HX1NXX0lOVEFDS19TVEFURV9DT1VOVAkgKDFMPDw2KQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX01BSUxCT1hfQ09VTlRfU1RBVEUJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfTUFJTEJPWF9DT1VOVF9TVEFURV9JRExFCQkgKDBMPDw3KQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX01BSUxCT1hfQ09VTlRfU1RBVEVfQ09VTlQJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfUkFNX1JEX0FSQl9TVEFURQkJCSAoMHhmTDw8MTcpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfUkFNX1JEX0FSQl9TVEFURV9JRExFCQkgKDBMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19WSVNfMV9SQU1fUkRfQVJCX1NUQVRFX0RNQQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfUkFNX1JEX0FSQl9TVEFURV9VUERBVEUJCSAoMkw8PDE3KQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX1JBTV9SRF9BUkJfU1RBVEVfQVNTSUdOCQkgKDNMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19WSVNfMV9SQU1fUkRfQVJCX1NUQVRFX1dBSVQJCSAoNEw8PDE3KQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX1JBTV9SRF9BUkJfU1RBVEVfUkVHX1VQREFURQkgKDVMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19WSVNfMV9SQU1fUkRfQVJCX1NUQVRFX1JFR19BU1NJR04JICg2TDw8MTcpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfUkFNX1JEX0FSQl9TVEFURV9SRUdfV0FJVAkJICg3TDw8MTcpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfUkFNX1dSX0FSQl9TVEFURQkJCSAoMHgzTDw8MjEpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfUkFNX1dSX0FSQl9TVEFURV9OT1JNQUwJCSAoMEw8PDIxKQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX1JBTV9XUl9BUkJfU1RBVEVfQ0xFQVIJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX0lOVF9HRU5fU1RBVEUJCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9IQ19WSVNfMV9JTlRfR0VOX1NUQVRFX0RMRQkJCSAoMEw8PDIzKQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX0lOVF9HRU5fU1RBVEVfTlRFUlJVUFQJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX0hDX1ZJU18xX1NUQVRfQ0hBTl9JRAkJCSAoMHg3TDw8MjQpCisjZGVmaW5lIEJOWDJfSENfVklTXzFfSU5UX0IJCQkJICgxTDw8MjcpCisKKyNkZWZpbmUgQk5YMl9IQ19ERUJVR19WRUNUX1BFRUsJCQkJMHgwMDAwNjkxMAorI2RlZmluZSBCTlgyX0hDX0RFQlVHX1ZFQ1RfUEVFS18xX1ZBTFVFCQkJICgweDdmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfREVCVUdfVkVDVF9QRUVLXzFfUEVFS19FTgkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfSENfREVCVUdfVkVDVF9QRUVLXzFfU0VMCQkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9IQ19ERUJVR19WRUNUX1BFRUtfMl9WQUxVRQkJCSAoMHg3ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9IQ19ERUJVR19WRUNUX1BFRUtfMl9QRUVLX0VOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9IQ19ERUJVR19WRUNUX1BFRUtfMl9TRUwJCQkgKDB4Zkw8PDI4KQorCisKKworLyoKKyAqICB0eHBfcmVnIGRlZmluaXRpb24KKyAqICBvZmZzZXQ6IDB4NDAwMDAKKyAqLworI2RlZmluZSBCTlgyX1RYUF9DUFVfTU9ERQkJCQkweDAwMDQ1MDAwCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9NT0RFX0xPQ0FMX1JTVAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9NT0RFX1NURVBfRU5BCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX01PREVfUEFHRV8wX0RBVEFfRU5BCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1RYUF9DUFVfTU9ERV9QQUdFXzBfSU5TVF9FTkEJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9NT0RFX01TR19CSVQxCQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX01PREVfSU5URVJSVVBUX0VOQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9NT0RFX1NPRlRfSEFMVAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1RYUF9DUFVfTU9ERV9CQURfREFUQV9IQUxUX0VOQQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9NT0RFX0JBRF9JTlNUX0hBTFRfRU5BCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX01PREVfRklPX0FCT1JUX0hBTFRfRU5BCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX01PREVfU1BBRF9VTkRFUkZMT1dfSEFMVF9FTkEJICgxTDw8MTUpCisKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX1NUQVRFCQkJCTB4MDAwNDUwMDQKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX1NUQVRFX0JSRUFLUE9JTlQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfQkFEX0lOU1RfSEFMVEVECQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfUEFHRV8wX0RBVEFfSEFMVEVECQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfUEFHRV8wX0lOU1RfSEFMVEVECQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfQkFEX0RBVEFfQUREUl9IQUxURUQJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9TVEFURV9CQURfcGNfSEFMVEVECQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfQUxJR05fSEFMVEVECQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX1NUQVRFX0ZJT19BQk9SVF9IQUxURUQJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9TVEFURV9TT0ZUX0hBTFRFRAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfU1BBRF9VTkRFUkZMT1cJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfSU5URVJSUlVQVAkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfREFUQV9BQ0NFU1NfU1RBTEwJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfSU5TVF9GRVRDSF9TVEFMTAkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9TVEFURV9CTE9DS0VEX1JFQUQJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1RYUF9DUFVfRVZFTlRfTUFTSwkJCQkweDAwMDQ1MDA4CisjZGVmaW5lIEJOWDJfVFhQX0NQVV9FVkVOVF9NQVNLX0JSRUFLUE9JTlRfTUFTSwkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0VWRU5UX01BU0tfQkFEX0lOU1RfSEFMVEVEX01BU0sJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0VWRU5UX01BU0tfUEFHRV8wX0RBVEFfSEFMVEVEX01BU0sJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0VWRU5UX01BU0tfUEFHRV8wX0lOU1RfSEFMVEVEX01BU0sJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0VWRU5UX01BU0tfQkFEX0RBVEFfQUREUl9IQUxURURfTUFTSwkgKDFMPDw1KQorI2RlZmluZSBCTlgyX1RYUF9DUFVfRVZFTlRfTUFTS19CQURfUENfSEFMVEVEX01BU0sJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0VWRU5UX01BU0tfQUxJR05fSEFMVEVEX01BU0sJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0VWRU5UX01BU0tfRklPX0FCT1JUX01BU0sJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9FVkVOVF9NQVNLX1NPRlRfSEFMVEVEX01BU0sJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9FVkVOVF9NQVNLX1NQQURfVU5ERVJGTE9XX01BU0sJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9FVkVOVF9NQVNLX0lOVEVSUlVQVF9NQVNLCQkgKDFMPDwxMikKKworI2RlZmluZSBCTlgyX1RYUF9DUFVfUFJPR1JBTV9DT1VOVEVSCQkJMHgwMDA0NTAxYworI2RlZmluZSBCTlgyX1RYUF9DUFVfSU5TVFJVQ1RJT04JCQkweDAwMDQ1MDIwCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9EQVRBX0FDQ0VTUwkJCTB4MDAwNDUwMjQKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0lOVEVSUlVQVF9FTkFCTEUJCQkweDAwMDQ1MDI4CisjZGVmaW5lIEJOWDJfVFhQX0NQVV9JTlRFUlJVUFRfVkVDVE9SCQkJMHgwMDA0NTAyYworI2RlZmluZSBCTlgyX1RYUF9DUFVfSU5URVJSVVBUX1NBVkVEX1BDCQkJMHgwMDA0NTAzMAorI2RlZmluZSBCTlgyX1RYUF9DUFVfSFdfQlJFQUtQT0lOVAkJCTB4MDAwNDUwMzQKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0hXX0JSRUFLUE9JTlRfRElTQUJMRQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0hXX0JSRUFLUE9JTlRfQUREUkVTUwkJICgweDNmZmZmZmZmTDw8MikKKworI2RlZmluZSBCTlgyX1RYUF9DUFVfREVCVUdfVkVDVF9QRUVLCQkJMHgwMDA0NTAzOAorI2RlZmluZSBCTlgyX1RYUF9DUFVfREVCVUdfVkVDVF9QRUVLXzFfVkFMVUUJCSAoMHg3ZmZMPDwwKQorI2RlZmluZSBCTlgyX1RYUF9DUFVfREVCVUdfVkVDVF9QRUVLXzFfUEVFS19FTgkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9ERUJVR19WRUNUX1BFRUtfMV9TRUwJCSAoMHhmTDw8MTIpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9ERUJVR19WRUNUX1BFRUtfMl9WQUxVRQkJICgweDdmZkw8PDE2KQorI2RlZmluZSBCTlgyX1RYUF9DUFVfREVCVUdfVkVDVF9QRUVLXzJfUEVFS19FTgkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9ERUJVR19WRUNUX1BFRUtfMl9TRUwJCSAoMHhmTDw8MjgpCisKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0xBU1RfQlJBTkNIX0FERFIJCQkweDAwMDQ1MDQ4CisjZGVmaW5lIEJOWDJfVFhQX0NQVV9MQVNUX0JSQU5DSF9BRERSX1RZUEUJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9MQVNUX0JSQU5DSF9BRERSX1RZUEVfSlVNUAkJICgwTDw8MSkKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0xBU1RfQlJBTkNIX0FERFJfVFlQRV9CUkFOQ0gJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9UWFBfQ1BVX0xBU1RfQlJBTkNIX0FERFJfTEJBCQkgKDB4M2ZmZmZmZmZMPDwyKQorCisjZGVmaW5lIEJOWDJfVFhQX0NQVV9SRUdfRklMRQkJCQkweDAwMDQ1MjAwCisjZGVmaW5lIEJOWDJfVFhQX0ZUUV9EQVRBCQkJCTB4MDAwNDUzYzAKKyNkZWZpbmUgQk5YMl9UWFBfRlRRX0NNRAkJCQkweDAwMDQ1M2Y4CisjZGVmaW5lIEJOWDJfVFhQX0ZUUV9DTURfT0ZGU0VUCQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX1RYUF9GVFFfQ01EX1dSX1RPUAkJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9UWFBfRlRRX0NNRF9XUl9UT1BfMAkJCSAoMEw8PDEwKQorI2RlZmluZSBCTlgyX1RYUF9GVFFfQ01EX1dSX1RPUF8xCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfVFhQX0ZUUV9DTURfU0ZUX1JFU0VUCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfVFhQX0ZUUV9DTURfUkRfREFUQQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1RYUF9GVFFfQ01EX0FERF9JTlRFUlZFTgkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1RYUF9GVFFfQ01EX0FERF9EQVRBCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfVFhQX0ZUUV9DTURfSU5URVJWRU5FX0NMUgkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1RYUF9GVFFfQ01EX1BPUAkJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9UWFBfRlRRX0NNRF9CVVNZCQkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfVFhQX0ZUUV9DVEwJCQkJMHgwMDA0NTNmYworI2RlZmluZSBCTlgyX1RYUF9GVFFfQ1RMX0lOVEVSVkVORQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfVFhQX0ZUUV9DVExfT1ZFUkZMT1cJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1RYUF9GVFFfQ1RMX0ZPUkNFX0lOVEVSVkVORQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9UWFBfRlRRX0NUTF9NQVhfREVQVEgJCQkgKDB4M2ZmTDw8MTIpCisjZGVmaW5lIEJOWDJfVFhQX0ZUUV9DVExfQ1VSX0RFUFRICQkJICgweDNmZkw8PDIyKQorCisjZGVmaW5lIEJOWDJfVFhQX1NDUkFUQ0gJCQkJMHgwMDA2MDAwMAorCisKKy8qCisgKiAgdHBhdF9yZWcgZGVmaW5pdGlvbgorICogIG9mZnNldDogMHg4MDAwMAorICovCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfTU9ERQkJCQkweDAwMDg1MDAwCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfTU9ERV9MT0NBTF9SU1QJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX01PREVfU1RFUF9FTkEJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX01PREVfUEFHRV8wX0RBVEFfRU5BCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX01PREVfUEFHRV8wX0lOU1RfRU5BCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX01PREVfTVNHX0JJVDEJCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX01PREVfSU5URVJSVVBUX0VOQQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9NT0RFX1NPRlRfSEFMVAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX01PREVfQkFEX0RBVEFfSEFMVF9FTkEJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX01PREVfQkFEX0lOU1RfSEFMVF9FTkEJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX01PREVfRklPX0FCT1JUX0hBTFRfRU5BCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9NT0RFX1NQQURfVU5ERVJGTE9XX0hBTFRfRU5BCSAoMUw8PDE1KQorCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEUJCQkJMHgwMDA4NTAwNAorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX0JSRUFLUE9JTlQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX0JBRF9JTlNUX0hBTFRFRAkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9QQUdFXzBfREFUQV9IQUxURUQJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfUEFHRV8wX0lOU1RfSEFMVEVECQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX0JBRF9EQVRBX0FERFJfSEFMVEVECSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfQkFEX3BjX0hBTFRFRAkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9BTElHTl9IQUxURUQJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfRklPX0FCT1JUX0hBTFRFRAkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9TT0ZUX0hBTFRFRAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX1NQQURfVU5ERVJGTE9XCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9JTlRFUlJSVVBUCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfREFUQV9BQ0NFU1NfU1RBTEwJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX0lOU1RfRkVUQ0hfU1RBTEwJCSAoMUw8PDE1KQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX0JMT0NLRURfUkVBRAkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9FVkVOVF9NQVNLCQkJMHgwMDA4NTAwOAorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0VWRU5UX01BU0tfQlJFQUtQT0lOVF9NQVNLCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfRVZFTlRfTUFTS19CQURfSU5TVF9IQUxURURfTUFTSwkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0VWRU5UX01BU0tfUEFHRV8wX0RBVEFfSEFMVEVEX01BU0sJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9FVkVOVF9NQVNLX1BBR0VfMF9JTlNUX0hBTFRFRF9NQVNLCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfRVZFTlRfTUFTS19CQURfREFUQV9BRERSX0hBTFRFRF9NQVNLCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfRVZFTlRfTUFTS19CQURfUENfSEFMVEVEX01BU0sJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9FVkVOVF9NQVNLX0FMSUdOX0hBTFRFRF9NQVNLCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfRVZFTlRfTUFTS19GSU9fQUJPUlRfTUFTSwkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9FVkVOVF9NQVNLX1NPRlRfSEFMVEVEX01BU0sJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfRVZFTlRfTUFTS19TUEFEX1VOREVSRkxPV19NQVNLCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0VWRU5UX01BU0tfSU5URVJSVVBUX01BU0sJCSAoMUw8PDEyKQorCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfUFJPR1JBTV9DT1VOVEVSCQkJMHgwMDA4NTAxYworI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0lOU1RSVUNUSU9OCQkJMHgwMDA4NTAyMAorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0RBVEFfQUNDRVNTCQkJMHgwMDA4NTAyNAorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0lOVEVSUlVQVF9FTkFCTEUJCQkweDAwMDg1MDI4CisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfSU5URVJSVVBUX1ZFQ1RPUgkJCTB4MDAwODUwMmMKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9JTlRFUlJVUFRfU0FWRURfUEMJCTB4MDAwODUwMzAKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9IV19CUkVBS1BPSU5UCQkJMHgwMDA4NTAzNAorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0hXX0JSRUFLUE9JTlRfRElTQUJMRQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9IV19CUkVBS1BPSU5UX0FERFJFU1MJCSAoMHgzZmZmZmZmZkw8PDIpCisKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9ERUJVR19WRUNUX1BFRUsJCQkweDAwMDg1MDM4CisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfREVCVUdfVkVDVF9QRUVLXzFfVkFMVUUJCSAoMHg3ZmZMPDwwKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18xX1BFRUtfRU4JCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18xX1NFTAkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9UUEFUX0NQVV9ERUJVR19WRUNUX1BFRUtfMl9WQUxVRQkJICgweDdmZkw8PDE2KQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18yX1BFRUtfRU4JCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18yX1NFTAkJICgweGZMPDwyOCkKKworI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0xBU1RfQlJBTkNIX0FERFIJCQkweDAwMDg1MDQ4CisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfTEFTVF9CUkFOQ0hfQUREUl9UWVBFCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0xBU1RfQlJBTkNIX0FERFJfVFlQRV9KVU1QCSAoMEw8PDEpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfTEFTVF9CUkFOQ0hfQUREUl9UWVBFX0JSQU5DSAkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1RQQVRfQ1BVX0xBU1RfQlJBTkNIX0FERFJfTEJBCQkgKDB4M2ZmZmZmZmZMPDwyKQorCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfUkVHX0ZJTEUJCQkJMHgwMDA4NTIwMAorI2RlZmluZSBCTlgyX1RQQVRfRlRRX0RBVEEJCQkJMHgwMDA4NTNjMAorI2RlZmluZSBCTlgyX1RQQVRfRlRRX0NNRAkJCQkweDAwMDg1M2Y4CisjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ01EX09GRlNFVAkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX1RQQVRfRlRRX0NNRF9XUl9UT1AJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DTURfV1JfVE9QXzAJCQkgKDBMPDwxMCkKKyNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DTURfV1JfVE9QXzEJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DTURfU0ZUX1JFU0VUCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ01EX1JEX0RBVEEJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DTURfQUREX0lOVEVSVkVOCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ01EX0FERF9EQVRBCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ01EX0lOVEVSVkVORV9DTFIJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DTURfUE9QCQkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1RQQVRfRlRRX0NNRF9CVVNZCQkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ1RMCQkJCTB4MDAwODUzZmMKKyNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DVExfSU5URVJWRU5FCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DVExfT1ZFUkZMT1cJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1RQQVRfRlRRX0NUTF9GT1JDRV9JTlRFUlZFTkUJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ1RMX01BWF9ERVBUSAkJCSAoMHgzZmZMPDwxMikKKyNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DVExfQ1VSX0RFUFRICQkJICgweDNmZkw8PDIyKQorCisjZGVmaW5lIEJOWDJfVFBBVF9TQ1JBVENICQkJCTB4MDAwYTAwMDAKKworCisvKgorICogIHJ4cF9yZWcgZGVmaW5pdGlvbgorICogIG9mZnNldDogMHhjMDAwMAorICovCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9NT0RFCQkJCTB4MDAwYzUwMDAKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX01PREVfTE9DQUxfUlNUCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX01PREVfU1RFUF9FTkEJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1JYUF9DUFVfTU9ERV9QQUdFXzBfREFUQV9FTkEJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9NT0RFX1BBR0VfMF9JTlNUX0VOQQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX01PREVfTVNHX0JJVDEJCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX1JYUF9DUFVfTU9ERV9JTlRFUlJVUFRfRU5BCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX01PREVfU09GVF9IQUxUCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9NT0RFX0JBRF9EQVRBX0hBTFRfRU5BCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX01PREVfQkFEX0lOU1RfSEFMVF9FTkEJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JYUF9DUFVfTU9ERV9GSU9fQUJPUlRfSEFMVF9FTkEJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JYUF9DUFVfTU9ERV9TUEFEX1VOREVSRkxPV19IQUxUX0VOQQkgKDFMPDwxNSkKKworI2RlZmluZSBCTlgyX1JYUF9DUFVfU1RBVEUJCQkJMHgwMDBjNTAwNAorI2RlZmluZSBCTlgyX1JYUF9DUFVfU1RBVEVfQlJFQUtQT0lOVAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9CQURfSU5TVF9IQUxURUQJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9QQUdFXzBfREFUQV9IQUxURUQJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9QQUdFXzBfSU5TVF9IQUxURUQJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9CQURfREFUQV9BRERSX0hBTFRFRAkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX0JBRF9wY19IQUxURUQJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9BTElHTl9IQUxURUQJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX1JYUF9DUFVfU1RBVEVfRklPX0FCT1JUX0hBTFRFRAkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX1NPRlRfSEFMVEVECQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9TUEFEX1VOREVSRkxPVwkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9JTlRFUlJSVVBUCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9EQVRBX0FDQ0VTU19TVEFMTAkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9JTlNUX0ZFVENIX1NUQUxMCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX0JMT0NLRURfUkVBRAkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9FVkVOVF9NQVNLCQkJCTB4MDAwYzUwMDgKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0VWRU5UX01BU0tfQlJFQUtQT0lOVF9NQVNLCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1JYUF9DUFVfRVZFTlRfTUFTS19CQURfSU5TVF9IQUxURURfTUFTSwkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1JYUF9DUFVfRVZFTlRfTUFTS19QQUdFXzBfREFUQV9IQUxURURfTUFTSwkgKDFMPDwzKQorI2RlZmluZSBCTlgyX1JYUF9DUFVfRVZFTlRfTUFTS19QQUdFXzBfSU5TVF9IQUxURURfTUFTSwkgKDFMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9DUFVfRVZFTlRfTUFTS19CQURfREFUQV9BRERSX0hBTFRFRF9NQVNLCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9FVkVOVF9NQVNLX0JBRF9QQ19IQUxURURfTUFTSwkgKDFMPDw2KQorI2RlZmluZSBCTlgyX1JYUF9DUFVfRVZFTlRfTUFTS19BTElHTl9IQUxURURfTUFTSwkgKDFMPDw3KQorI2RlZmluZSBCTlgyX1JYUF9DUFVfRVZFTlRfTUFTS19GSU9fQUJPUlRfTUFTSwkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0VWRU5UX01BU0tfU09GVF9IQUxURURfTUFTSwkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0VWRU5UX01BU0tfU1BBRF9VTkRFUkZMT1dfTUFTSwkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0VWRU5UX01BU0tfSU5URVJSVVBUX01BU0sJCSAoMUw8PDEyKQorCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9QUk9HUkFNX0NPVU5URVIJCQkweDAwMGM1MDFjCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9JTlNUUlVDVElPTgkJCTB4MDAwYzUwMjAKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0RBVEFfQUNDRVNTCQkJMHgwMDBjNTAyNAorI2RlZmluZSBCTlgyX1JYUF9DUFVfSU5URVJSVVBUX0VOQUJMRQkJCTB4MDAwYzUwMjgKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0lOVEVSUlVQVF9WRUNUT1IJCQkweDAwMGM1MDJjCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9JTlRFUlJVUFRfU0FWRURfUEMJCQkweDAwMGM1MDMwCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9IV19CUkVBS1BPSU5UCQkJMHgwMDBjNTAzNAorI2RlZmluZSBCTlgyX1JYUF9DUFVfSFdfQlJFQUtQT0lOVF9ESVNBQkxFCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1JYUF9DUFVfSFdfQlJFQUtQT0lOVF9BRERSRVNTCQkgKDB4M2ZmZmZmZmZMPDwyKQorCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9ERUJVR19WRUNUX1BFRUsJCQkweDAwMGM1MDM4CisjZGVmaW5lIEJOWDJfUlhQX0NQVV9ERUJVR19WRUNUX1BFRUtfMV9WQUxVRQkJICgweDdmZkw8PDApCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9ERUJVR19WRUNUX1BFRUtfMV9QRUVLX0VOCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18xX1NFTAkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18yX1ZBTFVFCQkgKDB4N2ZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlhQX0NQVV9ERUJVR19WRUNUX1BFRUtfMl9QRUVLX0VOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18yX1NFTAkJICgweGZMPDwyOCkKKworI2RlZmluZSBCTlgyX1JYUF9DUFVfTEFTVF9CUkFOQ0hfQUREUgkJCTB4MDAwYzUwNDgKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0xBU1RfQlJBTkNIX0FERFJfVFlQRQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX0xBU1RfQlJBTkNIX0FERFJfVFlQRV9KVU1QCQkgKDBMPDwxKQorI2RlZmluZSBCTlgyX1JYUF9DUFVfTEFTVF9CUkFOQ0hfQUREUl9UWVBFX0JSQU5DSAkgKDFMPDwxKQorI2RlZmluZSBCTlgyX1JYUF9DUFVfTEFTVF9CUkFOQ0hfQUREUl9MQkEJCSAoMHgzZmZmZmZmZkw8PDIpCisKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX1JFR19GSUxFCQkJCTB4MDAwYzUyMDAKKyNkZWZpbmUgQk5YMl9SWFBfQ0ZUUV9EQVRBCQkJCTB4MDAwYzUzODAKKyNkZWZpbmUgQk5YMl9SWFBfQ0ZUUV9DTUQJCQkJMHgwMDBjNTNiOAorI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SWFBfQ0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ01EX1dSX1RPUF8wCQkJICgwTDw8MTApCisjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ01EX1dSX1RPUF8xCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ01EX1NGVF9SRVNFVAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NNRF9SRF9EQVRBCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ01EX0FERF9JTlRFUlZFTgkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NNRF9BRERfREFUQQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NNRF9JTlRFUlZFTkVfQ0xSCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ01EX1BPUAkJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SWFBfQ0ZUUV9DTURfQlVTWQkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NUTAkJCQkweDAwMGM1M2JjCisjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ1RMX0lOVEVSVkVORQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ1RMX09WRVJGTE9XCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9SWFBfQ0ZUUV9DVExfRk9SQ0VfSU5URVJWRU5FCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NUTF9NQVhfREVQVEgJCQkgKDB4M2ZmTDw8MTIpCisjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKKworI2RlZmluZSBCTlgyX1JYUF9GVFFfREFUQQkJCQkweDAwMGM1M2MwCisjZGVmaW5lIEJOWDJfUlhQX0ZUUV9DTUQJCQkJMHgwMDBjNTNmOAorI2RlZmluZSBCTlgyX1JYUF9GVFFfQ01EX09GRlNFVAkJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SWFBfRlRRX0NNRF9XUl9UT1AJCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfUlhQX0ZUUV9DTURfV1JfVE9QXzAJCQkgKDBMPDwxMCkKKyNkZWZpbmUgQk5YMl9SWFBfRlRRX0NNRF9XUl9UT1BfMQkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX1JYUF9GVFFfQ01EX1NGVF9SRVNFVAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JYUF9GVFFfQ01EX1JEX0RBVEEJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SWFBfRlRRX0NNRF9BRERfSU5URVJWRU4JCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SWFBfRlRRX0NNRF9BRERfREFUQQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JYUF9GVFFfQ01EX0lOVEVSVkVORV9DTFIJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SWFBfRlRRX0NNRF9QT1AJCQkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlhQX0ZUUV9DTURfQlVTWQkJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JYUF9GVFFfQ1RMCQkJCTB4MDAwYzUzZmMKKyNkZWZpbmUgQk5YMl9SWFBfRlRRX0NUTF9JTlRFUlZFTkUJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1JYUF9GVFFfQ1RMX09WRVJGTE9XCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9SWFBfRlRRX0NUTF9GT1JDRV9JTlRFUlZFTkUJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfUlhQX0ZUUV9DVExfTUFYX0RFUFRICQkJICgweDNmZkw8PDEyKQorI2RlZmluZSBCTlgyX1JYUF9GVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKKworI2RlZmluZSBCTlgyX1JYUF9TQ1JBVENICQkJCTB4MDAwZTAwMDAKKworCisvKgorICogIGNvbV9yZWcgZGVmaW5pdGlvbgorICogIG9mZnNldDogMHgxMDAwMDAKKyAqLworI2RlZmluZSBCTlgyX0NPTV9DUFVfTU9ERQkJCQkweDAwMTA1MDAwCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9NT0RFX0xPQ0FMX1JTVAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9NT0RFX1NURVBfRU5BCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX01PREVfUEFHRV8wX0RBVEFfRU5BCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0NPTV9DUFVfTU9ERV9QQUdFXzBfSU5TVF9FTkEJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9NT0RFX01TR19CSVQxCQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX01PREVfSU5URVJSVVBUX0VOQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9NT0RFX1NPRlRfSEFMVAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0NPTV9DUFVfTU9ERV9CQURfREFUQV9IQUxUX0VOQQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9NT0RFX0JBRF9JTlNUX0hBTFRfRU5BCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX01PREVfRklPX0FCT1JUX0hBTFRfRU5BCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX01PREVfU1BBRF9VTkRFUkZMT1dfSEFMVF9FTkEJICgxTDw8MTUpCisKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX1NUQVRFCQkJCTB4MDAxMDUwMDQKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX1NUQVRFX0JSRUFLUE9JTlQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfQkFEX0lOU1RfSEFMVEVECQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfUEFHRV8wX0RBVEFfSEFMVEVECQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfUEFHRV8wX0lOU1RfSEFMVEVECQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfQkFEX0RBVEFfQUREUl9IQUxURUQJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9CQURfcGNfSEFMVEVECQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfQUxJR05fSEFMVEVECQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX1NUQVRFX0ZJT19BQk9SVF9IQUxURUQJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9TT0ZUX0hBTFRFRAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfU1BBRF9VTkRFUkZMT1cJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfSU5URVJSUlVQVAkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfREFUQV9BQ0NFU1NfU1RBTEwJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfSU5TVF9GRVRDSF9TVEFMTAkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9CTE9DS0VEX1JFQUQJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX0NPTV9DUFVfRVZFTlRfTUFTSwkJCQkweDAwMTA1MDA4CisjZGVmaW5lIEJOWDJfQ09NX0NQVV9FVkVOVF9NQVNLX0JSRUFLUE9JTlRfTUFTSwkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0VWRU5UX01BU0tfQkFEX0lOU1RfSEFMVEVEX01BU0sJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0VWRU5UX01BU0tfUEFHRV8wX0RBVEFfSEFMVEVEX01BU0sJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0VWRU5UX01BU0tfUEFHRV8wX0lOU1RfSEFMVEVEX01BU0sJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0VWRU5UX01BU0tfQkFEX0RBVEFfQUREUl9IQUxURURfTUFTSwkgKDFMPDw1KQorI2RlZmluZSBCTlgyX0NPTV9DUFVfRVZFTlRfTUFTS19CQURfUENfSEFMVEVEX01BU0sJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0VWRU5UX01BU0tfQUxJR05fSEFMVEVEX01BU0sJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0VWRU5UX01BU0tfRklPX0FCT1JUX01BU0sJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9FVkVOVF9NQVNLX1NPRlRfSEFMVEVEX01BU0sJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9FVkVOVF9NQVNLX1NQQURfVU5ERVJGTE9XX01BU0sJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9FVkVOVF9NQVNLX0lOVEVSUlVQVF9NQVNLCQkgKDFMPDwxMikKKworI2RlZmluZSBCTlgyX0NPTV9DUFVfUFJPR1JBTV9DT1VOVEVSCQkJMHgwMDEwNTAxYworI2RlZmluZSBCTlgyX0NPTV9DUFVfSU5TVFJVQ1RJT04JCQkweDAwMTA1MDIwCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9EQVRBX0FDQ0VTUwkJCTB4MDAxMDUwMjQKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0lOVEVSUlVQVF9FTkFCTEUJCQkweDAwMTA1MDI4CisjZGVmaW5lIEJOWDJfQ09NX0NQVV9JTlRFUlJVUFRfVkVDVE9SCQkJMHgwMDEwNTAyYworI2RlZmluZSBCTlgyX0NPTV9DUFVfSU5URVJSVVBUX1NBVkVEX1BDCQkJMHgwMDEwNTAzMAorI2RlZmluZSBCTlgyX0NPTV9DUFVfSFdfQlJFQUtQT0lOVAkJCTB4MDAxMDUwMzQKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0hXX0JSRUFLUE9JTlRfRElTQUJMRQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0hXX0JSRUFLUE9JTlRfQUREUkVTUwkJICgweDNmZmZmZmZmTDw8MikKKworI2RlZmluZSBCTlgyX0NPTV9DUFVfREVCVUdfVkVDVF9QRUVLCQkJMHgwMDEwNTAzOAorI2RlZmluZSBCTlgyX0NPTV9DUFVfREVCVUdfVkVDVF9QRUVLXzFfVkFMVUUJCSAoMHg3ZmZMPDwwKQorI2RlZmluZSBCTlgyX0NPTV9DUFVfREVCVUdfVkVDVF9QRUVLXzFfUEVFS19FTgkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9ERUJVR19WRUNUX1BFRUtfMV9TRUwJCSAoMHhmTDw8MTIpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9ERUJVR19WRUNUX1BFRUtfMl9WQUxVRQkJICgweDdmZkw8PDE2KQorI2RlZmluZSBCTlgyX0NPTV9DUFVfREVCVUdfVkVDVF9QRUVLXzJfUEVFS19FTgkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9ERUJVR19WRUNUX1BFRUtfMl9TRUwJCSAoMHhmTDw8MjgpCisKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0xBU1RfQlJBTkNIX0FERFIJCQkweDAwMTA1MDQ4CisjZGVmaW5lIEJOWDJfQ09NX0NQVV9MQVNUX0JSQU5DSF9BRERSX1RZUEUJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9MQVNUX0JSQU5DSF9BRERSX1RZUEVfSlVNUAkJICgwTDw8MSkKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0xBU1RfQlJBTkNIX0FERFJfVFlQRV9CUkFOQ0gJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9DT01fQ1BVX0xBU1RfQlJBTkNIX0FERFJfTEJBCQkgKDB4M2ZmZmZmZmZMPDwyKQorCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9SRUdfRklMRQkJCQkweDAwMTA1MjAwCisjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9EQVRBCQkJCTB4MDAxMDUzNDAKKyNkZWZpbmUgQk5YMl9DT01fQ09NWFFfRlRRX0NNRAkJCQkweDAwMTA1Mzc4CisjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DTURfV1JfVE9QXzAJCQkgKDBMPDwxMCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NWFFfRlRRX0NNRF9XUl9UT1BfMQkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0NPTV9DT01YUV9GVFFfQ01EX1NGVF9SRVNFVAkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DTURfUkRfREFUQQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX0NPTV9DT01YUV9GVFFfQ01EX0FERF9JTlRFUlZFTgkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DTURfQUREX0RBVEEJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NWFFfRlRRX0NNRF9JTlRFUlZFTkVfQ0xSCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9DT01fQ09NWFFfRlRRX0NNRF9QT1AJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NWFFfRlRRX0NNRF9CVVNZCQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9DT01fQ09NWFFfRlRRX0NUTAkJCQkweDAwMTA1MzdjCisjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DVExfSU5URVJWRU5FCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0NPTV9DT01YUV9GVFFfQ1RMX09WRVJGTE9XCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9DT01fQ09NWFFfRlRRX0NUTF9GT1JDRV9JTlRFUlZFTkUJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DVExfTUFYX0RFUFRICQkgKDB4M2ZmTDw8MTIpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DVExfQ1VSX0RFUFRICQkgKDB4M2ZmTDw8MjIpCisKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0RBVEEJCQkJMHgwMDEwNTM4MAorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ01ECQkJCTB4MDAxMDUzYjgKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NNRF9XUl9UT1AJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NNRF9XUl9UT1BfMAkJCSAoMEw8PDEwKQorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ01EX1dSX1RPUF8xCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX0ZUUV9DTURfU0ZUX1JFU0VUCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NNRF9SRF9EQVRBCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX0ZUUV9DTURfQUREX0lOVEVSVkVOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NNRF9BRERfREFUQQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ01EX0lOVEVSVkVORV9DTFIJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ01EX1BPUAkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ01EX0JVU1kJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ1RMCQkJCTB4MDAxMDUzYmMKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NUTF9JTlRFUlZFTkUJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX0ZUUV9DVExfT1ZFUkZMT1cJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ1RMX0ZPUkNFX0lOVEVSVkVORQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NUTF9NQVhfREVQVEgJCSAoMHgzZmZMPDwxMikKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NUTF9DVVJfREVQVEgJCSAoMHgzZmZMPDwyMikKKworI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9EQVRBCQkJCTB4MDAxMDUzYzAKKyNkZWZpbmUgQk5YMl9DT01fQ09NUV9GVFFfQ01ECQkJCTB4MDAxMDUzZjgKKyNkZWZpbmUgQk5YMl9DT01fQ09NUV9GVFFfQ01EX09GRlNFVAkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0NNRF9XUl9UT1BfMAkJCSAoMEw8PDEwKQorI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9DTURfV1JfVE9QXzEJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NUV9GVFFfQ01EX1NGVF9SRVNFVAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9DTURfUkRfREFUQQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9DTURfQUREX0lOVEVSVkVOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9DT01fQ09NUV9GVFFfQ01EX0FERF9EQVRBCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0NNRF9JTlRFUlZFTkVfQ0xSCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9DT01fQ09NUV9GVFFfQ01EX1BPUAkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9DTURfQlVTWQkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0NUTAkJCQkweDAwMTA1M2ZjCisjZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0NUTF9JTlRFUlZFTkUJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9DVExfT1ZFUkZMT1cJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9DVExfRk9SQ0VfSU5URVJWRU5FCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9DVExfTUFYX0RFUFRICQkJICgweDNmZkw8PDEyKQorI2RlZmluZSBCTlgyX0NPTV9DT01RX0ZUUV9DVExfQ1VSX0RFUFRICQkJICgweDNmZkw8PDIyKQorCisjZGVmaW5lIEJOWDJfQ09NX1NDUkFUQ0gJCQkJMHgwMDEyMDAwMAorCisKKy8qCisgKiAgY3BfcmVnIGRlZmluaXRpb24KKyAqICBvZmZzZXQ6IDB4MTgwMDAwCisgKi8KKyNkZWZpbmUgQk5YMl9DUF9DUFVfTU9ERQkJCQkweDAwMTg1MDAwCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX01PREVfTE9DQUxfUlNUCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfTU9ERV9TVEVQX0VOQQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX01PREVfUEFHRV8wX0RBVEFfRU5BCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0NQX0NQVV9NT0RFX1BBR0VfMF9JTlNUX0VOQQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9DUF9DUFVfTU9ERV9NU0dfQklUMQkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX01PREVfSU5URVJSVVBUX0VOQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX01PREVfU09GVF9IQUxUCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX01PREVfQkFEX0RBVEFfSEFMVF9FTkEJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0NQX0NQVV9NT0RFX0JBRF9JTlNUX0hBTFRfRU5BCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9DUF9DUFVfTU9ERV9GSU9fQUJPUlRfSEFMVF9FTkEJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX0NQX0NQVV9NT0RFX1NQQURfVU5ERVJGTE9XX0hBTFRfRU5BCSAoMUw8PDE1KQorCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX1NUQVRFCQkJCTB4MDAxODUwMDQKKyNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfQlJFQUtQT0lOVAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX1NUQVRFX0JBRF9JTlNUX0hBTFRFRAkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfUEFHRV8wX0RBVEFfSEFMVEVECQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0NQX0NQVV9TVEFURV9QQUdFXzBfSU5TVF9IQUxURUQJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX1NUQVRFX0JBRF9EQVRBX0FERFJfSEFMVEVECQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX0NQX0NQVV9TVEFURV9CQURfcGNfSEFMVEVECQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfQUxJR05fSEFMVEVECQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfRklPX0FCT1JUX0hBTFRFRAkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfU09GVF9IQUxURUQJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfU1BBRF9VTkRFUkZMT1cJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0NQX0NQVV9TVEFURV9JTlRFUlJSVVBUCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX1NUQVRFX0RBVEFfQUNDRVNTX1NUQUxMCQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfSU5TVF9GRVRDSF9TVEFMTAkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX1NUQVRFX0JMT0NLRURfUkVBRAkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0VWRU5UX01BU0sJCQkJMHgwMDE4NTAwOAorI2RlZmluZSBCTlgyX0NQX0NQVV9FVkVOVF9NQVNLX0JSRUFLUE9JTlRfTUFTSwkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfRVZFTlRfTUFTS19CQURfSU5TVF9IQUxURURfTUFTSwkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0NQX0NQVV9FVkVOVF9NQVNLX1BBR0VfMF9EQVRBX0hBTFRFRF9NQVNLCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0VWRU5UX01BU0tfUEFHRV8wX0lOU1RfSEFMVEVEX01BU0sJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfRVZFTlRfTUFTS19CQURfREFUQV9BRERSX0hBTFRFRF9NQVNLCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0VWRU5UX01BU0tfQkFEX1BDX0hBTFRFRF9NQVNLCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0VWRU5UX01BU0tfQUxJR05fSEFMVEVEX01BU0sJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9DUF9DUFVfRVZFTlRfTUFTS19GSU9fQUJPUlRfTUFTSwkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfRVZFTlRfTUFTS19TT0ZUX0hBTFRFRF9NQVNLCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfRVZFTlRfTUFTS19TUEFEX1VOREVSRkxPV19NQVNLCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0NQX0NQVV9FVkVOVF9NQVNLX0lOVEVSUlVQVF9NQVNLCQkgKDFMPDwxMikKKworI2RlZmluZSBCTlgyX0NQX0NQVV9QUk9HUkFNX0NPVU5URVIJCQkweDAwMTg1MDFjCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0lOU1RSVUNUSU9OCQkJCTB4MDAxODUwMjAKKyNkZWZpbmUgQk5YMl9DUF9DUFVfREFUQV9BQ0NFU1MJCQkJMHgwMDE4NTAyNAorI2RlZmluZSBCTlgyX0NQX0NQVV9JTlRFUlJVUFRfRU5BQkxFCQkJMHgwMDE4NTAyOAorI2RlZmluZSBCTlgyX0NQX0NQVV9JTlRFUlJVUFRfVkVDVE9SCQkJMHgwMDE4NTAyYworI2RlZmluZSBCTlgyX0NQX0NQVV9JTlRFUlJVUFRfU0FWRURfUEMJCQkweDAwMTg1MDMwCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0hXX0JSRUFLUE9JTlQJCQkweDAwMTg1MDM0CisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0hXX0JSRUFLUE9JTlRfRElTQUJMRQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfSFdfQlJFQUtQT0lOVF9BRERSRVNTCQkgKDB4M2ZmZmZmZmZMPDwyKQorCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0RFQlVHX1ZFQ1RfUEVFSwkJCTB4MDAxODUwMzgKKyNkZWZpbmUgQk5YMl9DUF9DUFVfREVCVUdfVkVDVF9QRUVLXzFfVkFMVUUJCSAoMHg3ZmZMPDwwKQorI2RlZmluZSBCTlgyX0NQX0NQVV9ERUJVR19WRUNUX1BFRUtfMV9QRUVLX0VOCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfREVCVUdfVkVDVF9QRUVLXzFfU0VMCQkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX0NQX0NQVV9ERUJVR19WRUNUX1BFRUtfMl9WQUxVRQkJICgweDdmZkw8PDE2KQorI2RlZmluZSBCTlgyX0NQX0NQVV9ERUJVR19WRUNUX1BFRUtfMl9QRUVLX0VOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9DUF9DUFVfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkgKDB4Zkw8PDI4KQorCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0xBU1RfQlJBTkNIX0FERFIJCQkweDAwMTg1MDQ4CisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0xBU1RfQlJBTkNIX0FERFJfVFlQRQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfTEFTVF9CUkFOQ0hfQUREUl9UWVBFX0pVTVAJCSAoMEw8PDEpCisjZGVmaW5lIEJOWDJfQ1BfQ1BVX0xBU1RfQlJBTkNIX0FERFJfVFlQRV9CUkFOQ0gJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9DUF9DUFVfTEFTVF9CUkFOQ0hfQUREUl9MQkEJCSAoMHgzZmZmZmZmZkw8PDIpCisKKyNkZWZpbmUgQk5YMl9DUF9DUFVfUkVHX0ZJTEUJCQkJMHgwMDE4NTIwMAorI2RlZmluZSBCTlgyX0NQX0NQUV9GVFFfREFUQQkJCQkweDAwMTg1M2MwCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX0ZUUV9DTUQJCQkJMHgwMDE4NTNmOAorI2RlZmluZSBCTlgyX0NQX0NQUV9GVFFfQ01EX09GRlNFVAkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0NQX0NQUV9GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0NQX0NQUV9GVFFfQ01EX1dSX1RPUF8wCQkJICgwTDw8MTApCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX0ZUUV9DTURfV1JfVE9QXzEJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NNRF9TRlRfUkVTRVQJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NNRF9SRF9EQVRBCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX0ZUUV9DTURfQUREX0lOVEVSVkVOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NNRF9BRERfREFUQQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX0NQX0NQUV9GVFFfQ01EX0lOVEVSVkVORV9DTFIJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX0NQX0NQUV9GVFFfQ01EX1BPUAkJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NNRF9CVVNZCQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NUTAkJCQkweDAwMTg1M2ZjCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX0ZUUV9DVExfSU5URVJWRU5FCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NUTF9PVkVSRkxPVwkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX0ZUUV9DVExfRk9SQ0VfSU5URVJWRU5FCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0NQX0NQUV9GVFFfQ1RMX01BWF9ERVBUSAkJCSAoMHgzZmZMPDwxMikKKyNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NUTF9DVVJfREVQVEgJCQkgKDB4M2ZmTDw8MjIpCisKKyNkZWZpbmUgQk5YMl9DUF9TQ1JBVENICQkJCQkweDAwMWEwMDAwCisKKworLyoKKyAqICBtY3BfcmVnIGRlZmluaXRpb24KKyAqICBvZmZzZXQ6IDB4MTQwMDAwCisgKi8KKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX01PREUJCQkJMHgwMDE0NTAwMAorI2RlZmluZSBCTlgyX01DUF9DUFVfTU9ERV9MT0NBTF9SU1QJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01DUF9DUFVfTU9ERV9TVEVQX0VOQQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9NT0RFX1BBR0VfMF9EQVRBX0VOQQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX01PREVfUEFHRV8wX0lOU1RfRU5BCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01DUF9DUFVfTU9ERV9NU0dfQklUMQkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9NT0RFX0lOVEVSUlVQVF9FTkEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX01DUF9DUFVfTU9ERV9TT0ZUX0hBTFQJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX01PREVfQkFEX0RBVEFfSEFMVF9FTkEJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01DUF9DUFVfTU9ERV9CQURfSU5TVF9IQUxUX0VOQQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9NT0RFX0ZJT19BQk9SVF9IQUxUX0VOQQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9NT0RFX1NQQURfVU5ERVJGTE9XX0hBTFRfRU5BCSAoMUw8PDE1KQorCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9TVEFURQkJCQkweDAwMTQ1MDA0CisjZGVmaW5lIEJOWDJfTUNQX0NQVV9TVEFURV9CUkVBS1BPSU5UCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX0JBRF9JTlNUX0hBTFRFRAkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX1BBR0VfMF9EQVRBX0hBTFRFRAkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX1BBR0VfMF9JTlNUX0hBTFRFRAkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX0JBRF9EQVRBX0FERFJfSEFMVEVECQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfQkFEX3BjX0hBTFRFRAkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX0FMSUdOX0hBTFRFRAkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9TVEFURV9GSU9fQUJPUlRfSEFMVEVECQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfU09GVF9IQUxURUQJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX1NQQURfVU5ERVJGTE9XCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX0lOVEVSUlJVUFQJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX0RBVEFfQUNDRVNTX1NUQUxMCQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX0lOU1RfRkVUQ0hfU1RBTEwJCSAoMUw8PDE1KQorI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfQkxPQ0tFRF9SRUFECQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX0VWRU5UX01BU0sJCQkJMHgwMDE0NTAwOAorI2RlZmluZSBCTlgyX01DUF9DUFVfRVZFTlRfTUFTS19CUkVBS1BPSU5UX01BU0sJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9FVkVOVF9NQVNLX0JBRF9JTlNUX0hBTFRFRF9NQVNLCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9FVkVOVF9NQVNLX1BBR0VfMF9EQVRBX0hBTFRFRF9NQVNLCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9FVkVOVF9NQVNLX1BBR0VfMF9JTlNUX0hBTFRFRF9NQVNLCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9FVkVOVF9NQVNLX0JBRF9EQVRBX0FERFJfSEFMVEVEX01BU0sJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX0VWRU5UX01BU0tfQkFEX1BDX0hBTFRFRF9NQVNLCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9FVkVOVF9NQVNLX0FMSUdOX0hBTFRFRF9NQVNLCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9FVkVOVF9NQVNLX0ZJT19BQk9SVF9NQVNLCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01DUF9DUFVfRVZFTlRfTUFTS19TT0ZUX0hBTFRFRF9NQVNLCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01DUF9DUFVfRVZFTlRfTUFTS19TUEFEX1VOREVSRkxPV19NQVNLCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01DUF9DUFVfRVZFTlRfTUFTS19JTlRFUlJVUFRfTUFTSwkJICgxTDw8MTIpCisKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1BST0dSQU1fQ09VTlRFUgkJCTB4MDAxNDUwMWMKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX0lOU1RSVUNUSU9OCQkJMHgwMDE0NTAyMAorI2RlZmluZSBCTlgyX01DUF9DUFVfREFUQV9BQ0NFU1MJCQkweDAwMTQ1MDI0CisjZGVmaW5lIEJOWDJfTUNQX0NQVV9JTlRFUlJVUFRfRU5BQkxFCQkJMHgwMDE0NTAyOAorI2RlZmluZSBCTlgyX01DUF9DUFVfSU5URVJSVVBUX1ZFQ1RPUgkJCTB4MDAxNDUwMmMKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX0lOVEVSUlVQVF9TQVZFRF9QQwkJCTB4MDAxNDUwMzAKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX0hXX0JSRUFLUE9JTlQJCQkweDAwMTQ1MDM0CisjZGVmaW5lIEJOWDJfTUNQX0NQVV9IV19CUkVBS1BPSU5UX0RJU0FCTEUJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9IV19CUkVBS1BPSU5UX0FERFJFU1MJCSAoMHgzZmZmZmZmZkw8PDIpCisKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX0RFQlVHX1ZFQ1RfUEVFSwkJCTB4MDAxNDUwMzgKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18xX1ZBTFVFCQkgKDB4N2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18xX1BFRUtfRU4JCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01DUF9DUFVfREVCVUdfVkVDVF9QRUVLXzFfU0VMCQkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX01DUF9DUFVfREVCVUdfVkVDVF9QRUVLXzJfVkFMVUUJCSAoMHg3ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9NQ1BfQ1BVX0RFQlVHX1ZFQ1RfUEVFS18yX1BFRUtfRU4JCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01DUF9DUFVfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkgKDB4Zkw8PDI4KQorCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9MQVNUX0JSQU5DSF9BRERSCQkJMHgwMDE0NTA0OAorI2RlZmluZSBCTlgyX01DUF9DUFVfTEFTVF9CUkFOQ0hfQUREUl9UWVBFCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01DUF9DUFVfTEFTVF9CUkFOQ0hfQUREUl9UWVBFX0pVTVAJCSAoMEw8PDEpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9MQVNUX0JSQU5DSF9BRERSX1RZUEVfQlJBTkNICSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUNQX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKKworI2RlZmluZSBCTlgyX01DUF9DUFVfUkVHX0ZJTEUJCQkJMHgwMDE0NTIwMAorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9EQVRBCQkJCTB4MDAxNDUzYzAKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQUV9GVFFfQ01ECQkJCTB4MDAxNDUzZjgKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQUV9GVFFfQ01EX09GRlNFVAkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUNQX01DUFFfRlRRX0NNRF9XUl9UT1BfMAkJCSAoMEw8PDEwKQorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DTURfV1JfVE9QXzEJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQUV9GVFFfQ01EX1NGVF9SRVNFVAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DTURfUkRfREFUQQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DTURfQUREX0lOVEVSVkVOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQUV9GVFFfQ01EX0FERF9EQVRBCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUNQX01DUFFfRlRRX0NNRF9JTlRFUlZFTkVfQ0xSCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQUV9GVFFfQ01EX1BPUAkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DTURfQlVTWQkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfTUNQX01DUFFfRlRRX0NUTAkJCQkweDAwMTQ1M2ZjCisjZGVmaW5lIEJOWDJfTUNQX01DUFFfRlRRX0NUTF9JTlRFUlZFTkUJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DVExfT1ZFUkZMT1cJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DVExfRk9SQ0VfSU5URVJWRU5FCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DVExfTUFYX0RFUFRICQkJICgweDNmZkw8PDEyKQorI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DVExfQ1VSX0RFUFRICQkJICgweDNmZkw8PDIyKQorCisjZGVmaW5lIEJOWDJfTUNQX1JPTQkJCQkJMHgwMDE1MDAwMAorI2RlZmluZSBCTlgyX01DUF9TQ1JBVENICQkJCTB4MDAxNjAwMDAKKworI2RlZmluZSBCTlgyX1NITV9IRFJfU0lHTkFUVVJFCQkJCUJOWDJfTUNQX1NDUkFUQ0gKKyNkZWZpbmUgQk5YMl9TSE1fSERSX1NJR05BVFVSRV9TSUdfTUFTSwkJCSAweGZmZmYwMDAwCisjZGVmaW5lIEJOWDJfU0hNX0hEUl9TSUdOQVRVUkVfU0lHCQkJIDB4NTM1MzAwMDAKKyNkZWZpbmUgQk5YMl9TSE1fSERSX1NJR05BVFVSRV9WRVJfTUFTSwkJCSAweDAwMDAwMGZmCisjZGVmaW5lIEJOWDJfU0hNX0hEUl9TSUdOQVRVUkVfVkVSX09ORQkJCSAweDAwMDAwMDAxCisKKyNkZWZpbmUgQk5YMl9TSE1fSERSX0FERFJfMAkJCQlCTlgyX01DUF9TQ1JBVENIICsgNAorI2RlZmluZSBCTlgyX1NITV9IRFJfQUREUl8xCQkJCUJOWDJfTUNQX1NDUkFUQ0ggKyA4CisKKworI2RlZmluZSBOVU1fTUNfSEFTSF9SRUdJU1RFUlMgICA4CisKKworLyogUEhZX0lEMTogYml0cyAzMS0xNjsgUEhZX0lEMjogYml0cyAxNS0wLiAgKi8KKyNkZWZpbmUgUEhZX0JDTTU3MDZfUEhZX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjA2MTYwCisKKyNkZWZpbmUgUEhZX0lEKGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlkKSAmIDB4ZmZmZmZmZjApCisjZGVmaW5lIFBIWV9SRVZfSUQoaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpZCkgJiAweGYpCisKKy8qIDU3MDggU2VyZGVzIFBIWSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBCQ001NzA4U19VUDEJCQkJMHhiCisKKyNkZWZpbmUgQkNNNTcwOFNfVVAxXzJHNQkJCTB4MQorCisjZGVmaW5lIEJDTTU3MDhTX0JMS19BRERSCQkJMHgxZgorCisjZGVmaW5lIEJDTTU3MDhTX0JMS19BRERSX0RJRwkJCTB4MDAwMAorI2RlZmluZSBCQ001NzA4U19CTEtfQUREUl9ESUczCQkJMHgwMDAyCisjZGVmaW5lIEJDTTU3MDhTX0JMS19BRERSX1RYX01JU0MJCTB4MDAwNQorCisvKiBEaWdpdGFsIEJsb2NrICovCisjZGVmaW5lIEJDTTU3MDhTXzEwMDBYX0NUTDEJCQkweDEwCisKKyNkZWZpbmUgQkNNNTcwOFNfMTAwMFhfQ1RMMV9GSUJFUl9NT0RFCQkweDAwMDEKKyNkZWZpbmUgQkNNNTcwOFNfMTAwMFhfQ1RMMV9BVVRPREVUX0VOCQkweDAwMTAKKworI2RlZmluZSBCQ001NzA4U18xMDAwWF9DVEwyCQkJMHgxMQorCisjZGVmaW5lIEJDTTU3MDhTXzEwMDBYX0NUTDJfUExMRUxfREVUX0VOCTB4MDAwMQorCisjZGVmaW5lIEJDTTU3MDhTXzEwMDBYX1NUQVQxCQkJMHgxNAorCisjZGVmaW5lIEJDTTU3MDhTXzEwMDBYX1NUQVQxX1NHTUlJCQkweDAwMDEKKyNkZWZpbmUgQkNNNTcwOFNfMTAwMFhfU1RBVDFfTElOSwkJMHgwMDAyCisjZGVmaW5lIEJDTTU3MDhTXzEwMDBYX1NUQVQxX0ZECQkJMHgwMDA0CisjZGVmaW5lIEJDTTU3MDhTXzEwMDBYX1NUQVQxX1NQRUVEX01BU0sJCTB4MDAxOAorI2RlZmluZSBCQ001NzA4U18xMDAwWF9TVEFUMV9TUEVFRF8xMAkJMHgwMDAwCisjZGVmaW5lIEJDTTU3MDhTXzEwMDBYX1NUQVQxX1NQRUVEXzEwMAkJMHgwMDA4CisjZGVmaW5lIEJDTTU3MDhTXzEwMDBYX1NUQVQxX1NQRUVEXzFHCQkweDAwMTAKKyNkZWZpbmUgQkNNNTcwOFNfMTAwMFhfU1RBVDFfU1BFRURfMkc1CQkweDAwMTgKKyNkZWZpbmUgQkNNNTcwOFNfMTAwMFhfU1RBVDFfVFhfUEFVU0UJCTB4MDAyMAorI2RlZmluZSBCQ001NzA4U18xMDAwWF9TVEFUMV9SWF9QQVVTRQkJMHgwMDQwCisKKy8qIERpZ2l0YWwzIEJsb2NrICovCisjZGVmaW5lIEJDTTU3MDhTX0RJR18zXzAJCQkweDEwCisKKyNkZWZpbmUgQkNNNTcwOFNfRElHXzNfMF9VU0VfSUVFRQkJMHgwMDAxCisKKy8qIFR4L01pc2MgQmxvY2sgKi8KKyNkZWZpbmUgQkNNNTcwOFNfVFhfQUNUTDEJCQkweDE1CisKKyNkZWZpbmUgQkNNNTcwOFNfVFhfQUNUTDFfRFJJVkVSX1ZDTQkJMHgzMAorCisjZGVmaW5lIEJDTTU3MDhTX1RYX0FDVEwzCQkJMHgxNworCisjZGVmaW5lIE1JTl9FVEhFUk5FVF9QQUNLRVRfU0laRQk2MAorI2RlZmluZSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkUJMTUxNAorI2RlZmluZSBNQVhfRVRIRVJORVRfSlVNQk9fUEFDS0VUX1NJWkUJOTAxNAorCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNICQkJOTIKKworI2RlZmluZSBETUFfUkVBRF9DSEFOUwk1CisjZGVmaW5lIERNQV9XUklURV9DSEFOUwkzCisKKyNkZWZpbmUgQkNNX1BBR0VfQklUUwkxMgorI2RlZmluZSBCQ01fUEFHRV9TSVpFCSgxIDw8IEJDTV9QQUdFX0JJVFMpCisKKyNkZWZpbmUgVFhfREVTQ19DTlQgIChCQ01fUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCB0eF9iZCkpCisjZGVmaW5lIE1BWF9UWF9ERVNDX0NOVCAoVFhfREVTQ19DTlQgLSAxKQorCisjZGVmaW5lIE1BWF9SWF9SSU5HUwk0CisjZGVmaW5lIFJYX0RFU0NfQ05UICAoQkNNX1BBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgcnhfYmQpKQorI2RlZmluZSBNQVhfUlhfREVTQ19DTlQgKFJYX0RFU0NfQ05UIC0gMSkKKyNkZWZpbmUgTUFYX1RPVEFMX1JYX0RFU0NfQ05UIChNQVhfUlhfREVTQ19DTlQgKiBNQVhfUlhfUklOR1MpCisKKyNkZWZpbmUgTkVYVF9UWF9CRCh4KSAoKCh4KSAmIChNQVhfVFhfREVTQ19DTlQgLSAxKSkgPT0JCQlcCisJCShNQVhfVFhfREVTQ19DTlQgLSAxKSkgPwkJCQlcCisJKHgpICsgMiA6ICh4KSArIDEKKworI2RlZmluZSBQUkVWX1RYX0JEKHgpICgoKCh4KS0xKSAmIChNQVhfVFhfREVTQ19DTlQpKSA9PQkJCVwKKwkJKE1BWF9UWF9ERVNDX0NOVCkpID8JCQkJXAorCSh4KSAtIDIgOiAoeCkgLSAxCisKKyNkZWZpbmUgVFhfUklOR19JRFgoeCkgKCh4KSAmIE1BWF9UWF9ERVNDX0NOVCkKKworI2RlZmluZSBORVhUX1JYX0JEKHgpICgoKHgpICYgKE1BWF9SWF9ERVNDX0NOVCAtIDEpKSA9PQkJCVwKKwkJKE1BWF9SWF9ERVNDX0NOVCAtIDEpKSA/CQkJCVwKKwkoeCkgKyAyIDogKHgpICsgMQorCisjZGVmaW5lIFJYX1JJTkdfSURYKHgpICgoeCkgJiBicC0+cnhfbWF4X3JpbmdfaWR4KQorCisvLyNkZWZpbmUgUlhfUklORyh4KSAoKCh4KSAmIH5NQVhfUlhfREVTQ19DTlQpID4+IDgpCisjZGVmaW5lIFJYX0lEWCh4KSAoKHgpICYgTUFYX1JYX0RFU0NfQ05UKQorCisvKiBDb250ZXh0IHNpemUuICovCisjZGVmaW5lIENUWF9TSElGVCAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIENUWF9TSVpFICAgICAgICAgICAgICAgICAgICAoMSA8PCBDVFhfU0hJRlQpCisjZGVmaW5lIENUWF9NQVNLICAgICAgICAgICAgICAgICAgICAoQ1RYX1NJWkUgLSAxKQorI2RlZmluZSBHRVRfQ0lEX0FERFIoX2NpZCkgICAgICAgICAgKChfY2lkKSA8PCBDVFhfU0hJRlQpCisjZGVmaW5lIEdFVF9DSUQoX2NpZF9hZGRyKSAgICAgICAgICAoKF9jaWRfYWRkcikgPj4gQ1RYX1NISUZUKQorCisjZGVmaW5lIFBIWV9DVFhfU0hJRlQgICAgICAgICAgICAgICA2CisjZGVmaW5lIFBIWV9DVFhfU0laRSAgICAgICAgICAgICAgICAoMSA8PCBQSFlfQ1RYX1NISUZUKQorI2RlZmluZSBQSFlfQ1RYX01BU0sgICAgICAgICAgICAgICAgKFBIWV9DVFhfU0laRSAtIDEpCisjZGVmaW5lIEdFVF9QQ0lEX0FERFIoX3BjaWQpICAgICAgICAoKF9wY2lkKSA8PCBQSFlfQ1RYX1NISUZUKQorI2RlZmluZSBHRVRfUENJRChfcGNpZF9hZGRyKSAgICAgICAgKChfcGNpZF9hZGRyKSA+PiBQSFlfQ1RYX1NISUZUKQorCisjZGVmaW5lIE1CX0tFUk5FTF9DVFhfU0hJRlQgICAgICAgICA4CisjZGVmaW5lIE1CX0tFUk5FTF9DVFhfU0laRSAgICAgICAgICAoMSA8PCBNQl9LRVJORUxfQ1RYX1NISUZUKQorI2RlZmluZSBNQl9LRVJORUxfQ1RYX01BU0sgICAgICAgICAgKE1CX0tFUk5FTF9DVFhfU0laRSAtIDEpCisjZGVmaW5lIE1CX0dFVF9DSURfQUREUihfY2lkKSAgICAgICAoMHgxMDAwMCArICgoX2NpZCkgPDwgTUJfS0VSTkVMX0NUWF9TSElGVCkpCisKKyNkZWZpbmUgTUFYX0NJRF9DTlQgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBNQVhfQ0lEX0FERFIgICAgICAgICAgICAgICAgKEdFVF9DSURfQUREUihNQVhfQ0lEX0NOVCkpCisjZGVmaW5lIElOVkFMSURfQ0lEX0FERFIgICAgICAgICAgICAweGZmZmZmZmZmCisKKyNkZWZpbmUgVFhfQ0lECQkxNgorI2RlZmluZSBSWF9DSUQJCTAKKworI2RlZmluZSBNQl9UWF9DSURfQUREUglNQl9HRVRfQ0lEX0FERFIoVFhfQ0lEKQorI2RlZmluZSBNQl9SWF9DSURfQUREUglNQl9HRVRfQ0lEX0FERFIoUlhfQ0lEKQorCisjaWYgMAorc3RydWN0IHN3X2JkIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCit9OworI2VuZGlmCisKKy8qIEJ1ZmZlcmVkIGZsYXNoIChBdG1lbDogQVQ0NURCMDExQikgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgU0VFUFJPTV9QQUdFX0JJVFMJCQkyCisjZGVmaW5lIFNFRVBST01fUEhZX1BBR0VfU0laRQkJCSgxIDw8IFNFRVBST01fUEFHRV9CSVRTKQorI2RlZmluZSBTRUVQUk9NX0JZVEVfQUREUl9NQVNLCQkJKFNFRVBST01fUEhZX1BBR0VfU0laRS0xKQorI2RlZmluZSBTRUVQUk9NX1BBR0VfU0laRQkJCTQKKyNkZWZpbmUgU0VFUFJPTV9UT1RBTF9TSVpFCQkJNjU1MzYKKworI2RlZmluZSBCVUZGRVJFRF9GTEFTSF9QQUdFX0JJVFMJCTkKKyNkZWZpbmUgQlVGRkVSRURfRkxBU0hfUEhZX1BBR0VfU0laRQkJKDEgPDwgQlVGRkVSRURfRkxBU0hfUEFHRV9CSVRTKQorI2RlZmluZSBCVUZGRVJFRF9GTEFTSF9CWVRFX0FERFJfTUFTSwkJKEJVRkZFUkVEX0ZMQVNIX1BIWV9QQUdFX1NJWkUtMSkKKyNkZWZpbmUgQlVGRkVSRURfRkxBU0hfUEFHRV9TSVpFCQkyNjQKKyNkZWZpbmUgQlVGRkVSRURfRkxBU0hfVE9UQUxfU0laRQkJMHgyMTAwMAorCisjZGVmaW5lIFNBSUZVTl9GTEFTSF9QQUdFX0JJVFMJCQk4CisjZGVmaW5lIFNBSUZVTl9GTEFTSF9QSFlfUEFHRV9TSVpFCQkoMSA8PCBTQUlGVU5fRkxBU0hfUEFHRV9CSVRTKQorI2RlZmluZSBTQUlGVU5fRkxBU0hfQllURV9BRERSX01BU0sJCShTQUlGVU5fRkxBU0hfUEhZX1BBR0VfU0laRS0xKQorI2RlZmluZSBTQUlGVU5fRkxBU0hfUEFHRV9TSVpFCQkJMjU2CisjZGVmaW5lIFNBSUZVTl9GTEFTSF9CQVNFX1RPVEFMX1NJWkUJCTY1NTM2CisKKyNkZWZpbmUgU1RfTUlDUk9fRkxBU0hfUEFHRV9CSVRTCQk4CisjZGVmaW5lIFNUX01JQ1JPX0ZMQVNIX1BIWV9QQUdFX1NJWkUJCSgxIDw8IFNUX01JQ1JPX0ZMQVNIX1BBR0VfQklUUykKKyNkZWZpbmUgU1RfTUlDUk9fRkxBU0hfQllURV9BRERSX01BU0sJCShTVF9NSUNST19GTEFTSF9QSFlfUEFHRV9TSVpFLTEpCisjZGVmaW5lIFNUX01JQ1JPX0ZMQVNIX1BBR0VfU0laRQkJMjU2CisjZGVmaW5lIFNUX01JQ1JPX0ZMQVNIX0JBU0VfVE9UQUxfU0laRQkJNjU1MzYKKworI2RlZmluZSBOVlJBTV9USU1FT1VUX0NPVU5UCQkJMzAwMDAKKworCisjZGVmaW5lIEZMQVNIX1NUUkFQX01BU0sJCQkoQk5YMl9OVk1fQ0ZHMV9GTEFTSF9NT0RFICAgfCBcCisJCQkJCQkgQk5YMl9OVk1fQ0ZHMV9CVUZGRVJfTU9ERSAgfCBcCisJCQkJCQkgQk5YMl9OVk1fQ0ZHMV9QUk9URUNUX01PREUgfCBcCisJCQkJCQkgQk5YMl9OVk1fQ0ZHMV9GTEFTSF9TSVpFKQorCisjZGVmaW5lIEZMQVNIX0JBQ0tVUF9TVFJBUF9NQVNLCQkJKDB4ZiA8PCAyNikKKworc3RydWN0IGZsYXNoX3NwZWMgeworCXUzMiBzdHJhcHBpbmc7CisJdTMyIGNvbmZpZzE7CisJdTMyIGNvbmZpZzI7CisJdTMyIGNvbmZpZzM7CisJdTMyIHdyaXRlMTsKKwl1MzIgYnVmZmVyZWQ7CisJdTMyIHBhZ2VfYml0czsKKwl1MzIgcGFnZV9zaXplOworCXUzMiBhZGRyX21hc2s7CisJdTMyIHRvdGFsX3NpemU7CisJY2hhciAgKm5hbWU7Cit9OworCitzdHJ1Y3QgYm54MiB7CisJLyogRmllbGRzIHVzZWQgaW4gdGhlIHR4IGFuZCBpbnRyL25hcGkgcGVyZm9ybWFuY2UgcGF0aHMgYXJlIGdyb3VwZWQgKi8KKwkvKiB0b2dldGhlciBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUuICovCisJdm9pZCAvKl9faW9tZW0qLwkJKnJlZ3ZpZXc7CisKKwlzdHJ1Y3QgbmljCQkqbmljOworCXN0cnVjdCBwY2lfZGV2aWNlCSpwZGV2OworCisJLyogYXRvbWljX3QJCWludHJfc2VtOyAqLworCisJc3RydWN0IHN0YXR1c19ibG9jawkqc3RhdHVzX2JsazsKKwl1MzIgCQkJbGFzdF9zdGF0dXNfaWR4OworCisJdTMyCQkJZmxhZ3M7CisjZGVmaW5lIFBDSVhfRkxBRwkJCTEKKyNkZWZpbmUgUENJXzMyQklUX0ZMQUcJCQkyCisjZGVmaW5lIE9ORV9URE1BX0ZMQUcJCQk0CS8qIG5vIGxvbmdlciB1c2VkICovCisjZGVmaW5lIE5PX1dPTF9GTEFHCQkJOAorI2RlZmluZSBVU0lOR19EQUNfRkxBRwkJCTB4MTAKKyNkZWZpbmUgVVNJTkdfTVNJX0ZMQUcJCQkweDIwCisjZGVmaW5lIEFTRl9FTkFCTEVfRkxBRwkJCTB4NDAKKworCS8qIFB1dCB0eCBwcm9kdWNlciBhbmQgY29uc3VtZXIgZmllbGRzIGluIHNlcGFyYXRlIGNhY2hlIGxpbmVzLiAqLworCXUzMgkJdHhfcHJvZF9ic2VxIF9fYXR0cmlidXRlX18oKGFsaWduZWQoTDFfQ0FDSEVfQllURVMpKSk7CisJdTE2CQl0eF9wcm9kOworCisJc3RydWN0IHR4X2JkCSp0eF9kZXNjX3Jpbmc7CisJc3RydWN0IHN3X2JkCSp0eF9idWZfcmluZzsKKwlpbnQJCXR4X3Jpbmdfc2l6ZTsKKworCXUxNgkJdHhfY29ucyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKEwxX0NBQ0hFX0JZVEVTKSkpOyAKKwl1MTYJCWh3X3R4X2NvbnM7CisKKyNpZmRlZiBCQ01fVkxBTiAKKwlzdHJ1Y3QJCQl2bGFuX2dyb3VwICp2bGdycDsKKyNlbmRpZgorCisJdTMyCQkJcnhfb2Zmc2V0OworCXUzMgkJCXJ4X2J1Zl91c2Vfc2l6ZTsJLyogdXNlYWJsZSBzaXplICovCisJdTMyCQkJcnhfYnVmX3NpemU7CQkvKiB3aXRoIGFsaWdubWVudCAqLworCXUzMgkJCXJ4X21heF9yaW5nX2lkeDsKKworCXUzMgkJCXJ4X3Byb2RfYnNlcTsKKwl1MTYJCQlyeF9wcm9kOworCXUxNgkJCXJ4X2NvbnM7CisJdTE2CQkJaHdfcnhfY29uczsKKworCXUzMgkJCXJ4X2NzdW07CisKKyNpZiAwCisJc3RydWN0IHJ4X2JkCQkqcnhfZGVzY19yaW5nW01BWF9SWF9SSU5HU107CisjZW5kaWYKKwlzdHJ1Y3QgcnhfYmQJCSpyeF9kZXNjX3Jpbmc7CisKKwkvKiBFbmQgb2YgZmllbGRzIHVzZWQgaW4gdGhlIHBlcmZvcm1hbmNlIGNvZGUgcGF0aHMuICovCisKKwljaGFyCQkJKm5hbWU7CisKKyNpZiAwCisJaW50CQkJdGltZXJfaW50ZXJ2YWw7CisJaW50CQkJY3VycmVudF9pbnRlcnZhbDsKKwlzdHJ1Y3QJCQl0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCB3b3JrX3N0cnVjdAlyZXNldF90YXNrOworCWludAkJCWluX3Jlc2V0X3Rhc2s7CisKKwkvKiBVc2VkIHRvIHN5bmNocm9uaXplIHBoeSBhY2Nlc3Nlcy4gKi8KKwlzcGlubG9ja190CQlwaHlfbG9jazsKKyNlbmRpZgorCisJdTMyCQkJcGh5X2ZsYWdzOworI2RlZmluZSBQSFlfU0VSREVTX0ZMQUcJCQkxCisjZGVmaW5lIFBIWV9DUkNfRklYX0ZMQUcJCTIKKyNkZWZpbmUgUEhZX1BBUkFMTEVMX0RFVEVDVF9GTEFHCTQKKyNkZWZpbmUgUEhZXzJfNUdfQ0FQQUJMRV9GTEFHCQk4CisjZGVmaW5lIFBIWV9JTlRfTU9ERV9NQVNLX0ZMQUcJCTB4MzAwCisjZGVmaW5lIFBIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkdfRkxBRwkweDEwMAorI2RlZmluZSBQSFlfSU5UX01PREVfTElOS19SRUFEWV9GTEFHCTB4MjAwCisKKwl1MzIJCQljaGlwX2lkOworCS8qIGNoaXAgbnVtOjE2LTMxLCByZXY6MTItMTUsIG1ldGFsOjQtMTEsIGJvbmRfaWQ6MC0zICovCisjZGVmaW5lIENISVBfTlVNKGJwKQkJCSgoKGJwKS0+Y2hpcF9pZCkgJiAweGZmZmYwMDAwKQorI2RlZmluZSBDSElQX05VTV81NzA2CQkJMHg1NzA2MDAwMAorI2RlZmluZSBDSElQX05VTV81NzA4CQkJMHg1NzA4MDAwMAorCisjZGVmaW5lIENISVBfUkVWKGJwKQkJCSgoKGJwKS0+Y2hpcF9pZCkgJiAweDAwMDBmMDAwKQorI2RlZmluZSBDSElQX1JFVl9BeAkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0hJUF9SRVZfQngJCQkweDAwMDAxMDAwCisjZGVmaW5lIENISVBfUkVWX0N4CQkJMHgwMDAwMjAwMAorICAgIAorI2RlZmluZSBDSElQX01FVEFMKGJwKQkJCSgoKGJwKS0+Y2hpcF9pZCkgJiAweDAwMDAwZmYwKQorI2RlZmluZSBDSElQX0JPTkRJTkcoYnApCQkoKChicCktPmNoaXBfaWQpICYgMHgwMDAwMDAwZikKKworI2RlZmluZSBDSElQX0lEKGJwKQkJCSgoKGJwKS0+Y2hpcF9pZCkgJiAweGZmZmZmZmYwKQorI2RlZmluZSBDSElQX0lEXzU3MDZfQTAJCQkweDU3MDYwMDAwCisjZGVmaW5lIENISVBfSURfNTcwNl9BMQkJCTB4NTcwNjAwMTAKKyNkZWZpbmUgQ0hJUF9JRF81NzA2X0EyCQkJMHg1NzA2MDAyMAorI2RlZmluZSBDSElQX0lEXzU3MDhfQTAJCQkweDU3MDgwMDAwCisjZGVmaW5lIENISVBfSURfNTcwOF9CMAkJCTB4NTcwODEwMDAKKyNkZWZpbmUgQ0hJUF9JRF81NzA4X0IxCQkJMHg1NzA4MTAxMAorCisjZGVmaW5lIENISVBfQk9ORF9JRChicCkJCSgoKGJwKS0+Y2hpcF9pZCkgJiAweGYpCisKKy8qIEEgc2VyZGVzIGNoaXAgd2lsbCBoYXZlIHRoZSBmaXJzdCBiaXQgb2YgdGhlIGJvbmQgaWQgc2V0LiAqLworI2RlZmluZSBDSElQX0JPTkRfSURfU0VSREVTX0JJVAkJMHgwMQorCisJdTMyCQkJcGh5X2FkZHI7CisJdTMyCQkJcGh5X2lkOworCQorCXUxNgkJCWJ1c19zcGVlZF9taHo7CisJdTgJCQl3b2w7CisKKwl1OAkJCXBhZDsKKworCXUxNgkJCWZ3X3dyX3NlcTsKKwl1MTYJCQlmd19kcnZfcHVsc2Vfd3Jfc2VxOworCisJZG1hX2FkZHJfdAkJdHhfZGVzY19tYXBwaW5nOworCisKKwlpbnQJCQlyeF9tYXhfcmluZzsKKwlpbnQJCQlyeF9yaW5nX3NpemU7CisjaWYgMAorCWRtYV9hZGRyX3QJCXJ4X2Rlc2NfbWFwcGluZ1tNQVhfUlhfUklOR1NdOworI2VuZGlmCisJZG1hX2FkZHJfdAkJcnhfZGVzY19tYXBwaW5nOworCisJdTE2CQkJdHhfcXVpY2tfY29uc190cmlwOworCXUxNgkJCXR4X3F1aWNrX2NvbnNfdHJpcF9pbnQ7CisJdTE2CQkJcnhfcXVpY2tfY29uc190cmlwOworCXUxNgkJCXJ4X3F1aWNrX2NvbnNfdHJpcF9pbnQ7CisJdTE2CQkJY29tcF9wcm9kX3RyaXA7CisJdTE2CQkJY29tcF9wcm9kX3RyaXBfaW50OworCXUxNgkJCXR4X3RpY2tzOworCXUxNgkJCXR4X3RpY2tzX2ludDsKKwl1MTYJCQljb21fdGlja3M7CisJdTE2CQkJY29tX3RpY2tzX2ludDsKKwl1MTYJCQljbWRfdGlja3M7CisJdTE2CQkJY21kX3RpY2tzX2ludDsKKwl1MTYJCQlyeF90aWNrczsKKwl1MTYJCQlyeF90aWNrc19pbnQ7CisKKwl1MzIJCQlzdGF0c190aWNrczsKKworCWRtYV9hZGRyX3QJCXN0YXR1c19ibGtfbWFwcGluZzsKKworCXN0cnVjdCBzdGF0aXN0aWNzX2Jsb2NrCSpzdGF0c19ibGs7CisJZG1hX2FkZHJfdAkJc3RhdHNfYmxrX21hcHBpbmc7CisKKwl1MzIJCQloY19jbWQ7CisJdTMyCQkJcnhfbW9kZTsKKworCXUxNgkJCXJlcV9saW5lX3NwZWVkOworCXU4CQkJcmVxX2R1cGxleDsKKworCXU4CQkJbGlua191cDsKKworCXUxNgkJCWxpbmVfc3BlZWQ7CisJdTgJCQlkdXBsZXg7CisJdTgJCQlmbG93X2N0cmw7CS8qIGFjdHVhbCBmbG93IGN0cmwgc2V0dGluZ3MgKi8KKwkJCQkJCS8qIG1heSBiZSBkaWZmZXJlbnQgZnJvbSAgICAgKi8KKwkJCQkJCS8qIHJlcV9mbG93X2N0cmwgaWYgYXV0b25lZyAgKi8KKyNkZWZpbmUgRkxPV19DVFJMX1RYCQkxCisjZGVmaW5lIEZMT1dfQ1RSTF9SWAkJMgorCisJdTMyCQkJYWR2ZXJ0aXNpbmc7CisKKwl1OAkJCXJlcV9mbG93X2N0cmw7CS8qIGZsb3cgY3RybCBhZHZlcnRpc2VtZW50ICovIAorCQkJCQkJLyogc2V0dGluZ3Mgb3IgZm9yY2VkICAgICAgKi8KKwkJCQkJCS8qIHNldHRpbmdzICAgICAgICAgICAgICAgICovCisJdTgJCQlhdXRvbmVnOworI2RlZmluZSBBVVRPTkVHX1NQRUVECQkxCisjZGVmaW5lIEFVVE9ORUdfRkxPV19DVFJMCTIKKworCXU4CQkJbG9vcGJhY2s7CisjZGVmaW5lIE1BQ19MT09QQkFDSwkJMQorI2RlZmluZSBQSFlfTE9PUEJBQ0sJCTIKKworCXU4CQkJc2VyZGVzX2FuX3BlbmRpbmc7CisjZGVmaW5lIFNFUkRFU19BTl9USU1FT1VUCShIWiAvIDMpCisKKwl1OAkJCW1hY19hZGRyWzhdOworCisJdTMyCQkJc2htZW1fYmFzZTsKKworCXUzMgkJCWZ3X3ZlcjsKKworCWludAkJCXBtX2NhcDsKKwlpbnQJCQlwY2l4X2NhcDsKKworCS8qIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsgKi8KKworCXN0cnVjdCBmbGFzaF9zcGVjCSpmbGFzaF9pbmZvOworCXUzMgkJCWZsYXNoX3NpemU7CisKKwlpbnQJCQlzdGF0dXNfc3RhdHNfc2l6ZTsKK307CisKK3N0YXRpYyB1MzIgYm54Ml9yZWdfcmRfaW5kKHN0cnVjdCBibngyICpicCwgdTMyIG9mZnNldCk7CitzdGF0aWMgdm9pZCBibngyX3JlZ193cl9pbmQoc3RydWN0IGJueDIgKmJwLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKTsKKworI2RlZmluZSBSRUdfUkQoYnAsIG9mZnNldCkJCQkJCVwKKwlyZWFkbChicC0+cmVndmlldyArIG9mZnNldCkKKworI2RlZmluZSBSRUdfV1IoYnAsIG9mZnNldCwgdmFsKQkJCQkJXAorCXdyaXRlbCh2YWwsIGJwLT5yZWd2aWV3ICsgb2Zmc2V0KQorCisjZGVmaW5lIFJFR19XUjE2KGJwLCBvZmZzZXQsIHZhbCkJCQkJXAorCXdyaXRldyh2YWwsIGJwLT5yZWd2aWV3ICsgb2Zmc2V0KQorCisjZGVmaW5lIFJFR19SRF9JTkQoYnAsIG9mZnNldCkJCQkJCVwKKwlibngyX3JlZ19yZF9pbmQoYnAsIG9mZnNldCkKKworI2RlZmluZSBSRUdfV1JfSU5EKGJwLCBvZmZzZXQsIHZhbCkJCQkJXAorCWJueDJfcmVnX3dyX2luZChicCwgb2Zmc2V0LCB2YWwpCisKKy8qIEluZGlyZWN0IGNvbnRleHQgYWNjZXNzLiAgVW5saWtlIHRoZSBNQlFfV1IsIHRoZXNlIG1hY3JvcyB3aWxsIG5vdAorICogdHJpZ2dlciBhIGNoaXAgZXZlbnQuICovCitzdGF0aWMgdm9pZCBibngyX2N0eF93cihzdHJ1Y3QgYm54MiAqYnAsIHUzMiBjaWRfYWRkciwgdTMyIG9mZnNldCwgdTMyIHZhbCk7CisKKyNkZWZpbmUgQ1RYX1dSKGJwLCBjaWRfYWRkciwgb2Zmc2V0LCB2YWwpCQkJXAorCWJueDJfY3R4X3dyKGJwLCBjaWRfYWRkciwgb2Zmc2V0LCB2YWwpCisKK3N0cnVjdCBjcHVfcmVnIHsKKwl1MzIgbW9kZTsKKwl1MzIgbW9kZV92YWx1ZV9oYWx0OworCXUzMiBtb2RlX3ZhbHVlX3NzdGVwOworCisJdTMyIHN0YXRlOworCXUzMiBzdGF0ZV92YWx1ZV9jbGVhcjsKKworCXUzMiBncHIwOworCXUzMiBldm1hc2s7CisJdTMyIHBjOworCXUzMiBpbnN0OworCXUzMiBicDsKKworCXUzMiBzcGFkX2Jhc2U7CisKKwl1MzIgbWlwc192aWV3X2Jhc2U7Cit9OworCitzdHJ1Y3QgZndfaW5mbyB7CisJdTMyIHZlcl9tYWpvcjsKKwl1MzIgdmVyX21pbm9yOworCXUzMiB2ZXJfZml4OworCisJdTMyIHN0YXJ0X2FkZHI7CisKKwkvKiBUZXh0IHNlY3Rpb24uICovCisJdTMyIHRleHRfYWRkcjsKKwl1MzIgdGV4dF9sZW47CisJdTMyIHRleHRfaW5kZXg7CisJdTMyICp0ZXh0OworCisJLyogRGF0YSBzZWN0aW9uLiAqLworCXUzMiBkYXRhX2FkZHI7CisJdTMyIGRhdGFfbGVuOworCXUzMiBkYXRhX2luZGV4OworCXUzMiAqZGF0YTsKKworCS8qIFNCU1Mgc2VjdGlvbi4gKi8KKwl1MzIgc2Jzc19hZGRyOworCXUzMiBzYnNzX2xlbjsKKwl1MzIgc2Jzc19pbmRleDsKKwl1MzIgKnNic3M7CisKKwkvKiBCU1Mgc2VjdGlvbi4gKi8KKwl1MzIgYnNzX2FkZHI7CisJdTMyIGJzc19sZW47CisJdTMyIGJzc19pbmRleDsKKwl1MzIgKmJzczsKKworCS8qIFJlYWQtb25seSBzZWN0aW9uLiAqLworCXUzMiByb2RhdGFfYWRkcjsKKwl1MzIgcm9kYXRhX2xlbjsKKwl1MzIgcm9kYXRhX2luZGV4OworCXUzMiAqcm9kYXRhOworfTsKKworI2RlZmluZSBSVjJQX1BST0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSVjJQX1BST0MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisKKy8qIFRoaXMgdmFsdWUgKGluIG1pbGxpc2Vjb25kcykgZGV0ZXJtaW5lcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBkcml2ZXIKKyAqIGlzc3VpbmcgdGhlIFBVTFNFIG1lc3NhZ2UgY29kZS4gIFRoZSBmaXJtd2FyZSBtb25pdG9ycyB0aGlzIHBlcmlvZGljCisgKiBwdWxzZSB0byBkZXRlcm1pbmUgd2hlbiB0byBzd2l0Y2ggdG8gYW4gT1MtYWJzZW50IG1vZGUuICovCisjZGVmaW5lIERSVl9QVUxTRV9QRVJJT0RfTVMgICAgICAgICAgICAgICAgIDI1MAorCisvKiBUaGlzIHZhbHVlIChpbiBtaWxsaXNlY29uZHMpIGRldGVybWluZXMgaG93IGxvbmcgdGhlIGRyaXZlciBzaG91bGQKKyAqIHdhaXQgZm9yIGFuIGFja25vd2xlZGdlbWVudCBmcm9tIHRoZSBmaXJtd2FyZSBiZWZvcmUgdGltaW5nIG91dC4gIE9uY2UKKyAqIHRoZSBmaXJtd2FyZSBoYXMgdGltZWQgb3V0LCB0aGUgZHJpdmVyIHdpbGwgYXNzdW1lIHRoZXJlIGlzIG5vIGZpcm13YXJlCisgKiBydW5uaW5nIGFuZCB0aGVyZSB3b24ndCBiZSBhbnkgZmlybXdhcmUtZHJpdmVyIHN5bmNocm9uaXphdGlvbiBkdXJpbmcgYQorICogZHJpdmVyIHJlc2V0LiAqLworI2RlZmluZSBGV19BQ0tfVElNRV9PVVRfTVMgICAgICAgICAgICAgICAgICAxMDAKKworCisjZGVmaW5lIEJOWDJfRFJWX1JFU0VUX1NJR05BVFVSRQkJMHgwMDAwMDAwMAorI2RlZmluZSBCTlgyX0RSVl9SRVNFVF9TSUdOQVRVUkVfTUFHSUMJCSAweDQ4NDE1NjRiIC8qIEhBVksgKi8KKy8vI2RlZmluZSBEUlZfUkVTRVRfU0lHTkFUVVJFX01BR0lDCQkgMHg0NzQ5NTM1MiAvKiBSU0lHICovCisKKyNkZWZpbmUgQk5YMl9EUlZfTUIJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBCTlgyX0RSVl9NU0dfQ09ERQkJCSAweGZmMDAwMDAwCisjZGVmaW5lIEJOWDJfRFJWX01TR19DT0RFX1JFU0VUCQkJIDB4MDEwMDAwMDAKKyNkZWZpbmUgQk5YMl9EUlZfTVNHX0NPREVfVU5MT0FECQkgMHgwMjAwMDAwMAorI2RlZmluZSBCTlgyX0RSVl9NU0dfQ09ERV9TSFVURE9XTgkJIDB4MDMwMDAwMDAKKyNkZWZpbmUgQk5YMl9EUlZfTVNHX0NPREVfU1VTUEVORF9XT0wJCSAweDA0MDAwMDAwCisjZGVmaW5lIEJOWDJfRFJWX01TR19DT0RFX0ZXX1RJTUVPVVQJCSAweDA1MDAwMDAwCisjZGVmaW5lIEJOWDJfRFJWX01TR19DT0RFX1BVTFNFCQkJIDB4MDYwMDAwMDAKKyNkZWZpbmUgQk5YMl9EUlZfTVNHX0NPREVfRElBRwkJCSAweDA3MDAwMDAwCisjZGVmaW5lIEJOWDJfRFJWX01TR19DT0RFX1NVU1BFTkRfTk9fV09MCSAweDA5MDAwMDAwCisKKyNkZWZpbmUgQk5YMl9EUlZfTVNHX0RBVEEJCQkgMHgwMGZmMDAwMAorI2RlZmluZSBCTlgyX0RSVl9NU0dfREFUQV9XQUlUMAkJCSAweDAwMDEwMDAwCisjZGVmaW5lIEJOWDJfRFJWX01TR19EQVRBX1dBSVQxCQkJIDB4MDAwMjAwMDAKKyNkZWZpbmUgQk5YMl9EUlZfTVNHX0RBVEFfV0FJVDIJCQkgMHgwMDAzMDAwMAorI2RlZmluZSBCTlgyX0RSVl9NU0dfREFUQV9XQUlUMwkJCSAweDAwMDQwMDAwCisgICAgICAgIAorI2RlZmluZSBCTlgyX0RSVl9NU0dfU0VRCQkJIDB4MDAwMGZmZmYKKworI2RlZmluZSBCTlgyX0ZXX01CCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQk5YMl9GV19NU0dfQUNLCQkJCSAweDAwMDBmZmZmCisjZGVmaW5lIEJOWDJfRldfTVNHX1NUQVRVU19NQVNLCQkJIDB4MDBmZjAwMDAKKyNkZWZpbmUgQk5YMl9GV19NU0dfU1RBVFVTX09LCQkJIDB4MDAwMDAwMDAKKyNkZWZpbmUgQk5YMl9GV19NU0dfU1RBVFVTX0ZBSUxVUkUJCSAweDAwZmYwMDAwCisKKyNkZWZpbmUgQk5YMl9MSU5LX1NUQVRVUwkJCTB4MDAwMDAwMGMKKyNkZWZpbmUgQk5YMl9MSU5LX1NUQVRVU19JTklUX1ZBTFVFCQkgMHhmZmZmZmZmZiAKKyNkZWZpbmUgQk5YMl9MSU5LX1NUQVRVU19MSU5LX1VQCQkgMHgxIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTX0xJTktfRE9XTgkJIDB4MCAKKyNkZWZpbmUgQk5YMl9MSU5LX1NUQVRVU19TUEVFRF9NQVNLCQkgMHgxZQorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTX0FOX0lOQ09NUExFVEUJCSAoMDw8MSkgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfMTBIQUxGCQkJICgxPDwxKSAKKyNkZWZpbmUgQk5YMl9MSU5LX1NUQVRVU18xMEZVTEwJCQkgKDI8PDEpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTXzEwMEhBTEYJCSAoMzw8MSkgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfMTAwQkFTRV9UNAkJICg0PDwxKSAKKyNkZWZpbmUgQk5YMl9MSU5LX1NUQVRVU18xMDBGVUxMCQkgKDU8PDEpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTXzEwMDBIQUxGCQkgKDY8PDEpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTXzEwMDBGVUxMCQkgKDc8PDEpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTXzI1MDBIQUxGCQkgKDg8PDEpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTXzI1MDBGVUxMCQkgKDk8PDEpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTX0FOX0VOQUJMRUQJCSAoMTw8NSkgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfQU5fQ09NUExFVEUJCSAoMTw8NikgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfUEFSQUxMRUxfREVUCQkgKDE8PDcpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTX1JFU0VSVkVECQkgKDE8PDgpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTX1BBUlRORVJfQURfMTAwMEZVTEwJICgxPDw5KSAKKyNkZWZpbmUgQk5YMl9MSU5LX1NUQVRVU19QQVJUTkVSX0FEXzEwMDBIQUxGCSAoMTw8MTApIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTX1BBUlRORVJfQURfMTAwQlQ0CSAoMTw8MTEpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTX1BBUlRORVJfQURfMTAwRlVMTAkgKDE8PDEyKSAKKyNkZWZpbmUgQk5YMl9MSU5LX1NUQVRVU19QQVJUTkVSX0FEXzEwMEhBTEYJICgxPDwxMykgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfUEFSVE5FUl9BRF8xMEZVTEwJICgxPDwxNCkgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfUEFSVE5FUl9BRF8xMEhBTEYJICgxPDwxNSkgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfVFhfRkNfRU5BQkxFRAkJICgxPDwxNikgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfUlhfRkNfRU5BQkxFRAkJICgxPDwxNykgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfUEFSVE5FUl9TWU1fUEFVU0VfQ0FQCSAoMTw8MTgpIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTX1BBUlRORVJfQVNZTV9QQVVTRV9DQVAJICgxPDwxOSkgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfU0VSREVTX0xJTksJCSAoMTw8MjApIAorI2RlZmluZSBCTlgyX0xJTktfU1RBVFVTX1BBUlRORVJfQURfMjUwMEZVTEwJICgxPDwyMSkgCisjZGVmaW5lIEJOWDJfTElOS19TVEFUVVNfUEFSVE5FUl9BRF8yNTAwSEFMRgkgKDE8PDIyKSAKKworI2RlZmluZSBCTlgyX0RSVl9QVUxTRV9NQgkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQk5YMl9EUlZfUFVMU0VfU0VRX01BU0sJCQkgMHgwMDAwN2ZmZgorCisvKiBJbmRpY2F0ZSB0byB0aGUgZmlybXdhcmUgbm90IHRvIGdvIGludG8gdGhlCisgKiBPUyBhYnNlbnQgd2hlbiBpdCBpcyBub3QgZ2V0dGluZyBkcml2ZXIgcHVsc2UuCisgKiBUaGlzIGlzIHVzZWQgZm9yIGRlYnVnZ2luZy4gKi8KKyNkZWZpbmUgQk5YMl9EUlZfTVNHX0RBVEFfUFVMU0VfQ09ERV9BTFdBWVNfQUxJVkUJIDB4MDAwODAwMDAKKworI2RlZmluZSBCTlgyX0RFVl9JTkZPX1NJR05BVFVSRQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQk5YMl9ERVZfSU5GT19TSUdOQVRVUkVfTUFHSUMJCSAweDQ0NTY0OTAwCisjZGVmaW5lIEJOWDJfREVWX0lORk9fU0lHTkFUVVJFX01BR0lDX01BU0sJIDB4ZmZmZmZmMDAKKyNkZWZpbmUgQk5YMl9ERVZfSU5GT19GRUFUVVJFX0NGR19WQUxJRAkJIDB4MDEKKyNkZWZpbmUgQk5YMl9ERVZfSU5GT19TRUNPTkRBUllfUE9SVAkJIDB4ODAKKyNkZWZpbmUgQk5YMl9ERVZfSU5GT19EUlZfQUxXQVlTX0FMSVZFCQkgMHg0MAorCisjZGVmaW5lIEJOWDJfU0hBUkVEX0hXX0NGR19QQVJUX05VTQkJMHgwMDAwMDAyNAorCisjZGVmaW5lIEJOWDJfU0hBUkVEX0hXX0NGR19QT1dFUl9ESVNTSVBBVEVECTB4MDAwMDAwMzQKKyNkZWZpbmUgQk5YMl9TSEFSRURfSFdfQ0ZHX1BPV0VSX1NUQVRFX0QzX01BU0sJIDB4ZmYwMDAwMDAKKyNkZWZpbmUgQk5YMl9TSEFSRURfSFdfQ0ZHX1BPV0VSX1NUQVRFX0QyX01BU0sJIDB4ZmYwMDAwCisjZGVmaW5lIEJOWDJfU0hBUkVEX0hXX0NGR19QT1dFUl9TVEFURV9EMV9NQVNLCSAweGZmMDAKKyNkZWZpbmUgQk5YMl9TSEFSRURfSFdfQ0ZHX1BPV0VSX1NUQVRFX0QwX01BU0sJIDB4ZmYKKworI2RlZmluZSBCTlgyX1NIQVJFRF9IV19DRkcgUE9XRVJfQ09OU1VNRUQJMHgwMDAwMDAzOAorI2RlZmluZSBCTlgyX1NIQVJFRF9IV19DRkdfQ09ORklHCQkweDAwMDAwMDNjCisjZGVmaW5lIEJOWDJfU0hBUkVEX0hXX0NGR19ERVNJR05fTklDCQkgMAorI2RlZmluZSBCTlgyX1NIQVJFRF9IV19DRkdfREVTSUdOX0xPTQkJIDB4MQorI2RlZmluZSBCTlgyX1NIQVJFRF9IV19DRkdfUEhZX0NPUFBFUgkJIDAKKyNkZWZpbmUgQk5YMl9TSEFSRURfSFdfQ0ZHX1BIWV9GSUJFUgkJIDB4MgorI2RlZmluZSBCTlgyX1NIQVJFRF9IV19DRkdfUEhZXzJfNUcJCSAweDIwCisjZGVmaW5lIEJOWDJfU0hBUkVEX0hXX0NGR19QSFlfQkFDS1BMQU5FCSAweDQwCisjZGVmaW5lIEJOWDJfU0hBUkVEX0hXX0NGR19MRURfTU9ERV9TSElGVF9CSVRTCSA4CisjZGVmaW5lIEJOWDJfU0hBUkVEX0hXX0NGR19MRURfTU9ERV9NQVNLCSAweDMwMAorI2RlZmluZSBCTlgyX1NIQVJFRF9IV19DRkdfTEVEX01PREVfTUFDCQkgMAorI2RlZmluZSBCTlgyX1NIQVJFRF9IV19DRkdfTEVEX01PREVfR1BIWTEJIDB4MTAwCisjZGVmaW5lIEJOWDJfU0hBUkVEX0hXX0NGR19MRURfTU9ERV9HUEhZMgkgMHgyMDAKKworI2RlZmluZSBCTlgyX1NIQVJFRF9IV19DRkdfQ09ORklHMgkJMHgwMDAwMDA0MAorI2RlZmluZSBCTlgyX1NIQVJFRF9IV19DRkcyX05WTV9TSVpFX01BU0sJIDB4MDBmZmYwMDAKKworI2RlZmluZSBCTlgyX0RFVl9JTkZPX0JDX1JFVgkJCTB4MDAwMDAwNGMKKworI2RlZmluZSBCTlgyX1BPUlRfSFdfQ0ZHX01BQ19VUFBFUgkJMHgwMDAwMDA1MAorI2RlZmluZSBCTlgyX1BPUlRfSFdfQ0ZHX1VQUEVSTUFDX01BU0sJCSAweGZmZmYKKworI2RlZmluZSBCTlgyX1BPUlRfSFdfQ0ZHX01BQ19MT1dFUgkJMHgwMDAwMDA1NAorI2RlZmluZSBCTlgyX1BPUlRfSFdfQ0ZHX0NPTkZJRwkJCTB4MDAwMDAwNTgKKyNkZWZpbmUgQk5YMl9QT1JUX0hXX0NGR19DRkdfVFhDVEwzX01BU0sJIDB4MDAwMGZmZmYKKyNkZWZpbmUgQk5YMl9QT1JUX0hXX0NGR19DRkdfREZMVF9MSU5LX01BU0sJIDB4MDAxZjAwMDAKKyNkZWZpbmUgQk5YMl9QT1JUX0hXX0NGR19DRkdfREZMVF9MSU5LX0FOCSAweDAwMDAwMDAwCisjZGVmaW5lIEJOWDJfUE9SVF9IV19DRkdfQ0ZHX0RGTFRfTElOS18xRwkgMHgwMDAzMDAwMAorI2RlZmluZSBCTlgyX1BPUlRfSFdfQ0ZHX0NGR19ERkxUX0xJTktfMl81RwkgMHgwMDA0MDAwMAorCisjZGVmaW5lIEJOWDJfUE9SVF9IV19DRkdfSU1EX01BQ19BX1VQUEVSCTB4MDAwMDAwNjgKKyNkZWZpbmUgQk5YMl9QT1JUX0hXX0NGR19JTURfTUFDX0FfTE9XRVIJMHgwMDAwMDA2YworI2RlZmluZSBCTlgyX1BPUlRfSFdfQ0ZHX0lNRF9NQUNfQl9VUFBFUgkweDAwMDAwMDcwCisjZGVmaW5lIEJOWDJfUE9SVF9IV19DRkdfSU1EX01BQ19CX0xPV0VSCTB4MDAwMDAwNzQKKyNkZWZpbmUgQk5YMl9QT1JUX0hXX0NGR19JU0NTSV9NQUNfVVBQRVIJMHgwMDAwMDA3OAorI2RlZmluZSBCTlgyX1BPUlRfSFdfQ0ZHX0lTQ1NJX01BQ19MT1dFUgkweDAwMDAwMDdjCisKKyNkZWZpbmUgQk5YMl9ERVZfSU5GT19QRVJfUE9SVF9IV19DT05GSUcyCTB4MDAwMDAwYjQKKworI2RlZmluZSBCTlgyX0RFVl9JTkZPX0ZPUk1BVF9SRVYJCTB4MDAwMDAwYzQKKyNkZWZpbmUgQk5YMl9ERVZfSU5GT19GT1JNQVRfUkVWX01BU0sJCSAweGZmMDAwMDAwCisjZGVmaW5lIEJOWDJfREVWX0lORk9fRk9STUFUX1JFVl9JRAkJICgnQScgPDwgMjQpCisKKyNkZWZpbmUgQk5YMl9TSEFSRURfRkVBVFVSRQkJCTB4MDAwMDAwYzgKKyNkZWZpbmUgQk5YMl9TSEFSRURfRkVBVFVSRV9NQVNLCQkgMHhmZmZmZmZmZgorCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFCQkJMHgwMDAwMDBkOAorI2RlZmluZSBCTlgyX1BPUlQyX0ZFQVRVUkUJCQkweDAwMDAwMDE0YworI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfRU5BQkxFRAkJIDB4MDEwMDAwMDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0VOQUJMRUQJCSAweDAyMDAwMDAwCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX0FTRl9FTkFCTEVECQkgMHgwNDAwMDAwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9JTURfRU5BQkxFRAkJIDB4MDgwMDAwMDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfQkFSMV9TSVpFX01BU0sJIDB4ZgorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9CQVIxX1NJWkVfRElTQUJMRUQJIDB4MAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9CQVIxX1NJWkVfNjRLCQkgMHgxCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8xMjhLCSAweDIKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzI1NksJIDB4MworI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9CQVIxX1NJWkVfNTEySwkgMHg0CisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8xTQkJIDB4NQorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMk0JCSAweDYKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzRNCQkgMHg3CisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX0JBUjFfU0laRV84TQkJIDB4OAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMTZNCQkgMHg5CisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8zMk0JCSAweGEKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzY0TQkJIDB4YgorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMTI4TQkgMHhjCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8yNTZNCSAweGQKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzUxMk0JIDB4ZQorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMUcJCSAweGYKKworI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0wJCQkweGRjCisjZGVmaW5lIEJOWDJfUE9SVDJfRkVBVFVSRV9XT0wJCQkweDE1MAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfREVGQVVMVF9TSElGVF9CSVRTCSA0CisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX1dPTF9ERUZBVUxUX01BU0sJIDB4MzAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfV09MX0RFRkFVTFRfRElTQUJMRQkgMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfREVGQVVMVF9NQUdJQwkgMHgxMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfREVGQVVMVF9BQ1BJCSAweDIwCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX1dPTF9ERUZBVUxUX01BR0lDX0FORF9BQ1BJCSAweDMwCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX1dPTF9MSU5LX1NQRUVEX01BU0sJIDB4ZgorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfTElOS19TUEVFRF9BVVRPTkVHCSAwCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX1dPTF9MSU5LX1NQRUVEXzEwSEFMRgkgMQorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfTElOS19TUEVFRF8xMEZVTEwJIDIKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfV09MX0xJTktfU1BFRURfMTAwSEFMRiAzCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX1dPTF9MSU5LX1NQRUVEXzEwMEZVTEwgNAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfTElOS19TUEVFRF8xMDAwSEFMRgkgNQorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfTElOS19TUEVFRF8xMDAwRlVMTAkgNgorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfQVVUT05FR19BRFZFUlRJU0VfMTAwMAkgMHg0MAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9XT0xfUkVTRVJWRURfUEFVU0VfQ0FQIDB4NDAwCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX1dPTF9SRVNFUlZFRF9BU1lNX1BBVVNFX0NBUAkgMHg4MDAKKworI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkEJCQkweGUwCisjZGVmaW5lIEJOWDJfUE9SVDJfRkVBVFVSRV9NQkEJCQkweDE1NAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfQk9PVF9BR0VOVF9UWVBFX1NISUZUX0JJVFMJIDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9NQVNLCSAweDMKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9QWEUJIDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9SUEwJIDEKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9CT09UUAkgMgorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF9TSElGVF9CSVRTCSAyCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX01CQV9MSU5LX1NQRUVEX01BU0sJIDB4M2MKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfQVVUT05FRwkgMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMEhBTEYJIDB4NAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMEZVTEwJIDB4OAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMDBIQUxGCSAweGMKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfMTAwRlVMTAkgMHgxMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMDAwSEFMRgkgMHgxNAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMDAwRlVMTAkgMHgxOAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfU0VUVVBfUFJPTVBUX0VOQUJMRQkgMHg0MAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfSE9US0VZX0NUUkxfUwkgMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfSE9US0VZX0NUUkxfQgkgMHg4MAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFX1NISUZUX0JJVFMJIDgKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV9NQVNLCSAweGZmMDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV9ESVNBQkxFRAkgMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzFLCSAweDEwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzJLCSAweDIwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzRLCSAweDMwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzhLCSAweDQwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzE2SwkgMHg1MDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV8zMksJIDB4NjAwCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfNjRLCSAweDcwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzEyOEsJIDB4ODAwCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfMjU2SwkgMHg5MDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV81MTJLCSAweGEwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzFNCSAweGIwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzJNCSAweGMwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzRNCSAweGQwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzhNCSAweGUwMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzE2TQkgMHhmMDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX01TR19USU1FT1VUX1NISUZUX0JJVFMJIDE2CisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX01CQV9NU0dfVElNRU9VVF9NQVNLCSAweGYwMDAwCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX01CQV9CSU9TX0JPT1RTVFJBUF9TSElGVF9CSVRTCSAyMAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfQklPU19CT09UU1RSQVBfTUFTSwkgMHgzMDAwMDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX0FVVE8JIDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX0JCUwkgMHgxMDAwMDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX0lOVDE4SAkgMHgyMDAwMDAKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX0lOVDE5SAkgMHgzMDAwMDAKKworI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9JTUQJCQkweGU0CisjZGVmaW5lIEJOWDJfUE9SVDJfRkVBVFVSRV9JTUQJCQkweDE1OAorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9JTURfTElOS19PVkVSUklERV9ERUZBVUxUCSAwCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX0lNRF9MSU5LX09WRVJSSURFX0VOQUJMRQkgMQorCisjZGVmaW5lIEJOWDJfUE9SVF9GRUFUVVJFX1ZMQU4JCQkweGU4CisjZGVmaW5lIEJOWDJfUE9SVDJfRkVBVFVSRV9WTEFOCQkJMHgxNWMKKyNkZWZpbmUgQk5YMl9QT1JUX0ZFQVRVUkVfTUJBX1ZMQU5fVEFHX01BU0sJIDB4ZmZmZgorI2RlZmluZSBCTlgyX1BPUlRfRkVBVFVSRV9NQkFfVkxBTl9FTkFCTEUJIDB4MTAwMDAKKworI2RlZmluZSBCTlgyX0JDX1NUQVRFX1JFU0VUX1RZUEUJCTB4MDAwMDAxYzAKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX1NJRwkJIDB4MDAwMDUyNTQKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX1NJR19NQVNLCSAweDAwMDBmZmZmCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfUkVTRVRfVFlQRV9OT05FCSAoQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX1NJRyB8IFwKKwkJCQkJICAweDAwMDEwMDAwKQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX1JFU0VUX1RZUEVfUENJCSAoQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX1NJRyB8IFwKKwkJCQkJICAweDAwMDIwMDAwKQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX1JFU0VUX1RZUEVfVkFVWAkgKEJOWDJfQkNfU1RBVEVfUkVTRVRfVFlQRV9TSUcgfCBcCisJCQkJCSAgMHgwMDAzMDAwMCkKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX0RSVl9NQVNLCSBEUlZfTVNHX0NPREUgICAgICAgICAKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX0RSVl9SRVNFVCAoQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX1NJRyB8IFwKKwkJCQkJICAgIERSVl9NU0dfQ09ERV9SRVNFVCkKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX0RSVl9VTkxPQUQgKEJOWDJfQkNfU1RBVEVfUkVTRVRfVFlQRV9TSUcgfCBcCisJCQkJCSAgICAgRFJWX01TR19DT0RFX1VOTE9BRCkKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX0RSVl9TSFVURE9XTiAoQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX1NJRyB8IFwKKwkJCQkJICAgICAgIERSVl9NU0dfQ09ERV9TSFVURE9XTikKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX0RSVl9XT0wgKEJOWDJfQkNfU1RBVEVfUkVTRVRfVFlQRV9TSUcgfCBcCisJCQkJCSAgRFJWX01TR19DT0RFX1dPTCkKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX0RSVl9ESUFHIChCTlgyX0JDX1NUQVRFX1JFU0VUX1RZUEVfU0lHIHwgXAorCQkJCQkgICBEUlZfTVNHX0NPREVfRElBRykKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SRVNFVF9UWVBFX1ZBTFVFKG1zZykgKEJOWDJfQkNfU1RBVEVfUkVTRVRfVFlQRV9TSUcgfCBcCisJCQkJCSAgICAgKG1zZykpCisKKyNkZWZpbmUgQk5YMl9CQ19TVEFURQkJCQkweDAwMDAwMWM0CisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfRVJSX01BU0sJCQkgMHgwMDAwZmYwMAorI2RlZmluZSBCTlgyX0JDX1NUQVRFX1NJR04JCQkgMHg0MjUzMDAwMAorI2RlZmluZSBCTlgyX0JDX1NUQVRFX1NJR05fTUFTSwkJCSAweGZmZmYwMDAwCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfQkMxX1NUQVJUCQkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDEpCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfR0VUX05WTV9DRkcxCQkgKEJOWDJfQkNfU1RBVEVfU0lHTiB8IDB4MikKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9QUk9HX0JBUgkJCSAoQk5YMl9CQ19TVEFURV9TSUdOIHwgMHgzKQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX0lOSVRfVklECQkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDQpCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfR0VUX05WTV9DRkcyCQkgKEJOWDJfQkNfU1RBVEVfU0lHTiB8IDB4NSkKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9BUFBMWV9XS0FSTkQJCSAoQk5YMl9CQ19TVEFURV9TSUdOIHwgMHg2KQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX0xPQURfQkMyCQkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDcpCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfR09JTkdfQkMyCQkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDgpCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfR09JTkdfRElBRwkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDkpCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfUlRfRklOQUxfSU5JVAkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDgxKQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX1JUX1dLQVJORAkJCSAoQk5YMl9CQ19TVEFURV9TSUdOIHwgMHg4MikKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SVF9EUlZfUFVMU0UJCSAoQk5YMl9CQ19TVEFURV9TSUdOIHwgMHg4MykKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SVF9GSU9FVlRTCQkgKEJOWDJfQkNfU1RBVEVfU0lHTiB8IDB4ODQpCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfUlRfRFJWX0NNRAkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDg1KQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX1JUX0xPV19QT1dFUgkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDg2KQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX1JUX1NFVF9XT0wJCSAoQk5YMl9CQ19TVEFURV9TSUdOIHwgMHg4NykKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9SVF9PVEhFUl9GVwkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDg4KQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX1JUX0dPSU5HX0QzCQkgKEJOWDJfQkNfU1RBVEVfU0lHTiB8IDB4ODkpCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfRVJSX0JBRF9WRVJTSU9OCQkgKEJOWDJfQkNfU1RBVEVfU0lHTiB8IDB4MDEwMCkKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9FUlJfQkFEX0JDMl9DUkMJCSAoQk5YMl9CQ19TVEFURV9TSUdOIHwgMHgwMjAwKQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX0VSUl9CQzFfTE9PUAkJIChCTlgyX0JDX1NUQVRFX1NJR04gfCAweDAzMDApCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfRVJSX1VOS05PV05fQ01ECQkgKEJOWDJfQkNfU1RBVEVfU0lHTiB8IDB4MDQwMCkKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9FUlJfRFJWX0RFQUQJCSAoQk5YMl9CQ19TVEFURV9TSUdOIHwgMHgwNTAwKQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX0VSUl9OT19SWFAJCSAoQk5YMl9CQ19TVEFURV9TSUdOIHwgMHgwNjAwKQorI2RlZmluZSBCTlgyX0JDX1NUQVRFX0VSUl9UT09fTUFOWV9SQlVGCQkgKEJOWDJfQkNfU1RBVEVfU0lHTiB8IDB4MDcwMCkKKwkKKyNkZWZpbmUgQk5YMl9CQ19TVEFURV9ERUJVR19DTUQJCQkweDFkYworI2RlZmluZSBCTlgyX0JDX1NUQVRFX0JDX0RCR19DTURfU0lHTkFUVVJFCSAweDQyNDQwMDAwCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfQkNfREJHX0NNRF9TSUdOQVRVUkVfTUFTSwkgMHhmZmZmMDAwMAorI2RlZmluZSBCTlgyX0JDX1NUQVRFX0JDX0RCR19DTURfTE9PUF9DTlRfTUFTSwkgMHhmZmZmCisjZGVmaW5lIEJOWDJfQkNfU1RBVEVfQkNfREJHX0NNRF9MT09QX0lORklOSVRFCSAweGZmZmYKKworI2RlZmluZSBIT1NUX1ZJRVdfU0hNRU1fQkFTRQkJCTB4MTY3YzAwCisKKy8qIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9uZWdvdGlhdGlvbi4gIElmIHRoaXMgaXMgc2V0IHRvIGVuYWJsZSwKKyAqIHRoZSBmb3JjZWQgbGluayBtb2RlcyBhYm92ZSBhcmUgY29tcGxldGVseSBpZ25vcmVkLgorICovCisjZGVmaW5lIEFVVE9ORUdfRElTQUJMRQkJMHgwMAorI2RlZmluZSBBVVRPTkVHX0VOQUJMRQkJMHgwMQorCisjZGVmaW5lIFJYX09GRlNFVAkJKHNpemVvZihzdHJ1Y3QgbDJfZmhkcikgKyAyKQorCisjZGVmaW5lIFJYX0JVRl9DTlQJCTIwCisKKy8qIDggZm9yIENSQyBhbmQgVkxBTiAqLworI2RlZmluZSBSWF9CVUZfVVNFX1NJWkUJCShFVEhfTUFYX01UVSArIEVUSF9ITEVOICsgUlhfT0ZGU0VUICsgOCkKKworLyogOCBmb3IgYWxpZ25tZW50ICovCisvLyNkZWZpbmUgUlhfQlVGX1NJWkUJCShSWF9CVUZfVVNFX1NJWkUgKyA4KQorI2RlZmluZSBSWF9CVUZfU0laRQkJKEwxX0NBQ0hFX0FMSUdOKFJYX0JVRl9VU0VfU0laRSArIDgpKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYm54Ml9mdy5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvYm54Ml9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTg5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ibngyX2Z3LmgKQEAgLTAsMCArMSwzNDk0IEBACisvKiBibngyX2Z3Lmg6IEJyb2FkY29tIE5YMiBuZXR3b3JrIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUsIDIwMDYgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGV4Y2VwdCBhcyBub3RlZCBiZWxvdy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZmlybXdhcmUgZGF0YSBkZXJpdmVkIGZyb20gcHJvcHJpZXRhcnkgdW5wdWJsaXNoZWQKKyAqIHNvdXJjZSBjb2RlLCBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgQnJvYWRjb20gQ29ycG9yYXRpb24uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpcm13YXJlIGRhdGEKKyAqIGluIGhleGFkZWNpbWFsIG9yIGVxdWl2YWxlbnQgZm9ybWF0LCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMKKyAqIGFjY29tcGFueWluZyBpdC4KKyAqLworCitzdGF0aWMgY29uc3QgaW50IGJueDJfQ09NX2IwNkZ3UmVsZWFzZU1ham9yID0gMHgxOworc3RhdGljIGNvbnN0IGludCBibngyX0NPTV9iMDZGd1JlbGVhc2VNaW5vciA9IDB4MDsKK3N0YXRpYyBjb25zdCBpbnQgYm54Ml9DT01fYjA2RndSZWxlYXNlRml4ID0gMHgwOworc3RhdGljIGNvbnN0IHUzMiBibngyX0NPTV9iMDZGd1N0YXJ0QWRkciA9IDB4MDgwMDA4YjQ7CitzdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3VGV4dEFkZHIgPSAweDA4MDAwMDAwOworc3RhdGljIGNvbnN0IGludCBibngyX0NPTV9iMDZGd1RleHRMZW4gPSAweDU3YmM7CitzdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3RGF0YUFkZHIgPSAweDA4MDA1ODQwOworc3RhdGljIGNvbnN0IGludCBibngyX0NPTV9iMDZGd0RhdGFMZW4gPSAweDA7CitzdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3Um9kYXRhQWRkciA9IDB4MDgwMDU3YzA7CitzdGF0aWMgY29uc3QgaW50IGJueDJfQ09NX2IwNkZ3Um9kYXRhTGVuID0gMHg1ODsKK3N0YXRpYyBjb25zdCB1MzIgYm54Ml9DT01fYjA2RndCc3NBZGRyID0gMHgwODAwNTg2MDsKK3N0YXRpYyBjb25zdCBpbnQgYm54Ml9DT01fYjA2RndCc3NMZW4gPSAweDg4Oworc3RhdGljIGNvbnN0IHUzMiBibngyX0NPTV9iMDZGd1Nic3NBZGRyID0gMHgwODAwNTg0MDsKK3N0YXRpYyBjb25zdCBpbnQgYm54Ml9DT01fYjA2RndTYnNzTGVuID0gMHgxYzsKK3N0YXRpYyB1MzIgYm54Ml9DT01fYjA2RndUZXh0WygweDU3YmMvNCkgKyAxXSA9IHsKKwkweDBhMDAwMjJkLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDYzNmY2ZDIwLCAweDMyMmUzNTJlLAorCTB4MzgwMDAwMDAsIDB4MDIwNTA4MDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMzIsCisJMHgwMDAwMDAwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDEwLCAweDAwMDAwM2U4LCAweDAwMDBlYTYwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDEwMDAwMDAzLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDBkLCAweDNjMDIwODAwLCAweDI0NDI1ODQwLAorCTB4M2MwMzA4MDAsIDB4MjQ2MzU4ZTgsIDB4YWM0MDAwMDAsIDB4MDA0MzIwMmIsIDB4MTQ4MGZmZmQsIDB4MjQ0MjAwMDQsCisJMHgzYzFkMDgwMCwgMHgzN2JkN2ZmYywgMHgwM2EwZjAyMSwgMHgzYzEwMDgwMCwgMHgyNjEwMDhiNCwgMHgzYzFjMDgwMCwKKwkweDI3OWM1ODQwLCAweDBlMDAwMmY3LCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDI3YmRmZmU4LCAweDNjMWE4MDAwLAorCTB4M2MwMjAwMDgsIDB4MDM0MmQ4MjUsIDB4M2MwMzYwMTAsIDB4YWZiZjAwMTAsIDB4OGM2NTUwMDAsIDB4M2MwMjA4MDAsCisJMHgyNDQ3MGYzMCwgMHgzYzA0MDgwMCwgMHgyNDg2NTg2MCwgMHgyNDAyZmY3ZiwgMHgwMGEyMjgyNCwgMHgzNGE1MzgwYywKKwkweGFjNjU1MDAwLCAweDAwMDAyODIxLCAweDI0MDIwMDM3LCAweDI0MDMwYzgwLCAweGFmNDIwMDA4LCAweGFmNDMwMDI0LAorCTB4YWNjNzAwMDAsIDB4MjRhNTAwMDEsIDB4MmNhMjAwMTYsIDB4MTQ0MGZmZmMsIDB4MjRjNjAwMDQsIDB4MjQ4NDU4NjAsCisJMHgzYzAyMDgwMCwgMHgyNDQyMGYzYywgMHgzYzAzMDgwMCwgMHgyNDYzMGUyYywgMHhhYzgyMDAwNCwgMHgzYzAyMDgwMCwKKwkweDI0NDIwYTJjLCAweDNjMDUwODAwLCAweDI0YTUxMjY4LCAweGFjODIwMDBjLCAweDNjMDIwODAwLCAweDI0NDI0M2RjLAorCTB4YWM4MzAwMDgsIDB4M2MwMzA4MDAsIDB4MjQ2MzM2OTgsIDB4YWM4MjAwMTQsIDB4M2MwMjA4MDAsIDB4MjQ0MjNjMjQsCisJMHhhYzgzMDAxOCwgMHhhYzgzMDAxYywgMHgzYzAzMDgwMCwgMHgyNDYzMGY0NCwgMHhhYzgyMDAyNCwgMHgzYzAyMDgwMCwKKwkweDI0NDI0M2FjLCAweGFjODMwMDJjLCAweDNjMDMwODAwLCAweDI0NjM0M2NjLCAweGFjODIwMDMwLCAweDNjMDIwODAwLAorCTB4MjQ0MjQyZjAsIDB4YWM4MzAwMzQsIDB4M2MwMzA4MDAsIDB4MjQ2MzNkNzgsIDB4YWM4MjAwM2MsIDB4M2MwMjA4MDAsCisJMHgyNDQyMGZkNCwgMHhhYzg1MDAxMCwgMHhhYzg1MDAyMCwgMHhhYzgzMDA0MCwgMHgwZTAwMTBiNywgMHhhYzgyMDA1MCwKKwkweDhmYmYwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDI3YmRmZmUwLCAweGFmYjAwMDEwLCAweDI3NTAwMTAwLAorCTB4YWZiZjAwMTgsIDB4YWZiMTAwMTQsIDB4OTIwMzAwMGIsIDB4MjQwMjAwMDMsIDB4MTQ2MjAwNWIsIDB4OTYxMTAwMDgsCisJMHgzMjIyMDAwMSwgMHgxMDQwMDAwOSwgMHgyNzQzMDA4MCwgMHg4ZTAyMDAwMCwgMHg5NjA0MDAxNCwgMHgwMDAyMTFjMiwKKwkweDAwMDIxMDQwLCAweDAwNjIxODIxLCAweGE0NjQwMDAwLCAweDBhMDAwMmQwLCAweDNjMDIwODAwLCAweDNjMDIwODAwLAorCTB4OGM0MzAwMjAsIDB4MTA2MDAwMmEsIDB4M2MwMzA4MDAsIDB4MGUwMDE0OGUsIDB4MDAwMDAwMDAsIDB4OTc0MjAxMDgsCisJMHg4Zjg1MDAxOCwgMHg5NzQzMDEwYywgMHgzMDQyMDAzZSwgMHgwMDAyMTQwMCwgMHgwMDYyMTgyNSwgMHhhY2EzMDAwMCwKKwkweDhmODQwMDE4LCAweDhmNDIwMTAwLCAweGFjODIwMDA0LCAweDk3NDMwMTE2LCAweDk3NDIwMTBlLCAweDhmODQwMDE4LAorCTB4MDAwMzFjMDAsIDB4MDA0MzEwMjUsIDB4YWM4MjAwMDgsIDB4OTc0MzAxMTAsIDB4OTc0NDAxMTIsIDB4OGY4NTAwMTgsCisJMHgwMDAzMWMwMCwgMHgwMDgzMjAyNSwgMHhhY2E0MDAwYywgMHg5NzQyMDExNCwgMHg4Zjg0MDAxOCwgMHgzMDQyZmZmZiwKKwkweGFjODIwMDEwLCAweDhmODMwMDE4LCAweGFjNjAwMDE0LCAweDhmODIwMDE4LCAweDNjMDMwODAwLCAweGFjNDAwMDE4LAorCTB4OTQ2MjU4Y2UsIDB4OGY4NDAwMTgsIDB4M2MwMzIwMDAsIDB4MDA0MzEwMjUsIDB4YWM4MjAwMWMsIDB4MGUwMDE0Y2MsCisJMHgyNDA0MDAwMSwgMHgzYzAzMDgwMCwgMHg4YzYyMDA0MCwgMHgyNDQyMDAwMSwgMHhhYzYyMDA0MCwgMHgzYzAyMDgwMCwKKwkweDhjNDMwMDQ0LCAweDMyMjQwMDA0LCAweDI0NjMwMDAxLCAweDEwODAwMDE3LCAweGFjNDMwMDQ0LCAweDhmNDIwMmI4LAorCTB4MDQ0MzAwMDcsIDB4OGUwMjAwMjAsIDB4M2MwNDA4MDAsIDB4OGM4MzAwNjAsIDB4MjQwMjAwMDEsIDB4MjQ2MzAwMDEsCisJMHgwYTAwMDJmMiwgMHhhYzgzMDA2MCwgMHgzYzA2MDgwMCwgMHg4Y2M0MDA1YywgMHhhZjQyMDI4MCwgMHg5NjAzMDAxNiwKKwkweDAwMDAxMDIxLCAweGE3NDMwMjg0LCAweDhlMDUwMDA0LCAweDI0ODQwMDAxLCAweDNjMDMxMDAwLCAweGFmNDUwMjg4LAorCTB4YWY0MzAyYjgsIDB4MGEwMDAyZjIsIDB4YWNjNDAwNWMsIDB4MzIyMjAwMDIsIDB4MGEwMDAyZjIsIDB4MDAwMjEwMmIsCisJMHgzYzAyNjAwMCwgMHhhYzQwMDgwOCwgMHgwMDAwMDAwZCwgMHgwMDAwMTAyMSwgMHg4ZmJmMDAxOCwgMHg4ZmIxMDAxNCwKKwkweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI3YmRmZmM4LCAweGFmYmYwMDM0LCAweGFmYmUwMDMwLAorCTB4YWZiNzAwMmMsIDB4YWZiNjAwMjgsIDB4YWZiNTAwMjQsIDB4YWZiNDAwMjAsIDB4YWZiMzAwMWMsIDB4YWZiMjAwMTgsCisJMHhhZmIxMDAxNCwgMHgwZTAwMDI0NCwgMHhhZmIwMDAxMCwgMHgzYzE3MDgwMCwgMHgzYzE2MDgwMCwgMHgyNDExMDAyMCwKKwkweDI0MTUwMDMwLCAweDI3OTQwMDBjLCAweDI3OTMwMDA4LCAweDNjMTI0MDAwLCAweDNjMWUwODAwLCAweDhmODIwMDA0LAorCTB4M2MwNDA4MDAsIDB4OGM4MzAwMjAsIDB4MTA0MzAwMDUsIDB4OGVlMjAwYTQsIDB4YWY4MzAwMDQsIDB4MGUwMDE1OTMsCisJMHgwMDAwMDAwMCwgMHg4ZWUyMDBhNCwgMHg4ZWMzMDBhMCwgMHgxMDQzMDAwNCwgMHgyNmM0MDBhMCwgMHg5NDgyMDAwMiwKKwkweGE3NDIwMDllLCAweGFlZTMwMGE0LCAweDhmNTAwMDAwLCAweDMyMDIwMDA3LCAweDEwNDBmZmVlLCAweDMyMDIwMDAxLAorCTB4MTA0MDAwMmMsIDB4MzIwMjAwMDIsIDB4OGY0MjAxMDAsIDB4YWY0MjAwMjAsIDB4OGY0MzAxMDQsIDB4YWY0MzAwYTgsCisJMHg5MzQyMDEwYiwgMHg5MzYzMDAwMCwgMHgzMDYzMDBmZiwgMHgxMDcxMDAwNSwgMHgzMDQ0MDBmZiwgMHgxMDc1MDAwNiwKKwkweDJjODIwMDE2LCAweDBhMDAwMzMzLCAweDAwMDAwMDAwLCAweGFmOTQwMDAwLCAweDBhMDAwMzM0LCAweDJjODIwMDE2LAorCTB4YWY5MzAwMDAsIDB4MGEwMDAzMzQsIDB4MDAwMDAwMDAsIDB4YWY4MDAwMDAsIDB4MTQ0MDAwMDUsIDB4MDAwNDE4ODAsCisJMHgwZTAwMDNjYywgMHgwMDAwMDAwMCwgMHgwYTAwMDM0MCwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHgyNDQyNTg2MCwKKwkweDAwNjIxODIxLCAweDhjNjIwMDAwLCAweDAwNDBmODA5LCAweDAwMDAwMDAwLCAweDEwNDAwMDA1LCAweDNjMDMwODAwLAorCTB4OGY0MjAxMDQsIDB4M2MwMTYwMjAsIDB4YWMyMjAwMTQsIDB4M2MwMzA4MDAsIDB4OGM2MjAwMzQsIDB4YWY1MjAxMzgsCisJMHgyNDQyMDAwMSwgMHhhYzYyMDAzNCwgMHgzMjAyMDAwMiwgMHgxMDQwMDAxYSwgMHgzMjAyMDAwNCwgMHg4ZjQyMDE0MCwKKwkweGFmNDIwMDIwLCAweDkzNjMwMDAwLCAweDMwNjMwMGZmLCAweDEwNzEwMDA1LCAweDAwMDAwMDAwLCAweDEwNzUwMDA2LAorCTB4MDAwMDAwMDAsIDB4MGEwMDAzNWQsIDB4MDAwMDAwMDAsIDB4YWY5NDAwMDAsIDB4MGEwMDAzNWUsIDB4MDAwMDAwMDAsCisJMHhhZjkzMDAwMCwgMHgwYTAwMDM1ZSwgMHgwMDAwMDAwMCwgMHhhZjgwMDAwMCwgMHgwZTAwMGM3YiwgMHgwMDAwMDAwMCwKKwkweDNjMDQwODAwLCAweDhjODIwMDM4LCAweGFmNTIwMTc4LCAweDI0NDIwMDAxLCAweGFjODIwMDM4LCAweDMyMDIwMDA0LAorCTB4MTA0MGZmYTQsIDB4MDAwMDAwMDAsIDB4OGY0MjAxODAsIDB4YWY0MjAwMjAsIDB4OTM2MzAwMDAsIDB4MzA2MzAwZmYsCisJMHgxMDcxMDAwNSwgMHgwMDAwMDAwMCwgMHgxMDc1MDAwNiwgMHgwMDAwMDAwMCwgMHgwYTAwMDM3OCwgMHgwMDAwMDAwMCwKKwkweGFmOTQwMDAwLCAweDBhMDAwMzc5LCAweDAwMDAwMDAwLCAweGFmOTMwMDAwLCAweDBhMDAwMzc5LCAweDAwMDAwMDAwLAorCTB4YWY4MDAwMDAsIDB4OGY0MzAxODAsIDB4MjQwMjBmMDAsIDB4MTQ2MjAwMDUsIDB4MDAwMDAwMDAsIDB4OGY0MjAxODgsCisJMHhhNzQyMDA5YywgMHgwYTAwMDM4NywgMHg4ZmMyMDAzYywgMHg5MzYyMDAwMCwgMHgxNDUxMDAwNCwgMHg4ZmMyMDAzYywKKwkweDBlMDAwYmFkLCAweDAwMDAwMDAwLCAweDhmYzIwMDNjLCAweGFmNTIwMWI4LCAweDI0NDIwMDAxLCAweDBhMDAwMzBiLAorCTB4YWZjMjAwM2MsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTAsIDB4OTc0MjAxMDgsIDB4MjQwMzMwMDAsIDB4MzA0NDcwMDAsCisJMHgxMDgzMDAxNiwgMHgyODgyMzAwMSwgMHgxMDQwMDAwNywgMHgyNDAyNDAwMCwgMHgxMDgwMDAwYiwgMHgyNDAyMjAwMCwKKwkweDEwODIwMDBjLCAweDAwMDAwMDAwLCAweDBhMDAwM2IzLCAweDAwMDAwMDAwLCAweDEwODIwMDEwLCAweDI0MDI1MDAwLAorCTB4MTA4MjAwMTIsIDB4MDAwMDAwMDAsIDB4MGEwMDAzYjMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MGEwMDAzYjUsCisJMHgwMDAwMTAyMSwgMHgwZTAwMDQ0MiwgMHgwMDAwMDAwMCwgMHgwYTAwMDNiNiwgMHg4ZmJmMDAxMCwgMHgwZTAwMDQxYSwKKwkweDAwMDAwMDAwLCAweDBhMDAwM2I1LCAweDAwMDAxMDIxLCAweDBlMDAwNjY5LCAweDAwMDAwMDAwLCAweDBhMDAwM2I1LAorCTB4MDAwMDEwMjEsIDB4MGUwMDE0NjcsIDB4MDAwMDAwMDAsIDB4MGEwMDAzYjUsIDB4MDAwMDEwMjEsIDB4MDAwMDAwMGQsCisJMHgwMDAwMTAyMSwgMHg4ZmJmMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHg5MzYyMDAwMCwgMHgyNDAzMDAyMCwKKwkweDMwNDQwMGZmLCAweDEwODMwMDA1LCAweDI0MDIwMDMwLCAweDEwODIwMDA3LCAweDAwMDAwMDAwLCAweDBhMDAwM2M5LAorCTB4MDAwMDAwMDAsIDB4Mjc4MjAwMGMsIDB4YWY4MjAwMDAsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4Mjc4MjAwMDgsCisJMHhhZjgyMDAwMCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHhhZjgwMDAwMCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDBkLCAweDAzZTAwMDA4LCAweDAwMDAxMDIxLCAweDAzZTAwMDA4LCAweDAwMDAxMDIxLCAweDI3NDQwMTAwLAorCTB4OTQ4MzAwMDgsIDB4MzA2MjAwMDQsIDB4MTA0MDAwMTcsIDB4MzA2MjAwMDIsIDB4OGY0MjAyYjgsIDB4MDQ0MzAwMDcsCisJMHg4YzgyMDAyMCwgMHgzYzA0MDgwMCwgMHg4YzgzMDA2MCwgMHgyNDAyMDAwMSwgMHgyNDYzMDAwMSwgMHgwM2UwMDAwOCwKKwkweGFjODMwMDYwLCAweGFmNDIwMjgwLCAweDk0ODMwMDE2LCAweDNjMDYwODAwLCAweGE3NDMwMjg0LCAweDhjODUwMDA0LAorCTB4OGNjNDAwNWMsIDB4MDAwMDEwMjEsIDB4M2MwMzEwMDAsIDB4MjQ4NDAwMDEsIDB4YWY0NTAyODgsIDB4YWY0MzAyYjgsCisJMHgwM2UwMDAwOCwgMHhhY2M0MDA1YywgMHgxNDQwMDAwMywgMHgzYzA0MDgwMCwgMHgwM2UwMDAwOCwgMHgwMDAwMTAyMSwKKwkweDhjODMwMDg0LCAweDI0MDIwMDAxLCAweDI0NjMwMDAxLCAweDAzZTAwMDA4LCAweGFjODMwMDg0LCAweDI3NDUwMTAwLAorCTB4M2MwNDA4MDAsIDB4OGM4MjAwODgsIDB4OTRhMzAwMGMsIDB4MjQ0MjAwMDEsIDB4MDA3YTE4MjEsIDB4YWM4MjAwODgsCisJMHg4Y2E0MDAxOCwgMHg5MDY2NDAwMCwgMHhhZjQ0MDAzOCwgMHg4Y2EyMDAxYywgMHgyNDAzZmZmOCwgMHgwMDA2MzYwMCwKKwkweDAwNDMxMDI0LCAweDM0NDIwMDA0LCAweDNjMDMwMDA1LCAweGFmNDIwMDNjLCAweGFmNDMwMDMwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4YWY0NjA0MDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgzYzAyMDAwNiwgMHgzNDQyMDAwMSwgMHhhZjQyMDAzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDhmNDIwMDAwLCAweDMwNDIwMDEwLCAweDEwNDBmZmZkLCAweDAwMDAxMDIxLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLAorCTB4M2MwMjA4MDAsIDB4OGM0MzAwMjAsIDB4MjdiZGZmZTgsIDB4YWZiMDAwMTAsIDB4Mjc1MDAxMDAsIDB4MTA2MDAwMWUsCisJMHhhZmJmMDAxNCwgMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgzMDAxOCwgMHg4ZTAyMDAxOCwgMHhhYzYyMDAwMCwKKwkweDhmODQwMDE4LCAweDk2MDIwMDBjLCAweGFjODIwMDA0LCAweDhmODMwMDE4LCAweGFjNjAwMDA4LCAweDhmODIwMDE4LAorCTB4YWM0MDAwMGMsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMTQsIDB4OGY4NDAwMTgsCisJMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwgMHhhYzgzMDAxOCwgMHg5NjAyMDAwOCwgMHgzYzAzMDgwMCwgMHg5NDY0NThjZSwKKwkweDhmODUwMDE4LCAweDAwMDIxNDAwLCAweDAwNDQxMDI1LCAweDI0MDQwMDAxLCAweDBlMDAxNGNjLCAweGFjYTIwMDFjLAorCTB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4MjdiZGZmZTgsIDB4YWZiMDAwMTAsCisJMHgyNzUwMDEwMCwgMHhhZmJmMDAxNCwgMHg5MjAyMDAwOSwgMHgxNDQwMDAwMywgMHgzYzAyMDgwMCwgMHgwYTAwMDQ2YywKKwkweDI0MDIwMDAxLCAweDhjNDMwMDIwLCAweDEwNjAwMDFmLCAweDAwMDAxMDIxLCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLAorCTB4OGY4MzAwMTgsIDB4OGUwMjAwMTgsIDB4YWM2MjAwMDAsIDB4OGY4NDAwMTgsIDB4OTYwMjAwMGMsIDB4YWM4MjAwMDQsCisJMHg4ZjgzMDAxOCwgMHhhYzYwMDAwOCwgMHg4ZjgyMDAxOCwgMHhhYzQwMDAwYywgMHg4ZjgzMDAxOCwgMHhhYzYwMDAxMCwKKwkweDhmODIwMDE4LCAweGFjNDAwMDE0LCAweDhmODQwMDE4LCAweDNjMDI2MDAwLCAweDhjNDM0NDQ4LCAweGFjODMwMDE4LAorCTB4OTYwMjAwMDgsIDB4M2MwMzA4MDAsIDB4OTQ2NDU4Y2UsIDB4OGY4NTAwMTgsIDB4MDAwMjE0MDAsIDB4MDA0NDEwMjUsCisJMHgyNDA0MDAwMSwgMHgwZTAwMTRjYywgMHhhY2EyMDAxYywgMHgwMDAwMTAyMSwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwKKwkweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDNjMGIwODAwLCAweDhkNjgwOGIwLCAweDNjMDcwODAwLCAweDI0ZTcwMGIwLAorCTB4MDAwODQ5MDAsIDB4MDEyNzE4MjEsIDB4YWM2NDAwMDAsIDB4OTM2MjAwMDUsIDB4OTc2NjAwMDgsIDB4MDBlOTUwMjEsCisJMHg5MzYzMDAyMywgMHg5MzY0MDAzZiwgMHgyNTA4MDAwMSwgMHgwMDAyMTYwMCwgMHgwMDA2MzQwMCwgMHgwMDQ2MTAyNSwKKwkweDAwMDMxYTAwLCAweDAwNDMxMDI1LCAweDAwODIyMDI1LCAweGFkNDQwMDA0LCAweDkzNjIwMDdlLCAweDkzNjYwMDdmLAorCTB4OGY2MzAxNzgsIDB4OTM2NDAwN2EsIDB4MDAwMjE2MDAsIDB4MDAwNjM0MDAsIDB4MDA0NjEwMjUsIDB4MDAwMzFhMDAsCisJMHgwMDQzMTAyNSwgMHgwMDgyMjAyNSwgMHhhZDQ0MDAwOCwgMHg5MzYyMDA4MCwgMHg5MzYzMDA3ZCwgMHgzMTA4MDA3ZiwKKwkweDAxNDAzODIxLCAweGFkNjgwOGIwLCAweDAwMDIxNjAwLCAweDAwMDMxYzAwLCAweDAwNDMxMDI1LCAweDAwNDUxMDI1LAorCTB4MDNlMDAwMDgsIDB4YWNlMjAwMGMsIDB4MjdiZGZmYjgsIDB4YWZiMzAwMmMsIDB4MDAwMDk4MjEsIDB4YWZiZTAwNDAsCisJMHgwMDAwZjAyMSwgMHhhZmI1MDAzNCwgMHgyNzU1MDEwMCwgMHhhZmJmMDA0NCwgMHhhZmI3MDAzYywgMHhhZmI2MDAzOCwKKwkweGFmYjQwMDMwLCAweGFmYjIwMDI4LCAweGFmYjEwMDI0LCAweGFmYjAwMDIwLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LAorCTB4OTZhMjAwMDgsIDB4OGY1NDAxMDAsIDB4OGViMTAwMTgsIDB4MzA0MjAwMDEsIDB4MTA0MDAwMzcsIDB4MDJhMGI4MjEsCisJMHg4ZjYzMDA1NCwgMHgyNjIyZmZmZiwgMHgwMDQzMTAyMywgMHgxODQwMDAwNiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwKKwkweDAwMDAwMDAwLCAweDI0MDAwMTVjLCAweDBhMDAwNGU1LCAweDAwMDAyMDIxLCAweDhmNjIwMDRjLCAweDAyMjIxMDIzLAorCTB4MTg0MDAwMjgsIDB4MDAwMDIwMjEsIDB4OTM2NTAxMjAsIDB4OTM2NDAxMjEsIDB4M2MwMzA4MDAsIDB4OGM2MjAwOGMsCisJMHgzMDg0MDBmZiwgMHgyNDQyMDAwMSwgMHgzMGE1MDBmZiwgMHgwMDgwMzgyMSwgMHgxNDg1MDAwYiwgMHhhYzYyMDA4YywKKwkweDNjMDQwODAwLCAweDhjODMwMDkwLCAweDI0NjMwMDAxLCAweGFjODMwMDkwLCAweDkzNjIwMTIyLCAweDMwNDIwMDAxLAorCTB4MDAwMjEwMjMsIDB4MzA0MjAwMDUsIDB4MGEwMDA0ZTUsIDB4MzQ0NDAwMDQsIDB4Mjc2NjAxMDAsIDB4MDAwNDEwODAsCisJMHgwMGMyMTAyMSwgMHg4YzQzMDAwMCwgMHgwMjIzMTgyMywgMHgwNDYwMDAwNCwgMHgyNDgyMDAwMSwgMHgzMDQ0MDAwNywKKwkweDE0ODVmZmY5LCAweDAwMDQxMDgwLCAweDEwODcwMDA3LCAweDNjMDMwODAwLCAweGEzNjQwMTIxLCAweDhjNjIwMDk0LAorCTB4MjQwNDAwMDUsIDB4MjQ0MjAwMDEsIDB4MGEwMDA0ZTUsIDB4YWM2MjAwOTQsIDB4MjQwNDAwMDQsIDB4MDA4MDk4MjEsCisJMHg5MzYyMDAzZiwgMHgzMDQ0MDBmZiwgMHgzODgzMDAxNiwgMHgyYzYzMDAwMSwgMHgzODgyMDAxMCwgMHgyYzQyMDAwMSwKKwkweDAwNjIxODI1LCAweDE0NjAwMDBjLCAweDI0MDIwMDAxLCAweDM4ODMwMDA4LCAweDJjNjMwMDAxLCAweDM4ODIwMDE0LAorCTB4MmM0MjAwMDEsIDB4MDA2MjE4MjUsIDB4MTQ2MDAwMDUsIDB4MjQwMjAwMDEsIDB4MjQwMjAwMTIsIDB4MTQ4MjAwMDIsCisJMHgwMDAwMTAyMSwgMHgyNDAyMDAwMSwgMHgxMDQwMDAwOSwgMHgwMDAwMDAwMCwgMHg4ZWEyMDAyMCwgMHg4ZjYzMDA0MCwKKwkweDAwNDBiMDIxLCAweDAwNDMxMDIzLCAweDVjNDAwMDEwLCAweDhmNzYwMDQwLCAweDBhMDAwNTExLCAweDAwMDAwMDAwLAorCTB4OTM0MzAxMGIsIDB4MjQwMjAwMDQsIDB4MTQ2MjAwMGEsIDB4OGViNjAwMjAsIDB4OGY2MzAwNDAsIDB4M2MwMjEwMDAsCisJMHgwMDc2MTgyMywgMHgwMDQzMTAyYSwgMHgxMDQwMDAwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwKKwkweDI0MDAwMmZhLCAweDkzNDMwMTBiLCAweDI0MDIwMDA0LCAweDU0NjIwMDBiLCAweDk2YTIwMDA4LCAweDI0MDIwMDAxLAorCTB4YWZhMjAwMTAsIDB4OTZhMjAwMDgsIDB4MjQwMzAwMDEsIDB4YWZhMzAwMTgsIDB4OGViMjAwMWMsIDB4MzY3MzAwMDIsCisJMHgzMDQyMDAyMCwgMHgwYTAwMDUyNiwgMHhhZmEyMDAxNCwgMHgzNjczMDA4MCwgMHgzMDQyMDAwMiwgMHgxMDQwMDAwMywKKwkweGFmYTAwMDE4LCAweDBhMDAwNTI2LCAweDhlYjIwMDFjLCAweDhlYjIwMDE0LCAweDI0MDJmZmZiLCAweDAyNjI4MDI0LAorCTB4MTIwMDAwMmEsIDB4M2MwMzA4MDAsIDB4OGM2MjAwMzAsIDB4MDIwMjEwMjQsIDB4MTA0MDAwMjYsIDB4M2MwMjA4MDAsCisJMHg4YzQzMDAyMCwgMHgxMDYwMDAyNCwgMHgzMjYyMDAwNCwgMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgzMDAxOCwKKwkweDhmNDIwMTAwLCAweGFjNjIwMDAwLCAweDhmODQwMDE4LCAweDAyNDAxODIxLCAweDMyNjIwMDAyLCAweGFjOTAwMDA0LAorCTB4OGY4NDAwMTgsIDB4NTQ0MDAwMDEsIDB4MDJjMDE4MjEsIDB4YWM4MzAwMDgsIDB4OGY4MzAwMTgsIDB4OGVlMjAwMjAsCisJMHhhYzYyMDAwYywgMHg4Zjg0MDAxOCwgMHg4ZjYyMDA0MCwgMHhhYzgyMDAxMCwgMHg4ZjgzMDAxOCwgMHg4ZWUyMDAxOCwKKwkweGFjNjIwMDE0LCAweDhmODUwMDE4LCAweDNjMDI2MDAwLCAweDhjNDM0NDQ4LCAweDI0MDQwMDAxLCAweDNjMDIwODAwLAorCTB4YWNhMzAwMTgsIDB4OTQ0MzU4Y2UsIDB4OGY4NTAwMTgsIDB4M2MwMjQwMTAsIDB4MDA2MjE4MjUsIDB4MGUwMDE0Y2MsCisJMHhhY2EzMDAxYywgMHgzMjYyMDAwNCwgMHgxMDQwMDA2MywgMHgwMDAwMzgyMSwgMHgzYzAyOTAwMCwgMHgzNDQyMDAwMSwKKwkweDNjMDM4MDAwLCAweDAyODIxMDI1LCAweGEzNjAwMDdjLCAweGFmNDIwMDIwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LAorCTB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OTM2MjAwMjMsIDB4MzA0MjAwODAsIDB4MTA0MDAwMTEsIDB4MDAwMDAwMDAsCisJMHg4ZjY1MDA1YywgMHg4ZjYzMDA0YywgMHg5NzY0MDAzYywgMHg4ZjYyMDA2NCwgMHgwMGEzMjgyMywgMHgwMDg1MjgyMSwKKwkweDAwYTIxMDJiLCAweDU0NDAwMDA2LCAweDNjMDIzZmZmLCAweDkzNjIwMDIzLCAweDMwNDIwMDdmLCAweGEzNjIwMDIzLAorCTB4YWY3MTAwNjQsIDB4M2MwMjNmZmYsIDB4MGEwMDA1ODAsIDB4MzQ0MmZmZmYsIDB4OGY2MjAwNWMsIDB4MDIyMjEwMjMsCisJMHgwNDQwMDAxMSwgMHgwMDAwMDAwMCwgMHg4ZjY1MDA1YywgMHg4ZjYzMDA2NCwgMHg5NzY0MDAzYywgMHgzYzAyM2ZmZiwKKwkweDM0NDJmZmZmLCAweGFmNzEwMDY0LCAweDAwYTMyODIzLCAweDAwODUyODIxLCAweDAwNDUxMDJiLCAweDEwNDAwMDA0LAorCTB4MDIyNTEwMjEsIDB4M2MwNTNmZmYsIDB4MzRhNWZmZmYsIDB4MDIyNTEwMjEsIDB4YWY2MjAwNWMsIDB4MjQwNzAwMDEsCisJMHhhZjcxMDA0YywgMHg4ZjYyMDA1NCwgMHgxNjIyMDAwNSwgMHgwMDAwMDAwMCwgMHg5MzYyMDAyMywgMHgzMDQyMDA0MCwKKwkweDEwNDAwMDE3LCAweDI0MDIwMDAxLCAweDk3NjIwMDZhLCAweDAwMDIyODgwLCAweDUwYTAwMDAxLCAweDI0MDUwMDAxLAorCTB4OTc2MzAwNjgsIDB4OTM2NDAwODEsIDB4M2MwMjA4MDAsIDB4OGM0NjAwNGMsIDB4MDA2NTI4MjEsIDB4MDA4NTI4MDQsCisJMHgwMGM1MTAyYiwgMHg1NDQwMDAwMSwgMHgwMGEwMzAyMSwgMHgzYzAyMDgwMCwgMHg4YzQ0MDA1MCwgMHgwMGM0MTgyYiwKKwkweDU0NjAwMDAxLCAweDAwYzAyMDIxLCAweDhmNDIwMDc0LCAweDI0MDNmZmZlLCAweDAwODMyODI0LCAweDAwYTIxMDIxLAorCTB4YWY2MjAwMGMsIDB4OTM2MjAwODIsIDB4MzA0MjAwODAsIDB4NTA0MDAwMDEsIDB4YTM2MDAwODEsIDB4M2MwMjgwMDAsCisJMHgzNDQyMDAwMSwgMHgwMjgyMTAyNSwgMHhhZjQyMDAyMCwgMHg5MzYzMDA3ZSwgMHg5MzYyMDA3YSwgMHgxMDYyMDAwNCwKKwkweDAwMDAwMDAwLCAweDBlMDAxM2M0LCAweDAwMDAwMDAwLCAweDAwNDAzODIxLCAweDU0ZTAwMDAxLCAweDI0MWUwMDAxLAorCTB4OGY3MDAwNDAsIDB4OGY2MjAwNDAsIDB4MTQ1MjAwMDMsIDB4MDA1MjEwMjMsIDB4MGEwMDA1YmYsIDB4MDAwMDEwMjEsCisJMHgyODQyMDAwMSwgMHgxMDQwMDA0MSwgMHg4ZmEyMDAxMCwgMHgwZTAwMGZhZSwgMHgwMjQwMjAyMSwgMHhhZjcyMDA0MCwKKwkweDkzNjIwMDNlLCAweDMwNDIwMDAxLCAweDE0NDAwMDBiLCAweDNjMDI5MDAwLCAweDkzNjIwMDIyLCAweDI0NDIwMDAxLAorCTB4YTM2MjAwMjIsIDB4OTM2MzAwMjIsIDB4M2MwMjA4MDAsIDB4OGM0NDAwOTgsIDB4MDA2NDE4MmIsIDB4MTQ2MDAwMjcsCisJMHgzYzAyMDgwMCwgMHgzYzAyOTAwMCwgMHgzNDQyMDAwMSwgMHgwMjgyMTAyNSwgMHhhZjQyMDAyMCwgMHgzYzAzODAwMCwKKwkweDhmNDIwMDIwLCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDkzNjIwMDdkLCAweDNjMDM4MDAwLAorCTB4MzQ0MjAwMDEsIDB4YTM2MjAwN2QsIDB4OGY2NDAwNzQsIDB4MzQ2MzAwMDEsIDB4MDI4MzE4MjUsIDB4YWY0MzAwMjAsCisJMHgwNDgxMDAwNiwgMHgzYzAzODAwMCwgMHgwMjgwMjAyMSwgMHgwZTAwMDQ3MCwgMHgyNDA1MDI3MywgMHgwYTAwMDVmMiwKKwkweDI0MDUwMDAxLCAweDhmNDIwMWY4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDAyLCAweDNjMDMxMDAwLAorCTB4YWY1NDAxYzAsIDB4YTM0MjAxYzQsIDB4YWY0MzAxZjgsIDB4MjQwNTAwMDEsIDB4MjQwMjAwMDEsIDB4YTc2MjAwMTIsCisJMHhhMzYwMDAyMiwgMHgwYTAwMDVmZSwgMHgyY2EyMDAwMSwgMHg5NzQzMDA3YSwgMHg5NDQ0MDAyYSwgMHgwMDAwMjgyMSwKKwkweDAwNjQxODIxLCAweDMwNjNmZmZlLCAweGE3NjMwMDEyLCAweDJjYTIwMDAxLCAweDAwMDIxMDIzLCAweDAzYzJmMDI0LAorCTB4OGZhMjAwMTAsIDB4MTA0MDAwMDQsIDB4OGZhMzAwMTQsIDB4MGUwMDEzYzEsIDB4MDAwMDAwMDAsIDB4OGZhMzAwMTQsCisJMHgxMDYwMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMTBlYiwgMHgwMDAwMDAwMCwgMHgxM2MwMDAxZiwgMHgzYzAyOTAwMCwKKwkweDM0NDIwMDAxLCAweDAyODIxMDI1LCAweGFmNDIwMDIwLCAweDNjMDM4MDAwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LAorCTB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OTM2MjAwN2QsIDB4M2MwMzgwMDAsIDB4YTM2MjAwN2QsIDB4OGY2NDAwNzQsCisJMHgzNDYzMDAwMSwgMHgwMjgzMTgyNSwgMHhhZjQzMDAyMCwgMHgwNDgxMDAwNiwgMHgzYzAzODAwMCwgMHgwMjgwMjAyMSwKKwkweDBlMDAwNDcwLCAweDI0MDUwMzZjLCAweDBhMDAwNjJiLCAweDhmYTIwMDE4LCAweDhmNDIwMWY4LCAweDAwNDMxMDI0LAorCTB4MTQ0MGZmZmQsIDB4MjQwMjAwMDIsIDB4M2MwMzEwMDAsIDB4YWY1NDAxYzAsIDB4YTM0MjAxYzQsIDB4YWY0MzAxZjgsCisJMHg4ZmEyMDAxOCwgMHg1MDQwMDAyZiwgMHg5NmEyMDAwOCwgMHg4ZjYyMDA0OCwgMHg4ZjYzMDAyNCwgMHgwMDc2MTgyMSwKKwkweGFmNjMwMDQ4LCAweDk3NjQwMDNjLCAweDAwNTAxMDIzLCAweDAwNDQxMDJiLCAweDEwNDAwMDI1LCAweDNjMDI5MDAwLAorCTB4MzQ0MjAwMDEsIDB4M2MwNDA4MDAsIDB4OGM4MzAwODAsIDB4OGY0NTAxMDAsIDB4M2MwNjgwMDAsIDB4MjQ2MzAwMDEsCisJMHgwMGEyMTAyNSwgMHhhYzgzMDA4MCwgMHhhZjQyMDAyMCwgMHg4ZjQyMDAyMCwgMHgwMDQ2MTAyNCwgMHgxNDQwZmZmZCwKKwkweDAwMDAwMDAwLCAweDkzNjIwMDdkLCAweDNjMDM4MDAwLCAweDM0NDIwMDA0LCAweGEzNjIwMDdkLCAweDhmNjQwMDc0LAorCTB4MzQ2MzAwMDEsIDB4MDBhMzE4MjUsIDB4YWY0MzAwMjAsIDB4MDQ4MTAwMDYsIDB4M2MwMzgwMDAsIDB4MDBhMDIwMjEsCisJMHgwZTAwMDQ3MCwgMHgyNDA1MDM4YSwgMHgwYTAwMDY1YiwgMHg5NmEyMDAwOCwgMHg4ZjQyMDFmOCwgMHgwMDQzMTAyNCwKKwkweDE0NDBmZmZkLCAweDI0MDIwMDAyLCAweDNjMDMxMDAwLCAweGFmNDUwMWMwLCAweGEzNDIwMWM0LCAweGFmNDMwMWY4LAorCTB4OTZhMjAwMDgsIDB4OGZiZjAwNDQsIDB4OGZiZTAwNDAsIDB4OGZiNzAwM2MsIDB4OGZiNjAwMzgsIDB4OGZiNTAwMzQsCisJMHg4ZmI0MDAzMCwgMHg4ZmIzMDAyYywgMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwgMHg4ZmIwMDAyMCwgMHgwMDAyMTA0MiwKKwkweDMwNDIwMDAxLCAweDAzZTAwMDA4LCAweDI3YmQwMDQ4LCAweDI3YmRmZmUwLCAweGFmYmYwMDE4LCAweDk3NDIwMTA4LAorCTB4MjQwMzAwMTksIDB4MzA0NDAwZmYsIDB4MTA4MzAwNjUsIDB4Mjg4MjAwMWEsIDB4MTA0MDAwMWEsIDB4Mjg4MjAwMGEsCisJMHgxMDQwMDAwZiwgMHgyODgyMDAwOCwgMHgxMDQwMDA0MCwgMHgyNDAyMDAwMSwgMHgxMDgyMDAzYSwgMHgyODgyMDAwMiwKKwkweDUwNDAwMDA1LCAweDI0MDIwMDA2LCAweDEwODAwMDMyLCAweDNjMDI2MDAwLCAweDBhMDAwNmZiLCAweDAwMDAwMDAwLAorCTB4MTA4MjAwM2QsIDB4MDAwMDAwMDAsIDB4MGEwMDA2ZmIsIDB4MDAwMDAwMDAsIDB4MjQwMjAwMGIsIDB4MTA4MjAwNDQsCisJMHgyODgyMDAwYiwgMHgxNDQwMDA0YiwgMHgyNDAyMDAwZSwgMHgxMDgyMDA0NSwgMHgwMDAwMDAwMCwgMHgwYTAwMDZmYiwKKwkweDAwMDAwMDAwLCAweDI0MDIwMDIwLCAweDEwODIwMDYyLCAweDI4ODIwMDIxLCAweDEwNDAwMDBlLCAweDI0MDIwMDFjLAorCTB4MTA4MjAwNGMsIDB4Mjg4MjAwMWQsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMWIsIDB4MTA4MjAwNDMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMDZmYiwgMHgwMDAwMDAwMCwgMHgyNDAyMDAxZiwgMHgxMDgyMDA1MCwgMHgwMDAwMDAwMCwgMHgwYTAwMDZmYiwKKwkweDAwMDAwMDAwLCAweDI0MDIwMGMxLCAweDEwODIwMDQyLCAweDI4ODIwMGMyLCAweDEwNDAwMDA1LCAweDI0MDIwMDgwLAorCTB4MTA4MjAwMjEsIDB4MDAwMDAwMDAsIDB4MGEwMDA2ZmIsIDB4MDAwMDAwMDAsIDB4MjQwMjAwYzIsIDB4MTA4MjAwM2QsCisJMHgyNDAyMDBjOSwgMHg1MDgyMDA0OSwgMHhhZmEwMDAxMCwgMHgwYTAwMDZmYiwgMHgwMDAwMDAwMCwgMHgwZTAwMTE2MywKKwkweGFjNDAwODA4LCAweDBhMDAwNmZkLCAweDhmYmYwMDE4LCAweDNjMDI2MDAwLCAweDhjNDQ0NDQ4LCAweDNjMDMwODAwLAorCTB4YWM2NDAwNjQsIDB4MGUwMDExNjMsIDB4MDAwMDAwMDAsIDB4M2MwMjYwMDAsIDB4OGM0NDQ0NDgsIDB4M2MwMzA4MDAsCisJMHgwYTAwMDZmYywgMHhhYzY0MDA2OCwgMHg4ZjQ0MDEwMCwgMHgwZTAwMDZmZiwgMHgwMDAwMDAwMCwgMHgzYzAyNjAwMCwKKwkweDhjNDQ0NDQ4LCAweDNjMDMwODAwLCAweDBhMDAwNmZjLCAweGFjNjQwMDZjLCAweDBlMDAxMTkxLCAweDAwMDAwMDAwLAorCTB4MGEwMDA2ZmQsIDB4OGZiZjAwMTgsIDB4OGY0NDAxMDAsIDB4MGUwMDExYmIsIDB4MDAwMDAwMDAsIDB4MGEwMDA2ZmQsCisJMHg4ZmJmMDAxOCwgMHgwZTAwMTIwMiwgMHgwMDAwMDAwMCwgMHgwYTAwMDZmZCwgMHg4ZmJmMDAxOCwgMHgwMDAwMDAwZCwKKwkweDBhMDAwNmZkLCAweDhmYmYwMDE4LCAweDBlMDAwODI2LCAweDAwMDAwMDAwLCAweDBhMDAwNmZkLCAweDhmYmYwMDE4LAorCTB4OGY0NDAxMDAsIDB4MGUwMDEyNjQsIDB4MDAwMDAwMDAsIDB4MGEwMDA2ZmQsIDB4OGZiZjAwMTgsIDB4MGUwMDEzNGUsCisJMHgwMDAwMDAwMCwgMHgwYTAwMDZmZCwgMHg4ZmJmMDAxOCwgMHgwZTAwMDg3YywgMHgyNzQ0MDEwMCwgMHgwYTAwMDZmZCwKKwkweDhmYmYwMDE4LCAweDhmNjQwMDQwLCAweDBlMDAwZmFlLCAweDAwMDAwMDAwLCAweDBhMDAwNmZkLCAweDhmYmYwMDE4LAorCTB4OGY0NDAxMDAsIDB4MGUwMDEwNTksIDB4MDAwMDAwMDAsIDB4MGEwMDA2ZmQsIDB4OGZiZjAwMTgsIDB4MGUwMDE0MTcsCisJMHgwMDAwMDAwMCwgMHgwYTAwMDZmZCwgMHg4ZmJmMDAxOCwgMHhhZmEwMDAxNCwgMHg4ZjQ0MDEwMCwgMHg4ZjQ1MDExOCwKKwkweDhmNDYwMTFjLCAweDBlMDAxNDM5LCAweDhmNDcwMTIwLCAweDBhMDAwNmZkLCAweDhmYmYwMDE4LCAweDAwMDAwMDBkLAorCTB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTAsIDB4OTc0MjAxMGMsCisJMHgxNDQwMDA1ZSwgMHgwMDgwMzgyMSwgMHgzYzAyOTAwMCwgMHgzNDQyMDAwMSwgMHgwMGUyMTAyNSwgMHhhZjQyMDAyMCwKKwkweDNjMDM4MDAwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDkzNjIwMDIzLAorCTB4MzA0MjAwMTAsIDB4MTQ0MDAwMjYsIDB4M2MwMzA4MDAsIDB4OGY2MzAwNzQsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsCisJMHgwMDYyMTgyNCwgMHhhZjYzMDA3NCwgMHg5MzYyMDAwNSwgMHgzNDQyMDAwMSwgMHhhMzYyMDAwNSwgMHg4ZjYzMDA0YywKKwkweDhmNjIwMDU0LCAweDEwNjIwMDIxLCAweDI0MDQwMDAxLCAweDk3NjIwMDZhLCAweDAwMDIyODgwLCAweDUwYTAwMDAxLAorCTB4MjQwNTAwMDEsIDB4OTc2MzAwNjgsIDB4OTM2NDAwODEsIDB4M2MwMjA4MDAsIDB4OGM0NjAwNGMsIDB4MDA2NTI4MjEsCisJMHgwMDg1MjgwNCwgMHgwMGM1MTAyYiwgMHg1NDQwMDAwMSwgMHgwMGEwMzAyMSwgMHgzYzAyMDgwMCwgMHg4YzQ0MDA1MCwKKwkweDAwYzQxODJiLCAweDU0NjAwMDAxLCAweDAwYzAyMDIxLCAweDhmNDIwMDc0LCAweDI0MDNmZmZlLCAweDAwODMyODI0LAorCTB4MDBhMjEwMjEsIDB4YWY2MjAwMGMsIDB4MGEwMDA3M2QsIDB4MjQwNDAwMDEsIDB4OGM2MjAwYTgsIDB4MDAwMDIwMjEsCisJMHgyNDQyMDAwMSwgMHhhYzYyMDBhOCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDQ0ZCwgMHgzYzAyODAwMCwKKwkweDM0NDIwMDAxLCAweDAwZTIxMDI1LCAweGFmNDIwMDIwLCAweDEwODAwMDFmLCAweDNjMDI5MDAwLCAweDM0NDIwMDAxLAorCTB4MDBlMjEwMjUsIDB4YWY0MjAwMjAsIDB4M2MwMzgwMDAsIDB4OGY0MjAwMjAsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgwMDAwMDAwMCwgMHg5MzYyMDA3ZCwgMHgzYzAzODAwMCwgMHhhMzYyMDA3ZCwgMHg4ZjY0MDA3NCwgMHgzNDYzMDAwMSwKKwkweDAwZTMxODI1LCAweGFmNDMwMDIwLCAweDA0ODEwMDA2LCAweDNjMDM4MDAwLCAweDAwZTAyMDIxLCAweDBlMDAwNDcwLAorCTB4MjQwNTA0NTUsIDB4MGEwMDA3NjEsIDB4MDAwMDAwMDAsIDB4OGY0MjAxZjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgyNDAyMDAwMiwgMHgzYzAzMTAwMCwgMHhhZjQ3MDFjMCwgMHhhMzQyMDFjNCwgMHhhZjQzMDFmOCwgMHgwZTAwMTE2MywKKwkweDAwMDAwMDAwLCAweDhmYmYwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDI3YmRmZmQ4LCAweGFmYmYwMDI0LAorCTB4YWZiNDAwMjAsIDB4YWZiMzAwMWMsIDB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsIDB4YWZiMDAwMTAsIDB4OTM2MzAwMDUsCisJMHgwMDgwOTgyMSwgMHgyNDAyMDAzMCwgMHgzMDYzMDAzMCwgMHgxNDYyMDBhYywgMHgwMGEwYTAyMSwgMHgzYzAyMDgwMCwKKwkweDhjNDMwMDIwLCAweDEwNjAwMGE2LCAweDAwMDAwMDAwLCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLCAweDhmODMwMDE4LAorCTB4YWM3MzAwMDAsIDB4OTM2MjAwYzQsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDQsIDB4MjQwMjAwMDEsIDB4OGY4MzAwMTgsCisJMHgwYTAwMDc4NCwgMHgwMDAwMDAwMCwgMHg4ZjgzMDAxOCwgMHgyNDAyMDAwMywgMHhhYzYyMDAwNCwgMHg4ZjYyMDBkYywKKwkweDhmNjMwMDQwLCAweDAwNDMxMDIzLCAweDE4NDAwMDA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLAorCTB4MjQwMDA1MDksIDB4OGY4NDAwMTgsIDB4OGY2MjAwZGMsIDB4YWM4MjAwMDgsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMGMsCisJMHg4ZjgyMDAxOCwgMHhhYzQwMDAxMCwgMHg4ZjgzMDAxOCwgMHg4ZjYyMDA0YywgMHgzYzEwMDgwMCwgMHhhYzYyMDAxNCwKKwkweDhmODUwMDE4LCAweDNjMDI2MDAwLCAweDhjNDM0NDQ4LCAweDI2MTI1OGMwLCAweDAwMDAyMDIxLCAweGFjYTMwMDE4LAorCTB4OTY0MjAwMGUsIDB4OGY4NTAwMTgsIDB4M2MwMzQwMTAsIDB4MDA0MzEwMjUsIDB4MGUwMDE0Y2MsIDB4YWNhMjAwMWMsCisJMHg4ZjgzMDAxOCwgMHhhYzczMDAwMCwgMHg5MzYyMDAzZSwgMHg5MzYzMDAzZiwgMHg4Zjg0MDAxOCwgMHgwMDAyMTIwMCwKKwkweDAwNjIxODI1LCAweGFjODMwMDA0LCAweDkzNjIwMDgxLCAweDkzNjMwMDgyLCAweDhmODQwMDE4LCAweDAwMDIxNjAwLAorCTB4MDAwMzFjMDAsIDB4MDA0MzEwMjUsIDB4YWM4MjAwMDgsIDB4OGY4MzAwMTgsIDB4OGY2MjAwNDAsIDB4YWM2MjAwMGMsCisJMHg4Zjg0MDAxOCwgMHg4ZjYyMDA0OCwgMHhhYzgyMDAxMCwgMHg4ZjcxMDA0YywgMHg4ZjgyMDAxOCwgMHhhYzUxMDAxNCwKKwkweDhmNjIwMDUwLCAweDhmODUwMDE4LCAweDAwNDAxODIxLCAweDAyMjIxMDIzLCAweDVjNDAwMDAxLCAweDAyMjAxODIxLAorCTB4MDAwMDIwMjEsIDB4YWNhMzAwMTgsIDB4OTY0MjAwMGUsIDB4OGY4NTAwMTgsIDB4M2MwM2MwMGIsIDB4MDA0MzEwMjUsCisJMHgwZTAwMTRjYywgMHhhY2EyMDAxYywgMHg4ZjYyMDA1NCwgMHg4Zjg0MDAxOCwgMHgwMDQwMTgyMSwgMHgwMjIyMTAyMywKKwkweDVjNDAwMDAxLCAweDAyMjAxODIxLCAweGFjODMwMDAwLCAweDhmODQwMDE4LCAweDhmNjMwMDU4LCAweGFjODMwMDA0LAorCTB4OTM2MjAwMjMsIDB4MzA0MjAwMTAsIDB4MTA0MDAwMDQsIDB4MDAwMDAwMDAsIDB4OGY4MzAwMTgsIDB4MGEwMDA3ZGQsCisJMHg4ZjYyMDE0OCwgMHg4ZjgzMDAxOCwgMHg4ZjYyMDA1YywgMHhhYzYyMDAwOCwgMHg4ZjgzMDAxOCwgMHg4ZjYyMDA2MCwKKwkweGFjNjIwMDBjLCAweDhmODQwMDE4LCAweDhmNjIwMDY0LCAweGFjODIwMDEwLCAweDk3NjMwMDY4LCAweDk3NjIwMDZhLAorCTB4OGY4NDAwMTgsIDB4MDAwMzFjMDAsIDB4MDA0MzEwMjUsIDB4YWM4MjAwMTQsIDB4OGY4NTAwMTgsIDB4MDAwMDIwMjEsCisJMHgyNDAyZmZmZiwgMHgyNjAzNThjMCwgMHhhY2EyMDAxOCwgMHg5NDYyMDAwZSwgMHg4Zjg1MDAxOCwgMHgzYzAzYzAwYywKKwkweDAwNDMxMDI1LCAweDBlMDAxNGNjLCAweGFjYTIwMDFjLCAweDhmODQwMDE4LCAweDhmNjMwMDE4LCAweGFjODMwMDAwLAorCTB4OTM2MjAwYzQsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDYsIDB4MDAwMDAwMDAsIDB4OTc2MjAwYzgsIDB4OGY4MzAwMTgsCisJMHgzMDQyZmZmZiwgMHgwYTAwMDgwMywgMHhhYzYyMDAwNCwgMHg4ZjgyMDAxOCwgMHhhYzQwMDAwNCwgMHg4ZjgzMDAxOCwKKwkweDhmNjIwMDZjLCAweGFjNjIwMDA4LCAweDhmODQwMDE4LCAweDhmNjIwMGRjLCAweGFjODIwMDBjLCAweDhmODMwMDE4LAorCTB4YWM2MDAwMTAsIDB4OTM2MjAwMDUsIDB4OGY4MzAwMTgsIDB4MDAwMjE2MDAsIDB4MDA1NDEwMjUsIDB4YWM2MjAwMTQsCisJMHg4Zjg1MDAxOCwgMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwgMHgyNDA0MDAwMSwgMHgyNjAyNThjMCwgMHhhY2EzMDAxOCwKKwkweDk0NDMwMDBlLCAweDhmODUwMDE4LCAweDNjMDI0MDBkLCAweDAwNjIxODI1LCAweDBlMDAxNGNjLCAweGFjYTMwMDFjLAorCTB4MGUwMDEyMmUsIDB4MDI2MDIwMjEsIDB4OGZiZjAwMjQsIDB4OGZiNDAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsCisJMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgyN2JkZmZlMCwgMHhhZmIwMDAxMCwKKwkweDI3NTAwMTAwLCAweGFmYmYwMDE4LCAweGFmYjEwMDE0LCAweDk2MDMwMDBjLCAweDI0MDIwMGMxLCAweDU0NjIwMDI0LAorCTB4OGUwNDAwMDAsIDB4M2MwMjkwMDAsIDB4OGY0NTAxMDAsIDB4MzQ0MjAwMDEsIDB4M2MwMzgwMDAsIDB4MDBhMjEwMjUsCisJMHhhZjQyMDAyMCwgMHg4ZjQyMDAyMCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg5MzYyMDA3ZCwKKwkweDNjMDM4MDAwLCAweDM0NDIwMDA0LCAweGEzNjIwMDdkLCAweDhmNjQwMDc0LCAweDM0NjMwMDAxLCAweDAwYTMxODI1LAorCTB4YWY0MzAwMjAsIDB4MDQ4MTAwMDYsIDB4M2MwMzgwMDAsIDB4MDBhMDIwMjEsIDB4MGUwMDA0NzAsIDB4MjQwNTA1YjIsCisJMHgwYTAwMDg3OCwgMHg4ZmJmMDAxOCwgMHg4ZjQyMDFmOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMiwKKwkweDNjMDMxMDAwLCAweGFmNDUwMWMwLCAweGEzNDIwMWM0LCAweGFmNDMwMWY4LCAweDBhMDAwODc4LCAweDhmYmYwMDE4LAorCTB4OGY2NTAwNGMsIDB4MjQwNjAwMDEsIDB4MGUwMDEyYTMsIDB4MjQwNzA1YmUsIDB4M2MwMjA4MDAsIDB4OGM0MzAwMjAsCisJMHg5NjExMDAwYywgMHgxMDYwMDAxZCwgMHg4ZTEwMDAwMCwgMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAxOCwKKwkweGFjNTAwMDAwLCAweDhmODQwMDE4LCAweDAwMTExNDAwLCAweGFjODIwMDA0LCAweDhmODMwMDE4LCAweGFjNjAwMDA4LAorCTB4OGY4MjAwMTgsIDB4YWM0MDAwMGMsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsIDB4OGY4NDAwMTgsIDB4MjQwMjA1YzEsCisJMHhhYzgyMDAxNCwgMHg4Zjg1MDAxOCwgMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwgMHgyNDA0MDAwMSwgMHgzYzAyMDgwMCwKKwkweGFjYTMwMDE4LCAweDk0NDM1OGNlLCAweDhmODUwMDE4LCAweDNjMDI0MDE5LCAweDAwNjIxODI1LCAweDBlMDAxNGNjLAorCTB4YWNhMzAwMWMsIDB4OGZiZjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsCisJMHgyN2JkZmZiMCwgMHhhZmI1MDAzYywgMHgwMDAwYTgyMSwgMHhhZmJlMDA0OCwgMHgwMDAwZjAyMSwgMHhhZmI3MDA0NCwKKwkweDAwMDBiODIxLCAweGFmYjMwMDM0LCAweDAwMDA5ODIxLCAweGFmYjYwMDQwLCAweDAwODBiMDIxLCAweGFmYmYwMDRjLAorCTB4YWZiNDAwMzgsIDB4YWZiMjAwMzAsIDB4YWZiMTAwMmMsIDB4YWZiMDAwMjgsIDB4YWZhMDAwMTAsIDB4OGY2MjAwNDAsCisJMHg4ZWMzMDAxNCwgMHg5NmQxMDAwYywgMHgwMDQzMTAyMywgMHgwNDQxMDAyNSwgMHg4ZWQ0MDAwMCwgMHgzMjIyMDQwMSwKKwkweDEwNDAwMzBjLCAweDNjMDI5MDAwLCAweDM0NDIwMDAxLCAweDAyODIxMDI1LCAweGFmNDIwMDIwLCAweDNjMDM4MDAwLAorCTB4OGY0MjAwMjAsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OTM2MjAwN2QsIDB4M2MwMzgwMDAsCisJMHgzNDQyMDAwNCwgMHhhMzYyMDA3ZCwgMHg4ZjY0MDA3NCwgMHgzNDYzMDAwMSwgMHgwMjgzMTgyNSwgMHhhZjQzMDAyMCwKKwkweDA0ODEwMDA2LCAweDNjMDM4MDAwLCAweDAyODAyMDIxLCAweDBlMDAwNDcwLCAweDI0MDUwNjY0LCAweDBhMDAwYmEyLAorCTB4OGZiZjAwNGMsIDB4OGY0MjAxZjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MjQwMjAwMDIsIDB4M2MwMzEwMDAsCisJMHhhZjU0MDFjMCwgMHhhMzQyMDFjNCwgMHhhZjQzMDFmOCwgMHgwYTAwMGJhMiwgMHg4ZmJmMDA0YywgMHgzMjIyMDAxMCwKKwkweDEwNDAwMDZiLCAweDAwMDAzMDIxLCAweDkzNjIwMDNmLCAweDkyYzYwMDBmLCAweDMwNDUwMGZmLCAweDI0YzNmZmY4LAorCTB4MmM2MjAwMGYsIDB4MTA0MDAwNTcsIDB4M2MwMjA4MDAsIDB4MjQ0MjU3YzAsIDB4MDAwMzE4ODAsIDB4MDA2MjE4MjEsCisJMHg4YzY0MDAwMCwgMHgwMDgwMDAwOCwgMHgwMDAwMDAwMCwgMHgzOGEyMDAxMiwgMHgwYTAwMDkyNCwgMHgwMDAyYTgyYiwKKwkweDI0MDIwMDBlLCAweDE0YTIwMDA0LCAweDI0MDIwMDBjLCAweDI0MTUwMDAxLCAweDBhMDAwOTI0LCAweDI0MDYwMDEwLAorCTB4MTBhMjAwNDksIDB4MzhhMzAwMTAsIDB4MmM2MzAwMDEsIDB4MzhhMjAwMTYsIDB4MmM0MjAwMDEsIDB4MDA2MjE4MjUsCisJMHgxNDYwMDA0ZCwgMHgwMDAwYTgyMSwgMHgyNDAyMDAxNCwgMHgxMGEyMDA0YSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwKKwkweDAwMDAwMDAwLCAweDI0MDAwNjljLCAweDBhMDAwOTI0LCAweDAwMDBhODIxLCAweDI0MDIwMDE2LCAweDE0YTIwMDA1LAorCTB4MjQwMjAwMGMsIDB4MjQxNTAwMDEsIDB4MjQwNjAwMTAsIDB4MGEwMDA5MjQsIDB4MzIzMWZmZmQsIDB4MTBhMjAwMzIsCisJMHgzOGEzMDAxMCwgMHgyYzYzMDAwMSwgMHgzOGEyMDAwZSwgMHgyYzQyMDAwMSwgMHgwMDYyMTgyNSwgMHgxNDYwMDAzNiwKKwkweDAwMDBhODIxLCAweDI0MDIwMDE0LCAweDE0YTIwMDAzLCAweDI0MTUwMDAxLCAweDBhMDAwOTI0LCAweDI0MDYwMDEyLAorCTB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MjQwMDA2YmMsIDB4MGEwMDA5MjQsIDB4MDAwMGE4MjEsIDB4MjQwMjAwMGUsCisJMHgxNGEyMDAwNCwgMHgyNDAyMDAxNiwgMHgyNDE1MDAwMSwgMHgwYTAwMDkyNCwgMHgzMjMxZmZmYiwgMHgxNGEyMDAwNCwKKwkweDI0MDIwMDE0LCAweDI0MTUwMDAxLCAweDBhMDAwOTI0LCAweDMyMzFmZmZkLCAweDU0YTIwMDEzLCAweDkyYzIwMDBlLAorCTB4MjQxNTAwMDEsIDB4MjQwNjAwMTIsIDB4MGEwMDA5MjQsIDB4MzIzMWZmZmQsIDB4MjQwMjAwMGMsIDB4NTRhMjAwMGMsCisJMHg5MmMyMDAwZSwgMHg5MmMzMDAwZSwgMHgyNDAyMDAwYSwgMHgxMDYyMDAwNSwgMHgyNDE1MDAwMSwgMHgwMDAwMDAwZCwKKwkweDAwMDAwMDAwLCAweDI0MDAwNmU4LCAweDI0MTUwMDAxLCAweDBhMDAwOTI0LCAweDI0MDYwMDE0LCAweDkyYzIwMDBlLAorCTB4MTRhMjAwMDMsIDB4MDAwMDAwMDAsIDB4MGEwMDA5MjQsIDB4MjQxNTAwMDEsIDB4MTBhNmZmYzEsIDB4MjQwMjAwMTIsCisJMHgxMGEyMDAwNSwgMHgwMDAwYTgyMSwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDcwNCwgMHgwMDAwYTgyMSwKKwkweDEyYTAwMDIyLCAweDMyMjIwMDA0LCAweDEwNDAwMDAyLCAweDI0MDIwMDAxLCAweGFmYTIwMDEwLCAweDMyMjMwMTAyLAorCTB4MjQwMjAwMDIsIDB4MTQ2MjAwMGYsIDB4MDAwMDAwMDAsIDB4OTJjMjAwMGEsIDB4MzA0MjAwMjAsIDB4MTQ0MDAwMGIsCisJMHgwMDAwMDAwMCwgMHg4ZjYzMDA0OCwgMHg4ZjYyMDA0MCwgMHgxNDYyMDAwNCwgMHgwMDAwMDAwMCwgMHg4ZjYyMDA0OCwKKwkweDI0NDIwMDAxLCAweGFmNjIwMDQ4LCAweDhmNjIwMDQwLCAweDI0NDIwMDAxLCAweGFmNjIwMDQwLCAweGEzNjYwMDNmLAorCTB4MzhjMzAwMTIsIDB4MmM2MzAwMDEsIDB4MzhjMjAwMTAsIDB4MmM0MjAwMDEsIDB4MDA2MjE4MjUsIDB4MTA2MDAwMDUsCisJMHgzYzAzMDgwMCwgMHg4YzYyMDA3NCwgMHgyNDQyMDAwMSwgMHgwZTAwMTQwZCwgMHhhYzYyMDA3NCwgMHgzMjIyMDA0MCwKKwkweDMyMjMwMDIwLCAweGFmYTMwMDIwLCAweDMyMjMwMDgwLCAweGFmYTMwMDI0LCAweDMyMjMwMDAxLCAweGFmYTMwMDE4LAorCTB4MzIyMzAwMDgsIDB4YWZhMzAwMWMsIDB4MzIyMzAxMDAsIDB4MTA0MDAwYzQsIDB4YWZhMzAwMTQsIDB4OGVjNjAwMTAsCisJMHg4ZjYzMDA1NCwgMHgyNGMyZmZmZiwgMHgwMDQzMTAyMywgMHgxODQwMDAwNiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwKKwkweDAwMDAwMDAwLCAweDI0MDAwMTVjLCAweDBhMDAwOTg5LCAweDAwMDA5MDIxLCAweDhmNjIwMDRjLCAweDAwYzIxMDIzLAorCTB4MTg0MDAwMjgsIDB4MDAwMDkwMjEsIDB4OTM2NTAxMjAsIDB4OTM2NDAxMjEsIDB4M2MwMzA4MDAsIDB4OGM2MjAwOGMsCisJMHgzMDg0MDBmZiwgMHgyNDQyMDAwMSwgMHgzMGE1MDBmZiwgMHgwMDgwNDAyMSwgMHgxNDg1MDAwYiwgMHhhYzYyMDA4YywKKwkweDNjMDQwODAwLCAweDhjODMwMDkwLCAweDI0NjMwMDAxLCAweGFjODMwMDkwLCAweDkzNjIwMTIyLCAweDMwNDIwMDAxLAorCTB4MDAwMjEwMjMsIDB4MzA0MjAwMDUsIDB4MGEwMDA5ODksIDB4MzQ1MjAwMDQsIDB4Mjc2NzAxMDAsIDB4MDAwNDEwODAsCisJMHgwMGUyMTAyMSwgMHg4YzQzMDAwMCwgMHgwMGMzMTgyMywgMHgwNDYwMDAwNCwgMHgyNDgyMDAwMSwgMHgzMDQ0MDAwNywKKwkweDE0ODVmZmY5LCAweDAwMDQxMDgwLCAweDEwODgwMDA3LCAweDNjMDMwODAwLCAweGEzNjQwMTIxLCAweDhjNjIwMDk0LAorCTB4MjQxMjAwMDUsIDB4MjQ0MjAwMDEsIDB4MGEwMDA5ODksIDB4YWM2MjAwOTQsIDB4MjQxMjAwMDQsIDB4MzI0MjAwMDEsCisJMHgxMDQwMDAyMSwgMHgzYzAyMDgwMCwgMHg4YzQzMDAyMCwgMHg4ZWQwMDAwMCwgMHgxMDYwMDAxYywgMHg4ZWQzMDAxMCwKKwkweDBlMDAxNDhlLCAweDAwMDAwMDAwLCAweDhmODIwMDE4LCAweGFjNTAwMDAwLCAweDhmODQwMDE4LCAweDI0MDIwMDAxLAorCTB4YWM4MjAwMDQsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMDgsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMGMsIDB4OGY4MzAwMTgsCisJMHhhYzYwMDAxMCwgMHg4ZjgyMDAxOCwgMHhhYzUzMDAxNCwgMHg4Zjg1MDAxOCwgMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwKKwkweDI0MDQwMDAxLCAweDNjMDIwODAwLCAweGFjYTMwMDE4LCAweDk0NDM1OGNlLCAweDhmODUwMDE4LCAweDNjMDI0MDEwLAorCTB4MDA2MjE4MjUsIDB4MGUwMDE0Y2MsIDB4YWNhMzAwMWMsIDB4MjQxMzAwMDEsIDB4MzI0MjAwMDQsIDB4MTA0MDAwNjgsCisJMHgwMDAwMzgyMSwgMHgzYzAyOTAwMCwgMHg4ZWM2MDAxMCwgMHgzNDQyMDAwMSwgMHgzYzAzODAwMCwgMHgwMjgyMTAyNSwKKwkweGEzNjAwMDdjLCAweGFmNDIwMDIwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLAorCTB4OTM2MjAwMjMsIDB4MzA0MjAwODAsIDB4MTA0MDAwMTEsIDB4MDAwMDAwMDAsIDB4OGY2NTAwNWMsIDB4OGY2MzAwNGMsCisJMHg5NzY0MDAzYywgMHg4ZjYyMDA2NCwgMHgwMGEzMjgyMywgMHgwMDg1MjgyMSwgMHgwMGEyMTAyYiwgMHg1NDQwMDAwNiwKKwkweDNjMDIzZmZmLCAweDkzNjIwMDIzLCAweDMwNDIwMDdmLCAweGEzNjIwMDIzLCAweGFmNjYwMDY0LCAweDNjMDIzZmZmLAorCTB4MGEwMDA5ZGEsIDB4MzQ0MmZmZmYsIDB4OGY2MjAwNWMsIDB4MDBjMjEwMjMsIDB4MDQ0MDAwMTEsIDB4MDAwMDAwMDAsCisJMHg4ZjY1MDA1YywgMHg4ZjYzMDA2NCwgMHg5NzY0MDAzYywgMHgzYzAyM2ZmZiwgMHgzNDQyZmZmZiwgMHhhZjY2MDA2NCwKKwkweDAwYTMyODIzLCAweDAwODUyODIxLCAweDAwNDUxMDJiLCAweDEwNDAwMDA0LCAweDAwYzUxMDIxLCAweDNjMDUzZmZmLAorCTB4MzRhNWZmZmYsIDB4MDBjNTEwMjEsIDB4YWY2MjAwNWMsIDB4MjQwNzAwMDEsIDB4YWY2NjAwNGMsIDB4OGZhMjAwMTAsCisJMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwgMHhhZjY2MDA1MCwgMHhhZjY2MDA1NCwgMHg4ZjYyMDA1NCwgMHgxNGMyMDAwNSwKKwkweDAwMDAwMDAwLCAweDkzNjIwMDIzLCAweDMwNDIwMDQwLCAweDEwNDAwMDE3LCAweDI0MDIwMDAxLCAweDk3NjIwMDZhLAorCTB4MDAwMjI4ODAsIDB4NTBhMDAwMDEsIDB4MjQwNTAwMDEsIDB4OTc2MzAwNjgsIDB4OTM2NDAwODEsIDB4M2MwMjA4MDAsCisJMHg4YzQ2MDA0YywgMHgwMDY1MjgyMSwgMHgwMDg1MjgwNCwgMHgwMGM1MTAyYiwgMHg1NDQwMDAwMSwgMHgwMGEwMzAyMSwKKwkweDNjMDIwODAwLCAweDhjNDQwMDUwLCAweDAwYzQxODJiLCAweDU0NjAwMDAxLCAweDAwYzAyMDIxLCAweDhmNDIwMDc0LAorCTB4MjQwM2ZmZmUsIDB4MDA4MzI4MjQsIDB4MDBhMjEwMjEsIDB4YWY2MjAwMGMsIDB4OTM2MjAwODIsIDB4MzA0MjAwODAsCisJMHg1MDQwMDAwMSwgMHhhMzYwMDA4MSwgMHgzYzAyODAwMCwgMHgzNDQyMDAwMSwgMHgwMjgyMTAyNSwgMHhhZjQyMDAyMCwKKwkweDkzNjMwMDdlLCAweDkzNjIwMDdhLCAweDEwNjIwMDA1LCAweDAwZTBiODIxLCAweDBlMDAxM2M0LCAweDAwMDAwMDAwLAorCTB4MDA0MDM4MjEsIDB4MDBlMGI4MjEsIDB4OGZhMzAwMjAsIDB4MTA2MDAwMDksIDB4OGZhMjAwMTAsIDB4OGVjMjAwMTgsCisJMHhhZjYyMDAxOCwgMHg4ZWMzMDAxYywgMHhhZjYzMDAxYywgMHg4ZWMyMDAyMCwgMHgyNDE3MDAwMSwgMHhhZjYyMDA1OCwKKwkweDhmYTIwMDEwLCAweDEwNDAwMDU3LCAweDhmYTMwMDI0LCAweDkzNjIwMDIzLCAweDMwNDIwMDQwLCAweDEwNDAwMDUzLAorCTB4MDAwMDAwMDAsIDB4MTY2MDAwMjEsIDB4M2MxMjA4MDAsIDB4OGU0MjAwMjAsIDB4OGY3MDAwNGMsIDB4MTA0MDAwMWUsCisJMHgyNDEzMDAwMSwgMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAxOCwgMHhhYzU0MDAwMCwgMHg4Zjg0MDAxOCwKKwkweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDhmODMwMDE4LCAweGFjNjAwMDA4LCAweDhmODIwMDE4LCAweGFjNDAwMDBjLAorCTB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsIDB4OGY4MjAwMTgsIDB4YWM1MDAwMTQsIDB4OGY4NTAwMTgsIDB4M2MwMjYwMDAsCisJMHg4YzQzNDQ0OCwgMHgyNDA0MDAwMSwgMHgzYzAyMDgwMCwgMHhhY2EzMDAxOCwgMHg5NDQzNThjZSwgMHg4Zjg1MDAxOCwKKwkweDNjMDI0MDEwLCAweDAwNjIxODI1LCAweGFjYTMwMDFjLCAweDBlMDAxNGNjLCAweDI0MTMwMDAxLCAweDhlNDIwMDIwLAorCTB4MTA0MDAwMWMsIDB4OGVkMDAwMDAsIDB4MGUwMDE0OGUsIDB4MDAwMDAwMDAsIDB4OGY4MjAwMTgsIDB4YWM1MDAwMDAsCisJMHg4ZjgzMDAxOCwgMHhhYzYwMDAwNCwgMHg4ZjgyMDAxOCwgMHhhYzQwMDAwOCwgMHg4ZjgzMDAxOCwgMHhhYzYwMDAwYywKKwkweDhmODIwMDE4LCAweGFjNDAwMDEwLCAweDhmODMwMDE4LCAweDI0MDIwNzk4LCAweGFjNjIwMDE0LCAweDhmODUwMDE4LAorCTB4M2MwMjYwMDAsIDB4OGM0MzQ0NDgsIDB4MjQwNDAwMDEsIDB4M2MwMjA4MDAsIDB4YWNhMzAwMTgsIDB4OTQ0MzU4Y2UsCisJMHg4Zjg1MDAxOCwgMHgzYzAyNDAxOSwgMHgwMDYyMTgyNSwgMHgwZTAwMTRjYywgMHhhY2EzMDAxYywgMHgzYzAyOTAwMCwKKwkweDM0NDIwMDAxLCAweDAyODIxMDI1LCAweGFmNDIwMDIwLCAweDNjMDM4MDAwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LAorCTB4MTQ0MGZmZmQsIDB4MjQwMjAwMDEsIDB4YWY2MjAwMGMsIDB4OTM2MzAwMjMsIDB4M2MwMjgwMDAsIDB4MzQ0MjAwMDEsCisJMHgwMjgyMTAyNSwgMHgzMDYzMDBiZiwgMHhhMzYzMDAyMywgMHhhZjQyMDAyMCwgMHg4ZmEzMDAyNCwgMHgxMDYwMDAxMiwKKwkweDhmYTMwMDE4LCAweDkzNjIwMDdjLCAweDI0NDIwMDAxLCAweGEzNjIwMDdjLCAweDkzNjMwMDdlLCAweDkzNjIwMDdhLAorCTB4MTQ2MjAwMGIsIDB4OGZhMzAwMTgsIDB4OTM2MjAwN2MsIDB4M2MwMzA4MDAsIDB4OGM2NDAwMjQsIDB4MDA0NDEwMmIsCisJMHgxNDQwMDAwNSwgMHg4ZmEzMDAxOCwgMHgwZTAwMTNjNCwgMHgwMDAwMDAwMCwgMHgwMmUyYjgyNSwgMHg4ZmEzMDAxOCwKKwkweDMwNjJmZmZmLCAweDEwNDAwMDAzLCAweDMyMjIwMjAwLCAweDBhMDAwYTk0LCAweDI0MWUwMDA0LCAweDEwNDAwMDAzLAorCTB4MDAwMDAwMDAsIDB4MjQxZTAwNDAsIDB4MjQxNzAwMDEsIDB4MTJhMDAwZDAsIDB4MzIyMjAwMDIsIDB4MTA0MDAwY2YsCisJMHg4ZmEyMDAxYywgMHg5MmMyMDAwYSwgMHgzMDQyMDAwMiwgMHg1MDQwMDAzYiwgMHg5MmMyMDAwYSwgMHg5MzYyMDAyMywKKwkweDMwNDIwMDA4LCAweDU0NDAwMDM3LCAweDkyYzIwMDBhLCAweDNjMDIwODAwLCAweDhjNDMwMDIwLCAweDEwNjAwMDIzLAorCTB4M2MwMjkwMDAsIDB4MGUwMDE0OGUsIDB4MDAwMDAwMDAsIDB4OGY4NDAwMTgsIDB4OGVjMzAwMDAsIDB4YWM4MzAwMDAsCisJMHg5MmMyMDAwYSwgMHg4ZjgzMDAxOCwgMHgwMDAyMTYwMCwgMHhhYzYyMDAwNCwgMHg4Zjg0MDAxOCwgMHg4ZjYyMDA0MCwKKwkweGFjODIwMDA4LCAweDhmODUwMDE4LCAweDhmNjMwMDRjLCAweGFjYTMwMDBjLCAweDkzNjIwMDNmLCAweDhmODQwMDE4LAorCTB4MzA0MjAwZmYsIDB4YWM4MjAwMTAsIDB4OGY4MzAwMTgsIDB4M2MwMjYwMDAsIDB4YWM2MDAwMTQsIDB4OGY4NTAwMTgsCisJMHg4YzQzNDQ0OCwgMHgyNDA0MDAwMSwgMHgzYzAyMDgwMCwgMHhhY2EzMDAxOCwgMHg5NDQzNThjZSwgMHg4Zjg1MDAxOCwKKwkweDNjMDI0MDFhLCAweDAwNjIxODI1LCAweDBlMDAxNGNjLCAweGFjYTMwMDFjLCAweDNjMDI5MDAwLCAweDM0NDIwMDAxLAorCTB4MDI4MjEwMjUsIDB4YWY0MjAwMjAsIDB4M2MwMzgwMDAsIDB4OGY0MjAwMjAsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgwMDAwMDAwMCwgMHg5MzYzMDAyMywgMHgzYzAyODAwMCwgMHgzNDQyMDAwMSwgMHgwMjgyMTAyNSwgMHgzNDYzMDAwOCwKKwkweGEzNjMwMDIzLCAweGFmNDIwMDIwLCAweDkyYzIwMDBhLCAweDMwNDIwMDIwLCAweDEwNDAwMDhlLCAweDhmYTIwMDFjLAorCTB4OTM2MjAwMjMsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMzUsIDB4M2MwMjA4MDAsIDB4OGM0MzAwMjAsIDB4MTA2MDAwMjMsCisJMHgzYzAyOTAwMCwgMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4Zjg0MDAxOCwgMHg4ZWMzMDAwMCwgMHhhYzgzMDAwMCwKKwkweDkyYzIwMDBhLCAweDhmODMwMDE4LCAweDAwMDIxNjAwLCAweGFjNjIwMDA0LCAweDhmODQwMDE4LCAweDhmNjIwMDQwLAorCTB4YWM4MjAwMDgsIDB4OGY4NTAwMTgsIDB4OGY2MzAwNGMsIDB4YWNhMzAwMGMsIDB4OTM2MjAwM2YsIDB4OGY4NDAwMTgsCisJMHgzMDQyMDBmZiwgMHhhYzgyMDAxMCwgMHg4ZjgzMDAxOCwgMHgzYzAyNjAwMCwgMHhhYzYwMDAxNCwgMHg4Zjg1MDAxOCwKKwkweDhjNDM0NDQ4LCAweDI0MDQwMDAxLCAweDNjMDIwODAwLCAweGFjYTMwMDE4LCAweDk0NDM1OGNlLCAweDhmODUwMDE4LAorCTB4M2MwMjQwMWEsIDB4MDA2MjE4MjUsIDB4MGUwMDE0Y2MsIDB4YWNhMzAwMWMsIDB4M2MwMjkwMDAsIDB4MzQ0MjAwMDEsCisJMHgwMjgyMTAyNSwgMHhhZjQyMDAyMCwgMHgzYzAzODAwMCwgMHg4ZjQyMDAyMCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwKKwkweDAwMDAwMDAwLCAweDkzNjMwMDIzLCAweDNjMDI4MDAwLCAweDM0NDIwMDAxLCAweDAyODIxMDI1LCAweDM0NjMwMDAxLAorCTB4YTM2MzAwMjMsIDB4YWY0MjAwMjAsIDB4OTM2MjAwMjMsIDB4MzA0MjAwNDAsIDB4MTA0MDAwNTIsIDB4OGZhMjAwMWMsCisJMHgxNjYwMDAyMCwgMHgzYzEyMDgwMCwgMHg4ZTQyMDAyMCwgMHg4ZjcwMDA0YywgMHgxMDQwMDAzYywgMHgzYzAyOTAwMCwKKwkweDBlMDAxNDhlLCAweDAwMDAwMDAwLCAweDhmODIwMDE4LCAweGFjNTQwMDAwLCAweDhmODQwMDE4LCAweDI0MDIwMDAxLAorCTB4YWM4MjAwMDQsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMDgsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMGMsIDB4OGY4MzAwMTgsCisJMHhhYzYwMDAxMCwgMHg4ZjgyMDAxOCwgMHhhYzUwMDAxNCwgMHg4Zjg1MDAxOCwgMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwKKwkweDI0MDQwMDAxLCAweDNjMDIwODAwLCAweGFjYTMwMDE4LCAweDk0NDM1OGNlLCAweDhmODUwMDE4LCAweDNjMDI0MDEwLAorCTB4MDA2MjE4MjUsIDB4MGUwMDE0Y2MsIDB4YWNhMzAwMWMsIDB4OGU0MjAwMjAsIDB4MTA0MDAwMWUsIDB4M2MwMjkwMDAsCisJMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAxOCwgMHhhYzU0MDAwMCwgMHg4Zjg0MDAxOCwgMHgzYzAyMDA4ZCwKKwkweGFjODIwMDA0LCAweDhmODMwMDE4LCAweGFjNjAwMDA4LCAweDhmODIwMDE4LCAweGFjNDAwMDBjLCAweDhmODMwMDE4LAorCTB4YWM2MDAwMTAsIDB4OGY4NDAwMTgsIDB4MjQwMjA3ZWUsIDB4YWM4MjAwMTQsIDB4OGY4NTAwMTgsIDB4M2MwMjYwMDAsCisJMHg4YzQzNDQ0OCwgMHgyNDA0MDAwMSwgMHgzYzAyMDgwMCwgMHhhY2EzMDAxOCwgMHg5NDQzNThjZSwgMHg4Zjg1MDAxOCwKKwkweDNjMDI0MDE5LCAweDAwNjIxODI1LCAweDBlMDAxNGNjLCAweGFjYTMwMDFjLCAweDNjMDI5MDAwLCAweDM0NDIwMDAxLAorCTB4MDI4MjEwMjUsIDB4YWY0MjAwMjAsIDB4M2MwMzgwMDAsIDB4OGY0MjAwMjAsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgwMDAwMDAwMCwgMHg5MzYzMDAyMywgMHgzYzAyODAwMCwgMHgzNDQyMDAwMSwgMHgwMjgyMTAyNSwgMHgzMDYzMDBiZiwKKwkweGEzNjMwMDIzLCAweGFmNDIwMDIwLCAweDhmYTIwMDFjLCAweDEwNDAwMDBlLCAweDhmYTIwMDE0LCAweDkyYzIwMDBhLAorCTB4YTM2MjAwODIsIDB4NTdjMDAwMDUsIDB4MzdkZTAwMDgsIDB4OGZhMzAwMTQsIDB4MTA2MDAwMDQsIDB4MDAwMDAwMDAsCisJMHgzN2RlMDAwOCwgMHgwYTAwMGI3NSwgMHgyNDE3MDAwMSwgMHgwZTAwMTJjZiwgMHgwMjgwMjAyMSwgMHg4ZmEyMDAxNCwKKwkweDEwNDAwMDAzLCAweDAwMDAwMDAwLCAweDM3ZGUwMDEwLCAweDI0MTcwMDAxLCAweDEyZTAwMDIwLCAweDNjMDI5MDAwLAorCTB4MzQ0MjAwMDEsIDB4MDI4MjEwMjUsIDB4YWY0MjAwMjAsIDB4M2MwMzgwMDAsIDB4OGY0MjAwMjAsIDB4MDA0MzEwMjQsCisJMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg5MzYyMDA3ZCwgMHgzYzAzODAwMCwgMHgwM2MyMTAyNSwgMHhhMzYyMDA3ZCwKKwkweDhmNjQwMDc0LCAweDM0NjMwMDAxLCAweDAyODMxODI1LCAweGFmNDMwMDIwLCAweDA0ODEwMDA2LCAweDNjMDM4MDAwLAorCTB4MDI4MDIwMjEsIDB4MGUwMDA0NzAsIDB4MjQwNTA4MmEsIDB4MGEwMDBiOWIsIDB4MDAwMDAwMDAsIDB4OGY0MjAxZjgsCisJMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMiwgMHgzYzAzMTAwMCwgMHhhZjU0MDFjMCwgMHhhMzQyMDFjNCwKKwkweGFmNDMwMWY4LCAweDkzNjMwMDNmLCAweDI0MDIwMDEyLCAweDE0NjIwMDA0LCAweDhmYmYwMDRjLCAweDBlMDAxNDBkLAorCTB4MDAwMDAwMDAsIDB4OGZiZjAwNGMsIDB4OGZiZTAwNDgsIDB4OGZiNzAwNDQsIDB4OGZiNjAwNDAsIDB4OGZiNTAwM2MsCisJMHg4ZmI0MDAzOCwgMHg4ZmIzMDAzNCwgMHg4ZmIyMDAzMCwgMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwgMHgwM2UwMDAwOCwKKwkweDI3YmQwMDUwLCAweDI3YmRmZmU4LCAweGFmYmYwMDE0LCAweGFmYjAwMDEwLCAweDhmNTAwMTgwLCAweDk3NDIwMTg0LAorCTB4MzA0MjAyMDAsIDB4MTQ0MDAwMTUsIDB4MDAwMDAwMDAsIDB4OGY0MzAxODgsIDB4M2MwMmZmMDAsIDB4MDA2MjE4MjQsCisJMHgzYzAyMDIwMCwgMHgxMDYyMDAzMSwgMHgwMDQzMTAyYiwgMHgxNDQwMDAwNywgMHgzYzAyMDMwMCwgMHgxMDYwMDAwYiwKKwkweDNjMDIwMTAwLCAweDEwNjIwMDBkLCAweDAwMDAwMDAwLCAweDBhMDAwYzJjLCAweDAwMDAwMDAwLCAweDEwNjIwMDI3LAorCTB4M2MwMjA0MDAsIDB4MTA2MjAwM2UsIDB4MDIwMDIwMjEsIDB4MGEwMDBjMmMsIDB4MDAwMDAwMDAsIDB4MGUwMDBjMzEsCisJMHgwMjAwMjAyMSwgMHgwYTAwMGMyZSwgMHg4ZmJmMDAxNCwgMHg5MzYyMDAwNSwgMHgzMDQyMDAyMCwgMHgxNDQwMDA1ZSwKKwkweDhmYmYwMDE0LCAweDNjMDI5MDAwLCAweDM0NDIwMDAxLCAweDAyMDIxMDI1LCAweGFmNDIwMDIwLCAweDNjMDM4MDAwLAorCTB4OGY0MjAwMjAsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OTM2MjAwMDUsIDB4M2MwMzgwMDAsCisJMHgzNDYzMDAwMSwgMHgwMjAzMTgyNSwgMHgzNDQyMDAyMCwgMHhhMzYyMDAwNSwgMHhhZjQzMDAyMCwgMHg5MzYyMDAwNSwKKwkweDMwNDIwMDIwLCAweDE0NDAwMDAzLCAweDAyMDAyMDIxLCAweDAwMDAwMDBkLCAweDAyMDAyMDIxLCAweDBlMDAwNzY2LAorCTB4MjQwNTU4NTQsIDB4MGEwMDBjMmUsIDB4OGZiZjAwMTQsIDB4OTM2MjAwMDUsIDB4MzA0MjAwMDEsIDB4MTA0MDAwM2YsCisJMHgzYzAyOTAwMCwgMHgzNDQyMDAwMSwgMHgwMjAyMTAyNSwgMHhhZjQyMDAyMCwgMHgzYzAzODAwMCwgMHg4ZjQyMDAyMCwKKwkweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDkzNjIwMDIzLCAweDM0NDIwMDA0LCAweGEzNjIwMDIzLAorCTB4OTM2MzAwMDUsIDB4M2MwNDgwMDAsIDB4M2MwMjA4MDAsIDB4MzA2MzAwZmUsIDB4YTM2MzAwMDUsIDB4OGM0MzAwMjAsCisJMHgzNDg0MDAwMSwgMHgwMjA0MjAyNSwgMHgwYTAwMGMwYSwgMHhhZjQ0MDAyMCwgMHgwMDAwMjgyMSwgMHgwMDAwMzAyMSwKKwkweDBlMDAwZmIxLCAweDI0MDcwOGQ5LCAweDNjMDIwODAwLCAweDhjNDMwMDIwLCAweDEwNjAwMDIzLCAweDhmYmYwMDE0LAorCTB4MGUwMDE0OGUsIDB4MDAwMDAwMDAsIDB4OGY4MjAwMTgsIDB4YWM1MDAwMDAsIDB4OTM2MzAwODIsIDB4OTM2MjAwM2YsCisJMHg4Zjg0MDAxOCwgMHgwMDAzMWEwMCwgMHgwMDQzMTAyNSwgMHhhYzgyMDAwNCwgMHg4ZjgzMDAxOCwgMHhhYzYwMDAwOCwKKwkweDhmODIwMDE4LCAweGFjNDAwMDBjLCAweDhmODMwMDE4LCAweGFjNjAwMDEwLCAweDhmODIwMDE4LCAweGFjNDAwMDE0LAorCTB4OGY4NTAwMTgsIDB4M2MwMjYwMDAsIDB4OGM0MzQ0NDgsIDB4MjQwNDAwMDEsIDB4M2MwMjA4MDAsIDB4YWNhMzAwMTgsCisJMHg5NDQzNThjZSwgMHg4Zjg1MDAxOCwgMHgzYzAyNDAwYSwgMHgwMDYyMTgyNSwgMHgwZTAwMTRjYywgMHhhY2EzMDAxYywKKwkweDBhMDAwYzJlLCAweDhmYmYwMDE0LCAweDAwMDAwMDBkLCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMTgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTAsIDB4OGY0MjAxODgsIDB4MDA4MDMwMjEsIDB4OTM2NDAwMDAsCisJMHgyNDAzMDAyMCwgMHgwMDAyMTQwMiwgMHgxMDgzMDAwOCwgMHgzMDQ1MDBmZiwgMHgzYzAzNjAxOCwgMHg4YzYyNTAwMCwKKwkweDM0NDIwNDAwLCAweGFjNjI1MDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDI0MDAwOTU1LCAweDkzNjMwMDNmLAorCTB4MjQwMjAwMTIsIDB4MTQ2MjAwMjMsIDB4M2MwMjkwMDAsIDB4MzQ0MjAwMDEsIDB4M2MwMzgwMDAsIDB4MDBjMjEwMjUsCisJMHhhZjY1MDE3OCwgMHhhMzY1MDA3YSwgMHhhZjQyMDAyMCwgMHg4ZjQyMDAyMCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwKKwkweDAwMDAwMDAwLCAweDkzNjIwMDdkLCAweDNjMDM4MDAwLCAweGEzNjIwMDdkLCAweDhmNjQwMDc0LCAweDM0NjMwMDAxLAorCTB4MDBjMzE4MjUsIDB4YWY0MzAwMjAsIDB4MDQ4MTAwMDYsIDB4M2MwMzgwMDAsIDB4MDBjMDIwMjEsIDB4MGUwMDA0NzAsCisJMHgyNDA1MDk2MywgMHgwYTAwMGM3OSwgMHg4ZmJmMDAxMCwgMHg4ZjQyMDFmOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwKKwkweDI0MDIwMDAyLCAweDNjMDMxMDAwLCAweGFmNDYwMWMwLCAweGEzNDIwMWM0LCAweGFmNDMwMWY4LCAweDBhMDAwYzc5LAorCTB4OGZiZjAwMTAsIDB4OTM2MjAwN2UsIDB4MTQ0NTAwMGUsIDB4MDAwMDAwMDAsIDB4OGY2MjAxNzgsIDB4MTA0NTAwMGIsCisJMHgwMDAwMDAwMCwgMHg4ZjgyMDAwMCwgMHhhZjY1MDE3OCwgMHg4ZjY2MDE3OCwgMHg4ZjQ0MDE4MCwgMHg4ZjY1MDA0YywKKwkweDhjNDMwMDAwLCAweDAwNjBmODA5LCAweDMwYzYwMGZmLCAweDBhMDAwYzc5LCAweDhmYmYwMDEwLCAweGFmNjUwMTc4LAorCTB4OGZiZjAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTAsIDB4OTM2MzAwMDAsCisJMHgyNDAyMDAyMCwgMHgxMDYyMDAwNSwgMHgwMDAwMDAwMCwgMHg5MzYzMDAwMCwgMHgyNDAyMDAzMCwgMHgxNDYyMDA0ZCwKKwkweDhmYmYwMDEwLCAweDkzNDIwMTQ4LCAweDI0NDRmZmZmLCAweDJjODMwMDA1LCAweDEwNjAwMDQ3LCAweDNjMDIwODAwLAorCTB4MjQ0MjU4MDAsIDB4MDAwNDE4ODAsIDB4MDA2MjE4MjEsIDB4OGM2NDAwMDAsIDB4MDA4MDAwMDgsIDB4MDAwMDAwMDAsCisJMHg4ZjQzMDE0NCwgMHg4ZjYyMDAwYywgMHgxNDYyMDAwNiwgMHgyNDAyMDAwMSwgMHhhZjYyMDAwYywgMHgwZTAwMGQ1OSwKKwkweDAwMDAwMDAwLCAweDBhMDAwY2QxLCAweDhmYmYwMDEwLCAweDhmNjIwMDBjLCAweDBhMDAwY2NhLCAweDAwMDAwMDAwLAorCTB4OTc2MzAwMTAsIDB4OGY0MjAxNDQsIDB4MTQ0MzAwMDYsIDB4MjQwMjAwMDEsIDB4YTc2MjAwMTAsIDB4MGUwMDEzN2EsCisJMHgwMDAwMDAwMCwgMHgwYTAwMGNkMSwgMHg4ZmJmMDAxMCwgMHg5NzYyMDAxMCwgMHgwYTAwMGNjYSwgMHgwMDAwMDAwMCwKKwkweDk3NjMwMDEyLCAweDhmNDIwMTQ0LCAweDE0NDMwMDA2LCAweDI0MDIwMDAxLCAweGE3NjIwMDEyLCAweDBlMDAxMzk1LAorCTB4MDAwMDAwMDAsIDB4MGEwMDBjZDEsIDB4OGZiZjAwMTAsIDB4OTc2MjAwMTIsIDB4MGEwMDBjY2EsIDB4MDAwMDAwMDAsCisJMHg5NzYzMDAxNCwgMHg4ZjQyMDE0NCwgMHgxNDQzMDAwNiwgMHgyNDAyMDAwMSwgMHhhNzYyMDAxNCwgMHgwZTAwMTNiYiwKKwkweDAwMDAwMDAwLCAweDBhMDAwY2QxLCAweDhmYmYwMDEwLCAweDk3NjIwMDE0LCAweDBhMDAwY2NhLCAweDAwMDAwMDAwLAorCTB4OTc2MzAwMTYsIDB4OGY0MjAxNDQsIDB4MTQ0MzAwMDYsIDB4MjQwMjAwMDEsIDB4YTc2MjAwMTYsIDB4MGUwMDEzYmUsCisJMHgwMDAwMDAwMCwgMHgwYTAwMGNkMSwgMHg4ZmJmMDAxMCwgMHg5NzYyMDAxNiwgMHgxNDQwMDAwNiwgMHg4ZmJmMDAxMCwKKwkweDNjMDMwODAwLCAweDhjNjIwMDcwLCAweDI0NDIwMDAxLCAweGFjNjIwMDcwLCAweDhmYmYwMDEwLCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMTgsIDB4MjdiZGZmZTAsIDB4M2MwMjkwMDAsIDB4YWZiZjAwMWMsIDB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsCisJMHhhZmIwMDAxMCwgMHg4ZjUwMDE0MCwgMHgzNDQyMDAwMSwgMHgzYzAzODAwMCwgMHgwMjAyMTAyNSwgMHhhZjQyMDAyMCwKKwkweDhmNDIwMDIwLCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDEyLCAweDI0MDMwMDgwLCAweGEzNjIwMDNmLAorCTB4YTM2MzAwODIsIDB4OTM2MjAwMjMsIDB4MzA0MjAwNDAsIDB4MTA0MDAwMDcsIDB4MDAwMDg4MjEsIDB4OTM2MjAwMjMsCisJMHgyNDExMDAwMSwgMHgzMDQyMDBiZiwgMHhhMzYyMDAyMywgMHgwYTAwMGNmMCwgMHgzYzAyODAwMCwgMHgzYzAyODAwMCwKKwkweDM0NDIwMDAxLCAweDNjMDM5MDAwLCAweDM0NjMwMDAxLCAweDNjMDQ4MDAwLCAweDAyMDIxMDI1LCAweDAyMDMxODI1LAorCTB4YWY0MjAwMjAsIDB4YWY0MzAwMjAsIDB4OGY0MjAwMjAsIDB4MDA0NDEwMjQsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsCisJMHg5MzYyMDA3ZCwgMHgzYzAzODAwMCwgMHgzNDQyMDAyMCwgMHhhMzYyMDA3ZCwgMHg4ZjY0MDA3NCwgMHgzNDYzMDAwMSwKKwkweDAyMDMxODI1LCAweGFmNDMwMDIwLCAweDA0ODEwMDA2LCAweDNjMDM4MDAwLCAweDAyMDAyMDIxLCAweDBlMDAwNDcwLAorCTB4MjQwNTBhNjMsIDB4MGEwMDBkMTMsIDB4MDAwMDAwMDAsIDB4OGY0MjAxZjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgyNDAyMDAwMiwgMHgzYzAzMTAwMCwgMHhhZjUwMDFjMCwgMHhhMzQyMDFjNCwgMHhhZjQzMDFmOCwgMHgxMjIwMDAzZiwKKwkweDNjMTIwODAwLCAweDhlNDIwMDIwLCAweDhmNzEwMDRjLCAweDEwNDAwMDNjLCAweDhmYmYwMDFjLCAweDBlMDAxNDhlLAorCTB4MDAwMDAwMDAsIDB4OGY4MjAwMTgsIDB4YWM1MDAwMDAsIDB4OGY4NDAwMTgsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsCisJMHg4ZjgzMDAxOCwgMHhhYzYwMDAwOCwgMHg4ZjgyMDAxOCwgMHhhYzQwMDAwYywgMHg4ZjgzMDAxOCwgMHhhYzYwMDAxMCwKKwkweDhmODIwMDE4LCAweGFjNTEwMDE0LCAweDhmODUwMDE4LCAweDNjMDI2MDAwLCAweDhjNDM0NDQ4LCAweDI0MDQwMDAxLAorCTB4M2MwMjA4MDAsIDB4YWNhMzAwMTgsIDB4OTQ0MzU4Y2UsIDB4OGY4NTAwMTgsIDB4M2MwMjQwMTAsIDB4MDA2MjE4MjUsCisJMHgwZTAwMTRjYywgMHhhY2EzMDAxYywgMHg4ZTQyMDAyMCwgMHgxMDQwMDAxZSwgMHg4ZmJmMDAxYywgMHgwZTAwMTQ4ZSwKKwkweDAwMDAwMDAwLCAweDhmODIwMDE4LCAweGFjNTAwMDAwLCAweDhmODQwMDE4LCAweDNjMDIwMDhkLCAweGFjODIwMDA0LAorCTB4OGY4MzAwMTgsIDB4YWM2MDAwMDgsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMGMsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsCisJMHg4Zjg0MDAxOCwgMHgyNDAyMGE2YSwgMHhhYzgyMDAxNCwgMHg4Zjg1MDAxOCwgMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwKKwkweDI0MDQwMDAxLCAweDNjMDIwODAwLCAweGFjYTMwMDE4LCAweDk0NDM1OGNlLCAweDhmODUwMDE4LCAweDNjMDI0MDE5LAorCTB4MDA2MjE4MjUsIDB4MGUwMDE0Y2MsIDB4YWNhMzAwMWMsIDB4OGZiZjAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsCisJMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZlOCwgMHhhZmJmMDAxMCwgMHg5MzYyMDA4MSwKKwkweDNjMDMwODAwLCAweDhjNjQwMDQ4LCAweDAwNDQxMDJiLCAweDE0NDAwMDA1LCAweDAwMDAwMDAwLCAweDBlMDAwY2QzLAorCTB4MDAwMDAwMDAsIDB4MGEwMDBkYTQsIDB4OGZiZjAwMTAsIDB4OTM2MjAwODEsIDB4MjQ0MjAwMDEsIDB4MGUwMDEzYzQsCisJMHhhMzYyMDA4MSwgMHg5NzYzMDA2YSwgMHgwMDAzMjg4MCwgMHgxNGEwMDAwMiwgMHgwMDQwMzgyMSwgMHgyNDA1MDAwMSwKKwkweDk3NjMwMDY4LCAweDkzNjQwMDgxLCAweDNjMDIwODAwLCAweDhjNDYwMDRjLCAweDAwNjUyODIxLCAweDAwODUyODA0LAorCTB4MDBjNTEwMmIsIDB4NTQ0MDAwMDEsIDB4MDBhMDMwMjEsIDB4M2MwMjA4MDAsIDB4OGM0NDAwNTAsIDB4MDBjNDE4MmIsCisJMHg1NDYwMDAwMSwgMHgwMGMwMjAyMSwgMHg4ZjQyMDA3NCwgMHgyNDAzZmZmZSwgMHgwMDgzMjgyNCwgMHgwMGEyMTAyMSwKKwkweGFmNjIwMDBjLCAweDEwZTAwMDIxLCAweDNjMDI5MDAwLCAweDhmNDUwMTQwLCAweDM0NDIwMDAxLCAweDNjMDM4MDAwLAorCTB4MDBhMjEwMjUsIDB4YWY0MjAwMjAsIDB4OGY0MjAwMjAsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsCisJMHg5MzYyMDA3ZCwgMHgzYzAzODAwMCwgMHgzNDQyMDAwNCwgMHhhMzYyMDA3ZCwgMHg4ZjY0MDA3NCwgMHgzNDYzMDAwMSwKKwkweDAwYTMxODI1LCAweGFmNDMwMDIwLCAweDA0ODEwMDA2LCAweDNjMDM4MDAwLCAweDAwYTAyMDIxLCAweDBlMDAwNDcwLAorCTB4MjQwNTBhOTIsIDB4MGEwMDBkYTQsIDB4OGZiZjAwMTAsIDB4OGY0MjAxZjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgyNDAyMDAwMiwgMHgzYzAzMTAwMCwgMHhhZjQ1MDFjMCwgMHhhMzQyMDFjNCwgMHhhZjQzMDFmOCwgMHg4ZmJmMDAxMCwKKwkweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDI3YmRmZmQ4LCAweGFmYjMwMDFjLCAweDI3NTMwMTAwLCAweGFmYmYwMDI0LAorCTB4YWZiNDAwMjAsIDB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsIDB4YWZiMDAwMTAsIDB4OTY2MjAwMDgsIDB4M2MxNDA4MDAsCisJMHg4ZjUyMDEwMCwgMHgzMDQyMDAwMSwgMHgxMDQwMDBkYSwgMHgwMDAwMDAwMCwgMHg4ZTcwMDAxOCwgMHg4ZjYzMDA1NCwKKwkweDI2MDJmZmZmLCAweDAwNDMxMDIzLCAweDE4NDAwMDA2LCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLAorCTB4MjQwMDAxNWMsIDB4MGEwMDBkZWEsIDB4MDAwMDg4MjEsIDB4OGY2MjAwNGMsIDB4MDIwMjEwMjMsIDB4MTg0MDAwMjgsCisJMHgwMDAwODgyMSwgMHg5MzY1MDEyMCwgMHg5MzY0MDEyMSwgMHgzYzAzMDgwMCwgMHg4YzYyMDA4YywgMHgzMDg0MDBmZiwKKwkweDI0NDIwMDAxLCAweDMwYTUwMGZmLCAweDAwODAzODIxLCAweDE0ODUwMDBiLCAweGFjNjIwMDhjLCAweDNjMDQwODAwLAorCTB4OGM4MzAwOTAsIDB4MjQ2MzAwMDEsIDB4YWM4MzAwOTAsIDB4OTM2MjAxMjIsIDB4MzA0MjAwMDEsIDB4MDAwMjEwMjMsCisJMHgzMDQyMDAwNSwgMHgwYTAwMGRlYSwgMHgzNDUxMDAwNCwgMHgyNzY2MDEwMCwgMHgwMDA0MTA4MCwgMHgwMGMyMTAyMSwKKwkweDhjNDMwMDAwLCAweDAyMDMxODIzLCAweDA0NjAwMDA0LCAweDI0ODIwMDAxLCAweDMwNDQwMDA3LCAweDE0ODVmZmY5LAorCTB4MDAwNDEwODAsIDB4MTA4NzAwMDcsIDB4M2MwMzA4MDAsIDB4YTM2NDAxMjEsIDB4OGM2MjAwOTQsIDB4MjQxMTAwMDUsCisJMHgyNDQyMDAwMSwgMHgwYTAwMGRlYSwgMHhhYzYyMDA5NCwgMHgyNDExMDAwNCwgMHgzMjIyMDAwMSwgMHgxMDQwMDAxZSwKKwkweDhlODIwMDIwLCAweDEwNDAwMDFkLCAweDMyMjIwMDA0LCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLCAweDhmODIwMDE4LAorCTB4YWM1MjAwMDAsIDB4OGY4NDAwMTgsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMDgsCisJMHg4ZjgyMDAxOCwgMHhhYzQwMDAwYywgMHg4ZjgzMDAxOCwgMHhhYzYwMDAxMCwgMHg4ZjgyMDAxOCwgMHhhYzUwMDAxNCwKKwkweDhmODUwMDE4LCAweDNjMDI2MDAwLCAweDhjNDM0NDQ4LCAweDI0MDQwMDAxLCAweDNjMDIwODAwLCAweGFjYTMwMDE4LAorCTB4OTQ0MzU4Y2UsIDB4OGY4NTAwMTgsIDB4M2MwMjQwMTAsIDB4MDA2MjE4MjUsIDB4MGUwMDE0Y2MsIDB4YWNhMzAwMWMsCisJMHgzMjIyMDAwNCwgMHgxMDQwMDA4MSwgMHgwMDAwMzgyMSwgMHgzYzAyOTAwMCwgMHgzNDQyMDAwMSwgMHgzYzAzODAwMCwKKwkweDAyNDIxMDI1LCAweGEzNjAwMDdjLCAweGFmNDIwMDIwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLAorCTB4MDAwMDAwMDAsIDB4OTM2MjAwMjMsIDB4MzA0MjAwODAsIDB4MTA0MDAwMTEsIDB4MDAwMDAwMDAsIDB4OGY2NTAwNWMsCisJMHg4ZjYzMDA0YywgMHg5NzY0MDAzYywgMHg4ZjYyMDA2NCwgMHgwMGEzMjgyMywgMHgwMDg1MjgyMSwgMHgwMGEyMTAyYiwKKwkweDU0NDAwMDA2LCAweDNjMDIzZmZmLCAweDkzNjIwMDIzLCAweDMwNDIwMDdmLCAweGEzNjIwMDIzLCAweGFmNzAwMDY0LAorCTB4M2MwMjNmZmYsIDB4MGEwMDBlMzcsIDB4MzQ0MmZmZmYsIDB4OGY2MjAwNWMsIDB4MDIwMjEwMjMsIDB4MDQ0MDAwMTEsCisJMHgwMDAwMDAwMCwgMHg4ZjY1MDA1YywgMHg4ZjYzMDA2NCwgMHg5NzY0MDAzYywgMHgzYzAyM2ZmZiwgMHgzNDQyZmZmZiwKKwkweGFmNzAwMDY0LCAweDAwYTMyODIzLCAweDAwODUyODIxLCAweDAwNDUxMDJiLCAweDEwNDAwMDA0LCAweDAyMDUxMDIxLAorCTB4M2MwNTNmZmYsIDB4MzRhNWZmZmYsIDB4MDIwNTEwMjEsIDB4YWY2MjAwNWMsIDB4MjQwNzAwMDEsIDB4YWY3MDAwNGMsCisJMHg4ZjYyMDA1NCwgMHgxNjAyMDAwNSwgMHgwMDAwMDAwMCwgMHg5MzYyMDAyMywgMHgzMDQyMDA0MCwgMHgxMDQwMDAxNywKKwkweDI0MDIwMDAxLCAweDk3NjIwMDZhLCAweDAwMDIyODgwLCAweDUwYTAwMDAxLCAweDI0MDUwMDAxLCAweDk3NjMwMDY4LAorCTB4OTM2NDAwODEsIDB4M2MwMjA4MDAsIDB4OGM0NjAwNGMsIDB4MDA2NTI4MjEsIDB4MDA4NTI4MDQsIDB4MDBjNTEwMmIsCisJMHg1NDQwMDAwMSwgMHgwMGEwMzAyMSwgMHgzYzAyMDgwMCwgMHg4YzQ0MDA1MCwgMHgwMGM0MTgyYiwgMHg1NDYwMDAwMSwKKwkweDAwYzAyMDIxLCAweDhmNDIwMDc0LCAweDI0MDNmZmZlLCAweDAwODMyODI0LCAweDAwYTIxMDIxLCAweGFmNjIwMDBjLAorCTB4OTM2MjAwODIsIDB4MzA0MjAwODAsIDB4NTA0MDAwMDEsIDB4YTM2MDAwODEsIDB4M2MwMjgwMDAsIDB4MzQ0MjAwMDEsCisJMHgwMjQyMTAyNSwgMHhhZjQyMDAyMCwgMHg5MzYzMDA3ZSwgMHg5MzYyMDA3YSwgMHgxMDYyMDAwNCwgMHgwMDAwMDAwMCwKKwkweDBlMDAxM2M0LCAweDAwMDAwMDAwLCAweDAwNDAzODIxLCAweDEwZTAwMDFmLCAweDNjMDI5MDAwLCAweDM0NDIwMDAxLAorCTB4MDI0MjEwMjUsIDB4YWY0MjAwMjAsIDB4M2MwMzgwMDAsIDB4OGY0MjAwMjAsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgwMDAwMDAwMCwgMHg5MzYyMDA3ZCwgMHgzYzAzODAwMCwgMHhhMzYyMDA3ZCwgMHg4ZjY0MDA3NCwgMHgzNDYzMDAwMSwKKwkweDAyNDMxODI1LCAweGFmNDMwMDIwLCAweDA0ODEwMDA2LCAweDNjMDM4MDAwLCAweDAyNDAyMDIxLCAweDBlMDAwNDcwLAorCTB4MjQwNTBiM2QsIDB4MGEwMDBlOGQsIDB4MDAwMDAwMDAsIDB4OGY0MjAxZjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgyNDAyMDAwMiwgMHgzYzAzMTAwMCwgMHhhZjUyMDFjMCwgMHhhMzQyMDFjNCwgMHhhZjQzMDFmOCwgMHg5MzQyMDEwYiwKKwkweDkzNDMwMTBiLCAweDhlODIwMDIwLCAweDI3NTAwMTAwLCAweDM4NjMwMDA2LCAweDEwNDAwMDI5LCAweDJjNzEwMDAxLAorCTB4MGUwMDE0OGUsIDB4MDAwMDAwMDAsIDB4OGY4MzAwMTgsIDB4OGUwMjAwMDAsIDB4YWM2MjAwMDAsIDB4OGY4NDAwMTgsCisJMHg5NjAyMDAwOCwgMHhhYzgyMDAwNCwgMHg4ZjgzMDAxOCwgMHg4ZTAyMDAxNCwgMHhhYzYyMDAwOCwgMHg4Zjg1MDAxOCwKKwkweDNjMDI2MDAwLCAweDhjNDM0NDQ4LCAweGFjYTMwMDBjLCAweDhmODQwMDE4LCAweDk2MDIwMDEyLCAweGFjODIwMDEwLAorCTB4OGY4NTAwMTgsIDB4OGUwMzAwMjAsIDB4YWNhMzAwMTQsIDB4OTYwMjAwMGMsIDB4OTYwMzAwMGUsIDB4OGY4NDAwMTgsCisJMHgwMDAyMTQwMCwgMHgwMDQzMTAyNSwgMHhhYzgyMDAxOCwgMHgxMjIwMDAwNSwgMHgzYzAyMDgwMCwgMHg5NDQzNThjZSwKKwkweDhmODQwMDE4LCAweDBhMDAwZWI4LCAweDNjMDI0MDEzLCAweDk0NDM1OGNlLCAweDhmODQwMDE4LCAweDNjMDI0MDE0LAorCTB4MDA2MjE4MjUsIDB4YWM4MzAwMWMsIDB4MGUwMDE0Y2MsIDB4MjQwNDAwMDEsIDB4OGU3MDAwMTQsIDB4OGY2MjAwNDAsCisJMHgxNDUwMDAwMywgMHgwMDUwMTAyMywgMHgwYTAwMGVjMywgMHgwMDAwMTAyMSwgMHgyODQyMDAwMSwgMHgxMDQwMDAzYSwKKwkweDAwMDAwMDAwLCAweDBlMDAwZmFlLCAweDAyMDAyMDIxLCAweGFmNzAwMDQwLCAweDkzNjIwMDNlLCAweDMwNDIwMDAxLAorCTB4MTQ0MDAwMGIsIDB4M2MwMjkwMDAsIDB4OTM2MjAwMjIsIDB4MjQ0MjAwMDEsIDB4YTM2MjAwMjIsIDB4OTM2MzAwMjIsCisJMHgzYzAyMDgwMCwgMHg4YzQ0MDA5OCwgMHgwMDY0MTgyYiwgMHgxNDYwMDAyNSwgMHgzYzAyMDgwMCwgMHgzYzAyOTAwMCwKKwkweDM0NDIwMDAxLCAweDAyNDIxMDI1LCAweGFmNDIwMDIwLCAweDNjMDM4MDAwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LAorCTB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OTM2MjAwN2QsIDB4M2MwMzgwMDAsIDB4MzQ0MjAwMDEsIDB4YTM2MjAwN2QsCisJMHg4ZjY0MDA3NCwgMHgzNDYzMDAwMSwgMHgwMjQzMTgyNSwgMHhhZjQzMDAyMCwgMHgwNDgxMDAwNiwgMHgzYzAzODAwMCwKKwkweDAyNDAyMDIxLCAweDBlMDAwNDcwLCAweDI0MDUwMjczLCAweDBhMDAwZWY2LCAweDI0MDIwMDAxLCAweDhmNDIwMWY4LAorCTB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MjQwMjAwMDIsIDB4M2MwMzEwMDAsIDB4YWY1MjAxYzAsIDB4YTM0MjAxYzQsCisJMHhhZjQzMDFmOCwgMHgyNDAyMDAwMSwgMHhhNzYyMDAxMiwgMHgwYTAwMGVmZSwgMHhhMzYwMDAyMiwgMHg5NzQzMDA3YSwKKwkweDk0NDQwMDJhLCAweDAwNjQxODIxLCAweDMwNjNmZmZlLCAweGE3NjMwMDEyLCAweDk3NDIwMTA4LCAweDhmYmYwMDI0LAorCTB4OGZiNDAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDAwMjEwNDIsCisJMHgzMDQyMDAwMSwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgyN2JkZmZlMCwgMHhhZmIyMDAxOCwgMHgzYzEyMDgwMCwKKwkweDhlNDIwMDIwLCAweGFmYjAwMDEwLCAweDI3NTAwMTAwLCAweGFmYmYwMDFjLCAweDEwNDAwMDQ2LCAweGFmYjEwMDE0LAorCTB4MGUwMDE0OGUsIDB4MDAwMDAwMDAsIDB4OGY4NDAwMTgsIDB4OGUwMjAwMDAsIDB4YWM4MjAwMDAsIDB4OTM2MzAwYjEsCisJMHg5MzYyMDBjNSwgMHg4Zjg1MDAxOCwgMHgwMDAzMWUwMCwgMHgwMDAyMTQwMCwgMHgzNDQyMDEwMCwgMHgwMDYyMTgyNSwKKwkweGFjYTMwMDA0LCAweDhmODQwMDE4LCAweDhlMDIwMDFjLCAweGFjODIwMDA4LCAweDhmODMwMDE4LCAweDhmNjIwMDQ4LAorCTB4YWM2MjAwMGMsIDB4OGY4NDAwMTgsIDB4OTYwMjAwMTIsIDB4YWM4MjAwMTAsIDB4OGY4MzAwMTgsIDB4OGY2MjAwNDAsCisJMHgyNDA0MDAwMSwgMHhhYzYyMDAxNCwgMHg4Zjg1MDAxOCwgMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwgMHgzYzAyMDgwMCwKKwkweDI0NTE1OGMwLCAweGFjYTMwMDE4LCAweDk2MjMwMDBlLCAweDhmODUwMDE4LCAweDNjMDI0MDE2LCAweDAwNjIxODI1LAorCTB4MGUwMDE0Y2MsIDB4YWNhMzAwMWMsIDB4OTYwMzAwMDgsIDB4MzA2MzAwMTAsIDB4MTA2MDAwMWMsIDB4OGU0MjAwMjAsCisJMHgxMDQwMDAxYSwgMHg4ZTEwMDAwMCwgMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAxOCwgMHhhYzUwMDAwMCwKKwkweDhmODMwMDE4LCAweGFjNjAwMDA0LCAweDhmODIwMDE4LCAweGFjNDAwMDA4LCAweDhmODMwMDE4LCAweGFjNjAwMDBjLAorCTB4OGY4MjAwMTgsIDB4YWM0MDAwMTAsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMTQsIDB4OGY4NTAwMTgsIDB4M2MwMzYwMDAsCisJMHg4YzYzNDQ0OCwgMHgyNDA0MDAwMSwgMHhhY2EzMDAxOCwgMHg5NjIyMDAwZSwgMHg4Zjg1MDAxOCwgMHgzYzAzNDAxNSwKKwkweDAwNDMxMDI1LCAweDBlMDAxNGNjLCAweGFjYTIwMDFjLCAweDAwMDAxMDIxLCAweDhmYmYwMDFjLCAweDhmYjIwMDE4LAorCTB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4YWZiMjAwMTgsCisJMHgzYzEyMDgwMCwgMHg4ZTQyMDAyMCwgMHhhZmIwMDAxMCwgMHgyNzUwMDEwMCwgMHhhZmJmMDAxYywgMHgxMDQwMDA0MSwKKwkweGFmYjEwMDE0LCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLCAweDhmODMwMDE4LCAweDhlMDIwMDAwLCAweGFjNjIwMDAwLAorCTB4OGY4NDAwMTgsIDB4MjQwMjAxMDAsIDB4YWM4MjAwMDQsIDB4OGY4MzAwMTgsIDB4OGUwMjAwMWMsIDB4YWM2MjAwMDgsCisJMHg4Zjg0MDAxOCwgMHg4ZTAyMDAxOCwgMHhhYzgyMDAwYywgMHg4ZjgzMDAxOCwgMHg5NjAyMDAxMiwgMHhhYzYyMDAxMCwKKwkweDhmODQwMDE4LCAweDk2MDIwMDA4LCAweGFjODIwMDE0LCAweDhmODUwMDE4LCAweDNjMDI2MDAwLCAweDhjNDM0NDQ4LAorCTB4MjQwNDAwMDEsIDB4M2MwMjA4MDAsIDB4MjQ1MTU4YzAsIDB4YWNhMzAwMTgsIDB4OTYyMzAwMGUsIDB4OGY4NTAwMTgsCisJMHgzYzAyNDAxNywgMHgwMDYyMTgyNSwgMHgwZTAwMTRjYywgMHhhY2EzMDAxYywgMHg5NjAzMDAwOCwgMHgzMDYzMDAxMCwKKwkweDEwNjAwMDFjLCAweDhlNDIwMDIwLCAweDEwNDAwMDFhLCAweDhlMTAwMDAwLCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLAorCTB4OGY4MjAwMTgsIDB4YWM1MDAwMDAsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMDQsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMDgsCisJMHg4ZjgzMDAxOCwgMHhhYzYwMDAwYywgMHg4ZjgyMDAxOCwgMHhhYzQwMDAxMCwgMHg4ZjgzMDAxOCwgMHhhYzYwMDAxNCwKKwkweDhmODUwMDE4LCAweDNjMDM2MDAwLCAweDhjNjM0NDQ4LCAweDI0MDQwMDAxLCAweGFjYTMwMDE4LCAweDk2MjIwMDBlLAorCTB4OGY4NTAwMTgsIDB4M2MwMzQwMTUsIDB4MDA0MzEwMjUsIDB4MGUwMDE0Y2MsIDB4YWNhMjAwMWMsIDB4MDAwMDEwMjEsCisJMHg4ZmJmMDAxYywgMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwKKwkweDI3YmRmZmYwLCAweDAzZTAwMDA4LCAweDI3YmQwMDEwLCAweDI3YmRmZmQwLCAweGFmYjEwMDE0LCAweDAwODA4ODIxLAorCTB4YWZiNDAwMjAsIDB4MDBjMGEwMjEsIDB4YWZiZjAwMjgsIDB4YWZiNTAwMjQsIDB4YWZiMzAwMWMsIDB4YWZiMjAwMTgsCisJMHhhZmIwMDAxMCwgMHg5MzYyMDAyMywgMHgwMGUwYTgyMSwgMHgzMDQyMDA0MCwgMHgxMDQwMDAzZSwgMHgzMGIzZmZmZiwKKwkweDNjMTIwODAwLCAweDhlNDIwMDIwLCAweDEwNDAwMDNhLCAweDhmNzAwMDRjLCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLAorCTB4OGY4MjAwMTgsIDB4YWM1MTAwMDAsIDB4OGY4NDAwMTgsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4OGY4MzAwMTgsCisJMHhhYzYwMDAwOCwgMHg4ZjgyMDAxOCwgMHhhYzQwMDAwYywgMHg4ZjgzMDAxOCwgMHhhYzYwMDAxMCwgMHg4ZjgyMDAxOCwKKwkweDI0MDQwMDAxLCAweGFjNTAwMDE0LCAweDhmODUwMDE4LCAweDNjMDI2MDAwLCAweDhjNDM0NDQ4LCAweDNjMDIwODAwLAorCTB4MjQ1MDU4YzAsIDB4YWNhMzAwMTgsIDB4OTYwMzAwMGUsIDB4OGY4NTAwMTgsIDB4M2MwMjQwMTAsIDB4MDA2MjE4MjUsCisJMHgwZTAwMTRjYywgMHhhY2EzMDAxYywgMHg4ZTQzMDAyMCwgMHgxMDYwMDAxYiwgMHgwMDAwMDAwMCwgMHgwZTAwMTQ4ZSwKKwkweDAwMDAwMDAwLCAweDhmODIwMDE4LCAweGFjNTEwMDAwLCAweDhmODQwMDE4LCAweDNjMDIwMDhkLCAweGFjODIwMDA0LAorCTB4OGY4MzAwMTgsIDB4YWM2MDAwMDgsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMGMsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsCisJMHg4ZjgyMDAxOCwgMHhhYzU1MDAxNCwgMHg4Zjg1MDAxOCwgMHgzYzAzNjAwMCwgMHg4YzYzNDQ0OCwgMHgyNDA0MDAwMSwKKwkweGFjYTMwMDE4LCAweDk2MDIwMDBlLCAweDhmODUwMDE4LCAweDNjMDM0MDE5LCAweDAwNDMxMDI1LCAweDBlMDAxNGNjLAorCTB4YWNhMjAwMWMsIDB4OTM2MjAwMjMsIDB4MzA0MjAwMjAsIDB4MTQ0MDAwMDMsIDB4M2MxMjA4MDAsIDB4MTI4MDAwM2YsCisJMHgzYzAyOTAwMCwgMHg4ZTQyMDAyMCwgMHg4ZjcwMDA0YywgMHgxMDQwMDAzYiwgMHgzYzAyOTAwMCwgMHgwZTAwMTQ4ZSwKKwkweDAwMDAwMDAwLCAweDhmODIwMDE4LCAweGFjNTEwMDAwLCAweDhmODQwMDE4LCAweDI0MDIwMDAxLCAweGFjODIwMDA0LAorCTB4OGY4MzAwMTgsIDB4YWM2MDAwMDgsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMGMsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsCisJMHg4ZjgyMDAxOCwgMHgyNDA0MDAwMSwgMHhhYzUwMDAxNCwgMHg4Zjg1MDAxOCwgMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwKKwkweDNjMDIwODAwLCAweDI0NTA1OGMwLCAweGFjYTMwMDE4LCAweDk2MDMwMDBlLCAweDhmODUwMDE4LCAweDNjMDI0MDEwLAorCTB4MDA2MjE4MjUsIDB4MGUwMDE0Y2MsIDB4YWNhMzAwMWMsIDB4OGU0MzAwMjAsIDB4MTA2MDAwMWMsIDB4M2MwMjkwMDAsCisJMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAxOCwgMHhhYzUxMDAwMCwgMHg4Zjg0MDAxOCwgMHgwMDEzMTQwMCwKKwkweGFjODIwMDA0LCAweDhmODMwMDE4LCAweGFjNzUwMDA4LCAweDhmODIwMDE4LCAweGFjNDAwMDBjLCAweDhmODMwMDE4LAorCTB4YWM2MDAwMTAsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMTQsIDB4OGY4NTAwMTgsIDB4M2MwMzYwMDAsIDB4OGM2MzQ0NDgsCisJMHgyNDA0MDAwMSwgMHhhY2EzMDAxOCwgMHg5NjAyMDAwZSwgMHg4Zjg1MDAxOCwgMHgzYzAzNDAxYiwgMHgwMDQzMTAyNSwKKwkweDBlMDAxNGNjLCAweGFjYTIwMDFjLCAweDNjMDI5MDAwLCAweDM0NDIwMDAxLCAweDAyMjIxMDI1LCAweGFmNDIwMDIwLAorCTB4M2MwMzgwMDAsIDB4OGY0MjAwMjAsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OTM2MzAwMjMsCisJMHgzYzAyODAwMCwgMHgzNDQyMDAwMSwgMHgwMjIyMTAyNSwgMHg4ZmJmMDAyOCwgMHg4ZmI1MDAyNCwgMHg4ZmI0MDAyMCwKKwkweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDMwNjMwMDlmLCAweGEzNjMwMDIzLAorCTB4YWY0MjAwMjAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMzAsIDB4MjdiZGZmZTAsIDB4YWZiMTAwMTQsIDB4Mjc1MTAxMDAsCisJMHgzYzAyOTAwMCwgMHgzNDQyMDAwMSwgMHhhZmIwMDAxMCwgMHgwMDgwODAyMSwgMHgwMjAyMTAyNSwgMHgzYzAzODAwMCwKKwkweGFmYmYwMDE4LCAweGFmNDIwMDIwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLAorCTB4YTc2MDAwMDgsIDB4OGY2MzAwNWMsIDB4M2MwMjgwMDAsIDB4MzQ0MjAwMDEsIDB4YWY2MzAxNDgsIDB4OGY2NDAwNTAsCisJMHgwMjAyMTAyNSwgMHgzYzAzOTAwMCwgMHhhZjY0MDE3YywgMHhhZjQyMDAyMCwgMHg4ZjQ1MDEwMCwgMHgzNDYzMDAwMSwKKwkweDNjMDQ4MDAwLCAweDAwYTMxODI1LCAweGFmNDMwMDIwLCAweDhmNDIwMDIwLCAweDAwNDQxMDI0LCAweDE0NDBmZmZkLAorCTB4MDAwMDAwMDAsIDB4OTM2MjAwN2QsIDB4M2MwMzgwMDAsIDB4MzQ0MjAwMDEsIDB4YTM2MjAwN2QsIDB4OGY2NDAwNzQsCisJMHgzNDYzMDAwMSwgMHgwMGEzMTgyNSwgMHhhZjQzMDAyMCwgMHgwNDgxMDAwNiwgMHgzYzAzODAwMCwgMHgwMGEwMjAyMSwKKwkweDBlMDAwNDcwLCAweDI0MDUwZGU1LCAweDBhMDAxMDkzLCAweDNjMDIwODAwLCAweDhmNDIwMWY4LCAweDAwNDMxMDI0LAorCTB4MTQ0MGZmZmQsIDB4MjQwMjAwMDIsIDB4M2MwMzEwMDAsIDB4YWY0NTAxYzAsIDB4YTM0MjAxYzQsIDB4YWY0MzAxZjgsCisJMHgzYzAyMDgwMCwgMHg4YzQzMDAyMCwgMHgxMDYwMDAxZSwgMHg4ZmJmMDAxOCwgMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwKKwkweDhmODMwMDE4LCAweGFjNzAwMDAwLCAweDk2MjIwMDBjLCAweDhmODQwMDE4LCAweDAwMDIxNDAwLCAweGFjODIwMDA0LAorCTB4OGY4MzAwMTgsIDB4YWM2MDAwMDgsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMGMsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsCisJMHg4ZjgyMDAxOCwgMHhhYzQwMDAxNCwgMHg4Zjg1MDAxOCwgMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwgMHgyNDA0MDAwMSwKKwkweDNjMDIwODAwLCAweGFjYTMwMDE4LCAweDk0NDM1OGNlLCAweDhmODUwMDE4LCAweDNjMDI0MDFmLCAweDAwNjIxODI1LAorCTB4MGUwMDE0Y2MsIDB4YWNhMzAwMWMsIDB4OGZiZjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsCisJMHgyN2JkMDAyMCwgMHgzYzAyMDgwMCwgMHgyNDQyNGMzYywgMHhhZjgyMDAwYywgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwKKwkweDI3YmRmZmU4LCAweGFmYjAwMDEwLCAweDI3NTAwMTAwLCAweGFmYmYwMDE0LCAweDhlMDIwMDFjLCAweDE0NDAwMDAzLAorCTB4M2MwMjA4MDAsIDB4MDAwMDAwMGQsIDB4M2MwMjA4MDAsIDB4OGM0MzAwMjAsIDB4MTA2MDAwMjAsIDB4MDAwMDEwMjEsCisJMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgzMDAxOCwgMHg4ZTAyMDAwMCwgMHhhYzYyMDAwMCwgMHg4Zjg0MDAxOCwKKwkweDhlMDIwMDFjLCAweGFjODIwMDA0LCAweDhmODMwMDE4LCAweGFjNjAwMDA4LCAweDhmODQwMDE4LCAweDhlMDIwMDE4LAorCTB4YWM4MjAwMGMsIDB4OGY4NTAwMTgsIDB4OTYwMjAwMTIsIDB4YWNhMjAwMTAsIDB4OGY4MzAwMTgsIDB4M2MwMjYwMDAsCisJMHhhYzYwMDAxNCwgMHg4Zjg0MDAxOCwgMHg4YzQzNDQ0OCwgMHgzYzAyMDgwMCwgMHhhYzgzMDAxOCwgMHg5NDQzNThjZSwKKwkweDhmODQwMDE4LCAweDNjMDI0MDEyLCAweDAwNjIxODI1LCAweGFjODMwMDFjLCAweDBlMDAxNGNjLCAweDI0MDQwMDAxLAorCTB4MDAwMDEwMjEsIDB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwMjA4MDAsCisJMHg5NzQzMDA3OCwgMHg5NDQ0MDAyZSwgMHgwMDAwMTAyMSwgMHgwMDY0MTgyMSwgMHgzMDYzZmZmZSwgMHgwM2UwMDAwOCwKKwkweGE3NjMwMDEwLCAweDI3YmRmZmYwLCAweDAwMDAxMDIxLCAweDAzZTAwMDA4LCAweDI3YmQwMDEwLCAweDhmNDIwMTAwLAorCTB4MzQ0MjAwMDEsIDB4YWY0MjAwYTQsIDB4MDNlMDAwMDgsIDB4MDAwMDEwMjEsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMTgsCisJMHhhZmIxMDAxNCwgMHhhZmIwMDAxMCwgMHg5MzYyMDA3ZSwgMHgzMGQwMDBmZiwgMHgxNjAyMDAzMSwgMHgwMDgwODgyMSwKKwkweDhmNjIwMTc4LCAweDE2MDIwMDJlLCAweDAwMDAwMDAwLCAweDkzNjIwMDdmLCAweDE2MDIwMDJiLCAweDAwMDAwMDAwLAorCTB4OTM2MjAwN2EsIDB4MTYwMjAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MjQwMDA5ZDIsCisJMHgwZTAwMTNlNiwgMHgwMDAwMDAwMCwgMHgzYzAzOTAwMCwgMHgzNDYzMDAwMSwgMHgzYzA0ODAwMCwgMHgwMjIzMTgyNSwKKwkweGEzNzAwMDdhLCAweGFmNDMwMDIwLCAweDhmNDIwMDIwLCAweDAwNDQxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLAorCTB4OTM2MjAwN2QsIDB4M2MwMzgwMDAsIDB4YTM2MjAwN2QsIDB4OGY2NDAwNzQsIDB4MzQ2MzAwMDEsIDB4MDIyMzE4MjUsCisJMHhhZjQzMDAyMCwgMHgwNDgxMDAwNiwgMHgzYzAzODAwMCwgMHgwMjIwMjAyMSwgMHgwZTAwMDQ3MCwgMHgyNDA1MDlkZCwKKwkweDBhMDAxMTM4LCAweDhmYmYwMDE4LCAweDhmNDIwMWY4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDAyLAorCTB4M2MwMzEwMDAsIDB4YWY1MTAxYzAsIDB4YTM0MjAxYzQsIDB4YWY0MzAxZjgsIDB4MGEwMDExMzgsIDB4OGZiZjAwMTgsCisJMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDllMiwgMHg4ZmJmMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwKKwkweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI3YmRmZmU4LCAweDMwYTUwMGZmLCAweDNjMDI5MDAwLCAweDM0NDIwMDAxLAorCTB4MDA4MDM4MjEsIDB4MDBlMjEwMjUsIDB4M2MwMzgwMDAsIDB4YWZiZjAwMTAsIDB4YWY0MjAwMjAsIDB4OGY0MjAwMjAsCisJMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg5MzYyMDA3ZCwgMHgzYzAzODAwMCwgMHgwMGEyMTAyNSwKKwkweGEzNjIwMDdkLCAweDhmNjQwMDc0LCAweDM0NjMwMDAxLCAweDAwZTMxODI1LCAweGFmNDMwMDIwLCAweDA0ODEwMDA2LAorCTB4M2MwMzgwMDAsIDB4MDBlMDIwMjEsIDB4MGUwMDA0NzAsIDB4MDBjMDI4MjEsIDB4MGEwMDExNjEsIDB4OGZiZjAwMTAsCisJMHg4ZjQyMDFmOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMiwgMHgzYzAzMTAwMCwgMHhhZjQ3MDFjMCwKKwkweGEzNDIwMWM0LCAweGFmNDMwMWY4LCAweDhmYmYwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDNjMDIwODAwLAorCTB4OGM0MzAwMjAsIDB4MjdiZGZmZTgsIDB4YWZiMDAwMTAsIDB4Mjc1MDAxMDAsIDB4MTA2MDAwMjQsIDB4YWZiZjAwMTQsCisJMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgzMDAxOCwgMHg4ZTAyMDAwMCwgMHhhYzYyMDAwMCwgMHg4Zjg0MDAxOCwKKwkweDhlMDIwMDA0LCAweGFjODIwMDA0LCAweDhmODMwMDE4LCAweDhlMDIwMDE4LCAweGFjNjIwMDA4LCAweDhmODQwMDE4LAorCTB4OGUwMzAwMWMsIDB4YWM4MzAwMGMsIDB4OTYwMjAwMGMsIDB4OTIwMzAwMGEsIDB4OGY4NDAwMTgsIDB4MDAwMjE0MDAsCisJMHgwMDQzMTAyNSwgMHhhYzgyMDAxMCwgMHg4ZjgzMDAxOCwgMHgzYzAyNjAwMCwgMHhhYzYwMDAxNCwgMHg4Zjg0MDAxOCwKKwkweDhjNDM0NDQ4LCAweGFjODMwMDE4LCAweDk2MDIwMDA4LCAweDNjMDMwODAwLCAweDk0NjQ1OGNlLCAweDhmODUwMDE4LAorCTB4MDAwMjE0MDAsIDB4MDA0NDEwMjUsIDB4MjQwNDAwMDEsIDB4MGUwMDE0Y2MsIDB4YWNhMjAwMWMsIDB4OGZiZjAwMTQsCisJMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgzYzAyMDgwMCwgMHg4YzQzMDAyMCwgMHgyN2JkZmZlOCwKKwkweGFmYjAwMDEwLCAweDI3NTAwMTAwLCAweDEwNjAwMDIwLCAweGFmYmYwMDE0LCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLAorCTB4OGY4MjAwMTgsIDB4YWM0MDAwMDAsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMDQsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMDgsCisJMHg4ZjgzMDAxOCwgMHhhYzYwMDAwYywgMHg5NjAyMDAwYywgMHg5NjAzMDAwZSwgMHg4Zjg0MDAxOCwgMHgwMDAyMTQwMCwKKwkweDAwNDMxMDI1LCAweGFjODIwMDEwLCAweDhmODMwMDE4LCAweDNjMDI2MDAwLCAweGFjNjAwMDE0LCAweDhmODQwMDE4LAorCTB4OGM0MzQ0NDgsIDB4YWM4MzAwMTgsIDB4OTYwMjAwMDgsIDB4M2MwMzA4MDAsIDB4OTQ2NDU4Y2UsIDB4OGY4NTAwMTgsCisJMHgwMDAyMTQwMCwgMHgwMDQ0MTAyNSwgMHgyNDA0MDAwMSwgMHgwZTAwMTRjYywgMHhhY2EyMDAxYywgMHg4ZmJmMDAxNCwKKwkweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDI3YmRmZmU4LCAweGFmYjAwMDEwLCAweDI3NTAwMTAwLAorCTB4YWZiZjAwMTQsIDB4OTYwMjAwMGMsIDB4MTA0MDAwMjQsIDB4MDA4MDI4MjEsIDB4M2MwMjA4MDAsIDB4OGM0MzAwMjAsCisJMHgxMDYwMDAzYSwgMHg4ZmJmMDAxNCwgMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4Zjg0MDAxOCwgMHg4ZTAzMDAwMCwKKwkweGFjODMwMDAwLCAweDk2MDIwMDBjLCAweDhmODQwMDE4LCAweDAwMDIxNDAwLCAweGFjODIwMDA0LCAweDhmODMwMDE4LAorCTB4YWM2MDAwMDgsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMGMsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsIDB4OGY4MjAwMTgsCisJMHhhYzQwMDAxNCwgMHg4Zjg1MDAxOCwgMHgzYzAyNjAwMCwgMHg4YzQzNDQ0OCwgMHgyNDA0MDAwMSwgMHgzYzAyMDgwMCwKKwkweGFjYTMwMDE4LCAweDk0NDM1OGNlLCAweDhmODUwMDE4LCAweDNjMDI0MDBiLCAweDAwNjIxODI1LCAweDBlMDAxNGNjLAorCTB4YWNhMzAwMWMsIDB4MGEwMDExZmYsIDB4OGZiZjAwMTQsIDB4OTM2MjAwMDUsIDB4MzA0MjAwMTAsIDB4MTQ0MDAwMTUsCisJMHgzYzAyOTAwMCwgMHgzNDQyMDAwMSwgMHgwMGEyMTAyNSwgMHhhZjQyMDAyMCwgMHgzYzAzODAwMCwgMHg4ZjQyMDAyMCwKKwkweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDNjMDM4MDAwLCAweDkzNjIwMDA1LCAweDM0NjMwMDAxLAorCTB4MDBhMDIwMjEsIDB4MDBhMzE4MjUsIDB4MjQwNTU4NTIsIDB4MzQ0MjAwMTAsIDB4YTM2MjAwMDUsIDB4MGUwMDA3NjYsCisJMHhhZjQzMDAyMCwgMHgwYTAwMTFmZiwgMHg4ZmJmMDAxNCwgMHgwMDAwMDAwZCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwKKwkweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDNjMDIwODAwLCAweDhjNDMwMDIwLCAweDI3YmRmZmU4LCAweGFmYjAwMDEwLAorCTB4Mjc1MDAxMDAsIDB4MTA2MDAwMjIsIDB4YWZiZjAwMTQsIDB4MGUwMDE0OGUsIDB4MDAwMDAwMDAsIDB4OGY4NDAwMTgsCisJMHg4ZTAyMDAwNCwgMHhhYzgyMDAwMCwgMHg5NjAzMDAwYywgMHg5NzYyMDAyYywgMHg4Zjg0MDAxOCwgMHgwMDAzMWMwMCwKKwkweDAwNDMxMDI1LCAweGFjODIwMDA0LCAweDhmODMwMDE4LCAweGFjNjAwMDA4LCAweDhmODIwMDE4LCAweGFjNDAwMDBjLAorCTB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMTQsIDB4OGY4NTAwMTgsIDB4M2MwMjYwMDAsCisJMHg4YzQzNDQ0OCwgMHgyNDA0MDAwMSwgMHgzYzAyMDgwMCwgMHhhY2EzMDAxOCwgMHg5NDQzNThjZSwgMHg4Zjg1MDAxOCwKKwkweDNjMDI0MDBlLCAweDAwNjIxODI1LCAweDBlMDAxNGNjLCAweGFjYTMwMDFjLCAweDBlMDAxMjJlLCAweDhlMDQwMDAwLAorCTB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwMzgwMDAsIDB4OGY0MjAyNzgsCisJMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMiwgMHgzYzAzMTAwMCwgMHhhZjQ0MDI0MCwgMHhhMzQyMDI0NCwKKwkweDAzZTAwMDA4LCAweGFmNDMwMjc4LCAweDNjMDIwODAwLCAweDhjNDMwMDIwLCAweDI3YmRmZmUwLCAweGFmYjEwMDE0LAorCTB4MDA4MDg4MjEsIDB4YWZiMjAwMTgsIDB4MDBjMDkwMjEsIDB4YWZiMDAwMTAsIDB4MzBiMGZmZmYsIDB4MTA2MDAwMWMsCisJMHhhZmJmMDAxYywgMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAxOCwgMHhhYzUxMDAwMCwgMHg4Zjg0MDAxOCwKKwkweDAwMTAxNDAwLCAweGFjODIwMDA0LCAweDhmODMwMDE4LCAweGFjNjAwMDA4LCAweDhmODIwMDE4LCAweGFjNDAwMDBjLAorCTB4OGY4MzAwMTgsIDB4YWM2MDAwMTAsIDB4OGY4MjAwMTgsIDB4YWM1MjAwMTQsIDB4OGY4NDAwMTgsIDB4M2MwMjYwMDAsCisJMHg4YzQzNDQ0OCwgMHgzYzAyMDgwMCwgMHhhYzgzMDAxOCwgMHg5NDQzNThjZSwgMHg4Zjg0MDAxOCwgMHgzYzAyNDAxOSwKKwkweDAwNjIxODI1LCAweGFjODMwMDFjLCAweDBlMDAxNGNjLCAweDI0MDQwMDAxLCAweDhmYmYwMDFjLCAweDhmYjIwMDE4LAorCTB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZTgsIDB4Mjc0NTAxMDAsCisJMHhhZmJmMDAxMCwgMHg5NGEzMDAwYywgMHgyNDAyMDBjMSwgMHgxNDYyMDAzMSwgMHgwMDgwMzAyMSwgMHgzYzAyOTAwMCwKKwkweDM0NDIwMDAxLCAweDAwYzIxMDI1LCAweGFmNDIwMDIwLCAweDNjMDM4MDAwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LAorCTB4MTQ0MGZmZmQsIDB4M2MwMjgwMDAsIDB4MzQ0MjAwMDEsIDB4M2MwNDkwMDAsIDB4MzQ4NDAwMDEsIDB4M2MwNTgwMDAsCisJMHgyNDAzMDAxMiwgMHgwMGMyMTAyNSwgMHgwMGM0MjAyNSwgMHhhMzYzMDAzZiwgMHhhZjQyMDAyMCwgMHhhZjQ0MDAyMCwKKwkweDhmNDIwMDIwLCAweDAwNDUxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDkzNjIwMDdkLCAweDNjMDM4MDAwLAorCTB4MzQ0MjAwMjAsIDB4YTM2MjAwN2QsIDB4OGY2NDAwNzQsIDB4MzQ2MzAwMDEsIDB4MDBjMzE4MjUsIDB4YWY0MzAwMjAsCisJMHgwNDgxMDAwNiwgMHgzYzAzODAwMCwgMHgwMGMwMjAyMSwgMHgwZTAwMDQ3MCwgMHgyNDA1MDkwNiwgMHgwYTAwMTJhMSwKKwkweDhmYmYwMDEwLCAweDhmNDIwMWY4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDAyLCAweDNjMDMxMDAwLAorCTB4YWY0NjAxYzAsIDB4YTM0MjAxYzQsIDB4YWY0MzAxZjgsIDB4MGEwMDEyYTEsIDB4OGZiZjAwMTAsIDB4MDBjMDIwMjEsCisJMHg5NGE1MDAwYywgMHgyNDA2MDAwMSwgMHgwZTAwMGZiMSwgMHgyNDA3MDkwZSwgMHg4ZmJmMDAxMCwgMHgwM2UwMDAwOCwKKwkweDI3YmQwMDE4LCAweDNjMDIwODAwLCAweDhjNDMwMDIwLCAweDI3YmRmZmUwLCAweGFmYjAwMDEwLCAweDAwODA4MDIxLAorCTB4YWZiMjAwMTgsIDB4MDBhMDkwMjEsIDB4YWZiMTAwMTQsIDB4MzBkMTAwZmYsIDB4MTA2MDAwMWMsIDB4YWZiZjAwMWMsCisJMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAxOCwgMHhhYzUwMDAwMCwgMHg4Zjg0MDAxOCwgMHgyNDAyMDAwMSwKKwkweGFjODIwMDA0LCAweDhmODMwMDE4LCAweGFjNjAwMDA4LCAweDhmODIwMDE4LCAweGFjNDAwMDBjLCAweDhmODMwMDE4LAorCTB4YWM2MDAwMTAsIDB4OGY4MjAwMTgsIDB4YWM1MjAwMTQsIDB4OGY4NDAwMTgsIDB4M2MwMjYwMDAsIDB4OGM0MzQ0NDgsCisJMHgzYzAyMDgwMCwgMHhhYzgzMDAxOCwgMHg5NDQzNThjZSwgMHg4Zjg0MDAxOCwgMHgzYzAyNDAxMCwgMHgwMDYyMTgyNSwKKwkweGFjODMwMDFjLCAweDBlMDAxNGNjLCAweDAyMjAyMDIxLCAweDhmYmYwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LAorCTB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsCisJMHg5MzYyMDAwNSwgMHgzMDQyMDAwMSwgMHgxMDQwMDAzNiwgMHgwMDgwODAyMSwgMHgzYzAyOTAwMCwgMHgzNDQyMDAwMSwKKwkweDAyMDIxMDI1LCAweGFmNDIwMDIwLCAweDNjMDM4MDAwLCAweDhmNDIwMDIwLCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLAorCTB4MDAwMDAwMDAsIDB4OTM2MjAwMjMsIDB4MzQ0MjAwMDQsIDB4YTM2MjAwMjMsIDB4OTM2MzAwMDUsIDB4M2MwNDgwMDAsCisJMHgzYzAyMDgwMCwgMHgzMDYzMDBmZSwgMHhhMzYzMDAwNSwgMHg4YzQzMDAyMCwgMHgzNDg0MDAwMSwgMHgwMjA0MjAyNSwKKwkweGFmNDQwMDIwLCAweDEwNjAwMDIwLCAweDhmYmYwMDE0LCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLCAweDhmODIwMDE4LAorCTB4YWM1MDAwMDAsIDB4OTM2MzAwODIsIDB4OTM2MjAwM2YsIDB4OGY4NDAwMTgsIDB4MDAwMzFhMDAsIDB4MDA0MzEwMjUsCisJMHhhYzgyMDAwNCwgMHg4ZjgzMDAxOCwgMHhhYzYwMDAwOCwgMHg4ZjgyMDAxOCwgMHhhYzQwMDAwYywgMHg4ZjgzMDAxOCwKKwkweGFjNjAwMDEwLCAweDhmODIwMDE4LCAweGFjNDAwMDE0LCAweDhmODQwMDE4LCAweDNjMDI2MDAwLCAweDhjNDM0NDQ4LAorCTB4M2MwMjA4MDAsIDB4YWM4MzAwMTgsIDB4OTQ0MzU4Y2UsIDB4OGY4NDAwMTgsIDB4M2MwMjQwMGEsIDB4MDA2MjE4MjUsCisJMHhhYzgzMDAxYywgMHgwZTAwMTRjYywgMHgyNDA0MDAwMSwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwKKwkweDI3YmQwMDE4LCAweDNjMDIwODAwLCAweDhjNDMwMDIwLCAweDI3YmRmZmUwLCAweGFmYjEwMDE0LCAweDAwODA4ODIxLAorCTB4YWZiMjAwMTgsIDB4MDBhMDkwMjEsIDB4YWZiMDAwMTAsIDB4MzBkMDAwZmYsIDB4MTA2MDAwMmYsIDB4YWZiZjAwMWMsCisJMHgwZTAwMTQ4ZSwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAxOCwgMHhhYzUxMDAwMCwgMHg4ZjgzMDAxOCwgMHhhYzcwMDAwNCwKKwkweDhmODIwMDE4LCAweGFjNTIwMDA4LCAweDhmODMwMDE4LCAweGFjNjAwMDBjLCAweDhmODIwMDE4LCAweGFjNDAwMDEwLAorCTB4OTc2MzAwNmEsIDB4MDAwMzI4ODAsIDB4NTBhMDAwMDEsIDB4MjQwNTAwMDEsIDB4OTc2MzAwNjgsIDB4OTM2NDAwODEsCisJMHgzYzAyMDgwMCwgMHg4YzQ2MDA0YywgMHgwMDY1MjgyMSwgMHgwMDg1MjgwNCwgMHgwMGM1MTAyYiwgMHg1NDQwMDAwMSwKKwkweDAwYTAzMDIxLCAweDNjMDIwODAwLCAweDhjNDQwMDUwLCAweDAwYzQxODJiLCAweDU0NjAwMDAxLCAweDAwYzAyMDIxLAorCTB4OGY4MzAwMTgsIDB4MjQwMmZmZmUsIDB4MDA4MjI4MjQsIDB4M2MwMjYwMDAsIDB4YWM2NTAwMTQsIDB4OGY4NDAwMTgsCisJMHg4YzQzNDQ0OCwgMHgzYzAyMDgwMCwgMHhhYzgzMDAxOCwgMHg5NDQzNThjZSwgMHg4Zjg0MDAxOCwgMHgzYzAyNDAxMSwKKwkweDAwNjIxODI1LCAweGFjODMwMDFjLCAweDBlMDAxNGNjLCAweDI0MDQwMDAxLCAweDhmYmYwMDFjLCAweDhmYjIwMDE4LAorCTB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsCisJMHhhZmIwMDAxMCwgMHg4ZjQ0MDEwMCwgMHgyNzUwMDEwMCwgMHg4ZjY1MDA1MCwgMHgwZTAwMTBmYywgMHg5MjA2MDAxYiwKKwkweDNjMDIwODAwLCAweDhjNDMwMDIwLCAweDEwNjAwMDFkLCAweDhlMTAwMDE4LCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLAorCTB4OGY4NDAwMTgsIDB4OGY0MjAxMDAsIDB4YWM4MjAwMDAsIDB4OGY4MzAwMTgsIDB4YWM3MDAwMDQsIDB4OGY4NDAwMTgsCisJMHg4ZjYyMDA1MCwgMHhhYzgyMDAwOCwgMHg4ZjgzMDAxOCwgMHhhYzYwMDAwYywgMHg4ZjgyMDAxOCwgMHhhYzQwMDAxMCwKKwkweDhmODMwMDE4LCAweDNjMDI2MDAwLCAweGFjNjAwMDE0LCAweDhmODUwMDE4LCAweDhjNDM0NDQ4LCAweDI0MDQwMDAxLAorCTB4M2MwMjA4MDAsIDB4YWNhMzAwMTgsIDB4OTQ0MzU4Y2UsIDB4OGY4NTAwMTgsIDB4M2MwMjQwMWMsIDB4MDA2MjE4MjUsCisJMHgwZTAwMTRjYywgMHhhY2EzMDAxYywgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwKKwkweDhmNDMwMjM4LCAweDNjMDIwODAwLCAweDA0NjEwMDEzLCAweDhjNDQwMDljLCAweDI0MDZmZmZlLCAweDNjMDUwODAwLAorCTB4M2MwMzgwMDAsIDB4MjQ4NGZmZmYsIDB4MTQ4MDAwMDksIDB4MDAwMDAwMDAsIDB4OTc0MjAwNzgsIDB4OGNhMzAwN2MsCisJMHgyNDQyMDAwMSwgMHgwMDQ2MTAyNCwgMHgyNDYzMDAwMSwgMHhhNzYyMDAxMCwgMHgwM2UwMDAwOCwgMHhhY2EzMDA3YywKKwkweDhmNDIwMjM4LCAweDAwNDMxMDI0LCAweDE0NDBmZmYzLCAweDI0ODRmZmZmLCAweDhmNDIwMTQwLCAweDNjMDMxMDAwLAorCTB4YWY0MjAyMDAsIDB4MDNlMDAwMDgsIDB4YWY0MzAyMzgsIDB4MjdiZGZmZTgsIDB4M2MwMjkwMDAsIDB4YWZiZjAwMTAsCisJMHg4ZjQ1MDE0MCwgMHgzNDQyMDAwMSwgMHgzYzAzODAwMCwgMHgwMGEyMTAyNSwgMHhhZjQyMDAyMCwgMHg4ZjQyMDAyMCwKKwkweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDkzNjIwMDdkLCAweDNjMDM4MDAwLCAweDM0NDIwMDAxLAorCTB4YTM2MjAwN2QsIDB4OGY2NDAwNzQsIDB4MzQ2MzAwMDEsIDB4MDBhMzE4MjUsIDB4YWY0MzAwMjAsIDB4MDQ4MTAwMDYsCisJMHgzYzAzODAwMCwgMHgwMGEwMjAyMSwgMHgwZTAwMDQ3MCwgMHgyNDA1MGFjNywgMHgwYTAwMTNiOSwgMHg4ZmJmMDAxMCwKKwkweDhmNDIwMWY4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDAyLCAweDNjMDMxMDAwLCAweGFmNDUwMWMwLAorCTB4YTM0MjAxYzQsIDB4YWY0MzAxZjgsIDB4OGZiZjAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4MDAwMDAwMGQsCisJMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgyNDAyMDAwMSwKKwkweDAzZTAwMDA4LCAweGE3NjIwMDEwLCAweDkzNjIwMDNmLCAweDMwNDQwMGZmLCAweDM4ODMwMDBlLCAweDJjNjMwMDAxLAorCTB4Mzg4MjAwMTAsIDB4MmM0MjAwMDEsIDB4MDA2MjE4MjUsIDB4MTQ2MDAwMDMsIDB4MjQwMjAwMTIsIDB4MTQ4MjAwMDMsCisJMHgwMDAwMDAwMCwgMHgwM2UwMDAwOCwgMHgwMDAwMTAyMSwgMHg5MzYzMDA3ZSwgMHg5MzYyMDA3YSwgMHgxNDYyMDAwNiwKKwkweDAwMDAwMDAwLCAweDkzNjMwMDdlLCAweDI0MDIwMDAxLCAweDI0NjMwMDAxLCAweDAzZTAwMDA4LCAweGEzNjMwMDdlLAorCTB4OTM2MjAwN2UsIDB4OGY2MzAxNzgsIDB4MzA0MjAwZmYsIDB4MTQ0MzAwMDYsIDB4MDAwMDAwMDAsIDB4OTM2MzAwMGIsCisJMHgyNDAyMDAwMSwgMHgyNDYzMDAwMSwgMHgwM2UwMDAwOCwgMHhhMzYzMDAwYiwgMHgwM2UwMDAwOCwgMHgwMDAwMTAyMSwKKwkweDkzNjIwMDBiLCAweDEwNDAwMDIzLCAweDAwMDAxMDIxLCAweGEzNjAwMDBiLCAweDkzNjIwMDNmLCAweDMwNDQwMGZmLAorCTB4Mzg4MzAwMGUsIDB4MmM2MzAwMDEsIDB4Mzg4MjAwMTAsIDB4MmM0MjAwMDEsIDB4MDA2MjE4MjUsIDB4MTQ2MDAwMTcsCisJMHgwMDAwMTgyMSwgMHgyNDAyMDAxMiwgMHgxMDgyMDAxNCwgMHgwMDAwMDAwMCwgMHg5MzYzMDA3ZSwgMHg5MzYyMDA3YSwKKwkweDE0NjIwMDA3LCAweDAwMDAwMDAwLCAweDkzNjIwMDdlLCAweDI0MDMwMDAxLCAweDI0NDIwMDAxLCAweGEzNjIwMDdlLAorCTB4MDNlMDAwMDgsIDB4MDA2MDEwMjEsIDB4OTM2MjAwN2UsIDB4OGY2MzAxNzgsIDB4MzA0MjAwZmYsIDB4MTQ0MzAwMDUsCisJMHgwMDAwMTgyMSwgMHg5MzYyMDAwYiwgMHgyNDAzMDAwMSwgMHgyNDQyMDAwMSwgMHhhMzYyMDAwYiwgMHgwM2UwMDAwOCwKKwkweDAwNjAxMDIxLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDI0MDQwMDAxLCAweGFmNjQwMDBjLCAweDhmNjMwMGRjLAorCTB4OGY2MjAwY2MsIDB4NTA2MjAwMDEsIDB4YTc2NDAwMTAsIDB4YTc2NDAwMTIsIDB4YTc2NDAwMTQsIDB4MDNlMDAwMDgsCisJMHhhNzY0MDAxNiwgMHgzYzAyMDgwMCwgMHg4YzQzMDAyMCwgMHgyN2JkZmZlOCwgMHgxMDYwMDAxYiwgMHhhZmJmMDAxMCwKKwkweDBlMDAxNDhlLCAweDAwMDAwMDAwLCAweDhmODIwMDE4LCAweGFjNDAwMDAwLCAweDhmODMwMDE4LCAweGFjNjAwMDA0LAorCTB4OGY4MjAwMTgsIDB4YWM0MDAwMDgsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMGMsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMTAsCisJMHg4ZjgzMDAxOCwgMHgzYzAyNjAwMCwgMHhhYzYwMDAxNCwgMHg4Zjg0MDAxOCwgMHg4YzQzNDQ0OCwgMHgzYzAyMDgwMCwKKwkweGFjODMwMDE4LCAweDk0NDM1OGNlLCAweDhmODQwMDE4LCAweDNjMDI0MDIwLCAweDAwNjIxODI1LCAweGFjODMwMDFjLAorCTB4MGUwMDE0Y2MsIDB4MjQwNDAwMDEsIDB4OGZiZjAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwMjA4MDAsCisJMHg4YzQzMDAyMCwgMHgyN2JkZmZlMCwgMHhhZmIwMDAxMCwgMHgwMGEwODAyMSwgMHhhZmIxMDAxNCwgMHgwMGMwODgyMSwKKwkweGFmYjIwMDE4LCAweDAwZTA5MDIxLCAweDEwNjAwMDFlLCAweGFmYmYwMDFjLCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLAorCTB4OGY4NDAwMTgsIDB4OGY0MjAxMDAsIDB4YWM4MjAwMDAsIDB4OGY4MzAwMTgsIDB4YWM3MDAwMDQsIDB4OGY4MjAwMTgsCisJMHhhYzUxMDAwOCwgMHg4ZjgzMDAxOCwgMHhhYzcyMDAwYywgMHg4Zjg0MDAxOCwgMHg4ZmEyMDAzMCwgMHhhYzgyMDAxMCwKKwkweDhmODMwMDE4LCAweDhmYTIwMDM0LCAweGFjNjIwMDE0LCAweDhmODQwMDE4LCAweDNjMDI2MDAwLCAweDhjNDM0NDQ4LAorCTB4M2MwMjA4MDAsIDB4YWM4MzAwMTgsIDB4OTQ0MzU4Y2UsIDB4OGY4NDAwMTgsIDB4M2MwMjQwYzksIDB4MDA2MjE4MjUsCisJMHhhYzgzMDAxYywgMHgwZTAwMTRjYywgMHgyNDA0MDAwMSwgMHg4ZmJmMDAxYywgMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwKKwkweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNjMDIwODAwLCAweDhjNDMwMDIwLCAweDI3YmRmZmU4LAorCTB4YWZiMDAwMTAsIDB4Mjc1MDAxMDAsIDB4MTA2MDAwMWQsIDB4YWZiZjAwMTQsIDB4MGUwMDE0OGUsIDB4MDAwMDAwMDAsCisJMHg4ZjgzMDAxOCwgMHg4ZTAyMDAwNCwgMHhhYzYyMDAwMCwgMHg4Zjg0MDAxOCwgMHg4ZTAyMDAxOCwgMHhhYzgyMDAwNCwKKwkweDhmODUwMDE4LCAweDhlMDIwMDAwLCAweGFjYTIwMDA4LCAweDhmODMwMDE4LCAweGFjNjAwMDBjLCAweDhmODIwMDE4LAorCTB4YWM0MDAwMTAsIDB4OGY4MzAwMTgsIDB4YWM2MDAwMTQsIDB4OGY4MjAwMTgsIDB4YWM0MDAwMTgsIDB4OTYwMzAwMDgsCisJMHgzYzAyMDgwMCwgMHg5NDQ0NThjZSwgMHg4Zjg1MDAxOCwgMHgwMDAzMWMwMCwgMHgwMDY0MTgyNSwgMHgyNDA0MDAwMSwKKwkweDBlMDAxNGNjLCAweGFjYTMwMDFjLCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LAorCTB4M2MwNjA4MDAsIDB4MjRjNTU4YzAsIDB4M2MwMjAwMGEsIDB4MDM0MjE4MjEsIDB4OTQ2NDAwMDYsIDB4OTRhMjAwMGEsCisJMHgwMDQ0MTAyMywgMHgwMDAyMTQwMCwgMHgwMDAyMWMwMywgMHgwNDYxMDAwNiwgMHhhNGE0MDAwNiwgMHgwMDAwMDAwZCwKKwkweDAwMDAwMDAwLCAweDI0MDAwMDVhLCAweDBhMDAxNGEzLCAweDI0MDIwMDAxLCAweDhmODIwMDE0LCAweDAwNjIxMDJiLAorCTB4MTQ0MDAwMDIsIDB4MDAwMDEwMjEsIDB4MjQwMjAwMDEsIDB4MzA0MjAwZmYsIDB4MTA0MDAwMWMsIDB4Mjc0YTA0MDAsCisJMHgzYzA3MDAwYSwgMHgzYzAyMDgwMCwgMHgyNDQ1NThjMCwgMHg5NGE5MDAwYSwgMHg4Zjg4MDAxNCwgMHgwMzQ3MTAyMSwKKwkweDk0NDMwMDA2LCAweDAwNDAyMDIxLCAweGE0YTMwMDA2LCAweDk0ODIwMDA2LCAweGE0YTIwMDA2LCAweDAxMjIxMDIzLAorCTB4MDAwMjE0MDAsIDB4MDAwMjE0MDMsIDB4MDQ0MTAwMDYsIDB4MDA0ODEwMmIsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsCisJMHgyNDAwMDA1YSwgMHgwYTAwMTRiZSwgMHgyNDAyMDAwMSwgMHgxNDQwMDAwMiwgMHgwMDAwMTAyMSwgMHgyNDAyMDAwMSwKKwkweDMwNDIwMGZmLCAweDE0NDBmZmVjLCAweDAzNDcxMDIxLCAweDI0YzQ1OGMwLCAweDhjODIwMDEwLCAweGFmNDIwMDM4LAorCTB4OGM4MzAwMTQsIDB4M2MwMjAwMDUsIDB4YWY0MzAwM2MsIDB4YWY0MjAwMzAsIDB4YWY4MDAwMTAsIDB4YWY4YTAwMTgsCisJMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlMCwgMHg4ZjgyMDAxMCwgMHg4Zjg1MDAxOCwgMHgzYzA3MDgwMCwKKwkweDI0ZTg1OGMwLCAweGFmYmYwMDFjLCAweGFmYjIwMDE4LCAweGFmYjEwMDE0LCAweGFmYjAwMDEwLCAweDk1MDMwMDBhLAorCTB4OGQwNjAwMTQsIDB4MDAwMDkwMjEsIDB4MzA5MDAwZmYsIDB4MDBlMDg4MjEsIDB4MjQ0MjAwMDEsIDB4MjRhNTAwMjAsCisJMHgyNDYzMDAwMSwgMHhhZjgyMDAxMCwgMHhhZjg1MDAxOCwgMHhhNTAzMDAwYSwgMHgyNGMzMDAyMCwgMHgzYzAyODAwMCwKKwkweDA0YzEwMDA3LCAweGFkMDMwMDE0LCAweDAwNjIxMDI0LCAweDE0NDAwMDA1LCAweDI2MjI1OGMwLCAweDhkMDIwMDEwLAorCTB4MjQ0MjAwMDEsIDB4YWQwMjAwMTAsIDB4MjYyMjU4YzAsIDB4OTQ0NDAwMGEsIDB4OTQ0NTAwMTgsIDB4MDAxMDEwMmIsCisJMHgwMGE0MTgyNiwgMHgyYzYzMDAwMSwgMHgwMDYyMTgyNSwgMHgxMDYwMDAxYywgMHgzYzAzMDAwNiwgMHg4ZjgyMDAxMCwKKwkweDI0MTIwMDAxLCAweDAwMDIxMTQwLCAweDAwNDMxMDI1LCAweGFmNDIwMDMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4Mjc0NTA0MDAsIDB4OGY0MjAwMDAsIDB4MzA0MjAwMTAsIDB4MTA0MGZmZmQsIDB4MjYyMjU4YzAsCisJMHg5NDQ0MDAwYSwgMHg5NDQzMDAxOCwgMHhhZjgwMDAxMCwgMHhhZjg1MDAxOCwgMHgxNDgzMDAxMiwgMHgyNjI3NThjMCwKKwkweDBlMDAxNTVhLCAweDAwMDAwMDAwLCAweDE2MDAwMDBlLCAweDI2Mjc1OGMwLCAweDBlMDAxNDhlLCAweDAwMDAwMDAwLAorCTB4MGEwMDE1MTcsIDB4MjYyNzU4YzAsIDB4MDAwNDFjMDAsIDB4MDAwMzFjMDMsIDB4MDAwNTE0MDAsIDB4MDAwMjE0MDMsCisJMHgwMDYyMTgyMywgMHgxODYwMDAwMiwgMHgzYzAyNjAwMCwgMHhhYzQwMDgwOCwgMHgyNjI3NThjMCwgMHg5NGUyMDAwZSwKKwkweDk0ZTMwMDBjLCAweDI0NDIwMDAxLCAweGE0ZTIwMDBlLCAweDMwNDJmZmZmLCAweDUwNDMwMDAxLCAweGE0ZTAwMDBlLAorCTB4MTIwMDAwMDUsIDB4M2MwMjAwMGEsIDB4OTRlMjAwMGEsIDB4YTc0MjAwYTIsIDB4MGEwMDE1NTQsIDB4MDI0MDEwMjEsCisJMHgwMzQyMTgyMSwgMHg5NDY0MDAwNiwgMHg5NGUyMDAwYSwgMHgwMDQ0MTAyMywgMHgwMDAyMTQwMCwgMHgwMDAyMWMwMywKKwkweDA0NjEwMDA2LCAweGE0ZTQwMDA2LCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDI0MDAwMDVhLCAweDBhMDAxNTM2LAorCTB4MjQwMjAwMDEsIDB4OGY4MjAwMTQsIDB4MDA2MjEwMmIsIDB4MTQ0MDAwMDIsIDB4MDAwMDEwMjEsIDB4MjQwMjAwMDEsCisJMHgzMDQyMDBmZiwgMHgxMDQwMDAxYiwgMHgzYzAyMDgwMCwgMHgzYzA2MDAwYSwgMHgyNDQ1NThjMCwgMHg5NGE4MDAwYSwKKwkweDhmODcwMDE0LCAweDAzNDYxMDIxLCAweDk0NDMwMDA2LCAweDAwNDAyMDIxLCAweGE0YTMwMDA2LCAweDk0ODIwMDA2LAorCTB4YTRhMjAwMDYsIDB4MDEwMjEwMjMsIDB4MDAwMjE0MDAsIDB4MDAwMjE0MDMsIDB4MDQ0MTAwMDYsIDB4MDA0NzEwMmIsCisJMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDA1YSwgMHgwYTAwMTU1MCwgMHgyNDAyMDAwMSwgMHgxNDQwMDAwMiwKKwkweDAwMDAxMDIxLCAweDI0MDIwMDAxLCAweDMwNDIwMGZmLCAweDE0NDBmZmVjLCAweDAzNDYxMDIxLCAweDAyNDAxMDIxLAorCTB4OGZiZjAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsCisJMHgzYzAyMDgwMCwgMHgyNDQ1NThjMCwgMHg5NGEzMDAxYSwgMHg4Y2E0MDAyNCwgMHgwMDQwMzAyMSwgMHgwMDAzMThjMCwKKwkweDAwODMyMDIxLCAweGFmNDQwMDNjLCAweDhjYTIwMDIwLCAweGFmNDIwMDM4LCAweDNjMDIwMDUwLCAweDM0NDIwMDA4LAorCTB4YWY0MjAwMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4OGY0MjAwMDAsIDB4MzA0MjAwMjAsCisJMHgxMDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjQzMDQwMCwgMHgyNGM2NThjMCwgMHhhY2MzMDAxMCwgMHg4ZjQyMDQwNCwKKwkweDNjMDMwMDIwLCAweGFjYzIwMDE0LCAweGFmNDMwMDMwLCAweDk0YzQwMDE4LCAweDk0YzMwMDFjLCAweDk0YzIwMDFhLAorCTB4OTRjNTAwMWUsIDB4MDA4MzIwMjEsIDB4MjQ0MjAwMDEsIDB4YTRjMjAwMWEsIDB4MzA0MmZmZmYsIDB4MTQ0NTAwMDIsCisJMHhhNGM0MDAxOCwgMHhhNGMwMDAxYSwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAxMCwgMHgzYzAzMDAwNiwKKwkweDAwMDIxMTQwLCAweDAwNDMxMDI1LCAweGFmNDIwMDMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4Mjc0MzA0MDAsIDB4OGY0MjAwMDAsIDB4MzA0MjAwMTAsIDB4MTA0MGZmZmQsIDB4MDAwMDAwMDAsIDB4YWY4MDAwMTAsCisJMHhhZjgzMDAxOCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlOCwgMHhhZmIwMDAxMCwgMHgzYzEwMDgwMCwKKwkweDI2MTA1OGMwLCAweDNjMDUwMDBhLCAweDAyMDAyMDIxLCAweDAzNDUyODIxLCAweGFmYmYwMDE0LCAweDBlMDAxNWIwLAorCTB4MjQwNjAwMGEsIDB4OTYwMjAwMDIsIDB4OTYwMzAwMWUsIDB4MzA0MjAwMGYsIDB4MjQ0MjAwMDMsIDB4MDA0MzE4MDQsCisJMHgyNDAyN2ZmZiwgMHgwMDQzMTAyYiwgMHhhZjgzMDAxNCwgMHgxMDQwMDAwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwKKwkweDAwMDAwMDAwLCAweDI0MDAwMDQzLCAweDBlMDAxNTVhLCAweDAwMDAwMDAwLCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLAorCTB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4MTBjMDAwMDcsIDB4MDAwMDAwMDAsIDB4OGNhMjAwMDAsIDB4MjRjNmZmZmYsCisJMHgyNGE1MDAwNCwgMHhhYzgyMDAwMCwgMHgxNGMwZmZmYiwgMHgyNDg0MDAwNCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwKKwkweDBhMDAxNWMxLCAweDAwYTAxMDIxLCAweGFjODYwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI0ODQwMDA0LAorCTB4MDBhMDEwMjEsIDB4MTQ0MGZmZmEsIDB4MjRhNWZmZmYsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4M2MwMzYwMDAsCisJMHg4YzY0MmI3YywgMHgzYzAzNjAxMCwgMHg4YzY1NTNmYywgMHgwMDA0MTU4MiwgMHgwMDA0MjMwMiwgMHgzMDg0MDNmZiwKKwkweDAwMDUyZDgyLCAweDAwNDQxMDI2LCAweDAwMDIxMDJiLCAweDAwMDUyODJiLCAweDAwNDUxMDI1LCAweDE0NDAwMDBkLAorCTB4M2MwMjAwNTAsIDB4MzQ0MjAwMDQsIDB4YWY0MDAwMzgsIDB4YWY0MDAwM2MsIDB4YWY0MjAwMzAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHg4ZjQyMDAwMCwgMHgzMDQyMDAyMCwgMHgxMDQwZmZmZCwgMHgzYzAyMDAyMCwgMHhhZjQyMDAzMCwKKwkweDAwMDAwMDBkLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDNjMDIwMDUwLCAweDM0NDIwMDA0LCAweGFmNDQwMDM4LAorCTB4YWY0NTAwM2MsIDB4YWY0MjAwMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4OGY0MjAwMDAsIDB4MzA0MjAwMjAsCisJMHgxMDQwZmZmZCwgMHgzYzAyMDAyMCwgMHhhZjQyMDAzMCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH07CisKK3N0YXRpYyB1MzIgYm54Ml9DT01fYjA2RndEYXRhWygweDAvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfQ09NX2IwNkZ3Um9kYXRhWygweDU4LzQpICsgMV0gPSB7CisJMHgwODAwMjQyOCwgMHgwODAwMjQ1YywgMHgwODAwMjQ1YywgMHgwODAwMjQ1YywgMHgwODAwMjQ1YywgMHgwODAwMjQ1YywKKwkweDA4MDAyMzgwLCAweDA4MDAyNDVjLCAweDA4MDAyM2U0LCAweDA4MDAyNDVjLCAweDA4MDAyMzFjLCAweDA4MDAyNDVjLAorCTB4MDgwMDI0NWMsIDB4MDgwMDI0NWMsIDB4MDgwMDIzMjgsIDB4MDAwMDAwMDAsIDB4MDgwMDMyNDAsIDB4MDgwMDMyNzAsCisJMHgwODAwMzJhMCwgMHgwODAwMzJkMCwgMHgwODAwMzMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9Oworc3RhdGljIHUzMiBibngyX0NPTV9iMDZGd0Jzc1soMHg4OC80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9DT01fYjA2RndTYnNzWygweDFjLzQpICsgMV0gPSB7IDB4MCB9OworCitzdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3UmVsZWFzZU1ham9yID0gMHgxOworc3RhdGljIGludCBibngyX1JYUF9iMDZGd1JlbGVhc2VNaW5vciA9IDB4MDsKK3N0YXRpYyBpbnQgYm54Ml9SWFBfYjA2RndSZWxlYXNlRml4ID0gMHgwOworc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd1N0YXJ0QWRkciA9IDB4MDgwMDMxODQ7CitzdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3VGV4dEFkZHIgPSAweDA4MDAwMDAwOworc3RhdGljIGludCBibngyX1JYUF9iMDZGd1RleHRMZW4gPSAweDU4OGM7CitzdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3RGF0YUFkZHIgPSAweDA4MDA1OGUwOworc3RhdGljIGludCBibngyX1JYUF9iMDZGd0RhdGFMZW4gPSAweDA7CitzdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3Um9kYXRhQWRkciA9IDB4MDgwMDU4OTA7CitzdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3Um9kYXRhTGVuID0gMHgyODsKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndCc3NBZGRyID0gMHgwODAwNTkwMDsKK3N0YXRpYyBpbnQgYm54Ml9SWFBfYjA2RndCc3NMZW4gPSAweDEzYTQ7CitzdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3U2Jzc0FkZHIgPSAweDA4MDA1OGUwOworc3RhdGljIGludCBibngyX1JYUF9iMDZGd1Nic3NMZW4gPSAweDFjOworc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd1RleHRbKDB4NTg4Yy80KSArIDFdID0geworCTB4MGEwMDBjNjEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4NzI3ODcwMjAsIDB4MzIyZTM2MmUsCisJMHgzMTAwMDAwMCwgMHgwMjA2MDEwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MTAwMDAwMDMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsCisJMHgzYzAyMDgwMCwgMHgyNDQyNThlMCwgMHgzYzAzMDgwMCwgMHgyNDYzNmNhNCwgMHhhYzQwMDAwMCwgMHgwMDQzMjAyYiwKKwkweDE0ODBmZmZkLCAweDI0NDIwMDA0LCAweDNjMWQwODAwLCAweDM3YmQ3ZmZjLCAweDAzYTBmMDIxLCAweDNjMTAwODAwLAorCTB4MjYxMDMxODQsIDB4M2MxYzA4MDAsIDB4Mjc5YzU4ZTAsIDB4MGUwMDEwNGEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsCisJMHgyN2JkZmZlOCwgMHhhZmIwMDAxMCwgMHhhZmJmMDAxNCwgMHgwZTAwMGYxZCwgMHgwMDgwODAyMSwgMHgxNDQwMDAwZCwKKwkweDAwMDAwMDAwLCAweDhmODIwMDEwLCAweDEwNDAwMDA1LCAweDAwMDAwMDAwLCAweDk3NDMwMTFjLCAweDk3NDIwMTFlLAorCTB4MGEwMDBjODksIDB4MDAwMjE0MDAsIDB4OTc0MzAxMWUsIDB4OTc0MjAxMWMsIDB4MDAwMjE0MDAsIDB4MDA2MjE4MjUsCisJMHhhZjgzMDAwNCwgMHg4Zjg0MDAwOCwgMHgzYzAyMDAyMCwgMHgzNDQyNDAwMCwgMHgwMDgyMTgyNCwgMHg1NDYyMDAwNCwKKwkweDNjMDIwMDIwLCAweDhmODIwMDE0LCAweDBhMDAwYzlhLCAweDM0NDIxMDAwLCAweDM0NDI4MDAwLCAweDAwODIxODI0LAorCTB4MTQ2MjAwMDQsIDB4MDAwMDAwMDAsIDB4OGY4MjAwMTQsIDB4MzQ0MjgwMDAsIDB4YWY4MjAwMTQsIDB4OGY4MjAwMDgsCisJMHg5NzQzMDEwYywgMHgwMDQwMzAyMSwgMHgzMDQyMTAwMCwgMHgxMDQwMDAxMCwgMHgzMDY5ZmZmZiwgMHgzMGMyMDAyMCwKKwkweDE0NDAwMDBlLCAweDI0MDcwMDA1LCAweDNjMDIxMDAwLCAweDAwYzIxMDI0LCAweDEwNDAwMDA5LCAweDNjMDMwZGZmLAorCTB4MzQ2M2ZmZmYsIDB4M2MwMjBlMDAsIDB4MDBjMjEwMjQsIDB4MDA2MjE4MmIsIDB4NTA2MDAwMDQsIDB4MjQwNzAwMDEsCisJMHgwYTAwMGNiMiwgMHgzYzAyMDgwMCwgMHgyNDA3MDAwMSwgMHgzYzAyMDgwMCwgMHg4YzQzMDAzNCwgMHgxNDYwMDAxZCwKKwkweDAwNDA1ODIxLCAweDhmODIwMDE0LCAweDMwNDI0MDAwLCAweDE0NDAwMDFhLCAweDNjMDIwMDAxLCAweDNjMDIxZjAxLAorCTB4MDBjMjQwMjQsIDB4M2MwMzEwMDAsIDB4MTUwMzAwMTUsIDB4M2MwMjAwMDEsIDB4MzEyMjAyMDAsIDB4MTQ0MDAwMTIsCisJMHgzYzAyMDAwMSwgMHg5NzQ0MDEwZSwgMHgyNDAyMDAwMywgMHhhMzQyMDE4YiwgMHg5Nzg1MDAxNiwgMHgyNDAyMDAwMiwKKwkweDM0ZTMwMDAyLCAweGFmNDAwMTgwLCAweGE3NDIwMThjLCAweGE3NDMwMTg4LCAweDI0ODQwMDA0LCAweDMwYTViZmZmLAorCTB4YTc0NDAxOGUsIDB4YTc0NTAxYTYsIDB4YWY0ODAxYjgsIDB4MGEwMDBmMTksIDB4MDAwMDEwMjEsIDB4M2MwMjAwMDEsCisJMHgwMGMyMTAyNCwgMHgxMDQwMDAyZiwgMHgwMDAwMDAwMCwgMHg5NzQyMDEwZSwgMHgzYzAzODAwMCwgMHgzMDQ2ZmZmZiwKKwkweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDAzLCAweGEzNDIwMThiLCAweDk3ODQwMDBhLAorCTB4OGY4NTAwMDQsIDB4OGY4NzAwMTQsIDB4MjQwMjAwODAsIDB4MjQwMzAwMDIsIDB4YWY0MjAxODAsIDB4MjQwMjAwMDMsCisJMHhhNzQzMDE4YywgMHhhNzQ2MDE4ZSwgMHhhNzQyMDE4OCwgMHgzMGUyODAwMCwgMHhhNzQ0MDE5MCwgMHgxMDQwMDAwYywKKwkweGFmNDUwMWE4LCAweDkzNDIwMTE2LCAweDMwNDIwMGZjLCAweDAwNWExMDIxLCAweDI0NDI0MDA0LCAweDhjNDMwMDAwLAorCTB4MzA2M2ZmZmYsIDB4MTQ2MDAwMDQsIDB4M2MwMmZmZmYsIDB4MzQ0MjdmZmYsIDB4MDBlMjEwMjQsIDB4YWY4MjAwMTQsCisJMHg5NzgyMDAxNiwgMHg5NzQzMDEwYywgMHg4ZjQ0MDEwNCwgMHgzMDQyYmZmZiwgMHgwMDAzMWMwMCwgMHgzMDg0ZmZmZiwKKwkweDAwNjQxODI1LCAweGE3NDIwMWE2LCAweGFmNDMwMWFjLCAweDNjMDIxMDAwLCAweGFmNDIwMWI4LCAweDBhMDAwZjE5LAorCTB4MDAwMDEwMjEsIDB4OGY4MjAwMTQsIDB4MzA0MzQwMDAsIDB4MTA2MDAwMTYsIDB4MDA0MDQwMjEsIDB4M2MwMjBmMDAsCisJMHgwMGMyMTAyNCwgMHgxNDQwMDAxMiwgMHgwMDAwMDAwMCwgMHg5MzQyMDExNiwgMHgzNDQyNDAwMCwgMHgwMzQyMTgyMSwKKwkweDk0NjUwMDAyLCAweDJjYTIxMzg5LCAweDEwNDAwMDBiLCAweDNjMDIwODAwLCAweDI0NDI1OTAwLCAweDAwMDUxOTQyLAorCTB4MDAwMzE4ODAsIDB4MDA2MjE4MjEsIDB4MzBhNTAwMWYsIDB4OGM2NDAwMDAsIDB4MjQwMjAwMDEsIDB4MDBhMjEwMDQsCisJMHgwMDgyMjAyNCwgMHgwMjA0ODAyNSwgMHgxMjAwMDAzMCwgMHgzYzAyMTAwMCwgMHg5NzQyMDEwZSwgMHgzNGU4MDAwMiwKKwkweDNjMDM4MDAwLCAweDI0NDIwMDA0LCAweDMwNDZmZmZmLCAweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLAorCTB4MjQwMjAwMDMsIDB4YTM0MjAxOGIsIDB4OTc4NDAwMGEsIDB4OGY4NTAwMDQsIDB4OGY4NzAwMTQsIDB4MjQwMjAxODAsCisJMHgyNDAzMDAwMiwgMHhhZjQyMDE4MCwgMHhhNzQzMDE4YywgMHhhNzQ2MDE4ZSwgMHhhNzQ4MDE4OCwgMHgzMGUyODAwMCwKKwkweGE3NDQwMTkwLCAweDEwNDAwMDBjLCAweGFmNDUwMWE4LCAweDkzNDIwMTE2LCAweDMwNDIwMGZjLCAweDAwNWExMDIxLAorCTB4MjQ0MjQwMDQsIDB4OGM0MzAwMDAsIDB4MzA2M2ZmZmYsIDB4MTQ2MDAwMDQsIDB4M2MwMmZmZmYsIDB4MzQ0MjdmZmYsCisJMHgwMGUyMTAyNCwgMHhhZjgyMDAxNCwgMHg5NzgyMDAxNiwgMHg5NzQzMDEwYywgMHg4ZjQ0MDEwNCwgMHgzMDQyYmZmZiwKKwkweDAwMDMxYzAwLCAweDMwODRmZmZmLCAweDAwNjQxODI1LCAweGE3NDIwMWE2LCAweGFmNDMwMWFjLCAweDNjMDIxMDAwLAorCTB4YWY0MjAxYjgsIDB4MGEwMDBmMTksIDB4MDAwMDEwMjEsIDB4MDBjMjEwMjQsIDB4MTA0MDAwYzAsIDB4M2MwMjA4MDAsCisJMHg4YzQzMDAzMCwgMHgxMDYwMDAzNywgMHgzMTAyNDAwMCwgMHgxMDQwMDAzNSwgMHgzYzAzMGYwMCwgMHgwMGMzMTgyNCwKKwkweDNjMDIwMTAwLCAweDAwNDMxMDJiLCAweDE0NDAwMDMxLCAweDNjMDMwODAwLCAweDk3NDIwMTBlLCAweDM0ZTgwMDAyLAorCTB4M2MwMzgwMDAsIDB4MjQ0MjAwMDQsIDB4MzA0NmZmZmYsIDB4OGY0MjAxYjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgyNDAyMDAwMywgMHhhMzQyMDE4YiwgMHg5Nzg0MDAwYSwgMHg4Zjg1MDAwNCwgMHg4Zjg3MDAxNCwgMHgyNDAyMDA4MCwKKwkweDI0MDMwMDAyLCAweGFmNDIwMTgwLCAweGE3NDMwMThjLCAweGE3NDYwMThlLCAweGE3NDgwMTg4LCAweDMwZTI4MDAwLAorCTB4YTc0NDAxOTAsIDB4MTA0MDAwMGMsIDB4YWY0NTAxYTgsIDB4OTM0MjAxMTYsIDB4MzA0MjAwZmMsIDB4MDA1YTEwMjEsCisJMHgyNDQyNDAwNCwgMHg4YzQzMDAwMCwgMHgzMDYzZmZmZiwgMHgxNDYwMDAwNCwgMHgzYzAyZmZmZiwgMHgzNDQyN2ZmZiwKKwkweDAwZTIxMDI0LCAweGFmODIwMDE0LCAweDk3ODIwMDE2LCAweDk3NDMwMTBjLCAweDhmNDQwMTA0LCAweDMwNDJiZmZmLAorCTB4MDAwMzFjMDAsIDB4MzA4NGZmZmYsIDB4MDA2NDE4MjUsIDB4YTc0MjAxYTYsIDB4YWY0MzAxYWMsIDB4M2MwMjEwMDAsCisJMHhhZjQyMDFiOCwgMHgwYTAwMGYxOSwgMHgwMDAwMTAyMSwgMHgzYzAzMDgwMCwgMHg4YzYyMDAyNCwgMHgzMDQyMDAwOCwKKwkweDEwNDAwMDM1LCAweDM0ZWEwMDAyLCAweDNjMDIwZjAwLCAweDAwYzIxMDI0LCAweDE0NDAwMDMyLCAweDhkNjIwMDM0LAorCTB4MzEyMjAyMDAsIDB4MTA0MDAwMmYsIDB4OGQ2MjAwMzQsIDB4OTc0MjAxMGUsIDB4MzBlOGZmZmIsIDB4M2MwMzgwMDAsCisJMHgyNDQyMDAwNCwgMHgzMDQ2ZmZmZiwgMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMywKKwkweGEzNDIwMThiLCAweDk3ODQwMDBhLCAweDhmODUwMDA0LCAweDhmODcwMDE0LCAweDI0MDIwMTgwLCAweDI0MDMwMDAyLAorCTB4YWY0MjAxODAsIDB4YTc0MzAxOGMsIDB4YTc0NjAxOGUsIDB4YTc0ODAxODgsIDB4MzBlMjgwMDAsIDB4YTc0NDAxOTAsCisJMHgxMDQwMDAwYywgMHhhZjQ1MDFhOCwgMHg5MzQyMDExNiwgMHgzMDQyMDBmYywgMHgwMDVhMTAyMSwgMHgyNDQyNDAwNCwKKwkweDhjNDMwMDAwLCAweDMwNjNmZmZmLCAweDE0NjAwMDA0LCAweDNjMDJmZmZmLCAweDM0NDI3ZmZmLCAweDAwZTIxMDI0LAorCTB4YWY4MjAwMTQsIDB4OTc4MjAwMTYsIDB4OTc0MzAxMGMsIDB4OGY0NDAxMDQsIDB4MzA0MmJmZmYsIDB4MDAwMzFjMDAsCisJMHgzMDg0ZmZmZiwgMHgwMDY0MTgyNSwgMHhhNzQyMDFhNiwgMHhhZjQzMDFhYywgMHgzYzAyMTAwMCwgMHhhZjQyMDFiOCwKKwkweDhkNjIwMDM0LCAweDhmODYwMDA4LCAweDEwNDAwMDEyLCAweDMwYzIwMTAwLCAweDEwNDAwMDEwLCAweDNjMDIwZjAwLAorCTB4MDBjMjEwMjQsIDB4M2MwMzAyMDAsIDB4MTA0MzAwMGMsIDB4M2MwMjA4MDAsIDB4OGM0MzAwMzgsIDB4OGY4NDAwMDQsCisJMHgzYzAyMDgwMCwgMHgyNDQyMDAzYywgMHgyNDYzZmZmZiwgMHgwMDgzMjAyNCwgMHgwMDgyMjAyMSwgMHg5MDgzMDAwMCwKKwkweDI0NjMwMDA0LCAweDBhMDAwZGUxLCAweDAwMDMyOWMwLCAweDAwMDAwMDAwLCAweDAwMDYxNjAyLCAweDMwNDIwMDBmLAorCTB4MDAwMjI5YzAsIDB4M2MwNGZjMDAsIDB4MDA0NDEwMjEsIDB4M2MwMzAzMDAsIDB4MDA2MjE4MmIsIDB4NTA2MDAwMDEsCisJMHgyNDA1MDgwMCwgMHg5NzQyMDEwZSwgMHgzMTQ4ZmZmZiwgMHgzYzAzODAwMCwgMHgyNDQyMDAwNCwgMHgzMDQ2ZmZmZiwKKwkweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDAzLCAweGEzNDIwMThiLCAweDk3ODMwMDBhLAorCTB4OGY4NDAwMDQsIDB4OGY4NzAwMTQsIDB4MjQwMjAwMDIsIDB4YWY0NTAxODAsIDB4YTc0MjAxOGMsIDB4YTc0NjAxOGUsCisJMHhhNzQ4MDE4OCwgMHgzMGUyODAwMCwgMHhhNzQzMDE5MCwgMHgxMDQwMDAwYywgMHhhZjQ0MDFhOCwgMHg5MzQyMDExNiwKKwkweDMwNDIwMGZjLCAweDAwNWExMDIxLCAweDI0NDI0MDA0LCAweDhjNDMwMDAwLCAweDMwNjNmZmZmLCAweDE0NjAwMDA0LAorCTB4M2MwMmZmZmYsIDB4MzQ0MjdmZmYsIDB4MDBlMjEwMjQsIDB4YWY4MjAwMTQsIDB4OTc4MjAwMTYsIDB4OTc0MzAxMGMsCisJMHg4ZjQ0MDEwNCwgMHgzMDQyYmZmZiwgMHgwMDAzMWMwMCwgMHgzMDg0ZmZmZiwgMHgwMDY0MTgyNSwgMHhhNzQyMDFhNiwKKwkweGFmNDMwMWFjLCAweDNjMDIxMDAwLCAweGFmNDIwMWI4LCAweDBhMDAwZjE5LCAweDAwMDAxMDIxLCAweDhmNDI0MDAwLAorCTB4MzA0MjAxMDAsIDB4MTA0MDAwZDUsIDB4M2MwMjA4MDAsIDB4OGM0NDAwMjQsIDB4MjQwMzAwMDEsIDB4MTQ4MzAwMmYsCisJMHgwMDQwNTAyMSwgMHg5NzQyMDEwZSwgMHgzNGU3MDAwMiwgMHgzYzAzODAwMCwgMHgyNDQyMDAwNCwgMHgzMDQ1ZmZmZiwKKwkweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDAzLCAweGEzNDIwMThiLCAweDk3ODMwMDBhLAorCTB4OGY4NDAwMDQsIDB4OGY4NjAwMTQsIDB4MjQwMjAwMDIsIDB4YWY0MDAxODAsIDB4YTc0MjAxOGMsIDB4YTc0NTAxOGUsCisJMHhhNzQ3MDE4OCwgMHgzMGMyODAwMCwgMHhhNzQzMDE5MCwgMHgxMDQwMDAwYywgMHhhZjQ0MDFhOCwgMHg5MzQyMDExNiwKKwkweDMwNDIwMGZjLCAweDAwNWExMDIxLCAweDI0NDI0MDA0LCAweDhjNDMwMDAwLCAweDMwNjNmZmZmLCAweDE0NjAwMDA0LAorCTB4M2MwMmZmZmYsIDB4MzQ0MjdmZmYsIDB4MDBjMjEwMjQsIDB4YWY4MjAwMTQsIDB4OTc4MjAwMTYsIDB4OTc0MzAxMGMsCisJMHg4ZjQ0MDEwNCwgMHgzMDQyYmZmZiwgMHgwMDAzMWMwMCwgMHgzMDg0ZmZmZiwgMHgwMDY0MTgyNSwgMHhhNzQyMDFhNiwKKwkweGFmNDMwMWFjLCAweDNjMDIxMDAwLCAweGFmNDIwMWI4LCAweDBhMDAwZjE5LCAweDAwMDAxMDIxLCAweDMwODIwMDAxLAorCTB4MTA0MDAwMmUsIDB4MzBlYjAwMDQsIDB4OTc0MjAxMGUsIDB4MzBlOWZmZmIsIDB4M2MwMzgwMDAsIDB4MjQ0MjAwMDQsCisJMHgzMDQ1ZmZmZiwgMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMywgMHhhMzQyMDE4YiwKKwkweDk3ODMwMDBhLCAweDhmODQwMDA0LCAweDhmODYwMDE0LCAweDI0MDIwMDAyLCAweGFmNDAwMTgwLCAweGE3NDIwMThjLAorCTB4YTc0NTAxOGUsIDB4YTc0NzAxODgsIDB4MzBjMjgwMDAsIDB4YTc0MzAxOTAsIDB4MTA0MDAwMGMsIDB4YWY0NDAxYTgsCisJMHg5MzQyMDExNiwgMHgzMDQyMDBmYywgMHgwMDVhMTAyMSwgMHgyNDQyNDAwNCwgMHg4YzQzMDAwMCwgMHgzMDYzZmZmZiwKKwkweDE0NjAwMDA0LCAweDNjMDJmZmZmLCAweDM0NDI3ZmZmLCAweDAwYzIxMDI0LCAweGFmODIwMDE0LCAweDk3ODIwMDE2LAorCTB4OTc0MzAxMGMsIDB4OGY0NDAxMDQsIDB4MzA0MmJmZmYsIDB4MDAwMzFjMDAsIDB4MzA4NGZmZmYsIDB4MDA2NDE4MjUsCisJMHhhNzQyMDFhNiwgMHhhZjQzMDFhYywgMHgzYzAyMTAwMCwgMHhhZjQyMDFiOCwgMHgzMTI3ZmZmZiwgMHg4ZDQyMDAyNCwKKwkweDMwNDIwMDA0LCAweDEwNDAwMDMwLCAweDhkNDIwMDI0LCAweDk3NDIwMTBlLCAweDMwZTlmZmZiLCAweDNjMDM4MDAwLAorCTB4MjQ0MjAwMDQsIDB4MzA0NmZmZmYsIDB4OGY0MjAxYjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MjQwMjAwMDMsCisJMHhhMzQyMDE4YiwgMHg5Nzg0MDAwYSwgMHg4Zjg1MDAwNCwgMHg4Zjg4MDAxNCwgMHgyNDAyMDEwMCwgMHgyNDAzMDAwMiwKKwkweGFmNDIwMTgwLCAweGE3NDMwMThjLCAweGE3NDYwMThlLCAweGE3NDcwMTg4LCAweDMxMDI4MDAwLCAweGE3NDQwMTkwLAorCTB4MTA0MDAwMGMsIDB4YWY0NTAxYTgsIDB4OTM0MjAxMTYsIDB4MzA0MjAwZmMsIDB4MDA1YTEwMjEsIDB4MjQ0MjQwMDQsCisJMHg4YzQzMDAwMCwgMHgzMDYzZmZmZiwgMHgxNDYwMDAwNCwgMHgzYzAyZmZmZiwgMHgzNDQyN2ZmZiwgMHgwMTAyMTAyNCwKKwkweGFmODIwMDE0LCAweDk3ODIwMDE2LCAweDk3NDMwMTBjLCAweDhmNDQwMTA0LCAweDMwNDJiZmZmLCAweDAwMDMxYzAwLAorCTB4MzA4NGZmZmYsIDB4MDA2NDE4MjUsIDB4YTc0MjAxYTYsIDB4YWY0MzAxYWMsIDB4M2MwMjEwMDAsIDB4YWY0MjAxYjgsCisJMHgzMTI3ZmZmZiwgMHg4ZDQyMDAyNCwgMHgzMDQyMDAwOCwgMHgxMDQwMDAyZCwgMHgwMDAwMDAwMCwgMHg5NzQyMDEwZSwKKwkweDNjMDM4MDAwLCAweDI0NDIwMDA0LCAweDMwNDZmZmZmLCAweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLAorCTB4MjQwMjAwMDMsIDB4YTM0MjAxOGIsIDB4OTc4NDAwMGEsIDB4OGY4NTAwMDQsIDB4OGY4ODAwMTQsIDB4MjQwMjAxODAsCisJMHgyNDAzMDAwMiwgMHhhZjQyMDE4MCwgMHhhNzQzMDE4YywgMHhhNzQ2MDE4ZSwgMHhhNzQ3MDE4OCwgMHgzMTAyODAwMCwKKwkweGE3NDQwMTkwLCAweDEwNDAwMDBjLCAweGFmNDUwMWE4LCAweDkzNDIwMTE2LCAweDMwNDIwMGZjLCAweDAwNWExMDIxLAorCTB4MjQ0MjQwMDQsIDB4OGM0MzAwMDAsIDB4MzA2M2ZmZmYsIDB4MTQ2MDAwMDQsIDB4M2MwMmZmZmYsIDB4MzQ0MjdmZmYsCisJMHgwMTAyMTAyNCwgMHhhZjgyMDAxNCwgMHg5NzgyMDAxNiwgMHg5NzQzMDEwYywgMHg4ZjQ0MDEwNCwgMHgzMDQyYmZmZiwKKwkweDAwMDMxYzAwLCAweDMwODRmZmZmLCAweDAwNjQxODI1LCAweGE3NDIwMWE2LCAweGFmNDMwMWFjLCAweDNjMDIxMDAwLAorCTB4YWY0MjAxYjgsIDB4MTU2MDAwNDEsIDB4MDAwMDEwMjEsIDB4Mjc0NDAxODAsIDB4M2MwMzgwMDAsIDB4OGY0MjAxYjgsCisJMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMjAwMCwgMHgyNDAzMDAwMiwgMHhhNDgyMDAwOCwgMHhhMDgzMDAwYiwKKwkweGE0ODAwMDEwLCAweDNjMDIxMDAwLCAweGFmNDIwMWI4LCAweDBhMDAwZjE5LCAweDAwMDAxMDIxLCAweDNjMDMwODAwLAorCTB4OGM2MjAwMjQsIDB4MzA0MjAwMDEsIDB4MTA0MDAwMmUsIDB4MDAwMDEwMjEsIDB4OTc0MjAxMGUsIDB4MzRlNzAwMDIsCisJMHgzYzAzODAwMCwgMHgyNDQyMDAwNCwgMHgzMDQ1ZmZmZiwgMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwKKwkweDI0MDIwMDAzLCAweGEzNDIwMThiLCAweDk3ODMwMDBhLCAweDhmODQwMDA0LCAweDhmODYwMDE0LCAweDI0MDIwMDAyLAorCTB4YWY0MDAxODAsIDB4YTc0MjAxOGMsIDB4YTc0NTAxOGUsIDB4YTc0NzAxODgsIDB4MzBjMjgwMDAsIDB4YTc0MzAxOTAsCisJMHgxMDQwMDAwYywgMHhhZjQ0MDFhOCwgMHg5MzQyMDExNiwgMHgzMDQyMDBmYywgMHgwMDVhMTAyMSwgMHgyNDQyNDAwNCwKKwkweDhjNDMwMDAwLCAweDMwNjNmZmZmLCAweDE0NjAwMDA0LCAweDNjMDJmZmZmLCAweDM0NDI3ZmZmLCAweDAwYzIxMDI0LAorCTB4YWY4MjAwMTQsIDB4OTc4MjAwMTYsIDB4OTc0MzAxMGMsIDB4OGY0NDAxMDQsIDB4MzA0MmJmZmYsIDB4MDAwMzFjMDAsCisJMHgzMDg0ZmZmZiwgMHgwMDY0MTgyNSwgMHhhNzQyMDFhNiwgMHhhZjQzMDFhYywgMHgzYzAyMTAwMCwgMHhhZjQyMDFiOCwKKwkweDAwMDAxMDIxLCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDhmNGIwMDcwLAorCTB4OTM0MjAxMTIsIDB4OGY4NDAwMDgsIDB4MDAwMjI4ODIsIDB4MzA4MjAxMDAsIDB4MTQ0MDAwMDMsIDB4MjRhMzAwMDMsCisJMHgwM2UwMDAwOCwgMHgwMDAwMTAyMSwgMHgzMDgyNDAwMCwgMHgxMDQwMDAxMCwgMHgyNzQyNDAwMCwgMHgwMDAzMTg4MCwKKwkweDAwNDMxMDIxLCAweDhjNDcwMDAwLCAweDI0YTMwMDA0LCAweDAwMDMxODgwLCAweDI3NDI0MDAwLCAweDAwNDMxMDIxLAorCTB4OGM0OTAwMDAsIDB4OTM0MzAxMTYsIDB4Mjc0MjQwMDAsIDB4MzA2MzAwZmMsIDB4MDA0MzEwMjEsIDB4OGM0YTAwMDAsCisJMHgwYTAwMGY0NSwgMHgzYzAzMDgwMCwgMHgzMDgyMjAwMCwgMHgxMDQwZmZlYSwgMHgwMDAzMTg4MCwgMHgyNzQyNDAwMCwKKwkweDAwNDMxMDIxLCAweDhjNDcwMDAwLCAweDI0YTMwMDA0LCAweDAwMDMxODgwLCAweDI3NDI0MDAwLCAweDAwNDMxMDIxLAorCTB4OGM0OTAwMDAsIDB4MDAwMDUwMjEsIDB4M2MwMzA4MDAsIDB4MjQ2ODAxMDAsIDB4MDAwNzE2MDIsIDB4MDAwMjEwODAsCisJMHgwMDQ4MTAyMSwgMHg4YzQ2MDAwMCwgMHgwMDA3MWI4MiwgMHgzMDYzMDNmYywgMHgwMTAzMTgyMSwgMHg4YzY0MDQwMCwKKwkweDAwMDcxMTgyLCAweDMwNDIwM2ZjLCAweDAxMDIxMDIxLCAweDhjNDUwODAwLCAweDMwZTMwMGZmLCAweDAwMDMxODgwLAorCTB4MDEwMzE4MjEsIDB4MDAwOTE2MDIsIDB4MDAwMjEwODAsIDB4MDEwMjEwMjEsIDB4MDBjNDMwMjYsIDB4OGM2NDBjMDAsCisJMHg4YzQzMTAwMCwgMHgwMGM1MzAyNiwgMHgwMDA5MTM4MiwgMHgzMDQyMDNmYywgMHgwMTAyMTAyMSwgMHg4YzQ1MTQwMCwKKwkweDMxMjIwMGZmLCAweDAwMDIxMDgwLCAweDAxMDIxMDIxLCAweDAwYzQzMDI2LCAweDAwYzMzMDI2LCAweDAwMDkxOTgyLAorCTB4MzA2MzAzZmMsIDB4MDEwMzE4MjEsIDB4OGM2NDE4MDAsIDB4OGM0MzFjMDAsIDB4MDBjNTMwMjYsIDB4MDBjNDMwMjYsCisJMHgxMTQwMDAxNSwgMHgwMGMzMzAyNiwgMHgwMDBhMTYwMiwgMHgwMDAyMTA4MCwgMHgwMTAyMTAyMSwgMHg4YzQzMjAwMCwKKwkweDAwMGExMzgyLCAweDMwNDIwM2ZjLCAweDAxMDIxMDIxLCAweDhjNDUyNDAwLCAweDMxNDIwMGZmLCAweDAwMDIxMDgwLAorCTB4MDEwMjEwMjEsIDB4MDBjMzMwMjYsIDB4MDAwYTE5ODIsIDB4MzA2MzAzZmMsIDB4MDEwMzE4MjEsIDB4OGM2NDI4MDAsCisJMHg4YzQzMmMwMCwgMHgwMGM1MzAyNiwgMHgwMGM0MzAyNiwgMHgwMGMzMzAyNiwgMHg4ZjQzMDA3MCwgMHgzYzA1MDgwMCwKKwkweDhjYTQzMTAwLCAweDJjODIwMDIwLCAweDEwNDAwMDA4LCAweDAwNmI1ODIzLCAweDNjMDIwODAwLCAweDI0NDIzMTA0LAorCTB4MDAwNDE4ODAsIDB4MDA2MjE4MjEsIDB4MjQ4MjAwMDEsIDB4YWM2YjAwMDAsIDB4YWNhMjMxMDAsIDB4YWY4NjAwMDQsCisJMHgwM2UwMDAwOCwgMHgyNDAyMDAwMSwgMHgyN2JkZmZlOCwgMHhhZmJmMDAxMCwgMHg4ZjQ2MDEyOCwgMHg4Zjg0MDAxMCwKKwkweGFmNDYwMDIwLCAweDhmNDUwMTA0LCAweDhmNDIwMTAwLCAweDI0MDMwODAwLCAweGFmODUwMDA4LCAweGFmODIwMDE0LAorCTB4YWY0MzAxYjgsIDB4MTA4MDAwMGEsIDB4M2MwMjA4MDAsIDB4OGM0MzAwMzQsIDB4MTA2MDAwMDcsIDB4MzBhMjIwMDAsCisJMHgxMDQwMDAwNSwgMHgzNGEzMDEwMCwgMHg4ZjgyMDAwYywgMHhhZjgzMDAwOCwgMHgyNDQyMDAwMSwgMHhhZjgyMDAwYywKKwkweDNjMDIwODAwLCAweDhjNDMwMGMwLCAweDEwNjAwMDA2LCAweDNjMDMwODAwLCAweDhjNjIwMGM0LCAweDI0MDQwMDAxLAorCTB4MjQ0MjAwMDEsIDB4MGEwMDBmZDUsIDB4YWM2MjAwYzQsIDB4OGY4MjAwMDgsIDB4M2MwMzAwMTAsIDB4MDA0MzEwMjQsCisJMHgxNDQwMDAwOSwgMHgzYzAyMDAxZiwgMHgzYzAzMDgwMCwgMHg4YzYyMDAyMCwgMHgwMDAwMjAyMSwgMHgyNDQyMDAwMSwKKwkweDBlMDAwYzc4LCAweGFjNjIwMDIwLCAweDBhMDAwZmQ1LCAweDAwNDAyMDIxLCAweDM0NDJmZjAwLCAweDE0YzIwMDA5LAorCTB4MjQwM2JmZmYsIDB4M2MwMzA4MDAsIDB4OGM2MjAwMjAsIDB4MjQwNDAwMDEsIDB4MjQ0MjAwMDEsIDB4MGUwMDBjNzgsCisJMHhhYzYyMDAyMCwgMHgwYTAwMGZkNSwgMHgwMDQwMjAyMSwgMHg4ZjgyMDAxNCwgMHgwMDQzMTAyNCwgMHgxNDQwMDAwNiwKKwkweDAwMDAwMDAwLCAweGFmNDAwMDQ4LCAweDBlMDAxMWE5LCAweGFmNDAwMDQwLCAweDBhMDAwZmQ1LCAweDAwNDAyMDIxLAorCTB4MGUwMDE1NjMsIDB4MDAwMDAwMDAsIDB4MDA0MDIwMjEsIDB4MTA4MDAwMDUsIDB4M2MwMjQwMDAsIDB4OGY0MzAxMjQsCisJMHgzYzAyNjAyMCwgMHhhYzQzMDAxNCwgMHgzYzAyNDAwMCwgMHhhZjQyMDEzOCwgMHgwMDAwMDAwMCwgMHg4ZmJmMDAxMCwKKwkweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDI3YmRmZmUwLCAweGFmYmYwMDE4LCAweGFmYjEwMDE0LCAweGFmYjAwMDEwLAorCTB4OGY0MjAxNDAsIDB4YWY0MjAwMjAsIDB4OGY0MzAxNDgsIDB4M2MwMjcwMDAsIDB4MDA2MjE4MjQsIDB4M2MwMjMwMDAsCisJMHgxMDYyMDAyMSwgMHgwMDQzMTAyYiwgMHgxNDQwMDAwNiwgMHgzYzAyNDAwMCwgMHgzYzAyMjAwMCwgMHgxMDYyMDAwOSwKKwkweDNjMDI0MDAwLCAweDBhMDAxMDQwLCAweDAwMDAwMDAwLCAweDEwNjIwMDQ1LCAweDNjMDI1MDAwLCAweDEwNjIwMDQ3LAorCTB4M2MwMjQwMDAsIDB4MGEwMDEwNDAsIDB4MDAwMDAwMDAsIDB4Mjc0NDAxODAsIDB4M2MwMzgwMDAsIDB4OGY0MjAxYjgsCisJMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjQyMDE0OCwgMHgyNDAzMDAwMiwgMHhhMDgzMDAwYiwKKwkweDAwMDIxNDAyLCAweGE0ODIwMDA4LCAweDhmNDMwMTQ4LCAweGE0ODMwMDEwLCAweDhmNDIwMTQ0LCAweDNjMDMxMDAwLAorCTB4YWM4MjAwMjQsIDB4YWY0MzAxYjgsIDB4MGEwMDEwNDAsIDB4M2MwMjQwMDAsIDB4OGY0MjAxNDgsIDB4MjQwMzAwMDIsCisJMHgzMDQ0ZmZmZiwgMHgwMDAyMTQwMiwgMHgzMDUwMDBmZiwgMHgxMjAzMDAwYywgMHgyNzUxMDE4MCwgMHgyYTAyMDAwMywKKwkweDEwNDAwMDA1LCAweDI0MDIwMDAzLCAweDA2MDAwMDFkLCAweDM2MDUzMDAwLCAweDBhMDAxMDI3LCAweDNjMDM4MDAwLAorCTB4MTIwMjAwMDcsIDB4MDAwMDAwMDAsIDB4MGEwMDEwMzQsIDB4MDAwMDAwMDAsIDB4MGUwMDExMmMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMTAyNSwgMHgwMDQwMjAyMSwgMHgwZTAwMTEzZSwgMHgwMDAwMDAwMCwgMHgwMDQwMjAyMSwgMHgzNjA1MzAwMCwKKwkweDNjMDM4MDAwLCAweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDAyLCAweGE2MjUwMDA4LAorCTB4YTIyMjAwMGIsIDB4YTYyNDAwMTAsIDB4OGY0MjAxNDQsIDB4M2MwMzEwMDAsIDB4YWUyMjAwMjQsIDB4YWY0MzAxYjgsCisJMHgwYTAwMTA0MCwgMHgzYzAyNDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDJiZiwgMHgwYTAwMTA0MCwKKwkweDNjMDI0MDAwLCAweDBlMDAxNDQxLCAweDAwMDAwMDAwLCAweDBhMDAxMDQwLCAweDNjMDI0MDAwLCAweDBlMDAxNWVhLAorCTB4MDAwMDAwMDAsIDB4M2MwMjQwMDAsIDB4YWY0MjAxNzgsIDB4MDAwMDAwMDAsIDB4OGZiZjAwMTgsIDB4OGZiMTAwMTQsCisJMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyNDAyMDgwMCwgMHgwM2UwMDAwOCwgMHhhZjQyMDFiOCwKKwkweDI3YmRmZmU4LCAweDNjMDQ2MDBjLCAweGFmYmYwMDE0LCAweGFmYjAwMDEwLCAweDhjODI1MDAwLCAweDNjMWE4MDAwLAorCTB4MjQwM2ZmN2YsIDB4M2MxMDYwMDAsIDB4MDA0MzEwMjQsIDB4MzQ0MjM4MGMsIDB4MjQwMzAwMDMsIDB4YWM4MjUwMDAsCisJMHgzYzAyMDAwOCwgMHhhZjQzMDAwOCwgMHg4ZTA0MDgwOCwgMHgwMzQyZDgyNSwgMHg4ZTAyMDgwOCwgMHgzYzAzMDgwMCwKKwkweGFjNjAwMDIwLCAweDMwODRmZmYwLCAweDJjODQwMDAxLCAweDMwNDJmZmYwLCAweDM4NDIwMDEwLCAweDJjNDIwMDAxLAorCTB4YWY4NDAwMTAsIDB4YWY4MjAwMDAsIDB4MGUwMDE2MGMsIDB4MDAwMDAwMDAsIDB4MGUwMDE1NjEsIDB4MDAwMDAwMDAsCisJMHgzYzAyMDQwMCwgMHgzNDQyMDAwYywgMHgzYzAzZmZmZiwgMHgzNDYzMDgwNiwgMHhhZTAyMTk0OCwgMHhhZTAzMTk0YywKKwkweDhlMDIxOTgwLCAweDM0NDIwMjAwLCAweGFlMDIxOTgwLCAweDhmNTAwMDAwLCAweDMyMDIwMDAzLCAweDEwNDBmZmZkLAorCTB4MzIwMjAwMDEsIDB4MTA0MDAwMDQsIDB4MzIwMjAwMDIsIDB4MGUwMDBmOTIsIDB4MDAwMDAwMDAsIDB4MzIwMjAwMDIsCisJMHgxMDQwZmZmNiwgMHgwMDAwMDAwMCwgMHgwZTAwMGZlMCwgMHgwMDAwMDAwMCwgMHgwYTAwMTA3MSwgMHgwMDAwMDAwMCwKKwkweDI3YmRmZmU4LCAweDNjMDQ2MDBjLCAweGFmYmYwMDE0LCAweGFmYjAwMDEwLCAweDhjODI1MDAwLCAweDNjMWE4MDAwLAorCTB4MjQwM2ZmN2YsIDB4M2MxMDYwMDAsIDB4MDA0MzEwMjQsIDB4MzQ0MjM4MGMsIDB4MjQwMzAwMDMsIDB4YWM4MjUwMDAsCisJMHgzYzAyMDAwOCwgMHhhZjQzMDAwOCwgMHg4ZTA0MDgwOCwgMHgwMzQyZDgyNSwgMHg4ZTAyMDgwOCwgMHgzYzAzMDgwMCwKKwkweGFjNjAwMDIwLCAweDMwODRmZmYwLCAweDJjODQwMDAxLCAweDMwNDJmZmYwLCAweDM4NDIwMDEwLCAweDJjNDIwMDAxLAorCTB4YWY4NDAwMTAsIDB4YWY4MjAwMDAsIDB4MGUwMDE2MGMsIDB4MDAwMDAwMDAsIDB4MGUwMDE1NjEsIDB4MDAwMDAwMDAsCisJMHgzYzAyMDQwMCwgMHgzNDQyMDAwYywgMHgzYzAzZmZmZiwgMHgzNDYzMDgwNiwgMHhhZTAyMTk0OCwgMHhhZTAzMTk0YywKKwkweDhlMDIxOTgwLCAweDhmYmYwMDE0LCAweDM0NDIwMjAwLCAweGFlMDIxOTgwLCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMTgsIDB4MDA4MDQ4MjEsIDB4MzBhNWZmZmYsIDB4MzBjNmZmZmYsIDB4MzBlN2ZmZmYsIDB4M2MwMzgwMDAsCisJMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMywgMHhhMzQyMDE4YiwgMHg5NzgzMDAwYSwKKwkweDhmODQwMDA0LCAweDhmODgwMDE0LCAweGFmNDkwMTgwLCAweGE3NDUwMThjLCAweGE3NDYwMThlLCAweGE3NDcwMTg4LAorCTB4MzEwMjgwMDAsIDB4YTc0MzAxOTAsIDB4MTA0MDAwMGMsIDB4YWY0NDAxYTgsIDB4OTM0MjAxMTYsIDB4MzA0MjAwZmMsCisJMHgwMDVhMTAyMSwgMHgyNDQyNDAwNCwgMHg4YzQzMDAwMCwgMHgzMDYzZmZmZiwgMHgxNDYwMDAwNCwgMHgzYzAyZmZmZiwKKwkweDM0NDI3ZmZmLCAweDAxMDIxMDI0LCAweGFmODIwMDE0LCAweDk3ODIwMDE2LCAweDk3NDMwMTBjLCAweDhmNDQwMTA0LAorCTB4MzA0MmJmZmYsIDB4MDAwMzFjMDAsIDB4MzA4NGZmZmYsIDB4MDA2NDE4MjUsIDB4YTc0MjAxYTYsIDB4YWY0MzAxYWMsCisJMHgzYzAyMTAwMCwgMHhhZjQyMDFiOCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgyNzQ0MDE4MCwgMHgzYzAzODAwMCwKKwkweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIyMDAwLCAweDI0MDMwMDAyLCAweGE0ODIwMDA4LAorCTB4YTA4MzAwMGIsIDB4YTQ4MDAwMTAsIDB4M2MwMjEwMDAsIDB4YWY0MjAxYjgsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsCisJMHgyNzQ0MDE4MCwgMHgzYzAzODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwKKwkweDhmNDIwMTQ4LCAweDI0MDMwMDAyLCAweGEwODMwMDBiLCAweDAwMDIxNDAyLCAweGE0ODIwMDA4LCAweDhmNDMwMTQ4LAorCTB4YTQ4MzAwMTAsIDB4OGY0MjAxNDQsIDB4M2MwMzEwMDAsIDB4YWM4MjAwMjQsIDB4MDNlMDAwMDgsIDB4YWY0MzAxYjgsCisJMHgyN2JkZmZlMCwgMHhhZmJmMDAxOCwgMHhhZmIxMDAxNCwgMHhhZmIwMDAxMCwgMHg4ZjQyMDE0OCwgMHgyNDAzMDAwMiwKKwkweDMwNDRmZmZmLCAweDAwMDIxNDAyLCAweDMwNTAwMGZmLCAweDEyMDMwMDBjLCAweDI3NTEwMTgwLCAweDJhMDIwMDAzLAorCTB4MTA0MDAwMDUsIDB4MjQwMjAwMDMsIDB4MDYwMDAwMWQsIDB4MzYwNTMwMDAsIDB4MGEwMDExMTcsIDB4M2MwMzgwMDAsCisJMHgxMjAyMDAwNywgMHgwMDAwMDAwMCwgMHgwYTAwMTEyNCwgMHgwMDAwMDAwMCwgMHgwZTAwMTEyYywgMHgwMDAwMDAwMCwKKwkweDBhMDAxMTE1LCAweDAwNDAyMDIxLCAweDBlMDAxMTNlLCAweDAwMDAwMDAwLCAweDAwNDAyMDIxLCAweDM2MDUzMDAwLAorCTB4M2MwMzgwMDAsIDB4OGY0MjAxYjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MjQwMjAwMDIsIDB4YTYyNTAwMDgsCisJMHhhMjIyMDAwYiwgMHhhNjI0MDAxMCwgMHg4ZjQyMDE0NCwgMHgzYzAzMTAwMCwgMHhhZTIyMDAyNCwgMHhhZjQzMDFiOCwKKwkweDBhMDAxMTI4LCAweDhmYmYwMDE4LCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDI0MDAwMmJmLCAweDhmYmYwMDE4LAorCTB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MzA4NGZmZmYsIDB4MmM4MjEzODksCisJMHgxMDQwMDAwZCwgMHgwMDAwMTAyMSwgMHgzYzAzMDgwMCwgMHgyNDYzNTkwMCwgMHgwMDA0Mjk0MiwgMHgwMDA1Mjg4MCwKKwkweDAwYTMyODIxLCAweDMwODYwMDFmLCAweDhjYTQwMDAwLCAweDI0MDMwMDAxLCAweDAwYzMxODA0LCAweDAwODMyMDI1LAorCTB4MDNlMDAwMDgsIDB4YWNhNDAwMDAsIDB4MDNlMDAwMDgsIDB4MjQwMjAwOTEsIDB4MzA4NGZmZmYsIDB4MmM4MjEzODksCisJMHgxMDQwMDAwZSwgMHgwMDAwMTAyMSwgMHgzYzAzMDgwMCwgMHgyNDYzNTkwMCwgMHgwMDA0Mjk0MiwgMHgwMDA1Mjg4MCwKKwkweDAwYTMyODIxLCAweDMwODYwMDFmLCAweDI0MDMwMDAxLCAweDhjYTQwMDAwLCAweDAwYzMxODA0LCAweDAwMDMxODI3LAorCTB4MDA4MzIwMjQsIDB4MDNlMDAwMDgsIDB4YWNhNDAwMDAsIDB4MDNlMDAwMDgsIDB4MjQwMjAwOTEsIDB4OTQ4MjAwMGMsCisJMHgyNDg3MDAxNCwgMHgwMDAyMTMwMiwgMHgwMDAyMTA4MCwgMHgwMDgyNDAyMSwgMHgwMGU4MTgyYiwgMHgxMDYwMDA0ZiwKKwkweDAwMDAwMDAwLCAweDkwZTMwMDAwLCAweDJjNjIwMDA5LCAweDEwNDAwMDQ3LCAweDNjMDIwODAwLCAweDI0NDI1ODkwLAorCTB4MDAwMzE4ODAsIDB4MDA2MjE4MjEsIDB4OGM2NDAwMDAsIDB4MDA4MDAwMDgsIDB4MDAwMDAwMDAsIDB4MGEwMDExYTQsCisJMHgyNGU3MDAwMSwgMHg5MGUzMDAwMSwgMHgyNDAyMDAwYSwgMHg1NDYyMDAyNCwgMHgwMTAwMzgyMSwgMHgwMTA3MTAyMywKKwkweDJjNDIwMDBhLCAweDU0NDAwMDIwLCAweDAxMDAzODIxLCAweDNjMDUwODAwLCAweDhjYTI2Yzk4LCAweDI0ZTcwMDAyLAorCTB4MzQ0MjAxMDAsIDB4YWNhMjZjOTgsIDB4OTBlMzAwMDAsIDB4OTBlMjAwMDEsIDB4OTBlNDAwMDIsIDB4OTBlNjAwMDMsCisJMHgyNGU3MDAwNCwgMHgyNGE1NmM5OCwgMHgwMDAzMWUwMCwgMHgwMDAyMTQwMCwgMHgwMDYyMTgyNSwgMHgwMDA0MjIwMCwKKwkweDAwNjQxODI1LCAweDAwNjYxODI1LCAweGFjYTMwMDA0LCAweDkwZTIwMDAwLCAweDkwZTMwMDAxLCAweDkwZTQwMDAyLAorCTB4OTBlNjAwMDMsIDB4MjRlNzAwMDQsIDB4MDAwMjE2MDAsIDB4MDAwMzFjMDAsIDB4MDA0MzEwMjUsIDB4MDAwNDIyMDAsCisJMHgwMDQ0MTAyNSwgMHgwMDQ2MTAyNSwgMHgwYTAwMTFhNCwgMHhhY2EyMDAwOCwgMHg5MGUzMDAwMSwgMHgyNDAyMDAwNCwKKwkweDEwNjIwMDBlLCAweDAwNjAxMDIxLCAweDBhMDAxMTllLCAweDAxMDAxMDIxLCAweDkwZTMwMDAxLCAweDI0MDIwMDAzLAorCTB4MTA2MjAwMDgsIDB4MDA2MDEwMjEsIDB4MGEwMDExOWUsIDB4MDEwMDEwMjEsIDB4OTBlMzAwMDEsIDB4MjQwMjAwMDIsCisJMHgxNDYyMDAwMywgMHgwMTAwMTAyMSwgMHgwMDYwMTAyMSwgMHgwMGUyMTAyMSwgMHgwYTAwMTFhNCwgMHgwMDQwMzgyMSwKKwkweDkwZTIwMDAxLCAweDBhMDAxMWE0LCAweDAwZTIzODIxLCAweDAxMDAzODIxLCAweDAwZTgxMDJiLCAweDU0NDBmZmI0LAorCTB4OTBlMzAwMDAsIDB4MDNlMDAwMDgsIDB4MjQwMjAwMDEsIDB4MjdiZGZmOTAsIDB4M2MwMzA4MDAsIDB4YWZiZjAwNmMsCisJMHhhZmJlMDA2OCwgMHhhZmI3MDA2NCwgMHhhZmI2MDA2MCwgMHhhZmI1MDA1YywgMHhhZmI0MDA1OCwgMHhhZmIzMDA1NCwKKwkweGFmYjIwMDUwLCAweGFmYjEwMDRjLCAweGFmYjAwMDQ4LCAweGFjNjA2Yzk4LCAweDkzNjIwMDIzLCAweDMwNDIwMDEwLAorCTB4MTQ0MDAyN2MsIDB4MjQwMjAwMDEsIDB4OTM0MjAxMTYsIDB4OTM2MzAwMDUsIDB4MzQ0MjQwMDAsIDB4MzA2MzAwMDEsCisJMHgxNDYwMDAwNSwgMHgwMzQyYjAyMSwgMHgwZTAwMTVlMCwgMHgwMDAwMDAwMCwgMHgwYTAwMTQzNiwgMHg4ZmJmMDA2YywKKwkweDkzNDIwMTEyLCAweDhmNDMwMTA0LCAweDNjMDQwMDIwLCAweDM0NDI0MDAwLCAweDAwNjQxODI0LCAweDEwNjAwMDEyLAorCTB4MDM0MjI4MjEsIDB4Mjc0NTAxODAsIDB4M2MwMzgwMDAsIDB4OGY0MjAxYjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgwMDAwMDAwMCwgMHg4ZjQyMDEyOCwgMHhhY2EyMDAwMCwgMHg4ZjY0MDA0MCwgMHgyNDAzMDAwOCwgMHgyNDAyNDBjMSwKKwkweGE0YTIwMDA4LCAweDI0MDIwMDAyLCAweGEwYTIwMDBiLCAweDNjMDIxMDAwLCAweDBhMDAxMWYxLCAweGEwYTMwMDBhLAorCTB4OGY0MjAxMDQsIDB4M2MwMzAwNDAsIDB4MDA0MzEwMjQsIDB4MTA0MDAwMWQsIDB4M2MwMzgwMDAsIDB4Mjc0NTAxODAsCisJMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjQyMDEyOCwgMHhhY2EyMDAwMCwKKwkweDhmNjQwMDQwLCAweDI0MDMwMDEwLCAweDI0MDI0MGMxLCAweGE0YTIwMDA4LCAweDI0MDIwMDAyLCAweGEwYTMwMDBhLAorCTB4MjQwMzAwMDgsIDB4YTBhMjAwMGIsIDB4M2MwMjEwMDAsIDB4YTRhMzAwMTAsIDB4YTBhMDAwMTIsIDB4YTBhMDAwMTMsCisJMHhhY2EwMDAxNCwgMHhhY2EwMDAyNCwgMHhhY2EwMDAyOCwgMHhhY2EwMDAyYywgMHhhY2E0MDAxOCwgMHgwZTAwMTVlMCwKKwkweGFmNDIwMWI4LCAweDBhMDAxNDM2LCAweDhmYmYwMDZjLCAweDhmODIwMDAwLCAweDEwNDAwMDE2LCAweDAwMDAwMDAwLAorCTB4OGY0MjAxMDQsIDB4M2MwMzAwMDEsIDB4MDA0MzEwMjQsIDB4MTA0MDAwMTEsIDB4MDAwMDAwMDAsIDB4OGNhMzAwMGMsCisJMHg4ZjYyMDAzMCwgMHgxNDYyMDIyZCwgMHgyNDAyMDAwMSwgMHg4Y2EzMDAxMCwgMHg4ZjYyMDAyYywgMHgxNDYyMDIyOSwKKwkweDI0MDIwMDAxLCAweDk3NjMwMDNhLCAweDk2YzIwMDAwLCAweDE0NDMwMjI1LCAweDI0MDIwMDAxLCAweDk3NjMwMDM4LAorCTB4OTZjMjAwMDIsIDB4MTQ0MzAyMjEsIDB4MjQwMjAwMDEsIDB4YWY0MDAwNDgsIDB4YWY0MDAwNTQsIDB4YWY0MDAwNDAsCisJMHg4Zjc0MDA0MCwgMHg4ZjY1MDA0OCwgMHgwMGI0MzAyMywgMHgwNGMxMDAwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwKKwkweDAwMDAwMDAwLCAweDI0MDAwMWFmLCAweDk3NDIwMTFhLCAweDMwNTJmZmZmLCAweDEyNDAwMDA0LCAweDhlZDMwMDA0LAorCTB4MDI3MjEwMjEsIDB4MGEwMDEyMjgsIDB4MjQ1MWZmZmYsIDB4MDI2MDg4MjEsIDB4OTJkNzAwMGQsIDB4YTdhMDAwMjAsCisJMHhhM2EwMDAxYSwgMHhhZmEwMDAyOCwgMHg5MzYyMDAzZiwgMHgzMmUzMDAwNCwgMHgxMDYwMDAzYSwgMHgzMDUwMDBmZiwKKwkweDI0MDQwMDEyLCAweDE2MDQwMDA2LCAweDI0MDIwMDAxLCAweDNjMDQwODAwLCAweDhjODMwMDI4LCAweDI0NjMwMDAxLAorCTB4MGEwMDEzMjgsIDB4YWM4MzAwMjgsIDB4OGY2MjAwNDQsIDB4MTY2MjAwMTAsIDB4MjdhNjAwMTAsIDB4Mjc0NTAxODAsCisJMHgzYzAzODAwMCwgMHgyNDAyMDAxYSwgMHhhN2EyMDAyMCwgMHgyNDAyMDAyMCwgMHhhZmI0MDAyOCwgMHhhM2IwMDAyMiwKKwkweGEzYTQwMDIzLCAweGEzYTIwMDFhLCAweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLAorCTB4MGEwMDEzMGQsIDB4MDAwMDAwMDAsIDB4OGY2MjAwNDQsIDB4MDI2MjEwMjMsIDB4MDQ0MDAwMWEsIDB4MDI2NTEwMjMsCisJMHgwNDQxMDBkOSwgMHgyNDAyMDAwMSwgMHgzYzAyMDgwMCwgMHg4YzQzMDBkOCwgMHgxMDYwMDAwNCwgMHgyNDAyMDAwMSwKKwkweGE3YTIwMDIwLCAweDBhMDAxMjVlLCAweGFmYjQwMDI4LCAweDI0MDIwMDFhLCAweGE3YTIwMDIwLCAweDI0MDIwMDIwLAorCTB4YWZiNDAwMjgsIDB4YTNiMDAwMjIsIDB4YTNhNDAwMjMsIDB4YTNhMjAwMWEsIDB4MjdhNjAwMTAsIDB4Mjc0NTAxODAsCisJMHgzYzAzODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHgwYTAwMTMwZCwKKwkweDAwMDAwMDAwLCAweDBhMDAxMzI4LCAweDI0MDIwMDAxLCAweDAyOTNmMDIzLCAweDFiYzAwMDE2LCAweDAyNWUxMDJhLAorCTB4NTQ0MDAwMDcsIDB4MzJmNzAwZmUsIDB4NTdkMjAwMGYsIDB4MDI3ZTk4MjEsIDB4MzJlMjAwMDEsIDB4NTQ0MDAwMGMsCisJMHgwMjdlOTgyMSwgMHgzMmY3MDBmZSwgMHgwMjQwZjAyMSwgMHgzYzA0MDgwMCwgMHg4YzgzMDBjOCwgMHgwMDAwOTAyMSwKKwkweDI0MDIwMDAxLCAweGE3YTIwMDIwLCAweGFmYjQwMDI4LCAweDI0NjMwMDAxLCAweDBhMDAxMjgyLCAweGFjODMwMGM4LAorCTB4MDI1ZTEwMjMsIDB4MGEwMDEyODIsIDB4MzA1MmZmZmYsIDB4MDAwMGYwMjEsIDB4MjRhMmZmZmYsIDB4MDIyMjE4MjMsCisJMHgxODYwMDAxZiwgMHgwMDcyMTAyYSwgMHg1NDQwMDAxOSwgMHgwMGEwODgyMSwgMHg5N2EyMDAyMCwgMHgzYzA0MDgwMCwKKwkweDhjODMwMGNjLCAweGFmYjQwMDI4LCAweDM0NDIwMDAxLCAweDI0NjMwMDAxLCAweGE3YTIwMDIwLCAweDAyNzQxMDI2LAorCTB4MmM0MjAwMDEsIDB4YWM4MzAwY2MsIDB4MmNjMzAwMDEsIDB4MDA0MzEwMjQsIDB4MTQ0MDAwMGEsIDB4MDI0MDE4MjEsCisJMHgyN2E2MDAxMCwgMHgyNzQ1MDE4MCwgMHgzYzAzODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwKKwkweDAwMDAwMDAwLCAweDBhMDAxMzBkLCAweDAwMDAwMDAwLCAweDAwYTA4ODIxLCAweDAyNDMxMDIzLCAweDMwNTJmZmZmLAorCTB4MGEwMDEyYWUsIDB4MzJmNzAwZjYsIDB4MDI3NDEwMjMsIDB4MTg0MDAwMDgsIDB4OTdhMjAwMjAsIDB4M2MwNDA4MDAsCisJMHg4YzgzMDBkNCwgMHhhZmIzMDAyOCwgMHgzNDQyMDQwMCwgMHgyNDYzMDAwMSwgMHhhN2EyMDAyMCwgMHhhYzgzMDBkNCwKKwkweDMyZTIwMDAyLCAweDEwNDAwMDFjLCAweDMyZTIwMDEwLCAweDhmNjIwMDQ0LCAweDE2NjIwMDBkLCAweDI3YTYwMDEwLAorCTB4OTdhMjAwMjAsIDB4Mjc0NTAxODAsIDB4M2MwMzgwMDAsIDB4YWZiNDAwMjgsIDB4MzQ0MjAwMDEsIDB4YTdhMjAwMjAsCisJMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHgwYTAwMTMwZCwgMHgwMDAwMDAwMCwKKwkweDk3YTIwMDIwLCAweDI3NDUwMTgwLCAweDNjMDM4MDAwLCAweGFmYjQwMDI4LCAweDM0NDIwMDAxLCAweGE3YTIwMDIwLAorCTB4OGY0MjAxYjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4MGEwMDEzMGQsIDB4MDAwMDAwMDAsCisJMHg1NDQwMDAwMywgMHg4ZWQ1MDAwOCwgMHgwYTAwMTMyOCwgMHgyNDAyMDAwMSwgMHg4ZjYzMDA1NCwgMHgyNmEyZmZmZiwKKwkweDAwNDMxMDIzLCAweDE4NDAwMDExLCAweDI3YTYwMDEwLCAweDk3YTIwMDIwLCAweDNjMDQwODAwLCAweDhjODMwMGQwLAorCTB4Mjc0NTAxODAsIDB4M2MwNzgwMDAsIDB4YWZiNDAwMjgsIDB4MzQ0MjAwMDEsIDB4MjQ2MzAwMDEsIDB4YTdhMjAwMjAsCisJMHhhYzgzMDBkMCwgMHg4ZjQyMDFiOCwgMHgwMDQ3MTAyNCwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHgwYTAwMTMwZCwKKwkweDAwMDAwMDAwLCAweDMyZTIwMDIwLCAweDEwNDAwMDExLCAweDAwMDAwMDAwLCAweDk2YzIwMDEyLCAweDAwNTIxMDJiLAorCTB4MTA0MDAwMDgsIDB4OTdhMjAwMjAsIDB4OTZkMjAwMTIsIDB4MTI0MDAwMDMsIDB4MDI3MjEwMjEsIDB4MGEwMDEyZjIsCisJMHgyNDUxZmZmZiwgMHgwMjYwODgyMSwgMHg5N2EyMDAyMCwgMHg5M2EzMDAxYSwgMHgzNDQyMDAwOCwgMHgzNDYzMDAwNCwKKwkweGE3YTIwMDIwLCAweGEzYTMwMDFhLCAweDhmNDIwMTA0LCAweDNjMDMwMDgwLCAweDAwNDMxMDI0LCAweDEwNDAwMDM3LAorCTB4M2EwMzAwMGEsIDB4MGUwMDExNTEsIDB4MDJjMDIwMjEsIDB4MjQwMzAwMDIsIDB4MTQ0MzAwMmIsIDB4M2MwMzA4MDAsCisJMHgyN2E2MDAxMCwgMHg5N2EyMDAyMCwgMHgyNzQ1MDE4MCwgMHgzYzAzODAwMCwgMHhhZmI0MDAyOCwgMHgzNDQyMDAwMSwKKwkweGE3YTIwMDIwLCAweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDhmNDIwMTI4LAorCTB4YWNhMjAwMDAsIDB4OGNjMzAwMTgsIDB4MjQwMjQwYzEsIDB4YTRhMjAwMDgsIDB4YWNhMzAwMTgsIDB4OTBjNDAwMGEsCisJMHgyNDAyMDAwMiwgMHhhMGEyMDAwYiwgMHhhMGE0MDAwYSwgMHg5NGMyMDAxMCwgMHhhNGEyMDAxMCwgMHg5MGMzMDAxMiwKKwkweGEwYTMwMDEyLCAweDkwYzIwMDEzLCAweGEwYTIwMDEzLCAweDhjYzMwMDE0LCAweGFjYTMwMDE0LCAweDhjYzIwMDI0LAorCTB4YWNhMjAwMjQsIDB4OGNjMzAwMjgsIDB4YWNhMzAwMjgsIDB4OGNjNDAwMmMsIDB4MjQwMjAwMDEsIDB4M2MwMzEwMDAsCisJMHhhY2E0MDAyYywgMHhhZjQzMDFiOCwgMHhhZjQwMDA0NCwgMHhhZjQwMDA1MCwgMHgwYTAwMTQzNiwgMHg4ZmJmMDA2YywKKwkweDhjNjI2Yzk4LCAweDMwNDIwMTAwLCAweDEwNDAwMDAzLCAweDI0NjM2Yzk4LCAweDhjNjIwMDA0LCAweGFmNjIwMTdjLAorCTB4M2EwMzAwMGEsIDB4MmM2MzAwMDEsIDB4M2EwMjAwMGMsIDB4MmM0MjAwMDEsIDB4MDA2MjE4MjUsIDB4MTQ2MDAwMDMsCisJMHgyNDAyMDAwZSwgMHg1NjAyMDAzMCwgMHgwMDAwOTAyMSwgMHg1MjQwMDAwOCwgMHg5NmM0MDAwZSwgMHgxMjQwMDAwNCwKKwkweGE3YjIwMDQwLCAweDAyNzIxMDIxLCAweDBhMDAxMzQzLCAweDI0NTFmZmZmLCAweDAyNjA4ODIxLCAweDk2YzQwMDBlLAorCTB4OTM2MzAwMzUsIDB4OGY2MjAwNGMsIDB4MDA2NDIwMDQsIDB4MDA5NTIwMjEsIDB4MDA4MjEwMjMsIDB4MTg0MDAwMTUsCisJMHgwMDAwMDAwMCwgMHg4ZjYyMDAxOCwgMHgwMjYyMTAyMywgMHgxYzQwMDAxNSwgMHg5N2EyMDAyMCwgMHg4ZjYyMDAxOCwKKwkweDE2NjIwMDFjLCAweDAwMDAwMDAwLCAweDhmNjIwMDFjLCAweDAyYTIxMDIzLCAweDFjNDAwMDBlLCAweDk3YTIwMDIwLAorCTB4OGY2MjAwMWMsIDB4MTZhMjAwMTUsIDB4MDAwMDAwMDAsIDB4OGY2MjAwNTgsIDB4MDA4MjEwMjMsIDB4MTg0MDAwMTEsCisJMHg5N2EyMDAyMCwgMHgwYTAwMTM2NCwgMHhhZmIxMDAyOCwgMHg4ZjYyMDA1OCwgMHgwMDgyMTAyMywgMHgwNDQxMDAwYiwKKwkweDk3YTIwMDIwLCAweGFmYjEwMDI4LCAweGFmYjMwMDM0LCAweGFmYjUwMDM4LCAweGFmYTQwMDNjLCAweDM0NDIwMDIwLAorCTB4MGEwMDEzNmQsIDB4YTdhMjAwMjAsIDB4MDI4MDk4MjEsIDB4MDI2MDg4MjEsIDB4OGY2NDAwNTgsIDB4OGY2MjAwNGMsCisJMHgwMmEyMTAyMywgMHgxODQwMDAwOSwgMHgwMDAwMDAwMCwgMHg4ZjYyMDA1NCwgMHgwMmEyMTAyMywgMHgxYzQwMDAwNSwKKwkweDk3YTIwMDIwLCAweGFmYjEwMDI4LCAweGFmYjUwMDI0LCAweDBhMDAxMzg1LCAweDM0NDIwMDQwLCAweDk3NDIwMTFhLAorCTB4MTQ0MDAwMGMsIDB4MjQwMjAwMTQsIDB4OGY2MjAwNTgsIDB4MTQ4MjAwMDksIDB4MjQwMjAwMTQsIDB4OGY2MzAwNGMsCisJMHg4ZjYyMDA1NCwgMHgxMDYyMDAwNCwgMHg5N2EyMDAyMCwgMHhhZmIxMDAyOCwgMHgzNDQyMDA4MCwgMHhhN2EyMDAyMCwKKwkweDI0MDIwMDE0LCAweDEyMDIwMDBhLCAweDJhMDIwMDE1LCAweDEwNDAwMDA1LCAweDI0MDIwMDBjLCAweDEyMDIwMDA2LAorCTB4MzJlMjAwMDEsIDB4MGEwMDEzYzYsIDB4MDAwMDAwMDAsIDB4MjQwMjAwMTYsIDB4MTYwMjAwMzUsIDB4MzJlMjAwMDEsCisJMHg4ZjYyMDA4NCwgMHgyNDQyMDAwMSwgMHgxNmEyMDAzMSwgMHgzMmUyMDAwMSwgMHgyNDAyMDAxNCwgMHgxMjAyMDAyMSwKKwkweDJhMDIwMDE1LCAweDEwNDAwMDA1LCAweDI0MDIwMDBjLCAweDEyMDIwMDA4LCAweDMyZTIwMDAxLCAweDBhMDAxM2M2LAorCTB4MDAwMDAwMDAsIDB4MjQwMjAwMTYsIDB4MTIwMjAwMGMsIDB4MzJlMjAwMDEsIDB4MGEwMDEzYzYsIDB4MDAwMDAwMDAsCisJMHg5N2EzMDAyMCwgMHgyNDAyMDAwZSwgMHhhZmIxMDAyOCwgMHhhM2IwMDAyMiwgMHhhM2EyMDAyMywgMHhhZmI1MDAyNCwKKwkweDM0NjMwMDU0LCAweDBhMDAxM2M1LCAweGE3YTMwMDIwLCAweDk3YTIwMDIwLCAweDkzYTQwMDFhLCAweDI0MDMwMDEwLAorCTB4YWZiMTAwMjgsIDB4YTNiMDAwMjIsIDB4YTNhMzAwMjMsIDB4YWZiNTAwMjQsIDB4MzQ0MjAwNWQsIDB4MzQ4NDAwMDIsCisJMHhhN2EyMDAyMCwgMHgwYTAwMTNjNSwgMHhhM2E0MDAxYSwgMHg5N2EyMDAyMCwgMHgyNDAzMDAxMiwgMHhhM2EzMDAyMywKKwkweDkzYTMwMDFhLCAweGFmYjEwMDI4LCAweGEzYjAwMDIyLCAweGFmYjUwMDI0LCAweDMwNDJmZmZlLCAweDM0NDIwMDVjLAorCTB4MzQ2MzAwMDIsIDB4YTdhMjAwMjAsIDB4YTNhMzAwMWEsIDB4MzJlMjAwMDEsIDB4MTA0MDAwMzAsIDB4MjQwMjAwMGMsCisJMHgxMjAyMDAxMywgMHgyYTAyMDAwZCwgMHgxMDQwMDAwNSwgMHgyNDAyMDAwYSwgMHgxMjAyMDAwOCwgMHg5N2EyMDAyMCwKKwkweDBhMDAxM2Y4LCAweDMyZTIwMDA5LCAweDI0MDIwMDBlLCAweDEyMDIwMDFiLCAweDMyZTIwMDA5LCAweDBhMDAxM2Y5LAorCTB4MDAwMjEwMmIsIDB4OTNhNDAwMWEsIDB4MjQwMzAwMDgsIDB4YWZiMTAwMjgsIDB4YTNiMDAwMjIsIDB4YTNhMzAwMjMsCisJMHgwYTAwMTNmNCwgMHgzNDQyMDAxMywgMHg5N2EzMDAyMCwgMHgzMDYyMDAwNCwgMHgxNDQwMDAwNSwgMHg5M2EyMDAxYSwKKwkweDM0NjMwMDFiLCAweGE3YTMwMDIwLCAweDBhMDAxM2U3LCAweDI0MDMwMDE2LCAweDM0NjMwMDFiLCAweGE3YTMwMDIwLAorCTB4MjQwMzAwMTAsIDB4YWZiMTAwMjgsIDB4YTNiMDAwMjIsIDB4YTNhMzAwMjMsIDB4MzQ0MjAwMDIsIDB4MGEwMDEzZjcsCisJMHhhM2EyMDAxYSwgMHg5N2EyMDAyMCwgMHg5M2E0MDAxYSwgMHgyNDAzMDAxMCwgMHhhZmIxMDAyOCwgMHhhM2IwMDAyMiwKKwkweGEzYTMwMDIzLCAweDM0NDIwMDFiLCAweDM0ODQwMDAyLCAweGE3YTIwMDIwLCAweGEzYTQwMDFhLCAweDMyZTIwMDA5LAorCTB4MDAwMjEwMmIsIDB4MDAwMjEwMjMsIDB4MzA0MjAwMDcsIDB4MTI0MDAwMTUsIDB4MzQ0NTAwMDMsIDB4OGY4MjAwMTgsCisJMHgyNDAzMDgwMCwgMHgyNzQ0MDE4MCwgMHgyNDQyMDAwMSwgMHhhZjgyMDAxOCwgMHgyNDAyMDAwNCwgMHhhZjQzMDFiOCwKKwkweGE0ODUwMDA4LCAweGEwODIwMDBiLCAweDkzNDMwMTIwLCAweDAwMDAzMDIxLCAweDNjMDIxMDAwLCAweGE0OTIwMDBlLAorCTB4YWM5NTAwMjQsIDB4YWM5MzAwMjgsIDB4MDA3ZTE4MjEsIDB4YTQ4MzAwMGMsIDB4YWY0MjAxYjgsIDB4MGEwMDE0MTMsCisJMHg5N2EyMDAyMCwgMHgyNDA2MDAwMSwgMHg5N2EyMDAyMCwgMHgxMDQwMDAyMCwgMHgyNzQ1MDE4MCwgMHgzYzAzODAwMCwKKwkweDhmNDIwMWI4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDhmNDIwMTI4LCAweGFjYTIwMDAwLAorCTB4OGZhMzAwMjgsIDB4MjQwMjQwYzEsIDB4YTRhMjAwMDgsIDB4YWNhMzAwMTgsIDB4OTNhNDAwMWEsIDB4MjQwMjAwMDIsCisJMHhhMGEyMDAwYiwgMHhhMGE0MDAwYSwgMHg5N2EyMDAyMCwgMHhhNGEyMDAxMCwgMHg5M2EzMDAyMiwgMHhhMGEzMDAxMiwKKwkweDkzYTIwMDIzLCAweGEwYTIwMDEzLCAweDhmYTMwMDI0LCAweGFjYTMwMDE0LCAweDhmYTIwMDM0LCAweGFjYTIwMDI0LAorCTB4OGZhMzAwMzgsIDB4YWNhMzAwMjgsIDB4OGZhMjAwM2MsIDB4M2MwMzEwMDAsIDB4YWNhMjAwMmMsIDB4YWY0MzAxYjgsCisJMHgwMGMwMTAyMSwgMHg4ZmJmMDA2YywgMHg4ZmJlMDA2OCwgMHg4ZmI3MDA2NCwgMHg4ZmI2MDA2MCwgMHg4ZmI1MDA1YywKKwkweDhmYjQwMDU4LCAweDhmYjMwMDU0LCAweDhmYjIwMDUwLCAweDhmYjEwMDRjLCAweDhmYjAwMDQ4LCAweDAzZTAwMDA4LAorCTB4MjdiZDAwNzAsIDB4OGY0NzAxNDAsIDB4OGY0NjAxNDgsIDB4M2MwMjgwMDAsIDB4MDBjMjQwMjQsIDB4MDAwNjJjMDIsCisJMHgzMGEzMDBmZiwgMHgyNDAyMDAxOSwgMHgxMDYyMDBlNywgMHgyNzQ0MDE4MCwgMHgyODYyMDAxYSwgMHgxMDQwMDAxZiwKKwkweDI0MDIwMDA4LCAweDEwNjIwMGJlLCAweDI4NjIwMDA5LCAweDEwNDAwMDBkLCAweDI0MDIwMDAxLCAweDEwNjIwMDQ2LAorCTB4Mjg2MjAwMDIsIDB4NTA0MDAwMDUsIDB4MjQwMjAwMDYsIDB4MTA2MDAwMmUsIDB4MDBhMDE4MjEsIDB4MGEwMDE1NWUsCisJMHgwMDAwMDAwMCwgMHgxMDYyMDA1YiwgMHgwMGEwMTgyMSwgMHgwYTAwMTU1ZSwgMHgwMDAwMDAwMCwgMHgyNDAyMDAwYiwKKwkweDEwNjIwMDg0LCAweDI4NjIwMDBjLCAweDEwNDAwMDA1LCAweDI0MDIwMDA5LCAweDEwNjIwMGJjLCAweDAwMDYxYzAyLAorCTB4MGEwMDE1NWUsIDB4MDAwMDAwMDAsIDB4MjQwMjAwMGUsIDB4MTA2MjAwYjcsIDB4MDAwNjFjMDIsIDB4MGEwMDE1NWUsCisJMHgwMDAwMDAwMCwgMHgyODYyMDAyMSwgMHgxMDQwMDAwOSwgMHgyODYyMDAxZiwgMHgxMDQwMDBjMSwgMHgyNDAyMDAxYiwKKwkweDEwNjIwMGJmLCAweDI0MDIwMDFjLCAweDEwNjIwMDlhLCAweDAwMDYxYzAyLCAweDBhMDAxNTVlLCAweDAwMDAwMDAwLAorCTB4MjQwMjAwYzIsIDB4MTA2MjAwY2EsIDB4Mjg2MjAwYzMsIDB4MTA0MDAwMDUsIDB4MjQwMjAwODAsIDB4MTA2MjAwNWEsCisJMHgwMGEwMTgyMSwgMHgwYTAwMTU1ZSwgMHgwMDAwMDAwMCwgMHgyNDAyMDBjOSwgMHgxMDYyMDBjZCwgMHgzMGM1ZmZmZiwKKwkweDBhMDAxNTVlLCAweDAwMDAwMDAwLCAweDNjMDU4MDAwLCAweDhmNDIwMWI4LCAweDAwNDUxMDI0LCAweDE0NDBmZmZkLAorCTB4MjQwMjAwMDEsIDB4YTQ4MzAwMDgsIDB4MjQwMzAwMDIsIDB4YWM4NzAwMDAsIDB4YWM4MDAwMDQsIDB4YTA4MjAwMGEsCisJMHhhMDgzMDAwYiwgMHhhNDg2MDAxMCwgMHg4ZjQzMDE0NCwgMHgzYzAyMTAwMCwgMHhhYzgwMDAyOCwgMHhhYzgzMDAyNCwKKwkweDNjMDM2MDAwLCAweGFmNDIwMWI4LCAweDAzZTAwMDA4LCAweGFjNjAwODA4LCAweDExMDAwMDA5LCAweDAwYTAxODIxLAorCTB4M2MwMjA4MDAsIDB4MjQwMzAwMDIsIDB4YTA0MzZjODgsIDB4MjQ0MjZjODgsIDB4YWM0NzAwMDgsIDB4OGY0MzAxNDQsCisJMHgwM2UwMDAwOCwgMHhhYzQzMDAwNCwgMHgzYzA1ODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQ1MTAyNCwgMHgxNDQwZmZmZCwKKwkweDI0MDIwMDAyLCAweGFjODAwMDAwLCAweGFjODcwMDA0LCAweGE0ODMwMDA4LCAweGEwODIwMDBhLCAweGEwODIwMDBiLAorCTB4YTQ4NjAwMTAsIDB4YWM4MDAwMjQsIDB4OGY0MjAxNDQsIDB4M2MwMzEwMDAsIDB4YWM4MjAwMjgsIDB4M2MwMjYwMDAsCisJMHhhZjQzMDFiOCwgMHgwM2UwMDAwOCwgMHhhYzQwMDgwOCwgMHgzYzA4MDgwMCwgMHgzYzA1ODAwMCwgMHg4ZjQyMDFiOCwKKwkweDAwNDUxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweGFjODcwMDAwLCAweDkxMDI2Yzg4LCAweDAwMDAyODIxLAorCTB4MTA0MDAwMDIsIDB4MjUwNzZjODgsIDB4OGNlNTAwMDgsIDB4YWM4NTAwMDQsIDB4YTQ4MzAwMDgsIDB4OTEwMzZjODgsCisJMHgyNDAyMDAwMiwgMHhhMDgyMDAwYiwgMHhhNDg2MDAxMCwgMHgzNDYzMDAwMSwgMHhhMDgzMDAwYSwgMHg4ZjQyMDE0NCwKKwkweGFjODIwMDI0LCAweDkxMDM2Yzg4LCAweDEwNjAwMDAyLCAweDAwMDAxMDIxLCAweDhjZTIwMDA0LCAweGFjODIwMDI4LAorCTB4M2MwMjEwMDAsIDB4YWY0MjAxYjgsIDB4M2MwMjYwMDAsIDB4YTEwMDZjODgsIDB4MDNlMDAwMDgsIDB4YWM0MDA4MDgsCisJMHgzYzA1ODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQ1MTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMiwgMHhhMDgyMDAwYiwKKwkweGE0ODMwMDA4LCAweGE0ODYwMDEwLCAweDhmNDIwMTQ0LCAweDNjMDMxMDAwLCAweGE0ODIwMDEyLCAweDAzZTAwMDA4LAorCTB4YWY0MzAxYjgsIDB4MzBjMmZmZmYsIDB4MTQ0MDAwMjgsIDB4MDAwNjFjMDIsIDB4OTM2MjAwMDUsIDB4MzA0MjAwMDQsCisJMHgxNDQwMDAyMCwgMHgzYzAyOTAwMCwgMHgzNDQyMDAwMSwgMHgwMGUyMTAyNSwgMHhhZjQyMDAyMCwgMHgzYzAzODAwMCwKKwkweDhmNDIwMDIwLCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDkzNjIwMDA1LCAweDNjMDM4MDAwLAorCTB4MzQ2MzAwMDEsIDB4MDBlMzE4MjUsIDB4MzQ0MjAwMDQsIDB4YTM2MjAwMDUsIDB4YWY0MzAwMjAsIDB4OTM2MjAwMDUsCisJMHgzMDQyMDAwNCwgMHgxNDQwMDAwMywgMHgzYzAzODAwMCwgMHgwMDAwMDAwZCwgMHgzYzAzODAwMCwgMHg4ZjQyMDFiOCwKKwkweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDI0MDIwMDA1LCAweDNjMDMxMDAwLCAweGFjODcwMDAwLCAweGEwODIwMDBiLAorCTB4YWY0MzAxYjgsIDB4MGEwMDE1MGQsIDB4MDAwNjFjMDIsIDB4MDAwMDAwMGQsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsCisJMHgwMDA2MWMwMiwgMHgzYzA1ODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQ1MTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMSwKKwkweGE0ODMwMDA4LCAweDI0MDMwMDAyLCAweGFjODcwMDAwLCAweGFjODAwMDA0LCAweGEwODIwMDBhLCAweGEwODMwMDBiLAorCTB4YTQ4NjAwMTAsIDB4OGY0MzAxNDQsIDB4M2MwMjEwMDAsIDB4YWM4MDAwMjgsIDB4YWM4MzAwMjQsIDB4MDNlMDAwMDgsCisJMHhhZjQyMDFiOCwgMHgzYzA1ODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQ1MTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMiwKKwkweGFjODAwMDAwLCAweGFjODcwMDA0LCAweGE0ODMwMDA4LCAweGEwODIwMDBhLCAweGEwODIwMDBiLCAweGE0ODYwMDEwLAorCTB4YWM4MDAwMjQsIDB4OGY0MjAxNDQsIDB4M2MwMzEwMDAsIDB4YWM4MjAwMjgsIDB4MDNlMDAwMDgsIDB4YWY0MzAxYjgsCisJMHgwMDA2MWMwMiwgMHgzYzA1ODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQ1MTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMSwKKwkweGE0ODMwMDA4LCAweDI0MDMwMDAyLCAweGEwODIwMDBhLCAweDNjMDIxMDAwLCAweGFjODcwMDAwLCAweGFjODAwMDA0LAorCTB4YTA4MzAwMGIsIDB4YTQ4NjAwMTAsIDB4YWM4MDAwMjQsIDB4YWM4MDAwMjgsIDB4MDNlMDAwMDgsIDB4YWY0MjAxYjgsCisJMHgwMGEwMTgyMSwgMHgzYzA1ODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQ1MTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMiwKKwkweGFjODcwMDAwLCAweGFjODAwMDA0LCAweGE0ODMwMDA4LCAweGEwODAwMDBhLCAweDBhMDAxNTE4LCAweGEwODIwMDBiLAorCTB4OGY0NDAxNDQsIDB4M2MwMzgwMDAsIDB4OGY0MjAxYjgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MjQwMjAwMDIsCisJMHgyNDAzNDBjOSwgMHhhZjQ3MDE4MCwgMHhhMzQyMDE4YiwgMHgzYzAyMTAwMCwgMHhhNzQzMDE4OCwgMHhhZjQ0MDFhNCwKKwkweGFmNDUwMWE4LCAweGFmNDAwMWFjLCAweDAzZTAwMDA4LCAweGFmNDIwMWI4LCAweDAwMDAwMDBkLCAweDAzZTAwMDA4LAorCTB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4OGY0MjAxMDAsIDB4MzA0MjAwM2UsIDB4MTQ0MDAwMTEsCisJMHgyNDAyMDAwMSwgMHhhZjQwMDA0OCwgMHg4ZjQyMDEwMCwgMHgzMDQyMDdjMCwgMHgxMDQwMDAwNSwgMHgwMDAwMDAwMCwKKwkweGFmNDAwMDRjLCAweGFmNDAwMDUwLCAweDAzZTAwMDA4LCAweDI0MDIwMDAxLCAweGFmNDAwMDU0LCAweGFmNDAwMDQwLAorCTB4OGY0MjAxMDAsIDB4MzA0MjM4MDAsIDB4NTQ0MDAwMDEsIDB4YWY0MDAwNDQsIDB4MjQwMjAwMDEsIDB4MDNlMDAwMDgsCisJMHgwMDAwMDAwMCwgMHgzYzAzODAwMCwgMHg4ZjQyMDFiOCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwMiwKKwkweDI0MDM0MGM5LCAweGFmNDQwMTgwLCAweGEzNDIwMThiLCAweDNjMDIxMDAwLCAweGE3NDMwMTg4LCAweGFmNDUwMWE0LAorCTB4YWY0NjAxYTgsIDB4YWY0NzAxYWMsIDB4MDNlMDAwMDgsIDB4YWY0MjAxYjgsIDB4M2MwMjkwMDAsIDB4MzQ0MjAwMDEsCisJMHgwMDgyMjAyNSwgMHhhZjQ0MDAyMCwgMHgzYzAzODAwMCwgMHg4ZjQyMDAyMCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwKKwkweDAwMDAwMDAwLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDNjMDI4MDAwLCAweDM0NDIwMDAxLCAweDAwODIyMDI1LAorCTB4MDNlMDAwMDgsIDB4YWY0NDAwMjAsIDB4MzA4NjAwZmYsIDB4Mjc0NTAxODAsIDB4M2MwMzgwMDAsIDB4OGY0MjAxYjgsCisJMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjQyMDEyOCwgMHhhY2EyMDAwMCwgMHg4ZjY0MDA0MCwKKwkweDI0MDMwMDA4LCAweDI0MDI0MGMxLCAweGE0YTIwMDA4LCAweDI0MDIwMDAyLCAweGEwYTIwMDBiLCAweDNjMDIxMDAwLAorCTB4YTBhNjAwMGEsIDB4YTRhMzAwMTAsIDB4YTBhMDAwMTIsIDB4YTBhMDAwMTMsIDB4YWNhMDAwMTQsIDB4YWNhMDAwMjQsCisJMHhhY2EwMDAyOCwgMHhhY2EwMDAyYywgMHhhY2E0MDAxOCwgMHgwM2UwMDAwOCwgMHhhZjQyMDFiOCwgMHgyNDAyMDAwMSwKKwkweGFjYzQwMDAwLCAweDAzZTAwMDA4LCAweGE0ZTUwMDAwLCAweDI0MDIwMDAxLCAweGFmNDAwMDQ0LCAweDAzZTAwMDA4LAorCTB4YWY0MDAwNTAsIDB4MDA4MDMwMjEsIDB4Mjc0NTAxODAsIDB4M2MwMzgwMDAsIDB4OGY0MjAxYjgsIDB4MDA0MzEwMjQsCisJMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjQyMDEyOCwgMHhhY2EyMDAwMCwgMHg4Y2MzMDAxOCwgMHgyNDAyNDBjMSwKKwkweGE0YTIwMDA4LCAweGFjYTMwMDE4LCAweDkwYzQwMDBhLCAweDI0MDIwMDAyLCAweGEwYTIwMDBiLCAweGEwYTQwMDBhLAorCTB4OTRjMjAwMTAsIDB4YTRhMjAwMTAsIDB4OTBjMzAwMTIsIDB4YTBhMzAwMTIsIDB4OTBjMjAwMTMsIDB4YTBhMjAwMTMsCisJMHg4Y2MzMDAxNCwgMHhhY2EzMDAxNCwgMHg4Y2MyMDAyNCwgMHhhY2EyMDAyNCwgMHg4Y2MzMDAyOCwgMHhhY2EzMDAyOCwKKwkweDhjYzIwMDJjLCAweDNjMDMxMDAwLCAweGFjYTIwMDJjLCAweDI0MDIwMDAxLCAweGFmNDMwMWI4LCAweGFmNDAwMDQ0LAorCTB4MDNlMDAwMDgsIDB4YWY0MDAwNTAsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTAsIDB4MGUwMDEwNDcsIDB4MDAwMDAwMDAsCisJMHgwMDAwMjAyMSwgMHgwZTAwMGM3OCwgMHhhZjQwMDE4MCwgMHg4ZmJmMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwKKwkweDhmNDYwMTQ4LCAweDI3NDUwMTgwLCAweDNjMDM4MDAwLCAweDAwMDYxNDAyLCAweDMwNDcwMGZmLCAweDhmNDIwMWI4LAorCTB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OGY0NDAxNDAsIDB4MDAwNjEyMDIsIDB4MzA0MjAwZmYsCisJMHgwMDA2MWMwMiwgMHhhY2EyMDAwNCwgMHgyNDAyMDAwMiwgMHhhNGEzMDAwOCwgMHgzMGMzMDBmZiwgMHhhMGEyMDAwYiwKKwkweGFjYTMwMDI0LCAweDEwZTAwMDBhLCAweGFjYTQwMDAwLCAweDI4ZTIwMDA0LCAweDE0NDAwMDA1LCAweDI0MDIwMDAxLAorCTB4MjQwMjAwMDUsIDB4NTRlMjAwMDUsIDB4YTBhMDAwMGEsIDB4MjQwMjAwMDEsIDB4MGEwMDE2MDksIDB4YTBhMjAwMGEsCisJMHhhMGEwMDAwYSwgMHgzYzAyMTAwMCwgMHgwM2UwMDAwOCwgMHhhZjQyMDFiOCwgMHgwM2UwMDAwOCwgMHgwMDAwMTAyMSwKKwkweDEwYzAwMDA3LCAweDAwMDAwMDAwLCAweDhjYTIwMDAwLCAweDI0YzZmZmZmLCAweDI0YTUwMDA0LCAweGFjODIwMDAwLAorCTB4MTRjMGZmZmIsIDB4MjQ4NDAwMDQsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MGEwMDE2MWYsIDB4MDBhMDEwMjEsCisJMHhhYzg2MDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNDg0MDAwNCwgMHgwMGEwMTAyMSwgMHgxNDQwZmZmYSwKKwkweDI0YTVmZmZmLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH07IAorCitzdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Oworc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd1JvZGF0YVsoMHgyOC80KSArIDFdID0geworCTB4MDgwMDQ2OGMsIDB4MDgwMDQ1OGMsIDB4MDgwMDQ2MzAsIDB4MDgwMDQ2NDgsIDB4MDgwMDQ2NjAsIDB4MDgwMDQ2ODAsCisJMHgwODAwNDY4YywgMHgwODAwNDY4YywgMHgwODAwNDU5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9Oworc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd0Jzc1soMHgxM2E0LzQpICsgMV0gPSB7IDB4MCB9Oworc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd1Nic3NbKDB4MWMvNCkgKyAxXSA9IHsgMHgwIH07CisKK3N0YXRpYyB1MzIgYm54Ml9ydjJwX3Byb2MxW10gPSB7CisJMHgwMDAwMDAwOCwgMHhhYzAwMDAwMSwgMHgwMDAwMDAwYywgMHgyZjgwMDAwMSwgMHgwMDAwMDAxMCwgMHgyMTNmMDAwNCwKKwkweDAwMDAwMDEwLCAweDIwYmYwMDJjLCAweDAwMDAwMDEwLCAweDIwM2YwMTQzLCAweDAwMDAwMDE4LCAweDgwMDBmZmZkLAorCTB4MDAwMDAwMTAsIDB4YjFiOGIwMTcsIDB4MDAwMDAwMGIsIDB4MmZkZjAwMDIsIDB4MDAwMDAwMDAsIDB4MDNkODAwMDAsCisJMHgwMDAwMDAwMCwgMHgyYzM4MDAwMCwgMHgwMDAwMDAwOCwgMHgyYzgwMDAwMCwgMHgwMDAwMDAwOCwgMHgyZDAwMDAwMCwKKwkweDAwMDAwMDEwLCAweDkxZDQwMDAwLCAweDAwMDAwMDA4LCAweDJkODAwMTA4LCAweDAwMDAwMDA4LCAweDAyMDAwMDAyLAorCTB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsIDB4MDAwMDAwMGYsIDB4NDJlMDAwMWMsIDB4MDAwMDAwMTAsIDB4OTE4NDBhMDgsCisJMHgwMDAwMDAwOCwgMHgyYzgwMDBiMCwgMHgwMDAwMDAwOCwgMHgyZDAwMDAwOCwgMHgwMDAwMDAwOCwgMHgyZDgwMDE1MCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDEwLCAweDkxZGUwMDAwLCAweDAwMDAwMDEwLCAweDJjNjIwMDAyLAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwMTIsIDB4MDAwMDAwMGIsIDB4MmZkZjAwMDIsIDB4MDAwMDAwMGMsIDB4MWY4MDAwMDIsCisJMHgwMDAwMDAwMCwgMHgyYzA3MDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwZmZlNiwgMHgwMDAwMDAwOCwgMHgwMjAwMDAwMiwKKwkweDAwMDAwMDBmLCAweDQyZTAwMDFjLCAweDAwMDAwMDEwLCAweDkxODQwYTA4LCAweDAwMDAwMDA4LCAweDJjODAwMGIwLAorCTB4MDAwMDAwMDgsIDB4MmQwMDAwMDgsIDB4MDAwMDAwMTAsIDB4OTFkNDAwMDAsIDB4MDAwMDAwMDgsIDB4MmQ4MDAxMDgsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHg5MWRlMDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwMDAwNCwKKwkweDAwMDAwMDBjLCAweDFmODAwMDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDE4LCAweDgwMDBmZmQ5LAorCTB4MDAwMDAwMGMsIDB4Mjk4MDAwMDIsIDB4MDAwMDAwMGMsIDB4MWY4MDAwMDIsIDB4MDAwMDAwMDAsIDB4MmFkZjAwMDAsCisJMHgwMDAwMDAwOCwgMHgyYTAwMDAwNSwgMHgwMDAwMDAxOCwgMHg4MDAwZmZkNCwgMHgwMDAwMDAwOCwgMHgwMjI0MDAzMCwKKwkweDAwMDAwMDE4LCAweDAwMDQwMDAwLCAweDAwMDAwMDE4LCAweDgwMDAwMDE1LCAweDAwMDAwMDE4LCAweDgwMDAwMDE3LAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwMWIsIDB4MDAwMDAwMTgsIDB4ODAwMDAwNGMsIDB4MDAwMDAwMTgsIDB4ODAwMDAwOGMsCisJMHgwMDAwMDAxOCwgMHg4MDAwMDAwZiwgMHgwMDAwMDAxOCwgMHg4MDAwMDAwZSwgMHgwMDAwMDAxOCwgMHg4MDAwMDAwZCwKKwkweDAwMDAwMDE4LCAweDgwMDAwMDBjLCAweDAwMDAwMDE4LCAweDgwMDAwMGMyLCAweDAwMDAwMDE4LCAweDgwMDAwMDBhLAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwMDksIDB4MDAwMDAwMTgsIDB4ODAwMDAwMDgsIDB4MDAwMDAwMTgsIDB4ODAwMDAwZmQsCisJMHgwMDAwMDAxOCwgMHg4MDAwMDAwNiwgMHgwMDAwMDAxOCwgMHg4MDAwMDAwNSwgMHgwMDAwMDAxOCwgMHg4MDAwMDBmZiwKKwkweDAwMDAwMDE4LCAweDgwMDAwMTA0LCAweDAwMDAwMDE4LCAweDgwMDAwMDAyLCAweDAwMDAwMDE4LCAweDgwMDAwMDk4LAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMGMsIDB4MWY4MDAwMDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAxOCwgMHg4MDAwZmZiYSwgMHgwMDAwMDAxMCwgMHg5MWQ0MDAwMCwgMHgwMDAwMDAwYywgMHgyOTgwMDAwMSwKKwkweDAwMDAwMDBjLCAweDFmODAwMDAxLCAweDAwMDAwMDA4LCAweDJhMDAwMDAyLCAweDAwMDAwMDE4LCAweDgwMDBmZmI1LAorCTB4MDAwMDAwMTAsIDB4YjFhMGIwMTIsIDB4MDAwMDAwMGIsIDB4MmZkZjAwMDIsIDB4MDAwMDAwMDAsIDB4MmMyMDAwMDAsCisJMHgwMDAwMDAwOCwgMHgyYzgwMDAwMCwgMHgwMDAwMDAwOCwgMHgyZDAwMDAwMCwgMHgwMDAwMDAxMCwgMHg5MWQ0MDAwMCwKKwkweDAwMDAwMDA4LCAweDJkODAwMTFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDEwLCAweDkxZGUwMDAwLAorCTB4MDAwMDAwMGYsIDB4NDc2MDAwMDgsIDB4MDAwMDAwMGYsIDB4MDYwZTAwMDEsIDB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsCisJMHgwMDAwMDAwMCwgMHgwZjU4MDAwMCwgMHgwMDAwMDAwMCwgMHgwYTY0MDAwMCwgMHgwMDAwMDAwMCwgMHgwYWU1MDAwMCwKKwkweDAwMDAwMDAwLCAweDBiNjYwMDAwLCAweDAwMDAwMDAwLCAweDBkNjEwMDAwLCAweDAwMDAwMDE4LCAweDgwMDAwMDEzLAorCTB4MDAwMDAwMGYsIDB4NDc2MDAwMDgsIDB4MDAwMDAwMGIsIDB4MmZkZjAwMDIsIDB4MDAwMDAwMDgsIDB4MmM4MDAwMDAsCisJMHgwMDAwMDAwOCwgMHgyZDAwMDAwMCwgMHgwMDAwMDAxMCwgMHg5MWQ0MDAwMCwgMHgwMDAwMDAwOCwgMHgyZDgwMDExYywKKwkweDAwMDAwMDBmLCAweDA2MGUwMDAxLCAweDAwMDAwMDEwLCAweDAwMWYwMDAwLCAweDAwMDAwMDAwLCAweDBmNTgwMDAwLAorCTB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsIDB4MDAwMDAwMDAsIDB4MGE2NDAwMDAsIDB4MDAwMDAwMDAsIDB4MGFlNTAwMDAsCisJMHgwMDAwMDAwMCwgMHgwYjY2MDAwMCwgMHgwMDAwMDAwMCwgMHgwZDYxMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjYyMDAwMCwKKwkweDAwMDAwMDBiLCAweDJmZGYwMDAyLCAweDAwMDAwMDAwLCAweDMwOWEwMDAwLCAweDAwMDAwMDAwLCAweDMxMDQwMDAwLAorCTB4MDAwMDAwMDAsIDB4MGM5NjE4MDAsIDB4MDAwMDAwMDksIDB4MGM5OWZmZmYsIDB4MDAwMDAwMDQsIDB4Y2M5OTM0MDAsCisJMHgwMDAwMDAxMCwgMHhiMTk2MzIwMiwgMHgwMDAwMDAwOCwgMHgwZjgwMDAwMCwgMHgwMDAwMDAwYywgMHgyOTgwMDAwMSwKKwkweDAwMDAwMDEwLCAweDAwMjIwMDAyLCAweDAwMDAwMDBjLCAweDI5NTIwMDAxLCAweDAwMDAwMDBjLCAweDI5NTIwMDAwLAorCTB4MDAwMDAwMDgsIDB4MjIwMDAwMDEsIDB4MDAwMDAwMGMsIDB4MWY4MDAwMDEsIDB4MDAwMDAwMDAsIDB4MmFkZjAwMDAsCisJMHgwMDAwMDAwOCwgMHgyYTAwMDAwMywgMHgwMDAwMDAxOCwgMHg4MDAwZmY4MywgMHgwMDAwMDAxMCwgMHhiMWEwYjAxZCwKKwkweDAwMDAwMDBiLCAweDJmZGYwMDAyLCAweDAwMDAwMDAwLCAweDJjMjAwMDAwLCAweDAwMDAwMDA4LCAweDJjODAwMGIwLAorCTB4MDAwMDAwMDgsIDB4MmQwMDAwMDgsIDB4MDAwMDAwMTAsIDB4OTFkNDAwMDAsIDB4MDAwMDAwMDgsIDB4MmQ4MDAxNTAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgyMDVmMDAwMCwgMHgwMDAwMDAwOCwgMHgyYzgwMDAwMCwKKwkweDAwMDAwMDA4LCAweDJkMDAwMDAwLCAweDAwMDAwMDA4LCAweDJkODAwMTA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsIDB4MDAwMDAwMGYsIDB4NDc2MDAwMDgsIDB4MDAwMDAwMDAsIDB4MDYwZTAwMDAsCisJMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwgMHgwMDAwMDAwMCwgMHgwZjU4MDAwMCwgMHgwMDAwMDAxMCwgMHg5MWRlMDAwMCwKKwkweDAwMDAwMDAwLCAweDBhNjQwMDAwLCAweDAwMDAwMDAwLCAweDBhZTUwMDAwLCAweDAwMDAwMDAwLCAweDBiNjcwMDAwLAorCTB4MDAwMDAwMDAsIDB4MGQ2MjAwMDAsIDB4MDAwMDAwMDAsIDB4MGNlNzE4MDAsIDB4MDAwMDAwMDksIDB4MGM5OWZmZmYsCisJMHgwMDAwMDAwNCwgMHhjYzk5MzQwMCwgMHgwMDAwMDAxMCwgMHhiMTk2MzIyMCwgMHgwMDAwMDAwOCwgMHgwZjgwMDAwMCwKKwkweDAwMDAwMDE4LCAweDgwMDAwMDFlLCAweDAwMDAwMDBmLCAweDQ3NjAwMDA4LCAweDAwMDAwMDBiLCAweDJmZGYwMDAyLAorCTB4MDAwMDAwMDgsIDB4MmM4MDAwYjAsIDB4MDAwMDAwMDgsIDB4MmQwMDAwMDgsIDB4MDAwMDAwMTAsIDB4OTFkNDAwMDAsCisJMHgwMDAwMDAwOCwgMHgyZDgwMDEyYywgMHgwMDAwMDAwZiwgMHgwNjBlMDAwMSwgMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwKKwkweDAwMDAwMDAwLCAweDBmNTgwMDAwLCAweDAwMDAwMDEwLCAweDkxZGUwMDAwLCAweDAwMDAwMDAwLCAweDBhNjQwMDAwLAorCTB4MDAwMDAwMDAsIDB4MGFlNTAwMDAsIDB4MDAwMDAwMDAsIDB4MGI2NzAwMDAsIDB4MDAwMDAwMDAsIDB4MGQ2MjAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjYzMDAwMCwgMHgwMDAwMDAwZiwgMHg0NzYyMDAxMCwgMHgwMDAwMDAwMCwgMHgwY2U3MTgwMCwKKwkweDAwMDAwMDBiLCAweDJmZGYwMDAyLCAweDAwMDAwMDAwLCAweDMxMWEwMDAwLCAweDAwMDAwMDAwLCAweDMxODQwMDAwLAorCTB4MDAwMDAwMGIsIDB4YzIwMDAwZmYsIDB4MDAwMDAwMDIsIDB4NDIwNDAwMDAsIDB4MDAwMDAwMDEsIDB4MzE2MjA4MDAsCisJMHgwMDAwMDAwZiwgMHgwMjBlMDAxMCwgMHgwMDAwMDAwMiwgMHgzMTYyMDgwMCwgMHgwMDAwMDAwOSwgMHgwYzk5ZmZmZiwKKwkweDAwMDAwMDA0LCAweGNjOTkzNDAwLCAweDAwMDAwMDEwLCAweGIxOTYzMjAyLCAweDAwMDAwMDA4LCAweDBmODAwMDAwLAorCTB4MDAwMDAwMGMsIDB4Mjk4MDAwMDEsIDB4MDAwMDAwMGMsIDB4MWY4MDAwMDEsIDB4MDAwMDAwMGMsIDB4NjE0MjAwMDYsCisJMHgwMDAwMDAwOCwgMHgyMjAwMDAwOCwgMHgwMDAwMDAwMCwgMHgyYWRmMDAwMCwgMHgwMDAwMDAwOCwgMHgyYTAwMDAwNCwKKwkweDAwMDAwMDE4LCAweDgwMDBmZjQyLCAweDAwMDAwMDA4LCAweDJjODAwMGIwLCAweDAwMDAwMDA4LCAweDJkMDAwMDA4LAorCTB4MDAwMDAwMTAsIDB4OTFhMGIwMDgsIDB4MDAwMDAwMTAsIDB4OTFkNDAwMDAsIDB4MDAwMDAwMGMsIDB4MzE2MjAwMTgsCisJMHgwMDAwMDAwOCwgMHgyZDgwMDAwMSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHg5MWRlMDAwMCwKKwkweDAwMDAwMDA4LCAweGFjMDAwMDAxLCAweDAwMDAwMDE4LCAweDgwMDAwMDBlLCAweDAwMDAwMDAwLCAweDAzODBiMDAwLAorCTB4MDAwMDAwMGIsIDB4MmZkZjAwMDIsIDB4MDAwMDAwMDAsIDB4MmMwMDQwMDAsIDB4MDAwMDAwMTAsIDB4OTFkNDAwMDAsCisJMHgwMDAwMDAwOCwgMHgyZDgwMDEwMSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHg5MWRlMDAwMCwKKwkweDAwMDAwMDBjLCAweDMxNjIwMDE4LCAweDAwMDAwMDA4LCAweDJkODAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsIDB4MDAwMDAwMGIsIDB4MmZkZjAwMDIsIDB4MDAwMDAwMDAsIDB4MmMwMDBlMDAsCisJMHgwMDAwMDAwYywgMHgyOTgwMDAwMSwgMHgwMDAwMDAwYywgMHgxZjgwMDAwMSwgMHgwMDAwMDAwOCwgMHgyYTAwMDAwNywKKwkweDAwMDAwMDE4LCAweDgwMDBmZjI3LCAweDAwMDAwMDEwLCAweGIxYTBiMDE2LCAweDAwMDAwMDBiLCAweDJmZGYwMDAyLAorCTB4MDAwMDAwMDAsIDB4MDNkODAwMDAsIDB4MDAwMDAwMDAsIDB4MmMyMDAwMDAsIDB4MDAwMDAwMDgsIDB4MmM4MDAwYjAsCisJMHgwMDAwMDAwOCwgMHgyZDAwMDAwOCwgMHgwMDAwMDAxMCwgMHg5MWQ0MDAwMCwgMHgwMDAwMDAwOCwgMHgyZDgwMDE1MCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDEwLCAweDIwNWYwMDAwLCAweDAwMDAwMDA4LCAweDJjODAwMDAwLAorCTB4MDAwMDAwMDgsIDB4MmQwMDAwMDAsIDB4MDAwMDAwMDgsIDB4MmQ4MDAxMDgsIDB4MDAwMDAwMDgsIDB4MDcwMDAwMDEsCisJMHgwMDAwMDAxMCwgMHhiNWRlMWMwMCwgMHgwMDAwMDAxMCwgMHgyYzYyMDAwMiwgMHgwMDAwMDAxOCwgMHg4MDAwMDAwYSwKKwkweDAwMDAwMDBiLCAweDJmZGYwMDAyLCAweDAwMDAwMDAwLCAweDJjMDcwMDAwLCAweDAwMDAwMDBjLCAweDFmODAwMDAxLAorCTB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsIDB4MDAwMDAwMTgsIDB4ODAwMGZmMTEsIDB4MDAwMDAwMDgsIDB4MmM4MDAwYjAsCisJMHgwMDAwMDAwOCwgMHgyZDAwMDAwOCwgMHgwMDAwMDAxMCwgMHg5MWQ0MDAwMCwgMHgwMDAwMDAwOCwgMHgyZDgwMDEwOCwKKwkweDAwMDAwMDBjLCAweDI5ODAwMDAxLCAweDAwMDAwMDBjLCAweDFmODAwMDAxLCAweDAwMDAwMDEwLCAweDkxZGUwMDAwLAorCTB4MDAwMDAwMDAsIDB4MmFkZjAwMDAsIDB4MDAwMDAwMDgsIDB4MmEwMDAwMGEsIDB4MDAwMDAwMTgsIDB4ODAwMGZmMDcsCisJMHgwMDAwMDAwMCwgMHg4MjI2NTYwMCwgMHgwMDAwMDAwZiwgMHg0NzIyMDAwOCwgMHgwMDAwMDAwOSwgMHgwNzBlMDAwZiwKKwkweDAwMDAwMDA4LCAweDA3MGUwMDA4LCAweDAwMDAwMDA4LCAweDAyODAwMDAxLCAweDAwMDAwMDA3LCAweDAyODUxYzAwLAorCTB4MDAwMDAwMDgsIDB4ODI4NTAwMDEsIDB4MDAwMDAwMDAsIDB4MDI4NDBhMDAsIDB4MDAwMDAwMDcsIDB4NDI4NTFjMDAsCisJMHgwMDAwMDAwMywgMHhjM2FhNTIwMCwgMHgwMDAwMDAwMCwgMHgwM2IxMGUwMCwgMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwKKwkweDAwMDAwMDBmLCAweDBmMjgwMDA3LCAweDAwMDAwMDA3LCAweDRiMDcxYzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMGYsIDB4MGE5NjAwMDMsIDB4MDAwMDAwMDAsIDB4MGE5NTVjMDAsIDB4MDAwMDAwMDAsIDB4NGEwMDVhMDAsCisJMHgwMDAwMDAwMCwgMHgwYzk2MGEwMCwgMHgwMDAwMDAwOSwgMHgwYzk5ZmZmZiwgMHgwMDAwMDAwOCwgMHgwZDAwZmZmZiwKKwkweDAwMDAwMDEwLCAweGIxOTYzMjAyLCAweDAwMDAwMDA4LCAweDBmODAwMDA1LCAweDAwMDAwMDEwLCAweDAwMjIwMDIwLAorCTB4MDAwMDAwMDAsIDB4MDJhNzAwMDAsIDB4MDAwMDAwMTAsIDB4YjE4NTAwMDIsIDB4MDAwMDAwMDgsIDB4ODI4NTAyMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwM2E2MDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwMDA0ZSwKKwkweDAwMDAwMDAwLCAweDA3MmIwMDAwLCAweDAwMDAwMDAxLCAweDg3OGMxYzAwLCAweDAwMDAwMDAwLCAweDg3MGUxZTAwLAorCTB4MDAwMDAwMDAsIDB4ODYwYzFlMDAsIDB4MDAwMDAwMDAsIDB4MDMwNjFlMDAsIDB4MDAwMDAwMTAsIDB4YjE4ZTAwMDMsCisJMHgwMDAwMDAxOCwgMHg4MDAwMDA0NywgMHgwMDAwMDAxOCwgMHg4MDAwZmZmYSwgMHgwMDAwMDAxMCwgMHg5MThjMDAwMywKKwkweDAwMDAwMDEwLCAweGIxODcwMDAyLCAweDAwMDAwMDE4LCAweDgwMDAwMDQzLCAweDAwMDAwMDEwLCAweDkxZDQwMDAwLAorCTB4MDAwMDAwMGMsIDB4Mjk4MDAwMDEsIDB4MDAwMDAwMDAsIDB4MmE4NjAwMDAsIDB4MDAwMDAwMDAsIDB4MjMwYzAwMDAsCisJMHgwMDAwMDAwMCwgMHgyYjA3MDAwMCwgMHgwMDAwMDAxMCwgMHhiMTg3MDAwZSwgMHgwMDAwMDAwOCwgMHgyYTAwMDAwOCwKKwkweDAwMDAwMDE4LCAweDgwMDAwMDNiLCAweDAwMDAwMDEwLCAweDkxZDQwMDAwLCAweDAwMDAwMDAwLCAweDI4ZDE4YzAwLAorCTB4MDAwMDAwMDAsIDB4MmE4NjAwMDAsIDB4MDAwMDAwMDAsIDB4MjMwYzAwMDAsIDB4MDAwMDAwMDAsIDB4MmIwNzAwMDAsCisJMHgwMDAwMDAxOCwgMHg4MDAwZmZmOCwgMHgwMDAwMDAxMCwgMHg5MWQ0MDAwMCwgMHgwMDAwMDAwYywgMHgyOTgwMDAwMSwKKwkweDAwMDAwMDAwLCAweDJhYWIwMDAwLCAweDAwMDAwMDAwLCAweGEzMjY1NjAwLCAweDAwMDAwMDAwLCAweDJiMDAwMDAwLAorCTB4MDAwMDAwMGMsIDB4MWY4MDAwMDEsIDB4MDAwMDAwMDgsIDB4MmEwMDAwMDgsIDB4MDAwMDAwMTgsIDB4ODAwMGZlYzgsCisJMHgwMDAwMDAxMCwgMHg5MWQ0MDAwMCwgMHgwMDAwMDAwYywgMHgyOTgwMDAwMSwgMHgwMDAwMDAwYywgMHgxZjgwMDAwMSwKKwkweDAwMDAwMDA4LCAweDJhMDAwMDA5LCAweDAwMDAwMDE4LCAweDgwMDBmZWMzLCAweDAwMDAwMDEwLCAweDkxZDQwMDAwLAorCTB4MDAwMDAwMGMsIDB4Mjk4MDAwMDEsIDB4MDAwMDAwMGMsIDB4MWY4MDAwMDEsIDB4MDAwMDAwMDAsIDB4Mjk0MjAwMDAsCisJMHgwMDAwMDAwOCwgMHgyYTAwMDAwMiwgMHgwMDAwMDAxOCwgMHg4MDAwZmViZCwgMHgwMDAwMDAxOCwgMHg4MDAwZmViYywKKwkweDAwMDAwMDEwLCAweGIxYmNiMDE2LCAweDAwMDAwMDBiLCAweDJmZGYwMDAyLCAweDAwMDAwMDAwLCAweDAzZDgwMDAwLAorCTB4MDAwMDAwMDAsIDB4MmMzYzAwMDAsIDB4MDAwMDAwMDgsIDB4MmM4MDAwYjAsIDB4MDAwMDAwMDgsIDB4MmQwMDAwMDgsCisJMHgwMDAwMDAxMCwgMHg5MWQ0MDAwMCwgMHgwMDAwMDAwOCwgMHgyZDgwMDE1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDEwLCAweDIwNWYwMDAwLCAweDAwMDAwMDA4LCAweDJjODAwMDAwLCAweDAwMDAwMDA4LCAweDJkMDAwMDAwLAorCTB4MDAwMDAwMDgsIDB4MmQ4MDAxMDgsIDB4MDAwMDAwMDgsIDB4MDcwMDAwMDEsIDB4MDAwMDAwMTAsIDB4YjVkZTFjMDAsCisJMHgwMDAwMDAxMCwgMHgyYzYyMDAwMiwgMHgwMDAwMDAxOCwgMHg4MDAwMDAwYSwgMHgwMDAwMDAwYiwgMHgyZmRmMDAwMiwKKwkweDAwMDAwMDAwLCAweDJjMDcwMDAwLCAweDAwMDAwMDBjLCAweDFmODAwMDAwLCAweDAwMDAwMDEwLCAweDkxZGUwMDAwLAorCTB4MDAwMDAwMTgsIDB4ODAwMGZlYTYsIDB4MDAwMDAwMDgsIDB4MmM4MDAwYjAsIDB4MDAwMDAwMDgsIDB4MmQwMDAwMDgsCisJMHgwMDAwMDAxMCwgMHg5MWQ0MDAwMCwgMHgwMDAwMDAwOCwgMHgyZDgwMDEwOCwgMHgwMDAwMDAwYywgMHgyOTgwMDAwMCwKKwkweDAwMDAwMDBjLCAweDFmODAwMDAwLCAweDAwMDAwMDEwLCAweDkxZGUwMDAwLCAweDAwMDAwMDAwLCAweDJhZGYwMDAwLAorCTB4MDAwMDAwMDgsIDB4MmEwMDAwMDYsIDB4MDAwMDAwMTgsIDB4ODAwMGZlOWMsIDB4MDAwMDAwMDgsIDB4MDMwNTAwMDQsCisJMHgwMDAwMDAwNiwgMHg4MzA0MGMwMCwgMHgwMDAwMDAwOCwgMHgwMjg1MDIwMCwgMHgwMDAwMDAwMCwgMHg4NjA1MGMwMCwKKwkweDAwMDAwMDAxLCAweDg2MGMwZTAwLCAweDAwMDAwMDA4LCAweDAyMDQwMDA0LCAweDAwMDAwMDAwLCAweDAyMDQxODAwLAorCTB4MDAwMDAwMDAsIDB4ODM4NzE4MDAsIDB4MDAwMDAwMTgsIDB4MDAwMjAwMDAgfTsKKworc3RhdGljIHUzMiBibngyX3J2MnBfcHJvYzJbXSA9IHsKKwkweDAwMDAwMDAwLCAweDJhMDAwMDAwLCAweDAwMDAwMDEwLCAweGIxZDQwMDAwLCAweDAwMDAwMDA4LCAweDAyNTQwMDAzLAorCTB4MDAwMDAwMTgsIDB4MDAwNDAwMDAsIDB4MDAwMDAwMTgsIDB4ODAwMDAwMGEsIDB4MDAwMDAwMTgsIDB4ODAwMDAwMGEsCisJMHgwMDAwMDAxOCwgMHg4MDAwMDAwZSwgMHgwMDAwMDAxOCwgMHg4MDAwMDA1NiwgMHgwMDAwMDAxOCwgMHg4MDAwMDFiOSwKKwkweDAwMDAwMDE4LCAweDgwMDAwMWUxLCAweDAwMDAwMDE4LCAweDgwMDAwMTliLCAweDAwMDAwMDE4LCAweDgwMDAwMWY5LAorCTB4MDAwMDAwMTgsIDB4ODAwMDAxOWYsIDB4MDAwMDAwMTgsIDB4ODAwMDAxYTYsIDB4MDAwMDAwMTgsIDB4ODAwMDAwMDAsCisJMHgwMDAwMDAwYywgMHgyOTgwMDAwMSwgMHgwMDAwMDAwMCwgMHgyYTAwMDAwMCwgMHgwMDAwMDAwYywgMHgyOTgwMDAwMCwKKwkweDAwMDAwMDEwLCAweDIwNTMwMDAwLCAweDAwMDAwMDE4LCAweDgwMDBmZmVlLCAweDAwMDAwMDBjLCAweDI5ODAwMDAxLAorCTB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsIDB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsIDB4MDAwMDAwMDAsIDB4MmY4MGFhMDAsCisJMHgwMDAwMDAwMCwgMHgyYTAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwZDYxMDAwMCwgMHgwMDAwMDAwMCwgMHgwMzYyMDAwMCwKKwkweDAwMDAwMDAwLCAweDJjNDAwMDAwLCAweDAwMDAwMDAwLCAweDAyNjM4YzAwLCAweDAwMDAwMDAwLCAweDI2NDYwMDAwLAorCTB4MDAwMDAwMTAsIDB4MDA0MjAwMDIsIDB4MDAwMDAwMDgsIDB4MDIwNDAwMTIsIDB4MDAwMDAwMTAsIDB4YjkwNjA4MzYsCisJMHgwMDAwMDAwMCwgMHgwZjU4MDAwMCwgMHgwMDAwMDAwMCwgMHgwYTY0MDAwMCwgMHgwMDAwMDAwMCwgMHgwYWU1MDAwMCwKKwkweDAwMDAwMDAwLCAweDBiNjYwMDAwLCAweDAwMDAwMDAwLCAweDBjMDAwMDAwLCAweDAwMDAwMDAwLCAweDBiODAwMDAwLAorCTB4MDAwMDAwMTAsIDB4MDA0MjAwMDksIDB4MDAwMDAwMDgsIDB4MGNjNjAwMTIsIDB4MDAwMDAwMDgsIDB4MGY4MDAwMDMsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgwMDlmMDAwMCwgMHgwMDAwMDAwOCwgMHgyNzExMDAxMiwKKwkweDAwMDAwMDAwLCAweDY2OTAwMDAwLCAweDAwMDAwMDA4LCAweGEzMWIwMDEyLCAweDAwMDAwMDE4LCAweDgwMDAwMDA4LAorCTB4MDAwMDAwMDAsIDB4MGNjNjAwMDAsIDB4MDAwMDAwMDgsIDB4MGY4MDAwMDMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAxMCwgMHgwMDlmMDAwMCwgMHgwMDAwMDAwMCwgMHgyNzExMDAwMCwgMHgwMDAwMDAwMCwgMHg2NjkwMDAwMCwKKwkweDAwMDAwMDAwLCAweDIzMWIwMDAwLCAweDAwMDAwMDEwLCAweGIxOTczMjBlLCAweDAwMDAwMDAwLCAweDI1OTYwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIxYjAwMDAsIDB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsIDB4MDAwMDAwMDgsIDB4MGY4MDAwMDMsCisJMHgwMDAwMDAwYywgMHgyOTgwMDAwMCwgMHgwMDAwMDAxMCwgMHgyMDUzMDAwMCwgMHgwMDAwMDAwMCwgMHgyMmM1MDgwMCwKKwkweDAwMDAwMDEwLCAweDAwOWYwMDAwLCAweDAwMDAwMDAwLCAweDI3MDAyMjAwLCAweDAwMDAwMDAwLCAweDI2ODAyMDAwLAorCTB4MDAwMDAwMDAsIDB4MjMxYjAwMDAsIDB4MDAwMDAwMGMsIDB4Njk1MjAwMDEsIDB4MDAwMDAwMTgsIDB4ODAwMGZmZjMsCisJMHgwMDAwMDAxMCwgMHgwMTEzMDAwMiwgMHgwMDAwMDAxMCwgMHhiMTk4MDAwMywgMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwKKwkweDAwMDAwMDA4LCAweDBmODAwMDA0LCAweDAwMDAwMDA4LCAweDIyMDAwMDAzLCAweDAwMDAwMDA4LCAweDJjODAwMDBjLAorCTB4MDAwMDAwMDgsIDB4MmQwMDAwMGMsIDB4MDAwMDAwMTAsIDB4MDA5ZjAwMDAsIDB4MDAwMDAwMDAsIDB4MjU5NjAwMDAsCisJMHgwMDAwMDAwYywgMHgyOTgwMDAwMCwgMHgwMDAwMDAwMCwgMHgzMjE0MDAwMCwgMHgwMDAwMDAwMCwgMHgzMjk1MDAwMCwKKwkweDAwMDAwMDAwLCAweDMzMTYwMDAwLCAweDAwMDAwMDAwLCAweDMxZTMyZTAwLCAweDAwMDAwMDA4LCAweDJkODAwMDEwLAorCTB4MDAwMDAwMTAsIDB4MjA1MzAwMDAsIDB4MDAwMDAwMTgsIDB4ODAwMGZmYWMsIDB4MDAwMDAwMDAsIDB4MjMwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgyNWU2MDAwMCwgMHgwMDAwMDAwOCwgMHgyMjAwMDAwYiwgMHgwMDAwMDAwYywgMHg2OTUyMDAwMCwKKwkweDAwMDAwMDBjLCAweDI5ODAwMDAwLCAweDAwMDAwMDEwLCAweDIwNTMwMDAwLCAweDAwMDAwMDE4LCAweDgwMDBmZmE1LAorCTB4MDAwMDAwMGMsIDB4Mjk4MDAwMDEsIDB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsIDB4MDAwMDAwMDAsIDB4MmZkNTAwMDAsCisJMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjcwMDAwMCwgMHgwMDAwMDAwMCwgMHgwZDYyMDAwMCwKKwkweDAwMDAwMDAwLCAweGJiNjMwODAwLCAweDAwMDAwMDAwLCAweDJhMDAwMDAwLCAweDAwMDAwMDA5LCAweDA3NjAwMGZmLAorCTB4MDAwMDAwMGYsIDB4MmMwZTAwMDcsIDB4MDAwMDAwMDgsIDB4MmM4MDAwMDAsIDB4MDAwMDAwMDgsIDB4MmQwMDAwNjQsCisJMHgwMDAwMDAwOCwgMHgyZDgwMDExYywgMHgwMDAwMDAwOSwgMHgwNjQyMDAwMiwgMHgwMDAwMDAwYywgMHg2MTQyMDAwMSwKKwkweDAwMDAwMDAwLCAweDBmNDAwMDAwLCAweDAwMDAwMDAwLCAweDAyZDA4YzAwLCAweDAwMDAwMDAwLCAweDIzMDAwMDAwLAorCTB4MDAwMDAwMDQsIDB4ODI2ZGEwMDAsIDB4MDAwMDAwMDAsIDB4ODMwNGEwMDAsIDB4MDAwMDAwMDAsIDB4MjJjNTBjMDAsCisJMHgwMDAwMDAwMCwgMHgwMzc2MDAwMCwgMHgwMDAwMDAwNCwgMHg4Mzg2MGEwMCwgMHgwMDAwMDAwMCwgMHg4Mzg3MGMwMCwKKwkweDAwMDAwMDEwLCAweDkxZGUwMDAwLCAweDAwMDAwMDAwLCAweDAzN2MwMDAwLCAweDAwMDAwMDAwLCAweDgzN2IwYzAwLAorCTB4MDAwMDAwMDEsIDB4ODMwNjBlMDAsIDB4MDAwMDAwMDAsIDB4ODM4NzBjMDAsIDB4MDAwMDAwMDAsIDB4ODI4NTBlMDAsCisJMHgwMDAwMDAxMCwgMHhiMTg2MDAxNiwgMHgwMDAwMDAwZiwgMHg0NzYxMDAxOCwgMHgwMDAwMDAwMCwgMHgwNjhlMDAwMCwKKwkweDAwMDAwMDBmLCAweDQ3NjcwMDEwLCAweDAwMDAwMDBmLCAweDQ3ZTIwMDEwLCAweDAwMDAwMDAwLCAweDg3MGUxZTAwLAorCTB4MDAwMDAwMTAsIDB4YjcwZTFhMTAsIDB4MDAwMDAwMTAsIDB4MGNlNzAwMGUsIDB4MDAwMDAwMDgsIDB4MjIwMDAwMDksCisJMHgwMDAwMDAwMCwgMHgyODZkMDAwMCwgMHgwMDAwMDAwZiwgMHg2NTY4MDAxMCwgMHgwMDAwMDAwMywgMHhmNjZjOTQwMCwKKwkweDAwMDAwMDEwLCAweGI5NzJhMDAzLCAweDAwMDAwMDBjLCAweDczZTcwMDE5LCAweDAwMDAwMDBjLCAweDIxNDIwMDA0LAorCTB4MDAwMDAwMTgsIDB4ODAwMDAyM2YsIDB4MDAwMDAwMDAsIDB4MzdlZDAwMDAsIDB4MDAwMDAwMGMsIDB4NzNlNzAwMWEsCisJMHgwMDAwMDAxMCwgMHgyMDUzMDAwMCwgMHgwMDAwMDAwOCwgMHgyMjAwMDAwOCwgMHgwMDAwMDAwYywgMHg2MTQyMDAwNCwKKwkweDAwMDAwMDAwLCAweDAyZjYwMDAwLCAweDAwMDAwMDA0LCAweDgyODQwYTAwLCAweDAwMDAwMDEwLCAweGIxODQwYTJiLAorCTB4MDAwMDAwMTAsIDB4MmQ2NzAwMGEsIDB4MDAwMDAwMTAsIDB4Yjk2ZDA4MDQsIDB4MDAwMDAwMDQsIDB4YjZlZDBhMDAsCisJMHgwMDAwMDAwMCwgMHgzN2VkMDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwMDAyOSwgMHgwMDAwMDAwYywgMHg2MTQyMDAwMCwKKwkweDAwMDAwMDAwLCAweDM3MDQwMDAwLCAweDAwMDAwMDAwLCAweDM3ODUwMDAwLCAweDAwMDAwMDBjLCAweDMzZTcwMDFhLAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwMjQsIDB4MDAwMDAwMTAsIDB4Yjk2ZDA4MDksIDB4MDAwMDAwMDQsIDB4YjZlZDBhMDAsCisJMHgwMDAwMDAwMCwgMHgwMzZkMDAwMCwgMHgwMDAwMDAwNCwgMHhiNzZlMGMwMCwgMHgwMDAwMDAxMCwgMHg5MWVlMGMxZiwKKwkweDAwMDAwMDBjLCAweDczZTcwMDFhLCAweDAwMDAwMDA0LCAweGI2ZWYwYzAwLCAweDAwMDAwMDAwLCAweDM3ZWQwMDAwLAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwMWIsIDB4MDAwMDAwMGMsIDB4NjE0MjAwMDAsIDB4MDAwMDAwMTAsIDB4YjdlZTBhMDUsCisJMHgwMDAwMDAxMCwgMHhiOTZmMDgxNSwgMHgwMDAwMDAwMywgMHhiNzZlMDgwMCwgMHgwMDAwMDAwNCwgMHhiN2VmMGEwMCwKKwkweDAwMDAwMDE4LCAweDgwMDAwMDE1LCAweDAwMDAwMDEwLCAweDBjZTcwMDBjLCAweDAwMDAwMDA4LCAweDIyMDAwMDA5LAorCTB4MDAwMDAwMDAsIDB4Mjg2ZDAwMDAsIDB4MDAwMDAwMGYsIDB4NjU2ODAwMTAsIDB4MDAwMDAwMDMsIDB4ZjY2Yzk0MDAsCisJMHgwMDAwMDAxMCwgMHhiOTcyYTAwMywgMHgwMDAwMDAwYywgMHg3M2U3MDAxOSwgMHgwMDAwMDAwYywgMHgyMTQyMDAwNCwKKwkweDAwMDAwMDE4LCAweDgwMDAwMjE1LCAweDAwMDAwMDEwLCAweDIwNTMwMDAwLCAweDAwMDAwMDA4LCAweDIyMDAwMDA4LAorCTB4MDAwMDAwMGMsIDB4NjE0MjAwMDQsIDB4MDAwMDAwMDAsIDB4MzcwNDAwMDAsIDB4MDAwMDAwMDAsIDB4Mzc4NTAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMzZkMDAwMCwgMHgwMDAwMDAwMywgMHhiOGYxMGMwMCwgMHgwMDAwMDAxOCwgMHg4MDAwMDAwNCwKKwkweDAwMDAwMDAwLCAweDAyODQwMDAwLCAweDAwMDAwMDAyLCAweDIxNDIxODAwLCAweDAwMDAwMDBjLCAweDYxNDIwMDAwLAorCTB4MDAwMDAwMDAsIDB4Mjg2ZDAwMDAsIDB4MDAwMDAwMGYsIDB4NjVlZDAwMTAsIDB4MDAwMDAwMDksIDB4MjY2ZGZmZmYsCisJMHgwMDAwMDAwMCwgMHgyMzAwMDAwMCwgMHgwMDAwMDAxMCwgMHhiMTg0MGEzZCwgMHgwMDAwMDAxMCwgMHgwMTQyMDAwMiwKKwkweDAwMDAwMDA0LCAweGI4ZjEwYTAwLCAweDAwMDAwMDAzLCAweDgzNzYwYTAwLCAweDAwMDAwMDEwLCAweGI4MDQwYzM5LAorCTB4MDAwMDAwMTAsIDB4YjdlNjA4MGEsIDB4MDAwMDAwMDAsIDB4MGE2NDAwMDAsIDB4MDAwMDAwMDAsIDB4MGFlNTAwMDAsCisJMHgwMDAwMDAwOSwgMHgwYzY4ZmZmZiwgMHgwMDAwMDAwOSwgMHgwYjY3ZmZmZiwgMHgwMDAwMDAwMCwgMHgwYmU2MDAwMCwKKwkweDAwMDAwMDAwLCAweDBjODQwMDAwLCAweDAwMDAwMDEwLCAweGIxOTczMjBjLCAweDAwMDAwMDA4LCAweDBmODAwMDAyLAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwMGEsIDB4MDAwMDAwMDAsIDB4MGE2YTAwMDAsIDB4MDAwMDAwMDAsIDB4MGFlYjAwMDAsCisJMHgwMDAwMDAwMCwgMHgwYzAwMDAwMCwgMHgwMDAwMDAwOSwgMHgwYjZjZmZmZiwgMHgwMDAwMDAwMCwgMHgwYmU5MDAwMCwKKwkweDAwMDAwMDAwLCAweDBjODQwMDAwLCAweDAwMDAwMDEwLCAweGIxOTczMjAzLCAweDAwMDAwMDA4LCAweDBmODAwMDAyLAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwMDEsIDB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsIDB4MDAwMDAwMDAsIDB4MGM4NjAwMDAsCisJMHgwMDAwMDAwMCwgMHgwNjk4MDAwMCwgMHgwMDAwMDAwOCwgMHgwZjgwMDAwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDEwLCAweDAwOWYwMDAwLCAweDAwMDAwMDEwLCAweGIxOTczMjEwLCAweDAwMDAwMDAwLCAweDIzMWIwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwNDM2MDAsIDB4MDAwMDAwMDMsIDB4ODM4NGEwMDAsIDB4MDAwMDAwMGYsIDB4NjU4NzAwMTAsCisJMHgwMDAwMDAwOSwgMHgyNjA3ZmZmZiwgMHgwMDAwMDAwMCwgMHgyNzExMWEwMCwgMHgwMDAwMDAwMCwgMHg2NjkwMDAwMCwKKwkweDAwMDAwMDBjLCAweDI5MDAwMDAwLCAweDAwMDAwMDE4LCAweDgwMDAwMWRlLCAweDAwMDAwMDAwLCAweDA2OTgwMDAwLAorCTB4MDAwMDAwMTAsIDB4MjA1MzAwMDAsIDB4MDAwMDAwMDAsIDB4MjJjNThjMDAsIDB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsCisJMHgwMDAwMDAwOCwgMHgwZjgwMDAwMywgMHgwMDAwMDAxOCwgMHg4MDAwZmZmMCwgMHgwMDAwMDAwMCwgMHgwMjA0MzYwMCwKKwkweDAwMDAwMDAwLCAweDIzMWIwMDAwLCAweDAwMDAwMDAzLCAweDgzODRhMDAwLCAweDAwMDAwMDBmLCAweDY1ODcwMDEwLAorCTB4MDAwMDAwMDksIDB4MjYwN2ZmZmYsIDB4MDAwMDAwMDAsIDB4MjcxMTFhMDAsIDB4MDAwMDAwMDAsIDB4NjY5MDAwMDAsCisJMHgwMDAwMDAwYywgMHgyOTAwMDAwMCwgMHgwMDAwMDAxMCwgMHg5MTg0MGEwMiwgMHgwMDAwMDAwMiwgMHgyMTQyMTgwMCwKKwkweDAwMDAwMDAwLCAweDMyMTQwMDAwLCAweDAwMDAwMDAwLCAweDMyOTUwMDAwLCAweDAwMDAwMDA1LCAweDczZTcyYzAwLAorCTB4MDAwMDAwMDUsIDB4NzQ2ODMwMDAsIDB4MDAwMDAwMDAsIDB4MzMxNzAwMDAsIDB4MDAwMDAwMTgsIDB4ODAwMDAxMzgsCisJMHgwMDAwMDAxMCwgMHg5MWM2MDAwNCwgMHgwMDAwMDAwOCwgMHgwNzAwMDAwNCwgMHgwMDAwMDAxMCwgMHhiMWM0MWMwMiwKKwkweDAwMDAwMDEwLCAweDkxODQwYTA0LCAweDAwMDAwMDE4LCAweDgwMDAwMWMzLCAweDAwMDAwMDEwLCAweDIwNTMwMDAwLAorCTB4MDAwMDAwMDAsIDB4MjJjNThjMDAsIDB4MDAwMDAwMTAsIDB4YjE4NDBhOGUsIDB4MDAwMDAwMGMsIDB4MjE0MjAwMDYsCisJMHgwMDAwMDAxMCwgMHgwY2U3MDAxYSwgMHgwMDAwMDAwZiwgMHg0MzY4MDAxMCwgMHgwMDAwMDAwMCwgMHgwM2YzMGMwMCwKKwkweDAwMDAwMDEwLCAweDkxODcwODUwLCAweDAwMDAwMDBmLCAweDQ2ZWMwMDEwLCAweDAwMDAwMDEwLCAweGI2OGQwYzRlLAorCTB4MDAwMDAwMDAsIDB4ODM4ZDBjMDAsIDB4MDAwMDAwMDAsIDB4YTMwNTA4MDAsIDB4MDAwMDAwMDEsIDB4YTM0NjBlMDAsCisJMHgwMDAwMDAwMCwgMHgwMjA0OGMwMCwgMHgwMDAwMDAxMCwgMHg5MTg0MGEwMiwgMHgwMDAwMDAwMiwgMHgyMTQyMTgwMCwKKwkweDAwMDAwMDEwLCAweDAwMWYwMDAwLCAweDAwMDAwMDA4LCAweDIyMDAwMDA4LCAweDAwMDAwMDAzLCAweDgzODRhMDAwLAorCTB4MDAwMDAwMGYsIDB4NjU4NzAwMTAsIDB4MDAwMDAwMDksIDB4MjYwN2ZmZmYsIDB4MDAwMDAwMDAsIDB4Mjc3NTBjMDAsCisJMHgwMDAwMDAwMCwgMHg2NmY0MDAwMCwgMHgwMDAwMDAwYywgMHgyOTAwMDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwMDFhYSwKKwkweDAwMDAwMDAwLCAweDAzMDY4YzAwLCAweDAwMDAwMDAzLCAweGY0NjgwYzAwLCAweDAwMDAwMDEwLCAweDIwNTMwMDAwLAorCTB4MDAwMDAwMDAsIDB4MjJjNThjMDAsIDB4MDAwMDAwMTgsIDB4ODAwMGZmZTUsIDB4MDAwMDAwMDAsIDB4Mzk3NjAwMDAsCisJMHgwMDAwMDAwMCwgMHgzOTg0MDAwMCwgMHgwMDAwMDAwYywgMHgzM2U3MDAxOSwgMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwKKwkweDAwMDAwMDAwLCAweDAzMWUwMDAwLCAweDAwMDAwMDAwLCAweDA3NjBmZTAwLCAweDAwMDAwMDBmLCAweDBmMGUwMDA3LAorCTB4MDAwMDAwMDAsIDB4ODM4NTA4MDAsIDB4MDAwMDAwMDAsIDB4MGE3ZDAwMDAsIDB4MDAwMDAwMDAsIDB4MGFmZTAwMDAsCisJMHgwMDAwMDAwMCwgMHgwYjdmMDAwMCwgMHgwMDAwMDAwMCwgMHgwZDdhMDAwMCwgMHgwMDAwMDAwMCwgMHgwYzAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDBiZmMwMDAwLCAweDAwMDAwMDAwLCAweDBjOTcwZTAwLCAweDAwMDAwMDA4LCAweDBmODAwMDAzLAorCTB4MDAwMDAwMGYsIDB4NDc2NzAwMTAsIDB4MDAwMDAwMDgsIDB4MDcwZTAwMDEsIDB4MDAwMDAwMGIsIDB4YzM4MDAwZmYsCisJMHgwMDAwMDAwMiwgMHg0Mzg3MDAwMCwgMHgwMDAwMDAwMSwgMHgzM2U3MGUwMCwgMHgwMDAwMDAwZiwgMHgwMzhlMDAxMCwKKwkweDAwMDAwMDAyLCAweDMzZTcwZTAwLCAweDAwMDAwMDAwLCAweDI4ZjMwMDAwLCAweDAwMDAwMDEwLCAweDAwOWYwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwNDM2MDAsIDB4MDAwMDAwMTAsIDB4OTE4NDBhMDIsIDB4MDAwMDAwMDIsIDB4MjE0MjE4MDAsCisJMHgwMDAwMDAwOCwgMHgyMjAwMDAwNiwgMHgwMDAwMDAwMCwgMHgyMzFiMDAwMCwgMHgwMDAwMDAwMCwgMHgyM2ZmMDAwMCwKKwkweDAwMDAwMDAwLCAweDI0MWIwMDAwLCAweDAwMDAwMDAzLCAweDgzODRhMDAwLCAweDAwMDAwMDBmLCAweDY1ODcwMDEwLAorCTB4MDAwMDAwMDksIDB4MjYwN2ZmZmYsIDB4MDAwMDAwMDAsIDB4MjcxMTAwMDAsIDB4MDAwMDAwMDAsIDB4MjY5MDAwMDAsCisJMHgwMDAwMDAwYywgMHgyOTAwMDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwMDE3ZSwgMHgwMDAwMDAwMywgMHhmNDY4MzYwMCwKKwkweDAwMDAwMDAwLCAweDNhMTAwMDAwLCAweDAwMDAwMDAwLCAweDNhOTEwMDAwLCAweDAwMDAwMDAzLCAweGY2NmMyNDAwLAorCTB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsIDB4MDAwMDAwMTAsIDB4YjE5MjM2MDQsIDB4MDAwMDAwMDgsIDB4MGY4MDAwMDQsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgwMDlmMDAwMCwgMHgwMDAwMDAwMCwgMHgzZTE3MDAwMCwKKwkweDAwMDAwMDAwLCAweDNlOTQwMDAwLCAweDAwMDAwMDAwLCAweDNmMTUwMDAwLCAweDAwMDAwMDAwLCAweDNmOTYwMDAwLAorCTB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsIDB4MDAwMDAwMDAsIDB4MGYwNjAwMDAsIDB4MDAwMDAwMTAsIDB4MjA1MzAwMDAsCisJMHgwMDAwMDAwMCwgMHgyMmM1MzYwMCwgMHgwMDAwMDAxOCwgMHg4MDAwZmZhYywgMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwKKwkweDAwMDAwMDAwLCAweDAzMWUwMDAwLCAweDAwMDAwMDAwLCAweDgzODUwODAwLCAweDAwMDAwMDA5LCAweDA3NjAwMGZmLAorCTB4MDAwMDAwMGYsIDB4MGYwZTAwMDcsIDB4MDAwMDAwMDAsIDB4MGMwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MGE3ZDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwYWZlMDAwMCwgMHgwMDAwMDAwMCwgMHgwYjdmMDAwMCwgMHgwMDAwMDAwMCwgMHgwZDdhMDAwMCwKKwkweDAwMDAwMDAwLCAweDBiZmMwMDAwLCAweDAwMDAwMDAwLCAweDBjOTcwZTAwLCAweDAwMDAwMDA4LCAweDBmODAwMDAzLAorCTB4MDAwMDAwMGYsIDB4NDc2NzAwMTAsIDB4MDAwMDAwMDgsIDB4MDcwZTAwMDEsIDB4MDAwMDAwMGIsIDB4YzM4MDAwZmYsCisJMHgwMDAwMDAwMiwgMHg0Mzg3MDAwMCwgMHgwMDAwMDAwMSwgMHgzM2U3MGUwMCwgMHgwMDAwMDAwZiwgMHgwMzhlMDAxMCwKKwkweDAwMDAwMDAyLCAweDMzZTcwZTAwLCAweDAwMDAwMDAwLCAweDM5ODQwMDAwLCAweDAwMDAwMDAzLCAweGI5NzIwODAwLAorCTB4MDAwMDAwMDAsIDB4MjhmMzAwMDAsIDB4MDAwMDAwMGYsIDB4NjU2ODAwMTAsIDB4MDAwMDAwMTAsIDB4MDA5ZjAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjA0MzYwMCwgMHgwMDAwMDAxMCwgMHg5MTg0MGEwMiwgMHgwMDAwMDAwMiwgMHgyMTQyMTgwMCwKKwkweDAwMDAwMDA4LCAweDIyMDAwMDA3LCAweDAwMDAwMDAwLCAweDIzMWIwMDAwLCAweDAwMDAwMDAwLCAweDIzZmYwMDAwLAorCTB4MDAwMDAwMDAsIDB4MjQxYjAwMDAsIDB4MDAwMDAwMDMsIDB4ODM4NGEwMDAsIDB4MDAwMDAwMGYsIDB4NjU4NzAwMTAsCisJMHgwMDAwMDAwOSwgMHgyNjA3ZmZmZiwgMHgwMDAwMDAwMCwgMHgyNzExMDAwMCwgMHgwMDAwMDAwMCwgMHgyNjkwMDAwMCwKKwkweDAwMDAwMDBjLCAweDI5MDAwMDAwLCAweDAwMDAwMDE4LCAweDgwMDAwMTQ1LCAweDAwMDAwMDAzLCAweGY0NjgzNjAwLAorCTB4MDAwMDAwMDAsIDB4M2ExMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2E5MTAwMDAsIDB4MDAwMDAwMDMsIDB4ZjY2YzI0MDAsCisJMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwgMHgwMDAwMDAxMCwgMHhiMTkyMzYwNCwgMHgwMDAwMDAwOCwgMHgwZjgwMDAwNCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDEwLCAweDAwOWYwMDAwLCAweDAwMDAwMDAwLCAweDNlMTcwMDAwLAorCTB4MDAwMDAwMDAsIDB4M2U5NDAwMDAsIDB4MDAwMDAwMDAsIDB4M2YxNTAwMDAsIDB4MDAwMDAwMDAsIDB4M2Y5NjAwMDAsCisJMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwgMHgwMDAwMDAwMCwgMHgwZjA2MDAwMCwgMHgwMDAwMDAxMCwgMHgyMDUzMDAwMCwKKwkweDAwMDAwMDAwLCAweDIyYzUzNjAwLCAweDAwMDAwMDE4LCAweDgwMDBmZjczLCAweDAwMDAwMDEwLCAweDBjZTcwMDA1LAorCTB4MDAwMDAwMDgsIDB4MmM4MDAwMGMsIDB4MDAwMDAwMDgsIDB4MmQwMDAwNzAsIDB4MDAwMDAwMDgsIDB4MmQ4MDAwMTAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgyMDVmMDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwMDExZCwKKwkweDAwMDAwMDAwLCAweDJjMWUwMDAwLCAweDAwMDAwMDA4LCAweDJjODAwMGI4LCAweDAwMDAwMDA4LCAweDJkMDAwMDEwLAorCTB4MDAwMDAwMDgsIDB4MmQ4MDAwNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsCisJMHgwMDAwMDAxOCwgMHg4MDAwZmU1ZCwgMHgwMDAwMDAwYywgMHgyOTgwMDAwMSwgMHgwMDAwMDAwMCwgMHgyYTAwMDAwMCwKKwkweDAwMDAwMDEwLCAweDAwMWYwMDAwLCAweDAwMDAwMDAwLCAweDBmMDA4MDAwLCAweDAwMDAwMDA4LCAweDBmODAwMDA3LAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwMDYsIDB4MDAwMDAwMGMsIDB4Mjk4MDAwMDEsIDB4MDAwMDAwMDAsIDB4MmEwMDAwMDAsCisJMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwgMHgwMDAwMDAwZiwgMHgwZjQ3MDAwNywgMHgwMDAwMDAwOCwgMHgwZjgwMDAwOCwKKwkweDAwMDAwMDE4LCAweDgwMDAwMTE5LCAweDAwMDAwMDEwLCAweDIwNTMwMDAwLCAweDAwMDAwMDE4LCAweDgwMDBmZTRmLAorCTB4MDAwMDAwMGMsIDB4Mjk4MDAwMDEsIDB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsIDB4MDAwMDAwMDAsIDB4MmZkNTAwMDAsCisJMHgwMDAwMDAwMCwgMHgyYTAwMDAwMCwgMHgwMDAwMDAwOSwgMHgwMjYxZmZmZiwgMHgwMDAwMDAwZCwgMHg3MGUxMDAwMSwKKwkweDAwMDAwMDE4LCAweDgwMDAwMTAxLCAweDAwMDAwMDAwLCAweDJjNDAwMDAwLCAweDAwMDAwMDA4LCAweDJjODAwMGM0LAorCTB4MDAwMDAwMDgsIDB4MmQwMDAwMWMsIDB4MDAwMDAwMDgsIDB4MmQ4MDAwMDEsIDB4MDAwMDAwMDUsIDB4NzBlMTA4MDAsCisJMHgwMDAwMDAxMCwgMHg5MWRlMDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwZmU0MSwgMHgwMDAwMDAwYywgMHgyOTgwMDAwMSwKKwkweDAwMDAwMDEwLCAweDkxZGUwMDAwLCAweDAwMDAwMDAwLCAweDJmZDUwMDAwLCAweDAwMDAwMDEwLCAweDAwMWYwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDI3MDAwMDAsIDB4MDAwMDAwMDAsIDB4MGQ2MjAwMDAsIDB4MDAwMDAwMDAsIDB4YmI2MzA4MDAsCisJMHgwMDAwMDAwMCwgMHgyYTAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwZjQwMDAwMCwgMHgwMDAwMDAwMCwgMHgyYzQwMDAwMCwKKwkweDAwMDAwMDBjLCAweDczZTcwMDFiLCAweDAwMDAwMDEwLCAweDBjZTcwMDBlLCAweDAwMDAwMDAwLCAweDI4NmQwMDAwLAorCTB4MDAwMDAwMGYsIDB4NjVlZDAwMTAsIDB4MDAwMDAwMDksIDB4MjY2ZGZmZmYsIDB4MDAwMDAwMTgsIDB4ODAwMDAwNjksCisJMHgwMDAwMDAwOCwgMHgwMjAwMDAwNCwgMHgwMDAwMDAxMCwgMHg5MWM0MDgwMywgMHgwMDAwMDAxOCwgMHg4MDAwMDBmNiwKKwkweDAwMDAwMDEwLCAweDIwNTMwMDAwLCAweDAwMDAwMDE4LCAweDgwMDAwMGU1LCAweDAwMDAwMDA4LCAweDJjODAwMGI4LAorCTB4MDAwMDAwMDgsIDB4MmQwMDAwMTAsIDB4MDAwMDAwMDgsIDB4MmQ4MDAwNDgsIDB4MDAwMDAwMTgsIDB4ODAwMDAwMDUsCisJMHgwMDAwMDAwOCwgMHgyYzgwMDBjNCwgMHgwMDAwMDAwOCwgMHgyZDAwMDAxYywgMHgwMDAwMDAwOCwgMHgyZDgwMDAwMSwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDEwLCAweDIwNWYwMDAwLCAweDAwMDAwMDA4LCAweDJjODAwMDQ4LAorCTB4MDAwMDAwMDgsIDB4MmQwMDAwNjgsIDB4MDAwMDAwMDgsIDB4MmQ4MDAxMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAxMCwgMHg5MWRlMDAwMCwgMHgwMDAwMDAwMCwgMHgyN2Y2MDAwMCwgMHgwMDAwMDAxMCwgMHhiODdhOWUwNCwKKwkweDAwMDAwMDA4LCAweDIyMDAwMDBkLCAweDAwMDAwMDE4LCAweDgwMDAwMGUyLCAweDAwMDAwMDEwLCAweDIwNTMwMDAwLAorCTB4MDAwMDAwMTgsIDB4ODAwMGZlMTgsIDB4MDAwMDAwMGMsIDB4Mjk4MDAwMDEsIDB4MDAwMDAwMTAsIDB4OTFkZTAwMDAsCisJMHgwMDAwMDAwMCwgMHgyZmQ1MDAwMCwgMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjcwMDAwMCwKKwkweDAwMDAwMDAwLCAweDBkNjIwMDAwLCAweDAwMDAwMDAwLCAweGJiNjMwODAwLCAweDAwMDAwMDAwLCAweDJhMDAwMDAwLAorCTB4MDAwMDAwMTAsIDB4MGU2NzAwMTEsIDB4MDAwMDAwMDAsIDB4Mjg2ZDAwMDAsIDB4MDAwMDAwMGYsIDB4NjVlZDAwMTAsCisJMHgwMDAwMDAwOSwgMHgyNjZkZmZmZiwgMHgwMDAwMDAwNCwgMHhiOGYxYTAwMCwgMHgwMDAwMDAwMCwgMHgwZjQwMDAwMCwKKwkweDAwMDAwMDBjLCAweDczZTcwMDFjLCAweDAwMDAwMDE4LCAweDgwMDAwMDQwLCAweDAwMDAwMDA4LCAweDAyMDAwMDA0LAorCTB4MDAwMDAwMTAsIDB4OTFjNDA4MDIsIDB4MDAwMDAwMTgsIDB4ODAwMDAwY2QsIDB4MDAwMDAwMDAsIDB4MmMxZTAwMDAsCisJMHgwMDAwMDAwOCwgMHgyYzgwMDBiOCwgMHgwMDAwMDAwOCwgMHgyZDAwMDAxMCwgMHgwMDAwMDAwOCwgMHgyZDgwMDA0OCwKKwkweDAwMDAwMDEwLCAweDIwNTMwMDAwLCAweDAwMDAwMDEwLCAweDkxZGUwMDAwLCAweDAwMDAwMDE4LCAweDgwMDBmZGZlLAorCTB4MDAwMDAwMGMsIDB4Mjk4MDAwMDEsIDB4MDAwMDAwMDAsIDB4MDM1NTAwMDAsIDB4MDAwMDAwMDAsIDB4MDY0NjAwMDAsCisJMHgwMDAwMDAwMCwgMHgwM2Q2MDAwMCwgMHgwMDAwMDAwMCwgMHgyYTAwMDAwMCwgMHgwMDAwMDAwZiwgMHgwZjQ4MDAwNywKKwkweDAwMDAwMDEwLCAweGIxOGMwMDI3LCAweDAwMDAwMDBmLCAweDQ3NDIwMDA4LCAweDAwMDAwMDA5LCAweDA3MGUwMDBmLAorCTB4MDAwMDAwMDgsIDB4MDcwZTAwMDgsIDB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsIDB4MDAwMDAwMDgsIDB4MDkwMDAwMDEsCisJMHgwMDAwMDAwNywgMHgwOTEyMWMwMCwgMHgwMDAwMDAwMywgMHhjYmNhOTIwMCwgMHgwMDAwMDAwMCwgMHgwYjk3YTIwMCwKKwkweDAwMDAwMDA3LCAweDRiMTcxYzAwLCAweDAwMDAwMDBmLCAweDBhOTYwMDAzLCAweDAwMDAwMDAwLCAweDBhOTU5YzAwLAorCTB4MDAwMDAwMDAsIDB4NGEwMDlhMDAsIDB4MDAwMDAwMDgsIDB4ODIxMjAwMDEsIDB4MDAwMDAwMDEsIDB4MGMxNzA4MDAsCisJMHgwMDAwMDAwMCwgMHgwMjE4MDAwMCwgMHgwMDAwMDAwMCwgMHgwYzk3MTgwMCwgMHgwMDAwMDAwOCwgMHgwZDAwZmZmZiwKKwkweDAwMDAwMDA4LCAweDBmODAwMDA2LCAweDAwMDAwMDBjLCAweDI5MDAwMDAwLCAweDAwMDAwMDA4LCAweDIyMDAwMDAxLAorCTB4MDAwMDAwMDAsIDB4MjJjNTBjMDAsIDB4MDAwMDAwMTAsIDB4MDA5ZjAwMDAsIDB4MDAwMDAwMTAsIDB4YjE5NzMyMGIsCisJMHgwMDAwMDAwMCwgMHgyMzFiMDAwMCwgMHgwMDAwMDAwMCwgMHgyNzExMDgwMCwgMHgwMDAwMDAwMCwgMHg2NjkwMDAwMCwKKwkweDAwMDAwMDE4LCAweDgwMDAwMGE0LCAweDAwMDAwMDAwLCAweDAyMTgwMDAwLCAweDAwMDAwMDEwLCAweDIwNTMwMDAwLAorCTB4MDAwMDAwMDAsIDB4MjJjNTM2MDAsIDB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsIDB4MDAwMDAwMDgsIDB4MGY4MDAwMDYsCisJMHgwMDAwMDAxOCwgMHg4MDAwZmZmNSwgMHgwMDAwMDAxMCwgMHg5MTg3MDAwMiwgMHgwMDAwMDAwOCwgMHgyMjAwMDAwYSwKKwkweDAwMDAwMDAwLCAweDIzMWIwMDAwLCAweDAwMDAwMDAwLCAweDI3MTEwODAwLCAweDAwMDAwMDAwLCAweDY2OTAwMDAwLAorCTB4MDAwMDAwMTgsIDB4ODAwMDAwOTgsIDB4MDAwMDAwMDgsIDB4MDIwMDAwMGEsIDB4MDAwMDAwMTAsIDB4OTFjNDA4MDQsCisJMHgwMDAwMDAxMCwgMHgwMmMyMDAwMywgMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwgMHgwMDAwMDAwOCwgMHgwZjgwMDAwOCwKKwkweDAwMDAwMDEwLCAweDIwNTMwMDAwLCAweDAwMDAwMDE4LCAweDgwMDBmZGM5LCAweDAwMDAwMDAwLCAweDA2ODIwMDAwLAorCTB4MDAwMDAwMTAsIDB4MDAxZjAwMDAsIDB4MDAwMDAwMTAsIDB4MGNlNzAwMjgsIDB4MDAwMDAwMDAsIDB4MDM3MjAwMDAsCisJMHgwMDAwMDAwMCwgMHhhODc2MGMwMCwgMHgwMDAwMDAwMCwgMHgwY2Y2MDAwMCwgMHgwMDAwMDAxMCwgMHhiODcyMzIyNCwKKwkweDAwMDAwMDAwLCAweDAzNDQwMDAwLCAweDAwMDAwMDA4LCAweDIyMDAwMDEwLCAweDAwMDAwMDAwLCAweDAzY2EwMDAwLAorCTB4MDAwMDAwMGYsIDB4NjU2ODAwMTAsIDB4MDAwMDAwMDAsIDB4MGJjZjAwMDAsIDB4MDAwMDAwMDAsIDB4MjdmMjAwMDAsCisJMHgwMDAwMDAxMCwgMHhiN2VmMzIwMywgMHgwMDAwMDAwYywgMHgyMTQyMDAwNCwgMHgwMDAwMDAwYywgMHg3M2U3MDAxOSwKKwkweDAwMDAwMDAwLCAweDA3NTIwMDAwLCAweDAwMDAwMDAwLCAweDI5MDAwMDAwLCAweDAwMDAwMDE4LCAweDgwMDAwMDdlLAorCTB4MDAwMDAwMDQsIDB4Yjk3MjMyMDAsIDB4MDAwMDAwMTAsIDB4MjA1MzAwMDAsIDB4MDAwMDAwMDAsIDB4MjIwNjAwMDAsCisJMHgwMDAwMDAwYywgMHg2MTQyMDAwNCwgMHgwMDAwMDAwMCwgMHgyNTA3MDAwMCwgMHgwMDAwMDAwMCwgMHgyNzk3MDAwMCwKKwkweDAwMDAwMDAwLCAweDI5MGUwMDAwLCAweDAwMDAwMDEwLCAweDBjZTcwMDEwLCAweDAwMDAwMDEwLCAweGI4NzMzMjBmLAorCTB4MDAwMDAwMGYsIDB4NDM2YzAwMTAsIDB4MDAwMDAwMDAsIDB4MDNmMzBjMDAsIDB4MDAwMDAwMDAsIDB4MDNmMzAwMDAsCisJMHgwMDAwMDAwMCwgMHg4Mzk5MGUwMCwgMHgwMDAwMDAwMSwgMHg4Mzg2MGUwMCwgMHgwMDAwMDAwMCwgMHg4MzA2MGUwMCwKKwkweDAwMDAwMDAzLCAweGY2NmMwYzAwLCAweDAwMDAwMDAwLCAweDM5ZjMwZTAwLCAweDAwMDAwMDAwLCAweDNhZjUwZTAwLAorCTB4MDAwMDAwMDAsIDB4N2E3NDAwMDAsIDB4MDAwMDAwMGYsIDB4NDM2ODAwMTAsIDB4MDAwMDAwMDEsIDB4ODM4NjBlMDAsCisJMHgwMDAwMDAwMCwgMHg4MzA2MGUwMCwgMHgwMDAwMDAwMywgMHhmNDY4MGMwMCwgMHgwMDAwMDAwMCwgMHgyODZkMDAwMCwKKwkweDAwMDAwMDAwLCAweDAzNjkwMDAwLCAweDAwMDAwMDEwLCAweGIxZjYwYzU0LCAweDAwMDAwMDAwLCAweDBhNmEwMDAwLAorCTB4MDAwMDAwMDAsIDB4MGFlYjAwMDAsIDB4MDAwMDAwMDksIDB4MGI2Y2ZmZmYsIDB4MDAwMDAwMDAsIDB4MGMwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwYmU5MDAwMCwgMHgwMDAwMDAwMywgMHg4Y2Y2YTAwMCwgMHgwMDAwMDAwYywgMHgwOTgwMDAwMiwKKwkweDAwMDAwMDEwLCAweDAwOWYwMDAwLCAweDAwMDAwMDEwLCAweGI4MTczMjA5LCAweDAwMDAwMDAwLCAweDM1MTQwMDAwLAorCTB4MDAwMDAwMDAsIDB4MzU5NTAwMDAsIDB4MDAwMDAwMDUsIDB4NzY2YzJjMDAsIDB4MDAwMDAwMDAsIDB4MzQ5NzAwMDAsCisJMHgwMDAwMDAwNCwgMHhiOGYxMmUwMCwgMHgwMDAwMDAxMCwgMHgwMDFmMDAwMCwgMHgwMDAwMDAwOCwgMHgwZjgwMDAwNCwKKwkweDAwMDAwMDE4LCAweDgwMDBmZmY3LCAweDAwMDAwMDAwLCAweDAzZTkwMDAwLCAweDAwMDAwMDEwLCAweGI4ZjZhMDFhLAorCTB4MDAwMDAwMTAsIDB4MjAxMzAwMTksIDB4MDAwMDAwMTAsIDB4YjFmMTBlMTgsIDB4MDAwMDAwMDAsIDB4ODM5NzMyMDAsCisJMHgwMDAwMDAwMCwgMHgzODcwMGUwMCwgMHgwMDAwMDAwMCwgMHhiYjc2MGUwMCwgMHgwMDAwMDAwMCwgMHgzN2QwMDAwMCwKKwkweDAwMDAwMDBjLCAweDczZTcwMDFhLCAweDAwMDAwMDAzLCAweGI4ZjFhMDAwLCAweDAwMDAwMDAwLCAweDMyMTQwMDAwLAorCTB4MDAwMDAwMDAsIDB4MzI5NTAwMDAsIDB4MDAwMDAwMDUsIDB4NzNlNzJjMDAsIDB4MDAwMDAwMDAsIDB4MzMxOTAwMDAsCisJMHgwMDAwMDAwNSwgMHg3NDY4MDAwMCwgMHgwMDAwMDAxMCwgMHgwY2U3MDAwZCwgMHgwMDAwMDAwOCwgMHgyMjAwMDAwOSwKKwkweDAwMDAwMDAwLCAweDA3NTIwMDAwLCAweDAwMDAwMDAwLCAweDI5MDAwMDAwLCAweDAwMDAwMDBjLCAweDczZTcwMDE5LAorCTB4MDAwMDAwMGYsIDB4NjU2ODAwMTAsIDB4MDAwMDAwMGMsIDB4MjE0MjAwMDQsIDB4MDAwMDAwMTgsIDB4ODAwMDAwM2MsCisJMHgwMDAwMDAxMCwgMHgyMDUzMDAwMCwgMHgwMDAwMDAwYywgMHg2MTQyMDAwNCwgMHgwMDAwMDAwMCwgMHgyOTBlMDAwMCwKKwkweDAwMDAwMDE4LCAweDgwMDAwMDAyLCAweDAwMDAwMDEwLCAweDkxOTczMjA2LCAweDAwMDAwMDAwLCAweDM1MTQwMDAwLAorCTB4MDAwMDAwMDAsIDB4MzU5NTAwMDAsIDB4MDAwMDAwMDUsIDB4NzY2YzJjMDAsIDB4MDAwMDAwMDAsIDB4MzQ5OTAwMDAsCisJMHgwMDAwMDAwNCwgMHhiOGYxMzIwMCwgMHgwMDAwMDAwMCwgMHg4MzY5MGMwMCwgMHgwMDAwMDAxMCwgMHhiMTg2MDAxMywKKwkweDAwMDAwMDAwLCAweDI4ZTkwMDAwLCAweDAwMDAwMDA4LCAweDIyMDAwMDA0LCAweDAwMDAwMDAwLCAweDIzZWMwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDM2OTAwMDAsIDB4MDAwMDAwMTAsIDB4Yjg2NjBjMDcsIDB4MDAwMDAwMDksIDB4MDM2Y2ZmZmYsCisJMHgwMDAwMDAwMCwgMHgzMjZhMDAwMCwgMHgwMDAwMDAwMCwgMHgzMmViMDAwMCwgMHgwMDAwMDAwNSwgMHg3M2U3MGMwMCwKKwkweDAwMDAwMDAwLCAweDMzNjkwMDAwLCAweDAwMDAwMDA1LCAweDc0NjgwMDAwLCAweDAwMDAwMDBjLCAweDczZTcwMDFjLAorCTB4MDAwMDAwMDAsIDB4MDM2OTAwMDAsIDB4MDAwMDAwMTAsIDB4YjFmNjBjMTIsIDB4MDAwMDAwMTAsIDB4YjFkMDBjMTEsCisJMHgwMDAwMDAwYywgMHgyMTQyMDAwNSwgMHgwMDAwMDAwYywgMHgzM2U3MDAxYywgMHgwMDAwMDAxOCwgMHg4MDAwMDAwZSwKKwkweDAwMDAwMDEwLCAweDJlNjcwMDBkLCAweDAwMDAwMDAwLCAweDAzNjkwMDAwLCAweDAwMDAwMDEwLCAweGIxZjYwYzBiLAorCTB4MDAwMDAwMTAsIDB4YjFkMDBjMGEsIDB4MDAwMDAwMDAsIDB4MDM0NDAwMDAsIDB4MDAwMDAwMDgsIDB4MjIwMDAwMGMsCisJMHgwMDAwMDAwMCwgMHgwNzUyMDAwMCwgMHgwMDAwMDAwMCwgMHgyOTAwMDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwMDAxNSwKKwkweDAwMDAwMDBjLCAweDMzZTcwMDFjLCAweDAwMDAwMDEwLCAweDIwNTMwMDAwLCAweDAwMDAwMDAwLCAweDIyMDYwMDAwLAorCTB4MDAwMDAwMDAsIDB4MjkwZTAwMDAsIDB4MDAwMDAwMTgsIDB4MDAwZDAwMDAsIDB4MDAwMDAwMDAsIDB4MDY4MjAwMDAsCisJMHgwMDAwMDAxMCwgMHgyZGU3MDAwZCwgMHgwMDAwMDAxMCwgMHgwY2U3MDAwYywgMHgwMDAwMDAwMCwgMHgyN2YyMDAwMCwKKwkweDAwMDAwMDEwLCAweGI5NmQ5ZTBhLCAweDAwMDAwMDAwLCAweGE4NmQ5ZTAwLCAweDAwMDAwMDA5LCAweDAzNjFmZmZmLAorCTB4MDAwMDAwMTAsIDB4Yjc1MDBjMDcsIDB4MDAwMDAwMDgsIDB4MjIwMDAwMGYsIDB4MDAwMDAwMGYsIDB4NjU2ODAwMTAsCisJMHgwMDAwMDAwMCwgMHgyOTAwMDAwMCwgMHgwMDAwMDAxOCwgMHg4MDAwMDAwNCwgMHgwMDAwMDAwYywgMHgzM2U3MDAxYiwKKwkweDAwMDAwMDEwLCAweDIwNTMwMDAwLCAweDAwMDAwMDE4LCAweDAwMGQwMDAwLCAweDAwMDAwMDAwLCAweDJiODIwMDAwLAorCTB4MDAwMDAwMTAsIDB4MjBkMjAwMmYsIDB4MDAwMDAwMTAsIDB4MDA1MjAwMmUsIDB4MDAwMDAwMDksIDB4MDU0ZTAwMDcsCisJMHgwMDAwMDAxMCwgMHhiMThhMDAyYywgMHgwMDAwMDAwMCwgMHgwNTBhOGMwMCwgMHgwMDAwMDAwOCwgMHg4NTBhMDAwOCwKKwkweDAwMDAwMDEwLCAweDkxOGEwMDI5LCAweDAwMDAwMDAzLCAweGM1MDA4ODAwLCAweDAwMDAwMDA4LCAweGEzNDYwMDAxLAorCTB4MDAwMDAwMTAsIDB4YjFjNjAwMDcsIDB4MDAwMDAwMDgsIDB4MjIwMDAwMDEsIDB4MDAwMDAwMGMsIDB4Mjk4MDAwMDAsCisJMHgwMDAwMDAxMCwgMHgyMDUzMDAwMCwgMHgwMDAwMDAwMCwgMHgyNzRlOGMwMCwgMHgwMDAwMDAwMCwgMHg2NmNkMDAwMCwKKwkweDAwMDAwMDAwLCAweDIyYzU4YzAwLCAweDAwMDAwMDA4LCAweDIyMDAwMDE0LCAweDAwMDAwMDAzLCAweDIyYzU4ZTAwLAorCTB4MDAwMDAwMDMsIDB4MjNjNThlMDAsIDB4MDAwMDAwMDMsIDB4MjJjNThlMDAsIDB4MDAwMDAwMDMsIDB4MjZjZDllMDAsCisJMHgwMDAwMDAwMywgMHgyN2NkOWUwMCwgMHgwMDAwMDAwMywgMHgyNmNkOWUwMCwgMHgwMDAwMDAwMywgMHgyNzRlYTAwMCwKKwkweDAwMDAwMDAzLCAweDI4NGVhMDAwLCAweDAwMDAwMDAzLCAweDI3NGVhMDAwLCAweDAwMDAwMDBjLCAweDY5NTIwMDAwLAorCTB4MDAwMDAwMGMsIDB4Mjk4MDAwMDAsIDB4MDAwMDAwMTAsIDB4MjA1MzAwMDAsIDB4MDAwMDAwMDMsIDB4MjJjNThlMDAsCisJMHgwMDAwMDAwMywgMHgyM2M1OGUwMCwgMHgwMDAwMDAwMywgMHgyMmM1OGUwMCwgMHgwMDAwMDAwMywgMHgyNmNkOWUwMCwKKwkweDAwMDAwMDAzLCAweDI3Y2Q5ZTAwLCAweDAwMDAwMDAzLCAweDI2Y2Q5ZTAwLCAweDAwMDAwMDAzLCAweDI3NGVhMDAwLAorCTB4MDAwMDAwMDMsIDB4Mjg0ZWEwMDAsIDB4MDAwMDAwMDMsIDB4Mjc0ZWEwMDAsIDB4MDAwMDAwMDAsIDB4YTJjNThjMDAsCisJMHgwMDAwMDAwMCwgMHhhNzRlOGMwMCwgMHgwMDAwMDAwMCwgMHhlNmNkMDAwMCwgMHgwMDAwMDAwZiwgMHg2MjBhMDAxMCwKKwkweDAwMDAwMDA4LCAweDIzNDYwMDAxLCAweDAwMDAwMDBjLCAweDI5ODAwMDAwLCAweDAwMDAwMDEwLCAweDIwNTMwMDAwLAorCTB4MDAwMDAwMGMsIDB4Mjk1MjAwMDAsIDB4MDAwMDAwMTgsIDB4ODAwMDAwMDIsIDB4MDAwMDAwMGMsIDB4Mjk4MDAwMDAsCisJMHgwMDAwMDAxOCwgMHgwMDU3MDAwMCB9OworCitzdGF0aWMgY29uc3QgaW50IGJueDJfVFBBVF9iMDZGd1JlbGVhc2VNYWpvciA9IDB4MTsKK3N0YXRpYyBjb25zdCBpbnQgYm54Ml9UUEFUX2IwNkZ3UmVsZWFzZU1pbm9yID0gMHgwOworc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndSZWxlYXNlRml4ID0gMHgwOworc3RhdGljIGNvbnN0IHUzMiBibngyX1RQQVRfYjA2RndTdGFydEFkZHIgPSAweDA4MDAwODYwOworc3RhdGljIGNvbnN0IHUzMiBibngyX1RQQVRfYjA2RndUZXh0QWRkciA9IDB4MDgwMDA4MDA7CitzdGF0aWMgY29uc3QgaW50IGJueDJfVFBBVF9iMDZGd1RleHRMZW4gPSAweDEyMmM7CitzdGF0aWMgY29uc3QgdTMyIGJueDJfVFBBVF9iMDZGd0RhdGFBZGRyID0gMHgwODAwMWE2MDsKK3N0YXRpYyBjb25zdCBpbnQgYm54Ml9UUEFUX2IwNkZ3RGF0YUxlbiA9IDB4MDsKK3N0YXRpYyBjb25zdCB1MzIgYm54Ml9UUEFUX2IwNkZ3Um9kYXRhQWRkciA9IDB4MDAwMDAwMDA7CitzdGF0aWMgY29uc3QgaW50IGJueDJfVFBBVF9iMDZGd1JvZGF0YUxlbiA9IDB4MDsKK3N0YXRpYyBjb25zdCB1MzIgYm54Ml9UUEFUX2IwNkZ3QnNzQWRkciA9IDB4MDgwMDFhYTA7CitzdGF0aWMgY29uc3QgaW50IGJueDJfVFBBVF9iMDZGd0Jzc0xlbiA9IDB4MjUwOworc3RhdGljIGNvbnN0IHUzMiBibngyX1RQQVRfYjA2RndTYnNzQWRkciA9IDB4MDgwMDFhNjA7CitzdGF0aWMgY29uc3QgaW50IGJueDJfVFBBVF9iMDZGd1Nic3NMZW4gPSAweDM0Oworc3RhdGljIHUzMiBibngyX1RQQVRfYjA2RndUZXh0WygweDEyMmMvNCkgKyAxXSA9IHsKKwkweDBhMDAwMjE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDc0NzA2MTc0LCAweDIwMzIyZTM1LAorCTB4MmUzMTMxMDAsIDB4MDIwNTBiMDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MTAwMDAwMDMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsIDB4M2MwMjA4MDAsCisJMHgyNDQyMWE2MCwgMHgzYzAzMDgwMCwgMHgyNDYzMWNmMCwgMHhhYzQwMDAwMCwgMHgwMDQzMjAyYiwgMHgxNDgwZmZmZCwKKwkweDI0NDIwMDA0LCAweDNjMWQwODAwLCAweDM3YmQyZmZjLCAweDAzYTBmMDIxLCAweDNjMTAwODAwLCAweDI2MTAwODYwLAorCTB4M2MxYzA4MDAsIDB4Mjc5YzFhNjAsIDB4MGUwMDA1NDYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4OGY4MjAwMTAsCisJMHg4YzQ1MDAwOCwgMHgyNDAzMDgwMCwgMHhhZjQzMDE3OCwgMHg5NzQzMDEwNCwgMHgzYzAyMDAwOCwgMHhhZjQyMDE0MCwKKwkweDhmODIwMDI0LCAweDMwNDIwMDAxLCAweDEwNDAwMDA3LCAweDMwNjlmZmZmLCAweDI0MDIwMDAyLCAweDI1MjNmZmZlLAorCTB4YTc0MjAxNDYsIDB4YTc0MzAxNDgsIDB4MGEwMDAyNDIsIDB4M2MwMjA4MDAsIDB4YTc0MDAxNDYsIDB4M2MwMjA4MDAsCisJMHg4YzQzMDgzYywgMHgxNDYwMDAwZSwgMHgyNDAyMGYwMCwgMHg4ZjgyMDAyNCwgMHgzMDQzMDAyMCwgMHgwMDAzMTgyYiwKKwkweDAwMDMxODIzLCAweDMwNjUwMDA5LCAweDMwNDIwYzAwLCAweDI0MDMwNDAwLCAweDE0NDMwMDAyLCAweDM0YTQwMDAxLAorCTB4MzRhNDAwMDUsIDB4YTc0NDAxNGEsIDB4MGEwMDAyNjQsIDB4M2MwMjA4MDAsIDB4OGY4MzAwMTQsIDB4MTQ2MjAwMDgsCisJMHgwMDAwMDAwMCwgMHg4ZjgyMDAyNCwgMHgzMDQyMDAyMCwgMHgwMDAyMTAyYiwgMHgwMDAyMTAyMywgMHgzMDQyMDAwZCwKKwkweDBhMDAwMjYyLCAweDM0NDIwMDA1LCAweDhmODIwMDI0LCAweDMwNDIwMDIwLCAweDAwMDIxMDJiLCAweDAwMDIxMDIzLAorCTB4MzA0MjAwMDksIDB4MzQ0MjAwMDEsIDB4YTc0MjAxNGEsIDB4M2MwMjA4MDAsIDB4OGM0MzA4MjAsIDB4OGY4NDAwMjQsCisJMHgzYzAyMDA0OCwgMHgwMDYyMTgyNSwgMHgzMDg0MDAwNiwgMHgyNDAyMDAwMiwgMHgxMDgyMDAwZCwgMHgyYzgyMDAwMywKKwkweDUwNDAwMDA1LCAweDI0MDIwMDA0LCAweDEwODAwMDEyLCAweDNjMDIwMDAxLCAweDBhMDAwMjg0LCAweDAwMDAwMDAwLAorCTB4MTA4MjAwMDcsIDB4MjQwMjAwMDYsIDB4MTQ4MjAwMGYsIDB4M2MwMjAxMTEsIDB4MGEwMDAyN2MsIDB4MDA2MjEwMjUsCisJMHgwYTAwMDI3YiwgMHgzYzAyMDEwMSwgMHgzYzAyMDAxMSwgMHgwMDYyMTAyNSwgMHgyNDAzMDAwMSwgMHhhZjQyMTAwMCwKKwkweGFmODMwMDIwLCAweDBhMDAwMjg0LCAweDAwMDAwMDAwLCAweDAwNjIxMDI1LCAweGFmNDIxMDAwLCAweGFmODAwMDIwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4OGY4MzAwMjAsIDB4MTA2MDAwM2YsCisJMHgzYzA0ODAwMCwgMHg4ZjQyMTAwMCwgMHgwMDQ0MTAyNCwgMHgxMDQwZmZmZCwgMHgwMDAwMDAwMCwgMHgxMDYwMDAzOSwKKwkweDAwMDAwMDAwLCAweDhmNDIxMDAwLCAweDNjMDMwMDIwLCAweDAwNDMxMDI0LCAweDEwNDAwMDM0LCAweDAwMDAwMDAwLAorCTB4OTc0MjEwMTQsIDB4MTQ0MDAwMzEsIDB4MDAwMDAwMDAsIDB4OTc0MjEwMDgsIDB4OGY4NDAwMTAsIDB4MjQ0MjAwMDYsCisJMHgwMDAyNDA4MiwgMHgwMDA4MTg4MCwgMHgwMDY0MzgyMSwgMHg4Y2U1MDAwMCwgMHgzMDQzMDAwMywgMHgzMDQyMDAwMSwKKwkweDEwNDAwMDA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDBhMDAwMmMzLCAweDAwMDgxMDgwLCAweDU0NjAwMDBmLAorCTB4MzBhNWZmZmYsIDB4M2MwNmZmZmYsIDB4MDBhNjI4MjQsIDB4MDAwNTE4MmIsIDB4MDBhNjEwMjYsIDB4MDAwMjEwMmIsCisJMHgwMDYyMTgyNCwgMHgxMDYwMDAwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDFmYiwKKwkweDhjZTIwMDAwLCAweDBhMDAwMmMyLCAweDAwNDYyODI1LCAweDAwMDUxODJiLCAweDM4YTJmZmZmLCAweDAwMDIxMDJiLAorCTB4MDA2MjE4MjQsIDB4MTA2MDAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MjQwMDAyMDUsCisJMHg4Y2UyMDAwMCwgMHgzNDQ1ZmZmZiwgMHgwMDA4MTA4MCwgMHgwMDQ0MTAyMSwgMHgzYzAzMDgwMCwgMHhhYzQ1MDAwMCwKKwkweDhjNjIwODMwLCAweDI0NDIwMDAxLCAweGFjNjIwODMwLCAweDhmODQwMDE4LCAweDAxMjAyODIxLCAweDI0ODIwMDA4LAorCTB4MzA0MjFmZmYsIDB4MjQ0MzQwMDAsIDB4MDM0M2Q4MjEsIDB4MzBhMzAwMDcsIDB4YWY4NDAwMGMsIDB4YWY4MjAwMTgsCisJMHhhZjQyMDA4NCwgMHgxMDYwMDAwMiwgMHgyNGEyMDAwNywgMHgzMDQ1ZmZmOCwgMHg4ZjgyMDAzMCwgMHg4Zjg0MDAwMCwKKwkweDAwNDUxODIxLCAweGFmODIwMDFjLCAweDAwNjQxMDJiLCAweGFmODMwMDMwLCAweDE0NDAwMDAyLCAweDAwNjQxMDIzLAorCTB4YWY4MjAwMzAsIDB4OGY4NDAwMzAsIDB4MzQwMjgwMDAsIDB4MDA4MjEwMjEsIDB4MDM0MjE4MjEsIDB4M2MwMjEwMDAsCisJMHhhZjgzMDAxMCwgMHhhZjQ0MDA4MCwgMHgwM2UwMDAwOCwgMHhhZjQyMDE3OCwgMHg4ZjgzMDAyNCwgMHgyN2JkZmZlMCwKKwkweGFmYmYwMDE4LCAweGFmYjEwMDE0LCAweDMwNjIwMjAwLCAweDE0NDAwMDA0LCAweGFmYjAwMDEwLCAweDAwMDAwMDBkLAorCTB4MDAwMDAwMDAsIDB4MjQwMDAyNDIsIDB4MDAwMzFhODIsIDB4MzA2MzAwMDMsIDB4MDAwMzEwYzAsIDB4MDA0MzEwMjEsCisJMHgwMDAyMTA4MCwgMHgwMDQzMTAyMSwgMHgwMDAyMTA4MCwgMHgzYzAzMDgwMCwgMHgyNDYzMWFhMCwgMHgwMDQzODgyMSwKKwkweDhlMjQwMDAwLCAweDEwODAwMDA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDI0MDAwMjRkLAorCTB4OGY4NTAwMTAsIDB4MjQwMjAwMDEsIDB4YWUyMjAwMDAsIDB4OGNhNzAwMDgsIDB4YTIyMDAwMDcsIDB4OGY2MjAwMDQsCisJMHgyNjMwMDAxNCwgMHgwMjAwMjAyMSwgMHgwMDAyMTQwMiwgMHhhMjIyMDAwNCwgMHgzMDQ2MDBmZiwgMHgyNGM2MDAwNSwKKwkweDBlMDAwNjczLCAweDAwMDYzMDgyLCAweDhmNjIwMDA0LCAweGE2MjIwMDA4LCAweDhmNDMwMTA4LCAweDNjMDIxMDAwLAorCTB4MDA2MjE4MjQsIDB4MTA2MDAwMDgsIDB4MDAwMDAwMDAsIDB4OTc0MjAxMDQsIDB4OTIyMzAwMDcsIDB4MjQ0MmZmZWMsCisJMHgzMDQ1ZmZmZiwgMHgzNDYzMDAwMiwgMHgwYTAwMDMyMSwgMHhhMjIzMDAwNywgMHg5NzQyMDEwNCwgMHgyNDQyZmZmMCwKKwkweDMwNDVmZmZmLCAweDhmNjIwMDA0LCAweDMwNDJmZmZmLCAweDJjNDIwMDEzLCAweDU0NDAwMDA1LCAweDkyMjMwMDA3LAorCTB4OTIyMjAwMDcsIDB4MzQ0MjAwMDEsIDB4YTIyMjAwMDcsIDB4OTIyMzAwMDcsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDksCisJMHgyODYyMDAwMiwgMHgxNDQwMDAxNCwgMHgyNDAyMDAwMiwgMHgxMDYyMDAxMiwgMHgyNDAyMDAwMywgMHgxMDYyMDAwYSwKKwkweDAwMDAwMDAwLCAweDBhMDAwMzQyLCAweDAwMDAwMDAwLCAweDhmODIwMDEwLCAweDhjNDMwMDBjLCAweDNjMDRmZmZmLAorCTB4MDA2NDE4MjQsIDB4MDA2NTE4MjUsIDB4MGEwMDAzNDIsIDB4YWM0MzAwMGMsIDB4OGY4MjAwMTAsIDB4OGM0MzAwMTAsCisJMHgzYzA0ZmZmZiwgMHgwMDY0MTgyNCwgMHgwMDY1MTgyNSwgMHhhYzQzMDAxMCwgMHg4ZjYyMDAwNCwgMHgzMDQyZmZmZiwKKwkweDI0NDIwMDAyLCAweDAwMDIxMDgzLCAweGEyMjIwMDA1LCAweDMwNDUwMGZmLCAweDhmODIwMDEwLCAweDNjMDRmZmZmLAorCTB4MDAwNTI4ODAsIDB4MDBhMjI4MjEsIDB4OGNhNzAwMDAsIDB4OTYyMjAwMDgsIDB4OTc0MzAxMDQsIDB4MDBlNDIwMjQsCisJMHgyNDQyMDAwMiwgMHgwMDYyMTgyMywgMHgwMDgzMzgyNSwgMHhhY2E3MDAwMCwgMHg5MjI0MDAwNSwgMHgwMDA0MTA4MCwKKwkweDAyMDIxMDIxLCAweDkwNDMwMDAwLCAweDNjMDVmZmY2LCAweDM0YTVmZmZmLCAweDMwNjMwMDBmLCAweDAwODMyMDIxLAorCTB4YTIyNDAwMDYsIDB4MzA4MjAwZmYsIDB4MjQ0MjAwMDMsIDB4MDAwMjEwODAsIDB4MDIwMjEwMjEsIDB4OGM0NjAwMDAsCisJMHgzMDgzMDBmZiwgMHg4ZjgyMDAxMCwgMHgzYzA0ZmYzZiwgMHgwMDAzMTg4MCwgMHgwMGM1MzgyNCwgMHgwMDYyMTgyMSwKKwkweGFlMjYwMDBjLCAweGFjNjcwMDBjLCAweDhlMjIwMDBjLCAweDkyMjMwMDA2LCAweDM0ODRmZmZmLCAweDAwNDQxMDI0LAorCTB4MjQ2MzAwMDMsIDB4MDAwMzE4ODAsIDB4MDIwMzE4MjEsIDB4MDBlNDIwMjQsIDB4YWUyMjAwMGMsIDB4YWM2NDAwMDAsCisJMHg5MjIyMDAwNiwgMHgyNDQyMDAwNCwgMHgwMDAyMTA4MCwgMHgwMjAyMTAyMSwgMHg5NDQ3MDAwMiwgMHhhYzQ3MDAwMCwKKwkweDkyMjMwMDA2LCAweDhmODIwMDEwLCAweDAwMDMxODgwLCAweDAwNjIxODIxLCAweDI0MDIwMDEwLCAweGFjNjcwMDEwLAorCTB4MjQwMzAwMDIsIDB4YTc0MjAxNDAsIDB4YTc0MDAxNDIsIDB4YTc0MDAxNDQsIDB4YTc0MzAxNDYsIDB4OTc0MjAxMDQsCisJMHgyNDAzMDAwMSwgMHgyNDQyZmZmZSwgMHhhNzQyMDE0OCwgMHhhNzQzMDE0YSwgMHg4ZjgyMDAyNCwgMHgyNDAzMDAwMiwKKwkweDMwNDQwMDA2LCAweDEwODMwMDBkLCAweDJjODIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDA0LCAweDEwODAwMDExLAorCTB4M2MwMjAwMDksIDB4MGEwMDAzYTUsIDB4MDAwMDAwMDAsIDB4MTA4MjAwMDcsIDB4MjQwMjAwMDYsIDB4MTQ4MjAwMGQsCisJMHgzYzAyMDExOSwgMHgwYTAwMDM5ZiwgMHgyNDAzMDAwMSwgMHgwYTAwMDM5ZSwgMHgzYzAyMDEwOSwgMHgzYzAyMDAxOSwKKwkweDI0MDMwMDAxLCAweGFmNDIxMDAwLCAweGFmODMwMDIwLCAweDBhMDAwM2E1LCAweDAwMDAwMDAwLCAweGFmNDIxMDAwLAorCTB4YWY4MDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4OTIyMjAwMDQsCisJMHgyNDAzMDAwOCwgMHg4Zjg0MDAyMCwgMHgyNDQyMDAwMiwgMHgzMDQyMDAwNywgMHgwMDYyMTgyMywgMHgzMDYzMDAwNywKKwkweDEwODAwMDA2LCAweGFlMjMwMDEwLCAweDNjMDM4MDAwLCAweDhmNDIxMDAwLCAweDAwNDMxMDI0LCAweDEwNDBmZmZkLAorCTB4MDAwMDAwMDAsIDB4OGY4MjAwMTgsIDB4YWY4MjAwMGMsIDB4MjQ0MjAwMTAsIDB4MzA0MjFmZmYsIDB4YWY4MjAwMTgsCisJMHhhZjQyMDA4NCwgMHg5NzQzMDEwNCwgMHgyNDQyNDAwMCwgMHgwMzQyZDgyMSwgMHgzMDYzZmZmZiwgMHgzMDYyMDAwNywKKwkweDEwNDAwMDAyLCAweDI0NjIwMDA3LCAweDMwNDNmZmY4LCAweDhmODIwMDMwLCAweDhmODQwMDAwLCAweDAwNDMxODIxLAorCTB4YWY4MjAwMWMsIDB4MDA2NDEwMmIsIDB4YWY4MzAwMzAsIDB4MTQ0MDAwMDIsIDB4MDA2NDEwMjMsIDB4YWY4MjAwMzAsCisJMHg4Zjg0MDAzMCwgMHgzNDAyODAwMCwgMHg4ZmJmMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwMDgyMTAyMSwKKwkweDAzNDIxODIxLCAweDNjMDIxMDAwLCAweGFmODMwMDEwLCAweGFmNDQwMDgwLCAweGFmNDIwMTc4LCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjAsIDB4OGY4MzAwMjQsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMTgsIDB4YWZiMTAwMTQsIDB4MzA2MjAyMDAsCisJMHgxNDQwMDAwNCwgMHhhZmIwMDAxMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDJlNCwgMHgwMDAzMWE4MiwKKwkweDMwNjMwMDAzLCAweDAwMDMxMGMwLCAweDAwNDMxMDIxLCAweDAwMDIxMDgwLCAweDAwNDMxMDIxLCAweDAwMDIxMDgwLAorCTB4M2MwMzA4MDAsIDB4MjQ2MzFhYTAsIDB4MDA0MzgwMjEsIDB4OGUwNDAwMDAsIDB4MTQ4MDAwMDQsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDJlOSwgMHg4ZjYyMDAwNCwgMHgwNDQxMDAwOCwgMHgyNjA1MDAxNCwKKwkweDkyMDIwMDA2LCAweDhlMDMwMDBjLCAweDI0NDIwMDAzLCAweDAwMDIxMDgwLCAweDAwYTIxMDIxLCAweGFjNDMwMDAwLAorCTB4YWUwMDAwMDAsIDB4OTIwMjAwMDUsIDB4MjQ0MjAwMDEsIDB4MDAwMjEwODAsIDB4MDBhMjEwMjEsIDB4OGM0MzAwMDAsCisJMHgzYzA0MDAwMSwgMHgwMDY0MTgyMSwgMHhhYzQzMDAwMCwgMHg5MjA2MDAwNCwgMHgyNzcxMDAwOCwgMHgwMjIwMjAyMSwKKwkweDI0YzYwMDA1LCAweDBlMDAwNjczLCAweDAwMDYzMDgyLCAweDkyMDQwMDA2LCAweDNjMDU3ZmZmLCAweDhmNjIwMDA0LAorCTB4MDAwNDIwODAsIDB4MDA5MTIwMjEsIDB4OGM4MzAwMDQsIDB4MzRhNWZmZmYsIDB4MDA0NTEwMjQsIDB4MDA2MjE4MjEsCisJMHhhYzgzMDAwNCwgMHg5MjA1MDAwNSwgMHgzYzA3ZmZmZiwgMHg5MjA0MDAwNCwgMHgwMDA1Mjg4MCwgMHgwMGIxMjgyMSwKKwkweDhjYTMwMDAwLCAweDk3NDIwMTA0LCAweDk2MDYwMDA4LCAweDAwNjcxODI0LCAweDAwNDQxMDIxLCAweDAwNDYxMDIzLAorCTB4MzA0MmZmZmYsIDB4MDA2MjE4MjUsIDB4YWNhMzAwMDAsIDB4OTIwMzAwMDcsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMGEsCisJMHgyODYyMDAwMiwgMHgxNDQwMDAxZCwgMHgyNDAyMDAwYSwgMHgyNDAyMDAwMiwgMHgxMDYyMDAxOSwgMHgyNDAyMDAwMywKKwkweDEwNjIwMDBlLCAweDI0MDIwMDBhLCAweDBhMDAwNDQ3LCAweDAwMDAwMDAwLCAweDkyMDIwMDA0LCAweDk3NDMwMTA0LAorCTB4OGUyNDAwMGMsIDB4MDA2MjE4MjEsIDB4MjQ2M2ZmZjIsIDB4MzA2M2ZmZmYsIDB4MDA4NzIwMjQsIDB4MDA4MzIwMjUsCisJMHhhZTI0MDAwYywgMHgwYTAwMDQ0NywgMHgyNDAyMDAwYSwgMHg5MjAyMDAwNCwgMHg5NzQzMDEwNCwgMHg4ZTI0MDAxMCwKKwkweDAwNjIxODIxLCAweDI0NjNmZmVlLCAweDMwNjNmZmZmLCAweDAwODcyMDI0LCAweDAwODMyMDI1LCAweGFlMjQwMDEwLAorCTB4MjQwMjAwMGEsIDB4YTc0MjAxNDAsIDB4OTYwMzAwMTIsIDB4OGY4NDAwMjQsIDB4YTc0MzAxNDIsIDB4OTIwMjAwMDQsCisJMHhhNzQyMDE0NCwgMHhhNzQwMDE0NiwgMHg5NzQzMDEwNCwgMHgzMDg0MDAwNiwgMHgyNDAyMDAwMSwgMHhhNzQzMDE0OCwKKwkweGE3NDIwMTRhLCAweDI0MDIwMDAyLCAweDEwODIwMDBkLCAweDJjODIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDA0LAorCTB4MTA4MDAwMTEsIDB4M2MwMjAwNDEsIDB4MGEwMDA0NmMsIDB4MDAwMDAwMDAsIDB4MTA4MjAwMDcsIDB4MjQwMjAwMDYsCisJMHgxNDgyMDAwZCwgMHgzYzAyMDE1MSwgMHgwYTAwMDQ2NiwgMHgyNDAzMDAwMSwgMHgwYTAwMDQ2NSwgMHgzYzAyMDE0MSwKKwkweDNjMDIwMDUxLCAweDI0MDMwMDAxLCAweGFmNDIxMDAwLCAweGFmODMwMDIwLCAweDBhMDAwNDZjLCAweDAwMDAwMDAwLAorCTB4YWY0MjEwMDAsIDB4YWY4MDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHg4ZjgyMDAyMCwgMHg4Zjg0MDAxOCwgMHgxMDQwMDAwNiwgMHg5MjAzMDAwNCwgMHgzYzA1ODAwMCwgMHg4ZjQyMTAwMCwKKwkweDAwNDUxMDI0LCAweDEwNDBmZmZkLCAweDAwMDAwMDAwLCAweDI0NjMwMDBhLCAweDMwNjIwMDA3LCAweDEwNDAwMDAyLAorCTB4MjQ2MjAwMDcsIDB4MzA0MzAzZjgsIDB4MDA4MzEwMjEsIDB4MzA0MjFmZmYsIDB4YWY4NDAwMGMsIDB4YWY4MjAwMTgsCisJMHhhZjQyMDA4NCwgMHg5NzQzMDEwNCwgMHgyNDQyNDAwMCwgMHgwMzQyZDgyMSwgMHgzMDYzZmZmZiwgMHgzMDYyMDAwNywKKwkweDEwNDAwMDAyLCAweDI0NjIwMDA3LCAweDMwNDNmZmY4LCAweDhmODIwMDMwLCAweDhmODQwMDAwLCAweDAwNDMxODIxLAorCTB4YWY4MjAwMWMsIDB4MDA2NDEwMmIsIDB4YWY4MzAwMzAsIDB4MTQ0MDAwMDIsIDB4MDA2NDEwMjMsIDB4YWY4MjAwMzAsCisJMHg4Zjg0MDAzMCwgMHgzNDAyODAwMCwgMHg4ZmJmMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwMDgyMTAyMSwKKwkweDAzNDIxODIxLCAweDNjMDIxMDAwLCAweGFmODMwMDEwLCAweGFmNDQwMDgwLCAweGFmNDIwMTc4LCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjAsIDB4OGY2MjAwMDAsIDB4OTc0MzAxMDQsIDB4M2MwNDgwMDAsIDB4MzA0NWZmZmYsIDB4MzA2NmZmZmYsCisJMHg4ZjQyMDE3OCwgMHgwMDQ0MTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMDAwYSwgMHgzMGEzMDAwNywgMHhhNzQyMDE0MCwKKwkweDI0MDIwMDA4LCAweDAwNDMxMDIzLCAweDMwNDIwMDA3LCAweDI0YTNmZmZlLCAweGE3NDIwMTQyLCAweGE3NDMwMTQ0LAorCTB4YTc0MDAxNDYsIDB4YTc0NjAxNDgsIDB4OGY0MjAxMDgsIDB4OGY4MzAwMjQsIDB4MzA0MjAwMjAsIDB4MDAwMjEwMmIsCisJMHgwMDAyMTAyMywgMHgzMDQyMDAwOSwgMHgzNDQyMDAwMSwgMHgzMDYzMDAwNiwgMHhhNzQyMDE0YSwgMHgyNDAyMDAwMiwKKwkweDEwNjIwMDBkLCAweDJjNjIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDA0LCAweDEwNjAwMDExLCAweDNjMDIwMDQxLAorCTB4MGEwMDA0ZDYsIDB4MDAwMDAwMDAsIDB4MTA2MjAwMDcsIDB4MjQwMjAwMDYsIDB4MTQ2MjAwMGQsIDB4M2MwMjAxNTEsCisJMHgwYTAwMDRkMCwgMHgyNDAzMDAwMSwgMHgwYTAwMDRjZiwgMHgzYzAyMDE0MSwgMHgzYzAyMDA1MSwgMHgyNDAzMDAwMSwKKwkweGFmNDIxMDAwLCAweGFmODMwMDIwLCAweDBhMDAwNGQ2LCAweDAwMDAwMDAwLCAweGFmNDIxMDAwLCAweGFmODAwMDIwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4OGY4MjAwMjAsIDB4MjRhMzAwMDgsCisJMHg4Zjg1MDAxOCwgMHgxMDQwMDAwNiwgMHgzMGM2ZmZmZiwgMHgzYzA0ODAwMCwgMHg4ZjQyMTAwMCwgMHgwMDQ0MTAyNCwKKwkweDEwNDBmZmZkLCAweDAwMDAwMDAwLCAweDMwNjNmZmZmLCAweDMwNjIwMDA3LCAweDEwNDAwMDAyLCAweDI0NjIwMDA3LAorCTB4MzA0M2ZmZjgsIDB4MDBhMzEwMjEsIDB4MzA0MjFmZmYsIDB4MjQ0MzQwMDAsIDB4MDM0M2Q4MjEsIDB4MDBjMDIwMjEsCisJMHgzMDgzMDAwNywgMHhhZjg1MDAwYywgMHhhZjgyMDAxOCwgMHhhZjQyMDA4NCwgMHgxMDYwMDAwMiwgMHgyNDgyMDAwNywKKwkweDMwNDRmZmY4LCAweDhmODIwMDMwLCAweDhmODUwMDAwLCAweDAwNDQxODIxLCAweGFmODIwMDFjLCAweDAwNjUxMDJiLAorCTB4YWY4MzAwMzAsIDB4MTQ0MDAwMDIsIDB4MDA2NTEwMjMsIDB4YWY4MjAwMzAsIDB4OGY4NDAwMzAsIDB4MzQwMjgwMDAsCisJMHgzYzAzMDgwMCwgMHg4YzY1MDgzNCwgMHgwMDgyMTAyMSwgMHgwMzQyMTgyMSwgMHhhZjgzMDAxMCwgMHhhZjQ0MDA4MCwKKwkweDEwYTAwMDA2LCAweDI0MDIwMDBlLCAweDkzODMwMDJmLCAweDE0NjIwMDA0LCAweDNjMDIxMDAwLCAweDI0MDIwNDNmLAorCTB4YTc0MjAxNDgsIDB4M2MwMjEwMDAsIDB4MDNlMDAwMDgsIDB4YWY0MjAxNzgsIDB4OGY4MjAwMjQsIDB4MzA0MjQwMDAsCisJMHgxMDQwMDAwNSwgMHgyNDAyMDgwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDQwZSwgMHgyNDAyMDgwMCwKKwkweGFmNDIwMTc4LCAweDk3NDQwMTA0LCAweDNjMDMwMDA4LCAweGFmNDMwMTQwLCAweDhmODIwMDI0LCAweDMwNDIwMDAxLAorCTB4MTA0MDAwMDYsIDB4MzA4NWZmZmYsIDB4MjQwMjAwMDIsIDB4MjRhM2ZmZmUsIDB4YTc0MjAxNDYsIDB4MGEwMDA1MjYsCisJMHhhNzQzMDE0OCwgMHhhNzQwMDE0NiwgMHg4Zjg0MDAxOCwgMHgyNDAyMDAwZCwgMHhhNzQyMDE0YSwgMHgyNDgzMDAwOCwKKwkweDMwNjMxZmZmLCAweDI0NjI0MDAwLCAweDAzNDJkODIxLCAweDMwYTIwMDA3LCAweGFmODQwMDBjLCAweGFmODMwMDE4LAorCTB4YWY0MzAwODQsIDB4MTA0MDAwMDIsIDB4MjRhMjAwMDcsIDB4MzA0NWZmZjgsIDB4OGY4MjAwMzAsIDB4OGY4NDAwMDAsCisJMHgwMDQ1MTgyMSwgMHhhZjgyMDAxYywgMHgwMDY0MTAyYiwgMHhhZjgzMDAzMCwgMHgxNDQwMDAwMiwgMHgwMDY0MTAyMywKKwkweGFmODIwMDMwLCAweDhmODQwMDMwLCAweDM0MDI4MDAwLCAweDAwODIxMDIxLCAweDAzNDIxODIxLCAweDNjMDIxMDAwLAorCTB4YWY4MzAwMTAsIDB4YWY0NDAwODAsIDB4MDNlMDAwMDgsIDB4YWY0MjAxNzgsIDB4MjdiZGZmZTgsIDB4M2MwNDYwMDgsCisJMHhhZmJmMDAxNCwgMHhhZmIwMDAxMCwgMHg4YzgyNTAwMCwgMHgzYzFhODAwMCwgMHgyNDAzZmY3ZiwgMHgzNzViNDAwMCwKKwkweDAwNDMxMDI0LCAweDM0NDIzODBjLCAweGFjODI1MDAwLCAweDhmNDMwMDA4LCAweDNjMTAwODAwLCAweDM3NDI4MDAwLAorCTB4MzQ2MzAwMDEsIDB4YWY0MzAwMDgsIDB4YWY4MjAwMTAsIDB4M2MwMjYwMWMsIDB4YWY4MDAwMTgsIDB4YWY0MDAwODAsCisJMHhhZjQwMDA4NCwgMHg4YzQ1MDAwOCwgMHgzYzAzNjAwMCwgMHg4YzYyMDgwOCwgMHgzYzA0MDgwMCwgMHgzYzAzMDA4MCwKKwkweGFjODMwODIwLCAweDMwNDJmZmYwLCAweDM4NDIwMDEwLCAweDJjNDIwMDAxLCAweGFmODUwMDAwLCAweGFmODIwMDA0LAorCTB4MGUwMDA2NTgsIDB4MDAwMDAwMDAsIDB4OGY0MjAwMDAsIDB4MzA0MjAwMDEsIDB4MTA0MGZmZmIsIDB4MDAwMDAwMDAsCisJMHg4ZjQzMDEwOCwgMHg4ZjQ0MDEwMCwgMHgzMDYyMjAwMCwgMHhhZjgzMDAyNCwgMHhhZjg0MDAxNCwgMHgxMDQwMDAwNCwKKwkweDhlMDIwODJjLCAweDI0NDIwMDAxLCAweDBhMDAwNWM2LCAweGFlMDIwODJjLCAweDMwNjIwMjAwLCAweDE0NDAwMDAzLAorCTB4MjQwMjBmMDAsIDB4MTQ4MjAwMjcsIDB4MjQwMjBkMDAsIDB4OTc0MjAxMDQsIDB4MTA0MDAwMWMsIDB4MzA2MjQwMDAsCisJMHgxNDQwMDAwNSwgMHgwMDAwMDAwMCwgMHgwZTAwMDIyZiwgMHgwMDAwMDAwMCwgMHgwYTAwMDViYiwgMHgwMDAwMDAwMCwKKwkweDhmNjIwMDA4LCAweDhmNjMwMDAwLCAweDI0MDIwMDMwLCAweDAwMDMxZTAyLCAweDMwNjMwMGYwLCAweDEwNjIwMDA3LAorCTB4Mjg2MjAwMzEsIDB4MTQ0MDAwMmYsIDB4MjQwMjAwNDAsIDB4MTA2MjAwMDcsIDB4MDAwMDAwMDAsIDB4MGEwMDA1YmIsCisJMHgwMDAwMDAwMCwgMHgwZTAwMDJlOCwgMHgwMDAwMDAwMCwgMHgwYTAwMDViYiwgMHgwMDAwMDAwMCwgMHgwZTAwMDNkYiwKKwkweDAwMDAwMDAwLCAweDBhMDAwNWJiLCAweDAwMDAwMDAwLCAweDMwNjIwMDQwLCAweDE0NDAwMDJiLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MjQwMDA0YjIsIDB4MGEwMDA1YzYsIDB4MDAwMDAwMDAsIDB4MTQ4MjAwMGYsCisJMHgzMDYyMDAwNiwgMHg5NzQyMDEwNCwgMHgxMDQwMDAwNSwgMHgzMDYyMDA0MCwgMHgwZTAwMDUxMCwgMHgwMDAwMDAwMCwKKwkweDBhMDAwNWJiLCAweDAwMDAwMDAwLCAweDE0NDAwMDFiLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLAorCTB4MjQwMDA0YzQsIDB4MGEwMDA1YzYsIDB4MDAwMDAwMDAsIDB4MTA0MDAwMGUsIDB4MzA2MjEwMDAsIDB4MTA0MDAwMDUsCisJMHgwMDAwMDAwMCwgMHgwZTAwMDY4OCwgMHgwMDAwMDAwMCwgMHgwYTAwMDViYiwgMHgwMDAwMDAwMCwgMHgwZTAwMDRhMSwKKwkweDAwMDAwMDAwLCAweDhmODIwMDJjLCAweDI0NDIwMDAxLCAweGFmODIwMDJjLCAweDBhMDAwNWM2LCAweDAwMDAwMDAwLAorCTB4MzA2MjAwNDAsIDB4MTQ0MDAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MjQwMDA0ZGIsCisJMHg4ZjQyMDEzOCwgMHgzYzAzNDAwMCwgMHgwMDQzMTAyNSwgMHhhZjQyMDEzOCwgMHgwYTAwMDU2NiwgMHgwMDAwMDAwMCwKKwkweDNjMDQ2MDA4LCAweDhjODM1MDAwLCAweDNjMWE4MDAwLCAweDI0MDJmZjdmLCAweDM3NWI0MDAwLCAweDAwNjIxODI0LAorCTB4MzQ2MzM4MGMsIDB4YWM4MzUwMDAsIDB4OGY0MjAwMDgsIDB4M2MwNTYwMDAsIDB4M2MwMzYwMWMsIDB4MzQ0MjAwMDEsCisJMHhhZjQyMDAwOCwgMHgzNzQyODAwMCwgMHhhZjgwMDAxOCwgMHhhZjgyMDAxMCwgMHhhZjQwMDA4MCwgMHhhZjQwMDA4NCwKKwkweDhjNjYwMDA4LCAweDhjYTIwODA4LCAweDNjMDQwODAwLCAweDNjMDMwMDgwLCAweGFjODMwODIwLCAweDMwNDJmZmYwLAorCTB4Mzg0MjAwMTAsIDB4MmM0MjAwMDEsIDB4YWY4NjAwMDAsIDB4YWY4MjAwMDQsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsCisJMHgzMDg0ZmZmZiwgMHgzMDgyMDAwNywgMHgxMDQwMDAwMiwgMHgyNDgyMDAwNywgMHgzMDQ0ZmZmOCwgMHg4ZjgyMDAxOCwKKwkweDAwNDQxODIxLCAweDMwNjMxZmZmLCAweDI0NjQ0MDAwLCAweDAzNDRkODIxLCAweGFmODIwMDBjLCAweGFmODMwMDE4LAorCTB4MDNlMDAwMDgsIDB4YWY0MzAwODQsIDB4MzA4NGZmZmYsIDB4MzA4MjAwMDcsIDB4MTA0MDAwMDIsIDB4MjQ4MjAwMDcsCisJMHgzMDQ0ZmZmOCwgMHg4ZjgyMDAzMCwgMHg4ZjgzMDAwMCwgMHgwMDQ0MjAyMSwgMHhhZjgyMDAxYywgMHgwMDgzMTAyYiwKKwkweGFmODQwMDMwLCAweDE0NDAwMDAyLCAweDAwODMxMDIzLCAweGFmODIwMDMwLCAweDhmODIwMDMwLCAweDM0MDM4MDAwLAorCTB4MDA0MzE4MjEsIDB4MDM0MzIwMjEsIDB4YWY4NDAwMTAsIDB4MDNlMDAwMDgsIDB4YWY0MjAwODAsIDB4OGY4MzAwMjQsCisJMHgyNDAyMDAwMiwgMHgzMDYzMDAwNiwgMHgxMDYyMDAwZCwgMHgyYzYyMDAwMywgMHg1MDQwMDAwNSwgMHgyNDAyMDAwNCwKKwkweDEwNjAwMDEyLCAweDNjMDIwMDAxLCAweDBhMDAwNjJhLCAweDAwMDAwMDAwLCAweDEwNjIwMDA3LCAweDI0MDIwMDA2LAorCTB4MTQ2MjAwMGYsIDB4M2MwMjAxMTEsIDB4MGEwMDA2MjIsIDB4MDA4MjEwMjUsIDB4MGEwMDA2MjEsIDB4M2MwMjAxMDEsCisJMHgzYzAyMDAxMSwgMHgwMDgyMTAyNSwgMHgyNDAzMDAwMSwgMHhhZjQyMTAwMCwgMHhhZjgzMDAyMCwgMHgwYTAwMDYyYSwKKwkweDAwMDAwMDAwLCAweDAwODIxMDI1LCAweGFmNDIxMDAwLCAweGFmODAwMDIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4OGY4MjAwMjAsIDB4MTA0MDAwMDUsIDB4M2MwMzgwMDAsCisJMHg4ZjQyMTAwMCwgMHgwMDQzMTAyNCwgMHgxMDQwZmZmZCwgMHgwMDAwMDAwMCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwKKwkweDhmODIwMDI0LCAweDI3YmRmZmU4LCAweDMwNDI0MDAwLCAweDE0NDAwMDA1LCAweGFmYmYwMDEwLCAweDBlMDAwMjJmLAorCTB4MDAwMDAwMDAsIDB4MGEwMDA2NTYsIDB4OGZiZjAwMTAsIDB4OGY2MjAwMDgsIDB4OGY2MzAwMDAsIDB4MjQwMjAwMzAsCisJMHgwMDAzMWUwMiwgMHgzMDYzMDBmMCwgMHgxMDYyMDAwOCwgMHgyODYyMDAzMSwgMHgxNDQwMDAwZCwgMHg4ZmJmMDAxMCwKKwkweDI0MDIwMDQwLCAweDEwNjIwMDA3LCAweDAwMDAwMDAwLCAweDBhMDAwNjU2LCAweDAwMDAwMDAwLCAweDBlMDAwMmU4LAorCTB4MDAwMDAwMDAsIDB4MGEwMDA2NTYsIDB4OGZiZjAwMTAsIDB4MGUwMDAzZGIsIDB4MDAwMDAwMDAsIDB4OGZiZjAwMTAsCisJMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHg4Zjg0MDAyOCwgMHgxMDgwMDAwZiwgMHgzYzAyNjAwMCwgMHg4YzQzMGMzYywKKwkweDMwNjMwZmZmLCAweGFmODMwMDA4LCAweDE0NjAwMDExLCAweDMwODIwMDBmLCAweDEwNDAwMDA1LCAweDMwODIwMGYwLAorCTB4MTA0MDAwMDMsIDB4MzA4MjBmMDAsIDB4MTQ0MDAwMDYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsCisJMHgyNDAwMDUxYSwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDUxZiwKKwkweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweGFmODMwMDI4LCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDEwYzAwMDA3LAorCTB4MDAwMDAwMDAsIDB4OGNhMjAwMDAsIDB4MjRjNmZmZmYsIDB4MjRhNTAwMDQsIDB4YWM4MjAwMDAsIDB4MTRjMGZmZmIsCisJMHgyNDg0MDAwNCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgwYTAwMDY4NCwgMHgwMGEwMTAyMSwgMHhhYzg2MDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI0ODQwMDA0LCAweDAwYTAxMDIxLCAweDE0NDBmZmZhLCAweDI0YTVmZmZmLAorCTB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9OworCitzdGF0aWMgdTMyIGJueDJfVFBBVF9iMDZGd0RhdGFbKDB4MC80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UUEFUX2IwNkZ3Um9kYXRhWygweDAvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfVFBBVF9iMDZGd0Jzc1soMHgyNTAvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfVFBBVF9iMDZGd1Nic3NbKDB4MzQvNCkgKyAxXSA9IHsgMHgwIH07CisKK3N0YXRpYyBjb25zdCBpbnQgYm54Ml9UWFBfYjA2RndSZWxlYXNlTWFqb3IgPSAweDE7CitzdGF0aWMgY29uc3QgaW50IGJueDJfVFhQX2IwNkZ3UmVsZWFzZU1pbm9yID0gMHgwOworc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd1JlbGVhc2VGaXggPSAweDA7CitzdGF0aWMgY29uc3QgdTMyIGJueDJfVFhQX2IwNkZ3U3RhcnRBZGRyID0gMHgwODAwMzRiMDsKK3N0YXRpYyBjb25zdCB1MzIgYm54Ml9UWFBfYjA2RndUZXh0QWRkciA9IDB4MDgwMDAwMDA7CitzdGF0aWMgY29uc3QgaW50IGJueDJfVFhQX2IwNkZ3VGV4dExlbiA9IDB4NTc0ODsKK3N0YXRpYyBjb25zdCB1MzIgYm54Ml9UWFBfYjA2RndEYXRhQWRkciA9IDB4MDgwMDU3NjA7CitzdGF0aWMgY29uc3QgaW50IGJueDJfVFhQX2IwNkZ3RGF0YUxlbiA9IDB4MDsKK3N0YXRpYyBjb25zdCB1MzIgYm54Ml9UWFBfYjA2RndSb2RhdGFBZGRyID0gMHgwMDAwMDAwMDsKK3N0YXRpYyBjb25zdCBpbnQgYm54Ml9UWFBfYjA2RndSb2RhdGFMZW4gPSAweDA7CitzdGF0aWMgY29uc3QgdTMyIGJueDJfVFhQX2IwNkZ3QnNzQWRkciA9IDB4MDgwMDU3YTA7CitzdGF0aWMgY29uc3QgaW50IGJueDJfVFhQX2IwNkZ3QnNzTGVuID0gMHgxYzQ7CitzdGF0aWMgY29uc3QgdTMyIGJueDJfVFhQX2IwNkZ3U2Jzc0FkZHIgPSAweDA4MDA1NzYwOworc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd1Nic3NMZW4gPSAweDM4Oworc3RhdGljIHUzMiBibngyX1RYUF9iMDZGd1RleHRbKDB4NTc0OC80KSArIDFdID0geworCTB4MGEwMDBkMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4NzQ3ODcwMjAsIDB4MzIyZTM1MmUsCisJMHgzODAwMDAwMCwgMHgwMjA1MDgwMCwgMHgwMDAwMDAwYSwgMHgwMDAwMDNlOCwgMHgwMDAwZWE2MCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgxMDAwMDAwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgzYzAyMDgwMCwKKwkweDI0NDI1NzYwLCAweDNjMDMwODAwLCAweDI0NjM1OTY0LCAweGFjNDAwMDAwLCAweDAwNDMyMDJiLCAweDE0ODBmZmZkLAorCTB4MjQ0MjAwMDQsIDB4M2MxZDA4MDAsIDB4MzdiZDdmZmMsIDB4MDNhMGYwMjEsIDB4M2MxMDA4MDAsIDB4MjYxMDM0YjAsCisJMHgzYzFjMDgwMCwgMHgyNzljNTc2MCwgMHgwZTAwMGY1YiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHg4Zjg0MDAxNCwKKwkweDI3YmRmZmU4LCAweGFmYjEwMDE0LCAweGFmYjAwMDEwLCAweDhmNDYwMTA0LCAweDhmODMwMDA4LCAweDhjODUwMGFjLAorCTB4YWY0MzAwODAsIDB4OTQ4MjAwYTgsIDB4YTc0MjBlMTAsIDB4OTQ4MzAwYWEsIDB4YTc0MzBlMTIsIDB4OGM4MjAwYWMsCisJMHhhZjQyMGUxOCwgMHg5NzQzMGUxMCwgMHhhNzQzMGUxNCwgMHg5NzQyMGUxMiwgMHgwMDAwODAyMSwgMHhhNzQyMGUxNiwKKwkweDhmNDMwZTE4LCAweDAwMDA2MDIxLCAweDAwYzUzMDIzLCAweGFmNDMwZTFjLCAweDEwYzAwMWEyLCAweDJkODIwMDAxLAorCTB4M2MwZTEwMDAsIDB4MjQxOWZmZjgsIDB4MjQxMTAwMTAsIDB4MjQwZjBmMDAsIDB4M2MxODgxMDAsIDB4OTM2MjAwMDgsCisJMHgxMDQwMDAwOSwgMHgwMDAwMDAwMCwgMHg5NzYyMDAxMCwgMHgwMGMyMTAyYiwgMHgxNDQwMDAwNSwgMHgwMDAwMDAwMCwKKwkweDk3NjIwMDEwLCAweDMwNDJmZmZmLCAweDBhMDAwZDZkLCAweGFmNDIwZTAwLCAweGFmNDYwZTAwLCAweDhmNDIwMDAwLAorCTB4MzA0MjAwMDgsIDB4MTA0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OTc0MjBlMDgsIDB4OGY0NTBlMDQsIDB4MzA0NGZmZmYsCisJMHgzMDgyMDAwMSwgMHgxNDQwMDAwNSwgMHgwMDAwMDAwMCwgMHgxNGEwMDAwNSwgMHgzMDgzYTA0MCwgMHgwYTAwMGYzNCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDMwODNhMDQwLCAweDI0MDIwMDQwLCAweDE0NjIwMDRmLCAweDMwODJhMDAwLAorCTB4MzA4YTAwMzYsIDB4OGY4ODAwMGMsIDB4MzA4OTAwMDgsIDB4MjQwMjA4MDAsIDB4YWY0MjAxNzgsIDB4MDEwMDE4MjEsCisJMHg5NzQyMDA4YSwgMHgwMDQzMTAyMywgMHgyNDQyZmZmZiwgMHgzMDQyMWZmZiwgMHgyYzQyMDAwOCwgMHgxNDQwZmZmYSwKKwkweDAwYTA2MDIxLCAweDhmODIwMDE4LCAweDAwY2MzMDIzLCAweDI0MDcwMDAxLCAweDhmODMwMDA4LCAweDMwNGIwMGZmLAorCTB4MjQ0MjAwMDEsIDB4YWY4MjAwMTgsIDB4MjUwMjQwMDAsIDB4MTA2ZjAwMDUsIDB4MDM0MjIwMjEsIDB4OTM4MjAwMTIsCisJMHgzMDQyMDAwNywgMHgwMDAyMTI0MCwgMHgzNDQ3MDAwMSwgMHgwMDBiMTQwMCwgMHgzYzAzMDEwMCwgMHgwMDQzMTAyNSwKKwkweGFjODIwMDAwLCAweDhmODMwMDE4LCAweDAwZWEzODI1LCAweDExMjAwMDBmLCAweGFjODMwMDA0LCAweDk3NDMwZTBhLAorCTB4OGY4NDAwMGMsIDB4MDBlZTM4MjUsIDB4MjQwMjAwMGUsIDB4MDA3ODE4MjUsIDB4YWY0MzAxNjAsIDB4MjU4MzAwMDYsCisJMHgyNDg0MDAwOCwgMHgzMDg0MWZmZiwgMHhhNzQyMDE1YSwgMHhhNzQzMDE1OCwgMHhhZjg0MDAwYywgMHgwYTAwMGRiNywKKwkweDAwMDAwMDAwLCAweDhmODMwMDBjLCAweDI1ODIwMDAyLCAweGE3NDIwMTU4LCAweDI0NjMwMDA4LCAweDMwNjMxZmZmLAorCTB4YWY4MzAwMGMsIDB4NTRjMDAwMGYsIDB4OGY0MjBlMTQsIDB4OGY4MjAwMDgsIDB4NTA0ZjAwMDIsIDB4MjQxMDAwMDEsCisJMHgzNGU3MDA0MCwgMHg5NzQyMGUxMCwgMHg5NzQzMGUxMiwgMHg4Zjg1MDAxNCwgMHgwMDAyMTQwMCwgMHgwMDYyMTgyNSwKKwkweGFjYTMwMGE4LCAweDhmODQwMDE0LCAweDhmNDIwZTE4LCAweGFjODIwMGFjLCAweDhmNDIwZTE0LCAweDhmNDMwZTFjLAorCTB4YWY0MjAxNDQsIDB4YWY0MzAxNDgsIDB4YTM0YjAxNTIsIDB4YWY0NzAxNTQsIDB4MGEwMDBlZmIsIDB4YWY0ZTAxNzgsCisJMHgxMDQwMDE2NSwgMHgwMDAwMDAwMCwgMHg5MzYyMDAwOCwgMHg1MDQwMDAwOCwgMHhhZmE2MDAwOCwgMHg5NzYyMDAxMCwKKwkweDAwYTIxMDJiLCAweDEwNDAwMDAzLCAweDMwODIwMDQwLCAweDEwNDAwMTVjLCAweDAwMDAwMDAwLCAweGFmYTYwMDA4LAorCTB4YTc4NDAwMTAsIDB4YWY4NTAwMDQsIDB4OTM2MjAwMDgsIDB4MTQ0MDAwNWYsIDB4MjdhYzAwMDgsIDB4YWY2MDAwMGMsCisJMHg5NzgyMDAxMCwgMHgzMDQyNDAwMCwgMHgxMDQwMDAwMiwgMHgyNDAzMDAwZSwgMHgyNDAzMDAxNiwgMHhhMzYzMDAwYSwKKwkweDI0MDM0MDA3LCAweGFmNjMwMDE0LCAweDkzODIwMDEyLCAweDhmNjMwMDE0LCAweDMwNDIwMDA3LCAweDAwMDIxMjQwLAorCTB4MDA2MjE4MjUsIDB4YWY2MzAwMTQsIDB4OTc4MjAwMTAsIDB4OGY2MzAwMTQsIDB4MzA0MjAwMTAsIDB4MDA2MjE4MjUsCisJMHhhZjYzMDAxNCwgMHg5NzgyMDAxMCwgMHgzMDQyMDAwOCwgMHg1MDQwMDAwZSwgMHgwMDAwMjgyMSwgMHg4ZjYyMDAxNCwKKwkweDAwNGUxMDI1LCAweGFmNjIwMDE0LCAweDk3NDMwZTBhLCAweDI0MDIwMDBlLCAweDAwNzgxODI1LCAweGFmNjMwMDA0LAorCTB4YTM2MjAwMDIsIDB4OTM2MzAwMGEsIDB4MzQwNWZmZmMsIDB4MjQ2MzAwMDQsIDB4MGEwMDBlMDYsIDB4YTM2MzAwMGEsCisJMHhhZjYwMDAwNCwgMHhhMzYwMDAwMiwgMHg5NzgyMDAxMCwgMHg5MzYzMDAwYSwgMHgzMDQyMWYwMCwgMHgwMDAyMTE4MiwKKwkweDI0NDIwMDI4LCAweDAwNjIxODIxLCAweGEzNjMwMDA5LCAweDk3NDIwZTBjLCAweGE3NjIwMDEwLCAweDkzNjMwMDA5LAorCTB4MjQwMjAwMDgsIDB4MjQ2MzAwMDIsIDB4MzA2MzAwMDcsIDB4MDA0MzEwMjMsIDB4MzA0MjAwMDcsIDB4YTM2MjAwMGIsCisJMHg5MzY0MDAwOSwgMHg5NzYyMDAxMCwgMHg4Zjg5MDAwNCwgMHg5NzgzMDAxMCwgMHgwMDQ0MTAyMSwgMHgwMGEyMTAyMSwKKwkweDMwNjMwMDQwLCAweDEwNjAwMDA3LCAweDMwNDVmZmZmLCAweDAwYTkxMDJiLCAweDE0NDAwMDA1LCAweDAxMjUxMDJiLAorCTB4M2MwNjgwMDAsIDB4MGEwMDBlM2EsIDB4MDAwMDU4MjEsIDB4MDEyNTEwMmIsIDB4NTQ0MDAwYzcsIDB4MDAwMDYwMjEsCisJMHg5NzQyMGUxNCwgMHhhNzQyMGUxMCwgMHg5NzQzMGUxNiwgMHhhNzQzMGUxMiwgMHg4ZjQyMGUxYywgMHhhZjQyMGUxOCwKKwkweGFmNDUwZTAwLCAweDhmNDIwMDAwLCAweDMwNDIwMDA4LCAweDEwNDBmZmZkLCAweDAwMDAwMDAwLCAweDk3NDIwZTA4LAorCTB4MDBhMDQ4MjEsIDB4YTc4MjAwMTAsIDB4OGY0MzBlMDQsIDB4MDAwMDMwMjEsIDB4MjQwYjAwMDEsIDB4YWY4MzAwMDQsCisJMHg5NzYyMDAxMCwgMHgwYTAwMGU0YywgMHgzMDRkZmZmZiwgMHg4Zjg5MDAwNCwgMHg5NzgyMDAxMCwgMHgzMDQyMDA0MCwKKwkweDEwNDAwMDA0LCAweDAxMjA2ODIxLCAweDNjMDY4MDAwLCAweDBhMDAwZTRjLCAweDAwMDA1ODIxLCAweDk3NjMwMDEwLAorCTB4OGY4MjAwMDQsIDB4MTA0MzAwMDMsIDB4MDAwMDMwMjEsIDB4MGEwMDBlZWUsIDB4MDAwMDYwMjEsIDB4MjQwYjAwMDEsCisJMHg4ZDgyMDAwMCwgMHgwMDQ5MTAyMywgMHgxNDQwMDAwZCwgMHhhZDgyMDAwMCwgMHg4ZjYyMDAxNCwgMHgzNDQyMDA0MCwKKwkweGFmNjIwMDE0LCAweDk3NDMwZTEwLCAweDk3NDIwZTEyLCAweDhmODQwMDE0LCAweDAwMDMxYzAwLCAweDAwNDMxMDI1LAorCTB4YWM4MjAwYTgsIDB4OGY4MzAwMTQsIDB4OGY0MjBlMTgsIDB4YWM2MjAwYWMsIDB4OTM2MjAwMDgsIDB4MTQ0MDAwM2UsCisJMHgwMDAwMDAwMCwgMHgyNTI2MDAwMiwgMHg4Zjg0MDAwYywgMHg5NzQzMDA4YSwgMHgzMDYzZmZmZiwgMHhhZmEzMDAwMCwKKwkweDhmYTIwMDAwLCAweDAwNDQxMDIzLCAweDI0NDJmZmZmLCAweDMwNDIxZmZmLCAweDJjNDIwMDEwLCAweDE0NDBmZmY3LAorCTB4MDAwMDAwMDAsIDB4OGY4MjAwMGMsIDB4OGY4MzAwMTgsIDB4MDAwMjEwODIsIDB4MDAwMjEwODAsIDB4MjQ0MjQwMDAsCisJMHgwMzQyMjgyMSwgMHgwMDYwNTAyMSwgMHgyNDYzMDAwMSwgMHgzMTQyMDBmZiwgMHgwMDAyMTQwMCwgMHhhZjgzMDAxOCwKKwkweDNjMDMzMjAwLCAweDAwNDMxMDI1LCAweGFjYTIwMDAwLCAweDkzNjMwMDA5LCAweDkzNjIwMDBhLCAweDAwMDMxYzAwLAorCTB4MDA0MzEwMjUsIDB4YWNhMjAwMDQsIDB4OGY4MzAwMTgsIDB4YWNhMzAwMDgsIDB4OTc4MjAwMTAsIDB4MzA0MjAwMDgsCisJMHgxMDQwMDAwMiwgMHgwMGMwNDAyMSwgMHgyNTI4MDAwNiwgMHg5NzQzMGUxNCwgMHg5MzY0MDAwMiwgMHg4ZjQ1MGUxYywKKwkweDhmNjYwMDA0LCAweDhmNjcwMDE0LCAweDMwNjNmZmZmLCAweGE3NDMwMTQ0LCAweDk3NDIwZTE2LCAweGE3NDIwMTQ2LAorCTB4YWY0NTAxNDgsIDB4YTM0YTAxNTIsIDB4OGY4MjAwMGMsIDB4MzA4NDAwZmYsIDB4YTc0NDAxNWEsIDB4YWY0NjAxNjAsCisJMHhhNzQ4MDE1OCwgMHhhZjQ3MDE1NCwgMHhhZjRlMDE3OCwgMHgwMDUxMTAyMSwgMHgzMDQyMWZmZiwgMHhhZjgyMDAwYywKKwkweDBhMDAwZWQ5LCAweDhkODIwMDAwLCAweDkzNjIwMDA5LCAweDkzNjMwMDBiLCAweDhmODUwMDBjLCAweDI0NjMwMDBhLAorCTB4MDA0MzUwMjEsIDB4MjU0NDAwMDcsIDB4MDA5OTIwMjQsIDB4OTc0MzAwOGEsIDB4MzA2M2ZmZmYsIDB4YWZhMzAwMDAsCisJMHg4ZmEyMDAwMCwgMHgwMDQ1MTAyMywgMHgyNDQyZmZmZiwgMHgzMDQyMWZmZiwgMHgwMDQ0MTAyYiwgMHgxNDQwZmZmNywKKwkweDAwMDAwMDAwLCAweDhmODIwMDBjLCAweDhmODQwMDE4LCAweDAwMDIxMDgyLCAweDAwMDIxMDgwLCAweDI0NDI0MDAwLAorCTB4MDM0MjI4MjEsIDB4MDA4MDQwMjEsIDB4MjQ4NDAwMDEsIDB4YWY4NDAwMTgsIDB4OTM2MzAwMDksIDB4MzEwMjAwZmYsCisJMHgwMDAyMjQwMCwgMHgzYzAyNDEwMCwgMHgyNDYzMDAwMiwgMHgwMDYyMTgyNSwgMHgwMDgzMjAyNSwgMHhhY2E0MDAwMCwKKwkweDhmNjIwMDBjLCAweDAwNDYxMDI1LCAweGFjYTIwMDA0LCAweDk3NDMwZTE0LCAweDkzNjQwMDAyLCAweDhmNDUwZTFjLAorCTB4OGY2NjAwMDQsIDB4OGY2NzAwMTQsIDB4MzA2M2ZmZmYsIDB4YTc0MzAxNDQsIDB4OTc0MjBlMTYsIDB4MzA4NDAwZmYsCisJMHhhNzQyMDE0NiwgMHhhZjQ1MDE0OCwgMHhhMzQ4MDE1MiwgMHg4ZjgzMDAwYywgMHgyNTQyMDAwNywgMHgwMDU5MTAyNCwKKwkweGE3NDQwMTVhLCAweGFmNDYwMTYwLCAweGE3NDkwMTU4LCAweGFmNDcwMTU0LCAweGFmNGUwMTc4LCAweDAwNjIxODIxLAorCTB4MzA2MzFmZmYsIDB4YWY4MzAwMGMsIDB4OGQ4MjAwMDAsIDB4MTQ0MDAwMDUsIDB4MDAwMDAwMDAsIDB4OGY2MjAwMTQsCisJMHgyNDAzZmZiZiwgMHgwMDQzMTAyNCwgMHhhZjYyMDAxNCwgMHg4ZjYyMDAwYywgMHgwMDRkMTAyMSwgMHhhZjYyMDAwYywKKwkweDkzNjMwMDA4LCAweDE0NjAwMDA4LCAweDAwMDAwMDAwLCAweDExNjAwMDA2LCAweDAwMDAwMDAwLCAweDhmNjMwMDE0LAorCTB4M2MwMmVmZmYsIDB4MzQ0MmZmZmUsIDB4MDA2MjE4MjQsIDB4YWY2MzAwMTQsIDB4YTM2YjAwMDgsIDB4MDEyMDYwMjEsCisJMHgxNTgwMDAwYywgMHg4ZmE2MDAwOCwgMHg5NzQyMGUxNCwgMHg5NzQzMGUxNiwgMHg4Zjg1MDAxNCwgMHgwMDAyMTQwMCwKKwkweDAwNjIxODI1LCAweGFjYTMwMGE4LCAweDhmODQwMDE0LCAweDhmNDIwZTFjLCAweGFjODIwMGFjLCAweDBhMDAwZWZkLAorCTB4MmQ4MjAwMDEsIDB4MTRjMGZlNjUsIDB4MmQ4MjAwMDEsIDB4MDA1MDEwMjUsIDB4MTA0MDAwNTgsIDB4MjQwMjBmMDAsCisJMHg4ZjgzMDAwOCwgMHgxNDYyMDAyMywgMHgzYzA0ODAwMCwgMHgxMTgwMDAwOSwgMHgzYzAzODAwMCwgMHg5NzQyMGUwOCwKKwkweDMwNDIwMDQwLCAweDE0NDAwMDA1LCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDI0MDAwMzJjLAorCTB4M2MwMzgwMDAsIDB4OGY0MjAxNzgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OTc0MjBlMTAsCisJMHgzYzAzMDUwMCwgMHgwMDQzMTAyNSwgMHhhZjQyMDE0YywgMHg5NzQzMGUxNCwgMHhhNzQzMDE0NCwgMHg5NzQyMGUxNiwKKwkweGE3NDIwMTQ2LCAweDhmNDMwZTFjLCAweDI0MDIyMDAwLCAweGFmNDMwMTQ4LCAweDNjMDMxMDAwLCAweGEzNDAwMTUyLAorCTB4YTc0MDAxNWEsIDB4YWY0MDAxNjAsIDB4YTc0MDAxNTgsIDB4YWY0MjAxNTQsIDB4YWY0MzAxNzgsIDB4OGY4MzAwMDgsCisJMHgzYzA0ODAwMCwgMHg4ZjQyMDE3OCwgMHgwMDQ0MTAyNCwgMHgxNDQwZmZmZCwgMHgyNDAyMGYwMCwgMHgxMDYyMDAxNiwKKwkweDAwMDAwMDAwLCAweDk3NDIwZTE0LCAweGE3NDIwMTQ0LCAweDk3NDMwZTE2LCAweGE3NDMwMTQ2LCAweDhmNDIwZTFjLAorCTB4M2MwMzEwMDAsIDB4YWY0MjAxNDgsIDB4MGEwMDBmNTEsIDB4MjQwMjAyNDAsIDB4OTc0MjBlMTQsIDB4OTc0MzBlMTYsCisJMHg4Zjg0MDAxNCwgMHgwMDAyMTQwMCwgMHgwMDYyMTgyNSwgMHhhYzgzMDBhOCwgMHg4Zjg1MDAxNCwgMHg4ZjQyMGUxYywKKwkweDAwMDA2MDIxLCAweGFjYTIwMGFjLCAweDBhMDAwZWZkLCAweDJkODIwMDAxLCAweGFmNDAwMTRjLCAweDExODAwMDA3LAorCTB4MDAwMDAwMDAsIDB4OTc0MjBlMTAsIDB4YTc0MjAxNDQsIDB4OTc0MzBlMTIsIDB4YTc0MzAxNDYsIDB4MGEwMDBmNGUsCisJMHg4ZjQyMGUxOCwgMHg5NzQyMGUxNCwgMHhhNzQyMDE0NCwgMHg5NzQzMGUxNiwgMHhhNzQzMDE0NiwgMHg4ZjQyMGUxYywKKwkweGFmNDIwMTQ4LCAweDI0MDIwMDQwLCAweDNjMDMxMDAwLCAweGEzNDAwMTUyLCAweGE3NDAwMTVhLCAweGFmNDAwMTYwLAorCTB4YTc0MDAxNTgsIDB4YWY0MjAxNTQsIDB4YWY0MzAxNzgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsCisJMHgyN2JkMDAxOCwgMHgyN2JkZmZkMCwgMHgzYzFhODAwMCwgMHgzYzA0MjBmZiwgMHgzNDg0ZmZmZCwgMHgzYzAyMDAwOCwKKwkweDAzNDIxODIxLCAweGFmYmYwMDJjLCAweGFmYjYwMDI4LCAweGFmYjUwMDI0LCAweGFmYjQwMDIwLCAweGFmYjMwMDFjLAorCTB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsIDB4YWZiMDAwMTAsIDB4YWY4MzAwMTQsIDB4YWY0NDBlMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzYzAyMDBmZiwgMHgzNDQyZmZmZCwKKwkweDNjMDQ2MDA0LCAweGFmNDIwZTAwLCAweDhjODM1MDAwLCAweDI0MTYwODAwLCAweDI0MTUwZDAwLCAweDNjMTQwODAwLAorCTB4MjQxMzBmMDAsIDB4M2MxMjA4MDAsIDB4M2MxMTQwMDAsIDB4MjQwMmZmN2YsIDB4MDA2MjE4MjQsIDB4MzQ2MzM4MGMsCisJMHgyNDAyMDAwOSwgMHhhYzgzNTAwMCwgMHhhZjQyMDAwOCwgMHhhZjgwMDAxOCwgMHhhZjgwMDAwYywgMHgwZTAwMTU1OSwKKwkweDAwMDAwMDAwLCAweDBlMDAwZmYwLCAweDAwMDAwMDAwLCAweDNjMDIwODAwLCAweDI0NTA1N2MwLCAweDhmNDIwMDAwLAorCTB4MzA0MjAwMDEsIDB4MTA0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OGY0NDAxMDAsIDB4YWY4NDAwMDgsIDB4YWY0NDAwMjAsCisJMHhhZjU2MDE3OCwgMHg5MzQzMDEwOCwgMHhhMzgzMDAxMiwgMHg5MzgyMDAxMiwgMHgzMDQyMDAwMSwgMHgxMDQwMDAwOCwKKwkweDAwMDAwMDAwLCAweDkzODIwMDEyLCAweDMwNDIwMDA2LCAweDAwMDIxMTAwLCAweDBlMDAwZDQzLCAweDAwNTBkODIxLAorCTB4MGEwMDBmYWMsIDB4MDAwMDAwMDAsIDB4MTQ5NTAwMDUsIDB4MDAwMDAwMDAsIDB4MGUwMDBkNDMsIDB4MjY5YjU4NDAsCisJMHgwYTAwMGZhYywgMHgwMDAwMDAwMCwgMHgxNDkzMDAwNSwgMHgwMDAwMDAwMCwgMHgwZTAwMGQ0MywgMHgyNjViNTg2MCwKKwkweDBhMDAwZmFjLCAweDAwMDAwMDAwLCAweDBlMDAxMGVhLCAweDAwMDAwMDAwLCAweGFmNTEwMTM4LCAweDBhMDAwZjg5LAorCTB4MDAwMDAwMDAsIDB4MjdiZGZmZjgsIDB4MzA4NGZmZmYsIDB4MjQ4MjAwMDcsIDB4MzA0NGZmZjgsIDB4OGY4NTAwMGMsCisJMHg5NzQzMDA4YSwgMHgzMDYzZmZmZiwgMHhhZmEzMDAwMCwgMHg4ZmEyMDAwMCwgMHgwMDQ1MTAyMywgMHgyNDQyZmZmZiwKKwkweDMwNDIxZmZmLCAweDAwNDQxMDJiLCAweDE0NDBmZmY3LCAweDAwMDAwMDAwLCAweDhmODIwMDBjLCAweDAwMDIxMDgyLAorCTB4MDAwMjEwODAsIDB4MjQ0MjQwMDAsIDB4MDM0MjEwMjEsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMDgsIDB4MzA4NGZmZmYsCisJMHg4ZjgyMDAwYywgMHgyNDg0MDAwNywgMHgzMDg0ZmZmOCwgMHgwMDQ0MTAyMSwgMHgzMDQyMWZmZiwgMHhhZjgyMDAwYywKKwkweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDI3YmRmZmU4LCAweDNjMWE4MDAwLCAweDNjMDQyMGZmLCAweDM0ODRmZmZkLAorCTB4M2MwMjAwMDgsIDB4MDM0MjE4MjEsIDB4YWZiZjAwMTAsIDB4YWY4MzAwMTQsIDB4YWY0NDBlMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzYzAyMDBmZiwgMHgzNDQyZmZmZCwKKwkweDNjMDQ2MDA0LCAweGFmNDIwZTAwLCAweDhjODI1MDAwLCAweDI0MDNmZjdmLCAweDAwNDMxMDI0LCAweDM0NDIzODBjLAorCTB4MjQwMzAwMDksIDB4YWM4MjUwMDAsIDB4YWY0MzAwMDgsIDB4YWY4MDAwMTgsIDB4YWY4MDAwMGMsIDB4MGUwMDE1NTksCisJMHgwMDAwMDAwMCwgMHgwZTAwMGZmMCwgMHgwMDAwMDAwMCwgMHg4ZmJmMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwKKwkweDI3YmRmZmU4LCAweDNjMDIwMDBhLCAweDAzNDIxODIxLCAweDNjMDQwODAwLCAweDI0ODQ1ODgwLCAweDI0MDUwMDE5LAorCTB4YWZiZjAwMTAsIDB4YWY4MzAwMjQsIDB4MGUwMDE1NjUsIDB4MDAwMDMwMjEsIDB4M2MwNTA4MDAsIDB4M2MwMjA4MDAsCisJMHgyNDQyNTMzMCwgMHhhY2EyNThlOCwgMHgyNGE1NThlOCwgMHgzYzAyMDgwMCwgMHgyNDQyNTRmOCwgMHgzYzAzMDgwMCwKKwkweDI0NjM1NTBjLCAweDNjMDQwODAwLCAweGFjYTIwMDA0LCAweDNjMDIwODAwLCAweDI0NDI1MzM4LCAweGFjYTMwMDA4LAorCTB4YWM4MjU5MDAsIDB4MjQ4NDU5MDAsIDB4M2MwMjA4MDAsIDB4MjQ0MjUzYzQsIDB4M2MwNzA4MDAsIDB4MjRlNzU0MDQsCisJMHgzYzA2MDgwMCwgMHgyNGM2NTUyMCwgMHgzYzA1MDgwMCwgMHgyNGE1NTQzOCwgMHgzYzAzMDgwMCwgMHhhYzgyMDAwNCwKKwkweDNjMDIwODAwLCAweDI0NDI1NTI4LCAweGFjODcwMDA4LCAweGFjODYwMDBjLCAweGFjODUwMDEwLCAweGFjNjI1OTIwLAorCTB4MjQ2MzU5MjAsIDB4OGZiZjAwMTAsIDB4M2MwMjA4MDAsIDB4MjQ0MjU1NDAsIDB4YWM2MjAwMDQsIDB4M2MwMjA4MDAsCisJMHhhYzY3MDAwOCwgMHhhYzY2MDAwYywgMHhhYzY1MDAxMCwgMHhhYzQwMDA0OCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwKKwkweDk3NDMwOWRhLCAweDAwODA0MDIxLCAweGFkMDMwMDAwLCAweDhmNDIwOWRjLCAweGFkMDIwMDA0LCAweDhmNDMwOWUwLAorCTB4YWQwMzAwMDgsIDB4OTM0NDA5ZDksIDB4MjQwMjAwMDEsIDB4MzA4NDAwMDMsIDB4MTA4MjAwMWYsIDB4MzBhOTAwZmYsCisJMHgyODgyMDAwMiwgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMiwgMHgxMDgwMDAwOSwgMHgzYzBhMDgwMCwgMHgwYTAwMTA3OCwKKwkweDkzNDIwOTM0LCAweDEwODIwMDBiLCAweDI0MDIwMDAzLCAweDEwODIwMDI2LCAweDNjMGEwODAwLCAweDBhMDAxMDc4LAorCTB4OTM0MjA5MzQsIDB4OTc0MjA5ZTQsIDB4MDAwMjE0MDAsIDB4MzQ0MjA4MDAsIDB4YWQwMjAwMGMsIDB4MGEwMDEwNzcsCisJMHgyNTA4MDAxMCwgMHg5NzQyMDllNCwgMHgwMDAyMTQwMCwgMHgzNDQyODEwMCwgMHhhZDAyMDAwYywgMHg5NzQzMDllOCwKKwkweDNjMGEwODAwLCAweDAwMDMxYzAwLCAweDM0NjMwODAwLCAweGFkMDMwMDEwLCAweDBhMDAxMDc3LCAweDI1MDgwMDE0LAorCTB4OTc0NDA5ZTQsIDB4M2MwNTA4MDAsIDB4MjRhMjU4ODAsIDB4OTQ0MzAwMWMsIDB4OTQ0NjAwMTQsIDB4OTQ0NzAwMTAsCisJMHgwMGEwNTAyMSwgMHgyNDAyMDgwMCwgMHhhZDAwMDAxMCwgMHhhZDAyMDAxNCwgMHgwMDA0MjQwMCwgMHgwMDY2MTgyMSwKKwkweDAwNjcxODIzLCAweDI0NjNmZmYyLCAweDAwODMyMDI1LCAweGFkMDQwMDBjLCAweDBhMDAxMDc3LCAweDI1MDgwMDE4LAorCTB4OTc0MjA5ZTQsIDB4M2MwNTA4MDAsIDB4MDAwMjE0MDAsIDB4MzQ0MjgxMDAsIDB4YWQwMjAwMGMsIDB4OTc0NDA5ZTgsCisJMHgyNGEyNTg4MCwgMHg5NDQzMDAxYywgMHg5NDQ2MDAxNCwgMHg5NDQ3MDAxMCwgMHgwMGEwNTAyMSwgMHgyNDAyMDgwMCwKKwkweGFkMDAwMDE0LCAweGFkMDIwMDE4LCAweDAwMDQyNDAwLCAweDAwNjYxODIxLCAweDAwNjcxODIzLCAweDI0NjNmZmVlLAorCTB4MDA4MzIwMjUsIDB4YWQwNDAwMTAsIDB4MjUwODAwMWMsIDB4OTM0MjA5MzQsIDB4OTM0NTA5MjEsIDB4M2MwNzQwMDAsCisJMHgyNTQ0NTg4MCwgMHg5NDgzMDAxOCwgMHg5NDg2MDAxNCwgMHgwMDAyMTA4MiwgMHgwMDAyMTYwMCwgMHgwMDA1MmMwMCwKKwkweDAwYTcyODI1LCAweDAwNDUxMDI1LCAweDAwNjYxODIxLCAweDAwNDMxMDI1LCAweGFkMDIwMDAwLCAweDk3ODMwMDJjLAorCTB4OTc0MjA5ZWEsIDB4MDA2MjE4MjEsIDB4MDAwMzFjMDAsIDB4YWQwMzAwMDQsIDB4OTc4MjAwMmMsIDB4MjQ0MjAwMDEsCisJMHgzMDQyN2ZmZiwgMHhhNzgyMDAyYywgMHg5MzQzMDkyMCwgMHgzYzAyMDAwNiwgMHgwMDAzMWUwMCwgMHgwMDYyMTgyNSwKKwkweGFkMDMwMDA4LCAweDhmNDIwOTJjLCAweGFkMDIwMDBjLCAweDhmNDMwOTMwLCAweGFkMDMwMDEwLCAweDhmNDQwOTM4LAorCTB4MjUwODAwMTQsIDB4YWQwNDAwMDAsIDB4OGY4MjAwMjAsIDB4MTEyMDAwMDQsIDB4YWQwMjAwMDQsIDB4OGY0MjA5NDAsCisJMHgwYTAwMTBhMSwgMHgyNDQyZmZmZiwgMHg4ZjQyMDk0MCwgMHhhZDAyMDAwOCwgMHg4ZjQ0MDk0OCwgMHg4ZjQyMDk0MCwKKwkweDkzNDMwOTM2LCAweDAwODIzMDIzLCAweDAwNjYzMDA2LCAweDM0MDJmZmZmLCAweDAwNDYxMDJiLCAweDU0NDAwMDAxLAorCTB4MzQwNmZmZmYsIDB4OTM0MjA5MzcsIDB4MjU0NDU4ODAsIDB4OTA4MzAwMjQsIDB4YWQwMDAwMTAsIDB4MDAwMjE3MDAsCisJMHgzNDYzMDAxMCwgMHgwMDAzMWMwMCwgMHgwMDQzMTAyNSwgMHgwMDQ2MTAyNSwgMHhhZDAyMDAwYywgMHg4YzgzMDAwOCwKKwkweDE0NjAwMDMxLCAweDI1MDgwMDE0LCAweDNjMDIwODAwLCAweDhjNDMwMDQ4LCAweDEwNjAwMDJkLCAweDAwMDAwMDAwLAorCTB4OTM0MjAxMGIsIDB4YWQwMjAwMDAsIDB4OGY4MzAwMDAsIDB4OGM2MjAwYjAsIDB4YWQwMjAwMDQsIDB4OGY4MzAwMDAsCisJMHg4YzYyMDBiNCwgMHhhZDAyMDAwOCwgMHg4ZjgzMDAwMCwgMHg4YzYyMDBjMCwgMHhhZDAyMDAwYywgMHg4ZjgzMDAwMCwKKwkweDhjNjIwMGM0LCAweGFkMDIwMDEwLCAweDhmODMwMDAwLCAweDhjNjIwMGM4LCAweGFkMDIwMDE0LCAweDhmODMwMDAwLAorCTB4OGM2MjAwY2MsIDB4YWQwMjAwMTgsIDB4OGY4MzAwMDAsIDB4OGM2MjAwZTAsIDB4YWQwMjAwMWMsIDB4OGY4MzAwMDAsCisJMHg4YzYyMDBlOCwgMHhhZDAyMDAyMCwgMHg4ZjgzMDAwMCwgMHg4YzYyMDBmMCwgMHgzYzA0NjAwZSwgMHhhZDAyMDAyNCwKKwkweDhjODIwMGQwLCAweGFkMDIwMDI4LCAweDhjODMwMGQ0LCAweGFkMDMwMDJjLCAweDhmODIwMDI4LCAweDNjMDQ2MDEyLAorCTB4YWQwMjAwMzAsIDB4OGM4MjAwYTgsIDB4YWQwMjAwMzQsIDB4OGM4MzAwYWMsIDB4M2MwMjYwMDAsIDB4YWQwMzAwMzgsCisJMHg4YzQzNDQ0OCwgMHhhZDAzMDAzYywgMHgwM2UwMDAwOCwgMHgwMTAwMTAyMSwgMHgyN2JkZmZhOCwgMHgzYzAyMDAwOCwKKwkweDAzNDIzMDIxLCAweGFmYmYwMDU0LCAweGFmYmUwMDUwLCAweGFmYjcwMDRjLCAweGFmYjYwMDQ4LCAweGFmYjUwMDQ0LAorCTB4YWZiNDAwNDAsIDB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsIDB4YWZiMDAwMzAsIDB4YWY4NjAwMDAsCisJMHgyNDAyMDA0MCwgMHhhZjQyMDgxNCwgMHhhZjQwMDgxMCwgMHg4ZjQyMDk0NCwgMHg4ZjQzMDk1MCwgMHg4ZjQ0MDk1NCwKKwkweDhmNDUwOTVjLCAweGFmODIwMDM0LCAweGFmODMwMDIwLCAweGFmODQwMDFjLCAweGFmODUwMDMwLCAweDkwYzIwMDAwLAorCTB4MjQwMzAwMjAsIDB4MzA0NDAwZmYsIDB4MTA4MzAwMDUsIDB4MjQwMjAwMzAsIDB4MTA4MjAwMjIsIDB4M2MwMzA4MDAsCisJMHgwYTAwMTEzOSwgMHg4YzYyMDAyYywgMHgyNDAyMDA4OCwgMHhhZjQyMDgxOCwgMHgzYzAyMDgwMCwgMHgyNDQyNThlOCwKKwkweGFmYTIwMDIwLCAweDkzNDMwMTA5LCAweDNjMDIwODAwLCAweDEwNjAwMDA5LCAweDI0NTc1OTAwLCAweDNjMDI2MDAwLAorCTB4MjQwMzAxMDAsIDB4YWM0MzA4MWMsIDB4M2MwMzAwMDEsIDB4YWM0MzA4MWMsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsCisJMHgyNDAwMDM3NiwgMHg5MzQyMDEwYSwgMHgzMDQyMDA4MCwgMHgxNDQwMDAyMSwgMHgyNDAyMDgwMCwgMHgzYzAyNjAwMCwKKwkweDI0MDMwMTAwLCAweGFjNDMwODFjLCAweDNjMDMwMDAxLCAweGFjNDMwODFjLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLAorCTB4MjQwMDAzN2QsIDB4MGEwMDExNDEsIDB4MjQwMjA4MDAsIDB4OTM0MzAxMDksIDB4MzA2MzAwN2YsIDB4MDAwMzExNDAsCisJMHgwMDAzMThjMCwgMHgwMDQzMTAyMSwgMHgyNDQzMDA4OCwgMHhhZjQzMDgxOCwgMHgwMDAwMDAwZCwgMHgzYzAyMDgwMCwKKwkweDI0NDI1OTQwLCAweDNjMDMwODAwLCAweDI0Nzc1OTUwLCAweDBhMDAxMTQwLCAweGFmYTIwMDIwLCAweDI0NDIwMDAxLAorCTB4YWM2MjAwMmMsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MjQwMDAzOTUsIDB4MGEwMDE0YzEsIDB4OGZiZjAwNTQsCisJMHgyNDAyMDgwMCwgMHhhZjQyMDE3OCwgMHg4ZjQ1MDEwNCwgMHg4ZjQyMDk4OCwgMHgwMGEyMTAyMywgMHg1ODQwMDAwNSwKKwkweDhmNDMwOWEwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDI0MDAwM2IxLCAweDhmNDMwOWEwLCAweDNjMTAwODAwLAorCTB4YWUwMzU4YjAsIDB4OGY0MjA5YTQsIDB4OGY4MzAwMjAsIDB4MjYwNDU4YjAsIDB4MjQ5MWZmZDAsIDB4YWUyMjAwMzQsCisJMHgwMGEyMTAyMywgMHhhZTIzMDAyOCwgMHhhYzgyZmZkMCwgMHg4ZmEzMDAyMCwgMHg4YzYyMDAwMCwgMHgwMDQwZjgwOSwKKwkweDAyMDBiMDIxLCAweDAwNDA5MDIxLCAweDMyNDQwMDEwLCAweDMyNDIwMDAyLCAweDEwNDAwMDA3LCAweGFmYTQwMDI0LAorCTB4OGUyMjAwMjAsIDB4MzI1MzAwNDAsIDB4MjQwM2ZmYmYsIDB4MDA0MzEwMjQsIDB4MGEwMDE0OTMsIDB4YWUyMjAwMjAsCisJMHgzMjQyMDAyMCwgMHgxMDQwMDAwMiwgMHgzYzAyMDgwMCwgMHgyNDU3NTkyMCwgMHgzMjQyMDAwMSwgMHgxNDQwMDAwNywKKwkweDAwMDAwMDAwLCAweDhmODIwMDA4LCAweGFmNDIwMDgwLCAweDhlYzM1OGIwLCAweGFmNDMwZTEwLCAweDhlMjIwMDM0LAorCTB4YWY0MjBlMTgsIDB4OTM0MzAxMGIsIDB4OTM0MjA5MDUsIDB4MzA0MjAwMDgsIDB4MTA0MDAwM2MsIDB4MzA3NDAwZmYsCisJMHg4ZjgyMDAwMCwgMHg4YzQzMDA3NCwgMHgwNDYwMDAwYSwgMHgwMDAwMDAwMCwgMHgzYzAyNjAwMCwgMHgyNDAzMDEwMCwKKwkweGFjNDMwODFjLCAweDNjMDMwMDAxLCAweGFjNDMwODFjLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDI0MDAwM2VkLAorCTB4OGY4MjAwMDAsIDB4OTA0NDAwN2IsIDB4OTM0MzAxMGEsIDB4MTQ4MzAwMjcsIDB4MzI1MzAwNDAsIDB4MDAwMDM4MjEsCisJMHgyNDA1MjAwMCwgMHgzYzA5MDgwMCwgMHgzYzAzODAwMCwgMHg4ZjQyMDE3OCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwKKwkweDhlYzI1OGIwLCAweDI2YzQ1OGIwLCAweDI0ODRmZmQwLCAweGFmNDIwMTQ0LCAweDhjODIwMDM0LCAweDNjMDMwMTAwLAorCTB4YWY0MjAxNDgsIDB4MjQwMjAwNDcsIDB4YWY0MzAxNGMsIDB4YTM0MjAxNTIsIDB4OGQyMzAwMzAsIDB4M2MwMjEwMDAsCisJMHhhNzQ3MDE1OCwgMHhhZjQ1MDE1NCwgMHhhZjQyMDE3OCwgMHg4Yzg2MDAzNCwgMHgyNDYzMDAwMSwgMHhhZDIzMDAzMCwKKwkweDkzNDIwMTBhLCAweDNjMDMwMDQ3LCAweGFmYTUwMDE0LCAweDAwMDIxNjAwLCAweDAwNDMxMDI1LCAweDAwNDcxMDI1LAorCTB4YWZhMjAwMTAsIDB4OTM0MzAxMGIsIDB4YWZhMzAwMTgsIDB4OGY0NDAxMDAsIDB4OGY0NTAxMDQsIDB4MGUwMDE1OWIsCisJMHgzYzA3MDEwMCwgMHgzYzA1MDgwMCwgMHgyNGEyNTg4MCwgMHgwYTAwMTI1MCwgMHg4YzQzMDAyMCwgMHgzMjgyMDAwMiwKKwkweDEwNDAwMDUwLCAweDAwMDAwMDAwLCAweDBlMDAxNWI5LCAweDMyNTMwMDQwLCAweDNjMDM5MDAwLCAweDM0NjMwMDAxLAorCTB4OGY4MjAwMDgsIDB4M2MwNDgwMDAsIDB4MDA0MzEwMjUsIDB4YWY0MjAwMjAsIDB4OGY0MjAwMjAsIDB4MDA0NDEwMjQsCisJMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjgzMDAwMCwgMHg5MDYyMDAwNSwgMHgzNDQyMDAwOCwgMHhhMDYyMDAwNSwKKwkweDhmODQwMDAwLCAweDhjODIwMDc0LCAweDNjMDM4MDAwLCAweDAwNDMxMDI1LCAweGFjODIwMDc0LCAweDkwODMwMDAwLAorCTB4MjQwMjAwMjAsIDB4MTA2MjAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MjQwMDA0MGIsCisJMHg4ZjgzMDAwOCwgMHgzYzAyODAwMCwgMHgzNDQyMDAwMSwgMHgwMDYyMTgyNSwgMHhhZjQzMDAyMCwgMHg5MDg0MDA3YiwKKwkweDkzNDIwMTBhLCAweDE0ODIwMDI4LCAweDNjMDMwODAwLCAweDAwMDAzODIxLCAweDI0MDUyMDAwLCAweDNjMDkwODAwLAorCTB4M2MwMzgwMDAsIDB4OGY0MjAxNzgsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsIDB4OGVjMjU4YjAsIDB4MjZjNDU4YjAsCisJMHgyNDg0ZmZkMCwgMHhhZjQyMDE0NCwgMHg4YzgyMDAzNCwgMHgzYzAzMDEwMCwgMHhhZjQyMDE0OCwgMHgyNDAyMDA0NiwKKwkweGFmNDMwMTRjLCAweGEzNDIwMTUyLCAweDhkMjMwMDMwLCAweDNjMDIxMDAwLCAweGE3NDcwMTU4LCAweGFmNDUwMTU0LAorCTB4YWY0MjAxNzgsIDB4OGM4NjAwMzQsIDB4MjQ2MzAwMDEsIDB4YWQyMzAwMzAsIDB4OTM0MjAxMGEsIDB4M2MwMzAwNDYsCisJMHhhZmE1MDAxNCwgMHgwMDAyMTYwMCwgMHgwMDQzMTAyNSwgMHgwMDQ3MTAyNSwgMHhhZmEyMDAxMCwgMHg5MzQzMDEwYiwKKwkweGFmYTMwMDE4LCAweDhmNDQwMTAwLCAweDhmNDUwMTA0LCAweDBlMDAxNTliLCAweDNjMDcwMTAwLCAweDNjMDMwODAwLAorCTB4MjQ2MjU4ODAsIDB4MGEwMDEyNTAsIDB4OGM0MzAwMjAsIDB4OTM0MjAxMDgsIDB4MzA0MjAwMTAsIDB4NTA0MDAwNTYsCisJMHg5MzQzMDkzZiwgMHg4Zjg2MDAwMCwgMHg5MGMyMDA3ZiwgMHg4Y2MzMDE3OCwgMHgzMDQ4MDBmZiwgMHgxNTAzMDAwNCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDI0MDAwNDI1LCAweDkwYzIwMDdlLCAweDkwYzQwMDgwLAorCTB4MDAwODFjMDAsIDB4MDAwMjE2MDAsIDB4MDA0MzEwMjUsIDB4MDAwNDIyMDAsIDB4OTBjMzAwN2EsIDB4OTBjNTAwMGEsCisJMHgwMDQ0MTAyNSwgMHgxMTA1MDAyOCwgMHgwMDYyMzgyNSwgMHhhMGM4MDAwYSwgMHgwMDAwNDAyMSwgMHgyNDA1NjAwMCwKKwkweDNjMDkwODAwLCAweDNjMDM4MDAwLCAweDhmNDIwMTc4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDhlYzI1OGIwLAorCTB4MjZjNDU4YjAsIDB4MjQ4NGZmZDAsIDB4YWY0MjAxNDQsIDB4OGM4MjAwMzQsIDB4YWY0MjAxNDgsIDB4MjQwMjAwNTIsCisJMHhhZjQ3MDE0YywgMHhhMzQyMDE1MiwgMHg4ZDIzMDAzMCwgMHgzYzAyMTAwMCwgMHhhNzQ4MDE1OCwgMHhhZjQ1MDE1NCwKKwkweGFmNDIwMTc4LCAweDhjODYwMDM0LCAweDI0NjMwMDAxLCAweGFkMjMwMDMwLCAweDkzNDIwMTBhLCAweDNjMDMwMDUyLAorCTB4YWZhNTAwMTQsIDB4MDAwMjE2MDAsIDB4MDA0MzEwMjUsIDB4MDA0ODEwMjUsIDB4YWZhMjAwMTAsIDB4OTM0MzAxMGIsCisJMHhhZmEzMDAxOCwgMHg4ZjQ0MDEwMCwgMHgwZTAwMTU5YiwgMHg4ZjQ1MDEwNCwgMHgwYTAwMTI0YSwgMHgwMDAwMDAwMCwKKwkweDNjMDI2MDAwLCAweDI0MDMwMTAwLCAweGFjNDMwODFjLCAweDNjMDMwMDAxLCAweGFjNDMwODFjLCAweDAwMDAwMDBkLAorCTB4MDAwMDAwMDAsIDB4MjQwMDA0M2UsIDB4MTY4MDAwMDksIDB4M2MwNTA4MDAsIDB4M2MwNDA4MDAsIDB4MjQ4MjU4ODAsCisJMHg4YzQzMDAyMCwgMHgzMjUzMDA0MCwgMHgyNDA0ZmZiZiwgMHgwMDY0MTgyNCwgMHgwYTAwMTQ5MywgMHhhYzQzMDAyMCwKKwkweDhjYTI1ODgwLCAweDEwNDAwMDA1LCAweDNjMDMwODAwLCAweDhjNjIwMDM0LCAweGFjYTA1ODgwLCAweDI0NDIwMDAxLAorCTB4YWM2MjAwMzQsIDB4OTM0MzA5M2YsIDB4MjQwMjAwMTIsIDB4NTQ2MjAwMGUsIDB4OTc0MjA5MDgsIDB4MzI4MjAwMzgsCisJMHgxNDQwMDAwOSwgMHgzYzAzMDgwMCwgMHg4ZjgzMDAwMCwgMHg4YzYyMDA0YywgMHhhYzYyMDA1YywgMHgzYzAyMDgwMCwKKwkweDI0NDQ1ODgwLCAweDhjODIwMDIwLCAweDBhMDAxMjg1LCAweDMyNTMwMDQwLCAweGFjNjA1ODgwLCAweDk3NDIwOTA4LAorCTB4NTQ0MDAwMWMsIDB4OTc0MjA5MDgsIDB4M2MwMzkwMDAsIDB4MzQ2MzAwMDEsIDB4OGY4MjAwMDgsIDB4MzI1MzAwNDAsCisJMHgzYzA0ODAwMCwgMHgwMDQzMTAyNSwgMHhhZjQyMDAyMCwgMHg4ZjQyMDAyMCwgMHgwMDQ0MTAyNCwgMHgxNDQwZmZmZCwKKwkweDNjMDI4MDAwLCAweDhmODQwMDAwLCAweDhmODUwMDA4LCAweDhjODMwMDUwLCAweDM0NDIwMDAxLCAweDAwYTIyODI1LAorCTB4YWY4MzAwMjAsIDB4YWM4MzAwNzAsIDB4YWM4MzAwNWMsIDB4YWY0NTAwMjAsIDB4M2MwNTA4MDAsIDB4MjRhNDU4ODAsCisJMHg4YzgyMDAyMCwgMHgyNDAzZmZiZiwgMHgwMDQzMTAyNCwgMHgwYTAwMTQ5MywgMHhhYzgyMDAyMCwgMHgwMDAyMTFjMCwKKwkweGFmNDIwMDI0LCAweDk3NDIwOTA4LCAweDNjMDMwMDgwLCAweDM0NjMwMDAzLCAweDAwMDIxMWMwLCAweGFmNDIwODBjLAorCTB4YWY0MzA4MWMsIDB4OTc0MjA5ZWMsIDB4OGY0MzA5YTQsIDB4YTc4MjAwMmMsIDB4M2MwMjA4MDAsIDB4MjQ0NDU4ODAsCisJMHhhYzgzMDAyYywgMHg5MzQyMDkzNywgMHg5MzQzMDkzNCwgMHgwMDAyMTA4MCwgMHgwMDYyMTgyMSwgMHhhNDgzMDAxOCwKKwkweDkzNDIwOWQ4LCAweDMyODUwMDM4LCAweGFmYTUwMDI4LCAweDAwNjIxODIxLCAweGE0ODMwMDFhLCAweDkzNDIwOWQ4LAorCTB4OTM0MzA5MzQsIDB4M2MxZTA4MDAsIDB4MDA4MDk4MjEsIDB4MDA0MzEwMjEsIDB4MjQ0MjAwMTAsIDB4YTQ4MjAwMTYsCisJMHgyNDAyMDAwNiwgMHhhZTYyMDAyMCwgMHg4ZmEyMDAyOCwgMHgxMDQwMDAwMywgMHgwMDAwYTgyMSwgMHgwYTAwMTJmMCwKKwkweDI0MTIwMDA4LCAweDhmNDIwOTU4LCAweDhmODMwMDIwLCAweDhmODQwMDMwLCAweDAwNDMxMDIzLCAweDAwODMyMDIzLAorCTB4MDQ4MDAwMDMsIDB4YWU2MjAwMDQsIDB4MDQ0MTAwMDMsIDB4MDA4MjEwMmIsIDB4MGEwMDEyYmMsIDB4YWU2MDAwMDQsCisJMHg1NDQwMDAwMSwgMHhhZTY0MDAwNCwgMHg4ZWUyMDAwMCwgMHgwMDQwZjgwOSwgMHgwMDAwMDAwMCwgMHgwMDQwOTAyMSwKKwkweDMyNDIwMDAxLCAweDU0NDAwMDFlLCAweDhlZTIwMDA0LCAweDhlNjMwMDA4LCAweDEwNjAwMDJiLCAweDNjMDJjMDAwLAorCTB4MDA2MjEwMjUsIDB4YWY0MjBlMDAsIDB4OGY0MjAwMDAsIDB4MzA0MjAwMDgsIDB4MTA0MGZmZmQsIDB4MDAwMDAwMDAsCisJMHg5NzQyMGUwOCwgMHhhNzgyMDAxMCwgMHg4ZjQzMGUwNCwgMHg4ZTYyMDAwOCwgMHhhZjgzMDAwNCwgMHg4Zjg0MDAwNCwKKwkweDAwNDQxMDJiLCAweDEwNDAwMDBiLCAweDI0MTUwMDAxLCAweDI0MDIwMTAwLCAweDNjMDE2MDAwLCAweGFjMjIwODFjLAorCTB4M2MwMjAwMDEsIDB4M2MwMTYwMDAsIDB4YWMyMjA4MWMsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MjQwMDA0Y2QsCisJMHgyNDE1MDAwMSwgMHg4ZWUyMDAwNCwgMHgwMDQwZjgwOSwgMHgwMDAwMDAwMCwgMHgwMjQyOTAyNSwgMHgzMjQyMDAwMiwKKwkweDUwNDAwMDFkLCAweDhmNDcwOTQwLCAweDEyYTAwMDA2LCAweDhlYzI1OGIwLCAweDhmODMwMDAwLCAweGFjNjIwMGE4LAorCTB4OGY4NDAwMDAsIDB4OGU2MjAwMzQsIDB4YWM4MjAwYWMsIDB4MzI0MjAwMDQsIDB4NTA0MDAwMTMsIDB4OGY0NzA5NDAsCisJMHgzYzAyMDgwMCwgMHgzMjgzMDA3ZCwgMHgxMDYwMDExMCwgMHgyNDU3NTkyMCwgMHgzMjgyMDAwMSwgMHg1MDQwMDAwNiwKKwkweDM2NTIwMDAyLCAweDhmODMwMDM0LCAweDhmNDIwOTQwLCAweDEwNjIwMTA5LCAweDAwMDAwMDAwLCAweDM2NTIwMDAyLAorCTB4MjQwMjAwMDgsIDB4YTY2MDAwMTAsIDB4YTY2MjAwMTIsIDB4YWU2MDAwMDgsIDB4YTI2MDAwMjQsIDB4OGY0NzA5NDAsCisJMHgzYzAzMDgwMCwgMHgyNDY4NTg4MCwgMHg4ZDAyMDAyYywgMHg4ZDA1MDAwOCwgMHg5NTA0MDAxMCwgMHg5NTA2MDAwYSwKKwkweDk1MDMwMDI2LCAweDAwNDUxMDIxLCAweDAwODYyMDIxLCAweDAwNjQxODIxLCAweGFmODcwMDM0LCAweGFkMDIwMDJjLAorCTB4MzI4MjAwMzAsIDB4MTA0MDAwMDgsIDB4YTUwMzAwMTQsIDB4OTEwMjAwMjQsIDB4MzI5MTAwNDAsIDB4MzQ0MjAwMDQsCisJMHhhMTAyMDAyNCwgMHhhZjQwMDA0OCwgMHgwYTAwMTM0NSwgMHgzYzA0MDgwMCwgMHg5MzQyMDkyMywgMHgzMDQyMDAwMiwKKwkweDEwNDAwMDI5LCAweDMyOTEwMDQwLCAweDhmODMwMDAwLCAweDhmODQwMDIwLCAweDhjNjIwMDg0LCAweDAwNDQxMDIzLAorCTB4MDQ0MjAwMGEsIDB4M2MwMzkwMDAsIDB4OTUwMjAwMTQsIDB4OGM2MzAwODQsIDB4MDA4MjEwMjEsIDB4MDA2MjE4MjMsCisJMHgxYzYwMDAwNCwgMHgzYzAzOTAwMCwgMHg5MTAyMDAyNCwgMHgzNDQyMDAwMSwgMHhhMTAyMDAyNCwgMHgzNDYzMDAwMSwKKwkweDhmODIwMDA4LCAweDMyOTEwMDQwLCAweDNjMDQ4MDAwLCAweDAwNDMxMDI1LCAweGFmNDIwMDIwLCAweDhmNDIwMDIwLAorCTB4MDA0NDEwMjQsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OGY4NDAwMDAsIDB4OTA4MzAwM2YsIDB4MjQwMjAwMGEsCisJMHgxMDYyMDAwNSwgMHgyNDAyMDAwYywgMHg5MDgzMDAzZiwgMHgyNDAyMDAwOCwgMHgxNDYyMDAwMiwgMHgyNDAyMDAxNCwKKwkweGEwODIwMDNmLCAweDhmODMwMDA4LCAweDNjMDI4MDAwLCAweDM0NDIwMDAxLCAweDAwNjIxODI1LCAweGFmNDMwMDIwLAorCTB4M2MwNDA4MDAsIDB4MjQ4NjU4ODAsIDB4OTRjMjAwMTAsIDB4OTRjMzAwMWEsIDB4OGNjNDAwMDgsIDB4MDA0MzI4MjEsCisJMHgxNDgwMDAwNiwgMHhhNGM1MDAxYywgMHgzYzAyMDgwMCwgMHg4YzQzMDA0OCwgMHgxMDYwMDAwMiwgMHgyNGEyMDA0MCwKKwkweGE0YzIwMDFjLCAweDI3ZDA1ODgwLCAweDk2MDQwMDFjLCAweDk2MDIwMDEyLCAweDAwODIyMDIxLCAweDI0ODQwMDAyLAorCTB4MGUwMDBmYWYsIDB4MzA4NGZmZmYsIDB4OGY4NTAwMTgsIDB4MDBhMDE4MjEsIDB4YTIwMzAwMjUsIDB4OGVlNjAwMDgsCisJMHgwMDQwMjAyMSwgMHgyNGE1MDAwMSwgMHhhZjg1MDAxOCwgMHgwMGMwZjgwOSwgMHgwMDAwMDAwMCwgMHgwMDQwMjAyMSwKKwkweDBlMDAxMDI2LCAweDAyMjAyODIxLCAweDhlZTMwMDBjLCAweDAwNjBmODA5LCAweDAwNDAyMDIxLCAweDk2MDQwMDFjLAorCTB4OTYwMjAwMTIsIDB4MDA4MjIwMjEsIDB4MjQ4NDAwMDIsIDB4MGUwMDBmYzUsIDB4MzA4NGZmZmYsIDB4OGZjMjU4ODAsCisJMHg4ZTAzMDAwOCwgMHgwMDQzMTAyMywgMHgxNDQwMDAxMiwgMHhhZmMyNTg4MCwgMHg1NDYwMDAwNiwgMHg4ZTAyMDAyMCwKKwkweDMyNDMwMDRhLCAweDI0MDIwMDAyLCAweDE0NjIwMDA1LCAweDAwMDAwMDAwLCAweDhlMDIwMDIwLCAweDM0NDIwMDQwLAorCTB4MGEwMDEzODIsIDB4YWUwMjAwMjAsIDB4NTJhMDAwMDYsIDB4MzY1MjAwMDIsIDB4OGUwMjAwMzAsIDB4YWY0MjBlMTAsCisJMHg4ZTAzMDAzNCwgMHhhZjQzMGUxOCwgMHgzNjUyMDAwMiwgMHg1MmEwMDAwOCwgMHg5NjY3MDAxNCwgMHg4ZjgzMDAwMCwKKwkweDhmNDIwZTEwLCAweGFjNjIwMGE4LCAweDhmODQwMDAwLCAweDhmNDIwZTE4LCAweGFjODIwMGFjLCAweDk2NjcwMDE0LAorCTB4OTI2ODAwMjQsIDB4MjQwMjAwNDAsIDB4YWY0MjA4MTQsIDB4OGY4MzAwMjAsIDB4OGY4MjAwMWMsIDB4MDA2NzE4MjEsCisJMHgwMDYyMTAyMywgMHhhZjgzMDAyMCwgMHgxODQwMDAwOCwgMHgwMDAwMDAwMCwgMHg4ZjgyMDAwMCwgMHhhZjgzMDAxYywKKwkweGFjNDMwMDU0LCAweDU0ZTAwMDA1LCAweGFmNDAwMDQwLCAweDBhMDAxM2EwLCAweDhmNDIwOTVjLCAweDU0ZTAwMDAxLAorCTB4YWY0MDAwNDQsIDB4OGY0MjA5NWMsIDB4MzEwMzAwMDgsIDB4YWY4MjAwMzAsIDB4MTA2MDAwMWEsIDB4MDAwMDAwMDAsCisJMHg4Zjg0MDAwMCwgMHg5MDgyMDEyMCwgMHg5MDgzMDEyMSwgMHgzMDQ2MDBmZiwgMHgwMGMzMTgyMywgMHgzMDYzMDAwNywKKwkweDI0MDIwMDA3LCAweDEwNjIwMDBlLCAweDAwMDAwMDAwLCAweDkwODIwMTIyLCAweDMwNDIwMGZlLCAweGEwODIwMTIyLAorCTB4OGY4NTAwMDAsIDB4MDAwNjE4ODAsIDB4OGY4NDAwMjAsIDB4MjRhMjAxMDAsIDB4MDA0MzEwMjEsIDB4MjRjMzAwMDEsCisJMHgzMDYzMDAwNywgMHhhYzQ0MDAwMCwgMHgwYTAwMTNiZCwgMHhhMGEzMDEyMCwgMHg5MDgyMDEyMiwgMHgzNDQyMDAwMSwKKwkweGEwODIwMTIyLCAweDE0ZTAwMDAzLCAweDMxMDIwMDAxLCAweDEwNDAwMDMxLCAweDMyNTEwMDAyLCAweDhmODIwMDAwLAorCTB4OGM0MzAwMGMsIDB4MzA2MzAwMDEsIDB4MTA2MDAwMmMsIDB4MzI1MTAwMDIsIDB4M2MwMjkwMDAsIDB4OGY4MzAwMDgsCisJMHgzNDQyMDAwMSwgMHgzYzA0ODAwMCwgMHgwMDYyMTgyNSwgMHhhZjQzMDAyMCwgMHg4ZjQyMDAyMCwgMHgwMDQ0MTAyNCwKKwkweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDhmODcwMDAwLCAweDhjZTIwMDBjLCAweDMwNDIwMDAxLCAweDEwNDAwMDE4LAorCTB4MDAwMDAwMDAsIDB4OTRlMjAwNmEsIDB4MDAwMjI4ODAsIDB4NTBhMDAwMDEsIDB4MjQwNTAwMDEsIDB4OTRlMzAwNjgsCisJMHg5MGU0MDA4MSwgMHgzYzAyMDgwMCwgMHg4YzQ2MDAyNCwgMHgwMDY1MjgyMSwgMHgwMDg1MjgwNCwgMHgwMGM1MTAyYiwKKwkweDU0NDAwMDAxLCAweDAwYTAzMDIxLCAweDNjMDIwODAwLCAweDhjNDQwMDI4LCAweDAwYzQxODJiLCAweDU0NjAwMDAxLAorCTB4MDBjMDIwMjEsIDB4OGY0MzAwNzQsIDB4MjQwMmZmZmUsIDB4MDA4MjI4MjQsIDB4MDBhMzE4MjEsIDB4YWNlMzAwMGMsCisJMHg4ZjgzMDAwOCwgMHgzYzAyODAwMCwgMHgzNDQyMDAwMSwgMHgwMDYyMTgyNSwgMHhhZjQzMDAyMCwgMHg4ZjgyMDAyMCwKKwkweDNjMDUwODAwLCAweDI0YjA1ODgwLCAweGFlMDIwMDI4LCAweDhlZTMwMDEwLCAweDAwNjBmODA5LCAweDAwMDAwMDAwLAorCTB4OGY4MjAwMjgsIDB4MjQ0MjAwMDEsIDB4YWY4MjAwMjgsIDB4MTJhMDAwMDUsIDB4YWY0MDAwNGMsIDB4OGY0MjBlMTAsCisJMHhhZTAyMDAzMCwgMHg4ZjQzMGUxOCwgMHhhZTAzMDAzNCwgMHgxMjIwZmVhNywgMHgyNDAyMDAwNiwgMHg4Zjg3MDAyNCwKKwkweDk3ODYwMDJjLCAweDhmODMwMDAwLCAweDhmODIwMDM0LCAweDhmODQwMDIwLCAweDhmODUwMDFjLCAweDMyNTMwMDQwLAorCTB4YTRlNjAwMmMsIDB4YWM2MjAwNDQsIDB4MzI0MjAwMDgsIDB4YWM2NDAwNTAsIDB4YWM2NTAwNTQsIDB4MTA0MDAwN2EsCisJMHgzMjgyMDAyMCwgMHgxMDQwMDAyNywgMHgzMjkxMDAxMCwgMHgwMDAwMzgyMSwgMHgyNDA1MjAwMCwgMHgzYzA5MDgwMCwKKwkweDNjMDM4MDAwLCAweDhmNDIwMTc4LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLCAweDhlYzI1OGIwLCAweDI2YzQ1OGIwLAorCTB4MjQ4NGZmZDAsIDB4YWY0MjAxNDQsIDB4OGM4MjAwMzQsIDB4M2MwMzA0MDAsIDB4YWY0MjAxNDgsIDB4MjQwMjAwNDEsCisJMHhhZjQzMDE0YywgMHhhMzQyMDE1MiwgMHg4ZDIzMDAzMCwgMHgzYzAyMTAwMCwgMHhhNzQ3MDE1OCwgMHhhZjQ1MDE1NCwKKwkweGFmNDIwMTc4LCAweDhjODYwMDM0LCAweDI0NjMwMDAxLCAweGFkMjMwMDMwLCAweDkzNDIwMTBhLCAweDNjMDMwMDQxLAorCTB4YWZhNTAwMTQsIDB4MDAwMjE2MDAsIDB4MDA0MzEwMjUsIDB4MDA0NzEwMjUsIDB4YWZhMjAwMTAsIDB4OTM0MzAxMGIsCisJMHhhZmEzMDAxOCwgMHg4ZjQ0MDEwMCwgMHg4ZjQ1MDEwNCwgMHgwZTAwMTU5YiwgMHgzYzA3MDQwMCwgMHgxMjIwMDAyOCwKKwkweDAwMDAzODIxLCAweDI0MDUyMDAwLCAweDNjMDkwODAwLCAweDNjMDM4MDAwLCAweDhmNDIwMTc4LCAweDAwNDMxMDI0LAorCTB4MTQ0MGZmZmQsIDB4OGVjMjU4YjAsIDB4MjZjNDU4YjAsIDB4MjQ4NGZmZDAsIDB4YWY0MjAxNDQsIDB4OGM4MjAwMzQsCisJMHgzYzAzMDMwMCwgMHhhZjQyMDE0OCwgMHgyNDAyMDA0ZSwgMHhhZjQzMDE0YywgMHhhMzQyMDE1MiwgMHg4ZDIzMDAzMCwKKwkweDNjMDIxMDAwLCAweGE3NDcwMTU4LCAweGFmNDUwMTU0LCAweGFmNDIwMTc4LCAweDhjODYwMDM0LCAweDI0NjMwMDAxLAorCTB4YWQyMzAwMzAsIDB4OTM0MjAxMGEsIDB4M2MwMzAwNGUsIDB4YWZhNTAwMTQsIDB4MDAwMjE2MDAsIDB4MDA0MzEwMjUsCisJMHgwMDQ3MTAyNSwgMHhhZmEyMDAxMCwgMHg5MzQzMDEwYiwgMHhhZmEzMDAxOCwgMHg4ZjQ0MDEwMCwgMHg4ZjQ1MDEwNCwKKwkweDBlMDAxNTliLCAweDNjMDcwMzAwLCAweDBhMDAxNDhiLCAweDhmYTIwMDI0LCAweDMyODIwMDA4LCAweDEwNDAwMDI2LAorCTB4MjQwNTIwMDAsIDB4MDAwMDM4MjEsIDB4M2MwOTA4MDAsIDB4M2MwMzgwMDAsIDB4OGY0MjAxNzgsIDB4MDA0MzEwMjQsCisJMHgxNDQwZmZmZCwgMHg4ZWMyNThiMCwgMHgyNmM0NThiMCwgMHgyNDg0ZmZkMCwgMHhhZjQyMDE0NCwgMHg4YzgyMDAzNCwKKwkweDNjMDMwMjAwLCAweGFmNDIwMTQ4LCAweDI0MDIwMDRiLCAweGFmNDMwMTRjLCAweGEzNDIwMTUyLCAweDhkMjMwMDMwLAorCTB4M2MwMjEwMDAsIDB4YTc0NzAxNTgsIDB4YWY0NTAxNTQsIDB4YWY0MjAxNzgsIDB4OGM4NjAwMzQsIDB4MjQ2MzAwMDEsCisJMHhhZDIzMDAzMCwgMHg5MzQyMDEwYSwgMHgzYzAzMDA0YiwgMHhhZmE1MDAxNCwgMHgwMDAyMTYwMCwgMHgwMDQzMTAyNSwKKwkweDAwNDcxMDI1LCAweGFmYTIwMDEwLCAweDkzNDMwMTBiLCAweGFmYTMwMDE4LCAweDhmNDQwMTAwLCAweDhmNDUwMTA0LAorCTB4MGUwMDE1OWIsIDB4M2MwNzAyMDAsIDB4OGZhMjAwMjQsIDB4MTQ0MDAwMDQsIDB4OGZhMzAwMjAsIDB4MzI0MjAwMTAsCisJMHgxMDQwMDAwNCwgMHgwMDAwMDAwMCwgMHg4YzYyMDAwNCwgMHgwMDQwZjgwOSwgMHgwMDAwMDAwMCwgMHgxMjYwMDAwNiwKKwkweDhmYTQwMDIwLCAweDhjODIwMDA4LCAweDAwNDBmODA5LCAweDAwMDAwMDAwLCAweDBhMDAxNGMxLCAweDhmYmYwMDU0LAorCTB4M2MwMzA4MDAsIDB4OGM2MjU4YTAsIDB4MzA0MjAwNDAsIDB4MTQ0MDAwMjMsIDB4OGZiZjAwNTQsIDB4MDAwMDI4MjEsCisJMHgyNDA0MDA0MCwgMHg4Zjg3MDAyMCwgMHgzYzAzODAwMCwgMHg4ZjQyMDE3OCwgMHgwMDQzMTAyNCwgMHgxNDQwZmZmZCwKKwkweDhlYzI1OGIwLCAweDI2YzM1OGIwLCAweDI0NjNmZmQwLCAweGFmNDIwMTQ0LCAweDhjNjIwMDM0LCAweGFmNDIwMTQ4LAorCTB4MjQwMjAwNDksIDB4YWY0NzAxNGMsIDB4YTM0MjAxNTIsIDB4M2MwMjEwMDAsIDB4YTc0NTAxNTgsIDB4YWY0NDAxNTQsCisJMHhhZjQyMDE3OCwgMHg4YzY2MDAzNCwgMHg5MzQyMDEwYSwgMHgzYzAzMDA0OSwgMHhhZmE0MDAxNCwgMHgwMDAyMTYwMCwKKwkweDAwNDMxMDI1LCAweDAwNDUxMDI1LCAweGFmYTIwMDEwLCAweDkzNDMwMTBiLCAweGFmYTMwMDE4LCAweDhmNDQwMTAwLAorCTB4MGUwMDE1OWIsIDB4OGY0NTAxMDQsIDB4OGZiZjAwNTQsIDB4OGZiZTAwNTAsIDB4OGZiNzAwNGMsIDB4OGZiNjAwNDgsCisJMHg4ZmI1MDA0NCwgMHg4ZmI0MDA0MCwgMHg4ZmIzMDAzYywgMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwKKwkweDAzZTAwMDA4LCAweDI3YmQwMDU4LCAweDAzZTAwMDA4LCAweDAwMDAxMDIxLCAweDNjMDIwODAwLCAweDI0NDM1ODgwLAorCTB4OGM2NTAwMDQsIDB4OGM0NDU4ODAsIDB4MDA4NTE4MmIsIDB4MTA2MDAwMDIsIDB4MDA0MDMwMjEsIDB4MDA4MDI4MjEsCisJMHg5NzQ0MDkzYywgMHgwMGE0MTAyYiwgMHg1NDQwMDAwMSwgMHgwMGEwMjAyMSwgMHg5MzQyMDkyMywgMHgwMDA0MTgyYiwKKwkweDAwMDIxMDQyLCAweDMwNDIwMDAxLCAweDAwNDMxMDI0LCAweDEwNDAwMDBkLCAweDI0YzI1ODgwLCAweDhmODUwMDAwLAorCTB4OGY4MzAwMjAsIDB4OGNhMjAwODQsIDB4MDA0MzEwMjMsIDB4MDQ0MjAwMDcsIDB4MjRjMjU4ODAsIDB4OGNhMjAwODQsCisJMHgwMDY0MTgyMSwgMHgwMDQzMTAyMywgMHgyODQyMDAwMSwgMHgwMDgyMjAyMywgMHgyNGMyNTg4MCwgMHhhYzQ0MDAwOCwKKwkweGE0NDAwMDI2LCAweDAzZTAwMDA4LCAweDAwMDAxMDIxLCAweDhmODUwMDA0LCAweDk3ODQwMDEwLCAweDNjMDMwODAwLAorCTB4MjQ2MzU4ODAsIDB4MjQwMjAwMDgsIDB4YTQ2MjAwMTIsIDB4OGY4MjAwMDQsIDB4YTQ2MDAwMTAsIDB4MDAwNDIwYzIsCisJMHgzMDg0MDAwOCwgMHgyYzQyMDAwMSwgMHgwMDAyMTAyMywgMHgzMDQyMDAwNiwgMHhhYzY1MDAwOCwgMHgwM2UwMDAwOCwKKwkweGEwNjQwMDI0LCAweDNjMDIwODAwLCAweDI0NDI1ODgwLCAweDkwNDUwMDI1LCAweDk0NDMwMDFjLCAweDNjMDIxMTAwLAorCTB4YWM4MDAwMDQsIDB4MDAwNTJjMDAsIDB4MjQ2MzAwMDIsIDB4MDA2MjE4MjUsIDB4MDBhMzI4MjUsIDB4MjQ4MjAwMDgsCisJMHgwM2UwMDAwOCwgMHhhYzg1MDAwMCwgMHgyN2JkZmZkOCwgMHgzYzAyMDgwMCwgMHgyNDQyNTg4MCwgMHhhZmJmMDAyMCwKKwkweDkwNDgwMDI1LCAweDhjNDQwMDA4LCAweDhjNDYwMDIwLCAweDhmODcwMDIwLCAweDNjMDMwODAwLCAweDNjMDU4MDAwLAorCTB4OGY0MjAxNzgsIDB4MDA0NTEwMjQsIDB4MTQ0MGZmZmQsIDB4OGM2MjU4YjAsIDB4MjQ2MzU4YjAsIDB4MjQ2OWZmZDAsCisJMHhhZjQyMDE0NCwgMHg4ZDIyMDAzNCwgMHgzMGMzMjAwMCwgMHhhZjQyMDE0OCwgMHgzYzAyMTAwMCwgMHhhZjQ3MDE0YywKKwkweGEzNDgwMTUyLCAweGE3NDQwMTU4LCAweGFmNDYwMTU0LCAweGFmNDIwMTc4LCAweDEwNjAwMDA0LCAweDNjMDMwODAwLAorCTB4OGM2MjAwMzAsIDB4MjQ0MjAwMDEsIDB4YWM2MjAwMzAsIDB4OTM0MjAxMGEsIDB4MDAwODFjMDAsIDB4MzA4NGZmZmYsCisJMHhhZmE2MDAxNCwgMHgwMDAyMTYwMCwgMHgwMDQzMTAyNSwgMHgwMDQ0MTAyNSwgMHhhZmEyMDAxMCwgMHg5MzQzMDEwYiwKKwkweGFmYTMwMDE4LCAweDhmNDQwMTAwLCAweDhmNDUwMTA0LCAweDBlMDAxNTliLCAweDhkMjYwMDM0LCAweDhmYmYwMDIwLAorCTB4MDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MjQwMDAxOWQsIDB4MDNlMDAwMDgsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgyNDAwMDFhOSwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwKKwkweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDNjMDIwODAwLCAweDI0NDI1ODgwLCAweGFjNDAwMDA4LCAweGE0NDAwMDI2LAorCTB4MDNlMDAwMDgsIDB4MjQwMjAwMDEsIDB4M2MwMjA4MDAsIDB4MjQ0MjU4ODAsIDB4MjQwMzAwMDgsIDB4YWM0MDAwMDgsCisJMHhhNDQwMDAxMCwgMHhhNDQzMDAxMiwgMHhhMDQwMDAyNCwgMHgwM2UwMDAwOCwgMHgyNDAyMDAwNCwgMHgwM2UwMDAwOCwKKwkweDAwMDAxMDIxLCAweDEwYzAwMDA3LCAweDAwMDAwMDAwLCAweDhjYTIwMDAwLCAweDI0YzZmZmZmLCAweDI0YTUwMDA0LAorCTB4YWM4MjAwMDAsIDB4MTRjMGZmZmIsIDB4MjQ4NDAwMDQsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MGEwMDE1NmMsCisJMHgwMGEwMTAyMSwgMHhhYzg2MDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNDg0MDAwNCwgMHgwMGEwMTAyMSwKKwkweDE0NDBmZmZhLCAweDI0YTVmZmZmLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDNjMGEwODAwLCAweDhkNDkwMDY4LAorCTB4M2MwNTA4MDAsIDB4MjRhNTIwOTgsIDB4MDAwOTMxNDAsIDB4MDBjNTEwMjEsIDB4YWM0NDAwMDAsIDB4OGY0NDBlMDQsCisJMHgwMGE2MTAyMSwgMHhhYzQ0MDAwNCwgMHg5NzQzMGUwOCwgMHg5NzQyMGUwYywgMHgwMGE2MjAyMSwgMHgwMDAzMWMwMCwKKwkweDAwNDMxMDI1LCAweGFjODIwMDA4LCAweDhmNDMwZTEwLCAweDAwODAxMDIxLCAweGFjNDMwMDBjLCAweDhmNDQwZTE0LAorCTB4YWM0NDAwMTAsIDB4OGY0MzBlMTgsIDB4M2MwODAwZmYsIDB4YWM0MzAwMTQsIDB4OGY0NzBlMWMsIDB4MzUwOGZmZmYsCisJMHgyNTI5MDAwMSwgMHhhYzQ3MDAxOCwgMHgzYzA3MDgwMCwgMHg4Y2UzMDA2YywgMHg5MzQ0MDEwYSwgMHgzYzAyNjAwMCwKKwkweDI0NjMwMDAxLCAweGFjZTMwMDZjLCAweDhjNDM0NDQ4LCAweDMxMjkwMDdmLCAweDAwYTYyODIxLCAweGFkNDkwMDY4LAorCTB4MDAwNDI2MDAsIDB4MDA2ODE4MjQsIDB4MDA4MzIwMjUsIDB4MDNlMDAwMDgsIDB4YWNhNDAwMWMsIDB4OGZhYzAwMTAsCisJMHg4ZmFkMDAxNCwgMHg4ZmFlMDAxOCwgMHgzYzBiMDgwMCwgMHg4ZDZhMDA2MCwgMHgzYzA4MDgwMCwgMHgyNTA4MDA4MCwKKwkweDAwMGE0OTQwLCAweDAxMjgxMDIxLCAweDAxMDkxODIxLCAweGFjNDQwMDAwLCAweDAwNjAxMDIxLCAweGFjNjUwMDA0LAorCTB4YWM0NjAwMDgsIDB4YWM2NzAwMGMsIDB4YWM0YzAwMTAsIDB4YWM2ZDAwMTQsIDB4M2MwMzYwMDAsIDB4YWM0ZTAwMTgsCisJMHg4YzY1NDQ0OCwgMHgzYzA0MDgwMCwgMHg4YzgyMDA2NCwgMHgyNTRhMDAwMSwgMHgzMTRhMDBmZiwgMHgwMTA5NDAyMSwKKwkweGFkNmEwMDYwLCAweDI0NDIwMDAxLCAweGFjODIwMDY0LCAweDAzZTAwMDA4LCAweGFkMDUwMDFjLCAweDNjMDMwODAwLAorCTB4M2MwOTA4MDAsIDB4OGQyNTAwNzAsIDB4MjQ2MzMwYjAsIDB4OGY0NjAxMDAsIDB4MDAwNTM5MDAsIDB4MDBlMzEwMjEsCisJMHhhYzQ2MDAwMCwgMHg4ZjQ0MDEwNCwgMHgwMDY3MTAyMSwgMHhhYzQ0MDAwNCwgMHg4ZjQ2MDEwOCwgMHg4Zjg0MDAxNCwKKwkweDI0YTUwMDAxLCAweGFjNDYwMDA4LCAweDhjODgwMDc0LCAweDNjMDYwODAwLCAweDhjYzIwMDc0LCAweDMwYTUwMDNmLAorCTB4MDA2NzE4MjEsIDB4YWQyNTAwNzAsIDB4MjQ0MjAwMDEsIDB4YWNjMjAwNzQsIDB4MDNlMDAwMDgsIDB4YWM2ODAwMGMsCisJMHgwMDAwMDAwMCB9OworCitzdGF0aWMgdTMyIGJueDJfVFhQX2IwNkZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Oworc3RhdGljIHUzMiBibngyX1RYUF9iMDZGd1JvZGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Oworc3RhdGljIHUzMiBibngyX1RYUF9iMDZGd0Jzc1soMHgxYzQvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfVFhQX2IwNkZ3U2Jzc1soMHgzOC80KSArIDFdID0geyAweDAgfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2NzODl4MC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvY3M4OXgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyNjY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2NzODl4MC5jCkBAIC0wLDAgKzEsNzM5IEBACisjaWZkZWYgQUxMTVVMVEkKKyNlcnJvciBtdWx0aWNhc3Qgc3VwcG9ydCBpcyBub3QgeWV0IGltcGxlbWVudGVkCisjZW5kaWYKKworLyoqCisgICBQZXIgYW4gZW1haWwgbWVzc2FnZSBmcm9tIFJ1c3MgTmVsc29uIDxuZWxzb25AY3J5bndyLmNvbT4gb24KKyAgIDE4IE1hcmNoIDIwMDggdGhpcyBmaWxlIGlzIG5vdyBsaWNlbnNlZCB1bmRlciBHUEwgVmVyc2lvbiAyLgorCisgICBGcm9tOiBSdXNzIE5lbHNvbiA8bmVsc29uQGNyeW53ci5jb20+CisgICBEYXRlOiBUdWUsIDE4IE1hciAyMDA4IDEyOjQyOjAwIC0wNDAwCisgICBTdWJqZWN0OiBSZTogW0V0aGVyYm9vdC1kZXZlbG9wZXJzXSBjczg5eDAgZHJpdmVyIGluIGV0aGVyYm9vdAorICAgLS0gcXVvdGUgZnJvbSBlbWFpbCAKKyAgIEFzIGNvcHlyaWdodCBob2xkZXIsIGlmIEkgc2F5IGl0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCB0aGUgR1BMLAorICAgdGhlbiBpdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggdGhlIEdQTC4KKworICAgSG93ZXZlciwgdGhlcmUncyBubyBwb2ludCBpbiBjYXVzaW5nIHBlb3BsZSdzIGJyYWlucyB0byBvdmVyaGVhdCwKKyAgIHNvIHllcywgSSBncmFudCBwZXJtaXNzaW9uIGZvciB0aGUgY29kZSB0byBiZSByZWxpY2Vuc2VkIHVuZGVyIHRoZQorICAgR1BMdjIuICBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhpcyBjaGFuZ2UgaW4gbGljZW5zaW5nIG1ha2VzIGl0cworICAgd2F5IHVwc3RyZWFtLiAgLXJ1c3MgCisgICAtLSBxdW90ZSBmcm9tIGVtYWlsCisqKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKy8qIGNzODl4MC5jOiBBIENyeXN0YWwgU2VtaWNvbmR1Y3RvciBDUzg5WzAyXTAgZHJpdmVyIGZvciBldGhlcmJvb3QuICovCisvKgorICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGUgZW5jbG9zZWQgY3M4OXgwLltjaF0gZHJpdmVyCisgIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgRXRoZXJib290IHBhY2thZ2UuICBUaGUgY29kZSBpcworICBvcmRpbmFyaWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHUEwuCisgIAorICBSdXNzIE5lbHNvbiwgSmFudWFyeSAyMDAwCisKKyAgQ2hhbmdlTG9nOgorCisgIFRodSBEZWMgNiAyMjo0MDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgorCisgICogZGlzYWJsZWQgYWxsICJhZHZhbmNlZCIgZmVhdHVyZXM7IHRoaXMgc2hvdWxkIG1ha2UgdGhlIGNvZGUgbW9yZSByZWxpYWJsZQorCisgICogcmVvcmdhbml6ZWQgdGhlIHJlc2V0IGZ1bmN0aW9uCisKKyAgKiBhbHdheXMgcmVzZXQgdGhlIGFkZHJlc3MgcG9ydCwgc28gdGhhdCBhdXRvcHJvYmluZyB3aWxsIGNvbnRpbnVlIHdvcmtpbmcKKworICAqIHNvbWUgY29zbWV0aWMgY2hhbmdlcworCisgICogMi41CisKKyAgVGh1IERlYyA1IDIxOjAwOjAwIDE5OTYgIE1hcmt1cyBHdXRzY2hrZSAgPGd1dHNjaGtAbWF0aC51bmktbXVlbnN0ZXIuZGU+CisKKyAgKiB0ZXN0ZWQgdGhlIGNvZGUgYWdhaW5zdCBhIENTODkwMCBjYXJkCisKKyAgKiBsb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBhbmQgYWRqdXN0bWVudHMKKworICAqIHRoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2UsIHRoYXQgYWN0dWFsbHkgd29ya3MhIGl0IHN0aWxsIHJlcXVpcmVzIHNvbWUKKyAgICBjaGFuZ2VzIGluIG9yZGVyIHRvIGJlIG1vcmUgdG9sZXJhbnQgdG8gZGlmZmVyZW50IGVudmlyb25tZW50cworCisgICogNAorCisgIEZyaSBOb3YgMjIgMjM6MDA6MDAgMTk5NiAgTWFya3VzIEd1dHNjaGtlICA8Z3V0c2Noa0BtYXRoLnVuaS1tdWVuc3Rlci5kZT4KKworICAqIHJlYWQgdGhlIG1hbnVhbHMgZm9yIHRoZSBDUzg5eDAgY2hpcHNldHMgYW5kIHRvb2sgbm90ZSBvZiBhbGwgdGhlCisgICAgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbmVjY2Vzc2FyeSBpbiBvcmRlciB0byBhZGFwdCBSdXNzZWwgTmVsc29uJ3MgY29kZQorICAgIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgYSBCT09ULVByb20KKworICAqIDYKKworICBUaHUgTm92IDE5IDIyOjAwOjAwIDE5OTYgIE1hcmt1cyBHdXRzY2hrZSAgPGd1dHNjaGtAbWF0aC51bmktbXVlbnN0ZXIuZGU+CisKKyAgKiBTeW5jaGVkIHdpdGggUnVzc2VsIE5lbHNvbidzIGN1cnJlbnQgY29kZSAodjEuMDApCisKKyAgKiAyCisKKyAgVGh1IE5vdiAxMiAxODowMDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgorCisgICogQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBjb2RlIGFuZCB0cmllZCB0byBvcHRpbWl6ZSB0aGUgY29kZSBzaXplLgorCisgICogMS41CisKKyAgU3VuIE5vdiAxMCAxNjozMDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgorCisgICogRmlyc3QgZXhwZXJpbWVudGFsIHJlbGVhc2UuIFRoaXMgY29kZSBjb21waWxlcyBmaW5lLCBidXQgSQorICBoYXZlIG5vIHdheSBvZiB0ZXN0aW5nIHdoZXRoZXIgaXQgYWN0dWFsbHkgd29ya3MuCisKKyAgKiBJIGRpZCBub3QgKHlldCkgYm90aGVyIHRvIG1ha2UgdGhlIGNvZGUgMTZiaXQgYXdhcmUsIHNvIGZvcgorICB0aGUgdGltZSBiZWluZywgaXQgd2lsbCBvbmx5IHdvcmsgZm9yIEV0aGVyYm9vdC8zMi4KKworICAqIDEyCisKKyAgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgPGdweGUvaXNhLmg+CisjaW5jbHVkZSAiY29uc29sZS5oIgorI2luY2x1ZGUgImNzODl4MC5oIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJZXRoX25pY19iYXNlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgICAgZXRoX21lbV9zdGFydDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIGV0aF9pcnFubzsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIGV0aF9jc190eXBlOwkvKiBvbmUgb2Y6IENTODkwMCwgQ1M4OTIwLCBDUzg5MjBNICAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgZXRoX2F1dG9fbmVnX2NuZjsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIGV0aF9hZGFwdGVyX2NuZjsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbGluZWN0bDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlDUzg5eDAgLSBzcGVjaWZpYyByb3V0aW5lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRyZWcoaW50IHBvcnRubykKK3sKKwlvdXR3KHBvcnRubywgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOworCXJldHVybiBpbncoZXRoX25pY19iYXNlICsgREFUQV9QT1JUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcmVnKGludCBwb3J0bm8sIGludCB2YWx1ZSkKK3sKKwlvdXR3KHBvcnRubywgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOworCW91dHcodmFsdWUsIGV0aF9uaWNfYmFzZSArIERBVEFfUE9SVCk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRUVQUk9NIGFjY2VzcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgd2FpdF9lZXByb21fcmVhZHkodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtbyA9IGN1cnJ0aWNrcygpICsgNCpUSUNLU19QRVJfU0VDOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBFRVBST00gaXMgcmVhZHksIGEgdGltZW91dCBpcyB1c2VkIC0KKwkgICBqdXN0IGluIGNhc2UgRUVQUk9NIGlzIHJlYWR5IHdoZW4gU0lfQlVTWSBpbiB0aGUKKwkgICBQUF9TZWxmU1QgaXMgY2xlYXIgKi8KKwl3aGlsZShyZWFkcmVnKFBQX1NlbGZTVCkgJiBTSV9CVVNZKSB7CisJCWlmIChjdXJydGlja3MoKSA+PSB0bW8pCisJCQlyZXR1cm4gLTE7IH0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZWVwcm9tX2RhdGEoaW50IG9mZiwgaW50IGxlbiwgdW5zaWduZWQgc2hvcnQgKmJ1ZmZlcikKK3sKKwlpbnQgaTsKKworI2lmZGVmCUVERUJVRworCXByaW50ZigiXG5jczogRUVQUk9NIGRhdGEgZnJvbSAlaFggZm9yICVoWDoiLG9mZixsZW4pOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICh3YWl0X2VlcHJvbV9yZWFkeSgpIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJLyogTm93IHNlbmQgdGhlIEVFUFJPTSByZWFkIGNvbW1hbmQgYW5kIEVFUFJPTSBsb2NhdGlvbgorCQkgICB0byByZWFkICovCisJCXdyaXRlcmVnKFBQX0VFQ01ELCAob2ZmICsgaSkgfCBFRVBST01fUkVBRF9DTUQpOworCQlpZiAod2FpdF9lZXByb21fcmVhZHkoKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCWJ1ZmZlcltpXSA9IHJlYWRyZWcoUFBfRUVEYXRhKTsKKyNpZmRlZglFREVCVUcKKwkJaWYgKCEoaSUxMCkpCisJCQlwcmludGYoIlxuY3M6ICIpOworCQlwcmludGYoIiVoWCAiLCBidWZmZXJbaV0pOworI2VuZGlmCisJfQorI2lmZGVmCUVERUJVRworCXB1dGNoYXIoJ1xuJyk7CisjZW5kaWYKKworCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBnZXRfZWVwcm9tX2Noa3N1bShpbnQgb2ZmIF9fdW51c2VkLCBpbnQgbGVuLCB1bnNpZ25lZCBzaG9ydCAqYnVmZmVyKQoreworCWludCAgaSwgY2tzdW07CisKKwlja3N1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlja3N1bSArPSBidWZmZXJbaV07CisJY2tzdW0gJj0gMHhmZmZmOworCWlmIChja3N1bSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBY3RpdmF0ZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBtZWRpYSBhbmQgcHJvYmUgZm9yIG5ldHdvcmsKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjbHJsaW5lKHZvaWQpCit7CisJaW50IGk7CisKKwlwdXRjaGFyKCdccicpOworCWZvciAoaSA9IDc5OyBpLS07ICkgcHV0Y2hhcignICcpOworCXByaW50ZigiXHJjczogIik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb250cm9sX2RjX2RjKGludCBvbl9ub3Rfb2ZmKQoreworCXVuc2lnbmVkIGludCBzZWxmY29udHJvbDsKKwl1bnNpZ25lZCBsb25nIHRtbyA9IGN1cnJ0aWNrcygpICsgVElDS1NfUEVSX1NFQzsKKworCS8qIGNvbnRyb2wgdGhlIERDIHRvIERDIGNvbnZlcnRvciBpbiB0aGUgU2VsZkNvbnRyb2wgcmVnaXN0ZXIuICAqLworCXNlbGZjb250cm9sID0gSENCMV9FTkJMOyAvKiBFbmFibGUgdGhlIEhDQjEgYml0IGFzIGFuIG91dHB1dCAqLworCWlmICgoKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX0RDX0RDX1BPTEFSSVRZKSAhPSAwKSBeIG9uX25vdF9vZmYpCisJCXNlbGZjb250cm9sIHw9IEhDQjE7CisJZWxzZQorCQlzZWxmY29udHJvbCAmPSB+SENCMTsKKwl3cml0ZXJlZyhQUF9TZWxmQ1RMLCBzZWxmY29udHJvbCk7CisKKwkvKiBXYWl0IGZvciB0aGUgREMvREMgY29udmVydGVyIHRvIHBvd2VyIHVwIC0gMTAwMG1zICovCisJd2hpbGUgKGN1cnJ0aWNrcygpIDwgdG1vKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBkZXRlY3RfdHAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtbzsKKworCS8qIFR1cm4gb24gdGhlIGNoaXAgYXV0byBkZXRlY3Rpb24gb2YgMTBCVC8gQVVJICovCisKKwljbHJsaW5lKCk7IHByaW50ZigiYXR0ZW1wdGluZyAlczoiLCJUUCIpOworCisgICAgICAgIC8qIElmIGNvbm5lY3RlZCB0byBhbm90aGVyIGZ1bGwgZHVwbGV4IGNhcGFibGUgMTAtQmFzZS1UIGNhcmQKKwkgICB0aGUgbGluayBwdWxzZXMgc2VlbSB0byBiZSBsb3N0IHdoZW4gdGhlIGF1dG8gZGV0ZWN0IGJpdCBpbgorCSAgIHRoZSBMaW5lQ1RMIGlzIHNldC4gIFRvIG92ZXJjb21lIHRoaXMgdGhlIGF1dG8gZGV0ZWN0IGJpdAorCSAgIHdpbGwgYmUgY2xlYXJlZCB3aGlsc3QgdGVzdGluZyB0aGUgMTAtQmFzZS1UIGludGVyZmFjZS4KKwkgICBUaGlzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkgZm9yIHRoZSBzcGFycm93IGNoaXAgYnV0IGlzCisJICAgc2ltcGxlciB0byBkbyBpdCBhbnl3YXkuICovCisJd3JpdGVyZWcoUFBfTGluZUNUTCwgZXRoX2xpbmVjdGwgJn4gQVVJX09OTFkpOworCWNvbnRyb2xfZGNfZGMoMCk7CisKKyAgICAgICAgLyogRGVsYXkgZm9yIHRoZSBoYXJkd2FyZSB0byB3b3JrIG91dCBpZiB0aGUgVFAgY2FibGUgaXMKKwkgICBwcmVzZW50IC0gMTUwbXMgKi8KKwlmb3IgKHRtbyA9IGN1cnJ0aWNrcygpICsgNDsgY3VycnRpY2tzKCkgPCB0bW87ICk7CisKKwlpZiAoKHJlYWRyZWcoUFBfTGluZVNUKSAmIExJTktfT0spID09IDApCisJCXJldHVybiAwOworCisJaWYgKGV0aF9jc190eXBlICE9IENTODkwMCkgeworCisJCXdyaXRlcmVnKFBQX0F1dG9OZWdDVEwsIGV0aF9hdXRvX25lZ19jbmYgJiBBVVRPX05FR19NQVNLKTsKKworCQlpZiAoKGV0aF9hdXRvX25lZ19jbmYgJiBBVVRPX05FR19CSVRTKSA9PSBBVVRPX05FR19FTkFCTEUpIHsKKwkJCXByaW50ZigiIG5lZ290aWF0aW5nIGR1cGxleC4uLiAiKTsKKwkJCXdoaWxlIChyZWFkcmVnKFBQX0F1dG9OZWdTVCkgJiBBVVRPX05FR19CVVNZKSB7CisJCQkJaWYgKGN1cnJ0aWNrcygpIC0gdG1vID4gNDAqVElDS1NfUEVSX1NFQykgeworCQkJCQlwcmludGYoInRpbWUgb3V0ICIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHJlYWRyZWcoUFBfQXV0b05lZ1NUKSAmIEZEWF9BQ1RJVkUpCisJCQlwcmludGYoInVzaW5nIGZ1bGwgZHVwbGV4Iik7CisJCWVsc2UKKwkJCXByaW50ZigidXNpbmcgaGFsZiBkdXBsZXgiKTsKKwl9CisKKwlyZXR1cm4gQV9DTkZfTUVESUFfMTBCX1Q7Cit9CisKKy8qIHNlbmQgYSB0ZXN0IHBhY2tldCAtIHJldHVybiB0cnVlIGlmIGNhcnJpZXIgYml0cyBhcmUgb2sgKi8KK3N0YXRpYyBpbnQgc2VuZF90ZXN0X3BrdChzdHJ1Y3QgbmljICpuaWMpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdHBhY2tldFtdID0geyAwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsCisJCQkJICAgICAwLCA0NiwgLypBIDQ2IGluIG5ldHdvcmsgb3JkZXIgICAgICAgKi8KKwkJCQkgICAgIDAsIDAsICAvKkRTQVA9MCAmIFNTQVA9MCBmaWVsZHMgICAgICAqLworCQkJCSAgICAgMHhmMywwIC8qQ29udHJvbCAoVGVzdCBSZXErUCBiaXQgc2V0KSovIH07CisJdW5zaWduZWQgbG9uZyB0bW87CisKKwl3cml0ZXJlZyhQUF9MaW5lQ1RMLCByZWFkcmVnKFBQX0xpbmVDVEwpIHwgU0VSSUFMX1RYX09OKTsKKworCW1lbWNweSh0ZXN0cGFja2V0LCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSh0ZXN0cGFja2V0K0VUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCisJb3V0dyhUWF9BRlRFUl9BTEwsIGV0aF9uaWNfYmFzZSArIFRYX0NNRF9QT1JUKTsKKwlvdXR3KEVUSF9aTEVOLCBldGhfbmljX2Jhc2UgKyBUWF9MRU5fUE9SVCk7CisKKwkvKiBUZXN0IHRvIHNlZSBpZiB0aGUgY2hpcCBoYXMgYWxsb2NhdGVkIG1lbW9yeSBmb3IgdGhlIHBhY2tldCAqLworCWZvciAodG1vID0gY3VycnRpY2tzKCkgKyAyOworCSAgICAgKHJlYWRyZWcoUFBfQnVzU1QpICYgUkVBRFlfRk9SX1RYX05PVykgPT0gMDsgKQorCQlpZiAoY3VycnRpY2tzKCkgPj0gdG1vKQorCQkJcmV0dXJuKDApOworCisJLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgKi8KKwlvdXRzdyhldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JULCB0ZXN0cGFja2V0LAorCSAgICAgIChFVEhfWkxFTisxKT4+MSk7CisKKwlwcmludGYoIiBzZW5kaW5nIHRlc3QgcGFja2V0ICIpOworCS8qIHdhaXQgYSBjb3VwbGUgb2YgdGltZXIgdGlja3MgZm9yIHBhY2tldCB0byBiZSByZWNlaXZlZCAqLworCWZvciAodG1vID0gY3VycnRpY2tzKCkgKyAyOyBjdXJydGlja3MoKSA8IHRtbzsgKTsKKworCWlmICgocmVhZHJlZyhQUF9UeEV2ZW50KSAmIFRYX1NFTkRfT0tfQklUUykgPT0gVFhfT0spIHsKKwkJCXByaW50Zigic3VjY2VlZGVkIik7CisJCQlyZXR1cm4gMTsKKwl9CisJcHJpbnRmKCJmYWlsZWQiKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRldGVjdF9hdWkoc3RydWN0IG5pYyAqbmljKQoreworCWNscmxpbmUoKTsgcHJpbnRmKCJhdHRlbXB0aW5nICVzOiIsIkFVSSIpOworCWNvbnRyb2xfZGNfZGMoMCk7CisKKwl3cml0ZXJlZyhQUF9MaW5lQ1RMLCAoZXRoX2xpbmVjdGwgJiB+QVVUT19BVUlfMTBCQVNFVCkgfCBBVUlfT05MWSk7CisKKwlpZiAoc2VuZF90ZXN0X3BrdChuaWMpKSB7CisJCXJldHVybiBBX0NORl9NRURJQV9BVUk7IH0KKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRldGVjdF9ibmMoc3RydWN0IG5pYyAqbmljKQoreworCWNscmxpbmUoKTsgcHJpbnRmKCJhdHRlbXB0aW5nICVzOiIsIkJOQyIpOworCWNvbnRyb2xfZGNfZGMoMSk7CisKKwl3cml0ZXJlZyhQUF9MaW5lQ1RMLCAoZXRoX2xpbmVjdGwgJiB+QVVUT19BVUlfMTBCQVNFVCkgfCBBVUlfT05MWSk7CisKKwlpZiAoc2VuZF90ZXN0X3BrdChuaWMpKSB7CisJCXJldHVybiBBX0NORl9NRURJQV8xMEJfMjsgfQorCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjczg5eDBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCWludCAgaTsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3RtbzsKKworCXdyaXRlcmVnKFBQX1NlbGZDVEwsIHJlYWRyZWcoUFBfU2VsZkNUTCkgfCBQT1dFUl9PTl9SRVNFVCk7CisKKwkvKiB3YWl0IGZvciB0d28gdGlja3M7IHRoYXQgaXMgMio1NW1zICovCisJZm9yIChyZXNldF90bW8gPSBjdXJydGlja3MoKSArIDI7IGN1cnJ0aWNrcygpIDwgcmVzZXRfdG1vOyApOworCisJaWYgKGV0aF9jc190eXBlICE9IENTODkwMCkgeworCQkvKiBIYXJkd2FyZSBwcm9ibGVtIHJlcXVpcmVzIFBOUCByZWdpc3RlcnMgdG8gYmUgcmVjb25maWd1cmVkCisJCSAgIGFmdGVyIGEgcmVzZXQgKi8KKwkJaWYgKGV0aF9pcnFubyAhPSAweEZGRkYpIHsKKwkJCW91dHcoUFBfQ1M4OTIwX0lTQUlOVCwgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOworCQkJb3V0YihldGhfaXJxbm8sIGV0aF9uaWNfYmFzZSArIERBVEFfUE9SVCk7CisJCQlvdXRiKDAsIGV0aF9uaWNfYmFzZSArIERBVEFfUE9SVCArIDEpOyB9CisKKwkJaWYgKGV0aF9tZW1fc3RhcnQpIHsKKwkJCW91dHcoUFBfQ1M4OTIwX0lTQU1lbUIsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKKwkJCW91dGIoKGV0aF9tZW1fc3RhcnQgPj4gOCkgJiAweGZmLCBldGhfbmljX2Jhc2UgKyBEQVRBX1BPUlQpOworCQkJb3V0YigoZXRoX21lbV9zdGFydCA+PiAyNCkgJiAweGZmLCBldGhfbmljX2Jhc2UgKyBEQVRBX1BPUlQgKyAxKTsgfSB9CisKKwkvKiBXYWl0IHVudGlsIHRoZSBjaGlwIGlzIHJlc2V0ICovCisJZm9yIChyZXNldF90bW8gPSBjdXJydGlja3MoKSArIDI7CisJICAgICAocmVhZHJlZyhQUF9TZWxmU1QpICYgSU5JVF9ET05FKSA9PSAwICYmCisJCSAgICAgY3VycnRpY2tzKCkgPCByZXNldF90bW87ICk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgYW5kIG1lbW9yeSBhY2Nlc3NlcyAqLworCXdyaXRlcmVnKFBQX0J1c0NUTCwgMCk7CisKKwkvKiBzZXQgdGhlIGV0aGVybmV0IGFkZHJlc3MgKi8KKwlmb3IgKGk9MDsgaSA8IEVUSF9BTEVOLzI7IGkrKykKKwkJd3JpdGVyZWcoUFBfSUEraSoyLAorCQkJIG5pYy0+bm9kZV9hZGRyW2kqMl0gfAorCQkJIChuaWMtPm5vZGVfYWRkcltpKjIrMV0gPDwgOCkpOworCisJLyogcmVjZWl2ZSBvbmx5IGVycm9yIGZyZWUgcGFja2V0cyBhZGRyZXNzZWQgdG8gdGhpcyBjYXJkICovCisJd3JpdGVyZWcoUFBfUnhDVEwsIERFRl9SWF9BQ0NFUFQpOworCisJLyogZG8gbm90IGdlbmVyYXRlIGFueSBpbnRlcnJ1cHRzIG9uIHJlY2VpdmUgb3BlcmF0aW9ucyAqLworCXdyaXRlcmVnKFBQX1J4Q0ZHLCAwKTsKKworCS8qIGRvIG5vdCBnZW5lcmF0ZSBhbnkgaW50ZXJydXB0cyBvbiB0cmFuc21pdCBvcGVyYXRpb25zICovCisJd3JpdGVyZWcoUFBfVHhDRkcsIDApOworCisJLyogZG8gbm90IGdlbmVyYXRlIGFueSBpbnRlcnJ1cHRzIG9uIGJ1ZmZlciBvcGVyYXRpb25zICovCisJd3JpdGVyZWcoUFBfQnVmQ0ZHLCAwKTsKKworCS8qIHJlc2V0IGFkZHJlc3MgcG9ydCwgc28gdGhhdCBhdXRvcHJvYmluZyB3aWxsIGtlZXAgd29ya2luZyAqLworCW91dHcoUFBfQ2hpcElELCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjczg5eDBfdHJhbnNtaXQoCisJc3RydWN0IG5pYyAqbmljLAorCWNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCisJdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLworCWNvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCit7CisJdW5zaWduZWQgbG9uZyB0bW87CisJaW50ICAgICAgICAgICBzcjsKKworCS8qIGRvZXMgdGhpcyBzaXplIGhhdmUgdG8gYmUgcm91bmRlZD8/PyBwbGVhc2UsCisJICAgc29tZWJvZHkgaGF2ZSBhIGxvb2sgaW4gdGhlIHNwZWNzICovCisJaWYgKChzciA9ICgocyArIEVUSF9ITEVOICsgMSkmfjEpKSA8IEVUSF9aTEVOKQorCQlzciA9IEVUSF9aTEVOOworCityZXRyeToKKwkvKiBpbml0aWF0ZSBhIHRyYW5zbWl0IHNlcXVlbmNlICovCisJb3V0dyhUWF9BRlRFUl9BTEwsIGV0aF9uaWNfYmFzZSArIFRYX0NNRF9QT1JUKTsKKwlvdXR3KHNyLCBldGhfbmljX2Jhc2UgKyBUWF9MRU5fUE9SVCk7CisKKwkvKiBUZXN0IHRvIHNlZSBpZiB0aGUgY2hpcCBoYXMgYWxsb2NhdGVkIG1lbW9yeSBmb3IgdGhlIHBhY2tldCAqLworCWlmICgocmVhZHJlZyhQUF9CdXNTVCkgJiBSRUFEWV9GT1JfVFhfTk9XKSA9PSAwKSB7CisJCS8qIE9vcHMuLi4gdGhpcyBzaG91bGQgbm90IGhhcHBlbiEgKi8KKwkJcHJpbnRmKCJjczogdW5hYmxlIHRvIHNlbmQgcGFja2V0OyByZXRyeWluZy4uLlxuIik7CisJCWZvciAodG1vID0gY3VycnRpY2tzKCkgKyA1KlRJQ0tTX1BFUl9TRUM7IGN1cnJ0aWNrcygpIDwgdG1vOyApOworCQljczg5eDBfcmVzZXQobmljKTsKKwkJZ290byByZXRyeTsgfQorCisJLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgKi8KKwlvdXRzdyhldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JULCBkLCBFVEhfQUxFTi8yKTsKKwlvdXRzdyhldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JULCBuaWMtPm5vZGVfYWRkciwKKwkgICAgICBFVEhfQUxFTi8yKTsKKwlvdXR3KCgodCA+PiA4KSYweEZGKXwodCA8PCA4KSwgZXRoX25pY19iYXNlICsgVFhfRlJBTUVfUE9SVCk7CisJb3V0c3coZXRoX25pY19iYXNlICsgVFhfRlJBTUVfUE9SVCwgcCwgKHMrMSkvMik7CisJZm9yIChzciA9IHNyLzIgLSAocysxKS8yIC0gRVRIX0FMRU4gLSAxOyBzciA+IDA7IHNyLS0pCisJCW91dHcoMCwgZXRoX25pY19iYXNlICsgVFhfRlJBTUVfUE9SVCk7CisKKwkvKiB3YWl0IGZvciB0cmFuc2ZlciB0byBzdWNjZWVkICovCisJZm9yICh0bW8gPSBjdXJydGlja3MoKSs1KlRJQ0tTX1BFUl9TRUM7CisJICAgICAocyA9IHJlYWRyZWcoUFBfVHhFdmVudCkmfjB4MUYpID09IDAgJiYgY3VycnRpY2tzKCkgPCB0bW87KQorCQkvKiBub3RoaW5nICovIDsKKwlpZiAoKHMgJiBUWF9TRU5EX09LX0JJVFMpICE9IFRYX09LKSB7CisJCXByaW50ZigiXG50cmFuc21pc3Npb24gZXJyb3IgJSNoWFxuIiwgcyk7CisJfQorCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGNzODl4MF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkcmVnKFBQX1J4RXZlbnQpOworCisJaWYgKChzdGF0dXMgJiBSWF9PSykgPT0gMCkKKwkJcmV0dXJuKDApOworCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKwlzdGF0dXMgPSBpbncoZXRoX25pY19iYXNlICsgUlhfRlJBTUVfUE9SVCk7CisJbmljLT5wYWNrZXRsZW4gPSBpbncoZXRoX25pY19iYXNlICsgUlhfRlJBTUVfUE9SVCk7CisJaW5zdyhldGhfbmljX2Jhc2UgKyBSWF9GUkFNRV9QT1JULCBuaWMtPnBhY2tldCwgbmljLT5wYWNrZXRsZW4gPj4gMSk7CisJaWYgKG5pYy0+cGFja2V0bGVuICYgMSkKKwkJbmljLT5wYWNrZXRbbmljLT5wYWNrZXRsZW4tMV0gPSBpbncoZXRoX25pY19iYXNlICsgUlhfRlJBTUVfUE9SVCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGNzODl4MF9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyBjczg5eDBfb3BlcmF0aW9ucyA9IHsKKwkuY29ubmVjdAk9IGR1bW15X2Nvbm5lY3QsCisJLnBvbGwJCT0gY3M4OXgwX3BvbGwsCisJLnRyYW5zbWl0CT0gY3M4OXgwX3RyYW5zbWl0LAorCS5pcnEJCT0gY3M4OXgwX2lycSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGNzODl4MF9wcm9iZV9hZGRyICggaXNhX3Byb2JlX2FkZHJfdCBpb2FkZHIgKSB7CisJLyogaWYgdGhleSBnaXZlIHVzIGFuIG9kZCBJL08gYWRkcmVzcywgdGhlbiBkbyBPTkUgd3JpdGUgdG8KKwkgICB0aGUgYWRkcmVzcyBwb3J0LCB0byBnZXQgaXQgYmFjayB0byBhZGRyZXNzIHplcm8sIHdoZXJlIHdlCisJICAgZXhwZWN0IHRvIGZpbmQgdGhlIEVJU0Egc2lnbmF0dXJlIHdvcmQuICovCisJaWYgKGlvYWRkciAmIDEpIHsKKwkJaW9hZGRyICY9IH4xOworCQlpZiAoKGludyhpb2FkZHIgKyBBRERfUE9SVCkgJiBBRERfTUFTSykgIT0gQUREX1NJRykKKwkJCXJldHVybiAwOworCQlvdXR3KFBQX0NoaXBJRCwgaW9hZGRyICsgQUREX1BPUlQpOworCX0KKwkKKwlpZiAoaW53KGlvYWRkciArIERBVEFfUE9SVCkgIT0gQ0hJUF9FSVNBX0lEX1NJRykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjczg5eDBfcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBpc2FfZGV2aWNlICppc2EgX191bnVzZWQgKSB7CisJaW50ICAgICAgaSwgcmVzdWx0ID0gLTE7CisJdW5zaWduZWQgcmV2X3R5cGUgPSAwLCBpc2FfY25mLCBjc19yZXZpc2lvbjsKKwl1bnNpZ25lZCBzaG9ydCBlZXByb21fYnVmZltDSEtTVU1fTEVOXTsKKworCW5pYy0+aW9hZGRyICY9IH4xOyAvKiBMU0IgPSAxIGluZGljYXRlcyBhIG1vcmUgYWdncmVzc2l2ZSBwcm9iZSAqLworCWV0aF9uaWNfYmFzZSA9IG5pYy0+aW9hZGRyOworCisJLyogZ2V0IHRoZSBjaGlwIHR5cGUgKi8KKwlyZXZfdHlwZSA9IHJlYWRyZWcoUFJPRFVDVF9JRF9BREQpOworCWV0aF9jc190eXBlID0gcmV2X3R5cGUgJn4gUkVWSVNPTl9CSVRTOworCWNzX3JldmlzaW9uID0gKChyZXZfdHlwZSAmIFJFVklTT05fQklUUykgPj4gOCkgKyAnQSc7CisJCisJcHJpbnRmKCJcbmNzOiBjczg5JWMwJXMgcmV2ICVjLCBiYXNlICUjaFgiLAorCSAgICAgICBldGhfY3NfdHlwZT09Q1M4OTAwPycwJzonMicsCisJICAgICAgIGV0aF9jc190eXBlPT1DUzg5MjBNPyJNIjoiIiwKKwkgICAgICAgY3NfcmV2aXNpb24sCisJICAgICAgIGV0aF9uaWNfYmFzZSk7CisjaWZuZGVmIEVNQkVEREVEIAorCS8qIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBhbiBFRVBST00gaXMgYXR0YWNoZWQqLworCWlmICgocmVhZHJlZyhQUF9TZWxmU1QpICYgRUVQUk9NX1BSRVNFTlQpID09IDApIHsKKwkJcHJpbnRmKCJcbmNzOiBubyBFRVBST00uLi5cbiIpOworCQlvdXR3KFBQX0NoaXBJRCwgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGdldF9lZXByb21fZGF0YShTVEFSVF9FRVBST01fREFUQSxDSEtTVU1fTEVOLAorCQkJCSAgIGVlcHJvbV9idWZmKSA8IDApIHsKKwkJcHJpbnRmKCJcbmNzOiBFRVBST00gcmVhZCBmYWlsZWQuLi5cbiIpOworCQlvdXR3KFBQX0NoaXBJRCwgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGdldF9lZXByb21fY2hrc3VtKFNUQVJUX0VFUFJPTV9EQVRBLENIS1NVTV9MRU4sCisJCQkJICAgICBlZXByb21fYnVmZikgPCAwKSB7CisJCXByaW50ZigiXG5jczogRUVQUk9NIGNoZWNrc3VtIGJhZC4uLlxuIik7CisJCW91dHcoUFBfQ2hpcElELCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7CisJCXJldHVybiAwOworCX0KKworCS8qIGdldCB0cmFuc21pc3Npb24gY29udHJvbCB3b3JkIGJ1dCBrZWVwIHRoZQorCSAgIGF1dG9uZWdvdGlhdGlvbiBiaXRzICovCisJZXRoX2F1dG9fbmVnX2NuZiA9IGVlcHJvbV9idWZmW0FVVE9fTkVHX0NORl9PRkZTRVQvMl07CisJLyogU3RvcmUgYWRhcHRlciBjb25maWd1cmF0aW9uICovCisJZXRoX2FkYXB0ZXJfY25mID0gZWVwcm9tX2J1ZmZbQURBUFRFUl9DTkZfT0ZGU0VULzJdOworCS8qIFN0b3JlIElTQSBjb25maWd1cmF0aW9uICovCisJaXNhX2NuZiA9IGVlcHJvbV9idWZmW0lTQV9DTkZfT0ZGU0VULzJdOworCQorCS8qIHN0b3JlIHRoZSBpbml0aWFsIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKwlldGhfbWVtX3N0YXJ0ID0gZWVwcm9tX2J1ZmZbUEFDS0VUX1BBR0VfT0ZGU0VULzJdIDw8IDg7CisJCisJcHJpbnRmKCIlcyVzJXMsIGFkZHIgIiwKKwkgICAgICAgKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl9UKT8iLCBSSi00NSI6IiIsCisJICAgICAgIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl9BVUkpPyIsIEFVSSI6IiIsCisJICAgICAgIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfMik/IiwgQk5DIjoiIik7CisJCisJLyogSWYgdGhpcyBpcyBhIENTODkwMCB0aGVuIG5vIHBucCBzb2Z0ICovCisJaWYgKGV0aF9jc190eXBlICE9IENTODkwMCAmJgorCSAgICAvKiBDaGVjayBpZiB0aGUgSVNBIElSUSBoYXMgYmVlbiBzZXQgICovCisJICAgIChpID0gcmVhZHJlZyhQUF9DUzg5MjBfSVNBSU5UKSAmIDB4ZmYsCisJICAgICAoaSAhPSAwICYmIGkgPCBDUzg5MjBfTk9fSU5UUykpKQorCQlldGhfaXJxbm8gPSBpOworCWVsc2UgeworCQlpID0gaXNhX2NuZiAmIElOVF9OT19NQVNLOworCQlpZiAoZXRoX2NzX3R5cGUgPT0gQ1M4OTAwKSB7CisJCQkvKiB0aGUgdGFibGUgdGhhdCBmb2xsb3dzIGlzIGRlcGVuZGVudAorCQkJICAgdXBvbiBob3cgeW91IHdpcmVkIHVwIHlvdXIgY3M4OTAwCisJCQkgICBpbiB5b3VyIHN5c3RlbS4gIFRoZSB0YWJsZSBpcyB0aGUKKwkJCSAgIHNhbWUgYXMgdGhlIGNzODkwMCBlbmdpbmVlcmluZyBkZW1vCisJCQkgICBib2FyZC4gIGlycV9tYXAgYWxzbyBkZXBlbmRzIG9uIHRoZQorCQkJICAgY29udGVudHMgb2YgdGhlIHRhYmxlLiAgQWxzbyBzZWUKKwkJCSAgIHdyaXRlX2lycSwgd2hpY2ggaXMgdGhlIHJldmVyc2UKKwkJCSAgIG1hcHBpbmcgb2YgdGhlIHRhYmxlIGJlbG93LiAqLworCQkJaWYgKGkgPCA0KSBpID0gIlwwMTJcMDEzXDAxNFwwMDUiW2ldOworCQkJZWxzZSBwcmludGYoIlxuY3M6IEJVRzogaXNhX2NvbmZpZyBpcyAlZFxuIiwgaSk7IH0KKwkJZXRoX2lycW5vID0gaTsgfQorCQorICAgICAgICBuaWMtPmlycW5vID0gZXRoX2lycW5vOworCisJLyogUmV0cmlldmUgYW5kIHByaW50IHRoZSBldGhlcm5ldCBhZGRyZXNzLiAqLworCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkJbmljLT5ub2RlX2FkZHJbaV0gPSAoKHVuc2lnbmVkIGNoYXIgKillZXByb21fYnVmZilbaV07CisJfQorCisJREJHICggIiVzXG4iLCBldGhfbnRvYSAoIG5pYy0+bm9kZV9hZGRyICkgKTsKKworI2VuZGlmCisjaWZkZWYgRU1CRURERUQKKwkvKiBSZXRyaWV2ZSBhbmQgcHJpbnQgdGhlIGV0aGVybmV0IGFkZHJlc3MuICovCisJeworCQl1bnNpZ25lZCBjaGFyIE1BQ19IV19BRERSWzZdPXtNQUNfSFdfQUREUl9EUlZ9OworCQltZW1jcHkobmljLT5ub2RlX2FkZHIsIE1BQ19IV19BRERSLCA2KTsKKwl9CisKKwlEQkcgKCAiJXNcbiIsIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIgKSApOworCQorCWV0aF9hZGFwdGVyX2NuZiA9IEFfQ05GXzEwQl9UIHwgQV9DTkZfTUVESUFfMTBCX1Q7CisJZXRoX2F1dG9fbmVnX2NuZiA9IEVFX0FVVE9fTkVHX0VOQUJMRSB8IElNTV9CSVQ7CisjZW5kaWYKKyNpZm5kZWYgRU1CRURERUQgCisJLyogU2V0IHRoZSBMaW5lQ1RMIHF1aW50dXBsZXQgYmFzZWQgb24gYWRhcHRlcgorCSAgIGNvbmZpZ3VyYXRpb24gcmVhZCBmcm9tIEVFUFJPTSAqLworCWlmICgoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfRVhUTkRfMTBCXzIpICYmCisJICAgIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl9MT1dfUlhfU1FVRUxDSCkpCisJCWV0aF9saW5lY3RsID0gTE9XX1JYX1NRVUVMQ0g7CisJZWxzZQorCQlldGhfbGluZWN0bCA9IDA7CisJCisJLyogY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhleSBoYXZlIHRoZSAicmlnaHQiCisJICAgaGFyZHdhcmUgYXZhaWxhYmxlICovCisJc3dpdGNoKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX01FRElBX1RZUEUpIHsKKwljYXNlIEFfQ05GX01FRElBXzEwQl9UOiByZXN1bHQgPSBldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfVDsKKwkJYnJlYWs7CisJY2FzZSBBX0NORl9NRURJQV9BVUk6ICAgcmVzdWx0ID0gZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfQVVJOworCQlicmVhazsKKwljYXNlIEFfQ05GX01FRElBXzEwQl8yOiByZXN1bHQgPSBldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfMjsKKwkJYnJlYWs7CisJZGVmYXVsdDogcmVzdWx0ID0gZXRoX2FkYXB0ZXJfY25mICYgKEFfQ05GXzEwQl9UIHwgQV9DTkZfQVVJIHwKKwkJCQkJICAgICBBX0NORl8xMEJfMik7CisJfQorCWlmICghcmVzdWx0KSB7CisJCXByaW50ZigiY3M6IEVFUFJPTSBpcyBjb25maWd1cmVkIGZvciB1bmF2YWlsYWJsZSBtZWRpYVxuIik7CisJZXJyb3I6CisJCXdyaXRlcmVnKFBQX0xpbmVDVEwsIHJlYWRyZWcoUFBfTGluZUNUTCkgJgorCQkJIH4oU0VSSUFMX1RYX09OIHwgU0VSSUFMX1JYX09OKSk7CisJCW91dHcoUFBfQ2hpcElELCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCS8qIEluaXRpYWxpemUgdGhlIGNhcmQgZm9yIHByb2Jpbmcgb2YgdGhlIGF0dGFjaGVkIG1lZGlhICovCisJY3M4OXgwX3Jlc2V0KG5pYyk7CisJCisJLyogc2V0IHRoZSBoYXJkd2FyZSB0byB0aGUgY29uZmlndXJlZCBjaG9pY2UgKi8KKwlzd2l0Y2goZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfTUVESUFfVFlQRSkgeworCWNhc2UgQV9DTkZfTUVESUFfMTBCX1Q6CisJCXJlc3VsdCA9IGRldGVjdF90cCgpOworCQlpZiAoIXJlc3VsdCkgeworCQkJY2xybGluZSgpOworCQkJcHJpbnRmKCIxMEJhc2UtVCAoUkotNDUlcyIsCisJCQkgICAgICAgIikgaGFzIG5vIGNhYmxlXG4iKTsgfQorCQkvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLworCQlpZiAoZXRoX2F1dG9fbmVnX2NuZiAmIElNTV9CSVQpCisJCQkvKiBZZXMhIEkgZG9uJ3QgY2FyZSBpZiBJIHNlZSBhIGxpbmsgcHVsc2UgKi8KKwkJCXJlc3VsdCA9IEFfQ05GX01FRElBXzEwQl9UOworCQlicmVhazsKKwljYXNlIEFfQ05GX01FRElBX0FVSToKKwkJcmVzdWx0ID0gZGV0ZWN0X2F1aShuaWMpOworCQlpZiAoIXJlc3VsdCkgeworCQkJY2xybGluZSgpOworCQkJcHJpbnRmKCIxMEJhc2UtNSAoQVVJJXMiLAorCQkJICAgICAgICIpIGhhcyBubyBjYWJsZVxuIik7IH0KKwkJLyogY2hlY2sgImlnbm9yZSBtaXNzaW5nIG1lZGlhIiBiaXQgKi8KKwkJaWYgKGV0aF9hdXRvX25lZ19jbmYgJiBJTU1fQklUKQorCQkJLyogWWVzISBJIGRvbid0IGNhcmUgaWYgSSBzZWUgYSBjYXJycmllciAqLworCQkJcmVzdWx0ID0gQV9DTkZfTUVESUFfQVVJOworCQlicmVhazsKKwljYXNlIEFfQ05GX01FRElBXzEwQl8yOgorCQlyZXN1bHQgPSBkZXRlY3RfYm5jKG5pYyk7CisJCWlmICghcmVzdWx0KSB7CisJCQljbHJsaW5lKCk7CisJCQlwcmludGYoIjEwQmFzZS0yIChCTkMlcyIsCisJCQkgICAgICAgIikgaGFzIG5vIGNhYmxlXG4iKTsgfQorCQkvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLworCQlpZiAoZXRoX2F1dG9fbmVnX2NuZiAmIElNTV9CSVQpCisJCQkvKiBZZXMhIEkgZG9uJ3QgY2FyZSBpZiBJIGNhbiB4bWl0IGEgcGFja2V0ICovCisJCQlyZXN1bHQgPSBBX0NORl9NRURJQV8xMEJfMjsKKwkJYnJlYWs7CisJY2FzZSBBX0NORl9NRURJQV9BVVRPOgorCQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCBldGhfbGluZWN0bCB8IEFVVE9fQVVJXzEwQkFTRVQpOworCQlpZiAoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfMTBCX1QpCisJCQlpZiAoKHJlc3VsdCA9IGRldGVjdF90cCgpKSAhPSAwKQorCQkJCWJyZWFrOworCQlpZiAoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfQVVJKQorCQkJaWYgKChyZXN1bHQgPSBkZXRlY3RfYXVpKG5pYykpICE9IDApCisJCQkJYnJlYWs7CisJCWlmIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfMikKKwkJCWlmICgocmVzdWx0ID0gZGV0ZWN0X2JuYyhuaWMpKSAhPSAwKQorCQkJCWJyZWFrOworCQljbHJsaW5lKCk7IHByaW50Zigibm8gbWVkaWEgZGV0ZWN0ZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwljbHJsaW5lKCk7CisJc3dpdGNoKHJlc3VsdCkgeworCWNhc2UgMDogICAgICAgICAgICAgICAgIHByaW50Zigibm8gbmV0d29yayBjYWJsZSBhdHRhY2hlZCB0byBjb25maWd1cmVkIG1lZGlhXG4iKTsKKwkJZ290byBlcnJvcjsKKwljYXNlIEFfQ05GX01FRElBXzEwQl9UOiBwcmludGYoInVzaW5nIDEwQmFzZS1UIChSSi00NSlcbiIpOworCQlicmVhazsKKwljYXNlIEFfQ05GX01FRElBX0FVSTogICBwcmludGYoInVzaW5nIDEwQmFzZS01IChBVUkpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBBX0NORl9NRURJQV8xMEJfMjogcHJpbnRmKCJ1c2luZyAxMEJhc2UtMiAoQk5DKVxuIik7CisJCWJyZWFrOworCX0KKwkKKwkvKiBUdXJuIG9uIGJvdGggcmVjZWl2ZSBhbmQgdHJhbnNtaXQgb3BlcmF0aW9ucyAqLworCXdyaXRlcmVnKFBQX0xpbmVDVEwsIHJlYWRyZWcoUFBfTGluZUNUTCkgfCBTRVJJQUxfUlhfT04gfAorCQkgU0VSSUFMX1RYX09OKTsKKwkKKwlyZXR1cm4gMDsKKyNpZmRlZiBFTUJFRERFRAorIGVycm9yOgorCXdyaXRlcmVnKFBQX0xpbmVDVEwsIHJlYWRyZWcoUFBfTGluZUNUTCkgJgorCQkgfihTRVJJQUxfVFhfT04gfCBTRVJJQUxfUlhfT04pKTsKKwlvdXR3KFBQX0NoaXBJRCwgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOworCXJldHVybiAwOworI2VuZGlmCisKKwluaWMtPm5pY19vcCAgID0gJmNzODl4MF9vcGVyYXRpb25zOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBjczg5eDBfZGlzYWJsZSAoIHN0cnVjdCBuaWMgKm5pYywKKwkJCSAgICAgc3RydWN0IGlzYV9kZXZpY2UgKmlzYSBfX3VudXNlZCApIHsKKwljczg5eDBfcmVzZXQobmljKTsKK30KKwkKK3N0YXRpYyBpc2FfcHJvYmVfYWRkcl90IGNzODl4MF9wcm9iZV9hZGRyc1tdID0geyAKKyNpZm5kZWYgRU1CRURERUQKKwkvKiB1c2UgImNvbnNlcnZhdGl2ZSIgZGVmYXVsdCB2YWx1ZXMgZm9yIGF1dG9wcm9iaW5nICovCisJMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgyMDAsIDB4MjIwLCAweDI0MCwKKwkweDI2MCwgMHgyODAsIDB4MmEwLCAweDJjMCwgMHgyZTAsCisJLyogaWYgdGhhdCBkaWQgbm90IHdvcmssIHRoZW4gYmUgbW9yZSBhZ2dyZXNzaXZlICovCisJMHgzMDEsIDB4MzIxLCAweDM0MSwgMHgyMDEsIDB4MjIxLCAweDI0MSwKKwkweDI2MSwgMHgyODEsIDB4MmExLCAweDJjMSwgMHgyZTEsCisjZWxzZQorCTB4MDEwMDAzMDAsCisjZW5kaWYKK307CisKK0lTQV9EUklWRVIgKCBjczg5eDBfZHJpdmVyLCBjczg5eDBfcHJvYmVfYWRkcnMsIGNzODl4MF9wcm9iZV9hZGRyLAorCSAgICAgSVNBUE5QX1ZFTkRPUignQycsJ1MnLCdDJyksIDB4MDAwNyApOworCitEUklWRVIgKCAiY3M4OXgwIiwgbmljX2RyaXZlciwgaXNhX2RyaXZlciwgY3M4OXgwX2RyaXZlciwKKwkgY3M4OXgwX3Byb2JlLCBjczg5eDBfZGlzYWJsZSApOworCitJU0FfUk9NICggImNzODl4MCIsICJDcnlzdGFsIFNlbWljb25kdWN0b3IgQ1M4OXgwIiApOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvY3M4OXgwLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9jczg5eDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzZiOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvY3M4OXgwLmgKQEAgLTAsMCArMSw0ODEgQEAKKy8qKgorICAgUGVyIGFuIGVtYWlsIG1lc3NhZ2UgZnJvbSBSdXNzIE5lbHNvbiA8bmVsc29uQGNyeW53ci5jb20+IG9uCisgICAxOCBNYXJjaCAyMDA4IHRoaXMgZmlsZSBpcyBub3cgbGljZW5zZWQgdW5kZXIgR1BMIFZlcnNpb24gMi4KKworICAgRnJvbTogUnVzcyBOZWxzb24gPG5lbHNvbkBjcnlud3IuY29tPgorICAgRGF0ZTogVHVlLCAxOCBNYXIgMjAwOCAxMjo0MjowMCAtMDQwMAorICAgU3ViamVjdDogUmU6IFtFdGhlcmJvb3QtZGV2ZWxvcGVyc10gY3M4OXgwIGRyaXZlciBpbiBldGhlcmJvb3QKKyAgIC0tIHF1b3RlIGZyb20gZW1haWwgCisgICBBcyBjb3B5cmlnaHQgaG9sZGVyLCBpZiBJIHNheSBpdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggdGhlIEdQTCwKKyAgIHRoZW4gaXQgZG9lc24ndCBjb25mbGljdCB3aXRoIHRoZSBHUEwuCisKKyAgIEhvd2V2ZXIsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gY2F1c2luZyBwZW9wbGUncyBicmFpbnMgdG8gb3ZlcmhlYXQsCisgICBzbyB5ZXMsIEkgZ3JhbnQgcGVybWlzc2lvbiBmb3IgdGhlIGNvZGUgdG8gYmUgcmVsaWNlbnNlZCB1bmRlciB0aGUKKyAgIEdQTHYyLiAgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoaXMgY2hhbmdlIGluIGxpY2Vuc2luZyBtYWtlcyBpdHMKKyAgIHdheSB1cHN0cmVhbS4gIC1ydXNzIAorICAgLS0gcXVvdGUgZnJvbSBlbWFpbAorKiovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisvKiAgQ29weXJpZ2h0LCAxOTg4LTE5OTIsIFJ1c3NlbGwgTmVsc29uLCBDcnlud3IgU29mdHdhcmUKKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjZGVmaW5lIFBQX0NoaXBJRCAweDAwMDAJLyogb2Zmc2V0ICAgMGggLT4gQ29ycCAtSUQgICAgICAgICAgICAgICovCisJCQkJLyogb2Zmc2V0ICAgMmggLT4gTW9kZWwvUHJvZHVjdCBOdW1iZXIgICovCisJCQkJLyogb2Zmc2V0ICAgM2ggLT4gQ2hpcCBSZXZpc2lvbiBOdW1iZXIgICovCisKKyNkZWZpbmUgUFBfSVNBSU9CIDB4MDAyMAkvKiAgSU8gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBQX0NTODkwMF9JU0FJTlQgMHgwMDIyCS8qICBJU0EgaW50ZXJydXB0IHNlbGVjdCAqLworI2RlZmluZSBQUF9DUzg5MjBfSVNBSU5UIDB4MDM3MAkvKiAgSVNBIGludGVycnVwdCBzZWxlY3QgKi8KKyNkZWZpbmUgUFBfQ1M4OTAwX0lTQURNQSAweDAwMjQJLyogIElTQSBSZWMgRE1BIGNoYW5uZWwgKi8KKyNkZWZpbmUgUFBfQ1M4OTIwX0lTQURNQSAweDAzNzQJLyogIElTQSBSZWMgRE1BIGNoYW5uZWwgKi8KKyNkZWZpbmUgUFBfSVNBU09GIDB4MDAyNgkvKiAgSVNBIERNQSBvZmZzZXQgKi8KKyNkZWZpbmUgUFBfRG1hRnJhbWVDbnQgMHgwMDI4CS8qICBJU0EgRE1BIEZyYW1lIGNvdW50ICovCisjZGVmaW5lIFBQX0RtYUJ5dGVDbnQgMHgwMDJBCS8qICBJU0EgRE1BIEJ5dGUgY291bnQgKi8KKyNkZWZpbmUgUFBfQ1M4OTAwX0lTQU1lbUIgMHgwMDJDCS8qICBNZW1vcnkgYmFzZSAqLworI2RlZmluZSBQUF9DUzg5MjBfSVNBTWVtQiAweDAzNDggLyogICovCisKKyNkZWZpbmUgUFBfSVNBQm9vdEJhc2UgMHgwMDMwCS8qICBCb290IFByb20gYmFzZSAgKi8KKyNkZWZpbmUgUFBfSVNBQm9vdE1hc2sgMHgwMDM0CS8qICBCb290IFByb20gTWFzayAqLworCisvKiBFRVBST00gZGF0YSBhbmQgY29tbWFuZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUFBfRUVDTUQgMHgwMDQwCQkvKiAgTlZSIEludGVyZmFjZSBDb21tYW5kIHJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0VFRGF0YSAweDAwNDIJLyogIE5WUiBJbnRlcmZhY2UgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBQUF9EZWJ1Z1JlZyAweDAwNDQJLyogIERlYnVnIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUFBfUnhDRkcgMHgwMTAyCQkvKiAgUnggQnVzIGNvbmZpZyAqLworI2RlZmluZSBQUF9SeENUTCAweDAxMDQJCS8qICBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfVHhDRkcgMHgwMTA2CQkvKiAgVHJhbnNtaXQgQ29uZmlnIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1R4Q01EIDB4MDEwOAkJLyogIFRyYW5zbWl0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfQnVmQ0ZHIDB4MDEwQQkvKiAgQnVzIGNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfTGluZUNUTCAweDAxMTIJLyogIExpbmUgQ29uZmlnIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1NlbGZDVEwgMHgwMTE0CS8qICBTZWxmIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfQnVzQ1RMIDB4MDExNgkvKiAgSVNBIGJ1cyBjb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1Rlc3RDVEwgMHgwMTE4CS8qICBUZXN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0F1dG9OZWdDVEwgMHgwMTFDCS8qICBBdXRvIE5lZ290aWF0aW9uIEN0cmwgKi8KKworI2RlZmluZSBQUF9JU1EgMHgwMTIwCQkvKiAgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBQUF9SeEV2ZW50IDB4MDEyNAkvKiAgUnggRXZlbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfVHhFdmVudCAweDAxMjgJLyogIFR4IEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0J1ZkV2ZW50IDB4MDEyQwkvKiAgQnVzIEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1J4TWlzcyAweDAxMzAJLyogIFJlY2VpdmUgTWlzcyBDb3VudCAqLworI2RlZmluZSBQUF9UeENvbCAweDAxMzIJCS8qICBUcmFuc21pdCBDb2xsaXNpb24gQ291bnQgKi8KKyNkZWZpbmUgUFBfTGluZVNUIDB4MDEzNAkvKiAgTGluZSBTdGF0ZSBSZWdpc3RlciAqLworI2RlZmluZSBQUF9TZWxmU1QgMHgwMTM2CS8qICBTZWxmIFN0YXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0J1c1NUIDB4MDEzOAkJLyogIEJ1cyBTdGF0dXMgKi8KKyNkZWZpbmUgUFBfVERSIDB4MDEzQwkJLyogIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgKi8KKyNkZWZpbmUgUFBfQXV0b05lZ1NUIDB4MDEzRQkvKiAgQXV0byBOZWcgU3RhdHVzICovCisjZGVmaW5lIFBQX1R4Q29tbWFuZCAweDAxNDQJLyogIFR4IENvbW1hbmQgKi8KKyNkZWZpbmUgUFBfVHhMZW5ndGggMHgwMTQ2CS8qICBUeCBMZW5ndGggKi8KKyNkZWZpbmUgUFBfTEFGIDB4MDE1MAkJLyogIEhhc2ggVGFibGUgKi8KKyNkZWZpbmUgUFBfSUEgMHgwMTU4CQkvKiAgUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciAqLworCisjZGVmaW5lIFBQX1J4U3RhdHVzIDB4MDQwMAkvKiAgUmVjZWl2ZSBzdGFydCBvZiBmcmFtZSAqLworI2RlZmluZSBQUF9SeExlbmd0aCAweDA0MDIJLyogIFJlY2VpdmUgTGVuZ3RoIG9mIGZyYW1lICovCisjZGVmaW5lIFBQX1J4RnJhbWUgMHgwNDA0CS8qICBSZWNlaXZlIGZyYW1lIHBvaW50ZXIgKi8KKyNkZWZpbmUgUFBfVHhGcmFtZSAweDBBMDAJLyogIFRyYW5zbWl0IGZyYW1lIHBvaW50ZXIgKi8KKworLyogIFByaW1hcnkgSS9PIEJhc2UgQWRkcmVzcy4gSWYgbm8gSS9PIGJhc2UgaXMgc3VwcGxpZWQgYnkgdGhlIHVzZXIsIHRoZW4gdGhpcyAqLworLyogIGNhbiBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IEkvTyBiYXNlIHRvIGFjY2VzcyB0aGUgUGFja2V0UGFnZSBBcmVhLiAqLworI2RlZmluZSBERUZBVUxUSU9CQVNFIDB4MDMwMAorI2RlZmluZSBGSVJTVF9JTyAweDAyMEMJCS8qICBGaXJzdCBJL08gcG9ydCB0byBjaGVjayAqLworI2RlZmluZSBMQVNUX0lPIDB4MDM3QwkJLyogIExhc3QgSS9PIHBvcnQgdG8gY2hlY2sgKCsxMGgpICovCisjZGVmaW5lIEFERF9NQVNLIDB4MzAwMAkJLyogIE1hc2sgaXQgdXNlIG9mIHRoZSBBRERfUE9SVCByZWdpc3RlciAqLworI2RlZmluZSBBRERfU0lHIDB4MzAwMAkJLyogIEV4cGVjdGVkIElEIHNpZ25hdHVyZSAqLworCisjZGVmaW5lIENISVBfRUlTQV9JRF9TSUcgMHg2MzBFICAgLyogIFByb2R1Y3QgSUQgQ29kZSBmb3IgQ3J5c3RhbCBDaGlwIChDUzg5MDAgc3BlYyA0LjMpICovCisKKyNpZmRlZglJQk1FSVBLVAorI2RlZmluZSBFSVNBX0lEX1NJRyAweDREMjQJLyogIElCTSAqLworI2RlZmluZSBQQVJUX05PX1NJRyAweDEwMTAJLyogIElCTSAqLworI2RlZmluZSBNT05HT09TRV9CSVQgMHgwMDAwCS8qICBJQk0gKi8KKyNlbHNlCisjZGVmaW5lIEVJU0FfSURfU0lHIDB4NjMwRQkvKiAgUG5QIFZlbmRvciBJRCAoc2FtZSBhcyBjaGlwIGlkIGZvciBDcnlzdGFsIGJvYXJkKSAqLworI2RlZmluZSBQQVJUX05PX1NJRyAweDQwMDAJLyogIElEIGNvZGUgQ1M4OTIwIGJvYXJkIChQblAgVmVuZG9yIFByb2R1Y3QgY29kZSkgKi8KKyNkZWZpbmUgTU9OR09PU0VfQklUIDB4MjAwMAkvKiAgUEFSVF9OT19TSUcgKyBNT05HT09TRV9CVVQgPT4gSUQgb2YgbW9uZ29vc2UgKi8KKyNlbmRpZgorCisjZGVmaW5lIFBST0RVQ1RfSURfQUREIDB4MDAwMiAgIC8qICBBZGRyZXNzIG9mIHByb2R1Y3QgSUQgKi8KKworLyogIE1hc2sgdG8gZmluZCBvdXQgdGhlIHR5cGVzIG9mICByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkVHX1RZUEVfTUFTSyAweDAwMUYKKworLyogIEVlcHJvbSBDb21tYW5kcyAqLworI2RlZmluZSBFUlNFX1dSX0VOQkwgMHgwMEYwCisjZGVmaW5lIEVSU0VfV1JfRElTQUJMRSAweDAwMDAKKworLyogIERlZmluZXMgQ29udHJvbC9Db25maWcgcmVnaXN0ZXIgcXVpbnR1cGxldCBudW1iZXJzICovCisjZGVmaW5lIFJYX0JVRl9DRkcgMHgwMDAzCisjZGVmaW5lIFJYX0NPTlRST0wgMHgwMDA1CisjZGVmaW5lIFRYX0NGRyAweDAwMDcKKyNkZWZpbmUgVFhfQ09NTUFORCAweDAwMDkKKyNkZWZpbmUgQlVGX0NGRyAweDAwMEIKKyNkZWZpbmUgTElORV9DT05UUk9MIDB4MDAxMworI2RlZmluZSBTRUxGX0NPTlRST0wgMHgwMDE1CisjZGVmaW5lIEJVU19DT05UUk9MIDB4MDAxNworI2RlZmluZSBURVNUX0NPTlRST0wgMHgwMDE5CisKKy8qICBEZWZpbmVzIFN0YXR1cy9Db3VudCByZWdpc3RlcnMgcXVpbnR1cGxldCBudW1iZXJzICovCisjZGVmaW5lIFJYX0VWRU5UIDB4MDAwNAorI2RlZmluZSBUWF9FVkVOVCAweDAwMDgKKyNkZWZpbmUgQlVGX0VWRU5UIDB4MDAwQworI2RlZmluZSBSWF9NSVNTX0NPVU5UIDB4MDAxMAorI2RlZmluZSBUWF9DT0xfQ09VTlQgMHgwMDEyCisjZGVmaW5lIExJTkVfU1RBVFVTIDB4MDAxNAorI2RlZmluZSBTRUxGX1NUQVRVUyAweDAwMTYKKyNkZWZpbmUgQlVTX1NUQVRVUyAweDAwMTgKKyNkZWZpbmUgVERSIDB4MDAxQworCisvKiBQUF9SeENGRyAtIFJlY2VpdmUgIENvbmZpZ3VyYXRpb24gYW5kIEludGVycnVwdCBNYXNrIGJpdCBkZWZpbml0aW9uIC0gIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgU0tJUF8xIDB4MDA0MAorI2RlZmluZSBSWF9TVFJFQU1fRU5CTCAweDAwODAKKyNkZWZpbmUgUlhfT0tfRU5CTCAweDAxMDAKKyNkZWZpbmUgUlhfRE1BX09OTFkgMHgwMjAwCisjZGVmaW5lIEFVVE9fUlhfRE1BIDB4MDQwMAorI2RlZmluZSBCVUZGRVJfQ1JDIDB4MDgwMAorI2RlZmluZSBSWF9DUkNfRVJST1JfRU5CTCAweDEwMDAKKyNkZWZpbmUgUlhfUlVOVF9FTkJMIDB4MjAwMAorI2RlZmluZSBSWF9FWFRSQV9EQVRBX0VOQkwgMHg0MDAwCisKKy8qIFBQX1J4Q1RMIC0gUmVjZWl2ZSBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBSWF9JQV9IQVNIX0FDQ0VQVCAweDAwNDAKKyNkZWZpbmUgUlhfUFJPTV9BQ0NFUFQgMHgwMDgwCisjZGVmaW5lIFJYX09LX0FDQ0VQVCAweDAxMDAKKyNkZWZpbmUgUlhfTVVMVENBU1RfQUNDRVBUIDB4MDIwMAorI2RlZmluZSBSWF9JQV9BQ0NFUFQgMHgwNDAwCisjZGVmaW5lIFJYX0JST0FEQ0FTVF9BQ0NFUFQgMHgwODAwCisjZGVmaW5lIFJYX0JBRF9DUkNfQUNDRVBUIDB4MTAwMAorI2RlZmluZSBSWF9SVU5UX0FDQ0VQVCAweDIwMDAKKyNkZWZpbmUgUlhfRVhUUkFfREFUQV9BQ0NFUFQgMHg0MDAwCisjZGVmaW5lIFJYX0FMTF9BQ0NFUFQgKFJYX1BST01fQUNDRVBUfFJYX0JBRF9DUkNfQUNDRVBUfFJYX1JVTlRfQUNDRVBUfFJYX0VYVFJBX0RBVEFfQUNDRVBUKQorLyogIERlZmF1bHQgcmVjZWl2ZSBtb2RlIC0gaW5kaXZpZHVhbGx5IGFkZHJlc3NlZCwgYnJvYWRjYXN0LCBhbmQgZXJyb3IgZnJlZSAqLworI2RlZmluZSBERUZfUlhfQUNDRVBUIChSWF9JQV9BQ0NFUFQgfCBSWF9CUk9BRENBU1RfQUNDRVBUIHwgUlhfT0tfQUNDRVBUKQorCisvKiBQUF9UeENGRyAtIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gSW50ZXJydXB0IE1hc2sgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCisjZGVmaW5lIFRYX0xPU1RfQ1JTX0VOQkwgMHgwMDQwCisjZGVmaW5lIFRYX1NRRV9FUlJPUl9FTkJMIDB4MDA4MAorI2RlZmluZSBUWF9PS19FTkJMIDB4MDEwMAorI2RlZmluZSBUWF9MQVRFX0NPTF9FTkJMIDB4MDIwMAorI2RlZmluZSBUWF9KQlJfRU5CTCAweDA0MDAKKyNkZWZpbmUgVFhfQU5ZX0NPTF9FTkJMIDB4MDgwMAorI2RlZmluZSBUWF8xNl9DT0xfRU5CTCAweDgwMDAKKworLyogUFBfVHhDTUQgLSBUcmFuc21pdCBDb21tYW5kIGJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCisjZGVmaW5lIFRYX1NUQVJUXzRfQllURVMgMHgwMDAwCisjZGVmaW5lIFRYX1NUQVJUXzY0X0JZVEVTIDB4MDA0MAorI2RlZmluZSBUWF9TVEFSVF8xMjhfQllURVMgMHgwMDgwCisjZGVmaW5lIFRYX1NUQVJUX0FMTF9CWVRFUyAweDAwQzAKKyNkZWZpbmUgVFhfRk9SQ0UgMHgwMTAwCisjZGVmaW5lIFRYX09ORV9DT0wgMHgwMjAwCisjZGVmaW5lIFRYX1RXT19QQVJUX0RFRkZfRElTQUJMRSAweDA0MDAKKyNkZWZpbmUgVFhfTk9fQ1JDIDB4MTAwMAorI2RlZmluZSBUWF9SVU5UIDB4MjAwMAorCisvKiBQUF9CdWZDRkcgLSBCdWZmZXIgQ29uZmlndXJhdGlvbiBJbnRlcnJ1cHQgTWFzayBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgR0VORVJBVEVfU1dfSU5URVJSVVBUIDB4MDA0MAorI2RlZmluZSBSWF9ETUFfRU5CTCAweDAwODAKKyNkZWZpbmUgUkVBRFlfRk9SX1RYX0VOQkwgMHgwMTAwCisjZGVmaW5lIFRYX1VOREVSUlVOX0VOQkwgMHgwMjAwCisjZGVmaW5lIFJYX01JU1NfRU5CTCAweDA0MDAKKyNkZWZpbmUgUlhfMTI4X0JZVEVfRU5CTCAweDA4MDAKKyNkZWZpbmUgVFhfQ09MX0NPVU5UX09WUkZMT1dfRU5CTCAweDEwMDAKKyNkZWZpbmUgUlhfTUlTU19DT1VOVF9PVlJGTE9XX0VOQkwgMHgyMDAwCisjZGVmaW5lIFJYX0RFU1RfTUFUQ0hfRU5CTCAweDgwMDAKKworLyogUFBfTGluZUNUTCAtIExpbmUgQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgU0VSSUFMX1JYX09OIDB4MDA0MAorI2RlZmluZSBTRVJJQUxfVFhfT04gMHgwMDgwCisjZGVmaW5lIEFVSV9PTkxZIDB4MDEwMAorI2RlZmluZSBBVVRPX0FVSV8xMEJBU0VUIDB4MDIwMAorI2RlZmluZSBNT0RJRklFRF9CQUNLT0ZGIDB4MDgwMAorI2RlZmluZSBOT19BVVRPX1BPTEFSSVRZIDB4MTAwMAorI2RlZmluZSBUV09fUEFSVF9ERUZESVMgMHgyMDAwCisjZGVmaW5lIExPV19SWF9TUVVFTENIIDB4NDAwMAorCisvKiBQUF9TZWxmQ1RMIC0gU29mdHdhcmUgU2VsZiBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBQT1dFUl9PTl9SRVNFVCAweDAwNDAKKyNkZWZpbmUgU1dfU1RPUCAweDAxMDAKKyNkZWZpbmUgU0xFRVBfT04gMHgwMjAwCisjZGVmaW5lIEFVVE9fV0FLRVVQIDB4MDQwMAorI2RlZmluZSBIQ0IwX0VOQkwgMHgxMDAwCisjZGVmaW5lIEhDQjFfRU5CTCAweDIwMDAKKyNkZWZpbmUgSENCMCAweDQwMDAKKyNkZWZpbmUgSENCMSAweDgwMDAKKworLyogUFBfQnVzQ1RMIC0gSVNBIEJ1cyBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBSRVNFVF9SWF9ETUEgMHgwMDQwCisjZGVmaW5lIE1FTU9SWV9PTiAweDA0MDAKKyNkZWZpbmUgRE1BX0JVUlNUX01PREUgMHgwODAwCisjZGVmaW5lIElPX0NIQU5ORUxfUkVBRFlfT04gMHgxMDAwCisjZGVmaW5lIFJYX0RNQV9TSVpFXzY0SyAweDIwMDAKKyNkZWZpbmUgRU5BQkxFX0lSUSAweDgwMDAKKworLyogUFBfVGVzdENUTCAtIFRlc3QgQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgTElOS19PRkYgMHgwMDgwCisjZGVmaW5lIEVOREVDX0xPT1BCQUNLIDB4MDIwMAorI2RlZmluZSBBVUlfTE9PUEJBQ0sgMHgwNDAwCisjZGVmaW5lIEJBQ0tPRkZfT0ZGIDB4MDgwMAorI2RlZmluZSBGQVNUX1RFU1QgMHg4MDAwCisKKy8qIFBQX1J4RXZlbnQgLSBSZWNlaXZlIEV2ZW50IEJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCisjZGVmaW5lIFJYX0lBX0hBU0hFRCAweDAwNDAKKyNkZWZpbmUgUlhfRFJJQkJMRSAweDAwODAKKyNkZWZpbmUgUlhfT0sgMHgwMTAwCisjZGVmaW5lIFJYX0hBU0hFRCAweDAyMDAKKyNkZWZpbmUgUlhfSUEgMHgwNDAwCisjZGVmaW5lIFJYX0JST0FEQ0FTVCAweDA4MDAKKyNkZWZpbmUgUlhfQ1JDX0VSUk9SIDB4MTAwMAorI2RlZmluZSBSWF9SVU5UIDB4MjAwMAorI2RlZmluZSBSWF9FWFRSQV9EQVRBIDB4NDAwMAorCisjZGVmaW5lIEhBU0hfSU5ERVhfTUFTSyAweDBGQzAwCisKKy8qIFBQX1R4RXZlbnQgLSBUcmFuc21pdCBFdmVudCBCaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLworI2RlZmluZSBUWF9MT1NUX0NSUyAweDAwNDAKKyNkZWZpbmUgVFhfU1FFX0VSUk9SIDB4MDA4MAorI2RlZmluZSBUWF9PSyAweDAxMDAKKyNkZWZpbmUgVFhfTEFURV9DT0wgMHgwMjAwCisjZGVmaW5lIFRYX0pCUiAweDA0MDAKKyNkZWZpbmUgVFhfMTZfQ09MIDB4ODAwMAorI2RlZmluZSBUWF9TRU5EX09LX0JJVFMgKFRYX09LfFRYX0xPU1RfQ1JTKQorI2RlZmluZSBUWF9DT0xfQ09VTlRfTUFTSyAweDc4MDAKKworLyogUFBfQnVmRXZlbnQgLSBCdWZmZXIgRXZlbnQgQml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KKyNkZWZpbmUgU1dfSU5URVJSVVBUIDB4MDA0MAorI2RlZmluZSBSWF9ETUEgMHgwMDgwCisjZGVmaW5lIFJFQURZX0ZPUl9UWCAweDAxMDAKKyNkZWZpbmUgVFhfVU5ERVJSVU4gMHgwMjAwCisjZGVmaW5lIFJYX01JU1MgMHgwNDAwCisjZGVmaW5lIFJYXzEyOF9CWVRFIDB4MDgwMAorI2RlZmluZSBUWF9DT0xfT1ZSRkxXIDB4MTAwMAorI2RlZmluZSBSWF9NSVNTX09WUkZMVyAweDIwMDAKKyNkZWZpbmUgUlhfREVTVF9NQVRDSCAweDgwMDAKKworLyogUFBfTGluZVNUIC0gRXRoZXJuZXQgTGluZSBTdGF0dXMgYml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KKyNkZWZpbmUgTElOS19PSyAweDAwODAKKyNkZWZpbmUgQVVJX09OIDB4MDEwMAorI2RlZmluZSBURU5CQVNFVF9PTiAweDAyMDAKKyNkZWZpbmUgUE9MQVJJVFlfT0sgMHgxMDAwCisjZGVmaW5lIENSU19PSyAweDQwMDAKKworLyogUFBfU2VsZlNUIC0gQ2hpcCBTb2Z0d2FyZSBTdGF0dXMgYml0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgQUNUSVZFXzMzViAweDAwNDAKKyNkZWZpbmUgSU5JVF9ET05FIDB4MDA4MAorI2RlZmluZSBTSV9CVVNZIDB4MDEwMAorI2RlZmluZSBFRVBST01fUFJFU0VOVCAweDAyMDAKKyNkZWZpbmUgRUVQUk9NX09LIDB4MDQwMAorI2RlZmluZSBFTF9QUkVTRU5UIDB4MDgwMAorI2RlZmluZSBFRV9TSVpFXzY0IDB4MTAwMAorCisvKiBQUF9CdXNTVCAtIElTQSBCdXMgU3RhdHVzIGJpdCBkZWZpbml0aW9uICovCisjZGVmaW5lIFRYX0JJRF9FUlJPUiAweDAwODAKKyNkZWZpbmUgUkVBRFlfRk9SX1RYX05PVyAweDAxMDAKKworLyogUFBfQXV0b05lZ0NUTCAtIEF1dG8gTmVnb3RpYXRpb24gQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBSRV9ORUdfTk9XIDB4MDA0MAorI2RlZmluZSBBTExPV19GRFggMHgwMDgwCisjZGVmaW5lIEFVVE9fTkVHX0VOQUJMRSAweDAxMDAKKyNkZWZpbmUgTkxQX0VOQUJMRSAweDAyMDAKKyNkZWZpbmUgRk9SQ0VfRkRYIDB4ODAwMAorI2RlZmluZSBBVVRPX05FR19CSVRTIChGT1JDRV9GRFh8TkxQX0VOQUJMRXxBVVRPX05FR19FTkFCTEUpCisjZGVmaW5lIEFVVE9fTkVHX01BU0sgKEZPUkNFX0ZEWHxOTFBfRU5BQkxFfEFVVE9fTkVHX0VOQUJMRXxBTExPV19GRFh8UkVfTkVHX05PVykKKworLyogUFBfQXV0b05lZ1NUIC0gQXV0byBOZWdvdGlhdGlvbiBTdGF0dXMgYml0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgQVVUT19ORUdfQlVTWSAweDAwODAKKyNkZWZpbmUgRkxQX0xJTksgMHgwMTAwCisjZGVmaW5lIEZMUF9MSU5LX0dPT0QgMHgwODAwCisjZGVmaW5lIExJTktfRkFVTFQgMHgxMDAwCisjZGVmaW5lIEhEWF9BQ1RJVkUgMHg0MDAwCisjZGVmaW5lIEZEWF9BQ1RJVkUgMHg4MDAwCisKKy8qICBUaGUgZm9sbG93aW5nIGJsb2NrIGRlZmluZXMgdGhlIElTUSBldmVudCB0eXBlcyAqLworI2RlZmluZSBJU1FfUkVDRUlWRVJfRVZFTlQgMHgwNAorI2RlZmluZSBJU1FfVFJBTlNNSVRURVJfRVZFTlQgMHgwOAorI2RlZmluZSBJU1FfQlVGRkVSX0VWRU5UIDB4MGMKKyNkZWZpbmUgSVNRX1JYX01JU1NfRVZFTlQgMHgxMAorI2RlZmluZSBJU1FfVFhfQ09MX0VWRU5UIDB4MTIKKworI2RlZmluZSBJU1FfRVZFTlRfTUFTSyAweDAwM0YgICAvKiAgSVNRIG1hc2sgdG8gZmluZCBvdXQgdHlwZSBvZiBldmVudCAqLworI2RlZmluZSBJU1FfSElTVCAxNgkJLyogIHNtYWxsIGhpc3RvcnkgYnVmZmVyICovCisjZGVmaW5lIEFVVE9JTkNSRU1FTlQgMHg4MDAwCS8qICBCaXQgbWFzayB0byBzZXQgYml0LTE1IGZvciBhdXRvaW5jcmVtZW50ICovCisKKyNkZWZpbmUgVFhSWEJVRlNJWkUgMHgwNjAwCisjZGVmaW5lIFJYRE1BQlVGU0laRSAweDgwMDAKKyNkZWZpbmUgUlhETUFTSVpFIDB4NDAwMAorI2RlZmluZSBUWFJYX0xFTkdUSF9NQVNLIDB4MDdGRgorCisvKiAgcnggb3B0aW9ucyBiaXRzICovCisjZGVmaW5lIFJDVl9XSVRIX1JYT04JMSAgICAgICAvKiAgU2V0IFNlclJ4IE9OICovCisjZGVmaW5lIFJDVl9DT1VOVFMJMiAgICAgICAvKiAgVXNlIEZyYW1lY250MSAqLworI2RlZmluZSBSQ1ZfUE9ORwk0ICAgICAgIC8qICBQb25nIHJlc3BvbmRlbnQgKi8KKyNkZWZpbmUgUkNWX0RPTkcJOCAgICAgICAvKiAgRG9uZyBvcGVyYXRpb24gKi8KKyNkZWZpbmUgUkNWX1BPTExJTkcJMHgxMAkvKiAgUG9sbCBSeEV2ZW50ICovCisjZGVmaW5lIFJDVl9JU1EJCTB4MjAJLyogIFVzZSBJU1EsIGludCAqLworI2RlZmluZSBSQ1ZfQVVUT19ETUEJMHgxMDAJLyogIFNldCBBdXRvUnhETUFFICovCisjZGVmaW5lIFJDVl9ETUEJCTB4MjAwCS8qICBTZXQgUnhETUEgb25seSAqLworI2RlZmluZSBSQ1ZfRE1BX0FMTAkweDQwMAkvKiAgQ29weSBhbGwgRE1BJ2VkICovCisjZGVmaW5lIFJDVl9GSVhFRF9EQVRBCTB4ODAwCS8qICBFdmVyeSBmcmFtZSBzYW1lICovCisjZGVmaW5lIFJDVl9JTwkJMHgxMDAwCS8qICBVc2UgSVNBIElPIG9ubHkgKi8KKyNkZWZpbmUgUkNWX01FTU9SWQkweDIwMDAJLyogIFVzZSBJU0EgTWVtb3J5ICovCisKKyNkZWZpbmUgUkFNX1NJWkUJMHgxMDAwICAgICAgIC8qICBUaGUgY2FyZCBoYXMgNGsgYnl0ZXMgb3IgUkFNICovCisjZGVmaW5lIFBLVF9TVEFSVCBQUF9UeEZyYW1lICAvKiAgU3RhcnQgb2YgcGFja2V0IFJBTSAqLworCisjZGVmaW5lIFJYX0ZSQU1FX1BPUlQJMHgwMDAwCisjZGVmaW5lIFRYX0ZSQU1FX1BPUlQgUlhfRlJBTUVfUE9SVAorI2RlZmluZSBUWF9DTURfUE9SVAkweDAwMDQKKyNkZWZpbmUgVFhfTk9XCQkweDAwMDAgICAgICAgLyogIFR4IHBhY2tldCBhZnRlciAgIDUgYnl0ZXMgY29waWVkICovCisjZGVmaW5lIFRYX0FGVEVSXzM4MQkweDAwMjAgICAgICAgLyogIFR4IHBhY2tldCBhZnRlciAzODEgYnl0ZXMgY29waWVkICovCisjZGVmaW5lIFRYX0FGVEVSX0FMTAkweDAwQzAgICAgICAgLyogIFR4IHBhY2tldCBhZnRlciBhbGwgYnl0ZXMgY29waWVkICovCisjZGVmaW5lIFRYX0xFTl9QT1JUCTB4MDAwNgorI2RlZmluZSBJU1FfUE9SVAkweDAwMDgKKyNkZWZpbmUgQUREX1BPUlQJMHgwMDBBCisjZGVmaW5lIERBVEFfUE9SVAkweDAwMEMKKworI2RlZmluZSBFRVBST01fV1JJVEVfRU4JCTB4MDBGMAorI2RlZmluZSBFRVBST01fV1JJVEVfRElTCTB4MDAwMAorI2RlZmluZSBFRVBST01fV1JJVEVfQ01ECTB4MDEwMAorI2RlZmluZSBFRVBST01fUkVBRF9DTUQJCTB4MDIwMAorCisvKiAgUmVjZWl2ZSBIZWFkZXIgKi8KKy8qICBEZXNjcmlwdGlvbiBvZiBoZWFkZXIgb2YgZWFjaCBwYWNrZXQgaW4gcmVjZWl2ZSBhcmVhIG9mIG1lbW9yeSAqLworI2RlZmluZSBSQlVGX0VWRU5UX0xPVwkwICAgLyogIExvdyBieXRlIG9mIFJ4RXZlbnQgLSBzdGF0dXMgb2YgcmVjZWl2ZWQgZnJhbWUgKi8KKyNkZWZpbmUgUkJVRl9FVkVOVF9ISUdICTEgICAvKiAgSGlnaCBieXRlIG9mIFJ4RXZlbnQgLSBzdGF0dXMgb2YgcmVjZWl2ZWQgZnJhbWUgKi8KKyNkZWZpbmUgUkJVRl9MRU5fTE9XCTIgICAvKiAgTGVuZ3RoIG9mIHJlY2VpdmVkIGRhdGEgLSBsb3cgYnl0ZSAqLworI2RlZmluZSBSQlVGX0xFTl9ISQkzICAgLyogIExlbmd0aCBvZiByZWNlaXZlZCBkYXRhIC0gaGlnaCBieXRlICovCisjZGVmaW5lIFJCVUZfSEVBRF9MRU4JNCAgIC8qICBMZW5ndGggb2YgdGhpcyBoZWFkZXIgKi8KKworI2RlZmluZSBDSElQX1JFQUQgMHgxICAgLyogIFVzZWQgdG8gbWFyayBzdGF0ZSBvZiB0aGUgcmVwaW5zIGNvZGUgKGNoaXAgb3IgZG1hKSAqLworI2RlZmluZSBETUFfUkVBRCAweDIgICAvKiAgVXNlZCB0byBtYXJrIHN0YXRlIG9mIHRoZSByZXBpbnMgY29kZSAoY2hpcCBvciBkbWEpICovCisKKy8qICBmb3IgYmlvcyBzY2FuICovCisvKiAgKi8KKyNpZmRlZglDU0RFQlVHCisvKiAgdXNlIHRoZXNlIHZhbHVlcyBmb3IgZGVidWdnaW5nIGJpb3Mgc2NhbiAqLworI2RlZmluZSBCSU9TX1NUQVJUX1NFRyAweDAwMDAwCisjZGVmaW5lIEJJT1NfT0ZGU0VUX0lOQyAweDAwMTAKKyNlbHNlCisjZGVmaW5lIEJJT1NfU1RBUlRfU0VHIDB4MGMwMDAKKyNkZWZpbmUgQklPU19PRkZTRVRfSU5DIDB4MDIwMAorI2VuZGlmCisKKyNkZWZpbmUgQklPU19MQVNUX09GRlNFVCAweDBmYzAwCisKKy8qICBCeXRlIG9mZnNldHMgaW50byB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24gYnVmZmVyICovCisjZGVmaW5lIElTQV9DTkZfT0ZGU0VUIDB4NgorI2RlZmluZSBUWF9DVExfT0ZGU0VUIChJU0FfQ05GX09GRlNFVCArIDgpCQkJLyogIDg5MDAgZWVwcm9tICovCisjZGVmaW5lIEFVVE9fTkVHX0NORl9PRkZTRVQgKElTQV9DTkZfT0ZGU0VUICsgOCkJCS8qICA4OTIwIGVlcHJvbSAqLworCisgIC8qICB0aGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgdGhlIGJpdHMgaW4gdGhlIGVlcHJvbSBhcmUgZ2VuZXJhbGx5ICAqLworICAvKiAgaW4gdGhlIHNhbWUgcG9zaXRpb24gYXMgdGhvc2UgaW4gdGhlIGF1dG9uZWdjdGwgcmVnaXN0ZXIuICovCisgIC8qICBPZiBjb3Vyc2UgdGhlIElNTSBiaXQgaXMgbm90IGluIHRoYXQgcmVnaXN0ZXIgc28gaXQgbXVzdCBiZSAgKi8KKyAgLyogIG1hc2tlZCBvdXQgKi8KKyNkZWZpbmUgRUVfRk9SQ0VfRkRYICAweDgwMDAKKyNkZWZpbmUgRUVfTkxQX0VOQUJMRSAweDAyMDAKKyNkZWZpbmUgRUVfQVVUT19ORUdfRU5BQkxFIDB4MDEwMAorI2RlZmluZSBFRV9BTExPV19GRFggMHgwMDgwCisjZGVmaW5lIEVFX0FVVE9fTkVHX0NORl9NQVNLIChFRV9GT1JDRV9GRFh8RUVfTkxQX0VOQUJMRXxFRV9BVVRPX05FR19FTkFCTEV8RUVfQUxMT1dfRkRYKQorCisjZGVmaW5lIElNTV9CSVQgMHgwMDQwCQkvKiAgaWdub3JlIG1pc3NpbmcgbWVkaWEgKi8KKworI2RlZmluZSBBREFQVEVSX0NORl9PRkZTRVQgKEFVVE9fTkVHX0NORl9PRkZTRVQgKyAyKQorI2RlZmluZSBBX0NORl8xMEJfVCAweDAwMDEKKyNkZWZpbmUgQV9DTkZfQVVJIDB4MDAwMgorI2RlZmluZSBBX0NORl8xMEJfMiAweDAwMDQKKyNkZWZpbmUgQV9DTkZfTUVESUFfVFlQRSAweDAwNjAKKyNkZWZpbmUgQV9DTkZfTUVESUFfQVVUTyAweDAwMDAKKyNkZWZpbmUgQV9DTkZfTUVESUFfMTBCX1QgMHgwMDIwCisjZGVmaW5lIEFfQ05GX01FRElBX0FVSSAweDAwNDAKKyNkZWZpbmUgQV9DTkZfTUVESUFfMTBCXzIgMHgwMDYwCisjZGVmaW5lIEFfQ05GX0RDX0RDX1BPTEFSSVRZIDB4MDA4MAorI2RlZmluZSBBX0NORl9OT19BVVRPX1BPTEFSSVRZIDB4MjAwMAorI2RlZmluZSBBX0NORl9MT1dfUlhfU1FVRUxDSCAweDQwMDAKKyNkZWZpbmUgQV9DTkZfRVhUTkRfMTBCXzIgMHg4MDAwCisKKyNkZWZpbmUgUEFDS0VUX1BBR0VfT0ZGU0VUIDB4OAorCisvKiAgQml0IGRlZmluaXRpb25zIGZvciB0aGUgSVNBIGNvbmZpZ3VyYXRpb24gd29yZCBmcm9tIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgSU5UX05PX01BU0sgMHgwMDBGCisjZGVmaW5lIERNQV9OT19NQVNLIDB4MDA3MAorI2RlZmluZSBJU0FfRE1BX1NJWkUgMHgwMjAwCisjZGVmaW5lIElTQV9BVVRPX1J4RE1BIDB4MDQwMAorI2RlZmluZSBJU0FfUnhETUEgMHgwODAwCisjZGVmaW5lIERNQV9CVVJTVCAweDEwMDAKKyNkZWZpbmUgU1RSRUFNX1RSQU5TRkVSIDB4MjAwMAorI2RlZmluZSBBTllfSVNBX0RNQSAoSVNBX0FVVE9fUnhETUEgfCBJU0FfUnhETUEpCisKKy8qICBETUEgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BX0JBU0UgMHgwMCAgICAgLyogIERNQSBjb250cm9sbGVyIGJhc2UgKi8KKyNkZWZpbmUgRE1BX0JBU0VfMiAweDBDMCAgICAvKiAgRE1BIGNvbnRyb2xsZXIgYmFzZSAqLworCisjZGVmaW5lIERNQV9TVEFUIDB4MEQwICAgIC8qICBETUEgY29udHJvbGxlciBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX01BU0sgMHgwRDQgICAgLyogIERNQSBjb250cm9sbGVyIG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX01PREUgMHgwRDYgICAgLyogIERNQSBjb250cm9sbGVyIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX1JFU0VURkYgMHgwRDggICAgLyogIERNQSBjb250cm9sbGVyIGZpcnN0L2xhc3QgZmxpcCBmbG9wICovCisKKy8qICBETUEgZGF0YSAqLworI2RlZmluZSBETUFfRElTQUJMRSAweDA0ICAgICAvKiAgRGlzYWJsZSBjaGFubmVsIG4gKi8KKyNkZWZpbmUgRE1BX0VOQUJMRSAweDAwICAgICAvKiAgRW5hYmxlIGNoYW5uZWwgbiAqLworLyogIERlbWFuZCB0cmFuc2ZlcnMsIGluY3IuIGFkZHJlc3MsIGF1dG8gaW5pdCwgd3JpdGVzLCBjaC4gbiAqLworI2RlZmluZSBETUFfUlhfTU9ERSAweDE0CisvKiAgRGVtYW5kIHRyYW5zZmVycywgaW5jci4gYWRkcmVzcywgYXV0byBpbml0LCByZWFkcywgY2guIG4gKi8KKyNkZWZpbmUgRE1BX1RYX01PREUgMHgxOAorCisjZGVmaW5lIERNQV9TSVpFICgxNioxMDI0KSAvKiAgU2l6ZSBvZiBkbWEgYnVmZmVyIC0gMTZrICovCisKKyNkZWZpbmUgQ1M4OTAwIDB4MDAwMAorI2RlZmluZSBDUzg5MjAgMHg0MDAwCisjZGVmaW5lIENTODkyME0gMHg2MDAwCisjZGVmaW5lIFJFVklTT05fQklUUyAweDFGMDAKKyNkZWZpbmUgRUVWRVJfTlVNQkVSIDB4MTIKKyNkZWZpbmUgQ0hLU1VNX0xFTiAweDE0CisjZGVmaW5lIENIS1NVTV9WQUwgMHgwMDAwCisjZGVmaW5lIFNUQVJUX0VFUFJPTV9EQVRBIDB4MDAxYyAvKiAgT2Zmc2V0IGludG8gZWVwcm9tIGZvciBzdGFydCBvZiBkYXRhICovCisjZGVmaW5lIElSUV9NQVBfRUVQUk9NX0RBVEEgMHgwMDQ2IC8qICBPZmZzZXQgaW50byBlZXByb20gZm9yIHRoZSBJUlEgbWFwICovCisjZGVmaW5lIElSUV9NQVBfTEVOIDB4MDAwNCAvKiAgTm8gb2YgYnl0ZXMgdG8gcmVhZCBmb3IgdGhlIElSUSBtYXAgKi8KKyNkZWZpbmUgUE5QX0lSUV9GUk1UIDB4MDAyMiAvKiAgUE5QIHNtYWxsIGl0ZW0gSVJRIGZvcm1hdCAqLworI2RlZmluZSBDUzg5MDBfSVJRX01BUCAweDFjMjAgLyogIFRoaXMgSVJRIG1hcCBpcyBmaXhlZCAqLworCisjZGVmaW5lIENTODkyMF9OT19JTlRTIDB4MEYgICAvKiAgTWF4IENTODkyMCBpbnRlcnJ1cHQgc2VsZWN0ICMgKi8KKworI2RlZmluZSBQTlBfQUREX1BPUlQgMHgwMjc5CisjZGVmaW5lIFBOUF9XUklURV9QT1JUIDB4MEE3OQorCisjZGVmaW5lIEdFVF9QTlBfSVNBX1NUUlVDVCAweDQwCisjZGVmaW5lIFBOUF9JU0FfU1RSVUNUX0xFTiAweDA2CisjZGVmaW5lIFBOUF9DU05fQ05UX09GRiAweDAxCisjZGVmaW5lIFBOUF9SRF9QT1JUX09GRiAweDAyCisjZGVmaW5lIFBOUF9GVU5DVElPTl9PSyAweDAwCisjZGVmaW5lIFBOUF9XQUtFIDB4MDMKKyNkZWZpbmUgUE5QX1JTUkNfREFUQSAweDA0CisjZGVmaW5lIFBOUF9SU1JDX1JFQURZIDB4MDEKKyNkZWZpbmUgUE5QX1NUQVRVUyAweDA1CisjZGVmaW5lIFBOUF9BQ1RJVkFURSAweDMwCisjZGVmaW5lIFBOUF9DTkZfSU9fSCAweDYwCisjZGVmaW5lIFBOUF9DTkZfSU9fTCAweDYxCisjZGVmaW5lIFBOUF9DTkZfSU5UIDB4NzAKKyNkZWZpbmUgUE5QX0NORl9ETUEgMHg3NAorI2RlZmluZSBQTlBfQ05GX01FTSAweDQ4CisKKyNkZWZpbmUgQklUMCAxCisjZGVmaW5lIEJJVDE1IDB4ODAwMAorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvY3M4OXgwLnR4dCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2NzODl4MC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiN2RmMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2NzODl4MC50eHQKQEAgLTAsMCArMSw0NSBAQAorLyoqCisgICBQZXIgYW4gZW1haWwgbWVzc2FnZSBmcm9tIFJ1c3MgTmVsc29uIDxuZWxzb25AY3J5bndyLmNvbT4gb24KKyAgIDE4IE1hcmNoIDIwMDggdGhlIGZpbGVzIGNzODl4MC5bY2hdIGFyZSBub3cgbGljZW5zZWQgdW5kZXIgR1BMCisgICBWZXJzaW9uIDIuCisKKyAgIEZyb206IFJ1c3MgTmVsc29uIDxuZWxzb25AY3J5bndyLmNvbT4KKyAgIERhdGU6IFR1ZSwgMTggTWFyIDIwMDggMTI6NDI6MDAgLTA0MDAKKyAgIFN1YmplY3Q6IFJlOiBbRXRoZXJib290LWRldmVsb3BlcnNdIGNzODl4MCBkcml2ZXIgaW4gZXRoZXJib290CisgICAtLSBxdW90ZSBmcm9tIGVtYWlsIAorICAgQXMgY29weXJpZ2h0IGhvbGRlciwgaWYgSSBzYXkgaXQgZG9lc24ndCBjb25mbGljdCB3aXRoIHRoZSBHUEwsCisgICB0aGVuIGl0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCB0aGUgR1BMLgorCisgICBIb3dldmVyLCB0aGVyZSdzIG5vIHBvaW50IGluIGNhdXNpbmcgcGVvcGxlJ3MgYnJhaW5zIHRvIG92ZXJoZWF0LAorICAgc28geWVzLCBJIGdyYW50IHBlcm1pc3Npb24gZm9yIHRoZSBjb2RlIHRvIGJlIHJlbGljZW5zZWQgdW5kZXIgdGhlCisgICBHUEx2Mi4gIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGlzIGNoYW5nZSBpbiBsaWNlbnNpbmcgbWFrZXMgaXRzCisgICB3YXkgdXBzdHJlYW0uICAtcnVzcyAKKyAgIC0tIHF1b3RlIGZyb20gZW1haWwKKyoqLworCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGUgZW5jbG9zZWQgY3M4OXgwLltjaF0gZHJpdmVyCitvbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEV0aGVyYm9vdCBwYWNrYWdlLiAgVGhlIGNvZGUgaXMKK29yZGluYXJpbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdQTC4KKworUnVzcyBOZWxzb24sIEphbnVhcnkgMjAwMAorCitDUkVESVRTCisKK0kgd2FudCB0byB0aGFuaworCisgIE1pa2UgQ3J1c2UgPG1jcnVzZUBjdGktbHRkLmNvbT4KKyAgICAgZm9yIHByb3ZpZGluZyBhbiBldmFsdWF0aW9uIE5JQyBhbmQgZm9yIHNwb25zb3JpbmcgdGhlCisgICAgIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorCisgIFJhbmRhbGwgU2VhcnMgPHNlYXJzQGNyeXN0YWwuY2lycnVzLmNvbT4KKyAgRGV2YSBCb2RhcyA8Ym9kYXNAY3J5c3RhbC5jaXJydXMuY29tPgorICBBbmRyZWFzIEtyYWVtZXIgPGFrcmFlbWVyQGNyeXN0YWwuY2lycnVzLmNvbT4KKyAgV29sZmdhbmcgS3JhdXNlIDwxMDAzMDMuMjY3M0Bjb21wdXNlcnZlLmNvbT4KKyAgICAgZm9yIGV4Y2VsbGVudCB0ZWNobmljYWwgc3VwcG9ydCBhbmQgZm9yIHByb3ZpZGluZyB0aGUgcmVxdWlyZWQKKyAgICAgcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24uIEkgYXBwcmVjaWF0ZSBDcnlzdGFsIFNlbWljb25kdWN0b3IncworICAgICBjb21taXRtZW50IHRvd2FyZHMgZnJlZSBzb2Z0d2FyZS4KKworICBSdXNzZWxsIE5lbHNvbiA8bmVsc29uQGNyeW53ci5jb20+CisgICAgIGZvciB3cml0aW5nIHRoZSBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgQ1M4OXgwCisgICAgIGNoaXBzZXQuIFJ1c3NlbCdzIGNvZGUgaXMgdmVyeSB3ZWxsIGRlc2lnbmVkIGFuZCBzaW1wbGlmaWVkIG15CisgICAgIGpvYiBhIGxvdC4KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2Rhdmljb20uYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2Rhdmljb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M1ZTFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZGF2aWNvbS5jCkBAIC0wLDAgKzEsNzI3IEBACisjaWZkZWYgQUxMTVVMVEkKKyNlcnJvciBtdWx0aWNhc3Qgc3VwcG9ydCBpcyBub3QgeWV0IGltcGxlbWVudGVkCisjZW5kaWYKKy8qICAKKyAgICBEQVZJQ09NIERNOTAwOS9ETTkxMDIvRE05MTAyQSBFdGhlcmJvb3QgRHJpdmVyCVYxLjAwCisKKyAgICBUaGlzIGRyaXZlciB3YXMgcG9ydGVkIGZyb20gTWFydHkgQ29ubm9yJ3MgVHVsaXAgRXRoZXJib290IGRyaXZlci4gCisgICAgVGhhbmtzIE1hcnR5IENvbm5vciAobWRjQGV0aGVyYm9vdC5vcmcpIAorCisgICAgVGhpcyBkYXZpY29tIGV0aGVyYm9vdCBkcml2ZXIgc3VwcG9ydHMgRE05MDA5L0RNOTEwMi9ETTkxMDJBLworICAgIERNOTEwMkErRE05ODAxL0RNOTEwMkErRE05ODAyIE5JQ3MuCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICAgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyovCisKK0ZJTEVfTElDRU5DRSAoIEdQTF9BTlkgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJldmlzaW9uIEhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICAxOSBPQ1QgMjAwMCAgU3RlbiAgICAgMS4wMAorCQkJRGlmZmVyZW50IGhhbGYgYW5kIGZ1bGwgZHVwbGV4IG1vZGUKKwkJCURvIHRoZSBkaWZmZXJlbnQgcHJvZ3JhbW1pbmcgZm9yIERNOTgwMS9ETTk4MDIKKworICAxMiBPQ1QgMjAwMCAgU3RlbiAgICAgMC45MAorCQkJVGhpcyBkcml2ZXIgd2FzIHBvcnRlZCBmcm9tIHR1bGlwIGRyaXZlciBhbmQgaXQgCisJCQloYXMgdGhlIGZvbGxvd2luZyBkaWZmZXJlbmNlLgorCQkJQ2hhbmdlZCBzeW1ib2wgdHVsaXAvVFVMSVAgdG8gZGF2aWNvbS9EQVZJQ09NCisJCQlEZWxldGVkIHNvbWUgY29kZSB0aGF0IGRpZCBub3QgdXNlIGluIHRoaXMgZHJpdmVyLgorCQkJVXNlZCBjaGFpbi1zdHJjdHVyZSB0byByZXBsYWNlIHJpbmcgc3RydWN0dXJlCisJCQlmb3IgYm90aCBUWC9SWCBkZXNjcmlwdG9yLgorCQkJQWxsb2NhdGVkIHR3byB0eCBkZXNjcmlwdG9yLgorCQkJQWNjb3JkaW5nIGN1cnJlbnQgbWVkaWEgbW9kZSB0byBzZXQgb3BlcmF0aW5nIAorCQkJcmVnaXN0ZXIoQ1I2KQorKi8KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisKKyN1bmRlZiBEQVZJQ09NX0RFQlVHCisjdW5kZWYgREFWSUNPTV9ERUJVR19XSEVSRQorCisjZGVmaW5lIFRYX1RJTUVfT1VUICAgICAgIDIqVElDS1NfUEVSX1NFQworCisvKiBSZWdpc3RlciBvZmZzZXRzIGZvciBkYXZpY29tIGRldmljZSAqLworZW51bSBkYXZpY29tX29mZnNldHMgeworICAgQ1NSMD0wLCAgICAgQ1NSMT0weDA4LCAgQ1NSMj0weDEwLCAgQ1NSMz0weDE4LCAgQ1NSND0weDIwLCAgQ1NSNT0weDI4LAorICAgQ1NSNj0weDMwLCAgQ1NSNz0weDM4LCAgQ1NSOD0weDQwLCAgQ1NSOT0weDQ4LCBDU1IxMD0weDUwLCBDU1IxMT0weDU4LAorICBDU1IxMj0weDYwLCBDU1IxMz0weDY4LCBDU1IxND0weDcwLCBDU1IxNT0weDc4LCBDU1IxNj0weDgwLCBDU1IyMD0weEEwCit9OworCisvKiBFRVBST00gQWRkcmVzcyB3aWR0aCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFRVBST01fQUREUkxFTiA2CisjZGVmaW5lIEVFUFJPTV9TSVpFICAgIDMyICAgICAgICAgICAgICAvKiAxIDw8IEVFUFJPTV9BRERSTEVOICovCisvKiBVc2VkIHRvIGJlIDEyOCwgYnV0IHdlIG9ubHkgbmVlZCB0byByZWFkIGVub3VnaCB0byBnZXQgdGhlIE1BQworICAgYWRkcmVzcyBhdCBieXRlcyAyMC4uMjUgKi8KKworLyogRGF0YSBSZWFkIGZyb20gdGhlIEVFUFJPTSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZWVfZGF0YVtFRVBST01fU0laRV07CisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworI2RlZmluZSBFRV9XUklURV9DTUQgICAgKDUgPDwgYWRkcl9sZW4pCisjZGVmaW5lIEVFX1JFQURfQ01EICAgICAoNiA8PCBhZGRyX2xlbikKKyNkZWZpbmUgRUVfRVJBU0VfQ01EICAgICg3IDw8IGFkZHJfbGVuKQorCisvKiBFRVBST01fQ3RybCBiaXRzLiAqLworI2RlZmluZSBFRV9TSElGVF9DTEsgICAgMHgwMiAgICAvKiBFRVBST00gc2hpZnQgY2xvY2suICovCisjZGVmaW5lIEVFX0NTICAgICAgICAgICAweDAxICAgIC8qIEVFUFJPTSBjaGlwIHNlbGVjdC4gKi8KKyNkZWZpbmUgRUVfREFUQV9XUklURSAgIDB4MDQgICAgLyogRUVQUk9NIGNoaXAgZGF0YSBpbi4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfMCAgICAgIDB4MDEKKyNkZWZpbmUgRUVfV1JJVEVfMSAgICAgIDB4MDUKKyNkZWZpbmUgRUVfREFUQV9SRUFEICAgIDB4MDggICAgLyogRUVQUk9NIGNoaXAgZGF0YSBvdXQuICovCisjZGVmaW5lIEVFX0VOQiAgICAgICAgICAoMHg0ODAwIHwgRUVfQ1MpCisKKy8qIFN0ZW4gMTAvMTEgZm9yIHBoeXhjZXIgKi8KKyNkZWZpbmUgUEhZX0RBVEFfMAkweDAKKyNkZWZpbmUgUEhZX0RBVEFfMQkweDIwMDAwCisjZGVmaW5lIE1EQ0xLSAkJMHgxMDAwMAorCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4gIEV2ZW4gYXQgMzNNaHogY3VycmVudCBQQ0kKKyAgIGltcGxlbWVudGF0aW9ucyBkb24ndCBvdmVycnVuIHRoZSBFRVBST00gY2xvY2suICBXZSBhZGQgYSBidXMKKyAgIHR1cm4tYXJvdW5kIHRvIGluc3VyZSB0aGF0IHRoaXMgcmVtYWlucyB0cnVlLiAgKi8KKyNkZWZpbmUgZWVwcm9tX2RlbGF5KCkgIGlubChlZV9hZGRyKQorCisvKiBoZWxwZnVsIG1hY3JvIGlmIG9uIGEgYmlnX2VuZGlhbiBtYWNoaW5lIGZvciBjaGFuZ2luZyBieXRlIG9yZGVyLgorICAgbm90IHN0cmljdGx5IG5lZWRlZCBvbiBJbnRlbAorICAgQWxyZWFkeSBkZWZpbmVkIGluIEV0aGVyYm9vdCBpbmNsdWRlcworI2RlZmluZSBsZTE2X3RvX2NwdSh2YWwpICh2YWwpCisqLworCisvKiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBkZXNjcmlwdG9yIGZvcm1hdCAqLworc3RydWN0IHR4ZGVzYyB7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICBzdGF0dXM7ICAgICAgICAgLyogb3duZXIsIHN0YXR1cyAqLworICB1bnNpZ25lZCBsb25nICAgYnVmMXN6OjExLCAgICAgIC8qIHNpemUgb2YgYnVmZmVyIDEgKi8KKyAgICBidWYyc3o6MTEsICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGJ1ZmZlciAyICovCisgICAgY29udHJvbDoxMDsgICAgICAgICAgICAgICAgICAgLyogY29udHJvbCBiaXRzICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjFhZGRyOyAgLyogYnVmZmVyIDEgYWRkcmVzcyAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYyYWRkcjsgIC8qIGJ1ZmZlciAyIGFkZHJlc3MgKi8KK307CisKK3N0cnVjdCByeGRlc2MgeworICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAgc3RhdHVzOyAgICAgICAgIC8qIG93bmVyLCBzdGF0dXMgKi8KKyAgdW5zaWduZWQgbG9uZyAgIGJ1ZjFzejoxMSwgICAgICAvKiBzaXplIG9mIGJ1ZmZlciAxICovCisgICAgYnVmMnN6OjExLCAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBidWZmZXIgMiAqLworICAgIGNvbnRyb2w6MTA7ICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2wgYml0cyAqLworICB1bnNpZ25lZCBjaGFyICAgKmJ1ZjFhZGRyOyAgICAgIC8qIGJ1ZmZlciAxIGFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhciAgICpidWYyYWRkcjsgICAgICAvKiBidWZmZXIgMiBhZGRyZXNzICovCit9OworCisvKiBTaXplIG9mIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgQlVGTEVOIDE1MzYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdsb2JhbCBTdG9yYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIGRhdmljb21fb3BlcmF0aW9uczsKKworLyogUENJIEJ1cyBwYXJhbWV0ZXJzICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmVuZG9yLCBkZXZfaWQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb2FkZHI7CisKKy8qIE5vdGU6IHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcnMgbXVzdCBiZSBsb25nd29yZCBhbGlnbmVkIGFuZAorICAgbG9uZ3dvcmQgZGl2aXNhYmxlICovCisKKy8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciAqLworI2RlZmluZSBOVFhEIDIKKyNkZWZpbmUgTlJYRCA0CitzdHJ1Y3QgeworCXN0cnVjdCB0eGRlc2MgdHhkW05UWERdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CisJdW5zaWduZWQgY2hhciB0eGJbQlVGTEVOXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworCXN0cnVjdCByeGRlc2MgcnhkW05SWERdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CisJdW5zaWduZWQgY2hhciByeGJbTlJYRCAqIEJVRkxFTl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKK30gZGF2aWNvbV9idWZzIF9fc2hhcmVkOworI2RlZmluZSB0eGQgZGF2aWNvbV9idWZzLnR4ZAorI2RlZmluZSB0eGIgZGF2aWNvbV9idWZzLnR4YgorI2RlZmluZSByeGQgZGF2aWNvbV9idWZzLnJ4ZAorI2RlZmluZSByeGIgZGF2aWNvbV9idWZzLnJ4Ygorc3RhdGljIGludCByeGRfdGFpbDsKK3N0YXRpYyBpbnQgVHhQdHI7CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdoZXJlYW1pKGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbik7CitzdGF0aWMgaW50IGRhdmljb21fcHJvYmUoc3RydWN0IG5pYyAqbmljLHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOworc3RhdGljIHZvaWQgZGF2aWNvbV9pbml0X2NoYWluKHN0cnVjdCBuaWMgKm5pYyk7CS8qIFN0ZW4gMTAvOSAqLworc3RhdGljIHZvaWQgZGF2aWNvbV9yZXNldChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgZGF2aWNvbV90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAorCQkJICAgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApOworc3RhdGljIGludCBkYXZpY29tX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpOworc3RhdGljIHZvaWQgZGF2aWNvbV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYyk7CisjaWZkZWYJREFWSUNPTV9ERUJVRworc3RhdGljIHZvaWQgZGF2aWNvbV9tb3JlKHZvaWQpOworI2VuZGlmIC8qIERBVklDT01fREVCVUcgKi8KK3N0YXRpYyB2b2lkIGRhdmljb21fd2FpdCh1bnNpZ25lZCBpbnQgbnRpY2tzKTsKK3N0YXRpYyBpbnQgcGh5X3JlYWQoaW50KTsKK3N0YXRpYyB2b2lkIHBoeV93cml0ZShpbnQsIHUxNik7CitzdGF0aWMgdm9pZCBwaHlfd3JpdGVfMWJpdCh1MzIsIHUzMik7CitzdGF0aWMgaW50IHBoeV9yZWFkXzFiaXQodTMyKTsKK3N0YXRpYyB2b2lkIGRhdmljb21fbWVkaWFfY2hrKHN0cnVjdCBuaWMgKik7CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVdGlsaXR5IFJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3aGVyZWFtaShjb25zdCBjaGFyICpzdHIpCit7CisgIHByaW50ZigiJXNcbiIsIHN0cik7CisgIC8qIHNsZWVwKDIpOyAqLworfQorCisjaWZkZWYJREFWSUNPTV9ERUJVRworc3RhdGljIHZvaWQgZGF2aWNvbV9tb3JlKCkKK3sKKyAgcHJpbnRmKCJcblxuLS0gbW9yZSAtLSIpOworICB3aGlsZSAoIWlza2V5KCkpCisgICAgLyogd2FpdCAqLzsKKyAgZ2V0Y2hhcigpOworICBwcmludGYoIlxuXG4iKTsKK30KKyNlbmRpZiAvKiBEQVZJQ09NX0RFQlVHICovCisKK3N0YXRpYyB2b2lkIGRhdmljb21fd2FpdCh1bnNpZ25lZCBpbnQgbnRpY2tzKQoreworICB1bnNpZ25lZCBpbnQgdG8gPSBjdXJydGlja3MoKSArIG50aWNrczsKKyAgd2hpbGUgKGN1cnJ0aWNrcygpIDwgdG8pCisgICAgLyogd2FpdCAqLyA7Cit9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3IgREFWSUNPTSBwaHl4Y2VyIHJlZ2lzdGVyIGJ5IE1JSSBpbnRlcmZhY2UJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICBSZWFkIGEgd29yZCBkYXRhIGZyb20gcGh5IHJlZ2lzdGVyCisqLworc3RhdGljIGludCBwaHlfcmVhZChpbnQgbG9jYXRpb24pCit7CisgaW50IGksIHBoeV9hZGRyPTE7CisgdTE2IHBoeV9kYXRhOworIHUzMiBpb19kY3I5OworCisgd2hlcmVhbWkoInBoeV9yZWFkXG4iKTsKKworIGlvX2RjcjkgPSBpb2FkZHIgKyBDU1I5OworCisgLyogU2VuZCAzMyBzeW5jaHJvbml6YXRpb24gY2xvY2sgdG8gUGh5IGNvbnRyb2xsZXIgKi8KKyBmb3IgKGk9MDsgaTwzNDsgaSsrKQorICAgICBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8xKTsKKworIC8qIFNlbmQgc3RhcnQgY29tbWFuZCgwMSkgdG8gUGh5ICovCisgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgUEhZX0RBVEFfMCk7CisgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgUEhZX0RBVEFfMSk7CisKKyAvKiBTZW5kIHJlYWQgY29tbWFuZCgxMCkgdG8gUGh5ICovCisgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgUEhZX0RBVEFfMSk7CisgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgUEhZX0RBVEFfMCk7CisKKyAvKiBTZW5kIFBoeSBhZGRyZXMgKi8KKyBmb3IgKGk9MHgxMDsgaT4wOyBpPWk+PjEpCisgICAgIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIHBoeV9hZGRyJmkgPyBQSFlfREFUQV8xOiBQSFlfREFUQV8wKTsKKyAgIAorIC8qIFNlbmQgcmVnaXN0ZXIgYWRkcmVzICovCisgZm9yIChpPTB4MTA7IGk+MDsgaT1pPj4xKQorICAgICBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBsb2NhdGlvbiZpID8gUEhZX0RBVEFfMTogUEhZX0RBVEFfMCk7CisKKyAvKiBTa2lwIHRyYW5zaXRpb24gc3RhdGUgKi8KKyBwaHlfcmVhZF8xYml0KGlvX2RjcjkpOworCisgLyogcmVhZCAxNmJpdCBkYXRhICovCisgZm9yIChwaHlfZGF0YT0wLCBpPTA7IGk8MTY7IGkrKykgeworICAgcGh5X2RhdGE8PD0xOworICAgcGh5X2RhdGF8PXBoeV9yZWFkXzFiaXQoaW9fZGNyOSk7CisgfQorCisgcmV0dXJuIHBoeV9kYXRhOworfQorCisvKgorICBXcml0ZSBhIHdvcmQgdG8gUGh5IHJlZ2lzdGVyCisqLworc3RhdGljIHZvaWQgcGh5X3dyaXRlKGludCBsb2NhdGlvbiwgdTE2IHBoeV9kYXRhKQoreworIHUxNiBpLCBwaHlfYWRkcj0xOworIHUzMiBpb19kY3I5OyAKKworIHdoZXJlYW1pKCJwaHlfd3JpdGVcbiIpOworCisgaW9fZGNyOSA9IGlvYWRkciArIENTUjk7CisKKyAvKiBTZW5kIDMzIHN5bmNocm9uaXphdGlvbiBjbG9jayB0byBQaHkgY29udHJvbGxlciAqLworIGZvciAoaT0wOyBpPDM0OyBpKyspCisgICBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8xKTsKKworIC8qIFNlbmQgc3RhcnQgY29tbWFuZCgwMSkgdG8gUGh5ICovCisgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgUEhZX0RBVEFfMCk7CisgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgUEhZX0RBVEFfMSk7CisKKyAvKiBTZW5kIHdyaXRlIGNvbW1hbmQoMDEpIHRvIFBoeSAqLworIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIFBIWV9EQVRBXzApOworIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIFBIWV9EQVRBXzEpOworCisgLyogU2VuZCBQaHkgYWRkcmVzICovCisgZm9yIChpPTB4MTA7IGk+MDsgaT1pPj4xKQorICAgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgcGh5X2FkZHImaSA/IFBIWV9EQVRBXzE6IFBIWV9EQVRBXzApOworCisgLyogU2VuZCByZWdpc3RlciBhZGRyZXMgKi8KKyBmb3IgKGk9MHgxMDsgaT4wOyBpPWk+PjEpCisgICBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBsb2NhdGlvbiZpID8gUEhZX0RBVEFfMTogUEhZX0RBVEFfMCk7CisKKyAvKiB3cml0dGVuIHRyYXNuaXRpb24gKi8KKyBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8xKTsKKyBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8wKTsKKworIC8qIFdyaXRlIGEgd29yZCBkYXRhIHRvIFBIWSBjb250cm9sbGVyICovCisgZm9yIChpPTB4ODAwMDsgaT4wOyBpPj49MSkKKyAgIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIHBoeV9kYXRhJmkgPyBQSFlfREFUQV8xOiBQSFlfREFUQV8wKTsKK30KKworLyoKKyAgV3JpdGUgb25lIGJpdCBkYXRhIHRvIFBoeSBDb250cm9sbGVyCisqLworc3RhdGljIHZvaWQgcGh5X3dyaXRlXzFiaXQodTMyIGVlX2FkZHIsIHUzMiBwaHlfZGF0YSkKK3sKKyB3aGVyZWFtaSgicGh5X3dyaXRlXzFiaXRcbiIpOworIG91dGwocGh5X2RhdGEsIGVlX2FkZHIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1JSSBDbG9jayBMb3cgKi8KKyBlZXByb21fZGVsYXkoKTsKKyBvdXRsKHBoeV9kYXRhfE1EQ0xLSCwgZWVfYWRkcik7ICAgICAgICAgICAgICAgICAvKiBNSUkgQ2xvY2sgSGlnaCAqLworIGVlcHJvbV9kZWxheSgpOworIG91dGwocGh5X2RhdGEsIGVlX2FkZHIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1JSSBDbG9jayBMb3cgKi8KKyBlZXByb21fZGVsYXkoKTsKK30KKworLyoKKyAgUmVhZCBvbmUgYml0IHBoeSBkYXRhIGZyb20gUEhZIGNvbnRyb2xsZXIKKyovCitzdGF0aWMgaW50IHBoeV9yZWFkXzFiaXQodTMyIGVlX2FkZHIpCit7CisgaW50IHBoeV9kYXRhOworCisgd2hlcmVhbWkoInBoeV9yZWFkXzFiaXRcbiIpOworCisgb3V0bCgweDUwMDAwLCBlZV9hZGRyKTsKKyBlZXByb21fZGVsYXkoKTsKKworIHBoeV9kYXRhPShpbmwoZWVfYWRkcik+PjE5KSAmIDB4MTsKKworIG91dGwoMHg0MDAwMCwgZWVfYWRkcik7CisgZWVwcm9tX2RlbGF5KCk7CisKKyByZXR1cm4gcGh5X2RhdGE7Cit9CisKKy8qCisgIERNOTgwMS9ETTk4MDIgcHJlc2VudCBjaGVjayBhbmQgcHJvZ3JhbSAKKyovCitzdGF0aWMgdm9pZCBIUE5BX3Byb2Nlc3Modm9pZCkKK3sKKworIGlmICggKHBoeV9yZWFkKDMpICYgMHhmZmYwKSA9PSAweGI5MDAgKSB7CisgICBpZiAoIHBoeV9yZWFkKDMxKSA9PSAweDQ0MDQgKSB7CisgICAgIC8qIERNOTgwMSBwcmVzZW50ICovCisgICAgIGlmIChwaHlfcmVhZCgzKSA9PSAweGI5MDEpCisgICAgICAgcGh5X3dyaXRlKDE2LCAweDUpOwkvKiBETTk4MDEgRTQgKi8KKyAgICAgZWxzZQorICAgICAgIHBoeV93cml0ZSgxNiwgMHgxMDA1KTsgLyogRE05ODAxIEUzIGFuZCBvdGhlcnMgKi8KKyAgICAgcGh5X3dyaXRlKDI1LCAoKHBoeV9yZWFkKDI0KSArIDMpICYgMHhmZikgfCAweGYwMDApOworICAgfSBlbHNlIHsKKyAgICAgLyogRE05ODAyIHByZXNlbnQgKi8KKyAgICAgcGh5X3dyaXRlKDE2LCAweDUpOworICAgICBwaHlfd3JpdGUoMjUsIChwaHlfcmVhZCgyNSkgJiAweGZmMDApICsgMik7CisgICB9CisgfQorfQorCisvKgorICBTZW5zZSBtZWRpYSBtb2RlIGFuZCBzZXQgQ1I2CisqLworc3RhdGljIHZvaWQgZGF2aWNvbV9tZWRpYV9jaGsoc3RydWN0IG5pYyAqIG5pYyBfX3VudXNlZCkKK3sKKyAgdW5zaWduZWQgbG9uZyB0bywgY3NyNjsKKworICBjc3I2ID0gMHgwMDIwMDAwMDsJLyogU0YgKi8KKyAgb3V0bChjc3I2LCBpb2FkZHIgKyBDU1I2KTsKKworI2RlZmluZQlQQ0lfREVWSUNFX0lEX0RNOTAwOQkJMHg5MDA5CisgIGlmICh2ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9EQVZJQ09NICYmIGRldl9pZCA9PSBQQ0lfREVWSUNFX0lEX0RNOTAwOSkgeworICAgIC8qIFNldCB0byAxMEJhc2VUIG1vZGUgZm9yIERNOTAwOSAqLworICAgIHBoeV93cml0ZSgwLCAwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBGb3IgRE05MTAyL0RNOTEwMkEgKi8KKyAgICB0byA9IGN1cnJ0aWNrcygpICsgMiAqIFRJQ0tTX1BFUl9TRUM7CisgICAgd2hpbGUgKCAoKHBoeV9yZWFkKDEpICYgMHgyNCkhPTB4MjQpICYmIChjdXJydGlja3MoKSA8IHRvKSkKKyAgICAgIC8qIHdhaXQgKi8gOworCisgICAgaWYgKCAocGh5X3JlYWQoMSkgJiAweDI0KSA9PSAweDI0ICkgeworICAgICAgaWYgKHBoeV9yZWFkKDE3KSAmIDB4YTAwMCkgIAorICAgICAgICBjc3I2IHw9IDB4MDAwMDAyMDA7CS8qIEZ1bGwgRHVwbGV4IG1vZGUgKi8KKyAgICB9IGVsc2UKKyAgICAgIGNzcjYgfD0gMHgwMDA0MDAwMDsgLyogU2VsZWN0IERNOTgwMS9ETTk4MDIgd2hlbiBFdGhlcm5ldCBsaW5rIGZhaWxlZCAqLworICB9CisKKyAgLyogc2V0IHRoZSBjaGlwJ3Mgb3BlcmF0aW5nIG1vZGUgKi8KKyAgb3V0bChjc3I2LCBpb2FkZHIgKyBDU1I2KTsKKworICAvKiBETTk4MDEvRE05ODAyIHByZXNlbnQgY2hlY2sgJiBwcm9ncmFtICovCisgIGlmIChjc3I2ICYgMHg0MDAwMCkKKyAgICBIUE5BX3Byb2Nlc3MoKTsKK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVFUFJPTSBSZWFkaW5nIENvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRUVQUk9NIHJvdXRpbmVzIGFkYXB0ZWQgZnJvbSB0aGUgTGludXggVHVsaXAgQ29kZSAqLworLyogUmVhZGluZyBhIHNlcmlhbCBFRVBST00gaXMgYSAiYml0IiBncnVuZ3ksIGJ1dCB3ZSB3b3JrIG91ciB3YXkKKyAgIHRocm91Z2g6LT4uCisqLworc3RhdGljIGludCByZWFkX2VlcHJvbSh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pCit7CisgIGludCBpOworICB1bnNpZ25lZCBzaG9ydCByZXR2YWwgPSAwOworICBsb25nIGVlX2FkZHIgPSBpb2FkZHIgKyBDU1I5OworICBpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JFQURfQ01EOworCisgIHdoZXJlYW1pKCJyZWFkX2VlcHJvbVxuIik7CisKKyAgb3V0bChFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworICBvdXRsKEVFX0VOQiwgZWVfYWRkcik7CisKKyAgLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKyAgZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworICAgIHNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9EQVRBX1dSSVRFIDogMDsKKyAgICBvdXRsKEVFX0VOQiB8IGRhdGF2YWwsIGVlX2FkZHIpOworICAgIGVlcHJvbV9kZWxheSgpOworICAgIG91dGwoRUVfRU5CIHwgZGF0YXZhbCB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7CisgICAgZWVwcm9tX2RlbGF5KCk7CisgIH0KKyAgb3V0bChFRV9FTkIsIGVlX2FkZHIpOworCisgIGZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisgICAgb3V0bChFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworICAgIGVlcHJvbV9kZWxheSgpOworICAgIHJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlubChlZV9hZGRyKSAmIEVFX0RBVEFfUkVBRCkgPyAxIDogMCk7CisgICAgb3V0bChFRV9FTkIsIGVlX2FkZHIpOworICAgIGVlcHJvbV9kZWxheSgpOworICB9CisKKyAgLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworICBvdXRsKEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CisgIHJldHVybiByZXR2YWw7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGF2aWNvbV9pbml0X2NoYWluIC0gc2V0dXAgdGhlIHR4IGFuZCByeCBkZXNjcmlwdG9ycyAgICAgICAgICAgICAgICAqLworLyogU3RlbiAxMC85CQkJCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkYXZpY29tX2luaXRfY2hhaW4oc3RydWN0IG5pYyAqbmljKQoreworICBpbnQgaTsKKworICAvKiBzZXR1cCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciAqLworICAvKiBTdGVuOiBTZXQgMiBUWCBkZXNjcmlwdG9yIGJ1dCB1c2Ugb25lIFRYIGJ1ZmZlciBiZWNhdXNlCisJICAgaXQgdHJhbnNtaXQgYSBwYWNrZXQgYW5kIHdhaXQgY29tcGxldGUgZXZlcnkgdGltZS4gKi8KKyAgZm9yIChpPTA7IGk8TlRYRDsgaSsrKSB7CisgICAgdHhkW2ldLmJ1ZjFhZGRyID0gKHZvaWQgKil2aXJ0X3RvX2J1cygmdHhiWzBdKTsJLyogVXNlZCBzYW1lIFRYIGJ1ZmZlciAqLworICAgIHR4ZFtpXS5idWYyYWRkciA9ICh2b2lkICopdmlydF90b19idXMoJnR4ZFtpKzFdKTsJLyogIFBvaW50IHRvIE5leHQgVFggZGVzYyAqLworICAgIHR4ZFtpXS5idWYxc3ogICA9IDA7CisgICAgdHhkW2ldLmJ1ZjJzeiAgID0gMDsKKyAgICB0eGRbaV0uY29udHJvbCAgPSAweDE4NDsgICAgICAgICAgIC8qIEJlZ2luL0VuZC9DaGFpbiAqLworICAgIHR4ZFtpXS5zdGF0dXMgICA9IDB4MDAwMDAwMDA7ICAgICAgLyogZ2l2ZSBvd25lcnNoaXAgdG8gSG9zdCAqLworICB9CisKKyAgLyogY29uc3RydWN0IHBlcmZlY3QgZmlsdGVyIGZyYW1lIHdpdGggbWFjIGFkZHJlc3MgYXMgZmlyc3QgbWF0Y2gKKyAgICAgYW5kIGJyb2FkY2FzdCBhZGRyZXNzIGZvciBhbGwgb3RoZXJzICovCisgIGZvciAoaT0wOyBpPDE5MjsgaSsrKSB0eGJbaV0gPSAweEZGOworICB0eGJbMF0gPSBuaWMtPm5vZGVfYWRkclswXTsKKyAgdHhiWzFdID0gbmljLT5ub2RlX2FkZHJbMV07CisgIHR4Yls0XSA9IG5pYy0+bm9kZV9hZGRyWzJdOworICB0eGJbNV0gPSBuaWMtPm5vZGVfYWRkclszXTsKKyAgdHhiWzhdID0gbmljLT5ub2RlX2FkZHJbNF07CisgIHR4Yls5XSA9IG5pYy0+bm9kZV9hZGRyWzVdOworCisgIC8qIHNldHVwIHJlY2VpdmUgZGVzY3JpcHRvciAqLworICBmb3IgKGk9MDsgaTxOUlhEOyBpKyspIHsKKyAgICByeGRbaV0uYnVmMWFkZHIgPSAodm9pZCAqKXZpcnRfdG9fYnVzKCZyeGJbaSAqIEJVRkxFTl0pOworICAgIHJ4ZFtpXS5idWYyYWRkciA9ICh2b2lkICopdmlydF90b19idXMoJnJ4ZFtpKzFdKTsgLyogUG9pbnQgdG8gTmV4dCBSWCBkZXNjICovCisgICAgcnhkW2ldLmJ1ZjFzeiAgID0gQlVGTEVOOworICAgIHJ4ZFtpXS5idWYyc3ogICA9IDA7ICAgICAgICAvKiBub3QgdXNlZCAqLworICAgIHJ4ZFtpXS5jb250cm9sICA9IDB4NDsJCS8qIENoYWluIFN0cnVjdHVyZSAqLworICAgIHJ4ZFtpXS5zdGF0dXMgICA9IDB4ODAwMDAwMDA7ICAgLyogZ2l2ZSBvd25lcnNoaXAgdG8gZGV2aWNlICovCisgIH0KKworICAvKiBDaGFpbiB0aGUgbGFzdCBkZXNjcmlwdG9yIHRvIGZpcnN0ICovCisgIHR4ZFtOVFhEIC0gMV0uYnVmMmFkZHIgPSAodm9pZCAqKXZpcnRfdG9fYnVzKCZ0eGRbMF0pOworICByeGRbTlJYRCAtIDFdLmJ1ZjJhZGRyID0gKHZvaWQgKil2aXJ0X3RvX2J1cygmcnhkWzBdKTsKKyAgVHhQdHIgPSAwOworICByeGRfdGFpbCA9IDA7Cit9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkYXZpY29tX3Jlc2V0IC0gUmVzZXQgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkYXZpY29tX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgdW5zaWduZWQgbG9uZyB0bzsKKworICB3aGVyZWFtaSgiZGF2aWNvbV9yZXNldFxuIik7CisKKyAgLyogU3RvcCBUeCBhbmQgUlggKi8KKyAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgwMDAwMjAwMiwgaW9hZGRyICsgQ1NSNik7CisKKyAgLyogUmVzZXQgdGhlIGNoaXAsIGhvbGRpbmcgYml0IDAgc2V0IGF0IGxlYXN0IDUwIFBDSSBjeWNsZXMuICovCisgIG91dGwoMHgwMDAwMDAwMSwgaW9hZGRyICsgQ1NSMCk7CisKKyAgZGF2aWNvbV93YWl0KFRJQ0tTX1BFUl9TRUMpOworCisgIC8qIFRYL1JYIGRlc2NyaXB0b3IgYnVyc3QgKi8KKyAgb3V0bCgweDBDMDAwMDAsIGlvYWRkciArIENTUjApOwkvKiBTdGVuIDEwLzkgKi8KKworICAvKiBzZXQgdXAgdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKyAgZGF2aWNvbV9pbml0X2NoYWluKG5pYyk7CS8qIFN0ZW4gMTAvOSAqLworCisgIC8qIFBvaW50IHRvIHJlY2VpdmUgZGVzY3JpcHRvciAqLworICBvdXRsKHZpcnRfdG9fYnVzKCZyeGRbMF0pLCBpb2FkZHIgKyBDU1IzKTsKKyAgb3V0bCh2aXJ0X3RvX2J1cygmdHhkWzBdKSwgaW9hZGRyICsgQ1NSNCk7CS8qIFN0ZW4gMTAvOSAqLworCisgIC8qIEFjY29yZGluZyBwaHl4Y2VyIG1lZGlhIG1vZGUgdG8gc2V0IENSNiwKKyAgICAgRE05MTAyL0EgcGh5eGNlciBjYW4gYXV0by1kZXRlY3QgbWVkaWEgbW9kZSAqLworICBkYXZpY29tX21lZGlhX2NoayhuaWMpOworCisgIC8qIFByZXBhcmUgU2V0dXAgRnJhbWUgU3RlbiAxMC85ICovCisgIHR4ZFtUeFB0cl0uYnVmMXN6ID0gMTkyOworICB0eGRbVHhQdHJdLmNvbnRyb2wgPSAweDAyNDsJCS8qIFNGL0NFICovCisgIHR4ZFtUeFB0cl0uc3RhdHVzID0gMHg4MDAwMDAwMDsJLyogR2l2ZSBvd25lcnNoaXAgdG8gZGV2aWNlICovCisKKyAgLyogU3RhcnQgVHggKi8KKyAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgfCAweDAwMDAyMDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgLyogaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZCAqLworICBvdXRsKDAsIGlvYWRkciArIENTUjEpOworCisgIHRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FX09VVDsKKyAgd2hpbGUgKCh0eGRbVHhQdHJdLnN0YXR1cyAmIDB4ODAwMDAwMDApICYmIChjdXJydGlja3MoKSA8IHRvKSkgLyogU3RlbiAxMC85ICovCisgICAgLyogd2FpdCAqLyA7CisKKyAgaWYgKGN1cnJ0aWNrcygpID49IHRvKSB7CisgICAgcHJpbnRmICgiVFggU2V0dXAgVGltZW91dCFcbiIpOworICB9CisgIC8qIFBvaW50IHRvIG5leHQgVFggZGVzY3JpcHRvciAqLworIFR4UHRyID0gKCsrVHhQdHIgPj0gTlRYRCkgPyAwOlR4UHRyOwkvKiBTdGVuIDEwLzkgKi8KKworI2lmZGVmIERBVklDT01fREVCVUcKKyAgcHJpbnRmKCJ0eGQuc3RhdHVzID0gJVhcbiIsIHR4ZC5zdGF0dXMpOworICBwcmludGYoInRpY2tzID0gJWRcbiIsIGN1cnJ0aWNrcygpIC0gKHRvIC0gVFhfVElNRV9PVVQpKTsKKyAgZGF2aWNvbV9tb3JlKCk7CisjZW5kaWYKKworICAvKiBlbmFibGUgUlggKi8KKyAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgfCAweDAwMDAwMDAyLCBpb2FkZHIgKyBDU1I2KTsKKyAgLyogaW1tZWRpYXRlIHBvbGwgZGVtYW5kICovCisgIG91dGwoMCwgaW9hZGRyICsgQ1NSMik7Cit9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBldGhfdHJhbnNtaXQgLSBUcmFuc21pdCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGRhdmljb21fdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpwKQoreworICB1bnNpZ25lZCBsb25nIHRvOworCisgIHdoZXJlYW1pKCJkYXZpY29tX3RyYW5zbWl0XG4iKTsKKworICAvKiBTdG9wIFR4ICovCisgIC8qIG91dGwoaW5sKGlvYWRkciArIENTUjYpICYgfjB4MDAwMDIwMDAsIGlvYWRkciArIENTUjYpOyAqLworCisgIC8qIHNldHVwIGV0aGVybmV0IGhlYWRlciAqLworICBtZW1jcHkoJnR4YlswXSwgZCwgRVRIX0FMRU4pOwkvKiBEQSA2Ynl0ZSAqLworICBtZW1jcHkoJnR4YltFVEhfQUxFTl0sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7IC8qIFNBIDZieXRlKi8KKyAgdHhiW0VUSF9BTEVOKjJdID0gKHQgPj4gOCkgJiAweEZGOyAvKiBGcmFtZSB0eXBlOiAyYnl0ZSAqLworICB0eGJbRVRIX0FMRU4qMisxXSA9IHQgJiAweEZGOworICBtZW1jcHkoJnR4YltFVEhfSExFTl0sIHAsIHMpOyAvKiBGcmFtZSBkYXRhICovCisKKyAgLyogc2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKyAgdHhkW1R4UHRyXS5idWYxc3ogICA9IEVUSF9ITEVOK3M7CisgIHR4ZFtUeFB0cl0uY29udHJvbCAgPSAweDAwMDAwMTg0OyAgICAgIC8qIExTK0ZTK0NFICovCisgIHR4ZFtUeFB0cl0uc3RhdHVzICAgPSAweDgwMDAwMDAwOyAgICAgIC8qIGdpdmUgb3duZXJzaGlwIHRvIGRldmljZSAqLworCisgIC8qIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQgKi8KKyAgb3V0bCgwLCBpb2FkZHIgKyBDU1IxKTsKKworICB0byA9IGN1cnJ0aWNrcygpICsgVFhfVElNRV9PVVQ7CisgIHdoaWxlICgodHhkW1R4UHRyXS5zdGF0dXMgJiAweDgwMDAwMDAwKSAmJiAoY3VycnRpY2tzKCkgPCB0bykpCisgICAgLyogd2FpdCAqLyA7CisKKyAgaWYgKGN1cnJ0aWNrcygpID49IHRvKSB7CisgICAgcHJpbnRmICgiVFggVGltZW91dCFcbiIpOworICB9CisgCisgIC8qIFBvaW50IHRvIG5leHQgVFggZGVzY3JpcHRvciAqLworICBUeFB0ciA9ICgrK1R4UHRyID49IE5UWEQpID8gMDpUeFB0cjsJLyogU3RlbiAxMC85ICovCisKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBldGhfcG9sbCAtIFdhaXQgZm9yIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZGF2aWNvbV9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworICB3aGVyZWFtaSgiZGF2aWNvbV9wb2xsXG4iKTsKKworICBpZiAocnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDgwMDAwMDAwKQorICAgIHJldHVybiAwOworCisgIGlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisgIHdoZXJlYW1pKCJkYXZpY29tX3BvbGwgZ290IG9uZVxuIik7CisKKyAgbmljLT5wYWNrZXRsZW4gPSAocnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDNGRkYwMDAwKSA+PiAxNjsKKworICBpZiggcnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDAwMDA4MDAwKXsKKyAgICAgIHJ4ZFtyeGRfdGFpbF0uc3RhdHVzID0gMHg4MDAwMDAwMDsKKyAgICAgIHJ4ZF90YWlsKys7CisgICAgICBpZiAocnhkX3RhaWwgPT0gTlJYRCkgcnhkX3RhaWwgPSAwOworICAgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBjb3B5IHBhY2tldCB0byB3b3JraW5nIGJ1ZmZlciAqLworICAvKiBYWFggLSB0aGlzIGNvcHkgY291bGQgYmUgYXZvaWRlZCB3aXRoIGEgbGl0dGxlIG1vcmUgd29yaworICAgICBidXQgZm9yIG5vdyB3ZSBhcmUgY29udGVudCB3aXRoIGl0IGJlY2F1c2UgdGhlIG9wdGltaXNlZAorICAgICBtZW1jcHkgaXMgcXVpdGUgZmFzdCAqLworCisgIG1lbWNweShuaWMtPnBhY2tldCwgcnhiICsgcnhkX3RhaWwgKiBCVUZMRU4sIG5pYy0+cGFja2V0bGVuKTsKKworICAvKiByZXR1cm4gdGhlIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciB0byByZWNlaXZlIHJpbmcgKi8KKyAgcnhkW3J4ZF90YWlsXS5zdGF0dXMgPSAweDgwMDAwMDAwOworICByeGRfdGFpbCsrOworICBpZiAocnhkX3RhaWwgPT0gTlJYRCkgcnhkX3RhaWwgPSAwOworCisgIHJldHVybiAxOworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV0aF9kaXNhYmxlIC0gRGlzYWJsZSB0aGUgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZGF2aWNvbV9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljICkgeworCisgIHdoZXJlYW1pKCJkYXZpY29tX2Rpc2FibGVcbiIpOworCisgIGRhdmljb21fcmVzZXQobmljKTsKKworICAvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1I3KTsKKworICAvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKyAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgwMDAwMjAwMiwgaW9hZGRyICsgQ1NSNik7CisKKyAgLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KKyAgaW5sKGlvYWRkciArIENTUjgpOworfQorCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXRoX2lycSAtIGVuYWJsZSwgZGlzYWJsZSBhbmQgZm9yY2UgaW50ZXJydXB0cyAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkYXZpY29tX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXRoX3Byb2JlIC0gTG9vayBmb3IgYW4gYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGRhdmljb21fcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgKSB7CisKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgd2hlcmVhbWkoImRhdmljb21fcHJvYmVcbiIpOworCisgIGlmIChwY2ktPmlvYWRkciA9PSAwKQorICAgIHJldHVybiAwOworCisgIHZlbmRvciAgPSBwY2ktPnZlbmRvcjsKKyAgZGV2X2lkICA9IHBjaS0+ZGV2aWNlOworICBpb2FkZHIgID0gcGNpLT5pb2FkZHI7CisKKyAgbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkcjsKKyAgbmljLT5pcnFubyA9IDA7CisKKyAgLyogd2FrZXVwIGNoaXAgKi8KKyAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2ksIDB4NDAsIDB4MDAwMDAwMDApOworCisgIC8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworICBvdXRsKGlubChpb2FkZHIgKyBDU1I2KSAmIH4weDAwMDAyMDAyLCBpb2FkZHIgKyBDU1I2KTsKKworICAvKiBDbGVhciB0aGUgbWlzc2VkLXBhY2tldCBjb3VudGVyLiAqLworICBpbmwoaW9hZGRyICsgQ1NSOCk7CisKKyAgLyogR2V0IE1BQyBBZGRyZXNzICovCisgIC8qIHJlYWQgRUVQUk9NIGRhdGEgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihlZV9kYXRhKS8yOyBpKyspCisgICAgKCh1bnNpZ25lZCBzaG9ydCAqKWVlX2RhdGEpW2ldID0KKyAgICAgICAgbGUxNl90b19jcHUocmVhZF9lZXByb20oaW9hZGRyLCBpLCBFRVBST01fQUREUkxFTikpOworCisgIC8qIGV4dHJhY3QgTUFDIGFkZHJlc3MgZnJvbSBFRVBST00gYnVmZmVyICovCisgIGZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspCisgICAgbmljLT5ub2RlX2FkZHJbaV0gPSBlZV9kYXRhWzIwK2ldOworCisgIERCRyAoICJEYXZpY29tICVzIGF0IElPQUREUiAlNC40bHhcbiIsIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIgKSwgaW9hZGRyICk7CisKKyAgLyogaW5pdGlhbGl6ZSBkZXZpY2UgKi8KKyAgZGF2aWNvbV9yZXNldChuaWMpOworICBuaWMtPm5pY19vcAk9ICZkYXZpY29tX29wZXJhdGlvbnM7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIGRhdmljb21fb3BlcmF0aW9ucyA9IHsKKwkuY29ubmVjdAk9IGR1bW15X2Nvbm5lY3QsCisJLnBvbGwJCT0gZGF2aWNvbV9wb2xsLAorCS50cmFuc21pdAk9IGRhdmljb21fdHJhbnNtaXQsCisJLmlycQkJPSBkYXZpY29tX2lycSwKKworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRhdmljb21fbmljc1tdID0geworUENJX1JPTSgweDEyODIsIDB4OTEwMCwgImRhdmljb205MTAwIiwgIkRhdmljb20gOTEwMCIsIDApLAorUENJX1JPTSgweDEyODIsIDB4OTEwMiwgImRhdmljb205MTAyIiwgIkRhdmljb20gOTEwMiIsIDApLAorUENJX1JPTSgweDEyODIsIDB4OTAwOSwgImRhdmljb205MDA5IiwgIkRhdmljb20gOTAwOSIsIDApLAorUENJX1JPTSgweDEyODIsIDB4OTEzMiwgImRhdmljb205MTMyIiwgIkRhdmljb20gOTEzMiIsIDApLAkvKiBOZWVkcyBwcm9iYWJseSBzb21lIGZpeGluZyAqLworfTsKKworUENJX0RSSVZFUiAoIGRhdmljb21fZHJpdmVyLCBkYXZpY29tX25pY3MsIFBDSV9OT19DTEFTUyApOworCitEUklWRVIgKCAiREFWSUNPTSIsIG5pY19kcml2ZXIsIHBjaV9kcml2ZXIsIGRhdmljb21fZHJpdmVyLAorCSBkYXZpY29tX3Byb2JlLCBkYXZpY29tX2Rpc2FibGUgKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2RlcGNhLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9kZXBjYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhODVjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9kZXBjYS5jCkBAIC0wLDAgKzEsODA1IEBACisvKiAjd2FybmluZyAiZGVwY2EuYzogRklYTUU6IGZpeCByZWxvY2F0aW9uIiAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUExfQU5ZICk7CisKKyNpZiAwCisvKiBOb3QgZml4ZWQgZm9yIHJlbG9jYXRpb24geWV0LiBQcm9iYWJseSB3b24ndCB3b3JrIHJlbG9jYXRlZCBhYm92ZSAxNk1CICovCisjaWZkZWYgQUxMTVVMVEkKKyNlcnJvciBtdWx0aWNhc3Qgc3VwcG9ydCBpcyBub3QgeWV0IGltcGxlbWVudGVkCisjZW5kaWYKKy8qIEV0aGVyYm9vdDogZGVwY2EuaCBtZXJnZWQsIGNvbW1lbnRzIGZyb20gTGludXggZHJpdmVyIHJldGFpbmVkICovCisvKiAgZGVwY2EuYzogQSBESUdJVEFMIERFUENBICAmIEV0aGVyV09SS1MgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KKworICAgIFdyaXR0ZW4gMTk5NCwgMTk5NSBieSBEYXZpZCBDLiBEYXZpZXMuCisKKworICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAxOTk0IERhdmlkIEMuIERhdmllcworCQkgICAgICAgICAgICAgICAgICAgYW5kIAorCQkJIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudAorCSAoYXMgcmVwcmVzZW50ZWQgYnkgdGhlIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kpLiAgCisKKyAgICAgICAgICAgICAgIENvcHlyaWdodCAxOTk1ICBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKworCisgICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICAgIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICAgVGhpcyBkcml2ZXIgaXMgd3JpdHRlbiBmb3IgdGhlIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIHNlcmllcworICAgIG9mIERFUENBIGFuZCBFdGhlcldPUktTIGV0aGVybmV0IGNhcmRzOgorCisgICAgICAgIERFUENBICAgICAgICh0aGUgb3JpZ2luYWwpCisgICAgCURFMTAwCisgICAgCURFMTAxCisJREUyMDAgVHVyYm8KKwlERTIwMSBUdXJibworCURFMjAyIFR1cmJvIChUUCBCTkMpCisJREUyMTAKKwlERTQyMiAgICAgICAoRUlTQSkKKworICAgIFRoZSAgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbiBERTEwMCwgREUyMDAgYW5kIERFMjAyIGNhcmRzICBpbiAgYQorICAgIHJlbGF0aXZlbHkgYnVzeSBuZXR3b3JrLiBUaGUgREU0MjIgaGFzIGJlZW4gdGVzdGVkIGEgbGl0dGxlLgorCisgICAgVGhpcyAgZHJpdmVyIHdpbGwgTk9UIHdvcmsgICBmb3IgdGhlIERFMjAzLCAgREUyMDQgIGFuZCBERTIwNSBzZXJpZXMgIG9mCisgICAgY2FyZHMsICBzaW5jZSB0aGV5IGhhdmUgIGEgIG5ldyBjdXN0b20gQVNJQyBpbiAgIHBsYWNlIG9mIHRoZSBBTUQgIExBTkNFCisgICAgY2hpcC4gIFNlZSB0aGUgJ2V3cmszLmMnICAgZHJpdmVyIGluIHRoZSAgTGludXggIHNvdXJjZSB0cmVlIGZvciBydW5uaW5nCisgICAgdGhvc2UgY2FyZHMuCisKKyAgICBJIGhhdmUgYmVuY2htYXJrZWQgdGhlIGRyaXZlciB3aXRoIGEgIERFMTAwIGF0IDU5NWtCL3MgdG8gKDU0MmtCL3MgZnJvbSkKKyAgICBhIERFQ3N0YXRpb24gNTAwMC8yMDAuCisKKyAgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGF0IGRhdmllc0BtYW5pYWMudWx0cmFuZXQuY29tCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgIGRyaXZlciB3YXMgb3JpZ2luYWxseSBiYXNlZCAgb24gICB0aGUgJ2xhbmNlLmMnIGRyaXZlciBmcm9tICBEb25hbGQKKyAgICBCZWNrZXIgICB3aGljaCAgaXMgaW5jbHVkZWQgd2l0aCAgdGhlICBzdGFuZGFyZCAgZHJpdmVyIGRpc3RyaWJ1dGlvbiBmb3IKKyAgICBsaW51eC4gIFYwLjQgIGlzICBhIGNvbXBsZXRlICByZS13cml0ZSAgd2l0aCBvbmx5ICB0aGUga2VybmVsICBpbnRlcmZhY2UKKyAgICByZW1haW5pbmcgZnJvbSB0aGUgb3JpZ2luYWwgY29kZS4KKworICAgIDEpIExhbmNlLmMgY29kZSBpbiAvbGludXgvZHJpdmVycy9uZXQvCisgICAgMikgIkV0aGVybmV0L0lFRUUgODAyLjMgRmFtaWx5LiAxOTkyIFdvcmxkIE5ldHdvcmsgRGF0YSBCb29rL0hhbmRib29rIiwKKyAgICAgICBBTUQsIDE5OTIgWyg4MDApIDIyMi05MzIzXS4KKyAgICAzKSAiQW03OUM5MCBDTU9TIExvY2FsIEFyZWEgTmV0d29yayBDb250cm9sbGVyIGZvciBFdGhlcm5ldCAoQy1MQU5DRSkiLAorICAgICAgIEFNRCwgUHViLiAjMTc4ODEsIE1heSAxOTkzLgorICAgIDQpICJBbTc5Qzk2MCBQQ25ldC1JU0EodG0pLCBTaW5nbGUtQ2hpcCBFdGhlcm5ldCBDb250cm9sbGVyIGZvciBJU0EiLAorICAgICAgIEFNRCwgUHViLiAjMTY5MDcsIE1heSAxOTkyCisgICAgNSkgIkRFQyBFdGhlcldPUktTIExDIEV0aGVybmV0IENvbnRyb2xsZXIgT3duZXJzIE1hbnVhbCIsCisgICAgICAgRGlnaXRhbCBFcXVpcG1lbnQgY29ycG9yYXRpb24sIDE5OTAsIFB1Yi4gI0VLLURFMTAwLU9NLjAwMworICAgIDYpICJERUMgRXRoZXJXT1JLUyBUdXJibyBFdGhlcm5ldCBDb250cm9sbGVyIE93bmVycyBNYW51YWwiLAorICAgICAgIERpZ2l0YWwgRXF1aXBtZW50IGNvcnBvcmF0aW9uLCAxOTkwLCBQdWIuICNFSy1ERTIwMC1PTS4wMDMKKyAgICA3KSAiREVQQ0EgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbCIsIFB1Yi4gI0VLLURFUENBLVBSCisgICAgICAgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIDE5ODkKKyAgICA4KSAiREVDIEV0aGVyV09SS1MgVHVyYm9fKFRQIEJOQykgRXRoZXJuZXQgQ29udHJvbGxlciBPd25lcnMgTWFudWFsIiwKKyAgICAgICBEaWdpdGFsIEVxdWlwbWVudCBjb3Jwb3JhdGlvbiwgMTk5MSwgUHViLiAjRUstREUyMDItT00uMDAxCisgICAgCisKKyAgICBQZXRlciBCYXVlcidzIGRlcGNhLmMgKFYwLjUpIHdhcyByZWZlcnJlZCB0byB3aGVuIGRlYnVnZ2luZyBWMC4xIG9mIHRoaXMKKyAgICBkcml2ZXIuCisKKyAgICBUaGUgb3JpZ2luYWwgREVQQ0EgIGNhcmQgcmVxdWlyZXMgdGhhdCB0aGUgIGV0aGVybmV0IFJPTSBhZGRyZXNzIGNvdW50ZXIKKyAgICBiZSBlbmFibGVkIHRvIGNvdW50IGFuZCBoYXMgYW4gOCBiaXQgTklDU1IuICBUaGUgUk9NIGNvdW50ZXIgZW5hYmxpbmcgaXMKKyAgICBvbmx5ICBkb25lIHdoZW4gYSAgMHgwOCBpcyByZWFkIGFzIHRoZSAgZmlyc3QgYWRkcmVzcyBvY3RldCAodG8gbWluaW1pc2UKKyAgICB0aGUgY2hhbmNlcyAgb2Ygd3JpdGluZyBvdmVyIHNvbWUgIG90aGVyIGhhcmR3YXJlJ3MgIEkvTyByZWdpc3RlcikuICBUaGUKKyAgICBOSUNTUiBhY2Nlc3NlcyAgIGhhdmUgYmVlbiBjaGFuZ2VkICB0byAgYnl0ZSBhY2Nlc3NlcyAgZm9yIGFsbCB0aGUgY2FyZHMKKyAgICBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIHNpbmNlIHRoZXJlIGlzIG9ubHkgb25lICB1c2VmdWwgYml0IGluIHRoZSBNU0IKKyAgICAocmVtb3RlIGJvb3QgdGltZW91dCkgYW5kIGl0ICBpcyBub3QgdXNlZC4gIEFsc28sIHRoZXJlICBpcyBhIG1heGltdW0gb2YKKyAgICBvbmx5IDQ4a0IgbmV0d29yayAgUkFNIGZvciB0aGlzICBjYXJkLiAgTXkgdGhhbmtzICB0byBUb3Jiam9ybiBMaW5kaCBmb3IKKyAgICBoZWxwIGRlYnVnZ2luZyBhbGwgdGhpcyAoYW5kIGhvbGRpbmcgbXkgZmVldCB0byAgdGhlIGZpcmUgdW50aWwgSSBnb3QgaXQKKyAgICByaWdodCkuCisKKyAgICBUaGUgREUyMDAgIHNlcmllcyAgYm9hcmRzIGhhdmUgIG9uLWJvYXJkIDY0a0IgIFJBTSBmb3IgIHVzZSAgYXMgYSBzaGFyZWQKKyAgICBtZW1vcnkgbmV0d29yayAgYnVmZmVyLiBPbmx5IHRoZSBERTEwMCAgY2FyZHMgbWFrZSB1c2UgIG9mIGEgIDJrQiBidWZmZXIKKyAgICBtb2RlIHdoaWNoIGhhcyBub3QgIGJlZW4gaW1wbGVtZW50ZWQgaW4gIHRoaXMgZHJpdmVyIChvbmx5IHRoZSAzMmtCICBhbmQKKyAgICA2NGtCIG1vZGVzIGFyZSBzdXBwb3J0ZWQgWzE2a0IvNDhrQiBmb3IgdGhlIG9yaWdpbmFsIERFUENBXSkuCisKKyAgICBBdCB0aGUgbW9zdCBvbmx5IDIgREVQQ0EgY2FyZHMgY2FuICBiZSBzdXBwb3J0ZWQgb24gIHRoZSBJU0EgYnVzIGJlY2F1c2UKKyAgICB0aGVyZSBpcyBvbmx5IHByb3Zpc2lvbiAgZm9yIHR3byBJL08gYmFzZSBhZGRyZXNzZXMgIG9uIGVhY2ggY2FyZCAoMHgzMDAKKyAgICBhbmQgMHgyMDApLiBUaGUgSS9PIGFkZHJlc3MgaXMgZGV0ZWN0ZWQgYnkgc2VhcmNoaW5nIGZvciBhIGJ5dGUgc2VxdWVuY2UKKyAgICBpbiB0aGUgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzIFBST00gYXQgdGhlIGV4cGVjdGVkIEkvTyBhZGRyZXNzIGZvciB0aGUKKyAgICBFdGhlcm5ldCAgUFJPTS4gICBUaGUgc2hhcmVkIG1lbW9yeSAgYmFzZSAgIGFkZHJlc3MgIGlzICdhdXRvcHJvYmVkJyAgYnkKKyAgICBsb29raW5nICBmb3IgdGhlIHNlbGYgIHRlc3QgUFJPTSAgYW5kIGRldGVjdGluZyB0aGUgIGNhcmQgbmFtZS4gICBXaGVuIGEKKyAgICBzZWNvbmQgIERFUENBIGlzICBkZXRlY3RlZCwgIGluZm9ybWF0aW9uICBpcyAgIHBsYWNlZCBpbiB0aGUgICBiYXNlX2FkZHIKKyAgICB2YXJpYWJsZSBvZiB0aGUgIG5leHQgZGV2aWNlIHN0cnVjdHVyZSAod2hpY2ggIGlzIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5KSwKKyAgICB0aHVzICBlbmFibGluZyBldGhpZl9wcm9iZSAgaW5pdGlhbGl6YXRpb24gIGZvciB0aGUgZGV2aWNlLiAgTW9yZSB0aGFuIDIKKyAgICBFSVNBIGNhcmRzIGNhbiAgYmUgIHN1cHBvcnRlZCwgYnV0ICBjYXJlIHdpbGwgIGJlICBuZWVkZWQgYXNzaWduaW5nICB0aGUKKyAgICBzaGFyZWQgbWVtb3J5IHRvIGVuc3VyZSB0aGF0IGVhY2ggc2xvdCBoYXMgdGhlICBjb3JyZWN0IElSUSwgSS9PIGFkZHJlc3MKKyAgICBhbmQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIGFzc2lnbmVkLgorCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBOT1RFOiBJZiB5b3UgYXJlIHVzaW5nIHR3byAgSVNBIERFUENBcywgaXQgaXMgIGltcG9ydGFudCB0aGF0IHlvdSBhc3NpZ24KKyAgICB0aGUgYmFzZSBtZW1vcnkgYWRkcmVzc2VzIGNvcnJlY3RseS4gICBUaGUgIGRyaXZlciBhdXRvcHJvYmVzIEkvTyAgMHgzMDAKKyAgICB0aGVuIDB4MjAwLiAgVGhlICBiYXNlIG1lbW9yeSBhZGRyZXNzIGZvciAgdGhlIGZpcnN0IGRldmljZSBtdXN0IGJlIGxlc3MKKyAgICB0aGFuIHRoYXQgb2YgdGhlIHNlY29uZCBzbyB0aGF0IHRoZSBhdXRvIHByb2JlIHdpbGwgY29ycmVjdGx5IGFzc2lnbiB0aGUKKyAgICBJL08gYW5kIG1lbW9yeSBhZGRyZXNzZXMgb24gdGhlIHNhbWUgY2FyZC4gIEkgY2FuJ3QgdGhpbmsgb2YgYSB3YXkgdG8gZG8KKyAgICB0aGlzIHVuYW1iaWd1b3VzbHkgYXQgdGhlIG1vbWVudCwgc2luY2UgdGhlcmUgaXMgbm90aGluZyBvbiB0aGUgY2FyZHMgdG8KKyAgICB0aWUgSS9PIGFuZCBtZW1vcnkgaW5mb3JtYXRpb24gdG9nZXRoZXIuCisKKyAgICBJIGFtIHVuYWJsZSAgdG8gIHRlc3QgIDIgY2FyZHMgICB0b2dldGhlciBmb3Igbm93LCAgICBzbyB0aGlzICBjb2RlICAgaXMKKyAgICB1bmNoZWNrZWQuIEFsbCByZXBvcnRzLCBnb29kIG9yIGJhZCwgYXJlIHdlbGNvbWUuCisKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIFRoZSBib2FyZCBJUlEgICBzZXR0aW5nIG11c3QgYmUgIGF0IGFuICB1bnVzZWQgSVJRIHdoaWNoICBpcyBhdXRvLXByb2JlZAorICAgIHVzaW5nIERvbmFsZCBCZWNrZXIncyBhdXRvcHJvYmUgcm91dGluZXMuIERFUENBIGFuZCBERTEwMCBib2FyZCBJUlFzIGFyZQorICAgIHsyLDMsNCw1LDd9LCB3aGVyZWFzIHRoZSAgREUyMDAgaXMgYXQgezUsOSwxMCwxMSwxNX0uICBOb3RlIHRoYXQgSVJRMiBpcworICAgIHJlYWxseSBJUlE5IGluIG1hY2hpbmVzIHdpdGggMTYgSVJRIGxpbmVzLgorCisgICAgTm8gMTZNQiBtZW1vcnkgIGxpbWl0YXRpb24gc2hvdWxkIGV4aXN0IHdpdGggdGhpcyAgZHJpdmVyIGFzIERNQSBpcyAgbm90CisgICAgdXNlZCBhbmQgdGhlIGNvbW1vbiBtZW1vcnkgYXJlYSBpcyBpbiBsb3cgbWVtb3J5IG9uIHRoZSBuZXR3b3JrIGNhcmQgKG15CisgICAgY3VycmVudCBzeXN0ZW0gaGFzIDIwTUIgYW5kIEkndmUgbm90IGhhZCBwcm9ibGVtcyB5ZXQpLgorCisgICAgVGhlIGFiaWxpdHkgdG8gbG9hZCB0aGlzIGRyaXZlciBhcyBhIGxvYWRhYmxlIG1vZHVsZSBoYXMgYmVlbiBhZGRlZC4gVG8KKyAgICB1dGlsaXNlIHRoaXMgYWJpbGl0eSwgeW91IGhhdmUgdG8gZG8gPDggdGhpbmdzOgorCisgICAgMCkgaGF2ZSBhIGNvcHkgb2YgdGhlIGxvYWRhYmxlIG1vZHVsZXMgY29kZSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0uCisgICAgMSkgY29weSBkZXBjYS5jIGZyb20gdGhlICAvbGludXgvZHJpdmVycy9uZXQgZGlyZWN0b3J5IHRvIHlvdXIgZmF2b3VyaXRlCisgICAgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAgICAyKSBpZiB5b3Ugd2lzaCwgZWRpdCB0aGUgIHNvdXJjZSBjb2RlIG5lYXIgIGxpbmUgMTUzMCB0byByZWZsZWN0IHRoZSBJL08KKyAgICBhZGRyZXNzIGFuZCBJUlEgeW91J3JlIHVzaW5nIChzZWUgYWxzbyA1KS4KKyAgICAzKSBjb21waWxlICBkZXBjYS5jLCBidXQgaW5jbHVkZSAtRE1PRFVMRSBpbiAgdGhlIGNvbW1hbmQgbGluZSB0byBlbnN1cmUKKyAgICB0aGF0IHRoZSBjb3JyZWN0IGJpdHMgYXJlIGNvbXBpbGVkIChzZWUgZW5kIG9mIHNvdXJjZSBjb2RlKS4KKyAgICA0KSBpZiB5b3UgYXJlIHdhbnRpbmcgdG8gYWRkIGEgbmV3ICBjYXJkLCBnb3RvIDUuIE90aGVyd2lzZSwgcmVjb21waWxlIGEKKyAgICBrZXJuZWwgd2l0aCB0aGUgZGVwY2EgY29uZmlndXJhdGlvbiB0dXJuZWQgb2ZmIGFuZCByZWJvb3QuCisgICAgNSkgaW5zbW9kIGRlcGNhLm8gW2lycT03XSBbaW89MHgyMDBdIFttZW09MHhkMDAwMF0gW2FkYXB0ZXJfbmFtZT1ERTEwMF0KKyAgICAgICBbQWxhbiBDb3g6IENoYW5nZWQgdGhlIGNvZGUgdG8gYWxsb3cgY29tbWFuZCBsaW5lIGlycS9pbyBhc3NpZ25tZW50c10KKyAgICAgICBbRGF2ZSBEYXZpZXM6IENoYW5nZWQgdGhlIGNvZGUgdG8gYWxsb3cgY29tbWFuZCBsaW5lIG1lbS9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVudHNdCisgICAgNikgcnVuIHRoZSBuZXQgc3RhcnR1cCBiaXRzIGZvciB5b3VyIGV0aD8/IGludGVyZmFjZSBtYW51YWxseSAKKyAgICAodXN1YWxseSAvZXRjL3JjLmluZXRbMTJdIGF0IGJvb3QgdGltZSkuIAorICAgIDcpIGVuam95IQorCisgICAgTm90ZSB0aGF0IGF1dG9wcm9iaW5nIGlzIG5vdCBhbGxvd2VkIGluIGxvYWRhYmxlIG1vZHVsZXMgLSB0aGUgc3lzdGVtIGlzCisgICAgYWxyZWFkeSB1cCBhbmQgcnVubmluZyBhbmQgeW91J3JlIG1lc3Npbmcgd2l0aCBpbnRlcnJ1cHRzLgorCisgICAgVG8gdW5sb2FkIGEgbW9kdWxlLCB0dXJuIG9mZiB0aGUgYXNzb2NpYXRlZCBpbnRlcmZhY2UgCisgICAgJ2lmY29uZmlnIGV0aD8/IGRvd24nIHRoZW4gJ3JtbW9kIGRlcGNhJy4KKworICAgIFRvIGFzc2lnbiBhIGJhc2UgbWVtb3J5IGFkZHJlc3MgZm9yIHRoZSBzaGFyZWQgbWVtb3J5ICB3aGVuIHJ1bm5pbmcgYXMgYQorICAgIGxvYWRhYmxlIG1vZHVsZSwgc2VlIDUgYWJvdmUuICBUbyBpbmNsdWRlIHRoZSBhZGFwdGVyICBuYW1lIChpZiB5b3UgaGF2ZQorICAgIG5vIFBST00gIGJ1dCBrbm93IHRoZSBjYXJkIG5hbWUpICBhbHNvIHNlZSA1ICBhYm92ZS4gTm90ZSB0aGF0IHRoaXMgbGFzdAorICAgIG9wdGlvbiAgd2lsbCBub3Qgd29yayAgd2l0aCBrZXJuZWwgIGJ1aWx0LWluICBkZXBjYSdzLiAKKworICAgIFRoZSBzaGFyZWQgbWVtb3J5IGFzc2lnbm1lbnQgZm9yIGEgbG9hZGFibGUgbW9kdWxlICBtYWtlcyBzZW5zZSB0byBhdm9pZAorICAgIHRoZSAnbWVtb3J5IGF1dG9wcm9iZScgcGlja2luZyB0aGUgd3Jvbmcgc2hhcmVkIG1lbW9yeSAgKGZvciB0aGUgY2FzZSBvZgorICAgIDIgZGVwY2EncyBpbiBhIFBDKS4KKworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFN1cHBvcnQgZm9yIE1DQSBFdGhlcldPUktTIGNhcmRzIGFkZGVkIDExLTMtOTguCisgICAgVmVyaWZpZWQgdG8gd29yayB3aXRoIHVwIHRvIDIgREUyMTIgY2FyZHMgaW4gYSBzeXN0ZW0gKGFsdGhvdWdoIG5vdAorICAgICAgZnVsbHkgc3RyZXNzLXRlc3RlZCkuICAKKworICAgIEN1cnJlbnRseSBrbm93biBidWdzL2xpbWl0YXRpb25zOgorCisgICAgTm90ZTogIHdpdGggdGhlIE1DQSBzdHVmZiBhcyBhIG1vZHVsZSwgaXQgdHJ1c3RzIHRoZSBNQ0EgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgbm90IHRoZSBjb21tYW5kIGxpbmUgZm9yIElSUSBhbmQgbWVtb3J5IGFkZHJlc3MuICBZb3UgY2FuCisgICAgICAgICAgIHNwZWNpZnkgdGhlbSBpZiB5b3Ugd2FudCwgYnV0IGl0IHdpbGwgdGhyb3cgeW91ciB2YWx1ZXMgb3V0LgorICAgICAgICAgICBZb3Ugc3RpbGwgaGF2ZSB0byBwYXNzIHRoZSBJTyBhZGRyZXNzIGl0IHdhcyBjb25maWd1cmVkIGFzCisgICAgICAgICAgIHRob3VnaC4KKworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFRPIERPOgorICAgIC0tLS0tLQorCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5CisgICAgLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVmVyc2lvbiAgIERhdGUgICAgICAgIERlc2NyaXB0aW9uCisgIAorICAgICAgMC4xICAgICAyNS1qYW4tOTQgICBJbml0aWFsIHdyaXRpbmcuCisgICAgICAwLjIgICAgIDI3LWphbi05NCAgIEFkZGVkIExBTkNFIFRYIGhhcmR3YXJlIGJ1ZmZlciBjaGFpbmluZy4KKyAgICAgIDAuMyAgICAgIDEtZmViLTk0ICAgQWRkZWQgbXVsdGlwbGUgREVQQ0Egc3VwcG9ydC4KKyAgICAgIDAuMzEgICAgIDQtZmViLTk0ICAgQWRkZWQgREUyMDIgcmVjb2duaXRpb24uCisgICAgICAwLjMyICAgIDE5LWZlYi05NCAgIFRpZHkgdXAuIEltcHJvdmUgbXVsdGktREVQQ0Egc3VwcG9ydC4KKyAgICAgIDAuMzMgICAgMjUtZmViLTk0ICAgRml4IERFUENBIGV0aGVybmV0IFJPTSBjb3VudGVyIGVuYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIGphYmJlciBwYWNrZXQgZml4IGZyb20gbXVyZkBwZXJmdGVjaC5jb20KKwkJCSAgYW5kIGJlY2tlckBzdXBlci5vcmcKKyAgICAgIDAuMzQgICAgIDctbWFyLTk0ICAgRml4IERFUENBIG1heCBuZXR3b3JrIG1lbW9yeSBSQU0gJiBOSUNTUiBhY2Nlc3MuCisgICAgICAwLjM1ICAgICA4LW1hci05NCAgIEFkZGVkIERFMjAxIHJlY29nbml0aW9uLiBUaWRpZWQgdXAuCisgICAgICAwLjM1MSAgIDMwLWFwci05NCAgIEFkZGVkIEVJU0Egc3VwcG9ydC4gQWRkZWQgREU0MjIgcmVjb2duaXRpb24uCisgICAgICAwLjM2ICAgIDE2LW1heS05NCAgIERFNDIyIGZpeCByZWxlYXNlZC4KKyAgICAgIDAuMzcgICAgMjItanVsLTk0ICAgQWRkZWQgTU9EVUxFIHN1cHBvcnQKKyAgICAgIDAuMzggICAgMTUtYXVnLTk0ICAgQWRkZWQgREJSIFJPTSBzd2l0Y2ggaW4gZGVwY2FfY2xvc2UoKS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpIERFUENBIGJ1ZyBmaXguCisgICAgICAwLjM4YXhwIDE1LXNlcC05NCAgIFNwZWNpYWwgdmVyc2lvbiBmb3IgQWxwaGEgQVhQIExpbnV4IFYxLjAuCisgICAgICAwLjM4MSAgIDEyLWRlYy05NCAgIEFkZGVkIERFMTAxIHJlY29nbml0aW9uLCBmaXggbXVsdGljYXN0IGJ1Zy4KKyAgICAgIDAuMzgyICAgIDktZmViLTk1ICAgRml4IHJlY29nbml0aW9uIGJ1ZyByZXBvcnRlZCBieSA8YmttQHN0YXIucmwuYWMudWs+LgorICAgICAgMC4zODMgICAyMi1mZWItOTUgICBGaXggZm9yIGNvbmZsaWN0IHdpdGggVkVTQSBTQ1NJIHJlcG9ydGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbWFpbkBhbGYuZGVjLmNvbT4KKyAgICAgIDAuMzg0ICAgMTctbWFyLTk1ICAgRml4IGEgcmluZyBmdWxsIGJ1ZyByZXBvcnRlZCBieSA8YmttQHN0YXIucmwuYWMudWs+CisgICAgICAwLjM4NSAgICAzLWFwci05NSAgIEZpeCBhIHJlY29nbml0aW9uIGJ1ZyByZXBvcnRlZCBieSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyeWFuLm5pZW1pQGxhc3Rmcm9udGllci5jb20+CisgICAgICAwLjM4NiAgIDIxLWFwci05NSAgIEZpeCB0aGUgbGFzdCBmaXguLi5zb3JyeSwgbXVzdCBiZSBnYWxsb3Bpbmcgc2VuaWxpdHkKKyAgICAgIDAuNDAgICAgMjUtTWF5LTk1ICAgUmV3cml0ZSBmb3IgcG9ydGFiaWxpdHkgJiB1cGRhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSBzdXBwb3J0IGZyb20gPGplc3RhYnJvQGFtdC50YXkxLmRlYy5jb20+CisgICAgICAwLjQxICAgIDI2LUp1bi05NSAgIEFkZGVkIHZlcmlmeV9hcmVhKCkgY2FsbHMgaW4gZGVwY2FfaW9jdGwoKSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb24gYnkgPGhlaWtvQGNvbG9zc3VzLmVzY2FwZS5kZT4KKyAgICAgIDAuNDIgICAgMjctRGVjLTk1ICAgQWRkICdtZW0nIHNoYXJlZCBtZW1vcnkgYXNzaWdubWVudCBmb3IgbG9hZGFibGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCAnYWRhcHRlcl9uYW1lJyBmb3IgbG9hZGFibGUgbW9kdWxlcyB3aGVuIG5vIFBST00uCisJCQkgIEJvdGggYWJvdmUgZnJvbSBhIHN1Z2dlc3Rpb24gYnkgCisJCQkgIDxwY2hlbkB3b29kcnVmZnMxMjEucmVzaWRlbmNlLmdhdGVjaC5lZHU+LgorCQkJICBBZGQgbmV3IG11bHRpY2FzdGluZyBjb2RlLgorICAgICAgMC40MjEgICAyMi1BcHItOTYJICBGaXggYWxsb2NfZGV2aWNlKCkgYnVnIDxqYXJpQG1hcmtrdXMyLmZpbXIuZmk+CisgICAgICAwLjQyMiAgIDI5LUFwci05NgkgIEZpeCBkZXBjYV9od19pbml0KCkgYnVnIDxqYXJpQG1hcmtrdXMyLmZpbXIuZmk+CisgICAgICAwLjQyMyAgICA3LUp1bi05NiAgIEZpeCBtb2R1bGUgbG9hZCBidWcgPGttZ0BiYXJjby5iZT4KKyAgICAgIDAuNDMgICAgMTYtQXVnLTk2ICAgVXBkYXRlIGFsbG9jX2RldmljZSgpIHRvIGNvbmZvcm0gdG8gZGU0eDUuYworICAgICAgMC40NCAgICAgMS1TZXAtOTcgICBGaXggKl9wcm9iZSgpIHRvIHRlc3QgY2hlY2tfcmVnaW9uKCkgZmlyc3QgLSBidWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGJ5IDxtbW9naWx2aUBlbGJlcnQudWNjcy5lZHU+CisgICAgICAwLjQ1ICAgICAzLU5vdi05OCAgIEFkZGVkIHN1cHBvcnQgZm9yIE1DQSBFdGhlcldPUktTIChERTIxMC9ERTIxMikgY2FyZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IDx0eW1tQGNvbXB1dGVyLm9yZz4gCisgICAgICAwLjQ1MSAgICA1LU5vdi05OCAgIEZpeGVkIG1jYSBzdHVmZiBjdXogSSdtIGEgZHVtbXkuIDx0eW1tQGNvbXB1dGVyLm9yZz4KKyAgICAgIDAuNSAgICAgMTQtTm92LTk4ICAgUmUtc3BpbiBmb3IgMi4xLngga2VybmVscy4KKyAgICAgIDAuNTEgICAgMjctSnVuLTk5ICAgQ29ycmVjdCByZWNlaXZlZCBwYWNrZXQgbGVuZ3RoIGZvciBDUkMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0IGJ5IDx3b3JtQGRraWsuZGs+CisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSA8Z3B4ZS9pc2EuaD4KKyNpbmNsdWRlICJjb25zb2xlLmgiCisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorCisvKgorKiogSS9PIGFkZHJlc3Nlcy4gTm90ZSB0aGF0IHRoZSAyayBidWZmZXIgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4KKyoqIHRoaXMgZHJpdmVyLgorKi8KKyNkZWZpbmUgREVQQ0FfTklDU1IgMHgwMCAgIC8qIE5ldHdvcmsgaW50ZXJmYWNlIENTUiAqLworI2RlZmluZSBERVBDQV9SQkkgICAweDAyICAgLyogUkFNIGJ1ZmZlciBpbmRleCAoMmsgYnVmZmVyIG1vZGUpICovCisjZGVmaW5lIERFUENBX0RBVEEgIDB4MDQgICAvKiBMQU5DRSByZWdpc3RlcnMnIGRhdGEgcG9ydCAqLworI2RlZmluZSBERVBDQV9BRERSICAweDA2ICAgLyogTEFOQ0UgcmVnaXN0ZXJzJyBhZGRyZXNzIHBvcnQgKi8KKyNkZWZpbmUgREVQQ0FfSEJBU0UgMHgwOCAgIC8qIEVJU0EgaGlnaCBtZW1vcnkgYmFzZSBhZGRyZXNzIHJlZy4gKi8KKyNkZWZpbmUgREVQQ0FfUFJPTSAgMHgwYyAgIC8qIEV0aGVybmV0IGFkZHJlc3MgUk9NIGRhdGEgcG9ydCAqLworI2RlZmluZSBERVBDQV9DTkZHICAweDBjICAgLyogRUlTQSBDb25maWd1cmF0aW9uIHBvcnQgKi8KKyNkZWZpbmUgREVQQ0FfUkJTQSAgMHgwZSAgIC8qIFJBTSBidWZmZXIgc3RhcnRpbmcgYWRkcmVzcyAoMmsgYnVmZi4pICovCisKKy8qCisqKiBUaGVzZSBhcmUgTEFOQ0UgcmVnaXN0ZXJzIGFkZHJlc3NhYmxlIHRocm91Z2ggbmljLT5pb2FkZHIgKyBERVBDQV9BRERSIAorKi8KKyNkZWZpbmUgQ1NSMCAgICAgICAwCisjZGVmaW5lIENTUjEgICAgICAgMQorI2RlZmluZSBDU1IyICAgICAgIDIKKyNkZWZpbmUgQ1NSMyAgICAgICAzCisKKy8qIAorKiogTkVUV09SSyBJTlRFUkZBQ0UgQ1NSIChOSV9DU1IpIGJpdCBkZWZpbml0aW9ucyAKKyovCisgCisjZGVmaW5lIFRPICAgICAgIAkweDAxMDAJLyogVGltZSBPdXQgZm9yIHJlbW90ZSBib290ICovCisjZGVmaW5lIFNIRSAgICAgIAkweDAwODAgIC8qIFNIYWRvdyBtZW1vcnkgRW5hYmxlICovCisjZGVmaW5lIEJTICAgICAgIAkweDAwNDAgIC8qIEJhbmsgU2VsZWN0ICovCisjZGVmaW5lIEJVRiAgICAgIAkweDAwMjAJLyogQlVGZmVyIHNpemUgKDEtPjMyaywgMC0+NjRrKSAqLworI2RlZmluZSBSQkUgICAgICAJMHgwMDEwCS8qIFJlbW90ZSBCb290IEVuYWJsZSAoMS0+bmV0IGJvb3QpICovCisjZGVmaW5lIEFBQyAgICAgIAkweDAwMDggIC8qIEFkZHJlc3MgUk9NIEFkZHJlc3MgQ291bnRlciAoMS0+ZW5hYmxlKSAqLworI2RlZmluZSBfMTI4S0IgICAgICAJMHgwMDA4ICAvKiAxMjhrQiBOZXR3b3JrIFJBTSAoMS0+ZW5hYmxlKSAqLworI2RlZmluZSBJTSAgICAgICAJMHgwMDA0CS8qIEludGVycnVwdCBNYXNrICgxLT5tYXNrKSAqLworI2RlZmluZSBJRU4gICAgICAJMHgwMDAyCS8qIEludGVycnVwdCB0cmlzdGF0ZSBFTmFibGUgKDEtPmVuYWJsZSkgKi8KKyNkZWZpbmUgTEVEICAgICAgCTB4MDAwMQkvKiBMRUQgY29udHJvbCAqLworCisvKiAKKyoqIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwIChDU1IwKSBiaXQgZGVmaW5pdGlvbnMgCisqLworCisjZGVmaW5lIEVSUiAgICAgCTB4ODAwMCAJLyogRXJyb3Igc3VtbWFyeSAqLworI2RlZmluZSBCQUJMICAgIAkweDQwMDAgCS8qIEJhYmJsZSB0cmFuc21pdHRlciB0aW1lb3V0IGVycm9yICAqLworI2RlZmluZSBDRVJSICAgIAkweDIwMDAgCS8qIENvbGxpc2lvbiBFcnJvciAqLworI2RlZmluZSBNSVNTICAgIAkweDEwMDAgCS8qIE1pc3NlZCBwYWNrZXQgKi8KKyNkZWZpbmUgTUVSUiAgICAJMHgwODAwIAkvKiBNZW1vcnkgRXJyb3IgKi8KKyNkZWZpbmUgUklOVCAgICAJMHgwNDAwIAkvKiBSZWNlaXZlciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVElOVCAgICAJMHgwMjAwIAkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSURPTiAgICAJMHgwMTAwIAkvKiBJbml0aWFsaXphdGlvbiBEb25lICovCisjZGVmaW5lIElOVFIgICAgCTB4MDA4MCAJLyogSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgSU5FQSAgICAJMHgwMDQwIAkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFJYT04gICAgCTB4MDAyMCAJLyogUmVjZWl2ZXIgb24gKi8KKyNkZWZpbmUgVFhPTiAgICAJMHgwMDEwIAkvKiBUcmFuc21pdHRlciBvbiAqLworI2RlZmluZSBURE1EICAgIAkweDAwMDggCS8qIFRyYW5zbWl0IERlbWFuZCAqLworI2RlZmluZSBTVE9QICAgIAkweDAwMDQgCS8qIFN0b3AgKi8KKyNkZWZpbmUgU1RSVCAgICAJMHgwMDAyIAkvKiBTdGFydCAqLworI2RlZmluZSBJTklUICAgIAkweDAwMDEgCS8qIEluaXRpYWxpemUgKi8KKyNkZWZpbmUgSU5UTSAgICAgICAgICAgIDB4ZmYwMCAgLyogSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgSU5URSAgICAgICAgICAgIDB4ZmZmMCAgLyogSW50ZXJydXB0IEVuYWJsZSAqLworCisvKgorKiogQ09OVFJPTCBBTkQgU1RBVFVTIFJFR0lTVEVSIDMgKENTUjMpCisqLworCisjZGVmaW5lIEJTV1AgICAgCTB4MDAwNAkvKiBCeXRlIFNXYVAgKi8KKyNkZWZpbmUgQUNPTiAgICAJMHgwMDAyCS8qIEFMRSBjb250cm9sICovCisjZGVmaW5lIEJDT04gICAgCTB4MDAwMQkvKiBCeXRlIENPTnRyb2wgKi8KKworLyoKKyoqIEluaXRpYWxpemF0aW9uIEJsb2NrIE1vZGUgUmVnaXN0ZXIgCisqLworCisjZGVmaW5lIFBST00gICAgICAgCTB4ODAwMCAJLyogUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBFTUJBICAgICAgIAkweDAwODAJLyogRW5hYmxlIE1vZGlmaWVkIEJhY2stb2ZmIEFsZ29yaXRobSAqLworI2RlZmluZSBJTlRMICAgICAgIAkweDAwNDAgCS8qIEludGVybmFsIExvb3BiYWNrICovCisjZGVmaW5lIERSVFkgICAgICAgCTB4MDAyMCAJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBDT0xMICAgICAgIAkweDAwMTAgCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBEVENSICAgICAgIAkweDAwMDggCS8qIERpc2FibGUgVHJhbnNtaXQgQ1JDICovCisjZGVmaW5lIExPT1AgICAgICAgCTB4MDAwNCAJLyogTG9vcGJhY2sgKi8KKyNkZWZpbmUgRFRYICAgICAgICAJMHgwMDAyIAkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdHRlciAqLworI2RlZmluZSBEUlggICAgICAgIAkweDAwMDEgCS8qIERpc2FibGUgdGhlIFJlY2VpdmVyICovCisKKy8qCisqKiBSZWNlaXZlIE1lc3NhZ2UgRGVzY3JpcHRvciAxIChSTUQxKSBiaXQgZGVmaW5pdGlvbnMuIAorKi8KKworI2RlZmluZSBSX09XTiAgICAgICAweDgwMDAwMDAwIAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLworI2RlZmluZSBSX0VSUiAgICAgCTB4NDAwMCAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBSX0ZSQU0gICAgCTB4MjAwMCAJLyogRnJhbWluZyBFcnJvciAqLworI2RlZmluZSBSX09GTE8gICAgCTB4MTAwMCAJLyogT3ZlcmZsb3cgRXJyb3IgKi8KKyNkZWZpbmUgUl9DUkMgICAgIAkweDA4MDAgCS8qIENSQyBFcnJvciAqLworI2RlZmluZSBSX0JVRkYgICAgCTB4MDQwMCAJLyogQnVmZmVyIEVycm9yICovCisjZGVmaW5lIFJfU1RQICAgICAJMHgwMjAwIAkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgUl9FTlAgICAgIAkweDAxMDAgCS8qIEVuZCBvZiBQYWNrZXQgKi8KKworLyoKKyoqIFRyYW5zbWl0IE1lc3NhZ2UgRGVzY3JpcHRvciAxIChUTUQxKSBiaXQgZGVmaW5pdGlvbnMuIAorKi8KKworI2RlZmluZSBUX09XTiAgICAgICAweDgwMDAwMDAwIAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLworI2RlZmluZSBUX0VSUiAgICAgCTB4NDAwMCAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBUX0FERF9GQ1MgCTB4MjAwMCAJLyogTW9yZSB0aGUgMSByZXRyeSBuZWVkZWQgdG8gWG1pdCAqLworI2RlZmluZSBUX01PUkUgICAgCTB4MTAwMAkvKiA+MSByZXRyeSB0byB0cmFuc21pdCBwYWNrZXQgKi8KKyNkZWZpbmUgVF9PTkUgICAgIAkweDA4MDAgCS8qIDEgdHJ5IG5lZWRlZCB0byB0cmFuc21pdCB0aGUgcGFja2V0ICovCisjZGVmaW5lIFRfREVGICAgICAJMHgwNDAwIAkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBUX1NUUCAgICAgICAweDAyMDAwMDAwIAkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgVF9FTlAgICAgICAgMHgwMTAwMDAwMAkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIFRfRkxBR1MgICAgIDB4ZmYwMDAwMDAgIC8qIFRYIEZsYWdzIEZpZWxkICovCisKKy8qCisqKiBUcmFuc21pdCBNZXNzYWdlIERlc2NyaXB0b3IgMyAoVE1EMykgYml0IGRlZmluaXRpb25zLgorKi8KKworI2RlZmluZSBUTUQzX0JVRkYgICAgMHg4MDAwCS8qIEJVRkZlciBlcnJvciAqLworI2RlZmluZSBUTUQzX1VGTE8gICAgMHg0MDAwCS8qIFVuZGVyRkxPdyBlcnJvciAqLworI2RlZmluZSBUTUQzX1JFUyAgICAgMHgyMDAwCS8qIFJFU2VydmVkICovCisjZGVmaW5lIFRNRDNfTENPTCAgICAweDEwMDAJLyogTGF0ZSBDT0xsaXNpb24gKi8KKyNkZWZpbmUgVE1EM19MQ0FSICAgIDB4MDgwMAkvKiBMb3NzIG9mIENBUnJpZXIgKi8KKyNkZWZpbmUgVE1EM19SVFJZICAgIDB4MDQwMAkvKiBSZVRSWSBlcnJvciAqLworCisvKgorKiogRXRoZXJuZXQgUFJPTSBkZWZpbmVzCisqLworI2RlZmluZSBQUk9CRV9MRU5HVEggICAgMzIKKworLyoKKyoqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLiBFbnN1cmUgdGhhdCB0aGUgbWVtb3J5IHJlcXVlc3RlZAorKiogaGVyZSBpcyA8PSB0byB0aGUgYW1vdW50IG9mIHNoYXJlZCBtZW1vcnkgc2V0IHVwIGJ5IHRoZSBib2FyZCBzd2l0Y2hlcy4KKyoqIFRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgTVVTVCBCRSBBIFBPV0VSIE9GIDIuCisqKgorKiogdG90YWxfbWVtb3J5ID0gTlVNX1JYX0RFU0MqKDgrUlhfQlVGRl9TWikgKyBOVU1fVFhfREVTQyooOCtUWF9CVUZGX1NaKQorKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MgICAgIDIgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUlggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgTlVNX1RYX0RFU0MgICAgIDIgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUlhfQlVGRl9TWgkxNTM2ICAgICAgICAgICAgLyogQnVmZmVyIHNpemUgZm9yIGVhY2ggUnggYnVmZmVyICovCisjZGVmaW5lIFRYX0JVRkZfU1oJMTUzNiAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplIGZvciBlYWNoIFR4IGJ1ZmZlciAqLworCisvKgorKiogSVNBIEJ1cyBkZWZpbmVzCisqLworI2lmbmRlZglERVBDQV9NT0RFTAorI2RlZmluZQlERVBDQV9NT0RFTAlERVBDQQorI2VuZGlmCisKK3N0YXRpYyBlbnVtIHsKKwlERVBDQSwgREUxMDAsIERFMTAxLCBERTIwMCwgREUyMDEsIERFMjAyLCBERTIxMCwgREUyMTIsIERFNDIyLCB1bmtub3duCit9IGFkYXB0ZXIgPSBERVBDQV9NT0RFTDsKKworLyoKKyoqIE5hbWUgPC0+IEFkYXB0ZXIgbWFwcGluZworKi8KKworc3RhdGljIGNoYXIgKmFkYXB0ZXJfbmFtZVtdID0geworCSJERVBDQSIsCisJIkRFMTAwIiwiREUxMDEiLAorCSJERTIwMCIsIkRFMjAxIiwiREUyMDIiLAorCSJERTIxMCIsIkRFMjEyIiwKKwkiREU0MjIiLAorCSIiCit9OworCisjaWZuZGVmCURFUENBX1JBTV9CQVNFCisjZGVmaW5lIERFUENBX1JBTV9CQVNFCTB4ZDAwMDAKKyNlbmRpZgorCisvKgorKiogTWVtb3J5IEFsaWdubWVudC4gRWFjaCBkZXNjcmlwdG9yIGlzIDQgbG9uZ3dvcmRzIGxvbmcuIFRvIGZvcmNlIGEKKyoqIHBhcnRpY3VsYXIgYWxpZ25tZW50IG9uIHRoZSBUWCBkZXNjcmlwdG9yLCBhZGp1c3QgREVTQ19TS0lQX0xFTiBhbmQKKyoqIERFU0NfQUxJR04uIEFMSUdOIGFsaWducyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcHJpdmF0ZSBtZW1vcnkgYXJlYQorKiogYW5kIGhlbmNlIHRoZSBSWCBkZXNjcmlwdG9yIHJpbmcncyBmaXJzdCBlbnRyeS4gCisqLworI2RlZmluZSBBTElHTjQgICAgICAoKHUzMik0IC0gMSkgICAgICAgLyogMSBsb25nd29yZCBhbGlnbiAqLworI2RlZmluZSBBTElHTjggICAgICAoKHUzMik4IC0gMSkgICAgICAgLyogMiBsb25nd29yZCAocXVhZHdvcmQpIGFsaWduICovCisjZGVmaW5lIEFMSUdOICAgICAgICAgQUxJR044ICAgICAgICAgICAgICAvKiBLZWVwIHRoZSBMQU5DRSBoYXBweS4uLiAqLworCisvKgorKiogVGhlIERFUENBIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAKKyovCitzdHJ1Y3QgZGVwY2FfcnhfZGVzYyB7CisgICAgdm9sYXRpbGUgczMyIGJhc2U7CisgICAgczE2IGJ1Zl9sZW5ndGg7CQkvKiBUaGlzIGxlbmd0aCBpcyBuZWdhdGl2ZSAyJ3MgY29tcGxlbWVudCEgKi8KKyAgICBzMTYgbXNnX2xlbmd0aDsJCS8qIFRoaXMgbGVuZ3RoIGlzICJub3JtYWwiLiAqLworfTsKKworc3RydWN0IGRlcGNhX3R4X2Rlc2MgeworICAgIHZvbGF0aWxlIHMzMiBiYXNlOworICAgIHMxNiBsZW5ndGg7CQkgICAgICAgIC8qIFRoaXMgbGVuZ3RoIGlzIG5lZ2F0aXZlIDIncyBjb21wbGVtZW50ISAqLworICAgIHMxNiBtaXNjOyAgICAgICAgICAgICAgICAgICAvKiBFcnJvcnMgYW5kIFREUiBpbmZvICovCit9OworCisjZGVmaW5lIExBX01BU0sgMHgwMDAwZmZmZiAgICAgIC8qIExBTkNFIGFkZHJlc3MgbWFzayBmb3IgbWFwcGluZyBuZXR3b3JrIFJBTQorCQkJCSAgIHRvIExBTkNFIG1lbW9yeSBhZGRyZXNzIHNwYWNlICovCisKKy8qCisqKiBUaGUgTGFuY2UgaW5pdGlhbGl6YXRpb24gYmxvY2ssIGRlc2NyaWJlZCBpbiBkYXRhYm9vaywgaW4gY29tbW9uIG1lbW9yeS4KKyovCitzdHJ1Y3QgZGVwY2FfaW5pdCB7CisgICAgdTE2IG1vZGU7CSAgICAgICAgICAgICAgICAvKiBNb2RlIHJlZ2lzdGVyICovCisgICAgdTggIHBoeXNfYWRkcltFVEhfQUxFTl07CS8qIFBoeXNpY2FsIGV0aGVybmV0IGFkZHJlc3MgKi8KKyAgICB1OCAgbWNhc3RfdGFibGVbOF07CSAgICAgICAgLyogTXVsdGljYXN0IEhhc2ggVGFibGUuICovCisgICAgdTMyIHJ4X3Jpbmc7ICAgICAJICAgICAgICAvKiBSeCByaW5nIGJhc2UgcG9pbnRlciAmIHJpbmcgbGVuZ3RoICovCisgICAgdTMyIHR4X3Jpbmc7CSAgICAgICAgLyogVHggcmluZyBiYXNlIHBvaW50ZXIgJiByaW5nIGxlbmd0aCAqLworfTsKKworc3RydWN0IGRlcGNhX3ByaXZhdGUgeworCXN0cnVjdCBkZXBjYV9yeF9kZXNjCSpyeF9yaW5nOworCXN0cnVjdCBkZXBjYV90eF9kZXNjCSp0eF9yaW5nOworCXN0cnVjdCBkZXBjYV9pbml0CWluaXRfYmxvY2s7CS8qIFNoYWRvdyBpbml0IGJsb2NrICovCisJY2hhcgkJCSpyeF9tZW1jcHlbTlVNX1JYX0RFU0NdOworCWNoYXIJCQkqdHhfbWVtY3B5W05VTV9UWF9ERVNDXTsKKwl1MzIJCQlidXNfb2Zmc2V0OwkvKiBJU0EgYnVzIGFkZHJlc3Mgb2Zmc2V0ICovCisJdTMyCQkJc2hfbWVtOwkJLyogYWRkcmVzcyBvZiBzaGFyZWQgbWVtICovCisJdTMyCQkJZG1hX2J1ZmZzOwkvKiBSeCAmIFR4IGJ1ZmZlciBzdGFydCAqLworCWludAkJCXJ4X2N1ciwgdHhfY3VyOwkvKiBOZXh0IGZyZWUgcmluZyBlbnRyeSAqLworCWludAkJCXR4UmluZ01hc2ssIHJ4UmluZ01hc2s7CisJczMyCQkJcnhfcmxlbiwgdHhfcmxlbjsKKwkvKiBsb2cyKFtydF14UmluZ01hc2srMSkgZm9yIHRoZSBkZXNjcmlwdG9ycyAqLworfTsKKworc3RhdGljIEFkZHJlc3MJCW1lbV9zdGFydCA9IERFUENBX1JBTV9CQVNFOworc3RhdGljIEFkZHJlc3MJCW1lbV9sZW4sIG9mZnNldDsKK3N0YXRpYyBzdHJ1Y3QgZGVwY2FfcHJpdmF0ZQlscDsKKworLyoKKyoqIE1pc2NlbGxhbmVvdXMgZGVmaW5lcy4uLgorKi8KKyNkZWZpbmUgU1RPUF9ERVBDQShpb2FkZHIpIFwKKyAgICBvdXR3KENTUjAsIGlvYWRkciArIERFUENBX0FERFIpO1wKKyAgICBvdXR3KFNUT1AsIGlvYWRkciArIERFUENBX0RBVEEpCisKKy8qIEluaXRpYWxpemUgdGhlIGxhbmNlIFJ4IGFuZCBUeCBkZXNjcmlwdG9yIHJpbmdzLiAqLworc3RhdGljIHZvaWQgZGVwY2FfaW5pdF9yaW5nKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQJaTsKKwl1MzIJcDsKKworCWxwLnJ4X2N1ciA9IGxwLnR4X2N1ciA9IDA7CisJLyogSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzZXMgYW5kIGxlbmd0aCBvZiBlYWNoIGJ1ZmZlciBpbiB0aGUgcmluZyAqLworCWZvciAoaSA9IDA7IGkgPD0gbHAucnhSaW5nTWFzazsgaSsrKSB7CisJCXdyaXRlbCgocCA9IGxwLmRtYV9idWZmcyArIGkgKiBSWF9CVUZGX1NaKSB8IFJfT1dOLCAmbHAucnhfcmluZ1tpXS5iYXNlKTsKKwkJd3JpdGV3KC1SWF9CVUZGX1NaLCAmbHAucnhfcmluZ1tpXS5idWZfbGVuZ3RoKTsKKwkJbHAucnhfbWVtY3B5W2ldID0gKGNoYXIgKikgKHAgKyBscC5idXNfb2Zmc2V0KTsKKwl9CisJZm9yIChpID0gMDsgaSA8PSBscC50eFJpbmdNYXNrOyBpKyspIHsKKwkJd3JpdGVsKChwID0gbHAuZG1hX2J1ZmZzICsgKGkgKyBscC50eFJpbmdNYXNrICsgMSkgKiBUWF9CVUZGX1NaKSAmIDB4MDBmZmZmZmYsICZscC50eF9yaW5nW2ldLmJhc2UpOworCQlscC50eF9tZW1jcHlbaV0gPSAoY2hhciAqKSAocCArIGxwLmJ1c19vZmZzZXQpOworCX0KKworCS8qIFNldCB1cCB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2sgKi8KKwlscC5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAoKHUzMikgKCh1MzIpIGxwLnJ4X3JpbmcpICYgTEFfTUFTSykgfCBscC5yeF9ybGVuOworCWxwLmluaXRfYmxvY2sudHhfcmluZyA9ICgodTMyKSAoKHUzMikgbHAudHhfcmluZykgJiBMQV9NQVNLKSB8IGxwLnR4X3JsZW47CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCWxwLmluaXRfYmxvY2sucGh5c19hZGRyW2ldID0gbmljLT5ub2RlX2FkZHJbaV07CisJbHAuaW5pdF9ibG9jay5tb2RlID0gMHgwMDAwOwkvKiBFbmFibGUgdGhlIFR4IGFuZCBSeCAqLworCW1lbXNldChscC5pbml0X2Jsb2NrLm1jYXN0X3RhYmxlLCAwLCBzaXplb2YobHAuaW5pdF9ibG9jay5tY2FzdF90YWJsZSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgTG9hZENTUnMoc3RydWN0IG5pYyAqbmljKQoreworCW91dHcoQ1NSMSwgbmljLT5pb2FkZHIgKyBERVBDQV9BRERSKTsJLyogaW5pdGlhbGlzYXRpb24gYmxvY2sgYWRkcmVzcyBMU1cgKi8KKwlvdXR3KCh1MTYpIChscC5zaF9tZW0gJiBMQV9NQVNLKSwgbmljLT5pb2FkZHIgKyBERVBDQV9EQVRBKTsKKwlvdXR3KENTUjIsIG5pYy0+aW9hZGRyICsgREVQQ0FfQUREUik7CS8qIGluaXRpYWxpc2F0aW9uIGJsb2NrIGFkZHJlc3MgTVNXICovCisJb3V0dygodTE2KSAoKGxwLnNoX21lbSAmIExBX01BU0spID4+IDE2KSwgbmljLT5pb2FkZHIgKyBERVBDQV9EQVRBKTsKKwlvdXR3KENTUjMsIG5pYy0+aW9hZGRyICsgREVQQ0FfQUREUik7CS8qIEFMRSBjb250cm9sICovCisJb3V0dyhBQ09OLCBuaWMtPmlvYWRkciArIERFUENBX0RBVEEpOworCW91dHcoQ1NSMCwgbmljLT5pb2FkZHIgKyBERVBDQV9BRERSKTsJLyogUG9pbnQgYmFjayB0byBDU1IwICovCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IEluaXRSZXN0YXJ0RGVwY2Eoc3RydWN0IG5pYyAqbmljKQoreworCWludAkJaTsKKworCS8qIENvcHkgdGhlIHNoYWRvdyBpbml0X2Jsb2NrIHRvIHNoYXJlZCBtZW1vcnkgKi8KKwltZW1jcHlfdG9pbygoY2hhciAqKWxwLnNoX21lbSwgJmxwLmluaXRfYmxvY2ssIHNpemVvZihzdHJ1Y3QgZGVwY2FfaW5pdCkpOworCW91dHcoQ1NSMCwgbmljLT5pb2FkZHIgKyBERVBDQV9BRERSKTsJCS8qIHBvaW50IGJhY2sgdG8gQ1NSMCAqLworCW91dHcoSU5JVCwgbmljLT5pb2FkZHIgKyBERVBDQV9EQVRBKTsJCS8qIGluaXRpYWxpc2UgREVQQ0EgKi8KKworCWZvciAoaSA9IDA7IGkgPCAxMDAgJiYgIShpbncobmljLT5pb2FkZHIgKyBERVBDQV9EQVRBKSAmIElET04pOyBpKyspCisJCTsKKwlpZiAoaSA8IDEwMCkgeworCQkvKiBjbGVhciBJRE9OIGJ5IHdyaXRpbmcgYSAxLCBhbmQgc3RhcnQgTEFOQ0UgKi8KKwkJb3V0dyhJRE9OIHwgU1RSVCwgbmljLT5pb2FkZHIgKyBERVBDQV9EQVRBKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkRFUENBIG5vdCBpbml0aWFsaXNlZFxuIik7CisJCXJldHVybiAoMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkZXBjYV9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisJczE2CW5pY3NyOworCWludAlpLCBqOworCisJU1RPUF9ERVBDQShuaWMtPmlvYWRkcik7CisJbmljc3IgPSBpbmIobmljLT5pb2FkZHIgKyBERVBDQV9OSUNTUik7CisJbmljc3IgPSAoKG5pY3NyICYgflNIRSAmIH5SQkUgJiB+SUVOKSB8IElNKTsKKwlvdXRiKG5pY3NyLCBuaWMtPmlvYWRkciArIERFUENBX05JQ1NSKTsKKwlpZiAoaW53KG5pYy0+aW9hZGRyICsgREVQQ0FfREFUQSkgIT0gU1RPUCkKKwl7CisJCXByaW50ZigiZGVwY2E6IENhbm5vdCBzdG9wIE5JQ1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBJbml0aWFsaXNhdGlvbiBibG9jayAqLworCWxwLnNoX21lbSA9IG1lbV9zdGFydDsKKwltZW1fc3RhcnQgKz0gc2l6ZW9mKHN0cnVjdCBkZXBjYV9pbml0KTsKKwkvKiBUeCAmIFJ4IGRlc2NyaXB0b3JzIChhbGlnbmVkIHRvIGEgcXVhZHdvcmQgYm91bmRhcnkpICovCisJbWVtX3N0YXJ0ID0gKG1lbV9zdGFydCArIEFMSUdOKSAmIH5BTElHTjsKKwlscC5yeF9yaW5nID0gKHN0cnVjdCBkZXBjYV9yeF9kZXNjICopIG1lbV9zdGFydDsKKwltZW1fc3RhcnQgKz0gKHNpemVvZihzdHJ1Y3QgZGVwY2FfcnhfZGVzYykgKiBOVU1fUlhfREVTQyk7CisJbHAudHhfcmluZyA9IChzdHJ1Y3QgZGVwY2FfdHhfZGVzYyAqKSBtZW1fc3RhcnQ7CisJbWVtX3N0YXJ0ICs9IChzaXplb2Yoc3RydWN0IGRlcGNhX3R4X2Rlc2MpICogTlVNX1RYX0RFU0MpOworCisJbHAuYnVzX29mZnNldCA9IG1lbV9zdGFydCAmIDB4MDBmZjAwMDA7CisJLyogTEFOQ0UgcmUtbWFwcGVkIHN0YXJ0IGFkZHJlc3MgKi8KKwlscC5kbWFfYnVmZnMgPSBtZW1fc3RhcnQgJiBMQV9NQVNLOworCisJLyogRmluaXNoIGluaXRpYWxpc2luZyB0aGUgcmluZyBpbmZvcm1hdGlvbi4gKi8KKwlscC5yeFJpbmdNYXNrID0gTlVNX1JYX0RFU0MgLSAxOworCWxwLnR4UmluZ01hc2sgPSBOVU1fVFhfREVTQyAtIDE7CisKKwkvKiBDYWxjdWxhdGUgVHgvUnggUkxFTiBzaXplIGZvciB0aGUgZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMCwgaiA9IGxwLnJ4UmluZ01hc2s7IGogPiAwOyBpKyspIHsKKwkJaiA+Pj0gMTsKKwl9CisJbHAucnhfcmxlbiA9IChzMzIpIChpIDw8IDI5KTsKKwlmb3IgKGkgPSAwLCBqID0gbHAudHhSaW5nTWFzazsgaiA+IDA7IGkrKykgeworCQlqID4+PSAxOworCX0KKwlscC50eF9ybGVuID0gKHMzMikgKGkgPDwgMjkpOworCisJLyogTG9hZCB0aGUgaW5pdGlhbGlzYXRpb24gYmxvY2sgKi8KKwlkZXBjYV9pbml0X3JpbmcobmljKTsKKwlMb2FkQ1NScyhuaWMpOworCUluaXRSZXN0YXJ0RGVwY2EobmljKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBkZXBjYV9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworCWludAkJZW50cnk7CisJdTMyCQlzdGF0dXM7CisKKwllbnRyeSA9IGxwLnJ4X2N1cjsKKwlpZiAoKHN0YXR1cyA9IHJlYWRsKCZscC5yeF9yaW5nW2VudHJ5XS5iYXNlKSAmIFJfT1dOKSkKKwkJcmV0dXJuICgwKTsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJbWVtY3B5KG5pYy0+cGFja2V0LCBscC5yeF9tZW1jcHlbZW50cnldLCBuaWMtPnBhY2tldGxlbiA9IGxwLnJ4X3JpbmdbZW50cnldLm1zZ19sZW5ndGgpOworCWxwLnJ4X3JpbmdbZW50cnldLmJhc2UgfD0gUl9PV047CisJbHAucnhfY3VyID0gKCsrbHAucnhfY3VyKSAmIGxwLnJ4UmluZ01hc2s7CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGRlcGNhX3RyYW5zbWl0KAorCXN0cnVjdCBuaWMgKm5pYywKKwljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCisJdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLworCXVuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KKwljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLworeworCWludAkJZW50cnksIGxlbjsKKwljaGFyCQkqbWVtOworCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisJLyoKKwkqKiBDYXV0aW9uOiB0aGUgcmlnaHQgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUuLi4gZG9udAorCSoqIHNldHVwIHRoZSBvd25lcnNoaXAgcmlnaHRzIHVudGlsIGFsbCB0aGUgb3RoZXIKKwkqKiBpbmZvcm1hdGlvbiBpcyBpbiBwbGFjZQorCSovCisJbWVtID0gbHAudHhfbWVtY3B5W2VudHJ5ID0gbHAudHhfY3VyXTsKKwltZW1jcHlfdG9pbyhtZW0sIGQsIEVUSF9BTEVOKTsKKwltZW1jcHlfdG9pbyhtZW0gKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKwltZW1bRVRIX0FMRU4gKiAyXSA9IHQgPj4gODsKKwltZW1bRVRIX0FMRU4gKiAyICsgMV0gPSB0OworCW1lbWNweV90b2lvKG1lbSArIEVUSF9ITEVOLCBwLCBzKTsKKwlzICs9IEVUSF9ITEVOOworCWxlbiA9IChzIDwgRVRIX1pMRU4gPyBFVEhfWkxFTiA6IHMpOworCS8qIGNsZWFuIG91dCBmbGFncyAqLworCXdyaXRlbChyZWFkbCgmbHAudHhfcmluZ1tlbnRyeV0uYmFzZSkgJiB+VF9GTEFHUywgJmxwLnR4X3JpbmdbZW50cnldLmJhc2UpOworCS8qIGNsZWFycyBvdGhlciBlcnJvciBmbGFncyAqLworCXdyaXRldygweDAwMDAsICZscC50eF9yaW5nW2VudHJ5XS5taXNjKTsKKwkvKiBwYWNrZXQgbGVuZ3RoIGluIGJ1ZmZlciAqLworCXdyaXRldygtbGVuLCAmbHAudHhfcmluZ1tlbnRyeV0ubGVuZ3RoKTsKKwkvKiBzdGFydCBhbmQgZW5kIG9mIHBhY2tldCwgb3duZXJzaGlwICovCisJd3JpdGVsKHJlYWRsKCZscC50eF9yaW5nW2VudHJ5XS5iYXNlKSB8IChUX1NUUHxUX0VOUHxUX09XTiksICZscC50eF9yaW5nW2VudHJ5XS5iYXNlKTsKKwkvKiB1cGRhdGUgY3VycmVudCBwb2ludGVycyAqLworCWxwLnR4X2N1ciA9ICgrK2xwLnR4X2N1cikgJiBscC50eFJpbmdNYXNrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGRlcGNhX2Rpc2FibGUgKCBzdHJ1Y3QgbmljICpuaWMgKSB7CisJZGVwY2FfcmVzZXQobmljKTsKKworCVNUT1BfREVQQ0EobmljLT5pb2FkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEludGVycnVwdCBDb250cm9sCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkZXBjYV9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworLyoKKyoqIExvb2sgZm9yIGEgc3BlY2lhbCBzZXF1ZW5jZSBpbiB0aGUgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzIFBST00gdGhhdAorKiogaXMgY29tbW9uIGFjcm9zcyBhbGwgREVQQ0EgcHJvZHVjdHMuIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgREVQQ0EgbmVlZHMKKyoqIGl0cyBST00gYWRkcmVzcyBjb3VudGVyIHRvIGJlIGluaXRpYWxpemVkIGFuZCBlbmFibGVkLiBPbmx5IGVuYWJsZQorKiogaWYgdGhlIGZpcnN0IGFkZHJlc3Mgb2N0ZXQgaXMgYSAweDA4IC0gdGhpcyBtaW5pbWlzZXMgdGhlIGNoYW5jZXMgb2YKKyoqIG1lc3NpbmcgYXJvdW5kIHdpdGggc29tZSBvdGhlciBoYXJkd2FyZSwgYnV0IGl0IGFzc3VtZXMgdGhhdCB0aGlzIERFUENBCisqKiBjYXJkIGluaXRpYWxpemVkIGl0c2VsZiBjb3JyZWN0bHkuCisqKgorKiogU2VhcmNoIHRoZSBFdGhlcm5ldCBhZGRyZXNzIFJPTSBmb3IgdGhlIHNpZ25hdHVyZS4gU2luY2UgdGhlIFJPTSBhZGRyZXNzCisqKiBjb3VudGVyIGNhbiBzdGFydCBhdCBhbiBhcmJpdHJhcnkgcG9pbnQsIHRoZSBzZWFyY2ggbXVzdCBpbmNsdWRlIHRoZSBlbnRpcmUKKyoqIHByb2JlIHNlcXVlbmNlIGxlbmd0aCBwbHVzIHRoZSAobGVuZ3RoX29mX3RoZV9zaWduYXR1cmUgLSAxKS4KKyoqIFN0b3AgdGhlIHNlYXJjaCBJTU1FRElBVEVMWSBhZnRlciB0aGUgc2lnbmF0dXJlIGlzIGZvdW5kIHNvIHRoYXQgdGhlCisqKiBQUk9NIGFkZHJlc3MgY291bnRlciBpcyBjb3JyZWN0bHkgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisqKiBldGhlcm5ldCBhZGRyZXNzIGZvciBsYXRlciByZWFkIG91dC4KKyovCisKKworLyoKKyAqIFVnbHksIHVnbHksIHVnbHkuICBJIGNhbid0IHF1aXRlIG1ha2Ugb3V0IHdoZXJlIHRoZSBzcGxpdCBzaG91bGQgYmUKKyAqIGJldHdlZW4gcHJvYmUxIGFuZCBwcm9iZSgpLi4uCisgKgorICovCitzdGF0aWMgdTggbmljc3I7CisKKworc3RhdGljIGludCBkZXBjYV9wcm9iZTEgKCBpc2FfcHJvYmVfYWRkcl90IGlvYWRkciApIHsKKwl1OAlkYXRhOworCS8qIFRoaXMgaXMgb25seSBjb3JyZWN0IGZvciBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLCBidXQgdGhlbgorCSAgIEV0aGVyYm9vdCBkb2Vzbid0IHdvcmsgb24gYW55dGhpbmcgYnV0IGEgUEMgKi8KKwl1OAlzaWdbXSA9IHsgMHhGRiwgMHgwMCwgMHg1NSwgMHhBQSwgMHhGRiwgMHgwMCwgMHg1NSwgMHhBQSB9OworCWludAlpLCBqOworCisJZGF0YSA9IGluYihpb2FkZHIgKyBERVBDQV9QUk9NKTsJCS8qIGNsZWFyIGNvdW50ZXIgb24gREVQQ0EgKi8KKwlkYXRhID0gaW5iKGlvYWRkciArIERFUENBX1BST00pOwkJLyogcmVhZCBkYXRhICovCisJaWYgKGRhdGEgPT0gMHg4KSB7CisJCW5pY3NyID0gaW5iKGlvYWRkciArIERFUENBX05JQ1NSKTsKKwkJbmljc3IgfD0gQUFDOworCQlvdXRiKG5pY3NyLCBpb2FkZHIgKyBERVBDQV9OSUNTUik7CisJfQorCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgKGludClzaXplb2Yoc2lnKSAmJiBpIDwgUFJPQkVfTEVOR1RIKygoaW50KXNpemVvZihzaWcpKS0xOyArK2kpIHsKKwkJZGF0YSA9IGluYihpb2FkZHIgKyBERVBDQV9QUk9NKTsKKwkJaWYgKGRhdGEgPT0gc2lnW2pdKQkJLyogdHJhY2sgc2lnbmF0dXJlICovCisJCQkrK2o7CisJCWVsc2UKKwkJCWogPSAoZGF0YSA9PSBzaWdbMF0pID8gMSA6IDA7CisJfQorCWlmIChqICE9IHNpemVvZihzaWcpKQorCQlyZXR1cm4gKDApOworCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLworCVNUT1BfREVQQ0EoaW9hZGRyKTsKKwluaWNzciA9ICgoaW5iKGlvYWRkciArIERFUENBX05JQ1NSKSAmIH5TSEUgJiB+UkJFICYgfklFTikgfCBJTSk7CisJb3V0YihuaWNzciwgaW9hZGRyICsgREVQQ0FfTklDU1IpOworCWlmIChpbncoaW9hZGRyICsgREVQQ0FfREFUQSkgIT0gU1RPUCkKKwkJcmV0dXJuICgwKTsKKwltZW1jcHkoKGNoYXIgKiltZW1fc3RhcnQsIHNpZywgc2l6ZW9mKHNpZykpOworCWlmIChtZW1jbXAoKGNoYXIgKiltZW1fc3RhcnQsIHNpZywgc2l6ZW9mKHNpZykpICE9IDApCisJCXJldHVybiAoMCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyBkZXBjYV9vcGVyYXRpb25zID0geworCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKKwkucG9sbAkJPSBkZXBjYV9wb2xsLAorCS50cmFuc21pdAk9IGRlcGNhX3RyYW5zbWl0LAorCS5pcnEJCT0gZGVwY2FfaXJxLAorCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBkZXBjYV9wcm9iZSAoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGlzYV9kZXZpY2UgKmlzYSApIHsKKworCWludAlpLCBqOworCWxvbmcJc3VtLCBjaGtzdW07CisKKwluaWMtPmlycW5vICAgID0gMDsKKwluaWMtPmlvYWRkciAgID0gaXNhLT5pb2FkZHI7CisKKwlmb3IgKGkgPSAwLCBqID0gMCwgc3VtID0gMDsgaiA8IDM7IGorKykgeworCQlzdW0gPDw9IDE7CisJCWlmIChzdW0gPiAweEZGRkYpCisJCQlzdW0gLT0gMHhGRkZGOworCQlzdW0gKz0gKHU4KShuaWMtPm5vZGVfYWRkcltpKytdID0gaW5iKG5pYy0+aW9hZGRyICsgREVQQ0FfUFJPTSkpOworCQlzdW0gKz0gKHUxNikoKG5pYy0+bm9kZV9hZGRyW2krK10gPSBpbmIobmljLT5pb2FkZHIgKyBERVBDQV9QUk9NKSkgPDwgOCk7CisJCWlmIChzdW0gPiAweEZGRkYpCisJCQlzdW0gLT0gMHhGRkZGOworCX0KKwlpZiAoc3VtID09IDB4RkZGRikKKwkJc3VtID0gMDsKKwljaGtzdW0gPSAodTgpaW5iKG5pYy0+aW9hZGRyICsgREVQQ0FfUFJPTSk7CisJY2hrc3VtIHw9ICh1MTYpKGluYihuaWMtPmlvYWRkciArIERFUENBX1BST00pIDw8IDgpOworCW1lbV9sZW4gPSAoYWRhcHRlciA9PSBERVBDQSkgPyAoNDggPDwgMTApIDogKDY0IDw8IDEwKTsKKwlvZmZzZXQgPSAwOworCWlmIChuaWNzciAmIEJVRikgeworCQlvZmZzZXQgPSAweDgwMDA7CisJCW5pY3NyICY9IH5CUzsKKwkJbWVtX2xlbiAtPSAoMzIgPDwgMTApOworCX0KKwlpZiAoYWRhcHRlciAhPSBERVBDQSkJLyogZW5hYmxlIHNoYWRvdyBSQU0gKi8KKwkJb3V0YihuaWNzciB8PSBTSEUsIG5pYy0+aW9hZGRyICsgREVQQ0FfTklDU1IpOworCURCRyAoICIlcyBiYXNlICU0LjR4LCBtZW1vcnkgWyU0LjRseC0lNC40bHhdIGFkZHIgJXMiLAorCSAgICAgICBhZGFwdGVyX25hbWVbYWRhcHRlcl0sIG5pYy0+aW9hZGRyLCBtZW1fc3RhcnQsCisJICAgICAgIG1lbV9zdGFydCArIG1lbV9sZW4sIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIgKSApOworCWlmIChzdW0gIT0gY2hrc3VtKQorCQlwcmludGYoIiAoYmFkIGNoZWNrc3VtKSIpOworCXB1dGNoYXIoJ1xuJyk7CisKKwlkZXBjYV9yZXNldChuaWMpOworCisJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJbmljLT5uaWNfb3AJPSAmZGVwY2Ffb3BlcmF0aW9uczsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlzYV9wcm9iZV9hZGRyX3QgZGVwY2FfcHJvYmVfYWRkcnNbXSA9IHsKKwkweDMwMCwgMHgyMDAsCit9OworCitJU0FfRFJJVkVSICggZGVwY2FfZHJpdmVyLCBkZXBjYV9wcm9iZV9hZGRycywgZGVwY2FfcHJvYmUxLAorCQkgICAgIEdFTkVSSUNfSVNBUE5QX1ZFTkRPUiwgMHg4MGY3ICk7CisKK0RSSVZFUiAoICJkZXBjZSIsIG5pY19kcml2ZXIsIGlzYV9kcml2ZXIsIGRlcGNhX2RyaXZlciwKKwkgZGVwY2FfcHJvYmUsIGRlcGNhX2Rpc2FibGUgKTsKKworSVNBX1JPTSAoICJkZXBjYSIsICJEaWdpdGFsIERFMTAwIGFuZCBERTIwMCIgKTsKKworI2VuZGlmCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9kbWZlLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9kbWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkMTczNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2RtZmUuYwpAQCAtMCwwICsxLDEyMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICBkbWZlLmMgLS0gRXRoZXJib290IGRldmljZSBkcml2ZXIgZm9yIHRoZSBEYXZpY29tIAorKglETTkxMDIvRE05MTAyQS9ETTkxMDJBK0RNOTgwMS9ETTkxMDJBK0RNOTgwMiBOSUMgZmFzdCBldGhlcm5ldCBjYXJkCisqCisqICAgIFdyaXR0ZW4gMjAwMy0yMDAzIGJ5IFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogICAgUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGJhc2VkIG9uOgorKgorKiAgICAgICBkbWZlLmM6ICAgICBBIERhdmljb20gRE05MTAyL0RNOTEwMkEvRE05MTAyQStETTk4MDEvRE05MTAyQStETTk4MDIgCisqCQlOSUMgZmFzdCBldGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorKiAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgIFN0ZW4gV2FuZworKiAgICAgICAoQylDb3B5cmlnaHQgMTk5Ny0xOTk4IERBVklDT00gU2VtaWNvbmR1Y3RvcixJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyogICAgdjEuMCAgICAgICAxMC0wMi0yMDA0ICAgICAgdGltbGVnZ2UgICAgICAgIEJvb3RzIGx0c3AgbmVlZHMgY2xlYW51cCAKKyoKKyogICAgSW5kZW50IE9wdGlvbnM6IGluZGVudCAta3IgLWk4CisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisvKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLworI2luY2x1ZGUgIm5pYy5oIgorLyogdG8gZ2V0IHRoZSBQQ0kgc3VwcG9ydCBmdW5jdGlvbnMsIGlmIHRoaXMgaXMgYSBQQ0kgTklDICovCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisKKy8qICNkZWZpbmUgRURFQlVHIDEgKi8KKyNpZmRlZiBFREVCVUcKKyNkZWZpbmUgZHByaW50Zih4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgZHByaW50Zih4KQorI2VuZGlmCisKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCisvKiBCb2FyZC9TeXN0ZW0vRGVidWcgaW5mb3JtYXRpb24vZGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFBDSV9ETTkxMzJfSUQgICAweDkxMzIxMjgyCS8qIERhdmljb20gRE05MTMyIElEICovCisjZGVmaW5lIFBDSV9ETTkxMDJfSUQgICAweDkxMDIxMjgyCS8qIERhdmljb20gRE05MTAyIElEICovCisjZGVmaW5lIFBDSV9ETTkxMDBfSUQgICAweDkxMDAxMjgyCS8qIERhdmljb20gRE05MTAwIElEICovCisjZGVmaW5lIFBDSV9ETTkwMDlfSUQgICAweDkwMDkxMjgyCS8qIERhdmljb20gRE05MDA5IElEICovCisKKyNkZWZpbmUgRE05MTAyX0lPX1NJWkUgIDB4ODAKKyNkZWZpbmUgRE05MTAyQV9JT19TSVpFIDB4MTAwCisjZGVmaW5lIFRYX01BWF9TRU5EX0NOVCAweDEJLyogTWF4aW11bSB0eCBwYWNrZXQgcGVyIHRpbWUgKi8KKyNkZWZpbmUgVFhfREVTQ19DTlQgICAgIDB4MTAJLyogQWxsb2NhdGVkIFR4IGRlc2NyaXB0b3JzICovCisjZGVmaW5lIFJYX0RFU0NfQ05UICAgICAweDIwCS8qIEFsbG9jYXRlZCBSeCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBUWF9GUkVFX0RFU0NfQ05UIChUWF9ERVNDX0NOVCAtIDIpCS8qIE1heCBUWCBwYWNrZXQgY291bnQgKi8KKyNkZWZpbmUgVFhfV0FLRV9ERVNDX0NOVCAoVFhfREVTQ19DTlQgLSAzKQkvKiBUWCB3YWtldXAgY291bnQgKi8KKyNkZWZpbmUgREVTQ19BTExfQ05UICAgIChUWF9ERVNDX0NOVCArIFJYX0RFU0NfQ05UKQorI2RlZmluZSBUWF9CVUZfQUxMT0MgICAgMHg2MDAKKyNkZWZpbmUgUlhfQUxMT0NfU0laRSAgIDB4NjIwCisjZGVmaW5lIERNOTEwWF9SRVNFVCAgICAxCisjZGVmaW5lIENSMF9ERUZBVUxUICAgICAweDAwRTAwMDAwCS8qIFRYICYgUlggYnVyc3QgbW9kZSAqLworI2RlZmluZSBDUjZfREVGQVVMVCAgICAgMHgwMDA4MDAwMAkvKiBIRCAqLworI2RlZmluZSBDUjdfREVGQVVMVCAgICAgMHgxODBjMQorI2RlZmluZSBDUjE1X0RFRkFVTFQgICAgMHgwNgkvKiBUeEphYmJlciBSeFdhdGNoZG9nICovCisjZGVmaW5lIFRERVMwX0VSUl9NQVNLICAweDQzMDIJLyogVFhKVCwgTEMsIEVDLCBGVUUgKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFIDE1MTQKKyNkZWZpbmUgRE1GRV9NQVhfTVVMVElDQVNUIDE0CisjZGVmaW5lIFJYX0NPUFlfU0laRQkxMDAKKyNkZWZpbmUgTUFYX0NIRUNLX1BBQ0tFVCAweDgwMDAKKyNkZWZpbmUgRE05ODAxX05PSVNFX0ZMT09SIDgKKyNkZWZpbmUgRE05ODAyX05PSVNFX0ZMT09SIDUKKworI2RlZmluZSBETUZFXzEwTUhGICAgICAgMAorI2RlZmluZSBETUZFXzEwME1IRiAgICAgMQorI2RlZmluZSBETUZFXzEwTUZEICAgICAgNAorI2RlZmluZSBETUZFXzEwME1GRCAgICAgNQorI2RlZmluZSBETUZFX0FVVE8gICAgICAgOAorI2RlZmluZSBETUZFXzFNX0hQTkEgICAgMHgxMAorCisjZGVmaW5lIERNRkVfVFhUSF83MgkweDQwMDAwMAkvKiBUWCBUSCA3MiBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF85NgkweDQwNDAwMAkvKiBUWCBUSCA5NiBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF8xMjgJMHgwMDAwCS8qIFRYIFRIIDEyOCBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF8yNTYJMHg0MDAwCS8qIFRYIFRIIDI1NiBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF81MTIJMHg4MDAwCS8qIFRYIFRIIDUxMiBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF8xSwkweEMwMDAJLyogVFggVEggMUsgIGJ5dGUgKi8KKworI2RlZmluZSBETUZFX1RJTUVSX1dVVCAgKGppZmZpZXMgKyBIWiAqIDEpCS8qIHRpbWVyIHdha2V1cCB0aW1lIDogMSBzZWNvbmQgKi8KKyNkZWZpbmUgRE1GRV9UWF9USU1FT1VUICgoMypIWikvMikJLyogdHggcGFja2V0IHRpbWUtb3V0IHRpbWUgMS41IHMiICovCisjZGVmaW5lIERNRkVfVFhfS0lDSyAJKEhaLzIpCS8qIHR4IHBhY2tldCBLaWNrLW91dCB0aW1lIDAuNSBzIiAqLworCisjZGVmaW5lIERNRkVfREJVRyhkYnVnX25vdywgbXNnLCB2YWx1ZSkgaWYgKGRtZmVfZGVidWcgfHwgKGRidWdfbm93KSkgcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICVzICVseFxuIiwgKG1zZyksIChsb25nKSAodmFsdWUpKQorCisjZGVmaW5lIFNIT1dfTUVESUFfVFlQRShtb2RlKSBwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogQ2hhbmdlIFNwZWVkIHRvICVzTWh6ICVzIGR1cGxleFxuIixtb2RlICYgMSA/IjEwMCI6IjEwIiwgbW9kZSAmIDQgPyAiZnVsbCI6ImhhbGYiKTsKKworCisvKiBDUjkgZGVmaW5pdGlvbjogU1JPTS9NSUkgKi8KKyNkZWZpbmUgQ1I5X1NST01fUkVBRCAgIDB4NDgwMAorI2RlZmluZSBDUjlfU1JDUyAgICAgICAgMHgxCisjZGVmaW5lIENSOV9TUkNMSyAgICAgICAweDIKKyNkZWZpbmUgQ1I5X0NSRE9VVCAgICAgIDB4OAorI2RlZmluZSBTUk9NX0RBVEFfMCAgICAgMHgwCisjZGVmaW5lIFNST01fREFUQV8xICAgICAweDQKKyNkZWZpbmUgUEhZX0RBVEFfMSAgICAgIDB4MjAwMDAKKyNkZWZpbmUgUEhZX0RBVEFfMCAgICAgIDB4MDAwMDAKKyNkZWZpbmUgTURDTEtIICAgICAgICAgIDB4MTAwMDAKKworI2RlZmluZSBQSFlfUE9XRVJfRE9XTgkweDgwMAorCisjZGVmaW5lIFNST01fVjQxX0NPREUgICAweDE0CisKKyNkZWZpbmUgU1JPTV9DTEtfV1JJVEUoZGF0YSwgaW9hZGRyKSBvdXRsKGRhdGF8Q1I5X1NST01fUkVBRHxDUjlfU1JDUyxpb2FkZHIpO3VkZWxheSg1KTtvdXRsKGRhdGF8Q1I5X1NST01fUkVBRHxDUjlfU1JDU3xDUjlfU1JDTEssaW9hZGRyKTt1ZGVsYXkoNSk7b3V0bChkYXRhfENSOV9TUk9NX1JFQUR8Q1I5X1NSQ1MsaW9hZGRyKTt1ZGVsYXkoNSk7CisKKyNkZWZpbmUgX19DSEtfSU9fU0laRShwY2lfaWQsIGRldl9yZXYpICggKChwY2lfaWQpPT1QQ0lfRE05MTMyX0lEKSB8fCAoKGRldl9yZXYpID49IDB4MDIwMDAwMzApICkgPyBETTkxMDJBX0lPX1NJWkU6IERNOTEwMl9JT19TSVpFCisjZGVmaW5lIENIS19JT19TSVpFKHBjaV9kZXYsIGRldl9yZXYpIF9fQ0hLX0lPX1NJWkUoKChwY2lfZGV2KS0+ZGV2aWNlIDw8IDE2KSB8IChwY2lfZGV2KS0+dmVuZG9yLCBkZXZfcmV2KQorCisvKiBTdGVuIENoZWNrICovCisjZGVmaW5lIERFVklDRSBuZXRfZGV2aWNlCisKKy8qIFN0cnVjdHVyZS9lbnVtIGRlY2xhcmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0cnVjdCB0eF9kZXNjIHsKKwl1MzIgdGRlczAsIHRkZXMxLCB0ZGVzMiwgdGRlczM7CS8qIERhdGEgZm9yIHRoZSBjYXJkICovCisJdm9pZCAqIHR4X2J1Zl9wdHI7CQkvKiBEYXRhIGZvciB1cyAqLworCXN0cnVjdCB0eF9kZXNjICogbmV4dF90eF9kZXNjOworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsKKworc3RydWN0IHJ4X2Rlc2MgeworCXUzMiByZGVzMCwgcmRlczEsIHJkZXMyLCByZGVzMzsJLyogRGF0YSBmb3IgdGhlIGNhcmQgKi8KKwl2b2lkICogcnhfc2tiX3B0cjsJCS8qIERhdGEgZm9yIHVzICovCisJc3RydWN0IHJ4X2Rlc2MgKiBuZXh0X3J4X2Rlc2M7Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCitzdGF0aWMgc3RydWN0IGRtZmVfcHJpdmF0ZSB7CisJdTMyIGNoaXBfaWQ7CQkvKiBDaGlwIHZlbmRvci9EZXZpY2UgSUQgKi8KKwl1MzIgY2hpcF9yZXZpc2lvbjsJLyogQ2hpcCByZXZpc2lvbiAqLworCXUzMiBjcjBfZGF0YTsKKy8vCXUzMiBjcjVfZGF0YTsKKwl1MzIgY3I2X2RhdGE7CisJdTMyIGNyN19kYXRhOworCXUzMiBjcjE1X2RhdGE7CisKKwl1MTYgSFBOQV9jb21tYW5kOwkvKiBGb3IgSFBOQSByZWdpc3RlciAxNiAqLworCXUxNiBIUE5BX3RpbWVyOwkJLyogRm9yIEhQTkEgcmVtb3RlIGRldmljZSBjaGVjayAqLworCXUxNiBOSUNfY2FwYWJpbGl0eTsJLyogTklDIG1lZGlhIGNhcGFiaWxpdHkgKi8KKwl1MTYgUEhZX3JlZzQ7CQkvKiBTYXZlZCBQaHl4Y2VyIHJlZ2lzdGVyIDQgdmFsdWUgKi8KKworCXU4IEhQTkFfcHJlc2VudDsJLyogMDpub25lLCAxOkRNOTgwMSwgMjpETTk4MDIgKi8KKwl1OCBjaGlwX3R5cGU7CQkvKiBLZWVwIERNOTEwMkEgY2hpcCB0eXBlICovCisJdTggbWVkaWFfbW9kZTsJCS8qIHVzZXIgc3BlY2lmeSBtZWRpYSBtb2RlICovCisJdTggb3BfbW9kZTsJCS8qIHJlYWwgd29yayBtZWRpYSBtb2RlICovCisJdTggcGh5X2FkZHI7CisJdTggZG05MTB4X2Noa19tb2RlOwkvKiBPcGVyYXRpbmcgbW9kZSBjaGVjayAqLworCisJLyogTklDIFNST00gZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgc3JvbVsxMjhdOworCS8qIEV0aGVyYm9vdCBPbmx5ICovCisJdTggY3VyX3R4OworCXU4IGN1cl9yeDsKK30gZGZ4OworCitzdGF0aWMgc3RydWN0IGRtZmVfcHJpdmF0ZSAqZGI7CisKK2VudW0gZG1mZV9vZmZzZXRzIHsKKwlEQ1IwID0gMHgwMCwgRENSMSA9IDB4MDgsIERDUjIgPSAweDEwLCBEQ1IzID0gMHgxOCwgRENSNCA9IDB4MjAsCisJRENSNSA9IDB4MjgsIERDUjYgPSAweDMwLCBEQ1I3ID0gMHgzOCwgRENSOCA9IDB4NDAsIERDUjkgPSAweDQ4LAorCURDUjEwID0gMHg1MCwgRENSMTEgPSAweDU4LCBEQ1IxMiA9IDB4NjAsIERDUjEzID0gMHg2OCwgRENSMTQgPQorCSAgICAweDcwLAorCURDUjE1ID0gMHg3OAorfTsKKworZW51bSBkbWZlX0NSNl9iaXRzIHsKKwlDUjZfUlhTQyA9IDB4MiwgQ1I2X1BCRiA9IDB4OCwgQ1I2X1BNID0gMHg0MCwgQ1I2X1BBTSA9IDB4ODAsCisJQ1I2X0ZETSA9IDB4MjAwLCBDUjZfVFhTQyA9IDB4MjAwMCwgQ1I2X1NUSSA9IDB4MTAwMDAwLAorCUNSNl9TRlQgPSAweDIwMDAwMCwgQ1I2X1JYQSA9IDB4NDAwMDAwMDAsIENSNl9OT19QVVJHRSA9IDB4MjAwMDAwMDAKK307CisKKy8qIEdsb2JhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyBkbWZlX29wZXJhdGlvbnM7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRtZmVfbWVkaWFfbW9kZSA9IERNRkVfQVVUTzsKK3N0YXRpYyB1MzIgZG1mZV9jcjZfdXNlcl9zZXQ7CisKKy8qIEZvciBtb2R1bGUgaW5wdXQgcGFyYW1ldGVyICovCitzdGF0aWMgdTggY2hrbW9kZSA9IDE7CitzdGF0aWMgdTggSFBOQV9tb2RlOwkJLyogRGVmYXVsdDogTG93IFBvd2VyL0hpZ2ggU3BlZWQgKi8KK3N0YXRpYyB1OCBIUE5BX3J4X2NtZDsJCS8qIERlZmF1bHQ6IERpc2FibGUgUnggcmVtb3RlIGNvbW1hbmQgKi8KK3N0YXRpYyB1OCBIUE5BX3R4X2NtZDsJCS8qIERlZmF1bHQ6IERvbid0IGlzc3VlIHJlbW90ZSBjb21tYW5kICovCitzdGF0aWMgdTggSFBOQV9Ob2lzZUZsb29yOwkvKiBEZWZhdWx0OiBIUE5BIE5vaXNlRmxvb3IgKi8KK3N0YXRpYyB1OCBTRl9tb2RlOwkJLyogU3BlY2lhbCBGdW5jdGlvbjogMTpWTEFOLCAyOlJYIEZsb3cgQ29udHJvbAorCQkJCSAgIDQ6IFRYIHBhdXNlIHBhY2tldCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0b3IgUmluZyBhbmQgQnVmZmVyIGRlZmluYXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHsKKwlzdHJ1Y3QgdHhfZGVzYyB0eGRbVFhfREVTQ19DTlRdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCXVuc2lnbmVkIGNoYXIgdHhiW1RYX0JVRl9BTExPQyAqIFRYX0RFU0NfQ05UXQorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCXN0cnVjdCByeF9kZXNjIHJ4ZFtSWF9ERVNDX0NOVF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7CisJdW5zaWduZWQgY2hhciByeGJbUlhfQUxMT0NfU0laRSAqIFJYX0RFU0NfQ05UXQorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworfSBkbWZlX2J1ZnMgX19zaGFyZWQ7CisjZGVmaW5lIHR4ZCBkbWZlX2J1ZnMudHhkCisjZGVmaW5lIHR4YiBkbWZlX2J1ZnMudHhiCisjZGVmaW5lIHJ4ZCBkbWZlX2J1ZnMucnhkCisjZGVmaW5lIHJ4YiBkbWZlX2J1ZnMucnhiCisKKy8qIE5JQyBzcGVjaWZpYyBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUgKi8KK3N0YXRpYyBsb25nIGludCBCQVNFOworCitzdGF0aWMgdTE2IHJlYWRfc3JvbV93b3JkKGxvbmcgaW9hZGRyLCBpbnQgb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGRtZmVfaW5pdF9kbTkxMHgoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIGRtZmVfZGVzY3JpcHRvcl9pbml0KHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgbG9uZyBpb2FkZHIpOworc3RhdGljIHZvaWQgdXBkYXRlX2NyNih1MzIsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2VuZF9maWx0ZXJfZnJhbWUoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIGRtOTEzMl9pZF90YWJsZShzdHJ1Y3QgbmljICpuaWMpOworCitzdGF0aWMgdTE2IHBoeV9yZWFkKHVuc2lnbmVkIGxvbmcsIHU4LCB1OCwgdTMyKTsKK3N0YXRpYyB2b2lkIHBoeV93cml0ZSh1bnNpZ25lZCBsb25nLCB1OCwgdTgsIHUxNiwgdTMyKTsKK3N0YXRpYyB2b2lkIHBoeV93cml0ZV8xYml0KHVuc2lnbmVkIGxvbmcsIHUzMik7CitzdGF0aWMgdTE2IHBoeV9yZWFkXzFiaXQodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBkbWZlX3NldF9waHl4Y2VyKHN0cnVjdCBuaWMgKm5pYyk7CisKK3N0YXRpYyB2b2lkIGRtZmVfcGFyc2Vfc3JvbShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgZG1mZV9wcm9ncmFtX0RNOTgwMShzdHJ1Y3QgbmljICpuaWMsIGludCk7CitzdGF0aWMgdm9pZCBkbWZlX3Byb2dyYW1fRE05ODAyKHN0cnVjdCBuaWMgKm5pYyk7CisKK3N0YXRpYyB2b2lkIGRtZmVfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCS8qIHN5c3RlbSB2YXJpYWJsZSBpbml0ICovCisJZGItPmNyNl9kYXRhID0gQ1I2X0RFRkFVTFQgfCBkbWZlX2NyNl91c2VyX3NldDsKKworCWRiLT5OSUNfY2FwYWJpbGl0eSA9IDB4ZjsJLyogQWxsIGNhcGFiaWxpdHkgKi8KKwlkYi0+UEhZX3JlZzQgPSAweDFlMDsKKworCS8qIENSNiBvcGVyYXRpb24gbW9kZSBkZWNpc2lvbiAqLworCWlmICghY2hrbW9kZSB8fCAoZGItPmNoaXBfaWQgPT0gUENJX0RNOTEzMl9JRCkgfHwKKwkgICAgKGRiLT5jaGlwX3JldmlzaW9uID49IDB4MDIwMDAwMzApKSB7CisJCWRiLT5jcjZfZGF0YSB8PSBETUZFX1RYVEhfMjU2OworCQlkYi0+Y3IwX2RhdGEgPSBDUjBfREVGQVVMVDsKKwkJZGItPmRtOTEweF9jaGtfbW9kZSA9IDQ7CS8qIEVudGVyIHRoZSBub3JtYWwgbW9kZSAqLworCX0gZWxzZSB7CisJCWRiLT5jcjZfZGF0YSB8PSBDUjZfU0ZUOwkvKiBTdG9yZSAmIEZvcndhcmQgbW9kZSAqLworCQlkYi0+Y3IwX2RhdGEgPSAwOworCQlkYi0+ZG05MTB4X2Noa19tb2RlID0gMTsJLyogRW50ZXIgdGhlIGNoZWNrIG1vZGUgKi8KKwl9CisJLyogSW5pdGlsaXplIERNOTEwWCBib2FyZCAqLworCWRtZmVfaW5pdF9kbTkxMHgobmljKTsKKworCXJldHVybjsKK30KKworLyoJSW5pdGlsaXplIERNOTEwWCBib2FyZAorICoJUmVzZXQgRE05MTBYIGJvYXJkCisgKglJbml0aWxpemUgVFgvUnggZGVzY3JpcHRvciBjaGFpbiBzdHJ1Y3R1cmUKKyAqCVNlbmQgdGhlIHNldC11cCBmcmFtZQorICoJRW5hYmxlIFR4L1J4IG1hY2hpbmUKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX2luaXRfZG05MTB4KHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IEJBU0U7CisKKwkvKiBSZXNldCBETTkxMHggTUFDIGNvbnRyb2xsZXIgKi8KKwlvdXRsKERNOTEwWF9SRVNFVCwgaW9hZGRyICsgRENSMCk7CS8qIFJFU0VUIE1BQyAqLworCXVkZWxheSgxMDApOworCW91dGwoZGItPmNyMF9kYXRhLCBpb2FkZHIgKyBEQ1IwKTsKKwl1ZGVsYXkoNSk7CisKKwkvKiBQaHkgYWRkciA6IERNOTEwKEEpMi9ETTkxMzIvOTgwMSwgcGh5IGFkZHJlc3MgPSAxICovCisJZGItPnBoeV9hZGRyID0gMTsKKworCS8qIFBhcnNlciBTUk9NIGFuZCBtZWRpYSBtb2RlICovCisJZG1mZV9wYXJzZV9zcm9tKG5pYyk7CisJZGItPm1lZGlhX21vZGUgPSBkbWZlX21lZGlhX21vZGU7CisKKwkvKiBSRVNFVCBQaHl4Y2VyIENoaXAgYnkgR1BSIHBvcnQgYml0IDcgKi8KKwlvdXRsKDB4MTgwLCBpb2FkZHIgKyBEQ1IxMik7CS8qIExldCBiaXQgNyBvdXRwdXQgcG9ydCAqLworCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MDA5X0lEKSB7CisJCW91dGwoMHg4MCwgaW9hZGRyICsgRENSMTIpOwkvKiBJc3N1ZSBSRVNFVCBzaWduYWwgKi8KKwkJbWRlbGF5KDMwMCk7CS8qIERlbGF5IDMwMCBtcyAqLworCX0KKwlvdXRsKDB4MCwgaW9hZGRyICsgRENSMTIpOwkvKiBDbGVhciBSRVNFVCBzaWduYWwgKi8KKworCS8qIFByb2Nlc3MgUGh5eGNlciBNZWRpYSBNb2RlICovCisJaWYgKCEoZGItPm1lZGlhX21vZGUgJiAweDEwKSkJLyogRm9yY2UgMU0gbW9kZSAqLworCQlkbWZlX3NldF9waHl4Y2VyKG5pYyk7CisKKwkvKiBNZWRpYSBNb2RlIFByb2Nlc3MgKi8KKwlpZiAoIShkYi0+bWVkaWFfbW9kZSAmIERNRkVfQVVUTykpCisJCWRiLT5vcF9tb2RlID0gZGItPm1lZGlhX21vZGU7CS8qIEZvcmNlIE1vZGUgKi8KKworCS8qIEluaXRpbGlhemUgVHJhbnNtaXQvUmVjZWl2ZSBkZWNyaXB0b3IgYW5kIENSMy80ICovCisJZG1mZV9kZXNjcmlwdG9yX2luaXQobmljLCBpb2FkZHIpOworCisJLyogdHggZGVzY3JpcHRvciBzdGFydCBwb2ludGVyICovCisJb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKCZ0eGRbMF0pLCBpb2FkZHIgKyBEQ1I0KTsJLyogVFggREVTQyBhZGRyZXNzICovCisKKwkvKiByeCBkZXNjcmlwdG9yIHN0YXJ0IHBvaW50ZXIgKi8KKwlvdXRsKHZpcnRfdG9fbGUzMmRlc2MoJnJ4ZFswXSksIGlvYWRkciArIERDUjMpOwkvKiBSWCBERVNDIGFkZHJlc3MgKi8KKworCS8qIEluaXQgQ1I2IHRvIHByb2dyYW0gRE05MTB4IG9wZXJhdGlvbiAqLworCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBpb2FkZHIpOworCisJLyogU2VuZCBzZXR1cCBmcmFtZSAqLworCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTMyX0lEKSB7CisJCWRtOTEzMl9pZF90YWJsZShuaWMpOwkvKiBETTkxMzIgKi8KKwl9IGVsc2UgeworCQlzZW5kX2ZpbHRlcl9mcmFtZShuaWMpOwkvKiBETTkxMDIvRE05MTAyQSAqLworCX0KKworCS8qIEluaXQgQ1I3LCBpbnRlcnJ1cHQgYWN0aXZlIGJpdCAqLworCWRiLT5jcjdfZGF0YSA9IENSN19ERUZBVUxUOworCW91dGwoZGItPmNyN19kYXRhLCBpb2FkZHIgKyBEQ1I3KTsKKwkvKiBJbml0IENSMTUsIFR4IGphYmJlciBhbmQgUnggd2F0Y2hkb2cgdGltZXIgKi8KKwlvdXRsKGRiLT5jcjE1X2RhdGEsIGlvYWRkciArIERDUjE1KTsKKwkvKiBFbmFibGUgRE05MTBYIFR4L1J4IGZ1bmN0aW9uICovCisJZGItPmNyNl9kYXRhIHw9IENSNl9SWFNDIHwgQ1I2X1RYU0MgfCAweDQwMDAwOworCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBpb2FkZHIpOworfQorI2lmZGVmIEVERUJVRwordm9pZCBoZXhfZHVtcChjb25zdCBjaGFyICpkYXRhLCBjb25zdCB1bnNpZ25lZCBpbnQgbGVuKTsKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBkbWZlX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisJdTMyIHJkZXMwOworCWludCBlbnRyeSA9IGRiLT5jdXJfcnggJSBSWF9ERVNDX0NOVDsKKwlpbnQgcnhsZW47CisJcmRlczAgPSBsZTMyX3RvX2NwdShyeGRbZW50cnldLnJkZXMwKTsKKwlpZiAocmRlczAgJiAweDgwMDAwMDAwKQorCQlyZXR1cm4gMDsKKworCWlmICghcmV0cmlldmUpCisJCXJldHVybiAxOworCisJaWYgKChyZGVzMCAmIDB4MzAwKSAhPSAweDMwMCkgeworCQkvKiBBIHBhY2tldCB3aXRob3V0IEZpcnN0L0xhc3QgZmxhZyAqLworCQlwcmludGYoInN0cmFuZ2UgUGFja2V0XG4iKTsKKwkJcnhkW2VudHJ5XS5yZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBBIHBhY2tldCB3aXRoIEZpcnN0L0xhc3QgZmxhZyAqLworCQlyeGxlbiA9ICgocmRlczAgPj4gMTYpICYgMHgzZmZmKSAtIDQ7CisJCS8qIGVycm9yIHN1bW1hcnkgYml0IGNoZWNrICovCisJCWlmIChyZGVzMCAmIDB4ODAwMCkgeworCQkJcHJpbnRmKCJFcnJvclxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIShyZGVzMCAmIDB4ODAwMCkgfHwKKwkJICAgICgoZGItPmNyNl9kYXRhICYgQ1I2X1BNKSAmJiAocnhsZW4gPiA2KSkpIHsKKwkJCWlmIChkYi0+ZG05MTB4X2Noa19tb2RlICYgMSkKKwkJCQlwcmludGYoIlNpbGx5IGNoZWNrIG1vZGVcbiIpOworCisJCQluaWMtPnBhY2tldGxlbiA9IHJ4bGVuOworCQkJbWVtY3B5KG5pYy0+cGFja2V0LCByeGIgKyAoZW50cnkgKiBSWF9BTExPQ19TSVpFKSwKKwkJCSAgICAgICBuaWMtPnBhY2tldGxlbik7CisJCX0KKwl9CisJcnhkW2VudHJ5XS5yZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCWRiLT5jdXJfcngrKzsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZG1mZV9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworCXN3aXRjaCAoIGFjdGlvbiApIHsKKwkJY2FzZSBESVNBQkxFIDoKKwkJCWJyZWFrOworCQljYXNlIEVOQUJMRSA6CisJCQlicmVhazsKKwkJY2FzZSBGT1JDRSA6CisJCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkbWZlX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgCisJY29uc3QgY2hhciAqZGVzdCwJLyogRGVzdGluYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgdHlwZSwJLyogVHlwZSAqLworCXVuc2lnbmVkIGludCBzaXplLAkvKiBzaXplICovCisJY29uc3QgY2hhciAqcGFja2V0KQkvKiBQYWNrZXQgKi8KK3sJCisJdTE2IG5zdHlwZTsKKwl1OCAqcHR4YjsKKworCXB0eGIgPSAmdHhiW2RiLT5jdXJfdHhdOworCisJLyogU3RvcCBUeCAqLworCW91dGwoMCwgQkFTRSArIERDUjcpOworCW1lbWNweShwdHhiLCBkZXN0LCBFVEhfQUxFTik7CisJbWVtY3B5KHB0eGIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKwluc3R5cGUgPSBodG9ucygodTE2KSB0eXBlKTsKKwltZW1jcHkocHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopICYgbnN0eXBlLCAyKTsKKwltZW1jcHkocHR4YiArIEVUSF9ITEVOLCBwYWNrZXQsIHNpemUpOworCisJc2l6ZSArPSBFVEhfSExFTjsKKwl3aGlsZSAoc2l6ZSA8IEVUSF9aTEVOKQorCQlwdHhiW3NpemUrK10gPSAnXDAnOworCisJLyogc2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKwl0eGRbZGItPmN1cl90eF0udGRlczEgPSBjcHVfdG9fbGUzMigweGUxMDAwMDAwIHwgc2l6ZSk7CisJdHhkW2RiLT5jdXJfdHhdLnRkZXMwID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CS8qIGdpdmUgb3duZXJzaGlwIHRvIGRldmljZSAqLworCisJLyogaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZCAqLworCW91dGwoMHgxLCBCQVNFICsgRENSMSk7CisJb3V0bChkYi0+Y3I3X2RhdGEsIEJBU0UgKyBEQ1I3KTsKKworCS8qIFBvaW50IHRvIG5leHQgVFggZGVzY3JpcHRvciAqLworCWRiLT5jdXJfdHgrKzsKKwlkYi0+Y3VyX3R4ID0gZGItPmN1cl90eCAlIFRYX0RFU0NfQ05UOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGRtZmVfZGlzYWJsZSAoIHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCApIHsKKwkvKiBSZXNldCAmIHN0b3AgRE05MTBYIGJvYXJkICovCisJb3V0bChETTkxMFhfUkVTRVQsIEJBU0UgKyBEQ1IwKTsKKwl1ZGVsYXkoNSk7CisJcGh5X3dyaXRlKEJBU0UsIGRiLT5waHlfYWRkciwgMCwgMHg4MDAwLCBkYi0+Y2hpcF9pZCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBib2FyZF9mb3VuZCAxCisjZGVmaW5lIHZhbGlkX2xpbmsgMAorc3RhdGljIGludCBkbWZlX3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCisJdWludDMyX3QgZGV2X3JldiwgcGNpX3BtcjsKKwlpbnQgaTsKKworCWlmIChwY2ktPmlvYWRkciA9PSAwKQorCQlyZXR1cm4gMDsKKworCUJBU0UgPSBwY2ktPmlvYWRkcjsKKwlwcmludGYoImRtZmUuYzogRm91bmQgJXMgVmVuZG9yPTB4JWhYIERldmljZT0weCVoWFxuIiwKKwkgICAgICAgcGNpLT5kcml2ZXJfbmFtZSwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2aWNlKTsKKworCS8qIFJlYWQgQ2hpcCByZXZpc2lvbiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2ksIFBDSV9SRVZJU0lPTl9JRCwgJmRldl9yZXYpOworCWRwcmludGYoKCJSZXZpc2lvbiAlbFhcbiIsIGRldl9yZXYpKTsKKworCS8qIHBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLworCWRiID0gJmRmeDsKKworCWRiLT5jaGlwX2lkID0gKCh1MzIpIHBjaS0+ZGV2aWNlIDw8IDE2KSB8IHBjaS0+dmVuZG9yOworCUJBU0UgPSBwY2lfYmFyX3N0YXJ0KHBjaSwgUENJX0JBU0VfQUREUkVTU18wKTsKKwlkYi0+Y2hpcF9yZXZpc2lvbiA9IGRldl9yZXY7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpLCAweDUwLCAmcGNpX3Btcik7CisJcGNpX3BtciAmPSAweDcwMDAwOworCWlmICgocGNpX3BtciA9PSAweDEwMDAwKSAmJiAoZGV2X3JldiA9PSAweDAyMDAwMDMxKSkKKwkJZGItPmNoaXBfdHlwZSA9IDE7CS8qIERNOTEwMkEgRTMgKi8KKwllbHNlCisJCWRiLT5jaGlwX3R5cGUgPSAwOworCisJZHByaW50ZigoIkNoaXAgdHlwZSA6ICVkXG4iLCBkYi0+Y2hpcF90eXBlKSk7CisKKwkvKiByZWFkIDY0IHdvcmQgc3JvbSBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisJCSgodTE2ICopIGRiLT5zcm9tKVtpXSA9IGNwdV90b19sZTE2KHJlYWRfc3JvbV93b3JkKEJBU0UsIGkpKTsKKworCS8qIFNldCBOb2RlIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQluaWMtPm5vZGVfYWRkcltpXSA9IGRiLT5zcm9tWzIwICsgaV07CisKKwkvKiBQcmludCBvdXQgc29tZSBoYXJkd2FyZSBpbmZvICovCisJREJHICggIiVzOiAlcyBhdCBpb2FkZHIgJTQuNGx4XG4iLCBwY2ktPmRyaXZlcl9uYW1lLCBldGhfbnRvYSAoIG5pYy0+bm9kZV9hZGRyICksIEJBU0UgKTsKKworCS8qIFNldCB0aGUgY2FyZCBhcyBQQ0kgQnVzIE1hc3RlciAqLworCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CisKKwlkbWZlX3Jlc2V0KG5pYyk7CisKKwluaWMtPmlycW5vICA9IDA7CisJbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkcjsKKworCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCW5pYy0+bmljX29wCT0gJmRtZmVfb3BlcmF0aW9uczsKKworCXJldHVybiAxOworfQorCisvKgorICoJSW5pdGlhbGl6ZSB0cmFuc21pdC9SZWNlaXZlIGRlc2NyaXB0b3IKKyAqCVVzaW5nIENoYWluIHN0cnVjdHVyZSwgYW5kIGFsbG9jYXRlIFR4L1J4IGJ1ZmZlcgorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfZGVzY3JpcHRvcl9pbml0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJaW50IGk7CisJZGItPmN1cl90eCA9IDA7CisJZGItPmN1cl9yeCA9IDA7CisKKwkvKiB0eCBkZXNjcmlwdG9yIHN0YXJ0IHBvaW50ZXIgKi8KKwlvdXRsKHZpcnRfdG9fbGUzMmRlc2MoJnR4ZFswXSksIGlvYWRkciArIERDUjQpOwkvKiBUWCBERVNDIGFkZHJlc3MgKi8KKworCS8qIHJ4IGRlc2NyaXB0b3Igc3RhcnQgcG9pbnRlciAqLworCW91dGwodmlydF90b19sZTMyZGVzYygmcnhkWzBdKSwgaW9hZGRyICsgRENSMyk7CS8qIFJYIERFU0MgYWRkcmVzcyAqLworCisJLyogSW5pdCBUcmFuc21pdCBjaGFpbiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9ERVNDX0NOVDsgaSsrKSB7CisJCXR4ZFtpXS50eF9idWZfcHRyID0gJnR4YltpXTsKKwkJdHhkW2ldLnRkZXMwID0gY3B1X3RvX2xlMzIoMCk7CisJCXR4ZFtpXS50ZGVzMSA9IGNwdV90b19sZTMyKDB4ODEwMDAwMDApOwkvKiBJQywgY2hhaW4gKi8KKwkJdHhkW2ldLnRkZXMyID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoJnR4YltpXSkpOworCQl0eGRbaV0udGRlczMgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygmdHhkW2kgKyAxXSkpOworCQl0eGRbaV0ubmV4dF90eF9kZXNjID0gJnR4ZFtpICsgMV07CisJfQorCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcgKi8KKwl0eGRbaSAtIDFdLnRkZXMzID0gdmlydF90b19sZTMyZGVzYygmdHhkWzBdKTsKKwl0eGRbaSAtIDFdLm5leHRfdHhfZGVzYyA9ICZ0eGRbMF07CisKKwkvKiByZWNlaXZlIGRlc2NyaXB0b3IgY2hhaW4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfREVTQ19DTlQ7IGkrKykgeworCQlyeGRbaV0ucnhfc2tiX3B0ciA9ICZyeGJbaSAqIFJYX0FMTE9DX1NJWkVdOworCQlyeGRbaV0ucmRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKKwkJcnhkW2ldLnJkZXMxID0gY3B1X3RvX2xlMzIoMHgwMTAwMDYwMCk7CisJCXJ4ZFtpXS5yZGVzMiA9CisJCSAgICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygmcnhiW2kgKiBSWF9BTExPQ19TSVpFXSkpOworCQlyeGRbaV0ucmRlczMgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygmcnhkW2kgKyAxXSkpOworCQlyeGRbaV0ubmV4dF9yeF9kZXNjID0gJnJ4ZFtpICsgMV07CisJfQorCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcgKi8KKwlyeGRbaSAtIDFdLnJkZXMzID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoJnJ4ZFswXSkpOworCXJ4ZFtpIC0gMV0ubmV4dF9yeF9kZXNjID0gJnJ4ZFswXTsKKworfQorCisvKgorICoJVXBkYXRlIENSNiB2YWx1ZQorICoJRmlyc3RseSBzdG9wIERNOTEwWCAsIHRoZW4gd3JpdHRlbiB2YWx1ZSBhbmQgc3RhcnQKKyAqLworCitzdGF0aWMgdm9pZCB1cGRhdGVfY3I2KHUzMiBjcjZfZGF0YSwgdW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJdTMyIGNyNl90bXA7CisKKwljcjZfdG1wID0gY3I2X2RhdGEgJiB+MHgyMDAyOwkvKiBzdG9wIFR4L1J4ICovCisJb3V0bChjcjZfdG1wLCBpb2FkZHIgKyBEQ1I2KTsKKwl1ZGVsYXkoNSk7CisJb3V0bChjcjZfZGF0YSwgaW9hZGRyICsgRENSNik7CisJdWRlbGF5KDUpOworfQorCisKKy8qCisgKglTZW5kIGEgc2V0dXAgZnJhbWUgZm9yIERNOTEzMgorICoJVGhpcyBzZXR1cCBmcmFtZSBpbml0aWxpemUgRE05MTBYIGFkZHJlcyBmaWx0ZXIgbW9kZQorKi8KKworc3RhdGljIHZvaWQgZG05MTMyX2lkX3RhYmxlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKyNpZmRlZiBMSU5VWAorCXUxNiAqYWRkcnB0cjsKKwl1OCBkbWlfYWRkcls4XTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IEJBU0UgKyAweGMwOwkvKiBJRCBUYWJsZSAqLworCXUzMiBoYXNoX3ZhbDsKKwl1MTYgaSwgaGFzaF90YWJsZVs0XTsKKyNlbmRpZgorCWRwcmludGYoKCJkbTkxMzJfaWRfdGFibGVcbiIpKTsKKworCXByaW50ZigiRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgYnJva2VuLiAgSWYgeW91IGhhdmUgdGhpcyBjYXJkIGNvbnRhY3QgIgorCQkiVGltb3RoeSBMZWdnZSBhdCB0aGUgZXRoZXJib290LXVzZXIgbGlzdFxuIik7CisKKyNpZmRlZiBMSU5VWAorCS8vRE1GRV9EQlVHKDAsICJkbTkxMzJfaWRfdGFibGUoKSIsIDApOworCisJLyogTm9kZSBhZGRyZXNzICovCisJYWRkcnB0ciA9ICh1MTYgKikgbmljLT5ub2RlX2FkZHI7CisJb3V0dyhhZGRycHRyWzBdLCBpb2FkZHIpOworCWlvYWRkciArPSA0OworCW91dHcoYWRkcnB0clsxXSwgaW9hZGRyKTsKKwlpb2FkZHIgKz0gNDsKKwlvdXR3KGFkZHJwdHJbMl0sIGlvYWRkcik7CisJaW9hZGRyICs9IDQ7CisKKwkvKiBDbGVhciBIYXNoIFRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJaGFzaF90YWJsZVtpXSA9IDB4MDsKKworCS8qIGJyb2FkY2FzdCBhZGRyZXNzICovCisJaGFzaF90YWJsZVszXSA9IDB4ODAwMDsKKworCS8qIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyBpbiBIYXNoIFRhYmxlIDogNjQgYml0cyAqLworCWZvciAobWNwdHIgPSBtY19saXN0LCBpID0gMDsgaSA8IG1jX2NudDsgaSsrLCBtY3B0ciA9IG1jcHRyLT5uZXh0KSB7CisJCWhhc2hfdmFsID0gY2FsX0NSQygoY2hhciAqKSBtY3B0ci0+ZG1pX2FkZHIsIDYsIDApICYgMHgzZjsKKwkJaGFzaF90YWJsZVtoYXNoX3ZhbCAvIDE2XSB8PSAodTE2KSAxIDw8IChoYXNoX3ZhbCAlIDE2KTsKKwl9CisKKwkvKiBXcml0ZSB0aGUgaGFzaCB0YWJsZSB0byBNQUMgTUQgdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBpb2FkZHIgKz0gNCkKKwkJb3V0dyhoYXNoX3RhYmxlW2ldLCBpb2FkZHIpOworI2VuZGlmCit9CisKKworLyoKKyAqCVNlbmQgYSBzZXR1cCBmcmFtZSBmb3IgRE05MTAyL0RNOTEwMkEKKyAqCVRoaXMgc2V0dXAgZnJhbWUgaW5pdGlsaXplIERNOTEwWCBhZGRyZXMgZmlsdGVyIG1vZGUKKyAqLworCitzdGF0aWMgdm9pZCBzZW5kX2ZpbHRlcl9mcmFtZShzdHJ1Y3QgbmljICpuaWMpCit7CisKKwl1OCAqcHR4YjsKKwlpbnQgaTsKKworCWRwcmludGYoKCJzZW5kX2ZpbHRlcl9mcmFtZVxuIikpOworCS8qIHBvaW50IHRvIHRoZSBjdXJyZW50IHR4YiBpbmNhc2UgbXVsdGlwbGUgdHhfcmluZ3MgYXJlIHVzZWQgKi8KKwlwdHhiID0gJnR4YltkYi0+Y3VyX3R4XTsKKworCS8qIGNvbnN0cnVjdCBwZXJmZWN0IGZpbHRlciBmcmFtZSB3aXRoIG1hYyBhZGRyZXNzIGFzIGZpcnN0IG1hdGNoCisJICAgYW5kIGJyb2FkY2FzdCBhZGRyZXNzIGZvciBhbGwgb3RoZXJzICovCisJZm9yIChpID0gMDsgaSA8IDE5MjsgaSsrKQorCQlwdHhiW2ldID0gMHhGRjsKKwlwdHhiWzBdID0gbmljLT5ub2RlX2FkZHJbMF07CisJcHR4YlsxXSA9IG5pYy0+bm9kZV9hZGRyWzFdOworCXB0eGJbNF0gPSBuaWMtPm5vZGVfYWRkclsyXTsKKwlwdHhiWzVdID0gbmljLT5ub2RlX2FkZHJbM107CisJcHR4Yls4XSA9IG5pYy0+bm9kZV9hZGRyWzRdOworCXB0eGJbOV0gPSBuaWMtPm5vZGVfYWRkcls1XTsKKworCS8qIHByZXBhcmUgdGhlIHNldHVwIGZyYW1lICovCisJdHhkW2RiLT5jdXJfdHhdLnRkZXMxID0gY3B1X3RvX2xlMzIoMHg4OTAwMDBjMCk7CisJdHhkW2RiLT5jdXJfdHhdLnRkZXMwID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEgfCAweDIwMDAsIEJBU0UpOworCW91dGwoMHgxLCBCQVNFICsgRENSMSk7CS8qIElzc3VlIFR4IHBvbGxpbmcgKi8KKwl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgQkFTRSk7CisJZGItPmN1cl90eCsrOworfQorCisvKgorICoJUmVhZCBvbmUgd29yZCBkYXRhIGZyb20gdGhlIHNlcmlhbCBST00KKyAqLworCitzdGF0aWMgdTE2IHJlYWRfc3JvbV93b3JkKGxvbmcgaW9hZGRyLCBpbnQgb2Zmc2V0KQoreworCWludCBpOworCXUxNiBzcm9tX2RhdGEgPSAwOworCWxvbmcgY3I5X2lvYWRkciA9IGlvYWRkciArIERDUjk7CisKKwlvdXRsKENSOV9TUk9NX1JFQUQsIGNyOV9pb2FkZHIpOworCW91dGwoQ1I5X1NST01fUkVBRCB8IENSOV9TUkNTLCBjcjlfaW9hZGRyKTsKKworCS8qIFNlbmQgdGhlIFJlYWQgQ29tbWFuZCAxMTBiICovCisJU1JPTV9DTEtfV1JJVEUoU1JPTV9EQVRBXzEsIGNyOV9pb2FkZHIpOworCVNST01fQ0xLX1dSSVRFKFNST01fREFUQV8xLCBjcjlfaW9hZGRyKTsKKwlTUk9NX0NMS19XUklURShTUk9NX0RBVEFfMCwgY3I5X2lvYWRkcik7CisKKwkvKiBTZW5kIHRoZSBvZmZzZXQgKi8KKwlmb3IgKGkgPSA1OyBpID49IDA7IGktLSkgeworCQlzcm9tX2RhdGEgPQorCQkgICAgKG9mZnNldCAmICgxIDw8IGkpKSA/IFNST01fREFUQV8xIDogU1JPTV9EQVRBXzA7CisJCVNST01fQ0xLX1dSSVRFKHNyb21fZGF0YSwgY3I5X2lvYWRkcik7CisJfQorCisJb3V0bChDUjlfU1JPTV9SRUFEIHwgQ1I5X1NSQ1MsIGNyOV9pb2FkZHIpOworCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJb3V0bChDUjlfU1JPTV9SRUFEIHwgQ1I5X1NSQ1MgfCBDUjlfU1JDTEssIGNyOV9pb2FkZHIpOworCQl1ZGVsYXkoNSk7CisJCXNyb21fZGF0YSA9CisJCSAgICAoc3JvbV9kYXRhIDw8IDEpIHwgKChpbmwoY3I5X2lvYWRkcikgJiBDUjlfQ1JET1VUKSA/IDEKKwkJCQkJOiAwKTsKKwkJb3V0bChDUjlfU1JPTV9SRUFEIHwgQ1I5X1NSQ1MsIGNyOV9pb2FkZHIpOworCQl1ZGVsYXkoNSk7CisJfQorCisJb3V0bChDUjlfU1JPTV9SRUFELCBjcjlfaW9hZGRyKTsKKwlyZXR1cm4gc3JvbV9kYXRhOworfQorCisKKy8qCisgKglBdXRvIHNlbnNlIHRoZSBtZWRpYSBtb2RlCisgKi8KKworI2lmIDAgLyogbm90IHVzZWQgKi8KK3N0YXRpYyB1OCBkbWZlX3NlbnNlX3NwZWVkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwl1OCBFcnJGbGFnID0gMDsKKwl1MTYgcGh5X21vZGU7CisKKwkvKiBDUjYgYml0MTg9MCwgc2VsZWN0IDEwLzEwME0gKi8KKwl1cGRhdGVfY3I2KChkYi0+Y3I2X2RhdGEgJiB+MHg0MDAwMCksIEJBU0UpOworCisJcGh5X21vZGUgPSBwaHlfcmVhZChCQVNFLCBkYi0+cGh5X2FkZHIsIDEsIGRiLT5jaGlwX2lkKTsKKwlwaHlfbW9kZSA9IHBoeV9yZWFkKEJBU0UsIGRiLT5waHlfYWRkciwgMSwgZGItPmNoaXBfaWQpOworCisJaWYgKChwaHlfbW9kZSAmIDB4MjQpID09IDB4MjQpIHsKKwkJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpCS8qIERNOTEzMiAqLworCQkJcGh5X21vZGUgPQorCQkJICAgIHBoeV9yZWFkKEJBU0UsIGRiLT5waHlfYWRkciwgNywKKwkJCQkgICAgIGRiLT5jaGlwX2lkKSAmIDB4ZjAwMDsKKwkJZWxzZQkJLyogRE05MTAyL0RNOTEwMkEgKi8KKwkJCXBoeV9tb2RlID0KKwkJCSAgICBwaHlfcmVhZChCQVNFLCBkYi0+cGh5X2FkZHIsIDE3LAorCQkJCSAgICAgZGItPmNoaXBfaWQpICYgMHhmMDAwOworCQkvKiBwcmludGsoRFJWX05BTUUgIjogUGh5X21vZGUgJXggIixwaHlfbW9kZSk7ICovCisJCXN3aXRjaCAocGh5X21vZGUpIHsKKwkJY2FzZSAweDEwMDA6CisJCQlkYi0+b3BfbW9kZSA9IERNRkVfMTBNSEY7CisJCQlicmVhazsKKwkJY2FzZSAweDIwMDA6CisJCQlkYi0+b3BfbW9kZSA9IERNRkVfMTBNRkQ7CisJCQlicmVhazsKKwkJY2FzZSAweDQwMDA6CisJCQlkYi0+b3BfbW9kZSA9IERNRkVfMTAwTUhGOworCQkJYnJlYWs7CisJCWNhc2UgMHg4MDAwOgorCQkJZGItPm9wX21vZGUgPSBETUZFXzEwME1GRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGItPm9wX21vZGUgPSBETUZFXzEwTUhGOworCQkJRXJyRmxhZyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWRiLT5vcF9tb2RlID0gRE1GRV8xME1IRjsKKwkJLy9ETUZFX0RCVUcoMCwgIkxpbmsgRmFpbGVkIDoiLCBwaHlfbW9kZSk7CisJCUVyckZsYWcgPSAxOworCX0KKworCXJldHVybiBFcnJGbGFnOworfQorI2VuZGlmCisKKy8qCisgKglTZXQgMTAvMTAwIHBoeXhjZXIgY2FwYWJpbGl0eQorICoJQVVUTyBtb2RlIDogcGh5eGNlciByZWdpc3RlcjQgaXMgTklDIGNhcGFiaWxpdHkKKyAqCUZvcmNlIG1vZGU6IHBoeXhjZXIgcmVnaXN0ZXI0IGlzIHRoZSBmb3JjZSBtZWRpYQorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfc2V0X3BoeXhjZXIoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCXUxNiBwaHlfcmVnOworCisJLyogU2VsZWN0IDEwLzEwME0gcGh5eGNlciAqLworCWRiLT5jcjZfZGF0YSAmPSB+MHg0MDAwMDsKKwl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgQkFTRSk7CisKKwkvKiBETTkwMDkgQ2hpcDogUGh5eGNlciByZWcxOCBiaXQxMj0wICovCisJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkwMDlfSUQpIHsKKwkJcGh5X3JlZyA9CisJCSAgICBwaHlfcmVhZChCQVNFLCBkYi0+cGh5X2FkZHIsIDE4LAorCQkJICAgICBkYi0+Y2hpcF9pZCkgJiB+MHgxMDAwOworCQlwaHlfd3JpdGUoQkFTRSwgZGItPnBoeV9hZGRyLCAxOCwgcGh5X3JlZywgZGItPmNoaXBfaWQpOworCX0KKworCS8qIFBoeXhjZXIgY2FwYWJpbGl0eSBzZXR0aW5nICovCisJcGh5X3JlZyA9IHBoeV9yZWFkKEJBU0UsIGRiLT5waHlfYWRkciwgNCwgZGItPmNoaXBfaWQpICYgfjB4MDFlMDsKKworCWlmIChkYi0+bWVkaWFfbW9kZSAmIERNRkVfQVVUTykgeworCQkvKiBBVVRPIE1vZGUgKi8KKwkJcGh5X3JlZyB8PSBkYi0+UEhZX3JlZzQ7CisJfSBlbHNlIHsKKwkJLyogRm9yY2UgTW9kZSAqLworCQlzd2l0Y2ggKGRiLT5tZWRpYV9tb2RlKSB7CisJCWNhc2UgRE1GRV8xME1IRjoKKwkJCXBoeV9yZWcgfD0gMHgyMDsKKwkJCWJyZWFrOworCQljYXNlIERNRkVfMTBNRkQ6CisJCQlwaHlfcmVnIHw9IDB4NDA7CisJCQlicmVhazsKKwkJY2FzZSBETUZFXzEwME1IRjoKKwkJCXBoeV9yZWcgfD0gMHg4MDsKKwkJCWJyZWFrOworCQljYXNlIERNRkVfMTAwTUZEOgorCQkJcGh5X3JlZyB8PSAweDEwMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MDA5X0lEKQorCQkJcGh5X3JlZyAmPSAweDYxOworCX0KKworCS8qIFdyaXRlIG5ldyBjYXBhYmlsaXR5IHRvIFBoeXhjZXIgUmVnNCAqLworCWlmICghKHBoeV9yZWcgJiAweDAxZTApKSB7CisJCXBoeV9yZWcgfD0gZGItPlBIWV9yZWc0OworCQlkYi0+bWVkaWFfbW9kZSB8PSBETUZFX0FVVE87CisJfQorCXBoeV93cml0ZShCQVNFLCBkYi0+cGh5X2FkZHIsIDQsIHBoeV9yZWcsIGRiLT5jaGlwX2lkKTsKKworCS8qIFJlc3RhcnQgQXV0by1OZWdvdGlhdGlvbiAqLworCWlmIChkYi0+Y2hpcF90eXBlICYmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTAyX0lEKSkKKwkJcGh5X3dyaXRlKEJBU0UsIGRiLT5waHlfYWRkciwgMCwgMHgxODAwLCBkYi0+Y2hpcF9pZCk7CisJaWYgKCFkYi0+Y2hpcF90eXBlKQorCQlwaHlfd3JpdGUoQkFTRSwgZGItPnBoeV9hZGRyLCAwLCAweDEyMDAsIGRiLT5jaGlwX2lkKTsKK30KKworCisvKgorICoJUHJvY2VzcyBvcC1tb2RlCisgKglBVVRPIG1vZGUgOiBQSFkgY29udHJvbGxlciBpbiBBdXRvLW5lZ290aWF0aW9uIE1vZGUKKyAqCUZvcmNlIG1vZGU6IFBIWSBjb250cm9sbGVyIGluIGZvcmNlIG1vZGUgd2l0aCBIVUIKKyAqCQkJTi13YXkgZm9yY2UgY2FwYWJpbGl0eSB3aXRoIFNXSVRDSAorICovCisKKyNpZiAwIC8qIG5vdCB1c2VkICovCitzdGF0aWMgdm9pZCBkbWZlX3Byb2Nlc3NfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJdTE2IHBoeV9yZWc7CisKKwkvKiBGdWxsIER1cGxleCBNb2RlIENoZWNrICovCisJaWYgKGRiLT5vcF9tb2RlICYgMHg0KQorCQlkYi0+Y3I2X2RhdGEgfD0gQ1I2X0ZETTsJLyogU2V0IEZ1bGwgRHVwbGV4IEJpdCAqLworCWVsc2UKKwkJZGItPmNyNl9kYXRhICY9IH5DUjZfRkRNOwkvKiBDbGVhciBGdWxsIER1cGxleCBCaXQgKi8KKworCS8qIFRyYW5zY2l2ZXIgU2VsZWN0aW9uICovCisJaWYgKGRiLT5vcF9tb2RlICYgMHgxMCkJLyogMU0gSG9tZVBOQSAqLworCQlkYi0+Y3I2X2RhdGEgfD0gMHg0MDAwMDsJLyogRXh0ZXJuYWwgTUlJIHNlbGVjdCAqLworCWVsc2UKKwkJZGItPmNyNl9kYXRhICY9IH4weDQwMDAwOwkvKiBJbnRlcm5hbCAxMC8xMDAgdHJhbnNjaXZlciAqLworCisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIEJBU0UpOworCisJLyogMTAvMTAwTSBwaHl4Y2VyIGZvcmNlIG1vZGUgbmVlZCAqLworCWlmICghKGRiLT5tZWRpYV9tb2RlICYgMHgxOCkpIHsKKwkJLyogRm9yZWNlIE1vZGUgKi8KKwkJcGh5X3JlZyA9IHBoeV9yZWFkKEJBU0UsIGRiLT5waHlfYWRkciwgNiwgZGItPmNoaXBfaWQpOworCQlpZiAoIShwaHlfcmVnICYgMHgxKSkgeworCQkJLyogcGFydGVyIHdpdGhvdXQgTi1XYXkgY2FwYWJpbGl0eSAqLworCQkJcGh5X3JlZyA9IDB4MDsKKwkJCXN3aXRjaCAoZGItPm9wX21vZGUpIHsKKwkJCWNhc2UgRE1GRV8xME1IRjoKKwkJCQlwaHlfcmVnID0gMHgwOworCQkJCWJyZWFrOworCQkJY2FzZSBETUZFXzEwTUZEOgorCQkJCXBoeV9yZWcgPSAweDEwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRE1GRV8xMDBNSEY6CisJCQkJcGh5X3JlZyA9IDB4MjAwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRE1GRV8xMDBNRkQ6CisJCQkJcGh5X3JlZyA9IDB4MjEwMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBoeV93cml0ZShCQVNFLCBkYi0+cGh5X2FkZHIsIDAsIHBoeV9yZWcsCisJCQkJICBkYi0+Y2hpcF9pZCk7CisJCQlpZiAoZGItPmNoaXBfdHlwZQorCQkJICAgICYmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTAyX0lEKSkKKwkJCQltZGVsYXkoMjApOworCQkJcGh5X3dyaXRlKEJBU0UsIGRiLT5waHlfYWRkciwgMCwgcGh5X3JlZywKKwkJCQkgIGRiLT5jaGlwX2lkKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisvKgorICoJV3JpdGUgYSB3b3JkIHRvIFBoeSByZWdpc3RlcgorICovCisKK3N0YXRpYyB2b2lkIHBoeV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdTggcGh5X2FkZHIsIHU4IG9mZnNldCwKKwkJICAgICAgdTE2IHBoeV9kYXRhLCB1MzIgY2hpcF9pZCkKK3sKKwl1MTYgaTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKworCWlmIChjaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpIHsKKwkJaW9hZGRyID0gaW9iYXNlICsgMHg4MCArIG9mZnNldCAqIDQ7CisJCW91dHcocGh5X2RhdGEsIGlvYWRkcik7CisJfSBlbHNlIHsKKwkJLyogRE05MTAyL0RNOTEwMkEgQ2hpcCAqLworCQlpb2FkZHIgPSBpb2Jhc2UgKyBEQ1I5OworCisJCS8qIFNlbmQgMzMgc3luY2hyb25pemF0aW9uIGNsb2NrIHRvIFBoeSBjb250cm9sbGVyICovCisJCWZvciAoaSA9IDA7IGkgPCAzNTsgaSsrKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKworCQkvKiBTZW5kIHN0YXJ0IGNvbW1hbmQoMDEpIHRvIFBoeSAqLworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzApOworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEpOworCisJCS8qIFNlbmQgd3JpdGUgY29tbWFuZCgwMSkgdG8gUGh5ICovCisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMCk7CisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSk7CisKKwkJLyogU2VuZCBQaHkgYWRkcmVzICovCisJCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLAorCQkJCSAgICAgICBwaHlfYWRkciAmIGkgPyBQSFlfREFUQV8xIDoKKwkJCQkgICAgICAgUEhZX0RBVEFfMCk7CisKKwkJLyogU2VuZCByZWdpc3RlciBhZGRyZXMgKi8KKwkJZm9yIChpID0gMHgxMDsgaSA+IDA7IGkgPSBpID4+IDEpCisJCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsCisJCQkJICAgICAgIG9mZnNldCAmIGkgPyBQSFlfREFUQV8xIDoKKwkJCQkgICAgICAgUEhZX0RBVEFfMCk7CisKKwkJLyogd3JpdHRlbiB0cmFzbml0aW9uICovCisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSk7CisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMCk7CisKKwkJLyogV3JpdGUgYSB3b3JkIGRhdGEgdG8gUEhZIGNvbnRyb2xsZXIgKi8KKwkJZm9yIChpID0gMHg4MDAwOyBpID4gMDsgaSA+Pj0gMSkKKwkJCXBoeV93cml0ZV8xYml0KGlvYWRkciwKKwkJCQkgICAgICAgcGh5X2RhdGEgJiBpID8gUEhZX0RBVEFfMSA6CisJCQkJICAgICAgIFBIWV9EQVRBXzApOworCX0KK30KKworCisvKgorICoJUmVhZCBhIHdvcmQgZGF0YSBmcm9tIHBoeSByZWdpc3RlcgorICovCisKK3N0YXRpYyB1MTYgcGh5X3JlYWQodW5zaWduZWQgbG9uZyBpb2Jhc2UsIHU4IHBoeV9hZGRyLCB1OCBvZmZzZXQsCisJCSAgICB1MzIgY2hpcF9pZCkKK3sKKwlpbnQgaTsKKwl1MTYgcGh5X2RhdGE7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisKKwlpZiAoY2hpcF9pZCA9PSBQQ0lfRE05MTMyX0lEKSB7CisJCS8qIERNOTEzMiBDaGlwICovCisJCWlvYWRkciA9IGlvYmFzZSArIDB4ODAgKyBvZmZzZXQgKiA0OworCQlwaHlfZGF0YSA9IGludyhpb2FkZHIpOworCX0gZWxzZSB7CisJCS8qIERNOTEwMi9ETTkxMDJBIENoaXAgKi8KKwkJaW9hZGRyID0gaW9iYXNlICsgRENSOTsKKworCQkvKiBTZW5kIDMzIHN5bmNocm9uaXphdGlvbiBjbG9jayB0byBQaHkgY29udHJvbGxlciAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzU7IGkrKykKKwkJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSk7CisKKwkJLyogU2VuZCBzdGFydCBjb21tYW5kKDAxKSB0byBQaHkgKi8KKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8wKTsKKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKworCQkvKiBTZW5kIHJlYWQgY29tbWFuZCgxMCkgdG8gUGh5ICovCisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSk7CisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMCk7CisKKwkJLyogU2VuZCBQaHkgYWRkcmVzICovCisJCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLAorCQkJCSAgICAgICBwaHlfYWRkciAmIGkgPyBQSFlfREFUQV8xIDoKKwkJCQkgICAgICAgUEhZX0RBVEFfMCk7CisKKwkJLyogU2VuZCByZWdpc3RlciBhZGRyZXMgKi8KKwkJZm9yIChpID0gMHgxMDsgaSA+IDA7IGkgPSBpID4+IDEpCisJCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsCisJCQkJICAgICAgIG9mZnNldCAmIGkgPyBQSFlfREFUQV8xIDoKKwkJCQkgICAgICAgUEhZX0RBVEFfMCk7CisKKwkJLyogU2tpcCB0cmFuc2l0aW9uIHN0YXRlICovCisJCXBoeV9yZWFkXzFiaXQoaW9hZGRyKTsKKworCQkvKiByZWFkIDE2Yml0IGRhdGEgKi8KKwkJZm9yIChwaHlfZGF0YSA9IDAsIGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJcGh5X2RhdGEgPDw9IDE7CisJCQlwaHlfZGF0YSB8PSBwaHlfcmVhZF8xYml0KGlvYWRkcik7CisJCX0KKwl9CisKKwlyZXR1cm4gcGh5X2RhdGE7Cit9CisKKworLyoKKyAqCVdyaXRlIG9uZSBiaXQgZGF0YSB0byBQaHkgQ29udHJvbGxlcgorICovCisKK3N0YXRpYyB2b2lkIHBoeV93cml0ZV8xYml0KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MzIgcGh5X2RhdGEpCit7CisJb3V0bChwaHlfZGF0YSwgaW9hZGRyKTsJLyogTUlJIENsb2NrIExvdyAqLworCXVkZWxheSgxKTsKKwlvdXRsKHBoeV9kYXRhIHwgTURDTEtILCBpb2FkZHIpOwkvKiBNSUkgQ2xvY2sgSGlnaCAqLworCXVkZWxheSgxKTsKKwlvdXRsKHBoeV9kYXRhLCBpb2FkZHIpOwkvKiBNSUkgQ2xvY2sgTG93ICovCisJdWRlbGF5KDEpOworfQorCisKKy8qCisgKglSZWFkIG9uZSBiaXQgcGh5IGRhdGEgZnJvbSBQSFkgY29udHJvbGxlcgorICovCisKK3N0YXRpYyB1MTYgcGh5X3JlYWRfMWJpdCh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwl1MTYgcGh5X2RhdGE7CisKKwlvdXRsKDB4NTAwMDAsIGlvYWRkcik7CisJdWRlbGF5KDEpOworCXBoeV9kYXRhID0gKGlubChpb2FkZHIpID4+IDE5KSAmIDB4MTsKKwlvdXRsKDB4NDAwMDAsIGlvYWRkcik7CisJdWRlbGF5KDEpOworCisJcmV0dXJuIHBoeV9kYXRhOworfQorCisKKy8qCisgKglQYXJzZXIgU1JPTSBhbmQgbWVkaWEgbW9kZQorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfcGFyc2Vfc3JvbShzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgY2hhciAqc3JvbSA9IGRiLT5zcm9tOworCWludCBkbWZlX21vZGUsIHRtcF9yZWc7CisKKwkvKiBJbml0IENSMTUgKi8KKwlkYi0+Y3IxNV9kYXRhID0gQ1IxNV9ERUZBVUxUOworCisJLyogQ2hlY2sgU1JPTSBWZXJzaW9uICovCisJaWYgKCgoaW50KSBzcm9tWzE4XSAmIDB4ZmYpID09IFNST01fVjQxX0NPREUpIHsKKwkJLyogU1JPTSBWNC4wMSAqLworCQkvKiBHZXQgTklDIHN1cHBvcnQgbWVkaWEgbW9kZSAqLworCQlkYi0+TklDX2NhcGFiaWxpdHkgPSAqKHUxNiAqKSAoc3JvbSArIDM0KTsKKwkJZGItPlBIWV9yZWc0ID0gMDsKKwkJZm9yICh0bXBfcmVnID0gMTsgdG1wX3JlZyA8IDB4MTA7IHRtcF9yZWcgPDw9IDEpIHsKKwkJCXN3aXRjaCAoZGItPk5JQ19jYXBhYmlsaXR5ICYgdG1wX3JlZykgeworCQkJY2FzZSAweDE6CisJCQkJZGItPlBIWV9yZWc0IHw9IDB4MDAyMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgyOgorCQkJCWRiLT5QSFlfcmVnNCB8PSAweDAwNDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NDoKKwkJCQlkYi0+UEhZX3JlZzQgfD0gMHgwMDgwOworCQkJCWJyZWFrOworCQkJY2FzZSAweDg6CisJCQkJZGItPlBIWV9yZWc0IHw9IDB4MDEwMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIE1lZGlhIE1vZGUgRm9yY2Ugb3Igbm90IGNoZWNrICovCisJCWRtZmVfbW9kZSA9ICooKGludCAqKSBzcm9tICsgMzQpICYgKigoaW50ICopIHNyb20gKyAzNik7CisJCXN3aXRjaCAoZG1mZV9tb2RlKSB7CisJCWNhc2UgMHg0OgorCQkJZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xMDBNSEY7CisJCQlicmVhazsJLyogMTAwTUhGICovCisJCWNhc2UgMHgyOgorCQkJZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xME1GRDsKKwkJCWJyZWFrOwkvKiAxME1GRCAqLworCQljYXNlIDB4ODoKKwkJCWRtZmVfbWVkaWFfbW9kZSA9IERNRkVfMTAwTUZEOworCQkJYnJlYWs7CS8qIDEwME1GRCAqLworCQljYXNlIDB4MTAwOgorCQljYXNlIDB4MjAwOgorCQkJZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xTV9IUE5BOworCQkJYnJlYWs7CS8qIEhvbWVQTkEgKi8KKwkJfQorCisJCS8qIFNwZWNpYWwgRnVuY3Rpb24gc2V0dGluZyAqLworCQkvKiBWTEFOIGZ1bmN0aW9uICovCisJCWlmICgoU0ZfbW9kZSAmIDB4MSkgfHwgKHNyb21bNDNdICYgMHg4MCkpCisJCQlkYi0+Y3IxNV9kYXRhIHw9IDB4NDA7CisKKwkJLyogRmxvdyBDb250cm9sICovCisJCWlmICgoU0ZfbW9kZSAmIDB4MikgfHwgKHNyb21bNDBdICYgMHgxKSkKKwkJCWRiLT5jcjE1X2RhdGEgfD0gMHg0MDA7CisKKwkJLyogVFggcGF1c2UgcGFja2V0ICovCisJCWlmICgoU0ZfbW9kZSAmIDB4NCkgfHwgKHNyb21bNDBdICYgMHhlKSkKKwkJCWRiLT5jcjE1X2RhdGEgfD0gMHg5ODAwOworCX0KKworCS8qIFBhcnNlIEhQTkEgcGFyYW1ldGVyICovCisJZGItPkhQTkFfY29tbWFuZCA9IDE7CisKKwkvKiBBY2NlcHQgcmVtb3RlIGNvbW1hbmQgb3Igbm90ICovCisJaWYgKEhQTkFfcnhfY21kID09IDApCisJCWRiLT5IUE5BX2NvbW1hbmQgfD0gMHg4MDAwOworCisJLyogSXNzdWUgcmVtb3RlIGNvbW1hbmQgJiBvcGVyYXRpb24gbW9kZSAqLworCWlmIChIUE5BX3R4X2NtZCA9PSAxKQorCQlzd2l0Y2ggKEhQTkFfbW9kZSkgewkvKiBJc3N1ZSBSZW1vdGUgQ29tbWFuZCAqLworCQljYXNlIDA6CisJCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDkwNDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MGEwMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDUwNjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDYwMjsKKwkJCWJyZWFrOworCX0gZWxzZQorCQlzd2l0Y2ggKEhQTkFfbW9kZSkgewkvKiBEb24ndCBJc3N1ZSAqLworCQljYXNlIDA6CisJCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDAwNDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDAwMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDAwNjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDAwMjsKKwkJCWJyZWFrOworCQl9CisKKwkvKiBDaGVjayBETTk4MDEgb3IgRE05ODAyIHByZXNlbnQgb3Igbm90ICovCisJZGItPkhQTkFfcHJlc2VudCA9IDA7CisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEgfCAweDQwMDAwLCBCQVNFKTsKKwl0bXBfcmVnID0gcGh5X3JlYWQoQkFTRSwgZGItPnBoeV9hZGRyLCAzLCBkYi0+Y2hpcF9pZCk7CisJaWYgKCh0bXBfcmVnICYgMHhmZmYwKSA9PSAweGI5MDApIHsKKwkJLyogRE05ODAxIG9yIERNOTgwMiBwcmVzZW50ICovCisJCWRiLT5IUE5BX3RpbWVyID0gODsKKwkJaWYgKHBoeV9yZWFkKEJBU0UsIGRiLT5waHlfYWRkciwgMzEsIGRiLT5jaGlwX2lkKSA9PQorCQkgICAgMHg0NDA0KSB7CisJCQkvKiBETTk4MDEgSG9tZVJ1biAqLworCQkJZGItPkhQTkFfcHJlc2VudCA9IDE7CisJCQlkbWZlX3Byb2dyYW1fRE05ODAxKG5pYywgdG1wX3JlZyk7CisJCX0gZWxzZSB7CisJCQkvKiBETTk4MDIgTG9uZ1J1biAqLworCQkJZGItPkhQTkFfcHJlc2VudCA9IDI7CisJCQlkbWZlX3Byb2dyYW1fRE05ODAyKG5pYyk7CisJCX0KKwl9CisKK30KKworLyoKKyAqCUluaXQgSG9tZVJ1biBETTk4MDEKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX3Byb2dyYW1fRE05ODAxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IEhQTkFfcmV2KQoreworCXUzMiByZWcxNywgcmVnMjU7CisKKwlpZiAoIUhQTkFfTm9pc2VGbG9vcikKKwkJSFBOQV9Ob2lzZUZsb29yID0gRE05ODAxX05PSVNFX0ZMT09SOworCXN3aXRjaCAoSFBOQV9yZXYpIHsKKwljYXNlIDB4YjkwMDoJCS8qIERNOTgwMSBFMyAqLworCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4MTAwMDsKKwkJcmVnMjUgPSBwaHlfcmVhZChCQVNFLCBkYi0+cGh5X2FkZHIsIDI0LCBkYi0+Y2hpcF9pZCk7CisJCXJlZzI1ID0gKChyZWcyNSArIEhQTkFfTm9pc2VGbG9vcikgJiAweGZmKSB8IDB4ZjAwMDsKKwkJcmVnMTcgPSBwaHlfcmVhZChCQVNFLCBkYi0+cGh5X2FkZHIsIDE3LCBkYi0+Y2hpcF9pZCk7CisJCWJyZWFrOworCWNhc2UgMHhiOTAxOgkJLyogRE05ODAxIEU0ICovCisJCXJlZzI1ID0gcGh5X3JlYWQoQkFTRSwgZGItPnBoeV9hZGRyLCAyNSwgZGItPmNoaXBfaWQpOworCQlyZWcyNSA9IChyZWcyNSAmIDB4ZmYwMCkgKyBIUE5BX05vaXNlRmxvb3I7CisJCXJlZzE3ID0gcGh5X3JlYWQoQkFTRSwgZGItPnBoeV9hZGRyLCAxNywgZGItPmNoaXBfaWQpOworCQlyZWcxNyA9IChyZWcxNyAmIDB4ZmZmMCkgKyBIUE5BX05vaXNlRmxvb3IgKyAzOworCQlicmVhazsKKwljYXNlIDB4YjkwMjoJCS8qIERNOTgwMSBFNSAqLworCWNhc2UgMHhiOTAzOgkJLyogRE05ODAxIEU2ICovCisJZGVmYXVsdDoKKwkJZGItPkhQTkFfY29tbWFuZCB8PSAweDEwMDA7CisJCXJlZzI1ID0gcGh5X3JlYWQoQkFTRSwgZGItPnBoeV9hZGRyLCAyNSwgZGItPmNoaXBfaWQpOworCQlyZWcyNSA9IChyZWcyNSAmIDB4ZmYwMCkgKyBIUE5BX05vaXNlRmxvb3IgLSA1OworCQlyZWcxNyA9IHBoeV9yZWFkKEJBU0UsIGRiLT5waHlfYWRkciwgMTcsIGRiLT5jaGlwX2lkKTsKKwkJcmVnMTcgPSAocmVnMTcgJiAweGZmZjApICsgSFBOQV9Ob2lzZUZsb29yOworCQlicmVhazsKKwl9CisJcGh5X3dyaXRlKEJBU0UsIGRiLT5waHlfYWRkciwgMTYsIGRiLT5IUE5BX2NvbW1hbmQsIGRiLT5jaGlwX2lkKTsKKwlwaHlfd3JpdGUoQkFTRSwgZGItPnBoeV9hZGRyLCAxNywgcmVnMTcsIGRiLT5jaGlwX2lkKTsKKwlwaHlfd3JpdGUoQkFTRSwgZGItPnBoeV9hZGRyLCAyNSwgcmVnMjUsIGRiLT5jaGlwX2lkKTsKK30KKworCisvKgorICoJSW5pdCBIb21lUnVuIERNOTgwMgorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfcHJvZ3JhbV9ETTk4MDIoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCXUzMiBwaHlfcmVnOworCisJaWYgKCFIUE5BX05vaXNlRmxvb3IpCisJCUhQTkFfTm9pc2VGbG9vciA9IERNOTgwMl9OT0lTRV9GTE9PUjsKKwlwaHlfd3JpdGUoQkFTRSwgZGItPnBoeV9hZGRyLCAxNiwgZGItPkhQTkFfY29tbWFuZCwgZGItPmNoaXBfaWQpOworCXBoeV9yZWcgPSBwaHlfcmVhZChCQVNFLCBkYi0+cGh5X2FkZHIsIDI1LCBkYi0+Y2hpcF9pZCk7CisJcGh5X3JlZyA9IChwaHlfcmVnICYgMHhmZjAwKSArIEhQTkFfTm9pc2VGbG9vcjsKKwlwaHlfd3JpdGUoQkFTRSwgZGItPnBoeV9hZGRyLCAyNSwgcGh5X3JlZywgZGItPmNoaXBfaWQpOworfQorCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIGRtZmVfb3BlcmF0aW9ucyA9IHsKKwkuY29ubmVjdAk9IGR1bW15X2Nvbm5lY3QsCisJLnBvbGwJCT0gZG1mZV9wb2xsLAorCS50cmFuc21pdAk9IGRtZmVfdHJhbnNtaXQsCisJLmlycQkJPSBkbWZlX2lycSwKKworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRtZmVfbmljc1tdID0geworCVBDSV9ST00oMHgxMjgyLCAweDkxMDAsICJkbWZlOTEwMCIsICJEYXZpY29tIDkxMDAiLCAwKSwKKwlQQ0lfUk9NKDB4MTI4MiwgMHg5MTAyLCAiZG1mZTkxMDIiLCAiRGF2aWNvbSA5MTAyIiwgMCksCisJUENJX1JPTSgweDEyODIsIDB4OTAwOSwgImRtZmU5MDA5IiwgIkRhdmljb20gOTAwOSIsIDApLAorCVBDSV9ST00oMHgxMjgyLCAweDkxMzIsICJkbWZlOTEzMiIsICJEYXZpY29tIDkxMzIiLCAwKSwJLyogTmVlZHMgcHJvYmFibHkgc29tZSBmaXhpbmcgKi8KK307CisKK1BDSV9EUklWRVIgKCBkbWZlX2RyaXZlciwgZG1mZV9uaWNzLCBQQ0lfTk9fQ0xBU1MgKTsKKworRFJJVkVSICggIkRNRkUvUENJIiwgbmljX2RyaXZlciwgcGNpX2RyaXZlciwgZG1mZV9kcml2ZXIsCisJIGRtZmVfcHJvYmUsIGRtZmVfZGlzYWJsZSApOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4YzY5NwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmMKQEAgLTAsMCArMSwxMTg5IEBACisvKgorICogZ1BYRSBkcml2ZXIgZm9yIEludGVsIGVlcHJvMTAwMCBldGhlcm5ldCBjYXJkcworICoKKyAqIFdyaXR0ZW4gYnkgTWFydHkgQ29ubm9yCisgKgorICogQ29weXJpZ2h0IEVudGl0eSBDeWJlciwgSW5jLiAyMDA3CisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5CisgKiByZWZlcmVuY2UuICBEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlcgorICogdGhlIEdQTCBhbmQgbXVzdCByZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZQorICogbm90aWNlLgorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIEludGVsIFBSTy8xMDAwIExpbnV4IGRyaXZlcgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDYgSW50ZWwgQ29ycG9yYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCisgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisjaW5jbHVkZSAiZTEwMDAuaCIKKworLyoqCisgKiBlMTAwMF9nZXRfaHdfY29udHJvbCAtIGdldCBjb250cm9sIG9mIHRoZSBoL3cgZnJvbSBmL3cKKyAqCisgKiBAdiBhZGFwdGVyCWUxMDAwIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogZTEwMDBfZ2V0X2h3X2NvbnRyb2wgc2V0cyB7Q1RSTF9FWFR8RldTTX06RFJWX0xPQUQgYml0LgorICogRm9yIEFTRiBhbmQgUGFzcyBUaHJvdWdoIHZlcnNpb25zIG9mIGYvdyB0aGlzIG1lYW5zIHRoYXQKKyAqIHRoZSBkcml2ZXIgaXMgbG9hZGVkLiBGb3IgQU1UIHZlcnNpb24gKG9ubHkgd2l0aCA4MjU3MykKKyAqIG9mIHRoZSBmL3cgdGhpcyBtZWFucyB0aGF0IHRoZSBuZXR3b3JrIGkvZiBpcyBvcGVuLgorICoKKyAqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9nZXRfaHdfY29udHJvbCAoIHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyICkKK3sKKwl1aW50MzJfdCBjdHJsX2V4dDsKKwl1aW50MzJfdCBzd3NtOworCQorCURCRyAoICJlMTAwMF9nZXRfaHdfY29udHJvbFxuIiApOworCisJLyogTGV0IGZpcm13YXJlIGtub3cgdGhlIGRyaXZlciBoYXMgdGFrZW4gb3ZlciAqLworCXN3aXRjaCAoYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTczOgorCQlzd3NtID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTV1NNKTsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgU1dTTSwKKwkJCQlzd3NtIHwgRTEwMDBfU1dTTV9EUlZfTE9BRCk7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NzE6CisJY2FzZSBlMTAwMF84MjU3MjoKKwljYXNlIGUxMDAwXzgyNTc2OgorCWNhc2UgZTEwMDBfODAwMDNlczJsYW46CisJY2FzZSBlMTAwMF9pY2g4bGFuOgorCQljdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1RSTF9FWFQpOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCwKKwkJCQljdHJsX2V4dCB8IEUxMDAwX0NUUkxfRVhUX0RSVl9MT0FEKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGUxMDAwX2lycV9lbmFibGUgLSBFbmFibGUgZGVmYXVsdCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBzZXR0aW5ncworICoKKyAqIEB2IGFkYXB0ZXIJZTEwMDAgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9pcnFfZW5hYmxlICggc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgKQoreworCUUxMDAwX1dSSVRFX1JFRyAoICZhZGFwdGVyLT5odywgSU1TLCBJTVNfRU5BQkxFX01BU0sgKTsKKwlFMTAwMF9XUklURV9GTFVTSCAoICZhZGFwdGVyLT5odyApOworfQorCisvKioKKyAqIGUxMDAwX2lycV9kaXNhYmxlIC0gTWFzayBvZmYgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gdGhlIE5JQworICoKKyAqIEB2IGFkYXB0ZXIJZTEwMDAgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9pcnFfZGlzYWJsZSAoIHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyICkKK3sKKwlFMTAwMF9XUklURV9SRUcgKCAmYWRhcHRlci0+aHcsIElNQywgfjAgKTsKKwlFMTAwMF9XUklURV9GTFVTSCAoICZhZGFwdGVyLT5odyApOworfQorCisvKioKKyAqIGUxMDAwX3N3X2luaXQgLSBJbml0aWFsaXplIGdlbmVyYWwgc29mdHdhcmUgc3RydWN0dXJlcyAoc3RydWN0IGUxMDAwX2FkYXB0ZXIpCisgKgorICogQHYgYWRhcHRlcgllMTAwMCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIGUxMDAwX3N3X2luaXQgaW5pdGlhbGl6ZXMgdGhlIEFkYXB0ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZS4KKyAqIEZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24gUENJIGRldmljZSBpbmZvcm1hdGlvbiBhbmQKKyAqIE9TIG5ldHdvcmsgZGV2aWNlIHNldHRpbmdzIChNVFUgc2l6ZSkuCisgKiovCitzdGF0aWMgaW50CitlMTAwMF9zd19pbml0ICggc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgKQoreworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCisJLyogUENJIGNvbmZpZyBzcGFjZSBpbmZvICovCisKKwlody0+dmVuZG9yX2lkID0gcGRldi0+dmVuZG9yOworCWh3LT5kZXZpY2VfaWQgPSBwZGV2LT5kZXZpY2U7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZCAoIHBkZXYsIFBDSV9DT01NQU5ELCAmaHctPnBjaV9jbWRfd29yZCApOworCisJLyogRGlzYWJsZSBGbG93IENvbnRyb2wgKi8KKwlody0+ZmMgPSBFMTAwMF9GQ19OT05FOworCisJYWRhcHRlci0+ZWVwcm9tX3dvbCA9IDA7CisJYWRhcHRlci0+d29sID0gYWRhcHRlci0+ZWVwcm9tX3dvbDsKKwlhZGFwdGVyLT5lbl9tbmdfcHQgID0gMDsKKwlhZGFwdGVyLT5yeF9pbnRfZGVsYXkgPSAwOworCWFkYXB0ZXItPnJ4X2Fic19pbnRfZGVsYXkgPSAwOworCisgICAgICAgIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBNQVhJTVVNX0VUSEVSTkVUX1ZMQU5fU0laRTsKKyAgICAgICAgYWRhcHRlci0+cnhfcHNfYnNpemUwID0gRTEwMDBfUlhCVUZGRVJfMTI4OworICAgICAgICBody0+bWF4X2ZyYW1lX3NpemUgPSBNQVhJTVVNX0VUSEVSTkVUX1ZMQU5fU0laRSArCisJCUVORVRfSEVBREVSX1NJWkUgKyBFVEhFUk5FVF9GQ1NfU0laRTsKKyAgICAgICAgaHctPm1pbl9mcmFtZV9zaXplID0gTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFOworCisJLyogaWRlbnRpZnkgdGhlIE1BQyAqLworCisJaWYgKCBlMTAwMF9zZXRfbWFjX3R5cGUgKCBodyApICkgeworCQlEQkcgKCAiVW5rbm93biBNQUMgVHlwZVxuIiApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKCBody0+bWFjX3R5cGUgKSB7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0MToKKwljYXNlIGUxMDAwXzgyNTQ3OgorCWNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisJY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKwkJaHctPnBoeV9pbml0X3NjcmlwdCA9IDE7CisJCWJyZWFrOworCX0KKworCWUxMDAwX3NldF9tZWRpYV90eXBlICggaHcgKTsKKworCWh3LT5hdXRvbmVnID0gVFJVRTsKKwlody0+YXV0b25lZ19hZHZlcnRpc2VkID0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVDsKKwlody0+d2FpdF9hdXRvbmVnX2NvbXBsZXRlID0gVFJVRTsKKworCWh3LT50YmlfY29tcGF0aWJpbGl0eV9lbiA9IFRSVUU7CisJaHctPmFkYXB0aXZlX2lmcyA9IFRSVUU7CisKKwkvKiBDb3BwZXIgb3B0aW9ucyAqLworCisJaWYgKCBody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlciApIHsKKwkJaHctPm1kaXggPSBBVVRPX0FMTF9NT0RFUzsKKwkJaHctPmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9IEZBTFNFOworCQlody0+bWFzdGVyX3NsYXZlID0gRTEwMDBfTUFTVEVSX1NMQVZFOworCX0KKworCWUxMDAwX2lycV9kaXNhYmxlICggYWRhcHRlciApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZTEwMDBfc2V0dXBfdHhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgVHggcmVzb3VyY2VzIChEZXNjcmlwdG9ycykKKyAqCisgKiBAdiBhZGFwdGVyCWUxMDAwIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogQHJldCByYyAgICAgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludAorZTEwMDBfc2V0dXBfdHhfcmVzb3VyY2VzICggc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgKQoreworCURCRyAoICJlMTAwMF9zZXR1cF90eF9yZXNvdXJjZXNcbiIgKTsKKwkKKwkvKiBBbGxvY2F0ZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmcgbWVtb3J5LgorCSAgIEl0IG11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5IGJlY2F1c2Ugb2YgaGFyZHdhcmUgZXJyYXRhICMyMworCSAgIHNvIHdlIHVzZSBtYWxsb2NfZG1hKCkgcmVxdWVzdGluZyBhIDEyOCBieXRlIGJsb2NrIHRoYXQgaXMKKwkgICAxMjggYnl0ZSBhbGlnbmVkLiBUaGlzIHNob3VsZCBndWFyYW50ZWUgdGhhdCB0aGUgbWVtb3J5CisJICAgYWxsb2NhdGVkIHdpbGwgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5LCBiZWNhdXNlIDEyOCBpcyBhbgorCSAgIGV2ZW4gbXVsdGlwbGUgb2YgNjU1MzYgKCA2NTUzNiAvIDEyOCA9PSA1MTIgKSwgc28gYWxsIHBvc3NpYmxlCisJICAgYWxsb2NhdGlvbnMgb2YgMTI4IGJ5dGVzIG9uIGEgMTI4IGJ5dGUgYm91bmRhcnkgd2lsbCBub3QKKwkgICBjcm9zcyA2NEsgYnl0ZXMuCisJICovCisKKyAgICAgICAgYWRhcHRlci0+dHhfYmFzZSA9IAorICAgICAgICAJbWFsbG9jX2RtYSAoIGFkYXB0ZXItPnR4X3Jpbmdfc2l6ZSwgYWRhcHRlci0+dHhfcmluZ19zaXplICk7CisgICAgICAgIAkJICAgICAgICAgICAgIAkJICAgICAKKyAgICAgICAJaWYgKCAhIGFkYXB0ZXItPnR4X2Jhc2UgKSB7CisgICAgICAgCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisJbWVtc2V0ICggYWRhcHRlci0+dHhfYmFzZSwgMCwgYWRhcHRlci0+dHhfcmluZ19zaXplICk7CisJCisJREJHICggImFkYXB0ZXItPnR4X2Jhc2UgPSAlIzA4bHhcbiIsIHZpcnRfdG9fYnVzICggYWRhcHRlci0+dHhfYmFzZSApICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX2ZyZWVfdHhfcmVzb3VyY2VzICggc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgKQoreworCURCRyAoICJlMTAwMF9mcmVlX3R4X3Jlc291cmNlc1xuIiApOworCisgICAgICAgIGZyZWVfZG1hICggYWRhcHRlci0+dHhfYmFzZSwgYWRhcHRlci0+dHhfcmluZ19zaXplICk7Cit9CisKKy8qKgorICogZTEwMDBfY29uZmlndXJlX3R4IC0gQ29uZmlndXJlIDgyNTR4IFRyYW5zbWl0IFVuaXQgYWZ0ZXIgUmVzZXQKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIENvbmZpZ3VyZSB0aGUgVHggdW5pdCBvZiB0aGUgTUFDIGFmdGVyIGEgcmVzZXQuCisgKiovCitzdGF0aWMgdm9pZAorZTEwMDBfY29uZmlndXJlX3R4ICggc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgKQoreworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdWludDMyX3QgdGN0bDsKKwl1aW50MzJfdCB0eGRjdGw7CisKKwlEQkcgKCAiZTEwMDBfY29uZmlndXJlX3R4XG4iICk7CisKKwlFMTAwMF9XUklURV9SRUcgKCBodywgVERCQUgsIDAgKTsKKwlFMTAwMF9XUklURV9SRUcgKCBodywgVERCQUwsIHZpcnRfdG9fYnVzICggYWRhcHRlci0+dHhfYmFzZSApICk7CisJRTEwMDBfV1JJVEVfUkVHICggaHcsIFRETEVOLCBhZGFwdGVyLT50eF9yaW5nX3NpemUgKTsKKwkJCSAgCisgICAgICAgIERCRyAoICJUREJBTDogJSMwOHhcbiIsICBFMTAwMF9SRUFEX1JFRyAoIGh3LCBUREJBTCApICk7CisgICAgICAgIERCRyAoICJURExFTjogJWRcbiIsICAgICBFMTAwMF9SRUFEX1JFRyAoIGh3LCBURExFTiApICk7CisKKwkvKiBTZXR1cCB0aGUgSFcgVHggSGVhZCBhbmQgVGFpbCBkZXNjcmlwdG9yIHBvaW50ZXJzICovCisJRTEwMDBfV1JJVEVfUkVHICggaHcsIFRESCwgMCApOworCUUxMDAwX1dSSVRFX1JFRyAoIGh3LCBURFQsIDAgKTsKKworCWFkYXB0ZXItPnR4X2hlYWQgPSAwOworCWFkYXB0ZXItPnR4X3RhaWwgPSAwOworCWFkYXB0ZXItPnR4X2ZpbGxfY3RyID0gMDsKKworCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzYpIHsKKwkJdHhkY3RsID0gRTEwMDBfUkVBRF9SRUcgKCBodywgVFhEQ1RMICk7CisJCXR4ZGN0bCB8PSBFMTAwMF9UWERDVExfUVVFVUVfRU5BQkxFOworCQlFMTAwMF9XUklURV9SRUcgKCBodywgVFhEQ1RMLCB0eGRjdGwgKTsKKwl9CisKKwkvKiBTZXR1cCBUcmFuc21pdCBEZXNjcmlwdG9yIFNldHRpbmdzIGZvciBlb3AgZGVzY3JpcHRvciAqLworCXRjdGwgPSBFMTAwMF9UQ1RMX1BTUCB8IEUxMDAwX1RDVExfRU4gfAorCQkoRTEwMDBfQ09MTElTSU9OX1RIUkVTSE9MRCA8PCBFMTAwMF9DVF9TSElGVCkgfCAKKwkJKEUxMDAwX0hEWF9DT0xMSVNJT05fRElTVEFOQ0UgPDwgRTEwMDBfQ09MRF9TSElGVCk7CisKKwllMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QgKCBodyApOworCisJRTEwMDBfV1JJVEVfUkVHICggaHcsIFRDVEwsIHRjdGwgKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0ggKCBodyApOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXMgKCBzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciApCit7CisJaW50IGk7CisKKwlEQkcgKCAiZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXNcbiIgKTsKKworCWZyZWVfZG1hICggYWRhcHRlci0+cnhfYmFzZSwgYWRhcHRlci0+cnhfcmluZ19zaXplICk7CisKKwlmb3IgKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisJCWZyZWVfaW9iICggYWRhcHRlci0+cnhfaW9idWZbaV0gKTsKKwl9Cit9CisKKy8qKgorICogZTEwMDBfcmVmaWxsX3J4X3JpbmcgLSBhbGxvY2F0ZSBSeCBpb19idWZmZXJzCisgKgorICogQHYgYWRhcHRlcgllMTAwMCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEByZXQgcmMgICAgICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqKi8KK2ludCBlMTAwMF9yZWZpbGxfcnhfcmluZyAoIHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyICkKK3sKKwlpbnQgaSwgcnhfY3VycjsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBlMTAwMF9yeF9kZXNjICpyeF9jdXJyX2Rlc2M7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2I7CisKKwlEQkcgKCJlMTAwMF9yZWZpbGxfcnhfcmluZ1xuIik7CisKKwlmb3IgKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisJCXJ4X2N1cnIgPSAoICggYWRhcHRlci0+cnhfY3VyciArIGkgKSAlIE5VTV9SWF9ERVNDICk7CisJCXJ4X2N1cnJfZGVzYyA9IGFkYXB0ZXItPnJ4X2Jhc2UgKyByeF9jdXJyOworCisJCWlmICggcnhfY3Vycl9kZXNjLT5zdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9ERCApCisJCQljb250aW51ZTsKKworCQlpZiAoIGFkYXB0ZXItPnJ4X2lvYnVmW3J4X2N1cnJdICE9IE5VTEwgKQorCQkJY29udGludWU7CisKKwkJREJHMiAoICJSZWZpbGxpbmcgcnggZGVzYyAlZFxuIiwgcnhfY3VyciApOworCisJCWlvYiA9IGFsbG9jX2lvYiAoIE1BWElNVU1fRVRIRVJORVRfVkxBTl9TSVpFICk7CisJCWFkYXB0ZXItPnJ4X2lvYnVmW3J4X2N1cnJdID0gaW9iOworCisJCWlmICggISBpb2IgKSB7CisJCQlEQkcgKCAiYWxsb2NfaW9iIGZhaWxlZFxuIiApOworCQkJcmMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlyeF9jdXJyX2Rlc2MtPmJ1ZmZlcl9hZGRyID0gdmlydF90b19idXMgKCBpb2ItPmRhdGEgKTsKKworCQkJRTEwMDBfV1JJVEVfUkVHICggaHcsIFJEVCwgcnhfY3VyciApOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKiBlMTAwMF9zZXR1cF9yeF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBSeCByZXNvdXJjZXMgKERlc2NyaXB0b3JzKQorICoKKyAqIEB2IGFkYXB0ZXIJZTEwMDAgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0IHJjICAgICAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50CitlMTAwMF9zZXR1cF9yeF9yZXNvdXJjZXMgKCBzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciApCit7CisJaW50IGksIHJjID0gMDsKKwkKKwlEQkcgKCAiZTEwMDBfc2V0dXBfcnhfcmVzb3VyY2VzXG4iICk7CisJCisJLyogQWxsb2NhdGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmcgbWVtb3J5LgorCSAgIEl0IG11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5IGJlY2F1c2Ugb2YgaGFyZHdhcmUgZXJyYXRhCisJICovCisKKyAgICAgICAgYWRhcHRlci0+cnhfYmFzZSA9IAorICAgICAgICAJbWFsbG9jX2RtYSAoIGFkYXB0ZXItPnJ4X3Jpbmdfc2l6ZSwgYWRhcHRlci0+cnhfcmluZ19zaXplICk7CisKKyAgICAgICAJaWYgKCAhIGFkYXB0ZXItPnJ4X2Jhc2UgKSB7CisgICAgICAgCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0ICggYWRhcHRlci0+cnhfYmFzZSwgMCwgYWRhcHRlci0+cnhfcmluZ19zaXplICk7CisKKwlmb3IgKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisJCS8qIGxldCBlMTAwMF9yZWZpbGxfcnhfcmluZygpIGlvX2J1ZmZlciBhbGxvY2F0aW9ucyAqLworCQlhZGFwdGVyLT5yeF9pb2J1ZltpXSA9IE5VTEw7CisJfQorCisJLyogYWxsb2NhdGUgaW9fYnVmZmVycyAqLworCXJjID0gZTEwMDBfcmVmaWxsX3J4X3JpbmcgKCBhZGFwdGVyICk7CisJaWYgKCByYyA8IDAgKQorCQllMTAwMF9mcmVlX3J4X3Jlc291cmNlcyAoIGFkYXB0ZXIgKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBlMTAwMF9jb25maWd1cmVfcnggLSBDb25maWd1cmUgODI1NHggUmVjZWl2ZSBVbml0IGFmdGVyIFJlc2V0CisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBDb25maWd1cmUgdGhlIFJ4IHVuaXQgb2YgdGhlIE1BQyBhZnRlciBhIHJlc2V0LgorICoqLworc3RhdGljIHZvaWQKK2UxMDAwX2NvbmZpZ3VyZV9yeCAoIHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyICkKK3sKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVpbnQzMl90IHJjdGwsIHJ4ZGN0bCwgbXJxYywgcnhjc3VtOworCisJREJHICggImUxMDAwX2NvbmZpZ3VyZV9yeFxuIiApOworCisJLyogZGlzYWJsZSByZWNlaXZlcyB3aGlsZSBzZXR0aW5nIHVwIHRoZSBkZXNjcmlwdG9ycyAqLworCXJjdGwgPSBFMTAwMF9SRUFEX1JFRyAoIGh3LCBSQ1RMICk7CisJRTEwMDBfV1JJVEVfUkVHICggaHcsIFJDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTiApOworCUUxMDAwX1dSSVRFX0ZMVVNIICggaHcgKTsKKwltZGVsYXkoMTApOworCisJYWRhcHRlci0+cnhfY3VyciA9IDA7CisKKwkvKiBTZXR1cCB0aGUgSFcgUnggSGVhZCBhbmQgVGFpbCBEZXNjcmlwdG9yIFBvaW50ZXJzIGFuZAorCSAqIHRoZSBCYXNlIGFuZCBMZW5ndGggb2YgdGhlIFJ4IERlc2NyaXB0b3IgUmluZyAqLwkgCisKKwlFMTAwMF9XUklURV9SRUcgKCBodywgUkRCQUwsIHZpcnRfdG9fYnVzICggYWRhcHRlci0+cnhfYmFzZSApICk7CisJRTEwMDBfV1JJVEVfUkVHICggaHcsIFJEQkFILCAwICk7CisJRTEwMDBfV1JJVEVfUkVHICggaHcsIFJETEVOLCBhZGFwdGVyLT5yeF9yaW5nX3NpemUgKTsKKworCUUxMDAwX1dSSVRFX1JFRyAoIGh3LCBSREgsIDAgKTsKKwlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTc2KQorCQlFMTAwMF9XUklURV9SRUcgKCBodywgUkRULCAwICk7CisJZWxzZQorCQlFMTAwMF9XUklURV9SRUcgKCBodywgUkRULCBOVU1fUlhfREVTQyAtIDEgKTsKKworCS8qIFRoaXMgZG9lc24ndCBzZWVtIHRvICBiZSBuZWNlc3NhcnkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLAorCSAqIGJ1dCBpdCBzZWVtcyBhcyB3ZWxsIHRvIGJlIGltcGxpY2l0CisJICovCisJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3NikgeworCQlyeGRjdGwgPSBFMTAwMF9SRUFEX1JFRyAoIGh3LCBSWERDVEwgKTsKKwkJcnhkY3RsIHw9IEUxMDAwX1JYRENUTF9RVUVVRV9FTkFCTEU7CisJCXJ4ZGN0bCAmPSAweEZGRjAwMDAwOworCQlyeGRjdGwgfD0gSUdCX1JYX1BUSFJFU0g7CisJCXJ4ZGN0bCB8PSBJR0JfUlhfSFRIUkVTSCA8PCA4OworCQlyeGRjdGwgfD0gSUdCX1JYX1dUSFJFU0ggPDwgMTY7CisJCUUxMDAwX1dSSVRFX1JFRyAoIGh3LCBSWERDVEwsIHJ4ZGN0bCApOworCQlFMTAwMF9XUklURV9GTFVTSCAoIGh3ICk7CisKKwkJcnhjc3VtID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJYQ1NVTSk7CisJCXJ4Y3N1bSAmPSB+KCBFMTAwMF9SWENTVU1fVFVPRkwgfCBFMTAwMF9SWENTVU1fSVBQQ1NFICk7CisJCUUxMDAwX1dSSVRFX1JFRyAoIGh3LCBSWENTVU0sIDAgKTsKKworCQkvKiBUaGUgaW5pdGlhbCB2YWx1ZSBmb3IgTVJRQyBkaXNhYmxlcyBtdWx0aXBsZSByZWNlaXZlCisJCSAqIHF1ZXVlcywgaG93ZXZlciB0aGlzIHNldHRpbmcgaXMgbm90IHJlY29tbWVuZGVkLgorCQkgKiAtIEludGVswq4gODI1NzYgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIERhdGFzaGVldCByMi40MQorCSAgICAgICAgICogICBTZWN0aW9uIDguMTAuOSBNdWx0aXBsZSBRdWV1ZXMgQ29tbWFuZCBSZWdpc3RlciAtIE1SUUMKKwkJICovCisJCW1ycWMgPSBFMTAwMF9NUlFDX0VOQUJMRV9WTURROworCQlFMTAwMF9XUklURV9SRUcgKCBodywgTVJRQywgbXJxYyApOworCX0KKworCS8qIEVuYWJsZSBSZWNlaXZlcyAqLworCXJjdGwgfD0gIEUxMDAwX1JDVExfRU4gfCBFMTAwMF9SQ1RMX0JBTSB8IEUxMDAwX1JDVExfU1pfMjA0OCB8CisJCSBFMTAwMF9SQ1RMX01QRTsKKwlFMTAwMF9XUklURV9SRUcgKCBodywgUkNUTCwgcmN0bCApOworCUUxMDAwX1dSSVRFX0ZMVVNIICggaHcgKTsKKworCS8qIE9uIHRoZSA4MjU3NiwgUkRUKFswXSkgbXVzdCBub3QgYmUgImJ1bXBlZCIgYmVmb3JlCisJICogdGhlIGVuYWJsZSBiaXQgb2YgUlhEQ1RMKFswXSkgaXMgc2V0LgorCSAqIC0gSW50ZWzCriA4MjU3NiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgRGF0YXNoZWV0IHIyLjQxCisJICogICBTZWN0aW9uIDQuNS45IHJlY2VpdmUgSW5pdGlhbGl6YXRpb24KKwkgKgorCSAqIEJ5IG9ic2VydmF0aW9uIEkgaGF2ZSBmb3VuZCB0byBvY2N1ciB3aGVuIHRoZSBlbmFibGUgYml0IG9mCisJICogUkNUTCBpcyBzZXQuIFRoZSBkYXRhc2hlZXQgcmVjb21tZW5kcyBwb2xsaW5nIGZvciB0aGlzIGJpdCwKKwkgKiBob3dldmVyIGFzIEkgc2VlIG5vIGV2aWRlbmNlIG9mIHRoaXMgaW4gdGhlIExpbnV4IGlnYiBkcml2ZXIKKwkgKiBJIGhhdmUgb21pdHRlZCB0aGF0IHN0ZXAuCisJICogLSBTaW1vbiBIb3JtYW4sIE1heSAyMDA5CisJICovCisJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3NikKKwkJRTEwMDBfV1JJVEVfUkVHICggaHcsIFJEVCwgTlVNX1JYX0RFU0MgLSAxICk7CisKKyAgICAgICAgREJHICggIlJEQkFMOiAlIzA4eFxuIiwgIEUxMDAwX1JFQURfUkVHICggaHcsIFJEQkFMICkgKTsKKyAgICAgICAgREJHICggIlJETEVOOiAlZFxuIiwgICAgIEUxMDAwX1JFQURfUkVHICggaHcsIFJETEVOICkgKTsKKyAgICAgICAgREJHICggIlJDVEw6ICAlIzA4eFxuIiwgIEUxMDAwX1JFQURfUkVHICggaHcsIFJDVEwgKSApOworfQorCisvKioKKyAqIGUxMDAwX3Jlc2V0IC0gUHV0IGUxMDAwIE5JQyBpbiBrbm93biBpbml0aWFsIHN0YXRlCisgKgorICogQHYgYWRhcHRlcgllMTAwMCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworc3RhdGljIHZvaWQKK2UxMDAwX3Jlc2V0ICggc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgKQoreworCXVpbnQzMl90IHBiYSA9IDA7CisJdWludDE2X3QgZmNfaGlnaF93YXRlcl9tYXJrID0gRTEwMDBfRkNfSElHSF9ESUZGOworCisJREJHICggImUxMDAwX3Jlc2V0XG4iICk7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CisJY2FzZSBlMTAwMF84MjU0MzoKKwljYXNlIGUxMDAwXzgyNTQ0OgorCWNhc2UgZTEwMDBfODI1NDA6CisJY2FzZSBlMTAwMF84MjU0MToKKwljYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorCQlwYmEgPSBFMTAwMF9QQkFfNDhLOworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTQ1OgorCWNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisJY2FzZSBlMTAwMF84MjU0NjoKKwljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCQlwYmEgPSBFMTAwMF9QQkFfNDhLOworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTQ3OgorCWNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisJCXBiYSA9IEUxMDAwX1BCQV8zMEs7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NzE6CisJY2FzZSBlMTAwMF84MjU3MjoKKwljYXNlIGUxMDAwXzgwMDAzZXMybGFuOgorCQlwYmEgPSBFMTAwMF9QQkFfMzhLOworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTczOgorCQlwYmEgPSBFMTAwMF9QQkFfMjBLOworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTc2OgorCQlwYmEgPSBFMTAwMF9QQkFfNjRLOworCQlicmVhazsKKwljYXNlIGUxMDAwX2ljaDhsYW46CisJCXBiYSA9IEUxMDAwX1BCQV84SzsKKwljYXNlIGUxMDAwX3VuZGVmaW5lZDoKKwljYXNlIGUxMDAwX251bV9tYWNzOgorCQlicmVhazsKKwl9CisKKwlFMTAwMF9XUklURV9SRUcgKCAmYWRhcHRlci0+aHcsIFBCQSwgcGJhICk7CisJCisJLyogZmxvdyBjb250cm9sIHNldHRpbmdzICovCisJLyogU2V0IHRoZSBGQyBoaWdoIHdhdGVyIG1hcmsgdG8gOTAlIG9mIHRoZSBGSUZPIHNpemUuCisJICogUmVxdWlyZWQgdG8gY2xlYXIgbGFzdCAzIExTQiAqLworCWZjX2hpZ2hfd2F0ZXJfbWFyayA9ICgocGJhICogOTIxNikvMTApICYgMHhGRkY4OworCisJLyogV2UgY2FuJ3QgdXNlIDkwJSBvbiBzbWFsbCBGSUZPcyBiZWNhdXNlIHRoZSByZW1haW5kZXIKKwkgKiB3b3VsZCBiZSBsZXNzIHRoYW4gMSBmdWxsIGZyYW1lLiAgSW4gdGhpcyBjYXNlLCB3ZSBzaXplCisJICogaXQgdG8gYWxsb3cgYXQgbGVhc3QgYSBmdWxsIGZyYW1lIGFib3ZlIHRoZSBoaWdoIHdhdGVyCisJICogIG1hcmsuICovCisJaWYgKHBiYSA8IEUxMDAwX1BCQV8xNkspCisJCWZjX2hpZ2hfd2F0ZXJfbWFyayA9IChwYmEgKiAxMDI0KSAtIDE2MDA7CisKKwkvKiBUaGlzIGFjdHVhbGx5IGFwcGxpZXMgdG8gPCBlMTAwMF84MjU3NSwgb25lIHJldmlzaW9uIGxlc3MgdGhhbgorCSAqIGUxMDAwXzgyNTc2LCBidXQgZTEwMDBfODI1NzUgaXNuJ3QgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIGNvZGUgKi8KKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3NikgeworCQkvKiA4LWJ5dGUgZ3JhbnVsYXJpdHkgKi8KKwkJYWRhcHRlci0+aHcuZmNfaGlnaF93YXRlciA9IGZjX2hpZ2hfd2F0ZXJfbWFyayAmIDB4RkZGODsKKwkJYWRhcHRlci0+aHcuZmNfbG93X3dhdGVyID0gYWRhcHRlci0+aHcuZmNfaGlnaF93YXRlciAtIDg7CisJfSBlbHNlIHsKKwkJLyogMTYtYnl0ZSBncmFudWxhcml0eSAqLworCQlhZGFwdGVyLT5ody5mY19oaWdoX3dhdGVyID0gZmNfaGlnaF93YXRlcl9tYXJrICYgMHhGRkYwOworCQlhZGFwdGVyLT5ody5mY19sb3dfd2F0ZXIgPSBhZGFwdGVyLT5ody5mY19oaWdoX3dhdGVyIC0gMTY7CisJfQorCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuIHx8CisJICAgIGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTc2KQorCQlhZGFwdGVyLT5ody5mY19wYXVzZV90aW1lID0gMHhGRkZGOworCWVsc2UKKwkJYWRhcHRlci0+aHcuZmNfcGF1c2VfdGltZSA9IEUxMDAwX0ZDX1BBVVNFX1RJTUU7CisJYWRhcHRlci0+aHcuZmNfc2VuZF94b24gPSAxOworCWFkYXB0ZXItPmh3LmZjID0gYWRhcHRlci0+aHcub3JpZ2luYWxfZmM7CisJLyogQWxsb3cgdGltZSBmb3IgcGVuZGluZyBtYXN0ZXIgcmVxdWVzdHMgdG8gcnVuICovCisKKwllMTAwMF9yZXNldF9odyAoICZhZGFwdGVyLT5odyApOworCisJaWYgKCBhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCApCisJCUUxMDAwX1dSSVRFX1JFRyAoICZhZGFwdGVyLT5odywgV1VDLCAwICk7CisKKwlpZiAoIGUxMDAwX2luaXRfaHcgKCAmYWRhcHRlci0+aHcgKSApCisJCURCRyAoICJIYXJkd2FyZSBFcnJvclxuIiApOworCisJLyogaWYgKGFkYXB0ZXItPmh3ZmxhZ3MgJiBIV0ZMQUdTX1BIWV9QV1JfQklUKSB7ICovCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQ0ICYmCisJICAgIGFkYXB0ZXItPmh3Lm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yICYmCisJICAgIGFkYXB0ZXItPmh3LmF1dG9uZWcgPT0gMSAmJgorCSAgICBhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQURWRVJUSVNFXzEwMDBfRlVMTCkgeworCQl1aW50MzJfdCBjdHJsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMKTsKKwkJLyogY2xlYXIgcGh5IHBvd2VyIG1hbmFnZW1lbnQgYml0IGlmIHdlIGFyZSBpbiBnaWcgb25seSBtb2RlLAorCQkgKiB3aGljaCBpZiBlbmFibGVkIHdpbGwgYXR0ZW1wdCBuZWdvdGlhdGlvbiB0byAxMDBNYiwgd2hpY2gKKwkJICogY2FuIGNhdXNlIGEgbG9zcyBvZiBsaW5rIGF0IHBvd2VyIG9mZiBvciBkcml2ZXIgdW5sb2FkICovCisJCWN0cmwgJj0gfkUxMDAwX0NUUkxfU1dEUElOMzsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTCwgY3RybCk7CisJfQorCisJZTEwMDBfcGh5X2dldF9pbmZvICggJmFkYXB0ZXItPmh3LCAmYWRhcHRlci0+cGh5X2luZm8gKTsKKworCWlmICghYWRhcHRlci0+c21hcnRfcG93ZXJfZG93biAmJgorCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzEgfHwKKwkgICAgIGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTcyKSkgeworCQl1aW50MTZfdCBwaHlfZGF0YSA9IDA7CisJCS8qIHNwZWVkIHVwIHRpbWUgdG8gbGluayBieSBkaXNhYmxpbmcgc21hcnQgcG93ZXIgZG93biwgaWdub3JlCisJCSAqIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBiZWNhdXNlIHRoZXJlIGlzIG5vdGhpbmcKKwkJICogZGlmZmVyZW50IHdlIHdvdWxkIGRvIGlmIGl0IGZhaWxlZCAqLworCQllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBJR1AwMkUxMDAwX1BIWV9QT1dFUl9NR01ULAorCQkgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKwkJcGh5X2RhdGEgJj0gfklHUDAyRTEwMDBfUE1fU1BEOworCQllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwKKwkJICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisJfQorfQorCisvKiogRnVuY3Rpb25zIHRoYXQgaW1wbGVtZW50IHRoZSBnUFhFIGRyaXZlciBBUEkgKiovCisKKy8qKgorICogZTEwMDBfY2xvc2UgLSBEaXNhYmxlcyBhIG5ldHdvcmsgaW50ZXJmYWNlCisgKgorICogQHYgbmV0ZGV2CW5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiovCitzdGF0aWMgdm9pZAorZTEwMDBfY2xvc2UgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1aW50MzJfdCByY3RsOworCXVpbnQzMl90IGljcjsKKworCURCRyAoICJlMTAwMF9jbG9zZVxuIiApOworCQorCS8qIEFja25vd2xlZGdlIGludGVycnVwdHMgKi8KKwlpY3IgPSBFMTAwMF9SRUFEX1JFRyAoIGh3LCBJQ1IgKTsKKworCWUxMDAwX2lycV9kaXNhYmxlICggYWRhcHRlciApOworCisJLyogZGlzYWJsZSByZWNlaXZlcyAqLworCXJjdGwgPSBFMTAwMF9SRUFEX1JFRyAoIGh3LCBSQ1RMICk7CisJRTEwMDBfV1JJVEVfUkVHICggaHcsIFJDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTiApOworCUUxMDAwX1dSSVRFX0ZMVVNIICggaHcgKTsKKworCWUxMDAwX3Jlc2V0X2h3ICggaHcgKTsKKworCWUxMDAwX2ZyZWVfdHhfcmVzb3VyY2VzICggYWRhcHRlciApOworCWUxMDAwX2ZyZWVfcnhfcmVzb3VyY2VzICggYWRhcHRlciApOworfQorCisvKiogCisgKiBlMTAwMF90cmFuc21pdCAtIFRyYW5zbWl0IGEgcGFja2V0CisgKgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKgorICogQHJldCByYyAgICAgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50CitlMTAwMF90cmFuc21pdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KCBuZXRkZXYgKTsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVpbnQzMl90IHR4X2N1cnIgPSBhZGFwdGVyLT50eF90YWlsOworCXN0cnVjdCBlMTAwMF90eF9kZXNjICp0eF9jdXJyX2Rlc2M7CisKKwlEQkcgKCJlMTAwMF90cmFuc21pdFxuIik7CisJCisJaWYgKCBhZGFwdGVyLT50eF9maWxsX2N0ciA9PSBOVU1fVFhfREVTQyApIHsKKwkJREJHICgiVFggb3ZlcmZsb3dcbiIpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJLyogU2F2ZSBwb2ludGVyIHRvIGlvYnVmIHdlIGhhdmUgYmVlbiBnaXZlbiB0byB0cmFuc21pdCwKKwkgICBuZXRkZXZfdHhfY29tcGxldGUoKSB3aWxsIG5lZWQgaXQgbGF0ZXIKKwkgKi8KKwlhZGFwdGVyLT50eF9pb2J1Zlt0eF9jdXJyXSA9IGlvYnVmOworCisJdHhfY3Vycl9kZXNjID0gKCB2b2lkICogKSAoIGFkYXB0ZXItPnR4X2Jhc2UgKSArIAorCQkgICAgICAgKCB0eF9jdXJyICogc2l6ZW9mICggKmFkYXB0ZXItPnR4X2Jhc2UgKSApOyAKKworCURCRyAoICJ0eF9jdXJyX2Rlc2MgPSAlIzA4bHhcbiIsIHZpcnRfdG9fYnVzICggdHhfY3Vycl9kZXNjICkgKTsKKwlEQkcgKCAidHhfY3Vycl9kZXNjICsgMTYgPSAlIzA4bHhcbiIsIHZpcnRfdG9fYnVzICggdHhfY3Vycl9kZXNjICkgKyAxNiApOworCURCRyAoICJpb2J1Zi0+ZGF0YSA9ICUjMDhseFxuIiwgdmlydF90b19idXMgKCBpb2J1Zi0+ZGF0YSApICk7CisKKwkvKiBBZGQgdGhlIHBhY2tldCB0byBUWCByaW5nCisJICovCisgCXR4X2N1cnJfZGVzYy0+YnVmZmVyX2FkZHIgPSAKKwkJdmlydF90b19idXMgKCBpb2J1Zi0+ZGF0YSApOworCXR4X2N1cnJfZGVzYy0+bG93ZXIuZGF0YSA9IAorCQlFMTAwMF9UWERfQ01EX1JQUyAgfCBFMTAwMF9UWERfQ01EX0VPUCB8CisJCUUxMDAwX1RYRF9DTURfSUZDUyB8IGlvYl9sZW4gKCBpb2J1ZiApOworCXR4X2N1cnJfZGVzYy0+dXBwZXIuZGF0YSA9IDA7CisJCisJREJHICggIlRYIGZpbGw6ICVkIHR4X2N1cnI6ICVkIGFkZHI6ICUjMDhseCBsZW46ICV6ZFxuIiwgYWRhcHRlci0+dHhfZmlsbF9jdHIsIAorCSAgICAgIHR4X2N1cnIsIHZpcnRfdG9fYnVzICggaW9idWYtPmRhdGEgKSwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkgICAgICAKKwkvKiBQb2ludCB0byBuZXh0IGZyZWUgZGVzY3JpcHRvciAqLworCWFkYXB0ZXItPnR4X3RhaWwgPSAoIGFkYXB0ZXItPnR4X3RhaWwgKyAxICkgJSBOVU1fVFhfREVTQzsKKwlhZGFwdGVyLT50eF9maWxsX2N0cisrOworCisJLyogV3JpdGUgbmV3IHRhaWwgdG8gTklDLCBtYWtpbmcgcGFja2V0IGF2YWlsYWJsZSBmb3IgdHJhbnNtaXQKKwkgKi8KKwl3bWIoKTsKKwlFMTAwMF9XUklURV9SRUcgKCBodywgVERULCBhZGFwdGVyLT50eF90YWlsICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqIAorICogZTEwMDBfcG9sbCAtIFBvbGwgZm9yIHJlY2VpdmVkIHBhY2tldHMKKyAqCisgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQKK2UxMDAwX3BvbGwgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KCBuZXRkZXYgKTsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJdWludDMyX3QgaWNyOworCXVpbnQzMl90IHR4X3N0YXR1czsKKwl1aW50MzJfdCByeF9zdGF0dXM7CisJdWludDMyX3QgcnhfbGVuOworCXVpbnQzMl90IHJ4X2VycjsKKwlzdHJ1Y3QgZTEwMDBfdHhfZGVzYyAqdHhfY3Vycl9kZXNjOworCXN0cnVjdCBlMTAwMF9yeF9kZXNjICpyeF9jdXJyX2Rlc2M7CisJdWludDMyX3QgaTsKKworCURCR1AgKCAiZTEwMDBfcG9sbFxuIiApOworCisJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0cyAqLworCWljciA9IEUxMDAwX1JFQURfUkVHICggaHcsIElDUiApOworCWlmICggISBpY3IgKQorCQlyZXR1cm47CisJCQorICAgICAgICBEQkcgKCAiZTEwMDBfcG9sbDogaW50cl9zdGF0dXMgPSAlIzA4eFxuIiwgaWNyICk7CisKKwkvKiBDaGVjayBzdGF0dXMgb2YgdHJhbnNtaXR0ZWQgcGFja2V0cworCSAqLworCXdoaWxlICggKCBpID0gYWRhcHRlci0+dHhfaGVhZCApICE9IGFkYXB0ZXItPnR4X3RhaWwgKSB7CisJCQkKKwkJdHhfY3Vycl9kZXNjID0gKCB2b2lkICogKSAgKCBhZGFwdGVyLT50eF9iYXNlICkgKyAKKwkJCQkJICAgKCBpICogc2l6ZW9mICggKmFkYXB0ZXItPnR4X2Jhc2UgKSApOyAKKwkJCQkJICAgIAkJCisJCXR4X3N0YXR1cyA9IHR4X2N1cnJfZGVzYy0+dXBwZXIuZGF0YTsKKworCQkvKiBpZiB0aGUgcGFja2V0IGF0IHR4X2hlYWQgaXMgbm90IG93bmVkIGJ5IGhhcmR3YXJlIGl0IGlzIGZvciB1cyAqLworCQlpZiAoICEgKCB0eF9zdGF0dXMgJiBFMTAwMF9UWERfU1RBVF9ERCApICkKKwkJCWJyZWFrOworCQkKKwkJREJHICggIlNlbnQgcGFja2V0LiB0eF9oZWFkOiAlZCB0eF90YWlsOiAlZCB0eF9zdGF0dXM6ICUjMDh4XG4iLAorCSAgICAJICAgICAgYWRhcHRlci0+dHhfaGVhZCwgYWRhcHRlci0+dHhfdGFpbCwgdHhfc3RhdHVzICk7CisKKwkJaWYgKCB0eF9zdGF0dXMgJiAoIEUxMDAwX1RYRF9TVEFUX0VDIHwgRTEwMDBfVFhEX1NUQVRfTEMgfCAKKwkJCQkgICBFMTAwMF9UWERfU1RBVF9UVSApICkgeworCQkJbmV0ZGV2X3R4X2NvbXBsZXRlX2VyciAoIG5ldGRldiwgYWRhcHRlci0+dHhfaW9idWZbaV0sIC1FSU5WQUwgKTsKKwkJCURCRyAoICJFcnJvciB0cmFuc21pdHRpbmcgcGFja2V0LCB0eF9zdGF0dXM6ICUjMDh4XG4iLAorCQkJICAgICAgdHhfc3RhdHVzICk7CisJCX0gZWxzZSB7CisJCQluZXRkZXZfdHhfY29tcGxldGUgKCBuZXRkZXYsIGFkYXB0ZXItPnR4X2lvYnVmW2ldICk7CisJCQlEQkcgKCAiU3VjY2VzcyB0cmFuc21pdHRpbmcgcGFja2V0LCB0eF9zdGF0dXM6ICUjMDh4XG4iLAorCQkJICAgICAgdHhfc3RhdHVzICk7CisJCX0KKworCQkvKiBEZWNyZW1lbnQgY291bnQgb2YgdXNlZCBkZXNjcmlwdG9ycywgY2xlYXIgdGhpcyBkZXNjcmlwdG9yIAorCQkgKi8KKwkJYWRhcHRlci0+dHhfZmlsbF9jdHItLTsKKwkJbWVtc2V0ICggdHhfY3Vycl9kZXNjLCAwLCBzaXplb2YgKCAqdHhfY3Vycl9kZXNjICkgKTsKKwkJCisJCWFkYXB0ZXItPnR4X2hlYWQgPSAoIGFkYXB0ZXItPnR4X2hlYWQgKyAxICkgJSBOVU1fVFhfREVTQzsJCQorCX0KKwkKKwkvKiBQcm9jZXNzIHJlY2VpdmVkIHBhY2tldHMgCisJICovCisJd2hpbGUgKCAxICkgeworCQorCQlpID0gYWRhcHRlci0+cnhfY3VycjsKKwkJCisJCXJ4X2N1cnJfZGVzYyA9ICggdm9pZCAqICkgICggYWRhcHRlci0+cnhfYmFzZSApICsgCisJCQkgICAgICAgICAgKCBpICogc2l6ZW9mICggKmFkYXB0ZXItPnJ4X2Jhc2UgKSApOyAKKwkJcnhfc3RhdHVzID0gcnhfY3Vycl9kZXNjLT5zdGF0dXM7CisJCQorCQlEQkcyICggIkJlZm9yZSBERCBDaGVjayBSWF9zdGF0dXM6ICUjMDh4XG4iLCByeF9zdGF0dXMgKTsKKwkKKwkJaWYgKCAhICggcnhfc3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfREQgKSApCisJCQlicmVhazsKKworCQlpZiAoIGFkYXB0ZXItPnJ4X2lvYnVmW2ldID09IE5VTEwgKQorCQkJYnJlYWs7CisKKwkJREJHICggIlJDVEwgPSAlIzA4eFxuIiwgRTEwMDBfUkVBRF9SRUcgKCAmYWRhcHRlci0+aHcsIFJDVEwgKSApOworCQorCQlyeF9sZW4gPSByeF9jdXJyX2Rlc2MtPmxlbmd0aDsKKworICAgICAgICAgICAgICAgIERCRyAoICJSZWNlaXZlZCBwYWNrZXQsIHJ4X2N1cnI6ICVkICByeF9zdGF0dXM6ICUjMDh4ICByeF9sZW46ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGksIHJ4X3N0YXR1cywgcnhfbGVuICk7CisKKyAgICAgICAgICAgICAgICByeF9lcnIgPSByeF9jdXJyX2Rlc2MtPmVycm9yczsKKworCQlpb2JfcHV0ICggYWRhcHRlci0+cnhfaW9idWZbaV0sIHJ4X2xlbiApOworCisJCWlmICggcnhfZXJyICYgRTEwMDBfUlhEX0VSUl9GUkFNRV9FUlJfTUFTSyApIHsKKwkJCisJCQluZXRkZXZfcnhfZXJyICggbmV0ZGV2LCBhZGFwdGVyLT5yeF9pb2J1ZltpXSwgLUVJTlZBTCApOworCQkJREJHICggImUxMDAwX3BvbGw6IENvcnJ1cHRlZCBwYWNrZXQgcmVjZWl2ZWQhIgorCQkJICAgICAgIiByeF9lcnI6ICUjMDh4XG4iLCByeF9lcnIgKTsKKwkJfSBlbHNlIAl7CisJCQkvKiBBZGQgdGhpcyBwYWNrZXQgdG8gdGhlIHJlY2VpdmUgcXVldWUuICovCisJCQluZXRkZXZfcnggKCBuZXRkZXYsIGFkYXB0ZXItPnJ4X2lvYnVmW2ldICk7CisJCX0KKwkJYWRhcHRlci0+cnhfaW9idWZbaV0gPSBOVUxMOworCisJCW1lbXNldCAoIHJ4X2N1cnJfZGVzYywgMCwgc2l6ZW9mICggKnJ4X2N1cnJfZGVzYyApICk7CisKKwkJYWRhcHRlci0+cnhfY3VyciA9ICggYWRhcHRlci0+cnhfY3VyciArIDEgKSAlIE5VTV9SWF9ERVNDOworCX0KKwllMTAwMF9yZWZpbGxfcnhfcmluZyhhZGFwdGVyKTsKK30KKworLyoqCisgKiBlMTAwMF9pcnEgLSBlbmFibGUgb3IgRGlzYWJsZSBpbnRlcnJ1cHRzCisgKgorICogQHYgYWRhcHRlciAgIGUxMDAwIGFkYXB0ZXIKKyAqIEB2IGFjdGlvbiAgICByZXF1ZXN0ZWQgaW50ZXJydXB0IGFjdGlvbgorICoqLworc3RhdGljIHZvaWQgCitlMTAwMF9pcnEgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgZW5hYmxlICkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlEQkcgKCAiZTEwMDBfaXJxXG4iICk7CisKKwlpZiAoIGVuYWJsZSApCisJCWUxMDAwX2lycV9lbmFibGUgKCBhZGFwdGVyICk7CisJZWxzZQorCQllMTAwMF9pcnFfZGlzYWJsZSAoIGFkYXB0ZXIgKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgZTEwMDBfb3BlcmF0aW9uczsKKworLyoqCisgKiBlMTAwMF9wcm9iZSAtIEluaXRpYWwgY29uZmlndXJhdGlvbiBvZiBlMTAwMCBOSUMKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgaWQJUENJIElEcworICoKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKiovCitzdGF0aWMgaW50IAorZTEwMDBfcHJvYmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwKKwkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQgX191bnVzZWQgKQoreworCWludCBpLCBlcnI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIG1taW9fc3RhcnQsIG1taW9fbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhc2hfc3RhcnQsIGZsYXNoX2xlbjsKKworCURCRyAoICJlMTAwMF9wcm9iZVxuIiApOworCQorCWVyciA9IC1FTk9NRU07CisKKwkvKiBBbGxvY2F0ZSBuZXQgZGV2aWNlICggYWxzbyBhbGxvY2F0ZXMgbWVtb3J5IGZvciBuZXRkZXYtPnByaXYKKwkgICBhbmQgbWFrZXMgbmV0ZGV2LXByaXYgcG9pbnQgdG8gaXQgKSAqLworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2ICggc2l6ZW9mICggc3RydWN0IGUxMDAwX2FkYXB0ZXIgKSApOworCWlmICggISBuZXRkZXYgKSAKKwkJZ290byBlcnJfYWxsb2NfZXRoZXJkZXY7CisJCQorCS8qIEFzc29jaWF0ZSBlMTAwMC1zcGVjaWZpYyBuZXR3b3JrIG9wZXJhdGlvbnMgb3BlcmF0aW9ucyB3aXRoCisJICogZ2VuZXJpYyBuZXR3b3JrIGRldmljZSBsYXllciAqLworCW5ldGRldl9pbml0ICggbmV0ZGV2LCAmZTEwMDBfb3BlcmF0aW9ucyApOworCQorCS8qIEFzc29jaWF0ZSB0aGlzIG5ldHdvcmsgZGV2aWNlIHdpdGggZ2l2ZW4gUENJIGRldmljZSAqLworCXBjaV9zZXRfZHJ2ZGF0YSAoIHBkZXYsIG5ldGRldiApOworCW5ldGRldi0+ZGV2ID0gJnBkZXYtPmRldjsKKwkKKwkvKiBJbml0aWFsaXplIGRyaXZlciBwcml2YXRlIHN0b3JhZ2UgKi8JCQorCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworICAgICAgICBtZW1zZXQgKCBhZGFwdGVyLCAwLCAoIHNpemVvZiAoICphZGFwdGVyICkgKSApOworCQorICAgICAgICBhZGFwdGVyLT5ody5pb19iYXNlID0gcGRldi0+aW9hZGRyOworCWFkYXB0ZXItPmlvYWRkciAgICAgPSBwZGV2LT5pb2FkZHI7CisgICAgICAgIGFkYXB0ZXItPmlycW5vICAgICAgPSBwZGV2LT5pcnE7CisJYWRhcHRlci0+bmV0ZGV2ICAgICA9IG5ldGRldjsKKwlhZGFwdGVyLT5wZGV2ICAgICAgID0gcGRldjsKKwlhZGFwdGVyLT5ody5iYWNrICAgID0gYWRhcHRlcjsKKworCWFkYXB0ZXItPnR4X3Jpbmdfc2l6ZSA9IHNpemVvZiAoICphZGFwdGVyLT50eF9iYXNlICkgKiBOVU1fVFhfREVTQzsKKwlhZGFwdGVyLT5yeF9yaW5nX3NpemUgPSBzaXplb2YgKCAqYWRhcHRlci0+cnhfYmFzZSApICogTlVNX1JYX0RFU0M7CisKKwltbWlvX3N0YXJ0ID0gcGNpX2Jhcl9zdGFydCAoIHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCApOworCW1taW9fbGVuICAgPSBwY2lfYmFyX3NpemUgICggcGRldiwgUENJX0JBU0VfQUREUkVTU18wICk7CisKKwlEQkcgKCAibW1pb19zdGFydDogJSMwOGx4XG4iLCBtbWlvX3N0YXJ0ICk7CisJREJHICggIm1taW9fbGVuOiAlIzA4bHhcbiIsIG1taW9fbGVuICk7CisJCisJLyogRml4IHVwIFBDSSBkZXZpY2UgKi8KKwlhZGp1c3RfcGNpX2RldmljZSAoIHBkZXYgKTsKKworCWVyciA9IC1FSU87CisKKwlhZGFwdGVyLT5ody5od19hZGRyID0gaW9yZW1hcCAoIG1taW9fc3RhcnQsIG1taW9fbGVuICk7CisJREJHICggImFkYXB0ZXItPmh3Lmh3X2FkZHI6ICVwXG4iLCBhZGFwdGVyLT5ody5od19hZGRyICk7CisJCisJaWYgKCAhIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKQorCQlnb3RvIGVycl9pb3JlbWFwOworCisJLyogc2V0dXAgdGhlIHByaXZhdGUgc3RydWN0dXJlICovCisJaWYgKCAoIGVyciA9IGUxMDAwX3N3X2luaXQgKCBhZGFwdGVyICkgKSApCisJCWdvdG8gZXJyX3N3X2luaXQ7CisKKwlEQkcgKCAiYWRhcHRlci0+aHcubWFjX3R5cGU6ICUjMDh4XG4iLCBhZGFwdGVyLT5ody5tYWNfdHlwZSApOworCisJLyogRmxhc2ggQkFSIG1hcHBpbmcgbXVzdCBoYXBwZW4gYWZ0ZXIgZTEwMDBfc3dfaW5pdAorCSAqIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBtYWNfdHlwZSAKKwkgKi8KKwlpZiAoICggYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbiApICYmICggcGRldi0+aW9hZGRyICkgKSB7CisJCWZsYXNoX3N0YXJ0ID0gcGNpX2Jhcl9zdGFydCAoIHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSApOworCQlmbGFzaF9sZW4gPSBwY2lfYmFyX3NpemUgKCBwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEgKTsKKwkJYWRhcHRlci0+aHcuZmxhc2hfYWRkcmVzcyA9IGlvcmVtYXAgKCBmbGFzaF9zdGFydCwgZmxhc2hfbGVuICk7CisJCWlmICggISBhZGFwdGVyLT5ody5mbGFzaF9hZGRyZXNzICkKKwkJCWdvdG8gZXJyX2ZsYXNobWFwOworCX0KKworCS8qIGluaXRpYWxpemUgZWVwcm9tIHBhcmFtZXRlcnMgKi8KKwlpZiAoIGUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyAoICZhZGFwdGVyLT5odyApICkgeworCQlEQkcgKCAiRUVQUk9NIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIiApOworCQlnb3RvIGVycl9lZXByb207CisJfQorCisJLyogYmVmb3JlIHJlYWRpbmcgdGhlIEVFUFJPTSwgcmVzZXQgdGhlIGNvbnRyb2xsZXIgdG8KKwkgKiBwdXQgdGhlIGRldmljZSBpbiBhIGtub3duIGdvb2Qgc3RhcnRpbmcgc3RhdGUgCisJICovCisJZXJyID0gZTEwMDBfcmVzZXRfaHcgKCAmYWRhcHRlci0+aHcgKTsKKwlpZiAoIGVyciA8IDAgKSB7CisJCURCRyAoICJIYXJkd2FyZSBJbml0aWFsaXphdGlvbiBGYWlsZWRcbiIgKTsKKwkJZ290byBlcnJfcmVzZXQ7CisJfQorCisJLyogbWFrZSBzdXJlIHRoZSBFRVBST00gaXMgZ29vZCAqLworCWlmICggZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKCAmYWRhcHRlci0+aHcgKSA8IDAgKSB7CisJCURCRyAoICJUaGUgRUVQUk9NIENoZWNrc3VtIElzIE5vdCBWYWxpZFxuIiApOworCQlnb3RvIGVycl9lZXByb207CisJfQorCisJLyogY29weSB0aGUgTUFDIGFkZHJlc3Mgb3V0IG9mIHRoZSBFRVBST00gKi8KKwlpZiAoIGUxMDAwX3JlYWRfbWFjX2FkZHIgKCAmYWRhcHRlci0+aHcgKSApCisJCURCRyAoICJFRVBST00gUmVhZCBFcnJvclxuIiApOworCisgICAgICAgIG1lbWNweSAoIG5ldGRldi0+aHdfYWRkciwgYWRhcHRlci0+aHcubWFjX2FkZHIsIEVUSF9BTEVOICk7CisKKwkvKiBwcmludCBidXMgdHlwZS9zcGVlZC93aWR0aCBpbmZvICovCisJeworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJREJHICggIihQQ0klczolczolcykgIiwKKwkgICAgICAoKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2l4KSA/ICItWCIgOgorCSAgICAgICAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzID8gIiBFeHByZXNzIjoiIikpLAorCSAgICAgICgoaHctPmJ1c19zcGVlZCA9PSBlMTAwMF9idXNfc3BlZWRfMjUwMCkgPyAiMi41R2IvcyIgOgorCSAgICAgICAoaHctPmJ1c19zcGVlZCA9PSBlMTAwMF9idXNfc3BlZWRfMTMzKSA/ICIxMzNNSHoiIDoKKwkgICAgICAgKGh3LT5idXNfc3BlZWQgPT0gZTEwMDBfYnVzX3NwZWVkXzEyMCkgPyAiMTIwTUh6IiA6CisJICAgICAgIChody0+YnVzX3NwZWVkID09IGUxMDAwX2J1c19zcGVlZF8xMDApID8gIjEwME1IeiIgOgorCSAgICAgICAoaHctPmJ1c19zcGVlZCA9PSBlMTAwMF9idXNfc3BlZWRfNjYpID8gIjY2TUh6IiA6ICIzM01IeiIpLAorICAJICAgICAgKChody0+YnVzX3dpZHRoID09IGUxMDAwX2J1c193aWR0aF82NCkgPyAiNjQtYml0IiA6CisgIAkgICAgICAgKGh3LT5idXNfd2lkdGggPT0gZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzQpID8gIldpZHRoIHg0IiA6CisJICAgICAgIChody0+YnVzX3dpZHRoID09IGUxMDAwX2J1c193aWR0aF9wY2lleF8xKSA/ICJXaWR0aCB4MSIgOgorCSAgICAgICAiMzItYml0IikpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlEQkcgKCIlMDJ4JXMiLCBuZXRkZXYtPmxsX2FkZHJbaV0sIGkgPT0gNSA/ICJcbiIgOiAiOiIpOworICAgICAgICAKKwkvKiByZXNldCB0aGUgaGFyZHdhcmUgd2l0aCB0aGUgbmV3IHNldHRpbmdzICovCisJZTEwMDBfcmVzZXQgKCBhZGFwdGVyICk7CisJCisJZTEwMDBfZ2V0X2h3X2NvbnRyb2wgKCBhZGFwdGVyICk7CisKKwkvKiBNYXJrIGFzIGxpbmsgdXA7IHdlIGRvbid0IHlldCBoYW5kbGUgbGluayBzdGF0ZSAqLworCW5ldGRldl9saW5rX3VwICggbmV0ZGV2ICk7CisKKwlpZiAoICggZXJyID0gcmVnaXN0ZXJfbmV0ZGV2ICggbmV0ZGV2ICkgKSAhPSAwKQorCQlnb3RvIGVycl9yZWdpc3RlcjsKKwkJCisJREJHICggImUxMDAwX3Byb2JlIHN1Y2NlZWRlZCFcbiIgKTsJCisKKwkvKiBObyBlcnJvcnMsIHJldHVybiBzdWNjZXNzICovCisJcmV0dXJuIDA7CisKKy8qIEVycm9yIHJldHVybiBwYXRocyAqLworZXJyX3Jlc2V0OgorZXJyX3JlZ2lzdGVyOgorZXJyX2VlcHJvbToKKwlpZiAoICEgZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrICggJmFkYXB0ZXItPmh3ICkgKQorCQllMTAwMF9waHlfaHdfcmVzZXQgKCAmYWRhcHRlci0+aHcgKTsKKwlpZiAoIGFkYXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MgKQorCQlpb3VubWFwICggYWRhcHRlci0+aHcuZmxhc2hfYWRkcmVzcyApOworZXJyX2ZsYXNobWFwOgorZXJyX3N3X2luaXQ6CisJaW91bm1hcCAoIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKTsKK2Vycl9pb3JlbWFwOgorCW5ldGRldl9wdXQgKCBuZXRkZXYgKTsKK2Vycl9hbGxvY19ldGhlcmRldjoKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGUxMDAwX3JlbW92ZSAtIERldmljZSBSZW1vdmFsIFJvdXRpbmUKKyAqCisgKiBAdiBwZGV2IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CisgKgorICoqLworc3RhdGljIHZvaWQKK2UxMDAwX3JlbW92ZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhICggcGRldiApOworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKwkKKwlEQkcgKCAiZTEwMDBfcmVtb3ZlXG4iICk7CisKKwlpZiAoIGFkYXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MgKQorCQlpb3VubWFwICggYWRhcHRlci0+aHcuZmxhc2hfYWRkcmVzcyApOworCWlmICAoIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKQorCQlpb3VubWFwICggYWRhcHRlci0+aHcuaHdfYWRkciApOworCisJdW5yZWdpc3Rlcl9uZXRkZXYgKCBuZXRkZXYgKTsKKwllMTAwMF9yZXNldF9odyAoICZhZGFwdGVyLT5odyApOworCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworfQorCisvKioKKyAqIGUxMDAwX29wZW4gLSBDYWxsZWQgd2hlbiBhIG5ldHdvcmsgaW50ZXJmYWNlIGlzIG1hZGUgYWN0aXZlCisgKgorICogQHYgbmV0ZGV2CW5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlLCAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUKKyAqCisgKiovCitzdGF0aWMgaW50CitlMTAwMF9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnI7CisJCisJREJHICggImUxMDAwX29wZW5cbiIgKTsJCisKKwkvKiBhbGxvY2F0ZSB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworCWVyciA9IGUxMDAwX3NldHVwX3R4X3Jlc291cmNlcyAoIGFkYXB0ZXIgKTsKKwlpZiAoIGVyciApIHsKKwkJREJHICggIkVycm9yIHNldHRpbmcgdXAgVFggcmVzb3VyY2VzIVxuIiApOworCQlnb3RvIGVycl9zZXR1cF90eDsKKwl9CisKKwkvKiBhbGxvY2F0ZSByZWNlaXZlIGRlc2NyaXB0b3JzICovCisJZXJyID0gZTEwMDBfc2V0dXBfcnhfcmVzb3VyY2VzICggYWRhcHRlciApOworCWlmICggZXJyICkgeworCQlEQkcgKCAiRXJyb3Igc2V0dGluZyB1cCBSWCByZXNvdXJjZXMhXG4iICk7CisJCWdvdG8gZXJyX3NldHVwX3J4OworCX0KKworCWUxMDAwX2NvbmZpZ3VyZV90eCAoIGFkYXB0ZXIgKTsKKworCWUxMDAwX2NvbmZpZ3VyZV9yeCAoIGFkYXB0ZXIgKTsKKwkKKyAgICAgICAgREJHICggIlJYRENUTDogJSMwOHhcbiIsICBFMTAwMF9SRUFEX1JFRyAoICZhZGFwdGVyLT5odywgUlhEQ1RMICkgKTsKKworCXJldHVybiAwOworCitlcnJfc2V0dXBfcng6CisJZTEwMDBfZnJlZV90eF9yZXNvdXJjZXMgKCBhZGFwdGVyICk7CitlcnJfc2V0dXBfdHg6CisJZTEwMDBfcmVzZXQgKCBhZGFwdGVyICk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiogZTEwMDAgbmV0IGRldmljZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BlcmF0aW9ucyBlMTAwMF9vcGVyYXRpb25zID0geworICAgICAgICAub3BlbiAgICAgICAgICAgPSBlMTAwMF9vcGVuLAorICAgICAgICAuY2xvc2UgICAgICAgICAgPSBlMTAwMF9jbG9zZSwKKyAgICAgICAgLnRyYW5zbWl0ICAgICAgID0gZTEwMDBfdHJhbnNtaXQsCisgICAgICAgIC5wb2xsICAgICAgICAgICA9IGUxMDAwX3BvbGwsCisgICAgICAgIC5pcnEgICAgICAgICAgICA9IGUxMDAwX2lycSwKK307CisKK2ludDMyX3QKK2UxMDAwX3JlYWRfcGNpZV9jYXBfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZywgdWludDE2X3QgKnZhbHVlKQoreworICAgIHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7CisgICAgdWludDE2X3QgY2FwX29mZnNldDsKKworI2RlZmluZSAgUENJX0NBUF9JRF9FWFAgICAgICAgIDB4MTAgICAgLyogUENJIEV4cHJlc3MgKi8KKyAgICBjYXBfb2Zmc2V0ID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShhZGFwdGVyLT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisgICAgaWYgKCFjYXBfb2Zmc2V0KQorICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisKKyAgICBwY2lfcmVhZF9jb25maWdfd29yZChhZGFwdGVyLT5wZGV2LCBjYXBfb2Zmc2V0ICsgcmVnLCB2YWx1ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZAorZTEwMDBfcGNpX2NsZWFyX213aSAoIHN0cnVjdCBlMTAwMF9odyAqaHcgKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQgKCBhZGFwdGVyLT5wZGV2LCBQQ0lfQ09NTUFORCwKKwkJCSAgICAgICAgaHctPnBjaV9jbWRfd29yZCAmIH5QQ0lfQ09NTUFORF9JTlZBTElEQVRFICk7Cit9CisKK3ZvaWQKK2UxMDAwX3BjaV9zZXRfbXdpICggc3RydWN0IGUxMDAwX2h3ICpodyApCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBody0+YmFjazsKKworCXBjaV93cml0ZV9jb25maWdfd29yZCAoIGFkYXB0ZXItPnBkZXYsIFBDSV9DT01NQU5ELCBody0+cGNpX2NtZF93b3JkICk7Cit9CisKK3ZvaWQKK2UxMDAwX3JlYWRfcGNpX2NmZyAoIHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZywgdWludDE2X3QgKnZhbHVlICkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5iYWNrOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQgKCBhZGFwdGVyLT5wZGV2LCByZWcsIHZhbHVlICk7Cit9CisKK3ZvaWQKK2UxMDAwX3dyaXRlX3BjaV9jZmcgKCBzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCByZWcsIHVpbnQxNl90ICp2YWx1ZSApCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBody0+YmFjazsKKworCXBjaV93cml0ZV9jb25maWdfd29yZCAoIGFkYXB0ZXItPnBkZXYsIHJlZywgKnZhbHVlICk7Cit9CisKK3ZvaWQKK2UxMDAwX2lvX3dyaXRlICggc3RydWN0IGUxMDAwX2h3ICpodyAgX191bnVzZWQsIHVuc2lnbmVkIGxvbmcgcG9ydCwgdWludDMyX3QgdmFsdWUgKQoreworCW91dGwgKCB2YWx1ZSwgcG9ydCApOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZTEwMDBfbmljc1tdID0geworCVBDSV9ST00oMHg4MDg2LCAweDEwMDAsICJlMTAwMC0weDEwMDAiLCAiZTEwMDAtMHgxMDAwIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTAwMSwgImUxMDAwLTB4MTAwMSIsICJlMTAwMC0weDEwMDEiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDA0LCAiZTEwMDAtMHgxMDA0IiwgImUxMDAwLTB4MTAwNCIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwMDgsICJlMTAwMC0weDEwMDgiLCAiZTEwMDAtMHgxMDA4IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTAwOSwgImUxMDAwLTB4MTAwOSIsICJlMTAwMC0weDEwMDkiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDBjLCAiZTEwMDAtMHgxMDBjIiwgImUxMDAwLTB4MTAwYyIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwMGQsICJlMTAwMC0weDEwMGQiLCAiZTEwMDAtMHgxMDBkIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTAwZSwgImUxMDAwLTB4MTAwZSIsICJlMTAwMC0weDEwMGUiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDBmLCAiZTEwMDAtMHgxMDBmIiwgImUxMDAwLTB4MTAwZiIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwMTAsICJlMTAwMC0weDEwMTAiLCAiZTEwMDAtMHgxMDEwIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTAxMSwgImUxMDAwLTB4MTAxMSIsICJlMTAwMC0weDEwMTEiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDEyLCAiZTEwMDAtMHgxMDEyIiwgImUxMDAwLTB4MTAxMiIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwMTMsICJlMTAwMC0weDEwMTMiLCAiZTEwMDAtMHgxMDEzIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTAxNCwgImUxMDAwLTB4MTAxNCIsICJlMTAwMC0weDEwMTQiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDE1LCAiZTEwMDAtMHgxMDE1IiwgImUxMDAwLTB4MTAxNSIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwMTYsICJlMTAwMC0weDEwMTYiLCAiZTEwMDAtMHgxMDE2IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTAxNywgImUxMDAwLTB4MTAxNyIsICJlMTAwMC0weDEwMTciLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDE4LCAiZTEwMDAtMHgxMDE4IiwgImUxMDAwLTB4MTAxOCIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwMTksICJlMTAwMC0weDEwMTkiLCAiZTEwMDAtMHgxMDE5IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTAxYSwgImUxMDAwLTB4MTAxYSIsICJlMTAwMC0weDEwMWEiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDFkLCAiZTEwMDAtMHgxMDFkIiwgImUxMDAwLTB4MTAxZCIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwMWUsICJlMTAwMC0weDEwMWUiLCAiZTEwMDAtMHgxMDFlIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTAyNiwgImUxMDAwLTB4MTAyNiIsICJlMTAwMC0weDEwMjYiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDI3LCAiZTEwMDAtMHgxMDI3IiwgImUxMDAwLTB4MTAyNyIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwMjgsICJlMTAwMC0weDEwMjgiLCAiZTEwMDAtMHgxMDI4IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTA0OSwgImUxMDAwLTB4MTA0OSIsICJlMTAwMC0weDEwNDkiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDRhLCAiZTEwMDAtMHgxMDRhIiwgImUxMDAwLTB4MTA0YSIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwNGIsICJlMTAwMC0weDEwNGIiLCAiZTEwMDAtMHgxMDRiIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTA0YywgImUxMDAwLTB4MTA0YyIsICJlMTAwMC0weDEwNGMiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDRkLCAiZTEwMDAtMHgxMDRkIiwgImUxMDAwLTB4MTA0ZCIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwNWUsICJlMTAwMC0weDEwNWUiLCAiZTEwMDAtMHgxMDVlIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTA1ZiwgImUxMDAwLTB4MTA1ZiIsICJlMTAwMC0weDEwNWYiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDYwLCAiZTEwMDAtMHgxMDYwIiwgImUxMDAwLTB4MTA2MCIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwNzUsICJlMTAwMC0weDEwNzUiLCAiZTEwMDAtMHgxMDc1IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTA3NiwgImUxMDAwLTB4MTA3NiIsICJlMTAwMC0weDEwNzYiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDc3LCAiZTEwMDAtMHgxMDc3IiwgImUxMDAwLTB4MTA3NyIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwNzgsICJlMTAwMC0weDEwNzgiLCAiZTEwMDAtMHgxMDc4IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTA3OSwgImUxMDAwLTB4MTA3OSIsICJlMTAwMC0weDEwNzkiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDdhLCAiZTEwMDAtMHgxMDdhIiwgImUxMDAwLTB4MTA3YSIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwN2IsICJlMTAwMC0weDEwN2IiLCAiZTEwMDAtMHgxMDdiIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTA3YywgImUxMDAwLTB4MTA3YyIsICJlMTAwMC0weDEwN2MiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDdkLCAiZTEwMDAtMHgxMDdkIiwgImUxMDAwLTB4MTA3ZCIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwN2UsICJlMTAwMC0weDEwN2UiLCAiZTEwMDAtMHgxMDdlIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTA3ZiwgImUxMDAwLTB4MTA3ZiIsICJlMTAwMC0weDEwN2YiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDhhLCAiZTEwMDAtMHgxMDhhIiwgImUxMDAwLTB4MTA4YSIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwOGIsICJlMTAwMC0weDEwOGIiLCAiZTEwMDAtMHgxMDhiIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTA4YywgImUxMDAwLTB4MTA4YyIsICJlMTAwMC0weDEwOGMiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDk2LCAiZTEwMDAtMHgxMDk2IiwgImUxMDAwLTB4MTA5NiIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwOTgsICJlMTAwMC0weDEwOTgiLCAiZTEwMDAtMHgxMDk4IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTA5OSwgImUxMDAwLTB4MTA5OSIsICJlMTAwMC0weDEwOTkiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMDlhLCAiZTEwMDAtMHgxMDlhIiwgImUxMDAwLTB4MTA5YSIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwYTQsICJlMTAwMC0weDEwYTQiLCAiZTEwMDAtMHgxMGE0IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTBhNSwgImUxMDAwLTB4MTBhNSIsICJlMTAwMC0weDEwYTUiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMGI1LCAiZTEwMDAtMHgxMGI1IiwgImUxMDAwLTB4MTBiNSIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwYjksICJlMTAwMC0weDEwYjkiLCAiZTEwMDAtMHgxMGI5IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTBiYSwgImUxMDAwLTB4MTBiYSIsICJlMTAwMC0weDEwYmEiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMGJiLCAiZTEwMDAtMHgxMGJiIiwgImUxMDAwLTB4MTBiYiIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwYmMsICJlMTAwMC0weDEwYmMiLCAiZTEwMDAtMHgxMGJjIiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTBjNCwgImUxMDAwLTB4MTBjNCIsICJlMTAwMC0weDEwYzQiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMGM1LCAiZTEwMDAtMHgxMGM1IiwgImUxMDAwLTB4MTBjNSIsIDApLAorCVBDSV9ST00oMHg4MDg2LCAweDEwYzksICJlMTAwMC0weDEwYzkiLCAiZTEwMDAtMHgxMGM5IiwgMCksCisJUENJX1JPTSgweDgwODYsIDB4MTBkOSwgImUxMDAwLTB4MTBkOSIsICJlMTAwMC0weDEwZDkiLCAwKSwKKwlQQ0lfUk9NKDB4ODA4NiwgMHgxMGRhLCAiZTEwMDAtMHgxMGRhIiwgImUxMDAwLTB4MTBkYSIsIDApLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgZTEwMDBfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzID0gZTEwMDBfbmljcywKKwkuaWRfY291bnQgPSAoc2l6ZW9mIChlMTAwMF9uaWNzKSAvIHNpemVvZiAoZTEwMDBfbmljc1swXSkpLAorCS5wcm9iZSA9IGUxMDAwX3Byb2JlLAorCS5yZW1vdmUgPSBlMTAwMF9yZW1vdmUsCit9OworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1MWRiNgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKQEAgLTAsMCArMSwzMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgSW50ZWwgUFJPLzEwMDAgTGludXggZHJpdmVyCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKy8qIExpbnV4IFBSTy8xMDAwIEV0aGVybmV0IERyaXZlciBtYWluIGhlYWRlciBmaWxlICovCisKKyNpZm5kZWYgX0UxMDAwX0hfCisjZGVmaW5lIF9FMTAwMF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxncHhlL2lvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorCisjZGVmaW5lIEJBUl8wCQkwCisjZGVmaW5lIEJBUl8xCQkxCisjZGVmaW5lIEJBUl81CQk1CisKK3N0cnVjdCBlMTAwMF9hZGFwdGVyOworCisjaW5jbHVkZSAiZTEwMDBfaHcuaCIKKworLyogU3VwcG9ydGVkIFJ4IEJ1ZmZlciBTaXplcyAqLworI2RlZmluZSBFMTAwMF9SWEJVRkZFUl8xMjggICAxMjggICAgLyogVXNlZCBmb3IgcGFja2V0IHNwbGl0ICovCisjZGVmaW5lIEUxMDAwX1JYQlVGRkVSXzI1NiAgIDI1NiAgICAvKiBVc2VkIGZvciBwYWNrZXQgc3BsaXQgKi8KKyNkZWZpbmUgRTEwMDBfUlhCVUZGRVJfNTEyICAgNTEyCisjZGVmaW5lIEUxMDAwX1JYQlVGRkVSXzEwMjQgIDEwMjQKKyNkZWZpbmUgRTEwMDBfUlhCVUZGRVJfMjA0OCAgMjA0OAorI2RlZmluZSBFMTAwMF9SWEJVRkZFUl80MDk2ICA0MDk2CisjZGVmaW5lIEUxMDAwX1JYQlVGRkVSXzgxOTIgIDgxOTIKKyNkZWZpbmUgRTEwMDBfUlhCVUZGRVJfMTYzODQgMTYzODQKKworLyogU21hcnRTcGVlZCBkZWxpbWl0ZXJzICovCisjZGVmaW5lIEUxMDAwX1NNQVJUU1BFRURfRE9XTlNISUZUIDMKKyNkZWZpbmUgRTEwMDBfU01BUlRTUEVFRF9NQVggICAgICAgMTUKKworLyogUGFja2V0IEJ1ZmZlciBhbGxvY2F0aW9ucyAqLworI2RlZmluZSBFMTAwMF9QQkFfQllURVNfU0hJRlQgMHhBCisjZGVmaW5lIEUxMDAwX1RYX0hFQURfQUREUl9TSElGVCA3CisjZGVmaW5lIEUxMDAwX1BCQV9UWF9NQVNLIDB4RkZGRjAwMDAKKworLyogRmxvdyBDb250cm9sIFdhdGVybWFya3MgKi8KKyNkZWZpbmUgRTEwMDBfRkNfSElHSF9ESUZGIDB4MTYzOCAgLyogSGlnaDogNTY4OCBieXRlcyBiZWxvdyBSeCBGSUZPIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfRkNfTE9XX0RJRkYgMHgxNjQwICAgLyogTG93OiAgNTY5NiBieXRlcyBiZWxvdyBSeCBGSUZPIHNpemUgKi8KKworI2RlZmluZSBFMTAwMF9GQ19QQVVTRV9USU1FIDB4MDY4MCAvKiA4NTggdXNlYyAqLworCisvKiB0aGlzIGlzIHRoZSBzaXplIHBhc3Qgd2hpY2ggaGFyZHdhcmUgd2lsbCBkcm9wIHBhY2tldHMgd2hlbiBzZXR0aW5nIExQRT0wICovCisjZGVmaW5lIE1BWElNVU1fRVRIRVJORVRfVkxBTl9TSVpFIDE1MjIKKworLyogSG93IG1hbnkgVHggRGVzY3JpcHRvcnMgZG8gd2UgbmVlZCB0byBjYWxsIG5ldGlmX3dha2VfcXVldWUgPyAqLworI2RlZmluZSBFMTAwMF9UWF9RVUVVRV9XQUtFCTE2CisvKiBIb3cgbWFueSBSeCBCdWZmZXJzIGRvIHdlIGJ1bmRsZSBpbnRvIG9uZSB3cml0ZSB0byB0aGUgaGFyZHdhcmUgPyAqLworI2RlZmluZSBFMTAwMF9SWF9CVUZGRVJfV1JJVEUJMTYJLyogTXVzdCBiZSBwb3dlciBvZiAyICovCisKKyNkZWZpbmUgQVVUT19BTExfTU9ERVMgICAgICAgICAgICAwCisjZGVmaW5lIEUxMDAwX0VFUFJPTV84MjU0NF9BUE0gICAgMHgwMDA0CisjZGVmaW5lIEUxMDAwX0VFUFJPTV9JQ0g4X0FQTUUgICAgMHgwMDA0CisjZGVmaW5lIEUxMDAwX0VFUFJPTV9BUE1FICAgICAgICAgMHgwNDAwCisKKyNpZm5kZWYgRTEwMDBfTUFTVEVSX1NMQVZFCisvKiBTd2l0Y2ggdG8gb3ZlcnJpZGUgUEhZIG1hc3Rlci9zbGF2ZSBzZXR0aW5nICovCisjZGVmaW5lIEUxMDAwX01BU1RFUl9TTEFWRQllMTAwMF9tc19od19kZWZhdWx0CisjZW5kaWYKKworLyogd3JhcHBlciBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlciwKKyAqIHNvIGEgRE1BIGhhbmRsZSBjYW4gYmUgc3RvcmVkIGFsb25nIHdpdGggdGhlIGJ1ZmZlciAqLworc3RydWN0IGUxMDAwX2J1ZmZlciB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIHRpbWVfc3RhbXA7CisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQxNl90IG5leHRfdG9fd2F0Y2g7Cit9OworCitzdHJ1Y3QgZTEwMDBfdHhfcmluZyB7CisJLyogcG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciByaW5nIG1lbW9yeSAqLworCXZvaWQgKmRlc2M7CisJLyogbGVuZ3RoIG9mIGRlc2NyaXB0b3IgcmluZyBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBzaXplOworCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLworCXVuc2lnbmVkIGludCBjb3VudDsKKwkvKiBuZXh0IGRlc2NyaXB0b3IgdG8gYXNzb2NpYXRlIGEgYnVmZmVyIHdpdGggKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF90b191c2U7CisJLyogbmV4dCBkZXNjcmlwdG9yIHRvIGNoZWNrIGZvciBERCBzdGF0dXMgYml0ICovCisJdW5zaWduZWQgaW50IG5leHRfdG9fY2xlYW47CisJLyogYXJyYXkgb2YgYnVmZmVyIGluZm9ybWF0aW9uIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKKworCXVpbnQxNl90IHRkaDsKKwl1aW50MTZfdCB0ZHQ7CisJYm9vbGVhbl90IGxhc3RfdHhfdHNvOworfTsKKworc3RydWN0IGUxMDAwX3J4X3JpbmcgeworCS8qIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3IgcmluZyBtZW1vcnkgKi8KKwl2b2lkICpkZXNjOworCS8qIGxlbmd0aCBvZiBkZXNjcmlwdG9yIHJpbmcgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkvKiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJLyogbmV4dCBkZXNjcmlwdG9yIHRvIGFzc29jaWF0ZSBhIGJ1ZmZlciB3aXRoICovCisJdW5zaWduZWQgaW50IG5leHRfdG9fdXNlOworCS8qIG5leHQgZGVzY3JpcHRvciB0byBjaGVjayBmb3IgREQgc3RhdHVzIGJpdCAqLworCXVuc2lnbmVkIGludCBuZXh0X3RvX2NsZWFuOworCS8qIGFycmF5IG9mIGJ1ZmZlciBpbmZvcm1hdGlvbiBzdHJ1Y3RzICovCisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CisJLyogYXJyYXlzIG9mIHBhZ2UgaW5mb3JtYXRpb24gZm9yIHBhY2tldCBzcGxpdCAqLworCXN0cnVjdCBlMTAwMF9wc19wYWdlICpwc19wYWdlOworCXN0cnVjdCBlMTAwMF9wc19wYWdlX2RtYSAqcHNfcGFnZV9kbWE7CisKKwkvKiBjcHUgZm9yIHJ4IHF1ZXVlICovCisJaW50IGNwdTsKKworCXVpbnQxNl90IHJkaDsKKwl1aW50MTZfdCByZHQ7Cit9OworCisjZGVmaW5lIEUxMDAwX0RFU0NfVU5VU0VEKFIpIFwKKwkoKCgoUiktPm5leHRfdG9fY2xlYW4gPiAoUiktPm5leHRfdG9fdXNlKSA/IDAgOiAoUiktPmNvdW50KSArIFwKKwkoUiktPm5leHRfdG9fY2xlYW4gLSAoUiktPm5leHRfdG9fdXNlIC0gMSkKKworI2RlZmluZSBFMTAwMF9SWF9ERVNDX1BTKFIsIGkpCSAgICBcCisJKCYoKCh1bmlvbiBlMTAwMF9yeF9kZXNjX3BhY2tldF9zcGxpdCAqKSgoUikuZGVzYykpW2ldKSkKKyNkZWZpbmUgRTEwMDBfUlhfREVTQ19FWFQoUiwgaSkJICAgIFwKKwkoJigoKHVuaW9uIGUxMDAwX3J4X2Rlc2NfZXh0ZW5kZWQgKikoKFIpLmRlc2MpKVtpXSkpCisjZGVmaW5lIEUxMDAwX0dFVF9ERVNDKFIsIGksIHR5cGUpCSgmKCgoc3RydWN0IHR5cGUgKikoKFIpLmRlc2MpKVtpXSkpCisjZGVmaW5lIEUxMDAwX1JYX0RFU0MoUiwgaSkJCUUxMDAwX0dFVF9ERVNDKFIsIGksIGUxMDAwX3J4X2Rlc2MpCisjZGVmaW5lIEUxMDAwX1RYX0RFU0MoUiwgaSkJCUUxMDAwX0dFVF9ERVNDKFIsIGksIGUxMDAwX3R4X2Rlc2MpCisjZGVmaW5lIEUxMDAwX0NPTlRFWFRfREVTQyhSLCBpKQlFMTAwMF9HRVRfREVTQyhSLCBpLCBlMTAwMF9jb250ZXh0X2Rlc2MpCisKKy8qIGJvYXJkIHNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGUxMDAwX2FkYXB0ZXIgeworCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKKwl1aW50MTZfdCBtbmdfdmxhbl9pZDsKKwl1aW50MzJfdCBiZF9udW1iZXI7CisJdWludDMyX3QgcnhfYnVmZmVyX2xlbjsKKwl1aW50MzJfdCB3b2w7CisJdWludDMyX3Qgc21hcnRzcGVlZDsKKwl1aW50MzJfdCBlbl9tbmdfcHQ7CisJdWludDE2X3QgbGlua19zcGVlZDsKKwl1aW50MTZfdCBsaW5rX2R1cGxleDsKKworCXVuc2lnbmVkIGludCB0b3RhbF90eF9ieXRlczsKKwl1bnNpZ25lZCBpbnQgdG90YWxfdHhfcGFja2V0czsKKwl1bnNpZ25lZCBpbnQgdG90YWxfcnhfYnl0ZXM7CisJdW5zaWduZWQgaW50IHRvdGFsX3J4X3BhY2tldHM7CisJLyogSW50ZXJydXB0IFRocm90dGxlIFJhdGUgKi8KKwl1aW50MzJfdCBpdHI7CisJdWludDMyX3QgaXRyX3NldHRpbmc7CisJdWludDE2X3QgdHhfaXRyOworCXVpbnQxNl90IHJ4X2l0cjsKKworCXVpbnQ4X3QgZmNfYXV0b25lZzsKKworCXVuc2lnbmVkIGxvbmcgbGVkX3N0YXR1czsKKworCS8qIFRYICovCisJc3RydWN0IGUxMDAwX3R4X3JpbmcgKnR4X3Jpbmc7ICAgICAgLyogT25lIHBlciBhY3RpdmUgcXVldWUgKi8KKwl1bnNpZ25lZCBpbnQgcmVzdGFydF9xdWV1ZTsKKwl1bnNpZ25lZCBsb25nIHR4X3F1ZXVlX2xlbjsKKwl1aW50MzJfdCB0eGRfY21kOworCXVpbnQzMl90IHR4X2ludF9kZWxheTsKKwl1aW50MzJfdCB0eF9hYnNfaW50X2RlbGF5OworCXVpbnQzMl90IGdvdGNsOworCXVpbnQ2NF90IGdvdGNsX29sZDsKKwl1aW50NjRfdCB0cHRfb2xkOworCXVpbnQ2NF90IGNvbGNfb2xkOworCXVpbnQzMl90IHR4X3RpbWVvdXRfY291bnQ7CisJdWludDMyX3QgdHhfZmlmb19oZWFkOworCXVpbnQzMl90IHR4X2hlYWRfYWRkcjsKKwl1aW50MzJfdCB0eF9maWZvX3NpemU7CisJdWludDhfdCAgdHhfdGltZW91dF9mYWN0b3I7CisJYm9vbGVhbl90IHBjaXhfODI1NDQ7CisJYm9vbGVhbl90IGRldGVjdF90eF9odW5nOworCisJLyogUlggKi8KKwlib29sZWFuX3QgKCpjbGVhbl9yeCkgKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAorCQkJICAgICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nKTsKKwl2b2lkICgqYWxsb2NfcnhfYnVmKSAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgICBzdHJ1Y3QgZTEwMDBfcnhfcmluZyAqcnhfcmluZywKKwkJCQlpbnQgY2xlYW5lZF9jb3VudCk7CisJc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3Jpbmc7ICAgICAgLyogT25lIHBlciBhY3RpdmUgcXVldWUgKi8KKwlpbnQgbnVtX3R4X3F1ZXVlczsKKwlpbnQgbnVtX3J4X3F1ZXVlczsKKworCXVpbnQ2NF90IGh3X2NzdW1fZXJyOworCXVpbnQ2NF90IGh3X2NzdW1fZ29vZDsKKwl1aW50NjRfdCByeF9oZHJfc3BsaXQ7CisJdWludDMyX3QgYWxsb2NfcnhfYnVmZl9mYWlsZWQ7CisJdWludDMyX3QgcnhfaW50X2RlbGF5OworCXVpbnQzMl90IHJ4X2Fic19pbnRfZGVsYXk7CisJYm9vbGVhbl90IHJ4X2NzdW07CisJdW5zaWduZWQgaW50IHJ4X3BzX3BhZ2VzOworCXVpbnQzMl90IGdvcmNsOworCXVpbnQ2NF90IGdvcmNsX29sZDsKKwl1aW50MTZfdCByeF9wc19ic2l6ZTA7CisKKworCS8qIE9TIGRlZmluZWQgc3RydWN0cyAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHBjaV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOworCisJLyogc3RydWN0cyBkZWZpbmVkIGluIGUxMDAwX2h3LmggKi8KKwlzdHJ1Y3QgZTEwMDBfaHcgaHc7CisJc3RydWN0IGUxMDAwX2h3X3N0YXRzIHN0YXRzOworCXN0cnVjdCBlMTAwMF9waHlfaW5mbyBwaHlfaW5mbzsKKwlzdHJ1Y3QgZTEwMDBfcGh5X3N0YXRzIHBoeV9zdGF0czsKKworCXVpbnQzMl90IHRlc3RfaWNyOworCXN0cnVjdCBlMTAwMF90eF9yaW5nIHRlc3RfdHhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfcnhfcmluZyB0ZXN0X3J4X3Jpbmc7CisKKwlpbnQgbXNnX2VuYWJsZTsKKwlib29sZWFuX3QgaGF2ZV9tc2k7CisKKwkvKiB0byBub3QgbWVzcyB1cCBjYWNoZSBhbGlnbm1lbnQsIGFsd2F5cyBhZGQgdG8gdGhlIGJvdHRvbSAqLworCWJvb2xlYW5fdCB0c29fZm9yY2U7CisJYm9vbGVhbl90IHNtYXJ0X3Bvd2VyX2Rvd247CS8qIHBoeSBzbWFydCBwb3dlciBkb3duICovCisJYm9vbGVhbl90IHF1YWRfcG9ydF9hOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDMyX3QgZWVwcm9tX3dvbDsKKwkKKyNkZWZpbmUgTlVNX1RYX0RFU0MJOAorI2RlZmluZSBOVU1fUlhfREVTQwk4CisKKwlzdHJ1Y3QgaW9fYnVmZmVyICp0eF9pb2J1ZltOVU1fVFhfREVTQ107CisJc3RydWN0IGlvX2J1ZmZlciAqcnhfaW9idWZbTlVNX1JYX0RFU0NdOworCisJc3RydWN0IGUxMDAwX3R4X2Rlc2MgKnR4X2Jhc2U7CisJc3RydWN0IGUxMDAwX3J4X2Rlc2MgKnJ4X2Jhc2U7CisJCisJdWludDMyX3QgdHhfcmluZ19zaXplOworCXVpbnQzMl90IHJ4X3Jpbmdfc2l6ZTsKKworCXVpbnQzMl90IHR4X2hlYWQ7CisJdWludDMyX3QgdHhfdGFpbDsKKwl1aW50MzJfdCB0eF9maWxsX2N0cjsKKwkKKwl1aW50MzJfdCByeF9jdXJyOworCisJdWludDMyX3QgaW9hZGRyOworCXVpbnQzMl90IGlycW5vOworCit9OworCitlbnVtIGUxMDAwX3N0YXRlX3QgeworCV9fRTEwMDBfVEVTVElORywKKwlfX0UxMDAwX1JFU0VUVElORywKKwlfX0UxMDAwX0RPV04KK307CisKKyNkZWZpbmUgRTEwMDBfTU5HMkhPU1RfUE9SVF82MjMgKDEgPDwgNSkKKyNkZWZpbmUgRTEwMDBfTU5HMkhPU1RfUE9SVF82NjQgKDEgPDwgNikKKworI2RlZmluZSBFMTAwMF9FUlRfMjA0OCAweDEwMAorCisjZGVmaW5lIElPUkVTT1VSQ0VfSU8JCTB4MDAwMDAxMDAKKyNkZWZpbmUgSU9SRVNPVVJDRV9NRU0gICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBJT1JFU09VUkNFX1BSRUZFVENIICAgICAweDAwMDAxMDAwCisKKyNlbmRpZiAvKiBfRTEwMDBfSF8gKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzFkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCkBAIC0wLDAgKzEsOTE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBJbnRlbCBQUk8vMTAwMCBMaW51eCBkcml2ZXIKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA2IEludGVsIENvcnBvcmF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTsKKworLyogZTEwMDBfaHcuYworICogU2hhcmVkIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIGFuZCBjb25maWd1cmluZyB0aGUgTUFDCisgKi8KKworCisjaW5jbHVkZSAiZTEwMDBfaHcuaCIKKworc3RhdGljIGludDMyX3QgZTEwMDBfc3dmd19zeW5jX2FjcXVpcmUoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgbWFzayk7CitzdGF0aWMgdm9pZCBlMTAwMF9zd2Z3X3N5bmNfcmVsZWFzZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCBtYXNrKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3JlYWRfa21ybl9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsIHVpbnQxNl90ICpkYXRhKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3dyaXRlX2ttcm5fcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MTZfdCBkYXRhKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2dldF9zb2Z0d2FyZV9zZW1hcGhvcmUoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgdm9pZCBlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKworc3RhdGljIHVpbnQ4X3QgZTEwMDBfYXJjX3N1YnN5c3RlbV92YWxpZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2NoZWNrX2Rvd25zaGlmdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2NoZWNrX3BvbGFyaXR5KHN0cnVjdCBlMTAwMF9odyAqaHcsIGUxMDAwX3Jldl9wb2xhcml0eSAqcG9sYXJpdHkpOworc3RhdGljIHZvaWQgZTEwMDBfY2xlYXJfaHdfY250cnMoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgdm9pZCBlMTAwMF9jbGVhcl92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfY29tbWl0X3NoYWRvd19yYW0oc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlKHN0cnVjdCBlMTAwMF9odyAqaHcsIGJvb2xlYW5fdCBsaW5rX3VwKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfZGV0ZWN0X2dpZ19waHkoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9lcmFzZV9pY2g4XzRrX3NlZ21lbnQoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgYmFuayk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9nZXRfYXV0b19yZF9kb25lKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfZ2V0X2NhYmxlX2xlbmd0aChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCAqbWluX2xlbmd0aCwgdWludDE2X3QgKm1heF9sZW5ndGgpOworc3RhdGljIGludDMyX3QgZTEwMDBfZ2V0X2h3X2VlcHJvbV9zZW1hcGhvcmUoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9nZXRfcGh5X2NmZ19kb25lKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfZ2V0X3NvZnR3YXJlX2ZsYWcoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9pY2g4X2N5Y2xlX2luaXQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9pY2g4X2ZsYXNoX2N5Y2xlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHRpbWVvdXQpOworc3RhdGljIGludDMyX3QgZTEwMDBfaWRfbGVkX2luaXQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9pbml0X2xjZF9mcm9tX252bV9jb25maWdfcmVnaW9uKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IGNuZl9iYXNlX2FkZHIsIHVpbnQzMl90IGNuZl9zaXplKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2luaXRfbGNkX2Zyb21fbnZtKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfaW5pdF9yeF9hZGRycyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyB2b2lkIGUxMDAwX2luaXRpYWxpemVfaGFyZHdhcmVfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBib29sZWFuX3QgZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfa3VtZXJhbl9sb2NrX2xvc3Nfd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX21uZ19lbmFibGVfaG9zdF9pZihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX21uZ19ob3N0X2lmX3dyaXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQ4X3QgKmJ1ZmZlciwgdWludDE2X3QgbGVuZ3RoLCB1aW50MTZfdCBvZmZzZXQsIHVpbnQ4X3QgKnN1bSk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9tbmdfd3JpdGVfY21kX2hlYWRlcihzdHJ1Y3QgZTEwMDBfaHcqIGh3LCBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIqIGhkcik7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9tbmdfd3JpdGVfY29tbWl0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfcGh5X2lmZV9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3BoeV9pZ3BfZ2V0X2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywgc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHlfaW5mbyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9yZWFkX2VlcHJvbV9lZXJkKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IG9mZnNldCwgdWludDE2X3Qgd29yZHMsIHVpbnQxNl90ICpkYXRhKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3dyaXRlX2VlcHJvbV9lZXdyKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IG9mZnNldCwgdWludDE2X3Qgd29yZHMsIHVpbnQxNl90ICpkYXRhKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3BvbGxfZWVyZF9lZXdyX2RvbmUoc3RydWN0IGUxMDAwX2h3ICpodywgaW50IGVlcmQpOworc3RhdGljIGludDMyX3QgZTEwMDBfcGh5X204OF9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKTsKK3N0YXRpYyB2b2lkIGUxMDAwX3B1dF9od19lZXByb21fc2VtYXBob3JlKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfcmVhZF9pY2g4X2J5dGUoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgaW5kZXgsIHVpbnQ4X3QgKmRhdGEpOworc3RhdGljIGludDMyX3QgZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCBpbmRleCwgdWludDhfdCBieXRlKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3dyaXRlX2ljaDhfYnl0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCBpbmRleCwgdWludDhfdCBieXRlKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3JlYWRfaWNoOF93b3JkKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IGluZGV4LCB1aW50MTZfdCAqZGF0YSk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9yZWFkX2ljaDhfZGF0YShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCBpbmRleCwgdWludDMyX3Qgc2l6ZSwgdWludDE2X3QgKmRhdGEpOworc3RhdGljIGludDMyX3QgZTEwMDBfd3JpdGVfaWNoOF9kYXRhKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCBzaXplLCB1aW50MTZfdCBkYXRhKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3JlYWRfZWVwcm9tX2ljaDgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3Qgb2Zmc2V0LCB1aW50MTZfdCB3b3JkcywgdWludDE2X3QgKmRhdGEpOworc3RhdGljIGludDMyX3QgZTEwMDBfd3JpdGVfZWVwcm9tX2ljaDgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3Qgb2Zmc2V0LCB1aW50MTZfdCB3b3JkcywgdWludDE2X3QgKmRhdGEpOworc3RhdGljIHZvaWQgZTEwMDBfcmVsZWFzZV9zb2Z0d2FyZV9mbGFnKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfc2V0X2QzX2xwbHVfc3RhdGUoc3RydWN0IGUxMDAwX2h3ICpodywgYm9vbGVhbl90IGFjdGl2ZSk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9zZXRfZDBfbHBsdV9zdGF0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sZWFuX3QgYWN0aXZlKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3NldF9wY2lfZXhfbm9fc25vb3Aoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3Qgbm9fc25vb3ApOworc3RhdGljIHZvaWQgZTEwMDBfc2V0X3BjaV9leHByZXNzX21hc3Rlcl9kaXNhYmxlKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfd2FpdF9hdXRvbmVnKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfd3JpdGVfcmVnX2lvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdmFsdWUpOworc3RhdGljIGludDMyX3QgZTEwMDBfc2V0X3BoeV90eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfcGh5X2luaXRfc2NyaXB0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2NvbmZpZ19tYWNfdG9fcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfcmFpc2VfbWRpX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCAqY3RybCk7CitzdGF0aWMgdm9pZCBlMTAwMF9sb3dlcl9tZGlfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90ICpjdHJsKTsKK3N0YXRpYyB2b2lkIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KTsKK3N0YXRpYyB1aW50MTZfdCBlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3BoeV9yZXNldF9kc3Aoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF93cml0ZV9lZXByb21fc3BpKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZHMsIHVpbnQxNl90ICpkYXRhKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3dyaXRlX2VlcHJvbV9taWNyb3dpcmUoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LCB1aW50MTZfdCB3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRhdGEpOworc3RhdGljIGludDMyX3QgZTEwMDBfc3BpX2VlcHJvbV9yZWFkeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyB2b2lkIGUxMDAwX3JhaXNlX2VlX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCAqZWVjZCk7CitzdGF0aWMgdm9pZCBlMTAwMF9sb3dlcl9lZV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgKmVlY2QpOworc3RhdGljIHZvaWQgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBoeV9kYXRhKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3JlYWRfcGh5X3JlZ19leChzdHJ1Y3QgZTEwMDBfaHcgKmh3LHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwaHlfZGF0YSk7CitzdGF0aWMgdWludDE2X3QgZTEwMDBfc2hpZnRfaW5fZWVfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCBjb3VudCk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9hY3F1aXJlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyB2b2lkIGUxMDAwX3JlbGVhc2VfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfc3RhbmRieV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9zZXRfdmNvX3NwZWVkKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3NldF9waHlfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2hvc3RfaWZfcmVhZF9jb29raWUoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDhfdCAqYnVmZmVyKTsKK3N0YXRpYyB1aW50OF90IGUxMDAwX2NhbGN1bGF0ZV9tbmdfY2hlY2tzdW0oY2hhciAqYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpOworc3RhdGljIGludDMyX3QgZTEwMDBfY29uZmlndXJlX2ttcm5fZm9yXzEwXzEwMChzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkdXBsZXgpOworc3RhdGljIGludDMyX3QgZTEwMDBfY29uZmlndXJlX2ttcm5fZm9yXzEwMDAoc3RydWN0IGUxMDAwX2h3ICpodyk7CisKKy8qIElHUCBjYWJsZSBsZW5ndGggdGFibGUgKi8KK3N0YXRpYyBjb25zdAordWludDE2X3QgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF90YWJsZVtJR1AwMUUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRV0gPQorICAgIHsgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAgICAgIDUsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI1LCAyNSwgMjUsCisgICAgICAyNSwgMjUsIDI1LCAyNSwgMzAsIDMwLCAzMCwgMzAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwKKyAgICAgIDQwLCA1MCwgNTAsIDUwLCA1MCwgNTAsIDUwLCA1MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLAorICAgICAgNjAsIDcwLCA3MCwgNzAsIDcwLCA3MCwgNzAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDkwLCA5MCwgOTAsCisgICAgICA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsCisgICAgICAxMDAsIDEwMCwgMTAwLCAxMDAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsCisgICAgICAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjB9OworCitzdGF0aWMgY29uc3QKK3VpbnQxNl90IGUxMDAwX2lncF8yX2NhYmxlX2xlbmd0aF90YWJsZVtJR1AwMkUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRV0gPQorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgNSwgOCwgMTEsIDEzLCAxNiwgMTgsIDIxLAorICAgICAgMCwgMCwgMCwgMywgNiwgMTAsIDEzLCAxNiwgMTksIDIzLCAyNiwgMjksIDMyLCAzNSwgMzgsIDQxLAorICAgICAgNiwgMTAsIDE0LCAxOCwgMjIsIDI2LCAzMCwgMzMsIDM3LCA0MSwgNDQsIDQ4LCA1MSwgNTQsIDU4LCA2MSwKKyAgICAgIDIxLCAyNiwgMzEsIDM1LCA0MCwgNDQsIDQ5LCA1MywgNTcsIDYxLCA2NSwgNjgsIDcyLCA3NSwgNzksIDgyLAorICAgICAgNDAsIDQ1LCA1MSwgNTYsIDYxLCA2NiwgNzAsIDc1LCA3OSwgODMsIDg3LCA5MSwgOTQsIDk4LCAxMDEsIDEwNCwKKyAgICAgIDYwLCA2NiwgNzIsIDc3LCA4MiwgODcsIDkyLCA5NiwgMTAwLCAxMDQsIDEwOCwgMTExLCAxMTQsIDExNywgMTE5LCAxMjEsCisgICAgICA4MywgODksIDk1LCAxMDAsIDEwNSwgMTA5LCAxMTMsIDExNiwgMTE5LCAxMjIsIDEyNCwKKyAgICAgIDEwNCwgMTA5LCAxMTQsIDExOCwgMTIxLCAxMjR9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXQgdGhlIHBoeSB0eXBlIG1lbWJlciBpbiB0aGUgaHcgc3RydWN0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfc2V0X3BoeV90eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXRfcGh5X3R5cGUiKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfdW5kZWZpbmVkKQorICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFlfVFlQRTsKKworICAgIHN3aXRjaCAoaHctPnBoeV9pZCkgeworICAgIGNhc2UgTTg4RTEwMDBfRV9QSFlfSUQ6CisgICAgY2FzZSBNODhFMTAwMF9JX1BIWV9JRDoKKyAgICBjYXNlIE04OEUxMDExX0lfUEhZX0lEOgorICAgIGNhc2UgTTg4RTExMTFfSV9QSFlfSUQ6CisgICAgICAgIGh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV9tODg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUdQMDFFMTAwMF9JX1BIWV9JRDoKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSB8fAorICAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8CisgICAgICAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwKKyAgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgeworICAgICAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X2lncDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBJR1AwM0UxMDAwX0VfUEhZX0lEOgorICAgICAgICBody0+cGh5X3R5cGUgPSBlMTAwMF9waHlfaWdwXzM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUZFX0VfUEhZX0lEOgorICAgIGNhc2UgSUZFX1BMVVNfRV9QSFlfSUQ6CisgICAgY2FzZSBJRkVfQ19FX1BIWV9JRDoKKyAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X2lmZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHRzgyNTYzX0VfUEhZX0lEOgorICAgICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSB7CisgICAgICAgICAgICBody0+cGh5X3R5cGUgPSBlMTAwMF9waHlfZ2c4MjU2MzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIEZhbGwgVGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFNob3VsZCBuZXZlciBoYXZlIGxvYWRlZCBvbiB0aGlzIGRldmljZSAqLworICAgICAgICBody0+cGh5X3R5cGUgPSBlMTAwMF9waHlfdW5kZWZpbmVkOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFlfVFlQRTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUdQIHBoeSBpbml0IHNjcmlwdCAtIGluaXRpYWxpemVzIHRoZSBHYkUgUEhZCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9waHlfaW5pdF9zY3JpcHQoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9zYXZlZF9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfaW5pdF9zY3JpcHQiKTsKKworICAgIGlmIChody0+cGh5X2luaXRfc2NyaXB0KSB7CisgICAgICAgIG1zbGVlcCgyMCk7CisKKyAgICAgICAgLyogU2F2ZSBvZmYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgcmVnaXN0ZXIgMHgyRjVCIHRvIGJlIHJlc3RvcmVkIGF0CisgICAgICAgICAqIHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lLiAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCAweDJGNUIsICZwaHlfc2F2ZWRfZGF0YSk7CisKKyAgICAgICAgLyogRGlzYWJsZWQgdGhlIFBIWSB0cmFuc21pdHRlciAqLworICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIDB4MDAwMyk7CisKKyAgICAgICAgbXNsZWVwKDIwKTsKKworICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LDB4MDAwMCwweDAxNDApOworCisgICAgICAgIG1zbGVlcCg1KTsKKworICAgICAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgICAgICBjYXNlIGUxMDAwXzgyNTQxOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQ3OgorICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjk1LCAweDAwMDEpOworCisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGNzEsIDB4QkQyMSk7CisKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY3OSwgMHgwMDE4KTsKKworICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMwLCAweDE2MDApOworCisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGMzEsIDB4MDAxNCk7CisKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUYzMiwgMHgxNjFDKTsKKworICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjk0LCAweDAwMDMpOworCisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGOTYsIDB4MDAzRik7CisKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MjAxMCwgMHgwMDA4KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGNzMsIDB4MDA5OSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLCAweDMzMDApOworCisgICAgICAgIG1zbGVlcCgyMCk7CisKKyAgICAgICAgLyogTm93IGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CisKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgeworICAgICAgICAgICAgdWludDE2X3QgZnVzZWQsIGZpbmUsIGNvYXJzZTsKKworICAgICAgICAgICAgLyogTW92ZSB0byBhbmFsb2cgcmVnaXN0ZXJzIHBhZ2UgKi8KKyAgICAgICAgICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfU1BBUkVfRlVTRV9TVEFUVVMsICZmdXNlZCk7CisKKyAgICAgICAgICAgIGlmICghKGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfU1BBUkVfRlVTRV9FTkFCTEVEKSkgeworICAgICAgICAgICAgICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9TVEFUVVMsICZmdXNlZCk7CisKKyAgICAgICAgICAgICAgICBmaW5lID0gZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfTUFTSzsKKyAgICAgICAgICAgICAgICBjb2Fyc2UgPSBmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX01BU0s7CisKKyAgICAgICAgICAgICAgICBpZiAoY29hcnNlID4gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfVEhSRVNIKSB7CisgICAgICAgICAgICAgICAgICAgIGNvYXJzZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV8xMDsKKyAgICAgICAgICAgICAgICAgICAgZmluZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvYXJzZSA9PSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9USFJFU0gpCisgICAgICAgICAgICAgICAgICAgIGZpbmUgLT0gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzEwOworCisgICAgICAgICAgICAgICAgZnVzZWQgPSAoZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX1BPTFlfTUFTSykgfAorICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmUgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfTUFTSykgfAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvYXJzZSAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX01BU0spOworCisgICAgICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT05UUk9MLCBmdXNlZCk7CisgICAgICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9CWVBBU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0VOQUJMRV9TV19DT05UUk9MKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IHRoZSBtYWMgdHlwZSBtZW1iZXIgaW4gdGhlIGh3IHN0cnVjdC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfc2V0X21hY190eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJREVCVUdGVU5DKCJlMTAwMF9zZXRfbWFjX3R5cGUiKTsKKworCXN3aXRjaCAoaHctPmRldmljZV9pZCkgeworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQyOgorCQlzd2l0Y2ggKGh3LT5yZXZpc2lvbl9pZCkgeworCQljYXNlIEUxMDAwXzgyNTQyXzJfMF9SRVZfSUQ6CisJCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0Ml9yZXYyXzA7CisJCQlicmVhazsKKwkJY2FzZSBFMTAwMF84MjU0Ml8yXzFfUkVWX0lEOgorCQkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDJfcmV2Ml8xOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBJbnZhbGlkIDgyNTQyIHJldmlzaW9uIElEICovCisJCQlyZXR1cm4gLUUxMDAwX0VSUl9NQUNfVFlQRTsKKwkJfQorCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfQ09QUEVSOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0MzsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDRFSV9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDRFSV9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NEdDX0NPUFBFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NEdDX0xPTToKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDQ7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQwRU06CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDBFTV9MT006CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDBFUDoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MEVQX0xPTToKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MEVQX0xQOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0MDsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDVFTV9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDVFTV9GSUJFUjoKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDU7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1R01fQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1R01fRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDVHTV9TRVJERVM6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ1X3Jldl8zOworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX0NPUFBFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2RUJfUVVBRF9DT1BQRVI6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ2OworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX0NPUFBFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfU0VSREVTOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUENJRToKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1FVQURfQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVJfS1NQMzoKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDZfcmV2XzM7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQxRUk6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDFFSV9NT0JJTEU6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDFFUl9MT006CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQxOworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MUVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQxR0k6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDFHSV9MRjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MUdJX01PQklMRToKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDFfcmV2XzI7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ3RUk6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDdFSV9NT0JJTEU6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ3OworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0N0dJOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0N19yZXZfMjsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFUzoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFU19EVUFMOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTX1FVQUQ6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUl9MT1dQUk9GSUxFOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU3MTsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzJFSV9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzJFSV9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU3MkVJX1NFUkRFUzoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU3MkVJOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU3MjsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzNFOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTczRV9JQU1UOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTczTDoKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NzM7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgwMDAzRVMyTEFOX0NPUFBFUl9TUFQ6CisJY2FzZSBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fU0VSREVTX1NQVDoKKwljYXNlIEUxMDAwX0RFVl9JRF84MDAwM0VTMkxBTl9DT1BQRVJfRFBUOgorCWNhc2UgRTEwMDBfREVWX0lEXzgwMDAzRVMyTEFOX1NFUkRFU19EUFQ6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgwMDAzZXMybGFuOworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NX0FNVDoKKwljYXNlIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9BTVQ6CisJY2FzZSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfQzoKKwljYXNlIEUxMDAwX0RFVl9JRF9JQ0g4X0lGRToKKwljYXNlIEUxMDAwX0RFVl9JRF9JQ0g4X0lGRV9HVDoKKwljYXNlIEUxMDAwX0RFVl9JRF9JQ0g4X0lGRV9HOgorCWNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUdQX006CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwX2ljaDhsYW47CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTc2OgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU3NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogU2hvdWxkIG5ldmVyIGhhdmUgbG9hZGVkIG9uIHRoaXMgZGV2aWNlICovCisJCXJldHVybiAtRTEwMDBfRVJSX01BQ19UWVBFOworCX0KKworCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF9pY2g4bGFuOgorCWNhc2UgZTEwMDBfODI1NzY6CisJCWh3LT5zd2Z3aHdfc2VtYXBob3JlX3ByZXNlbnQgPSBUUlVFOworCQlody0+YXNmX2Zpcm13YXJlX3ByZXNlbnQgPSBUUlVFOworCQlicmVhazsKKwljYXNlIGUxMDAwXzgwMDAzZXMybGFuOgorCQlody0+c3dmd19zeW5jX3ByZXNlbnQgPSBUUlVFOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIGUxMDAwXzgyNTcxOgorCWNhc2UgZTEwMDBfODI1NzI6CisJY2FzZSBlMTAwMF84MjU3MzoKKwkJaHctPmVlcHJvbV9zZW1hcGhvcmVfcHJlc2VudCA9IFRSVUU7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgZTEwMDBfODI1NDE6CisJY2FzZSBlMTAwMF84MjU0NzoKKwljYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorCWNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisJCWh3LT5hc2ZfZmlybXdhcmVfcHJlc2VudCA9IFRSVUU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIFRoZSA4MjU0MyBjaGlwIGRvZXMgbm90IGNvdW50IHR4X2NhcnJpZXJfZXJyb3JzIHByb3Blcmx5IGluCisJICogRkQgbW9kZQorCSAqLworCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDMpCisJCWh3LT5iYWRfdHhfY2Fycl9zdGF0c19mZCA9IFRSVUU7CisKKwkvKiBjYXBhYmxlIG9mIHJlY2VpdmluZyBtYW5hZ2VtZW50IHBhY2tldHMgdG8gdGhlIGhvc3QgKi8KKwlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTcxKQorCQlody0+aGFzX21hbmMyaCA9IFRSVUU7CisKKwkvKiBJbiByYXJlIG9jY2FzaW9ucywgRVNCMiBzeXN0ZW1zIHdvdWxkIGVuZCB1cCBzdGFydGVkIHdpdGhvdXQKKwkgKiB0aGUgUlggdW5pdCBiZWluZyB0dXJuZWQgb24uCisJICovCisJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikKKwkJaHctPnJ4X25lZWRzX2tpY2tpbmcgPSBUUlVFOworCisJaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KQorCQlody0+aGFzX3NtYnVzID0gVFJVRTsKKworCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCBtZWRpYSB0eXBlIGFuZCBUQkkgY29tcGF0aWJpbGl0eS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF9zZXRfbWVkaWFfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IHN0YXR1czsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X21lZGlhX3R5cGUiKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgLyogdGJpX2NvbXBhdGliaWxpdHkgaXMgb25seSB2YWxpZCBvbiA4MjU0MyAqLworICAgICAgICBody0+dGJpX2NvbXBhdGliaWxpdHlfZW4gPSBGQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGh3LT5kZXZpY2VfaWQpIHsKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX1NFUkRFUzoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUzoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFUzoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFU19EVUFMOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTX1FVQUQ6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NzJFSV9TRVJERVM6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fU0VSREVTX0RQVDoKKyAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlczsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfaWNoOGxhbjoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU3MzoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU3NjoKKyAgICAgICAgICAgIC8qIFRoZSBTVEFUVVNfVEJJTU9ERSBiaXQgaXMgcmVzZXJ2ZWQgb3IgcmV1c2VkIGZvciB0aGUgdGhpcworICAgICAgICAgICAgICogZGV2aWNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfVEJJTU9ERSkgeworICAgICAgICAgICAgICAgIGh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcjsKKyAgICAgICAgICAgICAgICAvKiB0YmlfY29tcGF0aWJpbGl0eSBub3QgdmFsaWQgb24gZmliZXIgKi8KKyAgICAgICAgICAgICAgICBody0+dGJpX2NvbXBhdGliaWxpdHlfZW4gPSBGQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHM7IG1hc2sgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9yZXNldF9odyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisgICAgdWludDMyX3QgY3RybF9leHQ7CisgICAgdWludDMyX3QgaWNyOworICAgIHVpbnQzMl90IG1hbmM7CisgICAgdWludDMyX3QgbGVkX2N0cmw7CisgICAgdWludDMyX3QgdGltZW91dDsKKyAgICB1aW50MzJfdCBleHRjbmZfY3RybDsKKyAgICBpbnQzMl90IHJldF92YWw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3Jlc2V0X2h3Iik7CisKKyAgICAvKiBGb3IgODI1NDIgKHJldiAyLjApLCBkaXNhYmxlIE1XSSBiZWZvcmUgaXNzdWluZyBhIGRldmljZSByZXNldCAqLworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CisgICAgICAgIERFQlVHT1VUKCJEaXNhYmxpbmcgTVdJIG9uIDgyNTQyIHJldiAyLjBcbiIpOworICAgICAgICBlMTAwMF9wY2lfY2xlYXJfbXdpKGh3KTsKKyAgICB9CisKKyAgICBpZiAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzKSB7CisgICAgICAgIC8qIFByZXZlbnQgdGhlIFBDSS1FIGJ1cyBmcm9tIHN0aWNraW5nIGlmIHRoZXJlIGlzIG5vIFRMUCBjb25uZWN0aW9uCisgICAgICAgICAqIG9uIHRoZSBsYXN0IFRMUCByZWFkL3dyaXRlIHRyYW5zYWN0aW9uIHdoZW4gTUFDIGlzIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGUxMDAwX2Rpc2FibGVfcGNpZXhfbWFzdGVyKGh3KSAhPSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICAgICBERUJVR09VVCgiUENJLUUgTWFzdGVyIGRpc2FibGUgcG9sbGluZyBoYXMgZmFpbGVkLlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDbGVhciBpbnRlcnJ1cHQgbWFzayB0byBzdG9wIGJvYXJkIGZyb20gZ2VuZXJhdGluZyBpbnRlcnJ1cHRzICovCisgICAgREVCVUdPVVQoIk1hc2tpbmcgb2ZmIGFsbCBpbnRlcnJ1cHRzXG4iKTsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIElNQywgMHhmZmZmZmZmZik7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBUcmFuc21pdCBhbmQgUmVjZWl2ZSB1bml0cy4gIFRoZW4gZGVsYXkgdG8gYWxsb3cKKyAgICAgKiBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlIHdlIGhpdCB0aGUgTUFDIHdpdGgKKyAgICAgKiB0aGUgZ2xvYmFsIHJlc2V0LgorICAgICAqLworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgMCk7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUQ1RMLCBFMTAwMF9UQ1RMX1BTUCk7CisgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCisgICAgLyogVGhlIHRiaV9jb21wYXRpYmlsaXR5X29uIEZsYWcgbXVzdCBiZSBjbGVhcmVkIHdoZW4gUmN0bCBpcyBjbGVhcmVkLiAqLworICAgIGh3LT50YmlfY29tcGF0aWJpbGl0eV9vbiA9IEZBTFNFOworCisgICAgLyogRGVsYXkgdG8gYWxsb3cgYW55IG91dHN0YW5kaW5nIFBDSSB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlCisgICAgICogcmVzZXR0aW5nIHRoZSBkZXZpY2UKKyAgICAgKi8KKyAgICBtc2xlZXAoMTApOworCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKworICAgIC8qIE11c3QgcmVzZXQgdGhlIFBIWSBiZWZvcmUgcmVzZXR0aW5nIHRoZSBNQUMgKi8KKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUEhZX1JTVCkpOworICAgICAgICBtc2xlZXAoNSk7CisgICAgfQorCisgICAgLyogTXVzdCBhY3F1aXJlIHRoZSBNRElPIG93bmVyc2hpcCBiZWZvcmUgTUFDIHJlc2V0LgorICAgICAqIE93bmVyc2hpcCBkZWZhdWx0cyB0byBmaXJtd2FyZSBhZnRlciBhIHJlc2V0LiAqLworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKKyAgICAgICAgdGltZW91dCA9IDEwOworCisgICAgICAgIGV4dGNuZl9jdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVYVENORl9DVFJMKTsKKyAgICAgICAgZXh0Y25mX2N0cmwgfD0gRTEwMDBfRVhUQ05GX0NUUkxfTURJT19TV19PV05FUlNISVA7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFWFRDTkZfQ1RSTCwgZXh0Y25mX2N0cmwpOworICAgICAgICAgICAgZXh0Y25mX2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgRVhUQ05GX0NUUkwpOworCisgICAgICAgICAgICBpZiAoZXh0Y25mX2N0cmwgJiBFMTAwMF9FWFRDTkZfQ1RSTF9NRElPX1NXX09XTkVSU0hJUCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBleHRjbmZfY3RybCB8PSBFMTAwMF9FWFRDTkZfQ1RSTF9NRElPX1NXX09XTkVSU0hJUDsKKworICAgICAgICAgICAgbXNsZWVwKDIpOworICAgICAgICAgICAgdGltZW91dC0tOworICAgICAgICB9IHdoaWxlICh0aW1lb3V0KTsKKyAgICB9CisKKyAgICAvKiBXb3JrYXJvdW5kIGZvciBJQ0g4IGJpdCBjb3JydXB0aW9uIGlzc3VlIGluIEZJRk8gbWVtb3J5ICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7CisgICAgICAgIC8qIFNldCBUeCBhbmQgUnggYnVmZmVyIGFsbG9jYXRpb24gdG8gOGsgYXBpZWNlLiAqLworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFBCQSwgRTEwMDBfUEJBXzhLKTsKKyAgICAgICAgLyogU2V0IFBhY2tldCBCdWZmZXIgU2l6ZSB0byAxNmsuICovCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUEJTLCBFMTAwMF9QQlNfMTZLKTsKKyAgICB9CisKKyAgICAvKiBJc3N1ZSBhIGdsb2JhbCByZXNldCB0byB0aGUgTUFDLiAgVGhpcyB3aWxsIHJlc2V0IHRoZSBjaGlwJ3MKKyAgICAgKiB0cmFuc21pdCwgcmVjZWl2ZSwgRE1BLCBhbmQgbGluayB1bml0cy4gIEl0IHdpbGwgbm90IGVmZmVjdAorICAgICAqIHRoZSBjdXJyZW50IFBDSSBjb25maWd1cmF0aW9uLiAgVGhlIGdsb2JhbCByZXNldCBiaXQgaXMgc2VsZi0KKyAgICAgKiBjbGVhcmluZywgYW5kIHNob3VsZCBjbGVhciB3aXRoaW4gYSBtaWNyb3NlY29uZC4KKyAgICAgKi8KKyAgICBERUJVR09VVCgiSXNzdWluZyBhIGdsb2JhbCByZXNldCB0byBNQUNcbiIpOworCisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MDoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0NToKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0NjoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKyAgICAgICAgICAgIC8qIFRoZXNlIGNvbnRyb2xsZXJzIGNhbid0IGFjayB0aGUgNjQtYml0IHdyaXRlIHdoZW4gaXNzdWluZyB0aGUKKyAgICAgICAgICAgICAqIHJlc2V0LCBzbyB1c2UgSU8tbWFwcGluZyBhcyBhIHdvcmthcm91bmQgdG8gaXNzdWUgdGhlIHJlc2V0ICovCisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUdfSU8oaHcsIENUUkwsIChjdHJsIHwgRTEwMDBfQ1RSTF9SU1QpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorICAgICAgICAgICAgLyogUmVzZXQgaXMgcGVyZm9ybWVkIG9uIGEgc2hhZG93IG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRFVQLCAoY3RybCB8IEUxMDAwX0NUUkxfUlNUKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9pY2g4bGFuOgorICAgICAgICAgICAgaWYgKCFody0+cGh5X3Jlc2V0X2Rpc2FibGUgJiYKKyAgICAgICAgICAgICAgICBlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soaHcpID09IEUxMDAwX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAvKiBlMTAwMF9pY2g4bGFuIFBIWSBIVyByZXNldCByZXF1aXJlcyBNQUMgQ09SRSByZXNldAorICAgICAgICAgICAgICAgICAqIGF0IHRoZSBzYW1lIHRpbWUgdG8gbWFrZSBzdXJlIHRoZSBpbnRlcmZhY2UgYmV0d2VlbgorICAgICAgICAgICAgICAgICAqIE1BQyBhbmQgdGhlIGV4dGVybmFsIFBIWSBpcyByZXNldC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfUEhZX1JTVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZTEwMDBfZ2V0X3NvZnR3YXJlX2ZsYWcoaHcpOworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUlNUKSk7CisgICAgICAgICAgICBtc2xlZXAoNSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgKGN0cmwgfCBFMTAwMF9DVFJMX1JTVCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogQWZ0ZXIgTUFDIHJlc2V0LCBmb3JjZSByZWxvYWQgb2YgRUVQUk9NIHRvIHJlc3RvcmUgcG93ZXItb24gc2V0dGluZ3MgdG8KKyAgICAgKiBkZXZpY2UuICBMYXRlciBjb250cm9sbGVycyByZWxvYWQgdGhlIEVFUFJPTSBhdXRvbWF0aWNhbGx5LCBzbyBqdXN0IHdhaXQKKyAgICAgKiBmb3IgcmVsb2FkIHRvIGNvbXBsZXRlLgorICAgICAqLworICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MzoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgICAgIC8qIFdhaXQgZm9yIHJlc2V0IHRvIGNvbXBsZXRlICovCisgICAgICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICAgICAgY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTF9FWFQpOworICAgICAgICAgICAgY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfRUVfUlNUOworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMX0VYVCwgY3RybF9leHQpOworICAgICAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICAgICAgLyogV2FpdCBmb3IgRUVQUk9NIHJlbG9hZCAqLworICAgICAgICAgICAgbXNsZWVwKDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDE6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDc6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisgICAgICAgICAgICAvKiBXYWl0IGZvciBFRVBST00gcmVsb2FkICovCisgICAgICAgICAgICBtc2xlZXAoMjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgICAgICAgICBpZiAoZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tKGh3KSA9PSBGQUxTRSkgeworICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICAgICAgICAgY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTF9FWFQpOworICAgICAgICAgICAgICAgIGN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX0VFX1JTVDsKKyAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBBdXRvIHJlYWQgZG9uZSB3aWxsIGRlbGF5IDVtcyBvciBwb2xsIGJhc2VkIG9uIG1hYyB0eXBlICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X2F1dG9fcmRfZG9uZShodyk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIERpc2FibGUgSFcgQVJQcyBvbiBBU0YgZW5hYmxlZCBhZGFwdGVycyAqLworICAgIGlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYgaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisgICAgICAgIG1hbmMgPSBFMTAwMF9SRUFEX1JFRyhodywgTUFOQyk7CisgICAgICAgIG1hbmMgJj0gfihFMTAwMF9NQU5DX0FSUF9FTik7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTUFOQywgbWFuYyk7CisgICAgfQorCisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisgICAgICAgIGUxMDAwX3BoeV9pbml0X3NjcmlwdChodyk7CisKKyAgICAgICAgLyogQ29uZmlndXJlIGFjdGl2aXR5IExFRCBhZnRlciBQSFkgcmVzZXQgKi8KKyAgICAgICAgbGVkX2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgTEVEQ1RMKTsKKyAgICAgICAgbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOworICAgICAgICBsZWRfY3RybCB8PSAoSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgfCBJR1BfTEVEM19NT0RFKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGxlZF9jdHJsKTsKKyAgICB9CisKKyAgICAvKiBDbGVhciBpbnRlcnJ1cHQgbWFzayB0byBzdG9wIGJvYXJkIGZyb20gZ2VuZXJhdGluZyBpbnRlcnJ1cHRzICovCisgICAgREVCVUdPVVQoIk1hc2tpbmcgb2ZmIGFsbCBpbnRlcnJ1cHRzXG4iKTsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIElNQywgMHhmZmZmZmZmZik7CisKKyAgICAvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgZXZlbnRzLiAqLworICAgIGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1IpOworCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MSAmJiBody0+bGFhX2lzX3ByZXNlbnQgPT0gVFJVRSkgeworICAgICAgICAvKgorICAgICAgICAgKiBIb2xkIGEgY29weSBvZiB0aGUgTEFBIGluIFJBUlsxNF0gVGhpcyBpcyBkb25lIHNvIHRoYXQKKyAgICAgICAgICogYmV0d2VlbiB0aGUgdGltZSBSQVJbMF0gZ2V0cyBjbG9iYmVyZWQgYW5kIHRoZSB0aW1lIGl0CisgICAgICAgICAqIGdldHMgZml4ZWQsIHRoZSBhY3R1YWwgTEFBIGlzIGluIG9uZSBvZiB0aGUgUkFScyBhbmQgbm8KKyAgICAgICAgICogaW5jb21pbmcgcGFja2V0cyBkaXJlY3RlZCB0byB0aGlzIHBvcnQgYXJlIGRyb3BwZWQuCisgICAgICAgICAqIEV2ZW50dWFsbHkgdGhlIExBQSB3aWxsIGJlIGluIFJBUlswXSBhbmQgUkFSWzE0XS4KKyAgICAgICAgICovCisgICAgICAgIGUxMDAwX3Jhcl9zZXQoaHcsIGh3LT5tYWNfYWRkciwgRTEwMDBfUkFSX0VOVFJJRVMgLSAxKTsKKyAgICB9CisKKyAgICAvKiBJZiBNV0kgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCwgcmVlbmFibGUgaXQuICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApIHsKKyAgICAgICAgaWYgKGh3LT5wY2lfY21kX3dvcmQgJiBQQ0lfQ09NTUFORF9JTlZBTElEQVRFKQorICAgICAgICAgICAgZTEwMDBfcGNpX3NldF9td2koaHcpOworICAgIH0KKworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgeworICAgICAgICB1aW50MzJfdCBrYWIgPSBFMTAwMF9SRUFEX1JFRyhodywgS0FCR1RYRCk7CisgICAgICAgIGthYiB8PSBFMTAwMF9LQUJHVFhEX0JHU1FMQklBUzsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBLQUJHVFhELCBrYWIpOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW5pdGlhbGl6ZSBhIG51bWJlciBvZiBoYXJkd2FyZS1kZXBlbmRlbnQgYml0cworICoKKyAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGhhcmR3YXJlIGxpbWl0YXRpb24gd29ya2Fyb3VuZHMgZm9yIFBDSS1FIGFkYXB0ZXJzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2luaXRpYWxpemVfaGFyZHdhcmVfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGlmICgoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTcxICYmIGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTc2KSAmJgorICAgICAgICAoIWh3LT5pbml0aWFsaXplX2h3X2JpdHNfZGlzYWJsZSkpIHsKKyAgICAgICAgLyogU2V0dGluZ3MgY29tbW9uIHRvIGFsbCBQQ0ktZXhwcmVzcyBzaWxpY29uICovCisgICAgICAgIHVpbnQzMl90IHJlZ19jdHJsLCByZWdfY3RybF9leHQ7CisgICAgICAgIHVpbnQzMl90IHJlZ190YXJjMCwgcmVnX3RhcmMxOworICAgICAgICB1aW50MzJfdCByZWdfdGN0bDsKKyAgICAgICAgdWludDMyX3QgcmVnX3R4ZGN0bCwgcmVnX3R4ZGN0bDE7CisKKyAgICAgICAgLyogbGluayBhdXRvbmVnb3RpYXRpb24vc3luYyB3b3JrYXJvdW5kcyAqLworICAgICAgICByZWdfdGFyYzAgPSBFMTAwMF9SRUFEX1JFRyhodywgVEFSQzApOworICAgICAgICByZWdfdGFyYzAgJj0gfigoMSA8PCAzMCl8KDEgPDwgMjkpfCgxIDw8IDI4KXwoMSA8PCAyNykpOworCisgICAgICAgIC8qIEVuYWJsZSBub3QtZG9uZSBUWCBkZXNjcmlwdG9yIGNvdW50aW5nICovCisgICAgICAgIHJlZ190eGRjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgVFhEQ1RMKTsKKyAgICAgICAgcmVnX3R4ZGN0bCB8PSBFMTAwMF9UWERDVExfQ09VTlRfREVTQzsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUWERDVEwsIHJlZ190eGRjdGwpOworICAgICAgICByZWdfdHhkY3RsMSA9IEUxMDAwX1JFQURfUkVHKGh3LCBUWERDVEwxKTsKKyAgICAgICAgcmVnX3R4ZGN0bDEgfD0gRTEwMDBfVFhEQ1RMX0NPVU5UX0RFU0M7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhEQ1RMMSwgcmVnX3R4ZGN0bDEpOworCisgICAgICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgICAgICAgICBjYXNlIGUxMDAwXzgyNTcxOgorICAgICAgICAgICAgY2FzZSBlMTAwMF84MjU3MjoKKyAgICAgICAgICAgICAgICAvKiBDbGVhciBQSFkgVFggY29tcGF0aWJsZSBtb2RlIGJpdHMgKi8KKyAgICAgICAgICAgICAgICByZWdfdGFyYzEgPSBFMTAwMF9SRUFEX1JFRyhodywgVEFSQzEpOworICAgICAgICAgICAgICAgIHJlZ190YXJjMSAmPSB+KCgxIDw8IDMwKXwoMSA8PCAyOSkpOworCisgICAgICAgICAgICAgICAgLyogbGluayBhdXRvbmVnb3RpYXRpb24vc3luYyB3b3JrYXJvdW5kcyAqLworICAgICAgICAgICAgICAgIHJlZ190YXJjMCB8PSAoKDEgPDwgMjYpfCgxIDw8IDI1KXwoMSA8PCAyNCl8KDEgPDwgMjMpKTsKKworICAgICAgICAgICAgICAgIC8qIFRYIHJpbmcgY29udHJvbCBmaXhlcyAqLworICAgICAgICAgICAgICAgIHJlZ190YXJjMSB8PSAoKDEgPDwgMjYpfCgxIDw8IDI1KXwoMSA8PCAyNCkpOworCisgICAgICAgICAgICAgICAgLyogTXVsdGlwbGUgcmVhZCBiaXQgaXMgcmV2ZXJzZWQgcG9sYXJpdHkgKi8KKyAgICAgICAgICAgICAgICByZWdfdGN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQ1RMKTsKKyAgICAgICAgICAgICAgICBpZiAocmVnX3RjdGwgJiBFMTAwMF9UQ1RMX01VTFIpCisgICAgICAgICAgICAgICAgICAgIHJlZ190YXJjMSAmPSB+KDEgPDwgMjgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVnX3RhcmMxIHw9ICgxIDw8IDI4KTsKKworICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVEFSQzEsIHJlZ190YXJjMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGUxMDAwXzgyNTczOgorICAgICAgICAgICAgICAgIHJlZ19jdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMX0VYVCk7CisgICAgICAgICAgICAgICAgcmVnX2N0cmxfZXh0ICY9IH4oMSA8PCAyMyk7CisgICAgICAgICAgICAgICAgcmVnX2N0cmxfZXh0IHw9ICgxIDw8IDIyKTsKKworICAgICAgICAgICAgICAgIC8qIFRYIGJ5dGUgY291bnQgZml4ICovCisgICAgICAgICAgICAgICAgcmVnX2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgICAgICAgICAgICAgcmVnX2N0cmwgJj0gfigxIDw8IDI5KTsKKworICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIHJlZ19jdHJsX2V4dCk7CisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCByZWdfY3RybCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGUxMDAwXzgwMDAzZXMybGFuOgorICAgICAgICAgICAgICAgIC8qIGltcHJvdmUgc21hbGwgcGFja2V0IHBlcmZvcm1hY2UgZm9yIGZpYmVyL3NlcmRlcyAqLworICAgICAgICAgICAgICAgIGlmICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKKyAgICAgICAgICAgICAgICAgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSkgeworICAgICAgICAgICAgICAgICAgICByZWdfdGFyYzAgJj0gfigxIDw8IDIwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBNdWx0aXBsZSByZWFkIGJpdCBpcyByZXZlcnNlZCBwb2xhcml0eSAqLworICAgICAgICAgICAgICAgIHJlZ190Y3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRDVEwpOworICAgICAgICAgICAgICAgIHJlZ190YXJjMSA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQVJDMSk7CisgICAgICAgICAgICAgICAgaWYgKHJlZ190Y3RsICYgRTEwMDBfVENUTF9NVUxSKQorICAgICAgICAgICAgICAgICAgICByZWdfdGFyYzEgJj0gfigxIDw8IDI4KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlZ190YXJjMSB8PSAoMSA8PCAyOCk7CisKKyAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFRBUkMxLCByZWdfdGFyYzEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlMTAwMF9pY2g4bGFuOgorICAgICAgICAgICAgICAgIC8qIFJlZHVjZSBjb25jdXJyZW50IERNQSByZXF1ZXN0cyB0byAzIGZyb20gNCAqLworICAgICAgICAgICAgICAgIGlmICgoaHctPnJldmlzaW9uX2lkIDwgMykgfHwKKyAgICAgICAgICAgICAgICAgICAgKChody0+ZGV2aWNlX2lkICE9IEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NX0FNVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChody0+ZGV2aWNlX2lkICE9IEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NKSkpCisgICAgICAgICAgICAgICAgICAgIHJlZ190YXJjMCB8PSAoKDEgPDwgMjkpfCgxIDw8IDI4KSk7CisKKyAgICAgICAgICAgICAgICByZWdfY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTF9FWFQpOworICAgICAgICAgICAgICAgIHJlZ19jdHJsX2V4dCB8PSAoMSA8PCAyMik7CisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMX0VYVCwgcmVnX2N0cmxfZXh0KTsKKworICAgICAgICAgICAgICAgIC8qIHdvcmthcm91bmQgVFggaGFuZyB3aXRoIFRTTz1vbiAqLworICAgICAgICAgICAgICAgIHJlZ190YXJjMCB8PSAoKDEgPDwgMjcpfCgxIDw8IDI2KXwoMSA8PCAyNCl8KDEgPDwgMjMpKTsKKworICAgICAgICAgICAgICAgIC8qIE11bHRpcGxlIHJlYWQgYml0IGlzIHJldmVyc2VkIHBvbGFyaXR5ICovCisgICAgICAgICAgICAgICAgcmVnX3RjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgVENUTCk7CisgICAgICAgICAgICAgICAgcmVnX3RhcmMxID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRBUkMxKTsKKyAgICAgICAgICAgICAgICBpZiAocmVnX3RjdGwgJiBFMTAwMF9UQ1RMX01VTFIpCisgICAgICAgICAgICAgICAgICAgIHJlZ190YXJjMSAmPSB+KDEgPDwgMjgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVnX3RhcmMxIHw9ICgxIDw8IDI4KTsKKworICAgICAgICAgICAgICAgIC8qIHdvcmthcm91bmQgVFggaGFuZyB3aXRoIFRTTz1vbiAqLworICAgICAgICAgICAgICAgIHJlZ190YXJjMSB8PSAoKDEgPDwgMzApfCgxIDw8IDI2KXwoMSA8PCAyNCkpOworCisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUQVJDMSwgcmVnX3RhcmMxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFRBUkMwLCByZWdfdGFyYzApOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyZm9ybXMgYmFzaWMgY29uZmlndXJhdGlvbiBvZiB0aGUgYWRhcHRlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIEFzc3VtZXMgdGhhdCB0aGUgY29udHJvbGxlciBoYXMgcHJldmlvdXNseSBiZWVuIHJlc2V0IGFuZCBpcyBpbiBhCisgKiBwb3N0LXJlc2V0IHVuaW5pdGlhbGl6ZWQgc3RhdGUuIEluaXRpYWxpemVzIHRoZSByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXJzLAorICogbXVsdGljYXN0IHRhYmxlLCBhbmQgVkxBTiBmaWx0ZXIgdGFibGUuIENhbGxzIHJvdXRpbmVzIHRvIHNldHVwIGxpbmsKKyAqIGNvbmZpZ3VyYXRpb24gYW5kIGZsb3cgY29udHJvbCBzZXR0aW5ncy4gQ2xlYXJzIGFsbCBvbi1jaGlwIGNvdW50ZXJzLiBMZWF2ZXMKKyAqIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0cyBkaXNhYmxlZCBhbmQgdW5pbml0aWFsaXplZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2luaXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsOworICAgIHVpbnQzMl90IGk7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBjaXhfY21kX3dvcmQ7CisgICAgdWludDE2X3QgcGNpeF9zdGF0X2hpX3dvcmQ7CisgICAgdWludDE2X3QgY21kX21tcmJjOworICAgIHVpbnQxNl90IHN0YXRfbW1yYmM7CisgICAgdWludDMyX3QgbXRhX3NpemU7CisgICAgdWludDMyX3QgcmVnX2RhdGE7CisgICAgdWludDMyX3QgY3RybF9leHQ7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2luaXRfaHciKTsKKworICAgIC8qIGZvcmNlIGZ1bGwgRE1BIGNsb2NrIGZyZXF1ZW5jeSBmb3IgMTAvMTAwIG9uIElDSDggQTAtQjAgKi8KKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSAmJgorICAgICAgICAoKGh3LT5yZXZpc2lvbl9pZCA8IDMpIHx8CisgICAgICAgICAoKGh3LT5kZXZpY2VfaWQgIT0gRTEwMDBfREVWX0lEX0lDSDhfSUdQX01fQU1UKSAmJgorICAgICAgICAgIChody0+ZGV2aWNlX2lkICE9IEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NKSkpKSB7CisgICAgICAgICAgICByZWdfZGF0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworICAgICAgICAgICAgcmVnX2RhdGEgJj0gfjB4ODAwMDAwMDA7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFNUQVRVUywgcmVnX2RhdGEpOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgSWRlbnRpZmljYXRpb24gTEVEICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX2lkX2xlZF9pbml0KGh3KTsKKyAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICBERUJVR09VVCgiRXJyb3IgSW5pdGlhbGl6aW5nIElkZW50aWZpY2F0aW9uIExFRFxuIik7CisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIC8qIFNldCB0aGUgbWVkaWEgdHlwZSBhbmQgVEJJIGNvbXBhdGliaWxpdHkgKi8KKyAgICBlMTAwMF9zZXRfbWVkaWFfdHlwZShodyk7CisKKyAgICAvKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBlMTAwMF9zZXRfbWVkaWFfdHlwZSBiZWNhdXNlIG1lZGlhX3R5cGUgaXMgdXNlZCAqLworICAgIGUxMDAwX2luaXRpYWxpemVfaGFyZHdhcmVfYml0cyhodyk7CisKKyAgICAvKiBEaXNhYmxpbmcgVkxBTiBmaWx0ZXJpbmcuICovCisgICAgREVCVUdPVVQoIkluaXRpYWxpemluZyB0aGUgSUVFRSBWTEFOXG4iKTsKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfaWNoOGxhbjoKKyAgICAgICAgLyogVkVUIGhhcmRjb2RlZCB0byBzdGFuZGFyZCB2YWx1ZSBhbmQgVkZUQSByZW1vdmVkIGluIElDSDggTEFOICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NzY6CisgICAgICAgIC8qIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2xlYXIgdmZ0YSBvbiA4MjU3NiBpZiBWTEFOcyBhcmUgbm90IHVzZWQuCisgICAgICAgICAqIC0gSW50ZWzCriA4MjU3NiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgRGF0YXNoZWV0IHIyLjQxCisgICAgICAgICAqICAgU2VjdGlvbiA4LjEwLjE5IFRhYmxlIEFycmF5IC0gVkZUQQorICAgICAgICAgKgorICAgICAgICAgKiBTZXR0aW5nIFZFVCBtYXkgYWxzbyBiZSB1bm5lY2Vzc2FyeSwgaG93ZXZlciB0aGUgZG9jdW1lbnRhdGlvbgorICAgICAgICAgKiBpc24ndCBzcGVjaWZpYyBvbiB0aGlzIHBvaW50LiBUaGUgdmFsdWUgdXNlZCBoZXJlIGlzIGFzIGFkdmlzZWQgaW4KKwkgKiAtIEludGVswq4gODI1NzYgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIERhdGFzaGVldCByMi40MQorICAgICAgICAgKiAgIFNlY3Rpb24gOC4yLjcgVkxBTiBFdGhlciBUeXBlIC0gVkVUCisgICAgICAgICAqLworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFZFVCwgRVRIRVJORVRfSUVFRV9WTEFOX1RZUEUpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDVfcmV2XzMpCisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFZFVCwgMCk7CisgICAgICAgIGUxMDAwX2NsZWFyX3ZmdGEoaHcpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBGb3IgODI1NDIgKHJldiAyLjApLCBkaXNhYmxlIE1XSSBhbmQgcHV0IHRoZSByZWNlaXZlciBpbnRvIHJlc2V0ICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApIHsKKyAgICAgICAgREVCVUdPVVQoIkRpc2FibGluZyBNV0kgb24gODI1NDIgcmV2IDIuMFxuIik7CisgICAgICAgIGUxMDAwX3BjaV9jbGVhcl9td2koaHcpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIEUxMDAwX1JDVExfUlNUKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICBtc2xlZXAoNSk7CisgICAgfQorCisgICAgLyogU2V0dXAgdGhlIHJlY2VpdmUgYWRkcmVzcy4gVGhpcyBpbnZvbHZlcyBpbml0aWFsaXppbmcgYWxsIG9mIHRoZSBSZWNlaXZlCisgICAgICogQWRkcmVzcyBSZWdpc3RlcnMgKFJBUnMgMCAtIDE1KS4KKyAgICAgKi8KKyAgICBlMTAwMF9pbml0X3J4X2FkZHJzKGh3KTsKKworICAgIC8qIEZvciA4MjU0MiAocmV2IDIuMCksIHRha2UgdGhlIHJlY2VpdmVyIG91dCBvZiByZXNldCBhbmQgZW5hYmxlIE1XSSAqLworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgMCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgbXNsZWVwKDEpOworICAgICAgICBpZiAoaHctPnBjaV9jbWRfd29yZCAmIFBDSV9DT01NQU5EX0lOVkFMSURBVEUpCisgICAgICAgICAgICBlMTAwMF9wY2lfc2V0X213aShodyk7CisgICAgfQorCisgICAgLyogWmVybyBvdXQgdGhlIE11bHRpY2FzdCBIQVNIIHRhYmxlICovCisgICAgREVCVUdPVVQoIlplcm9pbmcgdGhlIE1UQVxuIik7CisgICAgbXRhX3NpemUgPSBFMTAwMF9NQ19UQkxfU0laRTsKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCisgICAgICAgIG10YV9zaXplID0gRTEwMDBfTUNfVEJMX1NJWkVfSUNIOExBTjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXRhX3NpemU7IGkrKykgeworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CisgICAgICAgIC8qIHVzZSB3cml0ZSBmbHVzaCB0byBwcmV2ZW50IE1lbW9yeSBXcml0ZSBCbG9jayAoTVdCKSBmcm9tCisgICAgICAgICAqIG9jY3VyaW5nIHdoZW4gYWNjZXNzaW5nIG91ciByZWdpc3RlciBzcGFjZSAqLworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBQQ0kgcHJpb3JpdHkgYml0IGNvcnJlY3RseSBpbiB0aGUgQ1RSTCByZWdpc3Rlci4gIFRoaXMKKyAgICAgKiBkZXRlcm1pbmVzIGlmIHRoZSBhZGFwdGVyIGdpdmVzIHByaW9yaXR5IHRvIHJlY2VpdmVzLCBvciBpZiBpdAorICAgICAqIGdpdmVzIGVxdWFsIHByaW9yaXR5IHRvIHRyYW5zbWl0cyBhbmQgcmVjZWl2ZXMuICBWYWxpZCBvbmx5IG9uCisgICAgICogODI1NDIgYW5kIDgyNTQzIHNpbGljb24uCisgICAgICovCisgICAgaWYgKGh3LT5kbWFfZmFpcm5lc3MgJiYgaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQzKSB7CisgICAgICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCB8IEUxMDAwX0NUUkxfUFJJT1IpOworICAgIH0KKworICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKyAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBXb3JrYXJvdW5kIGZvciBQQ0ktWCBwcm9ibGVtIHdoZW4gQklPUyBzZXRzIE1NUkJDIGluY29ycmVjdGx5LiAqLworICAgICAgICBpZiAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpIHsKKyAgICAgICAgICAgIGUxMDAwX3JlYWRfcGNpX2NmZyhodywgUENJWF9DT01NQU5EX1JFR0lTVEVSLCAmcGNpeF9jbWRfd29yZCk7CisgICAgICAgICAgICBlMTAwMF9yZWFkX3BjaV9jZmcoaHcsIFBDSVhfU1RBVFVTX1JFR0lTVEVSX0hJLAorICAgICAgICAgICAgICAgICZwY2l4X3N0YXRfaGlfd29yZCk7CisgICAgICAgICAgICBjbWRfbW1yYmMgPSAocGNpeF9jbWRfd29yZCAmIFBDSVhfQ09NTUFORF9NTVJCQ19NQVNLKSA+PgorICAgICAgICAgICAgICAgIFBDSVhfQ09NTUFORF9NTVJCQ19TSElGVDsKKyAgICAgICAgICAgIHN0YXRfbW1yYmMgPSAocGNpeF9zdGF0X2hpX3dvcmQgJiBQQ0lYX1NUQVRVU19ISV9NTVJCQ19NQVNLKSA+PgorICAgICAgICAgICAgICAgIFBDSVhfU1RBVFVTX0hJX01NUkJDX1NISUZUOworICAgICAgICAgICAgaWYgKHN0YXRfbW1yYmMgPT0gUENJWF9TVEFUVVNfSElfTU1SQkNfNEspCisgICAgICAgICAgICAgICAgc3RhdF9tbXJiYyA9IFBDSVhfU1RBVFVTX0hJX01NUkJDXzJLOworICAgICAgICAgICAgaWYgKGNtZF9tbXJiYyA+IHN0YXRfbW1yYmMpIHsKKyAgICAgICAgICAgICAgICBwY2l4X2NtZF93b3JkICY9IH5QQ0lYX0NPTU1BTkRfTU1SQkNfTUFTSzsKKyAgICAgICAgICAgICAgICBwY2l4X2NtZF93b3JkIHw9IHN0YXRfbW1yYmMgPDwgUENJWF9DT01NQU5EX01NUkJDX1NISUZUOworICAgICAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BjaV9jZmcoaHcsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKyAgICAgICAgICAgICAgICAgICAgJnBjaXhfY21kX3dvcmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIE1vcmUgdGltZSBuZWVkZWQgZm9yIFBIWSB0byBpbml0aWFsaXplICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKQorICAgICAgICBtc2xlZXAoMTUpOworCisgICAgLyogQ2FsbCBhIHN1YnJvdXRpbmUgdG8gY29uZmlndXJlIHRoZSBsaW5rIGFuZCBzZXR1cCBmbG93IGNvbnRyb2wuICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3NldHVwX2xpbmsoaHcpOworCisgICAgLyogU2V0IHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHdyaXRlLWJhY2sgcG9saWN5ICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CisgICAgICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgVFhEQ1RMKTsKKyAgICAgICAgY3RybCA9IChjdHJsICYgfkUxMDAwX1RYRENUTF9XVEhSRVNIKSB8IEUxMDAwX1RYRENUTF9GVUxMX1RYX0RFU0NfV0I7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhEQ1RMLCBjdHJsKTsKKyAgICB9CisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7CisgICAgICAgIGUxMDAwX2VuYWJsZV90eF9wa3RfZmlsdGVyaW5nKGh3KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46CisgICAgICAgIC8qIEVuYWJsZSByZXRyYW5zbWl0IG9uIGxhdGUgY29sbGlzaW9ucyAqLworICAgICAgICByZWdfZGF0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQ1RMKTsKKyAgICAgICAgcmVnX2RhdGEgfD0gRTEwMDBfVENUTF9SVExDOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFRDVEwsIHJlZ19kYXRhKTsKKworICAgICAgICAvKiBDb25maWd1cmUgR2lnYWJpdCBDYXJyeSBFeHRlbmQgUGFkZGluZyAqLworICAgICAgICByZWdfZGF0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQ1RMX0VYVCk7CisgICAgICAgIHJlZ19kYXRhICY9IH5FMTAwMF9UQ1RMX0VYVF9HQ0VYX01BU0s7CisgICAgICAgIHJlZ19kYXRhIHw9IERFRkFVTFRfODAwMDNFUzJMQU5fVENUTF9FWFRfR0NFWDsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUQ1RMX0VYVCwgcmVnX2RhdGEpOworCisgICAgICAgIC8qIENvbmZpZ3VyZSBUcmFuc21pdCBJbnRlci1QYWNrZXQgR2FwICovCisgICAgICAgIHJlZ19kYXRhID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRJUEcpOworICAgICAgICByZWdfZGF0YSAmPSB+RTEwMDBfVElQR19JUEdUX01BU0s7CisgICAgICAgIHJlZ19kYXRhIHw9IERFRkFVTFRfODAwMDNFUzJMQU5fVElQR19JUEdUXzEwMDA7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVElQRywgcmVnX2RhdGEpOworCisgICAgICAgIHJlZ19kYXRhID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoaHcsIEZGTFQsIDB4MDAwMSk7CisgICAgICAgIHJlZ19kYXRhICY9IH4weDAwMTAwMDAwOworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIEZGTFQsIDB4MDAwMSwgcmVnX2RhdGEpOworICAgICAgICAvKiBGYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIGUxMDAwXzgyNTcxOgorICAgIGNhc2UgZTEwMDBfODI1NzI6CisgICAgY2FzZSBlMTAwMF9pY2g4bGFuOgorICAgICAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRYRENUTDEpOworICAgICAgICBjdHJsID0gKGN0cmwgJiB+RTEwMDBfVFhEQ1RMX1dUSFJFU0gpIHwgRTEwMDBfVFhEQ1RMX0ZVTExfVFhfREVTQ19XQjsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUWERDVEwxLCBjdHJsKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7CisgICAgICAgIHVpbnQzMl90IGdjciA9IEUxMDAwX1JFQURfUkVHKGh3LCBHQ1IpOworICAgICAgICBnY3IgfD0gRTEwMDBfR0NSX0wxX0FDVF9XSVRIT1VUX0wwU19SWDsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBHQ1IsIGdjcik7CisgICAgfQorCisgICAgLyogQ2xlYXIgYWxsIG9mIHRoZSBzdGF0aXN0aWNzIHJlZ2lzdGVycyAoY2xlYXIgb24gcmVhZCkuICBJdCBpcworICAgICAqIGltcG9ydGFudCB0aGF0IHdlIGRvIHRoaXMgYWZ0ZXIgd2UgaGF2ZSB0cmllZCB0byBlc3RhYmxpc2ggbGluaworICAgICAqIGJlY2F1c2UgdGhlIHN5bWJvbCBlcnJvciBjb3VudCB3aWxsIGluY3JlbWVudCB3aWxkbHkgaWYgdGhlcmUKKyAgICAgKiBpcyBubyBsaW5rLgorICAgICAqLworICAgIGUxMDAwX2NsZWFyX2h3X2NudHJzKGh3KTsKKworICAgIC8qIElDSDggTm8tc25vb3AgYml0cyBhcmUgb3Bwb3NpdGUgcG9sYXJpdHkuCisgICAgICogU2V0IHRvIHNub29wIGJ5IGRlZmF1bHQgYWZ0ZXIgcmVzZXQuICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKQorICAgICAgICBlMTAwMF9zZXRfcGNpX2V4X25vX3Nub29wKGh3LCBQQ0lfRVhfODI1NjZfU05PT1BfQUxMKTsKKworICAgIGlmIChody0+ZGV2aWNlX2lkID09IEUxMDAwX0RFVl9JRF84MjU0NkdCX1FVQURfQ09QUEVSIHx8CisgICAgICAgIGh3LT5kZXZpY2VfaWQgPT0gRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVJfS1NQMykgeworICAgICAgICBjdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMX0VYVCk7CisgICAgICAgIC8qIFJlbGF4ZWQgb3JkZXJpbmcgbXVzdCBiZSBkaXNhYmxlZCB0byBhdm9pZCBhIHBhcml0eQorICAgICAgICAgKiBlcnJvciBjcmFzaCBpbiBhIFBDSSBzbG90LiAqLworICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9ST19ESVM7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWRqdXN0IFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIGJhc2VkIG9uIEVFUFJPTSBzZXR0aW5nLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDE2X3QgZWVwcm9tX2RhdGE7CisgICAgaW50MzJfdCAgcmV0X3ZhbDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfYWRqdXN0X3NlcmRlc19hbXBsaXR1ZGUiKTsKKworICAgIGlmIChody0+bWVkaWFfdHlwZSAhPSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisgICAgY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fU0VSREVTX0FNUExJVFVERSwgMSwgJmVlcHJvbV9kYXRhKTsKKyAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgICBpZiAoZWVwcm9tX2RhdGEgIT0gRUVQUk9NX1JFU0VSVkVEX1dPUkQpIHsKKyAgICAgICAgLyogQWRqdXN0IFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIG9ubHkuICovCisgICAgICAgIGVlcHJvbV9kYXRhICY9IEVFUFJPTV9TRVJERVNfQU1QTElUVURFX01BU0s7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfRVhUX0NUUkwsIGVlcHJvbV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29uZmlndXJlcyBmbG93IGNvbnRyb2wgYW5kIGxpbmsgc2V0dGluZ3MuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBEZXRlcm1pbmVzIHdoaWNoIGZsb3cgY29udHJvbCBzZXR0aW5ncyB0byB1c2UuIENhbGxzIHRoZSBhcHJvcHJpYXRlIG1lZGlhLQorICogc3BlY2lmaWMgbGluayBjb25maWd1cmF0aW9uIGZ1bmN0aW9uLiBDb25maWd1cmVzIHRoZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MuCisgKiBBc3N1bWluZyB0aGUgYWRhcHRlciBoYXMgYSB2YWxpZCBsaW5rIHBhcnRuZXIsIGEgdmFsaWQgbGluayBzaG91bGQgYmUKKyAqIGVzdGFibGlzaGVkLiBBc3N1bWVzIHRoZSBoYXJkd2FyZSBoYXMgcHJldmlvdXNseSBiZWVuIHJlc2V0IGFuZCB0aGUKKyAqIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciBhcmUgbm90IGVuYWJsZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9zZXR1cF9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybF9leHQ7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IGVlcHJvbV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9saW5rIik7CisKKyAgICAvKiBJbiB0aGUgY2FzZSBvZiB0aGUgcGh5IHJlc2V0IGJlaW5nIGJsb2NrZWQsIHdlIGFscmVhZHkgaGF2ZSBhIGxpbmsuCisgICAgICogV2UgZG8gbm90IGhhdmUgdG8gc2V0IGl0IHVwIGFnYWluLiAqLworICAgIGlmIChlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soaHcpKQorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworICAgIC8qIFJlYWQgYW5kIHN0b3JlIHdvcmQgMHgwRiBvZiB0aGUgRUVQUk9NLiBUaGlzIHdvcmQgY29udGFpbnMgYml0cworICAgICAqIHRoYXQgZGV0ZXJtaW5lIHRoZSBoYXJkd2FyZSdzIGRlZmF1bHQgUEFVU0UgKGZsb3cgY29udHJvbCkgbW9kZSwKKyAgICAgKiBhIGJpdCB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgSFcgZGVmYXVsdHMgdG8gZW5hYmxpbmcgb3IKKyAgICAgKiBkaXNhYmxpbmcgYXV0by1uZWdvdGlhdGlvbiwgYW5kIHRoZSBkaXJlY3Rpb24gb2YgdGhlCisgICAgICogU1cgZGVmaW5lZCBwaW5zLiBJZiB0aGVyZSBpcyBubyBTVyBvdmVyLXJpZGUgb2YgdGhlIGZsb3cKKyAgICAgKiBjb250cm9sIHNldHRpbmcsIHRoZW4gdGhlIHZhcmlhYmxlIGh3LT5mYyB3aWxsCisgICAgICogYmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24gYSB2YWx1ZSBpbiB0aGUgRUVQUk9NLgorICAgICAqLworICAgIGlmIChody0+ZmMgPT0gRTEwMDBfRkNfREVGQVVMVCkgeworICAgICAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgICAgICBjYXNlIGUxMDAwX2ljaDhsYW46CisgICAgICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgICAgICAgICBody0+ZmMgPSBFMTAwMF9GQ19GVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9JTklUX0NPTlRST0wyX1JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmZWVwcm9tX2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZWVwcm9tX2RhdGEgJiBFRVBST01fV09SRDBGX1BBVVNFX01BU0spID09IDApCisgICAgICAgICAgICAgICAgaHctPmZjID0gRTEwMDBfRkNfTk9ORTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChlZXByb21fZGF0YSAmIEVFUFJPTV9XT1JEMEZfUEFVU0VfTUFTSykgPT0KKyAgICAgICAgICAgICAgICAgICAgRUVQUk9NX1dPUkQwRl9BU01fRElSKQorICAgICAgICAgICAgICAgIGh3LT5mYyA9IEUxMDAwX0ZDX1RYX1BBVVNFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGh3LT5mYyA9IEUxMDAwX0ZDX0ZVTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFdlIHdhbnQgdG8gc2F2ZSBvZmYgdGhlIG9yaWdpbmFsIEZsb3cgQ29udHJvbCBjb25maWd1cmF0aW9uIGp1c3QKKyAgICAgKiBpbiBjYXNlIHdlIGdldCBkaXNjb25uZWN0ZWQgYW5kIHRoZW4gcmVjb25uZWN0ZWQgaW50byBhIGRpZmZlcmVudAorICAgICAqIGh1YiBvciBzd2l0Y2ggd2l0aCBkaWZmZXJlbnQgRmxvdyBDb250cm9sIGNhcGFiaWxpdGllcy4KKyAgICAgKi8KKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKKyAgICAgICAgaHctPmZjICY9ICh+RTEwMDBfRkNfVFhfUEFVU0UpOworCisgICAgaWYgKChody0+bWFjX3R5cGUgPCBlMTAwMF84MjU0MykgJiYgKGh3LT5yZXBvcnRfdHhfZWFybHkgPT0gMSkpCisgICAgICAgIGh3LT5mYyAmPSAofkUxMDAwX0ZDX1JYX1BBVVNFKTsKKworICAgIGh3LT5vcmlnaW5hbF9mYyA9IGh3LT5mYzsKKworICAgIERFQlVHT1VUMSgiQWZ0ZXIgZml4LXVwcyBGbG93Q29udHJvbCBpcyBub3cgPSAleFxuIiwgaHctPmZjKTsKKworICAgIC8qIFRha2UgdGhlIDQgYml0cyBmcm9tIEVFUFJPTSB3b3JkIDB4MEYgdGhhdCBkZXRlcm1pbmUgdGhlIGluaXRpYWwKKyAgICAgKiBwb2xhcml0eSB2YWx1ZSBmb3IgdGhlIFNXIGNvbnRyb2xsZWQgcGlucywgYW5kIHNldHVwIHRoZQorICAgICAqIEV4dGVuZGVkIERldmljZSBDb250cm9sIHJlZyB3aXRoIHRoYXQgaW5mby4KKyAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9uZSBvZiB0aGUgU1cgY29udHJvbGxlZCBwaW5zIGlzIHVzZWQgZm9yCisgICAgICogc2lnbmFsIGRldGVjdGlvbi4gIFNvIHRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGUxMDAwX3NldHVwX3Bjc19saW5rKCkKKyAgICAgKiBvciBlMTAwMF9waHlfc2V0dXAoKSBpcyBjYWxsZWQuCisgICAgICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9JTklUX0NPTlRST0wyX1JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICZlZXByb21fZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgICAgICB9CisgICAgICAgIGN0cmxfZXh0ID0gKChlZXByb21fZGF0YSAmIEVFUFJPTV9XT1JEMEZfU1dQRElPX0VYVCkgPDwKKyAgICAgICAgICAgICAgICAgICAgU1dEUElPX19FWFRfU0hJRlQpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisgICAgfQorCisgICAgLyogQ2FsbCB0aGUgbmVjZXNzYXJ5IHN1YnJvdXRpbmUgdG8gY29uZmlndXJlIHRoZSBsaW5rLiAqLworICAgIHJldF92YWwgPSAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpID8KKyAgICAgICAgICAgICAgZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsoaHcpIDoKKyAgICAgICAgICAgICAgZTEwMDBfc2V0dXBfZmliZXJfc2VyZGVzX2xpbmsoaHcpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZmxvdyBjb250cm9sIGFkZHJlc3MsIHR5cGUsIGFuZCBQQVVTRSB0aW1lcgorICAgICAqIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gIFRoaXMgaXMgZG9uZSBldmVuIGlmIGZsb3cKKyAgICAgKiBjb250cm9sIGlzIGRpc2FibGVkLCBiZWNhdXNlIGl0IGRvZXMgbm90IGh1cnQgYW55dGhpbmcgdG8KKyAgICAgKiBpbml0aWFsaXplIHRoZXNlIHJlZ2lzdGVycy4KKyAgICAgKi8KKyAgICBERUJVR09VVCgiSW5pdGlhbGl6aW5nIHRoZSBGbG93IENvbnRyb2wgYWRkcmVzcywgdHlwZSBhbmQgdGltZXIgcmVnc1xuIik7CisKKyAgICAvKiBGQ0FML0ggYW5kIEZDVCBhcmUgaGFyZGNvZGVkIHRvIHN0YW5kYXJkIHZhbHVlcyBpbiBlMTAwMF9pY2g4bGFuLiAqLworICAgIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgeworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDVCwgRkxPV19DT05UUk9MX1RZUEUpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDQUgsIEZMT1dfQ09OVFJPTF9BRERSRVNTX0hJR0gpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDQUwsIEZMT1dfQ09OVFJPTF9BRERSRVNTX0xPVyk7CisgICAgfQorCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1RUViwgaHctPmZjX3BhdXNlX3RpbWUpOworCisgICAgLyogU2V0IHRoZSBmbG93IGNvbnRyb2wgcmVjZWl2ZSB0aHJlc2hvbGQgcmVnaXN0ZXJzLiAgTm9ybWFsbHksCisgICAgICogdGhlc2UgcmVnaXN0ZXJzIHdpbGwgYmUgc2V0IHRvIGEgZGVmYXVsdCB0aHJlc2hvbGQgdGhhdCBtYXkgYmUKKyAgICAgKiBhZGp1c3RlZCBsYXRlciBieSB0aGUgZHJpdmVyJ3MgcnVudGltZSBjb2RlLiAgSG93ZXZlciwgaWYgdGhlCisgICAgICogYWJpbGl0eSB0byB0cmFuc21pdCBwYXVzZSBmcmFtZXMgaW4gbm90IGVuYWJsZWQsIHRoZW4gdGhlc2UKKyAgICAgKiByZWdpc3RlcnMgd2lsbCBiZSBzZXQgdG8gMC4KKyAgICAgKi8KKyAgICBpZiAoIShody0+ZmMgJiBFMTAwMF9GQ19UWF9QQVVTRSkpIHsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgMCk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEgsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlIG5lZWQgdG8gc2V0IHVwIHRoZSBSZWNlaXZlIFRocmVzaG9sZCBoaWdoIGFuZCBsb3cgd2F0ZXIgbWFya3MKKyAgICAgICAgICogYXMgd2VsbCBhcyAob3B0aW9uYWxseSkgZW5hYmxpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBYT04gZnJhbWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGh3LT5mY19zZW5kX3hvbikgeworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgKGh3LT5mY19sb3dfd2F0ZXIgfCBFMTAwMF9GQ1JUTF9YT05FKSk7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRILCBody0+ZmNfaGlnaF93YXRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRMLCBody0+ZmNfbG93X3dhdGVyKTsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEgsIGh3LT5mY19oaWdoX3dhdGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0cyB1cCBsaW5rIGZvciBhIGZpYmVyIGJhc2VkIG9yIHNlcmRlcyBiYXNlZCBhZGFwdGVyCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBNYW5pcHVsYXRlcyBQaHlzaWNhbCBDb2RpbmcgU3VibGF5ZXIgZnVuY3Rpb25zIGluIG9yZGVyIHRvIGNvbmZpZ3VyZQorICogbGluay4gQXNzdW1lcyB0aGUgaGFyZHdhcmUgaGFzIGJlZW4gcHJldmlvdXNseSByZXNldCBhbmQgdGhlIHRyYW5zbWl0dGVyCisgKiBhbmQgcmVjZWl2ZXIgYXJlIG5vdCBlbmFibGVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3NldHVwX2ZpYmVyX3NlcmRlc19saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybDsKKyAgICB1aW50MzJfdCBzdGF0dXM7CisgICAgdWludDMyX3QgdHhjdyA9IDA7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBzaWduYWwgPSAwOworICAgIGludDMyX3QgcmV0X3ZhbDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0dXBfZmliZXJfc2VyZGVzX2xpbmsiKTsKKworICAgIC8qIE9uIDgyNTcxIGFuZCA4MjU3MiBGaWJlciBjb25uZWN0aW9ucywgU2VyRGVzIGxvb3BiYWNrIG1vZGUgcGVyc2lzdHMKKyAgICAgKiB1bnRpbCBleHBsaWNpdGx5IHR1cm5lZCBvZmYgb3IgYSBwb3dlciBjeWNsZSBpcyBwZXJmb3JtZWQuICBBIHJlYWQgdG8KKyAgICAgKiB0aGUgcmVnaXN0ZXIgZG9lcyBub3QgaW5kaWNhdGUgaXRzIHN0YXR1cy4gIFRoZXJlZm9yZSwgd2UgZW5zdXJlCisgICAgICogbG9vcGJhY2sgbW9kZSBpcyBkaXNhYmxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MSB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzIpCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgU0NUTCwgRTEwMDBfRElTQUJMRV9TRVJERVNfTE9PUEJBQ0spOworCisgICAgLyogT24gYWRhcHRlcnMgd2l0aCBhIE1BQyBuZXdlciB0aGFuIDgyNTQ0LCBTV0RQIDEgd2lsbCBiZQorICAgICAqIHNldCB3aGVuIHRoZSBvcHRpY3MgZGV0ZWN0IGEgc2lnbmFsLiBPbiBvbGRlciBhZGFwdGVycywgaXQgd2lsbCBiZQorICAgICAqIGNsZWFyZWQgd2hlbiB0aGVyZSBpcyBhIHNpZ25hbC4gIFRoaXMgYXBwbGllcyB0byBmaWJlciBtZWRpYSBvbmx5LgorICAgICAqIElmIHdlJ3JlIG9uIHNlcmRlcyBtZWRpYSwgYWRqdXN0IHRoZSBvdXRwdXQgYW1wbGl0dWRlIHRvIHZhbHVlCisgICAgICogc2V0IGluIHRoZSBFRVBST00uCisgICAgICovCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICBpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikKKyAgICAgICAgc2lnbmFsID0gKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX0NUUkxfU1dEUElOMSA6IDA7CisKKyAgICByZXRfdmFsID0gZTEwMDBfYWRqdXN0X3NlcmRlc19hbXBsaXR1ZGUoaHcpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIFRha2UgdGhlIGxpbmsgb3V0IG9mIHJlc2V0ICovCisgICAgY3RybCAmPSB+KEUxMDAwX0NUUkxfTFJTVCk7CisKKyAgICAvKiBBZGp1c3QgVkNPIHNwZWVkIHRvIGltcHJvdmUgQkVSIHBlcmZvcm1hbmNlICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3NldF92Y29fc3BlZWQoaHcpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisKKyAgICAvKiBDaGVjayBmb3IgYSBzb2Z0d2FyZSBvdmVycmlkZSBvZiB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzLCBhbmQgc2V0dXAKKyAgICAgKiB0aGUgZGV2aWNlIGFjY29yZGluZ2x5LiAgSWYgYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGVuIHNvZnR3YXJlCisgICAgICogd2lsbCBoYXZlIHRvIHNldCB0aGUgIlBBVVNFIiBiaXRzIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZSBUcmFubXNpdAorICAgICAqIENvbmZpZyBXb3JkIFJlZ2lzdGVyIChUWENXKSBhbmQgcmUtc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4gIEhvd2V2ZXIsIGlmCisgICAgICogYXV0by1uZWdvdGlhdGlvbiBpcyBkaXNhYmxlZCwgdGhlbiBzb2Z0d2FyZSB3aWxsIGhhdmUgdG8gbWFudWFsbHkKKyAgICAgKiBjb25maWd1cmUgdGhlIHR3byBmbG93IGNvbnRyb2wgZW5hYmxlIGJpdHMgaW4gdGhlIENUUkwgcmVnaXN0ZXIuCisgICAgICoKKyAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmMiIHBhcmFtZXRlciBhcmU6CisgICAgICogICAgICAwOiAgRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKKyAgICAgKiAgICAgIDE6ICBSeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHJlY2VpdmUgcGF1c2UgZnJhbWVzLCBidXQKKyAgICAgKiAgICAgICAgICBub3Qgc2VuZCBwYXVzZSBmcmFtZXMpLgorICAgICAqICAgICAgMjogIFR4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gc2VuZCBwYXVzZSBmcmFtZXMgYnV0IHdlIGRvCisgICAgICogICAgICAgICAgbm90IHN1cHBvcnQgcmVjZWl2aW5nIHBhdXNlIGZyYW1lcykuCisgICAgICogICAgICAzOiAgQm90aCBSeCBhbmQgVFggZmxvdyBjb250cm9sIChzeW1tZXRyaWMpIGFyZSBlbmFibGVkLgorICAgICAqLworICAgIHN3aXRjaCAoaHctPmZjKSB7CisgICAgY2FzZSBFMTAwMF9GQ19OT05FOgorICAgICAgICAvKiBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4gKi8KKyAgICAgICAgdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0ZDX1JYX1BBVVNFOgorICAgICAgICAvKiBSWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCBhbmQgVFggRmxvdyBjb250cm9sIGlzIGRpc2FibGVkIGJ5IGEKKyAgICAgICAgICogc29mdHdhcmUgb3Zlci1yaWRlLiBTaW5jZSB0aGVyZSByZWFsbHkgaXNuJ3QgYSB3YXkgdG8gYWR2ZXJ0aXNlCisgICAgICAgICAqIHRoYXQgd2UgYXJlIGNhcGFibGUgb2YgUlggUGF1c2UgT05MWSwgd2Ugd2lsbCBhZHZlcnRpc2UgdGhhdCB3ZQorICAgICAgICAgKiBzdXBwb3J0IGJvdGggc3ltbWV0cmljIGFuZCBhc3ltbWV0cmljIFJYIFBBVVNFLiBMYXRlciwgd2Ugd2lsbAorICAgICAgICAgKiAgZGlzYWJsZSB0aGUgYWRhcHRlcidzIGFiaWxpdHkgdG8gc2VuZCBQQVVTRSBmcmFtZXMuCisgICAgICAgICAqLworICAgICAgICB0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfUEFVU0VfTUFTSyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfRkNfVFhfUEFVU0U6CisgICAgICAgIC8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzIGRpc2FibGVkLCBieSBhCisgICAgICAgICAqIHNvZnR3YXJlIG92ZXItcmlkZS4KKyAgICAgICAgICovCisgICAgICAgIHR4Y3cgPSAoRTEwMDBfVFhDV19BTkUgfCBFMTAwMF9UWENXX0ZEIHwgRTEwMDBfVFhDV19BU01fRElSKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9GQ19GVUxMOgorICAgICAgICAvKiBGbG93IGNvbnRyb2wgKGJvdGggUlggYW5kIFRYKSBpcyBlbmFibGVkIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLiAqLworICAgICAgICB0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfUEFVU0VfTUFTSyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIERFQlVHT1VUKCJGbG93IGNvbnRyb2wgcGFyYW0gc2V0IGluY29ycmVjdGx5XG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTaW5jZSBhdXRvLW5lZ290aWF0aW9uIGlzIGVuYWJsZWQsIHRha2UgdGhlIGxpbmsgb3V0IG9mIHJlc2V0ICh0aGUgbGluaworICAgICAqIHdpbGwgYmUgaW4gcmVzZXQsIGJlY2F1c2Ugd2UgcHJldmlvdXNseSByZXNldCB0aGUgY2hpcCkuIFRoaXMgd2lsbAorICAgICAqIHJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4gIElmIGF1dG8tbmVvZ3RpYXRpb24gaXMgc3VjY2Vzc2Z1bCB0aGVuIHRoZQorICAgICAqIGxpbmstdXAgc3RhdHVzIGJpdCB3aWxsIGJlIHNldCBhbmQgdGhlIGZsb3cgY29udHJvbCBlbmFibGUgYml0cyAoUkZDRQorICAgICAqIGFuZCBURkNFKSB3aWxsIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnb3RpYXRlZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBERUJVR09VVCgiQXV0by1uZWdvdGlhdGlvbiBlbmFibGVkXG4iKTsKKworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhDVywgdHhjdyk7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisKKyAgICBody0+dHhjdyA9IHR4Y3c7CisgICAgbXNsZWVwKDEpOworCisgICAgLyogSWYgd2UgaGF2ZSBhIHNpZ25hbCAodGhlIGNhYmxlIGlzIHBsdWdnZWQgaW4pIHRoZW4gcG9sbCBmb3IgYSAiTGluay1VcCIKKyAgICAgKiBpbmRpY2F0aW9uIGluIHRoZSBEZXZpY2UgU3RhdHVzIFJlZ2lzdGVyLiAgVGltZS1vdXQgaWYgYSBsaW5rIGlzbid0CisgICAgICogc2VlbiBpbiA1MDAgbWlsbGlzZWNvbmRzIHNlY29uZHMgKEF1dG8tbmVnb3RpYXRpb24gc2hvdWxkIGNvbXBsZXRlIGluCisgICAgICogbGVzcyB0aGFuIDUwMCBtaWxsaXNlY29uZHMgZXZlbiBpZiB0aGUgb3RoZXIgZW5kIGlzIGRvaW5nIGl0IGluIFNXKS4KKyAgICAgKiBGb3IgaW50ZXJuYWwgc2VyZGVzLCB3ZSBqdXN0IGFzc3VtZSBhIHNpZ25hbCBpcyBwcmVzZW50LCB0aGVuIHBvbGwuCisgICAgICovCisgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzIHx8CisgICAgICAgKEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKSAmIEUxMDAwX0NUUkxfU1dEUElOMSkgPT0gc2lnbmFsKSB7CisgICAgICAgIERFQlVHT1VUKCJMb29raW5nIGZvciBMaW5rXG4iKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChMSU5LX1VQX1RJTUVPVVQgLyAxMCk7IGkrKykgeworICAgICAgICAgICAgbXNsZWVwKDEwKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gKExJTktfVVBfVElNRU9VVCAvIDEwKSkgeworICAgICAgICAgICAgREVCVUdPVVQoIk5ldmVyIGdvdCBhIHZhbGlkIGxpbmsgZnJvbSBhdXRvLW5lZyEhIVxuIik7CisgICAgICAgICAgICBody0+YXV0b25lZ19mYWlsZWQgPSAxOworICAgICAgICAgICAgLyogQXV0b05lZyBmYWlsZWQgdG8gYWNoaWV2ZSBhIGxpbmssIHNvIHdlJ2xsIGNhbGwKKyAgICAgICAgICAgICAqIGUxMDAwX2NoZWNrX2Zvcl9saW5rLiBUaGlzIHJvdXRpbmUgd2lsbCBmb3JjZSB0aGUgbGluayB1cCBpZgorICAgICAgICAgICAgICogd2UgZGV0ZWN0IGEgc2lnbmFsLiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gY29tbXVuaWNhdGUgd2l0aAorICAgICAgICAgICAgICogbm9uLWF1dG9uZWdvdGlhdGluZyBsaW5rIHBhcnRuZXJzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY2hlY2tfZm9yX2xpbmsoaHcpOworICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yIGxpbmtcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHctPmF1dG9uZWdfZmFpbGVkID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGh3LT5hdXRvbmVnX2ZhaWxlZCA9IDA7CisgICAgICAgICAgICBERUJVR09VVCgiVmFsaWQgTGluayBGb3VuZFxuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBERUJVR09VVCgiTm8gU2lnbmFsIERldGVjdGVkXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBQSFkgYW5kIGNoYW5nZSBQSFkgbW9kZSBiZWZvcmUgbGluayBzZXR1cC4KKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsOworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfcHJlY29uZmlnIik7CisKKyAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworICAgIC8qIFdpdGggODI1NDMsIHdlIG5lZWQgdG8gZm9yY2Ugc3BlZWQgYW5kIGR1cGxleCBvbiB0aGUgTUFDIGVxdWFsIHRvIHdoYXQKKyAgICAgKiB0aGUgUEhZIHNwZWVkIGFuZCBkdXBsZXggY29uZmlndXJhdGlvbiBpcy4gSW4gYWRkaXRpb24sIHdlIG5lZWQgdG8KKyAgICAgKiBwZXJmb3JtIGEgaGFyZHdhcmUgcmVzZXQgb24gdGhlIFBIWSB0byB0YWtlIGl0IG91dCBvZiByZXNldC4KKyAgICAgKi8KKyAgICBpZiAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NMVTsKKyAgICAgICAgY3RybCAmPSB+KEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFgpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGN0cmwgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFggfCBFMTAwMF9DVFJMX1NMVSk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfaHdfcmVzZXQoaHcpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgUEhZICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX2RldGVjdF9naWdfcGh5KGh3KTsKKyAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICBERUJVR09VVCgiRXJyb3IsIGRpZCBub3QgZGV0ZWN0IHZhbGlkIHBoeS5cbiIpOworICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisgICAgREVCVUdPVVQxKCJQaHkgSUQgPSAlIzA4eCBcbiIsIGh3LT5waHlfaWQpOworCisgICAgLyogU2V0IFBIWSB0byBjbGFzcyBBIG1vZGUgKGlmIG5lY2Vzc2FyeSkgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfc2V0X3BoeV9tb2RlKGh3KTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NV9yZXZfMykgfHwKKyAgICAgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ2X3Jldl8zKSkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICBwaHlfZGF0YSB8PSAweDAwMDAwMDA4OworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOworICAgIH0KKworICAgIGlmIChody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDMgfHwKKyAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NyB8fAorICAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKQorICAgICAgICBody0+cGh5X3Jlc2V0X2Rpc2FibGUgPSBGQUxTRTsKKworICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHBlciBsaW5rIHNldHVwIGZvciBlMTAwMF9waHlfaWdwIHNlcmllcy4KKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9jb3BwZXJfbGlua19pZ3Bfc2V0dXAoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBsZWRfY3RybDsKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2NvcHBlcl9saW5rX2lncF9zZXR1cCIpOworCisgICAgaWYgKGh3LT5waHlfcmVzZXRfZGlzYWJsZSkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKKyAgICByZXRfdmFsID0gZTEwMDBfcGh5X3Jlc2V0KGh3KTsKKyAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIHRoZSBQSFlcbiIpOworICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdhaXQgMTAwbXMgZm9yIE1BQyB0byBjb25maWd1cmUgUEhZIGZyb20gTlZNIHNldHRpbmdzLCB0byBhdm9pZAorICAgICAqIHRpbWVvdXQgaXNzdWVzIHdoZW4gTEZTIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgbXNsZWVwKDEwMCk7CisKKyAgICBpZiAoaHctPm1hY190eXBlICE9IGUxMDAwX2ljaDhsYW4gJiYgaHctPm1hY190eXBlICE9IGUxMDAwXzgyNTc2KSB7CisgICAgLyogQ29uZmlndXJlIGFjdGl2aXR5IExFRCBhZnRlciBQSFkgcmVzZXQgKi8KKyAgICBsZWRfY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBMRURDVEwpOworICAgIGxlZF9jdHJsICY9IElHUF9BQ1RJVklUWV9MRURfTUFTSzsKKyAgICBsZWRfY3RybCB8PSAoSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgfCBJR1BfTEVEM19NT0RFKTsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgbGVkX2N0cmwpOworICAgIH0KKworICAgIC8qIFRoZSBOVk0gc2V0dGluZ3Mgd2lsbCBjb25maWd1cmUgTFBMVSBpbiBEMyBmb3IgSUdQMiBhbmQgSUdQMyBQSFlzICovCisgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisgICAgICAgIC8qIGRpc2FibGUgbHBsdSBkMyBkdXJpbmcgZHJpdmVyIGluaXQgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3NldF9kM19scGx1X3N0YXRlKGh3LCBGQUxTRSk7CisgICAgICAgIGlmIChyZXRfdmFsKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgRGlzYWJsaW5nIExQTFUgRDNcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkaXNhYmxlIGxwbHUgZDAgZHVyaW5nIGRyaXZlciBpbml0ICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3NldF9kMF9scGx1X3N0YXRlKGh3LCBGQUxTRSk7CisgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgREVCVUdPVVQoIkVycm9yIERpc2FibGluZyBMUExVIEQwXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorICAgIC8qIENvbmZpZ3VyZSBtZGktbWRpeCBzZXR0aW5ncyAqLworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKyAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2Rpc2FibGVkOworICAgICAgICAvKiBGb3JjZSBNREkgZm9yIGVhcmxpZXIgcmV2cyBvZiB0aGUgSUdQIFBIWSAqLworICAgICAgICBwaHlfZGF0YSAmPSB+KElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVggfCBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVgpOworICAgICAgICBody0+bWRpeCA9IDE7CisKKyAgICB9IGVsc2UgeworICAgICAgICBody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZDsKKyAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7CisKKyAgICAgICAgc3dpdGNoIChody0+bWRpeCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgcGh5X2RhdGEpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIHNldCBhdXRvLW1hc3RlciBzbGF2ZSByZXNvbHV0aW9uIHNldHRpbmdzICovCisgICAgaWYgKGh3LT5hdXRvbmVnKSB7CisgICAgICAgIGUxMDAwX21zX3R5cGUgcGh5X21zX3NldHRpbmcgPSBody0+bWFzdGVyX3NsYXZlOworCisgICAgICAgIGlmIChody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSkKKyAgICAgICAgICAgIGh3LT5mZmVfY29uZmlnX3N0YXRlID0gZTEwMDBfZmZlX2NvbmZpZ19lbmFibGVkOworCisgICAgICAgIGlmIChody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCkKKyAgICAgICAgICAgIGh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOworCisgICAgICAgIC8qIHdoZW4gYXV0b25lZ290aWF0aW9uIGFkdmVydGlzbWVudCBpcyBvbmx5IDEwMDBNYnBzIHRoZW4gd2UKKyAgICAgICAgICAqIHNob3VsZCBkaXNhYmxlIFNtYXJ0U3BlZWQgYW5kIGVuYWJsZSBBdXRvIE1hc3RlclNsYXZlCisgICAgICAgICAgKiByZXNvbHV0aW9uIGFzIGhhcmR3YXJlIGRlZmF1bHQuICovCisgICAgICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFEVkVSVElTRV8xMDAwX0ZVTEwpIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgU21hcnRTcGVlZCAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICAvKiBTZXQgYXV0byBNYXN0ZXIvU2xhdmUgcmVzb2x1dGlvbiBwcm9jZXNzICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgcGh5X2RhdGEgJj0gfkNSXzEwMDBUX01TX0VOQUJMRTsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiBsb2FkIGRlZmF1bHRzIGZvciBmdXR1cmUgdXNlICovCisgICAgICAgIGh3LT5vcmlnaW5hbF9tYXN0ZXJfc2xhdmUgPSAocGh5X2RhdGEgJiBDUl8xMDAwVF9NU19FTkFCTEUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBoeV9kYXRhICYgQ1JfMTAwMFRfTVNfVkFMVUUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfZm9yY2VfbWFzdGVyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfZm9yY2Vfc2xhdmUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfYXV0bzsKKworICAgICAgICBzd2l0Y2ggKHBoeV9tc19zZXR0aW5nKSB7CisgICAgICAgIGNhc2UgZTEwMDBfbXNfZm9yY2VfbWFzdGVyOgorICAgICAgICAgICAgcGh5X2RhdGEgfD0gKENSXzEwMDBUX01TX0VOQUJMRSB8IENSXzEwMDBUX01TX1ZBTFVFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGUxMDAwX21zX2ZvcmNlX3NsYXZlOgorICAgICAgICAgICAgcGh5X2RhdGEgfD0gQ1JfMTAwMFRfTVNfRU5BQkxFOworICAgICAgICAgICAgcGh5X2RhdGEgJj0gfihDUl8xMDAwVF9NU19WQUxVRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9tc19hdXRvOgorICAgICAgICAgICAgcGh5X2RhdGEgJj0gfkNSXzEwMDBUX01TX0VOQUJMRTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHBlciBsaW5rIHNldHVwIGZvciBlMTAwMF9waHlfZ2c4MjU2MyBzZXJpZXMuCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfY29wcGVyX2xpbmtfZ2dwX3NldHVwKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworICAgIHVpbnQzMl90IHJlZ19kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9jb3BwZXJfbGlua19nZ3Bfc2V0dXAiKTsKKworICAgIGlmICghaHctPnBoeV9yZXNldF9kaXNhYmxlKSB7CisKKyAgICAgICAgLyogRW5hYmxlIENSUyBvbiBUWCBmb3IgaGFsZi1kdXBsZXggb3BlcmF0aW9uLiAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9NQUNfU1BFQ19DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19NU0NSX0FTU0VSVF9DUlNfT05fVFg7CisgICAgICAgIC8qIFVzZSAyNU1IeiBmb3IgYm90aCBsaW5rIGRvd24gYW5kIDEwMDBCQVNFLVQgZm9yIFR4IGNsb2NrICovCisgICAgICAgIHBoeV9kYXRhIHw9IEdHODI1NjNfTVNDUl9UWF9DTEtfMTAwME1CUFNfMjVNSFo7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIEdHODI1NjNfUEhZX01BQ19TUEVDX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiBPcHRpb25zOgorICAgICAgICAgKiAgIE1ESS9NREktWCA9IDAgKGRlZmF1bHQpCisgICAgICAgICAqICAgMCAtIEF1dG8gZm9yIGFsbCBzcGVlZHMKKyAgICAgICAgICogICAxIC0gTURJIG1vZGUKKyAgICAgICAgICogICAyIC0gTURJLVggbW9kZQorICAgICAgICAgKiAgIDMgLSBBdXRvIGZvciAxMDAwQmFzZS1UIG9ubHkgKE1ESS1YIGZvciAxMC8xMDBCYXNlLVQgbW9kZXMpCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgJj0gfkdHODI1NjNfUFNDUl9DUk9TU09WRVJfTU9ERV9NQVNLOworCisgICAgICAgIHN3aXRjaCAoaHctPm1kaXgpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19QU0NSX0NST1NTT1ZFUl9NT0RFX01ESTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwaHlfZGF0YSB8PSBHRzgyNTYzX1BTQ1JfQ1JPU1NPVkVSX01PREVfTURJWDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwaHlfZGF0YSB8PSBHRzgyNTYzX1BTQ1JfQ1JPU1NPVkVSX01PREVfQVVUTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogT3B0aW9uczoKKyAgICAgICAgICogICBkaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb24gPSAwIChkZWZhdWx0KQorICAgICAgICAgKiAgICAgICBBdXRvbWF0aWMgQ29ycmVjdGlvbiBmb3IgUmV2ZXJzZWQgQ2FibGUgUG9sYXJpdHkKKyAgICAgICAgICogICAwIC0gRGlzYWJsZWQKKyAgICAgICAgICogICAxIC0gRW5hYmxlZAorICAgICAgICAgKi8KKyAgICAgICAgcGh5X2RhdGEgJj0gfkdHODI1NjNfUFNDUl9QT0xBUklUWV9SRVZFUlNBTF9ESVNBQkxFOworICAgICAgICBpZiAoaHctPmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9PSAxKQorICAgICAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19QU0NSX1BPTEFSSVRZX1JFVkVSU0FMX0RJU0FCTEU7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKKworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIC8qIFNXIFJlc2V0IHRoZSBQSFkgc28gYWxsIGNoYW5nZXMgdGFrZSBlZmZlY3QgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldChodyk7CisgICAgICAgIGlmIChyZXRfdmFsKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIHRoZSBQSFlcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9IC8qIHBoeV9yZXNldF9kaXNhYmxlICovCisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSB7CisgICAgICAgIC8qIEJ5cGFzcyBSWCBhbmQgVFggRklGTydzICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9rbXJuX3JlZyhodywgRTEwMDBfS1VNQ1RSTFNUQV9PRkZTRVRfRklGT19DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfS1VNQ1RSTFNUQV9GSUZPX0NUUkxfUlhfQllQQVNTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0tVTUNUUkxTVEFfRklGT19DVFJMX1RYX0JZUEFTUyk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfU1BFQ19DVFJMXzIsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgJj0gfkdHODI1NjNfUFNDUjJfUkVWRVJTRV9BVVRPX05FRzsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIEdHODI1NjNfUEhZX1NQRUNfQ1RSTF8yLCBwaHlfZGF0YSk7CisKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICByZWdfZGF0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMX0VYVCk7CisgICAgICAgIHJlZ19kYXRhICY9IH4oRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX01BU0spOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCByZWdfZGF0YSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfUFdSX01HTVRfQ1RSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgLyogRG8gbm90IGluaXQgdGhlc2UgcmVnaXN0ZXJzIHdoZW4gdGhlIEhXIGlzIGluIElBTVQgbW9kZSwgc2luY2UgdGhlCisgICAgICAgICAqIGZpcm13YXJlIHdpbGwgaGF2ZSBhbHJlYWR5IGluaXRpYWxpemVkIHRoZW0uICBXZSBvbmx5IGluaXRpYWxpemUKKyAgICAgICAgICogdGhlbSBpZiB0aGUgSFcgaXMgbm90IGluIElBTVQgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChlMTAwMF9jaGVja19tbmdfbW9kZShodykgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgIC8qIEVuYWJsZSBFbGVjdHJpY2FsIElkbGUgb24gdGhlIFBIWSAqLworICAgICAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19QTUNSX0VOQUJMRV9FTEVDVFJJQ0FMX0lETEU7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfUFdSX01HTVRfQ1RSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBwaHlfZGF0YSAmPSB+R0c4MjU2M19LTUNSX1BBU1NfRkFMU0VfQ0FSUklFUjsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBXb3JrYXJvdW5kOiBEaXNhYmxlIHBhZGRpbmcgaW4gS3VtZXJhbiBpbnRlcmZhY2UgaW4gdGhlIE1BQworICAgICAgICAgKiBhbmQgaW4gdGhlIFBIWSB0byBhdm9pZCBDUkMgZXJyb3JzLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfSU5CQU5EX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19JQ1JfRElTX1BBRERJTkc7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9JTkJBTkRfQ1RSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29wcGVyIGxpbmsgc2V0dXAgZm9yIGUxMDAwX3BoeV9tODggc2VyaWVzLgorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2NvcHBlcl9saW5rX21ncF9zZXR1cChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfbWdwX3NldHVwIik7CisKKyAgICBpZiAoaHctPnBoeV9yZXNldF9kaXNhYmxlKQorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworICAgIC8qIEVuYWJsZSBDUlMgb24gVFguIFRoaXMgbXVzdCBiZSBzZXQgZm9yIGhhbGYtZHVwbGV4IG9wZXJhdGlvbi4gKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWDsKKworICAgIC8qIE9wdGlvbnM6CisgICAgICogICBNREkvTURJLVggPSAwIChkZWZhdWx0KQorICAgICAqICAgMCAtIEF1dG8gZm9yIGFsbCBzcGVlZHMKKyAgICAgKiAgIDEgLSBNREkgbW9kZQorICAgICAqICAgMiAtIE1ESS1YIG1vZGUKKyAgICAgKiAgIDMgLSBBdXRvIGZvciAxMDAwQmFzZS1UIG9ubHkgKE1ESS1YIGZvciAxMC8xMDBCYXNlLVQgbW9kZXMpCisgICAgICovCisgICAgcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfQVVUT19YX01PREU7CisKKyAgICBzd2l0Y2ggKGh3LT5tZGl4KSB7CisgICAgY2FzZSAxOgorICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX01ESV9NQU5VQUxfTU9ERTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX01ESVhfTUFOVUFMX01PREU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BVVRPX1hfMTAwMFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICBkZWZhdWx0OgorICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBPcHRpb25zOgorICAgICAqICAgZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID0gMCAoZGVmYXVsdCkKKyAgICAgKiAgICAgICBBdXRvbWF0aWMgQ29ycmVjdGlvbiBmb3IgUmV2ZXJzZWQgQ2FibGUgUG9sYXJpdHkKKyAgICAgKiAgIDAgLSBEaXNhYmxlZAorICAgICAqICAgMSAtIEVuYWJsZWQKKyAgICAgKi8KKyAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTDsKKyAgICBpZiAoaHctPmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9PSAxKQorICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMOworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCBwaHlfZGF0YSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgaWYgKGh3LT5waHlfcmV2aXNpb24gPCBNODhFMTAxMV9JX1JFVl80KSB7CisgICAgICAgIC8qIEZvcmNlIFRYX0NMSyBpbiB0aGUgRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIKKyAgICAgICAgICogdG8gMjVNSHogY2xvY2suCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMjU7CisKKyAgICAgICAgaWYgKChody0+cGh5X3JldmlzaW9uID09IEUxMDAwX1JFVklTSU9OXzIpICYmCisgICAgICAgICAgICAoaHctPnBoeV9pZCA9PSBNODhFMTExMV9JX1BIWV9JRCkpIHsKKyAgICAgICAgICAgIC8qIFZpZGFsaWEgUGh5LCBzZXQgdGhlIGRvd25zaGlmdCBjb3VudGVyIHRvIDV4ICovCisgICAgICAgICAgICBwaHlfZGF0YSAmPSB+KE04OEVDMDE4X0VQU0NSX0RPV05TSElGVF9DT1VOVEVSX01BU0spOworICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RUMwMThfRVBTQ1JfRE9XTlNISUZUX0NPVU5URVJfNVg7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDb25maWd1cmUgTWFzdGVyIGFuZCBTbGF2ZSBkb3duc2hpZnQgdmFsdWVzICovCisgICAgICAgICAgICBwaHlfZGF0YSAmPSB+KE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfTUFTSyk7CisgICAgICAgICAgICBwaHlfZGF0YSB8PSAoTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF8xWCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF8xWCk7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNXIFJlc2V0IHRoZSBQSFkgc28gYWxsIGNoYW5nZXMgdGFrZSBlZmZlY3QgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcGh5X3Jlc2V0KGh3KTsKKyAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIHRoZSBQSFlcbiIpOworICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2V0dXAgYXV0by1uZWdvdGlhdGlvbiBhbmQgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnRzLAorKiBhbmQgdGhlbiBwZXJmb3JtIGF1dG8tbmVnb3RpYXRpb24uCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfY29wcGVyX2xpbmtfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfYXV0b25lZyIpOworCisgICAgLyogUGVyZm9ybSBzb21lIGJvdW5kcyBjaGVja2luZyBvbiB0aGUgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZAorICAgICAqIHBhcmFtZXRlci4gIElmIHRoaXMgdmFyaWFibGUgaXMgemVybywgdGhlbiBzZXQgaXQgdG8gdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOworCisgICAgLyogSWYgYXV0b25lZ19hZHZlcnRpc2VkIGlzIHplcm8sIHdlIGFzc3VtZSBpdCB3YXMgbm90IGRlZmF1bHRlZAorICAgICAqIGJ5IHRoZSBjYWxsaW5nIGNvZGUgc28gd2Ugc2V0IHRvIGFkdmVydGlzZSBmdWxsIGNhcGFiaWxpdHkuCisgICAgICovCisgICAgaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gMCkKKyAgICAgICAgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQ7CisKKyAgICAvKiBJRkUgcGh5IG9ubHkgc3VwcG9ydHMgMTAvMTAwICovCisgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKQorICAgICAgICBody0+YXV0b25lZ19hZHZlcnRpc2VkICY9IEFVVE9ORUdfQURWRVJUSVNFXzEwXzEwMF9BTEw7CisKKyAgICBERUJVR09VVCgiUmVjb25maWd1cmluZyBhdXRvLW5lZyBhZHZlcnRpc2VtZW50IHBhcmFtc1xuIik7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnKGh3KTsKKyAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICBERUJVR09VVCgiRXJyb3IgU2V0dGluZyB1cCBBdXRvLU5lZ290aWF0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorICAgIERFQlVHT1VUKCJSZXN0YXJ0aW5nIEF1dG8tTmVnXG4iKTsKKworICAgIC8qIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiBieSBzZXR0aW5nIHRoZSBBdXRvIE5lZyBFbmFibGUgYml0IGFuZAorICAgICAqIHRoZSBBdXRvIE5lZyBSZXN0YXJ0IGJpdCBpbiB0aGUgUEhZIGNvbnRyb2wgcmVnaXN0ZXIuCisgICAgICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZwaHlfZGF0YSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcGh5X2RhdGEgfD0gKE1JSV9DUl9BVVRPX05FR19FTiB8IE1JSV9DUl9SRVNUQVJUX0FVVE9fTkVHKTsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIHBoeV9kYXRhKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAvKiBEb2VzIHRoZSB1c2VyIHdhbnQgdG8gd2FpdCBmb3IgQXV0by1OZWcgdG8gY29tcGxldGUgaGVyZSwgb3IKKyAgICAgKiBjaGVjayBhdCBhIGxhdGVyIHRpbWUgKGZvciBleGFtcGxlLCBjYWxsYmFjayByb3V0aW5lKS4KKyAgICAgKi8KKyAgICBpZiAoaHctPndhaXRfYXV0b25lZ19jb21wbGV0ZSkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfd2FpdF9hdXRvbmVnKGh3KTsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgaHctPmdldF9saW5rX3N0YXR1cyA9IFRSVUU7CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb25maWcgdGhlIE1BQyBhbmQgdGhlIFBIWSBhZnRlciBsaW5rIGlzIHVwLgorKiAgIDEpIFNldCB1cCB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKKyogICAgICBpZiB3ZSBhcmUgb24gODI1NDMuICBJZiB3ZQorKiAgICAgIGFyZSBvbiBuZXdlciBzaWxpY29uLCB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlCisqICAgICAgY29sbGlzaW9uIGRpc3RhbmNlIGluIHRoZSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyLgorKiAgIDIpIFNldCB1cCBmbG93IGNvbnRyb2wgb24gdGhlIE1BQyB0byB0aGF0IGVzdGFibGlzaGVkIHdpdGgKKyogICAgICB0aGUgbGluayBwYXJ0bmVyLgorKiAgIDMpIENvbmZpZyBEU1AgdG8gaW1wcm92ZSBHaWdhYml0IGxpbmsgcXVhbGl0eSBmb3Igc29tZSBQSFkgcmV2aXNpb25zLgorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2NvcHBlcl9saW5rX3Bvc3Rjb25maWcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgREVCVUdGVU5DKCJlMTAwMF9jb3BwZXJfbGlua19wb3N0Y29uZmlnIik7CisKKyAgICBpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ0KSB7CisgICAgICAgIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19tYWNfdG9fcGh5KGh3KTsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBNQUMgdG8gUEhZIHNldHRpbmdzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfQorICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cChodyk7CisgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgREVCVUdPVVQoIkVycm9yIENvbmZpZ3VyaW5nIEZsb3cgQ29udHJvbFxuIik7CisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIC8qIENvbmZpZyBEU1AgdG8gaW1wcm92ZSBHaWdhIGxpbmsgcXVhbGl0eSAqLworICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZShodywgVFJVRSk7CisgICAgICAgIGlmIChyZXRfdmFsKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgQ29uZmlndXJpbmcgRFNQIGFmdGVyIGxpbmsgdXBcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEZXRlY3RzIHdoaWNoIFBIWSBpcyBwcmVzZW50IGFuZCBzZXR1cCB0aGUgc3BlZWQgYW5kIGR1cGxleAorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3NldHVwX2NvcHBlcl9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IGk7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisgICAgdWludDE2X3QgcmVnX2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldHVwX2NvcHBlcl9saW5rIik7CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46CisgICAgY2FzZSBlMTAwMF9pY2g4bGFuOgorICAgICAgICAvKiBTZXQgdGhlIG1hYyB0byB3YWl0IHRoZSBtYXhpbXVtIHRpbWUgYmV0d2VlbiBlYWNoCisgICAgICAgICAqIGl0ZXJhdGlvbiBhbmQgaW5jcmVhc2UgdGhlIG1heCBpdGVyYXRpb25zIHdoZW4KKyAgICAgICAgICogcG9sbGluZyB0aGUgcGh5OyB0aGlzIGZpeGVzIGVycm9uZW91cyB0aW1lb3V0cyBhdCAxME1icHMuICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9rbXJuX3JlZyhodywgR0c4MjU2M19SRUcoMHgzNCwgNCksIDB4RkZGRik7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX2ttcm5fcmVnKGh3LCBHRzgyNTYzX1JFRygweDM0LCA5KSwgJnJlZ19kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgcmVnX2RhdGEgfD0gMHgzRjsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX2ttcm5fcmVnKGh3LCBHRzgyNTYzX1JFRygweDM0LCA5KSwgcmVnX2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIGl0IGlzIGEgdmFsaWQgUEhZIGFuZCBzZXQgUEhZIG1vZGUgaWYgbmVjZXNzYXJ5LiAqLworICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWcoaHcpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKKyAgICAgICAgLyogS3VtZXJhbiByZWdpc3RlcnMgYXJlIHdyaXR0ZW4tb25seSAqLworICAgICAgICByZWdfZGF0YSA9IEUxMDAwX0tVTUNUUkxTVEFfSU5CX0NUUkxfTElOS19TVEFUVVNfVFhfVElNRU9VVF9ERUZBVUxUOworICAgICAgICByZWdfZGF0YSB8PSBFMTAwMF9LVU1DVFJMU1RBX0lOQl9DVFJMX0RJU19QQURESU5HOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfa21ybl9yZWcoaHcsIEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUX0lOQl9DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnX2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgfHwKKyAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMyB8fAorICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19pZ3Bfc2V0dXAoaHcpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX21ncF9zZXR1cChodyk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX2dncF9zZXR1cChodyk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorCisgICAgaWYgKGh3LT5hdXRvbmVnKSB7CisgICAgICAgIC8qIFNldHVwIGF1dG9uZWcgYW5kIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50CisgICAgICAgICAgKiBhbmQgcGVyZm9ybSBhdXRvbmVnb3RpYXRpb24gKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX2F1dG9uZWcoaHcpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFBIWSB3aWxsIGJlIHNldCB0byAxMEgsIDEwRiwgMTAwSCxvciAxMDBGCisgICAgICAgICAgKiBkZXBlbmRpbmcgb24gdmFsdWUgZnJvbSBmb3JjZWRfc3BlZWRfZHVwbGV4LiAqLworICAgICAgICBERUJVR09VVCgiRm9yY2luZyBzcGVlZCBhbmQgZHVwbGV4XG4iKTsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXgoaHcpOworICAgICAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIEZvcmNpbmcgU3BlZWQgYW5kIER1cGxleFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIGxpbmsgc3RhdHVzLiBXYWl0IHVwIHRvIDEwMCBtaWNyb3NlY29uZHMgZm9yIGxpbmsgdG8gYmVjb21lCisgICAgICogdmFsaWQuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBpZiAocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpIHsKKyAgICAgICAgICAgIC8qIENvbmZpZyB0aGUgTUFDIGFuZCBQSFkgYWZ0ZXIgbGluayBpcyB1cCAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX3Bvc3Rjb25maWcoaHcpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIERFQlVHT1VUKCJWYWxpZCBsaW5rIGVzdGFibGlzaGVkISEhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIHVkZWxheSgxMCk7CisgICAgfQorCisgICAgREVCVUdPVVQoIlVuYWJsZSB0byBlc3RhYmxpc2ggbGluayEhIVxuIik7CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29uZmlndXJlIHRoZSBNQUMtdG8tUEhZIGludGVyZmFjZSBmb3IgMTAvMTAwTWJwcworKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2NvbmZpZ3VyZV9rbXJuX2Zvcl8xMF8xMDAoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgZHVwbGV4KQoreworICAgIGludDMyX3QgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisgICAgdWludDMyX3QgdGlwZzsKKyAgICB1aW50MTZfdCByZWdfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlndXJlX2ttcm5fZm9yXzEwXzEwMCIpOworCisgICAgcmVnX2RhdGEgPSBFMTAwMF9LVU1DVFJMU1RBX0hEX0NUUkxfMTBfMTAwX0RFRkFVTFQ7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX2ttcm5fcmVnKGh3LCBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVF9IRF9DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfZGF0YSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgLyogQ29uZmlndXJlIFRyYW5zbWl0IEludGVyLVBhY2tldCBHYXAgKi8KKyAgICB0aXBnID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRJUEcpOworICAgIHRpcGcgJj0gfkUxMDAwX1RJUEdfSVBHVF9NQVNLOworICAgIHRpcGcgfD0gREVGQVVMVF84MDAwM0VTMkxBTl9USVBHX0lQR1RfMTBfMTAwOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVElQRywgdGlwZyk7CisKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwgJnJlZ19kYXRhKTsKKworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIGlmIChkdXBsZXggPT0gSEFMRl9EVVBMRVgpCisgICAgICAgIHJlZ19kYXRhIHw9IEdHODI1NjNfS01DUl9QQVNTX0ZBTFNFX0NBUlJJRVI7CisgICAgZWxzZQorICAgICAgICByZWdfZGF0YSAmPSB+R0c4MjU2M19LTUNSX1BBU1NfRkFMU0VfQ0FSUklFUjsKKworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwgcmVnX2RhdGEpOworCisgICAgcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBpbnQzMl90CitlMTAwMF9jb25maWd1cmVfa21ybl9mb3JfMTAwMChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisgICAgdWludDE2X3QgcmVnX2RhdGE7CisgICAgdWludDMyX3QgdGlwZzsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlndXJlX2ttcm5fZm9yXzEwMDAiKTsKKworICAgIHJlZ19kYXRhID0gRTEwMDBfS1VNQ1RSTFNUQV9IRF9DVFJMXzEwMDBfREVGQVVMVDsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfa21ybl9yZWcoaHcsIEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUX0hEX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19kYXRhKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAvKiBDb25maWd1cmUgVHJhbnNtaXQgSW50ZXItUGFja2V0IEdhcCAqLworICAgIHRpcGcgPSBFMTAwMF9SRUFEX1JFRyhodywgVElQRyk7CisgICAgdGlwZyAmPSB+RTEwMDBfVElQR19JUEdUX01BU0s7CisgICAgdGlwZyB8PSBERUZBVUxUXzgwMDAzRVMyTEFOX1RJUEdfSVBHVF8xMDAwOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVElQRywgdGlwZyk7CisKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwgJnJlZ19kYXRhKTsKKworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJlZ19kYXRhICY9IH5HRzgyNTYzX0tNQ1JfUEFTU19GQUxTRV9DQVJSSUVSOworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwgcmVnX2RhdGEpOworCisgICAgcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29uZmlndXJlcyBQSFkgYXV0b25lZyBhbmQgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQgc2V0dGluZ3MKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3BoeV9zZXR1cF9hdXRvbmVnKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IG1paV9hdXRvbmVnX2Fkdl9yZWc7CisgICAgdWludDE2X3QgbWlpXzEwMDB0X2N0cmxfcmVnOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfc2V0dXBfYXV0b25lZyIpOworCisgICAgLyogUmVhZCB0aGUgTUlJIEF1dG8tTmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkuICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLCAmbWlpX2F1dG9uZWdfYWR2X3JlZyk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgaWYgKGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWZlKSB7CisgICAgICAgIC8qIFJlYWQgdGhlIE1JSSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKEFkZHJlc3MgOSkuICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCAmbWlpXzEwMDB0X2N0cmxfcmVnKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9IGVsc2UKKyAgICAgICAgbWlpXzEwMDB0X2N0cmxfcmVnPTA7CisKKyAgICAvKiBOZWVkIHRvIHBhcnNlIGJvdGggYXV0b25lZ19hZHZlcnRpc2VkIGFuZCBmYyBhbmQgc2V0IHVwCisgICAgICogdGhlIGFwcHJvcHJpYXRlIFBIWSByZWdpc3RlcnMuICBGaXJzdCB3ZSB3aWxsIHBhcnNlIGZvcgorICAgICAqIGF1dG9uZWdfYWR2ZXJ0aXNlZCBzb2Z0d2FyZSBvdmVycmlkZS4gIFNpbmNlIHdlIGNhbiBhZHZlcnRpc2UKKyAgICAgKiBhIHBsZXRob3JhIG9mIGNvbWJpbmF0aW9ucywgd2UgbmVlZCB0byBjaGVjayBlYWNoIGJpdAorICAgICAqIGluZGl2aWR1YWxseS4KKyAgICAgKi8KKworICAgIC8qIEZpcnN0IHdlIGNsZWFyIGFsbCB0aGUgMTAvMTAwIG1iIHNwZWVkIGJpdHMgaW4gdGhlIEF1dG8tTmVnCisgICAgICogQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoQWRkcmVzcyA0KSBhbmQgdGhlIDEwMDAgbWIgc3BlZWQgYml0cyBpbgorICAgICAqIHRoZSAgMTAwMEJhc2UtVCBDb250cm9sIFJlZ2lzdGVyIChBZGRyZXNzIDkpLgorICAgICAqLworICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgJj0gflJFRzRfU1BFRURfTUFTSzsKKyAgICBtaWlfMTAwMHRfY3RybF9yZWcgJj0gflJFRzlfU1BFRURfTUFTSzsKKworICAgIERFQlVHT1VUMSgiYXV0b25lZ19hZHZlcnRpc2VkICV4XG4iLCBody0+YXV0b25lZ19hZHZlcnRpc2VkKTsKKworICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwIE1iIEhhbGYgRHVwbGV4PyAqLworICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwX0hBTEYpIHsKKyAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMG1iIEhhbGYgZHVwbGV4XG4iKTsKKyAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwVF9IRF9DQVBTOworICAgIH0KKworICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwIE1iIEZ1bGwgRHVwbGV4PyAqLworICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwX0ZVTEwpIHsKKyAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMG1iIEZ1bGwgZHVwbGV4XG4iKTsKKyAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwVF9GRF9DQVBTOworICAgIH0KKworICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwMCBNYiBIYWxmIER1cGxleD8gKi8KKyAgICBpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDBfSEFMRikgeworICAgICAgICBERUJVR09VVCgiQWR2ZXJ0aXNlIDEwMG1iIEhhbGYgZHVwbGV4XG4iKTsKKyAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwMFRYX0hEX0NBUFM7CisgICAgfQorCisgICAgLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAwIE1iIEZ1bGwgRHVwbGV4PyAqLworICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMF9GVUxMKSB7CisgICAgICAgIERFQlVHT1VUKCJBZHZlcnRpc2UgMTAwbWIgRnVsbCBkdXBsZXhcbiIpOworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTAwVFhfRkRfQ0FQUzsKKyAgICB9CisKKyAgICAvKiBXZSBkbyBub3QgYWxsb3cgdGhlIFBoeSB0byBhZHZlcnRpc2UgMTAwMCBNYiBIYWxmIER1cGxleCAqLworICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMDBfSEFMRikgeworICAgICAgICBERUJVR09VVCgiQWR2ZXJ0aXNlIDEwMDBtYiBIYWxmIGR1cGxleCByZXF1ZXN0ZWQsIHJlcXVlc3QgZGVuaWVkIVxuIik7CisgICAgfQorCisgICAgLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAwMCBNYiBGdWxsIER1cGxleD8gKi8KKyAgICBpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDAwX0ZVTEwpIHsKKyAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMDAwbWIgRnVsbCBkdXBsZXhcbiIpOworICAgICAgICBtaWlfMTAwMHRfY3RybF9yZWcgfD0gQ1JfMTAwMFRfRkRfQ0FQUzsKKyAgICAgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKSB7CisgICAgICAgICAgICBERUJVR09VVCgiZTEwMDBfcGh5X2lmZSBpcyBhIDEwLzEwMCBQSFkuIEdpZ2FiaXQgc3BlZWQgaXMgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGEgc29mdHdhcmUgb3ZlcnJpZGUgb2YgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncywgYW5kCisgICAgICogc2V0dXAgdGhlIFBIWSBhZHZlcnRpc2VtZW50IHJlZ2lzdGVycyBhY2NvcmRpbmdseS4gIElmCisgICAgICogYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGVuIHNvZnR3YXJlIHdpbGwgaGF2ZSB0byBzZXQgdGhlCisgICAgICogIlBBVVNFIiBiaXRzIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZSBBdXRvLU5lZ290aWF0aW9uCisgICAgICogQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoUEhZX0FVVE9ORUdfQURWKSBhbmQgcmUtc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4KKyAgICAgKgorICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlICJmYyIgcGFyYW1ldGVyIGFyZToKKyAgICAgKiAgICAgIDA6ICBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAorICAgICAqICAgICAgMTogIFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZSBmcmFtZXMKKyAgICAgKiAgICAgICAgICBidXQgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKyAgICAgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzCisgICAgICogICAgICAgICAgYnV0IHdlIGRvIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorICAgICAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKyAgICAgKiAgb3RoZXI6ICBObyBzb2Z0d2FyZSBvdmVycmlkZS4gIFRoZSBmbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbgorICAgICAqICAgICAgICAgIGluIHRoZSBFRVBST00gaXMgdXNlZC4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKGh3LT5mYykgeworICAgIGNhc2UgRTEwMDBfRkNfTk9ORTogLyogMCAqLworICAgICAgICAvKiBGbG93IGNvbnRyb2wgKFJYICYgVFgpIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYQorICAgICAgICAgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCisgICAgICAgICAqLworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnICY9IH4oTldBWV9BUl9BU01fRElSIHwgTldBWV9BUl9QQVVTRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfRkNfUlhfUEFVU0U6IC8qIDEgKi8KKyAgICAgICAgLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsIGFuZCBUWCBGbG93IGNvbnRyb2wgaXMKKyAgICAgICAgICogZGlzYWJsZWQsIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLgorICAgICAgICAgKi8KKyAgICAgICAgLyogU2luY2UgdGhlcmUgcmVhbGx5IGlzbid0IGEgd2F5IHRvIGFkdmVydGlzZSB0aGF0IHdlIGFyZQorICAgICAgICAgKiBjYXBhYmxlIG9mIFJYIFBhdXNlIE9OTFksIHdlIHdpbGwgYWR2ZXJ0aXNlIHRoYXQgd2UKKyAgICAgICAgICogc3VwcG9ydCBib3RoIHN5bW1ldHJpYyBhbmQgYXN5bW1ldHJpYyBSWCBQQVVTRS4gIExhdGVyCisgICAgICAgICAqIChpbiBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cCkgd2Ugd2lsbCBkaXNhYmxlIHRoZQorICAgICAgICAgKmh3J3MgYWJpbGl0eSB0byBzZW5kIFBBVVNFIGZyYW1lcy4KKyAgICAgICAgICovCisgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0ZDX1RYX1BBVVNFOiAvKiAyICovCisgICAgICAgIC8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzCisgICAgICAgICAqIGRpc2FibGVkLCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4KKyAgICAgICAgICovCisgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl9BU01fRElSOworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnICY9IH5OV0FZX0FSX1BBVVNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0ZDX0ZVTEw6IC8qIDMgKi8KKyAgICAgICAgLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlCisgICAgICAgICAqIG92ZXItcmlkZS4KKyAgICAgICAgICovCisgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKyAgICB9CisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLCBtaWlfYXV0b25lZ19hZHZfcmVnKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBERUJVR09VVDEoIkF1dG8tTmVnIEFkdmVydGlzaW5nICV4XG4iLCBtaWlfYXV0b25lZ19hZHZfcmVnKTsKKworICAgIGlmIChody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lmZSkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIG1paV8xMDAwdF9jdHJsX3JlZyk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRm9yY2UgUEhZIHNwZWVkIGFuZCBkdXBsZXggc2V0dGluZ3MgdG8gaHctPmZvcmNlZF9zcGVlZF9kdXBsZXgKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybDsKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgbWlpX2N0cmxfcmVnOworICAgIHVpbnQxNl90IG1paV9zdGF0dXNfcmVnOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworICAgIHVpbnQxNl90IGk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXgiKTsKKworICAgIC8qIFR1cm4gb2ZmIEZsb3cgY29udHJvbCBpZiB3ZSBhcmUgZm9yY2luZyBzcGVlZCBhbmQgZHVwbGV4LiAqLworICAgIGh3LT5mYyA9IEUxMDAwX0ZDX05PTkU7CisKKyAgICBERUJVR09VVDEoImh3LT5mYyA9ICVkXG4iLCBody0+ZmMpOworCisgICAgLyogUmVhZCB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIuICovCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKworICAgIC8qIFNldCB0aGUgYml0cyB0byBGb3JjZSBTcGVlZCBhbmQgRHVwbGV4IGluIHRoZSBEZXZpY2UgQ3RybCBSZWcuICovCisgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCk7CisgICAgY3RybCAmPSB+KERFVklDRV9TUEVFRF9NQVNLKTsKKworICAgIC8qIENsZWFyIHRoZSBBdXRvIFNwZWVkIERldGVjdCBFbmFibGUgYml0LiAqLworICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfQVNERTsKKworICAgIC8qIFJlYWQgdGhlIE1JSSBDb250cm9sIFJlZ2lzdGVyLiAqLworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmbWlpX2N0cmxfcmVnKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAvKiBXZSBuZWVkIHRvIGRpc2FibGUgYXV0b25lZyBpbiBvcmRlciB0byBmb3JjZSBsaW5rIGFuZCBkdXBsZXguICovCisKKyAgICBtaWlfY3RybF9yZWcgJj0gfk1JSV9DUl9BVVRPX05FR19FTjsKKworICAgIC8qIEFyZSB3ZSBmb3JjaW5nIEZ1bGwgb3IgSGFsZiBEdXBsZXg/ICovCisgICAgaWYgKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9mdWxsIHx8CisgICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwpIHsKKyAgICAgICAgLyogV2Ugd2FudCB0byBmb3JjZSBmdWxsIGR1cGxleCBzbyB3ZSBTRVQgdGhlIGZ1bGwgZHVwbGV4IGJpdHMgaW4gdGhlCisgICAgICAgICAqIERldmljZSBhbmQgTUlJIENvbnRyb2wgUmVnaXN0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX0ZEOworICAgICAgICBtaWlfY3RybF9yZWcgfD0gTUlJX0NSX0ZVTExfRFVQTEVYOworICAgICAgICBERUJVR09VVCgiRnVsbCBEdXBsZXhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlIHdhbnQgdG8gZm9yY2UgaGFsZiBkdXBsZXggc28gd2UgQ0xFQVIgdGhlIGZ1bGwgZHVwbGV4IGJpdHMgaW4KKyAgICAgICAgICogdGhlIERldmljZSBhbmQgTUlJIENvbnRyb2wgUmVnaXN0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9GRDsKKyAgICAgICAgbWlpX2N0cmxfcmVnICY9IH5NSUlfQ1JfRlVMTF9EVVBMRVg7CisgICAgICAgIERFQlVHT1VUKCJIYWxmIER1cGxleFxuIik7CisgICAgfQorCisgICAgLyogQXJlIHdlIGZvcmNpbmcgMTAwTWJwcz8/PyAqLworICAgIGlmIChody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMDBfZnVsbCB8fAorICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9oYWxmKSB7CisgICAgICAgIC8qIFNldCB0aGUgMTAwTWIgYml0IGFuZCB0dXJuIG9mZiB0aGUgMTAwME1iIGFuZCAxME1iIGJpdHMuICovCisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TUERfMTAwOworICAgICAgICBtaWlfY3RybF9yZWcgfD0gTUlJX0NSX1NQRUVEXzEwMDsKKyAgICAgICAgbWlpX2N0cmxfcmVnICY9IH4oTUlJX0NSX1NQRUVEXzEwMDAgfCBNSUlfQ1JfU1BFRURfMTApOworICAgICAgICBERUJVR09VVCgiRm9yY2luZyAxMDBtYiAiKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBTZXQgdGhlIDEwTWIgYml0IGFuZCB0dXJuIG9mZiB0aGUgMTAwME1iIGFuZCAxMDBNYiBiaXRzLiAqLworICAgICAgICBjdHJsICY9IH4oRTEwMDBfQ1RSTF9TUERfMTAwMCB8IEUxMDAwX0NUUkxfU1BEXzEwMCk7CisgICAgICAgIG1paV9jdHJsX3JlZyB8PSBNSUlfQ1JfU1BFRURfMTA7CisgICAgICAgIG1paV9jdHJsX3JlZyAmPSB+KE1JSV9DUl9TUEVFRF8xMDAwIHwgTUlJX0NSX1NQRUVEXzEwMCk7CisgICAgICAgIERFQlVHT1VUKCJGb3JjaW5nIDEwbWIgIik7CisgICAgfQorCisgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKKworICAgIC8qIFdyaXRlIHRoZSBjb25maWd1cmVkIHZhbHVlcyBiYWNrIHRvIHRoZSBEZXZpY2UgQ29udHJvbCBSZWcuICovCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKworICAgIGlmICgoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHx8CisgICAgICAgIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgLyogQ2xlYXIgQXV0by1Dcm9zc292ZXIgdG8gZm9yY2UgTURJIG1hbnVhbGx5LiBNODhFMTAwMCByZXF1aXJlcyBNREkKKyAgICAgICAgICogZm9yY2VkIHdoZW5ldmVyIHNwZWVkIGFyZSBkdXBsZXggYXJlIGZvcmNlZC4KKyAgICAgICAgICovCisgICAgICAgIHBoeV9kYXRhICY9IH5NODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIERFQlVHT1VUMSgiTTg4RTEwMDAgUFNDUjogJXggXG4iLCBwaHlfZGF0YSk7CisKKyAgICAgICAgLyogTmVlZCB0byByZXNldCB0aGUgUEhZIG9yIHRoZXNlIGNoYW5nZXMgd2lsbCBiZSBpZ25vcmVkICovCisgICAgICAgIG1paV9jdHJsX3JlZyB8PSBNSUlfQ1JfUkVTRVQ7CisKKyAgICAvKiBEaXNhYmxlIE1ESS1YIHN1cHBvcnQgZm9yIDEwLzEwMCAqLworICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZmUpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUZFX1BIWV9NRElYX0NPTlRST0wsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgJj0gfklGRV9QTUNfQVVUT19NRElYOworICAgICAgICBwaHlfZGF0YSAmPSB+SUZFX1BNQ19GT1JDRV9NRElYOworCisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJRkVfUEhZX01ESVhfQ09OVFJPTCwgcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ2xlYXIgQXV0by1Dcm9zc292ZXIgdG8gZm9yY2UgTURJIG1hbnVhbGx5LiAgSUdQIHJlcXVpcmVzIE1ESQorICAgICAgICAgKiBmb3JjZWQgd2hlbmV2ZXIgc3BlZWQgb3IgZHVwbGV4IGFyZSBmb3JjZWQuCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7CisgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIC8qIFdyaXRlIGJhY2sgdGhlIG1vZGlmaWVkIFBIWSBNSUkgY29udHJvbCByZWdpc3Rlci4gKi8KKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIG1paV9jdHJsX3JlZyk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgdWRlbGF5KDEpOworCisgICAgLyogVGhlIHdhaXRfYXV0b25lZ19jb21wbGV0ZSBmbGFnIG1heSBiZSBhIGxpdHRsZSBtaXNsZWFkaW5nIGhlcmUuCisgICAgICogU2luY2Ugd2UgYXJlIGZvcmNpbmcgc3BlZWQgYW5kIGR1cGxleCwgQXV0by1OZWcgaXMgbm90IGVuYWJsZWQuCisgICAgICogQnV0IHdlIGRvIHdhbnQgdG8gZGVsYXkgZm9yIGEgcGVyaW9kIHdoaWxlIGZvcmNpbmcgb25seSBzbyB3ZQorICAgICAqIGRvbid0IGdlbmVyYXRlIGZhbHNlIE5vIExpbmsgbWVzc2FnZXMuICBTbyB3ZSB3aWxsIHdhaXQgaGVyZQorICAgICAqIG9ubHkgaWYgdGhlIHVzZXIgaGFzIHNldCB3YWl0X2F1dG9uZWdfY29tcGxldGUgdG8gMSwgd2hpY2ggaXMKKyAgICAgKiB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBpZiAoaHctPndhaXRfYXV0b25lZ19jb21wbGV0ZSkgeworICAgICAgICAvKiBXZSB3aWxsIHdhaXQgZm9yIGF1dG9uZWcgdG8gY29tcGxldGUuICovCisgICAgICAgIERFQlVHT1VUKCJXYWl0aW5nIGZvciBmb3JjZWQgc3BlZWQvZHVwbGV4IGxpbmsuXG4iKTsKKyAgICAgICAgbWlpX3N0YXR1c19yZWcgPSAwOworCisgICAgICAgIC8qIFdlIHdpbGwgd2FpdCBmb3IgYXV0b25lZyB0byBjb21wbGV0ZSBvciA0LjUgc2Vjb25kcyB0byBleHBpcmUuICovCisgICAgICAgIGZvciAoaSA9IFBIWV9GT1JDRV9USU1FOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCB3YWl0IGZvciBBdXRvLU5lZyBDb21wbGV0ZSBiaXQKKyAgICAgICAgICAgICAqIHRvIGJlIHNldC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIGlmIChtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7CisgICAgICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGkgPT0gMCkgJiYKKyAgICAgICAgICAgKChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgfHwKKyAgICAgICAgICAgIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpKSkgeworICAgICAgICAgICAgLyogV2UgZGlkbid0IGdldCBsaW5rLiAgUmVzZXQgdGhlIERTUCBhbmQgd2FpdCBhZ2FpbiBmb3IgbGluay4gKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfcmVzZXRfZHNwKGh3KTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyBQSFkgRFNQXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBUaGlzIGxvb3Agd2lsbCBlYXJseS1vdXQgaWYgdGhlIGxpbmsgY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gICovCisgICAgICAgIGZvciAoaSA9IFBIWV9GT1JDRV9USU1FOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfTElOS19TVEFUVVMpIGJyZWFrOworICAgICAgICAgICAgbXNsZWVwKDEwMCk7CisgICAgICAgICAgICAvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCB3YWl0IGZvciBBdXRvLU5lZyBDb21wbGV0ZSBiaXQKKyAgICAgICAgICAgICAqIHRvIGJlIHNldC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKyAgICAgICAgLyogQmVjYXVzZSB3ZSByZXNldCB0aGUgUEhZIGFib3ZlLCB3ZSBuZWVkIHRvIHJlLWZvcmNlIFRYX0NMSyBpbiB0aGUKKyAgICAgICAgICogRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgdG8gMjVNSHogY2xvY2suICBUaGlzIHZhbHVlCisgICAgICAgICAqIGRlZmF1bHRzIGJhY2sgdG8gYSAyLjVNSHogY2xvY2sgd2hlbiB0aGUgUEhZIGlzIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzI1OworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiBJbiBhZGRpdGlvbiwgYmVjYXVzZSBvZiB0aGUgcy93IHJlc2V0IGFib3ZlLCB3ZSBuZWVkIHRvIGVuYWJsZSBDUlMgb24KKyAgICAgICAgICogVFguICBUaGlzIG11c3QgYmUgc2V0IGZvciBib3RoIGZ1bGwgYW5kIGhhbGYgZHVwbGV4IG9wZXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BU1NFUlRfQ1JTX09OX1RYOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ0IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgJiYKKyAgICAgICAgICAgICghaHctPmF1dG9uZWcpICYmIChody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMF9mdWxsIHx8CisgICAgICAgICAgICAgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfaGFsZikpIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKGh3KTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpIHsKKyAgICAgICAgLyogVGhlIFRYX0NMSyBvZiB0aGUgRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgZGVmYXVsdHMKKyAgICAgICAgICogdG8gMi41TUh6IG9uIGEgcmVzZXQuICBXZSBuZWVkIHRvIHJlLWZvcmNlIGl0IGJhY2sgdG8gMjVNSHosIGlmCisgICAgICAgICAqIHdlJ3JlIG5vdCBpbiBhIGZvcmNlZCAxMC9kdXBsZXggY29uZmlndXJhdGlvbi4gKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfTUFDX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBwaHlfZGF0YSAmPSB+R0c4MjU2M19NU0NSX1RYX0NMS19NQVNLOworICAgICAgICBpZiAoKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwpIHx8CisgICAgICAgICAgICAoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfaGFsZikpCisgICAgICAgICAgICBwaHlfZGF0YSB8PSBHRzgyNTYzX01TQ1JfVFhfQ0xLXzEwTUJQU18yXzVNSFo7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBoeV9kYXRhIHw9IEdHODI1NjNfTVNDUl9UWF9DTEtfMTAwTUJQU18yNU1IWjsKKworICAgICAgICAvKiBBbHNvIGR1ZSB0byB0aGUgcmVzZXQsIHdlIG5lZWQgdG8gZW5hYmxlIENSUyBvbiBUeC4gKi8KKyAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19NU0NSX0FTU0VSVF9DUlNfT05fVFg7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIEdHODI1NjNfUEhZX01BQ19TUEVDX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2V0cyB0aGUgY29sbGlzaW9uIGRpc3RhbmNlIGluIHRoZSBUcmFuc21pdCBDb250cm9sIHJlZ2lzdGVyCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqCisqIExpbmsgc2hvdWxkIGhhdmUgYmVlbiBlc3RhYmxpc2hlZCBwcmV2aW91c2x5LiBSZWFkcyB0aGUgc3BlZWQgYW5kIGR1cGxleAorKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBEZXZpY2UgU3RhdHVzIHJlZ2lzdGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgdGN0bCwgY29sbF9kaXN0OworCisgICAgREVCVUdGVU5DKCJlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QiKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgPCBlMTAwMF84MjU0MykKKyAgICAgICAgY29sbF9kaXN0ID0gRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFXzgyNTQyOworICAgIGVsc2UKKyAgICAgICAgY29sbF9kaXN0ID0gRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFOworCisgICAgdGN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQ1RMKTsKKworICAgIHRjdGwgJj0gfkUxMDAwX1RDVExfQ09MRDsKKyAgICB0Y3RsIHw9IGNvbGxfZGlzdCA8PCBFMTAwMF9DT0xEX1NISUZUOworCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUQ1RMLCB0Y3RsKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2V0cyBNQUMgc3BlZWQgYW5kIGR1cGxleCBzZXR0aW5ncyB0byByZWZsZWN0IHRoZSB0aG9zZSBpbiB0aGUgUEhZCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIG1paV9yZWcgLSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBNSUkgY29udHJvbCByZWdpc3RlcgorKgorKiBUaGUgY29udGVudHMgb2YgdGhlIFBIWSByZWdpc3RlciBjb250YWluaW5nIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24gbmVlZCB0bworKiBiZSBwYXNzZWQgaW4uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfY29uZmlnX21hY190b19waHkoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsOworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlnX21hY190b19waHkiKTsKKworICAgIC8qIDgyNTQ0IG9yIG5ld2VyIE1BQywgQXV0byBTcGVlZCBEZXRlY3Rpb24gdGFrZXMgY2FyZSBvZgorICAgICogTUFDIHNwZWVkL2R1cGxleCBjb25maWd1cmF0aW9uLiovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKKyAgICAvKiBSZWFkIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciBhbmQgc2V0IHRoZSBiaXRzIHRvIEZvcmNlIFNwZWVkCisgICAgICogYW5kIER1cGxleC4KKyAgICAgKi8KKyAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworICAgIGN0cmwgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFgpOworICAgIGN0cmwgJj0gfihFMTAwMF9DVFJMX1NQRF9TRUwgfCBFMTAwMF9DVFJMX0lMT1MpOworCisgICAgLyogU2V0IHVwIGR1cGxleCBpbiB0aGUgRGV2aWNlIENvbnRyb2wgYW5kIFRyYW5zbWl0IENvbnRyb2wKKyAgICAgKiByZWdpc3RlcnMgZGVwZW5kaW5nIG9uIG5lZ290aWF0ZWQgdmFsdWVzLgorICAgICAqLworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBpZiAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RQTFgpCisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKKyAgICBlbHNlCisgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfRkQ7CisKKyAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCisgICAgLyogU2V0IHVwIHNwZWVkIGluIHRoZSBEZXZpY2UgQ29udHJvbCByZWdpc3RlciBkZXBlbmRpbmcgb24KKyAgICAgKiBuZWdvdGlhdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBpZiAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDAwTUJTKQorICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDA7CisgICAgZWxzZSBpZiAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDBNQlMpCisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TUERfMTAwOworCisgICAgLyogV3JpdGUgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGJhY2sgdG8gdGhlIERldmljZSBDb250cm9sIFJlZy4gKi8KKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGb3JjZXMgdGhlIE1BQydzIGZsb3cgY29udHJvbCBzZXR0aW5ncy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFNldHMgdGhlIFRGQ0UgYW5kIFJGQ0UgYml0cyBpbiB0aGUgZGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIgdG8gcmVmbGVjdAorICogdGhlIGFkYXB0ZXIgc2V0dGluZ3MuIFRGQ0UgYW5kIFJGQ0UgbmVlZCB0byBiZSBleHBsaWNpdGx5IHNldCBieQorICogc29mdHdhcmUgd2hlbiBhIENvcHBlciBQSFkgaXMgdXNlZCBiZWNhdXNlIGF1dG9uZWdvdGlhdGlvbiBpcyBtYW5hZ2VkCisgKiBieSB0aGUgUEhZIHJhdGhlciB0aGFuIHRoZSBNQUMuIFNvZnR3YXJlIG11c3QgYWxzbyBjb25maWd1cmUgdGhlc2UKKyAqIGJpdHMgd2hlbiBsaW5rIGlzIGZvcmNlZCBvbiBhIGZpYmVyIGNvbm5lY3Rpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9mb3JjZV9tYWNfZmMoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9mb3JjZV9tYWNfZmMiKTsKKworICAgIC8qIEdldCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciAqLworICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisKKyAgICAvKiBCZWNhdXNlIHdlIGRpZG4ndCBnZXQgbGluayB2aWEgdGhlIGludGVybmFsIGF1dG8tbmVnb3RpYXRpb24KKyAgICAgKiBtZWNoYW5pc20gKHdlIGVpdGhlciBmb3JjZWQgbGluayBvciB3ZSBnb3QgbGluayB2aWEgUEhZCisgICAgICogYXV0by1uZWcpLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IGVuYWJsZS9kaXNhYmxlIHRyYW5zbWl0IGFuCisgICAgICogcmVjZWl2ZSBmbG93IGNvbnRyb2wuCisgICAgICoKKyAgICAgKiBUaGUgIkNhc2UiIHN0YXRlbWVudCBiZWxvdyBlbmFibGVzL2Rpc2FibGUgZmxvdyBjb250cm9sCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSAiaHctPmZjIiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmMiIHBhcmFtZXRlciBhcmU6CisgICAgICogICAgICAwOiAgRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKKyAgICAgKiAgICAgIDE6ICBSeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHJlY2VpdmUgcGF1c2UKKyAgICAgKiAgICAgICAgICBmcmFtZXMgYnV0IG5vdCBzZW5kIHBhdXNlIGZyYW1lcykuCisgICAgICogICAgICAyOiAgVHggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiBzZW5kIHBhdXNlIGZyYW1lcworICAgICAqICAgICAgICAgIGZyYW1lcyBidXQgd2UgZG8gbm90IHJlY2VpdmUgcGF1c2UgZnJhbWVzKS4KKyAgICAgKiAgICAgIDM6ICBCb3RoIFJ4IGFuZCBUWCBmbG93IGNvbnRyb2wgKHN5bW1ldHJpYykgaXMgZW5hYmxlZC4KKyAgICAgKiAgb3RoZXI6ICBObyBvdGhlciB2YWx1ZXMgc2hvdWxkIGJlIHBvc3NpYmxlIGF0IHRoaXMgcG9pbnQuCisgICAgICovCisKKyAgICBzd2l0Y2ggKGh3LT5mYykgeworICAgIGNhc2UgRTEwMDBfRkNfTk9ORToKKyAgICAgICAgY3RybCAmPSAofihFMTAwMF9DVFJMX1RGQ0UgfCBFMTAwMF9DVFJMX1JGQ0UpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9GQ19SWF9QQVVTRToKKyAgICAgICAgY3RybCAmPSAofkUxMDAwX0NUUkxfVEZDRSk7CisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9SRkNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0ZDX1RYX1BBVVNFOgorICAgICAgICBjdHJsICY9ICh+RTEwMDBfQ1RSTF9SRkNFKTsKKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1RGQ0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfRkNfRlVMTDoKKyAgICAgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9URkNFIHwgRTEwMDBfQ1RSTF9SRkNFKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgREVCVUdPVVQoIkZsb3cgY29udHJvbCBwYXJhbSBzZXQgaW5jb3JyZWN0bHlcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBUWCBGbG93IENvbnRyb2wgZm9yIDgyNTQyIChyZXYgMi4wKSAqLworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQorICAgICAgICBjdHJsICY9ICh+RTEwMDBfQ1RSTF9URkNFKTsKKworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbmZpZ3VyZXMgZmxvdyBjb250cm9sIHNldHRpbmdzIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSB2YWxpZCBsaW5rIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICogRm9yY2VzIE1BQyBmbG93IGNvbnRyb2wgc2V0dGluZ3MgaWYgbGluayB3YXMgZm9yY2VkLiBXaGVuIGluIE1JSS9HTUlJIG1vZGUKKyAqIGFuZCBhdXRvbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgdGhlIE1BQyBmbG93IGNvbnRyb2wgc2V0dGluZ3Mgd2lsbCBiZSBzZXQKKyAqIGJhc2VkIG9uIHRoZSBmbG93IGNvbnRyb2wgbmVnb3RpYXRlZCBieSB0aGUgUEhZLiBJbiBUQkkgbW9kZSwgdGhlIFRGQ0UKKyAqIGFuZCBSRkNFIGJpdHMgd2lsbCBiZSBhdXRvbWF0aWNhbHkgc2V0IHRvIHRoZSBuZWdvdGlhdGVkIGZsb3cgY29udHJvbCBtb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IG1paV9zdGF0dXNfcmVnOworICAgIHVpbnQxNl90IG1paV9ud2F5X2Fkdl9yZWc7CisgICAgdWludDE2X3QgbWlpX253YXlfbHBfYWJpbGl0eV9yZWc7CisgICAgdWludDE2X3Qgc3BlZWQ7CisgICAgdWludDE2X3QgZHVwbGV4OworCisgICAgREVCVUdGVU5DKCJlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cCIpOworCisgICAgLyogQ2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgZmliZXIgbWVkaWEgYW5kIGF1dG8tbmVnIGZhaWxlZAorICAgICAqIHNvIHdlIGhhZCB0byBmb3JjZSBsaW5rLiAgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGZvcmNlIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24gb2YgdGhlIE1BQyB0byBtYXRjaCB0aGUgImZjIiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgaWYgKCgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgJiYgKGh3LT5hdXRvbmVnX2ZhaWxlZCkpIHx8CisgICAgICAgICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpICYmCisgICAgICAgICAoaHctPmF1dG9uZWdfZmFpbGVkKSkgfHwKKyAgICAgICAgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgJiYgKCFody0+YXV0b25lZykpKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpOworICAgICAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgY29wcGVyIG1lZGlhIGFuZCBhdXRvLW5lZyBpcworICAgICAqIGVuYWJsZWQuICBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gY2hlY2sgYW5kIHNlZSBpZiBBdXRvLU5lZworICAgICAqIGhhcyBjb21wbGV0ZWQsIGFuZCBpZiBzbywgaG93IHRoZSBQSFkgYW5kIGxpbmsgcGFydG5lciBoYXMKKyAgICAgKiBmbG93IGNvbnRyb2wgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSAmJiBody0+YXV0b25lZykgeworICAgICAgICAvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCBjaGVjayB0byBzZWUgaWYgQXV0b05lZworICAgICAgICAgKiBoYXMgY29tcGxldGVkLiAgV2UgcmVhZCB0aGlzIHR3aWNlIGJlY2F1c2UgdGhpcyByZWcgaGFzCisgICAgICAgICAqIHNvbWUgInN0aWNreSIgKGxhdGNoZWQpIGJpdHMuCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmIChtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9BVVRPTkVHX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAvKiBUaGUgQXV0b05lZyBwcm9jZXNzIGhhcyBjb21wbGV0ZWQsIHNvIHdlIG5vdyBuZWVkIHRvCisgICAgICAgICAgICAgKiByZWFkIGJvdGggdGhlIEF1dG8gTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCBSZWdpc3RlcgorICAgICAgICAgICAgICogKEFkZHJlc3MgNCkgYW5kIHRoZSBBdXRvX05lZ290aWF0aW9uIEJhc2UgUGFnZSBBYmlsaXR5CisgICAgICAgICAgICAgKiBSZWdpc3RlciAoQWRkcmVzcyA1KSB0byBkZXRlcm1pbmUgaG93IGZsb3cgY29udHJvbCB3YXMKKyAgICAgICAgICAgICAqIG5lZ290aWF0ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9BVVRPTkVHX0FEViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1paV9ud2F5X2Fkdl9yZWcpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfTFBfQUJJTElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1paV9ud2F5X2xwX2FiaWxpdHlfcmVnKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAvKiBUd28gYml0cyBpbiB0aGUgQXV0byBOZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCisgICAgICAgICAgICAgKiAoQWRkcmVzcyA0KSBhbmQgdHdvIGJpdHMgaW4gdGhlIEF1dG8gTmVnb3RpYXRpb24gQmFzZQorICAgICAgICAgICAgICogUGFnZSBBYmlsaXR5IFJlZ2lzdGVyIChBZGRyZXNzIDUpIGRldGVybWluZSBmbG93IGNvbnRyb2wKKyAgICAgICAgICAgICAqIGZvciBib3RoIHRoZSBQSFkgYW5kIHRoZSBsaW5rIHBhcnRuZXIuICBUaGUgZm9sbG93aW5nCisgICAgICAgICAgICAgKiB0YWJsZSwgdGFrZW4gb3V0IG9mIHRoZSBJRUVFIDgwMi4zYWIvRDYuMCBkYXRlZCBNYXJjaCAyNSwKKyAgICAgICAgICAgICAqIDE5OTksIGRlc2NyaWJlcyB0aGVzZSBQQVVTRSByZXNvbHV0aW9uIGJpdHMgYW5kIGhvdyBmbG93CisgICAgICAgICAgICAgKiBjb250cm9sIGlzIGRldGVybWluZWQgYmFzZWQgdXBvbiB0aGVzZSBzZXR0aW5ncy4KKyAgICAgICAgICAgICAqIE5PVEU6ICBEQyA9IERvbid0IENhcmUKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgorICAgICAgICAgICAgICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgTklDIFJlc29sdXRpb24KKyAgICAgICAgICAgICAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAqICAgMCAgIHwgICAgMCAgICB8ICBEQyAgIHwgICBEQyAgICB8IEUxMDAwX0ZDX05PTkUKKyAgICAgICAgICAgICAqICAgMCAgIHwgICAgMSAgICB8ICAgMCAgIHwgICBEQyAgICB8IEUxMDAwX0ZDX05PTkUKKyAgICAgICAgICAgICAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMCAgICB8IEUxMDAwX0ZDX05PTkUKKyAgICAgICAgICAgICAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMSAgICB8IEUxMDAwX0ZDX1RYX1BBVVNFCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgIDAgICAgfCAgIDAgICB8ICAgREMgICAgfCBFMTAwMF9GQ19OT05FCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgREMgICAgfCAgIDEgICB8ICAgREMgICAgfCBFMTAwMF9GQ19GVUxMCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgIDEgICAgfCAgIDAgICB8ICAgIDAgICAgfCBFMTAwMF9GQ19OT05FCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgIDEgICAgfCAgIDAgICB8ICAgIDEgICAgfCBFMTAwMF9GQ19SWF9QQVVTRQorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogQXJlIGJvdGggUEFVU0UgYml0cyBzZXQgdG8gMT8gIElmIHNvLCB0aGlzIGltcGxpZXMKKyAgICAgICAgICAgICAqIFN5bW1ldHJpYyBGbG93IENvbnRyb2wgaXMgZW5hYmxlZCBhdCBib3RoIGVuZHMuICBUaGUKKyAgICAgICAgICAgICAqIEFTTV9ESVIgYml0cyBhcmUgaXJyZWxldmFudCBwZXIgdGhlIHNwZWMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogRm9yIFN5bW1ldHJpYyBGbG93IENvbnRyb2w6CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogICBMT0NBTCBERVZJQ0UgIHwgICBMSU5LIFBBUlRORVIKKyAgICAgICAgICAgICAqIFBBVVNFIHwgQVNNX0RJUiB8IFBBVVNFIHwgQVNNX0RJUiB8IFJlc3VsdAorICAgICAgICAgICAgICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICogICAxICAgfCAgIERDICAgIHwgICAxICAgfCAgIERDICAgIHwgRTEwMDBfRkNfRlVMTAorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9QQVVTRSkgJiYKKyAgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfUEFVU0UpKSB7CisgICAgICAgICAgICAgICAgLyogTm93IHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHVzZXIgc2VsZWN0ZWQgUlggT05MWQorICAgICAgICAgICAgICAgICAqIG9mIHBhdXNlIGZyYW1lcy4gIEluIHRoaXMgY2FzZSwgd2UgaGFkIHRvIGFkdmVydGlzZQorICAgICAgICAgICAgICAgICAqIEZVTEwgZmxvdyBjb250cm9sIGJlY2F1c2Ugd2UgY291bGQgbm90IGFkdmVydGlzZSBSWAorICAgICAgICAgICAgICAgICAqIE9OTFkuIEhlbmNlLCB3ZSBtdXN0IG5vdyBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0bworICAgICAgICAgICAgICAgICAqIHR1cm4gT0ZGICB0aGUgVFJBTlNNSVNTSU9OIG9mIFBBVVNFIGZyYW1lcy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoaHctPm9yaWdpbmFsX2ZjID09IEUxMDAwX0ZDX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaHctPmZjID0gRTEwMDBfRkNfRlVMTDsKKyAgICAgICAgICAgICAgICAgICAgREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IEZVTEwuXG4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBody0+ZmMgPSBFMTAwMF9GQ19SWF9QQVVTRTsKKyAgICAgICAgICAgICAgICAgICAgREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IFJYIFBBVVNFIGZyYW1lcyBvbmx5LlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRm9yIHJlY2VpdmluZyBQQVVTRSBmcmFtZXMgT05MWS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgorICAgICAgICAgICAgICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgUmVzdWx0CisgICAgICAgICAgICAgKi0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgKiAgIDAgICB8ICAgIDEgICAgfCAgIDEgICB8ICAgIDEgICAgfCBFMTAwMF9GQ19UWF9QQVVTRQorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZWxzZSBpZiAoIShtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9QQVVTRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9BU01fRElSKSAmJgorICAgICAgICAgICAgICAgICAgICAgKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSAmJgorICAgICAgICAgICAgICAgICAgICAgKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX0FTTV9ESVIpKSB7CisgICAgICAgICAgICAgICAgaHctPmZjID0gRTEwMDBfRkNfVFhfUEFVU0U7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IFRYIFBBVVNFIGZyYW1lcyBvbmx5LlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBGb3IgdHJhbnNtaXR0aW5nIFBBVVNFIGZyYW1lcyBPTkxZLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCisgICAgICAgICAgICAgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBSZXN1bHQKKyAgICAgICAgICAgICAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMSAgICB8IEUxMDAwX0ZDX1JYX1BBVVNFCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBlbHNlIGlmICgobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfUEFVU0UpICYmCisgICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfQVNNX0RJUikgJiYKKyAgICAgICAgICAgICAgICAgICAgICEobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfUEFVU0UpICYmCisgICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfQVNNX0RJUikpIHsKKyAgICAgICAgICAgICAgICBody0+ZmMgPSBFMTAwMF9GQ19SWF9QQVVTRTsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gUlggUEFVU0UgZnJhbWVzIG9ubHkuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFBlciB0aGUgSUVFRSBzcGVjLCBhdCB0aGlzIHBvaW50IGZsb3cgY29udHJvbCBzaG91bGQgYmUKKyAgICAgICAgICAgICAqIGRpc2FibGVkLiAgSG93ZXZlciwgd2Ugd2FudCB0byBjb25zaWRlciB0aGF0IHdlIGNvdWxkCisgICAgICAgICAgICAgKiBiZSBjb25uZWN0ZWQgdG8gYSBsZWdhY3kgc3dpdGNoIHRoYXQgZG9lc24ndCBhZHZlcnRpc2UKKyAgICAgICAgICAgICAqIGRlc2lyZWQgZmxvdyBjb250cm9sLCBidXQgY2FuIGJlIGZvcmNlZCBvbiB0aGUgbGluaworICAgICAgICAgICAgICogcGFydG5lci4gIFNvIGlmIHdlIGFkdmVydGlzZWQgbm8gZmxvdyBjb250cm9sLCB0aGF0IGlzCisgICAgICAgICAgICAgKiB3aGF0IHdlIHdpbGwgcmVzb2x2ZSB0by4gIElmIHdlIGFkdmVydGlzZWQgc29tZSBraW5kIG9mCisgICAgICAgICAgICAgKiByZWNlaXZlIGNhcGFiaWxpdHkgKFJ4IFBhdXNlIE9ubHkgb3IgRnVsbCBGbG93IENvbnRyb2wpCisgICAgICAgICAgICAgKiBhbmQgdGhlIGxpbmsgcGFydG5lciBhZHZlcnRpc2VkIG5vbmUsIHdlIHdpbGwgY29uZmlndXJlCisgICAgICAgICAgICAgKiBvdXJzZWx2ZXMgdG8gZW5hYmxlIFJ4IEZsb3cgQ29udHJvbCBvbmx5LiAgV2UgY2FuIGRvCisgICAgICAgICAgICAgKiB0aGlzIHNhZmVseSBmb3IgdHdvIHJlYXNvbnM6ICBJZiB0aGUgbGluayBwYXJ0bmVyIHJlYWxseQorICAgICAgICAgICAgICogZGlkbid0IHdhbnQgZmxvdyBjb250cm9sIGVuYWJsZWQsIGFuZCB3ZSBlbmFibGUgUngsIG5vCisgICAgICAgICAgICAgKiBoYXJtIGRvbmUgc2luY2Ugd2Ugd29uJ3QgYmUgcmVjZWl2aW5nIGFueSBQQVVTRSBmcmFtZXMKKyAgICAgICAgICAgICAqIGFueXdheS4gIElmIHRoZSBpbnRlbnQgb24gdGhlIGxpbmsgcGFydG5lciB3YXMgdG8gaGF2ZQorICAgICAgICAgICAgICogZmxvdyBjb250cm9sIGVuYWJsZWQsIHRoZW4gYnkgdXMgZW5hYmxpbmcgUlggb25seSwgd2UKKyAgICAgICAgICAgICAqIGNhbiBhdCBsZWFzdCByZWNlaXZlIHBhdXNlIGZyYW1lcyBhbmQgcHJvY2VzcyB0aGVtLgorICAgICAgICAgICAgICogVGhpcyBpcyBhIGdvb2QgaWRlYSBiZWNhdXNlIGluIG1vc3QgY2FzZXMsIHNpbmNlIHdlIGFyZQorICAgICAgICAgICAgICogcHJlZG9taW5hbnRseSBhIHNlcnZlciBOSUMsIG1vcmUgdGltZXMgdGhhbiBub3Qgd2Ugd2lsbAorICAgICAgICAgICAgICogYmUgYXNrZWQgdG8gZGVsYXkgdHJhbnNtaXNzaW9uIG9mIHBhY2tldHMgdGhhbiBhc2tpbmcKKyAgICAgICAgICAgICAqIG91ciBsaW5rIHBhcnRuZXIgdG8gcGF1c2UgdHJhbnNtaXNzaW9uIG9mIGZyYW1lcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZWxzZSBpZiAoKGh3LT5vcmlnaW5hbF9mYyA9PSBFMTAwMF9GQ19OT05FIHx8CisgICAgICAgICAgICAgICAgICAgICAgaHctPm9yaWdpbmFsX2ZjID09IEUxMDAwX0ZDX1RYX1BBVVNFKSB8fAorICAgICAgICAgICAgICAgICAgICAgIGh3LT5mY19zdHJpY3RfaWVlZSkgeworICAgICAgICAgICAgICAgIGh3LT5mYyA9IEUxMDAwX0ZDX05PTkU7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IE5PTkUuXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaHctPmZjID0gRTEwMDBfRkNfUlhfUEFVU0U7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IFJYIFBBVVNFIGZyYW1lcyBvbmx5LlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE5vdyB3ZSBuZWVkIHRvIGRvIG9uZSBsYXN0IGNoZWNrLi4uICBJZiB3ZSBhdXRvLQorICAgICAgICAgICAgICogbmVnb3RpYXRlZCB0byBIQUxGIERVUExFWCwgZmxvdyBjb250cm9sIHNob3VsZCBub3QgYmUKKyAgICAgICAgICAgICAqIGVuYWJsZWQgcGVyIElFRUUgODAyLjMgc3BlYy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOworICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgZ2V0dGluZyBsaW5rIHNwZWVkIGFuZCBkdXBsZXhcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZHVwbGV4ID09IEhBTEZfRFVQTEVYKQorICAgICAgICAgICAgICAgIGh3LT5mYyA9IEUxMDAwX0ZDX05PTkU7CisKKyAgICAgICAgICAgIC8qIE5vdyB3ZSBjYWxsIGEgc3Vicm91dGluZSB0byBhY3R1YWxseSBmb3JjZSB0aGUgTUFDCisgICAgICAgICAgICAgKiBjb250cm9sbGVyIHRvIHVzZSB0aGUgY29ycmVjdCBmbG93IGNvbnRyb2wgc2V0dGluZ3MuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpOworICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgZm9yY2luZyBmbG93IGNvbnRyb2wgc2V0dGluZ3NcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgREVCVUdPVVQoIkNvcHBlciBQSFkgYW5kIEF1dG8gTmVnIGhhcyBub3QgY29tcGxldGVkLlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGxpbmsgc3RhdHVzIG9mIHRoZSBoYXJkd2FyZSBoYXMgY2hhbmdlZC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIENhbGxlZCBieSBhbnkgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBjaGVjayB0aGUgbGluayBzdGF0dXMgb2YgdGhlIGFkYXB0ZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9jaGVja19mb3JfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IHJ4Y3cgPSAwOworICAgIHVpbnQzMl90IGN0cmw7CisgICAgdWludDMyX3Qgc3RhdHVzOworICAgIHVpbnQzMl90IHJjdGw7CisgICAgdWludDMyX3QgaWNyOworICAgIHVpbnQzMl90IHNpZ25hbCA9IDA7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9jaGVja19mb3JfbGluayIpOworCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICBzdGF0dXMgPSBFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKTsKKworICAgIC8qIE9uIGFkYXB0ZXJzIHdpdGggYSBNQUMgbmV3ZXIgdGhhbiA4MjU0NCwgU1cgRGVmaW5lYWJsZSBwaW4gMSB3aWxsIGJlCisgICAgICogc2V0IHdoZW4gdGhlIG9wdGljcyBkZXRlY3QgYSBzaWduYWwuIE9uIG9sZGVyIGFkYXB0ZXJzLCBpdCB3aWxsIGJlCisgICAgICogY2xlYXJlZCB3aGVuIHRoZXJlIGlzIGEgc2lnbmFsLiAgVGhpcyBhcHBsaWVzIHRvIGZpYmVyIG1lZGlhIG9ubHkuCisgICAgICovCisgICAgaWYgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB8fAorICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSB7CisgICAgICAgIHJ4Y3cgPSBFMTAwMF9SRUFEX1JFRyhodywgUlhDVyk7CisKKyAgICAgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKyAgICAgICAgICAgIHNpZ25hbCA9IChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0NCkgPyBFMTAwMF9DVFJMX1NXRFBJTjEgOiAwOworICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkKKyAgICAgICAgICAgICAgICBody0+Z2V0X2xpbmtfc3RhdHVzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB3ZSBoYXZlIGEgY29wcGVyIFBIWSB0aGVuIHdlIG9ubHkgd2FudCB0byBnbyBvdXQgdG8gdGhlIFBIWQorICAgICAqIHJlZ2lzdGVycyB0byBzZWUgaWYgQXV0by1OZWcgaGFzIGNvbXBsZXRlZCBhbmQvb3IgaWYgb3VyIGxpbmsKKyAgICAgKiBzdGF0dXMgaGFzIGNoYW5nZWQuICBUaGUgZ2V0X2xpbmtfc3RhdHVzIGZsYWcgd2lsbCBiZSBzZXQgaWYgd2UKKyAgICAgKiByZWNlaXZlIGEgTGluayBTdGF0dXMgQ2hhbmdlIGludGVycnVwdCBvciB3ZSBoYXZlIFJ4IFNlcXVlbmNlCisgICAgICogRXJyb3JzLgorICAgICAqLworICAgIGlmICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpICYmIGh3LT5nZXRfbGlua19zdGF0dXMpIHsKKyAgICAgICAgLyogRmlyc3Qgd2Ugd2FudCB0byBzZWUgaWYgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgcmVwb3J0cworICAgICAgICAgKiBsaW5rLiAgSWYgc28sIHRoZW4gd2Ugd2FudCB0byBnZXQgdGhlIGN1cnJlbnQgc3BlZWQvZHVwbGV4CisgICAgICAgICAqIG9mIHRoZSBQSFkuCisgICAgICAgICAqIFJlYWQgdGhlIHJlZ2lzdGVyIHR3aWNlIHNpbmNlIHRoZSBsaW5rIGJpdCBpcyBzdGlja3kuCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmIChwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgeworICAgICAgICAgICAgaHctPmdldF9saW5rX3N0YXR1cyA9IEZBTFNFOworICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlcmUgd2FzIERvd25TaGlmdCwgbXVzdCBiZSBjaGVja2VkIGltbWVkaWF0ZWx5IGFmdGVyCisgICAgICAgICAgICAgKiBsaW5rLXVwICovCisgICAgICAgICAgICBlMTAwMF9jaGVja19kb3duc2hpZnQoaHcpOworCisgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgb24gODI1NDQgb3IgODI1NDMgc2lsaWNvbiBhbmQgc3BlZWQvZHVwbGV4CisgICAgICAgICAgICAgKiBhcmUgZm9yY2VkIHRvIDEwSCBvciAxMEYsIHRoZW4gd2Ugd2lsbCBpbXBsZW1lbnQgdGhlIHBvbGFyaXR5CisgICAgICAgICAgICAgKiByZXZlcnNhbCB3b3JrYXJvdW5kLiAgV2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGZpcnN0LCBhbmQgdXBvbgorICAgICAgICAgICAgICogcmV0dXJuaW5nLCBwbGFjZSB0aGUgZGV2aWNlcyBpbnRlcnJ1cHQgc3RhdGUgdG8gaXRzIHByZXZpb3VzCisgICAgICAgICAgICAgKiB2YWx1ZSBleGNlcHQgZm9yIHRoZSBsaW5rIHN0YXR1cyBjaGFuZ2UgaW50ZXJydXB0IHdoaWNoIHdpbGwKKyAgICAgICAgICAgICAqIGhhcHBlbiBkdWUgdG8gdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIHdvcmthcm91bmQuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDQgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQzKSAmJgorICAgICAgICAgICAgICAgICghaHctPmF1dG9uZWcpICYmCisgICAgICAgICAgICAgICAgKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwgfHwKKyAgICAgICAgICAgICAgICAgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfaGFsZikpIHsKKyAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIElNQywgMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3dvcmthcm91bmQoaHcpOworICAgICAgICAgICAgICAgIGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1IpOworICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgSUNTLCAoaWNyICYgfkUxMDAwX0lDU19MU0MpKTsKKyAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIElNUywgSU1TX0VOQUJMRV9NQVNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm8gbGluayBkZXRlY3RlZCAqLworICAgICAgICAgICAgZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZShodywgRkFMU0UpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB3ZSBhcmUgZm9yY2luZyBzcGVlZC9kdXBsZXgsIHRoZW4gd2Ugc2ltcGx5IHJldHVybiBzaW5jZQorICAgICAgICAgKiB3ZSBoYXZlIGFscmVhZHkgZGV0ZXJtaW5lZCB3aGV0aGVyIHdlIGhhdmUgbGluayBvciBub3QuCisgICAgICAgICAqLworICAgICAgICBpZiAoIWh3LT5hdXRvbmVnKSByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisKKyAgICAgICAgLyogb3B0aW1pemUgdGhlIGRzcCBzZXR0aW5ncyBmb3IgdGhlIGlncCBwaHkgKi8KKyAgICAgICAgZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZShodywgVFJVRSk7CisKKyAgICAgICAgLyogV2UgaGF2ZSBhIE04OEUxMDAwIFBIWSBhbmQgQXV0by1OZWcgaXMgZW5hYmxlZC4gIElmIHdlCisgICAgICAgICAqIGhhdmUgU2kgb24gYm9hcmQgdGhhdCBpcyA4MjU0NCBvciBuZXdlciwgQXV0bworICAgICAgICAgKiBTcGVlZCBEZXRlY3Rpb24gdGFrZXMgY2FyZSBvZiBNQUMgc3BlZWQvZHVwbGV4CisgICAgICAgICAqIGNvbmZpZ3VyYXRpb24uICBTbyB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlIENvbGxpc2lvbgorICAgICAgICAgKiBEaXN0YW5jZSBpbiB0aGUgTUFDLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGZvcmNlCisgICAgICAgICAqIHNwZWVkL2R1cGxleCBvbiB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKKyAgICAgICAgICogc2V0dGluZ3MuCisgICAgICAgICAqLworICAgICAgICBpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ0KQorICAgICAgICAgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpOworICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgY29uZmlndXJpbmcgTUFDIHRvIFBIWSBzZXR0aW5nc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb25maWd1cmUgRmxvdyBDb250cm9sIG5vdyB0aGF0IEF1dG8tTmVnIGhhcyBjb21wbGV0ZWQuIEZpcnN0LCB3ZQorICAgICAgICAgKiBuZWVkIHRvIHJlc3RvcmUgdGhlIGRlc2lyZWQgZmxvdyBjb250cm9sIHNldHRpbmdzIGJlY2F1c2Ugd2UgbWF5CisgICAgICAgICAqIGhhdmUgaGFkIHRvIHJlLWF1dG9uZWcgd2l0aCBhIGRpZmZlcmVudCBsaW5rIHBhcnRuZXIuCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoaHcpOworICAgICAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIGZsb3cgY29udHJvbFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHdlIGFyZSBvbiBjb3BwZXIgYW5kIHdlIGhhdmUKKyAgICAgICAgICogYXV0by1uZWdvdGlhdGVkIGxpbmsuICBUaGVzZSBhcmUgY29uZGl0aW9ucyBmb3IgY2hlY2tpbmcgdGhlIGxpbmsKKyAgICAgICAgICogcGFydG5lciBjYXBhYmlsaXR5IHJlZ2lzdGVyLiAgV2UgdXNlIHRoZSBsaW5rIHNwZWVkIHRvIGRldGVybWluZSBpZgorICAgICAgICAgKiBUQkkgY29tcGF0aWJpbGl0eSBuZWVkcyB0byBiZSB0dXJuZWQgb24gb3Igb2ZmLiAgSWYgdGhlIGxpbmsgaXMgbm90CisgICAgICAgICAqIGF0IGdpZ2FiaXQgc3BlZWQsIHRoZW4gVEJJIGNvbXBhdGliaWxpdHkgaXMgbm90IG5lZWRlZC4gIElmIHdlIGFyZQorICAgICAgICAgKiBhdCBnaWdhYml0IHNwZWVkLCB3ZSB0dXJuIG9uIFRCSSBjb21wYXRpYmlsaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGh3LT50YmlfY29tcGF0aWJpbGl0eV9lbikgeworICAgICAgICAgICAgdWludDE2X3Qgc3BlZWQsIGR1cGxleDsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGdldHRpbmcgbGluayBzcGVlZCBhbmQgZHVwbGV4XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcGVlZCAhPSBTUEVFRF8xMDAwKSB7CisgICAgICAgICAgICAgICAgLyogSWYgbGluayBzcGVlZCBpcyBub3Qgc2V0IHRvIGdpZ2FiaXQgc3BlZWQsIHdlIGRvIG5vdCBuZWVkCisgICAgICAgICAgICAgICAgICogdG8gZW5hYmxlIFRCSSBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChody0+dGJpX2NvbXBhdGliaWxpdHlfb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgcHJldmlvdXNseSB3ZXJlIGluIHRoZSBtb2RlLCB0dXJuIGl0IG9mZi4gKi8KKyAgICAgICAgICAgICAgICAgICAgcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKKyAgICAgICAgICAgICAgICAgICAgcmN0bCAmPSB+RTEwMDBfUkNUTF9TQlA7CisgICAgICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgcmN0bCk7CisgICAgICAgICAgICAgICAgICAgIGh3LT50YmlfY29tcGF0aWJpbGl0eV9vbiA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSWYgVEJJIGNvbXBhdGliaWxpdHkgaXMgd2FzIHByZXZpb3VzbHkgb2ZmLCB0dXJuIGl0IG9uLiBGb3IKKyAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IHdpdGggYSBUQkkgbGluayBwYXJ0bmVyLCB3ZSB3aWxsIHN0b3JlIGJhZAorICAgICAgICAgICAgICAgICAqIHBhY2tldHMuIFNvbWUgZnJhbWVzIGhhdmUgYW4gYWRkaXRpb25hbCBieXRlIG9uIHRoZSBlbmQgYW5kCisgICAgICAgICAgICAgICAgICogd2lsbCBsb29rIGxpa2UgQ1JDIGVycm9ycyB0byB0byB0aGUgaGFyZHdhcmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCFody0+dGJpX2NvbXBhdGliaWxpdHlfb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaHctPnRiaV9jb21wYXRpYmlsaXR5X29uID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKKyAgICAgICAgICAgICAgICAgICAgcmN0bCB8PSBFMTAwMF9SQ1RMX1NCUDsKKyAgICAgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBsaW5rIChhdXRvLW5lZ290aWF0aW9uIGZhaWxlZCBvciBsaW5rIHBhcnRuZXIgY2Fubm90CisgICAgICogYXV0by1uZWdvdGlhdGUpLCB0aGUgY2FibGUgaXMgcGx1Z2dlZCBpbiAod2UgaGF2ZSBzaWduYWwpLCBhbmQgb3VyCisgICAgICogbGluayBwYXJ0bmVyIGlzIG5vdCB0cnlpbmcgdG8gYXV0by1uZWdvdGlhdGUgd2l0aCB1cyAod2UgYXJlIHJlY2VpdmluZworICAgICAqIGlkbGVzIG9yIGRhdGEpLCB3ZSBuZWVkIHRvIGZvcmNlIGxpbmsgdXAuIFdlIGFsc28gbmVlZCB0byBnaXZlCisgICAgICogYXV0by1uZWdvdGlhdGlvbiB0aW1lIHRvIGNvbXBsZXRlLCBpbiBjYXNlIHRoZSBjYWJsZSB3YXMganVzdCBwbHVnZ2VkCisgICAgICogaW4uIFRoZSBhdXRvbmVnX2ZhaWxlZCBmbGFnIGRvZXMgdGhpcy4KKyAgICAgKi8KKyAgICBlbHNlIGlmICgoKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSAmJgorICAgICAgICAgICAgICAoKGN0cmwgJiBFMTAwMF9DVFJMX1NXRFBJTjEpID09IHNpZ25hbCkpIHx8CisgICAgICAgICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykpICYmCisgICAgICAgICAgICAgICghKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkpICYmCisgICAgICAgICAgICAgICghKHJ4Y3cgJiBFMTAwMF9SWENXX0MpKSkgeworICAgICAgICBpZiAoaHctPmF1dG9uZWdfZmFpbGVkID09IDApIHsKKyAgICAgICAgICAgIGh3LT5hdXRvbmVnX2ZhaWxlZCA9IDE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBERUJVR09VVCgiTk9UIFJYaW5nIC9DLywgZGlzYWJsZSBBdXRvTmVnIGFuZCBmb3JjZSBsaW5rLlxuIik7CisKKyAgICAgICAgLyogRGlzYWJsZSBhdXRvLW5lZ290aWF0aW9uIGluIHRoZSBUWENXIHJlZ2lzdGVyICovCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhDVywgKGh3LT50eGN3ICYgfkUxMDAwX1RYQ1dfQU5FKSk7CisKKyAgICAgICAgLyogRm9yY2UgbGluay11cCBhbmQgYWxzbyBmb3JjZSBmdWxsLWR1cGxleC4gKi8KKyAgICAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICAgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9TTFUgfCBFMTAwMF9DVFJMX0ZEKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKworICAgICAgICAvKiBDb25maWd1cmUgRmxvdyBDb250cm9sIGFmdGVyIGZvcmNpbmcgbGluayB1cC4gKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KTsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBmbG93IGNvbnRyb2xcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogSWYgd2UgYXJlIGZvcmNpbmcgbGluayBhbmQgd2UgYXJlIHJlY2VpdmluZyAvQy8gb3JkZXJlZCBzZXRzLCByZS1lbmFibGUKKyAgICAgKiBhdXRvLW5lZ290aWF0aW9uIGluIHRoZSBUWENXIHJlZ2lzdGVyIGFuZCBkaXNhYmxlIGZvcmNlZCBsaW5rIGluIHRoZQorICAgICAqIERldmljZSBDb250cm9sIHJlZ2lzdGVyIGluIGFuIGF0dGVtcHQgdG8gYXV0by1uZWdvdGlhdGUgd2l0aCBvdXIgbGluaworICAgICAqIHBhcnRuZXIuCisgICAgICovCisgICAgZWxzZSBpZiAoKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB8fAorICAgICAgICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSAmJgorICAgICAgICAgICAgICAoY3RybCAmIEUxMDAwX0NUUkxfU0xVKSAmJiAocnhjdyAmIEUxMDAwX1JYQ1dfQykpIHsKKyAgICAgICAgREVCVUdPVVQoIlJYaW5nIC9DLywgZW5hYmxlIEF1dG9OZWcgYW5kIHN0b3AgZm9yY2luZyBsaW5rLlxuIik7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhDVywgaHctPnR4Y3cpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIChjdHJsICYgfkUxMDAwX0NUUkxfU0xVKSk7CisKKyAgICAgICAgaHctPnNlcmRlc19saW5rX2Rvd24gPSBGQUxTRTsKKyAgICB9CisgICAgLyogSWYgd2UgZm9yY2UgbGluayBmb3Igbm9uLWF1dG8tbmVnb3RpYXRpb24gc3dpdGNoLCBjaGVjayBsaW5rIHN0YXR1cworICAgICAqIGJhc2VkIG9uIE1BQyBzeW5jaHJvbml6YXRpb24gZm9yIGludGVybmFsIHNlcmRlcyBtZWRpYSB0eXBlLgorICAgICAqLworICAgIGVsc2UgaWYgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKKyAgICAgICAgICAgICAhKEUxMDAwX1RYQ1dfQU5FICYgRTEwMDBfUkVBRF9SRUcoaHcsIFRYQ1cpKSkgeworICAgICAgICAvKiBTWU5DSCBiaXQgYW5kIElWIGJpdCBhcmUgc3RpY2t5LiAqLworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICBpZiAoRTEwMDBfUlhDV19TWU5DSCAmIEUxMDAwX1JFQURfUkVHKGh3LCBSWENXKSkgeworICAgICAgICAgICAgaWYgKCEocnhjdyAmIEUxMDAwX1JYQ1dfSVYpKSB7CisgICAgICAgICAgICAgICAgaHctPnNlcmRlc19saW5rX2Rvd24gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiU0VSREVTOiBMaW5rIGlzIHVwLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBody0+c2VyZGVzX2xpbmtfZG93biA9IFRSVUU7CisgICAgICAgICAgICBERUJVR09VVCgiU0VSREVTOiBMaW5rIGlzIGRvd24uXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgorICAgICAgICAoRTEwMDBfVFhDV19BTkUgJiBFMTAwMF9SRUFEX1JFRyhodywgVFhDVykpKSB7CisgICAgICAgIGh3LT5zZXJkZXNfbGlua19kb3duID0gIShFMTAwMF9TVEFUVVNfTFUgJiBFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSk7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXRlY3RzIHRoZSBjdXJyZW50IHNwZWVkIGFuZCBkdXBsZXggc2V0dGluZ3Mgb2YgdGhlIGhhcmR3YXJlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBzcGVlZCAtIFNwZWVkIG9mIHRoZSBjb25uZWN0aW9uCisgKiBkdXBsZXggLSBEdXBsZXggc2V0dGluZyBvZiB0aGUgY29ubmVjdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpzcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkdXBsZXgpCit7CisgICAgdWludDMyX3Qgc3RhdHVzOworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgiKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisgICAgICAgIGlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCkgeworICAgICAgICAgICAgKnNwZWVkID0gU1BFRURfMTAwMDsKKyAgICAgICAgICAgIERFQlVHT1VUKCIxMDAwIE1icywgIik7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMCkgeworICAgICAgICAgICAgKnNwZWVkID0gU1BFRURfMTAwOworICAgICAgICAgICAgREVCVUdPVVQoIjEwMCBNYnMsICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnNwZWVkID0gU1BFRURfMTA7CisgICAgICAgICAgICBERUJVR09VVCgiMTAgTWJzLCAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfRkQpIHsKKyAgICAgICAgICAgICpkdXBsZXggPSBGVUxMX0RVUExFWDsKKyAgICAgICAgICAgIERFQlVHT1VUKCJGdWxsIER1cGxleFxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHVwbGV4ID0gSEFMRl9EVVBMRVg7CisgICAgICAgICAgICBERUJVR09VVCgiIEhhbGYgRHVwbGV4XG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIERFQlVHT1VUKCIxMDAwIE1icywgRnVsbCBEdXBsZXhcbiIpOworICAgICAgICAqc3BlZWQgPSBTUEVFRF8xMDAwOworICAgICAgICAqZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisgICAgfQorCisgICAgLyogSUdQMDEgUEhZIG1heSBhZHZlcnRpc2UgZnVsbCBkdXBsZXggb3BlcmF0aW9uIGFmdGVyIHNwZWVkIGRvd25ncmFkZSBldmVuCisgICAgICogaWYgaXQgaXMgb3BlcmF0aW5nIGF0IGhhbGYgZHVwbGV4LiAgSGVyZSB3ZSBzZXQgdGhlIGR1cGxleCBzZXR0aW5ncyB0bworICAgICAqIG1hdGNoIHRoZSBkdXBsZXggaW4gdGhlIGxpbmsgcGFydG5lcidzIGNhcGFiaWxpdGllcy4KKyAgICAgKi8KKyAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgJiYgaHctPnNwZWVkX2Rvd25ncmFkZWQpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfRVhQLCAmcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmICghKHBoeV9kYXRhICYgTldBWV9FUl9MUF9OV0FZX0NBUFMpKQorICAgICAgICAgICAgKmR1cGxleCA9IEhBTEZfRFVQTEVYOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9MUF9BQklMSVRZLCAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICBpZiAoKCpzcGVlZCA9PSBTUEVFRF8xMDAgJiYgIShwaHlfZGF0YSAmIE5XQVlfTFBBUl8xMDBUWF9GRF9DQVBTKSkgfHwKKyAgICAgICAgICAgICAgICgqc3BlZWQgPT0gU1BFRURfMTAgJiYgIShwaHlfZGF0YSAmIE5XQVlfTFBBUl8xMFRfRkRfQ0FQUykpKQorICAgICAgICAgICAgICAgICpkdXBsZXggPSBIQUxGX0RVUExFWDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSAmJgorICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpKSB7CisgICAgICAgIGlmICgqc3BlZWQgPT0gU1BFRURfMTAwMCkKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWd1cmVfa21ybl9mb3JfMTAwMChodyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWd1cmVfa21ybl9mb3JfMTBfMTAwKGh3LCAqZHVwbGV4KTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgICBpZiAoKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzMpICYmICgqc3BlZWQgPT0gU1BFRURfMTAwMCkpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2t1bWVyYW5fbG9ja19sb3NzX3dvcmthcm91bmQoaHcpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEJsb2NrcyB1bnRpbCBhdXRvbmVnIGNvbXBsZXRlcyBvciB0aW1lcyBvdXQgKH40LjUgc2Vjb25kcykKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF93YWl0X2F1dG9uZWcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfd2FpdF9hdXRvbmVnIik7CisgICAgREVCVUdPVVQoIldhaXRpbmcgZm9yIEF1dG8tTmVnIHRvIGNvbXBsZXRlLlxuIik7CisKKyAgICAvKiBXZSB3aWxsIHdhaXQgZm9yIGF1dG9uZWcgdG8gY29tcGxldGUgb3IgNC41IHNlY29uZHMgdG8gZXhwaXJlLiAqLworICAgIGZvciAoaSA9IFBIWV9BVVRPX05FR19USU1FOyBpID4gMDsgaS0tKSB7CisgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnCisgICAgICAgICAqIENvbXBsZXRlIGJpdCB0byBiZSBzZXQuCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICBpZiAocGh5X2RhdGEgJiBNSUlfU1JfQVVUT05FR19DT01QTEVURSkgeworICAgICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgbXNsZWVwKDEwMCk7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJhaXNlcyB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIGN0cmwgLSBEZXZpY2UgY29udHJvbCByZWdpc3RlcidzIGN1cnJlbnQgdmFsdWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9yYWlzZV9tZGlfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjdHJsKQoreworICAgIC8qIFJhaXNlIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChieSBzZXR0aW5nIHRoZSBNREMKKyAgICAgKiBiaXQpLCBhbmQgdGhlbiBkZWxheSAxMCBtaWNyb3NlY29uZHMuCisgICAgICovCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoKmN0cmwgfCBFMTAwMF9DVFJMX01EQykpOworICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICB1ZGVsYXkoMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIExvd2VycyB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIGN0cmwgLSBEZXZpY2UgY29udHJvbCByZWdpc3RlcidzIGN1cnJlbnQgdmFsdWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9sb3dlcl9tZGlfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjdHJsKQoreworICAgIC8qIExvd2VyIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChieSBjbGVhcmluZyB0aGUgTURDCisgICAgICogYml0KSwgYW5kIHRoZW4gZGVsYXkgMTAgbWljcm9zZWNvbmRzLgorICAgICAqLworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgKCpjdHJsICYgfkUxMDAwX0NUUkxfTURDKSk7CisgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIHVkZWxheSgxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2hpZnRzIGRhdGEgYml0cyBvdXQgdG8gdGhlIFBIWQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKiBkYXRhIC0gRGF0YSB0byBzZW5kIG91dCB0byB0aGUgUEhZCisqIGNvdW50IC0gTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgb3V0CisqCisqIEJpdHMgYXJlIHNoaWZ0ZWQgb3V0IGluIE1TQiB0byBMU0Igb3JkZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudCkKK3sKKyAgICB1aW50MzJfdCBjdHJsOworICAgIHVpbnQzMl90IG1hc2s7CisKKyAgICAvKiBXZSBuZWVkIHRvIHNoaWZ0ICJjb3VudCIgbnVtYmVyIG9mIGJpdHMgb3V0IHRvIHRoZSBQSFkuIFNvLCB0aGUgdmFsdWUKKyAgICAgKiBpbiB0aGUgImRhdGEiIHBhcmFtZXRlciB3aWxsIGJlIHNoaWZ0ZWQgb3V0IHRvIHRoZSBQSFkgb25lIGJpdCBhdCBhCisgICAgICogdGltZS4gSW4gb3JkZXIgdG8gZG8gdGhpcywgImRhdGEiIG11c3QgYmUgYnJva2VuIGRvd24gaW50byBiaXRzLgorICAgICAqLworICAgIG1hc2sgPSAweDAxOworICAgIG1hc2sgPDw9IChjb3VudCAtIDEpOworCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKworICAgIC8qIFNldCBNRElPX0RJUiBhbmQgTURDX0RJUiBkaXJlY3Rpb24gYml0cyB0byBiZSB1c2VkIGFzIG91dHB1dCBwaW5zLiAqLworICAgIGN0cmwgfD0gKEUxMDAwX0NUUkxfTURJT19ESVIgfCBFMTAwMF9DVFJMX01EQ19ESVIpOworCisgICAgd2hpbGUgKG1hc2spIHsKKyAgICAgICAgLyogQSAiMSIgaXMgc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBieSBzZXR0aW5nIHRoZSBNRElPIGJpdCB0byAiMSIgYW5kCisgICAgICAgICAqIHRoZW4gcmFpc2luZyBhbmQgbG93ZXJpbmcgdGhlIE1hbmFnZW1lbnQgRGF0YSBDbG9jay4gQSAiMCIgaXMKKyAgICAgICAgICogc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBieSBzZXR0aW5nIHRoZSBNRElPIGJpdCB0byAiMCIgYW5kIHRoZW4KKyAgICAgICAgICogcmFpc2luZyBhbmQgbG93ZXJpbmcgdGhlIGNsb2NrLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGRhdGEgJiBtYXNrKQorICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX01ESU87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfTURJTzsKKworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisKKyAgICAgICAgdWRlbGF5KDEwKTsKKworICAgICAgICBlMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisgICAgICAgIGUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKKworICAgICAgICBtYXNrID0gbWFzayA+PiAxOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGlmdHMgZGF0YSBiaXRzIGluIGZyb20gdGhlIFBIWQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBCaXRzIGFyZSBzaGlmdGVkIGluIGluIE1TQiB0byBMU0Igb3JkZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludDE2X3QKK2UxMDAwX3NoaWZ0X2luX21kaV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybDsKKyAgICB1aW50MTZfdCBkYXRhID0gMDsKKyAgICB1aW50OF90IGk7CisKKyAgICAvKiBJbiBvcmRlciB0byByZWFkIGEgcmVnaXN0ZXIgZnJvbSB0aGUgUEhZLCB3ZSBuZWVkIHRvIHNoaWZ0IGluIGEgdG90YWwKKyAgICAgKiBvZiAxOCBiaXRzIGZyb20gdGhlIFBIWS4gVGhlIGZpcnN0IHR3byBiaXQgKHR1cm5hcm91bmQpIHRpbWVzIGFyZSB1c2VkCisgICAgICogdG8gYXZvaWQgY29udGVudGlvbiBvbiB0aGUgTURJTyBwaW4gd2hlbiBhIHJlYWQgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KKyAgICAgKiBUaGVzZSB0d28gYml0cyBhcmUgaWdub3JlZCBieSB1cyBhbmQgdGhyb3duIGF3YXkuIEJpdHMgYXJlICJzaGlmdGVkIGluIgorICAgICAqIGJ5IHJhaXNpbmcgdGhlIGlucHV0IHRvIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sgKHNldHRpbmcgdGhlIE1EQyBiaXQpLAorICAgICAqIGFuZCB0aGVuIHJlYWRpbmcgdGhlIHZhbHVlIG9mIHRoZSBNRElPIGJpdC4KKyAgICAgKi8KKyAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCisgICAgLyogQ2xlYXIgTURJT19ESVIgKFNXRFBJTzEpIHRvIGluZGljYXRlIHRoaXMgYml0IGlzIHRvIGJlIHVzZWQgYXMgaW5wdXQuICovCisgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9NRElPX0RJUjsKKyAgICBjdHJsICY9IH5FMTAwMF9DVFJMX01ESU87CisKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKworICAgIC8qIFJhaXNlIGFuZCBMb3dlciB0aGUgY2xvY2sgYmVmb3JlIHJlYWRpbmcgaW4gdGhlIGRhdGEuIFRoaXMgYWNjb3VudHMgZm9yCisgICAgICogdGhlIHR1cm5hcm91bmQgYml0cy4gVGhlIGZpcnN0IGNsb2NrIG9jY3VycmVkIHdoZW4gd2UgY2xvY2tlZCBvdXQgdGhlCisgICAgICogbGFzdCBiaXQgb2YgdGhlIFJlZ2lzdGVyIEFkZHJlc3MuCisgICAgICovCisgICAgZTEwMDBfcmFpc2VfbWRpX2NsayhodywgJmN0cmwpOworICAgIGUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKKworICAgIGZvciAoZGF0YSA9IDAsIGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBkYXRhID0gZGF0YSA8PCAxOworICAgICAgICBlMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisgICAgICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBzaGlmdGVkIGluIGEgIjEiLiAqLworICAgICAgICBpZiAoY3RybCAmIEUxMDAwX0NUUkxfTURJTykKKyAgICAgICAgICAgIGRhdGEgfD0gMTsKKyAgICAgICAgZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworICAgIH0KKworICAgIGUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKKyAgICBlMTAwMF9sb3dlcl9tZGlfY2xrKGh3LCAmY3RybCk7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludDMyX3QKK2UxMDAwX3N3Zndfc3luY19hY3F1aXJlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IG1hc2spCit7CisgICAgdWludDMyX3Qgc3dmd19zeW5jID0gMDsKKyAgICB1aW50MzJfdCBzd21hc2sgPSBtYXNrOworICAgIHVpbnQzMl90IGZ3bWFzayA9IG1hc2sgPDwgMTY7CisgICAgaW50MzJfdCB0aW1lb3V0ID0gMjAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9zd2Z3X3N5bmNfYWNxdWlyZSIpOworCisgICAgaWYgKGh3LT5zd2Z3aHdfc2VtYXBob3JlX3ByZXNlbnQpCisgICAgICAgIHJldHVybiBlMTAwMF9nZXRfc29mdHdhcmVfZmxhZyhodyk7CisKKyAgICBpZiAoIWh3LT5zd2Z3X3N5bmNfcHJlc2VudCkKKyAgICAgICAgcmV0dXJuIGUxMDAwX2dldF9od19lZXByb21fc2VtYXBob3JlKGh3KTsKKworICAgIHdoaWxlICh0aW1lb3V0KSB7CisgICAgICAgICAgICBpZiAoZTEwMDBfZ2V0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1NXRldfU1lOQzsKKworICAgICAgICAgICAgc3dmd19zeW5jID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNXX0ZXX1NZTkMpOworICAgICAgICAgICAgaWYgKCEoc3dmd19zeW5jICYgKGZ3bWFzayB8IHN3bWFzaykpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGZpcm13YXJlIGN1cnJlbnRseSB1c2luZyByZXNvdXJjZSAoZndtYXNrKSAqLworICAgICAgICAgICAgLyogb3Igb3RoZXIgc29mdHdhcmUgdGhyZWFkIGN1cnJlbnRseSB1c2luZyByZXNvdXJjZSAoc3dtYXNrKSAqLworICAgICAgICAgICAgZTEwMDBfcHV0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpOworICAgICAgICAgICAgbWRlbGF5KDUpOworICAgICAgICAgICAgdGltZW91dC0tOworICAgIH0KKworICAgIGlmICghdGltZW91dCkgeworICAgICAgICBERUJVR09VVCgiRHJpdmVyIGNhbid0IGFjY2VzcyByZXNvdXJjZSwgU1dfRldfU1lOQyB0aW1lb3V0LlxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1NXRldfU1lOQzsKKyAgICB9CisKKyAgICBzd2Z3X3N5bmMgfD0gc3dtYXNrOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgU1dfRldfU1lOQywgc3dmd19zeW5jKTsKKworICAgIGUxMDAwX3B1dF9od19lZXByb21fc2VtYXBob3JlKGh3KTsKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX3N3Zndfc3luY19yZWxlYXNlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IG1hc2spCit7CisgICAgdWludDMyX3Qgc3dmd19zeW5jOworICAgIHVpbnQzMl90IHN3bWFzayA9IG1hc2s7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3N3Zndfc3luY19yZWxlYXNlIik7CisKKyAgICBpZiAoaHctPnN3Zndod19zZW1hcGhvcmVfcHJlc2VudCkgeworICAgICAgICBlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX2ZsYWcoaHcpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFody0+c3dmd19zeW5jX3ByZXNlbnQpIHsKKyAgICAgICAgZTEwMDBfcHV0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogaWYgKGUxMDAwX2dldF9od19lZXByb21fc2VtYXBob3JlKGh3KSkKKyAgICAgKiAgICByZXR1cm4gLUUxMDAwX0VSUl9TV0ZXX1NZTkM7ICovCisgICAgd2hpbGUgKGUxMDAwX2dldF9od19lZXByb21fc2VtYXBob3JlKGh3KSAhPSBFMTAwMF9TVUNDRVNTKTsKKyAgICAgICAgLyogZW1wdHkgKi8KKworICAgIHN3Zndfc3luYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTV19GV19TWU5DKTsKKyAgICBzd2Z3X3N5bmMgJj0gfnN3bWFzazsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIFNXX0ZXX1NZTkMsIHN3Zndfc3luYyk7CisKKyAgICBlMTAwMF9wdXRfaHdfZWVwcm9tX3NlbWFwaG9yZShodyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSZWFkcyB0aGUgdmFsdWUgZnJvbSBhIFBIWSByZWdpc3RlciwgaWYgdGhlIHZhbHVlIGlzIG9uIGEgc3BlY2lmaWMgbm9uIHplcm8KKyogcGFnZSwgc2V0cyB0aGUgcGFnZSBmaXJzdC4KKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogcmVnX2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBQSFkgcmVnaXN0ZXIgdG8gcmVhZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcmVhZF9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnBoeV9kYXRhKQoreworICAgIHVpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3Qgc3dmdzsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcmVhZF9waHlfcmVnIik7CisKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbiB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzYpICYmCisgICAgICAgIChFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpKSB7CisgICAgICAgIHN3ZncgPSBFMTAwMF9TV0ZXX1BIWTFfU007CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dmdyA9IEUxMDAwX1NXRldfUEhZMF9TTTsKKyAgICB9CisgICAgaWYgKGUxMDAwX3N3Zndfc3luY19hY3F1aXJlKGh3LCBzd2Z3KSkKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfU1dGV19TWU5DOworCisgICAgaWYgKChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCB8fAorICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8zIHx8CisgICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzIpICYmCisgICAgICAgKHJlZ19hZGRyID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpcmVnX2FkZHIpOworICAgICAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICAgICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIHN3ZncpOworICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfZ2c4MjU2MykgeworICAgICAgICBpZiAoKChyZWdfYWRkciAmIE1BWF9QSFlfUkVHX0FERFJFU1MpID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykgfHwKKyAgICAgICAgICAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pKSB7CisgICAgICAgICAgICAvKiBTZWxlY3QgQ29uZmlndXJhdGlvbiBQYWdlICovCisgICAgICAgICAgICBpZiAoKHJlZ19hZGRyICYgTUFYX1BIWV9SRUdfQUREUkVTUykgPCBHRzgyNTYzX01JTl9BTFRfUkVHKSB7CisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIEdHODI1NjNfUEhZX1BBR0VfU0VMRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKCh1aW50MTZfdClyZWdfYWRkciA+PiBHRzgyNTYzX1BBR0VfU0hJRlQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVXNlIEFsdGVybmF0aXZlIFBhZ2UgU2VsZWN0IHJlZ2lzdGVyIHRvIGFjY2VzcworICAgICAgICAgICAgICAgICAqIHJlZ2lzdGVycyAzMCBhbmQgMzEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19leChodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRzgyNTYzX1BIWV9QQUdFX1NFTEVDVF9BTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoKHVpbnQxNl90KXJlZ19hZGRyID4+IEdHODI1NjNfUEFHRV9TSElGVCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBzd2Z3KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWdfZXgoaHcsIE1BWF9QSFlfUkVHX0FERFJFU1MgJiByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKworICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBzd2Z3KTsKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludDMyX3QKK2UxMDAwX3JlYWRfcGh5X3JlZ19leChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcGh5X2RhdGEpCit7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBtZGljID0gMDsKKyAgICBjb25zdCB1aW50MzJfdCBwaHlfYWRkciA9IDE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfcGh5X3JlZ19leCIpOworCisgICAgaWYgKHJlZ19hZGRyID4gTUFYX1BIWV9SRUdfQUREUkVTUykgeworICAgICAgICBERUJVR09VVDEoIlBIWSBBZGRyZXNzICVkIGlzIG91dCBvZiByYW5nZVxuIiwgcmVnX2FkZHIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QQVJBTTsKKyAgICB9CisKKyAgICBpZiAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgLyogU2V0IHVwIE9wLWNvZGUsIFBoeSBBZGRyZXNzLCBhbmQgcmVnaXN0ZXIgYWRkcmVzcyBpbiB0aGUgTURJCisgICAgICAgICAqIENvbnRyb2wgcmVnaXN0ZXIuICBUaGUgTUFDIHdpbGwgdGFrZSBjYXJlIG9mIGludGVyZmFjaW5nIHdpdGggdGhlCisgICAgICAgICAqIFBIWSB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgbWRpYyA9ICgocmVnX2FkZHIgPDwgRTEwMDBfTURJQ19SRUdfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAocGh5X2FkZHIgPDwgRTEwMDBfTURJQ19QSFlfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAoRTEwMDBfTURJQ19PUF9SRUFEKSk7CisKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBNRElDLCBtZGljKTsKKworICAgICAgICAvKiBQb2xsIHRoZSByZWFkeSBiaXQgdG8gc2VlIGlmIHRoZSBNREkgcmVhZCBjb21wbGV0ZWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIHVkZWxheSg1MCk7CisgICAgICAgICAgICBtZGljID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1ESUMpOworICAgICAgICAgICAgaWYgKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShtZGljICYgRTEwMDBfTURJQ19SRUFEWSkpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJNREkgUmVhZCBkaWQgbm90IGNvbXBsZXRlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWRpYyAmIEUxMDAwX01ESUNfRVJST1IpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJNREkgRXJyb3JcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworICAgICAgICB9CisgICAgICAgICpwaHlfZGF0YSA9ICh1aW50MTZfdCkgbWRpYzsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBtdXN0IGZpcnN0IHNlbmQgYSBwcmVhbWJsZSB0aHJvdWdoIHRoZSBNRElPIHBpbiB0byBzaWduYWwgdGhlCisgICAgICAgICAqIGJlZ2lubmluZyBvZiBhbiBNSUkgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyAzMgorICAgICAgICAgKiBjb25zZWN1dGl2ZSAiMSIgYml0cy4KKyAgICAgICAgICovCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgUEhZX1BSRUFNQkxFLCBQSFlfUFJFQU1CTEVfU0laRSk7CisKKyAgICAgICAgLyogTm93IGNvbWJpbmUgdGhlIG5leHQgZmV3IGZpZWxkcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgYSByZWFkCisgICAgICAgICAqIG9wZXJhdGlvbi4gIFdlIHVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlCisgICAgICAgICAqIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyByb3V0aW5lIGZpdmUgZGlmZmVyZW50IHRpbWVzLiBUaGUgZm9ybWF0IG9mCisgICAgICAgICAqIGEgTUlJIHJlYWQgaW5zdHJ1Y3Rpb24gY29uc2lzdHMgb2YgYSBzaGlmdCBvdXQgb2YgMTQgYml0cyBhbmQgaXMKKyAgICAgICAgICogZGVmaW5lZCBhcyBmb2xsb3dzOgorICAgICAgICAgKiAgICA8UHJlYW1ibGU+PFNPRj48T3AgQ29kZT48UGh5IEFkZHI+PFJlZyBBZGRyPgorICAgICAgICAgKiBmb2xsb3dlZCBieSBhIHNoaWZ0IGluIG9mIDE4IGJpdHMuICBUaGlzIGZpcnN0IHR3byBiaXRzIHNoaWZ0ZWQgaW4KKyAgICAgICAgICogYXJlIFR1cm5Bcm91bmQgYml0cyB1c2VkIHRvIGF2b2lkIGNvbnRlbnRpb24gb24gdGhlIE1ESU8gcGluIHdoZW4gYQorICAgICAgICAgKiBSRUFEIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuICBUaGVzZSB0d28gYml0cyBhcmUgdGhyb3duIGF3YXkKKyAgICAgICAgICogZm9sbG93ZWQgYnkgYSBzaGlmdCBpbiBvZiAxNiBiaXRzIHdoaWNoIGNvbnRhaW5zIHRoZSBkZXNpcmVkIGRhdGEuCisgICAgICAgICAqLworICAgICAgICBtZGljID0gKChyZWdfYWRkcikgfCAocGh5X2FkZHIgPDwgNSkgfAorICAgICAgICAgICAgICAgIChQSFlfT1BfUkVBRCA8PCAxMCkgfCAoUEhZX1NPRiA8PCAxMikpOworCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgbWRpYywgMTQpOworCisgICAgICAgIC8qIE5vdyB0aGF0IHdlJ3ZlIHNoaWZ0ZWQgb3V0IHRoZSByZWFkIGNvbW1hbmQgdG8gdGhlIE1JSSwgd2UgbmVlZCB0bworICAgICAgICAgKiAic2hpZnQgaW4iIHRoZSAxNi1iaXQgdmFsdWUgKDE4IHRvdGFsIGJpdHMpIG9mIHRoZSByZXF1ZXN0ZWQgUEhZCisgICAgICAgICAqIHJlZ2lzdGVyIGFkZHJlc3MuCisgICAgICAgICAqLworICAgICAgICAqcGh5X2RhdGEgPSBlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhodyk7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdyaXRlcyBhIHZhbHVlIHRvIGEgUEhZIHJlZ2lzdGVyCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHJlZ19hZGRyIC0gYWRkcmVzcyBvZiB0aGUgUEhZIHJlZ2lzdGVyIHRvIHdyaXRlCisqIGRhdGEgLSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBQSFkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3dyaXRlX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBoeV9kYXRhKQoreworICAgIHVpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3Qgc3dmdzsKKworICAgIERFQlVHRlVOQygiZTEwMDBfd3JpdGVfcGh5X3JlZyIpOworCisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4gfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTc2KSAmJgorICAgICAgICAoRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKSkgeworICAgICAgICBzd2Z3ID0gRTEwMDBfU1dGV19QSFkxX1NNOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3ZncgPSBFMTAwMF9TV0ZXX1BIWTBfU007CisgICAgfQorICAgIGlmIChlMTAwMF9zd2Z3X3N5bmNfYWNxdWlyZShodywgc3dmdykpCisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1NXRldfU1lOQzsKKworICAgIGlmICgoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgfHwKKyAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMyB8fAorICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKSAmJgorICAgICAgIChyZWdfYWRkciA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KXJlZ19hZGRyKTsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBzd2Z3KTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpIHsKKyAgICAgICAgaWYgKCgocmVnX2FkZHIgJiBNQVhfUEhZX1JFR19BRERSRVNTKSA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpIHx8CisgICAgICAgICAgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSkgeworICAgICAgICAgICAgLyogU2VsZWN0IENvbmZpZ3VyYXRpb24gUGFnZSAqLworICAgICAgICAgICAgaWYgKChyZWdfYWRkciAmIE1BWF9QSFlfUkVHX0FERFJFU1MpIDwgR0c4MjU2M19NSU5fQUxUX1JFRykgeworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBHRzgyNTYzX1BIWV9QQUdFX1NFTEVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KSgodWludDE2X3QpcmVnX2FkZHIgPj4gR0c4MjU2M19QQUdFX1NISUZUKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFVzZSBBbHRlcm5hdGl2ZSBQYWdlIFNlbGVjdCByZWdpc3RlciB0byBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgKiByZWdpc3RlcnMgMzAgYW5kIDMxCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0c4MjU2M19QSFlfUEFHRV9TRUxFQ1RfQUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKCh1aW50MTZfdClyZWdfYWRkciA+PiBHRzgyNTYzX1BBR0VfU0hJRlQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBlMTAwMF9zd2Z3X3N5bmNfcmVsZWFzZShodywgc3dmdyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19leChodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKworICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBzd2Z3KTsKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludDMyX3QKK2UxMDAwX3dyaXRlX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBoeV9kYXRhKQoreworICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3QgbWRpYyA9IDA7CisgICAgY29uc3QgdWludDMyX3QgcGh5X2FkZHIgPSAxOworCisgICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9waHlfcmVnX2V4Iik7CisKKyAgICBpZiAocmVnX2FkZHIgPiBNQVhfUEhZX1JFR19BRERSRVNTKSB7CisgICAgICAgIERFQlVHT1VUMSgiUEhZIEFkZHJlc3MgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCByZWdfYWRkcik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BBUkFNOworICAgIH0KKworICAgIGlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgeworICAgICAgICAvKiBTZXQgdXAgT3AtY29kZSwgUGh5IEFkZHJlc3MsIHJlZ2lzdGVyIGFkZHJlc3MsIGFuZCBkYXRhIGludGVuZGVkCisgICAgICAgICAqIGZvciB0aGUgUEhZIHJlZ2lzdGVyIGluIHRoZSBNREkgQ29udHJvbCByZWdpc3Rlci4gIFRoZSBNQUMgd2lsbCB0YWtlCisgICAgICAgICAqIGNhcmUgb2YgaW50ZXJmYWNpbmcgd2l0aCB0aGUgUEhZIHRvIHNlbmQgdGhlIGRlc2lyZWQgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIG1kaWMgPSAoKCh1aW50MzJfdCkgcGh5X2RhdGEpIHwKKyAgICAgICAgICAgICAgICAocmVnX2FkZHIgPDwgRTEwMDBfTURJQ19SRUdfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAocGh5X2FkZHIgPDwgRTEwMDBfTURJQ19QSFlfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAoRTEwMDBfTURJQ19PUF9XUklURSkpOworCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTURJQywgbWRpYyk7CisKKyAgICAgICAgLyogUG9sbCB0aGUgcmVhZHkgYml0IHRvIHNlZSBpZiB0aGUgTURJIHJlYWQgY29tcGxldGVkICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDE7IGkrKykgeworICAgICAgICAgICAgdWRlbGF5KDUpOworICAgICAgICAgICAgbWRpYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNRElDKTsKKyAgICAgICAgICAgIGlmIChtZGljICYgRTEwMDBfTURJQ19SRUFEWSkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpKSB7CisgICAgICAgICAgICBERUJVR09VVCgiTURJIFdyaXRlIGRpZCBub3QgY29tcGxldGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2UnbGwgbmVlZCB0byB1c2UgdGhlIFNXIGRlZmluZWQgcGlucyB0byBzaGlmdCB0aGUgd3JpdGUgY29tbWFuZAorICAgICAgICAgKiBvdXQgdG8gdGhlIFBIWS4gV2UgZmlyc3Qgc2VuZCBhIHByZWFtYmxlIHRvIHRoZSBQSFkgdG8gc2lnbmFsIHRoZQorICAgICAgICAgKiBiZWdpbm5pbmcgb2YgdGhlIE1JSSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZG9uZSBieSBzZW5kaW5nIDMyCisgICAgICAgICAqIGNvbnNlY3V0aXZlICIxIiBiaXRzLgorICAgICAgICAgKi8KKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKGh3LCBQSFlfUFJFQU1CTEUsIFBIWV9QUkVBTUJMRV9TSVpFKTsKKworICAgICAgICAvKiBOb3cgY29tYmluZSB0aGUgcmVtYWluaW5nIHJlcXVpcmVkIGZpZWxkcyB0aGF0IHdpbGwgaW5kaWNhdGUgYQorICAgICAgICAgKiB3cml0ZSBvcGVyYXRpb24uIFdlIHVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlCisgICAgICAgICAqIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyByb3V0aW5lIGZvciBlYWNoIGZpZWxkIGluIHRoZSBjb21tYW5kLiBUaGUKKyAgICAgICAgICogZm9ybWF0IG9mIGEgTUlJIHdyaXRlIGluc3RydWN0aW9uIGlzIGFzIGZvbGxvd3M6CisgICAgICAgICAqIDxQcmVhbWJsZT48U09GPjxPcCBDb2RlPjxQaHkgQWRkcj48UmVnIEFkZHI+PFR1cm5hcm91bmQ+PERhdGE+LgorICAgICAgICAgKi8KKyAgICAgICAgbWRpYyA9ICgoUEhZX1RVUk5BUk9VTkQpIHwgKHJlZ19hZGRyIDw8IDIpIHwgKHBoeV9hZGRyIDw8IDcpIHwKKyAgICAgICAgICAgICAgICAoUEhZX09QX1dSSVRFIDw8IDEyKSB8IChQSFlfU09GIDw8IDE0KSk7CisgICAgICAgIG1kaWMgPDw9IDE2OworICAgICAgICBtZGljIHw9ICh1aW50MzJfdCkgcGh5X2RhdGE7CisKKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKGh3LCBtZGljLCAzMik7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQzMl90CitlMTAwMF9yZWFkX2ttcm5fcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZGF0YSkKK3sKKyAgICB1aW50MzJfdCByZWdfdmFsOworICAgIHVpbnQxNl90IHN3Znc7CisgICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX2ttcm5fcmVnIik7CisKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbiB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzYpICYmCisgICAgICAgIChFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpKSB7CisgICAgICAgIHN3ZncgPSBFMTAwMF9TV0ZXX1BIWTFfU007CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dmdyA9IEUxMDAwX1NXRldfUEhZMF9TTTsKKyAgICB9CisgICAgaWYgKGUxMDAwX3N3Zndfc3luY19hY3F1aXJlKGh3LCBzd2Z3KSkKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfU1dGV19TWU5DOworCisgICAgLyogV3JpdGUgcmVnaXN0ZXIgYWRkcmVzcyAqLworICAgIHJlZ192YWwgPSAoKHJlZ19hZGRyIDw8IEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUX1NISUZUKSAmCisgICAgICAgICAgICAgIEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUKSB8CisgICAgICAgICAgICAgIEUxMDAwX0tVTUNUUkxTVEFfUkVOOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgS1VNQ1RSTFNUQSwgcmVnX3ZhbCk7CisgICAgdWRlbGF5KDIpOworCisgICAgLyogUmVhZCB0aGUgZGF0YSByZXR1cm5lZCAqLworICAgIHJlZ192YWwgPSBFMTAwMF9SRUFEX1JFRyhodywgS1VNQ1RSTFNUQSk7CisgICAgKmRhdGEgPSAodWludDE2X3QpcmVnX3ZhbDsKKworICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBzd2Z3KTsKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworc3RhdGljIGludDMyX3QKK2UxMDAwX3dyaXRlX2ttcm5fcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRhdGEpCit7CisgICAgdWludDMyX3QgcmVnX3ZhbDsKKyAgICB1aW50MTZfdCBzd2Z3OworICAgIERFQlVHRlVOQygiZTEwMDBfd3JpdGVfa21ybl9yZWciKTsKKworICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3NikgJiYKKyAgICAgICAgKEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkpIHsKKyAgICAgICAgc3dmdyA9IEUxMDAwX1NXRldfUEhZMV9TTTsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2Z3ID0gRTEwMDBfU1dGV19QSFkwX1NNOworICAgIH0KKyAgICBpZiAoZTEwMDBfc3dmd19zeW5jX2FjcXVpcmUoaHcsIHN3ZncpKQorICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9TV0ZXX1NZTkM7CisKKyAgICByZWdfdmFsID0gKChyZWdfYWRkciA8PCBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVF9TSElGVCkgJgorICAgICAgICAgICAgICBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVCkgfCBkYXRhOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgS1VNQ1RSTFNUQSwgcmVnX3ZhbCk7CisgICAgdWRlbGF5KDIpOworCisgICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIHN3ZncpOworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJldHVybnMgdGhlIFBIWSB0byB0aGUgcG93ZXItb24gcmVzZXQgc3RhdGUKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3BoeV9od19yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmwsIGN0cmxfZXh0OworICAgIHVpbnQzMl90IGxlZF9jdHJsOworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBzd2Z3OworCisgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfaHdfcmVzZXQiKTsKKworICAgIC8qIEluIHRoZSBjYXNlIG9mIHRoZSBwaHkgcmVzZXQgYmVpbmcgYmxvY2tlZCwgaXQncyBub3QgYW4gZXJyb3IsIHdlCisgICAgICogc2ltcGx5IHJldHVybiBzdWNjZXNzIHdpdGhvdXQgcGVyZm9ybWluZyB0aGUgcmVzZXQuICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jayhodyk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgREVCVUdPVVQoIlJlc2V0dGluZyBQaHkuLi5cbiIpOworCisgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisgICAgICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuIHx8CisgICAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTc2KSAmJgorICAgICAgICAgICAgKEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkpIHsKKyAgICAgICAgICAgIHN3ZncgPSBFMTAwMF9TV0ZXX1BIWTFfU007CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2Z3ID0gRTEwMDBfU1dGV19QSFkwX1NNOworICAgICAgICB9CisgICAgICAgIGlmIChlMTAwMF9zd2Z3X3N5bmNfYWNxdWlyZShodywgc3dmdykpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJVbmFibGUgdG8gYWNxdWlyZSBzd2Z3IHN5bmNcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfU1dGV19TWU5DOworICAgICAgICB9CisgICAgICAgIC8qIFJlYWQgdGhlIGRldmljZSBjb250cm9sIHJlZ2lzdGVyIGFuZCBhc3NlcnQgdGhlIEUxMDAwX0NUUkxfUEhZX1JTVAorICAgICAgICAgKiBiaXQuIFRoZW4sIHRha2UgaXQgb3V0IG9mIHJlc2V0LgorICAgICAgICAgKiBGb3IgcHJlLWUxMDAwXzgyNTcxIGhhcmR3YXJlLCB3ZSBkZWxheSBmb3IgMTBtcyBiZXR3ZWVuIHRoZSBhc3NlcnQKKyAgICAgICAgICogYW5kIGRlYXNzZXJ0LiAgRm9yIGUxMDAwXzgyNTcxIGhhcmR3YXJlIGFuZCBsYXRlciwgd2UgaW5zdGVhZCBkZWxheQorICAgICAgICAgKiBmb3IgNTB1cyBiZXR3ZWVuIGFuZCAxMG1zIGFmdGVyIHRoZSBkZWFzc2VydGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCB8IEUxMDAwX0NUUkxfUEhZX1JTVCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKworICAgICAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NzEpCisgICAgICAgICAgICBtc2xlZXAoMTApOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1ZGVsYXkoMTAwKTsKKworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSkKKyAgICAgICAgICAgIG1kZWxheSgxMCk7CisKKyAgICAgICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIHN3ZncpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFJlYWQgdGhlIEV4dGVuZGVkIERldmljZSBDb250cm9sIFJlZ2lzdGVyLCBhc3NlcnQgdGhlIFBIWV9SRVNFVF9ESVIKKyAgICAgICAgICogYml0IHRvIHB1dCB0aGUgUEhZIGludG8gcmVzZXQuIFRoZW4sIHRha2UgaXQgb3V0IG9mIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTF9FWFQpOworICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RJUjsKKyAgICAgICAgY3RybF9leHQgJj0gfkUxMDAwX0NUUkxfRVhUX1NEUDRfREFUQTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMX0VYVCwgY3RybF9leHQpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIG1zbGVlcCgxMCk7CisgICAgICAgIGN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX1NEUDRfREFUQTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMX0VYVCwgY3RybF9leHQpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgfQorICAgIHVkZWxheSgxNTApOworCisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBhY3Rpdml0eSBMRUQgYWZ0ZXIgUEhZIHJlc2V0ICovCisgICAgICAgIGxlZF9jdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIExFRENUTCk7CisgICAgICAgIGxlZF9jdHJsICY9IElHUF9BQ1RJVklUWV9MRURfTUFTSzsKKyAgICAgICAgbGVkX2N0cmwgfD0gKElHUF9BQ1RJVklUWV9MRURfRU5BQkxFIHwgSUdQX0xFRDNfTU9ERSk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBsZWRfY3RybCk7CisgICAgfQorCisgICAgLyogV2FpdCBmb3IgRlcgdG8gZmluaXNoIFBIWSBjb25maWd1cmF0aW9uLiAqLworICAgIHJldF92YWwgPSBlMTAwMF9nZXRfcGh5X2NmZ19kb25lKGh3KTsKKyAgICBpZiAocmV0X3ZhbCAhPSBFMTAwMF9TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICBlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX3NlbWFwaG9yZShodyk7CisKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSAmJiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMykpCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9pbml0X2xjZF9mcm9tX252bShodyk7CisKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSZXNldHMgdGhlIFBIWQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBTZXRzIGJpdCAxNSBvZiB0aGUgTUlJIENvbnRyb2wgcmVnaXN0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3BoeV9yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X3Jlc2V0Iik7CisKKyAgICAvKiBJbiB0aGUgY2FzZSBvZiB0aGUgcGh5IHJlc2V0IGJlaW5nIGJsb2NrZWQsIGl0J3Mgbm90IGFuIGVycm9yLCB3ZQorICAgICAqIHNpbXBseSByZXR1cm4gc3VjY2VzcyB3aXRob3V0IHBlcmZvcm1pbmcgdGhlIHJlc2V0LiAqLworICAgIHJldF92YWwgPSBlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soaHcpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworICAgIHN3aXRjaCAoaHctPnBoeV90eXBlKSB7CisgICAgY2FzZSBlMTAwMF9waHlfaWdwOgorICAgIGNhc2UgZTEwMDBfcGh5X2lncF8yOgorICAgIGNhc2UgZTEwMDBfcGh5X2lncF8zOgorICAgIGNhc2UgZTEwMDBfcGh5X2lmZToKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9od19yZXNldChodyk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHBoeV9kYXRhIHw9IE1JSV9DUl9SRVNFVDsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCBwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgdWRlbGF5KDEpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgfHwgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMikKKyAgICAgICAgZTEwMDBfcGh5X2luaXRfc2NyaXB0KGh3KTsKKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdvcmstYXJvdW5kIGZvciA4MjU2NiBwb3dlci1kb3duOiBvbiBEMyBlbnRyeS0KKyogMSkgZGlzYWJsZSBnaWdhYml0IGxpbmsKKyogMikgd3JpdGUgVlIgcG93ZXItZG93biBlbmFibGUKKyogMykgcmVhZCBpdCBiYWNrCisqIGlmIHN1Y2Nlc3NmdWwgY29udGludWUsIGVsc2UgaXNzdWUgTENEIHJlc2V0IGFuZCByZXBlYXQKKyoKKyogaHcgLSBzdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX3BoeV9wb3dlcmRvd25fd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmVnOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworICAgIGludDMyX3QgcmV0cnkgPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfcG93ZXJkb3duX3dvcmthcm91bmQiKTsKKworICAgIGlmIChody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncF8zKQorICAgICAgICByZXR1cm47CisKKyAgICBkbyB7CisgICAgICAgIC8qIERpc2FibGUgbGluayAqLworICAgICAgICByZWcgPSBFMTAwMF9SRUFEX1JFRyhodywgUEhZX0NUUkwpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFBIWV9DVFJMLCByZWcgfCBFMTAwMF9QSFlfQ1RSTF9HQkVfRElTQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9QSFlfQ1RSTF9OT05EMEFfR0JFX0RJU0FCTEUpOworCisgICAgICAgIC8qIFdyaXRlIFZSIHBvd2VyLWRvd24gZW5hYmxlIC0gYml0cyA5Ojggc2hvdWxkIGJlIDEwYiAqLworICAgICAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDNfVlJfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgcGh5X2RhdGEgfD0gKDEgPDwgOSk7CisgICAgICAgIHBoeV9kYXRhICY9IH4oMSA8PCA4KTsKKyAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQM19WUl9DVFJMLCBwaHlfZGF0YSk7CisKKyAgICAgICAgLyogUmVhZCBpdCBiYWNrIGFuZCB0ZXN0ICovCisgICAgICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQM19WUl9DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICBpZiAoKChwaHlfZGF0YSAmIElHUDNfVlJfQ1RSTF9NT0RFX01BU0spID09IElHUDNfVlJfQ1RSTF9NT0RFX1NIVVQpIHx8IHJldHJ5KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogSXNzdWUgUEhZIHJlc2V0IGFuZCByZXBlYXQgYXQgbW9zdCBvbmUgbW9yZSB0aW1lICovCisgICAgICAgIHJlZyA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCByZWcgfCBFMTAwMF9DVFJMX1BIWV9SU1QpOworICAgICAgICByZXRyeSsrOworICAgIH0gd2hpbGUgKHJldHJ5KTsKKworICAgIHJldHVybjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdvcmstYXJvdW5kIGZvciA4MjU2NiBLdW1lcmFuIFBDUyBsb2NrIGxvc3M6CisqIE9uIGxpbmsgc3RhdHVzIGNoYW5nZSAoaS5lLiBQQ0kgcmVzZXQsIHNwZWVkIGNoYW5nZSkgYW5kIGxpbmsgaXMgdXAgYW5kCisqIHNwZWVkIGlzIGdpZ2FiaXQtCisqIDApIGlmIHdvcmthcm91bmQgaXMgb3B0aW9uYWxseSBkaXNhYmxlZCBkbyBub3RoaW5nCisqIDEpIHdhaXQgMW1zIGZvciBLdW1lcmFuIGxpbmsgdG8gY29tZSB1cAorKiAyKSBjaGVjayBLdW1lcmFuIERpYWdub3N0aWMgcmVnaXN0ZXIgUENTIGxvY2sgbG9zcyBiaXQKKyogMykgaWYgbm90IHNldCB0aGUgbGluayBpcyBsb2NrZWQgKGFsbCBpcyBnb29kKSwgb3RoZXJ3aXNlLi4uCisqIDQpIHJlc2V0IHRoZSBQSFkKKyogNSkgcmVwZWF0IHVwIHRvIDEwIHRpbWVzCisqIE5vdGU6IHRoaXMgaXMgb25seSBjYWxsZWQgZm9yIElHUDMgY29wcGVyIHdoZW4gc3BlZWQgaXMgMWdiLgorKgorKiBodyAtIHN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2t1bWVyYW5fbG9ja19sb3NzX3dvcmthcm91bmQoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgaW50MzJfdCByZWc7CisgICAgaW50MzJfdCBjbnQ7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBpZiAoaHctPmttcm5fbG9ja19sb3NzX3dvcmthcm91bmRfZGlzYWJsZWQpCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgLyogTWFrZSBzdXJlIGxpbmsgaXMgdXAgYmVmb3JlIHByb2NlZWRpbmcuICBJZiBub3QganVzdCByZXR1cm4uCisgICAgICogQXR0ZW1wdGluZyB0aGlzIHdoaWxlIGxpbmsgaXMgbmVnb3RpYXRpbmcgZm91bGVkIHVwIGxpbmsKKyAgICAgKiBzdGFiaWxpdHkgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisKKyAgICBpZiAocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpIHsKKyAgICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCAxMDsgY250KyspIHsKKyAgICAgICAgICAgIC8qIHJlYWQgb25jZSB0byBjbGVhciAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQM19LTVJOX0RJQUcsICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIC8qIGFuZCBhZ2FpbiB0byBnZXQgbmV3IHN0YXR1cyAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQM19LTVJOX0RJQUcsICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgLyogY2hlY2sgZm9yIFBDUyBsb2NrICovCisgICAgICAgICAgICBpZiAoIShwaHlfZGF0YSAmIElHUDNfS01STl9ESUFHX1BDU19MT0NLX0xPU1MpKQorICAgICAgICAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgICAgICAgICAvKiBJc3N1ZSBQSFkgcmVzZXQgKi8KKyAgICAgICAgICAgIGUxMDAwX3BoeV9od19yZXNldChodyk7CisgICAgICAgICAgICBtZGVsYXkoNSk7CisgICAgICAgIH0KKyAgICAgICAgLyogRGlzYWJsZSBHaWdFIGxpbmsgbmVnb3RpYXRpb24gKi8KKyAgICAgICAgcmVnID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBIWV9DVFJMKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBQSFlfQ1RSTCwgcmVnIHwgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfUEhZX0NUUkxfTk9ORDBBX0dCRV9ESVNBQkxFKTsKKworICAgICAgICAvKiB1bmFibGUgdG8gYWNxdWlyZSBQQ1MgbG9jayAqLworICAgICAgICByZXR1cm4gRTEwMDBfRVJSX1BIWTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQcm9iZXMgdGhlIGV4cGVjdGVkIFBIWSBhZGRyZXNzIGZvciBrbm93biBQSFkgSURzCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfZGV0ZWN0X2dpZ19waHkoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHBoeV9pbml0X3N0YXR1cywgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfaWRfaGlnaCwgcGh5X2lkX2xvdzsKKyAgICBib29sZWFuX3QgbWF0Y2ggPSBGQUxTRTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfZGV0ZWN0X2dpZ19waHkiKTsKKworICAgIGlmIChody0+cGh5X2lkICE9IDApCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgLyogVGhlIDgyNTcxIGZpcm13YXJlIG1heSBzdGlsbCBiZSBjb25maWd1cmluZyB0aGUgUEhZLiAgSW4gdGhpcworICAgICAqIGNhc2UsIHdlIGNhbm5vdCBhY2Nlc3MgdGhlIFBIWSB1bnRpbCB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lLiAgU28KKyAgICAgKiB3ZSBleHBsaWNpdGx5IHNldCB0aGUgUEhZIHZhbHVlcy4gKi8KKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTcxIHx8CisgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MikgeworICAgICAgICBody0+cGh5X2lkID0gSUdQMDFFMTAwMF9JX1BIWV9JRDsKKyAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X2lncF8yOworICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvKiBFU0ItMiBQSFkgcmVhZHMgcmVxdWlyZSBlMTAwMF9waHlfZ2c4MjU2MyB0byBiZSBzZXQgYmVjYXVzZSBvZiBhIHdvcmstCisgICAgICogYXJvdW5kIHRoYXQgZm9yY2VzIFBIWSBwYWdlIDAgdG8gYmUgc2V0IG9yIHRoZSByZWFkcyBmYWlsLiAgVGhlIHJlc3Qgb2YKKyAgICAgKiB0aGUgY29kZSBpbiB0aGlzIHJvdXRpbmUgdXNlcyBlMTAwMF9yZWFkX3BoeV9yZWcgdG8gcmVhZCB0aGUgUEhZIElELgorICAgICAqIFNvIGZvciBFU0ItMiB3ZSBuZWVkIHRvIGhhdmUgdGhpcyBzZXQgc28gb3VyIHJlYWRzIHdvbid0IGZhaWwuICBJZiB0aGUKKyAgICAgKiBhdHRhY2hlZCBQSFkgaXMgbm90IGEgZTEwMDBfcGh5X2dnODI1NjMsIHRoZSByb3V0aW5lcyBiZWxvdyB3aWxsIGZpZ3VyZQorICAgICAqIHRoaXMgb3V0IGFzIHdlbGwuICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikKKyAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X2dnODI1NjM7CisKKyAgICAvKiBSZWFkIHRoZSBQSFkgSUQgUmVnaXN0ZXJzIHRvIGlkZW50aWZ5IHdoaWNoIFBIWSBpcyBvbmJvYXJkLiAqLworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9JRDEsICZwaHlfaWRfaGlnaCk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgaHctPnBoeV9pZCA9ICh1aW50MzJfdCkgKHBoeV9pZF9oaWdoIDw8IDE2KTsKKyAgICB1ZGVsYXkoMjApOworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9JRDIsICZwaHlfaWRfbG93KTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBody0+cGh5X2lkIHw9ICh1aW50MzJfdCkgKHBoeV9pZF9sb3cgJiBQSFlfUkVWSVNJT05fTUFTSyk7CisgICAgaHctPnBoeV9yZXZpc2lvbiA9ICh1aW50MzJfdCkgcGh5X2lkX2xvdyAmIH5QSFlfUkVWSVNJT05fTUFTSzsKKworICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MjU0MzoKKyAgICAgICAgaWYgKGh3LT5waHlfaWQgPT0gTTg4RTEwMDBfRV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgaWYgKGh3LT5waHlfaWQgPT0gTTg4RTEwMDBfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0MDoKKyAgICBjYXNlIGUxMDAwXzgyNTQ1OgorICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisgICAgY2FzZSBlMTAwMF84MjU0NjoKKyAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorICAgICAgICBpZiAoaHctPnBoeV9pZCA9PSBNODhFMTAxMV9JX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTQxOgorICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisgICAgY2FzZSBlMTAwMF84MjU0NzoKKyAgICBjYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorICAgICAgICBpZiAoaHctPnBoeV9pZCA9PSBJR1AwMUUxMDAwX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgICAgIGlmIChody0+cGh5X2lkID09IE04OEUxMTExX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46CisgICAgICAgIGlmIChody0+cGh5X2lkID09IEdHODI1NjNfRV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF9pY2g4bGFuOgorICAgICAgICBpZiAoaHctPnBoeV9pZCA9PSBJR1AwM0UxMDAwX0VfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisgICAgICAgIGlmIChody0+cGh5X2lkID09IElGRV9FX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOworICAgICAgICBpZiAoaHctPnBoeV9pZCA9PSBJRkVfUExVU19FX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOworICAgICAgICBpZiAoaHctPnBoeV9pZCA9PSBJRkVfQ19FX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTc2OgorICAgICAgICBtYXRjaCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIERFQlVHT1VUMSgiSW52YWxpZCBNQUMgdHlwZSAlZFxuIiwgaHctPm1hY190eXBlKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworICAgIH0KKyAgICBwaHlfaW5pdF9zdGF0dXMgPSBlMTAwMF9zZXRfcGh5X3R5cGUoaHcpOworCisgICAgaWYgKChtYXRjaCkgJiYgKHBoeV9pbml0X3N0YXR1cyA9PSBFMTAwMF9TVUNDRVNTKSkgeworICAgICAgICBERUJVR09VVDEoIlBIWSBJRCAlIzA4eCBkZXRlY3RlZFxuIiwgaHctPnBoeV9pZCk7CisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgIH0KKyAgICBERUJVR09VVDEoIkludmFsaWQgUEhZIElEICUjMDh4XG4iLCBody0+cGh5X2lkKTsKKyAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmVzZXRzIHRoZSBQSFkncyBEU1AKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9waHlfcmVzZXRfZHNwKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X3Jlc2V0X2RzcCIpOworCisgICAgZG8geworICAgICAgICBpZiAoaHctPnBoeV90eXBlICE9IGUxMDAwX3BoeV9nZzgyNTYzKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMjksIDB4MDAxZCk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDMwLCAweDAwYzEpOworICAgICAgICBpZiAocmV0X3ZhbCkgYnJlYWs7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAzMCwgMHgwMDAwKTsKKyAgICAgICAgaWYgKHJldF92YWwpIGJyZWFrOworICAgICAgICByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKyAgICB9IHdoaWxlICgwKTsKKworICAgIHJldHVybiByZXRfdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEdldCBQSFkgaW5mb3JtYXRpb24gZnJvbSB2YXJpb3VzIFBIWSByZWdpc3RlcnMgZm9yIGlncCBQSFkgb25seS4KKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogcGh5X2luZm8gLSBQSFkgaW5mb3JtYXRpb24gc3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfcGh5X2lncF9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YSwgbWluX2xlbmd0aCwgbWF4X2xlbmd0aCwgYXZlcmFnZTsKKyAgICBlMTAwMF9yZXZfcG9sYXJpdHkgcG9sYXJpdHk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9pZ3BfZ2V0X2luZm8iKTsKKworICAgIC8qIFRoZSBkb3duc2hpZnQgc3RhdHVzIGlzIGNoZWNrZWQgb25seSBvbmNlLCBhZnRlciBsaW5rIGlzIGVzdGFibGlzaGVkLAorICAgICAqIGFuZCBpdCBzdG9yZWQgaW4gdGhlIGh3LT5zcGVlZF9kb3duZ3JhZGVkIHBhcmFtZXRlci4gKi8KKyAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gKGUxMDAwX2Rvd25zaGlmdClody0+c3BlZWRfZG93bmdyYWRlZDsKKworICAgIC8qIElHUDAxRTEwMDAgZG9lcyBub3QgbmVlZCB0byBzdXBwb3J0IGl0LiAqLworICAgIHBoeV9pbmZvLT5leHRlbmRlZF8xMGJ0X2Rpc3RhbmNlID0gZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbm9ybWFsOworCisgICAgLyogSUdQMDFFMTAwMCBhbHdheXMgY29ycmVjdCBwb2xhcml0eSByZXZlcnNhbCAqLworICAgIHBoeV9pbmZvLT5wb2xhcml0eV9jb3JyZWN0aW9uID0gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZW5hYmxlZDsKKworICAgIC8qIENoZWNrIHBvbGFyaXR5IHN0YXR1cyAqLworICAgIHJldF92YWwgPSBlMTAwMF9jaGVja19wb2xhcml0eShodywgJnBvbGFyaXR5KTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBwaHlfaW5mby0+Y2FibGVfcG9sYXJpdHkgPSBwb2xhcml0eTsKKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHBoeV9pbmZvLT5tZGl4X21vZGUgPSAoZTEwMDBfYXV0b194X21vZGUpKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9NRElYKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BTU1JfTURJWF9TSElGVCk7CisKKyAgICBpZiAoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1NQRUVEX01BU0spID09CisgICAgICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTKSB7CisgICAgICAgIC8qIExvY2FsL1JlbW90ZSBSZWNlaXZlciBJbmZvcm1hdGlvbiBhcmUgb25seSB2YWxpZCBhdCAxMDAwIE1icHMgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBwaHlfaW5mby0+bG9jYWxfcnggPSAoKHBoeV9kYXRhICYgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVNfU0hJRlQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX29rIDogZTEwMDBfMTAwMHRfcnhfc3RhdHVzX25vdF9vazsKKyAgICAgICAgcGh5X2luZm8tPnJlbW90ZV9yeCA9ICgocGh5X2RhdGEgJiBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVU19TSElGVCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX29rIDogZTEwMDBfMTAwMHRfcnhfc3RhdHVzX25vdF9vazsKKworICAgICAgICAvKiBHZXQgY2FibGUgbGVuZ3RoICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9nZXRfY2FibGVfbGVuZ3RoKGh3LCAmbWluX2xlbmd0aCwgJm1heF9sZW5ndGgpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIC8qIFRyYW5zbGF0ZSB0byBvbGQgbWV0aG9kICovCisgICAgICAgIGF2ZXJhZ2UgPSAobWF4X2xlbmd0aCArIG1pbl9sZW5ndGgpIC8gMjsKKworICAgICAgICBpZiAoYXZlcmFnZSA8PSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwKQorICAgICAgICAgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF81MDsKKyAgICAgICAgZWxzZSBpZiAoYXZlcmFnZSA8PSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzgwKQorICAgICAgICAgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF81MF84MDsKKyAgICAgICAgZWxzZSBpZiAoYXZlcmFnZSA8PSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExMCkKKyAgICAgICAgICAgIHBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSBlMTAwMF9jYWJsZV9sZW5ndGhfODBfMTEwOworICAgICAgICBlbHNlIGlmIChhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTQwKQorICAgICAgICAgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF8xMTBfMTQwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzE0MDsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBHZXQgUEhZIGluZm9ybWF0aW9uIGZyb20gdmFyaW91cyBQSFkgcmVnaXN0ZXJzIGZvciBpZmUgUEhZIG9ubHkuCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHBoeV9pbmZvIC0gUEhZIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3BoeV9pZmVfZ2V0X2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHlfaW5mbykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisgICAgZTEwMDBfcmV2X3BvbGFyaXR5IHBvbGFyaXR5OworCisgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfaWZlX2dldF9pbmZvIik7CisKKyAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gKGUxMDAwX2Rvd25zaGlmdClody0+c3BlZWRfZG93bmdyYWRlZDsKKyAgICBwaHlfaW5mby0+ZXh0ZW5kZWRfMTBidF9kaXN0YW5jZSA9IGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX25vcm1hbDsKKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MLCAmcGh5X2RhdGEpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICBwaHlfaW5mby0+cG9sYXJpdHlfY29ycmVjdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKHBoeV9kYXRhICYgSUZFX1BTQ19BVVRPX1BPTEFSSVRZX0RJU0FCTEUpID4+CisgICAgICAgICAgICAgICAgICAgICAgICBJRkVfUFNDX0FVVE9fUE9MQVJJVFlfRElTQUJMRV9TSElGVCkgPworICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZGlzYWJsZWQgOiBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF9lbmFibGVkOworCisgICAgaWYgKHBoeV9pbmZvLT5wb2xhcml0eV9jb3JyZWN0aW9uID09IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2VuYWJsZWQpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BvbGFyaXR5KGh3LCAmcG9sYXJpdHkpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFBvbGFyaXR5IGlzIGZvcmNlZC4gKi8KKyAgICAgICAgcG9sYXJpdHkgPSAoKHBoeV9kYXRhICYgSUZFX1BTQ19GT1JDRV9QT0xBUklUWSkgPj4KKyAgICAgICAgICAgICAgICAgICAgIElGRV9QU0NfRk9SQ0VfUE9MQVJJVFlfU0hJRlQpID8KKyAgICAgICAgICAgICAgICAgICAgIGUxMDAwX3Jldl9wb2xhcml0eV9yZXZlcnNlZCA6IGUxMDAwX3Jldl9wb2xhcml0eV9ub3JtYWw7CisgICAgfQorICAgIHBoeV9pbmZvLT5jYWJsZV9wb2xhcml0eSA9IHBvbGFyaXR5OworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUZFX1BIWV9NRElYX0NPTlRST0wsICZwaHlfZGF0YSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcGh5X2luZm8tPm1kaXhfbW9kZSA9IChlMTAwMF9hdXRvX3hfbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICgocGh5X2RhdGEgJiAoSUZFX1BNQ19BVVRPX01ESVggfCBJRkVfUE1DX0ZPUkNFX01ESVgpKSA+PgorICAgICAgICAgICAgICAgICAgICAgSUZFX1BNQ19NRElYX01PREVfU0hJRlQpOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogR2V0IFBIWSBpbmZvcm1hdGlvbiBmcm9tIHZhcmlvdXMgUEhZIHJlZ2lzdGVycyBmb3QgbTg4IFBIWSBvbmx5LgorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKiBwaHlfaW5mbyAtIFBIWSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9waHlfbTg4X2dldF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworICAgIGUxMDAwX3Jldl9wb2xhcml0eSBwb2xhcml0eTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X204OF9nZXRfaW5mbyIpOworCisgICAgLyogVGhlIGRvd25zaGlmdCBzdGF0dXMgaXMgY2hlY2tlZCBvbmx5IG9uY2UsIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQsCisgICAgICogYW5kIGl0IHN0b3JlZCBpbiB0aGUgaHctPnNwZWVkX2Rvd25ncmFkZWQgcGFyYW1ldGVyLiAqLworICAgIHBoeV9pbmZvLT5kb3duc2hpZnQgPSAoZTEwMDBfZG93bnNoaWZ0KWh3LT5zcGVlZF9kb3duZ3JhZGVkOworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBwaHlfaW5mby0+ZXh0ZW5kZWRfMTBidF9kaXN0YW5jZSA9CisgICAgICAgICgocGh5X2RhdGEgJiBNODhFMTAwMF9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFKSA+PgorICAgICAgICBNODhFMTAwMF9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFX1NISUZUKSA/CisgICAgICAgIGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX2xvd2VyIDogZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbm9ybWFsOworCisgICAgcGh5X2luZm8tPnBvbGFyaXR5X2NvcnJlY3Rpb24gPQorICAgICAgICAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTCkgPj4KKyAgICAgICAgTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTF9TSElGVCkgPworICAgICAgICBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF9kaXNhYmxlZCA6IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2VuYWJsZWQ7CisKKyAgICAvKiBDaGVjayBwb2xhcml0eSBzdGF0dXMgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfY2hlY2tfcG9sYXJpdHkoaHcsICZwb2xhcml0eSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIHBoeV9pbmZvLT5jYWJsZV9wb2xhcml0eSA9IHBvbGFyaXR5OworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHBoeV9pbmZvLT5tZGl4X21vZGUgPSAoZTEwMDBfYXV0b194X21vZGUpKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfTURJWCkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfUFNTUl9NRElYX1NISUZUKTsKKworICAgIGlmICgocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwMDBNQlMpIHsKKyAgICAgICAgLyogQ2FibGUgTGVuZ3RoIEVzdGltYXRpb24gYW5kIExvY2FsL1JlbW90ZSBSZWNlaXZlciBJbmZvcm1hdGlvbgorICAgICAgICAgKiBhcmUgb25seSB2YWxpZCBhdCAxMDAwIE1icHMuCisgICAgICAgICAqLworICAgICAgICBpZiAoaHctPnBoeV90eXBlICE9IGUxMDAwX3BoeV9nZzgyNTYzKSB7CisgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gKGUxMDAwX2NhYmxlX2xlbmd0aCkoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEgpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIX1NISUZUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIEdHODI1NjNfUEhZX0RTUF9ESVNUQU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gKGUxMDAwX2NhYmxlX2xlbmd0aCkocGh5X2RhdGEgJiBHRzgyNTYzX0RTUERfQ0FCTEVfTEVOR1RIKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2luZm8tPmxvY2FsX3J4ID0gKChwaHlfZGF0YSAmIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVUykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTX1NISUZUKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1c19vayA6IGUxMDAwXzEwMDB0X3J4X3N0YXR1c19ub3Rfb2s7CisgICAgICAgIHBoeV9pbmZvLT5yZW1vdGVfcnggPSAoKHBoeV9kYXRhICYgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVUykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVNfU0hJRlQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1c19vayA6IGUxMDAwXzEwMDB0X3J4X3N0YXR1c19ub3Rfb2s7CisKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBHZXQgUEhZIGluZm9ybWF0aW9uIGZyb20gdmFyaW91cyBQSFkgcmVnaXN0ZXJzCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHBoeV9pbmZvIC0gUEhZIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcGh5X2dldF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHlfaW5mbykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9nZXRfaW5mbyIpOworCisgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF91bmRlZmluZWQ7CisgICAgcGh5X2luZm8tPmV4dGVuZGVkXzEwYnRfZGlzdGFuY2UgPSBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV91bmRlZmluZWQ7CisgICAgcGh5X2luZm8tPmNhYmxlX3BvbGFyaXR5ID0gZTEwMDBfcmV2X3BvbGFyaXR5X3VuZGVmaW5lZDsKKyAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gZTEwMDBfZG93bnNoaWZ0X3VuZGVmaW5lZDsKKyAgICBwaHlfaW5mby0+cG9sYXJpdHlfY29ycmVjdGlvbiA9IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3VuZGVmaW5lZDsKKyAgICBwaHlfaW5mby0+bWRpeF9tb2RlID0gZTEwMDBfYXV0b194X21vZGVfdW5kZWZpbmVkOworICAgIHBoeV9pbmZvLT5sb2NhbF9yeCA9IGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQ7CisgICAgcGh5X2luZm8tPnJlbW90ZV9yeCA9IGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQ7CisKKyAgICBpZiAoaHctPm1lZGlhX3R5cGUgIT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKyAgICAgICAgREVCVUdPVVQoIlBIWSBpbmZvIGlzIG9ubHkgdmFsaWQgZm9yIGNvcHBlciBtZWRpYVxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKyAgICB9CisKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgaWYgKChwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgIT0gTUlJX1NSX0xJTktfU1RBVFVTKSB7CisgICAgICAgIERFQlVHT1VUKCJQSFkgaW5mbyBpcyBvbmx5IHZhbGlkIGlmIGxpbmsgaXMgdXBcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisgICAgfQorCisgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8CisgICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzMgfHwKKyAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMikKKyAgICAgICAgcmV0dXJuIGUxMDAwX3BoeV9pZ3BfZ2V0X2luZm8oaHcsIHBoeV9pbmZvKTsKKyAgICBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lmZSkKKyAgICAgICAgcmV0dXJuIGUxMDAwX3BoeV9pZmVfZ2V0X2luZm8oaHcsIHBoeV9pbmZvKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBlMTAwMF9waHlfbTg4X2dldF9pbmZvKGh3LCBwaHlfaW5mbyk7Cit9CisKK2ludDMyX3QKK2UxMDAwX3ZhbGlkYXRlX21kaV9zZXR0aW5nKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgREVCVUdGVU5DKCJlMTAwMF92YWxpZGF0ZV9tZGlfc2V0dGluZ3MiKTsKKworICAgIGlmICghaHctPmF1dG9uZWcgJiYgKGh3LT5tZGl4ID09IDAgfHwgaHctPm1kaXggPT0gMykpIHsKKyAgICAgICAgREVCVUdPVVQoIkludmFsaWQgTURJIHNldHRpbmcgZGV0ZWN0ZWRcbiIpOworICAgICAgICBody0+bWRpeCA9IDE7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0cyB1cCBlZXByb20gdmFyaWFibGVzIGluIHRoZSBodyBzdHJ1Y3QuICBNdXN0IGJlIGNhbGxlZCBhZnRlciBtYWNfdHlwZQorICogaXMgY29uZmlndXJlZC4gIEFkZGl0aW9uYWxseSwgaWYgdGhpcyBpcyBJQ0g4LCB0aGUgZmxhc2ggY29udHJvbGxlciBHYkUKKyAqIHJlZ2lzdGVycyBtdXN0IGJlIG1hcHBlZCwgb3IgdGhpcyB3aWxsIGNyYXNoLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQzMl90IGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisgICAgaW50MzJfdCByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKyAgICB1aW50MTZfdCBlZXByb21fc2l6ZTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zIik7CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgIGNhc2UgZTEwMDBfODI1NDM6CisgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKyAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKyAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CisgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKyAgICAgICAgZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisgICAgICAgIGVlcHJvbS0+dXNlX2VlcmQgPSBGQUxTRTsKKyAgICAgICAgZWVwcm9tLT51c2VfZWV3ciA9IEZBTFNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTQwOgorICAgIGNhc2UgZTEwMDBfODI1NDU6CisgICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKyAgICBjYXNlIGUxMDAwXzgyNTQ2OgorICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9taWNyb3dpcmU7CisgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMgPSAzOworICAgICAgICBlZXByb20tPmRlbGF5X3VzZWMgPSA1MDsKKyAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX1NJWkUpIHsKKyAgICAgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gMjU2OworICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKyAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKyAgICAgICAgfQorICAgICAgICBlZXByb20tPnVzZV9lZXJkID0gRkFMU0U7CisgICAgICAgIGVlcHJvbS0+dXNlX2Vld3IgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorICAgIGNhc2UgZTEwMDBfODI1NDc6CisgICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKyAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX1RZUEUpIHsKKyAgICAgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9zcGk7CisgICAgICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzID0gODsKKyAgICAgICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDE7CisgICAgICAgICAgICBpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisgICAgICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSAzMjsKKyAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlZXByb20tPnBhZ2Vfc2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKyAgICAgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMgPSAzOworICAgICAgICAgICAgZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisgICAgICAgICAgICBpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSAyNTY7CisgICAgICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDY0OworICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlZXByb20tPnVzZV9lZXJkID0gRkFMU0U7CisgICAgICAgIGVlcHJvbS0+dXNlX2Vld3IgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU3MToKKyAgICBjYXNlIGUxMDAwXzgyNTcyOgorICAgICAgICBlZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fc3BpOworICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzID0gODsKKyAgICAgICAgZWVwcm9tLT5kZWxheV91c2VjID0gMTsKKyAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0FERFJfQklUUykgeworICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSAzMjsKKyAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gMTY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlZXByb20tPnBhZ2Vfc2l6ZSA9IDg7CisgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDg7CisgICAgICAgIH0KKyAgICAgICAgZWVwcm9tLT51c2VfZWVyZCA9IEZBTFNFOworICAgICAgICBlZXByb20tPnVzZV9lZXdyID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9zcGk7CisgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMgPSA4OworICAgICAgICBlZXByb20tPmRlbGF5X3VzZWMgPSAxOworICAgICAgICBpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisgICAgICAgICAgICBlZXByb20tPnBhZ2Vfc2l6ZSA9IDMyOworICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSAxNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVlcHJvbS0+cGFnZV9zaXplID0gODsKKyAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKyAgICAgICAgfQorICAgICAgICBlZXByb20tPnVzZV9lZXJkID0gVFJVRTsKKyAgICAgICAgZWVwcm9tLT51c2VfZWV3ciA9IFRSVUU7CisgICAgICAgIGlmIChlMTAwMF9pc19vbmJvYXJkX252bV9lZXByb20oaHcpID09IEZBTFNFKSB7CisgICAgICAgICAgICBlZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fZmxhc2g7CisgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDIwNDg7CisKKyAgICAgICAgICAgIC8qIEVuc3VyZSB0aGF0IHRoZSBBdXRvbm9tb3VzIEZMQVNIIHVwZGF0ZSBiaXQgaXMgY2xlYXJlZCBkdWUgdG8KKyAgICAgICAgICAgICAqIEZsYXNoIHVwZGF0ZSBpc3N1ZSBvbiBwYXJ0cyB3aGljaCB1c2UgYSBGTEFTSCBmb3IgTlZNLiAqLworICAgICAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9BVVBERU47CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46CisgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9zcGk7CisgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMgPSA4OworICAgICAgICBlZXByb20tPmRlbGF5X3VzZWMgPSAxOworICAgICAgICBpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisgICAgICAgICAgICBlZXByb20tPnBhZ2Vfc2l6ZSA9IDMyOworICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSAxNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVlcHJvbS0+cGFnZV9zaXplID0gODsKKyAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKyAgICAgICAgfQorICAgICAgICBlZXByb20tPnVzZV9lZXJkID0gVFJVRTsKKyAgICAgICAgZWVwcm9tLT51c2VfZWV3ciA9IEZBTFNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwX2ljaDhsYW46CisgICAgICAgIHsKKyAgICAgICAgaW50MzJfdCAgaSA9IDA7CisgICAgICAgIHVpbnQzMl90IGZsYXNoX3NpemUgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcoaHcsIElDSF9GTEFTSF9HRlBSRUcpOworCisgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9pY2g4OworICAgICAgICBlZXByb20tPnVzZV9lZXJkID0gRkFMU0U7CisgICAgICAgIGVlcHJvbS0+dXNlX2Vld3IgPSBGQUxTRTsKKyAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSBFMTAwMF9TSEFET1dfUkFNX1dPUkRTOworCisgICAgICAgIC8qIFplcm8gdGhlIHNoYWRvdyBSQU0gc3RydWN0dXJlLiBCdXQgZG9uJ3QgbG9hZCBpdCBmcm9tIE5WTQorICAgICAgICAgKiBzbyBhcyB0byBzYXZlIHRpbWUgZm9yIGRyaXZlciBpbml0ICovCisgICAgICAgIGlmIChody0+ZWVwcm9tX3NoYWRvd19yYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEUxMDAwX1NIQURPV19SQU1fV09SRFM7IGkrKykgeworICAgICAgICAgICAgICAgIGh3LT5lZXByb21fc2hhZG93X3JhbVtpXS5tb2RpZmllZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGh3LT5lZXByb21fc2hhZG93X3JhbVtpXS5lZXByb21fd29yZCA9IDB4RkZGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGh3LT5mbGFzaF9iYXNlX2FkZHIgPSAoZmxhc2hfc2l6ZSAmIElDSF9HRlBSRUdfQkFTRV9NQVNLKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ0hfRkxBU0hfU0VDVE9SX1NJWkU7CisKKyAgICAgICAgaHctPmZsYXNoX2Jhbmtfc2l6ZSA9ICgoZmxhc2hfc2l6ZSA+PiAxNikgJiBJQ0hfR0ZQUkVHX0JBU0VfTUFTSykgKyAxOworICAgICAgICBody0+Zmxhc2hfYmFua19zaXplIC09IChmbGFzaF9zaXplICYgSUNIX0dGUFJFR19CQVNFX01BU0spOworCisgICAgICAgIGh3LT5mbGFzaF9iYW5rX3NpemUgKj0gSUNIX0ZMQVNIX1NFQ1RPUl9TSVpFOworCisgICAgICAgIGh3LT5mbGFzaF9iYW5rX3NpemUgLz0gMiAqIHNpemVvZih1aW50MTZfdCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIGUxMDAwXzgyNTc2OgorICAgICAgICB7CisgICAgICAgIHVpbnQxNl90IHNpemU7CisKKyAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX3NwaTsKKyAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDg7CisgICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDE7CisgICAgICAgIGlmIChlZWNkICYgRTEwMDBfRUVDRF9BRERSX0JJVFMpIHsKKyAgICAgICAgICAgIGVlcHJvbS0+cGFnZV9zaXplID0gMzI7CisgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSA4OworICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworICAgICAgICB9CisgICAgICAgIGVlcHJvbS0+dXNlX2VlcmQgPSBUUlVFOworICAgICAgICBlZXByb20tPnVzZV9lZXdyID0gRkFMU0U7CisKKyAgICAgICAgc2l6ZSA9ICh1aW50MTZfdCkoKGVlY2QgJiBFMTAwMF9FRUNEX1NJWkVfRVhfTUFTSykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfRUVDRF9TSVpFX0VYX1NISUZUKTsKKwkvKgorCSAqIEFkZGVkIHRvIGEgY29uc3RhbnQsICJzaXplIiBiZWNvbWVzIHRoZSBsZWZ0LXNoaWZ0IHZhbHVlCisJICogZm9yIHNldHRpbmcgd29yZF9zaXplLgorCSAqLworCXNpemUgKz0gRUVQUk9NX1dPUkRfU0laRV9TSElGVDsKKworCS8qIEVFUFJPTSBhY2Nlc3MgYWJvdmUgMTZrIGlzIHVuc3VwcG9ydGVkICovCisJaWYgKHNpemUgPiAxNCkKKwkJc2l6ZSA9IDE0OworCWVlcHJvbS0+d29yZF9zaXplID0gMSA8PCBzaXplOworCisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisgICAgICAgIC8qIGVlcHJvbV9zaXplIHdpbGwgYmUgYW4gZW51bSBbMC4uOF0gdGhhdCBtYXBzIHRvIGVlcHJvbSBzaXplcyAxMjhCIHRvCisgICAgICAgICAqIDMyS0IgKGluY3JlbWVudGVkIGJ5IHBvd2VycyBvZiAyKS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIpIHsKKyAgICAgICAgICAgIC8qIFNldCB0byBkZWZhdWx0IHZhbHVlIGZvciBpbml0aWFsIGVlcHJvbSByZWFkLiAqLworICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0NGRywgMSwgJmVlcHJvbV9zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgZWVwcm9tX3NpemUgPSAoZWVwcm9tX3NpemUgJiBFRVBST01fU0laRV9NQVNLKSA+PiBFRVBST01fU0laRV9TSElGVDsKKyAgICAgICAgICAgIC8qIDI1NkIgZWVwcm9tIHNpemUgd2FzIG5vdCBzdXBwb3J0ZWQgaW4gZWFybGllciBoYXJkd2FyZSwgc28gd2UKKyAgICAgICAgICAgICAqIGJ1bXAgZWVwcm9tX3NpemUgdXAgb25lIHRvIGVuc3VyZSB0aGF0ICIxIiAod2hpY2ggbWFwcyB0byAyNTZCKQorICAgICAgICAgICAgICogaXMgbmV2ZXIgdGhlIHJlc3VsdCB1c2VkIGluIHRoZSBzaGlmdGluZyBsb2dpYyBiZWxvdy4gKi8KKyAgICAgICAgICAgIGlmIChlZXByb21fc2l6ZSkKKyAgICAgICAgICAgICAgICBlZXByb21fc2l6ZSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWVwcm9tX3NpemUgPSAodWludDE2X3QpKChlZWNkICYgRTEwMDBfRUVDRF9TSVpFX0VYX01BU0spID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0VFQ0RfU0laRV9FWF9TSElGVCk7CisgICAgICAgIH0KKworICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDEgPDwgKGVlcHJvbV9zaXplICsgRUVQUk9NX1dPUkRfU0laRV9TSElGVCk7CisgICAgfQorICAgIHJldHVybiByZXRfdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWlzZXMgdGhlIEVFUFJPTSdzIGNsb2NrIGlucHV0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBlZWNkIC0gRUVDRCdzIGN1cnJlbnQgdmFsdWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9yYWlzZV9lZV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZWVjZCkKK3sKKyAgICAvKiBSYWlzZSB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIEVFUFJPTSAoYnkgc2V0dGluZyB0aGUgU0sgYml0KSwgYW5kIHRoZW4KKyAgICAgKiB3YWl0IDxkZWxheT4gbWljcm9zZWNvbmRzLgorICAgICAqLworICAgICplZWNkID0gKmVlY2QgfCBFMTAwMF9FRUNEX1NLOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgKmVlY2QpOworICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICB1ZGVsYXkoaHctPmVlcHJvbS5kZWxheV91c2VjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG93ZXJzIHRoZSBFRVBST00ncyBjbG9jayBpbnB1dC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogZWVjZCAtIEVFQ0QncyBjdXJyZW50IHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfbG93ZXJfZWVfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVlY2QpCit7CisgICAgLyogTG93ZXIgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00gKGJ5IGNsZWFyaW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbgorICAgICAqIHdhaXQgNTAgbWljcm9zZWNvbmRzLgorICAgICAqLworICAgICplZWNkID0gKmVlY2QgJiB+RTEwMDBfRUVDRF9TSzsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsICplZWNkKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNoaWZ0IGRhdGEgYml0cyBvdXQgdG8gdGhlIEVFUFJPTS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogZGF0YSAtIGRhdGEgdG8gc2VuZCB0byB0aGUgRUVQUk9NCisgKiBjb3VudCAtIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IG91dAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3NoaWZ0X291dF9lZV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnQpCit7CisgICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKyAgICB1aW50MzJfdCBlZWNkOworICAgIHVpbnQzMl90IG1hc2s7CisKKyAgICAvKiBXZSBuZWVkIHRvIHNoaWZ0ICJjb3VudCIgYml0cyBvdXQgdG8gdGhlIEVFUFJPTS4gU28sIHZhbHVlIGluIHRoZQorICAgICAqICJkYXRhIiBwYXJhbWV0ZXIgd2lsbCBiZSBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIG9uZSBiaXQgYXQgYSB0aW1lLgorICAgICAqIEluIG9yZGVyIHRvIGRvIHRoaXMsICJkYXRhIiBtdXN0IGJlIGJyb2tlbiBkb3duIGludG8gYml0cy4KKyAgICAgKi8KKyAgICBtYXNrID0gMHgwMSA8PCAoY291bnQgLSAxKTsKKyAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX0RPOworICAgIH0gZWxzZSBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKyAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0RPOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIC8qIEEgIjEiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00gYnkgc2V0dGluZyBiaXQgIkRJIiB0byBhICIxIiwKKyAgICAgICAgICogYW5kIHRoZW4gcmFpc2luZyBhbmQgdGhlbiBsb3dlcmluZyB0aGUgY2xvY2sgKHRoZSBTSyBiaXQgY29udHJvbHMKKyAgICAgICAgICogdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00pLiAgQSAiMCIgaXMgc2hpZnRlZCBvdXQgdG8gdGhlIEVFUFJPTQorICAgICAgICAgKiBieSBzZXR0aW5nICJESSIgdG8gIjAiIGFuZCB0aGVuIHJhaXNpbmcgYW5kIHRoZW4gbG93ZXJpbmcgdGhlIGNsb2NrLgorICAgICAgICAgKi8KKyAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9ESTsKKworICAgICAgICBpZiAoZGF0YSAmIG1hc2spCisgICAgICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfREk7CisKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCisgICAgICAgIHVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCisgICAgICAgIGUxMDAwX3JhaXNlX2VlX2NsayhodywgJmVlY2QpOworICAgICAgICBlMTAwMF9sb3dlcl9lZV9jbGsoaHcsICZlZWNkKTsKKworICAgICAgICBtYXNrID0gbWFzayA+PiAxOworCisgICAgfSB3aGlsZSAobWFzayk7CisKKyAgICAvKiBXZSBsZWF2ZSB0aGUgIkRJIiBiaXQgc2V0IHRvICIwIiB3aGVuIHdlIGxlYXZlIHRoaXMgcm91dGluZS4gKi8KKyAgICBlZWNkICY9IH5FMTAwMF9FRUNEX0RJOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNoaWZ0IGRhdGEgYml0cyBpbiBmcm9tIHRoZSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQxNl90CitlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KQoreworICAgIHVpbnQzMl90IGVlY2Q7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MTZfdCBkYXRhOworCisgICAgLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIEVFUFJPTSwgd2UgbmVlZCB0byBzaGlmdCAnY291bnQnCisgICAgICogYml0cyBpbiBmcm9tIHRoZSBFRVBST00uIEJpdHMgYXJlICJzaGlmdGVkIGluIiBieSByYWlzaW5nIHRoZSBjbG9jaworICAgICAqIGlucHV0IHRvIHRoZSBFRVBST00gKHNldHRpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuIHJlYWRpbmcgdGhlIHZhbHVlIG9mCisgICAgICogdGhlICJETyIgYml0LiAgRHVyaW5nIHRoaXMgInNoaWZ0aW5nIGluIiBwcm9jZXNzIHRoZSAiREkiIGJpdCBzaG91bGQKKyAgICAgKiBhbHdheXMgYmUgY2xlYXIuCisgICAgICovCisKKyAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfRE8gfCBFMTAwMF9FRUNEX0RJKTsKKyAgICBkYXRhID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGRhdGEgPSBkYXRhIDw8IDE7CisgICAgICAgIGUxMDAwX3JhaXNlX2VlX2NsayhodywgJmVlY2QpOworCisgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisKKyAgICAgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfREkpOworICAgICAgICBpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfRE8pCisgICAgICAgICAgICBkYXRhIHw9IDE7CisKKyAgICAgICAgZTEwMDBfbG93ZXJfZWVfY2xrKGh3LCAmZWVjZCk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByZXBhcmVzIEVFUFJPTSBmb3IgYWNjZXNzCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBMb3dlcnMgRUVQUk9NIGNsb2NrLiBDbGVhcnMgaW5wdXQgcGluLiBTZXRzIHRoZSBjaGlwIHNlbGVjdCBwaW4uIFRoaXMKKyAqIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGlzc3VpbmcgYSBjb21tYW5kIHRvIHRoZSBFRVBST00uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfYWNxdWlyZV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQzMl90IGVlY2QsIGk9MDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfYWNxdWlyZV9lZXByb20iKTsKKworICAgIGlmIChlMTAwMF9zd2Z3X3N5bmNfYWNxdWlyZShodywgRTEwMDBfU1dGV19FRVBfU00pKQorICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9TV0ZXX1NZTkM7CisgICAgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NzMpIHsKKyAgICAgICAgLyogUmVxdWVzdCBFRVBST00gQWNjZXNzICovCisgICAgICAgIGlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0NCkgeworICAgICAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX1JFUTsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgICAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworICAgICAgICAgICAgd2hpbGUgKCghKGVlY2QgJiBFMTAwMF9FRUNEX0dOVCkpICYmCisgICAgICAgICAgICAgICAgICAoaSA8IEUxMDAwX0VFUFJPTV9HUkFOVF9BVFRFTVBUUykpIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgdWRlbGF5KDUpOworICAgICAgICAgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShlZWNkICYgRTEwMDBfRUVDRF9HTlQpKSB7CisgICAgICAgICAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9SRVE7CisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiQ291bGQgbm90IGFjcXVpcmUgRUVQUk9NIGdyYW50XG4iKTsKKyAgICAgICAgICAgICAgICBlMTAwMF9zd2Z3X3N5bmNfcmVsZWFzZShodywgRTEwMDBfU1dGV19FRVBfU00pOworICAgICAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNldHVwIEVFUFJPTSBmb3IgUmVhZC9Xcml0ZSAqLworCisgICAgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisgICAgICAgIC8qIENsZWFyIFNLIGFuZCBESSAqLworICAgICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9ESSB8IEUxMDAwX0VFQ0RfU0spOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCisgICAgICAgIC8qIFNldCBDUyAqLworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfQ1M7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgfSBlbHNlIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworICAgICAgICAvKiBDbGVhciBTSyBhbmQgQ1MgKi8KKyAgICAgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfQ1MgfCBFMTAwMF9FRUNEX1NLKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgdWRlbGF5KDEpOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXR1cm5zIEVFUFJPTSB0byBhICJzdGFuZGJ5IiBzdGF0ZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfc3RhbmRieV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQzMl90IGVlY2Q7CisKKyAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisgICAgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisgICAgICAgIGVlY2QgJj0gfihFMTAwMF9FRUNEX0NTIHwgRTEwMDBfRUVDRF9TSyk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisKKyAgICAgICAgLyogQ2xvY2sgaGlnaCAqLworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfU0s7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisKKyAgICAgICAgLyogU2VsZWN0IEVFUFJPTSAqLworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfQ1M7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisKKyAgICAgICAgLyogQ2xvY2sgbG93ICovCisgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisgICAgfSBlbHNlIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworICAgICAgICAvKiBUb2dnbGUgQ1MgdG8gZmx1c2ggY29tbWFuZHMgKi8KKyAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIHVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX0NTOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIHVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVybWluYXRlcyBhIGNvbW1hbmQgYnkgaW52ZXJ0aW5nIHRoZSBFRVBST00ncyBjaGlwIHNlbGVjdCBwaW4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3JlbGVhc2VfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgZWVjZDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcmVsZWFzZV9lZXByb20iKTsKKworICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisKKyAgICBpZiAoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKyAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0NTOyAgLyogUHVsbCBDUyBoaWdoICovCisgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7IC8qIExvd2VyIFNDSyAqLworCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisKKyAgICAgICAgdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisgICAgfSBlbHNlIGlmIChody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworICAgICAgICAvKiBjbGVhbnVwIGVlcHJvbSAqLworCisgICAgICAgIC8qIENTIG9uIE1pY3Jvd2lyZSBpcyBhY3RpdmUtaGlnaCAqLworICAgICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9DUyB8IEUxMDAwX0VFQ0RfREkpOworCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisKKyAgICAgICAgLyogUmlzaW5nIGVkZ2Ugb2YgY2xvY2sgKi8KKyAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX1NLOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIHVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworCisgICAgICAgIC8qIEZhbGxpbmcgZWRnZSBvZiBjbG9jayAqLworICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX1NLOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIHVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworICAgIH0KKworICAgIC8qIFN0b3AgcmVxdWVzdGluZyBFRVBST00gYWNjZXNzICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CisgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfUkVROworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgIH0KKworICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBFMTAwMF9TV0ZXX0VFUF9TTSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfc3BpX2VlcHJvbV9yZWFkeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQxNl90IHJldHJ5X2NvdW50ID0gMDsKKyAgICB1aW50OF90IHNwaV9zdGF0X3JlZzsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc3BpX2VlcHJvbV9yZWFkeSIpOworCisgICAgLyogUmVhZCAiU3RhdHVzIFJlZ2lzdGVyIiByZXBlYXRlZGx5IHVudGlsIHRoZSBMU0IgaXMgY2xlYXJlZC4gIFRoZQorICAgICAqIEVFUFJPTSB3aWxsIHNpZ25hbCB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSBjbGVhcmluZworICAgICAqIGJpdCAwIG9mIHRoZSBpbnRlcm5hbCBzdGF0dXMgcmVnaXN0ZXIuICBJZiBpdCdzIG5vdCBjbGVhcmVkIHdpdGhpbgorICAgICAqIDUgbWlsbGlzZWNvbmRzLCB0aGVuIGVycm9yIG91dC4KKyAgICAgKi8KKyAgICByZXRyeV9jb3VudCA9IDA7CisgICAgZG8geworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1JEU1JfT1BDT0RFX1NQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHctPmVlcHJvbS5vcGNvZGVfYml0cyk7CisgICAgICAgIHNwaV9zdGF0X3JlZyA9ICh1aW50OF90KWUxMDAwX3NoaWZ0X2luX2VlX2JpdHMoaHcsIDgpOworICAgICAgICBpZiAoIShzcGlfc3RhdF9yZWcgJiBFRVBST01fU1RBVFVTX1JEWV9TUEkpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgdWRlbGF5KDUpOworICAgICAgICByZXRyeV9jb3VudCArPSA1OworCisgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKyAgICB9IHdoaWxlIChyZXRyeV9jb3VudCA8IEVFUFJPTV9NQVhfUkVUUllfU1BJKTsKKworICAgIC8qIEFUTUVMIFNQSSB3cml0ZSB0aW1lIGNvdWxkIHZhcnkgZnJvbSAwLTIwbVNlYyBvbiAzLjNWIGRldmljZXMgKGFuZAorICAgICAqIG9ubHkgMC01bVNlYyBvbiA1ViBkZXZpY2VzKQorICAgICAqLworICAgIGlmIChyZXRyeV9jb3VudCA+PSBFRVBST01fTUFYX1JFVFJZX1NQSSkgeworICAgICAgICBERUJVR09VVCgiU1BJIEVFUFJPTSBTdGF0dXMgZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBvZmZzZXQgb2YgIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCisgKiBkYXRhIC0gd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQorICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRhdGEpCit7CisgICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKyAgICB1aW50MzJfdCBpID0gMDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcmVhZF9lZXByb20iKTsKKworICAgIC8qIElmIGVlcHJvbSBpcyBub3QgeWV0IGRldGVjdGVkLCBkbyBzbyBub3cgKi8KKyAgICBpZiAoZWVwcm9tLT53b3JkX3NpemUgPT0gMCkKKyAgICAgICAgZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zKGh3KTsKKworICAgIC8qIEEgY2hlY2sgZm9yIGludmFsaWQgdmFsdWVzOiAgb2Zmc2V0IHRvbyBsYXJnZSwgdG9vIG1hbnkgd29yZHMsIGFuZCBub3QKKyAgICAgKiBlbm91Z2ggd29yZHMuCisgICAgICovCisgICAgaWYgKChvZmZzZXQgPj0gZWVwcm9tLT53b3JkX3NpemUpIHx8ICh3b3JkcyA+IGVlcHJvbS0+d29yZF9zaXplIC0gb2Zmc2V0KSB8fAorICAgICAgICh3b3JkcyA9PSAwKSkgeworICAgICAgICBERUJVR09VVDIoIlwid29yZHNcIiBwYXJhbWV0ZXIgb3V0IG9mIGJvdW5kcy4gV29yZHMgPSAlZCwgc2l6ZSA9ICVkXG4iLCBvZmZzZXQsIGVlcHJvbS0+d29yZF9zaXplKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKworICAgIC8qIEVFUFJPTSdzIHRoYXQgZG9uJ3QgdXNlIEVFUkQgdG8gcmVhZCByZXF1aXJlIHVzIHRvIGJpdC1iYW5nIHRoZSBTUEkKKyAgICAgKiBkaXJlY3RseS4gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGFjcXVpcmUgdGhlIEVFUFJPTSBzbyB0aGF0CisgICAgICogRlcgb3Igb3RoZXIgcG9ydCBzb2Z0d2FyZSBkb2VzIG5vdCBpbnRlcnJ1cHQuCisgICAgICovCisgICAgaWYgKGh3LT5lZXByb20udXNlX2VlcmQgPT0gRkFMU0UgJiYgZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tKGh3KSkgeworICAgICAgICAvKiBQcmVwYXJlIHRoZSBFRVBST00gZm9yIGJpdC1iYW5nIHJlYWRpbmcgKi8KKyAgICAgICAgaWYgKGUxMDAwX2FjcXVpcmVfZWVwcm9tKGh3KSAhPSBFMTAwMF9TVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKworICAgIC8qIEVlcmQgcmVnaXN0ZXIgRUVQUk9NIGFjY2VzcyByZXF1aXJlcyBubyBlZXByb20gYXF1aXJlL3JlbGVhc2UgKi8KKyAgICBpZiAoZWVwcm9tLT51c2VfZWVyZCA9PSBUUlVFKQorICAgICAgICByZXR1cm4gZTEwMDBfcmVhZF9lZXByb21fZWVyZChodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisKKyAgICAvKiBJQ0ggRUVQUk9NIGFjY2VzcyBpcyBkb25lIHZpYSB0aGUgSUNIIGZsYXNoIGNvbnRyb2xsZXIgKi8KKyAgICBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9pY2g4KQorICAgICAgICByZXR1cm4gZTEwMDBfcmVhZF9lZXByb21faWNoOChodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisKKyAgICAvKiBTZXQgdXAgdGhlIFNQSSBvciBNaWNyb3dpcmUgRUVQUk9NIGZvciBiaXQtYmFuZyByZWFkaW5nLiAgV2UgaGF2ZQorICAgICAqIGFjcXVpcmVkIHRoZSBFRVBST00gYXQgdGhpcyBwb2ludCwgc28gYW55IHJldHVybnMgc2hvdWxkIHJlbGFzZSBpdCAqLworICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworICAgICAgICB1aW50MTZfdCB3b3JkX2luOworICAgICAgICB1aW50OF90IHJlYWRfb3Bjb2RlID0gRUVQUk9NX1JFQURfT1BDT0RFX1NQSTsKKworICAgICAgICBpZiAoZTEwMDBfc3BpX2VlcHJvbV9yZWFkeShodykpIHsKKyAgICAgICAgICAgIGUxMDAwX3JlbGVhc2VfZWVwcm9tKGh3KTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgfQorCisgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKworICAgICAgICAvKiBTb21lIFNQSSBlZXByb21zIHVzZSB0aGUgOHRoIGFkZHJlc3MgYml0IGVtYmVkZGVkIGluIHRoZSBvcGNvZGUgKi8KKyAgICAgICAgaWYgKChlZXByb20tPmFkZHJlc3NfYml0cyA9PSA4KSAmJiAob2Zmc2V0ID49IDEyOCkpCisgICAgICAgICAgICByZWFkX29wY29kZSB8PSBFRVBST01fQThfT1BDT0RFX1NQSTsKKworICAgICAgICAvKiBTZW5kIHRoZSBSRUFEIGNvbW1hbmQgKG9wY29kZSArIGFkZHIpICAqLworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgcmVhZF9vcGNvZGUsIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHVpbnQxNl90KShvZmZzZXQqMiksIGVlcHJvbS0+YWRkcmVzc19iaXRzKTsKKworICAgICAgICAvKiBSZWFkIHRoZSBkYXRhLiAgVGhlIGFkZHJlc3Mgb2YgdGhlIGVlcHJvbSBpbnRlcm5hbGx5IGluY3JlbWVudHMgd2l0aAorICAgICAgICAgKiBlYWNoIGJ5dGUgKHNwaSkgYmVpbmcgcmVhZCwgc2F2aW5nIG9uIHRoZSBvdmVyaGVhZCBvZiBlZXByb20gc2V0dXAKKyAgICAgICAgICogYW5kIHRlYXItZG93bi4gIFRoZSBhZGRyZXNzIGNvdW50ZXIgd2lsbCByb2xsIG92ZXIgaWYgcmVhZGluZyBiZXlvbmQKKyAgICAgICAgICogdGhlIHNpemUgb2YgdGhlIGVlcHJvbSwgdGh1cyBhbGxvd2luZyB0aGUgZW50aXJlIG1lbW9yeSB0byBiZSByZWFkCisgICAgICAgICAqIHN0YXJ0aW5nIGZyb20gYW55IG9mZnNldC4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHdvcmRfaW4gPSBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCAxNik7CisgICAgICAgICAgICBkYXRhW2ldID0gKHdvcmRfaW4gPj4gOCkgfCAod29yZF9pbiA8PCA4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIC8qIFNlbmQgdGhlIFJFQUQgY29tbWFuZCAob3Bjb2RlICsgYWRkcikgICovCisgICAgICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1JFQURfT1BDT0RFX01JQ1JPV0lSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworICAgICAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1aW50MTZfdCkob2Zmc2V0ICsgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyk7CisKKyAgICAgICAgICAgIC8qIFJlYWQgdGhlIGRhdGEuICBGb3IgbWljcm93aXJlLCBlYWNoIHdvcmQgcmVxdWlyZXMgdGhlIG92ZXJoZWFkCisgICAgICAgICAgICAgKiBvZiBlZXByb20gc2V0dXAgYW5kIHRlYXItZG93bi4gKi8KKyAgICAgICAgICAgIGRhdGFbaV0gPSBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCAxNik7CisgICAgICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFbmQgdGhpcyByZWFkIG9wZXJhdGlvbiAqLworICAgIGUxMDAwX3JlbGVhc2VfZWVwcm9tKGh3KTsKKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkcyBhIDE2IGJpdCB3b3JkIGZyb20gdGhlIEVFUFJPTSB1c2luZyB0aGUgRUVSRCByZWdpc3Rlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogb2Zmc2V0IC0gb2Zmc2V0IG9mICB3b3JkIGluIHRoZSBFRVBST00gdG8gcmVhZAorICogZGF0YSAtIHdvcmQgcmVhZCBmcm9tIHRoZSBFRVBST00KKyAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9yZWFkX2VlcHJvbV9lZXJkKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3b3JkcywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworICAgIHVpbnQzMl90IGksIGVlcmQgPSAwOworICAgIGludDMyX3QgZXJyb3IgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKKyAgICAgICAgZWVyZCA9ICgob2Zmc2V0K2kpIDw8IEUxMDAwX0VFUFJPTV9SV19BRERSX1NISUZUKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfRUVQUk9NX1JXX1JFR19TVEFSVDsKKworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFUkQsIGVlcmQpOworICAgICAgICBlcnJvciA9IGUxMDAwX3BvbGxfZWVyZF9lZXdyX2RvbmUoaHcsIEUxMDAwX0VFUFJPTV9QT0xMX1JFQUQpOworCisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGF0YVtpXSA9IChFMTAwMF9SRUFEX1JFRyhodywgRUVSRCkgPj4gRTEwMDBfRUVQUk9NX1JXX1JFR19EQVRBKTsKKworICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NIHVzaW5nIHRoZSBFRVdSIHJlZ2lzdGVyLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBvZmZzZXQgb2YgIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCisgKiBkYXRhIC0gd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQorICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3dyaXRlX2VlcHJvbV9lZXdyKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworICAgIHVpbnQzMl90ICAgIHJlZ2lzdGVyX3ZhbHVlID0gMDsKKyAgICB1aW50MzJfdCAgICBpICAgICAgICAgICAgICA9IDA7CisgICAgaW50MzJfdCAgICAgZXJyb3IgICAgICAgICAgPSAwOworCisgICAgaWYgKGUxMDAwX3N3Zndfc3luY19hY3F1aXJlKGh3LCBFMTAwMF9TV0ZXX0VFUF9TTSkpCisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1NXRldfU1lOQzsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKSB7CisgICAgICAgIHJlZ2lzdGVyX3ZhbHVlID0gKGRhdGFbaV0gPDwgRTEwMDBfRUVQUk9NX1JXX1JFR19EQVRBKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKChvZmZzZXQraSkgPDwgRTEwMDBfRUVQUk9NX1JXX0FERFJfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9FRVBST01fUldfUkVHX1NUQVJUOworCisgICAgICAgIGVycm9yID0gZTEwMDBfcG9sbF9lZXJkX2Vld3JfZG9uZShodywgRTEwMDBfRUVQUk9NX1BPTExfV1JJVEUpOworICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRVdSLCByZWdpc3Rlcl92YWx1ZSk7CisKKyAgICAgICAgZXJyb3IgPSBlMTAwMF9wb2xsX2VlcmRfZWV3cl9kb25lKGh3LCBFMTAwMF9FRVBST01fUE9MTF9XUklURSk7CisKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBFMTAwMF9TV0ZXX0VFUF9TTSk7CisgICAgcmV0dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQb2xscyB0aGUgc3RhdHVzIGJpdCAoYml0IDEpIG9mIHRoZSBFRVJEIHRvIGRldGVybWluZSB3aGVuIHRoZSByZWFkIGlzIGRvbmUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9wb2xsX2VlcmRfZWV3cl9kb25lKHN0cnVjdCBlMTAwMF9odyAqaHcsIGludCBlZXJkKQoreworICAgIHVpbnQzMl90IGF0dGVtcHRzID0gMTAwMDAwOworICAgIHVpbnQzMl90IGksIHJlZyA9IDA7CisgICAgaW50MzJfdCBkb25lID0gRTEwMDBfRVJSX0VFUFJPTTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdHRlbXB0czsgaSsrKSB7CisgICAgICAgIGlmIChlZXJkID09IEUxMDAwX0VFUFJPTV9QT0xMX1JFQUQpCisgICAgICAgICAgICByZWcgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVSRCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlZyA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRVdSKTsKKworICAgICAgICBpZiAocmVnICYgRTEwMDBfRUVQUk9NX1JXX1JFR19ET05FKSB7CisgICAgICAgICAgICBkb25lID0gRTEwMDBfU1VDQ0VTUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVkZWxheSg1KTsKKyAgICB9CisKKyAgICByZXR1cm4gZG9uZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEZXNjcmlwdGlvbjogICAgIERldGVybWluZXMgaWYgdGhlIG9uYm9hcmQgTlZNIGlzIEZMQVNIIG9yIEVFUFJPTS4KKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbGVhbl90CitlMTAwMF9pc19vbmJvYXJkX252bV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBlZWNkID0gMDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tIik7CisKKyAgICBhc3NlcnQoaHctPm1hY190eXBlICE9IGUxMDAwXzgyNTc2KTsKKworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MykgeworICAgICAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisgICAgICAgIC8qIElzb2xhdGUgYml0cyAxNSAmIDE2ICovCisgICAgICAgIGVlY2QgPSAoKGVlY2QgPj4gMTUpICYgMHgwMyk7CisKKyAgICAgICAgLyogSWYgYm90aCBiaXRzIGFyZSBzZXQsIGRldmljZSBpcyBGbGFzaCB0eXBlICovCisgICAgICAgIGlmIChlZWNkID09IDB4MDMpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmVyaWZpZXMgdGhhdCB0aGUgRUVQUk9NIGhhcyBhIHZhbGlkIGNoZWNrc3VtCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZWFkcyB0aGUgZmlyc3QgNjQgMTYgYml0IHdvcmRzIG9mIHRoZSBFRVBST00gYW5kIHN1bXMgdGhlIHZhbHVlcyByZWFkLgorICogSWYgdGhlIHRoZSBzdW0gb2YgdGhlIDY0IDE2IGJpdCB3b3JkcyBpcyAweEJBQkEsIHRoZSBFRVBST00ncyBjaGVja3N1bSBpcworICogdmFsaWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MTZfdCBjaGVja3N1bSA9IDA7CisgICAgdWludDE2X3QgaSwgZWVwcm9tX2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bSIpOworCisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpICYmCisgICAgICAgIChlMTAwMF9pc19vbmJvYXJkX252bV9lZXByb20oaHcpID09IEZBTFNFKSkgeworICAgICAgICAvKiBDaGVjayBiaXQgNCBvZiB3b3JkIDEwaC4gIElmIGl0IGlzIDAsIGZpcm13YXJlIGlzIGRvbmUgdXBkYXRpbmcKKyAgICAgICAgICogMTBoLTEyaC4gIENoZWNrc3VtIG1heSBuZWVkIHRvIGJlIGZpeGVkLiAqLworICAgICAgICBlMTAwMF9yZWFkX2VlcHJvbShodywgMHgxMCwgMSwgJmVlcHJvbV9kYXRhKTsKKyAgICAgICAgaWYgKChlZXByb21fZGF0YSAmIDB4MTApID09IDApIHsKKyAgICAgICAgICAgIC8qIFJlYWQgMHgyMyBhbmQgY2hlY2sgYml0IDE1LiAgVGhpcyBiaXQgaXMgYSAxIHdoZW4gdGhlIGNoZWNrc3VtCisgICAgICAgICAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIGZpeGVkLiAgSWYgdGhlIGNoZWNrc3VtIGlzIHN0aWxsIHdyb25nIGFuZCB0aGlzCisgICAgICAgICAgICAgKiBiaXQgaXMgYSAxLCB3ZSBuZWVkIHRvIHJldHVybiBiYWQgY2hlY2tzdW0uICBPdGhlcndpc2UsIHdlIG5lZWQKKyAgICAgICAgICAgICAqIHRvIHNldCB0aGlzIGJpdCB0byBhIDEgYW5kIHVwZGF0ZSB0aGUgY2hlY2tzdW0uICovCisgICAgICAgICAgICBlMTAwMF9yZWFkX2VlcHJvbShodywgMHgyMywgMSwgJmVlcHJvbV9kYXRhKTsKKyAgICAgICAgICAgIGlmICgoZWVwcm9tX2RhdGEgJiAweDgwMDApID09IDApIHsKKyAgICAgICAgICAgICAgICBlZXByb21fZGF0YSB8PSAweDgwMDA7CisgICAgICAgICAgICAgICAgZTEwMDBfd3JpdGVfZWVwcm9tKGh3LCAweDIzLCAxLCAmZWVwcm9tX2RhdGEpOworICAgICAgICAgICAgICAgIGUxMDAwX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oaHcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7CisgICAgICAgIC8qIERyaXZlcnMgbXVzdCBhbGxvY2F0ZSB0aGUgc2hhZG93IHJhbSBzdHJ1Y3R1cmUgZm9yIHRoZQorICAgICAgICAgKiBFRVBST00gY2hlY2tzdW0gdG8gYmUgdXBkYXRlZC4gIE90aGVyd2lzZSwgdGhpcyBiaXQgYXMgd2VsbAorICAgICAgICAgKiBhcyB0aGUgY2hlY2tzdW0gbXVzdCBib3RoIGJlIHNldCBjb3JyZWN0bHkgZm9yIHRoaXMKKyAgICAgICAgICogdmFsaWRhdGlvbiB0byBwYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgZTEwMDBfcmVhZF9lZXByb20oaHcsIDB4MTksIDEsICZlZXByb21fZGF0YSk7CisgICAgICAgIGlmICgoZWVwcm9tX2RhdGEgJiAweDQwKSA9PSAwKSB7CisgICAgICAgICAgICBlZXByb21fZGF0YSB8PSAweDQwOworICAgICAgICAgICAgZTEwMDBfd3JpdGVfZWVwcm9tKGh3LCAweDE5LCAxLCAmZWVwcm9tX2RhdGEpOworICAgICAgICAgICAgZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShodyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9DSEVDS1NVTV9SRUcgKyAxKTsgaSsrKSB7CisgICAgICAgIGlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgaSwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tzdW0gKz0gZWVwcm9tX2RhdGE7CisgICAgfQorCisgICAgaWYgKGNoZWNrc3VtID09ICh1aW50MTZfdCkgRUVQUk9NX1NVTSkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgZWxzZSB7CisgICAgICAgIERFQlVHT1VUKCJFRVBST00gQ2hlY2tzdW0gSW52YWxpZFxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENhbGN1bGF0ZXMgdGhlIEVFUFJPTSBjaGVja3N1bSBhbmQgd3JpdGVzIGl0IHRvIHRoZSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFN1bXMgdGhlIGZpcnN0IDYzIDE2IGJpdCB3b3JkcyBvZiB0aGUgRUVQUk9NLiBTdWJ0cmFjdHMgdGhlIHN1bSBmcm9tIDB4QkFCQS4KKyAqIFdyaXRlcyB0aGUgZGlmZmVyZW5jZSB0byB3b3JkIG9mZnNldCA2MyBvZiB0aGUgRUVQUk9NLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmxfZXh0OworICAgIHVpbnQxNl90IGNoZWNrc3VtID0gMDsKKyAgICB1aW50MTZfdCBpLCBlZXByb21fZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSIpOworCisgICAgZm9yIChpID0gMDsgaSA8IEVFUFJPTV9DSEVDS1NVTV9SRUc7IGkrKykgeworICAgICAgICBpZiAoZTEwMDBfcmVhZF9lZXByb20oaHcsIGksIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgICAgICB9CisgICAgICAgIGNoZWNrc3VtICs9IGVlcHJvbV9kYXRhOworICAgIH0KKyAgICBjaGVja3N1bSA9ICh1aW50MTZfdCkgRUVQUk9NX1NVTSAtIGNoZWNrc3VtOworICAgIGlmIChlMTAwMF93cml0ZV9lZXByb20oaHcsIEVFUFJPTV9DSEVDS1NVTV9SRUcsIDEsICZjaGVja3N1bSkgPCAwKSB7CisgICAgICAgIERFQlVHT1VUKCJFRVBST00gV3JpdGUgRXJyb3JcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgfSBlbHNlIGlmIChody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX2ZsYXNoKSB7CisgICAgICAgIGUxMDAwX2NvbW1pdF9zaGFkb3dfcmFtKGh3KTsKKyAgICB9IGVsc2UgaWYgKGh3LT5lZXByb20udHlwZSA9PSBlMTAwMF9lZXByb21faWNoOCkgeworICAgICAgICBlMTAwMF9jb21taXRfc2hhZG93X3JhbShodyk7CisgICAgICAgIC8qIFJlbG9hZCB0aGUgRUVQUk9NLCBvciBlbHNlIG1vZGlmaWNhdGlvbnMgd2lsbCBub3QgYXBwZWFyCisgICAgICAgICAqIHVudGlsIGFmdGVyIG5leHQgYWRhcHRlciByZXNldC4gKi8KKyAgICAgICAgY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTF9FWFQpOworICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9FRV9SU1Q7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKyAgICAgICAgbXNsZWVwKDEwKTsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBhcmVudCBmdW5jdGlvbiBmb3Igd3JpdGluZyB3b3JkcyB0byB0aGUgZGlmZmVyZW50IEVFUFJPTSB0eXBlcy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogb2Zmc2V0IC0gb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KKyAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHdyaXRlCisgKiBkYXRhIC0gMTYgYml0IHdvcmQgdG8gYmUgd3JpdHRlbiB0byB0aGUgRUVQUk9NCisgKgorICogSWYgZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSBpcyBub3QgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZQorICogRUVQUk9NIHdpbGwgbW9zdCBsaWtlbHkgY29udGFpbiBhbiBpbnZhbGlkIGNoZWNrc3VtLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfd3JpdGVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9lZXByb20iKTsKKworICAgIC8qIElmIGVlcHJvbSBpcyBub3QgeWV0IGRldGVjdGVkLCBkbyBzbyBub3cgKi8KKyAgICBpZiAoZWVwcm9tLT53b3JkX3NpemUgPT0gMCkKKyAgICAgICAgZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zKGh3KTsKKworICAgIC8qIEEgY2hlY2sgZm9yIGludmFsaWQgdmFsdWVzOiAgb2Zmc2V0IHRvbyBsYXJnZSwgdG9vIG1hbnkgd29yZHMsIGFuZCBub3QKKyAgICAgKiBlbm91Z2ggd29yZHMuCisgICAgICovCisgICAgaWYgKChvZmZzZXQgPj0gZWVwcm9tLT53b3JkX3NpemUpIHx8ICh3b3JkcyA+IGVlcHJvbS0+d29yZF9zaXplIC0gb2Zmc2V0KSB8fAorICAgICAgICh3b3JkcyA9PSAwKSkgeworICAgICAgICBERUJVR09VVCgiXCJ3b3Jkc1wiIHBhcmFtZXRlciBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKworICAgIC8qIDgyNTczIHdyaXRlcyBvbmx5IHRocm91Z2ggZWV3ciAqLworICAgIGlmIChlZXByb20tPnVzZV9lZXdyID09IFRSVUUpCisgICAgICAgIHJldHVybiBlMTAwMF93cml0ZV9lZXByb21fZWV3cihodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisKKyAgICBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9pY2g4KQorICAgICAgICByZXR1cm4gZTEwMDBfd3JpdGVfZWVwcm9tX2ljaDgoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworCisgICAgLyogUHJlcGFyZSB0aGUgRUVQUk9NIGZvciB3cml0aW5nICAqLworICAgIGlmIChlMTAwMF9hY3F1aXJlX2VlcHJvbShodykgIT0gRTEwMDBfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCisgICAgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisgICAgICAgIHN0YXR1cyA9IGUxMDAwX3dyaXRlX2VlcHJvbV9taWNyb3dpcmUoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IGUxMDAwX3dyaXRlX2VlcHJvbV9zcGkoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworICAgICAgICBtc2xlZXAoMTApOworICAgIH0KKworICAgIC8qIERvbmUgd2l0aCB3cml0aW5nICovCisgICAgZTEwMDBfcmVsZWFzZV9lZXByb20oaHcpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgMTYgYml0IHdvcmQgdG8gYSBnaXZlbiBvZmZzZXQgaW4gYW4gU1BJIEVFUFJPTS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogb2Zmc2V0IC0gb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KKyAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHdyaXRlCisgKiBkYXRhIC0gcG9pbnRlciB0byBhcnJheSBvZiA4IGJpdCB3b3JkcyB0byBiZSB3cml0dGVuIHRvIHRoZSBFRVBST00KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfd3JpdGVfZWVwcm9tX3NwaShzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQxNl90IHdpZHggPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9lZXByb21fc3BpIik7CisKKyAgICB3aGlsZSAod2lkeCA8IHdvcmRzKSB7CisgICAgICAgIHVpbnQ4X3Qgd3JpdGVfb3Bjb2RlID0gRUVQUk9NX1dSSVRFX09QQ09ERV9TUEk7CisKKyAgICAgICAgaWYgKGUxMDAwX3NwaV9lZXByb21fcmVhZHkoaHcpKSByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisKKyAgICAgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworCisgICAgICAgIC8qICBTZW5kIHRoZSBXUklURSBFTkFCTEUgY29tbWFuZCAoOCBiaXQgb3Bjb2RlICkgICovCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fV1JFTl9PUENPREVfU1BJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyk7CisKKyAgICAgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworCisgICAgICAgIC8qIFNvbWUgU1BJIGVlcHJvbXMgdXNlIHRoZSA4dGggYWRkcmVzcyBiaXQgZW1iZWRkZWQgaW4gdGhlIG9wY29kZSAqLworICAgICAgICBpZiAoKGVlcHJvbS0+YWRkcmVzc19iaXRzID09IDgpICYmIChvZmZzZXQgPj0gMTI4KSkKKyAgICAgICAgICAgIHdyaXRlX29wY29kZSB8PSBFRVBST01fQThfT1BDT0RFX1NQSTsKKworICAgICAgICAvKiBTZW5kIHRoZSBXcml0ZSBjb21tYW5kICg4LWJpdCBvcGNvZGUgKyBhZGRyKSAqLworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgd3JpdGVfb3Bjb2RlLCBlZXByb20tPm9wY29kZV9iaXRzKTsKKworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHVpbnQxNl90KSgob2Zmc2V0ICsgd2lkeCkqMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzKTsKKworICAgICAgICAvKiBTZW5kIHRoZSBkYXRhICovCisKKyAgICAgICAgLyogTG9vcCB0byBhbGxvdyBmb3IgdXAgdG8gd2hvbGUgcGFnZSB3cml0ZSAoMzIgYnl0ZXMpIG9mIGVlcHJvbSAqLworICAgICAgICB3aGlsZSAod2lkeCA8IHdvcmRzKSB7CisgICAgICAgICAgICB1aW50MTZfdCB3b3JkX291dCA9IGRhdGFbd2lkeF07CisgICAgICAgICAgICB3b3JkX291dCA9ICh3b3JkX291dCA+PiA4KSB8ICh3b3JkX291dCA8PCA4KTsKKyAgICAgICAgICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCB3b3JkX291dCwgMTYpOworICAgICAgICAgICAgd2lkeCsrOworCisgICAgICAgICAgICAvKiBTb21lIGxhcmdlciBlZXByb20gc2l6ZXMgYXJlIGNhcGFibGUgb2YgYSAzMi1ieXRlIFBBR0UgV1JJVEUKKyAgICAgICAgICAgICAqIG9wZXJhdGlvbiwgd2hpbGUgdGhlIHNtYWxsZXIgZWVwcm9tcyBhcmUgY2FwYWJsZSBvZiBhbiA4LWJ5dGUKKyAgICAgICAgICAgICAqIFBBR0UgV1JJVEUgb3BlcmF0aW9uLiAgQnJlYWsgdGhlIGlubmVyIGxvb3AgdG8gcGFzcyBuZXcgYWRkcmVzcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKCgob2Zmc2V0ICsgd2lkeCkqMikgJSBlZXByb20tPnBhZ2Vfc2l6ZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXcml0ZXMgYSAxNiBiaXQgd29yZCB0byBhIGdpdmVuIG9mZnNldCBpbiBhIE1pY3Jvd2lyZSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCB3aXRoaW4gdGhlIEVFUFJPTSB0byBiZSB3cml0dGVuIHRvCisgKiB3b3JkcyAtIG51bWJlciBvZiB3b3JkcyB0byB3cml0ZQorICogZGF0YSAtIHBvaW50ZXIgdG8gYXJyYXkgb2YgMTYgYml0IHdvcmRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIEVFUFJPTQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF93cml0ZV9lZXByb21fbWljcm93aXJlKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisgICAgdWludDMyX3QgZWVjZDsKKyAgICB1aW50MTZfdCB3b3Jkc193cml0dGVuID0gMDsKKyAgICB1aW50MTZfdCBpID0gMDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfd3JpdGVfZWVwcm9tX21pY3Jvd2lyZSIpOworCisgICAgLyogU2VuZCB0aGUgd3JpdGUgZW5hYmxlIGNvbW1hbmQgdG8gdGhlIEVFUFJPTSAoMy1iaXQgb3Bjb2RlIHBsdXMKKyAgICAgKiA2LzgtYml0IGR1bW15IGFkZHJlc3MgYmVnaW5uaW5nIHdpdGggMTEpLiAgSXQncyBsZXNzIHdvcmsgdG8gaW5jbHVkZQorICAgICAqIHRoZSAxMSBvZiB0aGUgZHVtbXkgYWRkcmVzcyBhcyBwYXJ0IG9mIHRoZSBvcGNvZGUgdGhhbiBpdCBpcyB0byBzaGlmdAorICAgICAqIGl0IG92ZXIgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBhZGRyZXNzLiAgVGhpcyBwdXRzIHRoZQorICAgICAqIEVFUFJPTSBpbnRvIHdyaXRlL2VyYXNlIG1vZGUuCisgICAgICovCisgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9FV0VOX09QQ09ERV9NSUNST1dJUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KShlZXByb20tPm9wY29kZV9iaXRzICsgMikpOworCisgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIDAsICh1aW50MTZfdCkoZWVwcm9tLT5hZGRyZXNzX2JpdHMgLSAyKSk7CisKKyAgICAvKiBQcmVwYXJlIHRoZSBFRVBST00gKi8KKyAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisKKyAgICB3aGlsZSAod29yZHNfd3JpdHRlbiA8IHdvcmRzKSB7CisgICAgICAgIC8qIFNlbmQgdGhlIFdyaXRlIGNvbW1hbmQgKDMtYml0IG9wY29kZSArIGFkZHIpICovCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fV1JJVEVfT1BDT0RFX01JQ1JPV0lSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyk7CisKKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1aW50MTZfdCkob2Zmc2V0ICsgd29yZHNfd3JpdHRlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzKTsKKworICAgICAgICAvKiBTZW5kIHRoZSBkYXRhICovCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBkYXRhW3dvcmRzX3dyaXR0ZW5dLCAxNik7CisKKyAgICAgICAgLyogVG9nZ2xlIHRoZSBDUyBsaW5lLiAgVGhpcyBpbiBlZmZlY3QgdGVsbHMgdGhlIEVFUFJPTSB0byBleGVjdXRlCisgICAgICAgICAqIHRoZSBwcmV2aW91cyBjb21tYW5kLgorICAgICAgICAgKi8KKyAgICAgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworCisgICAgICAgIC8qIFJlYWQgRE8gcmVwZWF0ZWRseSB1bnRpbCBpdCBpcyBoaWdoIChlcXVhbCB0byAnMScpLiAgVGhlIEVFUFJPTSB3aWxsCisgICAgICAgICAqIHNpZ25hbCB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSByYWlzaW5nIHRoZSBETyBzaWduYWwuCisgICAgICAgICAqIElmIERPIGRvZXMgbm90IGdvIGhpZ2ggaW4gMTAgbWlsbGlzZWNvbmRzLCB0aGVuIGVycm9yIG91dC4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworICAgICAgICAgICAgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKyAgICAgICAgICAgIGlmIChlZWNkICYgRTEwMDBfRUVDRF9ETykgYnJlYWs7CisgICAgICAgICAgICB1ZGVsYXkoNTApOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IDIwMCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBXcml0ZSBkaWQgbm90IGNvbXBsZXRlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlY292ZXIgZnJvbSB3cml0ZSAqLworICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisKKyAgICAgICAgd29yZHNfd3JpdHRlbisrOworICAgIH0KKworICAgIC8qIFNlbmQgdGhlIHdyaXRlIGRpc2FibGUgY29tbWFuZCB0byB0aGUgRUVQUk9NICgzLWJpdCBvcGNvZGUgcGx1cworICAgICAqIDYvOC1iaXQgZHVtbXkgYWRkcmVzcyBiZWdpbm5pbmcgd2l0aCAxMCkuICBJdCdzIGxlc3Mgd29yayB0byBpbmNsdWRlCisgICAgICogdGhlIDEwIG9mIHRoZSBkdW1teSBhZGRyZXNzIGFzIHBhcnQgb2YgdGhlIG9wY29kZSB0aGFuIGl0IGlzIHRvIHNoaWZ0CisgICAgICogaXQgb3ZlciB0aGUgY29ycmVjdCBudW1iZXIgb2YgYml0cyBmb3IgdGhlIGFkZHJlc3MuICBUaGlzIHRha2VzIHRoZQorICAgICAqIEVFUFJPTSBvdXQgb2Ygd3JpdGUvZXJhc2UgbW9kZS4KKyAgICAgKi8KKyAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX0VXRFNfT1BDT0RFX01JQ1JPV0lSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKGVlcHJvbS0+b3Bjb2RlX2JpdHMgKyAyKSk7CisKKyAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgMCwgKHVpbnQxNl90KShlZXByb20tPmFkZHJlc3NfYml0cyAtIDIpKTsKKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGbHVzaGVzIHRoZSBjYWNoZWQgZWVwcm9tIHRvIE5WTS4gVGhpcyBpcyBkb25lIGJ5IHNhdmluZyB0aGUgbW9kaWZpZWQgdmFsdWVzCisgKiBpbiB0aGUgZWVwcm9tIGNhY2hlIGFuZCB0aGUgbm9uIG1vZGlmaWVkIHZhbHVlcyBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBiYW5rCisgKiB0byB0aGUgbmV3IGJhbmsuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCBvZiAgd29yZCBpbiB0aGUgRUVQUk9NIHRvIHJlYWQKKyAqIGRhdGEgLSB3b3JkIHJlYWQgZnJvbSB0aGUgRUVQUk9NCisgKiB3b3JkcyAtIG51bWJlciBvZiB3b3JkcyB0byByZWFkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfY29tbWl0X3NoYWRvd19yYW0oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBhdHRlbXB0cyA9IDEwMDAwMDsKKyAgICB1aW50MzJfdCBlZWNkID0gMDsKKyAgICB1aW50MzJfdCBmbG9wID0gMDsKKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICBpbnQzMl90IGVycm9yID0gRTEwMDBfU1VDQ0VTUzsKKyAgICB1aW50MzJfdCBvbGRfYmFua19vZmZzZXQgPSAwOworICAgIHVpbnQzMl90IG5ld19iYW5rX29mZnNldCA9IDA7CisgICAgdWludDhfdCBsb3dfYnl0ZSA9IDA7CisgICAgdWludDhfdCBoaWdoX2J5dGUgPSAwOworICAgIGJvb2xlYW5fdCBzZWN0b3Jfd3JpdGVfZmFpbGVkID0gRkFMU0U7CisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7CisgICAgICAgIC8qIFRoZSBmbG9wIHJlZ2lzdGVyIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgZmxhc2ggdHlwZSBpcyBTVE0gKi8KKyAgICAgICAgZmxvcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBGTE9QKTsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBhdHRlbXB0czsgaSsrKSB7CisgICAgICAgICAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworICAgICAgICAgICAgaWYgKChlZWNkICYgRTEwMDBfRUVDRF9GTFVQRCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWRlbGF5KDUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPT0gYXR0ZW1wdHMpIHsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIFNUTSBvcGNvZGUgbG9jYXRlZCBpbiBiaXRzIDE1Ojggb2YgZmxvcCwgcmVzZXQgZmlybXdhcmUgKi8KKyAgICAgICAgaWYgKChmbG9wICYgMHhGRjAwKSA9PSBFMTAwMF9TVE1fT1BDT0RFKSB7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEhJQ1IsIEUxMDAwX0hJQ1JfRldfUkVTRVQpOworICAgICAgICB9CisKKyAgICAgICAgLyogUGVyZm9ybSB0aGUgZmxhc2ggdXBkYXRlICovCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCB8IEUxMDAwX0VFQ0RfRkxVUEQpOworCisgICAgICAgIGZvciAoaT0wOyBpIDwgYXR0ZW1wdHM7IGkrKykgeworICAgICAgICAgICAgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKyAgICAgICAgICAgIGlmICgoZWVjZCAmIEUxMDAwX0VFQ0RfRkxVUEQpID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVkZWxheSg1KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpID09IGF0dGVtcHRzKSB7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4gJiYgaHctPmVlcHJvbV9zaGFkb3dfcmFtICE9IE5VTEwpIHsKKyAgICAgICAgLyogV2UncmUgd3JpdGluZyB0byB0aGUgb3Bwb3NpdGUgYmFuayBzbyBpZiB3ZSdyZSBvbiBiYW5rIDEsCisgICAgICAgICAqIHdyaXRlIHRvIGJhbmsgMCBldGMuICBXZSBhbHNvIG5lZWQgdG8gZXJhc2UgdGhlIHNlZ21lbnQgdGhhdAorICAgICAgICAgKiBpcyBnb2luZyB0byBiZSB3cml0dGVuICovCisgICAgICAgIGlmICghKEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKSAmIEUxMDAwX0VFQ0RfU0VDMVZBTCkpIHsKKyAgICAgICAgICAgIG5ld19iYW5rX29mZnNldCA9IGh3LT5mbGFzaF9iYW5rX3NpemUgKiAyOworICAgICAgICAgICAgb2xkX2Jhbmtfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGUxMDAwX2VyYXNlX2ljaDhfNGtfc2VnbWVudChodywgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvbGRfYmFua19vZmZzZXQgPSBody0+Zmxhc2hfYmFua19zaXplICogMjsKKyAgICAgICAgICAgIG5ld19iYW5rX29mZnNldCA9IDA7CisgICAgICAgICAgICBlMTAwMF9lcmFzZV9pY2g4XzRrX3NlZ21lbnQoaHcsIDApOworICAgICAgICB9CisKKyAgICAgICAgc2VjdG9yX3dyaXRlX2ZhaWxlZCA9IEZBTFNFOworICAgICAgICAvKiBMb29wIGZvciBldmVyeSBieXRlIGluIHRoZSBzaGFkb3cgUkFNLAorICAgICAgICAgKiB3aGljaCBpcyBpbiB1bml0cyBvZiB3b3Jkcy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEUxMDAwX1NIQURPV19SQU1fV09SRFM7IGkrKykgeworICAgICAgICAgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gd3JpdGUgdGhlIHZhbHVlIHN0b3JlZAorICAgICAgICAgICAgICogaW4gdGhlIG90aGVyIE5WTSBiYW5rIG9yIGEgbW9kaWZpZWQgdmFsdWUgc3RvcmVkCisgICAgICAgICAgICAgKiBpbiB0aGUgc2hhZG93IFJBTSAqLworICAgICAgICAgICAgaWYgKGh3LT5lZXByb21fc2hhZG93X3JhbVtpXS5tb2RpZmllZCA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgbG93X2J5dGUgPSAodWludDhfdClody0+ZWVwcm9tX3NoYWRvd19yYW1baV0uZWVwcm9tX3dvcmQ7CisgICAgICAgICAgICAgICAgdWRlbGF5KDEwMCk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF92ZXJpZnlfd3JpdGVfaWNoOF9ieXRlKGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpIDw8IDEpICsgbmV3X2Jhbmtfb2Zmc2V0LCBsb3dfYnl0ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgc2VjdG9yX3dyaXRlX2ZhaWxlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhpZ2hfYnl0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoaHctPmVlcHJvbV9zaGFkb3dfcmFtW2ldLmVlcHJvbV93b3JkID4+IDgpOworICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMTAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGUxMDAwX3JlYWRfaWNoOF9ieXRlKGh3LCAoaSA8PCAxKSArIG9sZF9iYW5rX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG93X2J5dGUpOworICAgICAgICAgICAgICAgIHVkZWxheSgxMDApOworICAgICAgICAgICAgICAgIGVycm9yID0gZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA8PCAxKSArIG5ld19iYW5rX29mZnNldCwgbG93X2J5dGUpOworCisgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IEUxMDAwX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHNlY3Rvcl93cml0ZV9mYWlsZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlMTAwMF9yZWFkX2ljaDhfYnl0ZShodywgKGkgPDwgMSkgKyBvbGRfYmFua19vZmZzZXQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlnaF9ieXRlKTsKKyAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEwMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB0aGUgd3JpdGUgb2YgdGhlIGxvdyBieXRlIHdhcyBzdWNjZXNzZnVsLCBnbyBhaHJlYWQgYW5kCisgICAgICAgICAgICAgKiB3cml0ZSB0aGUgaGlnaCBieXRlIHdoaWxlIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIGl0CisgICAgICAgICAgICAgKiBpcyB0aGUgc2lnbmF0dXJlIGJ5dGUsIHRoZW4gaXQgaXMgaGFuZGxlZCBwcm9wZXJseSAqLworICAgICAgICAgICAgaWYgKHNlY3Rvcl93cml0ZV9mYWlsZWQgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGUgd29yZCBpcyAweDEzLCB0aGVuIG1ha2Ugc3VyZSB0aGUgc2lnbmF0dXJlIGJpdHMKKyAgICAgICAgICAgICAgICAgKiAoMTU6MTQpIGFyZSAxMWIgdW50aWwgdGhlIGNvbW1pdCBoYXMgY29tcGxldGVkLgorICAgICAgICAgICAgICAgICAqIFRoaXMgd2lsbCBhbGxvdyB1cyB0byB3cml0ZSAxMGIgd2hpY2ggaW5kaWNhdGVzIHRoZQorICAgICAgICAgICAgICAgICAqIHNpZ25hdHVyZSBpcyB2YWxpZC4gIFdlIHdhbnQgdG8gZG8gdGhpcyBhZnRlciB0aGUgd3JpdGUKKyAgICAgICAgICAgICAgICAgKiBoYXMgY29tcGxldGVkIHNvIHRoYXQgd2UgZG9uJ3QgbWFyayB0aGUgc2VnbWVudCB2YWxpZAorICAgICAgICAgICAgICAgICAqIHdoaWxlIHRoZSB3cml0ZSBpcyBzdGlsbCBpbiBwcm9ncmVzcyAqLworICAgICAgICAgICAgICAgIGlmIChpID09IEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQpCisgICAgICAgICAgICAgICAgICAgIGhpZ2hfYnl0ZSA9IEUxMDAwX0lDSF9OVk1fU0lHX01BU0sgfCBoaWdoX2J5dGU7CisKKyAgICAgICAgICAgICAgICBlcnJvciA9IGUxMDAwX3ZlcmlmeV93cml0ZV9pY2g4X2J5dGUoaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgPDwgMSkgKyBuZXdfYmFua19vZmZzZXQgKyAxLCBoaWdoX2J5dGUpOworICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBFMTAwMF9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICBzZWN0b3Jfd3JpdGVfZmFpbGVkID0gVFJVRTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGUgd3JpdGUgZmFpbGVkIHRoZW4gYnJlYWsgZnJvbSB0aGUgbG9vcCBhbmQKKyAgICAgICAgICAgICAgICAgKiByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIERvbid0IGJvdGhlciB3cml0aW5nIHRoZSBzZWdtZW50IHZhbGlkIGJpdHMgaWYgc2VjdG9yCisgICAgICAgICAqIHByb2dyYW1taW5nIGZhaWxlZC4gKi8KKyAgICAgICAgaWYgKHNlY3Rvcl93cml0ZV9mYWlsZWQgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgIC8qIEZpbmFsbHkgdmFsaWRhdGUgdGhlIG5ldyBzZWdtZW50IGJ5IHNldHRpbmcgYml0IDE1OjE0CisgICAgICAgICAgICAgKiB0byAxMGIgaW4gd29yZCAweDEzICwgdGhpcyBjYW4gYmUgZG9uZSB3aXRob3V0IGFuCisgICAgICAgICAgICAgKiBlcmFzZSBhcyB3ZWxsIHNpbmNlIHRoZXNlIGJpdHMgYXJlIDExIHRvIHN0YXJ0IHdpdGgKKyAgICAgICAgICAgICAqIGFuZCB3ZSBuZWVkIHRvIGNoYW5nZSBiaXQgMTQgdG8gMGIgKi8KKyAgICAgICAgICAgIGUxMDAwX3JlYWRfaWNoOF9ieXRlKGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfSUNIX05WTV9TSUdfV09SRCAqIDIgKyAxICsgbmV3X2Jhbmtfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpZ2hfYnl0ZSk7CisgICAgICAgICAgICBoaWdoX2J5dGUgJj0gMHhCRjsKKyAgICAgICAgICAgIGVycm9yID0gZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShodywKKyAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQgKiAyICsgMSArIG5ld19iYW5rX29mZnNldCwgaGlnaF9ieXRlKTsKKyAgICAgICAgICAgIC8qIEFuZCBpbnZhbGlkYXRlIHRoZSBwcmV2aW91c2x5IHZhbGlkIHNlZ21lbnQgYnkgc2V0dGluZworICAgICAgICAgICAgICogaXRzIHNpZ25hdHVyZSB3b3JkICgweDEzKSBoaWdoX2J5dGUgdG8gMGIuIFRoaXMgY2FuIGJlCisgICAgICAgICAgICAgKiBkb25lIHdpdGhvdXQgYW4gZXJhc2UgYmVjYXVzZSBmbGFzaCBlcmFzZSBzZXRzIGFsbCBiaXRzCisgICAgICAgICAgICAgKiB0byAxJ3MuIFdlIGNhbiB3cml0ZSAxJ3MgdG8gMCdzIHdpdGhvdXQgYW4gZXJhc2UgKi8KKyAgICAgICAgICAgIGlmIChlcnJvciA9PSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF92ZXJpZnlfd3JpdGVfaWNoOF9ieXRlKGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQgKiAyICsgMSArIG9sZF9iYW5rX29mZnNldCwgMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENsZWFyIHRoZSBub3cgbm90IHVzZWQgZW50cnkgaW4gdGhlIGNhY2hlICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRTEwMDBfU0hBRE9XX1JBTV9XT1JEUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaHctPmVlcHJvbV9zaGFkb3dfcmFtW2ldLm1vZGlmaWVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaHctPmVlcHJvbV9zaGFkb3dfcmFtW2ldLmVlcHJvbV93b3JkID0gMHhGRkZGOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkcyB0aGUgYWRhcHRlcidzIE1BQyBhZGRyZXNzIGZyb20gdGhlIEVFUFJPTSBhbmQgaW52ZXJ0cyB0aGUgTFNCIGZvciB0aGUKKyAqIHNlY29uZCBmdW5jdGlvbiBvZiBkdWFsIGZ1bmN0aW9uIGRldmljZXMKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKiBodykKK3sKKyAgICB1aW50MTZfdCBvZmZzZXQsIG1hY19hZGRyX29mZnNldCA9IDA7CisgICAgdWludDE2X3QgZWVwcm9tX2RhdGEsIGk7CisgICAgaW50MzJfdCByZXRfdmFsOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX21hY19hZGRyIik7CisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTcxKSB7CisgICAgICAgIC8qIENoZWNrIGZvciBhbiBhbHRlcm5hdGUgTUFDIGFkZHJlc3MuICBBbiBhbHRlcm5hdGUgTUFDCisgICAgICAgICAqIGFkZHJlc3MgY2FuIGJlIHNldHVwIGJ5IHByZS1ib290IHNvZnR3YXJlIGFuZCBtdXN0IGJlCisgICAgICAgICAqIHRyZWF0ZWQgbGlrZSBhIHBlcm1hbmVudCBhZGRyZXNzIGFuZCBtdXN0IG92ZXJyaWRlIHRoZQorICAgICAgICAgKiBhY3R1YWwgcGVybWFuZW50IE1BQyBhZGRyZXNzLiovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0FMVF9NQUNfQUREUl9QVFIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFjX2FkZHJfb2Zmc2V0KTsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hY19hZGRyX29mZnNldCA9PSAweEZGRkYpCisgICAgICAgICAgICBtYWNfYWRkcl9vZmZzZXQgPSAwOworCisgICAgICAgIGlmIChtYWNfYWRkcl9vZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpCisgICAgICAgICAgICAgICAgbWFjX2FkZHJfb2Zmc2V0ICs9IE5PREVfQUREUkVTU19TSVpFL3NpemVvZih1MTYpOworCisgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBtYWMgYWRkcmVzcyBoZXJlCisgICAgICAgICAgICAgICAgICogYmVmb3JlIHVzaW5nIGl0ICovCisgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIG1hY19hZGRyX29mZnNldCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWVwcm9tX2RhdGEpOworICAgICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGlmIChlZXByb21fZGF0YSAmIDB4MDAwMSkKKyAgICAgICAgICAgICAgICAgICBtYWNfYWRkcl9vZmZzZXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hY19hZGRyX29mZnNldCkKKyAgICAgICAgICAgIGh3LT5sYWFfaXNfcHJlc2VudCA9IFRSVUU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE5PREVfQUREUkVTU19TSVpFOyBpICs9IDIpIHsKKyAgICAgICAgb2Zmc2V0ID0gbWFjX2FkZHJfb2Zmc2V0ICsgKGkgPj4gMSk7CisgICAgICAgIGlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgb2Zmc2V0LCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgfQorICAgICAgICBody0+cGVybV9tYWNfYWRkcltpXSA9ICh1aW50OF90KSAoZWVwcm9tX2RhdGEgJiAweDAwRkYpOworICAgICAgICBody0+cGVybV9tYWNfYWRkcltpKzFdID0gKHVpbnQ4X3QpIChlZXByb21fZGF0YSA+PiA4KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NDY6CisgICAgY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKyAgICBjYXNlIGUxMDAwXzgyNTcxOgorICAgIGNhc2UgZTEwMDBfODI1NzY6CisgICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKKyAgICAgICAgaWYgKCFtYWNfYWRkcl9vZmZzZXQgJiYKKyAgICAgICAgICAgIEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkKKyAgICAgICAgICAgIGh3LT5wZXJtX21hY19hZGRyWzVdIF49IDB4MDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBOT0RFX0FERFJFU1NfU0laRTsgaSsrKQorICAgICAgICBody0+bWFjX2FkZHJbaV0gPSBody0+cGVybV9tYWNfYWRkcltpXTsKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdGlhbGl6ZXMgcmVjZWl2ZSBhZGRyZXNzIGZpbHRlcnMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBQbGFjZXMgdGhlIE1BQyBhZGRyZXNzIGluIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciAwIGFuZCBjbGVhcnMgdGhlIHJlc3QKKyAqIG9mIHRoZSByZWNlaXZlIGFkZHJlc3NzIHJlZ2lzdGVycy4gQ2xlYXJzIHRoZSBtdWx0aWNhc3QgdGFibGUuIEFzc3VtZXMKKyAqIHRoZSByZWNlaXZlciBpcyBpbiByZXNldCB3aGVuIHRoZSByb3V0aW5lIGlzIGNhbGxlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9pbml0X3J4X2FkZHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCByYXJfbnVtOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9pbml0X3J4X2FkZHJzIik7CisKKyAgICAvKiBTZXR1cCB0aGUgcmVjZWl2ZSBhZGRyZXNzLiAqLworICAgIERFQlVHT1VUKCJQcm9ncmFtbWluZyBNQUMgQWRkcmVzcyBpbnRvIFJBUlswXVxuIik7CisKKyAgICBlMTAwMF9yYXJfc2V0KGh3LCBody0+bWFjX2FkZHIsIDApOworCisgICAgcmFyX251bSA9IEUxMDAwX1JBUl9FTlRSSUVTOworCisgICAgLyogUmVzZXJ2ZSBhIHNwb3QgZm9yIHRoZSBMb2NhbGx5IEFkbWluaXN0ZXJlZCBBZGRyZXNzIHRvIHdvcmsgYXJvdW5kCisgICAgICogYW4gODI1NzEgaXNzdWUgaW4gd2hpY2ggYSByZXNldCBvbiBvbmUgcG9ydCB3aWxsIHJlbG9hZCB0aGUgTUFDIG9uCisgICAgICogdGhlIG90aGVyIHBvcnQuICovCisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzEpICYmIChody0+bGFhX2lzX3ByZXNlbnQgPT0gVFJVRSkpCisgICAgICAgIHJhcl9udW0gLT0gMTsKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCisgICAgICAgIHJhcl9udW0gPSBFMTAwMF9SQVJfRU5UUklFU19JQ0g4TEFOOworCisgICAgLyogWmVybyBvdXQgdGhlIG90aGVyIDE1IHJlY2VpdmUgYWRkcmVzc2VzLiAqLworICAgIERFQlVHT1VUKCJDbGVhcmluZyBSQVJbMS0xNV1cbiIpOworICAgIGZvciAoaSA9IDE7IGkgPCByYXJfbnVtOyBpKyspIHsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGkgPDwgMSksIDApOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaSA8PCAxKSArIDEpLCAwKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGFzaGVzIGFuIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIGl0cyBsb2NhdGlvbiBpbiB0aGUgbXVsdGljYXN0IHRhYmxlCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG1jX2FkZHIgLSB0aGUgbXVsdGljYXN0IGFkZHJlc3MgdG8gaGFzaAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QKK2UxMDAwX2hhc2hfbWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm1jX2FkZHIpCit7CisgICAgdWludDMyX3QgaGFzaF92YWx1ZSA9IDA7CisKKyAgICAvKiBUaGUgcG9ydGlvbiBvZiB0aGUgYWRkcmVzcyB0aGF0IGlzIHVzZWQgZm9yIHRoZSBoYXNoIHRhYmxlIGlzCisgICAgICogZGV0ZXJtaW5lZCBieSB0aGUgbWNfZmlsdGVyX3R5cGUgc2V0dGluZy4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKGh3LT5tY19maWx0ZXJfdHlwZSkgeworICAgIC8qIFswXSBbMV0gWzJdIFszXSBbNF0gWzVdCisgICAgICogMDEgIEFBICAwMCAgMTIgIDM0ICA1NgorICAgICAqIExTQiAgICAgICAgICAgICAgICAgTVNCCisgICAgICovCisgICAgY2FzZSAwOgorICAgICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKKyAgICAgICAgICAgIC8qIFs0NzozOF0gaS5lLiAweDE1OCBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisgICAgICAgICAgICBoYXNoX3ZhbHVlID0gKChtY19hZGRyWzRdID4+IDYpIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFs0NzozNl0gaS5lLiAweDU2MyBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisgICAgICAgICAgICBoYXNoX3ZhbHVlID0gKChtY19hZGRyWzRdID4+IDQpIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDQpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgeworICAgICAgICAgICAgLyogWzQ2OjM3XSBpLmUuIDB4MkIxIGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gNSkgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgMykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogWzQ2OjM1XSBpLmUuIDB4QUM2IGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gMykgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgNSkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7CisgICAgICAgICAgICAvKls0NTozNl0gaS5lLiAweDE2MyBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisgICAgICAgICAgICBoYXNoX3ZhbHVlID0gKChtY19hZGRyWzRdID4+IDQpIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFs0NTozNF0gaS5lLiAweDVEOCBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisgICAgICAgICAgICBoYXNoX3ZhbHVlID0gKChtY19hZGRyWzRdID4+IDIpIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDYpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgeworICAgICAgICAgICAgLyogWzQzOjM0XSBpLmUuIDB4MThEIGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gMikgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgNikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogWzQzOjMyXSBpLmUuIDB4NjM0IGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0pIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDgpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBoYXNoX3ZhbHVlICY9IDB4RkZGOworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikKKyAgICAgICAgaGFzaF92YWx1ZSAmPSAweDNGRjsKKworICAgIHJldHVybiBoYXNoX3ZhbHVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXRzIHRoZSBiaXQgaW4gdGhlIG11bHRpY2FzdCB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXNoIHZhbHVlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBoYXNoX3ZhbHVlIC0gTXVsdGljYXN0IGFkZHJlc3MgaGFzaCB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfbXRhX3NldChzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICB1aW50MzJfdCBoYXNoX3ZhbHVlKQoreworICAgIHVpbnQzMl90IGhhc2hfYml0LCBoYXNoX3JlZzsKKyAgICB1aW50MzJfdCBtdGE7CisgICAgdWludDMyX3QgdGVtcDsKKworICAgIC8qIFRoZSBNVEEgaXMgYSByZWdpc3RlciBhcnJheSBvZiAxMjggMzItYml0IHJlZ2lzdGVycy4KKyAgICAgKiBJdCBpcyB0cmVhdGVkIGxpa2UgYW4gYXJyYXkgb2YgNDA5NiBiaXRzLiAgV2Ugd2FudCB0byBzZXQKKyAgICAgKiBiaXQgQml0QXJyYXlbaGFzaF92YWx1ZV0uIFNvIHdlIGZpZ3VyZSBvdXQgd2hhdCByZWdpc3RlcgorICAgICAqIHRoZSBiaXQgaXMgaW4sIHJlYWQgaXQsIE9SIGluIHRoZSBuZXcgYml0LCB0aGVuIHdyaXRlCisgICAgICogYmFjayB0aGUgbmV3IHZhbHVlLiAgVGhlIHJlZ2lzdGVyIGlzIGRldGVybWluZWQgYnkgdGhlCisgICAgICogdXBwZXIgNyBiaXRzIG9mIHRoZSBoYXNoIHZhbHVlIGFuZCB0aGUgYml0IHdpdGhpbiB0aGF0CisgICAgICogcmVnaXN0ZXIgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyIDUgYml0cyBvZiB0aGUgdmFsdWUuCisgICAgICovCisgICAgaGFzaF9yZWcgPSAoaGFzaF92YWx1ZSA+PiA1KSAmIDB4N0Y7CisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKQorICAgICAgICBoYXNoX3JlZyAmPSAweDFGOworCisgICAgaGFzaF9iaXQgPSBoYXNoX3ZhbHVlICYgMHgxRjsKKworICAgIG10YSA9IEUxMDAwX1JFQURfUkVHX0FSUkFZKGh3LCBNVEEsIGhhc2hfcmVnKTsKKworICAgIG10YSB8PSAoMSA8PCBoYXNoX2JpdCk7CisKKyAgICAvKiBJZiB3ZSBhcmUgb24gYW4gODI1NDQgYW5kIHdlIGFyZSB0cnlpbmcgdG8gd3JpdGUgYW4gb2RkIG9mZnNldAorICAgICAqIGluIHRoZSBNVEEsIHNhdmUgb2ZmIHRoZSBwcmV2aW91cyBlbnRyeSBiZWZvcmUgd3JpdGluZyBhbmQKKyAgICAgKiByZXN0b3JlIHRoZSBvbGQgdmFsdWUgYWZ0ZXIgd3JpdGluZy4KKyAgICAgKi8KKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NCkgJiYgKChoYXNoX3JlZyAmIDB4MSkgPT0gMSkpIHsKKyAgICAgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHX0FSUkFZKGh3LCBNVEEsIChoYXNoX3JlZyAtIDEpKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBNVEEsIGhhc2hfcmVnLCBtdGEpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgTVRBLCAoaGFzaF9yZWcgLSAxKSwgdGVtcCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICB9IGVsc2UgeworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaGFzaF9yZWcsIG10YSk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFB1dHMgYW4gZXRoZXJuZXQgYWRkcmVzcyBpbnRvIGEgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBhZGRyIC0gQWRkcmVzcyB0byBwdXQgaW50byByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIKKyAqIGluZGV4IC0gUmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyIHRvIHdyaXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF9yYXJfc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgIHVpbnQ4X3QgKmFkZHIsCisgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KQoreworICAgIHVpbnQzMl90IHJhcl9sb3csIHJhcl9oaWdoOworCisgICAgLyogSFcgZXhwZWN0cyB0aGVzZSBpbiBsaXR0bGUgZW5kaWFuIHNvIHdlIHJldmVyc2UgdGhlIGJ5dGUgb3JkZXIKKyAgICAgKiBmcm9tIG5ldHdvcmsgb3JkZXIgKGJpZyBlbmRpYW4pIHRvIGxpdHRsZSBlbmRpYW4KKyAgICAgKi8KKyAgICByYXJfbG93ID0gKCh1aW50MzJfdCkgYWRkclswXSB8CisgICAgICAgICAgICAgICAoKHVpbnQzMl90KSBhZGRyWzFdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICgodWludDMyX3QpIGFkZHJbMl0gPDwgMTYpIHwgKCh1aW50MzJfdCkgYWRkclszXSA8PCAyNCkpOworICAgIHJhcl9oaWdoID0gKCh1aW50MzJfdCkgYWRkcls0XSB8ICgodWludDMyX3QpIGFkZHJbNV0gPDwgOCkpOworCisgICAgLyogRGlzYWJsZSBSeCBhbmQgZmx1c2ggYWxsIFJ4IGZyYW1lcyBiZWZvcmUgZW5hYmxpbmcgUlNTIHRvIGF2b2lkIFJ4CisgICAgICogdW5pdCBoYW5nLgorICAgICAqCisgICAgICogRGVzY3JpcHRpb246CisgICAgICogSWYgdGhlcmUgYXJlIGFueSBSeCBmcmFtZXMgcXVldWVkIHVwIG9yIG90aGVyd2lzZSBwcmVzZW50IGluIHRoZSBIVworICAgICAqIGJlZm9yZSBSU1MgaXMgZW5hYmxlZCwgYW5kIHRoZW4gd2UgZW5hYmxlIFJTUywgdGhlIEhXIFJ4IHVuaXQgd2lsbAorICAgICAqIGhhbmcuICBUbyB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlLCB3ZSBoYXZlIHRvIGRpc2FibGUgcmVjZWl2ZXMgYW5kCisgICAgICogZmx1c2ggb3V0IGFsbCBSeCBmcmFtZXMgYmVmb3JlIHdlIGVuYWJsZSBSU1MuIFRvIGRvIHNvLCB3ZSBtb2RpZnkgd2UKKyAgICAgKiByZWRpcmVjdCBhbGwgUnggdHJhZmZpYyB0byBtYW5hZ2VhYmlsaXR5IGFuZCB0aGVuIHJlc2V0IHRoZSBIVy4KKyAgICAgKiBUaGlzIGZsdXNoZXMgYXdheSBSeCBmcmFtZXMsIGFuZCAoc2luY2UgdGhlIHJlZGlyZWN0aW9ucyB0bworICAgICAqIG1hbmFnZWFiaWxpdHkgcGVyc2lzdHMgYWNyb3NzIHJlc2V0cykga2VlcHMgbmV3IG9uZXMgZnJvbSBjb21pbmcgaW4KKyAgICAgKiB3aGlsZSB3ZSB3b3JrLiAgVGhlbiwgd2UgY2xlYXIgdGhlIEFkZHJlc3MgVmFsaWQgQVYgYml0IGZvciBhbGwgTUFDCisgICAgICogYWRkcmVzc2VzIGFuZCB1bmRvIHRoZSByZS1kaXJlY3Rpb24gdG8gbWFuYWdlYWJpbGl0eS4KKyAgICAgKiBOb3csIGZyYW1lcyBhcmUgY29taW5nIGluIGFnYWluLCBidXQgdGhlIE1BQyB3b24ndCBhY2NlcHQgdGhlbSwgc28KKyAgICAgKiBmYXIgc28gZ29vZC4gIFdlIG5vdyBwcm9jZWVkIHRvIGluaXRpYWxpemUgUlNTIChpZiBuZWNlc3NhcnkpIGFuZAorICAgICAqIGNvbmZpZ3VyZSB0aGUgUnggdW5pdC4gIExhc3QsIHdlIHJlLWVuYWJsZSB0aGUgQVYgYml0cyBhbmQgY29udGludWUKKyAgICAgKiBvbiBvdXIgbWVycnkgd2F5LgorICAgICAqLworICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MjU3MToKKyAgICBjYXNlIGUxMDAwXzgyNTcyOgorICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46CisgICAgICAgIGlmIChody0+bGVhdmVfYXZfYml0X29mZiA9PSBUUlVFKQorICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU3NjoKKyAgICAgICAgLyogSWYgTUFDIGFkZHJlc3MgemVybywgbm8gbmVlZCB0byBzZXQgdGhlIEFWIGJpdCAqLworICAgICAgICBpZiAocmFyX2xvdyB8fCByYXJfaGlnaCkKKyAgICAgICAgICAgIHJhcl9oaWdoIHw9IEUxMDAwX1JBSF9BVjsKKyAgICAgICAgICAgIC8vIE9ubHkgbmVkZWQgd2hlbiBNdWx0aXBsZSBSZWNlaXZlIFF1ZXVlcyBhcmUgZW5hYm1lZCBpbiBNUlFDCisgICAgICAgIHJhcl9oaWdoIHw9IEUxMDAwX1JBSF9QT09MXzE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIEluZGljYXRlIHRvIGhhcmR3YXJlIHRoZSBBZGRyZXNzIGlzIFZhbGlkLiAqLworICAgICAgICByYXJfaGlnaCB8PSBFMTAwMF9SQUhfQVY7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsIChpbmRleCA8PCAxKSwgcmFyX2xvdyk7CisgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaW5kZXggPDwgMSkgKyAxKSwgcmFyX2hpZ2gpOworICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQgaW4gdGhlIFZMQU4gZmlsdGVyIHRhYmxlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBPZmZzZXQgaW4gVkxBTiBmaWxlciB0YWJsZSB0byB3cml0ZQorICogdmFsdWUgLSBWYWx1ZSB0byB3cml0ZSBpbnRvIFZMQU4gZmlsdGVyIHRhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF93cml0ZV92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCit7CisgICAgdWludDMyX3QgdGVtcDsKKworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDQpICYmICgob2Zmc2V0ICYgMHgxKSA9PSAxKSkgeworICAgICAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoaHcsIFZGVEEsIChvZmZzZXQgLSAxKSk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBWRlRBLCAob2Zmc2V0IC0gMSksIHRlbXApOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBWRlRBLCBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2xlYXJzIHRoZSBWTEFOIGZpbGVyIHRhYmxlCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9jbGVhcl92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHVpbnQzMl90IHZmdGFfdmFsdWUgPSAwOworICAgIHVpbnQzMl90IHZmdGFfb2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCB2ZnRhX2JpdF9pbl9yZWcgPSAwOworCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7CisgICAgICAgIGlmIChody0+bW5nX2Nvb2tpZS52bGFuX2lkICE9IDApIHsKKyAgICAgICAgICAgIC8qIFRoZSBWRlRBIGlzIGEgNDA5NmIgYml0LWZpZWxkLCBlYWNoIGlkZW50aWZ5aW5nIGEgc2luZ2xlIFZMQU4KKyAgICAgICAgICAgICAqIElELiAgVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGRldGVybWluZSB3aGljaCAzMmIgZW50cnkKKyAgICAgICAgICAgICAqIChpLmUuIG9mZnNldCkgaW50byB0aGUgYXJyYXkgd2Ugd2FudCB0byBzZXQgdGhlIFZMQU4gSUQKKyAgICAgICAgICAgICAqIChpLmUuIGJpdCkgb2YgdGhlIG1hbmFnZWFiaWxpdHkgdW5pdC4gKi8KKyAgICAgICAgICAgIHZmdGFfb2Zmc2V0ID0gKGh3LT5tbmdfY29va2llLnZsYW5faWQgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX1ZGVEFfRU5UUllfU0hJRlQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfVkZUQV9FTlRSWV9NQVNLOworICAgICAgICAgICAgdmZ0YV9iaXRfaW5fcmVnID0gMSA8PCAoaHctPm1uZ19jb29raWUudmxhbl9pZCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9WRlRBX0VOVFJZX0JJVF9TSElGVF9NQVNLKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IEUxMDAwX1ZMQU5fRklMVEVSX1RCTF9TSVpFOyBvZmZzZXQrKykgeworICAgICAgICAvKiBJZiB0aGUgb2Zmc2V0IHdlIHdhbnQgdG8gY2xlYXIgaXMgdGhlIHNhbWUgb2Zmc2V0IG9mIHRoZQorICAgICAgICAgKiBtYW5hZ2VhYmlsaXR5IFZMQU4gSUQsIHRoZW4gY2xlYXIgYWxsIGJpdHMgZXhjZXB0IHRoYXQgb2YgdGhlCisgICAgICAgICAqIG1hbmFnZWFiaWxpdHkgdW5pdCAqLworICAgICAgICB2ZnRhX3ZhbHVlID0gKG9mZnNldCA9PSB2ZnRhX29mZnNldCkgPyB2ZnRhX2JpdF9pbl9yZWcgOiAwOworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFZGVEEsIG9mZnNldCwgdmZ0YV92YWx1ZSk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQzMl90CitlMTAwMF9pZF9sZWRfaW5pdChzdHJ1Y3QgZTEwMDBfaHcgKiBodykKK3sKKyAgICB1aW50MzJfdCBsZWRjdGw7CisgICAgY29uc3QgdWludDMyX3QgbGVkY3RsX21hc2sgPSAweDAwMDAwMEZGOworICAgIGNvbnN0IHVpbnQzMl90IGxlZGN0bF9vbiA9IEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PTjsKKyAgICBjb25zdCB1aW50MzJfdCBsZWRjdGxfb2ZmID0gRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRjsKKyAgICB1aW50MTZfdCBlZXByb21fZGF0YSwgaSwgdGVtcDsKKyAgICBjb25zdCB1aW50MTZfdCBsZWRfbWFzayA9IDB4MEY7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2lkX2xlZF9pbml0Iik7CisKKyAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDApIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBsZWRjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgTEVEQ1RMKTsKKyAgICBody0+bGVkY3RsX2RlZmF1bHQgPSBsZWRjdGw7CisgICAgaHctPmxlZGN0bF9tb2RlMSA9IGh3LT5sZWRjdGxfZGVmYXVsdDsKKyAgICBody0+bGVkY3RsX21vZGUyID0gaHctPmxlZGN0bF9kZWZhdWx0OworCisgICAgaWYgKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fSURfTEVEX1NFVFRJTkdTLCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgeworICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgfQorCisgICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpICYmCisgICAgICAgIChlZXByb21fZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfODI1NzMpKQorICAgICAgICBlZXByb21fZGF0YSA9IElEX0xFRF9ERUZBVUxUXzgyNTczOworICAgIGVsc2UgaWYgKChlZXByb21fZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfMDAwMCkgfHwKKyAgICAgICAgICAgIChlZXByb21fZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfRkZGRikpIHsKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKQorICAgICAgICAgICAgZWVwcm9tX2RhdGEgPSBJRF9MRURfREVGQVVMVF9JQ0g4TEFOOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlZXByb21fZGF0YSA9IElEX0xFRF9ERUZBVUxUOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgdGVtcCA9IChlZXByb21fZGF0YSA+PiAoaSA8PCAyKSkgJiBsZWRfbWFzazsKKyAgICAgICAgc3dpdGNoICh0ZW1wKSB7CisgICAgICAgIGNhc2UgSURfTEVEX09OMV9ERUYyOgorICAgICAgICBjYXNlIElEX0xFRF9PTjFfT04yOgorICAgICAgICBjYXNlIElEX0xFRF9PTjFfT0ZGMjoKKyAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTEgJj0gfihsZWRjdGxfbWFzayA8PCAoaSA8PCAzKSk7CisgICAgICAgICAgICBody0+bGVkY3RsX21vZGUxIHw9IGxlZGN0bF9vbiA8PCAoaSA8PCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElEX0xFRF9PRkYxX0RFRjI6CisgICAgICAgIGNhc2UgSURfTEVEX09GRjFfT04yOgorICAgICAgICBjYXNlIElEX0xFRF9PRkYxX09GRjI6CisgICAgICAgICAgICBody0+bGVkY3RsX21vZGUxICY9IH4obGVkY3RsX21hc2sgPDwgKGkgPDwgMykpOworICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMSB8PSBsZWRjdGxfb2ZmIDw8IChpIDw8IDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBEbyBub3RoaW5nICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHRlbXApIHsKKyAgICAgICAgY2FzZSBJRF9MRURfREVGMV9PTjI6CisgICAgICAgIGNhc2UgSURfTEVEX09OMV9PTjI6CisgICAgICAgIGNhc2UgSURfTEVEX09GRjFfT04yOgorICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMiAmPSB+KGxlZGN0bF9tYXNrIDw8IChpIDw8IDMpKTsKKyAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTIgfD0gbGVkY3RsX29uIDw8IChpIDw8IDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSURfTEVEX0RFRjFfT0ZGMjoKKyAgICAgICAgY2FzZSBJRF9MRURfT04xX09GRjI6CisgICAgICAgIGNhc2UgSURfTEVEX09GRjFfT0ZGMjoKKyAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTIgJj0gfihsZWRjdGxfbWFzayA8PCAoaSA8PCAzKSk7CisgICAgICAgICAgICBody0+bGVkY3RsX21vZGUyIHw9IGxlZGN0bF9vZmYgPDwgKGkgPDwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcmVwYXJlcyBTVyBjb250cm9sYWJsZSBMRUQgZm9yIHVzZSBhbmQgc2F2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIExFRC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfc2V0dXBfbGVkKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgbGVkY3RsOworICAgIGludDMyX3QgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldHVwX2xlZCIpOworCisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICBjYXNlIGUxMDAwXzgyNTQzOgorICAgIGNhc2UgZTEwMDBfODI1NDQ6CisgICAgICAgIC8qIE5vIHNldHVwIG5lY2Vzc2FyeSAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTQxOgorICAgIGNhc2UgZTEwMDBfODI1NDc6CisgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKyAgICBjYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorICAgICAgICAvKiBUdXJuIG9mZiBQSFkgU21hcnQgUG93ZXIgRG93biAoaWYgZW5hYmxlZCkgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh3LT5waHlfc3BkX2RlZmF1bHQpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoaHctPnBoeV9zcGRfZGVmYXVsdCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5JR1AwMUUxMDAwX0dNSUlfU1BEKSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIC8qIEZhbGwgVGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CisgICAgICAgICAgICBsZWRjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgTEVEQ1RMKTsKKyAgICAgICAgICAgIC8qIFNhdmUgY3VycmVudCBMRURDVEwgc2V0dGluZ3MgKi8KKyAgICAgICAgICAgIGh3LT5sZWRjdGxfZGVmYXVsdCA9IGxlZGN0bDsKKyAgICAgICAgICAgIC8qIFR1cm4gb2ZmIExFRDAgKi8KKyAgICAgICAgICAgIGxlZGN0bCAmPSB+KEUxMDAwX0xFRENUTF9MRUQwX0lWUlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfTEVEQ1RMX0xFRDBfQkxJTksgfAorICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfTEVEQ1RMX0xFRDBfTU9ERV9NQVNLKTsKKyAgICAgICAgICAgIGxlZGN0bCB8PSAoRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRiA8PAorICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9MRURDVExfTEVEMF9NT0RFX1NISUZUKTsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBsZWRjdGwpOworICAgICAgICB9IGVsc2UgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKQorICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGh3LT5sZWRjdGxfbW9kZTEpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVc2VkIG9uIDgyNTcxIGFuZCBsYXRlciBTaSB0aGF0IGhhcyBMRUQgYmxpbmsgYml0cy4KKyAqIENhbGxlcnMgbXVzdCB1c2UgdGhlaXIgb3duIHRpbWVyIGFuZCBzaG91bGQgaGF2ZSBhbHJlYWR5IGNhbGxlZAorICogZTEwMDBfaWRfbGVkX2luaXQoKQorICogQ2FsbCBlMTAwMF9jbGVhbnVwIGxlZCgpIHRvIHN0b3AgYmxpbmtpbmcKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfYmxpbmtfbGVkX3N0YXJ0KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MTZfdCAgaTsKKyAgICB1aW50MzJfdCBsZWRjdGxfYmxpbmsgPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9pZF9sZWRfYmxpbmtfb24iKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgPCBlMTAwMF84MjU3MSkgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgIH0KKyAgICBpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworICAgICAgICAvKiBhbHdheXMgYmxpbmsgTEVEMCBmb3IgUENJLUUgZmliZXIgKi8KKyAgICAgICAgbGVkY3RsX2JsaW5rID0gRTEwMDBfTEVEQ1RMX0xFRDBfQkxJTksgfAorICAgICAgICAgICAgICAgICAgICAgKEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PTiA8PCBFMTAwMF9MRURDVExfTEVEMF9NT0RFX1NISUZUKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBzZXQgdGhlIGJsaW5rIGJpdCBmb3IgZWFjaCBMRUQgdGhhdCdzICJvbiIgKDB4MEUpIGluIGxlZGN0bF9tb2RlMiAqLworICAgICAgICBsZWRjdGxfYmxpbmsgPSBody0+bGVkY3RsX21vZGUyOworICAgICAgICBmb3IgKGk9MDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIGlmICgoKGh3LT5sZWRjdGxfbW9kZTIgPj4gKGkgKiA4KSkgJiAweEZGKSA9PQorICAgICAgICAgICAgICAgIEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PTikKKyAgICAgICAgICAgICAgICBsZWRjdGxfYmxpbmsgfD0gKEUxMDAwX0xFRENUTF9MRUQwX0JMSU5LIDw8IChpICogOCkpOworICAgIH0KKworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBsZWRjdGxfYmxpbmspOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlc3RvcmVzIHRoZSBzYXZlZCBzdGF0ZSBvZiB0aGUgU1cgY29udHJvbGFibGUgTEVELgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9jbGVhbnVwX2xlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2NsZWFudXBfbGVkIik7CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgIGNhc2UgZTEwMDBfODI1NDM6CisgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgLyogTm8gY2xlYW51cCBuZWNlc3NhcnkgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICBjYXNlIGUxMDAwXzgyNTQ3OgorICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisgICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKyAgICAgICAgLyogVHVybiBvbiBQSFkgU21hcnQgUG93ZXIgRG93biAoaWYgcHJldmlvdXNseSBlbmFibGVkKSAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5waHlfc3BkX2RlZmF1bHQpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAvKiBGYWxsIFRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZmUpIHsKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MX0xFRCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBSZXN0b3JlIExFRENUTCBzZXR0aW5ncyAqLworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgaHctPmxlZGN0bF9kZWZhdWx0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFR1cm5zIG9uIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVECisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2xlZF9vbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2xlZF9vbiIpOworCisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICBjYXNlIGUxMDAwXzgyNTQzOgorICAgICAgICAvKiBTZXQgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9uIHRoZSBMRUQgKi8KKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTjA7CisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTQ0OgorICAgICAgICBpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworICAgICAgICAgICAgLyogU2V0IFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvbiB0aGUgTEVEICovCisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElOMDsKKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQ2xlYXIgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9uIHRoZSBMRUQgKi8KKyAgICAgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfU1dEUElOMDsKKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CisgICAgICAgICAgICAvKiBDbGVhciBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb24gdGhlIExFRCAqLworICAgICAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZmUpIHsKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MX0xFRCwKKyAgICAgICAgICAgICAgICAgKElGRV9QU0NMX1BST0JFX01PREUgfCBJRkVfUFNDTF9QUk9CRV9MRURTX09OKSk7CisgICAgICAgIH0gZWxzZSBpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBody0+bGVkY3RsX21vZGUyKTsKKyAgICAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHVybnMgb2ZmIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVECisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2xlZF9vZmYoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9sZWRfb2ZmIik7CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgIGNhc2UgZTEwMDBfODI1NDM6CisgICAgICAgIC8qIENsZWFyIFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvZmYgdGhlIExFRCAqLworICAgICAgICBjdHJsICY9IH5FMTAwMF9DVFJMX1NXRFBJTjA7CisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTQ0OgorICAgICAgICBpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworICAgICAgICAgICAgLyogQ2xlYXIgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9mZiB0aGUgTEVEICovCisgICAgICAgICAgICBjdHJsICY9IH5FMTAwMF9DVFJMX1NXRFBJTjA7CisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb2ZmIHRoZSBMRUQgKi8KKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKyAgICAgICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb2ZmIHRoZSBMRUQgKi8KKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZmUpIHsKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MX0xFRCwKKyAgICAgICAgICAgICAgICAgKElGRV9QU0NMX1BST0JFX01PREUgfCBJRkVfUFNDTF9QUk9CRV9MRURTX09GRikpOworICAgICAgICB9IGVsc2UgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgaHctPmxlZGN0bF9tb2RlMSk7CisgICAgICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENsZWFycyBhbGwgaGFyZHdhcmUgc3RhdGlzdGljcyBjb3VudGVycy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2NsZWFyX2h3X2NudHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdGVtcDsKKworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1JDRVJSUyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBTWU1FUlJTKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1QQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBTQ0MpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgRUNPTCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNQ0MpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTEFURUNPTCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDT0xDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIERDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNFQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSTEVDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFhPTlJYQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBYT05UWEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgWE9GRlJYQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBYT0ZGVFhDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEZDUlVDKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgeworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDNjQpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTI3KTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzI1NSk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkM1MTEpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTAyMyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMxNTIyKTsKKyAgICB9CisKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEdQUkMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgQlBSQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNUFJDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEdQVEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgR09SQ0wpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgR09SQ0gpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgR09UQ0wpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgR09UQ0gpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUk5CQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSVUMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUkZDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJPQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSSkMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVE9STCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUT1JIKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRPVEwpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVE9USCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUUFIpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVFBUKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgeworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDNjQpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMTI3KTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzI1NSk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEM1MTEpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMTAyMyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMxNTIyKTsKKyAgICB9CisKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1QVEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgQlBUQyk7CisKKyAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpIHJldHVybjsKKworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgQUxHTkVSUkMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUlhFUlJDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFROQ1JTKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIENFWFRFUlIpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVFNDVEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVFNDVEZDKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDQpIHJldHVybjsKKworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTUdUUFJDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1HVFBEQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNR1RQVEMpOworCisgICAgaWYgKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikgcmV0dXJuOworCisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQUMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWE9DKTsKKworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgcmV0dXJuOworCisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYUFRDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUlhBVEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNUWFBUQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYQVRDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDVFhRRUMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNUWFFNVEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWERNVEMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXNldHMgQWRhcHRpdmUgSUZTIHRvIGl0cyBkZWZhdWx0IHN0YXRlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogQ2FsbCB0aGlzIGFmdGVyIGUxMDAwX2luaXRfaHcuIFlvdSBtYXkgb3ZlcnJpZGUgdGhlIElGUyBkZWZhdWx0cyBieSBzZXR0aW5nCisgKiBody0+aWZzX3BhcmFtc19mb3JjZWQgdG8gVFJVRS4gSG93ZXZlciwgeW91IG11c3QgaW5pdGlhbGl6ZSBody0+CisgKiBjdXJyZW50X2lmc192YWwsIGlmc19taW5fdmFsLCBpZnNfbWF4X3ZhbCwgaWZzX3N0ZXBfc2l6ZSwgYW5kIGlmc19yYXRpbworICogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX3Jlc2V0X2FkYXB0aXZlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgREVCVUdGVU5DKCJlMTAwMF9yZXNldF9hZGFwdGl2ZSIpOworCisgICAgaWYgKGh3LT5hZGFwdGl2ZV9pZnMpIHsKKyAgICAgICAgaWYgKCFody0+aWZzX3BhcmFtc19mb3JjZWQpIHsKKyAgICAgICAgICAgIGh3LT5jdXJyZW50X2lmc192YWwgPSAwOworICAgICAgICAgICAgaHctPmlmc19taW5fdmFsID0gSUZTX01JTjsKKyAgICAgICAgICAgIGh3LT5pZnNfbWF4X3ZhbCA9IElGU19NQVg7CisgICAgICAgICAgICBody0+aWZzX3N0ZXBfc2l6ZSA9IElGU19TVEVQOworICAgICAgICAgICAgaHctPmlmc19yYXRpbyA9IElGU19SQVRJTzsKKyAgICAgICAgfQorICAgICAgICBody0+aW5faWZzX21vZGUgPSBGQUxTRTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBBSVQsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQlVHT1VUKCJOb3QgaW4gQWRhcHRpdmUgSUZTIG1vZGUhXG4iKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENhbGxlZCBkdXJpbmcgdGhlIGNhbGxiYWNrL3dhdGNoZG9nIHJvdXRpbmUgdG8gdXBkYXRlIElGUyB2YWx1ZSBiYXNlZCBvbgorICogdGhlIHJhdGlvIG9mIHRyYW5zbWl0cyB0byBjb2xsaXNpb25zLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiB0eF9wYWNrZXRzIC0gTnVtYmVyIG9mIHRyYW5zbWl0cyBzaW5jZSBsYXN0IGNhbGxiYWNrCisgKiB0b3RhbF9jb2xsaXNpb25zIC0gTnVtYmVyIG9mIGNvbGxpc2lvbnMgc2luY2UgbGFzdCBjYWxsYmFjaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfdXBkYXRlX2FkYXB0aXZlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgREVCVUdGVU5DKCJlMTAwMF91cGRhdGVfYWRhcHRpdmUiKTsKKworICAgIGlmIChody0+YWRhcHRpdmVfaWZzKSB7CisgICAgICAgIGlmICgoaHctPmNvbGxpc2lvbl9kZWx0YSAqIGh3LT5pZnNfcmF0aW8pID4gaHctPnR4X3BhY2tldF9kZWx0YSkgeworICAgICAgICAgICAgaWYgKGh3LT50eF9wYWNrZXRfZGVsdGEgPiBNSU5fTlVNX1hNSVRTKSB7CisgICAgICAgICAgICAgICAgaHctPmluX2lmc19tb2RlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBpZiAoaHctPmN1cnJlbnRfaWZzX3ZhbCA8IGh3LT5pZnNfbWF4X3ZhbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaHctPmN1cnJlbnRfaWZzX3ZhbCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaHctPmN1cnJlbnRfaWZzX3ZhbCA9IGh3LT5pZnNfbWluX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaHctPmN1cnJlbnRfaWZzX3ZhbCArPSBody0+aWZzX3N0ZXBfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBBSVQsIGh3LT5jdXJyZW50X2lmc192YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChody0+aW5faWZzX21vZGUgJiYgKGh3LT50eF9wYWNrZXRfZGVsdGEgPD0gTUlOX05VTV9YTUlUUykpIHsKKyAgICAgICAgICAgICAgICBody0+Y3VycmVudF9pZnNfdmFsID0gMDsKKyAgICAgICAgICAgICAgICBody0+aW5faWZzX21vZGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEFJVCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBERUJVR09VVCgiTm90IGluIEFkYXB0aXZlIElGUyBtb2RlIVxuIik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZGp1c3RzIHRoZSBzdGF0aXN0aWMgY291bnRlcnMgd2hlbiBhIGZyYW1lIGlzIGFjY2VwdGVkIGJ5IFRCSV9BQ0NFUFQKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogZnJhbWVfbGVuIC0gVGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgaW4gcXVlc3Rpb24KKyAqIG1hY19hZGRyIC0gVGhlIEV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIGZyYW1lIGluIHF1ZXN0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF90YmlfYWRqdXN0X3N0YXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9od19zdGF0cyAqc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbWFjX2FkZHIpCit7CisgICAgdWludDY0X3QgY2FycnlfYml0OworCisgICAgLyogRmlyc3QgYWRqdXN0IHRoZSBmcmFtZSBsZW5ndGguICovCisgICAgZnJhbWVfbGVuLS07CisgICAgLyogV2UgbmVlZCB0byBhZGp1c3QgdGhlIHN0YXRpc3RpY3MgY291bnRlcnMsIHNpbmNlIHRoZSBoYXJkd2FyZQorICAgICAqIGNvdW50ZXJzIG92ZXJjb3VudCB0aGlzIHBhY2tldCBhcyBhIENSQyBlcnJvciBhbmQgdW5kZXJjb3VudAorICAgICAqIHRoZSBwYWNrZXQgYXMgYSBnb29kIHBhY2tldAorICAgICAqLworICAgIC8qIFRoaXMgcGFja2V0IHNob3VsZCBub3QgYmUgY291bnRlZCBhcyBhIENSQyBlcnJvci4gICAgKi8KKyAgICBzdGF0cy0+Y3JjZXJycy0tOworICAgIC8qIFRoaXMgcGFja2V0IGRvZXMgY291bnQgYXMgYSBHb29kIFBhY2tldCBSZWNlaXZlZC4gICAgKi8KKyAgICBzdGF0cy0+Z3ByYysrOworCisgICAgLyogQWRqdXN0IHRoZSBHb29kIE9jdGV0cyByZWNlaXZlZCBjb3VudGVycyAgICAgICAgICAgICAqLworICAgIGNhcnJ5X2JpdCA9IDB4ODAwMDAwMDAgJiBzdGF0cy0+Z29yY2w7CisgICAgc3RhdHMtPmdvcmNsICs9IGZyYW1lX2xlbjsKKyAgICAvKiBJZiB0aGUgaGlnaCBiaXQgb2YgR29yY2wgKHRoZSBsb3cgMzIgYml0cyBvZiB0aGUgR29vZCBPY3RldHMKKyAgICAgKiBSZWNlaXZlZCBDb3VudCkgd2FzIG9uZSBiZWZvcmUgdGhlIGFkZGl0aW9uLAorICAgICAqIEFORCBpdCBpcyB6ZXJvIGFmdGVyLCB0aGVuIHdlIGxvc3QgdGhlIGNhcnJ5IG91dCwKKyAgICAgKiBuZWVkIHRvIGFkZCBvbmUgdG8gR29yY2ggKEdvb2QgT2N0ZXRzIFJlY2VpdmVkIENvdW50IEhpZ2gpLgorICAgICAqIFRoaXMgY291bGQgYmUgc2ltcGxpZmllZCBpZiBhbGwgZW52aXJvbm1lbnRzIHN1cHBvcnRlZAorICAgICAqIDY0LWJpdCBpbnRlZ2Vycy4KKyAgICAgKi8KKyAgICBpZiAoY2FycnlfYml0ICYmICgoc3RhdHMtPmdvcmNsICYgMHg4MDAwMDAwMCkgPT0gMCkpCisgICAgICAgIHN0YXRzLT5nb3JjaCsrOworICAgIC8qIElzIHRoaXMgYSBicm9hZGNhc3Qgb3IgbXVsdGljYXN0PyAgQ2hlY2sgYnJvYWRjYXN0IGZpcnN0LAorICAgICAqIHNpbmNlIHRoZSB0ZXN0IGZvciBhIG11bHRpY2FzdCBmcmFtZSB3aWxsIHRlc3QgcG9zaXRpdmUgb24KKyAgICAgKiBhIGJyb2FkY2FzdCBmcmFtZS4KKyAgICAgKi8KKyAgICBpZiAoKG1hY19hZGRyWzBdID09ICh1aW50OF90KSAweGZmKSAmJiAobWFjX2FkZHJbMV0gPT0gKHVpbnQ4X3QpIDB4ZmYpKQorICAgICAgICAvKiBCcm9hZGNhc3QgcGFja2V0ICovCisgICAgICAgIHN0YXRzLT5icHJjKys7CisgICAgZWxzZSBpZiAoKm1hY19hZGRyICYgMHgwMSkKKyAgICAgICAgLyogTXVsdGljYXN0IHBhY2tldCAqLworICAgICAgICBzdGF0cy0+bXByYysrOworCisgICAgaWYgKGZyYW1lX2xlbiA9PSBody0+bWF4X2ZyYW1lX3NpemUpIHsKKyAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgaGFyZHdhcmUgaGFzIG92ZXJjb3VudGVkIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICogb3ZlcnNpemUgZnJhbWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHN0YXRzLT5yb2MgPiAwKQorICAgICAgICAgICAgc3RhdHMtPnJvYy0tOworICAgIH0KKworICAgIC8qIEFkanVzdCB0aGUgYmluIGNvdW50ZXJzIHdoZW4gdGhlIGV4dHJhIGJ5dGUgcHV0IHRoZSBmcmFtZSBpbiB0aGUKKyAgICAgKiB3cm9uZyBiaW4uIFJlbWVtYmVyIHRoYXQgdGhlIGZyYW1lX2xlbiB3YXMgYWRqdXN0ZWQgYWJvdmUuCisgICAgICovCisgICAgaWYgKGZyYW1lX2xlbiA9PSA2NCkgeworICAgICAgICBzdGF0cy0+cHJjNjQrKzsKKyAgICAgICAgc3RhdHMtPnByYzEyNy0tOworICAgIH0gZWxzZSBpZiAoZnJhbWVfbGVuID09IDEyNykgeworICAgICAgICBzdGF0cy0+cHJjMTI3Kys7CisgICAgICAgIHN0YXRzLT5wcmMyNTUtLTsKKyAgICB9IGVsc2UgaWYgKGZyYW1lX2xlbiA9PSAyNTUpIHsKKyAgICAgICAgc3RhdHMtPnByYzI1NSsrOworICAgICAgICBzdGF0cy0+cHJjNTExLS07CisgICAgfSBlbHNlIGlmIChmcmFtZV9sZW4gPT0gNTExKSB7CisgICAgICAgIHN0YXRzLT5wcmM1MTErKzsKKyAgICAgICAgc3RhdHMtPnByYzEwMjMtLTsKKyAgICB9IGVsc2UgaWYgKGZyYW1lX2xlbiA9PSAxMDIzKSB7CisgICAgICAgIHN0YXRzLT5wcmMxMDIzKys7CisgICAgICAgIHN0YXRzLT5wcmMxNTIyLS07CisgICAgfSBlbHNlIGlmIChmcmFtZV9sZW4gPT0gMTUyMikgeworICAgICAgICBzdGF0cy0+cHJjMTUyMisrOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2V0cyB0aGUgY3VycmVudCBQQ0kgYnVzIHR5cGUsIHNwZWVkLCBhbmQgd2lkdGggb2YgdGhlIGhhcmR3YXJlCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX2dldF9idXNfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwY2lfZXhfbGlua19zdGF0dXM7CisgICAgdWludDMyX3Qgc3RhdHVzOworCisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICAgICAgaHctPmJ1c190eXBlID0gZTEwMDBfYnVzX3R5cGVfcGNpOworICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkX3Vua25vd247CisgICAgICAgIGh3LT5idXNfd2lkdGggPSBlMTAwMF9idXNfd2lkdGhfdW5rbm93bjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU3MToKKyAgICBjYXNlIGUxMDAwXzgyNTcyOgorICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKKyAgICBjYXNlIGUxMDAwXzgyNTc2OgorICAgICAgICBody0+YnVzX3R5cGUgPSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzczsKKyAgICAgICAgaHctPmJ1c19zcGVlZCA9IGUxMDAwX2J1c19zcGVlZF8yNTAwOworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9wY2llX2NhcF9yZWcoaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9FWF9MSU5LX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBjaV9leF9saW5rX3N0YXR1cyk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgaHctPmJ1c193aWR0aCA9IGUxMDAwX2J1c193aWR0aF91bmtub3duOworICAgICAgICBlbHNlCisgICAgICAgICAgICBody0+YnVzX3dpZHRoID0gKHBjaV9leF9saW5rX3N0YXR1cyAmIFBDSV9FWF9MSU5LX1dJRFRIX01BU0spID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9FWF9MSU5LX1dJRFRIX1NISUZUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwX2ljaDhsYW46CisgICAgICAgIGh3LT5idXNfdHlwZSA9IGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzOworICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkXzI1MDA7CisgICAgICAgIGh3LT5idXNfd2lkdGggPSBlMTAwMF9idXNfd2lkdGhfcGNpZXhfMTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisgICAgICAgIGh3LT5idXNfdHlwZSA9IChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfUENJWF9NT0RFKSA/CisgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2J1c190eXBlX3BjaXggOiBlMTAwMF9idXNfdHlwZV9wY2k7CisKKyAgICAgICAgaWYgKGh3LT5kZXZpY2VfaWQgPT0gRTEwMDBfREVWX0lEXzgyNTQ2RUJfUVVBRF9DT1BQRVIpIHsKKyAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2J1c19zcGVlZF82NiA6IGUxMDAwX2J1c19zcGVlZF8xMjA7CisgICAgICAgIH0gZWxzZSBpZiAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaSkgeworICAgICAgICAgICAgaHctPmJ1c19zcGVlZCA9IChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfUENJNjYpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9idXNfc3BlZWRfNjYgOiBlMTAwMF9idXNfc3BlZWRfMzM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEKSB7CisgICAgICAgICAgICBjYXNlIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzY2OgorICAgICAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfNjY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEwMDoKKyAgICAgICAgICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkXzEwMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfMTMzOgorICAgICAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfMTMzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkX3Jlc2VydmVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGh3LT5idXNfd2lkdGggPSAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0JVUzY0KSA/CisgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9idXNfd2lkdGhfNjQgOiBlMTAwMF9idXNfd2lkdGhfMzI7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgdmFsdWUgdG8gb25lIG9mIHRoZSBkZXZpY2VzIHJlZ2lzdGVycyB1c2luZyBwb3J0IEkvTyAoYXMgb3Bwb3NlZCB0bworICogbWVtb3J5IG1hcHBlZCBJL08pLiBPbmx5IDgyNTQ0IGFuZCBuZXdlciBkZXZpY2VzIHN1cHBvcnQgcG9ydCBJL08uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCB0byB3cml0ZSB0bworICogdmFsdWUgLSB2YWx1ZSB0byB3cml0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3dyaXRlX3JlZ19pbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGlvX2FkZHIgPSBody0+aW9fYmFzZTsKKyAgICB1bnNpZ25lZCBsb25nIGlvX2RhdGEgPSBody0+aW9fYmFzZSArIDQ7CisKKyAgICBlMTAwMF9pb193cml0ZShodywgaW9fYWRkciwgb2Zmc2V0KTsKKyAgICBlMTAwMF9pb193cml0ZShodywgaW9fZGF0YSwgdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFc3RpbWF0ZXMgdGhlIGNhYmxlIGxlbmd0aC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogbWluX2xlbmd0aCAtIFRoZSBlc3RpbWF0ZWQgbWluaW11bSBsZW5ndGgKKyAqIG1heF9sZW5ndGggLSBUaGUgZXN0aW1hdGVkIG1heGltdW0gbGVuZ3RoCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfWFhYCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGEgcmFuZ2VkIGxlbmd0aCAobWluaW11bSAmIG1heGltdW0pLgorICogU28gZm9yIE04OCBwaHkncywgdGhpcyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoZSBvbmUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUKKyAqIHJlZ2lzdGVyIHRvIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHJhbmdlLgorICogRm9yIElHUCBwaHkncywgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHJhbmdlIGJ5IHRoZSBBR0MgcmVnaXN0ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2dldF9jYWJsZV9sZW5ndGgoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKm1pbl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICptYXhfbGVuZ3RoKQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBhZ2NfdmFsdWUgPSAwOworICAgIHVpbnQxNl90IGksIHBoeV9kYXRhOworICAgIHVpbnQxNl90IGNhYmxlX2xlbmd0aDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfZ2V0X2NhYmxlX2xlbmd0aCIpOworCisgICAgKm1pbl9sZW5ndGggPSAqbWF4X2xlbmd0aCA9IDA7CisKKyAgICAvKiBVc2Ugb2xkIG1ldGhvZCBmb3IgUGh5IG9sZGVyIHRoYW4gSUdQICovCisgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIGNhYmxlX2xlbmd0aCA9IChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIKSA+PgorICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSF9TSElGVDsKKworICAgICAgICAvKiBDb252ZXJ0IHRoZSBlbnVtIHZhbHVlIHRvIHJhbmdlZCB2YWx1ZXMgKi8KKyAgICAgICAgc3dpdGNoIChjYWJsZV9sZW5ndGgpIHsKKyAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfNTA6CisgICAgICAgICAgICAqbWluX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfNTBfODA6CisgICAgICAgICAgICAqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTA7CisgICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfODA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfODBfMTEwOgorICAgICAgICAgICAgKm1pbl9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzgwOworICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGUxMDAwX2NhYmxlX2xlbmd0aF8xMTBfMTQwOgorICAgICAgICAgICAgKm1pbl9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExMDsKKyAgICAgICAgICAgICptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfMTQwOgorICAgICAgICAgICAgKm1pbl9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE0MDsKKyAgICAgICAgICAgICptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfRFNQX0RJU1RBTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIGNhYmxlX2xlbmd0aCA9IHBoeV9kYXRhICYgR0c4MjU2M19EU1BEX0NBQkxFX0xFTkdUSDsKKworICAgICAgICBzd2l0Y2ggKGNhYmxlX2xlbmd0aCkgeworICAgICAgICBjYXNlIGUxMDAwX2dnX2NhYmxlX2xlbmd0aF82MDoKKyAgICAgICAgICAgICptaW5fbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF82MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGUxMDAwX2dnX2NhYmxlX2xlbmd0aF82MF8xMTU6CisgICAgICAgICAgICAqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNjA7CisgICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTE1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfZ2dfY2FibGVfbGVuZ3RoXzExNV8xNTA6CisgICAgICAgICAgICAqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTE1OworICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE1MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGUxMDAwX2dnX2NhYmxlX2xlbmd0aF8xNTA6CisgICAgICAgICAgICAqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTUwOworICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7IC8qIEZvciBJR1AgUEhZICovCisgICAgICAgIHVpbnQxNl90IGN1cl9hZ2NfdmFsdWU7CisgICAgICAgIHVpbnQxNl90IG1pbl9hZ2NfdmFsdWUgPSBJR1AwMUUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRTsKKyAgICAgICAgdWludDE2X3QgYWdjX3JlZ19hcnJheVtJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0lHUDAxRTEwMDBfUEhZX0FHQ19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19EfTsKKyAgICAgICAgLyogUmVhZCB0aGUgQUdDIHJlZ2lzdGVycyBmb3IgYWxsIGNoYW5uZWxzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTTsgaSsrKSB7CisKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIGFnY19yZWdfYXJyYXlbaV0sICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgY3VyX2FnY192YWx1ZSA9IHBoeV9kYXRhID4+IElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVDsKKworICAgICAgICAgICAgLyogVmFsdWUgYm91bmQgY2hlY2suICovCisgICAgICAgICAgICBpZiAoKGN1cl9hZ2NfdmFsdWUgPj0gSUdQMDFFMTAwMF9BR0NfTEVOR1RIX1RBQkxFX1NJWkUgLSAxKSB8fAorICAgICAgICAgICAgICAgIChjdXJfYWdjX3ZhbHVlID09IDApKQorICAgICAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWTsKKworICAgICAgICAgICAgYWdjX3ZhbHVlICs9IGN1cl9hZ2NfdmFsdWU7CisKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBtaW5pbWFsIEFHQyB2YWx1ZS4gKi8KKyAgICAgICAgICAgIGlmIChtaW5fYWdjX3ZhbHVlID4gY3VyX2FnY192YWx1ZSkKKyAgICAgICAgICAgICAgICBtaW5fYWdjX3ZhbHVlID0gY3VyX2FnY192YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlbW92ZSB0aGUgbWluaW1hbCBBR0MgcmVzdWx0IGZvciBsZW5ndGggPCA1MG0gKi8KKyAgICAgICAgaWYgKGFnY192YWx1ZSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNICogZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkgeworICAgICAgICAgICAgYWdjX3ZhbHVlIC09IG1pbl9hZ2NfdmFsdWU7CisKKyAgICAgICAgICAgIC8qIEdldCB0aGUgYXZlcmFnZSBsZW5ndGggb2YgdGhlIHJlbWFpbmluZyAzIGNoYW5uZWxzICovCisgICAgICAgICAgICBhZ2NfdmFsdWUgLz0gKElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNIC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBHZXQgdGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIGFsbCB0aGUgNCBjaGFubmVscy4gKi8KKyAgICAgICAgICAgIGFnY192YWx1ZSAvPSBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCB0aGUgcmFuZ2Ugb2YgdGhlIGNhbGN1bGF0ZWQgbGVuZ3RoLiAqLworICAgICAgICAqbWluX2xlbmd0aCA9ICgoZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF90YWJsZVthZ2NfdmFsdWVdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9BR0NfUkFOR0UpID4gMCkgPworICAgICAgICAgICAgICAgICAgICAgICAoZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF90YWJsZVthZ2NfdmFsdWVdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9BR0NfUkFOR0UpIDogMDsKKyAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoX3RhYmxlW2FnY192YWx1ZV0gKworICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfQUdDX1JBTkdFOworICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMiB8fAorICAgICAgICAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMykgeworICAgICAgICB1aW50MTZfdCBjdXJfYWdjX2luZGV4LCBtYXhfYWdjX2luZGV4ID0gMDsKKyAgICAgICAgdWludDE2X3QgbWluX2FnY19pbmRleCA9IElHUDAyRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFIC0gMTsKKyAgICAgICAgdWludDE2X3QgYWdjX3JlZ19hcnJheVtJR1AwMkUxMDAwX1BIWV9DSEFOTkVMX05VTV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0lHUDAyRTEwMDBfUEhZX0FHQ19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAyRTEwMDBfUEhZX0FHQ19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAyRTEwMDBfUEhZX0FHQ19DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAyRTEwMDBfUEhZX0FHQ19EfTsKKyAgICAgICAgLyogUmVhZCB0aGUgQUdDIHJlZ2lzdGVycyBmb3IgYWxsIGNoYW5uZWxzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBJR1AwMkUxMDAwX1BIWV9DSEFOTkVMX05VTTsgaSsrKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBhZ2NfcmVnX2FycmF5W2ldLCAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIC8qIEdldHRpbmcgYml0cyAxNTo5LCB3aGljaCByZXByZXNlbnQgdGhlIGNvbWJpbmF0aW9uIG9mIGNvdXJzZSBhbmQKKyAgICAgICAgICAgICAqIGZpbmUgZ2FpbiB2YWx1ZXMuICBUaGUgcmVzdWx0IGlzIGEgbnVtYmVyIHRoYXQgY2FuIGJlIHB1dCBpbnRvCisgICAgICAgICAgICAgKiB0aGUgbG9va3VwIHRhYmxlIHRvIG9idGFpbiB0aGUgYXBwcm94aW1hdGUgY2FibGUgbGVuZ3RoLiAqLworICAgICAgICAgICAgY3VyX2FnY19pbmRleCA9IChwaHlfZGF0YSA+PiBJR1AwMkUxMDAwX0FHQ19MRU5HVEhfU0hJRlQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMkUxMDAwX0FHQ19MRU5HVEhfTUFTSzsKKworICAgICAgICAgICAgLyogQXJyYXkgaW5kZXggYm91bmQgY2hlY2suICovCisgICAgICAgICAgICBpZiAoKGN1cl9hZ2NfaW5kZXggPj0gSUdQMDJFMTAwMF9BR0NfTEVOR1RIX1RBQkxFX1NJWkUpIHx8CisgICAgICAgICAgICAgICAgKGN1cl9hZ2NfaW5kZXggPT0gMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworCisgICAgICAgICAgICAvKiBSZW1vdmUgbWluICYgbWF4IEFHQyB2YWx1ZXMgZnJvbSBjYWxjdWxhdGlvbi4gKi8KKyAgICAgICAgICAgIGlmIChlMTAwMF9pZ3BfMl9jYWJsZV9sZW5ndGhfdGFibGVbbWluX2FnY19pbmRleF0gPgorICAgICAgICAgICAgICAgIGUxMDAwX2lncF8yX2NhYmxlX2xlbmd0aF90YWJsZVtjdXJfYWdjX2luZGV4XSkKKyAgICAgICAgICAgICAgICBtaW5fYWdjX2luZGV4ID0gY3VyX2FnY19pbmRleDsKKyAgICAgICAgICAgIGlmIChlMTAwMF9pZ3BfMl9jYWJsZV9sZW5ndGhfdGFibGVbbWF4X2FnY19pbmRleF0gPAorICAgICAgICAgICAgICAgIGUxMDAwX2lncF8yX2NhYmxlX2xlbmd0aF90YWJsZVtjdXJfYWdjX2luZGV4XSkKKyAgICAgICAgICAgICAgICBtYXhfYWdjX2luZGV4ID0gY3VyX2FnY19pbmRleDsKKworICAgICAgICAgICAgYWdjX3ZhbHVlICs9IGUxMDAwX2lncF8yX2NhYmxlX2xlbmd0aF90YWJsZVtjdXJfYWdjX2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIGFnY192YWx1ZSAtPSAoZTEwMDBfaWdwXzJfY2FibGVfbGVuZ3RoX3RhYmxlW21pbl9hZ2NfaW5kZXhdICsKKyAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9pZ3BfMl9jYWJsZV9sZW5ndGhfdGFibGVbbWF4X2FnY19pbmRleF0pOworICAgICAgICBhZ2NfdmFsdWUgLz0gKElHUDAyRTEwMDBfUEhZX0NIQU5ORUxfTlVNIC0gMik7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIGNhYmxlIGxlbmd0aCB3aXRoIHRoZSBlcnJvciByYW5nZSBvZiArLy0gMTAgbWV0ZXJzLiAqLworICAgICAgICAqbWluX2xlbmd0aCA9ICgoYWdjX3ZhbHVlIC0gSUdQMDJFMTAwMF9BR0NfUkFOR0UpID4gMCkgPworICAgICAgICAgICAgICAgICAgICAgICAoYWdjX3ZhbHVlIC0gSUdQMDJFMTAwMF9BR0NfUkFOR0UpIDogMDsKKyAgICAgICAgKm1heF9sZW5ndGggPSBhZ2NfdmFsdWUgKyBJR1AwMkUxMDAwX0FHQ19SQU5HRTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2sgdGhlIGNhYmxlIHBvbGFyaXR5CisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHBvbGFyaXR5IC0gb3V0cHV0IHBhcmFtZXRlciA6IDAgLSBQb2xhcml0eSBpcyBub3QgcmV2ZXJzZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBQb2xhcml0eSBpcyByZXZlcnNlZC4KKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9YWFgKKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUworICoKKyAqIEZvciBwaHkncyBvbGRlciB0aGVuIElHUCwgdGhpcyBmdW5jdGlvbiBzaW1wbHkgcmVhZHMgdGhlIHBvbGFyaXR5IGJpdCBpbiB0aGUKKyAqIFBoeSBTdGF0dXMgcmVnaXN0ZXIuICBGb3IgSUdQIHBoeSdzLCB0aGlzIGJpdCBpcyB2YWxpZCBvbmx5IGlmIGxpbmsgc3BlZWQgaXMKKyAqIDEwIE1icHMuICBJZiB0aGUgbGluayBzcGVlZCBpcyAxMDAgTWJwcyB0aGVyZSBpcyBubyBwb2xhcml0eSBzbyB0aGlzIGJpdCB3aWxsCisgKiByZXR1cm4gMC4gIElmIHRoZSBsaW5rIHNwZWVkIGlzIDEwMDAgTWJwcyB0aGUgcG9sYXJpdHkgc3RhdHVzIGlzIGluIHRoZQorICogSUdQMDFFMTAwMF9QSFlfUENTX0lOSVRfUkVHLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2NoZWNrX3BvbGFyaXR5KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICBlMTAwMF9yZXZfcG9sYXJpdHkgKnBvbGFyaXR5KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY2hlY2tfcG9sYXJpdHkiKTsKKworICAgIGlmICgoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHx8CisgICAgICAgIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpKSB7CisgICAgICAgIC8qIHJldHVybiB0aGUgUG9sYXJpdHkgYml0IGluIHRoZSBTdGF0dXMgcmVnaXN0ZXIuICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAqcG9sYXJpdHkgPSAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFkpID4+CisgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX1JFVl9QT0xBUklUWV9TSElGVCkgPworICAgICAgICAgICAgICAgICAgICAgZTEwMDBfcmV2X3BvbGFyaXR5X3JldmVyc2VkIDogZTEwMDBfcmV2X3BvbGFyaXR5X25vcm1hbDsKKworICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgfHwKKyAgICAgICAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMyB8fAorICAgICAgICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKSB7CisgICAgICAgIC8qIFJlYWQgdGhlIFN0YXR1cyByZWdpc3RlciB0byBjaGVjayB0aGUgc3BlZWQgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiBJZiBzcGVlZCBpcyAxMDAwIE1icHMsIG11c3QgcmVhZCB0aGUgSUdQMDFFMTAwMF9QSFlfUENTX0lOSVRfUkVHIHRvCisgICAgICAgICAqIGZpbmQgdGhlIHBvbGFyaXR5IHN0YXR1cyAqLworICAgICAgICBpZiAoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1NQRUVEX01BU0spID09CisgICAgICAgICAgIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xMDAwTUJQUykgeworCisgICAgICAgICAgICAvKiBSZWFkIHRoZSBHSUcgaW5pdGlhbGl6YXRpb24gUENTIHJlZ2lzdGVyICgweDAwQjQpICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QQ1NfSU5JVF9SRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgLyogQ2hlY2sgdGhlIHBvbGFyaXR5IGJpdHMgKi8KKyAgICAgICAgICAgICpwb2xhcml0eSA9IChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUEhZX1BPTEFSSVRZX01BU0spID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9yZXZfcG9sYXJpdHlfcmV2ZXJzZWQgOiBlMTAwMF9yZXZfcG9sYXJpdHlfbm9ybWFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRm9yIDEwIE1icHMsIHJlYWQgdGhlIHBvbGFyaXR5IGJpdCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyLiAoZm9yCisgICAgICAgICAgICAgKiAxMDAgTWJwcyB0aGlzIGJpdCBpcyBhbHdheXMgMCkgKi8KKyAgICAgICAgICAgICpwb2xhcml0eSA9IChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9QT0xBUklUWV9SRVZFUlNFRCkgPworICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX3Jldl9wb2xhcml0eV9yZXZlcnNlZCA6IGUxMDAwX3Jldl9wb2xhcml0eV9ub3JtYWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElGRV9QSFlfRVhURU5ERURfU1RBVFVTX0NPTlRST0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgKnBvbGFyaXR5ID0gKChwaHlfZGF0YSAmIElGRV9QRVNDX1BPTEFSSVRZX1JFVkVSU0VEKSA+PgorICAgICAgICAgICAgICAgICAgICAgSUZFX1BFU0NfUE9MQVJJVFlfUkVWRVJTRURfU0hJRlQpID8KKyAgICAgICAgICAgICAgICAgICAgIGUxMDAwX3Jldl9wb2xhcml0eV9yZXZlcnNlZCA6IGUxMDAwX3Jldl9wb2xhcml0eV9ub3JtYWw7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVjayBpZiBEb3duc2hpZnQgb2NjdXJlZAorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBkb3duc2hpZnQgLSBvdXRwdXQgcGFyYW1ldGVyIDogMCAtIE5vIERvd25zaGlmdCBvY3VyZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIERvd25zaGlmdCBvY3VyZWQuCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfWFhYCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MKKyAqCisgKiBGb3IgcGh5J3Mgb2xkZXIgdGhlbiBJR1AsIHRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIERvd25zaGlmdCBiaXQgaW4gdGhlIFBoeQorICogU3BlY2lmaWMgU3RhdHVzIHJlZ2lzdGVyLiAgRm9yIElHUCBwaHkncywgaXQgcmVhZHMgdGhlIERvd25ncmFkZSBiaXQgaW4gdGhlCisgKiBMaW5rIEhlYWx0aCByZWdpc3Rlci4gIEluIElHUCB0aGlzIGJpdCBpcyBsYXRjaGVkIGhpZ2gsIHNvIHRoZSBkcml2ZXIgbXVzdAorICogcmVhZCBpdCBpbW1lZGlhdGVseSBhZnRlciBsaW5rIGlzIGVzdGFibGlzaGVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2NoZWNrX2Rvd25zaGlmdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY2hlY2tfZG93bnNoaWZ0Iik7CisKKyAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgfHwKKyAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMyB8fAorICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX0xJTktfSEVBTFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaHctPnNwZWVkX2Rvd25ncmFkZWQgPSAocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BMSFJfU1NfRE9XTkdSQURFKSA/IDEgOiAwOworICAgIH0gZWxzZSBpZiAoKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB8fAorICAgICAgICAgICAgICAgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfZ2c4MjU2MykpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaHctPnNwZWVkX2Rvd25ncmFkZWQgPSAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RPV05TSElGVCkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX0RPV05TSElGVF9TSElGVDsKKyAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKSB7CisgICAgICAgIC8qIGUxMDAwX3BoeV9pZmUgc3VwcG9ydHMgMTAvMTAwIHNwZWVkIG9ubHkgKi8KKyAgICAgICAgaHctPnNwZWVkX2Rvd25ncmFkZWQgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogODI1NDFfcmV2XzIgJiA4MjU0N19yZXZfMiBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIGNvbmZpZ3VyZSB0aGUgRFNQIHdoZW4gYQorICogZ2lnYWJpdCBsaW5rIGlzIGFjaGlldmVkIHRvIGltcHJvdmUgbGluayBxdWFsaXR5LgorICoKKyAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9QSFkgaWYgZmFpbCB0byByZWFkL3dyaXRlIHRoZSBQSFkKKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyBhdCBhbnkgb3RoZXIgY2FzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludDMyX3QKK2UxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2Uoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl90IGxpbmtfdXApCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhLCBwaHlfc2F2ZWRfZGF0YSwgc3BlZWQsIGR1cGxleCwgaTsKKyAgICB1aW50MTZfdCBkc3BfcmVnX2FycmF5W0lHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0lHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9EfTsKKyAgICB1aW50MTZfdCBtaW5fbGVuZ3RoLCBtYXhfbGVuZ3RoOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlIik7CisKKyAgICBpZiAoaHctPnBoeV90eXBlICE9IGUxMDAwX3BoeV9pZ3ApCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgaWYgKGxpbmtfdXApIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOworICAgICAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGdldHRpbmcgbGluayBzcGVlZCBhbmQgZHVwbGV4XG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNwZWVkID09IFNQRUVEXzEwMDApIHsKKworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9jYWJsZV9sZW5ndGgoaHcsICZtaW5fbGVuZ3RoLCAmbWF4X2xlbmd0aCk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgaWYgKChody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQpICYmCisgICAgICAgICAgICAgICAgbWluX2xlbmd0aCA+PSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBkc3BfcmVnX2FycmF5W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUEhZX0VEQUNfTVVfSU5ERVg7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIGRzcF9yZWdfYXJyYXlbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQpICYmCisgICAgICAgICAgICAgICAobWluX2xlbmd0aCA8IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApKSB7CisKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBmZmVfaWRsZV9lcnJfdGltZW91dCA9IEZGRV9JRExFX0VSUl9DT1VOVF9USU1FT1VUXzIwOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGlkbGVfZXJycyA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBjbGVhciBwcmV2aW91cyBpZGxlIGVycm9yIGNvdW50cyAqLworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmZmVfaWRsZV9lcnJfdGltZW91dDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAgICAgICAgIGlkbGVfZXJycyArPSAocGh5X2RhdGEgJiBTUl8xMDAwVF9JRExFX0VSUk9SX0NOVCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZGxlX2VycnMgPiBTUl8xMDAwVF9QSFlfRVhDRVNTSVZFX0lETEVfRVJSX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBody0+ZmZlX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2ZmZV9jb25maWdfYWN0aXZlOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0RTUF9GRkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFX0NNX0NQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoaWRsZV9lcnJzKQorICAgICAgICAgICAgICAgICAgICAgICAgZmZlX2lkbGVfZXJyX3RpbWVvdXQgPSBGRkVfSURMRV9FUlJfQ09VTlRfVElNRU9VVF8xMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGh3LT5kc3BfY29uZmlnX3N0YXRlID09IGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkKSB7CisgICAgICAgICAgICAvKiBTYXZlIG9mZiB0aGUgY3VycmVudCB2YWx1ZSBvZiByZWdpc3RlciAweDJGNUIgdG8gYmUgcmVzdG9yZWQgYXQKKyAgICAgICAgICAgICAqIHRoZSBlbmQgb2YgdGhlIHJvdXRpbmVzLiAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgMHgyRjVCLCAmcGh5X3NhdmVkX2RhdGEpOworCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgUEhZIHRyYW5zbWl0dGVyICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCAweDAwMDMpOworCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgbWRlbGF5KDIwKTsKKworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfSUVFRV9GT1JDRV9HSUdBKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBkc3BfcmVnX2FycmF5W2ldLCAmcGh5X2RhdGEpOworICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BIWV9FREFDX01VX0lOREVYOworICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9ICBJR1AwMUUxMDAwX1BIWV9FREFDX1NJR05fRVhUXzlfQklUUzsKKworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LGRzcF9yZWdfYXJyYXlbaV0sIHBoeV9kYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0lFRUVfUkVTVEFSVF9BVVRPTkVHKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBtZGVsYXkoMjApOworCisgICAgICAgICAgICAvKiBOb3cgZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MkY1QiwgcGh5X3NhdmVkX2RhdGEpOworCisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHctPmZmZV9jb25maWdfc3RhdGUgPT0gZTEwMDBfZmZlX2NvbmZpZ19hY3RpdmUpIHsKKyAgICAgICAgICAgIC8qIFNhdmUgb2ZmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHJlZ2lzdGVyIDB4MkY1QiB0byBiZSByZXN0b3JlZCBhdAorICAgICAgICAgICAgICogdGhlIGVuZCBvZiB0aGUgcm91dGluZXMuICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCAweDJGNUIsICZwaHlfc2F2ZWRfZGF0YSk7CisKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBQSFkgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIDB4MDAwMyk7CisKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBtZGVsYXkoMjApOworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9JRUVFX0ZPUkNFX0dJR0EpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0RTUF9GRkVfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfSUVFRV9SRVNUQVJUX0FVVE9ORUcpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIG1kZWxheSgyMCk7CisKKyAgICAgICAgICAgIC8qIE5vdyBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CisKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBody0+ZmZlX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXQgUEhZIHRvIGNsYXNzIEEgbW9kZQorICogQXNzdW1lcyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgd2lsbCBmb2xsb3cgdG8gZW5hYmxlIHRoZSBuZXcgY2xhc3MgbW9kZS4KKyAqICAxLiBEbyBhIFBIWSBzb2Z0IHJlc2V0CisgKiAgMi4gUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uIG9yIGZvcmNlIGxpbmsuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3NldF9waHlfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBlZXByb21fZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X3BoeV9tb2RlIik7CisKKyAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NV9yZXZfMykgJiYKKyAgICAgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9QSFlfQ0xBU1NfV09SRCwgMSwgJmVlcHJvbV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChlZXByb21fZGF0YSAhPSBFRVBST01fUkVTRVJWRURfV09SRCkgJiYKKyAgICAgICAgICAgIChlZXByb21fZGF0YSAmIEVFUFJPTV9QSFlfQ0xBU1NfQSkpIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwQik7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4ODEwNCk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgaHctPnBoeV9yZXNldF9kaXNhYmxlID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBscGx1IHN0YXRlIGFjY29yZGluZyB0byB0aGUgYWN0aXZlIGZsYWcuICBXaGVuCisgKiBhY3RpdmF0aW5nIGxwbHUgdGhpcyBmdW5jdGlvbiBhbHNvIGRpc2FibGVzIHNtYXJ0IHNwZWVkIGFuZCB2aXNlIHZlcnNhLgorICogbHBsdSB3aWxsIG5vdCBiZSBhY3RpdmF0ZWQgdW5sZXNzIHRoZSBkZXZpY2UgYXV0b25lZ290aWF0aW9uIGFkdmVydGlzbWVudAorICogbWVldHMgc3RhbmRhcmRzIG9mIGVpdGhlciAxMCBvciAxMC8xMDAgb3IgMTAvMTAwLzEwMDAgYXQgYWxsIGR1cGxleGVzLgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogYWN0aXZlIC0gdHJ1ZSB0byBlbmFibGUgbHBsdSBmYWxzZSB0byBkaXNhYmxlIGxwbHUuCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfUEhZIGlmIGZhaWwgdG8gcmVhZC93cml0ZSB0aGUgUEhZCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQzMl90CitlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl90IGFjdGl2ZSkKK3sKKyAgICB1aW50MzJfdCBwaHlfY3RybCA9IDA7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X2QzX2xwbHVfc3RhdGUiKTsKKworICAgIGlmIChody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncCAmJiBody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncF8yCisgICAgICAgICYmIGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWdwXzMpCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgLyogRHVyaW5nIGRyaXZlciBhY3Rpdml0eSBMUExVIHNob3VsZCBub3QgYmUgdXNlZCBvciBpdCB3aWxsIGF0dGFpbiBsaW5rCisgICAgICogZnJvbSB0aGUgbG93ZXN0IHNwZWVkcyBzdGFydGluZyBmcm9tIDEwTWJwcy4gVGhlIGNhcGFiaWxpdHkgaXMgdXNlZCBmb3IKKyAgICAgKiBEeCB0cmFuc2l0aW9ucyBhbmQgc3RhdGVzICovCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMiB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfSBlbHNlIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgeworICAgICAgICAvKiBNQUMgd3JpdGVzIGludG8gUEhZIHJlZ2lzdGVyIGJhc2VkIG9uIHRoZSBzdGF0ZSB0cmFuc2l0aW9uCisgICAgICAgICAqIGFuZCBzdGFydCBhdXRvLW5lZ290aWF0aW9uLiBTVyBkcml2ZXIgY2FuIG92ZXJ3cml0ZSB0aGUgc2V0dGluZ3MKKyAgICAgICAgICogaW4gQ1NSIFBIWSBwb3dlciBjb250cm9sIEUxMDAwX1BIWV9DVFJMIHJlZ2lzdGVyLiAqLworICAgICAgICBwaHlfY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQSFlfQ1RSTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgICBpZiAoIWFjdGl2ZSkgeworICAgICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8CisgICAgICAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpIHsKKyAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX0dNSUlfRkxFWF9TUEQ7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sIHBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7CisgICAgICAgICAgICAgICAgcGh5X2N0cmwgJj0gfkUxMDAwX1BIWV9DVFJMX05PTkQwQV9MUExVOworICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUEhZX0NUUkwsIHBoeV9jdHJsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAyRTEwMDBfUE1fRDNfTFBMVTsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogTFBMVSBhbmQgU21hcnRTcGVlZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgTFBMVSBpcyB1c2VkIGR1cmluZworICAgICAgICAgKiBEeCBzdGF0ZXMgd2hlcmUgdGhlIHBvd2VyIGNvbnNlcnZhdGlvbiBpcyBtb3N0IGltcG9ydGFudC4gIER1cmluZworICAgICAgICAgKiBkcml2ZXIgYWN0aXZpdHkgd2Ugc2hvdWxkIGVuYWJsZSBTbWFydFNwZWVkLCBzbyBwZXJmb3JtYW5jZSBpcworICAgICAgICAgKiBtYWludGFpbmVkLiAqLworICAgICAgICBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29uKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0gZWxzZSBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29mZikgeworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIGlmICgoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUKSB8fAorICAgICAgICAgICAgICAgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQVVUT05FR19BRFZFUlRJU0VfMTBfQUxMICkgfHwKKyAgICAgICAgICAgICAgIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFVVE9ORUdfQURWRVJUSVNFXzEwXzEwMF9BTEwpKSB7CisKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMiB8fAorICAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX0dNSUlfRkxFWF9TUEQ7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sIHBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7CisgICAgICAgICAgICAgICAgcGh5X2N0cmwgfD0gRTEwMDBfUEhZX0NUUkxfTk9ORDBBX0xQTFU7CisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBQSFlfQ1RSTCwgcGh5X2N0cmwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMkUxMDAwX1BNX0QzX0xQTFU7CisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFdoZW4gTFBMVSBpcyBlbmFibGVkIHdlIHNob3VsZCBkaXNhYmxlIFNtYXJ0U3BlZWQgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywgcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGxwbHUgZDAgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBhY3RpdmUgZmxhZy4gIFdoZW4KKyAqIGFjdGl2YXRpbmcgbHBsdSB0aGlzIGZ1bmN0aW9uIGFsc28gZGlzYWJsZXMgc21hcnQgc3BlZWQgYW5kIHZpc2UgdmVyc2EuCisgKiBscGx1IHdpbGwgbm90IGJlIGFjdGl2YXRlZCB1bmxlc3MgdGhlIGRldmljZSBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNtZW50CisgKiBtZWV0cyBzdGFuZGFyZHMgb2YgZWl0aGVyIDEwIG9yIDEwLzEwMCBvciAxMC8xMDAvMTAwMCBhdCBhbGwgZHVwbGV4ZXMuCisgKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBhY3RpdmUgLSB0cnVlIHRvIGVuYWJsZSBscGx1IGZhbHNlIHRvIGRpc2FibGUgbHBsdS4KKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9QSFkgaWYgZmFpbCB0byByZWFkL3dyaXRlIHRoZSBQSFkKKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyBhdCBhbnkgb3RoZXIgY2FzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludDMyX3QKK2UxMDAwX3NldF9kMF9scGx1X3N0YXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuX3QgYWN0aXZlKQoreworICAgIHVpbnQzMl90IHBoeV9jdHJsID0gMDsKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXRfZDBfbHBsdV9zdGF0ZSIpOworCisgICAgaWYgKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKKyAgICAgICAgcGh5X2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgUEhZX0NUUkwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsICZwaHlfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorCisgICAgaWYgKCFhY3RpdmUpIHsKKyAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7CisgICAgICAgICAgICBwaHlfY3RybCAmPSB+RTEwMDBfUEhZX0NUUkxfRDBBX0xQTFU7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFBIWV9DVFJMLCBwaHlfY3RybCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDJFMTAwMF9QTV9EMF9MUExVOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsIHBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisKKyAgICAgICAgLyogTFBMVSBhbmQgU21hcnRTcGVlZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgTFBMVSBpcyB1c2VkIGR1cmluZworICAgICAgICAgKiBEeCBzdGF0ZXMgd2hlcmUgdGhlIHBvd2VyIGNvbnNlcnZhdGlvbiBpcyBtb3N0IGltcG9ydGFudC4gIER1cmluZworICAgICAgICAgKiBkcml2ZXIgYWN0aXZpdHkgd2Ugc2hvdWxkIGVuYWJsZSBTbWFydFNwZWVkLCBzbyBwZXJmb3JtYW5jZSBpcworICAgICAgICAgKiBtYWludGFpbmVkLiAqLworICAgICAgICBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29uKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0gZWxzZSBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29mZikgeworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorCisKKyAgICB9IGVsc2UgeworCisgICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgeworICAgICAgICAgICAgcGh5X2N0cmwgfD0gRTEwMDBfUEhZX0NUUkxfRDBBX0xQTFU7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFBIWV9DVFJMLCBwaHlfY3RybCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMkUxMDAwX1BNX0QwX0xQTFU7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBXaGVuIExQTFUgaXMgZW5hYmxlZCB3ZSBzaG91bGQgZGlzYWJsZSBTbWFydFNwZWVkICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLCAmcGh5X2RhdGEpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hhbmdlIFZDTyBzcGVlZCByZWdpc3RlciB0byBpbXByb3ZlIEJpdCBFcnJvciBSYXRlIHBlcmZvcm1hbmNlIG9mIFNFUkRFUy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3NldF92Y29fc3BlZWQoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90ICByZXRfdmFsOworICAgIHVpbnQxNl90IGRlZmF1bHRfcGFnZSA9IDA7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldF92Y29fc3BlZWQiKTsKKworICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKyAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgIH0KKworICAgIC8qIFNldCBQSFkgcmVnaXN0ZXIgMzAsIHBhZ2UgNSwgYml0IDggdG8gMCAqLworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAmZGVmYXVsdF9wYWdlKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMDUpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgJnBoeV9kYXRhKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUODsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCBwaHlfZGF0YSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgLyogU2V0IFBIWSByZWdpc3RlciAzMCwgcGFnZSA0LCBiaXQgMTEgdG8gMSAqLworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDA0KTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsICZwaHlfZGF0YSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUMTE7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgcGh5X2RhdGEpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIGRlZmF1bHRfcGFnZSk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBjb29raWUgZnJvbSBBUkMgcmFtLgorICoKKyAqIHJldHVybnM6IC0gRTEwMDBfU1VDQ0VTUyAuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9ob3N0X2lmX3JlYWRfY29va2llKHN0cnVjdCBlMTAwMF9odyAqIGh3LCB1aW50OF90ICpidWZmZXIpCit7CisgICAgdWludDhfdCBpOworICAgIHVpbnQzMl90IG9mZnNldCA9IEUxMDAwX01OR19ESENQX0NPT0tJRV9PRkZTRVQ7CisgICAgdWludDhfdCBsZW5ndGggPSBFMTAwMF9NTkdfREhDUF9DT09LSUVfTEVOR1RIOworCisgICAgbGVuZ3RoID0gKGxlbmd0aCA+PiAyKTsKKyAgICBvZmZzZXQgPSAob2Zmc2V0ID4+IDIpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICooKHVpbnQzMl90ICopIGJ1ZmZlciArIGkpID0KKyAgICAgICAgICAgIEUxMDAwX1JFQURfUkVHX0FSUkFZX0RXT1JEKGh3LCBIT1NUX0lGLCBvZmZzZXQgKyBpKTsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBIT1NUIElGIGlzIGVuYWJsZWQgZm9yIGNvbW1hbmQgb3BlcmF0b24KKyAqIGFuZCBhbHNvIGNoZWNrcyB3aGV0aGVyIHRoZSBwcmV2aW91cyBjb21tYW5kIGlzIGNvbXBsZXRlZC4KKyAqIEl0IGJ1c3kgd2FpdHMgaW4gY2FzZSBvZiBwcmV2aW91cyBjb21tYW5kIGlzIG5vdCBjb21wbGV0ZWQuCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfSE9TVF9JTlRFUkZBQ0VfQ09NTUFORCBpbiBjYXNlIGlmIGlzIG5vdCByZWFkeSBvcgorICogICAgICAgICAgICB0aW1lb3V0CisgKiAgICAgICAgICAtIEUxMDAwX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9tbmdfZW5hYmxlX2hvc3RfaWYoc3RydWN0IGUxMDAwX2h3ICogaHcpCit7CisgICAgdWludDMyX3QgaGljcjsKKyAgICB1aW50OF90IGk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBob3N0IGludGVyZmFjZSBpcyBlbmFibGVkLiAqLworICAgIGhpY3IgPSBFMTAwMF9SRUFEX1JFRyhodywgSElDUik7CisgICAgaWYgKChoaWNyICYgRTEwMDBfSElDUl9FTikgPT0gMCkgeworICAgICAgICBERUJVR09VVCgiRTEwMDBfSE9TVF9FTiBiaXQgZGlzYWJsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfSE9TVF9JTlRFUkZBQ0VfQ09NTUFORDsKKyAgICB9CisgICAgLyogY2hlY2sgdGhlIHByZXZpb3VzIGNvbW1hbmQgaXMgY29tcGxldGVkICovCisgICAgZm9yIChpID0gMDsgaSA8IEUxMDAwX01OR19ESENQX0NPTU1BTkRfVElNRU9VVDsgaSsrKSB7CisgICAgICAgIGhpY3IgPSBFMTAwMF9SRUFEX1JFRyhodywgSElDUik7CisgICAgICAgIGlmICghKGhpY3IgJiBFMTAwMF9ISUNSX0MpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG1kZWxheSgxKTsKKyAgICB9CisKKyAgICBpZiAoaSA9PSBFMTAwMF9NTkdfREhDUF9DT01NQU5EX1RJTUVPVVQpIHsKKyAgICAgICAgREVCVUdPVVQoIlByZXZpb3VzIGNvbW1hbmQgdGltZW91dCBmYWlsZWQgLlxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0hPU1RfSU5URVJGQUNFX0NPTU1BTkQ7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBidWZmZXIgY29udGVudCBhdCB0aGUgb2Zmc2V0IGdpdmVuIG9uIHRoZSBob3N0IGlmLgorICogSXQgYWxzbyBkb2VzIGFsaWdubWVudCBjb25zaWRlcmF0aW9ucyB0byBkbyB0aGUgd3JpdGVzIGluIG1vc3QgZWZmaWNpZW50IHdheS4KKyAqIEFsc28gZmlsbHMgdXAgdGhlIHN1bSBvZiB0aGUgYnVmZmVyIGluICpidWZmZXIgcGFyYW1ldGVyLgorICoKKyAqIHJldHVybnMgIC0gRTEwMDBfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX21uZ19ob3N0X2lmX3dyaXRlKHN0cnVjdCBlMTAwMF9odyAqIGh3LCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgsIHVpbnQxNl90IG9mZnNldCwgdWludDhfdCAqc3VtKQoreworICAgIHVpbnQ4X3QgKnRtcDsKKyAgICB1aW50OF90ICpidWZwdHIgPSBidWZmZXI7CisgICAgdWludDMyX3QgZGF0YSA9IDA7CisgICAgdWludDE2X3QgcmVtYWluaW5nLCBpLCBqLCBwcmV2X2J5dGVzOworCisgICAgLyogc3VtID0gb25seSBzdW0gb2YgdGhlIGRhdGEgYW5kIGl0IGlzIG5vdCBjaGVja3N1bSAqLworCisgICAgaWYgKGxlbmd0aCA9PSAwIHx8IG9mZnNldCArIGxlbmd0aCA+IEUxMDAwX0hJX01BWF9NTkdfREFUQV9MRU5HVEgpIHsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEFSQU07CisgICAgfQorCisgICAgdG1wID0gKHVpbnQ4X3QgKikmZGF0YTsKKyAgICBwcmV2X2J5dGVzID0gb2Zmc2V0ICYgMHgzOworICAgIG9mZnNldCAmPSAweEZGRkM7CisgICAgb2Zmc2V0ID4+PSAyOworCisgICAgaWYgKHByZXZfYnl0ZXMpIHsKKyAgICAgICAgZGF0YSA9IEUxMDAwX1JFQURfUkVHX0FSUkFZX0RXT1JEKGh3LCBIT1NUX0lGLCBvZmZzZXQpOworICAgICAgICBmb3IgKGogPSBwcmV2X2J5dGVzOyBqIDwgc2l6ZW9mKHVpbnQzMl90KTsgaisrKSB7CisgICAgICAgICAgICAqKHRtcCArIGopID0gKmJ1ZnB0cisrOworICAgICAgICAgICAgKnN1bSArPSAqKHRtcCArIGopOworICAgICAgICB9CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWV9EV09SRChodywgSE9TVF9JRiwgb2Zmc2V0LCBkYXRhKTsKKyAgICAgICAgbGVuZ3RoIC09IGogLSBwcmV2X2J5dGVzOworICAgICAgICBvZmZzZXQrKzsKKyAgICB9CisKKyAgICByZW1haW5pbmcgPSBsZW5ndGggJiAweDM7CisgICAgbGVuZ3RoIC09IHJlbWFpbmluZzsKKworICAgIC8qIENhbGN1bGF0ZSBsZW5ndGggaW4gRFdPUkRzICovCisgICAgbGVuZ3RoID4+PSAyOworCisgICAgLyogVGhlIGRldmljZSBkcml2ZXIgd3JpdGVzIHRoZSByZWxldmFudCBjb21tYW5kIGJsb2NrIGludG8gdGhlCisgICAgICogcmFtIGFyZWEuICovCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2YodWludDMyX3QpOyBqKyspIHsKKyAgICAgICAgICAgICoodG1wICsgaikgPSAqYnVmcHRyKys7CisgICAgICAgICAgICAqc3VtICs9ICoodG1wICsgaik7CisgICAgICAgIH0KKworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVlfRFdPUkQoaHcsIEhPU1RfSUYsIG9mZnNldCArIGksIGRhdGEpOworICAgIH0KKyAgICBpZiAocmVtYWluaW5nKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2YodWludDMyX3QpOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChqIDwgcmVtYWluaW5nKQorICAgICAgICAgICAgICAgICoodG1wICsgaikgPSAqYnVmcHRyKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKih0bXAgKyBqKSA9IDA7CisKKyAgICAgICAgICAgICpzdW0gKz0gKih0bXAgKyBqKTsKKyAgICAgICAgfQorICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVlfRFdPUkQoaHcsIEhPU1RfSUYsIG9mZnNldCArIGksIGRhdGEpOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGNvbW1hbmQgaGVhZGVyIGFmdGVyIGRvZXMgdGhlIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgorICoKKyAqIHJldHVybnMgIC0gRTEwMDBfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX21uZ193cml0ZV9jbWRfaGVhZGVyKHN0cnVjdCBlMTAwMF9odyAqIGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGUxMDAwX2hvc3RfbW5nX2NvbW1hbmRfaGVhZGVyICogaGRyKQoreworICAgIHVpbnQxNl90IGk7CisgICAgdWludDhfdCBzdW07CisgICAgdWludDhfdCAqYnVmZmVyOworCisgICAgLyogV3JpdGUgdGhlIHdob2xlIGNvbW1hbmQgaGVhZGVyIHN0cnVjdHVyZSB3aGljaCBpbmNsdWRlcyBzdW0gb2YKKyAgICAgKiB0aGUgYnVmZmVyICovCisKKyAgICB1aW50MTZfdCBsZW5ndGggPSBzaXplb2Yoc3RydWN0IGUxMDAwX2hvc3RfbW5nX2NvbW1hbmRfaGVhZGVyKTsKKworICAgIHN1bSA9IGhkci0+Y2hlY2tzdW07CisgICAgaGRyLT5jaGVja3N1bSA9IDA7CisKKyAgICBidWZmZXIgPSAodWludDhfdCAqKSBoZHI7CisgICAgaSA9IGxlbmd0aDsKKyAgICB3aGlsZSAoaS0tKQorICAgICAgICBzdW0gKz0gYnVmZmVyW2ldOworCisgICAgaGRyLT5jaGVja3N1bSA9IDAgLSBzdW07CisKKyAgICBsZW5ndGggPj49IDI7CisgICAgLyogVGhlIGRldmljZSBkcml2ZXIgd3JpdGVzIHRoZSByZWxldmFudCBjb21tYW5kIGJsb2NrIGludG8gdGhlIHJhbSBhcmVhLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVlfRFdPUkQoaHcsIEhPU1RfSUYsIGksICooKHVpbnQzMl90ICopIGhkciArIGkpKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgdG8gQVJDIHRoYXQgYSBuZXcgY29tbWFuZCBpcyBwZW5kaW5nIHdoaWNoIGNvbXBsZXRlcworICogb25lIHdyaXRlIG9wZXJhdGlvbiBieSB0aGUgZHJpdmVyLgorICoKKyAqIHJldHVybnMgIC0gRTEwMDBfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX21uZ193cml0ZV9jb21taXQoc3RydWN0IGUxMDAwX2h3ICogaHcpCit7CisgICAgdWludDMyX3QgaGljcjsKKworICAgIGhpY3IgPSBFMTAwMF9SRUFEX1JFRyhodywgSElDUik7CisgICAgLyogU2V0dGluZyB0aGlzIGJpdCB0ZWxscyB0aGUgQVJDIHRoYXQgYSBuZXcgY29tbWFuZCBpcyBwZW5kaW5nLiAqLworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgSElDUiwgaGljciB8IEUxMDAwX0hJQ1JfQyk7CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBtb2RlIG9mIHRoZSBmaXJtd2FyZS4KKyAqCisgKiByZXR1cm5zICAtIFRSVUUgd2hlbiB0aGUgbW9kZSBpcyBJQU1UIG9yIEZBTFNFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sZWFuX3QKK2UxMDAwX2NoZWNrX21uZ19tb2RlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgZndzbTsKKworICAgIGZ3c20gPSBFMTAwMF9SRUFEX1JFRyhodywgRldTTSk7CisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKKyAgICAgICAgaWYgKChmd3NtICYgRTEwMDBfRldTTV9NT0RFX01BU0spID09CisgICAgICAgICAgICAoRTEwMDBfTU5HX0lDSF9JQU1UX01PREUgPDwgRTEwMDBfRldTTV9NT0RFX1NISUZUKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgIH0gZWxzZSBpZiAoKGZ3c20gJiBFMTAwMF9GV1NNX01PREVfTUFTSykgPT0KKyAgICAgICAgICAgICAgIChFMTAwMF9NTkdfSUFNVF9NT0RFIDw8IEUxMDAwX0ZXU01fTU9ERV9TSElGVCkpCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGRoY3AgaW5mbyAuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX21uZ193cml0ZV9kaGNwX2luZm8oc3RydWN0IGUxMDAwX2h3ICogaHcsIHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoKQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIgaGRyOworCisgICAgaGRyLmNvbW1hbmRfaWQgPSBFMTAwMF9NTkdfREhDUF9UWF9QQVlMT0FEX0NNRDsKKyAgICBoZHIuY29tbWFuZF9sZW5ndGggPSBsZW5ndGg7CisgICAgaGRyLnJlc2VydmVkMSA9IDA7CisgICAgaGRyLnJlc2VydmVkMiA9IDA7CisgICAgaGRyLmNoZWNrc3VtID0gMDsKKworICAgIHJldF92YWwgPSBlMTAwMF9tbmdfZW5hYmxlX2hvc3RfaWYoaHcpOworICAgIGlmIChyZXRfdmFsID09IEUxMDAwX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX21uZ19ob3N0X2lmX3dyaXRlKGh3LCBidWZmZXIsIGxlbmd0aCwgc2l6ZW9mKGhkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhkci5jaGVja3N1bSkpOworICAgICAgICBpZiAocmV0X3ZhbCA9PSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfbW5nX3dyaXRlX2NtZF9oZWFkZXIoaHcsICZoZHIpOworICAgICAgICAgICAgaWYgKHJldF92YWwgPT0gRTEwMDBfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfbW5nX3dyaXRlX2NvbW1pdChodyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldF92YWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGNoZWNrc3VtLgorICoKKyAqIHJldHVybnMgIC0gY2hlY2tzdW0gb2YgYnVmZmVyIGNvbnRlbnRzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludDhfdAorZTEwMDBfY2FsY3VsYXRlX21uZ19jaGVja3N1bShjaGFyICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICB1aW50OF90IHN1bSA9IDA7CisgICAgdWludDMyX3QgaTsKKworICAgIGlmICghYnVmZmVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaT0wOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHN1bSArPSBidWZmZXJbaV07CisKKyAgICByZXR1cm4gKHVpbnQ4X3QpICgwIC0gc3VtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHR4IHBrdCBmaWx0ZXJpbmcgbmVlZHMgdG8gYmUgZW5hYmxlZCBvciBub3QuCisgKgorICogcmV0dXJucyAgLSBUUlVFIGZvciBwYWNrZXQgZmlsdGVyaW5nIG9yIEZBTFNFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sZWFuX3QKK2UxMDAwX2VuYWJsZV90eF9wa3RfZmlsdGVyaW5nKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgLyogY2FsbGVkIGluIGluaXQgYXMgd2VsbCBhcyB3YXRjaGRvZyB0aW1lciBmdW5jdGlvbnMgKi8KKworICAgIGludDMyX3QgcmV0X3ZhbCwgY2hlY2tzdW07CisgICAgYm9vbGVhbl90IHR4X2ZpbHRlciA9IEZBTFNFOworICAgIHN0cnVjdCBlMTAwMF9ob3N0X21uZ19kaGNwX2Nvb2tpZSAqaGRyID0gJihody0+bW5nX2Nvb2tpZSk7CisgICAgdWludDhfdCAqYnVmZmVyID0gKHVpbnQ4X3QgKikgJihody0+bW5nX2Nvb2tpZSk7CisKKyAgICBpZiAoZTEwMDBfY2hlY2tfbW5nX21vZGUoaHcpKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9tbmdfZW5hYmxlX2hvc3RfaWYoaHcpOworICAgICAgICBpZiAocmV0X3ZhbCA9PSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfaG9zdF9pZl9yZWFkX2Nvb2tpZShodywgYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChyZXRfdmFsID09IEUxMDAwX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBjaGVja3N1bSA9IGhkci0+Y2hlY2tzdW07CisgICAgICAgICAgICAgICAgaGRyLT5jaGVja3N1bSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKChoZHItPnNpZ25hdHVyZSA9PSBFMTAwMF9JQU1UX1NJR05BVFVSRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0gPT0gZTEwMDBfY2FsY3VsYXRlX21uZ19jaGVja3N1bSgoY2hhciAqKWJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX0xFTkdUSCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhkci0+c3RhdHVzICYKKyAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfUEFSU0lOR19TVVBQT1JUKQorICAgICAgICAgICAgICAgICAgICAgICAgdHhfZmlsdGVyID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHhfZmlsdGVyID0gVFJVRTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHR4X2ZpbHRlciA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBody0+dHhfcGt0X2ZpbHRlcmluZyA9IHR4X2ZpbHRlcjsKKyAgICByZXR1cm4gdHhfZmlsdGVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWZXJpZmllcyB0aGUgaGFyZHdhcmUgbmVlZHMgdG8gYWxsb3cgQVJQcyB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIGhvc3QKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gVFJVRS9GQUxTRQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90CitlMTAwMF9lbmFibGVfbW5nX3Bhc3NfdGhydShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IG1hbmM7CisgICAgdWludDMyX3QgZndzbSwgZmFjdHBzOworCisgICAgaWYgKGh3LT5hc2ZfZmlybXdhcmVfcHJlc2VudCkgeworICAgICAgICBtYW5jID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1BTkMpOworCisgICAgICAgIGlmICghKG1hbmMgJiBFMTAwMF9NQU5DX1JDVl9UQ09fRU4pIHx8CisgICAgICAgICAgICAhKG1hbmMgJiBFMTAwMF9NQU5DX0VOX01BQ19BRERSX0ZJTFRFUikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChlMTAwMF9hcmNfc3Vic3lzdGVtX3ZhbGlkKGh3KSA9PSBUUlVFKSB7CisgICAgICAgICAgICBmd3NtID0gRTEwMDBfUkVBRF9SRUcoaHcsIEZXU00pOworICAgICAgICAgICAgZmFjdHBzID0gRTEwMDBfUkVBRF9SRUcoaHcsIEZBQ1RQUyk7CisKKyAgICAgICAgICAgIGlmICgoKChmd3NtICYgRTEwMDBfRldTTV9NT0RFX01BU0spID4+IEUxMDAwX0ZXU01fTU9ERV9TSElGVCkgPT0KKyAgICAgICAgICAgICAgICAgICBlMTAwMF9tbmdfbW9kZV9wdCkgJiYgIShmYWN0cHMgJiBFMTAwMF9GQUNUUFNfTU5HQ0cpKQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlmICgobWFuYyAmIEUxMDAwX01BTkNfU01CVVNfRU4pICYmICEobWFuYyAmIEUxMDAwX01BTkNfQVNGX0VOKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50MzJfdAorZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBtaWlfc3RhdHVzX3JlZzsKKyAgICB1aW50MTZfdCBpOworCisgICAgLyogUG9sYXJpdHkgcmV2ZXJzYWwgd29ya2Fyb3VuZCBmb3IgZm9yY2VkIDEwRi8xMEggbGlua3MuICovCisKKyAgICAvKiBEaXNhYmxlIHRoZSB0cmFuc21pdHRlciBvbiB0aGUgUEhZICovCisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMTkpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweEZGRkYpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwMCk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgLyogVGhpcyBsb29wIHdpbGwgZWFybHktb3V0IGlmIHRoZSBOTyBsaW5rIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuICovCisgICAgZm9yIChpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgTGluayBTdGF0dXMgYml0CisgICAgICAgICAqIHRvIGJlIGNsZWFyLgorICAgICAgICAgKi8KKworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaWYgKChtaWlfc3RhdHVzX3JlZyAmIH5NSUlfU1JfTElOS19TVEFUVVMpID09IDApIGJyZWFrOworICAgICAgICBtZGVsYXkoMTAwKTsKKyAgICB9CisKKyAgICAvKiBSZWNvbW1lbmRlZCBkZWxheSB0aW1lIGFmdGVyIGxpbmsgaGFzIGJlZW4gbG9zdCAqLworICAgIG1kZWxheSgxMDAwKTsKKworICAgIC8qIE5vdyB3ZSB3aWxsIHJlLWVuYWJsZSB0aCB0cmFuc21pdHRlciBvbiB0aGUgUEhZICovCisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMTkpOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICBtZGVsYXkoNTApOworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4RkZGMCk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIG1kZWxheSg1MCk7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgMHhGRjAwKTsKKyAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgbWRlbGF5KDUwKTsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweDAwMDApOworICAgIGlmIChyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwMCk7CisgICAgaWYgKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgLyogVGhpcyBsb29wIHdpbGwgZWFybHktb3V0IGlmIHRoZSBsaW5rIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuICovCisgICAgZm9yIChpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgTGluayBTdGF0dXMgYml0CisgICAgICAgICAqIHRvIGJlIHNldC4KKyAgICAgICAgICovCisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmIChtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7CisgICAgICAgIG1kZWxheSgxMDApOworICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERpc2FibGVzIFBDSS1FeHByZXNzIG1hc3RlciBhY2Nlc3MuCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gbm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3NldF9wY2lfZXhwcmVzc19tYXN0ZXJfZGlzYWJsZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9wY2lfZXhwcmVzc19tYXN0ZXJfZGlzYWJsZSIpOworCisgICAgaWYgKGh3LT5idXNfdHlwZSAhPSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzcykKKyAgICAgICAgcmV0dXJuOworCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICBjdHJsIHw9IEUxMDAwX0NUUkxfR0lPX01BU1RFUl9ESVNBQkxFOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGlzYWJsZXMgUENJLUV4cHJlc3MgbWFzdGVyIGFjY2VzcyBhbmQgdmVyaWZpZXMgdGhlcmUgYXJlIG5vIHBlbmRpbmcgcmVxdWVzdHMKKyAqCisgKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfTUFTVEVSX1JFUVVFU1RTX1BFTkRJTkcgaWYgbWFzdGVyIGRpc2FibGUgYml0IGhhc24ndAorICogICAgICAgICAgICBjYXVzZWQgdGhlIG1hc3RlciByZXF1ZXN0cyB0byBiZSBkaXNhYmxlZC4KKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyBtYXN0ZXIgcmVxdWVzdHMgZGlzYWJsZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2Rpc2FibGVfcGNpZXhfbWFzdGVyKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCB0aW1lb3V0ID0gTUFTVEVSX0RJU0FCTEVfVElNRU9VVDsgICAvKiA4MG1zICovCisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2Rpc2FibGVfcGNpZXhfbWFzdGVyIik7CisKKyAgICBpZiAoaHctPmJ1c190eXBlICE9IGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzKQorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworICAgIGUxMDAwX3NldF9wY2lfZXhwcmVzc19tYXN0ZXJfZGlzYWJsZShodyk7CisKKyAgICB3aGlsZSAodGltZW91dCkgeworICAgICAgICBpZiAoIShFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19HSU9fTUFTVEVSX0VOQUJMRSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdWRlbGF5KDEwMCk7CisgICAgICAgIHRpbWVvdXQtLTsKKyAgICB9CisKKyAgICBpZiAoIXRpbWVvdXQpIHsKKyAgICAgICAgREVCVUdPVVQoIk1hc3RlciByZXF1ZXN0cyBhcmUgcGVuZGluZy5cbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9NQVNURVJfUkVRVUVTVFNfUEVORElORzsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGVjayBmb3IgRUVQUk9NIEF1dG8gUmVhZCBiaXQgZG9uZS4KKyAqCisgKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfUkVTRVQgaWYgZmFpbCB0byByZXNldCBNQUMKKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyBhdCBhbnkgb3RoZXIgY2FzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2dldF9hdXRvX3JkX2RvbmUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHRpbWVvdXQgPSBBVVRPX1JFQURfRE9ORV9USU1FT1VUOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9nZXRfYXV0b19yZF9kb25lIik7CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIG1zbGVlcCg1KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU3MToKKyAgICBjYXNlIGUxMDAwXzgyNTcyOgorICAgIGNhc2UgZTEwMDBfODI1NzM6CisgICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKKyAgICBjYXNlIGUxMDAwX2ljaDhsYW46CisgICAgY2FzZSBlMTAwMF84MjU3NjoKKyAgICAgICAgd2hpbGUgKHRpbWVvdXQpIHsKKyAgICAgICAgICAgIGlmIChFMTAwMF9SRUFEX1JFRyhodywgRUVDRCkgJiBFMTAwMF9FRUNEX0FVVE9fUkQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlIG1zbGVlcCgxKTsKKyAgICAgICAgICAgIHRpbWVvdXQtLTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdGltZW91dCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkF1dG8gcmVhZCBieSBIVyBmcm9tIEVFUFJPTSBoYXMgbm90IGNvbXBsZXRlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUkVTRVQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogUEhZIGNvbmZpZ3VyYXRpb24gZnJvbSBOVk0ganVzdCBzdGFydHMgYWZ0ZXIgRUVDRF9BVVRPX1JEIHNldHMgdG8gaGlnaC4KKyAgICAgKiBOZWVkIHRvIHdhaXQgZm9yIFBIWSBjb25maWd1cmF0aW9uIGNvbXBsZXRpb24gYmVmb3JlIGFjY2Vzc2luZyBOVk0KKyAgICAgKiBhbmQgUEhZLiAqLworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpCisgICAgICAgIG1zbGVlcCgyNSk7CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2tzIGlmIHRoZSBQSFkgY29uZmlndXJhdGlvbiBpcyBkb25lCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gRTEwMDBfRVJSX1JFU0VUIGlmIGZhaWwgdG8gcmVzZXQgTUFDCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9nZXRfcGh5X2NmZ19kb25lKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCB0aW1lb3V0ID0gUEhZX0NGR19USU1FT1VUOworICAgIHVpbnQzMl90IGNmZ19tYXNrID0gRTEwMDBfRUVQUk9NX0NGR19ET05FOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9nZXRfcGh5X2NmZ19kb25lIik7CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIG1kZWxheSgxMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46CisgICAgY2FzZSBlMTAwMF84MjU3NjoKKyAgICAgICAgLyogU2VwYXJhdGUgKl9DRkdfRE9ORV8qIGJpdCBmb3IgZWFjaCBwb3J0ICovCisgICAgICAgIGlmIChFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpCisgICAgICAgICAgICBjZmdfbWFzayA9IEUxMDAwX0VFUFJPTV9DRkdfRE9ORV9QT1JUXzE7CisgICAgICAgIC8qIEZhbGwgVGhyb3VnaCAqLworICAgIGNhc2UgZTEwMDBfODI1NzE6CisgICAgY2FzZSBlMTAwMF84MjU3MjoKKyAgICAgICAgd2hpbGUgKHRpbWVvdXQpIHsKKyAgICAgICAgICAgIGlmIChFMTAwMF9SRUFEX1JFRyhodywgRUVNTkdDVEwpICYgY2ZnX21hc2spCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbXNsZWVwKDEpOworICAgICAgICAgICAgdGltZW91dC0tOworICAgICAgICB9CisgICAgICAgIGlmICghdGltZW91dCkgeworICAgICAgICAgICAgREVCVUdPVVQoIk1ORyBjb25maWd1cmF0aW9uIGN5Y2xlIGhhcyBub3QgY29tcGxldGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9SRVNFVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFVzaW5nIHRoZSBjb21iaW5hdGlvbiBvZiBTTUJJIGFuZCBTV0VTTUJJIHNlbWFwaG9yZSBiaXRzIHdoZW4gcmVzZXR0aW5nCisgKiBhZGFwdGVyIG9yIEVlcHJvbSBhY2Nlc3MuCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gRTEwMDBfRVJSX0VFUFJPTSBpZiBmYWlsIHRvIGFjY2VzcyBFRVBST00uCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9nZXRfaHdfZWVwcm9tX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgdGltZW91dDsKKyAgICB1aW50MzJfdCBzd3NtOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9nZXRfaHdfZWVwcm9tX3NlbWFwaG9yZSIpOworCisgICAgaWYgKCFody0+ZWVwcm9tX3NlbWFwaG9yZV9wcmVzZW50KQorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pIHsKKyAgICAgICAgLyogR2V0IHRoZSBTVyBzZW1hcGhvcmUuICovCisgICAgICAgIGlmIChlMTAwMF9nZXRfc29mdHdhcmVfc2VtYXBob3JlKGh3KSAhPSBFMTAwMF9TVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKworICAgIC8qIEdldCB0aGUgRlcgc2VtYXBob3JlLiAqLworICAgIHRpbWVvdXQgPSBody0+ZWVwcm9tLndvcmRfc2l6ZSArIDE7CisgICAgd2hpbGUgKHRpbWVvdXQpIHsKKyAgICAgICAgc3dzbSA9IEUxMDAwX1JFQURfUkVHKGh3LCBTV1NNKTsKKyAgICAgICAgc3dzbSB8PSBFMTAwMF9TV1NNX1NXRVNNQkk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgU1dTTSwgc3dzbSk7CisgICAgICAgIC8qIGlmIHdlIG1hbmFnZWQgdG8gc2V0IHRoZSBiaXQgd2UgZ290IHRoZSBzZW1hcGhvcmUuICovCisgICAgICAgIHN3c20gPSBFMTAwMF9SRUFEX1JFRyhodywgU1dTTSk7CisgICAgICAgIGlmIChzd3NtICYgRTEwMDBfU1dTTV9TV0VTTUJJKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgdWRlbGF5KDUwKTsKKyAgICAgICAgdGltZW91dC0tOworICAgIH0KKworICAgIGlmICghdGltZW91dCkgeworICAgICAgICAvKiBSZWxlYXNlIHNlbWFwaG9yZXMgKi8KKyAgICAgICAgZTEwMDBfcHV0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpOworICAgICAgICBERUJVR09VVCgiRHJpdmVyIGNhbid0IGFjY2VzcyB0aGUgRWVwcm9tIC0gU1dFU01CSSBiaXQgaXMgc2V0LlxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiBjbGVhcnMgSFcgc2VtYXBob3JlIGJpdHMuCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3B1dF9od19lZXByb21fc2VtYXBob3JlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3Qgc3dzbTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcHV0X2h3X2VlcHJvbV9zZW1hcGhvcmUiKTsKKworICAgIGlmICghaHctPmVlcHJvbV9zZW1hcGhvcmVfcHJlc2VudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3dzbSA9IEUxMDAwX1JFQURfUkVHKGh3LCBTV1NNKTsKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSB7CisgICAgICAgIC8qIFJlbGVhc2UgYm90aCBzZW1hcGhvcmVzLiAqLworICAgICAgICBzd3NtICY9IH4oRTEwMDBfU1dTTV9TTUJJIHwgRTEwMDBfU1dTTV9TV0VTTUJJKTsKKyAgICB9IGVsc2UKKyAgICAgICAgc3dzbSAmPSB+KEUxMDAwX1NXU01fU1dFU01CSSk7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBTV1NNLCBzd3NtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE9idGFpbmluZyBzb2Z0d2FyZSBzZW1hcGhvcmUgYml0IChTTUJJKSBiZWZvcmUgcmVzZXR0aW5nIFBIWS4KKyAqCisgKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfUkVTRVQgaWYgZmFpbCB0byBvYnRhaW4gc2VtYXBob3JlLgorICogICAgICAgICAgICBFMTAwMF9TVUNDRVNTIGF0IGFueSBvdGhlciBjYXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfZ2V0X3NvZnR3YXJlX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgdGltZW91dCA9IGh3LT5lZXByb20ud29yZF9zaXplICsgMTsKKyAgICB1aW50MzJfdCBzd3NtOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9nZXRfc29mdHdhcmVfc2VtYXBob3JlIik7CisKKyAgICBpZiAoaHctPm1hY190eXBlICE9IGUxMDAwXzgwMDAzZXMybGFuKSB7CisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgIH0KKworICAgIHdoaWxlICh0aW1lb3V0KSB7CisgICAgICAgIHN3c20gPSBFMTAwMF9SRUFEX1JFRyhodywgU1dTTSk7CisgICAgICAgIC8qIElmIFNNQkkgYml0IGNsZWFyZWQsIGl0IGlzIG5vdyBzZXQgYW5kIHdlIGhvbGQgdGhlIHNlbWFwaG9yZSAqLworICAgICAgICBpZiAoIShzd3NtICYgRTEwMDBfU1dTTV9TTUJJKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBtZGVsYXkoMSk7CisgICAgICAgIHRpbWVvdXQtLTsKKyAgICB9CisKKyAgICBpZiAoIXRpbWVvdXQpIHsKKyAgICAgICAgREVCVUdPVVQoIkRyaXZlciBjYW4ndCBhY2Nlc3MgZGV2aWNlIC0gU01CSSBiaXQgaXMgc2V0LlxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1JFU0VUOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVsZWFzZSBzZW1hcGhvcmUgYml0IChTTUJJKS4KKyAqCisgKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IHN3c207CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3JlbGVhc2Vfc29mdHdhcmVfc2VtYXBob3JlIik7CisKKyAgICBpZiAoaHctPm1hY190eXBlICE9IGUxMDAwXzgwMDAzZXMybGFuKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd3NtID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNXU00pOworICAgIC8qIFJlbGVhc2UgdGhlIFNXIHNlbWFwaG9yZXMuKi8KKyAgICBzd3NtICY9IH5FMTAwMF9TV1NNX1NNQkk7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBTV1NNLCBzd3NtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2tzIGlmIFBIWSByZXNldCBpcyBibG9ja2VkIGR1ZSB0byBTT0wvSURFUiBzZXNzaW9uLCBmb3IgZXhhbXBsZS4KKyAqIFJldHVybmluZyBFMTAwMF9CTEtfUEhZX1JFU0VUIGlzbid0IG5lY2Vzc2FyaWx5IGFuIGVycm9yLiAgQnV0IGl0J3MgdXAgdG8KKyAqIHRoZSBjYWxsZXIgdG8gZmlndXJlIG91dCBob3cgdG8gZGVhbCB3aXRoIGl0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogcmV0dXJuczogLSBFMTAwMF9CTEtfUEhZX1JFU0VUCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBtYW5jID0gMDsKKyAgICB1aW50MzJfdCBmd3NtID0gMDsKKworICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgeworICAgICAgICBmd3NtID0gRTEwMDBfUkVBRF9SRUcoaHcsIEZXU00pOworICAgICAgICByZXR1cm4gKGZ3c20gJiBFMTAwMF9GV1NNX1JTUENJUEhZKSA/IEUxMDAwX1NVQ0NFU1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFMTAwMF9CTEtfUEhZX1JFU0VUOworICAgIH0KKworICAgIGlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMikKKyAgICAgICAgbWFuYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNQU5DKTsKKyAgICByZXR1cm4gKG1hbmMgJiBFMTAwMF9NQU5DX0JMS19QSFlfUlNUX09OX0lERSkgPworICAgICAgICBFMTAwMF9CTEtfUEhZX1JFU0VUIDogRTEwMDBfU1VDQ0VTUzsKK30KKworc3RhdGljIHVpbnQ4X3QKK2UxMDAwX2FyY19zdWJzeXN0ZW1fdmFsaWQoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBmd3NtOworCisgICAgLyogT24gODI1N3ggc2lsaWNvbiwgcmVnaXN0ZXJzIGluIHRoZSByYW5nZSBvZiAweDg4MDAgLSAweDhGRkMKKyAgICAgKiBtYXkgbm90IGJlIHByb3ZpZGVkIGEgRE1BIGNsb2NrIHdoZW4gbm8gbWFuYWdlYWJpbGl0eSBmZWF0dXJlcyBhcmUKKyAgICAgKiBlbmFibGVkLiAgV2UgZG8gbm90IHdhbnQgdG8gcGVyZm9ybSBhbnkgcmVhZHMvd3JpdGVzIHRvIHRoZXNlIHJlZ2lzdGVycworICAgICAqIGlmIHRoaXMgaXMgdGhlIGNhc2UuICBXZSByZWFkIEZXU00gdG8gZGV0ZXJtaW5lIHRoZSBtYW5hZ2VhYmlsaXR5IG1vZGUuCisgICAgICovCisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTcxOgorICAgIGNhc2UgZTEwMDBfODI1NzI6CisgICAgY2FzZSBlMTAwMF84MjU3MzoKKyAgICBjYXNlIGUxMDAwXzgwMDAzZXMybGFuOgorICAgIGNhc2UgZTEwMDBfODI1NzY6CisgICAgICAgIGZ3c20gPSBFMTAwMF9SRUFEX1JFRyhodywgRldTTSk7CisgICAgICAgIGlmICgoZndzbSAmIEUxMDAwX0ZXU01fTU9ERV9NQVNLKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfaWNoOGxhbjoKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb25maWd1cmUgUENJLUV4IG5vLXNub29wCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUuCisgKiBub19zbm9vcCAtIEJpdG1hcCBvZiBuby1zbm9vcCBldmVudHMuCisgKgorICogcmV0dXJuczogRTEwMDBfU1VDQ0VTUworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9zZXRfcGNpX2V4X25vX3Nub29wKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IG5vX3Nub29wKQoreworICAgIHVpbnQzMl90IGdjcl9yZWcgPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXRfcGNpX2V4X25vX3Nub29wIik7CisKKyAgICBpZiAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3Vua25vd24pCisgICAgICAgIGUxMDAwX2dldF9idXNfaW5mbyhodyk7CisKKyAgICBpZiAoaHctPmJ1c190eXBlICE9IGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzKQorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworICAgIGlmIChub19zbm9vcCkgeworICAgICAgICBnY3JfcmVnID0gRTEwMDBfUkVBRF9SRUcoaHcsIEdDUik7CisgICAgICAgIGdjcl9yZWcgJj0gfihQQ0lfRVhfTk9fU05PT1BfQUxMKTsKKyAgICAgICAgZ2NyX3JlZyB8PSBub19zbm9vcDsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBHQ1IsIGdjcl9yZWcpOworICAgIH0KKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKKyAgICAgICAgdWludDMyX3QgY3RybF9leHQ7CisKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBHQ1IsIFBDSV9FWF84MjU2Nl9TTk9PUF9BTEwpOworCisgICAgICAgIGN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkxfRVhUKTsKKyAgICAgICAgY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfUk9fRElTOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXQgc29mdHdhcmUgc2VtYXBob3JlIEZMQUcgYml0IChTV0ZMQUcpLgorICogU1dGTEFHIGlzIHVzZWQgdG8gc3luY2hyb25pemUgdGhlIGFjY2VzcyB0byBhbGwgc2hhcmVkIHJlc291cmNlIGJldHdlZW4KKyAqIFNXLCBGVyBhbmQgSFcuCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfZ2V0X3NvZnR3YXJlX2ZsYWcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHRpbWVvdXQgPSBQSFlfQ0ZHX1RJTUVPVVQ7CisgICAgdWludDMyX3QgZXh0Y25mX2N0cmw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2dldF9zb2Z0d2FyZV9mbGFnIik7CisKKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKKyAgICAgICAgd2hpbGUgKHRpbWVvdXQpIHsKKyAgICAgICAgICAgIGV4dGNuZl9jdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVYVENORl9DVFJMKTsKKyAgICAgICAgICAgIGV4dGNuZl9jdHJsIHw9IEUxMDAwX0VYVENORl9DVFJMX1NXRkxBRzsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRVhUQ05GX0NUUkwsIGV4dGNuZl9jdHJsKTsKKworICAgICAgICAgICAgZXh0Y25mX2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgRVhUQ05GX0NUUkwpOworICAgICAgICAgICAgaWYgKGV4dGNuZl9jdHJsICYgRTEwMDBfRVhUQ05GX0NUUkxfU1dGTEFHKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbWRlbGF5KDEpOworICAgICAgICAgICAgdGltZW91dC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF0aW1lb3V0KSB7CisgICAgICAgICAgICBERUJVR09VVCgiRlcgb3IgSFcgbG9ja3MgdGhlIHJlc291cmNlIHRvbyBsb25nLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlbGVhc2Ugc29mdHdhcmUgc2VtYXBob3JlIEZMQUcgYml0IChTV0ZMQUcpLgorICogU1dGTEFHIGlzIHVzZWQgdG8gc3luY2hyb25pemUgdGhlIGFjY2VzcyB0byBhbGwgc2hhcmVkIHJlc291cmNlIGJldHdlZW4KKyAqIFNXLCBGVyBhbmQgSFcuCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfcmVsZWFzZV9zb2Z0d2FyZV9mbGFnKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgZXh0Y25mX2N0cmw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3JlbGVhc2Vfc29mdHdhcmVfZmxhZyIpOworCisgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7CisgICAgICAgIGV4dGNuZl9jdHJsPSBFMTAwMF9SRUFEX1JFRyhodywgRVhUQ05GX0NUUkwpOworICAgICAgICBleHRjbmZfY3RybCAmPSB+RTEwMDBfRVhUQ05GX0NUUkxfU1dGTEFHOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVYVENORl9DVFJMLCBleHRjbmZfY3RybCk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkcyBhIDE2IGJpdCB3b3JkIG9yIHdvcmRzIGZyb20gdGhlIEVFUFJPTSB1c2luZyB0aGUgSUNIOCdzIGZsYXNoIGFjY2VzcworICogcmVnaXN0ZXIuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCBvZiB3b3JkIGluIHRoZSBFRVBST00gdG8gcmVhZAorICogZGF0YSAtIHdvcmQgcmVhZCBmcm9tIHRoZSBFRVBST00KKyAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9yZWFkX2VlcHJvbV9pY2g4KHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IG9mZnNldCwgdWludDE2X3Qgd29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworICAgIGludDMyX3QgIGVycm9yID0gRTEwMDBfU1VDQ0VTUzsKKyAgICB1aW50MzJfdCBmbGFzaF9iYW5rID0gMDsKKyAgICB1aW50MzJfdCBhY3Rfb2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBiYW5rX29mZnNldCA9IDA7CisgICAgdWludDE2X3Qgd29yZCA9IDA7CisgICAgdWludDE2X3QgaSA9IDA7CisKKyAgICAvKiBXZSBuZWVkIHRvIGtub3cgd2hpY2ggaXMgdGhlIHZhbGlkIGZsYXNoIGJhbmsuICBJbiB0aGUgZXZlbnQKKyAgICAgKiB0aGF0IHdlIGRpZG4ndCBhbGxvY2F0ZSBlZXByb21fc2hhZG93X3JhbSwgd2UgbWF5IG5vdCBiZQorICAgICAqIG1hbmFnaW5nIGZsYXNoX2JhbmsuICBTbyBpdCBjYW5ub3QgYmUgdHJ1c3RlZCBhbmQgbmVlZHMKKyAgICAgKiB0byBiZSB1cGRhdGVkIHdpdGggZWFjaCByZWFkLgorICAgICAqLworICAgIC8qIFZhbHVlIG9mIGJpdCAyMiBjb3JyZXNwb25kcyB0byB0aGUgZmxhc2ggYmFuayB3ZSdyZSBvbi4gKi8KKyAgICBmbGFzaF9iYW5rID0gKEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKSAmIEUxMDAwX0VFQ0RfU0VDMVZBTCkgPyAxIDogMDsKKworICAgIC8qIEFkanVzdCBvZmZzZXQgYXBwcm9wcmlhdGVseSBpZiB3ZSdyZSBvbiBiYW5rIDEgLSBhZGp1c3QgZm9yIHdvcmQgc2l6ZSAqLworICAgIGJhbmtfb2Zmc2V0ID0gZmxhc2hfYmFuayAqIChody0+Zmxhc2hfYmFua19zaXplICogMik7CisKKyAgICBlcnJvciA9IGUxMDAwX2dldF9zb2Z0d2FyZV9mbGFnKGh3KTsKKyAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKKyAgICAgICAgaWYgKGh3LT5lZXByb21fc2hhZG93X3JhbSAhPSBOVUxMICYmCisgICAgICAgICAgICBody0+ZWVwcm9tX3NoYWRvd19yYW1bb2Zmc2V0K2ldLm1vZGlmaWVkID09IFRSVUUpIHsKKyAgICAgICAgICAgIGRhdGFbaV0gPSBody0+ZWVwcm9tX3NoYWRvd19yYW1bb2Zmc2V0K2ldLmVlcHJvbV93b3JkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVGhlIE5WTSBwYXJ0IG5lZWRzIGEgYnl0ZSBvZmZzZXQsIGhlbmNlICogMiAqLworICAgICAgICAgICAgYWN0X29mZnNldCA9IGJhbmtfb2Zmc2V0ICsgKChvZmZzZXQgKyBpKSAqIDIpOworICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF9yZWFkX2ljaDhfd29yZChodywgYWN0X29mZnNldCwgJndvcmQpOworICAgICAgICAgICAgaWYgKGVycm9yICE9IEUxMDAwX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkYXRhW2ldID0gd29yZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGUxMDAwX3JlbGVhc2Vfc29mdHdhcmVfZmxhZyhodyk7CisKKyAgICByZXR1cm4gZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdyaXRlcyBhIDE2IGJpdCB3b3JkIG9yIHdvcmRzIHRvIHRoZSBFRVBST00gdXNpbmcgdGhlIElDSDgncyBmbGFzaCBhY2Nlc3MKKyAqIHJlZ2lzdGVyLiAgQWN0dWFsbHksIHdyaXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgc2hhZG93IHJhbSBjYWNoZSBpbiB0aGUgaHcKKyAqIHN0cnVjdHVyZSBody0+ZTEwMDBfc2hhZG93X3JhbS4gIGUxMDAwX2NvbW1pdF9zaGFkb3dfcmFtIGZsdXNoZXMgdGhpcyB0bworICogdGhlIE5WTSwgd2hpY2ggb2NjdXJzIHdoZW4gdGhlIE5WTSBjaGVja3N1bSBpcyB1cGRhdGVkLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBvZmZzZXQgb2Ygd29yZCBpbiB0aGUgRUVQUk9NIHRvIHdyaXRlCisgKiB3b3JkcyAtIG51bWJlciBvZiB3b3JkcyB0byB3cml0ZQorICogZGF0YSAtIHdvcmRzIHRvIHdyaXRlIHRvIHRoZSBFRVBST00KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF93cml0ZV9lZXByb21faWNoOChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCBvZmZzZXQsIHVpbnQxNl90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRhdGEpCit7CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgaW50MzJfdCBlcnJvciA9IEUxMDAwX1NVQ0NFU1M7CisKKyAgICBlcnJvciA9IGUxMDAwX2dldF9zb2Z0d2FyZV9mbGFnKGh3KTsKKyAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgLyogQSBkcml2ZXIgY2FuIHdyaXRlIHRvIHRoZSBOVk0gb25seSBpZiBpdCBoYXMgZWVwcm9tX3NoYWRvd19yYW0KKyAgICAgKiBhbGxvY2F0ZWQuICBTdWJzZXF1ZW50IHJlYWRzIHRvIHRoZSBtb2RpZmllZCB3b3JkcyBhcmUgcmVhZCBmcm9tCisgICAgICogdGhpcyBjYWNoZWQgc3RydWN0dXJlIGFzIHdlbGwuICBXcml0ZXMgd2lsbCBvbmx5IGdvIGludG8gdGhpcworICAgICAqIGNhY2hlZCBzdHJ1Y3R1cmUgdW5sZXNzIGl0J3MgZm9sbG93ZWQgYnkgYSBjYWxsIHRvCisgICAgICogZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSgpIHdoZXJlIGl0IHdpbGwgY29tbWl0IHRoZSBjaGFuZ2VzCisgICAgICogYW5kIGNsZWFyIHRoZSAibW9kaWZpZWQiIGZpZWxkLgorICAgICAqLworICAgIGlmIChody0+ZWVwcm9tX3NoYWRvd19yYW0gIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgeworICAgICAgICAgICAgaWYgKChvZmZzZXQgKyBpKSA8IEUxMDAwX1NIQURPV19SQU1fV09SRFMpIHsKKyAgICAgICAgICAgICAgICBody0+ZWVwcm9tX3NoYWRvd19yYW1bb2Zmc2V0K2ldLm1vZGlmaWVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBody0+ZWVwcm9tX3NoYWRvd19yYW1bb2Zmc2V0K2ldLmVlcHJvbV93b3JkID0gZGF0YVtpXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIERyaXZlcnMgaGF2ZSB0aGUgb3B0aW9uIHRvIG5vdCBhbGxvY2F0ZSBlZXByb21fc2hhZG93X3JhbSBhcyBsb25nCisgICAgICAgICAqIGFzIHRoZXkgZG9uJ3QgcGVyZm9ybSBhbnkgTlZNIHdyaXRlcy4gIEFuIGF0dGVtcHQgaW4gZG9pbmcgc28KKyAgICAgICAgICogd2lsbCByZXN1bHQgaW4gdGhpcyBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIGVycm9yID0gLUUxMDAwX0VSUl9FRVBST007CisgICAgfQorCisgICAgZTEwMDBfcmVsZWFzZV9zb2Z0d2FyZV9mbGFnKGh3KTsKKworICAgIHJldHVybiBlcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGluaXRpYWwgZmxhc2ggc2V0dXAgc28gdGhhdCBhIG5ldyByZWFkL3dyaXRlL2VyYXNlIGN5Y2xlCisgKiBjYW4gYmUgc3RhcnRlZC4KKyAqCisgKiBodyAtIFRoZSBwb2ludGVyIHRvIHRoZSBodyBzdHJ1Y3R1cmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2ljaDhfY3ljbGVfaW5pdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVuaW9uIGljaDhfaHdzX2ZsYXNoX3N0YXR1cyBoc2ZzdHM7CisgICAgaW50MzJfdCBlcnJvciA9IEUxMDAwX0VSUl9FRVBST007CisgICAgaW50MzJfdCBpICAgICA9IDA7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2ljaDhfY3ljbGVfaW5pdCIpOworCisgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTKTsKKworICAgIC8qIE1heSBiZSBjaGVjayB0aGUgRmxhc2ggRGVzIFZhbGlkIGJpdCBpbiBIdyBzdGF0dXMgKi8KKyAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxkZXN2YWxpZCA9PSAwKSB7CisgICAgICAgIERFQlVHT1VUKCJGbGFzaCBkZXNjcmlwdG9yIGludmFsaWQuICBTVyBTZXF1ZW5jaW5nIG11c3QgYmUgdXNlZC4iKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIC8qIENsZWFyIEZDRVJSIGluIEh3IHN0YXR1cyBieSB3cml0aW5nIDEgKi8KKyAgICAvKiBDbGVhciBEQUVMIGluIEh3IHN0YXR1cyBieSB3cml0aW5nIGEgMSAqLworICAgIGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2VyciA9IDE7CisgICAgaHNmc3RzLmhzZl9zdGF0dXMuZGFlbCA9IDE7CisKKyAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwpOworCisgICAgLyogRWl0aGVyIHdlIHNob3VsZCBoYXZlIGEgaGFyZHdhcmUgU1BJIGN5Y2xlIGluIHByb2dyZXNzIGJpdCB0byBjaGVjaworICAgICAqIGFnYWluc3QsIGluIG9yZGVyIHRvIHN0YXJ0IGEgbmV3IGN5Y2xlIG9yIEZET05FIGJpdCBzaG91bGQgYmUgY2hhbmdlZAorICAgICAqIGluIHRoZSBoYXJkd2FyZSBzbyB0aGF0IGl0IGlzIDEgYWZ0ZXIgaGFyd2FyZSByZXNldCwgd2hpY2ggY2FuIHRoZW4gYmUKKyAgICAgKiB1c2VkIGFzIGFuIGluZGljYXRpb24gd2hldGhlciBhIGN5Y2xlIGlzIGluIHByb2dyZXNzIG9yIGhhcyBiZWVuCisgICAgICogY29tcGxldGVkIC4uIHdlIHNob3VsZCBhbHNvIGhhdmUgc29tZSBzb2Z0d2FyZSBzZW1hcGhvcmUgbWVjaGFuaXNtIHRvCisgICAgICogZ3VhcmQgRkRPTkUgb3IgdGhlIGN5Y2xlIGluIHByb2dyZXNzIGJpdCBzbyB0aGF0IHR3byB0aHJlYWRzIGFjY2VzcyB0bworICAgICAqIHRob3NlIGJpdHMgY2FuIGJlIHNlcXVlbnRpYWxsaXplZCBvciBhIHdheSBzbyB0aGF0IDIgdGhyZWFkcyBkb250CisgICAgICogc3RhcnQgdGhlIGN5Y2xlIGF0IHRoZSBzYW1lIHRpbWUgKi8KKworICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGNpbnByb2cgPT0gMCkgeworICAgICAgICAvKiBUaGVyZSBpcyBubyBjeWNsZSBydW5uaW5nIGF0IHByZXNlbnQsIHNvIHdlIGNhbiBzdGFydCBhIGN5Y2xlICovCisgICAgICAgIC8qIEJlZ2luIGJ5IHNldHRpbmcgRmxhc2ggQ3ljbGUgRG9uZS4gKi8KKyAgICAgICAgaHNmc3RzLmhzZl9zdGF0dXMuZmxjZG9uZSA9IDE7CisgICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CisgICAgICAgIGVycm9yID0gRTEwMDBfU1VDQ0VTUzsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBvdGhlcndpc2UgcG9sbCBmb3Igc29tZXRpbWUgc28gdGhlIGN1cnJlbnQgY3ljbGUgaGFzIGEgY2hhbmNlCisgICAgICAgICAqIHRvIGVuZCBiZWZvcmUgZ2l2aW5nIHVwLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSUNIX0ZMQVNIX0NPTU1BTkRfVElNRU9VVDsgaSsrKSB7CisgICAgICAgICAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMpOworICAgICAgICAgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2lucHJvZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBFMTAwMF9TVUNDRVNTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWRlbGF5KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnJvciA9PSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIGluIHdhaXRpbmcgZm9yIHByZXZpb3VzIGN5Y2xlIHRvIHRpbWVvdXQsCisgICAgICAgICAgICAgKiBub3cgc2V0IHRoZSBGbGFzaCBDeWNsZSBEb25lLiAqLworICAgICAgICAgICAgaHNmc3RzLmhzZl9zdGF0dXMuZmxjZG9uZSA9IDE7CisgICAgICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgREVCVUdPVVQoIkZsYXNoIGNvbnRyb2xsZXIgYnVzeSwgY2Fubm90IGdldCBhY2Nlc3MiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIGEgZmxhc2ggY3ljbGUgYW5kIHdhaXRzIGZvciBpdHMgY29tcGxldGlvbgorICoKKyAqIGh3IC0gVGhlIHBvaW50ZXIgdG8gdGhlIGh3IHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCB0aW1lb3V0KQoreworICAgIHVuaW9uIGljaDhfaHdzX2ZsYXNoX2N0cmwgaHNmbGN0bDsKKyAgICB1bmlvbiBpY2g4X2h3c19mbGFzaF9zdGF0dXMgaHNmc3RzOworICAgIGludDMyX3QgZXJyb3IgPSBFMTAwMF9FUlJfRUVQUk9NOworICAgIHVpbnQzMl90IGkgPSAwOworCisgICAgLyogU3RhcnQgYSBjeWNsZSBieSB3cml0aW5nIDEgaW4gRmxhc2ggQ3ljbGUgR28gaW4gSHcgRmxhc2ggQ29udHJvbCAqLworICAgIGhzZmxjdGwucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwpOworICAgIGhzZmxjdGwuaHNmX2N0cmwuZmxjZ28gPSAxOworICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCwgaHNmbGN0bC5yZWd2YWwpOworCisgICAgLyogd2FpdCB0aWxsIEZET05FIGJpdCBpcyBzZXQgdG8gMSAqLworICAgIGRvIHsKKyAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTKTsKKyAgICAgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2RvbmUgPT0gMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgIGkrKzsKKyAgICB9IHdoaWxlIChpIDwgdGltZW91dCk7CisgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2RvbmUgPT0gMSAmJiBoc2ZzdHMuaHNmX3N0YXR1cy5mbGNlcnIgPT0gMCkgeworICAgICAgICBlcnJvciA9IEUxMDAwX1NVQ0NFU1M7CisgICAgfQorICAgIHJldHVybiBlcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZHMgYSBieXRlIG9yIHdvcmQgZnJvbSB0aGUgTlZNIHVzaW5nIHRoZSBJQ0g4IGZsYXNoIGFjY2VzcyByZWdpc3RlcnMuCisgKgorICogaHcgLSBUaGUgcG9pbnRlciB0byB0aGUgaHcgc3RydWN0dXJlCisgKiBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgYnl0ZSBvciB3b3JkIHRvIHJlYWQuCisgKiBzaXplIC0gU2l6ZSBvZiBkYXRhIHRvIHJlYWQsIDE9Ynl0ZSAyPXdvcmQKKyAqIGRhdGEgLSBQb2ludGVyIHRvIHRoZSB3b3JkIHRvIHN0b3JlIHRoZSB2YWx1ZSByZWFkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3JlYWRfaWNoOF9kYXRhKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwgdWludDE2X3QqIGRhdGEpCit7CisgICAgdW5pb24gaWNoOF9od3NfZmxhc2hfc3RhdHVzIGhzZnN0czsKKyAgICB1bmlvbiBpY2g4X2h3c19mbGFzaF9jdHJsIGhzZmxjdGw7CisgICAgdWludDMyX3QgZmxhc2hfbGluZWFyX2FkZHJlc3M7CisgICAgdWludDMyX3QgZmxhc2hfZGF0YSA9IDA7CisgICAgaW50MzJfdCBlcnJvciA9IC1FMTAwMF9FUlJfRUVQUk9NOworICAgIGludDMyX3QgY291bnQgPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX2ljaDhfZGF0YSIpOworCisgICAgaWYgKHNpemUgPCAxICB8fCBzaXplID4gMiB8fCBkYXRhID09IDB4MCB8fAorICAgICAgICBpbmRleCA+IElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICBmbGFzaF9saW5lYXJfYWRkcmVzcyA9IChJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSyAmIGluZGV4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBody0+Zmxhc2hfYmFzZV9hZGRyOworCisgICAgZG8geworICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgIC8qIFN0ZXBzICovCisgICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9jeWNsZV9pbml0KGh3KTsKKyAgICAgICAgaWYgKGVycm9yICE9IEUxMDAwX1NVQ0NFU1MpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBoc2ZsY3RsLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMKTsKKyAgICAgICAgLyogMGIvMWIgY29ycmVzcG9uZHMgdG8gMSBvciAyIGJ5dGUgc2l6ZSwgcmVzcGVjdGl2ZWx5LiAqLworICAgICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsZGJjb3VudCA9IHNpemUgLSAxOworICAgICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsY3ljbGUgPSBJQ0hfQ1lDTEVfUkVBRDsKKyAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CisKKyAgICAgICAgLyogV3JpdGUgdGhlIGxhc3QgMjQgYml0cyBvZiBpbmRleCBpbnRvIEZsYXNoIExpbmVhciBhZGRyZXNzIGZpZWxkIGluCisgICAgICAgICAqIEZsYXNoIEFkZHJlc3MgKi8KKyAgICAgICAgLyogVE9ETzogVEJEIG1heWJlIGNoZWNrIHRoZSBpbmRleCBhZ2FpbnN0IHRoZSBzaXplIG9mIGZsYXNoICovCisKKyAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRyhodywgSUNIX0ZMQVNIX0ZBRERSLCBmbGFzaF9saW5lYXJfYWRkcmVzcyk7CisKKyAgICAgICAgZXJyb3IgPSBlMTAwMF9pY2g4X2ZsYXNoX2N5Y2xlKGh3LCBJQ0hfRkxBU0hfQ09NTUFORF9USU1FT1VUKTsKKworICAgICAgICAvKiBDaGVjayBpZiBGQ0VSUiBpcyBzZXQgdG8gMSwgaWYgc2V0IHRvIDEsIGNsZWFyIGl0IGFuZCB0cnkgdGhlIHdob2xlCisgICAgICAgICAqIHNlcXVlbmNlIGEgZmV3IG1vcmUgdGltZXMsIGVsc2UgcmVhZCBpbiAoc2hpZnQgaW4pIHRoZSBGbGFzaCBEYXRhMCwKKyAgICAgICAgICogdGhlIG9yZGVyIGlzIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgbXNiIHRvIGxzYiAqLworICAgICAgICBpZiAoZXJyb3IgPT0gRTEwMDBfU1VDQ0VTUykgeworICAgICAgICAgICAgZmxhc2hfZGF0YSA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRyhodywgSUNIX0ZMQVNIX0ZEQVRBMCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgKmRhdGEgPSAodWludDhfdCkoZmxhc2hfZGF0YSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgICAgICAgICAqZGF0YSA9ICh1aW50MTZfdCkoZmxhc2hfZGF0YSAmIDB4MDAwMEZGRkYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBJZiB3ZSd2ZSBnb3R0ZW4gaGVyZSwgdGhlbiB0aGluZ3MgYXJlIHByb2JhYmx5IGNvbXBsZXRlbHkgaG9zZWQsCisgICAgICAgICAgICAgKiBidXQgaWYgdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBkZXRlY3RlZCwgaXQgd29uJ3QgaHVydCB0byBnaXZlCisgICAgICAgICAgICAgKiBpdCBhbm90aGVyIHRyeS4uLklDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgdGltZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7CisgICAgICAgICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyID09IDEpIHsKKyAgICAgICAgICAgICAgICAvKiBSZXBlYXQgZm9yIHNvbWUgdGltZSBiZWZvcmUgZ2l2aW5nIHVwLiAqLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGNkb25lID09IDApIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiVGltZW91dCBlcnJvciAtIGZsYXNoIGN5Y2xlIGRpZCBub3QgY29tcGxldGUuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChjb3VudCsrIDwgSUNIX0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCk7CisKKyAgICByZXR1cm4gZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdyaXRlcyBPbmUgL3R3byBieXRlcyB0byB0aGUgTlZNIHVzaW5nIHRoZSBJQ0g4IGZsYXNoIGFjY2VzcyByZWdpc3RlcnMuCisgKgorICogaHcgLSBUaGUgcG9pbnRlciB0byB0aGUgaHcgc3RydWN0dXJlCisgKiBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgYnl0ZS93b3JkIHRvIHJlYWQuCisgKiBzaXplIC0gU2l6ZSBvZiBkYXRhIHRvIHJlYWQsIDE9Ynl0ZSAyPXdvcmQKKyAqIGRhdGEgLSBUaGUgYnl0ZShzKSB0byB3cml0ZSB0byB0aGUgTlZNLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3dyaXRlX2ljaDhfZGF0YShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCBpbmRleCwgdWludDMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhKQoreworICAgIHVuaW9uIGljaDhfaHdzX2ZsYXNoX3N0YXR1cyBoc2ZzdHM7CisgICAgdW5pb24gaWNoOF9od3NfZmxhc2hfY3RybCBoc2ZsY3RsOworICAgIHVpbnQzMl90IGZsYXNoX2xpbmVhcl9hZGRyZXNzOworICAgIHVpbnQzMl90IGZsYXNoX2RhdGEgPSAwOworICAgIGludDMyX3QgZXJyb3IgPSAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICBpbnQzMl90IGNvdW50ID0gMDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfd3JpdGVfaWNoOF9kYXRhIik7CisKKyAgICBpZiAoc2l6ZSA8IDEgIHx8IHNpemUgPiAyIHx8IGRhdGEgPiBzaXplICogMHhmZiB8fAorICAgICAgICBpbmRleCA+IElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICBmbGFzaF9saW5lYXJfYWRkcmVzcyA9IChJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSyAmIGluZGV4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBody0+Zmxhc2hfYmFzZV9hZGRyOworCisgICAgZG8geworICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgIC8qIFN0ZXBzICovCisgICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9jeWNsZV9pbml0KGh3KTsKKyAgICAgICAgaWYgKGVycm9yICE9IEUxMDAwX1NVQ0NFU1MpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBoc2ZsY3RsLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMKTsKKyAgICAgICAgLyogMGIvMWIgY29ycmVzcG9uZHMgdG8gMSBvciAyIGJ5dGUgc2l6ZSwgcmVzcGVjdGl2ZWx5LiAqLworICAgICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsZGJjb3VudCA9IHNpemUgLTE7CisgICAgICAgIGhzZmxjdGwuaHNmX2N0cmwuZmxjeWNsZSA9IElDSF9DWUNMRV9XUklURTsKKyAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CisKKyAgICAgICAgLyogV3JpdGUgdGhlIGxhc3QgMjQgYml0cyBvZiBpbmRleCBpbnRvIEZsYXNoIExpbmVhciBhZGRyZXNzIGZpZWxkIGluCisgICAgICAgICAqIEZsYXNoIEFkZHJlc3MgKi8KKyAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRyhodywgSUNIX0ZMQVNIX0ZBRERSLCBmbGFzaF9saW5lYXJfYWRkcmVzcyk7CisKKyAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgIGZsYXNoX2RhdGEgPSAodWludDMyX3QpZGF0YSAmIDB4MDBGRjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhc2hfZGF0YSA9ICh1aW50MzJfdClkYXRhOworCisgICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcoaHcsIElDSF9GTEFTSF9GREFUQTAsIGZsYXNoX2RhdGEpOworCisgICAgICAgIC8qIGNoZWNrIGlmIEZDRVJSIGlzIHNldCB0byAxICwgaWYgc2V0IHRvIDEsIGNsZWFyIGl0IGFuZCB0cnkgdGhlIHdob2xlCisgICAgICAgICAqIHNlcXVlbmNlIGEgZmV3IG1vcmUgdGltZXMgZWxzZSBkb25lICovCisgICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShodywgSUNIX0ZMQVNIX0NPTU1BTkRfVElNRU9VVCk7CisgICAgICAgIGlmIChlcnJvciA9PSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIElmIHdlJ3JlIGhlcmUsIHRoZW4gdGhpbmdzIGFyZSBtb3N0IGxpa2VseSBjb21wbGV0ZWx5IGhvc2VkLAorICAgICAgICAgICAgICogYnV0IGlmIHRoZSBlcnJvciBjb25kaXRpb24gaXMgZGV0ZWN0ZWQsIGl0IHdvbid0IGh1cnQgdG8gZ2l2ZQorICAgICAgICAgICAgICogaXQgYW5vdGhlciB0cnkuLi5JQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UIHRpbWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMpOworICAgICAgICAgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2VyciA9PSAxKSB7CisgICAgICAgICAgICAgICAgLyogUmVwZWF0IGZvciBzb21lIHRpbWUgYmVmb3JlIGdpdmluZyB1cC4gKi8KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZG9uZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIlRpbWVvdXQgZXJyb3IgLSBmbGFzaCBjeWNsZSBkaWQgbm90IGNvbXBsZXRlLiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoY291bnQrKyA8IElDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQpOworCisgICAgcmV0dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhlIE5WTSB1c2luZyB0aGUgSUNIOCBmbGFzaCBhY2Nlc3MgcmVnaXN0ZXJzLgorICoKKyAqIGh3IC0gcG9pbnRlciB0byBlMTAwMF9odyBzdHJ1Y3R1cmUKKyAqIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBieXRlIHRvIHJlYWQuCisgKiBkYXRhIC0gUG9pbnRlciB0byBhIGJ5dGUgdG8gc3RvcmUgdGhlIHZhbHVlIHJlYWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfcmVhZF9pY2g4X2J5dGUoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgaW5kZXgsIHVpbnQ4X3QqIGRhdGEpCit7CisgICAgaW50MzJfdCBzdGF0dXMgPSBFMTAwMF9TVUNDRVNTOworICAgIHVpbnQxNl90IHdvcmQgPSAwOworCisgICAgc3RhdHVzID0gZTEwMDBfcmVhZF9pY2g4X2RhdGEoaHcsIGluZGV4LCAxLCAmd29yZCk7CisgICAgaWYgKHN0YXR1cyA9PSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICpkYXRhID0gKHVpbnQ4X3Qpd29yZDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSB0byB0aGUgTlZNIHVzaW5nIHRoZSBJQ0g4IGZsYXNoIGFjY2VzcyByZWdpc3RlcnMuCisgKiBQZXJmb3JtcyB2ZXJpZmljYXRpb24gYnkgcmVhZGluZyBiYWNrIHRoZSB2YWx1ZSBhbmQgdGhlbiBnb2luZyB0aHJvdWdoCisgKiBhIHJldHJ5IGFsZ29yaXRobSBiZWZvcmUgZ2l2aW5nIHVwLgorICoKKyAqIGh3IC0gcG9pbnRlciB0byBlMTAwMF9odyBzdHJ1Y3R1cmUKKyAqIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBieXRlIHRvIHdyaXRlLgorICogYnl0ZSAtIFRoZSBieXRlIHRvIHdyaXRlIHRvIHRoZSBOVk0uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCBpbmRleCwgdWludDhfdCBieXRlKQoreworICAgIGludDMyX3QgZXJyb3IgPSBFMTAwMF9TVUNDRVNTOworICAgIGludDMyX3QgcHJvZ3JhbV9yZXRyaWVzID0gMDsKKworICAgIERFQlVHT1VUMigiQnl0ZSA6PSAlMi4yWCBPZmZzZXQgOj0gJWRcbiIsIGJ5dGUsIGluZGV4KTsKKworICAgIGVycm9yID0gZTEwMDBfd3JpdGVfaWNoOF9ieXRlKGh3LCBpbmRleCwgYnl0ZSk7CisKKyAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykgeworICAgICAgICBmb3IgKHByb2dyYW1fcmV0cmllcyA9IDA7IHByb2dyYW1fcmV0cmllcyA8IDEwMDsgcHJvZ3JhbV9yZXRyaWVzKyspIHsKKyAgICAgICAgICAgIERFQlVHT1VUMigiUmV0cnlpbmcgXHQgQnl0ZSA6PSAlMi4yWCBPZmZzZXQgOj0gJWRcbiIsIGJ5dGUsIGluZGV4KTsKKyAgICAgICAgICAgIGVycm9yID0gZTEwMDBfd3JpdGVfaWNoOF9ieXRlKGh3LCBpbmRleCwgYnl0ZSk7CisgICAgICAgICAgICB1ZGVsYXkoMTAwKTsKKyAgICAgICAgICAgIGlmIChlcnJvciA9PSBFMTAwMF9TVUNDRVNTKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByb2dyYW1fcmV0cmllcyA9PSAxMDApCisgICAgICAgIGVycm9yID0gRTEwMDBfRVJSX0VFUFJPTTsKKworICAgIHJldHVybiBlcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIE5WTSB1c2luZyB0aGUgSUNIOCBmbGFzaCBhY2Nlc3MgcmVnaXN0ZXJzLgorICoKKyAqIGh3IC0gcG9pbnRlciB0byBlMTAwMF9odyBzdHJ1Y3R1cmUKKyAqIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBieXRlIHRvIHJlYWQuCisgKiBkYXRhIC0gVGhlIGJ5dGUgdG8gd3JpdGUgdG8gdGhlIE5WTS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF93cml0ZV9pY2g4X2J5dGUoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgaW5kZXgsIHVpbnQ4X3QgZGF0YSkKK3sKKyAgICBpbnQzMl90IHN0YXR1cyA9IEUxMDAwX1NVQ0NFU1M7CisgICAgdWludDE2X3Qgd29yZCA9ICh1aW50MTZfdClkYXRhOworCisgICAgc3RhdHVzID0gZTEwMDBfd3JpdGVfaWNoOF9kYXRhKGh3LCBpbmRleCwgMSwgd29yZCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkcyBhIHdvcmQgZnJvbSB0aGUgTlZNIHVzaW5nIHRoZSBJQ0g4IGZsYXNoIGFjY2VzcyByZWdpc3RlcnMuCisgKgorICogaHcgLSBwb2ludGVyIHRvIGUxMDAwX2h3IHN0cnVjdHVyZQorICogaW5kZXggLSBUaGUgc3RhcnRpbmcgYnl0ZSBpbmRleCBvZiB0aGUgd29yZCB0byByZWFkLgorICogZGF0YSAtIFBvaW50ZXIgdG8gYSB3b3JkIHRvIHN0b3JlIHRoZSB2YWx1ZSByZWFkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3JlYWRfaWNoOF93b3JkKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IGluZGV4LCB1aW50MTZfdCAqZGF0YSkKK3sKKyAgICBpbnQzMl90IHN0YXR1cyA9IEUxMDAwX1NVQ0NFU1M7CisgICAgc3RhdHVzID0gZTEwMDBfcmVhZF9pY2g4X2RhdGEoaHcsIGluZGV4LCAyLCBkYXRhKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFcmFzZXMgdGhlIGJhbmsgc3BlY2lmaWVkLiBFYWNoIGJhbmsgbWF5IGJlIGEgNCwgOCBvciA2NGsgYmxvY2suIEJhbmtzIGFyZSAwCisgKiBiYXNlZC4KKyAqCisgKiBodyAtIHBvaW50ZXIgdG8gZTEwMDBfaHcgc3RydWN0dXJlCisgKiBiYW5rIC0gMCBmb3IgZmlyc3QgYmFuaywgMSBmb3Igc2Vjb25kIGJhbmsKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgYWN0dWFsbHkgZXJhc2UgYXMgbXVjaCBhcyA4IG9yIDY0IEtCeXRlcy4gIFRoZQorICogYW1vdW50IG9mIE5WTSB1c2VkIGluIGVhY2ggYmFuayBpcyBhICptaW5pbXVtKiBvZiA0IEtCeXRlcywgYnV0IGluIGZhY3QgdGhlCisgKiBiYW5rIHNpemUgbWF5IGJlIDQsIDggb3IgNjQgS0J5dGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9lcmFzZV9pY2g4XzRrX3NlZ21lbnQoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgYmFuaykKK3sKKyAgICB1bmlvbiBpY2g4X2h3c19mbGFzaF9zdGF0dXMgaHNmc3RzOworICAgIHVuaW9uIGljaDhfaHdzX2ZsYXNoX2N0cmwgaHNmbGN0bDsKKyAgICB1aW50MzJfdCBmbGFzaF9saW5lYXJfYWRkcmVzczsKKyAgICBpbnQzMl90ICBjb3VudCA9IDA7CisgICAgaW50MzJfdCAgZXJyb3IgPSBFMTAwMF9FUlJfRUVQUk9NOworICAgIGludDMyX3QgIGl0ZXJhdGlvbjsKKyAgICBpbnQzMl90ICBzdWJfc2VjdG9yX3NpemUgPSAwOworICAgIGludDMyX3QgIGJhbmtfc2l6ZTsKKyAgICBpbnQzMl90ICBqID0gMDsKKyAgICBpbnQzMl90ICBlcnJvcl9mbGFnID0gMDsKKworICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7CisKKyAgICAvKiBEZXRlcm1pbmUgSFcgU2VjdG9yIHNpemU6IFJlYWQgQkVSQVNFIGJpdHMgb2YgSHcgZmxhc2ggU3RhdHVzIHJlZ2lzdGVyICovCisgICAgLyogMDA6IFRoZSBIdyBzZWN0b3IgaXMgMjU2IGJ5dGVzLCBoZW5jZSB3ZSBuZWVkIHRvIGVyYXNlIDE2CisgICAgICogICAgIGNvbnNlY3V0aXZlIHNlY3RvcnMuICBUaGUgc3RhcnQgaW5kZXggZm9yIHRoZSBudGggSHcgc2VjdG9yIGNhbiBiZQorICAgICAqICAgICBjYWxjdWxhdGVkIGFzIGJhbmsgKiA0MDk2ICsgbiAqIDI1NgorICAgICAqIDAxOiBUaGUgSHcgc2VjdG9yIGlzIDRLIGJ5dGVzLCBoZW5jZSB3ZSBuZWVkIHRvIGVyYXNlIDEgc2VjdG9yLgorICAgICAqICAgICBUaGUgc3RhcnQgaW5kZXggZm9yIHRoZSBudGggSHcgc2VjdG9yIGNhbiBiZSBjYWxjdWxhdGVkCisgICAgICogICAgIGFzIGJhbmsgKiA0MDk2CisgICAgICogMTA6IFRoZSBIVyBzZWN0b3IgaXMgOEsgYnl0ZXMKKyAgICAgKiAxMTogVGhlIEh3IHNlY3RvciBzaXplIGlzIDY0SyBieXRlcyAqLworICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5iZXJhc2VzeiA9PSAweDApIHsKKyAgICAgICAgLyogSHcgc2VjdG9yIHNpemUgMjU2ICovCisgICAgICAgIHN1Yl9zZWN0b3Jfc2l6ZSA9IElDSF9GTEFTSF9TRUdfU0laRV8yNTY7CisgICAgICAgIGJhbmtfc2l6ZSA9IElDSF9GTEFTSF9TRUNUT1JfU0laRTsKKyAgICAgICAgaXRlcmF0aW9uID0gSUNIX0ZMQVNIX1NFQ1RPUl9TSVpFIC8gSUNIX0ZMQVNIX1NFR19TSVpFXzI1NjsKKyAgICB9IGVsc2UgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmJlcmFzZXN6ID09IDB4MSkgeworICAgICAgICBiYW5rX3NpemUgPSBJQ0hfRkxBU0hfU0VHX1NJWkVfNEs7CisgICAgICAgIGl0ZXJhdGlvbiA9IDE7CisgICAgfSBlbHNlIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5iZXJhc2VzeiA9PSAweDMpIHsKKyAgICAgICAgYmFua19zaXplID0gSUNIX0ZMQVNIX1NFR19TSVpFXzY0SzsKKyAgICAgICAgaXRlcmF0aW9uID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IGl0ZXJhdGlvbiA7IGorKykgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgLyogU3RlcHMgKi8KKyAgICAgICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9jeWNsZV9pbml0KGh3KTsKKyAgICAgICAgICAgIGlmIChlcnJvciAhPSBFMTAwMF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFdyaXRlIGEgdmFsdWUgMTEgKGJsb2NrIEVyYXNlKSBpbiBGbGFzaCBDeWNsZSBmaWVsZCBpbiBIdyBmbGFzaAorICAgICAgICAgICAgICogQ29udHJvbCAqLworICAgICAgICAgICAgaHNmbGN0bC5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCk7CisgICAgICAgICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsY3ljbGUgPSBJQ0hfQ1lDTEVfRVJBU0U7CisgICAgICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKKworICAgICAgICAgICAgLyogV3JpdGUgdGhlIGxhc3QgMjQgYml0cyBvZiBhbiBpbmRleCB3aXRoaW4gdGhlIGJsb2NrIGludG8gRmxhc2gKKyAgICAgICAgICAgICAqIExpbmVhciBhZGRyZXNzIGZpZWxkIGluIEZsYXNoIEFkZHJlc3MuICBUaGlzIHByb2JhYmx5IG5lZWRzIHRvCisgICAgICAgICAgICAgKiBiZSBjYWxjdWxhdGVkIGhlcmUgYmFzZWQgb2ZmIHRoZSBvbi1jaGlwIGVyYXNlIHNlY3RvciBzaXplIGFuZAorICAgICAgICAgICAgICogdGhlIHNvZnR3YXJlIGJhbmsgc2l6ZSAoNCwgOCBvciA2NCBLQnl0ZXMpICovCisgICAgICAgICAgICBmbGFzaF9saW5lYXJfYWRkcmVzcyA9IGJhbmsgKiBiYW5rX3NpemUgKyBqICogc3ViX3NlY3Rvcl9zaXplOworICAgICAgICAgICAgZmxhc2hfbGluZWFyX2FkZHJlc3MgKz0gaHctPmZsYXNoX2Jhc2VfYWRkcjsKKyAgICAgICAgICAgIGZsYXNoX2xpbmVhcl9hZGRyZXNzICY9IElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLOworCisgICAgICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHKGh3LCBJQ0hfRkxBU0hfRkFERFIsIGZsYXNoX2xpbmVhcl9hZGRyZXNzKTsKKworICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF9pY2g4X2ZsYXNoX2N5Y2xlKGh3LCBJQ0hfRkxBU0hfRVJBU0VfVElNRU9VVCk7CisgICAgICAgICAgICAvKiBDaGVjayBpZiBGQ0VSUiBpcyBzZXQgdG8gMS4gIElmIDEsIGNsZWFyIGl0IGFuZCB0cnkgdGhlIHdob2xlCisgICAgICAgICAgICAgKiBzZXF1ZW5jZSBhIGZldyBtb3JlIHRpbWVzIGVsc2UgRG9uZSAqLworICAgICAgICAgICAgaWYgKGVycm9yID09IEUxMDAwX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTKTsKKyAgICAgICAgICAgICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVwZWF0IGZvciBzb21lIHRpbWUgYmVmb3JlIGdpdmluZyB1cCAqLworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2RvbmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcl9mbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgoY291bnQgPCBJQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UKSAmJiAhZXJyb3JfZmxhZyk7CisgICAgICAgIGlmIChlcnJvcl9mbGFnID09IDEpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGVycm9yX2ZsYWcgIT0gMSkKKyAgICAgICAgZXJyb3IgPSBFMTAwMF9TVUNDRVNTOworICAgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludDMyX3QKK2UxMDAwX2luaXRfbGNkX2Zyb21fbnZtX2NvbmZpZ19yZWdpb24oc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY25mX2Jhc2VfYWRkciwgdWludDMyX3QgY25mX3NpemUpCit7CisgICAgdWludDMyX3QgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisgICAgdWludDE2X3Qgd29yZF9hZGRyLCByZWdfZGF0YSwgcmVnX2FkZHI7CisgICAgdWludDE2X3QgaTsKKworICAgIC8qIGNuZl9iYXNlX2FkZHIgaXMgaW4gRFdPUkQgKi8KKyAgICB3b3JkX2FkZHIgPSAodWludDE2X3QpKGNuZl9iYXNlX2FkZHIgPDwgMSk7CisKKyAgICAvKiBjbmZfc2l6ZSBpcyByZXR1cm5lZCBpbiBzaXplIG9mIGR3b3JkcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjbmZfc2l6ZTsgaSsrKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgKHdvcmRfYWRkciArIGkqMiksIDEsICZyZWdfZGF0YSk7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCAod29yZF9hZGRyICsgaSoyICsgMSksIDEsICZyZWdfYWRkcik7CisgICAgICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9zb2Z0d2FyZV9mbGFnKGh3KTsKKyAgICAgICAgaWYgKHJldF92YWwgIT0gRTEwMDBfU1VDQ0VTUykKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCAodWludDMyX3QpcmVnX2FkZHIsIHJlZ19kYXRhKTsKKworICAgICAgICBlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX2ZsYWcoaHcpOworICAgIH0KKworICAgIHJldHVybiByZXRfdmFsOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFBIWSBmcm9tIHRoZSBOVk0gb24gSUNIOCBwbGF0Zm9ybXMuIFRoaXMKKyAqIGlzIG5lZWRlZCBkdWUgdG8gYW4gaXNzdWUgd2hlcmUgdGhlIE5WTSBjb25maWd1cmF0aW9uIGlzIG5vdCBwcm9wZXJseQorICogYXV0b2xvYWRlZCBhZnRlciBwb3dlciB0cmFuc2l0aW9ucy4gVGhlcmVmb3JlLCBhZnRlciBlYWNoIFBIWSByZXNldCwgd2UKKyAqIHdpbGwgbG9hZCB0aGUgY29uZmlndXJhdGlvbiBkYXRhIG91dCBvZiB0aGUgTlZNIG1hbnVhbGx5LgorICoKKyAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9pbml0X2xjZF9mcm9tX252bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IHJlZ19kYXRhLCBjbmZfYmFzZV9hZGRyLCBjbmZfc2l6ZSwgcmV0X3ZhbCwgbG9vcDsKKworICAgIGlmIChody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncF8zKQorICAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgLyogQ2hlY2sgaWYgU1cgbmVlZHMgY29uZmlndXJlIHRoZSBQSFkgKi8KKyAgICByZWdfZGF0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBGRVhUTlZNKTsKKyAgICBpZiAoIShyZWdfZGF0YSAmIEZFWFROVk1fU1dfQ09ORklHKSkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKKyAgICAvKiBXYWl0IGZvciBiYXNpYyBjb25maWd1cmF0aW9uIGNvbXBsZXRlcyBiZWZvcmUgcHJvY2VlZGluZyovCisgICAgbG9vcCA9IDA7CisgICAgZG8geworICAgICAgICByZWdfZGF0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0xBTl9JTklUX0RPTkU7CisgICAgICAgIHVkZWxheSgxMDApOworICAgICAgICBsb29wKys7CisgICAgfSB3aGlsZSAoKCFyZWdfZGF0YSkgJiYgKGxvb3AgPCA1MCkpOworCisgICAgLyogQ2xlYXIgdGhlIEluaXQgRG9uZSBiaXQgZm9yIHRoZSBuZXh0IGluaXQgZXZlbnQgKi8KKyAgICByZWdfZGF0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworICAgIHJlZ19kYXRhICY9IH5FMTAwMF9TVEFUVVNfTEFOX0lOSVRfRE9ORTsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIFNUQVRVUywgcmVnX2RhdGEpOworCisgICAgLyogTWFrZSBzdXJlIEhXIGRvZXMgbm90IGNvbmZpZ3VyZSBMQ0QgZnJvbSBQSFkgZXh0ZW5kZWQgY29uZmlndXJhdGlvbgorICAgICAgIGJlZm9yZSBTVyBjb25maWd1cmF0aW9uICovCisgICAgcmVnX2RhdGEgPSBFMTAwMF9SRUFEX1JFRyhodywgRVhUQ05GX0NUUkwpOworICAgIGlmICgocmVnX2RhdGEgJiBFMTAwMF9FWFRDTkZfQ1RSTF9MQ0RfV1JJVEVfRU5BQkxFKSA9PSAweDAwMDApIHsKKyAgICAgICAgcmVnX2RhdGEgPSBFMTAwMF9SRUFEX1JFRyhodywgRVhUQ05GX1NJWkUpOworICAgICAgICBjbmZfc2l6ZSA9IHJlZ19kYXRhICYgRTEwMDBfRVhUQ05GX1NJWkVfRVhUX1BDSUVfTEVOR1RIOworICAgICAgICBjbmZfc2l6ZSA+Pj0gMTY7CisgICAgICAgIGlmIChjbmZfc2l6ZSkgeworICAgICAgICAgICAgcmVnX2RhdGEgPSBFMTAwMF9SRUFEX1JFRyhodywgRVhUQ05GX0NUUkwpOworICAgICAgICAgICAgY25mX2Jhc2VfYWRkciA9IHJlZ19kYXRhICYgRTEwMDBfRVhUQ05GX0NUUkxfRVhUX0NORl9QT0lOVEVSOworICAgICAgICAgICAgLyogY25mX2Jhc2VfYWRkciBpcyBpbiBEV09SRCAqLworICAgICAgICAgICAgY25mX2Jhc2VfYWRkciA+Pj0gMTY7CisKKyAgICAgICAgICAgIC8qIENvbmZpZ3VyZSBMQ0QgZnJvbSBleHRlbmRlZCBjb25maWd1cmF0aW9uIHJlZ2lvbi4gKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9pbml0X2xjZF9mcm9tX252bV9jb25maWdfcmVnaW9uKGh3LCBjbmZfYmFzZV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25mX3NpemUpOworICAgICAgICAgICAgaWYgKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGIyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCkBAIC0wLDAgKzEsMzQzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBJbnRlbCBQUk8vMTAwMCBMaW51eCBkcml2ZXIKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA2IEludGVsIENvcnBvcmF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTsKKworLyogZTEwMDBfaHcuaAorICogU3RydWN0dXJlcywgZW51bXMsIGFuZCBtYWNyb3MgZm9yIHRoZSBNQUMKKyAqLworCisjaWZuZGVmIF9FMTAwMF9IV19IXworI2RlZmluZSBfRTEwMDBfSFdfSF8KKworI2luY2x1ZGUgImUxMDAwX29zZGVwLmgiCisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgY29kZSAqLworc3RydWN0IGUxMDAwX2h3Oworc3RydWN0IGUxMDAwX2h3X3N0YXRzOworCisvKiBFbnVtZXJhdGVkIHR5cGVzIHNwZWNpZmljIHRvIHRoZSBlMTAwMCBoYXJkd2FyZSAqLworLyogTWVkaWEgQWNjZXNzIENvbnRyb2xlcnMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfdW5kZWZpbmVkID0gMCwKKyAgICBlMTAwMF84MjU0Ml9yZXYyXzAsCisgICAgZTEwMDBfODI1NDJfcmV2Ml8xLAorICAgIGUxMDAwXzgyNTQzLAorICAgIGUxMDAwXzgyNTQ0LAorICAgIGUxMDAwXzgyNTQwLAorICAgIGUxMDAwXzgyNTQ1LAorICAgIGUxMDAwXzgyNTQ1X3Jldl8zLAorICAgIGUxMDAwXzgyNTQ2LAorICAgIGUxMDAwXzgyNTQ2X3Jldl8zLAorICAgIGUxMDAwXzgyNTQxLAorICAgIGUxMDAwXzgyNTQxX3Jldl8yLAorICAgIGUxMDAwXzgyNTQ3LAorICAgIGUxMDAwXzgyNTQ3X3Jldl8yLAorICAgIGUxMDAwXzgyNTcxLAorICAgIGUxMDAwXzgyNTcyLAorICAgIGUxMDAwXzgyNTczLAorICAgIGUxMDAwXzgwMDAzZXMybGFuLAorICAgIGUxMDAwX2ljaDhsYW4sCisgICAgZTEwMDBfODI1NzYsCisgICAgZTEwMDBfbnVtX21hY3MKK30gZTEwMDBfbWFjX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZWVwcm9tX3VuaW5pdGlhbGl6ZWQgPSAwLAorICAgIGUxMDAwX2VlcHJvbV9zcGksCisgICAgZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSwKKyAgICBlMTAwMF9lZXByb21fZmxhc2gsCisgICAgZTEwMDBfZWVwcm9tX2ljaDgsCisgICAgZTEwMDBfZWVwcm9tX25vbmUsIC8qIE5vIE5WTSBzdXBwb3J0ICovCisgICAgZTEwMDBfbnVtX2VlcHJvbV90eXBlcworfSBlMTAwMF9lZXByb21fdHlwZTsKKworLyogTWVkaWEgVHlwZXMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIgPSAwLAorICAgIGUxMDAwX21lZGlhX3R5cGVfZmliZXIgPSAxLAorICAgIGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzID0gMiwKKyAgICBlMTAwMF9udW1fbWVkaWFfdHlwZXMKK30gZTEwMDBfbWVkaWFfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF8xMF9oYWxmID0gMCwKKyAgICBlMTAwMF8xMF9mdWxsID0gMSwKKyAgICBlMTAwMF8xMDBfaGFsZiA9IDIsCisgICAgZTEwMDBfMTAwX2Z1bGwgPSAzCit9IGUxMDAwX3NwZWVkX2R1cGxleF90eXBlOworCisvKiBGbG93IENvbnRyb2wgU2V0dGluZ3MgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgRTEwMDBfRkNfTk9ORSA9IDAsCisgICAgRTEwMDBfRkNfUlhfUEFVU0UgPSAxLAorICAgIEUxMDAwX0ZDX1RYX1BBVVNFID0gMiwKKyAgICBFMTAwMF9GQ19GVUxMID0gMywKKyAgICBFMTAwMF9GQ19ERUZBVUxUID0gMHhGRgorfSBlMTAwMF9mY190eXBlOworCitzdHJ1Y3QgZTEwMDBfc2hhZG93X3JhbSB7CisgICAgdWludDE2X3QgICAgZWVwcm9tX3dvcmQ7CisgICAgYm9vbGVhbl90ICAgbW9kaWZpZWQ7Cit9OworCisvKiBQQ0kgYnVzIHR5cGVzICovCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2J1c190eXBlX3Vua25vd24gPSAwLAorICAgIGUxMDAwX2J1c190eXBlX3BjaSwKKyAgICBlMTAwMF9idXNfdHlwZV9wY2l4LAorICAgIGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzLAorICAgIGUxMDAwX2J1c190eXBlX3Jlc2VydmVkCit9IGUxMDAwX2J1c190eXBlOworCisvKiBQQ0kgYnVzIHNwZWVkcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9idXNfc3BlZWRfdW5rbm93biA9IDAsCisgICAgZTEwMDBfYnVzX3NwZWVkXzMzLAorICAgIGUxMDAwX2J1c19zcGVlZF82NiwKKyAgICBlMTAwMF9idXNfc3BlZWRfMTAwLAorICAgIGUxMDAwX2J1c19zcGVlZF8xMjAsCisgICAgZTEwMDBfYnVzX3NwZWVkXzEzMywKKyAgICBlMTAwMF9idXNfc3BlZWRfMjUwMCwKKyAgICBlMTAwMF9idXNfc3BlZWRfcmVzZXJ2ZWQKK30gZTEwMDBfYnVzX3NwZWVkOworCisvKiBQQ0kgYnVzIHdpZHRocyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9idXNfd2lkdGhfdW5rbm93biA9IDAsCisgICAgLyogVGhlc2UgUENJZSB2YWx1ZXMgc2hvdWxkIGxpdGVyYWxseSBtYXRjaCB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcworICAgICAqIGZyb20gY29uZmlnIHNwYWNlICovCisgICAgZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzEgPSAxLAorICAgIGUxMDAwX2J1c193aWR0aF9wY2lleF8yID0gMiwKKyAgICBlMTAwMF9idXNfd2lkdGhfcGNpZXhfNCA9IDQsCisgICAgZTEwMDBfYnVzX3dpZHRoXzMyLAorICAgIGUxMDAwX2J1c193aWR0aF82NCwKKyAgICBlMTAwMF9idXNfd2lkdGhfcmVzZXJ2ZWQKK30gZTEwMDBfYnVzX3dpZHRoOworCisvKiBQSFkgc3RhdHVzIGluZm8gc3RydWN0dXJlIGFuZCBzdXBwb3J0aW5nIGVudW1zICovCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2NhYmxlX2xlbmd0aF81MCA9IDAsCisgICAgZTEwMDBfY2FibGVfbGVuZ3RoXzUwXzgwLAorICAgIGUxMDAwX2NhYmxlX2xlbmd0aF84MF8xMTAsCisgICAgZTEwMDBfY2FibGVfbGVuZ3RoXzExMF8xNDAsCisgICAgZTEwMDBfY2FibGVfbGVuZ3RoXzE0MCwKKyAgICBlMTAwMF9jYWJsZV9sZW5ndGhfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9jYWJsZV9sZW5ndGg7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZ2dfY2FibGVfbGVuZ3RoXzYwID0gMCwKKyAgICBlMTAwMF9nZ19jYWJsZV9sZW5ndGhfNjBfMTE1ID0gMSwKKyAgICBlMTAwMF9nZ19jYWJsZV9sZW5ndGhfMTE1XzE1MCA9IDIsCisgICAgZTEwMDBfZ2dfY2FibGVfbGVuZ3RoXzE1MCA9IDQKK30gZTEwMDBfZ2dfY2FibGVfbGVuZ3RoOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTAgID0gMTAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8yMCAgPSAyMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzMwICA9IDMwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNDAgID0gNDAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCAgPSA1MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzYwICA9IDYwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNzAgID0gNzAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF84MCAgPSA4MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzkwICA9IDkwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTAwID0gMTAwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTEwID0gMTEwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTE1ID0gMTE1LAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTIwID0gMTIwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTMwID0gMTMwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTQwID0gMTQwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTUwID0gMTUwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTYwID0gMTYwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTcwID0gMTcwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTgwID0gMTgwCit9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGg7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbm9ybWFsID0gMCwKKyAgICBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV9sb3dlciwKKyAgICBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX3Jldl9wb2xhcml0eV9ub3JtYWwgPSAwLAorICAgIGUxMDAwX3Jldl9wb2xhcml0eV9yZXZlcnNlZCwKKyAgICBlMTAwMF9yZXZfcG9sYXJpdHlfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9yZXZfcG9sYXJpdHk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZG93bnNoaWZ0X25vcm1hbCA9IDAsCisgICAgZTEwMDBfZG93bnNoaWZ0X2FjdGl2YXRlZCwKKyAgICBlMTAwMF9kb3duc2hpZnRfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9kb3duc2hpZnQ7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfc21hcnRfc3BlZWRfZGVmYXVsdCA9IDAsCisgICAgZTEwMDBfc21hcnRfc3BlZWRfb24sCisgICAgZTEwMDBfc21hcnRfc3BlZWRfb2ZmCit9IGUxMDAwX3NtYXJ0X3NwZWVkOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2VuYWJsZWQgPSAwLAorICAgIGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2Rpc2FibGVkLAorICAgIGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWw7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfYXV0b194X21vZGVfbWFudWFsX21kaSA9IDAsCisgICAgZTEwMDBfYXV0b194X21vZGVfbWFudWFsX21kaXgsCisgICAgZTEwMDBfYXV0b194X21vZGVfYXV0bzEsCisgICAgZTEwMDBfYXV0b194X21vZGVfYXV0bzIsCisgICAgZTEwMDBfYXV0b194X21vZGVfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9hdXRvX3hfbW9kZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfbm90X29rID0gMCwKKyAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfb2ssCisgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfMTAwMHRfcnhfc3RhdHVzOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX3BoeV9tODggPSAwLAorICAgIGUxMDAwX3BoeV9pZ3AsCisgICAgZTEwMDBfcGh5X2lncF8yLAorICAgIGUxMDAwX3BoeV9nZzgyNTYzLAorICAgIGUxMDAwX3BoeV9pZ3BfMywKKyAgICBlMTAwMF9waHlfaWZlLAorICAgIGUxMDAwX3BoeV91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX3BoeV90eXBlOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX21zX2h3X2RlZmF1bHQgPSAwLAorICAgIGUxMDAwX21zX2ZvcmNlX21hc3RlciwKKyAgICBlMTAwMF9tc19mb3JjZV9zbGF2ZSwKKyAgICBlMTAwMF9tc19hdXRvCit9IGUxMDAwX21zX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZmZlX2NvbmZpZ19lbmFibGVkID0gMCwKKyAgICBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSwKKyAgICBlMTAwMF9mZmVfY29uZmlnX2Jsb2NrZWQKK30gZTEwMDBfZmZlX2NvbmZpZzsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9kc3BfY29uZmlnX2Rpc2FibGVkID0gMCwKKyAgICBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQsCisgICAgZTEwMDBfZHNwX2NvbmZpZ19hY3RpdmF0ZWQsCisgICAgZTEwMDBfZHNwX2NvbmZpZ191bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX2RzcF9jb25maWc7CisKK3N0cnVjdCBlMTAwMF9waHlfaW5mbyB7CisgICAgZTEwMDBfY2FibGVfbGVuZ3RoIGNhYmxlX2xlbmd0aDsKKyAgICBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZSBleHRlbmRlZF8xMGJ0X2Rpc3RhbmNlOworICAgIGUxMDAwX3Jldl9wb2xhcml0eSBjYWJsZV9wb2xhcml0eTsKKyAgICBlMTAwMF9kb3duc2hpZnQgZG93bnNoaWZ0OworICAgIGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsIHBvbGFyaXR5X2NvcnJlY3Rpb247CisgICAgZTEwMDBfYXV0b194X21vZGUgbWRpeF9tb2RlOworICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1cyBsb2NhbF9yeDsKKyAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXMgcmVtb3RlX3J4OworfTsKKworc3RydWN0IGUxMDAwX3BoeV9zdGF0cyB7CisgICAgdWludDMyX3QgaWRsZV9lcnJvcnM7CisgICAgdWludDMyX3QgcmVjZWl2ZV9lcnJvcnM7Cit9OworCitzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8geworICAgIGUxMDAwX2VlcHJvbV90eXBlIHR5cGU7CisgICAgdWludDE2X3Qgd29yZF9zaXplOworICAgIHVpbnQxNl90IG9wY29kZV9iaXRzOworICAgIHVpbnQxNl90IGFkZHJlc3NfYml0czsKKyAgICB1aW50MTZfdCBkZWxheV91c2VjOworICAgIHVpbnQxNl90IHBhZ2Vfc2l6ZTsKKyAgICBib29sZWFuX3QgdXNlX2VlcmQ7CisgICAgYm9vbGVhbl90IHVzZV9lZXdyOworfTsKKworLyogRmxleCBBU0YgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRTEwMDBfSE9TVF9JRl9NQVhfU0laRSAgMjA0OAorCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2J5dGVfYWxpZ24gPSAwLAorICAgIGUxMDAwX3dvcmRfYWxpZ24gPSAxLAorICAgIGUxMDAwX2R3b3JkX2FsaWduID0gMgorfSBlMTAwMF9hbGlnbl90eXBlOworCisKKworLyogRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUgRTEwMDBfU1VDQ0VTUyAgICAgIDAKKyNkZWZpbmUgRTEwMDBfRVJSX0VFUFJPTSAgIDEKKyNkZWZpbmUgRTEwMDBfRVJSX1BIWSAgICAgIDIKKyNkZWZpbmUgRTEwMDBfRVJSX0NPTkZJRyAgIDMKKyNkZWZpbmUgRTEwMDBfRVJSX1BBUkFNICAgIDQKKyNkZWZpbmUgRTEwMDBfRVJSX01BQ19UWVBFIDUKKyNkZWZpbmUgRTEwMDBfRVJSX1BIWV9UWVBFIDYKKyNkZWZpbmUgRTEwMDBfRVJSX1JFU0VUICAgOQorI2RlZmluZSBFMTAwMF9FUlJfTUFTVEVSX1JFUVVFU1RTX1BFTkRJTkcgMTAKKyNkZWZpbmUgRTEwMDBfRVJSX0hPU1RfSU5URVJGQUNFX0NPTU1BTkQgMTEKKyNkZWZpbmUgRTEwMDBfQkxLX1BIWV9SRVNFVCAgIDEyCisjZGVmaW5lIEUxMDAwX0VSUl9TV0ZXX1NZTkMgMTMKKworI2RlZmluZSBFMTAwMF9CWVRFX1NXQVBfV09SRChfdmFsdWUpICgoKChfdmFsdWUpICYgMHgwMGZmKSA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfdmFsdWUpICYgMHhmZjAwKSA+PiA4KSkKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworLyogSW5pdGlhbGl6YXRpb24gKi8KK2ludDMyX3QgZTEwMDBfcmVzZXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2luaXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3NldF9tYWNfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfc2V0X21lZGlhX3R5cGUoc3RydWN0IGUxMDAwX2h3ICpodyk7CisKKy8qIExpbmsgQ29uZmlndXJhdGlvbiAqLworaW50MzJfdCBlMTAwMF9zZXR1cF9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9jaGVja19mb3JfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgKnNwZWVkLCB1aW50MTZfdCAqZHVwbGV4KTsKK2ludDMyX3QgZTEwMDBfZm9yY2VfbWFjX2ZjKHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisvKiBQSFkgKi8KK2ludDMyX3QgZTEwMDBfcmVhZF9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MTZfdCAqcGh5X2RhdGEpOworaW50MzJfdCBlMTAwMF93cml0ZV9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MTZfdCBkYXRhKTsKK2ludDMyX3QgZTEwMDBfcGh5X2h3X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9waHlfcmVzZXQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3BoeV9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKTsKK2ludDMyX3QgZTEwMDBfdmFsaWRhdGVfbWRpX3NldHRpbmcoc3RydWN0IGUxMDAwX2h3ICpodyk7CisKK3ZvaWQgZTEwMDBfcGh5X3Bvd2VyZG93bl93b3JrYXJvdW5kKHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisvKiBFRVBST00gRnVuY3Rpb25zICovCitpbnQzMl90IGUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKworLyogTU5HIEhPU1QgSUYgZnVuY3Rpb25zICovCit1aW50MzJfdCBlMTAwMF9lbmFibGVfbW5nX3Bhc3NfdGhydShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKworI2RlZmluZSBFMTAwMF9NTkdfREhDUF9UWF9QQVlMT0FEX0NNRCAgIDY0CisjZGVmaW5lIEUxMDAwX0hJX01BWF9NTkdfREFUQV9MRU5HVEggICAgMHg2RjggICAvKiBIb3N0IEludGVyZmFjZSBkYXRhIGxlbmd0aCAqLworCisjZGVmaW5lIEUxMDAwX01OR19ESENQX0NPTU1BTkRfVElNRU9VVCAgMTAgICAgICAvKiBUaW1lIGluIG1zIHRvIHByb2Nlc3MgTU5HIGNvbW1hbmQgKi8KKyNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX09GRlNFVCAgICAweDZGMCAgIC8qIENvb2tpZSBvZmZzZXQgKi8KKyNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX0xFTkdUSCAgICAweDEwICAgIC8qIENvb2tpZSBsZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfTU5HX0lBTVRfTU9ERSAgICAgICAgICAgICAweDMKKyNkZWZpbmUgRTEwMDBfTU5HX0lDSF9JQU1UX01PREUgICAgICAgICAweDIKKyNkZWZpbmUgRTEwMDBfSUFNVF9TSUdOQVRVUkUgICAgICAgICAgICAweDU0NEQ0MTQ5IC8qIEludGVsKFIpIEFjdGl2ZSBNYW5hZ2VtZW50IFRlY2hub2xvZ3kgc2lnbmF0dXJlICovCisKKyNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX1NUQVRVU19QQVJTSU5HX1NVUFBPUlQgMHgxIC8qIERIQ1AgcGFyc2luZyBlbmFibGVkICovCisjZGVmaW5lIEUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfVkxBTl9TVVBQT1JUICAgIDB4MiAvKiBESENQIHBhcnNpbmcgZW5hYmxlZCAqLworI2RlZmluZSBFMTAwMF9WRlRBX0VOVFJZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgRTEwMDBfVkZUQV9FTlRSWV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHg3RgorI2RlZmluZSBFMTAwMF9WRlRBX0VOVFJZX0JJVF9TSElGVF9NQVNLICAgICAgICAgICAgICAweDFGCisKK3N0cnVjdCBlMTAwMF9ob3N0X21uZ19jb21tYW5kX2hlYWRlciB7CisgICAgdWludDhfdCBjb21tYW5kX2lkOworICAgIHVpbnQ4X3QgY2hlY2tzdW07CisgICAgdWludDE2X3QgcmVzZXJ2ZWQxOworICAgIHVpbnQxNl90IHJlc2VydmVkMjsKKyAgICB1aW50MTZfdCBjb21tYW5kX2xlbmd0aDsKK307CisKK3N0cnVjdCBlMTAwMF9ob3N0X21uZ19jb21tYW5kX2luZm8geworICAgIHN0cnVjdCBlMTAwMF9ob3N0X21uZ19jb21tYW5kX2hlYWRlciBjb21tYW5kX2hlYWRlcjsgIC8qIENvbW1hbmQgSGVhZC9Db21tYW5kIFJlc3VsdCBIZWFkIGhhcyA0IGJ5dGVzICovCisgICAgdWludDhfdCBjb21tYW5kX2RhdGFbRTEwMDBfSElfTUFYX01OR19EQVRBX0xFTkdUSF07ICAgLyogQ29tbWFuZCBkYXRhIGNhbiBsZW5ndGggMC4uMHg2NTgqLworfTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KK3N0cnVjdCBlMTAwMF9ob3N0X21uZ19kaGNwX2Nvb2tpZXsKKyAgICB1aW50MzJfdCBzaWduYXR1cmU7CisgICAgdWludDE2X3Qgdmxhbl9pZDsKKyAgICB1aW50OF90IHJlc2VydmVkMDsKKyAgICB1aW50OF90IHN0YXR1czsKKyAgICB1aW50MzJfdCByZXNlcnZlZDE7CisgICAgdWludDhfdCBjaGVja3N1bTsKKyAgICB1aW50OF90IHJlc2VydmVkMzsKKyAgICB1aW50MTZfdCByZXNlcnZlZDI7Cit9OworI2Vsc2UKK3N0cnVjdCBlMTAwMF9ob3N0X21uZ19kaGNwX2Nvb2tpZXsKKyAgICB1aW50MzJfdCBzaWduYXR1cmU7CisgICAgdWludDhfdCBzdGF0dXM7CisgICAgdWludDhfdCByZXNlcnZlZDA7CisgICAgdWludDE2X3Qgdmxhbl9pZDsKKyAgICB1aW50MzJfdCByZXNlcnZlZDE7CisgICAgdWludDE2X3QgcmVzZXJ2ZWQyOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQzOworICAgIHVpbnQ4X3QgY2hlY2tzdW07Cit9OworI2VuZGlmCisKK2ludDMyX3QgZTEwMDBfbW5nX3dyaXRlX2RoY3BfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoKTsKK2Jvb2xlYW5fdCBlMTAwMF9jaGVja19tbmdfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2Jvb2xlYW5fdCBlMTAwMF9lbmFibGVfdHhfcGt0X2ZpbHRlcmluZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgcmVnLCB1aW50MTZfdCB3b3JkcywgdWludDE2X3QgKmRhdGEpOworaW50MzJfdCBlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3dyaXRlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCByZWcsIHVpbnQxNl90IHdvcmRzLCB1aW50MTZfdCAqZGF0YSk7CitpbnQzMl90IGUxMDAwX3JlYWRfbWFjX2FkZHIoc3RydWN0IGUxMDAwX2h3ICogaHcpOworCisvKiBGaWx0ZXJzIChtdWx0aWNhc3QsIHZsYW4sIHJlY2VpdmUpICovCit1aW50MzJfdCBlMTAwMF9oYXNoX21jX2FkZHIoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDhfdCAqIG1jX2FkZHIpOwordm9pZCBlMTAwMF9tdGFfc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IGhhc2hfdmFsdWUpOwordm9pZCBlMTAwMF9yYXJfc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQ4X3QgKiBtY19hZGRyLCB1aW50MzJfdCByYXJfaW5kZXgpOwordm9pZCBlMTAwMF93cml0ZV92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdmFsdWUpOworCisvKiBMRUQgZnVuY3Rpb25zICovCitpbnQzMl90IGUxMDAwX3NldHVwX2xlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfY2xlYW51cF9sZWQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2xlZF9vbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfbGVkX29mZihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfYmxpbmtfbGVkX3N0YXJ0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisvKiBBZGFwdGl2ZSBJRlMgRnVuY3Rpb25zICovCisKKy8qIEV2ZXJ5dGhpbmcgZWxzZSAqLwordm9pZCBlMTAwMF9yZXNldF9hZGFwdGl2ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfdXBkYXRlX2FkYXB0aXZlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBlMTAwMF90YmlfYWRqdXN0X3N0YXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsIHN0cnVjdCBlMTAwMF9od19zdGF0cyAqc3RhdHMsIHVpbnQzMl90IGZyYW1lX2xlbiwgdWludDhfdCAqIG1hY19hZGRyKTsKK3ZvaWQgZTEwMDBfZ2V0X2J1c19pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBlMTAwMF9wY2lfc2V0X213aShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfcGNpX2NsZWFyX213aShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfcmVhZF9wY2lfY2ZnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZywgdWludDE2X3QgKiB2YWx1ZSk7Cit2b2lkIGUxMDAwX3dyaXRlX3BjaV9jZmcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnLCB1aW50MTZfdCAqIHZhbHVlKTsKK2ludDMyX3QgZTEwMDBfcmVhZF9wY2llX2NhcF9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnLCB1aW50MTZfdCAqdmFsdWUpOworLyogUG9ydCBJL08gaXMgb25seSBzdXBwb3J0ZWQgb24gODI1NDQgYW5kIG5ld2VyICovCit2b2lkIGUxMDAwX2lvX3dyaXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVuc2lnbmVkIGxvbmcgcG9ydCwgdWludDMyX3QgdmFsdWUpOworaW50MzJfdCBlMTAwMF9kaXNhYmxlX3BjaWV4X21hc3RlcihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisKKyNkZWZpbmUgRTEwMDBfUkVBRF9SRUdfSU8oYSwgcmVnKSBcCisgICAgZTEwMDBfcmVhZF9yZWdfaW8oKGEpLCBFMTAwMF8jI3JlZykKKyNkZWZpbmUgRTEwMDBfV1JJVEVfUkVHX0lPKGEsIHJlZywgdmFsKSBcCisgICAgZTEwMDBfd3JpdGVfcmVnX2lvKChhKSwgRTEwMDBfIyNyZWcsIHZhbCkKKworLyogUENJIERldmljZSBJRHMgKi8KKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQyICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0M0dDX0ZJQkVSICAgICAgIDB4MTAwMQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDNHQ19DT1BQRVIgICAgICAweDEwMDQKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ0RUlfQ09QUEVSICAgICAgMHgxMDA4CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NEVJX0ZJQkVSICAgICAgIDB4MTAwOQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDRHQ19DT1BQRVIgICAgICAweDEwMEMKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ0R0NfTE9NICAgICAgICAgMHgxMDBECisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MEVNICAgICAgICAgICAgIDB4MTAwRQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDBFTV9MT00gICAgICAgICAweDEwMTUKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQwRVBfTE9NICAgICAgICAgMHgxMDE2CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MEVQICAgICAgICAgICAgIDB4MTAxNworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MUCAgICAgICAgICAweDEwMUUKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ1RU1fQ09QUEVSICAgICAgMHgxMDBGCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NUVNX0ZJQkVSICAgICAgIDB4MTAxMQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDVHTV9DT1BQRVIgICAgICAweDEwMjYKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ1R01fRklCRVIgICAgICAgMHgxMDI3CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NUdNX1NFUkRFUyAgICAgIDB4MTAyOAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZFQl9DT1BQRVIgICAgICAweDEwMTAKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2RUJfRklCRVIgICAgICAgMHgxMDEyCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkVCX1FVQURfQ09QUEVSIDB4MTAxRAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFFSSAgICAgICAgICAgICAweDEwMTMKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxRUlfTU9CSUxFICAgICAgMHgxMDE4CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MUVSX0xPTSAgICAgICAgIDB4MTAxNAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFFUiAgICAgICAgICAgICAweDEwNzgKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ3R0kgICAgICAgICAgICAgMHgxMDc1CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MUdJICAgICAgICAgICAgIDB4MTA3NgorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFHSV9NT0JJTEUgICAgICAweDEwNzcKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxR0lfTEYgICAgICAgICAgMHgxMDdDCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX0NPUFBFUiAgICAgIDB4MTA3OQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZHQl9GSUJFUiAgICAgICAweDEwN0EKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfU0VSREVTICAgICAgMHgxMDdCCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX1BDSUUgICAgICAgIDB4MTA4QQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUiAweDEwOTkKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ3RUkgICAgICAgICAgICAgMHgxMDE5CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0N0VJX01PQklMRSAgICAgIDB4MTAxQQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9DT1BQRVIgICAgICAweDEwNUUKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfRklCRVIgICAgICAgMHgxMDVGCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFUyAgICAgIDB4MTA2MAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUiAweDEwQTQKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9GSUJFUiAgMHgxMEE1CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSX0xPV1BST0ZJTEUgIDB4MTBCQworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9TRVJERVNfRFVBTCAweDEwRDkKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTX1FVQUQgMHgxMERBCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MkVJX0NPUFBFUiAgICAgIDB4MTA3RAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzJFSV9GSUJFUiAgICAgICAweDEwN0UKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcyRUlfU0VSREVTICAgICAgMHgxMDdGCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MkVJICAgICAgICAgICAgIDB4MTBCOQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzNFICAgICAgICAgICAgICAweDEwOEIKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTczRV9JQU1UICAgICAgICAgMHgxMDhDCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3M0wgICAgICAgICAgICAgIDB4MTA5QQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUl9LU1AzIDB4MTBCNQorI2RlZmluZSBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fQ09QUEVSX0RQVCAgICAgMHgxMDk2CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MDAwM0VTMkxBTl9TRVJERVNfRFBUICAgICAweDEwOTgKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgwMDAzRVMyTEFOX0NPUFBFUl9TUFQgICAgIDB4MTBCQQorI2RlZmluZSBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fU0VSREVTX1NQVCAgICAgMHgxMEJCCisKKyNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUdQX01fQU1UICAgICAgMHgxMDQ5CisjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9BTVQgICAgICAgIDB4MTA0QQorI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfQyAgICAgICAgICAweDEwNEIKKyNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUZFICAgICAgICAgICAgMHgxMDRDCisjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g4X0lGRV9HVCAgICAgICAgIDB4MTBDNAorI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIOF9JRkVfRyAgICAgICAgICAweDEwQzUKKyNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUdQX00gICAgICAgICAgMHgxMDRECisKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTc2ICAgICAgICAgICAgICAgICAgICAweDEwQzkKKworI2RlZmluZSBOT0RFX0FERFJFU1NfU0laRSA2CisjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyA2CisKKy8qIE1BQyBkZWNvZGUgc2l6ZSBpcyAxMjhLIC0gVGhpcyBpcyB0aGUgc2l6ZSBvZiBCQVIwICovCisjZGVmaW5lIE1BQ19ERUNPREVfU0laRSAoMTI4ICogMTAyNCkKKworI2RlZmluZSBFMTAwMF84MjU0Ml8yXzBfUkVWX0lEIDIKKyNkZWZpbmUgRTEwMDBfODI1NDJfMl8xX1JFVl9JRCAzCisjZGVmaW5lIEUxMDAwX1JFVklTSU9OXzAgICAgICAgMAorI2RlZmluZSBFMTAwMF9SRVZJU0lPTl8xICAgICAgIDEKKyNkZWZpbmUgRTEwMDBfUkVWSVNJT05fMiAgICAgICAyCisjZGVmaW5lIEUxMDAwX1JFVklTSU9OXzMgICAgICAgMworCisjZGVmaW5lIFNQRUVEXzEwICAgIDEwCisjZGVmaW5lIFNQRUVEXzEwMCAgIDEwMAorI2RlZmluZSBTUEVFRF8xMDAwICAxMDAwCisjZGVmaW5lIEhBTEZfRFVQTEVYIDEKKyNkZWZpbmUgRlVMTF9EVVBMRVggMgorCisvKiBUaGUgc2l6ZXMgKGluIGJ5dGVzKSBvZiBhIGV0aGVybmV0IHBhY2tldCAqLworI2RlZmluZSBFTkVUX0hFQURFUl9TSVpFICAgICAgICAgICAgIDE0CisjZGVmaW5lIE1BWElNVU1fRVRIRVJORVRfRlJBTUVfU0laRSAgMTUxOCAvKiBXaXRoIEZDUyAqLworI2RlZmluZSBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUgIDY0ICAgLyogV2l0aCBGQ1MgKi8KKyNkZWZpbmUgRVRIRVJORVRfRkNTX1NJWkUgICAgICAgICAgICA0CisjZGVmaW5lIE1BWElNVU1fRVRIRVJORVRfUEFDS0VUX1NJWkUgXAorICAgIChNQVhJTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUgLSBFVEhFUk5FVF9GQ1NfU0laRSkKKyNkZWZpbmUgTUlOSU1VTV9FVEhFUk5FVF9QQUNLRVRfU0laRSBcCisgICAgKE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSAtIEVUSEVSTkVUX0ZDU19TSVpFKQorI2RlZmluZSBDUkNfTEVOR1RIICAgICAgICAgICAgICAgICAgIEVUSEVSTkVUX0ZDU19TSVpFCisjZGVmaW5lIE1BWF9KVU1CT19GUkFNRV9TSVpFICAgICAgICAgMHgzRjAwCisKKworLyogODAyLjFxIFZMQU4gUGFja2V0IFNpemVzICovCisjZGVmaW5lIFZMQU5fVEFHX1NJWkUgIDQgICAgIC8qIDgwMi4zYWMgdGFnIChub3QgRE1BZWQpICovCisKKy8qIEV0aGVydHlwZSBmaWVsZCB2YWx1ZXMgKi8KKyNkZWZpbmUgRVRIRVJORVRfSUVFRV9WTEFOX1RZUEUgMHg4MTAwICAvKiA4MDIuM2FjIHBhY2tldCAqLworI2RlZmluZSBFVEhFUk5FVF9JUF9UWVBFICAgICAgICAweDA4MDAgIC8qIElQIHBhY2tldHMgKi8KKyNkZWZpbmUgRVRIRVJORVRfQVJQX1RZUEUgICAgICAgMHgwODA2ICAvKiBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFSUCkgKi8KKworLyogUGFja2V0IEhlYWRlciBkZWZpbmVzICovCisjZGVmaW5lIElQX1BST1RPQ09MX1RDUCAgICA2CisjZGVmaW5lIElQX1BST1RPQ09MX1VEUCAgICAweDExCisKKy8qIFRoaXMgZGVmaW5lcyB0aGUgYml0cyB0aGF0IGFyZSBzZXQgaW4gdGhlIEludGVycnVwdCBNYXNrCisgKiBTZXQvUmVhZCBSZWdpc3Rlci4gIEVhY2ggYml0IGlzIGRvY3VtZW50ZWQgYmVsb3c6CisgKiAgIG8gUlhETVQwID0gUmVjZWl2ZSBEZXNjcmlwdG9yIE1pbmltdW0gVGhyZXNob2xkIGhpdCAocmluZyAwKQorICogICBvIFJYU0VRICA9IFJlY2VpdmUgU2VxdWVuY2UgRXJyb3IKKyAqLworI2RlZmluZSBQT0xMX0lNU19FTkFCTEVfTUFTSyAoIFwKKyAgICBFMTAwMF9JTVNfUlhETVQwIHwgICAgICAgICBcCisgICAgRTEwMDBfSU1TX1JYU0VRKQorCisvKiBUaGlzIGRlZmluZXMgdGhlIGJpdHMgdGhhdCBhcmUgc2V0IGluIHRoZSBJbnRlcnJ1cHQgTWFzaworICogU2V0L1JlYWQgUmVnaXN0ZXIuICBFYWNoIGJpdCBpcyBkb2N1bWVudGVkIGJlbG93OgorICogICBvIFJYVDAgICA9IFJlY2VpdmVyIFRpbWVyIEludGVycnVwdCAocmluZyAwKQorICogICBvIFRYRFcgICA9IFRyYW5zbWl0IERlc2NyaXB0b3IgV3JpdHRlbiBCYWNrCisgKiAgIG8gUlhETVQwID0gUmVjZWl2ZSBEZXNjcmlwdG9yIE1pbmltdW0gVGhyZXNob2xkIGhpdCAocmluZyAwKQorICogICBvIFJYU0VRICA9IFJlY2VpdmUgU2VxdWVuY2UgRXJyb3IKKyAqICAgbyBMU0MgICAgPSBMaW5rIFN0YXR1cyBDaGFuZ2UKKyAqLworI2RlZmluZSBJTVNfRU5BQkxFX01BU0sgKCBcCisgICAgRTEwMDBfSU1TX1JYVDAgICB8ICAgIFwKKyAgICBFMTAwMF9JTVNfVFhEVyAgIHwgICAgXAorICAgIEUxMDAwX0lNU19SWERNVDAgfCAgICBcCisgICAgRTEwMDBfSU1TX1JYU0VRICB8ICAgIFwKKyAgICBFMTAwMF9JTVNfTFNDICAgIHwgICAgXAorICAgIEUxMDAwX0lNU19ET1VUU1lOQykKKworLyogQWRkaXRpb25hbCBpbnRlcnJ1cHRzIG5lZWQgdG8gYmUgaGFuZGxlZCBmb3IgZTEwMDBfaWNoOGxhbjoKKyAgICBEU1cgPSBUaGUgRlcgY2hhbmdlZCB0aGUgc3RhdHVzIG9mIHRoZSBESVNTVyBiaXQgaW4gRldTTQorICAgIFBIWUlOVCA9IFRoZSBMQU4gY29ubmVjdGVkIGRldmljZSBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0CisgICAgRVBSU1QgPSBNYW5hZ2VhYmlsaXR5IHJlc2V0IGV2ZW50ICovCisjZGVmaW5lIElNU19JQ0g4TEFOX0VOQUJMRV9NQVNLIChcCisgICAgRTEwMDBfSU1TX0RTVyAgIHwgXAorICAgIEUxMDAwX0lNU19QSFlJTlQgfCBcCisgICAgRTEwMDBfSU1TX0VQUlNUKQorCisvKiBOdW1iZXIgb2YgaGlnaC9sb3cgcmVnaXN0ZXIgcGFpcnMgaW4gdGhlIFJBUi4gVGhlIFJBUiAoUmVjZWl2ZSBBZGRyZXNzCisgKiBSZWdpc3RlcnMpIGhvbGRzIHRoZSBkaXJlY3RlZCBhbmQgbXVsdGljYXN0IGFkZHJlc3NlcyB0aGF0IHdlIG1vbml0b3IuIFdlCisgKiByZXNlcnZlIG9uZSBvZiB0aGVzZSBzcG90cyBmb3Igb3VyIGRpcmVjdGVkIGFkZHJlc3MsIGFsbG93aW5nIHVzIHJvb20gZm9yCisgKiBFMTAwMF9SQVJfRU5UUklFUyAtIDEgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKyAqLworI2RlZmluZSBFMTAwMF9SQVJfRU5UUklFUyAxNQorCisjZGVmaW5lIEUxMDAwX1JBUl9FTlRSSUVTX0lDSDhMQU4gIDYKKworI2RlZmluZSBNSU5fTlVNQkVSX09GX0RFU0NSSVBUT1JTICA4CisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfREVTQ1JJUFRPUlMgIDB4RkZGOAorCisvKiBSZWNlaXZlIERlc2NyaXB0b3IgKi8KK3N0cnVjdCBlMTAwMF9yeF9kZXNjIHsKKyAgICB1aW50NjRfdCBidWZmZXJfYWRkcjsgLyogQWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcidzIGRhdGEgYnVmZmVyICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAgICAgLyogTGVuZ3RoIG9mIGRhdGEgRE1BZWQgaW50byBkYXRhIGJ1ZmZlciAqLworICAgIHVpbnQxNl90IGNzdW07ICAgICAgIC8qIFBhY2tldCBjaGVja3N1bSAqLworICAgIHVpbnQ4X3Qgc3RhdHVzOyAgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCisgICAgdWludDhfdCBlcnJvcnM7ICAgICAgLyogRGVzY3JpcHRvciBFcnJvcnMgKi8KKyAgICB1aW50MTZfdCBzcGVjaWFsOworfTsKKworLyogUmVjZWl2ZSBEZXNjcmlwdG9yIC0gRXh0ZW5kZWQgKi8KK3VuaW9uIGUxMDAwX3J4X2Rlc2NfZXh0ZW5kZWQgeworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcl9hZGRyOworICAgICAgICB1aW50NjRfdCByZXNlcnZlZDsKKyAgICB9IHJlYWQ7CisgICAgc3RydWN0IHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ycTsgICAgICAgICAgICAgIC8qIE11bHRpcGxlIFJ4IFF1ZXVlcyAqLworICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJzczsgICAgICAgICAgLyogUlNTIEhhc2ggKi8KKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpcF9pZDsgICAgLyogSVAgaWQgKi8KKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY3N1bTsgICAgIC8qIFBhY2tldCBDaGVja3N1bSAqLworICAgICAgICAgICAgICAgIH0gY3N1bV9pcDsKKyAgICAgICAgICAgIH0gaGlfZHdvcmQ7CisgICAgICAgIH0gbG93ZXI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MzJfdCBzdGF0dXNfZXJyb3I7ICAgICAvKiBleHQgc3RhdHVzL2Vycm9yICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICB1aW50MTZfdCB2bGFuOyAgICAgICAgICAgICAvKiBWTEFOIHRhZyAqLworICAgICAgICB9IHVwcGVyOworICAgIH0gd2I7ICAvKiB3cml0ZWJhY2sgKi8KK307CisKKyNkZWZpbmUgTUFYX1BTX0JVRkZFUlMgNAorLyogUmVjZWl2ZSBEZXNjcmlwdG9yIC0gUGFja2V0IFNwbGl0ICovCit1bmlvbiBlMTAwMF9yeF9kZXNjX3BhY2tldF9zcGxpdCB7CisgICAgc3RydWN0IHsKKyAgICAgICAgLyogb25lIGJ1ZmZlciBmb3IgcHJvdG9jb2wgaGVhZGVyKHMpLCB0aHJlZSBkYXRhIGJ1ZmZlcnMgKi8KKyAgICAgICAgdWludDY0X3QgYnVmZmVyX2FkZHJbTUFYX1BTX0JVRkZFUlNdOworICAgIH0gcmVhZDsKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDMyX3QgbXJxOyAgICAgICAgICAgICAgLyogTXVsdGlwbGUgUnggUXVldWVzICovCisgICAgICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnNzOyAgICAgICAgICAvKiBSU1MgSGFzaCAqLworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGlwX2lkOyAgICAvKiBJUCBpZCAqLworICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjc3VtOyAgICAgLyogUGFja2V0IENoZWNrc3VtICovCisgICAgICAgICAgICAgICAgfSBjc3VtX2lwOworICAgICAgICAgICAgfSBoaV9kd29yZDsKKyAgICAgICAgfSBsb3dlcjsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXR1c19lcnJvcjsgICAgIC8qIGV4dCBzdGF0dXMvZXJyb3IgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDA7ICAgICAgICAgIC8qIGxlbmd0aCBvZiBidWZmZXIgMCAqLworICAgICAgICAgICAgdWludDE2X3QgdmxhbjsgICAgICAgICAgICAgLyogVkxBTiB0YWcgKi8KKyAgICAgICAgfSBtaWRkbGU7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MTZfdCBoZWFkZXJfc3RhdHVzOworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoWzNdOyAgICAgICAgLyogbGVuZ3RoIG9mIGJ1ZmZlcnMgMS0zICovCisgICAgICAgIH0gdXBwZXI7CisgICAgICAgIHVpbnQ2NF90IHJlc2VydmVkOworICAgIH0gd2I7IC8qIHdyaXRlYmFjayAqLworfTsKKworLyogUmVjZWl2ZSBEZWNyaXB0b3IgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0REICAgICAgIDB4MDEgICAgLyogRGVzY3JpcHRvciBEb25lICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0VPUCAgICAgIDB4MDIgICAgLyogRW5kIG9mIFBhY2tldCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9JWFNNICAgICAweDA0ICAgIC8qIElnbm9yZSBjaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9WUCAgICAgICAweDA4ICAgIC8qIElFRUUgVkxBTiBQYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVURQQ1MgICAgMHgxMCAgICAvKiBVRFAgeHN1bSBjYWN1bGF0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVENQQ1MgICAgMHgyMCAgICAvKiBUQ1AgeHN1bSBjYWxjdWxhdGVkICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0lQQ1MgICAgIDB4NDAgICAgLyogSVAgeHN1bSBjYWxjdWxhdGVkICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1BJRiAgICAgIDB4ODAgICAgLyogcGFzc2VkIGluLWV4YWN0IGZpbHRlciAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9JUElEViAgICAweDIwMCAgIC8qIElQIGlkZW50aWZpY2F0aW9uIHZhbGlkICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1VEUFYgICAgIDB4NDAwICAgLyogVmFsaWQgVURQIGNoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0FDSyAgICAgIDB4ODAwMCAgLyogQUNLIFBhY2tldCBpbmRpY2F0aW9uICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfQ0UgICAgICAgIDB4MDEgICAgLyogQ1JDIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfU0UgICAgICAgIDB4MDIgICAgLyogU3ltYm9sIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfU0VRICAgICAgIDB4MDQgICAgLyogU2VxdWVuY2UgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9DWEUgICAgICAgMHgxMCAgICAvKiBDYXJyaWVyIEV4dGVuc2lvbiBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX1RDUEUgICAgICAweDIwICAgIC8qIFRDUC9VRFAgQ2hlY2tzdW0gRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9JUEUgICAgICAgMHg0MCAgICAvKiBJUCBDaGVja3N1bSBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX1JYRSAgICAgICAweDgwICAgIC8qIFJ4IERhdGEgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19WTEFOX01BU0sgMHgwRkZGICAvKiBWTEFOIElEIGlzIGluIGxvd2VyIDEyIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19QUklfTUFTSyAgMHhFMDAwICAvKiBQcmlvcml0eSBpcyBpbiB1cHBlciAzIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19QUklfU0hJRlQgMTMKKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19DRklfTUFTSyAgMHgxMDAwICAvKiBDRkkgaXMgYml0IDEyICovCisjZGVmaW5lIEUxMDAwX1JYRF9TUENfQ0ZJX1NISUZUIDEyCisKKyNkZWZpbmUgRTEwMDBfUlhERVhUX1NUQVRFUlJfQ0UgICAgMHgwMTAwMDAwMAorI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9TRSAgICAweDAyMDAwMDAwCisjZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX1NFUSAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgRTEwMDBfUlhERVhUX1NUQVRFUlJfQ1hFICAgMHgxMDAwMDAwMAorI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9UQ1BFICAweDIwMDAwMDAwCisjZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX0lQRSAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfUlhERVhUX1NUQVRFUlJfUlhFICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIEUxMDAwX1JYRFBTX0hEUlNUQVRfSERSU1AgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRTEwMDBfUlhEUFNfSERSU1RBVF9IRFJMRU5fTUFTSyAgMHgwMDAwMDNGRgorCisvKiBtYXNrIHRvIGRldGVybWluZSBpZiBwYWNrZXRzIHNob3VsZCBiZSBkcm9wcGVkIGR1ZSB0byBmcmFtZSBlcnJvcnMgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9GUkFNRV9FUlJfTUFTSyAoIFwKKyAgICBFMTAwMF9SWERfRVJSX0NFICB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX1NFICB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX1NFUSB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX0NYRSB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX1JYRSkKKworCisvKiBTYW1lIG1hc2ssIGJ1dCBmb3IgZXh0ZW5kZWQgYW5kIHBhY2tldCBzcGxpdCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBFMTAwMF9SWERFWFRfRVJSX0ZSQU1FX0VSUl9NQVNLICggXAorICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX0NFICB8ICAgICAgICAgICAgXAorICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX1NFICB8ICAgICAgICAgICAgXAorICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX1NFUSB8ICAgICAgICAgICAgXAorICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX0NYRSB8ICAgICAgICAgICAgXAorICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX1JYRSkKKworCisvKiBUcmFuc21pdCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgZTEwMDBfdHhfZGVzYyB7CisgICAgdWludDY0X3QgYnVmZmVyX2FkZHI7ICAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsgICAgLyogRGF0YSBidWZmZXIgbGVuZ3RoICovCisgICAgICAgICAgICB1aW50OF90IGNzbzsgICAgICAgIC8qIENoZWNrc3VtIG9mZnNldCAqLworICAgICAgICAgICAgdWludDhfdCBjbWQ7ICAgICAgICAvKiBEZXNjcmlwdG9yIGNvbnRyb2wgKi8KKyAgICAgICAgfSBmbGFnczsKKyAgICB9IGxvd2VyOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzOyAgICAgLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY3NzOyAgICAgICAgLyogQ2hlY2tzdW0gc3RhcnQgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHNwZWNpYWw7CisgICAgICAgIH0gZmllbGRzOworICAgIH0gdXBwZXI7Cit9OworCisvKiBUcmFuc21pdCBEZXNjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFMTAwMF9UWERfRFRZUF9EICAgICAweDAwMTAwMDAwIC8qIERhdGEgRGVzY3JpcHRvciAqLworI2RlZmluZSBFMTAwMF9UWERfRFRZUF9DICAgICAweDAwMDAwMDAwIC8qIENvbnRleHQgRGVzY3JpcHRvciAqLworI2RlZmluZSBFMTAwMF9UWERfUE9QVFNfSVhTTSAweDAxICAgICAgIC8qIEluc2VydCBJUCBjaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9UWERfUE9QVFNfVFhTTSAweDAyICAgICAgIC8qIEluc2VydCBUQ1AvVURQIGNoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfRU9QICAgIDB4MDEwMDAwMDAgLyogRW5kIG9mIFBhY2tldCAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0lGQ1MgICAweDAyMDAwMDAwIC8qIEluc2VydCBGQ1MgKEV0aGVybmV0IENSQykgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JQyAgICAgMHgwNDAwMDAwMCAvKiBJbnNlcnQgQ2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9SUyAgICAgMHgwODAwMDAwMCAvKiBSZXBvcnQgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfUlBTICAgIDB4MTAwMDAwMDAgLyogUmVwb3J0IFBhY2tldCBTZW50ICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfREVYVCAgIDB4MjAwMDAwMDAgLyogRGVzY3JpcHRvciBleHRlbnNpb24gKDAgPSBsZWdhY3kpICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfVkxFICAgIDB4NDAwMDAwMDAgLyogQWRkIFZMQU4gdGFnICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfSURFICAgIDB4ODAwMDAwMDAgLyogRW5hYmxlIFRpZHYgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfREQgICAgMHgwMDAwMDAwMSAvKiBEZXNjcmlwdG9yIERvbmUgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfRUMgICAgMHgwMDAwMDAwMiAvKiBFeGNlc3MgQ29sbGlzaW9ucyAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9MQyAgICAweDAwMDAwMDA0IC8qIExhdGUgQ29sbGlzaW9ucyAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9UVSAgICAweDAwMDAwMDA4IC8qIFRyYW5zbWl0IHVuZGVycnVuICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfVENQICAgIDB4MDEwMDAwMDAgLyogVENQIHBhY2tldCAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0lQICAgICAweDAyMDAwMDAwIC8qIElQIHBhY2tldCAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1RTRSAgICAweDA0MDAwMDAwIC8qIFRDUCBTZWcgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX1RDICAgIDB4MDAwMDAwMDQgLyogVHggVW5kZXJydW4gKi8KKworLyogT2ZmbG9hZCBDb250ZXh0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCBlMTAwMF9jb250ZXh0X2Rlc2MgeworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgaXBfY29uZmlnOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCBpcGNzczsgICAgICAvKiBJUCBjaGVja3N1bSBzdGFydCAqLworICAgICAgICAgICAgdWludDhfdCBpcGNzbzsgICAgICAvKiBJUCBjaGVja3N1bSBvZmZzZXQgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGlwY3NlOyAgICAgLyogSVAgY2hlY2tzdW0gZW5kICovCisgICAgICAgIH0gaXBfZmllbGRzOworICAgIH0gbG93ZXJfc2V0dXA7CisgICAgdW5pb24geworICAgICAgICB1aW50MzJfdCB0Y3BfY29uZmlnOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCB0dWNzczsgICAgICAvKiBUQ1AgY2hlY2tzdW0gc3RhcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdHVjc287ICAgICAgLyogVENQIGNoZWNrc3VtIG9mZnNldCAqLworICAgICAgICAgICAgdWludDE2X3QgdHVjc2U7ICAgICAvKiBUQ1AgY2hlY2tzdW0gZW5kICovCisgICAgICAgIH0gdGNwX2ZpZWxkczsKKyAgICB9IHVwcGVyX3NldHVwOworICAgIHVpbnQzMl90IGNtZF9hbmRfbGVuZ3RoOyAgICAvKiAqLworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzOyAgICAgLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaGRyX2xlbjsgICAgLyogSGVhZGVyIGxlbmd0aCAqLworICAgICAgICAgICAgdWludDE2X3QgbXNzOyAgICAgICAvKiBNYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworICAgICAgICB9IGZpZWxkczsKKyAgICB9IHRjcF9zZWdfc2V0dXA7Cit9OworCisvKiBPZmZsb2FkIGRhdGEgZGVzY3JpcHRvciAqLworc3RydWN0IGUxMDAwX2RhdGFfZGVzYyB7CisgICAgdWludDY0X3QgYnVmZmVyX2FkZHI7ICAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBidWZmZXIgYWRkcmVzcyAqLworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsgICAgLyogRGF0YSBidWZmZXIgbGVuZ3RoICovCisgICAgICAgICAgICB1aW50OF90IHR5cF9sZW5fZXh0OyAgICAgICAgLyogKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY21kOyAgICAgICAgLyogKi8KKyAgICAgICAgfSBmbGFnczsKKyAgICB9IGxvd2VyOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzOyAgICAgLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9wdHM7ICAgICAgLyogUGFja2V0IE9wdGlvbnMgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHNwZWNpYWw7ICAgLyogKi8KKyAgICAgICAgfSBmaWVsZHM7CisgICAgfSB1cHBlcjsKK307CisKKy8qIEZpbHRlcnMgKi8KKyNkZWZpbmUgRTEwMDBfTlVNX1VOSUNBU1QgICAgICAgICAgMTYgICAvKiBVbmljYXN0IGZpbHRlciBlbnRyaWVzICovCisjZGVmaW5lIEUxMDAwX01DX1RCTF9TSVpFICAgICAgICAgIDEyOCAgLyogTXVsdGljYXN0IEZpbHRlciBUYWJsZSAoNDA5NiBiaXRzKSAqLworI2RlZmluZSBFMTAwMF9WTEFOX0ZJTFRFUl9UQkxfU0laRSAxMjggIC8qIFZMQU4gRmlsdGVyIFRhYmxlICg0MDk2IGJpdHMpICovCisKKyNkZWZpbmUgRTEwMDBfTlVNX1VOSUNBU1RfSUNIOExBTiAgNworI2RlZmluZSBFMTAwMF9NQ19UQkxfU0laRV9JQ0g4TEFOICAzMgorCisKKy8qIFJlY2VpdmUgQWRkcmVzcyBSZWdpc3RlciAqLworc3RydWN0IGUxMDAwX3JhciB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgbG93OyAgICAgIC8qIHJlY2VpdmUgYWRkcmVzcyBsb3cgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBoaWdoOyAgICAgLyogcmVjZWl2ZSBhZGRyZXNzIGhpZ2ggKi8KK307CisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBNdWx0aWNhc3QgVGFibGUgQXJyYXkgKE1UQSkuICovCisjZGVmaW5lIEUxMDAwX05VTV9NVEFfUkVHSVNURVJTIDEyOAorI2RlZmluZSBFMTAwMF9OVU1fTVRBX1JFR0lTVEVSU19JQ0g4TEFOIDMyCisKKy8qIElQdjQgQWRkcmVzcyBUYWJsZSBFbnRyeSAqLworc3RydWN0IGUxMDAwX2lwdjRfYXRfZW50cnkgeworICAgIHZvbGF0aWxlIHVpbnQzMl90IGlwdjRfYWRkcjsgICAgICAgIC8qIElQIEFkZHJlc3MgKFJXKSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyogRm91ciB3YWtldXAgSVAgYWRkcmVzc2VzIGFyZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV0FLRVVQX0lQX0FERFJFU1NfQ09VTlRfTUFYIDQKKyNkZWZpbmUgRTEwMDBfSVA0QVRfU0laRSAgICAgICAgICAgICAgICAgIEUxMDAwX1dBS0VVUF9JUF9BRERSRVNTX0NPVU5UX01BWAorI2RlZmluZSBFMTAwMF9JUDRBVF9TSVpFX0lDSDhMQU4gICAgICAgICAgMworI2RlZmluZSBFMTAwMF9JUDZBVF9TSVpFICAgICAgICAgICAgICAgICAgMQorCisvKiBJUHY2IEFkZHJlc3MgVGFibGUgRW50cnkgKi8KK3N0cnVjdCBlMTAwMF9pcHY2X2F0X2VudHJ5IHsKKyAgICB2b2xhdGlsZSB1aW50OF90IGlwdjZfYWRkclsxNl07Cit9OworCisvKiBGbGV4aWJsZSBGaWx0ZXIgTGVuZ3RoIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgZTEwMDBfZmZsdF9lbnRyeSB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgbGVuZ3RoOyAgIC8qIEZsZXhpYmxlIEZpbHRlciBMZW5ndGggKFJXKSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyogRmxleGlibGUgRmlsdGVyIE1hc2sgVGFibGUgRW50cnkgKi8KK3N0cnVjdCBlMTAwMF9mZm10X2VudHJ5IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYXNrOyAgICAgLyogRmxleGlibGUgRmlsdGVyIE1hc2sgKFJXKSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyogRmxleGlibGUgRmlsdGVyIFZhbHVlIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgZTEwMDBfZmZ2dF9lbnRyeSB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7ICAgIC8qIEZsZXhpYmxlIEZpbHRlciBWYWx1ZSAoUlcpICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ7Cit9OworCisvKiBGb3VyIEZsZXhpYmxlIEZpbHRlcnMgYXJlIHN1cHBvcnRlZCAqLworI2RlZmluZSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfQ09VTlRfTUFYIDQKKworLyogRWFjaCBGbGV4aWJsZSBGaWx0ZXIgaXMgYXQgbW9zdCAxMjggKDB4ODApIGJ5dGVzIGluIGxlbmd0aCAqLworI2RlZmluZSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfU0laRV9NQVggIDEyOAorCisjZGVmaW5lIEUxMDAwX0ZGTFRfU0laRSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfQ09VTlRfTUFYCisjZGVmaW5lIEUxMDAwX0ZGTVRfU0laRSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfU0laRV9NQVgKKyNkZWZpbmUgRTEwMDBfRkZWVF9TSVpFIEUxMDAwX0ZMRVhJQkxFX0ZJTFRFUl9TSVpFX01BWAorCisjZGVmaW5lIEUxMDAwX0RJU0FCTEVfU0VSREVTX0xPT1BCQUNLICAgMHgwNDAwCisKKy8qIFJlZ2lzdGVyIFNldC4gKDgyNTQzLCA4MjU0NCkKKyAqCisgKiBSZWdpc3RlcnMgYXJlIGRlZmluZWQgdG8gYmUgMzIgYml0cyBhbmQgIHNob3VsZCBiZSBhY2Nlc3NlZCBhcyAzMiBiaXQgdmFsdWVzLgorICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBwaHlzaWNhbGx5IGxvY2F0ZWQgb24gdGhlIE5JQywgYnV0IGFyZSBtYXBwZWQgaW50byB0aGUKKyAqIGhvc3QgbWVtb3J5IGFkZHJlc3Mgc3BhY2UuCisgKgorICogUlcgLSByZWdpc3RlciBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZQorICogUk8gLSByZWdpc3RlciBpcyByZWFkIG9ubHkKKyAqIFdPIC0gcmVnaXN0ZXIgaXMgd3JpdGUgb25seQorICogUi9jbHIgLSByZWdpc3RlciBpcyByZWFkIG9ubHkgYW5kIGlzIGNsZWFyZWQgd2hlbiByZWFkCisgKiBBIC0gcmVnaXN0ZXIgYXJyYXkKKyAqLworI2RlZmluZSBFMTAwMF9DVFJMICAgICAweDAwMDAwICAvKiBEZXZpY2UgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRFVQIDB4MDAwMDQgIC8qIERldmljZSBDb250cm9sIER1cGxpY2F0ZSAoU2hhZG93KSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1NUQVRVUyAgIDB4MDAwMDggIC8qIERldmljZSBTdGF0dXMgLSBSTyAqLworI2RlZmluZSBFMTAwMF9FRUNEICAgICAweDAwMDEwICAvKiBFRVBST00vRmxhc2ggQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0VFUkQgICAgIDB4MDAwMTQgIC8qIEVFUFJPTSBSZWFkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFQgMHgwMDAxOCAgLyogRXh0ZW5kZWQgRGV2aWNlIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GTEEgICAgICAweDAwMDFDICAvKiBGbGFzaCBBY2Nlc3MgLSBSVyAqLworI2RlZmluZSBFMTAwMF9NRElDICAgICAweDAwMDIwICAvKiBNREkgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1NDVEwgICAgIDB4MDAwMjQgIC8qIFNlckRlcyBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkVYVE5WTSAgMHgwMDAyOCAgLyogRnV0dXJlIEV4dGVuZGVkIE5WTSByZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9GQ0FMICAgICAweDAwMDI4ICAvKiBGbG93IENvbnRyb2wgQWRkcmVzcyBMb3cgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ0FIICAgICAweDAwMDJDICAvKiBGbG93IENvbnRyb2wgQWRkcmVzcyBIaWdoIC1SVyAqLworI2RlZmluZSBFMTAwMF9GQ1QgICAgICAweDAwMDMwICAvKiBGbG93IENvbnRyb2wgVHlwZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1ZFVCAgICAgIDB4MDAwMzggIC8qIFZMQU4gRXRoZXIgVHlwZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lDUiAgICAgIDB4MDAwQzAgIC8qIEludGVycnVwdCBDYXVzZSBSZWFkIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfSVRSICAgICAgMHgwMDBDNCAgLyogSW50ZXJydXB0IFRocm90dGxpbmcgUmF0ZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lDUyAgICAgIDB4MDAwQzggIC8qIEludGVycnVwdCBDYXVzZSBTZXQgLSBXTyAqLworI2RlZmluZSBFMTAwMF9JTVMgICAgICAweDAwMEQwICAvKiBJbnRlcnJ1cHQgTWFzayBTZXQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JTUMgICAgICAweDAwMEQ4ICAvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciAtIFdPICovCisjZGVmaW5lIEUxMDAwX0lBTSAgICAgIDB4MDAwRTAgIC8qIEludGVycnVwdCBBY2tub3dsZWRnZSBBdXRvIE1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTCAgICAgMHgwMDEwMCAgLyogUlggQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVFIxICAgIDB4MDI4MjAgIC8qIFJYIERlbGF5IFRpbWVyICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFMMSAgIDB4MDI5MDAgIC8qIFJYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIExvdyAoMSkgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SREJBSDEgICAweDAyOTA0ICAvKiBSWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBIaWdoICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JETEVOMSAgIDB4MDI5MDggIC8qIFJYIERlc2NyaXB0b3IgTGVuZ3RoICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JESDEgICAgIDB4MDI5MTAgIC8qIFJYIERlc2NyaXB0b3IgSGVhZCAoMSkgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRFQxICAgICAweDAyOTE4ICAvKiBSWCBEZXNjcmlwdG9yIFRhaWwgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNUVFYgICAgMHgwMDE3MCAgLyogRmxvdyBDb250cm9sIFRyYW5zbWl0IFRpbWVyIFZhbHVlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVFhDVyAgICAgMHgwMDE3OCAgLyogVFggQ29uZmlndXJhdGlvbiBXb3JkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUlhDVyAgICAgMHgwMDE4MCAgLyogUlggQ29uZmlndXJhdGlvbiBXb3JkIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfVENUTCAgICAgMHgwMDQwMCAgLyogVFggQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RDVExfRVhUIDB4MDA0MDQgIC8qIEV4dGVuZGVkIFRYIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9USVBHICAgICAweDAwNDEwICAvKiBUWCBJbnRlci1wYWNrZXQgZ2FwIC1SVyAqLworI2RlZmluZSBFMTAwMF9UQlQgICAgICAweDAwNDQ4ICAvKiBUWCBCdXJzdCBUaW1lciAtIFJXICovCisjZGVmaW5lIEUxMDAwX0FJVCAgICAgIDB4MDA0NTggIC8qIEFkYXB0aXZlIEludGVyZnJhbWUgU3BhY2luZyBUaHJvdHRsZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX0xFRENUTCAgIDB4MDBFMDAgIC8qIExFRCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkwgIDB4MDBGMDAgIC8qIEV4dGVuZGVkIENvbmZpZ3VyYXRpb24gQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9FWFRDTkZfU0laRSAgMHgwMEYwOCAgLyogRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBTaXplICovCisjZGVmaW5lIEUxMDAwX1BIWV9DVFJMICAgICAweDAwRjEwICAvKiBQSFkgQ29udHJvbCBSZWdpc3RlciBpbiBDU1IgKi8KKyNkZWZpbmUgRkVYVE5WTV9TV19DT05GSUcgIDB4MDAwMQorI2RlZmluZSBFMTAwMF9QQkEgICAgICAweDAxMDAwICAvKiBQYWNrZXQgQnVmZmVyIEFsbG9jYXRpb24gLSBSVyAqLworI2RlZmluZSBFMTAwMF9QQlMgICAgICAweDAxMDA4ICAvKiBQYWNrZXQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgRTEwMDBfRUVNTkdDVEwgMHgwMTAxMCAgLyogTU5HIEVFcHJvbSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0ZMQVNIX1VQREFURVMgMTAwMAorI2RlZmluZSBFMTAwMF9FRUFSQkMgICAweDAxMDI0ICAvKiBFRVBST00gQXV0byBSZWFkIEJ1cyBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0ZMQVNIVCAgIDB4MDEwMjggIC8qIEZMQVNIIFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0VFV1IgICAgIDB4MDEwMkMgIC8qIEVFUFJPTSBXcml0ZSBSZWdpc3RlciAtIFJXICovCisjZGVmaW5lIEUxMDAwX0ZMU1dDVEwgIDB4MDEwMzAgIC8qIEZMQVNIIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfRkxTV0RBVEEgMHgwMTAzNCAgLyogRkxBU0ggZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9GTFNXQ05UICAweDAxMDM4ICAvKiBGTEFTSCBBY2Nlc3MgQ291bnRlciAqLworI2RlZmluZSBFMTAwMF9GTE9QICAgICAweDAxMDNDICAvKiBGTEFTSCBPcGNvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfRVJUICAgICAgMHgwMjAwOCAgLyogRWFybHkgUnggVGhyZXNob2xkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVEwgICAgMHgwMjE2MCAgLyogRmxvdyBDb250cm9sIFJlY2VpdmUgVGhyZXNob2xkIExvdyAtIFJXICovCisjZGVmaW5lIEUxMDAwX0ZDUlRIICAgIDB4MDIxNjggIC8qIEZsb3cgQ29udHJvbCBSZWNlaXZlIFRocmVzaG9sZCBIaWdoIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUFNSQ1RMICAgMHgwMjE3MCAgLyogUGFja2V0IFNwbGl0IFJlY2VpdmUgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFMICAgIDB4MDI4MDAgIC8qIFJYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIExvdyAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFIICAgIDB4MDI4MDQgIC8qIFJYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIEhpZ2ggLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRExFTiAgICAweDAyODA4ICAvKiBSWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JESCAgICAgIDB4MDI4MTAgIC8qIFJYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVCAgICAgIDB4MDI4MTggIC8qIFJYIERlc2NyaXB0b3IgVGFpbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVFIgICAgIDB4MDI4MjAgIC8qIFJYIERlbGF5IFRpbWVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRCQUwwICAgRTEwMDBfUkRCQUwgLyogUlggRGVzYyBCYXNlIEFkZHJlc3MgTG93ICgwKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFIMCAgIEUxMDAwX1JEQkFIIC8qIFJYIERlc2MgQmFzZSBBZGRyZXNzIEhpZ2ggKDApIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRMRU4wICAgRTEwMDBfUkRMRU4gLyogUlggRGVzYyBMZW5ndGggKDApIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRIMCAgICAgRTEwMDBfUkRIICAgLyogUlggRGVzYyBIZWFkICgwKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVDAgICAgIEUxMDAwX1JEVCAgIC8qIFJYIERlc2MgVGFpbCAoMCkgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRFRSMCAgICBFMTAwMF9SRFRSICAvKiBSWCBEZWxheSBUaW1lciAoMCkgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SWERDVEwgICAweDAyODI4ICAvKiBSWCBEZXNjcmlwdG9yIENvbnRyb2wgcXVldWUgMCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JYRENUTDEgIDB4MDI5MjggIC8qIFJYIERlc2NyaXB0b3IgQ29udHJvbCBxdWV1ZSAxIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkFEViAgICAgMHgwMjgyQyAgLyogUlggSW50ZXJydXB0IEFic29sdXRlIERlbGF5IFRpbWVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUlNSUEQgICAgMHgwMkMwMCAgLyogUlggU21hbGwgUGFja2V0IERldGVjdCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JBSUQgICAgIDB4MDJDMDggIC8qIFJlY2VpdmUgQWNrIEludGVycnVwdCBEZWxheSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RYRE1BQyAgIDB4MDMwMDAgIC8qIFRYIERNQSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfS0FCR1RYRCAgMHgwMzAwNCAgLyogQUZFIEJhbmQgR2FwIFRyYW5zbWl0IFJlZiBEYXRhICovCisjZGVmaW5lIEUxMDAwX1RERkggICAgIDB4MDM0MTAgIC8qIFRYIERhdGEgRklGTyBIZWFkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGVCAgICAgMHgwMzQxOCAgLyogVFggRGF0YSBGSUZPIFRhaWwgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZIUyAgICAweDAzNDIwICAvKiBUWCBEYXRhIEZJRk8gSGVhZCBTYXZlZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RERlRTICAgIDB4MDM0MjggIC8qIFRYIERhdGEgRklGTyBUYWlsIFNhdmVkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGUEMgICAgMHgwMzQzMCAgLyogVFggRGF0YSBGSUZPIFBhY2tldCBDb3VudCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REQkFMICAgIDB4MDM4MDAgIC8qIFRYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIExvdyAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REQkFIICAgIDB4MDM4MDQgIC8qIFRYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIEhpZ2ggLSBSVyAqLworI2RlZmluZSBFMTAwMF9URExFTiAgICAweDAzODA4ICAvKiBUWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RESCAgICAgIDB4MDM4MTAgIC8qIFRYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REVCAgICAgIDB4MDM4MTggIC8qIFRYIERlc2NyaXBvdHIgVGFpbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RJRFYgICAgIDB4MDM4MjAgIC8qIFRYIEludGVycnVwdCBEZWxheSBWYWx1ZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RYRENUTCAgIDB4MDM4MjggIC8qIFRYIERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RBRFYgICAgIDB4MDM4MkMgIC8qIFRYIEludGVycnVwdCBBYnNvbHV0ZSBEZWxheSBWYWwgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UU1BNVCAgICAweDAzODMwICAvKiBUQ1AgU2VnbWVudGF0aW9uIFBBRCAmIE1pbiBUaHJlc2hvbGQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UQVJDMCAgICAweDAzODQwICAvKiBUWCBBcmJpdHJhdGlvbiBDb3VudCAoMCkgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUwxICAgMHgwMzkwMCAgLyogVFggRGVzYyBCYXNlIEFkZHJlc3MgTG93ICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REQkFIMSAgIDB4MDM5MDQgIC8qIFRYIERlc2MgQmFzZSBBZGRyZXNzIEhpZ2ggKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERMRU4xICAgMHgwMzkwOCAgLyogVFggRGVzYyBMZW5ndGggKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERIMSAgICAgMHgwMzkxMCAgLyogVFggRGVzYyBIZWFkICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REVDEgICAgIDB4MDM5MTggIC8qIFRYIERlc2MgVGFpbCAoMSkgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UWERDVEwxICAweDAzOTI4ICAvKiBUWCBEZXNjcmlwdG9yIENvbnRyb2wgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEFSQzEgICAgMHgwMzk0MCAgLyogVFggQXJiaXRyYXRpb24gQ291bnQgKDEpICovCisjZGVmaW5lIEUxMDAwX0NSQ0VSUlMgIDB4MDQwMDAgIC8qIENSQyBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0FMR05FUlJDIDB4MDQwMDQgIC8qIEFsaWdubWVudCBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1NZTUVSUlMgIDB4MDQwMDggIC8qIFN5bWJvbCBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JYRVJSQyAgIDB4MDQwMEMgIC8qIFJlY2VpdmUgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NUEMgICAgICAweDA0MDEwICAvKiBNaXNzZWQgUGFja2V0IENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfU0NDICAgICAgMHgwNDAxNCAgLyogU2luZ2xlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0VDT0wgICAgIDB4MDQwMTggIC8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NQ0MgICAgICAweDA0MDFDICAvKiBNdWx0aXBsZSBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9MQVRFQ09MICAweDA0MDIwICAvKiBMYXRlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0NPTEMgICAgIDB4MDQwMjggIC8qIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0RDICAgICAgIDB4MDQwMzAgIC8qIERlZmVyIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE5DUlMgICAgMHgwNDAzNCAgLyogVFgtTm8gQ1JTIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfU0VDICAgICAgMHgwNDAzOCAgLyogU2VxdWVuY2UgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9DRVhURVJSICAweDA0MDNDICAvKiBDYXJyaWVyIEV4dGVuc2lvbiBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JMRUMgICAgIDB4MDQwNDAgIC8qIFJlY2VpdmUgTGVuZ3RoIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9OUlhDICAgMHgwNDA0OCAgLyogWE9OIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9OVFhDICAgMHgwNDA0QyAgLyogWE9OIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9GRlJYQyAgMHgwNDA1MCAgLyogWE9GRiBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1hPRkZUWEMgIDB4MDQwNTQgIC8qIFhPRkYgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9GQ1JVQyAgICAweDA0MDU4ICAvKiBGbG93IENvbnRyb2wgUlggVW5zdXBwb3J0ZWQgQ291bnQtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzY0ICAgIDB4MDQwNUMgIC8qIFBhY2tldHMgUlggKDY0IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzEyNyAgIDB4MDQwNjAgIC8qIFBhY2tldHMgUlggKDY1LTEyNyBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QUkMyNTUgICAweDA0MDY0ICAvKiBQYWNrZXRzIFJYICgxMjgtMjU1IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzUxMSAgIDB4MDQwNjggIC8qIFBhY2tldHMgUlggKDI1NS01MTEgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMTAyMyAgMHgwNDA2QyAgLyogUGFja2V0cyBSWCAoNTEyLTEwMjMgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMTUyMiAgMHgwNDA3MCAgLyogUGFja2V0cyBSWCAoMTAyNC0xNTIyIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dQUkMgICAgIDB4MDQwNzQgIC8qIEdvb2QgUGFja2V0cyBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0JQUkMgICAgIDB4MDQwNzggIC8qIEJyb2FkY2FzdCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTVBSQyAgICAgMHgwNDA3QyAgLyogTXVsdGljYXN0IFBhY2tldHMgUlggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HUFRDICAgICAweDA0MDgwICAvKiBHb29kIFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HT1JDTCAgICAweDA0MDg4ICAvKiBHb29kIE9jdGV0cyBSWCBDb3VudCBMb3cgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HT1JDSCAgICAweDA0MDhDICAvKiBHb29kIE9jdGV0cyBSWCBDb3VudCBIaWdoIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09UQ0wgICAgMHgwNDA5MCAgLyogR29vZCBPY3RldHMgVFggQ291bnQgTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09UQ0ggICAgMHgwNDA5NCAgLyogR29vZCBPY3RldHMgVFggQ291bnQgSGlnaCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JOQkMgICAgIDB4MDQwQTAgIC8qIFJYIE5vIEJ1ZmZlcnMgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SVUMgICAgICAweDA0MEE0ICAvKiBSWCBVbmRlcnNpemUgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SRkMgICAgICAweDA0MEE4ICAvKiBSWCBGcmFnbWVudCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JPQyAgICAgIDB4MDQwQUMgIC8qIFJYIE92ZXJzaXplIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUkpDICAgICAgMHgwNDBCMCAgLyogUlggSmFiYmVyIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTUdUUFJDICAgMHgwNDBCNCAgLyogTWFuYWdlbWVudCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTUdUUERDICAgMHgwNDBCOCAgLyogTWFuYWdlbWVudCBQYWNrZXRzIERyb3BwZWQgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NR1RQVEMgICAweDA0MEJDICAvKiBNYW5hZ2VtZW50IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1JMICAgICAweDA0MEMwICAvKiBUb3RhbCBPY3RldHMgUlggTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE9SSCAgICAgMHgwNDBDNCAgLyogVG90YWwgT2N0ZXRzIFJYIEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1RMICAgICAweDA0MEM4ICAvKiBUb3RhbCBPY3RldHMgVFggTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE9USCAgICAgMHgwNDBDQyAgLyogVG90YWwgT2N0ZXRzIFRYIEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UUFIgICAgICAweDA0MEQwICAvKiBUb3RhbCBQYWNrZXRzIFJYIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVFBUICAgICAgMHgwNDBENCAgLyogVG90YWwgUGFja2V0cyBUWCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzY0ICAgIDB4MDQwRDggIC8qIFBhY2tldHMgVFggKDY0IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzEyNyAgIDB4MDQwREMgIC8qIFBhY2tldHMgVFggKDY1LTEyNyBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEMyNTUgICAweDA0MEUwICAvKiBQYWNrZXRzIFRYICgxMjgtMjU1IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzUxMSAgIDB4MDQwRTQgIC8qIFBhY2tldHMgVFggKDI1Ni01MTEgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDMTAyMyAgMHgwNDBFOCAgLyogUGFja2V0cyBUWCAoNTEyLTEwMjMgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDMTUyMiAgMHgwNDBFQyAgLyogUGFja2V0cyBUWCAoMTAyNC0xNTIyIEJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01QVEMgICAgIDB4MDQwRjAgIC8qIE11bHRpY2FzdCBQYWNrZXRzIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQlBUQyAgICAgMHgwNDBGNCAgLyogQnJvYWRjYXN0IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UU0NUQyAgICAweDA0MEY4ICAvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVFggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UU0NURkMgICAweDA0MEZDICAvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVFggRmFpbCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0lBQyAgICAgIDB4MDQxMDAgIC8qIEludGVycnVwdCBBc3NlcnRpb24gQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWFBUQyAgMHgwNDEwNCAgLyogSW50ZXJydXB0IENhdXNlIFJ4IFBhY2tldCBUaW1lciBFeHBpcmUgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWEFUQyAgMHgwNDEwOCAgLyogSW50ZXJydXB0IENhdXNlIFJ4IEFic29sdXRlIFRpbWVyIEV4cGlyZSBDb3VudCAqLworI2RlZmluZSBFMTAwMF9JQ1RYUFRDICAweDA0MTBDICAvKiBJbnRlcnJ1cHQgQ2F1c2UgVHggUGFja2V0IFRpbWVyIEV4cGlyZSBDb3VudCAqLworI2RlZmluZSBFMTAwMF9JQ1RYQVRDICAweDA0MTEwICAvKiBJbnRlcnJ1cHQgQ2F1c2UgVHggQWJzb2x1dGUgVGltZXIgRXhwaXJlIENvdW50ICovCisjZGVmaW5lIEUxMDAwX0lDVFhRRUMgIDB4MDQxMTggIC8qIEludGVycnVwdCBDYXVzZSBUeCBRdWV1ZSBFbXB0eSBDb3VudCAqLworI2RlZmluZSBFMTAwMF9JQ1RYUU1UQyAweDA0MTFDICAvKiBJbnRlcnJ1cHQgQ2F1c2UgVHggUXVldWUgTWluaW11bSBUaHJlc2hvbGQgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWERNVEMgMHgwNDEyMCAgLyogSW50ZXJydXB0IENhdXNlIFJ4IERlc2NyaXB0b3IgTWluaW11bSBUaHJlc2hvbGQgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWE9DICAgMHgwNDEyNCAgLyogSW50ZXJydXB0IENhdXNlIFJlY2VpdmVyIE92ZXJydW4gQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNICAgMHgwNTAwMCAgLyogUlggQ2hlY2tzdW0gQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JGQ1RMICAgIDB4MDUwMDggIC8qIFJlY2VpdmUgRmlsdGVyIENvbnRyb2wqLworI2RlZmluZSBFMTAwMF9NVEEgICAgICAweDA1MjAwICAvKiBNdWx0aWNhc3QgVGFibGUgQXJyYXkgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9SQSAgICAgICAweDA1NDAwICAvKiBSZWNlaXZlIEFkZHJlc3MgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9WRlRBICAgICAweDA1NjAwICAvKiBWTEFOIEZpbHRlciBUYWJsZSBBcnJheSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1dVQyAgICAgIDB4MDU4MDAgIC8qIFdha2V1cCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQyAgICAgMHgwNTgwOCAgLyogV2FrZXVwIEZpbHRlciBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfV1VTICAgICAgMHgwNTgxMCAgLyogV2FrZXVwIFN0YXR1cyAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkMgICAgIDB4MDU4MjAgIC8qIE1hbmFnZW1lbnQgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lQQVYgICAgIDB4MDU4MzggIC8qIElQIEFkZHJlc3MgVmFsaWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JUDRBVCAgICAweDA1ODQwICAvKiBJUHY0IEFkZHJlc3MgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9JUDZBVCAgICAweDA1ODgwICAvKiBJUHY2IEFkZHJlc3MgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9XVVBMICAgICAweDA1OTAwICAvKiBXYWtldXAgUGFja2V0IExlbmd0aCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1dVUE0gICAgIDB4MDVBMDAgIC8qIFdha2V1cCBQYWNrZXQgTWVtb3J5IC0gUk8gQSAqLworI2RlZmluZSBFMTAwMF9GRkxUICAgICAweDA1RjAwICAvKiBGbGV4aWJsZSBGaWx0ZXIgTGVuZ3RoIFRhYmxlIC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfSE9TVF9JRiAgMHgwODgwMCAgLyogSG9zdCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgRTEwMDBfRkZNVCAgICAgMHgwOTAwMCAgLyogRmxleGlibGUgRmlsdGVyIE1hc2sgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9GRlZUICAgICAweDA5ODAwICAvKiBGbGV4aWJsZSBGaWx0ZXIgVmFsdWUgVGFibGUgLSBSVyBBcnJheSAqLworCisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEEgMHgwMDAzNCAvKiBNQUMtUEhZIGludGVyZmFjZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX01EUEhZQSAgICAgMHgwMDAzQyAgLyogUEhZIGFkZHJlc3MgLSBSVyAqLworI2RlZmluZSBFMTAwMF9NQU5DMkggICAgIDB4MDU4NjAgIC8qIE1hbmFnbWVudCBDb250cm9sIFRvIEhvc3QgLSBSVyAqLworI2RlZmluZSBFMTAwMF9TV19GV19TWU5DIDB4MDVCNUMgLyogU29mdHdhcmUtRmlybXdhcmUgU3luY2hyb25pemF0aW9uIC0gUlcgKi8KKworI2RlZmluZSBFMTAwMF9HQ1IgICAgICAgMHgwNUIwMCAvKiBQQ0ktRXggQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9HU0NMXzEgICAgMHgwNUIxMCAvKiBQQ0ktRXggU3RhdGlzdGljIENvbnRyb2wgIzEgKi8KKyNkZWZpbmUgRTEwMDBfR1NDTF8yICAgIDB4MDVCMTQgLyogUENJLUV4IFN0YXRpc3RpYyBDb250cm9sICMyICovCisjZGVmaW5lIEUxMDAwX0dTQ0xfMyAgICAweDA1QjE4IC8qIFBDSS1FeCBTdGF0aXN0aWMgQ29udHJvbCAjMyAqLworI2RlZmluZSBFMTAwMF9HU0NMXzQgICAgMHgwNUIxQyAvKiBQQ0ktRXggU3RhdGlzdGljIENvbnRyb2wgIzQgKi8KKyNkZWZpbmUgRTEwMDBfRkFDVFBTICAgIDB4MDVCMzAgLyogRnVuY3Rpb24gQWN0aXZlIGFuZCBQb3dlciBTdGF0ZSB0byBNTkcgKi8KKyNkZWZpbmUgRTEwMDBfU1dTTSAgICAgIDB4MDVCNTAgLyogU1cgU2VtYXBob3JlICovCisjZGVmaW5lIEUxMDAwX0ZXU00gICAgICAweDA1QjU0IC8qIEZXIFNlbWFwaG9yZSAqLworI2RlZmluZSBFMTAwMF9GRkxUX0RCRyAgMHgwNUYwNCAvKiBEZWJ1ZyBSZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9ISUNSICAgICAgMHgwOEYwMCAvKiBIb3N0IEludGVmYWNlIENvbnRyb2wgKi8KKworLyogUlNTIHJlZ2lzdGVycyAqLworI2RlZmluZSBFMTAwMF9DUFVWRUMgICAgMHgwMkMxMCAvKiBDUFUgVmVjdG9yIFJlZ2lzdGVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfTVJRQyAgICAgIDB4MDU4MTggLyogTXVsdGlwbGUgUmVjZWl2ZSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkVUQSAgICAgIDB4MDVDMDAgLyogUmVkaXJlY3Rpb24gVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9SU1NSSyAgICAgMHgwNUM4MCAvKiBSU1MgUmFuZG9tIEtleSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1JTU0lNICAgICAweDA1ODY0IC8qIFJTUyBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBFMTAwMF9SU1NJUiAgICAgMHgwNTg2OCAvKiBSU1MgSW50ZXJydXB0IFJlcXVlc3QgKi8KKy8qIFJlZ2lzdGVyIFNldCAoODI1NDIpCisgKgorICogU29tZSBvZiB0aGUgODI1NDIgcmVnaXN0ZXJzIGFyZSBsb2NhdGVkIGF0IGRpZmZlcmVudCBvZmZzZXRzIHRoYW4gdGhleSBhcmUKKyAqIGluIG1vcmUgY3VycmVudCB2ZXJzaW9ucyBvZiB0aGUgODI1NHguIERlc3BpdGUgdGhlIGRpZmZlcmVuY2UgaW4gbG9jYXRpb24sCisgKiB0aGUgcmVnaXN0ZXJzIGZ1bmN0aW9uIGluIHRoZSBzYW1lIG1hbm5lci4KKyAqLworI2RlZmluZSBFMTAwMF84MjU0Ml9DVFJMICAgICBFMTAwMF9DVFJMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0NUUkxfRFVQIEUxMDAwX0NUUkxfRFVQCisjZGVmaW5lIEUxMDAwXzgyNTQyX1NUQVRVUyAgIEUxMDAwX1NUQVRVUworI2RlZmluZSBFMTAwMF84MjU0Ml9FRUNEICAgICBFMTAwMF9FRUNECisjZGVmaW5lIEUxMDAwXzgyNTQyX0VFUkQgICAgIEUxMDAwX0VFUkQKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ1RSTF9FWFQgRTEwMDBfQ1RSTF9FWFQKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkxBICAgICAgRTEwMDBfRkxBCisjZGVmaW5lIEUxMDAwXzgyNTQyX01ESUMgICAgIEUxMDAwX01ESUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfU0NUTCAgICAgRTEwMDBfU0NUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9GRVhUTlZNICBFMTAwMF9GRVhUTlZNCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDQUwgICAgIEUxMDAwX0ZDQUwKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNBSCAgICAgRTEwMDBfRkNBSAorI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1QgICAgICBFMTAwMF9GQ1QKKyNkZWZpbmUgRTEwMDBfODI1NDJfVkVUICAgICAgRTEwMDBfVkVUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JBICAgICAgIDB4MDAwNDAKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUNSICAgICAgRTEwMDBfSUNSCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lUUiAgICAgIEUxMDAwX0lUUgorI2RlZmluZSBFMTAwMF84MjU0Ml9JQ1MgICAgICBFMTAwMF9JQ1MKKyNkZWZpbmUgRTEwMDBfODI1NDJfSU1TICAgICAgRTEwMDBfSU1TCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lNQyAgICAgIEUxMDAwX0lNQworI2RlZmluZSBFMTAwMF84MjU0Ml9SQ1RMICAgICBFMTAwMF9SQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEVFIgICAgIDB4MDAxMDgKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUwgICAgMHgwMDExMAorI2RlZmluZSBFMTAwMF84MjU0Ml9SREJBSCAgICAweDAwMTE0CisjZGVmaW5lIEUxMDAwXzgyNTQyX1JETEVOICAgIDB4MDAxMTgKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRIICAgICAgMHgwMDEyMAorI2RlZmluZSBFMTAwMF84MjU0Ml9SRFQgICAgICAweDAwMTI4CisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEVFIwICAgIEUxMDAwXzgyNTQyX1JEVFIKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUwwICAgRTEwMDBfODI1NDJfUkRCQUwKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUgwICAgRTEwMDBfODI1NDJfUkRCQUgKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRMRU4wICAgRTEwMDBfODI1NDJfUkRMRU4KKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRIMCAgICAgRTEwMDBfODI1NDJfUkRICisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEVDAgICAgIEUxMDAwXzgyNTQyX1JEVAorI2RlZmluZSBFMTAwMF84MjU0Ml9TUlJDVEwoX24pICgweDI4MEMgKyAoKF9uKSA8PCA4KSkgLyogU3BsaXQgYW5kIFJlcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSWCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfODI1NDJfRENBX1JYQ1RSTChfbikgKDB4MDI4MTQgKyAoKF9uKSA8PCA4KSkKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUgzICAgMHgwMkIwNCAvKiBSWCBEZXNjIEJhc2UgSGlnaCBRdWV1ZSAzIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUwzICAgMHgwMkIwMCAvKiBSWCBEZXNjIExvdyBRdWV1ZSAzIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRMRU4zICAgMHgwMkIwOCAvKiBSWCBEZXNjIExlbmd0aCBRdWV1ZSAzIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRIMyAgICAgMHgwMkIxMCAvKiBSWCBEZXNjIEhlYWQgUXVldWUgMyAtIFJXICovCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEVDMgICAgIDB4MDJCMTggLyogUlggRGVzYyBUYWlsIFF1ZXVlIDMgLSBSVyAqLworI2RlZmluZSBFMTAwMF84MjU0Ml9SREJBTDIgICAweDAyQTAwIC8qIFJYIERlc2MgQmFzZSBMb3cgUXVldWUgMiAtIFJXICovCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEQkFIMiAgIDB4MDJBMDQgLyogUlggRGVzYyBCYXNlIEhpZ2ggUXVldWUgMiAtIFJXICovCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JETEVOMiAgIDB4MDJBMDggLyogUlggRGVzYyBMZW5ndGggUXVldWUgMiAtIFJXICovCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JESDIgICAgIDB4MDJBMTAgLyogUlggRGVzYyBIZWFkIFF1ZXVlIDIgLSBSVyAqLworI2RlZmluZSBFMTAwMF84MjU0Ml9SRFQyICAgICAweDAyQTE4IC8qIFJYIERlc2MgVGFpbCBRdWV1ZSAyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRUUjEgICAgMHgwMDEzMAorI2RlZmluZSBFMTAwMF84MjU0Ml9SREJBTDEgICAweDAwMTM4CisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEQkFIMSAgIDB4MDAxM0MKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRMRU4xICAgMHgwMDE0MAorI2RlZmluZSBFMTAwMF84MjU0Ml9SREgxICAgICAweDAwMTQ4CisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEVDEgICAgIDB4MDAxNTAKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNSVEggICAgMHgwMDE2MAorI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1JUTCAgICAweDAwMTY4CisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDVFRWICAgIEUxMDAwX0ZDVFRWCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RYQ1cgICAgIEUxMDAwX1RYQ1cKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlhDVyAgICAgRTEwMDBfUlhDVworI2RlZmluZSBFMTAwMF84MjU0Ml9NVEEgICAgICAweDAwMjAwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RDVEwgICAgIEUxMDAwX1RDVEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfVENUTF9FWFQgRTEwMDBfVENUTF9FWFQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVElQRyAgICAgRTEwMDBfVElQRworI2RlZmluZSBFMTAwMF84MjU0Ml9UREJBTCAgICAweDAwNDIwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1REQkFIICAgIDB4MDA0MjQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERMRU4gICAgMHgwMDQyOAorI2RlZmluZSBFMTAwMF84MjU0Ml9UREggICAgICAweDAwNDMwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1REVCAgICAgIDB4MDA0MzgKKyNkZWZpbmUgRTEwMDBfODI1NDJfVElEViAgICAgMHgwMDQ0MAorI2RlZmluZSBFMTAwMF84MjU0Ml9UQlQgICAgICBFMTAwMF9UQlQKKyNkZWZpbmUgRTEwMDBfODI1NDJfQUlUICAgICAgRTEwMDBfQUlUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1ZGVEEgICAgIDB4MDA2MDAKKyNkZWZpbmUgRTEwMDBfODI1NDJfTEVEQ1RMICAgRTEwMDBfTEVEQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BCQSAgICAgIEUxMDAwX1BCQQorI2RlZmluZSBFMTAwMF84MjU0Ml9QQlMgICAgICBFMTAwMF9QQlMKKyNkZWZpbmUgRTEwMDBfODI1NDJfRUVNTkdDVEwgRTEwMDBfRUVNTkdDVEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfRUVBUkJDICAgRTEwMDBfRUVBUkJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZMQVNIVCAgIEUxMDAwX0ZMQVNIVAorI2RlZmluZSBFMTAwMF84MjU0Ml9FRVdSICAgICBFMTAwMF9FRVdSCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZMU1dDVEwgIEUxMDAwX0ZMU1dDVEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkxTV0RBVEEgRTEwMDBfRkxTV0RBVEEKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkxTV0NOVCAgRTEwMDBfRkxTV0NOVAorI2RlZmluZSBFMTAwMF84MjU0Ml9GTE9QICAgICBFMTAwMF9GTE9QCisjZGVmaW5lIEUxMDAwXzgyNTQyX0VYVENORl9DVFJMICBFMTAwMF9FWFRDTkZfQ1RSTAorI2RlZmluZSBFMTAwMF84MjU0Ml9FWFRDTkZfU0laRSAgRTEwMDBfRVhUQ05GX1NJWkUKKyNkZWZpbmUgRTEwMDBfODI1NDJfUEhZX0NUUkwgRTEwMDBfUEhZX0NUUkwKKyNkZWZpbmUgRTEwMDBfODI1NDJfRVJUICAgICAgRTEwMDBfRVJUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JYRENUTCAgIEUxMDAwX1JYRENUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9SWERDVEwxICBFMTAwMF9SWERDVEwxCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JBRFYgICAgIEUxMDAwX1JBRFYKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlNSUEQgICAgRTEwMDBfUlNSUEQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFhETUFDICAgRTEwMDBfVFhETUFDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0tBQkdUWEQgIEUxMDAwX0tBQkdUWEQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERGSFMgICAgRTEwMDBfVERGSFMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERGVFMgICAgRTEwMDBfVERGVFMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERGUEMgICAgRTEwMDBfVERGUEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFhEQ1RMICAgRTEwMDBfVFhEQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RBRFYgICAgIEUxMDAwX1RBRFYKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFNQTVQgICAgRTEwMDBfVFNQTVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ1JDRVJSUyAgRTEwMDBfQ1JDRVJSUworI2RlZmluZSBFMTAwMF84MjU0Ml9BTEdORVJSQyBFMTAwMF9BTEdORVJSQworI2RlZmluZSBFMTAwMF84MjU0Ml9TWU1FUlJTICBFMTAwMF9TWU1FUlJTCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JYRVJSQyAgIEUxMDAwX1JYRVJSQworI2RlZmluZSBFMTAwMF84MjU0Ml9NUEMgICAgICBFMTAwMF9NUEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfU0NDICAgICAgRTEwMDBfU0NDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0VDT0wgICAgIEUxMDAwX0VDT0wKKyNkZWZpbmUgRTEwMDBfODI1NDJfTUNDICAgICAgRTEwMDBfTUNDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0xBVEVDT0wgIEUxMDAwX0xBVEVDT0wKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ09MQyAgICAgRTEwMDBfQ09MQworI2RlZmluZSBFMTAwMF84MjU0Ml9EQyAgICAgICBFMTAwMF9EQworI2RlZmluZSBFMTAwMF84MjU0Ml9UTkNSUyAgICBFMTAwMF9UTkNSUworI2RlZmluZSBFMTAwMF84MjU0Ml9TRUMgICAgICBFMTAwMF9TRUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ0VYVEVSUiAgRTEwMDBfQ0VYVEVSUgorI2RlZmluZSBFMTAwMF84MjU0Ml9STEVDICAgICBFMTAwMF9STEVDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1hPTlJYQyAgIEUxMDAwX1hPTlJYQworI2RlZmluZSBFMTAwMF84MjU0Ml9YT05UWEMgICBFMTAwMF9YT05UWEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfWE9GRlJYQyAgRTEwMDBfWE9GRlJYQworI2RlZmluZSBFMTAwMF84MjU0Ml9YT0ZGVFhDICBFMTAwMF9YT0ZGVFhDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDUlVDICAgIEUxMDAwX0ZDUlVDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzY0ICAgIEUxMDAwX1BSQzY0CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzEyNyAgIEUxMDAwX1BSQzEyNworI2RlZmluZSBFMTAwMF84MjU0Ml9QUkMyNTUgICBFMTAwMF9QUkMyNTUKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFJDNTExICAgRTEwMDBfUFJDNTExCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzEwMjMgIEUxMDAwX1BSQzEwMjMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFJDMTUyMiAgRTEwMDBfUFJDMTUyMgorI2RlZmluZSBFMTAwMF84MjU0Ml9HUFJDICAgICBFMTAwMF9HUFJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0JQUkMgICAgIEUxMDAwX0JQUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTVBSQyAgICAgRTEwMDBfTVBSQworI2RlZmluZSBFMTAwMF84MjU0Ml9HUFRDICAgICBFMTAwMF9HUFRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dPUkNMICAgIEUxMDAwX0dPUkNMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dPUkNIICAgIEUxMDAwX0dPUkNICisjZGVmaW5lIEUxMDAwXzgyNTQyX0dPVENMICAgIEUxMDAwX0dPVENMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dPVENIICAgIEUxMDAwX0dPVENICisjZGVmaW5lIEUxMDAwXzgyNTQyX1JOQkMgICAgIEUxMDAwX1JOQkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlVDICAgICAgRTEwMDBfUlVDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JGQyAgICAgIEUxMDAwX1JGQworI2RlZmluZSBFMTAwMF84MjU0Ml9ST0MgICAgICBFMTAwMF9ST0MKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkpDICAgICAgRTEwMDBfUkpDCisjZGVmaW5lIEUxMDAwXzgyNTQyX01HVFBSQyAgIEUxMDAwX01HVFBSQworI2RlZmluZSBFMTAwMF84MjU0Ml9NR1RQREMgICBFMTAwMF9NR1RQREMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTUdUUFRDICAgRTEwMDBfTUdUUFRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RPUkwgICAgIEUxMDAwX1RPUkwKKyNkZWZpbmUgRTEwMDBfODI1NDJfVE9SSCAgICAgRTEwMDBfVE9SSAorI2RlZmluZSBFMTAwMF84MjU0Ml9UT1RMICAgICBFMTAwMF9UT1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RPVEggICAgIEUxMDAwX1RPVEgKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFBSICAgICAgRTEwMDBfVFBSCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RQVCAgICAgIEUxMDAwX1RQVAorI2RlZmluZSBFMTAwMF84MjU0Ml9QVEM2NCAgICBFMTAwMF9QVEM2NAorI2RlZmluZSBFMTAwMF84MjU0Ml9QVEMxMjcgICBFMTAwMF9QVEMxMjcKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDMjU1ICAgRTEwMDBfUFRDMjU1CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BUQzUxMSAgIEUxMDAwX1BUQzUxMQorI2RlZmluZSBFMTAwMF84MjU0Ml9QVEMxMDIzICBFMTAwMF9QVEMxMDIzCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BUQzE1MjIgIEUxMDAwX1BUQzE1MjIKKyNkZWZpbmUgRTEwMDBfODI1NDJfTVBUQyAgICAgRTEwMDBfTVBUQworI2RlZmluZSBFMTAwMF84MjU0Ml9CUFRDICAgICBFMTAwMF9CUFRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RTQ1RDICAgIEUxMDAwX1RTQ1RDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RTQ1RGQyAgIEUxMDAwX1RTQ1RGQworI2RlZmluZSBFMTAwMF84MjU0Ml9SWENTVU0gICBFMTAwMF9SWENTVU0KKyNkZWZpbmUgRTEwMDBfODI1NDJfV1VDICAgICAgRTEwMDBfV1VDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1dVRkMgICAgIEUxMDAwX1dVRkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfV1VTICAgICAgRTEwMDBfV1VTCisjZGVmaW5lIEUxMDAwXzgyNTQyX01BTkMgICAgIEUxMDAwX01BTkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfSVBBViAgICAgRTEwMDBfSVBBVgorI2RlZmluZSBFMTAwMF84MjU0Ml9JUDRBVCAgICBFMTAwMF9JUDRBVAorI2RlZmluZSBFMTAwMF84MjU0Ml9JUDZBVCAgICBFMTAwMF9JUDZBVAorI2RlZmluZSBFMTAwMF84MjU0Ml9XVVBMICAgICBFMTAwMF9XVVBMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1dVUE0gICAgIEUxMDAwX1dVUE0KKyNkZWZpbmUgRTEwMDBfODI1NDJfRkZMVCAgICAgRTEwMDBfRkZMVAorI2RlZmluZSBFMTAwMF84MjU0Ml9UREZIICAgICAweDA4MDEwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RERlQgICAgIDB4MDgwMTgKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkZNVCAgICAgRTEwMDBfRkZNVAorI2RlZmluZSBFMTAwMF84MjU0Ml9GRlZUICAgICBFMTAwMF9GRlZUCisjZGVmaW5lIEUxMDAwXzgyNTQyX0hPU1RfSUYgIEUxMDAwX0hPU1RfSUYKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUFNICAgICAgICAgRTEwMDBfSUFNCisjZGVmaW5lIEUxMDAwXzgyNTQyX0VFTU5HQ1RMICAgIEUxMDAwX0VFTU5HQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BTUkNUTCAgICAgIEUxMDAwX1BTUkNUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9SQUlEICAgICAgICBFMTAwMF9SQUlECisjZGVmaW5lIEUxMDAwXzgyNTQyX1RBUkMwICAgICAgIEUxMDAwX1RBUkMwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1REQkFMMSAgICAgIEUxMDAwX1REQkFMMQorI2RlZmluZSBFMTAwMF84MjU0Ml9UREJBSDEgICAgICBFMTAwMF9UREJBSDEKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERMRU4xICAgICAgRTEwMDBfVERMRU4xCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RESDEgICAgICAgIEUxMDAwX1RESDEKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERUMSAgICAgICAgRTEwMDBfVERUMQorI2RlZmluZSBFMTAwMF84MjU0Ml9UWERDVEwxICAgICBFMTAwMF9UWERDVEwxCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RBUkMxICAgICAgIEUxMDAwX1RBUkMxCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JGQ1RMICAgICAgIEUxMDAwX1JGQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dDUiAgICAgICAgIEUxMDAwX0dDUgorI2RlZmluZSBFMTAwMF84MjU0Ml9HU0NMXzEgICAgICBFMTAwMF9HU0NMXzEKKyNkZWZpbmUgRTEwMDBfODI1NDJfR1NDTF8yICAgICAgRTEwMDBfR1NDTF8yCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dTQ0xfMyAgICAgIEUxMDAwX0dTQ0xfMworI2RlZmluZSBFMTAwMF84MjU0Ml9HU0NMXzQgICAgICBFMTAwMF9HU0NMXzQKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkFDVFBTICAgICAgRTEwMDBfRkFDVFBTCisjZGVmaW5lIEUxMDAwXzgyNTQyX1NXU00gICAgICAgIEUxMDAwX1NXU00KKyNkZWZpbmUgRTEwMDBfODI1NDJfRldTTSAgICAgICAgRTEwMDBfRldTTQorI2RlZmluZSBFMTAwMF84MjU0Ml9GRkxUX0RCRyAgICBFMTAwMF9GRkxUX0RCRworI2RlZmluZSBFMTAwMF84MjU0Ml9JQUMgICAgICAgICBFMTAwMF9JQUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUNSWFBUQyAgICAgRTEwMDBfSUNSWFBUQworI2RlZmluZSBFMTAwMF84MjU0Ml9JQ1JYQVRDICAgICBFMTAwMF9JQ1JYQVRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDVFhQVEMgICAgIEUxMDAwX0lDVFhQVEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUNUWEFUQyAgICAgRTEwMDBfSUNUWEFUQworI2RlZmluZSBFMTAwMF84MjU0Ml9JQ1RYUUVDICAgICBFMTAwMF9JQ1RYUUVDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDVFhRTVRDICAgIEUxMDAwX0lDVFhRTVRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDUlhETVRDICAgIEUxMDAwX0lDUlhETVRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDUlhPQyAgICAgIEUxMDAwX0lDUlhPQworI2RlZmluZSBFMTAwMF84MjU0Ml9ISUNSICAgICAgICBFMTAwMF9ISUNSCisKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ1BVVkVDICAgICAgRTEwMDBfQ1BVVkVDCisjZGVmaW5lIEUxMDAwXzgyNTQyX01SUUMgICAgICAgIEUxMDAwX01SUUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkVUQSAgICAgICAgRTEwMDBfUkVUQQorI2RlZmluZSBFMTAwMF84MjU0Ml9SU1NSSyAgICAgICBFMTAwMF9SU1NSSworI2RlZmluZSBFMTAwMF84MjU0Ml9SU1NJTSAgICAgICBFMTAwMF9SU1NJTQorI2RlZmluZSBFMTAwMF84MjU0Ml9SU1NJUiAgICAgICBFMTAwMF9SU1NJUgorI2RlZmluZSBFMTAwMF84MjU0Ml9LVU1DVFJMU1RBIEUxMDAwX0tVTUNUUkxTVEEKKyNkZWZpbmUgRTEwMDBfODI1NDJfU1dfRldfU1lOQyBFMTAwMF9TV19GV19TWU5DCisjZGVmaW5lIEUxMDAwXzgyNTQyX01BTkMySCAgICAgIEUxMDAwX01BTkMySAorCisvKiBTdGF0aXN0aWNzIGNvdW50ZXJzIGNvbGxlY3RlZCBieSB0aGUgTUFDICovCitzdHJ1Y3QgZTEwMDBfaHdfc3RhdHMgeworCXVpbnQ2NF90CQljcmNlcnJzOworCXVpbnQ2NF90CQlhbGduZXJyYzsKKwl1aW50NjRfdAkJc3ltZXJyczsKKwl1aW50NjRfdAkJcnhlcnJjOworCXVpbnQ2NF90CQl0eGVycmM7CisJdWludDY0X3QJCW1wYzsKKwl1aW50NjRfdAkJc2NjOworCXVpbnQ2NF90CQllY29sOworCXVpbnQ2NF90CQltY2M7CisJdWludDY0X3QJCWxhdGVjb2w7CisJdWludDY0X3QJCWNvbGM7CisJdWludDY0X3QJCWRjOworCXVpbnQ2NF90CQl0bmNyczsKKwl1aW50NjRfdAkJc2VjOworCXVpbnQ2NF90CQljZXh0ZXJyOworCXVpbnQ2NF90CQlybGVjOworCXVpbnQ2NF90CQl4b25yeGM7CisJdWludDY0X3QJCXhvbnR4YzsKKwl1aW50NjRfdAkJeG9mZnJ4YzsKKwl1aW50NjRfdAkJeG9mZnR4YzsKKwl1aW50NjRfdAkJZmNydWM7CisJdWludDY0X3QJCXByYzY0OworCXVpbnQ2NF90CQlwcmMxMjc7CisJdWludDY0X3QJCXByYzI1NTsKKwl1aW50NjRfdAkJcHJjNTExOworCXVpbnQ2NF90CQlwcmMxMDIzOworCXVpbnQ2NF90CQlwcmMxNTIyOworCXVpbnQ2NF90CQlncHJjOworCXVpbnQ2NF90CQlicHJjOworCXVpbnQ2NF90CQltcHJjOworCXVpbnQ2NF90CQlncHRjOworCXVpbnQ2NF90CQlnb3JjbDsKKwl1aW50NjRfdAkJZ29yY2g7CisJdWludDY0X3QJCWdvdGNsOworCXVpbnQ2NF90CQlnb3RjaDsKKwl1aW50NjRfdAkJcm5iYzsKKwl1aW50NjRfdAkJcnVjOworCXVpbnQ2NF90CQlyZmM7CisJdWludDY0X3QJCXJvYzsKKwl1aW50NjRfdAkJcmxlcnJjOworCXVpbnQ2NF90CQlyamM7CisJdWludDY0X3QJCW1ncHJjOworCXVpbnQ2NF90CQltZ3BkYzsKKwl1aW50NjRfdAkJbWdwdGM7CisJdWludDY0X3QJCXRvcmw7CisJdWludDY0X3QJCXRvcmg7CisJdWludDY0X3QJCXRvdGw7CisJdWludDY0X3QJCXRvdGg7CisJdWludDY0X3QJCXRwcjsKKwl1aW50NjRfdAkJdHB0OworCXVpbnQ2NF90CQlwdGM2NDsKKwl1aW50NjRfdAkJcHRjMTI3OworCXVpbnQ2NF90CQlwdGMyNTU7CisJdWludDY0X3QJCXB0YzUxMTsKKwl1aW50NjRfdAkJcHRjMTAyMzsKKwl1aW50NjRfdAkJcHRjMTUyMjsKKwl1aW50NjRfdAkJbXB0YzsKKwl1aW50NjRfdAkJYnB0YzsKKwl1aW50NjRfdAkJdHNjdGM7CisJdWludDY0X3QJCXRzY3RmYzsKKwl1aW50NjRfdAkJaWFjOworCXVpbnQ2NF90CQlpY3J4cHRjOworCXVpbnQ2NF90CQlpY3J4YXRjOworCXVpbnQ2NF90CQlpY3R4cHRjOworCXVpbnQ2NF90CQlpY3R4YXRjOworCXVpbnQ2NF90CQlpY3R4cWVjOworCXVpbnQ2NF90CQlpY3R4cW10YzsKKwl1aW50NjRfdAkJaWNyeGRtdGM7CisJdWludDY0X3QJCWljcnhvYzsKK307CisKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgY29kZSAoZTEwMDBfaHcuYykgKi8KK3N0cnVjdCBlMTAwMF9odyB7CisJdWludDhfdAkJCSpod19hZGRyOworCXVpbnQ4X3QJCQkqZmxhc2hfYWRkcmVzczsKKwllMTAwMF9tYWNfdHlwZQkJbWFjX3R5cGU7CisJZTEwMDBfcGh5X3R5cGUJCXBoeV90eXBlOworCXVpbnQzMl90CQlwaHlfaW5pdF9zY3JpcHQ7CisJZTEwMDBfbWVkaWFfdHlwZQltZWRpYV90eXBlOworCXZvaWQJCQkqYmFjazsKKwlzdHJ1Y3QgZTEwMDBfc2hhZG93X3JhbQkqZWVwcm9tX3NoYWRvd19yYW07CisJdWludDMyX3QJCWZsYXNoX2Jhbmtfc2l6ZTsKKwl1aW50MzJfdAkJZmxhc2hfYmFzZV9hZGRyOworCWUxMDAwX2ZjX3R5cGUJCWZjOworCWUxMDAwX2J1c19zcGVlZAkJYnVzX3NwZWVkOworCWUxMDAwX2J1c193aWR0aAkJYnVzX3dpZHRoOworCWUxMDAwX2J1c190eXBlCQlidXNfdHlwZTsKKwlzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gZWVwcm9tOworCWUxMDAwX21zX3R5cGUJCW1hc3Rlcl9zbGF2ZTsKKwllMTAwMF9tc190eXBlCQlvcmlnaW5hbF9tYXN0ZXJfc2xhdmU7CisJZTEwMDBfZmZlX2NvbmZpZwlmZmVfY29uZmlnX3N0YXRlOworCXVpbnQzMl90CQlhc2ZfZmlybXdhcmVfcHJlc2VudDsKKwl1aW50MzJfdAkJZWVwcm9tX3NlbWFwaG9yZV9wcmVzZW50OworCXVpbnQzMl90CQlzd2Z3X3N5bmNfcHJlc2VudDsKKwl1aW50MzJfdAkJc3dmd2h3X3NlbWFwaG9yZV9wcmVzZW50OworCXVuc2lnbmVkIGxvbmcJCWlvX2Jhc2U7CisJdWludDMyX3QJCXBoeV9pZDsKKwl1aW50MzJfdAkJcGh5X3JldmlzaW9uOworCXVpbnQzMl90CQlwaHlfYWRkcjsKKwl1aW50MzJfdAkJb3JpZ2luYWxfZmM7CisJdWludDMyX3QJCXR4Y3c7CisJdWludDMyX3QJCWF1dG9uZWdfZmFpbGVkOworCXVpbnQzMl90CQltYXhfZnJhbWVfc2l6ZTsKKwl1aW50MzJfdAkJbWluX2ZyYW1lX3NpemU7CisJdWludDMyX3QJCW1jX2ZpbHRlcl90eXBlOworCXVpbnQzMl90CQludW1fbWNfYWRkcnM7CisJdWludDMyX3QJCWNvbGxpc2lvbl9kZWx0YTsKKwl1aW50MzJfdAkJdHhfcGFja2V0X2RlbHRhOworCXVpbnQzMl90CQlsZWRjdGxfZGVmYXVsdDsKKwl1aW50MzJfdAkJbGVkY3RsX21vZGUxOworCXVpbnQzMl90CQlsZWRjdGxfbW9kZTI7CisJYm9vbGVhbl90CQl0eF9wa3RfZmlsdGVyaW5nOworCXN0cnVjdCBlMTAwMF9ob3N0X21uZ19kaGNwX2Nvb2tpZSBtbmdfY29va2llOworCXVpbnQxNl90CQlwaHlfc3BkX2RlZmF1bHQ7CisJdWludDE2X3QJCWF1dG9uZWdfYWR2ZXJ0aXNlZDsKKwl1aW50MTZfdAkJcGNpX2NtZF93b3JkOworCXVpbnQxNl90CQlmY19oaWdoX3dhdGVyOworCXVpbnQxNl90CQlmY19sb3dfd2F0ZXI7CisJdWludDE2X3QJCWZjX3BhdXNlX3RpbWU7CisJdWludDE2X3QJCWN1cnJlbnRfaWZzX3ZhbDsKKwl1aW50MTZfdAkJaWZzX21pbl92YWw7CisJdWludDE2X3QJCWlmc19tYXhfdmFsOworCXVpbnQxNl90CQlpZnNfc3RlcF9zaXplOworCXVpbnQxNl90CQlpZnNfcmF0aW87CisJdWludDE2X3QJCWRldmljZV9pZDsKKwl1aW50MTZfdAkJdmVuZG9yX2lkOworCXVpbnQxNl90CQlzdWJzeXN0ZW1faWQ7CisJdWludDE2X3QJCXN1YnN5c3RlbV92ZW5kb3JfaWQ7CisJdWludDhfdAkJCXJldmlzaW9uX2lkOworCXVpbnQ4X3QJCQlhdXRvbmVnOworCXVpbnQ4X3QJCQltZGl4OworCXVpbnQ4X3QJCQlmb3JjZWRfc3BlZWRfZHVwbGV4OworCXVpbnQ4X3QJCQl3YWl0X2F1dG9uZWdfY29tcGxldGU7CisJdWludDhfdAkJCWRtYV9mYWlybmVzczsKKwl1aW50OF90CQkJbWFjX2FkZHJbTk9ERV9BRERSRVNTX1NJWkVdOworCXVpbnQ4X3QJCQlwZXJtX21hY19hZGRyW05PREVfQUREUkVTU19TSVpFXTsKKwlib29sZWFuX3QJCWRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbjsKKwlib29sZWFuX3QJCXNwZWVkX2Rvd25ncmFkZWQ7CisJZTEwMDBfc21hcnRfc3BlZWQJc21hcnRfc3BlZWQ7CisJZTEwMDBfZHNwX2NvbmZpZwlkc3BfY29uZmlnX3N0YXRlOworCWJvb2xlYW5fdAkJZ2V0X2xpbmtfc3RhdHVzOworCWJvb2xlYW5fdAkJc2VyZGVzX2xpbmtfZG93bjsKKwlib29sZWFuX3QJCXRiaV9jb21wYXRpYmlsaXR5X2VuOworCWJvb2xlYW5fdAkJdGJpX2NvbXBhdGliaWxpdHlfb247CisJYm9vbGVhbl90CQlsYWFfaXNfcHJlc2VudDsKKwlib29sZWFuX3QJCXBoeV9yZXNldF9kaXNhYmxlOworCWJvb2xlYW5fdAkJaW5pdGlhbGl6ZV9od19iaXRzX2Rpc2FibGU7CisJYm9vbGVhbl90CQlmY19zZW5kX3hvbjsKKwlib29sZWFuX3QJCWZjX3N0cmljdF9pZWVlOworCWJvb2xlYW5fdAkJcmVwb3J0X3R4X2Vhcmx5OworCWJvb2xlYW5fdAkJYWRhcHRpdmVfaWZzOworCWJvb2xlYW5fdAkJaWZzX3BhcmFtc19mb3JjZWQ7CisJYm9vbGVhbl90CQlpbl9pZnNfbW9kZTsKKwlib29sZWFuX3QJCW1uZ19yZWdfYWNjZXNzX2Rpc2FibGVkOworCWJvb2xlYW5fdAkJbGVhdmVfYXZfYml0X29mZjsKKwlib29sZWFuX3QJCWttcm5fbG9ja19sb3NzX3dvcmthcm91bmRfZGlzYWJsZWQ7CisJYm9vbGVhbl90CQliYWRfdHhfY2Fycl9zdGF0c19mZDsKKwlib29sZWFuX3QJCWhhc19tYW5jMmg7CisJYm9vbGVhbl90CQlyeF9uZWVkc19raWNraW5nOworCWJvb2xlYW5fdAkJaGFzX3NtYnVzOworfTsKKworCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9TV0RQSU4wICAgMHgwMDAxICAgLyogU1dEUElOIDAgRUVQUk9NIFZhbHVlICovCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9MRURfTE9HSUMgMHgwMDIwICAgLyogTGVkIExvZ2ljIFdvcmQgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX1JXX1JFR19EQVRBICAgMTYgICAvKiBPZmZzZXQgdG8gZGF0YSBpbiBFRVBST00gcmVhZC93cml0ZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX1JXX1JFR19ET05FICAgMiAgICAvKiBPZmZzZXQgdG8gUkVBRC9XUklURSBkb25lIGJpdCAqLworI2RlZmluZSBFMTAwMF9FRVBST01fUldfUkVHX1NUQVJUICAxICAgIC8qIEZpcnN0IGJpdCBmb3IgdGVsbGluZyBwYXJ0IHRvIHN0YXJ0IG9wZXJhdGlvbiAqLworI2RlZmluZSBFMTAwMF9FRVBST01fUldfQUREUl9TSElGVCAyICAgIC8qIFNoaWZ0IHRvIHRoZSBhZGRyZXNzIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX1BPTExfV1JJVEUgICAgMSAgICAvKiBGbGFnIGZvciBwb2xsaW5nIGZvciB3cml0ZSBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9FRVBST01fUE9MTF9SRUFEICAgICAwICAgIC8qIEZsYWcgZm9yIHBvbGxpbmcgZm9yIHJlYWQgY29tcGxldGUgKi8KKy8qIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworLyogRGV2aWNlIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9GRCAgICAgICAweDAwMDAwMDAxICAvKiBGdWxsIGR1cGxleC4wPWhhbGY7IDE9ZnVsbCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0JFTSAgICAgIDB4MDAwMDAwMDIgIC8qIEVuZGlhbiBNb2RlLjA9bGl0dGxlLDE9YmlnICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUFJJT1IgICAgMHgwMDAwMDAwNCAgLyogUHJpb3JpdHkgb24gUENJLiAwPXJ4LDE9ZmFpciAqLworI2RlZmluZSBFMTAwMF9DVFJMX0dJT19NQVNURVJfRElTQUJMRSAweDAwMDAwMDA0IC8qQmxvY2tzIG5ldyBNYXN0ZXIgcmVxdWVzdHMgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9MUlNUICAgICAweDAwMDAwMDA4ICAvKiBMaW5rIHJlc2V0LiAwPW5vcm1hbCwxPXJlc2V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfVE1FICAgICAgMHgwMDAwMDAxMCAgLyogVGVzdCBtb2RlLiAwPW5vcm1hbCwxPXRlc3QgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TTEUgICAgICAweDAwMDAwMDIwICAvKiBTZXJpYWwgTGluayBvbiAwPWRpcywxPWVuICovCisjZGVmaW5lIEUxMDAwX0NUUkxfQVNERSAgICAgMHgwMDAwMDAyMCAgLyogQXV0by1zcGVlZCBkZXRlY3QgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU0xVICAgICAgMHgwMDAwMDA0MCAgLyogU2V0IGxpbmsgdXAgKEZvcmNlIExpbmspICovCisjZGVmaW5lIEUxMDAwX0NUUkxfSUxPUyAgICAgMHgwMDAwMDA4MCAgLyogSW52ZXJ0IExvc3MtT2YgU2lnbmFsICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1BEX1NFTCAgMHgwMDAwMDMwMCAgLyogU3BlZWQgU2VsZWN0IE1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAgICAweDAwMDAwMDAwICAvKiBGb3JjZSAxME1iICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1BEXzEwMCAgMHgwMDAwMDEwMCAgLyogRm9yY2UgMTAwTWIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAwMCAweDAwMDAwMjAwICAvKiBGb3JjZSAxR2IgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9CRU0zMiAgICAweDAwMDAwNDAwICAvKiBCaWcgRW5kaWFuIDMyIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9GUkNTUEQgICAweDAwMDAwODAwICAvKiBGb3JjZSBTcGVlZCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0ZSQ0RQWCAgIDB4MDAwMDEwMDAgIC8qIEZvcmNlIER1cGxleCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0RfVURfRU4gIDB4MDAwMDIwMDAgIC8qIERvY2svVW5kb2NrIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0RfVURfUE9MQVJJVFkgMHgwMDAwNDAwMCAvKiBEZWZpbmVkIHBvbGFyaXR5IG9mIERvY2svVW5kb2NrIGluZGljYXRpb24gaW4gU0RQWzBdICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRk9SQ0VfUEhZX1JFU0VUIDB4MDAwMDgwMDAgLyogUmVzZXQgYm90aCBQSFkgcG9ydHMsIHRocm91Z2ggUEhZUlNUX04gcGluICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfRU4gMHgwMDAxMDAwMCAvKiBlbmFibGUgbGluayBzdGF0dXMgZnJvbSBleHRlcm5hbCBMSU5LXzAgYW5kIExJTktfMSBwaW5zICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMCAgMHgwMDA0MDAwMCAgLyogU1dEUElOIDAgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4xICAweDAwMDgwMDAwICAvKiBTV0RQSU4gMSB2YWx1ZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjIgIDB4MDAxMDAwMDAgIC8qIFNXRFBJTiAyIHZhbHVlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMyAgMHgwMDIwMDAwMCAgLyogU1dEUElOIDMgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU8wICAweDAwNDAwMDAwICAvKiBTV0RQSU4gMCBJbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU8xICAweDAwODAwMDAwICAvKiBTV0RQSU4gMSBpbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU8yICAweDAxMDAwMDAwICAvKiBTV0RQSU4gMiBpbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU8zICAweDAyMDAwMDAwICAvKiBTV0RQSU4gMyBpbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9SU1QgICAgICAweDA0MDAwMDAwICAvKiBHbG9iYWwgcmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9SRkNFICAgICAweDA4MDAwMDAwICAvKiBSZWNlaXZlIEZsb3cgQ29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9URkNFICAgICAweDEwMDAwMDAwICAvKiBUcmFuc21pdCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUlRFICAgICAgMHgyMDAwMDAwMCAgLyogUm91dGluZyB0YWcgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfVk1FICAgICAgMHg0MDAwMDAwMCAgLyogSUVFRSBWTEFOIG1vZGUgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUEhZX1JTVCAgMHg4MDAwMDAwMCAgLyogUEhZIFJlc2V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1cyRldfSU5UIDB4MDIwMDAwMDAgIC8qIEluaXRpYXRlIGFuIGludGVycnVwdCB0byBtYW5hZ2VhYmlsaXR5IGVuZ2luZSAqLworCisvKiBEZXZpY2UgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GRCAgICAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBGdWxsIGR1cGxleC4wPWhhbGYsMT1mdWxsICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19MVSAgICAgICAgIDB4MDAwMDAwMDIgICAgICAvKiBMaW5rIHVwLjA9bm8sMT1saW5rICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DX01BU0sgIDB4MDAwMDAwMEMgICAgICAvKiBQQ0kgRnVuY3Rpb24gTWFzayAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfRlVOQ19TSElGVCAyCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DXzAgICAgIDB4MDAwMDAwMDAgICAgICAvKiBGdW5jdGlvbiAwICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DXzEgICAgIDB4MDAwMDAwMDQgICAgICAvKiBGdW5jdGlvbiAxICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19UWE9GRiAgICAgIDB4MDAwMDAwMTAgICAgICAvKiB0cmFuc21pc3Npb24gcGF1c2VkICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19UQklNT0RFICAgIDB4MDAwMDAwMjAgICAgICAvKiBUQkkgbW9kZSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfTUFTSyAweDAwMDAwMEMwCisjZGVmaW5lIEUxMDAwX1NUQVRVU19TUEVFRF8xMCAgIDB4MDAwMDAwMDAgICAgICAvKiBTcGVlZCAxME1iL3MgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMCAgMHgwMDAwMDA0MCAgICAgIC8qIFNwZWVkIDEwME1iL3MgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMDAgMHgwMDAwMDA4MCAgICAgIC8qIFNwZWVkIDEwMDBNYi9zICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19MQU5fSU5JVF9ET05FIDB4MDAwMDAyMDAgICAvKiBMYW4gSW5pdCBDb21wbGV0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBFRVBST00vRmxhc2ggKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0FTRFYgICAgICAgMHgwMDAwMDMwMCAgICAgIC8qIEF1dG8gc3BlZWQgZGV0ZWN0IHZhbHVlICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19ET0NLX0NJICAgIDB4MDAwMDA4MDAgICAgICAvKiBDaGFuZ2UgaW4gRG9jay9VbmRvY2sgc3RhdGUuIENsZWFyIG9uIHdyaXRlICcwJy4gKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0dJT19NQVNURVJfRU5BQkxFIDB4MDAwODAwMDAgLyogU3RhdHVzIG9mIE1hc3RlciByZXF1ZXN0cy4gKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX01UWENLT0sgICAgMHgwMDAwMDQwMCAgICAgIC8qIE1UWCBjbG9jayBydW5uaW5nIE9LICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0k2NiAgICAgIDB4MDAwMDA4MDAgICAgICAvKiBJbiA2Nk1oeiBzbG90ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CVVM2NCAgICAgIDB4MDAwMDEwMDAgICAgICAvKiBJbiA2NCBiaXQgc2xvdCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9NT0RFICAweDAwMDAyMDAwICAgICAgLyogUENJLVggbW9kZSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRCAweDAwMDBDMDAwICAgICAgLyogUENJLVggYnVzIHNwZWVkICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CTUNfU0tVXzAgIDB4MDAxMDAwMDAgLyogQk1DIFVTQiByZWRpcmVjdCBkaXNhYmxlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfQk1DX1NLVV8xICAweDAwMjAwMDAwIC8qIEJNQyBTUkFNIGRpc2FibGVkICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CTUNfU0tVXzIgIDB4MDA0MDAwMDAgLyogQk1DIFNEUkFNIGRpc2FibGVkICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CTUNfQ1JZUFRPIDB4MDA4MDAwMDAgLyogQk1DIGNyeXB0byBkaXNhYmxlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfQk1DX0xJVEUgICAweDAxMDAwMDAwIC8qIEJNQyBleHRlcm5hbCBjb2RlIGV4ZWN1dGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUkdNSUlfRU5BQkxFIDB4MDIwMDAwMDAgLyogUkdNSUkgZGlzYWJsZWQgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZVU0VfOCAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GVVNFXzkgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBFMTAwMF9TVEFUVVNfU0VSREVTMF9ESVMgIDB4MTAwMDAwMDAgLyogU0VSREVTIGRpc2FibGVkIG9uIHBvcnQgMCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU0VSREVTMV9ESVMgIDB4MjAwMDAwMDAgLyogU0VSREVTIGRpc2FibGVkIG9uIHBvcnQgMSAqLworCisvKiBDb25zdGFudHMgdXNlZCB0byBpbnRyZXByZXQgdGhlIG1hc2tlZCBQQ0ktWCBidXMgc3BlZWQuICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzY2ICAweDAwMDAwMDAwIC8qIFBDSS1YIGJ1cyBzcGVlZCAgNTAtNjYgTUh6ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEwMCAweDAwMDA0MDAwIC8qIFBDSS1YIGJ1cyBzcGVlZCAgNjYtMTAwIE1IeiAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRF8xMzMgMHgwMDAwODAwMCAvKiBQQ0ktWCBidXMgc3BlZWQgMTAwLTEzMyBNSHogKi8KKworLyogRUVQUk9NL0ZsYXNoIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9TSyAgICAgICAgMHgwMDAwMDAwMSAvKiBFRVBST00gQ2xvY2sgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9DUyAgICAgICAgMHgwMDAwMDAwMiAvKiBFRVBST00gQ2hpcCBTZWxlY3QgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9ESSAgICAgICAgMHgwMDAwMDAwNCAvKiBFRVBST00gRGF0YSBJbiAqLworI2RlZmluZSBFMTAwMF9FRUNEX0RPICAgICAgICAweDAwMDAwMDA4IC8qIEVFUFJPTSBEYXRhIE91dCAqLworI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9NQVNLICAweDAwMDAwMDMwCisjZGVmaW5lIEUxMDAwX0VFQ0RfRldFX0RJUyAgIDB4MDAwMDAwMTAgLyogRGlzYWJsZSBGTEFTSCB3cml0ZXMgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9GV0VfRU4gICAgMHgwMDAwMDAyMCAvKiBFbmFibGUgRkxBU0ggd3JpdGVzICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRldFX1NISUZUIDQKKyNkZWZpbmUgRTEwMDBfRUVDRF9SRVEgICAgICAgMHgwMDAwMDA0MCAvKiBFRVBST00gQWNjZXNzIFJlcXVlc3QgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9HTlQgICAgICAgMHgwMDAwMDA4MCAvKiBFRVBST00gQWNjZXNzIEdyYW50ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfUFJFUyAgICAgIDB4MDAwMDAxMDAgLyogRUVQUk9NIFByZXNlbnQgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9TSVpFICAgICAgMHgwMDAwMDIwMCAvKiBFRVBST00gU2l6ZSAoMD02NCB3b3JkIDE9MjU2IHdvcmQpICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfQUREUl9CSVRTIDB4MDAwMDA0MDAgLyogRUVQUk9NIEFkZHJlc3NpbmcgYml0cyBiYXNlZCBvbiB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKDAtc21hbGwsIDEtbGFyZ2UpICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfVFlQRSAgICAgIDB4MDAwMDIwMDAgLyogRUVQUk9NIFR5cGUgKDEtU1BJLCAwLU1pY3Jvd2lyZSkgKi8KKyNpZm5kZWYgRTEwMDBfRUVQUk9NX0dSQU5UX0FUVEVNUFRTCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9HUkFOVF9BVFRFTVBUUyAxMDAwIC8qIEVFUFJPTSAjIGF0dGVtcHRzIHRvIGdhaW4gZ3JhbnQgKi8KKyNlbmRpZgorI2RlZmluZSBFMTAwMF9FRUNEX0FVVE9fUkQgICAgICAgICAgMHgwMDAwMDIwMCAgLyogRUVQUk9NIEF1dG8gUmVhZCBkb25lICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0laRV9FWF9NQVNLICAgICAweDAwMDA3ODAwICAvKiBFRXByb20gU2l6ZSAqLworI2RlZmluZSBFMTAwMF9FRUNEX1NJWkVfRVhfU0hJRlQgICAgMTEKKyNkZWZpbmUgRTEwMDBfRUVDRF9OVkFERFMgICAgMHgwMDAxODAwMCAvKiBOVk0gQWRkcmVzcyBTaXplICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0VMU0hBRCAgIDB4MDAwMjAwMDAgLyogU2VsZWN0IFNoYWRvdyBSQU0gKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9JTklUU1JBTSAgMHgwMDA0MDAwMCAvKiBJbml0aWFsaXplIFNoYWRvdyBSQU0gKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9GTFVQRCAgICAgMHgwMDA4MDAwMCAvKiBVcGRhdGUgRkxBU0ggKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9BVVBERU4gICAgMHgwMDEwMDAwMCAvKiBFbmFibGUgQXV0b25vbW91cyBGTEFTSCB1cGRhdGUgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9TSEFEViAgICAgMHgwMDIwMDAwMCAvKiBTaGFkb3cgUkFNIERhdGEgVmFsaWQgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9TRUMxVkFMICAgMHgwMDQwMDAwMCAvKiBTZWN0b3IgT25lIFZhbGlkICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0VDVkFMX1NISUZUICAgICAgMjIKKyNkZWZpbmUgRTEwMDBfU1RNX09QQ09ERSAgICAgMHhEQjAwCisjZGVmaW5lIEUxMDAwX0hJQ1JfRldfUkVTRVQgIDB4QzAKKworI2RlZmluZSBFMTAwMF9TSEFET1dfUkFNX1dPUkRTICAgICAyMDQ4CisjZGVmaW5lIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQgICAgIDB4MTMKKyNkZWZpbmUgRTEwMDBfSUNIX05WTV9TSUdfTUFTSyAgICAgMHhDMAorCisvKiBFRVBST00gUmVhZCAqLworI2RlZmluZSBFMTAwMF9FRVJEX1NUQVJUICAgICAgMHgwMDAwMDAwMSAvKiBTdGFydCBSZWFkICovCisjZGVmaW5lIEUxMDAwX0VFUkRfRE9ORSAgICAgICAweDAwMDAwMDEwIC8qIFJlYWQgRG9uZSAqLworI2RlZmluZSBFMTAwMF9FRVJEX0FERFJfU0hJRlQgOAorI2RlZmluZSBFMTAwMF9FRVJEX0FERFJfTUFTSyAgMHgwMDAwRkYwMCAvKiBSZWFkIEFkZHJlc3MgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRF9EQVRBX1NISUZUIDE2CisjZGVmaW5lIEUxMDAwX0VFUkRfREFUQV9NQVNLICAweEZGRkYwMDAwIC8qIFJlYWQgRGF0YSAqLworCisvKiBTUEkgRUVQUk9NIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBFRVBST01fU1RBVFVTX1JEWV9TUEkgIDB4MDEKKyNkZWZpbmUgRUVQUk9NX1NUQVRVU19XRU5fU1BJICAweDAyCisjZGVmaW5lIEVFUFJPTV9TVEFUVVNfQlAwX1NQSSAgMHgwNAorI2RlZmluZSBFRVBST01fU1RBVFVTX0JQMV9TUEkgIDB4MDgKKyNkZWZpbmUgRUVQUk9NX1NUQVRVU19XUEVOX1NQSSAweDgwCisKKy8qIEV4dGVuZGVkIERldmljZSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0dQSTBfRU4gICAweDAwMDAwMDAxIC8qIE1hcHMgU0RQNCB0byBHUEkwICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0dQSTFfRU4gICAweDAwMDAwMDAyIC8qIE1hcHMgU0RQNSB0byBHUEkxICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1BIWUlOVF9FTiBFMTAwMF9DVFJMX0VYVF9HUEkxX0VOCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0dQSTJfRU4gICAweDAwMDAwMDA0IC8qIE1hcHMgU0RQNiB0byBHUEkyICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0dQSTNfRU4gICAweDAwMDAwMDA4IC8qIE1hcHMgU0RQNyB0byBHUEkzICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDRfREFUQSAweDAwMDAwMDEwIC8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNV9EQVRBIDB4MDAwMDAwMjAgLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9QSFlfSU5UICAgRTEwMDBfQ1RSTF9FWFRfU0RQNV9EQVRBCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDZfREFUQSAweDAwMDAwMDQwIC8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDYgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQN19EQVRBIDB4MDAwMDAwODAgLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RJUiAgMHgwMDAwMDEwMCAvKiBEaXJlY3Rpb24gb2YgU0RQNCAwPWluIDE9b3V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDVfRElSICAweDAwMDAwMjAwIC8qIERpcmVjdGlvbiBvZiBTRFA1IDA9aW4gMT1vdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNl9ESVIgIDB4MDAwMDA0MDAgLyogRGlyZWN0aW9uIG9mIFNEUDYgMD1pbiAxPW91dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA3X0RJUiAgMHgwMDAwMDgwMCAvKiBEaXJlY3Rpb24gb2YgU0RQNyAwPWluIDE9b3V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0FTRENISyAgICAweDAwMDAxMDAwIC8qIEluaXRpYXRlIGFuIEFTRCBzZXF1ZW5jZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9FRV9SU1QgICAgMHgwMDAwMjAwMCAvKiBSZWluaXRpYWxpemUgZnJvbSBFRVBST00gKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfSVBTICAgICAgIDB4MDAwMDQwMDAgLyogSW52ZXJ0IFBvd2VyIFN0YXRlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NQRF9CWVBTICAweDAwMDA4MDAwIC8qIFNwZWVkIFNlbGVjdCBCeXBhc3MgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUk9fRElTICAgIDB4MDAwMjAwMDAgLyogUmVsYXhlZCBPcmRlcmluZyBkaXNhYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9NQVNLIDB4MDBDMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX0dNSUkgMHgwMDAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfVEJJICAweDAwQzAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9LTVJOIDB4MDAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX1NFUkRFUyAgMHgwMEMwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfU0dNSUkgICAweDAwODAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLX01BU0sgIDB4MDMwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfMjU2ICAgMHgwMDAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9XUl9XTUFSS18zMjAgICAweDAxMDAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLXzM4NCAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfNDQ4ICAgMHgwMzAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9EUlZfTE9BRCAgICAgICAweDEwMDAwMDAwIC8qIERyaXZlciBsb2FkZWQgYml0IGZvciBGVyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9JQU1FICAgICAgICAgICAweDA4MDAwMDAwIC8qIEludGVycnVwdCBhY2tub3dsZWRnZSBBdXRvLW1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfSU5UX1RJTUVSX0NMUiAgMHgyMDAwMDAwMCAvKiBDbGVhciBJbnRlcnJ1cHQgdGltZXJzIGFmdGVyIElNUyBjbGVhciAqLworI2RlZmluZSBFMTAwMF9DUlRMX0VYVF9QQl9QQVJFTiAgICAgICAweDAxMDAwMDAwIC8qIHBhY2tldCBidWZmZXIgcGFyaXR5IGVycm9yIGRldGVjdGlvbiBlbmFibGVkICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0RGX1BBUkVOICAgICAgIDB4MDIwMDAwMDAgLyogZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciBkZXRlY3Rpb24gZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0dIT1NUX1BBUkVOICAgIDB4NDAwMDAwMDAKKworLyogTURJIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfTURJQ19EQVRBX01BU0sgMHgwMDAwRkZGRgorI2RlZmluZSBFMTAwMF9NRElDX1JFR19NQVNLICAweDAwMUYwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfUkVHX1NISUZUIDE2CisjZGVmaW5lIEUxMDAwX01ESUNfUEhZX01BU0sgIDB4MDNFMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19QSFlfU0hJRlQgMjEKKyNkZWZpbmUgRTEwMDBfTURJQ19PUF9XUklURSAgMHgwNDAwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX09QX1JFQUQgICAweDA4MDAwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfUkVBRFkgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19JTlRfRU4gICAgMHgyMDAwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX0VSUk9SICAgICAweDQwMDAwMDAwCisKKyNkZWZpbmUgRTEwMDBfS1VNQ1RSTFNUQV9NQVNLICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUICAgICAgICAgMHgwMDFGMDAwMAorI2RlZmluZSBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVF9TSElGVCAgIDE2CisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfUkVOICAgICAgICAgICAgMHgwMDIwMDAwMAorCisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUX0ZJRk9fQ1RSTCAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfS1VNQ1RSTFNUQV9PRkZTRVRfQ1RSTCAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVF9JTkJfQ1RSTCAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUX0RJQUcgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRTEwMDBfS1VNQ1RSTFNUQV9PRkZTRVRfVElNRU9VVFMgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVF9JTkJfUEFSQU0gICAgICAweDAwMDAwMDA5CisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUX0hEX0NUUkwgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRTEwMDBfS1VNQ1RSTFNUQV9PRkZTRVRfTTJQX1NFUkRFUyAgICAgMHgwMDAwMDAxRQorI2RlZmluZSBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVF9NMlBfTU9ERVMgICAgICAweDAwMDAwMDFGCisKKy8qIEZJRk8gQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9LVU1DVFJMU1RBX0ZJRk9fQ1RSTF9SWF9CWVBBU1MgICAweDAwMDAwMDA4CisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfRklGT19DVFJMX1RYX0JZUEFTUyAgIDB4MDAwMDA4MDAKKworLyogSW4tQmFuZCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfSU5CX0NUUkxfTElOS19TVEFUVVNfVFhfVElNRU9VVF9ERUZBVUxUICAgIDB4MDAwMDA1MDAKKyNkZWZpbmUgRTEwMDBfS1VNQ1RSTFNUQV9JTkJfQ1RSTF9ESVNfUEFERElORyAgMHgwMDAwMDAxMAorCisvKiBIYWxmLUR1cGxleCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfSERfQ1RSTF8xMF8xMDBfREVGQVVMVCAweDAwMDAwMDA0CisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfSERfQ1RSTF8xMDAwX0RFRkFVTFQgIDB4MDAwMDAwMDAKKworI2RlZmluZSBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVF9LMFNfQ1RSTCAgICAgICAweDAwMDAwMDFFCisKKyNkZWZpbmUgRTEwMDBfS1VNQ1RSTFNUQV9ESUFHX0ZFTFBCSyAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfRElBR19ORUxQQksgICAgICAgICAgIDB4MTAwMAorCisjZGVmaW5lIEUxMDAwX0tVTUNUUkxTVEFfSzBTXzEwMF9FTiAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBFMTAwMF9LVU1DVFJMU1RBX0swU19HQkVfRU4gICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRTEwMDBfS1VNQ1RSTFNUQV9LMFNfRU5UUllfTEFURU5DWV9NQVNLICAgMHgwMDAzCisKKyNkZWZpbmUgRTEwMDBfS0FCR1RYRF9CR1NRTEJJQVMgICAgICAgICAgICAgICAgMHgwMDA1MDAwMAorCisjZGVmaW5lIEUxMDAwX1BIWV9DVFJMX1NQRF9FTiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRTEwMDBfUEhZX0NUUkxfRDBBX0xQTFUgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFMTAwMF9QSFlfQ1RSTF9OT05EMEFfTFBMVSAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEUxMDAwX1BIWV9DVFJMX05PTkQwQV9HQkVfRElTQUJMRSAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEUgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFMTAwMF9QSFlfQ1RSTF9CMkJfRU4gICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisKKy8qIExFRCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX01PREVfTUFTSyAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX01PREVfU0hJRlQgICAgICAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX0JMSU5LX1JBVEUgICAgICAweDAwMDAwMjAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfSVZSVCAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfQkxJTksgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfTU9ERV9NQVNLICAgICAgIDB4MDAwMDBGMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfTU9ERV9TSElGVCAgICAgIDgKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfQkxJTktfUkFURSAgICAgIDB4MDAwMjAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMV9JVlJUICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMV9CTElOSyAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMl9NT0RFX01BU0sgICAgICAgMHgwMDBGMDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMl9NT0RFX1NISUZUICAgICAgMTYKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfQkxJTktfUkFURSAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfSVZSVCAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfQkxJTksgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDNfTU9ERV9NQVNLICAgICAgIDB4MEYwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDNfTU9ERV9TSElGVCAgICAgIDI0CisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQzX0JMSU5LX1JBVEUgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQzX0lWUlQgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQzX0JMSU5LICAgICAgICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMF8xMDAwICAweDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMDBfMTAwMCAweDEKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS19VUCAgICAgICAweDIKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfQUNUSVZJVFkgICAgICAweDMKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS19BQ1RJVklUWSAweDQKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMCAgICAgICAweDUKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMDAgICAgICAweDYKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMDAwICAgICAweDcKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfUENJWF9NT0RFICAgICAweDgKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfRlVMTF9EVVBMRVggICAweDkKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfQ09MTElTSU9OICAgICAweEEKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfQlVTX1NQRUVEICAgICAweEIKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfQlVTX1NJWkUgICAgICAweEMKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfUEFVU0VEICAgICAgICAweEQKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTEVEX09OICAgICAgICAweEUKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRiAgICAgICAweEYKKworLyogUmVjZWl2ZSBBZGRyZXNzICovCisjZGVmaW5lIEUxMDAwX1JBSF9BViAgMHg4MDAwMDAwMCAgICAgICAgLyogUmVjZWl2ZSBkZXNjcmlwdG9yIHZhbGlkICovCisKKyNkZWZpbmUgRTEwMDBfUkFIX1BPT0xfMSAweDAwMDQwMDAwCisKKy8qIEludGVycnVwdCBDYXVzZSBSZWFkICovCisjZGVmaW5lIEUxMDAwX0lDUl9UWERXICAgICAgICAgIDB4MDAwMDAwMDEgLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1RYUUUgICAgICAgICAgMHgwMDAwMDAwMiAvKiBUcmFuc21pdCBRdWV1ZSBlbXB0eSAqLworI2RlZmluZSBFMTAwMF9JQ1JfTFNDICAgICAgICAgICAweDAwMDAwMDA0IC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhTRVEgICAgICAgICAweDAwMDAwMDA4IC8qIHJ4IHNlcXVlbmNlIGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWERNVDAgICAgICAgIDB4MDAwMDAwMTAgLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAoMCkgKi8KKy8qIExBTiBjb25uZWN0ZWQgZGV2aWNlIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0RPVVRTWU5DICAgICAgMHgxMDAwMDAwMCAvKiBOSUMgRE1BIG91dCBvZiBzeW5jICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWE8gICAgICAgICAgIDB4MDAwMDAwNDAgLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhUMCAgICAgICAgICAweDAwMDAwMDgwIC8qIHJ4IHRpbWVyIGludHIgKHJpbmcgMCkgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX01EQUMgICAgICAgICAgMHgwMDAwMDIwMCAvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhDRkcgICAgICAgICAweDAwMDAwNDAwIC8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMCAgICAgICAweDAwMDAwODAwIC8qIEdQIEludCAwICovCisjZGVmaW5lIEUxMDAwX0lDUl9HUElfRU4xICAgICAgIDB4MDAwMDEwMDAgLyogR1AgSW50IDEgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjIgICAgICAgMHgwMDAwMjAwMCAvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMyAgICAgICAweDAwMDA0MDAwIC8qIEdQIEludCAzICovCisjZGVmaW5lIEUxMDAwX0lDUl9UWERfTE9XICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRTEwMDBfSUNSX1NSUEQgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBFMTAwMF9JQ1JfQUNLICAgICAgICAgICAweDAwMDIwMDAwIC8qIFJlY2VpdmUgQWNrIGZyYW1lICovCisjZGVmaW5lIEUxMDAwX0lDUl9NTkcgICAgICAgICAgIDB4MDAwNDAwMDAgLyogTWFuYWdlYWJpbGl0eSBldmVudCAqLworI2RlZmluZSBFMTAwMF9JQ1JfRE9DSyAgICAgICAgICAweDAwMDgwMDAwIC8qIERvY2svVW5kb2NrICovCisjZGVmaW5lIEUxMDAwX0lDUl9JTlRfQVNTRVJURUQgIDB4ODAwMDAwMDAgLyogSWYgdGhpcyBiaXQgYXNzZXJ0ZWQsIHRoZSBkcml2ZXIgc2hvdWxkIGNsYWltIHRoZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYRF9GSUZPX1BBUjAgMHgwMDEwMDAwMCAvKiBxdWV1ZSAwIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjAgMHgwMDIwMDAwMCAvKiBxdWV1ZSAwIFR4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0hPU1RfQVJCX1BBUiAgMHgwMDQwMDAwMCAvKiBob3N0IGFyYiByZWFkIGJ1ZmZlciBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1BCX1BBUiAgICAgICAgMHgwMDgwMDAwMCAvKiBwYWNrZXQgYnVmZmVyIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMSAweDAxMDAwMDAwIC8qIHF1ZXVlIDEgUnggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1JfVFhEX0ZJRk9fUEFSMSAweDAyMDAwMDAwIC8qIHF1ZXVlIDEgVHggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1JfQUxMX1BBUklUWSAgICAweDAzRjAwMDAwIC8qIGFsbCBwYXJpdHkgZXJyb3IgYml0cyAqLworI2RlZmluZSBFMTAwMF9JQ1JfRFNXICAgICAgICAgICAweDAwMDAwMDIwIC8qIEZXIGNoYW5nZWQgdGhlIHN0YXR1cyBvZiBESVNTVyBiaXQgaW4gdGhlIEZXU00gKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1BIWUlOVCAgICAgICAgMHgwMDAwMTAwMCAvKiBMQU4gY29ubmVjdGVkIGRldmljZSBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0ICovCisjZGVmaW5lIEUxMDAwX0lDUl9FUFJTVCAgICAgICAgIDB4MDAxMDAwMDAgLyogTUUgaGFuZHdhcmUgcmVzZXQgb2NjdXJzICovCisKKy8qIEludGVycnVwdCBDYXVzZSBTZXQgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1RYRFcgICAgICBFMTAwMF9JQ1JfVFhEVyAgICAgIC8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lDU19UWFFFICAgICAgRTEwMDBfSUNSX1RYUUUgICAgICAvKiBUcmFuc21pdCBRdWV1ZSBlbXB0eSAqLworI2RlZmluZSBFMTAwMF9JQ1NfTFNDICAgICAgIEUxMDAwX0lDUl9MU0MgICAgICAgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEUxMDAwX0lDU19SWFNFUSAgICAgRTEwMDBfSUNSX1JYU0VRICAgICAvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhETVQwICAgIEUxMDAwX0lDUl9SWERNVDAgICAgLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhPICAgICAgIEUxMDAwX0lDUl9SWE8gICAgICAgLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhUMCAgICAgIEUxMDAwX0lDUl9SWFQwICAgICAgLyogcnggdGltZXIgaW50ciAqLworI2RlZmluZSBFMTAwMF9JQ1NfTURBQyAgICAgIEUxMDAwX0lDUl9NREFDICAgICAgLyogTURJTyBhY2Nlc3MgY29tcGxldGUgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1JYQ0ZHICAgICBFMTAwMF9JQ1JfUlhDRkcgICAgIC8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JQ1NfR1BJX0VOMCAgIEUxMDAwX0lDUl9HUElfRU4wICAgLyogR1AgSW50IDAgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0dQSV9FTjEgICBFMTAwMF9JQ1JfR1BJX0VOMSAgIC8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lDU19HUElfRU4yICAgRTEwMDBfSUNSX0dQSV9FTjIgICAvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JQ1NfR1BJX0VOMyAgIEUxMDAwX0lDUl9HUElfRU4zICAgLyogR1AgSW50IDMgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1RYRF9MT1cgICBFMTAwMF9JQ1JfVFhEX0xPVworI2RlZmluZSBFMTAwMF9JQ1NfU1JQRCAgICAgIEUxMDAwX0lDUl9TUlBECisjZGVmaW5lIEUxMDAwX0lDU19BQ0sgICAgICAgRTEwMDBfSUNSX0FDSyAgICAgICAvKiBSZWNlaXZlIEFjayBmcmFtZSAqLworI2RlZmluZSBFMTAwMF9JQ1NfTU5HICAgICAgIEUxMDAwX0lDUl9NTkcgICAgICAgLyogTWFuYWdlYWJpbGl0eSBldmVudCAqLworI2RlZmluZSBFMTAwMF9JQ1NfRE9DSyAgICAgIEUxMDAwX0lDUl9ET0NLICAgICAgLyogRG9jay9VbmRvY2sgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1JYRF9GSUZPX1BBUjAgRTEwMDBfSUNSX1JYRF9GSUZPX1BBUjAgLyogcXVldWUgMCBSeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDU19UWERfRklGT19QQVIwIEUxMDAwX0lDUl9UWERfRklGT19QQVIwIC8qIHF1ZXVlIDAgVHggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1NfSE9TVF9BUkJfUEFSICBFMTAwMF9JQ1JfSE9TVF9BUkJfUEFSICAvKiBob3N0IGFyYiByZWFkIGJ1ZmZlciBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1BCX1BBUiAgICAgICAgRTEwMDBfSUNSX1BCX1BBUiAgICAgICAgLyogcGFja2V0IGJ1ZmZlciBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1JYRF9GSUZPX1BBUjEgRTEwMDBfSUNSX1JYRF9GSUZPX1BBUjEgLyogcXVldWUgMSBSeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDU19UWERfRklGT19QQVIxIEUxMDAwX0lDUl9UWERfRklGT19QQVIxIC8qIHF1ZXVlIDEgVHggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1NfRFNXICAgICAgIEUxMDAwX0lDUl9EU1cKKyNkZWZpbmUgRTEwMDBfSUNTX1BIWUlOVCAgICBFMTAwMF9JQ1JfUEhZSU5UCisjZGVmaW5lIEUxMDAwX0lDU19FUFJTVCAgICAgRTEwMDBfSUNSX0VQUlNUCisKKy8qIEludGVycnVwdCBNYXNrIFNldCAqLworI2RlZmluZSBFMTAwMF9JTVNfVFhEVyAgICAgIEUxMDAwX0lDUl9UWERXICAgICAgLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1RYUUUgICAgICBFMTAwMF9JQ1JfVFhRRSAgICAgIC8qIFRyYW5zbWl0IFF1ZXVlIGVtcHR5ICovCisjZGVmaW5lIEUxMDAwX0lNU19MU0MgICAgICAgRTEwMDBfSUNSX0xTQyAgICAgICAvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYU0VRICAgICBFMTAwMF9JQ1JfUlhTRVEgICAgIC8qIHJ4IHNlcXVlbmNlIGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNU19SWERNVDAgICAgRTEwMDBfSUNSX1JYRE1UMCAgICAvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX0lNU19SWE8gICAgICAgRTEwMDBfSUNSX1JYTyAgICAgICAvKiByeCBvdmVycnVuICovCisjZGVmaW5lIEUxMDAwX0lNU19ET1VUU1lOQyAgRTEwMDBfSUNSX0RPVVRTWU5DICAvKiBOSUMgRE1BIG91dCBvZiBzeW5jICovCisjZGVmaW5lIEUxMDAwX0lNU19SWFQwICAgICAgRTEwMDBfSUNSX1JYVDAgICAgICAvKiByeCB0aW1lciBpbnRyICovCisjZGVmaW5lIEUxMDAwX0lNU19NREFDICAgICAgRTEwMDBfSUNSX01EQUMgICAgICAvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhDRkcgICAgIEUxMDAwX0lDUl9SWENGRyAgICAgLyogUlggL2MvIG9yZGVyZWQgc2V0ICovCisjZGVmaW5lIEUxMDAwX0lNU19HUElfRU4wICAgRTEwMDBfSUNSX0dQSV9FTjAgICAvKiBHUCBJbnQgMCAqLworI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMSAgIEUxMDAwX0lDUl9HUElfRU4xICAgLyogR1AgSW50IDEgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjIgICBFMTAwMF9JQ1JfR1BJX0VOMiAgIC8qIEdQIEludCAyICovCisjZGVmaW5lIEUxMDAwX0lNU19HUElfRU4zICAgRTEwMDBfSUNSX0dQSV9FTjMgICAvKiBHUCBJbnQgMyAqLworI2RlZmluZSBFMTAwMF9JTVNfVFhEX0xPVyAgIEUxMDAwX0lDUl9UWERfTE9XCisjZGVmaW5lIEUxMDAwX0lNU19TUlBEICAgICAgRTEwMDBfSUNSX1NSUEQKKyNkZWZpbmUgRTEwMDBfSU1TX0FDSyAgICAgICBFMTAwMF9JQ1JfQUNLICAgICAgIC8qIFJlY2VpdmUgQWNrIGZyYW1lICovCisjZGVmaW5lIEUxMDAwX0lNU19NTkcgICAgICAgRTEwMDBfSUNSX01ORyAgICAgICAvKiBNYW5hZ2VhYmlsaXR5IGV2ZW50ICovCisjZGVmaW5lIEUxMDAwX0lNU19ET0NLICAgICAgRTEwMDBfSUNSX0RPQ0sgICAgICAvKiBEb2NrL1VuZG9jayAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhEX0ZJRk9fUEFSMCBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMCAvKiBxdWV1ZSAwIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1RYRF9GSUZPX1BBUjAgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjAgLyogcXVldWUgMCBUeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNU19IT1NUX0FSQl9QQVIgIEUxMDAwX0lDUl9IT1NUX0FSQl9QQVIgIC8qIGhvc3QgYXJiIHJlYWQgYnVmZmVyIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTVNfUEJfUEFSICAgICAgICBFMTAwMF9JQ1JfUEJfUEFSICAgICAgICAvKiBwYWNrZXQgYnVmZmVyIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhEX0ZJRk9fUEFSMSBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMSAvKiBxdWV1ZSAxIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1RYRF9GSUZPX1BBUjEgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjEgLyogcXVldWUgMSBUeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNU19EU1cgICAgICAgRTEwMDBfSUNSX0RTVworI2RlZmluZSBFMTAwMF9JTVNfUEhZSU5UICAgIEUxMDAwX0lDUl9QSFlJTlQKKyNkZWZpbmUgRTEwMDBfSU1TX0VQUlNUICAgICBFMTAwMF9JQ1JfRVBSU1QKKworLyogSW50ZXJydXB0IE1hc2sgQ2xlYXIgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1RYRFcgICAgICBFMTAwMF9JQ1JfVFhEVyAgICAgIC8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lNQ19UWFFFICAgICAgRTEwMDBfSUNSX1RYUUUgICAgICAvKiBUcmFuc21pdCBRdWV1ZSBlbXB0eSAqLworI2RlZmluZSBFMTAwMF9JTUNfTFNDICAgICAgIEUxMDAwX0lDUl9MU0MgICAgICAgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEUxMDAwX0lNQ19SWFNFUSAgICAgRTEwMDBfSUNSX1JYU0VRICAgICAvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhETVQwICAgIEUxMDAwX0lDUl9SWERNVDAgICAgLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhPICAgICAgIEUxMDAwX0lDUl9SWE8gICAgICAgLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhUMCAgICAgIEUxMDAwX0lDUl9SWFQwICAgICAgLyogcnggdGltZXIgaW50ciAqLworI2RlZmluZSBFMTAwMF9JTUNfTURBQyAgICAgIEUxMDAwX0lDUl9NREFDICAgICAgLyogTURJTyBhY2Nlc3MgY29tcGxldGUgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYQ0ZHICAgICBFMTAwMF9JQ1JfUlhDRkcgICAgIC8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMCAgIEUxMDAwX0lDUl9HUElfRU4wICAgLyogR1AgSW50IDAgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjEgICBFMTAwMF9JQ1JfR1BJX0VOMSAgIC8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lNQ19HUElfRU4yICAgRTEwMDBfSUNSX0dQSV9FTjIgICAvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMyAgIEUxMDAwX0lDUl9HUElfRU4zICAgLyogR1AgSW50IDMgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1RYRF9MT1cgICBFMTAwMF9JQ1JfVFhEX0xPVworI2RlZmluZSBFMTAwMF9JTUNfU1JQRCAgICAgIEUxMDAwX0lDUl9TUlBECisjZGVmaW5lIEUxMDAwX0lNQ19BQ0sgICAgICAgRTEwMDBfSUNSX0FDSyAgICAgICAvKiBSZWNlaXZlIEFjayBmcmFtZSAqLworI2RlZmluZSBFMTAwMF9JTUNfTU5HICAgICAgIEUxMDAwX0lDUl9NTkcgICAgICAgLyogTWFuYWdlYWJpbGl0eSBldmVudCAqLworI2RlZmluZSBFMTAwMF9JTUNfRE9DSyAgICAgIEUxMDAwX0lDUl9ET0NLICAgICAgLyogRG9jay9VbmRvY2sgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYRF9GSUZPX1BBUjAgRTEwMDBfSUNSX1JYRF9GSUZPX1BBUjAgLyogcXVldWUgMCBSeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNQ19UWERfRklGT19QQVIwIEUxMDAwX0lDUl9UWERfRklGT19QQVIwIC8qIHF1ZXVlIDAgVHggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTUNfSE9TVF9BUkJfUEFSICBFMTAwMF9JQ1JfSE9TVF9BUkJfUEFSICAvKiBob3N0IGFyYiByZWFkIGJ1ZmZlciBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1BCX1BBUiAgICAgICAgRTEwMDBfSUNSX1BCX1BBUiAgICAgICAgLyogcGFja2V0IGJ1ZmZlciBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYRF9GSUZPX1BBUjEgRTEwMDBfSUNSX1JYRF9GSUZPX1BBUjEgLyogcXVldWUgMSBSeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNQ19UWERfRklGT19QQVIxIEUxMDAwX0lDUl9UWERfRklGT19QQVIxIC8qIHF1ZXVlIDEgVHggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTUNfRFNXICAgICAgIEUxMDAwX0lDUl9EU1cKKyNkZWZpbmUgRTEwMDBfSU1DX1BIWUlOVCAgICBFMTAwMF9JQ1JfUEhZSU5UCisjZGVmaW5lIEUxMDAwX0lNQ19FUFJTVCAgICAgRTEwMDBfSUNSX0VQUlNUCisKKy8qIFJlY2VpdmUgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1JTVCAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogU29mdHdhcmUgcmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9FTiAgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NCUCAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogc3RvcmUgYmFkIHBhY2tldCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1VQRSAgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogdW5pY2FzdCBwcm9taXNjdW91cyBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NUEUgICAgICAgICAgICAweDAwMDAwMDEwICAgIC8qIG11bHRpY2FzdCBwcm9taXNjdW91cyBlbmFiICovCisjZGVmaW5lIEUxMDAwX1JDVExfTFBFICAgICAgICAgICAgMHgwMDAwMDAyMCAgICAvKiBsb25nIHBhY2tldCBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fTk8gICAgICAgICAweDAwMDAwMDAwICAgIC8qIG5vIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fTUFDICAgICAgICAweDAwMDAwMDQwICAgIC8qIE1BQyBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEUxMDAwX1JDVExfTEJNX1NMUCAgICAgICAgMHgwMDAwMDA4MCAgICAvKiBzZXJpYWwgbGluayBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEUxMDAwX1JDVExfTEJNX1RDVlIgICAgICAgMHgwMDAwMDBDMCAgICAvKiB0Y3ZyIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9EVFlQX01BU0sgICAgICAweDAwMDAwQzAwICAgIC8qIERlc2NyaXB0b3IgdHlwZSBtYXNrICovCisjZGVmaW5lIEUxMDAwX1JDVExfRFRZUF9QUyAgICAgICAgMHgwMDAwMDQwMCAgICAvKiBQYWNrZXQgU3BsaXQgZGVzY3JpcHRvciAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1JETVRTX0hBTEYgICAgIDB4MDAwMDAwMDAgICAgLyogcnggZGVzYyBtaW4gdGhyZXNob2xkIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9SRE1UU19RVUFUICAgICAweDAwMDAwMTAwICAgIC8qIHJ4IGRlc2MgbWluIHRocmVzaG9sZCBzaXplICovCisjZGVmaW5lIEUxMDAwX1JDVExfUkRNVFNfRUlHVEggICAgMHgwMDAwMDIwMCAgICAvKiByeCBkZXNjIG1pbiB0aHJlc2hvbGQgc2l6ZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PX1NISUZUICAgICAgIDEyICAgICAgICAgICAgLyogbXVsdGljYXN0IG9mZnNldCBzaGlmdCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PXzAgICAgICAgICAgIDB4MDAwMDAwMDAgICAgLyogbXVsdGljYXN0IG9mZnNldCAxMTowICovCisjZGVmaW5lIEUxMDAwX1JDVExfTU9fMSAgICAgICAgICAgMHgwMDAwMTAwMCAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IDEyOjEgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NT18yICAgICAgICAgICAweDAwMDAyMDAwICAgIC8qIG11bHRpY2FzdCBvZmZzZXQgMTM6MiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PXzMgICAgICAgICAgIDB4MDAwMDMwMDAgICAgLyogbXVsdGljYXN0IG9mZnNldCAxNTo0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfTURSICAgICAgICAgICAgMHgwMDAwNDAwMCAgICAvKiBtdWx0aWNhc3QgZGVzYyByaW5nIDAgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9CQU0gICAgICAgICAgICAweDAwMDA4MDAwICAgIC8qIGJyb2FkY2FzdCBlbmFibGUgKi8KKy8qIHRoZXNlIGJ1ZmZlciBzaXplcyBhcmUgdmFsaWQgaWYgRTEwMDBfUkNUTF9CU0VYIGlzIDAgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl8yMDQ4ICAgICAgICAweDAwMDAwMDAwICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDIwNDggKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl8xMDI0ICAgICAgICAweDAwMDEwMDAwICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDEwMjQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl81MTIgICAgICAgICAweDAwMDIwMDAwICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDUxMiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzI1NiAgICAgICAgIDB4MDAwMzAwMDAgICAgLyogcnggYnVmZmVyIHNpemUgMjU2ICovCisvKiB0aGVzZSBidWZmZXIgc2l6ZXMgYXJlIHZhbGlkIGlmIEUxMDAwX1JDVExfQlNFWCBpcyAxICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfMTYzODQgICAgICAgMHgwMDAxMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSAxNjM4NCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzgxOTIgICAgICAgIDB4MDAwMjAwMDAgICAgLyogcnggYnVmZmVyIHNpemUgODE5MiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzQwOTYgICAgICAgIDB4MDAwMzAwMDAgICAgLyogcnggYnVmZmVyIHNpemUgNDA5NiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1ZGRSAgICAgICAgICAgIDB4MDAwNDAwMDAgICAgLyogdmxhbiBmaWx0ZXIgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JDVExfQ0ZJRU4gICAgICAgICAgMHgwMDA4MDAwMCAgICAvKiBjYW5vbmljYWwgZm9ybSBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9DRkkgICAgICAgICAgICAweDAwMTAwMDAwICAgIC8qIGNhbm9uaWNhbCBmb3JtIGluZGljYXRvciAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0RQRiAgICAgICAgICAgIDB4MDA0MDAwMDAgICAgLyogZGlzY2FyZCBwYXVzZSBmcmFtZXMgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9QTUNGICAgICAgICAgICAweDAwODAwMDAwICAgIC8qIHBhc3MgTUFDIGNvbnRyb2wgZnJhbWVzICovCisjZGVmaW5lIEUxMDAwX1JDVExfQlNFWCAgICAgICAgICAgMHgwMjAwMDAwMCAgICAvKiBCdWZmZXIgc2l6ZSBleHRlbnNpb24gKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TRUNSQyAgICAgICAgICAweDA0MDAwMDAwICAgIC8qIFN0cmlwIEV0aGVybmV0IENSQyAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0ZMWEJVRl9NQVNLICAgIDB4NzgwMDAwMDAgICAgLyogRmxleGlibGUgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9GTFhCVUZfU0hJRlQgICAyNyAgICAgICAgICAgIC8qIEZsZXhpYmxlIGJ1ZmZlciBzaGlmdCAqLworCisvKiBVc2UgYnl0ZSB2YWx1ZXMgZm9yIHRoZSBmb2xsb3dpbmcgc2hpZnQgcGFyYW1ldGVycworICogVXNhZ2U6CisgKiAgICAgcHNyY3RsIHw9ICgoKFJPVU5EVVAodmFsdWUwLCAxMjgpID4+IEUxMDAwX1BTUkNUTF9CU0laRTBfU0hJRlQpICYKKyAqICAgICAgICAgICAgICAgICAgRTEwMDBfUFNSQ1RMX0JTSVpFMF9NQVNLKSB8CisgKiAgICAgICAgICAgICAgICAoKFJPVU5EVVAodmFsdWUxLCAxMDI0KSA+PiBFMTAwMF9QU1JDVExfQlNJWkUxX1NISUZUKSAmCisgKiAgICAgICAgICAgICAgICAgIEUxMDAwX1BTUkNUTF9CU0laRTFfTUFTSykgfAorICogICAgICAgICAgICAgICAgKChST1VORFVQKHZhbHVlMiwgMTAyNCkgPDwgRTEwMDBfUFNSQ1RMX0JTSVpFMl9TSElGVCkgJgorICogICAgICAgICAgICAgICAgICBFMTAwMF9QU1JDVExfQlNJWkUyX01BU0spIHwKKyAqICAgICAgICAgICAgICAgICgoUk9VTkRVUCh2YWx1ZTMsIDEwMjQpIDw8IEUxMDAwX1BTUkNUTF9CU0laRTNfU0hJRlQpIHw7CisgKiAgICAgICAgICAgICAgICAgIEUxMDAwX1BTUkNUTF9CU0laRTNfTUFTSykpCisgKiB3aGVyZSB2YWx1ZTAgPSBbMTI4Li4xNjI1Nl0sICBkZWZhdWx0PTI1NgorICogICAgICAgdmFsdWUxID0gWzEwMjQuLjY0NTEyXSwgZGVmYXVsdD00MDk2CisgKiAgICAgICB2YWx1ZTIgPSBbMC4uNjQ1MTJdLCAgICBkZWZhdWx0PTQwOTYKKyAqICAgICAgIHZhbHVlMyA9IFswLi42NDUxMl0sICAgIGRlZmF1bHQ9MAorICovCisKKyNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFMF9NQVNLICAgMHgwMDAwMDA3RgorI2RlZmluZSBFMTAwMF9QU1JDVExfQlNJWkUxX01BU0sgICAweDAwMDAzRjAwCisjZGVmaW5lIEUxMDAwX1BTUkNUTF9CU0laRTJfTUFTSyAgIDB4MDAzRjAwMDAKKyNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFM19NQVNLICAgMHgzRjAwMDAwMAorCisjZGVmaW5lIEUxMDAwX1BTUkNUTF9CU0laRTBfU0hJRlQgIDcgICAgICAgICAgICAvKiBTaGlmdCBfcmlnaHRfIDcgKi8KKyNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFMV9TSElGVCAgMiAgICAgICAgICAgIC8qIFNoaWZ0IF9yaWdodF8gMiAqLworI2RlZmluZSBFMTAwMF9QU1JDVExfQlNJWkUyX1NISUZUICA2ICAgICAgICAgICAgLyogU2hpZnQgX2xlZnRfIDYgKi8KKyNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFM19TSElGVCAxNCAgICAgICAgICAgIC8qIFNoaWZ0IF9sZWZ0XyAxNCAqLworCisvKiBTV19XX1NZTkMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRTEwMDBfU1dGV19FRVBfU00gICAgIDB4MDAwMQorI2RlZmluZSBFMTAwMF9TV0ZXX1BIWTBfU00gICAgMHgwMDAyCisjZGVmaW5lIEUxMDAwX1NXRldfUEhZMV9TTSAgICAweDAwMDQKKyNkZWZpbmUgRTEwMDBfU1dGV19NQUNfQ1NSX1NNIDB4MDAwOAorCisvKiBSZWNlaXZlIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRTEwMDBfUkRUX0RFTEFZIDB4MDAwMGZmZmYgICAgICAvKiBEZWxheSB0aW1lciAoMT0xMDI0dXMpICovCisjZGVmaW5lIEUxMDAwX1JEVF9GUERCICAweDgwMDAwMDAwICAgICAgLyogRmx1c2ggZGVzY3JpcHRvciBibG9jayAqLworI2RlZmluZSBFMTAwMF9SRExFTl9MRU4gMHgwMDA3ZmY4MCAgICAgIC8qIGRlc2NyaXB0b3IgbGVuZ3RoICovCisjZGVmaW5lIEUxMDAwX1JESF9SREggICAweDAwMDBmZmZmICAgICAgLyogcmVjZWl2ZSBkZXNjcmlwdG9yIGhlYWQgKi8KKyNkZWZpbmUgRTEwMDBfUkRUX1JEVCAgIDB4MDAwMGZmZmYgICAgICAvKiByZWNlaXZlIGRlc2NyaXB0b3IgdGFpbCAqLworCisvKiBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVEhfUlRIICAweDAwMDBGRkY4ICAgICAvKiBNYXNrIEJpdHNbMTU6M10gZm9yIFJUSCAqLworI2RlZmluZSBFMTAwMF9GQ1JUSF9YRkNFIDB4ODAwMDAwMDAgICAgIC8qIEV4dGVybmFsIEZsb3cgQ29udHJvbCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVExfUlRMICAweDAwMDBGRkY4ICAgICAvKiBNYXNrIEJpdHNbMTU6M10gZm9yIFJUTCAqLworI2RlZmluZSBFMTAwMF9GQ1JUTF9YT05FIDB4ODAwMDAwMDAgICAgIC8qIEVuYWJsZSBYT04gZnJhbWUgdHJhbnNtaXNzaW9uICovCisKKy8qIEhlYWRlciBzcGxpdCByZWNlaXZlICovCisjZGVmaW5lIEUxMDAwX1JGQ1RMX0lTQ1NJX0RJUyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFMTAwMF9SRkNUTF9JU0NTSV9EV0NfTUFTSyAgICAgIDB4MDAwMDAwM0UKKyNkZWZpbmUgRTEwMDBfUkZDVExfSVNDU0lfRFdDX1NISUZUICAgICAxCisjZGVmaW5lIEUxMDAwX1JGQ1RMX05GU1dfRElTICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFMTAwMF9SRkNUTF9ORlNSX0RJUyAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRTEwMDBfUkZDVExfTkZTX1ZFUl9NQVNLICAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIEUxMDAwX1JGQ1RMX05GU19WRVJfU0hJRlQgICAgICAgOAorI2RlZmluZSBFMTAwMF9SRkNUTF9JUFY2X0RJUyAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRTEwMDBfUkZDVExfSVBWNl9YU1VNX0RJUyAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEUxMDAwX1JGQ1RMX0FDS19ESVMgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBFMTAwMF9SRkNUTF9BQ0tEX0RJUyAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgRTEwMDBfUkZDVExfSVBGUlNQX0RJUyAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEUxMDAwX1JGQ1RMX0VYVEVOICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBFMTAwMF9SRkNUTF9JUFY2X0VYX0RJUyAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgRTEwMDBfUkZDVExfTkVXX0lQVjZfRVhUX0RJUyAgICAweDAwMDIwMDAwCisKKy8qIFJlY2VpdmUgRGVzY3JpcHRvciBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9QVEhSRVNIIDB4MDAwMDAwM0YgLyogUlhEQ1RMIFByZWZldGNoIFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9SWERDVExfSFRIUkVTSCAweDAwMDAzRjAwIC8qIFJYRENUTCBIb3N0IFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9SWERDVExfV1RIUkVTSCAweDAwM0YwMDAwIC8qIFJYRENUTCBXcml0ZWJhY2sgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9HUkFOICAgIDB4MDEwMDAwMDAgLyogUlhEQ1RMIEdyYW51bGFyaXR5ICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9RVUVVRV9FTkFCTEUgIDB4MDIwMDAwMDAgLyogRW5hYmxlIHNwZWNpZmljIFJ4IFF1ZXVlICovCisjZGVmaW5lIElHQl9SWF9QVEhSRVNIICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBJR0JfUlhfSFRIUkVTSCAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgSUdCX1JYX1dUSFJFU0ggICAgICAgICAgICAgICAgICAgICAxCisKKy8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfUFRIUkVTSCAweDAwMDAwMDNGIC8qIFRYRENUTCBQcmVmZXRjaCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX0hUSFJFU0ggMHgwMDAwM0YwMCAvKiBUWERDVEwgSG9zdCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX1dUSFJFU0ggMHgwMDNGMDAwMCAvKiBUWERDVEwgV3JpdGViYWNrIFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfR1JBTiAgICAweDAxMDAwMDAwIC8qIFRYRENUTCBHcmFudWxhcml0eSAqLworI2RlZmluZSBFMTAwMF9UWERDVExfTFdUSFJFU0ggMHhGRTAwMDAwMCAvKiBUWERDVEwgTG93IFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfRlVMTF9UWF9ERVNDX1dCIDB4MDEwMTAwMDAgLyogR1JBTj0xLCBXVEhSRVNIPTEgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX0NPVU5UX0RFU0MgMHgwMDQwMDAwMCAvKiBFbmFibGUgdGhlIGNvdW50aW5nIG9mIGRlc2MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgdG8gYmUgcHJvY2Vzc2VkLiAqLworI2RlZmluZSBFMTAwMF9UWERDVExfUVVFVUVfRU5BQkxFICAweDAyMDAwMDAwIC8qIEVuYWJsZSBzcGVjaWZpYyBUeCBRdWV1ZSAqLworLyogVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBXb3JkICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfRkQgICAgICAgICAweDAwMDAwMDIwICAgICAgICAvKiBUWENXIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfSEQgICAgICAgICAweDAwMDAwMDQwICAgICAgICAvKiBUWENXIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfUEFVU0UgICAgICAweDAwMDAwMDgwICAgICAgICAvKiBUWENXIHN5bSBwYXVzZSByZXF1ZXN0ICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfQVNNX0RJUiAgICAweDAwMDAwMTAwICAgICAgICAvKiBUWENXIGFzdG0gcGF1c2UgZGlyZWN0aW9uICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfUEFVU0VfTUFTSyAweDAwMDAwMTgwICAgICAgICAvKiBUWENXIHBhdXNlIHJlcXVlc3QgbWFzayAqLworI2RlZmluZSBFMTAwMF9UWENXX1JGICAgICAgICAgMHgwMDAwMzAwMCAgICAgICAgLyogVFhDVyByZW1vdGUgZmF1bHQgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19OUCAgICAgICAgIDB4MDAwMDgwMDAgICAgICAgIC8qIFRYQ1cgbmV4dCBwYWdlICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfQ1cgICAgICAgICAweDAwMDBmZmZmICAgICAgICAvKiBUeENvbmZpZ1dvcmQgbWFzayAqLworI2RlZmluZSBFMTAwMF9UWENXX1RYQyAgICAgICAgMHg0MDAwMDAwMCAgICAgICAgLyogVHJhbnNtaXQgQ29uZmlnIGNvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19BTkUgICAgICAgIDB4ODAwMDAwMDAgICAgICAgIC8qIEF1dG8tbmVnIGVuYWJsZSAqLworCisvKiBSZWNlaXZlIENvbmZpZ3VyYXRpb24gV29yZCAqLworI2RlZmluZSBFMTAwMF9SWENXX0NXICAgIDB4MDAwMGZmZmYgICAgIC8qIFJ4Q29uZmlnV29yZCBtYXNrICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfTkMgICAgMHgwNDAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgbm8gY2FycmllciAqLworI2RlZmluZSBFMTAwMF9SWENXX0lWICAgIDB4MDgwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnIGludmFsaWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19DQyAgICAweDEwMDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyBjaGFuZ2UgKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19DICAgICAweDIwMDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyAqLworI2RlZmluZSBFMTAwMF9SWENXX1NZTkNIIDB4NDAwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnIHN5bmNoICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfQU5DICAgMHg4MDAwMDAwMCAgICAgLyogQXV0by1uZWcgY29tcGxldGUgKi8KKworLyogVHJhbnNtaXQgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1JTVCAgICAweDAwMDAwMDAxICAgIC8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIEUxMDAwX1RDVExfRU4gICAgIDB4MDAwMDAwMDIgICAgLyogZW5hYmxlIHR4ICovCisjZGVmaW5lIEUxMDAwX1RDVExfQkNFICAgIDB4MDAwMDAwMDQgICAgLyogYnVzeSBjaGVjayBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9QU1AgICAgMHgwMDAwMDAwOCAgICAvKiBwYWQgc2hvcnQgcGFja2V0cyAqLworI2RlZmluZSBFMTAwMF9UQ1RMX0NUICAgICAweDAwMDAwZmYwICAgIC8qIGNvbGxpc2lvbiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9DT0xEICAgMHgwMDNmZjAwMCAgICAvKiBjb2xsaXNpb24gZGlzdGFuY2UgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9TV1hPRkYgMHgwMDQwMDAwMCAgICAvKiBTVyBYb2ZmIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1BCRSAgICAweDAwODAwMDAwICAgIC8qIFBhY2tldCBCdXJzdCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9SVExDICAgMHgwMTAwMDAwMCAgICAvKiBSZS10cmFuc21pdCBvbiBsYXRlIGNvbGxpc2lvbiAqLworI2RlZmluZSBFMTAwMF9UQ1RMX05SVFUgICAweDAyMDAwMDAwICAgIC8qIE5vIFJlLXRyYW5zbWl0IG9uIHVuZGVycnVuICovCisjZGVmaW5lIEUxMDAwX1RDVExfTVVMUiAgIDB4MTAwMDAwMDAgICAgLyogTXVsdGlwbGUgcmVxdWVzdCBzdXBwb3J0ICovCisvKiBFeHRlbmRlZCBUcmFuc21pdCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1RDVExfRVhUX0JTVF9NQVNLICAweDAwMDAwM0ZGIC8qIEJhY2tvZmYgU2xvdCBUaW1lICovCisjZGVmaW5lIEUxMDAwX1RDVExfRVhUX0dDRVhfTUFTSyAweDAwMEZGQzAwIC8qIEdpZ2FiaXQgQ2FycnkgRXh0ZW5kIFBhZGRpbmcgKi8KKworI2RlZmluZSBERUZBVUxUXzgwMDAzRVMyTEFOX1RDVExfRVhUX0dDRVggICAweDAwMDEwMDAwCisKKy8qIFJlY2VpdmUgQ2hlY2tzdW0gQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9SWENTVU1fUENTU19NQVNLIDB4MDAwMDAwRkYgICAvKiBQYWNrZXQgQ2hlY2tzdW0gU3RhcnQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX0lQT0ZMICAgICAweDAwMDAwMTAwICAgLyogSVB2NCBjaGVja3N1bSBvZmZsb2FkICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9UVU9GTCAgICAgMHgwMDAwMDIwMCAgIC8qIFRDUCAvIFVEUCBjaGVja3N1bSBvZmZsb2FkICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9JUFY2T0ZMICAgMHgwMDAwMDQwMCAgIC8qIElQdjYgY2hlY2tzdW0gb2ZmbG9hZCAqLworI2RlZmluZSBFMTAwMF9SWENTVU1fSVBQQ1NFICAgIDB4MDAwMDEwMDAgICAvKiBJUCBwYXlsb2FkIGNoZWNrc3VtIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SWENTVU1fUENTRCAgICAgIDB4MDAwMDIwMDAgICAvKiBwYWNrZXQgY2hlY2tzdW0gZGlzYWJsZWQgKi8KKworLyogTXVsdGlwbGUgUmVjZWl2ZSBRdWV1ZSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX01SUUNfRU5BQkxFX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRTEwMDBfTVJRQ19FTkFCTEVfVk1EUSAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBFMTAwMF9NUlFDX0VOQUJMRV9SU1NfMlEgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEUxMDAwX01SUUNfRU5BQkxFX1JTU19JTlQgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRTEwMDBfTVJRQ19SU1NfRklFTERfTUFTSyAgICAgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSBFMTAwMF9NUlFDX1JTU19GSUVMRF9JUFY0X1RDUCAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEUxMDAwX01SUUNfUlNTX0ZJRUxEX0lQVjQgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgRTEwMDBfTVJRQ19SU1NfRklFTERfSVBWNl9UQ1BfRVggICAgMHgwMDA0MDAwMAorI2RlZmluZSBFMTAwMF9NUlFDX1JTU19GSUVMRF9JUFY2X0VYICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEUxMDAwX01SUUNfUlNTX0ZJRUxEX0lQVjYgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgRTEwMDBfTVJRQ19SU1NfRklFTERfSVBWNl9UQ1AgICAgICAgMHgwMDIwMDAwMAorCisvKiBEZWZpbml0aW9ucyBmb3IgcG93ZXIgbWFuYWdlbWVudCBhbmQgd2FrZXVwIHJlZ2lzdGVycyAqLworLyogV2FrZSBVcCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1dVQ19BUE1FICAgICAgIDB4MDAwMDAwMDEgLyogQVBNIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUNfUE1FX0VOICAgICAweDAwMDAwMDAyIC8qIFBNRSBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX1BNRV9TVEFUVVMgMHgwMDAwMDAwNCAvKiBQTUUgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX1dVQ19BUE1QTUUgICAgIDB4MDAwMDAwMDggLyogQXNzZXJ0IFBNRSBvbiBBUE0gV2FrZXVwICovCisjZGVmaW5lIEUxMDAwX1dVQ19TUE0gICAgICAgIDB4ODAwMDAwMDAgLyogRW5hYmxlIFNQTSAqLworCisvKiBXYWtlIFVwIEZpbHRlciBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1dVRkNfTE5LQyAweDAwMDAwMDAxIC8qIExpbmsgU3RhdHVzIENoYW5nZSBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfTUFHICAweDAwMDAwMDAyIC8qIE1hZ2ljIFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRVggICAweDAwMDAwMDA0IC8qIERpcmVjdGVkIEV4YWN0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19NQyAgIDB4MDAwMDAwMDggLyogRGlyZWN0ZWQgTXVsdGljYXN0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19CQyAgIDB4MDAwMDAwMTAgLyogQnJvYWRjYXN0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19BUlAgIDB4MDAwMDAwMjAgLyogQVJQIFJlcXVlc3QgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19JUFY0IDB4MDAwMDAwNDAgLyogRGlyZWN0ZWQgSVB2NCBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0lQVjYgMHgwMDAwMDA4MCAvKiBEaXJlY3RlZCBJUHY2IFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfSUdOT1JFX1RDTyAgICAgIDB4MDAwMDgwMDAgLyogSWdub3JlIFdha2VPbiBUQ08gcGFja2V0cyAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDAgMHgwMDAxMDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFgxIDB4MDAwMjAwMDAgLyogRmxleGlibGUgRmlsdGVyIDEgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYMiAweDAwMDQwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAyIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDMgMHgwMDA4MDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMyBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19BTExfRklMVEVSUyAweDAwMEYwMEZGIC8qIE1hc2sgZm9yIGFsbCB3YWtldXAgZmlsdGVycyAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWF9PRkZTRVQgMTYgICAgICAgLyogT2Zmc2V0IHRvIHRoZSBGbGV4aWJsZSBGaWx0ZXJzIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFhfRklMVEVSUyAweDAwMEYwMDAwIC8qIE1hc2sgZm9yIHRoZSA0IGZsZXhpYmxlIGZpbHRlcnMgKi8KKworLyogV2FrZSBVcCBTdGF0dXMgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0xOS0MgMHgwMDAwMDAwMSAvKiBMaW5rIFN0YXR1cyBDaGFuZ2VkICovCisjZGVmaW5lIEUxMDAwX1dVU19NQUcgIDB4MDAwMDAwMDIgLyogTWFnaWMgUGFja2V0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19FWCAgIDB4MDAwMDAwMDQgLyogRGlyZWN0ZWQgRXhhY3QgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX01DICAgMHgwMDAwMDAwOCAvKiBEaXJlY3RlZCBNdWx0aWNhc3QgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0JDICAgMHgwMDAwMDAxMCAvKiBCcm9hZGNhc3QgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0FSUCAgMHgwMDAwMDAyMCAvKiBBUlAgUmVxdWVzdCBQYWNrZXQgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0lQVjQgMHgwMDAwMDA0MCAvKiBEaXJlY3RlZCBJUHY0IFBhY2tldCBXYWtldXAgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0lQVjYgMHgwMDAwMDA4MCAvKiBEaXJlY3RlZCBJUHY2IFBhY2tldCBXYWtldXAgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWDAgMHgwMDAxMDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMCBNYXRjaCAqLworI2RlZmluZSBFMTAwMF9XVVNfRkxYMSAweDAwMDIwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAxIE1hdGNoICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFgyIDB4MDAwNDAwMDAgLyogRmxleGlibGUgRmlsdGVyIDIgTWF0Y2ggKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWDMgMHgwMDA4MDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMyBNYXRjaCAqLworI2RlZmluZSBFMTAwMF9XVVNfRkxYX0ZJTFRFUlMgMHgwMDBGMDAwMCAvKiBNYXNrIGZvciB0aGUgNCBmbGV4aWJsZSBmaWx0ZXJzICovCisKKy8qIE1hbmFnZW1lbnQgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQlVTX0VOICAgICAgMHgwMDAwMDAwMSAvKiBTTUJ1cyBFbmFibGVkIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19BU0ZfRU4gICAgICAgIDB4MDAwMDAwMDIgLyogQVNGIEVuYWJsZWQgLSBSTyAqLworI2RlZmluZSBFMTAwMF9NQU5DX1JfT05fRk9SQ0UgICAgMHgwMDAwMDAwNCAvKiBSZXNldCBvbiBGb3JjZSBUQ08gLSBSTyAqLworI2RlZmluZSBFMTAwMF9NQU5DX1JNQ1BfRU4gICAgICAgMHgwMDAwMDEwMCAvKiBFbmFibGUgUkNNUCAwMjZGaCBGaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ18wMjk4X0VOICAgICAgIDB4MDAwMDAyMDAgLyogRW5hYmxlIFJDTVAgMDI5OGggRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfSVBWNF9FTiAgICAgICAweDAwMDAwNDAwIC8qIEVuYWJsZSBJUHY0ICovCisjZGVmaW5lIEUxMDAwX01BTkNfSVBWNl9FTiAgICAgICAweDAwMDAwODAwIC8qIEVuYWJsZSBJUHY2ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU05BUF9FTiAgICAgICAweDAwMDAxMDAwIC8qIEFjY2VwdCBMTEMvU05BUCAqLworI2RlZmluZSBFMTAwMF9NQU5DX0FSUF9FTiAgICAgICAgMHgwMDAwMjAwMCAvKiBFbmFibGUgQVJQIFJlcXVlc3QgRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfTkVJR0hCT1JfRU4gICAweDAwMDA0MDAwIC8qIEVuYWJsZSBOZWlnaGJvciBEaXNjb3ZlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfQVJQX1JFU19FTiAgICAweDAwMDA4MDAwIC8qIEVuYWJsZSBBUlAgcmVzcG9uc2UgRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfVENPX1JFU0VUICAgICAweDAwMDEwMDAwIC8qIFRDTyBSZXNldCBPY2N1cnJlZCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1JDVl9UQ09fRU4gICAgMHgwMDAyMDAwMCAvKiBSZWNlaXZlIFRDTyBQYWNrZXRzIEVuYWJsZWQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19SRVBPUlRfU1RBVFVTIDB4MDAwNDAwMDAgLyogU3RhdHVzIFJlcG9ydGluZyBFbmFibGVkICovCisjZGVmaW5lIEUxMDAwX01BTkNfUkNWX0FMTCAgICAgICAweDAwMDgwMDAwIC8qIFJlY2VpdmUgQWxsIEVuYWJsZWQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19CTEtfUEhZX1JTVF9PTl9JREUgICAweDAwMDQwMDAwIC8qIEJsb2NrIHBoeSByZXNldHMgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19FTl9NQUNfQUREUl9GSUxURVIgICAweDAwMTAwMDAwIC8qIEVuYWJsZSBNQUMgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfRU5fTU5HMkhPU1QgICAweDAwMjAwMDAwIC8qIEVuYWJsZSBNTkcgcGFja2V0cyB0byBob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1lbW9yeSAqLworI2RlZmluZSBFMTAwMF9NQU5DX0VOX0lQX0FERFJfRklMVEVSICAgIDB4MDA0MDAwMDAgLyogRW5hYmxlIElQIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX0VOX1hTVU1fRklMVEVSICAgMHgwMDgwMDAwMCAvKiBFbmFibGUgY2hlY2tzdW0gZmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfQlJfRU4gICAgICAgICAweDAxMDAwMDAwIC8qIEVuYWJsZSBicm9hZGNhc3QgZmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX1JFUSAgICAgICAweDAxMDAwMDAwIC8qIFNNQnVzIFJlcXVlc3QgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfR05UICAgICAgIDB4MDIwMDAwMDAgLyogU01CdXMgR3JhbnQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX0lOICAgIDB4MDQwMDAwMDAgLyogU01CdXMgQ2xvY2sgSW4gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfREFUQV9JTiAgIDB4MDgwMDAwMDAgLyogU01CdXMgRGF0YSBJbiAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9EQVRBX09VVCAgMHgxMDAwMDAwMCAvKiBTTUJ1cyBEYXRhIE91dCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9DTEtfT1VUICAgMHgyMDAwMDAwMCAvKiBTTUJ1cyBDbG9jayBPdXQgKi8KKworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9EQVRBX09VVF9TSElGVCAgMjggLyogU01CdXMgRGF0YSBPdXQgU2hpZnQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX09VVF9TSElGVCAgIDI5IC8qIFNNQnVzIENsb2NrIE91dCBTaGlmdCAqLworCisvKiBTVyBTZW1hcGhvcmUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfU1dTTV9TTUJJICAgICAgICAgMHgwMDAwMDAwMSAvKiBEcml2ZXIgU2VtYXBob3JlIGJpdCAqLworI2RlZmluZSBFMTAwMF9TV1NNX1NXRVNNQkkgICAgICAweDAwMDAwMDAyIC8qIEZXIFNlbWFwaG9yZSBiaXQgKi8KKyNkZWZpbmUgRTEwMDBfU1dTTV9XTU5HICAgICAgICAgMHgwMDAwMDAwNCAvKiBXYWtlIE1ORyBDbG9jayAqLworI2RlZmluZSBFMTAwMF9TV1NNX0RSVl9MT0FEICAgICAweDAwMDAwMDA4IC8qIERyaXZlciBMb2FkZWQgQml0ICovCisKKy8qIEZXIFNlbWFwaG9yZSBSZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9GV1NNX01PREVfTUFTSyAgICAweDAwMDAwMDBFIC8qIEZXIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfRldTTV9NT0RFX1NISUZUICAgICAgICAgICAgMQorI2RlZmluZSBFMTAwMF9GV1NNX0ZXX1ZBTElEICAgICAweDAwMDA4MDAwIC8qIEZXIGVzdGFibGlzaGVkIGEgdmFsaWQgbW9kZSAqLworCisjZGVmaW5lIEUxMDAwX0ZXU01fUlNQQ0lQSFkgICAgICAgIDB4MDAwMDAwNDAgLyogUmVzZXQgUEhZIG9uIFBDSSByZXNldCAqLworI2RlZmluZSBFMTAwMF9GV1NNX0RJU1NXICAgICAgICAgICAweDEwMDAwMDAwIC8qIEZXIGRpc2FibGUgU1cgV3JpdGUgQWNjZXNzICovCisjZGVmaW5lIEUxMDAwX0ZXU01fU0tVU0VMX01BU0sgICAgIDB4NjAwMDAwMDAgLyogTEFOIFNLVSBzZWxlY3QgKi8KKyNkZWZpbmUgRTEwMDBfRldTTV9TS1VFTF9TSElGVCAgICAgMjkKKyNkZWZpbmUgRTEwMDBfRldTTV9TS1VTRUxfRU1CICAgICAgMHgwIC8qIEVtYmVkZGVkIFNLVSAqLworI2RlZmluZSBFMTAwMF9GV1NNX1NLVVNFTF9DT05TICAgICAweDEgLyogQ29uc3VtZXIgU0tVICovCisjZGVmaW5lIEUxMDAwX0ZXU01fU0tVU0VMX1BFUkZfMTAwIDB4MiAvKiBQZXJmICYgQ29ycCAxMC8xMDAgU0tVICovCisjZGVmaW5lIEUxMDAwX0ZXU01fU0tVU0VMX1BFUkZfR0JFIDB4MyAvKiBQZXJmICYgQ29wciBHYkUgU0tVICovCisKKy8qIEZGTFQgRGVidWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfRkZMVF9EQkdfSU5WQyAgICAgMHgwMDEwMDAwMCAvKiBJbnZhbGlkIC9DLyBjb2RlIGhhbmRsaW5nICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfbW5nX21vZGVfbm9uZSAgICAgPSAwLAorICAgIGUxMDAwX21uZ19tb2RlX2FzZiwKKyAgICBlMTAwMF9tbmdfbW9kZV9wdCwKKyAgICBlMTAwMF9tbmdfbW9kZV9pcG1pLAorICAgIGUxMDAwX21uZ19tb2RlX2hvc3RfaW50ZXJmYWNlX29ubHkKK30gZTEwMDBfbW5nX21vZGU7CisKKy8qIEhvc3QgSW50ZWZhY2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9ISUNSX0VOICAgICAgICAgICAweDAwMDAwMDAxICAvKiBFbmFibGUgQml0IC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfSElDUl9DICAgICAgICAgICAgMHgwMDAwMDAwMiAgLyogRHJpdmVyIHNldHMgdGhpcyBiaXQgd2hlbiBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHB1dCBjb21tYW5kIGluIFJBTSAqLworI2RlZmluZSBFMTAwMF9ISUNSX1NWICAgICAgICAgICAweDAwMDAwMDA0ICAvKiBTdGF0dXMgVmFsaWRpdHkgKi8KKyNkZWZpbmUgRTEwMDBfSElDUl9GV1IgICAgICAgICAgMHgwMDAwMDA4MCAgLyogRlcgcmVzZXQuIFNldCBieSB0aGUgSG9zdCAqLworCisvKiBIb3N0IEludGVyZmFjZSBDb21tYW5kIEludGVyZmFjZSAtIEFkZHJlc3MgcmFuZ2UgMHg4ODAwLTB4OEVGRiAqLworI2RlZmluZSBFMTAwMF9ISV9NQVhfREFUQV9MRU5HVEggICAgICAgICAyNTIgLyogSG9zdCBJbnRlcmZhY2UgZGF0YSBsZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfSElfTUFYX0JMT0NLX0JZVEVfTEVOR1RIICAxNzkyIC8qIE51bWJlciBvZiBieXRlcyBpbiByYW5nZSAqLworI2RlZmluZSBFMTAwMF9ISV9NQVhfQkxPQ0tfRFdPUkRfTEVOR1RIICA0NDggLyogTnVtYmVyIG9mIGR3b3JkcyBpbiByYW5nZSAqLworI2RlZmluZSBFMTAwMF9ISV9DT01NQU5EX1RJTUVPVVQgICAgICAgICA1MDAgLyogVGltZSBpbiBtcyB0byBwcm9jZXNzIEhJIGNvbW1hbmQgKi8KKworc3RydWN0IGUxMDAwX2hvc3RfY29tbWFuZF9oZWFkZXIgeworICAgIHVpbnQ4X3QgY29tbWFuZF9pZDsKKyAgICB1aW50OF90IGNvbW1hbmRfbGVuZ3RoOworICAgIHVpbnQ4X3QgY29tbWFuZF9vcHRpb25zOyAgIC8qIEkvRiBiaXRzIGZvciBjb21tYW5kLCBzdGF0dXMgZm9yIHJldHVybiAqLworICAgIHVpbnQ4X3QgY2hlY2tzdW07Cit9Oworc3RydWN0IGUxMDAwX2hvc3RfY29tbWFuZF9pbmZvIHsKKyAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9jb21tYW5kX2hlYWRlciBjb21tYW5kX2hlYWRlcjsgIC8qIENvbW1hbmQgSGVhZC9Db21tYW5kIFJlc3VsdCBIZWFkIGhhcyA0IGJ5dGVzICovCisgICAgdWludDhfdCBjb21tYW5kX2RhdGFbRTEwMDBfSElfTUFYX0RBVEFfTEVOR1RIXTsgICAvKiBDb21tYW5kIGRhdGEgY2FuIGxlbmd0aCAwLi4yNTIgKi8KK307CisKKy8qIEhvc3QgU01CIHJlZ2lzdGVyICMwICovCisjZGVmaW5lIEUxMDAwX0hTTUMwUl9DTEtJTiAgICAgIDB4MDAwMDAwMDEgIC8qIFNNQiBDbG9jayBpbiAqLworI2RlZmluZSBFMTAwMF9IU01DMFJfREFUQUlOICAgICAweDAwMDAwMDAyICAvKiBTTUIgRGF0YSBpbiAqLworI2RlZmluZSBFMTAwMF9IU01DMFJfREFUQU9VVCAgICAweDAwMDAwMDA0ICAvKiBTTUIgRGF0YSBvdXQgKi8KKyNkZWZpbmUgRTEwMDBfSFNNQzBSX0NMS09VVCAgICAgMHgwMDAwMDAwOCAgLyogU01CIENsb2NrIG91dCAqLworCisvKiBIb3N0IFNNQiByZWdpc3RlciAjMSAqLworI2RlZmluZSBFMTAwMF9IU01DMVJfQ0xLSU4gICAgICBFMTAwMF9IU01DMFJfQ0xLSU4KKyNkZWZpbmUgRTEwMDBfSFNNQzFSX0RBVEFJTiAgICAgRTEwMDBfSFNNQzBSX0RBVEFJTgorI2RlZmluZSBFMTAwMF9IU01DMVJfREFUQU9VVCAgICBFMTAwMF9IU01DMFJfREFUQU9VVAorI2RlZmluZSBFMTAwMF9IU01DMVJfQ0xLT1VUICAgICBFMTAwMF9IU01DMFJfQ0xLT1VUCisKKy8qIEZXIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9GV1NUU19GV1NfTUFTSyAgICAweDAwMDAwMEZGICAvKiBGVyBTdGF0dXMgKi8KKworLyogV2FrZSBVcCBQYWNrZXQgTGVuZ3RoICovCisjZGVmaW5lIEUxMDAwX1dVUExfTEVOR1RIX01BU0sgMHgwRkZGICAgLyogT25seSB0aGUgbG93ZXIgMTIgYml0cyBhcmUgdmFsaWQgKi8KKworI2RlZmluZSBFMTAwMF9NREFMSUdOICAgICAgICAgIDQwOTYKKworLyogUENJLUV4IHJlZ2lzdGVycyovCisKKy8qIFBDSS1FeCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0dDUl9SWERfTk9fU05PT1AgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFMTAwMF9HQ1JfUlhEU0NXX05PX1NOT09QICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRTEwMDBfR0NSX1JYRFNDUl9OT19TTk9PUCAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEUxMDAwX0dDUl9UWERfTk9fU05PT1AgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFMTAwMF9HQ1JfVFhEU0NXX05PX1NOT09QICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRTEwMDBfR0NSX1RYRFNDUl9OT19TTk9PUCAgICAgICAweDAwMDAwMDIwCisKKyNkZWZpbmUgUENJX0VYX05PX1NOT09QX0FMTCAoRTEwMDBfR0NSX1JYRF9OT19TTk9PUCAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9HQ1JfUlhEU0NXX05PX1NOT09QICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0dDUl9SWERTQ1JfTk9fU05PT1AgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfR0NSX1RYRF9OT19TTk9PUCAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9HQ1JfVFhEU0NXX05PX1NOT09QICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0dDUl9UWERTQ1JfTk9fU05PT1ApCisKKyNkZWZpbmUgUENJX0VYXzgyNTY2X1NOT09QX0FMTCBQQ0lfRVhfTk9fU05PT1BfQUxMCisKKyNkZWZpbmUgRTEwMDBfR0NSX0wxX0FDVF9XSVRIT1VUX0wwU19SWCAweDA4MDAwMDAwCisvKiBGdW5jdGlvbiBBY3RpdmUgYW5kIFBvd2VyIFN0YXRlIHRvIE1ORyAqLworI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzBfUE9XRVJfU1RBVEVfTUFTSyAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0xBTjBfVkFMSUQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DMF9BVVhfRU4gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzFfUE9XRVJfU1RBVEVfTUFTSyAgICAgICAgIDB4MDAwMDAwQzAKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0ZVTkMxX1BPV0VSX1NUQVRFX1NISUZUICAgICAgICA2CisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19MQU4xX1ZBTElEICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzFfQVVYX0VOICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0ZVTkMyX1BPV0VSX1NUQVRFX01BU0sgICAgICAgICAweDAwMDAzMDAwCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DMl9QT1dFUl9TVEFURV9TSElGVCAgICAgICAgMTIKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0lERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DMl9BVVhfRU4gICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzNfUE9XRVJfU1RBVEVfTUFTSyAgICAgICAgIDB4MDAwQzAwMDAKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0ZVTkMzX1BPV0VSX1NUQVRFX1NISUZUICAgICAgICAxOAorI2RlZmluZSBFMTAwMF9GQUNUUFNfU1BfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX0ZVTkMzX0FVWF9FTiAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19GVU5DNF9QT1dFUl9TVEFURV9NQVNLICAgICAgICAgMHgwMzAwMDAwMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzRfUE9XRVJfU1RBVEVfU0hJRlQgICAgICAgIDI0CisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19JUE1JX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzRfQVVYX0VOICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgRTEwMDBfRkFDVFBTX01OR0NHICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEUxMDAwX0ZBQ1RQU19MQU5fRlVOQ19TRUwgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBFMTAwMF9GQUNUUFNfUE1fU1RBVEVfQ0hBTkdFRCAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworLyogUENJLUV4IENvbmZpZyBTcGFjZSAqLworI2RlZmluZSBQQ0lfRVhfTElOS19TVEFUVVMgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgUENJX0VYX0xJTktfV0lEVEhfTUFTSyAgICAgICAweDNGMAorI2RlZmluZSBQQ0lfRVhfTElOS19XSURUSF9TSElGVCAgICAgIDQKKworLyogRUVQUk9NIENvbW1hbmRzIC0gTWljcm93aXJlICovCisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERV9NSUNST1dJUkUgIDB4NiAgLyogRUVQUk9NIHJlYWQgb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREVfTUlDUk9XSVJFIDB4NSAgLyogRUVQUk9NIHdyaXRlIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fRVJBU0VfT1BDT0RFX01JQ1JPV0lSRSAweDcgIC8qIEVFUFJPTSBlcmFzZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFX01JQ1JPV0lSRSAgMHgxMyAvKiBFRVBST00gZXJhc2Uvd3JpdGUgZW5hYmxlICovCisjZGVmaW5lIEVFUFJPTV9FV0RTX09QQ09ERV9NSUNST1dJUkUgIDB4MTAgLyogRUVQUk9NIGVyYXN0L3dyaXRlIGRpc2FibGUgKi8KKworLyogRUVQUk9NIENvbW1hbmRzIC0gU1BJICovCisjZGVmaW5lIEVFUFJPTV9NQVhfUkVUUllfU1BJICAgICAgICA1MDAwIC8qIE1heCB3YWl0IG9mIDVtcywgZm9yIFJEWSBzaWduYWwgKi8KKyNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFX1NQSSAgICAgIDB4MDMgIC8qIEVFUFJPTSByZWFkIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFX1NQSSAgICAgMHgwMiAgLyogRUVQUk9NIHdyaXRlIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fQThfT1BDT0RFX1NQSSAgICAgICAgMHgwOCAgLyogb3Bjb2RlIGJpdC0zID0gYWRkcmVzcyBiaXQtOCAqLworI2RlZmluZSBFRVBST01fV1JFTl9PUENPREVfU1BJICAgICAgMHgwNiAgLyogRUVQUk9NIHNldCBXcml0ZSBFbmFibGUgbGF0Y2ggKi8KKyNkZWZpbmUgRUVQUk9NX1dSRElfT1BDT0RFX1NQSSAgICAgIDB4MDQgIC8qIEVFUFJPTSByZXNldCBXcml0ZSBFbmFibGUgbGF0Y2ggKi8KKyNkZWZpbmUgRUVQUk9NX1JEU1JfT1BDT0RFX1NQSSAgICAgIDB4MDUgIC8qIEVFUFJPTSByZWFkIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFRVBST01fV1JTUl9PUENPREVfU1BJICAgICAgMHgwMSAgLyogRUVQUk9NIHdyaXRlIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFRVBST01fRVJBU0U0S19PUENPREVfU1BJICAgMHgyMCAgLyogRUVQUk9NIEVSQVNFIDRLQiAqLworI2RlZmluZSBFRVBST01fRVJBU0U2NEtfT1BDT0RFX1NQSSAgMHhEOCAgLyogRUVQUk9NIEVSQVNFIDY0S0IgKi8KKyNkZWZpbmUgRUVQUk9NX0VSQVNFMjU2X09QQ09ERV9TUEkgIDB4REIgIC8qIEVFUFJPTSBFUkFTRSAyNTZCICovCisKKy8qIEVFUFJPTSBTaXplIGRlZmluaXRpb25zICovCisjZGVmaW5lIEVFUFJPTV9XT1JEX1NJWkVfU0hJRlQgIDYKKyNkZWZpbmUgRUVQUk9NX1NJWkVfU0hJRlQgICAgICAgMTAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfTUFTSyAgICAgICAgMHgxQzAwCisKKy8qIEVFUFJPTSBXb3JkIE9mZnNldHMgKi8KKyNkZWZpbmUgRUVQUk9NX0NPTVBBVCAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEVFUFJPTV9JRF9MRURfU0VUVElOR1MgICAgICAgIDB4MDAwNAorI2RlZmluZSBFRVBST01fVkVSU0lPTiAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgRUVQUk9NX1NFUkRFU19BTVBMSVRVREUgICAgICAgMHgwMDA2IC8qIEZvciBTRVJERVMgb3V0cHV0IGFtcGxpdHVkZSBhZGp1c3RtZW50LiAqLworI2RlZmluZSBFRVBST01fUEhZX0NMQVNTX1dPUkQgICAgICAgICAweDAwMDcKKyNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDFfUkVHICAgICAgMHgwMDBBCisjZGVmaW5lIEVFUFJPTV9JTklUX0NPTlRST0wyX1JFRyAgICAgIDB4MDAwRgorI2RlZmluZSBFRVBST01fU1dERUZfUElOU19DVFJMX1BPUlRfMSAweDAwMTAKKyNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDNfUE9SVF9CICAgMHgwMDE0CisjZGVmaW5lIEVFUFJPTV9JTklUXzNHSU9fMyAgICAgICAgICAgIDB4MDAxQQorI2RlZmluZSBFRVBST01fU1dERUZfUElOU19DVFJMX1BPUlRfMCAweDAwMjAKKyNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDNfUE9SVF9BICAgMHgwMDI0CisjZGVmaW5lIEVFUFJPTV9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDAxMgorI2RlZmluZSBFRVBST01fRkxBU0hfVkVSU0lPTiAgICAgICAgICAweDAwMzIKKyNkZWZpbmUgRUVQUk9NX0FMVF9NQUNfQUREUl9QVFIgICAgICAgMHgwMDM3CisjZGVmaW5lIEVFUFJPTV9DSEVDS1NVTV9SRUcgICAgICAgICAgIDB4MDAzRgorCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9DRkdfRE9ORSAgICAgICAgIDB4MDAwNDAwMDAgICAvKiBNTkcgY29uZmlnIGN5Y2xlIGRvbmUgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX0NGR19ET05FX1BPUlRfMSAgMHgwMDA4MDAwMCAgIC8qIC4uLmZvciBzZWNvbmQgcG9ydCAqLworCisvKiBXb3JkIGRlZmluaXRpb25zIGZvciBJRCBMRUQgU2V0dGluZ3MgKi8KKyNkZWZpbmUgSURfTEVEX1JFU0VSVkVEXzAwMDAgMHgwMDAwCisjZGVmaW5lIElEX0xFRF9SRVNFUlZFRF9GRkZGIDB4RkZGRgorI2RlZmluZSBJRF9MRURfUkVTRVJWRURfODI1NzMgIDB4Rjc0NgorI2RlZmluZSBJRF9MRURfREVGQVVMVF84MjU3MyAgIDB4MTgxMQorI2RlZmluZSBJRF9MRURfREVGQVVMVCAgICAgICAoKElEX0xFRF9PRkYxX09OMiA8PCAxMikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURfTEVEX09GRjFfT0ZGMiA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfREVGMV9ERUYyIDw8IDQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9ERUYxX0RFRjIpKQorI2RlZmluZSBJRF9MRURfREVGQVVMVF9JQ0g4TEFOICAoKElEX0xFRF9ERUYxX0RFRjIgPDwgMTIpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9ERUYxX09GRjIgPDwgIDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9ERUYxX09OMiAgPDwgIDQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9ERUYxX0RFRjIpKQorI2RlZmluZSBJRF9MRURfREVGMV9ERUYyICAgICAweDEKKyNkZWZpbmUgSURfTEVEX0RFRjFfT04yICAgICAgMHgyCisjZGVmaW5lIElEX0xFRF9ERUYxX09GRjIgICAgIDB4MworI2RlZmluZSBJRF9MRURfT04xX0RFRjIgICAgICAweDQKKyNkZWZpbmUgSURfTEVEX09OMV9PTjIgICAgICAgMHg1CisjZGVmaW5lIElEX0xFRF9PTjFfT0ZGMiAgICAgIDB4NgorI2RlZmluZSBJRF9MRURfT0ZGMV9ERUYyICAgICAweDcKKyNkZWZpbmUgSURfTEVEX09GRjFfT04yICAgICAgMHg4CisjZGVmaW5lIElEX0xFRF9PRkYxX09GRjIgICAgIDB4OQorCisjZGVmaW5lIElHUF9BQ1RJVklUWV9MRURfTUFTSyAgIDB4RkZGRkYwRkYKKyNkZWZpbmUgSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgMHgwMzAwCisjZGVmaW5lIElHUF9MRUQzX01PREUgICAgICAgICAgIDB4MDcwMDAwMDAKKworCisvKiBNYXNrIGJpdHMgZm9yIFNFUkRFUyBhbXBsaXR1ZGUgYWRqdXN0bWVudCBpbiBXb3JkIDYgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fU0VSREVTX0FNUExJVFVERV9NQVNLICAweDAwMEYKKworLyogTWFzayBiaXQgZm9yIFBIWSBjbGFzcyBpbiBXb3JkIDcgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fUEhZX0NMQVNTX0EgICAweDgwMDAKKworLyogTWFzayBiaXRzIGZvciBmaWVsZHMgaW4gV29yZCAweDBhIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQUk9NX1dPUkQwQV9JTE9TICAgMHgwMDEwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfU1dEUElPIDB4MDFFMAorI2RlZmluZSBFRVBST01fV09SRDBBX0xSU1QgICAweDAyMDAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwQV9GRCAgICAgMHgwNDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfNjZNSFogIDB4MDgwMAorCisvKiBNYXNrIGJpdHMgZm9yIGZpZWxkcyBpbiBXb3JkIDB4MGYgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fV09SRDBGX1BBVVNFX01BU0sgMHgzMDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEZfUEFVU0UgICAgICAweDEwMDAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwRl9BU01fRElSICAgIDB4MjAwMAorI2RlZmluZSBFRVBST01fV09SRDBGX0FORSAgICAgICAgMHgwODAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEZfU1dQRElPX0VYVCAweDAwRjAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwRl9MUExVICAgICAgIDB4MDAwMQorCisvKiBNYXNrIGJpdHMgZm9yIGZpZWxkcyBpbiBXb3JkIDB4MTAvMHgyMCBvZiB0aGUgRUVQUk9NICovCisjZGVmaW5lIEVFUFJPTV9XT1JEMTAyMF9HSUdBX0RJU0FCTEUgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRUVQUk9NX1dPUkQxMDIwX0dJR0FfRElTQUJMRV9OT05fRDBBIDB4MDAwOAorCisvKiBNYXNrIGJpdHMgZm9yIGZpZWxkcyBpbiBXb3JkIDB4MWEgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fV09SRDFBX0FTUE1fTUFTSyAgMHgwMDBDCisKKy8qIEZvciBjaGVja3N1bW1pbmcsIHRoZSBzdW0gb2YgYWxsIHdvcmRzIGluIHRoZSBFRVBST00gc2hvdWxkIGVxdWFsIDB4QkFCQS4gKi8KKyNkZWZpbmUgRUVQUk9NX1NVTSAweEJBQkEKKworLyogRUVQUk9NIE1hcCBkZWZpbmVzIChXT1JEIE9GRlNFVFMpKi8KKyNkZWZpbmUgRUVQUk9NX05PREVfQUREUkVTU19CWVRFXzAgMAorI2RlZmluZSBFRVBST01fUEJBX0JZVEVfMSAgICAgICAgICA4CisKKyNkZWZpbmUgRUVQUk9NX1JFU0VSVkVEX1dPUkQgICAgICAgICAgMHhGRkZGCisKKy8qIEVFUFJPTSBNYXAgU2l6ZXMgKEJ5dGUgQ291bnRzKSAqLworI2RlZmluZSBQQkFfU0laRSA0CisKKy8qIENvbGxpc2lvbiByZWxhdGVkIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworI2RlZmluZSBFMTAwMF9DT0xMSVNJT05fVEhSRVNIT0xEICAgICAgIDE1CisjZGVmaW5lIEUxMDAwX0NUX1NISUZUICAgICAgICAgICAgICAgICAgNAorLyogQ29sbGlzaW9uIGRpc3RhbmNlIGlzIGEgMC1iYXNlZCB2YWx1ZSB0aGF0IGFwcGxpZXMgdG8KKyAqIGhhbGYtZHVwbGV4LWNhcGFibGUgaGFyZHdhcmUgb25seS4gKi8KKyNkZWZpbmUgRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFICAgICAgICA2MworI2RlZmluZSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0VfODI1NDIgIDY0CisjZGVmaW5lIEUxMDAwX0ZEWF9DT0xMSVNJT05fRElTVEFOQ0UgICAgRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFCisjZGVmaW5lIEUxMDAwX0hEWF9DT0xMSVNJT05fRElTVEFOQ0UgICAgRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFCisjZGVmaW5lIEUxMDAwX0NPTERfU0hJRlQgICAgICAgICAgICAgICAgMTIKKworLyogTnVtYmVyIG9mIFRyYW5zbWl0IGFuZCBSZWNlaXZlIERlc2NyaXB0b3JzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4ICovCisjZGVmaW5lIFJFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFICA4CisjZGVmaW5lIFJFUV9SWF9ERVNDUklQVE9SX01VTFRJUExFICA4CisKKy8qIERlZmF1bHQgdmFsdWVzIGZvciB0aGUgdHJhbnNtaXQgSVBHIHJlZ2lzdGVyICovCisjZGVmaW5lIERFRkFVTFRfODI1NDJfVElQR19JUEdUICAgICAgICAxMAorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHVF9GSUJFUiAgOQorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHVF9DT1BQRVIgOAorCisjZGVmaW5lIEUxMDAwX1RJUEdfSVBHVF9NQVNLICAweDAwMDAwM0ZGCisjZGVmaW5lIEUxMDAwX1RJUEdfSVBHUjFfTUFTSyAweDAwMEZGQzAwCisjZGVmaW5lIEUxMDAwX1RJUEdfSVBHUjJfTUFTSyAweDNGRjAwMDAwCisKKyNkZWZpbmUgREVGQVVMVF84MjU0Ml9USVBHX0lQR1IxIDIKKyNkZWZpbmUgREVGQVVMVF84MjU0M19USVBHX0lQR1IxIDgKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMV9TSElGVCAgMTAKKworI2RlZmluZSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjIgMTAKKyNkZWZpbmUgREVGQVVMVF84MjU0M19USVBHX0lQR1IyIDYKKyNkZWZpbmUgREVGQVVMVF84MDAwM0VTMkxBTl9USVBHX0lQR1IyIDcKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMl9TSElGVCAgMjAKKworI2RlZmluZSBERUZBVUxUXzgwMDAzRVMyTEFOX1RJUEdfSVBHVF8xMF8xMDAgMHgwMDAwMDAwOQorI2RlZmluZSBERUZBVUxUXzgwMDAzRVMyTEFOX1RJUEdfSVBHVF8xMDAwICAgMHgwMDAwMDAwOAorI2RlZmluZSBFMTAwMF9UWERNQUNfRFBQIDB4MDAwMDAwMDEKKworLyogQWRhcHRpdmUgSUZTIGRlZmluZXMgKi8KKyNkZWZpbmUgVFhfVEhSRVNIT0xEX1NUQVJUICAgICA4CisjZGVmaW5lIFRYX1RIUkVTSE9MRF9JTkNSRU1FTlQgMTAKKyNkZWZpbmUgVFhfVEhSRVNIT0xEX0RFQ1JFTUVOVCAxCisjZGVmaW5lIFRYX1RIUkVTSE9MRF9TVE9QICAgICAgMTkwCisjZGVmaW5lIFRYX1RIUkVTSE9MRF9ESVNBQkxFICAgMAorI2RlZmluZSBUWF9USFJFU0hPTERfVElNRVJfTVMgIDEwMDAwCisjZGVmaW5lIE1JTl9OVU1fWE1JVFMgICAgICAgICAgMTAwMAorI2RlZmluZSBJRlNfTUFYICAgICAgICAgICAgICAgIDgwCisjZGVmaW5lIElGU19TVEVQICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgSUZTX01JTiAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBJRlNfUkFUSU8gICAgICAgICAgICAgIDQKKworLyogRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBDb250cm9sIGFuZCBTaXplICovCisjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX1BDSUVfV1JJVEVfRU5BQkxFIDB4MDAwMDAwMDEKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfUEhZX1dSSVRFX0VOQUJMRSAgMHgwMDAwMDAwMgorI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTF9EX1VEX0VOQUJMRSAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX0RfVURfTEFURU5DWSAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfRF9VRF9PV05FUiAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTF9NRElPX1NXX09XTkVSU0hJUCAweDAwMDAwMDIwCisjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX01ESU9fSFdfT1dORVJTSElQIDB4MDAwMDAwNDAKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfRVhUX0NORl9QT0lOVEVSICAgMHgwRkZGMDAwMAorCisjZGVmaW5lIEUxMDAwX0VYVENORl9TSVpFX0VYVF9QSFlfTEVOR1RIICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX1NJWkVfRVhUX0RPQ0tfTEVOR1RIICAgMHgwMDAwRkYwMAorI2RlZmluZSBFMTAwMF9FWFRDTkZfU0laRV9FWFRfUENJRV9MRU5HVEggICAweDAwRkYwMDAwCisjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX0xDRF9XUklURV9FTkFCTEUgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfU1dGTEFHICAgICAgICAgICAgMHgwMDAwMDAyMAorCisvKiBQQkEgY29uc3RhbnRzICovCisjZGVmaW5lIEUxMDAwX1BCQV84SyAweDAwMDggICAgLyogOEtCLCBkZWZhdWx0IFJ4IGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgRTEwMDBfUEJBXzEySyAweDAwMEMgICAgLyogMTJLQiwgZGVmYXVsdCBSeCBhbGxvY2F0aW9uICovCisjZGVmaW5lIEUxMDAwX1BCQV8xNksgMHgwMDEwICAgIC8qIDE2S0IsIGRlZmF1bHQgVFggYWxsb2NhdGlvbiAqLworI2RlZmluZSBFMTAwMF9QQkFfMjBLIDB4MDAxNAorI2RlZmluZSBFMTAwMF9QQkFfMjJLIDB4MDAxNgorI2RlZmluZSBFMTAwMF9QQkFfMjRLIDB4MDAxOAorI2RlZmluZSBFMTAwMF9QQkFfMzBLIDB4MDAxRQorI2RlZmluZSBFMTAwMF9QQkFfMzJLIDB4MDAyMAorI2RlZmluZSBFMTAwMF9QQkFfMzRLIDB4MDAyMgorI2RlZmluZSBFMTAwMF9QQkFfMzhLIDB4MDAyNgorI2RlZmluZSBFMTAwMF9QQkFfNDBLIDB4MDAyOAorI2RlZmluZSBFMTAwMF9QQkFfNDhLIDB4MDAzMCAgICAvKiA0OEtCLCBkZWZhdWx0IFJYIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgRTEwMDBfUEJBXzY0SyAweDAwNDAgICAgLyogNjRLQiAqLworCisjZGVmaW5lIEUxMDAwX1BCU18xNksgRTEwMDBfUEJBXzE2SworCisvKiBGbG93IENvbnRyb2wgQ29uc3RhbnRzICovCisjZGVmaW5lIEZMT1dfQ09OVFJPTF9BRERSRVNTX0xPVyAgMHgwMEMyODAwMQorI2RlZmluZSBGTE9XX0NPTlRST0xfQUREUkVTU19ISUdIIDB4MDAwMDAxMDAKKyNkZWZpbmUgRkxPV19DT05UUk9MX1RZUEUgICAgICAgICAweDg4MDgKKworLyogVGhlIGhpc3RvcmljYWwgZGVmYXVsdHMgZm9yIHRoZSBmbG93IGNvbnRyb2wgdmFsdWVzIGFyZSBnaXZlbiBiZWxvdy4gKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9ISV9USFJFU0ggICAgICAgICgweDgwMDApICAgIC8qIDMyS0IgKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9MT19USFJFU0ggICAgICAgICgweDQwMDApICAgIC8qIDE2S0IgKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9UWF9USU1FUiAgICAgICAgICgweDEwMCkgICAgIC8qIH4xMzAgdXMgKi8KKworLyogUENJWCBDb25maWcgc3BhY2UgKi8KKyNkZWZpbmUgUENJWF9DT01NQU5EX1JFR0lTVEVSICAgIDB4RTYKKyNkZWZpbmUgUENJWF9TVEFUVVNfUkVHSVNURVJfTE8gIDB4RTgKKyNkZWZpbmUgUENJWF9TVEFUVVNfUkVHSVNURVJfSEkgIDB4RUEKKworI2RlZmluZSBQQ0lYX0NPTU1BTkRfTU1SQkNfTUFTSyAgICAgIDB4MDAwQworI2RlZmluZSBQQ0lYX0NPTU1BTkRfTU1SQkNfU0hJRlQgICAgIDB4MgorI2RlZmluZSBQQ0lYX1NUQVRVU19ISV9NTVJCQ19NQVNLICAgIDB4MDA2MAorI2RlZmluZSBQQ0lYX1NUQVRVU19ISV9NTVJCQ19TSElGVCAgIDB4NQorI2RlZmluZSBQQ0lYX1NUQVRVU19ISV9NTVJCQ180SyAgICAgIDB4MworI2RlZmluZSBQQ0lYX1NUQVRVU19ISV9NTVJCQ18ySyAgICAgIDB4MgorCisKKy8qIE51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHNoaWZ0IHJpZ2h0IHRoZSAicGF1c2UiIGJpdHMgZnJvbSB0aGUKKyAqIEVFUFJPTSAoYml0cyAxMzoxMikgdG8gdGhlICJwYXVzZSIgKGJpdHMgODo3KSBmaWVsZCBpbiB0aGUgVFhDVyByZWdpc3Rlci4KKyAqLworI2RlZmluZSBQQVVTRV9TSElGVCA1CisKKy8qIE51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHNoaWZ0IGxlZnQgdGhlICJTV0RQSU8iIGJpdHMgZnJvbSB0aGUKKyAqIEVFUFJPTSAoYml0cyA4OjUpIHRvIHRoZSAiU1dEUElPIiAoYml0cyAyNToyMikgZmllbGQgaW4gdGhlIENUUkwgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU1dEUElPX1NISUZUIDE3CisKKy8qIE51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHNoaWZ0IGxlZnQgdGhlICJTV0RQSU9fRVhUIiBiaXRzIGZyb20gdGhlCisgKiBFRVBST00gd29yZCBGIChiaXRzIDc6NCkgdG8gdGhlIGJpdHMgMTE6OCBvZiBUaGUgRXh0ZW5kZWQgQ1RSTCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTV0RQSU9fX0VYVF9TSElGVCA0CisKKy8qIE51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHNoaWZ0IGxlZnQgdGhlICJJTE9TIiBiaXQgZnJvbSB0aGUgRUVQUk9NCisgKiAoYml0IDQpIHRvIHRoZSAiSUxPUyIgKGJpdCA3KSBmaWVsZCBpbiB0aGUgQ1RSTCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBJTE9TX1NISUZUICAzCisKKworI2RlZmluZSBSRUNFSVZFX0JVRkZFUl9BTElHTl9TSVpFICAoMjU2KQorCisvKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdlIHdhaXQgZm9yIGF1dG8tbmVnb3RpYXRpb24gdG8gY29tcGxldGUgKi8KKyNkZWZpbmUgTElOS19VUF9USU1FT1VUICAgICAgICAgICAgIDUwMAorCisvKiBOdW1iZXIgb2YgMTAwIG1pY3Jvc2Vjb25kcyB3ZSB3YWl0IGZvciBQQ0kgRXhwcmVzcyBtYXN0ZXIgZGlzYWJsZSAqLworI2RlZmluZSBNQVNURVJfRElTQUJMRV9USU1FT1VUICAgICAgODAwCisvKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdlIHdhaXQgZm9yIEVlcHJvbSBhdXRvIHJlYWQgYml0IGRvbmUgYWZ0ZXIgTUFDIHJlc2V0ICovCisjZGVmaW5lIEFVVE9fUkVBRF9ET05FX1RJTUVPVVQgICAgICAxMAorLyogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3ZSB3YWl0IGZvciBQSFkgY29uZmlndXJhdGlvbiBkb25lIGFmdGVyIE1BQyByZXNldCAqLworI2RlZmluZSBQSFlfQ0ZHX1RJTUVPVVQgICAgICAgICAgICAgMTAwCisKKyNkZWZpbmUgRTEwMDBfVFhfQlVGRkVSX1NJWkUgKCh1aW50MzJfdCkxNTE0KQorCisvKiBUaGUgY2FycmllciBleHRlbnNpb24gc3ltYm9sLCBhcyByZWNlaXZlZCBieSB0aGUgTklDLiAqLworI2RlZmluZSBDQVJSSUVSX0VYVEVOU0lPTiAgIDB4MEYKKworLyogVEJJX0FDQ0VQVCBtYWNybyBkZWZpbml0aW9uOgorICoKKyAqIFRoaXMgbWFjcm8gcmVxdWlyZXM6CisgKiAgICAgIGFkYXB0ZXIgPSBhIHBvaW50ZXIgdG8gc3RydWN0IGUxMDAwX2h3CisgKiAgICAgIHN0YXR1cyA9IHRoZSA4IGJpdCBzdGF0dXMgZmllbGQgb2YgdGhlIFJYIGRlc2NyaXB0b3Igd2l0aCBFT1Agc2V0CisgKiAgICAgIGVycm9yID0gdGhlIDggYml0IGVycm9yIGZpZWxkIG9mIHRoZSBSWCBkZXNjcmlwdG9yIHdpdGggRU9QIHNldAorICogICAgICBsZW5ndGggPSB0aGUgc3VtIG9mIGFsbCB0aGUgbGVuZ3RoIGZpZWxkcyBvZiB0aGUgUlggZGVzY3JpcHRvcnMgdGhhdAorICogICAgICAgICAgICAgICBtYWtlIHVwIHRoZSBjdXJyZW50IGZyYW1lCisgKiAgICAgIGxhc3RfYnl0ZSA9IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGZyYW1lIERNQWVkIGJ5IHRoZSBoYXJkd2FyZQorICogICAgICBtYXhfZnJhbWVfbGVuZ3RoID0gdGhlIG1heGltdW0gZnJhbWUgbGVuZ3RoIHdlIHdhbnQgdG8gYWNjZXB0LgorICogICAgICBtaW5fZnJhbWVfbGVuZ3RoID0gdGhlIG1pbmltdW0gZnJhbWUgbGVuZ3RoIHdlIHdhbnQgdG8gYWNjZXB0LgorICoKKyAqIFRoaXMgbWFjcm8gaXMgYSBjb25kaXRpb25hbCB0aGF0IHNob3VsZCBiZSB1c2VkIGluIHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIncyBSeCBwcm9jZXNzaW5nIHJvdXRpbmUgd2hlbiBSeEVycm9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQuCisgKgorICogVHlwaWNhbCB1c2U6CisgKiAgLi4uCisgKiAgaWYgKFRCSV9BQ0NFUFQpIHsKKyAqICAgICAgYWNjZXB0X2ZyYW1lID0gVFJVRTsKKyAqICAgICAgZTEwMDBfdGJpX2FkanVzdF9zdGF0cyhhZGFwdGVyLCBNYWNBZGRyZXNzKTsKKyAqICAgICAgZnJhbWVfbGVuZ3RoLS07CisgKiAgfSBlbHNlIHsKKyAqICAgICAgYWNjZXB0X2ZyYW1lID0gRkFMU0U7CisgKiAgfQorICogIC4uLgorICovCisKKyNkZWZpbmUgVEJJX0FDQ0VQVChhZGFwdGVyLCBzdGF0dXMsIGVycm9ycywgbGVuZ3RoLCBsYXN0X2J5dGUpIFwKKyAgICAoKGFkYXB0ZXIpLT50YmlfY29tcGF0aWJpbGl0eV9vbiAmJiBcCisgICAgICgoKGVycm9ycykgJiBFMTAwMF9SWERfRVJSX0ZSQU1FX0VSUl9NQVNLKSA9PSBFMTAwMF9SWERfRVJSX0NFKSAmJiBcCisgICAgICgobGFzdF9ieXRlKSA9PSBDQVJSSUVSX0VYVEVOU0lPTikgJiYgXAorICAgICAoKChzdGF0dXMpICYgRTEwMDBfUlhEX1NUQVRfVlApID8gXAorICAgICAgICAgICgoKGxlbmd0aCkgPiAoKGFkYXB0ZXIpLT5taW5fZnJhbWVfc2l6ZSAtIFZMQU5fVEFHX1NJWkUpKSAmJiBcCisgICAgICAgICAgICgobGVuZ3RoKSA8PSAoKGFkYXB0ZXIpLT5tYXhfZnJhbWVfc2l6ZSArIDEpKSkgOiBcCisgICAgICAgICAgKCgobGVuZ3RoKSA+IChhZGFwdGVyKS0+bWluX2ZyYW1lX3NpemUpICYmIFwKKyAgICAgICAgICAgKChsZW5ndGgpIDw9ICgoYWRhcHRlciktPm1heF9mcmFtZV9zaXplICsgVkxBTl9UQUdfU0laRSArIDEpKSkpKQorCisKKy8qIFN0cnVjdHVyZXMsIGVudW1zLCBhbmQgbWFjcm9zIGZvciB0aGUgUEhZICovCisKKy8qIEJpdCBkZWZpbml0aW9ucyBmb3IgdGhlIE1hbmFnZW1lbnQgRGF0YSBJTyAoTURJTykgYW5kIE1hbmFnZW1lbnQgRGF0YQorICogQ2xvY2sgKE1EQykgcGlucyBpbiB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9QSFlfUkVTRVRfRElSICBFMTAwMF9DVFJMX1NXRFBJTzAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9QSFlfUkVTRVQgICAgICBFMTAwMF9DVFJMX1NXRFBJTjAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9NRElPX0RJUiAgICAgICBFMTAwMF9DVFJMX1NXRFBJTzIKKyNkZWZpbmUgRTEwMDBfQ1RSTF9NRElPICAgICAgICAgICBFMTAwMF9DVFJMX1NXRFBJTjIKKyNkZWZpbmUgRTEwMDBfQ1RSTF9NRENfRElSICAgICAgICBFMTAwMF9DVFJMX1NXRFBJTzMKKyNkZWZpbmUgRTEwMDBfQ1RSTF9NREMgICAgICAgICAgICBFMTAwMF9DVFJMX1NXRFBJTjMKKyNkZWZpbmUgRTEwMDBfQ1RSTF9QSFlfUkVTRVRfRElSNCBFMTAwMF9DVFJMX0VYVF9TRFA0X0RJUgorI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SRVNFVDQgICAgIEUxMDAwX0NUUkxfRVhUX1NEUDRfREFUQQorCisvKiBQSFkgMTAwMCBNSUkgUmVnaXN0ZXIvQml0IERlZmluaXRpb25zICovCisvKiBQSFkgUmVnaXN0ZXJzIGRlZmluZWQgYnkgSUVFRSAqLworI2RlZmluZSBQSFlfQ1RSTCAgICAgICAgIDB4MDAgLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfU1RBVFVTICAgICAgIDB4MDEgLyogU3RhdHVzIFJlZ2lzZXIgKi8KKyNkZWZpbmUgUEhZX0lEMSAgICAgICAgICAweDAyIC8qIFBoeSBJZCBSZWcgKHdvcmQgMSkgKi8KKyNkZWZpbmUgUEhZX0lEMiAgICAgICAgICAweDAzIC8qIFBoeSBJZCBSZWcgKHdvcmQgMikgKi8KKyNkZWZpbmUgUEhZX0FVVE9ORUdfQURWICAweDA0IC8qIEF1dG9uZWcgQWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBQSFlfTFBfQUJJTElUWSAgIDB4MDUgLyogTGluayBQYXJ0bmVyIEFiaWxpdHkgKEJhc2UgUGFnZSkgKi8KKyNkZWZpbmUgUEhZX0FVVE9ORUdfRVhQICAweDA2IC8qIEF1dG9uZWcgRXhwYW5zaW9uIFJlZyAqLworI2RlZmluZSBQSFlfTkVYVF9QQUdFX1RYIDB4MDcgLyogTmV4dCBQYWdlIFRYICovCisjZGVmaW5lIFBIWV9MUF9ORVhUX1BBR0UgMHgwOCAvKiBMaW5rIFBhcnRuZXIgTmV4dCBQYWdlICovCisjZGVmaW5lIFBIWV8xMDAwVF9DVFJMICAgMHgwOSAvKiAxMDAwQmFzZS1UIENvbnRyb2wgUmVnICovCisjZGVmaW5lIFBIWV8xMDAwVF9TVEFUVVMgMHgwQSAvKiAxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgUEhZX0VYVF9TVEFUVVMgICAweDBGIC8qIEV4dGVuZGVkIFN0YXR1cyBSZWcgKi8KKworI2RlZmluZSBNQVhfUEhZX1JFR19BRERSRVNTICAgICAgICAweDFGICAvKiA1IGJpdCBhZGRyZXNzIGJ1cyAoMC0weDFGKSAqLworI2RlZmluZSBNQVhfUEhZX01VTFRJX1BBR0VfUkVHICAgICAweEYgICAvKiBSZWdpc3RlcnMgZXF1YWwgb24gYWxsIHBhZ2VzICovCisKKy8qIE04OEUxMDAwIFNwZWNpZmljIFJlZ2lzdGVycyAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19DVFJMICAgICAweDEwICAvKiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMgICAweDExICAvKiBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX0lOVF9FTkFCTEUgICAgICAgIDB4MTIgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfSU5UX1NUQVRVUyAgICAgICAgMHgxMyAgLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCAweDE0ICAvKiBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCAqLworI2RlZmluZSBNODhFMTAwMF9SWF9FUlJfQ05UUiAgICAgICAweDE1ICAvKiBSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKworI2RlZmluZSBNODhFMTAwMF9QSFlfRVhUX0NUUkwgICAgICAweDFBICAvKiBQSFkgZXh0ZW5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNUICAgMHgxRCAgLyogUmVnIDI5IGZvciBwYWdlIG51bWJlciBzZXR0aW5nICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCAgIDB4MUUgIC8qIEl0cyBtZWFuaW5nIGRlcGVuZHMgb24gcmVnIDI5ICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDggIDB4MTAwIC8qIEJpdHMgOCAmIDExIGFyZSBhZGp1c3RlZCBmb3IgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUMTEgMHg4MDAgICAgLyogaW1wcm92ZWQgQkVSIHBlcmZvcm1hbmNlICovCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9JRUVFX1JFR1NfUEFHRSAgMHgwMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfSUVFRV9SRVNUQVJUX0FVVE9ORUcgMHgzMzAwCisjZGVmaW5lIElHUDAxRTEwMDBfSUVFRV9GT1JDRV9HSUdBICAgICAgMHgwMTQwCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUmVnaXN0ZXJzICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHIDB4MTAgLyogUEhZIFNwZWNpZmljIFBvcnQgQ29uZmlnIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTIDB4MTEgLyogUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwgICAweDEyIC8qIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0xJTktfSEVBTFRIIDB4MTMgLyogUEhZIExpbmsgSGVhbHRoIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfR01JSV9GSUZPICAgICAgIDB4MTQgLyogR01JSSBGSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfUVVBTElUWSAweDE1IC8qIFBIWSBDaGFubmVsIFF1YWxpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCAgICAgIDB4MTkKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QgICAgIDB4MUYgLyogUEhZIFBhZ2UgU2VsZWN0IENvcmUgUmVnaXN0ZXIgKi8KKworLyogSUdQMDFFMTAwMCBBR0MgUmVnaXN0ZXJzIC0gc3RvcmVzIHRoZSBjYWJsZSBsZW5ndGggdmFsdWVzKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX0EgICAgICAgIDB4MTE3MgorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfQiAgICAgICAgMHgxMjcyCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19DICAgICAgICAweDE0NzIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX0QgICAgICAgIDB4MTg3MgorCisvKiBJR1AwMkUxMDAwIEFHQyBSZWdpc3RlcnMgZm9yIGNhYmxlIGxlbmd0aCB2YWx1ZXMgKi8KKyNkZWZpbmUgSUdQMDJFMTAwMF9QSFlfQUdDX0EgICAgICAgIDB4MTFCMQorI2RlZmluZSBJR1AwMkUxMDAwX1BIWV9BR0NfQiAgICAgICAgMHgxMkIxCisjZGVmaW5lIElHUDAyRTEwMDBfUEhZX0FHQ19DICAgICAgICAweDE0QjEKKyNkZWZpbmUgSUdQMDJFMTAwMF9QSFlfQUdDX0QgICAgICAgIDB4MThCMQorCisvKiBJR1AwMUUxMDAwIERTUCBSZXNldCBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfUkVTRVQgICAweDFGMzMKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRFNQX1NFVCAgICAgMHgxRjcxCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9GRkUgICAgIDB4MUYzNQorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNICAgIDQKKyNkZWZpbmUgSUdQMDJFMTAwMF9QSFlfQ0hBTk5FTF9OVU0gICAgNAorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9BICAgIDB4MTE3MQorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQiAgICAweDEyNzEKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0MgICAgMHgxNDcxCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9EICAgIDB4MTg3MQorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0VEQUNfTVVfSU5ERVggICAgICAgIDB4QzAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9FREFDX1NJR05fRVhUXzlfQklUUyAweDgwMDAKKworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BTkFMT0dfVFhfU1RBVEUgICAgICAweDI4OTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQU5BTE9HX0NMQVNTX0EgICAgICAgMHgyMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0ZPUkNFX0FOQUxPR19FTkFCTEUgIDB4MDAwNAorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFX0NNX0NQICAgICAgICAweDAwNjkKKworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFX0RFRkFVTFQgICAgICAweDAwMkEKKy8qIElHUDAxRTEwMDAgUENTIEluaXRpYWxpemF0aW9uIHJlZ2lzdGVyIC0gc3RvcmVzIHRoZSBwb2xhcml0eSBzdGF0dXMgd2hlbgorICogc3BlZWQgPSAxMDAwIE1icHMuICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRyAgMHgwMEI0CisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BDU19DVFJMX1JFRyAgMHgwMEI1CisKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfUkVHU19QQUdFICAweDIwQzAKKworLyogQml0cy4uLgorICogMTUtNTogcGFnZQorICogNC0wOiByZWdpc3RlciBvZmZzZXQKKyAqLworI2RlZmluZSBHRzgyNTYzX1BBR0VfU0hJRlQgICAgICAgIDUKKyNkZWZpbmUgR0c4MjU2M19SRUcocGFnZSwgcmVnKSAgICBcCisgICAgICAgICgoKHBhZ2UpIDw8IEdHODI1NjNfUEFHRV9TSElGVCkgfCAoKHJlZykgJiBNQVhfUEhZX1JFR19BRERSRVNTKSkKKyNkZWZpbmUgR0c4MjU2M19NSU5fQUxUX1JFRyAgICAgICAzMAorCisvKiBHRzgyNTYzIFNwZWNpZmljIFJlZ2lzdGVycyAqLworI2RlZmluZSBHRzgyNTYzX1BIWV9TUEVDX0NUUkwgICAgICAgICAgIFwKKyAgICAgICAgR0c4MjU2M19SRUcoMCwgMTYpIC8qIFBIWSBTcGVjaWZpYyBDb250cm9sICovCisjZGVmaW5lIEdHODI1NjNfUEhZX1NQRUNfU1RBVFVTICAgICAgICAgXAorICAgICAgICBHRzgyNTYzX1JFRygwLCAxNykgLyogUEhZIFNwZWNpZmljIFN0YXR1cyAqLworI2RlZmluZSBHRzgyNTYzX1BIWV9JTlRfRU5BQkxFICAgICAgICAgIFwKKyAgICAgICAgR0c4MjU2M19SRUcoMCwgMTgpIC8qIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgR0c4MjU2M19QSFlfU1BFQ19TVEFUVVNfMiAgICAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDAsIDE5KSAvKiBQSFkgU3BlY2lmaWMgU3RhdHVzIDIgKi8KKyNkZWZpbmUgR0c4MjU2M19QSFlfUlhfRVJSX0NOVFIgICAgICAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDAsIDIxKSAvKiBSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgR0c4MjU2M19QSFlfUEFHRV9TRUxFQ1QgICAgICAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDAsIDIyKSAvKiBQYWdlIFNlbGVjdCAqLworI2RlZmluZSBHRzgyNTYzX1BIWV9TUEVDX0NUUkxfMiAgICAgICAgIFwKKyAgICAgICAgR0c4MjU2M19SRUcoMCwgMjYpIC8qIFBIWSBTcGVjaWZpYyBDb250cm9sIDIgKi8KKyNkZWZpbmUgR0c4MjU2M19QSFlfUEFHRV9TRUxFQ1RfQUxUICAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDAsIDI5KSAvKiBBbHRlcm5hdGUgUGFnZSBTZWxlY3QgKi8KKyNkZWZpbmUgR0c4MjU2M19QSFlfVEVTVF9DTEtfQ1RSTCAgICAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDAsIDMwKSAvKiBUZXN0IENsb2NrIENvbnRyb2wgKHVzZSByZWcuIDI5IHRvIHNlbGVjdCkgKi8KKworI2RlZmluZSBHRzgyNTYzX1BIWV9NQUNfU1BFQ19DVFJMICAgICAgIFwKKyAgICAgICAgR0c4MjU2M19SRUcoMiwgMjEpIC8qIE1BQyBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEdHODI1NjNfUEhZX01BQ19TUEVDX0NUUkxfMiAgICAgXAorICAgICAgICBHRzgyNTYzX1JFRygyLCAyNikgLyogTUFDIFNwZWNpZmljIENvbnRyb2wgMiAqLworCisjZGVmaW5lIEdHODI1NjNfUEhZX0RTUF9ESVNUQU5DRSAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDUsIDI2KSAvKiBEU1AgRGlzdGFuY2UgKi8KKworLyogUGFnZSAxOTMgLSBQb3J0IENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdHODI1NjNfUEhZX0tNUk5fTU9ERV9DVFJMICAgXAorICAgICAgICBHRzgyNTYzX1JFRygxOTMsIDE2KSAvKiBLdW1lcmFuIE1vZGUgQ29udHJvbCAqLworI2RlZmluZSBHRzgyNTYzX1BIWV9QT1JUX1JFU0VUICAgICAgICAgIFwKKyAgICAgICAgR0c4MjU2M19SRUcoMTkzLCAxNykgLyogUG9ydCBSZXNldCAqLworI2RlZmluZSBHRzgyNTYzX1BIWV9SRVZJU0lPTl9JRCAgICAgICAgIFwKKyAgICAgICAgR0c4MjU2M19SRUcoMTkzLCAxOCkgLyogUmV2aXNpb24gSUQgKi8KKyNkZWZpbmUgR0c4MjU2M19QSFlfREVWSUNFX0lEICAgICAgICAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDE5MywgMTkpIC8qIERldmljZSBJRCAqLworI2RlZmluZSBHRzgyNTYzX1BIWV9QV1JfTUdNVF9DVFJMICAgICAgIFwKKyAgICAgICAgR0c4MjU2M19SRUcoMTkzLCAyMCkgLyogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sICovCisjZGVmaW5lIEdHODI1NjNfUEhZX1JBVEVfQURBUFRfQ1RSTCAgICAgXAorICAgICAgICBHRzgyNTYzX1JFRygxOTMsIDI1KSAvKiBSYXRlIEFkYXB0YXRpb24gQ29udHJvbCAqLworCisvKiBQYWdlIDE5NCAtIEtNUk4gUmVnaXN0ZXJzICovCisjZGVmaW5lIEdHODI1NjNfUEhZX0tNUk5fRklGT19DVFJMX1NUQVQgXAorICAgICAgICBHRzgyNTYzX1JFRygxOTQsIDE2KSAvKiBGSUZPJ3MgQ29udHJvbC9TdGF0dXMgKi8KKyNkZWZpbmUgR0c4MjU2M19QSFlfS01STl9DVFJMICAgICAgICAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDE5NCwgMTcpIC8qIENvbnRyb2wgKi8KKyNkZWZpbmUgR0c4MjU2M19QSFlfSU5CQU5EX0NUUkwgICAgICAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDE5NCwgMTgpIC8qIEluYmFuZCBDb250cm9sICovCisjZGVmaW5lIEdHODI1NjNfUEhZX0tNUk5fRElBR05PU1RJQyAgICAgXAorICAgICAgICBHRzgyNTYzX1JFRygxOTQsIDE5KSAvKiBEaWFnbm9zdGljICovCisjZGVmaW5lIEdHODI1NjNfUEhZX0FDS19USU1FT1VUUyAgICAgICAgXAorICAgICAgICBHRzgyNTYzX1JFRygxOTQsIDIwKSAvKiBBY2tub3dsZWRnZSBUaW1lb3V0cyAqLworI2RlZmluZSBHRzgyNTYzX1BIWV9BRFZfQUJJTElUWSAgICAgICAgIFwKKyAgICAgICAgR0c4MjU2M19SRUcoMTk0LCAyMSkgLyogQWR2ZXJ0aXNlZCBBYmlsaXR5ICovCisjZGVmaW5lIEdHODI1NjNfUEhZX0xJTktfUEFSVE5FUl9BRFZfQUJJTElUWSBcCisgICAgICAgIEdHODI1NjNfUkVHKDE5NCwgMjMpIC8qIExpbmsgUGFydG5lciBBZHZlcnRpc2VkIEFiaWxpdHkgKi8KKyNkZWZpbmUgR0c4MjU2M19QSFlfQURWX05FWFRfUEFHRSAgICAgICBcCisgICAgICAgIEdHODI1NjNfUkVHKDE5NCwgMjQpIC8qIEFkdmVydGlzZWQgTmV4dCBQYWdlICovCisjZGVmaW5lIEdHODI1NjNfUEhZX0xJTktfUEFSVE5FUl9BRFZfTkVYVF9QQUdFIFwKKyAgICAgICAgR0c4MjU2M19SRUcoMTk0LCAyNSkgLyogTGluayBQYXJ0bmVyIEFkdmVydGlzZWQgTmV4dCBwYWdlICovCisjZGVmaW5lIEdHODI1NjNfUEhZX0tNUk5fTUlTQyAgICAgICAgICAgXAorICAgICAgICBHRzgyNTYzX1JFRygxOTQsIDI2KSAvKiBNaXNjLiAqLworCisvKiBQSFkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQ1JfU1BFRURfU0VMRUNUX01TQiAweDAwNDAgIC8qIGJpdHMgNiwxMzogMTA9MTAwMCwgMDE9MTAwLCAwMD0xMCAqLworI2RlZmluZSBNSUlfQ1JfQ09MTF9URVNUX0VOQUJMRSAweDAwODAgIC8qIENvbGxpc2lvbiB0ZXN0IGVuYWJsZSAqLworI2RlZmluZSBNSUlfQ1JfRlVMTF9EVVBMRVggICAgICAweDAxMDAgIC8qIEZEWCA9MSwgaGFsZiBkdXBsZXggPTAgKi8KKyNkZWZpbmUgTUlJX0NSX1JFU1RBUlRfQVVUT19ORUcgMHgwMjAwICAvKiBSZXN0YXJ0IGF1dG8gbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgTUlJX0NSX0lTT0xBVEUgICAgICAgICAgMHgwNDAwICAvKiBJc29sYXRlIFBIWSBmcm9tIE1JSSAqLworI2RlZmluZSBNSUlfQ1JfUE9XRVJfRE9XTiAgICAgICAweDA4MDAgIC8qIFBvd2VyIGRvd24gKi8KKyNkZWZpbmUgTUlJX0NSX0FVVE9fTkVHX0VOICAgICAgMHgxMDAwICAvKiBBdXRvIE5lZyBFbmFibGUgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRUVEX1NFTEVDVF9MU0IgMHgyMDAwICAvKiBiaXRzIDYsMTM6IDEwPTEwMDAsIDAxPTEwMCwgMDA9MTAgKi8KKyNkZWZpbmUgTUlJX0NSX0xPT1BCQUNLICAgICAgICAgMHg0MDAwICAvKiAwID0gbm9ybWFsLCAxID0gbG9vcGJhY2sgKi8KKyNkZWZpbmUgTUlJX0NSX1JFU0VUICAgICAgICAgICAgMHg4MDAwICAvKiAwID0gbm9ybWFsLCAxID0gUEhZIHJlc2V0ICovCisKKy8qIFBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1NSX0VYVEVOREVEX0NBUFMgICAgIDB4MDAwMSAvKiBFeHRlbmRlZCByZWdpc3RlciBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgTUlJX1NSX0pBQkJFUl9ERVRFQ1QgICAgIDB4MDAwMiAvKiBKYWJiZXIgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgTUlJX1NSX0xJTktfU1RBVFVTICAgICAgIDB4MDAwNCAvKiBMaW5rIFN0YXR1cyAxID0gbGluayAqLworI2RlZmluZSBNSUlfU1JfQVVUT05FR19DQVBTICAgICAgMHgwMDA4IC8qIEF1dG8gTmVnIENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX1JFTU9URV9GQVVMVCAgICAgIDB4MDAxMCAvKiBSZW1vdGUgRmF1bHQgRGV0ZWN0ICovCisjZGVmaW5lIE1JSV9TUl9BVVRPTkVHX0NPTVBMRVRFICAweDAwMjAgLyogQXV0byBOZWcgQ29tcGxldGUgKi8KKyNkZWZpbmUgTUlJX1NSX1BSRUFNQkxFX1NVUFBSRVNTIDB4MDA0MCAvKiBQcmVhbWJsZSBtYXkgYmUgc3VwcHJlc3NlZCAqLworI2RlZmluZSBNSUlfU1JfRVhURU5ERURfU1RBVFVTICAgMHgwMTAwIC8qIEV4dC4gc3RhdHVzIGluZm8gaW4gUmVnIDB4MEYgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFQyX0hEX0NBUFMgICAgIDB4MDIwMCAvKiAxMDBUMiBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBUMl9GRF9DQVBTICAgICAweDA0MDAgLyogMTAwVDIgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTBUX0hEX0NBUFMgICAgICAgMHgwODAwIC8qIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwVF9GRF9DQVBTICAgICAgIDB4MTAwMCAvKiAxMFQgICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBYX0hEX0NBUFMgICAgICAweDIwMDAgLyogMTAwWCAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwWF9GRF9DQVBTICAgICAgMHg0MDAwIC8qIDEwMFggIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFQ0X0NBUFMgICAgICAgIDB4ODAwMCAvKiAxMDBUNCBDYXBhYmxlICovCisKKy8qIEF1dG9uZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAqLworI2RlZmluZSBOV0FZX0FSX1NFTEVDVE9SX0ZJRUxEIDB4MDAwMSAgIC8qIGluZGljYXRlcyBJRUVFIDgwMi4zIENTTUEvQ0QgKi8KKyNkZWZpbmUgTldBWV9BUl8xMFRfSERfQ0FQUyAgICAweDAwMjAgICAvKiAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfQVJfMTBUX0ZEX0NBUFMgICAgMHgwMDQwICAgLyogMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSXzEwMFRYX0hEX0NBUFMgIDB4MDA4MCAgIC8qIDEwMFRYIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl8xMDBUWF9GRF9DQVBTICAweDAxMDAgICAvKiAxMDBUWCBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfQVJfMTAwVDRfQ0FQUyAgICAgMHgwMjAwICAgLyogMTAwVDQgQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSX1BBVVNFICAgICAgICAgIDB4MDQwMCAgIC8qIFBhdXNlIG9wZXJhdGlvbiBkZXNpcmVkICovCisjZGVmaW5lIE5XQVlfQVJfQVNNX0RJUiAgICAgICAgMHgwODAwICAgLyogQXN5bW1ldHJpYyBQYXVzZSBEaXJlY3Rpb24gYml0ICovCisjZGVmaW5lIE5XQVlfQVJfUkVNT1RFX0ZBVUxUICAgMHgyMDAwICAgLyogUmVtb3RlIEZhdWx0IGRldGVjdGVkICovCisjZGVmaW5lIE5XQVlfQVJfTkVYVF9QQUdFICAgICAgMHg4MDAwICAgLyogTmV4dCBQYWdlIGFiaWxpdHkgc3VwcG9ydGVkICovCisKKy8qIExpbmsgUGFydG5lciBBYmlsaXR5IFJlZ2lzdGVyIChCYXNlIFBhZ2UpICovCisjZGVmaW5lIE5XQVlfTFBBUl9TRUxFQ1RPUl9GSUVMRCAweDAwMDAgLyogTFAgcHJvdG9jb2wgc2VsZWN0b3IgZmllbGQgKi8KKyNkZWZpbmUgTldBWV9MUEFSXzEwVF9IRF9DQVBTICAgIDB4MDAyMCAvKiBMUCBpcyAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMFRfRkRfQ0FQUyAgICAweDAwNDAgLyogTFAgaXMgMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfMTAwVFhfSERfQ0FQUyAgMHgwMDgwIC8qIExQIGlzIDEwMFRYIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSXzEwMFRYX0ZEX0NBUFMgIDB4MDEwMCAvKiBMUCBpcyAxMDBUWCBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMDBUNF9DQVBTICAgICAweDAyMDAgLyogTFAgaXMgMTAwVDQgQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfUEFVU0UgICAgICAgICAgMHgwNDAwIC8qIExQIFBhdXNlIG9wZXJhdGlvbiBkZXNpcmVkICovCisjZGVmaW5lIE5XQVlfTFBBUl9BU01fRElSICAgICAgICAweDA4MDAgLyogTFAgQXN5bW1ldHJpYyBQYXVzZSBEaXJlY3Rpb24gYml0ICovCisjZGVmaW5lIE5XQVlfTFBBUl9SRU1PVEVfRkFVTFQgICAweDIwMDAgLyogTFAgaGFzIGRldGVjdGVkIFJlbW90ZSBGYXVsdCAqLworI2RlZmluZSBOV0FZX0xQQVJfQUNLTk9XTEVER0UgICAgMHg0MDAwIC8qIExQIGhhcyByeCdkIGxpbmsgY29kZSB3b3JkICovCisjZGVmaW5lIE5XQVlfTFBBUl9ORVhUX1BBR0UgICAgICAweDgwMDAgLyogTmV4dCBQYWdlIGFiaWxpdHkgc3VwcG9ydGVkICovCisKKy8qIEF1dG9uZWcgRXhwYW5zaW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIE5XQVlfRVJfTFBfTldBWV9DQVBTICAgICAgMHgwMDAxIC8qIExQIGhhcyBBdXRvIE5lZyBDYXBhYmlsaXR5ICovCisjZGVmaW5lIE5XQVlfRVJfUEFHRV9SWEQgICAgICAgICAgMHgwMDAyIC8qIExQIGlzIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9FUl9ORVhUX1BBR0VfQ0FQUyAgICAweDAwMDQgLyogTFAgaXMgMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0VSX0xQX05FWFRfUEFHRV9DQVBTIDB4MDAwOCAvKiBMUCBpcyAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfRVJfUEFSX0RFVEVDVF9GQVVMVCAgMHgwMDEwIC8qIExQIGlzIDEwMFRYIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKworLyogTmV4dCBQYWdlIFRYIFJlZ2lzdGVyICovCisjZGVmaW5lIE5QVFhfTVNHX0NPREVfRklFTEQgMHgwMDAxIC8qIE5QIG1zZyBjb2RlIG9yIHVuZm9ybWF0dGVkIGRhdGEgKi8KKyNkZWZpbmUgTlBUWF9UT0dHTEUgICAgICAgICAweDA4MDAgLyogVG9nZ2xlcyBiZXR3ZWVuIGV4Y2hhbmdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBkaWZmZXJlbnQgTlAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5QVFhfQUNLTk9XTERHRTIgICAgMHgxMDAwIC8qIDEgPSB3aWxsIGNvbXBseSB3aXRoIG1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gY2Fubm90IGNvbXBseSB3aXRoIG1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlBUWF9NU0dfUEFHRSAgICAgICAweDIwMDAgLyogZm9ybWF0dGVkKDEpL3VuZm9ybWF0dGVkKDApIHBnICovCisjZGVmaW5lIE5QVFhfTkVYVF9QQUdFICAgICAgMHg4MDAwIC8qIDEgPSBhZGRpdGlvbiBOUCB3aWxsIGZvbGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gc2VuZGluZyBsYXN0IE5QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBMaW5rIFBhcnRuZXIgTmV4dCBQYWdlIFJlZ2lzdGVyICovCisjZGVmaW5lIExQX1JOUFJfTVNHX0NPREVfRklFTEQgMHgwMDAxIC8qIE5QIG1zZyBjb2RlIG9yIHVuZm9ybWF0dGVkIGRhdGEgKi8KKyNkZWZpbmUgTFBfUk5QUl9UT0dHTEUgICAgICAgICAweDA4MDAgLyogVG9nZ2xlcyBiZXR3ZWVuIGV4Y2hhbmdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBkaWZmZXJlbnQgTlAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExQX1JOUFJfQUNLTk9XTERHRTIgICAgMHgxMDAwIC8qIDEgPSB3aWxsIGNvbXBseSB3aXRoIG1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gY2Fubm90IGNvbXBseSB3aXRoIG1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBfUk5QUl9NU0dfUEFHRSAgICAgICAweDIwMDAgIC8qIGZvcm1hdHRlZCgxKS91bmZvcm1hdHRlZCgwKSBwZyAqLworI2RlZmluZSBMUF9STlBSX0FDS05PV0xER0UgICAgIDB4NDAwMCAgLyogMSA9IEFDSyAvIDAgPSBOTyBBQ0sgKi8KKyNkZWZpbmUgTFBfUk5QUl9ORVhUX1BBR0UgICAgICAweDgwMDAgIC8qIDEgPSBhZGRpdGlvbiBOUCB3aWxsIGZvbGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMCA9IHNlbmRpbmcgbGFzdCBOUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIDEwMDBCQVNFLVQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBDUl8xMDAwVF9BU1lNX1BBVVNFICAgICAgMHgwMDgwIC8qIEFkdmVydGlzZSBhc3ltbWV0cmljIHBhdXNlIGJpdCAqLworI2RlZmluZSBDUl8xMDAwVF9IRF9DQVBTICAgICAgICAgMHgwMTAwIC8qIEFkdmVydGlzZSAxMDAwVCBIRCBjYXBhYmlsaXR5ICovCisjZGVmaW5lIENSXzEwMDBUX0ZEX0NBUFMgICAgICAgICAweDAyMDAgLyogQWR2ZXJ0aXNlIDEwMDBUIEZEIGNhcGFiaWxpdHkgICovCisjZGVmaW5lIENSXzEwMDBUX1JFUEVBVEVSX0RURSAgICAweDA0MDAgLyogMT1SZXBlYXRlci9zd2l0Y2ggZGV2aWNlIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwPURURSBkZXZpY2UgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfTVNfVkFMVUUgICAgICAgIDB4MDgwMCAvKiAxPUNvbmZpZ3VyZSBQSFkgYXMgTWFzdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMD1Db25maWd1cmUgUEhZIGFzIFNsYXZlICovCisjZGVmaW5lIENSXzEwMDBUX01TX0VOQUJMRSAgICAgICAweDEwMDAgLyogMT1NYXN0ZXIvU2xhdmUgbWFudWFsIGNvbmZpZyB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA9QXV0b21hdGljIE1hc3Rlci9TbGF2ZSBjb25maWcgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFX05PUk1BTCAweDAwMDAgLyogTm9ybWFsIE9wZXJhdGlvbiAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfMSAgICAgMHgyMDAwIC8qIFRyYW5zbWl0IFdhdmVmb3JtIHRlc3QgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFXzIgICAgIDB4NDAwMCAvKiBNYXN0ZXIgVHJhbnNtaXQgSml0dGVyIHRlc3QgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFXzMgICAgIDB4NjAwMCAvKiBTbGF2ZSBUcmFuc21pdCBKaXR0ZXIgdGVzdCAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfNCAgICAgMHg4MDAwIC8qIFRyYW5zbWl0dGVyIERpc3RvcnRpb24gdGVzdCAqLworCisvKiAxMDAwQkFTRS1UIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTUl8xMDAwVF9JRExFX0VSUk9SX0NOVCAgIDB4MDBGRiAvKiBOdW0gaWRsZSBlcnJvcnMgc2luY2UgbGFzdCByZWFkICovCisjZGVmaW5lIFNSXzEwMDBUX0FTWU1fUEFVU0VfRElSICAgMHgwMTAwIC8qIExQIGFzeW1tZXRyaWMgcGF1c2UgZGlyZWN0aW9uIGJpdCAqLworI2RlZmluZSBTUl8xMDAwVF9MUF9IRF9DQVBTICAgICAgIDB4MDQwMCAvKiBMUCBpcyAxMDAwVCBIRCBjYXBhYmxlICovCisjZGVmaW5lIFNSXzEwMDBUX0xQX0ZEX0NBUFMgICAgICAgMHgwODAwIC8qIExQIGlzIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVUyAweDEwMDAgLyogUmVtb3RlIHJlY2VpdmVyIE9LICovCisjZGVmaW5lIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVUyAgMHgyMDAwIC8qIExvY2FsIHJlY2VpdmVyIE9LICovCisjZGVmaW5lIFNSXzEwMDBUX01TX0NPTkZJR19SRVMgICAgMHg0MDAwIC8qIDE9TG9jYWwgVFggaXMgTWFzdGVyLCAwPVNsYXZlICovCisjZGVmaW5lIFNSXzEwMDBUX01TX0NPTkZJR19GQVVMVCAgMHg4MDAwIC8qIE1hc3Rlci9TbGF2ZSBjb25maWcgZmF1bHQgKi8KKyNkZWZpbmUgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVU19TSElGVCAgICAgICAgICAxMgorI2RlZmluZSBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVNfU0hJRlQgICAgICAgICAgIDEzCisjZGVmaW5lIFNSXzEwMDBUX1BIWV9FWENFU1NJVkVfSURMRV9FUlJfQ09VTlQgICAgNQorI2RlZmluZSBGRkVfSURMRV9FUlJfQ09VTlRfVElNRU9VVF8yMCAgICAgICAgICAgIDIwCisjZGVmaW5lIEZGRV9JRExFX0VSUl9DT1VOVF9USU1FT1VUXzEwMCAgICAgICAgICAgMTAwCisKKy8qIEV4dGVuZGVkIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJRUVFX0VTUl8xMDAwVF9IRF9DQVBTIDB4MTAwMCAvKiAxMDAwVCBIRCBjYXBhYmxlICovCisjZGVmaW5lIElFRUVfRVNSXzEwMDBUX0ZEX0NBUFMgMHgyMDAwIC8qIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgSUVFRV9FU1JfMTAwMFhfSERfQ0FQUyAweDQwMDAgLyogMTAwMFggSEQgY2FwYWJsZSAqLworI2RlZmluZSBJRUVFX0VTUl8xMDAwWF9GRF9DQVBTIDB4ODAwMCAvKiAxMDAwWCBGRCBjYXBhYmxlICovCisKKyNkZWZpbmUgUEhZX1RYX1BPTEFSSVRZX01BU0sgICAweDAxMDAgLyogcmVnaXN0ZXIgMTBoIGJpdCA4IChwb2xhcml0eSBiaXQpICovCisjZGVmaW5lIFBIWV9UWF9OT1JNQUxfUE9MQVJJVFkgMCAgICAgIC8qIHJlZ2lzdGVyIDEwaCBiaXQgOCAobm9ybWFsIHBvbGFyaXR5KSAqLworCisjZGVmaW5lIEFVVE9fUE9MQVJJVFlfRElTQUJMRSAgMHgwMDEwIC8qIHJlZ2lzdGVyIDExaCBiaXQgNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoMD1lbmFibGUsIDE9ZGlzYWJsZSkgKi8KKworLyogTTg4RTEwMDAgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9KQUJCRVJfRElTQUJMRSAgICAweDAwMDEgLyogMT1KYWJiZXIgRnVuY3Rpb24gZGlzYWJsZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTCAweDAwMDIgLyogMT1Qb2xhcml0eSBSZXZlcnNhbCBlbmFibGVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfU1FFX1RFU1QgICAgICAgICAgMHgwMDA0IC8qIDE9U1FFIFRlc3QgZW5hYmxlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX0NMSzEyNV9ESVNBQkxFICAgIDB4MDAxMCAvKiAxPUNMSzEyNSBsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDA9Q0xLMTI1IHRvZ2dsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX01ESV9NQU5VQUxfTU9ERSAgMHgwMDAwICAvKiBNREkgQ3Jvc3NvdmVyIE1vZGUgYml0cyA2OjUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFudWFsIE1ESSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfTURJWF9NQU5VQUxfTU9ERSAweDAwMjAgIC8qIE1hbnVhbCBNRElYIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9BVVRPX1hfMTAwMFQgICAgIDB4MDA0MCAgLyogMTAwMEJBU0UtVDogQXV0byBjcm9zc292ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAxMDBCQVNFLVRYLzEwQkFTRS1UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgTURJIE1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVVUT19YX01PREUgICAgICAweDAwNjAgIC8qIEF1dG8gY3Jvc3NvdmVyIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWxsIHNwZWVkcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfMTBCVF9FWFRfRElTVF9FTkFCTEUgMHgwMDgwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMT1FbmFibGUgRXh0ZW5kZWQgMTBCQVNFLVQgZGlzdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTG93ZXIgMTBCQVNFLVQgUlggVGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDA9Tm9ybWFsIDEwQkFTRS1UIFJYIFRocmVzaG9sZCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX01JSV81QklUX0VOQUJMRSAgICAgIDB4MDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE9NS1CaXQgaW50ZXJmYWNlIGluIDEwMEJBU0UtVFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwPU1JSSBpbnRlcmZhY2UgaW4gMTAwQkFTRS1UWCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX1NDUkFNQkxFUl9ESVNBQkxFICAgIDB4MDIwMCAvKiAxPVNjcmFtYmxlciBkaXNhYmxlICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfRk9SQ0VfTElOS19HT09EICAgICAgMHgwNDAwIC8qIDE9Rm9yY2UgbGluayBnb29kICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWCAgICAgMHgwODAwIC8qIDE9QXNzZXJ0IENSUyBvbiBUcmFuc21pdCAqLworCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUxfU0hJRlQgICAgMQorI2RlZmluZSBNODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFX1NISUZUICAgICAgICAgIDUKKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRV9TSElGVCA3CisKKy8qIE04OEUxMDAwIFBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9KQUJCRVIgICAgICAgICAgICAgMHgwMDAxIC8qIDE9SmFiYmVyICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfUkVWX1BPTEFSSVRZICAgICAgIDB4MDAwMiAvKiAxPVBvbGFyaXR5IHJldmVyc2VkICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfRE9XTlNISUZUICAgICAgICAgIDB4MDAyMCAvKiAxPURvd25zaGlmdGVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfTURJWCAgICAgICAgICAgICAgIDB4MDA0MCAvKiAxPU1ESVg7IDA9TURJICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIICAgICAgIDB4MDM4MCAvKiAwPTw1ME07MT01MC04ME07Mj04MC0xMTBNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDM9MTEwLTE0ME07ND0+MTQwTSAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX0xJTksgICAgICAgICAgICAgICAweDA0MDAgLyogMT1MaW5rIHVwLCAwPUxpbmsgZG93biAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX1NQRF9EUExYX1JFU09MVkVEICAweDA4MDAgLyogMT1TcGVlZCAmIER1cGxleCByZXNvbHZlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX1BBR0VfUkNWRCAgICAgICAgICAweDEwMDAgLyogMT1QYWdlIHJlY2VpdmVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfRFBMWCAgICAgICAgICAgICAgIDB4MjAwMCAvKiAxPUR1cGxleCAwPUhhbGYgRHVwbGV4ICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfU1BFRUQgICAgICAgICAgICAgIDB4QzAwMCAvKiBTcGVlZCwgYml0cyAxNDoxNSAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSXzEwTUJTICAgICAgICAgICAgICAweDAwMDAgLyogMDA9MTBNYnMgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl8xMDBNQlMgICAgICAgICAgICAgMHg0MDAwIC8qIDAxPTEwME1icyAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSXzEwMDBNQlMgICAgICAgICAgICAweDgwMDAgLyogMTA9MTAwME1icyAqLworCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfUkVWX1BPTEFSSVRZX1NISUZUIDEKKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9ET1dOU0hJRlRfU0hJRlQgICAgNQorI2RlZmluZSBNODhFMTAwMF9QU1NSX01ESVhfU0hJRlQgICAgICAgICA2CisjZGVmaW5lIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIX1NISUZUIDcKKworLyogTTg4RTEwMDAgRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfRklCRVJfTE9PUEJBQ0sgMHg0MDAwIC8qIDE9RmliZXIgbG9vcGJhY2sgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfRE9XTl9OT19JRExFICAgMHg4MDAwIC8qIDE9TG9zdCBsb2NrIGRldGVjdCBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogV2lsbCBhc3NlcnQgbG9zdCBsb2NrIGFuZCBicmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbGluayBkb3duIGlmIGlkbGUgbm90IHNlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpdGhpbiAxbXMgaW4gMTAwMEJBU0UtVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOdW1iZXIgb2YgdGltZXMgd2Ugd2lsbCBhdHRlbXB0IHRvIGF1dG9uZWdvdGlhdGUgYmVmb3JlIGRvd25zaGlmdGluZyBpZiB3ZQorICogYXJlIHRoZSBtYXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF9NQVNLIDB4MEMwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzFYICAgMHgwMDAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfMlggICAweDA0MDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF8zWCAgIDB4MDgwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzRYICAgMHgwQzAwCisvKiBOdW1iZXIgb2YgdGltZXMgd2Ugd2lsbCBhdHRlbXB0IHRvIGF1dG9uZWdvdGlhdGUgYmVmb3JlIGRvd25zaGlmdGluZyBpZiB3ZQorICogYXJlIHRoZSBzbGF2ZSAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfTUFTSyAgMHgwMzAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF9ESVMgICAweDAwMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUXzFYICAgIDB4MDEwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfMlggICAgMHgwMjAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF8zWCAgICAweDAzMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzJfNSAgICAgMHgwMDYwIC8qIDIuNSBNSHogVFhfQ0xLICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1RYX0NMS18yNSAgICAgIDB4MDA3MCAvKiAyNSAgTUh6IFRYX0NMSyAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMCAgICAgICAweDAwMDAgLyogTk8gIFRYX0NMSyAqLworCisvKiBNODhFQzAxOCBSZXYgMiBzcGVjaWZpYyBEb3duU2hpZnQgc2V0dGluZ3MgKi8KKyNkZWZpbmUgTTg4RUMwMThfRVBTQ1JfRE9XTlNISUZUX0NPVU5URVJfTUFTSyAgMHgwRTAwCisjZGVmaW5lIE04OEVDMDE4X0VQU0NSX0RPV05TSElGVF9DT1VOVEVSXzFYICAgIDB4MDAwMAorI2RlZmluZSBNODhFQzAxOF9FUFNDUl9ET1dOU0hJRlRfQ09VTlRFUl8yWCAgICAweDAyMDAKKyNkZWZpbmUgTTg4RUMwMThfRVBTQ1JfRE9XTlNISUZUX0NPVU5URVJfM1ggICAgMHgwNDAwCisjZGVmaW5lIE04OEVDMDE4X0VQU0NSX0RPV05TSElGVF9DT1VOVEVSXzRYICAgIDB4MDYwMAorI2RlZmluZSBNODhFQzAxOF9FUFNDUl9ET1dOU0hJRlRfQ09VTlRFUl81WCAgICAweDA4MDAKKyNkZWZpbmUgTTg4RUMwMThfRVBTQ1JfRE9XTlNISUZUX0NPVU5URVJfNlggICAgMHgwQTAwCisjZGVmaW5lIE04OEVDMDE4X0VQU0NSX0RPV05TSElGVF9DT1VOVEVSXzdYICAgIDB4MEMwMAorI2RlZmluZSBNODhFQzAxOF9FUFNDUl9ET1dOU0hJRlRfQ09VTlRFUl84WCAgICAweDBFMDAKKworLyogSUdQMDFFMTAwMCBTcGVjaWZpYyBQb3J0IENvbmZpZyBSZWdpc3RlciAtIFIvVyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX0FVVE9fTURJWF9QQVJfREVURUNUICAweDAwMTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9QUkVfRU4gICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX0RJU0FCTEVfVFBMT09QQkFDSyAgICAweDAxMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9ESVNBQkxFX0pBQkJFUiAgICAgICAgMHgwNDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfRElTQUJMRV9UUkFOU01JVCAgICAgIDB4MjAwMAorCisvKiBJR1AwMUUxMDAwIFNwZWNpZmljIFBvcnQgU3RhdHVzIFJlZ2lzdGVyIC0gUi9PICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9BVVRPTkVHX0ZBSUxFRCAgICAgICAgIDB4MDAwMSAvKiBSTyBMSCBTQyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfUE9MQVJJVFlfUkVWRVJTRUQgICAgICAweDAwMDIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSCAgICAgICAgICAgMHgwMDdDCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9GVUxMX0RVUExFWCAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfTElOS19VUCAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX01ESVggICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLICAgICAgICAgICAgIDB4QzAwMCAvKiBzcGVlZCBiaXRzIG1hc2sgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwTUJQUyAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xMDBNQlBTICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwME1CUFMgICAgICAgICAweEMwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSF9TSElGVCAgICAgMHgwMDAyIC8qIHNoaWZ0IHJpZ2h0IDIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX01ESVhfU0hJRlQgICAgICAgICAgICAgMHgwMDBCIC8qIHNoaWZ0IHJpZ2h0IDExICovCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUG9ydCBDb250cm9sIFJlZ2lzdGVyIC0gUi9XICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9UUF9MT09QQkFDSyAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfQ09SUkVDVF9OQ19TQ01CTFIgICAgICAweDAyMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX1RFTl9DUlNfU0VMRUNUICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9GTElQX0NISVAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYICAgICAgICAgMHgyMDAwIC8qIDAtTURJLCAxLU1ESVggKi8KKworLyogSUdQMDFFMTAwMCBTcGVjaWZpYyBQb3J0IExpbmsgSGVhbHRoIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9TU19ET1dOR1JBREUgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfR0lHX1NDUkFNQkxFUl9FUlJPUiAgICAweDQwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX01BU1RFUl9GQVVMVCAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9NQVNURVJfUkVTT0xVVElPTiAgICAgIDB4MTAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfR0lHX1JFTV9SQ1ZSX05PSyAgICAgICAweDA4MDAgLyogTEggKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0lETEVfRVJST1JfQ05UX09GTE9XICAgMHgwNDAwIC8qIExIICovCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9EQVRBX0VSUl8xICAgICAgICAgICAgIDB4MDIwMCAvKiBMSCAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfREFUQV9FUlJfMCAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0FVVE9ORUdfRkFVTFQgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9BVVRPTkVHX0FDVElWRSAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfVkFMSURfQ0hBTk5FTF9EICAgICAgICAweDAwMDgKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX1ZBTElEX0NIQU5ORUxfQyAgICAgICAgMHgwMDA0CisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9WQUxJRF9DSEFOTkVMX0IgICAgICAgIDB4MDAwMgorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfVkFMSURfQ0hBTk5FTF9BICAgICAgICAweDAwMDEKKworLyogSUdQMDFFMTAwMCBDaGFubmVsIFF1YWxpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9NU0VfQ0hBTk5FTF9EICAgICAgICAweDAwMEYKKyNkZWZpbmUgSUdQMDFFMTAwMF9NU0VfQ0hBTk5FTF9DICAgICAgICAweDAwRjAKKyNkZWZpbmUgSUdQMDFFMTAwMF9NU0VfQ0hBTk5FTF9CICAgICAgICAweDBGMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9NU0VfQ0hBTk5FTF9BICAgICAgICAweEYwMDAKKworI2RlZmluZSBJR1AwMkUxMDAwX1BNX1NQRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFNtYXJ0IFBvd2VyIERvd24gKi8KKyNkZWZpbmUgSUdQMDJFMTAwMF9QTV9EM19MUExVICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBFbmFibGUgTFBMVSBpbiBub24tRDBhIG1vZGVzICovCisjZGVmaW5lIElHUDAyRTEwMDBfUE1fRDBfTFBMVSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRW5hYmxlIExQTFUgaW4gRDBhIG1vZGUgKi8KKworLyogSUdQMDFFMTAwMCBEU1AgcmVzZXQgbWFjcm9zICovCisjZGVmaW5lIERTUF9SRVNFVF9FTkFCTEUgICAgIDB4MAorI2RlZmluZSBEU1BfUkVTRVRfRElTQUJMRSAgICAweDIKKyNkZWZpbmUgRTEwMDBfTUFYX0RTUF9SRVNFVFMgMTAKKworLyogSUdQMDFFMTAwMCAmIElHUDAyRTEwMDAgQUdDIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVCA3ICAgICAgICAgLyogQ29hcnNlIC0gMTM6MTEsIEZpbmUgLSAxMDo3ICovCisjZGVmaW5lIElHUDAyRTEwMDBfQUdDX0xFTkdUSF9TSElGVCA5ICAgICAgICAgLyogQ29hcnNlIC0gMTU6MTMsIEZpbmUgLSAxMjo5ICovCisKKy8qIElHUDAyRTEwMDAgQUdDIFJlZ2lzdGVyIExlbmd0aCA5LWJpdCBtYXNrICovCisjZGVmaW5lIElHUDAyRTEwMDBfQUdDX0xFTkdUSF9NQVNLICAweDdGCisKKy8qIDcgYml0cyAoMyBDb2Fyc2UgKyA0IEZpbmUpIC0tPiAxMjggb3B0aW9uYWwgdmFsdWVzICovCisjZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFIDEyOAorI2RlZmluZSBJR1AwMkUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRSAxMTMKKworLyogVGhlIHByZWNpc2lvbiBlcnJvciBvZiB0aGUgY2FibGUgbGVuZ3RoIGlzICsvLSAxMCBtZXRlcnMgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9BR0NfUkFOR0UgICAgMTAKKyNkZWZpbmUgSUdQMDJFMTAwMF9BR0NfUkFOR0UgICAgMTUKKworLyogSUdQMDFFMTAwMCBQQ1MgSW5pdGlhbGl6YXRpb24gcmVnaXN0ZXIgKi8KKy8qIGJpdHMgMzo2IGluIHRoZSBQQ1MgcmVnaXN0ZXJzIHN0b3JlcyB0aGUgY2hhbm5lbHMgcG9sYXJpdHkgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUE9MQVJJVFlfTUFTSyAgICAweDAwNzgKKworLyogSUdQMDFFMTAwMCBHTUlJIEZJRk8gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEICAgICAgICAgICAgICAgMHgxMCAvKiBFbmFibGUgZmxleGlibGUgc3BlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbiBMaW5rLVVwICovCisjZGVmaW5lIElHUDAxRTEwMDBfR01JSV9TUEQgICAgICAgICAgICAgICAgICAgIDB4MjAgLyogRW5hYmxlIFNQRCAqLworCisvKiBJR1AwMUUxMDAwIEFuYWxvZyBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19TUEFSRV9GVVNFX1NUQVRVUyAgICAgICAweDIwRDEKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9TVEFUVVMgICAgICAgICAgICAgMHgyMEQwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09OVFJPTCAgICAgICAgICAgIDB4MjBEQworI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0JZUEFTUyAgICAgICAgICAgICAweDIwREUKKworI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX1BPTFlfTUFTSyAgICAgICAgICAgIDB4RjAwMAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfTUFTSyAgICAgICAgICAgIDB4MEY4MAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9NQVNLICAgICAgICAgIDB4MDA3MAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19TUEFSRV9GVVNFX0VOQUJMRUQgICAgICAgIDB4MDEwMAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0VOQUJMRV9TV19DT05UUk9MICAgIDB4MDAwMgorCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX1RIUkVTSCAgICAgICAgMHgwMDQwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFXzEwICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV8xICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV8xMCAgICAgICAgICAgICAgMHgwNTAwCisKKy8qIEdHODI1NjMgUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAoUGFnZSAwLCBSZWdpc3RlciAxNiAqLworI2RlZmluZSBHRzgyNTYzX1BTQ1JfRElTQUJMRV9KQUJCRVIgICAgICAgICAgICAgMHgwMDAxIC8qIDE9RGlzYWJsZSBKYWJiZXIgKi8KKyNkZWZpbmUgR0c4MjU2M19QU0NSX1BPTEFSSVRZX1JFVkVSU0FMX0RJU0FCTEUgIDB4MDAwMiAvKiAxPVBvbGFyaXR5IFJldmVyc2FsIERpc2FibGVkICovCisjZGVmaW5lIEdHODI1NjNfUFNDUl9QT1dFUl9ET1dOICAgICAgICAgICAgICAgICAweDAwMDQgLyogMT1Qb3dlciBEb3duICovCisjZGVmaW5lIEdHODI1NjNfUFNDUl9DT1BQRVJfVFJBTlNNSVRFUl9ESVNBQkxFICAweDAwMDggLyogMT1UcmFuc21pdHRlciBEaXNhYmxlZCAqLworI2RlZmluZSBHRzgyNTYzX1BTQ1JfQ1JPU1NPVkVSX01PREVfTUFTSyAgICAgICAgMHgwMDYwCisjZGVmaW5lIEdHODI1NjNfUFNDUl9DUk9TU09WRVJfTU9ERV9NREkgICAgICAgICAweDAwMDAgLyogMDA9TWFudWFsIE1ESSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEdHODI1NjNfUFNDUl9DUk9TU09WRVJfTU9ERV9NRElYICAgICAgICAweDAwMjAgLyogMDE9TWFudWFsIE1ESVggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBHRzgyNTYzX1BTQ1JfQ1JPU1NPVkVSX01PREVfQVVUTyAgICAgICAgMHgwMDYwIC8qIDExPUF1dG9tYXRpYyBjcm9zc292ZXIgKi8KKyNkZWZpbmUgR0c4MjU2M19QU0NSX0VOQUxCRV9FWFRFTkRFRF9ESVNUQU5DRSAgIDB4MDA4MCAvKiAxPUVuYWJsZSBFeHRlbmRlZCBEaXN0YW5jZSAqLworI2RlZmluZSBHRzgyNTYzX1BTQ1JfRU5FUkdZX0RFVEVDVF9NQVNLICAgICAgICAgMHgwMzAwCisjZGVmaW5lIEdHODI1NjNfUFNDUl9FTkVSR1lfREVURUNUX09GRiAgICAgICAgICAweDAwMDAgLyogMDAsMDE9T2ZmICovCisjZGVmaW5lIEdHODI1NjNfUFNDUl9FTkVSR1lfREVURUNUX1JYICAgICAgICAgICAweDAyMDAgLyogMTA9U2Vuc2Ugb24gUnggb25seSAoRW5lcmd5IERldGVjdCkgKi8KKyNkZWZpbmUgR0c4MjU2M19QU0NSX0VORVJHWV9ERVRFQ1RfUlhfVE0gICAgICAgIDB4MDMwMCAvKiAxMT1TZW5zZSBhbmQgVHggTkxQICovCisjZGVmaW5lIEdHODI1NjNfUFNDUl9GT1JDRV9MSU5LX0dPT0QgICAgICAgICAgICAweDA0MDAgLyogMT1Gb3JjZSBMaW5rIEdvb2QgKi8KKyNkZWZpbmUgR0c4MjU2M19QU0NSX0RPV05TSElGVF9FTkFCTEUgICAgICAgICAgIDB4MDgwMCAvKiAxPUVuYWJsZSBEb3duc2hpZnQgKi8KKyNkZWZpbmUgR0c4MjU2M19QU0NSX0RPV05TSElGVF9DT1VOVEVSX01BU0sgICAgIDB4NzAwMAorI2RlZmluZSBHRzgyNTYzX1BTQ1JfRE9XTlNISUZUX0NPVU5URVJfU0hJRlQgICAgMTIKKworLyogUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAoUGFnZSAwLCBSZWdpc3RlciAxNykgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSX0pBQkJFUiAgICAgICAgICAgICAgICAweDAwMDEgLyogMT1KYWJiZXIgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSX1BPTEFSSVRZICAgICAgICAgICAgICAweDAwMDIgLyogMT1Qb2xhcml0eSBSZXZlcnNlZCAqLworI2RlZmluZSBHRzgyNTYzX1BTU1JfTElOSyAgICAgICAgICAgICAgICAgIDB4MDAwOCAvKiAxPUxpbmsgaXMgVXAgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSX0VORVJHWV9ERVRFQ1QgICAgICAgICAweDAwMTAgLyogMT1TbGVlcCwgMD1BY3RpdmUgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSX0RPV05TSElGVCAgICAgICAgICAgICAweDAwMjAgLyogMT1Eb3duc2hpZnQgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSX0NST1NTT1ZFUl9TVEFUVVMgICAgICAweDAwNDAgLyogMT1NRElYLCAwPU1ESSAqLworI2RlZmluZSBHRzgyNTYzX1BTU1JfUlhfUEFVU0VfRU5BQkxFRCAgICAgIDB4MDEwMCAvKiAxPVJlY2VpdmUgUGF1c2UgRW5hYmxlZCAqLworI2RlZmluZSBHRzgyNTYzX1BTU1JfVFhfUEFVU0VfRU5BQkxFRCAgICAgIDB4MDIwMCAvKiAxPVRyYW5zbWl0IFBhdXNlIEVuYWJsZWQgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSX0xJTktfVVAgICAgICAgICAgICAgICAweDA0MDAgLyogMT1MaW5rIFVwICovCisjZGVmaW5lIEdHODI1NjNfUFNTUl9TUEVFRF9EVVBMRVhfUkVTT0xWRUQgMHgwODAwIC8qIDE9UmVzb2x2ZWQgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSX1BBR0VfUkVDRUlWRUQgICAgICAgICAweDEwMDAgLyogMT1QYWdlIFJlY2VpdmVkICovCisjZGVmaW5lIEdHODI1NjNfUFNTUl9EVVBMRVggICAgICAgICAgICAgICAgMHgyMDAwIC8qIDEtRnVsbC1EdXBsZXggKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSX1NQRUVEX01BU0sgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgR0c4MjU2M19QU1NSX1NQRUVEXzEwTUJQUyAgICAgICAgICAweDAwMDAgLyogMDA9MTBNYnBzICovCisjZGVmaW5lIEdHODI1NjNfUFNTUl9TUEVFRF8xMDBNQlBTICAgICAgICAgMHg0MDAwIC8qIDAxPTEwME1icHMgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSX1NQRUVEXzEwMDBNQlBTICAgICAgICAweDgwMDAgLyogMTA9MTAwME1icHMgKi8KKworLyogUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAyIChQYWdlIDAsIFJlZ2lzdGVyIDE5KSAqLworI2RlZmluZSBHRzgyNTYzX1BTU1IyX0pBQkJFUiAgICAgICAgICAgICAgICAweDAwMDEgLyogMT1KYWJiZXIgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSMl9QT0xBUklUWV9DSEFOR0VEICAgICAgMHgwMDAyIC8qIDE9UG9sYXJpdHkgQ2hhbmdlZCAqLworI2RlZmluZSBHRzgyNTYzX1BTU1IyX0VORVJHWV9ERVRFQ1RfQ0hBTkdFRCAweDAwMTAgLyogMT1FbmVyZ3kgRGV0ZWN0IENoYW5nZWQgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSMl9ET1dOU0hJRlRfSU5URVJSVVBUICAgMHgwMDIwIC8qIDE9RG93bnNoaWZ0IERldGVjdGVkICovCisjZGVmaW5lIEdHODI1NjNfUFNTUjJfTURJX0NST1NTT1ZFUl9DSEFOR0UgIDB4MDA0MCAvKiAxPUNyb3Nzb3ZlciBDaGFuZ2VkICovCisjZGVmaW5lIEdHODI1NjNfUFNTUjJfRkFMU0VfQ0FSUklFUiAgICAgICAgIDB4MDEwMCAvKiAxPUZhbHNlIENhcnJpZXIgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSMl9TWU1CT0xfRVJST1IgICAgICAgICAgMHgwMjAwIC8qIDE9U3ltYm9sIEVycm9yICovCisjZGVmaW5lIEdHODI1NjNfUFNTUjJfTElOS19TVEFUVVNfQ0hBTkdFRCAgIDB4MDQwMCAvKiAxPUxpbmsgU3RhdHVzIENoYW5nZWQgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSMl9BVVRPX05FR19DT01QTEVURUQgICAgMHgwODAwIC8qIDE9QXV0by1OZWcgQ29tcGxldGVkICovCisjZGVmaW5lIEdHODI1NjNfUFNTUjJfUEFHRV9SRUNFSVZFRCAgICAgICAgIDB4MTAwMCAvKiAxPVBhZ2UgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSMl9EVVBMRVhfQ0hBTkdFRCAgICAgICAgMHgyMDAwIC8qIDE9RHVwbGV4IENoYW5nZWQgKi8KKyNkZWZpbmUgR0c4MjU2M19QU1NSMl9TUEVFRF9DSEFOR0VEICAgICAgICAgMHg0MDAwIC8qIDE9U3BlZWQgQ2hhbmdlZCAqLworI2RlZmluZSBHRzgyNTYzX1BTU1IyX0FVVE9fTkVHX0VSUk9SICAgICAgICAweDgwMDAgLyogMT1BdXRvLU5lZyBFcnJvciAqLworCisvKiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAyIChQYWdlIDAsIFJlZ2lzdGVyIDI2KSAqLworI2RlZmluZSBHRzgyNTYzX1BTQ1IyXzEwQlRfUE9MQVJJVFlfRk9SQ0UgICAgICAgICAgIDB4MDAwMiAvKiAxPUZvcmNlIE5lZ2F0aXZlIFBvbGFyaXR5ICovCisjZGVmaW5lIEdHODI1NjNfUFNDUjJfMTAwME1CX1RFU1RfU0VMRUNUX01BU0sgICAgICAgMHgwMDBDCisjZGVmaW5lIEdHODI1NjNfUFNDUjJfMTAwME1CX1RFU1RfU0VMRUNUX05PUk1BTCAgICAgMHgwMDAwIC8qIDAwLDAxPU5vcm1hbCBPcGVyYXRpb24gKi8KKyNkZWZpbmUgR0c4MjU2M19QU0NSMl8xMDAwTUJfVEVTVF9TRUxFQ1RfMTEyTlMgICAgICAweDAwMDggLyogMTA9U2VsZWN0IDExMm5zIFNlcXVlbmNlICovCisjZGVmaW5lIEdHODI1NjNfUFNDUjJfMTAwME1CX1RFU1RfU0VMRUNUXzE2TlMgICAgICAgMHgwMDBDIC8qIDExPVNlbGVjdCAxNm5zIFNlcXVlbmNlICovCisjZGVmaW5lIEdHODI1NjNfUFNDUjJfUkVWRVJTRV9BVVRPX05FRyAgICAgICAgICAgICAgMHgyMDAwIC8qIDE9UmV2ZXJzZSBBdXRvLU5lZ290aWF0aW9uICovCisjZGVmaW5lIEdHODI1NjNfUFNDUjJfMTAwMEJUX0RJU0FCTEUgICAgICAgICAgICAgICAgMHg0MDAwIC8qIDE9RGlzYWJsZSAxMDAwQkFTRS1UICovCisjZGVmaW5lIEdHODI1NjNfUFNDUjJfVFJBTlNNSVRFUl9UWVBFX01BU0sgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEdHODI1NjNfUFNDUjJfVFJBTlNNSVRURVJfVFlQRV9DTEFTU19CICAgICAgMHgwMDAwIC8qIDA9Q2xhc3MgQiAqLworI2RlZmluZSBHRzgyNTYzX1BTQ1IyX1RSQU5TTUlUVEVSX1RZUEVfQ0xBU1NfQSAgICAgIDB4ODAwMCAvKiAxPUNsYXNzIEEgKi8KKworLyogTUFDIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKFBhZ2UgMiwgUmVnaXN0ZXIgMjEpICovCisvKiBUeCBjbG9jayBzcGVlZCBmb3IgTGluayBEb3duIGFuZCAxMDAwQkFTRS1UIGZvciB0aGUgZm9sbG93aW5nIHNwZWVkcyAqLworI2RlZmluZSBHRzgyNTYzX01TQ1JfVFhfQ0xLX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBHRzgyNTYzX01TQ1JfVFhfQ0xLXzEwTUJQU18yXzVNSFogICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBHRzgyNTYzX01TQ1JfVFhfQ0xLXzEwME1CUFNfMjVNSFogICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBHRzgyNTYzX01TQ1JfVFhfQ0xLXzEwMDBNQlBTXzJfNU1IWiAgICAgICAgIDB4MDAwNgorI2RlZmluZSBHRzgyNTYzX01TQ1JfVFhfQ0xLXzEwMDBNQlBTXzI1TUhaICAgICAgICAgIDB4MDAwNworCisjZGVmaW5lIEdHODI1NjNfTVNDUl9BU1NFUlRfQ1JTX09OX1RYICAgICAgICAgICAgICAgMHgwMDEwIC8qIDE9QXNzZXJ0ICovCisKKy8qIERTUCBEaXN0YW5jZSBSZWdpc3RlciAoUGFnZSA1LCBSZWdpc3RlciAyNikgKi8KKyNkZWZpbmUgR0c4MjU2M19EU1BEX0NBQkxFX0xFTkdUSCAgICAgICAgICAgICAgIDB4MDAwNyAvKiAwID0gPDUwTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gNTAtODBNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSA4MC0xMTBNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSAxMTAtMTQwTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ID0gPjE0ME0gKi8KKworLyogS3VtZXJhbiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKFBhZ2UgMTkzLCBSZWdpc3RlciAxNikgKi8KKyNkZWZpbmUgR0c4MjU2M19LTUNSX1BIWV9MRURTX0VOICAgICAgICAgICAgICAgICAgICAweDAwMjAgLyogMT1QSFkgTEVEcywgMD1LdW1lcmFuIEluYmFuZCBMRURzICovCisjZGVmaW5lIEdHODI1NjNfS01DUl9GT1JDRV9MSU5LX1VQICAgICAgICAgICAgICAgICAgMHgwMDQwIC8qIDE9Rm9yY2UgTGluayBVcCAqLworI2RlZmluZSBHRzgyNTYzX0tNQ1JfU1VQUFJFU1NfU0dNSUlfRVBEX0VYVCAgICAgICAgIDB4MDA4MAorI2RlZmluZSBHRzgyNTYzX0tNQ1JfTURJT19CVVNfU1BFRURfU0VMRUNUX01BU0sgICAgIDB4MDQwMAorI2RlZmluZSBHRzgyNTYzX0tNQ1JfTURJT19CVVNfU1BFRURfU0VMRUNUICAgICAgICAgIDB4MDQwMCAvKiAxPTYuMjVNSHosIDA9MC44TUh6ICovCisjZGVmaW5lIEdHODI1NjNfS01DUl9QQVNTX0ZBTFNFX0NBUlJJRVIgICAgICAgICAgICAgMHgwODAwCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCBSZWdpc3RlciAoUGFnZSAxOTMsIFJlZ2lzdGVyIDIwKSAqLworI2RlZmluZSBHRzgyNTYzX1BNQ1JfRU5BQkxFX0VMRUNUUklDQUxfSURMRSAgICAgICAgIDB4MDAwMSAvKiAxPUVuYWxiZSBTRVJERVMgRWxlY3RyaWNhbCBJZGxlICovCisjZGVmaW5lIEdHODI1NjNfUE1DUl9ESVNBQkxFX1BPUlQgICAgICAgICAgICAgICAgICAgMHgwMDAyIC8qIDE9RGlzYWJsZSBQb3J0ICovCisjZGVmaW5lIEdHODI1NjNfUE1DUl9ESVNBQkxFX1NFUkRFUyAgICAgICAgICAgICAgICAgMHgwMDA0IC8qIDE9RGlzYWJsZSBTRVJERVMgKi8KKyNkZWZpbmUgR0c4MjU2M19QTUNSX1JFVkVSU0VfQVVUT19ORUcgICAgICAgICAgICAgICAweDAwMDggLyogMT1FbmFibGUgUmV2ZXJzZSBBdXRvLU5lZ290aWF0aW9uICovCisjZGVmaW5lIEdHODI1NjNfUE1DUl9ESVNBQkxFXzEwMDBfTk9OX0QwICAgICAgICAgICAgMHgwMDEwIC8qIDE9RGlzYWJsZSAxMDAwTWJwcyBBdXRvLU5lZyBpbiBub24gRDAgKi8KKyNkZWZpbmUgR0c4MjU2M19QTUNSX0RJU0FCTEVfMTAwMCAgICAgICAgICAgICAgICAgICAweDAwMjAgLyogMT1EaXNhYmxlIDEwMDBNYnBzIEF1dG8tTmVnIEFsd2F5cyAqLworI2RlZmluZSBHRzgyNTYzX1BNQ1JfUkVWRVJTRV9BVVRPX05FR19EMEEgICAgICAgICAgIDB4MDA0MCAvKiAxPUVuYWJsZSBEMGEgUmV2ZXJzZSBBdXRvLU5lZ290aWF0aW9uICovCisjZGVmaW5lIEdHODI1NjNfUE1DUl9GT1JDRV9QT1dFUl9TVEFURSAgICAgICAgICAgICAgMHgwMDgwIC8qIDE9Rm9yY2UgUG93ZXIgU3RhdGUgKi8KKyNkZWZpbmUgR0c4MjU2M19QTUNSX1BST0dSQU1NRURfUE9XRVJfU1RBVEVfTUFTSyAgICAweDAzMDAKKyNkZWZpbmUgR0c4MjU2M19QTUNSX1BST0dSQU1NRURfUE9XRVJfU1RBVEVfRFIgICAgICAweDAwMDAgLyogMDA9RHIgKi8KKyNkZWZpbmUgR0c4MjU2M19QTUNSX1BST0dSQU1NRURfUE9XRVJfU1RBVEVfRDBVICAgICAweDAxMDAgLyogMDE9RDB1ICovCisjZGVmaW5lIEdHODI1NjNfUE1DUl9QUk9HUkFNTUVEX1BPV0VSX1NUQVRFX0QwQSAgICAgMHgwMjAwIC8qIDEwPUQwYSAqLworI2RlZmluZSBHRzgyNTYzX1BNQ1JfUFJPR1JBTU1FRF9QT1dFUl9TVEFURV9EMyAgICAgIDB4MDMwMCAvKiAxMT1EMyAqLworCisvKiBJbi1CYW5kIENvbnRyb2wgUmVnaXN0ZXIgKFBhZ2UgMTk0LCBSZWdpc3RlciAxOCkgKi8KKyNkZWZpbmUgR0c4MjU2M19JQ1JfRElTX1BBRERJTkcgICAgICAgICAgICAgICAgICAgICAweDAwMTAgLyogRGlzYWJsZSBQYWRkaW5nIFVzZSAqLworCisKKy8qIEJpdCBkZWZpbml0aW9ucyBmb3IgdmFsaWQgUEhZIElEcy4gKi8KKy8qIEkgPSBJbnRlZ3JhdGVkCisgKiBFID0gRXh0ZXJuYWwKKyAqLworI2RlZmluZSBNODhfVkVORE9SICAgICAgICAgMHgwMTQxCisjZGVmaW5lIE04OEUxMDAwX0VfUEhZX0lEICAweDAxNDEwQzUwCisjZGVmaW5lIE04OEUxMDAwX0lfUEhZX0lEICAweDAxNDEwQzMwCisjZGVmaW5lIE04OEUxMDExX0lfUEhZX0lEICAweDAxNDEwQzIwCisjZGVmaW5lIElHUDAxRTEwMDBfSV9QSFlfSUQgIDB4MDJBODAzODAKKyNkZWZpbmUgTTg4RTEwMDBfMTJfUEhZX0lEIE04OEUxMDAwX0VfUEhZX0lECisjZGVmaW5lIE04OEUxMDAwXzE0X1BIWV9JRCBNODhFMTAwMF9FX1BIWV9JRAorI2RlZmluZSBNODhFMTAxMV9JX1JFVl80ICAgMHgwNAorI2RlZmluZSBNODhFMTExMV9JX1BIWV9JRCAgMHgwMTQxMENDMAorI2RlZmluZSBMMUxYVDk3MUFfUEhZX0lEICAgMHgwMDEzNzhFMAorI2RlZmluZSBHRzgyNTYzX0VfUEhZX0lEICAgMHgwMTQxMENBMAorCisKKy8qIEJpdHMuLi4KKyAqIDE1LTU6IHBhZ2UKKyAqIDQtMDogcmVnaXN0ZXIgb2Zmc2V0CisgKi8KKyNkZWZpbmUgUEhZX1BBR0VfU0hJRlQgICAgICAgIDUKKyNkZWZpbmUgUEhZX1JFRyhwYWdlLCByZWcpICAgIFwKKyAgICAgICAgKCgocGFnZSkgPDwgUEhZX1BBR0VfU0hJRlQpIHwgKChyZWcpICYgTUFYX1BIWV9SRUdfQUREUkVTUykpCisKKyNkZWZpbmUgSUdQM19QSFlfUE9SVF9DVFJMICAgICAgICAgICBcCisgICAgICAgIFBIWV9SRUcoNzY5LCAxNykgLyogUG9ydCBHZW5lcmFsIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSUdQM19QSFlfUkFURV9BREFQVF9DVFJMIFwKKyAgICAgICAgUEhZX1JFRyg3NjksIDI1KSAvKiBSYXRlIEFkYXB0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworCisjZGVmaW5lIElHUDNfS01STl9GSUZPX0NUUkxfU1RBVFMgXAorICAgICAgICBQSFlfUkVHKDc3MCwgMTYpIC8qIEtNUk4gRklGTydzIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIElHUDNfS01STl9QT1dFUl9NTkdfQ1RSTCBcCisgICAgICAgIFBIWV9SRUcoNzcwLCAxNykgLyogS01STiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQM19LTVJOX0lOQkFORF9DVFJMIFwKKyAgICAgICAgUEhZX1JFRyg3NzAsIDE4KSAvKiBLTVJOIEluYmFuZCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDNfS01STl9ESUFHIFwKKyAgICAgICAgUEhZX1JFRyg3NzAsIDE5KSAvKiBLTVJOIERpYWdub3N0aWMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQM19LTVJOX0RJQUdfUENTX0xPQ0tfTE9TUyAweDAwMDIgLyogUlggUENTIGlzIG5vdCBzeW5jZWQgKi8KKyNkZWZpbmUgSUdQM19LTVJOX0FDS19USU1FT1VUIFwKKyAgICAgICAgUEhZX1JFRyg3NzAsIDIwKSAvKiBLTVJOIEFja25vd2xlZGdlIFRpbWVvdXRzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgSUdQM19WUl9DVFJMIFwKKyAgICAgICAgUEhZX1JFRyg3NzYsIDE4KSAvKiBWb2x0YWdlIHJlZ3VsYXRvciBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIElHUDNfVlJfQ1RSTF9NT0RFX1NIVVQgICAgICAgMHgwMjAwIC8qIEVudGVyIHBvd2VyZG93biwgc2h1dGRvd24gVlJzICovCisjZGVmaW5lIElHUDNfVlJfQ1RSTF9NT0RFX01BU0sgICAgICAgMHgwMzAwIC8qIFNodXRkb3duIFZSIE1hc2sgKi8KKworI2RlZmluZSBJR1AzX0NBUEFCSUxJVFkgXAorICAgICAgICBQSFlfUkVHKDc3NiwgMTkpIC8qIElHUDMgQ2FwYWJpbGl0eSBSZWdpc3RlciAqLworCisvKiBDYXBhYmlsaXRpZXMgZm9yIFNLVSBDb250cm9sICAqLworI2RlZmluZSBJR1AzX0NBUF9JTklUSUFURV9URUFNICAgICAgIDB4MDAwMSAvKiBBYmxlIHRvIGluaXRpYXRlIGEgdGVhbSAqLworI2RlZmluZSBJR1AzX0NBUF9XRk0gICAgICAgICAgICAgICAgIDB4MDAwMiAvKiBTdXBwb3J0IFdvTCBhbmQgUFhFICovCisjZGVmaW5lIElHUDNfQ0FQX0FTRiAgICAgICAgICAgICAgICAgMHgwMDA0IC8qIFN1cHBvcnQgQVNGICovCisjZGVmaW5lIElHUDNfQ0FQX0xQTFUgICAgICAgICAgICAgICAgMHgwMDA4IC8qIFN1cHBvcnQgTG93IFBvd2VyIExpbmsgVXAgKi8KKyNkZWZpbmUgSUdQM19DQVBfRENfQVVUT19TUEVFRCAgICAgICAweDAwMTAgLyogU3VwcG9ydCBBQy9EQyBBdXRvIExpbmsgU3BlZWQgKi8KKyNkZWZpbmUgSUdQM19DQVBfU1BEICAgICAgICAgICAgICAgICAweDAwMjAgLyogU3VwcG9ydCBTbWFydCBQb3dlciBEb3duICovCisjZGVmaW5lIElHUDNfQ0FQX01VTFRfUVVFVUUgICAgICAgICAgMHgwMDQwIC8qIFN1cHBvcnQgMiB0eCAmIDIgcnggcXVldWVzICovCisjZGVmaW5lIElHUDNfQ0FQX1JTUyAgICAgICAgICAgICAgICAgMHgwMDgwIC8qIFN1cHBvcnQgUlNTICovCisjZGVmaW5lIElHUDNfQ0FQXzgwMjFQUSAgICAgICAgICAgICAgMHgwMTAwIC8qIFN1cHBvcnQgODAyLjFRICYgODAyLjFwICovCisjZGVmaW5lIElHUDNfQ0FQX0FNVF9DQiAgICAgICAgICAgICAgMHgwMjAwIC8qIFN1cHBvcnQgYWN0aXZlIG1hbmFnZWFiaWxpdHkgYW5kIGNpcmN1aXQgYnJlYWtlciAqLworCisjZGVmaW5lIElHUDNfUFBDX0pPUkRBTl9FTiAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIElHUDNfUFBDX0pPUkRBTl9HSUdBX1NQRUVEICAgMHgwMDAyCisKKyNkZWZpbmUgSUdQM19LTVJOX1BNQ19FRV9JRExFX0xJTktfRElTICAgICAgICAgMHgwMDAxCisjZGVmaW5lIElHUDNfS01STl9QTUNfSzBTX0VOVFJZX0xBVEVOQ1lfTUFTSyAgIDB4MDAxRQorI2RlZmluZSBJR1AzX0tNUk5fUE1DX0swU19NT0RFMV9FTl9HSUdBICAgICAgICAweDAwMjAKKyNkZWZpbmUgSUdQM19LTVJOX1BNQ19LMFNfTU9ERTFfRU5fMTAwICAgICAgICAgMHgwMDQwCisKKyNkZWZpbmUgSUdQM0UxMDAwX1BIWV9NSVNDX0NUUkwgICAgICAgICAgICAgICAgMHgxQiAgIC8qIE1pc2MuIEN0cmwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQM19QSFlfTUlTQ19EVVBMRVhfTUFOVUFMX1NFVCAgICAgICAgMHgxMDAwIC8qIER1cGxleCBNYW51YWwgU2V0ICovCisKKyNkZWZpbmUgSUdQM19LTVJOX0VYVF9DVFJMICBQSFlfUkVHKDc3MCwgMTgpCisjZGVmaW5lIElHUDNfS01STl9FQ19ESVNfSU5CQU5EICAgIDB4MDA4MAorCisjZGVmaW5lIElHUDAzRTEwMDBfRV9QSFlfSUQgIDB4MDJBODAzOTAKKyNkZWZpbmUgSUZFX0VfUEhZX0lEICAgICAgICAgMHgwMkE4MDMzMCAvKiAxMC8xMDAgUEhZICovCisjZGVmaW5lIElGRV9QTFVTX0VfUEhZX0lEICAgIDB4MDJBODAzMjAKKyNkZWZpbmUgSUZFX0NfRV9QSFlfSUQgICAgICAgMHgwMkE4MDMxMAorCisjZGVmaW5lIElGRV9QSFlfRVhURU5ERURfU1RBVFVTX0NPTlRST0wgICAweDEwICAvKiAxMDBCYXNlVHggRXh0ZW5kZWQgU3RhdHVzLCBDb250cm9sIGFuZCBBZGRyZXNzICovCisjZGVmaW5lIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MICAgICAgICAgICAweDExICAvKiAxMDBCYXNlVHggUEhZIHNwZWNpYWwgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBJRkVfUEhZX1JDVl9GQUxTRV9DQVJSSUVSICAgICAgICAgMHgxMyAgLyogMTAwQmFzZVR4IFJlY2VpdmUgRmFsc2UgQ2FycmllciBDb3VudGVyICovCisjZGVmaW5lIElGRV9QSFlfUkNWX0RJU0NPTk5FQ1QgICAgICAgICAgICAweDE0ICAvKiAxMDBCYXNlVHggUmVjZWl2ZSBEaXNjb25uZXQgQ291bnRlciAqLworI2RlZmluZSBJRkVfUEhZX1JDVl9FUlJPVF9GUkFNRSAgICAgICAgICAgMHgxNSAgLyogMTAwQmFzZVR4IFJlY2VpdmUgRXJyb3IgRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBJRkVfUEhZX1JDVl9TWU1CT0xfRVJSICAgICAgICAgICAgMHgxNiAgLyogUmVjZWl2ZSBTeW1ib2wgRXJyb3IgQ291bnRlciAqLworI2RlZmluZSBJRkVfUEhZX1BSRU1fRU9GX0VSUiAgICAgICAgICAgICAgMHgxNyAgLyogMTAwQmFzZVR4IFJlY2VpdmUgUHJlbWF0dXJlIEVuZCBPZiBGcmFtZSBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIElGRV9QSFlfUkNWX0VPRl9FUlIgICAgICAgICAgICAgICAweDE4ICAvKiAxMEJhc2VUIFJlY2VpdmUgRW5kIE9mIEZyYW1lIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgSUZFX1BIWV9UWF9KQUJCRVJfREVURUNUICAgICAgICAgIDB4MTkgIC8qIDEwQmFzZVQgVHJhbnNtaXQgSmFiYmVyIERldGVjdCBDb3VudGVyICovCisjZGVmaW5lIElGRV9QSFlfRVFVQUxJWkVSICAgICAgICAgICAgICAgICAweDFBICAvKiBQSFkgRXF1YWxpemVyIENvbnRyb2wgYW5kIFN0YXR1cyAqLworI2RlZmluZSBJRkVfUEhZX1NQRUNJQUxfQ09OVFJPTF9MRUQgICAgICAgMHgxQiAgLyogUEhZIHNwZWNpYWwgY29udHJvbCBhbmQgTEVEIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSUZFX1BIWV9NRElYX0NPTlRST0wgICAgICAgICAgICAgIDB4MUMgIC8qIE1ESS9NREktWCBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIElGRV9QSFlfSFdJX0NPTlRST0wgICAgICAgICAgICAgICAweDFEICAvKiBIYXJkd2FyZSBJbnRlZ3JpdHkgQ29udHJvbCAoSFdJKSAqLworCisjZGVmaW5lIElGRV9QRVNDX1JFRFVDRURfUE9XRVJfRE9XTl9ESVNBQkxFICAweDIwMDAgIC8qIERlZmF1dCAxID0gRGlzYWJsZSBhdXRvIHJlZHVjZWQgcG93ZXIgZG93biAqLworI2RlZmluZSBJRkVfUEVTQ18xMDBCVFhfUE9XRVJfRE9XTiAgICAgICAgICAgMHgwNDAwICAvKiBJbmRpY2F0ZXMgdGhlIHBvd2VyIHN0YXRlIG9mIDEwMEJBU0UtVFggKi8KKyNkZWZpbmUgSUZFX1BFU0NfMTBCVFhfUE9XRVJfRE9XTiAgICAgICAgICAgIDB4MDIwMCAgLyogSW5kaWNhdGVzIHRoZSBwb3dlciBzdGF0ZSBvZiAxMEJBU0UtVCAqLworI2RlZmluZSBJRkVfUEVTQ19QT0xBUklUWV9SRVZFUlNFRCAgICAgICAgICAgMHgwMTAwICAvKiBJbmRpY2F0ZXMgMTBCQVNFLVQgcG9sYXJpdHkgKi8KKyNkZWZpbmUgSUZFX1BFU0NfUEhZX0FERFJfTUFTSyAgICAgICAgICAgICAgIDB4MDA3QyAgLyogQml0IDY6MiBmb3Igc2FtcGxlZCBQSFkgYWRkcmVzcyAqLworI2RlZmluZSBJRkVfUEVTQ19TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBdXRvLW5lZ290aWF0aW9uIHNwZWVkIHJlc3VsdCAxPTEwME1icywgMD0xME1icyAqLworI2RlZmluZSBJRkVfUEVTQ19EVVBMRVggICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBdXRvLW5lZ290aWF0aW9uIGR1cGxleCByZXN1bHQgMT1GdWxsLCAwPUhhbGYgKi8KKyNkZWZpbmUgSUZFX1BFU0NfUE9MQVJJVFlfUkVWRVJTRURfU0hJRlQgICAgIDgKKworI2RlZmluZSBJRkVfUFNDX0RJU0FCTEVfRFlOQU1JQ19QT1dFUl9ET1dOICAgMHgwMTAwICAvKiAxID0gRHlhbm1pYyBQb3dlciBEb3duIGRpc2FibGVkICovCisjZGVmaW5lIElGRV9QU0NfRk9SQ0VfUE9MQVJJVFkgICAgICAgICAgICAgICAweDAwMjAgIC8qIDE9UmV2ZXJzZWQgUG9sYXJpdHksIDA9Tm9ybWFsICovCisjZGVmaW5lIElGRV9QU0NfQVVUT19QT0xBUklUWV9ESVNBQkxFICAgICAgICAweDAwMTAgIC8qIDE9QXV0byBQb2xhcml0eSBEaXNhYmxlZCwgMD1FbmFibGVkICovCisjZGVmaW5lIElGRV9QU0NfSkFCQkVSX0ZVTkNfRElTQUJMRSAgICAgICAgICAweDAwMDEgIC8qIDE9SmFiYmVyIERpc2FibGVkLCAwPU5vcm1hbCBKYWJiZXIgT3BlcmF0aW9uICovCisjZGVmaW5lIElGRV9QU0NfRk9SQ0VfUE9MQVJJVFlfU0hJRlQgICAgICAgICA1CisjZGVmaW5lIElGRV9QU0NfQVVUT19QT0xBUklUWV9ESVNBQkxFX1NISUZUICA0CisKKyNkZWZpbmUgSUZFX1BNQ19BVVRPX01ESVggICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogMT1lbmFibGUgTURJL01ESS1YIGZlYXR1cmUsIGRlZmF1bHQgMD1kaXNhYmxlZCAqLworI2RlZmluZSBJRkVfUE1DX0ZPUkNFX01ESVggICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiAxPWZvcmNlIE1ESVgtWCwgMD1mb3JjZSBNREkgKi8KKyNkZWZpbmUgSUZFX1BNQ19NRElYX1NUQVRVUyAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogMT1NREktWCwgMD1NREkgKi8KKyNkZWZpbmUgSUZFX1BNQ19BVVRPX01ESVhfQ09NUExFVEUgICAgICAgICAgIDB4MDAxMCAgLyogUmVzb2x1dGlvbiBhbGdvcml0aG0gaXMgY29tcGxldGVkICovCisjZGVmaW5lIElGRV9QTUNfTURJWF9NT0RFX1NISUZUICAgICAgICAgICAgICA2CisjZGVmaW5lIElGRV9QSENfTURJWF9SRVNFVF9BTExfTUFTSyAgICAgICAgICAweDAwMDAgIC8qIERpc2FibGUgYXV0byBNREktWCAqLworCisjZGVmaW5lIElGRV9QSENfSFdJX0VOQUJMRSAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEVuYWJsZSB0aGUgSFdJIGZlYXR1cmUgKi8KKyNkZWZpbmUgSUZFX1BIQ19BQklMSVRZX0NIRUNLICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogMT0gVGVzdCBQYXNzZWQsIDA9ZmFpbGVkICovCisjZGVmaW5lIElGRV9QSENfVEVTVF9FWEVDICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFBIWSBsYXVuY2ggdGVzdCBwdWxzZXMgb24gdGhlIHdpcmUgKi8KKyNkZWZpbmUgSUZFX1BIQ19ISUdIWiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogMSA9IE9wZW4gQ2lyY3VpdCAqLworI2RlZmluZSBJRkVfUEhDX0xPV1ogICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiAxID0gU2hvcnQgQ2lyY3VpdCAqLworI2RlZmluZSBJRkVfUEhDX0xPV19ISUdIX1pfTUFTSyAgICAgICAgICAgICAgMHgwNjAwICAvKiBNYXNrIGZvciBpbmRpY2F0aW9uIHR5cGUgb2YgcHJvYmxlbSBvbiB0aGUgbGluZSAqLworI2RlZmluZSBJRkVfUEhDX0RJU1RBTkNFX01BU0sgICAgICAgICAgICAgICAgMHgwMUZGICAvKiBNYXNrIGZvciBkaXN0YW5jZSB0byB0aGUgY2FibGUgcHJvYmxlbSwgaW4gODBjbSBncmFudWxhcml0eSAqLworI2RlZmluZSBJRkVfUEhDX1JFU0VUX0FMTF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwICAvKiBEaXNhYmxlIEhXSSAqLworI2RlZmluZSBJRkVfUFNDTF9QUk9CRV9NT0RFICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMRUQgUHJvYmUgbW9kZSAqLworI2RlZmluZSBJRkVfUFNDTF9QUk9CRV9MRURTX09GRiAgICAgICAgICAgICAgMHgwMDA2ICAvKiBGb3JjZSBMRURzIDAgYW5kIDIgb2ZmICovCisjZGVmaW5lIElGRV9QU0NMX1BST0JFX0xFRFNfT04gICAgICAgICAgICAgICAweDAwMDcgIC8qIEZvcmNlIExFRHMgMCBhbmQgMiBvbiAqLworCisjZGVmaW5lIElDSF9GTEFTSF9DT01NQU5EX1RJTUVPVVQgICAgICAgICAgICA1MDAwICAgIC8qIDUwMDAgdVNlY3MgLSBhZGp1c3RlZCAqLworI2RlZmluZSBJQ0hfRkxBU0hfRVJBU0VfVElNRU9VVCAgICAgICAgICAgICAgMzAwMDAwMCAvKiBVcCB0byAzIHNlY29uZHMgLSB3b3JzdCBjYXNlICovCisjZGVmaW5lIElDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgICAgICAgICAxMCAgICAgIC8qIDEwIGN5Y2xlcyAqLworI2RlZmluZSBJQ0hfRkxBU0hfU0VHX1NJWkVfMjU2ICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIElDSF9GTEFTSF9TRUdfU0laRV80SyAgICAgICAgICAgICAgICA0MDk2CisjZGVmaW5lIElDSF9GTEFTSF9TRUdfU0laRV82NEsgICAgICAgICAgICAgICA2NTUzNgorCisjZGVmaW5lIElDSF9DWUNMRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSUNIX0NZQ0xFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBJQ0hfQ1lDTEVfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIElDSF9DWUNMRV9FUkFTRSAgICAgICAgICAgICAgICAgICAgICAweDMKKworI2RlZmluZSBJQ0hfRkxBU0hfR0ZQUkVHICAgMHgwMDAwCisjZGVmaW5lIElDSF9GTEFTSF9IU0ZTVFMgICAweDAwMDQKKyNkZWZpbmUgSUNIX0ZMQVNIX0hTRkNUTCAgIDB4MDAwNgorI2RlZmluZSBJQ0hfRkxBU0hfRkFERFIgICAgMHgwMDA4CisjZGVmaW5lIElDSF9GTEFTSF9GREFUQTAgICAweDAwMTAKKyNkZWZpbmUgSUNIX0ZMQVNIX0ZSQUNDICAgIDB4MDA1MAorI2RlZmluZSBJQ0hfRkxBU0hfRlJFRzAgICAgMHgwMDU0CisjZGVmaW5lIElDSF9GTEFTSF9GUkVHMSAgICAweDAwNTgKKyNkZWZpbmUgSUNIX0ZMQVNIX0ZSRUcyICAgIDB4MDA1QworI2RlZmluZSBJQ0hfRkxBU0hfRlJFRzMgICAgMHgwMDYwCisjZGVmaW5lIElDSF9GTEFTSF9GUFIwICAgICAweDAwNzQKKyNkZWZpbmUgSUNIX0ZMQVNIX0ZQUjEgICAgIDB4MDA3OAorI2RlZmluZSBJQ0hfRkxBU0hfU1NGU1RTICAgMHgwMDkwCisjZGVmaW5lIElDSF9GTEFTSF9TU0ZDVEwgICAweDAwOTIKKyNkZWZpbmUgSUNIX0ZMQVNIX1BSRU9QICAgIDB4MDA5NAorI2RlZmluZSBJQ0hfRkxBU0hfT1BUWVBFICAgMHgwMDk2CisjZGVmaW5lIElDSF9GTEFTSF9PUE1FTlUgICAweDAwOTgKKworI2RlZmluZSBJQ0hfRkxBU0hfUkVHX01BUFNJWkUgICAgICAweDAwQTAKKyNkZWZpbmUgSUNIX0ZMQVNIX1NFQ1RPUl9TSVpFICAgICAgNDA5NgorI2RlZmluZSBJQ0hfR0ZQUkVHX0JBU0VfTUFTSyAgICAgICAweDFGRkYKKyNkZWZpbmUgSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0sgMHgwMEZGRkZGRgorCisvKiBJQ0g4IEdiRSBGbGFzaCBIYXJkd2FyZSBTZXF1ZW5jaW5nIEZsYXNoIFN0YXR1cyBSZWdpc3RlciBiaXQgYnJlYWtkb3duICovCisvKiBPZmZzZXQgMDRoIEhTRlNUUyAqLwordW5pb24gaWNoOF9od3NfZmxhc2hfc3RhdHVzIHsKKyAgICBzdHJ1Y3QgaWNoOF9oc2ZzdHMgeworI2lmZGVmIEUxMDAwX0JJR19FTkRJQU4KKyAgICAgICAgdWludDE2X3QgcmVzZXJ2ZWQyICAgICAgOjY7CisgICAgICAgIHVpbnQxNl90IGZsZGVzdmFsaWQgICAgIDoxOworICAgICAgICB1aW50MTZfdCBmbG9ja2RuICAgICAgICA6MTsKKyAgICAgICAgdWludDE2X3QgZmxjZG9uZSAgICAgICAgOjE7CisgICAgICAgIHVpbnQxNl90IGZsY2VyciAgICAgICAgIDoxOworICAgICAgICB1aW50MTZfdCBkYWVsICAgICAgICAgICA6MTsKKyAgICAgICAgdWludDE2X3QgYmVyYXNlc3ogICAgICAgOjI7CisgICAgICAgIHVpbnQxNl90IGZsY2lucHJvZyAgICAgIDoxOworICAgICAgICB1aW50MTZfdCByZXNlcnZlZDEgICAgICA6MjsKKyNlbHNlCisgICAgICAgIHVpbnQxNl90IGZsY2RvbmUgICAgICAgIDoxOyAgIC8qIGJpdCAwIEZsYXNoIEN5Y2xlIERvbmUgKi8KKyAgICAgICAgdWludDE2X3QgZmxjZXJyICAgICAgICAgOjE7ICAgLyogYml0IDEgRmxhc2ggQ3ljbGUgRXJyb3IgKi8KKyAgICAgICAgdWludDE2X3QgZGFlbCAgICAgICAgICAgOjE7ICAgLyogYml0IDIgRGlyZWN0IEFjY2VzcyBlcnJvciBMb2cgKi8KKyAgICAgICAgdWludDE2X3QgYmVyYXNlc3ogICAgICAgOjI7ICAgLyogYml0IDQ6MyBCbG9jay9TZWN0b3IgRXJhc2UgU2l6ZSAqLworICAgICAgICB1aW50MTZfdCBmbGNpbnByb2cgICAgICA6MTsgICAvKiBiaXQgNSBmbGFzaCBTUEkgY3ljbGUgaW4gUHJvZ3Jlc3MgKi8KKyAgICAgICAgdWludDE2X3QgcmVzZXJ2ZWQxICAgICAgOjI7ICAgLyogYml0IDEzOjYgUmVzZXJ2ZWQgKi8KKyAgICAgICAgdWludDE2X3QgcmVzZXJ2ZWQyICAgICAgOjY7ICAgLyogYml0IDEzOjYgUmVzZXJ2ZWQgKi8KKyAgICAgICAgdWludDE2X3QgZmxkZXN2YWxpZCAgICAgOjE7ICAgLyogYml0IDE0IEZsYXNoIERlc2NyaXB0b3IgVmFsaWQgKi8KKyAgICAgICAgdWludDE2X3QgZmxvY2tkbiAgICAgICAgOjE7ICAgLyogYml0IDE1IEZsYXNoIENvbmZpZ3VyYXRpb24gTG9jay1Eb3duICovCisjZW5kaWYKKyAgICB9IGhzZl9zdGF0dXM7CisgICAgdWludDE2X3QgcmVndmFsOworfTsKKworLyogSUNIOCBHYkUgRmxhc2ggSGFyZHdhcmUgU2VxdWVuY2luZyBGbGFzaCBjb250cm9sIFJlZ2lzdGVyIGJpdCBicmVha2Rvd24gKi8KKy8qIE9mZnNldCAwNmggRkxDVEwgKi8KK3VuaW9uIGljaDhfaHdzX2ZsYXNoX2N0cmwgeworICAgIHN0cnVjdCBpY2g4X2hzZmxjdGwgeworI2lmZGVmIEUxMDAwX0JJR19FTkRJQU4KKyAgICAgICAgdWludDE2X3QgZmxkYmNvdW50ICAgICAgOjI7CisgICAgICAgIHVpbnQxNl90IGZsb2NrZG4gICAgICAgIDo2OworICAgICAgICB1aW50MTZfdCBmbGNnbyAgICAgICAgICA6MTsKKyAgICAgICAgdWludDE2X3QgZmxjeWNsZSAgICAgICAgOjI7CisgICAgICAgIHVpbnQxNl90IHJlc2VydmVkICAgICAgIDo1OworI2Vsc2UKKyAgICAgICAgdWludDE2X3QgZmxjZ28gICAgICAgICAgOjE7ICAgLyogMCBGbGFzaCBDeWNsZSBHbyAqLworICAgICAgICB1aW50MTZfdCBmbGN5Y2xlICAgICAgICA6MjsgICAvKiAyOjEgRmxhc2ggQ3ljbGUgKi8KKyAgICAgICAgdWludDE2X3QgcmVzZXJ2ZWQgICAgICAgOjU7ICAgLyogNzozIFJlc2VydmVkICAqLworICAgICAgICB1aW50MTZfdCBmbGRiY291bnQgICAgICA6MjsgICAvKiA5OjggRmxhc2ggRGF0YSBCeXRlIENvdW50ICovCisgICAgICAgIHVpbnQxNl90IGZsb2NrZG4gICAgICAgIDo2OyAgIC8qIDE1OjEwIFJlc2VydmVkICovCisjZW5kaWYKKyAgICB9IGhzZl9jdHJsOworICAgIHVpbnQxNl90IHJlZ3ZhbDsKK307CisKKy8qIElDSDggRmxhc2ggUmVnaW9uIEFjY2VzcyBQZXJtaXNzaW9ucyAqLwordW5pb24gaWNoOF9od3NfZmxhc2hfcmVnYWNjIHsKKyAgICBzdHJ1Y3QgaWNoOF9mbHJhY2MgeworI2lmZGVmIEUxMDAwX0JJR19FTkRJQU4KKyAgICAgICAgdWludDMyX3QgZ213YWcgICAgICAgICAgOjg7CisgICAgICAgIHVpbnQzMl90IGdtcmFnICAgICAgICAgIDo4OworICAgICAgICB1aW50MzJfdCBncndhICAgICAgICAgICA6ODsKKyAgICAgICAgdWludDMyX3QgZ3JyYSAgICAgICAgICAgOjg7CisjZWxzZQorICAgICAgICB1aW50MzJfdCBncnJhICAgICAgICAgICA6ODsgICAvKiAwOjcgR2JFIHJlZ2lvbiBSZWFkIEFjY2VzcyAqLworICAgICAgICB1aW50MzJfdCBncndhICAgICAgICAgICA6ODsgICAvKiA4OjE1IEdiRSByZWdpb24gV3JpdGUgQWNjZXNzICovCisgICAgICAgIHVpbnQzMl90IGdtcmFnICAgICAgICAgIDo4OyAgIC8qIDIzOjE2IEdiRSBNYXN0ZXIgUmVhZCBBY2Nlc3MgR3JhbnQgICovCisgICAgICAgIHVpbnQzMl90IGdtd2FnICAgICAgICAgIDo4OyAgIC8qIDMxOjI0IEdiRSBNYXN0ZXIgV3JpdGUgQWNjZXNzIEdyYW50ICovCisjZW5kaWYKKyAgICB9IGhzZl9mbHJlZ2FjYzsKKyAgICB1aW50MTZfdCByZWd2YWw7Cit9OworCisvKiBNaXNjZWxsYW5lb3VzIFBIWSBiaXQgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIFBIWV9QUkVBTUJMRSAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBQSFlfU09GICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUEhZX09QX1JFQUQgICAgICAgICAweDAyCisjZGVmaW5lIFBIWV9PUF9XUklURSAgICAgICAgMHgwMQorI2RlZmluZSBQSFlfVFVSTkFST1VORCAgICAgIDB4MDIKKyNkZWZpbmUgUEhZX1BSRUFNQkxFX1NJWkUgICAzMgorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAwMCAgIDB4MDA0MAorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAwICAgIDB4MjAwMAorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAgICAgIDB4MDAwMAorI2RlZmluZSBFMTAwMF9QSFlfQUREUkVTUyAgIDB4MDEKKyNkZWZpbmUgUEhZX0FVVE9fTkVHX1RJTUUgICA0NSAgLyogNC41IFNlY29uZHMgKi8KKyNkZWZpbmUgUEhZX0ZPUkNFX1RJTUUgICAgICAyMCAgLyogMi4wIFNlY29uZHMgKi8KKyNkZWZpbmUgUEhZX1JFVklTSU9OX01BU0sgICAweEZGRkZGRkYwCisjZGVmaW5lIERFVklDRV9TUEVFRF9NQVNLICAgMHgwMDAwMDMwMCAgLyogRGV2aWNlIEN0cmwgUmVnIFNwZWVkIE1hc2sgKi8KKyNkZWZpbmUgUkVHNF9TUEVFRF9NQVNLICAgICAweDAxRTAKKyNkZWZpbmUgUkVHOV9TUEVFRF9NQVNLICAgICAweDAzMDAKKyNkZWZpbmUgQURWRVJUSVNFXzEwX0hBTEYgICAweDAwMDEKKyNkZWZpbmUgQURWRVJUSVNFXzEwX0ZVTEwgICAweDAwMDIKKyNkZWZpbmUgQURWRVJUSVNFXzEwMF9IQUxGICAweDAwMDQKKyNkZWZpbmUgQURWRVJUSVNFXzEwMF9GVUxMICAweDAwMDgKKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBfSEFMRiAweDAwMTAKKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBfRlVMTCAweDAwMjAKKyNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVCAweDAwMkYgIC8qIEV2ZXJ5dGhpbmcgYnV0IDEwMDAtSGFsZiAqLworI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV8xMF8xMDBfQUxMICAgIDB4MDAwRiAvKiBBbGwgMTAvMTAwIHNwZWVkcyovCisjZGVmaW5lIEFVVE9ORUdfQURWRVJUSVNFXzEwX0FMTCAgICAgICAgMHgwMDAzIC8qIDEwTWJwcyBGdWxsICYgSGFsZiBzcGVlZHMqLworCisjZW5kaWYgLyogX0UxMDAwX0hXX0hfICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGJmOGQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaApAQCAtMCwwICsxLDE0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBJbnRlbCBQUk8vMTAwMCBMaW51eCBkcml2ZXIKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA2IEludGVsIENvcnBvcmF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTsKKworLyogZ2x1ZSBmb3IgdGhlIE9TIGluZGVwZW5kZW50IHBhcnQgb2YgZTEwMDAKKyAqIGluY2x1ZGVzIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MKKyAqLworCisjaWZuZGVmIF9FMTAwMF9PU0RFUF9IXworI2RlZmluZSBfRTEwMDBfT1NERVBfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisKK3R5cGVkZWYgZW51bSB7CisjdW5kZWYgRkFMU0UKKyAgICBGQUxTRSA9IDAsCisjdW5kZWYgVFJVRQorICAgIFRSVUUgPSAxCit9IGJvb2xlYW5fdDsKKworLyogRGVidWdnaW5nICNkZWZpbmVzICovCisKKyNpZiAxCisjZGVmaW5lIERFQlVHRlVOQyhGKSBEQkcoRiAiXG4iKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdGVU5DKEYpCisjZW5kaWYKKworI2lmIDEKKyNkZWZpbmUgREVCVUdPVVQoUykgICAgICAgICAgICAgREJHKFMpCisjZGVmaW5lIERFQlVHT1VUMShTLCBBLi4uKSAgICAgIERCRyhTLCBBKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdPVVQoUykKKyNkZWZpbmUgREVCVUdPVVQxKFMsIEEuLi4pCisjZW5kaWYKKworI2RlZmluZSBERUJVR09VVDIgREVCVUdPVVQxCisjZGVmaW5lIERFQlVHT1VUMyBERUJVR09VVDEKKyNkZWZpbmUgREVCVUdPVVQ3IERFQlVHT1VUMQorCisjZGVmaW5lIEUxMDAwX1dSSVRFX1JFRyhhLCByZWcsIHZhbHVlKSBcCisgICAgd3JpdGVsKCh2YWx1ZSksICgoYSktPmh3X2FkZHIgKyBcCisgICAgICAgICgoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBFMTAwMF8jI3JlZyA6IEUxMDAwXzgyNTQyXyMjcmVnKSkpCisKKyNkZWZpbmUgRTEwMDBfUkVBRF9SRUcoYSwgcmVnKSBcCisgICAgcmVhZGwoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykpCisKKyNkZWZpbmUgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGEsIHJlZywgb2Zmc2V0LCB2YWx1ZSkgXAorICAgIHdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykgKyBcCisgICAgICAgICgob2Zmc2V0KSA8PCAyKSkpCisKKyNkZWZpbmUgRTEwMDBfUkVBRF9SRUdfQVJSQVkoYSwgcmVnLCBvZmZzZXQpIFwKKyAgICByZWFkbCgoYSktPmh3X2FkZHIgKyBcCisgICAgICAgICgoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBFMTAwMF8jI3JlZyA6IEUxMDAwXzgyNTQyXyMjcmVnKSArIFwKKyAgICAgICAgKChvZmZzZXQpIDw8IDIpKQorCisjZGVmaW5lIEUxMDAwX1JFQURfUkVHX0FSUkFZX0RXT1JEIEUxMDAwX1JFQURfUkVHX0FSUkFZCisjZGVmaW5lIEUxMDAwX1dSSVRFX1JFR19BUlJBWV9EV09SRCBFMTAwMF9XUklURV9SRUdfQVJSQVkKKworI2RlZmluZSBFMTAwMF9XUklURV9SRUdfQVJSQVlfV09SRChhLCByZWcsIG9mZnNldCwgdmFsdWUpIFwKKyAgICB3cml0ZXcoKHZhbHVlKSwgKChhKS0+aHdfYWRkciArIFwKKyAgICAgICAgKCgoYSktPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSA/IEUxMDAwXyMjcmVnIDogRTEwMDBfODI1NDJfIyNyZWcpICsgXAorICAgICAgICAoKG9mZnNldCkgPDwgMSkpKQorCisjZGVmaW5lIEUxMDAwX1JFQURfUkVHX0FSUkFZX1dPUkQoYSwgcmVnLCBvZmZzZXQpIFwKKyAgICByZWFkdygoYSktPmh3X2FkZHIgKyBcCisgICAgICAgICgoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBFMTAwMF8jI3JlZyA6IEUxMDAwXzgyNTQyXyMjcmVnKSArIFwKKyAgICAgICAgKChvZmZzZXQpIDw8IDEpKQorCisjZGVmaW5lIEUxMDAwX1dSSVRFX1JFR19BUlJBWV9CWVRFKGEsIHJlZywgb2Zmc2V0LCB2YWx1ZSkgXAorICAgIHdyaXRlYigodmFsdWUpLCAoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykgKyBcCisgICAgICAgIChvZmZzZXQpKSkKKworI2RlZmluZSBFMTAwMF9SRUFEX1JFR19BUlJBWV9CWVRFKGEsIHJlZywgb2Zmc2V0KSBcCisgICAgcmVhZGIoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykgKyBcCisgICAgICAgIChvZmZzZXQpKQorCisjZGVmaW5lIEUxMDAwX1dSSVRFX0ZMVVNIKGEpIEUxMDAwX1JFQURfUkVHKGEsIFNUQVRVUykKKworI2RlZmluZSBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHKGEsIHJlZywgdmFsdWUpIFwKKyAgICB3cml0ZWwoKHZhbHVlKSwgKChhKS0+Zmxhc2hfYWRkcmVzcyArIHJlZykpCisKKyNkZWZpbmUgRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHKGEsIHJlZykgXAorICAgIHJlYWRsKChhKS0+Zmxhc2hfYWRkcmVzcyArIHJlZykKKworI2RlZmluZSBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoYSwgcmVnLCB2YWx1ZSkgXAorICAgIHdyaXRldygodmFsdWUpLCAoKGEpLT5mbGFzaF9hZGRyZXNzICsgcmVnKSkKKworI2RlZmluZSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihhLCByZWcpIFwKKyAgICByZWFkdygoYSktPmZsYXNoX2FkZHJlc3MgKyByZWcpCisKKyNkZWZpbmUJbXNsZWVwKG4pIAltZGVsYXkobikKKworI2VuZGlmIC8qIF9FMTAwMF9PU0RFUF9IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZWVwcm8uYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2VlcHJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0ODY5MgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2VlcHJvLmMKQEAgLTAsMCArMSw2MzcgQEAKKyNpZmRlZiBBTExNVUxUSQorI2Vycm9yIG11bHRpY2FzdCBzdXBwb3J0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorSW50ZWwgRUVQUk8vMTAgTklDIGRyaXZlciBmb3IgRXRoZXJib290CitBZGFwdGVkIGZyb20gTGludXggZWVwcm8uYyBmcm9tIGtlcm5lbCAyLjIuMTcKKworVGhpcyBib2FyZCBhY2NlcHRzIGEgMzIgcGluIEVFUFJPTSAoMjlDMjU2KSwgaG93ZXZlciBhIHRlc3Qgd2l0aCBhCisyN0MwMTAgc2hvd3MgdGhhdCB0aGlzIEVQUk9NIGFsc28gd29ya3MgaW4gdGhlIHNvY2tldCwgYnV0IGl0J3Mgbm90IGNsZWFyCitob3cgcmVwZWF0YWJseS4gVGhlIHR3byB0b3AgYWRkcmVzcyBwaW5zIGFwcGVhciB0byBiZSBoZWxkIGxvdywgdGh1cwordGhlIGJvdHRvbSAzMmtCIG9mIHRoZSAyN0MwMTAgaXMgdmlzaWJsZSBpbiB0aGUgQ1BVJ3MgYWRkcmVzcyBzcGFjZS4KK1RvIGJlIHN1cmUgeW91IGNvdWxkIHB1dCA0IGNvcGllcyBvZiB0aGUgY29kZSBpbiB0aGUgMjdDMDEwLCB0aGVuCitpdCBkb2Vzbid0IG1hdHRlciB3aGV0aGVyIHRoZSBleHRyYSBsaW5lcyBhcmUgaGVsZCBsb3cgb3IgaGlnaCwganVzdAoraG9wZWZ1bGx5IG5vdCBmbG9hdGluZyBhcyBDTU9TIGNoaXBzIGRvbid0IGxpa2UgZmxvYXRpbmcgaW5wdXRzLgorCitCZSBjYXJlZnVsIHdpdGggc2VhdGluZyB0aGUgRVBST00gYXMgdGhlIHNvY2tldCBvbiBteSBib2FyZCBhY3R1YWxseQoraGFzIDM0IHBpbnMsIHRoZSB0b3Agcm93IG9mIDIgYXJlIG5vdCB1c2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCisgdGltbGVnZ2UJMjAwNS0wNS0xOAlyZW1vdmUgdGhlIHJlbG9jYXRpb24gY2hhbmdlcyBjYXJkcyB0aGF0IAorCQkJCXdyaXRlIGRpcmVjdGx5IHRvIHRoZSBoYXJkd2FyZSBkb24ndCBuZWVkIGl0CisqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgPGdweGUvaXNhLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorCisvKiBEaWZmZXJlbnQgODI1OTUgY2hpcHMgKi8KKyNkZWZpbmUgTEFONTk1CQkwCisjZGVmaW5lIExBTjU5NVRYCTEKKyNkZWZpbmUgTEFONTk1RlgJMgorI2RlZmluZSBMQU41OTVGWF8xMElTQQkzCisKKyNkZWZpbmUJU0xPV19ET1dOCWluYigweDgwKTsKKworLyogVGhlIHN0YXRpb24gKGV0aGVybmV0KSBhZGRyZXNzIHByZWZpeCwgdXNlZCBmb3IgSURpbmcgdGhlIGJvYXJkLiAqLworI2RlZmluZSBTQV9BRERSMCAweDAwCS8qIEV0aGVyZXhwcmVzcyBQcm8vMTAgKi8KKyNkZWZpbmUgU0FfQUREUjEgMHhhYQorI2RlZmluZSBTQV9BRERSMiAweDAwCisKKyNkZWZpbmUgR2V0Qml0KHgseSkgKCh4ICYgKDE8PHkpKT4+eSkKKworLyogRUVQUk9NIFdvcmQgMDogKi8KKyNkZWZpbmUgZWVfUG5QICAgICAgIDAgIC8qIFBsdWcgJ24gUGxheSBlbmFibGUgYml0ICovCisjZGVmaW5lIGVlX1dvcmQxICAgICAxICAvKiBXb3JkIDE/ICovCisjZGVmaW5lIGVlX0J1c1dpZHRoICAyICAvKiA4LzE2IGJpdCAqLworI2RlZmluZSBlZV9GbGFzaEFkZHIgMyAgLyogRmxhc2ggQWRkcmVzcyAqLworI2RlZmluZSBlZV9GbGFzaE1hc2sgMHg3ICAgLyogTWFzayAqLworI2RlZmluZSBlZV9BdXRvSU8gICAgNiAgLyogKi8KKyNkZWZpbmUgZWVfcmVzZXJ2ZWQwIDcgIC8qID0wISAqLworI2RlZmluZSBlZV9GbGFzaCAgICAgOCAgLyogRmxhc2ggdGhlcmU/ICovCisjZGVmaW5lIGVlX0F1dG9OZWcgICA5ICAvKiBBdXRvIE5lZ290aWF0aW9uIGVuYWJsZWQ/ICovCisjZGVmaW5lIGVlX0lPMCAgICAgICAxMCAvKiBJTyBBZGRyZXNzIExTQiAqLworI2RlZmluZSBlZV9JTzBNYXNrICAgMHggLyouLi4qLworI2RlZmluZSBlZV9JTzEgICAgICAgMTUgLyogSU8gTVNCICovCisKKy8qIEVFUFJPTSBXb3JkIDE6ICovCisjZGVmaW5lIGVlX0ludFNlbCAgICAwICAgLyogSW50ZXJydXB0ICovCisjZGVmaW5lIGVlX0ludE1hc2sgICAweDcKKyNkZWZpbmUgZWVfTEkgICAgICAgIDMgICAvKiBMaW5rIEludGVncml0eSAwPSBlbmFibGVkICovCisjZGVmaW5lIGVlX1BDICAgICAgICA0ICAgLyogUG9sYXJpdHkgQ29ycmVjdGlvbiAwPSBlbmFibGVkICovCisjZGVmaW5lIGVlX1RQRV9BVUkgICA1ICAgLyogUG9ydFNlbGVjdGlvbiAxPVRQRSAqLworI2RlZmluZSBlZV9KYWJiZXIgICAgNiAgIC8qIEphYmJlciBwcmV2ZW50aW9uIDA9IGVuYWJsZWQgKi8KKyNkZWZpbmUgZWVfQXV0b1BvcnQgIDcgICAvKiBBdXRvIFBvcnQgU2VsZWN0aW9uIDE9IERpc2FibGVkICovCisjZGVmaW5lIGVlX1NNT1VUICAgICA4ICAgLyogU01vdXQgUGluIENvbnRyb2wgMD0gSW5wdXQgKi8KKyNkZWZpbmUgZWVfUFJPTSAgICAgIDkgICAvKiBGbGFzaCBFUFJPTSAvIFBST00gMD1GbGFzaCAqLworI2RlZmluZSBlZV9yZXNlcnZlZDEgMTAgIC8qIC4uIDEyID0wISAqLworI2RlZmluZSBlZV9BbHRSZWFkeSAgMTMgIC8qIEFsdGVybmF0ZSBSZWFkeSwgMD1ub3JtYWwgKi8KKyNkZWZpbmUgZWVfcmVzZXJ2ZWQyIDE0ICAvKiA9MCEgKi8KKyNkZWZpbmUgZWVfRHVwbGV4ICAgIDE1CisKKy8qIFdvcmQyLDMsNDogKi8KKyNkZWZpbmUgZWVfSUE1ICAgICAgIDAgLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUE0ICAgICAgIDggLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUEzICAgICAgIDAgLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUEyICAgICAgIDggLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUExICAgICAgIDAgLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUEwICAgICAgIDggLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKworLyogV29yZCA1OiAqLworI2RlZmluZSBlZV9CTkNfVFBFICAgMCAvKiAwPVRQRSAqLworI2RlZmluZSBlZV9Cb290VHlwZSAgMSAvKiAwMD1Ob25lLCAwMT1JUFgsIDEwPU9ESSwgMTE9TkRJUyAqLworI2RlZmluZSBlZV9Cb290VHlwZU1hc2sgMHgzIAorI2RlZmluZSBlZV9OdW1Db25uICAgMyAgLyogTnVtYmVyIG9mIENvbm5lY3Rpb25zIDA9IE9uZSBvciBUd28gKi8KKyNkZWZpbmUgZWVfRmxhc2hTb2NrIDQgIC8qIFByZXNlbmNlIG9mIEZsYXNoIFNvY2tldCAwPSBQcmVzZW50ICovCisjZGVmaW5lIGVlX1BvcnRUUEUgICA1CisjZGVmaW5lIGVlX1BvcnRCTkMgICA2CisjZGVmaW5lIGVlX1BvcnRBVUkgICA3CisjZGVmaW5lIGVlX1Bvd2VyTWd0ICAxMCAvKiAwPSBkaXNhYmxlZCAqLworI2RlZmluZSBlZV9DUCAgICAgICAgMTMgLyogQ29uY3VycmVudCBQcm9jZXNzaW5nICovCisjZGVmaW5lIGVlX0NQTWFzayAgICAweDcKKworLyogV29yZCA2OiAqLworI2RlZmluZSBlZV9TdGVwcGluZyAgMCAvKiBTdGVwcGluZyBpbmZvICovCisjZGVmaW5lIGVlX1N0ZXBNYXNrICAweDBGCisjZGVmaW5lIGVlX0JvYXJkSUQgICA0IC8qIE1hbnVjYXR1cmVyIEJvYXJkIElELCByZXNlcnZlZCAqLworI2RlZmluZSBlZV9Cb2FyZE1hc2sgMHgwRkZGCisKKy8qIFdvcmQgNzogKi8KKyNkZWZpbmUgZWVfSU5UX1RPX0lSUSAwIC8qIGludCB0byBJUlEgTWFwcGluZyAgPSAweDFFQjggZm9yIFByby8xMCsgKi8KKyNkZWZpbmUgZWVfRlhfSU5UMklSUSAweDFFQjggLyogdGhlIF9vbmx5XyBtYXBwaW5nIGFsbG93ZWQgZm9yIEZYIGNoaXBzICovCisKKy8qLi4qLworI2RlZmluZSBlZV9TSVpFIDB4NDAgLyogdG90YWwgRUVwcm9tIFNpemUgKi8KKyNkZWZpbmUgZWVfQ2hlY2tzdW0gMHhCQUJBIC8qIGluaXRpYWwgYW5kIGZpbmFsIHZhbHVlIGZvciBhZGRpbmcgY2hlY2tzdW0gKi8KKworCisvKiBDYXJkIGlkZW50aWZpY2F0aW9uIHZpYSBFRXByb206ICAgKi8KKyNkZWZpbmUgZWVfYWRkcl92ZW5kb3IgMHgxMCAgLyogV29yZCBvZmZzZXQgZm9yIEVJU0EgVmVuZG9yIElEICovCisjZGVmaW5lIGVlX2FkZHJfaWQgMHgxMSAgICAgIC8qIFdvcmQgb2Zmc2V0IGZvciBDYXJkIElEICovCisjZGVmaW5lIGVlX2FkZHJfU04gMHgxMiAgICAgIC8qIFNlcmlhbCBOdW1iZXIgKi8KKyNkZWZpbmUgZWVfYWRkcl9DUkNfOCAweDE0ICAgLyogQ1JDIG92ZXIgbGFzdCB0aGVlIEJ5dGVzICovCisKKworI2RlZmluZSBlZV92ZW5kb3JfaW50ZWwwIDB4MjUgIC8qIFZlbmRvciBJRCBJbnRlbCAqLworI2RlZmluZSBlZV92ZW5kb3JfaW50ZWwxIDB4RDQKKyNkZWZpbmUgZWVfaWRfZWVwcm8xMHAwIDB4MTAgICAvKiBJRCBmb3IgZWVwcm8vMTArICovCisjZGVmaW5lIGVlX2lkX2VlcHJvMTBwMSAweDMxCisKKy8qIG5vdyB0aGlzIHNlY3Rpb24gY291bGQgYmUgdXNlZCBieSBib3RoIGJvYXJkczogdGhlIG9sZGllcyBhbmQgdGhlIGVlMTA6CisgKiBlZTEwIHVzZXMgdHggYnVmZmVyIGJlZm9yZSBvZiByeCBidWZmZXIgYW5kIHRoZSBvbGRpZXMgdGhlIGludmVyc2UuCisgKiAoYXJpcykKKyAqLworI2RlZmluZQlSQU1fU0laRQkweDgwMDAKKworI2RlZmluZQlSQ1ZfSEVBREVSCTgKKyNkZWZpbmUgUkNWX0RFRkFVTFRfUkFNCTB4NjAwMAorI2RlZmluZSBSQ1ZfUkFNIAlyY3ZfcmFtCisKK3N0YXRpYyB1bnNpZ25lZCByY3ZfcmFtID0gUkNWX0RFRkFVTFRfUkFNOworCisjZGVmaW5lIFhNVF9IRUFERVIJOAorI2RlZmluZSBYTVRfUkFNCQkoUkFNX1NJWkUgLSBSQ1ZfUkFNKQorCisjZGVmaW5lIFhNVF9TVEFSVAkoKHJjdl9zdGFydCArIFJDVl9SQU0pICUgUkFNX1NJWkUpCisKKyNkZWZpbmUgUkNWX0xPV0VSX0xJTUlUCShyY3Zfc3RhcnQgPj4gOCkKKyNkZWZpbmUgUkNWX1VQUEVSX0xJTUlUCSgoKHJjdl9zdGFydCArIFJDVl9SQU0pIC0gMikgPj4gOCkKKyNkZWZpbmUgWE1UX0xPV0VSX0xJTUlUCShYTVRfU1RBUlQgPj4gOCkKKyNkZWZpbmUgWE1UX1VQUEVSX0xJTUlUCSgoKFhNVF9TVEFSVCArIFhNVF9SQU0pIC0gMikgPj4gOCkKKworI2RlZmluZSBSQ1ZfU1RBUlRfUFJPCTB4MDAKKyNkZWZpbmUgUkNWX1NUQVJUXzEwCVhNVF9SQU0KKwkJCQkJLyogYnkgZGVmYXVsdCB0aGUgb2xkIGRyaXZlciAqLworc3RhdGljIHVuc2lnbmVkIHJjdl9zdGFydCA9IFJDVl9TVEFSVF9QUk87CisKKyNkZWZpbmUJUkNWX0RPTkUJMHgwMDA4CisjZGVmaW5lCVJYX09LCQkweDIwMDAKKyNkZWZpbmUJUlhfRVJST1IJMHgwZDgxCisKKyNkZWZpbmUJVFhfRE9ORV9CSVQJMHgwMDgwCisjZGVmaW5lCUNIQUlOX0JJVAkweDgwMDAKKyNkZWZpbmUJWE1UX1NUQVRVUwkweDAyCisjZGVmaW5lCVhNVF9DSEFJTgkweDA0CisjZGVmaW5lCVhNVF9DT1VOVAkweDA2CisKKyNkZWZpbmUJQkFOSzBfU0VMRUNUCTB4MDAJCQorI2RlZmluZQlCQU5LMV9TRUxFQ1QJMHg0MAkJCisjZGVmaW5lCUJBTksyX1NFTEVDVAkweDgwCQkKKworLyogQmFuayAwIHJlZ2lzdGVycyAqLworI2RlZmluZQlDT01NQU5EX1JFRwkweDAwCS8qIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJTUNfU0VUVVAJMHgwMworI2RlZmluZQlYTVRfQ01ECQkweDA0CisjZGVmaW5lCURJQUdOT1NFX0NNRAkweDA3CisjZGVmaW5lCVJDVl9FTkFCTEVfQ01ECTB4MDgKKyNkZWZpbmUJUkNWX0RJU0FCTEVfQ01ECTB4MGEKKyNkZWZpbmUJU1RPUF9SQ1ZfQ01ECTB4MGIKKyNkZWZpbmUJUkVTRVRfQ01ECTB4MGUKKyNkZWZpbmUJUE9XRVJfRE9XTl9DTUQJMHgxOAorI2RlZmluZQlSRVNVTUVfWE1UX0NNRAkweDFjCisjZGVmaW5lCVNFTF9SRVNFVF9DTUQJMHgxZQorI2RlZmluZQlTVEFUVVNfUkVHCTB4MDEJLyogUmVnaXN0ZXIgMSAqLworI2RlZmluZQlSWF9JTlQJCTB4MDIKKyNkZWZpbmUJVFhfSU5UCQkweDA0CisjZGVmaW5lCUVYRUNfU1RBVFVTCTB4MzAKKyNkZWZpbmUJSURfUkVHCQkweDAyCS8qIFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUJUl9ST0JJTl9CSVRTCTB4YzAJLyogcm91bmQgcm9iaW4gY291bnRlciAqLworI2RlZmluZQlJRF9SRUdfTUFTSwkweDJjCisjZGVmaW5lCUlEX1JFR19TSUcJMHgyNAorI2RlZmluZQlBVVRPX0VOQUJMRQkweDEwCisjZGVmaW5lCUlOVF9NQVNLX1JFRwkweDAzCS8qIFJlZ2lzdGVyIDMJKi8KKyNkZWZpbmUJUlhfU1RPUF9NQVNLCTB4MDEKKyNkZWZpbmUJUlhfTUFTSwkJMHgwMgorI2RlZmluZQlUWF9NQVNLCQkweDA0CisjZGVmaW5lCUVYRUNfTUFTSwkweDA4CisjZGVmaW5lCUFMTF9NQVNLCTB4MGYKKyNkZWZpbmUJSU9fMzJfQklUCTB4MTAKKyNkZWZpbmUJUkNWX0JBUgkJMHgwNAkvKiBUaGUgZm9sbG93aW5nIGFyZSB3b3JkICgxNi1iaXQpIHJlZ2lzdGVycyAqLworI2RlZmluZQlSQ1ZfU1RPUAkweDA2CisKKyNkZWZpbmUJWE1UX0JBUl9QUk8JMHgwYQorI2RlZmluZQlYTVRfQkFSXzEwCTB4MGIKK3N0YXRpYyB1bnNpZ25lZCB4bXRfYmFyID0gWE1UX0JBUl9QUk87CisKKyNkZWZpbmUJSE9TVF9BRERSRVNTX1JFRwkweDBjCisjZGVmaW5lCUlPX1BPUlQJCTB4MGUKKyNkZWZpbmUJSU9fUE9SVF8zMl9CSVQJMHgwYworCisvKiBCYW5rIDEgcmVnaXN0ZXJzICovCisjZGVmaW5lCVJFRzEJMHgwMQorI2RlZmluZQlXT1JEX1dJRFRICTB4MDIKKyNkZWZpbmUJSU5UX0VOQUJMRQkweDgwCisjZGVmaW5lIElOVF9OT19SRUcJMHgwMgorI2RlZmluZQlSQ1ZfTE9XRVJfTElNSVRfUkVHCTB4MDgKKyNkZWZpbmUJUkNWX1VQUEVSX0xJTUlUX1JFRwkweDA5CisKKyNkZWZpbmUJWE1UX0xPV0VSX0xJTUlUX1JFR19QUk8JMHgwYQorI2RlZmluZQlYTVRfVVBQRVJfTElNSVRfUkVHX1BSTwkweDBiCisjZGVmaW5lCVhNVF9MT1dFUl9MSU1JVF9SRUdfMTAJMHgwYgorI2RlZmluZQlYTVRfVVBQRVJfTElNSVRfUkVHXzEwCTB4MGEKK3N0YXRpYyB1bnNpZ25lZCB4bXRfbG93ZXJfbGltaXRfcmVnID0gWE1UX0xPV0VSX0xJTUlUX1JFR19QUk87CitzdGF0aWMgdW5zaWduZWQgeG10X3VwcGVyX2xpbWl0X3JlZyA9IFhNVF9VUFBFUl9MSU1JVF9SRUdfUFJPOworCisvKiBCYW5rIDIgcmVnaXN0ZXJzICovCisjZGVmaW5lCVhNVF9DaGFpbl9JbnQJMHgyMAkvKiBJbnRlcnJ1cHQgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgY2hhaW4gKi8KKyNkZWZpbmUJWE1UX0NoYWluX0VyclN0b3AJMHg0MCAvKiBJbnRlcnJ1cHQgYXQgdGhlIGVuZCBvZiB0aGUgY2hhaW4gZXZlbiBpZiB0aGVyZSBhcmUgZXJyb3JzICovCisjZGVmaW5lCVJDVl9EaXNjYXJkX0JhZEZyYW1lCTB4ODAgLyogVGhyb3cgYmFkIGZyYW1lcyBhd2F5LCBhbmQgY29udGludWUgdG8gcmVjZWl2ZSBvdGhlcnMgKi8KKyNkZWZpbmUJUkVHMgkJMHgwMgorI2RlZmluZQlQUk1TQ19Nb2RlCTB4MDEKKyNkZWZpbmUJTXVsdGlfSUEJMHgyMAorI2RlZmluZQlSRUczCQkweDAzCisjZGVmaW5lCVRQRV9CSVQJCTB4MDQKKyNkZWZpbmUJQk5DX0JJVAkJMHgyMAorI2RlZmluZQlSRUcxMwkJMHgwZAorI2RlZmluZQlGRFgJCTB4MDAKKyNkZWZpbmUJQV9OX0VOQUJMRQkweDAyCisJCisjZGVmaW5lCUlfQUREX1JFRzAJMHgwNAorI2RlZmluZQlJX0FERF9SRUcxCTB4MDUKKyNkZWZpbmUJSV9BRERfUkVHMgkweDA2CisjZGVmaW5lCUlfQUREX1JFRzMJMHgwNworI2RlZmluZQlJX0FERF9SRUc0CTB4MDgKKyNkZWZpbmUJSV9BRERfUkVHNQkweDA5CisKKyNkZWZpbmUgRUVQUk9NX1JFR19QUk8JMHgwYQorI2RlZmluZSBFRVBST01fUkVHXzEwCTB4MGIKK3N0YXRpYyB1bnNpZ25lZCBlZXByb21fcmVnID0gRUVQUk9NX1JFR19QUk87CisKKyNkZWZpbmUgRUVTSyAweDAxCisjZGVmaW5lIEVFQ1MgMHgwMgorI2RlZmluZSBFRURJIDB4MDQKKyNkZWZpbmUgRUVETyAweDA4CisKKy8qIFRoZSBob3JyaWJsZSByb3V0aW5lIHRvIHJlYWQgYSB3b3JkIGZyb20gdGhlIHNlcmlhbCBFRVBST00uICovCisvKiBJTVBPUlRBTlQgLSB0aGUgODI1OTUgd2lsbCBiZSBzZXQgdG8gQmFuayAwIGFmdGVyIHRoZSBlZXByb20gaXMgcmVhZCAqLworCisvKiBUaGUgZGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuICovCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpIHsgdWRlbGF5KDQwKTsgfQorI2RlZmluZSBFRV9SRUFEX0NNRCAoNiA8PCA2KQorCisvKiBkbyBhIGZ1bGwgcmVzZXQ7IGRhdGEgc2hlZXQgYXNrcyBmb3IgMjUwdXMgZGVsYXkgKi8KKyNkZWZpbmUgZWVwcm9fZnVsbF9yZXNldChpb2FkZHIpCW91dGIoUkVTRVRfQ01ELCBpb2FkZHIpOyB1ZGVsYXkoMjU1KTsKKworLyogZG8gYSBuaWNlIHJlc2V0ICovCisjZGVmaW5lIGVlcHJvX3NlbF9yZXNldChpb2FkZHIpIFwKKyAgZG8geyAgXAorICAgIG91dGIgKCBTRUxfUkVTRVRfQ01ELCBpb2FkZHIgKTsgXAorICAgICh2b2lkKSBTTE9XX0RPV047IFwKKyAgICAodm9pZCkgU0xPV19ET1dOOyBcCisgIH0gd2hpbGUgKDApCisKKy8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisjZGVmaW5lCWVlcHJvX2NsZWFyX2ludChpb2FkZHIpCW91dGIoQUxMX01BU0ssIGlvYWRkciArIFNUQVRVU19SRUcpCisKKy8qIGVuYWJsZSByeCAqLworI2RlZmluZQllZXByb19lbl9yeChpb2FkZHIpCW91dGIoUkNWX0VOQUJMRV9DTUQsIGlvYWRkcikKKworLyogZGlzYWJsZSByeCAqLworI2RlZmluZQllZXByb19kaXNfcngoaW9hZGRyKQlvdXRiKFJDVl9ESVNBQkxFX0NNRCwgaW9hZGRyKQorCisvKiBzd2l0Y2ggYmFuayAqLworI2RlZmluZSBlZXByb19zdzJiYW5rMChpb2FkZHIpIG91dGIoQkFOSzBfU0VMRUNULCBpb2FkZHIpCisjZGVmaW5lIGVlcHJvX3N3MmJhbmsxKGlvYWRkcikgb3V0YihCQU5LMV9TRUxFQ1QsIGlvYWRkcikKKyNkZWZpbmUgZWVwcm9fc3cyYmFuazIoaW9hZGRyKSBvdXRiKEJBTksyX1NFTEVDVCwgaW9hZGRyKQorCitzdGF0aWMgdW5zaWduZWQgaW50CXJ4X3N0YXJ0LCB0eF9zdGFydDsKK3N0YXRpYyBpbnQJCXR4X2xhc3Q7CitzdGF0aWMgdW5zaWduZWQJaW50CXR4X2VuZDsKK3N0YXRpYyBpbnQJCWVlcHJvID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJbWVtX3N0YXJ0LCBtZW1fZW5kID0gUkNWX0RFRkFVTFRfUkFNIC8gMTAyNDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVlcHJvX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQJCXRlbXBfcmVnLCBpOworCisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJZWVwcm9fc3cyYmFuazIobmljLT5pb2FkZHIpOwkvKiBiZSBjYXJlZnVsLCBiYW5rMiBub3cgKi8KKwl0ZW1wX3JlZyA9IGluYihuaWMtPmlvYWRkciArIGVlcHJvbV9yZWcpOworCURCRygiU3RlcHBpbmcgJWRcbiIsIHRlbXBfcmVnID4+IDUpOworCWlmICh0ZW1wX3JlZyAmIDB4MTApCS8qIGNoZWNrIHRoZSBUdXJuT2ZmIEVuYWJsZSBiaXQgKi8KKwkJb3V0Yih0ZW1wX3JlZyAmIDB4RUYsIG5pYy0+aW9hZGRyICsgZWVwcm9tX3JlZyk7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCS8qIGZpbGwgdGhlIE1BQyBhZGRyZXNzICovCisJCW91dGIobmljLT5ub2RlX2FkZHJbaV0sIG5pYy0+aW9hZGRyICsgSV9BRERfUkVHMCArIGkpOworCXRlbXBfcmVnID0gaW5iKG5pYy0+aW9hZGRyICsgUkVHMSk7CisJLyogc2V0dXAgVHJhbnNtaXQgQ2hhaW5pbmcgYW5kIGRpc2NhcmQgYmFkIFJDViBmcmFtZXMgKi8KKwlvdXRiKHRlbXBfcmVnIHwgWE1UX0NoYWluX0ludCB8IFhNVF9DaGFpbl9FcnJTdG9wCisJCXwgUkNWX0Rpc2NhcmRfQmFkRnJhbWUsIG5pYy0+aW9hZGRyICsgUkVHMSk7CisJdGVtcF9yZWcgPSBpbmIobmljLT5pb2FkZHIgKyBSRUcyKTsJCS8qIG1hdGNoIGJyb2FkY2FzdCAqLworCW91dGIodGVtcF9yZWcgfCAweDE0LCBuaWMtPmlvYWRkciArIFJFRzIpOworCXRlbXBfcmVnID0gaW5iKG5pYy0+aW9hZGRyICsgUkVHMyk7CisJb3V0Yih0ZW1wX3JlZyAmIDB4M0YsIG5pYy0+aW9hZGRyICsgUkVHMyk7CS8qIGNsZWFyIHRlc3QgbW9kZSAqLworCS8qIHNldCB0aGUgcmVjZWl2aW5nIG1vZGUgKi8KKwllZXByb19zdzJiYW5rMShuaWMtPmlvYWRkcik7CS8qIGJlIGNhcmVmdWwsIGJhbmsxIG5vdyAqLworCS8qIGluaXRpYWxpc2UgdGhlIFJDViBhbmQgWE1UIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgKi8KKwlvdXRiKFJDVl9MT1dFUl9MSU1JVCwgbmljLT5pb2FkZHIgKyBSQ1ZfTE9XRVJfTElNSVRfUkVHKTsKKwlvdXRiKFJDVl9VUFBFUl9MSU1JVCwgbmljLT5pb2FkZHIgKyBSQ1ZfVVBQRVJfTElNSVRfUkVHKTsKKwlvdXRiKFhNVF9MT1dFUl9MSU1JVCwgbmljLT5pb2FkZHIgKyB4bXRfbG93ZXJfbGltaXRfcmVnKTsKKwlvdXRiKFhNVF9VUFBFUl9MSU1JVCwgbmljLT5pb2FkZHIgKyB4bXRfdXBwZXJfbGltaXRfcmVnKTsKKwllZXByb19zdzJiYW5rMChuaWMtPmlvYWRkcik7CS8qIFN3aXRjaCBiYWNrIHRvIGJhbmsgMCAqLworCWVlcHJvX2NsZWFyX2ludChuaWMtPmlvYWRkcik7CisJLyogSW5pdGlhbGlzZSBSQ1YgKi8KKwlvdXR3KHJ4X3N0YXJ0ID0gKFJDVl9MT1dFUl9MSU1JVCA8PCA4KSwgbmljLT5pb2FkZHIgKyBSQ1ZfQkFSKTsKKwlvdXR3KCgoUkNWX1VQUEVSX0xJTUlUIDw8IDgpIHwgMHhGRSksIG5pYy0+aW9hZGRyICsgUkNWX1NUT1ApOworIAkvKiBNYWtlIHN1cmUgMXN0IHBvbGwgd29uJ3QgZmluZCBhIHZhbGlkIHBhY2tldCBoZWFkZXIgKi8KKyAJb3V0dygoUkNWX0xPV0VSX0xJTUlUIDw8IDgpLCBuaWMtPmlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworIAlvdXR3KDAsICAgICAgICAgICAgICAgICAgICAgIG5pYy0+aW9hZGRyICsgSU9fUE9SVCk7CisJLyogSW50aWFsaXNlIFhNVCAqLworCW91dHcoKFhNVF9MT1dFUl9MSU1JVCA8PCA4KSwgbmljLT5pb2FkZHIgKyB4bXRfYmFyKTsKKwllZXByb19zZWxfcmVzZXQobmljLT5pb2FkZHIpOworCXR4X3N0YXJ0ID0gdHhfZW5kID0gKHVuc2lnbmVkIGludCkgKFhNVF9MT1dFUl9MSU1JVCA8PCA4KTsKKwl0eF9sYXN0ID0gMDsKKwllZXByb19lbl9yeChuaWMtPmlvYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZWVwcm9fcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKwl1bnNpZ25lZCBpbnQJcmN2X2NhciA9IHJ4X3N0YXJ0OworCXVuc2lnbmVkIGludAlyY3ZfZXZlbnQsIHJjdl9zdGF0dXMsIHJjdl9uZXh0X2ZyYW1lLCByY3Zfc2l6ZTsKKworCS8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KKwkvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLworCS8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCisjaWYJMAorCWlmICgoaW5iKG5pYy0+aW9hZGRyICsgU1RBVFVTX1JFRykgJiAweDQwKSA9PSAwKQorCQlyZXR1cm4gKDApOworCW91dGIoMHg0MCwgbmljLT5pb2FkZHIgKyBTVEFUVVNfUkVHKTsKKyNlbmRpZgorCW91dHcocmN2X2NhciwgbmljLT5pb2FkZHIgKyBIT1NUX0FERFJFU1NfUkVHKTsKKwlyY3ZfZXZlbnQgPSBpbncobmljLT5pb2FkZHIgKyBJT19QT1JUKTsKKwlpZiAocmN2X2V2ZW50ICE9IFJDVl9ET05FKQorCQlyZXR1cm4gKDApOworCisJLyogRklYTUU6IEknbSBndWVzc2luZyB0aGlzIG1pZ2h0IG5vdCB3b3JrIHdpdGggdGhpcyBjYXJkLCBzaW5jZQorCSAgIGl0IGxvb2tzIGxpa2Ugb25jZSBhIHJjdl9ldmVudCBpcyBzdGFydGVkIGl0IG11c3QgYmUgY29tcGxldGVkLgorCSAgIG1heWJlIHRoZXJlJ3MgYW5vdGhlciB3YXkuICovCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKwlyY3Zfc3RhdHVzID0gaW53KG5pYy0+aW9hZGRyICsgSU9fUE9SVCk7CisJcmN2X25leHRfZnJhbWUgPSBpbncobmljLT5pb2FkZHIgKyBJT19QT1JUKTsKKwlyY3Zfc2l6ZSA9IGludyhuaWMtPmlvYWRkciArIElPX1BPUlQpOworI2lmCTAKKwlwcmludGYoIiVoWCAlaFggJWQgJWhoWFxuIiwgcmN2X3N0YXR1cywgcmN2X25leHRfZnJhbWUsIHJjdl9zaXplLAorCQlpbmIobmljLT5pb2FkZHIgKyBTVEFUVVNfUkVHKSk7CisjZW5kaWYKKwlpZiAoKHJjdl9zdGF0dXMgJiAoUlhfT0t8UlhfRVJST1IpKSAhPSBSWF9PSykgeworCQlwcmludGYoIlJlY2VpdmUgZXJyb3IgJWhYXG4iLCByY3Zfc3RhdHVzKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmN2X3NpemUgJj0gMHgzRkZGOworCWluc3cobmljLT5pb2FkZHIgKyBJT19QT1JULCBuaWMtPnBhY2tldCwgKChyY3Zfc2l6ZSArIDMpID4+IDEpKTsKKyNpZgkwCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKKwkJcHJpbnRmKCIlaGhYIiwgbmljLT5wYWNrZXRbaV0pOworCQlwdXRjaGFyKGkgJSAxNiA9PSAxNSA/ICdcbicgOiAnICcpOworCX0KK30KKyNlbmRpZgorCW5pYy0+cGFja2V0bGVuID0gcmN2X3NpemU7CisJcmN2X2NhciAgPSAocnhfc3RhcnQgKyBSQ1ZfSEVBREVSICsgcmN2X3NpemUpOworCXJ4X3N0YXJ0ID0gcmN2X25leHRfZnJhbWU7CisvKiAKKwloZXhfZHVtcChyY3ZfY2FyLCBuaWMtPnBhY2tldGxlbik7IAorKi8KKworCWlmIChyY3ZfY2FyID09IDApCisJCXJjdl9jYXIgPSAoKFJDVl9VUFBFUl9MSU1JVCA8PCA4KSB8IDB4ZmYpOworCW91dHcocmN2X2NhciAtIDEsIG5pYy0+aW9hZGRyICsgUkNWX1NUT1ApOworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBlZXByb190cmFuc21pdCgKKwlzdHJ1Y3QgbmljICpuaWMsCisJY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLworCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCisJY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KK3sKKwl1bnNpZ25lZCBpbnQJc3RhdHVzLCB0eF9hdmFpbGFibGUsIGxhc3QsIGVuZCwgbGVuZ3RoOworCXVuc2lnbmVkIHNob3J0CXR5cGU7CisJaW50CQlib2d1c2NvdW50ID0gMjA7CisKKwlsZW5ndGggPSBzICsgRVRIX0hMRU47CisJaWYgKHR4X2VuZCA+IHR4X3N0YXJ0KQorCQl0eF9hdmFpbGFibGUgPSBYTVRfUkFNIC0gKHR4X2VuZCAtIHR4X3N0YXJ0KTsKKwllbHNlIGlmICh0eF9lbmQgPCB0eF9zdGFydCkKKwkJdHhfYXZhaWxhYmxlID0gdHhfc3RhcnQgLSB0eF9lbmQ7CisJZWxzZQorCQl0eF9hdmFpbGFibGUgPSBYTVRfUkFNOworCWxhc3QgPSB0eF9lbmQ7CisJZW5kID0gbGFzdCArICgoKGxlbmd0aCArIDMpID4+IDEpIDw8IDEpICsgWE1UX0hFQURFUjsKKwlpZiAoZW5kID49IChYTVRfVVBQRVJfTElNSVQgPDwgOCkpIHsKKwkJbGFzdCA9IChYTVRfTE9XRVJfTElNSVQgPDwgOCk7CisJCWVuZCA9IGxhc3QgKyAoKChsZW5ndGggKyAzKSA+PiAxKSA8PCAxKSArIFhNVF9IRUFERVI7CisJfQorCW91dHcobGFzdCwgbmljLT5pb2FkZHIgKyBIT1NUX0FERFJFU1NfUkVHKTsKKwlvdXR3KFhNVF9DTUQsIG5pYy0+aW9hZGRyICsgSU9fUE9SVCk7CisJb3V0dygwLCBuaWMtPmlvYWRkciArIElPX1BPUlQpOworCW91dHcoZW5kLCBuaWMtPmlvYWRkciArIElPX1BPUlQpOworCW91dHcobGVuZ3RoLCBuaWMtPmlvYWRkciArIElPX1BPUlQpOworCW91dHN3KG5pYy0+aW9hZGRyICsgSU9fUE9SVCwgZCwgRVRIX0FMRU4gLyAyKTsKKwlvdXRzdyhuaWMtPmlvYWRkciArIElPX1BPUlQsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTiAvIDIpOworCXR5cGUgPSBodG9ucyh0KTsKKwlvdXRzdyhuaWMtPmlvYWRkciArIElPX1BPUlQsICZ0eXBlLCBzaXplb2YodHlwZSkgLyAyKTsKKwlvdXRzdyhuaWMtPmlvYWRkciArIElPX1BPUlQsIHAsIChzICsgMykgPj4gMSk7CisJLyogQSBkdW1teSByZWFkIHRvIGZsdXNoIHRoZSBEUkFNIHdyaXRlIHBpcGVsaW5lICovCisJc3RhdHVzID0gaW53KG5pYy0+aW9hZGRyICsgSU9fUE9SVCk7CisJb3V0dyhsYXN0LCBuaWMtPmlvYWRkciArIHhtdF9iYXIpOworCW91dGIoWE1UX0NNRCwgbmljLT5pb2FkZHIpOworCXR4X3N0YXJ0ID0gbGFzdDsKKwl0eF9sYXN0ID0gbGFzdDsKKwl0eF9lbmQgPSBlbmQ7CisjaWYJMAorCXByaW50ZigiJWQgJWRcbiIsIHR4X3N0YXJ0LCB0eF9lbmQpOworI2VuZGlmCisJd2hpbGUgKGJvZ3VzY291bnQgPiAwKSB7CisJCWlmICgoKHN0YXR1cyA9IGludyhuaWMtPmlvYWRkciArIElPX1BPUlQpKSAmIFRYX0RPTkVfQklUKSA9PSAwKSB7CisJCQl1ZGVsYXkoNDApOworCQkJYm9ndXNjb3VudC0tOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKChzdGF0dXMgJiAweDIwMDApID09IDApIHsKKwkJCURCRygiVHJhbnNtaXQgc3RhdHVzICVoWFxuIiwgc3RhdHVzKTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBlZXByb19kaXNhYmxlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgaXNhX2RldmljZSAqaXNhIF9fdW51c2VkICkgeworCWVlcHJvX3N3MmJhbmswKG5pYy0+aW9hZGRyKTsJLyogU3dpdGNoIHRvIGJhbmsgMCAqLworCS8qIEZsdXNoIHRoZSBUeCBhbmQgZGlzYWJsZSBSeCAqLworCW91dGIoU1RPUF9SQ1ZfQ01ELCBuaWMtPmlvYWRkcik7CisJdHhfc3RhcnQgPSB0eF9lbmQgPSAoWE1UX0xPV0VSX0xJTUlUIDw8IDgpOworCXR4X2xhc3QgPSAwOworCS8qIFJlc2V0IHRoZSA4MjU5NSAqLworCWVlcHJvX2Z1bGxfcmVzZXQobmljLT5pb2FkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBFbmFibGUsIERpc2FibGUsIG9yIEZvcmNlIGludGVycnVwdHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVlcHJvX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHVpbnQxNl90IGlvYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludAkJaTsKKwl1bnNpZ25lZCBzaG9ydAlyZXR2YWwgPSAwOworCWludAkJZWVfYWRkciA9IGlvYWRkciArIGVlcHJvbV9yZWc7CisJaW50CQlyZWFkX2NtZCA9IGxvY2F0aW9uIHwgRUVfUkVBRF9DTUQ7CisJaW50CQljdHJsX3ZhbCA9IEVFQ1M7CisKKwlpZiAoZWVwcm8gPT0gTEFONTk1RlhfMTBJU0EpIHsKKwkJZWVwcm9fc3cyYmFuazEoaW9hZGRyKTsKKwkJb3V0YigweDAwLCBpb2FkZHIgKyBTVEFUVVNfUkVHKTsKKwl9CisJZWVwcm9fc3cyYmFuazIoaW9hZGRyKTsKKwlvdXRiKGN0cmxfdmFsLCBlZV9hZGRyKTsKKwkvKiBzaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0ICovCisJZm9yIChpID0gODsgaSA+PSAwOyBpLS0pIHsKKwkJc2hvcnQgb3V0dmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gY3RybF92YWwgfCBFRURJIDogY3RybF92YWw7CisJCW91dGIob3V0dmFsLCBlZV9hZGRyKTsKKwkJb3V0YihvdXR2YWwgfCBFRVNLLCBlZV9hZGRyKTsJLyogRUVQUk9NIGNsb2NrIHRpY2sgKi8KKwkJZWVwcm9tX2RlbGF5KCk7CisJCW91dGIob3V0dmFsLCBlZV9hZGRyKTsJCS8qIGZpbmlzaCBFRVBST00gY2xvY2sgdGljayAqLworCQllZXByb21fZGVsYXkoKTsKKwl9CisJb3V0YihjdHJsX3ZhbCwgZWVfYWRkcik7CisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJb3V0YihjdHJsX3ZhbCB8IEVFU0ssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5iKGVlX2FkZHIpICYgRUVETykgPyAxIDogMCk7CisJCW91dGIoY3RybF92YWwsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwl9CisJLyogdGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzICovCisJY3RybF92YWwgJj0gfkVFQ1M7CisJb3V0YihjdHJsX3ZhbCB8IEVFU0ssIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCW91dGIoY3RybF92YWwsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7CisJcmV0dXJuIChyZXR2YWwpOworfQorCitzdGF0aWMgaW50IGVlcHJvX3Byb2JlMSAoIGlzYV9wcm9iZV9hZGRyX3QgaW9hZGRyICkgeworCWludAkJaWQsIGNvdW50ZXI7CisKKwlpZCA9IGluYihpb2FkZHIgKyBJRF9SRUcpOworCWlmICgoaWQgJiBJRF9SRUdfTUFTSykgIT0gSURfUkVHX1NJRykKKwkJcmV0dXJuICgwKTsKKwljb3VudGVyID0gaWQgJiBSX1JPQklOX0JJVFM7CisJaWYgKCgoaWQgPSBpbmIoaW9hZGRyICsgSURfUkVHKSkgJiBSX1JPQklOX0JJVFMpICE9IChjb3VudGVyICsgMHg0MCkpCisJCXJldHVybiAoMCk7CisJLyogeWVzIHRoZSA4MjU5NSBoYXMgYmVlbiBmb3VuZCAqLworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgZWVwcm9fb3BlcmF0aW9ucyA9IHsKKwkuY29ubmVjdAk9IGR1bW15X2Nvbm5lY3QsCisJLnBvbGwJCT0gZWVwcm9fcG9sbCwKKwkudHJhbnNtaXQJPSBlZXByb190cmFuc21pdCwKKwkuaXJxCQk9IGVlcHJvX2lycSwKKworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZWVwcm9fcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBpc2FfZGV2aWNlICppc2EgKSB7CisKKwlpbnQJCWksIGxfZWVwcm8gPSAwOworCXVuaW9uIHsKKwkJdW5zaWduZWQgY2hhcgljYWRkcltFVEhfQUxFTl07CisJCXVuc2lnbmVkIHNob3J0CXNhZGRyW0VUSF9BTEVOLzJdOworCX0gc3RhdGlvbl9hZGRyOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwluaWMtPmlycW5vICA9IDA7CisJbmljLT5pb2FkZHIgPSBpc2EtPmlvYWRkcjsKKworCXN0YXRpb25fYWRkci5zYWRkclsyXSA9IHJlYWRfZWVwcm9tKG5pYy0+aW9hZGRyLDIpOworCWlmICggKCBzdGF0aW9uX2FkZHIuc2FkZHJbMl0gPT0gMHgwMDAwICkgfHwKKwkgICAgICggc3RhdGlvbl9hZGRyLnNhZGRyWzJdID09IDB4RkZGRiApICkgeworCQlsX2VlcHJvID0gMzsKKwkJZWVwcm8gPSBMQU41OTVGWF8xMElTQTsKKwkJZWVwcm9tX3JlZz0gRUVQUk9NX1JFR18xMDsKKwkJcmN2X3N0YXJ0ID0gUkNWX1NUQVJUXzEwOworCQl4bXRfbG93ZXJfbGltaXRfcmVnID0gWE1UX0xPV0VSX0xJTUlUX1JFR18xMDsKKwkJeG10X3VwcGVyX2xpbWl0X3JlZyA9IFhNVF9VUFBFUl9MSU1JVF9SRUdfMTA7CisJCXN0YXRpb25fYWRkci5zYWRkclsyXSA9IHJlYWRfZWVwcm9tKG5pYy0+aW9hZGRyLDIpOworCX0KKwlzdGF0aW9uX2FkZHIuc2FkZHJbMV0gPSByZWFkX2VlcHJvbShuaWMtPmlvYWRkciwzKTsKKwlzdGF0aW9uX2FkZHIuc2FkZHJbMF0gPSByZWFkX2VlcHJvbShuaWMtPmlvYWRkciw0KTsKKwlpZiAobF9lZXBybykKKwkJbmFtZSA9ICJJbnRlbCBFdGhlckV4cHJlc3MgMTAgSVNBIjsKKwllbHNlIGlmIChyZWFkX2VlcHJvbShuaWMtPmlvYWRkciw3KSA9PSBlZV9GWF9JTlQySVJRKSB7CisJCW5hbWUgPSAiSW50ZWwgRXRoZXJFeHByZXNzIFByby8xMCsgSVNBIjsKKwkJbF9lZXBybyA9IDI7CisJfSBlbHNlIGlmIChzdGF0aW9uX2FkZHIuc2FkZHJbMF0gPT0gU0FfQUREUjEpIHsKKwkJbmFtZSA9ICJJbnRlbCBFdGhlckV4cHJlc3MgUHJvLzEwIElTQSI7CisJCWxfZWVwcm8gPSAxOworCX0gZWxzZSB7CisJCWxfZWVwcm8gPSAwOworCQluYW1lID0gIkludGVsIDgyNTk1LWJhc2VkIExBTiBjYXJkIjsKKwl9CisJc3RhdGlvbl9hZGRyLnNhZGRyWzBdID0gc3dhcDE2KHN0YXRpb25fYWRkci5zYWRkclswXSk7CisJc3RhdGlvbl9hZGRyLnNhZGRyWzFdID0gc3dhcDE2KHN0YXRpb25fYWRkci5zYWRkclsxXSk7CisJc3RhdGlvbl9hZGRyLnNhZGRyWzJdID0gc3dhcDE2KHN0YXRpb25fYWRkci5zYWRkclsyXSk7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJbmljLT5ub2RlX2FkZHJbaV0gPSBzdGF0aW9uX2FkZHIuY2FkZHJbaV07CisJfQorCisJREJHICggIiVzIGlvYWRkciAlI2hYLCBhZGRyICVzIiwgbmFtZSwgbmljLT5pb2FkZHIsIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIgKSApOworCisJbWVtX3N0YXJ0ID0gUkNWX0xPV0VSX0xJTUlUIDw8IDg7CisJaWYgKChtZW1fZW5kICYgMHgzRikgPCAzIHx8IChtZW1fZW5kICYgMHgzRikgPiAyOSkKKwkJbWVtX2VuZCA9IFJDVl9VUFBFUl9MSU1JVCA8PCA4OworCWVsc2UgeworCQltZW1fZW5kID0gbWVtX2VuZCAqIDEwMjQgKyAoUkNWX0xPV0VSX0xJTUlUIDw8IDgpOworCQlyY3ZfcmFtID0gbWVtX2VuZCAtIChSQ1ZfTE9XRVJfTElNSVQgPDwgOCk7CisJfQorCXByaW50ZigiLCBSeCBtZW0gJWRLLCBpZiAlc1xuIiwgKG1lbV9lbmQgLSBtZW1fc3RhcnQpID4+IDEwLAorCQlHZXRCaXQocmVhZF9lZXByb20obmljLT5pb2FkZHIsNSksIGVlX0JOQ19UUEUpID8gIkJOQyIgOiAiVFAiKTsKKworCWVlcHJvX3Jlc2V0KG5pYyk7CisKKwkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwluaWMtPm5pY19vcAk9ICZlZXByb19vcGVyYXRpb25zOworCXJldHVybiAxOworfQorCitzdGF0aWMgaXNhX3Byb2JlX2FkZHJfdCBlZXByb19wcm9iZV9hZGRyc1tdID0geworCTB4MzAwLCAweDIxMCwgMHgyNDAsIDB4MjgwLCAweDJDMCwgMHgyMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsCit9OworCitJU0FfRFJJVkVSICggZWVwcm9fZHJpdmVyLCBlZXByb19wcm9iZV9hZGRycywgZWVwcm9fcHJvYmUxLAorCQkgICAgIEdFTkVSSUNfSVNBUE5QX1ZFTkRPUiwgMHg4MjhhICk7CisKK0RSSVZFUiAoICJlZXBybyIsIG5pY19kcml2ZXIsIGlzYV9kcml2ZXIsIGVlcHJvX2RyaXZlciwKKwkgZWVwcm9fcHJvYmUsIGVlcHJvX2Rpc2FibGUgKTsKKworSVNBX1JPTSAoICJlZXBybyIsICJJbnRlbCBFdGhlcmV4cHJlc3MgUHJvLzEwIiApOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZWVwcm8xMDAuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3NTYwOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMKQEAgLTAsMCArMSwxMjA3IEBACisvKgorICogZWVwcm8xMDAuYyAtLSBUaGlzIGlzIGEgZHJpdmVyIGZvciBJbnRlbCBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXJzCisgKiAoaWZlYykuCisgKgorICogT3JpZ2luYWxseSB3cml0dGVuIGZvciBFdGhlcmJvb3QgYnk6CisgKgorICogICBDb3B5cmlnaHQgKEMpIEFXIENvbXB1dGVyIFN5c3RlbXMuCisgKiAgIHdyaXR0ZW4gYnkgUi5FLldvbGZmIC0tIFIuRS5Xb2xmZkBCaXRXaXphcmQubmwKKyAqCisgKiAgIEFXIENvbXB1dGVyIFN5c3RlbXMgaXMgY29udHJpYnV0aW5nIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGNvbW11bml0eQorICogICBieSBwYXlpbmcgZm9yIHRoaXMgZHJpdmVyIGFuZCB0aGVuIHB1dHRpbmcgdGhlIHJlc3VsdCB1bmRlciBHUEwuCisgKgorICogICBJZiB5b3UgbmVlZCBhIExpbnV4IGRldmljZSBkcml2ZXIsIHBsZWFzZSBjb250YWN0IEJpdFdpemFyZCBmb3IgYQorICogICBxdW90ZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICogICAgICAgICAgICAgIGRhdGUgICAgICAgdmVyc2lvbiAgYnkgICAgICB3aGF0CisgKiAgV3JpdHRlbjogICAgTWF5IDI5IDE5OTcgIFYwLjEwICBSRVcgICAgIEluaXRpYWwgcmV2aXNpb24uCisgKiBjaGFuZ2VzOiAgICAgTWF5IDMxIDE5OTcgIFYwLjkwICBSRVcgICAgIFdvcmtzIQorICogICAgICAgICAgICAgIEp1biAxICAxOTk3ICBWMC45MSAgUkVXICAgICBDbGVhbnVwCisgKiAgICAgICAgICAgICAgSnVuIDIgIDE5OTcgIFYwLjkyICBSRVcgICAgIEFkZCBzb21lIGNvZGUgZG9jdW1lbnRhdGlvbgorICogICAgICAgICAgICAgIEp1bCAyNSAxOTk3ICBWMS4wMCAgUkVXICAgICBUZXN0ZWQgYnkgQVcgdG8gd29yayBpbiBhIFBST00KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYW51cCBmb3IgcHVibGljYXRpb24KKyAqICAgICAgICAgICAgICBEZXogMTEgMjAwNCAgVjEuMTAgIEtpc3prYSAgQWRkIFJYIHJpbmcgYnVmZmVyIHN1cHBvcnQKKyAqICAgICAgICAgICAgICBKdW4gICAgMjAwOCAgdjIuMCAgIG1kZWNrICAgVXBkYXRlZCB0byBnUFhFLiBDaGFuZ2VkIG11Y2guCisgKgorICogQ2xlYW51cHMgYW5kIGZpeGVzIGJ5IFRob21hcyBNaWxldGljaDx0aG9tYXMubWlsZXRpY2hAZ21haWwuY29tPgorICoKKyAqIFRoaXMgaXMgdGhlIGV0aGVyYm9vdCBpbnRlbCBldGhlcmV4cHJlc3MgUHJvLzEwMEIgZHJpdmVyLgorICoKKyAqIEl0IHdhcyB3cml0dGVuIGZyb20gc2NyYXRjaCwgd2l0aCBEb25hbGQgQmVja2VycyBlZXBybzEwMC5jIGtlcm5lbAorICogZHJpdmVyIGFzIGEgZ3VpZGVsaW5lLiBNb3N0bHkgdGhlIDgyNTU3IHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIHRoZQorICogbG93ZXIgbGV2ZWwgcm91dGluZXMgaGF2ZSBiZWVuIGN1dC1hbmQtcGFzdGVkIGludG8gdGhpcyBzb3VyY2UuCisgKgorICogVGhlIGRyaXZlciB3YXMgZmluaXNoZWQgYmVmb3JlIEludGVsIGdvdCB0aGUgTkRBIG91dCBvZiB0aGUgY2xvc2V0LgorICoKKyAqIERhdGFzaGVldCBpcyBub3cgcHVibGlzaGVkIGFuZCBhdmFpbGFibGUgZnJvbSAKKyAqIGZ0cDovL2Rvd25sb2FkLmludGVsLmNvbS9kZXNpZ24vbmV0d29yay9tYW51YWxzLzgyNTVYX09wZW5TRE0ucGRmCisgKiAgICAtIE1pY2hhZWwgQnJvd24KKyAqICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoKKyAqIEdlbmVyYWwgVGhlb3J5IG9mIE9wZXJhdGlvbgorICoKKyAqIEluaXRpYWxpemF0aW9uCisgKgorICogaWZlY19wY2lfcHJvYmUoKSBpcyBjYWxsZWQgYnkgZ1BYRSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFR5cGljYWwgTklDCisgKiBpbml0aWFsaXphdGlvbiBpcyBwZXJmb3JtZWQuICBFRVBST00gZGF0YSBpcyByZWFkLgorICoKKyAqIE5ldHdvcmsgQm9vdAorICoKKyAqIGlmZWNfbmV0X29wZW4oKSBpcyBjYWxsZWQgYnkgZ1BYRSBiZWZvcmUgYXR0ZW1wdGluZyB0byBuZXR3b3JrIGJvb3QgZnJvbSB0aGUKKyAqIGNhcmQuICBIZXJlLCB0aGUgQ29tbWFuZCBVbml0ICYgUmVjZWl2ZSBVbml0IGFyZSBpbml0aWFsaXplZC4gIFRoZSB0eCAmIHJ4CisgKiByaW5ncyBhcmUgc2V0dXAuICBUaGUgTUFDIGFkZHJlc3MgaXMgcHJvZ3JhbW1lZCBhbmQgdGhlIGNhcmQgaXMgY29uZmlndXJlZC4KKyAqCisgKiBUcmFuc21pdAorICoKKyAqIGlmZWNfbmV0X3RyYW5zbWl0KCkgZW5xdWV1ZXMgYSBwYWNrZXQgaW4gdGhlIHR4IHJpbmcgLSBhY3RpdmU6OnRjYnNbXSAgVGhlIHR4CisgKiByaW5nIGlzIGNvbXBvc2VkIG9mIFRDQnMgbGlua2VkIHRvIGVhY2ggb3RoZXIgaW50byBhIHJpbmcuICBBIHR4IHJlcXVlc3QKKyAqIGZpbGxzIG91dCB0aGUgbmV4dCBhdmFpbGFibGUgVENCIHdpdGggYSBwb2ludGVyIHRvIHRoZSBwYWNrZXQgZGF0YS4KKyAqIFRoZSBsYXN0IGVucXVldWVkIHR4IGlzIGFsd2F5cyBhdCBhY3RpdmU6OnRjYl9oZWFkLiAgVGh1cywgYSB0eCByZXF1ZXN0IGZpbGxzCisgKiBvdXQgdGhlIFRDQiBmb2xsb3dpbmcgdGNiX2hlYWQuCisgKiBhY3RpdmU6OnRjYl90YWlsIHBvaW50cyB0byB0aGUgVENCIHdlJ3JlIGF3YWl0aW5nIGNvbXBsZXRpb24gb2YuCisgKiBpZmVjX3R4X3Byb2Nlc3MoKSBjaGVja3MgdGNiX3RhaWwsIGFuZCBvbmNlIGNvbXBsZXRlLAorICogYmxpbmRseSBpbmNyZW1lbnRzIHRjYl90YWlsIHRvIHRoZSBuZXh0IHJpbmcgVENCLgorICoKKyAqIFJlY2VpdmUKKyAqCisgKiBwcml2OjpyZmRzW10gaXMgYW4gYXJyYXkgb2YgUmVjZWl2ZSBGcmFtZSBEZXNjcmlwdG9ycy4gVGhlIFJGRHMgYXJlIGxpbmtlZAorICogdG9nZXRoZXIgdG8gZm9ybSBhIHJpbmcuCisgKiBpZmVjX25ldF9wb2xsKCkgY2FsbHMgaWZlY19yeF9wcm9jZXNzKCksIHdoaWNoIGNoZWNrcyB0aGUgbmV4dCBSRkQgZm9yCisgKiBkYXRhLiAgSWYgd2UgcmVjZWl2ZWQgYSBwYWNrZXQsIHdlIGFsbG9jYXRlIGEgbmV3IGlvX2J1ZmZlciBhbmQgY29weSB0aGUKKyAqIHBhY2tldCBkYXRhIGludG8gaXQuIElmIGFsbG9jX2lvYigpIGZhaWxzLCB3ZSBkb24ndCB0b3VjaCB0aGUgUkZEIGFuZCB0cnkKKyAqIGFnYWluIG9uIHRoZSBuZXh0IHBvbGwuCisgKi8KKworLyoKKyAqIERlYnVnZ2luZyBsZXZlbHM6CisgKgktIERCRygpIGlzIGZvciBhbnkgZXJyb3JzLCBpLmUuIGZhaWxlZCBhbGxvY19pb2IoKSwgbWFsbG9jX2RtYSgpLAorICoJICBUWCBvdmVyZmxvdywgY29ycnVwdGVkIHBhY2tldHMsIC4uLgorICoJLSBEQkcyKCkgaXMgZm9yIHN1Y2Nlc3NmdWwgZXZlbnRzLCBsaWtlIHBhY2tldCByZWNlaXZlZCwKKyAqCSAgcGFja2V0IHRyYW5zbWl0dGVkLCBhbmQgb3RoZXIgZ2VuZXJhbCBub3RpZmljYXRpb25zLgorICoJLSBEQkdQKCkgcHJpbnRzIHRoZSBuYW1lIG9mIGVhY2ggY2FsbGVkIGZ1bmN0aW9uIG9uIGVudHJ5CisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvbWFsbG9jLmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL3NwaV9iaXQuaD4KKyNpbmNsdWRlIDxncHhlL3RpbWVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9udnMuaD4KKyNpbmNsdWRlIDxncHhlL3RocmVld2lyZS5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSAiZWVwcm8xMDAuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHbG9iYWwgZGF0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGNvbW1hbmQgZGF0YS4gVGhlIHZhbHVlcyB3ZXJlIGNvcGllZCBmcm9tCisgKiB0aGUgTGludXgga2VybmVsIGluaXRpYWxpemF0aW9uIGZvciB0aGUgZWVwcm8xMDAuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaWZlY19jZmcgaWZlY19jZmcgPSB7CisJLnN0YXR1cyAgPSAwLAorCS5jb21tYW5kID0gQ21kQ29uZmlndXJlIHwgQ21kU3VzcGVuZCwKKwkubGluayAgICA9IDAsICAgICAgICAvKiBGaWxsZWQgaW4gbGF0ZXIgKi8KKwkuYnl0ZSA9IHsgMjIsICAgICAgICAvKiBIb3cgbWFueSBieXRlcyBpbiB0aGlzIGFycmF5ICovCisJICAgICAgICAgICggVFhfRklGTyA8PCA0ICkgfCBSWF9GSUZPLCAgLyogUnggJiBUeCBGSUZPIGxpbWl0cyAqLworCSAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkYXB0aXZlIEludGVyZnJhbWUgU3BhY2luZyAqLworCSAgICAgICAgICBSWF9ETUFfQ09VTlQsICAgICAgICAgICAgICAgIC8qIFJ4IERNQSBtYXggYnl0ZSBjb3VudCAqLworCSAgICAgICAgICBUWF9ETUFfQ09VTlQgKyAweDgwLCAgICAgICAgIC8qIFR4IERNQSBtYXggYnl0ZSBjb3VudCAqLworCSAgICAgICAgICAweDMyLCAgICAgIC8qIE1hbnkgYml0cy4gKi8KKwkgICAgICAgICAgMHgwMywgICAgICAvKiBEaXNjYXJkIHNob3J0IHJlY2VpdmUgJiBVbmRlcnJ1biByZXRyaWVzICovCisJICAgICAgICAgIDEsICAgICAgICAgLyogMT1Vc2UgTUlJICAwPVVzZSBBVUkgKi8KKwkgICAgICAgICAgMCwKKwkgICAgICAgICAgMHgyRSwgICAgICAvKiBOU0FJLCBQcmVhbWJsZSBsZW5ndGgsICYgTG9vcGJhY2sqLworCSAgICAgICAgICAwLCAgICAgICAgIC8qIExpbmVhciBwcmlvcml0eSAqLworCSAgICAgICAgICAweDYwLCAgICAgIC8qIEwgUFJJIE1PREUgJiBJbnRlcmZyYW1lIHNwYWNpbmcgKi8KKwkgICAgICAgICAgMCwgMHhmMiwKKwkgICAgICAgICAgMHg0OCwgICAgICAvKiBQcm9taXNjdW91cywgQnJvYWRjYXN0IGRpc2FibGUsIENSUyAmIENEVCAqLworCSAgICAgICAgICAwLCAweDQwLAorCSAgICAgICAgICAweGYyLCAgICAgIC8qIFN0cmlwcGluZywgUGFkZGluZywgUmVjZWl2ZSBDUkMgVHJhbnNmZXIgKi8KKwkgICAgICAgICAgMHg4MCwgICAgICAvKiAweDQwPUZvcmNlIGZ1bGwtZHVwbGV4LCAweDgwPUFsbG93ZnVsbC1kdXBsZXgqLworCSAgICAgICAgICAweDNmLCAgICAgIC8qIE11bHRpcGxlIElBICovCisJICAgICAgICAgIDB4MEQgfSAgICAgLyogTXVsdGljYXN0IGFsbCAqLworfTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgaWZlY19vcGVyYXRpb25zID0geworCS5vcGVuICAgICA9IGlmZWNfbmV0X29wZW4sCisJLmNsb3NlICAgID0gaWZlY19uZXRfY2xvc2UsCisJLnRyYW5zbWl0ID0gaWZlY19uZXRfdHJhbnNtaXQsCisJLnBvbGwgICAgID0gaWZlY19uZXRfcG9sbCwKKwkuaXJxICAgICAgPSBpZmVjX25ldF9pcnEKK307CisKKy8qKioqKioqKioqKioqKioqKioqIGdQWEUgUENJIERldmljZSBEcml2ZXIgQVBJIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFBDSSBkZXZpY2UuCisgKgorICogQHYgcGNpIAkJVGhlIGRldmljZSdzIGFzc29jaWF0ZWQgcGNpX2RldmljZSBzdHJ1Y3R1cmUuCisgKiBAdiBpZCAgCQlUaGUgUENJIGRldmljZSArIHZlbmRvciBpZC4KKyAqIEByZXQgcmMJCVJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmVyeSBlYXJseSBvbiwgd2hpbGUgZ1BYRSBpcyBpbml0aWFsaXppbmcuCisgKiBUaGlzIGlzIGEgZ1BYRSBQQ0kgRGV2aWNlIERyaXZlciBBUEkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgaWZlY19wY2lfcHJvYmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCBfX3VudXNlZCApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgaWZlY19wcml2YXRlICpwcml2OworCWludCByYzsKKworCURCR1AgKCAiaWZlY19wY2lfcHJvYmU6ICIgKTsKKworCWlmICggcGNpLT5pb2FkZHIgPT0gMCApCisJCXJldHVybiAtRUlOVkFMOworCisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYgKCBzaXplb2YoKnByaXYpICk7CisJaWYgKCAhbmV0ZGV2ICkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZXRkZXZfaW5pdCAoIG5ldGRldiwgJmlmZWNfb3BlcmF0aW9ucyApOworCXByaXYgPSBuZXRkZXYtPnByaXY7CisKKwlwY2lfc2V0X2RydmRhdGEgKCBwY2ksIG5ldGRldiApOworCW5ldGRldi0+ZGV2ID0gJnBjaS0+ZGV2OworCisJLyogZW5hYmxlIGJ1cyBtYXN0ZXIsIGV0YyAqLworCWFkanVzdF9wY2lfZGV2aWNlKCBwY2kgKTsKKworCURCR1AgKCAicGNpICIgKTsKKworCW1lbXNldCAoIHByaXYsIDAsIHNpemVvZigqcHJpdikgKTsKKwlwcml2LT5pb2FkZHIgPSBwY2ktPmlvYWRkcjsKKworCWlmZWNfcmVzZXQgKCBuZXRkZXYgKTsKKwlEQkdQICggInJlc2V0ICIgKTsKKworCWlmZWNfaW5pdF9lZXByb20gKCBuZXRkZXYgKTsKKworCS8qIHJlYWQgTUFDIGFkZHJlc3MgKi8KKwludnNfcmVhZCAoICZwcml2LT5lZXByb20ubnZzLCBFRVBST01fQUREUl9NQUNfMCwgbmV0ZGV2LT5od19hZGRyLAorCQkgICBFVEhfQUxFTiApOworCS8qIHJlYWQgbWRpb19yZWdpc3RlciAqLworCW52c19yZWFkICggJnByaXYtPmVlcHJvbS5udnMsIEVFUFJPTV9BRERSX01ESU9fUkVHSVNURVIsCisJCSAgICZwcml2LT5tZGlvX3JlZ2lzdGVyLCAyICk7CisKKwlpZmVjX2xpbmtfdXBkYXRlICggbmV0ZGV2ICk7CS8qIFVwZGF0ZSBsaW5rIHN0YXRlICovCisKKwlpZiAoICggcmMgPSByZWdpc3Rlcl9uZXRkZXYgKCBuZXRkZXYgKSApICE9IDAgKQorCQlnb3RvIGVycm9yOworCisJREJHUCAoICJpbnRzXG4iICk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWZlY19yZXNldCAgICAgKCBuZXRkZXYgKTsKKwluZXRkZXZfbnVsbGlmeSAoIG5ldGRldiApOworCW5ldGRldl9wdXQgICAgICggbmV0ZGV2ICk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBkZXZpY2UgZnJvbSB0aGUgUENJIGRldmljZSBsaXN0LgorICoKKyAqIEB2IHBjaQkJUENJIGRldmljZSB0byByZW1vdmUuCisgKgorICogVGhpcyBpcyBhIFBDSSBEZXZpY2UgRHJpdmVyIEFQSSBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaWZlY19wY2lfcmVtb3ZlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAoIHBjaSApOworCisJREJHUCAoICJpZmVjX3BjaV9yZW1vdmVcbiIgKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2ICggbmV0ZGV2ICk7CisJaWZlY19yZXNldCAgICAgICAgKCBuZXRkZXYgKTsKKwluZXRkZXZfbnVsbGlmeSAgICAoIG5ldGRldiApOworCW5ldGRldl9wdXQgICAgICAgICggbmV0ZGV2ICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKiogZ1BYRSBOZXR3b3JrIERldmljZSBEcml2ZXIgQVBJIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENsb3NlIGEgbmV0d29yayBkZXZpY2UuCisgKgorICogQHYgbmV0ZGV2CQlEZXZpY2UgdG8gY2xvc2UuCisgKgorICogVGhpcyBpcyBhIGdQWEUgTmV0d29yayBEZXZpY2UgRHJpdmVyIEFQSSBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaWZlY19uZXRfY2xvc2UgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgaWZlY19wcml2YXRlICpwcml2ID0gbmV0ZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gcHJpdi0+aW9hZGRyOworCXVuc2lnbmVkIHNob3J0IGludHJfc3RhdHVzOworCisJREJHUCAoICJpZmVjX25ldF9jbG9zZVxuIiApOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJaWZlY19uZXRfaXJxICggbmV0ZGV2LCAwICk7CisKKwkvKiBBY2sgJiBjbGVhciBpbnRzICovCisJaW50cl9zdGF0dXMgPSBpbncgKCBpb2FkZHIgKyBTQ0JTdGF0dXMgKTsKKwlvdXR3ICggaW50cl9zdGF0dXMsIGlvYWRkciArIFNDQlN0YXR1cyApOworCWludyAoIGlvYWRkciArIFNDQlN0YXR1cyApOworCisJaWZlY19yZXNldCAoIG5ldGRldiApOworCisJLyogRnJlZSBhbnkgcmVzb3VyY2VzICovCisJaWZlY19mcmVlICggbmV0ZGV2ICk7Cit9CisKKy8qIEludGVycnVwdHMgdG8gYmUgbWFza2VkICovCisjZGVmaW5lIElOVEVSUlVQVF9NQVNLCSggU0NCTWFza0Vhcmx5UnggfCBTQ0JNYXNrRmxvd0N0bCApCisKKy8qCisgKiBFbmFibGUgb3IgZGlzYWJsZSBJUlEgbWFza2luZy4KKyAqCisgKiBAdiBuZXRkZXYJCURldmljZSB0byBjb250cm9sLgorICogQHYgZW5hYmxlCQlaZXJvIHRvIG1hc2sgb2ZmIElSUSwgbm9uLXplcm8gdG8gZW5hYmxlIElSUS4KKyAqCisgKiBUaGlzIGlzIGEgZ1BYRSBOZXR3b3JrIERyaXZlciBBUEkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfbmV0X2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBlbmFibGUgKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgPSBuZXRkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBwcml2LT5pb2FkZHI7CisKKwlEQkdQICggImlmZWNfbmV0X2lycVxuIiApOworCisJb3V0dyAoIGVuYWJsZSA/IElOVEVSUlVQVF9NQVNLIDogU0NCTWFza0FsbCwgaW9hZGRyICsgU0NCQ21kICk7Cit9CisKKy8qCisgKiBPcGVucyBhIG5ldHdvcmsgZGV2aWNlLgorICoKKyAqIEB2IG5ldGRldgkJRGV2aWNlIHRvIGJlIG9wZW5lZC4KKyAqIEByZXQgcmMgIAkJTm9uLXplcm8gaWYgZmFpbGVkIHRvIG9wZW4uCisgKgorICogVGhpcyBlbmFibGVzIHR4IGFuZCByeCBvbiB0aGUgZGV2aWNlLgorICogVGhpcyBpcyBhIGdQWEUgTmV0d29yayBEZXZpY2UgRHJpdmVyIEFQSSBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBpZmVjX25ldF9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApCit7CisJc3RydWN0IGlmZWNfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaWZlY19pYXMgKmlhcyA9IE5VTEw7CisJc3RydWN0IGlmZWNfY2ZnICpjZmcgPSBOVUxMOworCWludCBpLCBvcHRpb25zOworCWludCByYyA9IC1FTk9NRU07CisKKwlEQkdQICggImlmZWNfbmV0X29wZW46ICIgKTsKKworCS8qIEVuc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gKi8KKwlpZmVjX25ldF9pcnEgKCBuZXRkZXYsIDAgKTsKKworCS8qIEluaXRpYWxpemUgQ29tbWFuZCBVbml0IGFuZCBSZWNlaXZlIFVuaXQgYmFzZSBhZGRyZXNzZXMuICovCisJaWZlY19zY2JfY21kICggbmV0ZGV2LCAwLCBSVUFkZHJMb2FkICk7CisJaWZlY19zY2JfY21kICggbmV0ZGV2LCB2aXJ0X3RvX2J1cyAoICZwcml2LT5zdGF0cyApLCBDVVN0YXRzQWRkciApOworCWlmZWNfc2NiX2NtZCAoIG5ldGRldiwgMCwgQ1VDbWRCYXNlICk7CisKKwkvKiBJbml0aWFsaXplIGJvdGggcmluZ3MgKi8KKwlpZiAoICggcmMgPSBpZmVjX3J4X3NldHVwICggbmV0ZGV2ICkgKSAhPSAwICkKKwkJZ290byBlcnJvcjsKKwlpZiAoICggcmMgPSBpZmVjX3R4X3NldHVwICggbmV0ZGV2ICkgKSAhPSAwICkKKwkJZ290byBlcnJvcjsKKworCS8qIEluaXRpYWxpemUgTURJTyAqLworCW9wdGlvbnMgPSAweDAwOyAvKiAweDQwID0gMTBtYnBzIGhhbGYgZHVwbGV4LCAweDAwID0gQXV0b3NlbnNlICovCisJaWZlY19tZGlvX3NldHVwICggbmV0ZGV2LCBvcHRpb25zICk7CisKKwkvKiBQcmVwYXJlIE1BQyBhZGRyZXNzIHcvIEluZGl2aWR1YWwgQWRkcmVzcyBTZXR1cCAoaWFzKSBjb21tYW5kLiovCisJaWFzID0gbWFsbG9jX2RtYSAoIHNpemVvZiAoICppYXMgKSwgQ0JfQUxJR04gKTsKKwlpZiAoICFpYXMgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWFzLT5jb21tYW5kICAgICAgPSBDbWRJQVNldHVwOworCWlhcy0+c3RhdHVzICAgICAgID0gMDsKKwltZW1jcHkgKCBpYXMtPmlhLCBuZXRkZXYtPmxsX2FkZHIsIEVUSF9BTEVOICk7CisKKwkvKiBQcmVwYXJlIG9wZXJhdGluZyBwYXJhbWV0ZXJzIHcvIGEgY29uZmlndXJlIGNvbW1hbmQuICovCisJY2ZnID0gbWFsbG9jX2RtYSAoIHNpemVvZiAoICpjZmcgKSwgQ0JfQUxJR04gKTsKKwlpZiAoICFjZmcgKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisJbWVtY3B5ICggY2ZnLCAmaWZlY19jZmcsIHNpemVvZiAoICpjZmcgKSApOworCWNmZy0+bGluayAgICAgPSB2aXJ0X3RvX2J1cyAoIHByaXYtPnRjYnMgKTsKKwljZmctPmJ5dGVbMTldID0gKCBvcHRpb25zICYgMHgxMCApID8gMHhDMCA6IDB4ODA7CisJaWFzLT5saW5rICAgICA9IHZpcnRfdG9fYnVzICggY2ZnICk7CisKKwkvKiBJc3N1ZSB0aGUgaWFzIGFuZCBjb25maWd1cmUgY29tbWFuZHMuICovCisJaWZlY19zY2JfY21kICggbmV0ZGV2LCB2aXJ0X3RvX2J1cyAoIGlhcyApLCBDVVN0YXJ0ICk7CisJaWZlY19zY2JfY21kX3dhaXQgKCBuZXRkZXYgKTsKKwlwcml2LT5jb25maWd1cmVkID0gMTsKKworCS8qIFdhaXQgdXAgdG8gMTAgbXMgZm9yIGNvbmZpZ3VyYXRpb24gdG8gaW5pdGlhdGUgKi8KKwlmb3IgKCBpID0gMTA7IGkgJiYgIWNmZy0+c3RhdHVzOyBpLS0gKQorCQltZGVsYXkgKCAxICk7CisJaWYgKCAhIGNmZy0+c3RhdHVzICkgeworCQlEQkcgKCAiRmFpbGVkIHRvIGluaXRpYXRlIVxuIiApOworCQlnb3RvIGVycm9yOworCX0KKwlmcmVlX2RtYSAoIGlhcywgc2l6ZW9mICggKmlhcyApICk7CisJZnJlZV9kbWEgKCBjZmcsIHNpemVvZiAoICpjZmcgKSApOworCURCRzIgKCAiY2ZnICIgKTsKKworCS8qIEVuYWJsZSByeCBieSBzZW5kaW5nIHJpbmcgYWRkcmVzcyB0byBjYXJkICovCisJaWYgKCBwcml2LT5yZmRzWzBdICE9IE5VTEwgKSB7CisJCWlmZWNfc2NiX2NtZCAoIG5ldGRldiwgdmlydF90b19idXMoIHByaXYtPnJmZHNbMF0gKSwgUlVTdGFydCApOworCQlpZmVjX3NjYl9jbWRfd2FpdCAoIG5ldGRldiApOworCX0KKwlEQkcyICggInJ4X3N0YXJ0XG4iICk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZnJlZV9kbWEgKCBjZmcsIHNpemVvZiAoICpjZmcgKSApOworCWZyZWVfZG1hICggaWFzLCBzaXplb2YgKCAqaWFzICkgKTsKKwlpZmVjX2ZyZWUgKCBuZXRkZXYgKTsKKwlpZmVjX3Jlc2V0ICggbmV0ZGV2ICk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSBkcml2ZXIgdG8gcHJvY2VzcyBldmVudHMgZHVyaW5nIG9wZXJhdGlvbi4KKyAqCisgKiBAdiBuZXRkZXYJCURldmljZSBiZWluZyBwb2xsZWQuCisgKgorICogVGhpcyBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IGJ5IGdQWEUgdG8gbGV0IHRoZSBkcml2ZXIgY2hlY2sgdGhlIHN0YXR1cyBvZgorICogdHJhbnNtaXR0ZWQgcGFja2V0cyBhbmQgdG8gYWxsb3cgdGhlIGRyaXZlciB0byBjaGVjayBmb3IgcmVjZWl2ZWQgcGFja2V0cy4KKyAqIFRoaXMgaXMgYSBnUFhFIE5ldHdvcmsgRGV2aWNlIERyaXZlciBBUEkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfbmV0X3BvbGwgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgaWZlY19wcml2YXRlICpwcml2ID0gbmV0ZGV2LT5wcml2OworCXN0YXRpYyBpbnQgbGlua3BvbGwgPSAwOworCXVuc2lnbmVkIHNob3J0IGludHJfc3RhdHVzOworCisJREJHUCAoICJpZmVjX25ldF9wb2xsXG4iICk7CisKKwkvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHRzIEFTQVAgKi8KKwlpbnRyX3N0YXR1cyA9IGludyAoIHByaXYtPmlvYWRkciArIFNDQlN0YXR1cyApOworCW91dHcgKCBpbnRyX3N0YXR1cywgcHJpdi0+aW9hZGRyICsgU0NCU3RhdHVzICk7CisJaW53ICggcHJpdi0+aW9hZGRyICsgU0NCU3RhdHVzICk7CisKKwlEQkcyICggInBvbGwgLSBzdGF0dXM6IDB4JTA0WFxuIiwgaW50cl9zdGF0dXMgKTsKKworCWlmICggKytsaW5rcG9sbCA+IExJTktfQ0hFQ0tfUEVSSU9EICkgeworCQlsaW5rcG9sbCA9IDA7CisJCWlmZWNfbGlua191cGRhdGUgKCBuZXRkZXYgKTsJLyogVXBkYXRlIGxpbmsgc3RhdGUgKi8KKwl9CisKKwkvKiBhbnl0aGluZyB0byBkbyBoZXJlPyAqLworCWlmICggKCBpbnRyX3N0YXR1cyAmICggfklOVEVSUlVQVF9NQVNLICkgKSA9PSAwICkKKwkJcmV0dXJuOworCisJLyogcHJvY2VzcyByZWNlaXZlZCBhbmQgdHJhbnNtaXR0ZWQgcGFja2V0cyAqLworCWlmZWNfdHhfcHJvY2VzcyAoIG5ldGRldiApOworCWlmZWNfcnhfcHJvY2VzcyAoIG5ldGRldiApOworCisJaWZlY19jaGVja19ydV9zdGF0dXMgKCBuZXRkZXYsIGludHJfc3RhdHVzICk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGlzIHRyYW5zbWl0cyBhIHBhY2tldC4KKyAqCisgKiBAdiBuZXRkZXYJCURldmljZSB0byB0cmFuc21pdCBmcm9tLgorICogQHYgaW9idWYgCQlEYXRhIHRvIHRyYW5zbWl0LgorICogQHJldCByYyAgCQlOb24temVybyBpZiBmYWlsZWQgdG8gdHJhbnNtaXQuCisgKgorICogVGhpcyBpcyBhIGdQWEUgTmV0d29yayBEcml2ZXIgQVBJIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IGlmZWNfbmV0X3RyYW5zbWl0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApCit7CisJc3RydWN0IGlmZWNfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaWZlY190Y2IgKnRjYiA9IHByaXYtPnRjYl9oZWFkLT5uZXh0OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gcHJpdi0+aW9hZGRyOworCisJREJHUCAoICJpZmVjX25ldF90cmFuc21pdFxuIiApOworCisJLyogV2FpdCBmb3IgVENCIHRvIGJlY29tZSBhdmFpbGFibGUuICovCisJaWYgKCB0Y2ItPnN0YXR1cyB8fCB0Y2ItPmlvYiApIHsKKwkJREJHICggIlRYIG92ZXJmbG93XG4iICk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlEQkcyICggInRyYW5zbWl0dGluZyBwYWNrZXQgKCVkIGJ5dGVzKS4gc3RhdHVzID0gJWhYLCBjbWQ9JWhYXG4iLAorCQlpb2JfbGVuICggaW9idWYgKSwgdGNiLT5zdGF0dXMsIGludyAoIGlvYWRkciArIFNDQkNtZCApICk7CisKKwl0Y2ItPmNvbW1hbmQgICA9IENtZFN1c3BlbmQgfCBDbWRUeCB8IENtZFR4RmxleDsKKwl0Y2ItPmNvdW50ICAgICA9IDB4MDEyMDgwMDA7CisJdGNiLT50YmRfYWRkcjAgPSB2aXJ0X3RvX2J1cyAoIGlvYnVmLT5kYXRhICk7CisJdGNiLT50YmRfc2l6ZTAgPSAweDNGRkYgJiBpb2JfbGVuICggaW9idWYgKTsKKwl0Y2ItPmlvYiA9IGlvYnVmOworCisJaWZlY190eF93YWtlICggbmV0ZGV2ICk7CisKKwkvKiBBcHBlbmQgdG8gZW5kIG9mIHJpbmcuICovCisJcHJpdi0+dGNiX2hlYWQgPSB0Y2I7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NhbCBzdXBwb3J0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbmUgd2hhdCBlYWNoIEdQSU8gUGluIGRvZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBpZmVjX2VlX2JpdHNbXSA9IHsKKwlbU1BJX0JJVF9TQ0xLXQk9IEVFX1NISUZUX0NMSywKKwlbU1BJX0JJVF9NT1NJXQk9IEVFX0RBVEFfV1JJVEUsCisJW1NQSV9CSVRfTUlTT10JPSBFRV9EQVRBX1JFQUQsCisJW1NQSV9CSVRfU1MoMCldCT0gRUVfRU5CLAorfTsKKworLyoKKyAqIFJlYWQgYSBzaW5nbGUgYml0IGZyb20gdGhlIEdQSU8gcGlucyB1c2VkIGZvciBTUEkuCisgKiBzaG91bGQgYmUgY2FsbGVkIGJ5IFNQSSBiaXRiYXNoIGZ1bmN0aW9ucyBvbmx5CisgKgorICogQHYgYmFzaGVyCQlCaXRiYXNoIGRldmljZQorICogQHYgYml0X2lkCQlMaW5lIHRvIGJlIHJlYWQKKyAqLworc3RhdGljIGludCBpZmVjX3NwaV9yZWFkX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJpdF9pZCApCit7CisJc3RydWN0IGlmZWNfcHJpdmF0ZSAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZiAoIGJhc2hlciwgc3RydWN0IGlmZWNfcHJpdmF0ZSwgc3BpLmJhc2hlciApOworCXVuc2lnbmVkIGxvbmcgZWVfYWRkciA9IHByaXYtPmlvYWRkciArIENTUkVlcHJvbTsKKwl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKwl1aW50MTZfdCBtYXNrOworCisJREJHUCAoICJpZmVjX3NwaV9yZWFkX2JpdFxuIiApOworCisJbWFzayA9IGlmZWNfZWVfYml0c1tiaXRfaWRdOworCXJldCA9IGludyAoZWVfYWRkcik7CisKKwlyZXR1cm4gKCByZXQgJiBtYXNrICkgPyAxIDogMDsKK30KKworLyoKKyAqIFdyaXRlIGEgc2luZ2xlIGJpdCB0byB0aGUgR1BJTyBwaW5zIHVzZWQgZm9yIFNQSS4KKyAqIHNob3VsZCBiZSBjYWxsZWQgYnkgU1BJIGJpdGJhc2ggZnVuY3Rpb25zIG9ubHkKKyAqCisgKiBAdiBiYXNoZXIJCUJpdGJhc2ggZGV2aWNlCisgKiBAdiBiaXRfaWQJCUxpbmUgdG8gd3JpdGUgdG8KKyAqIEB2IGRhdGEJCVZhbHVlIHRvIHdyaXRlCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfc3BpX3dyaXRlX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsCisJCQkJIHVuc2lnbmVkIGludCBiaXRfaWQsCisJCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSApCit7CisJc3RydWN0IGlmZWNfcHJpdmF0ZSAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZiAoIGJhc2hlciwgc3RydWN0IGlmZWNfcHJpdmF0ZSwgc3BpLmJhc2hlciApOworCXVuc2lnbmVkIGxvbmcgZWVfYWRkciA9IHByaXYtPmlvYWRkciArIENTUkVlcHJvbTsKKwlzaG9ydCB2YWw7CisJdWludDE2X3QgbWFzayA9IGlmZWNfZWVfYml0c1tiaXRfaWRdOworCisJREJHUCAoICJpZmVjX3NwaV93cml0ZV9iaXRcbiIgKTsKKworCXZhbCA9IGludyAoIGVlX2FkZHIgKTsKKwl2YWwgJj0gfm1hc2s7CisJdmFsIHw9IGRhdGEgJiBtYXNrOworCisJb3V0dyAoIHZhbCwgZWVfYWRkciApOworfQorCisvKiBzZXQgZnVuY3Rpb24gcG9pbnRlciB0byBTUEkgcmVhZC0gYW5kIHdyaXRlLWJpdCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgYml0X2Jhc2hlcl9vcGVyYXRpb25zIGlmZWNfYmFzaGVyX29wcyA9IHsKKwkucmVhZCA9IGlmZWNfc3BpX3JlYWRfYml0LAorCS53cml0ZSA9IGlmZWNfc3BpX3dyaXRlX2JpdCwKK307CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBlZXByb20gc3R1ZmYKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfaW5pdF9lZXByb20gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgaWZlY19wcml2YXRlICpwcml2ID0gbmV0ZGV2LT5wcml2OworCisJREJHUCAoICJpZmVjX2luaXRfZWVwcm9tXG4iICk7CisKKwlwcml2LT5zcGkuYmFzaGVyLm9wID0gJmlmZWNfYmFzaGVyX29wczsKKwlwcml2LT5zcGkuYnVzLm1vZGUgPSBTUElfTU9ERV9USFJFRVdJUkU7CisJaW5pdF9zcGlfYml0X2Jhc2hlciAoICZwcml2LT5zcGkgKTsKKworCXByaXYtPmVlcHJvbS5idXMgPSAmcHJpdi0+c3BpLmJ1czsKKworCS8qIGluaXQgYXMgOTNjNDYoOTNjMTQgY29tcGF0aWJsZSkgZmlyc3QsIHRvIHNldCB0aGUgY29tbWFuZCBsZW4sCisJICogYmxvY2sgc2l6ZSBhbmQgd29yZCBsZW4uIE5lZWRzIHRvIGJlIHNldCBmb3IgYWRkcmVzcyBsZW4gZGV0ZWN0aW9uLgorCSAqLworCWluaXRfYXQ5M2M0NiAoICZwcml2LT5lZXByb20sIDE2ICk7CisKKwkvKiBkZXRlY3QgYWRkcmVzcyBsZW5ndGgsICovCisJdGhyZWV3aXJlX2RldGVjdF9hZGRyZXNzX2xlbiAoICZwcml2LT5lZXByb20gKTsKKworCS8qIGFkZHJlc3MgbGVuID09IDggbWVhbnMgOTNjNjYgaW5zdGVhZCBvZiA5M2M0NiAqLworCWlmICggcHJpdi0+ZWVwcm9tLmFkZHJlc3NfbGVuID09IDggKQorCQlpbml0X2F0OTNjNjYgKCAmcHJpdi0+ZWVwcm9tLCAxNiApOworfQorCisvKgorICogQ2hlY2sgaWYgdGhlIG5ldHdvcmsgY2FibGUgaXMgcGx1Z2dlZCBpbi4KKyAqCisgKiBAdiBuZXRkZXYgIAkJTmV0d29yayBkZXZpY2UgdG8gY2hlY2suCisgKiBAcmV0IHJldHZhbAkJZ3JlYXRlciAwIGlmIGxpbmt1cC4KKyAqLworc3RhdGljIGludCBpZmVjX2xpbmtfY2hlY2sgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgaWZlY19wcml2YXRlICpwcml2ID0gbmV0ZGV2LT5wcml2OworCXVuc2lnbmVkIHNob3J0IG1kaW9fcmVnaXN0ZXIgPSBwcml2LT5tZGlvX3JlZ2lzdGVyOworCisJREJHUCAoICJpZmVjX2xpbmtfY2hlY2tcbiIgKTsKKworCS8qIFJlYWQgdGhlIHN0YXR1cyByZWdpc3RlciBvbmNlIHRvIGRpc2NhcmQgc3RhbGUgZGF0YSAqLworCWlmZWNfbWRpb19yZWFkICggbmV0ZGV2LCBtZGlvX3JlZ2lzdGVyICYgMHgxZiwgMSApOworCS8qIENoZWNrIHRvIHNlZSBpZiBuZXR3b3JrIGNhYmxlIGlzIHBsdWdnZWQgaW4uICovCisJaWYgKCAhICggaWZlY19tZGlvX3JlYWQgKCBuZXRkZXYsIG1kaW9fcmVnaXN0ZXIgJiAweDFmLCAxICkKKwkJICAmICggMSA8PCAyICkgKSApIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKgorICogQ2hlY2sgbmV0d29yayBjYWJsZSBsaW5rLCBpbmZvcm0gZ1BYRSBhcyBhcHByb3ByaWF0ZS4KKyAqCisgKiBAdiBuZXRkZXYgIAkJTmV0d29yayBkZXZpY2UgdG8gY2hlY2suCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfbGlua191cGRhdGUgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlEQkdQICggImlmZWNfbGlua191cGRhdGVcbiIgKTsKKworCS8qIFVwZGF0ZSBsaW5rIHN0YXRlICovCisJaWYgKCBpZmVjX2xpbmtfY2hlY2sgKCBuZXRkZXYgKSApCisJCW5ldGRldl9saW5rX3VwICggbmV0ZGV2ICk7CisJZWxzZQorCQluZXRkZXZfbGlua19kb3duICggbmV0ZGV2ICk7Cit9CisKKy8qCisgKiBTdXBwb3J0IGZ1bmN0aW9uOiBpZmVjX21kaW9fcmVhZAorICoKKyAqIFRoaXMgcHJvYmFibHkgcmVhZHMgYSByZWdpc3RlciBpbiB0aGUgInBoeXNpY2FsIG1lZGlhIGludGVyZmFjZSBjaGlwIi4KKyAqIC0tIFJFVworICovCitzdGF0aWMgaW50IGlmZWNfbWRpb19yZWFkICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYXRpb24gKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgPSBuZXRkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBwcml2LT5pb2FkZHI7CisJaW50IHZhbDsKKwlpbnQgYm9ndXNjbnQgPSA2NCo0OyAgICAgLyogPDY0IHVzZWMuIHRvIGNvbXBsZXRlLCB0eXAgMjcgdGlja3MgKi8KKworCURCR1AgKCAiaWZlY19tZGlvX3JlYWRcbiIgKTsKKworCW91dGwgKCAweDA4MDAwMDAwIHwgKCBsb2NhdGlvbiA8PCAxNiApIHwgKCBwaHlfaWQgPDwgMjEgKSwKKwkgICAgICAgaW9hZGRyICsgQ1NSQ3RybE1ESSApOworCWRvIHsKKwkJdWRlbGF5ICggMTYgKTsKKworCQl2YWwgPSBpbmwgKCBpb2FkZHIgKyBDU1JDdHJsTURJICk7CisKKwkJaWYgKCAtLWJvZ3VzY250IDwgMCApIHsKKwkJCURCRyAoICIgaWZlY19tZGlvX3JlYWQoKSB0aW1lIG91dCB3aXRoIHZhbCA9ICVYLlxuIiwKKwkJCSAgICAgICAgIHZhbCApOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICghICggdmFsICYgMHgxMDAwMDAwMCApICk7CisJcmV0dXJuIHZhbCAmIDB4ZmZmZjsKK30KKworLyoKKyAqIEluaXRpYWxpemVzIE1ESU8uCisgKgorICogQHYgbmV0ZGV2IAkJTmV0d29yayBkZXZpY2UKKyAqIEB2IG9wdGlvbnMJCU1ESU8gb3B0aW9ucworICovCitzdGF0aWMgdm9pZCBpZmVjX21kaW9fc2V0dXAgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgb3B0aW9ucyApCit7CisJc3RydWN0IGlmZWNfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldi0+cHJpdjsKKwl1bnNpZ25lZCBzaG9ydCBtZGlvX3JlZ2lzdGVyID0gcHJpdi0+bWRpb19yZWdpc3RlcjsKKworCURCR1AgKCAiaWZlY19tZGlvX3NldHVwXG4iICk7CisKKwlpZiAoICAgKCAobWRpb19yZWdpc3Rlcj4+OCkgJiAweDNmICkgPT0gRFA4Mzg0MAorCSAgICB8fCAoIChtZGlvX3JlZ2lzdGVyPj44KSAmIDB4M2YgKSA9PSBEUDgzODQwQSApIHsKKwkJaW50IG1kaV9yZWcyMyA9IGlmZWNfbWRpb19yZWFkICggbmV0ZGV2LCBtZGlvX3JlZ2lzdGVyCisJCQkJCQkgICYgMHgxZiwgMjMgKSB8IDB4MDQyMjsKKwkJaWYgKENPTkdFTkIpCisJCQltZGlfcmVnMjMgfD0gMHgwMTAwOworCQlEQkcyICggIkRQODM4NDAgc3BlY2lmaWMgc2V0dXAsIHNldHRpbmcgcmVnaXN0ZXIgMjMgdG8gIgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlaFguXG4iLCBtZGlfcmVnMjMgKTsKKwkJaWZlY19tZGlvX3dyaXRlICggbmV0ZGV2LCBtZGlvX3JlZ2lzdGVyICYgMHgxZiwgMjMsIG1kaV9yZWcyMyApOworCX0KKwlEQkcyICggImRwODM4NDAgIiApOworCWlmICggb3B0aW9ucyAhPSAwICkgeworCQlpZmVjX21kaW9fd3JpdGUgKCBuZXRkZXYsIG1kaW9fcmVnaXN0ZXIgJiAweDFmLCAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAoIChvcHRpb25zICYgMHgyMCkgPyAweDIwMDAgOiAwICkgfAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAoIChvcHRpb25zICYgMHgxMCkgPyAweDAxMDAgOiAwICkgKTsKKwkJREJHMiAoICJzZXQgbWRpb19yZWdpc3Rlci4gIiApOworCX0KK30KKworLyoKKyAqIFN1cHBvcnQgZnVuY3Rpb246IGlmZWNfbWRpb193cml0ZQorICoKKyAqIFRoaXMgcHJvYmFibHkgd3JpdGVzIHRvIHRoZSAicGh5c2ljYWwgbWVkaWEgaW50ZXJmYWNlIGNoaXAiLgorICogLS0gUkVXCisgKi8KK3N0YXRpYyBpbnQgaWZlY19tZGlvX3dyaXRlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUgKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgPSBuZXRkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBwcml2LT5pb2FkZHI7CisJaW50IHZhbDsKKwlpbnQgYm9ndXNjbnQgPSA2NCo0OyAgICAgLyogPDY0IHVzZWMuIHRvIGNvbXBsZXRlLCB0eXAgMjcgdGlja3MgKi8KKworCURCR1AgKCAiaWZlY19tZGlvX3dyaXRlXG4iICk7CisKKwlvdXRsICggMHgwNDAwMDAwMCB8ICggbG9jYXRpb24gPDwgMTYgKSB8ICggcGh5X2lkIDw8IDIxICkgfCB2YWx1ZSwKKwkgICAgICAgaW9hZGRyICsgQ1NSQ3RybE1ESSApOworCWRvIHsKKwkJdWRlbGF5ICggMTYgKTsKKworCQl2YWwgPSBpbmwgKCBpb2FkZHIgKyBDU1JDdHJsTURJICk7CisJCWlmICggLS1ib2d1c2NudCA8IDAgKSB7CisJCQlEQkcgKCAiIGlmZWNfbWRpb193cml0ZSgpIHRpbWUgb3V0IHdpdGggdmFsID0gJVguXG4iLAorCQkJICAgICAgdmFsICk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCEgKCB2YWwgJiAweDEwMDAwMDAwICkgKTsKKwlyZXR1cm4gdmFsICYgMHhmZmZmOworfQorCisvKgorICogUmVzZXRzIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfcmVzZXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgaWZlY19wcml2YXRlICpwcml2ID0gbmV0ZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gcHJpdi0+aW9hZGRyOworCisJREJHUCAoICJpZmVjX3Jlc2V0XG4iICk7CisKKwkvKiBkbyBwYXJ0aWFsIHJlc2V0IGZpcnN0ICovCisJb3V0bCAoIFBvcnRQYXJ0aWFsUmVzZXQsIGlvYWRkciArIENTUlBvcnQgKTsKKwlpbncgKCBpb2FkZHIgKyBTQ0JTdGF0dXMgKTsKKwl1ZGVsYXkgKCAyMCApOworCisJLyogZnVsbCByZXNldCAqLworCW91dGwgKCBQb3J0UmVzZXQsIGlvYWRkciArIENTUlBvcnQgKTsKKwlpbncgKCBpb2FkZHIgKyBTQ0JTdGF0dXMgKTsKKwl1ZGVsYXkgKCAyMCApOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluICovCisJaWZlY19uZXRfaXJxICggbmV0ZGV2LCAwICk7Cit9CisKKy8qCisgKiBmcmVlKClzIHRoZSB0eC9yeCByaW5ncy4KKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfZnJlZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworCWludCBpOworCisJREJHUCAoICJpZmVjX2ZyZWVcbiIgKTsKKworCS8qIGZyZWUgYWxsIGFsbG9jYXRlZCByZWNlaXZlIGlvX2J1ZmZlcnMgKi8KKwlmb3IgKCBpID0gMDsgaSA8IFJGRF9DT1VOVDsgaSsrICkgeworCQlmcmVlX2lvYiAoIHByaXYtPnJ4X2lvYnNbaV0gKTsKKwkJcHJpdi0+cnhfaW9ic1tpXSA9IE5VTEw7CisJCXByaXYtPnJmZHNbaV0gPSBOVUxMOworCX0KKworCS8qIGZyZWUgVFggcmluZyBidWZmZXIgKi8KKwlmcmVlX2RtYSAoIHByaXYtPnRjYnMsIFRYX1JJTkdfQllURVMgKTsKKworCXByaXYtPnRjYnMgPSBOVUxMOworfQorCisvKgorICogSW5pdGlhbGl6ZXMgYW4gUkZELgorICoKKyAqIEB2IHJmZCAgICAJCVJGRCBzdHJ1Y3QgdG8gaW5pdGlhbGl6ZQorICogQHYgY29tbWFuZAkJQ29tbWFuZCB3b3JkCisgKiBAdiBsaW5rICAgCQlMaW5rIHZhbHVlCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfcmZkX2luaXQgKCBzdHJ1Y3QgaWZlY19yZmQgKnJmZCwgczE2IGNvbW1hbmQsIHUzMiBsaW5rICkKK3sKKwlEQkdQICggImlmZWNfcmZkX2luaXRcbiIgKTsKKworCXJmZC0+c3RhdHVzICAgICAgPSAwOworCXJmZC0+Y29tbWFuZCAgICAgPSBjb21tYW5kOworCXJmZC0+cnhfYnVmX2FkZHIgPSAweEZGRkZGRkZGOworCXJmZC0+Y291bnQgICAgICAgPSAwOworCXJmZC0+c2l6ZSAgICAgICAgPSBSRkRfUEFDS0VUX0xFTjsKKwlyZmQtPmxpbmsgICAgICAgID0gbGluazsKK30KKworLyoKKyAqIFNlbmQgYWRkcmVzcyBvZiBuZXcgUkZEIHRvIGNhcmQKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfcmVwcmltZV9ydSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgPSBuZXRkZXYtPnByaXY7CisJaW50IGN1cl9yeCA9IHByaXYtPmN1cl9yeDsKKwkKKwlEQkdQICggImlmZWNfcmVwcmltZV9ydVxuIiApOworCQorCWlmICggcHJpdi0+cmZkc1tjdXJfcnhdICE9IE5VTEwgKSB7CisJCWlmZWNfc2NiX2NtZCAoIG5ldGRldiwgdmlydF90b19idXMgKCBwcml2LT5yZmRzW2N1cl9yeF0gKSwKKwkJCSAgICAgICBSVVN0YXJ0ICk7CisJCWlmZWNfc2NiX2NtZF93YWl0ICggbmV0ZGV2ICk7CisJfQorfQorCisvKgorICogQ2hlY2sgaWYgcmVwcmltZSBvZiBSVSBuZWVkZWQKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfY2hlY2tfcnVfc3RhdHVzICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgICB1bnNpZ25lZCBzaG9ydCBpbnRyX3N0YXR1cyApCit7CisJc3RydWN0IGlmZWNfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldi0+cHJpdjsKKworCURCR1AgKCAiaWZlY19jaGVja19ydV9zdGF0dXNcbiIgKTsKKworCS8qCisJKiBUaGUgY2hpcCBtYXkgaGF2ZSBzdXNwZW5kZWQgcmVjZXB0aW9uIGZvciB2YXJpb3VzIHJlYXNvbnMuCisJKiBDaGVjayBmb3IgdGhhdCwgYW5kIHJlLXByaW1lIGl0IHNob3VsZCB0aGlzIGJlIHRoZSBjYXNlLgorCSovCisJc3dpdGNoICggKCBpbnRyX3N0YXR1cyA+PiAyICkgJiAweGYgKSB7CisJCWNhc2UgMDogIC8qIElkbGUgKi8KKwkJY2FzZSA0OiAgLyogUmVhZHkgKi8KKwkJCWJyZWFrOworCQljYXNlIDE6ICAvKiBTdXNwZW5kZWQgKi8KKwkJY2FzZSAyOiAgLyogTm8gcmVzb3VyY2VzIChSRkRzKSAqLworCQljYXNlIDk6ICAvKiBTdXNwZW5kZWQgd2l0aCBubyBtb3JlIFJCRHMgKi8KKwkJY2FzZSAxMDogLyogTm8gcmVzb3VyY2VzIGR1ZSB0byBubyBSQkRzICovCisJCWNhc2UgMTI6IC8qIFJlYWR5IHdpdGggbm8gUkJEcyAqLworCQkJREJHICggImlmZWNfbmV0X3BvbGw6IFJVIHJlcHJpbWVkLlxuIiApOworCQkJaWZlY19yZXByaW1lX3J1ICggbmV0ZGV2ICk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIHJlc2VydmVkIHZhbHVlcyAqLworCQkJREJHICggImlmZWNfbmV0X3BvbGw6IFJVIHN0YXRlIGFub21hbHk6ICVpXG4iLAorCQkJICAgICAgKCBpbncgKCBwcml2LT5pb2FkZHIgKyBTQ0JTdGF0dXMgKSA+PiAyICkgJiAweGYgKTsKKwkJCWJyZWFrOworCX0KK30KKworI2RlZmluZSBSRkRfU1RBVFVTICggUkZEX09LIHwgUkZEUnhDb2wgfCBSRkRSeEVyciB8IFJGRFNob3J0IHwgXAorCQkgICAgIFJGRERNQU92ZXJydW4gfCBSRkROb0J1ZnMgfCBSRkRDUkNFcnJvciApCisvKgorICogTG9va3MgZm9yIHJlY2VpdmVkIHBhY2tldHMgaW4gdGhlIHJ4IHJpbmcsIHJlcG9ydHMgc3VjY2VzcyBvciBlcnJvciB0bworICogdGhlIGNvcmUgYWNjb3JkaW5nbHkuIFN0YXJ0cyByZWFsbG9jYXRpb24gb2YgcnggcmluZy4KKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfcnhfcHJvY2VzcyAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgICA9IG5ldGRldi0+cHJpdjsKKwlpbnQgY3VyX3J4ID0gcHJpdi0+Y3VyX3J4OworCXN0cnVjdCBpb19idWZmZXIgKmlvYiA9IHByaXYtPnJ4X2lvYnNbY3VyX3J4XTsKKwlzdHJ1Y3QgaWZlY19yZmQgKnJmZCA9IHByaXYtPnJmZHNbY3VyX3J4XTsKKwl1bnNpZ25lZCBpbnQgcnhfbGVuOworCXMxNiBzdGF0dXM7CisKKwlEQkdQICggImlmZWNfcnhfcHJvY2Vzc1xuIiApOworCisJLyogUHJvY2VzcyBhbnkgcmVjZWl2ZWQgcGFja2V0cyAqLworCXdoaWxlICggaW9iICYmIHJmZCAmJiAoIHN0YXR1cyA9IHJmZC0+c3RhdHVzICkgKSB7CisJCXJ4X2xlbiA9IHJmZC0+Y291bnQgJiBSRkRNYXNrQ291bnQ7CisKKwkJREJHMiAoICJHb3QgYSBwYWNrZXQ6IExlbiA9ICVkLCBjdXJfcnggPSAlZC5cbiIsIHJ4X2xlbiwKKwkJICAgICAgIGN1cl9yeCApOworCQlEQkdJT19IRCAoICh2b2lkKilyZmQtPnBhY2tldCwgMHgzMCApOworCisJCWlmICggKCBzdGF0dXMgJiBSRkRfU1RBVFVTICkgIT0gUkZEX09LICkgeworCQkJREJHICggIkNvcnJ1cHRlZCBwYWNrZXQgcmVjZWl2ZWQuICIKKwkJCSAgICAgICJTdGF0dXMgPSAlIzA4aHhcbiIsIHN0YXR1cyApOworCQkJbmV0ZGV2X3J4X2VyciAoIG5ldGRldiwgaW9iLCAtRUlOVkFMICk7CisJCX0gZWxzZSB7CisJCQkvKiBIYW5kIG9mZiB0aGUgcGFja2V0IHRvIHRoZSBuZXR3b3JrIHN1YnN5c3RlbSAqLworCQkJaW9iX3B1dCAoIGlvYiwgcnhfbGVuICk7CisJCQlEQkcyICggIlJlY2VpdmVkIHBhY2tldDogJXAsIGxlbjogJWRcbiIsIGlvYiwgcnhfbGVuICk7CisJCQluZXRkZXZfcnggKCBuZXRkZXYsIGlvYiApOworCQl9CisKKwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IHJldXNlIHRoaXMgUkZEICovCisJCXByaXYtPnJ4X2lvYnNbY3VyX3J4XSA9IE5VTEw7CisJCXByaXYtPnJmZHNbY3VyX3J4XSA9IE5VTEw7CisKKwkJLyogTmV4dCBSRkQgKi8KKwkJcHJpdi0+Y3VyX3J4ID0gKCBjdXJfcnggKyAxICkgJSBSRkRfQ09VTlQ7CisJCWN1cl9yeCA9IHByaXYtPmN1cl9yeDsKKwkJaW9iID0gcHJpdi0+cnhfaW9ic1tjdXJfcnhdOworCQlyZmQgPSBwcml2LT5yZmRzW2N1cl9yeF07CisJfQorCisJaWZlY19yZWZpbGxfcnhfcmluZyAoIG5ldGRldiApOworfQorCisvKgorICogQWxsb2NhdGVzIGlvX2J1ZmZlciwgc2V0IHBvaW50ZXJzIGluIGlmZWNfcHJpdmF0ZSBzdHJ1Y3R1cmUgYWNjb3JkaW5nbHksCisgKiByZXNlcnZlcyBzcGFjZSBmb3IgUkZEIGhlYWRlciBpbiBpb19idWZmZXIuCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgY3VyCQlEZXNjcmlwdG9yIG51bWJlciB0byB3b3JrIG9uCisgKiBAdiBjbWQJCVZhbHVlIHRvIHNldCBjbWQgZmllbGQgaW4gUkZEIHRvCisgKiBAdiBsaW5rCQlQb2ludGVyIHRvIG5lZCBSRkQKKyAqIEByZXQgcmMJCTAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGlmZWNfZ2V0X3J4X2Rlc2MgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgY3VyLCBpbnQgY21kLAorCQkJICAgICAgaW50IGxpbmsgKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGlmZWNfcmZkICpyZmQgID0gcHJpdi0+cmZkc1tjdXJdOworCisJREJHUCAoICJpZmVjX2dldF9yeF9kZXNjXG4iICk7CisKKwlwcml2LT5yeF9pb2JzW2N1cl0gPSBhbGxvY19pb2IgKCBzaXplb2YgKCAqcmZkICkgKTsKKwlpZiAoICEgcHJpdi0+cnhfaW9ic1tjdXJdICkgeworCQlEQkcgKCAiYWxsb2NfaW9iIGZhaWxlZC4gZGVzYy4gbnI6ICVkXG4iLCBjdXIgKTsKKwkJcHJpdi0+cmZkc1tjdXJdID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogSW5pdGlhbGl6ZSBuZXcgdGFpbC4gKi8KKwlwcml2LT5yZmRzW2N1cl0gPSBwcml2LT5yeF9pb2JzW2N1cl0tPmRhdGE7CisJaWZlY19yZmRfaW5pdCAoIHByaXYtPnJmZHNbY3VyXSwgY21kLCBsaW5rICk7CisJaW9iX3Jlc2VydmUgKCBwcml2LT5yeF9pb2JzW2N1cl0sIFJGRF9IRUFERVJfTEVOICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIG5ldyBkZXNjcmlwdG9yIGVudHJpZXMgYW5kIGluaXRpYWxpemUgdGhlbSBpZiBuZWVkZWQKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfcmVmaWxsX3J4X3JpbmcgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgaWZlY19wcml2YXRlICpwcml2ID0gbmV0ZGV2LT5wcml2OworCWludCBpLCBjdXJfcng7CisJdW5zaWduZWQgc2hvcnQgaW50cl9zdGF0dXM7CisKKwlEQkdQICggImlmZWNfcmVmaWxsX3J4X3JpbmdcbiIgKTsKKworCWZvciAoIGkgPSAwOyBpIDwgUkZEX0NPVU5UOyBpKysgKSB7CisJCWN1cl9yeCA9ICggcHJpdi0+Y3VyX3J4ICsgaSApICUgUkZEX0NPVU5UOworCQkvKiBvbmx5IHJlZmlsbCBpZiBlbXB0eSAqLworCQlpZiAoIHByaXYtPnJmZHNbY3VyX3J4XSAhPSBOVUxMIHx8CisJCSAgICAgcHJpdi0+cnhfaW9ic1tjdXJfcnhdICE9IE5VTEwgKQorCQkJY29udGludWU7CisKKwkJREJHMiAoICJyZWZpbGxpbmcgUkZEICVkXG4iLCBjdXJfcnggKTsKKworCQlpZiAoIGlmZWNfZ2V0X3J4X2Rlc2MgKCBuZXRkZXYsIGN1cl9yeCwKKwkJICAgICBDbWRTdXNwZW5kIHwgQ21kRW5kT2ZMaXN0LCAwICkgPT0gMCApIHsKKwkJCWlmICggaSA+IDAgKSB7CisJCQkJaW50IHByZXZfcnggPSAoICggKCBjdXJfcnggKyBSRkRfQ09VTlQgKSAtIDEgKQorCQkJCQkJJSBSRkRfQ09VTlQgKTsKKwkJCQlzdHJ1Y3QgaWZlY19yZmQgKnJmZCA9IHByaXYtPnJmZHNbcHJldl9yeF07CisKKwkJCQlyZmQtPmNvbW1hbmQgPSAwOworCQkJCXJmZC0+bGluayA9IHZpcnRfdG9fYnVzICggcHJpdi0+cmZkc1tjdXJfcnhdICk7CisJCQl9CisJCX0KKwl9CisKKwlpbnRyX3N0YXR1cyA9IGludyAoIHByaXYtPmlvYWRkciArIFNDQlN0YXR1cyApOworCWlmZWNfY2hlY2tfcnVfc3RhdHVzICggbmV0ZGV2LCBpbnRyX3N0YXR1cyApOworfQorCisvKgorICogSW5pdGlhbCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHJ4IHJpbmcuCisgKgorICogQHYgbmV0ZGV2ICAJCURldmljZSBvZiByeCByaW5nLgorICogQHJldCByYyAgICAJCU5vbi16ZXJvIGlmIGVycm9yIG9jY3VyZWQKKyAqLworc3RhdGljIGludCBpZmVjX3J4X3NldHVwICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApCit7CisJc3RydWN0IGlmZWNfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldi0+cHJpdjsKKwlpbnQgaTsKKworCURCR1AgKCAiaWZlY19yeF9zZXR1cFxuIiApOworCisJcHJpdi0+Y3VyX3J4ID0gMDsKKworCS8qIGluaXQgdmFsdWVzIGZvciBpZmVjX3JlZmlsbF9yeF9yaW5nKCkgKi8KKwlmb3IgKCBpID0gMDsgaSA8IFJGRF9DT1VOVDsgaSsrICkgeworCQlwcml2LT5yZmRzW2ldID0gTlVMTDsKKwkJcHJpdi0+cnhfaW9ic1tpXSA9IE5VTEw7CisJfQorCWlmZWNfcmVmaWxsX3J4X3JpbmcgKCBuZXRkZXYgKTsKKworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhdGVzIGEgU0NCIGNvbW1hbmQuCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgcHRyICAgCQlHZW5lcmFsIHBvaW50ZXIgdmFsdWUgZm9yIGNvbW1hbmQuCisgKiBAdiBjbWQgICAJCUNvbW1hbmQgdG8gaXNzdWUuCisgKiBAcmV0IHJjICAJCU5vbi16ZXJvIGlmIGNvbW1hbmQgbm90IGlzc3VlZC4KKyAqLworc3RhdGljIGludCBpZmVjX3NjYl9jbWQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgcHRyLCB1OCBjbWQgKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgPSBuZXRkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBwcml2LT5pb2FkZHI7CisJaW50IHJjOworCisJREJHUCAoICJpZmVjX3NjYl9jbWRcbiIgKTsKKworCXJjID0gaWZlY19zY2JfY21kX3dhaXQgKCBuZXRkZXYgKTsJLyogV2FpdCB1bnRpbCByZWFkeSAqLworCWlmICggIXJjICkgeworCQlvdXRsICggcHRyLCBpb2FkZHIgKyBTQ0JQb2ludGVyICk7CisJCW91dGIgKCBjbWQsIGlvYWRkciArIFNDQkNtZCApOwkJLyogSXNzdWUgY29tbWFuZCAqLworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBXYWl0IGZvciBjb21tYW5kIHVuaXQgdG8gYWNjZXB0IGEgY29tbWFuZC4KKyAqCisgKiBAdiBjbWRfaW9hZGRyCUkvTyBhZGRyZXNzIG9mIGNvbW1hbmQgcmVnaXN0ZXIuCisgKiBAcmV0IHJjICAgICAgCU5vbi16ZXJvIGlmIGNvbW1hbmQgdGltZWQgb3V0LgorICovCitzdGF0aWMgaW50IGlmZWNfc2NiX2NtZF93YWl0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApCit7CisJc3RydWN0IGlmZWNfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGNtZF9pb2FkZHIgPSBwcml2LT5pb2FkZHIgKyBTQ0JDbWQ7CisJaW50IHJjLCB3YWl0ID0gQ1VfQ01EX1RJTUVPVVQ7CisKKwlEQkdQICggImlmZWNfc2NiX2NtZF93YWl0XG4iICk7CisKKwlmb3IgKCA7IHdhaXQgJiYgKCByYyA9IGluYiAoIGNtZF9pb2FkZHIgKSApOyB3YWl0LS0gKQorCQl1ZGVsYXkgKCAxICk7CisKKwlpZiAoICF3YWl0ICkKKwkJREJHICggImlmZWNfc2NiX2NtZF93YWl0IHRpbWVvdXQhXG4iICk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogQ2hlY2sgc3RhdHVzIG9mIHRyYW5zbWl0dGVkIHBhY2tldHMgJiBwZXJmb3JtIHR4IGNvbXBsZXRpb25zLgorICoKKyAqIEB2IG5ldGRldiAgICAJTmV0d29yayBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIGlmZWNfdHhfcHJvY2VzcyAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGlmZWNfdGNiICp0Y2IgPSBwcml2LT50Y2JfdGFpbDsKKwlzMTYgc3RhdHVzOworCisJREJHUCAoICJpZmVjX3R4X3Byb2Nlc3NcbiIgKTsKKworCS8qIENoZWNrIHN0YXR1cyBvZiB0cmFuc21pdHRlZCBwYWNrZXRzICovCisJd2hpbGUgKCAoIHN0YXR1cyA9IHRjYi0+c3RhdHVzICkgJiYgdGNiLT5pb2IgKSB7CisJCWlmICggc3RhdHVzICYgVENCX1UgKSB7CisJCQkvKiByZXBvcnQgZXJyb3IgdG8gZ1BYRSAqLworCQkJREJHICggImlmZWNfdHhfcHJvY2VzcyA6IHR4IGVycm9yIVxuICIgKTsKKwkJCW5ldGRldl90eF9jb21wbGV0ZV9lcnIgKCBuZXRkZXYsIHRjYi0+aW9iLCAtRUlOVkFMICk7CisJCX0gZWxzZSB7CisJCQkvKiByZXBvcnQgc3VjY2Vzc2Z1bCB0cmFuc21pdCAqLworCQkJbmV0ZGV2X3R4X2NvbXBsZXRlICggbmV0ZGV2LCB0Y2ItPmlvYiApOworCQl9CisJCURCRzIgKCAidHggY29tcGxldGlvblxuIiApOworCisJCXRjYi0+aW9iID0gTlVMTDsKKwkJdGNiLT5zdGF0dXMgPSAwOworCisJCXByaXYtPnRjYl90YWlsID0gdGNiLT5uZXh0OwkvKiBOZXh0IFRDQiAqLworCQl0Y2IgPSB0Y2ItPm5leHQ7CisJfQorfQorCisvKgorICogQWxsb2NhdGVzICYgaW5pdGlhbGl6ZSB0eCByZXNvdXJjZXMuCisgKgorICogQHYgbmV0ZGV2ICAgIAlOZXR3b3JrIGRldmljZS4KKyAqIEByZXQgcmMgICAgICAJTm9uLXplcm8gaWYgZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBpbnQgaWZlY190eF9zZXR1cCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBpZmVjX3ByaXZhdGUgKnByaXYgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGlmZWNfdGNiICp0Y2I7CisJaW50IGk7CisKKwlEQkdQICggImlmZWNfdHhfc2V0dXBcbiIgKTsKKworCS8qIGFsbG9jYXRlIHR4IHJpbmcgKi8KKwlwcml2LT50Y2JzID0gbWFsbG9jX2RtYSAoIFRYX1JJTkdfQllURVMsIENCX0FMSUdOICk7CisJaWYgKCAhcHJpdi0+dGNicyApIHsKKwkJREJHICggIlRYLXJpbmcgYWxsb2NhdGlvbiBmYWlsZWRcbiIgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdGNiID0gcHJpdi0+dGNiX3RhaWwgPSBwcml2LT50Y2JzOworCXByaXYtPnR4X2N1cnIgPSBwcml2LT50eF90YWlsID0gMDsKKwlwcml2LT50eF9jbnQgPSAwOworCisJZm9yICggaSA9IDA7IGkgPCBUQ0JfQ09VTlQ7IGkrKywgdGNiKysgKSB7CisJCXRjYi0+c3RhdHVzICAgID0gMDsKKwkJdGNiLT5jb3VudCAgICAgPSAweDAxMjA4MDAwOworCQl0Y2ItPmlvYiAgICAgICA9IE5VTEw7CisJCXRjYi0+dGJkYV9hZGRyID0gdmlydF90b19idXMgKCAmdGNiLT50YmRfYWRkcjAgKTsKKwkJdGNiLT5saW5rICAgICAgPSB2aXJ0X3RvX2J1cyAoIHRjYiArIDEgKTsKKwkJdGNiLT5uZXh0ICAgICAgPSB0Y2IgKyAxOworCX0KKwkvKiBXZSBwb2ludCB0Y2JfaGVhZCBhdCB0aGUgbGFzdCBUQ0IsIHNvIHRoZSBmaXJzdCBpZmVjX25ldF90cmFuc21pdCgpCisJICogd2lsbCB1c2UgdGhlIGZpcnN0IChoZWFkLT5uZXh0KSBUQ0IgdG8gdHJhbnNtaXQuICovCisJcHJpdi0+dGNiX2hlYWQgPSAtLXRjYjsKKwl0Y2ItPmxpbmsgPSB2aXJ0X3RvX2J1cyAoIHByaXYtPnRjYnMgKTsKKwl0Y2ItPm5leHQgPSBwcml2LT50Y2JzOworCQorCXJldHVybiAwOworfQorCisvKgorICogV2FrZSB1cCB0aGUgQ29tbWFuZCBVbml0IGFuZCBpc3N1ZSBhIFJlc3VtZS9TdGFydC4KKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlIGNvbnRhaW5pbmcgQ29tbWFuZCBVbml0CisgKgorICogVGhlIHRpbWUgYmV0d2VlbiBjbGVhcmluZyB0aGUgUyBiaXQgYW5kIGlzc3VpbmcgUmVzdW1lIG11c3QgYmUgYXMgc2hvcnQgYXMKKyAqIHBvc3NpYmxlIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbi4gQXMgbm90ZWQgaW4gbGludXggZWVwcm8xMDAuYyA6CisgKiAgIE5vdGU6IFdhdGNoIG91dCBmb3IgdGhlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBoZXJlOiBpbWFnaW5lCisgKgllcmFzaW5nIHRoZSBwcmV2aW91cyBzdXNwZW5kCisgKgkJdGhlIGNoaXAgcHJvY2Vzc2VzIHRoZSBwcmV2aW91cyBjb21tYW5kCisgKgkJdGhlIGNoaXAgcHJvY2Vzc2VzIHRoZSBmaW5hbCBjb21tYW5kLCBhbmQgc3VzcGVuZHMKKyAqCWRvaW5nIHRoZSBDVV9SRVNVTUUKKyAqCQl0aGUgY2hpcCBwcm9jZXNzZXMgdGhlIG5leHQteWV0LXZhbGlkIHBvc3QtZmluYWwtY29tbWFuZC4KKyAqICAgU28gYmxpbmRseSBzZW5kaW5nIGEgQ1VfUkVTVU1FIGlzIG9ubHkgc2FmZSBpZiB3ZSBkbyBpdCBpbW1lZGlhdGVseSBhZnRlcgorICogICBlcmFzaW5nIHRoZSBwcmV2aW91cyBDbWRTdXNwZW5kLCB3aXRob3V0IHRoZSBwb3NzaWJpbGl0eSBvZiBhbiBpbnRlcnZlbmluZworICogICBkZWxheS4KKyAqLwordm9pZCBpZmVjX3R4X3dha2UgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgaWZlY19wcml2YXRlICpwcml2ID0gbmV0ZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gcHJpdi0+aW9hZGRyOworCXN0cnVjdCBpZmVjX3RjYiAqdGNiID0gcHJpdi0+dGNiX2hlYWQtPm5leHQ7CisKKwlEQkdQICggImlmZWNfdHhfd2FrZVxuIiApOworCisJLyogRm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgdGhlIGZpcnN0IHRyYW5zbWl0LCB3ZSBpc3N1ZSBhIFNUQVJULiBUaGUKKwkgKiBjYXJkIHdvbid0IFJFU1VNRSBhZnRlciB0aGUgY29uZmlndXJlIGNvbW1hbmQuICovCisJaWYgKCBwcml2LT5jb25maWd1cmVkICkgeworCQlwcml2LT5jb25maWd1cmVkID0gMDsKKwkJaWZlY19zY2JfY21kICggbmV0ZGV2LCB2aXJ0X3RvX2J1cyAoIHRjYiApLCBDVVN0YXJ0ICk7CisJCWlmZWNfc2NiX2NtZF93YWl0ICggbmV0ZGV2ICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZXN1bWUgaWYgc3VzcGVuZGVkLiAqLworCXN3aXRjaCAoICggaW53ICggaW9hZGRyICsgU0NCU3RhdHVzICkgPj4gNiApICYgMHgzICkgeworCWNhc2UgMDogIC8qIElkbGUgLSBXZSBzaG91bGQgbm90IHJlYWNoIHRoaXMgc3RhdGUuICovCisJCURCRzIgKCAiaWZlY190eF93YWtlOiB0eCBpZGxlIVxuIiApOworCQlpZmVjX3NjYl9jbWQgKCBuZXRkZXYsIHZpcnRfdG9fYnVzICggdGNiICksIENVU3RhcnQgKTsKKwkJaWZlY19zY2JfY21kX3dhaXQgKCBuZXRkZXYgKTsKKwkJcmV0dXJuOworCWNhc2UgMTogIC8qIFN1c3BlbmRlZCAqLworCQlEQkcyICggInMiICk7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIEFjdGl2ZSAqLworCQlEQkcyICggImEiICk7CisJfQorCWlmZWNfc2NiX2NtZF93YWl0ICggbmV0ZGV2ICk7CisJb3V0bCAoIDAsIGlvYWRkciArIFNDQlBvaW50ZXIgKTsKKwlwcml2LT50Y2JfaGVhZC0+Y29tbWFuZCAmPSB+Q21kU3VzcGVuZDsKKwkvKiBJbW1lZGlhdGVseSBpc3N1ZSBSZXN1bWUgY29tbWFuZCAqLworCW91dGIgKCBDVVJlc3VtZSwgaW9hZGRyICsgU0NCQ21kICk7CisJaWZlY19zY2JfY21kX3dhaXQgKCBuZXRkZXYgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlmZWNfbmljc1tdID0geworUENJX1JPTSgweDgwODYsIDB4MTAyOSwgImlkMTAyOSIsICAgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIElEMTAyOSIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTAzMCwgImlkMTAzMCIsICAgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIElEMTAzMCIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTAzMSwgIjgyODAxY2FtIiwgICAgICAiSW50ZWwgODI4MDFDQU0gKElDSDMpIENoaXBzZXQgRXRoZXJuZXQgQ29udHJvbGxlciIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTAzMiwgImVlcHJvMTAwLTEwMzIiLCAiSW50ZWwgUFJPLzEwMCBWRSBOZXR3b3JrIENvbm5lY3Rpb24iLCAwKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMzMsICJlZXBybzEwMC0xMDMzIiwgIkludGVsIFBSTy8xMDAgVk0gTmV0d29yayBDb25uZWN0aW9uIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDM0LCAiZWVwcm8xMDAtMTAzNCIsICJJbnRlbCBQUk8vMTAwIFZNIE5ldHdvcmsgQ29ubmVjdGlvbiIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTAzNSwgImVlcHJvMTAwLTEwMzUiLCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIENoaXBzZXQgRXRoZXJuZXQgQ29udHJvbGxlciIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTAzNiwgImVlcHJvMTAwLTEwMzYiLCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIENoaXBzZXQgRXRoZXJuZXQgQ29udHJvbGxlciIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTAzNywgImVlcHJvMTAwLTEwMzciLCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIENoaXBzZXQgRXRoZXJuZXQgQ29udHJvbGxlciIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTAzOCwgImlkMTAzOCIsICAgICAgICAiSW50ZWwgUFJPLzEwMCBWTSBOZXR3b3JrIENvbm5lY3Rpb24iLCAwKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMzksICI4MjU2MmV0IiwgICAgICAgIkludGVsIFBSTzEwMCBWRSA4MjU2MkVUIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDNhLCAiaWQxMDNhIiwgICAgICAgICJJbnRlbCBDb3Jwb3JhdGlvbiA4MjU1OSBJbkJ1c2luZXNzIDEwLzEwMCIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTAzYiwgIjgyNTYyZXRiIiwgICAgICAiSW50ZWwgUFJPMTAwIFZFIDgyNTYyRVRCIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDNjLCAiZWVwcm8xMDAtMTAzYyIsICJJbnRlbCBQUk8vMTAwIFZNIE5ldHdvcmsgQ29ubmVjdGlvbiIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTAzZCwgImVlcHJvMTAwLTEwM2QiLCAiSW50ZWwgUFJPLzEwMCBWRSBOZXR3b3JrIENvbm5lY3Rpb24iLCAwKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwM2UsICJlZXBybzEwMC0xMDNlIiwgIkludGVsIFBSTy8xMDAgVk0gTmV0d29yayBDb25uZWN0aW9uIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDUxLCAicHJvdmUiLCAgICAgICAgICJJbnRlbCBQUk8vMTAwIFZFIE5ldHdvcmsgQ29ubmVjdGlvbiIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTA1OSwgIjgyNTUxcW0iLCAgICAgICAiSW50ZWwgUFJPLzEwMCBNIE1vYmlsZSBDb25uZWN0aW9uIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMjA5LCAiODI1NTllciIsICAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAgODI1NTlFUiIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTIyNywgIjgyODY1IiwgICAgICAgICAiSW50ZWwgODI4NjUgRXRoZXJFeHByZXNzIFBSTy8xMDBBIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMjI4LCAiODI1NTYiLCAgICAgICAgICJJbnRlbCA4MjU1NiBFdGhlckV4cHJlc3MgUFJPLzEwMCBTbWFydCIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MTIyOSwgImVlcHJvMTAwIiwgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHgyNDQ5LCAiODI1NjJlbSIsICAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAgODI1NjJFTSIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MjQ1OSwgIjgyNTYyLTEiLCAgICAgICAiSW50ZWwgODI1NjIgYmFzZWQgRmFzdCBFdGhlcm5ldCBDb25uZWN0aW9uIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHgyNDVkLCAiODI1NjItMiIsICAgICAgICJJbnRlbCA4MjU2MiBiYXNlZCBGYXN0IEV0aGVybmV0IENvbm5lY3Rpb24iLCAwKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwNTAsICI4MjU2MmV6IiwgICAgICAgIkludGVsIDgyNTYyRVogTmV0d29yayBDb25uZWN0aW9uIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDUxLCAiZWVwcm8xMDAtMTA1MSIsICJJbnRlbCA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKSBDaGlwc2V0IEV0aGVybmV0IENvbnRyb2xsZXIiLCAwKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwNjUsICI4MjU2Mi0zIiwgICAgICAgIkludGVsIDgyNTYyIGJhc2VkIEZhc3QgRXRoZXJuZXQgQ29ubmVjdGlvbiIsIDApLAorUENJX1JPTSgweDgwODYsIDB4NTIwMCwgImVlcHJvMTAwLTUyMDAiLCAiSW50ZWwgRXRoZXJFeHByZXNzIFBSTy8xMDAgSW50ZWxsaWdlbnQgU2VydmVyIiwgMCksCitQQ0lfUk9NKDB4ODA4NiwgMHg1MjAxLCAiZWVwcm8xMDAtNTIwMSIsICJJbnRlbCBFdGhlckV4cHJlc3MgUFJPLzEwMCBJbnRlbGxpZ2VudCBTZXJ2ZXIiLCAwKSwKK307CisKKy8qIENhcmRzIHdpdGggZGV2aWNlIGlkcyAweDEwMzAgdG8gMHgxMDNGLCAweDI0NDksIDB4MjQ1OSBvciAweDI0NUQgbWlnaHQgbmVlZAorICogYSB3b3JrYXJvdW5kIGZvciBoYXJkd2FyZSBidWcgb24gMTAgbWJpdCBoYWxmIGR1cGxleCAoc2VlIGxpbnV4IGRyaXZlciBlZXBybzEwMC5jKQorICogMjAwMy8wMy8xNyBnYmF1bSAqLworCitzdHJ1Y3QgcGNpX2RyaXZlciBpZmVjX2RyaXZlciBfX3BjaV9kcml2ZXIgPSB7CisJLmlkcyAgICAgID0gaWZlY19uaWNzLAorCS5pZF9jb3VudCA9ICggc2l6ZW9mIChpZmVjX25pY3MpIC8gc2l6ZW9mIChpZmVjX25pY3NbMF0pICksCisJLnByb2JlICAgID0gaWZlY19wY2lfcHJvYmUsCisJLnJlbW92ZSAgID0gaWZlY19wY2lfcmVtb3ZlCit9OworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZWVwcm8xMDAuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMjJkZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmgKQEAgLTAsMCArMSwyMDYgQEAKKworI2lmbmRlZiBfX0VFUFJPMTAwX0hfCisjZGVmaW5lIF9fRUVQUk8xMDBfSF8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjZGVmaW5lIENPTkdFTkIgICAgICAgICAwCS8qIEVuYWJsZSBjb25nZXN0aW9uIGNvbnRyb2wgaW4gdGhlIERQODM4NDAuICovCisjZGVmaW5lIFRYX0ZJRk8gICAgICAgICA4CS8qIFR4IEZJRk8gdGhyZXNob2xkIGluIDQgYnl0ZSB1bml0cywgMC0xNSAqLworI2RlZmluZSBSWF9GSUZPICAgICAgICAgOAkvKiBSeCBGSUZPIHRocmVzaG9sZCwgZGVmYXVsdCAzMiBieXRlcy4gKi8KKyNkZWZpbmUgVFhfRE1BX0NPVU5UICAgIDAJLyogVHggRE1BIGJ1cnN0IGxlbmd0aCwgMC0xMjcsIGRlZmF1bHQgMC4gKi8KKyNkZWZpbmUgUlhfRE1BX0NPVU5UICAgIDAJLyogUnggRE1BIGxlbmd0aCwgMCBtZWFucyBubyBwcmVlbXB0aW9uLiAqLworI2RlZmluZSBDVV9DTURfVElNRU9VVCAgMTAwMAkvKiBDVSBjb21tYW5kIGFjY2VwdCB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcyAqLworI2RlZmluZSBMSU5LX0NIRUNLX1BFUklPRCAxMDAwCS8qICMgb2YgcG9sbCgpIGNhbGxzIGJldHdlZW4gbGluayBjaGVja3MgKi8KKworI2RlZmluZSBSRkRfUEFDS0VUX0xFTiAgMTUxOAorI2RlZmluZSBSRkRfSU9CX0xFTiAgICAgMTUzNgorI2RlZmluZSBSRkRfSEVBREVSX0xFTiAgMTYKKyNkZWZpbmUgQ0JfQUxJR04gICAgICAgIDIJLyogQWxpZ25tZW50IG9mIGNvbW1hbmQgYmxvY2tzICovCisKKyNkZWZpbmUgUkZEX0NPVU5UICAgICAgIDQKKyNkZWZpbmUgVENCX0NPVU5UICAgICAgIDQKKyNkZWZpbmUgUlhfUklOR19CWVRFUyAgICggUkZEX0NPVU5UICogc2l6ZW9mICggc3RydWN0IGlmZWNfcmZkICkgKQorI2RlZmluZSBUWF9SSU5HX0JZVEVTICAgKCBUQ0JfQ09VTlQgKiBzaXplb2YgKCBzdHJ1Y3QgaWZlY190Y2IgKSApCisKKy8qIHNvbWUgRUVQUk9NIGFkZHJlc3NlcyAqLworI2RlZmluZSBFRVBST01fQUREUl9NQUNfMAkJMAorI2RlZmluZSBFRVBST01fQUREUl9NRElPX1JFR0lTVEVSCTYKKworLyogQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBieXRlIG9mZnNldHMgLSBTRE0gVGFibGUgMTEgKi8KK2VudW0gQ1NST2Zmc2V0cyB7CisJU0NCU3RhdHVzPTAsICAgICAgICAgICAgIFNDQkNtZD0yLCAgICAgICAgICAgICAgU0NCUG9pbnRlciA9IDQsCisJQ1NSUG9ydD04LCAgICAgICAgICAgICAgIENTUkZsYXNoPTEyLCAgICAgICAgICAgQ1NSRWVwcm9tID0gMTQsCisJQ1NSQ3RybE1EST0xNiwgICAgICAgICAgIENTUkVhcmx5Ung9MjAKK307CisKKy8qIFN5c3RlbSBDb250cm9sIEJsb2NrIENvbW1hbmQgV29yZCAtIFNETSBUYWJsZSAxMiAqLworZW51bSBTQ0JDbWRCaXRzIHsKKwkvKiBTQ0IgSW50ZXJydXB0IE1hc2tzIC0gU0RNIFRhYmxlIDE0ICovCisJU0NCTWFza0NtZERvbmU9MHg4MDAwLCAgIFNDQk1hc2tSeERvbmU9MHg0MDAwLCAgU0NCTWFza0NtZElkbGU9MHgyMDAwLAorCVNDQk1hc2tSeFN1c3BlbmQ9MHgxMDAwLCBTQ0JNYXNrRWFybHlSeD0weDA4MDAsIFNDQk1hc2tGbG93Q3RsPTB4MDQwMCwKKwlTQ0JUcmlnZ2VySW50cj0weDAyMDAsICAgU0NCTWFza0FsbD0weDAxMDAsCisJLyogU0NCIENvbnRyb2wgQ29tbWFuZHMgLSBTRE0gVGFibGUgMTQtMTYgKi8KKwlDVVN0YXJ0PTB4MDAxMCwgICAgICAgICAgQ1VSZXN1bWU9MHgwMDIwLCAgICAgICBDVVN0YXRzQWRkcj0weDAwNDAsCisJQ1VTaG93U3RhdHM9MHgwMDUwLCAgICAgIENVQ21kQmFzZT0weDAwNjAsICAgICAgQ1VEdW1wU3RhdHM9MHgwMDcwLAorCVJVU3RhcnQ9MHgwMDAxLCAgICAgICAgICBSVVJlc3VtZT0weDAwMDIsICAgICAgIFJVQWJvcnQ9MHgwMDA0LAorCVJVQWRkckxvYWQ9MHgwMDA2LCAgICAgICBSVVJlc3VtZU5vUmVzb3VyY2VzPTB4MDAwNworfTsKKworZW51bSBTQ0JQb3J0Q21kcyB7CisJUG9ydFJlc2V0PTAsIFBvcnRTZWxmVGVzdD0xLCBQb3J0UGFydGlhbFJlc2V0PTIsIFBvcnREdW1wPTMKK307CisKKy8qIEFjdGlvbiBDb21tYW5kcyAtIFNETSBUYWJsZSAxNCwzNyAqLworZW51bSBBY3Rpb25Db21tYW5kcyB7CisJQ21kTk9wID0gMCwgICAgICAgICAgICAgIENtZElBU2V0dXAgPSAxLCAgICAgICAgQ21kQ29uZmlndXJlID0gMiwKKwlDbWRNdWx0aWNhc3RMaXN0ID0gMywgICAgQ21kVHggPSA0LCAgICAgICAgICAgICBDbWRURFIgPSA1LAorCUNtZER1bXAgPSA2LCAgICAgICAgICAgICBDbWREaWFnbm9zZSA9IDcsCisJLyogQW5kIHNvbWUgZXh0cmEgZmxhZ3M6ICovCisJQ21kRW5kT2ZMaXN0ID0gMHg4MDAwLAorCUNtZFN1c3BlbmQgPSAweDQwMDAsICAgICBDbWRJbnRyID0gMHgyMDAwLCAgICAgIENtZFR4RmxleCA9IDB4MDAwOAorfTsKKworZW51bSBUQ0JCaXRzIHsKKwlUQ0JfQz0weDgwMDAsICAgICAgICAgICAgVENCX09LPTB4MjAwMCwgICAgICAgICBUQ0JfVT0weDEwMDAKK307CisKK2VudW0gUkZEQml0cyB7CisJLyogU3RhdHVzIFdvcmQgQml0cyAqLworCVJGRFJ4Q29sPTB4MDAwMSwgICAgICAgICBSRkRJQU1hdGNoPTB4MDAwMiwgICAgIFJGRE5vTWF0Y2g9MHgwMDA0LAorCVJGRFJlc2VydmVkMz0weDAwMDgsICAgICBSRkRSeEVycj0weDAwMTAsICAgICAgIFJGREV0aFR5cGU9MHgwMDIwLAorCVJGRFJlc2VydmVkNj0weDAwNDAsICAgICBSRkRTaG9ydD0weDAwODAsICAgICAgIFJGRERNQU92ZXJydW49MHgwMTAwLAorCVJGRE5vQnVmcz0weDAyMDAsICAgICAgICBSRkRDUkNBbGlnbj0weDA0MDAsICAgIFJGRENSQ0Vycm9yPTB4MDgwMCwKKwlSRkRSZXNlcnZlZDEyPTB4MTAwMCwgICAgUkZEX09LPTB4MjAwMCwgICAgICAgICBSRkRDb21wbGV0ZT0weDgwMDAsCisJLyogQ29tbWFuZCBXb3JkIEJpdHMgKi8KKwkvL1JGRF9TRj0weDAwMDgsICAgICAgICAgICBSRkRTdXNwZW5kPTB4NDAwMCwgICAgIFJGREVuZE9mTGlzdD0weDgwMDAsCisJLyogT3RoZXIgKi8KKwlSRkRNYXNrQ291bnQ9MHgzRkZGCit9OworCitlbnVtIHBoeV9jaGlwcyB7CisJTm9uU3VjaFBoeT0wLCAgICAgICAgICAgIEk4MjU1M0FCLCAgICAgICAgICAgICAgSTgyNTUzQywKKwlJODI1MDMsICAgICAgICAgICAgICAgICAgRFA4Mzg0MCwgICAgICAgICAgICAgICBTODBDMjQwLAorCVM4MEMyNCwgICAgICAgICAgICAgICAgICBQaHlVbmRlZmluZWQsICAgICAgICAgIERQODM4NDBBPTEwCit9OworCisvKiBTZXJpYWwgRUVQUk9NIHNlY3Rpb24uCisgICBBICJiaXQiIGdydW5neSwgYnV0IHdlIHdvcmsgb3VyIHdheSB0aHJvdWdoIGJpdC1ieS1iaXQgOi0+LiAqLworLyogIEVFUFJPTV9DdHJsIGJpdHMuICovCisjZGVmaW5lIEVFX1NISUZUX0NMSyAgICAweDAxICAgIC8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKyNkZWZpbmUgRUVfQ1MgICAgICAgICAgIDB4MDIgICAgLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFICAgMHgwNCAgICAvKiBFRVBST00gY2hpcCBkYXRhIGluLiAqLworI2RlZmluZSBFRV9EQVRBX1JFQUQgICAgMHgwOCAgICAvKiBFRVBST00gY2hpcCBkYXRhIG91dC4gKi8KKyNkZWZpbmUgRUVfRU5CICAgICAgICAgICggMHg0ODAwIHwgRUVfQ1MgKQorCisvKiBFbGVtZW50cyBvZiB0aGUgZHVtcF9zdGF0aXN0aWNzIGJsb2NrLiBUaGlzIGJsb2NrIG11c3QgYmUgbHdvcmQgYWxpZ25lZC4gKi8KK3N0cnVjdCBpZmVjX3N0YXRzIHsKKwl1MzIKKwl0eF9nb29kX2ZyYW1lcywgICAgICAgICAgdHhfY29sbDE2X2VycnMsICAgICAgICB0eF9sYXRlX2NvbGxzLAorCXR4X3VuZGVycnVucywgICAgICAgICAgICB0eF9sb3N0X2NhcnJpZXIsICAgICAgIHR4X2RlZmVycmVkLAorCXR4X29uZV9jb2xscywgICAgICAgICAgICB0eF9tdWx0aV9jb2xscywgICAgICAgIHR4X3RvdGFsX2NvbGxzLAorCXJ4X2dvb2RfZnJhbWVzLCAgICAgICAgICByeF9jcmNfZXJycywgICAgICAgICAgIHJ4X2FsaWduX2VycnMsCisJcnhfcmVzb3VyY2VfZXJycywgICAgICAgIHJ4X292ZXJydW5fZXJycywgICAgICAgcnhfY29sbHNfZXJycywKKwlyeF9ydW50X2VycnMsICAgICAgICAgICAgZG9uZV9tYXJrZXI7Cit9OworCitzdHJ1Y3QgaWZlY190Y2IgeyAgICAgICAgICAgICAgICAgIC8qIEEgVHJhbnNtaXQgQ29tbWFuZCBCbG9jayAmIFRCRC4gTXVzdCBiZSAqLworCXZvbGF0aWxlIHMxNiBzdGF0dXM7ICAgICAgIC8qICAgICAgICAgICAgIHdvcmQgKGV2ZW4gYWRkcmVzcykgYWxpZ25lZCAqLworCXUxNiAgICAgICAgICBjb21tYW5kOworCXUzMiAgICAgICAgICBsaW5rOyAgICAgICAgIC8qIFBIWVNJQ0FMIG5leHQgaWZlY190Y2IsIGRvZXNuJ3QgY2hhbmdlICovCisJdTMyICAgICAgICAgIHRiZGFfYWRkcjsgICAgLyogVEJEIEFycmF5LCBwb2ludHMgdG8gVEJEIGJlbG93ICovCisJczMyICAgICAgICAgIGNvdW50OyAgICAgICAgLyogIyBvZiBUQkQsIFR4IHN0YXJ0IHRocmVzaC4sIGV0Yy4gKi8KKwkvKiBUaGUgZm9sbG93aW5nIGNvbnN0aXR1dGVzIGEgVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgKFRCRCkuCisJICogVEJEcyBtdXN0IGJlIGFsaWduZWQgb24gYW4gZXZlbiBhZGRyZXNzICh3b3JkLWFsaWduZWQpLiAqLworCXUzMiAgICAgICAgICB0YmRfYWRkcjA7ICAgIC8qIFBIWVNJQ0FMIHB0ciB0byBUeCBkYXRhICovCisJczMyICAgICAgICAgIHRiZF9zaXplMDsgICAgLyogTGVuZ3RoIG9mIFR4IGRhdGEgKi8KKwkvKiBEcml2ZXItc3BlY2lmaWMgZGF0YTsgbm90IHBhcnQgb2YgVENCIGZvcm1hdC4gKi8KKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2I7ICAgICAvKiBFeGlzdHMgZnJvbSB0eCgpIHRvIGNvbXBsZXRpb24gcG9sbCgpICovCisJc3RydWN0IGlmZWNfdGNiICAqbmV4dDsgICAgLyogVklSVFVBTCBuZXh0IGlmZWNfdGNiLCBkb2Vzbid0IGNoYW5nZSAqLworfTsKKworc3RydWN0IGlmZWNfcmZkIHsgICAgICAgICAgICAgIC8qIEEgUmVjZWl2ZSBGcmFtZSBEZXNjcmlwdG9yLiBNdXN0IGJlIGFsaWduZWQgKi8KKwl2b2xhdGlsZSBzMTYgc3RhdHVzOyAgIC8qICAgICAgICAgICBvbiBhIHBoeXNpY2FsIHdvcmQgKGV2ZW4gYWRkcmVzcykgKi8KKwlzMTYgICAgICAgICAgY29tbWFuZDsKKwl1MzIgICAgICAgICAgbGluazsgICAgICAgICAgLyogUEhZU0lDQUwgbmV4dCBpZmVjX3JmZCwgZG9lc24ndCBjaGFuZ2UgKi8KKwl1MzIgICAgICAgICAgcnhfYnVmX2FkZHI7ICAgLyogVW51c2VkLiBGbGV4IHJ4IG1vZGUgaXMgbm90IGRvY3VtZW50ZWQgKi8KKwl1MTYgICAgICAgICAgY291bnQ7ICAgICAgICAgLyogICAgICAgICAgICAgICAgICBhbmQgbWF5IGJlIGltcG9zc2libGUgKi8KKwl1MTYgICAgICAgICAgc2l6ZTsKKwljaGFyICAgICAgICAgcGFja2V0W1JGRF9QQUNLRVRfTEVOXTsKK307CisKK3N0cnVjdCBpZmVjX2lhcyB7ICAgICAgICAgICAgICAvKiBJbmRpdmlkdWFsIEFkZHJlc3MgU2V0dXAgY29tbWFuZCBibG9jay4gKi8KKwl2b2xhdGlsZSBzMTYgc3RhdHVzOyAgIC8qIE11c3QgYmUgd29yZCAoZXZlbiBhZGRyZXNzKSBhbGlnbmVkLiAqLworCXUxNiAgICAgICAgICBjb21tYW5kOworCXUzMiAgICAgICAgICBsaW5rOyAgICAgLyogUEhZU0lDQUwgbmV4dCBjb21tYW5kIGJsb2NrIHRvIHByb2Nlc3MgKi8KKwl1OCAgICAgICAgICAgaWFbNl07Cit9OworCitzdHJ1Y3QgaWZlY19jZmcgeyAgICAgICAgICAgICAgICAgICAvKiBUaGUgY29uZmlndXJlIGNvbW1hbmQgZm9ybWF0LiAqLworCXZvbGF0aWxlIHMxNiBzdGF0dXM7CisJdTE2ICAgICAgICAgIGNvbW1hbmQ7CisJdTMyICAgICAgICAgIGxpbms7ICAgICAgICAgIC8qIFBIWVNJQ0FMIG5leHQgY29tbWFuZCBibG9jayB0byBwcm9jZXNzICovCisJdTggICAgICAgICAgIGJ5dGVbMjJdOyAgICAgIC8qIDIyIGNvbmZpZ3VyYXRpb24gYnl0ZXMgKi8KK307CisKK3N0cnVjdCBpZmVjX3ByaXZhdGUgeworCXVuc2lnbmVkIGxvbmcgICAgICAgICBpb2FkZHI7CisJc3RydWN0IGlmZWNfc3RhdHMgICAgIHN0YXRzOworCXVuc2lnbmVkIHNob3J0ICAgICAgICBtZGlvX3JlZ2lzdGVyOworCisJc3RydWN0IGlmZWNfdGNiICAgICAgKnRjYnM7CisJc3RydWN0IGlmZWNfcmZkICAgICAgKnJmZHNbUkZEX0NPVU5UXTsKKwlzdHJ1Y3QgaWZlY190Y2IgICAgICAqdGNiX2hlYWQsICp0Y2JfdGFpbDsKKwlzdHJ1Y3QgaW9fYnVmZmVyICAgICAqdHhfaW9ic1tUQ0JfQ09VTlRdOworCXN0cnVjdCBpb19idWZmZXIgICAgICpyeF9pb2JzW1JGRF9DT1VOVF07CisJaW50CQkgICAgICBjdXJfcng7CisJaW50CQkgICAgICB0eF9jdXJyOworCWludAkJICAgICAgdHhfdGFpbDsKKwlpbnQJCSAgICAgIHR4X2NudDsKKwkvKgorCSAqIFRoZSBjb25maWd1cmVkIGZsYWcgaW5kaWNhdGVzIGlmIGEgQ29uZmlnIGNvbW1hbmQgd2FzIGxhc3QgaXNzdWVkLgorCSAqIFRoZSBmb2xsb3dpbmcgYXR0ZW1wdCB0byBpc3N1ZSBhIGNvbW1hbmQgKGluIGlmZWNfdHhfd2FrZSkgd2lsbAorCSAqIHVzZSBhIFNUQVJUIHJhdGhlciB0aGFuIFJFU1VNRSBTQ0IgY29tbWFuZC4gSXQgc2VlbXMgdGhlIGNhcmQgd29uJ3QKKwkgKiBSRVNVTUUgYWZ0ZXIgYSBjb25maWd1cmUgY29tbWFuZC4KKwkgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZDsKKwlzdHJ1Y3Qgc3BpX2JpdF9iYXNoZXIgc3BpOworCXN0cnVjdCBzcGlfZGV2aWNlICAgICBlZXByb207CisJCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFBDSSBkZXZpY2UgQVBJIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgIGlmZWNfcGNpX3Byb2JlICAoIHN0cnVjdCBwY2lfZGV2aWNlKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQqKTsKK3N0YXRpYyB2b2lkIGlmZWNfcGNpX3JlbW92ZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgKTsKKworLyogTmV0d29yayBkZXZpY2UgQVBJIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIGlmZWNfbmV0X2Nsb3NlICAgICggc3RydWN0IG5ldF9kZXZpY2UqICk7CitzdGF0aWMgdm9pZCBpZmVjX25ldF9pcnEgICAgICAoIHN0cnVjdCBuZXRfZGV2aWNlKiwgaW50IGVuYWJsZSApOworc3RhdGljIGludCAgaWZlY19uZXRfb3BlbiAgICAgKCBzdHJ1Y3QgbmV0X2RldmljZSogKTsKK3N0YXRpYyB2b2lkIGlmZWNfbmV0X3BvbGwgICAgICggc3RydWN0IG5ldF9kZXZpY2UqICk7CitzdGF0aWMgaW50ICBpZmVjX25ldF90cmFuc21pdCAoIHN0cnVjdCBuZXRfZGV2aWNlKiwgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKTsKKworLyogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgaWZlY19pbml0X2VlcHJvbSAgICAgKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgaW50ICBpZmVjX2xpbmtfY2hlY2sgICAgICAoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkIGlmZWNfbGlua191cGRhdGUgICAgICggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgaWZlY19tZGlvX3JlYWQgICAgICAgKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgcGh5LCBpbnQgbG9jYXRpb24gKTsKK3N0YXRpYyB2b2lkIGlmZWNfbWRpb19zZXR1cCAgICAgICggc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50IG9wdGlvbnMgKTsKK3N0YXRpYyBpbnQgIGlmZWNfbWRpb193cml0ZSAgICAgICggc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50IHBoeSwgaW50IGxvYywgaW50IHZhbCk7CitzdGF0aWMgdm9pZCBpZmVjX3Jlc2V0ICAgICAgICAgICAoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkIGlmZWNfZnJlZSAgICAgICAgICAgICggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQgaWZlY19yZmRfaW5pdCAgICAgICAgKCBzdHJ1Y3QgaWZlY19yZmQgKnJmZCwgczE2IGNvbW1hbmQsIHUzMiBsaW5rICk7CitzdGF0aWMgdm9pZCAgaWZlY19yeF9wcm9jZXNzICAgICAoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkIGlmZWNfcmVwcmltZV9ydSAgICAgICggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQgaWZlY19jaGVja19ydV9zdGF0dXMgKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCApOworc3RhdGljIGludCAgaWZlY19nZXRfcnhfZGVzYyAgICAgKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgLGludCAsaW50ICk7CitzdGF0aWMgdm9pZCBpZmVjX3JlZmlsbF9yeF9yaW5nICAoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQgIGlmZWNfcnhfc2V0dXAgICAgICAgICggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgaWZlY19zY2JfY21kICAgICAgICAgKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIgcHRyLCB1OCBjbWQgKTsKK3N0YXRpYyBpbnQgIGlmZWNfc2NiX2NtZF93YWl0ICAgICggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQgaWZlY190eF9wcm9jZXNzICAgICAgKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgaW50ICBpZmVjX3R4X3NldHVwICAgICAgICAoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkIGlmZWNfdHhfd2FrZSAgICAgICAgICggc3RydWN0IG5ldF9kZXZpY2UgKiApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2VwaWMxMDAuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWE4NWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZXBpYzEwMC5jCkBAIC0wLDAgKzEsNTM5IEBACisKKy8qIGVwaWMxMDAuYzogQSBTTUMgODNjMTcwIEVQSUMvMTAwIGZhc3QgZXRoZXJuZXQgZHJpdmVyIGZvciBFdGhlcmJvb3QgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiAwNS8wNi8yMDAzCXRpbWxlZ2dlCUZpeGVkIHJlbG9jYXRpb24gYW5kIGltcGxlbWVudGVkIE11bHRpY2FzdCAqLworI2RlZmluZSBMSU5VWF9PVVRfTUFDUk9TCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICJjb25zb2xlLmgiCisjaW5jbHVkZSAiZXBpYzEwMC5oIgorCisvKiBDb25kZW5zZWQgb3BlcmF0aW9ucyBmb3IgcmVhZGFiaWxpdHkgKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKQljcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhhZGRyKSkKKyNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKQlidXNfdG9fdmlydChsZTMyX3RvX2NwdShhZGRyKSkKKworI2RlZmluZSBUWF9SSU5HX1NJWkUJMgkvKiB1c2UgYXQgbGVhc3QgMiBidWZmZXJzIGZvciBUWCAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJMgorCisjZGVmaW5lIFBLVF9CVUZfU1oJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFR4L1J4IGJ1ZmZlci4qLworCisvKgorI2RlZmluZSBERUJVR19SWAorI2RlZmluZSBERUJVR19UWAorI2RlZmluZSBERUJVR19FRVBST00KKyovCisKKyNkZWZpbmUgRVBJQ19ERUJVRyAwCS8qIGRlYnVnIGxldmVsICovCisKKy8qIFRoZSBFUElDMTAwIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgZXBpY19yeF9kZXNjIHsKKyAgICB1bnNpZ25lZCBsb25nIHN0YXR1czsKKyAgICB1bnNpZ25lZCBsb25nIGJ1ZmFkZHI7CisgICAgdW5zaWduZWQgbG9uZyBidWZsZW5ndGg7CisgICAgdW5zaWduZWQgbG9uZyBuZXh0OworfTsKKy8qIGRlc2NyaXB0aW9uIG9mIHRoZSB0eCBkZXNjcmlwdG9ycyBjb250cm9sIGJpdHMgY29tbW9ubHkgdXNlZCAqLworI2RlZmluZSBURF9TVERGTEFHUwlURF9MQVNUREVTQworCitzdHJ1Y3QgZXBpY190eF9kZXNjIHsKKyAgICB1bnNpZ25lZCBsb25nIHN0YXR1czsKKyAgICB1bnNpZ25lZCBsb25nIGJ1ZmFkZHI7CisgICAgdW5zaWduZWQgbG9uZyBidWZsZW5ndGg7CisgICAgdW5zaWduZWQgbG9uZyAgbmV4dDsKK307CisKKyNkZWZpbmUgZGVsYXkobmFub3NlYykgICBkbyB7IGludCBfaSA9IDM7IHdoaWxlICgtLV9pID4gMCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgX19TTE9XX0RPV05fSU87IH19IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZAllcGljMTAwX29wZW4odm9pZCk7CitzdGF0aWMgdm9pZAllcGljMTAwX2luaXRfcmluZyh2b2lkKTsKK3N0YXRpYyB2b2lkCWVwaWMxMDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludAllcGljMTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpOworc3RhdGljIHZvaWQJZXBpYzEwMF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmRlc3RhZGRyLAorCQkJCSB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqZGF0YSk7CisjaWZkZWYJREVCVUdfRUVQUk9NCitzdGF0aWMgaW50CXJlYWRfZWVwcm9tKGludCBsb2NhdGlvbik7CisjZW5kaWYKK3N0YXRpYyBpbnQJbWlpX3JlYWQoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkICAgICBlcGljMTAwX2lycShzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24pOworCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIGVwaWMxMDBfb3BlcmF0aW9uczsKKworc3RhdGljIGludAlpb2FkZHI7CisKK3N0YXRpYyBpbnQJY29tbWFuZDsKK3N0YXRpYyBpbnQJaW50c3RhdDsKK3N0YXRpYyBpbnQJaW50bWFzazsKK3N0YXRpYyBpbnQJZ2VuY3RsIDsKK3N0YXRpYyBpbnQJZWVjdGwgIDsKK3N0YXRpYyBpbnQJdGVzdCAgIDsKK3N0YXRpYyBpbnQJbW1jdGwgIDsKK3N0YXRpYyBpbnQJbW1kYXRhIDsKK3N0YXRpYyBpbnQJbGFuMCAgIDsKK3N0YXRpYyBpbnQJbWMwICAgIDsKK3N0YXRpYyBpbnQJcnhjb24gIDsKK3N0YXRpYyBpbnQJdHhjb24gIDsKK3N0YXRpYyBpbnQJcHJjZGFyIDsKK3N0YXRpYyBpbnQJcHRjZGFyIDsKK3N0YXRpYyBpbnQJZXRodGhyIDsKKworc3RhdGljIHVuc2lnbmVkIGludAljdXJfcngsIGN1cl90eDsJCS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworI2lmZGVmCURFQlVHX0VFUFJPTQorc3RhdGljIHVuc2lnbmVkIHNob3J0CWVlcHJvbVs2NF07CisjZW5kaWYKK3N0YXRpYyBzaWduZWQgY2hhcglwaHlzWzRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCitzdHJ1Y3QgeworCXN0cnVjdCBlcGljX3J4X2Rlc2MJcnhfcmluZ1tSWF9SSU5HX1NJWkVdCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKKwlzdHJ1Y3QgZXBpY190eF9kZXNjCXR4X3JpbmdbVFhfUklOR19TSVpFXQorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CisJdW5zaWduZWQgY2hhcgkgCXJ4X3BhY2tldFtQS1RfQlVGX1NaICogUlhfUklOR19TSVpFXTsKKwl1bnNpZ25lZCBjaGFyCQl0eF9wYWNrZXRbUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRV07Cit9IGVwaWMxMDBfYnVmcyBfX3NoYXJlZDsKKyNkZWZpbmUgcnhfcmluZyBlcGljMTAwX2J1ZnMucnhfcmluZworI2RlZmluZSB0eF9yaW5nIGVwaWMxMDBfYnVmcy50eF9yaW5nCisjZGVmaW5lIHJ4X3BhY2tldCBlcGljMTAwX2J1ZnMucnhfcGFja2V0CisjZGVmaW5lIHR4X3BhY2tldCBlcGljMTAwX2J1ZnMudHhfcGFja2V0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50CitlcGljMTAwX3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCisgICAgaW50IGk7CisgICAgdW5zaWduZWQgc2hvcnQqIGFwOworICAgIHVuc2lnbmVkIGludCBwaHksIHBoeV9pZHg7CisKKyAgICBpZiAocGNpLT5pb2FkZHIgPT0gMCkKKwlyZXR1cm4gMDsKKworICAgIC8qIElkZWFsbHkgd2Ugd291bGQgZGV0ZWN0IGFsbCBuZXR3b3JrIGNhcmRzIGluIHNsb3Qgb3JkZXIuICBUaGF0IHdvdWxkCisgICAgICAgYmUgYmVzdCBkb25lIGEgY2VudHJhbCBQQ0kgcHJvYmUgZGlzcGF0Y2gsIHdoaWNoIHdvdWxkbid0IHdvcmsKKyAgICAgICB3ZWxsIHdpdGggdGhlIGN1cnJlbnQgc3RydWN0dXJlLiAgU28gaW5zdGVhZCB3ZSBkZXRlY3QganVzdCB0aGUKKyAgICAgICBFcGljIGNhcmRzIGluIHNsb3Qgb3JkZXIuICovCisKKyAgICBpb2FkZHIgPSBwY2ktPmlvYWRkcjsKKworICAgIG5pYy0+aXJxbm8gID0gMDsKKyAgICBuaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CisKKyAgICAvKiBjb21wdXRlIGFsbCB1c2VkIHN0YXRpYyBlcGljMTAwIHJlZ2lzdGVycyBhZGRyZXNzICovCisgICAgY29tbWFuZCA9IGlvYWRkciArIENPTU1BTkQ7CQkvKiBDb250cm9sIFJlZ2lzdGVyICovCisgICAgaW50c3RhdCA9IGlvYWRkciArIElOVFNUQVQ7CQkvKiBJbnRlcnJ1cHQgU3RhdHVzICovCisgICAgaW50bWFzayA9IGlvYWRkciArIElOVE1BU0s7CQkvKiBJbnRlcnJ1cHQgTWFzayAqLworICAgIGdlbmN0bCAgPSBpb2FkZHIgKyBHRU5DVEw7CQkvKiBHZW5lcmFsIENvbnRyb2wgKi8KKyAgICBlZWN0bCAgID0gaW9hZGRyICsgRUVDVEw7CQkvKiBFRVBST00gQ29udHJvbCAgKi8KKyAgICB0ZXN0ICAgID0gaW9hZGRyICsgVEVTVDsJCS8qIFRlc3QgcmVnaXN0ZXIgKGNsb2NrcykgKi8KKyAgICBtbWN0bCAgID0gaW9hZGRyICsgTU1DVEw7CQkvKiBNSUkgTWFuYWdlbWVudCBJbnRlcmZhY2UgQ29udHJvbCAqLworICAgIG1tZGF0YSAgPSBpb2FkZHIgKyBNTURBVEE7CQkvKiBNSUkgTWFuYWdlbWVudCBJbnRlcmZhY2UgRGF0YSAqLworICAgIGxhbjAgICAgPSBpb2FkZHIgKyBMQU4wOwkJLyogTUFDIGFkZHJlc3MuICgweDQwLTB4NDgpICovCisgICAgbWMwICAgICA9IGlvYWRkciArIE1DMDsgCQkvKiBNdWx0aWNhc3QgQ29udHJvbCAqLworICAgIHJ4Y29uICAgPSBpb2FkZHIgKyBSWENPTjsJCS8qIFJlY2VpdmUgQ29udHJvbCAqLworICAgIHR4Y29uICAgPSBpb2FkZHIgKyBUWENPTjsJCS8qIFRyYW5zbWl0IENvbnRyb2wgKi8KKyAgICBwcmNkYXIgID0gaW9hZGRyICsgUFJDREFSOwkJLyogUENJIFJlY2VpdmUgQ3VycmVudCBEZXNjciBBZGRyZXNzICovCisgICAgcHRjZGFyICA9IGlvYWRkciArIFBUQ0RBUjsJCS8qIFBDSSBUcmFuc21pdCBDdXJyZW50IERlc2NyIEFkZHJlc3MgKi8KKyAgICBldGh0aHIgID0gaW9hZGRyICsgRVRIVEhSOwkJLyogRWFybHkgVHJhbnNtaXQgVGhyZXNob2xkICovCisKKyAgICAvKiBSZXNldCB0aGUgY2hpcCAmIGJyaW5nIGl0IG91dCBvZiBsb3ctcG93ZXIgbW9kZS4gKi8KKyAgICBvdXRsKEdDX1NPRlRfUkVTRVQsIGdlbmN0bCk7CisKKyAgICAvKiBEaXNhYmxlIEFMTCBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworICAgIG91dGwoSU5UUl9ESVNBQkxFLCBpbnRtYXNrKTsKKworICAgIC8qCisgICAgICogc2V0IHRoZSBpbnRlcm5hbCBjbG9ja3M6CisgICAgICogQXBwbGljYXRpb24gTm90ZSA3LjE1IHNheXM6CisgICAgICogICAgSW4gb3JkZXIgdG8gc2V0IHRoZSBDTE9DSyBURVNUIGJpdCBpbiB0aGUgVEVTVCByZWdpc3RlciwKKyAgICAgKgkgIHBlcmZvcm0gdGhlIGZvbGxvd2luZzoKKyAgICAgKgorICAgICAqICAgICAgICBXcml0ZSAweDAwMDggdG8gdGhlIHRlc3QgcmVnaXN0ZXIgYXQgbGVhc3Qgc2l4dGVlbgorICAgICAqICAgICAgICBjb25zZWN1dGl2ZSB0aW1lcy4KKyAgICAgKgorICAgICAqIFRoZSBDTE9DSyBURVNUIGJpdCBpcyBXcml0ZS1Pbmx5LiBXcml0aW5nIGl0IHNldmVyYWwgdGltZXMKKyAgICAgKiBjb25zZWN1dGl2ZWx5IGluc3VyZXMgYSBzdWNjZXNzZnVsIHdyaXRlIHRvIHRoZSBiaXQuLi4KKyAgICAgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJb3V0bCgweDAwMDAwMDA4LCB0ZXN0KTsKKyAgICB9CisKKyNpZmRlZglERUJVR19FRVBST00KK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJdmFsdWUgPSByZWFkX2VlcHJvbShpKTsKKwllZXByb21baV0gPSB2YWx1ZTsKKwlzdW0gKz0gdmFsdWU7CisgICAgfQorfQorCisjaWYJKEVQSUNfREVCVUcgPiAxKQorICAgIHByaW50ZigiRUVQUk9NIGNvbnRlbnRzXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCXByaW50ZigiICVoaFglcyIsIGVlcHJvbVtpXSwgaSAlIDE2ID09IDE1ID8gIlxuIiA6ICIiKTsKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisgICAgLyogVGhpcyBjb3VsZCBhbHNvIGJlIHJlYWQgZnJvbSB0aGUgRUVQUk9NLiAqLworICAgIGFwID0gKHVuc2lnbmVkIHNob3J0KiluaWMtPm5vZGVfYWRkcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCSphcCsrID0gaW53KGxhbjAgKyBpKjQpOworCisgICAgREJHICggIiBJL08gJTQuNHggJXMgIiwgaW9hZGRyLCBldGhfbnRvYSAoIG5pYy0+bm9kZV9hZGRyICkgKTsKKworICAgIC8qIEZpbmQgdGhlIGNvbm5lY3RlZCBNSUkgeGN2cnMuICovCisgICAgZm9yIChwaHkgPSAwLCBwaHlfaWR4ID0gMDsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IHNpemVvZihwaHlzKTsgcGh5KyspIHsKKwlpbnQgbWlpX3N0YXR1cyA9IG1paV9yZWFkKHBoeSwgMCk7CisKKwlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgICYmIG1paV9zdGF0dXMgIT0gMHgwMDAwKSB7CisJICAgIHBoeXNbcGh5X2lkeCsrXSA9IHBoeTsKKyNpZgkoRVBJQ19ERUJVRyA+IDEpCisJICAgIHByaW50ZigiTUlJIHRyYW5zY2VpdmVyIGZvdW5kIGF0IGFkZHJlc3MgJWQuXG4iLCBwaHkpOworI2VuZGlmCisJfQorICAgIH0KKyAgICBpZiAocGh5X2lkeCA9PSAwKSB7CisjaWYJKEVQSUNfREVCVUcgPiAxKQorCXByaW50ZigiKioqV0FSTklORyoqKjogTm8gTUlJIHRyYW5zY2VpdmVyIGZvdW5kIVxuIik7CisjZW5kaWYKKwkvKiBVc2UgdGhlIGtub3duIFBIWSBhZGRyZXNzIG9mIHRoZSBFUElJLiAqLworCXBoeXNbMF0gPSAzOworICAgIH0KKworICAgIGVwaWMxMDBfb3BlbigpOworICAgIG5pYy0+bmljX29wCT0gJmVwaWMxMDBfb3BlcmF0aW9uczsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgbWNfZmlsdGVyWzhdOworCWludCBpOworCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwlvdXRsKDB4MEMsIHJ4Y29uKTsKKwlmb3IoaSA9IDA7IGkgPCA0OyBpKyspCisJCW91dHcoKCh1bnNpZ25lZCBzaG9ydCAqKW1jX2ZpbHRlcilbaV0sIG1jMCArIGkqNCk7CisJcmV0dXJuOworfQorCQorICAgc3RhdGljIHZvaWQKK2VwaWMxMDBfb3Blbih2b2lkKQoreworICAgIGludCBtaWlfcmVnNTsKKyAgICBpbnQgZnVsbF9kdXBsZXggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgdG1wOworCisgICAgZXBpYzEwMF9pbml0X3JpbmcoKTsKKworICAgIC8qIFB1bGwgdGhlIGNoaXAgb3V0IG9mIGxvdy1wb3dlciBtb2RlLCBhbmQgc2V0IGZvciBQQ0kgcmVhZCBtdWx0aXBsZS4gKi8KKyAgICBvdXRsKEdDX1JYX0ZJRk9fVEhSXzY0IHwgR0NfTVJDX1JFQURfTVVMVCB8IEdDX09ORV9DT1BZLCBnZW5jdGwpOworCisgICAgb3V0bChUWF9GSUZPX1RIUkVTSCwgZXRodGhyKTsKKworICAgIHRtcCA9IFRDX0VBUkxZX1RYX0VOQUJMRSB8IFRYX1NMT1RfVElNRTsKKworICAgIG1paV9yZWc1ID0gbWlpX3JlYWQocGh5c1swXSwgNSk7CisgICAgaWYgKG1paV9yZWc1ICE9IDB4ZmZmZiAmJiAobWlpX3JlZzUgJiAweDAxMDApKSB7CisJZnVsbF9kdXBsZXggPSAxOworCXByaW50ZigiIGZ1bGwtZHVwbGV4IG1vZGUiKTsKKwl0bXAgfD0gVENfTE1fRlVMTF9EUFg7CisgICAgfSBlbHNlCisJdG1wIHw9IFRDX0xNX05PUk1BTDsKKworICAgIG91dGwodG1wLCB0eGNvbik7CisKKyAgICAvKiBHaXZlIGFkcmVzcyBvZiBSWCBhbmQgVFggcmluZyB0byB0aGUgY2hpcCAqLworICAgIG91dGwodmlydF90b19sZTMyZGVzYygmcnhfcmluZyksIHByY2Rhcik7CisgICAgb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKCZ0eF9yaW5nKSwgcHRjZGFyKTsKKworICAgIC8qIFN0YXJ0IHRoZSBjaGlwJ3MgUnggcHJvY2VzczogcmVjZWl2ZSB1bmljYXN0IGFuZCBicm9hZGNhc3QgKi8KKyAgICBzZXRfcnhfbW9kZSgpOworICAgIG91dGwoQ1JfU1RBUlRfUlggfCBDUl9RVUVVRV9SWCwgY29tbWFuZCk7CisKKyAgICBwdXRjaGFyKCdcbicpOworfQorCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MuICovCisgICAgc3RhdGljIHZvaWQKK2VwaWMxMDBfaW5pdF9yaW5nKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBjdXJfcnggPSBjdXJfdHggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJcnhfcmluZ1tpXS5zdGF0dXMgICAgPSBjcHVfdG9fbGUzMihSUklOR19PV04pOwkvKiBPd25lZCBieSBFcGljIGNoaXAgKi8KKwlyeF9yaW5nW2ldLmJ1Zmxlbmd0aCA9IGNwdV90b19sZTMyKFBLVF9CVUZfU1opOworCXJ4X3JpbmdbaV0uYnVmYWRkciAgID0gdmlydF90b19idXMoJnJ4X3BhY2tldFtpICogUEtUX0JVRl9TWl0pOworCXJ4X3JpbmdbaV0ubmV4dCAgICAgID0gdmlydF90b19sZTMyZGVzYygmcnhfcmluZ1tpICsgMV0pIDsKKyAgICB9CisgICAgLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKyAgICByeF9yaW5nW2ktMV0ubmV4dCA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbMF0pOworCisgICAgLyoKKyAgICAgKlRoZSBUeCBidWZmZXIgZGVzY3JpcHRvciBpcyBmaWxsZWQgaW4gYXMgbmVlZGVkLAorICAgICAqIGJ1dCB3ZSBkbyBuZWVkIHRvIGNsZWFyIHRoZSBvd25lcnNoaXAgYml0LgorICAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJdHhfcmluZ1tpXS5zdGF0dXMgID0gMHgwMDAwOwkJCS8qIE93bmVkIGJ5IENQVSAqLworICAgIAl0eF9yaW5nW2ldLmJ1Zmxlbmd0aCA9IDB4MDAwMCB8IGNwdV90b19sZTMyKFREX1NUREZMQUdTIDw8IDE2KTsKKwl0eF9yaW5nW2ldLmJ1ZmFkZHIgPSB2aXJ0X3RvX2J1cygmdHhfcGFja2V0W2kgKiBQS1RfQlVGX1NaXSk7CisJdHhfcmluZ1tpXS5uZXh0ICAgID0gdmlydF90b19sZTMyZGVzYygmdHhfcmluZ1tpICsgMV0pOworICAgIH0KKwl0eF9yaW5nW2ktMV0ubmV4dCAgICA9IHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMF0pOworfQorCisvKiBmdW5jdGlvbjogZXBpYzEwMF90cmFuc21pdAorICogVGhpcyB0cmFuc21pdHMgYSBwYWNrZXQuCisgKgorICogQXJndW1lbnRzOiBjaGFyIGRbNl06ICAgICAgICAgIGRlc3RpbmF0aW9uIGV0aGVybmV0IGFkZHJlc3MuCisgKiAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHQ6ICAgZXRoZXJuZXQgcHJvdG9jb2wgdHlwZS4KKyAqICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgczogICBzaXplIG9mIHRoZSBkYXRhLXBhcnQgb2YgdGhlIHBhY2tldC4KKyAqICAgICAgICAgICAgY2hhciAqcDogICAgICAgICAgICB0aGUgZGF0YSBmb3IgdGhlIHBhY2tldC4KKyAqIHJldHVybnM6ICAgdm9pZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitlcGljMTAwX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZGVzdGFkZHIsIHVuc2lnbmVkIGludCB0eXBlLAorCQkgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqZGF0YSkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBuc3R5cGU7CisgICAgdW5zaWduZWQgY2hhciAqdHhwOworICAgIGludCBlbnRyeTsKKyAgICB1bnNpZ25lZCBsb25nIGN0OworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisgICAgZW50cnkgPSBjdXJfdHggJSBUWF9SSU5HX1NJWkU7CisKKyAgICBpZiAoKHR4X3JpbmdbZW50cnldLnN0YXR1cyAmIFRSSU5HX09XTikgPT0gVFJJTkdfT1dOKSB7CisJcHJpbnRmKCJldGhfdHJhbnNtaXQ6IFVuYWJsZSB0byB0cmFuc21pdC4gc3RhdHVzPSU0LjRseC4gUmVzZXR0aW5nLi4uXG4iLAorCSAgICAgICB0eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisJZXBpYzEwMF9vcGVuKCk7CisJcmV0dXJuOworICAgIH0KKworICAgIHR4cCA9IHR4X3BhY2tldCArIChlbnRyeSAqIFBLVF9CVUZfU1opOworCisgICAgbWVtY3B5KHR4cCwgZGVzdGFkZHIsIEVUSF9BTEVOKTsKKyAgICBtZW1jcHkodHhwICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CisgICAgbnN0eXBlID0gaHRvbnModHlwZSk7CisgICAgbWVtY3B5KHR4cCArIDEyLCAoY2hhciopJm5zdHlwZSwgMik7CisgICAgbWVtY3B5KHR4cCArIEVUSF9ITEVOLCBkYXRhLCBsZW4pOworCisgICAgbGVuICs9IEVUSF9ITEVOOworCWxlbiAmPSAweDBGRkY7CisJd2hpbGUobGVuIDwgRVRIX1pMRU4pCisJCXR4cFtsZW4rK10gPSAnXDAnOworICAgIC8qCisgICAgICogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLAorICAgICAqIHNldCB0aGUgYmFzZSBhZGRyZXNzIHdpdGggdGhlICJvd25lcnNoaXAiCisgICAgICogYml0cyBsYXN0LgorICAgICAqLworICAgCisgICAgdHhfcmluZ1tlbnRyeV0uYnVmbGVuZ3RoIHw9IGNwdV90b19sZTMyKGxlbik7CisgICAgdHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIobGVuIDw8IDE2KSB8CisJICAgIGNwdV90b19sZTMyKFRSSU5HX09XTik7CS8qIFBhc3Mgb3duZXJzaGlwIHRvIHRoZSBjaGlwLiAqLworCisgICAgY3VyX3R4Kys7CisKKyAgICAvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisgICAgb3V0bChDUl9RVUVVRV9UWCwgY29tbWFuZCk7CisKKyAgICBjdCA9IGN1cnJ0aWNrcygpOworICAgIC8qIHRpbWVvdXQgMTAgbXMgZm9yIHRyYW5zbWl0ICovCisgICAgd2hpbGUgKChsZTMyX3RvX2NwdSh0eF9yaW5nW2VudHJ5XS5zdGF0dXMpICYgKFRSSU5HX09XTikpICYmCisJCWN0ICsgMTAqMTAwMCA8IGN1cnJ0aWNrcygpKQorCS8qIFdhaXQgKi87CisKKyAgICBpZiAoKGxlMzJfdG9fY3B1KHR4X3JpbmdbZW50cnldLnN0YXR1cykgJiBUUklOR19PV04pICE9IDApCisJcHJpbnRmKCJPb3BzLCB0cmFuc21pdHRlciB0aW1lb3V0LCBzdGF0dXM9JTQuNGxYXG4iLAorCSAgICB0eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworfQorCisvKiBmdW5jdGlvbjogZXBpYzEwMF9wb2xsIC8gZXRoX3BvbGwKKyAqIFRoaXMgcmVjZWl2ZXMgYSBwYWNrZXQgZnJvbSB0aGUgbmV0d29yay4KKyAqCisgKiBBcmd1bWVudHM6IG5vbmUKKyAqCisgKiByZXR1cm5zOiAgIDEgaWYgYSBwYWNrZXQgd2FzIHJlY2VpdmVkLgorICogICAgICAgICAgICAwIGlmIG5vIHBhY2V0IHdhcyByZWNlaXZlZC4KKyAqIHNpZGUgZWZmZWN0czoKKyAqICAgICAgICAgICAgcmV0dXJucyB0aGUgcGFja2V0IGluIHRoZSBhcnJheSBuaWMtPnBhY2tldC4KKyAqICAgICAgICAgICAgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgaW4gbmljLT5wYWNrZXRsZW4uCisgKi8KKworICAgIHN0YXRpYyBpbnQKK2VwaWMxMDBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKyAgICBpbnQgZW50cnk7CisgICAgaW50IHJldGNvZGU7CisgICAgaW50IHN0YXR1czsKKyAgICBlbnRyeSA9IGN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKworICAgIGlmICgocnhfcmluZ1tlbnRyeV0uc3RhdHVzICYgY3B1X3RvX2xlMzIoUlJJTkdfT1dOKSkgPT0gUlJJTkdfT1dOKQorCXJldHVybiAoMCk7CisKKyAgICBpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKworICAgIHN0YXR1cyA9IGxlMzJfdG9fY3B1KHJ4X3JpbmdbZW50cnldLnN0YXR1cyk7CisgICAgLyogV2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKworI2lmCShFUElDX0RFQlVHID4gNCkKKyAgICBwcmludGYoImVwaWNfcG9sbDogZW50cnkgJWQgc3RhdHVzICVoWFxuIiwgZW50cnksIHN0YXR1cyk7CisjZW5kaWYKKworICAgIGN1cl9yeCsrOworICAgIGlmIChzdGF0dXMgJiAweDIwMDApIHsKKwlwcmludGYoImVwaWNfcG9sbDogR2lhbnQgcGFja2V0XG4iKTsKKwlyZXRjb2RlID0gMDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAmIDB4MDAwNikgeworCS8qIFJ4IEZyYW1lIGVycm9ycyBhcmUgY291bnRlZCBpbiBoYXJkd2FyZS4gKi8KKwlwcmludGYoImVwaWNfcG9sbDogRnJhbWUgcmVjZWl2ZWQgd2l0aCBlcnJvcnNcbiIpOworCXJldGNvZGUgPSAwOworICAgIH0gZWxzZSB7CisJLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLworCW5pYy0+cGFja2V0bGVuID0gbGUzMl90b19jcHUoKHJ4X3JpbmdbZW50cnldLmJ1Zmxlbmd0aCkpLSA0OworCW1lbWNweShuaWMtPnBhY2tldCwgJnJ4X3BhY2tldFtlbnRyeSAqIFBLVF9CVUZfU1pdLCBuaWMtPnBhY2tldGxlbik7CisJcmV0Y29kZSA9IDE7CisgICAgfQorCisgICAgLyogQ2xlYXIgYWxsIGVycm9yIHNvdXJjZXMuICovCisgICAgb3V0bChzdGF0dXMgJiBJTlRSX0NMRUFSRVJSUywgaW50c3RhdCk7CisKKyAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIGNoaXAgKi8KKyAgICByeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBSUklOR19PV047CisKKyAgICAvKiBSZXN0YXJ0IFJlY2VpdmVyICovCisgICAgb3V0bChDUl9TVEFSVF9SWCB8IENSX1FVRVVFX1JYLCBjb21tYW5kKTsgCisKKyAgICByZXR1cm4gcmV0Y29kZTsKK30KKworCitzdGF0aWMgdm9pZCBlcGljMTAwX2Rpc2FibGUgKCBzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQgKSB7CisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlvdXRsKEdDX1NPRlRfUkVTRVQsIGdlbmN0bCk7Cit9CisKK3N0YXRpYyB2b2lkIGVwaWMxMDBfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKKyNpZmRlZglERUJVR19FRVBST00KKy8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4gKi8KKworLyogIEVFUFJPTV9DdHJsIGJpdHMuICovCisjZGVmaW5lIEVFX1NISUZUX0NMSwkweDA0CS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKyNkZWZpbmUgRUVfQ1MJCTB4MDIJLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFCTB4MDgJLyogRUVQUk9NIGNoaXAgZGF0YSBpbi4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfMAkweDAxCisjZGVmaW5lIEVFX1dSSVRFXzEJMHgwOQorI2RlZmluZSBFRV9EQVRBX1JFQUQJMHgxMAkvKiBFRVBST00gY2hpcCBkYXRhIG91dC4gKi8KKyNkZWZpbmUgRUVfRU5CCQkoMHgwMDAxIHwgRUVfQ1MpCisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworI2RlZmluZSBFRV9XUklURV9DTUQJKDUgPDwgNikKKyNkZWZpbmUgRUVfUkVBRF9DTUQJKDYgPDwgNikKKyNkZWZpbmUgRUVfRVJBU0VfQ01ECSg3IDw8IDYpCisKKyNkZWZpbmUgZWVwcm9tX2RlbGF5KG4pCWRlbGF5KG4pCisKKyAgICBzdGF0aWMgaW50CityZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pCit7CisgICAgaW50IGk7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SRUFEX0NNRDsKKworICAgIG91dGwoRUVfRU5CICYgfkVFX0NTLCBlZWN0bCk7CisgICAgb3V0bChFRV9FTkIsIGVlY3RsKTsKKworICAgIC8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisgICAgZm9yIChpID0gMTA7IGkgPj0gMDsgaS0tKSB7CisJc2hvcnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX0RBVEFfV1JJVEUgOiAwOworCW91dGwoRUVfRU5CIHwgZGF0YXZhbCwgZWVjdGwpOworCWVlcHJvbV9kZWxheSgxMDApOworCW91dGwoRUVfRU5CIHwgZGF0YXZhbCB8IEVFX1NISUZUX0NMSywgZWVjdGwpOworCWVlcHJvbV9kZWxheSgxNTApOworCW91dGwoRUVfRU5CIHwgZGF0YXZhbCwgZWVjdGwpOwkvKiBGaW5pc2ggRUVQUk9NIGEgY2xvY2sgdGljay4gKi8KKwllZXByb21fZGVsYXkoMjUwKTsKKyAgICB9CisgICAgb3V0bChFRV9FTkIsIGVlY3RsKTsKKworICAgIGZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJb3V0bChFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlY3RsKTsKKwllZXByb21fZGVsYXkoMTAwKTsKKwlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmwoZWVjdGwpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwlvdXRsKEVFX0VOQiwgZWVjdGwpOworCWVlcHJvbV9kZWxheSgxMDApOworICAgIH0KKworICAgIC8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKyAgICBvdXRsKEVFX0VOQiAmIH5FRV9DUywgZWVjdGwpOworICAgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworCisjZGVmaW5lIE1JSV9SRUFET1AJMQorI2RlZmluZSBNSUlfV1JJVEVPUAkyCisKKyAgICBzdGF0aWMgaW50CittaWlfcmVhZChpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisgICAgaW50IGk7CisKKyAgICBvdXRsKChwaHlfaWQgPDwgOSkgfCAobG9jYXRpb24gPDwgNCkgfCBNSUlfUkVBRE9QLCBtbWN0bCk7CisgICAgLyogVHlwaWNhbCBvcGVyYXRpb24gdGFrZXMgPCA1MCB0aWNrcy4gKi8KKworICAgIGZvciAoaSA9IDQwMDA7IGkgPiAwOyBpLS0pCisJaWYgKChpbmwobW1jdGwpICYgTUlJX1JFQURPUCkgPT0gMCkKKwkgICAgYnJlYWs7CisgICAgcmV0dXJuIGludyhtbWRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIGVwaWMxMDBfb3BlcmF0aW9ucyA9IHsKKwkuY29ubmVjdAk9IGR1bW15X2Nvbm5lY3QsCisJLnBvbGwJCT0gZXBpYzEwMF9wb2xsLAorCS50cmFuc21pdAk9IGVwaWMxMDBfdHJhbnNtaXQsCisJLmlycQkJPSBlcGljMTAwX2lycSwKKworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVwaWMxMDBfbmljc1tdID0geworUENJX1JPTSgweDEwYjgsIDB4MDAwNSwgImVwaWMxMDAiLCAgICAiU01DIEV0aGVyUG93ZXJJSSIsIDApLAkJLyogU01DIDgzYzE3MCBFUElDLzEwMCAqLworUENJX1JPTSgweDEwYjgsIDB4MDAwNiwgInNtYy04M2MxNzUiLCAiU01DIEVQSUMvQyA4M2MxNzUiLCAwKSwKK307CisKK1BDSV9EUklWRVIgKCBlcGljMTAwX2RyaXZlciwgZXBpYzEwMF9uaWNzLCBQQ0lfTk9fQ0xBU1MgKTsKKworRFJJVkVSICggIkVQSUMxMDAiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCBlcGljMTAwX2RyaXZlciwKKwkgZXBpYzEwMF9wcm9iZSwgZXBpYzEwMF9kaXNhYmxlICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9lcGljMTAwLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9lcGljMTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5MGIxMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2VwaWMxMDAuaApAQCAtMCwwICsxLDE5MCBAQAorI2lmbmRlZglfRVBJQzEwMF9IXworIyBkZWZpbmUgX0VQSUMxMDBfSF8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaWZuZGVmCVBDSV9WRU5ET1JfU01DCisjIGRlZmluZSBQQ0lfVkVORE9SX1NNQwkJMHgxMEI4CisjZW5kaWYKKworI2lmbmRlZglQQ0lfREVWSUNFX1NNQ19FUElDMTAwCisjIGRlZmluZSBQQ0lfREVWSUNFX1NNQ19FUElDMTAwCTB4MDAwNQorI2VuZGlmCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OT05FCTB4RkZGRgorCisvKiBPZmZzZXRzIHRvIHJlZ2lzdGVycyAodXNpbmcgU01DIG5hbWVzKS4gKi8KK2VudW0gZXBpYzEwMF9yZWdpc3RlcnMgeworICAgIENPTU1BTkQ9IDAsCQkvKiBDb250cm9sIFJlZ2lzdGVyICovCisgICAgSU5UU1RBVD0gNCwJCS8qIEludGVycnVwdCBTdGF0dXMgKi8KKyAgICBJTlRNQVNLPSA4LAkJLyogSW50ZXJydXB0IE1hc2sgKi8KKyAgICBHRU5DVEwgPSAweDBDLAkvKiBHZW5lcmFsIENvbnRyb2wgKi8KKyAgICBOVkNUTCAgPSAweDEwLAkvKiBOb24gVm9sYXRpbGUgQ29udHJvbCAqLworICAgIEVFQ1RMICA9IDB4MTQsCS8qIEVFUFJPTSBDb250cm9sICAqLworICAgIFRFU1QgICA9IDB4MUMsCS8qIFRlc3QgcmVnaXN0ZXI6IG1hcmtlZCBhcyByZXNlcnZlZCAoc2VlIGluIHNvdXJjZSBjb2RlKSAqLworICAgIENSQ0NOVCA9IDB4MjAsCS8qIENSQyBFcnJvciBDb3VudGVyICovCisgICAgQUxJQ05UID0gMHgyNCwJLyogRnJhbWUgQWxpZ25tZW50IEVycm9yIENvdW50ZXIgKi8KKyAgICBNUENOVCAgPSAweDI4LAkvKiBNaXNzZWQgUGFja2V0IENvdW50ZXIgKi8KKyAgICBNTUNUTCAgPSAweDMwLAkvKiBNSUkgTWFuYWdlbWVudCBJbnRlcmZhY2UgQ29udHJvbCAqLworICAgIE1NREFUQSA9IDB4MzQsCS8qIE1JSSBNYW5hZ2VtZW50IEludGVyZmFjZSBEYXRhICovCisgICAgTUlJQ0ZHID0gMHgzOCwJLyogTUlJIENvbmZpZ3VyYXRpb24gKi8KKyAgICBJUEcgICAgPSAweDNDLAkvKiBJbnRlclBhY2tldCBHYXAgKi8KKyAgICBMQU4wICAgPSAweDQwLAkvKiBNQUMgYWRkcmVzcy4gKDB4NDAtMHg0OCkgKi8KKyAgICBJRENISyAgPSAweDRDLAkvKiBCb2FyZElELyBDaGVja3N1bSAqLworICAgIE1DMCAgICA9IDB4NTAsCS8qIE11bHRpY2FzdCBmaWx0ZXIgdGFibGUuICgweDUwLTB4NWMpICovCisgICAgUlhDT04gID0gMHg2MCwJLyogUmVjZWl2ZSBDb250cm9sICovCisgICAgVFhDT04gID0gMHg3MCwJLyogVHJhbnNtaXQgQ29udHJvbCAqLworICAgIFRYU1RBVCA9IDB4NzQsCS8qIFRyYW5zbWl0IFN0YXR1cyAqLworICAgIFBSQ0RBUiA9IDB4ODQsCS8qIFBDSSBSZWNlaXZlIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyZXNzICovCisgICAgUFJTVEFUID0gMHhBNCwJLyogUENJIFJlY2VpdmUgRE1BIFN0YXR1cyAqLworICAgIFBSQ1BUSFI9IDB4QjAsCS8qIFBDSSBSZWNlaXZlIENvcHkgVGhyZXNob2xkICovCisgICAgUFRDREFSID0gMHhDNCwJLyogUENJIFRyYW5zbWl0IEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyZXNzICovCisgICAgRVRIVEhSID0gMHhEQwkvKiBFYXJseSBUcmFuc21pdCBUaHJlc2hvbGQgKi8KK307CisKKy8qIENvbW1hbmQgcmVnaXN0ZXIgKENSXykgYml0cyAqLworI2RlZmluZSBDUl9TVE9QX1JYCQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgQ1JfU1RBUlRfUlgJCSgweDAwMDAwMDAyKQorI2RlZmluZSBDUl9RVUVVRV9UWAkJKDB4MDAwMDAwMDQpCisjZGVmaW5lIENSX1FVRVVFX1JYCQkoMHgwMDAwMDAwOCkKKyNkZWZpbmUgQ1JfTkVYVEZSQU1FCQkoMHgwMDAwMDAxMCkKKyNkZWZpbmUgQ1JfU1RPUF9UWF9ETUEJCSgweDAwMDAwMDIwKQorI2RlZmluZSBDUl9TVE9QX1JYX0RNQQkJKDB4MDAwMDAwNDApCisjZGVmaW5lIENSX1RYX1VHTwkJKDB4MDAwMDAwODApCisKKy8qIEludGVycnVwdCByZWdpc3RlciBiaXRzLiBOSSBtZWFucyBObyBJbnRlcnJ1cHQgZ2VuZXJhdGVkICovCisKKyNkZWZpbmUJSU5UUl9SWF9USFJfU1RBCQkoMHgwMDQwMDAwMCkJLyogcnggY29weSB0aHJlc2hvbGQgc3RhdHVzIE5JICovCisjZGVmaW5lCUlOVFJfUlhfQlVGRl9FTVBUWQkoMHgwMDIwMDAwMCkJLyogcnggYnVmZmVycyBlbXB0eS4gTkkgKi8KKyNkZWZpbmUJSU5UUl9UWF9JTl9QUk9HCQkoMHgwMDEwMDAwMCkJLyogdHggY29weSBpbiBwcm9nZXNzLiBOSSAqLworI2RlZmluZQlJTlRSX1JYX0lOX1BST0cJCSgweDAwMDgwMDAwKQkvKiByeCBjb3B5IGluIHByb2dyZXNzLiBOSSAqLworI2RlZmluZQlJTlRSX1RYSURMRQkJKDB4MDAwNDAwMDApCS8qIHR4IGlkbGUuIE5JICovCisjZGVmaW5lIElOVFJfUlhJRExFCQkoMHgwMDAyMDAwMCkJLyogcnggaWRsZS4gTkkgKi8KKyNkZWZpbmUgSU5UUl9JTlRSX0FDVElWRQkoMHgwMDAxMDAwMCkJLyogSW50ZXJydXB0IGFjdGl2ZS4gTkkgKi8KKyNkZWZpbmUgSU5UUl9SWF9TVEFUVVNfT0sJKDB4MDAwMDgwMDApCS8qIHJ4IHN0YXR1cyB2YWxpZC4gTkkgKi8KKyNkZWZpbmUgSU5UUl9QQ0lfVEdUX0FCVAkoMHgwMDAwNDAwMCkJLyogUENJIFRhcmdldCBhYm9ydCAqLworI2RlZmluZSBJTlRSX1BDSV9NQVNURVJfQUJUCSgweDAwMDAyMDAwKQkvKiBQQ0kgTWFzdGVyIGFib3J0ICovCisjZGVmaW5lIElOVFJfUENJX1BBUklUWV9FUlIJKDB4MDAwMDEwMDApCS8qIFBDSSBhZHJlc3MgcGFyaXR5IGVycm9yICovCisjZGVmaW5lIElOVFJfUENJX0RBVEFfRVJSCSgweDAwMDAwODAwKQkvKiBQQ0kgZGF0YSBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgSU5UUl9SWF9USFJfQ1JPU1NFRAkoMHgwMDAwMDQwMCkJLyogcnggY29weSB0aHJlc2hvbGQgY3Jvc3NlZCAqLworI2RlZmluZSBJTlRSX0NOVEZVTEwJCSgweDAwMDAwMjAwKQkvKiBDb3VudGVyIG92ZXJmbG93ICovCisjZGVmaW5lIElOVFJfVFhVTkRFUlJVTgkJKDB4MDAwMDAxMDApCS8qIHR4IHVuZGVycnVuLiAqLworI2RlZmluZSBJTlRSX1RYRU1QVFkJCSgweDAwMDAwMDgwKQkvKiB0eCBxdWV1ZSBlbXB0eSAqLworI2RlZmluZSBJTlRSX1RYX0NIX0NPTVBMRVRFCSgweDAwMDAwMDQwKQkvKiB0eCBjaGFpbiBjb21wbGV0ZSAqLworI2RlZmluZSBJTlRSX1RYRE9ORQkJKDB4MDAwMDAwMjApCS8qIHR4IGNvbXBsZXRlICh3IG9yIHcvbyBlcnIpICovCisjZGVmaW5lIElOVFJfUlhFUlJPUgkJKDB4MDAwMDAwMTApCS8qIHJ4IGVycm9yIChDUkMpICovCisjZGVmaW5lIElOVFJfUlhPVkVSRkxPVwkJKDB4MDAwMDAwMDgpCS8qIHJ4IGJ1ZmZlciBvdmVyZmxvdyAqLworI2RlZmluZSBJTlRSX1JYX1FVRVVFX0VNUFRZCSgweDAwMDAwMDA0KQkvKiByeCBxdWV1ZSBlbXB0eS4gKi8KKyNkZWZpbmUgSU5UUl9SWEhFQURFUgkJKDB4MDAwMDAwMDIpCS8qIGhlYWRlciBjb3B5IGNvbXBsZXRlICovCisjZGVmaW5lIElOVFJfUlhET05FCQkoMHgwMDAwMDAwMSkJLyogUmVjZWl2ZSBjb3B5IGNvbXBsZXRlICovCisKKyNkZWZpbmUgSU5UUl9DTEVBUklOVFIJCSgweDAwMDA3RkZGKQorI2RlZmluZSBJTlRSX1ZBTElEQklUUwkJKDB4MDA3RkZGRkYpCisjZGVmaW5lIElOVFJfRElTQUJMRQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIElOVFJfQ0xFQVJFUlJTCQkoMHgwMDAwN0YxOCkKKyNkZWZpbmUgSU5UUl9BQk5JTlRSCQkoSU5UUl9DTlRGVUxMIHwgSU5UUl9UWFVOREVSUlVOIHwgSU5UUl9SWE9WRVJGTE9XKQorCisvKiBHZW5lcmFsIENvbnRyb2wgKEdDXykgYml0cyAqLworCisjZGVmaW5lIEdDX1NPRlRfUkVTRVQJCSgweDAwMDAwMDAxKQorI2RlZmluZSBHQ19JTlRSX0VOQUJMRQkJKDB4MDAwMDAwMDIpCisjZGVmaW5lIEdDX1NPRlRfSU5UUgkJKDB4MDAwMDAwMDQpCisjZGVmaW5lIEdDX1BPV0VSX0RPV04JCSgweDAwMDAwMDA4KQorI2RlZmluZSBHQ19PTkVfQ09QWQkJKDB4MDAwMDAwMTApCisjZGVmaW5lIEdDX0JJR19FTkRJQU4JCSgweDAwMDAwMDIwKQorI2RlZmluZSBHQ19SWF9QUkVFTVBUX1RYCSgweDAwMDAwMDQwKQorI2RlZmluZSBHQ19UWF9QUkVFTVBUX1JYCSgweDAwMDAwMDgwKQorCisvKgorICogUmVjZWl2ZSBGSUZPIFRocmVzaG9sZCB2YWx1ZXMKKyAqIENvbnRyb2wgdGhlIGxldmVsIGF0IHdoaWNoIHRoZSAgUENJIGJ1cnN0IHN0YXRlIG1hY2hpbmUKKyAqIGJlZ2lucyB0byBlbXB0eSB0aGUgcmVjZWl2ZSBGSUZPLiBQb3NzaWJsZSB2YWx1ZXM6IDAtMworICoKKyAqIDAgPT4gMzIsIDEgPT4gNjQsIDIgPT4gOTYgMyA9PiAxMjggYnl0ZXMuCisgKi8KKyNkZWZpbmUgR0NfUlhfRklGT19USFJfMzIJKDB4MDAwMDAwMDApCisjZGVmaW5lIEdDX1JYX0ZJRk9fVEhSXzY0CSgweDAwMDAwMTAwKQorI2RlZmluZSBHQ19SWF9GSUZPX1RIUl85NgkoMHgwMDAwMDIwMCkKKyNkZWZpbmUgR0NfUlhfRklGT19USFJfMTI4CSgweDAwMDAwMzAwKQorCisvKiBNZW1vcnkgUmVhZCBDb250cm9sIChNUkNfKSB2YWx1ZXMgKi8KKyNkZWZpbmUgR0NfTVJDX01FTV9SRUFECQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgR0NfTVJDX1JFQURfTVVMVAkoMHgwMDAwMDQwMCkKKyNkZWZpbmUgR0NfTVJDX1JFQURfTElORQkoMHgwMDAwMDgwMCkKKworI2RlZmluZSBHQ19TT0ZUQklUMAkJKDB4MDAwMDEwMDApCisjZGVmaW5lIEdDX1NPRlRCSVQxCQkoMHgwMDAwMjAwMCkKKyNkZWZpbmUgR0NfUkVTRVRfUEhZCQkoMHgwMDAwNDAwMCkKKworLyogRGVmaW5pdGlvbnMgb2YgdGhlIFJlY2VpdmUgQ29udHJvbCAoUkNfKSByZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgUkNfU0FWRV9FUlJPUkVEX1BLVAkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgUkNfU0FWRV9SVU5UX0ZSQU1FUwkoMHgwMDAwMDAwMikKKyNkZWZpbmUgUkNfUkNWX0JST0FEQ0FTVAkoMHgwMDAwMDAwNCkKKyNkZWZpbmUgUkNfUkNWX01VTFRJQ0FTVAkoMHgwMDAwMDAwOCkKKyNkZWZpbmUgUkNfUkNWX0lOVkVSU0VfUEtUCSgweDAwMDAwMDEwKQorI2RlZmluZSBSQ19QUk9NSVNDVU9VU19NT0RFCSgweDAwMDAwMDIwKQorI2RlZmluZSBSQ19NT05JVE9SX01PREUJCSgweDAwMDAwMDQwKQorI2RlZmluZSBSQ19FQVJMWV9SQ1ZfRU5BQkxFCSgweDAwMDAwMDgwKQorCisvKiBkZXNjcmlwdGlvbiBvZiB0aGUgcnggZGVzY3JpcHRvcnMgY29udHJvbCBiaXRzICovCisjZGVmaW5lIFJEX0ZSQUdMSVNUCQkoMHgwMDAxKQkvKiBEZXNjIHBvaW50cyB0byBhIGZyYWdtZW50IGxpc3QgKi8KKyNkZWZpbmUgUkRfTExGT1JNCQkoMHgwMDAyKQkvKiBGcmFnIGxpc3QgZm9ybWF0ICovCisjZGVmaW5lIFJEX0hEUl9DUFkJCSgweDAwMDQpCS8qIERlc2MgdXNlZCBmb3IgaGVhZGVyIGNvcHkgKi8KKworLyogRGVmaW5pdGlvbiBvZiB0aGUgVHJhbnNtaXQgQ09OVFJPTCAoVEMpIHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBUQ19FQVJMWV9UWF9FTkFCTEUJKDB4MDAwMDAwMDEpCisKKy8qIExvb3BiYWNrIE1vZGUgKExNXykgU2VsZWN0IHZhbHVlc2JpdHMgKi8KKyNkZWZpbmUgVENfTE1fTk9STUFMCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVENfTE1fSU5URVJOQUwJCSgweDAwMDAwMDAyKQorI2RlZmluZSBUQ19MTV9FWFRFUk5BTAkJKDB4MDAwMDAwMDQpCisjZGVmaW5lIFRDX0xNX0ZVTExfRFBYCQkoMHgwMDAwMDAwNikKKworI2RlZmluZSBUWF9TTE9UX1RJTUUJCSgweDAwMDAwMDc4KQorCisvKiBCeXRlcyB0cmFuc2ZlcnJlZCB0byBjaGlwIGJlZm9yZSB0cmFuc21pc3Npb24gc3RhcnRzLiAqLworI2RlZmluZSBUWF9GSUZPX1RIUkVTSAkJMTI4CS8qIFJvdW5kZWQgZG93biB0byA0IGJ5dGUgdW5pdHMuICovCisKKy8qIGRlc2NyaXB0aW9uIG9mIHJ4IGRlc2NyaXB0b3JzIHN0YXR1cyBiaXRzICovCisjZGVmaW5lIFJSSU5HX1BLVF9JTlRBQ1QJKDB4MDAwMSkKKyNkZWZpbmUgUlJJTkdfQUxJR05fRVJSCQkoMHgwMDAyKQorI2RlZmluZSBSUklOR19DUkNfRVJSCQkoMHgwMDA0KQorI2RlZmluZSBSUklOR19NSVNTRURfUEtUCSgweDAwMDgpCisjZGVmaW5lIFJSSU5HX01VTFRJQ0FTVAkJKDB4MDAxMCkKKyNkZWZpbmUgUlJJTkdfQlJPQURDQVNUCQkoMHgwMDIwKQorI2RlZmluZSBSUklOR19SRUNFSVZFUl9ESVNBQkxFCSgweDAwNDApCisjZGVmaW5lIFJSSU5HX1NUQVRVU19WQUxJRAkoMHgxMDAwKQorI2RlZmluZSBSUklOR19GUkFHTElTVF9FUlIJKDB4MjAwMCkKKyNkZWZpbmUgUlJJTkdfSERSX0NPUElFRAkoMHg0MDAwKQorI2RlZmluZSBSUklOR19PV04JCSgweDgwMDApCisKKy8qIGVycm9yIHN1bW1hcnkgKi8KKyNkZWZpbmUgUlJJTkdfRVJST1IJCShSUklOR19BTElHTl9FUlJ8UlJJTkdfQ1JDX0VSUikKKworLyogZGVzY3JpcHRpb24gb2YgdHggZGVzY3JpcHRvcnMgc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgVFJJTkdfUEtUX0lOVEFDVAkoMHgwMDAxKQkvKiBwa3QgdHJhbnNtaXR0ZWQuICovCisjZGVmaW5lIFRSSU5HX1BLVF9OT05ERUZFUgkoMHgwMDAyKQkvKiBwa3QgeG1pdHRlZCB3L28gZGVmZXJyaW5nICovCisjZGVmaW5lIFRSSU5HX0NPTEwJCSgweDAwMDQpCS8qIHBrdCB4bWl0dGVkIHcgY29sbGlzaW9ucyAqLworI2RlZmluZSBUUklOR19DQVJSCQkoMHgwMDA4KQkvKiBjYXJyaWVyIHNlbnNlIGxvc3QgKi8KKyNkZWZpbmUgVFJJTkdfVU5ERVJSVU4JCSgweDAwMTApCS8qIERNQSB1bmRlcnJ1biAqLworI2RlZmluZSBUUklOR19IQl9DT0xMCQkoMHgwMDIwKQkvKiBDb2xsaXNpb24gZGV0ZWN0IEhlYXJ0YmVhdCAqLworI2RlZmluZSBUUklOR19XSU5fQ09MTAkJKDB4MDA0MCkJLyogb3V0IG9mIHdpbmRvdyBjb2xsaXNpb24gKi8KKyNkZWZpbmUgVFJJTkdfREVGRVJSRUQJCSgweDAwODApCS8qIERlZmVycmluZyAqLworI2RlZmluZSBUUklOR19DT0xMX0NPVU5UCSgweDBGMDApCS8qIGNvbGxpc2lvbiBjb3VudGVyIChtYXNrKSAqLworI2RlZmluZSBUUklOR19DT0xMX0VYQ0VTUwkoMHgxMDAwKQkvKiB0eCBhYm9ydGVkOiBleGNlc3NpdmUgY29sbHMgKi8KKyNkZWZpbmUgVFJJTkdfT1dOCQkoMHg4MDAwKQkvKiBkZXNjIG93bmVyc2hpcCBiaXQgKi8KKworLyogZXJyb3Igc3VtbWFyeSAqLworI2RlZmluZSBUUklOR19BQk9SVAkoVFJJTkdfQ09MTF9FWENFU1N8VFJJTkdfV0lOX0NPTEx8VFJJTkdfVU5ERVJSVU4pCisjZGVmaW5lIFRSSU5HX0VSUk9SCShUUklOR19ERUZFUlJFRHxUUklOR19XSU5fQ09MTHxUUklOR19VTkRFUlJVTnxUUklOR19DQVJSLyp8VFJJTkdfQ09MTCovICkKKworLyogZGVzY3JpcHRpb24gb2YgdGhlIHR4IGRlc2NyaXB0b3JzIGNvbnRyb2wgYml0cyAqLworI2RlZmluZSBURF9GUkFHTElTVAkJKDB4MDAwMSkJLyogRGVzYyBwb2ludHMgdG8gYSBmcmFnbWVudCBsaXN0ICovCisjZGVmaW5lIFREX0xMRk9STQkJKDB4MDAwMikJLyogRnJhZyBsaXN0IGZvcm1hdCAqLworI2RlZmluZSBURF9JQUYJCQkoMHgwMDA0KQkvKiBHZW5lcmF0ZSBJbnRlcnJ1cHQgYWZ0ZXIgdHggKi8KKyNkZWZpbmUgVERfTk9DUkMJCSgweDAwMDgpCS8qIE5vIENSQyBnZW5lcmF0ZWQgKi8KKyNkZWZpbmUgVERfTEFTVERFU0MJCSgweDAwMTApCS8qIExhc3QgZGVzYyBmb3IgdGhpcyBmcmFtZSAqLworCisjZW5kaWYJLyogX0VQSUMxMDBfSF8gKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2V0aGVyZmFicmljLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ldGhlcmZhYnJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Mjk2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ldGhlcmZhYnJpYy5jCkBAIC0wLDAgKzEsNDIzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXRoZXJib290IGRyaXZlciBmb3IgTGV2ZWwgNSBFdGhlcmZhYnJpYyBuZXR3b3JrIGNhcmRzCisgKgorICogV3JpdHRlbiBieSBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4KKyAqCisgKiBDb3B5cmlnaHQgRmVuIFN5c3RlbXMgTHRkLiAyMDA1CisgKiBDb3B5cmlnaHQgTGV2ZWwgNSBOZXR3b3JrcyBJbmMuIDIwMDUKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkKKyAqIHJlZmVyZW5jZS4gIERyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyCisgKiB0aGUgR1BMIGFuZCBtdXN0IHJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlCisgKiBub3RpY2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMX0FOWSApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxncHhlL2lvLmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL21hbGxvYy5oPgorI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL3RpbWVyLmg+CisjaW5jbHVkZSA8bWlpLmg+CisjaW5jbHVkZSAiZXRoZXJmYWJyaWMuaCIKKyNpbmNsdWRlICJldGhlcmZhYnJpY19uaWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29uc3RhbnRzIGFuZCBtYWNyb3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjZGVmaW5lIEVGQUJfUkVHRFVNUCguLi4pCisjZGVmaW5lIEVGQUJfVFJBQ0UoLi4uKSBEQkdQKF9fVkFfQVJHU19fKQorCisvLyBwcmludGYoKSBpcyBub3QgYWxsb3dlZCB3aXRoaW4gZHJpdmVycy4gIFVzZSBEQkcoKSBpbnN0ZWFkLgorI2RlZmluZSBFRkFCX0xPRyguLi4pIERCRyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgRUZBQl9FUlIoLi4uKSBEQkcoX19WQV9BUkdTX18pCisKKyNkZWZpbmUgRkFMQ09OX1VTRV9JT19CQVIgMAorCisjZGVmaW5lIEhaIDEwMAorI2RlZmluZSBFRkFCX0JZVEUgMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBIYXJkd2FyZSBkYXRhIHN0cnVjdHVyZXMgYW5kIHNpemluZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitleHRlcm4gaW50IF9faW52YWxpZF9xdWV1ZV9zaXplOworI2RlZmluZSBGUVMoX3ByZWZpeCwgX3gpCQkJCQlcCisJKCAoIChfeCkgPT0gNTEyICkgPyBfcHJlZml4ICMjIF9TSVpFXzUxMiA6CQlcCisJICAoICggKF94KSA9PSAxMDI0ICkgPyBfcHJlZml4ICMjIF9TSVpFXzFLIDoJCVwKKwkgICAgKCAoIChfeCkgPT0gMjA0OCApID8gX3ByZWZpeCAjIyBfU0laRV8ySyA6CQlcCisJICAgICAgKCAoIChfeCkgPT0gNDA5NikgPyBfcHJlZml4ICMjIF9TSVpFXzRLIDoJCVwKKwkJX19pbnZhbGlkX3F1ZXVlX3NpemUgKSApICkgKQorCisKKyNkZWZpbmUgRUZBQl9NQVhfRlJBTUVfTEVOKG10dSkJCQkJXAorCSggKCAoICggbXR1ICkgKyA0LyogRkNTICovICkgKyA3ICkgJiB+NyApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdNSUkgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgdm9pZCBmYWxjb25fbWRpb193cml0ZSAoc3RydWN0IGVmYWJfbmljICplZmFiLCBpbnQgZGV2aWNlLAorCQkJICAgICAgIGludCBsb2NhdGlvbiwgaW50IHZhbHVlICk7CitzdGF0aWMgaW50IGZhbGNvbl9tZGlvX3JlYWQgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIsIGludCBkZXZpY2UsIGludCBsb2NhdGlvbiApOworCisvKiBHTUlJIHJlZ2lzdGVycyAqLworI2RlZmluZSBHTUlJX1BTU1IJCTB4MTEJLyogUEhZLXNwZWNpZmljIHN0YXR1cyByZWdpc3RlciAqLworCisvKiBQc2V1ZG8gZXh0ZW5zaW9ucyB0byB0aGUgbGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFBBX0VGXzEwMDBGVUxMCQkweDAwMDIwMDAwCisjZGVmaW5lIExQQV9FRl8xMDAwSEFMRgkJMHgwMDAxMDAwMAorI2RlZmluZSBMUEFfRUZfMTAwMDBGVUxMCQkweDAwMDQwMDAwCisjZGVmaW5lIExQQV9FRl8xMDAwMEhBTEYJCTB4MDAwODAwMDAKKworI2RlZmluZSBMUEFfMTAwCQkJKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYgfCBMUEFfMTAwQkFTRTQpCisjZGVmaW5lIExQQV9FRl8xMDAwCQkoIExQQV9FRl8xMDAwRlVMTCB8IExQQV9FRl8xMDAwSEFMRiApCisjZGVmaW5lIExQQV9FRl8xMDAwMCAgICAgICAgICAgICAgICggTFBBX0VGXzEwMDAwRlVMTCB8IExQQV9FRl8xMDAwMEhBTEYgKQorI2RlZmluZSBMUEFfRUZfRFVQTEVYCQkoIExQQV8xMEZVTEwgfCBMUEFfMTAwRlVMTCB8IExQQV9FRl8xMDAwRlVMTCB8IFwKKwkJCQkgIExQQV9FRl8xMDAwMEZVTEwgKQorCisvKiBNYXNrIG9mIGJpdHMgbm90IGFzc29jaWF0ZWQgd2l0aCBzcGVlZCBvciBkdXBsZXhpdHkuICovCisjZGVmaW5lIExQQV9PVEhFUgkJfiggTFBBXzEwRlVMTCB8IExQQV8xMEhBTEYgfCBMUEFfMTAwRlVMTCB8IFwKKwkJCQkgICBMUEFfMTAwSEFMRiB8IExQQV9FRl8xMDAwRlVMTCB8IExQQV9FRl8xMDAwSEFMRiApCisKKy8qIFBIWS1zcGVjaWZpYyBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFNTUl9MU1RBVFVTCQkweDA0MDAJLyogQml0IDEwIC0gbGluayBzdGF0dXMgKi8KKworLyoqCisgKiBSZXRyaWV2ZSBHTUlJIGF1dG9uZWdvdGlhdGlvbiBhZHZlcnRpc2VkIGFiaWxpdGllcworICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZ21paV9hdXRvbmVnX2FkdmVydGlzZWQgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCXVuc2lnbmVkIGludCBtaWlfYWR2ZXJ0aXNlOworCXVuc2lnbmVkIGludCBnbWlpX2FkdmVydGlzZTsKKworCS8qIEV4dGVuZGVkIGJpdHMgYXJlIGluIGJpdHMgOCBhbmQgOSBvZiBNSUlfQ1RSTDEwMDAgKi8KKwltaWlfYWR2ZXJ0aXNlID0gZmFsY29uX21kaW9fcmVhZCAoIGVmYWIsIDAsIE1JSV9BRFZFUlRJU0UgKTsKKwlnbWlpX2FkdmVydGlzZSA9ICggKCBmYWxjb25fbWRpb19yZWFkICggZWZhYiwgMCwgTUlJX0NUUkwxMDAwICkgPj4gOCApCisJCQkgICAmIDB4MDMgKTsKKwlyZXR1cm4gKCAoIGdtaWlfYWR2ZXJ0aXNlIDw8IDE2ICkgfCBtaWlfYWR2ZXJ0aXNlICk7Cit9CisKKy8qKgorICogUmV0cmlldmUgR01JSSBhdXRvbmVnb3RpYXRpb24gbGluayBwYXJ0bmVyIGFiaWxpdGllcworICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZ21paV9hdXRvbmVnX2xwYSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJdW5zaWduZWQgaW50IG1paV9scGE7CisJdW5zaWduZWQgaW50IGdtaWlfbHBhOworCisJLyogRXh0ZW5kZWQgYml0cyBhcmUgaW4gYml0cyAxMCBhbmQgMTEgb2YgTUlJX1NUQVQxMDAwICovCisJbWlpX2xwYSA9IGZhbGNvbl9tZGlvX3JlYWQgKCBlZmFiLCAwLCBNSUlfTFBBICk7CisJZ21paV9scGEgPSAoIGZhbGNvbl9tZGlvX3JlYWQgKCBlZmFiLCAwLCBNSUlfU1RBVDEwMDAgKSA+PiAxMCApICYgMHgwMzsKKwlyZXR1cm4gKCAoIGdtaWlfbHBhIDw8IDE2ICkgfCBtaWlfbHBhICk7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIEdNSUkgYXV0b25lZ290aWF0ZWQgbGluayB0ZWNobm9sb2d5CisgKgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitnbWlpX253YXlfcmVzdWx0ICggdW5zaWduZWQgaW50IG5lZ290aWF0ZWQgKQoreworCXVuc2lnbmVkIGludCBvdGhlcl9iaXRzOworCisJLyogTWFzayBvdXQgdGhlIHNwZWVkIGFuZCBkdXBsZXhpdHkgYml0cyAqLworCW90aGVyX2JpdHMgPSBuZWdvdGlhdGVkICYgTFBBX09USEVSOworCisJaWYgKCBuZWdvdGlhdGVkICYgTFBBX0VGXzEwMDBGVUxMICkKKwkJcmV0dXJuICggb3RoZXJfYml0cyB8IExQQV9FRl8xMDAwRlVMTCApOworCWVsc2UgaWYgKCBuZWdvdGlhdGVkICYgTFBBX0VGXzEwMDBIQUxGICkKKwkJcmV0dXJuICggb3RoZXJfYml0cyB8IExQQV9FRl8xMDAwSEFMRiApOworCWVsc2UgaWYgKCBuZWdvdGlhdGVkICYgTFBBXzEwMEZVTEwgKQorCQlyZXR1cm4gKCBvdGhlcl9iaXRzIHwgTFBBXzEwMEZVTEwgKTsKKwllbHNlIGlmICggbmVnb3RpYXRlZCAmIExQQV8xMDBCQVNFNCApCisJCXJldHVybiAoIG90aGVyX2JpdHMgfCBMUEFfMTAwQkFTRTQgKTsKKwllbHNlIGlmICggbmVnb3RpYXRlZCAmIExQQV8xMDBIQUxGICkKKwkJcmV0dXJuICggb3RoZXJfYml0cyB8IExQQV8xMDBIQUxGICk7CisJZWxzZSBpZiAoIG5lZ290aWF0ZWQgJiBMUEFfMTBGVUxMICkKKwkJcmV0dXJuICggb3RoZXJfYml0cyB8IExQQV8xMEZVTEwgKTsKKwllbHNlIHJldHVybiAoIG90aGVyX2JpdHMgfCBMUEFfMTBIQUxGICk7Cit9CisKKy8qKgorICogQ2hlY2sgR01JSSBQSFkgbGluayBzdGF0dXMKKyAqCisgKi8KK3N0YXRpYyBpbnQKK2dtaWlfbGlua19vayAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJaW50IHN0YXR1czsKKwlpbnQgcGh5X3N0YXR1czsKKworCS8qIEJNU1IgaXMgbGF0Y2hpbmcgLSBpdCByZXR1cm5zICJsaW5rIGRvd24iIGlmIHRoZSBsaW5rIGhhcworCSAqIGJlZW4gZG93biBhdCBhbnkgcG9pbnQgc2luY2UgdGhlIGxhc3QgcmVhZC4gIFRvIGdldCBhCisJICogcmVhbC10aW1lIHN0YXR1cywgd2UgdGhlcmVmb3JlIHJlYWQgdGhlIHJlZ2lzdGVyIHR3aWNlIGFuZAorCSAqIHVzZSB0aGUgcmVzdWx0IG9mIHRoZSBzZWNvbmQgcmVhZC4KKwkgKi8KKwkodm9pZCkgZmFsY29uX21kaW9fcmVhZCAoIGVmYWIsIDAsIE1JSV9CTVNSICk7CisJc3RhdHVzID0gZmFsY29uX21kaW9fcmVhZCAoIGVmYWIsIDAsIE1JSV9CTVNSICk7CisKKwkvKiBSZWFkIHRoZSBQSFktc3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyLiAgVGhpcyBpcworCSAqIG5vbi1sYXRjaGluZywgc28gd2UgbmVlZCBkbyBvbmx5IGEgc2luZ2xlIHJlYWQuCisJICovCisJcGh5X3N0YXR1cyA9IGZhbGNvbl9tZGlvX3JlYWQgKCBlZmFiLCAwLCBHTUlJX1BTU1IgKTsKKworCXJldHVybiAoICggc3RhdHVzICYgQk1TUl9MU1RBVFVTICkgJiYgKCBwaHlfc3RhdHVzICYgUFNTUl9MU1RBVFVTICkgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTURJTyByb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIE51bWJlcmluZyBvZiB0aGUgTURJTyBNYW5hZ2VhYmxlIERldmljZXMgKE1NRHMpICovCisvKiBQaHlzaWNhbCBNZWRpdW0gQXR0YWNobWVudC8gUGh5c2ljYWwgTWVkaXVtIERlcGVuZGVudCBzdWJsYXllciAqLworI2RlZmluZSBNRElPX01NRF9QTUFQTUQJKDEpCisvKiBXQU4gSW50ZXJmYWNlIFN1YmxheWVyICovCisjZGVmaW5lIE1ESU9fTU1EX1dJUwkoMikKKy8qIFBoeXNpY2FsIENvZGluZyBTdWJsYXllciAqLworI2RlZmluZSBNRElPX01NRF9QQ1MJKDMpCisvKiBQSFkgRXh0ZW5kZXIgU3VibGF5ZXIgKi8KKyNkZWZpbmUgTURJT19NTURfUEhZWFMJKDQpCisvKiBFeHRlbmRlciBTdWJsYXllciAqLworI2RlZmluZSBNRElPX01NRF9EVEVYUwkoNSkKKy8qIFRyYW5zbWlzc2lvbiBjb252ZXJnZW5jZSAqLworI2RlZmluZSBNRElPX01NRF9UQwkoNikKKy8qIEF1dG8gbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgTURJT19NTURfQU4JKDcpCisKKy8qIEdlbmVyaWMgcmVnaXN0ZXIgbG9jYXRpb25zICovCisjZGVmaW5lIE1ESU9fTU1EUkVHX0NUUkwxCSgwKQorI2RlZmluZSBNRElPX01NRFJFR19TVEFUMQkoMSkKKyNkZWZpbmUgTURJT19NTURSRUdfREVWUzAJKDUpCisjZGVmaW5lIE1ESU9fTU1EUkVHX1NUQVQyCSg4KQorCisvKiBCaXRzIGluIE1NRFJFR19DVFJMMSAqLworLyogUmVzZXQgKi8KKyNkZWZpbmUgTURJT19NTURSRUdfQ1RSTDFfUkVTRVRfTEJOCSgxNSkKKyNkZWZpbmUgTURJT19NTURSRUdfQ1RSTDFfUkVTRVRfV0lEVEgJKDEpCisKKy8qIEJpdHMgaW4gTU1EUkVHX1NUQVQxICovCisjZGVmaW5lIE1ESU9fTU1EUkVHX1NUQVQxX0ZBVUxUX0xCTgkoNykKKyNkZWZpbmUgTURJT19NTURSRUdfU1RBVDFfRkFVTFRfV0lEVEgJKDEpCisKKy8qIExpbmsgc3RhdGUgKi8KKyNkZWZpbmUgTURJT19NTURSRUdfU1RBVDFfTElOS19MQk4JKDIpCisjZGVmaW5lIE1ESU9fTU1EUkVHX1NUQVQxX0xJTktfV0lEVEgJKDEpCisKKy8qIEJpdHMgaW4gTU1EUkVHX0RFVlMwLiAqLworI2RlZmluZSBERVZfUFJFU0VOVF9CSVQoX2IpICgxIDw8IF9iKQorCisjZGVmaW5lIE1ESU9fTU1EUkVHX0RFVlMwX0RURVhTCSBERVZfUFJFU0VOVF9CSVQoTURJT19NTURfRFRFWFMpCisjZGVmaW5lIE1ESU9fTU1EUkVHX0RFVlMwX1BIWVhTCSBERVZfUFJFU0VOVF9CSVQoTURJT19NTURfUEhZWFMpCisjZGVmaW5lIE1ESU9fTU1EUkVHX0RFVlMwX1BDUwkgREVWX1BSRVNFTlRfQklUKE1ESU9fTU1EX1BDUykKKyNkZWZpbmUgTURJT19NTURSRUdfREVWUzBfV0lTCSBERVZfUFJFU0VOVF9CSVQoTURJT19NTURfV0lTKQorI2RlZmluZSBNRElPX01NRFJFR19ERVZTMF9QTUFQTUQgREVWX1BSRVNFTlRfQklUKE1ESU9fTU1EX1BNQVBNRCkKKworI2RlZmluZSBNRElPX01NRFJFR19ERVZTMF9BTiAgICAgREVWX1BSRVNFTlRfQklUKE1ESU9fTU1EX0FOKQorCisvKiBCaXRzIGluIE1NRFJFR19TVEFUMiAqLworI2RlZmluZSBNRElPX01NRFJFR19TVEFUMl9QUkVTRU5UX1ZBTAkoMikKKyNkZWZpbmUgTURJT19NTURSRUdfU1RBVDJfUFJFU0VOVF9MQk4JKDE0KQorI2RlZmluZSBNRElPX01NRFJFR19TVEFUMl9QUkVTRU5UX1dJRFRIICgyKQorCisvKiBQSFkgWEdYUyBsYW5lIHN0YXRlICovCisjZGVmaW5lIE1ESU9fUEhZWFNfTEFORV9TVEFURQkJKDB4MTgpIAorI2RlZmluZSBNRElPX1BIWVhTX0xBTkVfQUxJR05FRF9MQk4JKDEyKQorI2RlZmluZSBNRElPX1BIWVhTX0xBTkVfU1lOQzBfTEJOCSgwKQorI2RlZmluZSBNRElPX1BIWVhTX0xBTkVfU1lOQzFfTEJOCSgxKQorI2RlZmluZSBNRElPX1BIWVhTX0xBTkVfU1lOQzJfTEJOCSgyKQorI2RlZmluZSBNRElPX1BIWVhTX0xBTkVfU1lOQzNfTEJOCSgzKQorCisvKiBUaGlzIG91Z2h0IHRvIGJlIHJpZGljdWxvdXMgb3ZlcmtpbGwuIFdlIGV4cGVjdCBpdCB0byBmYWlsIHJhcmVseSAqLworI2RlZmluZSBNRElPNDVfUkVTRVRfVFJJRVMgICAgICAxMDAKKyNkZWZpbmUgTURJTzQ1X1JFU0VUX1NQSU5USU1FICAgMTAKKworc3RhdGljIGludAorbWRpb19jbGF1c2U0NV93YWl0X3Jlc2V0X21tZHMgKCBzdHJ1Y3QgZWZhYl9uaWMqIGVmYWIgKQoreworCWludCB0cmllcyA9IE1ESU80NV9SRVNFVF9UUklFUzsKKwlpbnQgaW5fcmVzZXQ7CisKKwl3aGlsZSh0cmllcykgeworCQlpbnQgbWFzayA9IGVmYWItPnBoeV9vcC0+bW1kczsKKwkJaW50IG1tZCA9IDA7CisJCWluX3Jlc2V0ID0gMDsKKwkJd2hpbGUobWFzaykgeworCQkJaWYgKG1hc2sgJiAxKSB7CisJCQkJaW50IHN0YXQgPSBmYWxjb25fbWRpb19yZWFkICggZWZhYiwgIG1tZCwKKwkJCQkJCQkgICAgICBNRElPX01NRFJFR19DVFJMMSApOworCQkJCWlmIChzdGF0IDwgMCkgeworCQkJCQlFRkFCX0VSUigiRmFpbGVkIHRvIHJlYWQgc3RhdHVzIG9mIE1NRCAlZFxuIiwKKwkJCQkJCSBtbWQgKTsKKwkJCQkJaW5fcmVzZXQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHN0YXQgJiAoMSA8PCBNRElPX01NRFJFR19DVFJMMV9SRVNFVF9MQk4pKQorCQkJCQlpbl9yZXNldCB8PSAoMSA8PCBtbWQpOworCQkJfQorCQkJbWFzayA9IG1hc2sgPj4gMTsKKwkJCW1tZCsrOworCQl9CisJCWlmICghaW5fcmVzZXQpCisJCQlicmVhazsKKwkJdHJpZXMtLTsKKwkJbWRlbGF5ICggTURJTzQ1X1JFU0VUX1NQSU5USU1FICk7CisJfQorCWlmIChpbl9yZXNldCAhPSAwKSB7CisJCUVGQUJfRVJSKCJOb3QgYWxsIE1NRHMgY2FtZSBvdXQgb2YgcmVzZXQgaW4gdGltZS4gTU1EcyAiCisJCQkgInN0aWxsIGluIHJlc2V0OiAleFxuIiwgaW5fcmVzZXQpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21kaW9fY2xhdXNlNDVfcmVzZXRfbW1kICggc3RydWN0IGVmYWJfbmljICplZmFiLCBpbnQgbW1kICkKK3sKKwlpbnQgdHJpZXMgPSBNRElPNDVfUkVTRVRfVFJJRVM7CisJaW50IGN0cmw7CisKKwlmYWxjb25fbWRpb193cml0ZSAoIGVmYWIsIG1tZCwgTURJT19NTURSRUdfQ1RSTDEsCisJCQkgICAgKCAxIDw8IE1ESU9fTU1EUkVHX0NUUkwxX1JFU0VUX0xCTiApICk7CisKKwkvKiBXYWl0IGZvciB0aGUgcmVzZXQgYml0IHRvIGNsZWFyLiAqLworCWRvIHsKKwkJbWRlbGF5ICggTURJTzQ1X1JFU0VUX1NQSU5USU1FICk7CisKKwkJY3RybCA9IGZhbGNvbl9tZGlvX3JlYWQgKCBlZmFiLCBtbWQsIE1ESU9fTU1EUkVHX0NUUkwxICk7CisJCWlmICggfmN0cmwgJiAoIDEgPDwgTURJT19NTURSRUdfQ1RSTDFfUkVTRVRfTEJOICkgKQorCQkJcmV0dXJuIDA7CisJfSB3aGlsZSAoIC0tdHJpZXMgKTsKKworCUVGQUJfRVJSICggIkZhaWxlZCB0byByZXNldCBtbWQgJWRcbiIsIG1tZCApOworCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQKK21kaW9fY2xhdXNlNDVfbGlua3Nfb2soc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwlpbnQgc3RhdHVzLCBnb29kOworCWludCBvayA9IDE7CisJaW50IG1tZCA9IDA7CisJaW50IG1tZF9tYXNrID0gZWZhYi0+cGh5X29wLT5tbWRzOworCisJd2hpbGUgKG1tZF9tYXNrKSB7CisJCWlmIChtbWRfbWFzayAmIDEpIHsKKwkJCS8qIERvdWJsZSByZWFkcyBiZWNhdXNlIGxpbmsgc3RhdGUgaXMgbGF0Y2hlZCwgYW5kIGEKKwkJCSAqIHJlYWQJbW92ZXMgdGhlIGN1cnJlbnQgc3RhdGUgaW50byB0aGUgcmVnaXN0ZXIgKi8KKwkJCXN0YXR1cyA9IGZhbGNvbl9tZGlvX3JlYWQgKCBlZmFiLCBtbWQsCisJCQkJCQkgICAgTURJT19NTURSRUdfU1RBVDEgKTsKKwkJCXN0YXR1cyA9IGZhbGNvbl9tZGlvX3JlYWQgKCBlZmFiLCBtbWQsCisJCQkJCQkgICAgTURJT19NTURSRUdfU1RBVDEgKTsKKworCQkJZ29vZCA9IHN0YXR1cyAmICgxIDw8IE1ESU9fTU1EUkVHX1NUQVQxX0xJTktfTEJOKTsKKwkJCW9rID0gb2sgJiYgZ29vZDsKKwkJfQorCQltbWRfbWFzayA9IChtbWRfbWFzayA+PiAxKTsKKwkJbW1kKys7CisJfQorCXJldHVybiBvazsKK30KKworc3RhdGljIGludAorbWRpb19jbGF1c2U0NV9jaGVja19tbWRzICggc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwlpbnQgbW1kID0gMDsKKwlpbnQgZGV2aWNlcyA9IGZhbGNvbl9tZGlvX3JlYWQgKCBlZmFiLCBNRElPX01NRF9QSFlYUywKKwkJCQkJIE1ESU9fTU1EUkVHX0RFVlMwICk7CisJaW50IG1tZF9tYXNrID0gZWZhYi0+cGh5X29wLT5tbWRzOworCisJLyogQ2hlY2sgYWxsIHRoZSBleHBlY3RlZCBNTURzIGFyZSBwcmVzZW50ICovCisJaWYgKCBkZXZpY2VzIDwgMCApIHsKKwkJRUZBQl9FUlIgKCAiRmFpbGVkIHRvIHJlYWQgZGV2aWNlcyBwcmVzZW50XG4iICk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoICggZGV2aWNlcyAmIG1tZF9tYXNrICkgIT0gbW1kX21hc2sgKSB7CisJCUVGQUJfRVJSICggInJlcXVpcmVkIE1NRHMgbm90IHByZXNlbnQ6IGdvdCAleCwgd2FudGVkICV4XG4iLAorCQkJICAgZGV2aWNlcywgbW1kX21hc2sgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQ2hlY2sgYWxsIHJlcXVpcmVkIE1NRHMgYXJlIHJlc3BvbmRpbmcgYW5kIGhhcHB5LiAqLworCXdoaWxlICggbW1kX21hc2sgKSB7CisJCWlmICggbW1kX21hc2sgJiAxICkgeworCQkJZWZhYl9kd29yZF90IHJlZzsKKwkJCWludCBzdGF0dXM7CisJCQlyZWcub3BhcXVlID0gZmFsY29uX21kaW9fcmVhZCAoIGVmYWIsIG1tZCwKKwkJCQkJCQlNRElPX01NRFJFR19TVEFUMiApOworCQkJc3RhdHVzID0gRUZBQl9EV09SRF9GSUVMRCAoIHJlZywKKwkJCQkJCSAgICBNRElPX01NRFJFR19TVEFUMl9QUkVTRU5UICk7CisJCQlpZiAoIHN0YXR1cyAhPSBNRElPX01NRFJFR19TVEFUMl9QUkVTRU5UX1ZBTCApIHsKKworCisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKwkJbW1kX21hc2sgPj49IDE7CisJCW1tZCsrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBJL08gQkFSIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX0lPTV9JTkRfQURSX1JFRyAweDAKKworLyogSS9PIEJBUiBkYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9JT01fSU5EX0RBVF9SRUcgMHg0CisKKy8qIEFkZHJlc3MgcmVnaW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9BRFJfUkVHSU9OX1JFR19LRVIJMHgwMAorI2RlZmluZSBGQ05fQURSX1JFR0lPTjBfTEJOCTAKKyNkZWZpbmUgRkNOX0FEUl9SRUdJT04wX1dJRFRICTE4CisjZGVmaW5lIEZDTl9BRFJfUkVHSU9OMV9MQk4JMzIKKyNkZWZpbmUgRkNOX0FEUl9SRUdJT04xX1dJRFRICTE4CisjZGVmaW5lIEZDTl9BRFJfUkVHSU9OMl9MQk4JNjQKKyNkZWZpbmUgRkNOX0FEUl9SRUdJT04yX1dJRFRICTE4CisjZGVmaW5lIEZDTl9BRFJfUkVHSU9OM19MQk4JOTYKKyNkZWZpbmUgRkNOX0FEUl9SRUdJT04zX1dJRFRICTE4CisKKy8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX0lOVF9FTl9SRUdfS0VSIDB4MDAxMAorI2RlZmluZSBGQ05fTUVNX1BFUlJfSU5UX0VOX0tFUl9MQk4gNQorI2RlZmluZSBGQ05fTUVNX1BFUlJfSU5UX0VOX0tFUl9XSURUSCAxCisjZGVmaW5lIEZDTl9LRVJfSU5UX0NIQVJfTEJOIDQKKyNkZWZpbmUgRkNOX0tFUl9JTlRfQ0hBUl9XSURUSCAxCisjZGVmaW5lIEZDTl9LRVJfSU5UX0tFUl9MQk4gMworI2RlZmluZSBGQ05fS0VSX0lOVF9LRVJfV0lEVEggMQorI2RlZmluZSBGQ05fSUxMX0FEUl9FUlJfSU5UX0VOX0tFUl9MQk4gMgorI2RlZmluZSBGQ05fSUxMX0FEUl9FUlJfSU5UX0VOX0tFUl9XSURUSCAxCisjZGVmaW5lIEZDTl9TUk1fUEVSUl9JTlRfRU5fS0VSX0xCTiAxCisjZGVmaW5lIEZDTl9TUk1fUEVSUl9JTlRfRU5fS0VSX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0RSVl9JTlRfRU5fS0VSX0xCTiAwCisjZGVmaW5lIEZDTl9EUlZfSU5UX0VOX0tFUl9XSURUSCAxCisKKy8qIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX0lOVF9BRFJfUkVHX0tFUgkweDAwMzAKKyNkZWZpbmUgRkNOX0lOVF9BRFJfS0VSX0xCTiAwCisjZGVmaW5lIEZDTl9JTlRfQURSX0tFUl9XSURUSCBFRkFCX0RNQV9UWVBFX1dJRFRIICggNjQgKQorCisvKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIChCMCBvbmx5KSAqLworI2RlZmluZSBJTlRfSVNSMF9CMCAweDkwCisjZGVmaW5lIElOVF9JU1IxX0IwIDB4QTAKKworLyogSW50ZXJydXB0IGFja25vd2xlZGdlIHJlZ2lzdGVyIChBMC9BMSBvbmx5KSAqLworI2RlZmluZSBGQ05fSU5UX0FDS19LRVJfUkVHX0ExIDB4MDA1MAorI2RlZmluZSBJTlRfQUNLX0RVTU1ZX0RBVEFfTEJOIDAKKyNkZWZpbmUgSU5UX0FDS19EVU1NWV9EQVRBX1dJRFRIIDMyCisKKy8qIEludGVycnVwdCBhY2tub3dsZWRnZSB3b3JrLWFyb3VuZCByZWdpc3RlciAoQTAvQTEgb25seSApKi8KKyNkZWZpbmUgV09SS19BUk9VTkRfQlJPS0VOX1BDSV9SRUFEU19SRUdfS0VSX0ExIDB4MDA3MAorCisvKiBIYXJkd2FyZSBpbml0aWFsaXNhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBGQ05fSFdfSU5JVF9SRUdfS0VSIDB4MDBjMAorI2RlZmluZSBGQ05fQkNTUl9UQVJHRVRfTUFTS19MQk4gMTAxCisjZGVmaW5lIEZDTl9CQ1NSX1RBUkdFVF9NQVNLX1dJRFRIIDQKKworLyogU1BJIGhvc3QgY29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZSBGQ05fRUVfU1BJX0hDTURfUkVHIDB4MDEwMAorI2RlZmluZSBGQ05fRUVfU1BJX0hDTURfQ01EX0VOX0xCTiAzMQorI2RlZmluZSBGQ05fRUVfU1BJX0hDTURfQ01EX0VOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0VFX1dSX1RJTUVSX0FDVElWRV9MQk4gMjgKKyNkZWZpbmUgRkNOX0VFX1dSX1RJTUVSX0FDVElWRV9XSURUSCAxCisjZGVmaW5lIEZDTl9FRV9TUElfSENNRF9TRl9TRUxfTEJOIDI0CisjZGVmaW5lIEZDTl9FRV9TUElfSENNRF9TRl9TRUxfV0lEVEggMQorI2RlZmluZSBGQ05fRUVfU1BJX0VFUFJPTSAwCisjZGVmaW5lIEZDTl9FRV9TUElfRkxBU0ggMQorI2RlZmluZSBGQ05fRUVfU1BJX0hDTURfREFCQ05UX0xCTiAxNgorI2RlZmluZSBGQ05fRUVfU1BJX0hDTURfREFCQ05UX1dJRFRIIDUKKyNkZWZpbmUgRkNOX0VFX1NQSV9IQ01EX1JFQURfTEJOIDE1CisjZGVmaW5lIEZDTl9FRV9TUElfSENNRF9SRUFEX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0VFX1NQSV9SRUFEIDEKKyNkZWZpbmUgRkNOX0VFX1NQSV9XUklURSAwCisjZGVmaW5lIEZDTl9FRV9TUElfSENNRF9EVUJDTlRfTEJOIDEyCisjZGVmaW5lIEZDTl9FRV9TUElfSENNRF9EVUJDTlRfV0lEVEggMgorI2RlZmluZSBGQ05fRUVfU1BJX0hDTURfQURCQ05UX0xCTiA4CisjZGVmaW5lIEZDTl9FRV9TUElfSENNRF9BREJDTlRfV0lEVEggMgorI2RlZmluZSBGQ05fRUVfU1BJX0hDTURfRU5DX0xCTiAwCisjZGVmaW5lIEZDTl9FRV9TUElfSENNRF9FTkNfV0lEVEggOAorCisvKiBTUEkgaG9zdCBhZGRyZXNzIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9FRV9TUElfSEFEUl9SRUcgMHgwMTEwCisjZGVmaW5lIEZDTl9FRV9TUElfSEFEUl9EVUJZVEVfTEJOIDI0CisjZGVmaW5lIEZDTl9FRV9TUElfSEFEUl9EVUJZVEVfV0lEVEggOAorI2RlZmluZSBGQ05fRUVfU1BJX0hBRFJfQURSX0xCTiAwCisjZGVmaW5lIEZDTl9FRV9TUElfSEFEUl9BRFJfV0lEVEggMjQKKworLyogU1BJIGhvc3QgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBGQ05fRUVfU1BJX0hEQVRBX1JFRyAweDAxMjAKKyNkZWZpbmUgRkNOX0VFX1NQSV9IREFUQTNfTEJOIDk2CisjZGVmaW5lIEZDTl9FRV9TUElfSERBVEEzX1dJRFRIIDMyCisjZGVmaW5lIEZDTl9FRV9TUElfSERBVEEyX0xCTiA2NAorI2RlZmluZSBGQ05fRUVfU1BJX0hEQVRBMl9XSURUSCAzMgorI2RlZmluZSBGQ05fRUVfU1BJX0hEQVRBMV9MQk4gMzIKKyNkZWZpbmUgRkNOX0VFX1NQSV9IREFUQTFfV0lEVEggMzIKKyNkZWZpbmUgRkNOX0VFX1NQSV9IREFUQTBfTEJOIDAKKyNkZWZpbmUgRkNOX0VFX1NQSV9IREFUQTBfV0lEVEggMzIKKworLyogVlBEIENvbmZpZyAwIFJlZ2lzdGVyIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9FRV9WUERfQ0ZHX1JFRyAweDAxNDAKKyNkZWZpbmUgRkNOX0VFX1ZQRF9FTl9MQk4gMAorI2RlZmluZSBGQ05fRUVfVlBEX0VOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0VFX1ZQRF9FTl9BRDlfTU9ERV9MQk4gMQorI2RlZmluZSBGQ05fRUVfVlBEX0VOX0FEOV9NT0RFX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0VFX0VFX0NMT0NLX0RJVl9MQk4gMTEyCisjZGVmaW5lIEZDTl9FRV9FRV9DTE9DS19ESVZfV0lEVEggNworI2RlZmluZSBGQ05fRUVfU0ZfQ0xPQ0tfRElWX0xCTiAxMjAKKyNkZWZpbmUgRkNOX0VFX1NGX0NMT0NLX0RJVl9XSURUSCA3CisKKworLyogTklDIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBGQ05fTklDX1NUQVRfUkVHIDB4MDIwMAorI2RlZmluZSBGQ05fT05DSElQX1NSQU1fTEJOIDE2CisjZGVmaW5lIEZDTl9PTkNISVBfU1JBTV9XSURUSCAxCisjZGVmaW5lIEZDTl9TRl9QUlNUX0xCTiA5CisjZGVmaW5lIEZDTl9TRl9QUlNUX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0VFX1BSU1RfTEJOIDgKKyNkZWZpbmUgRkNOX0VFX1BSU1RfV0lEVEggMQorI2RlZmluZSBGQ05fRUVfU1RSQVBfTEJOIDcKKyNkZWZpbmUgRkNOX0VFX1NUUkFQX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1BDSV9QQ0lYX01PREVfTEJOIDQKKyNkZWZpbmUgRkNOX1BDSV9QQ0lYX01PREVfV0lEVEggMworI2RlZmluZSBGQ05fUENJX1BDSVhfTU9ERV9QQ0kzM19ERUNPREUgMAorI2RlZmluZSBGQ05fUENJX1BDSVhfTU9ERV9QQ0k2Nl9ERUNPREUgMQorI2RlZmluZSBGQ05fUENJX1BDSVhfTU9ERV9QQ0lYNjZfREVDT0RFIDUKKyNkZWZpbmUgRkNOX1BDSV9QQ0lYX01PREVfUENJWDEwMF9ERUNPREUgNgorI2RlZmluZSBGQ05fUENJX1BDSVhfTU9ERV9QQ0lYMTMzX0RFQ09ERSA3CisjZGVmaW5lIEZDTl9TVFJBUF9JU0NTSV9FTl9MQk4gMworI2RlZmluZSBGQ05fU1RSQVBfSVNDU0lfRU5fV0lEVEggMQorI2RlZmluZSBGQ05fU1RSQVBfUElOU19MQk4gMAorI2RlZmluZSBGQ05fU1RSQVBfUElOU19XSURUSCAzCisjZGVmaW5lIEZDTl9TVFJBUF8xMEdfTEJOIDIKKyNkZWZpbmUgRkNOX1NUUkFQXzEwR19XSURUSCAxCisjZGVmaW5lIEZDTl9TVFJBUF9EVUFMX1BPUlRfTEJOIDEKKyNkZWZpbmUgRkNOX1NUUkFQX0RVQUxfUE9SVF9XSURUSCAxCisjZGVmaW5lIEZDTl9TVFJBUF9QQ0lFX0xCTiAwCisjZGVmaW5lIEZDTl9TVFJBUF9QQ0lFX1dJRFRIIDEKKworLyogRmFsY29uIHJldmlzaW9ucyAqLworI2RlZmluZSBGQUxDT05fUkVWX0EwIDAKKyNkZWZpbmUgRkFMQ09OX1JFVl9BMSAxCisjZGVmaW5lIEZBTENPTl9SRVZfQjAgMgorCisvKiBHUElPIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX0dQSU9fQ1RMX1JFR19LRVIgMHgwMjEwCisjZGVmaW5lIEZDTl9HUElPX0NUTF9SRUdfS0VSIDB4MDIxMAorCisjZGVmaW5lIEZDTl9HUElPM19PRU5fTEJOIDI3CisjZGVmaW5lIEZDTl9HUElPM19PRU5fV0lEVEggMQorI2RlZmluZSBGQ05fR1BJTzJfT0VOX0xCTiAyNgorI2RlZmluZSBGQ05fR1BJTzJfT0VOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0dQSU8xX09FTl9MQk4gMjUKKyNkZWZpbmUgRkNOX0dQSU8xX09FTl9XSURUSCAxCisjZGVmaW5lIEZDTl9HUElPMF9PRU5fTEJOIDI0CisjZGVmaW5lIEZDTl9HUElPMF9PRU5fV0lEVEggMQorCisjZGVmaW5lIEZDTl9HUElPM19PVVRfTEJOIDE5CisjZGVmaW5lIEZDTl9HUElPM19PVVRfV0lEVEggMQorI2RlZmluZSBGQ05fR1BJTzJfT1VUX0xCTiAxOAorI2RlZmluZSBGQ05fR1BJTzJfT1VUX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0dQSU8xX09VVF9MQk4gMTcKKyNkZWZpbmUgRkNOX0dQSU8xX09VVF9XSURUSCAxCisjZGVmaW5lIEZDTl9HUElPMF9PVVRfTEJOIDE2CisjZGVmaW5lIEZDTl9HUElPMF9PVVRfV0lEVEggMQorCisjZGVmaW5lIEZDTl9HUElPM19JTl9MQk4gMTEKKyNkZWZpbmUgRkNOX0dQSU8zX0lOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0dQSU8yX0lOX0xCTiAxMAorI2RlZmluZSBGQ05fR1BJTzJfSU5fV0lEVEggMQorI2RlZmluZSBGQ05fR1BJTzFfSU5fTEJOIDkKKyNkZWZpbmUgRkNOX0dQSU8xX0lOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0dQSU8wX0lOX0xCTiA4CisjZGVmaW5lIEZDTl9HUElPMF9JTl9XSURUSCAxCisKKyNkZWZpbmUgRkNOX0ZMQVNIX1BSRVNFTlRfTEJOIDcKKyNkZWZpbmUgRkNOX0ZMQVNIX1BSRVNFTlRfV0lEVEggMQorI2RlZmluZSBGQ05fRUVQUk9NX1BSRVNFTlRfTEJOIDYKKyNkZWZpbmUgRkNOX0VFUFJPTV9QUkVTRU5UX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0JPT1RFRF9VU0lOR19OVkRFVklDRV9MQk4gMworI2RlZmluZSBGQ05fQk9PVEVEX1VTSU5HX05WREVWSUNFX1dJRFRIIDEKKworLyogRGVmaW5lcyBmb3IgZXh0cmEgbm9uLXZvbGF0aWxlIHN0b3JhZ2UgKi8KKyNkZWZpbmUgRkNOX05WX01BR0lDX05VTUJFUiAweEZBMUMKKworLyogR2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX0dMQl9DVExfUkVHX0tFUgkweDAyMjAKKyNkZWZpbmUgRkNOX0VYVF9QSFlfUlNUX0NUTF9MQk4gNjMKKyNkZWZpbmUgRkNOX0VYVF9QSFlfUlNUX0NUTF9XSURUSCAxCisjZGVmaW5lIEZDTl9QQ0lFX1NEX1JTVF9DVExfTEJOIDYxCisjZGVmaW5lIEZDTl9QQ0lFX1NEX1JTVF9DVExfV0lEVEggMQorI2RlZmluZSBGQ05fUENJRV9TVENLX1JTVF9DVExfTEJOIDU5CisjZGVmaW5lIEZDTl9QQ0lFX1NUQ0tfUlNUX0NUTF9XSURUSCAxCisjZGVmaW5lIEZDTl9QQ0lFX05TVENLX1JTVF9DVExfTEJOIDU4CisjZGVmaW5lIEZDTl9QQ0lFX05TVENLX1JTVF9DVExfV0lEVEggMQorI2RlZmluZSBGQ05fUENJRV9DT1JFX1JTVF9DVExfTEJOIDU3CisjZGVmaW5lIEZDTl9QQ0lFX0NPUkVfUlNUX0NUTF9XSURUSCAxCisjZGVmaW5lIEZDTl9FRV9SU1RfQ1RMX0xCTiA0OQorI2RlZmluZSBGQ05fRUVfUlNUX0NUTF9XSURUSCAxCisjZGVmaW5lIEZDTl9SU1RfRVhUX1BIWV9MQk4gMzEKKyNkZWZpbmUgRkNOX1JTVF9FWFRfUEhZX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0VYVF9QSFlfUlNUX0RVUl9MQk4gMQorI2RlZmluZSBGQ05fRVhUX1BIWV9SU1RfRFVSX1dJRFRIIDMKKyNkZWZpbmUgRkNOX1NXUlNUX0xCTiAwCisjZGVmaW5lIEZDTl9TV1JTVF9XSURUSCAxCisjZGVmaW5lIElOQ0xVREVfSU5fUkVTRVQgMAorI2RlZmluZSBFWENMVURFX0ZST01fUkVTRVQgMQorCisvKiBGUEdBIGJ1aWxkIHZlcnNpb24gKi8KKyNkZWZpbmUgRkNOX0FMVEVSQV9CVUlMRF9SRUdfS0VSIDB4MDMwMAorI2RlZmluZSBGQ05fVkVSX01BSk9SX0xCTiAyNAorI2RlZmluZSBGQ05fVkVSX01BSk9SX1dJRFRIIDgKKyNkZWZpbmUgRkNOX1ZFUl9NSU5PUl9MQk4gMTYKKyNkZWZpbmUgRkNOX1ZFUl9NSU5PUl9XSURUSCA4CisjZGVmaW5lIEZDTl9WRVJfQlVJTERfTEJOIDAKKyNkZWZpbmUgRkNOX1ZFUl9CVUlMRF9XSURUSCAxNgorI2RlZmluZSBGQ05fVkVSX0FMTF9MQk4gMAorI2RlZmluZSBGQ05fVkVSX0FMTF9XSURUSCAzMgorCisvKiBTcGFyZSBFRVBST00gYml0cyByZWdpc3RlciAoZmxhc2ggMHgzOTApICovCisjZGVmaW5lIEZDTl9TUEFSRV9SRUdfS0VSIDB4MzEwCisjZGVmaW5lIEZDTl9NRU1fUEVSUl9FTl9UWF9EQVRBX0xCTiA3MgorI2RlZmluZSBGQ05fTUVNX1BFUlJfRU5fVFhfREFUQV9XSURUSCAyCisKKy8qIFRpbWVyIHRhYmxlIGZvciBrZXJuZWwgYWNjZXNzICovCisjZGVmaW5lIEZDTl9USU1FUl9DTURfUkVHX0tFUiAweDQyMAorI2RlZmluZSBGQ05fVElNRVJfTU9ERV9MQk4gMTIKKyNkZWZpbmUgRkNOX1RJTUVSX01PREVfV0lEVEggMgorI2RlZmluZSBGQ05fVElNRVJfTU9ERV9ESVMgMAorI2RlZmluZSBGQ05fVElNRVJfTU9ERV9JTlRfSExET0ZGIDEKKyNkZWZpbmUgRkNOX1RJTUVSX1ZBTF9MQk4gMAorI2RlZmluZSBGQ05fVElNRVJfVkFMX1dJRFRIIDEyCisKKy8qIFJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBGQ05fUlhfQ0ZHX1JFR19LRVIgMHg4MDAKKyNkZWZpbmUgRkNOX1JYX1hPRkZfRU5fTEJOIDAKKyNkZWZpbmUgRkNOX1JYX1hPRkZfRU5fV0lEVEggMQorCisvKiBTUkFNIHJlY2VpdmUgZGVzY3JpcHRvciBjYWNoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9TUk1fUlhfRENfQ0ZHX1JFR19LRVIgMHg2MTAKKyNkZWZpbmUgRkNOX1NSTV9SWF9EQ19CQVNFX0FEUl9MQk4gMAorI2RlZmluZSBGQ05fU1JNX1JYX0RDX0JBU0VfQURSX1dJRFRIIDIxCisKKy8qIFNSQU0gdHJhbnNtaXQgZGVzY3JpcHRvciBjYWNoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9TUk1fVFhfRENfQ0ZHX1JFR19LRVIgMHg2MjAKKyNkZWZpbmUgRkNOX1NSTV9UWF9EQ19CQVNFX0FEUl9MQk4gMAorI2RlZmluZSBGQ05fU1JNX1RYX0RDX0JBU0VfQURSX1dJRFRIIDIxCisKKy8qIFNSQU0gY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBGQ05fU1JNX0NGR19SRUdfS0VSIDB4NjMwCisjZGVmaW5lIEZDTl9TUkFNX09PQl9BRFJfSU5URU5fTEJOIDUKKyNkZWZpbmUgRkNOX1NSQU1fT09CX0FEUl9JTlRFTl9XSURUSCAxCisjZGVmaW5lIEZDTl9TUkFNX09PQl9CVUZfSU5URU5fTEJOIDQKKyNkZWZpbmUgRkNOX1NSQU1fT09CX0JVRl9JTlRFTl9XSURUSCAxCisjZGVmaW5lIEZDTl9TUkFNX09PQl9CVF9JTklUX0VOX0xCTiAzCisjZGVmaW5lIEZDTl9TUkFNX09PQl9CVF9JTklUX0VOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1NSTV9OVU1fQkFOS19MQk4gMgorI2RlZmluZSBGQ05fU1JNX05VTV9CQU5LX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1NSTV9CQU5LX1NJWkVfTEJOIDAKKyNkZWZpbmUgRkNOX1NSTV9CQU5LX1NJWkVfV0lEVEggMgorI2RlZmluZSBGQ05fU1JNX05VTV9CQU5LU19BTkRfQkFOS19TSVpFX0xCTiAwCisjZGVmaW5lIEZDTl9TUk1fTlVNX0JBTktTX0FORF9CQU5LX1NJWkVfV0lEVEggMworCisjZGVmaW5lIEZDTl9SWF9DRkdfUkVHX0tFUiAweDgwMAorI2RlZmluZSBGQ05fUlhfSU5HUl9FTl9CMF9MQk4gNDcKKyNkZWZpbmUgRkNOX1JYX0lOR1JfRU5fQjBfV0lEVEggMQorI2RlZmluZSBGQ05fUlhfVVNSX0JVRl9TSVpFX0IwX0xCTiAxOQorI2RlZmluZSBGQ05fUlhfVVNSX0JVRl9TSVpFX0IwX1dJRFRIIDkKKyNkZWZpbmUgRkNOX1JYX1hPTl9NQUNfVEhfQjBfTEJOIDEwCisjZGVmaW5lIEZDTl9SWF9YT05fTUFDX1RIX0IwX1dJRFRIIDkKKyNkZWZpbmUgRkNOX1JYX1hPRkZfTUFDX1RIX0IwX0xCTiAxCisjZGVmaW5lIEZDTl9SWF9YT0ZGX01BQ19USF9CMF9XSURUSCA5CisjZGVmaW5lIEZDTl9SWF9YT0ZGX01BQ19FTl9CMF9MQk4gMAorI2RlZmluZSBGQ05fUlhfWE9GRl9NQUNfRU5fQjBfV0lEVEggMQorI2RlZmluZSBGQ05fUlhfVVNSX0JVRl9TSVpFX0ExX0xCTiAxMQorI2RlZmluZSBGQ05fUlhfVVNSX0JVRl9TSVpFX0ExX1dJRFRIIDkKKyNkZWZpbmUgRkNOX1JYX1hPTl9NQUNfVEhfQTFfTEJOIDYKKyNkZWZpbmUgRkNOX1JYX1hPTl9NQUNfVEhfQTFfV0lEVEggNQorI2RlZmluZSBGQ05fUlhfWE9GRl9NQUNfVEhfQTFfTEJOIDEKKyNkZWZpbmUgRkNOX1JYX1hPRkZfTUFDX1RIX0ExX1dJRFRIIDUKKyNkZWZpbmUgRkNOX1JYX1hPRkZfTUFDX0VOX0ExX0xCTiAwCisjZGVmaW5lIEZDTl9SWF9YT0ZGX01BQ19FTl9BMV9XSURUSCAxCisKKyNkZWZpbmUgRkNOX1JYX1VTUl9CVUZfU0laRV9BMV9MQk4gMTEKKyNkZWZpbmUgRkNOX1JYX1VTUl9CVUZfU0laRV9BMV9XSURUSCA5CisjZGVmaW5lIEZDTl9SWF9YT0ZGX01BQ19FTl9BMV9MQk4gMAorI2RlZmluZSBGQ05fUlhfWE9GRl9NQUNfRU5fQTFfV0lEVEggMQorCisvKiBSZWNlaXZlIGZpbHRlciBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9SWF9GSUxURVJfQ1RMX1JFR19LRVIgMHg4MTAKKyNkZWZpbmUgRkNOX1VEUF9GVUxMX1NSQ0hfTElNSVRfTEJOIDMyCisjZGVmaW5lIEZDTl9VRFBfRlVMTF9TUkNIX0xJTUlUX1dJRFRIIDgKKyNkZWZpbmUgRkNOX05VTV9LRVJfTEJOIDI0CisjZGVmaW5lIEZDTl9OVU1fS0VSX1dJRFRIIDIKKyNkZWZpbmUgRkNOX1VEUF9XSUxEX1NSQ0hfTElNSVRfTEJOIDE2CisjZGVmaW5lIEZDTl9VRFBfV0lMRF9TUkNIX0xJTUlUX1dJRFRIIDgKKyNkZWZpbmUgRkNOX1RDUF9XSUxEX1NSQ0hfTElNSVRfTEJOIDgKKyNkZWZpbmUgRkNOX1RDUF9XSUxEX1NSQ0hfTElNSVRfV0lEVEggOAorI2RlZmluZSBGQ05fVENQX0ZVTExfU1JDSF9MSU1JVF9MQk4gMAorI2RlZmluZSBGQ05fVENQX0ZVTExfU1JDSF9MSU1JVF9XSURUSCA4CisKKy8qIFJYIHF1ZXVlIGZsdXNoIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9SWF9GTFVTSF9ERVNDUV9SRUdfS0VSIDB4MDgyMAorI2RlZmluZSBGQ05fUlhfRkxVU0hfREVTQ1FfQ01EX0xCTiAyNAorI2RlZmluZSBGQ05fUlhfRkxVU0hfREVTQ1FfQ01EX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1JYX0ZMVVNIX0RFU0NRX0xCTiAwCisjZGVmaW5lIEZDTl9SWF9GTFVTSF9ERVNDUV9XSURUSCAxMgorCisvKiBSZWNlaXZlIGRlc2NyaXB0b3IgdXBkYXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9SWF9ERVNDX1VQRF9SRUdfS0VSIDB4MDgzMAorI2RlZmluZSBGQ05fUlhfREVTQ19XUFRSX0xCTiA5NgorI2RlZmluZSBGQ05fUlhfREVTQ19XUFRSX1dJRFRIIDEyCisjZGVmaW5lIEZDTl9SWF9ERVNDX1VQRF9SRUdfS0VSX0RXT1JEICggRkNOX1JYX0RFU0NfVVBEX1JFR19LRVIgKyAxMiApCisjZGVmaW5lIEZDTl9SWF9ERVNDX1dQVFJfRFdPUkRfTEJOIDAKKyNkZWZpbmUgRkNOX1JYX0RFU0NfV1BUUl9EV09SRF9XSURUSCAxMgorCisvKiBSZWNlaXZlIGRlc2NyaXB0b3IgY2FjaGUgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBGQ05fUlhfRENfQ0ZHX1JFR19LRVIgMHg4NDAKKyNkZWZpbmUgRkNOX1JYX0RDX1NJWkVfTEJOIDAKKyNkZWZpbmUgRkNOX1JYX0RDX1NJWkVfV0lEVEggMgorCisjZGVmaW5lIEZDTl9SWF9TRUxGX1JTVF9SRUdfS0VSIDB4ODkwCisjZGVmaW5lIEZDTl9SWF9JU0NTSV9ESVNfTEJOIDE3CisjZGVmaW5lIEZDTl9SWF9JU0NTSV9ESVNfV0lEVEggMQorI2RlZmluZSBGQ05fUlhfTk9ERVNDX1dBSVRfRElTX0xCTiA5CisjZGVmaW5lIEZDTl9SWF9OT0RFU0NfV0FJVF9ESVNfV0lEVEggMQorI2RlZmluZSBGQ05fUlhfUkVDT1ZFUllfRU5fTEJOIDgKKyNkZWZpbmUgRkNOX1JYX1JFQ09WRVJZX0VOX1dJRFRIIDEKKworLyogVFggcXVldWUgZmx1c2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX1RYX0ZMVVNIX0RFU0NRX1JFR19LRVIgMHgwYTAwCisjZGVmaW5lIEZDTl9UWF9GTFVTSF9ERVNDUV9DTURfTEJOIDEyCisjZGVmaW5lIEZDTl9UWF9GTFVTSF9ERVNDUV9DTURfV0lEVEggMQorI2RlZmluZSBGQ05fVFhfRkxVU0hfREVTQ1FfTEJOIDAKKyNkZWZpbmUgRkNOX1RYX0ZMVVNIX0RFU0NRX1dJRFRIIDEyCisKKy8qIFRyYW5zbWl0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMiAqLworI2RlZmluZSBGQ05fVFhfQ0ZHMl9SRUdfS0VSIDB4YTgwCisjZGVmaW5lIEZDTl9UWF9ESVNfTk9OX0lQX0VWX0xCTiAxNworI2RlZmluZSBGQ05fVFhfRElTX05PTl9JUF9FVl9XSURUSCAxCisKKy8qIFRyYW5zbWl0IGRlc2NyaXB0b3IgdXBkYXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9UWF9ERVNDX1VQRF9SRUdfS0VSIDB4MGExMAorI2RlZmluZSBGQ05fVFhfREVTQ19XUFRSX0xCTiA5NgorI2RlZmluZSBGQ05fVFhfREVTQ19XUFRSX1dJRFRIIDEyCisjZGVmaW5lIEZDTl9UWF9ERVNDX1VQRF9SRUdfS0VSX0RXT1JEICggRkNOX1RYX0RFU0NfVVBEX1JFR19LRVIgKyAxMiApCisjZGVmaW5lIEZDTl9UWF9ERVNDX1dQVFJfRFdPUkRfTEJOIDAKKyNkZWZpbmUgRkNOX1RYX0RFU0NfV1BUUl9EV09SRF9XSURUSCAxMgorCisvKiBUcmFuc21pdCBkZXNjcmlwdG9yIGNhY2hlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX1RYX0RDX0NGR19SRUdfS0VSIDB4YTIwCisjZGVmaW5lIEZDTl9UWF9EQ19TSVpFX0xCTiAwCisjZGVmaW5lIEZDTl9UWF9EQ19TSVpFX1dJRFRIIDIKKworLyogUEhZIG1hbmFnZW1lbnQgdHJhbnNtaXQgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBGQ05fTURfVFhEX1JFR19LRVIgMHhjMDAKKyNkZWZpbmUgRkNOX01EX1RYRF9MQk4gMAorI2RlZmluZSBGQ05fTURfVFhEX1dJRFRIIDE2CisKKy8qIFBIWSBtYW5hZ2VtZW50IHJlY2VpdmUgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBGQ05fTURfUlhEX1JFR19LRVIgMHhjMTAKKyNkZWZpbmUgRkNOX01EX1JYRF9MQk4gMAorI2RlZmluZSBGQ05fTURfUlhEX1dJRFRIIDE2CisKKy8qIFBIWSBtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb24gJiBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX01EX0NTX1JFR19LRVIgMHhjMjAKKyNkZWZpbmUgRkNOX01EX0dDX0xCTiA0CisjZGVmaW5lIEZDTl9NRF9HQ19XSURUSCAxCisjZGVmaW5lIEZDTl9NRF9SSUNfTEJOIDIKKyNkZWZpbmUgRkNOX01EX1JJQ19XSURUSCAxCisjZGVmaW5lIEZDTl9NRF9SRENfTEJOIDEKKyNkZWZpbmUgRkNOX01EX1JEQ19XSURUSCAxCisjZGVmaW5lIEZDTl9NRF9XUkNfTEJOIDAKKyNkZWZpbmUgRkNOX01EX1dSQ19XSURUSCAxCisKKy8qIFBIWSBtYW5hZ2VtZW50IFBIWSBhZGRyZXNzIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9NRF9QSFlfQURSX1JFR19LRVIgMHhjMzAKKyNkZWZpbmUgRkNOX01EX1BIWV9BRFJfTEJOIDAKKyNkZWZpbmUgRkNOX01EX1BIWV9BRFJfV0lEVEggMTYKKworLyogUEhZIG1hbmFnZW1lbnQgSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX01EX0lEX1JFR19LRVIgMHhjNDAKKyNkZWZpbmUgRkNOX01EX1BSVF9BRFJfTEJOIDExCisjZGVmaW5lIEZDTl9NRF9QUlRfQURSX1dJRFRIIDUKKyNkZWZpbmUgRkNOX01EX0RFVl9BRFJfTEJOIDYKKyNkZWZpbmUgRkNOX01EX0RFVl9BRFJfV0lEVEggNQorCisvKiBQSFkgbWFuYWdlbWVudCBzdGF0dXMgJiBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9NRF9TVEFUX1JFR19LRVIgMHhjNTAKKyNkZWZpbmUgRkNOX01EX1BJTlRfTEJOIDQKKyNkZWZpbmUgRkNOX01EX1BJTlRfV0lEVEggMQorI2RlZmluZSBGQ05fTURfRE9ORV9MQk4gMworI2RlZmluZSBGQ05fTURfRE9ORV9XSURUSCAxCisjZGVmaW5lIEZDTl9NRF9CU0VSUl9MQk4gMgorI2RlZmluZSBGQ05fTURfQlNFUlJfV0lEVEggMQorI2RlZmluZSBGQ05fTURfTE5GTF9MQk4gMQorI2RlZmluZSBGQ05fTURfTE5GTF9XSURUSCAxCisjZGVmaW5lIEZDTl9NRF9CU1lfTEJOIDAKKyNkZWZpbmUgRkNOX01EX0JTWV9XSURUSCAxCisKKy8qIFBvcnQgMCBhbmQgMSBNQUMgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRkNOX01BQzBfQ1RSTF9SRUdfS0VSIDB4YzgwCisjZGVmaW5lIEZDTl9NQUMxX0NUUkxfUkVHX0tFUiAweGM5MAorI2RlZmluZSBGQ05fTUFDX1hPRkZfVkFMX0xCTiAxNgorI2RlZmluZSBGQ05fTUFDX1hPRkZfVkFMX1dJRFRIIDE2CisjZGVmaW5lIEZDTl9NQUNfQkNBRF9BQ1BUX0xCTiA0CisjZGVmaW5lIEZDTl9NQUNfQkNBRF9BQ1BUX1dJRFRIIDEKKyNkZWZpbmUgRkNOX01BQ19VQ19QUk9NX0xCTiAzCisjZGVmaW5lIEZDTl9NQUNfVUNfUFJPTV9XSURUSCAxCisjZGVmaW5lIEZDTl9NQUNfTElOS19TVEFUVVNfTEJOIDIKKyNkZWZpbmUgRkNOX01BQ19MSU5LX1NUQVRVU19XSURUSCAxCisjZGVmaW5lIEZDTl9NQUNfU1BFRURfTEJOIDAKKyNkZWZpbmUgRkNOX01BQ19TUEVFRF9XSURUSCAyCisKKy8qIDEwR2lnIFhhdWkgWEdYUyBEZWZhdWx0IFZhbHVlcyAgKi8KKyNkZWZpbmUgWFhfVFhEUlZfREVRX0RFRkFVTFQgMHhlIC8qIGRlcT0uNiAqLworI2RlZmluZSBYWF9UWERSVl9EVFhfREVGQVVMVCAweDUgLyogMS4yNSAqLworI2RlZmluZSBYWF9TRF9DVExfRFJWX0RFRkFVTFQgMCAgLyogMjBtQSAqLworCisvKiBHTUFDIHJlZ2lzdGVycyAqLworI2RlZmluZSBGQUxDT05fR01BQ19SRUdCQU5LIDB4ZTAwCisjZGVmaW5lIEZBTENPTl9HTUFDX1JFR0JBTktfU0laRSAweDIwMAorI2RlZmluZSBGQUxDT05fR01BQ19SRUdfU0laRSAweDEwCisKKy8qIFhHTUFDIHJlZ2lzdGVycyAqLworI2RlZmluZSBGQUxDT05fWE1BQ19SRUdCQU5LIDB4MTIwMAorI2RlZmluZSBGQUxDT05fWE1BQ19SRUdCQU5LX1NJWkUgMHgyMDAKKyNkZWZpbmUgRkFMQ09OX1hNQUNfUkVHX1NJWkUgMHgxMAorCisvKiBYR01BQyBhZGRyZXNzIHJlZ2lzdGVyIGxvdyAqLworI2RlZmluZSBGQ05fWE1fQURSX0xPX1JFR19NQUMgMHgwMAorI2RlZmluZSBGQ05fWE1fQURSXzNfTEJOIDI0CisjZGVmaW5lIEZDTl9YTV9BRFJfM19XSURUSCA4CisjZGVmaW5lIEZDTl9YTV9BRFJfMl9MQk4gMTYKKyNkZWZpbmUgRkNOX1hNX0FEUl8yX1dJRFRIIDgKKyNkZWZpbmUgRkNOX1hNX0FEUl8xX0xCTiA4CisjZGVmaW5lIEZDTl9YTV9BRFJfMV9XSURUSCA4CisjZGVmaW5lIEZDTl9YTV9BRFJfMF9MQk4gMAorI2RlZmluZSBGQ05fWE1fQURSXzBfV0lEVEggOAorCisvKiBYR01BQyBhZGRyZXNzIHJlZ2lzdGVyIGhpZ2ggKi8KKyNkZWZpbmUgRkNOX1hNX0FEUl9ISV9SRUdfTUFDIDB4MDEKKyNkZWZpbmUgRkNOX1hNX0FEUl81X0xCTiA4CisjZGVmaW5lIEZDTl9YTV9BRFJfNV9XSURUSCA4CisjZGVmaW5lIEZDTl9YTV9BRFJfNF9MQk4gMAorI2RlZmluZSBGQ05fWE1fQURSXzRfV0lEVEggOAorCisvKiBYR01BQyBnbG9iYWwgY29uZmlndXJhdGlvbiAtIHBvcnQgMCovCisjZGVmaW5lIEZDTl9YTV9HTEJfQ0ZHX1JFR19NQUMgMHgwMgorI2RlZmluZSBGQ05fWE1fUlhfU1RBVF9FTl9MQk4gMTEKKyNkZWZpbmUgRkNOX1hNX1JYX1NUQVRfRU5fV0lEVEggMQorI2RlZmluZSBGQ05fWE1fVFhfU1RBVF9FTl9MQk4gMTAKKyNkZWZpbmUgRkNOX1hNX1RYX1NUQVRfRU5fV0lEVEggMQorI2RlZmluZSBGQ05fWE1fUlhfSlVNQk9fTU9ERV9MQk4gNgorI2RlZmluZSBGQ05fWE1fUlhfSlVNQk9fTU9ERV9XSURUSCAxCisjZGVmaW5lIEZDTl9YTV9DT1JFX1JTVF9MQk4gMAorI2RlZmluZSBGQ05fWE1fQ09SRV9SU1RfV0lEVEggMQorCisvKiBYR01BQyB0cmFuc21pdCBjb25maWd1cmF0aW9uIC0gcG9ydCAwICovCisjZGVmaW5lIEZDTl9YTV9UWF9DRkdfUkVHX01BQyAweDAzCisjZGVmaW5lIEZDTl9YTV9JUEdfTEJOIDE2CisjZGVmaW5lIEZDTl9YTV9JUEdfV0lEVEggNAorI2RlZmluZSBGQ05fWE1fRkNOVExfTEJOIDEwCisjZGVmaW5lIEZDTl9YTV9GQ05UTF9XSURUSCAxCisjZGVmaW5lIEZDTl9YTV9UWENSQ19MQk4gOAorI2RlZmluZSBGQ05fWE1fVFhDUkNfV0lEVEggMQorI2RlZmluZSBGQ05fWE1fQVVUT19QQURfTEJOIDUKKyNkZWZpbmUgRkNOX1hNX0FVVE9fUEFEX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1hNX1RYX1BSTUJMX0xCTiAyCisjZGVmaW5lIEZDTl9YTV9UWF9QUk1CTF9XSURUSCAxCisjZGVmaW5lIEZDTl9YTV9UWEVOX0xCTiAxCisjZGVmaW5lIEZDTl9YTV9UWEVOX1dJRFRIIDEKKworLyogWEdNQUMgcmVjZWl2ZSBjb25maWd1cmF0aW9uIC0gcG9ydCAwICovCisjZGVmaW5lIEZDTl9YTV9SWF9DRkdfUkVHX01BQyAweDA0CisjZGVmaW5lIEZDTl9YTV9QQVNTX0NSQ19FUlJfTEJOIDI1CisjZGVmaW5lIEZDTl9YTV9QQVNTX0NSQ19FUlJfV0lEVEggMQorI2RlZmluZSBGQ05fWE1fQVVUT19ERVBBRF9MQk4gOAorI2RlZmluZSBGQ05fWE1fQVVUT19ERVBBRF9XSURUSCAxCisjZGVmaW5lIEZDTl9YTV9SWEVOX0xCTiAxCisjZGVmaW5lIEZDTl9YTV9SWEVOX1dJRFRIIDEKKworLyogWEdNQUMgbWFuYWdlbWVudCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBGQ05fWE1fTUdUX0lOVF9NU0tfUkVHX01BQ19CMCAweDUKKyNkZWZpbmUgRkNOX1hNX01TS19QUk1CTEVfRVJSX0xCTiAyCisjZGVmaW5lIEZDTl9YTV9NU0tfUFJNQkxFX0VSUl9XSURUSCAxCisjZGVmaW5lIEZDTl9YTV9NU0tfUk1URkxUX0xCTiAxCisjZGVmaW5lIEZDTl9YTV9NU0tfUk1URkxUX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1hNX01TS19MQ0xGTFRfTEJOIDAKKyNkZWZpbmUgRkNOX1hNX01TS19MQ0xGTFRfV0lEVEggMQorCisvKiBYR01BQyBmbG93IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX1hNX0ZDX1JFR19NQUMgMHg3CisjZGVmaW5lIEZDTl9YTV9QQVVTRV9USU1FX0xCTiAxNgorI2RlZmluZSBGQ05fWE1fUEFVU0VfVElNRV9XSURUSCAxNgorI2RlZmluZSBGQ05fWE1fRElTX0ZDTlRMX0xCTiAwCisjZGVmaW5lIEZDTl9YTV9ESVNfRkNOVExfV0lEVEggMQorCisvKiBYR01BQyB0cmFuc21pdCBwYXJhbWV0ZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX1hNX1RYX1BBUkFNX1JFR19NQUMgMHgwZAorI2RlZmluZSBGQ05fWE1fVFhfSlVNQk9fTU9ERV9MQk4gMzEKKyNkZWZpbmUgRkNOX1hNX1RYX0pVTUJPX01PREVfV0lEVEggMQorI2RlZmluZSBGQ05fWE1fTUFYX1RYX0ZSTV9TSVpFX0xCTiAxNgorI2RlZmluZSBGQ05fWE1fTUFYX1RYX0ZSTV9TSVpFX1dJRFRIIDE0CisjZGVmaW5lIEZDTl9YTV9BQ1BUX0FMTF9NQ0FTVF9MQk4gMTEKKyNkZWZpbmUgRkNOX1hNX0FDUFRfQUxMX01DQVNUX1dJRFRIIDEKKworLyogWEdNQUMgcmVjZWl2ZSBwYXJhbWV0ZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX1hNX1JYX1BBUkFNX1JFR19NQUMgMHgwZQorI2RlZmluZSBGQ05fWE1fTUFYX1JYX0ZSTV9TSVpFX0xCTiAwCisjZGVmaW5lIEZDTl9YTV9NQVhfUlhfRlJNX1NJWkVfV0lEVEggMTQKKworLyogWEdNQUMgbWFuYWdlbWVudCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9YTV9NR1RfSU5UX1JFR19NQUNfQjAgMHgwZgorI2RlZmluZSBGQ05fWE1fUFJNQkxFX0VSUiAyCisjZGVmaW5lIEZDTl9YTV9QUk1CTEVfV0lEVEggMQorI2RlZmluZSBGQ05fWE1fUk1URkxUX0xCTiAxCisjZGVmaW5lIEZDTl9YTV9STVRGTFRfV0lEVEggMQorI2RlZmluZSBGQ05fWE1fTENMRkxUX0xCTiAwCisjZGVmaW5lIEZDTl9YTV9MQ0xGTFRfV0lEVEggMQorCisvKiBYQVVJIFhHWFMgY29yZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX1hYX0FMSUdOX0RPTkVfTEJOIDIwCisjZGVmaW5lIEZDTl9YWF9BTElHTl9ET05FX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1hYX0NPUkVfU1RBVF9SRUdfTUFDIDB4MTYKKyNkZWZpbmUgRkNOX1hYX1NZTkNfU1RBVF9MQk4gMTYKKyNkZWZpbmUgRkNOX1hYX1NZTkNfU1RBVF9XSURUSCA0CisjZGVmaW5lIEZDTl9YWF9TWU5DX1NUQVRfREVDT0RFX1NZTkNFRCAweGYKKyNkZWZpbmUgRkNOX1hYX0NPTU1BX0RFVF9MQk4gMTIKKyNkZWZpbmUgRkNOX1hYX0NPTU1BX0RFVF9XSURUSCA0CisjZGVmaW5lIEZDTl9YWF9DT01NQV9ERVRfUkVTRVQgMHhmCisjZGVmaW5lIEZDTl9YWF9DSEFSRVJSX0xCTiA0CisjZGVmaW5lIEZDTl9YWF9DSEFSRVJSX1dJRFRIIDQKKyNkZWZpbmUgRkNOX1hYX0NIQVJFUlJfUkVTRVQgMHhmCisjZGVmaW5lIEZDTl9YWF9ESVNQRVJSX0xCTiAwCisjZGVmaW5lIEZDTl9YWF9ESVNQRVJSX1dJRFRIIDQKKyNkZWZpbmUgRkNOX1hYX0RJU1BFUlJfUkVTRVQgMHhmCisKKy8qIFhHWFMvWEFVSSBwb3dlcmRvd24vcmVzZXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNOX1hYX1BXUl9SU1RfUkVHX01BQyAweDEwCisjZGVmaW5lIEZDTl9YWF9QV1JETkRfRU5fTEJOIDE1CisjZGVmaW5lIEZDTl9YWF9QV1JETkRfRU5fV0lEVEggMQorI2RlZmluZSBGQ05fWFhfUFdSRE5DX0VOX0xCTiAxNAorI2RlZmluZSBGQ05fWFhfUFdSRE5DX0VOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1hYX1BXUkROQl9FTl9MQk4gMTMKKyNkZWZpbmUgRkNOX1hYX1BXUkROQl9FTl9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9QV1JETkFfRU5fTEJOIDEyCisjZGVmaW5lIEZDTl9YWF9QV1JETkFfRU5fV0lEVEggMQorI2RlZmluZSBGQ05fWFhfUlNUUExMQ0RfRU5fTEJOIDkKKyNkZWZpbmUgRkNOX1hYX1JTVFBMTENEX0VOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1hYX1JTVFBMTEFCX0VOX0xCTiA4CisjZGVmaW5lIEZDTl9YWF9SU1RQTExBQl9FTl9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9SRVNFVERfRU5fTEJOIDcKKyNkZWZpbmUgRkNOX1hYX1JFU0VURF9FTl9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9SRVNFVENfRU5fTEJOIDYKKyNkZWZpbmUgRkNOX1hYX1JFU0VUQ19FTl9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9SRVNFVEJfRU5fTEJOIDUKKyNkZWZpbmUgRkNOX1hYX1JFU0VUQl9FTl9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9SRVNFVEFfRU5fTEJOIDQKKyNkZWZpbmUgRkNOX1hYX1JFU0VUQV9FTl9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9SU1RYR1hTUlhfRU5fTEJOIDIKKyNkZWZpbmUgRkNOX1hYX1JTVFhHWFNSWF9FTl9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9SU1RYR1hTVFhfRU5fTEJOIDEKKyNkZWZpbmUgRkNOX1hYX1JTVFhHWFNUWF9FTl9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9SU1RfWFhfRU5fTEJOIDAKKyNkZWZpbmUgRkNOX1hYX1JTVF9YWF9FTl9XSURUSCAxCisKKworLyogWEdYUy9YQVVJIHBvd2VyZG93bi9yZXNldCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEZDTl9YWF9TRF9DVExfUkVHX01BQyAweDExCisjZGVmaW5lIEZDTl9YWF9URVJNQURKMV9MQk4gMTcKKyNkZWZpbmUgRkNOX1hYX1RFUk1BREoxX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1hYX1RFUk1BREowX0xCTiAxNgorI2RlZmluZSBGQ05fWFhfVEVSTUFESjBfV0lEVEggMQorI2RlZmluZSBGQ05fWFhfSElEUlZEX0xCTiAxNQorI2RlZmluZSBGQ05fWFhfSElEUlZEX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1hYX0xPRFJWRF9MQk4gMTQKKyNkZWZpbmUgRkNOX1hYX0xPRFJWRF9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9ISURSVkNfTEJOIDEzCisjZGVmaW5lIEZDTl9YWF9ISURSVkNfV0lEVEggMQorI2RlZmluZSBGQ05fWFhfTE9EUlZDX0xCTiAxMgorI2RlZmluZSBGQ05fWFhfTE9EUlZDX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1hYX0hJRFJWQl9MQk4gMTEKKyNkZWZpbmUgRkNOX1hYX0hJRFJWQl9XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9MT0RSVkJfTEJOIDEwCisjZGVmaW5lIEZDTl9YWF9MT0RSVkJfV0lEVEggMQorI2RlZmluZSBGQ05fWFhfSElEUlZBX0xCTiA5CisjZGVmaW5lIEZDTl9YWF9ISURSVkFfV0lEVEggMQorI2RlZmluZSBGQ05fWFhfTE9EUlZBX0xCTiA4CisjZGVmaW5lIEZDTl9YWF9MT0RSVkFfV0lEVEggMQorI2RlZmluZSBGQ05fWFhfTFBCS0RfTEJOIDMKKyNkZWZpbmUgRkNOX1hYX0xQQktEX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1hYX0xQQktDX0xCTiAyCisjZGVmaW5lIEZDTl9YWF9MUEJLQ19XSURUSCAxCisjZGVmaW5lIEZDTl9YWF9MUEJLQl9MQk4gMQorI2RlZmluZSBGQ05fWFhfTFBCS0JfV0lEVEggMQorI2RlZmluZSBGQ05fWFhfTFBCS0FfTEJOIDAKKyNkZWZpbmUgRkNOX1hYX0xQQktBX1dJRFRIIDEKKworI2RlZmluZSBGQ05fWFhfVFhEUlZfQ1RMX1JFR19NQUMgMHgxMgorI2RlZmluZSBGQ05fWFhfREVRRF9MQk4gMjgKKyNkZWZpbmUgRkNOX1hYX0RFUURfV0lEVEggNAorI2RlZmluZSBGQ05fWFhfREVRQ19MQk4gMjQKKyNkZWZpbmUgRkNOX1hYX0RFUUNfV0lEVEggNAorI2RlZmluZSBGQ05fWFhfREVRQl9MQk4gMjAKKyNkZWZpbmUgRkNOX1hYX0RFUUJfV0lEVEggNAorI2RlZmluZSBGQ05fWFhfREVRQV9MQk4gMTYKKyNkZWZpbmUgRkNOX1hYX0RFUUFfV0lEVEggNAorI2RlZmluZSBGQ05fWFhfRFRYRF9MQk4gMTIKKyNkZWZpbmUgRkNOX1hYX0RUWERfV0lEVEggNAorI2RlZmluZSBGQ05fWFhfRFRYQ19MQk4gOAorI2RlZmluZSBGQ05fWFhfRFRYQ19XSURUSCA0CisjZGVmaW5lIEZDTl9YWF9EVFhCX0xCTiA0CisjZGVmaW5lIEZDTl9YWF9EVFhCX1dJRFRIIDQKKyNkZWZpbmUgRkNOX1hYX0RUWEFfTEJOIDAKKyNkZWZpbmUgRkNOX1hYX0RUWEFfV0lEVEggNAorCisvKiBSZWNlaXZlIGZpbHRlciB0YWJsZSAqLworI2RlZmluZSBGQ05fUlhfRklMVEVSX1RCTDAgMHhGMDAwMDAgCisKKy8qIFJlY2VpdmUgZGVzY3JpcHRvciBwb2ludGVyIHRhYmxlICovCisjZGVmaW5lIEZDTl9SWF9ERVNDX1BUUl9UQkxfS0VSX0ExIDB4MTE4MDAKKyNkZWZpbmUgRkNOX1JYX0RFU0NfUFRSX1RCTF9LRVJfQjAgMHhGNDAwMDAKKyNkZWZpbmUgRkNOX1JYX0lTQ1NJX0RESUdfRU5fTEJOIDg4CisjZGVmaW5lIEZDTl9SWF9JU0NTSV9ERElHX0VOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1JYX0lTQ1NJX0hESUdfRU5fTEJOIDg3CisjZGVmaW5lIEZDTl9SWF9JU0NTSV9IRElHX0VOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1JYX0RFU0NRX0JVRl9CQVNFX0lEX0xCTiAzNgorI2RlZmluZSBGQ05fUlhfREVTQ1FfQlVGX0JBU0VfSURfV0lEVEggMjAKKyNkZWZpbmUgRkNOX1JYX0RFU0NRX0VWUV9JRF9MQk4gMjQKKyNkZWZpbmUgRkNOX1JYX0RFU0NRX0VWUV9JRF9XSURUSCAxMgorI2RlZmluZSBGQ05fUlhfREVTQ1FfT1dORVJfSURfTEJOIDEwCisjZGVmaW5lIEZDTl9SWF9ERVNDUV9PV05FUl9JRF9XSURUSCAxNAorI2RlZmluZSBGQ05fUlhfREVTQ1FfU0laRV9MQk4gMworI2RlZmluZSBGQ05fUlhfREVTQ1FfU0laRV9XSURUSCAyCisjZGVmaW5lIEZDTl9SWF9ERVNDUV9TSVpFXzRLIDMKKyNkZWZpbmUgRkNOX1JYX0RFU0NRX1NJWkVfMksgMgorI2RlZmluZSBGQ05fUlhfREVTQ1FfU0laRV8xSyAxCisjZGVmaW5lIEZDTl9SWF9ERVNDUV9TSVpFXzUxMiAwCisjZGVmaW5lIEZDTl9SWF9ERVNDUV9UWVBFX0xCTiAyCisjZGVmaW5lIEZDTl9SWF9ERVNDUV9UWVBFX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1JYX0RFU0NRX0pVTUJPX0xCTiAxCisjZGVmaW5lIEZDTl9SWF9ERVNDUV9KVU1CT19XSURUSCAxCisjZGVmaW5lIEZDTl9SWF9ERVNDUV9FTl9MQk4gMAorI2RlZmluZSBGQ05fUlhfREVTQ1FfRU5fV0lEVEggMQorCisvKiBUcmFuc21pdCBkZXNjcmlwdG9yIHBvaW50ZXIgdGFibGUgKi8KKyNkZWZpbmUgRkNOX1RYX0RFU0NfUFRSX1RCTF9LRVJfQTEgMHgxMTkwMAorI2RlZmluZSBGQ05fVFhfREVTQ19QVFJfVEJMX0tFUl9CMCAweEY1MDAwMAorI2RlZmluZSBGQ05fVFhfTk9OX0lQX0RST1BfRElTX0IwX0xCTiA5MQorI2RlZmluZSBGQ05fVFhfTk9OX0lQX0RST1BfRElTX0IwX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1RYX0RFU0NRX0VOX0xCTiA4OAorI2RlZmluZSBGQ05fVFhfREVTQ1FfRU5fV0lEVEggMQorI2RlZmluZSBGQ05fVFhfSVNDU0lfRERJR19FTl9MQk4gODcKKyNkZWZpbmUgRkNOX1RYX0lTQ1NJX0RESUdfRU5fV0lEVEggMQorI2RlZmluZSBGQ05fVFhfSVNDU0lfSERJR19FTl9MQk4gODYKKyNkZWZpbmUgRkNOX1RYX0lTQ1NJX0hESUdfRU5fV0lEVEggMQorI2RlZmluZSBGQ05fVFhfREVTQ1FfQlVGX0JBU0VfSURfTEJOIDM2CisjZGVmaW5lIEZDTl9UWF9ERVNDUV9CVUZfQkFTRV9JRF9XSURUSCAyMAorI2RlZmluZSBGQ05fVFhfREVTQ1FfRVZRX0lEX0xCTiAyNAorI2RlZmluZSBGQ05fVFhfREVTQ1FfRVZRX0lEX1dJRFRIIDEyCisjZGVmaW5lIEZDTl9UWF9ERVNDUV9PV05FUl9JRF9MQk4gMTAKKyNkZWZpbmUgRkNOX1RYX0RFU0NRX09XTkVSX0lEX1dJRFRIIDE0CisjZGVmaW5lIEZDTl9UWF9ERVNDUV9TSVpFX0xCTiAzCisjZGVmaW5lIEZDTl9UWF9ERVNDUV9TSVpFX1dJRFRIIDIKKyNkZWZpbmUgRkNOX1RYX0RFU0NRX1NJWkVfNEsgMworI2RlZmluZSBGQ05fVFhfREVTQ1FfU0laRV8ySyAyCisjZGVmaW5lIEZDTl9UWF9ERVNDUV9TSVpFXzFLIDEKKyNkZWZpbmUgRkNOX1RYX0RFU0NRX1NJWkVfNTEyIDAKKyNkZWZpbmUgRkNOX1RYX0RFU0NRX1RZUEVfTEJOIDEKKyNkZWZpbmUgRkNOX1RYX0RFU0NRX1RZUEVfV0lEVEggMgorI2RlZmluZSBGQ05fVFhfREVTQ1FfRkxVU0hfTEJOIDAKKyNkZWZpbmUgRkNOX1RYX0RFU0NRX0ZMVVNIX1dJRFRIIDEKKworLyogRXZlbnQgcXVldWUgcG9pbnRlciAqLworI2RlZmluZSBGQ05fRVZRX1BUUl9UQkxfS0VSX0ExIDB4MTFhMDAKKyNkZWZpbmUgRkNOX0VWUV9QVFJfVEJMX0tFUl9CMCAweGY2MDAwMAorI2RlZmluZSBGQ05fRVZRX0VOX0xCTiAyMworI2RlZmluZSBGQ05fRVZRX0VOX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0VWUV9TSVpFX0xCTiAyMAorI2RlZmluZSBGQ05fRVZRX1NJWkVfV0lEVEggMworI2RlZmluZSBGQ05fRVZRX1NJWkVfMzJLIDYKKyNkZWZpbmUgRkNOX0VWUV9TSVpFXzE2SyA1CisjZGVmaW5lIEZDTl9FVlFfU0laRV84SyA0CisjZGVmaW5lIEZDTl9FVlFfU0laRV80SyAzCisjZGVmaW5lIEZDTl9FVlFfU0laRV8ySyAyCisjZGVmaW5lIEZDTl9FVlFfU0laRV8xSyAxCisjZGVmaW5lIEZDTl9FVlFfU0laRV81MTIgMAorI2RlZmluZSBGQ05fRVZRX0JVRl9CQVNFX0lEX0xCTiAwCisjZGVmaW5lIEZDTl9FVlFfQlVGX0JBU0VfSURfV0lEVEggMjAKKworLyogUlNTIGluZGlyZWN0aW9uIHRhYmxlICovCisjZGVmaW5lIEZDTl9SWF9SU1NfSU5ESVJfVEJMX0IwIDB4RkIwMDAwCisKKy8qIEV2ZW50IHF1ZXVlIHJlYWQgcG9pbnRlciAqLworI2RlZmluZSBGQ05fRVZRX1JQVFJfUkVHX0tFUl9BMSAweDExYjAwCisjZGVmaW5lIEZDTl9FVlFfUlBUUl9SRUdfS0VSX0IwIDB4ZmEwMDAwCisjZGVmaW5lIEZDTl9FVlFfUlBUUl9MQk4gMAorI2RlZmluZSBGQ05fRVZRX1JQVFJfV0lEVEggMTQKKyNkZWZpbmUgRkNOX0VWUV9SUFRSX1JFR19LRVJfRFdPUkRfQTEgKCBGQ05fRVZRX1JQVFJfUkVHX0tFUl9BMSArIDAgKQorI2RlZmluZSBGQ05fRVZRX1JQVFJfUkVHX0tFUl9EV09SRF9CMCAoIEZDTl9FVlFfUlBUUl9SRUdfS0VSX0IwICsgMCApCisjZGVmaW5lIEZDTl9FVlFfUlBUUl9EV09SRF9MQk4gMAorI2RlZmluZSBGQ05fRVZRX1JQVFJfRFdPUkRfV0lEVEggMTQKKworLyogU3BlY2lhbCBidWZmZXIgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgRkNOX0JVRl9GVUxMX1RCTF9LRVJfQTEgMHgxODAwMAorI2RlZmluZSBGQ05fQlVGX0ZVTExfVEJMX0tFUl9CMCAweDgwMDAwMAorI2RlZmluZSBGQ05fSVBfREFUX0JVRl9TSVpFX0xCTiA1MAorI2RlZmluZSBGQ05fSVBfREFUX0JVRl9TSVpFX1dJRFRIIDEKKyNkZWZpbmUgRkNOX0lQX0RBVF9CVUZfU0laRV84SyAxCisjZGVmaW5lIEZDTl9JUF9EQVRfQlVGX1NJWkVfNEsgMAorI2RlZmluZSBGQ05fQlVGX0FEUl9GQlVGX0xCTiAxNAorI2RlZmluZSBGQ05fQlVGX0FEUl9GQlVGX1dJRFRIIDM0CisjZGVmaW5lIEZDTl9CVUZfT1dORVJfSURfRkJVRl9MQk4gMAorI2RlZmluZSBGQ05fQlVGX09XTkVSX0lEX0ZCVUZfV0lEVEggMTQKKworLyoqIE9mZnNldCBvZiBhIEdNQUMgcmVnaXN0ZXIgd2l0aGluIEZhbGNvbiAqLworI2RlZmluZSBGQUxDT05fR01BQ19SRUcoIGVmYWIsIG1hY19yZWcgKQkJCQlcCisJKCBGQUxDT05fR01BQ19SRUdCQU5LICsJCQkJCVwKKwkgICggKG1hY19yZWcpICogRkFMQ09OX0dNQUNfUkVHX1NJWkUgKSApCisKKy8qKiBPZmZzZXQgb2YgYW4gWE1BQyByZWdpc3RlciB3aXRoaW4gRmFsY29uICovCisjZGVmaW5lIEZBTENPTl9YTUFDX1JFRyggZWZhYl9wb3J0LCBtYWNfcmVnICkJCQlcCisJKCBGQUxDT05fWE1BQ19SRUdCQU5LICsJCQkJCVwKKwkgICggKG1hY19yZWcpICogRkFMQ09OX1hNQUNfUkVHX1NJWkUgKSApCisKKyNkZWZpbmUgRkNOX01BQ19EQVRBX0xCTiAwCisjZGVmaW5lIEZDTl9NQUNfREFUQV9XSURUSCAzMgorCisvKiBUcmFuc21pdCBkZXNjcmlwdG9yICovCisjZGVmaW5lIEZDTl9UWF9LRVJfUE9SVF9MQk4gNjMKKyNkZWZpbmUgRkNOX1RYX0tFUl9QT1JUX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1RYX0tFUl9CWVRFX0NOVF9MQk4gNDgKKyNkZWZpbmUgRkNOX1RYX0tFUl9CWVRFX0NOVF9XSURUSCAxNAorI2RlZmluZSBGQ05fVFhfS0VSX0JVRl9BRFJfTEJOIDAKKyNkZWZpbmUgRkNOX1RYX0tFUl9CVUZfQURSX1dJRFRIIEVGQUJfRE1BX1RZUEVfV0lEVEggKCA0NiApCisKKworLyogUmVjZWl2ZSBkZXNjcmlwdG9yICovCisjZGVmaW5lIEZDTl9SWF9LRVJfQlVGX1NJWkVfTEJOIDQ4CisjZGVmaW5lIEZDTl9SWF9LRVJfQlVGX1NJWkVfV0lEVEggMTQKKyNkZWZpbmUgRkNOX1JYX0tFUl9CVUZfQURSX0xCTiAwCisjZGVmaW5lIEZDTl9SWF9LRVJfQlVGX0FEUl9XSURUSCBFRkFCX0RNQV9UWVBFX1dJRFRIICggNDYgKQorCisvKiBFdmVudCBxdWV1ZSBlbnRyaWVzICovCisjZGVmaW5lIEZDTl9FVl9DT0RFX0xCTiA2MAorI2RlZmluZSBGQ05fRVZfQ09ERV9XSURUSCA0CisjZGVmaW5lIEZDTl9SWF9JUF9FVl9ERUNPREUgMAorI2RlZmluZSBGQ05fVFhfSVBfRVZfREVDT0RFIDIKKyNkZWZpbmUgRkNOX0RSSVZFUl9FVl9ERUNPREUgNQorCisvKiBSZWNlaXZlIGV2ZW50cyAqLworI2RlZmluZSBGQ05fUlhfRVZfUEtUX09LX0xCTiA1NgorI2RlZmluZSBGQ05fUlhfRVZfUEtUX09LX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1JYX1BPUlRfTEJOIDMwCisjZGVmaW5lIEZDTl9SWF9QT1JUX1dJRFRIIDEKKyNkZWZpbmUgRkNOX1JYX0VWX0JZVEVfQ05UX0xCTiAxNgorI2RlZmluZSBGQ05fUlhfRVZfQllURV9DTlRfV0lEVEggMTQKKyNkZWZpbmUgRkNOX1JYX0VWX0RFU0NfUFRSX0xCTiAwCisjZGVmaW5lIEZDTl9SWF9FVl9ERVNDX1BUUl9XSURUSCAxMgorCisvKiBUcmFuc21pdCBldmVudHMgKi8KKyNkZWZpbmUgRkNOX1RYX0VWX0RFU0NfUFRSX0xCTiAwCisjZGVmaW5lIEZDTl9UWF9FVl9ERVNDX1BUUl9XSURUSCAxMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBMb3ctbGV2ZWwgaGFyZHdhcmUgYWNjZXNzCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKKworI2RlZmluZSBGQ05fUkVWSVNJT05fUkVHKGVmYWIsIHJlZykgXAorCSggKCBlZmFiLT5wY2lfcmV2aXNpb24gPT0gRkFMQ09OX1JFVl9CMCApID8gcmVnICMjIF9CMCA6IHJlZyAjIyBfQTEgKQorCisjZGVmaW5lIEVGQUJfU0VUX09XT1JEX0ZJRUxEX1ZFUihlZmFiLCByZWcsIGZpZWxkLCB2YWwpCQkJXAorCWlmICggZWZhYi0+cGNpX3JldmlzaW9uID09IEZBTENPTl9SRVZfQjAgKQkJCVwKKwkJRUZBQl9TRVRfT1dPUkRfRklFTEQgKCByZWcsIGZpZWxkICMjIF9CMCwgdmFsICk7CVwKKwllbHNlCQkJCQkJCQlcCisJCUVGQUJfU0VUX09XT1JEX0ZJRUxEICggcmVnLCBmaWVsZCAjIyBfQTEsIHZhbCApOworCisjaWYgRkFMQ09OX1VTRV9JT19CQVIKKworLyogV3JpdGUgZHdvcmQgdmlhIHRoZSBJL08gQkFSICovCitzdGF0aWMgaW5saW5lIHZvaWQgX2ZhbGNvbl93cml0ZWwgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIsIHVpbnQzMl90IHZhbHVlLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVnICkgeworCW91dGwgKCByZWcsIGVmYWItPmlvYmFzZSArIEZDTl9JT01fSU5EX0FEUl9SRUcgKTsKKwlvdXRsICggdmFsdWUsIGVmYWItPmlvYmFzZSArIEZDTl9JT01fSU5EX0RBVF9SRUcgKTsKK30KKworLyogUmVhZCBkd29yZCB2aWEgdGhlIEkvTyBCQVIgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgX2ZhbGNvbl9yZWFkbCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlZyApIHsKKwlvdXRsICggcmVnLCBlZmFiLT5pb2Jhc2UgKyBGQ05fSU9NX0lORF9BRFJfUkVHICk7CisJcmV0dXJuIGlubCAoIGVmYWItPmlvYmFzZSArIEZDTl9JT01fSU5EX0RBVF9SRUcgKTsKK30KKworI2Vsc2UgLyogRkFMQ09OX1VTRV9JT19CQVIgKi8KKworI2RlZmluZSBfZmFsY29uX3dyaXRlbCggZWZhYiwgdmFsdWUsIHJlZyApIFwKKwl3cml0ZWwgKCAodmFsdWUpLCAoZWZhYiktPm1lbWJhc2UgKyAocmVnKSApCisjZGVmaW5lIF9mYWxjb25fcmVhZGwoIGVmYWIsIHJlZyApIHJlYWRsICggKGVmYWIpLT5tZW1iYXNlICsgKHJlZykgKQorCisjZW5kaWYgLyogRkFMQ09OX1VTRV9JT19CQVIgKi8KKworLyoqCisgKiBXcml0ZSB0byBhIEZhbGNvbiByZWdpc3RlcgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmYWxjb25fd3JpdGUgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIsIGVmYWJfb3dvcmRfdCAqdmFsdWUsIHVuc2lnbmVkIGludCByZWcgKQoreworCisJRUZBQl9SRUdEVU1QICggIldyaXRpbmcgcmVnaXN0ZXIgJXggd2l0aCAiIEVGQUJfT1dPUkRfRk1UICJcbiIsCisJCSAgICAgICByZWcsIEVGQUJfT1dPUkRfVkFMICggKnZhbHVlICkgKTsKKworCV9mYWxjb25fd3JpdGVsICggZWZhYiwgdmFsdWUtPnUzMlswXSwgcmVnICsgMCAgKTsKKwlfZmFsY29uX3dyaXRlbCAoIGVmYWIsIHZhbHVlLT51MzJbMV0sIHJlZyArIDQgICk7CisJX2ZhbGNvbl93cml0ZWwgKCBlZmFiLCB2YWx1ZS0+dTMyWzJdLCByZWcgKyA4ICApOworCXdtYigpOworCV9mYWxjb25fd3JpdGVsICggZWZhYiwgdmFsdWUtPnUzMlszXSwgcmVnICsgMTIgKTsKKwl3bWIoKTsKK30KKworLyoqCisgKiBXcml0ZSB0byBGYWxjb24gU1JBTQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmYWxjb25fd3JpdGVfc3JhbSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwgZWZhYl9xd29yZF90ICp2YWx1ZSwKKwkJICAgIHVuc2lnbmVkIGludCBpbmRleCApCit7CisJdW5zaWduZWQgaW50IHJlZyA9ICggRkNOX1JFVklTSU9OX1JFRyAoIGVmYWIsIEZDTl9CVUZfRlVMTF9UQkxfS0VSICkgKworCQkJICAgICAoIGluZGV4ICogc2l6ZW9mICggKnZhbHVlICkgKSApOworCisJRUZBQl9SRUdEVU1QICggIldyaXRpbmcgU1JBTSByZWdpc3RlciAleCB3aXRoICIgRUZBQl9RV09SRF9GTVQgIlxuIiwKKwkJICAgICAgIHJlZywgRUZBQl9RV09SRF9WQUwgKCAqdmFsdWUgKSApOworCisJX2ZhbGNvbl93cml0ZWwgKCBlZmFiLCB2YWx1ZS0+dTMyWzBdLCByZWcgKyAwICApOworCV9mYWxjb25fd3JpdGVsICggZWZhYiwgdmFsdWUtPnUzMlsxXSwgcmVnICsgNCAgKTsKKwl3bWIoKTsKK30KKworLyoqCisgKiBXcml0ZSBkd29yZCB0byBGYWxjb24gcmVnaXN0ZXIgdGhhdCBhbGxvd3MgcGFydGlhbCB3cml0ZXMKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZmFsY29uX3dyaXRlbCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwgZWZhYl9kd29yZF90ICp2YWx1ZSwgdW5zaWduZWQgaW50IHJlZyApCit7CisJRUZBQl9SRUdEVU1QICggIldyaXRpbmcgcGFydGlhbCByZWdpc3RlciAleCB3aXRoICIgRUZBQl9EV09SRF9GTVQgIlxuIiwKKwkJICAgICAgIHJlZywgRUZBQl9EV09SRF9WQUwgKCAqdmFsdWUgKSApOworCV9mYWxjb25fd3JpdGVsICggZWZhYiwgdmFsdWUtPnUzMlswXSwgcmVnICk7Cit9CisKKy8qKgorICogUmVhZCBmcm9tIGEgRmFsY29uIHJlZ2lzdGVyCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZhbGNvbl9yZWFkICggc3RydWN0IGVmYWJfbmljICplZmFiLCBlZmFiX293b3JkX3QgKnZhbHVlLCB1bnNpZ25lZCBpbnQgcmVnICkKK3sKKwl2YWx1ZS0+dTMyWzBdID0gX2ZhbGNvbl9yZWFkbCAoIGVmYWIsIHJlZyArIDAgICk7CisJd21iKCk7CisJdmFsdWUtPnUzMlsxXSA9IF9mYWxjb25fcmVhZGwgKCBlZmFiLCByZWcgKyA0ICApOworCXZhbHVlLT51MzJbMl0gPSBfZmFsY29uX3JlYWRsICggZWZhYiwgcmVnICsgOCAgKTsKKwl2YWx1ZS0+dTMyWzNdID0gX2ZhbGNvbl9yZWFkbCAoIGVmYWIsIHJlZyArIDEyICk7CisKKwlFRkFCX1JFR0RVTVAgKCAiUmVhZCBmcm9tIHJlZ2lzdGVyICV4LCBnb3QgIiBFRkFCX09XT1JEX0ZNVCAiXG4iLAorCQkgICAgICAgcmVnLCBFRkFCX09XT1JEX1ZBTCAoICp2YWx1ZSApICk7Cit9CisKKy8qKiAKKyAqIFJlYWQgZnJvbSBGYWxjb24gU1JBTQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmYWxjb25fcmVhZF9zcmFtICggc3RydWN0IGVmYWJfbmljICplZmFiLCBlZmFiX3F3b3JkX3QgKnZhbHVlLAorCQkgICB1bnNpZ25lZCBpbnQgaW5kZXggKQoreworCXVuc2lnbmVkIGludCByZWcgPSAoIEZDTl9SRVZJU0lPTl9SRUcgKCBlZmFiLCBGQ05fQlVGX0ZVTExfVEJMX0tFUiApICsKKwkJCSAgICAgKCBpbmRleCAqIHNpemVvZiAoICp2YWx1ZSApICkgKTsKKworCXZhbHVlLT51MzJbMF0gPSBfZmFsY29uX3JlYWRsICggZWZhYiwgcmVnICsgMCApOworCXZhbHVlLT51MzJbMV0gPSBfZmFsY29uX3JlYWRsICggZWZhYiwgcmVnICsgNCApOworCUVGQUJfUkVHRFVNUCAoICJSZWFkIGZyb20gU1JBTSByZWdpc3RlciAleCwgZ290ICIgRUZBQl9RV09SRF9GTVQgIlxuIiwKKwkJICAgICAgIHJlZywgRUZBQl9RV09SRF9WQUwgKCAqdmFsdWUgKSApOworfQorCisvKioKKyAqIFJlYWQgZHdvcmQgZnJvbSBhIHBvcnRpb24gb2YgYSBGYWxjb24gcmVnaXN0ZXIKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZmFsY29uX3JlYWRsICggc3RydWN0IGVmYWJfbmljICplZmFiLCBlZmFiX2R3b3JkX3QgKnZhbHVlLCB1bnNpZ25lZCBpbnQgcmVnICkKK3sKKwl2YWx1ZS0+dTMyWzBdID0gX2ZhbGNvbl9yZWFkbCAoIGVmYWIsIHJlZyApOworCUVGQUJfUkVHRFVNUCAoICJSZWFkIGZyb20gcmVnaXN0ZXIgJXgsIGdvdCAiIEVGQUJfRFdPUkRfRk1UICJcbiIsCisJCSAgICAgICByZWcsIEVGQUJfRFdPUkRfVkFMICggKnZhbHVlICkgKTsKK30KKworI2RlZmluZSBGQ05fRFVNUF9SRUcoIGVmYWIsIF9yZWcgKSBkbyB7CQkJCVwKKwkJZWZhYl9vd29yZF90IHJlZzsJCQkJXAorCQlmYWxjb25fcmVhZCAoIGVmYWIsICZyZWcsIF9yZWcgKTsJCVwKKwkJRUZBQl9MT0cgKCAjX3JlZyAiID0gIiBFRkFCX09XT1JEX0ZNVCAiXG4iLAlcCisJCQkgICBFRkFCX09XT1JEX1ZBTCAoIHJlZyApICk7CQlcCisJfSB3aGlsZSAoIDAgKTsKKworI2RlZmluZSBGQ05fRFVNUF9NQUNfUkVHKCBlZmFiLCBfbWFjX3JlZyApIGRvIHsJCQkJXAorCQllZmFiX2R3b3JkX3QgcmVnOwkJCQkJXAorCQllZmFiLT5tYWNfb3AtPm1hY19yZWFkbCAoIGVmYWIsICZyZWcsIF9tYWNfcmVnICk7CVwKKwkJRUZBQl9MT0cgKCAjX21hY19yZWcgIiA9ICIgRUZBQl9EV09SRF9GTVQgIlxuIiwJCVwKKwkJCSAgIEVGQUJfRFdPUkRfVkFMICggcmVnICkgKTsJCQlcCisJfSB3aGlsZSAoIDAgKTsKKworLyoqCisgKiBTZWUgaWYgYW4gZXZlbnQgaXMgcHJlc2VudAorICoKKyAqIEB2IGV2ZW50CQlGYWxjb24gZXZlbnQgc3RydWN0dXJlCisgKiBAcmV0IFRydWUJCUFuIGV2ZW50IGlzIHBlbmRpbmcKKyAqIEByZXQgRmFsc2UJCU5vIGV2ZW50IGlzIHBlbmRpbmcKKyAqCisgKiBXZSBjaGVjayBib3RoIHRoZSBoaWdoIGFuZCBsb3cgZHdvcmQgb2YgdGhlIGV2ZW50IGZvciBhbGwgb25lcy4gIFdlCisgKiB3cm90ZSBhbGwgb25lcyB3aGVuIHdlIGNsZWFyZWQgdGhlIGV2ZW50LCBhbmQgbm8gdmFsaWQgZXZlbnQgY2FuCisgKiBoYXZlIGFsbCBvbmVzIGluIGVpdGhlciBpdHMgaGlnaCBvciBsb3cgZHdvcmRzLiAgVGhpcyBhcHByb2FjaCBpcworICogcm9idXN0IGFnYWluc3QgcmVvcmRlcmluZy4KKyAqCisgKiBOb3RlIHRoYXQgdXNpbmcgYSBzaW5nbGUgNjQtYml0IGNvbXBhcmlzb24gaXMgaW5jb3JyZWN0OyBldmVuCisgKiB0aG91Z2ggdGhlIENQVSByZWFkIHdpbGwgYmUgYXRvbWljLCB0aGUgRE1BIHdyaXRlIG1heSBub3QgYmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitmYWxjb25fZXZlbnRfcHJlc2VudCAoIGZhbGNvbl9ldmVudF90KiBldmVudCApCit7CisJcmV0dXJuICggISAoIEVGQUJfRFdPUkRfSVNfQUxMX09ORVMgKCBldmVudC0+ZHdvcmRbMF0gKSB8CisJCSAgICAgRUZBQl9EV09SRF9JU19BTExfT05FUyAoIGV2ZW50LT5kd29yZFsxXSApICkgKTsKK30KKworc3RhdGljIHZvaWQKK2ZhbGNvbl9ldmVudHFfcmVhZF9hY2sgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIsIHN0cnVjdCBlZmFiX2V2X3F1ZXVlICpldl9xdWV1ZSApCit7CisJZWZhYl9kd29yZF90IHJlZzsKKworCUVGQUJfUE9QVUxBVEVfRFdPUkRfMSAoIHJlZywgRkNOX0VWUV9SUFRSX0RXT1JELCBldl9xdWV1ZS0+cmVhZF9wdHIgKTsKKwlmYWxjb25fd3JpdGVsICggZWZhYiwgJnJlZywKKwkJCUZDTl9SRVZJU0lPTl9SRUcgKCBlZmFiLCBGQ05fRVZRX1JQVFJfUkVHX0tFUl9EV09SRCApICk7Cit9CisKKyNpZiAwCisvKioKKyAqIER1bXAgcmVnaXN0ZXIgY29udGVudHMgKGZvciBkZWJ1Z2dpbmcpCisgKgorICogTWFya2VkIGFzIHN0YXRpYyBpbmxpbmUgc28gdGhhdCBpdCB3aWxsIG5vdCBiZSBjb21waWxlZCBpbiBpZiBub3QKKyAqIHVzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZmFsY29uX2R1bXBfcmVncyAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJRkNOX0RVTVBfUkVHICggZWZhYiwgRkNOX0lOVF9FTl9SRUdfS0VSICk7CisJRkNOX0RVTVBfUkVHICggZWZhYiwgRkNOX0lOVF9BRFJfUkVHX0tFUiApOworCUZDTl9EVU1QX1JFRyAoIGVmYWIsIEZDTl9HTEJfQ1RMX1JFR19LRVIgKTsKKwlGQ05fRFVNUF9SRUcgKCBlZmFiLCBGQ05fVElNRVJfQ01EX1JFR19LRVIgKTsKKwlGQ05fRFVNUF9SRUcgKCBlZmFiLCBGQ05fU1JNX1JYX0RDX0NGR19SRUdfS0VSICk7CisJRkNOX0RVTVBfUkVHICggZWZhYiwgRkNOX1NSTV9UWF9EQ19DRkdfUkVHX0tFUiApOworCUZDTl9EVU1QX1JFRyAoIGVmYWIsIEZDTl9SWF9GSUxURVJfQ1RMX1JFR19LRVIgKTsKKwlGQ05fRFVNUF9SRUcgKCBlZmFiLCBGQ05fUlhfRENfQ0ZHX1JFR19LRVIgKTsKKwlGQ05fRFVNUF9SRUcgKCBlZmFiLCBGQ05fVFhfRENfQ0ZHX1JFR19LRVIgKTsKKwlGQ05fRFVNUF9SRUcgKCBlZmFiLCBGQ05fTUFDMF9DVFJMX1JFR19LRVIgKTsKKwlGQ05fRFVNUF9SRUcgKCBlZmFiLCBGQ05fTUFDMV9DVFJMX1JFR19LRVIgKTsKKwlGQ05fRFVNUF9SRUcgKCBlZmFiLCBGQ05fUkVWSVNJT05fUkVHICggZWZhYiwgRkNOX1JYX0RFU0NfUFRSX1RCTF9LRVIgKSApOworCUZDTl9EVU1QX1JFRyAoIGVmYWIsIEZDTl9SRVZJU0lPTl9SRUcgKCBlZmFiLCBGQ05fVFhfREVTQ19QVFJfVEJMX0tFUiApICk7CisJRkNOX0RVTVBfUkVHICggZWZhYiwgRkNOX1JFVklTSU9OX1JFRyAoIGVmYWIsIEZDTl9FVlFfUFRSX1RCTF9LRVIgKSApOworCUZDTl9EVU1QX01BQ19SRUcgKCBlZmFiLCBHTV9DRkcxX1JFR19NQUMgKTsKKwlGQ05fRFVNUF9NQUNfUkVHICggZWZhYiwgR01fQ0ZHMl9SRUdfTUFDICk7CisJRkNOX0RVTVBfTUFDX1JFRyAoIGVmYWIsIEdNX01BWF9GTEVOX1JFR19NQUMgKTsKKwlGQ05fRFVNUF9NQUNfUkVHICggZWZhYiwgR01fTUlJX01HTVRfQ0ZHX1JFR19NQUMgKTsKKwlGQ05fRFVNUF9NQUNfUkVHICggZWZhYiwgR01fQURSMV9SRUdfTUFDICk7CisJRkNOX0RVTVBfTUFDX1JFRyAoIGVmYWIsIEdNX0FEUjJfUkVHX01BQyApOworCUZDTl9EVU1QX01BQ19SRUcgKCBlZmFiLCBHTUZfQ0ZHMF9SRUdfTUFDICk7CisJRkNOX0RVTVBfTUFDX1JFRyAoIGVmYWIsIEdNRl9DRkcxX1JFR19NQUMgKTsKKwlGQ05fRFVNUF9NQUNfUkVHICggZWZhYiwgR01GX0NGRzJfUkVHX01BQyApOworCUZDTl9EVU1QX01BQ19SRUcgKCBlZmFiLCBHTUZfQ0ZHM19SRUdfTUFDICk7CisJRkNOX0RVTVBfTUFDX1JFRyAoIGVmYWIsIEdNRl9DRkc0X1JFR19NQUMgKTsKKwlGQ05fRFVNUF9NQUNfUkVHICggZWZhYiwgR01GX0NGRzVfUkVHX01BQyApOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitmYWxjb25faW50ZXJydXB0cyAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwgaW50IGVuYWJsZWQsIGludCBmb3JjZSApCit7CisJZWZhYl9vd29yZF90IGludF9lbl9yZWdfa2VyOworCisJRUZBQl9QT1BVTEFURV9PV09SRF8yICggaW50X2VuX3JlZ19rZXIsCisJCQkJRkNOX0tFUl9JTlRfS0VSLCBmb3JjZSwKKwkJCQlGQ05fRFJWX0lOVF9FTl9LRVIsIGVuYWJsZWQgKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmaW50X2VuX3JlZ19rZXIsIEZDTl9JTlRfRU5fUkVHX0tFUiApOwkKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogU1BJIGFjY2VzcworICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisKKworLyoqIE1heGltdW0gbGVuZ3RoIGZvciBhIHNpbmdsZSBTUEkgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgRkFMQ09OX1NQSV9NQVhfTEVOIDE2CisKK3N0YXRpYyBpbnQKK2ZhbGNvbl9zcGlfd2FpdCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJZWZhYl9vd29yZF90IHJlZzsKKwlpbnQgY291bnQ7CisKKwljb3VudCA9IDA7CisJZG8geworCQl1ZGVsYXkgKCAxMDAgKTsKKwkJZmFsY29uX3JlYWQgKCBlZmFiLCAmcmVnLCBGQ05fRUVfU1BJX0hDTURfUkVHICk7CisJCWlmICggRUZBQl9PV09SRF9GSUVMRCAoIHJlZywgRkNOX0VFX1NQSV9IQ01EX0NNRF9FTiApID09IDAgKQorCQkJcmV0dXJuIDA7CisJfSB3aGlsZSAoICsrY291bnQgPCAxMDAwICk7CisKKwlFRkFCX0VSUiAoICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgU1BJXG4iICk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQKK2ZhbGNvbl9zcGlfcncgKCBzdHJ1Y3Qgc3BpX2J1cyogYnVzLCBzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2aWNlLAorCQl1bnNpZ25lZCBpbnQgY29tbWFuZCwgaW50IGFkZHJlc3MsCisJCWNvbnN0IHZvaWQqIGRhdGFfb3V0LCB2b2lkICpkYXRhX2luLCBzaXplX3QgbGVuICkKK3sKKwlzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgPSBjb250YWluZXJfb2YgKCBidXMsIHN0cnVjdCBlZmFiX25pYywgc3BpX2J1cyApOworCWludCBhZGRyZXNzX2xlbiwgcmMsIGRldmljZV9pZCwgcmVhZF9jbWQ7CisJZWZhYl9vd29yZF90IHJlZzsKKworCS8qIGZhbGNvbl9pbml0X3NwaV9kZXZpY2UoKSBzaG91bGQgaGF2ZSByZWR1Y2VkIHRoZSBibG9jayBzaXplCisJICogZG93biBzbyB0aGlzIGNvbnN0cmFpbnQgaG9sZHMgKi8KKwlhc3NlcnQgKCBsZW4gPD0gRkFMQ09OX1NQSV9NQVhfTEVOICk7CisKKwkvKiBJcyB0aGlzIHRoZSBGTEFTSCBvciBFRVBST00gZGV2aWNlPyAqLworCWlmICggZGV2aWNlID09ICZlZmFiLT5zcGlfZmxhc2ggKQorCQlkZXZpY2VfaWQgPSBGQ05fRUVfU1BJX0ZMQVNIOworCWVsc2UgaWYgKCBkZXZpY2UgPT0gJmVmYWItPnNwaV9lZXByb20gKQorCQlkZXZpY2VfaWQgPSBGQ05fRUVfU1BJX0VFUFJPTTsKKwllbHNlIHsKKwkJRUZBQl9FUlIgKCAiVW5rbm93biBkZXZpY2UgJXBcbiIsIGRldmljZSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlFRkFCX1RSQUNFICggIkV4ZWN1dGluZyBzcGkgY29tbWFuZCAlZCBvbiBkZXZpY2UgJWQgYXQgJWQgZm9yICV6ZCBieXRlc1xuIiwKKwkJICAgICBjb21tYW5kLCBkZXZpY2VfaWQsIGFkZHJlc3MsIGxlbiApOworCisJLyogVGhlIGJ1cyBtdXN0IGJlIGlkbGUgKi8KKwlyYyA9IGZhbGNvbl9zcGlfd2FpdCAoIGVmYWIgKTsKKwlpZiAoIHJjICkKKwkJZ290byBmYWlsMTsKKworCS8qIENvcHkgZGF0YSBvdXQgKi8KKwlpZiAoIGRhdGFfb3V0ICkgeworCQltZW1jcHkgKCAmcmVnLCBkYXRhX291dCwgbGVuICk7CisJCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsIEZDTl9FRV9TUElfSERBVEFfUkVHICk7CisJfQorCisJLyogUHJvZ3JhbSBhZGRyZXNzIHJlZ2lzdGVyICovCisJaWYgKCBhZGRyZXNzID49IDAgKSB7CisJCUVGQUJfUE9QVUxBVEVfT1dPUkRfMSAoIHJlZywgRkNOX0VFX1NQSV9IQURSX0FEUiwgYWRkcmVzcyApOworCQlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fRUVfU1BJX0hBRFJfUkVHICk7CisJfQorCisJLyogSXNzdWUgY29tbWFuZCAqLworCWFkZHJlc3NfbGVuID0gKCBhZGRyZXNzID49IDAgKSA/IGRldmljZS0+YWRkcmVzc19sZW4gLyA4IDogMDsKKwlyZWFkX2NtZCA9ICggZGF0YV9pbiA/IEZDTl9FRV9TUElfUkVBRCA6IEZDTl9FRV9TUElfV1JJVEUgKTsKKwlFRkFCX1BPUFVMQVRFX09XT1JEXzcgKCByZWcsCisJCQkJRkNOX0VFX1NQSV9IQ01EX0NNRF9FTiwgMSwKKwkJCQlGQ05fRUVfU1BJX0hDTURfU0ZfU0VMLCBkZXZpY2VfaWQsCisJCQkJRkNOX0VFX1NQSV9IQ01EX0RBQkNOVCwgbGVuLAorCQkJCUZDTl9FRV9TUElfSENNRF9SRUFELCByZWFkX2NtZCwKKwkJCQlGQ05fRUVfU1BJX0hDTURfRFVCQ05ULCAwLAorCQkJCUZDTl9FRV9TUElfSENNRF9BREJDTlQsIGFkZHJlc3NfbGVuLAorCQkJCUZDTl9FRV9TUElfSENNRF9FTkMsIGNvbW1hbmQgKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fRUVfU1BJX0hDTURfUkVHICk7CisKKwkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCXJjID0gZmFsY29uX3NwaV93YWl0ICggZWZhYiApOworCWlmICggcmMgKQorCQlnb3RvIGZhaWwyOworCisJLyogQ29weSBkYXRhIGluICovCisJaWYgKCBkYXRhX2luICkgeworCQlmYWxjb25fcmVhZCAoIGVmYWIsICZyZWcsIEZDTl9FRV9TUElfSERBVEFfUkVHICk7CisJCW1lbWNweSAoIGRhdGFfaW4sICZyZWcsIGxlbiApOworCX0KKworCXJldHVybiAwOworCitmYWlsMjoKK2ZhaWwxOgorCUVGQUJfRVJSICggIkZhaWxlZCBTUEkgY29tbWFuZCAlZCB0byBkZXZpY2UgJWQgYWRkcmVzcyAweCV4IGxlbiAweCV6eFxuIiwKKwkJICAgY29tbWFuZCwgZGV2aWNlX2lkLCBhZGRyZXNzLCBsZW4gKTsKKworCXJldHVybiByYzsKK30KKworLyoqIFBvcnRpb24gb2YgRUVQUk9NIGF2YWlsYWJsZSBmb3Igbm9uLXZvbGF0aWxlIG9wdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgbnZvX2ZyYWdtZW50IGZhbGNvbl9udm9fZnJhZ21lbnRzW10gPSB7CisJeyAweDEwMCwgMHhmMCB9LAorCXsgMCwgMCB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBGYWxjb24gYml0LWJhc2hlZCBJMkMgaW50ZXJmYWNlCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKKworc3RhdGljIHZvaWQKK2ZhbGNvbl9pMmNfYml0X3dyaXRlICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciwgdW5zaWduZWQgaW50IGJpdF9pZCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSApCit7CisJc3RydWN0IGVmYWJfbmljICplZmFiID0gY29udGFpbmVyX29mICggYmFzaGVyLCBzdHJ1Y3QgZWZhYl9uaWMsCisJCQkJCSAgICAgICBpMmNfYmIuYmFzaGVyICk7CisJZWZhYl9vd29yZF90IHJlZzsKKworCWZhbGNvbl9yZWFkICggZWZhYiwgJnJlZywgRkNOX0dQSU9fQ1RMX1JFR19LRVIgKTsKKwlzd2l0Y2ggKCBiaXRfaWQgKSB7CisJY2FzZSBJMkNfQklUX1NDTDoKKwkJRUZBQl9TRVRfT1dPUkRfRklFTEQgKCByZWcsIEZDTl9HUElPMF9PRU4sICggZGF0YSA/IDAgOiAxICkgKTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfQklUX1NEQToKKwkJRUZBQl9TRVRfT1dPUkRfRklFTEQgKCByZWcsIEZDTl9HUElPM19PRU4sICggZGF0YSA/IDAgOiAxICkgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRUZBQl9FUlIgKCAiJXMgYml0PSVkXG4iLCBfX2Z1bmNfXywgYml0X2lkICk7CisJCWJyZWFrOworCX0KKworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsICBGQ05fR1BJT19DVExfUkVHX0tFUiApOworfQorCitzdGF0aWMgaW50CitmYWxjb25faTJjX2JpdF9yZWFkICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciwgdW5zaWduZWQgaW50IGJpdF9pZCApCit7CisJc3RydWN0IGVmYWJfbmljICplZmFiID0gY29udGFpbmVyX29mICggYmFzaGVyLCBzdHJ1Y3QgZWZhYl9uaWMsCisJCQkJCSAgICAgICBpMmNfYmIuYmFzaGVyICk7CisJZWZhYl9vd29yZF90IHJlZzsKKwkKKwlmYWxjb25fcmVhZCAoIGVmYWIsICZyZWcsIEZDTl9HUElPX0NUTF9SRUdfS0VSICk7CisJc3dpdGNoICggYml0X2lkICkgeworCWNhc2UgSTJDX0JJVF9TQ0w6CisJCXJldHVybiBFRkFCX09XT1JEX0ZJRUxEICggcmVnLCBGQ05fR1BJTzBfSU4gKTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfQklUX1NEQToKKwkJcmV0dXJuIEVGQUJfT1dPUkRfRklFTEQgKCByZWcsIEZDTl9HUElPM19JTiApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlFRkFCX0VSUiAoICIlcyBiaXQ9JWRcbiIsIF9fZnVuY19fLCBiaXRfaWQgKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IGJpdF9iYXNoZXJfb3BlcmF0aW9ucyBmYWxjb25faTJjX2JpdF9vcHMgPSB7CisJLnJlYWQgICAgICAgICAgID0gZmFsY29uX2kyY19iaXRfcmVhZCwKKwkud3JpdGUgICAgICAgICAgPSBmYWxjb25faTJjX2JpdF93cml0ZSwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogTURJTyBhY2Nlc3MKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorCitzdGF0aWMgaW50CitmYWxjb25fZ21paV93YWl0ICggc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwllZmFiX2R3b3JkX3QgbWRfc3RhdDsKKwlpbnQgY291bnQ7CisKKwkvKiB3YWl0IHVwdG8gMTBtcyAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwMDA7IGNvdW50KyspIHsKKwkJZmFsY29uX3JlYWRsICggZWZhYiwgJm1kX3N0YXQsIEZDTl9NRF9TVEFUX1JFR19LRVIgKTsKKwkJaWYgKCBFRkFCX0RXT1JEX0ZJRUxEICggbWRfc3RhdCwgRkNOX01EX0JTWSApID09IDAgKSB7CisJCQlpZiAoIEVGQUJfRFdPUkRfRklFTEQgKCBtZF9zdGF0LCBGQ05fTURfTE5GTCApICE9IDAgfHwKKwkJCSAgICAgRUZBQl9EV09SRF9GSUVMRCAoIG1kX3N0YXQsIEZDTl9NRF9CU0VSUiApICE9IDAgKSB7CisJCQkJRUZBQl9FUlIgKCAiRXJyb3IgZnJvbSBHTUlJIGFjY2VzcyAiCisJCQkJCSAgIEVGQUJfRFdPUkRfRk1UIlxuIiwKKwkJCQkJICAgRUZBQl9EV09SRF9WQUwgKCBtZF9zdGF0ICkpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlFRkFCX0VSUiAoICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgR01JSVxuIiApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgdm9pZAorZmFsY29uX21kaW9fd3JpdGUgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIsIGludCBkZXZpY2UsCisJCSAgICBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSApCit7CisJZWZhYl9vd29yZF90IHJlZzsKKworCUVGQUJfVFJBQ0UgKCAiV3JpdGluZyBHTUlJICVkIHJlZ2lzdGVyICUwMnggd2l0aCAlMDR4XG4iLAorCQkgICAgIGRldmljZSwgbG9jYXRpb24sIHZhbHVlICk7CisKKwkvKiBDaGVjayBNSUkgbm90IGN1cnJlbnRseSBiZWluZyBhY2Nlc3NlZCAqLworCWlmICggZmFsY29uX2dtaWlfd2FpdCAoIGVmYWIgKSApCisJCXJldHVybjsKKworCS8qIFdyaXRlIHRoZSBhZGRyZXNzL0lEIHJlZ2lzdGVyICovCisJRUZBQl9QT1BVTEFURV9PV09SRF8xICggcmVnLCBGQ05fTURfUEhZX0FEUiwgbG9jYXRpb24gKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fTURfUEhZX0FEUl9SRUdfS0VSICk7CisKKwlpZiAoIGVmYWItPnBoeV8xMGcgKSB7CisJCS8qIGNsYXVzZTQ1ICovCisJCUVGQUJfUE9QVUxBVEVfT1dPUkRfMiAoIHJlZywgCisJCQkJCUZDTl9NRF9QUlRfQURSLCBlZmFiLT5waHlfYWRkciwKKwkJCQkJRkNOX01EX0RFVl9BRFIsIGRldmljZSApOworCX0KKwllbHNlIHsKKwkJLyogY2xhdXNlMjIgKi8KKwkJYXNzZXJ0ICggZGV2aWNlID09IDAgKTsKKworCQlFRkFCX1BPUFVMQVRFX09XT1JEXzIgKCByZWcsCisJCQkJCUZDTl9NRF9QUlRfQURSLCBlZmFiLT5waHlfYWRkciwKKwkJCQkJRkNOX01EX0RFVl9BRFIsIGxvY2F0aW9uICk7CisJfQorCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsIEZDTl9NRF9JRF9SRUdfS0VSICk7CisJCQorCisJLyogV3JpdGUgZGF0YSAqLworCUVGQUJfUE9QVUxBVEVfT1dPUkRfMSAoIHJlZywgRkNOX01EX1RYRCwgdmFsdWUgKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fTURfVFhEX1JFR19LRVIgKTsKKworCUVGQUJfUE9QVUxBVEVfT1dPUkRfMiAoIHJlZywKKwkJCQlGQ05fTURfV1JDLCAxLAorCQkJCUZDTl9NRF9HQywgKCBlZmFiLT5waHlfMTBnID8gMCA6IDEgKSApOworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsIEZDTl9NRF9DU19SRUdfS0VSICk7CisJCQorCS8qIFdhaXQgZm9yIGRhdGEgdG8gYmUgd3JpdHRlbiAqLworCWlmICggZmFsY29uX2dtaWlfd2FpdCAoIGVmYWIgKSApIHsKKwkJLyogQWJvcnQgdGhlIHdyaXRlIG9wZXJhdGlvbiAqLworCQlFRkFCX1BPUFVMQVRFX09XT1JEXzIgKCByZWcsCisJCQkJCUZDTl9NRF9XUkMsIDAsCisJCQkJCUZDTl9NRF9HQywgMSk7CisJCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsIEZDTl9NRF9DU19SRUdfS0VSICk7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgaW50CitmYWxjb25fbWRpb19yZWFkICggc3RydWN0IGVmYWJfbmljICplZmFiLCBpbnQgZGV2aWNlLCBpbnQgbG9jYXRpb24gKQoreworCWVmYWJfb3dvcmRfdCByZWc7CisJaW50IHZhbHVlOworCisJLyogQ2hlY2sgTUlJIG5vdCBjdXJyZW50bHkgYmVpbmcgYWNjZXNzZWQgKi8KKwlpZiAoIGZhbGNvbl9nbWlpX3dhaXQgKCBlZmFiICkgKSAKKwkJcmV0dXJuIC0xOworCisJaWYgKCBlZmFiLT5waHlfMTBnICkgeworCQkvKiBjbGF1c2U0NSAqLworCQlFRkFCX1BPUFVMQVRFX09XT1JEXzEgKCByZWcsIEZDTl9NRF9QSFlfQURSLCBsb2NhdGlvbiApOworCQlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fTURfUEhZX0FEUl9SRUdfS0VSICk7CisKKwkJRUZBQl9QT1BVTEFURV9PV09SRF8yICggcmVnLAorCQkJCQlGQ05fTURfUFJUX0FEUiwgZWZhYi0+cGh5X2FkZHIsCisJCQkJCUZDTl9NRF9ERVZfQURSLCBkZXZpY2UgKTsKKwkJZmFsY29uX3dyaXRlICggZWZhYiwgJnJlZywgRkNOX01EX0lEX1JFR19LRVIpOworCisJCS8qIHJlcXVlc3QgZGF0YSB0byBiZSByZWFkICovCisJCUVGQUJfUE9QVUxBVEVfT1dPUkRfMiAoIHJlZywKKwkJCQkJRkNOX01EX1JEQywgMSwKKwkJCQkJRkNOX01EX0dDLCAwICk7CisJfQorCWVsc2UgeworCQkvKiBjbGF1c2UyMiAqLworCQlhc3NlcnQgKCBkZXZpY2UgPT0gMCApOworCisJCUVGQUJfUE9QVUxBVEVfT1dPUkRfMiAoIHJlZywKKwkJCQkJRkNOX01EX1BSVF9BRFIsIGVmYWItPnBoeV9hZGRyLAorCQkJCQlGQ05fTURfREVWX0FEUiwgbG9jYXRpb24gKTsKKwkJZmFsY29uX3dyaXRlICggZWZhYiwgJnJlZywgRkNOX01EX0lEX1JFR19LRVIgKTsKKworCQkvKiBSZXF1ZXN0IGRhdGEgdG8gYmUgcmVhZCAqLworCQlFRkFCX1BPUFVMQVRFX09XT1JEXzIgKCByZWcsCisJCQkJCUZDTl9NRF9SSUMsIDEsCisJCQkJCUZDTl9NRF9HQywgMSApOworCX0KKworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsIEZDTl9NRF9DU19SRUdfS0VSICk7CisJCQorCS8qIFdhaXQgZm9yIGRhdGEgdG8gYmVjb21lIGF2YWlsYWJsZSAqLworCWlmICggZmFsY29uX2dtaWlfd2FpdCAoIGVmYWIgKSApIHsKKwkJLyogQWJvcnQgdGhlIHJlYWQgb3BlcmF0aW9uICovCisJCUVGQUJfUE9QVUxBVEVfT1dPUkRfMiAoIHJlZywKKwkJCQkJRkNOX01EX1JJQywgMCwKKwkJCQkJRkNOX01EX0dDLCAxICk7CisJCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsIEZDTl9NRF9DU19SRUdfS0VSICk7CisJCXVkZWxheSAoIDEwICk7CisJCXZhbHVlID0gLTE7CisJfQorCWVsc2UgeworCQkvKiBSZWFkIHRoZSBkYXRhICovCisJCWZhbGNvbl9yZWFkICggZWZhYiwgJnJlZywgRkNOX01EX1JYRF9SRUdfS0VSICk7CisJCXZhbHVlID0gRUZBQl9PV09SRF9GSUVMRCAoIHJlZywgRkNOX01EX1JYRCApOworCX0KKworCUVGQUJfVFJBQ0UgKCAiUmVhZCBmcm9tIEdNSUkgJWQgcmVnaXN0ZXIgJTAyeCwgZ290ICUwNHhcbiIsCisJCSAgICAgZGV2aWNlLCBsb2NhdGlvbiwgdmFsdWUgKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogTUFDIHdyYXBwZXIKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitmYWxjb25fcmVjb25maWd1cmVfbWFjX3dyYXBwZXIgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWVmYWJfb3dvcmRfdCByZWc7CisJaW50IGxpbmtfc3BlZWQ7CisKKwlpZiAoIGVmYWItPmxpbmtfb3B0aW9ucyAmIExQQV9FRl8xMDAwMCApIHsKKwkJbGlua19zcGVlZCA9IDB4MzsKKwl9IGVsc2UgaWYgKCBlZmFiLT5saW5rX29wdGlvbnMgJiBMUEFfRUZfMTAwMCApIHsKKwkJbGlua19zcGVlZCA9IDB4MjsKKwl9IGVsc2UgaWYgKCBlZmFiLT5saW5rX29wdGlvbnMgJiBMUEFfMTAwICkgeworCQlsaW5rX3NwZWVkID0gMHgxOworCX0gZWxzZSB7CisJCWxpbmtfc3BlZWQgPSAweDA7CisJfQorCUVGQUJfUE9QVUxBVEVfT1dPUkRfNSAoIHJlZywKKwkJCQlGQ05fTUFDX1hPRkZfVkFMLCAweGZmZmYgLyogZGF0YXNoZWV0ICovLAorCQkJCUZDTl9NQUNfQkNBRF9BQ1BULCAxLAorCQkJCUZDTl9NQUNfVUNfUFJPTSwgMCwKKwkJCQlGQ05fTUFDX0xJTktfU1RBVFVTLCAxLAorCQkJCUZDTl9NQUNfU1BFRUQsIGxpbmtfc3BlZWQgKTsKKworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsIEZDTl9NQUMwX0NUUkxfUkVHX0tFUiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBHTUFDIGhhbmRsaW5nCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBHTUFDIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMSAqLworI2RlZmluZSBHTV9DRkcxX1JFR19NQUMgMHgwMAorI2RlZmluZSBHTV9TV19SU1RfTEJOIDMxCisjZGVmaW5lIEdNX1NXX1JTVF9XSURUSCAxCisjZGVmaW5lIEdNX1JYX0ZDX0VOX0xCTiA1CisjZGVmaW5lIEdNX1JYX0ZDX0VOX1dJRFRIIDEKKyNkZWZpbmUgR01fVFhfRkNfRU5fTEJOIDQKKyNkZWZpbmUgR01fVFhfRkNfRU5fV0lEVEggMQorI2RlZmluZSBHTV9SWF9FTl9MQk4gMgorI2RlZmluZSBHTV9SWF9FTl9XSURUSCAxCisjZGVmaW5lIEdNX1RYX0VOX0xCTiAwCisjZGVmaW5lIEdNX1RYX0VOX1dJRFRIIDEKKworLyogR01BQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgR01fQ0ZHMl9SRUdfTUFDIDB4MDEKKyNkZWZpbmUgR01fUEFNQkxfTEVOX0xCTiAxMgorI2RlZmluZSBHTV9QQU1CTF9MRU5fV0lEVEggNAorI2RlZmluZSBHTV9JRl9NT0RFX0xCTiA4CisjZGVmaW5lIEdNX0lGX01PREVfV0lEVEggMgorI2RlZmluZSBHTV9QQURfQ1JDX0VOX0xCTiAyCisjZGVmaW5lIEdNX1BBRF9DUkNfRU5fV0lEVEggMQorI2RlZmluZSBHTV9GRF9MQk4gMAorI2RlZmluZSBHTV9GRF9XSURUSCAxCisKKy8qIEdNQUMgbWF4aW11bSBmcmFtZSBsZW5ndGggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgR01fTUFYX0ZMRU5fUkVHX01BQyAweDA0CisjZGVmaW5lIEdNX01BWF9GTEVOX0xCTiAwCisjZGVmaW5lIEdNX01BWF9GTEVOX1dJRFRIIDE2CisKKy8qIEdNQUMgTUlJIG1hbmFnZW1lbnQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBHTV9NSUlfTUdNVF9DRkdfUkVHX01BQyAweDA4CisjZGVmaW5lIEdNX01HTVRfQ0xLX1NFTF9MQk4gMAorI2RlZmluZSBHTV9NR01UX0NMS19TRUxfV0lEVEggMworCisvKiBHTUFDIE1JSSBtYW5hZ2VtZW50IGNvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgR01fTUlJX01HTVRfQ01EX1JFR19NQUMgMHgwOQorI2RlZmluZSBHTV9NR01UX1NDQU5fQ1lDX0xCTiAxCisjZGVmaW5lIEdNX01HTVRfU0NBTl9DWUNfV0lEVEggMQorI2RlZmluZSBHTV9NR01UX1JEX0NZQ19MQk4gMAorI2RlZmluZSBHTV9NR01UX1JEX0NZQ19XSURUSCAxCisKKy8qIEdNQUMgTUlJIG1hbmFnZW1lbnQgYWRkcmVzcyByZWdpc3RlciAqLworI2RlZmluZSBHTV9NSUlfTUdNVF9BRFJfUkVHX01BQyAweDBhCisjZGVmaW5lIEdNX01HTVRfUEhZX0FERFJfTEJOIDgKKyNkZWZpbmUgR01fTUdNVF9QSFlfQUREUl9XSURUSCA1CisjZGVmaW5lIEdNX01HTVRfUkVHX0FERFJfTEJOIDAKKyNkZWZpbmUgR01fTUdNVF9SRUdfQUREUl9XSURUSCA1CisKKy8qIEdNQUMgTUlJIG1hbmFnZW1lbnQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBHTV9NSUlfTUdNVF9DVExfUkVHX01BQyAweDBiCisjZGVmaW5lIEdNX01HTVRfQ1RMX0xCTiAwCisjZGVmaW5lIEdNX01HTVRfQ1RMX1dJRFRIIDE2CisKKy8qIEdNQUMgTUlJIG1hbmFnZW1lbnQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIEdNX01JSV9NR01UX1NUQVRfUkVHX01BQyAweDBjCisjZGVmaW5lIEdNX01HTVRfU1RBVF9MQk4gMAorI2RlZmluZSBHTV9NR01UX1NUQVRfV0lEVEggMTYKKworLyogR01BQyBNSUkgbWFuYWdlbWVudCBpbmRpY2F0b3JzIHJlZ2lzdGVyICovCisjZGVmaW5lIEdNX01JSV9NR01UX0lORF9SRUdfTUFDIDB4MGQKKyNkZWZpbmUgR01fTUdNVF9CVVNZX0xCTiAwCisjZGVmaW5lIEdNX01HTVRfQlVTWV9XSURUSCAxCisKKy8qIEdNQUMgc3RhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgR01fQURSMV9SRUdfTUFDIDB4MTAKKyNkZWZpbmUgR01fSFdBRERSXzVfTEJOIDI0CisjZGVmaW5lIEdNX0hXQUREUl81X1dJRFRIIDgKKyNkZWZpbmUgR01fSFdBRERSXzRfTEJOIDE2CisjZGVmaW5lIEdNX0hXQUREUl80X1dJRFRIIDgKKyNkZWZpbmUgR01fSFdBRERSXzNfTEJOIDgKKyNkZWZpbmUgR01fSFdBRERSXzNfV0lEVEggOAorI2RlZmluZSBHTV9IV0FERFJfMl9MQk4gMAorI2RlZmluZSBHTV9IV0FERFJfMl9XSURUSCA4CisKKy8qIEdNQUMgc3RhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgR01fQURSMl9SRUdfTUFDIDB4MTEKKyNkZWZpbmUgR01fSFdBRERSXzFfTEJOIDI0CisjZGVmaW5lIEdNX0hXQUREUl8xX1dJRFRIIDgKKyNkZWZpbmUgR01fSFdBRERSXzBfTEJOIDE2CisjZGVmaW5lIEdNX0hXQUREUl8wX1dJRFRIIDgKKworLyogR01BQyBGSUZPIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCAqLworI2RlZmluZSBHTUZfQ0ZHMF9SRUdfTUFDIDB4MTIKKyNkZWZpbmUgR01GX0ZURkVOUkVRX0xCTiAxMgorI2RlZmluZSBHTUZfRlRGRU5SRVFfV0lEVEggMQorI2RlZmluZSBHTUZfU1RGRU5SRVFfTEJOIDExCisjZGVmaW5lIEdNRl9TVEZFTlJFUV9XSURUSCAxCisjZGVmaW5lIEdNRl9GUkZFTlJFUV9MQk4gMTAKKyNkZWZpbmUgR01GX0ZSRkVOUkVRX1dJRFRIIDEKKyNkZWZpbmUgR01GX1NSRkVOUkVRX0xCTiA5CisjZGVmaW5lIEdNRl9TUkZFTlJFUV9XSURUSCAxCisjZGVmaW5lIEdNRl9XVE1FTlJFUV9MQk4gOAorI2RlZmluZSBHTUZfV1RNRU5SRVFfV0lEVEggMQorCisvKiBHTUFDIEZJRk8gY29uZmlndXJhdGlvbiByZWdpc3RlciAxICovCisjZGVmaW5lIEdNRl9DRkcxX1JFR19NQUMgMHgxMworI2RlZmluZSBHTUZfQ0ZHRlJUSF9MQk4gMTYKKyNkZWZpbmUgR01GX0NGR0ZSVEhfV0lEVEggNQorI2RlZmluZSBHTUZfQ0ZHWE9GRlJUWF9MQk4gMAorI2RlZmluZSBHTUZfQ0ZHWE9GRlJUWF9XSURUSCAxNgorCisvKiBHTUFDIEZJRk8gY29uZmlndXJhdGlvbiByZWdpc3RlciAyICovCisjZGVmaW5lIEdNRl9DRkcyX1JFR19NQUMgMHgxNAorI2RlZmluZSBHTUZfQ0ZHSFdNX0xCTiAxNgorI2RlZmluZSBHTUZfQ0ZHSFdNX1dJRFRIIDYKKyNkZWZpbmUgR01GX0NGR0xXTV9MQk4gMAorI2RlZmluZSBHTUZfQ0ZHTFdNX1dJRFRIIDYKKworLyogR01BQyBGSUZPIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMyAqLworI2RlZmluZSBHTUZfQ0ZHM19SRUdfTUFDIDB4MTUKKyNkZWZpbmUgR01GX0NGR0hXTUZUX0xCTiAxNgorI2RlZmluZSBHTUZfQ0ZHSFdNRlRfV0lEVEggNgorI2RlZmluZSBHTUZfQ0ZHRlRUSF9MQk4gMAorI2RlZmluZSBHTUZfQ0ZHRlRUSF9XSURUSCA2CisKKy8qIEdNQUMgRklGTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUgR01GX0NGRzRfUkVHX01BQyAweDE2CisjZGVmaW5lIEdNRl9IU1RGTFRSRlJNX1BBVVNFX0xCTiAxMgorI2RlZmluZSBHTUZfSFNURkxUUkZSTV9QQVVTRV9XSURUSCAxMgorCisvKiBHTUFDIEZJRk8gY29uZmlndXJhdGlvbiByZWdpc3RlciA1ICovCisjZGVmaW5lIEdNRl9DRkc1X1JFR19NQUMgMHgxNworI2RlZmluZSBHTUZfQ0ZHSERQTFhfTEJOIDIyCisjZGVmaW5lIEdNRl9DRkdIRFBMWF9XSURUSCAxCisjZGVmaW5lIEdNRl9DRkdCWVRNT0RFX0xCTiAxOQorI2RlZmluZSBHTUZfQ0ZHQllUTU9ERV9XSURUSCAxCisjZGVmaW5lIEdNRl9IU1REUlBMVDY0X0xCTiAxOAorI2RlZmluZSBHTUZfSFNURFJQTFQ2NF9XSURUSCAxCisjZGVmaW5lIEdNRl9IU1RGTFRSRlJNRENfUEFVU0VfTEJOIDEyCisjZGVmaW5lIEdNRl9IU1RGTFRSRlJNRENfUEFVU0VfV0lEVEggMQorCitzdGF0aWMgdm9pZAorZmFsY29uX2dtYWNfd3JpdGVsICggc3RydWN0IGVmYWJfbmljICplZmFiLCBlZmFiX2R3b3JkX3QgKnZhbHVlLAorCQkgICAgIHVuc2lnbmVkIGludCBtYWNfcmVnICkKK3sKKwllZmFiX293b3JkX3QgdGVtcDsKKworCUVGQUJfUE9QVUxBVEVfT1dPUkRfMSAoIHRlbXAsIEZDTl9NQUNfREFUQSwKKwkJCQlFRkFCX0RXT1JEX0ZJRUxEICggKnZhbHVlLCBGQ05fTUFDX0RBVEEgKSApOworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZ0ZW1wLCBGQUxDT05fR01BQ19SRUcgKCBlZmFiLCBtYWNfcmVnICkgKTsKK30KKworc3RhdGljIHZvaWQKK2ZhbGNvbl9nbWFjX3JlYWRsICggc3RydWN0IGVmYWJfbmljICplZmFiLCBlZmFiX2R3b3JkX3QgKnZhbHVlLAorCQkgICAgdW5zaWduZWQgaW50IG1hY19yZWcgKQoreworCWVmYWJfb3dvcmRfdCB0ZW1wOworCisJZmFsY29uX3JlYWQgKCBlZmFiLCAmdGVtcCwgRkFMQ09OX0dNQUNfUkVHICggZWZhYiwgbWFjX3JlZyApICk7CisJRUZBQl9QT1BVTEFURV9EV09SRF8xICggKnZhbHVlLCBGQ05fTUFDX0RBVEEsCisJCQkJRUZBQl9PV09SRF9GSUVMRCAoIHRlbXAsIEZDTl9NQUNfREFUQSApICk7Cit9CisKK3N0YXRpYyB2b2lkCittZW50b3JtYWNfcmVzZXQgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWVmYWJfZHdvcmRfdCByZWc7CisKKwkvKiBUYWtlIGludG8gcmVzZXQgKi8KKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzEgKCByZWcsIEdNX1NXX1JTVCwgMSApOworCWZhbGNvbl9nbWFjX3dyaXRlbCAoIGVmYWIsICZyZWcsIEdNX0NGRzFfUkVHX01BQyApOworCXVkZWxheSAoIDEwMDAgKTsKKworCS8qIFRha2Ugb3V0IG9mIHJlc2V0ICovCisJRUZBQl9QT1BVTEFURV9EV09SRF8xICggcmVnLCBHTV9TV19SU1QsIDAgKTsKKwlmYWxjb25fZ21hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBHTV9DRkcxX1JFR19NQUMgKTsKKwl1ZGVsYXkgKCAxMDAwICk7CisKKwkvKiBDb25maWd1cmUgR01JSSBpbnRlcmZhY2Ugc28gUEhZIGlzIGFjY2Vzc2libGUuICBOb3RlIHRoYXQKKwkgKiBHTUlJIGludGVyZmFjZSBpcyBjb25uZWN0ZWQgb25seSB0byBwb3J0IDAsIGFuZCB0aGF0IG9uCisJICogRmFsY29uIHRoaXMgaXMgYSBuby1vcC4KKwkgKi8KKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzEgKCByZWcsIEdNX01HTVRfQ0xLX1NFTCwgMHg0ICk7CisJZmFsY29uX2dtYWNfd3JpdGVsICggZWZhYiwgJnJlZywgR01fTUlJX01HTVRfQ0ZHX1JFR19NQUMgKTsKKwl1ZGVsYXkgKCAxMCApOworfQorCitzdGF0aWMgdm9pZAorbWVudG9ybWFjX2luaXQgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWludCBwYXVzZSwgaWZfbW9kZSwgZnVsbF9kdXBsZXgsIGJ5dGVtb2RlLCBoYWxmX2R1cGxleDsKKwllZmFiX2R3b3JkX3QgcmVnOworCisJLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAxICovCisJcGF1c2UgPSAoIGVmYWItPmxpbmtfb3B0aW9ucyAmIExQQV9QQVVTRV9DQVAgKSA/IDEgOiAwOworCWlmICggISAoIGVmYWItPmxpbmtfb3B0aW9ucyAmIExQQV9FRl9EVVBMRVggKSApIHsKKwkJLyogSGFsZi1kdXBsZXggb3BlcmF0aW9uIHJlcXVpcmVzIFRYIGZsb3cgY29udHJvbCAqLworCQlwYXVzZSA9IDE7CisJfQorCUVGQUJfUE9QVUxBVEVfRFdPUkRfNCAoIHJlZywKKwkJCQlHTV9UWF9FTiwgMSwKKwkJCQlHTV9UWF9GQ19FTiwgcGF1c2UsCisJCQkJR01fUlhfRU4sIDEsCisJCQkJR01fUlhfRkNfRU4sIDEgKTsKKwlmYWxjb25fZ21hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBHTV9DRkcxX1JFR19NQUMgKTsKKwl1ZGVsYXkgKCAxMCApOworCisJLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAyICovCisJaWZfbW9kZSA9ICggZWZhYi0+bGlua19vcHRpb25zICYgTFBBX0VGXzEwMDAgKSA/IDIgOiAxOworCWZ1bGxfZHVwbGV4ID0gKCBlZmFiLT5saW5rX29wdGlvbnMgJiBMUEFfRUZfRFVQTEVYICkgPyAxIDogMDsKKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzQgKCByZWcsCisJCQkJR01fSUZfTU9ERSwgaWZfbW9kZSwKKwkJCQlHTV9QQURfQ1JDX0VOLCAxLAorCQkJCUdNX0ZELCBmdWxsX2R1cGxleCwKKwkJCQlHTV9QQU1CTF9MRU4sIDB4NyAvKiA/ICovICk7CisJZmFsY29uX2dtYWNfd3JpdGVsICggZWZhYiwgJnJlZywgR01fQ0ZHMl9SRUdfTUFDICk7CisJdWRlbGF5ICggMTAgKTsKKworCS8qIE1heCBmcmFtZSBsZW4gcmVnaXN0ZXIgKi8KKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzEgKCByZWcsIEdNX01BWF9GTEVOLAorCQkJCUVGQUJfTUFYX0ZSQU1FX0xFTiAoIEVUSF9GUkFNRV9MRU4gKSApOworCWZhbGNvbl9nbWFjX3dyaXRlbCAoIGVmYWIsICZyZWcsIEdNX01BWF9GTEVOX1JFR19NQUMgKTsKKwl1ZGVsYXkgKCAxMCApOworCisJLyogRklGTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDAgKi8KKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzUgKCByZWcsCisJCQkJR01GX0ZURkVOUkVRLCAxLAorCQkJCUdNRl9TVEZFTlJFUSwgMSwKKwkJCQlHTUZfRlJGRU5SRVEsIDEsCisJCQkJR01GX1NSRkVOUkVRLCAxLAorCQkJCUdNRl9XVE1FTlJFUSwgMSApOworCWZhbGNvbl9nbWFjX3dyaXRlbCAoIGVmYWIsICZyZWcsIEdNRl9DRkcwX1JFR19NQUMgKTsKKwl1ZGVsYXkgKCAxMCApOworCisJLyogRklGTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDEgKi8KKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzIgKCByZWcsCisJCQkJR01GX0NGR0ZSVEgsIDB4MTIsCisJCQkJR01GX0NGR1hPRkZSVFgsIDB4ZmZmZiApOworCWZhbGNvbl9nbWFjX3dyaXRlbCAoIGVmYWIsICZyZWcsIEdNRl9DRkcxX1JFR19NQUMgKTsKKwl1ZGVsYXkgKCAxMCApOworCisJLyogRklGTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDIgKi8KKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzIgKCByZWcsCisJCQkJR01GX0NGR0hXTSwgMHgzZiwKKwkJCQlHTUZfQ0ZHTFdNLCAweGEgKTsKKwlmYWxjb25fZ21hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBHTUZfQ0ZHMl9SRUdfTUFDICk7CisJdWRlbGF5ICggMTAgKTsKKworCS8qIEZJRk8gY29uZmlndXJhdGlvbiByZWdpc3RlciAzICovCisJRUZBQl9QT1BVTEFURV9EV09SRF8yICggcmVnLAorCQkJCUdNRl9DRkdIV01GVCwgMHgxYywKKwkJCQlHTUZfQ0ZHRlRUSCwgMHgwOCApOworCWZhbGNvbl9nbWFjX3dyaXRlbCAoIGVmYWIsICZyZWcsIEdNRl9DRkczX1JFR19NQUMgKTsKKwl1ZGVsYXkgKCAxMCApOworCisJLyogRklGTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDQgKi8KKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzEgKCByZWcsIEdNRl9IU1RGTFRSRlJNX1BBVVNFLCAxICk7CisJZmFsY29uX2dtYWNfd3JpdGVsICggZWZhYiwgJnJlZywgR01GX0NGRzRfUkVHX01BQyApOworCXVkZWxheSAoIDEwICk7CisJCisJLyogRklGTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDUgKi8KKwlieXRlbW9kZSA9ICggZWZhYi0+bGlua19vcHRpb25zICYgTFBBX0VGXzEwMDAgKSA/IDEgOiAwOworCWhhbGZfZHVwbGV4ID0gKCBlZmFiLT5saW5rX29wdGlvbnMgJiBMUEFfRUZfRFVQTEVYICkgPyAwIDogMTsKKwlmYWxjb25fZ21hY19yZWFkbCAoIGVmYWIsICZyZWcsIEdNRl9DRkc1X1JFR19NQUMgKTsKKwlFRkFCX1NFVF9EV09SRF9GSUVMRCAoIHJlZywgR01GX0NGR0JZVE1PREUsIGJ5dGVtb2RlICk7CisJRUZBQl9TRVRfRFdPUkRfRklFTEQgKCByZWcsIEdNRl9DRkdIRFBMWCwgaGFsZl9kdXBsZXggKTsKKwlFRkFCX1NFVF9EV09SRF9GSUVMRCAoIHJlZywgR01GX0hTVERSUExUNjQsIGhhbGZfZHVwbGV4ICk7CisJRUZBQl9TRVRfRFdPUkRfRklFTEQgKCByZWcsIEdNRl9IU1RGTFRSRlJNRENfUEFVU0UsIDAgKTsKKwlmYWxjb25fZ21hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBHTUZfQ0ZHNV9SRUdfTUFDICk7CisJdWRlbGF5ICggMTAgKTsKKwkKKwkvKiBNQUMgYWRkcmVzcyAqLworCUVGQUJfUE9QVUxBVEVfRFdPUkRfNCAoIHJlZywKKwkJCQlHTV9IV0FERFJfNSwgZWZhYi0+bWFjX2FkZHJbNV0sCisJCQkJR01fSFdBRERSXzQsIGVmYWItPm1hY19hZGRyWzRdLAorCQkJCUdNX0hXQUREUl8zLCBlZmFiLT5tYWNfYWRkclszXSwKKwkJCQlHTV9IV0FERFJfMiwgZWZhYi0+bWFjX2FkZHJbMl0gKTsKKwlmYWxjb25fZ21hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBHTV9BRFIxX1JFR19NQUMgKTsKKwl1ZGVsYXkgKCAxMCApOworCUVGQUJfUE9QVUxBVEVfRFdPUkRfMiAoIHJlZywKKwkJCQlHTV9IV0FERFJfMSwgZWZhYi0+bWFjX2FkZHJbMV0sCisJCQkJR01fSFdBRERSXzAsIGVmYWItPm1hY19hZGRyWzBdICk7CisJZmFsY29uX2dtYWNfd3JpdGVsICggZWZhYiwgJnJlZywgR01fQURSMl9SRUdfTUFDICk7CisJdWRlbGF5ICggMTAgKTsKK30KKworc3RhdGljIGludAorZmFsY29uX2luaXRfZ21hYyAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJLyogUmVzZXQgdGhlIE1BQyAqLworCW1lbnRvcm1hY19yZXNldCAoIGVmYWIgKTsKKworCS8qIEluaXRpYWxpc2UgUEhZICovCisJZWZhYi0+cGh5X29wLT5pbml0ICggZWZhYiApOworCisJLyogY2hlY2sgdGhlIGxpbmsgaXMgdXAgKi8KKwlpZiAoICFlZmFiLT5saW5rX3VwICkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBJbml0aWFsaXNlIE1BQyAqLworCW1lbnRvcm1hY19pbml0ICggZWZhYiApOworCisJLyogcmVjb25maWd1cmUgdGhlIE1BQyB3cmFwcGVyICovCisJZmFsY29uX3JlY29uZmlndXJlX21hY193cmFwcGVyICggZWZhYiApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWZhYl9tYWNfb3BlcmF0aW9ucyBmYWxjb25fZ21hY19vcGVyYXRpb25zID0geworCS5pbml0ICAgICAgICAgICAgICAgICAgID0gZmFsY29uX2luaXRfZ21hYywKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogWE1BQyBoYW5kbGluZworICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBXcml0ZSBkd29yZCB0byBhIEZhbGNvbiBYTUFDIHJlZ2lzdGVyCisgKgorICovCitzdGF0aWMgdm9pZAorZmFsY29uX3htYWNfd3JpdGVsICggc3RydWN0IGVmYWJfbmljICplZmFiLCBlZmFiX2R3b3JkX3QgKnZhbHVlLAorCQkgICAgIHVuc2lnbmVkIGludCBtYWNfcmVnICkKK3sKKwllZmFiX293b3JkX3QgdGVtcDsKKworCUVGQUJfUE9QVUxBVEVfT1dPUkRfMSAoIHRlbXAsIEZDTl9NQUNfREFUQSwKKwkJCQlFRkFCX0RXT1JEX0ZJRUxEICggKnZhbHVlLCBGQ05fTUFDX0RBVEEgKSApOworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZ0ZW1wLAorCQkgICAgICAgRkFMQ09OX1hNQUNfUkVHICggZWZhYiwgbWFjX3JlZyApICk7Cit9CisKKy8qKgorICogUmVhZCBkd29yZCBmcm9tIGEgRmFsY29uIFhNQUMgcmVnaXN0ZXIKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitmYWxjb25feG1hY19yZWFkbCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwgZWZhYl9kd29yZF90ICp2YWx1ZSwKKwkJICAgIHVuc2lnbmVkIGludCBtYWNfcmVnICkKK3sKKwllZmFiX293b3JkX3QgdGVtcDsKKworCWZhbGNvbl9yZWFkICggZWZhYiwgJnRlbXAsCisJCSAgICAgIEZBTENPTl9YTUFDX1JFRyAoIGVmYWIsIG1hY19yZWcgKSApOworCUVGQUJfUE9QVUxBVEVfRFdPUkRfMSAoICp2YWx1ZSwgRkNOX01BQ19EQVRBLAorCQkJCUVGQUJfT1dPUkRfRklFTEQgKCB0ZW1wLCBGQ05fTUFDX0RBVEEgKSApOworfQorCisvKioKKyAqIENvbmZpZ3VyZSBGYWxjb24gWEFVSSBvdXRwdXQKKyAqLworc3RhdGljIHZvaWQKK2ZhbGNvbl9zZXR1cF94YXVpICggc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwllZmFiX2R3b3JkX3Qgc2RjdGwsIHR4ZHJ2OworCisJZmFsY29uX3htYWNfcmVhZGwgKCBlZmFiLCAmc2RjdGwsIEZDTl9YWF9TRF9DVExfUkVHX01BQyApOworCUVGQUJfU0VUX0RXT1JEX0ZJRUxEICggc2RjdGwsIEZDTl9YWF9ISURSVkQsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCApOworCUVGQUJfU0VUX0RXT1JEX0ZJRUxEICggc2RjdGwsIEZDTl9YWF9MT0RSVkQsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCApOworCUVGQUJfU0VUX0RXT1JEX0ZJRUxEICggc2RjdGwsIEZDTl9YWF9ISURSVkMsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCApOworCUVGQUJfU0VUX0RXT1JEX0ZJRUxEICggc2RjdGwsIEZDTl9YWF9MT0RSVkMsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCApOworCUVGQUJfU0VUX0RXT1JEX0ZJRUxEICggc2RjdGwsIEZDTl9YWF9ISURSVkIsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCApOworCUVGQUJfU0VUX0RXT1JEX0ZJRUxEICggc2RjdGwsIEZDTl9YWF9MT0RSVkIsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCApOworCUVGQUJfU0VUX0RXT1JEX0ZJRUxEICggc2RjdGwsIEZDTl9YWF9ISURSVkEsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCApOworCUVGQUJfU0VUX0RXT1JEX0ZJRUxEICggc2RjdGwsIEZDTl9YWF9MT0RSVkEsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCApOworCWZhbGNvbl94bWFjX3dyaXRlbCAoIGVmYWIsICZzZGN0bCwgRkNOX1hYX1NEX0NUTF9SRUdfTUFDICk7CisKKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzggKCB0eGRydiwKKwkJCQlGQ05fWFhfREVRRCwgWFhfVFhEUlZfREVRX0RFRkFVTFQsCisJCQkJRkNOX1hYX0RFUUMsIFhYX1RYRFJWX0RFUV9ERUZBVUxULAorCQkJCUZDTl9YWF9ERVFCLCBYWF9UWERSVl9ERVFfREVGQVVMVCwKKwkJCQlGQ05fWFhfREVRQSwgWFhfVFhEUlZfREVRX0RFRkFVTFQsCisJCQkJRkNOX1hYX0RUWEQsIFhYX1RYRFJWX0RUWF9ERUZBVUxULAorCQkJCUZDTl9YWF9EVFhDLCBYWF9UWERSVl9EVFhfREVGQVVMVCwKKwkJCQlGQ05fWFhfRFRYQiwgWFhfVFhEUlZfRFRYX0RFRkFVTFQsCisJCQkJRkNOX1hYX0RUWEEsIFhYX1RYRFJWX0RUWF9ERUZBVUxUKTsKKwlmYWxjb25feG1hY193cml0ZWwgKCBlZmFiLCAmdHhkcnYsIEZDTl9YWF9UWERSVl9DVExfUkVHX01BQyk7Cit9CisKK3N0YXRpYyBpbnQKK2ZhbGNvbl94Z21paV9zdGF0dXMgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWVmYWJfZHdvcmRfdCByZWc7CisKKwlpZiAoIGVmYWItPnBjaV9yZXZpc2lvbiAgPCBGQUxDT05fUkVWX0IwICkKKwkJcmV0dXJuIDE7CisJLyogVGhlIElTUiBsYXRjaGVzLCBzbyBjbGVhciBpdCBhbmQgcmUtcmVhZCAqLworCWZhbGNvbl94bWFjX3JlYWRsICggZWZhYiwgJnJlZywgRkNOX1hNX01HVF9JTlRfUkVHX01BQ19CMCApOworCWZhbGNvbl94bWFjX3JlYWRsICggZWZhYiwgJnJlZywgRkNOX1hNX01HVF9JTlRfUkVHX01BQ19CMCApOworCisJaWYgKCBFRkFCX0RXT1JEX0ZJRUxEICggcmVnLCBGQ05fWE1fTENMRkxUICkgfHwKKwkgICAgIEVGQUJfRFdPUkRfRklFTEQgKCByZWcsIEZDTl9YTV9STVRGTFQgKSApIHsKKwkJRUZBQl9UUkFDRSAoICJNR1RfSU5UOiAiRUZBQl9EV09SRF9GTVQiXG4iLAorCQkJICAgICBFRkFCX0RXT1JEX1ZBTCAoIHJlZyApICk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZmFsY29uX21hc2tfc3RhdHVzX2ludHIgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIsIGludCBlbmFibGUgKQoreworCWVmYWJfZHdvcmRfdCByZWc7CisKKwlpZiAoIGVmYWItPnBjaV9yZXZpc2lvbiAgPCBGQUxDT05fUkVWX0IwICkKKwkJcmV0dXJuOworCisJLyogRmx1c2ggdGhlIElTUiAqLworCWlmICggZW5hYmxlICkKKwkJZmFsY29uX3htYWNfcmVhZGwgKCBlZmFiLCAmcmVnLCBGQ05fWE1fTUdUX0lOVF9SRUdfTUFDX0IwICk7CisKKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzIgKCByZWcsCisJCQkJRkNOX1hNX01TS19STVRGTFQsICFlbmFibGUsCisJCQkJRkNOX1hNX01TS19MQ0xGTFQsICFlbmFibGUpOworCWZhbGNvbl94bWFjX3JlYWRsICggZWZhYiwgJnJlZywgRkNOX1hNX01HVF9JTlRfTVNLX1JFR19NQUNfQjAgKTsKK30KKworLyoqCisgKiBSZXNldCAxMEcgTUFDIGNvbm5lY3RlZCB0byBwb3J0CisgKgorICovCitzdGF0aWMgaW50CitmYWxjb25fcmVzZXRfeG1hYyAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJZWZhYl9kd29yZF90IHJlZzsKKwlpbnQgY291bnQ7CisKKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzEgKCByZWcsIEZDTl9YTV9DT1JFX1JTVCwgMSApOworCWZhbGNvbl94bWFjX3dyaXRlbCAoIGVmYWIsICZyZWcsIEZDTl9YTV9HTEJfQ0ZHX1JFR19NQUMgKTsKKworCWZvciAoIGNvdW50ID0gMCA7IGNvdW50IDwgMTAwMCA7IGNvdW50KysgKSB7CisJCXVkZWxheSAoIDEwICk7CisJCWZhbGNvbl94bWFjX3JlYWRsICggZWZhYiwgJnJlZywKKwkJCQkgICAgRkNOX1hNX0dMQl9DRkdfUkVHX01BQyApOworCQlpZiAoIEVGQUJfRFdPUkRfRklFTEQgKCByZWcsIEZDTl9YTV9DT1JFX1JTVCApID09IDAgKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRVRJTUVET1VUOworfQorCisKK3N0YXRpYyBpbnQKK2ZhbGNvbl9yZXNldF94YXVpICggc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwllZmFiX2R3b3JkX3QgcmVnOworCWludCBjb3VudDsKKworCWlmICghZWZhYi0+aXNfYXNpYykKKwkJcmV0dXJuIDA7CisKKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzEgKCByZWcsIEZDTl9YWF9SU1RfWFhfRU4sIDEgKTsKKwlmYWxjb25feG1hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBGQ05fWFhfUFdSX1JTVF9SRUdfTUFDICk7CisKKwkvKiBHaXZlIHNvbWUgdGltZSBmb3IgdGhlIGxpbmsgdG8gZXN0YWJsaXNoICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwMDsgY291bnQrKykgeyAvKiB3YWl0IHVwdG8gMTBtcyAqLworCQlmYWxjb25feG1hY19yZWFkbCAoIGVmYWIsICZyZWcsIEZDTl9YWF9QV1JfUlNUX1JFR19NQUMgKTsKKwkJaWYgKCBFRkFCX0RXT1JEX0ZJRUxEICggcmVnLCBGQ05fWFhfUlNUX1hYX0VOICkgPT0gMCApIHsKKwkJCWZhbGNvbl9zZXR1cF94YXVpICggZWZhYiApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisJRUZBQl9FUlIgKCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIFhBVUkvWEdYUyByZXNldFxuIiApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50CitmYWxjb25feGF1aV9saW5rX29rICggc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwllZmFiX2R3b3JkX3QgcmVnOworCWludCBhbGlnbl9kb25lLCBsYW5lX3N0YXR1cywgc3luYzsKKwlpbnQgaGFzX3BoeXhzOworCWludCBsaW5rX29rID0gMTsKKworCS8qIFJlYWQgRmFsY29uIFhBVUkgc2lkZSAqLworCWlmICggZWZhYi0+aXNfYXNpYyApIHsKKwkJLyogUmVhZCBsaW5rIHN0YXR1cyAqLworCQlmYWxjb25feG1hY19yZWFkbCAoIGVmYWIsICZyZWcsIEZDTl9YWF9DT1JFX1NUQVRfUkVHX01BQyApOworCQlhbGlnbl9kb25lID0gRUZBQl9EV09SRF9GSUVMRCAoIHJlZywgRkNOX1hYX0FMSUdOX0RPTkUgKTsKKworCQlzeW5jID0gRUZBQl9EV09SRF9GSUVMRCAoIHJlZywgRkNOX1hYX1NZTkNfU1RBVCApOworCQlzeW5jID0gKCBzeW5jID09IEZDTl9YWF9TWU5DX1NUQVRfREVDT0RFX1NZTkNFRCApOworCQkKKwkJbGlua19vayA9IGFsaWduX2RvbmUgJiYgc3luYzsKKwl9CisKKwkvKiBDbGVhciBsaW5rIHN0YXR1cyByZWFkeSBmb3IgbmV4dCByZWFkICovCisJRUZBQl9TRVRfRFdPUkRfRklFTEQgKCByZWcsIEZDTl9YWF9DT01NQV9ERVQsIEZDTl9YWF9DT01NQV9ERVRfUkVTRVQgKTsKKwlFRkFCX1NFVF9EV09SRF9GSUVMRCAoIHJlZywgRkNOX1hYX0NIQVJFUlIsIEZDTl9YWF9DSEFSRVJSX1JFU0VUKTsKKwlFRkFCX1NFVF9EV09SRF9GSUVMRCAoIHJlZywgRkNOX1hYX0RJU1BFUlIsIEZDTl9YWF9ESVNQRVJSX1JFU0VUKTsKKwlmYWxjb25feG1hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBGQ05fWFhfQ09SRV9TVEFUX1JFR19NQUMgKTsKKworCWhhc19waHl4cyA9ICggZWZhYi0+cGh5X29wLT5tbWRzICYgKCAxIDw8IE1ESU9fTU1EX1BIWVhTICkgKTsKKwlpZiAoIGxpbmtfb2sgJiYgaGFzX3BoeXhzICkgeworCQlsYW5lX3N0YXR1cyA9IGZhbGNvbl9tZGlvX3JlYWQgKCBlZmFiLCBNRElPX01NRF9QSFlYUywKKwkJCQkJCSBNRElPX1BIWVhTX0xBTkVfU1RBVEUgKTsKKwkJbGlua19vayA9ICggbGFuZV9zdGF0dXMgJiAoIDEgPDwgTURJT19QSFlYU19MQU5FX0FMSUdORURfTEJOICkgKTsKKworCQlpZiAoIWxpbmtfb2sgKQorCQkJRUZBQl9MT0cgKCAiWEdYUyBsYW5lIHN0YXR1czogJXhcbiIsIGxhbmVfc3RhdHVzICk7CisJfQorCisJcmV0dXJuIGxpbmtfb2s7Cit9CisKKy8qKgorICogSW5pdGlhbGlzZSBYTUFDCisgKgorICovCitzdGF0aWMgdm9pZAorZmFsY29uX3JlY29uZmlndXJlX3htYWMgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWVmYWJfZHdvcmRfdCByZWc7CisJaW50IG1heF9mcmFtZV9sZW47CisKKwkvKiBDb25maWd1cmUgTUFDIC0gY3V0LXRocnUgbW9kZSBpcyBoYXJkIHdpcmVkIG9uICovCisJRUZBQl9QT1BVTEFURV9EV09SRF8zICggcmVnLAorCQkJCUZDTl9YTV9SWF9KVU1CT19NT0RFLCAxLAorCQkJCUZDTl9YTV9UWF9TVEFUX0VOLCAxLAorCQkJCUZDTl9YTV9SWF9TVEFUX0VOLCAxKTsKKwlmYWxjb25feG1hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBGQ05fWE1fR0xCX0NGR19SRUdfTUFDICk7CisKKwkvKiBDb25maWd1cmUgVFggKi8KKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzYgKCByZWcsIAorCQkJCUZDTl9YTV9UWEVOLCAxLAorCQkJCUZDTl9YTV9UWF9QUk1CTCwgMSwKKwkJCQlGQ05fWE1fQVVUT19QQUQsIDEsCisJCQkJRkNOX1hNX1RYQ1JDLCAxLAorCQkJCUZDTl9YTV9GQ05UTCwgMSwKKwkJCQlGQ05fWE1fSVBHLCAweDMgKTsKKwlmYWxjb25feG1hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBGQ05fWE1fVFhfQ0ZHX1JFR19NQUMgKTsKKworCS8qIENvbmZpZ3VyZSBSWCAqLworCUVGQUJfUE9QVUxBVEVfRFdPUkRfNCAoIHJlZywKKwkJCQlGQ05fWE1fUlhFTiwgMSwKKwkJCQlGQ05fWE1fQVVUT19ERVBBRCwgMCwKKwkJCQlGQ05fWE1fQUNQVF9BTExfTUNBU1QsIDEsCisJCQkJRkNOX1hNX1BBU1NfQ1JDX0VSUiwgMSApOworCWZhbGNvbl94bWFjX3dyaXRlbCAoIGVmYWIsICZyZWcsIEZDTl9YTV9SWF9DRkdfUkVHX01BQyApOworCisJLyogU2V0IGZyYW1lIGxlbmd0aCAqLworCW1heF9mcmFtZV9sZW4gPSBFRkFCX01BWF9GUkFNRV9MRU4gKCBFVEhfRlJBTUVfTEVOICk7CisJRUZBQl9QT1BVTEFURV9EV09SRF8xICggcmVnLAorCQkJCUZDTl9YTV9NQVhfUlhfRlJNX1NJWkUsIG1heF9mcmFtZV9sZW4gKTsKKwlmYWxjb25feG1hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBGQ05fWE1fUlhfUEFSQU1fUkVHX01BQyApOworCUVGQUJfUE9QVUxBVEVfRFdPUkRfMiAoIHJlZywKKwkJCQlGQ05fWE1fTUFYX1RYX0ZSTV9TSVpFLCBtYXhfZnJhbWVfbGVuLAorCQkJCUZDTl9YTV9UWF9KVU1CT19NT0RFLCAxICk7CisJZmFsY29uX3htYWNfd3JpdGVsICggZWZhYiwgJnJlZywgRkNOX1hNX1RYX1BBUkFNX1JFR19NQUMgKTsKKworCS8qIEVuYWJsZSBmbG93IGNvbnRyb2wgcmVjZWlwdCAqLworCUVGQUJfUE9QVUxBVEVfRFdPUkRfMiAoIHJlZywKKwkJCQlGQ05fWE1fUEFVU0VfVElNRSwgMHhmZmZlLAorCQkJCUZDTl9YTV9ESVNfRkNOVEwsIDAgKTsKKwlmYWxjb25feG1hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBGQ05fWE1fRkNfUkVHX01BQyApOworCisJLyogU2V0IE1BQyBhZGRyZXNzICovCisJRUZBQl9QT1BVTEFURV9EV09SRF80ICggcmVnLAorCQkJCUZDTl9YTV9BRFJfMCwgZWZhYi0+bWFjX2FkZHJbMF0sCisJCQkJRkNOX1hNX0FEUl8xLCBlZmFiLT5tYWNfYWRkclsxXSwKKwkJCQlGQ05fWE1fQURSXzIsIGVmYWItPm1hY19hZGRyWzJdLAorCQkJCUZDTl9YTV9BRFJfMywgZWZhYi0+bWFjX2FkZHJbM10gKTsKKwlmYWxjb25feG1hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBGQ05fWE1fQURSX0xPX1JFR19NQUMgKTsKKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzIgKCByZWcsCisJCQkJRkNOX1hNX0FEUl80LCBlZmFiLT5tYWNfYWRkcls0XSwKKwkJCQlGQ05fWE1fQURSXzUsIGVmYWItPm1hY19hZGRyWzVdICk7CisJZmFsY29uX3htYWNfd3JpdGVsICggZWZhYiwgJnJlZywgRkNOX1hNX0FEUl9ISV9SRUdfTUFDICk7Cit9CisKK3N0YXRpYyBpbnQKK2ZhbGNvbl9pbml0X3htYWMgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWludCBjb3VudCwgcmM7CisKKwkvKiBNYXNrIHRoZSBQSFkgbWFuYWdlbWVudCBpbnRlcnJ1cHQgKi8KKwlmYWxjb25fbWFza19zdGF0dXNfaW50ciAoIGVmYWIsIDAgKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIFBIWSB0byBpbnN0YW50aWF0ZSB0aGUgY2xvY2suICovCisJcmMgPSBlZmFiLT5waHlfb3AtPmluaXQgKCBlZmFiICk7CisJaWYgKCByYyApIHsKKwkJRUZBQl9FUlIgKCAidW5hYmxlIHRvIGluaXRpYWxpc2UgUEhZXG4iICk7CisJCWdvdG8gZmFpbDE7CisJfQorCisJZmFsY29uX3Jlc2V0X3hhdWkgKCBlZmFiICk7CisKKwkvKiBHaXZlIHRoZSBQSFkgYW5kIE1BQyB0aW1lIHRvIGZhZmYgKi8KKwltZGVsYXkgKCAxMDAgKTsKKworCS8qIFJlc2V0IGFuZCByZWNvbmZpZ3VyZSB0aGUgWE1BQyAqLworCXJjID0gZmFsY29uX3Jlc2V0X3htYWMgKCBlZmFiICk7CisJaWYgKCByYyApCisJCWdvdG8gZmFpbDI7CisJZmFsY29uX3JlY29uZmlndXJlX3htYWMgKCBlZmFiICk7CisJZmFsY29uX3JlY29uZmlndXJlX21hY193cmFwcGVyICggZWZhYiApOworCS8qKgorCSAqIE5vdyB3YWl0IGZvciB0aGUgbGluayB0byBjb21lIHVwLiBUaGlzIG1heSB0YWtlIGEgd2hpbGUKKwkgKiBmb3Igc29tZSBzbG93ZXIgUEhZJ3MuCisJICovCisJZm9yIChjb3VudD0wOyBjb3VudDw1MDsgY291bnQrKykgeworCQlpbnQgbGlua19vayA9IDE7CisKKwkJLyogV2FpdCBhIHdoaWxlIGZvciB0aGUgbGluayB0byBjb21lIHVwLiAqLworCQltZGVsYXkgKCAxMDAgKTsKKwkJaWYgKChjb3VudCAlIDUpID09IDApCisJCQlwdXRjaGFyICggJy4nICk7CisKKwkJLyogRG9lcyB0aGUgUEhZIHRoaW5rIHRoZSB3aXJlLXNpZGUgbGluayBpcyB1cD8gKi8KKwkJbGlua19vayA9IG1kaW9fY2xhdXNlNDVfbGlua3Nfb2sgKCBlZmFiICk7CisJCS8qIEVuc3VyZSB0aGUgWEFVSSBsaW5rIHRvIHRoZSBQSFkgaXMgZ29vZCAqLworCQlpZiAoIGxpbmtfb2sgKSB7CisJCQlsaW5rX29rID0gZmFsY29uX3hhdWlfbGlua19vayAoIGVmYWIgKTsKKwkJCWlmICggIWxpbmtfb2sgKQorCQkJCWZhbGNvbl9yZXNldF94YXVpICggZWZhYiApOworCQl9CisKKwkJLyogQ2hlY2sgZmF1bHQgaW5kaWNhdGlvbiAqLworCQlpZiAoIGxpbmtfb2sgKQorCQkJbGlua19vayA9IGZhbGNvbl94Z21paV9zdGF0dXMgKCBlZmFiICk7CisKKwkJZWZhYi0+bGlua191cCA9IGxpbmtfb2s7CisJCWlmICggbGlua19vayApIHsKKwkJCS8qIHVubWFzayB0aGUgc3RhdHVzIGludGVycnVwdCAqLworCQkJZmFsY29uX21hc2tfc3RhdHVzX2ludHIgKCBlZmFiLCAxICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIExpbmsgZmFpbGVkIHRvIGNvbWUgdXAsIGJ1dCBpbml0aWFsaXNhdGlvbiB3YXMgZmluZS4gKi8KKwlyYyA9IC1FVElNRURPVVQ7CisKK2ZhaWwyOgorZmFpbDE6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IGVmYWJfbWFjX29wZXJhdGlvbnMgZmFsY29uX3htYWNfb3BlcmF0aW9ucyA9IHsKKwkuaW5pdCAgICAgICAgICAgICAgICAgICA9IGZhbGNvbl9pbml0X3htYWMsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBOdWxsIFBIWSBoYW5kbGluZworICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorZmFsY29uX3hhdWlfcGh5X2luaXQgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCS8qIENYNCBpcyBhbHdheXMgMTAwMDBGRCBvbmx5ICovCisJZWZhYi0+bGlua19vcHRpb25zID0gTFBBX0VGXzEwMDAwRlVMTDsKKworCS8qIFRoZXJlIGlzIG5vIFBIWSEgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlZmFiX3BoeV9vcGVyYXRpb25zIGZhbGNvbl94YXVpX3BoeV9vcHMgPSB7CisJLmluaXQgICAgICAgICAgICAgICAgICAgPSBmYWxjb25feGF1aV9waHlfaW5pdCwKKwkubW1kcyAgICAgICAgICAgICAgICAgICA9IDAsCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoKKyAqIEFsYXNrYSBQSFkKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogSW5pdGlhbGlzZSBBbGFza2EgUEhZCisgKgorICovCitzdGF0aWMgaW50CithbGFza2FfaW5pdCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJdW5zaWduZWQgaW50IGFkdmVydGlzZWQsIGxwYTsKKworCS8qIFJlYWQgbGluayB1cCBzdGF0dXMgKi8KKwllZmFiLT5saW5rX3VwID0gZ21paV9saW5rX29rICggZWZhYiApOworCisJaWYgKCAhIGVmYWItPmxpbmtfdXAgKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIERldGVybWluZSBsaW5rIG9wdGlvbnMgZnJvbSBQSFkuICovCisJYWR2ZXJ0aXNlZCA9IGdtaWlfYXV0b25lZ19hZHZlcnRpc2VkICggZWZhYiApOworCWxwYSA9IGdtaWlfYXV0b25lZ19scGEgKCBlZmFiICk7CisJZWZhYi0+bGlua19vcHRpb25zID0gZ21paV9ud2F5X3Jlc3VsdCAoIGFkdmVydGlzZWQgJiBscGEgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVmYWJfcGh5X29wZXJhdGlvbnMgZmFsY29uX2FsYXNrYV9waHlfb3BzID0geworCS5pbml0ICAJICAgIAk9IGFsYXNrYV9pbml0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogeGZwCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFhGUF9SRVFVSVJFRF9ERVZTICggTURJT19NTURSRUdfREVWUzBfUENTICAgIHwJCVwKKwkJCSAgICBNRElPX01NRFJFR19ERVZTMF9QTUFQTUQgfAkJXAorCQkJICAgIE1ESU9fTU1EUkVHX0RFVlMwX1BIWVhTICkKKworc3RhdGljIGludAorZmFsY29uX3hmcF9waHlfaW5pdCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJaW50IHJjOworCisJLyogT3B0aWNhbCBsaW5rIGlzIGFsd2F5cyAxMDAwMEZEIG9ubHkgKi8KKwllZmFiLT5saW5rX29wdGlvbnMgPSBMUEFfRUZfMTAwMDBGVUxMOworCisJLyogUmVzZXQgdGhlIFBIWSAqLworCXJjID0gbWRpb19jbGF1c2U0NV9yZXNldF9tbWQgKCBlZmFiLCBNRElPX01NRF9QSFlYUyApOworCWlmICggcmMgKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlZmFiX3BoeV9vcGVyYXRpb25zIGZhbGNvbl94ZnBfcGh5X29wcyA9IHsKKwkuaW5pdCAgICAgICAgICAgICAgICAgICA9IGZhbGNvbl94ZnBfcGh5X2luaXQsCisJLm1tZHMgICAgICAgICAgICAgICAgICAgPSBYRlBfUkVRVUlSRURfREVWUywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoKKyAqIHR4YzQzMTI4CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb21tYW5kIHJlZ2lzdGVyICovCisjZGVmaW5lIFRYQ19HTFJHU19HTENNRAkJKDB4YzAwNCkKKyNkZWZpbmUgVFhDX0dMQ01EX0xNVFNXUlNUX0xCTgkoMTQpCisKKy8qIEFtcGxpdHVkZSBvbiBsYW5lcyAwKzEsIDIrMyAqLworI2RlZmluZSAgVFhDX0FMUkdTX0FUWEFNUDAJKDB4YzA0MSkKKyNkZWZpbmUgIFRYQ19BTFJHU19BVFhBTVAxCSgweGMwNDIpCisvKiBCaXQgcG9zaXRpb24gb2YgdmFsdWUgZm9yIGxhbmUgMCsyLCAxKzMgKi8KKyNkZWZpbmUgVFhDX0FUWEFNUF9MQU5FMDJfTEJOCSgzKQorI2RlZmluZSBUWENfQVRYQU1QX0xBTkUxM19MQk4JKDExKQorCisjZGVmaW5lIFRYQ19BVFhBTVBfMTI4MF9tVgkoMCkKKyNkZWZpbmUgVFhDX0FUWEFNUF8xMjAwX21WCSg4KQorI2RlZmluZSBUWENfQVRYQU1QXzExMjBfbVYJKDEyKQorI2RlZmluZSBUWENfQVRYQU1QXzEwNjBfbVYJKDE0KQorI2RlZmluZSBUWENfQVRYQU1QXzA4MjBfbVYJKDI1KQorI2RlZmluZSBUWENfQVRYQU1QXzA3MjBfbVYJKDI2KQorI2RlZmluZSBUWENfQVRYQU1QXzA1ODBfbVYJKDI3KQorI2RlZmluZSBUWENfQVRYQU1QXzA0NDBfbVYJKDI4KQorCisjZGVmaW5lIFRYQ19BVFhBTVBfMDgyMF9CT1RICSggKFRYQ19BVFhBTVBfMDgyMF9tViA8PCBUWENfQVRYQU1QX0xBTkUwMl9MQk4pIHwgXAorCQkJCSAgKFRYQ19BVFhBTVBfMDgyMF9tViA8PCBUWENfQVRYQU1QX0xBTkUxM19MQk4pICkKKworI2RlZmluZSBUWENfQVRYQU1QX0RFRkFVTFQJKDB4NjA2MCkgLyogRnJvbSBkYXRhYm9vayAqLworCisvKiBQcmVlbXBoYXNpcyBvbiBsYW5lcyAwKzEsIDIrMyAqLworI2RlZmluZSAgVFhDX0FMUkdTX0FUWFBSRTAJKDB4YzA0MykKKyNkZWZpbmUgIFRYQ19BTFJHU19BVFhQUkUxCSgweGMwNDQpCisKKyNkZWZpbmUgVFhDX0FUWFBSRV9OT05FICgwKQorI2RlZmluZSBUWENfQVRYUFJFX0RFRkFVTFQJKDB4MTAxMCkgLyogRnJvbSBkYXRhYm9vayAqLworCisjZGVmaW5lIFRYQ19SRVFVSVJFRF9ERVZTICggTURJT19NTURSRUdfREVWUzBfUENTICAgIHwJICAgICAgIFwKKwkJCSAgICBNRElPX01NRFJFR19ERVZTMF9QTUFQTUQgfAkgICAgICAgXAorCQkJICAgIE1ESU9fTU1EUkVHX0RFVlMwX1BIWVhTICkKKworc3RhdGljIGludAorZmFsY29uX3R4Y19sb2dpY19yZXNldCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJaW50IHZhbDsKKwlpbnQgdHJpZXMgPSA1MDsKKworCXZhbCA9IGZhbGNvbl9tZGlvX3JlYWQgKCBlZmFiLCBNRElPX01NRF9QQ1MsIFRYQ19HTFJHU19HTENNRCApOworCXZhbCB8PSAoMSA8PCBUWENfR0xDTURfTE1UU1dSU1RfTEJOKTsKKwlmYWxjb25fbWRpb193cml0ZSAoIGVmYWIsIE1ESU9fTU1EX1BDUywgVFhDX0dMUkdTX0dMQ01ELCB2YWwgKTsKKworCXdoaWxlICggdHJpZXMtLSkgeworCQl2YWwgPSBmYWxjb25fbWRpb19yZWFkICggZWZhYiwgTURJT19NTURfUENTLCBUWENfR0xSR1NfR0xDTUQgKTsKKwkJaWYgKCB+dmFsICYgKCAxIDw8IFRYQ19HTENNRF9MTVRTV1JTVF9MQk4gKSApCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDEpOworCX0KKworCUVGQUJfRVJSICggImxvZ2ljIHJlc2V0IGZhaWxlZFxuIiApOworCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQKK2ZhbGNvbl90eGNfcGh5X2luaXQgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWludCByYzsKKworCS8qIENYNCBpcyBhbHdheXMgMTAwMDBGRCBvbmx5ICovCisJZWZhYi0+bGlua19vcHRpb25zID0gTFBBX0VGXzEwMDAwRlVMTDsKKworCS8qIHJlc2V0IHRoZSBwaHkgKi8KKwlyYyA9IG1kaW9fY2xhdXNlNDVfcmVzZXRfbW1kICggZWZhYiwgTURJT19NTURfUE1BUE1EICk7CisJaWYgKCByYyApCisJCWdvdG8gZmFpbDE7CisKKwlyYyA9IG1kaW9fY2xhdXNlNDVfY2hlY2tfbW1kcyAoIGVmYWIgKTsKKwlpZiAoIHJjICkKKwkJZ290byBmYWlsMjsKKworCS8qIFR1cm4gYW1wbGl0dWRlIGRvd24gYW5kIHByZWVtcGhhc2lzIG9mZiBvbiB0aGUgaG9zdCBzaWRlCisJICogKFBIWTwtPk1BQykgYXMgdGhpcyBpcyBiZWxpZXZlZCBsZXNzIGxpa2VseSB0byB1cHNldCBmYWxjb24KKwkgKiBhbmQgbm8gYWR2ZXJzZSBlZmZlY3RzIGhhdmUgYmVlbiBub3RlZC4gSXQgcHJvYmFibHkgYWxzbyAKKwkgKiBzYXZlcyBhIHBpY293YXR0IG9yIHR3byAqLworCisJLyogVHVybiBvZmYgcHJlZW1waGFzaXMgKi8KKwlmYWxjb25fbWRpb193cml0ZSAoIGVmYWIsIE1ESU9fTU1EX1BIWVhTLCBUWENfQUxSR1NfQVRYUFJFMCwKKwkJCSAgICBUWENfQVRYUFJFX05PTkUgKTsKKwlmYWxjb25fbWRpb193cml0ZSAoIGVmYWIsIE1ESU9fTU1EX1BIWVhTLCBUWENfQUxSR1NfQVRYUFJFMSwKKwkJCSAgICBUWENfQVRYUFJFX05PTkUgKTsKKworCS8qIFR1cm4gZG93biB0aGUgYW1wbGl0dWRlICovCisJZmFsY29uX21kaW9fd3JpdGUgKCBlZmFiLCBNRElPX01NRF9QSFlYUywgVFhDX0FMUkdTX0FUWEFNUDAsCisJCQkgICAgVFhDX0FUWEFNUF8wODIwX0JPVEggKTsKKwlmYWxjb25fbWRpb193cml0ZSAoIGVmYWIsIE1ESU9fTU1EX1BIWVhTLCBUWENfQUxSR1NfQVRYQU1QMSwKKwkJCSAgICBUWENfQVRYQU1QXzA4MjBfQk9USCApOworCisJLyogU2V0IHRoZSBsaW5lIHNpZGUgYW1wbGl0dWRlIGFuZCBwcmVlbXBoYXNpcyB0byB0aGUgZGF0YWJvb2sKKwkgKiBkZWZhdWx0cyBhcyBhbiBlcnJhdHVtIGNhdXNlcyB0aGVtIHRvIGJlIDAgb24gYXQgbGVhc3Qgc29tZQorCSAqIFBIWSByZXYucyAqLworCWZhbGNvbl9tZGlvX3dyaXRlICggZWZhYiwgTURJT19NTURfUE1BUE1ELCBUWENfQUxSR1NfQVRYUFJFMCwKKwkJCSAgICBUWENfQVRYUFJFX0RFRkFVTFQgKTsKKwlmYWxjb25fbWRpb193cml0ZSAoIGVmYWIsIE1ESU9fTU1EX1BNQVBNRCwgVFhDX0FMUkdTX0FUWFBSRTEsCisJCQkgICAgVFhDX0FUWFBSRV9ERUZBVUxUICk7CisJZmFsY29uX21kaW9fd3JpdGUgKCBlZmFiLCBNRElPX01NRF9QTUFQTUQsIFRYQ19BTFJHU19BVFhBTVAwLAorCQkJICAgIFRYQ19BVFhBTVBfREVGQVVMVCApOworCWZhbGNvbl9tZGlvX3dyaXRlICggZWZhYiwgTURJT19NTURfUE1BUE1ELCBUWENfQUxSR1NfQVRYQU1QMSwKKwkJCSAgICBUWENfQVRYQU1QX0RFRkFVTFQgKTsKKworCXJjID0gZmFsY29uX3R4Y19sb2dpY19yZXNldCAoIGVmYWIgKTsKKwlpZiAoIHJjICkKKwkJZ290byBmYWlsMzsKKworCXJldHVybiAwOworCitmYWlsMzoKK2ZhaWwyOgorZmFpbDE6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IGVmYWJfcGh5X29wZXJhdGlvbnMgZmFsY29uX3R4Y19waHlfb3BzID0geworCS5pbml0ICAgICAgICAgICAgICAgICAgID0gZmFsY29uX3R4Y19waHlfaW5pdCwKKwkubW1kcyAgICAgICAgICAgICAgICAgICA9IFRYQ19SRVFVSVJFRF9ERVZTLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogdGVueHByZXNzCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgVEVOWFBSRVNTX1JFUVVJUkVEX0RFVlMgKCBNRElPX01NRFJFR19ERVZTMF9QTUFQTUQgfAlcCisJCQkJICBNRElPX01NRFJFR19ERVZTMF9QQ1MgICAgfAlcCisJCQkJICBNRElPX01NRFJFR19ERVZTMF9QSFlYUyApCisKKyNkZWZpbmUJUENTX1RFU1RfU0VMRUNUX1JFRyAweGQ4MDcJLyogUFJNIDEwLjUuOCAqLworI2RlZmluZQlDTEszMTJfRU5fTEJOIDMKKyNkZWZpbmUJQ0xLMzEyX0VOX1dJRFRIIDEKKworI2RlZmluZSBQQ1NfQ0xPQ0tfQ1RSTF9SRUcgMHhkODAxCisjZGVmaW5lIFBMTDMxMl9SU1RfTl9MQk4gMgorCisvKiBTcGVjaWFsIFNvZnR3YXJlIHJlc2V0IHJlZ2lzdGVyICovCisjZGVmaW5lIFBNQV9QTURfRVhUX0NUUkxfUkVHIDQ5MTUyCisjZGVmaW5lIFBNQV9QTURfRVhUX1NTUl9MQk4gMTUKKworLyogQm9vdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENTX0JPT1RfU1RBVFVTX1JFRwkweGQwMDAKKyNkZWZpbmUgUENTX0JPT1RfRkFUQUxfRVJSX0xCTgkwCisjZGVmaW5lIFBDU19CT09UX1BST0dSRVNTX0xCTgkxCisjZGVmaW5lIFBDU19CT09UX1BST0dSRVNTX1dJRFRICTIKKyNkZWZpbmUgUENTX0JPT1RfQ09NUExFVEVfTEJOCTMKKworI2RlZmluZSBQQ1NfU09GVF9SU1QyX1JFRyAweGQ4MDYKKyNkZWZpbmUgU0VSREVTX1JTVF9OX0xCTiAxMworI2RlZmluZSBYR1hTX1JTVF9OX0xCTiAxMgorCitzdGF0aWMgaW50CitmYWxjb25fdGVueHByZXNzX2NoZWNrX2MxMSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJaW50IGNvdW50OworCXVpbnQzMl90IGJvb3Rfc3RhdDsKKworCS8qIENoZWNrIHRoYXQgdGhlIEMxMSBDUFUgaGFzIGJvb3RlZCAqLworCWZvciAoY291bnQ9MDsgY291bnQ8MTA7IGNvdW50KyspIHsKKwkJYm9vdF9zdGF0ID0gZmFsY29uX21kaW9fcmVhZCAoIGVmYWIsIE1ESU9fTU1EX1BDUywKKwkJCQkJICAgICAgIFBDU19CT09UX1NUQVRVU19SRUcgKTsKKwkJaWYgKCBib290X3N0YXQgJiAoIDEgPDwgUENTX0JPT1RfQ09NUExFVEVfTEJOICkgKQorCQkJcmV0dXJuIDA7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlFRkFCX0VSUiAoICJDMTEgZmFpbGVkIHRvIGJvb3RcbiIgKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIGludAorZmFsY29uX3RlbnhwcmVzc19waHlfaW5pdCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJaW50IHJjLCByZWc7CisKKwkvKiAxMFhQUkVTUyBpcyBhbHdheXMgMTAwMDBGRCAoYXQgdGhlIG1vbWVudCkgKi8KKwllZmFiLT5saW5rX29wdGlvbnMgPSBMUEFfRUZfMTAwMDBGVUxMOworCisJLyogV2FpdCBmb3IgdGhlIGJsb2NrcyB0byBjb21lIG91dCBvZiByZXNldCAqLworCXJjID0gbWRpb19jbGF1c2U0NV93YWl0X3Jlc2V0X21tZHMgKCBlZmFiICk7CisJaWYgKCByYyApCisJCWdvdG8gZmFpbDE7CisKKwlyYyA9IG1kaW9fY2xhdXNlNDVfY2hlY2tfbW1kcyAoIGVmYWIgKTsKKwlpZiAoIHJjICkKKwkJZ290byBmYWlsMjsKKworCS8qIFR1cm4gb24gdGhlIGNsb2NrICAqLworCXJlZyA9ICgxIDw8IENMSzMxMl9FTl9MQk4pOworCWZhbGNvbl9tZGlvX3dyaXRlICggZWZhYiwgTURJT19NTURfUENTLCBQQ1NfVEVTVF9TRUxFQ1RfUkVHLCByZWcpOworCisJLyogV2FpdCAyMDBtcyBmb3IgdGhlIFBIWSB0byBib290ICovCisJbWRlbGF5KDIwMCk7CisKKwlyYyA9IGZhbGNvbl90ZW54cHJlc3NfY2hlY2tfYzExICggZWZhYiApOworCWlmICggcmMgKQorCQlnb3RvIGZhaWwzOworCisJcmV0dXJuIDA7CisKK2ZhaWwzOgorZmFpbDI6CitmYWlsMToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWZhYl9waHlfb3BlcmF0aW9ucyBmYWxjb25fdGVueHByZXNzX3BoeV9vcHMgPSB7CisJLmluaXQgICAgICAgICAgICAgICAgICAgPSBmYWxjb25fdGVueHByZXNzX3BoeV9pbml0LAorCS5tbWRzICAgICAgICAgICAgICAgICAgID0gVEVOWFBSRVNTX1JFUVVJUkVEX0RFVlMsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBQTTgzNTgKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBQTTgzNTgganVzdCBwcmVzZW50cyBhIERURSBYUyAqLworI2RlZmluZSBQTTgzNThfUkVRVUlSRURfREVWUyAoTURJT19NTURSRUdfREVWUzBfRFRFWFMpCisKKy8qIFBIWS1zcGVjaWZpYyBkZWZpbml0aW9ucyAqLworLyogTWFzdGVyIElEIGFuZCBHbG9iYWwgUGVyZm9ybWFuY2UgTW9uaXRvciBVcGRhdGUgKi8KKyNkZWZpbmUgUE1DX01BU1RFUl9SRUcgKDB4ZDAwMCkKKy8qIEFuYWxvZyBUeCBSeCBzZXR0aW5ncyB1bmRlciBzb2Z0d2FyZSBjb250cm9sICovCisjZGVmaW5lIFBNQ19NQVNURVJfQU5MR19DVFJMICgxPDwgMTEpCisKKy8qIE1hc3RlciBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUE1DX01DT05GMl9SRUcJKDB4ZDAwMikKKy8qIERyaXZlIFR4IG9mZiBjZW50cmUgb2YgZGF0YSBleWUgKDEpIHZzLiBjbG9jayBlZGdlICgwKSAqLworI2RlZmluZQlQTUNfTUNPTkYyX1RFREdFICgxIDw8IDIpIAorLyogRHJpdmUgUnggb2ZmIGNlbnRyZSBvZiBkYXRhIGV5ZSAoMSkgdnMuIGNsb2NrIGVkZ2UgKDApICovCisjZGVmaW5lIFBNQ19NQ09ORjJfUkVER0UgKDEgPDwgMykKKworLyogQW5hbG9nIFJ4IHNldHRpbmdzICovCisjZGVmaW5lIFBNQ19BTkFMT0dfUlhfQ0ZHMCAgICgweGQwMjUpCisjZGVmaW5lIFBNQ19BTkFMT0dfUlhfQ0ZHMSAgICgweGQwMmQpCisjZGVmaW5lIFBNQ19BTkFMT0dfUlhfQ0ZHMiAgICgweGQwMzUpCisjZGVmaW5lIFBNQ19BTkFMT0dfUlhfQ0ZHMyAgICgweGQwM2QpCisKKworI2RlZmluZSBQTUNfQU5BTE9HX1JYX1RFUk0gICAgICgxIDw8IDE1KSAvKiBCaXQgMTUgb2YgUlggQ0ZHOiAwIGZvciAxMDAgb2htcyBmbG9hdCwKKwkJCQkJICAgIDEgZm9yIDUwIHRvIDEuMlYgKi8KKyNkZWZpbmUgUE1DX0FOQUxPR19SWF9FUV9NQVNLICgzIDw8IDgpCisjZGVmaW5lIFBNQ19BTkFMT0dfUlhfRVFfTk9ORSAoMCA8PCA4KQorI2RlZmluZSBQTUNfQU5BTE9HX1JYX0VRX0hBTEYgKDEgPDwgOCkKKyNkZWZpbmUgUE1DX0FOQUxPR19SWF9FUV9GVUxMICgyIDw8IDgpCisjZGVmaW5lIFBNQ19BTkFMT0dfUlhfRVFfUlNWRCAoMyA8PCA4KQorCitzdGF0aWMgaW50CitmYWxjb25fcG04MzU4X3BoeV9pbml0ICggc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwlpbnQgcmMsIHJlZywgaTsKKworCS8qIFRoaXMgaXMgYSBYQVVJIHJldGltZXIgcGFydCAqLworCWVmYWItPmxpbmtfb3B0aW9ucyA9IExQQV9FRl8xMDAwMEZVTEw7CisKKwlyYyA9IG1kaW9fY2xhdXNlNDVfcmVzZXRfbW1kICggZWZhYiwgTURJT19NTURSRUdfREVWUzBfRFRFWFMgKTsKKwlpZiAoIHJjICkKKwkJcmV0dXJuIHJjOworCQorCS8qIEVuYWJsZSBzb2Z0d2FyZSBjb250cm9sIG9mIGFuYWxvZ3VlIHNldHRpbmdzICovCisJcmVnID0gZmFsY29uX21kaW9fcmVhZCAoIGVmYWIsIE1ESU9fTU1EX0RURVhTLCAgUE1DX01BU1RFUl9SRUcgKTsKKwlyZWcgfD0gUE1DX01BU1RFUl9BTkxHX0NUUkw7CisJZmFsY29uX21kaW9fd3JpdGUgKCBlZmFiLCBNRElPX01NRF9EVEVYUywgUE1DX01BU1RFUl9SRUcsIHJlZyApOworCisJLyogVHVybiByeCBlcSBvbiBmb3IgYWxsIGNoYW5uZWxzICovCisJZm9yIChpPTA7IGk8IDM7IGkrKykgeworCQkvKiBUaGUgYW5hbG9nIENGRyByZWdpc3RlcnMgYXJlIGV2ZW5seSBzcGFjZWQgOCBhcGFydCAqLworCQl1aW50MTZfdCBhZGRyID0gUE1DX0FOQUxPR19SWF9DRkcwICsgOCppOworCQlyZWcgPSBmYWxjb25fbWRpb19yZWFkICggZWZhYiwgTURJT19NTURfRFRFWFMsIGFkZHIgKTsKKwkJcmVnID0gKCByZWcgJiB+UE1DX0FOQUxPR19SWF9FUV9NQVNLICkgfCBQTUNfQU5BTE9HX1JYX0VRX0ZVTEw7CisJCWZhbGNvbl9tZGlvX3dyaXRlICggZWZhYiwgTURJT19NTURfRFRFWFMsIGFkZHIsIHJlZyApOworCX0KKworCS8qIFNldCBURURHRSwgY2xlYXIgUkVER0UgKi8KKwlyZWcgPSBmYWxjb25fbWRpb19yZWFkICggZWZhYiwgTURJT19NTURfRFRFWFMsIFBNQ19NQ09ORjJfUkVHICk7CisJcmVnID0gKCByZWcgJiB+UE1DX01DT05GMl9SRURHRSkgfCBQTUNfTUNPTkYyX1RFREdFOworCWZhbGNvbl9tZGlvX3dyaXRlICggZWZhYiwgTURJT19NTURfRFRFWFMsIFBNQ19NQ09ORjJfUkVHLCByZWcgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVmYWJfcGh5X29wZXJhdGlvbnMgZmFsY29uX3BtODM1OF9waHlfb3BzID0geworCS5pbml0ICAgICAgICAgICAgICAgICAgID0gZmFsY29uX3BtODM1OF9waHlfaW5pdCwKKwkubW1kcyAgICAgICAgICAgICAgICAgICA9IFBNODM1OF9SRVFVSVJFRF9ERVZTLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogU0ZFNDAwMSBzdXBwb3J0CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1BWF9URU1QX1RIUkVTSCA5MAorCisvKiBJMkMgRXhwYW5kZXIgKi8KKyNkZWZpbmUgUENBOTUzOSAweDc0CisKKyNkZWZpbmUgUDBfSU4gMHgwMAorI2RlZmluZSBQMF9PVVQgMHgwMgorI2RlZmluZSBQMF9DT05GSUcgMHgwNgorCisjZGVmaW5lIFAwX0VOXzFWMFhfTEJOIDAKKyNkZWZpbmUgUDBfRU5fMVYwWF9XSURUSCAxCisjZGVmaW5lIFAwX0VOXzFWMl9MQk4gMQorI2RlZmluZSBQMF9FTl8xVjJfV0lEVEggMQorI2RlZmluZSBQMF9FTl8yVjVfTEJOIDIKKyNkZWZpbmUgUDBfRU5fMlY1X1dJRFRIIDEKKyNkZWZpbmUgUDBfRU5fM1YzWF9MQk4gMworI2RlZmluZSBQMF9FTl8zVjNYX1dJRFRIIDEKKyNkZWZpbmUgUDBfRU5fNVZfTEJOIDQKKyNkZWZpbmUgUDBfRU5fNVZfV0lEVEggMQorI2RlZmluZSBQMF9YX1RSU1RfTEJOIDYKKyNkZWZpbmUgUDBfWF9UUlNUX1dJRFRIIDEKKworI2RlZmluZSBQMV9JTiAweDAxCisjZGVmaW5lIFAxX0NPTkZJRyAweDA3CisKKyNkZWZpbmUgUDFfQUZFX1BXRF9MQk4gMAorI2RlZmluZSBQMV9BRkVfUFdEX1dJRFRIIDEKKyNkZWZpbmUgUDFfRFNQX1BXRDI1X0xCTiAxCisjZGVmaW5lIFAxX0RTUF9QV0QyNV9XSURUSCAxCisjZGVmaW5lIFAxX1NQQVJFX0xCTiA0CisjZGVmaW5lIFAxX1NQQVJFX1dJRFRIIDQKKworLyogVGVtcGVyYXR1cmUgU2Vuc29yICovCisjZGVmaW5lIE1BWDY2NDcJMHg0ZQorCisjZGVmaW5lIFJTTAkweDAyCisjZGVmaW5lIFJMSE4JMHgwNQorI2RlZmluZSBXTEhPCTB4MGIKKworc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlIGkyY19wY2E5NTM5ID0geworCS5kZXZfYWRkciA9IFBDQTk1MzksCisJLmRldl9hZGRyX2xlbiA9IDEsCisJLndvcmRfYWRkcl9sZW4gPSAxLAorfTsKKworCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2UgaTJjX21heDY2NDcgPSB7CisJLmRldl9hZGRyID0gTUFYNjY0NywKKwkuZGV2X2FkZHJfbGVuID0gMSwKKwkud29yZF9hZGRyX2xlbiA9IDEsCit9OworCitzdGF0aWMgaW50CitzZmU0MDAxX2luaXQgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCXN0cnVjdCBpMmNfaW50ZXJmYWNlICppMmMgPSAmZWZhYi0+aTJjX2JiLmkyYzsKKwllZmFiX2R3b3JkX3QgcmVnOworCXVpbnQ4X3QgaW4sIGNmZywgb3V0OworCWludCBjb3VudCwgcmM7CisKKwlFRkFCX0xPRyAoICJJbml0aWFsaXNlIFNGRTQwMDEgYm9hcmRcbiIgKTsKKworCS8qIEVuc3VyZSBYR1hTIGFuZCBYQVVJIFNlckRlcyBhcmUgaGVsZCBpbiByZXNldCAqLworCUVGQUJfUE9QVUxBVEVfRFdPUkRfNyAoIHJlZywKKwkJCQlGQ05fWFhfUFdSRE5BX0VOLCAxLAorCQkJCUZDTl9YWF9QV1JETkJfRU4sIDEsCisJCQkJRkNOX1hYX1JTVFBMTEFCX0VOLCAxLAorCQkJCUZDTl9YWF9SRVNFVEFfRU4sIDEsCisJCQkJRkNOX1hYX1JFU0VUQl9FTiwgMSwKKwkJCQlGQ05fWFhfUlNUWEdYU1JYX0VOLCAxLAorCQkJCUZDTl9YWF9SU1RYR1hTVFhfRU4sIDEgKTsKKwlmYWxjb25feG1hY193cml0ZWwgKCBlZmFiLCAmcmVnLCBGQ05fWFhfUFdSX1JTVF9SRUdfTUFDKTsKKwl1ZGVsYXkoMTApOworCisJLyogU2V0IERTUCBvdmVyLXRlbXBlcmF0dXJlIGFsZXJ0IHRocmVzaG9sZCAqLworCWNmZyA9IE1BWF9URU1QX1RIUkVTSDsKKwlyYyA9IGkyYy0+d3JpdGUgKCBpMmMsICZpMmNfbWF4NjY0NywgV0xITywgJmNmZywgRUZBQl9CWVRFICk7CisJaWYgKCByYyApCisJCWdvdG8gZmFpbDE7CisKKwkvKiBSZWFkIGl0IGJhY2sgYW5kIHZlcmlmeSAqLworCXJjID0gaTJjLT5yZWFkICggaTJjLCAmaTJjX21heDY2NDcsIFJMSE4sICZpbiwgRUZBQl9CWVRFICk7CisJaWYgKCByYyApCisJCWdvdG8gZmFpbDI7CisKKwlpZiAoIGluICE9IE1BWF9URU1QX1RIUkVTSCApIHsKKwkJRUZBQl9FUlIgKCAiVW5hYmxlIHRvIHZlcmlmeSBNQVg2NjQ3IGxpbWl0IChyZXF1ZXN0ZWQ9JWQgIgorCQkJICAgImNvbmZpcm1lZD0lZClcbiIsIGNmZywgaW4gKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGZhaWwzOworCX0KKworCS8qIENsZWFyIGFueSBwcmV2aW91cyBvdmVyLXRlbXBlcmF0dXJlIGFsZXJ0ICovCisJcmMgPSBpMmMtPnJlYWQgKCBpMmMsICZpMmNfbWF4NjY0NywgUlNMLCAmaW4sIEVGQUJfQllURSApOworCWlmICggcmMgKQorCQlnb3RvIGZhaWw0OworCisJLyogRW5hYmxlIHBvcnQgMCBhbmQgMSBvdXRwdXRzIG9uIElPIGV4cGFuZGVyICovCisJY2ZnID0gMHgwMDsKKwlyYyA9IGkyYy0+d3JpdGUgKCBpMmMsICZpMmNfcGNhOTUzOSwgUDBfQ09ORklHLCAmY2ZnLCBFRkFCX0JZVEUgKTsKKwlpZiAoIHJjICkKKwkJZ290byBmYWlsNTsKKwljZmcgPSAweGZmICYgfigxIDw8IFAxX1NQQVJFX0xCTik7CisJcmMgPSBpMmMtPndyaXRlICggaTJjLCAmaTJjX3BjYTk1MzksIFAxX0NPTkZJRywgJmNmZywgRUZBQl9CWVRFICk7CisJaWYgKCByYyApCisJCWdvdG8gZmFpbDY7CisKKwkvKiBUdXJuIGFsbCBwb3dlciBvZmYgdGhlbiB3YWl0IDEgc2VjLiBUaGlzIGVuc3VyZXMgUEhZIGlzIHJlc2V0ICovCisJb3V0ID0gMHhmZiAmIH4oKDAgPDwgUDBfRU5fMVYyX0xCTikgfCAoMCA8PCBQMF9FTl8yVjVfTEJOKSB8CisJCSAgICAgICAoMCA8PCBQMF9FTl8zVjNYX0xCTikgfCAoMCA8PCBQMF9FTl81Vl9MQk4pIHwKKwkJICAgICAgICgwIDw8IFAwX0VOXzFWMFhfTEJOKSk7CisKKwlyYyA9IGkyYy0+d3JpdGUgKCBpMmMsICZpMmNfcGNhOTUzOSwgUDBfT1VULCAmb3V0LCBFRkFCX0JZVEUgKTsKKwlpZiAoIHJjICkKKwkJZ290byBmYWlsNzsKKworCW1kZWxheSgxMDAwKTsKKworCWZvciAoY291bnQ9MDsgY291bnQ8MjA7IGNvdW50KyspIHsKKwkJLyogVHVybiBvbiAxLjJWLCAyLjVWLCAzLjNWIGFuZCA1ViBwb3dlciByYWlscyAqLworCQlvdXQgPSAweGZmICYgfiggKDEgPDwgUDBfRU5fMVYyX0xCTikgIHwgKDEgPDwgUDBfRU5fMlY1X0xCTikgfAorCQkJCSgxIDw8IFAwX0VOXzNWM1hfTEJOKSB8ICgxIDw8IFAwX0VOXzVWX0xCTikgIHwgCisJCQkJKDEgPDwgUDBfWF9UUlNUX0xCTikgKTsKKworCQlyYyA9IGkyYy0+d3JpdGUgKCBpMmMsICZpMmNfcGNhOTUzOSwgUDBfT1VULCAmb3V0LCBFRkFCX0JZVEUgKTsKKwkJaWYgKCByYyApCisJCQlnb3RvIGZhaWw4OworCisJCW1kZWxheSAoIDEwICk7CisJCQorCQkvKiBUdXJuIG9uIHRoZSAxViBwb3dlciByYWlsICovCisJCW91dCAgJj0gfiggMSA8PCBQMF9FTl8xVjBYX0xCTiApOworCQlyYyA9IGkyYy0+d3JpdGUgKCBpMmMsICZpMmNfcGNhOTUzOSwgUDBfT1VULCAmb3V0LCBFRkFCX0JZVEUgKTsKKwkJaWYgKCByYyApCisJCQlnb3RvIGZhaWw5OworCisJCUVGQUJfTE9HICggIldhaXRpbmcgZm9yIHBvd2VyLi4uKGF0dGVtcHQgJWQpXG4iLCBjb3VudCk7CisJCW1kZWxheSAoIDEwMDAgKTsKKworCQkvKiBDaGVjayBEU1AgaXMgcG93ZXJlZCAqLworCQlyYyA9IGkyYy0+cmVhZCAoIGkyYywgJmkyY19wY2E5NTM5LCBQMV9JTiwgJmluLCBFRkFCX0JZVEUgKTsKKwkJaWYgKCByYyApCisJCQlnb3RvIGZhaWwxMDsKKworCQlpZiAoIGluICYgKCAxIDw8IFAxX0FGRV9QV0RfTEJOICkgKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmMgPSAtRVRJTUVET1VUOworCitmYWlsMTA6CitmYWlsOToKK2ZhaWw4OgorZmFpbDc6CisJLyogVHVybiBvZmYgcG93ZXIgcmFpbHMgKi8KKwlvdXQgPSAweGZmOworCSh2b2lkKSBpMmMtPndyaXRlICggaTJjLCAmaTJjX3BjYTk1MzksIFAwX09VVCwgJm91dCwgRUZBQl9CWVRFICk7CisJLyogRGlzYWJsZSBwb3J0IDEgb3V0cHV0cyBvbiBJTyBleHBhbmRlciAqLworCW91dCA9IDB4ZmY7CisJKHZvaWQpIGkyYy0+d3JpdGUgKCBpMmMsICZpMmNfcGNhOTUzOSwgUDFfQ09ORklHLCAmb3V0LCBFRkFCX0JZVEUgKTsKK2ZhaWw2OgorCS8qIERpc2FibGUgcG9ydCAwIG91dHB1dHMgKi8KKwlvdXQgPSAweGZmOworCSh2b2lkKSBpMmMtPndyaXRlICggaTJjLCAmaTJjX3BjYTk1MzksIFAxX0NPTkZJRywgJm91dCwgRUZBQl9CWVRFICk7CitmYWlsNToKK2ZhaWw0OgorZmFpbDM6CitmYWlsMjoKK2ZhaWwxOgorCUVGQUJfRVJSICggIkZhaWxlZCBpbml0aWFsaXNpbmcgU0ZFNDAwMSBib2FyZFxuIiApOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK3NmZTQwMDFfZmluaSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJc3RydWN0IGkyY19pbnRlcmZhY2UgKmkyYyA9ICZlZmFiLT5pMmNfYmIuaTJjOworCXVpbnQ4X3QgaW4sIGNmZywgb3V0OworCisJRUZBQl9FUlIgKCAiVHVybmluZyBvZmYgU0ZFNDAwMVxuIiApOworCisJLyogVHVybiBvZmYgYWxsIHBvd2VyIHJhaWxzICovCisJb3V0ID0gMHhmZjsKKwkodm9pZCkgaTJjLT53cml0ZSAoIGkyYywgJmkyY19wY2E5NTM5LCBQMF9PVVQsICZvdXQsIEVGQUJfQllURSApOworCisJLyogRGlzYWJsZSBwb3J0IDEgb3V0cHV0cyBvbiBJTyBleHBhbmRlciAqLworCWNmZyA9IDB4ZmY7CisJKHZvaWQpIGkyYy0+d3JpdGUgKCBpMmMsICZpMmNfcGNhOTUzOSwgUDFfQ09ORklHLCAmY2ZnLCBFRkFCX0JZVEUgKTsKKworCS8qIERpc2FibGUgcG9ydCAwIG91dHB1dHMgb24gSU8gZXhwYW5kZXIgKi8KKwljZmcgPSAweGZmOworCSh2b2lkKSBpMmMtPndyaXRlICggaTJjLCAmaTJjX3BjYTk1MzksIFAwX0NPTkZJRywgJmNmZywgRUZBQl9CWVRFICk7CisKKwkvKiBDbGVhciBhbnkgb3Zlci10ZW1wZXJhdHVyZSBhbGVydCAqLworCSh2b2lkKSBpMmMtPnJlYWQgKCBpMmMsICZpMmNfbWF4NjY0NywgUlNMLCAmaW4sIEVGQUJfQllURSApOworfQorCitzdHJ1Y3QgZWZhYl9ib2FyZF9vcGVyYXRpb25zIHNmZTQwMDFfb3BzID0geworCS5pbml0CQk9IHNmZTQwMDFfaW5pdCwKKwkuZmluaQkJPSBzZmU0MDAxX2ZpbmksCit9OworCitzdGF0aWMgaW50IHNmZTQwMDJfaW5pdCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSApCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBzZmU0MDAyX2ZpbmkgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgKQoreworfQorCitzdHJ1Y3QgZWZhYl9ib2FyZF9vcGVyYXRpb25zIHNmZTQwMDJfb3BzID0geworCS5pbml0CQk9IHNmZTQwMDJfaW5pdCwKKwkuZmluaQkJPSBzZmU0MDAyX2ZpbmksCit9OworCitzdGF0aWMgaW50IHNmZTQwMDNfaW5pdCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSApCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBzZmU0MDAzX2ZpbmkgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgKQoreworfQorCitzdHJ1Y3QgZWZhYl9ib2FyZF9vcGVyYXRpb25zIHNmZTQwMDNfb3BzID0geworCS5pbml0CQk9IHNmZTQwMDNfaW5pdCwKKwkuZmluaQkJPSBzZmU0MDAzX2ZpbmksCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBIYXJkd2FyZSBpbml0aWFsaXNhdGlvbgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisKK3N0YXRpYyB2b2lkCitmYWxjb25fZnJlZV9zcGVjaWFsX2J1ZmZlciAoIHZvaWQgKnAgKQoreworCS8qIFdlIGRvbid0IGJvdGhlciBjbGVhbmluZyB1cCB0aGUgYnVmZmVyIHRhYmxlIGVudHJpZXMgLQorCSAqIHdlJ3JlIGhhcmRseSBsaW1pdGVkICovCisJZnJlZV9kbWEgKCBwLCBFRkFCX0JVRl9BTElHTiApOworfQorCitzdGF0aWMgdm9pZCoKK2ZhbGNvbl9hbGxvY19zcGVjaWFsX2J1ZmZlciAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwgaW50IGJ5dGVzLAorCQkJICAgICAgc3RydWN0IGVmYWJfc3BlY2lhbF9idWZmZXIgKmVudHJ5ICkKK3sKKwl2b2lkKiBidWZmZXI7CisJaW50IHJlbWFpbmluZzsKKwllZmFiX3F3b3JkX3QgYnVmX2Rlc2M7CisJdW5zaWduZWQgbG9uZyBkbWFfYWRkcjsKKworCS8qIEFsbG9jYXRlIHRoZSBidWZmZXIsIGFsaWduZWQgb24gYSBidWZmZXIgYWRkcmVzcyBib3VuZGFyeSAqLworCWJ1ZmZlciA9IG1hbGxvY19kbWEgKCBieXRlcywgRUZBQl9CVUZfQUxJR04gKTsKKwlpZiAoICEgYnVmZmVyICkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBQdXNoIGJ1ZmZlciB0YWJsZSBlbnRyaWVzIHRvIGJhY2sgdGhlIGJ1ZmZlciAqLworCWVudHJ5LT5pZCA9IGVmYWItPmJ1ZmZlcl9oZWFkOworCWVudHJ5LT5kbWFfYWRkciA9IGRtYV9hZGRyID0gdmlydF90b19idXMgKCBidWZmZXIgKTsKKwlhc3NlcnQgKCAoIGRtYV9hZGRyICYgKCBFRkFCX0JVRl9BTElHTiAtIDEgKSApID09IDAgKTsKKworCXJlbWFpbmluZyA9IGJ5dGVzOworCXdoaWxlICggcmVtYWluaW5nID4gMCApIHsKKwkJRUZBQl9QT1BVTEFURV9RV09SRF8zICggYnVmX2Rlc2MsCisJCQkJCUZDTl9JUF9EQVRfQlVGX1NJWkUsIEZDTl9JUF9EQVRfQlVGX1NJWkVfNEssCisJCQkJCUZDTl9CVUZfQURSX0ZCVUYsICggZG1hX2FkZHIgPj4gMTIgKSwKKwkJCQkJRkNOX0JVRl9PV05FUl9JRF9GQlVGLCAwICk7CisKKwkJZmFsY29uX3dyaXRlX3NyYW0gKCBlZmFiLCAmYnVmX2Rlc2MsIGVmYWItPmJ1ZmZlcl9oZWFkICk7CisKKwkJKytlZmFiLT5idWZmZXJfaGVhZDsKKwkJZG1hX2FkZHIgKz0gRUZBQl9CVUZfQUxJR047CisJCXJlbWFpbmluZyAtPSBFRkFCX0JVRl9BTElHTjsKKwl9CisKKwlFRkFCX1RSQUNFICggIkFsbG9jYXRlZCAweCV4IGJ5dGVzIGF0ICVwIGJhY2tlZCBieSBidWZmZXIgdGFibGUgIgorCQkgICAgICJlbnRyaWVzIDB4JXguLjB4JXhcbiIsIGJ5dGVzLCBidWZmZXIsIGVudHJ5LT5pZCwKKwkJICAgICBlZmFiLT5idWZmZXJfaGVhZCAtIDEgKTsKKworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhcl9iMF9mcGdhX21lbW9yaWVzICggc3RydWN0IGVmYWJfbmljICplZmFiKQoreworCWVmYWJfb3dvcmRfdCBibGFua28sIHRlbXA7CisJZWZhYl9kd29yZF90IGJsYW5rZDsKKwlpbnQgb2Zmc2V0OyAKKworCUVGQUJfWkVST19PV09SRCAoIGJsYW5rbyApOworCUVGQUJfWkVST19EV09SRCAoIGJsYW5rZCApOworCisJLyogQ2xlYXIgdGhlIGFkZHJlc3MgcmVnaW9uIHJlZ2lzdGVyICovCisJRUZBQl9QT1BVTEFURV9PV09SRF80ICggdGVtcCwKKwkJCQlGQ05fQURSX1JFR0lPTjAsIDAsCisJCQkJRkNOX0FEUl9SRUdJT04xLCAoIDEgPDwgMTYgKSwKKwkJCQlGQ05fQURSX1JFR0lPTjIsICggMiA8PCAxNiApLAorCQkJCUZDTl9BRFJfUkVHSU9OMywgKCAzIDw8IDE2ICkgKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmdGVtcCwgRkNOX0FEUl9SRUdJT05fUkVHX0tFUiApOworCQorCUVGQUJfVFJBQ0UgKCAiQ2xlYXJpbmcgZmlsdGVyIGFuZCBSU1MgdGFibGVzXG4iICk7CisKKwlmb3IgKCBvZmZzZXQgPSBGQ05fUlhfRklMVEVSX1RCTDAgOworCSAgICAgIG9mZnNldCA8IEZDTl9SWF9SU1NfSU5ESVJfVEJMX0IwKzB4ODAwIDsKKwkgICAgICBvZmZzZXQgKz0gMHgxMCApIHsKKwkJZmFsY29uX3dyaXRlICggZWZhYiwgJmJsYW5rbywgb2Zmc2V0ICk7CisJfQorCisJRUZBQl9UUkFDRSAoICJXaXBpbmcgYnVmZmVyIHRhYmxlc1xuIiApOworCisJLyogTm90aWNlIHRoZSA4IGJ5dGUgYWNjZXNzIG1vZGUgKi8KKwlmb3IgKCBvZmZzZXQgPSAweDI4MDAwMDAgOworCSAgICAgIG9mZnNldCA8IDB4MzAwMDAwMCA7CisJICAgICAgb2Zmc2V0ICs9IDB4OCkgeworCQlfZmFsY29uX3dyaXRlbCAoIGVmYWIsIDAsIG9mZnNldCApOworCQlfZmFsY29uX3dyaXRlbCAoIGVmYWIsIDAsIG9mZnNldCArIDQgKTsKKwkJd21iKCk7CisJfQorfQorCitzdGF0aWMgaW50CitmYWxjb25fcmVzZXQgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWVmYWJfb3dvcmRfdCBnbGJfY3RsX3JlZ19rZXI7CisKKwkvKiBJbml0aWF0ZSBzb2Z0d2FyZSByZXNldCAqLworCUVGQUJfUE9QVUxBVEVfT1dPUkRfNiAoIGdsYl9jdGxfcmVnX2tlciwKKwkJCQlGQ05fUENJRV9DT1JFX1JTVF9DVEwsIEVYQ0xVREVfRlJPTV9SRVNFVCwKKwkJCQlGQ05fUENJRV9OU1RDS19SU1RfQ1RMLCBFWENMVURFX0ZST01fUkVTRVQsCisJCQkJRkNOX1BDSUVfU0RfUlNUX0NUTCwgRVhDTFVERV9GUk9NX1JFU0VULAorCQkJCUZDTl9FRV9SU1RfQ1RMLCBFWENMVURFX0ZST01fUkVTRVQsCisJCQkJRkNOX0VYVF9QSFlfUlNUX0RVUiwgMHg3LCAvKiAxMG1zICovCisJCQkJRkNOX1NXUlNULCAxICk7CisKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmZ2xiX2N0bF9yZWdfa2VyLCBGQ05fR0xCX0NUTF9SRUdfS0VSICk7CisKKwkvKiBBbGxvdyA1MG1zIGZvciByZXNldCAqLworCW1kZWxheSAoIDUwICk7CisKKwkvKiBDaGVjayBmb3IgZGV2aWNlIHJlc2V0IGNvbXBsZXRlICovCisJZmFsY29uX3JlYWQgKCBlZmFiLCAmZ2xiX2N0bF9yZWdfa2VyLCBGQ05fR0xCX0NUTF9SRUdfS0VSICk7CisJaWYgKCBFRkFCX09XT1JEX0ZJRUxEICggZ2xiX2N0bF9yZWdfa2VyLCBGQ05fU1dSU1QgKSAhPSAwICkgeworCQlFRkFCX0VSUiAoICJSZXNldCBmYWlsZWRcbiIgKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJaWYgKCAoIGVmYWItPnBjaV9yZXZpc2lvbiA9PSBGQUxDT05fUkVWX0IwICkgJiYgIWVmYWItPmlzX2FzaWMgKSB7CisJCWNsZWFyX2IwX2ZwZ2FfbWVtb3JpZXMgKCBlZmFiICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKiBPZmZzZXQgb2YgTUFDIGFkZHJlc3Mgd2l0aGluIEVFUFJPTSBvciBGbGFzaCAqLworI2RlZmluZSBGQUxDT05fTUFDX0FERFJFU1NfT0ZGU0VUIDB4MzEwCisKKy8qCisgKiBGYWxjb24gRUVQUk9NIHN0cnVjdHVyZQorICovCisjZGVmaW5lIFNGX05WX0NPTkZJR19CQVNFIDB4MzAwCisjZGVmaW5lIFNGX05WX0NPTkZJR19FWFRSQSAweEEwCisKK3N0cnVjdCBmYWxjb25fbnZfY29uZmlnX3ZlcjIgeworCXVpbnQxNl90IG5wb3J0czsKKwl1aW50OF90ICBwb3J0MF9waHlfYWRkcjsKKwl1aW50OF90ICBwb3J0MF9waHlfdHlwZTsKKwl1aW50OF90ICBwb3J0MV9waHlfYWRkcjsKKwl1aW50OF90ICBwb3J0MV9waHlfdHlwZTsKKwl1aW50MTZfdCBhc2ljX3N1Yl9yZXZpc2lvbjsKKwl1aW50MTZfdCBib2FyZF9yZXZpc2lvbjsKKwl1aW50OF90IG1hY19sb2NhdGlvbjsKK307CisKK3N0cnVjdCBmYWxjb25fbnZfZXh0cmEgeworCXVpbnQxNl90IG1hZ2ljbnVtYmVyOworCXVpbnQxNl90IHN0cnVjdHVyZV92ZXJzaW9uOworCXVpbnQxNl90IGNoZWNrc3VtOworCXVuaW9uIHsKKwkJc3RydWN0IGZhbGNvbl9udl9jb25maWdfdmVyMiB2ZXIyOworCX0gdmVyX3NwZWNpZmljOworfTsKKworI2RlZmluZSBCT0FSRF9UWVBFKF9yZXYpIChfcmV2ID4+IDgpCisKK3N0YXRpYyB2b2lkCitmYWxjb25fcHJvYmVfbmljX3ZhcmlhbnQgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgKQoreworCWVmYWJfb3dvcmRfdCBhbHRlcmFfYnVpbGQsIG5pY19zdGF0OworCWludCBpc19wY2llLCBmcGdhX3ZlcnNpb247CisJdWludDhfdCByZXZpc2lvbjsKKworCS8qIFBDSSByZXZpc2lvbiAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlICggcGNpLCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZyZXZpc2lvbiApOworCWVmYWItPnBjaV9yZXZpc2lvbiA9IHJldmlzaW9uOworCisJLyogQXNpYyB2cyBGUEdBICovCisJZmFsY29uX3JlYWQgKCBlZmFiLCAmYWx0ZXJhX2J1aWxkLCBGQ05fQUxURVJBX0JVSUxEX1JFR19LRVIgKTsKKwlmcGdhX3ZlcnNpb24gPSBFRkFCX09XT1JEX0ZJRUxEICggYWx0ZXJhX2J1aWxkLCBGQ05fVkVSX0FMTCApOworCWVmYWItPmlzX2FzaWMgPSAoZnBnYV92ZXJzaW9uID09IDApOworCisJLyogTUFDIGFuZCBQQ0kgdHlwZSAqLworCWZhbGNvbl9yZWFkICggZWZhYiwgJm5pY19zdGF0LCBGQ05fTklDX1NUQVRfUkVHICk7CisJaWYgKCBlZmFiLT5wY2lfcmV2aXNpb24gPT0gRkFMQ09OX1JFVl9CMCApIHsKKwkJaXNfcGNpZSA9IDE7CisJCWVmYWItPnBoeV8xMGcgPSBFRkFCX09XT1JEX0ZJRUxEICggbmljX3N0YXQsIEZDTl9TVFJBUF8xMEcgKTsKKwl9CisJZWxzZSBpZiAoIGVmYWItPmlzX2FzaWMgKSB7CisJCWlzX3BjaWUgPSBFRkFCX09XT1JEX0ZJRUxEICggbmljX3N0YXQsIEZDTl9TVFJBUF9QQ0lFICk7CisJCWVmYWItPnBoeV8xMGcgPSBFRkFCX09XT1JEX0ZJRUxEICggbmljX3N0YXQsIEZDTl9TVFJBUF8xMEcgKTsKKwl9CisJZWxzZSB7CisJCWludCBtaW5vciA9IEVGQUJfT1dPUkRfRklFTEQgKCBhbHRlcmFfYnVpbGQsICBGQ05fVkVSX01JTk9SICk7CisJCWlzX3BjaWUgPSAwOworCQllZmFiLT5waHlfMTBnID0gKCBtaW5vciA9PSAweDE0ICk7CisJfQorfQorCitzdGF0aWMgdm9pZAorZmFsY29uX2luaXRfc3BpX2RldmljZSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSApCit7CisJLyogRmFsY29uJ3MgU1BJIGludGVyZmFjZSBvbmx5IHN1cHBvcnRzIHJlYWRzL3dyaXRlcyBvZiB1cCB0byAxNiBieXRlcy4KKwkgKiBSZWR1Y2UgdGhlIG52cyBibG9jayBzaXplIGRvd24gdG8gc2F0aXNmeSB0aGlzIC0gd2hpY2ggbWVhbnMgY2FsbGVycworCSAqIHNob3VsZCB1c2UgdGhlIG52c18qIGZ1bmN0aW9ucyByYXRoZXIgdGhhbiBzcGlfKi4gKi8KKwlpZiAoIHNwaS0+bnZzLmJsb2NrX3NpemUgPiBGQUxDT05fU1BJX01BWF9MRU4gKQorCQlzcGktPm52cy5ibG9ja19zaXplID0gRkFMQ09OX1NQSV9NQVhfTEVOOworCisJc3BpLT5idXMgPSAmZWZhYi0+c3BpX2J1czsKKwllZmFiLT5zcGkgPSBzcGk7Cit9CisKK3N0YXRpYyBpbnQKK2ZhbGNvbl9wcm9iZV9zcGkgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWVmYWJfb3dvcmRfdCBuaWNfc3RhdCwgZ3Bpb19jdGwsIGVlX3ZwZF9jZmc7CisJaW50IGhhc19mbGFzaCwgaGFzX2VlcHJvbSwgYWQ5Yml0OworCisJZmFsY29uX3JlYWQgKCBlZmFiLCAmbmljX3N0YXQsIEZDTl9OSUNfU1RBVF9SRUcgKTsKKwlmYWxjb25fcmVhZCAoIGVmYWIsICZncGlvX2N0bCwgRkNOX0dQSU9fQ1RMX1JFR19LRVIgKTsKKwlmYWxjb25fcmVhZCAoIGVmYWIsICZlZV92cGRfY2ZnLCBGQ05fRUVfVlBEX0NGR19SRUcgKTsKKworCS8qIGRldGVybWluZSBpZiBGTEFTSCAvIEVFUFJPTSBpcyBwcmVzZW50ICovCisJaWYgKCAoIGVmYWItPnBjaV9yZXZpc2lvbiA+PSBGQUxDT05fUkVWX0IwICkgfHwgZWZhYi0+aXNfYXNpYyApIHsKKwkJaGFzX2ZsYXNoID0gRUZBQl9PV09SRF9GSUVMRCAoIG5pY19zdGF0LCBGQ05fU0ZfUFJTVCApOworCQloYXNfZWVwcm9tID0gRUZBQl9PV09SRF9GSUVMRCAoIG5pY19zdGF0LCBGQ05fRUVfUFJTVCApOworCX0gZWxzZSB7CisJCWhhc19mbGFzaCA9IEVGQUJfT1dPUkRfRklFTEQgKCBncGlvX2N0bCwgRkNOX0ZMQVNIX1BSRVNFTlQgKTsKKwkJaGFzX2VlcHJvbSA9IEVGQUJfT1dPUkRfRklFTEQgKCBncGlvX2N0bCwgRkNOX0VFUFJPTV9QUkVTRU5UICk7CisJfQorCWFkOWJpdCA9IEVGQUJfT1dPUkRfRklFTEQgKCBlZV92cGRfY2ZnLCBGQ05fRUVfVlBEX0VOX0FEOV9NT0RFICk7CisKKwkvKiBDb25maWd1cmUgdGhlIFNQSSBhbmQgSTJDIGJ1cyAqLworCWVmYWItPnNwaV9idXMucncgPSBmYWxjb25fc3BpX3J3OworCWluaXRfaTJjX2JpdF9iYXNoZXIgKCAmZWZhYi0+aTJjX2JiLCAmZmFsY29uX2kyY19iaXRfb3BzICk7CisKKwkvKiBDb25maWd1cmUgdGhlIEVFUFJPTSBTUEkgZGV2aWNlLiBHZW5lcmFsbHksIGFuIEF0bWVsIDI1MDQwCisJICogKG9yIHNpbWlsYXIpIGlzIHVzZWQsIGJ1dCB0aGlzIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlcmUgaXMgYWxzbworCSAqIGEgZmxhc2ggZGV2aWNlIHByZXNlbnQgdG8gc3RvcmUgdGhlIGJvb3QtdGltZSBjaGlwIGNvbmZpZ3VyYXRpb24uCisJICovCisJaWYgKCBoYXNfZWVwcm9tICkgeworCQlpZiAoIGhhc19mbGFzaCAmJiBhZDliaXQgKQorCQkJaW5pdF9hdDI1MDQwICggJmVmYWItPnNwaV9lZXByb20gKTsKKwkJZWxzZQorCQkJaW5pdF9tYzI1eHg2NDAgKCAmZWZhYi0+c3BpX2VlcHJvbSApOworCQlmYWxjb25faW5pdF9zcGlfZGV2aWNlICggZWZhYiwgJmVmYWItPnNwaV9lZXByb20gKTsKKwl9CisKKwkvKiBDb25maWd1cmUgdGhlIEZMQVNIIFNQSSBkZXZpY2UgKi8KKwlpZiAoIGhhc19mbGFzaCApIHsKKwkJaW5pdF9hdDI1ZjEwMjQgKCAmZWZhYi0+c3BpX2ZsYXNoICk7CisJCWZhbGNvbl9pbml0X3NwaV9kZXZpY2UgKCBlZmFiLCAmZWZhYi0+c3BpX2ZsYXNoICk7CisJfQorCisJRUZBQl9MT0cgKCAiZmxhc2ggaXMgJXMsIEVFUFJPTSBpcyAlcyVzXG4iLAorCQkgICAoIGhhc19mbGFzaCA/ICJwcmVzZW50IiA6ICJhYnNlbnQiICksCisJCSAgICggaGFzX2VlcHJvbSA/ICJwcmVzZW50ICIgOiAiYWJzZW50IiApLAorCQkgICAoIGhhc19lZXByb20gPyAoYWQ5Yml0ID8gIig5Yml0KSIgOiAiKDE2Yml0KSIpIDogIiIpICk7CisKKwkvKiBUaGUgZGV2aWNlIE1VU1QgaGF2ZSBmbGFzaCBvciBlZXByb20gKi8KKwlpZiAoICEgZWZhYi0+c3BpICkgeworCQlFRkFCX0VSUiAoICJEZXZpY2UgYXBwZWFycyB0byBoYXZlIG5vIGZsYXNoIG9yIGVlcHJvbVxuIiApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBJZiB0aGUgZGV2aWNlIGhhcyBFRVBST00gYXR0YWNoZWQsIHRoZW4gYWR2ZXJ0aXNlIE5WTyBzcGFjZSAqLworCWlmICggaGFzX2VlcHJvbSApCisJCW52b19pbml0ICggJmVmYWItPm52bywgJmVmYWItPnNwaV9lZXByb20ubnZzLCBmYWxjb25fbnZvX2ZyYWdtZW50cywKKwkJCSAgICZlZmFiLT5uZXRkZXYtPnJlZmNudCApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZhbGNvbl9wcm9iZV9udnJhbSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJc3RydWN0IG52c19kZXZpY2UgKm52cyA9ICZlZmFiLT5zcGktPm52czsKKwlzdHJ1Y3QgZmFsY29uX252X2V4dHJhIG52OworCWludCByYywgYm9hcmRfcmV2aXNpb247CisKKwkvKiBSZWFkIHRoZSBNQUMgYWRkcmVzcyAqLworCXJjID0gbnZzX3JlYWQgKCBudnMsIEZBTENPTl9NQUNfQUREUkVTU19PRkZTRVQsCisJCQllZmFiLT5tYWNfYWRkciwgRVRIX0FMRU4gKTsKKwlpZiAoIHJjICkKKwkJcmV0dXJuIHJjOworCisJLyogUG9rZSB0aHJvdWdoIHRoZSBOVlJBTSBzdHJ1Y3R1cmUgZm9yIHRoZSBQSFkgdHlwZS4gKi8KKwlyYyA9IG52c19yZWFkICggbnZzLCBTRl9OVl9DT05GSUdfQkFTRSArIFNGX05WX0NPTkZJR19FWFRSQSwKKwkJCSZudiwgc2l6ZW9mICggbnYgKSApOworCWlmICggcmMgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBIYW5kbGUgZWFjaCBzdXBwb3J0ZWQgTlZSQU0gdmVyc2lvbiAqLworCWlmICggKCBsZTE2X3RvX2NwdSAoIG52Lm1hZ2ljbnVtYmVyICkgPT0gRkNOX05WX01BR0lDX05VTUJFUiApICYmCisJICAgICAoIGxlMTZfdG9fY3B1ICggbnYuc3RydWN0dXJlX3ZlcnNpb24gKSA+PSAyICkgKSB7CisJCXN0cnVjdCBmYWxjb25fbnZfY29uZmlnX3ZlcjIqIHZlcjIgPSAmbnYudmVyX3NwZWNpZmljLnZlcjI7CisJCQorCQkvKiBHZXQgdGhlIFBIWSB0eXBlICovCisJCWVmYWItPnBoeV9hZGRyID0gbGUxNl90b19jcHUgKCB2ZXIyLT5wb3J0MF9waHlfYWRkciApOworCQllZmFiLT5waHlfdHlwZSA9IGxlMTZfdG9fY3B1ICggdmVyMi0+cG9ydDBfcGh5X3R5cGUgKTsKKwkJYm9hcmRfcmV2aXNpb24gPSBsZTE2X3RvX2NwdSAoIHZlcjItPmJvYXJkX3JldmlzaW9uICk7CisJfQorCWVsc2UgeworCQlFRkFCX0VSUiAoICJOVnJhbSBpcyBub3QgcmVjb2duaXNlZFxuIiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllZmFiLT5ib2FyZF90eXBlID0gQk9BUkRfVFlQRSAoIGJvYXJkX3JldmlzaW9uICk7CisJCisJRUZBQl9UUkFDRSAoICJGYWxjb24gYm9hcmQgJWQgcGh5ICVkIEAgYWRkciAlZFxuIiwKKwkJICAgICBlZmFiLT5ib2FyZF90eXBlLCBlZmFiLT5waHlfdHlwZSwgZWZhYi0+cGh5X2FkZHIgKTsKKworCS8qIFBhdGNoIGluIHRoZSBib2FyZCBvcGVyYXRpb25zICovCisJc3dpdGNoICggZWZhYi0+Ym9hcmRfdHlwZSApIHsKKwljYXNlIEVGQUJfQk9BUkRfU0ZFNDAwMToKKwkJZWZhYi0+Ym9hcmRfb3AgPSAmc2ZlNDAwMV9vcHM7CisJCWJyZWFrOworCWNhc2UgRUZBQl9CT0FSRF9TRkU0MDAyOgorCQllZmFiLT5ib2FyZF9vcCA9ICZzZmU0MDAyX29wczsKKwkJYnJlYWs7CisJY2FzZSBFRkFCX0JPQVJEX1NGRTQwMDM6CisJCWVmYWItPmJvYXJkX29wID0gJnNmZTQwMDNfb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlFRkFCX0VSUiAoICJVbnJlY29nbmlzZWQgYm9hcmQgdHlwZVxuIiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBQYXRjaCBpbiBNQUMgb3BlcmF0aW9ucyAqLworCWlmICggZWZhYi0+cGh5XzEwZyApCisJCWVmYWItPm1hY19vcCA9ICZmYWxjb25feG1hY19vcGVyYXRpb25zOworCWVsc2UKKwkJZWZhYi0+bWFjX29wID0gJmZhbGNvbl9nbWFjX29wZXJhdGlvbnM7CisKKwkvKiBIb29rIGluIHRoZSBQSFkgb3BzICovCisJc3dpdGNoICggZWZhYi0+cGh5X3R5cGUgKSB7CisJY2FzZSBQSFlfVFlQRV8xMFhQUkVTUzoKKwkJZWZhYi0+cGh5X29wID0gJmZhbGNvbl90ZW54cHJlc3NfcGh5X29wczsKKwkJYnJlYWs7CisJY2FzZSBQSFlfVFlQRV9DWDQ6CisJCWVmYWItPnBoeV9vcCA9ICZmYWxjb25feGF1aV9waHlfb3BzOworCQlicmVhazsKKwljYXNlIFBIWV9UWVBFX1hGUDoKKwkJZWZhYi0+cGh5X29wID0gJmZhbGNvbl94ZnBfcGh5X29wczsKKwkJYnJlYWs7CisJY2FzZSBQSFlfVFlQRV9DWDRfUlRNUjoKKwkJZWZhYi0+cGh5X29wID0gJmZhbGNvbl90eGNfcGh5X29wczsKKwkJYnJlYWs7CisJY2FzZSBQSFlfVFlQRV9QTTgzNTg6CisJCWVmYWItPnBoeV9vcCA9ICZmYWxjb25fcG04MzU4X3BoeV9vcHM7CisJCWJyZWFrOworCWNhc2UgUEhZX1RZUEVfMUdJR19BTEFTS0E6CisJCWVmYWItPnBoeV9vcCA9ICZmYWxjb25fYWxhc2thX3BoeV9vcHM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUVGQUJfRVJSICggIlVua25vd24gUEhZIHR5cGU6ICVkXG4iLCBlZmFiLT5waHlfdHlwZSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZmFsY29uX2luaXRfc3JhbSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJZWZhYl9vd29yZF90IHJlZzsKKwlpbnQgY291bnQ7CisKKwkvKiB1c2UgY2FyZCBpbiBpbnRlcm5hbCBTUkFNIG1vZGUgKi8KKwlmYWxjb25fcmVhZCAoIGVmYWIsICZyZWcsIEZDTl9OSUNfU1RBVF9SRUcgKTsKKwlFRkFCX1NFVF9PV09SRF9GSUVMRCAoIHJlZywgRkNOX09OQ0hJUF9TUkFNLCAxICk7CisJZmFsY29uX3dyaXRlICggZWZhYiwgJnJlZywgRkNOX05JQ19TVEFUX1JFRyApOworCisJLyogRGVhY3RpdmF0ZSBhbnkgZXh0ZXJuYWwgU1JBTSB0aGF0IG1pZ2h0IGJlIHByZXNlbnQgKi8KKwlFRkFCX1BPUFVMQVRFX09XT1JEXzIgKCByZWcsIAorCQkJCUZDTl9HUElPMV9PRU4sIDEsCisJCQkJRkNOX0dQSU8xX09VVCwgMSApOworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsIEZDTl9HUElPX0NUTF9SRUdfS0VSICk7CisKKwkvKiBJbml0aWF0ZSBTUkFNIHJlc2V0ICovCisJRUZBQl9QT1BVTEFURV9PV09SRF8yICggcmVnLAorCQkJCUZDTl9TUkFNX09PQl9CVF9JTklUX0VOLCAxLAorCQkJCUZDTl9TUk1fTlVNX0JBTktTX0FORF9CQU5LX1NJWkUsIDAgKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fU1JNX0NGR19SRUdfS0VSICk7CisKKwkvKiBXYWl0IGZvciBTUkFNIHJlc2V0IHRvIGNvbXBsZXRlICovCisJY291bnQgPSAwOworCWRvIHsKKwkJLyogU1JBTSByZXNldCBpcyBzbG93OyBleHBlY3QgYXJvdW5kIDE2bXMgKi8KKwkJbWRlbGF5ICggMjAgKTsKKworCQkvKiBDaGVjayBmb3IgcmVzZXQgY29tcGxldGUgKi8KKwkJZmFsY29uX3JlYWQgKCBlZmFiLCAmcmVnLCBGQ05fU1JNX0NGR19SRUdfS0VSICk7CisJCWlmICggIUVGQUJfT1dPUkRfRklFTEQgKCByZWcsIEZDTl9TUkFNX09PQl9CVF9JTklUX0VOICkgKQorCQkJcmV0dXJuIDA7CisJfSB3aGlsZSAoKytjb3VudCA8IDIwKTsJLyogd2FpdCB1cHRvIDAuNCBzZWMgKi8KKworCUVGQUJfRVJSICggInRpbWVkIG91dCB3YWl0aW5nIGZvciBTUkFNIHJlc2V0XG4iKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHZvaWQKK2ZhbGNvbl9zZXR1cF9uaWMgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWVmYWJfZHdvcmRfdCB0aW1lcl9jbWQ7CisJZWZhYl9vd29yZF90IHJlZzsKKwlpbnQgdHhfZmMsIHhvZmZfdGhyZXNoLCB4b25fdGhyZXNoOworCisJLyogYnVnNTEyOTogQ2xlYXIgdGhlIHBhcml0eSBlbmFibGVzIG9uIHRoZSBUWCBkYXRhIGZpZm9zIGFzIAorCSAqIHRoZXkgcHJvZHVjZSBmYWxzZSBwYXJpdHkgZXJyb3JzIGJlY2F1c2Ugb2YgdGltaW5nIGlzc3VlcyAKKwkgKi8KKwlmYWxjb25fcmVhZCAoIGVmYWIsICZyZWcsIEZDTl9TUEFSRV9SRUdfS0VSICk7CisJRUZBQl9TRVRfT1dPUkRfRklFTEQgKCByZWcsIEZDTl9NRU1fUEVSUl9FTl9UWF9EQVRBLCAwICk7CisJZmFsY29uX3dyaXRlICggZWZhYiwgJnJlZywgRkNOX1NQQVJFX1JFR19LRVIgKTsKKwkKKwkvKiBTZXQgdXAgVFggYW5kIFJYIGRlc2NyaXB0b3IgY2FjaGVzIGluIFNSQU0gKi8KKwlFRkFCX1BPUFVMQVRFX09XT1JEXzEgKCByZWcsIEZDTl9TUk1fVFhfRENfQkFTRV9BRFIsIDB4MTMwMDAwICk7CisJZmFsY29uX3dyaXRlICggZWZhYiwgJnJlZywgRkNOX1NSTV9UWF9EQ19DRkdfUkVHX0tFUiApOworCUVGQUJfUE9QVUxBVEVfT1dPUkRfMSAoIHJlZywgRkNOX1RYX0RDX1NJWkUsIDEgLyogMTYgZGVzY3JpcHRvcnMgKi8gKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fVFhfRENfQ0ZHX1JFR19LRVIgKTsKKwlFRkFCX1BPUFVMQVRFX09XT1JEXzEgKCByZWcsIEZDTl9TUk1fUlhfRENfQkFTRV9BRFIsIDB4MTAwMDAwICk7CisJZmFsY29uX3dyaXRlICggZWZhYiwgJnJlZywgRkNOX1NSTV9SWF9EQ19DRkdfUkVHX0tFUiApOworCUVGQUJfUE9QVUxBVEVfT1dPUkRfMSAoIHJlZywgRkNOX1JYX0RDX1NJWkUsIDIgLyogMzIgZGVzY3JpcHRvcnMgKi8gKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fUlhfRENfQ0ZHX1JFR19LRVIgKTsKKwkKKwkvKiBTZXQgbnVtYmVyIG9mIFJTUyBDUFVzCisJICogYnVnNzI0NDogSW5jcmVhc2UgZmlsdGVyIGRlcHRoIHRvIHJlZHVjZSBSWF9SRVNFVCBsaWtlbHlob29kCisJICovCisJRUZBQl9QT1BVTEFURV9PV09SRF81ICggcmVnLAorCQkJCUZDTl9OVU1fS0VSLCAwLAorCQkJCUZDTl9VRFBfRlVMTF9TUkNIX0xJTUlULCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQ05fVURQX1dJTERfU1JDSF9MSU1JVCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkNOX1RDUF9XSUxEX1NSQ0hfTElNSVQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZDTl9UQ1BfRlVMTF9TUkNIX0xJTUlULCA4KTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fUlhfRklMVEVSX0NUTF9SRUdfS0VSICk7CisJdWRlbGF5ICggMTAwMCApOworCisJLyogU2V0dXAgUlguICBXYWl0IGZvciBkZXNjcmlwdG9yIGlzIGJyb2tlbiBhbmQgbXVzdAorCSAqIGJlIGRpc2FibGVkLiAgUlhEUCByZWNvdmVyeSBzaG91bGRuJ3QgYmUgbmVlZGVkLCBidXQgaXMuCisJICogZGlzYWJsZSBJU0NTSSBwYXJzaW5nIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCBpdAorCSAqLworCWZhbGNvbl9yZWFkICggZWZhYiwgJnJlZywgRkNOX1JYX1NFTEZfUlNUX1JFR19LRVIgKTsKKwlFRkFCX1NFVF9PV09SRF9GSUVMRCAoIHJlZywgRkNOX1JYX05PREVTQ19XQUlUX0RJUywgMSApOworCUVGQUJfU0VUX09XT1JEX0ZJRUxEICggcmVnLCBGQ05fUlhfUkVDT1ZFUllfRU4sIDEgKTsKKwlFRkFCX1NFVF9PV09SRF9GSUVMRCAoIHJlZywgRkNOX1JYX0lTQ1NJX0RJUywgMSApOworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsIEZDTl9SWF9TRUxGX1JTVF9SRUdfS0VSICk7CisJCisJLyogRGV0ZXJtaW5lIHJlY29tbWVuZGVkIGZsb3cgY29udHJvbCBzZXR0aW5ncy4gKgorCSAqIEZsb3cgY29udHJvbCBpcyBxdWFsaWZpZWQgb24gQjAgYW5kIEExLzFHLCBub3Qgb24gQTEvMTBHICovCisJaWYgKCBlZmFiLT5wY2lfcmV2aXNpb24gPT0gRkFMQ09OX1JFVl9CMCApIHsKKwkJdHhfZmMgPSAxOworCQl4b2ZmX3RocmVzaCA9IDU0MjcyOyAgLyogfjgwS2IgLSAzKm1heCBNVFUgKi8KKwkJeG9uX3RocmVzaCA9IDI3NjQ4OyAvKiB+MyptYXggTVRVICovCisJfQorCWVsc2UgaWYgKCAhZWZhYi0+cGh5XzEwZyApIHsKKwkJdHhfZmMgPSAxOworCQl4b2ZmX3RocmVzaCA9IDIwNDg7CisJCXhvbl90aHJlc2ggPSA1MTI7CisJfQorCWVsc2UgeworCQl0eF9mYyA9IHhvZmZfdGhyZXNoID0geG9uX3RocmVzaCA9IDA7CisJfQorCisJLyogU2V0dXAgVFggYW5kIFJYICovCisJZmFsY29uX3JlYWQgKCBlZmFiLCAmcmVnLCBGQ05fVFhfQ0ZHMl9SRUdfS0VSICk7CisJRUZBQl9TRVRfT1dPUkRfRklFTEQgKCByZWcsIEZDTl9UWF9ESVNfTk9OX0lQX0VWLCAxICk7CisJZmFsY29uX3dyaXRlICggZWZhYiwgJnJlZywgRkNOX1RYX0NGRzJfUkVHX0tFUiApOworCisJZmFsY29uX3JlYWQgKCBlZmFiLCAmcmVnLCBGQ05fUlhfQ0ZHX1JFR19LRVIgKTsKKwlFRkFCX1NFVF9PV09SRF9GSUVMRF9WRVIgKCBlZmFiLCByZWcsIEZDTl9SWF9VU1JfQlVGX1NJWkUsCisJCQkJICAgKDMqNDA5NikgLyAzMiApOworCWlmICggZWZhYi0+cGNpX3JldmlzaW9uID09IEZBTENPTl9SRVZfQjApCisJCUVGQUJfU0VUX09XT1JEX0ZJRUxEICggcmVnLCBGQ05fUlhfSU5HUl9FTl9CMCwgMSApOworCUVGQUJfU0VUX09XT1JEX0ZJRUxEX1ZFUiAoIGVmYWIsIHJlZywgRkNOX1JYX1hPTl9NQUNfVEgsCisJCQkJICAgeG9uX3RocmVzaCAvIDI1Nik7CisJRUZBQl9TRVRfT1dPUkRfRklFTERfVkVSICggZWZhYiwgcmVnLCBGQ05fUlhfWE9GRl9NQUNfVEgsCisJCQkJICAgeG9mZl90aHJlc2ggLyAyNTYpOworCUVGQUJfU0VUX09XT1JEX0ZJRUxEX1ZFUiAoIGVmYWIsIHJlZywgRkNOX1JYX1hPRkZfTUFDX0VOLCB0eF9mYyk7CisJZmFsY29uX3dyaXRlICggZWZhYiwgJnJlZywgRkNOX1JYX0NGR19SRUdfS0VSICk7CisKKwkvKiBTZXQgdGltZXIgcmVnaXN0ZXIgKi8KKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzIgKCB0aW1lcl9jbWQsCisJCQkJRkNOX1RJTUVSX01PREUsIEZDTl9USU1FUl9NT0RFX0RJUywKKwkJCQlGQ05fVElNRVJfVkFMLCAwICk7CisJZmFsY29uX3dyaXRlbCAoIGVmYWIsICZ0aW1lcl9jbWQsIEZDTl9USU1FUl9DTURfUkVHX0tFUiApOworfQorCitzdGF0aWMgdm9pZAorZmFsY29uX2luaXRfcmVzb3VyY2VzICggc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwlzdHJ1Y3QgZWZhYl9ldl9xdWV1ZSAqZXZfcXVldWUgPSAmZWZhYi0+ZXZfcXVldWU7CisJc3RydWN0IGVmYWJfcnhfcXVldWUgKnJ4X3F1ZXVlID0gJmVmYWItPnJ4X3F1ZXVlOworCXN0cnVjdCBlZmFiX3R4X3F1ZXVlICp0eF9xdWV1ZSA9ICZlZmFiLT50eF9xdWV1ZTsKKworCWVmYWJfb3dvcmRfdCByZWc7CisJaW50IGp1bWJvOworCisJLyogSW5pdGlhbGlzZSB0aGUgcHRycyAqLworCXR4X3F1ZXVlLT5yZWFkX3B0ciA9IHR4X3F1ZXVlLT53cml0ZV9wdHIgPSAwOworCXJ4X3F1ZXVlLT5yZWFkX3B0ciA9IHJ4X3F1ZXVlLT53cml0ZV9wdHIgPSAwOworCWV2X3F1ZXVlLT5yZWFkX3B0ciA9IDA7CisKKwkvKiBQdXNoIHRoZSBldmVudCBxdWV1ZSB0byB0aGUgaGFyZHdhcmUgKi8KKwlFRkFCX1BPUFVMQVRFX09XT1JEXzMgKCByZWcsCisJCQkJRkNOX0VWUV9FTiwgMSwKKwkJCQlGQ05fRVZRX1NJWkUsIEZRUyhGQ05fRVZRLCBFRkFCX0VWUV9TSVpFKSwKKwkJCQlGQ05fRVZRX0JVRl9CQVNFX0lELCBldl9xdWV1ZS0+ZW50cnkuaWQgKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCAKKwkJICAgICAgIEZDTl9SRVZJU0lPTl9SRUcgKCBlZmFiLCBGQ05fRVZRX1BUUl9UQkxfS0VSICkgKTsKKwkKKwkvKiBQdXNoIHRoZSB0eCBxdWV1ZSB0byB0aGUgaGFyZHdhcmUgKi8KKwlFRkFCX1BPUFVMQVRFX09XT1JEXzggKCByZWcsCisJCQkJRkNOX1RYX0RFU0NRX0VOLCAxLAorCQkJCUZDTl9UWF9JU0NTSV9ERElHX0VOLCAwLAorCQkJCUZDTl9UWF9JU0NTSV9ERElHX0VOLCAwLAorCQkJCUZDTl9UWF9ERVNDUV9CVUZfQkFTRV9JRCwgdHhfcXVldWUtPmVudHJ5LmlkLAorCQkJCUZDTl9UWF9ERVNDUV9FVlFfSUQsIDAsCisJCQkJRkNOX1RYX0RFU0NRX1NJWkUsIEZRUyhGQ05fVFhfREVTQ1EsIEVGQUJfVFhEX1NJWkUpLAorCQkJCUZDTl9UWF9ERVNDUV9UWVBFLCAwIC8qIGtlcm5lbCBxdWV1ZSAqLywKKwkJCQlGQ05fVFhfTk9OX0lQX0RST1BfRElTX0IwLCAxICk7CisJZmFsY29uX3dyaXRlICggZWZhYiwgJnJlZywgCisJCSAgICAgICBGQ05fUkVWSVNJT05fUkVHICggZWZhYiwgRkNOX1RYX0RFU0NfUFRSX1RCTF9LRVIgKSApOworCQorCS8qIFB1c2ggdGhlIHJ4IHF1ZXVlIHRvIHRoZSBoYXJkd2FyZSAqLworCWp1bWJvID0gKCBlZmFiLT5wY2lfcmV2aXNpb24gPT0gRkFMQ09OX1JFVl9CMCApID8gMCA6IDE7CisJRUZBQl9QT1BVTEFURV9PV09SRF84ICggcmVnLAorCQkJCUZDTl9SWF9JU0NTSV9ERElHX0VOLCAwLAorCQkJCUZDTl9SWF9JU0NTSV9IRElHX0VOLCAwLAorCQkJCUZDTl9SWF9ERVNDUV9CVUZfQkFTRV9JRCwgcnhfcXVldWUtPmVudHJ5LmlkLAorCQkJCUZDTl9SWF9ERVNDUV9FVlFfSUQsIDAsCisJCQkJRkNOX1JYX0RFU0NRX1NJWkUsIEZRUyhGQ05fUlhfREVTQ1EsIEVGQUJfUlhEX1NJWkUpLAorCQkJCUZDTl9SWF9ERVNDUV9UWVBFLCAwIC8qIGtlcm5lbCBxdWV1ZSAqLywKKwkJCQlGQ05fUlhfREVTQ1FfSlVNQk8sIGp1bWJvLAorCQkJCUZDTl9SWF9ERVNDUV9FTiwgMSApOworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZyZWcsCisJCSAgICAgICBGQ05fUkVWSVNJT05fUkVHICggZWZhYiwgRkNOX1JYX0RFU0NfUFRSX1RCTF9LRVIgKSApOworCisJLyogUHJvZ3JhbSBJTlRfQURSX1JFR19LRVIgKi8KKwlFRkFCX1BPUFVMQVRFX09XT1JEXzEgKCByZWcsCisJCQkJRkNOX0lOVF9BRFJfS0VSLCB2aXJ0X3RvX2J1cyAoICZlZmFiLT5pbnRfa2VyICkgKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmcmVnLCBGQ05fSU5UX0FEUl9SRUdfS0VSICk7CisKKwkvKiBBY2sgdGhlIGV2ZW50IHF1ZXVlICovCisJZmFsY29uX2V2ZW50cV9yZWFkX2FjayAoIGVmYWIsIGV2X3F1ZXVlICk7Cit9CisKK3N0YXRpYyB2b2lkCitmYWxjb25fZmluaV9yZXNvdXJjZXMgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCWVmYWJfb3dvcmRfdCBjbWQ7CisJCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJZmFsY29uX2ludGVycnVwdHMgKCBlZmFiLCAwLCAwICk7CisKKwkvKiBGbHVzaCB0aGUgZG1hIHF1ZXVlcyAqLworCUVGQUJfUE9QVUxBVEVfT1dPUkRfMiAoIGNtZCwKKwkJCQlGQ05fVFhfRkxVU0hfREVTQ1FfQ01ELCAxLAorCQkJCUZDTl9UWF9GTFVTSF9ERVNDUSwgMCApOworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZjbWQsIAorCQkgICAgICAgRkNOX1JFVklTSU9OX1JFRyAoIGVmYWIsIEZDTl9UWF9ERVNDX1BUUl9UQkxfS0VSICkgKTsKKworCUVGQUJfUE9QVUxBVEVfT1dPUkRfMiAoIGNtZCwKKwkJCQlGQ05fUlhfRkxVU0hfREVTQ1FfQ01ELCAxLAorCQkJCUZDTl9SWF9GTFVTSF9ERVNDUSwgMCApOworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZjbWQsCisJCSAgICAgICBGQ05fUkVWSVNJT05fUkVHICggZWZhYiwgRkNOX1JYX0RFU0NfUFRSX1RCTF9LRVIgKSApOworCisJbWRlbGF5ICggMTAwICk7CisKKwkvKiBSZW1vdmUgZGVzY3JpcHRvciByaW5ncyBmcm9tIGNhcmQgKi8KKwlFRkFCX1pFUk9fT1dPUkQgKCBjbWQgKTsKKwlmYWxjb25fd3JpdGUgKCBlZmFiLCAmY21kLCAKKwkJICAgICAgIEZDTl9SRVZJU0lPTl9SRUcgKCBlZmFiLCBGQ05fVFhfREVTQ19QVFJfVEJMX0tFUiApICk7CisJZmFsY29uX3dyaXRlICggZWZhYiwgJmNtZCwgCisJCSAgICAgICBGQ05fUkVWSVNJT05fUkVHICggZWZhYiwgRkNOX1JYX0RFU0NfUFRSX1RCTF9LRVIgKSApOworCWZhbGNvbl93cml0ZSAoIGVmYWIsICZjbWQsIAorCQkgICAgICAgRkNOX1JFVklTSU9OX1JFRyAoIGVmYWIsIEZDTl9FVlFfUFRSX1RCTF9LRVIgKSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBIYXJkd2FyZSByeCBwYXRoCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorZmFsY29uX2J1aWxkX3J4X2Rlc2MgKCBmYWxjb25fcnhfZGVzY190ICpyeGQsIHN0cnVjdCBpb19idWZmZXIgKmlvYiApCit7CisJRUZBQl9QT1BVTEFURV9RV09SRF8yICggKnJ4ZCwKKwkJCQlGQ05fUlhfS0VSX0JVRl9TSVpFLCBFRkFCX1JYX0JVRl9TSVpFLAorCQkJCUZDTl9SWF9LRVJfQlVGX0FEUiwgdmlydF90b19idXMgKCBpb2ItPmRhdGEgKSApOworfQorCitzdGF0aWMgdm9pZAorZmFsY29uX25vdGlmeV9yeF9kZXNjICggc3RydWN0IGVmYWJfbmljICplZmFiLCBzdHJ1Y3QgZWZhYl9yeF9xdWV1ZSAqcnhfcXVldWUgKQoreworCWVmYWJfZHdvcmRfdCByZWc7CisJaW50IHB0ciA9IHJ4X3F1ZXVlLT53cml0ZV9wdHIgJSBFRkFCX1JYRF9TSVpFOworCisJRUZBQl9QT1BVTEFURV9EV09SRF8xICggcmVnLCBGQ05fUlhfREVTQ19XUFRSX0RXT1JELCBwdHIgKTsKKwlmYWxjb25fd3JpdGVsICggZWZhYiwgJnJlZywgRkNOX1JYX0RFU0NfVVBEX1JFR19LRVJfRFdPUkQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBIYXJkd2FyZSB0eCBwYXRoCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorZmFsY29uX2J1aWxkX3R4X2Rlc2MgKCBmYWxjb25fdHhfZGVzY190ICp0eGQsIHN0cnVjdCBpb19idWZmZXIgKmlvYiApCit7CisJRUZBQl9QT1BVTEFURV9RV09SRF8yICggKnR4ZCwKKwkJCQlGQ05fVFhfS0VSX0JZVEVfQ05ULCBpb2JfbGVuICggaW9iICksCisJCQkJRkNOX1RYX0tFUl9CVUZfQURSLCB2aXJ0X3RvX2J1cyAoIGlvYi0+ZGF0YSApICk7Cit9CisKK3N0YXRpYyB2b2lkCitmYWxjb25fbm90aWZ5X3R4X2Rlc2MgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIsCisJCQlzdHJ1Y3QgZWZhYl90eF9xdWV1ZSAqdHhfcXVldWUgKQoreworCWVmYWJfZHdvcmRfdCByZWc7CisJaW50IHB0ciA9IHR4X3F1ZXVlLT53cml0ZV9wdHIgJSBFRkFCX1RYRF9TSVpFOworCisJRUZBQl9QT1BVTEFURV9EV09SRF8xICggcmVnLCBGQ05fVFhfREVTQ19XUFRSX0RXT1JELCBwdHIgKTsKKwlmYWxjb25fd3JpdGVsICggZWZhYiwgJnJlZywgRkNOX1RYX0RFU0NfVVBEX1JFR19LRVJfRFdPUkQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBTb2Z0d2FyZSByZWNlaXZlIGludGVyZmFjZQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisKK3N0YXRpYyBpbnQKK2VmYWJfZmlsbF9yeF9xdWV1ZSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwKKwkJICAgICBzdHJ1Y3QgZWZhYl9yeF9xdWV1ZSAqcnhfcXVldWUgKQoreworCWludCBmaWxsX2xldmVsID0gcnhfcXVldWUtPndyaXRlX3B0ciAtIHJ4X3F1ZXVlLT5yZWFkX3B0cjsKKwlpbnQgc3BhY2UgPSBFRkFCX05VTV9SWF9ERVNDIC0gZmlsbF9sZXZlbCAtIDE7CisJaW50IHB1c2hlZCA9IDA7CisKKwl3aGlsZSAoIHNwYWNlICkgeworCQlpbnQgYnVmX2lkID0gcnhfcXVldWUtPndyaXRlX3B0ciAlIEVGQUJfTlVNX1JYX0RFU0M7CisJCWludCBkZXNjX2lkID0gcnhfcXVldWUtPndyaXRlX3B0ciAlIEVGQUJfUlhEX1NJWkU7CisJCXN0cnVjdCBpb19idWZmZXIgKmlvYjsKKwkJZmFsY29uX3J4X2Rlc2NfdCAqcnhkOworCisJCWFzc2VydCAoIHJ4X3F1ZXVlLT5idWZbYnVmX2lkXSA9PSBOVUxMICk7CisJCWlvYiA9IGFsbG9jX2lvYiAoIEVGQUJfUlhfQlVGX1NJWkUgKTsKKwkJaWYgKCAhaW9iICkKKwkJCWJyZWFrOworCisJCUVGQUJfVFJBQ0UgKCAicHVzaGluZyByeF9idWZbJWRdIGlvYiAlcCBkYXRhICVwXG4iLAorCQkJICAgICBidWZfaWQsIGlvYiwgaW9iLT5kYXRhICk7CisKKwkJcnhfcXVldWUtPmJ1ZltidWZfaWRdID0gaW9iOworCQlyeGQgPSByeF9xdWV1ZS0+cmluZyArIGRlc2NfaWQ7CisJCWZhbGNvbl9idWlsZF9yeF9kZXNjICggcnhkLCBpb2IgKTsKKwkJKytyeF9xdWV1ZS0+d3JpdGVfcHRyOworCQkrK3B1c2hlZDsKKwkJLS1zcGFjZTsKKwl9CisKKwlpZiAoIHB1c2hlZCApIHsKKwkJLyogUHVzaCB0aGUgcHRyIHRvIGhhcmR3YXJlICovCisJCWZhbGNvbl9ub3RpZnlfcnhfZGVzYyAoIGVmYWIsIHJ4X3F1ZXVlICk7CisKKwkJZmlsbF9sZXZlbCA9IHJ4X3F1ZXVlLT53cml0ZV9wdHIgLSByeF9xdWV1ZS0+cmVhZF9wdHI7CisJCUVGQUJfVFJBQ0UgKCAicHVzaGVkICVkIHJ4IGJ1ZmZlcnMgdG8gZmlsbCBsZXZlbCAlZFxuIiwKKwkJCSAgICAgcHVzaGVkLCBmaWxsX2xldmVsICk7CisJfQorCisJaWYgKCBmaWxsX2xldmVsID09IDAgKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKwkKK3N0YXRpYyB2b2lkCitlZmFiX3JlY2VpdmUgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIsIHVuc2lnbmVkIGludCBpZCwgaW50IGxlbiwgaW50IGRyb3AgKQoreworCXN0cnVjdCBlZmFiX3J4X3F1ZXVlICpyeF9xdWV1ZSA9ICZlZmFiLT5yeF9xdWV1ZTsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2I7CisJdW5zaWduZWQgaW50IHJlYWRfcHRyID0gcnhfcXVldWUtPnJlYWRfcHRyICUgRUZBQl9SWERfU0laRTsKKwl1bnNpZ25lZCBpbnQgYnVmX3B0ciA9IHJ4X3F1ZXVlLT5yZWFkX3B0ciAlIEVGQUJfTlVNX1JYX0RFU0M7CisKKwlhc3NlcnQgKCBpZCA9PSByZWFkX3B0ciApOworCQorCS8qIFBvcCB0aGlzIHJ4IGJ1ZmZlciBvdXQgb2YgdGhlIHNvZnR3YXJlIHJpbmcgKi8KKwlpb2IgPSByeF9xdWV1ZS0+YnVmW2J1Zl9wdHJdOworCXJ4X3F1ZXVlLT5idWZbYnVmX3B0cl0gPSBOVUxMOworCisJRUZBQl9UUkFDRSAoICJwb3BwaW5nIHJ4X2J1ZlslZF0gaW9iICVwIGRhdGEgJXAgd2l0aCAlZCBieXRlcyAlc1xuIiwKKwkJICAgICBpZCwgaW9iLCBpb2ItPmRhdGEsIGxlbiwgZHJvcCA/ICJiYWQiIDogIm9rIiApOworCisJLyogUGFzcyB0aGUgcGFja2V0IHVwIGlmIHJlcXVpcmVkICovCisJaWYgKCBkcm9wICkKKwkJZnJlZV9pb2IgKCBpb2IgKTsKKwllbHNlIHsKKwkJaW9iX3B1dCAoIGlvYiwgbGVuICk7CisJCW5ldGRldl9yeCAoIGVmYWItPm5ldGRldiwgaW9iICk7CisJfQorCisJKytyeF9xdWV1ZS0+cmVhZF9wdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoKKyAqIFNvZnR3YXJlIHRyYW5zbWl0IGludGVyZmFjZQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisKK3N0YXRpYyBpbnQKK2VmYWJfdHJhbnNtaXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IgKQoreworCXN0cnVjdCBlZmFiX25pYyAqZWZhYiA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisJc3RydWN0IGVmYWJfdHhfcXVldWUgKnR4X3F1ZXVlID0gJmVmYWItPnR4X3F1ZXVlOworCWludCBmaWxsX2xldmVsLCBzcGFjZTsKKwlmYWxjb25fdHhfZGVzY190ICp0eGQ7CisJaW50IGJ1Zl9pZDsKKworCWZpbGxfbGV2ZWwgPSB0eF9xdWV1ZS0+d3JpdGVfcHRyIC0gdHhfcXVldWUtPnJlYWRfcHRyOworCXNwYWNlID0gRUZBQl9UWERfU0laRSAtIGZpbGxfbGV2ZWwgLSAxOworCWlmICggc3BhY2UgPCAxICkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJLyogU2F2ZSB0aGUgaW9idWZmZXIgZm9yIGxhdGVyIGNvbXBsZXRpb24gKi8KKwlidWZfaWQgPSB0eF9xdWV1ZS0+d3JpdGVfcHRyICUgRUZBQl9UWERfU0laRTsKKwlhc3NlcnQgKCB0eF9xdWV1ZS0+YnVmW2J1Zl9pZF0gPT0gTlVMTCApOworCXR4X3F1ZXVlLT5idWZbYnVmX2lkXSA9IGlvYjsKKworCUVGQUJfVFJBQ0UgKCAidHhfYnVmWyVkXSBmb3IgaW9iICVwIGRhdGEgJXAgbGVuICV6ZFxuIiwKKwkJICAgICBidWZfaWQsIGlvYiwgaW9iLT5kYXRhLCBpb2JfbGVuICggaW9iICkgKTsKKworCS8qIEZvcm0gdGhlIGRlc2NyaXB0b3IsIGFuZCBwdXNoIGl0IHRvIGhhcmR3YXJlICovCisJdHhkID0gdHhfcXVldWUtPnJpbmcgKyBidWZfaWQ7CisJZmFsY29uX2J1aWxkX3R4X2Rlc2MgKCB0eGQsIGlvYiApOworCSsrdHhfcXVldWUtPndyaXRlX3B0cjsKKwlmYWxjb25fbm90aWZ5X3R4X2Rlc2MgKCBlZmFiLCB0eF9xdWV1ZSApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VmYWJfdHJhbnNtaXRfZG9uZSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwgaW50IGlkICkKK3sKKwlzdHJ1Y3QgZWZhYl90eF9xdWV1ZSAqdHhfcXVldWUgPSAmZWZhYi0+dHhfcXVldWU7CisJdW5zaWduZWQgaW50IHJlYWRfcHRyLCBzdG9wOworCisJLyogQ29tcGxldGUgYWxsIGJ1ZmZlcnMgZnJvbSByZWFkX3B0ciB1cCB0byBhbmQgaW5jbHVkaW5nIGlkICovCisJcmVhZF9wdHIgPSB0eF9xdWV1ZS0+cmVhZF9wdHIgJSBFRkFCX1RYRF9TSVpFOworCXN0b3AgPSAoIGlkICsgMSApICUgRUZBQl9UWERfU0laRTsKKworCXdoaWxlICggcmVhZF9wdHIgIT0gc3RvcCApIHsKKwkJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gdHhfcXVldWUtPmJ1ZltyZWFkX3B0cl07CisJCWFzc2VydCAoIGlvYiApOworCisJCS8qIENvbXBsZXRlIHRoZSB0eCBidWZmZXIgKi8KKwkJaWYgKCBpb2IgKQorCQkJbmV0ZGV2X3R4X2NvbXBsZXRlICggZWZhYi0+bmV0ZGV2LCBpb2IgKTsKKwkJdHhfcXVldWUtPmJ1ZltyZWFkX3B0cl0gPSBOVUxMOworCQkKKwkJKyt0eF9xdWV1ZS0+cmVhZF9wdHI7CisJCXJlYWRfcHRyID0gdHhfcXVldWUtPnJlYWRfcHRyICUgRUZBQl9UWERfU0laRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogSGFyZHdhcmUgZXZlbnQgcGF0aAorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2ZhbGNvbl9jbGVhcl9pbnRlcnJ1cHRzICggc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwllZmFiX2R3b3JkX3QgcmVnOworCisJaWYgKCBlZmFiLT5wY2lfcmV2aXNpb24gPT0gRkFMQ09OX1JFVl9CMCApIHsKKwkJLyogcmVhZCB0aGUgSVNSICovCisJCWZhbGNvbl9yZWFkbCggZWZhYiwgJnJlZywgSU5UX0lTUjBfQjAgKTsKKwl9CisJZWxzZSB7CisJCS8qIHdyaXRlIHRvIHRoZSBJTlRfQUNLIHJlZ2lzdGVyICovCisJCWZhbGNvbl93cml0ZWwgKCBlZmFiLCAwLCBGQ05fSU5UX0FDS19LRVJfUkVHX0ExICk7CisJCW1iKCk7CisJCWZhbGNvbl9yZWFkbCAoIGVmYWIsICZyZWcsCisJCQkgICAgICAgV09SS19BUk9VTkRfQlJPS0VOX1BDSV9SRUFEU19SRUdfS0VSX0ExICk7CisJfQorfQorCitzdGF0aWMgdm9pZAorZmFsY29uX2hhbmRsZV9ldmVudCAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiwgZmFsY29uX2V2ZW50X3QgKmV2dCApCit7CisJaW50IGV2X2NvZGUsIGRlc2NfcHRyLCBsZW4sIGRyb3A7CisKKwkvKiBEZWNvZGUgZXZlbnQgKi8KKwlldl9jb2RlID0gRUZBQl9RV09SRF9GSUVMRCAoICpldnQsIEZDTl9FVl9DT0RFICk7CisJc3dpdGNoICggZXZfY29kZSApIHsKKwljYXNlIEZDTl9UWF9JUF9FVl9ERUNPREU6CisJCWRlc2NfcHRyID0gRUZBQl9RV09SRF9GSUVMRCAoICpldnQsIEZDTl9UWF9FVl9ERVNDX1BUUiApOworCQllZmFiX3RyYW5zbWl0X2RvbmUgKCBlZmFiLCBkZXNjX3B0ciApOworCQlicmVhazsKKwkKKwljYXNlIEZDTl9SWF9JUF9FVl9ERUNPREU6CisJCWRlc2NfcHRyID0gRUZBQl9RV09SRF9GSUVMRCAoICpldnQsIEZDTl9SWF9FVl9ERVNDX1BUUiApOworCQlsZW4gPSBFRkFCX1FXT1JEX0ZJRUxEICggKmV2dCwgRkNOX1JYX0VWX0JZVEVfQ05UICk7CisJCWRyb3AgPSAhRUZBQl9RV09SRF9GSUVMRCAoICpldnQsIEZDTl9SWF9FVl9QS1RfT0sgKTsKKworCQllZmFiX3JlY2VpdmUgKCBlZmFiLCBkZXNjX3B0ciwgbGVuLCBkcm9wICk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRUZBQl9UUkFDRSAoICJVbmtub3duIGV2ZW50IHR5cGUgJWRcbiIsIGV2X2NvZGUgKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBTb2Z0d2FyZSAocG9sbGluZykgaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitlZmFiX3BvbGwgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworCXN0cnVjdCBlZmFiX2V2X3F1ZXVlICpldl9xdWV1ZSA9ICZlZmFiLT5ldl9xdWV1ZTsKKwlzdHJ1Y3QgZWZhYl9yeF9xdWV1ZSAqcnhfcXVldWUgPSAmZWZhYi0+cnhfcXVldWU7CisJZmFsY29uX2V2ZW50X3QgKmV2dDsKKworCS8qIFJlYWQgdGhlIGV2ZW50IHF1ZXVlIGJ5IGRpcmVjdGx5IGxvb2tpbmcgZm9yIGV2ZW50cworCSAqICh3ZSBkb24ndCBldmVuIGJvdGhlciB0byByZWFkIHRoZSBldmVudHEgd3JpdGUgcHRyKSAqLworCWV2dCA9IGV2X3F1ZXVlLT5yaW5nICsgZXZfcXVldWUtPnJlYWRfcHRyOworCXdoaWxlICggZmFsY29uX2V2ZW50X3ByZXNlbnQgKCBldnQgKSApIHsKKwkJCisJCUVGQUJfVFJBQ0UgKCAiRXZlbnQgYXQgaW5kZXggMHgleCBhZGRyZXNzICVwIGlzICIKKwkJCSAgICAgRUZBQl9RV09SRF9GTVQgIlxuIiwgZXZfcXVldWUtPnJlYWRfcHRyLAorCQkJICAgICBldnQsIEVGQUJfUVdPUkRfVkFMICggKmV2dCApICk7CisJCQorCQlmYWxjb25faGFuZGxlX2V2ZW50ICggZWZhYiwgZXZ0ICk7CisJCQorCQkvKiBDbGVhciB0aGUgZXZlbnQgKi8KKwkJRUZBQl9TRVRfUVdPUkQgKCAqZXZ0ICk7CisJCisJCS8qIE1vdmUgdG8gdGhlIG5leHQgZXZlbnQuIFdlIGRvbid0IGFjayB0aGUgZXZlbnQKKwkJICogcXVldWUgdW50aWwgdGhlIGVuZCAqLworCQlldl9xdWV1ZS0+cmVhZF9wdHIgPSAoICggZXZfcXVldWUtPnJlYWRfcHRyICsgMSApICUKKwkJCQkgICAgICAgRUZBQl9FVlFfU0laRSApOworCQlldnQgPSBldl9xdWV1ZS0+cmluZyArIGV2X3F1ZXVlLT5yZWFkX3B0cjsKKwl9CisKKwkvKiBQdXNoIG1vcmUgYnVmZmVycyBpZiBuZWVkZWQgKi8KKwkodm9pZCkgZWZhYl9maWxsX3J4X3F1ZXVlICggZWZhYiwgcnhfcXVldWUgKTsKKworCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlmYWxjb25fY2xlYXJfaW50ZXJydXB0cyAoIGVmYWIgKTsKKworCS8qIEFjayB0aGUgZXZlbnQgcXVldWUgKi8KKwlmYWxjb25fZXZlbnRxX3JlYWRfYWNrICggZWZhYiwgZXZfcXVldWUgKTsKK30KKworc3RhdGljIHZvaWQKK2VmYWJfaXJxICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGVuYWJsZSApCit7CisJc3RydWN0IGVmYWJfbmljICplZmFiID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKwlzdHJ1Y3QgZWZhYl9ldl9xdWV1ZSAqZXZfcXVldWUgPSAmZWZhYi0+ZXZfcXVldWU7CisKKwlzd2l0Y2ggKCBlbmFibGUgKSB7CisJY2FzZSAwOgorCQlmYWxjb25faW50ZXJydXB0cyAoIGVmYWIsIDAsIDAgKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmYWxjb25faW50ZXJydXB0cyAoIGVmYWIsIDEsIDAgKTsKKwkJZmFsY29uX2V2ZW50cV9yZWFkX2FjayAoIGVmYWIsIGV2X3F1ZXVlICk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZmFsY29uX2ludGVycnVwdHMgKCBlZmFiLCAxLCAxICk7CisJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogU29mdHdhcmUgb3Blbi9jbG9zZQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2VmYWJfZnJlZV9yZXNvdXJjZXMgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKQoreworCXN0cnVjdCBlZmFiX2V2X3F1ZXVlICpldl9xdWV1ZSA9ICZlZmFiLT5ldl9xdWV1ZTsKKwlzdHJ1Y3QgZWZhYl9yeF9xdWV1ZSAqcnhfcXVldWUgPSAmZWZhYi0+cnhfcXVldWU7CisJc3RydWN0IGVmYWJfdHhfcXVldWUgKnR4X3F1ZXVlID0gJmVmYWItPnR4X3F1ZXVlOworCWludCBpOworCisJZm9yICggaSA9IDA7IGkgPCBFRkFCX05VTV9SWF9ERVNDOyBpKysgKSB7CisJCWlmICggcnhfcXVldWUtPmJ1ZltpXSApCisJCQlmcmVlX2lvYiAoIHJ4X3F1ZXVlLT5idWZbaV0gKTsKKwl9CisKKwlmb3IgKCBpID0gMDsgaSA8IEVGQUJfVFhEX1NJWkU7IGkrKyApIHsKKwkJaWYgKCB0eF9xdWV1ZS0+YnVmW2ldICkKKwkJCW5ldGRldl90eF9jb21wbGV0ZSAoIGVmYWItPm5ldGRldiwgIHR4X3F1ZXVlLT5idWZbaV0gKTsKKwl9CisKKwlpZiAoIHJ4X3F1ZXVlLT5yaW5nICkKKwkJZmFsY29uX2ZyZWVfc3BlY2lhbF9idWZmZXIgKCByeF9xdWV1ZS0+cmluZyApOworCisJaWYgKCB0eF9xdWV1ZS0+cmluZyApCisJCWZhbGNvbl9mcmVlX3NwZWNpYWxfYnVmZmVyICggdHhfcXVldWUtPnJpbmcgKTsKKworCWlmICggZXZfcXVldWUtPnJpbmcgKQorCQlmYWxjb25fZnJlZV9zcGVjaWFsX2J1ZmZlciAoIGV2X3F1ZXVlLT5yaW5nICk7CisKKwltZW1zZXQgKCByeF9xdWV1ZSwgMCwgc2l6ZW9mICggKnJ4X3F1ZXVlICkgKTsKKwltZW1zZXQgKCB0eF9xdWV1ZSwgMCwgc2l6ZW9mICggKnR4X3F1ZXVlICkgKTsKKwltZW1zZXQgKCBldl9xdWV1ZSwgMCwgc2l6ZW9mICggKmV2X3F1ZXVlICkgKTsKKworCS8qIEVuc3VyZSBzdWJzZXF1ZW50IGJ1ZmZlciBhbGxvY2F0aW9ucyBzdGFydCBhdCBpZCAwICovCisJZWZhYi0+YnVmZmVyX2hlYWQgPSAwOworfQorCitzdGF0aWMgaW50CitlZmFiX2FsbG9jX3Jlc291cmNlcyAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApCit7CisJc3RydWN0IGVmYWJfZXZfcXVldWUgKmV2X3F1ZXVlID0gJmVmYWItPmV2X3F1ZXVlOworCXN0cnVjdCBlZmFiX3J4X3F1ZXVlICpyeF9xdWV1ZSA9ICZlZmFiLT5yeF9xdWV1ZTsKKwlzdHJ1Y3QgZWZhYl90eF9xdWV1ZSAqdHhfcXVldWUgPSAmZWZhYi0+dHhfcXVldWU7CisJc2l6ZV90IGJ5dGVzOworCisJLyogQWxsb2NhdGUgdGhlIGhhcmR3YXJlIGV2ZW50IHF1ZXVlICovCisJYnl0ZXMgPSBzaXplb2YgKCBmYWxjb25fZXZlbnRfdCApICogRUZBQl9UWERfU0laRTsKKwlldl9xdWV1ZS0+cmluZyA9IGZhbGNvbl9hbGxvY19zcGVjaWFsX2J1ZmZlciAoIGVmYWIsIGJ5dGVzLAorCQkJCQkJICAgICAgICZldl9xdWV1ZS0+ZW50cnkgKTsKKwlpZiAoICFldl9xdWV1ZS0+cmluZyApCisJCWdvdG8gZmFpbDE7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBoYXJkd2FyZSBldmVudCBxdWV1ZSAqLworCW1lbXNldCAoIGV2X3F1ZXVlLT5yaW5nLCAweGZmLCBieXRlcyApOworCisJLyogQWxsb2NhdGUgdGhlIGhhcmR3YXJlIHR4IHF1ZXVlICovCisJYnl0ZXMgPSBzaXplb2YgKCBmYWxjb25fdHhfZGVzY190ICkgKiBFRkFCX1RYRF9TSVpFOworCXR4X3F1ZXVlLT5yaW5nID0gZmFsY29uX2FsbG9jX3NwZWNpYWxfYnVmZmVyICggZWZhYiwgYnl0ZXMsCisJCQkJCQkgICAgICAgJnR4X3F1ZXVlLT5lbnRyeSApOworCWlmICggISB0eF9xdWV1ZS0+cmluZyApCisJCWdvdG8gZmFpbDI7CisKKwkvKiBBbGxvY2F0ZSB0aGUgaGFyZHdhcmUgcnggcXVldWUgKi8KKwlieXRlcyA9IHNpemVvZiAoIGZhbGNvbl9yeF9kZXNjX3QgKSAqIEVGQUJfUlhEX1NJWkU7CisJcnhfcXVldWUtPnJpbmcgPSBmYWxjb25fYWxsb2Nfc3BlY2lhbF9idWZmZXIgKCBlZmFiLCBieXRlcywKKwkJCQkJCSAgICAgICAmcnhfcXVldWUtPmVudHJ5ICk7CisJaWYgKCAhIHJ4X3F1ZXVlLT5yaW5nICkKKwkJZ290byBmYWlsMzsKKworCXJldHVybiAwOworCitmYWlsMzoKKwlmYWxjb25fZnJlZV9zcGVjaWFsX2J1ZmZlciAoIHR4X3F1ZXVlLT5yaW5nICk7CisJdHhfcXVldWUtPnJpbmcgPSBOVUxMOworZmFpbDI6CisJZmFsY29uX2ZyZWVfc3BlY2lhbF9idWZmZXIgKCBldl9xdWV1ZS0+cmluZyApOworCWV2X3F1ZXVlLT5yaW5nID0gTlVMTDsKK2ZhaWwxOgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50CitlZmFiX2luaXRfbWFjICggc3RydWN0IGVmYWJfbmljICplZmFiICkKK3sKKwlpbnQgY291bnQsIHJjOworCisJLyogVGhpcyBjYW4gdGFrZSBzZXZlcmFsIHNlY29uZHMgKi8KKwlFRkFCX0xPRyAoICJXYWl0aW5nIGZvciBsaW5rLi5cbiIgKTsKKwlmb3IgKCBjb3VudD0wOyBjb3VudDw1OyBjb3VudCsrICkgeworCQlyYyA9IGVmYWItPm1hY19vcC0+aW5pdCAoIGVmYWIgKTsKKwkJaWYgKCByYyApIHsKKwkJCUVGQUJfRVJSICggIkZhaWxlZCByZWluaXRpYWxpc2luZyBNQUMsIGVycm9yICVzXG4iLAorCQkJCXN0cmVycm9yICggcmMgKSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQkvKiBTbGVlcCBmb3IgMnMgdG8gd2FpdCBmb3IgdGhlIGxpbmsgdG8gc2V0dGxlLCBlaXRoZXIKKwkJICogYmVjYXVzZSB3ZSB3YW50IHRvIHVzZSBpdCwgb3IgYmVjYXVzZSB3ZSdyZSBhYm91dAorCQkgKiB0byByZXNldCB0aGUgbWFjIGFueXdheQorCQkgKi8KKwkJc2xlZXAgKCAyICk7CisKKwkJaWYgKCAhIGVmYWItPmxpbmtfdXAgKSB7CisJCQlFRkFCX0VSUiAoICIhXG4iICk7CisJCQljb250aW51ZTsKKwkJfQorCisJCUVGQUJfTE9HICggIlxuJWRNYnBzICVzLWR1cGxleFxuIiwKKwkJCSAgICggZWZhYi0+bGlua19vcHRpb25zICYgTFBBX0VGXzEwMDAwID8gMTAwMDAgOgorCQkJICAgICAoIGVmYWItPmxpbmtfb3B0aW9ucyAmIExQQV9FRl8xMDAwID8gMTAwMCA6CisJCQkgICAgICAgKCBlZmFiLT5saW5rX29wdGlvbnMgJiBMUEFfMTAwID8gMTAwIDogMTAgKSApICksCisJCQkgICAoIGVmYWItPmxpbmtfb3B0aW9ucyAmIExQQV9FRl9EVVBMRVggPworCQkJICAgICAiZnVsbCIgOiAiaGFsZiIgKSApOworCisJCS8qIFRPRE86IE1vdmUgbGluayBzdGF0ZSBoYW5kbGluZyB0byB0aGUgcG9sbCgpIHJvdXRpbmUgKi8KKwkJbmV0ZGV2X2xpbmtfdXAgKCBlZmFiLT5uZXRkZXYgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJRUZBQl9FUlIgKCAidGltZWQgaW5pdGlhbGlzaW5nIE1BQ1xuIiApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgdm9pZAorZWZhYl9jbG9zZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBlZmFiX25pYyAqZWZhYiA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisKKwlmYWxjb25fZmluaV9yZXNvdXJjZXMgKCBlZmFiICk7CisJZWZhYl9mcmVlX3Jlc291cmNlcyAoIGVmYWIgKTsKKwllZmFiLT5ib2FyZF9vcC0+ZmluaSAoIGVmYWIgKTsKKwlmYWxjb25fcmVzZXQgKCBlZmFiICk7Cit9CisKK3N0YXRpYyBpbnQKK2VmYWJfb3BlbiAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBlZmFiX25pYyAqZWZhYiA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisJc3RydWN0IGVmYWJfcnhfcXVldWUgKnJ4X3F1ZXVlID0gJmVmYWItPnJ4X3F1ZXVlOworCWludCByYzsKKworCXJjID0gZmFsY29uX3Jlc2V0ICggZWZhYiApOworCWlmICggcmMgKQorCQlnb3RvIGZhaWwxOworCisJcmMgPSBlZmFiLT5ib2FyZF9vcC0+aW5pdCAoIGVmYWIgKTsKKwlpZiAoIHJjICkKKwkJZ290byBmYWlsMjsKKwkKKwlyYyA9IGZhbGNvbl9pbml0X3NyYW0gKCBlZmFiICk7CisJaWYgKCByYyApCisJCWdvdG8gZmFpbDM7CisKKwkvKiBDb25maWd1cmUgZGVzY3JpcHRvciBjYWNoZXMgYmVmb3JlIHB1c2hpbmcgaGFyZHdhcmUgcXVldWVzICovCisJZmFsY29uX3NldHVwX25pYyAoIGVmYWIgKTsKKworCXJjID0gZWZhYl9hbGxvY19yZXNvdXJjZXMgKCBlZmFiICk7CisJaWYgKCByYyApCisJCWdvdG8gZmFpbDQ7CisJCisJZmFsY29uX2luaXRfcmVzb3VyY2VzICggZWZhYiApOworCisJLyogUHVzaCByeCBidWZmZXJzICovCisJcmMgPSBlZmFiX2ZpbGxfcnhfcXVldWUgKCBlZmFiLCByeF9xdWV1ZSApOworCWlmICggcmMgKQorCQlnb3RvIGZhaWw1OworCisJLyogVHJ5IGFuZCBicmluZyB0aGUgaW50ZXJmYWNlIHVwICovCisJcmMgPSBlZmFiX2luaXRfbWFjICggZWZhYiApOworCWlmICggcmMgKQorCQlnb3RvIGZhaWw2OworCisJcmV0dXJuIDA7CisKK2ZhaWw2OgorZmFpbDU6CisJZWZhYl9mcmVlX3Jlc291cmNlcyAoIGVmYWIgKTsKK2ZhaWw0OgorZmFpbDM6CisJZWZhYi0+Ym9hcmRfb3AtPmZpbmkgKCBlZmFiICk7CitmYWlsMjoKKwlmYWxjb25fcmVzZXQgKCBlZmFiICk7CitmYWlsMToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcGVyYXRpb25zIGVmYWJfb3BlcmF0aW9ucyA9IHsKKyAgICAgICAgLm9wZW4gICAgICAgICAgID0gZWZhYl9vcGVuLAorICAgICAgICAuY2xvc2UgICAgICAgICAgPSBlZmFiX2Nsb3NlLAorICAgICAgICAudHJhbnNtaXQgICAgICAgPSBlZmFiX3RyYW5zbWl0LAorICAgICAgICAucG9sbCAgICAgICAgICAgPSBlZmFiX3BvbGwsCisgICAgICAgIC5pcnEgICAgICAgICAgICA9IGVmYWJfaXJxLAorfTsKKworc3RhdGljIHZvaWQKK2VmYWJfcmVtb3ZlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAoIHBjaSApOworCXN0cnVjdCBlZmFiX25pYyAqZWZhYiA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisKKwlpZiAoIGVmYWItPm1lbWJhc2UgKSB7CisJCWZhbGNvbl9yZXNldCAoIGVmYWIgKTsKKworCQlpb3VubWFwICggZWZhYi0+bWVtYmFzZSApOworCQllZmFiLT5tZW1iYXNlID0gTlVMTDsKKwl9CisKKwlpZiAoIGVmYWItPm52by5udnMgKSB7CisJCXVucmVnaXN0ZXJfbnZvICggJmVmYWItPm52byApOworCQllZmFiLT5udm8ubnZzID0gTlVMTDsKKwl9CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoIG5ldGRldiApOworCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworfQorCitzdGF0aWMgaW50CitlZmFiX3Byb2JlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZWZhYl9uaWMgKmVmYWI7CisJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0LCBtbWlvX2xlbjsKKwlpbnQgcmM7CisKKwkvKiBDcmVhdGUgdGhlIG5ldHdvcmsgYWRhcHRlciAqLworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2ICggc2l6ZW9mICggc3RydWN0IGVmYWJfbmljICkgKTsKKwlpZiAoICEgbmV0ZGV2ICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDE7CisJfQorCisJLyogSW5pdGlhbGlzZSB0aGUgbmV0d29yayBhZGFwdGVyLCBhbmQgaW5pdGlhbGlzZSBwcml2YXRlIHN0b3JhZ2UgKi8KKwluZXRkZXZfaW5pdCAoIG5ldGRldiwgJmVmYWJfb3BlcmF0aW9ucyApOworCXBjaV9zZXRfZHJ2ZGF0YSAoIHBjaSwgbmV0ZGV2ICk7CisJbmV0ZGV2LT5kZXYgPSAmcGNpLT5kZXY7CisKKwllZmFiID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKwltZW1zZXQgKCBlZmFiLCAwLCBzaXplb2YgKCAqZWZhYiApICk7CisJZWZhYi0+bmV0ZGV2ID0gbmV0ZGV2OworCisJLyogR2V0IGlvYmFzZS9tZW1iYXNlICovCisJbW1pb19zdGFydCA9IHBjaV9iYXJfc3RhcnQgKCBwY2ksIFBDSV9CQVNFX0FERFJFU1NfMiApOworCW1taW9fbGVuID0gcGNpX2Jhcl9zaXplICggcGNpLCBQQ0lfQkFTRV9BRERSRVNTXzIgKTsKKwllZmFiLT5tZW1iYXNlID0gaW9yZW1hcCAoIG1taW9fc3RhcnQsIG1taW9fbGVuICk7CisJRUZBQl9UUkFDRSAoICJCQVIgb2YgJWx4IGJ5dGVzIGF0IHBoeXMgJWx4IG1hcHBlZCBhdCAlcFxuIiwKKwkJICAgICBtbWlvX2xlbiwgbW1pb19zdGFydCwgZWZhYi0+bWVtYmFzZSApOworCisJLyogRW5hYmxlIHRoZSBQQ0kgZGV2aWNlICovCisJYWRqdXN0X3BjaV9kZXZpY2UgKCBwY2kgKTsKKwllZmFiLT5pb2Jhc2UgPSBwY2ktPmlvYWRkciAmIH4zOworCisJLyogRGV0ZXJtaW5lIHRoZSBOSUMgdmFyaWFudCAqLworCWZhbGNvbl9wcm9iZV9uaWNfdmFyaWFudCAoIGVmYWIsIHBjaSApOworCisJLyogUmVhZCB0aGUgU1BJIGludGVyZmFjZSBhbmQgZGV0ZXJtaW5lIHRoZSBNQUMgYWRkcmVzcywKKwkgKiBhbmQgdGhlIGJvYXJkIGFuZCBwaHkgdmFyaWFudC4gSG9vayBpbiB0aGUgb3AgdGFibGVzICovCisJcmMgPSBmYWxjb25fcHJvYmVfc3BpICggZWZhYiApOworCWlmICggcmMgKQorCQlnb3RvIGZhaWwyOworCXJjID0gZmFsY29uX3Byb2JlX252cmFtICggZWZhYiApOworCWlmICggcmMgKQorCQlnb3RvIGZhaWwzOworCisJbWVtY3B5ICggbmV0ZGV2LT5od19hZGRyLCBlZmFiLT5tYWNfYWRkciwgRVRIX0FMRU4gKTsKKworCW5ldGRldl9saW5rX3VwICggbmV0ZGV2ICk7CisJcmMgPSByZWdpc3Rlcl9uZXRkZXYgKCBuZXRkZXYgKTsKKwlpZiAoIHJjICkKKwkJZ290byBmYWlsNDsKKworCS8qIEFkdmVydGlzZSBub24tdm9sYXRpbGUgc3RvcmFnZSAqLworCWlmICggZWZhYi0+bnZvLm52cyApIHsKKwkJcmMgPSByZWdpc3Rlcl9udm8gKCAmZWZhYi0+bnZvLCBuZXRkZXZfc2V0dGluZ3MgKCBuZXRkZXYgKSApOworCQlpZiAoIHJjICkKKwkJCWdvdG8gZmFpbDU7CisJfQorCisJRUZBQl9MT0cgKCAiRm91bmQgJXMgRXRoZXJGYWJyaWMgJXMgJXMgcmV2aXNpb24gJWRcbiIsIGlkLT5uYW1lLAorCQkgICBlZmFiLT5pc19hc2ljID8gIkFTSUMiIDogIkZQR0EiLAorCQkgICBlZmFiLT5waHlfMTBnID8gIjEwRyIgOiAiMUciLAorCQkgICBlZmFiLT5wY2lfcmV2aXNpb24gKTsKKworCXJldHVybiAwOworCitmYWlsNToKKwl1bnJlZ2lzdGVyX25ldGRldiAoIG5ldGRldiApOworZmFpbDQ6CitmYWlsMzoKK2ZhaWwyOgorCWlvdW5tYXAgKCBlZmFiLT5tZW1iYXNlICk7CisJZWZhYi0+bWVtYmFzZSA9IE5VTEw7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworZmFpbDE6CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBlZmFiX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTkyNCwgMHgwNzAzLCAiZmFsY29uIiwgIkV0aGVyRmFicmljIEZhbGNvbiIsIDApLAorCVBDSV9ST00oMHgxOTI0LCAweDA3MTAsICJmYWxjb25iMCIsICJFdGhlckZhYnJpYyBGYWxjb25CMCIsIDApLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgZXRoZXJmYWJyaWNfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzID0gZWZhYl9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZiAoIGVmYWJfbmljcyApIC8gc2l6ZW9mICggZWZhYl9uaWNzWzBdICksCisJLnByb2JlID0gZWZhYl9wcm9iZSwKKwkucmVtb3ZlID0gZWZhYl9yZW1vdmUsCit9OworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZXRoZXJmYWJyaWMuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2V0aGVyZmFicmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1N2ViNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2V0aGVyZmFicmljLmgKQEAgLTAsMCArMSw1NTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdQTCBuZXQgZHJpdmVyIGZvciBMZXZlbCA1IEV0aGVyZmFicmljIG5ldHdvcmsgY2FyZHMKKyAqCisgKiBXcml0dGVuIGJ5IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPgorICoKKyAqIENvcHlyaWdodCBGZW4gU3lzdGVtcyBMdGQuIDIwMDUKKyAqIENvcHlyaWdodCBMZXZlbCA1IE5ldHdvcmtzIEluYy4gMjAwNQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieQorICogcmVmZXJlbmNlLiAgRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIKKyAqIHRoZSBHUEwgYW5kIG11c3QgcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UKKyAqIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QgYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nIHN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTF9BTlkgKTsKKworI2lmbmRlZiBFRkFCX0JJVEZJRUxEX0gKKyNkZWZpbmUgRUZBQl9CSVRGSUVMRF9ICisKKy8qKiBAZmlsZQorICoKKyAqIEV0aGVyZmFicmljIGJpdGZpZWxkIGFjY2VzcworICoKKyAqIEV0aGVyZmFicmljIE5JQ3MgbWFrZSBleHRlbnNpdmUgdXNlIG9mIGJpdGZpZWxkcyB1cCB0byAxMjggYml0cworICogd2lkZS4gIFNpbmNlIHRoZXJlIGlzIG5vIG5hdGl2ZSAxMjgtYml0IGRhdGF0eXBlIG9uIG1vc3Qgc3lzdGVtcywKKyAqIGFuZCBzaW5jZSA2NC1iaXQgZGF0YXR5cGVzIGFyZSBpbmVmZmljaWVudCBvbiAzMi1iaXQgc3lzdGVtcyBhbmQKKyAqIHZpY2UgdmVyc2EsIHdlIHdyYXAgYWNjZXNzZXMgaW4gYSB3YXkgdGhhdCB1c2VzIHRoZSBtb3N0IGVmZmljaWVudAorICogZGF0YXR5cGUuCisgKgorICogVGhlIE5JQ3MgYXJlIFBDSSBkZXZpY2VzIGFuZCB0aGVyZWZvcmUgbGl0dGxlLWVuZGlhbi4gIFNpbmNlIG1vc3QKKyAqIG9mIHRoZSBxdWFudGl0aWVzIHRoYXQgd2UgZGVhbCB3aXRoIGFyZSBETUFlZCB0by9mcm9tIGhvc3QgbWVtb3J5LAorICogd2UgZGVmaW5lIG91ciBkYXRhdHlwZXMgKGVmYWJfb3dvcmRfdCwgZWZhYl9xd29yZF90IGFuZAorICogZWZhYl9kd29yZF90KSB0byBiZSBsaXR0bGUtZW5kaWFuLgorICoKKyAqIEluIHRoZSBsZXNzIGNvbW1vbiBjYXNlIG9mIHVzaW5nIFBJTyBmb3IgaW5kaXZpZHVhbCByZWdpc3RlcgorICogd3JpdGVzLCB3ZSBjb25zdHJ1Y3QgdGhlIGxpdHRsZS1lbmRpYW4gZGF0YXR5cGUgaW4gaG9zdCBtZW1vcnkgYW5kCisgKiB0aGVuIHVzZSBub24tc3dhcHBpbmcgZXF1aXZhbGVudHMgb2Ygd3JpdGVsL3dyaXRlcSwgcmF0aGVyIHRoYW4KKyAqIGNvbnN0cnVjdGluZyBhIG5hdGl2ZS1lbmRpYW4gZGF0YXR5cGUgYW5kIHJlbHlpbmcgb24gdGhlIGltcGxpY2l0CisgKiBieXRlLXN3YXBwaW5nIGRvbmUgYnkgd3JpdGVsL3dyaXRlcS4gIChXZSB1c2UgYSBzaW1pbGFyIHN0cmF0ZWd5CisgKiBmb3IgcmVnaXN0ZXIgcmVhZHMuKQorICovCisKKy8qKiBEdW1teSBmaWVsZCBsb3cgYml0IG51bWJlciAqLworI2RlZmluZSBFRkFCX0RVTU1ZX0ZJRUxEX0xCTiAwCisvKiogRHVtbXkgZmllbGQgd2lkdGggKi8KKyNkZWZpbmUgRUZBQl9EVU1NWV9GSUVMRF9XSURUSCAwCisvKiogRHdvcmQgMCBsb3cgYml0IG51bWJlciAqLworI2RlZmluZSBFRkFCX0RXT1JEXzBfTEJOIDAKKy8qKiBEd29yZCAwIHdpZHRoICovCisjZGVmaW5lIEVGQUJfRFdPUkRfMF9XSURUSCAzMgorLyoqIER3b3JkIDEgbG93IGJpdCBudW1iZXIgKi8KKyNkZWZpbmUgRUZBQl9EV09SRF8xX0xCTiAzMgorLyoqIER3b3JkIDEgd2lkdGggKi8KKyNkZWZpbmUgRUZBQl9EV09SRF8xX1dJRFRIIDMyCisvKiogRHdvcmQgMiBsb3cgYml0IG51bWJlciAqLworI2RlZmluZSBFRkFCX0RXT1JEXzJfTEJOIDY0CisvKiogRHdvcmQgMiB3aWR0aCAqLworI2RlZmluZSBFRkFCX0RXT1JEXzJfV0lEVEggMzIKKy8qKiBEd29yZCAzIGxvdyBiaXQgbnVtYmVyICovCisjZGVmaW5lIEVGQUJfRFdPUkRfM19MQk4gOTYKKy8qKiBEd29yZCAzIHdpZHRoICovCisjZGVmaW5lIEVGQUJfRFdPUkRfM19XSURUSCAzMgorCisvKiogU3BlY2lmaWVkIGF0dHJpYnV0ZSAoZS5nLiBMQk4pIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgKi8KKyNkZWZpbmUgRUZBQl9WQUwoZmllbGQsYXR0cmlidXRlKSBmaWVsZCAjIyBfICMjIGF0dHJpYnV0ZQorLyoqIExvdyBiaXQgbnVtYmVyIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgKi8KKyNkZWZpbmUgRUZBQl9MT1dfQklUKCBmaWVsZCApIEVGQUJfVkFMICggZmllbGQsIExCTiApCisvKiogQml0IHdpZHRoIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgKi8KKyNkZWZpbmUgRUZBQl9XSURUSCggZmllbGQgKSBFRkFCX1ZBTCAoIGZpZWxkLCBXSURUSCApCisvKiogSGlnaCBiaXQgbnVtYmVyIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQgKi8KKyNkZWZpbmUgRUZBQl9ISUdIX0JJVChmaWVsZCkgKCBFRkFCX0xPV19CSVQoZmllbGQpICsgRUZBQl9XSURUSChmaWVsZCkgLSAxICkKKy8qKiBNYXNrIGVxdWFsIGluIHdpZHRoIHRvIHRoZSBzcGVjaWZpZWQgZmllbGQuCisgKgorICogRm9yIGV4YW1wbGUsIGEgZmllbGQgd2l0aCB3aWR0aCA1IHdvdWxkIGhhdmUgYSBtYXNrIG9mIDB4MWYuCisgKgorICogVGhlIG1heGltdW0gd2lkdGggbWFzayB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQgaXMgNjQgYml0cy4KKyAqLworI2RlZmluZSBFRkFCX01BU0s2NCggZmllbGQgKQkJCQkJCVwKKwkoIEVGQUJfV0lEVEgoZmllbGQpID09IDY0ID8gfiggKCB1aW50NjRfdCApIDAgKSA6CQlcCisJICAoICggKCAoICggdWludDY0X3QgKSAxICkgPDwgRUZBQl9XSURUSChmaWVsZCkgKSApIC0gMSApICkKKworLyoqIE1hc2sgZXF1YWwgaW4gd2lkdGggdG8gdGhlIHNwZWNpZmllZCBmaWVsZC4KKyAqCisgKiBGb3IgZXhhbXBsZSwgYSBmaWVsZCB3aXRoIHdpZHRoIDUgd291bGQgaGF2ZSBhIG1hc2sgb2YgMHgxZi4KKyAqCisgKiBUaGUgbWF4aW11bSB3aWR0aCBtYXNrIHRoYXQgY2FuIGJlIGdlbmVyYXRlZCBpcyAzMiBiaXRzLiAgVXNlCisgKiBFRkFCX01BU0s2NCBmb3IgaGlnaGVyIHdpZHRoIGZpZWxkcy4KKyAqLworI2RlZmluZSBFRkFCX01BU0szMiggZmllbGQgKQkJCQkJCVwKKwkoIEVGQUJfV0lEVEgoZmllbGQpID09IDMyID8gfiggKCB1aW50MzJfdCApIDAgKSA6CQlcCisJICAoICggKCAoICggdWludDMyX3QgKSAxICkgPDwgRUZBQl9XSURUSChmaWVsZCkgKSApIC0gMSApICkKKworLyoqIEEgZG91Ymxld29yZCAoaS5lLiA0IGJ5dGUpIGRhdGF0eXBlCisgKgorICogVGhpcyBkYXRhdHlwZSBpcyBkZWZpbmVkIHRvIGJlIGxpdHRsZS1lbmRpYW4uCisgKi8KK3R5cGVkZWYgdW5pb24gZWZhYl9kd29yZCB7CisJdWludDMyX3QgdTMyWzFdOworCXVpbnQzMl90IG9wYXF1ZTsgLyogRm9yIGJpdHdpc2Ugb3BlcmF0aW9ucyBiZXR3ZWVuIHR3byBlZmFiX2R3b3JkcyAqLworfSBlZmFiX2R3b3JkX3Q7CisKKy8qKiBBIHF1YWR3b3JkIChpLmUuIDggYnl0ZSkgZGF0YXR5cGUKKyAqCisgKiBUaGlzIGRhdGF0eXBlIGlzIGRlZmluZWQgdG8gYmUgbGl0dGxlLWVuZGlhbi4KKyAqLwordHlwZWRlZiB1bmlvbiBlZmFiX3F3b3JkIHsKKwl1aW50NjRfdCB1NjRbMV07CisJdWludDMyX3QgdTMyWzJdOworCWVmYWJfZHdvcmRfdCBkd29yZFsyXTsKK30gZWZhYl9xd29yZF90OworCisvKioKKyAqIEFuIG9jdHdvcmQgKGVpZ2h0LXdvcmQsIGkuZS4gMTYgYnl0ZSkgZGF0YXR5cGUKKyAqCisgKiBUaGlzIGRhdGF0eXBlIGlzIGRlZmluZWQgdG8gYmUgbGl0dGxlLWVuZGlhbi4KKyAqLwordHlwZWRlZiB1bmlvbiBlZmFiX293b3JkIHsKKwl1aW50NjRfdCB1NjRbMl07CisJZWZhYl9xd29yZF90IHF3b3JkWzJdOworCXVpbnQzMl90IHUzMls0XTsKKwllZmFiX2R3b3JkX3QgZHdvcmRbNF07Cit9IGVmYWJfb3dvcmRfdDsKKworLyoqIEZvcm1hdCBzdHJpbmcgZm9yIHByaW50aW5nIGFuIGVmYWJfZHdvcmRfdCAqLworI2RlZmluZSBFRkFCX0RXT1JEX0ZNVCAiJTA4eCIKKworLyoqIEZvcm1hdCBzdHJpbmcgZm9yIHByaW50aW5nIGFuIGVmYWJfcXdvcmRfdCAqLworI2RlZmluZSBFRkFCX1FXT1JEX0ZNVCAiJTA4eDolMDh4IgorCisvKiogRm9ybWF0IHN0cmluZyBmb3IgcHJpbnRpbmcgYW4gZWZhYl9vd29yZF90ICovCisjZGVmaW5lIEVGQUJfT1dPUkRfRk1UICIlMDh4OiUwOHg6JTA4eDolMDh4IgorCisvKiogcHJpbnRrIHBhcmFtZXRlcnMgZm9yIHByaW50aW5nIGFuIGVmYWJfZHdvcmRfdCAqLworI2RlZmluZSBFRkFCX0RXT1JEX1ZBTChkd29yZCkJCQkJCVwKKwkoICggdW5zaWduZWQgaW50ICkgbGUzMl90b19jcHUgKCAoZHdvcmQpLnUzMlswXSApICkKKworLyoqIHByaW50ayBwYXJhbWV0ZXJzIGZvciBwcmludGluZyBhbiBlZmFiX3F3b3JkX3QgKi8KKyNkZWZpbmUgRUZBQl9RV09SRF9WQUwocXdvcmQpCQkJCQlcCisJKCAoIHVuc2lnbmVkIGludCApIGxlMzJfdG9fY3B1ICggKHF3b3JkKS51MzJbMV0gKSApLAlcCisJKCAoIHVuc2lnbmVkIGludCApIGxlMzJfdG9fY3B1ICggKHF3b3JkKS51MzJbMF0gKSApCisKKy8qKiBwcmludGsgcGFyYW1ldGVycyBmb3IgcHJpbnRpbmcgYW4gZWZhYl9vd29yZF90ICovCisjZGVmaW5lIEVGQUJfT1dPUkRfVkFMKG93b3JkKQkJCQkJXAorCSggKCB1bnNpZ25lZCBpbnQgKSBsZTMyX3RvX2NwdSAoIChvd29yZCkudTMyWzNdICkgKSwJXAorCSggKCB1bnNpZ25lZCBpbnQgKSBsZTMyX3RvX2NwdSAoIChvd29yZCkudTMyWzJdICkgKSwJXAorCSggKCB1bnNpZ25lZCBpbnQgKSBsZTMyX3RvX2NwdSAoIChvd29yZCkudTMyWzFdICkgKSwJXAorCSggKCB1bnNpZ25lZCBpbnQgKSBsZTMyX3RvX2NwdSAoIChvd29yZCkudTMyWzBdICkgKQorCisvKioKKyAqIEV4dHJhY3QgYml0IGZpZWxkIHBvcnRpb24gW2xvdyxoaWdoKSBmcm9tIHRoZSBuYXRpdmUtZW5kaWFuIGVsZW1lbnQKKyAqIHdoaWNoIGNvbnRhaW5zIGJpdHMgW21pbixtYXgpLgorICoKKyAqIEZvciBleGFtcGxlLCBzdXBwb3NlICJlbGVtZW50IiByZXByZXNlbnRzIHRoZSBoaWdoIDMyIGJpdHMgb2YgYQorICogNjQtYml0IHZhbHVlLCBhbmQgd2Ugd2lzaCB0byBleHRyYWN0IHRoZSBiaXRzIGJlbG9uZ2luZyB0byB0aGUgYml0CisgKiBmaWVsZCBvY2N1cHlpbmcgYml0cyAyOC00NSBvZiB0aGlzIDY0LWJpdCB2YWx1ZS4KKyAqCisgKiBUaGVuIEVGQUJfRVhUUkFDVCAoIGVsZW1lbnQsIDMyLCA2MywgMjgsIDQ1ICkgd291bGQgZ2l2ZQorICoKKyAqICAgKCBlbGVtZW50ICkgPDwgNAorICoKKyAqIFRoZSByZXN1bHQgd2lsbCBjb250YWluIHRoZSByZWxldmFudCBiaXRzIGZpbGxlZCBpbiBpbiB0aGUgcmFuZ2UKKyAqIFswLGhpZ2gtbG93KSwgd2l0aCBnYXJiYWdlIGluIGJpdHMgW2hpZ2gtbG93KzEsLi4uKS4KKyAqLworI2RlZmluZSBFRkFCX0VYVFJBQ1RfTkFUSVZFKCBuYXRpdmVfZWxlbWVudCwgbWluICxtYXggLGxvdyAsaGlnaCApCVwKKwkoICggKCBsb3cgPiBtYXggKSB8fCAoIGhpZ2ggPCBtaW4gKSApID8gMCA6CQkJXAorCSAgKCAoIGxvdyA+IG1pbiApID8JCQkJCQlcCisJICAgICggKG5hdGl2ZV9lbGVtZW50KSA+PiAoIGxvdyAtIG1pbiApICkgOgkJCVwKKwkgICAgKCAobmF0aXZlX2VsZW1lbnQpIDw8ICggbWluIC0gbG93ICkgKSApICkKKworLyoqCisgKiBFeHRyYWN0IGJpdCBmaWVsZCBwb3J0aW9uIFtsb3csaGlnaCkgZnJvbSB0aGUgNjQtYml0IGxpdHRsZS1lbmRpYW4KKyAqIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgYml0cyBbbWluLG1heCkKKyAqLworI2RlZmluZSBFRkFCX0VYVFJBQ1Q2NCggZWxlbWVudCwgbWluLCBtYXgsIGxvdywgaGlnaCApCQkJXAorCUVGQUJfRVhUUkFDVF9OQVRJVkUgKCBsZTY0X3RvX2NwdShlbGVtZW50KSwgbWluLCBtYXgsIGxvdywgaGlnaCApCisKKy8qKgorICogRXh0cmFjdCBiaXQgZmllbGQgcG9ydGlvbiBbbG93LGhpZ2gpIGZyb20gdGhlIDMyLWJpdCBsaXR0bGUtZW5kaWFuCisgKiBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIGJpdHMgW21pbixtYXgpCisgKi8KKyNkZWZpbmUgRUZBQl9FWFRSQUNUMzIoIGVsZW1lbnQsIG1pbiwgbWF4LCBsb3csIGhpZ2ggKQkJCVwKKwlFRkFCX0VYVFJBQ1RfTkFUSVZFICggbGUzMl90b19jcHUoZWxlbWVudCksIG1pbiwgbWF4LCBsb3csIGhpZ2ggKQorCisjZGVmaW5lIEVGQUJfRVhUUkFDVF9PV09SRDY0KCBvd29yZCwgbG93LCBoaWdoICkJCQlcCisJKCBFRkFCX0VYVFJBQ1Q2NCAoIChvd29yZCkudTY0WzBdLCAgIDAsICA2MywgbG93LCBoaWdoICkgfAlcCisJICBFRkFCX0VYVFJBQ1Q2NCAoIChvd29yZCkudTY0WzFdLCAgNjQsIDEyNywgbG93LCBoaWdoICkgKQorCisjZGVmaW5lIEVGQUJfRVhUUkFDVF9RV09SRDY0KCBxd29yZCwgbG93LCBoaWdoICkJCQlcCisJKCBFRkFCX0VYVFJBQ1Q2NCAoIChxd29yZCkudTY0WzBdLCAgIDAsICA2MywgbG93LCBoaWdoICkgKQorCisjZGVmaW5lIEVGQUJfRVhUUkFDVF9PV09SRDMyKCBvd29yZCwgbG93LCBoaWdoICkJCQlcCisJKCBFRkFCX0VYVFJBQ1QzMiAoIChvd29yZCkudTMyWzBdLCAgIDAsICAzMSwgbG93LCBoaWdoICkgfAlcCisJICBFRkFCX0VYVFJBQ1QzMiAoIChvd29yZCkudTMyWzFdLCAgMzIsICA2MywgbG93LCBoaWdoICkgfAlcCisJICBFRkFCX0VYVFJBQ1QzMiAoIChvd29yZCkudTMyWzJdLCAgNjQsICA5NSwgbG93LCBoaWdoICkgfAlcCisJICBFRkFCX0VYVFJBQ1QzMiAoIChvd29yZCkudTMyWzNdLCAgOTYsIDEyNywgbG93LCBoaWdoICkgKQorCisjZGVmaW5lIEVGQUJfRVhUUkFDVF9RV09SRDMyKCBxd29yZCwgbG93LCBoaWdoICkJCQlcCisJKCBFRkFCX0VYVFJBQ1QzMiAoIChxd29yZCkudTMyWzBdLCAgIDAsICAzMSwgbG93LCBoaWdoICkgfAlcCisJICBFRkFCX0VYVFJBQ1QzMiAoIChxd29yZCkudTMyWzFdLCAgMzIsICA2MywgbG93LCBoaWdoICkgKQorCisjZGVmaW5lIEVGQUJfRVhUUkFDVF9EV09SRCggZHdvcmQsIGxvdywgaGlnaCApCQkJCVwKKwkoIEVGQUJfRVhUUkFDVDMyICggKGR3b3JkKS51MzJbMF0sICAgMCwgIDMxLCBsb3csIGhpZ2ggKSApCisKKyNkZWZpbmUgRUZBQl9PV09SRF9GSUVMRDY0KCBvd29yZCwgZmllbGQgKQkJCQlcCisJKCBFRkFCX0VYVFJBQ1RfT1dPUkQ2NCAoIG93b3JkLCBFRkFCX0xPV19CSVQgKCBmaWVsZCApLAkJXAorCQkJCSBFRkFCX0hJR0hfQklUICggZmllbGQgKSApICYJCVwKKwkgIEVGQUJfTUFTSzY0ICggZmllbGQgKSApCisKKyNkZWZpbmUgRUZBQl9RV09SRF9GSUVMRDY0KCBxd29yZCwgZmllbGQgKQkJCQlcCisJKCBFRkFCX0VYVFJBQ1RfUVdPUkQ2NCAoIHF3b3JkLCBFRkFCX0xPV19CSVQgKCBmaWVsZCApLAkJXAorCQkJCSBFRkFCX0hJR0hfQklUICggZmllbGQgKSApICYJCVwKKwkgIEVGQUJfTUFTSzY0ICggZmllbGQgKSApCisKKyNkZWZpbmUgRUZBQl9PV09SRF9GSUVMRDMyKCBvd29yZCwgZmllbGQgKQkJCQlcCisJKCBFRkFCX0VYVFJBQ1RfT1dPUkQzMiAoIG93b3JkLCBFRkFCX0xPV19CSVQgKCBmaWVsZCApLAkJXAorCQkJCSBFRkFCX0hJR0hfQklUICggZmllbGQgKSApICYJCVwKKwkgIEVGQUJfTUFTSzMyICggZmllbGQgKSApCisKKyNkZWZpbmUgRUZBQl9RV09SRF9GSUVMRDMyKCBxd29yZCwgZmllbGQgKQkJCQlcCisJKCBFRkFCX0VYVFJBQ1RfUVdPUkQzMiAoIHF3b3JkLCBFRkFCX0xPV19CSVQgKCBmaWVsZCApLAkJXAorCQkJCSBFRkFCX0hJR0hfQklUICggZmllbGQgKSApICYJCVwKKwkgIEVGQUJfTUFTSzMyICggZmllbGQgKSApCisKKyNkZWZpbmUgRUZBQl9EV09SRF9GSUVMRCggZHdvcmQsIGZpZWxkICkJCQkJXAorCSggRUZBQl9FWFRSQUNUX0RXT1JEICggZHdvcmQsIEVGQUJfTE9XX0JJVCAoIGZpZWxkICksCQlcCisJCQkgICAgICAgRUZBQl9ISUdIX0JJVCAoIGZpZWxkICkgKSAmCQlcCisJICBFRkFCX01BU0szMiAoIGZpZWxkICkgKQorCisjZGVmaW5lIEVGQUJfT1dPUkRfSVNfWkVSTzY0KCBvd29yZCApCQkJCQlcCisJKCAhICggKG93b3JkKS51NjRbMF0gfHwgKG93b3JkKS51NjRbMV0gKSApCisKKyNkZWZpbmUgRUZBQl9RV09SRF9JU19aRVJPNjQoIHF3b3JkICkJCQkJCVwKKwkoICEgKCAocXdvcmQpLnU2NFswXSApICkKKworI2RlZmluZSBFRkFCX09XT1JEX0lTX1pFUk8zMiggb3dvcmQgKQkJCQkJXAorCSggISAoIChvd29yZCkudTMyWzBdIHx8IChvd29yZCkudTMyWzFdIHx8CQkJXAorCSAgICAgIChvd29yZCkudTMyWzJdIHx8IChvd29yZCkudTMyWzNdICkgKQorCisjZGVmaW5lIEVGQUJfUVdPUkRfSVNfWkVSTzMyKCBxd29yZCApCQkJCQlcCisJKCAhICggKHF3b3JkKS51MzJbMF0gfHwgKHF3b3JkKS51MzJbMV0gKSApCisKKyNkZWZpbmUgRUZBQl9EV09SRF9JU19aRVJPKCBkd29yZCApCQkJCQlcCisJKCAhICggKGR3b3JkKS51MzJbMF0gKSApCisKKyNkZWZpbmUgRUZBQl9PV09SRF9JU19BTExfT05FUzY0KCBvd29yZCApCQkJCVwKKwkoICggKG93b3JkKS51NjRbMF0gJiAob3dvcmQpLnU2NFsxXSApID09IH4oICggdWludDY0X3QgKSAwICkgKQorCisjZGVmaW5lIEVGQUJfUVdPUkRfSVNfQUxMX09ORVM2NCggcXdvcmQgKQkJCQlcCisJKCAocXdvcmQpLnU2NFswXSA9PSB+KCAoIHVpbnQ2NF90ICkgMCApICkKKworI2RlZmluZSBFRkFCX09XT1JEX0lTX0FMTF9PTkVTMzIoIG93b3JkICkJCQkJXAorCSggKCAob3dvcmQpLnUzMlswXSAmIChvd29yZCkudTMyWzFdICYJCQkJXAorCSAgICAob3dvcmQpLnUzMlsyXSAmIChvd29yZCkudTMyWzNdICkgPT0gfiggKCB1aW50MzJfdCApIDAgKSApCisKKyNkZWZpbmUgRUZBQl9RV09SRF9JU19BTExfT05FUzMyKCBxd29yZCApCQkJCVwKKwkoICggKHF3b3JkKS51MzJbMF0gJiAocXdvcmQpLnUzMlsxXSApID09IH4oICggdWludDMyX3QgKSAwICkgKQorCisjZGVmaW5lIEVGQUJfRFdPUkRfSVNfQUxMX09ORVMoIGR3b3JkICkJCQkJCVwKKwkoIChkd29yZCkudTMyWzBdID09IH4oICggdWludDMyX3QgKSAwICkgKQorCisjaWYgKCBCSVRTX1BFUl9MT05HID09IDY0ICkKKyNkZWZpbmUgRUZBQl9PV09SRF9GSUVMRAlFRkFCX09XT1JEX0ZJRUxENjQKKyNkZWZpbmUgRUZBQl9RV09SRF9GSUVMRAlFRkFCX1FXT1JEX0ZJRUxENjQKKyNkZWZpbmUgRUZBQl9PV09SRF9JU19aRVJPCUVGQUJfT1dPUkRfSVNfWkVSTzY0CisjZGVmaW5lIEVGQUJfUVdPUkRfSVNfWkVSTwlFRkFCX1FXT1JEX0lTX1pFUk82NAorI2RlZmluZSBFRkFCX09XT1JEX0lTX0FMTF9PTkVTCUVGQUJfT1dPUkRfSVNfQUxMX09ORVM2NAorI2RlZmluZSBFRkFCX1FXT1JEX0lTX0FMTF9PTkVTCUVGQUJfUVdPUkRfSVNfQUxMX09ORVM2NAorI2Vsc2UKKyNkZWZpbmUgRUZBQl9PV09SRF9GSUVMRAlFRkFCX09XT1JEX0ZJRUxEMzIKKyNkZWZpbmUgRUZBQl9RV09SRF9GSUVMRAlFRkFCX1FXT1JEX0ZJRUxEMzIKKyNkZWZpbmUgRUZBQl9PV09SRF9JU19aRVJPCUVGQUJfT1dPUkRfSVNfWkVSTzMyCisjZGVmaW5lIEVGQUJfUVdPUkRfSVNfWkVSTwlFRkFCX1FXT1JEX0lTX1pFUk8zMgorI2RlZmluZSBFRkFCX09XT1JEX0lTX0FMTF9PTkVTCUVGQUJfT1dPUkRfSVNfQUxMX09ORVMzMgorI2RlZmluZSBFRkFCX1FXT1JEX0lTX0FMTF9PTkVTCUVGQUJfUVdPUkRfSVNfQUxMX09ORVMzMgorI2VuZGlmCisKKy8qKgorICogQ29uc3RydWN0IGJpdCBmaWVsZCBwb3J0aW9uCisgKgorICogQ3JlYXRlcyB0aGUgcG9ydGlvbiBvZiB0aGUgYml0IGZpZWxkIFtsb3csaGlnaCkgdGhhdCBsaWVzIHdpdGhpbgorICogdGhlIHJhbmdlIFttaW4sbWF4KS4KKyAqLworI2RlZmluZSBFRkFCX0lOU0VSVF9OQVRJVkU2NCggbWluLCBtYXgsIGxvdywgaGlnaCwgdmFsdWUgKQlcCisJKCAoICggbG93ID4gbWF4ICkgfHwgKCBoaWdoIDwgbWluICkgKSA/IDAgOgkJXAorCSAgKCAoIGxvdyA+IG1pbiApID8JCQkJCVwKKwkgICAgKCAoICggdWludDY0X3QgKSAodmFsdWUpICkgPDwgKCBsb3cgLSBtaW4gKSApIDoJXAorCSAgICAoICggKCB1aW50NjRfdCApICh2YWx1ZSkgKSA+PiAoIG1pbiAtIGxvdyApICkgKSApCisKKyNkZWZpbmUgRUZBQl9JTlNFUlRfTkFUSVZFMzIoIG1pbiwgbWF4LCBsb3csIGhpZ2gsIHZhbHVlICkJXAorCSggKCAoIGxvdyA+IG1heCApIHx8ICggaGlnaCA8IG1pbiApICkgPyAwIDoJCVwKKwkgICggKCBsb3cgPiBtaW4gKSA/CQkJCQlcCisJICAgICggKCAoIHVpbnQzMl90ICkgKHZhbHVlKSApIDw8ICggbG93IC0gbWluICkgKSA6CVwKKwkgICAgKCAoICggdWludDMyX3QgKSAodmFsdWUpICkgPj4gKCBtaW4gLSBsb3cgKSApICkgKQorCisjZGVmaW5lIEVGQUJfSU5TRVJUX05BVElWRSggbWluLCBtYXgsIGxvdywgaGlnaCwgdmFsdWUgKQlcCisJKCAoICggKCBtYXggLSBtaW4gKSA+PSAzMiApIHx8CQkJCVwKKwkgICAgKCAoIGhpZ2ggLSBsb3cgKSA+PSAzMiApICkJIAkJCVwKKwkgID8gRUZBQl9JTlNFUlRfTkFUSVZFNjQgKCBtaW4sIG1heCwgbG93LCBoaWdoLCB2YWx1ZSApCVwKKwkgIDogRUZBQl9JTlNFUlRfTkFUSVZFMzIgKCBtaW4sIG1heCwgbG93LCBoaWdoLCB2YWx1ZSApICkKKworLyoqCisgKiBDb25zdHJ1Y3QgYml0IGZpZWxkIHBvcnRpb24KKyAqCisgKiBDcmVhdGVzIHRoZSBwb3J0aW9uIG9mIHRoZSBuYW1lZCBiaXQgZmllbGQgdGhhdCBsaWVzIHdpdGhpbiB0aGUKKyAqIHJhbmdlIFttaW4sbWF4KS4KKyAqLworI2RlZmluZSBFRkFCX0lOU0VSVF9GSUVMRF9OQVRJVkUoIG1pbiwgbWF4LCBmaWVsZCwgdmFsdWUgKQlcCisJRUZBQl9JTlNFUlRfTkFUSVZFICggbWluLCBtYXgsIEVGQUJfTE9XX0JJVCAoIGZpZWxkICksCVwKKwkJCSAgICAgRUZBQl9ISUdIX0JJVCAoIGZpZWxkICksIHZhbHVlICkKKworLyoqCisgKiBDb25zdHJ1Y3QgYml0IGZpZWxkCisgKgorICogQ3JlYXRlcyB0aGUgcG9ydGlvbiBvZiB0aGUgbmFtZWQgYml0IGZpZWxkcyB0aGF0IGxpZSB3aXRoaW4gdGhlCisgKiByYW5nZSBbbWluLG1heCkuCisgKi8KKyNkZWZpbmUgRUZBQl9JTlNFUlRfRklFTERTX05BVElWRSggbWluLCBtYXgsCQkJCVwKKwkJCQkgICBmaWVsZDEsIHZhbHVlMSwJCQlcCisJCQkJICAgZmllbGQyLCB2YWx1ZTIsCQkJXAorCQkJCSAgIGZpZWxkMywgdmFsdWUzLAkJCVwKKwkJCQkgICBmaWVsZDQsIHZhbHVlNCwJCQlcCisJCQkJICAgZmllbGQ1LCB2YWx1ZTUsCQkJXAorCQkJCSAgIGZpZWxkNiwgdmFsdWU2LAkJCVwKKwkJCQkgICBmaWVsZDcsIHZhbHVlNywJCQlcCisJCQkJICAgZmllbGQ4LCB2YWx1ZTgsCQkJXAorCQkJCSAgIGZpZWxkOSwgdmFsdWU5LAkJCVwKKwkJCQkgICBmaWVsZDEwLCB2YWx1ZTEwICkJCQlcCisJKCBFRkFCX0lOU0VSVF9GSUVMRF9OQVRJVkUgKCBtaW4sIG1heCwgZmllbGQxLCB2YWx1ZTEgKSB8CVwKKwkgIEVGQUJfSU5TRVJUX0ZJRUxEX05BVElWRSAoIG1pbiwgbWF4LCBmaWVsZDIsIHZhbHVlMiApIHwJXAorCSAgRUZBQl9JTlNFUlRfRklFTERfTkFUSVZFICggbWluLCBtYXgsIGZpZWxkMywgdmFsdWUzICkgfAlcCisJICBFRkFCX0lOU0VSVF9GSUVMRF9OQVRJVkUgKCBtaW4sIG1heCwgZmllbGQ0LCB2YWx1ZTQgKSB8CVwKKwkgIEVGQUJfSU5TRVJUX0ZJRUxEX05BVElWRSAoIG1pbiwgbWF4LCBmaWVsZDUsIHZhbHVlNSApIHwJXAorCSAgRUZBQl9JTlNFUlRfRklFTERfTkFUSVZFICggbWluLCBtYXgsIGZpZWxkNiwgdmFsdWU2ICkgfAlcCisJICBFRkFCX0lOU0VSVF9GSUVMRF9OQVRJVkUgKCBtaW4sIG1heCwgZmllbGQ3LCB2YWx1ZTcgKSB8CVwKKwkgIEVGQUJfSU5TRVJUX0ZJRUxEX05BVElWRSAoIG1pbiwgbWF4LCBmaWVsZDgsIHZhbHVlOCApIHwJXAorCSAgRUZBQl9JTlNFUlRfRklFTERfTkFUSVZFICggbWluLCBtYXgsIGZpZWxkOSwgdmFsdWU5ICkgfAlcCisJICBFRkFCX0lOU0VSVF9GSUVMRF9OQVRJVkUgKCBtaW4sIG1heCwgZmllbGQxMCwgdmFsdWUxMCApICkKKworI2RlZmluZSBFRkFCX0lOU0VSVF9GSUVMRFM2NCggLi4uICkJCQkJCVwKKwljcHVfdG9fbGU2NCAoIEVGQUJfSU5TRVJUX0ZJRUxEU19OQVRJVkUgKCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBFRkFCX0lOU0VSVF9GSUVMRFMzMiggLi4uICkJCQkJCVwKKwljcHVfdG9fbGUzMiAoIEVGQUJfSU5TRVJUX0ZJRUxEU19OQVRJVkUgKCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBFRkFCX1BPUFVMQVRFX09XT1JENjQoIG93b3JkLCAuLi4gKSBkbyB7CQkJXAorCShvd29yZCkudTY0WzBdID0gRUZBQl9JTlNFUlRfRklFTERTNjQgKCAgIDAsICA2MywgX19WQV9BUkdTX18gKTtcCisJKG93b3JkKS51NjRbMV0gPSBFRkFCX0lOU0VSVF9GSUVMRFM2NCAoICA2NCwgMTI3LCBfX1ZBX0FSR1NfXyApO1wKKwl9IHdoaWxlICggMCApCisKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9RV09SRDY0KCBxd29yZCwgLi4uICkgZG8gewkJCVwKKwkocXdvcmQpLnU2NFswXSA9IEVGQUJfSU5TRVJUX0ZJRUxEUzY0ICggICAwLCAgNjMsIF9fVkFfQVJHU19fICk7XAorCX0gd2hpbGUgKCAwICkKKworI2RlZmluZSBFRkFCX1BPUFVMQVRFX09XT1JEMzIoIG93b3JkLCAuLi4gKSBkbyB7CQkJXAorCShvd29yZCkudTMyWzBdID0gRUZBQl9JTlNFUlRfRklFTERTMzIgKCAgIDAsICAzMSwgX19WQV9BUkdTX18gKTtcCisJKG93b3JkKS51MzJbMV0gPSBFRkFCX0lOU0VSVF9GSUVMRFMzMiAoICAzMiwgIDYzLCBfX1ZBX0FSR1NfXyApO1wKKwkob3dvcmQpLnUzMlsyXSA9IEVGQUJfSU5TRVJUX0ZJRUxEUzMyICggIDY0LCAgOTUsIF9fVkFfQVJHU19fICk7XAorCShvd29yZCkudTMyWzNdID0gRUZBQl9JTlNFUlRfRklFTERTMzIgKCAgOTYsIDEyNywgX19WQV9BUkdTX18gKTtcCisJfSB3aGlsZSAoIDAgKQorCisjZGVmaW5lIEVGQUJfUE9QVUxBVEVfUVdPUkQzMiggcXdvcmQsIC4uLiApIGRvIHsJCQlcCisJKHF3b3JkKS51MzJbMF0gPSBFRkFCX0lOU0VSVF9GSUVMRFMzMiAoICAgMCwgIDMxLCBfX1ZBX0FSR1NfXyApO1wKKwkocXdvcmQpLnUzMlsxXSA9IEVGQUJfSU5TRVJUX0ZJRUxEUzMyICggIDMyLCAgNjMsIF9fVkFfQVJHU19fICk7XAorCX0gd2hpbGUgKCAwICkKKworI2RlZmluZSBFRkFCX1BPUFVMQVRFX0RXT1JEKCBkd29yZCwgLi4uICkgZG8gewkJCQlcCisJKGR3b3JkKS51MzJbMF0gPSBFRkFCX0lOU0VSVF9GSUVMRFMzMiAoICAgMCwgIDMxLCBfX1ZBX0FSR1NfXyApO1wKKwl9IHdoaWxlICggMCApCisKKyNpZiAoIEJJVFNfUEVSX0xPTkcgPT0gNjQgKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX09XT1JEIEVGQUJfUE9QVUxBVEVfT1dPUkQ2NAorI2RlZmluZSBFRkFCX1BPUFVMQVRFX1FXT1JEIEVGQUJfUE9QVUxBVEVfUVdPUkQ2NAorI2Vsc2UKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9PV09SRCBFRkFCX1BPUFVMQVRFX09XT1JEMzIKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9RV09SRCBFRkFCX1BPUFVMQVRFX1FXT1JEMzIKKyNlbmRpZgorCisvKiBQb3B1bGF0ZSBhbiBvY3R3b3JkIGZpZWxkIHdpdGggdmFyaW91cyBudW1iZXJzIG9mIGFyZ3VtZW50cyAqLworI2RlZmluZSBFRkFCX1BPUFVMQVRFX09XT1JEXzEwIEVGQUJfUE9QVUxBVEVfT1dPUkQKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9PV09SRF85KCBvd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfT1dPUkRfMTAgKCBvd29yZCwgRUZBQl9EVU1NWV9GSUVMRCwgMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX09XT1JEXzgoIG93b3JkLCAuLi4gKSBcCisJRUZBQl9QT1BVTEFURV9PV09SRF85ICggb3dvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9PV09SRF83KCBvd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfT1dPUkRfOCAoIG93b3JkLCBFRkFCX0RVTU1ZX0ZJRUxELCAwLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEVGQUJfUE9QVUxBVEVfT1dPUkRfNiggb3dvcmQsIC4uLiApIFwKKwlFRkFCX1BPUFVMQVRFX09XT1JEXzcgKCBvd29yZCwgRUZBQl9EVU1NWV9GSUVMRCwgMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX09XT1JEXzUoIG93b3JkLCAuLi4gKSBcCisJRUZBQl9QT1BVTEFURV9PV09SRF82ICggb3dvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9PV09SRF80KCBvd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfT1dPUkRfNSAoIG93b3JkLCBFRkFCX0RVTU1ZX0ZJRUxELCAwLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEVGQUJfUE9QVUxBVEVfT1dPUkRfMyggb3dvcmQsIC4uLiApIFwKKwlFRkFCX1BPUFVMQVRFX09XT1JEXzQgKCBvd29yZCwgRUZBQl9EVU1NWV9GSUVMRCwgMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX09XT1JEXzIoIG93b3JkLCAuLi4gKSBcCisJRUZBQl9QT1BVTEFURV9PV09SRF8zICggb3dvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9PV09SRF8xKCBvd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfT1dPUkRfMiAoIG93b3JkLCBFRkFCX0RVTU1ZX0ZJRUxELCAwLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEVGQUJfWkVST19PV09SRCggb3dvcmQgKSBcCisJRUZBQl9QT1BVTEFURV9PV09SRF8xICggb3dvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAgKQorI2RlZmluZSBFRkFCX1NFVF9PV09SRCggb3dvcmQgKSBcCisJRUZBQl9QT1BVTEFURV9PV09SRF80ICggb3dvcmQsIFwKKwkJCQlFRkFCX0RXT1JEXzAsIDB4ZmZmZmZmZmYsIFwKKwkJCQlFRkFCX0RXT1JEXzEsIDB4ZmZmZmZmZmYsIFwKKwkJCQlFRkFCX0RXT1JEXzIsIDB4ZmZmZmZmZmYsIFwKKwkJCQlFRkFCX0RXT1JEXzMsIDB4ZmZmZmZmZmYgKQorCisvKiBQb3B1bGF0ZSBhIHF1YWR3b3JkIGZpZWxkIHdpdGggdmFyaW91cyBudW1iZXJzIG9mIGFyZ3VtZW50cyAqLworI2RlZmluZSBFRkFCX1BPUFVMQVRFX1FXT1JEXzEwIEVGQUJfUE9QVUxBVEVfUVdPUkQKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9RV09SRF85KCBxd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfUVdPUkRfMTAgKCBxd29yZCwgRUZBQl9EVU1NWV9GSUVMRCwgMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX1FXT1JEXzgoIHF3b3JkLCAuLi4gKSBcCisJRUZBQl9QT1BVTEFURV9RV09SRF85ICggcXdvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9RV09SRF83KCBxd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfUVdPUkRfOCAoIHF3b3JkLCBFRkFCX0RVTU1ZX0ZJRUxELCAwLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEVGQUJfUE9QVUxBVEVfUVdPUkRfNiggcXdvcmQsIC4uLiApIFwKKwlFRkFCX1BPUFVMQVRFX1FXT1JEXzcgKCBxd29yZCwgRUZBQl9EVU1NWV9GSUVMRCwgMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX1FXT1JEXzUoIHF3b3JkLCAuLi4gKSBcCisJRUZBQl9QT1BVTEFURV9RV09SRF82ICggcXdvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9RV09SRF80KCBxd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfUVdPUkRfNSAoIHF3b3JkLCBFRkFCX0RVTU1ZX0ZJRUxELCAwLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEVGQUJfUE9QVUxBVEVfUVdPUkRfMyggcXdvcmQsIC4uLiApIFwKKwlFRkFCX1BPUFVMQVRFX1FXT1JEXzQgKCBxd29yZCwgRUZBQl9EVU1NWV9GSUVMRCwgMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX1FXT1JEXzIoIHF3b3JkLCAuLi4gKSBcCisJRUZBQl9QT1BVTEFURV9RV09SRF8zICggcXdvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9RV09SRF8xKCBxd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfUVdPUkRfMiAoIHF3b3JkLCBFRkFCX0RVTU1ZX0ZJRUxELCAwLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEVGQUJfWkVST19RV09SRCggcXdvcmQgKSBcCisJRUZBQl9QT1BVTEFURV9RV09SRF8xICggcXdvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAgKQorI2RlZmluZSBFRkFCX1NFVF9RV09SRCggcXdvcmQgKSBcCisJRUZBQl9QT1BVTEFURV9RV09SRF8yICggcXdvcmQsIFwKKwkJCQlFRkFCX0RXT1JEXzAsIDB4ZmZmZmZmZmYsIFwKKwkJCQlFRkFCX0RXT1JEXzEsIDB4ZmZmZmZmZmYgKQorCisvKiBQb3B1bGF0ZSBhIGR3b3JkIGZpZWxkIHdpdGggdmFyaW91cyBudW1iZXJzIG9mIGFyZ3VtZW50cyAqLworI2RlZmluZSBFRkFCX1BPUFVMQVRFX0RXT1JEXzEwIEVGQUJfUE9QVUxBVEVfRFdPUkQKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9EV09SRF85KCBkd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfRFdPUkRfMTAgKCBkd29yZCwgRUZBQl9EVU1NWV9GSUVMRCwgMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX0RXT1JEXzgoIGR3b3JkLCAuLi4gKSBcCisJRUZBQl9QT1BVTEFURV9EV09SRF85ICggZHdvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9EV09SRF83KCBkd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfRFdPUkRfOCAoIGR3b3JkLCBFRkFCX0RVTU1ZX0ZJRUxELCAwLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEVGQUJfUE9QVUxBVEVfRFdPUkRfNiggZHdvcmQsIC4uLiApIFwKKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzcgKCBkd29yZCwgRUZBQl9EVU1NWV9GSUVMRCwgMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX0RXT1JEXzUoIGR3b3JkLCAuLi4gKSBcCisJRUZBQl9QT1BVTEFURV9EV09SRF82ICggZHdvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9EV09SRF80KCBkd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfRFdPUkRfNSAoIGR3b3JkLCBFRkFCX0RVTU1ZX0ZJRUxELCAwLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEVGQUJfUE9QVUxBVEVfRFdPUkRfMyggZHdvcmQsIC4uLiApIFwKKwlFRkFCX1BPUFVMQVRFX0RXT1JEXzQgKCBkd29yZCwgRUZBQl9EVU1NWV9GSUVMRCwgMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBFRkFCX1BPUFVMQVRFX0RXT1JEXzIoIGR3b3JkLCAuLi4gKSBcCisJRUZBQl9QT1BVTEFURV9EV09SRF8zICggZHdvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRUZBQl9QT1BVTEFURV9EV09SRF8xKCBkd29yZCwgLi4uICkgXAorCUVGQUJfUE9QVUxBVEVfRFdPUkRfMiAoIGR3b3JkLCBFRkFCX0RVTU1ZX0ZJRUxELCAwLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEVGQUJfWkVST19EV09SRCggZHdvcmQgKSBcCisJRUZBQl9QT1BVTEFURV9EV09SRF8xICggZHdvcmQsIEVGQUJfRFVNTVlfRklFTEQsIDAgKQorI2RlZmluZSBFRkFCX1NFVF9EV09SRCggZHdvcmQgKSBcCisJRUZBQl9QT1BVTEFURV9EV09SRF8xICggZHdvcmQsIEVGQUJfRFdPUkRfMCwgMHhmZmZmZmZmZiApCisKKy8qCisgKiBNb2RpZnkgYSBuYW1lZCBmaWVsZCB3aXRoaW4gYW4gYWxyZWFkeS1wb3B1bGF0ZWQgc3RydWN0dXJlLiAgVXNlZAorICogZm9yIHJlYWQtbW9kaWZ5LXdyaXRlIG9wZXJhdGlvbnMuCisgKgorICovCisKKyNkZWZpbmUgRUZBQl9JTlNFUlRfRklFTEQ2NCggLi4uICkJCQkJCVwKKwljcHVfdG9fbGU2NCAoIEVGQUJfSU5TRVJUX0ZJRUxEX05BVElWRSAoIF9fVkFfQVJHU19fICkgKQorCisjZGVmaW5lIEVGQUJfSU5TRVJUX0ZJRUxEMzIoIC4uLiApCQkJCQlcCisJY3B1X3RvX2xlMzIgKCBFRkFCX0lOU0VSVF9GSUVMRF9OQVRJVkUgKCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBFRkFCX0lOUExBQ0VfTUFTSzY0KCBtaW4sIG1heCwgZmllbGQgKQkJCQlcCisJRUZBQl9JTlNFUlRfRklFTEQ2NCAoIG1pbiwgbWF4LCBmaWVsZCwgRUZBQl9NQVNLNjQgKCBmaWVsZCApICkKKworI2RlZmluZSBFRkFCX0lOUExBQ0VfTUFTSzMyKCBtaW4sIG1heCwgZmllbGQgKQkJCQlcCisJRUZBQl9JTlNFUlRfRklFTEQzMiAoIG1pbiwgbWF4LCBmaWVsZCwgRUZBQl9NQVNLMzIgKCBmaWVsZCApICkKKworI2RlZmluZSBFRkFCX1NFVF9PV09SRF9GSUVMRDY0KCBvd29yZCwgZmllbGQsIHZhbHVlICkgZG8gewkJICAgICAgXAorCShvd29yZCkudTY0WzBdID0gKCAoIChvd29yZCkudTY0WzBdIAkJCQkgICAgICBcCisJCQkgICAgICYgfkVGQUJfSU5QTEFDRV9NQVNLNjQgKCAgMCwgIDYzLCBmaWVsZCApICkgICAgICBcCisJCQkgICB8IEVGQUJfSU5TRVJUX0ZJRUxENjQgKCAgMCwgIDYzLCBmaWVsZCwgdmFsdWUgKSApOyBcCisJKG93b3JkKS51NjRbMV0gPSAoICggKG93b3JkKS51NjRbMV0gCQkJCSAgICAgIFwKKwkJCSAgICAgJiB+RUZBQl9JTlBMQUNFX01BU0s2NCAoIDY0LCAxMjcsIGZpZWxkICkgKSAgICAgIFwKKwkJCSAgIHwgRUZBQl9JTlNFUlRfRklFTEQ2NCAoIDY0LCAxMjcsIGZpZWxkLCB2YWx1ZSApICk7IFwKKwl9IHdoaWxlICggMCApCisKKyNkZWZpbmUgRUZBQl9TRVRfUVdPUkRfRklFTEQ2NCggcXdvcmQsIGZpZWxkLCB2YWx1ZSApIGRvIHsJCSAgICAgIFwKKwkocXdvcmQpLnU2NFswXSA9ICggKCAocXdvcmQpLnU2NFswXSAJCQkJICAgICAgXAorCQkJICAgICAmIH5FRkFCX0lOUExBQ0VfTUFTSzY0ICggIDAsICA2MywgZmllbGQgKSApICAgICAgXAorCQkJICAgfCBFRkFCX0lOU0VSVF9GSUVMRDY0ICggIDAsICA2MywgZmllbGQsIHZhbHVlICkgKTsgXAorCX0gd2hpbGUgKCAwICkKKworI2RlZmluZSBFRkFCX1NFVF9PV09SRF9GSUVMRDMyKCBvd29yZCwgZmllbGQsIHZhbHVlICkgZG8gewkJICAgICAgXAorCShvd29yZCkudTMyWzBdID0gKCAoIChvd29yZCkudTMyWzBdIAkJCQkgICAgICBcCisJCQkgICAgICYgfkVGQUJfSU5QTEFDRV9NQVNLMzIgKCAgMCwgIDMxLCBmaWVsZCApICkgICAgICBcCisJCQkgICB8IEVGQUJfSU5TRVJUX0ZJRUxEMzIgKCAgMCwgIDMxLCBmaWVsZCwgdmFsdWUgKSApOyBcCisJKG93b3JkKS51MzJbMV0gPSAoICggKG93b3JkKS51MzJbMV0gCQkJCSAgICAgIFwKKwkJCSAgICAgJiB+RUZBQl9JTlBMQUNFX01BU0szMiAoIDMyLCAgNjMsIGZpZWxkICkgKSAgICAgIFwKKwkJCSAgIHwgRUZBQl9JTlNFUlRfRklFTEQzMiAoIDMyLCAgNjMsIGZpZWxkLCB2YWx1ZSApICk7IFwKKwkob3dvcmQpLnUzMlsyXSA9ICggKCAob3dvcmQpLnUzMlsyXSAJCQkJICAgICAgXAorCQkJICAgICAmIH5FRkFCX0lOUExBQ0VfTUFTSzMyICggNjQsICA5NSwgZmllbGQgKSApICAgICAgXAorCQkJICAgfCBFRkFCX0lOU0VSVF9GSUVMRDMyICggNjQsICA5NSwgZmllbGQsIHZhbHVlICkgKTsgXAorCShvd29yZCkudTMyWzNdID0gKCAoIChvd29yZCkudTMyWzNdIAkJCQkgICAgICBcCisJCQkgICAgICYgfkVGQUJfSU5QTEFDRV9NQVNLMzIgKCA5NiwgMTI3LCBmaWVsZCApICkgICAgICBcCisJCQkgICB8IEVGQUJfSU5TRVJUX0ZJRUxEMzIgKCA5NiwgMTI3LCBmaWVsZCwgdmFsdWUgKSApOyBcCisJfSB3aGlsZSAoIDAgKQorCisjZGVmaW5lIEVGQUJfU0VUX1FXT1JEX0ZJRUxEMzIoIHF3b3JkLCBmaWVsZCwgdmFsdWUgKSBkbyB7CQkgICAgICBcCisJKHF3b3JkKS51MzJbMF0gPSAoICggKHF3b3JkKS51MzJbMF0gCQkJCSAgICAgIFwKKwkJCSAgICAgJiB+RUZBQl9JTlBMQUNFX01BU0szMiAoICAwLCAgMzEsIGZpZWxkICkgKSAgICAgIFwKKwkJCSAgIHwgRUZBQl9JTlNFUlRfRklFTEQzMiAoICAwLCAgMzEsIGZpZWxkLCB2YWx1ZSApICk7IFwKKwkocXdvcmQpLnUzMlsxXSA9ICggKCAocXdvcmQpLnUzMlsxXSAJCQkJICAgICAgXAorCQkJICAgICAmIH5FRkFCX0lOUExBQ0VfTUFTSzMyICggMzIsICA2MywgZmllbGQgKSApICAgICAgXAorCQkJICAgfCBFRkFCX0lOU0VSVF9GSUVMRDMyICggMzIsICA2MywgZmllbGQsIHZhbHVlICkgKTsgXAorCX0gd2hpbGUgKCAwICkKKworI2RlZmluZSBFRkFCX1NFVF9EV09SRF9GSUVMRCggZHdvcmQsIGZpZWxkLCB2YWx1ZSApIGRvIHsJCSAgICAgIFwKKwkoZHdvcmQpLnUzMlswXSA9ICggKCAoZHdvcmQpLnUzMlswXSAJCQkJICAgICAgXAorCQkJICAgICAmIH5FRkFCX0lOUExBQ0VfTUFTSzMyICggIDAsICAzMSwgZmllbGQgKSApICAgICAgXAorCQkJICAgfCBFRkFCX0lOU0VSVF9GSUVMRDMyICggIDAsICAzMSwgZmllbGQsIHZhbHVlICkgKTsgXAorCX0gd2hpbGUgKCAwICkKKworI2lmICggQklUU19QRVJfTE9ORyA9PSA2NCApCisjZGVmaW5lIEVGQUJfU0VUX09XT1JEX0ZJRUxEIEVGQUJfU0VUX09XT1JEX0ZJRUxENjQKKyNkZWZpbmUgRUZBQl9TRVRfUVdPUkRfRklFTEQgRUZBQl9TRVRfUVdPUkRfRklFTEQ2NAorI2Vsc2UKKyNkZWZpbmUgRUZBQl9TRVRfT1dPUkRfRklFTEQgRUZBQl9TRVRfT1dPUkRfRklFTEQzMgorI2RlZmluZSBFRkFCX1NFVF9RV09SRF9GSUVMRCBFRkFCX1NFVF9RV09SRF9GSUVMRDMyCisjZW5kaWYKKworLyogVXNlZCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzaGlmdCByYW5nZSBleGNlZWRpbmcgd2lkdGgKKyAqIG9mIHRoZSBkYXRhIHR5cGVzIHdoZW4gZG1hX2FkZHJfdCBpcyBvbmx5IDMyIGJpdHMgd2lkZS4KKyAqLworI2RlZmluZSBETUFfQUREUl9UX1dJRFRICSggOCAqIHNpemVvZiAoIGRtYV9hZGRyX3QgKSApCisjZGVmaW5lIEVGQUJfRE1BX1RZUEVfV0lEVEgoIHdpZHRoICkgXAorCSggKCAod2lkdGgpIDwgRE1BX0FERFJfVF9XSURUSCApID8gKHdpZHRoKSA6IERNQV9BRERSX1RfV0lEVEggKQorI2RlZmluZSBFRkFCX0RNQV9NQVhfTUFTSyAoICggRE1BX0FERFJfVF9XSURUSCA9PSA2NCApID8gXAorCQkJICAgIH4oICggdWludDY0X3QgKSAwICkgOiB+KCAoIHVpbnQzMl90ICkgMCApICkKKyNkZWZpbmUgRUZBQl9ETUFfTUFTSyhtYXNrKSAoIChtYXNrKSAmIEVGQUJfRE1BX01BWF9NQVNLICkKKworI2VuZGlmIC8qIEVGQUJfQklURklFTERfSCAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZXRoZXJmYWJyaWNfbmljLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ldGhlcmZhYnJpY19uaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk0ZDgwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZXRoZXJmYWJyaWNfbmljLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEV0aGVyYm9vdCBkcml2ZXIgZm9yIExldmVsIDUgRXRoZXJmYWJyaWMgbmV0d29yayBjYXJkcworICoKKyAqIFdyaXR0ZW4gYnkgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+CisgKgorICogQ29weXJpZ2h0IEZlbiBTeXN0ZW1zIEx0ZC4gMjAwNQorICogQ29weXJpZ2h0IExldmVsIDUgTmV0d29ya3MgSW5jLiAyMDA1CisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5CisgKiByZWZlcmVuY2UuICBEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlcgorICogdGhlIEdQTCBhbmQgbXVzdCByZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZQorICogbm90aWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTF9BTlkgKTsKKworI2lmbmRlZiBFRkFCX05JQ19ICisjZGVmaW5lICBFRkFCX05JQ19ICisjaW5jbHVkZSA8Z3B4ZS9iaXRiYXNoLmg+CisjaW5jbHVkZSA8Z3B4ZS9pMmMuaD4KKyNpbmNsdWRlIDxncHhlL3NwaS5oPgorI2luY2x1ZGUgPGdweGUvbnZvLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29uc3RhbnRzIGFuZCBtYWNyb3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogQm9hcmQgSURzLiBFYXJseSBib2FyZHMgaGF2ZSBubyBib2FyZF90eXBlLCAoZS5nLiBFRjEwMDIgYW5kIDQwMS80MDMpCisgKiBCdXQgbmV3ZXIgYm9hcmRzIGFyZSBnZXR0aW5nIGJpZ2dlci4uLgorICovCit0eXBlZGVmIGVudW0geworCUVGQUJfQk9BUkRfSU5WQUxJRCA9IDAsIC8qIEVhcmx5IGJvYXJkcyBkbyBub3QgaGF2ZSBib2FyZCByZXYuIGluZm8uICovCisJRUZBQl9CT0FSRF9TRkU0MDAxID0gMSwKKwlFRkFCX0JPQVJEX1NGRTQwMDIgPSAyLAorCUVGQUJfQk9BUkRfU0ZFNDAwMyA9IDMsCisJLyogSW5zZXJ0IG5ldyB0eXBlcyBiZWZvcmUgaGVyZSAqLworCUVGQUJfQk9BUkRfTUFYCit9IGVmYWJfYm9hcmRfdHlwZTsKKworLyogUEhZIHR5cGVzLiAqLwordHlwZWRlZiBlbnVtIHsKKwlQSFlfVFlQRV9BVVRPID0gMCwgLyogb24gZGV2ZWxvcG1lbnQgYm9hcmQgZGV0ZWN0IGJldHdlZW4gQ1g0ICYgYWxhc2thICovCisJUEhZX1RZUEVfQ1g0X1JUTVIgPSAxLAorCVBIWV9UWVBFXzFHSUdfQUxBU0tBID0gMiwKKwlQSFlfVFlQRV8xMFhQUkVTUyA9IDMsCisJUEhZX1RZUEVfWEZQID0gNCwKKwlQSFlfVFlQRV9DWDQgPSA1LAorCVBIWV9UWVBFX1BNODM1OCA9IDYsCit9IHBoeV90eXBlX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEhhcmR3YXJlIGRhdGEgc3RydWN0dXJlcyBhbmQgc2l6aW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2RlZmluZSBkbWFfYWRkcl90IHVuc2lnbmVkIGxvbmcKK3R5cGVkZWYgZWZhYl9xd29yZF90IGZhbGNvbl9yeF9kZXNjX3Q7Cit0eXBlZGVmIGVmYWJfcXdvcmRfdCBmYWxjb25fdHhfZGVzY190OwordHlwZWRlZiBlZmFiX3F3b3JkX3QgZmFsY29uX2V2ZW50X3Q7CisKKyNkZWZpbmUgRUZBQl9CVUZfQUxJR04JCTQwOTYKKyNkZWZpbmUgRUZBQl9SWERfU0laRQkJNTEyCisjZGVmaW5lIEVGQUJfVFhEX1NJWkUJCTUxMgorI2RlZmluZSBFRkFCX0VWUV9TSVpFCQk1MTIKKworI2RlZmluZSBFRkFCX05VTV9SWF9ERVNDICAgICAgICAxNgorI2RlZmluZSBFRkFCX1JYX0JVRl9TSVpFCTE2MDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGF0YSBzdHJ1Y3R1cmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RydWN0IGVmYWJfbmljOworCisvKiBBIGJ1ZmZlciB0YWJsZSBhbGxvY2F0aW9uIGJhY2tpbmcgYSB0eCBkbWEsIHJ4IGRtYSBvciBldmVudHEgKi8KK3N0cnVjdCBlZmFiX3NwZWNpYWxfYnVmZmVyIHsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCWludCBpZDsKK307CisKKy8qIEEgVFggcXVldWUgKi8KK3N0cnVjdCBlZmFiX3R4X3F1ZXVlIHsKKwkvKiBUaGUgaGFyZHdhcmUgcmluZyAqLworCWZhbGNvbl90eF9kZXNjX3QgKnJpbmc7CisKKwkvKiBUaGUgc29mdHdhcmUgcmluZyBzdG9yaW5nIGlvX2J1ZmZlcnMuICovCisJc3RydWN0IGlvX2J1ZmZlciAqYnVmW0VGQUJfVFhEX1NJWkVdOworCisJLyogVGhlIGJ1ZmZlciB0YWJsZSByZXNlcnZhdGlvbiBwdXNoZWQgdG8gaGFyZHdhcmUgKi8KKwlzdHJ1Y3QgZWZhYl9zcGVjaWFsX2J1ZmZlciBlbnRyeTsKKworCS8qIFNvZnR3YXJlIGRlc2NyaXB0b3Igd3JpdGUgcHRyICovCisJdW5zaWduZWQgaW50IHdyaXRlX3B0cjsKKworCS8qIEhhcmR3YXJlIGRlc2NyaXB0b3IgcmVhZCBwdHIgKi8KKwl1bnNpZ25lZCBpbnQgcmVhZF9wdHI7Cit9OworCisvKiBBbiBSWCBxdWV1ZSAqLworc3RydWN0IGVmYWJfcnhfcXVldWUgeworCS8qIFRoZSBoYXJkd2FyZSByaW5nICovCisJZmFsY29uX3J4X2Rlc2NfdCAqcmluZzsKKworCS8qIFRoZSBzb2Z0d2FyZSByaW5nIHN0b3JpbmcgaW9fYnVmZmVycyAqLworCXN0cnVjdCBpb19idWZmZXIgKmJ1ZltFRkFCX05VTV9SWF9ERVNDXTsKKworCS8qIFRoZSBidWZmZXIgdGFibGUgcmVzZXJ2YXRpb24gcHVzaGVkIHRvIGhhcmR3YXJlICovCisJc3RydWN0IGVmYWJfc3BlY2lhbF9idWZmZXIgZW50cnk7CisKKwkvKiBEZXNjcmlwdG9yIHdyaXRlIHB0ciwgaW50byBib3RoIHRoZSBoYXJkd2FyZSBhbmQgc29mdHdhcmUgcmluZ3MgKi8KKwl1bnNpZ25lZCBpbnQgd3JpdGVfcHRyOworCisJLyogSGFyZHdhcmUgY29tcGxldGlvbiBwdHIgKi8KKwl1bnNpZ25lZCBpbnQgcmVhZF9wdHI7Cit9OworCisvKiBBbiBldmVudCBxdWV1ZSAqLworc3RydWN0IGVmYWJfZXZfcXVldWUgeworCS8qIFRoZSBoYXJkd2FyZSByaW5nIHRvIHB1c2ggdG8gaGFyZHdhcmUuCisJICogTXVzdCBiZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHN0cnVjdHVyZSAqLworCWZhbGNvbl9ldmVudF90ICpyaW5nOworCisJLyogVGhlIGJ1ZmZlciB0YWJsZSByZXNlcnZhdGlvbiBwdXNoZWQgdG8gaGFyZHdhcmUgKi8KKwlzdHJ1Y3QgZWZhYl9zcGVjaWFsX2J1ZmZlciBlbnRyeTsKKworCS8qIFBvaW50ZXJzIGludG8gdGhlIHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgcmVhZF9wdHI7Cit9OworCitzdHJ1Y3QgZWZhYl9tYWNfb3BlcmF0aW9ucyB7CisJaW50ICggKiBpbml0ICkgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKTsKK307CisKK3N0cnVjdCBlZmFiX3BoeV9vcGVyYXRpb25zIHsKKwlpbnQgKCAqIGluaXQgKSAoIHN0cnVjdCBlZmFiX25pYyAqZWZhYiApOworCXVuc2lnbmVkIGludCBtbWRzOworfTsKKworc3RydWN0IGVmYWJfYm9hcmRfb3BlcmF0aW9ucyB7CisJaW50ICggKiBpbml0ICkgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKTsKKwl2b2lkICggKiBmaW5pICkgKCBzdHJ1Y3QgZWZhYl9uaWMgKmVmYWIgKTsKK307CisKK3N0cnVjdCBlZmFiX25pYyB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlpbnQgcGNpX3JldmlzaW9uOworCWludCBpc19hc2ljOworCisJLyogSTJDIGJpdC1iYXNoZWQgaW50ZXJmYWNlICovCisJc3RydWN0IGkyY19iaXRfYmFzaGVyIGkyY19iYjsKKworCS8qKiBTUEkgYnVzIGFuZCBkZXZpY2VzLCBhbmQgdGhlIHVzZXIgdmlzaWJsZSBOVk8gYXJlYSAqLworCXN0cnVjdCBzcGlfYnVzIHNwaV9idXM7CisJc3RydWN0IHNwaV9kZXZpY2Ugc3BpX2ZsYXNoOworCXN0cnVjdCBzcGlfZGV2aWNlIHNwaV9lZXByb207CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKKwlzdHJ1Y3QgbnZvX2Jsb2NrIG52bzsKKworCS8qKiBCb2FyZCwgTUFDLCBhbmQgUEhZIG9wZXJhdGlvbnMgdGFibGVzICovCisJc3RydWN0IGVmYWJfYm9hcmRfb3BlcmF0aW9ucyAqYm9hcmRfb3A7CisJc3RydWN0IGVmYWJfbWFjX29wZXJhdGlvbnMgKm1hY19vcDsKKwlzdHJ1Y3QgZWZhYl9waHlfb3BlcmF0aW9ucyAqcGh5X29wOworCisJLyogUEhZIGFuZCBib2FyZCB0eXBlcyAqLworCWludCBwaHlfYWRkcjsKKwlpbnQgcGh5X3R5cGU7CisJaW50IHBoeV8xMGc7CisJaW50IGJvYXJkX3R5cGU7CisKKwkvKiogTWVtb3J5IGFuZCBJTyBiYXNlICovCisJdm9pZCAqbWVtYmFzZTsKKwl1bnNpZ25lZCBpbnQgaW9iYXNlOworCisJLyogQnVmZmVyIHRhYmxlIGFsbG9jYXRpb24gaGVhZCAqLworCWludCBidWZmZXJfaGVhZDsKKworCS8qIFF1ZXVlcyAqLworCXN0cnVjdCBlZmFiX3J4X3F1ZXVlIHJ4X3F1ZXVlOworCXN0cnVjdCBlZmFiX3R4X3F1ZXVlIHR4X3F1ZXVlOworCXN0cnVjdCBlZmFiX2V2X3F1ZXVlIGV2X3F1ZXVlOworCisJLyoqIE1BQyBhZGRyZXNzICovCisJdWludDhfdCBtYWNfYWRkcltFVEhfQUxFTl07CisJLyoqIEdNSUkgbGluayBvcHRpb25zICovCisJdW5zaWduZWQgaW50IGxpbmtfb3B0aW9uczsKKwkvKiogTGluayBzdGF0dXMgKi8KKwlpbnQgbGlua191cDsKKworCS8qKiBJTlRfUkVHX0tFUiAqLworCWVmYWJfb3dvcmRfdCBpbnRfa2VyIF9fYXR0cmlidXRlX18gKCggYWxpZ25lZCAoIDE2ICkgKSk7Cit9OworI2VuZGlmIC8qIEVGQUJfTklDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ0ZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTAsMCArMSwxNDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgZm9yY2VkZXRoLmMgLS0gRXRoZXJib290IGRldmljZSBkcml2ZXIgZm9yIHRoZSBOVklESUEgbkZvcmNlIAorKgkJCW1lZGlhIGFjY2VzcyBjb250cm9sbGVycy4KKyoKKyogTm90ZTogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIExpbnV4IGRyaXZlciB0aGF0IHdhcyBiYXNlZCBvbgorKiAgICAgIGEgY2xlYW5yb29tIHJlaW1wbGVtZW50YXRpb24gd2hpY2ggd2FzIGJhc2VkIG9uIHJldmVyc2UKKyogICAgICBlbmdpbmVlcmVkIGRvY3VtZW50YXRpb24gd3JpdHRlbiBieSBDYXJsLURhbmllbCBIYWlsZmluZ2VyCisqICAgICAgYW5kIEFuZHJldyBkZSBRdWluY2V5LiBJdCdzIG5laXRoZXIgc3VwcG9ydGVkIG5vciBlbmRvcnNlZAorKiAgICAgIGJ5IE5WSURJQSBDb3JwLiBVc2UgYXQgeW91ciBvd24gcmlzay4KKyoKKyogICAgV3JpdHRlbiAyMDA0IGJ5IFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogICAgUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGJhc2VkIG9uOgorKgkJZm9yY2VkZXRoOiBFdGhlcm5ldCBkcml2ZXIgZm9yIE5WSURJQSBuRm9yY2UgbWVkaWEgYWNjZXNzIGNvbnRyb2xsZXJzOgorKgorKgkoQykgMjAwMyBNYW5mcmVkIFNwcmF1bAorKgkJU2VlIExpbnV4IERyaXZlciBmb3IgZnVsbCBpbmZvcm1hdGlvbgorKgkKKyoJTGludXggRHJpdmVyIFZlcnNpb24gMC4zMCwgMjUgU2VwIDIwMDQKKyoJTGludXggS2VybmVsIDIuNi4xMAorKiAKKyogCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyogICAgdjEuMAkwMS0zMS0yMDA0CXRpbWxlZ2dlCUluaXRpYWwgcG9ydCBvZiBMaW51eCBkcml2ZXIKKyogICAgdjEuMQkwMi0wMy0yMDA0CXRpbWxlZ2dlCUxhcmdlIENsZWFuIHVwLCBmaXJzdCByZWxlYXNlIAorKiAgICB2MS4yCTA1LTE0LTIwMDUJdGltbGVnZ2UJQWRkIExpbnV4IDAuMjIgdG8gLjAzMCBmZWF0dXJlcworKgorKiAgICBJbmRlbnQgT3B0aW9uczogaW5kZW50IC1rciAtaTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorLyogSW5jbHVkZSB0aW1lciBzdXBwb3J0IGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKyNpbmNsdWRlICJtaWkuaCIKKworI2RlZmluZSBkcnZfdmVyc2lvbiAidjEuMiIKKyNkZWZpbmUgZHJ2X2RhdGUgIjA1LTE0LTIwMDUiCisKKy8vI2RlZmluZSBURlRNX0RFQlVHCisjaWZkZWYgVEZUTV9ERUJVRworI2RlZmluZSBkcHJpbnRmKHgpIHByaW50ZiB4CisjZWxzZQorI2RlZmluZSBkcHJpbnRmKHgpCisjZW5kaWYKKworI2RlZmluZSBFVEhfREFUQV9MRU4gICAxNTAwCisKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBCQVNFOworLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMSAgICAgICAgICAgMHgwMWMzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yICAgICAgICAgICAweDAwNjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzQgICAgICAgICAgIDB4MDA4NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfNSAgICAgICAgICAgMHgwMDhjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zICAgICAgICAgICAweDAwZDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzcgICAgICAgICAgIDB4MDBkZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfNiAgICAgICAgICAgMHgwMGU2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF84ICAgICAgICAgICAweDAwNTYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzkgICAgICAgICAgIDB4MDA1NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTAgICAgICAgICAgMHgwMDM3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xMSAgICAgICAgICAweDAwMzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE1ICAgICAgICAgIDB4MDM3MworCisKKy8qCisgKiBIYXJkd2FyZSBhY2Nlc3M6CisgKi8KKworI2RlZmluZSBERVZfTkVFRF9MQVNUUEFDS0VUMQkweDAwMDEJLyogc2V0IExBU1RQQUNLRVQxIGluIHR4IGZsYWdzICovCisjZGVmaW5lIERFVl9JUlFNQVNLXzEJCTB4MDAwMgkvKiB1c2UgTlZSRUdfSVJRTUFTS19XQU5URURfMSBmb3IgaXJxIG1hc2sgKi8KKyNkZWZpbmUgREVWX0lSUU1BU0tfMgkJMHgwMDA0CS8qIHVzZSBOVlJFR19JUlFNQVNLX1dBTlRFRF8yIGZvciBpcnEgbWFzayAqLworI2RlZmluZSBERVZfTkVFRF9USU1FUklSUQkweDAwMDgJLyogc2V0IHRoZSB0aW1lciBpcnEgZmxhZyBpbiB0aGUgaXJxIG1hc2sgKi8KKyNkZWZpbmUgREVWX05FRURfTElOS1RJTUVSCTB4MDAxMAkvKiBwb2xsIGxpbmsgc2V0dGluZ3MuIFJlbGllcyBvbiB0aGUgdGltZXIgaXJxICovCisKK2VudW0geworCU52UmVnSXJxU3RhdHVzID0gMHgwMDAsCisjZGVmaW5lIE5WUkVHX0lSUVNUQVRfTUlJRVZFTlQJMDA0MAorI2RlZmluZSBOVlJFR19JUlFTVEFUX01BU0sJCTB4MWZmCisJTnZSZWdJcnFNYXNrID0gMHgwMDQsCisjZGVmaW5lIE5WUkVHX0lSUV9SWF9FUlJPUgkJMHgwMDAxCisjZGVmaW5lIE5WUkVHX0lSUV9SWAkJCTB4MDAwMgorI2RlZmluZSBOVlJFR19JUlFfUlhfTk9CVUYJCTB4MDAwNAorI2RlZmluZSBOVlJFR19JUlFfVFhfRVJSCQkweDAwMDgKKyNkZWZpbmUgTlZSRUdfSVJRX1RYMgkJCTB4MDAxMAorI2RlZmluZSBOVlJFR19JUlFfVElNRVIJCQkweDAwMjAKKyNkZWZpbmUgTlZSRUdfSVJRX0xJTksJCQkweDAwNDAKKyNkZWZpbmUgTlZSRUdfSVJRX1RYMQkJCTB4MDEwMAorI2RlZmluZSBOVlJFR19JUlFNQVNLX1dBTlRFRF8xCQkweDAwNWYKKyNkZWZpbmUgTlZSRUdfSVJRTUFTS19XQU5URURfMgkJMHgwMTQ3CisjZGVmaW5lIE5WUkVHX0lSUV9VTktOT1dOCQkofihOVlJFR19JUlFfUlhfRVJST1J8TlZSRUdfSVJRX1JYfE5WUkVHX0lSUV9SWF9OT0JVRnxOVlJFR19JUlFfVFhfRVJSfE5WUkVHX0lSUV9UWDJ8TlZSRUdfSVJRX1RJTUVSfE5WUkVHX0lSUV9MSU5LfE5WUkVHX0lSUV9UWDEpKQorCisJTnZSZWdVbmtub3duU2V0dXBSZWc2ID0gMHgwMDgsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQNl9WQUwJCTMKKworLyoKKyAqIE5WUkVHX1BPTExfREVGQVVMVCBpcyB0aGUgaW50ZXJ2YWwgbGVuZ3RoIG9mIHRoZSB0aW1lciBzb3VyY2Ugb24gdGhlIG5pYworICogTlZSRUdfUE9MTF9ERUZBVUxUPTk3IHdvdWxkIHJlc3VsdCBpbiBhbiBpbnRlcnZhbCBsZW5ndGggb2YgMSBtcworICovCisJTnZSZWdQb2xsaW5nSW50ZXJ2YWwgPSAweDAwYywKKyNkZWZpbmUgTlZSRUdfUE9MTF9ERUZBVUxUCTk3MAorCU52UmVnTWlzYzEgPSAweDA4MCwKKyNkZWZpbmUgTlZSRUdfTUlTQzFfSEQJCTB4MDIKKyNkZWZpbmUgTlZSRUdfTUlTQzFfRk9SQ0UJMHgzYjBmM2MKKworCU52UmVnVHJhbnNtaXR0ZXJDb250cm9sID0gMHgwODQsCisjZGVmaW5lIE5WUkVHX1hNSVRDVExfU1RBUlQJMHgwMQorCU52UmVnVHJhbnNtaXR0ZXJTdGF0dXMgPSAweDA4OCwKKyNkZWZpbmUgTlZSRUdfWE1JVFNUQVRfQlVTWQkweDAxCisKKwlOdlJlZ1BhY2tldEZpbHRlckZsYWdzID0gMHg4YywKKyNkZWZpbmUgTlZSRUdfUEZGX0FMV0FZUwkweDdGMDAwOAorI2RlZmluZSBOVlJFR19QRkZfUFJPTUlTQwkweDgwCisjZGVmaW5lIE5WUkVHX1BGRl9NWUFERFIJMHgyMAorCisJTnZSZWdPZmZsb2FkQ29uZmlnID0gMHg5MCwKKyNkZWZpbmUgTlZSRUdfT0ZGTE9BRF9IT01FUEhZCTB4NjAxCisjZGVmaW5lIE5WUkVHX09GRkxPQURfTk9STUFMCVJYX05JQ19CVUZTSVpFCisJTnZSZWdSZWNlaXZlckNvbnRyb2wgPSAweDA5NCwKKyNkZWZpbmUgTlZSRUdfUkNWQ1RMX1NUQVJUCTB4MDEKKwlOdlJlZ1JlY2VpdmVyU3RhdHVzID0gMHg5OCwKKyNkZWZpbmUgTlZSRUdfUkNWU1RBVF9CVVNZCTB4MDEKKworCU52UmVnUmFuZG9tU2VlZCA9IDB4OWMsCisjZGVmaW5lIE5WUkVHX1JORFNFRURfTUFTSwkweDAwZmYKKyNkZWZpbmUgTlZSRUdfUk5EU0VFRF9GT1JDRQkweDdmMDAKKyNkZWZpbmUgTlZSRUdfUk5EU0VFRF9GT1JDRTIJMHgyZDAwCisjZGVmaW5lIE5WUkVHX1JORFNFRURfRk9SQ0UzCTB4NzQwMAorCisJTnZSZWdVbmtub3duU2V0dXBSZWcxID0gMHhBMCwKKyNkZWZpbmUgTlZSRUdfVU5LU0VUVVAxX1ZBTAkweDE2MDcwZgorCU52UmVnVW5rbm93blNldHVwUmVnMiA9IDB4QTQsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQMl9WQUwJMHgxNgorCU52UmVnTWFjQWRkckEgPSAweEE4LAorCU52UmVnTWFjQWRkckIgPSAweEFDLAorCU52UmVnTXVsdGljYXN0QWRkckEgPSAweEIwLAorI2RlZmluZSBOVlJFR19NQ0FTVEFERFJBX0ZPUkNFCTB4MDEKKwlOdlJlZ011bHRpY2FzdEFkZHJCID0gMHhCNCwKKwlOdlJlZ011bHRpY2FzdE1hc2tBID0gMHhCOCwKKwlOdlJlZ011bHRpY2FzdE1hc2tCID0gMHhCQywKKworCU52UmVnUGh5SW50ZXJmYWNlID0gMHhDMCwKKyNkZWZpbmUgUEhZX1JHTUlJCQkweDEwMDAwMDAwCisKKwlOdlJlZ1R4UmluZ1BoeXNBZGRyID0gMHgxMDAsCisJTnZSZWdSeFJpbmdQaHlzQWRkciA9IDB4MTA0LAorCU52UmVnUmluZ1NpemVzID0gMHgxMDgsCisjZGVmaW5lIE5WUkVHX1JJTkdTWl9UWFNISUZUIDAKKyNkZWZpbmUgTlZSRUdfUklOR1NaX1JYU0hJRlQgMTYKKwlOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyA9IDB4MTBjLAorCU52UmVnTGlua1NwZWVkID0gMHgxMTAsCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF9GT1JDRSAweDEwMDAwCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF8xMAkxMDAwCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF8xMDAJMTAwCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF8xMDAwCTUwCisJTnZSZWdVbmtub3duU2V0dXBSZWc1ID0gMHgxMzAsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQNV9CSVQzMQkoMTw8MzEpCisJTnZSZWdVbmtub3duU2V0dXBSZWczID0gMHgxM2MsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQM19WQUwxCTB4MjAwMDEwCisJTnZSZWdUeFJ4Q29udHJvbCA9IDB4MTQ0LAorI2RlZmluZSBOVlJFR19UWFJYQ1RMX0tJQ0sJMHgwMDAxCisjZGVmaW5lIE5WUkVHX1RYUlhDVExfQklUMQkweDAwMDIKKyNkZWZpbmUgTlZSRUdfVFhSWENUTF9CSVQyCTB4MDAwNAorI2RlZmluZSBOVlJFR19UWFJYQ1RMX0lETEUJMHgwMDA4CisjZGVmaW5lIE5WUkVHX1RYUlhDVExfUkVTRVQJMHgwMDEwCisjZGVmaW5lIE5WUkVHX1RYUlhDVExfUlhDSEVDSwkweDA0MDAKKwlOdlJlZ01JSVN0YXR1cyA9IDB4MTgwLAorI2RlZmluZSBOVlJFR19NSUlTVEFUX0VSUk9SCQkweDAwMDEKKyNkZWZpbmUgTlZSRUdfTUlJU1RBVF9MSU5LQ0hBTkdFCTB4MDAwOAorI2RlZmluZSBOVlJFR19NSUlTVEFUX01BU0sJCTB4MDAwZgorI2RlZmluZSBOVlJFR19NSUlTVEFUX01BU0syCQkweDAwMGYKKwlOdlJlZ1Vua25vd25TZXR1cFJlZzQgPSAweDE4NCwKKyNkZWZpbmUgTlZSRUdfVU5LU0VUVVA0X1ZBTAk4CisKKwlOdlJlZ0FkYXB0ZXJDb250cm9sID0gMHgxODgsCisjZGVmaW5lIE5WUkVHX0FEQVBUQ1RMX1NUQVJUCTB4MDIKKyNkZWZpbmUgTlZSRUdfQURBUFRDVExfTElOS1VQCTB4MDQKKyNkZWZpbmUgTlZSRUdfQURBUFRDVExfUEhZVkFMSUQJMHg0MDAwMAorI2RlZmluZSBOVlJFR19BREFQVENUTF9SVU5OSU5HCTB4MTAwMDAwCisjZGVmaW5lIE5WUkVHX0FEQVBUQ1RMX1BIWVNISUZUCTI0CisJTnZSZWdNSUlTcGVlZCA9IDB4MThjLAorI2RlZmluZSBOVlJFR19NSUlTUEVFRF9CSVQ4CSgxPDw4KQorI2RlZmluZSBOVlJFR19NSUlERUxBWQk1CisJTnZSZWdNSUlDb250cm9sID0gMHgxOTAsCisjZGVmaW5lIE5WUkVHX01JSUNUTF9JTlVTRQkweDA4MDAwCisjZGVmaW5lIE5WUkVHX01JSUNUTF9XUklURQkweDAwNDAwCisjZGVmaW5lIE5WUkVHX01JSUNUTF9BRERSU0hJRlQJNQorCU52UmVnTUlJRGF0YSA9IDB4MTk0LAorCU52UmVnV2FrZVVwRmxhZ3MgPSAweDIwMCwKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfVkFMCQkweDc3NzAKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQlVTWVNISUZUCTI0CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0VOQUJMRVNISUZUCTE2CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0QzU0hJRlQJMTIKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfRDJTSElGVAk4CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0QxU0hJRlQJNAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19EMFNISUZUCTAKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQUNDRVBUX01BR1BBVAkJMHgwMQorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19BQ0NFUFRfV0FLRVVQUEFUCTB4MDIKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQUNDRVBUX0xJTktDSEFOR0UJMHgwNAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19FTkFCTEUJMHgxMTExCisKKwlOdlJlZ1BhdHRlcm5DUkMgPSAweDIwNCwKKwlOdlJlZ1BhdHRlcm5NYXNrID0gMHgyMDgsCisJTnZSZWdQb3dlckNhcCA9IDB4MjY4LAorI2RlZmluZSBOVlJFR19QT1dFUkNBUF9EM1NVUFAJKDE8PDMwKQorI2RlZmluZSBOVlJFR19QT1dFUkNBUF9EMlNVUFAJKDE8PDI2KQorI2RlZmluZSBOVlJFR19QT1dFUkNBUF9EMVNVUFAJKDE8PDI1KQorCU52UmVnUG93ZXJTdGF0ZSA9IDB4MjZjLAorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX1BPV0VSRURVUAkweDgwMDAKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9WQUxJRAkJMHgwMTAwCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfTUFTSwkJMHgwMDAzCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfRDAJCTB4MDAwMAorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX0QxCQkweDAwMDEKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9EMgkJMHgwMDAyCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfRDMJCTB4MDAwMworfTsKKworI2RlZmluZSBGTEFHX01BU0tfVjEgMHhmZmZmMDAwMAorI2RlZmluZSBGTEFHX01BU0tfVjIgMHhmZmZmYzAwMAorI2RlZmluZSBMRU5fTUFTS19WMSAoMHhmZmZmZmZmZiBeIEZMQUdfTUFTS19WMSkKKyNkZWZpbmUgTEVOX01BU0tfVjIgKDB4ZmZmZmZmZmYgXiBGTEFHX01BU0tfVjIpCisKKyNkZWZpbmUgTlZfVFhfTEFTVFBBQ0tFVAkoMTw8MTYpCisjZGVmaW5lIE5WX1RYX1JFVFJZRVJST1IJKDE8PDE5KQorI2RlZmluZSBOVl9UWF9MQVNUUEFDS0VUMQkoMTw8MjQpCisjZGVmaW5lIE5WX1RYX0RFRkVSUkVECQkoMTw8MjYpCisjZGVmaW5lIE5WX1RYX0NBUlJJRVJMT1NUCSgxPDwyNykKKyNkZWZpbmUgTlZfVFhfTEFURUNPTExJU0lPTgkoMTw8MjgpCisjZGVmaW5lIE5WX1RYX1VOREVSRkxPVwkJKDE8PDI5KQorI2RlZmluZSBOVl9UWF9FUlJPUgkJKDE8PDMwKQorI2RlZmluZSBOVl9UWF9WQUxJRAkJKDE8PDMxKQorCisjZGVmaW5lIE5WX1RYMl9MQVNUUEFDS0VUCSgxPDwyOSkKKyNkZWZpbmUgTlZfVFgyX1JFVFJZRVJST1IJKDE8PDE4KQorI2RlZmluZSBOVl9UWDJfTEFTVFBBQ0tFVDEJKDE8PDIzKQorI2RlZmluZSBOVl9UWDJfREVGRVJSRUQJCSgxPDwyNSkKKyNkZWZpbmUgTlZfVFgyX0NBUlJJRVJMT1NUCSgxPDwyNikKKyNkZWZpbmUgTlZfVFgyX0xBVEVDT0xMSVNJT04JKDE8PDI3KQorI2RlZmluZSBOVl9UWDJfVU5ERVJGTE9XCSgxPDwyOCkKKy8qIGVycm9yIGFuZCB2YWxpZCBhcmUgdGhlIHNhbWUgZm9yIGJvdGggKi8KKyNkZWZpbmUgTlZfVFgyX0VSUk9SCQkoMTw8MzApCisjZGVmaW5lIE5WX1RYMl9WQUxJRAkJKDE8PDMxKQorCisjZGVmaW5lIE5WX1JYX0RFU0NSSVBUT1JWQUxJRAkoMTw8MTYpCisjZGVmaW5lIE5WX1JYX01JU1NFREZSQU1FCSgxPDwxNykKKyNkZWZpbmUgTlZfUlhfU1VCU1RSQUNUMQkoMTw8MTgpCisjZGVmaW5lIE5WX1JYX0VSUk9SMQkJKDE8PDIzKQorI2RlZmluZSBOVl9SWF9FUlJPUjIJCSgxPDwyNCkKKyNkZWZpbmUgTlZfUlhfRVJST1IzCQkoMTw8MjUpCisjZGVmaW5lIE5WX1JYX0VSUk9SNAkJKDE8PDI2KQorI2RlZmluZSBOVl9SWF9DUkNFUlIJCSgxPDwyNykKKyNkZWZpbmUgTlZfUlhfT1ZFUkZMT1cJCSgxPDwyOCkKKyNkZWZpbmUgTlZfUlhfRlJBTUlOR0VSUgkoMTw8MjkpCisjZGVmaW5lIE5WX1JYX0VSUk9SCQkoMTw8MzApCisjZGVmaW5lIE5WX1JYX0FWQUlMCQkoMTw8MzEpCisKKyNkZWZpbmUgTlZfUlgyX0NIRUNLU1VNTUFTSwkoMHgxQzAwMDAwMCkKKyNkZWZpbmUgTlZfUlgyX0NIRUNLU1VNT0sxCSgweDEwMDAwMDAwKQorI2RlZmluZSBOVl9SWDJfQ0hFQ0tTVU1PSzIJKDB4MTQwMDAwMDApCisjZGVmaW5lIE5WX1JYMl9DSEVDS1NVTU9LMwkoMHgxODAwMDAwMCkKKyNkZWZpbmUgTlZfUlgyX0RFU0NSSVBUT1JWQUxJRAkoMTw8MjkpCisjZGVmaW5lIE5WX1JYMl9TVUJTVFJBQ1QxCSgxPDwyNSkKKyNkZWZpbmUgTlZfUlgyX0VSUk9SMQkJKDE8PDE4KQorI2RlZmluZSBOVl9SWDJfRVJST1IyCQkoMTw8MTkpCisjZGVmaW5lIE5WX1JYMl9FUlJPUjMJCSgxPDwyMCkKKyNkZWZpbmUgTlZfUlgyX0VSUk9SNAkJKDE8PDIxKQorI2RlZmluZSBOVl9SWDJfQ1JDRVJSCQkoMTw8MjIpCisjZGVmaW5lIE5WX1JYMl9PVkVSRkxPVwkJKDE8PDIzKQorI2RlZmluZSBOVl9SWDJfRlJBTUlOR0VSUgkoMTw8MjQpCisvKiBlcnJvciBhbmQgYXZhaWwgYXJlIHRoZSBzYW1lIGZvciBib3RoICovCisjZGVmaW5lIE5WX1JYMl9FUlJPUgkJKDE8PDMwKQorI2RlZmluZSBOVl9SWDJfQVZBSUwJCSgxPDwzMSkKKworLyogTWlzY2VsYW5lb3VzIGhhcmR3YXJlIHJlbGF0ZWQgZGVmaW5lczogKi8KKyNkZWZpbmUgTlZfUENJX1JFR1NaCQkweDI3MAorCisvKiB2YXJpb3VzIHRpbWVvdXQgZGVsYXlzOiBhbGwgaW4gdXNlYyAqLworI2RlZmluZSBOVl9UWFJYX1JFU0VUX0RFTEFZCTQKKyNkZWZpbmUgTlZfVFhTVE9QX0RFTEFZMQkxMAorI2RlZmluZSBOVl9UWFNUT1BfREVMQVkxTUFYCTUwMDAwMAorI2RlZmluZSBOVl9UWFNUT1BfREVMQVkyCTEwMAorI2RlZmluZSBOVl9SWFNUT1BfREVMQVkxCTEwCisjZGVmaW5lIE5WX1JYU1RPUF9ERUxBWTFNQVgJNTAwMDAwCisjZGVmaW5lIE5WX1JYU1RPUF9ERUxBWTIJMTAwCisjZGVmaW5lIE5WX1NFVFVQNV9ERUxBWQkJNQorI2RlZmluZSBOVl9TRVRVUDVfREVMQVlNQVgJNTAwMDAKKyNkZWZpbmUgTlZfUE9XRVJVUF9ERUxBWQk1CisjZGVmaW5lIE5WX1BPV0VSVVBfREVMQVlNQVgJNTAwMAorI2RlZmluZSBOVl9NSUlCVVNZX0RFTEFZCTUwCisjZGVmaW5lIE5WX01JSVBIWV9ERUxBWQkxMAorI2RlZmluZSBOVl9NSUlQSFlfREVMQVlNQVgJMTAwMDAKKworI2RlZmluZSBOVl9XQUtFVVBQQVRURVJOUwk1CisjZGVmaW5lIE5WX1dBS0VVUE1BU0tFTlRSSUVTCTQKKworLyogR2VuZXJhbCBkcml2ZXIgZGVmYXVsdHMgKi8KKyNkZWZpbmUgTlZfV0FUQ0hET0dfVElNRU8JKDUqSFopCisKKyNkZWZpbmUgUlhfUklORwkJNAorI2RlZmluZSBUWF9SSU5HCQkyCisKKy8qIAorICogSWYgeW91ciBuaWMgbXlzdGVyaW91c2x5IGhhbmdzIHRoZW4gdHJ5IHRvIHJlZHVjZSB0aGUgbGltaXRzCisgKiB0byAxLzA6IEl0IG1pZ2h0IGJlIHJlcXVpcmVkIHRvIHNldCBOVl9UWF9MQVNUUEFDS0VUIGluIHRoZQorICogbGFzdCB2YWxpZCByaW5nIGVudHJ5LiBCdXQgdGhpcyB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvCisgKiBpbXBsZW1lbnQgLSBwcm9iYWJseSBhIGRpc2Fzc2VtYmx5IGVycm9yLgorICovCisjZGVmaW5lIFRYX0xJTUlUX1NUT1AJNjMKKyNkZWZpbmUgVFhfTElNSVRfU1RBUlQJNjIKKworLyogcngvdHggbWFjIGFkZHIgKyB0eXBlICsgdmxhbiArIGFsaWduICsgc2xhY2sqLworI2RlZmluZSBSWF9OSUNfQlVGU0laRQkJKEVUSF9EQVRBX0xFTiArIDY0KQorLyogZXZlbiBtb3JlIHNsYWNrICovCisjZGVmaW5lIFJYX0FMTE9DX0JVRlNJWkUJKEVUSF9EQVRBX0xFTiArIDEyOCkKKworI2RlZmluZSBPT01fUkVGSUxMCSgxK0haLzIwKQorI2RlZmluZSBQT0xMX1dBSVQJKDErSFovMTAwKQorI2RlZmluZSBMSU5LX1RJTUVPVVQJKDMqSFopCisKKy8qIAorICogZGVzY192ZXIgdmFsdWVzOgorICogVGhpcyBmaWVsZCBoYXMgdHdvIHB1cnBvc2VzOgorICogLSBOZXdlciBuaWNzIHVzZXMgYSBkaWZmZXJlbnQgcmluZyBsYXlvdXQuIFRoZSBsYXlvdXQgaXMgc2VsZWN0ZWQgYnkKKyAqICAgY29tcGFyaW5nIG5wLT5kZXNjX3ZlciB3aXRoIERFU0NfVkVSX3h5LgorICogLSBJdCBjb250YWlucyBiaXRzIHRoYXQgYXJlIGZvcmNlZCBvbiB3aGVuIHdyaXRpbmcgdG8gTnZSZWdUeFJ4Q29udHJvbC4KKyAqLworI2RlZmluZSBERVNDX1ZFUl8xCTB4MAorI2RlZmluZSBERVNDX1ZFUl8yCSgweDAyMTAwfE5WUkVHX1RYUlhDVExfUlhDSEVDSykKKworLyogUEhZIGRlZmluZXMgKi8KKyNkZWZpbmUgUEhZX09VSV9NQVJWRUxMCTB4NTA0MworI2RlZmluZSBQSFlfT1VJX0NJQ0FEQQkweDAzZjEKKyNkZWZpbmUgUEhZSUQxX09VSV9NQVNLCTB4MDNmZgorI2RlZmluZSBQSFlJRDFfT1VJX1NIRlQJNgorI2RlZmluZSBQSFlJRDJfT1VJX01BU0sJMHhmYzAwCisjZGVmaW5lIFBIWUlEMl9PVUlfU0hGVAkxMAorI2RlZmluZSBQSFlfSU5JVDEJMHgwZjAwMAorI2RlZmluZSBQSFlfSU5JVDIJMHgwZTAwCisjZGVmaW5lIFBIWV9JTklUMwkweDAxMDAwCisjZGVmaW5lIFBIWV9JTklUNAkweDAyMDAKKyNkZWZpbmUgUEhZX0lOSVQ1CTB4MDAwNAorI2RlZmluZSBQSFlfSU5JVDYJMHgwMjAwMAorI2RlZmluZSBQSFlfR0lHQUJJVAkweDAxMDAKKworI2RlZmluZSBQSFlfVElNRU9VVAkweDEKKyNkZWZpbmUgUEhZX0VSUk9SCTB4MgorCisjZGVmaW5lIFBIWV8xMDAJMHgxCisjZGVmaW5lIFBIWV8xMDAwCTB4MgorI2RlZmluZSBQSFlfSEFMRgkweDEwMAorCisKKy8qIEJpdCB0byBrbm93IGlmIE1BQyBhZGRyIGlzIHN0b3JlZCBpbiBjb3JyZWN0IG9yZGVyICovCisjZGVmaW5lIE1BQ19BRERSX0NPUlJFQ1QJMHgwMQorCisvKiBCaWcgZW5kaWFuOiBzaG91bGQgd29yaywgYnV0IGlzIHVudGVzdGVkICovCitzdHJ1Y3QgcmluZ19kZXNjIHsKKwl1MzIgUGFja2V0QnVmZmVyOworCXUzMiBGbGFnTGVuOworfTsKKworCisvKiBEZWZpbmUgdGhlIFRYIGFuZCBSWCBEZXNjcmlwdG9yIGFuZCBCdWZmZXJzICovCitzdHJ1Y3QgeworCXN0cnVjdCByaW5nX2Rlc2MgdHhfcmluZ1tUWF9SSU5HXTsKKwl1bnNpZ25lZCBjaGFyIHR4YltUWF9SSU5HICogUlhfTklDX0JVRlNJWkVdOworCXN0cnVjdCByaW5nX2Rlc2MgcnhfcmluZ1tSWF9SSU5HXTsKKwl1bnNpZ25lZCBjaGFyIHJ4YltSWF9SSU5HICogUlhfTklDX0JVRlNJWkVdOworfSBmb3JjZWRldGhfYnVmcyBfX3NoYXJlZDsKKyNkZWZpbmUgdHhfcmluZyBmb3JjZWRldGhfYnVmcy50eF9yaW5nCisjZGVmaW5lIHJ4X3JpbmcgZm9yY2VkZXRoX2J1ZnMucnhfcmluZworI2RlZmluZSB0eGIgZm9yY2VkZXRoX2J1ZnMudHhiCisjZGVmaW5lIHJ4YiBmb3JjZWRldGhfYnVmcy5yeGIKKworLyogUHJpdmF0ZSBTdG9yYWdlIGZvciB0aGUgTklDICovCitzdGF0aWMgc3RydWN0IGZvcmNlZGV0aF9wcml2YXRlIHsKKwkvKiBHZW5lcmFsIGRhdGE6CisJICogTG9ja2luZzogc3Bpbl9sb2NrKCZucC0+bG9jayk7ICovCisJaW50IGluX3NodXRkb3duOworCXUzMiBsaW5rc3BlZWQ7CisJaW50IGR1cGxleDsKKwlpbnQgcGh5YWRkcjsKKwlpbnQgd29sZW5hYmxlZDsKKwl1bnNpZ25lZCBpbnQgcGh5X291aTsKKwl1MTYgZ2lnYWJpdDsKKworCS8qIEdlbmVyYWwgZGF0YTogUk8gZmllbGRzICovCisJdTggKnJpbmdfYWRkcjsKKwl1MzIgb3JpZ19tYWNbMl07CisJdTMyIGlycW1hc2s7CisJdTMyIGRlc2NfdmVyOworCS8qIHJ4IHNwZWNpZmljIGZpZWxkcy4KKwkgKiBMb2NraW5nOiBXaXRoaW4gaXJxIGhhbmRlciBvciBkaXNhYmxlX2lycStzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCByZWZpbGxfcng7CisKKwkvKgorCSAqIHR4IHNwZWNpZmljIGZpZWxkcy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF90eCwgbmljX3R4OworCXUzMiB0eF9mbGFnczsKK30gbnB4OworCitzdGF0aWMgc3RydWN0IGZvcmNlZGV0aF9wcml2YXRlICpucDsKKworc3RhdGljIGlubGluZSB2b2lkIHBjaV9wdXNoKHU4ICogYmFzZSkKK3sKKwkvKiBmb3JjZSBvdXQgcGVuZGluZyBwb3N0ZWQgd3JpdGVzICovCisJcmVhZGwoYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG52X2Rlc2NyX2dldGxlbmd0aChzdHJ1Y3QgcmluZ19kZXNjICpwcmQsIHUzMiB2KQoreworCXJldHVybiBsZTMyX3RvX2NwdShwcmQtPkZsYWdMZW4pCisJICAgICYgKCh2ID09IERFU0NfVkVSXzEpID8gTEVOX01BU0tfVjEgOiBMRU5fTUFTS19WMik7Cit9CisKK3N0YXRpYyBpbnQgcmVnX2RlbGF5KGludCBvZmZzZXQsIHUzMiBtYXNrLAorCQkgICAgIHUzMiB0YXJnZXQsIGludCBkZWxheSwgaW50IGRlbGF5bWF4LCBjb25zdCBjaGFyICptc2cpCit7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKworCXBjaV9wdXNoKGJhc2UpOworCWRvIHsKKwkJdWRlbGF5KGRlbGF5KTsKKwkJZGVsYXltYXggLT0gZGVsYXk7CisJCWlmIChkZWxheW1heCA8IDApIHsKKwkJCWlmIChtc2cpCisJCQkJcHJpbnRmKCIlcyIsIG1zZyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gd2hpbGUgKChyZWFkbChiYXNlICsgb2Zmc2V0KSAmIG1hc2spICE9IHRhcmdldCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUlJX1JFQUQJKC0xKQorCisvKiBtaWlfcnc6IHJlYWQvd3JpdGUgYSByZWdpc3RlciBvbiB0aGUgUEhZLgorICoKKyAqIENhbGxlciBtdXN0IGd1YXJhbnRlZSBzZXJpYWxpemF0aW9uCisgKi8KK3N0YXRpYyBpbnQgbWlpX3J3KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IGFkZHIsIGludCBtaWlyZWcsCisJCSAgaW50IHZhbHVlKQoreworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisJdTMyIHJlZzsKKwlpbnQgcmV0dmFsOworCisJd3JpdGVsKE5WUkVHX01JSVNUQVRfTUFTSywgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKworCXJlZyA9IHJlYWRsKGJhc2UgKyBOdlJlZ01JSUNvbnRyb2wpOworCWlmIChyZWcgJiBOVlJFR19NSUlDVExfSU5VU0UpIHsKKwkJd3JpdGVsKE5WUkVHX01JSUNUTF9JTlVTRSwgYmFzZSArIE52UmVnTUlJQ29udHJvbCk7CisJCXVkZWxheShOVl9NSUlCVVNZX0RFTEFZKTsKKwl9CisKKwlyZWcgPQorCSAgICAoYWRkciA8PCBOVlJFR19NSUlDVExfQUREUlNISUZUKSB8IG1paXJlZzsKKwlpZiAodmFsdWUgIT0gTUlJX1JFQUQpIHsKKwkJd3JpdGVsKHZhbHVlLCBiYXNlICsgTnZSZWdNSUlEYXRhKTsKKwkJcmVnIHw9IE5WUkVHX01JSUNUTF9XUklURTsKKwl9CisJd3JpdGVsKHJlZywgYmFzZSArIE52UmVnTUlJQ29udHJvbCk7CisKKwlpZiAocmVnX2RlbGF5KE52UmVnTUlJQ29udHJvbCwgTlZSRUdfTUlJQ1RMX0lOVVNFLCAwLAorCQkgICAgICBOVl9NSUlQSFlfREVMQVksIE5WX01JSVBIWV9ERUxBWU1BWCwgTlVMTCkpIHsKKwkJZHByaW50ZigoIm1paV9ydyBvZiByZWcgJWQgYXQgUEhZICVkIHRpbWVkIG91dC5cbiIsCisJCQkgbWlpcmVnLCBhZGRyKSk7CisJCXJldHZhbCA9IC0xOworCX0gZWxzZSBpZiAodmFsdWUgIT0gTUlJX1JFQUQpIHsKKwkJLyogaXQgd2FzIGEgd3JpdGUgb3BlcmF0aW9uIC0gZmV3ZXIgZmFpbHVyZXMgYXJlIGRldGVjdGFibGUgKi8KKwkJZHByaW50ZigoIm1paV9ydyB3cm90ZSAweCV4IHRvIHJlZyAlZCBhdCBQSFkgJWRcbiIsCisJCQkgdmFsdWUsIG1paXJlZywgYWRkcikpOworCQlyZXR2YWwgPSAwOworCX0gZWxzZSBpZiAocmVhZGwoYmFzZSArIE52UmVnTUlJU3RhdHVzKSAmIE5WUkVHX01JSVNUQVRfRVJST1IpIHsKKwkJZHByaW50ZigoIm1paV9ydyBvZiByZWcgJWQgYXQgUEhZICVkIGZhaWxlZC5cbiIsCisJCQkgbWlpcmVnLCBhZGRyKSk7CisJCXJldHZhbCA9IC0xOworCX0gZWxzZSB7CisJCXJldHZhbCA9IHJlYWRsKGJhc2UgKyBOdlJlZ01JSURhdGEpOworCQlkcHJpbnRmKCgibWlpX3J3IHJlYWQgZnJvbSByZWcgJWQgYXQgUEhZICVkOiAweCV4LlxuIiwKKwkJCSBtaWlyZWcsIGFkZHIsIHJldHZhbCkpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHBoeV9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisKKwl1MzIgbWlpY29udHJvbDsKKwl1bnNpZ25lZCBpbnQgdHJpZXMgPSAwOworCisJbWlpY29udHJvbCA9IG1paV9ydyhuaWMsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgTUlJX1JFQUQpOworCW1paWNvbnRyb2wgfD0gQk1DUl9SRVNFVDsKKwlpZiAobWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBtaWljb250cm9sKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogd2FpdCBmb3IgNTAwbXMgKi8KKwltZGVsYXkoNTAwKTsKKworCS8qIG11c3Qgd2FpdCB0aWxsIHJlc2V0IGlzIGRlYXNzZXJ0ZWQgKi8KKwl3aGlsZSAobWlpY29udHJvbCAmIEJNQ1JfUkVTRVQpIHsKKwkJbWRlbGF5KDEwKTsKKwkJbWlpY29udHJvbCA9IG1paV9ydyhuaWMsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgTUlJX1JFQUQpOworCQkvKiBGSVhNRTogMTAwIHRyaWVzIHNlZW0gZXhjZXNzaXZlICovCisJCWlmICh0cmllcysrID4gMTAwKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaHlfaW5pdChzdHJ1Y3QgbmljICpuaWMpCit7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKwl1MzIgcGh5aW50ZXJmYWNlLCBwaHlfcmVzZXJ2ZWQsIG1paV9zdGF0dXMsIG1paV9jb250cm9sLAorCSAgICBtaWlfY29udHJvbF8xMDAwLCByZWc7CisKKwkvKiBzZXQgYWR2ZXJ0aXNlIHJlZ2lzdGVyICovCisJcmVnID0gbWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIE1JSV9SRUFEKTsKKwlyZWcgfD0KKwkgICAgKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwgQURWRVJUSVNFXzEwMEhBTEYgfAorCSAgICAgQURWRVJUSVNFXzEwMEZVTEwgfCAweDgwMCB8IDB4NDAwKTsKKwlpZiAobWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIHJlZykpIHsKKwkJcHJpbnRmKCJwaHkgd3JpdGUgdG8gYWR2ZXJ0aXNlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gUEhZX0VSUk9SOworCX0KKworCS8qIGdldCBwaHkgaW50ZXJmYWNlIHR5cGUgKi8KKwlwaHlpbnRlcmZhY2UgPSByZWFkbChiYXNlICsgTnZSZWdQaHlJbnRlcmZhY2UpOworCisJLyogc2VlIGlmIGdpZ2FiaXQgcGh5ICovCisJbWlpX3N0YXR1cyA9IG1paV9ydyhuaWMsIG5wLT5waHlhZGRyLCBNSUlfQk1TUiwgTUlJX1JFQUQpOworCisJaWYgKG1paV9zdGF0dXMgJiBQSFlfR0lHQUJJVCkgeworCQlucC0+Z2lnYWJpdCA9IFBIWV9HSUdBQklUOworCQltaWlfY29udHJvbF8xMDAwID0KKwkJICAgIG1paV9ydyhuaWMsIG5wLT5waHlhZGRyLCBNSUlfQ1RSTDEwMDAsIE1JSV9SRUFEKTsKKwkJbWlpX2NvbnRyb2xfMTAwMCAmPSB+QURWRVJUSVNFXzEwMDBIQUxGOworCQlpZiAocGh5aW50ZXJmYWNlICYgUEhZX1JHTUlJKQorCQkJbWlpX2NvbnRyb2xfMTAwMCB8PSBBRFZFUlRJU0VfMTAwMEZVTEw7CisJCWVsc2UKKwkJCW1paV9jb250cm9sXzEwMDAgJj0gfkFEVkVSVElTRV8xMDAwRlVMTDsKKworCQlpZiAobWlpX3J3CisJCSAgICAobmljLCBucC0+cGh5YWRkciwgTUlJX0NUUkwxMDAwLCBtaWlfY29udHJvbF8xMDAwKSkgeworCQkJcHJpbnRmKCJwaHkgaW5pdCBmYWlsZWQuXG4iKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwl9IGVsc2UKKwkJbnAtPmdpZ2FiaXQgPSAwOworCisJLyogcmVzZXQgdGhlIHBoeSAqLworCWlmIChwaHlfcmVzZXQobmljKSkgeworCQlwcmludGYoInBoeSByZXNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gUEhZX0VSUk9SOworCX0KKworCS8qIHBoeSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLworCWlmICgobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9DSUNBREEpICYmIChwaHlpbnRlcmZhY2UgJiBQSFlfUkdNSUkpKSB7CisJCXBoeV9yZXNlcnZlZCA9CisJCSAgICBtaWlfcncobmljLCBucC0+cGh5YWRkciwgTUlJX1JFU1YxLCBNSUlfUkVBRCk7CisJCXBoeV9yZXNlcnZlZCAmPSB+KFBIWV9JTklUMSB8IFBIWV9JTklUMik7CisJCXBoeV9yZXNlcnZlZCB8PSAoUEhZX0lOSVQzIHwgUEhZX0lOSVQ0KTsKKwkJaWYgKG1paV9ydyhuaWMsIG5wLT5waHlhZGRyLCBNSUlfUkVTVjEsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ZigicGh5IGluaXQgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9CisJCSAgICBtaWlfcncobmljLCBucC0+cGh5YWRkciwgTUlJX05DT05GSUcsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkIHw9IFBIWV9JTklUNTsKKwkJaWYgKG1paV9ydyhuaWMsIG5wLT5waHlhZGRyLCBNSUlfTkNPTkZJRywgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRmKCJwaHkgaW5pdCBmYWlsZWQuXG4iKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwl9CisJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfQ0lDQURBKSB7CisJCXBoeV9yZXNlcnZlZCA9CisJCSAgICBtaWlfcncobmljLCBucC0+cGh5YWRkciwgTUlJX1NSRVZJU0lPTiwgTUlJX1JFQUQpOworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0lOSVQ2OworCQlpZiAobWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9TUkVWSVNJT04sIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ZigicGh5IGluaXQgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJfQorCisJLyogcmVzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisJbWlpX2NvbnRyb2wgPSBtaWlfcncobmljLCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIE1JSV9SRUFEKTsKKwltaWlfY29udHJvbCB8PSAoQk1DUl9BTlJFU1RBUlQgfCBCTUNSX0FORU5BQkxFKTsKKwlpZiAobWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBtaWlfY29udHJvbCkpIHsKKwkJcmV0dXJuIFBIWV9FUlJPUjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfcngoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisKKwlkcHJpbnRmKCgic3RhcnRfcnhcbiIpKTsKKwkvKiBBbHJlYWR5IHJ1bm5pbmc/IFN0b3AgaXQuICovCisJaWYgKHJlYWRsKGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCkgJiBOVlJFR19SQ1ZDVExfU1RBUlQpIHsKKwkJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCk7CisJCXBjaV9wdXNoKGJhc2UpOworCX0KKwl3cml0ZWwobnAtPmxpbmtzcGVlZCwgYmFzZSArIE52UmVnTGlua1NwZWVkKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl3cml0ZWwoTlZSRUdfUkNWQ1RMX1NUQVJULCBiYXNlICsgTnZSZWdSZWNlaXZlckNvbnRyb2wpOworCXBjaV9wdXNoKGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX3J4KHZvaWQpCit7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKworCWRwcmludGYoKCJzdG9wX3J4XG4iKSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCk7CisJcmVnX2RlbGF5KE52UmVnUmVjZWl2ZXJTdGF0dXMsIE5WUkVHX1JDVlNUQVRfQlVTWSwgMCwKKwkJICBOVl9SWFNUT1BfREVMQVkxLCBOVl9SWFNUT1BfREVMQVkxTUFYLAorCQkgICJzdG9wX3J4OiBSZWNlaXZlclN0YXR1cyByZW1haW5lZCBidXN5Iik7CisKKwl1ZGVsYXkoTlZfUlhTVE9QX0RFTEFZMik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0xpbmtTcGVlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3R4KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCisJZHByaW50ZigoInN0YXJ0X3R4XG4iKSk7CisJd3JpdGVsKE5WUkVHX1hNSVRDVExfU1RBUlQsIGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyQ29udHJvbCk7CisJcGNpX3B1c2goYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BfdHgodm9pZCkKK3sKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCisJZHByaW50ZigoInN0b3BfdHhcbiIpKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJDb250cm9sKTsKKwlyZWdfZGVsYXkoTnZSZWdUcmFuc21pdHRlclN0YXR1cywgTlZSRUdfWE1JVFNUQVRfQlVTWSwgMCwKKwkJICBOVl9UWFNUT1BfREVMQVkxLCBOVl9UWFNUT1BfREVMQVkxTUFYLAorCQkgICJzdG9wX3R4OiBUcmFuc21pdHRlclN0YXR1cyByZW1haW5lZCBidXN5Iik7CisKKwl1ZGVsYXkoTlZfVFhTVE9QX0RFTEFZMik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyk7Cit9CisKKworc3RhdGljIHZvaWQgdHhyeF9yZXNldChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKworCWRwcmludGYoKCJ0eHJ4X3Jlc2V0XG4iKSk7CisJd3JpdGVsKE5WUkVHX1RYUlhDVExfQklUMiB8IE5WUkVHX1RYUlhDVExfUkVTRVQgfCBucC0+ZGVzY192ZXIsCisJICAgICAgIGJhc2UgKyBOdlJlZ1R4UnhDb250cm9sKTsKKworCXBjaV9wdXNoKGJhc2UpOworCXVkZWxheShOVl9UWFJYX1JFU0VUX0RFTEFZKTsKKwl3cml0ZWwoTlZSRUdfVFhSWENUTF9CSVQyIHwgbnAtPmRlc2NfdmVyLCBiYXNlICsgTnZSZWdUeFJ4Q29udHJvbCk7CisJcGNpX3B1c2goYmFzZSk7Cit9CisKKy8qCisgKiBhbGxvY19yeDogZmlsbCByeCByaW5nIGVudHJpZXMuCisgKiBSZXR1cm4gMSBpZiB0aGUgYWxsb2NhdGlvbnMgZm9yIHRoZSBza2JzIGZhaWxlZCBhbmQgdGhlCisgKiByeCBlbmdpbmUgaXMgd2l0aG91dCBBdmFpbGFibGUgZGVzY3JpcHRvcnMKKyAqLworc3RhdGljIGludCBhbGxvY19yeChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJdW5zaWduZWQgaW50IHJlZmlsbF9yeCA9IG5wLT5yZWZpbGxfcng7CisJaW50IGk7CisJLy93aGlsZSAobnAtPmN1cl9yeCAhPSByZWZpbGxfcngpIHsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklORzsgaSsrKSB7CisJCS8vaW50IG5yID0gcmVmaWxsX3J4ICUgUlhfUklORzsKKwkJcnhfcmluZ1tpXS5QYWNrZXRCdWZmZXIgPQorCQkgICAgdmlydF90b19sZTMyZGVzYygmcnhiW2kgKiBSWF9OSUNfQlVGU0laRV0pOworCQl3bWIoKTsKKwkJcnhfcmluZ1tpXS5GbGFnTGVuID0KKwkJICAgIGNwdV90b19sZTMyKFJYX05JQ19CVUZTSVpFIHwgTlZfUlhfQVZBSUwpOworCQkvKiAgICAgIHByaW50ZigiYWxsb2Nfcng6IFBhY2tldCAgJWQgbWFya2VkIGFzIEF2YWlsYWJsZVxuIiwKKwkJICAgcmVmaWxsX3J4KTsgKi8KKwkJcmVmaWxsX3J4Kys7CisJfQorCW5wLT5yZWZpbGxfcnggPSByZWZpbGxfcng7CisJaWYgKG5wLT5jdXJfcnggLSByZWZpbGxfcnggPT0gUlhfUklORykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2xpbmtzcGVlZChzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50IGFkdiwgbHBhOworCXUzMiBuZXdsczsKKwlpbnQgbmV3ZHVwID0gbnAtPmR1cGxleDsKKwl1MzIgbWlpX3N0YXR1czsKKwlpbnQgcmV0dmFsID0gMDsgCisJdTMyIGNvbnRyb2xfMTAwMCwgc3RhdHVzXzEwMDAsIHBoeXJlZzsKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCWludCBpOworCisJLyogQk1TUl9MU1RBVFVTIGlzIGxhdGNoZWQsIHJlYWQgaXQgdHdpY2U6CisJICogd2Ugd2FudCB0aGUgY3VycmVudCB2YWx1ZS4KKwkgKi8KKwltaWlfcncobmljLCBucC0+cGh5YWRkciwgTUlJX0JNU1IsIE1JSV9SRUFEKTsKKwltaWlfc3RhdHVzID0gbWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9CTVNSLCBNSUlfUkVBRCk7CisKKyNpZiAxCisJLy95aGx1CisJZm9yKGk9MDtpPDMwO2krKykgeworCQltaWlfc3RhdHVzID0gbWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9CTVNSLCBNSUlfUkVBRCk7CisJCWlmKChtaWlfc3RhdHVzICYgQk1TUl9MU1RBVFVTKSAmJiAobWlpX3N0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKSkgYnJlYWs7CisJCW1kZWxheSgxMDApOworCX0KKyNlbmRpZgorCisJaWYgKCEobWlpX3N0YXR1cyAmIEJNU1JfTFNUQVRVUykpIHsKKwkJcHJpbnRmCisJCSAgICAoIm5vIGxpbmsgZGV0ZWN0ZWQgYnkgcGh5IC0gZmFsbGluZyBiYWNrIHRvIDEwSEQuXG4iKTsKKwkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0UgfCBOVlJFR19MSU5LU1BFRURfMTA7CisJCW5ld2R1cCA9IDA7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gc2V0X3NwZWVkOworCX0KKworCS8qIGNoZWNrIGF1dG8gbmVnb3RpYXRpb24gaXMgY29tcGxldGUgKi8KKwlpZiAoIShtaWlfc3RhdHVzICYgQk1TUl9BTkVHQ09NUExFVEUpKSB7CisJCS8qIHN0aWxsIGluIGF1dG9uZWdvdGlhdGlvbiAtIGNvbmZpZ3VyZSBuaWMgZm9yIDEwIE1CaXQgSEQgYW5kIHdhaXQuICovCisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwOworCQluZXdkdXAgPSAwOworCQlyZXR2YWwgPSAwOworCQlwcmludGYoImF1dG9uZWcgbm90IGNvbXBsZXRlZCAtIGZhbGxpbmcgYmFjayB0byAxMEhELlxuIik7CisJCWdvdG8gc2V0X3NwZWVkOworCX0KKworCXJldHZhbCA9IDE7CisJaWYgKG5wLT5naWdhYml0ID09IFBIWV9HSUdBQklUKSB7CisJCWNvbnRyb2xfMTAwMCA9CisJCSAgICBtaWlfcncobmljLCBucC0+cGh5YWRkciwgTUlJX0NUUkwxMDAwLCBNSUlfUkVBRCk7CisJCXN0YXR1c18xMDAwID0KKwkJICAgIG1paV9ydyhuaWMsIG5wLT5waHlhZGRyLCBNSUlfU1RBVDEwMDAsIE1JSV9SRUFEKTsKKworCQlpZiAoKGNvbnRyb2xfMTAwMCAmIEFEVkVSVElTRV8xMDAwRlVMTCkgJiYKKwkJICAgIChzdGF0dXNfMTAwMCAmIExQQV8xMDAwRlVMTCkpIHsKKwkJCXByaW50ZgorCQkJICAgICgidXBkYXRlX2xpbmtzcGVlZDogR0JpdCBldGhlcm5ldCBkZXRlY3RlZC5cbiIpOworCQkJbmV3bHMgPQorCQkJICAgIE5WUkVHX0xJTktTUEVFRF9GT1JDRSB8IE5WUkVHX0xJTktTUEVFRF8xMDAwOworCQkJbmV3ZHVwID0gMTsKKwkJCWdvdG8gc2V0X3NwZWVkOworCQl9CisJfQorCisJYWR2ID0gbWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIE1JSV9SRUFEKTsKKwlscGEgPSBtaWlfcncobmljLCBucC0+cGh5YWRkciwgTUlJX0xQQSwgTUlJX1JFQUQpOworCWRwcmludGYoKCJ1cGRhdGVfbGlua3NwZWVkOiBQSFkgYWR2ZXJ0aXNlcyAweCVoWCwgbHBhIDB4JWhYLlxuIiwKKwkJIGFkdiwgbHBhKSk7CisKKwkvKiBGSVhNRTogaGFuZGxlIHBhcmFsbGVsIGRldGVjdGlvbiBwcm9wZXJseSwgaGFuZGxlIGdpZ2FiaXQgZXRoZXJuZXQgKi8KKwlscGEgPSBscGEgJiBhZHY7CisJaWYgKGxwYSAmIExQQV8xMDBGVUxMKSB7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwMDsKKwkJbmV3ZHVwID0gMTsKKwl9IGVsc2UgaWYgKGxwYSAmIExQQV8xMDBIQUxGKSB7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwMDsKKwkJbmV3ZHVwID0gMDsKKwl9IGVsc2UgaWYgKGxwYSAmIExQQV8xMEZVTEwpIHsKKwkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0UgfCBOVlJFR19MSU5LU1BFRURfMTA7CisJCW5ld2R1cCA9IDE7CisJfSBlbHNlIGlmIChscGEgJiBMUEFfMTBIQUxGKSB7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwOworCQluZXdkdXAgPSAwOworCX0gZWxzZSB7CisJCXByaW50ZigiYmFkIGFiaWxpdHkgJWhYIC0gZmFsbGluZyBiYWNrIHRvIDEwSEQuXG4iLCBscGEpOworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRSB8IE5WUkVHX0xJTktTUEVFRF8xMDsKKwkJbmV3ZHVwID0gMDsKKwl9CisKKyAgICAgIHNldF9zcGVlZDoKKwlpZiAobnAtPmR1cGxleCA9PSBuZXdkdXAgJiYgbnAtPmxpbmtzcGVlZCA9PSBuZXdscykKKwkJcmV0dXJuIHJldHZhbDsKKworCWRwcmludGYoKCJjaGFuZ2luZyBsaW5rIHNldHRpbmcgZnJvbSAlZC8lcyB0byAlZC8lcy5cbiIsCisJICAgICAgIG5wLT5saW5rc3BlZWQsIG5wLT5kdXBsZXggPyAiRnVsbC1EdXBsZXgiOiAiSGFsZi1EdXBsZXgiLCBuZXdscywgbmV3ZHVwID8gIkZ1bGwtRHVwbGV4IjogIkhhbGYtRHVwbGV4IikpOworCisJbnAtPmR1cGxleCA9IG5ld2R1cDsKKwlucC0+bGlua3NwZWVkID0gbmV3bHM7CisKKwlpZiAobnAtPmdpZ2FiaXQgPT0gUEhZX0dJR0FCSVQpIHsKKwkJcGh5cmVnID0gcmVhZGwoYmFzZSArIE52UmVnUmFuZG9tU2VlZCk7CisJCXBoeXJlZyAmPSB+KDB4M0ZGMDApOworCQlpZiAoKG5wLT5saW5rc3BlZWQgJiAweEZGRikgPT0gTlZSRUdfTElOS1NQRUVEXzEwKQorCQkJcGh5cmVnIHw9IE5WUkVHX1JORFNFRURfRk9SQ0UzOworCQllbHNlIGlmICgobnAtPmxpbmtzcGVlZCAmIDB4RkZGKSA9PSBOVlJFR19MSU5LU1BFRURfMTAwKQorCQkJcGh5cmVnIHw9IE5WUkVHX1JORFNFRURfRk9SQ0UyOworCQllbHNlIGlmICgobnAtPmxpbmtzcGVlZCAmIDB4RkZGKSA9PSBOVlJFR19MSU5LU1BFRURfMTAwMCkKKwkJCXBoeXJlZyB8PSBOVlJFR19STkRTRUVEX0ZPUkNFOworCQl3cml0ZWwocGh5cmVnLCBiYXNlICsgTnZSZWdSYW5kb21TZWVkKTsKKwl9CisKKwlwaHlyZWcgPSByZWFkbChiYXNlICsgTnZSZWdQaHlJbnRlcmZhY2UpOworCXBoeXJlZyAmPSB+KFBIWV9IQUxGIHwgUEhZXzEwMCB8IFBIWV8xMDAwKTsKKwlpZiAobnAtPmR1cGxleCA9PSAwKQorCQlwaHlyZWcgfD0gUEhZX0hBTEY7CisJaWYgKChucC0+bGlua3NwZWVkICYgMHhGRkYpID09IE5WUkVHX0xJTktTUEVFRF8xMDApCisJCXBoeXJlZyB8PSBQSFlfMTAwOworCWVsc2UgaWYgKChucC0+bGlua3NwZWVkICYgMHhGRkYpID09IE5WUkVHX0xJTktTUEVFRF8xMDAwKQorCQlwaHlyZWcgfD0gUEhZXzEwMDA7CisJd3JpdGVsKHBoeXJlZywgYmFzZSArIE52UmVnUGh5SW50ZXJmYWNlKTsKKworCXdyaXRlbChOVlJFR19NSVNDMV9GT1JDRSB8IChucC0+ZHVwbGV4ID8gMCA6IE5WUkVHX01JU0MxX0hEKSwKKwkgICAgICAgYmFzZSArIE52UmVnTWlzYzEpOworCXBjaV9wdXNoKGJhc2UpOworCXdyaXRlbChucC0+bGlua3NwZWVkLCBiYXNlICsgTnZSZWdMaW5rU3BlZWQpOworCXBjaV9wdXNoKGJhc2UpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworI2lmIDAgLyogTm90IHVzZWQgKi8KK3N0YXRpYyB2b2lkIG52X2xpbmtjaGFuZ2Uoc3RydWN0IG5pYyAqbmljKQoreworCWlmICh1cGRhdGVfbGlua3NwZWVkKG5pYykpIHsKKy8vICAgICAgICAgICAgICAgIGlmIChuZXRpZl9jYXJyaWVyX29rKG5pYykpIHsKKwkJc3RvcF9yeCgpOworLy89ICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCS8vICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJLy8gICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwLlxuIiwgZGV2LT5uYW1lKTsKKwkJLy8gICAgICAgICAgfQorCQlzdGFydF9yeChuaWMpOworCX0gZWxzZSB7CisJCS8vICAgICAgICBpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCS8vICAgICAgICAgICAgICBuZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkvLyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd24uXG4iLCBkZXYtPm5hbWUpOworCQlzdG9wX3J4KCk7CisJCS8vICB9CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdF9yaW5nKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgaTsKKworCW5wLT5uZXh0X3R4ID0gbnAtPm5pY190eCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkc7IGkrKykKKwkJdHhfcmluZ1tpXS5GbGFnTGVuID0gMDsKKworCW5wLT5jdXJfcnggPSAwOworCW5wLT5yZWZpbGxfcnggPSAwOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HOyBpKyspCisJCXJ4X3JpbmdbaV0uRmxhZ0xlbiA9IDA7CisJcmV0dXJuIGFsbG9jX3J4KG5pYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3Qoc3RydWN0IG5pYyAqbmljKQoreworCisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKwl1MzIgYWRkclsyXTsKKwl1MzIgbWFza1syXTsKKwl1MzIgcGZmOworCXUzMiBhbHdheXNPZmZbMl07CisJdTMyIGFsd2F5c09uWzJdOworCisJbWVtc2V0KGFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJbWVtc2V0KG1hc2ssIDAsIHNpemVvZihtYXNrKSk7CisKKwlwZmYgPSBOVlJFR19QRkZfTVlBRERSOworCisJYWx3YXlzT25bMF0gPSBhbHdheXNPblsxXSA9IGFsd2F5c09mZlswXSA9IGFsd2F5c09mZlsxXSA9IDA7CisKKwlhZGRyWzBdID0gYWx3YXlzT25bMF07CisJYWRkclsxXSA9IGFsd2F5c09uWzFdOworCW1hc2tbMF0gPSBhbHdheXNPblswXSB8IGFsd2F5c09mZlswXTsKKwltYXNrWzFdID0gYWx3YXlzT25bMV0gfCBhbHdheXNPZmZbMV07CisKKwlhZGRyWzBdIHw9IE5WUkVHX01DQVNUQUREUkFfRk9SQ0U7CisJcGZmIHw9IE5WUkVHX1BGRl9BTFdBWVM7CisJc3RvcF9yeCgpOworCXdyaXRlbChhZGRyWzBdLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQSk7CisJd3JpdGVsKGFkZHJbMV0sIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJCKTsKKwl3cml0ZWwobWFza1swXSwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0EpOworCXdyaXRlbChtYXNrWzFdLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQik7CisJd3JpdGVsKHBmZiwgYmFzZSArIE52UmVnUGFja2V0RmlsdGVyRmxhZ3MpOworCXN0YXJ0X3J4KG5pYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCB0aGUgTklDIHRvIHByZXBhcmUgZm9yIHVzZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBmb3JjZWRldGhfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisJaW50IHJldCwgb29tLCBpOworCXJldCA9IDA7CisJZHByaW50ZigoImZvcmNlZGV0aDogb3BlblxuIikpOworCisJLyogMSkgZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbiAqLworCS8qIDQuMS0xOiBzdG9wIGFkYXB0ZXI6IGlnbm9yZWQsIDQuMyBzZWVtcyB0byBiZSBvdmVya2lsbCAqLworCXdyaXRlbChOVlJFR19NQ0FTVEFERFJBX0ZPUkNFLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJCKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0EpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1BhY2tldEZpbHRlckZsYWdzKTsKKworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdUcmFuc21pdHRlckNvbnRyb2wpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdSZWNlaXZlckNvbnRyb2wpOworCisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0FkYXB0ZXJDb250cm9sKTsKKworCS8qIDIpIGluaXRpYWxpemUgZGVzY3JpcHRvciByaW5ncyAqLworCW9vbSA9IGluaXRfcmluZyhuaWMpOworCisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0xpbmtTcGVlZCk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyk7CisJdHhyeF9yZXNldChuaWMpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWc2KTsKKworCW5wLT5pbl9zaHV0ZG93biA9IDA7CisKKwkvKiAzKSBzZXQgbWFjIGFkZHJlc3MgKi8KKwl7CisJCXUzMiBtYWNbMl07CisKKwkJbWFjWzBdID0KKwkJICAgIChuaWMtPm5vZGVfYWRkclswXSA8PCAwKSArIChuaWMtPm5vZGVfYWRkclsxXSA8PCA4KSArCisJCSAgICAobmljLT5ub2RlX2FkZHJbMl0gPDwgMTYpICsgKG5pYy0+bm9kZV9hZGRyWzNdIDw8IDI0KTsKKwkJbWFjWzFdID0KKwkJICAgIChuaWMtPm5vZGVfYWRkcls0XSA8PCAwKSArIChuaWMtPm5vZGVfYWRkcls1XSA8PCA4KTsKKworCQl3cml0ZWwobWFjWzBdLCBiYXNlICsgTnZSZWdNYWNBZGRyQSk7CisJCXdyaXRlbChtYWNbMV0sIGJhc2UgKyBOdlJlZ01hY0FkZHJCKTsKKwl9CisKKwkvKiA0KSBnaXZlIGh3IHJpbmdzICovCisJd3JpdGVsKCh1MzIpIHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbMF0pLAorCSAgICAgICBiYXNlICsgTnZSZWdSeFJpbmdQaHlzQWRkcik7CisJd3JpdGVsKCh1MzIpIHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMF0pLAorCSAgICAgICBiYXNlICsgTnZSZWdUeFJpbmdQaHlzQWRkcik7CisKKwl3cml0ZWwoKChSWF9SSU5HIC0gMSkgPDwgTlZSRUdfUklOR1NaX1JYU0hJRlQpICsKKwkgICAgICAgKChUWF9SSU5HIC0gMSkgPDwgTlZSRUdfUklOR1NaX1RYU0hJRlQpLAorCSAgICAgICBiYXNlICsgTnZSZWdSaW5nU2l6ZXMpOworCisJLyogNSkgY29udGludWUgc2V0dXAgKi8KKwlucC0+bGlua3NwZWVkID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwOworCW5wLT5kdXBsZXggPSAwOworCXdyaXRlbChucC0+bGlua3NwZWVkLCBiYXNlICsgTnZSZWdMaW5rU3BlZWQpOworCXdyaXRlbChOVlJFR19VTktTRVRVUDNfVkFMMSwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnMyk7CisJd3JpdGVsKG5wLT5kZXNjX3ZlciwgYmFzZSArIE52UmVnVHhSeENvbnRyb2wpOworCXBjaV9wdXNoKGJhc2UpOworCXdyaXRlbChOVlJFR19UWFJYQ1RMX0JJVDEgfCBucC0+ZGVzY192ZXIsIGJhc2UgKyBOdlJlZ1R4UnhDb250cm9sKTsKKwlyZWdfZGVsYXkoTnZSZWdVbmtub3duU2V0dXBSZWc1LCBOVlJFR19VTktTRVRVUDVfQklUMzEsCisJCSAgTlZSRUdfVU5LU0VUVVA1X0JJVDMxLCBOVl9TRVRVUDVfREVMQVksCisJCSAgTlZfU0VUVVA1X0RFTEFZTUFYLAorCQkgICJvcGVuOiBTZXR1cFJlZzUsIEJpdCAzMSByZW1haW5lZCBvZmZcbiIpOworCisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzQpOworLy8gICAgICAgd3JpdGVsKE5WUkVHX0lSUVNUQVRfTUFTSywgYmFzZSArIE52UmVnSXJxU3RhdHVzKTsKKwl3cml0ZWwoTlZSRUdfTUlJU1RBVF9NQVNLMiwgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKyNpZiAwCisJcHJpbnRmKCIlZC1NYnMgTGluaywgJXMtRHVwbGV4XG4iLAorCSAgICAgICBucC0+bGlua3NwZWVkICYgTlZSRUdfTElOS1NQRUVEXzEwID8gMTAgOiAxMDAsCisJICAgICAgIG5wLT5kdXBsZXggPyAiRnVsbCIgOiAiSGFsZiIpOworI2VuZGlmCisKKwkvKiA2KSBjb250aW51ZSBzZXR1cCAqLworCXdyaXRlbChOVlJFR19NSVNDMV9GT1JDRSB8IE5WUkVHX01JU0MxX0hELCBiYXNlICsgTnZSZWdNaXNjMSk7CisJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyU3RhdHVzKSwKKwkgICAgICAgYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJTdGF0dXMpOworCXdyaXRlbChOVlJFR19QRkZfQUxXQVlTLCBiYXNlICsgTnZSZWdQYWNrZXRGaWx0ZXJGbGFncyk7CisJd3JpdGVsKE5WUkVHX09GRkxPQURfTk9STUFMLCBiYXNlICsgTnZSZWdPZmZsb2FkQ29uZmlnKTsKKworCXdyaXRlbChyZWFkbChiYXNlICsgTnZSZWdSZWNlaXZlclN0YXR1cyksCisJICAgICAgIGJhc2UgKyBOdlJlZ1JlY2VpdmVyU3RhdHVzKTsKKworCS8qIEdldCBhIHJhbmRvbSBudW1iZXIgKi8KKwlpID0gcmFuZG9tKCk7CisJd3JpdGVsKE5WUkVHX1JORFNFRURfRk9SQ0UgfCAoaSAmIE5WUkVHX1JORFNFRURfTUFTSyksCisJICAgICAgIGJhc2UgKyBOdlJlZ1JhbmRvbVNlZWQpOworCXdyaXRlbChOVlJFR19VTktTRVRVUDFfVkFMLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWcxKTsKKwl3cml0ZWwoTlZSRUdfVU5LU0VUVVAyX1ZBTCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnMik7CisJd3JpdGVsKE5WUkVHX1BPTExfREVGQVVMVCwgYmFzZSArIE52UmVnUG9sbGluZ0ludGVydmFsKTsKKwl3cml0ZWwoTlZSRUdfVU5LU0VUVVA2X1ZBTCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnNik7CisJd3JpdGVsKChucC0+CisJCXBoeWFkZHIgPDwgTlZSRUdfQURBUFRDVExfUEhZU0hJRlQpIHwKKwkgICAgICAgTlZSRUdfQURBUFRDVExfUEhZVkFMSUQgfCBOVlJFR19BREFQVENUTF9SVU5OSU5HLAorCSAgICAgICBiYXNlICsgTnZSZWdBZGFwdGVyQ29udHJvbCk7CisJd3JpdGVsKE5WUkVHX01JSVNQRUVEX0JJVDggfCBOVlJFR19NSUlERUxBWSwgYmFzZSArIE52UmVnTUlJU3BlZWQpOworCXdyaXRlbChOVlJFR19VTktTRVRVUDRfVkFMLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWc0KTsKKwl3cml0ZWwoTlZSRUdfV0FLRVVQRkxBR1NfVkFMLCBiYXNlICsgTnZSZWdXYWtlVXBGbGFncyk7CisKKwlpID0gcmVhZGwoYmFzZSArIE52UmVnUG93ZXJTdGF0ZSk7CisJaWYgKChpICYgTlZSRUdfUE9XRVJTVEFURV9QT1dFUkVEVVApID09IDApCisJCXdyaXRlbChOVlJFR19QT1dFUlNUQVRFX1BPV0VSRURVUCB8IGksCisJCSAgICAgICBiYXNlICsgTnZSZWdQb3dlclN0YXRlKTsKKworCXBjaV9wdXNoKGJhc2UpOworCXVkZWxheSgxMCk7CisJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1Bvd2VyU3RhdGUpIHwgTlZSRUdfUE9XRVJTVEFURV9WQUxJRCwKKwkgICAgICAgYmFzZSArIE52UmVnUG93ZXJTdGF0ZSk7CisKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnSXJxTWFzayk7CisJcGNpX3B1c2goYmFzZSk7CisJd3JpdGVsKE5WUkVHX01JSVNUQVRfTUFTSzIsIGJhc2UgKyBOdlJlZ01JSVN0YXR1cyk7CisJd3JpdGVsKE5WUkVHX0lSUVNUQVRfTUFTSywgYmFzZSArIE52UmVnSXJxU3RhdHVzKTsKKwlwY2lfcHVzaChiYXNlKTsKKy8qCisJd3JpdGVsKG5wLT5pcnFtYXNrLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKyovCisJd3JpdGVsKE5WUkVHX01DQVNUQUREUkFfRk9SQ0UsIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJBKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0QWRkckIpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdE1hc2tCKTsKKwl3cml0ZWwoTlZSRUdfUEZGX0FMV0FZUyB8IE5WUkVHX1BGRl9NWUFERFIsCisJICAgICAgIGJhc2UgKyBOdlJlZ1BhY2tldEZpbHRlckZsYWdzKTsKKworCXNldF9tdWx0aWNhc3QobmljKTsKKwkvKiBPbmUgbWFudWFsIGxpbmsgc3BlZWQgdXBkYXRlOiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkLCBmdXR1cmUgbGluaworCSAqIHNwZWVkIGNoYW5nZXMgY2F1c2UgaW50ZXJydXB0cyBhbmQgYXJlIGhhbmRsZWQgYnkgbnZfbGlua19pcnEoKS4KKwkgKi8KKwl7CisJCXUzMiBtaWlzdGF0OworCQltaWlzdGF0ID0gcmVhZGwoYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKwkJd3JpdGVsKE5WUkVHX01JSVNUQVRfTUFTSywgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKwkJZHByaW50ZigoInN0YXJ0dXA6IGdvdCAweCVoWC5cbiIsIG1paXN0YXQpKTsKKwl9CisJcmV0ID0gdXBkYXRlX2xpbmtzcGVlZChuaWMpOworCisJLy9zdGFydF9yeChuaWMpOworCXN0YXJ0X3R4KG5pYyk7CisKKwlpZiAocmV0KSB7CisJCS8vU3RhcnQgQ29ubmVjdGlvbiBuZXRpZl9jYXJyaWVyX29uKGRldik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJubyBsaW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIAorICogZXh0ZXJuIHZvaWQgaGV4X2R1bXAoY29uc3QgY2hhciAqZGF0YSwgY29uc3QgdW5zaWduZWQgaW50IGxlbik7CisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBmb3JjZWRldGhfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKwkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCisJLyogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4gKi8KKwkvKiBuaWMtPnBhY2tldGxlbiBzaG91bGQgY29udGFpbiBsZW5ndGggb2YgZGF0YSAqLworCisJaW50IGxlbjsKKwlpbnQgaTsKKwl1MzIgRmxhZ3M7CisKKwlpID0gbnAtPmN1cl9yeCAlIFJYX1JJTkc7CisKKwlGbGFncyA9IGxlMzJfdG9fY3B1KHJ4X3JpbmdbaV0uRmxhZ0xlbik7CisJbGVuID0gbnZfZGVzY3JfZ2V0bGVuZ3RoKCZyeF9yaW5nW2ldLCBucC0+ZGVzY192ZXIpOworCisJaWYgKEZsYWdzICYgTlZfUlhfQVZBSUwpCisJCXJldHVybiAwOwkvKiBzdGlsbCBvd25lZCBieSBoYXJkd2FyZSwgKi8KKworCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSkgeworCQlpZiAoIShGbGFncyAmIE5WX1JYX0RFU0NSSVBUT1JWQUxJRCkpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAoIShGbGFncyAmIE5WX1JYMl9ERVNDUklQVE9SVkFMSUQpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyZXRyaWV2ZSkKKwkJcmV0dXJuIDE7CisKKwkvKiBnb3QgYSB2YWxpZCBwYWNrZXQgLSBmb3J3YXJkIGl0IHRvIHRoZSBuZXR3b3JrIGNvcmUgKi8KKwluaWMtPnBhY2tldGxlbiA9IGxlbjsKKwltZW1jcHkobmljLT5wYWNrZXQsIHJ4YiArIChpICogUlhfTklDX0JVRlNJWkUpLCBuaWMtPnBhY2tldGxlbik7CisvKgorICogCWhleF9kdW1wKHJ4YiArIChpICogUlhfTklDX0JVRlNJWkUpLCBsZW4pOworKi8KKwl3bWIoKTsKKwlucC0+Y3VyX3J4Kys7CisJYWxsb2NfcngobmljKTsKKwlyZXR1cm4gMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZm9yY2VkZXRoX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdCwJLyogVHlwZSAqLworCQkJICAgICAgIHVuc2lnbmVkIGludCBzLAkvKiBzaXplICovCisJCQkgICAgICAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisJdTggKnB0eGI7CisJdTE2IG5zdHlwZTsKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCWludCBuciA9IG5wLT5uZXh0X3R4ICUgVFhfUklORzsKKworCS8qIHBvaW50IHRvIHRoZSBjdXJyZW50IHR4YiBpbmNhc2UgbXVsdGlwbGUgdHhfcmluZ3MgYXJlIHVzZWQgKi8KKwlwdHhiID0gdHhiICsgKG5yICogUlhfTklDX0JVRlNJWkUpOworCS8vbnAtPnR4X3NrYnVmZltucl0gPSBwdHhiOworCisJLyogY29weSB0aGUgcGFja2V0IHRvIHJpbmcgYnVmZmVyICovCisJbWVtY3B5KHB0eGIsIGQsIEVUSF9BTEVOKTsJLyogZHN0ICovCisJbWVtY3B5KHB0eGIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsJLyogc3JjICovCisJbnN0eXBlID0gaHRvbnMoKHUxNikgdCk7CS8qIHR5cGUgKi8KKwltZW1jcHkocHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopICYgbnN0eXBlLCAyKTsJLyogdHlwZSAqLworCW1lbWNweShwdHhiICsgRVRIX0hMRU4sIHAsIHMpOworCisJcyArPSBFVEhfSExFTjsKKwl3aGlsZSAocyA8IEVUSF9aTEVOKQkvKiBwYWQgdG8gbWluIGxlbmd0aCAqLworCQlwdHhiW3MrK10gPSAnXDAnOworCisJdHhfcmluZ1tucl0uUGFja2V0QnVmZmVyID0gKHUzMikgdmlydF90b19sZTMyZGVzYyhwdHhiKTsKKworCXdtYigpOworCXR4X3JpbmdbbnJdLkZsYWdMZW4gPSBjcHVfdG9fbGUzMigocyAtIDEpIHwgbnAtPnR4X2ZsYWdzKTsKKworCXdyaXRlbChOVlJFR19UWFJYQ1RMX0tJQ0sgfCBucC0+ZGVzY192ZXIsIGJhc2UgKyBOdlJlZ1R4UnhDb250cm9sKTsKKwlwY2lfcHVzaChiYXNlKTsKKwlucC0+bmV4dF90eCsrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGZvcmNlZGV0aF9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljIF9fdW51c2VkICkgeworCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLworCS8qIFRoaXMgZnVuY3Rpb24gc2VydmVzIDMgcHVycG9zZXMuCisJICogVGhpcyBkaXNhYmxlcyBETUEgYW5kIGludGVycnVwdHMgc28gd2UgZG9uJ3QgcmVjZWl2ZQorCSAqICB1bmV4cGVjdGVkIHBhY2tldHMgb3IgaW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFmdGVyCisJICogIGV0aGVyYm9vdCBoYXMgZmluaXNoZWQuIAorCSAqIFRoaXMgZnJlZXMgcmVzb3VyY2VzIHNvIGV0aGVyYm9vdCBtYXkgdXNlCisJICogIHRoaXMgZHJpdmVyIG9uIGFub3RoZXIgaW50ZXJmYWNlCisJICogVGhpcyBhbGxvd3MgZXRoZXJib290IHRvIHJlaW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlCisJICogIGlmIHNvbWV0aGluZyBpcyBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKwkgKi8KKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCW5wLT5pbl9zaHV0ZG93biA9IDE7CisJc3RvcF90eCgpOworCXN0b3BfcngoKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgbmljIG9yIHdlIHdpbGwgbG9jayB1cCAqLworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKwlwY2lfcHVzaChiYXNlKTsKKwlkcHJpbnRmKCgiSXJxbWFzayBpcyB6ZXJvIGFnYWluXG4iKSk7CisKKwkvKiBzcGVjaWEgb3A6byB3cml0ZSBiYWNrIHRoZSBtaXNvcmRlcmVkIE1BQyBhZGRyZXNzIC0gb3RoZXJ3aXNlCisJICogdGhlIG5leHQgcHJvYmVfbmljIHdvdWxkIHNlZSBhIHdyb25nIGFkZHJlc3MuCisJICovCisJd3JpdGVsKG5wLT5vcmlnX21hY1swXSwgYmFzZSArIE52UmVnTWFjQWRkckEpOworCXdyaXRlbChucC0+b3JpZ19tYWNbMV0sIGJhc2UgKyBOdlJlZ01hY0FkZHJCKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJUlEgLSBFbmFibGUsIERpc2FibGUsIG9yIEZvcmNlIGludGVycnVwdHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGZvcmNlZGV0aF9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLAorCQkJICBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBESVNBQkxFOgorCQlicmVhazsKKwljYXNlIEVOQUJMRToKKwkJYnJlYWs7CisJY2FzZSBGT1JDRToKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIGZvcmNlZGV0aF9vcGVyYXRpb25zID0geworCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKKwkucG9sbAkJPSBmb3JjZWRldGhfcG9sbCwKKwkudHJhbnNtaXQJPSBmb3JjZWRldGhfdHJhbnNtaXQsCisJLmlycQkJPSBmb3JjZWRldGhfaXJxLAorCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJT1JFU09VUkNFX01FTSAweDAwMDAwMjAwCisjZGVmaW5lIGJvYXJkX2ZvdW5kIDEKKyNkZWZpbmUgdmFsaWRfbGluayAwCitzdGF0aWMgaW50IGZvcmNlZGV0aF9wcm9iZSAoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgc3o7CisJdTggKmJhc2U7CisJaW50IGk7CisJc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkcyA9IHBjaS0+ZHJpdmVyLT5pZHM7CisJaW50IGlkX2NvdW50ID0gcGNpLT5kcml2ZXItPmlkX2NvdW50OworCXVuc2lnbmVkIGludCBmbGFncyA9IDA7CisKKwlpZiAocGNpLT5pb2FkZHIgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoImZvcmNlZGV0aC5jOiBGb3VuZCAlcywgdmVuZG9yPTB4JWhYLCBkZXZpY2U9MHglaFhcbiIsCisJICAgICAgIHBjaS0+ZHJpdmVyX25hbWUsIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSk7CisKKyAgICAgICAgbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkcjsKKyAgICAgICAgbmljLT5pcnFubyA9IDA7CisKKwkvKiBwb2ludCB0byBwcml2YXRlIHN0b3JhZ2UgKi8KKwlucCA9ICZucHg7CisKKwlhZGp1c3RfcGNpX2RldmljZShwY2kpOworCisJYWRkciA9IHBjaV9iYXJfc3RhcnQocGNpLCBQQ0lfQkFTRV9BRERSRVNTXzApOworCXN6ID0gcGNpX2Jhcl9zaXplKHBjaSwgUENJX0JBU0VfQUREUkVTU18wKTsKKworCS8qIEJBU0UgaXMgdXNlZCB0aHJvdWdob3V0IHRvIGFkZHJlc3MgdGhlIGNhcmQgKi8KKwlCQVNFID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAoYWRkciwgc3opOworCWlmICghQkFTRSkKKwkJcmV0dXJuIDA7CisKKwkvKiBoYW5kbGUgZGlmZmVyZW50IGRlc2NyaXB0b3IgdmVyc2lvbnMgKi8KKwlpZiAocGNpLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzEgfHwKKwkgICAgcGNpLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzIgfHwKKwkgICAgcGNpLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzMpCisJCW5wLT5kZXNjX3ZlciA9IERFU0NfVkVSXzE7CisJZWxzZQorCQlucC0+ZGVzY192ZXIgPSBERVNDX1ZFUl8yOworCisJLy9yeF9yaW5nWzBdID0gcnhfcmluZzsKKwkvL3R4X3JpbmdbMF0gPSB0eF9yaW5nOyAKKworCS8qIHJlYWQgdGhlIG1hYyBhZGRyZXNzICovCisJYmFzZSA9ICh1OCAqKSBCQVNFOworCW5wLT5vcmlnX21hY1swXSA9IHJlYWRsKGJhc2UgKyBOdlJlZ01hY0FkZHJBKTsKKwlucC0+b3JpZ19tYWNbMV0gPSByZWFkbChiYXNlICsgTnZSZWdNYWNBZGRyQik7CisKKwkvKiBsb29rdXAgdGhlIGZsYWdzIGZyb20gcGNpX2RldmljZV9pZCAqLworCWZvcihpID0gMDsgaSA8IGlkX2NvdW50OyBpKyspIHsKKwkJaWYocGNpLT52ZW5kb3IgPT0gaWRzW2ldLnZlbmRvciAmJgorCQkgICBwY2ktPmRldmljZSA9PSBpZHNbaV0uZGV2aWNlKSB7CisJCQlmbGFncyA9IGlkc1tpXS5kcml2ZXJfZGF0YTsKKwkJCWJyZWFrOworCQkgICB9CisJfQorCisJLyogcmVhZCBNQUMgYWRkcmVzcyAqLworCWlmKGZsYWdzICYgTUFDX0FERFJfQ09SUkVDVCkgeworCQluaWMtPm5vZGVfYWRkclswXSA9IChucC0+b3JpZ19tYWNbMF0gPj4gIDApICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbMV0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICA4KSAmIDB4ZmY7CisJCW5pYy0+bm9kZV9hZGRyWzJdID0gKG5wLT5vcmlnX21hY1swXSA+PiAxNikgJiAweGZmOworCQluaWMtPm5vZGVfYWRkclszXSA9IChucC0+b3JpZ19tYWNbMF0gPj4gMjQpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbNF0gPSAobnAtPm9yaWdfbWFjWzFdID4+ICAwKSAmIDB4ZmY7CisJCW5pYy0+bm9kZV9hZGRyWzVdID0gKG5wLT5vcmlnX21hY1sxXSA+PiAgOCkgJiAweGZmOworCX0gZWxzZSB7CisJCW5pYy0+bm9kZV9hZGRyWzBdID0gKG5wLT5vcmlnX21hY1sxXSA+PiAgOCkgJiAweGZmOworCQluaWMtPm5vZGVfYWRkclsxXSA9IChucC0+b3JpZ19tYWNbMV0gPj4gIDApICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbMl0gPSAobnAtPm9yaWdfbWFjWzBdID4+IDI0KSAmIDB4ZmY7CisJCW5pYy0+bm9kZV9hZGRyWzNdID0gKG5wLT5vcmlnX21hY1swXSA+PiAxNikgJiAweGZmOworCQluaWMtPm5vZGVfYWRkcls0XSA9IChucC0+b3JpZ19tYWNbMF0gPj4gIDgpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbNV0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICAwKSAmIDB4ZmY7CisJfQorI2lmZGVmIExJTlVYCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCS8qCisJCSAqIEJhZCBtYWMgYWRkcmVzcy4gQXQgbGVhc3Qgb25lIGJpb3Mgc2V0cyB0aGUgbWFjIGFkZHJlc3MKKwkJICogdG8gMDE6MjM6NDU6Njc6ODk6YWIKKwkJICovCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBJbnZhbGlkIE1hYyBhZGRyZXNzIGRldGVjdGVkOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBjaV9kZXYpLCBkZXYtPmRldl9hZGRyWzBdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzVdKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiUGxlYXNlIGNvbXBsYWluIHRvIHlvdXIgaGFyZHdhcmUgdmVuZG9yLiBTd2l0Y2hpbmcgdG8gYSByYW5kb20gTUFDLlxuIik7CisJCWRldi0+ZGV2X2FkZHJbMF0gPSAweDAwOworCQlkZXYtPmRldl9hZGRyWzFdID0gMHgwMDsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IDB4NmM7CisJCWdldF9yYW5kb21fYnl0ZXMoJmRldi0+ZGV2X2FkZHJbM10sIDMpOworCX0KKyNlbmRpZgorCisJREJHICggIiVzOiBNQUMgQWRkcmVzcyAlc1xuIiwgcGNpLT5kcml2ZXJfbmFtZSwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApICk7CisKKyAJLyogZGlzYWJsZSBXT0wgKi8KKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnV2FrZVVwRmxhZ3MpOworIAlucC0+d29sZW5hYmxlZCA9IDA7CisJCisgCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSkgeworIAkJbnAtPnR4X2ZsYWdzID0gTlZfVFhfTEFTVFBBQ0tFVCB8IE5WX1RYX1ZBTElEOworIAl9IGVsc2UgeworIAkJbnAtPnR4X2ZsYWdzID0gTlZfVFgyX0xBU1RQQUNLRVQgfCBOVl9UWDJfVkFMSUQ7CisgCX0KKworICAJc3dpdGNoIChwY2ktPmRldmljZSkgeworICAJY2FzZSAweDAxQzM6CQkvLyBuZm9yY2UKKwljYXNlIDB4MDU0QzoKKyAJCS8vIERFVl9JUlFNQVNLXzF8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSLAorIAkJbnAtPmlycW1hc2sgPSBOVlJFR19JUlFNQVNLX1dBTlRFRF8yIHwgTlZSRUdfSVJRX1RJTUVSOworCQkvLyAgICAgICAgICAgICAgbnAtPm5lZWRfbGlua3RpbWVyID0gMTsKKwkJLy8gICAgICAgICAgICAgIG5wLT5saW5rX3RpbWVvdXQgPSBqaWZmaWVzICsgTElOS19USU1FT1VUOworICAJCWJyZWFrOworIAljYXNlIDB4MDA2NjoKKyAJCS8qIEZhbGwgVGhyb3VnaCAqLworIAljYXNlIDB4MDBENjoKKyAJCS8vIERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSCisgIAkJbnAtPmlycW1hc2sgPSBOVlJFR19JUlFNQVNLX1dBTlRFRF8yOworICAJCW5wLT5pcnFtYXNrIHw9IE5WUkVHX0lSUV9USU1FUjsKKwkJLy8gICAgICAgICAgICAgIG5wLT5uZWVkX2xpbmt0aW1lciA9IDE7CisJCS8vICAgICAgICAgICAgICBucC0+bGlua190aW1lb3V0ID0gamlmZmllcyArIExJTktfVElNRU9VVDsKKyAJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSkKKyAJCQlucC0+dHhfZmxhZ3MgfD0gTlZfVFhfTEFTVFBBQ0tFVDE7CisgCQllbHNlCisgCQkJbnAtPnR4X2ZsYWdzIHw9IE5WX1RYMl9MQVNUUEFDS0VUMTsKKyAgCQlicmVhazsKKwljYXNlIDB4MDM3MzoKKwkJLyogRmFsbCBUaHJvdWdoICovCisgCWNhc2UgMHgwMDg2OgorIAkJLyogRmFsbCBUaHJvdWdoICovCisgCWNhc2UgMHgwMDhjOgorIAkJLyogRmFsbCBUaHJvdWdoICovCisgCWNhc2UgMHgwMGU2OgorIAkJLyogRmFsbCBUaHJvdWdoICovCisgCWNhc2UgMHgwMGRmOgorCQkvKiBGYWxsIFRocm91Z2ggKi8KKyAJY2FzZSAweDAwNTY6CisgCQkvKiBGYWxsIFRocm91Z2ggKi8KKyAJY2FzZSAweDAwNTc6CisgCQkvKiBGYWxsIFRocm91Z2ggKi8KKyAJY2FzZSAweDAwMzc6CisgCQkvKiBGYWxsIFRocm91Z2ggKi8KKyAJY2FzZSAweDAwMzg6CisgCQkvL0RFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEKKyAgCQlucC0+aXJxbWFzayA9IE5WUkVHX0lSUU1BU0tfV0FOVEVEXzI7CisgIAkJbnAtPmlycW1hc2sgfD0gTlZSRUdfSVJRX1RJTUVSOworCQkvLyAgICAgICAgICAgICAgbnAtPm5lZWRfbGlua3RpbWVyID0gMTsKKwkJLy8gICAgICAgICAgICAgIG5wLT5saW5rX3RpbWVvdXQgPSBqaWZmaWVzICsgTElOS19USU1FT1VUOworIAkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xKQorIAkJCW5wLT50eF9mbGFncyB8PSBOVl9UWF9MQVNUUEFDS0VUMTsKKyAJCWVsc2UKKyAJCQlucC0+dHhfZmxhZ3MgfD0gTlZfVFgyX0xBU1RQQUNLRVQxOworIAkJYnJlYWs7CisgCWRlZmF1bHQ6CisgCQlwcmludGYKKwkJCSgiWW91ciBjYXJkIHdhcyB1bmRlZmluZWQgaW4gdGhpcyBkcml2ZXIuICBSZXZpZXcgZHJpdmVyX2RhdGEgaW4gTGludXggZHJpdmVyIGFuZCBzZW5kIGEgcGF0Y2hcbiIpOworIAl9CisJCisgCS8qIGZpbmQgYSBzdWl0YWJsZSBwaHkgKi8KKyAJZm9yIChpID0gMTsgaSA8IDMyOyBpKyspIHsKKyAJCWludCBpZDEsIGlkMjsKKyAJCWlkMSA9IG1paV9ydyhuaWMsIGksIE1JSV9QSFlTSUQxLCBNSUlfUkVBRCk7CisgCQlpZiAoaWQxIDwgMCB8fCBpZDEgPT0gMHhmZmZmKQorIAkJCWNvbnRpbnVlOworIAkJaWQyID0gbWlpX3J3KG5pYywgaSwgTUlJX1BIWVNJRDIsIE1JSV9SRUFEKTsKKyAJCWlmIChpZDIgPCAwIHx8IGlkMiA9PSAweGZmZmYpCisgCQkJY29udGludWU7CisgCQlpZDEgPSAoaWQxICYgUEhZSUQxX09VSV9NQVNLKSA8PCBQSFlJRDFfT1VJX1NIRlQ7CisgCQlpZDIgPSAoaWQyICYgUEhZSUQyX09VSV9NQVNLKSA+PiBQSFlJRDJfT1VJX1NIRlQ7CisgCQlkcHJpbnRmCisJCQkoKCIlczogb3BlbjogRm91bmQgUEhZICVoWDolaFggYXQgYWRkcmVzcyAlZC5cbiIsCisJCQkgIHBjaS0+ZHJpdmVyX25hbWUsIGlkMSwgaWQyLCBpKSk7CisgCQlucC0+cGh5YWRkciA9IGk7CisgCQlucC0+cGh5X291aSA9IGlkMSB8IGlkMjsKKyAJCWJyZWFrOworIAl9CisgCWlmIChpID09IDMyKSB7CisgCQkvKiBQSFkgaW4gaXNvbGF0ZSBtb2RlPyBObyBwaHkgYXR0YWNoZWQgYW5kIHVzZXIgd2FudHMgdG8KKyAJCSAqIHRlc3QgbG9vcGJhY2s/IFZlcnkgb2RkLCBidXQgY2FuIGJlIGNvcnJlY3QuCisgCQkgKi8KKyAJCXByaW50ZgorCQkJKCIlczogb3BlbjogQ291bGQgbm90IGZpbmQgYSB2YWxpZCBQSFkuXG4iLCBwY2ktPmRyaXZlcl9uYW1lKTsKKyAJfQorCQorIAlpZiAoaSAhPSAzMikgeworIAkJLyogcmVzZXQgaXQgKi8KKyAJCXBoeV9pbml0KG5pYyk7CisgCX0KKwkKKwlkcHJpbnRmKCgiJXM6IGZvcmNlZGV0aC5jOiBzdWJzeXN0ZW06ICVoWDolaFggYm91bmQgdG8gJXNcbiIsCisJCSBwY2ktPmRyaXZlcl9uYW1lLCBwY2ktPnZlbmRvciwgcGNpLT5kZXZfaWQsIHBjaS0+ZHJpdmVyX25hbWUpKTsKKwlpZighZm9yY2VkZXRoX3Jlc2V0KG5pYykpIHJldHVybiAwOyAvLyBubyB2YWxpZCBsaW5rCisKKwkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwluaWMtPm5pY19vcAk9ICZmb3JjZWRldGhfb3BlcmF0aW9uczsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGZvcmNlZGV0aF9uaWNzW10gPSB7CitQQ0lfUk9NKDB4MTBkZSwgMHgwMUMzLCAibmZvcmNlIiwgIm5Gb3JjZSBOVkVORVRfMSBFdGhlcm5ldCBDb250cm9sbGVyIiwgMCksCitQQ0lfUk9NKDB4MTBkZSwgMHgwMDY2LCAibmZvcmNlMiIsICJuRm9yY2UgTlZFTkVUXzIgRXRoZXJuZXQgQ29udHJvbGxlciIsIDApLAorUENJX1JPTSgweDEwZGUsIDB4MDBENiwgIm5mb3JjZTMiLCAibkZvcmNlIE5WRU5FVF8zIEV0aGVybmV0IENvbnRyb2xsZXIiLCAwKSwKK1BDSV9ST00oMHgxMGRlLCAweDAwODYsICJuZm9yY2U0IiwgIm5Gb3JjZSBOVkVORVRfNCBFdGhlcm5ldCBDb250cm9sbGVyIiwgMCksCitQQ0lfUk9NKDB4MTBkZSwgMHgwMDhjLCAibmZvcmNlNSIsICJuRm9yY2UgTlZFTkVUXzUgRXRoZXJuZXQgQ29udHJvbGxlciIsIDApLAorUENJX1JPTSgweDEwZGUsIDB4MDBlNiwgIm5mb3JjZTYiLCAibkZvcmNlIE5WRU5FVF82IEV0aGVybmV0IENvbnRyb2xsZXIiLCAwKSwKK1BDSV9ST00oMHgxMGRlLCAweDAwZGYsICJuZm9yY2U3IiwgIm5Gb3JjZSBOVkVORVRfNyBFdGhlcm5ldCBDb250cm9sbGVyIiwgMCksCitQQ0lfUk9NKDB4MTBkZSwgMHgwMDU2LCAibmZvcmNlOCIsICJuRm9yY2UgTlZFTkVUXzggRXRoZXJuZXQgQ29udHJvbGxlciIsIDApLAorUENJX1JPTSgweDEwZGUsIDB4MDA1NywgIm5mb3JjZTkiLCAibkZvcmNlIE5WRU5FVF85IEV0aGVybmV0IENvbnRyb2xsZXIiLCAwKSwKK1BDSV9ST00oMHgxMGRlLCAweDAwMzcsICJuZm9yY2UxMCIsICJuRm9yY2UgTlZFTkVUXzEwIEV0aGVybmV0IENvbnRyb2xsZXIiLCAwKSwKK1BDSV9ST00oMHgxMGRlLCAweDAwMzgsICJuZm9yY2UxMSIsICJuRm9yY2UgTlZFTkVUXzExIEV0aGVybmV0IENvbnRyb2xsZXIiLCAwKSwKK1BDSV9ST00oMHgxMGRlLCAweDAzNzMsICJuZm9yY2UxNSIsICJuRm9yY2UgTlZFTkVUXzE1IEV0aGVybmV0IENvbnRyb2xsZXIiLCAwKSwKK1BDSV9ST00oMHgxMGRlLCAweDAyNjksICJuZm9yY2UxNiIsICJuRm9yY2UgTlZFTkVUXzE2IEV0aGVybmV0IENvbnRyb2xsZXIiLCAwKSwKK1BDSV9ST00oMHgxMGRlLCAweDA3NjAsICJuZm9yY2UxNyIsICJuRm9yY2UgTlZFTkVUXzE3IEV0aGVybmV0IENvbnRyb2xsZXIiLCBNQUNfQUREUl9DT1JSRUNUKSwKK1BDSV9ST00oMHgxMGRlLCAweDA1NGMsICJuZm9yY2U2NyIsICJuRm9yY2UgTlZFTkVUXzY3IEV0aGVybmV0IENvbnRyb2xsZXIiLCBNQUNfQUREUl9DT1JSRUNUKSwKK307CisKK1BDSV9EUklWRVIgKCBmb3JjZWRldGhfZHJpdmVyLCBmb3JjZWRldGhfbmljcywgUENJX05PX0NMQVNTICk7CisKK0RSSVZFUiAoICJmb3JjZWRldGgiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCBmb3JjZWRldGhfZHJpdmVyLAorCSBmb3JjZWRldGhfcHJvYmUsIGZvcmNlZGV0aF9kaXNhYmxlICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9oZmEzODR4LmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9oZmEzODR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzY2NmNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L2hmYTM4NHguaApAQCAtMCwwICsxLDMwNjkgQEAKKy8qIHNyYy9wcmlzbTIvaW5jbHVkZS9wcmlzbTIvaGZhMzg0eC5oCisqCisqIERlZmluZXMgdGhlIGNvbnN0YW50cyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgaGZhMzg0eAorKgorKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKgorKiBsaW51eC13bGFuCisqCisqICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKKyogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworKgorKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUworKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKgorKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisqICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCisqICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisqICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgorKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisqICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCisqICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKKyogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisqCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqCisqIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKKyogbWFkZSBkaXJlY3RseSB0bzoKKyoKKyogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KKyogaW5mb0BsaW51eC13bGFuLmNvbQorKiBodHRwOi8vd3d3LmxpbnV4LXdsYW4uY29tCisqCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqCisqIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5IAorKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KKyoKKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoKKyogICBbSW1wbGVtZW50YXRpb24gYW5kIHVzYWdlIG5vdGVzXQorKgorKiAgIFtSZWZlcmVuY2VzXQorKglDVzEwIFByb2dyYW1tZXIncyBNYW51YWwgdjEuNQorKglJRUVFIDgwMi4xMSBEMTAuMAorKgorKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKyNpZm5kZWYgX0hGQTM4NHhfSAorI2RlZmluZSBfSEZBMzg0eF9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIEhGQTM4NHhfRklSTVdBUkVfVkVSU0lPTihhLGIsYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSkKKworI2RlZmluZSBIRkEzODR4X0xFVkVMX1RPX2RCbSh2KSAgICgweDEwMCArICh2KSAqIDEwMCAvIDI1NSAtIDEwMCkKKworLyotLS0tLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIE1pbnMgJiBNYXhzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NSU4JKChVSU5UMTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NQVgJKChVSU5UMTYpMjQwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQkFQX0RBVEFMRU5fTUFYCQkoKFVJTlQxNik0MDk2KQorI2RlZmluZQkJSEZBMzg0eF9CQVBfT0ZGU0VUX01BWAkJKChVSU5UMTYpNDA5NikKKyNkZWZpbmUJCUhGQTM4NHhfUE9SVElEX01BWAkJKChVSU5UMTYpNykKKyNkZWZpbmUJCUhGQTM4NHhfTlVNUE9SVFNfTUFYCQkoKFVJTlQxNikoSEZBMzg0eF9QT1JUSURfTUFYKzEpKQorI2RlZmluZQkJSEZBMzg0eF9QRFJfTEVOX01BWAkJKChVSU5UMTYpNTEyKQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLworI2RlZmluZQkJSEZBMzg0eF9QREFfUkVDU19NQVgJCSgoVUlOVDE2KTIwMCkJLyogYSBndWVzcyAqLworI2RlZmluZQkJSEZBMzg0eF9QREFfTEVOX01BWAkJKChVSU5UMTYpMTAyNCkJLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KKyNkZWZpbmUJCUhGQTM4NHhfU0NBTlJFU1VMVF9NQVgJCSgoVUlOVDE2KTMxKQorI2RlZmluZQkJSEZBMzg0eF9IU0NBTlJFU1VMVF9NQVgJCSgoVUlOVDE2KTMxKQorI2RlZmluZQkJSEZBMzg0eF9DSElORk9SRVNVTFRfTUFYCSgoVUlOVDE2KTE2KQorI2RlZmluZQkJSEZBMzg0eF9EUlZSX0ZJRFNUQUNLTEVOX01BWAkoMTApCisjZGVmaW5lCQlIRkEzODR4X0RSVlJfVFhCVUZfTUFYCQkoc2l6ZW9mKGhmYTM4NHhfdHhfZnJhbWVfdCkgKyBcCisJCQkJCQlXTEFOX0RBVEFfTUFYTEVOIC0gXAorCQkJCQkJV0xBTl9XRVBfSVZfTEVOIC0gXAorCQkJCQkJV0xBTl9XRVBfSUNWX0xFTiArIDIpCisjZGVmaW5lCQlIRkEzODR4X0RSVlJfTUFHSUMJCSgweDRhMmQpCisjZGVmaW5lCQlIRkEzODR4X0lORk9EQVRBX01BWExFTgkJKHNpemVvZihoZmEzODR4X2luZm9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9JTkZPRlJNX01BWExFTgkJKHNpemVvZihoZmEzODR4X0luZkZyYW1lX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfR1VFU1NJTkdfTUFYTEVOCTIwNDggIC8qIEknbSBub3QgcmVhbGx5IHN1cmUgKi8KKyNkZWZpbmUJCUhGQTM4NHhfUklEREFUQV9NQVhMRU4JCUhGQTM4NHhfUklEX0dVRVNTSU5HX01BWExFTgkKKyNkZWZpbmUJCUhGQTM4NHhfVVNCX1JXTUVNX01BWExFTgkyMDQ4CisKKy8qLS0tIFN1cHBvcnQgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfQkFQX1BST0MJCQkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9CQVBfSU5UCQkJCSgoVUlOVDE2KTEpCisjZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0lCU1MJCQkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9CU1MJCQkoKFVJTlQxNikxKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9XRFMJCQkoKFVJTlQxNikyKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9QU1VFRE9JQlNTCQkoKFVJTlQxNikzKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9IT1NUQVAgICAgCQkoKFVJTlQxNik2KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19QUklWSU5WT0tFRAkJKChVSU5UMTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRVhDTFVERQkJKChVSU5UMTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRElTQUJMRV9UWENSWVBUCSgoVUlOVDE2KUJJVDQpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0RJU0FCTEVfUlhDUllQVAkoKFVJTlQxNilCSVQ3KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19ESVNBTExPV19NSVhFRCAJKChVSU5UMTYpQklUMTEpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX0lOVEVSVkFMMQkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfSU5URVJWQUwxMAkJKChVSU5UMTYpQklUNSkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfSU5URVJWQUw1MAkJKChVSU5UMTYpQklUNikKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfSU5URVJWQUwxMDAJCSgoVUlOVDE2KShCSVQ1IHwgQklUNikpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0ZJUk1XQVJFX1dQQSAgCQkoKFVJTlQxNilCSVQ4KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19IT1NUX01JQyAgICAgIAkJKChVSU5UMTYpQklUOSkKKyNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfRldTQ0FOX0ZXUk9BTQkJKChVSU5UMTYpMSkKKyNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfRldTQ0FOX0hPU1RST0FNCSgoVUlOVDE2KTIpCisjZGVmaW5lIAlIRkEzODR4X1JPQU1NT0RFX0hPU1RTQ0FOX0hPU1RST0FNCSgoVUlOVDE2KTMpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfRElTQUJMRUQJCSgoVUlOVDE2KTEpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfSU5JVFNSQ0gJCSgoVUlOVDE2KTIpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9JQlNTCQkoKFVJTlQxNikzKQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0NPTk5fRVNTCQkoKFVJTlQxNik0KQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX09PUl9FU1MJCSgoVUlOVDE2KTUpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9XRFMJCSgoVUlOVDE2KTYpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfSE9TVEFQCQkoKFVJTlQxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzEJCQkoKFVJTlQxNikxKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzIJCQkoKFVJTlQxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzVkb3Q1CQkJKChVSU5UMTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xMQkJCSgoVUlOVDE2KTgpCisKKy8qLS0tIEp1c3Qgc29tZSBzeW1ib2xpYyBuYW1lcyBmb3IgbGVnaWJpbGl0eSAtLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfVFhDTURfTk9SRUNMCQkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9UWENNRF9SRUNMCQkoKFVJTlQxNikxKQorCisvKi0tLSBNQUMgSW50ZXJuYWwgbWVtb3J5IGNvbnN0YW50cyBhbmQgbWFjcm9zIC0tLS0tLSovCisvKiBtYXNrcyBhbmQgbWFjcm9zIHVzZWQgdG8gbWFuaXB1bGF0ZSBNQUMgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3Nlcy4gKi8KKy8qIE1BQyBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzc2VzIGFyZSAyMyBiaXQgcXVhbnRpdGllcy4gIFRoZSBNQUMgdXNlcyAKKyAqIGEgcGFnZWQgYWRkcmVzcyBzcGFjZSB3aGVyZSB0aGUgdXBwZXIgMTYgYml0cyBhcmUgdGhlIHBhZ2UgbnVtYmVyIAorICogYW5kIHRoZSBsb3dlciA3IGJpdHMgYXJlIHRoZSBvZmZzZXQuICBUaGVyZSBhcmUgdmFyaW91cyBIb3N0IEFQSSAKKyAqIGVsZW1lbnRzIHRoYXQgcmVxdWlyZSB0d28gMTYtYml0IHF1YW50aXRpZXMgdG8gc3BlY2lmeSBhIE1BQyAKKyAqIGludGVybmFsIG1lbW9yeSBhZGRyZXNzLiAgVW5mb3J0dW5hdGVseSwgc29tZSBvZiB0aGUgQVBJJ3MgdXNlIGEgCisgKiBwYWdlL29mZnNldCBmb3JtYXQgd2hlcmUgdGhlIG9mZnNldCB2YWx1ZSBpcyBKVVNUIHRoZSBsb3dlciBzZXZlbiAKKyAqIGJpdHMgYW5kIHRoZSBwYWdlIGlzICB0aGUgcmVtYWluaW5nIDE2IGJpdHMuICBTb21lIG9mIHRoZSBBUEkncyAKKyAqIGFzc3VtZSB0aGF0IHRoZSAyMyBiaXQgYWRkcmVzcyBoYXMgYmVlbiBzcGxpdCBhdCB0aGUgMTZ0aCBiaXQuICBXZSAKKyAqIHJlZmVyIHRvIHRoZXNlIHR3byBmb3JtYXRzIGFzIEFVWCBmb3JtYXQgYW5kIENNRCBmb3JtYXQuICBUaGUgCisgKiBtYWNyb3MgYmVsb3cgaGVscCBoYW5kbGUgc29tZSBvZiB0aGlzLgorICovIAorCisvKiBIYW5keSBjb25zdGFudCAqLworI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFYCSgoVUlOVDE2KTB4MDA3ZikKKworLyogTWFzayBiaXRzIGZvciBkaXNjYXJkaW5nIHVud2FudGVkIHBpZWNlcyBpbiBhIGZsYXQgYWRkcmVzcyAqLworI2RlZmluZQkJSEZBMzg0eF9BRERSX0ZMQVRfQVVYX1BBR0VfTUFTSwkoMHgwMDdmZmY4MCkKKyNkZWZpbmUJCUhGQTM4NHhfQUREUl9GTEFUX0FVWF9PRkZfTUFTSwkoMHgwMDAwMDA3ZikKKyNkZWZpbmUJCUhGQTM4NHhfQUREUl9GTEFUX0NNRF9QQUdFX01BU0sJKDB4ZmZmZjAwMDApCisjZGVmaW5lCQlIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0sJKDB4MDAwMGZmZmYpCisKKy8qIE1hc2sgYml0cyBmb3IgZGlzY2FyZGluZyB1bndhbnRlZCBwaWVjZXMgaW4gQVVYIGZvcm1hdCAxNi1iaXQgYWRkcmVzcyBwYXJ0cyAqLworI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9QQUdFX01BU0sJKDB4ZmZmZikKKyNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfT0ZGX01BU0sJKDB4MDA3ZikKKworLyogTWFzayBiaXRzIGZvciBkaXNjYXJkaW5nIHVud2FudGVkIHBpZWNlcyBpbiBDTUQgZm9ybWF0IDE2LWJpdCBhZGRyZXNzIHBhcnRzICovCisjZGVmaW5lCQlIRkEzODR4X0FERFJfQ01EX1BBR0VfTUFTSwkoMHgwMDdmKQorI2RlZmluZQkJSEZBMzg0eF9BRERSX0NNRF9PRkZfTUFTSwkoMHhmZmZmKQorCisvKiBNYWtlIGEgMzItYml0IGZsYXQgYWRkcmVzcyBmcm9tIEFVWCBmb3JtYXQgMTYtYml0IHBhZ2UgYW5kIG9mZnNldCAqLworI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9NS0ZMQVQocCxvKQlcCisJCSgoKFVJTlQzMikoKChVSU5UMTYpKHApKSZIRkEzODR4X0FERFJfQVVYX1BBR0VfTUFTSykpIDw8NykgfCBcCisJCSgoVUlOVDMyKSgoKFVJTlQxNikobykpJkhGQTM4NHhfQUREUl9BVVhfT0ZGX01BU0spKQorCisvKiBNYWtlIGEgMzItYml0IGZsYXQgYWRkcmVzcyBmcm9tIENNRCBmb3JtYXQgMTYtYml0IHBhZ2UgYW5kIG9mZnNldCAqLworI2RlZmluZQkJSEZBMzg0eF9BRERSX0NNRF9NS0ZMQVQocCxvKQlcCisJCSgoKFVJTlQzMikoKChVSU5UMTYpKHApKSZIRkEzODR4X0FERFJfQ01EX1BBR0VfTUFTSykpIDw8MTYpIHwgXAorCQkoKFVJTlQzMikoKChVSU5UMTYpKG8pKSZIRkEzODR4X0FERFJfQ01EX09GRl9NQVNLKSkKKworLyogTWFrZSBBVVggZm9ybWF0IG9mZnNldCBhbmQgcGFnZSBmcm9tIGEgMzItYml0IGZsYXQgYWRkcmVzcyAqLworI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9NS1BBR0UoZikgXAorCQkoKFVJTlQxNikoKCgoVUlOVDMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQVVYX1BBR0VfTUFTSyk+PjcpKQorI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9NS09GRihmKSBcCisJCSgoVUlOVDE2KSgoKFVJTlQzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0FVWF9PRkZfTUFTSykpCisKKy8qIE1ha2UgQ01EIGZvcm1hdCBvZmZzZXQgYW5kIHBhZ2UgZnJvbSBhIDMyLWJpdCBmbGF0IGFkZHJlc3MgKi8KKyNkZWZpbmUJCUhGQTM4NHhfQUREUl9DTURfTUtQQUdFKGYpIFwKKwkJKChVSU5UMTYpKCgoKFVJTlQzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0NNRF9QQUdFX01BU0spPj4xNikpCisjZGVmaW5lCQlIRkEzODR4X0FERFJfQ01EX01LT0ZGKGYpIFwKKwkJKChVSU5UMTYpKCgoVUlOVDMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQ01EX09GRl9NQVNLKSkKKworLyotLS0gQXV4IHJlZ2lzdGVyIG1hc2tzL3Rlc3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU29tZSBvZiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgQVVYIG9mZnNldCByZWdpc3RlciBhcmUgdXNlZCB0byAqLworLyogIHNlbGVjdCBhZGRyZXNzIHNwYWNlLiAqLworI2RlZmluZQkJSEZBMzg0eF9BVVhfQ1RMX0VYVERTCSgweDAwKQorI2RlZmluZQkJSEZBMzg0eF9BVVhfQ1RMX05WCSgweDAxKQorI2RlZmluZQkJSEZBMzg0eF9BVVhfQ1RMX1BIWQkoMHgwMikKKyNkZWZpbmUJCUhGQTM4NHhfQVVYX0NUTF9JQ1NSQU0JKDB4MDMpCisKKy8qIE1ha2UgQVVYIHJlZ2lzdGVyIG9mZnNldCBhbmQgcGFnZSB2YWx1ZXMgZnJvbSBhIGZsYXQgYWRkcmVzcyAqLworI2RlZmluZQkJSEZBMzg0eF9BVVhfTUtPRkYoZiwgYykgXAorCShIRkEzODR4X0FERFJfQVVYX01LT0ZGKGYpIHwgKCgoVUlOVDE2KShjKSk8PDEyKSkKKyNkZWZpbmUJCUhGQTM4NHhfQVVYX01LUEFHRShmKQlIRkEzODR4X0FERFJfQVVYX01LUEFHRShmKQorCisKKy8qLS0tIENvbnRyb2xsZXIgTWVtb3J5IGFkZHJlc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NDJfUERBX0JBU0UJKDB4MDA3ZjAwMDBVTCkKKyNkZWZpbmUJCUhGQTM4NDFfUERBX0JBU0UJKDB4MDAzZjAwMDBVTCkKKyNkZWZpbmUJCUhGQTM4NDFfUERBX0JPR1VTX0JBU0UJKDB4MDAzOTAwMDBVTCkKKworLyotLS0gRHJpdmVyIERvd25sb2FkIHN0YXRlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJSEZBMzg0eF9ETFNUQVRFX0RJU0FCTEVECQkwCisjZGVmaW5lCQlIRkEzODR4X0RMU1RBVEVfUkFNRU5BQkxFRAkJMQorI2RlZmluZQkJSEZBMzg0eF9ETFNUQVRFX0ZMQVNIRU5BQkxFRAkJMgorI2RlZmluZQkJSEZBMzg0eF9ETFNUQVRFX0ZMQVNIV1JJVFRFTgkJMworI2RlZmluZQkJSEZBMzg0eF9ETFNUQVRFX0ZMQVNIV1JJVEVQRU5ESU5HCTQKKyNkZWZpbmUJCUhGQTM4NHhfRExTVEFURV9HRU5FU0lTIAkJNQorCisvKi0tLSBSZWdpc3RlciBJL08gb2Zmc2V0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKKworI2RlZmluZQkJSEZBMzg0eF9DTURfT0ZGCQkJKDB4MDApCisjZGVmaW5lCQlIRkEzODR4X1BBUkFNMF9PRkYJCSgweDAyKQorI2RlZmluZQkJSEZBMzg0eF9QQVJBTTFfT0ZGCQkoMHgwNCkKKyNkZWZpbmUJCUhGQTM4NHhfUEFSQU0yX09GRgkJKDB4MDYpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19PRkYJCSgweDA4KQorI2RlZmluZQkJSEZBMzg0eF9SRVNQMF9PRkYJCSgweDBBKQorI2RlZmluZQkJSEZBMzg0eF9SRVNQMV9PRkYJCSgweDBDKQorI2RlZmluZQkJSEZBMzg0eF9SRVNQMl9PRkYJCSgweDBFKQorI2RlZmluZQkJSEZBMzg0eF9JTkZPRklEX09GRgkJKDB4MTApCisjZGVmaW5lCQlIRkEzODR4X1JYRklEX09GRgkJKDB4MjApCisjZGVmaW5lCQlIRkEzODR4X0FMTE9DRklEX09GRgkJKDB4MjIpCisjZGVmaW5lCQlIRkEzODR4X1RYQ09NUExGSURfT0ZGCQkoMHgyNCkKKyNkZWZpbmUJCUhGQTM4NHhfU0VMRUNUMF9PRkYJCSgweDE4KQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVQwX09GRgkJKDB4MUMpCisjZGVmaW5lCQlIRkEzODR4X0RBVEEwX09GRgkJKDB4MzYpCisjZGVmaW5lCQlIRkEzODR4X1NFTEVDVDFfT0ZGCQkoMHgxQSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUMV9PRkYJCSgweDFFKQorI2RlZmluZQkJSEZBMzg0eF9EQVRBMV9PRkYJCSgweDM4KQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfT0ZGCQkoMHgzMCkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fT0ZGCQkoMHgzMikKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfT0ZGCQkoMHgzNCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9PRkYJCSgweDE0KQorI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQwX09GRgkJKDB4MjgpCisjZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDFfT0ZGCQkoMHgyQSkKKyNkZWZpbmUJCUhGQTM4NHhfU1dTVVBQT1JUMl9PRkYJCSgweDJDKQorI2RlZmluZQkJSEZBMzg0eF9BVVhQQUdFX09GRgkJKDB4M0EpCisjZGVmaW5lCQlIRkEzODR4X0FVWE9GRlNFVF9PRkYJCSgweDNDKQorI2RlZmluZQkJSEZBMzg0eF9BVVhEQVRBX09GRgkJKDB4M0UpCisKKyNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSB8fCBXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKKworI2RlZmluZQkJSEZBMzg0eF9DTURfT0ZGCQkJKDB4MDApCisjZGVmaW5lCQlIRkEzODR4X1BBUkFNMF9PRkYJCSgweDA0KQorI2RlZmluZQkJSEZBMzg0eF9QQVJBTTFfT0ZGCQkoMHgwOCkKKyNkZWZpbmUJCUhGQTM4NHhfUEFSQU0yX09GRgkJKDB4MGMpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19PRkYJCSgweDEwKQorI2RlZmluZQkJSEZBMzg0eF9SRVNQMF9PRkYJCSgweDE0KQorI2RlZmluZQkJSEZBMzg0eF9SRVNQMV9PRkYJCSgweDE4KQorI2RlZmluZQkJSEZBMzg0eF9SRVNQMl9PRkYJCSgweDFjKQorI2RlZmluZQkJSEZBMzg0eF9JTkZPRklEX09GRgkJKDB4MjApCisjZGVmaW5lCQlIRkEzODR4X1JYRklEX09GRgkJKDB4NDApCisjZGVmaW5lCQlIRkEzODR4X0FMTE9DRklEX09GRgkJKDB4NDQpCisjZGVmaW5lCQlIRkEzODR4X1RYQ09NUExGSURfT0ZGCQkoMHg0OCkKKyNkZWZpbmUJCUhGQTM4NHhfU0VMRUNUMF9PRkYJCSgweDMwKQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVQwX09GRgkJKDB4MzgpCisjZGVmaW5lCQlIRkEzODR4X0RBVEEwX09GRgkJKDB4NmMpCisjZGVmaW5lCQlIRkEzODR4X1NFTEVDVDFfT0ZGCQkoMHgzNCkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUMV9PRkYJCSgweDNjKQorI2RlZmluZQkJSEZBMzg0eF9EQVRBMV9PRkYJCSgweDcwKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfT0ZGCQkoMHg2MCkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fT0ZGCQkoMHg2NCkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfT0ZGCQkoMHg2OCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9PRkYJCSgweDI4KQorI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQwX09GRgkJKDB4NTApCisjZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDFfT0ZGCQkoMHg1NCkKKyNkZWZpbmUJCUhGQTM4NHhfU1dTVVBQT1JUMl9PRkYJCSgweDU4KQorI2RlZmluZQkJSEZBMzg0eF9BVVhQQUdFX09GRgkJKDB4NzQpCisjZGVmaW5lCQlIRkEzODR4X0FVWE9GRlNFVF9PRkYJCSgweDc4KQorI2RlZmluZQkJSEZBMzg0eF9BVVhEQVRBX09GRgkJKDB4N2MpCisjZGVmaW5lCQlIRkEzODR4X1BDSUNPUl9PRkYJCSgweDRjKQorI2RlZmluZQkJSEZBMzg0eF9QQ0lIQ1JfT0ZGCQkoMHg1YykKKyNkZWZpbmUJCUhGQTM4NHhfUENJX00wX0FERFJIX09GRgkoMHg4MCkKKyNkZWZpbmUJCUhGQTM4NHhfUENJX00wX0FERFJMX09GRgkoMHg4NCkKKyNkZWZpbmUJCUhGQTM4NHhfUENJX00wX0xFTl9PRkYJCSgweDg4KQorI2RlZmluZQkJSEZBMzg0eF9QQ0lfTTBfQ1RMX09GRgkJKDB4OGMpCisjZGVmaW5lCQlIRkEzODR4X1BDSV9TVEFUVVNfT0ZGCQkoMHg5OCkKKyNkZWZpbmUJCUhGQTM4NHhfUENJX00xX0FERFJIX09GRgkoMHhhMCkKKyNkZWZpbmUJCUhGQTM4NHhfUENJX00xX0FERFJMX09GRgkoMHhhNCkKKyNkZWZpbmUJCUhGQTM4NHhfUENJX00xX0xFTl9PRkYJCSgweGE4KQorI2RlZmluZQkJSEZBMzg0eF9QQ0lfTTFfQ1RMX09GRgkJKDB4YWMpCisKKyNlbmRpZgorCisvKi0tLSBSZWdpc3RlciBGaWVsZCBNYXNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X0NNRF9CVVNZCQkoKFVJTlQxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPCQkoKFVJTlQxNikoQklUMTQgfCBCSVQxMyB8IEJJVDEyIHwgQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX01BQ1BPUlQJCSgoVUlOVDE2KShCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1JFQ0wJCSgoVUlOVDE2KUJJVDgpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9XUklURQkJKChVSU5UMTYpQklUOCkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFCQkoKFVJTlQxNikoQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfQ01EQ09ERQkJKChVSU5UMTYpKEJJVDUgfCBCSVQ0IHwgQklUMyB8IEJJVDIgfCBCSVQxIHwgQklUMCkpCisKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX1JFU1VMVAkJKChVSU5UMTYpKEJJVDE0IHwgQklUMTMgfCBCSVQxMiB8IEJJVDExIHwgQklUMTAgfCBCSVQ5IHwgQklUOCkpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19DTURDT0RFCQkoKFVJTlQxNikoQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEgfCBCSVQwKSkKKworI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfQlVTWQkJKChVSU5UMTYpQklUMTUpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9FUlIJCSgoVUlOVDE2KUJJVDE0KQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRgkJKChVSU5UMTYpKEJJVDExIHwgQklUMTAgfCBCSVQ5IHwgQklUOCB8IEJJVDcgfCBCSVQ2IHwgQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEpKQorCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9USUNLCQkoKFVJTlQxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1dURVJSCQkoKFVJTlQxNilCSVQxNCkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lORkRST1AJCSgoVUlOVDE2KUJJVDEzKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSU5GTwkJKChVSU5UMTYpQklUNykKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0RUSU0JCSgoVUlOVDE2KUJJVDUpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9DTUQJCSgoVUlOVDE2KUJJVDQpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9BTExPQwkJKChVSU5UMTYpQklUMykKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1RYRVhDCQkoKFVJTlQxNilCSVQyKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfVFgJCSgoVUlOVDE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9SWAkJKChVSU5UMTYpQklUMCkKKworI2RlZmluZSAgICAgICAgIEhGQTM4NHhfSU5UX0JBUF9PUCAgICAgICAgICAgKEhGQTM4NHhfRVZTVEFUX0lORk98SEZBMzg0eF9FVlNUQVRfUlh8SEZBMzg0eF9FVlNUQVRfVFh8SEZBMzg0eF9FVlNUQVRfVFhFWEMpCisKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X0lOVF9OT1JNQUwgICAgICAgICAgIChIRkEzODR4X0VWU1RBVF9JTkZPfEhGQTM4NHhfRVZTVEFUX1JYfEhGQTM4NHhfRVZTVEFUX1RYfEhGQTM4NHhfRVZTVEFUX1RYRVhDfEhGQTM4NHhfRVZTVEFUX0lORkRST1B8SEZBMzg0eF9FVlNUQVRfQUxMT0N8SEZBMzg0eF9FVlNUQVRfRFRJTSkKKworI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9USUNLCQkoKFVJTlQxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fV1RFUlIJCSgoVUlOVDE2KUJJVDE0KQorI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JTkZEUk9QCQkoKFVJTlQxNilCSVQxMykKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSU5GTwkJKChVSU5UMTYpQklUNykKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fRFRJTQkJKChVSU5UMTYpQklUNSkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fQ01ECQkoKFVJTlQxNilCSVQ0KQorI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9BTExPQwkJKChVSU5UMTYpQklUMykKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fVFhFWEMJCSgoVUlOVDE2KUJJVDIpCisjZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RYCQkoKFVJTlQxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9SWAkJKChVSU5UMTYpQklUMCkKKworI2RlZmluZQkJSEZBMzg0eF9FVkFDS19USUNLCQkoKFVJTlQxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfV1RFUlIJCSgoVUlOVDE2KUJJVDE0KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZEUk9QCQkoKFVJTlQxNilCSVQxMykKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GTwkJKChVSU5UMTYpQklUNykKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfRFRJTQkJKChVSU5UMTYpQklUNSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQ01ECQkoKFVJTlQxNilCSVQ0KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19BTExPQwkJKChVSU5UMTYpQklUMykKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhFWEMJCSgoVUlOVDE2KUJJVDIpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYCQkoKFVJTlQxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19SWAkJKChVSU5UMTYpQklUMCkKKworI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWEVOCQkoKFVJTlQxNikoQklUMTUgfCBCSVQxNCkpCisKKworLyotLS0gQ29tbWFuZCBDb2RlIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBDb250cm9sbGVyIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9JTklUCQkoKFVJTlQxNikweDAwKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0VOQUJMRQkJKChVSU5UMTYpMHgwMSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9ESVNBQkxFCQkoKFVJTlQxNikweDAyKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0RJQUcJCSgoVUlOVDE2KTB4MDMpCisKKy8qLS0tIEJ1ZmZlciBNZ210IENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9BTExPQwkJKChVSU5UMTYpMHgwQSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9UWAkJKChVSU5UMTYpMHgwQikKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9DTFJQUlNUCQkoKFVJTlQxNikweDEyKQorCisvKi0tLSBSZWd1bGF0ZSBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfTk9USUZZCQkoKFVJTlQxNikweDEwKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0lOUQkJKChVSU5UMTYpMHgxMSkKKworLyotLS0gQ29uZmlndXJlIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9BQ0NFU1MJCSgoVUlOVDE2KTB4MjEpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRE9XTkxECQkoKFVJTlQxNikweDIyKQorCisvKi0tLSBEZWJ1Z2dpbmcgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSAJSEZBMzg0eF9DTURDT0RFX01PTklUT1IJCSgoVUlOVDE2KSgweDM4KSkKKyNkZWZpbmUJCUhGQTM4NHhfTU9OSVRPUl9FTkFCTEUJCSgoVUlOVDE2KSgweDBiKSkKKyNkZWZpbmUJCUhGQTM4NHhfTU9OSVRPUl9ESVNBQkxFCQkoKFVJTlQxNikoMHgwZikpCisKKy8qLS0tIFJlc3VsdCBDb2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1NVQ0NFU1MJCQkoKFVJTlQxNikoMHgwMCkpCisjZGVmaW5lCQlIRkEzODR4X0NBUkRfRkFJTAkJKChVSU5UMTYpKDB4MDEpKQorI2RlZmluZQkJSEZBMzg0eF9OT19CVUZGCQkJKChVSU5UMTYpKDB4MDUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfRVJSCQkJKChVSU5UMTYpKDB4N0YpKQorCisvKi0tLSBQcm9ncmFtbWluZyBNb2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU1PREUgMDogRGlzYWJsZSBwcm9ncmFtbWluZworCU1PREUgMTogRW5hYmxlIHZvbGF0aWxlIG1lbW9yeSBwcm9ncmFtbWluZworCU1PREUgMjogRW5hYmxlIG5vbi12b2xhdGlsZSBtZW1vcnkgcHJvZ3JhbW1pbmcKKwlNT0RFIDM6IFByb2dyYW0gbm9uLXZvbGF0aWxlIG1lbW9yeSBzZWN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX0RJU0FCTEUJKChVSU5UMTYpMHgwMCkKKyNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfUkFNCQkoKFVJTlQxNikweDAxKQorI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9OVgkJKChVSU5UMTYpMHgwMikKKyNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfTlZXUklURQkoKFVJTlQxNikweDAzKQorCisvKi0tLSBBVVggcmVnaXN0ZXIgZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfQVVYUFcwCQkJKChVSU5UMTYpMHhmZTAxKQorI2RlZmluZQkJSEZBMzg0eF9BVVhQVzEJCQkoKFVJTlQxNikweGRjMjMpCisjZGVmaW5lCQlIRkEzODR4X0FVWFBXMgkJCSgoVUlOVDE2KTB4YmE0NSkKKworI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9JU0RJU0FCTEVECSgoVUlOVDE2KTB4MDAwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfSVNFTkFCTEVECSgoVUlOVDE2KTB4YzAwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfRE9FTkFCTEUJKChVSU5UMTYpMHg4MDAwKQorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9ET0RJU0FCTEUJKChVSU5UMTYpMHg0MDAwKQorCisvKi0tLSBSZWNvcmQgSUQgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbmZpZ3VyYXRpb24gUklEczogTmV0d29yayBQYXJhbWV0ZXJzLCBTdGF0aWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUJCSgoVUlOVDE2KTB4RkMwMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIJKChVSU5UMTYpMHhGQzAxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQJKChVSU5UMTYpMHhGQzAyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQ0hBTk5FTAkoKFVJTlQxNikweEZDMDMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05TU0lECQkoKFVJTlQxNikweEZDMDQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05BVElNV0lOCSgoVUlOVDE2KTB4RkMwNSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNZU1NDQUxFCQkoKFVJTlQxNikweEZDMDYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOCSgoVUlOVDE2KTB4RkMwNykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIJCSgoVUlOVDE2KTB4RkMwOCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRU5BQkxFRAkoKFVJTlQxNikweEZDMDkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVQUwkJKChVSU5UMTYpMHhGQzBBKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTVVMVElDQVNUUlgJKChVSU5UMTYpMHhGQzBCKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYU0xFRVBEVVIJKChVSU5UMTYpMHhGQzBDKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1IT0xERFVSCSgoVUlOVDE2KTB4RkMwRCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk5BTUUJCSgoVUlOVDE2KTB4RkMwRSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkRUSU1QRVIJKChVSU5UMTYpMHhGQzEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjEJCSgoVUlOVDE2KTB4RkMxMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIyCQkoKFVJTlQxNikweEZDMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMwkJKChVSU5UMTYpMHhGQzEzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjQJCSgoVUlOVDE2KTB4RkMxNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI1CQkoKFVJTlQxNikweEZDMTUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNgkJKChVSU5UMTYpMHhGQzE2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUNBU1RQTUJVRkYJKChVSU5UMTYpMHhGQzE3KQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb25maWd1cmF0aW9uIFJJRCBsZW5ndGhzOiBOZXR3b3JrIFBhcmFtcywgU3RhdGljIENvbmZpZyBFbnRpdGllcworICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90IAorICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBUT0RPOiBmaWxsIGluIHRoZSByZXN0IG9mIHRoZXNlICovCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQT1JUVFlQRV9MRU4JKChVSU5UMTYpMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFJfTEVOCSgoVUlOVDE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4JKChVSU5UMTYpMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05DSEFOTkVMX0xFTgkoKFVJTlQxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOU1NJRF9MRU4JKChVSU5UMTYpMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05BVElNV0lOX0xFTgkoKFVJTlQxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1lTU0NBTEVfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOX0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUl9MRU4JKChVSU5UMTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRU5BQkxFRF9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRVBTX0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTVVMVElDQVNUUlhfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUl9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNSE9MRERVUl9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk5BTUVfTEVOCSgoVUlOVDE2KTM0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUl9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIxX0xFTgkoKFVJTlQxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjJfTEVOCSgoVUlOVDE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSM19MRU4JKChVSU5UMTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI0X0xFTgkoKFVJTlQxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjVfTEVOCSgoVUlOVDE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNl9MRU4JKChVSU5UMTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1DQVNUUE1CVUZGX0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT05fTEVOICgoVUlOVDE2KXNpemVvZihVSU5UMTYpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYU0xFRVBEVVJfTEVOCSgoVUlOVDE2KTApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbmZpZ3VyYXRpb24gUklEczogTmV0d29yayBQYXJhbWV0ZXJzLCBEeW5hbWljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfUklEX0dST1VQQUREUgkJKChVSU5UMTYpMHhGQzgwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTUwkJKChVSU5UMTYpMHhGQzgxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSAkJKChVSU5UMTYpMHhGQzgyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNICQkoKFVJTlQxNikweEZDODMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMCQkoKFVJTlQxNikweEZDODQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9NSVNDTU9ERQkJKChVSU5UMTYpMHhGQzg1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDAJCSgoVUlOVDE2KTB4RkM5MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxCQkoKFVJTlQxNikweEZDOTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMgkJKChVSU5UMTYpMHhGQzkyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDMJCSgoVUlOVDE2KTB4RkM5MykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0CQkoKFVJTlQxNikweEZDOTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINQkJKChVSU5UMTYpMHhGQzk1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDYJCSgoVUlOVDE2KTB4RkM5NikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDAJCSgoVUlOVDE2KTB4RkM5NykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDEJCSgoVUlOVDE2KTB4RkM5OCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDIJCSgoVUlOVDE2KTB4RkM5OSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDMJCSgoVUlOVDE2KTB4RkM5QSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDQJCSgoVUlOVDE2KTB4RkM5QikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDUJCSgoVUlOVDE2KTB4RkM5QykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDYJCSgoVUlOVDE2KTB4RkM5RCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwwCQkoKFVJTlQxNikweEZDOUUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMQkJKChVSU5UMTYpMHhGQzlGKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDIJCSgoVUlOVDE2KTB4RkNBMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwzCQkoKFVJTlQxNikweEZDQTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNAkJKChVSU5UMTYpMHhGQ0EyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDUJCSgoVUlOVDE2KTB4RkNBMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw2CQkoKFVJTlQxNikweEZDQTQpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbmZpZ3VyYXRpb24gUklEIExlbmd0aHM6IE5ldHdvcmsgUGFyYW0sIER5bmFtaWMgQ29uZmlnIEVudGl0aWVzCisgIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QgCisgIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFRPRE86IGZpbGwgaW4gdGhlIHJlc3Qgb2YgdGhlc2UgKi8KKyNkZWZpbmUJCUhGQTM4NHhfUklEX0dST1VQQUREUl9MRU4JKChVSU5UMTYpMTYgKiBXTEFOX0FERFJfTEVOKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTU19MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0hfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0hfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMX0xFTgkoKFVJTlQxNik0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREVfTEVOCSgoVUlOVDE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMF9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxX0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDJfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIM19MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0X0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDVfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINl9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDBfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gxX0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMl9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDNfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g0X0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINV9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDZfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMF9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwxX0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDJfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMM19MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw0X0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDVfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNl9MRU4JKChVSU5UMTYpMCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29uZmlndXJhdGlvbiBSSURzOiBCZWhhdmlvciBQYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1JJRF9JVElDS1RJTUUJCSgoVUlOVDE2KTB4RkNFMCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29uZmlndXJhdGlvbiBSSUQgTGVuZ3RoczogQmVoYXZpb3IgUGFyYW1ldGVycworICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90IAorICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1JJRF9JVElDS1RJTUVfTEVOCSgoVUlOVDE2KTIpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW5mb3JtYXRpb24gUklEczogTklDIEluZm9ybWF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhMT0FEVElNRQkJKChVSU5UMTYpMHhGRDAwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIJKChVSU5UMTYpMHhGRDAxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJSURFTlRJVFkJCSgoVUlOVDE2KTB4RkQwMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVNVUFJBTkdFCQkoKFVJTlQxNikweEZEMDMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklfQ0ZJQUNUUkFOR0VTCSgoVUlOVDE2KTB4RkQwNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUgkoKFVJTlQxNikweEZEMEEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNJREVOVElUWQkJKChVSU5UMTYpMHhGRDBCKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJU1VQUkFOR0UJCSgoVUlOVDE2KTB4RkQwQykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSVNVUFJBTkdFCQkoKFVJTlQxNikweEZEMEQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMTElTVAkJKChVSU5UMTYpMHhGRDEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUkVHVUxBVE9SWURPTUFJTlMJKChVSU5UMTYpMHhGRDExKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVEVNUFRZUEUJCSgoVUlOVDE2KTB4RkQxMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NJUwkJCSgoVUlOVDE2KTB4RkQxMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQUlERU5USVRZCQkoKFVJTlQxNikweEZEMjApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFTVVBSQU5HRQkJKChVSU5UMTYpMHhGRDIxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBX01GSUFDVFJBTkdFUwkoKFVJTlQxNikweEZEMjIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFfQ0ZJQUNUUkFOR0VTCSgoVUlOVDE2KTB4RkQyMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0JVSUxEU0VRCQkoKFVJTlQxNikweEZGRkUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GV0lECQkoKFVJTlQxNikweEZGRkYpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW5mb3JtYXRpb24gUklEIExlbmd0aHM6IE5JQyBJbmZvcm1hdGlvbgorICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90IAorICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhMT0FEVElNRV9MRU4JCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUl9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X2Rvd25sb2FkYnVmZmVyX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJSURFTlRJVFlfTEVOCQkoKFVJTlQxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJU1VQUkFOR0VfTEVOCQkoKFVJTlQxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSUFDVFJBTkdFU19MRU4JCSgoVUlOVDE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTgkJKChVSU5UMTYpMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNJREVOVElUWV9MRU4JCSgoVUlOVDE2KTgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NRklTVVBSQU5HRV9MRU4JCSgoVUlOVDE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0VfTEVOCQkoKFVJTlQxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxMSVNUX0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TX0xFTgkoKFVJTlQxNikxMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RFTVBUWVBFX0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NJU19MRU4JCQkoKFVJTlQxNik0ODApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFJREVOVElUWV9MRU4JCSgoVUlOVDE2KTgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFTVVBSQU5HRV9MRU4JCSgoVUlOVDE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJQUNUUkFOR0VTX0xFTgkJKChVSU5UMTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVMyX0xFTgkJKChVSU5UMTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9CVUlMRFNFUV9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X0J1aWxkU2VxX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRldJRF9MRU4JCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9GV0lEX3QpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbmZvcm1hdGlvbiBSSURzOiAgTUFDIEluZm9ybWF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QT1JUU1RBVFVTCQkoKFVJTlQxNikweEZENDApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU1NJRAkJKChVSU5UMTYpMHhGRDQxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lECSgoVUlOVDE2KTB4RkQ0MikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NPTU1TUVVBTElUWQkoKFVJTlQxNikweEZENDMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFCSgoVUlOVDE2KTB4RkQ0NCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCQ05JTlQJKChVSU5UMTYpMHhGRDQ1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFNDQUxFVEhSRVNICSgoVUlOVDE2KTB4RkQ0NikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BST1RPQ09MUlNQVElNRQkoKFVJTlQxNikweEZENDcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TSE9SVFJFVFJZTElNSVQJKChVSU5UMTYpMHhGRDQ4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfTE9OR1JFVFJZTElNSVQJKChVSU5UMTYpMHhGRDQ5KQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYVFhMSUZFVElNRQkoKFVJTlQxNikweEZENEEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhSWExJRkVUSU1FCSgoVUlOVDE2KTB4RkQ0QikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGUE9MTEFCTEUJCSgoVUlOVDE2KTB4RkQ0QykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhBTEdPUklUSE1TCSgoVUlOVDE2KTB4RkQ0RCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVZBQ1lPUFRJTVAJKChVSU5UMTYpMHhGRDRGKQorI2RlZmluZQkJSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZCSgoVUlOVDE2KTB4RkQ1MSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUxCSgoVUlOVDE2KTB4RkQ4MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUyCSgoVUlOVDE2KTB4RkQ4MSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUzCSgoVUlOVDE2KTB4RkQ4MikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU0CSgoVUlOVDE2KTB4RkQ4MykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU1CSgoVUlOVDE2KTB4RkQ4NCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU2CSgoVUlOVDE2KTB4RkQ4NSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX09XTk1BQ0FERFJFU1MJKChVSU5UMTYpMHhGRDg2KQorLy8gI2RlZmluZQlIRkEzODR4X1JJRF9QQ0ZJTkZPCQkoKFVJTlQxNikweEZEODcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TQ0FOUkVTVUxUUyAgICAgICAJKChVSU5UMTYpMHhGRDg4KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0hPU1RTQ0FOUkVTVUxUUyAgIAkoKFVJTlQxNikweEZEODkpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRJT05VU0VECSgoVUlOVDE2KTB4RkQ4QSkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BU1NPQ0lBVEVGQUlMVVJFICAJKChVSU5UMTYpMHhGRDhEKSAvLyAxLjguMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbmZvcm1hdGlvbiBSSUQgTGVuZ3RoczogIE1BQyBJbmZvcm1hdGlvbgorICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90IAorICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QT1JUU1RBVFVTX0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTU0lEX0xFTgkJKChVSU5UMTYpMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSURfTEVOCQkoKFVJTlQxNilXTEFOX0JTU0lEX0xFTikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X2NvbW1zcXVhbGl0eV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWV9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X2RibWNvbW1zcXVhbGl0eV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEVfTEVOCQkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJDTklOVF9MRU4JCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFDVVJTQ0FMRVRIUkVTSF9MRU4JKChVSU5UMTYpMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BUENVUlNDQUxFVEhSRVNIX0xFTgkoKFVJTlQxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FX0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVF9MRU4JCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVF9MRU4JCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FX0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFJYTElGRVRJTUVfTEVOCQkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZQT0xMQUJMRV9MRU4JCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNU19MRU4JCSgoVUlOVDE2KTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QX0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUxX0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUyX0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUzX0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU0X0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU1X0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU2X0xFTgkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX09XTk1BQ0FERFJFU1NfTEVOCQkoKFVJTlQxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUENGSU5GT19MRU4JCQkoKFVJTlQxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfUENGSW5mb19kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU0NBTlJFUVVFU1RfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9TY2FuUmVxdWVzdF9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRFU1RBX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTElORk9SRVFVRVNUX0xFTgkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9DaGFubmVsSW5mb1JlcXVlc3RfZGF0YV90KSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0luZm9ybWF0aW9uIFJJRHM6ICBNb2RlbSBJbmZvcm1hdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJSEZBMzg0eF9SSURfUEhZVFlQRQkJKChVSU5UMTYpMHhGREMwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUwJKChVSU5UMTYpMHhGREMxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEUJKChVSU5UMTYpMHhGREMyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0NBTU9ERQkJKChVSU5UMTYpMHhGREMzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTCSgoVUlOVDE2KTB4RkRDNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0xGT1NUQVRVUyAgICAgICAgICAgKChVSU5UMTYpMHhGREM3KSAvLyAxLjcuMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbmZvcm1hdGlvbiBSSUQgTGVuZ3RoczogIE1vZGVtIEluZm9ybWF0aW9uIAorICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90IAorICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QSFlUWVBFX0xFTgkJCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQ0hBTk5FTF9MRU4JCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UUE9XRVJTVEFURV9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NDQU1PREVfTEVOCQkJKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NVUFBPUlRFRERBVEFSQVRFU19MRU4JKChVSU5UMTYpMTApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FQSSBFTkhBTkNFTUVOVFMgKE5PVCBBTFJFQURZIElNUExFTUVOVEVEKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWUlECSgoVUlOVDE2KTB4RkMyMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkwCSgoVUlOVDE2KTB4RkMyNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkxCSgoVUlOVDE2KTB4RkMyNSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkyCSgoVUlOVDE2KTB4RkMyNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkzCSgoVUlOVDE2KTB4RkMyNykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUEZMQUdTCQkoKFVJTlQxNikweEZDMjgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBLRVlNQVBUQUJMRQkoKFVJTlQxNikweEZDMjkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTgkoKFVJTlQxNikweEZDMkEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhBU1NPQ1NUQVRJT05TCSgoVUlOVDE2KTB4RkMyQikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlRYQ09OVFJPTAkoKFVJTlQxNikweEZDMkMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZST0FNSU5HTU9ERQkoKFVJTlQxNikweEZDMkQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZIT1NUQVVUSEFTU09DCSgoVUlOVDE2KTB4RkMyRSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlJDVkNSQ0VSUk9SCSgoVUlOVDE2KTB4RkMzMCkKKy8vICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1NTElGRQkJKChVSU5UMTYpMHhGQzMxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQUxUUkVUUllDTlQJKChVSU5UMTYpMHhGQzMyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVBCQ05JTlQJCSgoVUlOVDE2KTB4RkMzMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQUENGSU5GTwkoKFVJTlQxNikweEZDMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTVEFQQ0ZJTkZPCSgoVUlOVDE2KTB4RkMzNSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBSSU9SSVRZUVVTQUdFCSgoVUlOVDE2KTB4RkMzNykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlRJTUNUUkwJCSgoVUlOVDE2KTB4RkM0MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlRISVJUWTJUQUxMWQkoKFVJTlQxNikweEZDNDIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZFTkhTRUNVUklUWQkoKFVJTlQxNikweEZDNDMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZEQk1BREpVU1QgIAkoKFVJTlQxNikweEZDNDYpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV1BBREFUQSAgICAgICAJKChVSU5UMTYpMHhGQzQ4KSAvLyAxLjcuMAorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUFJPUE9HQVRJT05ERUxBWQkoKFVJTlQxNikweEZDNDkpIC8vIDEuNy42CisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTSE9SVFBSRUFNQkxFCSgoVUlOVDE2KTB4RkNCMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkVYQ0xPTkdQUkVBTUJMRQkoKFVJTlQxNikweEZDQjEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIUlNQVElNRU9VVAkoKFVJTlQxNikweEZDQjIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZCQVNJQ1JBVEVTCSgoVUlOVDE2KTB4RkNCMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNVUFBSQVRFUwkoKFVJTlQxNikweEZDQjQpIAorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRkFMTEJBQ0tDVFJMCSgoVUlOVDE2KTB4RkNCNSkgLy8gTkVXIAorI2RlZmluZQkJSEZBMzg0eF9SSURfV0VQS0VZU1RBVFVTICAgCSgoVUlOVDE2KTB4RkNCNikgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9XRVBLRVlNQVBJTkRFWCAJKChVSU5UMTYpMHhGQ0I3KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0JST0FEQ0FTVEtFWUlEIAkoKFVJTlQxNikweEZDQjgpIC8vIE5FVyAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0VOVFNFQ0ZMQUdFWUlEIAkoKFVJTlQxNikweEZDQjkpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUEFTU0lWRVNDQU5DVFJMCSgoVUlOVDE2KTB4RkNCQSkgLy8gTkVXIFNUQQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV1BBSEFORExJTkcJKChVSU5UMTYpMHhGQ0JCKSAvLyAxLjcuMAorI2RlZmluZQkJSEZBMzg0eF9SSURfTURDQ09OVFJPTCAgICAgICAgCSgoVUlOVDE2KTB4RkNCQykgLy8gMS43LjAvMS40LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01EQ0NPVU5UUlkgICAgICAgIAkoKFVJTlQxNikweEZDQkQpIC8vIDEuNy4wLzEuNC4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFBPV0VSTUFYICAgICAgICAJKChVSU5UMTYpMHhGQ0JFKSAvLyAxLjcuMC8xLjQuMAorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTEZPRU5CTEVEICAgICAgCSgoVUlOVDE2KTB4RkNCRikgLy8gMS42LjMKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9DQVBJTkZPICAgICAgICAgICAgICgoVUlOVDE2KTB4RkNDMCkgLy8gMS43LjAvMS4zLjcKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9MSVNURU5JTlRFUlZBTCAgICAgICgoVUlOVDE2KTB4RkNDMSkgLy8gMS43LjAvMS4zLjcKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9ESVZFUlNJVFlFTkFCTEVEICAgICgoVUlOVDE2KTB4RkNDMikgLy8gMS43LjAvMS4zLjcKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9MRURfQ09OVFJPTCAgICAgICAgICgoVUlOVDE2KTB4RkNDNCkgLy8gMS43LjYgICAgICAKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9IRk9fREVMQVkgICAgICAgICAgICgoVUlOVDE2KTB4RkNDNSkgLy8gMS43LjYgICAgICAKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9ESVNTQUxPV0VEQlNTSUQgICAgICgoVUlOVDE2KTB4RkNDNikgLy8gMS44LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NDQU5SRVFVRVNUCQkoKFVJTlQxNikweEZDRTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9KT0lOUkVRVUVTVAkJKChVSU5UMTYpMHhGQ0UyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRFU1RBCSgoVUlOVDE2KTB4RkNFMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVAkoKFVJTlQxNikweEZDRTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9IT1NUU0NBTiAgICAgICAgICAJKChVSU5UMTYpMHhGQ0U1KSAvLyBORVcgU1RBCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BU1NPQ0lBVEVTVEEJKChVSU5UMTYpMHhGQ0U2KQorCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZX0xFTgkoKFVJTlQxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQMTI4REVGQVVMVEtFWV9MRU4JKChVSU5UMTYpMTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUklPUVVTQUdFX0xFTgkJKChVSU5UMTYpNCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BEIFJlY29yZCBjb2RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBIRkEzODR4X1BEUl9QQ0JfUEFSVE5VTQkJKChVSU5UMTYpMHgwMDAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9QREFWRVIJCSgoVUlOVDE2KTB4MDAwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1NFUklBTAkJKChVSU5UMTYpMHgwMDAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAwNCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1JBTVNJWkUJCSgoVUlOVDE2KTB4MDAwNSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUZJU1VQUkFOR0UJCSgoVUlOVDE2KTB4MDAwNikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfQ0ZJU1VQUkFOR0UJCSgoVUlOVDE2KTB4MDAwNykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTklDSUQJCSgoVUlOVDE2KTB4MDAwOCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9SRUZEQUNfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAxMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19NRUFTVVJFTUVOVFMJKChVSU5UMTYpMHgwMDIwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAzMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9NT0RFTV9UUklNREFDX01FQVNVUkVNRU5UUwkoKFVJTlQxNikweDAwNDApCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfQ09SRUdBX0hBQ0sJCSgoVUlOVDE2KTB4MDBmZikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUFDX0FERFJFU1MJCSgoVUlOVDE2KTB4MDEwMSkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfQ0FMTE5BTUUJKChVSU5UMTYpMHgwMTAyKQorI2RlZmluZSBIRkEzODR4X1BEUl9SRUdET01BSU4JCSgoVUlOVDE2KTB4MDEwMykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfQUxMT1dFRF9DSEFOTkVMCSgoVUlOVDE2KTB4MDEwNCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfREVGQVVMVF9DSEFOTkVMCSgoVUlOVDE2KTB4MDEwNSkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9QUklWQUNZX09QVElPTgkoKFVJTlQxNikweDAxMDYpCisjZGVmaW5lIEhGQTM4NHhfUERSX1RFTVBUWVBFCQkoKFVJTlQxNikweDAxMDcpCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfUkVGREFDX1NFVFVQCSgoVUlOVDE2KTB4MDExMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19TRVRVUAkJKChVSU5UMTYpMHgwMTIwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfU0VUVVAJKChVSU5UMTYpMHgwMTMwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX1RSSU1EQUNfU0VUVVAJKChVSU5UMTYpMHgwMTQwKQorI2RlZmluZSBIRkEzODR4X1BEUl9JRlJfU0VUVElORwkJKChVSU5UMTYpMHgwMjAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9SRlJfU0VUVElORwkJKChVSU5UMTYpMHgwMjAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0JBU0VMSU5FCSgoVUlOVDE2KTB4MDIwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9TSEFET1cJKChVSU5UMTYpMHgwMjAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0lGUkYJKChVSU5UMTYpMHgwMjA0KQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMU1AJKChVSU5UMTYpMHgwMzAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMSQkoKFVJTlQxNikweDAzMDEpCisjZGVmaW5lIEhGQTM4NHhfUERSX01BWF9UWF9QT1dFUiAgCSgoVUlOVDE2KTB4MDMwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUFTVEVSX0NIQU5fTElTVAkoKFVJTlQxNikweDAzMDMpCisjZGVmaW5lIEhGQTM4NHhfUERSXzM4NDJfTklDX0NPTkZJRwkoKFVJTlQxNikweDA0MDApCisjZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9JRAkJKChVSU5UMTYpMHgwNDAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfSUQJCSgoVUlOVDE2KTB4MDQwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUENJX0lGQ09ORgkJKChVSU5UMTYpMHgwNDAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfUE1DT05GCQkoKFVJTlQxNikweDA0MDQpCisjZGVmaW5lIEhGQTM4NHhfUERSX1JGRU5SR1kJCSgoVUlOVDE2KTB4MDQwNikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX1BPV0VSX1RZUEUgICAgICAoKFVJTlQxNikweDA0MDcpCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfVU5LTk9XTjQwOAkJKChVSU5UMTYpMHgwNDA4KQorI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfTUFYX1BPV0VSCSgoVUlOVDE2KTB4MDQwOSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX01BTlVGQUNUVVJFUgkoKFVJTlQxNikweDA0MTApCisjZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9QUk9EVUNUICAJKChVSU5UMTYpMHgwNDExKQorI2RlZmluZSBIRkEzODR4X1BEUl9BTlRfRElWRVJTSVRZICAgCSgoVUlOVDE2KTB4MDQxMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZPX0RFTEFZICAgICAgIAkoKFVJTlQxNikweDA0MTMpCisjZGVmaW5lIEhGQTM4NHhfUERSX1NDQUxFX1RIUkVTSCAJKChVSU5UMTYpMHgwNDE0KQorCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfTUFORl9URVNUU1AJKChVSU5UMTYpMHgwOTAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX01BTkZfVEVTVEkJKChVSU5UMTYpMHgwOTAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9FTkRfT0ZfUERBCQkoKFVJTlQxNikweDAwMDApCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tIFJlZ2lzdGVyIElEIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lCQlIRkEzODR4X0NNRAkJSEZBMzg0eF9DTURfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1BBUkFNMAkJSEZBMzg0eF9QQVJBTTBfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1BBUkFNMQkJSEZBMzg0eF9QQVJBTTFfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1BBUkFNMgkJSEZBMzg0eF9QQVJBTTJfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVUwkJSEZBMzg0eF9TVEFUVVNfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1JFU1AwCQlIRkEzODR4X1JFU1AwX09GRgorI2RlZmluZQkJSEZBMzg0eF9SRVNQMQkJSEZBMzg0eF9SRVNQMV9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfUkVTUDIJCUhGQTM4NHhfUkVTUDJfT0ZGCisjZGVmaW5lCQlIRkEzODR4X0lORk9GSUQJCUhGQTM4NHhfSU5GT0ZJRF9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfUlhGSUQJCUhGQTM4NHhfUlhGSURfT0ZGCisjZGVmaW5lCQlIRkEzODR4X0FMTE9DRklECUhGQTM4NHhfQUxMT0NGSURfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1RYQ09NUExGSUQJSEZBMzg0eF9UWENPTVBMRklEX09GRgorI2RlZmluZQkJSEZBMzg0eF9TRUxFQ1QwCQlIRkEzODR4X1NFTEVDVDBfT0ZGCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVDAJCUhGQTM4NHhfT0ZGU0VUMF9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfREFUQTAJCUhGQTM4NHhfREFUQTBfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1NFTEVDVDEJCUhGQTM4NHhfU0VMRUNUMV9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUMQkJSEZBMzg0eF9PRkZTRVQxX09GRgorI2RlZmluZQkJSEZBMzg0eF9EQVRBMQkJSEZBMzg0eF9EQVRBMV9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUCQlIRkEzODR4X0VWU1RBVF9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU4JCUhGQTM4NHhfSU5URU5fT0ZGCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLCQlIRkEzODR4X0VWQUNLX09GRgorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MCQlIRkEzODR4X0NPTlRST0xfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDAJSEZBMzg0eF9TV1NVUFBPUlQwX09GRgorI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQxCUhGQTM4NHhfU1dTVVBQT1JUMV9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfU1dTVVBQT1JUMglIRkEzODR4X1NXU1VQUE9SVDJfT0ZGCisjZGVmaW5lCQlIRkEzODR4X0FVWFBBR0UJCUhGQTM4NHhfQVVYUEFHRV9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfQVVYT0ZGU0VUCUhGQTM4NHhfQVVYT0ZGU0VUX09GRgorI2RlZmluZQkJSEZBMzg0eF9BVVhEQVRBCQlIRkEzODR4X0FVWERBVEFfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1BDSUNPUgkJSEZBMzg0eF9QQ0lDT1JfT0ZGCisjZGVmaW5lCQlIRkEzODR4X1BDSUhDUgkJSEZBMzg0eF9QQ0lIQ1JfT0ZGCisKKworLyotLS0gUmVnaXN0ZXIgVGVzdC9HZXQvU2V0IEZpZWxkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lCQlIRkEzODR4X0NNRF9JU0JVU1kodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpdmFsdWUpICYgSEZBMzg0eF9DTURfQlVTWSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9BSU5GT19HRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX0FJTkZPKSA+PiA4KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoVUlOVDE2KSh2YWx1ZSkgPDwgOCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9NQUNQT1JUX0dFVCh2YWx1ZSkJCSgoVUlOVDE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKFVJTlQxNikodmFsdWUpICYgSEZBMzg0eF9DTURfTUFDUE9SVCkpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVF9TRVQodmFsdWUpCQkoKFVJTlQxNilIRkEzODR4X0NNRF9BSU5GT19TRVQodmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfSVNSRUNMKHZhbHVlKQkJKChVSU5UMTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgoVUlOVDE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9SRUNMKSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9SRUNMX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9RT1NfR0VUKHZhbHVlKQkJKChVSU5UMTYoKCgoVUlOVDE2KSh2YWx1ZSkpJigoVUlOVDE2KTB4MzAwMCkpID4+IDEyKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1FPU19TRVQodmFsdWUpCQkoKFVJTlQxNikoKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEyKSAmIDB4MzAwMCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9JU1dSSVRFKHZhbHVlKQkJKChVSU5UMTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgoVUlOVDE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9XUklURSkpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfV1JJVEVfU0VUKHZhbHVlKQkJKChVSU5UMTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKChVSU5UMTYpdmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREVfR0VUKHZhbHVlKQkJKChVSU5UMTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgoVUlOVDE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9QUk9HTU9ERSkpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREVfU0VUKHZhbHVlKQkJKChVSU5UMTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKChVSU5UMTYpdmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfQ01EQ09ERV9HRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0NNRF9DTURDT0RFKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0NNRENPREVfU0VUKHZhbHVlKQkJKChVSU5UMTYpKHZhbHVlKSkKKworI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUX0dFVCh2YWx1ZSkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfU1RBVFVTX1JFU1VMVCkgPj4gOCkpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19SRVNVTFRfU0VUKHZhbHVlKQkoKChVSU5UMTYpKHZhbHVlKSkgPDwgOCkKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREVfR0VUKHZhbHVlKQkoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1NUQVRVU19DTURDT0RFKQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfQ01EQ09ERV9TRVQodmFsdWUpCSgoVUlOVDE2KSh2YWx1ZSkpCisKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0lTQlVTWSh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0JVU1kpKQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfSVNFUlIodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9FUlIpKQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRl9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0RBVEFPRkYpKQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRl9TRVQodmFsdWUpCSgoVUlOVDE2KSh2YWx1ZSkpCisKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTVElDSyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1RJQ0spKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNXVEVSUih2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1dURVJSKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTSU5GRFJPUCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0lORkRST1ApKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNJTkZPKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfSU5GTykpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0RUSU0odmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9EVElNKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTQ01EKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfQ01EKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTQUxMT0ModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9BTExPQykpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1RYRVhDKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfVFhFWEMpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNUWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1RYKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTUlgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9SWCkpCisKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTQkFQX09QKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRfQkFQX09QKSkKKworI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU1RJQ0sodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1RJQ0spKQorI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9USUNLX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxNSkpCisjZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTV1RFUlIodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1dURVJSKSkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fV1RFUlJfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDE0KSkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNJTkZEUk9QKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9JTkZEUk9QKSkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSU5GRFJPUF9TRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxMykpCisjZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTSU5GTyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fSU5GTykpCisjZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lORk9fU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDcpKQorI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU0RUSU0odmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0RUSU0pKQorI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9EVElNX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA1KSkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNDTUQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0NNRCkpCisjZGVmaW5lCQlIRkEzODR4X0lOVEVOX0NNRF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNCkpCisjZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTQUxMT0ModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0FMTE9DKSkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fQUxMT0NfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDMpKQorI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU1RYRVhDKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9UWEVYQykpCisjZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RYRVhDX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAyKSkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNUWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fVFgpKQorI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9UWF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMSkpCisjZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTUlgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1JYKSkKKyNkZWZpbmUJCUhGQTM4NHhfSU5URU5fUlhfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDApKQorCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVElDSyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfVElDSykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RJQ0tfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDE1KSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNXVEVSUih2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfV1RFUlIpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19XVEVSUl9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTQpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0lORkRST1AodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0lORkRST1ApKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZEUk9QX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEzKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNJTkZPKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19JTkZPKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GT19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTRFRJTSh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfRFRJTSkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0RUSU1fU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDUpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0NNRCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfQ01EKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQ01EX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA0KSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNBTExPQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfQUxMT0MpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19BTExPQ19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVFhFWEModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1RYRVhDKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhFWENfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDIpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1RYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19UWCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNSWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfUlgpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19SWF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMCkpCisKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhFTl9TRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxNCkpCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYRU5fR0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPj4gMTQpKQorCisvKiBCeXRlIE9yZGVyICovCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBoZmEzODR4Mmhvc3RfMTYobikJKF9fbGUxNl90b19jcHUoKFVJTlQxNikobikpKQorI2RlZmluZSBoZmEzODR4Mmhvc3RfMzIobikJKF9fbGUzMl90b19jcHUoKFVJTlQzMikobikpKQorI2RlZmluZSBob3N0MmhmYTM4NHhfMTYobikJKF9fY3B1X3RvX2xlMTYoKFVJTlQxNikobikpKQorI2RlZmluZSBob3N0MmhmYTM4NHhfMzIobikJKF9fY3B1X3RvX2xlMzIoKFVJTlQzMikobikpKQorI2VuZGlmCisKKy8qIEhvc3QgTWFpbnRhaW5lZCBTdGF0ZSBJbmZvICovCisjZGVmaW5lIEhGQTM4NHhfU1RBVEVfUFJFSU5JVAkwCisjZGVmaW5lIEhGQTM4NHhfU1RBVEVfSU5JVAkxCisjZGVmaW5lIEhGQTM4NHhfU1RBVEVfUlVOTklORwkyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKi0tLS0tLSBUeXBlcyBhbmQgdGhlaXIgcmVsYXRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEhGQTM4NHhfSE9TVEFVVEhBU1NPQ19IT1NUQVVUSCAgIEJJVDAKKyNkZWZpbmUgSEZBMzg0eF9IT1NUQVVUSEFTU09DX0hPU1RBU1NPQyAgQklUMQorCisjZGVmaW5lIEhGQTM4NHhfV0hBSEFORExJTkdfRElTQUJMRUQgICAgIDAKKyNkZWZpbmUgSEZBMzg0eF9XSEFIQU5ETElOR19QQVNTVEhST1VHSCAgQklUMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29tbW9ubHkgdXNlZCBiYXNpYyB0eXBlcyAqLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyCit7CisJVUlOVDE2CWxlbjsKKwlVSU5UOAlkYXRhWzBdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2J5dGVzdHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyMzIKK3sKKwlVSU5UMTYJbGVuOworCVVJTlQ4CWRhdGFbMzJdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2J5dGVzdHIzMl90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb25maWd1cmF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOgorCU5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByb3RvdHlwZSBzdHJ1Y3R1cmU6IGFsbCBjb25maWd1cmF0aW9uIHJlY29yZCBzdHJ1Y3R1cmVzIHN0YXJ0IHdpdGgKK3RoZXNlIG1lbWJlcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9yZWNvcmQgCit7CisJVUlOVDE2CXJlY2xlbjsKKwlVSU5UMTYJcmlkOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3JlY190OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3JlY29yZDE2Cit7CisJVUlOVDE2CXJlY2xlbjsKKwlVSU5UMTYJcmlkOworCVVJTlQxNgl2YWw7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcmVjMTZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9yZWNvcmQzMgoreworCVVJTlQxNglyZWNsZW47CisJVUlOVDE2CXJpZDsKKwlVSU5UMzIJdmFsOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3JlYzMyOworCisvKi0tIEhhcmR3YXJlL0Zpcm13YXJlIENvbXBvbmVudCBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfY29tcGlkZW50Cit7CisJVUlOVDE2CWlkOworCVVJTlQxNgl2YXJpYW50OworCVVJTlQxNgltYWpvcjsKKwlVSU5UMTYJbWlub3I7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY29tcGlkZW50X3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwKK3sKKwlVSU5UMTYJcm9sZTsKKwlVSU5UMTYJaWQ7CisJVUlOVDE2CXZhcmlhbnQ7CisJVUlOVDE2CWJvdHRvbTsKKwlVSU5UMTYJdG9wOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NhcGxldmVsX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZlBvcnRUeXBlIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mUG9ydFR5cGUKK3sKKwlVSU5UMTYJY25mUG9ydFR5cGU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mUG9ydFR5cGVfdDsKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duTUFDQWRkcmVzcyAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93bk1BQ0FkZHJlc3MKK3sKKwlVSU5UOAljbmZPd25NQUNBZGRyZXNzWzZdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93bk1BQ0FkZHJlc3NfdDsKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mRGVzaXJlZFNTSUQgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZEZXNpcmVkU1NJRAoreworCVVJTlQ4CWNuZkRlc2lyZWRTU0lEWzM0XTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZEZXNpcmVkU1NJRF90OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25DaGFubmVsIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duQ2hhbm5lbAoreworCVVJTlQxNgljbmZPd25DaGFubmVsOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93bkNoYW5uZWxfdDsKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duU1NJRCAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93blNTSUQKK3sKKwlVSU5UOAljbmZPd25TU0lEWzM0XTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25TU0lEX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93bkFUSU1XaW5kb3cgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25BVElNV2luZG93Cit7CisJVUlOVDE2CWNuZk93bkFUSU1XaW5kb3c7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duQVRJTVdpbmRvd190OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZTeXN0ZW1TY2FsZSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZlN5c3RlbVNjYWxlCit7CisJVUlOVDE2CWNuZlN5c3RlbVNjYWxlOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZlN5c3RlbVNjYWxlX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk1heERhdGFMZW5ndGggLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZNYXhEYXRhTGVuZ3RoCit7CisJVUlOVDE2CWNuZk1heERhdGFMZW5ndGg7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mTWF4RGF0YUxlbmd0aF90OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZXRFNBZGRyZXNzIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mV0RTQWRkcmVzcworeworCVVJTlQ4CWNuZldEU0FkZHJlc3NbNl07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mV0RTQWRkcmVzc190OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZQTUVuYWJsZWQgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZQTUVuYWJsZWQKK3sKKwlVSU5UMTYJY25mUE1FbmFibGVkOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZlBNRW5hYmxlZF90OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZQTUVQUyAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZlBNRVBTCit7CisJVUlOVDE2CWNuZlBNRVBTOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZlBNRVBTX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk11bHRpY2FzdFJlY2VpdmUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZNdWx0aWNhc3RSZWNlaXZlCit7CisJVUlOVDE2CWNuZk11bHRpY2FzdFJlY2VpdmU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mTXVsdGljYXN0UmVjZWl2ZV90OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZBdXRoZW50aWNhdGlvbiAtLSovCisjZGVmaW5lIEhGQTM4NHhfQ05GQVVUSEVOVElDQVRJT05fT1BFTlNZU1RFTQkweDAwMDEKKyNkZWZpbmUgSEZBMzg0eF9DTkZBVVRIRU5USUNBVElPTl9TSEFSRURLRVkJMHgwMDAyCisjZGVmaW5lIEhGQTM4NHhfQ05GQVVUSEVOVElDQVRJT05fTEVBUCAgICAgCTB4MDAwNAorCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZNYXhTbGVlcER1cmF0aW9uIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mTWF4U2xlZXBEdXJhdGlvbgoreworCVVJTlQxNgljbmZNYXhTbGVlcER1cmF0aW9uOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk1heFNsZWVwRHVyYXRpb25fdDsKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mUE1Ib2xkb3ZlckR1cmF0aW9uIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mUE1Ib2xkb3ZlckR1cmF0aW9uCit7CisJVUlOVDE2CWNuZlBNSG9sZG92ZXJEdXJhdGlvbjsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZQTUhvbGRvdmVyRHVyYXRpb25fdDsKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duTmFtZSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93bk5hbWUKK3sKKwlVSU5UOAljbmZPd25OYW1lWzM0XTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25OYW1lX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93bkRUSU1QZXJpb2QgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25EVElNUGVyaW9kCit7CisJVUlOVDE2CWNuZk93bkRUSU1QZXJpb2Q7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duRFRJTVBlcmlvZF90OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZXRFNBZGRyZXNzIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mV0RTQWRkcmVzc04KK3sKKwlVSU5UOAljbmZXRFNBZGRyZXNzWzZdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZldEU0FkZHJlc3NOX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk11bHRpY2FzdFBNQnVmZmVyaW5nIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mTXVsdGljYXN0UE1CdWZmZXJpbmcKK3sKKwlVSU5UMTYJY25mTXVsdGljYXN0UE1CdWZmZXJpbmc7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mTXVsdGljYXN0UE1CdWZmZXJpbmdfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29uZmlndXJhdGlvbiBSZWNvcmQgU3RydWN0dXJlczoKKwlOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBHcm91cEFkZHJlc3NlcyAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0dyb3VwQWRkcmVzc2VzCit7CisJVUlOVDgJTUFDQWRkcmVzc1sxNl1bNl07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfR3JvdXBBZGRyZXNzZXNfdDsKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogQ3JlYXRlSUJTUyAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NyZWF0ZUlCU1MKK3sKKwlVSU5UMTYJQ3JlYXRlSUJTUzsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DcmVhdGVJQlNTX3Q7CisKKyNkZWZpbmUgSEZBMzg0eF9DUkVBVEVJQlNTX0pPSU5DUkVBVEVJQlNTICAgICAgICAgIDAKKyNkZWZpbmUgSEZBMzg0eF9DUkVBVEVJQlNTX0pPSU5FU1NfSk9JTkNSRUFURUlCU1MgIDEKKyNkZWZpbmUgSEZBMzg0eF9DUkVBVEVJQlNTX0pPSU5JQlNTICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSEZBMzg0eF9DUkVBVEVJQlNTX0pPSU5FU1NfSk9JTklCU1MgICAgICAgIDMKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogRnJhZ21lbnRhdGlvblRocmVzaG9sZCAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0ZyYWdtZW50YXRpb25UaHJlc2hvbGQKK3sKKwlVSU5UMTYJRnJhZ21lbnRhdGlvblRocmVzaG9sZDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9GcmFnbWVudGF0aW9uVGhyZXNob2xkX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFJUU1RocmVzaG9sZCAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1JUU1RocmVzaG9sZAoreworCVVJTlQxNglSVFNUaHJlc2hvbGQ7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUlRTVGhyZXNob2xkX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFR4UmF0ZUNvbnRyb2wgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9UeFJhdGVDb250cm9sCit7CisJVUlOVDE2CVR4UmF0ZUNvbnRyb2w7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfVHhSYXRlQ29udHJvbF90OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBQcm9taXNjdW91c01vZGUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Qcm9taXNjdW91c01vZGUKK3sKKwlVSU5UMTYJUHJvbWlzY3VvdXNNb2RlOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1Byb21pc2N1b3VzTW9kZV90OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBTY2FuUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfU2NhblJlcXVlc3RfZGF0YQoreworCVVJTlQxNgljaGFubmVsTGlzdDsKKwlVSU5UMTYJdHhSYXRlOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1NjYW5SZXF1ZXN0X2RhdGFfdDsKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogSG9zdFNjYW5SZXF1ZXN0IChkYXRhIHBvcnRpb24gb25seSkgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YQoreworCVVJTlQxNgljaGFubmVsTGlzdDsKKwlVSU5UMTYJdHhSYXRlOworCWhmYTM4NHhfYnl0ZXN0cjMyX3Qgc3NpZDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YV90OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBKb2luUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YQoreworCVVJTlQ4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKKwlVSU5UMTYJY2hhbm5lbDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGF1dGhlbnRpY2F0ZVN0YXRpb24gKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YQoreworCVVJTlQ4CWFkZHJlc3NbV0xBTl9BRERSX0xFTl07CisJVUlOVDE2CXN0YXR1czsKKwlVSU5UMTYJYWxnb3JpdGhtOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YV90OworCisvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBhc3NvY2lhdGVTdGF0aW9uIChkYXRhIHBvcnRpb24gb25seSkgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9hc3NvY2lhdGVTdGF0aW9uX2RhdGEKK3sKKwlVSU5UOAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOworCVVJTlQxNglzdGF0dXM7CisJVUlOVDE2CXR5cGU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfYXNzb2NpYXRlU3RhdGlvbl9kYXRhX3Q7CisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IENoYW5uZWxJbmZvUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ2hhbm5lbEluZm9SZXF1ZXN0X2RhdGEKK3sKKwlVSU5UMTYJY2hhbm5lbExpc3Q7CisJVUlOVDE2CWNoYW5uZWxEd2VsbFRpbWU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ2hhbm5lbEluZm9SZXF1ZXN0X2RhdGFfdDsKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogV0VQS2V5TWFwcGluZyAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfV0VQS2V5TWFwcGluZworeworCVVJTlQ4CWFkZHJlc3NbV0xBTl9BRERSX0xFTl07CisJVUlOVDE2CWtleV9pbmRleDsKKwlVSU5UOCAJa2V5WzE2XTsKKwlVSU5UOCAJbWljX3RyYW5zbWl0X2tleVs0XTsKKwlVSU5UOCAJbWljX3JlY2VpdmVfa2V5WzRdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1dFUEtleU1hcHBpbmdfdDsKKworLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogV1BBRGF0YSAgICAgICAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfV1BBRGF0YQoreworCVVJTlQxNglkYXRhbGVuOworICAgICAgICBVSU5UOCAJZGF0YVswXTsgLy8gbWF4IDgwCit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfV1BBRGF0YV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb25maWd1cmF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOiBCZWhhdmlvciBQYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFRpY2tUaW1lIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfVGlja1RpbWUKK3sKKwlVSU5UMTYJVGlja1RpbWU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfVGlja1RpbWVfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW5mb3JtYXRpb24gUmVjb3JkIFN0cnVjdHVyZXM6IE5JQyBJbmZvcm1hdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTWF4TG9hZFRpbWUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NYXhMb2FkVGltZQoreworCVVJTlQxNglNYXhMb2FkVGltZTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NYXhMb2FkVGltZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogRG93bkxvYWRCdWZmZXIgLS0qLworLyogTk9URTogVGhlIHBhZ2UgYW5kIG9mZnNldCBhcmUgaW4gQVVYIGZvcm1hdCAqLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcgoreworCVVJTlQxNglwYWdlOworCVVJTlQxNglvZmZzZXQ7CisJVUlOVDE2CWxlbjsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcl90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUFJJSWRlbnRpdHkgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QUklJZGVudGl0eQoreworCVVJTlQxNglQUklDb21wSUQ7CisJVUlOVDE2CVBSSVZhcmlhbnQ7CisJVUlOVDE2CVBSSU1ham9yVmVyc2lvbjsKKwlVSU5UMTYJUFJJTWlub3JWZXJzaW9uOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BSSUlkZW50aXR5X3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQUklTdXBSYW5nZSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BSSVN1cFJhbmdlCit7CisJVUlOVDE2CVBSSVJvbGU7CisJVUlOVDE2CVBSSUlEOworCVVJTlQxNglQUklWYXJpYW50OworCVVJTlQxNglQUklCb3R0b207CisJVUlOVDE2CVBSSVRvcDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9QUklTdXBSYW5nZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ0ZJQWN0UmFuZ2VzIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ0ZJQWN0UmFuZ2VzCit7CisJVUlOVDE2CUNGSVJvbGU7CisJVUlOVDE2CUNGSUlEOworCVVJTlQxNglDRklWYXJpYW50OworCVVJTlQxNglDRklCb3R0b207CisJVUlOVDE2CUNGSVRvcDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DRklBY3RSYW5nZXNfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE5JQ1NlcmlhbE51bWJlciAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X05JQ1NlcmlhbE51bWJlcgoreworCVVJTlQ4CU5JQ1NlcmlhbE51bWJlclsxMl07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTklDU2VyaWFsTnVtYmVyX3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBOSUNJZGVudGl0eSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X05JQ0lkZW50aXR5Cit7CisJVUlOVDE2CU5JQ0NvbXBJRDsKKwlVSU5UMTYJTklDVmFyaWFudDsKKwlVSU5UMTYJTklDTWFqb3JWZXJzaW9uOworCVVJTlQxNglOSUNNaW5vclZlcnNpb247Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTklDSWRlbnRpdHlfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE1GSVN1cFJhbmdlIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfTUZJU3VwUmFuZ2UKK3sKKwlVSU5UMTYJTUZJUm9sZTsKKwlVSU5UMTYJTUZJSUQ7CisJVUlOVDE2CU1GSVZhcmlhbnQ7CisJVUlOVDE2CU1GSUJvdHRvbTsKKwlVSU5UMTYJTUZJVG9wOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01GSVN1cFJhbmdlX3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDRklTdXBSYW5nZSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NGSVN1cFJhbmdlCit7CisJVUlOVDE2CUNGSVJvbGU7CisJVUlOVDE2CUNGSUlEOworCVVJTlQxNglDRklWYXJpYW50OworCVVJTlQxNglDRklCb3R0b207CisJVUlOVDE2CUNGSVRvcDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DRklTdXBSYW5nZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQlVJTERTRVE6QnVpbGRTZXEgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9CdWlsZFNlcSB7CisJVUlOVDE2CXByaW1hcnk7CisJVUlOVDE2CXNlY29uZGFyeTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9CdWlsZFNlcV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogRldJRCAtLSovCisjZGVmaW5lIEhGQTM4NHhfRldJRF9MRU4JMTQKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfRldJRCB7CisJVUlOVDgJcHJpbWFyeVtIRkEzODR4X0ZXSURfTEVOXTsKKwlVSU5UOAlzZWNvbmRhcnlbSEZBMzg0eF9GV0lEX0xFTl07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfRldJRF90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ2hhbm5lbExpc3QgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DaGFubmVsTGlzdAoreworCVVJTlQxNglDaGFubmVsTGlzdDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DaGFubmVsTGlzdF90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUmVndWxhdG9yeURvbWFpbnMgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9SZWd1bGF0b3J5RG9tYWlucworeworCVVJTlQ4CVJlZ3VsYXRvcnlEb21haW5zWzEyXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9SZWd1bGF0b3J5RG9tYWluc190OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogVGVtcFR5cGUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9UZW1wVHlwZQoreworCVVJTlQxNglUZW1wVHlwZTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9UZW1wVHlwZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ0lTIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ0lTCit7CisJVUlOVDgJQ0lTWzQ4MF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ0lTX3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBTVEFJZGVudGl0eSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NUQUlkZW50aXR5Cit7CisJVUlOVDE2CVNUQUNvbXBJRDsKKwlVSU5UMTYJU1RBVmFyaWFudDsKKwlVSU5UMTYJU1RBTWFqb3JWZXJzaW9uOworCVVJTlQxNglTVEFNaW5vclZlcnNpb247Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU1RBSWRlbnRpdHlfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFNUQVN1cFJhbmdlIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfU1RBU3VwUmFuZ2UKK3sKKwlVSU5UMTYJU1RBUm9sZTsKKwlVSU5UMTYJU1RBSUQ7CisJVUlOVDE2CVNUQVZhcmlhbnQ7CisJVUlOVDE2CVNUQUJvdHRvbTsKKwlVSU5UMTYJU1RBVG9wOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1NUQVN1cFJhbmdlX3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBNRklBY3RSYW5nZXMgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NRklBY3RSYW5nZXMKK3sKKwlVSU5UMTYJTUZJUm9sZTsKKwlVSU5UMTYJTUZJSUQ7CisJVUlOVDE2CU1GSVZhcmlhbnQ7CisJVUlOVDE2CU1GSUJvdHRvbTsKKwlVSU5UMTYJTUZJVG9wOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01GSUFjdFJhbmdlc190OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbmZvcm1hdGlvbiBSZWNvcmQgU3RydWN0dXJlczogTklDIEluZm9ybWF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQb3J0U3RhdHVzIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfUG9ydFN0YXR1cworeworCVVJTlQxNglQb3J0U3RhdHVzOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BvcnRTdGF0dXNfdDsKKworI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfRElTQUJMRUQJKChVSU5UMTYpMSkKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX1NFQVJDSElORwkoKFVJTlQxNikyKQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9JQlNTCSgoVUlOVDE2KTMpCisjZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19DT05OX0VTUwkoKFVJTlQxNik0KQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfT1VUT0ZSQU5HRQkoKFVJTlQxNik1KQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9XRFMJKChVSU5UMTYpNikKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRTU0lEIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudFNTSUQKK3sKKwlVSU5UOAlDdXJyZW50U1NJRFszNF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudFNTSURfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRCU1NJRCAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRCU1NJRAoreworCVVJTlQ4CUN1cnJlbnRCU1NJRFs2XTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50QlNTSURfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IGNvbW1zcXVhbGl0eSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NvbW1zcXVhbGl0eQoreworCVVJTlQxNglDUV9jdXJyQlNTOworCVVJTlQxNglBU0xfY3VyckJTUzsKKwlVSU5UMTYJQU5MX2N1cnJGQzsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jb21tc3F1YWxpdHlfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IGRtYmNvbW1zcXVhbGl0eSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2RibWNvbW1zcXVhbGl0eQoreworCVVJTlQxNglDUWRibV9jdXJyQlNTOworCVVJTlQxNglBU0xkYm1fY3VyckJTUzsKKwlVSU5UMTYJQU5MZGJtX2N1cnJGQzsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9kYm1jb21tc3F1YWxpdHlfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRUeFJhdGUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50VHhSYXRlCit7CisJVUlOVDE2CUN1cnJlbnRUeFJhdGU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudFR4UmF0ZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudEJlYWNvbkludGVydmFsIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudEJlYWNvbkludGVydmFsCit7CisJVUlOVDE2CUN1cnJlbnRCZWFjb25JbnRlcnZhbDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50QmVhY29uSW50ZXJ2YWxfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRTY2FsZVRocmVzaG9sZHMgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50U2NhbGVUaHJlc2hvbGRzCit7CisJVUlOVDE2CUVuZXJneURldGVjdFRocmVzaG9sZDsKKwlVSU5UMTYJQ2FycmllckRldGVjdFRocmVzaG9sZDsKKwlVSU5UMTYJRGVmZXJEZXRlY3RUaHJlc2hvbGQ7CisJVUlOVDE2CUNlbGxTZWFyY2hUaHJlc2hvbGQ7IC8qIFN0YXRpb25zIG9ubHkgKi8KKwlVSU5UMTYJRGVhZFNwb3RUaHJlc2hvbGQ7IC8qIFN0YXRpb25zIG9ubHkgKi8KK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50U2NhbGVUaHJlc2hvbGRzX3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQcm90b2NvbFJzcFRpbWUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Qcm90b2NvbFJzcFRpbWUKK3sKKwlVSU5UMTYJUHJvdG9jb2xSc3BUaW1lOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1Byb3RvY29sUnNwVGltZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogU2hvcnRSZXRyeUxpbWl0IC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfU2hvcnRSZXRyeUxpbWl0Cit7CisJVUlOVDE2CVNob3J0UmV0cnlMaW1pdDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TaG9ydFJldHJ5TGltaXRfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IExvbmdSZXRyeUxpbWl0IC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfTG9uZ1JldHJ5TGltaXQKK3sKKwlVSU5UMTYJTG9uZ1JldHJ5TGltaXQ7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTG9uZ1JldHJ5TGltaXRfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE1heFRyYW5zbWl0TGlmZXRpbWUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NYXhUcmFuc21pdExpZmV0aW1lCit7CisJVUlOVDE2CU1heFRyYW5zbWl0TGlmZXRpbWU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTWF4VHJhbnNtaXRMaWZldGltZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTWF4UmVjZWl2ZUxpZmV0aW1lIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfTWF4UmVjZWl2ZUxpZmV0aW1lCit7CisJVUlOVDE2CU1heFJlY2VpdmVMaWZldGltZTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NYXhSZWNlaXZlTGlmZXRpbWVfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IENGUG9sbGFibGUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DRlBvbGxhYmxlCit7CisJVUlOVDE2CUNGUG9sbGFibGU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ0ZQb2xsYWJsZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQXV0aGVudGljYXRpb25BbGdvcml0aG1zIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfQXV0aGVudGljYXRpb25BbGdvcml0aG1zCit7CisJVUlOVDE2CUF1dGhlbnRpY2F0aW9uVHlwZTsKKwlVSU5UMTYJVHlwZUVuYWJsZWQ7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQXV0aGVudGljYXRpb25BbGdvcml0aG1zX3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBBdXRoZW50aWNhdGlvbkFsZ29yaXRobXMKKyhkYXRhIG9ubHkgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9BdXRoZW50aWNhdGlvbkFsZ29yaXRobXNfZGF0YQoreworCVVJTlQxNglBdXRoZW50aWNhdGlvblR5cGU7CisJVUlOVDE2CVR5cGVFbmFibGVkOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0F1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc19kYXRhX3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Qcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQKK3sKKwlVSU5UMTYJUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1ByaXZhY3lPcHRpb25JbXBsZW1lbnRlZF90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogT3duTUFDQWRkcmVzcyAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X093bk1BQ0FkZHJlc3MKK3sKKwlVSU5UOAlPd25NQUNBZGRyZXNzWzZdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X093bk1BQ0FkZHJlc3NfdDsKKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFBDRkluZm8gLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QQ0ZJbmZvCit7CisJVUlOVDE2CU1lZGl1bU9jY3VwYW5jeUxpbWl0OworCVVJTlQxNglDRlBQZXJpb2Q7CisJVUlOVDE2CUNGUE1heER1cmF0aW9uOworCVVJTlQxNglDRlBGbGFnczsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9QQ0ZJbmZvX3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQQ0ZJbmZvIChkYXRhIHBvcnRpb24gb25seSkgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QQ0ZJbmZvX2RhdGEKK3sKKwlVSU5UMTYJTWVkaXVtT2NjdXBhbmN5TGltaXQ7CisJVUlOVDE2CUNGUFBlcmlvZDsKKwlVSU5UMTYJQ0ZQTWF4RHVyYXRpb247CisJVUlOVDE2CUNGUEZsYWdzOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BDRkluZm9fZGF0YV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbmZvcm1hdGlvbiBSZWNvcmQgU3RydWN0dXJlczogTW9kZW0gSW5mb3JtYXRpb24gUmVjb3JkcyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFBIWVR5cGUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QSFlUeXBlCit7CisJVUlOVDE2CVBIWVR5cGU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUEhZVHlwZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudENoYW5uZWwgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50Q2hhbm5lbAoreworCVVJTlQxNglDdXJyZW50Q2hhbm5lbDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50Q2hhbm5lbF90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudFBvd2VyU3RhdGUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50UG93ZXJTdGF0ZQoreworCVVJTlQxNglDdXJyZW50UG93ZXJTdGF0ZTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50UG93ZXJTdGF0ZV90OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ0NBTW9kZSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NDQU1vZGUKK3sKKwlVSU5UMTYJQ0NBTW9kZTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DQ0FNb2RlX3Q7CisKKy8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBTdXBwb3J0ZWREYXRhUmF0ZXMgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TdXBwb3J0ZWREYXRhUmF0ZXMKK3sKKwlVSU5UOAlTdXBwb3J0ZWREYXRhUmF0ZXNbMTBdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1N1cHBvcnRlZERhdGFSYXRlc190OworCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTEZPU3RhdHVzIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfTEZPU3RhdHVzICAgICAgICAgIAoreworCVVJTlQxNiAgVGVzdFJlc3VsdHM7CisJVUlOVDE2ICBMRk9SZXN1bHQ7CisJVUlOVDE2ICBWUkhGT1Jlc3VsdDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9MRk9TdGF0dXNfdDsKKworI2RlZmluZSBIRkEzODR4X1RFU1RSRVNVTFRfQUxMUEFTU0VEICAgIEJJVDAKKyNkZWZpbmUgSEZBMzg0eF9URVNUUkVTVUxUX0xGT19GQUlMICAgICBCSVQxCisjZGVmaW5lIEhGQTM4NHhfVEVTVFJFU1VMVF9WUl9IRjBfRkFJTCAgQklUMgorI2RlZmluZSBIRkEzODR4X0hPU1RfRklSTV9DT09SRElOQVRFICAgIEJJVDcKKyNkZWZpbmUgSEZBMzg0eF9URVNUUkVTVUxUX0NPT1JESU5BVEUgICBCSVQxNQorCisvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTEVEQ29udHJvbCAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0xFRENvbnRyb2wKK3sKKwlVSU5UMTYgIHNlYXJjaGluZ19vbjsKKwlVSU5UMTYgIHNlYXJjaGluZ19vZmY7CisJVUlOVDE2ICBhc3NvY19vbjsKKwlVSU5UMTYgIGFzc29jX29mZjsKKwlVSU5UMTYgIGFjdGl2aXR5OworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0xFRENvbnRyb2xfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICBGUkFNRSBERVNDUklQVE9SUyBBTkQgRlJBTUUgU1RSVUNUVVJFUworCitGUkFNRSBERVNDUklQVE9SUzogT2Zmc2V0cworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb250cm9sIEluZm8gKG9mZnNldCA0NC01MSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfRkRfU1RBVFVTX09GRgkJCSgoVUlOVDE2KTB4NDQpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1RJTUVfT0ZGCQkJKChVSU5UMTYpMHg0NikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU1dTVVBQT1JUX09GRgkJKChVSU5UMTYpMHg0QSkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU0lMRU5DRV9PRkYJCQkoKFVJTlQxNikweDRBKQorI2RlZmluZQkJSEZBMzg0eF9GRF9TSUdOQUxfT0ZGCQkJKChVSU5UMTYpMHg0QikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfUkFURV9PRkYJCQkoKFVJTlQxNikweDRDKQorI2RlZmluZQkJSEZBMzg0eF9GRF9SWEZMT1dfT0ZGCQkJKChVSU5UMTYpMHg0RCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfUkVTRVJWRURfT0ZGCQkJKChVSU5UMTYpMHg0RSkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfVFhDT05UUk9MX09GRgkJKChVSU5UMTYpMHg1MCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzgwMi4xMSBIZWFkZXIgKG9mZnNldCA1Mi02QikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfRkRfRlJBTUVDT05UUk9MX09GRgkJKChVSU5UMTYpMHg1MikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfRFVSQVRJT05JRF9PRkYJCSgoVUlOVDE2KTB4NTQpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MxX09GRgkJCSgoVUlOVDE2KTB4NTYpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MyX09GRgkJCSgoVUlOVDE2KTB4NUMpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MzX09GRgkJCSgoVUlOVDE2KTB4NjIpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1NFUUNPTlRST0xfT0ZGCQkoKFVJTlQxNikweDY4KQorI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTNF9PRkYJCQkoKFVJTlQxNikweDZBKQorI2RlZmluZQkJSEZBMzg0eF9GRF9EQVRBTEVOX09GRgkJCSgoVUlOVDE2KTB4NzApIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorODAyLjMgSGVhZGVyIChvZmZzZXQgNzItN0YpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X0ZEX0RFU1RBRERSRVNTX09GRgkJKChVSU5UMTYpMHg3MikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU1JDQUREUkVTU19PRkYJCSgoVUlOVDE2KTB4NzgpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0RBVEFMRU5HVEhfT0ZGCQkoKFVJTlQxNikweDdFKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGUkFNRSBTVFJVQ1RVUkVTOiBDb21tdW5pY2F0aW9uIEZyYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRyYW5zbWl0IEZyYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLSBDb21tdW5pY2F0aW9uIEZyYW1lOiBUcmFuc21pdCBGcmFtZSBTdHJ1Y3R1cmUgLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF90eF9mcmFtZQoreworCVVJTlQxNglzdGF0dXM7CisJVUlOVDE2CXJlc2VydmVkMTsKKwlVSU5UMTYJcmVzZXJ2ZWQyOworCVVJTlQzMglzd19zdXBwb3J0OworCVVJTlQ4CXR4X3JldHJ5Y291bnQ7CisJVUlOVDggICB0eF9yYXRlOworCVVJTlQxNgl0eF9jb250cm9sOworCisJLyotLSA4MDIuMTEgSGVhZGVyIEluZm9ybWF0aW9uIC0tKi8KKworCVVJTlQxNglmcmFtZV9jb250cm9sOworCVVJTlQxNglkdXJhdGlvbl9pZDsKKwlVSU5UOAlhZGRyZXNzMVs2XTsKKwlVSU5UOAlhZGRyZXNzMls2XTsKKwlVSU5UOAlhZGRyZXNzM1s2XTsKKwlVSU5UMTYJc2VxdWVuY2VfY29udHJvbDsKKwlVSU5UOAlhZGRyZXNzNFs2XTsKKwlVSU5UMTYJZGF0YV9sZW47IC8qIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCisKKwkvKi0tIDgwMi4zIEhlYWRlciBJbmZvcm1hdGlvbiAtLSovCisKKwlVSU5UOAlkZXN0X2FkZHJbNl07CisJVUlOVDgJc3JjX2FkZHJbNl07CisJVUlOVDE2CWRhdGFfbGVuZ3RoOyAvKiBiaWcgZW5kaWFuIGZvcm1hdCAqLworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3R4X2ZyYW1lX3Q7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb21tdW5pY2F0aW9uIEZyYW1lczogRmllbGQgTWFza3MgZm9yIFRyYW5zbWl0IEZyYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLSBTdGF0dXMgRmllbGQgLS0qLworI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19BQ0tFUlIJCQkoKFVJTlQxNilCSVQ1KQorI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19GT1JNRVJSCQkoKFVJTlQxNilCSVQzKQorI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19ESVNDT04JCQkoKFVJTlQxNilCSVQyKQorI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19BR0VERVJSCQkoKFVJTlQxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUgkJKChVSU5UMTYpQklUMCkKKy8qLS0gVHJhbnNtaXQgQ29udHJvbCBGaWVsZCAtLSovCisjZGVmaW5lCQlIRkEzODR4X1RYX0NGUE9MTAkJCSgoVUlOVDE2KUJJVDEyKQorI2RlZmluZQkJSEZBMzg0eF9UWF9QUlNUCQkJCSgoVUlOVDE2KUJJVDExKQorI2RlZmluZQkJSEZBMzg0eF9UWF9NQUNQT1JUCQkJKChVSU5UMTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9UWF9OT0VOQ1JZUFQJCQkoKFVJTlQxNilCSVQ3KQorI2RlZmluZQkJSEZBMzg0eF9UWF9SRVRSWVNUUkFUCQkJKChVSU5UMTYpKEJJVDYgfCBCSVQ1KSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhfU1RSVUNUWVBFCQkJKChVSU5UMTYpKEJJVDQgfCBCSVQzKSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhfVFhFWAkJCQkoKFVJTlQxNilCSVQyKQorI2RlZmluZQkJSEZBMzg0eF9UWF9UWE9LCQkJCSgoVUlOVDE2KUJJVDEpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb21tdW5pY2F0aW9uIEZyYW1lczogVGVzdC9HZXQvU2V0IEZpZWxkIFZhbHVlcyBmb3IgVHJhbnNtaXQgRnJhbWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tIFN0YXR1cyBGaWVsZCAtLSovCisjZGVmaW5lIEhGQTM4NHhfVFhTVEFUVVNfSVNFUlJPUih2KQlcCisJKCgoVUlOVDE2KSh2KSkmXAorCShIRkEzODR4X1RYU1RBVFVTX0FDS0VSUnxIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlJ8XAorCUhGQTM4NHhfVFhTVEFUVVNfRElTQ09OfEhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUnxcCisJSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUikpCisKKyNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0FDS0VSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSKSkKKyNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0ZPUk1FUlIodikJKChVSU5UMTYpKCgoVUlOVDE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlIpKQorI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTRElTQ09OKHYpCSgoVUlOVDE2KSgoKFVJTlQxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19ESVNDT04pKQorI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTQUdFREVSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUikpCisjZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNSRVRSWUVSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfUkVUUllFUlIpKQorCisjZGVmaW5lCUhGQTM4NHhfVFhfR0VUKHYsbSxzKQkJKCgoKFVJTlQxNikodikpJigoVUlOVDE2KShtKSkpPj4oKFVJTlQxNikocykpKQorI2RlZmluZQlIRkEzODR4X1RYX1NFVCh2LG0scykJCSgoKChVSU5UMTYpKHYpKTw8KChVSU5UMTYpKHMpKSkmKChVSU5UMTYpKG0pKSkKKworI2RlZmluZQlIRkEzODR4X1RYX0NGUE9MTF9HRVQodikJSEZBMzg0eF9UWF9HRVQodiwgSEZBMzg0eF9UWF9DRlBPTEwsMTIpCisjZGVmaW5lCUhGQTM4NHhfVFhfQ0ZQT0xMX1NFVCh2KQlIRkEzODR4X1RYX1NFVCh2LCBIRkEzODR4X1RYX0NGUE9MTCwxMikKKyNkZWZpbmUJSEZBMzg0eF9UWF9QUlNUX0dFVCh2KQkJSEZBMzg0eF9UWF9HRVQodiwgSEZBMzg0eF9UWF9QUlNULDExKQorI2RlZmluZQlIRkEzODR4X1RYX1BSU1RfU0VUKHYpCQlIRkEzODR4X1RYX1NFVCh2LCBIRkEzODR4X1RYX1BSU1QsMTEpCisjZGVmaW5lCUhGQTM4NHhfVFhfTUFDUE9SVF9HRVQodikJSEZBMzg0eF9UWF9HRVQodiwgSEZBMzg0eF9UWF9NQUNQT1JULCA4KQorI2RlZmluZQlIRkEzODR4X1RYX01BQ1BPUlRfU0VUKHYpCUhGQTM4NHhfVFhfU0VUKHYsIEhGQTM4NHhfVFhfTUFDUE9SVCwgOCkKKyNkZWZpbmUJSEZBMzg0eF9UWF9OT0VOQ1JZUFRfR0VUKHYpCUhGQTM4NHhfVFhfR0VUKHYsIEhGQTM4NHhfVFhfTk9FTkNSWVBULCA3KQorI2RlZmluZQlIRkEzODR4X1RYX05PRU5DUllQVF9TRVQodikJSEZBMzg0eF9UWF9TRVQodiwgSEZBMzg0eF9UWF9OT0VOQ1JZUFQsIDcpCisjZGVmaW5lCUhGQTM4NHhfVFhfUkVUUllTVFJBVF9HRVQodikJSEZBMzg0eF9UWF9HRVQodiwgSEZBMzg0eF9UWF9SRVRSWVNUUkFULCA1KQorI2RlZmluZQlIRkEzODR4X1RYX1JFVFJZU1RSQVRfU0VUKHYpCUhGQTM4NHhfVFhfU0VUKHYsIEhGQTM4NHhfVFhfUkVUUllTVFJBVCwgNSkKKyNkZWZpbmUJSEZBMzg0eF9UWF9TVFJVQ1RZUEVfR0VUKHYpCUhGQTM4NHhfVFhfR0VUKHYsIEhGQTM4NHhfVFhfU1RSVUNUWVBFLCAzKQorI2RlZmluZQlIRkEzODR4X1RYX1NUUlVDVFlQRV9TRVQodikJSEZBMzg0eF9UWF9TRVQodiwgSEZBMzg0eF9UWF9TVFJVQ1RZUEUsIDMpCisjZGVmaW5lCUhGQTM4NHhfVFhfVFhFWF9HRVQodikJCUhGQTM4NHhfVFhfR0VUKHYsIEhGQTM4NHhfVFhfVFhFWCwgMikKKyNkZWZpbmUJSEZBMzg0eF9UWF9UWEVYX1NFVCh2KQkJSEZBMzg0eF9UWF9TRVQodiwgSEZBMzg0eF9UWF9UWEVYLCAyKQorI2RlZmluZQlIRkEzODR4X1RYX1RYT0tfR0VUKHYpCQlIRkEzODR4X1RYX0dFVCh2LCBIRkEzODR4X1RYX1RYT0ssIDEpCisjZGVmaW5lCUhGQTM4NHhfVFhfVFhPS19TRVQodikJCUhGQTM4NHhfVFhfU0VUKHYsIEhGQTM4NHhfVFhfVFhPSywgMSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbW11bmljYXRpb24gRnJhbWVzOiBSZWNlaXZlIEZyYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLSBDb21tdW5pY2F0aW9uIEZyYW1lOiBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3J4X2ZyYW1lCit7CisJLyotLSBNQUMgcnggZGVzY3JpcHRvciAoaGZhMzg0eCBieXRlIG9yZGVyKSAtLSovCisJVUlOVDE2CXN0YXR1czsKKwlVSU5UMzIJdGltZTsKKwlVSU5UOAlzaWxlbmNlOworCVVJTlQ4CXNpZ25hbDsKKwlVSU5UOAlyYXRlOworCVVJTlQ4CXJ4X2Zsb3c7CisJVUlOVDE2CXJlc2VydmVkMTsKKwlVSU5UMTYJcmVzZXJ2ZWQyOworCisJLyotLSA4MDIuMTEgSGVhZGVyIEluZm9ybWF0aW9uICg4MDIuMTEgYnl0ZSBvcmRlcikgLS0qLworCVVJTlQxNglmcmFtZV9jb250cm9sOworCVVJTlQxNglkdXJhdGlvbl9pZDsKKwlVSU5UOAlhZGRyZXNzMVs2XTsKKwlVSU5UOAlhZGRyZXNzMls2XTsKKwlVSU5UOAlhZGRyZXNzM1s2XTsKKwlVSU5UMTYJc2VxdWVuY2VfY29udHJvbDsKKwlVSU5UOAlhZGRyZXNzNFs2XTsKKwlVSU5UMTYJZGF0YV9sZW47IC8qIGhmYTM4NHggKGxpdHRsZSBlbmRpYW4pIGZvcm1hdCAqLworCisJLyotLSA4MDIuMyBIZWFkZXIgSW5mb3JtYXRpb24gLS0qLworCVVJTlQ4CWRlc3RfYWRkcls2XTsKKwlVSU5UOAlzcmNfYWRkcls2XTsKKwlVSU5UMTYJZGF0YV9sZW5ndGg7IC8qIElFRUU/IChiaWcgZW5kaWFuKSBmb3JtYXQgKi8KK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9yeF9mcmFtZV90OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBSZWNlaXZlIEZyYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLSBPZmZzZXRzIC0tLS0tLS0tKi8KKyNkZWZpbmUJCUhGQTM4NHhfUlhfREFUQV9MRU5fT0ZGCQkJKChVSU5UMTYpNDQpCisjZGVmaW5lCQlIRkEzODR4X1JYXzgwMjExSERSX09GRgkJCSgoVUlOVDE2KTE0KQorI2RlZmluZQkJSEZBMzg0eF9SWF9EQVRBX09GRgkJCSgoVUlOVDE2KTYwKQorCisvKi0tIFN0YXR1cyBGaWVsZHMgLS0qLworI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFCQkoKFVJTlQxNikoQklUMTUgfCBCSVQxNCB8IEJJVDEzKSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVAkJKChVSU5UMTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19VTkRFQ1IJCQkoKFVJTlQxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19GQ1NFUlIJCQkoKFVJTlQxNilCSVQwKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRlc3QvR2V0L1NldCBGaWVsZCBWYWx1ZXMgZm9yIFJlY2VpdmUgRnJhbWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01TR1RZUEVfR0VUKHZhbHVlKQkoKFVJTlQxNikoKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFKSA+PiAxMykpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01TR1RZUEVfU0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTMpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX0dFVCh2YWx1ZSkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVCkgPj4gOCkpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlRfU0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgOCkpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0lTVU5ERUNSKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX1VOREVDUikpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0lTRkNTRVJSKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX0ZDU0VSUikpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlJBTUUgU1RSVUNUVVJFUzogSW5mb3JtYXRpb24gVHlwZXMgYW5kIEluZm9ybWF0aW9uIEZyYW1lIFN0cnVjdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0luZm9ybWF0aW9uIFR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRkEzODR4X0lUX0hBTkRPVkVSQUREUgkJCSgoVUlOVDE2KTB4RjAwMFVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9IQU5ET1ZFUkRFQVVUSEFERFJFU1MJKChVSU5UMTYpMHhGMDAxVUwpLy9BUCAxLjMuNworI2RlZmluZQkJSEZBMzg0eF9JVF9DT01NVEFMTElFUwkJCSgoVUlOVDE2KTB4RjEwMFVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9TQ0FOUkVTVUxUUwkJCSgoVUlOVDE2KTB4RjEwMVVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9DSElORk9SRVNVTFRTCQkoKFVJTlQxNikweEYxMDJVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfSE9TVFNDQU5SRVNVTFRTCQkoKFVJTlQxNikweEYxMDNVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfTElOS1NUQVRVUwkJCSgoVUlOVDE2KTB4RjIwMFVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9BU1NPQ1NUQVRVUwkJCSgoVUlOVDE2KTB4RjIwMVVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9BVVRIUkVRCQkJKChVSU5UMTYpMHhGMjAyVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX1BTVVNFUkNOVAkJCSgoVUlOVDE2KTB4RjIwM1VMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9LRVlJRENIQU5HRUQJCQkoKFVJTlQxNikweEYyMDRVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfQVNTT0NSRVEgICAgCQkJKChVSU5UMTYpMHhGMjA1VUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX01JQ0ZBSUxVUkUgIAkJCSgoVUlOVDE2KTB4RjIwNlVMKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbmZvcm1hdGlvbiBGcmFtZXMgU3RydWN0dXJlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW5mb3JtYXRpb24gRnJhbWVzOiBOb3RpZmljYXRpb24gRnJhbWUgU3RydWN0dXJlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLSAgTm90aWZpY2F0aW9uIEZyYW1lLE1BQyBNZ210OiBIYW5kb3ZlciBBZGRyZXNzIC0tKi8KK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfSGFuZG92ZXJBZGRyCit7CisJVUlOVDE2CWZyYW1lbGVuOworCVVJTlQxNglpbmZvdHlwZTsKKwlVSU5UOAloYW5kb3Zlcl9hZGRyW1dMQU5fQlNTSURfTEVOXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9IYW5kb3ZlckFkZHJfdDsKKworLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IENvbW11bmljYXRpb24gVGFsbGllcyAtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMTYKK3sKKwlVSU5UMTYJdHh1bmljYXN0ZnJhbWVzOworCVVJTlQxNgl0eG11bHRpY2FzdGZyYW1lczsKKwlVSU5UMTYJdHhmcmFnbWVudHM7CisJVUlOVDE2CXR4dW5pY2FzdG9jdGV0czsKKwlVSU5UMTYJdHhtdWx0aWNhc3RvY3RldHM7CisJVUlOVDE2CXR4ZGVmZXJyZWR0cmFuczsKKwlVSU5UMTYJdHhzaW5nbGVyZXRyeWZyYW1lczsKKwlVSU5UMTYJdHhtdWx0aXBsZXJldHJ5ZnJhbWVzOworCVVJTlQxNgl0eHJldHJ5bGltaXRleGNlZWRlZDsKKwlVSU5UMTYJdHhkaXNjYXJkczsKKwlVSU5UMTYJcnh1bmljYXN0ZnJhbWVzOworCVVJTlQxNglyeG11bHRpY2FzdGZyYW1lczsKKwlVSU5UMTYJcnhmcmFnbWVudHM7CisJVUlOVDE2CXJ4dW5pY2FzdG9jdGV0czsKKwlVSU5UMTYJcnhtdWx0aWNhc3RvY3RldHM7CisJVUlOVDE2CXJ4ZmNzZXJyb3JzOworCVVJTlQxNglyeGRpc2NhcmRzbm9idWZmZXI7CisJVUlOVDE2CXR4ZGlzY2FyZHN3cm9uZ3NhOworCVVJTlQxNglyeGRpc2NhcmRzd2VwdW5kZWNyOworCVVJTlQxNglyeG1zZ2lubXNnZnJhZzsKKwlVSU5UMTYJcnhtc2dpbmJhZG1zZ2ZyYWc7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ29tbVRhbGxpZXMxNl90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMzIKK3sKKwlVSU5UMzIJdHh1bmljYXN0ZnJhbWVzOworCVVJTlQzMgl0eG11bHRpY2FzdGZyYW1lczsKKwlVSU5UMzIJdHhmcmFnbWVudHM7CisJVUlOVDMyCXR4dW5pY2FzdG9jdGV0czsKKwlVSU5UMzIJdHhtdWx0aWNhc3RvY3RldHM7CisJVUlOVDMyCXR4ZGVmZXJyZWR0cmFuczsKKwlVSU5UMzIJdHhzaW5nbGVyZXRyeWZyYW1lczsKKwlVSU5UMzIJdHhtdWx0aXBsZXJldHJ5ZnJhbWVzOworCVVJTlQzMgl0eHJldHJ5bGltaXRleGNlZWRlZDsKKwlVSU5UMzIJdHhkaXNjYXJkczsKKwlVSU5UMzIJcnh1bmljYXN0ZnJhbWVzOworCVVJTlQzMglyeG11bHRpY2FzdGZyYW1lczsKKwlVSU5UMzIJcnhmcmFnbWVudHM7CisJVUlOVDMyCXJ4dW5pY2FzdG9jdGV0czsKKwlVSU5UMzIJcnhtdWx0aWNhc3RvY3RldHM7CisJVUlOVDMyCXJ4ZmNzZXJyb3JzOworCVVJTlQzMglyeGRpc2NhcmRzbm9idWZmZXI7CisJVUlOVDMyCXR4ZGlzY2FyZHN3cm9uZ3NhOworCVVJTlQzMglyeGRpc2NhcmRzd2VwdW5kZWNyOworCVVJTlQzMglyeG1zZ2lubXNnZnJhZzsKKwlVSU5UMzIJcnhtc2dpbmJhZG1zZ2ZyYWc7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ29tbVRhbGxpZXMzMl90OworCisvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogU2NhbiBSZXN1bHRzICYgU3ViZmllbGRzLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0U3ViCit7CisJVUlOVDE2CWNoaWQ7CisJVUlOVDE2CWFubDsKKwlVSU5UMTYJc2w7CisJVUlOVDgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOworCVVJTlQxNgliY25pbnQ7CisJVUlOVDE2CWNhcGluZm87CisJaGZhMzg0eF9ieXRlc3RyMzJfdAlzc2lkOworCVVJTlQ4CXN1cHByYXRlc1sxMF07IC8qIDgwMi4xMSBpbmZvIGVsZW1lbnQgKi8KKwlVSU5UMTYJcHJvYmVyZXNwX3JhdGU7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU2NhblJlc3VsdFN1Yl90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NjYW5SZXN1bHQKK3sKKwlVSU5UMTYJcnN2ZDsKKwlVSU5UMTYJc2NhbnJlYXNvbjsKKwloZmEzODR4X1NjYW5SZXN1bHRTdWJfdAorCQlyZXN1bHRbSEZBMzg0eF9TQ0FOUkVTVUxUX01BWF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU2NhblJlc3VsdF90OworCisvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogQ2hJbmZvIFJlc3VsdHMgJiBTdWJmaWVsZHMtLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1YgoreworCVVJTlQxNgljaGlkOworCVVJTlQxNglhbmw7CisJVUlOVDE2CXBubDsKKwlVSU5UMTYJYWN0aXZlOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90OworCisjZGVmaW5lIEhGQTM4NHhfQ0hJTkZPUkVTVUxUX0JTU0FDVElWRQlCSVQwCisjZGVmaW5lIEhGQTM4NHhfQ0hJTkZPUkVTVUxUX1BDRkFDVElWRQlCSVQxCisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0Cit7CisJVUlOVDE2CXNjYW5jaGFubmVsczsKKwloZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90CQorCQlyZXN1bHRbSEZBMzg0eF9DSElORk9SRVNVTFRfTUFYXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DaEluZm9SZXN1bHRfdDsKKworLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IEhvc3QgU2NhbiBSZXN1bHRzICYgU3ViZmllbGRzLS0qLwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdFN1YgoreworCVVJTlQxNgljaGlkOworCVVJTlQxNglhbmw7CisJVUlOVDE2CXNsOworCVVJTlQ4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKKwlVSU5UMTYJYmNuaW50OworCVVJTlQxNgljYXBpbmZvOworCWhmYTM4NHhfYnl0ZXN0cjMyX3QJc3NpZDsKKwlVSU5UOAlzdXBwcmF0ZXNbMTBdOyAvKiA4MDIuMTEgaW5mbyBlbGVtZW50ICovCisJVUlOVDE2CXByb2JlcmVzcF9yYXRlOworCVVJTlQxNglhdGltOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0hTY2FuUmVzdWx0U3ViX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHQKK3sKKwlVSU5UMTYJbnJlc3VsdDsKKwlVSU5UMTYJcnN2ZDsKKwloZmEzODR4X0hTY2FuUmVzdWx0U3ViX3QKKwkJcmVzdWx0W0hGQTM4NHhfSFNDQU5SRVNVTFRfTUFYXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9IU2NhblJlc3VsdF90OworCisvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IExpbmtTdGF0dXMgLS0qLworCisjZGVmaW5lIEhGQTM4NHhfTElOS19OT1RDT05ORUNURUQJKChVSU5UMTYpMCkKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0NPTk5FQ1RFRAkJKChVSU5UMTYpMSkKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0RJU0NPTk5FQ1RFRAkoKFVJTlQxNikyKQorI2RlZmluZSBIRkEzODR4X0xJTktfQVBfQ0hBTkdFCQkoKFVJTlQxNikzKQorI2RlZmluZSBIRkEzODR4X0xJTktfQVBfT1VUT0ZSQU5HRQkoKFVJTlQxNik0KQorI2RlZmluZSBIRkEzODR4X0xJTktfQVBfSU5SQU5HRQkJKChVSU5UMTYpNSkKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0FTU09DRkFJTAkJKChVSU5UMTYpNikKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9MaW5rU3RhdHVzCit7CisJVUlOVDE2CWxpbmtzdGF0dXM7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTGlua1N0YXR1c190OworCisKKy8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogQXNzb2NpYXRpb25TdGF0dXMgKC0tKi8KKworI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX1NUQUFTU09DCSgoVUlOVDE2KTEpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfUkVBU1NPQwkoKFVJTlQxNikyKQorI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX0RJU0FTU09DCSgoVUlOVDE2KTMpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfQVNTT0NGQUlMCSgoVUlOVDE2KTQpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfQVVUSEZBSUwJKChVSU5UMTYpNSkKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Bc3NvY1N0YXR1cworeworCVVJTlQxNglhc3NvY3N0YXR1czsKKwlVSU5UOAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKKwkvKiBvbGRfYXBfYWRkciBpcyBvbmx5IHZhbGlkIGlmIGFzc29jc3RhdHVzID09IDIgKi8KKwlVSU5UOAlvbGRfYXBfYWRkcltXTEFOX0FERFJfTEVOXTsKKwlVSU5UMTYJcmVhc29uOworCVVJTlQxNglyZXNlcnZlZDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Bc3NvY1N0YXR1c190OworCisvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IEF1dGhSZXF1ZXN0IChBUCBPbmx5KSAtLSovCisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfQXV0aFJlcXVlc3QKK3sKKwlVSU5UOAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKKwlVSU5UMTYJYWxnb3JpdGhtOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0F1dGhSZXFfdDsKKworLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBBc3NvY1JlcXVlc3QgKEFQIE9ubHkpIC0tKi8KKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Bc3NvY1JlcXVlc3QKK3sKKwlVSU5UOAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKKwlVSU5UMTYJdHlwZTsKKwlVSU5UOCAgIHdwYV9kYXRhWzgwXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Bc3NvY1JlcV90OworCisKKyNkZWZpbmUgSEZBMzg0eF9BU1NPQ1JFUV9UWVBFX0FTU09DICAgICAwCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NSRVFfVFlQRV9SRUFTU09DICAgMQorCisvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IE1JQyBGYWlsdXJlICAoQVAgT25seSkgLS0qLworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X01pY0ZhaWx1cmUgIAoreworCVVJTlQ4CXNlbmRlcltXTEFOX0FERFJfTEVOXTsKKwlVSU5UOAlkZXN0W1dMQU5fQUREUl9MRU5dOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01pY0ZhaWx1cmVfdDsKKworLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBQU1VzZXJDb3VudCAoQVAgT25seSkgLS0qLworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BTVXNlckNvdW50Cit7CisJVUlOVDE2CXVzZXJjbnQ7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUFNVc2VyQ291bnRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9LZXlJRENoYW5nZWQKK3sKKwlVSU5UOAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKKwlVSU5UMTYJa2V5aWQ7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfS2V5SURDaGFuZ2VkX3Q7CisKKy8qLS0gIENvbGxlY3Rpb24gb2YgYWxsIEluZiBmcmFtZXMgLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdW5pb24gaGZhMzg0eF9pbmZvZGF0YSB7CisJaGZhMzg0eF9Db21tVGFsbGllczE2X3QJY29tbXRhbGxpZXMxNjsKKwloZmEzODR4X0NvbW1UYWxsaWVzMzJfdAljb21tdGFsbGllczMyOworCWhmYTM4NHhfU2NhblJlc3VsdF90CXNjYW5yZXN1bHQ7CisJaGZhMzg0eF9DaEluZm9SZXN1bHRfdAljaGluZm9yZXN1bHQ7CisJaGZhMzg0eF9IU2NhblJlc3VsdF90CWhzY2FucmVzdWx0OworCWhmYTM4NHhfTGlua1N0YXR1c190CWxpbmtzdGF0dXM7CisJaGZhMzg0eF9Bc3NvY1N0YXR1c190CWFzc29jc3RhdHVzOworCWhmYTM4NHhfQXV0aFJlcV90CWF1dGhyZXE7CisJaGZhMzg0eF9QU1VzZXJDb3VudF90CXBzdXNlcmNudDsKKwloZmEzODR4X0tleUlEQ2hhbmdlZF90ICBrZXlpZGNoYW5nZWQ7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfaW5mb2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZQoreworCVVJTlQxNgkJCWZyYW1lbGVuOworCVVJTlQxNgkJCWluZm90eXBlOworCWhmYTM4NHhfaW5mb2RhdGFfdAlpbmZvOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0luZkZyYW1lX3Q7CisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitVU0IgUGFja2V0IHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2hvdWxkIGJlIHNlbnQgdG8gdGhlIGN0cmxvdXQgZW5kcG9pbnQgKi8KKyNkZWZpbmUgSEZBMzg0eF9VU0JfRU5CVUxLSU4JNgorCisvKiBTaG91bGQgYmUgc2VudCB0byB0aGUgYnVsa291dCBlbmRwb2ludCAqLworI2RlZmluZSBIRkEzODR4X1VTQl9UWEZSTQkwCisjZGVmaW5lIEhGQTM4NHhfVVNCX0NNRFJFUQkxCisjZGVmaW5lIEhGQTM4NHhfVVNCX1dSSURSRVEJMgorI2RlZmluZSBIRkEzODR4X1VTQl9SUklEUkVRCTMKKyNkZWZpbmUgSEZBMzg0eF9VU0JfV01FTVJFUQk0CisjZGVmaW5lIEhGQTM4NHhfVVNCX1JNRU1SRVEJNQorCisvKiBSZWNlaXZlZCBmcm9tIHRoZSBidWxraW4gZW5kcG9pbnQgKi8KKyNkZWZpbmUgSEZBMzg0eF9VU0JfSVNGUk0oYSkJKCEoKGEpICYgMHg4MDAwKSkKKyNkZWZpbmUgSEZBMzg0eF9VU0JfSVNUWEZSTShhKQkoKChhKSAmIDB4OTAwMCkgPT0gMHgxMDAwKQorI2RlZmluZSBIRkEzODR4X1VTQl9JU1JYRlJNKGEpCSghKChhKSAmIDB4OTAwMCkpCisjZGVmaW5lIEhGQTM4NHhfVVNCX0lORk9GUk0JMHg4MDAwCisjZGVmaW5lIEhGQTM4NHhfVVNCX0NNRFJFU1AJMHg4MDAxCisjZGVmaW5lIEhGQTM4NHhfVVNCX1dSSURSRVNQCTB4ODAwMgorI2RlZmluZSBIRkEzODR4X1VTQl9SUklEUkVTUAkweDgwMDMKKyNkZWZpbmUgSEZBMzg0eF9VU0JfV01FTVJFU1AJMHg4MDA0CisjZGVmaW5lIEhGQTM4NHhfVVNCX1JNRU1SRVNQCTB4ODAwNQorI2RlZmluZSBIRkEzODR4X1VTQl9CVUZBVkFJTAkweDgwMDYKKyNkZWZpbmUgSEZBMzg0eF9VU0JfRVJST1IJMHg4MDA3CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFJlcXVlc3QgKGJ1bGsgT1VUKSBwYWNrZXQgY29udGVudHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfdHhmcm0geworCWhmYTM4NHhfdHhfZnJhbWVfdAlkZXNjOworCVVJTlQ4CQkJZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfdHhmcm1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfY21kcmVxIHsKKwlVSU5UMTYJCXR5cGU7CisJVUlOVDE2CQljbWQ7CisJVUlOVDE2CQlwYXJtMDsKKwlVSU5UMTYJCXBhcm0xOworCVVJTlQxNgkJcGFybTI7CisJVUlOVDgJCXBhZFs1NF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX2NtZHJlcV90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl93cmlkcmVxIHsKKwlVSU5UMTYJCXR5cGU7CisJVUlOVDE2CQlmcm1sZW47CisJVUlOVDE2CQlyaWQ7CisJVUlOVDgJCWRhdGFbSEZBMzg0eF9SSUREQVRBX01BWExFTl07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3dyaWRyZXFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlcSB7CisJVUlOVDE2CQl0eXBlOworCVVJTlQxNgkJZnJtbGVuOworCVVJTlQxNgkJcmlkOworCVVJTlQ4CQlwYWRbNThdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ycmlkcmVxX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3dtZW1yZXEgeworCVVJTlQxNgkJdHlwZTsKKwlVSU5UMTYJCWZybWxlbjsKKwlVSU5UMTYJCW9mZnNldDsKKwlVSU5UMTYJCXBhZ2U7CisJVUlOVDgJCWRhdGFbSEZBMzg0eF9VU0JfUldNRU1fTUFYTEVOXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2Jfd21lbXJlcV90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVxIHsKKwlVSU5UMTYJCXR5cGU7CisJVUlOVDE2CQlmcm1sZW47CisJVUlOVDE2CQlvZmZzZXQ7CisJVUlOVDE2CQlwYWdlOworCVVJTlQ4CQlwYWRbNTZdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ybWVtcmVxX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFJlc3BvbnNlIChidWxrIElOKSBwYWNrZXQgY29udGVudHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfcnhmcm0geworCWhmYTM4NHhfcnhfZnJhbWVfdAlkZXNjOworCVVJTlQ4CQkJZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2Jfcnhmcm1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfaW5mb2ZybSB7CisJVUlOVDE2CQkJdHlwZTsKKwloZmEzODR4X0luZkZyYW1lX3QJaW5mbzsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfaW5mb2ZybV90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwIHsKKwlVSU5UMTYJCXR5cGU7CisJVUlOVDE2CQlzdGF0dXM7CisJVUlOVDE2CQlyZXNwMDsKKwlVSU5UMTYJCXJlc3AxOworCVVJTlQxNgkJcmVzcDI7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX2NtZHJlc3BfdDsKKwordHlwZWRlZiBoZmEzODR4X3VzYl9jbWRyZXNwX3QgaGZhMzg0eF91c2Jfd3JpZHJlc3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlc3AgeworCVVJTlQxNgkJdHlwZTsKKwlVSU5UMTYJCWZybWxlbjsKKwlVSU5UMTYJCXJpZDsKKwlVSU5UOAkJZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfcnJpZHJlc3BfdDsKKwordHlwZWRlZiBoZmEzODR4X3VzYl9jbWRyZXNwX3QgaGZhMzg0eF91c2Jfd21lbXJlc3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlc3AgeworCVVJTlQxNgkJdHlwZTsKKwlVSU5UMTYJCWZybWxlbjsKKwlVSU5UOAkJZGF0YVtIRkEzODR4X1VTQl9SV01FTV9NQVhMRU5dOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ybWVtcmVzcF90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9idWZhdmFpbCB7CisJVUlOVDE2CQl0eXBlOworCVVJTlQxNgkJZnJtbGVuOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9idWZhdmFpbF90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9lcnJvciB7CisJVUlOVDE2CQl0eXBlOworCVVJTlQxNgkJZXJyb3J0eXBlOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9lcnJvcl90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVW5pb25zIGZvciBwYWNrYWdpbmcgYWxsIHRoZSBrbm93biBwYWNrZXQgdHlwZXMgdG9nZXRoZXIgKi8KKwordHlwZWRlZiB1bmlvbiBoZmEzODR4X3VzYm91dCB7CisJVUlOVDE2CQkJdHlwZTsKKwloZmEzODR4X3VzYl90eGZybV90CXR4ZnJtOworCWhmYTM4NHhfdXNiX2NtZHJlcV90CWNtZHJlcTsKKwloZmEzODR4X3VzYl93cmlkcmVxX3QJd3JpZHJlcTsKKwloZmEzODR4X3VzYl9ycmlkcmVxX3QJcnJpZHJlcTsKKwloZmEzODR4X3VzYl93bWVtcmVxX3QJd21lbXJlcTsKKwloZmEzODR4X3VzYl9ybWVtcmVxX3QJcm1lbXJlcTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JvdXRfdDsKKwordHlwZWRlZiB1bmlvbiBoZmEzODR4X3VzYmluIHsKKwlVSU5UMTYJCQl0eXBlOworCWhmYTM4NHhfdXNiX3J4ZnJtX3QJcnhmcm07CisJaGZhMzg0eF91c2JfdHhmcm1fdAl0eGZybTsKKwloZmEzODR4X3VzYl9pbmZvZnJtX3QJaW5mb2ZybTsKKwloZmEzODR4X3VzYl9jbWRyZXNwX3QJY21kcmVzcDsKKwloZmEzODR4X3VzYl93cmlkcmVzcF90CXdyaWRyZXNwOworCWhmYTM4NHhfdXNiX3JyaWRyZXNwX3QJcnJpZHJlc3A7CisJaGZhMzg0eF91c2Jfd21lbXJlc3BfdAl3bWVtcmVzcDsKKwloZmEzODR4X3VzYl9ybWVtcmVzcF90CXJtZW1yZXNwOworCWhmYTM4NHhfdXNiX2J1ZmF2YWlsX3QJYnVmYXZhaWw7CisJaGZhMzg0eF91c2JfZXJyb3JfdAl1c2JlcnJvcjsKKwlVSU5UOAkJCWJvZ3VzcGFkWzMwMDBdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYmluX3Q7CisKKyNlbmRpZiAvKiBXTEFOX1VTQiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQRCByZWNvcmQgc3RydWN0dXJlcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3BhcnRudW0KK3sKKwlVSU5UOAludW1bOF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bQoreworCVVJTlQ4CW51bVs4XTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcGNiX3RyYWNlbnVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX25pY19zZXJpYWwKK3sKKwlVSU5UOAludW1bMTJdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9uaWNfc2VyaWFsX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHMKK3sKKwlkb3VibGUJY2Fycmllcl9mcmVxOworCWRvdWJsZQlvY2N1cGllZF9iYW5kOworCWRvdWJsZQlwb3dlcl9kZW5zaXR5OworCWRvdWJsZQl0eF9zcHVyX2YxOworCWRvdWJsZQl0eF9zcHVyX2YyOworCWRvdWJsZQl0eF9zcHVyX2YzOworCWRvdWJsZQl0eF9zcHVyX2Y0OworCWRvdWJsZQl0eF9zcHVyX2wxOworCWRvdWJsZQl0eF9zcHVyX2wyOworCWRvdWJsZQl0eF9zcHVyX2wzOworCWRvdWJsZQl0eF9zcHVyX2w0OworCWRvdWJsZQlyeF9zcHVyX2YxOworCWRvdWJsZQlyeF9zcHVyX2YyOworCWRvdWJsZQlyeF9zcHVyX2wxOworCWRvdWJsZQlyeF9zcHVyX2wyOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9ta2tfbWVhc3VyZW1lbnRzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX25pY19yYW1zaXplCit7CisJVUlOVDgJc2l6ZVsxMl07IC8qIHVuaXRzIG9mIEtCICovCit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX25pY19yYW1zaXplX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21maXN1cHJhbmdlCit7CisJVUlOVDE2CWlkOworCVVJTlQxNgl2YXJpYW50OworCVVJTlQxNglib3R0b207CisJVUlOVDE2CXRvcDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2UKK3sKKwlVSU5UMTYJaWQ7CisJVUlOVDE2CXZhcmlhbnQ7CisJVUlOVDE2CWJvdHRvbTsKKwlVSU5UMTYJdG9wOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9jZmlzdXByYW5nZV90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9uaWNpZAoreworCVVJTlQxNglpZDsKKwlVSU5UMTYJdmFyaWFudDsKKwlVSU5UMTYJbWFqb3I7CisJVUlOVDE2CW1pbm9yOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9uaWNpZF90OworCisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19tZWFzdXJlbWVudHMKK3sKKwlVSU5UMTYJdmFsdWVbMF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3JlZmRhY19tZWFzdXJlbWVudHNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzCit7CisJVUlOVDE2CXZhbHVlWzBdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl92Z2RhY19tZWFzdXJlbWVudHNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbGV2ZWxfY29tcF9tZWFzdXJlbWVudHMKK3sKKwlVSU5UMTYJdmFsdWVbMF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2xldmVsX2NvbXBjX21lYXN1cmVtZW50c190OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9tYWNfYWRkcmVzcworeworCVVJTlQ4CWFkZHJbNl07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX21hY19hZGRyZXNzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21ra19jYWxsbmFtZQoreworCVVJTlQ4CWNhbGxuYW1lWzhdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9ta2tfY2FsbG5hbWVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVnZG9tYWluCit7CisJVUlOVDE2CW51bWRvbWFpbnM7CisJVUlOVDE2CWRvbWFpbls1XTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcmVnZG9tYWluX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2FsbG93ZWRfY2hhbm5lbAoreworCVVJTlQxNgljaF9iaXRtYXA7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2FsbG93ZWRfY2hhbm5lbF90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9kZWZhdWx0X2NoYW5uZWwKK3sKKwlVSU5UMTYJY2hhbm5lbDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfZGVmYXVsdF9jaGFubmVsX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uCit7CisJVUlOVDE2CWF2YWlsYWJsZTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcHJpdmFjeV9vcHRpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdGVtcHR5cGUKK3sKKwlVSU5UMTYJdHlwZTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfdGVtcHR5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwCit7CisJVUlOVDE2CWNoX3ZhbHVlWzE0XTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX3NldHVwCit7CisJVUlOVDE2CWNoX3ZhbHVlWzE0XTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfdmdkYWNfc2V0dXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbGV2ZWxfY29tcF9zZXR1cAoreworCVVJTlQxNgljaF92YWx1ZVsxNF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdHJpbWRhY19zZXR1cAoreworCVVJTlQxNgl0cmltaWRhYzsKKwlVSU5UMTYJdHJpbXFkYWM7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaWZyX3NldHRpbmcKK3sKKwlVSU5UMTYJdmFsdWVbM107Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2lmcl9zZXR0aW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nCit7CisJVUlOVDE2CXZhbHVlWzNdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9yZnJfc2V0dGluZ190OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lCit7CisJVUlOVDE2CXZhbHVlWzUwXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9iYXNlbGluZV90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX3NoYWRvdworeworCVVJTlQzMgl2YWx1ZVszMl07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfc2hhZG93X3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfaWZyZgoreworCVVJTlQzMgl2YWx1ZVsyMF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfaWZyZl90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2Fsc3AKK3sKKwlVSU5UMTYJdmFsdWVbMTRdOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2Fsc3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbGkKK3sKKwlVSU5UMTYJdmFsdWVbMTddOworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2FsaV90OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX25pY19jb25maWcKK3sKKwlVSU5UMTYJY29uZmlnX2JpdG1hcDsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbmljX2NvbmZpZ190OworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZm9fZGVsYXkKK3sKKwlVSU5UOCAgIGhmb19kZWxheTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9oZm9fZGVsYXlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcAoreworCVVJTlQxNgl2YWx1ZVszMF07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0c3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpCit7CisJVUlOVDE2CXZhbHVlWzMwXTsKK30gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfZW5kX29mX3BkYQoreworCVVJTlQxNgljcmM7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2VuZF9vZl9wZGFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJlYworeworCVVJTlQxNglsZW47IC8qIGluIHdvcmRzICovCisJVUlOVDE2CWNvZGU7CisJdW5pb24gcGRyIHsKKwloZmEzODR4X3Bkcl9wY2JfcGFydG51bV90CXBjYl9wYXJ0bnVtOworCWhmYTM4NHhfcGRyX3BjYl90cmFjZW51bV90CXBjYl90cmFjZW51bTsKKwloZmEzODR4X3Bkcl9uaWNfc2VyaWFsX3QJbmljX3NlcmlhbDsKKwloZmEzODR4X3Bkcl9ta2tfbWVhc3VyZW1lbnRzX3QJbWtrX21lYXN1cmVtZW50czsKKwloZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZV90CW5pY19yYW1zaXplOworCWhmYTM4NHhfcGRyX21maXN1cHJhbmdlX3QJbWZpc3VwcmFuZ2U7CisJaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2VfdAljZmlzdXByYW5nZTsKKwloZmEzODR4X3Bkcl9uaWNpZF90CQluaWNpZDsKKwloZmEzODR4X3Bkcl9yZWZkYWNfbWVhc3VyZW1lbnRzX3QJcmVmZGFjX21lYXN1cmVtZW50czsKKwloZmEzODR4X3Bkcl92Z2RhY19tZWFzdXJlbWVudHNfdAl2Z2RhY19tZWFzdXJlbWVudHM7CisJaGZhMzg0eF9wZHJfbGV2ZWxfY29tcGNfbWVhc3VyZW1lbnRzX3QJbGV2ZWxfY29tcGNfbWVhc3VyZW1lbnRzOworCWhmYTM4NHhfcGRyX21hY19hZGRyZXNzX3QJbWFjX2FkZHJlc3M7CisJaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lX3QJbWtrX2NhbGxuYW1lOworCWhmYTM4NHhfcGRyX3JlZ2RvbWFpbl90CQlyZWdkb21haW47CisJaGZhMzg0eF9wZHJfYWxsb3dlZF9jaGFubmVsX3QJYWxsb3dlZF9jaGFubmVsOworCWhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbF90CWRlZmF1bHRfY2hhbm5lbDsKKwloZmEzODR4X3Bkcl9wcml2YWN5X29wdGlvbl90CXByaXZhY3lfb3B0aW9uOworCWhmYTM4NHhfcGRyX3RlbXB0eXBlX3QJCXRlbXB0eXBlOworCWhmYTM4NHhfcGRyX3JlZmRhY19zZXR1cF90CXJlZmRhY19zZXR1cDsKKwloZmEzODR4X3Bkcl92Z2RhY19zZXR1cF90CXZnZGFjX3NldHVwOworCWhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXBfdAlsZXZlbF9jb21wX3NldHVwOworCWhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXBfdAl0cmltZGFjX3NldHVwOworCWhmYTM4NHhfcGRyX2lmcl9zZXR0aW5nX3QJaWZyX3NldHRpbmc7CisJaGZhMzg0eF9wZHJfcmZyX3NldHRpbmdfdAlyZnJfc2V0dGluZzsKKwloZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lX3QJaGZhMzg2MV9iYXNlbGluZTsKKwloZmEzODR4X3Bkcl9oZmEzODYxX3NoYWRvd190CWhmYTM4NjFfc2hhZG93OworCWhmYTM4NHhfcGRyX2hmYTM4NjFfaWZyZl90CWhmYTM4NjFfaWZyZjsKKwloZmEzODR4X3Bkcl9oZmEzODYxX2NoY2Fsc3BfdAloZmEzODYxX2NoY2Fsc3A7CisJaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbGlfdAloZmEzODYxX2NoY2FsaTsKKwloZmEzODR4X3Bkcl9uaWNfY29uZmlnX3QJbmljX2NvbmZpZzsKKwloZmEzODR4X2hmb19kZWxheV90ICAgICAgICAgICAgIGhmb19kZWxheTsKKwloZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwX3QJaGZhMzg2MV9tYW5mX3Rlc3RzcDsKKwloZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdGlfdAloZmEzODYxX21hbmZfdGVzdGk7CisJaGZhMzg0eF9wZHJfZW5kX29mX3BkYV90CWVuZF9vZl9wZGE7CisKKwl9IGRhdGE7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyZWNfdDsKKworCisjaWZkZWYgX19LRVJORUxfXworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tICBNQUMgc3RhdGUgc3RydWN0dXJlLCBhcmd1bWVudCB0byBhbGwgZnVuY3Rpb25zIC0tCistLS0gIEFsc28sIGEgY29sbGVjdGlvbiBvZiBzdXBwb3J0IHR5cGVzIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3N0YXR1c3Jlc3VsdAoreworCVVJTlQxNglzdGF0dXM7CisJVUlOVDE2CXJlc3AwOworCVVJTlQxNglyZXNwMTsKKwlVSU5UMTYJcmVzcDI7Cit9IGhmYTM4NHhfY21kcmVzdWx0X3Q7CisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCisKKy8qIFVTQiBDb250cm9sIEV4Y2hhbmdlIChDVExYKToKKyAqICBBIHF1ZXVlIG9mIHRoZSBzdHJ1Y3R1cmUgYmVsb3cgaXMgbWFpbnRhaW5lZCBmb3IgYWxsIG9mIHRoZSAKKyAqICBSZXF1ZXN0L1Jlc3BvbnNlIHR5cGUgVVNCIHBhY2tldHMgc3VwcG9ydGVkIGJ5IFByaXNtMi4KKyAqLworLyogVGhlIGZvbGxvd2luZyBoZmEzODR4Xyogc3RydWN0dXJlcyBhcmUgYXJndW1lbnRzIHRvIAorICogdGhlIHVzZXJjYigpIGZvciB0aGUgZGlmZmVyZW50IENUTFggdHlwZXMuCisgKi8KK3R5cGVkZWYgaGZhMzg0eF9jbWRyZXN1bHRfdCBoZmEzODR4X3dyaWRyZXN1bHRfdDsKK3R5cGVkZWYgaGZhMzg0eF9jbWRyZXN1bHRfdCBoZmEzODR4X3dtZW1yZXN1bHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ycmlkcmVzdWx0Cit7CisJVUlOVDE2CQlyaWQ7CisJY29uc3Qgdm9pZAkqcmlkZGF0YTsKKwlVSU5UCQlyaWRkYXRhX2xlbjsKK30gaGZhMzg0eF9ycmlkcmVzdWx0X3Q7CisKK2VudW0gY3RseF9zdGF0ZSB7CisJQ1RMWF9TVEFSVCA9IDAsCS8qIFN0YXJ0IHN0YXRlLCBub3QgcXVldWVkICovCisKKwlDVExYX0NPTVBMRVRFLAkvKiBDVExYIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKi8KKwlDVExYX1JFUV9GQUlMRUQsCS8qIE9VVCBVUkIgY29tcGxldGVkIHcvIGVycm9yICovCisKKwlDVExYX1BFTkRJTkcsCQkvKiBRdWV1ZWQsIGRhdGEgdmFsaWQgKi8KKwlDVExYX1JFUV9TVUJNSVRURUQsCS8qIE9VVCBVUkIgc3VibWl0dGVkICovCisJQ1RMWF9SRVFfQ09NUExFVEUsCS8qIE9VVCBVUkIgY29tcGxldGUgKi8KKwlDVExYX1JFU1BfQ09NUExFVEUJLyogSU4gVVJCIHJlY2VpdmVkICovCit9OwordHlwZWRlZiBlbnVtIGN0bHhfc3RhdGUgIENUTFhfU1RBVEU7CisKK3N0cnVjdCBoZmEzODR4X3VzYmN0bHg7CitzdHJ1Y3QgaGZhMzg0eDsKKwordHlwZWRlZiB2b2lkICgqY3RseF9jbWRjYl90KSggc3RydWN0IGhmYTM4NHgqLCBjb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4KiApOworCit0eXBlZGVmIHZvaWQgKCpjdGx4X3VzZXJjYl90KSgKKwlzdHJ1Y3QgaGZhMzg0eAkqaHcsIAorCXZvaWQJCSpjdGx4cmVzdWx0LAorCXZvaWQJCSp1c2VyY2JfZGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiY3RseAoreworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKworCXNpemVfdAkJCW91dGJ1ZnNpemU7CisJaGZhMzg0eF91c2JvdXRfdAlvdXRidWY7CQkvKiBwa3QgYnVmIGZvciBPVVQgKi8KKwloZmEzODR4X3VzYmluX3QJCWluYnVmOwkJLyogcGt0IGJ1ZiBmb3IgSU4oYSBjb3B5KSAqLworCisJQ1RMWF9TVEFURQkJc3RhdGU7CQkvKiBUcmFja3MgcnVubmluZyBzdGF0ZSAqLworCisJc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKKwl2b2xhdGlsZSBpbnQJCXJlYXBhYmxlOwkvKiBGb29kIGZvciB0aGUgcmVhcGVyIHRhc2sgKi8KKworCWN0bHhfY21kY2JfdAkJY21kY2I7CQkvKiBBc3luYyBjb21tYW5kIGNhbGxiYWNrICovCisJY3RseF91c2VyY2JfdAkJdXNlcmNiOwkJLyogQXN5bmMgdXNlciBjYWxsYmFjaywgKi8KKwl2b2lkCQkJKnVzZXJjYl9kYXRhOwkvKiAgYXQgQ1RMWCBjb21wbGV0aW9uICAqLworCisJaW50CQkJdmFyaWFudDsJLyogSWRlbnRpZmllcyBjbWQgdmFyaWFudCAqLworfSBoZmEzODR4X3VzYmN0bHhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4cQoreworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5nOworCXN0cnVjdCBsaXN0X2hlYWQJYWN0aXZlOworCXN0cnVjdCBsaXN0X2hlYWQJY29tcGxldGluZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXJlYXBhYmxlOworfSBoZmEzODR4X3VzYmN0bHhxX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgaGZhNDg0eF9tZXRhY21kCit7CisJVUlOVDE2CQljbWQ7CisKKwlVSU5UMTYgICAgICAgICAgcGFybTA7CisJVUlOVDE2ICAgICAgICAgIHBhcm0xOworCVVJTlQxNiAgICAgICAgICBwYXJtMjsKKworI2lmIDAgLy9YWFggY21kIGlycSBzdHVmZgorCVVJTlQxNiAgICAgICAgICBidWxraWQ7ICAgICAgICAgLyogd2hhdCBSSUQvRklEIHRvIGNvcHkgZG93bi4gKi8KKwlpbnQgICAgICAgICAgICAgYnVsa2xlbjsgICAgICAgIC8qIGhvdyBtdWNoIHRvIGNvcHkgZnJvbSBCQVAgKi8KKyAgICAgICAgY2hhciAgICAgICAgICAgICpidWxrZGF0YTsgICAgICAvKiBBbmQgdG8gd2hlcmU/ICovCisjZW5kaWYKKworCWhmYTM4NHhfY21kcmVzdWx0X3QgcmVzdWx0OworfSBoZmEzODR4X21ldGFjbWRfdDsKKworI2RlZmluZQlNQVhfUFJJU00yX0dSUF9BRERSCTE2CisjZGVmaW5lCU1BWF9HUlBfQUREUgkJMzIKKyNkZWZpbmUgV0xBTl9DT01NRU5UX01BWAk4MCAgLyogTWF4LiBsZW5ndGggb2YgdXNlciBjb21tZW50IHN0cmluZy4gKi8KKworI2RlZmluZSBNTV9TQVRfUENGCQkoQklUMTQpCisjZGVmaW5lIE1NX0dDU0RfUENGCQkoQklUMTUpCisjZGVmaW5lIE1NX0dDU0RfUENGX0VCCQkoQklUMTQgfCBCSVQxNSkKKworI2RlZmluZSBXTEFOX1NUQVRFX1NUT1BQRUQJMCAgIC8qIE5ldHdvcmsgaXMgbm90IGFjdGl2ZS4gKi8KKyNkZWZpbmUgV0xBTl9TVEFURV9TVEFSVEVECTEgICAvKiBOZXR3b3JrIGhhcyBiZWVuIHN0YXJ0ZWQuICovCisKKyNkZWZpbmUgV0xBTl9BVVRIX01BWCAgICAgICAgICAgNjAgIC8qIE1heC4gIyBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zLiAqLworI2RlZmluZSBXTEFOX0FDQ0VTU19NQVgJCTYwICAvKiBNYXguICMgb2Ygc3RhdGlvbnMgaW4gYW4gYWNjZXNzIGxpc3QuICovCisjZGVmaW5lIFdMQU5fQUNDRVNTX05PTkUJMCAgIC8qIE5vIHN0YXRpb25zIG1heSBiZSBhdXRoZW50aWNhdGVkLiAqLworI2RlZmluZSBXTEFOX0FDQ0VTU19BTEwJCTEgICAvKiBBbGwgc3RhdGlvbnMgbWF5IGJlIGF1dGhlbnRpY2F0ZWQuICovCisjZGVmaW5lIFdMQU5fQUNDRVNTX0FMTE9XCTIgICAvKiBBdXRoZW50aWNhdGUgb25seSAiYWxsb3dlZCIgc3RhdGlvbnMuICovCisjZGVmaW5lIFdMQU5fQUNDRVNTX0RFTlkJMyAgIC8qIERvIG5vdCBhdXRoZW50aWNhdGUgImRlbmllZCIgc3RhdGlvbnMuICovCisKKy8qIFhYWCBUaGVzZSBhcmUgZ29pbmcgYXdheSBBU0FQICovCit0eXBlZGVmIHN0cnVjdCBwcmlzbTJzdGFfYXV0aGxpc3QKK3sKKwlVSU5UCWNudDsKKwlVSU5UOAlhZGRyW1dMQU5fQVVUSF9NQVhdW1dMQU5fQUREUl9MRU5dOworCVVJTlQ4CWFzc29jW1dMQU5fQVVUSF9NQVhdOworfSBwcmlzbTJzdGFfYXV0aGxpc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcHJpc20yc3RhX2FjY2Vzc2xpc3QKK3sKKwlVSU5UCW1vZGlmeTsKKwlVSU5UCWNudDsKKwlVSU5UOAlhZGRyW1dMQU5fQUNDRVNTX01BWF1bV0xBTl9BRERSX0xFTl07CisJVUlOVAljbnQxOworCVVJTlQ4CWFkZHIxW1dMQU5fQUNDRVNTX01BWF1bV0xBTl9BRERSX0xFTl07Cit9IHByaXNtMnN0YV9hY2Nlc3NsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGhmYTM4NHgKK3sKKyNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCisJLyogUmVzb3VyY2UgY29uZmlnICovCisJVUlOVDMyCQkJaW9iYXNlOworCWNoYXIJCQlfX2lvbWVtICptZW1iYXNlOworCVVJTlQzMgkJCWlycTsKKyNlbHNlCisJLyogVVNCIHN1cHBvcnQgZGF0YSAqLworCXN0cnVjdCB1c2JfZGV2aWNlCSp1c2I7CisJc3RydWN0IHVyYgkJcnhfdXJiOworCXN0cnVjdCBza19idWZmCQkqcnhfdXJiX3NrYjsKKwlzdHJ1Y3QgdXJiCQl0eF91cmI7CisJc3RydWN0IHVyYgkJY3RseF91cmI7CisJaGZhMzg0eF91c2JvdXRfdAl0eGJ1ZmY7CisJaGZhMzg0eF91c2JjdGx4cV90CWN0bHhxOworCXN0cnVjdCB0aW1lcl9saXN0CXJlcXRpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CXJlc3B0aW1lcjsKKworCXN0cnVjdCB0aW1lcl9saXN0CXRocm90dGxlOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0CXJlYXBlcl9iaDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJY29tcGxldGlvbl9iaDsKKworCXN0cnVjdCB3b3JrX3N0cnVjdAl1c2Jfd29yazsKKworCXVuc2lnbmVkIGxvbmcJCXVzYl9mbGFnczsKKyNkZWZpbmUgVEhST1RUTEVfUlgJMAorI2RlZmluZSBUSFJPVFRMRV9UWAkxCisjZGVmaW5lIFdPUktfUlhfSEFMVAkyCisjZGVmaW5lIFdPUktfVFhfSEFMVAkzCisjZGVmaW5lIFdPUktfUlhfUkVTVU1FCTQKKyNkZWZpbmUgV09SS19UWF9SRVNVTUUJNQorCisJdW5zaWduZWQgc2hvcnQJCXJlcV90aW1lcl9kb25lOjE7CisJdW5zaWduZWQgc2hvcnQJCXJlc3BfdGltZXJfZG9uZToxOworCisJaW50ICAgICAgICAgICAgICAgICAgICAgZW5kcF9pbjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBlbmRwX291dDsKKyNlbmRpZiAvKiAhVVNCICovCisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQorCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2OworI2Vsc2UKKwlkZXZfbGlua190CSpsaW5rOworI2VuZGlmCisJZGV2X25vZGVfdAlub2RlOworI2VuZGlmCisKKwlpbnQgICAgICAgICAgICAgICAgICAgICBzbmlmZl9mY3M7CisJaW50ICAgICAgICAgICAgICAgICAgICAgc25pZmZfY2hhbm5lbDsgIAorCWludCAgICAgICAgICAgICAgICAgICAgIHNuaWZmX3RydW5jYXRlOyAgCisJaW50ICAgICAgICAgICAgICAgICAgICAgc25pZmZoZHI7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBjbWRxOwkgICAgICAgIC8qIHdhaXQgcXVldWUgaXRzZWxmICovCisKKwkvKiBDb250cm9sbGVyIHN0YXRlICovCisJVUlOVDMyCQlzdGF0ZTsKKwlVSU5UMzIJCWlzYXA7CisJVUlOVDgJCXBvcnRfZW5hYmxlZFtIRkEzODR4X05VTVBPUlRTX01BWF07CisjaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQorCVVJTlQJCWF1eGVuOworCVVJTlQgICAgICAgICAgICBpc3JhbTE2OworI2VuZGlmIC8qICFVU0IgKi8KKworCS8qIERvd25sb2FkIHN1cHBvcnQgKi8KKwlVSU5UCQkJCWRsc3RhdGU7CisJaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcl90CWJ1ZmluZm87CisJVUlOVDE2CQkJCWRsdGltZW91dDsKKworI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKKwlzcGlubG9ja190CWNtZGxvY2s7CisJdm9sYXRpbGUgaW50ICAgIGNtZGZsYWc7ICAgICAgICAvKiB3YWl0IHF1ZXVlIGZsYWcgKi8KKwloZmEzODR4X21ldGFjbWRfdCAqY21kZGF0YTsgICAgICAvKiBmb3Igb3VyIGFzeW5jIGNhbGxiYWNrICovCisKKwkvKiBCQVAgc3VwcG9ydCAqLworCXNwaW5sb2NrX3QJYmFwbG9jazsJCisJc3RydWN0IHRhc2tsZXRfc3RydWN0ICAgYmFwX3Rhc2tsZXQ7CisKKwkvKiBNQUMgYnVmZmVyIGlkcyAqLworICAgICAgICBVSU5UMTYgICAgICAgICAgdHhmaWRfaGVhZDsKKyAgICAgICAgVUlOVDE2ICAgICAgICAgIHR4ZmlkX3RhaWw7CisgICAgICAgIFVJTlQgICAgICAgICAgICB0eGZpZF9OOworICAgICAgICBVSU5UMTYgICAgICAgICAgdHhmaWRfcXVldWVbSEZBMzg0eF9EUlZSX0ZJRFNUQUNLTEVOX01BWF07CisJVUlOVDE2CQkJaW5mb2ZpZDsKKwlzdHJ1Y3Qgc2VtYXBob3JlCWluZm9maWRfc2VtOworI2VuZGlmIC8qICFVU0IgKi8KKworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmZsYWc7ICAgIC8qIHRvIHNpZ25hbCBzY2FuIGNvbWxldGUgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5fYXA7ICAgICAgICAvKiBhcmUgd2Ugam9pbmVkIHRvIGEgc3BlY2lmaWMgYXAgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5fcmV0cmllczsgICAvKiBudW1iZXIgb2Ygam9pbiByZXRyaWVzIHRpbGwgd2UgZmFpbCAqLworCWhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90ICAgam9pbnJlcTsgICAgICAgIC8qIGpvaW4gcmVxdWVzdCBzYXZlZCBkYXRhICovCisKKwl3bGFuZGV2aWNlX3QgICAgICAgICAgICAqd2xhbmRldjsKKwkvKiBUaW1lciB0byBhbGxvdyBmb3IgdGhlIGRlZmVycmVkIHByb2Nlc3Npbmcgb2YgbGlua3N0YXR1cyBtZXNzYWdlcyAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCAJbGlua19iaDsKKworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICBjb21tc3F1YWxfYmg7CisJaGZhMzg0eF9jb21tc3F1YWxpdHlfdCAgcXVhbDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAljb21tc3F1YWxfdGltZXI7CisKKwlVSU5UMTYgbGlua19zdGF0dXM7CisJVUlOVDE2IGxpbmtfc3RhdHVzX25ldzsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICAgICAgICBhdXRocTsKKworCS8qIEFuZCBoZXJlIHdlIGhhdmUgc3R1ZmYgdGhhdCB1c2VkIHRvIGJlIGluIHByaXYgKi8KKworCS8qIFN0YXRlIHZhcmlhYmxlcyAqLworCVVJTlQJCXByZXNuaWZmX3BvcnRfdHlwZTsKKwlVSU5UMTYJCXByZXNuaWZmX3dlcGZsYWdzOworCVVJTlQzMgkJZG90MTFfZGVzaXJlZF9ic3NfdHlwZTsKKwlpbnQJCWFwOwkvKiBBUCBmbGFnOiAwIC0gU3RhdGlvbiwgMSAtIEFjY2VzcyBQb2ludC4gKi8KKworCWludCAgICAgICAgICAgICBkYm1hZGp1c3Q7CisKKwkvKiBHcm91cCBBZGRyZXNzZXMgLSByaWdodCBub3csIHRoZXJlIGFyZSB1cCB0byBhIHRvdGFsCisJb2YgTUFYX0dSUF9BRERSIGdyb3VwIGFkZHJlc3NlcyAqLworCVVJTlQ4CQlkb3QxMV9ncnBfYWRkcltNQVhfR1JQX0FERFJdW1dMQU5fQUREUl9MRU5dOworCVVJTlQJCWRvdDExX2dycGNudDsKKworCS8qIENvbXBvbmVudCBJZGVudGl0aWVzICovCisJaGZhMzg0eF9jb21waWRlbnRfdAlpZGVudF9uaWM7CisJaGZhMzg0eF9jb21waWRlbnRfdAlpZGVudF9wcmlfZnc7CisJaGZhMzg0eF9jb21waWRlbnRfdAlpZGVudF9zdGFfZnc7CisJaGZhMzg0eF9jb21waWRlbnRfdAlpZGVudF9hcF9mdzsKKwlVSU5UMTYJCQltbV9tb2RzOworCisJLyogU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZXMgKi8KKwloZmEzODR4X2NhcGxldmVsX3QJY2FwX3N1cF9tZmk7CisJaGZhMzg0eF9jYXBsZXZlbF90CWNhcF9zdXBfY2ZpOworCWhmYTM4NHhfY2FwbGV2ZWxfdAljYXBfc3VwX3ByaTsKKwloZmEzODR4X2NhcGxldmVsX3QJY2FwX3N1cF9zdGE7CisJaGZhMzg0eF9jYXBsZXZlbF90CWNhcF9zdXBfYXA7CisKKwkvKiBBY3RvciBjb21wYXRpYmlsaXR5IHJhbmdlcyAqLworCWhmYTM4NHhfY2FwbGV2ZWxfdAljYXBfYWN0X3ByaV9jZmk7IC8qIHByaSBmL3cgdG8gY29udHJvbGxlciBpbnRlcmZhY2UgKi8KKwloZmEzODR4X2NhcGxldmVsX3QJY2FwX2FjdF9zdGFfY2ZpOyAvKiBzdGEgZi93IHRvIGNvbnRyb2xsZXIgaW50ZXJmYWNlICovCisJaGZhMzg0eF9jYXBsZXZlbF90CWNhcF9hY3Rfc3RhX21maTsgLyogc3RhIGYvdyB0byBtb2RlbSBpbnRlcmZhY2UgKi8KKwloZmEzODR4X2NhcGxldmVsX3QJY2FwX2FjdF9hcF9jZmk7ICAvKiBhcCBmL3cgdG8gY29udHJvbGxlciBpbnRlcmZhY2UgKi8KKwloZmEzODR4X2NhcGxldmVsX3QJY2FwX2FjdF9hcF9tZmk7ICAvKiBhcCBmL3cgdG8gbW9kZW0gaW50ZXJmYWNlICovCisKKwlVSU5UMzIJCQlwc3VzZXJjb3VudDsgIC8qIFBvd2VyIHNhdmUgdXNlciBjb3VudC4gKi8KKwloZmEzODR4X0NvbW1UYWxsaWVzMzJfdAl0YWxsaWVzOyAgICAgIC8qIENvbW11bmljYXRpb24gdGFsbGllcy4gKi8KKwlVSU5UOAkJCWNvbW1lbnRbV0xBTl9DT01NRU5UX01BWCsxXTsgLyogVXNlciBjb21tZW50ICovCisKKwkvKiBDaGFubmVsIEluZm8gcmVxdWVzdCByZXN1bHRzIChBUCBvbmx5KSAqLworCXN0cnVjdCB7CisJCWF0b21pY190CQlkb25lOworCQlVSU5UOAkJCWNvdW50OworCQloZmEzODR4X0NoSW5mb1Jlc3VsdF90CXJlc3VsdHM7CisJfSBjaGFubmVsX2luZm87CisKKwloZmEzODR4X0luZkZyYW1lX3QgICAgICAqc2NhbnJlc3VsdHM7CisKKworICAgICAgICBwcmlzbTJzdGFfYXV0aGxpc3RfdAlhdXRobGlzdDsgICAgIC8qIEF1dGhlbnRpY2F0ZWQgc3RhdGlvbiBsaXN0LiAqLworCVVJTlQJCQlhY2Nlc3Ntb2RlOyAgIC8qIEFjY2VzcyBtb2RlLiAqLworICAgICAgICBwcmlzbTJzdGFfYWNjZXNzbGlzdF90CWFsbG93OyAgICAgICAgLyogQWxsb3dlZCBzdGF0aW9uIGxpc3QuICovCisgICAgICAgIHByaXNtMnN0YV9hY2Nlc3NsaXN0X3QJZGVueTsgICAgICAgICAvKiBEZW5pZWQgc3RhdGlvbiBsaXN0LiAqLworCit9IGhmYTM4NHhfdDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKK3ZvaWQgCitoZmEzODR4X2NyZWF0ZSggCisJaGZhMzg0eF90ICpodywgCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYik7CisjZWxzZQordm9pZCAKK2hmYTM4NHhfY3JlYXRlKCAKKwloZmEzODR4X3QgKmh3LCAKKwlVSU5UIGlycSwgCisJVUlOVDMyIGlvYmFzZSwgCisJVUlOVDggX19pb21lbSAqbWVtYmFzZSk7CisjZW5kaWYKKwordm9pZCBoZmEzODR4X2Rlc3Ryb3koaGZhMzg0eF90ICpodyk7CisKK2lycXJldHVybl90CitoZmEzODR4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQgUFRfUkVHUyk7CitpbnQKK2hmYTM4NHhfY29yZXJlc2V0KCBoZmEzODR4X3QgKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcyk7CitpbnQKK2hmYTM4NHhfZHJ2cl9jaGluZm9yZXN1bHRzKCBoZmEzODR4X3QgKmh3KTsKK2ludAoraGZhMzg0eF9kcnZyX2NvbW10YWxsaWVzKCBoZmEzODR4X3QgKmh3KTsKK2ludAoraGZhMzg0eF9kcnZyX2Rpc2FibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpOworaW50CitoZmEzODR4X2RydnJfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KTsKK2ludAoraGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcpOworaW50CitoZmEzODR4X2RydnJfZmxhc2hkbF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcpOworaW50CitoZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbik7CitpbnQKK2hmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKTsKK2ludAoraGZhMzg0eF9kcnZyX2hhbmRvdmVyKCBoZmEzODR4X3QgKmh3LCBVSU5UOCAqYWRkcik7CitpbnQKK2hmYTM4NHhfZHJ2cl9ob3N0c2NhbnJlc3VsdHMoIGhmYTM4NHhfdCAqaHcpOworaW50CitoZmEzODR4X2RydnJfbG93X2xldmVsKGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQpOworaW50CitoZmEzODR4X2RydnJfbW1pX3JlYWQoaGZhMzg0eF90ICpodywgVUlOVDMyIGFkZHJlc3MsIFVJTlQzMiAqcmVzdWx0KTsKK2ludAoraGZhMzg0eF9kcnZyX21taV93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkcmVzcywgVUlOVDMyIGRhdGEpOworaW50CitoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBleGVhZGRyKTsKK2ludAoraGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUoaGZhMzg0eF90ICpodyk7CitpbnQKK2hmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbik7CitpbnQKK2hmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pOworaW50CitoZmEzODR4X2RydnJfc2NhbnJlc3VsdHMoIGhmYTM4NHhfdCAqaHcpOworCitpbnQKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKTsKKworc3RhdGljIGlubGluZSBpbnQgCitoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqdmFsKQoreworCWludAkJcmVzdWx0ID0gMDsKKwlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCByaWQsIHZhbCwgc2l6ZW9mKFVJTlQxNikpOworCWlmICggcmVzdWx0ID09IDAgKSB7CisJCSooKFVJTlQxNiopdmFsKSA9IGhmYTM4NHgyaG9zdF8xNigqKChVSU5UMTYqKXZhbCkpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIGludCAKK2hmYTM4NHhfZHJ2cl9nZXRjb25maWczMihoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICp2YWwpCit7CisJaW50CQlyZXN1bHQgPSAwOworCisJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgcmlkLCB2YWwsIHNpemVvZihVSU5UMzIpKTsKKwlpZiAoIHJlc3VsdCA9PSAwICkgeworCQkqKChVSU5UMzIqKXZhbCkgPSBoZmEzODR4Mmhvc3RfMzIoKigoVUlOVDMyKil2YWwpKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIGludAoraGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIFVJTlQxNiB2YWwpCit7CisJVUlOVDE2IHZhbHVlID0gaG9zdDJoZmEzODR4XzE2KHZhbCk7CisJcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIHJpZCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWczMihoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCBVSU5UMzIgdmFsKQoreworCVVJTlQzMiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8zMih2YWwpOworCXJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCByaWQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpIAkgCitpbnQgCSAKK2hmYTM4NHhfZHJ2cl9nZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICAgICAqaHcsIAkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgICAgICAgIHJpZCwgCSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCAJIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdXNlcmNiX2RhdGEpOyAJIAorIAkgCitpbnQgCSAKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICpodywgCSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiByaWQsIAkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYsIAkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgbGVuLCAJIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsIAkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyY2JfZGF0YSk7IAkgCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuLCAKKwkJCSAgICAgdm9pZCAqcHRyMSwgdm9pZCAqcHRyMikgCSAKK3sKKyAgICAgICAgICh2b2lkKXB0cjE7CisgICAgICAgICAodm9pZClwdHIyOworICAgICAgICAgcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIHJpZCwgYnVmLCBsZW4pOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitoZmEzODR4X2RydnJfc2V0Y29uZmlnMTZfYXN5bmMoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgVUlOVDE2IHZhbCkKK3sgCSAKKwlVSU5UMTYgdmFsdWUgPSBob3N0MmhmYTM4NHhfMTYodmFsKTsgCSAKKwlyZXR1cm4gaGZhMzg0eF9kcnZyX3NldGNvbmZpZ19hc3luYyhodywgcmlkLCAmdmFsdWUsIHNpemVvZih2YWx1ZSksIAorCQkJCQkgICAgTlVMTCAsIE5VTEwpOyAJIAorfQorCitzdGF0aWMgaW5saW5lIGludAoraGZhMzg0eF9kcnZyX3NldGNvbmZpZzMyX2FzeW5jKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIFVJTlQzMiB2YWwpCit7IAkgCisJVUlOVDMyIHZhbHVlID0gaG9zdDJoZmEzODR4XzMyKHZhbCk7IAkgCisJcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaHcsIHJpZCwgJnZhbHVlLCBzaXplb2YodmFsdWUpLCAKKwkJCQkJICAgIE5VTEwgLCBOVUxMKTsgCSAKK30KKworCitpbnQKK2hmYTM4NHhfZHJ2cl9zdGFydChoZmEzODR4X3QgKmh3KTsKK2ludAoraGZhMzg0eF9kcnZyX3N0b3AoaGZhMzg0eF90ICpodyk7CitpbnQKK2hmYTM4NHhfZHJ2cl90eGZyYW1lKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCBza19idWZmICpza2IsIHA4MDIxMV9oZHJfdCAqcDgwMjExX2hkciwgcDgwMjExX21ldGF3ZXBfdCAqcDgwMjExX3dlcCk7Cit2b2lkCitoZmEzODR4X3R4X3RpbWVvdXQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKKworaW50CitoZmEzODR4X2NtZF9pbml0aWFsaXplKGhmYTM4NHhfdCAqaHcpOworaW50CitoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpOworaW50CitoZmEzODR4X2NtZF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KTsKK2ludAoraGZhMzg0eF9jbWRfZGlhZ25vc2UoaGZhMzg0eF90ICpodyk7CitpbnQKK2hmYTM4NHhfY21kX2FsbG9jYXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBsZW4pOworaW50CitoZmEzODR4X2NtZF90cmFuc21pdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmVjbGFpbSwgVUlOVDE2IHFvcywgVUlOVDE2IGZpZCk7CitpbnQKK2hmYTM4NHhfY21kX2NsZWFycGVyc2lzdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgZmlkKTsKK2ludAoraGZhMzg0eF9jbWRfbm90aWZ5KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByZWNsYWltLCBVSU5UMTYgZmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pOworaW50CitoZmEzODR4X2NtZF9pbnF1aXJlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBmaWQpOworaW50CitoZmEzODR4X2NtZF9hY2Nlc3MoaGZhMzg0eF90ICpodywgVUlOVDE2IHdyaXRlLCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pOworaW50CitoZmEzODR4X2NtZF9tb25pdG9yKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBlbmFibGUpOworaW50CitoZmEzODR4X2NtZF9kb3dubG9hZCgKKwloZmEzODR4X3QgKmh3LCAKKwlVSU5UMTYgbW9kZSwgCisJVUlOVDE2IGxvd2FkZHIsCisJVUlOVDE2IGhpZ2hhZGRyLCAKKwlVSU5UMTYgY29kZWxlbik7CitpbnQKK2hmYTM4NHhfY21kX2F1eF9lbmFibGUoaGZhMzg0eF90ICpodywgaW50IGZvcmNlKTsKK2ludAoraGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaGZhMzg0eF90ICpodyk7CitpbnQKK2hmYTM4NHhfY29weV9mcm9tX2JhcCgKKwloZmEzODR4X3QgKmh3LCAKKwlVSU5UMTYJYmFwLCAKKwlVSU5UMTYJaWQsIAorCVVJTlQxNglvZmZzZXQsIAorCXZvaWQJKmJ1ZiwKKwlVSU5UCWxlbik7CitpbnQKK2hmYTM4NHhfY29weV90b19iYXAoCisJaGZhMzg0eF90ICpodywgCisJVUlOVDE2CWJhcCwgCisJVUlOVDE2CWlkLCAKKwlVSU5UMTYJb2Zmc2V0LAorCXZvaWQJKmJ1ZiwgCisJVUlOVAlsZW4pOwordm9pZCAKK2hmYTM4NHhfY29weV9mcm9tX2F1eCgKKwloZmEzODR4X3QgKmh3LCAKKwlVSU5UMzIJY2FyZGFkZHIsIAorCVVJTlQzMglhdXhjdGwsIAorCXZvaWQJKmJ1ZiwgCisJVUlOVAlsZW4pOwordm9pZCAKK2hmYTM4NHhfY29weV90b19hdXgoCisJaGZhMzg0eF90ICpodywgCisJVUlOVDMyCWNhcmRhZGRyLCAKKwlVSU5UMzIJYXV4Y3RsLCAKKwl2b2lkCSpidWYsIAorCVVJTlQJbGVuKTsKKworI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKKworLyogCisgICBIRkEzODR4IGlzIGEgTElUVExFIEVORElBTiBwYXJ0LgorCisgICB0aGUgZ2V0L3NldHJlZyBmdW5jdGlvbnMgaW1wbGljaXRseSBieXRlLXN3YXAgdGhlIGRhdGEgdG8gTEUuCisgICB0aGUgX25vc3dhcCB2YXJpYW50cyBkbyBub3QgcGVyZm9ybSBhIGJ5dGUtc3dhcCBvbiB0aGUgZGF0YS4KKyovCisKK3N0YXRpYyBpbmxpbmUgVUlOVDE2IAorX19oZmEzODR4X2dldHJlZyhoZmEzODR4X3QgKmh3LCBVSU5UIHJlZyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgIAorX19oZmEzODR4X3NldHJlZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgdmFsLCBVSU5UIHJlZyk7CisKK3N0YXRpYyBpbmxpbmUgVUlOVDE2IAorX19oZmEzODR4X2dldHJlZ19ub3N3YXAoaGZhMzg0eF90ICpodywgVUlOVCByZWcpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19faGZhMzg0eF9zZXRyZWdfbm9zd2FwKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB2YWwsIFVJTlQgcmVnKTsKKworI2lmZGVmIFJFVkVSU0VfRU5ESUFOCisjZGVmaW5lIGhmYTM4NHhfZ2V0cmVnIF9faGZhMzg0eF9nZXRyZWdfbm9zd2FwCisjZGVmaW5lIGhmYTM4NHhfc2V0cmVnIF9faGZhMzg0eF9zZXRyZWdfbm9zd2FwCisjZGVmaW5lIGhmYTM4NHhfZ2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfZ2V0cmVnCisjZGVmaW5lIGhmYTM4NHhfc2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfc2V0cmVnCisjZWxzZQorI2RlZmluZSBoZmEzODR4X2dldHJlZyBfX2hmYTM4NHhfZ2V0cmVnCisjZGVmaW5lIGhmYTM4NHhfc2V0cmVnIF9faGZhMzg0eF9zZXRyZWcKKyNkZWZpbmUgaGZhMzg0eF9nZXRyZWdfbm9zd2FwIF9faGZhMzg0eF9nZXRyZWdfbm9zd2FwCisjZGVmaW5lIGhmYTM4NHhfc2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfc2V0cmVnX25vc3dhcAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBoZmEzODR4X2dldHJlZworKgorKiBSZXRyaWV2ZSB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZSBNQUMgcmVnaXN0ZXJzLiAgRG9uZSBoZXJlCisqIGJlY2F1c2UgZGlmZmVyZW50IFBSSVNNMiBNQUMgcGFydHMgdXNlIGRpZmZlcmVudCBidXNlcyBhbmQgc3VjaC4KKyogTk9URTogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBpbiBIT1NUIE9SREVSISEhISEhCisqCisqIEFyZ3VtZW50czoKKyogICAgICAgaHcgICAgICAgICBNQUMgcGFydCBzdHJ1Y3R1cmUKKyogICAgICAgcmVnICAgICAgICBSZWdpc3RlciBpZGVudGlmaWVyIChvZmZzZXQgZm9yIEkvTyBiYXNlZCBpL2YpCisqCisqIFJldHVybnM6CisqICAgICAgIFZhbHVlIGZyb20gdGhlIHJlZ2lzdGVyIGluIEhPU1QgT1JERVIhISEhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbmxpbmUgVUlOVDE2IAorX19oZmEzODR4X2dldHJlZyhoZmEzODR4X3QgKmh3LCBVSU5UIHJlZykKK3sKKy8qCXByaW50ayhLRVJOX0RFQlVHICJSZWFkaW5nIGZyb20gMHglMHhcbiIsIGh3LT5tZW1iYXNlICsgcmVnKTsgKi8KKyNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpKQorCXJldHVybiB3bGFuX2lud19sZTE2X3RvX2NwdShody0+aW9iYXNlK3JlZyk7CisjZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisJcmV0dXJuIF9fbGUxNl90b19jcHUocmVhZHcoaHctPm1lbWJhc2UgKyByZWcpKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogaGZhMzg0eF9zZXRyZWcKKyoKKyogU2V0IHRoZSB2YWx1ZSBvZiBvbmUgb2YgdGhlIE1BQyByZWdpc3RlcnMuICBEb25lIGhlcmUKKyogYmVjYXVzZSBkaWZmZXJlbnQgUFJJU00yIE1BQyBwYXJ0cyB1c2UgZGlmZmVyZW50IGJ1c2VzIGFuZCBzdWNoLgorKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIHZhbHVlIGlzIGluIEhPU1QgT1JERVIhISEhISEKKyoKKyogQXJndW1lbnRzOgorKiAgICAgICBodwlNQUMgcGFydCBzdHJ1Y3R1cmUKKyoJdmFsCVZhbHVlLCBpbiBIT1NUIE9SREVSISEsIHRvIHB1dCBpbiB0aGUgcmVnaXN0ZXIKKyogICAgICAgcmVnCVJlZ2lzdGVyIGlkZW50aWZpZXIgKG9mZnNldCBmb3IgSS9PIGJhc2VkIGkvZikKKyoKKyogUmV0dXJuczoKKyogICAgICAgTm90aGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW5saW5lIHZvaWQKK19faGZhMzg0eF9zZXRyZWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHZhbCwgVUlOVCByZWcpCit7CisjaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKKwl3bGFuX291dHdfY3B1X3RvX2xlMTYoIHZhbCwgaHctPmlvYmFzZSArIHJlZyk7CisJcmV0dXJuOworI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorCXdyaXRldyhfX2NwdV90b19sZTE2KHZhbCksIGh3LT5tZW1iYXNlICsgcmVnKTsKKwlyZXR1cm47CisjZW5kaWYKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogaGZhMzg0eF9nZXRyZWdfbm9zd2FwCisqCisqIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBvbmUgb2YgdGhlIE1BQyByZWdpc3RlcnMuICBEb25lIGhlcmUKKyogYmVjYXVzZSBkaWZmZXJlbnQgUFJJU00yIE1BQyBwYXJ0cyB1c2UgZGlmZmVyZW50IGJ1c2VzIGFuZCBzdWNoLgorKgorKiBBcmd1bWVudHM6CisqICAgICAgIGh3ICAgICAgICAgTUFDIHBhcnQgc3RydWN0dXJlCisqICAgICAgIHJlZyAgICAgICAgUmVnaXN0ZXIgaWRlbnRpZmllciAob2Zmc2V0IGZvciBJL08gYmFzZWQgaS9mKQorKgorKiBSZXR1cm5zOgorKiAgICAgICBWYWx1ZSBmcm9tIHRoZSByZWdpc3Rlci4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGlubGluZSBVSU5UMTYKK19faGZhMzg0eF9nZXRyZWdfbm9zd2FwKGhmYTM4NHhfdCAqaHcsIFVJTlQgcmVnKQoreworI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCisJcmV0dXJuIHdsYW5faW53KGh3LT5pb2Jhc2UrcmVnKTsKKyNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKKwlyZXR1cm4gcmVhZHcoaHctPm1lbWJhc2UgKyByZWcpOworI2VuZGlmCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIGhmYTM4NHhfc2V0cmVnX25vc3dhcAorKgorKiBTZXQgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGUgTUFDIHJlZ2lzdGVycy4gIERvbmUgaGVyZQorKiBiZWNhdXNlIGRpZmZlcmVudCBQUklTTTIgTUFDIHBhcnRzIHVzZSBkaWZmZXJlbnQgYnVzZXMgYW5kIHN1Y2guCisqCisqIEFyZ3VtZW50czoKKyogICAgICAgaHcJTUFDIHBhcnQgc3RydWN0dXJlCisqCXZhbAlWYWx1ZSB0byBwdXQgaW4gdGhlIHJlZ2lzdGVyCisqICAgICAgIHJlZwlSZWdpc3RlciBpZGVudGlmaWVyIChvZmZzZXQgZm9yIEkvTyBiYXNlZCBpL2YpCisqCisqIFJldHVybnM6CisqICAgICAgIE5vdGhpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGlubGluZSB2b2lkIAorX19oZmEzODR4X3NldHJlZ19ub3N3YXAoaGZhMzg0eF90ICpodywgVUlOVDE2IHZhbCwgVUlOVCByZWcpCit7CisjaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKKwl3bGFuX291dHcoIHZhbCwgaHctPmlvYmFzZSArIHJlZyk7CisJcmV0dXJuOworI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorCXdyaXRldyh2YWwsIGh3LT5tZW1iYXNlICsgcmVnKTsKKwlyZXR1cm47CisjZW5kaWYKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgaGZhMzg0eF9ldmVudHNfYWxsKGhmYTM4NHhfdCAqaHcpCit7CisJaGZhMzg0eF9zZXRyZWcoaHcsIAorCQkgICAgICAgSEZBMzg0eF9JTlRfTk9STUFMCisjaWZkZWYgQ01EX0lSUQorCQkgICAgICAgfCBIRkEzODR4X0lOVEVOX0NNRF9TRVQoMSkKKyNlbmRpZgorCQkgICAgICAgLAorCQkgICAgICAgSEZBMzg0eF9JTlRFTik7CQorCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZmEzODR4X2V2ZW50c19ub2JhcChoZmEzODR4X3QgKmh3KQoreworCWhmYTM4NHhfc2V0cmVnKGh3LCAKKwkJICAgICAgICAoSEZBMzg0eF9JTlRfTk9STUFMICYgfkhGQTM4NHhfSU5UX0JBUF9PUCkKKyNpZmRlZiBDTURfSVJRCisJCSAgICAgICB8IEhGQTM4NHhfSU5URU5fQ01EX1NFVCgxKQorI2VuZGlmCisJCSAgICAgICAsCisJCSAgICAgICBIRkEzODR4X0lOVEVOKTsJCisKK30KKworI2VuZGlmIC8qIFdMQU5fSE9TVElGICE9IFdMQU5fVVNCICovCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgIC8qIF9IRkEzODR4X0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L2lwb2liLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9pcG9pYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzc0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9pcG9pYi5jCkBAIC0wLDAgKzEsNzgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9lcnJvcnRhYi5oPgorI2luY2x1ZGUgPGdweGUvaWZfYXJwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbmZpbmliYW5kLmg+CisjaW5jbHVkZSA8Z3B4ZS9pYl9wYXRocmVjLmg+CisjaW5jbHVkZSA8Z3B4ZS9pYl9tY2FzdC5oPgorI2luY2x1ZGUgPGdweGUvaXBvaWIuaD4KKworLyoqIEBmaWxlCisgKgorICogSVAgb3ZlciBJbmZpbmliYW5kCisgKi8KKworLyoqIE51bWJlciBvZiBJUG9JQiBzZW5kIHdvcmsgcXVldWUgZW50cmllcyAqLworI2RlZmluZSBJUE9JQl9OVU1fU0VORF9XUUVTIDIKKworLyoqIE51bWJlciBvZiBJUG9JQiByZWNlaXZlIHdvcmsgcXVldWUgZW50cmllcyAqLworI2RlZmluZSBJUE9JQl9OVU1fUkVDVl9XUUVTIDQKKworLyoqIE51bWJlciBvZiBJUG9JQiBjb21wbGV0aW9uIGVudHJpZXMgKi8KKyNkZWZpbmUgSVBPSUJfTlVNX0NRRVMgOAorCisvKiogQW4gSVBvSUIgZGV2aWNlICovCitzdHJ1Y3QgaXBvaWJfZGV2aWNlIHsKKwkvKiogTmV0d29yayBkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCS8qKiBVbmRlcmx5aW5nIEluZmluaWJhbmQgZGV2aWNlICovCisJc3RydWN0IGliX2RldmljZSAqaWJkZXY7CisJLyoqIENvbXBsZXRpb24gcXVldWUgKi8KKwlzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3E7CisJLyoqIFF1ZXVlIHBhaXIgKi8KKwlzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXA7CisJLyoqIEJyb2FkY2FzdCBNQUMgKi8KKwlzdHJ1Y3QgaXBvaWJfbWFjIGJyb2FkY2FzdDsKKwkvKiogSm9pbmVkIHRvIElQdjQgYnJvYWRjYXN0IG11bHRpY2FzdCBncm91cAorCSAqCisJICogVGhpcyBmbGFnIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGluaXRpYXRlZCB0aGUKKwkgKiBqb2luIHRvIHRoZSBJUHY0IGJyb2FkY2FzdCBtdWx0aWNhc3QgZ3JvdXAuCisJICovCisJaW50IGJyb2FkY2FzdF9qb2luZWQ7CisJLyoqIElQdjQgYnJvYWRjYXN0IG11bHRpY2FzdCBncm91cCBtZW1iZXJzaGlwICovCisJc3RydWN0IGliX21jX21lbWJlcnNoaXAgYnJvYWRjYXN0X21lbWJlcnNoaXA7Cit9OworCisvKiogQnJvYWRjYXN0IElQb0lCIGFkZHJlc3MgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBvaWJfbWFjIGlwb2liX2Jyb2FkY2FzdCA9IHsKKwkuZmxhZ3NfX3FwbiA9IGh0b25sICggSUJfUVBOX0JST0FEQ0FTVCApLAorCS5naWQudS5ieXRlcyA9IAl7IDB4ZmYsIDB4MTIsIDB4NDAsIDB4MWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfSwKK307CisKKy8qKiBMaW5rIHN0YXR1cyBmb3IgImJyb2FkY2FzdCBqb2luIGluIHByb2dyZXNzIiAqLworI2RlZmluZSBFSU5QUk9HUkVTU19KT0lOSU5HICggRUlOUFJPR1JFU1MgfCBFVU5JUV8wMSApCisKKy8qKiBIdW1hbi1yZWFkYWJsZSBtZXNzYWdlIGZvciB0aGUgbGluayBzdGF0dXMgKi8KK3N0cnVjdCBlcnJvcnRhYiBpcG9pYl9lcnJvcnNbXSBfX2Vycm9ydGFiID0geworCXsgRUlOUFJPR1JFU1NfSk9JTklORywgIkpvaW5pbmciIH0sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIElQb0lCIHBlZXIgY2FjaGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogSVBvSUIgcGVlciBhZGRyZXNzCisgKgorICogVGhlIElQb0lCIGxpbmstbGF5ZXIgaGVhZGVyIGlzIG9ubHkgZm91ciBieXRlcyBsb25nIGFuZCBzbyBkb2VzIG5vdAorICogaGF2ZSBzdWZmaWNpZW50IHJvb20gdG8gc3RvcmUgSVBvSUIgTUFDIGFkZHJlc3MoZXMpLiAgV2UgdGhlcmVmb3JlCisgKiBtYWludGFpbiBhIGNhY2hlIG9mIE1BQyBhZGRyZXNzZXMgaWRlbnRpZmllZCBieSBhIHNpbmdsZS1ieXRlIGtleSwKKyAqIGFuZCBhYnVzZSB0aGUgc3BhcmUgdHdvIGJ5dGVzIHdpdGhpbiB0aGUgbGluay1sYXllciBoZWFkZXIgdG8KKyAqIGNvbW11bmljYXRlIHRoZXNlIE1BQyBhZGRyZXNzZXMgYmV0d2VlbiB0aGUgbGluay1sYXllciBjb2RlIGFuZCB0aGUKKyAqIG5ldGRldmljZSBkcml2ZXIuCisgKi8KK3N0cnVjdCBpcG9pYl9wZWVyIHsKKwkvKiogS2V5ICovCisJdWludDhfdCBrZXk7CisJLyoqIE1BQyBhZGRyZXNzICovCisJc3RydWN0IGlwb2liX21hYyBtYWM7Cit9OworCisvKiogTnVtYmVyIG9mIElQb0lCIHBlZXIgY2FjaGUgZW50cmllcworICoKKyAqIE11c3QgYmUgYSBwb3dlciBvZiB0d28uCisgKi8KKyNkZWZpbmUgSVBPSUJfTlVNX0NBQ0hFRF9QRUVSUyA0CisKKy8qKiBJUG9JQiBwZWVyIGFkZHJlc3MgY2FjaGUgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBvaWJfcGVlciBpcG9pYl9wZWVyX2NhY2hlW0lQT0lCX05VTV9DQUNIRURfUEVFUlNdOworCisvKiogT2xkZXN0IElQb0lCIHBlZXIgY2FjaGUgZW50cnkgaW5kZXggKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBvaWJfcGVlcl9jYWNoZV9pZHggPSAxOworCisvKioKKyAqIExvb2sgdXAgY2FjaGVkIHBlZXIgYnkga2V5CisgKgorICogQHYga2V5CQlQZWVyIGNhY2hlIGtleQorICogQHJldCBwZWVyCQlQZWVyIGNhY2hlIGVudHJ5LCBvciBOVUxMCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBvaWJfcGVlciAqIGlwb2liX2xvb2t1cF9wZWVyX2J5X2tleSAoIHVuc2lnbmVkIGludCBrZXkgKSB7CisJc3RydWN0IGlwb2liX3BlZXIgKnBlZXI7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBJUE9JQl9OVU1fQ0FDSEVEX1BFRVJTIDsgaSsrICkgeworCQlwZWVyID0gJmlwb2liX3BlZXJfY2FjaGVbaV07CisJCWlmICggcGVlci0+a2V5ID09IGtleSApCisJCQlyZXR1cm4gcGVlcjsKKwl9CisKKwlpZiAoIGtleSAhPSAwICkgeworCQlEQkcgKCAiSVBvSUIgd2FybmluZzogcGVlciBjYWNoZSBsb3N0IHRyYWNrIG9mIGtleSAleCB3aGlsZSAiCisJCSAgICAgICJzdGlsbCBpbiB1c2VcbiIsIGtleSApOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBTdG9yZSBHSUQgYW5kIFFQTiBpbiBwZWVyIGNhY2hlCisgKgorICogQHYgbWFjCQlQZWVyIE1BQyBhZGRyZXNzCisgKiBAcmV0IHBlZXIJCVBlZXIgY2FjaGUgZW50cnkKKyAqLworc3RhdGljIHN0cnVjdCBpcG9pYl9wZWVyICogaXBvaWJfY2FjaGVfcGVlciAoIGNvbnN0IHN0cnVjdCBpcG9pYl9tYWMgKm1hYyApIHsKKwlzdHJ1Y3QgaXBvaWJfcGVlciAqcGVlcjsKKwl1bnNpZ25lZCBpbnQga2V5OworCXVuc2lnbmVkIGludCBpOworCisJLyogTG9vayBmb3IgZXhpc3RpbmcgY2FjaGUgZW50cnkgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBJUE9JQl9OVU1fQ0FDSEVEX1BFRVJTIDsgaSsrICkgeworCQlwZWVyID0gJmlwb2liX3BlZXJfY2FjaGVbaV07CisJCWlmICggbWVtY21wICggJnBlZXItPm1hYywgbWFjLCBzaXplb2YgKCBwZWVyLT5tYWMgKSApID09IDAgKQorCQkJcmV0dXJuIHBlZXI7CisJfQorCisJLyogTm8gZW50cnkgZm91bmQ6IGNyZWF0ZSBhIG5ldyBvbmUgKi8KKwlrZXkgPSBpcG9pYl9wZWVyX2NhY2hlX2lkeCsrOworCXBlZXIgPSAmaXBvaWJfcGVlcl9jYWNoZVsga2V5ICUgSVBPSUJfTlVNX0NBQ0hFRF9QRUVSUyBdOworCWlmICggcGVlci0+a2V5ICkKKwkJREJHICggIklQb0lCIHBlZXIgJXggZXZpY3RlZCBmcm9tIGNhY2hlXG4iLCBwZWVyLT5rZXkgKTsKKworCW1lbXNldCAoIHBlZXIsIDAsIHNpemVvZiAoICpwZWVyICkgKTsKKwlwZWVyLT5rZXkgPSBrZXk7CisJbWVtY3B5ICggJnBlZXItPm1hYywgbWFjLCBzaXplb2YgKCBwZWVyLT5tYWMgKSApOworCURCRyAoICJJUG9JQiBwZWVyICV4IGhhcyBNQUMgJXNcbiIsCisJICAgICAgcGVlci0+a2V5LCBpcG9pYl9udG9hICggJnBlZXItPm1hYyApICk7CisJcmV0dXJuIHBlZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSVBvSUIgbGluayBsYXllcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBBZGQgSVBvSUIgbGluay1sYXllciBoZWFkZXIKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbGxfZGVzdAkJTGluay1sYXllciBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiBAdiBsbF9zb3VyY2UJCVNvdXJjZSBsaW5rLWxheWVyIGFkZHJlc3MKKyAqIEB2IG5ldF9wcm90bwkJTmV0d29yay1sYXllciBwcm90b2NvbCwgaW4gbmV0d29yay1ieXRlIG9yZGVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpcG9pYl9wdXNoICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiBfX3VudXNlZCwKKwkJCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBjb25zdCB2b2lkICpsbF9kZXN0LAorCQkJY29uc3Qgdm9pZCAqbGxfc291cmNlIF9fdW51c2VkLCB1aW50MTZfdCBuZXRfcHJvdG8gKSB7CisJc3RydWN0IGlwb2liX2hkciAqaXBvaWJfaGRyID0KKwkJaW9iX3B1c2ggKCBpb2J1Ziwgc2l6ZW9mICggKmlwb2liX2hkciApICk7CisJY29uc3Qgc3RydWN0IGlwb2liX21hYyAqZGVzdF9tYWMgPSBsbF9kZXN0OworCWNvbnN0IHN0cnVjdCBpcG9pYl9tYWMgKnNyY19tYWMgPSBsbF9zb3VyY2U7CisJc3RydWN0IGlwb2liX3BlZXIgKmRlc3Q7CisJc3RydWN0IGlwb2liX3BlZXIgKnNyYzsKKworCS8qIEFkZCBsaW5rLWxheWVyIGFkZHJlc3NlcyB0byBjYWNoZSAqLworCWRlc3QgPSBpcG9pYl9jYWNoZV9wZWVyICggZGVzdF9tYWMgKTsKKwlzcmMgPSBpcG9pYl9jYWNoZV9wZWVyICggc3JjX21hYyApOworCisJLyogQnVpbGQgSVBvSUIgaGVhZGVyICovCisJaXBvaWJfaGRyLT5wcm90byA9IG5ldF9wcm90bzsKKwlpcG9pYl9oZHItPnUucGVlci5kZXN0ID0gZGVzdC0+a2V5OworCWlwb2liX2hkci0+dS5wZWVyLnNyYyA9IHNyYy0+a2V5OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVtb3ZlIElQb0lCIGxpbmstbGF5ZXIgaGVhZGVyCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEByZXQgbGxfZGVzdAkJTGluay1sYXllciBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiBAcmV0IGxsX3NvdXJjZQlTb3VyY2UgbGluay1sYXllciBhZGRyZXNzCisgKiBAcmV0IG5ldF9wcm90bwlOZXR3b3JrLWxheWVyIHByb3RvY29sLCBpbiBuZXR3b3JrLWJ5dGUgb3JkZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlwb2liX3B1bGwgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGNvbnN0IHZvaWQgKipsbF9kZXN0LAorCQkJY29uc3Qgdm9pZCAqKmxsX3NvdXJjZSwgdWludDE2X3QgKm5ldF9wcm90byApIHsKKwlzdHJ1Y3QgaXBvaWJfZGV2aWNlICppcG9pYiA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXBvaWJfaGRyICppcG9pYl9oZHIgPSBpb2J1Zi0+ZGF0YTsKKwlzdHJ1Y3QgaXBvaWJfcGVlciAqZGVzdDsKKwlzdHJ1Y3QgaXBvaWJfcGVlciAqc291cmNlOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCBpb2JfbGVuICggaW9idWYgKSA8IHNpemVvZiAoICppcG9pYl9oZHIgKSApIHsKKwkJREJHICggIklQb0lCIHBhY2tldCB0b28gc2hvcnQgZm9yIGxpbmstbGF5ZXIgaGVhZGVyXG4iICk7CisJCURCR19IRCAoIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTdHJpcCBvZmYgSVBvSUIgaGVhZGVyICovCisJaW9iX3B1bGwgKCBpb2J1Ziwgc2l6ZW9mICggKmlwb2liX2hkciApICk7CisKKwkvKiBJZGVudGlmeSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcywgYW5kIGNsZWFyCisJICogcmVzZXJ2ZWQgd29yZCBpbiBJUG9JQiBoZWFkZXIKKwkgKi8KKwlkZXN0ID0gaXBvaWJfbG9va3VwX3BlZXJfYnlfa2V5ICggaXBvaWJfaGRyLT51LnBlZXIuZGVzdCApOworCXNvdXJjZSA9IGlwb2liX2xvb2t1cF9wZWVyX2J5X2tleSAoIGlwb2liX2hkci0+dS5wZWVyLnNyYyApOworCWlwb2liX2hkci0+dS5yZXNlcnZlZCA9IDA7CisKKwkvKiBGaWxsIGluIHJlcXVpcmVkIGZpZWxkcyAqLworCSpsbF9kZXN0ID0gKCBkZXN0ID8gJmRlc3QtPm1hYyA6ICZpcG9pYi0+YnJvYWRjYXN0ICk7CisJKmxsX3NvdXJjZSA9ICggc291cmNlID8gJnNvdXJjZS0+bWFjIDogJmlwb2liLT5icm9hZGNhc3QgKTsKKwkqbmV0X3Byb3RvID0gaXBvaWJfaGRyLT5wcm90bzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEluaXRpYWxpc2UgSVBvSUIgbGluay1sYXllciBhZGRyZXNzCisgKgorICogQHYgaHdfYWRkcgkJSGFyZHdhcmUgYWRkcmVzcworICogQHYgbGxfYWRkcgkJTGluay1sYXllciBhZGRyZXNzCisgKi8KK3N0YXRpYyB2b2lkIGlwb2liX2luaXRfYWRkciAoIGNvbnN0IHZvaWQgKmh3X2FkZHIsIHZvaWQgKmxsX2FkZHIgKSB7CisJY29uc3Qgc3RydWN0IGliX2dpZF9oYWxmICpndWlkID0gaHdfYWRkcjsKKwlzdHJ1Y3QgaXBvaWJfbWFjICptYWMgPSBsbF9hZGRyOworCisJbWVtc2V0ICggbWFjLCAwLCBzaXplb2YgKCAqbWFjICkgKTsKKwltZW1jcHkgKCAmbWFjLT5naWQudS5oYWxmWzFdLCBndWlkLCBzaXplb2YgKCBtYWMtPmdpZC51LmhhbGZbMV0gKSApOworfQorCisvKioKKyAqIFRyYW5zY3JpYmUgSVBvSUIgbGluay1sYXllciBhZGRyZXNzCisgKgorICogQHYgbGxfYWRkcglMaW5rLWxheWVyIGFkZHJlc3MKKyAqIEByZXQgc3RyaW5nCUxpbmstbGF5ZXIgYWRkcmVzcyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtYXQKKyAqLworY29uc3QgY2hhciAqIGlwb2liX250b2EgKCBjb25zdCB2b2lkICpsbF9hZGRyICkgeworCXN0YXRpYyBjaGFyIGJ1Zls0NV07CisJY29uc3Qgc3RydWN0IGlwb2liX21hYyAqbWFjID0gbGxfYWRkcjsKKworCXNucHJpbnRmICggYnVmLCBzaXplb2YgKCBidWYgKSwgIiUwOHg6JTA4eDolMDh4OiUwOHg6JTA4eCIsCisJCSAgIGh0b25sICggbWFjLT5mbGFnc19fcXBuICksIGh0b25sICggbWFjLT5naWQudS5kd29yZHNbMF0gKSwKKwkJICAgaHRvbmwgKCBtYWMtPmdpZC51LmR3b3Jkc1sxXSApLAorCQkgICBodG9ubCAoIG1hYy0+Z2lkLnUuZHdvcmRzWzJdICksCisJCSAgIGh0b25sICggbWFjLT5naWQudS5kd29yZHNbM10gKSApOworCXJldHVybiBidWY7Cit9CisKKy8qKgorICogSGFzaCBtdWx0aWNhc3QgYWRkcmVzcworICoKKyAqIEB2IGFmCQlBZGRyZXNzIGZhbWlseQorICogQHYgbmV0X2FkZHIJCU5ldHdvcmstbGF5ZXIgYWRkcmVzcworICogQHYgbGxfYWRkcgkJTGluay1sYXllciBhZGRyZXNzIHRvIGZpbGwgaW4KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlwb2liX21jX2hhc2ggKCB1bnNpZ25lZCBpbnQgYWYgX191bnVzZWQsCisJCQkgICBjb25zdCB2b2lkICpuZXRfYWRkciBfX3VudXNlZCwKKwkJCSAgIHZvaWQgKmxsX2FkZHIgX191bnVzZWQgKSB7CisKKwlyZXR1cm4gLUVOT1RTVVA7Cit9CisKKy8qKgorICogR2VuZXJhdGUgTWVsbGFub3ggRXRoZXJuZXQtY29tcGF0aWJsZSBjb21wcmVzc2VkIGxpbmstbGF5ZXIgYWRkcmVzcworICoKKyAqIEB2IGxsX2FkZHIJCUxpbmstbGF5ZXIgYWRkcmVzcworICogQHYgZXRoX2FkZHIJCUV0aGVybmV0LWNvbXBhdGlibGUgYWRkcmVzcyB0byBmaWxsIGluCisgKi8KK3N0YXRpYyBpbnQgaXBvaWJfbWx4X2V0aF9hZGRyICggY29uc3Qgc3RydWN0IGliX2dpZF9oYWxmICpndWlkLAorCQkJCXVpbnQ4X3QgKmV0aF9hZGRyICkgeworCWV0aF9hZGRyWzBdID0gKCAoIGd1aWQtPnUuYnl0ZXNbM10gPT0gMiApID8gMHgwMCA6IDB4MDIgKTsKKwlldGhfYWRkclsxXSA9IGd1aWQtPnUuYnl0ZXNbMV07CisJZXRoX2FkZHJbMl0gPSBndWlkLT51LmJ5dGVzWzJdOworCWV0aF9hZGRyWzNdID0gZ3VpZC0+dS5ieXRlc1s1XTsKKwlldGhfYWRkcls0XSA9IGd1aWQtPnUuYnl0ZXNbNl07CisJZXRoX2FkZHJbNV0gPSBndWlkLT51LmJ5dGVzWzddOworCXJldHVybiAwOworfQorCisvKiogQW4gSVBvSUIgRXRoZXJuZXQtY29tcGF0aWJsZSBjb21wcmVzc2VkIGxpbmstbGF5ZXIgYWRkcmVzcyBnZW5lcmF0b3IgKi8KK3N0cnVjdCBpcG9pYl9ldGhfYWRkcl9oYW5kbGVyIHsKKwkvKiogR1VJRCBieXRlIDEgKi8KKwl1aW50OF90IGJ5dGUxOworCS8qKiBHVUlEIGJ5dGUgMiAqLworCXVpbnQ4X3QgYnl0ZTI7CisJLyoqIEhhbmRsZXIgKi8KKwlpbnQgKCAqIGV0aF9hZGRyICkgKCBjb25zdCBzdHJ1Y3QgaWJfZ2lkX2hhbGYgKmd1aWQsCisJCQkgICAgIHVpbnQ4X3QgKmV0aF9hZGRyICk7Cit9OworCisvKiogSVBvSUIgRXRoZXJuZXQtY29tcGF0aWJsZSBjb21wcmVzc2VkIGxpbmstbGF5ZXIgYWRkcmVzcyBnZW5lcmF0b3JzICovCitzdGF0aWMgc3RydWN0IGlwb2liX2V0aF9hZGRyX2hhbmRsZXIgaXBvaWJfZXRoX2FkZHJfaGFuZGxlcnNbXSA9IHsKKwl7IDB4MDIsIDB4YzksIGlwb2liX21seF9ldGhfYWRkciB9LAorfTsKKworLyoqCisgKiBHZW5lcmF0ZSBFdGhlcm5ldC1jb21wYXRpYmxlIGNvbXByZXNzZWQgbGluay1sYXllciBhZGRyZXNzCisgKgorICogQHYgbGxfYWRkcgkJTGluay1sYXllciBhZGRyZXNzCisgKiBAdiBldGhfYWRkcgkJRXRoZXJuZXQtY29tcGF0aWJsZSBhZGRyZXNzIHRvIGZpbGwgaW4KKyAqLworc3RhdGljIGludCBpcG9pYl9ldGhfYWRkciAoIGNvbnN0IHZvaWQgKmxsX2FkZHIsIHZvaWQgKmV0aF9hZGRyICkgeworCWNvbnN0IHN0cnVjdCBpcG9pYl9tYWMgKmlwb2liX2FkZHIgPSBsbF9hZGRyOworCWNvbnN0IHN0cnVjdCBpYl9naWRfaGFsZiAqZ3VpZCA9ICZpcG9pYl9hZGRyLT5naWQudS5oYWxmWzFdOworCXN0cnVjdCBpcG9pYl9ldGhfYWRkcl9oYW5kbGVyICpoYW5kbGVyOworCXVuc2lnbmVkIGludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgKCBzaXplb2YgKCBpcG9pYl9ldGhfYWRkcl9oYW5kbGVycyApIC8KKwkJCSAgICBzaXplb2YgKCBpcG9pYl9ldGhfYWRkcl9oYW5kbGVyc1swXSApICkgOyBpKysgKSB7CisJCWhhbmRsZXIgPSAmaXBvaWJfZXRoX2FkZHJfaGFuZGxlcnNbaV07CisJCWlmICggKCBoYW5kbGVyLT5ieXRlMSA9PSBndWlkLT51LmJ5dGVzWzFdICkgJiYKKwkJICAgICAoIGhhbmRsZXItPmJ5dGUyID09IGd1aWQtPnUuYnl0ZXNbMl0gKSApIHsKKwkJCXJldHVybiBoYW5kbGVyLT5ldGhfYWRkciAoIGd1aWQsIGV0aF9hZGRyICk7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9UU1VQOworfQorCisvKiogSVBvSUIgcHJvdG9jb2wgKi8KK3N0cnVjdCBsbF9wcm90b2NvbCBpcG9pYl9wcm90b2NvbCBfX2xsX3Byb3RvY29sID0geworCS5uYW1lCQk9ICJJUG9JQiIsCisJLmxsX3Byb3RvCT0gaHRvbnMgKCBBUlBIUkRfSU5GSU5JQkFORCApLAorCS5od19hZGRyX2xlbgk9IHNpemVvZiAoIHN0cnVjdCBpYl9naWRfaGFsZiApLAorCS5sbF9hZGRyX2xlbgk9IElQT0lCX0FMRU4sCisJLmxsX2hlYWRlcl9sZW4JPSBJUE9JQl9ITEVOLAorCS5wdXNoCQk9IGlwb2liX3B1c2gsCisJLnB1bGwJCT0gaXBvaWJfcHVsbCwKKwkuaW5pdF9hZGRyCT0gaXBvaWJfaW5pdF9hZGRyLAorCS5udG9hCQk9IGlwb2liX250b2EsCisJLm1jX2hhc2gJPSBpcG9pYl9tY19oYXNoLAorCS5ldGhfYWRkcgk9IGlwb2liX2V0aF9hZGRyLAorfTsKKworLyoqCisgKiBBbGxvY2F0ZSBJUG9JQiBkZXZpY2UKKyAqCisgKiBAdiBwcml2X3NpemUJCVNpemUgb2YgZHJpdmVyIHByaXZhdGUgZGF0YQorICogQHJldCBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlLCBvciBOVUxMCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICogYWxsb2NfaXBvaWJkZXYgKCBzaXplX3QgcHJpdl9zaXplICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwluZXRkZXYgPSBhbGxvY19uZXRkZXYgKCBwcml2X3NpemUgKTsKKwlpZiAoIG5ldGRldiApIHsKKwkJbmV0ZGV2LT5sbF9wcm90b2NvbCA9ICZpcG9pYl9wcm90b2NvbDsKKwkJbmV0ZGV2LT5sbF9icm9hZGNhc3QgPSAoIHVpbnQ4X3QgKiApICZpcG9pYl9icm9hZGNhc3Q7CisJCW5ldGRldi0+bWF4X3BrdF9sZW4gPSBJQl9NQVhfUEFZTE9BRF9TSVpFOworCX0KKwlyZXR1cm4gbmV0ZGV2OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIElQb0lCIG5ldHdvcmsgZGV2aWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFRyYW5zbWl0IHBhY2tldCB2aWEgSVBvSUIgbmV0d29yayBkZXZpY2UKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXBvaWJfdHJhbnNtaXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXN0cnVjdCBpcG9pYl9kZXZpY2UgKmlwb2liID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ID0gaXBvaWItPmliZGV2OworCXN0cnVjdCBpcG9pYl9oZHIgKmlwb2liX2hkcjsKKwlzdHJ1Y3QgaXBvaWJfcGVlciAqZGVzdDsKKwlzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgYXY7CisJaW50IHJjOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCBpb2JfbGVuICggaW9idWYgKSA8IHNpemVvZiAoICppcG9pYl9oZHIgKSApIHsKKwkJREJHQyAoIGlwb2liLCAiSVBvSUIgJXAgYnVmZmVyIHRvbyBzaG9ydFxuIiwgaXBvaWIgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlwb2liX2hkciA9IGlvYnVmLT5kYXRhOworCisJLyogQXR0ZW1wdGluZyB0cmFuc21pc3Npb24gd2hpbGUgbGluayBpcyBkb3duIHdpbGwgcHV0IHRoZQorCSAqIHF1ZXVlIHBhaXIgaW50byBhbiBlcnJvciBzdGF0ZSwgc28gZG9uJ3QgdHJ5IGl0LgorCSAqLworCWlmICggISBpYl9saW5rX29rICggaWJkZXYgKSApCisJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisKKwkvKiBJZGVudGlmeSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJZGVzdCA9IGlwb2liX2xvb2t1cF9wZWVyX2J5X2tleSAoIGlwb2liX2hkci0+dS5wZWVyLmRlc3QgKTsKKwlpZiAoICEgZGVzdCApCisJCXJldHVybiAtRU5YSU87CisJaXBvaWJfaGRyLT51LnJlc2VydmVkID0gMDsKKworCS8qIENvbnN0cnVjdCBhZGRyZXNzIHZlY3RvciAqLworCW1lbXNldCAoICZhdiwgMCwgc2l6ZW9mICggYXYgKSApOworCWF2LnFwbiA9ICggbnRvaGwgKCBkZXN0LT5tYWMuZmxhZ3NfX3FwbiApICYgSUJfUVBOX01BU0sgKTsKKwlhdi5naWRfcHJlc2VudCA9IDE7CisJbWVtY3B5ICggJmF2LmdpZCwgJmRlc3QtPm1hYy5naWQsIHNpemVvZiAoIGF2LmdpZCApICk7CisJaWYgKCAoIHJjID0gaWJfcmVzb2x2ZV9wYXRoICggaWJkZXYsICZhdiApICkgIT0gMCApIHsKKwkJLyogUGF0aCBub3QgcmVzb2x2ZWQgeWV0ICovCisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gaWJfcG9zdF9zZW5kICggaWJkZXYsIGlwb2liLT5xcCwgJmF2LCBpb2J1ZiApOworfQorCisvKioKKyAqIEhhbmRsZSBJUG9JQiBzZW5kIGNvbXBsZXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgcmMJCUNvbXBsZXRpb24gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIHZvaWQgaXBvaWJfY29tcGxldGVfc2VuZCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2IF9fdW51c2VkLAorCQkJCSAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGludCByYyApIHsKKwlzdHJ1Y3QgaXBvaWJfZGV2aWNlICppcG9pYiA9IGliX3FwX2dldF9vd25lcmRhdGEgKCBxcCApOworCisJbmV0ZGV2X3R4X2NvbXBsZXRlX2VyciAoIGlwb2liLT5uZXRkZXYsIGlvYnVmLCByYyApOworfQorCisvKioKKyAqIEhhbmRsZSBJUG9JQiByZWNlaXZlIGNvbXBsZXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBhdgkJQWRkcmVzcyB2ZWN0b3IsIG9yIE5VTEwKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiByYwkJQ29tcGxldGlvbiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgdm9pZCBpcG9pYl9jb21wbGV0ZV9yZWN2ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgX191bnVzZWQsCisJCQkJICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkJICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2LAorCQkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGludCByYyApIHsKKwlzdHJ1Y3QgaXBvaWJfZGV2aWNlICppcG9pYiA9IGliX3FwX2dldF9vd25lcmRhdGEgKCBxcCApOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBpcG9pYi0+bmV0ZGV2OworCXN0cnVjdCBpcG9pYl9oZHIgKmlwb2liX2hkcjsKKwlzdHJ1Y3QgaXBvaWJfbWFjIGxsX3NyYzsKKwlzdHJ1Y3QgaXBvaWJfcGVlciAqc3JjOworCisJaWYgKCByYyAhPSAwICkgeworCQluZXRkZXZfcnhfZXJyICggbmV0ZGV2LCBpb2J1ZiwgcmMgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggaW9iX2xlbiAoIGlvYnVmICkgPCBzaXplb2YgKCBzdHJ1Y3QgaXBvaWJfaGRyICkgKSB7CisJCURCR0MgKCBpcG9pYiwgIklQb0lCICVwIHJlY2VpdmVkIHBhY2tldCB0b28gc2hvcnQgdG8gIgorCQkgICAgICAgImNvbnRhaW4gSVBvSUIgaGVhZGVyXG4iLCBpcG9pYiApOworCQlEQkdDX0hEICggaXBvaWIsIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSApOworCQluZXRkZXZfcnhfZXJyICggbmV0ZGV2LCBpb2J1ZiwgLUVJTyApOworCQlyZXR1cm47CisJfQorCWlwb2liX2hkciA9IGlvYnVmLT5kYXRhOworCisJLyogUGFyc2Ugc291cmNlIGFkZHJlc3MgKi8KKwlpZiAoIGF2LT5naWRfcHJlc2VudCApIHsKKwkJbGxfc3JjLmZsYWdzX19xcG4gPSBodG9ubCAoIGF2LT5xcG4gKTsKKwkJbWVtY3B5ICggJmxsX3NyYy5naWQsICZhdi0+Z2lkLCBzaXplb2YgKCBsbF9zcmMuZ2lkICkgKTsKKwkJc3JjID0gaXBvaWJfY2FjaGVfcGVlciAoICZsbF9zcmMgKTsKKwkJaXBvaWJfaGRyLT51LnBlZXIuc3JjID0gc3JjLT5rZXk7CisJfQorCisJLyogSGFuZCBvZmYgdG8gbmV0d29yayBsYXllciAqLworCW5ldGRldl9yeCAoIG5ldGRldiwgaW9idWYgKTsKK30KKworLyoqIElQb0lCIGNvbXBsZXRpb24gb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlX29wZXJhdGlvbnMgaXBvaWJfY3Ffb3AgPSB7CisJLmNvbXBsZXRlX3NlbmQgPSBpcG9pYl9jb21wbGV0ZV9zZW5kLAorCS5jb21wbGV0ZV9yZWN2ID0gaXBvaWJfY29tcGxldGVfcmVjdiwKK307CisKKy8qKgorICogUG9sbCBJUG9JQiBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaXBvaWJfcG9sbCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IGlwb2liX2RldmljZSAqaXBvaWIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGliX2RldmljZSAqaWJkZXYgPSBpcG9pYi0+aWJkZXY7CisKKwlpYl9wb2xsX2VxICggaWJkZXYgKTsKK30KKworLyoqCisgKiBFbmFibGUvZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIElQb0lCIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgZW5hYmxlCQlJbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkCisgKi8KK3N0YXRpYyB2b2lkIGlwb2liX2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgX191bnVzZWQsCisJCQlpbnQgZW5hYmxlIF9fdW51c2VkICkgeworCS8qIE5vIGltcGxlbWVudGF0aW9uICovCit9CisKKy8qKgorICogSGFuZGxlIElQdjQgYnJvYWRjYXN0IG11bHRpY2FzdCBncm91cCBqb2luIGNvbXBsZXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBtZW1iZXJzaGlwCU11bHRpY2FzdCBncm91cCBtZW1iZXJzaGlwCisgKiBAdiByYwkJU3RhdHVzIGNvZGUKKyAqIEB2IG1hZAkJUmVzcG9uc2UgTUFEIChvciBOVUxMIG9uIGVycm9yKQorICovCit2b2lkIGlwb2liX2pvaW5fY29tcGxldGUgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiBfX3VudXNlZCwKKwkJCSAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCBfX3VudXNlZCwKKwkJCSAgIHN0cnVjdCBpYl9tY19tZW1iZXJzaGlwICptZW1iZXJzaGlwLCBpbnQgcmMsCisJCQkgICB1bmlvbiBpYl9tYWQgKm1hZCBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgaXBvaWJfZGV2aWNlICppcG9pYiA9IGNvbnRhaW5lcl9vZiAoIG1lbWJlcnNoaXAsCisJCQkJICAgc3RydWN0IGlwb2liX2RldmljZSwgYnJvYWRjYXN0X21lbWJlcnNoaXAgKTsKKworCS8qIFJlY29yZCBqb2luIHN0YXR1cyBhcyBsaW5rIHN0YXR1cyAqLworCW5ldGRldl9saW5rX2VyciAoIGlwb2liLT5uZXRkZXYsIHJjICk7Cit9CisKKy8qKgorICogSm9pbiBJUHY0IGJyb2FkY2FzdCBtdWx0aWNhc3QgZ3JvdXAKKyAqCisgKiBAdiBpcG9pYgkJSVBvSUIgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpcG9pYl9qb2luX2Jyb2FkY2FzdF9ncm91cCAoIHN0cnVjdCBpcG9pYl9kZXZpY2UgKmlwb2liICkgeworCWludCByYzsKKworCWlmICggKCByYyA9IGliX21jYXN0X2pvaW4gKCBpcG9pYi0+aWJkZXYsIGlwb2liLT5xcCwKKwkJCQkgICAgJmlwb2liLT5icm9hZGNhc3RfbWVtYmVyc2hpcCwKKwkJCQkgICAgJmlwb2liLT5icm9hZGNhc3QuZ2lkLAorCQkJCSAgICBpcG9pYl9qb2luX2NvbXBsZXRlICkgKSAhPSAwICkgeworCQlEQkdDICggaXBvaWIsICJJUG9JQiAlcCBjb3VsZCBub3Qgam9pbiBicm9hZGNhc3QgZ3JvdXA6ICVzXG4iLAorCQkgICAgICAgaXBvaWIsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCWlwb2liLT5icm9hZGNhc3Rfam9pbmVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIExlYXZlIElQdjQgYnJvYWRjYXN0IG11bHRpY2FzdCBncm91cAorICoKKyAqIEB2IGlwb2liCQlJUG9JQiBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaXBvaWJfbGVhdmVfYnJvYWRjYXN0X2dyb3VwICggc3RydWN0IGlwb2liX2RldmljZSAqaXBvaWIgKSB7CisKKwlpZiAoIGlwb2liLT5icm9hZGNhc3Rfam9pbmVkICkgeworCQlpYl9tY2FzdF9sZWF2ZSAoIGlwb2liLT5pYmRldiwgaXBvaWItPnFwLAorCQkJCSAmaXBvaWItPmJyb2FkY2FzdF9tZW1iZXJzaGlwICk7CisJCWlwb2liLT5icm9hZGNhc3Rfam9pbmVkID0gMDsKKwl9Cit9CisKKy8qKgorICogT3BlbiBJUG9JQiBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlwb2liX29wZW4gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXN0cnVjdCBpcG9pYl9kZXZpY2UgKmlwb2liID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ID0gaXBvaWItPmliZGV2OworCXN0cnVjdCBpcG9pYl9tYWMgKm1hYyA9ICggKCBzdHJ1Y3QgaXBvaWJfbWFjICogKSBuZXRkZXYtPmxsX2FkZHIgKTsKKwlpbnQgcmM7CisKKwkvKiBPcGVuIElCIGRldmljZSAqLworCWlmICggKCByYyA9IGliX29wZW4gKCBpYmRldiApICkgIT0gMCApIHsKKwkJREJHQyAoIGlwb2liLCAiSVBvSUIgJXAgY291bGQgbm90IG9wZW4gZGV2aWNlOiAlc1xuIiwKKwkJICAgICAgIGlwb2liLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfaWJfb3BlbjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBjb21wbGV0aW9uIHF1ZXVlICovCisJaXBvaWItPmNxID0gaWJfY3JlYXRlX2NxICggaWJkZXYsIElQT0lCX05VTV9DUUVTLCAmaXBvaWJfY3Ffb3AgKTsKKwlpZiAoICEgaXBvaWItPmNxICkgeworCQlEQkdDICggaXBvaWIsICJJUG9JQiAlcCBjb3VsZCBub3QgYWxsb2NhdGUgY29tcGxldGlvbiBxdWV1ZVxuIiwKKwkJICAgICAgIGlwb2liICk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfY3JlYXRlX2NxOworCX0KKworCS8qIEFsbG9jYXRlIHF1ZXVlIHBhaXIgKi8KKwlpcG9pYi0+cXAgPSBpYl9jcmVhdGVfcXAgKCBpYmRldiwgSUJfUVBUX1VELAorCQkJCSAgIElQT0lCX05VTV9TRU5EX1dRRVMsIGlwb2liLT5jcSwKKwkJCQkgICBJUE9JQl9OVU1fUkVDVl9XUUVTLCBpcG9pYi0+Y3EgKTsKKwlpZiAoICEgaXBvaWItPnFwICkgeworCQlEQkdDICggaXBvaWIsICJJUG9JQiAlcCBjb3VsZCBub3QgYWxsb2NhdGUgcXVldWUgcGFpclxuIiwKKwkJICAgICAgIGlwb2liICk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfY3JlYXRlX3FwOworCX0KKwlpYl9xcF9zZXRfb3duZXJkYXRhICggaXBvaWItPnFwLCBpcG9pYiApOworCisJLyogVXBkYXRlIE1BQyBhZGRyZXNzIHdpdGggUVBOICovCisJbWFjLT5mbGFnc19fcXBuID0gaHRvbmwgKCBpcG9pYi0+cXAtPnFwbiApOworCisJLyogRmlsbCByZWNlaXZlIHJpbmdzICovCisJaWJfcmVmaWxsX3JlY3YgKCBpYmRldiwgaXBvaWItPnFwICk7CisKKwkvKiBGYWtlIGEgbGluayBzdGF0dXMgY2hhbmdlIHRvIGpvaW4gdGhlIGJyb2FkY2FzdCBncm91cCAqLworCWlwb2liX2xpbmtfc3RhdGVfY2hhbmdlZCAoIGliZGV2ICk7CisKKwlyZXR1cm4gMDsKKworCWliX2Rlc3Ryb3lfcXAgKCBpYmRldiwgaXBvaWItPnFwICk7CisgZXJyX2NyZWF0ZV9xcDoKKwlpYl9kZXN0cm95X2NxICggaWJkZXYsIGlwb2liLT5jcSApOworIGVycl9jcmVhdGVfY3E6CisJaWJfY2xvc2UgKCBpYmRldiApOworIGVycl9pYl9vcGVuOgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBDbG9zZSBJUG9JQiBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgaXBvaWJfY2xvc2UgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXN0cnVjdCBpcG9pYl9kZXZpY2UgKmlwb2liID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ID0gaXBvaWItPmliZGV2OworCXN0cnVjdCBpcG9pYl9tYWMgKm1hYyA9ICggKCBzdHJ1Y3QgaXBvaWJfbWFjICogKSBuZXRkZXYtPmxsX2FkZHIgKTsKKworCS8qIExlYXZlIGJyb2FkY2FzdCBncm91cCAqLworCWlwb2liX2xlYXZlX2Jyb2FkY2FzdF9ncm91cCAoIGlwb2liICk7CisKKwkvKiBSZW1vdmUgUVBOIGZyb20gTUFDIGFkZHJlc3MgKi8KKwltYWMtPmZsYWdzX19xcG4gPSAwOworCisJLyogVGVhciBkb3duIHRoZSBxdWV1ZXMgKi8KKwlpYl9kZXN0cm95X3FwICggaWJkZXYsIGlwb2liLT5xcCApOworCWliX2Rlc3Ryb3lfY3EgKCBpYmRldiwgaXBvaWItPmNxICk7CisKKwkvKiBDbG9zZSBJQiBkZXZpY2UgKi8KKwlpYl9jbG9zZSAoIGliZGV2ICk7Cit9CisKKy8qKiBJUG9JQiBuZXR3b3JrIGRldmljZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BlcmF0aW9ucyBpcG9pYl9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IGlwb2liX29wZW4sCisJLmNsb3NlCQk9IGlwb2liX2Nsb3NlLAorCS50cmFuc21pdAk9IGlwb2liX3RyYW5zbWl0LAorCS5wb2xsCQk9IGlwb2liX3BvbGwsCisJLmlycQkJPSBpcG9pYl9pcnEsCit9OworCisvKioKKyAqIEhhbmRsZSBsaW5rIHN0YXR1cyBjaGFuZ2UKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqLwordm9pZCBpcG9pYl9saW5rX3N0YXRlX2NoYW5nZWQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaWJfZ2V0X293bmVyZGF0YSAoIGliZGV2ICk7CisJc3RydWN0IGlwb2liX2RldmljZSAqaXBvaWIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGlwb2liX21hYyAqbWFjID0gKCAoIHN0cnVjdCBpcG9pYl9tYWMgKiApIG5ldGRldi0+bGxfYWRkciApOworCWludCByYzsKKworCS8qIExlYXZlIGV4aXN0aW5nIGJyb2FkY2FzdCBncm91cCAqLworCWlwb2liX2xlYXZlX2Jyb2FkY2FzdF9ncm91cCAoIGlwb2liICk7CisKKwkvKiBVcGRhdGUgTUFDIGFkZHJlc3MgYmFzZWQgb24gcG90ZW50aWFsbHktbmV3IEdJRCBwcmVmaXggKi8KKwltZW1jcHkgKCAmbWFjLT5naWQudS5oYWxmWzBdLCAmaWJkZXYtPmdpZC51LmhhbGZbMF0sCisJCSBzaXplb2YgKCBtYWMtPmdpZC51LmhhbGZbMF0gKSApOworCisJLyogVXBkYXRlIGJyb2FkY2FzdCBHSUQgYmFzZWQgb24gcG90ZW50aWFsbHktbmV3IHBhcnRpdGlvbiBrZXkgKi8KKwlpcG9pYi0+YnJvYWRjYXN0LmdpZC51LndvcmRzWzJdID0KKwkJaHRvbnMgKCBpYmRldi0+cGtleSB8IElCX1BLRVlfRlVMTCApOworCisJLyogU2V0IG5ldCBkZXZpY2UgbGluayBzdGF0ZSB0byByZWZsZWN0IEluZmluaWJhbmQgbGluayBzdGF0ZSAqLworCXJjID0gaWJfbGlua19yYyAoIGliZGV2ICk7CisJbmV0ZGV2X2xpbmtfZXJyICggbmV0ZGV2LCAoIHJjID8gcmMgOiAtRUlOUFJPR1JFU1NfSk9JTklORyApICk7CisKKwkvKiBKb2luIG5ldyBicm9hZGNhc3QgZ3JvdXAgKi8KKwlpZiAoIGliX2xpbmtfb2sgKCBpYmRldiApICYmCisJICAgICAoICggcmMgPSBpcG9pYl9qb2luX2Jyb2FkY2FzdF9ncm91cCAoIGlwb2liICkgKSAhPSAwICkgKSB7CisJCURCR0MgKCBpcG9pYiwgIklQb0lCICVwIGNvdWxkIG5vdCByZWpvaW4gYnJvYWRjYXN0IGdyb3VwOiAiCisJCSAgICAgICAiJXNcbiIsIGlwb2liLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJbmV0ZGV2X2xpbmtfZXJyICggbmV0ZGV2LCByYyApOworCQlyZXR1cm47CisJfQorfQorCisvKioKKyAqIFByb2JlIElQb0lCIGRldmljZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpcG9pYl9wcm9iZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGlwb2liX2RldmljZSAqaXBvaWI7CisJaW50IHJjOworCisJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KKwluZXRkZXYgPSBhbGxvY19pcG9pYmRldiAoIHNpemVvZiAoICppcG9pYiApICk7CisJaWYgKCAhIG5ldGRldiApCisJCXJldHVybiAtRU5PTUVNOworCW5ldGRldl9pbml0ICggbmV0ZGV2LCAmaXBvaWJfb3BlcmF0aW9ucyApOworCWlwb2liID0gbmV0ZGV2LT5wcml2OworCWliX3NldF9vd25lcmRhdGEgKCBpYmRldiwgbmV0ZGV2ICk7CisJbmV0ZGV2LT5kZXYgPSBpYmRldi0+ZGV2OworCW1lbXNldCAoIGlwb2liLCAwLCBzaXplb2YgKCAqaXBvaWIgKSApOworCWlwb2liLT5uZXRkZXYgPSBuZXRkZXY7CisJaXBvaWItPmliZGV2ID0gaWJkZXY7CisKKwkvKiBFeHRyYWN0IGhhcmR3YXJlIGFkZHJlc3MgKi8KKwltZW1jcHkgKCBuZXRkZXYtPmh3X2FkZHIsICZpYmRldi0+Z2lkLnUuaGFsZlsxXSwKKwkJIHNpemVvZiAoIGliZGV2LT5naWQudS5oYWxmWzFdICkgKTsKKworCS8qIFNldCBkZWZhdWx0IGJyb2FkY2FzdCBhZGRyZXNzICovCisJbWVtY3B5ICggJmlwb2liLT5icm9hZGNhc3QsICZpcG9pYl9icm9hZGNhc3QsCisJCSBzaXplb2YgKCBpcG9pYi0+YnJvYWRjYXN0ICkgKTsKKwluZXRkZXYtPmxsX2Jyb2FkY2FzdCA9ICggKCB1aW50OF90ICogKSAmaXBvaWItPmJyb2FkY2FzdCApOworCisJLyogUmVnaXN0ZXIgbmV0d29yayBkZXZpY2UgKi8KKwlpZiAoICggcmMgPSByZWdpc3Rlcl9uZXRkZXYgKCBuZXRkZXYgKSApICE9IDAgKQorCQlnb3RvIGVycl9yZWdpc3Rlcl9uZXRkZXY7CisKKwlyZXR1cm4gMDsKKworIGVycl9yZWdpc3Rlcl9uZXRkZXY6CisJbmV0ZGV2X251bGxpZnkgKCBuZXRkZXYgKTsKKwluZXRkZXZfcHV0ICggbmV0ZGV2ICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFJlbW92ZSBJUG9JQiBkZXZpY2UKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqLwordm9pZCBpcG9pYl9yZW1vdmUgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaWJfZ2V0X293bmVyZGF0YSAoIGliZGV2ICk7CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoIG5ldGRldiApOworCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbGVnYWN5LmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9sZWdhY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWIzNTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbGVnYWN5LmMKQEAgLTAsMCArMSwxNTcgQEAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxuaWMuaD4KKworLyoKKyAqIFF1aWNrIGFuZCBkaXJ0eSBjb21wYXRpYmlsaXR5IGxheWVyCisgKgorICogVGhpcyBzaG91bGQgYWxsb3cgb2xkLUFQSSBQQ0kgZHJpdmVycyB0byBhdCBsZWFzdCBmdW5jdGlvbiB1bnRpbAorICogdGhleSBhcmUgdXBkYXRlZC4gIEl0IHdpbGwgbm90IGhlbHAgbm9uLVBDSSBkcml2ZXJzLgorICoKKyAqIE5vIGRyaXZlcnMgc2hvdWxkIHJlbHkgb24gdGhpcyBjb2RlLiAgSXQgd2lsbCBiZSByZW1vdmVkIGFzYXAuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RydWN0IG5pYyBuaWM7CisKK3N0YXRpYyBpbnQgbGVnYWN5X3JlZ2lzdGVyZWQgPSAwOworCitzdGF0aWMgaW50IGxlZ2FjeV90cmFuc21pdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7CisKKwlEQkcgKCAiVHJhbnNtaXR0aW5nICV6ZCBieXRlc1xuIiwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwlpb2JfcGFkICggaW9idWYsIEVUSF9aTEVOICk7CisJZXRoaGRyID0gaW9idWYtPmRhdGE7CisJaW9iX3B1bGwgKCBpb2J1Ziwgc2l6ZW9mICggKmV0aGhkciApICk7CisJbmljLT5uaWNfb3AtPnRyYW5zbWl0ICggbmljLCAoIGNvbnN0IGNoYXIgKiApIGV0aGhkci0+aF9kZXN0LAorCQkJCW50b2hzICggZXRoaGRyLT5oX3Byb3RvY29sICksCisJCQkJaW9iX2xlbiAoIGlvYnVmICksIGlvYnVmLT5kYXRhICk7CisJbmV0ZGV2X3R4X2NvbXBsZXRlICggbmV0ZGV2LCBpb2J1ZiApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsZWdhY3lfcG9sbCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCisJaW9idWYgPSBhbGxvY19pb2IgKCBFVEhfRlJBTUVfTEVOICk7CisJaWYgKCAhIGlvYnVmICkKKwkJcmV0dXJuOworCisJbmljLT5wYWNrZXQgPSBpb2J1Zi0+ZGF0YTsKKwlpZiAoIG5pYy0+bmljX29wLT5wb2xsICggbmljLCAxICkgKSB7CisJCURCRyAoICJSZWNlaXZlZCAlZCBieXRlc1xuIiwgbmljLT5wYWNrZXRsZW4gKTsKKwkJaW9iX3B1dCAoIGlvYnVmLCBuaWMtPnBhY2tldGxlbiApOworCQluZXRkZXZfcnggKCBuZXRkZXYsIGlvYnVmICk7CisJfSBlbHNlIHsKKwkJZnJlZV9pb2IgKCBpb2J1ZiApOworCX0KK30KKworc3RhdGljIGludCBsZWdhY3lfb3BlbiAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgX191bnVzZWQgKSB7CisJLyogTm90aGluZyB0byBkbyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsZWdhY3lfY2xvc2UgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2IF9fdW51c2VkICkgeworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIHZvaWQgbGVnYWN5X2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgX191bnVzZWQsIGludCBlbmFibGUgKSB7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2LT5wcml2OworCisJbmljLT5uaWNfb3AtPmlycSAoIG5pYywgKCBlbmFibGUgPyBFTkFCTEUgOiBESVNBQkxFICkgKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgbGVnYWN5X29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gbGVnYWN5X29wZW4sCisJLmNsb3NlCQk9IGxlZ2FjeV9jbG9zZSwKKwkudHJhbnNtaXQJPSBsZWdhY3lfdHJhbnNtaXQsCisJLnBvbGwJCT0gbGVnYWN5X3BvbGwsCisJLmlycSAgIAkJPSBsZWdhY3lfaXJxLAorfTsKKworaW50IGxlZ2FjeV9wcm9iZSAoIHZvaWQgKmh3ZGV2LAorCQkgICB2b2lkICggKiBzZXRfZHJ2ZGF0YSApICggdm9pZCAqaHdkZXYsIHZvaWQgKnByaXYgKSwKKwkJICAgc3RydWN0IGRldmljZSAqZGV2LAorCQkgICBpbnQgKCAqIHByb2JlICkgKCBzdHJ1Y3QgbmljICpuaWMsIHZvaWQgKmh3ZGV2ICksCisJCSAgIHZvaWQgKCAqIGRpc2FibGUgKSAoIHN0cnVjdCBuaWMgKm5pYywgdm9pZCAqaHdkZXYgKSApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCWludCByYzsKKworCWlmICggbGVnYWN5X3JlZ2lzdGVyZWQgKQorCQlyZXR1cm4gLUVCVVNZOworCQorCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2ICggMCApOworCWlmICggISBuZXRkZXYgKQorCQlyZXR1cm4gLUVOT01FTTsKKwluZXRkZXZfaW5pdCAoIG5ldGRldiwgJmxlZ2FjeV9vcGVyYXRpb25zICk7CisJbmV0ZGV2LT5wcml2ID0gJm5pYzsKKwltZW1zZXQgKCAmbmljLCAwLCBzaXplb2YgKCBuaWMgKSApOworCXNldF9kcnZkYXRhICggaHdkZXYsIG5ldGRldiApOworCW5ldGRldi0+ZGV2ID0gZGV2OworCisJbmljLm5vZGVfYWRkciA9IG5ldGRldi0+aHdfYWRkcjsKKwluaWMuaXJxbm8gPSBkZXYtPmRlc2MuaXJxOworCisJaWYgKCAhIHByb2JlICggJm5pYywgaHdkZXYgKSApIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9wcm9iZTsKKwl9CisKKwkvKiBPdmVyd3JpdGUgdGhlIElSUSBudW1iZXIuICBTb21lIGxlZ2FjeSBkZXZpY2VzIHNldAorCSAqIG5pYy0+aXJxbm8gdG8gMCBpbiB0aGUgcHJvYmUgcm91dGluZSB0byBpbmRpY2F0ZSB0aGF0IHRoZXkKKwkgKiBkb24ndCBzdXBwb3J0IGludGVycnVwdHM7IGRvaW5nIHRoaXMgYWxsb3dzIHRoZSB0aW1lcgorCSAqIGludGVycnVwdCB0byBiZSB1c2VkIGluc3RlYWQuCisJICovCisJZGV2LT5kZXNjLmlycSA9IG5pYy5pcnFubzsKKworCS8qIE1hcmsgYXMgbGluayB1cDsgbGVnYWN5IGRldmljZXMgZG9uJ3QgaGFuZGxlIGxpbmsgc3RhdGUgKi8KKwluZXRkZXZfbGlua191cCAoIG5ldGRldiApOworCisJaWYgKCAoIHJjID0gcmVnaXN0ZXJfbmV0ZGV2ICggbmV0ZGV2ICkgKSAhPSAwICkKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisKKwkvKiBEbyBub3QgcmVtb3ZlIHRoaXMgbWVzc2FnZSAqLworCXByaW50ZiAoICJXQVJOSU5HOiBVc2luZyBsZWdhY3kgTklDIHdyYXBwZXIgb24gJXNcbiIsCisJCSBuZXRkZXYtPmxsX3Byb3RvY29sLT5udG9hICggbmljLm5vZGVfYWRkciApICk7CisKKwlsZWdhY3lfcmVnaXN0ZXJlZCA9IDE7CisJcmV0dXJuIDA7CisKKyBlcnJfcmVnaXN0ZXI6CisJZGlzYWJsZSAoICZuaWMsIGh3ZGV2ICk7CisgZXJyX3Byb2JlOgorCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworCXJldHVybiByYzsKK30KKwordm9pZCBsZWdhY3lfcmVtb3ZlICggdm9pZCAqaHdkZXYsCisJCSAgICAgdm9pZCAqICggKiBnZXRfZHJ2ZGF0YSApICggdm9pZCAqaHdkZXYgKSwKKwkJICAgICB2b2lkICggKiBkaXNhYmxlICkgKCBzdHJ1Y3QgbmljICpuaWMsIHZvaWQgKmh3ZGV2ICkgKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGdldF9kcnZkYXRhICggaHdkZXYgKTsKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXYtPnByaXY7CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoIG5ldGRldiApOworCWRpc2FibGUgKCBuaWMsIGh3ZGV2ICk7CisJbmV0ZGV2X251bGxpZnkgKCBuZXRkZXYgKTsKKwluZXRkZXZfcHV0ICggbmV0ZGV2ICk7CisJbGVnYWN5X3JlZ2lzdGVyZWQgPSAwOworfQorCitpbnQgZHVtbXlfY29ubmVjdCAoIHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCApIHsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBkdW1teV9pcnEgKCBzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBpcnFfYWN0aW9uIF9fdW51c2VkICkgeworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L210ZDgweC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbXRkODB4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmNTliMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L210ZDgweC5jCkBAIC0wLDAgKzEsMTAyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgIG10ZDgweC5jOiBFdGhlcmJvb3QgZGV2aWNlIGRyaXZlciBmb3IgdGhlIG10ZDgweCBFdGhlcm5ldCBjaGlwLgorKiAgICBXcml0dGVuIDIwMDQtMjAwNCBieSBFcmRlbSBHw7x2ZW4gPHp1ZW5jYXBAeWFob28uY29tPgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogICAgUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGJhc2VkIG9uOgorKiAgICAgICAgICAgICAgIGZlYWxueC5jOiBBIExpbnV4IGRldmljZSBkcml2ZXIgZm9yIHRoZSBtdGQ4MHggRXRoZXJuZXQgY2hpcAorKiAgICAgICAgICAgICAgIFdyaXR0ZW4gMTk5OC0yMDAwIGJ5IERvbmFsZCBCZWNrZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxtaWkuaD4KKworLyogQ29uZGVuc2VkIG9wZXJhdGlvbnMgZm9yIHJlYWRhYmlsaXR5LiAqLworI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhhZGRyKSkKKyNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKSAgYnVzX3RvX3ZpcnQobGUzMl90b19jcHUoYWRkcikpCisjZGVmaW5lIGdldF91bmFsaWduZWQocHRyKSAoKihwdHIpKQorCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgY29tcGlsZSBlZmZpY2llbmN5LiAgICAgICAgICAgKi8KKy8qIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4gICAgICAgICovCisvKiBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxhcmdlIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsICAqLworLyogYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRYX1JJTkdfU0laRSAyCisjZGVmaW5lIFRYX1FVRVVFX0xFTiAxMCAvKiBMaW1pdCByaW5nIGVudHJpZXMgYWN0dWFsbHkgdXNlZC4gICovCisjZGVmaW5lIFJYX1JJTkdfU0laRSA0CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgSFogMTAwCisjZGVmaW5lIFRYX1RJTUVfT1VUICAgKDYqSFopCisKKy8qIEFsbG9jYXRpb24gc2l6ZSBvZiBSeCBidWZmZXJzIHdpdGggbm9ybWFsIHNpemVkIEV0aGVybmV0IGZyYW1lcy4KKyAgIERvIG5vdCBjaGFuZ2UgdGhpcyB2YWx1ZSB3aXRob3V0IGdvb2QgcmVhc29uLiAgVGhpcyBpcyBub3QgYSBsaW1pdCwKKyAgIGJ1dCBhIHdheSB0byBrZWVwIGEgY29uc2lzdGVudCBhbGxvY2F0aW9uIHNpemUgYW1vbmcgZHJpdmVycy4KKyAqLworI2RlZmluZSBQS1RfQlVGX1NaIDE1MzYKKworLyogZm9yIGRpZmZlcmVudCBQSFkgKi8KK2VudW0gcGh5X3R5cGVfZmxhZ3MgeworICAgIE15c29uUEhZID0gMSwKKyAgICBBaGRvY1BIWSA9IDIsCisgICAgU2VlcVBIWSA9IDMsCisgICAgTWFydmVsbFBIWSA9IDQsCisgICAgTXlzb245ODEgPSA1LAorICAgIExldmVsT25lUEhZID0gNiwKKyAgICBPdGhlclBIWSA9IDEwLAorfTsKKworLyogQSBjaGlwIGNhcGFiaWxpdGllcyB0YWJsZSovCitlbnVtIGNoaXBfY2FwYWJpbGl0eV9mbGFncyB7CisgICAgSEFTX01JSV9YQ1ZSLAorICAgIEhBU19DSElQX1hDVlIsCit9OworCisjaWYgMCAvKiBub3QgdXNlZCAqLworc3RhdGljCitzdHJ1Y3QgY2hpcF9pbmZvCit7CisgICAgdTE2IGRldl9pZDsKKyAgICBpbnQgZmxhZzsKK30KK210ZDgweF9jaGlwc1tdID0geworICAgICAgICAgICAgICAgICAgICAgezB4MDgwMCwgSEFTX01JSV9YQ1ZSfSwKKyAgICAgICAgICAgICAgICAgICAgIHsweDA4MDMsIEhBU19DSElQX1hDVlJ9LAorICAgICAgICAgICAgICAgICAgICAgezB4MDg5MSwgSEFTX01JSV9YQ1ZSfQorICAgICAgICAgICAgICAgICB9Oworc3RhdGljIGludCBjaGlwX2NudCA9IHNpemVvZiggbXRkODB4X2NoaXBzICkgLyBzaXplb2YoIHN0cnVjdCBjaGlwX2luZm8gKTsKKyNlbmRpZgorCisvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLiAqLworZW51bSBtdGRfb2Zmc2V0cyB7CisgICAgUEFSMCA9IDB4MCwgICAgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgMC0zICovCisgICAgUEFSMSA9IDB4MDQsICAgICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzIDQtNSAqLworICAgIE1BUjAgPSAweDA4LCAgICAgICAgLyogbXVsdGljYXN0IGFkZHJlc3MgMC0zICovCisgICAgTUFSMSA9IDB4MEMsICAgICAgICAvKiBtdWx0aWNhc3QgYWRkcmVzcyA0LTcgKi8KKyAgICBGQVIwID0gMHgxMCwgICAgICAgIC8qIGZsb3ctY29udHJvbCBhZGRyZXNzIDAtMyAqLworICAgIEZBUjEgPSAweDE0LCAgICAgICAgLyogZmxvdy1jb250cm9sIGFkZHJlc3MgNC01ICovCisgICAgVENSUkNSID0gMHgxOCwgICAgICAgIC8qIHJlY2VpdmUgJiB0cmFuc21pdCBjb25maWd1cmF0aW9uICovCisgICAgQkNSID0gMHgxQywgICAgICAgIC8qIGJ1cyBjb21tYW5kICovCisgICAgVFhQRFIgPSAweDIwLCAgICAgICAgLyogdHJhbnNtaXQgcG9sbGluZyBkZW1hbmQgKi8KKyAgICBSWFBEUiA9IDB4MjQsICAgICAgICAvKiByZWNlaXZlIHBvbGxpbmcgZGVtYW5kICovCisgICAgUlhDV1AgPSAweDI4LCAgICAgICAgLyogcmVjZWl2ZSBjdXJyZW50IHdvcmQgcG9pbnRlciAqLworICAgIFRYTEJBID0gMHgyQywgICAgICAgIC8qIHRyYW5zbWl0IGxpc3QgYmFzZSBhZGRyZXNzICovCisgICAgUlhMQkEgPSAweDMwLCAgICAgICAgLyogcmVjZWl2ZSBsaXN0IGJhc2UgYWRkcmVzcyAqLworICAgIElTUiA9IDB4MzQsICAgICAgICAvKiBpbnRlcnJ1cHQgc3RhdHVzICovCisgICAgSU1SID0gMHgzOCwgICAgICAgIC8qIGludGVycnVwdCBtYXNrICovCisgICAgRlRIID0gMHgzQywgICAgICAgIC8qIGZsb3cgY29udHJvbCBoaWdoL2xvdyB0aHJlc2hvbGQgKi8KKyAgICBNQU5BR0VNRU5UID0gMHg0MCwgICAgLyogYm9vdHJvbS9lZXByb20gYW5kIG1paSBtYW5hZ2VtZW50ICovCisgICAgVEFMTFkgPSAweDQ0LCAgICAgICAgLyogdGFsbHkgY291bnRlcnMgZm9yIGNyYyBhbmQgbXBhICovCisgICAgVFNSID0gMHg0OCwgICAgICAgIC8qIHRhbGx5IGNvdW50ZXIgZm9yIHRyYW5zbWl0IHN0YXR1cyAqLworICAgIEJNQ1JTUiA9IDB4NGMsICAgICAgICAvKiBiYXNpYyBtb2RlIGNvbnRyb2wgYW5kIHN0YXR1cyAqLworICAgIFBIWUlERU5USUZJRVIgPSAweDUwLCAgICAvKiBwaHkgaWRlbnRpZmllciAqLworICAgIEFOQVJBTkxQQVIgPSAweDU0LCAgICAvKiBhdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgYW5kIGxpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyIGFiaWxpdHkgKi8KKyAgICBBTkVST0NSID0gMHg1OCwgICAgICAgIC8qIGF1dG8tbmVnb3RpYXRpb24gZXhwYW5zaW9uIGFuZCBwY2kgY29uZi4gKi8KKyAgICBCUFJFTVJQU1IgPSAweDVjLCAgICAvKiBieXBhc3MgJiByZWNlaXZlIGVycm9yIG1hc2sgYW5kIHBoeSBzdGF0dXMgKi8KK307CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvZW5hYmxlIHJlZ2lzdGVycy4gKi8KKy8qIFRoZSBiaXRzIGluIHRoZSBJbnRyIFN0YXR1cy9FbmFibGUgcmVnaXN0ZXJzLCBtb3N0bHkgaW50ZXJydXB0IHNvdXJjZXMuICovCitlbnVtIGludHJfc3RhdHVzX2JpdHMgeworICAgIFJGQ09OID0gMHgwMDAyMDAwMCwgLyogcmVjZWl2ZSBmbG93IGNvbnRyb2wgeG9uIHBhY2tldCAqLworICAgIFJGQ09GRiA9IDB4MDAwMTAwMDAsIC8qIHJlY2VpdmUgZmxvdyBjb250cm9sIHhvZmYgcGFja2V0ICovCisgICAgTFNDU3RhdHVzID0gMHgwMDAwODAwMCwgLyogbGluayBzdGF0dXMgY2hhbmdlICovCisgICAgQU5DU3RhdHVzID0gMHgwMDAwNDAwMCwgLyogYXV0b25lZ290aWF0aW9uIGNvbXBsZXRlZCAqLworICAgIEZCRSA9IDB4MDAwMDIwMDAsIC8qIGZhdGFsIGJ1cyBlcnJvciAqLworICAgIEZCRU1hc2sgPSAweDAwMDAxODAwLCAvKiBtYXNrIGJpdDEyLTExICovCisgICAgUGFyaXR5RXJyID0gMHgwMDAwMDAwMCwgLyogcGFyaXR5IGVycm9yICovCisgICAgVGFyZ2V0RXJyID0gMHgwMDAwMTAwMCwgLyogdGFyZ2V0IGFib3J0ICovCisgICAgTWFzdGVyRXJyID0gMHgwMDAwMDgwMCwgLyogbWFzdGVyIGVycm9yICovCisgICAgVFVORiA9IDB4MDAwMDA0MDAsIC8qIHRyYW5zbWl0IHVuZGVyZmxvdyAqLworICAgIFJPVkYgPSAweDAwMDAwMjAwLCAvKiByZWNlaXZlIG92ZXJmbG93ICovCisgICAgRVRJID0gMHgwMDAwMDEwMCwgLyogdHJhbnNtaXQgZWFybHkgaW50ICovCisgICAgRVJJID0gMHgwMDAwMDA4MCwgLyogcmVjZWl2ZSBlYXJseSBpbnQgKi8KKyAgICBDTlRPVkYgPSAweDAwMDAwMDQwLCAvKiBjb3VudGVyIG92ZXJmbG93ICovCisgICAgUkJVID0gMHgwMDAwMDAyMCwgLyogcmVjZWl2ZSBidWZmZXIgdW5hdmFpbGFibGUgKi8KKyAgICBUQlUgPSAweDAwMDAwMDEwLCAvKiB0cmFuc21pdCBidWZmZXIgdW5hdmlsYWJsZSAqLworICAgIFRJID0gMHgwMDAwMDAwOCwgLyogdHJhbnNtaXQgaW50ZXJydXB0ICovCisgICAgUkkgPSAweDAwMDAwMDA0LCAvKiByZWNlaXZlIGludGVycnVwdCAqLworICAgIFJ4RXJyID0gMHgwMDAwMDAwMiwgLyogcmVjZWl2ZSBlcnJvciAqLworfTsKKworLyogQml0cyBpbiB0aGUgTmV0d29ya0NvbmZpZyByZWdpc3Rlci4gKi8KK2VudW0gcnhfbW9kZV9iaXRzIHsKKyAgICBSeE1vZGVNYXNrICAgPSAweGUwLAorICAgIEFjY2VwdEFsbFBoeXMgPSAweDgwLCAgICAgICAgLyogcHJvbWlzY3VvdXMgbW9kZSAqLworICAgIEFjY2VwdEJyb2FkY2FzdCA9IDB4NDAsICAgICAgICAvKiBhY2NlcHQgYnJvYWRjYXN0ICovCisgICAgQWNjZXB0TXVsdGljYXN0ID0gMHgyMCwgICAgICAgIC8qIGFjY2VwdCBtdXRsaWNhc3QgKi8KKyAgICBBY2NlcHRSdW50ICAgPSAweDA4LCAgICAgICAgLyogcmVjZWl2ZSBydW50IHBrdCAqLworICAgIEFMUCAgICAgICAgICA9IDB4MDQsICAgICAgICAvKiByZWNlaXZlIGxvbmcgcGt0ICovCisgICAgQWNjZXB0RXJyICAgID0gMHgwMiwgICAgICAgIC8qIHJlY2VpdmUgZXJyb3IgcGt0ICovCisKKyAgICBBY2NlcHRNeVBoeXMgPSAweDAwMDAwMDAwLAorICAgIFJ4RW5hYmxlICAgICA9IDB4MDAwMDAwMDEsCisgICAgUnhGbG93Q3RybCAgID0gMHgwMDAwMjAwMCwKKyAgICBUeEVuYWJsZSAgICAgPSAweDAwMDQwMDAwLAorICAgIFR4TW9kZUZEWCAgICA9IDB4MDAxMDAwMDAsCisgICAgVHhUaHJlc2hvbGQgID0gMHgwMGUwMDAwMCwKKworICAgIFBTMTAwMCAgICAgICA9IDB4MDAwMTAwMDAsCisgICAgUFMxMCAgICAgICAgID0gMHgwMDA4MDAwMCwKKyAgICBGRCAgICAgICAgICAgPSAweDAwMTAwMDAwLAorfTsKKworLyogQml0cyBpbiBuZXR3b3JrX2Rlc2Muc3RhdHVzICovCitlbnVtIHJ4X2Rlc2Nfc3RhdHVzX2JpdHMgeworICAgIFJYT1dOID0gMHg4MDAwMDAwMCwgLyogb3duIGJpdCAqLworICAgIEZMTkdNQVNLID0gMHgwZmZmMDAwMCwgLyogZnJhbWUgbGVuZ3RoICovCisgICAgRkxOR1NoaWZ0ID0gMTYsCisgICAgTUFSU1RBVFVTID0gMHgwMDAwNDAwMCwgLyogbXVsdGljYXN0IGFkZHJlc3MgcmVjZWl2ZWQgKi8KKyAgICBCQVJTVEFUVVMgPSAweDAwMDAyMDAwLCAvKiBicm9hZGNhc3QgYWRkcmVzcyByZWNlaXZlZCAqLworICAgIFBIWVNUQVRVUyA9IDB4MDAwMDEwMDAsIC8qIHBoeXNpY2FsIGFkZHJlc3MgcmVjZWl2ZWQgKi8KKyAgICBSWEZTRCA9IDB4MDAwMDA4MDAsIC8qIGZpcnN0IGRlc2NyaXB0b3IgKi8KKyAgICBSWExTRCA9IDB4MDAwMDA0MDAsIC8qIGxhc3QgZGVzY3JpcHRvciAqLworICAgIEVycm9yU3VtbWFyeSA9IDB4ODAsIC8qIGVycm9yIHN1bW1hcnkgKi8KKyAgICBSVU5UID0gMHg0MCwgIC8qIHJ1bnQgcGFja2V0IHJlY2VpdmVkICovCisgICAgTE9ORyA9IDB4MjAsICAvKiBsb25nIHBhY2tldCByZWNlaXZlZCAqLworICAgIEZBRSA9IDB4MTAsICAvKiBmcmFtZSBhbGlnbiBlcnJvciAqLworICAgIENSQyA9IDB4MDgsICAvKiBjcmMgZXJyb3IgKi8KKyAgICBSWEVSID0gMHgwNCwgIC8qIHJlY2VpdmUgZXJyb3IgKi8KK307CisKK2VudW0gcnhfZGVzY19jb250cm9sX2JpdHMgeworICAgIFJYSUMgPSAweDAwODAwMDAwLCAvKiBpbnRlcnJ1cHQgY29udHJvbCAqLworICAgIFJCU1NoaWZ0ID0gMCwKK307CisKK2VudW0gdHhfZGVzY19zdGF0dXNfYml0cyB7CisgICAgVFhPV04gPSAweDgwMDAwMDAwLCAvKiBvd24gYml0ICovCisgICAgSkFCVE8gPSAweDAwMDA0MDAwLCAvKiBqYWJiZXIgdGltZW91dCAqLworICAgIENTTCA9IDB4MDAwMDIwMDAsIC8qIGNhcnJpZXIgc2Vuc2UgbG9zdCAqLworICAgIExDID0gMHgwMDAwMTAwMCwgLyogbGF0ZSBjb2xsaXNpb24gKi8KKyAgICBFQyA9IDB4MDAwMDA4MDAsIC8qIGV4Y2Vzc2l2ZSBjb2xsaXNpb24gKi8KKyAgICBVREYgPSAweDAwMDAwNDAwLCAvKiBmaWZvIHVuZGVyZmxvdyAqLworICAgIERGUiA9IDB4MDAwMDAyMDAsIC8qIGRlZmVycmVkICovCisgICAgSEYgPSAweDAwMDAwMTAwLCAvKiBoZWFydGJlYXQgZmFpbCAqLworICAgIE5DUk1hc2sgPSAweDAwMDAwMGZmLCAvKiBjb2xsaXNpb24gcmV0cnkgY291bnQgKi8KKyAgICBOQ1JTaGlmdCA9IDAsCit9OworCitlbnVtIHR4X2Rlc2NfY29udHJvbF9iaXRzIHsKKyAgICBUWElDID0gMHg4MDAwMDAwMCwgLyogaW50ZXJydXB0IGNvbnRyb2wgKi8KKyAgICBFVElDb250cm9sID0gMHg0MDAwMDAwMCwgLyogZWFybHkgdHJhbnNtaXQgaW50ZXJydXB0ICovCisgICAgVFhMRCA9IDB4MjAwMDAwMDAsIC8qIGxhc3QgZGVzY3JpcHRvciAqLworICAgIFRYRkQgPSAweDEwMDAwMDAwLCAvKiBmaXJzdCBkZXNjcmlwdG9yICovCisgICAgQ1JDRW5hYmxlID0gMHgwODAwMDAwMCwgLyogY3JjIGNvbnRyb2wgKi8KKyAgICBQQURFbmFibGUgPSAweDA0MDAwMDAwLCAvKiBwYWRkaW5nIGNvbnRyb2wgKi8KKyAgICBSZXRyeVR4TEMgPSAweDAyMDAwMDAwLCAvKiByZXRyeSBsYXRlIGNvbGxpc2lvbiAqLworICAgIFBLVFNNYXNrID0gMHgzZmY4MDAsIC8qIHBhY2tldCBzaXplIGJpdDIxLTExICovCisgICAgUEtUU1NoaWZ0ID0gMTEsCisgICAgVEJTTWFzayA9IDB4MDAwMDA3ZmYsIC8qIHRyYW5zbWl0IGJ1ZmZlciBiaXQgMTAtMCAqLworICAgIFRCU1NoaWZ0ID0gMCwKK307CisKKy8qIEJvb3RST00vRUVQUk9NL01JSSBNYW5hZ2VtZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfUkVBRCAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfV1JJVEUgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfTURPICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfTURJICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfTURDICAgICAgICAweDAwMDAwMDAxCisKKy8qIFNUK09QK1BIWUFEK1JFR0FEK1RBICovCisjZGVmaW5lIE9QX1JFQUQgICAgICAgICAgICAgMHg2MDAwIC8qIFNUOjAxK09QOjEwK1BIWUFEK1JFR0FEK1RBOlowICovCisjZGVmaW5lIE9QX1dSSVRFICAgICAgICAgICAgMHg1MDAyIC8qIFNUOjAxK09QOjAxK1BIWUFEK1JFR0FEK1RBOjEwICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQ29uc3RhbnRzIGZvciBNeXNvbiBQSFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgTXlzb25QSFlJRCAgICAgIDB4ZDAwMDAzMDIKKy8qIDg5LTctMjcgYWRkLCAoYmVnaW4pICovCisjZGVmaW5lIE15c29uUEhZSUQwICAgICAweDAzMDIKKyNkZWZpbmUgU3RhdHVzUmVnaXN0ZXIgIDE4CisjZGVmaW5lIFNQRUVEMTAwICAgICAgICAweDA0MDAgLy8gYml0MTAKKyNkZWZpbmUgRlVMTE1PREUgICAgICAgIDB4MDgwMCAvLyBiaXQxMQorLyogODktNy0yNyBhZGQsIChlbmQpICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQ29uc3RhbnRzIGZvciBTZWVxIDgwMjI1IFBIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgU2VlcVBIWUlEMCAgICAgIDB4MDAxNgorCisjZGVmaW5lIE1JSVJlZ2lzdGVyMTggICAxOAorI2RlZmluZSBTUERfREVUXzEwMCAgICAgMHg4MAorI2RlZmluZSBEUExYX0RFVF9GVUxMICAgMHg0MAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIENvbnN0YW50cyBmb3IgQWhkb2MgMTAxIFBIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEFoZG9jUEhZSUQwICAgICAweDAwMjIKKworI2RlZmluZSBEaWFnbm9zdGljUmVnICAgMTgKKyNkZWZpbmUgRFBMWF9GVUxMICAgICAgIDB4MDgwMAorI2RlZmluZSBTcGVlZF8xMDAgICAgICAgMHgwNDAwCisKKy8qIDg5LzYvMTMgYWRkLCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQ29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBNYXJ2ZWxsUEhZSUQwICAgICAgICAgICAweDAxNDEKKyNkZWZpbmUgTGV2ZWxPbmVQSFlJRDAgIDB4MDAxMworCisjZGVmaW5lIE1JSTEwMDBCYXNlVENvbnRyb2xSZWcgIDkKKyNkZWZpbmUgTUlJMTAwMEJhc2VUU3RhdHVzUmVnICAgMTAKKyNkZWZpbmUgU3BlY2lmaWNSZWcgIDE3CisKKy8qIGZvciAxMDAwQmFzZVQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlBYmxldG9QZXJmb3JtMTAwMEZ1bGxEdXBsZXggIDB4MDIwMAorI2RlZmluZSBQSFlBYmxldG9QZXJmb3JtMTAwMEhhbGZEdXBsZXggIDB4MDEwMAorI2RlZmluZSBQSFkxMDAwQWJpbGl0eU1hc2sgICAgICAgICAgICAgIDB4MzAwCisKKy8vIGZvciBwaHkgc3BlY2lmaWMgc3RhdHVzIHJlZ2lzdGVyLCBtYXJ2ZWxsIHBoeS4KKyNkZWZpbmUgU3BlZWRNYXNrICAgICAgIDB4MGMwMDAKKyNkZWZpbmUgU3BlZWRfMTAwME0gICAgIDB4MDgwMDAKKyNkZWZpbmUgU3BlZWRfMTAwTSAgICAgIDB4NDAwMAorI2RlZmluZSBTcGVlZF8xME0gICAgICAgMAorI2RlZmluZSBGdWxsX0R1cGxleCAgICAgMHgyMDAwCisKKy8vIDg5LzEyLzI5IGFkZCwgZm9yIHBoeSBzcGVjaWZpYyBzdGF0dXMgcmVnaXN0ZXIsIGxldmVsb25lIHBoeSwgKGJlZ2luKQorI2RlZmluZSBMWFQxMDAwXzEwME0gICAgMHgwODAwMAorI2RlZmluZSBMWFQxMDAwXzEwMDBNICAgMHgwYzAwMAorI2RlZmluZSBMWFQxMDAwX0Z1bGwgICAgMHgyMDAKKy8vIDg5LzEyLzI5IGFkZCwgZm9yIHBoeSBzcGVjaWZpYyBzdGF0dXMgcmVnaXN0ZXIsIGxldmVsb25lIHBoeSwgKGVuZCkKKworI2lmIDAKKy8qIGZvciAzLWluLTEgY2FzZSAqLworI2RlZmluZSBQUzEwICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBGRCAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBQUzEwMDAgICAgICAgICAgMHgwMDAxMDAwMAorI2VuZGlmCisKKy8qIGZvciBQSFkgKi8KKyNkZWZpbmUgTGlua0lzVXAgICAgICAgIDB4MDAwNAorI2RlZmluZSBMaW5rSXNVcDIgMHgwMDA0MDAwMAorCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUEtUX0JVRl9TWiBmb3IgZWFjaAorUlggYW5kIFRYIERlc2NyaXB0b3IuICBBbGwgZGVzY3JpcHRvcnMgcG9pbnQgdG8gYQorcGFydCBvZiB0aGlzIGJ1ZmZlciAqLworc3RydWN0IHsKKwl1OCB0eGJbUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKKwl1OCByeGJbUEtUX0JVRl9TWiAqIFJYX1JJTkdfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKK30gbXRkODB4X2J1ZnMgX19zaGFyZWQ7CisjZGVmaW5lIHR4YiBtdGQ4MHhfYnVmcy50eGIKKyNkZWZpbmUgcnhiIG10ZDgweF9idWZzLnJ4YgorCisvKiBUaGUgVHVsaXAgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCBtdGRfZGVzYworeworICAgIHMzMiBzdGF0dXM7CisgICAgczMyIGNvbnRyb2w7CisgICAgdTMyIGJ1ZmZlcjsKKyAgICB1MzIgbmV4dF9kZXNjOworICAgIHN0cnVjdCBtdGRfZGVzYyAqbmV4dF9kZXNjX2xvZ2ljYWw7CisgICAgdTgqIHNrYnVmZjsKKyAgICB1MzIgcmVzZXJ2ZWQxOworICAgIHUzMiByZXNlcnZlZDI7Cit9OworCitzdHJ1Y3QgbXRkX3ByaXZhdGUKK3sKKyAgICBzdHJ1Y3QgbXRkX2Rlc2MgcnhfcmluZ1tSWF9SSU5HX1NJWkVdOworICAgIHN0cnVjdCBtdGRfZGVzYyB0eF9yaW5nW1RYX1JJTkdfU0laRV07CisKKyAgICAvKiBGcmVxdWVudGx5IHVzZWQgdmFsdWVzOiBrZWVwIHNvbWUgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdC4gKi8KKyAgICBpbnQgZmxhZ3M7CisgICAgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisgICAgdW5zaWduZWQgbG9uZyBjcnZhbHVlOworICAgIHVuc2lnbmVkIGxvbmcgYmNydmFsdWU7CisgICAgLyp1bnNpZ25lZCBsb25nIGltcnZhbHVlOyovCisgICAgc3RydWN0IG10ZF9kZXNjICpjdXJfcng7CisgICAgc3RydWN0IG10ZF9kZXNjICpsYWNrX3J4YnVmOworICAgIGludCByZWFsbHlfcnhfY291bnQ7CisgICAgc3RydWN0IG10ZF9kZXNjICpjdXJfdHg7CisgICAgc3RydWN0IG10ZF9kZXNjICpjdXJfdHhfY29weTsKKyAgICBpbnQgcmVhbGx5X3R4X2NvdW50OworICAgIGludCBmcmVlX3R4X2NvdW50OworICAgIHVuc2lnbmVkIGludCByeF9idWZfc3o7IC8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKworICAgIC8qIFRoZXNlIHZhbHVlcyBhcmUga2VlcCB0cmFjayBvZiB0aGUgdHJhbnNjZWl2ZXIvbWVkaWEgaW4gdXNlLiAqLworICAgIHVuc2lnbmVkIGludCBsaW5rb2s7CisgICAgdW5zaWduZWQgaW50IGxpbmVfc3BlZWQ7CisgICAgdW5zaWduZWQgaW50IGR1cGxleG1vZGU7CisgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDoKKyAgICA0OyAvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKyAgICB1bnNpZ25lZCBpbnQgUEhZVHlwZTsKKworICAgIC8qIE1JSSB0cmFuc2NlaXZlciBzZWN0aW9uLiAqLworICAgIGludCBtaWlfY250OyAgLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisgICAgdW5zaWduZWQgY2hhciBwaHlzWzFdOyAvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKworICAgIC8qb3RoZXIqLworICAgIGNvbnN0IGNoYXIgKm5pY19uYW1lOworICAgIGludCBpb2FkZHI7CisgICAgdTE2IGRldl9pZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3ByaXZhdGUgbXRkeDsKKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5pYyAqICwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIGdldGxpbmt0eXBlKHN0cnVjdCBuaWMgKiApOworc3RhdGljIHZvaWQgZ2V0bGlua3N0YXR1cyhzdHJ1Y3QgbmljICogKTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuaWMgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGluaXRfcmluZyAtIHNldHVwIHRoZSB0eCBhbmQgcnggZGVzY3JpcHRvcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKyAgICBpbnQgaTsKKworICAgIG10ZHguY3VyX3J4ID0gJm10ZHgucnhfcmluZ1swXTsKKworICAgIG10ZHgucnhfYnVmX3N6ID0gUEtUX0JVRl9TWjsKKyAgICAvKm10ZHgucnhfaGVhZF9kZXNjID0gJm10ZHgucnhfcmluZ1swXTsqLworCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgUnggZGVzY3JpcHRvcnMuICovCisgICAgLyogRmlsbCBpbiB0aGUgUnggYnVmZmVycy4gIEhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmUgZ3JhY2VmdWxseS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisgICAgeworICAgICAgICBtdGR4LnJ4X3JpbmdbaV0uc3RhdHVzID0gUlhPV047CisgICAgICAgIG10ZHgucnhfcmluZ1tpXS5jb250cm9sID0gbXRkeC5yeF9idWZfc3ogPDwgUkJTU2hpZnQ7CisgICAgICAgIG10ZHgucnhfcmluZ1tpXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZtdGR4LnJ4X3JpbmdbaSsxXSk7CisgICAgICAgIG10ZHgucnhfcmluZ1tpXS5uZXh0X2Rlc2NfbG9naWNhbCA9ICZtdGR4LnJ4X3JpbmdbaSsxXTsKKyAgICAgICAgbXRkeC5yeF9yaW5nW2ldLmJ1ZmZlciA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4YltpICogUEtUX0JVRl9TWl0pOworICAgICAgICBtdGR4LnJ4X3JpbmdbaV0uc2tidWZmID0gJnJ4YltpICogUEtUX0JVRl9TWl07CisgICAgfQorICAgIC8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCisgICAgbXRkeC5yeF9yaW5nW2ktMV0ubmV4dF9kZXNjID0gdmlydF90b19sZTMyZGVzYygmbXRkeC5yeF9yaW5nWzBdKTsKKyAgICBtdGR4LnJ4X3JpbmdbaS0xXS5uZXh0X2Rlc2NfbG9naWNhbCA9ICZtdGR4LnJ4X3JpbmdbMF07CisKKyAgICAvKiBXZSBvbmx5IHVzZSBvbmUgdHJhbnNtaXQgYnVmZmVyLCBidXQgdHdvCisgICAgICogZGVzY3JpcHRvcnMgc28gdHJhbnNtaXQgZW5naW5lcyBoYXZlIHNvbWV3aGVyZQorICAgICAqIHRvIHBvaW50IHNob3VsZCB0aGV5IGZlZWwgdGhlIG5lZWQgKi8KKyAgICBtdGR4LnR4X3JpbmdbMF0uc3RhdHVzID0gMHgwMDAwMDAwMDsKKyAgICBtdGR4LnR4X3JpbmdbMF0uYnVmZmVyID0gdmlydF90b19idXMoJnR4YlswXSk7CisgICAgbXRkeC50eF9yaW5nWzBdLm5leHRfZGVzYyA9IHZpcnRfdG9fbGUzMmRlc2MoJm10ZHgudHhfcmluZ1sxXSk7CisKKyAgICAvKiBUaGlzIGRlc2NyaXB0b3IgaXMgbmV2ZXIgdXNlZCAqLworICAgIG10ZHgudHhfcmluZ1sxXS5zdGF0dXMgPSAweDAwMDAwMDAwOworICAgIG10ZHgudHhfcmluZ1sxXS5idWZmZXIgPSAwOyAvKnZpcnRfdG9fYnVzKCZ0eGJbMV0pOyAqLworICAgIG10ZHgudHhfcmluZ1sxXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZtdGR4LnR4X3JpbmdbMF0pOworCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFU0VUIC0gUmVzZXQgQWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXRkX3Jlc2V0KCBzdHJ1Y3QgbmljICpuaWMgKQoreworICAgIC8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisgICAgb3V0bCgweDAwMDAwMDAxLCBtdGR4LmlvYWRkciArIEJDUik7CisKKyAgICBpbml0X3JpbmcobmljKTsKKworICAgIG91dGwodmlydF90b19idXMobXRkeC5yeF9yaW5nKSwgbXRkeC5pb2FkZHIgKyBSWExCQSk7CisgICAgb3V0bCh2aXJ0X3RvX2J1cyhtdGR4LnR4X3JpbmcpLCBtdGR4LmlvYWRkciArIFRYTEJBKTsKKworICAgIC8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLworICAgIC8qIENvbmZpZ3VyZSB0aGUgUENJIGJ1cyBidXJzdHMgYW5kIEZJRk8gdGhyZXNob2xkcy4gKi8KKyAgICBtdGR4LmJjcnZhbHVlID0gMHgxMDsgLyogbGl0dGxlLWVuZGlhbiwgOCBidXJzdCBsZW5ndGggKi8KKyAgICBtdGR4LmNydmFsdWUgPSAweGEwMDsgLyogcnggMTI4IGJ1cnN0IGxlbmd0aCAqLworCisJaWYgKCBtdGR4LmRldl9pZCA9PSAweDg5MSApIHsKKwkJbXRkeC5iY3J2YWx1ZSB8PSAweDIwMDsJLyogc2V0IFBST0cgYml0ICovCisJCW10ZHguY3J2YWx1ZSB8PSAweDAyMDAwMDAwOwkvKiBzZXQgZW5oYW5jZWQgYml0ICovCisJfQorCisgICAgb3V0bCggbXRkeC5iY3J2YWx1ZSwgbXRkeC5pb2FkZHIgKyBCQ1IpOworCisgICAgLyogUmVzdGFydCBSeCBlbmdpbmUgaWYgc3RvcHBlZC4gKi8KKyAgICBvdXRsKDAsIG10ZHguaW9hZGRyICsgUlhQRFIpOworCisgICAgZ2V0bGlua3N0YXR1cyhuaWMpOworICAgIGlmIChtdGR4LmxpbmtvaykKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0ZXh0c1tdPXsiaGFsZiIsImZ1bGwiLCIxMCIsIjEwMCIsIjEwMDAifTsKKyAgICAgICAgZ2V0bGlua3R5cGUobmljKTsKKyAgICAgICAgREJHICggIkxpbmsgaXMgT0sgOiAlcyAlc1xuIiwgdGV4dHNbbXRkeC5kdXBsZXhtb2RlLTFdLCB0ZXh0c1ttdGR4LmxpbmVfc3BlZWQrMV0gKTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIERCRyAoICJObyBsaW5rISEhXG4iICk7CisgICAgfQorCisgICAgbXRkeC5jcnZhbHVlIHw9IC8qVHhFbmFibGUgfCovIFJ4RW5hYmxlIHwgVHhUaHJlc2hvbGQ7CisgICAgc2V0X3J4X21vZGUobmljKTsKKworICAgIC8qIENsZWFyIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisgICAgb3V0bChGQkUgfCBUVU5GIHwgQ05UT1ZGIHwgUkJVIHwgVEkgfCBSSSwgbXRkeC5pb2FkZHIgKyBJU1IpOworICAgIG91dGwoIDAsIG10ZHguaW9hZGRyICsgSU1SKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtdGRfcG9sbChzdHJ1Y3QgbmljICpuaWMsIF9fdW51c2VkIGludCByZXRyaWV2ZSkKK3sKKyAgICBzMzIgcnhfc3RhdHVzID0gbXRkeC5jdXJfcngtPnN0YXR1czsKKyAgICBpbnQgcmV0dmFsID0gMDsKKworICAgIGlmKCAoIHJ4X3N0YXR1cyAmIFJYT1dOICkgIT0gMCApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAocnhfc3RhdHVzICYgRXJyb3JTdW1tYXJ5KQorICAgIHsgLyogdGhlcmUgd2FzIGEgZmF0YWwgZXJyb3IgKi8KKyAgICAgICAgcHJpbnRmKCAiJXM6IFJlY2VpdmUgZXJyb3IsIFJ4IHN0YXR1cyAlOC44eCwgRXJyb3IocykgJXMlcyVzXG4iLAorICAgICAgICAgICAgICAgIG10ZHgubmljX25hbWUsICh1bnNpZ25lZCBpbnQpIHJ4X3N0YXR1cywKKyAgICAgICAgICAgICAgICAocnhfc3RhdHVzICYgKExPTkcgfCBSVU5UKSkgPyAibGVuZ3RoX2Vycm9yICI6IiIsCisgICAgICAgICAgICAgICAgKHJ4X3N0YXR1cyAmIFJYRVIpID8gImZyYW1lX2Vycm9yICI6IiIsCisgICAgICAgICAgICAgICAgKHJ4X3N0YXR1cyAmIENSQykgPyAiY3JjX2Vycm9yICI6IiIgKTsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9IGVsc2UgaWYoICEoKHJ4X3N0YXR1cyAmIFJYRlNEKSAmJiAocnhfc3RhdHVzICYgUlhMU0QpKSApCisgICAgeworICAgICAgICAvKiB0aGlzIHBrdCBpcyB0b28gbG9uZywgb3ZlciBvbmUgcnggYnVmZmVyICovCisgICAgICAgIHByaW50ZigiUGt0IGlzIHRvbyBsb25nLCBvdmVyIG9uZSByeCBidWZmZXIuXG4iKTsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9IGVsc2UKKyAgICB7IC8qIHRoaXMgcmVjZWl2ZWQgcGt0IGlzIG9rICovCisgICAgICAgIC8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KKyAgICAgICAgc2hvcnQgcGt0X2xlbiA9ICgocnhfc3RhdHVzICYgRkxOR01BU0spID4+IEZMTkdTaGlmdCkgLSA0OworCisgICAgICAgIERCRyAoICIgbmV0ZGV2X3J4KCkgbm9ybWFsIFJ4IHBrdCBsZW5ndGggJWQiCisgCSAgICAgICIgc3RhdHVzICV4LlxuIiwgcGt0X2xlbiwgKHVuc2lnbmVkIGludCkgcnhfc3RhdHVzICk7CisKKyAgICAgICAgbmljLT5wYWNrZXRsZW4gPSBwa3RfbGVuOworICAgICAgICBtZW1jcHkobmljLT5wYWNrZXQsIG10ZHguY3VyX3J4LT5za2J1ZmYsIHBrdF9sZW4pOworCisgICAgICAgIHJldHZhbCA9IDE7CisgICAgfQorCisgICAgd2hpbGUoICggbXRkeC5jdXJfcngtPnN0YXR1cyAmIFJYT1dOICkgPT0gMCApCisgICAgeworICAgICAgICBtdGR4LmN1cl9yeC0+c3RhdHVzID0gUlhPV047CisgICAgICAgIG10ZHguY3VyX3J4ID0gbXRkeC5jdXJfcngtPm5leHRfZGVzY19sb2dpY2FsOworICAgIH0KKworICAgIC8qIFJlc3RhcnQgUnggZW5naW5lIGlmIHN0b3BwZWQuICovCisgICAgb3V0bCgwLCBtdGR4LmlvYWRkciArIFJYUERSKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtdGRfdHJhbnNtaXQoCisgICAgc3RydWN0IG5pYyAqbmljLAorICAgIGNvbnN0IGNoYXIgKmRlc3QsICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICB1bnNpZ25lZCBpbnQgdHlwZSwgICAgICAgICAgICAvKiBUeXBlICovCisgICAgdW5zaWduZWQgaW50IHNpemUsICAgICAgICAgICAgLyogc2l6ZSAqLworICAgIGNvbnN0IGNoYXIgKmRhdGEpICAgICAgICAgICAgLyogUGFja2V0ICovCit7CisgICAgdTMyIHRvOworICAgIHUzMiB0eF9zdGF0dXM7CisgICAgdW5zaWduZWQgaW50IG5zdHlwZSA9IGh0b25zICggdHlwZSApOworCisgICAgbWVtY3B5KCB0eGIsIGRlc3QsIEVUSF9BTEVOICk7CisgICAgbWVtY3B5KCB0eGIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOICk7CisgICAgbWVtY3B5KCB0eGIgKyAyICogRVRIX0FMRU4sICZuc3R5cGUsIDIgKTsKKyAgICBtZW1jcHkoIHR4YiArIEVUSF9ITEVOLCBkYXRhLCBzaXplICk7CisKKyAgICBzaXplICs9IEVUSF9ITEVOOworICAgIHNpemUgJj0gMHgwRkZGOworICAgIHdoaWxlKCBzaXplIDwgRVRIX1pMRU4gKQorICAgIHsKKyAgICAgICAgdHhiW3NpemUrK10gPSAnXDAnOworICAgIH0KKworICAgIG10ZHgudHhfcmluZ1swXS5jb250cm9sID0gVFhMRCB8IFRYRkQgfCBDUkNFbmFibGUgfCBQQURFbmFibGU7CisgICAgbXRkeC50eF9yaW5nWzBdLmNvbnRyb2wgfD0gKHNpemUgPDwgUEtUU1NoaWZ0KTsgLyogcGt0IHNpemUgKi8KKyAgICBtdGR4LnR4X3JpbmdbMF0uY29udHJvbCB8PSAoc2l6ZSA8PCBUQlNTaGlmdCk7IC8qIGJ1ZmZlciBzaXplICovCisgICAgbXRkeC50eF9yaW5nWzBdLnN0YXR1cyA9IFRYT1dOOworCisgICAgLyogUG9pbnQgdG8gdHJhbnNtaXQgZGVzY3JpcHRvciAqLworICAgIG91dGwodmlydF90b19idXMobXRkeC50eF9yaW5nKSwgbXRkeC5pb2FkZHIgKyBUWExCQSk7CisgICAgLyogRW5hYmxlIFR4ICovCisgICAgb3V0bCggbXRkeC5jcnZhbHVlIHwgVHhFbmFibGUsIG10ZHguaW9hZGRyICsgVENSUkNSKTsKKyAgICAvKiBXYWtlIHRoZSBwb3RlbnRpYWxseS1pZGxlIHRyYW5zbWl0IGNoYW5uZWwuICovCisgICAgb3V0bCgwLCBtdGR4LmlvYWRkciArIFRYUERSKTsKKworICAgIHRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FX09VVDsKKyAgICB3aGlsZSgoIG10ZHgudHhfcmluZ1swXS5zdGF0dXMgJiBUWE9XTikgJiYgKGN1cnJ0aWNrcygpIDwgdG8pKTsKKworICAgIC8qIERpc2FibGUgVHggKi8KKyAgICBvdXRsKCBtdGR4LmNydmFsdWUgJiAoflR4RW5hYmxlKSwgbXRkeC5pb2FkZHIgKyBUQ1JSQ1IpOworCisgICAgdHhfc3RhdHVzID0gbXRkeC50eF9yaW5nWzBdLnN0YXR1czsKKyAgICBpZiAoY3VycnRpY2tzKCkgPj0gdG8peworICAgICAgICBEQkcgKCAiVFggVGltZSBPdXQiICk7CisgICAgfSBlbHNlIGlmKCB0eF9zdGF0dXMgJiAoQ1NMIHwgTEMgfCBFQyB8IFVERiB8IEhGKSl7CisgICAgICAgIHByaW50ZiggIlRyYW5zbWl0IGVycm9yOiAlOC44eCAlcyAlcyAlcyAlcyAlc1xuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSB0eF9zdGF0dXMsCisgICAgICAgICAgICAgICAgdHhfc3RhdHVzICYgRUMgPyAiYWJvcnQiIDogIiIsCisgICAgICAgICAgICAgICAgdHhfc3RhdHVzICYgQ1NMID8gImNhcnJpZXIiIDogIiIsCisgICAgICAgICAgICAgICAgdHhfc3RhdHVzICYgTEMgPyAibGF0ZSIgOiAiIiwKKyAgICAgICAgICAgICAgICB0eF9zdGF0dXMgJiBVREYgPyAiZmlmbyIgOiAiIiwKKyAgICAgICAgICAgICAgICB0eF9zdGF0dXMgJiBIRiA/ICJoZWFydGJlYXQiIDogIiIgKTsKKyAgICB9CisKKyAgICAvKmhleF9kdW1wKCB0eGIsIHNpemUgKTsqLworICAgIC8qcGF1c2UoKTsqLworCisgICAgREJHICggIlRSQU5TTUlUXG4iICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXRkX2Rpc2FibGUgKCBzdHJ1Y3QgbmljICpuaWMgKSB7CisKKyAgICAvKiBEaXNhYmxlIFR4IFJ4Ki8KKyAgICBvdXRsKCBtdGR4LmNydmFsdWUgJiAoflR4RW5hYmxlKSAmICh+UnhFbmFibGUpLCBtdGR4LmlvYWRkciArIFRDUlJDUiApOworCisgICAgLyogUmVzZXQgdGhlIGNoaXAgdG8gZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbi4gKi8KKyAgICBtdGRfcmVzZXQobmljKTsKKworICAgIERCRyAoICJESVNBQkxFXG4iICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgbXRkX29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QJPSBkdW1teV9jb25uZWN0LAorCS5wb2xsCQk9IG10ZF9wb2xsLAorCS50cmFuc21pdAk9IG10ZF90cmFuc21pdCwKKwkuaXJxCQk9IGR1bW15X2lycSwKKworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG10ZDgweF9uaWNzW10gPSB7CisgICAgICAgIFBDSV9ST00oMHgxNTE2LCAweDA4MDAsICJNVEQ4MDAiLCAiTXlzb24gTVREODAwIiwgMCksCisgICAgICAgIFBDSV9ST00oMHgxNTE2LCAweDA4MDMsICJNVEQ4MDMiLCAiU3VyZWNvbSBFUC0zMjBYIiwgMCksCisgICAgICAgIFBDSV9ST00oMHgxNTE2LCAweDA4OTEsICJNVEQ4OTEiLCAiTXlzb24gTVREODkxIiwgMCksCit9OworCitQQ0lfRFJJVkVSICggbXRkODB4X2RyaXZlciwgbXRkODB4X25pY3MsIFBDSV9OT19DTEFTUyApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG10ZF9wcm9iZSAoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKworICAgIGludCBpOworCisgICAgaWYgKHBjaS0+aW9hZGRyID09IDApCisJICAgIHJldHVybiAwOworCisgICAgYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworICAgIG5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHI7CisgICAgbmljLT5pcnFubyA9IDA7CisKKyAgICBtdGR4Lm5pY19uYW1lID0gcGNpLT5kcml2ZXJfbmFtZTsKKyAgICBtdGR4LmRldl9pZCA9IHBjaS0+ZGV2aWNlOworICAgIG10ZHguaW9hZGRyID0gbmljLT5pb2FkZHI7CisKKyAgICAvKiByZWFkIGV0aGVybmV0IGlkICovCisgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkKKyAgICB7CisgICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKG10ZHguaW9hZGRyICsgUEFSMCArIGkpOworICAgIH0KKworICAgIGlmIChtZW1jbXAobmljLT5ub2RlX2FkZHIsICJcMFwwXDBcMFwwXDAiLCA2KSA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgREJHICggIiVzOiBpb2FkZHIgJTQuNHggTUFDICVzXG4iLCBtdGR4Lm5pY19uYW1lLCBtdGR4LmlvYWRkciwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApICk7CisKKyAgICAvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLiAqLworICAgIG91dGwoMHgwMDAwMDAwMSwgbXRkeC5pb2FkZHIgKyBCQ1IpOworCisgICAgLyogZmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3ZycyAqLworCisgICAgaWYoIG10ZHguZGV2X2lkICE9IDB4ODAzICkKKyAgICB7CisgICAgICAgIGludCBwaHksIHBoeV9pZHggPSAwOworCisgICAgICAgIGZvciAocGh5ID0gMTsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IDE7IHBoeSsrKSB7CisgICAgICAgICAgICBpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChuaWMsIHBoeSwgMSk7CisKKyAgICAgICAgICAgIGlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAmJiBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworICAgICAgICAgICAgICAgIG10ZHgucGh5c1twaHlfaWR4XSA9IHBoeTsKKworICAgICAgICAgICAgICAgIERCRyAoICIlczogTUlJIFBIWSBmb3VuZCBhdCBhZGRyZXNzICVkLCBzdGF0dXMgIgorCQkgICAgICAiMHglNC40eC5cbiIsIG10ZHgubmljX25hbWUsIHBoeSwgbWlpX3N0YXR1cyApOworICAgICAgICAgICAgICAgIC8qIGdldCBwaHkgdHlwZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG1kaW9fcmVhZChuaWMsIG10ZHgucGh5c1twaHlfaWR4XSwgMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09IFNlZXFQSFlJRDApCisgICAgICAgICAgICAgICAgICAgICAgICBtdGR4LlBIWVR5cGUgPSBTZWVxUEhZOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYXRhID09IEFoZG9jUEhZSUQwKQorICAgICAgICAgICAgICAgICAgICAgICAgbXRkeC5QSFlUeXBlID0gQWhkb2NQSFk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgPT0gTWFydmVsbFBIWUlEMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG10ZHguUEhZVHlwZSA9IE1hcnZlbGxQSFk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgPT0gTXlzb25QSFlJRDApCisgICAgICAgICAgICAgICAgICAgICAgICBtdGR4LlBIWVR5cGUgPSBNeXNvbjk4MTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YSA9PSBMZXZlbE9uZVBIWUlEMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG10ZHguUEhZVHlwZSA9IExldmVsT25lUEhZOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBtdGR4LlBIWVR5cGUgPSBPdGhlclBIWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGh5X2lkeCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbXRkeC5taWlfY250ID0gcGh5X2lkeDsKKyAgICAgICAgaWYgKHBoeV9pZHggPT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCIlczogTUlJIFBIWSBub3QgZm91bmQgLS0gdGhpcyBkZXZpY2UgbWF5ICIKKyAgICAgICAgICAgICAgICAgICAibm90IG9wZXJhdGUgY29ycmVjdGx5LlxuIiwgbXRkeC5uaWNfbmFtZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtdGR4LnBoeXNbMF0gPSAzMjsKKyAgICAgICAgLyogZ2V0IHBoeSB0eXBlICovCisgICAgICAgIGlmIChpbmwobXRkeC5pb2FkZHIgKyBQSFlJREVOVElGSUVSKSA9PSBNeXNvblBIWUlEICkgeworICAgICAgICAgICAgbXRkeC5QSFlUeXBlID0gTXlzb25QSFk7CisgICAgICAgICAgICBEQkcgKCAiTXlzb25QSFlcbiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG10ZHguUEhZVHlwZSA9IE90aGVyUEhZOworICAgICAgICAgICAgREJHICggIk90aGVyUEhZXG4iICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnZXRsaW5rc3RhdHVzKG5pYyk7CisgICAgaWYoICFtdGR4LmxpbmtvayApCisgICAgeworICAgICAgICBwcmludGYoIk5vIGxpbmshISFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBtdGRfcmVzZXQoIG5pYyApOworCisgICAgLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisgICAgbmljLT5uaWNfb3AJPSAmbXRkX29wZXJhdGlvbnM7CisgICAgcmV0dXJuIDE7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworICAgIHUzMiBtY19maWx0ZXJbMl07ICAgICAgICAgICAgICAgICAgICAgICAvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKyAgICB1MzIgcnhfbW9kZTsKKworICAgIC8qIFRvbyBtYW55IHRvIG1hdGNoLCBvciBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisgICAgbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gfjA7CisgICAgcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKworICAgIG91dGwobWNfZmlsdGVyWzBdLCBtdGR4LmlvYWRkciArIE1BUjApOworICAgIG91dGwobWNfZmlsdGVyWzFdLCBtdGR4LmlvYWRkciArIE1BUjEpOworCisgICAgbXRkeC5jcnZhbHVlID0gKCBtdGR4LmNydmFsdWUgJiB+UnhNb2RlTWFzayApIHwgcnhfbW9kZTsKKyAgICBvdXRiKCBtdGR4LmNydmFsdWUsIG10ZHguaW9hZGRyICsgVENSUkNSKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbTgweF9yZWFkX3RpY2sodm9pZCkKKy8qIGZ1bmN0aW9uOiBSZWFkcyB0aGUgVGltZXIgdGljayBjb3VudCByZWdpc3RlciB3aGljaCBkZWNyZW1lbnRzIGJ5IDIgZnJvbSAgKi8KKy8qICAgICAgICAgICA2NTUzNiB0byAwIGV2ZXJ5IDEvMzYuNDE0IG9mIGEgc2Vjb25kLiBFYWNoIDIgZGVjcmVtZW50cyBvZiB0aGUgKi8KKy8qICAgICAgICAgICBjb3VudCByZXByZXNlbnRzIDgzOCBuc2VjJ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGlucHV0ICAgOiBub25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIG91dHB1dCAgOiBub25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICB1bnNpZ25lZCBjaGFyIHRtcDsKKyAgICBpbnQgdmFsdWU7CisKKyAgICBvdXRiKChjaGFyKSAweDA2LCAweDQzKTsgLy8gQ29tbWFuZCA4MjU0IHRvIGxhdGNoIFQwJ3MgY291bnQKKworICAgIC8vIG5vdyByZWFkIHRoZSBjb3VudC4KKyAgICB0bXAgPSAodW5zaWduZWQgY2hhcikgaW5iKDB4NDApOworICAgIHZhbHVlID0gKChpbnQpIHRtcCkgPDwgODsKKyAgICB0bXAgPSAodW5zaWduZWQgY2hhcikgaW5iKDB4NDApOworICAgIHZhbHVlIHw9ICgoKGludCkgdG1wKSAmIDB4ZmYpOworICAgIHJldHVybiAodmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBtODB4X2RlbGF5KHVuc2lnbmVkIGludCBpbnRlcnZhbCkKKy8qIGZ1bmN0aW9uOiB0byB3YWl0IGZvciBhIHNwZWNpZmllZCB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGlucHV0ICAgOiBpbnRlcnZhbCAuLi4gdGhlIHNwZWNpZmllZCB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIG91dHB1dCAgOiBub25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICB1bnNpZ25lZCBpbnQgaW50ZXJ2YWwxLCBpbnRlcnZhbDIsIGkgPSAwOworCisgICAgaW50ZXJ2YWwxID0gbTgweF9yZWFkX3RpY2soKTsgLy8gZ2V0IGluaXRpYWwgdmFsdWUKKyAgICBkbworICAgIHsKKyAgICAgICAgaW50ZXJ2YWwyID0gbTgweF9yZWFkX3RpY2soKTsKKyAgICAgICAgaWYgKGludGVydmFsMSA8IGludGVydmFsMikKKyAgICAgICAgICAgIGludGVydmFsMSArPSA2NTUzNjsKKyAgICAgICAgKytpOworICAgIH0gd2hpbGUgKCgoaW50ZXJ2YWwxIC0gaW50ZXJ2YWwyKSA8ICh1MTYpIGludGVydmFsKSAmJiAoaSA8IDY1NTM1KSk7Cit9CisKKworc3RhdGljIHUzMiBtODB4X3NlbmRfY21kX3RvX3BoeShsb25nIG1paXBvcnQsIGludCBvcGNvZGUsIGludCBwaHlhZCwgaW50IHJlZ2FkKQoreworICAgIHUzMiBtaWlyOworICAgIGludCBpOworICAgIHVuc2lnbmVkIGludCBtYXNrLCBkYXRhOworCisgICAgLyogZW5hYmxlIE1JSSBvdXRwdXQgKi8KKyAgICBtaWlyID0gKHUzMikgaW5sKG1paXBvcnQpOworICAgIG1paXIgJj0gMHhmZmZmZmZmMDsKKworICAgIG1paXIgfD0gTUFTS19NSUlSX01JSV9XUklURSArIE1BU0tfTUlJUl9NSUlfTURPOworCisgICAgLyogc2VuZCAzMiAxJ3MgcHJlYW1ibGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICAvKiBsb3cgTURDOyBNRE8gaXMgYWxyZWFkeSBoaWdoIChtaWlyKSAqLworICAgICAgICBtaWlyICY9IH5NQVNLX01JSVJfTUlJX01EQzsKKyAgICAgICAgb3V0bChtaWlyLCBtaWlwb3J0KTsKKworICAgICAgICAvKiBoaWdoIE1EQyAqLworICAgICAgICBtaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURDOworICAgICAgICBvdXRsKG1paXIsIG1paXBvcnQpOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBTVCtPUCtQSFlBRCtSRUdBRCtUQSAqLworICAgIGRhdGEgPSBvcGNvZGUgfCAocGh5YWQgPDwgNykgfCAocmVnYWQgPDwgMik7CisKKyAgICAvKiBzZW50IG91dCAqLworICAgIG1hc2sgPSAweDgwMDA7CisgICAgd2hpbGUgKG1hc2spIHsKKyAgICAgICAgLyogbG93IE1EQywgcHJlcGFyZSBNRE8gKi8KKyAgICAgICAgbWlpciAmPSB+KE1BU0tfTUlJUl9NSUlfTURDICsgTUFTS19NSUlSX01JSV9NRE8pOworICAgICAgICBpZiAobWFzayAmIGRhdGEpCisgICAgICAgICAgICBtaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURPOworCisgICAgICAgIG91dGwobWlpciwgbWlpcG9ydCk7CisgICAgICAgIC8qIGhpZ2ggTURDICovCisgICAgICAgIG1paXIgfD0gTUFTS19NSUlSX01JSV9NREM7CisgICAgICAgIG91dGwobWlpciwgbWlpcG9ydCk7CisgICAgICAgIG04MHhfZGVsYXkoMzApOworCisgICAgICAgIC8qIG5leHQgKi8KKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgaWYgKG1hc2sgPT0gMHgyICYmIG9wY29kZSA9PSBPUF9SRUFEKQorICAgICAgICAgICAgbWlpciAmPSB+TUFTS19NSUlSX01JSV9XUklURTsKKyAgICB9CisgICAgcmV0dXJuIG1paXI7Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeWFkLCBpbnQgcmVnYWQpCit7CisgICAgbG9uZyBtaWlwb3J0ID0gbXRkeC5pb2FkZHIgKyBNQU5BR0VNRU5UOworICAgIHUzMiBtaWlyOworICAgIHVuc2lnbmVkIGludCBtYXNrLCBkYXRhOworCisgICAgbWlpciA9IG04MHhfc2VuZF9jbWRfdG9fcGh5KG1paXBvcnQsIE9QX1JFQUQsIHBoeWFkLCByZWdhZCk7CisKKyAgICAvKiByZWFkIGRhdGEgKi8KKyAgICBtYXNrID0gMHg4MDAwOworICAgIGRhdGEgPSAwOworICAgIHdoaWxlIChtYXNrKQorICAgIHsKKyAgICAgICAgLyogbG93IE1EQyAqLworICAgICAgICBtaWlyICY9IH5NQVNLX01JSVJfTUlJX01EQzsKKyAgICAgICAgb3V0bChtaWlyLCBtaWlwb3J0KTsKKworICAgICAgICAvKiByZWFkIE1ESSAqLworICAgICAgICBtaWlyID0gaW5sKG1paXBvcnQpOworICAgICAgICBpZiAobWlpciAmIE1BU0tfTUlJUl9NSUlfTURJKQorICAgICAgICAgICAgZGF0YSB8PSBtYXNrOworCisgICAgICAgIC8qIGhpZ2ggTURDLCBhbmQgd2FpdCAqLworICAgICAgICBtaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURDOworICAgICAgICBvdXRsKG1paXIsIG1paXBvcnQpOworICAgICAgICBtODB4X2RlbGF5KChpbnQpIDMwKTsKKworICAgICAgICAvKiBuZXh0ICovCisgICAgICAgIG1hc2sgPj49IDE7CisgICAgfQorCisgICAgLyogbG93IE1EQyAqLworICAgIG1paXIgJj0gfk1BU0tfTUlJUl9NSUlfTURDOworICAgIG91dGwobWlpciwgbWlpcG9ydCk7CisKKyAgICByZXR1cm4gZGF0YSAmIDB4ZmZmZjsKK30KKworI2lmIDAgLyogbm90IHVzZWQgKi8KK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5YWQsIGludCByZWdhZCwKKwkJICAgICAgIGludCBkYXRhKQoreworICAgIGxvbmcgbWlpcG9ydCA9IG10ZHguaW9hZGRyICsgTUFOQUdFTUVOVDsKKyAgICB1MzIgbWlpcjsKKyAgICB1bnNpZ25lZCBpbnQgbWFzazsKKworICAgIG1paXIgPSBtODB4X3NlbmRfY21kX3RvX3BoeShtaWlwb3J0LCBPUF9XUklURSwgcGh5YWQsIHJlZ2FkKTsKKworICAgIC8qIHdyaXRlIGRhdGEgKi8KKyAgICBtYXNrID0gMHg4MDAwOworICAgIHdoaWxlIChtYXNrKQorICAgIHsKKyAgICAgICAgLyogbG93IE1EQywgcHJlcGFyZSBNRE8gKi8KKyAgICAgICAgbWlpciAmPSB+KE1BU0tfTUlJUl9NSUlfTURDICsgTUFTS19NSUlSX01JSV9NRE8pOworICAgICAgICBpZiAobWFzayAmIGRhdGEpCisgICAgICAgICAgICBtaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURPOworICAgICAgICBvdXRsKG1paXIsIG1paXBvcnQpOworCisgICAgICAgIC8qIGhpZ2ggTURDICovCisgICAgICAgIG1paXIgfD0gTUFTS19NSUlSX01JSV9NREM7CisgICAgICAgIG91dGwobWlpciwgbWlpcG9ydCk7CisKKyAgICAgICAgLyogbmV4dCAqLworICAgICAgICBtYXNrID4+PSAxOworICAgIH0KKworICAgIC8qIGxvdyBNREMgKi8KKyAgICBtaWlyICY9IH5NQVNLX01JSVJfTUlJX01EQzsKKyAgICBvdXRsKG1paXIsIG1paXBvcnQpOworCisgICAgcmV0dXJuOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdldGxpbmtzdGF0dXMoc3RydWN0IG5pYyAqbmljKQorLyogZnVuY3Rpb246IFJvdXRpbmUgd2lsbCByZWFkIE1JSSBTdGF0dXMgUmVnaXN0ZXIgdG8gZ2V0IGxpbmsgc3RhdHVzLiAgICAgICAqLworLyogaW5wdXQgICA6IGRldi4uLiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogb3V0cHV0ICA6IG5vbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIHVuc2lnbmVkIGludCBpLCBEZWxheVRpbWUgPSAweDEwMDA7CisKKyAgICBtdGR4LmxpbmtvayA9IDA7CisKKyAgICBpZiAobXRkeC5QSFlUeXBlID09IE15c29uUEhZKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IERlbGF5VGltZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoaW5sKG10ZHguaW9hZGRyICsgQk1DUlNSKSAmIExpbmtJc1VwMikgeworICAgICAgICAgICAgICAgIG10ZHgubGlua29rID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkZWxheQorICAgICAgICAgICAgbTgweF9kZWxheSgxMDApOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRGVsYXlUaW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtZGlvX3JlYWQobmljLCBtdGR4LnBoeXNbMF0sIE1JSV9CTVNSKSAmIEJNU1JfTFNUQVRVUykgeworICAgICAgICAgICAgICAgIG10ZHgubGlua29rID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkZWxheQorICAgICAgICAgICAgbTgweF9kZWxheSgxMDApOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGdldGxpbmt0eXBlKHN0cnVjdCBuaWMgKmRldikKK3sKKyAgICBpZiAobXRkeC5QSFlUeXBlID09IE15c29uUEhZKQorICAgIHsgLyogMy1pbi0xIGNhc2UgKi8KKyAgICAgICAgaWYgKGlubChtdGR4LmlvYWRkciArIFRDUlJDUikgJiBGRCkKKyAgICAgICAgICAgIG10ZHguZHVwbGV4bW9kZSA9IDI7IC8qIGZ1bGwgZHVwbGV4ICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG10ZHguZHVwbGV4bW9kZSA9IDE7IC8qIGhhbGYgZHVwbGV4ICovCisgICAgICAgIGlmIChpbmwobXRkeC5pb2FkZHIgKyBUQ1JSQ1IpICYgUFMxMCkKKyAgICAgICAgICAgIG10ZHgubGluZV9zcGVlZCA9IDE7IC8qIDEwTSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBtdGR4LmxpbmVfc3BlZWQgPSAyOyAvKiAxMDBNICovCisgICAgfSBlbHNlCisgICAgeworICAgICAgICBpZiAobXRkeC5QSFlUeXBlID09IFNlZXFQSFkpIHsgLyogdGhpcyBQSFkgaXMgU0VFUSA4MDIyNSAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGE7CisKKyAgICAgICAgICAgIGRhdGEgPSBtZGlvX3JlYWQoZGV2LCBtdGR4LnBoeXNbMF0sIE1JSVJlZ2lzdGVyMTgpOworICAgICAgICAgICAgaWYgKGRhdGEgJiBTUERfREVUXzEwMCkKKyAgICAgICAgICAgICAgICBtdGR4LmxpbmVfc3BlZWQgPSAyOyAvKiAxMDBNICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbXRkeC5saW5lX3NwZWVkID0gMTsgLyogMTBNICovCisgICAgICAgICAgICBpZiAoZGF0YSAmIERQTFhfREVUX0ZVTEwpCisgICAgICAgICAgICAgICAgbXRkeC5kdXBsZXhtb2RlID0gMjsgLyogZnVsbCBkdXBsZXggbW9kZSAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG10ZHguZHVwbGV4bW9kZSA9IDE7IC8qIGhhbGYgZHVwbGV4IG1vZGUgKi8KKyAgICAgICAgfSBlbHNlIGlmIChtdGR4LlBIWVR5cGUgPT0gQWhkb2NQSFkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhOworCisgICAgICAgICAgICBkYXRhID0gbWRpb19yZWFkKGRldiwgbXRkeC5waHlzWzBdLCBEaWFnbm9zdGljUmVnKTsKKyAgICAgICAgICAgIGlmIChkYXRhICYgU3BlZWRfMTAwKQorICAgICAgICAgICAgICAgIG10ZHgubGluZV9zcGVlZCA9IDI7IC8qIDEwME0gKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtdGR4LmxpbmVfc3BlZWQgPSAxOyAvKiAxME0gKi8KKyAgICAgICAgICAgIGlmIChkYXRhICYgRFBMWF9GVUxMKQorICAgICAgICAgICAgICAgIG10ZHguZHVwbGV4bW9kZSA9IDI7IC8qIGZ1bGwgZHVwbGV4IG1vZGUgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtdGR4LmR1cGxleG1vZGUgPSAxOyAvKiBoYWxmIGR1cGxleCBtb2RlICovCisgICAgICAgIH0KKyAgICAgICAgLyogODkvNi8xMyBhZGQsIChiZWdpbikgKi8KKyAgICAgICAgZWxzZSBpZiAobXRkeC5QSFlUeXBlID09IE1hcnZlbGxQSFkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhOworCisgICAgICAgICAgICBkYXRhID0gbWRpb19yZWFkKGRldiwgbXRkeC5waHlzWzBdLCBTcGVjaWZpY1JlZyk7CisgICAgICAgICAgICBpZiAoZGF0YSAmIEZ1bGxfRHVwbGV4KQorICAgICAgICAgICAgICAgIG10ZHguZHVwbGV4bW9kZSA9IDI7IC8qIGZ1bGwgZHVwbGV4IG1vZGUgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtdGR4LmR1cGxleG1vZGUgPSAxOyAvKiBoYWxmIGR1cGxleCBtb2RlICovCisgICAgICAgICAgICBkYXRhICY9IFNwZWVkTWFzazsKKyAgICAgICAgICAgIGlmIChkYXRhID09IFNwZWVkXzEwMDBNKQorICAgICAgICAgICAgICAgIG10ZHgubGluZV9zcGVlZCA9IDM7IC8qIDEwMDBNICovCisgICAgICAgICAgICBlbHNlIGlmIChkYXRhID09IFNwZWVkXzEwME0pCisgICAgICAgICAgICAgICAgbXRkeC5saW5lX3NwZWVkID0gMjsgLyogMTAwTSAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG10ZHgubGluZV9zcGVlZCA9IDE7IC8qIDEwTSAqLworICAgICAgICB9CisgICAgICAgIC8qIDg5LzYvMTMgYWRkLCAoZW5kKSAqLworICAgICAgICAvKiA4OS83LzI3IGFkZCwgKGJlZ2luKSAqLworICAgICAgICBlbHNlIGlmIChtdGR4LlBIWVR5cGUgPT0gTXlzb245ODEpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhOworCisgICAgICAgICAgICBkYXRhID0gbWRpb19yZWFkKGRldiwgbXRkeC5waHlzWzBdLCBTdGF0dXNSZWdpc3Rlcik7CisKKyAgICAgICAgICAgIGlmIChkYXRhICYgU1BFRUQxMDApCisgICAgICAgICAgICAgICAgbXRkeC5saW5lX3NwZWVkID0gMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtdGR4LmxpbmVfc3BlZWQgPSAxOworCisgICAgICAgICAgICBpZiAoZGF0YSAmIEZVTExNT0RFKQorICAgICAgICAgICAgICAgIG10ZHguZHVwbGV4bW9kZSA9IDI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbXRkeC5kdXBsZXhtb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICAvKiA4OS83LzI3IGFkZCwgKGVuZCkgKi8KKyAgICAgICAgLyogODkvMTIvMjkgYWRkICovCisgICAgICAgIGVsc2UgaWYgKG10ZHguUEhZVHlwZSA9PSBMZXZlbE9uZVBIWSkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGE7CisKKyAgICAgICAgICAgIGRhdGEgPSBtZGlvX3JlYWQoZGV2LCBtdGR4LnBoeXNbMF0sIFNwZWNpZmljUmVnKTsKKyAgICAgICAgICAgIGlmIChkYXRhICYgTFhUMTAwMF9GdWxsKQorICAgICAgICAgICAgICAgIG10ZHguZHVwbGV4bW9kZSA9IDI7IC8qIGZ1bGwgZHVwbGV4IG1vZGUgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtdGR4LmR1cGxleG1vZGUgPSAxOyAvKiBoYWxmIGR1cGxleCBtb2RlICovCisgICAgICAgICAgICBkYXRhICY9IFNwZWVkTWFzazsKKyAgICAgICAgICAgIGlmIChkYXRhID09IExYVDEwMDBfMTAwME0pCisgICAgICAgICAgICAgICAgbXRkeC5saW5lX3NwZWVkID0gMzsgLyogMTAwME0gKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgPT0gTFhUMTAwMF8xMDBNKQorICAgICAgICAgICAgICAgIG10ZHgubGluZV9zcGVlZCA9IDI7IC8qIDEwME0gKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtdGR4LmxpbmVfc3BlZWQgPSAxOyAvKiAxME0gKi8KKyAgICAgICAgfQorICAgICAgICAvLyBjaGFnZSBjcnZhbHVlCisgICAgICAgIC8vIG10ZHguY3J2YWx1ZSY9KH5QUzEwKSYofkZEKTsKKyAgICAgICAgbXRkeC5jcnZhbHVlICY9ICh+UFMxMCkgJiAofkZEKSAmICh+UFMxMDAwKTsKKyAgICAgICAgaWYgKG10ZHgubGluZV9zcGVlZCA9PSAxKQorICAgICAgICAgICAgbXRkeC5jcnZhbHVlIHw9IFBTMTA7CisgICAgICAgIGVsc2UgaWYgKG10ZHgubGluZV9zcGVlZCA9PSAzKQorICAgICAgICAgICAgbXRkeC5jcnZhbHVlIHw9IFBTMTAwMDsKKyAgICAgICAgaWYgKG10ZHguZHVwbGV4bW9kZSA9PSAyKQorICAgICAgICAgICAgbXRkeC5jcnZhbHVlIHw9IEZEOworICAgIH0KK30KKworRFJJVkVSICggIk1URDgwWCIsIG5pY19kcml2ZXIsIHBjaV9kcml2ZXIsIG10ZDgweF9kcml2ZXIsCisJIG10ZF9wcm9iZSwgbXRkX2Rpc2FibGUgKTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L210bmljLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9tdG5pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZWU4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9tdG5pYy5jCkBAIC0wLDAgKzEsMTg1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL21hbGxvYy5oPgorI2luY2x1ZGUgPGdweGUvdW1hbGxvYy5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgIm10bmljLmgiCisKKworLyoKKworCisgICAgbXRuaWMuYyAtIGdQWEUgZHJpdmVyIGZvciBNZWxsYW5veCAxMEdpZyBDb25uZWN0WCBFTgorCisKKyovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJTVROSUMgYWxsb2NhdGlvbiBmdW5jdGlvbnMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorKiBtdG5pY19hbGxvY19hbGlnbmVkCisqCisqIEB2IAl1bnNpZ25lZCBpbnQgc2l6ZSAgICAgICBzaXplCisqIEB2IAl2b2lkICoqdmEJCXZpcnR1YWwgYWRkcmVzcworKiBAdiAJdTMyICpwYQkJCXBoeXNpY2FsIGFkZHJlc3MKKyogQHYJdTMyIGFsaWdtZW50CQlhbGlnbWVudAorKgorKiBGdW5jdGlvbiBhbGxvY2F0ZSBhbGlnbmVkIGJ1ZmZlciBhbmQgcHV0IGl0J3MgdmlydHVhbCBhZGRyZXNzIGluICd2YScKKyogYW5kIGl0J3MgcGh5c2ljYWwgYWxpZ25lZCBhZGRyZXNzIGluICdwYScKKyovCitzdGF0aWMgaW50CittdG5pY19hbGxvY19hbGlnbmVkKHVuc2lnbmVkIGludCBzaXplLCB2b2lkICoqdmEsIHVuc2lnbmVkIGxvbmcgKnBhLCB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KQoreworCSp2YSA9IGFsbG9jX21lbWJsb2NrKHNpemUsIGFsaWdubWVudCk7CisJaWYgKCEqdmEpIHsKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKwkqcGEgPSAodTMyKXZpcnRfdG9fYnVzKCp2YSk7CisJcmV0dXJuIDA7Cit9CisKKworCisvKioKKyAqCisgKiBtdG5pYyBhbGxvYyBjb21tYW5kIGludGVyZmFjZQorICoKKyAqLworc3RhdGljIGludAorbXRuaWNfYWxsb2NfY21kaWYoc3RydWN0IG10bmljICptdG5pYykKK3sKKwl1MzIgYmFyID0gbXRuaWNfcGNpX2Rldi5kZXYuYmFyWzBdOworCisJbXRuaWMtPmhjciA9IGlvcmVtYXAoYmFyICsgTVROSUNfSENSX0JBU0UsIE1UTklDX0hDUl9TSVpFKTsKKwlpZiAoICFtdG5pYy0+aGNyICkgeworCQlEQkcoIkNvdWxkbid0IG1hcCBjb21tYW5kIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKwltdG5pY19hbGxvY19hbGlnbmVkKFBBR0VfU0laRSwgKHZvaWQgKikmbXRuaWMtPmNtZC5idWYsICZtdG5pYy0+Y21kLm1hcHBpbmcsIFBBR0VfU0laRSk7CisJaWYgKCAhbXRuaWMtPmNtZC5idWYgKSB7CisJCURCRygiRXJyb3IgaW4gYWxsb2NhdGluZyBidWZmZXIgZm9yIGNvbW1hbmQgaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBGcmVlIFJYIGlvIGJ1ZmZlcnMKKyAqLworc3RhdGljIHZvaWQKK210bmljX2ZyZWVfaW9fYnVmZmVycyhzdHJ1Y3QgbXRuaWNfcmluZyAqcmluZykKK3sKKwlpbnQgaW5kZXg7CisKKwlmb3IgKDsgcmluZy0+Y29ucyA8PSByaW5nLT5wcm9kOyArK3JpbmctPmNvbnMpIHsKKwkJaW5kZXggPSByaW5nLT5jb25zICYgcmluZy0+c2l6ZV9tYXNrOworCQlpZiAoIHJpbmctPmlvYnVmW2luZGV4XSApIHsKKwkJCWZyZWVfaW9iKHJpbmctPmlvYnVmW2luZGV4XSk7CisJCX0KKwl9Cit9CisKKworCisvKioKKyAqCisgKiBtdG5pYyBhbGxvYyBhbmQgYXR0YWNoIGlvIGJ1ZmZlcnMKKyAqCisgKi8KK3N0YXRpYyBpbnQKK210bmljX2FsbG9jX2lvYnVmKHN0cnVjdCBtdG5pY19wb3J0ICpwcml2LCBzdHJ1Y3QgbXRuaWNfcmluZyAqcmluZywKKwkJICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbXRuaWNfcnhfZGVzYyAqcnhfZGVzY19wdHIgPSByaW5nLT5idWY7CisJdTMyIGluZGV4OworCisJd2hpbGUgKCh1MzIpKHJpbmctPnByb2QgLSByaW5nLT5jb25zKSA8IFVOSVRTX0JVRkZFUl9TSVpFKSB7CisJCWluZGV4ID0gcmluZy0+cHJvZCAmIHJpbmctPnNpemVfbWFzazsKKwkJcmluZy0+aW9idWZbaW5kZXhdID0gYWxsb2NfaW9iKHNpemUpOworCQlpZiAoIXJpbmctPmlvYnVmW2luZGV4XSkgeworCQkJaWYgKHJpbmctPnByb2QgPD0gKHJpbmctPmNvbnMgKyAxKSkgeworCQkJCURCRyAoICJEcm9wcGluZyBwYWNrZXQsIGJ1ZmZlciBpcyBmdWxsXG4iICk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIEF0dGFjaCBpb19idWZmZXIgdG8gZGVzY3JpcHRvciAqLworCQlyeF9kZXNjX3B0ciA9IHJpbmctPmJ1ZiArCisJCQkgICAgICAoc2l6ZW9mKHN0cnVjdCBtdG5pY19yeF9kZXNjKSAqIGluZGV4KTsKKwkJcnhfZGVzY19wdHItPmRhdGEuY291bnQgPSBjcHVfdG9fYmUzMihzaXplKTsKKwkJcnhfZGVzY19wdHItPmRhdGEubWVtX3R5cGUgPSBwcml2LT5tdG5pYy0+ZncubWVtX3R5cGVfc25vb3BfYmU7CisJCXJ4X2Rlc2NfcHRyLT5kYXRhLmFkZHJfbCA9IGNwdV90b19iZTMyKAorCQkJCQkJICAgICAgdmlydF90b19idXMocmluZy0+aW9idWZbaW5kZXhdLT5kYXRhKSk7CisKKwkJKysgcmluZy0+cHJvZDsKKwl9CisKKwkvKiBVcGRhdGUgUlggcHJvZHVjZXIgaW5kZXggKFBJKSAqLworCXJpbmctPmRiLT5jb3VudCA9IGNwdV90b19iZTMyKHJpbmctPnByb2QgJiAweGZmZmYpOworCXJldHVybiAwOworfQorCisKKy8qKgorICogbXRuaWMgYWxsb2MgcmluZworICoKKyAqIAlBbGxvYyBhbmQgY29uZmlndXJlIFRYIG9yIFJYIHJpbmcKKyAqCisgKi8KK3N0YXRpYyBpbnQKK210bmljX2FsbG9jX3Jpbmcoc3RydWN0IG10bmljX3BvcnQgKnByaXYsIHN0cnVjdCBtdG5pY19yaW5nICpyaW5nLAorCQkgdTMyIHNpemUsIHUxNiBzdHJpZGUsIHUxNiBjcSwgdTggaXNfcngpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKwlzdHJ1Y3QgbXRuaWNfcnhfZGVzYyAqcnhfZGVzYzsKKwlzdHJ1Y3QgbXRuaWNfdHhfZGVzYyAqdHhfZGVzYzsKKworCXJpbmctPnNpemUgPSBzaXplOyAvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgKi8KKwlyaW5nLT5zaXplX21hc2sgPSBzaXplIC0gMTsKKwlyaW5nLT5zdHJpZGUgPSBzdHJpZGU7IC8qIFNpemUgb2YgZWFjaCBlbnRyeSAqLworCXJpbmctPmNxID0gY3E7IC8qIENRIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByaW5nICovCisJcmluZy0+Y29ucyA9IDA7CisJcmluZy0+cHJvZCA9IDA7CisKKwkvKiBBbGxvYyBkZXNjcmlwdG9ycyBidWZmZXIgKi8KKwlyaW5nLT5idWZfc2l6ZSA9IHJpbmctPnNpemUgKiAoKGlzX3J4KSA/IHNpemVvZihzdHJ1Y3QgbXRuaWNfcnhfZGVzYykgOgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG10bmljX3R4X2Rlc2MpKTsKKwllcnIgPSBtdG5pY19hbGxvY19hbGlnbmVkKHJpbmctPmJ1Zl9zaXplLCAodm9pZCAqKSZyaW5nLT5idWYsCisJCQkJICAmcmluZy0+ZG1hLCBQQUdFX1NJWkUpOworCWlmIChlcnIpIHsKKwkJREJHKCJGYWlsZWQgYWxsb2NhdGluZyBkZXNjcmlwdG9yIHJpbmcgc2l6ZW9mICV4XG4iLAorCQkgICAgcmluZy0+YnVmX3NpemUpOworCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJfQorCW1lbXNldChyaW5nLT5idWYsIDAsIHJpbmctPmJ1Zl9zaXplKTsKKworCURCRygiQWxsb2NhdGVkICVzIHJpbmcgKGFkZHI6JXApIC0gYnVmOiVwIHNpemU6JXgiCisJICAgICJidWZfc2l6ZToleCBkbWE6JWx4XG4iLAorCSAgICBpc19yeCA/ICJSeCIgOiAiVHgiLCByaW5nLCByaW5nLT5idWYsIHJpbmctPnNpemUsCisJICAgIHJpbmctPmJ1Zl9zaXplLCByaW5nLT5kbWEpOworCisKKwlpZiAoaXNfcngpIHsgLyogUlggcmluZyAqLworCQkvKiBBbGxvYyBkb29yYmVsbCAqLworCQllcnIgPSBtdG5pY19hbGxvY19hbGlnbmVkKHNpemVvZihzdHJ1Y3QgbXRuaWNfY3FfZGJfcmVjb3JkKSwKKwkJCQkJICAodm9pZCAqKSZyaW5nLT5kYiwgJnJpbmctPmRiX2RtYSwgMzIpOworCQlpZiAoZXJyKSB7CisJCQlEQkcoIkZhaWxlZCBhbGxvY2F0aW5nIFJ4IHJpbmcgZG9vcmJlbGwgcmVjb3JkXG4iKTsKKwkJCWZyZWVfbWVtYmxvY2socmluZy0+YnVmLCByaW5nLT5idWZfc2l6ZSk7CisJCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJCX0KKworCQkvKiA9PS0gQ29uZmlndXJlIERlc2NyaXB0b3IgLT09ICovCisJCS8qIEluaXQgY3RybCBzZWcgb2YgcnggZGVzYyAqLworCQlmb3IgKGkgPSAwOyBpIDwgVU5JVFNfQlVGRkVSX1NJWkU7ICsraSkgeworCQkJcnhfZGVzYyA9IHJpbmctPmJ1ZiArCisJCQkJICAoc2l6ZW9mKHN0cnVjdCBtdG5pY19yeF9kZXNjKSAqIGkpOworCQkJLyogUHJlLWxpbmsgZGVzY3JpcHRvciAqLworCQkJcnhfZGVzYy0+bmV4dCA9IGNwdV90b19iZTE2KGkgKyAxKTsKKwkJfQorCQkvKlRoZSBsYXN0IGN0cmwgZGVzY3JpcHRvciBpcyAnMCcgYW5kIHBvaW50cyB0byB0aGUgZmlyc3Qgb25lKi8KKworCQkvKiBBbGxvYyBJT19CVUZGRVJTICovCisJCWVyciA9IG10bmljX2FsbG9jX2lvYnVmICggcHJpdiwgcmluZywgREVGX0lPQlVGX1NJWkUgKTsKKwkJaWYgKGVycikgeworCQkJREJHKCJFUlJPUiBBbGxvY2F0aW5nIGlvIGJ1ZmZlclxuIik7CisJCQlmcmVlX21lbWJsb2NrKHJpbmctPmJ1ZiwgcmluZy0+YnVmX3NpemUpOworCQkJcmV0dXJuIC1FQUREUklOVVNFOworCQl9CisKKwl9IGVsc2UgeyAvKiBUWCByaW5nICovCisJCS8qIFNldCBpbml0aWFsIG93bmVyc2hpcCBvZiBhbGwgVHggRGVzYycgdG8gU1cgKDEpICovCisJCWZvciAoaSA9IDA7IGkgPCByaW5nLT5zaXplOyBpKyspIHsKKwkJCXR4X2Rlc2MgPSByaW5nLT5idWYgKyByaW5nLT5zdHJpZGUgKiBpOworCQkJdHhfZGVzYy0+Y3RybC5vcF9vd24gPSBjcHVfdG9fYmUzMihNVE5JQ19CSVRfREVTQ19PV04pOworCQl9CisJCS8qIERCICovCisJCXJpbmctPmRiX29mZnNldCA9IGNwdV90b19iZTMyKAorCQkJCQkgICAgICgodTMyKSBwcml2LT5tdG5pYy0+ZncudHhfb2Zmc2V0W3ByaXYtPnBvcnRdKSA8PCA4KTsKKworCQkvKiBNYXAgVHgrQ1EgZG9vcmJlbGxzICovCisJCURCRygiTWFwcGluZyBUeENRIGRvb3JiZWxsIGF0IG9mZnNldDoweCV4XG4iLAorCQkgICAgcHJpdi0+bXRuaWMtPmZ3LnR4Y3FfZGJfb2Zmc2V0KTsKKwkJcmluZy0+dHhjcV9kYiA9IGlvcmVtYXAobXRuaWNfcGNpX2Rldi5kZXYuYmFyWzJdICsKKwkJCQkJcHJpdi0+bXRuaWMtPmZ3LnR4Y3FfZGJfb2Zmc2V0LCBQQUdFX1NJWkUpOworCQlpZiAoIXJpbmctPnR4Y3FfZGIpIHsKKwkJCURCRygiQ291bGRuJ3QgbWFwIHR4Y3EgZG9vcmJlbGwsIGFib3J0aW5nLi4uXG4iKTsKKwkJCWZyZWVfbWVtYmxvY2socmluZy0+YnVmLCByaW5nLT5idWZfc2l6ZSk7CisJCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qKgorICogbXRuaWMgYWxsb2MgQ1EKKyAqCisgKglBbGxvYyBhbmQgY29uZmlndXJlIENRLgorICoKKyAqLworc3RhdGljIGludAorbXRuaWNfYWxsb2NfY3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bSwgc3RydWN0IG10bmljX2NxICpjcSwKKwkgICAgICAgdTggaXNfcngsIHUzMiBzaXplLCB1MzIgb2Zmc2V0X2luZCkKK3sKKwlpbnQgZXJyIDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWNxLT5udW0gPSBudW07CisJY3EtPmRldiA9IGRldjsKKwljcS0+c2l6ZSA9IHNpemU7CisJY3EtPmxhc3QgPSAwOworCWNxLT5pc19yeCA9IGlzX3J4OworCWNxLT5vZmZzZXRfaW5kID0gb2Zmc2V0X2luZDsKKworCS8qIEFsbG9jIGRvb3JiZWxsICovCisJZXJyID0gbXRuaWNfYWxsb2NfYWxpZ25lZChzaXplb2Yoc3RydWN0IG10bmljX2NxX2RiX3JlY29yZCksCisJCQkJICAodm9pZCAqKSZjcS0+ZGIsICZjcS0+ZGJfZG1hLCAzMik7CisJaWYgKGVycikgeworCQlEQkcoIkZhaWxlZCBhbGxvY2F0aW5nIENRIGRvb3JiZWxsIHJlY29yZFxuIik7CisJCXJldHVybiAtRUFERFJJTlVTRTsKKwl9CisJbWVtc2V0KGNxLT5kYiwgMCwgc2l6ZW9mKHN0cnVjdCBtdG5pY19jcV9kYl9yZWNvcmQpKTsKKworCS8qIEFsbG9jIENRRXMgYnVmZmVyICovCisJY3EtPmJ1Zl9zaXplID0gc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbXRuaWNfY3FlKTsKKwllcnIgPSBtdG5pY19hbGxvY19hbGlnbmVkKGNxLT5idWZfc2l6ZSwKKwkJCQkgICh2b2lkICopJmNxLT5idWYsICZjcS0+ZG1hLCBQQUdFX1NJWkUpOworCWlmIChlcnIpIHsKKwkJREJHKCJGYWlsZWQgYWxsb2NhdGluZyBDUSBidWZmZXJcbiIpOworCQlmcmVlX21lbWJsb2NrKGNxLT5kYiwgc2l6ZW9mKHN0cnVjdCBtdG5pY19jcV9kYl9yZWNvcmQpKTsKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKwltZW1zZXQoY3EtPmJ1ZiwgMCwgY3EtPmJ1Zl9zaXplKTsKKwlEQkcoIkFsbG9jYXRlZCBDUSAoYWRkcjolcCkgLSBzaXplOiV4IGJ1ZjolcCBidWZfc2l6ZToleCAiCisJICAgICJkbWE6JWx4IGRiOiVwIGRiX2RtYTolbHhcbiIKKwkgICAgImNxbiBvZmZzZXQ6JXggXG4iLCBjcSwgY3EtPnNpemUsIGNxLT5idWYsCisJICAgIGNxLT5idWZfc2l6ZSwgY3EtPmRtYSwgY3EtPmRiLAorCSAgICBjcS0+ZGJfZG1hLCBvZmZzZXRfaW5kKTsKKworCisJLyogU2V0IG93bmVyc2hpcCBvZiBhbGwgQ1FFcyB0byBIVyAqLworCURCRygiU2V0dGluZyBIVyBvd25lcnNoaXAgZm9yIENROiVkXG4iLCBudW0pOworCWZvciAoaSA9IDA7IGkgPCBjcS0+c2l6ZTsgaSsrKSB7CisJCS8qIEluaXRpYWwgSFcgb3duZXJzaGlwIGlzIDEgKi8KKwkJY3EtPmJ1ZltpXS5vcF90cl9vd24gPSBNVE5JQ19CSVRfQ1FfT1dOOworCX0KKwlyZXR1cm4gMDsKK30KKworCisKKy8qKgorICogbXRuaWNfYWxsb2NfcmVzb3VyY2VzCisgKgorICogCUFsbG9jIGFuZCBjb25maWd1cmUgQ1FzLCBUeCwgUngKKyAqLwordW5zaWduZWQgaW50CittdG5pY19hbGxvY19yZXNvdXJjZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXRuaWNfcG9ydCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKwlpbnQgY3FfaW5kID0gMDsKKwlpbnQgY3Ffb2Zmc2V0ID0gcHJpdi0+bXRuaWMtPmZ3LmNxX29mZnNldDsKKworCS8qIEFsbG9jIDFzdCBDUSAqLworCWVyciA9IG10bmljX2FsbG9jX2NxKGRldiwgY3FfaW5kLCAmcHJpdi0+Y3FbY3FfaW5kXSwgMSAvKiBSWCAqLywKKwkJCSAgICAgVU5JVFNfQlVGRkVSX1NJWkUsIGNxX29mZnNldCArIGNxX2luZCk7CisJaWYgKGVycikgeworCQlEQkcoIkZhaWxlZCBhbGxvY2F0aW5nIFJ4IENRXG4iKTsKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKworCisJLyogQWxsb2MgUlggKi8KKwllcnIgPSBtdG5pY19hbGxvY19yaW5nKHByaXYsICZwcml2LT5yeF9yaW5nLCBVTklUU19CVUZGRVJfU0laRSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IG10bmljX3J4X2Rlc2MpLCBjcV9pbmQsIC8qIFJYICovMSk7CisJaWYgKGVycikgeworCQlEQkcoIkZhaWxlZCBhbGxvY2F0aW5nIFJ4IFJpbmdcbiIpOworCQlnb3RvIGNxMF9lcnJvcjsKKwl9CisKKworCSsrY3FfaW5kOworCisJLyogYWxsb2MgMm5kIENRICovCisJZXJyID0gbXRuaWNfYWxsb2NfY3EoZGV2LCBjcV9pbmQsICZwcml2LT5jcVtjcV9pbmRdLCAwIC8qIFRYICovLAorCQkJICAgICBVTklUU19CVUZGRVJfU0laRSwgY3Ffb2Zmc2V0ICsgY3FfaW5kKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRmFpbGVkIGFsbG9jYXRpbmcgVHggQ1FcbiIpOworCQlnb3RvIHJ4X2Vycm9yOworCX0KKworCS8qIEFsbG9jIFRYICovCisJZXJyID0gbXRuaWNfYWxsb2NfcmluZyhwcml2LCAmcHJpdi0+dHhfcmluZywgVU5JVFNfQlVGRkVSX1NJWkUsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtdG5pY190eF9kZXNjKSwgY3FfaW5kLCAvKiBUWCAqLyAwKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRmFpbGVkIGFsbG9jYXRpbmcgVHggcmluZ1xuIik7CisJCWdvdG8gY3ExX2Vycm9yOworCX0KKworCXJldHVybiAwOworCitjcTFfZXJyb3I6CisJZnJlZV9tZW1ibG9jayhwcml2LT5jcVsxXS5idWYsIHByaXYtPmNxWzFdLmJ1Zl9zaXplKTsKKwlmcmVlX21lbWJsb2NrKHByaXYtPmNxWzFdLmRiLCBzaXplb2Yoc3RydWN0IG10bmljX2NxX2RiX3JlY29yZCkpOworCityeF9lcnJvcjoKKwlmcmVlX21lbWJsb2NrKHByaXYtPnJ4X3JpbmcuYnVmLCBwcml2LT5yeF9yaW5nLmJ1Zl9zaXplKTsKKwlmcmVlX21lbWJsb2NrKHByaXYtPnJ4X3JpbmcuZGIsIHNpemVvZihzdHJ1Y3QgbXRuaWNfY3FfZGJfcmVjb3JkKSk7CisJbXRuaWNfZnJlZV9pb19idWZmZXJzKCZwcml2LT5yeF9yaW5nKTsKK2NxMF9lcnJvcjoKKwlmcmVlX21lbWJsb2NrKHByaXYtPmNxWzBdLmJ1ZiwgcHJpdi0+Y3FbMF0uYnVmX3NpemUpOworCWZyZWVfbWVtYmxvY2socHJpdi0+Y3FbMF0uZGIsIHNpemVvZihzdHJ1Y3QgbXRuaWNfY3FfZGJfcmVjb3JkKSk7CisKKwlyZXR1cm4gLUVBRERSSU5VU0U7Cit9CisKKworLyoqCisgKiAgbXRuaWMgYWxsb2NfZXEKKyAqCisgKiBOb3RlOiBFUSBpcyBub3QgdXNlZCBieSB0aGUgZHJpdmVyIGJ1dCBtdXN0IGJlIGFsbG9jYXRlZAorICovCitzdGF0aWMgaW50CittdG5pY19hbGxvY19lcShzdHJ1Y3QgbXRuaWMgKm10bmljKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IG10bmljX2VxZSAqZXFlX2Rlc2MgPSBOVUxMOworCisJLyogQWxsb2NhdGluZyBkb29yYmVsbCAqLworCW10bmljLT5lcV9kYiA9IGlvcmVtYXAobXRuaWNfcGNpX2Rldi5kZXYuYmFyWzJdICsKKwkJCSAgICAgICBtdG5pYy0+ZncuZXFfZGJfb2Zmc2V0LCBzaXplb2YodTMyKSk7CisJaWYgKCFtdG5pYy0+ZXFfZGIpIHsKKwkJREJHKCJDb3VsZG4ndCBtYXAgRVEgZG9vcmJlbGwsIGFib3J0aW5nLi4uXG4iKTsKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKworCS8qIEFsbG9jYXRpbmcgYnVmZmVyICovCisJbXRuaWMtPmVxLnNpemUgPSBOVU1fRVFFUzsKKwltdG5pYy0+ZXEuYnVmX3NpemUgPSBtdG5pYy0+ZXEuc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbXRuaWNfZXFlKTsKKwllcnIgPSBtdG5pY19hbGxvY19hbGlnbmVkKG10bmljLT5lcS5idWZfc2l6ZSwgKHZvaWQgKikmbXRuaWMtPmVxLmJ1ZiwKKwkJCQkgICZtdG5pYy0+ZXEuZG1hLCBQQUdFX1NJWkUpOworCWlmIChlcnIpIHsKKwkJREJHKCJGYWlsZWQgYWxsb2NhdGluZyBFUSBidWZmZXJcbiIpOworCQlpb3VubWFwKG10bmljLT5lcV9kYik7CisJCXJldHVybiAtRUFERFJJTlVTRTsKKwl9CisJbWVtc2V0KG10bmljLT5lcS5idWYsIDAsIG10bmljLT5lcS5idWZfc2l6ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXRuaWMtPmVxLnNpemU7IGkrKykKKwkJZXFlX2Rlc2MgPSBtdG5pYy0+ZXEuYnVmICsgKHNpemVvZihzdHJ1Y3QgbXRuaWNfZXFlKSAqIGkpOworCWVxZV9kZXNjLT5vd24gfD0gTVROSUNfQklUX0VRRV9PV047CisKKwltZGVsYXkoMjApOworCXJldHVybiAwOworfQorCisKKworCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBNdG5pYyBjb21tYW5kcyBmdW5jdGlvbnMKKyogLT0tPS09LT0tPS09LT0tPS09LT0tPS09CisqCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIGludAorY21kaWZfZ29fYml0KHN0cnVjdCBtdG5pYyAqbXRuaWMpCit7CisJc3RydWN0IG10bmljX2lmX2NtZF9yZWcgKmhjciA9IG10bmljLT5oY3I7CisJdTMyIHN0YXR1czsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUQklUX1JFVFJJRVM7IGkrKykgeworCQlzdGF0dXMgPSBiZTMyX3RvX2NwdShyZWFkbCgmaGNyLT5zdGF0dXNfZ29fb3Bjb2RlKSk7CisJCWlmICgoc3RhdHVzICYgTVROSUNfQkNfTUFTSyhNVE5JQ19NQVNLX0NNRF9SRUdfVF9CSVQpKSA9PQorCQkgICAgKG10bmljLT5jbWQudGJpdCA8PCBNVE5JQ19CQ19PRkYoTVROSUNfTUFTS19DTURfUkVHX1RfQklUKSkpIHsKKwkJCS8qIFJlYWQgZXhwZWN0ZWQgdC1iaXQgLSBub3cgcmV0dXJuIGdvLWJpdCB2YWx1ZSAqLworCQkJcmV0dXJuIHN0YXR1cyAmIE1UTklDX0JDX01BU0soTVROSUNfTUFTS19DTURfUkVHX0dPX0JJVCk7CisJCX0KKwl9CisKKwlEQkcoIkludmFsaWQgdGJpdCBhZnRlciAlZCByZXRyaWVzIVxuIiwgVEJJVF9SRVRSSUVTKTsKKwlyZXR1cm4gLUVCVVNZOyAvKiBSZXR1cm4gYnVzeS4uLiAqLworfQorCisvKiBCYXNlIENvbW1hbmQgaW50ZXJmYWNlICovCitzdGF0aWMgaW50CittdG5pY19jbWQoc3RydWN0IG10bmljICptdG5pYywgdm9pZCAqaW5faW1tLAorCSAgdm9pZCAqb3V0X2ltbSwgdTMyIGluX21vZGlmaWVyLCB1MTYgb3ApCit7CisKKwlzdHJ1Y3QgbXRuaWNfaWZfY21kX3JlZyAqaGNyID0gbXRuaWMtPmhjcjsKKwlpbnQgZXJyID0gMDsKKwl1MzIgb3V0X3BhcmFtX2ggPSAwOworCXUzMiBvdXRfcGFyYW1fbCA9IDA7CisJdTMyIGluX3BhcmFtX2ggPSAwOworCXUzMiBpbl9wYXJhbV9sID0gMDsKKworCisJc3RhdGljIHUxNiB0b2tlbiA9IDB4ODAwMDsKKwl1MzIgc3RhdHVzOworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMDsKKworCXRva2VuKys7CisKKwlpZiAoIGNtZGlmX2dvX2JpdCAoIG10bmljICkgKSB7CisJCURCRygiR08gQklUIEJVU1k6JXAuXG4iLCBoY3IgKyA2KTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGluX2ltbSkgeworCQlpbl9wYXJhbV9oID0gKigodTMyKilpbl9pbW0pOworCQlpbl9wYXJhbV9sID0gKigodTMyKilpbl9pbW0gKyAxKTsKKwl9IGVsc2UgeworCQlpbl9wYXJhbV9sID0gY3B1X3RvX2JlMzIobXRuaWMtPmNtZC5tYXBwaW5nKTsKKwl9CisJb3V0X3BhcmFtX2wgPSBjcHVfdG9fYmUzMihtdG5pYy0+Y21kLm1hcHBpbmcpOworCisJLyogd3JpdGluZyB0byBNQ1IgKi8KKwl3cml0ZWwoaW5fcGFyYW1faCwgICAgICAgICAgJmhjci0+aW5fcGFyYW1faCk7CisJd3JpdGVsKGluX3BhcmFtX2wsICAgICAgICAgICZoY3ItPmluX3BhcmFtX2wpOworCXdyaXRlbCgodTMyKSBjcHVfdG9fYmUzMihpbl9tb2RpZmllciksICAmaGNyLT5pbnB1dF9tb2RpZmllcik7CisJd3JpdGVsKG91dF9wYXJhbV9oLCAgICAgICAgICZoY3ItPm91dF9wYXJhbV9oKTsKKwl3cml0ZWwob3V0X3BhcmFtX2wsICAgICAgICAgJmhjci0+b3V0X3BhcmFtX2wpOworCXdyaXRlbCgodTMyKWNwdV90b19iZTMyKHRva2VuIDw8IDE2KSwgICAmaGNyLT50b2tlbik7CisJd21iKCk7CisKKwkvKiBmbGlwIHRvZ2dsZSBiaXQgYmVmb3JlIGVhY2ggd3JpdGUgdG8gdGhlIEhDUiAqLworCW10bmljLT5jbWQudGJpdCA9ICFtdG5pYy0+Y21kLnRiaXQ7CisJd3JpdGVsKCAoIHUzMiApCisJCWNwdV90b19iZTMyKE1UTklDX0JDX01BU0soTVROSUNfTUFTS19DTURfUkVHX0dPX0JJVCkgfAorCQkJICAgICggbXRuaWMtPmNtZC50Yml0IDw8IE1UTklDX0JDX09GRiAoIE1UTklDX01BU0tfQ01EX1JFR19UX0JJVCApICkgfCBvcCApLAorCQkmaGNyLT5zdGF0dXNfZ29fb3Bjb2RlKTsKKworCXdoaWxlICggY21kaWZfZ29fYml0ICggbXRuaWMgKSAmJiAoIHRpbWVvdXQgPD0gR09fQklUX1RJTUVPVVQgKSApIHsKKwkJbWRlbGF5ICggMSApOworCQkrK3RpbWVvdXQ7CisJfQorCisJaWYgKCBjbWRpZl9nb19iaXQgKCBtdG5pYyApICkgeworCQlEQkcoIkNvbW1hbmQgb3Bjb2RlOjB4JXggdG9rZW46MHgleCBUSU1FT1VULlxuIiwgb3AsIHRva2VuKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAob3V0X2ltbSkgeworCQkqKCh1MzIgKilvdXRfaW1tKSA9IHJlYWRsKCZoY3ItPm91dF9wYXJhbV9oKTsKKwkJKigodTMyICopb3V0X2ltbSArIDEpID0gcmVhZGwoJmhjci0+b3V0X3BhcmFtX2wpOworCX0KKworCXN0YXR1cyA9IGJlMzJfdG9fY3B1KCh1MzIpcmVhZGwoJmhjci0+c3RhdHVzX2dvX29wY29kZSkpID4+IDI0OworCisJaWYgKHN0YXR1cykgeworCQlEQkcoIkNvbW1hbmQgb3Bjb2RlOjB4JXggdG9rZW46MHgleCByZXR1cm5lZDoweCV4XG4iLAorCQkgICAgb3AsIHRva2VuLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qIE1BUCBQQUdFUyB3cmFwcGVyICovCitzdGF0aWMgaW50CittdG5pY19tYXBfY21kKHN0cnVjdCBtdG5pYyAqbXRuaWMsIHUxNiBvcCwgc3RydWN0IG10bmljX3BhZ2VzIHBhZ2VzKQoreworCXVuc2lnbmVkIGludCBqOworCXUzMiBhZGRyOworCXVuc2lnbmVkIGludCBsZW47CisJdTMyICpwYWdlX2FyciA9IG10bmljLT5jbWQuYnVmOworCWludCBuZW50ID0gMDsKKwlpbnQgZXJyID0gMDsKKworCW1lbXNldChwYWdlX2FyciwgMCwgUEFHRV9TSVpFKTsKKworCWxlbiA9IFBBR0VfU0laRSAqIHBhZ2VzLm51bTsKKwlwYWdlcy5idWYgPSAodTMyICopdW1hbGxvYyhQQUdFX1NJWkUgKiAocGFnZXMubnVtICsgMSkpOworCWFkZHIgPSBQQUdFX1NJWkUgKyAoKHZpcnRfdG9fYnVzKHBhZ2VzLmJ1ZikgJiAweGZmZmZmMDAwKSArIFBBR0VfU0laRSk7CisJREJHKCJNYXBwaW5nIHBhZ2VzOiBzaXplOiAleCBhZGRyZXNzOiAlcFxuIiwgcGFnZXMubnVtLCBwYWdlcy5idWYpOworCisJaWYgKGFkZHIgJiAoUEFHRV9NQVNLKSkgeworCQlEQkcoIkdvdCBGVyBhcmVhIG5vdCBhbGlnbmVkIHRvICVkICglbGx4LyV4KVxuIiwKKwkJICAgIFBBR0VfU0laRSwgKHU2NCkgYWRkciwgbGVuKTsKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKworCS8qIEZ1bmN0aW9uIG1hcHMgZWFjaCBQQUdFIHNlcGVyYXRlbHkgKi8KKwlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKz0gUEFHRV9TSVpFKSB7CisJCXBhZ2VfYXJyW25lbnQgKiA0ICsgM10gPSBjcHVfdG9fYmUzMihhZGRyICsgaik7CisJCWlmICgrK25lbnQgPT0gTVROSUNfTUFJTEJPWF9TSVpFIC8gMTYpIHsKKwkJCWVyciA9IG10bmljX2NtZChtdG5pYywgTlVMTCwgTlVMTCwgbmVudCwgb3ApOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCW5lbnQgPSAwOworCQl9CisJfQorCisJaWYgKG5lbnQpIHsKKwkJZXJyID0gbXRuaWNfY21kKG10bmljLCBOVUxMLCBOVUxMLCBuZW50LCBvcCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKworCisvKgorICogUXVlcnkgRlcKKyAqLworc3RhdGljIGludAorbXRuaWNfUVVFUllfRlcgKCBzdHJ1Y3QgbXRuaWMgKm10bmljICkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtdG5pY19pZl9xdWVyeV9md19vdXRfbWJveCAqY21kID0gbXRuaWMtPmNtZC5idWY7CisKKwllcnIgPSBtdG5pY19jbWQobXRuaWMsIE5VTEwsIE5VTEwsIDAsIE1UTklDX0lGX0NNRF9RVUVSWV9GVyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBHZXQgRlcgYW5kIGludGVyZmFjZSB2ZXJzaW9ucyAqLworCW10bmljLT5md192ZXIgPSAoKHU2NCkgYmUxNl90b19jcHUoY21kLT5yZXZfbWFqKSA8PCAzMikgfAorCQkJKCh1NjQpIGJlMTZfdG9fY3B1KGNtZC0+cmV2X21pbikgPDwgMTYpIHwKKwkJCSh1NjQpIGJlMTZfdG9fY3B1KGNtZC0+cmV2X3NtaW4pOworCW10bmljLT5mdy5pZmNfcmV2ID0gYmUxNl90b19jcHUoY21kLT5pZmNfcmV2KTsKKworCS8qIEdldCBvZmZzZXQgZm9yIGludGVybmFsIGVycm9yIHJlcG9ydHMgKGRlYnVnKSAqLworCW10bmljLT5mdy5lcnJfYnVmLm9mZnNldCA9IGJlNjRfdG9fY3B1KGNtZC0+ZXJyX2J1Zl9zdGFydCk7CisJbXRuaWMtPmZ3LmVycl9idWYuc2l6ZSA9IGJlMzJfdG9fY3B1KGNtZC0+ZXJyX2J1Zl9zaXplKTsKKworCURCRygiRXJyb3IgYnVmIG9mZnNldCBpcyAlbGx4XG4iLCBtdG5pYy0+ZncuZXJyX2J1Zi5vZmZzZXQpOworCisJLyogR2V0IG51bWJlciBvZiByZXF1aXJlZCBGVyAoNGspIHBhZ2VzICovCisJbXRuaWMtPmZ3LmZ3X3BhZ2VzLm51bSA9IGJlMTZfdG9fY3B1KGNtZC0+ZndfcGFnZXMpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorbXRuaWNfT1BFTl9OSUMoc3RydWN0IG10bmljICptdG5pYykKK3sKKwlzdHJ1Y3QgbXRuaWNfaWZfb3Blbl9uaWNfaW5fbWJveCAqb3Blbl9uaWMgPSBtdG5pYy0+Y21kLmJ1ZjsKKwl1MzIgZXh0cmFfcGFnZXNbMl0gPSB7MH07CisJaW50IGVycjsKKworCW1lbXNldChvcGVuX25pYywgMCwgc2l6ZW9mICpvcGVuX25pYyk7CisKKwkvKiBwb3J0IDEgKi8KKwlvcGVuX25pYy0+bG9nX3J4X3AxID0gMDsKKwlvcGVuX25pYy0+bG9nX2NxX3AxID0gMTsKKworCW9wZW5fbmljLT5sb2dfdHhfcDEgPSAwOworCW9wZW5fbmljLT5zdGVlcl9wMSA9IE1UTklDX0lGX1NURUVSX1JTUzsKKwkvKiBNQUMgKyBWTEFOIC0gbGVhdmUgcmVzZXJ2ZWQgKi8KKworCS8qIHBvcnQgMiAqLworCW9wZW5fbmljLT5sb2dfcnhfcDIgPSAwOworCW9wZW5fbmljLT5sb2dfY3FfcDIgPSAxOworCisJb3Blbl9uaWMtPmxvZ190eF9wMiA9IDA7CisJb3Blbl9uaWMtPnN0ZWVyX3AyID0gTVROSUNfSUZfU1RFRVJfUlNTOworCS8qIE1BQyArIFZMQU4gLSBsZWF2ZSByZXNlcnZlZCAqLworCisJZXJyID0gbXRuaWNfY21kKG10bmljLCBOVUxMLCBleHRyYV9wYWdlcywgMCwgTVROSUNfSUZfQ01EX09QRU5fTklDKTsKKworCW10bmljLT5mdy5leHRyYV9wYWdlcy5udW0gPSBiZTMyX3RvX2NwdSgqKGV4dHJhX3BhZ2VzKzEpKTsKKwlEQkcoIkV4dHJhIHBhZ2VzIG51bSBpcyAleFxuIiwgbXRuaWMtPmZ3LmV4dHJhX3BhZ2VzLm51bSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorbXRuaWNfQ09ORklHX1JYKHN0cnVjdCBtdG5pYyAqbXRuaWMpCit7CisJc3RydWN0IG10bmljX2lmX2NvbmZpZ19yeF9pbl9pbW0gY29uZmlnX3J4OworCisJbWVtc2V0KCZjb25maWdfcngsIDAsIHNpemVvZiBjb25maWdfcngpOworCXJldHVybiBtdG5pY19jbWQobXRuaWMsICZjb25maWdfcngsIE5VTEwsIDAsIE1UTklDX0lGX0NNRF9DT05GSUdfUlgpOworfQorCitzdGF0aWMgaW50CittdG5pY19DT05GSUdfVFgoc3RydWN0IG10bmljICptdG5pYykKK3sKKwlzdHJ1Y3QgbXRuaWNfaWZfY29uZmlnX3NlbmRfaW5faW1tIGNvbmZpZ190eDsKKworCWNvbmZpZ190eC5lbnBoX2dwZiA9IDA7CisJcmV0dXJuIG10bmljX2NtZChtdG5pYywgJmNvbmZpZ190eCwgTlVMTCwgMCwgTVROSUNfSUZfQ01EX0NPTkZJR19UWCk7Cit9CisKK3N0YXRpYyBpbnQKK210bmljX0hFQVJUX0JFQVQoc3RydWN0IG10bmljX3BvcnQgKnByaXYsIHUzMiAqbGlua19zdGF0ZSkKK3sKKwlzdHJ1Y3QgbXRuaWNfaWZfaGVhcnRfYmVhdF9vdXRfaW1tIGhlYXJ0X2JlYXQ7CisKKwlpbnQgZXJyOworCXUzMiBmbGFnczsKKwllcnIgPSBtdG5pY19jbWQocHJpdi0+bXRuaWMsIE5VTEwsICZoZWFydF9iZWF0LCAwLCBNVE5JQ19JRl9DTURfSEVBUlRfQkVBVCk7CisJaWYgKCFlcnIpIHsKKwkJZmxhZ3MgPSBiZTMyX3RvX2NwdShoZWFydF9iZWF0LmZsYWdzKTsKKwkJaWYgKGZsYWdzICYgTVROSUNfQkNfTUFTSyhNVE5JQ19NQVNLX0hFQVJfQkVBVF9JTlRfRVJST1IpKSB7CisJCQlEQkcoIkludGVybmFsIGVycm9yIGRldGVjdGVkXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCSpsaW5rX3N0YXRlID0gZmxhZ3MgJgorCQkJICAgICAgfigodTMyKSBNVE5JQ19CQ19NQVNLKE1UTklDX01BU0tfSEVBUl9CRUFUX0lOVF9FUlJPUikpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKiBQb3J0IGNvbW1hbmRzCisgKi8KKworc3RhdGljIGludAorbXRuaWNfU0VUX1BPUlRfREVGQVVMVF9SSU5HKHN0cnVjdCBtdG5pY19wb3J0ICpwcml2LCB1OCBwb3J0LCB1MTYgcmluZykKK3sKKwlzdHJ1Y3QgbXRuaWNfaWZfc2V0X3BvcnRfZGVmYXVsdF9yaW5nX2luX2ltbSBkZWZfcmluZzsKKworCW1lbXNldCgmZGVmX3JpbmcsIDAsIHNpemVvZihkZWZfcmluZykpOworCWRlZl9yaW5nLnJpbmcgPSByaW5nOworCXJldHVybiBtdG5pY19jbWQocHJpdi0+bXRuaWMsICZkZWZfcmluZywgTlVMTCwgcG9ydCArIDEsCisJCQkgTVROSUNfSUZfQ01EX1NFVF9QT1JUX0RFRkFVTFRfUklORyk7Cit9CisKK3N0YXRpYyBpbnQKK210bmljX0NPTkZJR19QT1JUX1JTU19TVEVFUihzdHJ1Y3QgbXRuaWNfcG9ydCAqcHJpdiwgaW50IHBvcnQpCit7CisJbWVtc2V0KHByaXYtPm10bmljLT5jbWQuYnVmLCAwLCBQQUdFX1NJWkUpOworCXJldHVybiAgbXRuaWNfY21kKHByaXYtPm10bmljLCBOVUxMLCBOVUxMLCBwb3J0ICsgMSwKKwkJCSAgTVROSUNfSUZfQ01EX0NPTkZJR19QT1JUX1JTU19TVEVFUik7Cit9CisKK3N0YXRpYyBpbnQKK210bmljX1NFVF9QT1JUX1JTU19JTkRJUkVDVElPTihzdHJ1Y3QgbXRuaWNfcG9ydCAqcHJpdiwgaW50IHBvcnQpCisKK3sKKwltZW1zZXQocHJpdi0+bXRuaWMtPmNtZC5idWYsIDAsIFBBR0VfU0laRSk7CisJcmV0dXJuIG10bmljX2NtZChwcml2LT5tdG5pYywgTlVMTCwgTlVMTCwgcG9ydCArIDEsCisJCQkgTVROSUNfSUZfQ01EX1NFVF9QT1JUX1JTU19JTkRJUkVDVElPTik7Cit9CisKKworLyoKKyAqIENvbmZpZyBjb21tYW5kcworICovCitzdGF0aWMgaW50CittdG5pY19DT05GSUdfQ1Eoc3RydWN0IG10bmljX3BvcnQgKnByaXYsIGludCBwb3J0LAorCQl1MTYgY3FfaW5kLCBzdHJ1Y3QgbXRuaWNfY3EgKmNxKQoreworCXN0cnVjdCBtdG5pY19pZl9jb25maWdfY3FfaW5fbWJveCAqY29uZmlnX2NxID0gcHJpdi0+bXRuaWMtPmNtZC5idWY7CisKKwltZW1zZXQoY29uZmlnX2NxLCAwLCBzaXplb2YgKmNvbmZpZ19jcSk7CisJY29uZmlnX2NxLT5jcSA9IGNxX2luZDsKKwljb25maWdfY3EtPnNpemUgPSBmbHMoVU5JVFNfQlVGRkVSX1NJWkUgLSAxKTsKKwljb25maWdfY3EtPm9mZnNldCA9ICgoY3EtPmRtYSkgJiAoUEFHRV9NQVNLKSkgPj4gNjsKKwljb25maWdfY3EtPmRiX3JlY29yZF9hZGRyX2wgPSBjcHVfdG9fYmUzMihjcS0+ZGJfZG1hKTsKKwljb25maWdfY3EtPnBhZ2VfYWRkcmVzc1sxXSA9IGNwdV90b19iZTMyKGNxLT5kbWEpOworCURCRygiY29uZmlnIGNxIGFkZHJlc3M6ICV4IGRtYV9hZGRyZXNzOiAlbHgiCisJICAgICJvZmZzZXQ6ICVkIHNpemUgJWQgaW5kZXg6ICVkXG4iCisJICAgICwgY29uZmlnX2NxLT5wYWdlX2FkZHJlc3NbMV0sY3EtPmRtYSwKKwkgICAgY29uZmlnX2NxLT5vZmZzZXQsIGNvbmZpZ19jcS0+c2l6ZSwgY29uZmlnX2NxLT5jcSApOworCisJcmV0dXJuIG10bmljX2NtZChwcml2LT5tdG5pYywgTlVMTCwgTlVMTCwgcG9ydCArIDEsCisJCQkgTVROSUNfSUZfQ01EX0NPTkZJR19DUSk7Cit9CisKKworc3RhdGljIGludAorbXRuaWNfQ09ORklHX1RYX1JJTkcoc3RydWN0IG10bmljX3BvcnQgKnByaXYsIHU4IHBvcnQsCisJCSAgICAgdTE2IHJpbmdfaW5kLCBzdHJ1Y3QgbXRuaWNfcmluZyAqcmluZykKK3sKKwlzdHJ1Y3QgbXRuaWNfaWZfY29uZmlnX3NlbmRfcmluZ19pbl9tYm94ICpjb25maWdfdHhfcmluZyA9IHByaXYtPm10bmljLT5jbWQuYnVmOworCW1lbXNldChjb25maWdfdHhfcmluZywgMCwgc2l6ZW9mICpjb25maWdfdHhfcmluZyk7CisJY29uZmlnX3R4X3JpbmctPnJpbmcgPSBjcHVfdG9fYmUxNihyaW5nX2luZCk7CisJY29uZmlnX3R4X3JpbmctPnNpemUgPSBmbHMoVU5JVFNfQlVGRkVSX1NJWkUgLSAxKTsKKwljb25maWdfdHhfcmluZy0+Y3EgPSBjcHVfdG9fYmUxNihyaW5nLT5jcSk7CisJY29uZmlnX3R4X3JpbmctPnBhZ2VfYWRkcmVzc1sxXSA9IGNwdV90b19iZTMyKHJpbmctPmRtYSk7CisKKwlyZXR1cm4gbXRuaWNfY21kKHByaXYtPm10bmljLCBOVUxMLCBOVUxMLCBwb3J0ICsgMSwKKwkJCSBNVE5JQ19JRl9DTURfQ09ORklHX1RYX1JJTkcpOworfQorCitzdGF0aWMgaW50CittdG5pY19DT05GSUdfUlhfUklORyhzdHJ1Y3QgbXRuaWNfcG9ydCAqcHJpdiwgdTggcG9ydCwKKwkJICAgICB1MTYgcmluZ19pbmQsIHN0cnVjdCBtdG5pY19yaW5nICpyaW5nKQoreworCXN0cnVjdCBtdG5pY19pZl9jb25maWdfcnhfcmluZ19pbl9tYm94ICpjb25maWdfcnhfcmluZyA9IHByaXYtPm10bmljLT5jbWQuYnVmOworCW1lbXNldChjb25maWdfcnhfcmluZywgMCwgc2l6ZW9mICpjb25maWdfcnhfcmluZyk7CisJY29uZmlnX3J4X3JpbmctPnJpbmcgPSByaW5nX2luZDsKKwlNVE5JQ19CQ19QVVQoY29uZmlnX3J4X3JpbmctPnN0cmlkZV9zaXplLCBmbHMoVU5JVFNfQlVGRkVSX1NJWkUgLSAxKSwKKwkJICAgICBNVE5JQ19NQVNLX0NPTkZJR19SWF9SSU5HX1NJWkUpOworCU1UTklDX0JDX1BVVChjb25maWdfcnhfcmluZy0+c3RyaWRlX3NpemUsIDEsCisJCSAgICAgTVROSUNfTUFTS19DT05GSUdfUlhfUklOR19TVFJJREUpOworCWNvbmZpZ19yeF9yaW5nLT5jcSA9IGNwdV90b19iZTE2KHJpbmctPmNxKTsKKwljb25maWdfcnhfcmluZy0+ZGJfcmVjb3JkX2FkZHJfbCA9IGNwdV90b19iZTMyKHJpbmctPmRiX2RtYSk7CisKKwlEQkcoIkNvbmZpZyBSWCByaW5nIHN0YXJ0aW5nIGF0IGFkZHJlc3M6JWx4XG4iLCByaW5nLT5kbWEpOworCisJY29uZmlnX3J4X3JpbmctPnBhZ2VfYWRkcmVzc1sxXSA9IGNwdV90b19iZTMyKHJpbmctPmRtYSk7CisKKwlyZXR1cm4gbXRuaWNfY21kKHByaXYtPm10bmljLCBOVUxMLCBOVUxMLCBwb3J0ICsgMSwKKwkJCSBNVE5JQ19JRl9DTURfQ09ORklHX1JYX1JJTkcpOworfQorCitzdGF0aWMgaW50CittdG5pY19DT05GSUdfRVEoc3RydWN0IG10bmljICptdG5pYykKK3sKKwlzdHJ1Y3QgbXRuaWNfaWZfY29uZmlnX2VxX2luX21ib3ggKmVxID0gbXRuaWMtPmNtZC5idWY7CisKKwlpZiAobXRuaWMtPmVxLmRtYSAmIChQQUdFX01BU0spKSB7CisJCURCRygibWlzYWxsaWduZWQgZXEgYnVmZmVyOiVseFxuIiwKKwkJICAgIG10bmljLT5lcS5kbWEpOworCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJfQorCisJbWVtc2V0KGVxLCAwLCBzaXplb2YgKmVxKTsKKwlNVE5JQ19CQ19QVVQoZXEtPm9mZnNldCwgbXRuaWMtPmVxLmRtYSA+PiA2LCBNVE5JQ19NQVNLX0NPTkZJR19FUV9PRkZTRVQpOworCU1UTklDX0JDX1BVVChlcS0+c2l6ZSwgZmxzKG10bmljLT5lcS5zaXplIC0gMSkgLSAxLCBNVE5JQ19NQVNLX0NPTkZJR19FUV9TSVpFKTsKKwlNVE5JQ19CQ19QVVQoZXEtPmludF92ZWN0b3IsIDAsIE1UTklDX01BU0tfQ09ORklHX0VRX0lOVF9WRUMpOworCWVxLT5wYWdlX2FkZHJlc3NbMV0gPSBjcHVfdG9fYmUzMihtdG5pYy0+ZXEuZG1hKTsKKworCXJldHVybiBtdG5pY19jbWQobXRuaWMsIE5VTEwsIE5VTEwsIDAsIE1UTklDX0lGX0NNRF9DT05GSUdfRVEpOworfQorCisKKworCitzdGF0aWMgaW50CittdG5pY19TRVRfUlhfUklOR19BRERSKHN0cnVjdCBtdG5pY19wb3J0ICpwcml2LCB1OCBwb3J0LCB1NjQqIG1hYykKK3sKKwlzdHJ1Y3QgbXRuaWNfaWZfc2V0X3J4X3JpbmdfYWRkcl9pbl9pbW0gcmluZ19hZGRyOworCXUzMiBtb2RpZmllciA9ICgodTMyKSBwb3J0ICsgMSkgPDwgMTY7CisKKwltZW1zZXQoJnJpbmdfYWRkciwgMCwgc2l6ZW9mKHJpbmdfYWRkcikpOworCisJcmluZ19hZGRyLm1hY18zMV8wID0gY3B1X3RvX2JlMzIoKm1hYyAmIDB4ZmZmZmZmZmYpOworCXJpbmdfYWRkci5tYWNfNDdfMzIgPSBjcHVfdG9fYmUxNigoKm1hYyA+PiAzMikgJiAweGZmZmYpOworCXJpbmdfYWRkci5mbGFnc192bGFuX2lkIHw9IGNwdV90b19iZTE2KAorCQkJCQkgICAgICBNVE5JQ19CQ19NQVNLKE1UTklDX01BU0tfU0VUX1JYX1JJTkdfQUREUl9CWV9NQUMpKTsKKworCXJldHVybiBtdG5pY19jbWQocHJpdi0+bXRuaWMsICZyaW5nX2FkZHIsIE5VTEwsIG1vZGlmaWVyLCBNVE5JQ19JRl9DTURfU0VUX1JYX1JJTkdfQUREUik7Cit9CisKK3N0YXRpYyBpbnQKK210bmljX1NFVF9QT1JUX1NUQVRFKHN0cnVjdCBtdG5pY19wb3J0ICpwcml2LCB1OCBwb3J0LCB1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbXRuaWNfaWZfc2V0X3BvcnRfc3RhdGVfaW5faW1tIHBvcnRfc3RhdGU7CisKKwlwb3J0X3N0YXRlLnN0YXRlID0gc3RhdGUgPyBjcHVfdG9fYmUzMigKKwkJCQkJICAgICAgTVROSUNfQkNfTUFTSyhNVE5JQ19NQVNLX0NPTkZJR19QT1JUX1NUQVRFKSkgOiAwOworCXBvcnRfc3RhdGUucmVzZXJ2ZWQgPSAwOworCXJldHVybiBtdG5pY19jbWQocHJpdi0+bXRuaWMsICZwb3J0X3N0YXRlLCBOVUxMLCBwb3J0ICsgMSwKKwkJCSBNVE5JQ19JRl9DTURfU0VUX1BPUlRfU1RBVEUpOworfQorCitzdGF0aWMgaW50CittdG5pY19TRVRfUE9SVF9NVFUoc3RydWN0IG10bmljX3BvcnQgKnByaXYsIHU4IHBvcnQsIHUxNiBtdHUpCit7CisJc3RydWN0IG10bmljX2lmX3NldF9wb3J0X210dV9pbl9pbW0gc2V0X210dTsKKworCW1lbXNldCgmc2V0X210dSwgMCwgc2l6ZW9mKHNldF9tdHUpKTsKKwlzZXRfbXR1Lm10dSA9IGNwdV90b19iZTE2KG10dSk7CisJcmV0dXJuIG10bmljX2NtZChwcml2LT5tdG5pYywgJnNldF9tdHUsIE5VTEwsIHBvcnQgKyAxLAorCQkJIE1UTklDX0lGX0NNRF9TRVRfUE9SVF9NVFUpOworfQorCisvKgorc3RhdGljIGludAorbXRuaWNfQ09ORklHX1BPUlRfVkxBTl9GSUxURVIoc3RydWN0IG10bmljX3BvcnQgKnByaXYsIGludCBwb3J0KQoreworCXN0cnVjdCBtdG5pY19pZl9jb25maWdfcG9ydF92bGFuX2ZpbHRlcl9pbl9tYm94ICp2bGFuX2ZpbHRlciA9IHByaXYtPm10bmljLT5jbWQuYnVmOworCisJLy8gV2hlbiBubyB2bGFucyBhcmUgY29uZmlndXJlZCB3ZSBkaXNhYmxlIHRoZSBmaWx0ZXIKKwkvLyAoaS5lLiwgcGFzcyBhbGwgdmxhbnMpIGJlY2F1c2Ugd2UgaWdub3JlIHRoZW0gYW55aG93CisJbWVtc2V0KHZsYW5fZmlsdGVyLCAweGZmLCBzaXplb2YoKnZsYW5fZmlsdGVyKSk7CisJcmV0dXJuIG10bmljX2NtZChwcml2LT5tdG5pYywgTlVMTCwgTlVMTCwgcG9ydCArIDEsCisJCQkgTVROSUNfSUZfQ01EX0NPTkZJR19QT1JUX1ZMQU5fRklMVEVSKTsKK30KKyovCisKKworc3RhdGljIGludAorbXRuaWNfUkVMRUFTRV9SRVNPVVJDRShzdHJ1Y3QgbXRuaWNfcG9ydCAqcHJpdiwgdTggcG9ydCwgdTggdHlwZSwgdTggaW5kZXgpCit7CisJc3RydWN0IG10bmljX2lmX3JlbGVhc2VfcmVzb3VyY2VfaW5faW1tIHJlbDsKKwltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mIHJlbCk7CisJcmVsLmluZGV4ID0gaW5kZXg7CisJcmVsLnR5cGUgPSB0eXBlOworCXJldHVybiBtdG5pY19jbWQgKCBwcml2LT5tdG5pYywKKwkJCSAgICZyZWwsIE5VTEwsICggdHlwZSA9PSBNVE5JQ19JRl9SRVNPVVJDRV9UWVBFX0VRICkgPworCQkJICAgMCA6IHBvcnQgKyAxLCBNVE5JQ19JRl9DTURfUkVMRUFTRV9SRVNPVVJDRSApOworfQorCisKK3N0YXRpYyBpbnQKK210bmljX1FVRVJZX0NBUChzdHJ1Y3QgbXRuaWMgKm10bmljLCB1OCBpbmRleCwgdTggbW9kLCB1NjQgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgbXRuaWNfaWZfcXVlcnlfY2FwX2luX2ltbSBjYXA7CisJdTMyIG91dF9pbW1bMl07CisJaW50IGVycjsKKworCW1lbXNldCgmY2FwLCAwLCBzaXplb2YgY2FwKTsKKwljYXAuY2FwX2luZGV4ID0gaW5kZXg7CisJY2FwLmNhcF9tb2RpZmllciA9IG1vZDsKKwllcnIgPSBtdG5pY19jbWQobXRuaWMsICZjYXAsICZvdXRfaW1tLCAwLCBNVE5JQ19JRl9DTURfUVVFUllfQ0FQKTsKKworCSooKHUzMiopcmVzdWx0KSA9IGJlMzJfdG9fY3B1KCoob3V0X2ltbSsxKSk7CisJKigodTMyKilyZXN1bHQgKyAxKSA9IGJlMzJfdG9fY3B1KCpvdXRfaW1tKTsKKworCURCRygiQ2FsbGVkIFF1ZXJ5IGNhcCB3aXRoIGluZGV4OjB4JXggbW9kOiVkIHJlc3VsdDoweCVsbHgiCisJICAgICIgZXJyb3I6JWRcbiIsIGluZGV4LCBtb2QsICpyZXN1bHQsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworCisjZGVmaW5lIERPX1FVRVJZX0NBUChjYXAsIG1vZCwgdmFyKQkJCQlcCisJCWVyciA9IG10bmljX1FVRVJZX0NBUChtdG5pYywgY2FwLCBtb2QsICZyZXN1bHQpO1wKKwkJaWYgKGVycikJCQkJCVwKKwkJCXJldHVybiBlcnI7CQkJCVwKKwkJKHZhcikgPSByZXN1bHQKKworc3RhdGljIGludAorbXRuaWNfcXVlcnlfbnVtX3BvcnRzKHN0cnVjdCBtdG5pYyAqbXRuaWMpCit7CisJaW50IGVyciA9IDA7CisJdTY0IHJlc3VsdDsKKworCURPX1FVRVJZX0NBUChNVE5JQ19JRl9DQVBfTlVNX1BPUlRTLCAwLCBtdG5pYy0+ZncubnVtX3BvcnRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittdG5pY19xdWVyeV9tYWMoc3RydWN0IG10bmljICptdG5pYykKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgaTsKKwl1NjQgcmVzdWx0OworCisJZm9yIChpID0gMDsgaSA8IG10bmljLT5mdy5udW1fcG9ydHM7IGkrKykgeworCQlET19RVUVSWV9DQVAoTVROSUNfSUZfQ0FQX0RFRkFVTFRfTUFDLCBpICsgMSwgbXRuaWMtPmZ3Lm1hY1tpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK210bmljX3F1ZXJ5X29mZnNldHMoc3RydWN0IG10bmljICptdG5pYykKK3sKKwlpbnQgZXJyOworCWludCBpOworCXU2NCByZXN1bHQ7CisKKwlET19RVUVSWV9DQVAoTVROSUNfSUZfQ0FQX01FTV9LRVksCisJCSAgICAgTVROSUNfSUZfTUVNX1RZUEVfU05PT1AsCisJCSAgICAgbXRuaWMtPmZ3Lm1lbV90eXBlX3Nub29wX2JlKTsKKwltdG5pYy0+ZncubWVtX3R5cGVfc25vb3BfYmUgPSBjcHVfdG9fYmUzMihtdG5pYy0+ZncubWVtX3R5cGVfc25vb3BfYmUpOworCURPX1FVRVJZX0NBUChNVE5JQ19JRl9DQVBfVFhfQ1FfREJfT0ZGU0VULCAwLCBtdG5pYy0+ZncudHhjcV9kYl9vZmZzZXQpOworCURPX1FVRVJZX0NBUChNVE5JQ19JRl9DQVBfRVFfREJfT0ZGU0VULCAwLCBtdG5pYy0+ZncuZXFfZGJfb2Zmc2V0KTsKKworCWZvciAoaSA9IDA7IGkgPCBtdG5pYy0+ZncubnVtX3BvcnRzOyBpKyspIHsKKwkJRE9fUVVFUllfQ0FQKE1UTklDX0lGX0NBUF9DUV9PRkZTRVQsIGkgKyAxLCBtdG5pYy0+ZncuY3Ffb2Zmc2V0KTsKKwkJRE9fUVVFUllfQ0FQKE1UTklDX0lGX0NBUF9UWF9PRkZTRVQsIGkgKyAxLCBtdG5pYy0+ZncudHhfb2Zmc2V0W2ldKTsKKwkJRE9fUVVFUllfQ0FQKE1UTklDX0lGX0NBUF9SWF9PRkZTRVQsIGkgKyAxLCBtdG5pYy0+Zncucnhfb2Zmc2V0W2ldKTsKKwkJREJHKCItLT4gUG9ydCAlZCBDUSBvZmZzZXQ6MHgleFxuIiwgaSwgbXRuaWMtPmZ3LmNxX29mZnNldCk7CisJCURCRygiLS0+IFBvcnQgJWQgVHggb2Zmc2V0OjB4JXhcbiIsIGksIG10bmljLT5mdy50eF9vZmZzZXRbaV0pOworCQlEQkcoIi0tPiBQb3J0ICVkIFJ4IG9mZnNldDoweCV4XG4iLCBpLCBtdG5pYy0+Zncucnhfb2Zmc2V0W2ldKTsKKwl9CisKKwltZGVsYXkoMjApOworCXJldHVybiAwOworfQorCisKKworCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKglNVE5JQyBpbml0YWxpemF0aW9uIGZ1bmN0aW9ucworKgorKgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFJlc2V0IGRldmljZQorICovCit2b2lkCittdG5pY19yZXNldCAoIHZvaWQgKQoreworCXZvaWQgKnJlc2V0ID0gaW9yZW1hcCAoIG10bmljX3BjaV9kZXYuZGV2LmJhclswXSArIE1UTklDX1JFU0VUX09GRlNFVCwKKwkJCQk0ICk7CisJd3JpdGVsICggY3B1X3RvX2JlMzIgKCAxICksIHJlc2V0ICk7CisJaW91bm1hcCAoIHJlc2V0ICk7Cit9CisKKworLyoqCisgKiBSZXN0b3JlIFBDSSBjb25maWcKKyAqLworc3RhdGljIGludAorcmVzdG9yZV9jb25maWcodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkgeworCQlpZiAoaSAhPSAyMiAmJiBpICE9IDIzKSB7CisJCQlyYyA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQobXRuaWNfcGNpX2Rldi5kZXYuZGV2LAorCQkJCQkJICAgIGkgPDwgMiwKKwkJCQkJCSAgICBtdG5pY19wY2lfZGV2LmRldi4KKwkJCQkJCSAgICBkZXZfY29uZmlnX3NwYWNlW2ldKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworCisvKioKKyAqIEluaXQgUENJIGNvbmZpZ3VyYXRpb24KKyAqLworc3RhdGljIGludAorbXRuaWNfaW5pdF9wY2koc3RydWN0IHBjaV9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlpbnQgZXJyOworCisJLyogc2F2ZSBiYXJzICovCisJREJHKCJidXM9JWQgZGV2Zm49MHgleFxuIiwgZGV2LT5idXMsIGRldi0+ZGV2Zm4pOworCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsKKwkJbXRuaWNfcGNpX2Rldi5kZXYuYmFyW2ldID0KKwkJcGNpX2Jhcl9zdGFydChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCArIChpIDw8IDIpKTsKKwkJREJHKCJiYXJbJWRdPSAweCUwOGx4IFxuIiwgaSwgbXRuaWNfcGNpX2Rldi5kZXYuYmFyW2ldKTsKKwl9CisKKwkvKiBzYXZlIGNvbmZpZyBzcGFjZSAqLworCWZvciAoaSA9IDA7IGkgPCA2NDsgKytpKSB7CisJCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGkgPDwgMiwKKwkJCQkJICAgICZtdG5pY19wY2lfZGV2LmRldi4KKwkJCQkJICAgIGRldl9jb25maWdfc3BhY2VbaV0pOworCQlpZiAoZXJyKSB7CisJCQlEQkcoIkNhbiBub3Qgc2F2ZSBjb25maWd1cmF0aW9uIHNwYWNlIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJbXRuaWNfcGNpX2Rldi5kZXYuZGV2ID0gZGV2OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEluaXRpYWwgaGFyZHdhcmUKKyAqLworc3RhdGljIGlubGluZQoraW50IG10bmljX2luaXRfY2FyZChzdHJ1Y3QgbXRuaWMgKm10bmljKQoreworCWludCBlcnIgPSAwOworCisKKwkvKiBBbGxvYyBjb21tYW5kIGludGVyZmFjZSAqLworCWVyciA9IG10bmljX2FsbG9jX2NtZGlmICggbXRuaWMgKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRmFpbGVkIHRvIGluaXQgY29tbWFuZCBpbnRlcmZhY2UsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKworCisJLyoqCisJKiBCcmluZyB1cCBIVworCSovCisJZXJyID0gbXRuaWNfUVVFUllfRlcgKCBtdG5pYyApOworCWlmIChlcnIpIHsKKwkJREJHKCJRVUVSWV9GVyBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmdcbiIpOworCQlnb3RvIGNtZF9lcnJvcjsKKwl9CisJREJHKCJDb21tYW5kIGludGVyZmFjZSByZXZpc2lvbjolZFxuIiwgbXRuaWMtPmZ3LmlmY19yZXYpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBGVyBhbmQgc3RhcnQgaXQgKi8KKwllcnIgPSBtdG5pY19tYXBfY21kKG10bmljLCBNVE5JQ19JRl9DTURfTUFQX0ZXLCBtdG5pYy0+ZncuZndfcGFnZXMpOworCWlmIChlcnIpIHsKKwkJREJHKCJFcm9yIEluIE1BUF9GV1xuIik7CisJCWlmIChtdG5pYy0+ZncuZndfcGFnZXMuYnVmKQorCQkJdWZyZWUoKGludHB0cl90KW10bmljLT5mdy5md19wYWdlcy5idWYpOworCQlnb3RvIGNtZF9lcnJvcjsKKwl9CisKKwkvKiBSdW4gZmlybXdhcmUgKi8KKwllcnIgPSBtdG5pY19jbWQobXRuaWMsIE5VTEwsIE5VTEwsIDAsIE1UTklDX0lGX0NNRF9SVU5fRlcpOworCWlmIChlcnIpIHsKKwkJREJHKCJFcm9yIEluIFJVTiBGV1xuIik7CisJCWdvdG8gbWFwX2Z3X2Vycm9yOworCX0KKworCURCRygiRlcgdmVyc2lvbjolZC4lZC4lZFxuIiwKKwkgICAgKHUxNikgKG10bmljLT5md192ZXIgPj4gMzIpLAorCSAgICAodTE2KSAoKG10bmljLT5md192ZXIgPj4gMTYpICYgMHhmZmZmKSwKKwkgICAgKHUxNikgKG10bmljLT5md192ZXIgJiAweGZmZmYpKTsKKworCisJLyogUXVlcnkgbnVtIHBvcnRzICovCisJZXJyID0gbXRuaWNfcXVlcnlfbnVtX3BvcnRzKG10bmljKTsKKwlpZiAoZXJyKSB7CisJCURCRygiSW5zdWZmaWNpZW50IHJlc291cmNlcywgYWJvcnRpbmdcbiIpOworCQlnb3RvIG1hcF9md19lcnJvcjsKKwl9CisKKwkvKiBPcGVuIE5JQyAqLworCWVyciA9IG10bmljX09QRU5fTklDKG10bmljKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRmFpbGVkIG9wZW5pbmcgTklDLCBhYm9ydGluZ1xuIik7CisJCWdvdG8gbWFwX2Z3X2Vycm9yOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBtYXAgcGFnZXMgd29ya3NhY2UgKi8KKwllcnIgPSBtdG5pY19tYXBfY21kKG10bmljLCBNVE5JQ19JRl9DTURfTUFQX1BBR0VTLCBtdG5pYy0+ZncuZXh0cmFfcGFnZXMpOworCWlmIChlcnIpIHsKKwkJREJHKCJDb3VsZG4ndCBhbGxvY2F0ZSAleCBGVyBleHRyYSBwYWdlcywgYWJvcnRpbmdcbiIsCisJCSAgICBtdG5pYy0+ZncuZXh0cmFfcGFnZXMubnVtKTsKKwkJaWYgKG10bmljLT5mdy5leHRyYV9wYWdlcy5idWYpCisJCQl1ZnJlZSgoaW50cHRyX3QpbXRuaWMtPmZ3LmV4dHJhX3BhZ2VzLmJ1Zik7CisJCWdvdG8gbWFwX2Z3X2Vycm9yOworCX0KKworCisJLyogR2V0IGRldmljZSBpbmZvcm1hdGlvbiAqLworCWVyciA9IG10bmljX3F1ZXJ5X21hYyhtdG5pYyk7CisJaWYgKGVycikgeworCQlEQkcoIkluc3VmZmljaWVudCByZXNvdXJjZXMgaW4gcXVlc3J5IG1hYywgYWJvcnRpbmdcbiIpOworCQlnb3RvIG1hcF9md19lcnJvcjsKKwl9CisKKwkvKiBHZXQgZGV2aWNlIG9mZnNldHMgKi8KKwllcnIgPSBtdG5pY19xdWVyeV9vZmZzZXRzKG10bmljKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRmFpbGVkIHJldHJpZXZpbmcgcmVzb3VyY2Ugb2ZmZXN0cywgYWJvcnRpbmdcbiIpOworCQl1ZnJlZSgoaW50cHRyX3QpbXRuaWMtPmZ3LmV4dHJhX3BhZ2VzLmJ1Zik7CisJCWdvdG8gbWFwX2V4dHJhX2Vycm9yOworCX0KKworCisJLyogQWxsb2MgRVEgKi8KKwllcnIgPSBtdG5pY19hbGxvY19lcShtdG5pYyk7CisJaWYgKGVycikgeworCQlEQkcoIkZhaWxlZCBpbml0IHNoYXJlZCByZXNvdXJjZXMuIGVycm9yOiAlZFxuIiwgZXJyKTsKKwkJZ290byBtYXBfZXh0cmFfZXJyb3I7CisJfQorCisJLyogQ29uZmlndXJlIEhXICovCisJZXJyID0gbXRuaWNfQ09ORklHX0VRKG10bmljKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRmFpbGVkIGNvbmZpZ3VyaW5nIEVRXG4iKTsKKwkJZ290byBlcV9lcnJvcjsKKwl9CisJZXJyID0gbXRuaWNfQ09ORklHX1JYKG10bmljKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRmFpbGVkIFJ4IGNvbmZpZ3VyYXRpb25cbiIpOworCQlnb3RvIGVxX2Vycm9yOworCX0KKwllcnIgPSBtdG5pY19DT05GSUdfVFgobXRuaWMpOworCWlmIChlcnIpIHsKKwkJREJHKCJGYWlsZWQgVHggY29uZmlndXJhdGlvblxuIik7CisJCWdvdG8gZXFfZXJyb3I7CisJfQorCisKKwlyZXR1cm4gMDsKKworCitlcV9lcnJvcjoKKwlpb3VubWFwKG10bmljLT5lcV9kYik7CisJZnJlZV9tZW1ibG9jayhtdG5pYy0+ZXEuYnVmLCBtdG5pYy0+ZXEuYnVmX3NpemUpOworbWFwX2V4dHJhX2Vycm9yOgorCXVmcmVlKChpbnRwdHJfdCltdG5pYy0+ZncuZXh0cmFfcGFnZXMuYnVmKTsKK21hcF9md19lcnJvcjoKKwl1ZnJlZSgoaW50cHRyX3QpbXRuaWMtPmZ3LmZ3X3BhZ2VzLmJ1Zik7CisKK2NtZF9lcnJvcjoKKwlpb3VubWFwKG10bmljLT5oY3IpOworCWZyZWVfbWVtYmxvY2sobXRuaWMtPmNtZC5idWYsIFBBR0VfU0laRSk7CisKKwlyZXR1cm4gLUVBRERSSU5VU0U7Cit9CisKKworCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFByb2Nlc3MgZnVuY3Rpb25zCisqCisqCXByb2Nlc3MgY29tcGxpYXRpb25zIG9mIFRYIGFuZCBSWAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG10bmljX3Byb2Nlc3NfdHhfY3Eoc3RydWN0IG10bmljX3BvcnQgKnByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IG10bmljX2NxICpjcSkKK3sKKwlzdHJ1Y3QgbXRuaWNfY3FlICpjcWUgPSBjcS0+YnVmOworCXN0cnVjdCBtdG5pY19yaW5nICpyaW5nID0gJnByaXYtPnR4X3Jpbmc7CisJdTE2IGluZGV4OworCisKKwlpbmRleCA9IGNxLT5sYXN0ICYgKGNxLT5zaXplLTEpOworCWNxZSA9ICZjcS0+YnVmW2luZGV4XTsKKworCS8qIE93bmVyIGJpdCBjaGFuZ2VzIGV2ZXJ5IHJvdW5kICovCisJd2hpbGUgKFhOT1IoY3FlLT5vcF90cl9vd24gJiBNVE5JQ19CSVRfQ1FfT1dOLCBjcS0+bGFzdCAmIGNxLT5zaXplKSkgeworCQluZXRkZXZfdHhfY29tcGxldGUgKGRldiwgcmluZy0+aW9idWZbaW5kZXhdKTsKKwkJKytjcS0+bGFzdDsKKwkJaW5kZXggPSBjcS0+bGFzdCAmIChjcS0+c2l6ZS0xKTsKKwkJY3FlID0gJmNxLT5idWZbaW5kZXhdOworCX0KKworCS8qIFVwZGF0ZSBjb25zdW1lciBpbmRleCAqLworCWNxLT5kYi0+dXBkYXRlX2NpID0gY3B1X3RvX2JlMzIoY3EtPmxhc3QgJiAweGZmZmZmZik7CisJd21iKCk7IC8qIGVuc3VyZSBIVyBzZWVzIENRIGNvbnN1bWVyIGJlZm9yZSB3ZSBwb3N0IG5ldyBidWZmZXJzICovCisJcmluZy0+Y29ucyA9IGNxLT5sYXN0OworfQorCisKK2ludCBtdG5pY19wcm9jZXNzX3J4X2NxKHN0cnVjdCBtdG5pY19wb3J0ICpwcml2LAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBtdG5pY19jcSAqY3EpCit7CisJc3RydWN0IG10bmljX2NxZSAqY3FlOworCXN0cnVjdCBtdG5pY19yaW5nICpyaW5nID0gJnByaXYtPnJ4X3Jpbmc7CisJaW50IGluZGV4OworCWludCBlcnI7CisJc3RydWN0IGlvX2J1ZmZlciAqcnhfaW9iOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisKKworCS8qIFdlIGFzc3VtZSBhIDE6MSBtYXBwaW5nIGJldHdlZW4gQ1FFcyBhbmQgUnggZGVzY3JpcHRvcnMsIHNvIFJ4CisJICogZGVzY3JpcHRvciBvZmZzZXQgY2FuIGJlIGRlZHVjZWQgZnJvbSB0aGUgQ1FFIGluZGV4IGluc3RlYWQgb2YKKwkgKiByZWFkaW5nICdjcWUtPmluZGV4JyAqLworCWluZGV4ID0gY3EtPmxhc3QgJiAoY3EtPnNpemUtMSk7CisJY3FlID0gJmNxLT5idWZbaW5kZXhdOworCisJLyogUHJvY2VzcyBhbGwgY29tcGxldGVkIENRRXMgKi8KKwl3aGlsZSAoWE5PUihjcWUtPm9wX3RyX293biAmIE1UTklDX0JJVF9DUV9PV04sIGNxLT5sYXN0ICYgY3EtPnNpemUpKSB7CisJCS8qIERyb3AgcGFja2V0IG9uIGJhZCByZWNlaXZlIG9yIGJhZCBjaGVja3N1bSAqLworCQlpZiAoKGNxZS0+b3BfdHJfb3duICYgMHgxZikgPT0gTVROSUNfT1BDT0RFX0VSUk9SKSB7CisJCQlEQkcoIkNRRSBjb21wbGV0ZWQgd2l0aCBlcnJvciAtIHZlbmRvciBcbiIpOworCQkJZnJlZV9pb2IocmluZy0+aW9idWZbaW5kZXhdKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQlpZiAoY3FlLT5lbmNfYmYgJiBNVE5JQ19CSVRfQkFEX0ZDUykgeworCQkJREJHKCJBY2NlcHRlZCBwYWNrZXQgd2l0aCBiYWQgRkNTXG4iKTsKKwkJCWZyZWVfaW9iKHJpbmctPmlvYnVmW2luZGV4XSk7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQkvKgorCQkgKiBQYWNrZXQgaXMgT0sgLSBwcm9jZXNzIGl0LgorCQkgKi8KKwkJbGVuZ3RoID0gYmUzMl90b19jcHUoY3FlLT5ieXRlX2NudCk7CisJCXJ4X2lvYiA9IHJpbmctPmlvYnVmW2luZGV4XTsKKwkJaW9iX3B1dChyeF9pb2IsIGxlbmd0aCk7CisKKwkJLyogQWRkIHRoaXMgcGFja2V0IHRvIHRoZSByZWNlaXZlIHF1ZXVlLiAqLworCQluZXRkZXZfcngoZGV2LCByeF9pb2IpOworCQlyaW5nLT5pb2J1ZltpbmRleF0gPSBOVUxMOworCituZXh0OgorCQkrK2NxLT5sYXN0OworCQlpbmRleCA9IGNxLT5sYXN0ICYgKGNxLT5zaXplLTEpOworCQljcWUgPSAmY3EtPmJ1ZltpbmRleF07CisKKworCisJfQorCisJLyogVXBkYXRlIGNvbnN1bWVyIGluZGV4ICovCisJY3EtPmRiLT51cGRhdGVfY2kgPSBjcHVfdG9fYmUzMihjcS0+bGFzdCAmIDB4ZmZmZmZmKTsKKwl3bWIoKTsgLyogZW5zdXJlIEhXIHNlZXMgQ1EgY29uc3VtZXIgYmVmb3JlIHdlIHBvc3QgbmV3IGJ1ZmZlcnMgKi8KKwlyaW5nLT5jb25zID0gY3EtPmxhc3Q7CisKKwlpZiAocmluZy0+cHJvZCAtIHJpbmctPmNvbnMgPCAoTUFYX0dBUF9QUk9EX0NPTlMpKSB7CisJCWVyciA9IG10bmljX2FsbG9jX2lvYnVmKHByaXYsICZwcml2LT5yeF9yaW5nLCBERUZfSU9CVUZfU0laRSk7CisJCWlmIChlcnIpIHsKKwkJCURCRygiRVJST1IgQWxsb2NhdGluZyBpbyBidWZmZXIiKTsKKwkJCXJldHVybiAtRUFERFJJTlVTRTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogbmV0X2RldmljZSBmdW5jdGlvbnMKKyoKKyoKKyoJb3BlbiwgcG9sbCwgY2xvc2UsIHByb2JlLCBkaXNhYmxlLCBpcnEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK210bmljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXRuaWNfcG9ydCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgbXRuaWNfcmluZyAqcmluZzsKKwlzdHJ1Y3QgbXRuaWNfY3EgKmNxOworCWludCBjcV9pbmQgPSAwOworCXUzMiBkZXZfbGlua19zdGF0ZTsKKwlpbnQgbGlua19jaGVjazsKKworCURCRygic3RhcnRpbmcgcG9ydDolZCwgTUFDIEFkZHJlc3M6IDB4JTEybGx4XG4iLAorCSAgICBwcml2LT5wb3J0LCBwcml2LT5tdG5pYy0+ZncubWFjW3ByaXYtPnBvcnRdKTsKKworCS8qIEFsbG9jIGFuZCBjb25maWd1cmUgQ1FzLCBUWCwgUlggKi8KKwllcnIgPSBtdG5pY19hbGxvY19yZXNvdXJjZXMgKCBkZXYgKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRXJyb3IgYWxsb2NhdGluZyByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJfQorCisJLyogUGFzcyBDUXMgY29uZmlndXJhdGlvbiB0byBIVyAqLworCWZvciAoY3FfaW5kID0gMDsgY3FfaW5kIDwgTlVNX0NRUzsgKytjcV9pbmQpIHsKKwkJY3EgPSAmcHJpdi0+Y3FbY3FfaW5kXTsKKwkJZXJyID0gbXRuaWNfQ09ORklHX0NRKHByaXYsIHByaXYtPnBvcnQsIGNxX2luZCwgY3EpOworCQlpZiAoZXJyKSB7CisJCQlEQkcoIkZhaWxlZCBjb25maWd1cmluZyBDUTolZCBlcnJvciAlZFxuIiwKKwkJCSAgICBjcV9pbmQsIGVycik7CisJCQlpZiAoY3FfaW5kKQorCQkJCWdvdG8gY3FfZXJyb3I7CisJCQllbHNlCisJCQkJZ290byBhbGxvY2F0aW9uX2Vycm9yOworCQl9CisJCS8qIFVwZGF0ZSBjb25zdW1lciBpbmRleCAqLworCQljcS0+ZGItPnVwZGF0ZV9jaSA9IGNwdV90b19iZTMyKGNxLT5sYXN0ICYgMHhmZmZmZmYpOworCX0KKworCisKKwkvKiBQYXNzIFR4IGNvbmZpZ3VyYXRpb24gdG8gSFcgKi8KKwlyaW5nID0gJnByaXYtPnR4X3Jpbmc7CisJZXJyID0gbXRuaWNfQ09ORklHX1RYX1JJTkcocHJpdiwgcHJpdi0+cG9ydCwgMCwgcmluZyk7CisJaWYgKGVycikgeworCQlEQkcoIkZhaWxlZCBjb25maWd1cmluZyBUeCByaW5nOjBcbiIpOworCQlnb3RvIGNxX2Vycm9yOworCX0KKworCS8qIFBhc3MgUlggY29uZmlndXJhdGlvbiB0byBIVyAqLworCXJpbmcgPSAmcHJpdi0+cnhfcmluZzsKKwllcnIgPSBtdG5pY19DT05GSUdfUlhfUklORyhwcml2LCBwcml2LT5wb3J0LCAwLCByaW5nKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRmFpbGVkIGNvbmZpZ3VyaW5nIFJ4IHJpbmc6MFxuIik7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJLyogQ29uZmlndXJlIFJ4IHN0ZWVyaW5nICovCisJZXJyID0gbXRuaWNfQ09ORklHX1BPUlRfUlNTX1NURUVSKHByaXYsIHByaXYtPnBvcnQpOworCWlmICghZXJyKQorCQllcnIgPSBtdG5pY19TRVRfUE9SVF9SU1NfSU5ESVJFQ1RJT04ocHJpdiwgcHJpdi0+cG9ydCk7CisJaWYgKGVycikgeworCQlEQkcoIkZhaWxlZCBjb25maWd1cmluZyBSU1Mgc3RlZXJpbmdcbiIpOworCQlnb3RvIHJ4X2Vycm9yOworCX0KKworCisJLyogU2V0IHRoZSBwb3J0IGRlZmF1bHQgcmluZyB0byByaW5nIDAgKi8KKwllcnIgPSBtdG5pY19TRVRfUE9SVF9ERUZBVUxUX1JJTkcocHJpdiwgcHJpdi0+cG9ydCwgMCk7CisJaWYgKGVycikgeworCQlEQkcoIkZhaWxlZCBzZXR0aW5nIGRlZmF1bHQgcmluZ1xuIik7CisJCWdvdG8gcnhfZXJyb3I7CisJfQorCisJLyogU2V0IE1hYyBhZGRyZXNzICovCisJZXJyID0gbXRuaWNfU0VUX1JYX1JJTkdfQUREUihwcml2LCBwcml2LT5wb3J0LCAmcHJpdi0+bXRuaWMtPmZ3Lm1hY1twcml2LT5wb3J0XSk7CisJaWYgKGVycikgeworCQlEQkcoIkZhaWxlZCBzZXR0aW5nIGRlZmF1bHQgTUFDIGFkZHJlc3NcbiIpOworCQlnb3RvIHJ4X2Vycm9yOworCX0KKworCS8qIFNldCBNVFUgICovCisJZXJyID0gbXRuaWNfU0VUX1BPUlRfTVRVKHByaXYsIHByaXYtPnBvcnQsIERFRl9NVFUpOworCWlmIChlcnIpIHsKKwkJREJHKCJGYWlsZWQgc2V0dGluZyBNVFVcbiIpOworCQlnb3RvIHJ4X2Vycm9yOworCX0KKworCS8qIENvbmZpZ3VyZSBWTEFOIGZpbHRlciAqLworCS8qIEJ5IGFkZGluZyB0aGlzIGZ1bmN0aW9uLCBUaGUgc2Vjb25kIHBvcnQgd29uJ3QgYWNjZXB0IHBhY2tldHMKKwllcnIgPSBtdG5pY19DT05GSUdfUE9SVF9WTEFOX0ZJTFRFUihwcml2LCBwcml2LT5wb3J0KTsKKwlpZiAoZXJyKSB7CisJCURCRygiRmFpbGVkIGNvbmZpZ3VyaW5nIFZMQU4gZmlsdGVyXG4iKTsKKwkJZ290byByeF9lcnJvcjsKKwl9CisJKi8KKworCisJLyogQnJpbmcgdXAgcGh5c2ljYWwgbGluayAqLworCWVyciA9IG10bmljX1NFVF9QT1JUX1NUQVRFKHByaXYsIHByaXYtPnBvcnQsIDEpOworCWlmIChlcnIpIHsKKwkJREJHKCJGYWlsZWQgYnJpbmdpbmcgdXAgcG9ydFxuIik7CisJCWdvdG8gcnhfZXJyb3I7CisJfQorCisJLyogUE9SVCBJUyBVUCAqLworCXByaXYtPnN0YXRlID0gQ0FSRF9VUDsKKworCisJLyogQ2hlY2tpbmcgTGluayBpcyB1cCAqLworCURCRyAoICJDaGVja2luZyBpZiBsaW5rIGlzIHVwXG4iICk7CisKKworCWZvciAoIGxpbmtfY2hlY2sgPSAwOyBsaW5rX2NoZWNrIDwgQ0hFQ0tfTElOS19USU1FUzsgbGlua19jaGVjayArKyApIHsKKwkJLyogTGV0IGxpbmsgc3RhdGUgc3RhYmlsaXplIGlmIGNhYmxlIHdhcyBjb25uZWN0ZWQgKi8KKwkJbWRlbGF5ICggREVMQVlfTElOS19DSEVDSyApOworCisJCWVyciA9IG10bmljX0hFQVJUX0JFQVQocHJpdiwgJmRldl9saW5rX3N0YXRlKTsKKwkJaWYgKGVycikgeworCQkJREJHKCJGYWlsZWQgZ2V0dGluZyBkZXZpY2UgbGluayBzdGF0ZVxuIik7CisJCQlyZXR1cm4gLUVORVRET1dOOworCQl9CisKKwkJaWYgKCBkZXZfbGlua19zdGF0ZSAmIHByaXYtPnBvcnQgKSB7CisJCQkvKiBMaW5rIGlzIHVwICovCisJCQlicmVhazsKKwkJfQorCX0KKworCisJaWYgKCAhICggZGV2X2xpbmtfc3RhdGUgJiAweDMgKSApIHsKKwkJREJHKCJMaW5rIGRvd24sIGNoZWNrIGNhYmxlcyBhbmQgcmVzdGFydFxuIik7CisJCW5ldGRldl9saW5rX2Rvd24gKCBkZXYgKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlEQkcgKCAiTGluayBpcyB1cCFcbiIgKTsKKworCS8qIE1hcmsgYXMgbGluayB1cCAqLworCW5ldGRldl9saW5rX3VwICggZGV2ICk7CisKKwlyZXR1cm4gMDsKKworcnhfZXJyb3I6CisJZXJyID0gbXRuaWNfUkVMRUFTRV9SRVNPVVJDRShwcml2LCBwcml2LT5wb3J0LAorCQkJCSAgICAgTVROSUNfSUZfUkVTT1VSQ0VfVFlQRV9SWF9SSU5HLCAwKTsKK3R4X2Vycm9yOgorCWVyciB8PSBtdG5pY19SRUxFQVNFX1JFU09VUkNFKHByaXYsIHByaXYtPnBvcnQsCisJCQkJICAgICAgTVROSUNfSUZfUkVTT1VSQ0VfVFlQRV9UWF9SSU5HLCAwKTsKKworY3FfZXJyb3I6CisJd2hpbGUgKGNxX2luZCkgeworCQllcnIgfD0gbXRuaWNfUkVMRUFTRV9SRVNPVVJDRShwcml2LCBwcml2LT5wb3J0LAorCQkJCQkgICAgICBNVE5JQ19JRl9SRVNPVVJDRV9UWVBFX0NRLCAtLWNxX2luZCk7CisJfQorCWlmIChlcnIpCisJCURCRygiRXJvciBSZWxlYXNpbmcgcmVzb3VyY2VzXG4iKTsKKworYWxsb2NhdGlvbl9lcnJvcjoKKworCWZyZWVfbWVtYmxvY2socHJpdi0+dHhfcmluZy5idWYsIHByaXYtPnR4X3JpbmcuYnVmX3NpemUpOworCWlvdW5tYXAocHJpdi0+dHhfcmluZy50eGNxX2RiKTsKKwlmcmVlX21lbWJsb2NrKHByaXYtPmNxWzFdLmJ1ZiwgcHJpdi0+Y3FbMV0uYnVmX3NpemUpOworCWZyZWVfbWVtYmxvY2socHJpdi0+Y3FbMV0uZGIsIHNpemVvZihzdHJ1Y3QgbXRuaWNfY3FfZGJfcmVjb3JkKSk7CisJZnJlZV9tZW1ibG9jayhwcml2LT5yeF9yaW5nLmJ1ZiwgcHJpdi0+cnhfcmluZy5idWZfc2l6ZSk7CisJZnJlZV9tZW1ibG9jayhwcml2LT5yeF9yaW5nLmRiLCBzaXplb2Yoc3RydWN0IG10bmljX2NxX2RiX3JlY29yZCkpOworCWZyZWVfbWVtYmxvY2socHJpdi0+Y3FbMF0uYnVmLCBwcml2LT5jcVswXS5idWZfc2l6ZSk7CisJZnJlZV9tZW1ibG9jayhwcml2LT5jcVswXS5kYiwgc2l6ZW9mKHN0cnVjdCBtdG5pY19jcV9kYl9yZWNvcmQpKTsKKworCW10bmljX2ZyZWVfaW9fYnVmZmVycygmcHJpdi0+cnhfcmluZyk7CisKKwlyZXR1cm4gLUVORVRET1dOOworfQorCisKKworCisvKiogQ2hlY2sgaWYgd2UgZ290IGNvbXBsZXRpb24gZm9yIHJlY2VpdmUgYW5kIHRyYW5zbWl0IGFuZAorICogY2hlY2sgdGhlIGxpbmUgd2l0aCBoZWFydF9iaXQgY29tbWFuZCAqLworc3RhdGljIHZvaWQKK210bmljX3BvbGwgKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3QgbXRuaWNfcG9ydCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG10bmljX2NxICpjcTsKKwl1MzIgZGV2X2xpbmtfc3RhdGU7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEluIGNhc2Ugb2YgYW4gb2xkIGVycm9yIHRoZW4gcmV0dXJuICovCisJaWYgKHByaXYtPnN0YXRlICE9IENBUkRfVVApCisJCXJldHVybjsKKworCS8qIFdlIGRvIG5vdCBjaGVjayB0aGUgZGV2aWNlIGV2ZXJ5IGNhbGwgX3BvbGwgY2FsbCwKKwkgICAgc2luY2UgaXQgd2lsbCBzbG93IGl0IGRvd24gKi8KKwlpZiAoKHByaXYtPnBvbGxfY291bnRlciAlIFJPVU5EX1RPX0NIRUNLKSA9PSAwKSB7CisJCS8qIENoZWNrIGRldmljZSAqLworCQllcnIgPSBtdG5pY19IRUFSVF9CRUFUKHByaXYsICZkZXZfbGlua19zdGF0ZSk7CisJCWlmIChlcnIpIHsKKwkJCURCRygiRGV2aWNlIGhhcyBpbnRlcm5hbCBlcnJvclxuIik7CisJCQlwcml2LT5zdGF0ZSA9IENBUkRfTElOS19ET1dOOworCQkJcmV0dXJuOworCQl9CisJCWlmICghKGRldl9saW5rX3N0YXRlICYgMHgzKSkgeworCQkJREJHKCJMaW5rIGRvd24sIGNoZWNrIGNhYmxlcyBhbmQgcmVzdGFydFxuIik7CisJCQlwcml2LT5zdGF0ZSA9IENBUkRfTElOS19ET1dOOworCQkJcmV0dXJuOworCQl9CisJfQorCS8qIFBvbGxpbmcgQ1EgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NRUzsgaSsrKSB7CisJCWNxID0gJnByaXYtPmNxW2ldOyAvL1Bhc3Npbmcgb24gdGhlIDIgY3FzLgorCisJCWlmIChjcS0+aXNfcngpIHsKKwkJCWVyciA9IG10bmljX3Byb2Nlc3NfcnhfY3EocHJpdiwgY3EtPmRldiwgY3EpOworCQkJaWYgKGVycikgeworCQkJCXByaXYtPnN0YXRlID0gQ0FSRF9MSU5LX0RPV047CisJCQkJREJHKCIgRXJyb3IgYWxsb2NhdGluZyBSWCBidWZmZXJzXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisJCQltdG5pY19wcm9jZXNzX3R4X2NxKHByaXYsIGNxLT5kZXYsIGNxKTsKKwkJfQorCX0KKwkrKyBwcml2LT5wb2xsX2NvdW50ZXI7Cit9CisKKworCitzdGF0aWMgaW50CittdG5pY190cmFuc21pdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKQoreworCisJc3RydWN0IG10bmljX3BvcnQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtdG5pY19yaW5nICpyaW5nOworCXN0cnVjdCBtdG5pY190eF9kZXNjICp0eF9kZXNjOworCXN0cnVjdCBtdG5pY19kYXRhX3NlZyAqZGF0YTsKKwl1MzIgaW5kZXg7CisKKwkvKiBJbiBjYXNlIG9mIGFuIGVycm9yIHRoZW4gcmV0dXJuICovCisJaWYgKHByaXYtPnN0YXRlICE9IENBUkRfVVApCisJCXJldHVybiAtRU5FVERPV047CisKKwlyaW5nID0gJnByaXYtPnR4X3Jpbmc7CisKKwlpbmRleCA9IHJpbmctPnByb2QgJiByaW5nLT5zaXplX21hc2s7CisJaWYgKChyaW5nLT5wcm9kIC0gcmluZy0+Y29ucykgPj0gcmluZy0+c2l6ZSkgeworCQlEQkcoIk5vIHNwYWNlIGxlZnQgZm9yIGRlc2NyaXB0b3JzISEhIGNvbnM6ICV4IHByb2Q6ICV4XG4iLAorCQkgICAgcmluZy0+Y29ucywgcmluZy0+cHJvZCk7CisJCW1kZWxheSg1KTsKKwkJcmV0dXJuIC1FQUdBSU47Lyogbm8gc3BhY2UgbGVmdCAqLworCX0KKworCS8qIGdldCBjdXJyZW50IGRlc2NyaXB0b3IgKi8KKwl0eF9kZXNjID0gcmluZy0+YnVmICsgKGluZGV4ICogc2l6ZW9mKHN0cnVjdCBtdG5pY190eF9kZXNjKSk7CisKKwkvKiBQcmVwYXJlIERhdGEgU2VnICovCisJZGF0YSA9ICZ0eF9kZXNjLT5kYXRhOworCWRhdGEtPmFkZHJfbCA9IGNwdV90b19iZTMyKCh1MzIpdmlydF90b19idXMoaW9idWYtPmRhdGEpKTsKKwlkYXRhLT5jb3VudCA9IGNwdV90b19iZTMyKGlvYl9sZW4oaW9idWYpKTsKKwlkYXRhLT5tZW1fdHlwZSA9IHByaXYtPm10bmljLT5mdy5tZW1fdHlwZV9zbm9vcF9iZTsKKworCS8qIFByZXBhcmUgY3RybCBzZWdlbWVudCAqLworCXR4X2Rlc2MtPmN0cmwuc2l6ZV92bGFuID0gY3B1X3RvX2JlMzIoMik7CisJdHhfZGVzYy0+Y3RybC5mbGFncyA9IGNwdV90b19iZTMyKE1UTklDX0JJVF9UWF9DT01QIHwKKwkJCQkJICBNVE5JQ19CSVRfTk9fSUNSQyk7CisJdHhfZGVzYy0+Y3RybC5vcF9vd24gPSBjcHVfdG9fYmUzMihNVE5JQ19PUENPREVfU0VORCkgfAorCQkJICAgICAgICgocmluZy0+cHJvZCAmIHJpbmctPnNpemUpID8KKwkJCQljcHVfdG9fYmUzMihNVE5JQ19CSVRfREVTQ19PV04pIDogMCk7CisKKwkvKiBBdHRhY2ggaW9fYnVmZmVyICovCisJcmluZy0+aW9idWZbaW5kZXhdID0gaW9idWY7CisKKwkvKiBVcGRhdGUgcHJvZHVjZXIgaW5kZXggKi8KKwkrK3JpbmctPnByb2Q7CisKKwkvKiBSaW5nIGRvb3JiZWxsISAqLworCXdtYigpOworCXdyaXRlbCgodTMyKSByaW5nLT5kYl9vZmZzZXQsICZyaW5nLT50eGNxX2RiLT5zZW5kX2RiKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCittdG5pY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdG5pY19wb3J0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKwlEQkcoIkNsb3NlIGNhbGxlZCBmb3IgcG9ydDolZFxuIiwgcHJpdi0+cG9ydCk7CisKKwlpZiAoICggcHJpdi0+c3RhdGUgPT0gQ0FSRF9VUCApIHx8CisJICAgICAoIHByaXYtPnN0YXRlID09IENBUkRfTElOS19ET1dOICkgKSB7CisKKwkJLyogRGlzYWJsZSBwb3J0ICovCisJCWVyciB8PSBtdG5pY19TRVRfUE9SVF9TVEFURShwcml2LCBwcml2LT5wb3J0LCAwKTsKKwkJLyoKKwkJICogU3RvcCBIVyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwb3J0CisJCSAqLworCQltZGVsYXkoNSk7CisKKwkJLyogU3RvcCBSWCAqLworCQllcnIgfD0gbXRuaWNfUkVMRUFTRV9SRVNPVVJDRShwcml2LCBwcml2LT5wb3J0LAorCQkJCQkgICAgICBNVE5JQ19JRl9SRVNPVVJDRV9UWVBFX1JYX1JJTkcsIDApOworCisJCS8qIFN0b3AgVFggKi8KKwkJZXJyIHw9IG10bmljX1JFTEVBU0VfUkVTT1VSQ0UocHJpdiwgcHJpdi0+cG9ydCwKKwkJCQkJICAgICAgTVROSUNfSUZfUkVTT1VSQ0VfVFlQRV9UWF9SSU5HLCAwKTsKKworCQkvKiBTdG9wIENRcyAqLworCQllcnIgfD0gbXRuaWNfUkVMRUFTRV9SRVNPVVJDRShwcml2LCBwcml2LT5wb3J0LAorCQkJCQkgICAgICBNVE5JQ19JRl9SRVNPVVJDRV9UWVBFX0NRLCAwKTsKKwkJZXJyIHw9IG10bmljX1JFTEVBU0VfUkVTT1VSQ0UocHJpdiwgcHJpdi0+cG9ydCwKKwkJCQkJICAgICAgTVROSUNfSUZfUkVTT1VSQ0VfVFlQRV9DUSwgMSk7CisJCWlmIChlcnIpIHsKKwkJCURCRygiQ2xvc2UgcmVwb3J0ZWQgZXJyb3IgJWRcbiIsIGVycik7CisJCX0KKworCQltZGVsYXkgKCAxMCApOworCisJCS8qIGZyZWUgbWVtb3J5ICovCisJCWZyZWVfbWVtYmxvY2socHJpdi0+dHhfcmluZy5idWYsIHByaXYtPnR4X3JpbmcuYnVmX3NpemUpOworCQlpb3VubWFwKHByaXYtPnR4X3JpbmcudHhjcV9kYik7CisJCWZyZWVfbWVtYmxvY2socHJpdi0+Y3FbMV0uYnVmLCBwcml2LT5jcVsxXS5idWZfc2l6ZSk7CisJCWZyZWVfbWVtYmxvY2socHJpdi0+Y3FbMV0uZGIsIHNpemVvZihzdHJ1Y3QgbXRuaWNfY3FfZGJfcmVjb3JkKSk7CisJCWZyZWVfbWVtYmxvY2socHJpdi0+cnhfcmluZy5idWYsIHByaXYtPnJ4X3JpbmcuYnVmX3NpemUpOworCQlmcmVlX21lbWJsb2NrKHByaXYtPnJ4X3JpbmcuZGIsIHNpemVvZihzdHJ1Y3QgbXRuaWNfY3FfZGJfcmVjb3JkKSk7CisJCWZyZWVfbWVtYmxvY2socHJpdi0+Y3FbMF0uYnVmLCBwcml2LT5jcVswXS5idWZfc2l6ZSk7CisJCWZyZWVfbWVtYmxvY2socHJpdi0+Y3FbMF0uZGIsIHNpemVvZihzdHJ1Y3QgbXRuaWNfY3FfZGJfcmVjb3JkKSk7CisKKwkJLyogRnJlZSBSWCBidWZmZXJzICovCisJCW10bmljX2ZyZWVfaW9fYnVmZmVycygmcHJpdi0+cnhfcmluZyk7CisKKworCisJfQorCisJcHJpdi0+c3RhdGUgPSBDQVJEX0lOSVRJQUxJWkVEOworCit9CisKKworc3RhdGljIHZvaWQKK210bmljX2Rpc2FibGUoc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKworCWludCBlcnI7CisJaW50IGk7CisJc3RydWN0IG10bmljICptdG5pYyA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOworCisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBtdG5pY19wb3J0ICpwcml2OworCisJZm9yICggaSA9ICggbXRuaWMtPmZ3Lm51bV9wb3J0cyAtIDEgKTsgaSA+PSAwOyBpLS0gKSB7CisKKwkJZGV2ID0gbXRuaWMtPm5ldGRldltpXTsKKworCQlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQkvKiBKdXN0IGluIGNhc2UgKi8KKwkJaWYgKCAoIHByaXYtPnN0YXRlID09IENBUkRfVVAgKSB8fAorCQkgICAgICggcHJpdi0+c3RhdGUgPT0gQ0FSRF9MSU5LX0RPV04gKSApCisJCQltdG5pY19jbG9zZSAoIGRldiApOworCX0KKworCS8qIFJlbGVhc2luZyBFUSAqLworCXByaXYgPSBuZXRkZXZfcHJpdiAoIG10bmljLT5uZXRkZXZbMF0gKTsKKwllcnIgPSBtdG5pY19SRUxFQVNFX1JFU09VUkNFKHByaXYsIDEsCisJCQkJICAgICBNVE5JQ19JRl9SRVNPVVJDRV9UWVBFX0VRLCAwKTsKKworCURCRygiQ2FsbGluZyBNVE5JQ19DTE9TRSBjb21tYW5kXG4iKTsKKwllcnIgfD0gbXRuaWNfY21kKG10bmljLCBOVUxMLCBOVUxMLCAwLAorCQkJIE1UTklDX0lGX0NNRF9DTE9TRV9OSUMpOworCWlmIChlcnIpIHsKKwkJREJHKCJFcnJvciBSZWxlYXNpbmcgcmVzb3VyY2VzICVkXG4iLCBlcnIpOworCX0KKworCWZyZWVfbWVtYmxvY2sobXRuaWMtPmNtZC5idWYsIFBBR0VfU0laRSk7CisJaW91bm1hcChtdG5pYy0+aGNyKTsKKwl1ZnJlZSgoaW50cHRyX3QpbXRuaWMtPmZ3LmZ3X3BhZ2VzLmJ1Zik7CisJdWZyZWUoKGludHB0cl90KW10bmljLT5mdy5leHRyYV9wYWdlcy5idWYpOworCWZyZWVfbWVtYmxvY2sobXRuaWMtPmVxLmJ1ZiwgbXRuaWMtPmVxLmJ1Zl9zaXplKTsKKwlpb3VubWFwKG10bmljLT5lcV9kYik7CisKKworCWZvciAoIGkgPSAoIG10bmljLT5mdy5udW1fcG9ydHMgLSAxICk7IGkgPj0gMDsgaS0tICkgeworCQlkZXYgPSBtdG5pYy0+bmV0ZGV2W2ldOworCQl1bnJlZ2lzdGVyX25ldGRldiAoIGRldiApOworCQluZXRkZXZfbnVsbGlmeSAoIGRldiApOworCQluZXRkZXZfcHV0ICggZGV2ICk7CisJfQorCisJZnJlZSAoIG10bmljICk7CisKKworCW10bmljX3Jlc2V0ICgpOworCW1kZWxheSAoIDEwMDAgKTsKKwkvKiBSZXN0b3JlIGNvbmZpZywgaWYgd2Ugd291bGQgbGlrZSB0byByZXRyeSBib290aW5nICovCisJcmVzdG9yZV9jb25maWcgKCk7CisKKworfQorCisKKworc3RhdGljIHZvaWQKK210bmljX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2IF9fdW51c2VkLCBpbnQgZW5hYmxlIF9fdW51c2VkKQoreworCS8qIE5vdCBpbXBsZW1lbnRlZCAqLworfQorCisKKworLyoqIG10bmljIG5ldCBkZXZpY2Ugb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgbXRuaWNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbiAgICAgICA9IG10bmljX29wZW4sCisJLmNsb3NlICAgICAgPSBtdG5pY19jbG9zZSwKKwkudHJhbnNtaXQgICA9IG10bmljX3RyYW5zbWl0LAorCS5wb2xsICAgICAgID0gbXRuaWNfcG9sbCwKKwkuaXJxICAgICAgICA9IG10bmljX2lycSwKK307CisKKworCisKKworCisKK3N0YXRpYyBpbnQKK210bmljX3Byb2JlKHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCBfX3VudXNlZCkKK3sKKwlzdHJ1Y3QgbXRuaWNfcG9ydCAqcHJpdjsKKwlzdHJ1Y3QgbXRuaWMgKm10bmljOworCWludCBlcnI7CisJdTY0IG1hYzsKKwlpbnQgcG9ydF9pbmRleDsKKworCisJYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworCWVyciA9IG10bmljX2luaXRfcGNpKHBjaSk7CisJaWYgKGVycikgeworCQlEQkcoIkVycm9yIGluIHBjaV9pbml0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbXRuaWNfcmVzZXQoKTsKKwltZGVsYXkoMTAwMCk7CisKKwllcnIgPSByZXN0b3JlX2NvbmZpZygpOworCWlmIChlcnIpIHsKKwkJREJHKCJFcnJvciBpbiByZXN0b3JpbmcgY29uZmlnXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwltdG5pYyA9IHphbGxvYyAoIHNpemVvZiAoICptdG5pYyApICk7CisJaWYgKCAhIG10bmljICkgeworCQlEQkcgKCAiRXJyb3IgQWxsb2NhdGluZyBtdG5pYyBidWZmZXJcbiIgKTsKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIG10bmljKTsKKworCW10bmljLT5wZGV2ID0gcGNpOworCisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlICovCisJZXJyID0gbXRuaWNfaW5pdF9jYXJkICggbXRuaWMgKTsKKwlpZiAoZXJyKSB7CisJCURCRygiRXJyb3IgaW4gaW5pdF9jYXJkXG4iKTsKKwkJZ290byBlcnJfaW5pdF9jYXJkOworCX0KKworCWZvciAoIHBvcnRfaW5kZXggPSAwOyBwb3J0X2luZGV4IDwgbXRuaWMtPmZ3Lm51bV9wb3J0czsgcG9ydF9pbmRleCArKyApIHsKKwkJLyogSW5pdGlhbGl6aW5nIG5ldCBkZXZpY2UgKi8KKwkJbXRuaWMtPm5ldGRldltwb3J0X2luZGV4XSA9IGFsbG9jX2V0aGVyZGV2KCBzaXplb2YgKCBzdHJ1Y3QgbXRuaWNfcG9ydCApICk7CisJCWlmICggbXRuaWMtPm5ldGRldltwb3J0X2luZGV4XSA9PSBOVUxMICkgeworCQkJREJHKCJOZXQgZGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyX2FsbG9jX210bmljOworCQl9CisKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSBkcml2ZXIgcHJpdmF0ZSBkYXRhCisJCSAqLworCisJCW10bmljLT5uZXRkZXZbcG9ydF9pbmRleF0tPmRldiA9ICZwY2ktPmRldjsKKwkJcHJpdiA9IG5ldGRldl9wcml2ICggbXRuaWMtPm5ldGRldltwb3J0X2luZGV4XSApOworCQltZW1zZXQgKCBwcml2LCAwLCBzaXplb2YgKCBzdHJ1Y3QgbXRuaWNfcG9ydCApICk7CisJCXByaXYtPm10bmljID0gbXRuaWM7CisJCXByaXYtPm5ldGRldiA9IG10bmljLT5uZXRkZXZbcG9ydF9pbmRleF07CisKKwkJLyogQXR0YWNoIHBjaSBkZXZpY2UgKi8KKwkJbmV0ZGV2X2luaXQobXRuaWMtPm5ldGRldltwb3J0X2luZGV4XSwgJm10bmljX29wZXJhdGlvbnMpOworCisJCS8qIFNldCBwb3J0IG51bWJlciAqLworCQlwcml2LT5wb3J0ID0gcG9ydF9pbmRleDsKKworCQkvKiBTZXQgc3RhdGUgKi8KKwkJcHJpdi0+c3RhdGUgPSBDQVJEX0RPV047CisJfQorCisKKwlpbnQgbWFjX2lkeDsKKwlmb3IgKCBwb3J0X2luZGV4ID0gMDsgcG9ydF9pbmRleCA8IG10bmljLT5mdy5udW1fcG9ydHM7IHBvcnRfaW5kZXggKysgKSB7CisJCXByaXYgPSBuZXRkZXZfcHJpdiAoIG10bmljLT5uZXRkZXZbcG9ydF9pbmRleF0gKTsKKwkJLyogUHJvZ3JhbSB0aGUgTUFDIGFkZHJlc3MgKi8KKwkJbWFjID0gcHJpdi0+bXRuaWMtPmZ3Lm1hY1twb3J0X2luZGV4XTsKKwkJZm9yIChtYWNfaWR4ID0gMDsgbWFjX2lkeCA8IE1BQ19BRERSRVNTX1NJWkU7ICsrbWFjX2lkeCkgeworCQkJbXRuaWMtPm5ldGRldltwb3J0X2luZGV4XS0+aHdfYWRkcltNQUNfQUREUkVTU19TSVpFIC0gbWFjX2lkeCAtIDFdID0gbWFjICYgMHhGRjsKKwkJCW1hYyA9IG1hYyA+PiA4OworCQl9CisKKwkJaWYgKCByZWdpc3Rlcl9uZXRkZXYgKCBtdG5pYy0+bmV0ZGV2W3BvcnRfaW5kZXhdICkgKSB7CisJCQlEQkcoIk5ldGRldiByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJCXByaXYtPnN0YXRlID0gQ0FSRF9JTklUSUFMSVpFRDsKKwkJCWdvdG8gZXJyX2FsbG9jX210bmljOworCQl9CisJfQorCisKKwlyZXR1cm4gMDsKKworZXJyX2FsbG9jX210bmljOgorCWZyZWUgKCBtdG5pYyApOworZXJyX2luaXRfY2FyZDoKKwlyZXR1cm4gLUVJTzsKK30KKworCisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG10bmljX25pY3NbXSA9IHsKKwlQQ0lfUk9NICggMHgxNWIzLCAweDYzNjgsICJtdDI1NDQ4IiwgIk1lbGxhbm94IENvbm5lY3RYIEVOIGRyaXZlciIsIDAgKSwKKwlQQ0lfUk9NICggMHgxNWIzLCAweDYzNzIsICJtdDI1NDU4IiwgIk1lbGxhbm94IENvbm5lY3RYIEVOdCBkcml2ZXIiLCAwICksCisJUENJX1JPTSAoIDB4MTViMywgMHg2NzUwLCAibXQyNjQ0OCIsICJNZWxsYW5veCBDb25uZWN0WCBFTiBHRU4yIGRyaXZlciIsIDAgKSwKKwlQQ0lfUk9NICggMHgxNWIzLCAweDY3NWEsICJtdDI2NDU4IiwgIk1lbGxhbm94IENvbm5lY3RYIEVOdCBHRU4yIGRyaXZlciIsIDAgKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIG10bmljX2RyaXZlciBfX3BjaV9kcml2ZXIgPSB7CisJLmlkcyA9IG10bmljX25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKG10bmljX25pY3MpIC8gc2l6ZW9mKG10bmljX25pY3NbMF0pLAorCQkgICAgLnByb2JlID0gbXRuaWNfcHJvYmUsCisJLnJlbW92ZSA9IG10bmljX2Rpc2FibGUsCit9OworCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9tdG5pYy5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbXRuaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTI0MGUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbXRuaWMuaApAQCAtMCwwICsxLDcyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKyNpZm5kZWYgSF9NVE5JQ19JRl9ERUZTX0gKKyNkZWZpbmUgSF9NVE5JQ19JRl9ERUZTX0gKKworCisKKy8qCisqIERldmljZSBzZXR1cAorKi8KKyNkZWZpbmUgTVROSUNfTUFYX1BPUlRTCQkyCisjZGVmaW5lIE1UTklDX1BPUlQxCQkwCisjZGVmaW5lIE1UTklDX1BPUlQyCQkxCisjZGVmaW5lIE5VTV9UWF9SSU5HUwkJMQorI2RlZmluZSBOVU1fUlhfUklOR1MJCTEKKyNkZWZpbmUgTlVNX0NRUyAJCShOVU1fUlhfUklOR1MgKyBOVU1fVFhfUklOR1MpCisjZGVmaW5lIEdPX0JJVF9USU1FT1VUCQk2MDAwCisjZGVmaW5lIFRCSVRfUkVUUklFUwkJMTAwCisjZGVmaW5lIFVOSVRTX0JVRkZFUl9TSVpFIAk4IC8qIGNhbiBiZSBjb25maWd1cmVkIHRvIDQvOC8xNiAqLworI2RlZmluZSBNQVhfR0FQX1BST0RfQ09OUyAJKCBVTklUU19CVUZGRVJfU0laRSAvIDQgKQorI2RlZmluZSBFVEhfREVGX0xFTgkJMTU0MCAgICAgICAgICAvKiA0MCBieXRlcyB1c2VkIGJ5IHRoZSBjYXJkICovCisjZGVmaW5lIEVUSF9GQ1NfTEVOCQkxNAorI2RlZmluZSBERUZfTVRVIAkJRVRIX0RFRl9MRU4gKyBFVEhfRkNTX0xFTgorI2RlZmluZSBERUZfSU9CVUZfU0laRSAJCUVUSF9ERUZfTEVOCisKKyNkZWZpbmUgTUFDX0FERFJFU1NfU0laRSAJNgorI2RlZmluZSBOVU1fRVFFUyAJCTE2CisjZGVmaW5lIFJPVU5EX1RPX0NIRUNLCQkweDQwMAorCisjZGVmaW5lIERFTEFZX0xJTktfQ0hFQ0sJMzAwCisjZGVmaW5lIENIRUNLX0xJTktfVElNRVMJNworCisKKyNkZWZpbmUgWE5PUih4LHkpCQkoISh4KSA9PSAhKHkpKQorI2RlZmluZSBkbWFfYWRkcl90IAkJdW5zaWduZWQgbG9uZworI2RlZmluZSBQQUdFX1NJWkUJCTQwOTYKKyNkZWZpbmUgUEFHRV9NQVNLCQkoUEFHRV9TSVpFIC0gMSkKKyNkZWZpbmUgTVROSUNfTUFJTEJPWF9TSVpFCVBBR0VfU0laRQorCisKKworCisvKiBCSVRPUFMgKi8KKyNkZWZpbmUgTVROSUNfQkNfT0ZGKGJjKSAoKGJjKSA+PiA4KQorI2RlZmluZSBNVE5JQ19CQ19TWihiYykgKChiYykgJiAweGZmKQorI2RlZmluZSBNVE5JQ19CQ19PTkVTKHNpemUpICh+KChpbnQpMHg4MDAwMDAwMCA+PiAoMzEgLSBzaXplKSkpCisjZGVmaW5lIE1UTklDX0JDX01BU0soYmMpIFwKKwkoTVROSUNfQkNfT05FUyhNVE5JQ19CQ19TWihiYykpIDw8IE1UTklDX0JDX09GRihiYykpCisjZGVmaW5lIE1UTklDX0JDX1ZBTCh2YWwsIGJjKSBcCisJKCgodmFsKSAmIE1UTklDX0JDX09ORVMoTVROSUNfQkNfU1ooYmMpKSkgPDwgTVROSUNfQkNfT0ZGKGJjKSkKKy8qCisgKiBTdWIgd29yZCBmaWVsZHMgLSBiaXQgY29kZSBiYXNlIGV4dHJhY3Rpb24vc2V0dGluZyBldGMKKyAqLworCisvKiBFbmNvZGUgdHdvIHZhbHVlcyAqLworI2RlZmluZSBNVE5JQ19CQyhvZmYsIHNpemUpICgob2ZmIDw8IDgpIHwgKHNpemUgJiAweGZmKSkKKworLyogR2V0IHZhbHVlIG9mIGZpZWxkICdiYycgZnJvbSAneCcgKi8KKyNkZWZpbmUgTVROSUNfQkNfR0VUKHgsIGJjKSBcCisJKCgoeCkgPj4gTVROSUNfQkNfT0ZGKGJjKSkgJiBNVE5JQ19CQ19PTkVTKE1UTklDX0JDX1NaKGJjKSkpCisKKy8qIFNldCB2YWx1ZSBvZiBmaWVsZCAnYmMnIG9mICd4JyB0byAndmFsJyAqLworI2RlZmluZSBNVE5JQ19CQ19TRVQoeCwgdmFsLCBiYykgXAorCSgoeCkgPSAoKHgpICYgfk1UTklDX0JDX01BU0soYmMpKSB8IE1UTklDX0JDX1ZBTCh2YWwsIGJjKSkKKworLyogTGlrZSBNVE5JQ19CQ19TRVQsIGV4Y2VwdCB0aGUgcHJldmlvdXMgdmFsdWUgaXMgYXNzdW1lZCB0byBiZSAwICovCisjZGVmaW5lIE1UTklDX0JDX1BVVCh4LCB2YWwsIGJjKSAoKHgpIHw9IE1UTklDX0JDX1ZBTCh2YWwsIGJjKSkKKworCisKKy8qCisgKiBEZXZpY2UgY29uc3RhbnRzCisgKi8KK3R5cGVkZWYgZW51bSBtdG5pY19pZl9jbWQgeworCS8qIE5JQyBjb21tYW5kczogKi8KKwlNVE5JQ19JRl9DTURfUVVFUllfRlcgID0gMHgwMDQsIC8qIHF1ZXJ5IEZXIChzaXplLCB2ZXJzaW9uLCBldGMpICovCisJTVROSUNfSUZfQ01EX01BUF9GVyAgICA9IDB4ZmZmLCAvKiBtYXAgcGFnZXMgZm9yIEZXIGltYWdlICovCisJTVROSUNfSUZfQ01EX1JVTl9GVyAgICA9IDB4ZmY2LCAvKiBydW4gdGhlIEZXICovCisJTVROSUNfSUZfQ01EX1FVRVJZX0NBUCA9IDB4MDAxLCAvKiBxdWVyeSBNVE5JQyBjYXBhYmlsaXRpZXMgKi8KKwlNVE5JQ19JRl9DTURfTUFQX1BBR0VTID0gMHgwMDIsIC8qIG1hcCBwaHlzaWNhbCBwYWdlcyB0byBIVyAqLworCU1UTklDX0lGX0NNRF9PUEVOX05JQyAgPSAweDAwMywgLyogcnVuIHRoZSBmaXJtd2FyZSAqLworCU1UTklDX0lGX0NNRF9DT05GSUdfUlggPSAweDAwNSwgLyogZ2VuZXJhbCByZWNlaXZlIGNvbmZpZ3VyYXRpb24gKi8KKwlNVE5JQ19JRl9DTURfQ09ORklHX1RYID0gMHgwMDYsIC8qIGdlbmVyYWwgdHJhbnNtaXQgY29uZmlndXJhdGlvbiAqLworCU1UTklDX0lGX0NNRF9DT05GSUdfSU5UX0ZSRVEgPSAweDAwNywgLyogaW50ZXJydXB0IHRpbWVycyBmcmVxIGxpbWl0cyAqLworCU1UTklDX0lGX0NNRF9IRUFSVF9CRUFUID0gMHgwMDgsIC8qIE5PUCBjb21tYW5kIHRlc3RpbmcgbGl2ZWxpbmVzcyAqLworCU1UTklDX0lGX0NNRF9DTE9TRV9OSUMgPSAweDAwOSwgLyogcmVsZWFzZSBtZW1vcnkgYW5kIHN0b3AgdGhlIE5JQyAqLworCisJLyogUG9ydCBjb21tYW5kczogKi8KKwlNVE5JQ19JRl9DTURfQ09ORklHX1BPUlRfUlNTX1NURUVSICAgICA9IDB4MTAsIC8qIHNldCBSU1MgbW9kZSAqLworCU1UTklDX0lGX0NNRF9TRVRfUE9SVF9SU1NfSU5ESVJFQ1RJT04gID0gMHgxMSwgLyogc2V0IFJTUyBpbmRpcmVjdGlvbiB0YmwgKi8KKwlNVE5JQ19JRl9DTURfQ09ORklHX1BPUlRfUFJJT19TVEVFUklORyA9IDB4MTIsIC8qIHNldCBQUklPUklUWSBtb2RlICovCisJTVROSUNfSUZfQ01EX0NPTkZJR19QT1JUX0FERFJfU1RFRVIgICAgPSAweDEzLCAvKiBzZXQgQWRkcmVzcyBzdGVlciBtb2RlICovCisJTVROSUNfSUZfQ01EX0NPTkZJR19QT1JUX1ZMQU5fRklMVEVSICAgPSAweDE0LCAvKiBjb25maWd1cmUgVkxBTiBmaWx0ZXIgKi8KKwlNVE5JQ19JRl9DTURfQ09ORklHX1BPUlRfTUNBU1RfRklMVEVSICA9IDB4MTUsIC8qIGNvbmZpZ3VyZSBtY2FzdCBmaWx0ZXIgKi8KKwlNVE5JQ19JRl9DTURfRU5BQkxFX1BPUlRfTUNBU1RfRklMVEVSICA9IDB4MTYsIC8qIGVuYWJsZS9kaXNhYmxlICovCisJTVROSUNfSUZfQ01EX1NFVF9QT1JUX01UVSAgICAgICAgICAgICAgPSAweDE3LCAvKiBzZXQgcG9ydCBNVFUgKi8KKwlNVE5JQ19JRl9DTURfU0VUX1BPUlRfUFJPTUlTQ1VPVVNfTU9ERSA9IDB4MTgsIC8qIGVuYWJsZS9kaXNhYmxlIHByb21pc2MgKi8KKwlNVE5JQ19JRl9DTURfU0VUX1BPUlRfREVGQVVMVF9SSU5HICAgICA9IDB4MTksIC8qIHNldCB0aGUgZGVmYXVsdCByaW5nICovCisJTVROSUNfSUZfQ01EX1NFVF9QT1JUX1NUQVRFICAgICAgICAgICAgPSAweDFhLCAvKiBzZXQgbGluayB1cC9kb3duICovCisJTVROSUNfSUZfQ01EX0RVTVBfU1RBVCAgICAgICAgICAgICAgICAgPSAweDFiLCAvKiBkdW1wIHN0YXRpc3RpY3MgKi8KKwlNVE5JQ19JRl9DTURfQVJNX1BPUlRfU1RBVEVfRVZFTlQgICAgICA9IDB4MWMsIC8qIGFybSB0aGUgcG9ydCBzdGF0ZSBldmVudCAqLworCisJLyogUmluZyAvIENvbXBsZXRpb24gcXVldWUgY29tbWFuZHM6ICovCisJTVROSUNfSUZfQ01EX0NPTkZJR19DUSAgICAgICAgICAgID0gMHgyMCwgIC8qIHNldCB1cCBjb21wbGV0aW9uIHF1ZXVlICovCisJTVROSUNfSUZfQ01EX0NPTkZJR19SWF9SSU5HICAgICAgID0gMHgyMSwgIC8qIHNldHVwIFJ4IHJpbmcgKi8KKwlNVE5JQ19JRl9DTURfU0VUX1JYX1JJTkdfQUREUiAgICAgPSAweDIyLCAgLyogc2V0IFJ4IHJpbmcgZmlsdGVyIGJ5IGFkZHJlc3MgKi8KKwlNVE5JQ19JRl9DTURfU0VUX1JYX1JJTkdfTUNBU1QgICAgPSAweDIzLCAgLyogc2V0IFJ4IHJpbmcgbWNhc3QgZmlsdGVyICovCisJTVROSUNfSUZfQ01EX0FSTV9SWF9SSU5HX1dNICAgICAgID0gMHgyNCwgIC8qIG9uZS10aW1lIGxvdy13YXRlcm1hcmsgSU5UICovCisJTVROSUNfSUZfQ01EX0NPTkZJR19UWF9SSU5HICAgICAgID0gMHgyNSwgIC8qIHNldCB1cCBUeCByaW5nICovCisJTVROSUNfSUZfQ01EX0VORk9SQ0VfVFhfUklOR19BRERSID0gMHgyNiwgIC8qIHNldHVwIGFudGkgc3Bvb2ZpbmcgKi8KKwlNVE5JQ19JRl9DTURfQ09ORklHX0VRICAgICAgICAgICAgPSAweDI3LCAgLyogY29uZmlnIEVRIHJpbmcgKi8KKwlNVE5JQ19JRl9DTURfUkVMRUFTRV9SRVNPVVJDRSAgICAgPSAweDI4LCAgLyogcmVsZWFzZSBpbnRlcm5hbCByZWYgdG8gcmVzb3VyY2UgKi8KK30KK210bmljX2lmX2NtZF90OworCisKKy8qKiBzZWxlY3RvcnMgZm9yIE1UTklDX0lGX0NNRF9RVUVSWV9DQVAgKi8KK3R5cGVkZWYgZW51bSBtdG5pY19pZl9jYXBzIHsKKwlNVE5JQ19JRl9DQVBfTUFYX1RYX1JJTkdfUEVSX1BPUlQgPSAweDAsCisJTVROSUNfSUZfQ0FQX01BWF9SWF9SSU5HX1BFUl9QT1JUID0gMHgxLAorCU1UTklDX0lGX0NBUF9NQVhfQ1FfUEVSX1BPUlQgICAgICA9IDB4MiwKKwlNVE5JQ19JRl9DQVBfTlVNX1BPUlRTICAgICAgICAgICAgPSAweDMsCisJTVROSUNfSUZfQ0FQX01BWF9UWF9ERVNDICAgICAgICAgID0gMHg0LAorCU1UTklDX0lGX0NBUF9NQVhfUlhfREVTQyAgICAgICAgICA9IDB4NSwKKwlNVE5JQ19JRl9DQVBfTUFYX0NRRVMgICAgICAgICAgICAgPSAweDYsCisJTVROSUNfSUZfQ0FQX01BWF9UWF9TR19FTlRSSUVTICAgID0gMHg3LAorCU1UTklDX0lGX0NBUF9NQVhfUlhfU0dfRU5UUklFUyAgICA9IDB4OCwKKwlNVE5JQ19JRl9DQVBfTUVNX0tFWSAgICAgICAgICAgICAgPSAweDksIC8qIGtleSB0byBtZW0gKGFmdGVyIG1hcF9wYWdlcykgKi8KKwlNVE5JQ19JRl9DQVBfUlNTX0hBU0hfVFlQRSAgICAgICAgPSAweGEsIC8qIG9uZSBvZiBtdG5pY19pZl9yc3NfdHlwZXNfdCAqLworCU1UTklDX0lGX0NBUF9NQVhfUE9SVF9VQ0FTVF9BRERSICA9IDB4YywKKwlNVE5JQ19JRl9DQVBfTUFYX1JJTkdfVUNBU1RfQUREUiAgPSAweGQsIC8qIG9ubHkgZm9yIEFERFIgc3RlZXIgKi8KKwlNVE5JQ19JRl9DQVBfTUFYX1BPUlRfTUNBU1RfQUREUiAgPSAweGUsCisJTVROSUNfSUZfQ0FQX01BWF9SSU5HX01DQVNUX0FERFIgID0gMHhmLCAvKiBvbmx5IGZvciBBRERSIHN0ZWVyICovCisJTVROSUNfSUZfQ0FQX0lOVEEgICAgICAgICAgICAgICAgID0gMHgxMCwKKwlNVE5JQ19JRl9DQVBfQk9BUkRfSURfTE9XICAgICAgICAgPSAweDExLAorCU1UTklDX0lGX0NBUF9CT0FSRF9JRF9ISUdIICAgICAgICA9IDB4MTIsCisJTVROSUNfSUZfQ0FQX1RYX0NRX0RCX09GRlNFVCAgICAgID0gMHgxMywgLyogb2Zmc2V0IGluIGJ5dGVzIGZvciBUWCwgQ1EgZG9vcmJlbGwgcmVjb3JkICovCisJTVROSUNfSUZfQ0FQX0VRX0RCX09GRlNFVCAgICAgICAgID0gMHgxNCwgLyogb2Zmc2V0IGluIGJ5dGVzIGZvciBFUSBkb29yYmVsbCByZWNvcmQgKi8KKworCS8qIFRoZXNlIGFyZSBwZXIgcG9ydCAtIHVzaW5nIHBvcnQgbnVtYmVyIGZyb20gY2FwIG1vZGlmaWVyIGZpZWxkICovCisJTVROSUNfSUZfQ0FQX1NQRUVEICAgICAgICAgICAgICAgID0gMHgyMCwKKwlNVE5JQ19JRl9DQVBfREVGQVVMVF9NQUMgICAgICAgICAgPSAweDIxLAorCU1UTklDX0lGX0NBUF9FUV9PRkZTRVQgICAgICAgICAgICA9IDB4MjIsCisJTVROSUNfSUZfQ0FQX0NRX09GRlNFVCAgICAgICAgICAgID0gMHgyMywKKwlNVE5JQ19JRl9DQVBfVFhfT0ZGU0VUICAgICAgICAgICAgPSAweDI0LAorCU1UTklDX0lGX0NBUF9SWF9PRkZTRVQgICAgICAgICAgICA9IDB4MjUsCisKK30gbXRuaWNfaWZfY2Fwc190OworCit0eXBlZGVmIGVudW0gbXRuaWNfaWZfc3RlZXJfdHlwZXMgeworCU1UTklDX0lGX1NURUVSX05PTkUgICAgID0gMCwKKwlNVE5JQ19JRl9TVEVFUl9QUklPUklUWSA9IDEsCisJTVROSUNfSUZfU1RFRVJfUlNTICAgICAgPSAyLAorCU1UTklDX0lGX1NURUVSX0FERFJFU1MgID0gMywKK30gbXRuaWNfaWZfc3RlZXJfdHlwZXNfdDsKKworLyoqIHR5cGVzIG9mIG1lbW9yeSBhY2Nlc3MgbW9kZXMgKi8KK3R5cGVkZWYgZW51bSBtdG5pY19pZl9tZW1vcnlfdHlwZXMgeworCU1UTklDX0lGX01FTV9UWVBFX1NOT09QID0gMSwKKwlNVE5JQ19JRl9NRU1fVFlQRV9OT19TTk9PUCA9IDIKK30gbXRuaWNfaWZfbWVtb3J5X3R5cGVzX3Q7CisKKworZW51bSB7CisJTVROSUNfSENSX0JBU0UgICAgICAgICAgPSAweDFmMDAwLAorCU1UTklDX0hDUl9TSVpFICAgICAgICAgID0gMHgwMDAxYywKKwlNVE5JQ19DTFJfSU5UX1NJWkUgICAgICA9IDB4MDAwMDgsCit9OworCisjZGVmaW5lIE1UTklDX1JFU0VUX09GRlNFVCAJMHhGMDAxMAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlcworKgorKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgc3RydWN0dXJlcyBvZiBhbGwgZGV2aWNlIHByaXZhdGUgZGF0YToKKyoJZGVzY3JpcHRvcnMsIHJpbmdzLCBDUXMsIEVRIC4uLi4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEZXNjcmlwdG9yIGZvcm1hdAorICovCitzdHJ1Y3QgbXRuaWNfY3RybF9zZWcgeworCXUzMiBvcF9vd247CisjZGVmaW5lIE1UTklDX0JJVF9ERVNDX09XTgkweDgwMDAwMDAwCisjZGVmaW5lIE1UTklDX09QQ09ERV9TRU5ECTB4YQorCXUzMiBzaXplX3ZsYW47CisJdTMyIGZsYWdzOworI2RlZmluZSBNVE5JQ19CSVRfTk9fSUNSQwkweDIKKyNkZWZpbmUgTVROSUNfQklUX1RYX0NPTVAJMHhjCisJdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IG10bmljX2RhdGFfc2VnIHsKKwl1MzIgY291bnQ7CisjZGVmaW5lIE1UTklDX0lOTElORQkJMHg4MDAwMDAwMAorCXUzMiBtZW1fdHlwZTsKKyNkZWZpbmUgTVROSUNfTUVNVFlQRV9QQUQJMHgxMDAKKwl1MzIgYWRkcl9oOworCXUzMiBhZGRyX2w7Cit9OworCitzdHJ1Y3QgbXRuaWNfdHhfZGVzYyB7CisJc3RydWN0IG10bmljX2N0cmxfc2VnIGN0cmw7CisJc3RydWN0IG10bmljX2RhdGFfc2VnIGRhdGE7IC8qIGF0IGxlYXN0IG9uZSBkYXRhIHNlZ21lbnQgKi8KK307CisKK3N0cnVjdCBtdG5pY19yeF9kZXNjIHsKKwl1MTYgcmVzZXJ2ZWQxOworCXUxNiBuZXh0OworCXUzMiByZXNlcnZlZDJbM107CisJc3RydWN0IG10bmljX2RhdGFfc2VnIGRhdGE7IC8qIGFjdHVhbCBudW1iZXIgb2YgZW50cmllcyBkZXBlbmRzIG9uCisJCQkJKiByeCByaW5nIHN0cmlkZSAqLworfTsKKworLyoKKyAqIFJpbmdzCisgKi8KK3N0cnVjdCBtdG5pY19yeF9kYl9yZWNvcmQgeworCXUzMiBjb3VudDsKK307CisKK3N0cnVjdCBtdG5pY19yaW5nIHsKKwl1MzIgc2l6ZTsgLyogUkVNT1ZFIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7ICovLyogbnVtYmVyIG9mIFJ4IGRlc2NzIG9yIFRYQkJzICovCisJdTMyIHNpemVfbWFzazsKKwl1MTYgc3RyaWRlOworCXUxNiBjcTsgLyogaW5kZXggb2YgcG9ydCBDUSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaW5nICovCisJdTMyIHByb2Q7CisJdTMyIGNvbnM7IC8qIGhvbGRzIHRoZSBsYXN0IGNvbnN1bWVkIGluZGV4ICovCisKKwkvKiBCdWZmZXJzICovCisJdTMyIGJ1Zl9zaXplOyAvKiByaW5nIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCisJZG1hX2FkZHJfdCBkbWE7CisJdm9pZCAqYnVmOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmW1VOSVRTX0JVRkZFUl9TSVpFXTsKKworCS8qIFR4IG9ubHkgKi8KKwlzdHJ1Y3QgbXRuaWNfdHhjcV9kYiAqdHhjcV9kYjsKKwl1MzIgZGJfb2Zmc2V0OworCisJLyogUnggcmluZyBvbmx5ICovCisJZG1hX2FkZHJfdCBpb2J1Zl9kbWE7CisJc3RydWN0IG10bmljX3J4X2RiX3JlY29yZCAqZGI7CisJZG1hX2FkZHJfdCBkYl9kbWE7Cit9OworCisvKgorICogQ1EKKyAqLworCitzdHJ1Y3QgbXRuaWNfY3FlIHsKKwl1OCB2cDsgLyogVkxBTiBwcmVzZW50ICovCisJdTggcmVzZXJ2ZWQxWzNdOworCXUzMiByc3NfaGFzaDsKKwl1MzIgcmVzZXJ2ZWQyOworCXUxNiB2bGFuX3ByaW87CisJdTE2IHJlc2VydmVkMzsKKwl1OCBmbGFnc19oOworCXU4IGZsYWdzX2xfcmh0OworCXU4IGlwdjZfbWFzazsKKwl1OCBlbmNfYmY7CisjZGVmaW5lIE1UTklDX0JJVF9CQURfRkNTCTB4MTAKKyNkZWZpbmUgTVROSUNfT1BDT0RFX0VSUk9SCTB4MWUKKwl1MzIgYnl0ZV9jbnQ7CisJdTE2IGluZGV4OworCXUxNiBjaGtzdW07CisJdTggcmVzZXJ2ZWQ0WzNdOworCXU4IG9wX3RyX293bjsKKyNkZWZpbmUgTVROSUNfQklUX0NRX09XTgkweDgwCit9OworCisKK3N0cnVjdCBtdG5pY19jcV9kYl9yZWNvcmQgeworCXUzMiB1cGRhdGVfY2k7CisJdTMyIGNtZF9jaTsKK307CisKK3N0cnVjdCBtdG5pY19jcSB7CisJaW50IG51bTsgLyogQ1EgbnVtYmVyIChvbiBhdHRhY2hlZCBwb3J0KSAqLworCXUzMiBzaXplOyAvKiBudW1iZXIgb2YgQ1FFcyBpbiBDUSAqLworCXUzMiBsYXN0OyAvKiBudW1iZXIgb2YgQ1FFcyBjb25zdW1lZCAqLworCXN0cnVjdCBtdG5pY19jcV9kYl9yZWNvcmQgKmRiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlkbWFfYWRkcl90IGRiX2RtYTsKKwl1OCBpc19yeDsKKwl1MTYgcmluZzsgLyogcmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBDUSAqLworCXUzMiBvZmZzZXRfaW5kOworCisJLyogQ1FFIHJpbmcgKi8KKwl1MzIgYnVmX3NpemU7IC8qIHJpbmcgc2l6ZSBpbiBieXRlcyAqLworCXN0cnVjdCBtdG5pY19jcWUgKmJ1ZjsKKwlkbWFfYWRkcl90IGRtYTsKK307CisKKy8qCisgKiBFUQorICovCisKK3N0cnVjdCBtdG5pY19lcWUgeworCXU4IHJlc2VydmVkMTsKKwl1OCB0eXBlOworCXU4IHJlc2VydmVkMjsKKwl1OCBzdWJ0eXBlOworCXU4IHJlc2VydmVkM1szXTsKKwl1OCByaW5nX2NxOworCXUzMiByZXNlcnZlZDQ7CisJdTggcG9ydDsKKyNkZWZpbmUgTVROSUNfTUFTS19FUUVfUE9SVCAgICBNVE5JQ19CQyg0LDIpCisJdTggcmVzZXJ2ZWQ1WzJdOworCXU4IHN5bmRyb21lOworCXU4IHJlc2VydmVkNlsxNV07CisJdTggb3duOworI2RlZmluZSBNVE5JQ19CSVRfRVFFX09XTiAgICAgIDB4ODAKK307CisKK3N0cnVjdCBtdG5pY19lcSB7CisJdTMyIHNpemU7IC8qIG51bWJlciBvZiBFUUVzIGluIHJpbmcgKi8KKwl1MzIgYnVmX3NpemU7IC8qIEVRIHNpemUgaW4gYnl0ZXMgKi8KKwl2b2lkICpidWY7CisJZG1hX2FkZHJfdCBkbWE7Cit9OworCitlbnVtIG10bmljX3N0YXRlIHsKKwlDQVJEX0RPV04sCisJQ0FSRF9JTklUSUFMSVpFRCwKKwlDQVJEX1VQLAorCUNBUkRfTElOS19ET1dOLAorfTsKKworLyogRlcgKi8KK3N0cnVjdCBtdG5pY19wYWdlcyB7CisJdTMyIG51bTsKKwl1MzIgKmJ1ZjsKK307CitzdHJ1Y3QgbXRuaWNfZXJyX2J1ZiB7CisJdTY0IG9mZnNldDsKKwl1MzIgc2l6ZTsKK307CisKKworCitzdHJ1Y3QgbXRuaWNfY21kIHsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAqYnVmOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIG1hcHBpbmc7CisJdTMyICAgICAgICAgICAgICAgICAgICAgdGJpdDsKK307CisKKworc3RydWN0IG10bmljX3R4Y3FfZGIgeworCXUzMiByZXNlcnZlZDFbNV07CisJdTMyIHNlbmRfZGI7CisJdTMyIHJlc2VydmVkMlsyXTsKKwl1MzIgY3FfYXJtOworCXUzMiBjcV9jaTsKK307CisKKworCisvKgorICogRGV2aWNlIHByaXZhdGUgZGF0YQorICoKKyAqLworc3RydWN0IG10bmljIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAgICAgICAgICpuZXRkZXZbTVROSUNfTUFYX1BPUlRTXTsKKwlzdHJ1Y3QgbXRuaWNfaWZfY21kX3JlZyAgICAgICAgICpoY3I7CisJc3RydWN0IG10bmljX2NtZCAgICAgICAgICAgICAgICBjbWQ7CisJc3RydWN0IHBjaV9kZXZpY2UgICAgICAgICAgICAgICAqcGRldjsKKworCXN0cnVjdCBtdG5pY19lcSAgICAgICAgICAgICAgICAgZXE7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXFfZGI7CisKKwkvKiBGaXJtd2FyZSBhbmQgYm9hcmQgaW5mbyAqLworCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZndfdmVyOworCXN0cnVjdCB7CisJCXN0cnVjdCBtdG5pY19wYWdlcyAgICAgIGZ3X3BhZ2VzOworCQlzdHJ1Y3QgbXRuaWNfcGFnZXMgICAgICBleHRyYV9wYWdlczsKKwkJc3RydWN0IG10bmljX2Vycl9idWYgICAgZXJyX2J1ZjsKKwkJdTE2ICAgICAgICAgICAgICAgICAgICAgaWZjX3JldjsKKwkJdTggICAgICAgICAgICAgICAgICAgICAgbnVtX3BvcnRzOworCQl1NjQgICAgICAgICAgICAgICAgICAgICBtYWNbTVROSUNfTUFYX1BPUlRTXTsKKwkJdTE2ICAgICAgICAgICAgICAgICAgICAgY3Ffb2Zmc2V0OworCQl1MTYgICAgICAgICAgICAgICAgICAgICB0eF9vZmZzZXRbTVROSUNfTUFYX1BPUlRTXTsKKwkJdTE2ICAgICAgICAgICAgICAgICAgICAgcnhfb2Zmc2V0W01UTklDX01BWF9QT1JUU107CisJCXUzMiAgICAgICAgICAgICAgICAgICAgIG1lbV90eXBlX3Nub29wX2JlOworCQl1MzIgICAgICAgICAgICAgICAgICAgICB0eGNxX2RiX29mZnNldDsKKwkJdTMyICAgICAgICAgICAgICAgICAgICAgZXFfZGJfb2Zmc2V0OworCX0gZnc7Cit9OworCisKKworCisKK3N0cnVjdCBtdG5pY19wb3J0IHsKKworCXN0cnVjdCBtdG5pYyAgICAgICAgICAgICAgICAgICAgKm10bmljOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydDsKKworCWVudW0gbXRuaWNfc3RhdGUgICAgICAgICAgICAgICAgc3RhdGU7CisKKwkvKiBUWCwgUlgsIENRcywgRVEgKi8KKwlzdHJ1Y3QgbXRuaWNfcmluZyAgICAgICAgICAgICAgIHR4X3Jpbmc7CisJc3RydWN0IG10bmljX3JpbmcgICAgICAgICAgICAgICByeF9yaW5nOworCXN0cnVjdCBtdG5pY19jcSAgICAgICAgICAgICAgICAgY3FbTlVNX0NRU107CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xsX2NvdW50ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgICAgICAgICAgICAgICAqbmV0ZGV2OworCisKK307CisKKworCisKKworCisKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOSUMgQ09NTUFORFMKKyAqCisgKiBUaGUgc2VjdGlvbiBiZWxvdyBwcm92aWRlcyBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgY29tbWFuZHMgcGFyYW1ldGVycywKKyAqIGFuZCBhcmd1bWVudHMgdmFsdWVzIGVudW1lcmF0aW9uLgorICoKKyAqIFRoZSBmb3JtYXQgdXNlZCBmb3IgdGhlIHN0cnVjdCBuYW1lcyBpczoKKyAqIG10bmljX2lmXzxjbWQgbmFtZT5fPGlufG91dD5fPGltbXxtYm94PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqICBDb21tYW5kIFJlZ2lzdGVyIChDb21tYW5kIGludGVyZmFjZSkKKyAqLworc3RydWN0IG10bmljX2lmX2NtZF9yZWcgeworCXVuc2lnbmVkIGxvbmcgaW5fcGFyYW1faDsKKwl1MzIgaW5fcGFyYW1fbDsKKwl1MzIgaW5wdXRfbW9kaWZpZXI7CisJdTMyIG91dF9wYXJhbV9oOworCXUzMiBvdXRfcGFyYW1fbDsKKwl1MzIgdG9rZW47CisjZGVmaW5lIE1UTklDX01BU0tfQ01EX1JFR19UT0tFTgkgTVROSUNfQkMoMTYsMzIpCisJdTMyIHN0YXR1c19nb19vcGNvZGU7CisjZGVmaW5lIE1UTklDX01BU0tfQ01EX1JFR19PUENPREUgTVROSUNfQkMoMCwxNikKKyNkZWZpbmUgTVROSUNfTUFTS19DTURfUkVHX1RfQklUICBNVE5JQ19CQygyMSwxKQorI2RlZmluZSBNVE5JQ19NQVNLX0NNRF9SRUdfR09fQklUIE1UTklDX0JDKDIzLDEpCisjZGVmaW5lIE1UTklDX01BU0tfQ01EX1JFR19TVEFUVVMgTVROSUNfQkMoMjQsOCkKK307CisKKworCisvKiBDTUQgUVVFUllfRlcgKi8KK3N0cnVjdCBtdG5pY19pZl9xdWVyeV9md19vdXRfbWJveCB7CisJdTE2IGZ3X3BhZ2VzOyAgIC8qIFRvdGFsIG51bWJlciBvZiBtZW1vcnkgcGFnZXMgdGhlIGRldmljZSByZXF1aXJlcyAqLworCXUxNiByZXZfbWFqOworCXUxNiByZXZfc21pbjsKKwl1MTYgcmV2X21pbjsKKwl1MTYgcmVzZXJ2ZWQxOworCXUxNiBpZmNfcmV2OyAgICAvKiBtYWpvciByZXZpc2lvbiBvZiB0aGUgY29tbWFuZCBpbnRlcmZhY2UgKi8KKwl1OCAgZnQ7CisJdTggIHJlc2VydmVkMlszXTsKKwl1MzIgcmVzZXJ2ZWQzWzRdOworCXU2NCBjbHJfaW50X2Jhc2U7CisJdTMyIHJlc2VydmVkNFsyXTsKKwl1NjQgZXJyX2J1Zl9zdGFydDsKKwl1MzIgZXJyX2J1Zl9zaXplOworfTsKKworLyogQ01EIE1UTklDX0lGX0NNRF9RVUVSWV9DQVAgKi8KK3N0cnVjdCBtdG5pY19pZl9xdWVyeV9jYXBfaW5faW1tIHsKKwl1MTYgcmVzZXJ2ZWQxOworCXU4ICAgICAgICAgICAgICAgY2FwX21vZGlmaWVyOyAgIC8qIGEgbW9kaWZpZXIgZm9yIHRoZSBwYXJ0aWN1bGFyIGNhcGFiaWxpdHkgKi8KKwl1OCAgICAgICAgICAgICAgIGNhcF9pbmRleDsgICAgICAvKiB0aGUgaW5kZXggb2YgdGhlIGNhcGFiaWxpdHkgcXVlcmllZCAqLworCXUzMiByZXNlcnZlZDI7Cit9OworCisvKiBDTUQgT1BFTl9OSUMgKi8KK3N0cnVjdCBtdG5pY19pZl9vcGVuX25pY19pbl9tYm94IHsKKwl1MTYgcmVzZXJ2ZWQxOworCXUxNiBta2V5OyAvKiBudW1iZXIgb2YgbWVtIGtleXMgZm9yIGFsbCBjaGlwKi8KKwl1MzIgbWtleV9lbnRyeTsgLyogbWVtIGtleSBlbnRyaWVzIGZvciBlYWNoIGtleSovCisJdTggbG9nX3J4X3AxOyAvKiBsb2cyIHJ4IHJpbmdzIGZvciBwb3J0MSAqLworCXU4IGxvZ19jcV9wMTsgLyogbG9nMiBjcSBmb3IgcG9ydDEgKi8KKwl1OCBsb2dfdHhfcDE7IC8qIGxvZzIgdHggcmluZ3MgZm9yIHBvcnQxICovCisJdTggc3RlZXJfcDE7ICAvKiBwb3J0IDEgc3RlZXJpbmcgbW9kZSAqLworCXUxNiByZXNlcnZlZDI7CisJdTggbG9nX3ZsYW5fcDE7IC8qIGxvZzIgdmxhbiBwZXIgcnggcG9ydDEgKi8KKwl1OCBsb2dfbWFjX3AxOyAgLyogbG9nMiBtYWMgcGVyIHJ4IHBvcnQxICovCisKKwl1OCBsb2dfcnhfcDI7IC8qIGxvZzIgcnggcmluZ3MgZm9yIHBvcnQxICovCisJdTggbG9nX2NxX3AyOyAvKiBsb2cyIGNxIGZvciBwb3J0MSAqLworCXU4IGxvZ190eF9wMjsgLyogbG9nMiB0eCByaW5ncyBmb3IgcG9ydDEgKi8KKwl1OCBzdGVlcl9wMjsgIC8qIHBvcnQgMSBzdGVlcmluZyBtb2RlICovCisJdTE2IHJlc2VydmVkMzsKKwl1OCBsb2dfdmxhbl9wMjsgLyogbG9nMiB2bGFuIHBlciByeCBwb3J0MSAqLworCXU4IGxvZ19tYWNfcDI7ICAvKiBsb2cyIG1hYyBwZXIgcnggcG9ydDEgKi8KK307CisKKworLyogQ01EIENPTkZJR19SWCAqLworc3RydWN0IG10bmljX2lmX2NvbmZpZ19yeF9pbl9pbW0geworCXUxNiBzcGt0X3NpemU7IC8qIHNpemUgb2Ygc21hbGwgcGFja2V0cyBpbnRlcnJ1cHRzIGVuYWJsZWQgb24gQ1EgKi8KKwl1MTYgcmVzcF9yY3ZfcGF1c2VfZnJtX21jYXN0X3ZsYW5fY29tcDsgLyogVHdvIGZsYWdzIHNlZSBNQVNLIGJlbG93ICovCisJLyogRW5hYmxlIHJlc3BvbnNlIHRvIHJlY2VpdmUgcGF1c2UgZnJhbWVzICovCisJLyogVXNlIFZMQU4gaW4gZXhhY3QtbWF0Y2ggbXVsdGljYXN0IGNoZWNrcyAoc2VlIFNFVF9SWF9SSU5HX01DQVNUKSAqLworfTsKKworLyogQ01EIENPTkZJR19UWCAqLworc3RydWN0IG10bmljX2lmX2NvbmZpZ19zZW5kX2luX2ltbSB7CisJdTMyICBlbnBoX2dwZjsgLyogRW5hYmxlIFBzZXVkb0hlYWRlciBhbmQgR2VuZXJhdGVQYXVzZUZyYW1lcyBmbGFncyAqLworCXUzMiAgcmVzZXJ2ZWQ7Cit9OworCisvKiBDTUQgSEVBUlRfQkVBVCAqLworc3RydWN0IG10bmljX2lmX2hlYXJ0X2JlYXRfb3V0X2ltbSB7CisJdTMyIGZsYWdzOyAvKiBzZXZlcmFsIGZsYWdzICovCisjZGVmaW5lIE1UTklDX01BU0tfSEVBUl9CRUFUX0lOVF9FUlJPUiAgTVROSUNfQkMoMzEsMSkKKwl1MzIgcmVzZXJ2ZWQ7Cit9OworCisKKy8qCisgKiBQT1JUIENPTU1BTkRTCisgKi8KKy8qIENNRCBDT05GSUdfUE9SVF9WTEFOX0ZJTFRFUiAqLworLyogaW4gbWJveCBpcyBhIDRLIGJpdHMgbWFzayAtIGJpdCBwZXIgVkxBTiAqLworc3RydWN0IG10bmljX2lmX2NvbmZpZ19wb3J0X3ZsYW5fZmlsdGVyX2luX21ib3ggeworCXU2NCBmaWx0ZXJbNjRdOyAvKiB2bGFuc1s2MzowXSBzaXQgaW4gZmlsdGVyWzBdLCB2bGFuc1sxMjc6NjRdIHNpdCBpbiBmaWx0ZXJbMV0gLi4gICovCit9OworCisKKy8qIENNRCBTRVRfUE9SVF9NVFUgKi8KK3N0cnVjdCBtdG5pY19pZl9zZXRfcG9ydF9tdHVfaW5faW1tIHsKKwl1MTYgcmVzZXJ2ZWQxOworCXUxNiBtdHU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIE1UVSBvZiB0aGUgcG9ydCBpbiBieXRlcyAqLworCXUzMiByZXNlcnZlZDI7Cit9OworCisvKiBDTUQgU0VUX1BPUlRfREVGQVVMVF9SSU5HICovCitzdHJ1Y3QgbXRuaWNfaWZfc2V0X3BvcnRfZGVmYXVsdF9yaW5nX2luX2ltbSB7CisJdTggcmVzZXJ2ZWQxWzNdOworCXU4IHJpbmc7IC8qIEluZGV4IG9mIHJpbmcgdGhhdCBjb2xsZWN0cyBwcm9taXNjdW91cyB0cmFmZmljICovCisJdTMyIHJlc2VydmVkMjsKK307CisKKy8qIENNRCBTRVRfUE9SVF9TVEFURSAqLworc3RydWN0IG10bmljX2lmX3NldF9wb3J0X3N0YXRlX2luX2ltbSB7CisJdTMyIHN0YXRlOyAvKiBpZiAxIHRoZSBwb3J0IHN0YXRlIHNob3VsZCBiZSB1cCAqLworI2RlZmluZSBNVE5JQ19NQVNLX0NPTkZJR19QT1JUX1NUQVRFIE1UTklDX0JDKDAsMSkKKwl1MzIgcmVzZXJ2ZWQ7Cit9OworCisvKiBDTUQgQ09ORklHX0NRICovCitzdHJ1Y3QgbXRuaWNfaWZfY29uZmlnX2NxX2luX21ib3ggeworCXU4ICAgICAgICAgICByZXNlcnZlZDE7CisJdTggICAgICAgICAgIGNxOworCXU4ICAgICAgICAgICBzaXplOyAgICAgICAgLyogTnVtIENRcyBpcyAyXnNpemUgKHNpemUgPD0gMjIpICovCisJdTggICAgICAgICAgIG9mZnNldDsgLyogc3RhcnQgYWRkcmVzcyBvZiBDUUUgaW4gZmlyc3QgcGFnZSAoMTE6NikgKi8KKwl1MTYgIHRsYXN0OyAgICAgIC8qIGludGVycnVwdCBtb2RlcmF0aW9uIHRpbWVyIGZyb20gbGFzdCBjb21wbGV0aW9uIHVzZWMgKi8KKwl1OCAgICAgIGZsYWdzOyAgLyogZmxhZ3MgKi8KKwl1OCAgICAgICAgICBpbnRfdmVjdG9yOyAvKiBNU0kgaW5kZXggaWYgTVNJIGlzIGVuYWJsZWQsIG90aGVyd2lzZSByZXNlcnZlZCAqLworCXUxNiByZXNlcnZlZDI7CisJdTE2IG1heF9jbnQ7ICAgIC8qIGludGVycnVwdCBtb2RlcmF0aW9uIGNvdW50ZXIgKi8KKwl1OCAgICAgICAgICBwYWdlX3NpemU7ICAgLyogZWFjaCBtYXBwZWQgcGFnZSBpcyAyXigxMitwYWdlX3NpemUpIGJ5dGVzICovCisJdTggICAgICAgcmVzZXJ2ZWQ0WzNdOworCXUzMiBkYl9yZWNvcmRfYWRkcl9oOyAgLypwaHlzaWNhbCBhZGRyZXNzIG9mIENRIGRvb3JiZWxsIHJlY29yZCAqLworCXUzMiBkYl9yZWNvcmRfYWRkcl9sOyAgLypwaHlzaWNhbCBhZGRyZXNzIG9mIENRIGRvb3JiZWxsIHJlY29yZCAqLworCXUzMiBwYWdlX2FkZHJlc3NbMF07IC8qIDY0IGJpdCBwYWdlIGFkZHJlc3NlcyBvZiBDUSBidWZmZXIgKi8KK307CisKKy8qIENNRCBDT05GSUdfUlhfUklORyAqLworc3RydWN0IG10bmljX2lmX2NvbmZpZ19yeF9yaW5nX2luX21ib3ggeworCXU4ICAgICAgIHJlc2VydmVkMTsKKwl1OCAgICAgICByaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHJpbmcgaW5kZXggKHdpdGggb2Zmc2V0KSAqLworCXU4ICAgICAgIHN0cmlkZV9zaXplOyAgICAgICAgICAgLyogc3RyaWRlIGFuZCBzaXplICovCisJLyogRW50cnkgc2l6ZSA9IDE2KiAoMl5zdHJpZGUpIGJ5dGVzICovCisjZGVmaW5lIE1UTklDX01BU0tfQ09ORklHX1JYX1JJTkdfU1RSSURFICAgICBNVE5JQ19CQyg0LDMpCisJLyogUnggcmluZyBzaXplIGlzIDJec2l6ZSBlbnRyaWVzICovCisjZGVmaW5lIE1UTklDX01BU0tfQ09ORklHX1JYX1JJTkdfU0laRQkgICAgICBNVE5JQ19CQygwLDQpCisJdTggICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdDAgLSBoZWFkZXIgc2VwYXJhdGlvbiAqLworCXU4ICAgICAgIHBhZ2Vfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEVhY2ggbWFwcGVkIHBhZ2UgaXMgMl4oMTIrcGFnZV9zaXplKSBieXRlcyAqLworCXU4ICAgICAgIHJlc2VydmVkMlsyXTsKKwl1OCAgICAgICBjcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENRIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpbmcgKi8KKwl1MzIgICAgICBkYl9yZWNvcmRfYWRkcl9oOworCXUzMiAgICAgIGRiX3JlY29yZF9hZGRyX2w7CisJdTMyICAgICAgcGFnZV9hZGRyZXNzWzBdOy8qIEFycmF5IG9mIDJec2l6ZSA2NGIgcGFnZSBkZXNjcmlwdG9yIGFkZHJlc3NlcyAqLworCS8qIE11c3QgaG9sZCBhbGwgUnggZGVzY3JpcHRvcnMgKyBkb29yYmVsbCByZWNvcmQuICovCit9OworCisvKiBUaGUgbW9kaWZpZXIgZm9yIFNFVF9SWF9SSU5HX0FERFIgKi8KK3N0cnVjdCBtdG5pY19pZl9zZXRfcnhfcmluZ19tb2RpZmllciB7CisJdTggcmVzZXJ2ZWQ7CisJdTggcG9ydF9udW07CisJdTggaW5kZXg7CisJdTggcmluZzsKK307CisKKy8qIENNRCBTRVRfUlhfUklOR19BRERSICovCitzdHJ1Y3QgbXRuaWNfaWZfc2V0X3J4X3JpbmdfYWRkcl9pbl9pbW0geworCXUxNiBtYWNfNDdfMzI7ICAgICAgICAgICAvKiBVQ0FTVCBNQUMgQWRkcmVzcyBiaXRzIDQ3OjMyICovCisJdTE2IGZsYWdzX3ZsYW5faWQ7IC8qIE1BQy9WTEFOIGZsYWdzIGFuZCB2bGFuIGlkICovCisjZGVmaW5lIE1UTklDX01BU0tfU0VUX1JYX1JJTkdfQUREUl9WTEFOX0lEIE1UTklDX0JDKDAsMTIpCisjZGVmaW5lIE1UTklDX01BU0tfU0VUX1JYX1JJTkdfQUREUl9CWV9NQUMgIE1UTklDX0JDKDEyLDEpCisjZGVmaW5lIE1UTklDX01BU0tfU0VUX1JYX1JJTkdfQUREUl9CWV9WTEFOIE1UTklDX0JDKDEzLDEpCisJdTMyIG1hY18zMV8wOyAgIC8qIFVDQVNUIE1BQyBBZGRyZXNzIGJpdHMgMzE6MCAqLworfTsKKworLyogQ01EIENPTkZJR19UWF9SSU5HICovCitzdHJ1Y3QgbXRuaWNfaWZfY29uZmlnX3NlbmRfcmluZ19pbl9tYm94IHsKKwl1MTYgcmluZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSByaW5nIGluZGV4ICh3aXRoIG9mZnNldCkgKi8KKyNkZWZpbmUgTVROSUNfTUFTS19DT05GSUdfVFhfUklOR19JTkRFWCAgTVROSUNfQkMoMCw4KQorCXU4ICAgICAgIHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeCByaW5nIHNpemUgaXMgMzIqMl5zaXplIGJ5dGVzICovCisjZGVmaW5lIE1UTklDX01BU0tfQ09ORklHX1RYX1JJTkdfU0laRQkgIE1UTklDX0JDKDAsNCkKKwl1OCAgICAgICByZXNlcnZlZDsKKwl1OCAgICAgICBwYWdlX3NpemU7ICAgICAgICAgICAgICAgICAgICAgLyogRWFjaCBtYXBwZWQgcGFnZSBpcyAyXigxMitwYWdlX3NpemUpIGJ5dGVzICovCisJdTggICAgICAgcW9zX2NsYXNzOyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBDT1MgdXNlZCBmb3IgdGhpcyBUeCAqLworCXUxNiBjcTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1EgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmluZyAqLworI2RlZmluZSBNVE5JQ19NQVNLX0NPTkZJR19UWF9DUV9JTkRFWAkgIE1UTklDX0JDKDAsOCkKKwl1MzIgcGFnZV9hZGRyZXNzWzBdOyAvKiA2NCBiaXQgcGFnZSBhZGRyZXNzZXMgb2YgZGVzY3JpcHRvciBidWZmZXIuICovCisJLyogVGhlIGJ1ZmZlciBtdXN0IGFjY29tbW9kYXRlIGFsbCBUeCBkZXNjcmlwdG9ycyAqLworfTsKKworLyogQ01EIENPTkZJR19FUSAqLworc3RydWN0IG10bmljX2lmX2NvbmZpZ19lcV9pbl9tYm94IHsKKwl1OCByZXNlcnZlZDE7CisJdTggaW50X3ZlY3RvcjsgLyogTVNJIGluZGV4IGlmIE1TSSBlbmFibGVkOyBvdGhlcndpc2UgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTVROSUNfTUFTS19DT05GSUdfRVFfSU5UX1ZFQyBNVE5JQ19CQygwLDYpCisJdTggc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW0gQ1FzIGlzIDJec2l6ZSBlbnRyaWVzIChzaXplIDw9IDIyKSAqLworI2RlZmluZSBNVE5JQ19NQVNLX0NPTkZJR19FUV9TSVpFCSBNVE5JQ19CQygwLDUpCisJdTggb2Zmc2V0OyAgICAgICAgICAgICAgLyogU3RhcnQgYWRkcmVzcyBvZiBDUUUgaW4gZmlyc3QgcGFnZSAoMTE6NikgKi8KKyNkZWZpbmUgTVROSUNfTUFTS19DT05GSUdfRVFfT0ZGU0VUCSBNVE5JQ19CQygwLDYpCisJdTggcGFnZV9zaXplOyAvKiBFYWNoIG1hcHBlZCBwYWdlIGlzIDJeKDEyK3BhZ2Vfc2l6ZSkgYnl0ZXMqLworCXU4IHJlc2VydmVkWzNdOworCXUzMiBwYWdlX2FkZHJlc3NbMF07IC8qIDY0IGJpdCBwYWdlIGFkZHJlc3NlcyBvZiBFUSBidWZmZXIgKi8KK307CisKKy8qIENNRCBSRUxFQVNFX1JFU09VUkNFICovCitlbnVtIG10bmljX2lmX3Jlc291cmNlX3R5cGVzIHsKKwlNVE5JQ19JRl9SRVNPVVJDRV9UWVBFX0NRID0gMCwKKwlNVE5JQ19JRl9SRVNPVVJDRV9UWVBFX1JYX1JJTkcsCisJTVROSUNfSUZfUkVTT1VSQ0VfVFlQRV9UWF9SSU5HLAorCU1UTklDX0lGX1JFU09VUkNFX1RZUEVfRVEKK307CisKK3N0cnVjdCBtdG5pY19pZl9yZWxlYXNlX3Jlc291cmNlX2luX2ltbSB7CisJdTggcmVzZXJ2ZWQxOworCXU4IGluZGV4OyAgICAgICAgIC8qIG11c3QgYmUgMCBmb3IgVFlQRV9FUSAqLworCXU4IHJlc2VydmVkMjsKKwl1OCB0eXBlOyAgICAgICAgICAvKiBzZWUgZW51bSBtdG5pY19pZl9yZXNvdXJjZV90eXBlcyAqLworCXUzMiByZXNlcnZlZDM7Cit9OworCisKKworCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogUENJIGFkZG9uIHN0cnVjdHVyZXMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgcGNpZGV2IHsKKwl1bnNpZ25lZCBsb25nIGJhcls2XTsKKwl1MzIgZGV2X2NvbmZpZ19zcGFjZVs2NF07CisJc3RydWN0IHBjaV9kZXZpY2UgKmRldjsKKwl1OCBidXM7CisJdTggZGV2Zm47Cit9OworCitzdHJ1Y3QgZGV2X3BjaV9zdHJ1Y3QgeworCXN0cnVjdCBwY2lkZXYgZGV2OworCXN0cnVjdCBwY2lkZXYgYnI7Cit9OworCisvKiBUaGUgb25seSBnbG9iYWwgdmFyICovCitzdHJ1Y3QgZGV2X3BjaV9zdHJ1Y3QgbXRuaWNfcGNpX2RldjsKKworCisKKyNlbmRpZiAvKiBIX01UTklDX0lGX0RFRlNfSCAqLworCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9teXJpMTBnZS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbXlyaTEwZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzJlMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbXlyaTEwZ2UuYwpAQCAtMCwwICsxLDEwNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0qLSBsaW51eC1jIC0qLQorICogTXlyaWNvbSAxMEdiIE5ldHdvcmsgSW50ZXJmYWNlIENhcmQgU29mdHdhcmUKKyAqIENvcHlyaWdodCAyMDA5LCBNeXJpY29tLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKy8qCisgKiBBdXRob3I6IEdsZW5uIEJyb3duIDxnbGVubkBteXJpLmNvbT4KKyAqLworCisvKgorICogR2VuZXJhbCBUaGVvcnkgb2YgT3BlcmF0aW9uCisgKgorICogVGhpcyBpcyBhIG1pbmltYWwgTXlyaWNvbSAxMCBnaWdhYml0IEV0aGVybmV0IGRyaXZlciBmb3IgbmV0d29yaworICogYm9vdC4KKyAqCisgKiBJbml0aWFsaXphdGlvbgorICoKKyAqIG15cmkxMGdlX3BjaV9wcm9iZSgpIGlzIGNhbGxlZCBieSBnUFhFIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqIE1pbmltYWwgTklDIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZCB0byBtaW5pbWl6ZSByZXNvdXJjZXMKKyAqIGNvbnN1bWVkIHdoZW4gdGhlIGRyaXZlciBpcyByZXNpZGVudCBidXQgdW51c2VkLgorICoKKyAqIE5ldHdvcmsgQm9vdAorICoKKyAqIG15cmkxMGdlX25ldF9vcGVuKCkgaXMgY2FsbGVkIGJ5IGdQWEUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gbmV0d29yaworICogYm9vdCBmcm9tIHRoZSBjYXJkLiAgUGFja2V0IGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBhbmQgdGhlIE5JQworICogaW50ZXJmYWNlIGlzIGluaXRpYWxpemVkLgorICoKKyAqIFRyYW5zbWl0CisgKgorICogbXlyaTEwZ2VfbmV0X3RyYW5zbWl0KCkgZW5xdWV1ZXMgZnJhbWVzIGZvciB0cmFuc21pc3Npb24gYnkgd3JpdGluZworICogZGlzY3JpcHRvcnMgdG8gdGhlIE5JQydzIHR4IHJpbmcuICBGb3Igc2ltcGxpY2l0eSBhbmQgdG8gYXZvaWQKKyAqIGNvcGllcywgd2UgYWx3YXlzIGhhdmUgdGhlIE5JQyBETUEgdXAgdGhlIHBhY2tldC4gIFRoZSBzZW50IEkvTworICogYnVmZmVyIGlzIHJlbGVhc2VkIG9uY2UgdGhlIE5JQyBzaWduYWxzIG15cmkxMGdlX2ludGVycnVwdF9oYW5kbGVyKCkKKyAqIHRoYXQgdGhlIHNlbmQgaGFzIGNvbXBsZXRlZC4KKyAqCisgKiBSZWNlaXZlCisgKgorICogUmVjZWl2ZXMgYXJlIHBvc3RlZCB0byB0aGUgTklDJ3MgcmVjZWl2ZSByaW5nLiAgVGhlIE5JQyBmaWxscyBhCisgKiBETUFhYmxlIHJlY2VpdmVfY29tcGxldGlvbiByaW5nIHdpdGggY29tcGxldGlvbiBub3RpZmljYXRpb25zLgorICogbXlyaTEwZ2VfbmV0X3BvbGwoKSBwb2xscyBmb3IgdGhlc2UgcmVjZWl2ZSBub3RpZmljYXRpb25zLCBwb3N0cworICogcmVwbGFjZW1lbnQgcmVjZWl2ZSBidWZmZXJzIHRvIHRoZSBOSUMsIGFuZCBwYXNzZXMgcmVjZWl2ZWQgZnJhbWVzCisgKiB0byBuZXRkZXZfcngoKS4KKyAqLworCisvKgorICogRGVidWdnaW5nIGxldmVsczoKKyAqCS0gREJHKCkgaXMgZm9yIGFueSBlcnJvcnMsIGkuZS4gZmFpbGVkIGFsbG9jX2lvYigpLCBtYWxsb2NfZG1hKCksCisgKgkgIFRYIG92ZXJmbG93LCBjb3JydXB0ZWQgcGFja2V0cywgLi4uCisgKgktIERCRzIoKSBpcyBmb3Igc3VjY2Vzc2Z1bCBldmVudHMsIGxpa2UgcGFja2V0IHJlY2VpdmVkLAorICoJICBwYWNrZXQgdHJhbnNtaXR0ZWQsIGFuZCBvdGhlciBnZW5lcmFsIG5vdGlmaWNhdGlvbnMuCisgKgktIERCR1AoKSBwcmludHMgdGhlIG5hbWUgb2YgZWFjaCBjYWxsZWQgZnVuY3Rpb24gb24gZW50cnkKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorCisjaW5jbHVkZSAibXlyaTEwZ2VfbWNwLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGb3J3YXJkIGRlY2xhcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFBDSSBkcml2ZXIgZW50cnkgcG9pbnRzICovCisKK3N0YXRpYyBpbnQJbXlyaTEwZ2VfcGNpX3Byb2JlICggc3RydWN0IHBjaV9kZXZpY2UqLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQqICk7CitzdGF0aWMgdm9pZAlteXJpMTBnZV9wY2lfcmVtb3ZlICggc3RydWN0IHBjaV9kZXZpY2UqICk7CisKKy8qIE5ldHdvcmsgZGV2aWNlIG9wZXJhdGlvbnMgKi8KKworc3RhdGljIHZvaWQJbXlyaTEwZ2VfbmV0X2Nsb3NlICggc3RydWN0IG5ldF9kZXZpY2UqICk7CitzdGF0aWMgdm9pZAlteXJpMTBnZV9uZXRfaXJxICggc3RydWN0IG5ldF9kZXZpY2UqLCBpbnQgZW5hYmxlICk7CitzdGF0aWMgaW50CW15cmkxMGdlX25ldF9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UqICk7CitzdGF0aWMgdm9pZAlteXJpMTBnZV9uZXRfcG9sbCAoIHN0cnVjdCBuZXRfZGV2aWNlKiApOworc3RhdGljIGludAlteXJpMTBnZV9uZXRfdHJhbnNtaXQgKCBzdHJ1Y3QgbmV0X2RldmljZSosIHN0cnVjdCBpb19idWZmZXIqICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb25zdGFudHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNYXhpbXVtIHJpbmcgaW5kaWNlcywgdXNlZCB0byB3cmFwIHJpbmcgaW5kaWNlcy4gIFRoZXNlIG11c3QgYmUgMioqTi0xLiAqLworCisjZGVmaW5lIE1ZUkkxMEdFX1RSQU5TTUlUX1dSQVAgICAgICAgICAgICAgICAgICAxVQorI2RlZmluZSBNWVJJMTBHRV9SRUNFSVZFX1dSQVAgICAgICAgICAgICAgICAgICAgN1UKKyNkZWZpbmUgTVlSSTEwR0VfUkVDRUlWRV9DT01QTEVUSU9OX1dSQVAgICAgICAgIDMxVQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRHJpdmVyIGludGVybmFsIGRhdGEgdHlwZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU3RydWN0dXJlIGhvbGRpbmcgYWxsIERNQSBidWZmZXJzIGZvciBhIE5JQywgd2hpY2ggd2Ugd2lsbAorICAgYWxsb2NhdGVkIGFzIGNvbnRpZ3VvdXMgcmVhZC93cml0ZSBETUFhYmxlIG1lbW9yeSB3aGVuIHRoZSBOSUMgaXMKKyAgIGluaXRpYWxpemVkLiAqLworCitzdHJ1Y3QgbXlyaTEwZ2VfZG1hX2J1ZmZlcnMKK3sKKwkvKiBUaGUgTklDIERNQXMgcmVjZWl2ZSBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbnMgaW50byB0aGlzIHJpbmcgKi8KKworCW1jcF9zbG90X3QgcmVjZWl2ZV9jb21wbGV0aW9uWzErTVlSSTEwR0VfUkVDRUlWRV9DT01QTEVUSU9OX1dSQVBdOworCisJLyogSW50ZXJydXB0IGRldGFpbHMgYXJlIERNQWQgaGVyZSBiZWZvcmUgaW50ZXJydXB0aW5nLiAqLworCisJbWNwX2lycV9kYXRhX3QgaXJxX2RhdGE7IC8qIDY0QiAqLworCisJLyogTklDIGNvbW1hbmQgY29tcGxldGlvbiBzdGF0dXMgaXMgRE1BZCBoZXJlLiAqLworCisJbWNwX2NtZF9yZXNwb25zZV90IGNvbW1hbmRfcmVzcG9uc2U7IC8qIDhCICovCit9OworCitzdHJ1Y3QgbXlyaTEwZ2VfcHJpdmF0ZQoreworCS8qIEludGVycnVwdCBzdXBwb3J0ICovCisKKwl1aW50MzIJKmlycV9jbGFpbTsJLyogaW4gTklDIFNSQU0gKi8KKwl1aW50MzIJKmlycV9kZWFzc2VydDsJLyogaW4gTklDIFNSQU0gKi8KKworCS8qIERNQSBidWZmZXJzLiAqLworCisJc3RydWN0IG15cmkxMGdlX2RtYV9idWZmZXJzCSpkbWE7CisKKwkvKgorCSAqIFRyYW5zbWl0IHN0YXRlLgorCSAqCisJICogVGhlIGNvdW50cyBoZXJlIGFyZSB1aW50MzIgZm9yIGVhc3kgY29tcGFyaXNvbiB3aXRoCisJICogcHJpdi0+ZG1hLT5pcnFfZGF0YS5zZW5kX2RvbmVfY291bnQgYW5kIHdpdGggZWFjaCBvdGhlci4KKwkgKi8KKworCW1jcF9rcmVxX2V0aGVyX3NlbmRfdAkqdHJhbnNtaXRfcmluZzsJLyogaW4gTklDIFNSQU0gKi8KKwl1aW50MzIgICAgICAgICAgICAgICAgICAgdHJhbnNtaXRfcmluZ193cmFwOworCXVpbnQzMiAgICAgICAgICAgICAgICAgICB0cmFuc21pdHNfcG9zdGVkOworCXVpbnQzMiAgICAgICAgICAgICAgICAgICB0cmFuc21pdHNfZG9uZTsKKwlzdHJ1Y3QgaW9fYnVmZmVyCSp0cmFuc21pdF9pb2JbMSArIE1ZUkkxMEdFX1RSQU5TTUlUX1dSQVBdOworCisJLyoKKwkgKiBSZWNlaXZlIHN0YXRlLgorCSAqLworCisJbWNwX2tyZXFfZXRoZXJfcmVjdl90CSpyZWNlaXZlX3Bvc3RfcmluZzsJLyogaW4gTklDIFNSQU0gKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgcmVjZWl2ZV9wb3N0X3Jpbmdfd3JhcDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgcmVjZWl2ZXNfcG9zdGVkOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICByZWNlaXZlc19kb25lOworCXN0cnVjdCBpb19idWZmZXIJKnJlY2VpdmVfaW9iWzEgKyBNWVJJMTBHRV9SRUNFSVZFX1dSQVBdOworCisJLyogQWRkcmVzcyBmb3Igd3JpdGluZyBjb21tYW5kcyB0byB0aGUgZmlybXdhcmUuCisJICAgQkVXQVJFOiB0aGUgdmFsdWUgbXVzdCBiZSB3cml0dGVuIDMyIGJpdHMgYXQgYSB0aW1lLiAqLworCisJbWNwX2NtZF90CSpjb21tYW5kOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERyaXZlciBpbnRlcm5hbCBmdW5jdGlvbnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUHJpbnQgcmluZyBzdGF0dXMgd2hlbiBkZWJ1Z2dpbmcuICBVc2UgdGhpcyBvbmx5IGFmdGVyIGEgcHJpbnRlZAorICAgdmFsdWUgY2hhbmdlcy4gKi8KKworI2RlZmluZSBEQkcyX1JJTkdTKCBwcml2ICkgCQkJCQkJXAorCURCRzIgKCAidHggJXgvJXggcnggJXgvJXggaW4gJXMoKSBcbiIsCQkJCVwKKwkgICAgICAgKCBwcml2ICkgLT50cmFuc21pdHNfZG9uZSwgKCBwcml2ICkgLT4gdHJhbnNtaXRzX3Bvc3RlZCwJXAorCSAgICAgICAoIHByaXYgKSAtPnJlY2VpdmVzX2RvbmUsICggcHJpdiApIC0+IHJlY2VpdmVzX3Bvc3RlZCwJXAorCSAgICAgICBfX0ZVTkNUSU9OX18gKQorCisvKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZHJpdmVyIHByaXZhdGUgZGF0YSBmb3IgYSBuZXR3b3JrIGRldmljZS4KKyAqCisgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UgY3JlYXRlZCBieSB0aGlzIGRyaXZlci4KKyAqIEByZXQgcHJpdglUaGUgY29ycmVzcG9uZGluZyBkcml2ZXIgcHJpdmF0ZSBkYXRhLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBteXJpMTBnZV9wcml2YXRlICpteXJpMTBnZV9wcml2ICggc3RydWN0IG5ldF9kZXZpY2UgKm5kICkKK3sKKwkvKiBPdXIgcHJpdmF0ZSBkYXRhIGFsd2F5cyBmb2xsb3dzIHRoZSBuZXR3b3JrIGRldmljZSBpbiBtZW1vcnksCisJICAgc2luY2Ugd2UgdXNlIGFsbG9jX25ldGRldigpIHRvIGFsbG9jYXRlIHRoZSBzdG9yYWdlLiAqLworCisJcmV0dXJuICggc3RydWN0IG15cmkxMGdlX3ByaXZhdGUgKiApICggbmQgKyAxICk7Cit9CisKKy8qCisgKiBQYXNzIGEgcmVjZWl2ZSBidWZmZXIgdG8gdGhlIE5JQyB0byBiZSBmaWxsZWQuCisgKgorICogQHYgcHJpdglUaGUgbmV0d29yayBkZXZpY2UgdG8gcmVjZWl2ZSB0aGUgYnVmZmVyLgorICogQHYgaW9iCVRoZSBJL08gYnVmZmVyIHRvIGZpbGwuCisgKgorICogUmVjZWl2ZSBidWZmZXJzIGFyZSBmaWxsZWQgaW4gRklGTyBvcmRlci4KKyAqLworc3RhdGljIHZvaWQgbXlyaTEwZ2VfcG9zdF9yZWNlaXZlICggc3RydWN0IG15cmkxMGdlX3ByaXZhdGUgKnByaXYsCisJCQkJICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYiApCit7CisJdW5zaWduZWQgaW50CQkgcmVjZWl2ZXNfcG9zdGVkOworCW1jcF9rcmVxX2V0aGVyX3JlY3ZfdAkqcmVxdWVzdDsKKworCS8qIFJlY29yZCB0aGUgcG9zdGVkIEkvTyBidWZmZXIsIHRvIGJlIHBhc3NlZCB0byBuZXRkZXZfcngoKSBvbgorCSAgIHJlY2VpdmUuICovCisKKwlyZWNlaXZlc19wb3N0ZWQgPSBwcml2LT5yZWNlaXZlc19wb3N0ZWQ7CisJcHJpdi0+cmVjZWl2ZV9pb2JbcmVjZWl2ZXNfcG9zdGVkICYgTVlSSTEwR0VfUkVDRUlWRV9XUkFQXSA9IGlvYjsKKworCS8qIFBvc3QgdGhlIHJlY2VpdmUuICovCisKKwlyZXF1ZXN0ID0gJnByaXYtPnJlY2VpdmVfcG9zdF9yaW5nW3JlY2VpdmVzX3Bvc3RlZAorCQkJCQkgICAmIHByaXYtPnJlY2VpdmVfcG9zdF9yaW5nX3dyYXBdOworCXJlcXVlc3QtPmFkZHJfaGlnaCA9IDA7CisJd21iKCk7CisJcmVxdWVzdC0+YWRkcl9sb3cgPSBodG9ubCAoIHZpcnRfdG9fYnVzICggaW9iLT5kYXRhICkgKTsKKwlwcml2LT5yZWNlaXZlc19wb3N0ZWQgPSArK3JlY2VpdmVzX3Bvc3RlZDsKK30KKworLyoKKyAqIEV4ZWN1dGUgYSBjb21tYW5kIG9uIHRoZSBOSUMuCisgKgorICogQHYgcHJpdglOSUMgdG8gcGVyZm9ybSB0aGUgY29tbWFuZC4KKyAqIEB2IGNtZAlUaGUgY29tbWFuZCB0byBwZXJmb3JtLgorICogQHYgZGF0YQlJL08gY29weSBidWZmZXIgZm9yIHBhcmFtZXRlcnMvcmVzdWx0cworICogQHJldCByYwkwIG9uIHN1Y2Nlc3MsIGVsc2UgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBteXJpMTBnZV9jb21tYW5kICggc3RydWN0IG15cmkxMGdlX3ByaXZhdGUgKnByaXYsCisJCQkgICAgICB1aW50MzIgY21kLAorCQkJICAgICAgdWludDMyIGRhdGFbM10gKQoreworCWludAkJCQkgaTsKKwltY3BfY21kX3QJCQkqY29tbWFuZDsKKwl1aW50MzIJCQkJIHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQJCQkgc2xlcHRfbXM7CisJdm9sYXRpbGUgbWNwX2NtZF9yZXNwb25zZV90CSpyZXNwb25zZTsKKworCURCR1AgKCAibXlyaTEwZ2VfY29tbWFuZCAoICwlZCwgKSBcbiIsIGNtZCApOworCWNvbW1hbmQgPSBwcml2LT5jb21tYW5kOworCXJlc3BvbnNlID0gJnByaXYtPmRtYS0+Y29tbWFuZF9yZXNwb25zZTsKKworCS8qIE1hcmsgdGhlIGNvbW1hbmQgYXMgaW5jb21wbGV0ZS4gKi8KKworCXJlc3BvbnNlLT5yZXN1bHQgPSAweEZGRkZGRkZGOworCisJLyogUGFzcyB0aGUgY29tbWFuZCB0byB0aGUgTklDLiAqLworCisJY29tbWFuZC0+Y21kCQkgICAgPSBodG9ubCAoIGNtZCApOworCWNvbW1hbmQtPmRhdGEwCQkgICAgPSBodG9ubCAoIGRhdGFbMF0gKTsKKwljb21tYW5kLT5kYXRhMQkJICAgID0gaHRvbmwgKCBkYXRhWzFdICk7CisJY29tbWFuZC0+ZGF0YTIJCSAgICA9IGh0b25sICggZGF0YVsyXSApOworCWNvbW1hbmQtPnJlc3BvbnNlX2FkZHIuaGlnaCA9IDA7CisJY29tbWFuZC0+cmVzcG9uc2VfYWRkci5sb3cKKwkJPSBodG9ubCAoIHZpcnRfdG9fYnVzICggJnByaXYtPmRtYS0+Y29tbWFuZF9yZXNwb25zZSApICk7CisJZm9yICggaT0wOyBpPDM2OyBpKz00ICkKKwkJKiAoIHVpbnQzMiAqICkgJmNvbW1hbmQtPnBhZFtpXSA9IDA7CisJd21iKCk7CisJKiAoIHVpbnQzMiAqICkgJmNvbW1hbmQtPnBhZFszNl0gPSAwOworCisJLyogV2FpdCB1cCB0byAyIHNlY29uZHMgZm9yIGEgcmVzcG9uc2UuICovCisKKwlmb3IgKCBzbGVwdF9tcz0wOyBzbGVwdF9tczwyMDAwOyBzbGVwdF9tcysrICkgeworCQlyZXN1bHQgPSByZXNwb25zZS0+cmVzdWx0OworCQlpZiAoIHJlc3VsdCA9PSAwICkgeworCQkJZGF0YVswXSA9IG50b2hsICggcmVzcG9uc2UtPmRhdGEgKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKCByZXN1bHQgIT0gMHhGRkZGRkZGRiApIHsKKwkJCURCRyAoICJjbWQlZDoweCV4XG4iLAorCQkJICAgICAgY21kLAorCQkJICAgICAgbnRvaGwgKCByZXNwb25zZS0+cmVzdWx0ICkgKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXVkZWxheSAoIDEwMDAgKTsKKwkJcm1iKCk7CisJfQorCURCRyAoICJjbWQlZDp0aW1lZCBvdXRcbiIsIGNtZCApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCisvKgorICogSGFuZGxlIGFueSBwZW5kaW5nIGludGVycnVwdC4KKyAqCisgKiBAdiBuZXRkZXYJCURldmljZSBiZWluZyBwb2xsZWQgZm9yIGludGVycnVwdHMuCisgKgorICogVGhpcyBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGxldCB0aGUgZHJpdmVyIGNoZWNrIGZvciBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBteXJpMTBnZV9pbnRlcnJ1cHRfaGFuZGxlciAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBteXJpMTBnZV9wcml2YXRlICpwcml2OworCW1jcF9pcnFfZGF0YV90CQkqaXJxX2RhdGE7CisJdWludDgJCQkgdmFsaWQ7CisKKwlwcml2ID0gbXlyaTEwZ2VfcHJpdiAoIG5ldGRldiApOworCWlycV9kYXRhID0gJnByaXYtPmRtYS0+aXJxX2RhdGE7CisKKwkvKiBSZXR1cm4gaWYgdGhlcmUgd2FzIG5vIGludGVycnVwdC4gKi8KKworCXJtYigpOworCXZhbGlkID0gaXJxX2RhdGEtPnZhbGlkOworCWlmICggIXZhbGlkICkKKwkJcmV0dXJuOworCURCRzIgKCAiaXJxICIgKTsKKworCS8qIFRlbGwgdGhlIE5JQyB0byBkZWFzc2VydCB0aGUgaW50ZXJydXB0IGFuZCBjbGVhcgorCSAgIGlycV9kYXRhLT52YWxpZC4qLworCisJKnByaXYtPmlycV9kZWFzc2VydCA9IDA7CS8qIGFueSB2YWx1ZSBpcyBPSy4gKi8KKwltYigpOworCisJLyogSGFuZGxlIGFueSBuZXcgcmVjZWl2ZXMuICovCisKKwlpZiAoIHZhbGlkICYgMSApIHsKKworCQkvKiBQYXNzIHRoZSByZWNlaXZlIGludGVycnVwdCB0b2tlbiBiYWNrIHRvIHRoZSBOSUMuICovCisKKwkJREJHMiAoICJyeCAiICk7CisJCSpwcml2LT5pcnFfY2xhaW0gPSBodG9ubCAoIDMgKTsKKwkJd21iKCk7CisJfQorCisJLyogSGFuZGxlIGFueSBzZW50IHBhY2tldCBieSBmcmVlaW5nIGl0cyBJL08gYnVmZmVyLCBub3cgdGhhdAorCSAgIHdlIGtub3cgaXQgaGFzIGJlZW4gRE1BZC4gKi8KKworCWlmICggdmFsaWQgJiAyICkgeworCQl1bnNpZ25lZCBpbnQgbmljX2RvbmVfY291bnQ7CisKKwkJREJHMiAoICJzbnQgIiApOworCQluaWNfZG9uZV9jb3VudCA9IG50b2hsICggcHJpdi0+ZG1hLT5pcnFfZGF0YS5zZW5kX2RvbmVfY291bnQgKTsKKwkJd2hpbGUgKCBwcml2LT50cmFuc21pdHNfZG9uZSAhPSBuaWNfZG9uZV9jb3VudCApIHsKKwkJCXN0cnVjdCBpb19idWZmZXIgKmlvYjsKKworCQkJaW9iID0gcHJpdi0+dHJhbnNtaXRfaW9iIFtwcml2LT50cmFuc21pdHNfZG9uZQorCQkJCQkJICAmIE1ZUkkxMEdFX1RSQU5TTUlUX1dSQVBdOworCQkJREJHMiAoICIlcCAiLCBpb2IgKTsKKwkJCW5ldGRldl90eF9jb21wbGV0ZSAoIG5ldGRldiwgaW9iICk7CisJCQkrK3ByaXYtPnRyYW5zbWl0c19kb25lOworCQl9CisJfQorCisJLyogUmVjb3JkIGFueSBzdGF0aXN0aWNzIHVwZGF0ZS4gKi8KKworCWlmICggaXJxX2RhdGEtPnN0YXRzX3VwZGF0ZWQgKSB7CisKKwkJLyogVXBkYXRlIHRoZSBsaW5rIHN0YXR1cy4gKi8KKworCQlEQkcyICggInN0YXRzICIgKTsKKwkJaWYgKCBudG9obCAoIGlycV9kYXRhLT5saW5rX3VwICkgPT0gTVhHRUZXX0xJTktfVVAgKQorCQkJbmV0ZGV2X2xpbmtfdXAgKCBuZXRkZXYgKTsKKwkJZWxzZQorCQkJbmV0ZGV2X2xpbmtfZG93biAoIG5ldGRldiApOworCisJCS8qIElnbm9yZSBhbGwgZXJyb3IgY291bnRlcnMgZnJvbSB0aGUgTklDLiAqLworCX0KKworCS8qIFdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgdG8gYmUgZGVhc3NlcnRlZCwgYXMgaW5kaWNhdGVkIGJ5CisJICAgaXJxX2RhdGEtPnZhbGlkLCB3aGljaCBpcyBzZXQgYnkgdGhlIE5JQyBhZnRlciB0aGUgZGVhc3NlcnQuICovCisKKwlEQkcyICggIndhaXQgIiApOworCWRvIHsKKwkJbWIoKTsKKwl9IHdoaWxlICggaXJxX2RhdGEtPnZhbGlkICk7CisKKwkvKiBDbGFpbSB0aGUgaW50ZXJydXB0IHRvIGVuYWJsZSBmdXR1cmUgaW50ZXJydXB0IGdlbmVyYXRpb24uICovCisKKwlEQkcyICggImNsYWltXG4iICk7CisJKiAoIHByaXYtPmlycV9jbGFpbSArIDEgKSA9IGh0b25sICggMyApOworCW1iKCk7Cit9CisKKy8qIENvbnN0YW50cyBmb3IgcmVhZGluZyB0aGUgU1RSSU5HX1NQRUNTIHZpYSB0aGUgTXlyaWNvbQorICAgVmVuZG9yIFNwZWNpZmljIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGNhcGFiaWxpdHkuICovCisKKyNkZWZpbmUgVlNfQUREUiAoIHZzICsgMHgxOCApCisjZGVmaW5lIFZTX0RBVEEgKCB2cyArIDB4MTQgKQorI2RlZmluZSBWU19NT0RFICggdnMgKyAweDEwICkKKyNkZWZpbmUgCVZTX01PREVfUkVBRDMyIDB4MworI2RlZmluZSAJVlNfTU9ERV9MT0NBVEUgMHg4CisjZGVmaW5lIAkJVlNfTE9DQVRFX1NUUklOR19TUEVDUyAweDMKKworLyoKKyAqIFJlYWQgTUFDIGFkZHJlc3MgZnJvbSBpdHMgJ3N0cmluZyBzcGVjcycgdmlhIHRoZSB2ZW5kb3Itc3BlY2lmaWMKKyAqIGNhcGFiaWxpdHkuICAoVGhpcyBjYXBhYmlsaXR5IGFsbG93cyBOSUMgU1JBTSBhbmQgUk9NIHRvIGJlIHJlYWQKKyAqIGJlZm9yZSBpdCBpcyBtYXBwZWQuKQorICoKKyAqIEB2IHBjaQkJVGhlIGRldmljZS4KKyAqIEB2IG1hYwkJQnVmZmVyIHRvIHN0b3JlIHRoZSBNQUMgYWRkcmVzcy4KKyAqIEByZXQgcmMJCVJldHVybnMgMCBvbiBzdWNjZXNzLCBlbHNlIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgbWFjX2FkZHJlc3NfZnJvbV9zdHJpbmdfc3BlY3MgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorCQkJCQkJICAgdWludDggbWFjW0VUSF9BTEVOXSApCit7CisJY2hhciBzdHJpbmdfc3BlY3NbMjU2XTsKKwljaGFyICpwdHIsICpsaW1pdDsKKwljaGFyICp0byA9IHN0cmluZ19zcGVjczsKKwl1aW50MzIgYWRkcjsKKwl1aW50MzIgbGVuOworCXVuc2lnbmVkIGludCB2czsKKwlpbnQgbWFjX3NldCA9IDA7CisKKwkvKiBGaW5kIHRoZSAidmVuZG9yIHNwZWNpZmljIiBjYXBhYmlsaXR5LiAqLworCisJdnMgPSBwY2lfZmluZF9jYXBhYmlsaXR5ICggcGNpLCA5ICk7CisJaWYgKCB2cyA9PSAwICkgeworCQlEQkcgKCAibm8gVlNcbiIgKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KKworCS8qIExvY2F0ZSB0aGUgU3RyaW5nIHNwZWNzIGluIExBTmFpIFNSQU0uICovCisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKCBwY2ksIFZTX01PREUsIFZTX01PREVfTE9DQVRFICk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoIHBjaSwgVlNfQUREUiwgVlNfTE9DQVRFX1NUUklOR19TUEVDUyApOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoIHBjaSwgVlNfQUREUiwgJmFkZHIgKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKCBwY2ksIFZTX0RBVEEsICZsZW4gKTsKKwlEQkcyICggInNzQCV4LCV4XG4iLCBhZGRyLCBsZW4gKTsKKworCS8qIENvcHkgaW4gdGhlIHN0cmluZyBzcGVjcy4gIFVzZSAzMi1iaXQgcmVhZHMgZm9yIHBlcmZvcm1hbmNlLiAqLworCisJaWYgKCBsZW4gPiBzaXplb2YgKCBzdHJpbmdfc3BlY3MgKSB8fCAoIGxlbiAmIDMgKSApIHsKKwkJREJHICggIlNTIHRvbyBiaWdcbiIgKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KKworCXBjaV93cml0ZV9jb25maWdfYnl0ZSAoIHBjaSwgVlNfTU9ERSwgVlNfTU9ERV9SRUFEMzIgKTsKKwl3aGlsZSAoIGxlbiA+PSA0ICkgeworCQl1aW50MzIgdG1wOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZSAoIHBjaSwgVlNfQUREUiwgYWRkciApOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKCBwY2ksIFZTX0RBVEEsICZ0bXAgKTsKKwkJdG1wID0gbnRvaGwgKCB0bXAgKTsKKwkJbWVtY3B5ICggdG8sICZ0bXAsIDQgKTsKKwkJdG8gKz0gNDsKKwkJYWRkciArPSA0OworCQlsZW4gLT0gNDsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlICggcGNpLCBWU19NT0RFLCAwICk7CisKKwkvKiBQYXJzZSB0aGUgc3RyaW5nIHNwZWNzLiAqLworCisJREJHMiAoICJTVFJJTkdfU1BFQ1M6XG4iICk7CisJcHRyID0gc3RyaW5nX3NwZWNzOworCWxpbWl0ID0gc3RyaW5nX3NwZWNzICsgc2l6ZW9mICggc3RyaW5nX3NwZWNzICk7CisJd2hpbGUgKCAqcHRyICE9ICdcMCcgJiYgcHRyIDwgbGltaXQgKSB7CisJCURCRzIgKCAiJXNcbiIsIHB0ciApOworCQlpZiAoIG1lbWNtcCAoIHB0ciwgIk1BQz0iLCA0ICkgPT0gMCApIHsKKwkJCXVuc2lnbmVkIGludCBpOworCisJCQlwdHIgKz0gNDsKKwkJCWZvciAoIGk9MDsgaTw2OyBpKysgKSB7CisJCQkJaWYgKCAoIHB0ciArIDIgKSA+IGxpbWl0ICkgeworCQkJCQlEQkcgKCAiYmFkIE1BQyBhZGRyXG4iICk7CisJCQkJCXJldHVybiAtRU5PVFNVUDsKKwkJCQl9CisJCQkJbWFjW2ldID0gc3RydG91bCAoIHB0ciwgJnB0ciwgMTYgKTsKKwkJCQlwdHIgKz0gMTsKKwkJCX0KKwkJCW1hY19zZXQgPSAxOworCQl9CisJCWVsc2UKKwkJCXdoaWxlICggcHRyIDwgbGltaXQgJiYgKnB0cisrICk7CisJfQorCisJLyogVmVyaWZ5IHdlIHBhcnNlZCBhbGwgd2UgbmVlZC4gKi8KKworCWlmICggIW1hY19zZXQgKSB7CisJCURCRyAoICJubyBNQUMgYWRkclxuIiApOworCQlyZXR1cm4gLUVOT1RTVVA7CisJfQorCisJREJHMiAoICJNQUMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIG1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0gKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ1BYRSBQQ0kgRGV2aWNlIERyaXZlciBBUEkgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFBDSSBkZXZpY2UuCisgKgorICogQHYgcGNpIAkJVGhlIGRldmljZSdzIGFzc29jaWF0ZWQgcGNpX2RldmljZSBzdHJ1Y3R1cmUuCisgKiBAdiBpZCAgCQlUaGUgUENJIGRldmljZSArIHZlbmRvciBpZC4KKyAqIEByZXQgcmMJCVJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmVyeSBlYXJseSBvbiwgd2hpbGUgZ1BYRSBpcyBpbml0aWFsaXppbmcuCisgKiBUaGlzIGlzIGEgZ1BYRSBQQ0kgRGV2aWNlIERyaXZlciBBUEkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgbXlyaTEwZ2VfcGNpX3Byb2JlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQgX191bnVzZWQgKQoreworCXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcGVyYXRpb25zIG15cmkxMGdlX29wZXJhdGlvbnMgPSB7CisJCS5vcGVuICAgICA9IG15cmkxMGdlX25ldF9vcGVuLAorCQkuY2xvc2UgICAgPSBteXJpMTBnZV9uZXRfY2xvc2UsCisJCS50cmFuc21pdCA9IG15cmkxMGdlX25ldF90cmFuc21pdCwKKwkJLnBvbGwgICAgID0gbXlyaTEwZ2VfbmV0X3BvbGwsCisJCS5pcnEgICAgICA9IG15cmkxMGdlX25ldF9pcnEKKwl9OworCisJY29uc3QgY2hhciAqZGJnOworCWludCByYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBteXJpMTBnZV9wcml2YXRlICpwcml2OworCisJREJHUCAoICJteXJpMTBnZV9wY2lfcHJvYmU6ICIgKTsKKworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2ICggc2l6ZW9mICggKnByaXYgKSApOworCWlmICggIW5ldGRldiApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlkYmcgPSAiYWxsb2NfZXRoZXJkZXYiOworCQlnb3RvIGFib3J0X3dpdGhfbm90aGluZzsKKwl9CisKKwluZXRkZXZfaW5pdCAoIG5ldGRldiwgJm15cmkxMGdlX29wZXJhdGlvbnMgKTsKKwlwcml2ID0gbXlyaTEwZ2VfcHJpdiAoIG5ldGRldiApOworCisJcGNpX3NldF9kcnZkYXRhICggcGNpLCBuZXRkZXYgKTsKKwluZXRkZXYtPmRldiA9ICZwY2ktPmRldjsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gKi8KKworCW15cmkxMGdlX25ldF9pcnEgKCBuZXRkZXYsIDAgKTsKKworCS8qIFJlYWQgdGhlIE5JQyBIVyBhZGRyZXNzLiAqLworCisJcmMgPSBtYWNfYWRkcmVzc19mcm9tX3N0cmluZ19zcGVjcyAoIHBjaSwgbmV0ZGV2LT5od19hZGRyICk7CisJaWYgKCByYyApIHsKKwkJZGJnID0gIm1hY19mcm9tX3NzIjsKKwkJZ290byBhYm9ydF93aXRoX25ldGRldl9pbml0OworCX0KKwlEQkdQICggIm1hYyAiICk7CisKKwkvKiBFbmFibGUgYnVzIG1hc3RlciwgZXRjLiAqLworCisJYWRqdXN0X3BjaV9kZXZpY2UgKCBwY2kgKTsKKwlEQkdQICggInBjaSAiICk7CisKKwkvKiBSZWdpc3RlciB0aGUgaW5pdGlhbGl6ZWQgbmV0d29yayBkZXZpY2UuICovCisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldiAoIG5ldGRldiApOworCWlmICggcmMgKSB7CisJCWRiZyA9ICJyZWdpc3Rlcl9uZXRkZXYiOworCQlnb3RvIGFib3J0X3dpdGhfbmV0ZGV2X2luaXQ7CisJfQorCisJREJHUCAoICJkb25lXG4iICk7CisKKwlyZXR1cm4gMDsKKworYWJvcnRfd2l0aF9uZXRkZXZfaW5pdDoKKwluZXRkZXZfbnVsbGlmeSAoIG5ldGRldiApOworCW5ldGRldl9wdXQgKCBuZXRkZXYgKTsKK2Fib3J0X3dpdGhfbm90aGluZzoKKwlEQkcgKCAiJXM6JXNcbiIsIGRiZywgc3RyZXJyb3IgKCByYyApICk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogUmVtb3ZlIGEgZGV2aWNlIGZyb20gdGhlIFBDSSBkZXZpY2UgbGlzdC4KKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UgdG8gcmVtb3ZlLgorICoKKyAqIFRoaXMgaXMgYSBQQ0kgRGV2aWNlIERyaXZlciBBUEkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIG15cmkxMGdlX3BjaV9yZW1vdmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0ZGV2OworCisJREJHUCAoICJteXJpMTBnZV9wY2lfcmVtb3ZlXG4iICk7CisJbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhICggcGNpICk7CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoIG5ldGRldiApOworCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ1BYRSBOZXR3b3JrIERldmljZSBEcml2ZXIgT3BlcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDbG9zZSBhIG5ldHdvcmsgZGV2aWNlLgorICoKKyAqIEB2IG5ldGRldgkJRGV2aWNlIHRvIGNsb3NlLgorICoKKyAqIFRoaXMgaXMgYSBnUFhFIE5ldHdvcmsgRGV2aWNlIERyaXZlciBBUEkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIG15cmkxMGdlX25ldF9jbG9zZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBteXJpMTBnZV9wcml2YXRlICpwcml2OworCXVpbnQzMgkJCSBkYXRhWzNdOworCisJREJHUCAoICJteXJpMTBnZV9uZXRfY2xvc2VcbiIgKTsKKwlwcml2ID0gbXlyaTEwZ2VfcHJpdiAoIG5ldGRldiApOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisKKwlteXJpMTBnZV9uZXRfaXJxICggbmV0ZGV2LCAwICk7CisKKwkvKiBSZXNldCB0aGUgTklDIGludGVyZmFjZSwgc28gd2Ugd29uJ3QgZ2V0IGFueSBtb3JlIGV2ZW50cyBmcm9tCisJICAgdGhlIE5JQy4gKi8KKworCW15cmkxMGdlX2NvbW1hbmQgKCBwcml2LCBNWEdFRldfQ01EX1JFU0VULCBkYXRhICk7CisKKwkvKiBGcmVlIHJlY2VpdmUgYnVmZmVycyB0aGF0IHdlcmUgbmV2ZXIgZmlsbGVkLiAqLworCisJd2hpbGUgKCBwcml2LT5yZWNlaXZlc19kb25lICE9IHByaXYtPnJlY2VpdmVzX3Bvc3RlZCApIHsKKwkJZnJlZV9pb2IgKCBwcml2LT5yZWNlaXZlX2lvYltwcml2LT5yZWNlaXZlc19kb25lCisJCQkJCSAgICAgJiBNWVJJMTBHRV9SRUNFSVZFX1dSQVBdICk7CisJCSsrcHJpdi0+cmVjZWl2ZXNfZG9uZTsKKwl9CisKKwkvKiBSZWxlYXNlIERNQWFibGUgbWVtb3J5LiAqLworCisJZnJlZV9kbWEgKCBwcml2LT5kbWEsIHNpemVvZiAoICpwcml2LT5kbWEgKSApOworCisJLyogRXJhc2UgYWxsIHN0YXRlIGZyb20gdGhlIG9wZW4uICovCisKKwltZW1zZXQgKCBwcml2LCAwLCBzaXplb2YgKCAqcHJpdiApICk7CisKKwlEQkcyX1JJTkdTICggcHJpdiApOworfQorCisvKgorICogRW5hYmxlIG9yIGRpc2FibGUgSVJRIG1hc2tpbmcuCisgKgorICogQHYgbmV0ZGV2CQlEZXZpY2UgdG8gY29udHJvbC4KKyAqIEB2IGVuYWJsZQkJWmVybyB0byBtYXNrIG9mZiBJUlEsIG5vbi16ZXJvIHRvIGVuYWJsZSBJUlEuCisgKgorICogVGhpcyBpcyBhIGdQWEUgTmV0d29yayBEcml2ZXIgQVBJIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBteXJpMTBnZV9uZXRfaXJxICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGVuYWJsZSApCit7CisJc3RydWN0IHBjaV9kZXZpY2UJKnBjaV9kZXY7CisJdWludDE2CQkJIHZhbDsKKworCURCR1AgKCAibXlyaTEwZ2VfbmV0X2lycVxuIiApOworCXBjaV9kZXYgPSAoIHN0cnVjdCBwY2lfZGV2aWNlICogKSBuZXRkZXYtPmRldjsKKworCS8qIEFkanVzdCB0aGUgSW50ZXJydXB0IERpc2FibGUgYml0IGluIHRoZSBDb21tYW5kIHJlZ2lzdGVyIG9mIHRoZQorCSAgIFBDSSBEZXZpY2UuICovCisKKwlwY2lfcmVhZF9jb25maWdfd29yZCAoIHBjaV9kZXYsIFBDSV9DT01NQU5ELCAmdmFsICk7CisJaWYgKCBlbmFibGUgKQorCQl2YWwgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKKwllbHNlCisJCXZhbCB8PSBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkICggcGNpX2RldiwgUENJX0NPTU1BTkQsIHZhbCApOworfQorCisvKgorICogT3BlbnMgYSBuZXR3b3JrIGRldmljZS4KKyAqCisgKiBAdiBuZXRkZXYJCURldmljZSB0byBiZSBvcGVuZWQuCisgKiBAcmV0IHJjICAJCU5vbi16ZXJvIGlmIGZhaWxlZCB0byBvcGVuLgorICoKKyAqIFRoaXMgZW5hYmxlcyB0eCBhbmQgcnggb24gdGhlIGRldmljZS4KKyAqIFRoaXMgaXMgYSBnUFhFIE5ldHdvcmsgRGV2aWNlIERyaXZlciBBUEkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgbXlyaTEwZ2VfbmV0X29wZW4gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwljb25zdCBjaGFyCQkqZGJnOwkvKiBwcmludGVkIHVwb24gZXJyb3IgcmV0dXJuICovCisJaW50CQkJIHJjOworCXN0cnVjdCBpb19idWZmZXIJKmlvYjsKKwlzdHJ1Y3QgbXlyaTEwZ2VfcHJpdmF0ZSAqcHJpdjsKKwl1aW50MzIJCQkgZGF0YVszXTsKKwlzdHJ1Y3QgcGNpX2RldmljZQkqcGNpX2RldjsKKwl2b2lkCQkJKm1lbWJhc2U7CisKKwlEQkdQICggIm15cmkxMGdlX25ldF9vcGVuXG4iICk7CisJcHJpdgk9IG15cmkxMGdlX3ByaXYgKCBuZXRkZXYgKTsKKwlwY2lfZGV2ID0gKCBzdHJ1Y3QgcGNpX2RldmljZSAqICkgbmV0ZGV2LT5kZXY7CisJbWVtYmFzZSA9IHBoeXNfdG9fdmlydCAoIHBjaV9kZXYtPm1lbWJhc2UgKTsKKworCS8qIENvbXB1dGUgYWRkcmVzcyBmb3IgcGFzc2luZyBjb21tYW5kcyB0byB0aGUgZmlybXdhcmUuICovCisKKwlwcml2LT5jb21tYW5kID0gbWVtYmFzZSArIE1YR0VGV19FVEhfQ01EOworCisJLyogRW5zdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLiAqLworCisJbXlyaTEwZ2VfbmV0X2lycSAoIG5ldGRldiwgMCApOworCisJLyogQWxsb2NhdGUgY2xlYXJlZCBETUFhYmxlIGJ1ZmZlcnMuICovCisKKwlwcml2LT5kbWEgPSBtYWxsb2NfZG1hICggc2l6ZW9mICggKnByaXYtPmRtYSApICwgMTI4ICk7CisJaWYgKCAhcHJpdi0+ZG1hICkgeworCQlyYyA9IC1FTk9NRU07CisJCWRiZyA9ICJETUEiOworCQlnb3RvIGFib3J0X3dpdGhfbm90aGluZzsKKwl9CisJbWVtc2V0ICggcHJpdi0+ZG1hLCAwLCBzaXplb2YgKCAqcHJpdi0+ZG1hICkgKTsKKworCS8qIFNpbXBsaWZ5IGZvbGxvd2luZyBjb2RlLiAqLworCisjZGVmaW5lIFRSWSggcHJlZml4LCBiYXNlLCBzdWZmaXggKSBkbyB7CQlcCisJCXJjID0gbXlyaTEwZ2VfY29tbWFuZCAoIHByaXYsCQlcCisJCQkJCU1YR0VGV18JCVwKKwkJCQkJIyMgcHJlZml4CVwKKwkJCQkJIyMgYmFzZQkJXAorCQkJCQkjIyBzdWZmaXgsCVwKKwkJCQkJZGF0YSApOwkJXAorCQlpZiAoIHJjICkgewkJCQlcCisJCQlkYmcgPSAjYmFzZTsJCQlcCisJCQlnb3RvIGFib3J0X3dpdGhfZG1hOwkJXAorCQl9CQkJCQlcCisJfSB3aGlsZSAoIDAgKQorCisJLyogU2VuZCBhIHJlc2V0IGNvbW1hbmQgdG8gdGhlIGNhcmQgdG8gc2VlIGlmIGl0IGlzIGFsaXZlLAorCSAgIGFuZCB0byByZXNldCBpdHMgcXVldWUgc3RhdGUuICovCisKKwlUUlkgKCBDTURfLCBSRVNFVCAsICk7CisKKwkvKiBTZXQgdGhlIGludGVycnVwdCBxdWV1ZSBzaXplLiAqLworCisJZGF0YVswXSA9ICggc2l6ZW9mICggcHJpdi0+ZG1hLT5yZWNlaXZlX2NvbXBsZXRpb24gKQorCQkgICAgfCBNWEdFRldfQ01EX1NFVF9JTlRSUV9TSVpFX0ZMQUdfTk9fU1RSSUNUX1NJWkVfQ0hFQ0sgKTsKKwlUUlkgKCBDTURfU0VUXyAsIElOVFJRX1NJWkUgLCApOworCisJLyogU2V0IHRoZSBpbnRlcnJ1cHQgcXVldWUgRE1BIGFkZHJlc3MuICovCisKKwlkYXRhWzBdID0gdmlydF90b19idXMgKCAmcHJpdi0+ZG1hLT5yZWNlaXZlX2NvbXBsZXRpb24gKTsKKwlkYXRhWzFdID0gMDsKKwlUUlkgKCBDTURfU0VUXywgSU5UUlFfRE1BLCApOworCisJLyogR2V0IHRoZSBOSUMgaW50ZXJydXB0IGNsYWltIGFkZHJlc3MuICovCisKKwlUUlkgKCBDTURfR0VUXywgSVJRX0FDSywgX09GRlNFVCApOworCXByaXYtPmlycV9jbGFpbSA9IG1lbWJhc2UgKyBkYXRhWzBdOworCisJLyogR2V0IHRoZSBOSUMgaW50ZXJydXB0IGFzc2VydCBhZGRyZXNzLiAqLworCisJVFJZICggQ01EX0dFVF8sIElSUV9ERUFTU0VSVCwgX09GRlNFVCApOworCXByaXYtPmlycV9kZWFzc2VydCA9IG1lbWJhc2UgKyBkYXRhWzBdOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHQgY29hbGVzY2luZywgd2hpY2ggaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhlCisJICAgbWluaW1hbCBidWZmZXJpbmcgd2UgcHJvdmlkZS4gKi8KKworCVRSWSAoIENNRF9HRVRfLCBJTlRSX0NPQUwsIF9ERUxBWV9PRkZTRVQgKTsKKwkqICggKCB1aW50MzIgKiApICggbWVtYmFzZSArIGRhdGFbMF0gKSApID0gMDsKKworCS8qIFNldCB0aGUgTklDIG1hYyBhZGRyZXNzLiAqLworCisJZGF0YVswXSA9ICggbmV0ZGV2LT5sbF9hZGRyWzBdIDw8IDI0CisJCSAgICB8IG5ldGRldi0+bGxfYWRkclsxXSA8PCAxNgorCQkgICAgfCBuZXRkZXYtPmxsX2FkZHJbMl0gPDwgOAorCQkgICAgfCBuZXRkZXYtPmxsX2FkZHJbM10gKTsKKwlkYXRhWzFdID0gKCAoIG5ldGRldi0+bGxfYWRkcls0XSA8PCA4ICkKKwkJICAgICB8IG5ldGRldi0+bGxfYWRkcls1XSApOworCVRSWSAoIFNFVF8gLCBNQUNfQUREUkVTUyAsICk7CisKKwkvKiBFbmFibGUgbXVsdGljYXN0IHJlY2VpdmVzLCBiZWNhdXNlIHNvbWUgZ1BYRSBjbGllbnRzIGRvbid0IHdvcmsKKwkgICB3aXRob3V0IG11bHRpY2FzdC4gLiAqLworCisJVFJZICggRU5BQkxFXyAsIEFMTE1VTFRJICwgKTsKKworCS8qIERpc2FibGUgRXRoZXJuZXQgZmxvdyBjb250cm9sLCBzbyB0aGUgTklDIGNhbm5vdCBkZWFkbG9jayB0aGUKKwkgICBuZXR3b3JrIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLiAqLworCisJVFJZICggRElTQUJMRV8gLCBGTE9XICwgX0NPTlRST0wgKTsKKworCS8qIENvbXB1dGUgdHJhbnNtaXQgcmluZyBzaXplcy4gKi8KKworCWRhdGFbMF0gPSAwOwkJLyogc2xpY2UgMCAqLworCVRSWSAoIENNRF9HRVRfLCBTRU5EX1JJTkcsIF9TSVpFICk7CisJcHJpdi0+dHJhbnNtaXRfcmluZ193cmFwCisJCT0gZGF0YVswXSAvIHNpemVvZiAoIG1jcF9rcmVxX2V0aGVyX3NlbmRfdCApIC0gMTsKKwlpZiAoIHByaXYtPnRyYW5zbWl0X3Jpbmdfd3JhcAorCSAgICAgJiAoIHByaXYtPnRyYW5zbWl0X3Jpbmdfd3JhcCArIDEgKSApIHsKKwkJcmMgPSAtRVBST1RPOworCQlkYmcgPSAiVFhfUklORyI7CisJCWdvdG8gYWJvcnRfd2l0aF9kbWE7CisJfQorCisJLyogQ29tcHV0ZSByZWNlaXZlIHJpbmcgc2l6ZXMuICovCisKKwlkYXRhWzBdID0gMDsJCS8qIHNsaWNlIDAgKi8KKwlUUlkgKCBDTURfR0VUXyAsIFJYX1JJTkcgLCBfU0laRSApOworCXByaXYtPnJlY2VpdmVfcG9zdF9yaW5nX3dyYXAgPSBkYXRhWzBdIC8gc2l6ZW9mICggbWNwX2RtYV9hZGRyX3QgKSAtIDE7CisJaWYgKCBwcml2LT5yZWNlaXZlX3Bvc3RfcmluZ193cmFwCisJICAgICAmICggcHJpdi0+cmVjZWl2ZV9wb3N0X3Jpbmdfd3JhcCArIDEgKSApIHsKKwkJcmMgPSAtRVBST1RPOworCQlkYmcgPSAiUlhfUklORyI7CisJCWdvdG8gYWJvcnRfd2l0aF9kbWE7CisJfQorCisJLyogR2V0IE5JQyB0cmFuc21pdCByaW5nIGFkZHJlc3MuICovCisKKwlkYXRhWzBdID0gMDsJCS8qIHNsaWNlIDAuICovCisJVFJZICggQ01EX0dFVF8sIFNFTkQsIF9PRkZTRVQgKTsKKwlwcml2LT50cmFuc21pdF9yaW5nID0gbWVtYmFzZSArIGRhdGFbMF07CisKKwkvKiBHZXQgdGhlIE5JQyByZWNlaXZlIHJpbmcgYWRkcmVzcy4gKi8KKworCWRhdGFbMF0gPSAwOwkJLyogc2xpY2UgMC4gKi8KKwlUUlkgKCBDTURfR0VUXywgU01BTExfUlgsIF9PRkZTRVQgKTsKKwlwcml2LT5yZWNlaXZlX3Bvc3RfcmluZyA9IG1lbWJhc2UgKyBkYXRhWzBdOworCisJLyogU2V0IHRoZSBOaWMgTVRVLiAqLworCisJZGF0YVswXSA9IEVUSF9GUkFNRV9MRU47CisJVFJZICggQ01EX1NFVF8sIE1UVSwgKTsKKworCS8qIFRlbGwgdGhlIE5JQyBvdXIgYnVmZmVyIHNpemVzLiAoIFdlIHVzZSBvbmx5IHNtYWxsIGJ1ZmZlcnMsIHNvIHdlCisJICAgc2V0IGJvdGggYnVmZmVyIHNpemVzIHRvIHRoZSBzYW1lIHZhbHVlLCB3aGljaCB3aWxsIGZvcmNlIGFsbAorCSAgIHJlY2VpdmVkIGZyYW1lcyB0byB1c2Ugc21hbGwgYnVmZmVycy4gKSAqLworCisJZGF0YVswXSA9IE1YR0VGV19QQUQgKyBFVEhfRlJBTUVfTEVOOworCVRSWSAoIENNRF9TRVRfLCBTTUFMTF9CVUZGRVIsIF9TSVpFICk7CisJZGF0YVswXSA9IE1YR0VGV19QQUQgKyBFVEhfRlJBTUVfTEVOOworCVRSWSAoIENNRF9TRVRfLCBCSUdfQlVGRkVSLCBfU0laRSApOworCisgICAgICAgIC8qIFRlbGwgZmlybXdhcmUgd2hlcmUgdG8gRE1BIElSUSBkYXRhICovCisKKwlkYXRhWzBdID0gdmlydF90b19idXMgKCAmcHJpdi0+ZG1hLT5pcnFfZGF0YSApOworCWRhdGFbMV0gPSAwOworCWRhdGFbMl0gPSBzaXplb2YgKCBwcml2LT5kbWEtPmlycV9kYXRhICk7CisJVFJZICggQ01EX1NFVF8sIFNUQVRTX0RNQV9WMiwgKTsKKworCS8qIFBvc3QgcmVjZWl2ZXMuICovCisKKwl3aGlsZSAoIHByaXYtPnJlY2VpdmVzX3Bvc3RlZCA8PSBNWVJJMTBHRV9SRUNFSVZFX1dSQVAgKSB7CisKKwkJLyogUmVzZXJ2ZSAyIGV4dHJhIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiBwYWNrZXRzLCBzaW5jZQorCQkgICB0aGUgZmlybXdhcmUgYWx3YXlzIHNraXBzIHRoZSBmaXJzdCAyIGJ5dGVzIG9mIHRoZSBidWZmZXIKKwkJICAgc28gVENQIGhlYWRlcnMgd2lsbCBiZSBhbGlnbmVkLiAqLworCisJCWlvYiA9IGFsbG9jX2lvYiAoIE1YR0VGV19QQUQgKyBFVEhfRlJBTUVfTEVOICk7CisJCWlmICggIWlvYiApIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWRiZyA9ICJhbGxvY19pb2IiOworCQkJZ290byBhYm9ydF93aXRoX3JlY2VpdmVzX3Bvc3RlZDsKKwkJfQorCQlpb2JfcmVzZXJ2ZSAoIGlvYiwgTVhHRUZXX1BBRCApOworCQlteXJpMTBnZV9wb3N0X3JlY2VpdmUgKCBwcml2LCBpb2IgKTsKKwl9CisKKwkvKiBCcmluZyB1cCB0aGUgbGluay4gKi8KKworCVRSWSAoIENNRF8sIEVUSEVSTkVUX1VQLCApOworCisJREJHMl9SSU5HUyAoIHByaXYgKTsKKwlyZXR1cm4gMDsKKworYWJvcnRfd2l0aF9yZWNlaXZlc19wb3N0ZWQ6CisJd2hpbGUgKCBwcml2LT5yZWNlaXZlc19wb3N0ZWQtLSApCisJCWZyZWVfaW9iICggcHJpdi0+cmVjZWl2ZV9pb2JbcHJpdi0+cmVjZWl2ZXNfcG9zdGVkXSApOworYWJvcnRfd2l0aF9kbWE6CisJLyogQmVjYXVzZSB0aGUgbGluayBpcyBub3QgdXAsIHdlIGRvbid0IGhhdmUgdG8gcmVzZXQgdGhlIE5JQyBoZXJlLiAqLworCWZyZWVfZG1hICggcHJpdi0+ZG1hLCBzaXplb2YgKCAqcHJpdi0+ZG1hICkgKTsKK2Fib3J0X3dpdGhfbm90aGluZzoKKwkvKiBFcmFzZSBhbGwgc2lnbnMgb2YgdGhlIGZhaWxlZCBvcGVuLiAqLworCW1lbXNldCAoIHByaXYsIDAsIHNpemVvZiAoICpwcml2ICkgKTsKKwlEQkcgKCAiJXM6ICVzXG4iLCBkYmcsIHN0cmVycm9yICggcmMgKSApOworCXJldHVybiAoIHJjICk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBhIGRyaXZlciB0byBwcm9jZXNzIGV2ZW50cyBkdXJpbmcgb3BlcmF0aW9uLgorICoKKyAqIEB2IG5ldGRldgkJRGV2aWNlIGJlaW5nIHBvbGxlZC4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgYnkgZ1BYRSB0byBsZXQgdGhlIGRyaXZlciBjaGVjayB0aGUgc3RhdHVzIG9mCisgKiB0cmFuc21pdHRlZCBwYWNrZXRzIGFuZCB0byBhbGxvdyB0aGUgZHJpdmVyIHRvIGNoZWNrIGZvciByZWNlaXZlZCBwYWNrZXRzLgorICogVGhpcyBpcyBhIGdQWEUgTmV0d29yayBEZXZpY2UgRHJpdmVyIEFQSSBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgbXlyaTEwZ2VfbmV0X3BvbGwgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgaW9fYnVmZmVyCQkqaW9iOworCXN0cnVjdCBpb19idWZmZXIJCSpyZXBsYWNlbWVudDsKKwlzdHJ1Y3QgbXlyaTEwZ2VfZG1hX2J1ZmZlcnMJKmRtYTsKKwlzdHJ1Y3QgbXlyaTEwZ2VfcHJpdmF0ZQkJKnByaXY7CisJdW5zaWduZWQgaW50CQkJIGxlbmd0aDsKKwl1bnNpZ25lZCBpbnQJCQkgb3JpZ19yZWNlaXZlc19wb3N0ZWQ7CisKKwlEQkdQICggIm15cmkxMGdlX25ldF9wb2xsXG4iICk7CisJcHJpdiA9IG15cmkxMGdlX3ByaXYgKCBuZXRkZXYgKTsKKwlkbWEgID0gcHJpdi0+ZG1hOworCisJLyogUHJvY2VzcyBhbnkgcGVuZGluZyBpbnRlcnJ1cHQuICovCisKKwlteXJpMTBnZV9pbnRlcnJ1cHRfaGFuZGxlciAoIG5ldGRldiApOworCisJLyogUGFzcyB1cCByZWNlaXZlZCBmcmFtZXMsIGJ1dCBsaW1pdCBvdXJzZWx2ZXMgdG8gcmVjZWl2ZXMgcG9zdGVkCisJICAgYmVmb3JlIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCwgc28gd2UgY2Fubm90IGxpdmVsb2NrIGlmCisJICAgcmVjZWl2ZXMgYXJlIGFycml2aW5nIGZhc3RlciB0aGFuIHdlIHByb2Nlc3MgdGhlbS4gKi8KKworCW9yaWdfcmVjZWl2ZXNfcG9zdGVkID0gcHJpdi0+cmVjZWl2ZXNfcG9zdGVkOworCXdoaWxlICggcHJpdi0+cmVjZWl2ZXNfZG9uZSAhPSBvcmlnX3JlY2VpdmVzX3Bvc3RlZCApIHsKKworCQkvKiBTdG9wIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgcmVjZWl2ZS4gKi8KKworCQlsZW5ndGggPSBudG9ocyAoIGRtYS0+cmVjZWl2ZV9jb21wbGV0aW9uCisJCQkJIFtwcml2LT5yZWNlaXZlc19kb25lCisJCQkJICAmIE1ZUkkxMEdFX1JFQ0VJVkVfQ09NUExFVElPTl9XUkFQXQorCQkJCSAubGVuZ3RoICk7CisJCWlmICggbGVuZ3RoID09IDAgKQorCQkJYnJlYWs7CisKKwkJLyogQWxsb2NhdGUgYSByZXBsYWNlbWVudCBidWZmZXIuICBJZiBub25lIGlzIGF2YWlsYWJsZSwKKwkJICAgc3RvcCBwYXNzaW5nIHVwIHBhY2tldHMgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlLgorCisJCSAgIFJlc2VydmUgMiBleHRyYSBieXRlcyBhdCB0aGUgc3RhcnQgb2YgcGFja2V0cywgc2luY2UKKwkJICAgdGhlIGZpcm13YXJlIGFsd2F5cyBza2lwcyB0aGUgZmlyc3QgMiBieXRlcyBvZiB0aGUgYnVmZmVyCisJCSAgIHNvIFRDUCBoZWFkZXJzIHdpbGwgYmUgYWxpZ25lZC4gKi8KKworCQlyZXBsYWNlbWVudCA9IGFsbG9jX2lvYiAoIE1YR0VGV19QQUQgKyBFVEhfRlJBTUVfTEVOICk7CisJCWlmICggIXJlcGxhY2VtZW50ICkgeworCQkJREJHICggIk5PIFJYIEJVRlxuIiApOworCQkJYnJlYWs7CisJCX0KKwkJaW9iX3Jlc2VydmUgKCByZXBsYWNlbWVudCwgTVhHRUZXX1BBRCApOworCisJCS8qIFBhc3MgdXAgdGhlIHJlY2VpdmVkIGZyYW1lLiAqLworCisJCWlvYiA9IHByaXYtPnJlY2VpdmVfaW9iW3ByaXYtPnJlY2VpdmVzX2RvbmUKKwkJCQkJJiBNWVJJMTBHRV9SRUNFSVZFX1dSQVBdOworCQlpb2JfcHV0ICggaW9iLCBsZW5ndGggKTsKKwkJbmV0ZGV2X3J4ICggbmV0ZGV2LCBpb2IgKTsKKworCQkvKiBXZSBoYXZlIGNvbnN1bWVkIHRoZSBwYWNrZXQsIHNvIGNsZWFyIHRoZSByZWNlaXZlCisJCSAgIG5vdGlmaWNhdGlvbi4gKi8KKworCQlkbWEtPnJlY2VpdmVfY29tcGxldGlvbiBbcHJpdi0+cmVjZWl2ZXNfZG9uZQorCQkJCQkgJiBNWVJJMTBHRV9SRUNFSVZFX0NPTVBMRVRJT05fV1JBUF0KKwkJCS5sZW5ndGggPSAwOworCQl3bWIoKTsKKworCQkvKiBSZXBsYWNlIHRoZSBwYXNzZWQtdXAgSS9PIGJ1ZmZlci4gKi8KKworCQlteXJpMTBnZV9wb3N0X3JlY2VpdmUgKCBwcml2LCByZXBsYWNlbWVudCApOworCQkrK3ByaXYtPnJlY2VpdmVzX2RvbmU7CisJCURCRzJfUklOR1MgKCBwcml2ICk7CisJfQorfQorCisvKgorICogVGhpcyB0cmFuc21pdHMgYSBwYWNrZXQuCisgKgorICogQHYgbmV0ZGV2CQlEZXZpY2UgdG8gdHJhbnNtaXQgZnJvbS4KKyAqIEB2IGlvYnVmIAkJRGF0YSB0byB0cmFuc21pdC4KKyAqIEByZXQgcmMgIAkJTm9uLXplcm8gaWYgZmFpbGVkIHRvIHRyYW5zbWl0LgorICoKKyAqIFRoaXMgaXMgYSBnUFhFIE5ldHdvcmsgRHJpdmVyIEFQSSBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBteXJpMTBnZV9uZXRfdHJhbnNtaXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCSAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkKK3sKKwltY3Bfa3JlcV9ldGhlcl9zZW5kX3QJKmtyZXE7CisJc2l6ZV90CQkJIGxlbjsKKwlzdHJ1Y3QgbXlyaTEwZ2VfcHJpdmF0ZSAqcHJpdjsKKwl1aW50MzIJCQkgdHJhbnNtaXRzX3Bvc3RlZDsKKworCURCR1AgKCAibXlyaTEwZ2VfbmV0X3RyYW5zbWl0XG4iICk7CisJcHJpdiA9IG15cmkxMGdlX3ByaXYgKCBuZXRkZXYgKTsKKworCS8qIENvbmZpcm0gc3BhY2UgaW4gdGhlIHNlbmQgcmluZy4gKi8KKworCXRyYW5zbWl0c19wb3N0ZWQgPSBwcml2LT50cmFuc21pdHNfcG9zdGVkOworCWlmICggdHJhbnNtaXRzX3Bvc3RlZCAtIHByaXYtPnRyYW5zbWl0c19kb25lCisJICAgICA+IE1ZUkkxMEdFX1RSQU5TTUlUX1dSQVAgKSB7CisJCURCRyAoICJUWCByaW5nIGZ1bGxcbiIgKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCURCRzIgKCAiVFggJXArJWQgIiwgaW9idWYtPmRhdGEsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisJREJHMl9IRCAoIGlvYnVmLT5kYXRhLCAxNCApOworCisJLyogUmVjb3JkIHRoZSBwYWNrZXQgYmVpbmcgdHJhbnNtaXR0ZWQsIHNvIHdlIGNhbiBsYXRlciByZXBvcnQKKwkgICBzZW5kIGNvbXBsZXRpb24uICovCisKKwlwcml2LT50cmFuc21pdF9pb2JbdHJhbnNtaXRzX3Bvc3RlZCAmIE1ZUkkxMEdFX1RSQU5TTUlUX1dSQVBdID0gaW9idWY7CisKKwkvKiBDb3B5IGFuZCBwYWQgdW5kZXJzaXplZCBmcmFtZXMsIGJlY2F1c2UgdGhlIE5JQyBkb2VzIG5vdCBwYWQsCisJICAgYW5kIHdlIHdvdWxkIHJhdGhlciBjb3B5IHNtYWxsIGZyYW1lcyB0aGFuIGRvIGEgZ2F0aGVyLiAqLworCisJbGVuID0gaW9iX2xlbiAoIGlvYnVmICk7CisJaWYgKCBsZW4gPCBFVEhfWkxFTiApIHsKKwkJaW9iX3BhZCAoIGlvYnVmLCBFVEhfWkxFTiApOworCQlsZW4gPSBFVEhfWkxFTjsKKwl9CisKKwkvKiBFbnF1ZXVlIHRoZSBwYWNrZXQgYnkgd3JpdGluZyBhIGRlc2NyaXB0b3IgdG8gdGhlIE5JQy4KKwkgICBUaGlzIGlzIGEgYml0IHRyaWNreSBiZWNhdXNlIHRoZSBIVyByZXF1aXJlcyAzMi1iaXQgd3JpdGVzLAorCSAgIGJ1dCB0aGUgc3RydWN0dXJlIGhhcyBzbWFsbGVyIGZpZWxkcy4gKi8KKworCWtyZXEgPSAmcHJpdi0+dHJhbnNtaXRfcmluZ1t0cmFuc21pdHNfcG9zdGVkCisJCQkJICAgICYgcHJpdi0+dHJhbnNtaXRfcmluZ193cmFwXTsKKwlrcmVxLT5hZGRyX2hpZ2ggPSAwOworCWtyZXEtPmFkZHJfbG93ID0gaHRvbmwgKCB2aXJ0X3RvX2J1cyAoIGlvYnVmLT5kYXRhICkgKTsKKwkoICggdWludDMyICogKSBrcmVxICkgWzJdID0gaHRvbmwgKAorCQkweDAwMDAgPDwgMTYJIC8qIHBzZXVkb19oZWFkZXJfb2Zmc2V0ICovCisJCXwgKCBsZW4gJiAweEZGRkYgKSAvKiBsZW5ndGggKi8KKwkJKTsKKwl3bWIoKTsKKwkoICggdWludDMyICogKSBrcmVxICkgWzNdID0gaHRvbmwgKAorCQkweDAwIDw8IDI0CS8qIHBhZCAqLworCQl8IDB4MDEgPDwgMTYJLyogcmRtYV9jb3VudCAqLworCQl8IDB4MDAgPDwgOAkvKiBja3N1bV9vZmZzZXQgKi8KKwkJfCAoIE1YR0VGV19GTEFHU19TTUFMTAorCQkgICAgfCBNWEdFRldfRkxBR1NfRklSU1QKKwkJICAgIHwgTVhHRUZXX0ZMQUdTX05PX1RTTyApIC8qIGZsYWdzICovCisJCSk7CisJd21iKCk7CisKKwkvKiBNYXJrIHRoZSBzbG90IGFzIGNvbnN1bWVkIGFuZCByZXR1cm4uICovCisKKwlwcml2LT50cmFuc21pdHNfcG9zdGVkID0gKyt0cmFuc21pdHNfcG9zdGVkOworCURCRzJfUklOR1MgKCBwcml2ICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBteXJpMTBnZV9uaWNzW10gPSB7CisJLyogRWFjaCBvZiB0aGVzZSBtYWNyb3MgbXVzdCBiZSBhIHNpbmdsZSBsaW5lIHRvIHNhdGlzZnkgYSBzY3JpcHQuICovCisJUENJX1JPTSAoIDB4MTRjMSwgMHgwMDA4LCAibXlyaTEwZ2UiLCAiTXlyaWNvbSAxMEdiIEV0aGVybmV0IEFkYXB0ZXIiLCAwICkgLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgbXlyaTEwZ2VfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzICAgICAgPSBteXJpMTBnZV9uaWNzLAorCS5pZF9jb3VudCA9ICggc2l6ZW9mICggbXlyaTEwZ2VfbmljcyApIC8gc2l6ZW9mICggbXlyaTEwZ2Vfbmljc1swXSApICkgLAorCS5wcm9iZSAgICA9IG15cmkxMGdlX3BjaV9wcm9iZSwKKwkucmVtb3ZlICAgPSBteXJpMTBnZV9wY2lfcmVtb3ZlCit9OworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbXlyaTEwZ2VfbWNwLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9teXJpMTBnZV9tY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTdmOGIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbXlyaTEwZ2VfbWNwLmgKQEAgLTAsMCArMSw1MTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0qLSBsaW51eC1jIC0qLQorICogTXlyaWNvbSAxMEdiIE5ldHdvcmsgSW50ZXJmYWNlIENhcmQgU29mdHdhcmUKKyAqIENvcHlyaWdodCAyMDA1LTIwMTAsIE15cmljb20sIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTsKKworI2lmbmRlZiBfbXlyaTEwZ2VfbWNwX2gKKyNkZWZpbmUgX215cmkxMGdlX21jcF9oCisKKyNkZWZpbmUgTVhHRUZXX1ZFUlNJT05fTUFKT1IJMQorI2RlZmluZSBNWEdFRldfVkVSU0lPTl9NSU5PUgk0CisKKyNpZmRlZiBNWEdFRlcKKyNpZm5kZWYgX3N0ZGludF9oXwordHlwZWRlZiBzaWduZWQgY2hhciAgICAgICAgICBpbnQ4X3Q7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCAgICAgICAgaW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkIGludCAgICAgICAgICBpbnQzMl90OwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nICAgIGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgIHVpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKyNlbmRpZgorI2VuZGlmCisKKy8qIDggQnl0ZXMgKi8KK3N0cnVjdCBtY3BfZG1hX2FkZHIgeworICB1aW50MzJfdCBoaWdoOworICB1aW50MzJfdCBsb3c7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbWNwX2RtYV9hZGRyIG1jcF9kbWFfYWRkcl90OworCisvKiA0IEJ5dGVzICovCitzdHJ1Y3QgbWNwX3Nsb3QgeworICB1aW50MTZfdCBjaGVja3N1bTsKKyAgdWludDE2X3QgbGVuZ3RoOworfTsKK3R5cGVkZWYgc3RydWN0IG1jcF9zbG90IG1jcF9zbG90X3Q7CisKKyNpZmRlZiBNWEdFRldfTkRJUworLyogOC1ieXRlIGRlc2NyaXB0b3IsIGV4Y2x1c2l2ZWx5IHVzZWQgYnkgTkRJUyBkcml2ZXJzLiAqLworc3RydWN0IG1jcF9zbG90XzggeworICAvKiBQbGFjZSBoYXNoIHZhbHVlIGF0IHRoZSB0b3Agc28gaXQgZ2V0cyB3cml0dGVuIGJlZm9yZSBsZW5ndGguCisgICAqIFRoZSBkcml2ZXIgcG9sbHMgbGVuZ3RoLgorICAgKi8KKyAgdWludDMyX3QgaGFzaDsKKyAgdWludDE2X3QgY2hlY2tzdW07CisgIHVpbnQxNl90IGxlbmd0aDsKK307Cit0eXBlZGVmIHN0cnVjdCBtY3Bfc2xvdF84IG1jcF9zbG90XzhfdDsKKworLyogVHdvIGJpdHMgb2YgbGVuZ3RoIGluIG1jcF9zbG90IGFyZSB1c2VkIHRvIGluZGljYXRlIGhhc2ggdHlwZS4gKi8KKyNkZWZpbmUgTVhHRUZXX1JTU19IQVNIX05VTEwgKDAgPDwgMTQpIC8qIGJpdCAxNToxNCA9IDAwICovCisjZGVmaW5lIE1YR0VGV19SU1NfSEFTSF9JUFY0ICgxIDw8IDE0KSAvKiBiaXQgMTU6MTQgPSAwMSAqLworI2RlZmluZSBNWEdFRldfUlNTX0hBU0hfVENQX0lQVjQgKDIgPDwgMTQpIC8qIGJpdCAxNToxNCA9IDEwICovCisjZGVmaW5lIE1YR0VGV19SU1NfSEFTSF9NQVNLICgzIDw8IDE0KSAvKiBiaXQgMTU6MTQgPSAxMSAqLworI2VuZGlmCisKKy8qIDY0IEJ5dGVzICovCitzdHJ1Y3QgbWNwX2NtZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgZGF0YTA7CS8qIHdpbGwgYmUgbG93IHBvcnRpb24gaWYgZGF0YSA+IDMyIGJpdHMgKi8KKyAgLyogOCAqLworICB1aW50MzJfdCBkYXRhMTsJLyogd2lsbCBiZSBoaWdoIHBvcnRpb24gaWYgZGF0YSA+IDMyIGJpdHMgKi8KKyAgdWludDMyX3QgZGF0YTI7CS8qIGN1cnJlbnRseSB1bnVzZWQuLiAqLworICAvKiAxNiAqLworICBzdHJ1Y3QgbWNwX2RtYV9hZGRyIHJlc3BvbnNlX2FkZHI7CisgIC8qIDI0ICovCisgIHVpbnQ4X3QgcGFkWzQwXTsKK307Cit0eXBlZGVmIHN0cnVjdCBtY3BfY21kIG1jcF9jbWRfdDsKKworLyogOCBCeXRlcyAqLworc3RydWN0IG1jcF9jbWRfcmVzcG9uc2UgeworICB1aW50MzJfdCBkYXRhOworICB1aW50MzJfdCByZXN1bHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbWNwX2NtZF9yZXNwb25zZSBtY3BfY21kX3Jlc3BvbnNlX3Q7CisKKworCisvKgorICAgZmxhZ3MgdXNlZCBpbiBtY3Bfa3JlcV9ldGhlcl9zZW5kX3Q6CisKKyAgIFRoZSBTTUFMTCBmbGFnIGlzIG9ubHkgbmVlZGVkIGluIHRoZSBmaXJzdCBzZWdtZW50LiBJdCBpcyByYWlzZWQKKyAgIGZvciBwYWNrZXRzIHRoYXQgYXJlIHRvdGFsIGxlc3Mgb3IgZXF1YWwgNTEyIGJ5dGVzLgorCisgICBUaGUgQ0tTVU0gZmxhZyBtdXN0IGJlIHNldCBpbiBhbGwgc2VnbWVudHMuCisKKyAgIFRoZSBQQURERUQgZmxhZ3MgaXMgc2V0IGlmIHRoZSBwYWNrZXQgbmVlZHMgdG8gYmUgcGFkZGVkLCBhbmQgaXQKKyAgIG11c3QgYmUgc2V0IGZvciBhbGwgc2VnbWVudHMuCisKKyAgIFRoZSAgTVhHRUZXX0ZMQUdTX0FMSUdOX09ERCBtdXN0IGJlIHNldCBpZiB0aGUgY3VtdWxhdGl2ZQorICAgbGVuZ3RoIG9mIGFsbCBwcmV2aW91cyBzZWdtZW50cyB3YXMgb2RkLgorKi8KKworCisjZGVmaW5lIE1YR0VGV19GTEFHU19TTUFMTCAgICAgIDB4MQorI2RlZmluZSBNWEdFRldfRkxBR1NfVFNPX0hEUiAgICAweDEKKyNkZWZpbmUgTVhHRUZXX0ZMQUdTX0ZJUlNUICAgICAgMHgyCisjZGVmaW5lIE1YR0VGV19GTEFHU19BTElHTl9PREQgIDB4NAorI2RlZmluZSBNWEdFRldfRkxBR1NfQ0tTVU0gICAgICAweDgKKyNkZWZpbmUgTVhHRUZXX0ZMQUdTX1RTT19MQVNUICAgMHg4CisjZGVmaW5lIE1YR0VGV19GTEFHU19OT19UU08gICAgIDB4MTAKKyNkZWZpbmUgTVhHRUZXX0ZMQUdTX1RTT19DSE9QICAgMHgxMAorI2RlZmluZSBNWEdFRldfRkxBR1NfVFNPX1BMRCAgICAweDIwCisKKyNkZWZpbmUgTVhHRUZXX1NFTkRfU01BTExfU0laRSAgMTUyMAorI2RlZmluZSBNWEdFRldfTUFYX01UVSAgICAgICAgICA5NDAwCisKK3VuaW9uIG1jcF9wc29fb3JfY3VtbGVuIHsKKyAgdWludDE2X3QgcHNldWRvX2hkcl9vZmZzZXQ7CisgIHVpbnQxNl90IGN1bV9sZW47Cit9OwordHlwZWRlZiB1bmlvbiBtY3BfcHNvX29yX2N1bWxlbiBtY3BfcHNvX29yX2N1bWxlbl90OworCisjZGVmaW5lCU1YR0VGV19NQVhfU0VORF9ERVNDIDEyCisjZGVmaW5lIE1YR0VGV19QQUQJICAgIDIKKworLyogMTYgQnl0ZXMgKi8KK3N0cnVjdCBtY3Bfa3JlcV9ldGhlcl9zZW5kIHsKKyAgdWludDMyX3QgYWRkcl9oaWdoOworICB1aW50MzJfdCBhZGRyX2xvdzsKKyAgdWludDE2X3QgcHNldWRvX2hkcl9vZmZzZXQ7CisgIHVpbnQxNl90IGxlbmd0aDsKKyAgdWludDhfdCAgcGFkOworICB1aW50OF90ICByZG1hX2NvdW50OworICB1aW50OF90ICBja3N1bV9vZmZzZXQ7IAkvKiB3aGVyZSB0byBzdGFydCBjb21wdXRpbmcgY2tzdW0gKi8KKyAgdWludDhfdCAgZmxhZ3M7CSAgICAgICAJLyogYXMgZGVmaW5lZCBhYm92ZSAqLworfTsKK3R5cGVkZWYgc3RydWN0IG1jcF9rcmVxX2V0aGVyX3NlbmQgbWNwX2tyZXFfZXRoZXJfc2VuZF90OworCisvKiA4IEJ5dGVzICovCitzdHJ1Y3QgbWNwX2tyZXFfZXRoZXJfcmVjdiB7CisgIHVpbnQzMl90IGFkZHJfaGlnaDsKKyAgdWludDMyX3QgYWRkcl9sb3c7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbWNwX2tyZXFfZXRoZXJfcmVjdiBtY3Bfa3JlcV9ldGhlcl9yZWN2X3Q7CisKKworLyogQ29tbWFuZHMgKi8KKworI2RlZmluZQlNWEdFRldfQk9PVF9IQU5ET0ZGCTB4ZmMwMDAwCisjZGVmaW5lCU1YR0VGV19CT09UX0RVTU1ZX1JETUEJMHhmYzAxYzAKKworI2RlZmluZQlNWEdFRldfRVRIX0NNRAkJMHhmODAwMDAKKyNkZWZpbmUJTVhHRUZXX0VUSF9TRU5EXzQJMHgyMDAwMDAKKyNkZWZpbmUJTVhHRUZXX0VUSF9TRU5EXzEJMHgyNDAwMDAKKyNkZWZpbmUJTVhHRUZXX0VUSF9TRU5EXzIJMHgyODAwMDAKKyNkZWZpbmUJTVhHRUZXX0VUSF9TRU5EXzMJMHgyYzAwMDAKKyNkZWZpbmUJTVhHRUZXX0VUSF9SRUNWX1NNQUxMCTB4MzAwMDAwCisjZGVmaW5lCU1YR0VGV19FVEhfUkVDVl9CSUcJMHgzNDAwMDAKKyNkZWZpbmUJTVhHRUZXX0VUSF9TRU5EX0dPCTB4MzgwMDAwCisjZGVmaW5lCU1YR0VGV19FVEhfU0VORF9TVE9QCTB4M0MwMDAwCisKKyNkZWZpbmUJTVhHRUZXX0VUSF9TRU5EKG4pCQkoMHgyMDAwMDAgKyAoKChuKSAmIDB4MDMpICogMHg0MDAwMCkpCisjZGVmaW5lCU1YR0VGV19FVEhfU0VORF9PRkZTRVQobikJKE1YR0VGV19FVEhfU0VORChuKSAtIE1YR0VGV19FVEhfU0VORF80KQorCitlbnVtIG15cmkxMGdlX21jcF9jbWRfdHlwZSB7CisgIE1YR0VGV19DTURfTk9ORSA9IDAsCisgIC8qIFJlc2V0IHRoZSBtY3AsIGl0IGlzIGxlZnQgaW4gYSBzYWZlIHN0YXRlLCB3YWl0aW5nCisgICAgIGZvciB0aGUgZHJpdmVyIHRvIHNldCBhbGwgaXRzIHBhcmFtZXRlcnMgKi8KKyAgTVhHRUZXX0NNRF9SRVNFVCA9IDEsCisKKyAgLyogZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudCBmaXJtd2FyZS4uCisgICAgIChtYXkgYmUgYXZhaWxhYmxlIGluIHRoZSBlZXByb20gc3RyaW5ncy4uPyAqLworICBNWEdFRldfR0VUX01DUF9WRVJTSU9OID0gMiwKKworCisgIC8qIFBhcmFtZXRlcnMgd2hpY2ggbXVzdCBiZSBzZXQgYnkgdGhlIGRyaXZlciBiZWZvcmUgaXQgY2FuCisgICAgIGlzc3VlIE1YR0VGV19DTURfRVRIRVJORVRfVVAuIFRoZXkgcGVyc2lzdCB1bnRpbCB0aGUgbmV4dAorICAgICBNWEdFRldfQ01EX1JFU0VUIGlzIGlzc3VlZCAqLworCisgIE1YR0VGV19DTURfU0VUX0lOVFJRX0RNQSA9IDMsCisgIC8qIGRhdGEwID0gTFNXIG9mIHRoZSBob3N0IGFkZHJlc3MKKyAgICogZGF0YTEgPSBNU1cgb2YgdGhlIGhvc3QgYWRkcmVzcworICAgKiBkYXRhMiA9IHNsaWNlIG51bWJlciBpZiBtdWx0aXBsZSBzbGljZXMgYXJlIHVzZWQKKyAgICovCisKKyAgTVhHRUZXX0NNRF9TRVRfQklHX0JVRkZFUl9TSVpFID0gNCwJLyogaW4gYnl0ZXMsIHBvd2VyIG9mIDIgKi8KKyAgTVhHRUZXX0NNRF9TRVRfU01BTExfQlVGRkVSX1NJWkUgPSA1LAkvKiBpbiBieXRlcyAqLworCisKKyAgLyogUGFyYW1ldGVycyB3aGljaCByZWZlciB0byBsYW5haSBTUkFNIGFkZHJlc3NlcyB3aGVyZSB0aGUKKyAgICAgZHJpdmVyIG11c3QgaXNzdWUgUElPIHdyaXRlcyBmb3IgdmFyaW91cyB0aGluZ3MgKi8KKworICBNWEdFRldfQ01EX0dFVF9TRU5EX09GRlNFVCA9IDYsCisgIE1YR0VGV19DTURfR0VUX1NNQUxMX1JYX09GRlNFVCA9IDcsCisgIE1YR0VGV19DTURfR0VUX0JJR19SWF9PRkZTRVQgPSA4LAorICAvKiBkYXRhMCA9IHNsaWNlIG51bWJlciBpZiBtdWx0aXBsZSBzbGljZXMgYXJlIHVzZWQgKi8KKworICBNWEdFRldfQ01EX0dFVF9JUlFfQUNLX09GRlNFVCA9IDksCisgIE1YR0VGV19DTURfR0VUX0lSUV9ERUFTU0VSVF9PRkZTRVQgPSAxMCwKKworICAvKiBQYXJhbWV0ZXJzIHdoaWNoIHJlZmVyIHRvIHJpbmdzIHN0b3JlZCBvbiB0aGUgTUNQLAorICAgICBhbmQgd2hvc2Ugc2l6ZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBtY3AgKi8KKworICBNWEdFRldfQ01EX0dFVF9TRU5EX1JJTkdfU0laRSA9IDExLAkvKiBpbiBieXRlcyAqLworICBNWEdFRldfQ01EX0dFVF9SWF9SSU5HX1NJWkUgPSAxMiwJLyogaW4gYnl0ZXMgKi8KKworICAvKiBQYXJhbWV0ZXJzIHdoaWNoIHJlZmVyIHRvIHJpbmdzIHN0b3JlZCBpbiB0aGUgaG9zdCwKKyAgICAgYW5kIHdob3NlIHNpemUgaXMgY29udHJvbGxlZCBieSB0aGUgaG9zdC4gIE5vdGUgdGhhdAorICAgICBhbGwgbXVzdCBiZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgYW5kIG11c3QgY29udGFpbgorICAgICBhIHBvd2VyIG9mIDIgbnVtYmVyIG9mIGVudHJpZXMuICAqLworCisgIE1YR0VGV19DTURfU0VUX0lOVFJRX1NJWkUgPSAxMywgCS8qIGluIGJ5dGVzICovCisjZGVmaW5lIE1YR0VGV19DTURfU0VUX0lOVFJRX1NJWkVfRkxBR19OT19TVFJJQ1RfU0laRV9DSEVDSyAgKDEgPDwgMzEpCisKKyAgLyogY29tbWFuZCB0byBicmluZyBldGhlcm5ldCBpbnRlcmZhY2UgdXAuICBBYm92ZSBwYXJhbWV0ZXJzCisgICAgIChwbHVzIG10dSAmIG1hYyBhZGRyZXNzKSBtdXN0IGhhdmUgYmVlbiBleGNoYW5nZWQgcHJpb3IKKyAgICAgdG8gaXNzdWluZyB0aGlzIGNvbW1hbmQgICovCisgIE1YR0VGV19DTURfRVRIRVJORVRfVVAgPSAxNCwKKworICAvKiBjb21tYW5kIHRvIGJyaW5nIGV0aGVybmV0IGludGVyZmFjZSBkb3duLiAgTm8gZnVydGhlciBzZW5kcworICAgICBvciByZWNlaXZlcyBtYXkgYmUgcHJvY2Vzc2VkIHVudGlsIGFuIE1YR0VGV19DTURfRVRIRVJORVRfVVAKKyAgICAgaXMgaXNzdWVkLCBhbmQgYWxsIGludGVycnVwdCBxdWV1ZXMgbXVzdCBiZSBmbHVzaGVkIHByaW9yCisgICAgIHRvIGFjaydpbmcgdGhpcyBjb21tYW5kICovCisKKyAgTVhHRUZXX0NNRF9FVEhFUk5FVF9ET1dOID0gMTUsCisKKyAgLyogY29tbWFuZHMgdGhlIGRyaXZlciBtYXkgaXNzdWUgbGl2ZSwgd2l0aG91dCByZXNldHRpbmcKKyAgICAgdGhlIG5pYy4gIE5vdGUgdGhhdCBpbmNyZWFzaW5nIHRoZSBtdHUgImxpdmUiIHNob3VsZAorICAgICBvbmx5IGJlIGRvbmUgaWYgdGhlIGRyaXZlciBoYXMgYWxyZWFkeSBzdXBwbGllZCBidWZmZXJzCisgICAgIHN1ZmZpY2llbnRseSBsYXJnZSB0byBoYW5kbGUgdGhlIG5ldyBtdHUuICBEZWNyZWFzaW5nCisgICAgIHRoZSBtdHUgbGl2ZSBpcyBzYWZlICovCisKKyAgTVhHRUZXX0NNRF9TRVRfTVRVID0gMTYsCisgIE1YR0VGV19DTURfR0VUX0lOVFJfQ09BTF9ERUxBWV9PRkZTRVQgPSAxNywgIC8qIGluIG1pY3Jvc2Vjb25kcyAqLworICBNWEdFRldfQ01EX1NFVF9TVEFUU19JTlRFUlZBTCA9IDE4LCAgIC8qIGluIG1pY3Jvc2Vjb25kcyAqLworICBNWEdFRldfQ01EX1NFVF9TVEFUU19ETUFfT0JTT0xFVEUgPSAxOSwgLyogcmVwbGFjZWQgYnkgU0VUX1NUQVRTX0RNQV9WMiAqLworCisgIE1YR0VGV19FTkFCTEVfUFJPTUlTQyA9IDIwLAorICBNWEdFRldfRElTQUJMRV9QUk9NSVNDID0gMjEsCisgIE1YR0VGV19TRVRfTUFDX0FERFJFU1MgPSAyMiwKKworICBNWEdFRldfRU5BQkxFX0ZMT1dfQ09OVFJPTCA9IDIzLAorICBNWEdFRldfRElTQUJMRV9GTE9XX0NPTlRST0wgPSAyNCwKKworICAvKiBkbyBhIERNQSB0ZXN0CisgICAgIGRhdGEwLGRhdGExID0gRE1BIGFkZHJlc3MKKyAgICAgZGF0YTIgICAgICAgPSBSRE1BIGxlbmd0aCAoTVNIKSwgV0RNQSBsZW5ndGggKExTSCkKKyAgICAgY29tbWFuZCByZXR1cm4gZGF0YSA9IHJlcGV0aXRpb25zIChNU0gpLCAwLjUtbXMgdGlja3MgKExTSCkKKyAgKi8KKyAgTVhHRUZXX0RNQV9URVNUID0gMjUsCisKKyAgTVhHRUZXX0VOQUJMRV9BTExNVUxUSSA9IDI2LAorICBNWEdFRldfRElTQUJMRV9BTExNVUxUSSA9IDI3LAorCisgIC8qIHJldHVybnMgTVhHRUZXX0NNRF9FUlJPUl9NVUxUSUNBU1QKKyAgICAgaWYgdGhlcmUgaXMgbm8gcm9vbSBpbiB0aGUgY2FjaGUKKyAgICAgZGF0YTAsTVNIKGRhdGExKSA9IG11bHRpY2FzdCBncm91cCBhZGRyZXNzICovCisgIE1YR0VGV19KT0lOX01VTFRJQ0FTVF9HUk9VUCA9IDI4LAorICAvKiByZXR1cm5zIE1YR0VGV19DTURfRVJST1JfTVVMVElDQVNUCisgICAgIGlmIHRoZSBhZGRyZXNzIGlzIG5vdCBpbiB0aGUgY2FjaGUsCisgICAgIG9yIGlzIGVxdWFsIHRvIEZGLUZGLUZGLUZGLUZGLUZGCisgICAgIGRhdGEwLE1TSChkYXRhMSkgPSBtdWx0aWNhc3QgZ3JvdXAgYWRkcmVzcyAqLworICBNWEdFRldfTEVBVkVfTVVMVElDQVNUX0dST1VQID0gMjksCisgIE1YR0VGV19MRUFWRV9BTExfTVVMVElDQVNUX0dST1VQUyA9IDMwLAorCisgIE1YR0VGV19DTURfU0VUX1NUQVRTX0RNQV9WMiA9IDMxLAorICAvKiBkYXRhMCwgZGF0YTEgPSBidXMgYWRkciwKKyAgICogZGF0YTIgPSBzaXplb2Yoc3RydWN0IG1jcF9pcnFfZGF0YSkgZnJvbSBkcml2ZXIgcG9pbnQgb2YgdmlldywgYWxsb3dzCisgICAqIGFkZGluZyBuZXcgc3R1ZmYgdG8gbWNwX2lycV9kYXRhIHdpdGhvdXQgY2hhbmdpbmcgdGhlIEFCSQorICAgKgorICAgKiBJZiBtdWx0aXBsZSBzbGljZXMgYXJlIHVzZWQsIGRhdGEyIGNvbnRhaW5zIGJvdGggdGhlIHNpemUgb2YgdGhlCisgICAqIHN0cnVjdHVyZSAoaW4gdGhlIGxvd2VyIDE2IGJpdHMpIGFuZCB0aGUgc2xpY2UgbnVtYmVyCisgICAqIChpbiB0aGUgdXBwZXIgMTYgYml0cykuCisgICAqLworCisgIE1YR0VGV19DTURfVU5BTElHTkVEX1RFU1QgPSAzMiwKKyAgLyogc2FtZSB0aGFuIERNQV9URVNUIChzYW1lIGFyZ3MpIGJ1dCBhYm9ydCB3aXRoIFVOQUxJR05FRCBvbiB1bmFsaWduZWQKKyAgICAgY2hpcHNldCAqLworCisgIE1YR0VGV19DTURfVU5BTElHTkVEX1NUQVRVUyA9IDMzLAorICAvKiByZXR1cm4gZGF0YSA9IGJvb2xlYW4sIHRydWUgaWYgdGhlIGNoaXBzZXQgaXMga25vd24gdG8gYmUgdW5hbGlnbmVkICovCisKKyAgTVhHRUZXX0NNRF9BTFdBWVNfVVNFX05fQklHX0JVRkZFUlMgPSAzNCwKKyAgLyogZGF0YTAgPSBudW1iZXIgb2YgYmlnIGJ1ZmZlcnMgdG8gdXNlLiAgSXQgbXVzdCBiZSAwIG9yIGEgcG93ZXIgb2YgMi4KKyAgICogMCBpbmRpY2F0ZXMgdGhhdCB0aGUgTklDIGNvbnN1bWVzIGFzIG1hbnkgYnVmZmVycyBhcyB0aGV5IGFyZSByZXF1aXJlZAorICAgKiBmb3IgcGFja2V0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLgorICAgKiBBIHBvd2VyIG9mIDIgbnVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBOSUMgYWx3YXlzIHVzZXMgdGhlIHNwZWNpZmllZAorICAgKiBudW1iZXIgb2YgYnVmZmVycyBmb3IgZWFjaCBiaWcgcmVjZWl2ZSBwYWNrZXQuCisgICAqIEl0IGlzIHVwIHRvIHRoZSBkcml2ZXIgdG8gZW5zdXJlIHRoYXQgdGhpcyB2YWx1ZSBpcyBiaWcgZW5vdWdoIGZvcgorICAgKiB0aGUgTklDIHRvIGJlIGFibGUgdG8gcmVjZWl2ZSBtYXhpbXVtLXNpemVkIHBhY2tldHMuCisgICAqLworCisgIE1YR0VGV19DTURfR0VUX01BWF9SU1NfUVVFVUVTID0gMzUsCisgIE1YR0VGV19DTURfRU5BQkxFX1JTU19RVUVVRVMgPSAzNiwKKyAgLyogZGF0YTAgPSBudW1iZXIgb2Ygc2xpY2VzIG4gKDAsIDEsIC4uLiwgbi0xKSB0byBlbmFibGUKKyAgICogZGF0YTEgPSBpbnRlcnJ1cHQgbW9kZSB8IHVzZSBvZiBtdWx0aXBsZSB0cmFuc21pdCBxdWV1ZXMuCisgICAqIDA9c2hhcmUgb25lIElOVHgvTVNJLgorICAgKiAxPXVzZSBvbmUgTVNJLVggcGVyIHF1ZXVlLgorICAgKiBJZiBhbGwgcXVldWVzIHNoYXJlIG9uZSBpbnRlcnJ1cHQsIHRoZSBkcml2ZXIgbXVzdCBoYXZlIHNldAorICAgKiBSU1NfU0hBUkVEX0lOVEVSUlVQVF9ETUEgYmVmb3JlIGVuYWJsaW5nIHF1ZXVlcy4KKyAgICogMj1lbmFibGUgYm90aCByZWNlaXZlIGFuZCBzZW5kIHF1ZXVlcy4KKyAgICogV2l0aG91dCB0aGlzIGJpdCBzZXQsIG9ubHkgb25lIHNlbmQgcXVldWUgKHNsaWNlIDAncyBzZW5kIHF1ZXVlKQorICAgKiBpcyBlbmFibGVkLiAgVGhlIHJlY2VpdmUgcXVldWVzIGFyZSBhbHdheXMgZW5hYmxlZC4KKyAgICovCisjZGVmaW5lIE1YR0VGV19TTElDRV9JTlRSX01PREVfU0hBUkVEICAgICAgICAgIDB4MAorI2RlZmluZSBNWEdFRldfU0xJQ0VfSU5UUl9NT0RFX09ORV9QRVJfU0xJQ0UgICAweDEKKyNkZWZpbmUgTVhHRUZXX1NMSUNFX0VOQUJMRV9NVUxUSVBMRV9UWF9RVUVVRVMgMHgyCisKKyAgTVhHRUZXX0NNRF9HRVRfUlNTX1NIQVJFRF9JTlRFUlJVUFRfTUFTS19PRkZTRVQgPSAzNywKKyAgTVhHRUZXX0NNRF9TRVRfUlNTX1NIQVJFRF9JTlRFUlJVUFRfRE1BID0gMzgsCisgIC8qIGRhdGEwLCBkYXRhMSA9IGJ1cyBhZGRyZXNzIGxzdywgbXN3ICovCisgIE1YR0VGV19DTURfR0VUX1JTU19UQUJMRV9PRkZTRVQgPSAzOSwKKyAgLyogZ2V0IHRoZSBvZmZzZXQgb2YgdGhlIGluZGlyZWN0aW9uIHRhYmxlICovCisgIE1YR0VGV19DTURfU0VUX1JTU19UQUJMRV9TSVpFID0gNDAsCisgIC8qIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW5kaXJlY3Rpb24gdGFibGUgKi8KKyAgTVhHRUZXX0NNRF9HRVRfUlNTX0tFWV9PRkZTRVQgPSA0MSwKKyAgLyogZ2V0IHRoZSBvZmZzZXQgb2YgdGhlIHNlY3JldCBrZXkgKi8KKyAgTVhHRUZXX0NNRF9SU1NfS0VZX1VQREFURUQgPSA0MiwKKyAgLyogdGVsbCBuaWMgdGhhdCB0aGUgc2VjcmV0IGtleSdzIGJlZW4gdXBkYXRlZCAqLworICBNWEdFRldfQ01EX1NFVF9SU1NfRU5BQkxFID0gNDMsCisgIC8qIGRhdGEwID0gZW5hYmxlL2Rpc2FibGUgcnNzCisgICAqIDA6IGRpc2FibGUgcnNzLiAgbmljIGRvZXMgbm90IGRpc3RyaWJ1dGUgcmVjZWl2ZSBwYWNrZXRzLgorICAgKiAxOiBlbmFibGUgcnNzLiAgbmljIGRpc3RyaWJ1dGVzIHJlY2VpdmUgcGFja2V0cyBhbW9uZyBxdWV1ZXMuCisgICAqIGRhdGExID0gaGFzaCB0eXBlCisgICAqIDE6IElQVjQgICAgICAgICAgICAocmVxdWlyZWQgYnkgUlNTKQorICAgKiAyOiBUQ1BfSVBWNCAgICAgICAgKHJlcXVpcmVkIGJ5IFJTUykKKyAgICogMzogSVBWNCB8IFRDUF9JUFY0IChyZXF1aXJlZCBieSBSU1MpCisgICAqIDQ6IHNvdXJjZSBwb3J0CisgICAqIDU6IHNvdXJjZSBwb3J0ICsgZGVzdGluYXRpb24gcG9ydAorICAgKi8KKyNkZWZpbmUgTVhHRUZXX1JTU19IQVNIX1RZUEVfSVBWNCAgICAgIDB4MQorI2RlZmluZSBNWEdFRldfUlNTX0hBU0hfVFlQRV9UQ1BfSVBWNCAgMHgyCisjZGVmaW5lIE1YR0VGV19SU1NfSEFTSF9UWVBFX1NSQ19QT1JUICAweDQKKyNkZWZpbmUgTVhHRUZXX1JTU19IQVNIX1RZUEVfU1JDX0RTVF9QT1JUIDB4NQorI2RlZmluZSBNWEdFRldfUlNTX0hBU0hfVFlQRV9NQVggMHg1CisKKyAgTVhHRUZXX0NNRF9HRVRfTUFYX1RTTzZfSERSX1NJWkUgPSA0NCwKKyAgLyogUmV0dXJuIGRhdGEgPSB0aGUgbWF4LiBzaXplIG9mIHRoZSBlbnRpcmUgaGVhZGVycyBvZiBhIElQdjYgVFNPIHBhY2tldC4KKyAgICogSWYgdGhlIGhlYWRlciBzaXplIG9mIGEgSVB2NiBUU08gcGFja2V0IGlzIGxhcmdlciB0aGFuIHRoZSBzcGVjaWZpZWQKKyAgICogdmFsdWUsIHRoZW4gdGhlIGRyaXZlciBtdXN0IG5vdCB1c2UgVFNPLgorICAgKiBUaGlzIHNpemUgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIElQdjYgVFNPLgorICAgKiBGb3IgSVB2NCBUU08sIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGhlYWRlcnMgaXMgZml4ZWQsIGFuZCB0aGUgTklDCisgICAqIGFsd2F5cyBoYXMgZW5vdWdoIGhlYWRlciBidWZmZXIgdG8gc3RvcmUgbWF4aW11bS1zaXplZCBoZWFkZXJzLgorICAgKi8KKworICBNWEdFRldfQ01EX1NFVF9UU09fTU9ERSA9IDQ1LAorICAvKiBkYXRhMCA9IFRTTyBtb2RlLgorICAgKiAwOiBMaW51eC9GcmVlQlNEIHN0eWxlIChOSUMgZGVmYXVsdCkKKyAgICogMTogTkRJUy9OZXRCU0Qgc3R5bGUKKyAgICovCisjZGVmaW5lIE1YR0VGV19UU09fTU9ERV9MSU5VWCAgMAorI2RlZmluZSBNWEdFRldfVFNPX01PREVfTkRJUyAgIDEKKworICBNWEdFRldfQ01EX01ESU9fUkVBRCA9IDQ2LAorICAvKiBkYXRhMCA9IGRldl9hZGRyIChQTUEvUE1EIG9yIFBDUyAuLi4pLCBkYXRhMSA9IHJlZ2lzdGVyL2FkZHIgKi8KKyAgTVhHRUZXX0NNRF9NRElPX1dSSVRFID0gNDcsCisgIC8qIGRhdGEwID0gZGV2X2FkZHIsICBkYXRhMSA9IHJlZ2lzdGVyL2FkZHIsIGRhdGEyID0gdmFsdWUgICovCisKKyAgTVhHRUZXX0NNRF9JMkNfUkVBRCA9IDQ4LAorICAvKiBTdGFydHMgdG8gZ2V0IGEgZnJlc2ggY29weSBvZiBvbmUgYnl0ZSBvciBvZiB0aGUgbW9kdWxlIGkyYyB0YWJsZSwgdGhlCisgICAqIG9idGFpbmVkIGRhdGEgaXMgY2FjaGVkIGluc2lkZSB0aGUgeGF1aS14ZmkgY2hpcCA6CisgICAqICAgZGF0YTAgOiAgMCA9PiBnZXQgb25lIGJ5dGUsIDE9PiBnZXQgMjU2IGJ5dGVzCisgICAqICAgZGF0YTEgOiAgSWYgZGF0YTAgPT0gMDogbG9jYXRpb24gdG8gcmVmcmVzaAorICAgKiAgICAgICAgICAgICAgIGJpdCA3OjAgIHJlZ2lzdGVyIGxvY2F0aW9uCisgICAqICAgICAgICAgICAgICAgYml0IDg6MTUgaXMgdGhlIGkyYyBzbGF2ZSBhZGRyICgwIGlzIGludGVycHJldGVkIGFzIDB4QTEpCisgICAqICAgICAgICAgICAgICAgYml0IDIzOjE2IGlzIHRoZSBpMmMgYnVzIG51bWJlciAoZm9yIG11bHRpLXBvcnQgTklDcykKKyAgICogICAgICAgICAgICBJZiBkYXRhMCA9PSAxOiB1bnVzZWQKKyAgICogVGhlIG9wZXJhdGlvbiBtaWdodCB0YWtlIH4xbXMgZm9yIGEgc2luZ2xlIGJ5dGUgb3IgfjY1bXMgd2hlbiByZWZyZXNoaW5nIGFsbCAyNTYgYnl0ZXMKKyAgICogRHVyaW5nIHRoZSBpMmMgb3BlcmF0aW9uLCAgTVhHRUZXX0NNRF9JMkNfUkVBRCBvciBNWEdFRldfQ01EX0kyQ19CWVRFIGF0dGVtcHRzCisgICAqICB3aWxsIHJldHVybiBNWEdFRldfQ01EX0VSUk9SX0JVU1kKKyAgICovCisgIE1YR0VGV19DTURfSTJDX0JZVEUgPSA0OSwKKyAgLyogUmV0dXJuIHRoZSBsYXN0IG9idGFpbmVkIGNvcHkgb2YgYSBnaXZlbiBieXRlIGluIHRoZSB4ZnAgaTJjIHRhYmxlCisgICAqIChjb3B5IGNhY2hlZCBkdXJpbmcgdGhlIGxhc3QgcmVsZXZhbnQgTVhHRUZXX0NNRF9JMkNfUkVBRCkKKyAgICogICBkYXRhMCA6IGluZGV4IG9mIHRoZSBkZXNpcmVkIHRhYmxlIGVudHJ5CisgICAqICBSZXR1cm4gZGF0YSA9IHRoZSBieXRlIHN0b3JlZCBhdCB0aGUgcmVxdWVzdGVkIGluZGV4IGluIHRoZSB0YWJsZQorICAgKi8KKworICBNWEdFRldfQ01EX0dFVF9WUFVNUF9PRkZTRVQgPSA1MCwKKyAgLyogUmV0dXJuIGRhdGEgPSBOSUMgbWVtb3J5IG9mZnNldCBvZiBtY3BfdnB1bXBfcHVibGljX2dsb2JhbCAqLworICBNWEdFRldfQ01EX1JFU0VUX1ZQVU1QID0gNTEsCisgIC8qIFJlc2V0cyB0aGUgVlBVTVAgc3RhdGUgKi8KKworICBNWEdFRldfQ01EX1NFVF9SU1NfTUNQX1NMT1RfVFlQRSA9IDUyLAorICAvKiBkYXRhMCA9IG1jcF9zbG90IHR5cGUgdG8gdXNlLgorICAgKiAwID0gdGhlIGRlZmF1bHQgNEIgbWNwX3Nsb3QKKyAgICogMSA9IDhCIG1jcF9zbG90XzgKKyAgICovCisjZGVmaW5lIE1YR0VGV19SU1NfTUNQX1NMT1RfVFlQRV9NSU4gICAgICAgIDAKKyNkZWZpbmUgTVhHRUZXX1JTU19NQ1BfU0xPVF9UWVBFX1dJVEhfSEFTSCAgMQorCisgIE1YR0VGV19DTURfU0VUX1RIUk9UVExFX0ZBQ1RPUiA9IDUzLAorICAvKiBzZXQgdGhlIHRocm90dGxlIGZhY3RvciBmb3IgZXRocF96OGUKKyAgICAgZGF0YTAgPSB0aHJvdHRsZV9mYWN0b3IKKyAgICAgdGhyb3R0bGVfZmFjdG9yID0gMjU2ICogcGNpZS1yYXctc3BlZWQgLyB0eF9zcGVlZAorICAgICB0eF9zcGVlZCA9IDI1NiAqIHBjaWUtcmF3LXNwZWVkIC8gdGhyb3R0bGVfZmFjdG9yCisKKyAgICAgRm9yIFBDSS1FIHg4OiBwY2llLXJhdy1zcGVlZCA9PSAxNkdiL3MKKyAgICAgRm9yIFBDSS1FIHg0OiBwY2llLXJhdy1zcGVlZCA9PSA4R2IvcworCisgICAgIGV4MTogdGhyb3R0bGVfZmFjdG9yID09IDB4MWEwICg0MTYpLCB0eF9zcGVlZCA9PSAxLjIzR0IvcyA9PSA5Ljg0NiBHYi9zCisgICAgIGV4MjogdGhyb3R0bGVfZmFjdG9yID09IDB4MjAwICg1MTIpLCB0eF9zcGVlZCA9PSAxLjBHQi9zID09IDggR2IvcworCisgICAgIHdpdGggdHhfYm91bmRhcnkgPT0gMjA0OCwgbWF4LXRocm90dGxlLWZhY3RvciA9PSA4MTkxID0+IG1pbi1zcGVlZCA9PSA1MDBNYi9zCisgICAgIHdpdGggdHhfYm91bmRhcnkgPT0gNDA5NiwgbWF4LXRocm90dGxlLWZhY3RvciA9PSA0MDk1ID0+IG1pbi1zcGVlZCA9PSAxR2IvcworICAqLworCisgIE1YR0VGV19DTURfVlBVTVBfVVAgPSA1NCwKKyAgLyogQWxsb2NhdGVzIFZQdW1wIENvbm5lY3Rpb24sIFNlbmQgUmVxdWVzdCBhbmQgWmVybyBjb3B5IGJ1ZmZlciBhZGRyZXNzIHRhYmxlcyAqLworICBNWEdFRldfQ01EX0dFVF9WUFVNUF9DTEsgPSA1NSwKKyAgLyogR2V0IHRoZSBsYW5haSBjbG9jayAqLworCisgIE1YR0VGV19DTURfR0VUX0RDQV9PRkZTRVQgPSA1NiwKKyAgLyogb2Zmc2V0IG9mIGRjYSBjb250cm9sIGZvciBXRE1BcyAqLworCisgIC8qIFZNV2FyZSBOZXRRdWV1ZSBjb21tYW5kcyAqLworICBNWEdFRldfQ01EX05FVFFfR0VUX0ZJTFRFUlNfUEVSX1FVRVVFID0gNTcsCisgIE1YR0VGV19DTURfTkVUUV9BRERfRklMVEVSID0gNTgsCisgIC8qIGRhdGEwID0gZmlsdGVyX2lkIDw8IDE2IHwgcXVldWUgPDwgOCB8IHR5cGUgKi8KKyAgLyogZGF0YTEgPSBNUzQgb2YgTUFDIEFkZHIgKi8KKyAgLyogZGF0YTIgPSBMUzJfTUFDIDw8IDE2IHwgVkxBTl90YWcgKi8KKyAgTVhHRUZXX0NNRF9ORVRRX0RFTF9GSUxURVIgPSA1OSwKKyAgLyogZGF0YTAgPSBmaWx0ZXJfaWQgKi8KKyAgTVhHRUZXX0NNRF9ORVRRX1FVRVJZMSA9IDYwLAorICBNWEdFRldfQ01EX05FVFFfUVVFUlkyID0gNjEsCisgIE1YR0VGV19DTURfTkVUUV9RVUVSWTMgPSA2MiwKKyAgTVhHRUZXX0NNRF9ORVRRX1FVRVJZNCA9IDYzLAorCisgIE1YR0VGV19DTURfUkVMQVhfUlhCVUZGRVJfQUxJR05NRU5UID0gNjQsCisgIC8qIFdoZW4gc2V0LCBzbWFsbCByZWNlaXZlIGJ1ZmZlcnMgY2FuIGNyb3NzIHBhZ2UgYm91bmRhcmllcy4KKyAgICogQm90aCBzbWFsbCBhbmQgYmlnIHJlY2VpdmUgYnVmZmVycyBtYXkgc3RhcnQgYXQgYW55IGFkZHJlc3MuCisgICAqIFRoaXMgb3B0aW9uIGhhcyBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMsIHNvIHVzZSB3aXRoIGNhdXRpb24uCisgICAqLworfTsKK3R5cGVkZWYgZW51bSBteXJpMTBnZV9tY3BfY21kX3R5cGUgbXlyaTEwZ2VfbWNwX2NtZF90eXBlX3Q7CisKKworZW51bSBteXJpMTBnZV9tY3BfY21kX3N0YXR1cyB7CisgIE1YR0VGV19DTURfT0sgPSAwLAorICBNWEdFRldfQ01EX1VOS05PV04gPSAxLAorICBNWEdFRldfQ01EX0VSUk9SX1JBTkdFID0gMiwKKyAgTVhHRUZXX0NNRF9FUlJPUl9CVVNZID0gMywKKyAgTVhHRUZXX0NNRF9FUlJPUl9FTVBUWSA9IDQsCisgIE1YR0VGV19DTURfRVJST1JfQ0xPU0VEID0gNSwKKyAgTVhHRUZXX0NNRF9FUlJPUl9IQVNIX0VSUk9SID0gNiwKKyAgTVhHRUZXX0NNRF9FUlJPUl9CQURfUE9SVCA9IDcsCisgIE1YR0VGV19DTURfRVJST1JfUkVTT1VSQ0VTID0gOCwKKyAgTVhHRUZXX0NNRF9FUlJPUl9NVUxUSUNBU1QgPSA5LAorICBNWEdFRldfQ01EX0VSUk9SX1VOQUxJR05FRCA9IDEwLAorICBNWEdFRldfQ01EX0VSUk9SX05PX01ESU8gPSAxMSwKKyAgTVhHRUZXX0NNRF9FUlJPUl9JMkNfRkFJTFVSRSA9IDEyLAorICBNWEdFRldfQ01EX0VSUk9SX0kyQ19BQlNFTlQgPSAxMywKKyAgTVhHRUZXX0NNRF9FUlJPUl9CQURfUENJRV9MSU5LID0gMTQKK307Cit0eXBlZGVmIGVudW0gbXlyaTEwZ2VfbWNwX2NtZF9zdGF0dXMgbXlyaTEwZ2VfbWNwX2NtZF9zdGF0dXNfdDsKKworCisjZGVmaW5lIE1YR0VGV19PTERfSVJRX0RBVEFfTEVOIDQwCisKK3N0cnVjdCBtY3BfaXJxX2RhdGEgeworICAvKiBhZGQgbmV3IGNvdW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgKi8KKyAgdWludDMyX3QgZnV0dXJlX3VzZVsxXTsKKyAgdWludDMyX3QgZHJvcHBlZF9wYXVzZTsKKyAgdWludDMyX3QgZHJvcHBlZF91bmljYXN0X2ZpbHRlcmVkOworICB1aW50MzJfdCBkcm9wcGVkX2JhZF9jcmMzMjsKKyAgdWludDMyX3QgZHJvcHBlZF9iYWRfcGh5OworICB1aW50MzJfdCBkcm9wcGVkX211bHRpY2FzdF9maWx0ZXJlZDsKKy8qIDQwIEJ5dGVzICovCisgIHVpbnQzMl90IHNlbmRfZG9uZV9jb3VudDsKKworI2RlZmluZSBNWEdFRldfTElOS19ET1dOIDAKKyNkZWZpbmUgTVhHRUZXX0xJTktfVVAgMQorI2RlZmluZSBNWEdFRldfTElOS19NWVJJTkVUIDIKKyNkZWZpbmUgTVhHRUZXX0xJTktfVU5LTk9XTiAzCisgIHVpbnQzMl90IGxpbmtfdXA7CisgIHVpbnQzMl90IGRyb3BwZWRfbGlua19vdmVyZmxvdzsKKyAgdWludDMyX3QgZHJvcHBlZF9saW5rX2Vycm9yX29yX2ZpbHRlcmVkOworICB1aW50MzJfdCBkcm9wcGVkX3J1bnQ7CisgIHVpbnQzMl90IGRyb3BwZWRfb3ZlcnJ1bjsKKyAgdWludDMyX3QgZHJvcHBlZF9ub19zbWFsbF9idWZmZXI7CisgIHVpbnQzMl90IGRyb3BwZWRfbm9fYmlnX2J1ZmZlcjsKKyAgdWludDMyX3QgcmRtYV90YWdzX2F2YWlsYWJsZTsKKworICB1aW50OF90IHR4X3N0b3BwZWQ7CisgIHVpbnQ4X3QgbGlua19kb3duOworICB1aW50OF90IHN0YXRzX3VwZGF0ZWQ7CisgIHVpbnQ4X3QgdmFsaWQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbWNwX2lycV9kYXRhIG1jcF9pcnFfZGF0YV90OworCisjaWZkZWYgTVhHRUZXX05ESVMKKy8qIEV4Y2x1c2l2ZWx5IHVzZWQgYnkgTkRJUyBkcml2ZXJzICovCitzdHJ1Y3QgbWNwX3Jzc19zaGFyZWRfaW50ZXJydXB0IHsKKyAgdWludDhfdCBwYWRbMl07CisgIHVpbnQ4X3QgcXVldWU7CisgIHVpbnQ4X3QgdmFsaWQ7Cit9OworI2VuZGlmCisKKy8qIGRlZmluaXRpb25zIGZvciBORVRRIGZpbHRlciB0eXBlICovCisjZGVmaW5lIE1YR0VGV19ORVRRX0ZJTFRFUlRZUEVfTk9ORSAwCisjZGVmaW5lIE1YR0VGV19ORVRRX0ZJTFRFUlRZUEVfTUFDQUREUiAxCisjZGVmaW5lIE1YR0VGV19ORVRRX0ZJTFRFUlRZUEVfVkxBTiAyCisjZGVmaW5lIE1YR0VGV19ORVRRX0ZJTFRFUlRZUEVfVkxBTk1BQ0FERFIgMworCisjZW5kaWYgLyogX215cmkxMGdlX21jcF9oICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9uYXRzZW1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzZjMyMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtMCwwICsxLDYwOSBAQAorLyogCisgICBuYXRzZW1pLmMgLSBnUFhFIGRyaXZlciBmb3IgdGhlIE5hdFNlbWkgRFA4MzgxeCBzZXJpZXMuIAorIAorICAgQmFzZWQgb246CisKKyAgIG5hdHNlbWkuYzogQW4gRXRoZXJib290IGRyaXZlciBmb3IgdGhlIE5hdFNlbWkgRFA4MzgxeCBzZXJpZXMuCisKKyAgIENvcHlyaWdodCAoQykgMjAwMSBFbnRpdHkgQ3liZXIsIEluYy4KKyAgIAorICAgVGhpcyBkZXZlbG9wbWVudCBvZiB0aGlzIEV0aGVyYm9vdCBkcml2ZXIgd2FzIGZ1bmRlZCBieSAKKyAgIAorICAgICAgU2ljb20gU3lzdGVtczogaHR0cDovL3d3dy5zaWNvbXBvcy5jb20vCisgICAKKyAgIEF1dGhvcjogTWFydHkgQ29ubm9yIDxtZGNAZXRoZXJib290Lm9yZz4KKyAgIEFkYXB0ZWQgZnJvbSBhIExpbnV4IGRyaXZlciB3aGljaCB3YXMgd3JpdHRlbiBieSBEb25hbGQgQmVja2VyCisgICAKKyAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgCisgICBPcmlnaW5hbCBDb3B5cmlnaHQgTm90aWNlOgorICAgCisgICBXcml0dGVuL2NvcHlyaWdodCAxOTk5LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKyAgIAorICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAgIERyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKyAgIHJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKyAgIGEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisgICBzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4gIExpY2Vuc2UgZm9yIHVuZGVyIG90aGVyIHRlcm1zIG1heSBiZQorICAgYXZhaWxhYmxlLiAgQ29udGFjdCB0aGUgb3JpZ2luYWwgYXV0aG9yIGZvciBkZXRhaWxzLgorICAgCisgICBUaGUgb3JpZ2luYWwgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIGF0CisgICBTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKyAgIDQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisgICBBbm5hcG9saXMgTUQgMjE0MDMKKyAgIAorICAgU3VwcG9ydCBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKyAgIGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvbmV0c2VtaS5odG1sCisgICAKKyAgIFJlZmVyZW5jZXM6CisgICAKKyAgIGh0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC8xMDBtYnBzLmh0bWwKKyAgIGh0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC9OV2F5Lmh0bWwKKyAgIERhdGFzaGVldCBpcyBhdmFpbGFibGUgZnJvbToKKyAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0RQL0RQODM4MTUuaHRtbAorCisqLworCitGSUxFX0xJQ0VOQ0UgKCBHUExfQU5ZICk7CisKKy8qIFJldmlzaW9uIEhpc3RvcnkgKi8KKworLyoKKyAgMDIgSnVsIDIwMDcgIFVkYXlhbiBLdW1hcgkgMS4yIHBvcnRlZCB0aGUgZHJpdmVyIGZyb20gZXRoZXJib290IHRvIGdQWEUgQVBJLgorCQkJCSAgICAgRnVsbHkgcmV3cml0dGVuLGFkYXB0aW5nIHRoZSBvbGQgZHJpdmVyLgorCQkgICAgICAJICAgICAgCSAgICAgQWRkZWQgYSBjaXJjdWxhciBidWZmZXIgZm9yIHRyYW5zbWl0IGFuZCByZWNlaXZlLgorCQkgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdCByb3V0aW5lIHdpbGwgbm90IHdhaXQgZm9yIHRyYW5zbWlzc2lvbiB0byBmaW5pc2guCisJCQkgICAgICAgICAgICAgcG9sbCByb3V0aW5lIGRlYWxzIHdpdGggaXQuCisgIDEzIERlYyAyMDAzICBUaW0gTGVnZ2UgICAgICAgICAxLjEgRW5hYmxlZCBNdWx0aWNhc3QgU3VwcG9ydAorICAyOSBNYXkgMjAwMSAgTWFydHkgQ29ubm9yCSAxLjAgSW5pdGlhbCBSZWxlYXNlLiBUZXN0ZWQgd2l0aCBOZXRnZWFyIEZBMzExIGFuZCBGQTMxMiBib2FyZHMKKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvc3BpX2JpdC5oPgorI2luY2x1ZGUgPGdweGUvdGhyZWV3aXJlLmg+CisjaW5jbHVkZSA8Z3B4ZS9udm8uaD4KKyNpbmNsdWRlICJuYXRzZW1pLmgiCisKKy8qICBGdW5jdGlvbiBQcm90b3R5cGVzOiAqLworIAorc3RhdGljIGludCBuYXRzZW1pX3NwaV9yZWFkX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICosIHVuc2lnbmVkIGludCApOworc3RhdGljIHZvaWQgbmF0c2VtaV9zcGlfd3JpdGVfYml0ICggc3RydWN0IGJpdF9iYXNoZXIgKix1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcgKTsgCitzdGF0aWMgdm9pZCBuYXRzZW1pX2luaXRfZWVwcm9tICggc3RydWN0IG5hdHNlbWlfcHJpdmF0ZSAqICk7IAorc3RhdGljIGludCBuYXRzZW1pX3Byb2JlIChzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgbmF0c2VtaV9yZXNldCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IG5hdHNlbWlfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IG5hdHNlbWlfdHJhbnNtaXQgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmKTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfcG9sbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgdm9pZCBuYXRzZW1pX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfaXJxIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgZW5hYmxlKTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfcmVtb3ZlIChzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKTsKKworLyoqIG5hdHNlbWkgbmV0IGRldmljZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BlcmF0aW9ucyBuYXRzZW1pX29wZXJhdGlvbnMgPSB7CisgICAgICAgIC5vcGVuICAgICAgICAgICA9IG5hdHNlbWlfb3BlbiwKKyAgICAgICAgLmNsb3NlICAgICAgICAgID0gbmF0c2VtaV9jbG9zZSwKKyAgICAgICAgLnRyYW5zbWl0ICAgICAgID0gbmF0c2VtaV90cmFuc21pdCwKKyAgICAgICAgLnBvbGwgICAgICAgICAgID0gbmF0c2VtaV9wb2xsLAorCS5pcnEJCT0gbmF0c2VtaV9pcnEsCit9OworCitzdGF0aWMgaW50IG5hdHNlbWlfc3BpX3JlYWRfYml0ICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBiaXRfaWQgKSB7CisJc3RydWN0IG5hdHNlbWlfcHJpdmF0ZSAqbnAgPSBjb250YWluZXJfb2YgKCBiYXNoZXIsIHN0cnVjdCBuYXRzZW1pX3ByaXZhdGUsCisJCQkJCQkgc3BpYml0LmJhc2hlciApOworCXVpbnQ4X3QgbWFzayA9IG5hdHNlbWlfZWVfYml0c1tiaXRfaWRdOworCXVpbnQ4X3QgZWVyZWc7CisKKwllZXJlZyA9IGluYiAoIG5wLT5pb2FkZHIgKyBFRV9SRUcgKTsKKwlyZXR1cm4gKCBlZXJlZyAmIG1hc2sgKTsKK30KKworc3RhdGljIHZvaWQgbmF0c2VtaV9zcGlfd3JpdGVfYml0ICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciwKKwkJCQl1bnNpZ25lZCBpbnQgYml0X2lkLCB1bnNpZ25lZCBsb25nIGRhdGEgKSB7CisJc3RydWN0IG5hdHNlbWlfcHJpdmF0ZSAqbnAgPSBjb250YWluZXJfb2YgKCBiYXNoZXIsIHN0cnVjdCBuYXRzZW1pX3ByaXZhdGUsCisJCQkJCQkgc3BpYml0LmJhc2hlciApOworCXVpbnQ4X3QgbWFzayA9IG5hdHNlbWlfZWVfYml0c1tiaXRfaWRdOworCXVpbnQ4X3QgZWVyZWc7CisKKwllZXJlZyA9IGluYiAoIG5wLT5pb2FkZHIgKyBFRV9SRUcgKTsKKwllZXJlZyAmPSB+bWFzazsKKwllZXJlZyB8PSAoIGRhdGEgJiBtYXNrICk7CisJb3V0YiAoIGVlcmVnLCBucC0+aW9hZGRyICsgRUVfUkVHICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYml0X2Jhc2hlcl9vcGVyYXRpb25zIG5hdHNlbWlfYmFzaGVyX29wcyA9IHsKKwkucmVhZCA9IG5hdHNlbWlfc3BpX3JlYWRfYml0LAorCS53cml0ZSA9IG5hdHNlbWlfc3BpX3dyaXRlX2JpdCwKK307CisKKy8qIEl0IGxvb2tzIHRoYXQgdGhpcyBwb3J0aW9uIG9mIEVFUFJPTSBjYW4gYmUgdXNlZCBmb3IgCisgKiBub24tdm9sYXRpbGUgc3RvcmVkIG9wdGlvbnMuIERhdGEgc2hlZXQgZG9lcyBub3QgdGFsayBhYm91dCB0aGlzIHJlZ2lvbi4KKyAqIEN1cnJlbnRseSBpdCBpcyBub3Qgd29ya2luZy4gQnV0IHdpdGggc29tZSBlZmZvcnRzIGl0IGNhbi4KKyAqLworc3RhdGljIHN0cnVjdCBudm9fZnJhZ21lbnQgbmF0c2VtaV9udm9fZnJhZ21lbnRzW10gPSB7CisJeyAweDBjLCAweDY4IH0sCisJeyAwLCAwIH0KK307CisKKy8qCisgKiBTZXQgdXAgZm9yIEVFUFJPTSBhY2Nlc3MKKyAqCisgKiBAdiBOQVQJCU5BVFNFTUkgTklDCisgKi8KK3N0YXRpYyB2b2lkIG5hdHNlbWlfaW5pdF9lZXByb20gKCBzdHJ1Y3QgbmF0c2VtaV9wcml2YXRlICpucCApIHsKKworCS8qIEluaXRpYWxpc2UgdGhyZWUtd2lyZSBidXMgCisJICovCisJbnAtPnNwaWJpdC5iYXNoZXIub3AgPSAmbmF0c2VtaV9iYXNoZXJfb3BzOworCW5wLT5zcGliaXQuYnVzLm1vZGUgPSBTUElfTU9ERV9USFJFRVdJUkU7CisJbnAtPnNwaWJpdC5lbmRpYW5uZXNzID0gU1BJX0JJVF9MSVRUTEVfRU5ESUFOOworCWluaXRfc3BpX2JpdF9iYXNoZXIgKCAmbnAtPnNwaWJpdCApOworCisJLypuYXRzZW1pIERQIDgzODE1IG9ubHkgc3VwcG9ydHMgYXQ5M2M0NgorCSAqLworCWluaXRfYXQ5M2M0NiAoICZucC0+ZWVwcm9tLCAxNiApOworCW5wLT5lZXByb20uYnVzID0gJm5wLT5zcGliaXQuYnVzOworCW5wLT5udm8ubnZzID0gJm5wLT5lZXByb20ubnZzOworCW5wLT5udm8uZnJhZ21lbnRzID0gbmF0c2VtaV9udm9fZnJhZ21lbnRzOworfQorCisvKioKKyAqIFByb2JlIFBDSSBkZXZpY2UKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgaWQJUENJIElECisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IG5hdHNlbWlfcHJvYmUgKHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQgX191bnVzZWQpIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBuYXRzZW1pX3ByaXZhdGUgKm5wID0gTlVMTDsKKwl1aW50OF90IGxsX2FkZHJfZW5jb2RlZFtNQVhfTExfQUREUl9MRU5dOworCXVpbnQ4X3QgbGFzdD0wLGxhc3QxPTA7CisJdWludDhfdCBwcmV2X2J5dGVzWzJdOworCWludCBpOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIG5ldCBkZXZpY2UgCisJICovCisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYgKHNpemVvZiAoKm5wKSk7CisJaWYgKCEgbmV0ZGV2KSAKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZXRkZXZfaW5pdCAobmV0ZGV2LCAmbmF0c2VtaV9vcGVyYXRpb25zKTsKKwlucCA9IG5ldGRldi0+cHJpdjsKKwlwY2lfc2V0X2RydmRhdGEgKHBjaSwgbmV0ZGV2KTsKKwluZXRkZXYtPmRldiA9ICZwY2ktPmRldjsKKwltZW1zZXQgKG5wLCAwLCBzaXplb2YgKCpucCkpOworCW5wLT5pb2FkZHIgPSBwY2ktPmlvYWRkcjsKKworCWFkanVzdF9wY2lfZGV2aWNlIChwY2kpOworCisJbmF0c2VtaV9yZXNldCAobmV0ZGV2KTsKKwluYXRzZW1pX2luaXRfZWVwcm9tICggbnAgKTsKKwludnNfcmVhZCAoICZucC0+ZWVwcm9tLm52cywgRUVfTUFDLTEsIHByZXZfYnl0ZXMsIDEgKTsKKwludnNfcmVhZCAoICZucC0+ZWVwcm9tLm52cywgRUVfTUFDLCBsbF9hZGRyX2VuY29kZWQsIEVUSF9BTEVOICk7CisKKwkvKiBkZWNvZGluZyB0aGUgTUFDIGFkZHJlc3MgcmVhZCBmcm9tIE5WUyAKKwkgKiBhbmQgc2F2ZSBpdCBpbiBuZXRkZXYtPmxsX2FkZHIKKyAgICAgICAgICovCisJbGFzdCA9IHByZXZfYnl0ZXNbMV0gPj4gNzsKKwlmb3IgKCBpID0gMCA7IGkgPCBFVEhfQUxFTiA7IGkrKyApIHsKKwkJbGFzdDEgPSBsbF9hZGRyX2VuY29kZWRbaV0gPj4gNzsKKwkJbmV0ZGV2LT5od19hZGRyW2ldID0gbGxfYWRkcl9lbmNvZGVkW2ldIDw8IDEgfCBsYXN0OworCQlsYXN0ID0gbGFzdDE7CisJfQorCisJLyogTWFyayBhcyBsaW5rIHVwOyB3ZSBkb24ndCB5ZXQgaGFuZGxlIGxpbmsgc3RhdGUgKi8KKwluZXRkZXZfbGlua191cCAoIG5ldGRldiApOworCisJaWYgKChyYyA9IHJlZ2lzdGVyX25ldGRldiAobmV0ZGV2KSkgIT0gMCkKKwkJZ290byBlcnJfcmVnaXN0ZXJfbmV0ZGV2OworCisJcmV0dXJuIDA7CisKK2Vycl9yZWdpc3Rlcl9uZXRkZXY6CisKKwluYXRzZW1pX3Jlc2V0IChuZXRkZXYpOworCW5ldGRldl9wdXQgKG5ldGRldik7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFJlbW92ZSBQQ0kgZGV2aWNlCisgKgorICogQHYgcGNpCVBDSSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbmF0c2VtaV9yZW1vdmUgKHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwY2kpOworIAorCXVucmVnaXN0ZXJfbmV0ZGV2IChuZXRkZXYpOworCW5hdHNlbWlfcmVzZXQgKG5ldGRldik7CisJbmV0ZGV2X251bGxpZnkgKCBuZXRkZXYgKTsKKwluZXRkZXZfcHV0IChuZXRkZXYpOworfQorCisvKioKKyAqIFJlc2V0IE5JQworICoKKyAqIEB2CQlOQVRTRU1JIE5JQworICoKKyAqIElzc3VlcyBhIGhhcmR3YXJlIHJlc2V0IGFuZCB3YWl0cyBmb3IgdGhlIHJlc2V0IHRvIGNvbXBsZXRlLgorICovCitzdGF0aWMgdm9pZCBuYXRzZW1pX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KSAKK3sKKwlzdHJ1Y3QgbmF0c2VtaV9wcml2YXRlICpucCA9IG5ldGRldi0+cHJpdjsKKwlpbnQgaTsKKyAgICAgICAgdTMyIGNmZzsKKyAgICAgICAgdTMyIHdjc3I7CisgICAgICAgIHUzMiByZmNyOworICAgICAgICB1MTYgcG1hdGNoWzNdOworICAgICAgICB1MTYgc29wYXNzWzNdOworCisJbmF0c2VtaV9pcnEgKG5ldGRldiwgMCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXR0aW5nIHRoZSBjaGlwIGNhdXNlcyBzb21lIHJlZ2lzdGVycyB0byBiZSBsb3N0LgorICAgICAgICAgKiBOYXRzZW1pIHN1Z2dlc3RzIE5PVCByZWxvYWRpbmcgdGhlIEVFUFJPTSB3aGlsZSBsaXZlLCBzbyBpbnN0ZWFkCisgICAgICAgICAqIHdlIHNhdmUgdGhlIHN0YXRlIHRoYXQgd291bGQgaGF2ZSBiZWVuIGxvYWRlZCBmcm9tIEVFUFJPTQorICAgICAgICAgKiBvbiBhIG5vcm1hbCBwb3dlci11cCAoc2VlIHRoZSBzcGVjIEVFUFJPTSBtYXApLgorICAgICAgICAgKi8KKworICAgICAgICAvKiBDRkcgKi8KKyAgICAgICAgY2ZnID0gaW5sIChucC0+aW9hZGRyICsgQ2hpcENvbmZpZykgJiBDRkdfUkVTRVRfU0FWRTsKKworICAgICAgICAvKiBXQ1NSICovCisgICAgICAgIHdjc3IgPSBpbmwgKG5wLT5pb2FkZHIgKyBXT0xDbWQpICYgV0NTUl9SRVNFVF9TQVZFOworCisgICAgICAgIC8qIFJGQ1IgKi8KKyAgICAgICAgcmZjciA9IGlubCAobnAtPmlvYWRkciArIFJ4RmlsdGVyQWRkcikgJiBSRkNSX1JFU0VUX1NBVkU7CisKKyAgICAgICAgLyogUE1BVENIICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJb3V0bChpKjIsIG5wLT5pb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCQlwbWF0Y2hbaV0gPSBpbncobnAtPmlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTT1BBUyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJICAJb3V0bCgweGErKGkqMiksIG5wLT5pb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCQlzb3Bhc3NbaV0gPSBpbncobnAtPmlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBub3cgd2hhY2sgdGhlIGNoaXAgKi8KKyAgICAgICAgb3V0bChDaGlwUmVzZXQsIG5wLT5pb2FkZHIgKyBDaGlwQ21kKTsKKyAgICAgICAgZm9yIChpPTA7IGk8TkFUU0VNSV9IV19USU1FT1VUOyBpKyspIHsKKwkJaWYgKCEgKGlubCAobnAtPmlvYWRkciArIENoaXBDbWQpICYgQ2hpcFJlc2V0KSkKKwkJICAgICAgIGJyZWFrOworCQl1ZGVsYXkoNSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gTkFUU0VNSV9IV19USU1FT1VUKSB7CisJICAJREJHICgibmF0c2VtaV9yZXNldDogcmVzZXQgZGlkIG5vdCBjb21wbGV0ZSBpbiAlZCB1c2VjLlxuIiwgaSo1KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlc3RvcmUgQ0ZHICovCisgICAgICAgIGNmZyB8PSBpbmwobnAtPmlvYWRkciArIENoaXBDb25maWcpICYgfkNGR19SRVNFVF9TQVZFOworCWNmZyAmPSB+KENmZ0V4dFBoeSB8IENmZ1BoeURpcyk7CisgICAgICAgIG91dGwgKGNmZywgbnAtPmlvYWRkciArIENoaXBDb25maWcpOworCisgICAgICAgIC8qIHJlc3RvcmUgV0NTUiAqLworICAgICAgICB3Y3NyIHw9IGlubCAobnAtPmlvYWRkciArIFdPTENtZCkgJiB+V0NTUl9SRVNFVF9TQVZFOworICAgICAgICBvdXRsICh3Y3NyLCBucC0+aW9hZGRyICsgV09MQ21kKTsKKworICAgICAgICAvKiByZWFkIFJGQ1IgKi8KKyAgICAgICAgcmZjciB8PSBpbmwgKG5wLT5pb2FkZHIgKyBSeEZpbHRlckFkZHIpICYgflJGQ1JfUkVTRVRfU0FWRTsKKworICAgICAgICAvKiByZXN0b3JlIFBNQVRDSCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJICAJb3V0bCAoaSoyLCBucC0+aW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwkJb3V0dyAocG1hdGNoW2ldLCBucC0+aW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCW91dGwgKDB4YSsoaSoyKSwgbnAtPmlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJCW91dHcgKHNvcGFzc1tpXSwgbnAtPmlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgLyogcmVzdG9yZSBSRkNSICovCisgICAgICAgIG91dGwgKHJmY3IsIG5wLT5pb2FkZHIgKyBSeEZpbHRlckFkZHIpOworfQorCisvKioKKyAqIE9wZW4gTklDCisgKgorICogQHYgbmV0ZGV2CQlOZXQgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBuYXRzZW1pX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5hdHNlbWlfcHJpdmF0ZSAqbnAgPSBuZXRkZXYtPnByaXY7CisJdWludDMyX3QgdHhfY29uZmlnLCByeF9jb25maWc7CisJaW50IGk7CisJCisJLyogRGlzYWJsZSBQTUU6CisgICAgICAgICAqIFRoZSBQTUUgYml0IGlzIGluaXRpYWxpemVkIGZyb20gdGhlIEVFUFJPTSBjb250ZW50cy4KKyAgICAgICAgICogUENJIGNhcmRzIHByb2JhYmx5IGhhdmUgUE1FIGRpc2FibGVkLCBidXQgbW90aGVyYm9hcmQKKyAgICAgICAgICogaW1wbGVtZW50YXRpb25zIG1heSBoYXZlIFBNRSBzZXQgdG8gZW5hYmxlIFdha2VPbkxhbi4gCisgICAgICAgICAqIFdpdGggUE1FIHNldCB0aGUgY2hpcCB3aWxsIHNjYW4gaW5jb21pbmcgcGFja2V0cyBidXQKKyAgICAgICAgICogbm90aGluZyB3aWxsIGJlIHdyaXR0ZW4gdG8gbWVtb3J5LiAKKyAgICAgICAgICovCisgICAgICAgIG91dGwgKGlubCAobnAtPmlvYWRkciArIENsa1J1bikgJiB+MHgxMDAsIG5wLT5pb2FkZHIgKyBDbGtSdW4pOworCisJLyogU2V0IE1BQyBhZGRyZXNzIGluIE5JQworCSAqLworCWZvciAoaSA9IDAgOyBpIDwgRVRIX0FMRU4gOyBpKz0yKSB7CisJCW91dGwgKGksIG5wLT5pb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCQlvdXR3IChuZXRkZXYtPmxsX2FkZHJbaV0gKyAobmV0ZGV2LT5sbF9hZGRyW2kgKyAxXSA8PCA4KSwKKwkJICAgICAgIG5wLT5pb2FkZHIgKyBSeEZpbHRlckRhdGEpOworCX0KKworCS8qIFNldHVwIFR4IFJpbmcgCisJICovCisJbnAtPnR4X2N1ciA9IDA7CisJbnAtPnR4X2RpcnR5ID0gMDsKKwlmb3IgKGkgPSAwIDsgaSA8IFRYX1JJTkdfU0laRSA7IGkrKykgeworCQlucC0+dHhbaV0ubGluayAgID0gdmlydF90b19idXMgKChpICsgMSA8IFRYX1JJTkdfU0laRSkgPyAmbnAtPnR4W2kgKyAxXSA6ICZucC0+dHhbMF0pOworCQlucC0+dHhbaV0uY21kc3RzID0gMDsKKwkJbnAtPnR4W2ldLmJ1ZnB0ciA9IDA7CisJfQorCW91dGwgKHZpcnRfdG9fYnVzICgmbnAtPnR4WzBdKSxucC0+aW9hZGRyICsgVHhSaW5nUHRyKTsKKworCURCRyAoIk5hdHNlbWkgVHggZGVzY3JpcHRvciBsb2FkZWQgd2l0aDogJSMwOHhcbiIsCisJICAgICBpbmwgKG5wLT5pb2FkZHIgKyBUeFJpbmdQdHIpKTsKKworCS8qIFNldHVwIFJYIHJpbmcKKwkgKi8KKwlucC0+cnhfY3VyID0gMDsKKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9SWF9ERVNDIDsgaSsrKSB7CisJCW5wLT5pb2J1ZltpXSA9IGFsbG9jX2lvYiAoUlhfQlVGX1NJWkUpOworCQlpZiAoISBucC0+aW9idWZbaV0pCisJCQlnb3RvIG1lbW9yeV9hbGxvY19lcnI7CisJCW5wLT5yeFtpXS5saW5rICAgPSB2aXJ0X3RvX2J1cyAoKGkgKyAxIDwgTlVNX1JYX0RFU0MpIAorCQkJCQkJPyAmbnAtPnJ4W2kgKyAxXSA6ICZucC0+cnhbMF0pOworCQlucC0+cnhbaV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CisJCW5wLT5yeFtpXS5idWZwdHIgPSB2aXJ0X3RvX2J1cyAobnAtPmlvYnVmW2ldLT5kYXRhKTsKKwkJREJHICgiIEFkZHJlc3Mgb2YgaW9idWYgWyVkXSA9ICVwIGFuZCBpb2J1Zi0+ZGF0YSA9ICVwIFxuIiwgaSwgCisJCSAgICAgICZucC0+aW9idWZbaV0sICAmbnAtPmlvYnVmW2ldLT5kYXRhKTsKKwl9CisJb3V0bCAodmlydF90b19idXMgKCZucC0+cnhbMF0pLCBucC0+aW9hZGRyICsgUnhSaW5nUHRyKTsKKworCURCRyAoIk5hdHNlbWkgUnggZGVzY3JpcHRvciBsb2FkZWQgd2l0aDogJSMwOHhcbiIsCisJICAgICAgaW5sIChucC0+aW9hZGRyICsgUnhSaW5nUHRyKSk7CQkKKworCS8qIFNldHVwIFJYIEZpbHRlciAKKwkgKi8KKwlvdXRsIChSeEZpbHRlckVuYWJsZSB8IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdEFsbE11bHRpY2FzdCB8IEFjY2VwdE15UGh5cywKKwkgICAgICBucC0+aW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKworCS8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAKKwkgKiBDb25maWd1cmUgdGhlIFBDSSBidXMgYnVyc3RzIGFuZCBGSUZPIHRocmVzaG9sZHMuIAorCSAqIENvbmZpZ3VyZSBmb3Igc3RhbmRhcmQsIGluLXNwZWMgRXRoZXJuZXQuIAorCSAqLworCWlmIChpbmwgKG5wLT5pb2FkZHIgKyBDaGlwQ29uZmlnKSAmIDB4MjAwMDAwMDApIHsJLyogRnVsbCBkdXBsZXggKi8KKwkJREJHICgiRnVsbCBkdXBsZXhcbiIpOworCQl0eF9jb25maWcgPSAweEQwODAxMDAyIHwgIDB4QzAwMDAwMDA7CisJCXJ4X2NvbmZpZyA9IDB4MTAwMDAwMjAgfCAgMHgxMDAwMDAwMDsKKwl9IGVsc2UgeworCQlEQkcgKCJIYWxmIGR1cGxleFxuIik7CisJCXR4X2NvbmZpZyA9IDB4MTA4MDEwMDIgJiB+MHhDMDAwMDAwMDsKKwkJcnhfY29uZmlnID0gMHgwMDAwMDAyMCAmIH4weDEwMDAwMDAwOworCX0KKwlvdXRsICh0eF9jb25maWcsIG5wLT5pb2FkZHIgKyBUeENvbmZpZyk7CisJb3V0bCAocnhfY29uZmlnLCBucC0+aW9hZGRyICsgUnhDb25maWcpOworCisJREJHICgiVHggY29uZmlnIHJlZ2lzdGVyID0gJSMwOHggUnggY29uZmlnIHJlZ2lzdGVyID0gJSMwOHhcbiIsIAorICAgICAgICAgICAgICAgaW5sIChucC0+aW9hZGRyICsgVHhDb25maWcpLAorCSAgICAgICBpbmwgKG5wLT5pb2FkZHIgKyBSeENvbmZpZykpOworCisJLypTZXQgdGhlIEludGVycnVwdCBNYXNrIHJlZ2lzdGVyCisJICovCisJb3V0bCgoUnhPa3xSeEVycnxUeE9rfFR4RXJyKSxucC0+aW9hZGRyICsgSW50ck1hc2spOworCS8qc3RhcnQgdGhlIHJlY2VpdmVyIAorCSAqLworICAgICAgICBvdXRsIChSeE9uLCBucC0+aW9hZGRyICsgQ2hpcENtZCk7CisJCisJcmV0dXJuIDA7CisJCSAgICAgICAKK21lbW9yeV9hbGxvY19lcnI6CisKKwkvKiBGcmVlcyBhbnkgYWxsb2NhdGVkIGJ1ZmZlcnMgd2hlbiBtZW1vcnkKKwkgKiBmb3IgYWxsIGJ1ZmZlcnMgcmVxdWVzdGVkIGlzIG5vdCBhdmFpbGFibGUKKwkgKi8KKwlpID0gMDsKKwl3aGlsZSAobnAtPnJ4W2ldLmNtZHN0cyA9PSBSWF9CVUZfU0laRSkgeworCQlmcmVlX2lvYiAobnAtPmlvYnVmW2ldKTsKKwkJaSsrOworCX0KKwlyZXR1cm4gLUVOT01FTTsJCit9CisKKy8qKgorICogQ2xvc2UgTklDCisgKgorICogQHYgbmV0ZGV2CQlOZXQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIG5hdHNlbWlfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpIAoreworCXN0cnVjdCBuYXRzZW1pX3ByaXZhdGUgKm5wID0gbmV0ZGV2LT5wcml2OworCWludCBpOworCisJbmF0c2VtaV9yZXNldCAobmV0ZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQyA7IGkrKykgeworCQlmcmVlX2lvYiAobnAtPmlvYnVmW2ldKTsKKwl9Cit9CisKKy8qKiAKKyAqIFRyYW5zbWl0IHBhY2tldAorICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorICogQHYgaW9idWYJSS9PIGJ1ZmZlcgorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBuYXRzZW1pX3RyYW5zbWl0IChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZikKK3sKKwlzdHJ1Y3QgbmF0c2VtaV9wcml2YXRlICpucCA9IG5ldGRldi0+cHJpdjsKKworCWlmIChucC0+dHhbbnAtPnR4X2N1cl0uY21kc3RzICE9IDApIHsKKwkJREJHICgiVFggb3ZlcmZsb3dcbiIpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJLyogVXNlZCBieSBuZXRkZXZfdHhfY29tcGxldGUgKCkKKwkgKi8KKwlucC0+dHhfaW9idWZbbnAtPnR4X2N1cl0gPSBpb2J1ZjsKKworCS8qIFBhZCBhbmQgYWxpZ24gcGFja2V0IGhhcyBub3QgYmVlbiB1c2VkIGJlY2F1c2UgaXRzIG5vdCByZXF1aXJlZCAKKwkgKiBieSB0aGUgaGFyZHdhcmUuCisJICogCWlvYl9wYWQgKGlvYnVmLCBFVEhfWkxFTik7IAorCSAqIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgaXQsIGlmIHJlcXVpcmVkCisJICovCisKKwkvKiBBZGQgdGhlIHBhY2tldCB0byBUWCByaW5nCisJICovCisJbnAtPnR4W25wLT50eF9jdXJdLmJ1ZnB0ciA9IHZpcnRfdG9fYnVzIChpb2J1Zi0+ZGF0YSk7CisJbnAtPnR4W25wLT50eF9jdXJdLmNtZHN0cyA9IGlvYl9sZW4gKGlvYnVmKSB8IE9XTjsKKworCURCRyAoIlRYIGlkICVkIGF0ICUjMDhseCArICUjMDh6eFxuIiwgbnAtPnR4X2N1ciwKKwkgICAgIHZpcnRfdG9fYnVzICgmaW9idWYtPmRhdGEpLCBpb2JfbGVuIChpb2J1ZikpOworCisJLyogaW5jcmVtZW50IHRoZSBjaXJjdWxhciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBidWZmZXIgbG9jYXRpb24KKwkgKi8KKwlucC0+dHhfY3VyID0gKG5wLT50eF9jdXIgKyAxKSAlIFRYX1JJTkdfU0laRTsKKworCS8qc3RhcnQgdGhlIHRyYW5zbWl0dGVyIAorCSAqLworICAgICAgICBvdXRsIChUeE9uLCBucC0+aW9hZGRyICsgQ2hpcENtZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqIAorICogUG9sbCBmb3IgcmVjZWl2ZWQgcGFja2V0cworICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorICovCitzdGF0aWMgdm9pZCBuYXRzZW1pX3BvbGwgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5hdHNlbWlfcHJpdmF0ZSAqbnAgPSBuZXRkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IHR4X3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgcnhfc3RhdHVzOworCXVuc2lnbmVkIGludCBpbnRyX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgcnhfbGVuOworCXN0cnVjdCBpb19idWZmZXIgKnJ4X2lvYjsKKwlpbnQgaTsKKwkKKwkvKiByZWFkIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIKKwkgKi8KKwlpbnRyX3N0YXR1cyA9IGlubCAobnAtPmlvYWRkciArIEludHJTdGF0dXMpOworCisJaWYgKCFpbnRyX3N0YXR1cykKKwkJZ290byBlbmQ7CisKKyAgICAgICAgREJHICgibmF0c2VtaV9wb2xsOiBpbnRyX3N0YXR1cyA9ICUjMDh4XG4iLCBpbnRyX3N0YXR1cyk7CisKKwkvKiBDaGVjayBzdGF0dXMgb2YgdHJhbnNtaXR0ZWQgcGFja2V0cworCSAqLworCWkgPSBucC0+dHhfZGlydHk7CisJd2hpbGUgKGkgIT0gbnAtPnR4X2N1cikgeworCSAgCXR4X3N0YXR1cyA9IG5wLT50eFtucC0+dHhfZGlydHldLmNtZHN0czsKKworCQlEQkcgKCJ0eF9kaXJ0eSA9ICVkIHR4X2N1cj0lZCB0eF9zdGF0dXM9JSMwOHhcbiIsCisJCSAgICAgbnAtPnR4X2RpcnR5LCBucC0+dHhfY3VyLCB0eF9zdGF0dXMpOworCQkKKwkJaWYgKHR4X3N0YXR1cyAmIE9XTikgCisJCQlicmVhazsKKworCQlpZiAoISAodHhfc3RhdHVzICYgRGVzY1BrdE9LKSkgeworCQkJbmV0ZGV2X3R4X2NvbXBsZXRlX2VyciAobmV0ZGV2LG5wLT50eF9pb2J1ZltucC0+dHhfZGlydHldLC1FSU5WQUwpOworCQkJREJHICgiRXJyb3IgdHJhbnNtaXR0aW5nIHBhY2tldCwgdHhfc3RhdHVzOiAlIzA4eFxuIiwKKwkJCSAgICAgdHhfc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCW5ldGRldl90eF9jb21wbGV0ZSAobmV0ZGV2LCBucC0+dHhfaW9idWZbbnAtPnR4X2RpcnR5XSk7CisJCQlEQkcgKCJTdWNjZXNzIHRyYW5zbWl0dGluZyBwYWNrZXRcbiIpOworCQl9CisKKwkJbnAtPnR4W25wLT50eF9kaXJ0eV0uY21kc3RzID0gMDsKKwkJbnAtPnR4X2RpcnR5ID0gKG5wLT50eF9kaXJ0eSArIDEpICUgVFhfUklOR19TSVpFOworCQlpID0gKGkgKyAxKSAlIFRYX1JJTkdfU0laRTsKKwl9CisJCisJLyogUHJvY2VzcyByZWNlaXZlZCBwYWNrZXRzIAorCSAqLworCXJ4X3N0YXR1cyA9ICh1bnNpZ25lZCBpbnQpIG5wLT5yeFtucC0+cnhfY3VyXS5jbWRzdHM7IAorCXdoaWxlICgocnhfc3RhdHVzICYgT1dOKSkgeworCQlyeF9sZW4gPSAocnhfc3RhdHVzICYgRFNJWkUpIC0gQ1JDX1NJWkU7CisKKyAgICAgICAgICAgICAgICBEQkcgKCJSZWNlaXZlZCBwYWNrZXQsIHJ4X2N1cnIgPSAlZCwgcnhfc3RhdHVzID0gJSMwOHgsIHJ4X2xlbiA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbnAtPnJ4X2N1ciwgcnhfc3RhdHVzLCByeF9sZW4pOworICAgICAgICAgICAgICAgIAorCQlpZiAoKHJ4X3N0YXR1cyAmIChEZXNjTW9yZSB8IERlc2NQa3RPSyB8IFJ4VG9vTG9uZykpICE9IERlc2NQa3RPSykgeworCQkJbmV0ZGV2X3J4X2VyciAobmV0ZGV2LCBOVUxMLCAtRUlOVkFMKTsKKworCQkJREJHICgibmF0c2VtaV9wb2xsOiBDb3JydXB0ZWQgcGFja2V0IHJlY2VpdmVkISIKKwkJCSAgICAgIiBTdGF0dXMgPSAlIzA4eFxuIiwKKwkJCSAgICAgIG5wLT5yeFtucC0+cnhfY3VyXS5jbWRzdHMpOworCisJCX0gZWxzZSAJeworCisKKwkJCS8qIElmIHVuYWJsZSBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBwYWNrZXQsCisJCQkgKiAgdHJ5IGFnYWluIG5leHQgcG9sbAorCQkJICovCisJCQlyeF9pb2IgPSBhbGxvY19pb2IgKHJ4X2xlbik7CisJCQlpZiAoISByeF9pb2IpIAorCQkJCWdvdG8gZW5kOworCQkJbWVtY3B5IChpb2JfcHV0IChyeF9pb2IsIHJ4X2xlbiksIAorCQkJCW5wLT5pb2J1ZltucC0+cnhfY3VyXS0+ZGF0YSwgcnhfbGVuKTsKKwkJCS8qIEFkZCB0aGlzIHBhY2tldCB0byB0aGUgcmVjZWl2ZSBxdWV1ZS4gCisJCQkgKi8KKwkJCW5ldGRldl9yeCAobmV0ZGV2LCByeF9pb2IpOworCQl9CisJCW5wLT5yeFtucC0+cnhfY3VyXS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKKwkJbnAtPnJ4X2N1ciA9IChucC0+cnhfY3VyICsgMSkgJSBOVU1fUlhfREVTQzsKKwkJcnhfc3RhdHVzID0gbnAtPnJ4W25wLT5yeF9jdXJdLmNtZHN0czsgCisJfQorZW5kOgorCS8qIHJlLWVuYWJsZSB0aGUgcG90ZW50aWFsbHkgaWRsZSByZWNlaXZlIHN0YXRlIG1hY2hpbmUgCisJICovCisJb3V0bCAoUnhPbiwgbnAtPmlvYWRkciArIENoaXBDbWQpOwkKK30JCQkJCisKKy8qKgorICogRW5hYmxlL2Rpc2FibGUgaW50ZXJydXB0cworICoKKyAqIEB2IG5ldGRldiAgICBOZXR3b3JrIGRldmljZQorICogQHYgZW5hYmxlICAgIE5vbi16ZXJvIGZvciBlbmFibGUsIHplcm8gZm9yIGRpc2FibGUKKyAqLworc3RhdGljIHZvaWQgbmF0c2VtaV9pcnEgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBlbmFibGUpCit7CisgICAgICAgIHN0cnVjdCBuYXRzZW1pX3ByaXZhdGUgKm5wID0gbmV0ZGV2LT5wcml2OworCisJb3V0bCAoKGVuYWJsZSA/IChSeE9rIHwgUnhFcnIgfCBUeE9rfFR4RXJyKSA6IDApLAorCSAgICAgIG5wLT5pb2FkZHIgKyBJbnRyTWFzayk7IAorCW91dGwgKChlbmFibGUgPyAxIDogMCksIG5wLT5pb2FkZHIgKyBJbnRyRW5hYmxlKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5hdHNlbWlfbmljc1tdID0geworCVBDSV9ST00oMHgxMDBiLCAweDAwMjAsICJkcDgzODE1IiwgIkRQODM4MTUiLCAwKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIG5hdHNlbWlfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzID0gbmF0c2VtaV9uaWNzLAorCS5pZF9jb3VudCA9IChzaXplb2YgKG5hdHNlbWlfbmljcykgLyBzaXplb2YgKG5hdHNlbWlfbmljc1swXSkpLAorCS5wcm9iZSA9IG5hdHNlbWlfcHJvYmUsCisJLnJlbW92ZSA9IG5hdHNlbWlfcmVtb3ZlLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L25hdHNlbWkuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L25hdHNlbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTgyN2JhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbmF0c2VtaS5oCkBAIC0wLDAgKzEsMjMyIEBACitGSUxFX0xJQ0VOQ0UgKCBHUExfQU5ZICk7CisKKyNkZWZpbmUgTkFUU0VNSV9IV19USU1FT1VUIDQwMAorCisjZGVmaW5lIFRYX1JJTkdfU0laRSA0CisjZGVmaW5lIE5VTV9SWF9ERVNDICA0CisjZGVmaW5lIFJYX0JVRl9TSVpFIDE1MzYKKyNkZWZpbmUgT1dOICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgRFNJWkUgICAgIDB4MDAwMDBGRkYKKyNkZWZpbmUgQ1JDX1NJWkUgIDQKKworc3RydWN0IG5hdHNlbWlfdHggeworCXVpbnQzMl90IGxpbms7CisJdWludDMyX3QgY21kc3RzOworCXVpbnQzMl90IGJ1ZnB0cjsKK307CisKK3N0cnVjdCBuYXRzZW1pX3J4IHsKKwl1aW50MzJfdCBsaW5rOworCXVpbnQzMl90IGNtZHN0czsKKwl1aW50MzJfdCBidWZwdHI7Cit9OworCitzdHJ1Y3QgbmF0c2VtaV9wcml2YXRlIHsKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHI7CisJdW5zaWduZWQgc2hvcnQgdHhfY3VyOworCXVuc2lnbmVkIHNob3J0IHR4X2RpcnR5OworCXVuc2lnbmVkIHNob3J0IHJ4X2N1cjsKKwlzdHJ1Y3QgbmF0c2VtaV90eCB0eFtUWF9SSU5HX1NJWkVdOworCXN0cnVjdCBuYXRzZW1pX3J4IHJ4W05VTV9SWF9ERVNDXTsKKworCS8qIG5lZWQgdG8gYWRkIGlvYnVmIGFzIHdlIGNhbm5vdCBmcmVlIGlvYnVmLT5kYXRhIGluIGNsb3NlIHdpdGhvdXQgdGhpcyAKKwkgKiBhbHRlcm5hdGl2ZWx5IHN1YnN0cmFjdGluZyBzaXplb2YoaGVhZCkgYW5kIHNpemVvZihsaXN0X2hlYWQpIGNhbiBhbHNvIAorCSAqIGdpdmUgdGhlIHNhbWUuCisJICovCisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWZbTlVNX1JYX0RFU0NdOworCisJLyogbmV0ZGV2X3R4X2NvbXBsZXRlIG5lZWRzIHBvaW50ZXIgdG8gdGhlIGlvYnVmIG9mIHRoZSBkYXRhIHNvIGFzIHRvIGZyZWUgCisJICogaXQgZnJvbSB0aGUgbWVtb3J5LgorCSAqLworCXN0cnVjdCBpb19idWZmZXIgKnR4X2lvYnVmW1RYX1JJTkdfU0laRV07CisJc3RydWN0IHNwaV9iaXRfYmFzaGVyIHNwaWJpdDsKKwlzdHJ1Y3Qgc3BpX2RldmljZSBlZXByb207CisJc3RydWN0IG52b19ibG9jayBudm87Cit9OworCisvKgorICogU3VwcG9ydCBmb3IgZmlicmUgY29ubmVjdGlvbnMgb24gQW03OUM4NzQ6CisgKiBUaGlzIHBoeSBuZWVkcyBhIHNwZWNpYWwgc2V0dXAgd2hlbiBjb25uZWN0ZWQgdG8gYSBmaWJyZSBjYWJsZS4KKyAqIGh0dHA6Ly93d3cuYW1kLmNvbS9maWxlcy9jb25uZWN0aXZpdHlzb2x1dGlvbnMvbmV0d29ya2luZy9hcmNoaXZlZG5ldHdvcmtpbmcvMjIyMzUucGRmCisgKi8KKyNkZWZpbmUgUEhZSURfQU03OUM4NzQJMHgwMDIyNTYxYgorCitlbnVtIHsKKwlNSUlfTUNUUkwJPSAweDE1LAkJLyogbW9kZSBjb250cm9sIHJlZ2lzdGVyICovCisJTUlJX0ZYX1NFTAk9IDB4MDAwMSwJLyogMTAwQkFTRS1GWCAoZmliZXIpICovCisJTUlJX0VOX1NDUk0JPSAweDAwMDQsCS8qIGVuYWJsZSBzY3JhbWJsZXIgKHRwKSAqLworfTsKKworCisKKy8qIHZhbHVlcyB3ZSBtaWdodCBmaW5kIGluIHRoZSBzaWxpY29uIHJldmlzaW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFNSUl9EUDgzODE1X0MJMHgwMzAyCisjZGVmaW5lIFNSUl9EUDgzODE1X0QJMHgwNDAzCisjZGVmaW5lIFNSUl9EUDgzODE2X0E0CTB4MDUwNAorI2RlZmluZSBTUlJfRFA4MzgxNl9BNQkweDA1MDUKKworLyogTkFUU0VNSTogT2Zmc2V0cyB0byB0aGUgZGV2aWNlIHJlZ2lzdGVycy4KKyAqIFVubGlrZSBzb2Z0d2FyZS1vbmx5IHN5c3RlbXMsIGRldmljZSBkcml2ZXJzIGludGVyYWN0IHdpdGggY29tcGxleCBoYXJkd2FyZS4KKyAqIEl0J3Mgbm90IHVzZWZ1bCB0byBkZWZpbmUgc3ltYm9saWMgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIGJpdCBpbiB0aGUKKyAqIGRldmljZS4KKyAqLworZW51bSByZWdpc3Rlcl9vZmZzZXRzIHsKKyAgICBDaGlwQ21kICAgICAgPSAweDAwLCAKKyAgICBDaGlwQ29uZmlnICAgPSAweDA0LCAKKyAgICBFRUN0cmwgICAgICAgPSAweDA4LCAKKyAgICBQQ0lCdXNDZmcgICAgPSAweDBDLAorICAgIEludHJTdGF0dXMgICA9IDB4MTAsIAorICAgIEludHJNYXNrICAgICA9IDB4MTQsIAorICAgIEludHJFbmFibGUgICA9IDB4MTgsCisgICAgVHhSaW5nUHRyICAgID0gMHgyMCwgCisgICAgVHhDb25maWcgICAgID0gMHgyNCwKKyAgICBSeFJpbmdQdHIgICAgPSAweDMwLAorICAgIFJ4Q29uZmlnICAgICA9IDB4MzQsIAorICAgIENsa1J1biAgICAgICA9IDB4M0MsCisgICAgV09MQ21kICAgICAgID0gMHg0MCwgCisgICAgUGF1c2VDbWQgICAgID0gMHg0NCwKKyAgICBSeEZpbHRlckFkZHIgPSAweDQ4LCAKKyAgICBSeEZpbHRlckRhdGEgPSAweDRDLAorICAgIEJvb3RSb21BZGRyICA9IDB4NTAsIAorICAgIEJvb3RSb21EYXRhICA9IDB4NTQsIAorICAgIFNpbGljb25SZXYgICA9IDB4NTgsIAorICAgIFN0YXRzQ3RybCAgICA9IDB4NUMsCisgICAgU3RhdHNEYXRhICAgID0gMHg2MCwgCisgICAgUnhQa3RFcnJzICAgID0gMHg2MCwgCisgICAgUnhNaXNzZWQgICAgID0gMHg2OCwgCisgICAgUnhDUkNFcnJzICAgID0gMHg2NCwKKyAgICBQQ0lQTSAgICAgICAgPSAweDQ0LAorICAgIFBoeVN0YXR1cyAgICA9IDB4QzAsIAorICAgIE1JbnRyQ3RybCAgICA9IDB4QzQsIAorICAgIE1JbnRyU3RhdHVzICA9IDB4QzgsCisKKyAgICAvKiBUaGVzZSBhcmUgZnJvbSB0aGUgc3BlYywgYXJvdW5kIHBhZ2UgNzguLi4gb24gYSBzZXBhcmF0ZSB0YWJsZS4gCisgICAgICovCisgICAgUEdTRUwgICAgICAgID0gMHhDQywgCisgICAgUE1EQ1NSICAgICAgID0gMHhFNCwgCisgICAgVFNUREFUICAgICAgID0gMHhGQywgCisgICAgRFNQQ0ZHICAgICAgID0gMHhGNCwgCisgICAgU0RDRkcgICAgICAgID0gMHg4QywKKyAgICBCYXNpY0NvbnRyb2wgPSAweDgwLAkKKyAgICBCYXNpY1N0YXR1cyAgPSAweDg0CisJICAgIAorfTsKKworLyogdGhlIHZhbHVlcyBmb3IgdGhlICdtYWdpYycgcmVnaXN0ZXJzIGFib3ZlIChQR1NFTD0xKSAqLworI2RlZmluZSBQTURDU1JfVkFMCTB4MTg5YwkvKiBlbmFibGUgcHJlZmVycmVkIGFkYXB0YXRpb24gY2lyY3VpdHJ5ICovCisjZGVmaW5lIFRTVERBVF9WQUwJMHgwCisjZGVmaW5lIERTUENGR19WQUwJMHg1MDQwCisjZGVmaW5lIFNEQ0ZHX1ZBTAkweDAwOGMJLyogc2V0IHZvbHRhZ2UgdGhyZXNob2xkcyBmb3IgU2lnbmFsIERldGVjdCAqLworI2RlZmluZSBEU1BDRkdfTE9DSwkweDIwCS8qIGNvZWZmaWNpZW50IGxvY2sgYml0IGluIERTUENGRyAqLworI2RlZmluZSBEU1BDRkdfQ09FRgkweDEwMDAJLyogc2VlIGNvZWZmaWNpZW50IChpbiBUU1REQVQpIGJpdCBpbiBEU1BDRkcgKi8KKyNkZWZpbmUgVFNUREFUX0ZJWEVECTB4ZTgJLyogbWFnaWMgbnVtYmVyIGZvciBiYWQgY29lZmZpY2llbnRzICovCisKKy8qIEJpdCBpbiBDaGlwQ21kLgorICovCitlbnVtIENoaXBDbWRCaXRzIHsKKyAgICBDaGlwUmVzZXQgPSAweDEwMCwgCisgICAgUnhSZXNldCAgID0gMHgyMCwgCisgICAgVHhSZXNldCAgID0gMHgxMCwgCisgICAgUnhPZmYgICAgID0gMHgwOCwgCisgICAgUnhPbiAgICAgID0gMHgwNCwKKyAgICBUeE9mZiAgICAgPSAweDAyLCAKKyAgICBUeE9uICAgICAgPSAweDAxCit9OworCitlbnVtIENoaXBDb25maWdfYml0cyB7CisJQ2ZnUGh5RGlzCQk9IDB4MjAwLAorCUNmZ1BoeVJzdAkJPSAweDQwMCwKKwlDZmdFeHRQaHkJCT0gMHgxMDAwLAorCUNmZ0FuZWdFbmFibGUJCT0gMHgyMDAwLAorCUNmZ0FuZWcxMDAJCT0gMHg0MDAwLAorCUNmZ0FuZWdGdWxsCQk9IDB4ODAwMCwKKwlDZmdBbmVnRG9uZQkJPSAweDgwMDAwMDAsCisJQ2ZnRnVsbER1cGxleAkJPSAweDIwMDAwMDAwLAorCUNmZ1NwZWVkMTAwCQk9IDB4NDAwMDAwMDAsCisJQ2ZnTGluawkJCT0gMHg4MDAwMDAwMCwKK307CisKKworLyogQml0cyBpbiB0aGUgUnhNb2RlIHJlZ2lzdGVyLgorICovCitlbnVtIHJ4X21vZGVfYml0cyB7CisgICAgQWNjZXB0RXJyICAgICAgICAgID0gMHgyMCwKKyAgICBBY2NlcHRSdW50ICAgICAgICAgPSAweDEwLAorICAgIEFjY2VwdEJyb2FkY2FzdCAgICA9IDB4QzAwMDAwMDAsCisgICAgQWNjZXB0TXVsdGljYXN0ICAgID0gMHgwMDIwMDAwMCwgCisgICAgQWNjZXB0QWxsTXVsdGljYXN0ID0gMHgyMDAwMDAwMCwKKyAgICBBY2NlcHRBbGxQaHlzICAgICAgPSAweDEwMDAwMDAwLCAKKyAgICBBY2NlcHRNeVBoeXMgICAgICAgPSAweDA4MDAwMDAwLAorICAgIFJ4RmlsdGVyRW5hYmxlICAgICA9IDB4ODAwMDAwMDAKK307CisKKy8qIEJpdHMgaW4gbmV0d29ya19kZXNjLnN0YXR1cworICovCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeworICAgIERlc2NPd24gICA9IDB4ODAwMDAwMDAsIAorICAgIERlc2NNb3JlICA9IDB4NDAwMDAwMDAsIAorICAgIERlc2NJbnRyICA9IDB4MjAwMDAwMDAsCisgICAgRGVzY05vQ1JDID0gMHgxMDAwMDAwMCwKKyAgICBEZXNjUGt0T0sgPSAweDA4MDAwMDAwLCAKKyAgICBSeFRvb0xvbmcgPSAweDAwNDAwMDAwCit9OworCisvKkJpdHMgaW4gSW50ZXJydXB0IE1hc2sgcmVnaXN0ZXIKKyAqLworZW51bSBJbnRyX21hc2tfcmVnaXN0ZXJfYml0cyB7CisgICAgUnhPayAgICAgICA9IDB4MDAxLAorICAgIFJ4RXJyICAgICAgPSAweDAwNCwKKyAgICBUeE9rICAgICAgID0gMHgwNDAsCisgICAgVHhFcnIgICAgICA9IDB4MTAwIAorfTsJCisKK2VudW0gTUludHJDdHJsX2JpdHMgeworICBNSUNSSW50RW4gICAgICAgICAgICAgICA9IDB4MiwKK307CisKKy8qIENGRyBiaXRzIFsxMzoxNl0gWzE4OjIzXSAqLworI2RlZmluZSBDRkdfUkVTRVRfU0FWRSAweGZkZTAwMAorLyogV0NTUiBiaXRzIFswOjRdIFs5OjEwXSAqLworI2RlZmluZSBXQ1NSX1JFU0VUX1NBVkUgMHg2MWYKKy8qIFJGQ1IgYml0cyBbMjBdIFsyMl0gWzI3OjMxXSAqLworI2RlZmluZSBSRkNSX1JFU0VUX1NBVkUgMHhmODUwMDAwMDsKKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuCisgICBObyBleHRyYSBkZWxheSBpcyBuZWVkZWQgd2l0aCAzM01oeiBQQ0ksIGJ1dCBmdXR1cmUgNjZNaHogYWNjZXNzIG1heSBuZWVkCisgICBhIGRlbGF5LiAqLworI2RlZmluZSBlZXByb21fZGVsYXkoZWVfYWRkcikgICBpbmwoZWVfYWRkcikKKworZW51bSBFRVBST01fQ3RybF9CaXRzIHsKKwlFRV9TaGlmdENsayAgID0gMHgwNCwKKwlFRV9EYXRhSW4gICAgID0gMHgwMSwKKwlFRV9DaGlwU2VsZWN0ID0gMHgwOCwKKwlFRV9EYXRhT3V0ICAgID0gMHgwMgorfTsKKworI2RlZmluZSBFRV9Xcml0ZTAgKEVFX0NoaXBTZWxlY3QpCisjZGVmaW5lIEVFX1dyaXRlMSAoRUVfQ2hpcFNlbGVjdCB8IEVFX0RhdGFJbikKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCitlbnVtIEVFUFJPTV9DbWRzIHsKKyAgRUVfV3JpdGVDbWQ9KDUgPDwgNiksIEVFX1JlYWRDbWQ9KDYgPDwgNiksIEVFX0VyYXNlQ21kPSg3IDw8IDYpLAorfTsKKworLyogIEVFUFJPTSBhY2Nlc3MgLCB2YWx1ZXMgYXJlIGRldmljZXMgc3BlY2lmaWMKKyAqLworI2RlZmluZSBFRV9DUwkJMHgwOAkvKiBFRVBST00gY2hpcCBzZWxlY3QgKi8KKyNkZWZpbmUgRUVfU0sJCTB4MDQJLyogRUVQUk9NIHNoaWZ0IGNsb2NrICovCisjZGVmaW5lIEVFX0RJCQkweDAxCS8qIERhdGEgaW4gKi8KKyNkZWZpbmUgRUVfRE8JCTB4MDIJLyogRGF0YSBvdXQgKi8KKworLyogT2Zmc2V0cyB3aXRoaW4gRUVQUk9NICh0aGVzZSBhcmUgd29yZCBvZmZzZXRzKQorICovCisjZGVmaW5lIEVFX01BQyA3CisjZGVmaW5lIEVFX1JFRyAgRUVDdHJsCisKK3N0YXRpYyBjb25zdCB1aW50OF90IG5hdHNlbWlfZWVfYml0c1tdID0geworCVtTUElfQklUX1NDTEtdCT0gRUVfU0ssCisJW1NQSV9CSVRfTU9TSV0JPSBFRV9ESSwKKwlbU1BJX0JJVF9NSVNPXQk9IEVFX0RPLAorCVtTUElfQklUX1NTKDApXQk9IEVFX0NTLAorfTsKKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbmUuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzNDdkZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L25lLmMKQEAgLTAsMCArMSw2IEBACisvKiBJU0EgSS9PIG1hcHBlZCBOUzgzOTAtYmFzZWQgY2FyZHMsIGluY2x1ZGluZyBORTIwMDAgKi8KKyNpZiAwIC8qIEN1cnJlbnRseSBicm9rZW4hICovCisjZGVmaW5lIElOQ0xVREVfTkUgMQorI2RlZmluZSBORV9TQ0FOIDB4MzAwLDB4MjgwLDB4MzIwLDB4MzQwLDB4MzgwCisjaW5jbHVkZSAibnM4MzkwLmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L25lMmtfaXNhLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9uZTJrX2lzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwM2QxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9uZTJrX2lzYS5jCkBAIC0wLDAgKzEsMzc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBFVEhFUkJPT1QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorCisgQXV0aG9yOiBNYXJ0aW4gUmVudGVycworIERhdGU6IE1heS85NAorCisgVGhpcyBjb2RlIGlzIGJhc2VkIGhlYXZpbHkgb24gRGF2aWQgR3JlZW5tYW4ncyBpZl9lZC5jIGRyaXZlcgorCisgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTQsIERhdmlkIEdyZWVubWFuLCBNYXJ0aW4gUmVudGVycy4KKyBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkLCBtb2RpZmllZCwgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIHNvbGQsIGluCisgYm90aCBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgdGhlc2UKKyB0ZXJtcyBhcmUgcmV0YWluZWQuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYXJlIHRoZSBhdXRob3JzIHJlc3BvbnNpYmxlIGZvcgorIHRoZSBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgdGhpcyBzb2Z0d2FyZSwgbm9yIGRvIHRoZSBhdXRob3JzIGFzc3VtZSBhbnkKKyByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyBpbmN1cnJlZCB3aXRoIGl0cyB1c2UuCisKKyBNdWx0aWNhc3Qgc3VwcG9ydCBhZGRlZCBieSBUaW1vdGh5IExlZ2dlICh0aW1sZWdnZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpIDA5LzI4LzIwMDMKKyBSZWxvY2F0aW9uIHN1cHBvcnQgYWRkZWQgYnkgS2VuIFlhcCAoa2VuX3lhcEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpIDI4LzEyLzAyCisgQ2FyZCBEZXRlY3Qgc3VwcG9ydCBhZGFwdGVkIGZyb20gdGhlIGVDb3MgZHJpdmVyIChDaHJpc3RpYW4gUGxlc3NsIDxjcGxlc3NsQGVlLmV0aHouY2g+KQorIEV4dHJhY3RlZCBmcm9tIG5zODM5MC5jIGFuZCBhZGFwdGVkIGJ5IFBhbnRlbGlzIEtvdWtvdXNvdWxhcyA8cGt0b3NzQGdtYWlsLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggQlNEMiApOworCisjaW5jbHVkZSAibnM4MzkwLmgiCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaXNhLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2RlZmluZSBBU0lDX1BJTyBORV9EQVRBCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGV0aF92ZW5kb3IsIGV0aF9mbGFnczsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBldGhfbmljX2Jhc2UsIGV0aF9hc2ljX2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgY2hhciBldGhfbWVtc2l6ZSwgZXRoX3J4X3N0YXJ0LCBldGhfdHhfc3RhcnQ7CitzdGF0aWMgQWRkcmVzcyBldGhfYm1lbSwgZXRoX3JtZW07CitzdGF0aWMgdW5zaWduZWQgY2hhciBldGhfZHJhaW5fcmVjZWl2ZXI7CisKK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgbmVfb3BlcmF0aW9uczsKK3N0YXRpYyB2b2lkIG5lX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGlzYV9kZXZpY2UgKmlzYSk7CisKK3N0YXRpYyBpc2FfcHJvYmVfYWRkcl90IG5lX3Byb2JlX2FkZHJzW10gPSB7IDB4MzAwLCAweDI4MCwgMHgzMjAsIDB4MzQwLCAweDM4MCwgMHgyMjAsIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEVUSF9QSU9fUkVBRCAtIFJlYWQgYSBmcmFtZSB2aWEgUHJvZ3JhbW1lZCBJL08KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGV0aF9waW9fcmVhZCh1bnNpZ25lZCBpbnQgc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGludCBjbnQpIHsKKwlvdXRiKEQ4MzkwX0NPTU1BTkRfUkQyIHwgRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX0NPTU1BTkQpOworCW91dGIoY250LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SQkNSMCk7CisJb3V0YihjbnQgPj4gOCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUkJDUjEpOworCW91dGIoc3JjLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SU0FSMCk7CisJb3V0YihzcmMgPj4gOCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUlNBUjEpOworCW91dGIoRDgzOTBfQ09NTUFORF9SRDAgfCBEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpCisJCWNudCA9IChjbnQgKyAxKSA+PiAxOworCisJd2hpbGUgKGNudC0tKSB7CisJCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSB7CisJCQkqKCh1bnNpZ25lZCBzaG9ydCAqKSBkc3QpID0gaW53KGV0aF9hc2ljX2Jhc2UgKyBBU0lDX1BJTyk7CisJCQlkc3QgKz0gMjsKKwkJfSBlbHNlCisJCQkqKGRzdCsrKSA9IGluYihldGhfYXNpY19iYXNlICsgQVNJQ19QSU8pOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRVRIX1BJT19XUklURSAtIFdyaXRlIGEgZnJhbWUgdmlhIFByb2dyYW1tZWQgSS9PCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhfcGlvX3dyaXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgaW50IGRzdCwKKwkJdW5zaWduZWQgaW50IGNudCkgeworCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgfCBEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0YihEODM5MF9JU1JfUkRDLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9JU1IpOworCW91dGIoY250LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SQkNSMCk7CisJb3V0YihjbnQgPj4gOCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUkJDUjEpOworCW91dGIoZHN0LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SU0FSMCk7CisJb3V0Yihkc3QgPj4gOCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUlNBUjEpOworCW91dGIoRDgzOTBfQ09NTUFORF9SRDEgfCBEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpCisJCWNudCA9IChjbnQgKyAxKSA+PiAxOworCisJd2hpbGUgKGNudC0tKSB7CisKKwkJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKKwkJCW91dHcoKigodW5zaWduZWQgc2hvcnQgKikgc3JjKSwgZXRoX2FzaWNfYmFzZSArIEFTSUNfUElPKTsKKwkJCXNyYyArPSAyOworCQl9IGVsc2UKKwkJCW91dGIoKihzcmMrKyksIGV0aF9hc2ljX2Jhc2UgKyBBU0lDX1BJTyk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBlbmFibGVfbXVsdGljYXN0IC0gRW5hYmxlIE11bHRpY2FzdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZW5hYmxlX211bHRpY2FzdCh1bnNpZ25lZCBzaG9ydCBldGhfbmljX2Jhc2UpIHsKKwl1bnNpZ25lZCBjaGFyIG1jZmlsdGVyWzhdOworCWludCBpOworCisJbWVtc2V0KG1jZmlsdGVyLCAweEZGLCA4KTsKKwlvdXRiKDQsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1JDUik7CisJb3V0YihEODM5MF9DT01NQU5EX1JEMiArIEQ4MzkwX0NPTU1BTkRfUFMxLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9DT01NQU5EKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCW91dGIobWNmaWx0ZXJbaV0sIGV0aF9uaWNfYmFzZSArIDggKyBpKTsKKwkJaWYgKGluYihldGhfbmljX2Jhc2UgKyA4ICsgaSkgIT0gbWNmaWx0ZXJbaV0pCisJCQlEQkcoIkVycm9yIFNNQyA4M0M2OTAgTXVsdGljYXN0IGZpbHRlciByZWFkL3dyaXRlIG1pc2hhcCAlZFxuIiwKKwkJCQkJaSk7CisJfQorCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgKyBEODM5MF9DT01NQU5EX1BTMCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0Yig0IHwgMHgwOCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUkNSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgTkVfUFJPQkUxIC0gTG9vayBmb3IgYW4gYWRhcHRlciBvbiB0aGUgSVNBIGJ1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuZV9wcm9iZTEoaXNhX3Byb2JlX2FkZHJfdCBpb2FkZHIpIHsKKwkvL0Zyb20gdGhlIGVDb3MgZHJpdmVyCisJdW5zaWduZWQgaW50IHJlZ2Q7CisJdW5zaWduZWQgaW50IHN0YXRlOworCisJc3RhdGUgPSBpbmIoaW9hZGRyKTsKKwlvdXRiKGlvYWRkciwgRDgzOTBfQ09NTUFORF9SRDIgfCBEODM5MF9DT01NQU5EX1BTMSB8IEQ4MzkwX0NPTU1BTkRfU1RQKTsKKwlyZWdkID0gaW5iKGlvYWRkciArIEQ4MzkwX1AwX1RDUik7CisKKwlpZiAoaW5iKGlvYWRkciArIEQ4MzkwX1AwX1RDUikpIHsKKwkJb3V0Yihpb2FkZHIsIHN0YXRlKTsKKwkJb3V0Yihpb2FkZHIgKyAweDBkLCByZWdkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIE5FX1BST0JFIC0gSW5pdGlhbGl6ZSBhbiBhZGFwdGVyID8/PworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuZV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBpc2FfZGV2aWNlICppc2EpIHsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgY2hhciByb21kYXRhWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHRlc3RidWZbMzJdOworCisJZXRoX3ZlbmRvciA9IFZFTkRPUl9OT05FOworCWV0aF9kcmFpbl9yZWNlaXZlciA9IDA7CisKKwluaWMtPmlycW5vID0gMDsKKwluaWMtPmlvYWRkciA9IGlzYS0+aW9hZGRyOworCWV0aF9uaWNfYmFzZSA9IGlzYS0+aW9hZGRyOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSBTZWFyY2ggZm9yIE5FMTAwMC8yMDAwIGlmIG5vIFdEL1NNQyBvciAzY29tIGNhcmRzCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoZXRoX3ZlbmRvciA9PSBWRU5ET1JfTk9ORSkgeworCisJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRlc3RbXSA9ICJORSowMDAgbWVtb3J5IjsKKworCQlldGhfYm1lbSA9IDA7IC8qIE5vIHNoYXJlZCBtZW1vcnkgKi8KKworCQlldGhfZmxhZ3MgPSBGTEFHX1BJTzsKKwkJZXRoX2FzaWNfYmFzZSA9IGV0aF9uaWNfYmFzZSArIE5FX0FTSUNfT0ZGU0VUOworCQlldGhfbWVtc2l6ZSA9IE1FTV8xNjM4NDsKKwkJZXRoX3R4X3N0YXJ0ID0gMzI7CisJCWV0aF9yeF9zdGFydCA9IDMyICsgRDgzOTBfVFhCVUZfU0laRTsKKwkJYyA9IGluYihldGhfYXNpY19iYXNlICsgTkVfUkVTRVQpOworCQlvdXRiKGMsIGV0aF9hc2ljX2Jhc2UgKyBORV9SRVNFVCk7CisJCSh2b2lkKSBpbmIoMHg4NCk7CisJCW91dGIoRDgzOTBfQ09NTUFORF9TVFAgfCBEODM5MF9DT01NQU5EX1JEMiwgZXRoX25pY19iYXNlCisJCQkJKyBEODM5MF9QMF9DT01NQU5EKTsKKwkJb3V0YihEODM5MF9SQ1JfTU9OLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SQ1IpOworCQlvdXRiKEQ4MzkwX0RDUl9GVDEgfCBEODM5MF9EQ1JfTFMsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX0RDUik7CisJCW91dGIoTUVNXzgxOTIsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1BTVEFSVCk7CisJCW91dGIoTUVNXzE2Mzg0LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9QU1RPUCk7CisJCWV0aF9waW9fd3JpdGUoKHVuc2lnbmVkIGNoYXIgKikgdGVzdCwgODE5Miwgc2l6ZW9mKHRlc3QpKTsKKwkJZXRoX3Bpb19yZWFkKDgxOTIsIHRlc3RidWYsIHNpemVvZih0ZXN0KSk7CisJCWlmICghbWVtY21wKHRlc3QsIHRlc3RidWYsIHNpemVvZih0ZXN0KSkpCisJCQlnb3RvIG91dDsKKwkJZXRoX2ZsYWdzIHw9IEZMQUdfMTZCSVQ7CisJCWV0aF9tZW1zaXplID0gTUVNXzMyNzY4OworCQlldGhfdHhfc3RhcnQgPSA2NDsKKwkJZXRoX3J4X3N0YXJ0ID0gNjQgKyBEODM5MF9UWEJVRl9TSVpFOworCQlvdXRiKEQ4MzkwX0RDUl9XVFMgfCBEODM5MF9EQ1JfRlQxIHwgRDgzOTBfRENSX0xTLCBldGhfbmljX2Jhc2UKKwkJCQkrIEQ4MzkwX1AwX0RDUik7CisJCW91dGIoTUVNXzE2Mzg0LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9QU1RBUlQpOworCQlvdXRiKE1FTV8zMjc2OCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUFNUT1ApOworCQlldGhfcGlvX3dyaXRlKCh1bnNpZ25lZCBjaGFyICopIHRlc3QsIDE2Mzg0LCBzaXplb2YodGVzdCkpOworCQlldGhfcGlvX3JlYWQoMTYzODQsIHRlc3RidWYsIHNpemVvZih0ZXN0KSk7CisJCWlmICghbWVtY21wKHRlc3RidWYsIHRlc3QsIHNpemVvZih0ZXN0KSkpCisJCQlnb3RvIG91dDsKKworCitvdXQ6CisJCWlmIChldGhfbmljX2Jhc2UgPT0gMCkKKwkJCXJldHVybiAoMCk7CisJCWlmIChldGhfbmljX2Jhc2UgPiBJU0FfTUFYX0FERFIpIC8qIFBDSSBwcm9iYWJseSAqLworCQkJZXRoX2ZsYWdzIHw9IEZMQUdfMTZCSVQ7CisJCWV0aF92ZW5kb3IgPSBWRU5ET1JfTk9WRUxMOworCQlldGhfcGlvX3JlYWQoMCwgcm9tZGF0YSwgc2l6ZW9mKHJvbWRhdGEpKTsKKwkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJCW5pYy0+bm9kZV9hZGRyW2ldID0gcm9tZGF0YVtpICsgKChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSA/IGkgOiAwKV07CisJCX0KKwkJbmljLT5pb2FkZHIgPSBldGhfbmljX2Jhc2U7CisJCURCRygiXG5ORSVjMDAwIGJhc2UgJTQuNHgsIE1BQyBBZGRyICVzXG4iLAorCQkJCShldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSA/ICcyJyA6ICcxJywgZXRoX25pY19iYXNlLCBldGhfbnRvYSgKKwkJCQkJCW5pYy0+bm9kZV9hZGRyKSk7CisJfQorCisJaWYgKGV0aF92ZW5kb3IgPT0gVkVORE9SX05PTkUpCisJCXJldHVybiAoMCk7CisKKwlpZiAoZXRoX3ZlbmRvciAhPSBWRU5ET1JfM0NPTSkKKwkJZXRoX3JtZW0gPSBldGhfYm1lbTsKKworCW5lX3Jlc2V0KG5pYywgaXNhKTsKKwluaWMtPm5pY19vcCA9ICZuZV9vcGVyYXRpb25zOworCXJldHVybiAxOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIE5FX0RJU0FCTEUgLSBUdXJuIG9mZiBhZGFwdGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuZV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGlzYV9kZXZpY2UgKmlzYSkgeworCW5lX3Jlc2V0KG5pYywgaXNhKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBORV9SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG5lX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGlzYV9kZXZpY2UgKmlzYSBfX3VudXNlZCkKK3sKKwlpbnQgaTsKKworCWV0aF9kcmFpbl9yZWNlaXZlciA9IDA7CisJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8IEQ4MzkwX0NPTU1BTkRfUkQyIHwKKwkJCUQ4MzkwX0NPTU1BTkRfU1RQLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpCisJb3V0YigweDQ5LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfRENSKTsKKwllbHNlCisJb3V0YigweDQ4LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfRENSKTsKKwlvdXRiKDAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9SQkNSMCk7CisJb3V0YigwLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkJDUjEpOworCW91dGIoMHgyMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JDUik7IC8qIG1vbml0b3IgbW9kZSAqLworCW91dGIoMiwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RDUik7CisJb3V0YihldGhfdHhfc3RhcnQsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UUFNSKTsKKwlvdXRiKGV0aF9yeF9zdGFydCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1BTVEFSVCk7CisKKwlvdXRiKGV0aF9tZW1zaXplLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUFNUT1ApOworCW91dGIoZXRoX21lbXNpemUgLSAxLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQk9VTkQpOworCW91dGIoMHhGRiwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0lTUik7CisJb3V0YigwLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfSU1SKTsKKwlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMxIHwKKwkJCUQ4MzkwX0NPTU1BTkRfUkQyIHwgRDgzOTBfQ09NTUFORF9TVFAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKworCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspCisJb3V0YihuaWMtPm5vZGVfYWRkcltpXSwgZXRoX25pY19iYXNlK0Q4MzkwX1AxX1BBUjAraSk7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykKKwlvdXRiKDB4RkYsIGV0aF9uaWNfYmFzZStEODM5MF9QMV9NQVIwK2kpOworCW91dGIoZXRoX3J4X3N0YXJ0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDFfQ1VSUik7CisJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8CisJCQlEODM5MF9DT01NQU5EX1JEMiB8IEQ4MzkwX0NPTU1BTkRfU1RBLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0YigweEZGLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfSVNSKTsKKwlvdXRiKDAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UQ1IpOyAvKiB0cmFuc21pdHRlciBvbiAqLworCW91dGIoNCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JDUik7IC8qIGFsbG93IHJ4IGJyb2FkY2FzdCBmcmFtZXMgKi8KKworCWVuYWJsZV9tdWx0aWNhc3QoZXRoX25pY19iYXNlKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBORV9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuZV9wb2xsKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHJldHJpZXZlIF9fdW51c2VkKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGNoYXIgcnN0YXQsIGN1cnIsIG5leHQ7CisJdW5zaWduZWQgc2hvcnQgbGVuLCBmcmFnOworCXVuc2lnbmVkIHNob3J0IHBrdG9mZjsKKwl1bnNpZ25lZCBjaGFyICpwOworCXN0cnVjdCByaW5nYnVmZmVyIHBrdGhkcjsKKworCXJzdGF0ID0gaW5iKGV0aF9uaWNfYmFzZStEODM5MF9QMF9SU1IpOworCWlmICghKHJzdGF0ICYgRDgzOTBfUlNUQVRfUFJYKSkgcmV0dXJuKDApOworCW5leHQgPSBpbmIoZXRoX25pY19iYXNlK0Q4MzkwX1AwX0JPVU5EKSsxOworCWlmIChuZXh0ID49IGV0aF9tZW1zaXplKSBuZXh0ID0gZXRoX3J4X3N0YXJ0OworCW91dGIoRDgzOTBfQ09NTUFORF9QUzEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwljdXJyID0gaW5iKGV0aF9uaWNfYmFzZStEODM5MF9QMV9DVVJSKTsKKwlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJaWYgKGN1cnIgPj0gZXRoX21lbXNpemUpIGN1cnI9ZXRoX3J4X3N0YXJ0OworCWlmIChjdXJyID09IG5leHQpIHJldHVybigwKTsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJcGt0b2ZmID0gbmV4dCA8PCA4OworCWlmIChldGhfZmxhZ3MgJiBGTEFHX1BJTykKKwlldGhfcGlvX3JlYWQocGt0b2ZmLCAodW5zaWduZWQgY2hhciAqKSZwa3RoZHIsIDQpOworCWVsc2UKKwltZW1jcHkoJnBrdGhkciwgYnVzX3RvX3ZpcnQoZXRoX3JtZW0gKyBwa3RvZmYpLCA0KTsKKwlwa3RvZmYgKz0gc2l6ZW9mKHBrdGhkcik7CisJLyogaW5jb21pbmcgbGVuZ3RoIGluY2x1ZGVzIEZDUyBzbyBtdXN0IHN1YiA0ICovCisJbGVuID0gcGt0aGRyLmxlbiAtIDQ7CisJaWYgKChwa3RoZHIuc3RhdHVzICYgRDgzOTBfUlNUQVRfUFJYKSA9PSAwIHx8IGxlbiA8IEVUSF9aTEVOCisJCQl8fCBsZW4+IEVUSF9GUkFNRV9MRU4pIHsKKwkJREJHKCJCb2d1cyBwYWNrZXQsIGlnbm9yaW5nXG4iKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJZWxzZSB7CisJCXAgPSBuaWMtPnBhY2tldDsKKwkJbmljLT5wYWNrZXRsZW4gPSBsZW47IC8qIGF2YWlsYWJsZSB0byBjYWxsZXIgKi8KKwkJZnJhZyA9IChldGhfbWVtc2l6ZSA8PCA4KSAtIHBrdG9mZjsKKwkJaWYgKGxlbj4gZnJhZykgeyAvKiBXZSBoYXZlIGEgd3JhcC1hcm91bmQgKi8KKwkJCS8qIHJlYWQgZmlyc3QgcGFydCAqLworCQkJaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKQorCQkJZXRoX3Bpb19yZWFkKHBrdG9mZiwgcCwgZnJhZyk7CisJCQllbHNlCisJCQltZW1jcHkocCwgYnVzX3RvX3ZpcnQoZXRoX3JtZW0gKyBwa3RvZmYpLCBmcmFnKTsKKwkJCXBrdG9mZiA9IGV0aF9yeF9zdGFydCA8PCA4OworCQkJcCArPSBmcmFnOworCQkJbGVuIC09IGZyYWc7CisJCX0KKwkJLyogcmVhZCBzZWNvbmQgcGFydCAqLworCQlpZiAoZXRoX2ZsYWdzICYgRkxBR19QSU8pCisJCWV0aF9waW9fcmVhZChwa3RvZmYsIHAsIGxlbik7CisJCWVsc2UKKwkJbWVtY3B5KHAsIGJ1c190b192aXJ0KGV0aF9ybWVtICsgcGt0b2ZmKSwgbGVuKTsKKwkJcmV0ID0gMTsKKwl9CisJbmV4dCA9IHBrdGhkci5uZXh0OyAvKiBmcmFtZSBudW1iZXIgb2YgbmV4dCBwYWNrZXQgKi8KKwlpZiAobmV4dCA9PSBldGhfcnhfc3RhcnQpCisJbmV4dCA9IGV0aF9tZW1zaXplOworCW91dGIobmV4dC0xLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQk9VTkQpOworCXJldHVybihyZXQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIE5FX1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbmVfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCAvKiBEZXN0aW5hdGlvbiAqLwordW5zaWduZWQgaW50IHQsIC8qIFR5cGUgKi8KK3Vuc2lnbmVkIGludCBzLCAvKiBzaXplICovCitjb25zdCBjaGFyICpwKSB7IC8qIFBhY2tldCAqLworCisJLyogUHJvZ3JhbW1lZCBJL08gKi8KKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCXR5cGUgPSAodCA+PiA4KSB8ICh0IDw8IDgpOworCWV0aF9waW9fd3JpdGUoKHVuc2lnbmVkIGNoYXIgKikgZCwgZXRoX3R4X3N0YXJ0IDw8IDgsIEVUSF9BTEVOKTsKKwlldGhfcGlvX3dyaXRlKG5pYy0+bm9kZV9hZGRyLCAoZXRoX3R4X3N0YXJ0IDw8IDgpICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkvKiBiY2MgZ2VuZXJhdGVzIHdvcnNlIGNvZGUgd2l0aG91dCAoY29uc3QrY29uc3QpIGJlbG93ICovCisJZXRoX3Bpb193cml0ZSgodW5zaWduZWQgY2hhciAqKSAmdHlwZSwgKGV0aF90eF9zdGFydCA8PCA4KSArIChFVEhfQUxFTgorCQkJKyBFVEhfQUxFTiksIDIpOworCWV0aF9waW9fd3JpdGUoKHVuc2lnbmVkIGNoYXIgKikgcCwgKGV0aF90eF9zdGFydCA8PCA4KSArIEVUSF9ITEVOLCBzKTsKKwlzICs9IEVUSF9ITEVOOworCWlmIChzIDwgRVRIX1pMRU4pCisJCXMgPSBFVEhfWkxFTjsKKworCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfCBEODM5MF9DT01NQU5EX1JEMiB8IEQ4MzkwX0NPTU1BTkRfU1RBLAorCQkJZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0YihldGhfdHhfc3RhcnQsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1RQU1IpOworCW91dGIocywgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfVEJDUjApOworCW91dGIocyA+PiA4LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9UQkNSMSk7CisKKwlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwgRDgzOTBfQ09NTUFORF9UWFAgfCBEODM5MF9DT01NQU5EX1JEMgorCQkJfCBEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgbmVfb3BlcmF0aW9ucyA9IHsgLmNvbm5lY3QgPSBkdW1teV9jb25uZWN0LAorCQkucG9sbCA9IG5lX3BvbGwsIC50cmFuc21pdCA9IG5lX3RyYW5zbWl0LCAuaXJxID0gZHVtbXlfaXJxLAorfTsKKworSVNBX0RSSVZFUiAoIG5lX2RyaXZlciwgbmVfcHJvYmVfYWRkcnMsIG5lX3Byb2JlMSwKKwkJR0VORVJJQ19JU0FQTlBfVkVORE9SLCAweDA2MDAgKTsKKworRFJJVkVSICggIm5lIiwgbmljX2RyaXZlciwgaXNhcG5wX2RyaXZlciwgbmVfZHJpdmVyLAorCQluZV9wcm9iZSwgbmVfZGlzYWJsZSApOworCitJU0FfUk9NKCJuZSIsIk5FMTAwMC8yMDAwIGFuZCBjbG9uZXMiKTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L25zODM4MjAuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L25zODM4MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQ4NzVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvbnM4MzgyMC5jCkBAIC0wLDAgKzEsMTAxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgIG5zODM4MjAuYzogRXRoZXJib290IGRldmljZSBkcml2ZXIgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIDgzODIwCisqICAgIFdyaXR0ZW4gMjAwNCBieSBUaW1vdGh5IExlZ2dlIDx0bGVnZ2VAcm9nZXJzLmNvbT4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqICAgIFBvcnRpb25zIG9mIHRoaXMgY29kZSBiYXNlZCBvbjoKKyoJbnM4MzgyMC5jIGJ5IEJlbmphbWluIExhSGFpc2Ugd2l0aCBjb250cmlidXRpb25zCisqIAkJZm9yIExpbnV4IGtlcm5lbCAyLjQueC4KKyoJCisqICAgIExpbnV4IERyaXZlciBWZXJzaW9uIDAuMjAsIDIwMDIwNjEwCisqIAorKiAgICBUaGlzIGRldmVsb3BtZW50IG9mIHRoaXMgRXRoZXJib290IGRyaXZlciB3YXMgZnVuZGVkIGJ5OgorKgorKiAgICBOWFRWOiBodHRwOi8vd3d3Lm54dHYuY29tLworKiAgICAJCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyoKKyogICAgdjEuMAkwMi0xNi0yMDA0CXRpbWxlZ2dlCUluaXRpYWwgcG9ydCBvZiBMaW51eCBkcml2ZXIKKyogICAgdjEuMQkwMi0xOS0yMDA0CXRpbWxlZ2dlCU1vcmUgcm9oYnVzdCB0cmFuc21pdCBhbmQgcG9sbAorKiAgICAKKyogICAgSW5kZW50IE9wdGlvbnM6IGluZGVudCAta3IgLWk4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisvKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLworI2luY2x1ZGUgIm5pYy5oIgorLyogdG8gZ2V0IHRoZSBQQ0kgc3VwcG9ydCBmdW5jdGlvbnMsIGlmIHRoaXMgaXMgYSBQQ0kgTklDICovCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKworI2lmIEFSQ0ggPT0gaWE2NAkJLyogU3VwcG9ydCA2NC1iaXQgYWRkcmVzc2luZyAqLworI2RlZmluZSBVU0VfNjRCSVRfQUREUgorI2VuZGlmCisKKy8vI2RlZmluZSBEREVCVUcKKyNpZmRlZiBEREVCVUcKKyNkZWZpbmUgZHByaW50Zih4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgZHByaW50Zih4KQorI2VuZGlmCisKKyNkZWZpbmUgSFogMTAwCisKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCisKKy8qIEdsb2JhbCBwYXJhbWV0ZXJzLiAgU2VlIE1PRFVMRV9QQVJNIG5lYXIgdGhlIGJvdHRvbS4gKi8KKy8vIHN0YXRpYyBpbnQgaWhyID0gMjsKK3N0YXRpYyBpbnQgcmVzZXRfcGh5ID0gMDsKK3N0YXRpYyBpbnQgbG5rc3RzID0gMDsJCS8qIENGR19MTktTVFMgYml0IHBvbGFyaXR5ICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19ISUdITUVNNjRHKSB8fCBkZWZpbmVkKF9faWE2NF9fKQorI2RlZmluZSBVU0VfNjRCSVRfQUREUgkiKyIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfNjRCSVRfQUREUikKKyNkZWZpbmUgVFJZX0RBQwkxCisjZWxzZQorI2RlZmluZSBUUllfREFDCTAKKyNlbmRpZgorCisvKiB0dW5hYmxlcyAqLworI2RlZmluZSBSWF9CVUZfU0laRQkxNTAwCS8qIDgxOTIgKi8KKworLyogTXVzdCBub3QgZXhjZWVkIH42NTAwMC4gKi8KKyNkZWZpbmUgTlJfUlhfREVTQwk2NAorI2RlZmluZSBOUl9UWF9ERVNDCTEKKworCQkgICAvKiBub3QgdHVuYWJsZSAqLy8qIEV4dHJhIDYgYnl0ZXMgZm9yIDY0IGJpdCBhbGlnbm1lbnQgKGRpdmlzYWJsZSBieSA4KSAqLworI2RlZmluZSBSRUFMX1JYX0JVRl9TSVpFIChSWF9CVUZfU0laRSArIDE0ICsgNikJLyogcngvdHggbWFjIGFkZHIgKyB0eXBlICovCisKKyNkZWZpbmUgTUlOX1RYX0RFU0NfRlJFRQk4CisKKy8qIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgQ0ZHQ1MJCTB4MDQKKworI2RlZmluZSBDUl9UWEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JfVFhECQkweDAwMDAwMDAyCisvKiBSYW1pdCA6IEhlcmUncyBhIHRpcCwgZG9uJ3QgZG8gYSBSWEQgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gUlhFCisgKiBUaGUgUmVjZWl2ZSBlbmdpbmUgc2tpcHMgb25lIGRlc2NyaXB0b3IgYW5kIG1vdmVzCisgKiBvbnRvIHRoZSBuZXh0IG9uZSEhICovCisjZGVmaW5lIENSX1JYRQkJMHgwMDAwMDAwNAorI2RlZmluZSBDUl9SWEQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ1JfVFhSCQkweDAwMDAwMDEwCisjZGVmaW5lIENSX1JYUgkJMHgwMDAwMDAyMAorI2RlZmluZSBDUl9TV0kJCTB4MDAwMDAwODAKKyNkZWZpbmUgQ1JfUlNUCQkweDAwMDAwMTAwCisKKyNkZWZpbmUgUFRTQ1JfRUVCSVNUX0ZBSUwgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBQVFNDUl9FRUJJU1RfRU4gICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFBUU0NSX0VFTE9BRF9FTiAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUFRTQ1JfUkJJU1RfRkFJTCAgICAgICAgMHgwMDAwMDFiOAorI2RlZmluZSBQVFNDUl9SQklTVF9ET05FICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBUU0NSX1JCSVNUX0VOICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUFRTQ1JfUkJJU1RfUlNUICAgICAgICAgMHgwMDAwMjAwMAorCisjZGVmaW5lIE1FQVJfRUVESQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRUFSX0VFRE8JCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUVBUl9FRUNMSwkJMHgwMDAwMDAwNAorI2RlZmluZSBNRUFSX0VFU0VMCQkweDAwMDAwMDA4CisjZGVmaW5lIE1FQVJfTURJTwkJMHgwMDAwMDAxMAorI2RlZmluZSBNRUFSX01ERElSCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FQVJfTURDCQkweDAwMDAwMDQwCisKKyNkZWZpbmUgSVNSX1RYREVTQzMJMHg0MDAwMDAwMAorI2RlZmluZSBJU1JfVFhERVNDMgkweDIwMDAwMDAwCisjZGVmaW5lIElTUl9UWERFU0MxCTB4MTAwMDAwMDAKKyNkZWZpbmUgSVNSX1RYREVTQzAJMHgwODAwMDAwMAorI2RlZmluZSBJU1JfUlhERVNDMwkweDA0MDAwMDAwCisjZGVmaW5lIElTUl9SWERFU0MyCTB4MDIwMDAwMDAKKyNkZWZpbmUgSVNSX1JYREVTQzEJMHgwMTAwMDAwMAorI2RlZmluZSBJU1JfUlhERVNDMAkweDAwODAwMDAwCisjZGVmaW5lIElTUl9UWFJDTVAJMHgwMDQwMDAwMAorI2RlZmluZSBJU1JfUlhSQ01QCTB4MDAyMDAwMDAKKyNkZWZpbmUgSVNSX0RQRVJSCTB4MDAxMDAwMDAKKyNkZWZpbmUgSVNSX1NTRVJSCTB4MDAwODAwMDAKKyNkZWZpbmUgSVNSX1JNQUJUCTB4MDAwNDAwMDAKKyNkZWZpbmUgSVNSX1JUQUJUCTB4MDAwMjAwMDAKKyNkZWZpbmUgSVNSX1JYU09WUgkweDAwMDEwMDAwCisjZGVmaW5lIElTUl9ISUJJTlQJMHgwMDAwODAwMAorI2RlZmluZSBJU1JfUEhZCQkweDAwMDA0MDAwCisjZGVmaW5lIElTUl9QTUUJCTB4MDAwMDIwMDAKKyNkZWZpbmUgSVNSX1NXSQkJMHgwMDAwMTAwMAorI2RlZmluZSBJU1JfTUlCCQkweDAwMDAwODAwCisjZGVmaW5lIElTUl9UWFVSTgkweDAwMDAwNDAwCisjZGVmaW5lIElTUl9UWElETEUJMHgwMDAwMDIwMAorI2RlZmluZSBJU1JfVFhFUlIJMHgwMDAwMDEwMAorI2RlZmluZSBJU1JfVFhERVNDCTB4MDAwMDAwODAKKyNkZWZpbmUgSVNSX1RYT0sJMHgwMDAwMDA0MAorI2RlZmluZSBJU1JfUlhPUk4JMHgwMDAwMDAyMAorI2RlZmluZSBJU1JfUlhJRExFCTB4MDAwMDAwMTAKKyNkZWZpbmUgSVNSX1JYRUFSTFkJMHgwMDAwMDAwOAorI2RlZmluZSBJU1JfUlhFUlIJMHgwMDAwMDAwNAorI2RlZmluZSBJU1JfUlhERVNDCTB4MDAwMDAwMDIKKyNkZWZpbmUgSVNSX1JYT0sJMHgwMDAwMDAwMQorCisjZGVmaW5lIFRYQ0ZHX0NTSQkweDgwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX0hCSQkweDQwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX01MQgkweDIwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX0FUUAkweDEwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX0VDUkVUUlkJMHgwMDgwMDAwMAorI2RlZmluZSBUWENGR19CUlNUX0RJUwkweDAwMDgwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BMTAyNAkweDAwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BNTEyCTB4MDA3MDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUEyNTYJMHgwMDYwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTEyOAkweDAwNTAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BNjQJMHgwMDQwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTMyCTB4MDAzMDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUExNgkweDAwMjAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BOAkweDAwMTAwMDAwCisKKyNkZWZpbmUgQ0ZHX0xOS1NUUwkweDgwMDAwMDAwCisjZGVmaW5lIENGR19TUERTVFMJMHg2MDAwMDAwMAorI2RlZmluZSBDRkdfU1BEU1RTMQkweDQwMDAwMDAwCisjZGVmaW5lIENGR19TUERTVFMwCTB4MjAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0RVUFNUUwkweDEwMDAwMDAwCisjZGVmaW5lIENGR19UQklfRU4JMHgwMTAwMDAwMAorI2RlZmluZSBDRkdfTU9ERV8xMDAwCTB4MDA0MDAwMDAKKy8qIFJhbWl0IDogRG9udCcgZXZlciB1c2UgQVVUT18xMDAwLCBpdCBuZXZlciB3b3JrcyBhbmQgaXMgYnVnZ3kuCisgKiBSZWFkIHRoZSBQaHkgcmVzcG9uc2UgYW5kIHRoZW4gY29uZmlndXJlIHRoZSBNQUMgYWNjb3JkaW5nbHkgKi8KKyNkZWZpbmUgQ0ZHX0FVVE9fMTAwMAkweDAwMjAwMDAwCisjZGVmaW5lIENGR19QSU5UX0NUTAkweDAwMWMwMDAwCisjZGVmaW5lIENGR19QSU5UX0RVUFNUUwkweDAwMTAwMDAwCisjZGVmaW5lIENGR19QSU5UX0xOS1NUUwkweDAwMDgwMDAwCisjZGVmaW5lIENGR19QSU5UX1NQRFNUUwkweDAwMDQwMDAwCisjZGVmaW5lIENGR19UTVJURVNUCTB4MDAwMjAwMDAKKyNkZWZpbmUgQ0ZHX01STV9ESVMJMHgwMDAxMDAwMAorI2RlZmluZSBDRkdfTVdJX0RJUwkweDAwMDA4MDAwCisjZGVmaW5lIENGR19UNjRBRERSCTB4MDAwMDQwMDAKKyNkZWZpbmUgQ0ZHX1BDSTY0X0RFVAkweDAwMDAyMDAwCisjZGVmaW5lIENGR19EQVRBNjRfRU4JMHgwMDAwMTAwMAorI2RlZmluZSBDRkdfTTY0QUREUgkweDAwMDAwODAwCisjZGVmaW5lIENGR19QSFlfUlNUCTB4MDAwMDA0MDAKKyNkZWZpbmUgQ0ZHX1BIWV9ESVMJMHgwMDAwMDIwMAorI2RlZmluZSBDRkdfRVhUU1RTX0VOCTB4MDAwMDAxMDAKKyNkZWZpbmUgQ0ZHX1JFUUFMRwkweDAwMDAwMDgwCisjZGVmaW5lIENGR19TQgkJMHgwMDAwMDA0MAorI2RlZmluZSBDRkdfUE9XCQkweDAwMDAwMDIwCisjZGVmaW5lIENGR19FWEQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ0ZHX1BFU0VMCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ0ZHX0JST01fRElTCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ0ZHX0VYVF8xMjUJMHgwMDAwMDAwMgorI2RlZmluZSBDRkdfQkVNCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgRVhUU1RTX1VEUFBLVAkweDAwMjAwMDAwCisjZGVmaW5lIEVYVFNUU19UQ1BQS1QJMHgwMDA4MDAwMAorI2RlZmluZSBFWFRTVFNfSVBQS1QJMHgwMDAyMDAwMAorCisjZGVmaW5lIFNQRFNUU19QT0xBUklUWQkoQ0ZHX1NQRFNUUzEgfCBDRkdfU1BEU1RTMCB8IENGR19EVVBTVFMgfCAobG5rc3RzID8gQ0ZHX0xOS1NUUyA6IDApKQorCisjZGVmaW5lIE1JQkNfTUlCUwkweDAwMDAwMDA4CisjZGVmaW5lIE1JQkNfQUNMUgkweDAwMDAwMDA0CisjZGVmaW5lIE1JQkNfRlJaCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUlCQ19XUk4JMHgwMDAwMDAwMQorCisjZGVmaW5lIFBDUl9QU0VOCSgxIDw8IDMxKQorI2RlZmluZSBQQ1JfUFNfTUNBU1QJKDEgPDwgMzApCisjZGVmaW5lIFBDUl9QU19EQQkoMSA8PCAyOSkKKyNkZWZpbmUgUENSX1NUSElfOAkoMyA8PCAyMykKKyNkZWZpbmUgUENSX1NUTE9fNAkoMSA8PCAyMykKKyNkZWZpbmUgUENSX0ZGSElfOEsJKDMgPDwgMjEpCisjZGVmaW5lIFBDUl9GRkxPXzRLCSgxIDw8IDIxKQorI2RlZmluZSBQQ1JfUEFVU0VfQ05UCTB4RkZGRQorCisjZGVmaW5lIFJYQ0ZHX0FFUAkweDgwMDAwMDAwCisjZGVmaW5lIFJYQ0ZHX0FSUAkweDQwMDAwMDAwCisjZGVmaW5lIFJYQ0ZHX1NUUklQQ1JDCTB4MjAwMDAwMDAKKyNkZWZpbmUgUlhDRkdfUlhfRkQJMHgxMDAwMDAwMAorI2RlZmluZSBSWENGR19BTFAJMHgwODAwMDAwMAorI2RlZmluZSBSWENGR19BSVJMCTB4MDQwMDAwMDAKKyNkZWZpbmUgUlhDRkdfTVhETUE1MTIJMHgwMDcwMDAwMAorI2RlZmluZSBSWENGR19EUlRICTB4MDAwMDAwM2UKKyNkZWZpbmUgUlhDRkdfRFJUSDAJMHgwMDAwMDAwMgorCisjZGVmaW5lIFJGQ1JfUkZFTgkweDgwMDAwMDAwCisjZGVmaW5lIFJGQ1JfQUFCCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkZDUl9BQU0JMHgyMDAwMDAwMAorI2RlZmluZSBSRkNSX0FBVQkweDEwMDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBNCTB4MDgwMDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUCTB4MDc4MDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUMwkweDA0MDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBBVDIJMHgwMjAwMDAwMAorI2RlZmluZSBSRkNSX0FQQVQxCTB4MDEwMDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUMAkweDAwODAwMDAwCisjZGVmaW5lIFJGQ1JfQUFSUAkweDAwNDAwMDAwCisjZGVmaW5lIFJGQ1JfTUhFTgkweDAwMjAwMDAwCisjZGVmaW5lIFJGQ1JfVUhFTgkweDAwMTAwMDAwCisjZGVmaW5lIFJGQ1JfVUxNCTB4MDAwODAwMDAKKworI2RlZmluZSBWUkNSX1JVRFBFCTB4MDAwMDAwODAKKyNkZWZpbmUgVlJDUl9SVENQRQkweDAwMDAwMDQwCisjZGVmaW5lIFZSQ1JfUklQRQkweDAwMDAwMDIwCisjZGVmaW5lIFZSQ1JfSVBFTgkweDAwMDAwMDEwCisjZGVmaW5lIFZSQ1JfRFVURgkweDAwMDAwMDA4CisjZGVmaW5lIFZSQ1JfRFZURgkweDAwMDAwMDA0CisjZGVmaW5lIFZSQ1JfVlRSRU4JMHgwMDAwMDAwMgorI2RlZmluZSBWUkNSX1ZUREVOCTB4MDAwMDAwMDEKKworI2RlZmluZSBWVENSX1BQQ0hLCTB4MDAwMDAwMDgKKyNkZWZpbmUgVlRDUl9HQ0hLCTB4MDAwMDAwMDQKKyNkZWZpbmUgVlRDUl9WUFBUSQkweDAwMDAwMDAyCisjZGVmaW5lIFZUQ1JfVkdUSQkweDAwMDAwMDAxCisKKyNkZWZpbmUgQ1IJCTB4MDAKKyNkZWZpbmUgQ0ZHCQkweDA0CisjZGVmaW5lIE1FQVIJCTB4MDgKKyNkZWZpbmUgUFRTQ1IJCTB4MGMKKyNkZWZpbmUJSVNSCQkweDEwCisjZGVmaW5lCUlNUgkJMHgxNAorI2RlZmluZQlJRVIJCTB4MTgKKyNkZWZpbmUJSUhSCQkweDFjCisjZGVmaW5lIFRYRFAJCTB4MjAKKyNkZWZpbmUgVFhEUF9ISQkJMHgyNAorI2RlZmluZSBUWENGRwkJMHgyOAorI2RlZmluZSBHUElPUgkJMHgyYworI2RlZmluZSBSWERQCQkweDMwCisjZGVmaW5lIFJYRFBfSEkJCTB4MzQKKyNkZWZpbmUgUlhDRkcJCTB4MzgKKyNkZWZpbmUgUFFDUgkJMHgzYworI2RlZmluZSBXQ1NSCQkweDQwCisjZGVmaW5lIFBDUgkJMHg0NAorI2RlZmluZSBSRkNSCQkweDQ4CisjZGVmaW5lIFJGRFIJCTB4NGMKKworI2RlZmluZSBTUlIJCTB4NTgKKworI2RlZmluZSBWUkNSCQkweGJjCisjZGVmaW5lIFZUQ1IJCTB4YzAKKyNkZWZpbmUgVkRSCQkweGM0CisjZGVmaW5lIENDU1IJCTB4Y2MKKworI2RlZmluZSBUQklDUgkJMHhlMAorI2RlZmluZSBUQklTUgkJMHhlNAorI2RlZmluZSBUQU5BUgkJMHhlOAorI2RlZmluZSBUQU5MUEFSCQkweGVjCisjZGVmaW5lIFRBTkVSCQkweGYwCisjZGVmaW5lIFRFU1IJCTB4ZjQKKworI2RlZmluZSBUQklDUl9NUl9BTl9FTkFCTEUJMHgwMDAwMTAwMAorI2RlZmluZSBUQklDUl9NUl9SRVNUQVJUX0FOCTB4MDAwMDAyMDAKKworI2RlZmluZSBUQklTUl9NUl9MSU5LX1NUQVRVUwkweDAwMDAwMDIwCisjZGVmaW5lIFRCSVNSX01SX0FOX0NPTVBMRVRFCTB4MDAwMDAwMDQKKworI2RlZmluZSBUQU5BUl9QUzIgCQkweDAwMDAwMTAwCisjZGVmaW5lIFRBTkFSX1BTMSAJCTB4MDAwMDAwODAKKyNkZWZpbmUgVEFOQVJfSEFMRl9EVVAgCQkweDAwMDAwMDQwCisjZGVmaW5lIFRBTkFSX0ZVTExfRFVQIAkJMHgwMDAwMDAyMAorCisjZGVmaW5lIEdQSU9SX0dQNV9PRQkJMHgwMDAwMDIwMAorI2RlZmluZSBHUElPUl9HUDRfT0UJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR1BJT1JfR1AzX09FCQkweDAwMDAwMDgwCisjZGVmaW5lIEdQSU9SX0dQMl9PRQkJMHgwMDAwMDA0MAorI2RlZmluZSBHUElPUl9HUDFfT0UJCTB4MDAwMDAwMjAKKyNkZWZpbmUgR1BJT1JfR1AzX09VVAkJMHgwMDAwMDAwNAorI2RlZmluZSBHUElPUl9HUDFfT1VUCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgTElOS19BVVRPTkVHT1RJQVRFCTB4MDEKKyNkZWZpbmUgTElOS19ET1dOCQkweDAyCisjZGVmaW5lIExJTktfVVAJCQkweDA0CisKKworI2RlZmluZSBfX2tpY2tfcngoKQl3cml0ZWwoQ1JfUlhFLCBucy0+YmFzZSArIENSKQorCisjZGVmaW5lIGtpY2tfcngoKSBkbyB7IFwKKwlkcHJpbnRmKCgia2lja19yeDogbWF5YmUga2lja2luZ1xuIikpOyBcCisJCXdyaXRlbCh2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nW25zLT5jdXJfcnhdKSwgbnMtPmJhc2UgKyBSWERQKTsgXAorCQlpZiAobnMtPm5leHRfcnggPT0gbnMtPm5leHRfZW1wdHkpIFwKKwkJCXByaW50ZigidWgtb2g6IG5leHRfcnggPT0gbmV4dF9lbXB0eT8/P1xuIik7IFwKKwkJX19raWNrX3J4KCk7IFwKK30gd2hpbGUoMCkKKworCisjaWZkZWYgVVNFXzY0QklUX0FERFIKKyNkZWZpbmUgSFdfQUREUl9MRU4JOAorI2Vsc2UKKyNkZWZpbmUgSFdfQUREUl9MRU4JNAorI2VuZGlmCisKKyNkZWZpbmUgQ01EU1RTX09XTgkweDgwMDAwMDAwCisjZGVmaW5lIENNRFNUU19NT1JFCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX0lOVFIJMHgyMDAwMDAwMAorI2RlZmluZSBDTURTVFNfRVJSCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX09LCTB4MDgwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX0xFTl9NQVNLCTB4MDAwMGZmZmYKKworI2RlZmluZSBDTURTVFNfREVTVF9NQVNLCTB4MDE4MDAwMDAKKyNkZWZpbmUgQ01EU1RTX0RFU1RfU0VMRgkweDAwODAwMDAwCisjZGVmaW5lIENNRFNUU19ERVNUX01VTFRJCTB4MDEwMDAwMDAKKworI2RlZmluZSBERVNDX1NJWkUJOAkvKiBTaG91bGQgYmUgY2FjaGUgbGluZSBzaXplZCAqLworCisjaWZkZWYgVVNFXzY0QklUX0FERFIKK3N0cnVjdCByaW5nX2Rlc2MgeworCXVpbnQ2NF90IGxpbms7CisJdWludDY0X3QgYnVmcHRyOworCXUzMiBjbWRzdHM7CisJdTMyIGV4dHN0czsJCS8qIEV4dGVuZGVkIHN0YXR1cyBmaWVsZCAqLworfTsKKyNlbHNlCitzdHJ1Y3QgcmluZ19kZXNjIHsKKwl1MzIgbGluazsKKwl1MzIgYnVmcHRyOworCXUzMiBjbWRzdHM7CisJdTMyIGV4dHN0czsJCS8qIEV4dGVuZGVkIHN0YXR1cyBmaWVsZCAqLworfTsKKyNlbmRpZgorCisvKiBQcml2YXRlIFN0b3JhZ2UgZm9yIHRoZSBOSUMgKi8KK3N0YXRpYyBzdHJ1Y3QgbnM4MzgyMF9wcml2YXRlIHsKKwl1OCAqYmFzZTsKKwlpbnQgdXA7CisJbG9uZyBpZGxlOworCXUzMiAqbmV4dF9yeF9kZXNjOworCXUxNiBuZXh0X3J4LCBuZXh0X2VtcHR5OworCXUzMiBjdXJfcng7CisJdTMyICpkZXNjczsKKwl1bnNpZ25lZCBpaHI7CisJdTMyIENGR19jYWNoZTsKKwl1MzIgTUVBUl9jYWNoZTsKKwl1MzIgSU1SX2NhY2hlOworCWludCBsaW5rc3RhdGU7CisJdTE2IHR4X2RvbmVfaWR4OworCXUxNiB0eF9pZHg7CisJdTE2IHR4X2ludHJfaWR4OworCXUzMiBwaHlfZGVzY3M7CisJdTMyICp0eF9kZXNjczsKKworfSBuc3g7CitzdGF0aWMgc3RydWN0IG5zODM4MjBfcHJpdmF0ZSAqbnM7CisKKy8qIERlZmluZSB0aGUgVFggYW5kIFJYIERlc2NyaXB0b3IgYW5kIEJ1ZmZlcnMgKi8KK3N0cnVjdCB7CisJc3RydWN0IHJpbmdfZGVzYyB0eF9yaW5nW05SX1RYX0RFU0NdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CisJdW5zaWduZWQgY2hhciB0eGJbTlJfVFhfREVTQyAqIFJFQUxfUlhfQlVGX1NJWkVdOworCXN0cnVjdCByaW5nX2Rlc2MgcnhfcmluZ1tOUl9SWF9ERVNDXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOworCXVuc2lnbmVkIGNoYXIgcnhiW05SX1JYX0RFU0MgKiBSRUFMX1JYX0JVRl9TSVpFXQorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7Cit9IG5zODM4MjBfYnVmcyBfX3NoYXJlZDsKKyNkZWZpbmUgdHhfcmluZyBuczgzODIwX2J1ZnMudHhfcmluZworI2RlZmluZSByeF9yaW5nIG5zODM4MjBfYnVmcy5yeF9yaW5nCisjZGVmaW5lIHR4YiBuczgzODIwX2J1ZnMudHhiCisjZGVmaW5lIHJ4YiBuczgzODIwX2J1ZnMucnhiCisKK3N0YXRpYyB2b2lkIHBoeV9pbnRyKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwlzdGF0aWMgY2hhciAqc3BlZWRzW10gPQorCSAgICB7ICIxMCIsICIxMDAiLCAiMTAwMCIsICIxMDAwKD8pIiwgIjEwMDBGIiB9OworCXUzMiBjZmcsIG5ld19jZmc7CisJdTMyIHRiaXNyLCB0YW5hciwgdGFubHBhcjsKKwlpbnQgc3BlZWQsIGZ1bGxkdXBsZXgsIG5ld2xpbmtzdGF0ZTsKKworCWNmZyA9IHJlYWRsKG5zLT5iYXNlICsgQ0ZHKSBeIFNQRFNUU19QT0xBUklUWTsKKwlpZiAobnMtPkNGR19jYWNoZSAmIENGR19UQklfRU4pIHsKKwkJLyogd2UgaGF2ZSBhbiBvcHRpY2FsIHRyYW5zY2VpdmVyICovCisJCXRiaXNyID0gcmVhZGwobnMtPmJhc2UgKyBUQklTUik7CisJCXRhbmFyID0gcmVhZGwobnMtPmJhc2UgKyBUQU5BUik7CisJCXRhbmxwYXIgPSByZWFkbChucy0+YmFzZSArIFRBTkxQQVIpOworCQlkcHJpbnRmKCgicGh5X2ludHI6IHRiaXNyPSVoWCwgdGFuYXI9JWhYLCB0YW5scGFyPSVoWFxuIiwKKwkJCSB0YmlzciwgdGFuYXIsIHRhbmxwYXIpKTsKKworCQlpZiAoKGZ1bGxkdXBsZXggPSAodGFubHBhciAmIFRBTkFSX0ZVTExfRFVQKQorCQkgICAgICYmICh0YW5hciAmIFRBTkFSX0ZVTExfRFVQKSkpIHsKKworCQkJLyogYm90aCBvZiB1cyBhcmUgZnVsbCBkdXBsZXggKi8KKwkJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIFRYQ0ZHKQorCQkJICAgICAgIHwgVFhDRkdfQ1NJIHwgVFhDRkdfSEJJIHwgVFhDRkdfQVRQLAorCQkJICAgICAgIG5zLT5iYXNlICsgVFhDRkcpOworCQkJd3JpdGVsKHJlYWRsKG5zLT5iYXNlICsgUlhDRkcpIHwgUlhDRkdfUlhfRkQsCisJCQkgICAgICAgbnMtPmJhc2UgKyBSWENGRyk7CisJCQkvKiBMaWdodCB1cCBmdWxsIGR1cGxleCBMRUQgKi8KKwkJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIEdQSU9SKSB8IEdQSU9SX0dQMV9PVVQsCisJCQkgICAgICAgbnMtPmJhc2UgKyBHUElPUik7CisKKwkJfSBlbHNlIGlmICgoKHRhbmxwYXIgJiBUQU5BUl9IQUxGX0RVUCkKKwkJCSAgICAmJiAodGFuYXIgJiBUQU5BUl9IQUxGX0RVUCkpCisJCQkgICB8fCAoKHRhbmxwYXIgJiBUQU5BUl9GVUxMX0RVUCkKKwkJCSAgICAgICAmJiAodGFuYXIgJiBUQU5BUl9IQUxGX0RVUCkpCisJCQkgICB8fCAoKHRhbmxwYXIgJiBUQU5BUl9IQUxGX0RVUCkKKwkJCSAgICAgICAmJiAodGFuYXIgJiBUQU5BUl9GVUxMX0RVUCkpKSB7CisKKwkJCS8qIG9uZSBvciBib3RoIG9mIHVzIGFyZSBoYWxmIGR1cGxleCAqLworCQkJd3JpdGVsKChyZWFkbChucy0+YmFzZSArIFRYQ0ZHKQorCQkJCSYgfihUWENGR19DU0kgfCBUWENGR19IQkkpKSB8IFRYQ0ZHX0FUUCwKKwkJCSAgICAgICBucy0+YmFzZSArIFRYQ0ZHKTsKKwkJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIFJYQ0ZHKSAmIH5SWENGR19SWF9GRCwKKwkJCSAgICAgICBucy0+YmFzZSArIFJYQ0ZHKTsKKwkJCS8qIFR1cm4gb2ZmIGZ1bGwgZHVwbGV4IExFRCAqLworCQkJd3JpdGVsKHJlYWRsKG5zLT5iYXNlICsgR1BJT1IpICYgfkdQSU9SX0dQMV9PVVQsCisJCQkgICAgICAgbnMtPmJhc2UgKyBHUElPUik7CisJCX0KKworCQlzcGVlZCA9IDQ7CS8qIDEwMDBGICovCisKKwl9IGVsc2UgeworCQkvKiB3ZSBoYXZlIGEgY29wcGVyIHRyYW5zY2VpdmVyICovCisJCW5ld19jZmcgPQorCQkgICAgbnMtPkNGR19jYWNoZSAmIH4oQ0ZHX1NCIHwgQ0ZHX01PREVfMTAwMCB8IENGR19TUERTVFMpOworCisJCWlmIChjZmcgJiBDRkdfU1BEU1RTMSkKKwkJCW5ld19jZmcgfD0gQ0ZHX01PREVfMTAwMDsKKwkJZWxzZQorCQkJbmV3X2NmZyAmPSB+Q0ZHX01PREVfMTAwMDsKKworCQlzcGVlZCA9ICgoY2ZnIC8gQ0ZHX1NQRFNUUzApICYgMyk7CisJCWZ1bGxkdXBsZXggPSAoY2ZnICYgQ0ZHX0RVUFNUUyk7CisKKwkJaWYgKGZ1bGxkdXBsZXgpCisJCQluZXdfY2ZnIHw9IENGR19TQjsKKworCQlpZiAoKGNmZyAmIENGR19MTktTVFMpICYmCisJCSAgICAoKG5ld19jZmcgXiBucy0+Q0ZHX2NhY2hlKSAmIENGR19NT0RFXzEwMDApKSB7CisJCQl3cml0ZWwobmV3X2NmZywgbnMtPmJhc2UgKyBDRkcpOworCQkJbnMtPkNGR19jYWNoZSA9IG5ld19jZmc7CisJCX0KKworCQlucy0+Q0ZHX2NhY2hlICY9IH5DRkdfU1BEU1RTOworCQlucy0+Q0ZHX2NhY2hlIHw9IGNmZyAmIENGR19TUERTVFM7CisJfQorCisJbmV3bGlua3N0YXRlID0gKGNmZyAmIENGR19MTktTVFMpID8gTElOS19VUCA6IExJTktfRE9XTjsKKworCWlmIChuZXdsaW5rc3RhdGUgJiBMSU5LX1VQICYmIG5zLT5saW5rc3RhdGUgIT0gbmV3bGlua3N0YXRlKSB7CisJCXByaW50ZigibGluayBub3cgJXMgbWJwcywgJXMgZHVwbGV4IGFuZCB1cC5cbiIsCisJCSAgICAgICBzcGVlZHNbc3BlZWRdLCBmdWxsZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwl9IGVsc2UgaWYgKG5ld2xpbmtzdGF0ZSAmIExJTktfRE9XTgorCQkgICAmJiBucy0+bGlua3N0YXRlICE9IG5ld2xpbmtzdGF0ZSkgeworCQlwcmludGYoImxpbmsgbm93IGRvd24uXG4iKTsKKwl9CisJbnMtPmxpbmtzdGF0ZSA9IG5ld2xpbmtzdGF0ZTsKK30KK3N0YXRpYyB2b2lkIG5zODM4MjBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpOworc3RhdGljIHZvaWQgbnM4MzgyMF9zZXR1cF9yeChzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgaTsKKwlucy0+aWRsZSA9IDE7CisJbnMtPm5leHRfcnggPSAwOworCW5zLT5uZXh0X3J4X2Rlc2MgPSBucy0+ZGVzY3M7CisJbnMtPm5leHRfZW1wdHkgPSAwOworCW5zLT5jdXJfcnggPSAwOworCisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfUlhfREVTQzsgaSsrKSB7CisJCXJ4X3JpbmdbaV0ubGluayA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbaSArIDFdKTsKKwkJcnhfcmluZ1tpXS5idWZwdHIgPQorCQkgICAgdmlydF90b19sZTMyZGVzYygmcnhiW2kgKiBSRUFMX1JYX0JVRl9TSVpFXSk7CisJCXJ4X3JpbmdbaV0uY21kc3RzID0gY3B1X3RvX2xlMzIoUkVBTF9SWF9CVUZfU0laRSk7CisJCXJ4X3JpbmdbaV0uZXh0c3RzID0gY3B1X3RvX2xlMzIoMCk7CisJfQorLy8gICAgICBObyBuZWVkIHRvIHdyYXAgdGhlIHJpbmcgCisvLyAgICAgIHJ4X3JpbmdbaV0ubGluayA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbMF0pOworCXdyaXRlbCgwLCBucy0+YmFzZSArIFJYRFBfSEkpOworCXdyaXRlbCh2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKSwgbnMtPmJhc2UgKyBSWERQKTsKKworCWRwcmludGYoKCJzdGFydGluZyByZWNlaXZlclxuIikpOworCisJd3JpdGVsKDB4MDAwMSwgbnMtPmJhc2UgKyBDQ1NSKTsKKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBSRkNSKTsKKwl3cml0ZWwoMHg3ZmMwMDAwMCwgbnMtPmJhc2UgKyBSRkNSKTsKKwl3cml0ZWwoMHhmZmMwMDAwMCwgbnMtPmJhc2UgKyBSRkNSKTsKKworCW5zLT51cCA9IDE7CisKKwlwaHlfaW50cihuaWMpOworCisJLyogT2theSwgbGV0IGl0IHJpcCAqLworCW5zLT5JTVJfY2FjaGUgfD0gSVNSX1BIWTsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9SWFJDTVA7CisJLy9kZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhFUlI7CisJLy9kZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhPSzsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9SWE9STjsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9SWFNPVlI7CisJbnMtPklNUl9jYWNoZSB8PSBJU1JfUlhERVNDOworCW5zLT5JTVJfY2FjaGUgfD0gSVNSX1JYSURMRTsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9UWERFU0M7CisJbnMtPklNUl9jYWNoZSB8PSBJU1JfVFhJRExFOworCisJLy8gTm8gcmVhc29uIHRvIGVuYWJsZSBpbnRlcnVwdHMuLi4KKwkvLyB3cml0ZWwobnMtPklNUl9jYWNoZSwgbnMtPmJhc2UgKyBJTVIpOworCS8vIHdyaXRlbCgxLCBucy0+YmFzZSArIElFUik7CisJbnM4MzgyMF9zZXRfbXVsdGljYXN0KG5pYyk7CisJa2lja19yeCgpOworfQorCisKK3N0YXRpYyB2b2lkIG5zODM4MjBfZG9fcmVzZXQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCB1MzIgd2hpY2gpCit7CisJZHByaW50ZigoInJlc2V0dGluZyBjaGlwLi4uXG4iKSk7CisJd3JpdGVsKHdoaWNoLCBucy0+YmFzZSArIENSKTsKKwlkbyB7CisKKwl9IHdoaWxlIChyZWFkbChucy0+YmFzZSArIENSKSAmIHdoaWNoKTsKKwlkcHJpbnRmKCgib2theSFcbiIpKTsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgaTsKKwlkcHJpbnRmKCgibnM4MzgyMF9yZXNldFxuIikpOworCisJd3JpdGVsKDAsIG5zLT5iYXNlICsgUFFDUik7CisKKwluczgzODIwX3NldHVwX3J4KG5pYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfVFhfREVTQzsgaSsrKSB7CisJCXR4X3JpbmdbaV0ubGluayA9IDA7CisJCXR4X3JpbmdbaV0uYnVmcHRyID0gMDsKKwkJdHhfcmluZ1tpXS5jbWRzdHMgPSBjcHVfdG9fbGUzMigwKTsKKwkJdHhfcmluZ1tpXS5leHRzdHMgPSBjcHVfdG9fbGUzMigwKTsKKwl9CisKKwlucy0+dHhfaWR4ID0gMDsKKwlucy0+dHhfZG9uZV9pZHggPSAwOworCXdyaXRlbCgwLCBucy0+YmFzZSArIFRYRFBfSEkpOworCXJldHVybjsKK30KK3N0YXRpYyB2b2lkIG5zODM4MjBfZ2V0bWFjKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdTggKiBtYWMpCit7CisJdW5zaWduZWQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXUzMiBkYXRhOworCQkvKiBSZWFkIGZyb20gdGhlIHBlcmZlY3QgbWF0Y2ggbWVtb3J5OiB0aGlzIGlzIGxvYWRlZCBieQorCQkgKiB0aGUgY2hpcCBmcm9tIHRoZSBFRVBST00gdmlhIHRoZSBFRUxPQUQgc2VsZiB0ZXN0LgorCQkgKi8KKwkJd3JpdGVsKGkgKiAyLCBucy0+YmFzZSArIFJGQ1IpOworCQlkYXRhID0gcmVhZGwobnMtPmJhc2UgKyBSRkRSKTsKKwkJKm1hYysrID0gZGF0YTsKKwkJKm1hYysrID0gZGF0YSA+PiA4OworCX0KK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwl1OCAqcmZjciA9IG5zLT5iYXNlICsgUkZDUjsKKwl1MzIgYW5kX21hc2sgPSAweGZmZmZmZmZmOworCXUzMiBvcl9tYXNrID0gMDsKKwl1MzIgdmFsOworCisJLyogU3VwcG9ydCBNdWx0aWNhc3QgKi8KKwlhbmRfbWFzayAmPSB+KFJGQ1JfQUFVIHwgUkZDUl9BQU0pOworCW9yX21hc2sgfD0gUkZDUl9BQU07CisJdmFsID0gKHJlYWRsKHJmY3IpICYgYW5kX21hc2spIHwgb3JfbWFzazsKKwkvKiBSYW1pdCA6IFJGQ1IgV3JpdGUgRml4IGRvYyBzYXlzIFJGRU4gbXVzdCBiZSAwIG1vZGlmeSBvdGhlciBiaXRzICovCisJd3JpdGVsKHZhbCAmIH5SRkNSX1JGRU4sIHJmY3IpOworCXdyaXRlbCh2YWwsIHJmY3IpOworCit9CitzdGF0aWMgdm9pZCBuczgzODIwX3J1bl9iaXN0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgdTMyIGVuYWJsZSwgdTMyIGRvbmUsIHUzMiBmYWlsKQoreworCWludCB0aW1lZF9vdXQgPSAwOworCWxvbmcgc3RhcnQ7CisJdTMyIHN0YXR1czsKKwlpbnQgbG9vcHMgPSAwOworCisJZHByaW50ZigoInN0YXJ0ICVzXG4iLCBuYW1lKSkKKworCSAgICBzdGFydCA9IGN1cnJ0aWNrcygpOworCisJd3JpdGVsKGVuYWJsZSwgbnMtPmJhc2UgKyBQVFNDUik7CisJZm9yICg7OykgeworCQlsb29wcysrOworCQlzdGF0dXMgPSByZWFkbChucy0+YmFzZSArIFBUU0NSKTsKKwkJaWYgKCEoc3RhdHVzICYgZW5hYmxlKSkKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgZG9uZSkKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgZmFpbCkKKwkJCWJyZWFrOworCQlpZiAoKGN1cnJ0aWNrcygpIC0gc3RhcnQpID49IEhaKSB7CisJCQl0aW1lZF9vdXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICYgZmFpbCkKKwkgIHByaW50ZigiJXMgZmFpbGVkISAoMHglaFggJiAweCVoWClcbiIsIG5hbWUsICh1bnNpZ25lZCBpbnQpIHN0YXR1cywgCisJCSAodW5zaWduZWQgaW50KSBmYWlsKTsKKwllbHNlIGlmICh0aW1lZF9vdXQpCisJCXByaW50ZigicnVuX2Jpc3QgJXMgdGltZWQgb3V0ISAoJWhYKVxuIiwgbmFtZSwgKHVuc2lnbmVkIGludCkgc3RhdHVzKTsKKwlkcHJpbnRmKCgiZG9uZSAlcyBpbiAlZCBsb29wc1xuIiwgbmFtZSwgbG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NoZWNrIExpbmsKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzODIwX2NoZWNrX2ludHIoc3RydWN0IG5pYyAqbmljKSB7CisJaW50IGk7CisJdTMyIGlzciA9IHJlYWRsKG5zLT5iYXNlICsgSVNSKTsKKwlpZihJU1JfUEhZICYgaXNyKQorCQlwaHlfaW50cihuaWMpOworCWlmKCggSVNSX1JYSURMRSB8IElTUl9SWERFU0MgfCBJU1JfUlhFUlIpICYgaXNyKQorCQlraWNrX3J4KCk7CisJZm9yIChpID0gMDsgaSA8IE5SX1JYX0RFU0M7IGkrKykgeworCQlpZiAocnhfcmluZ1tpXS5jbWRzdHMgPT0gQ01EU1RTX09XTikgeworLy8JCQlyeF9yaW5nW2ldLmxpbmsgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nW2kgKyAxXSk7CisJCQlyeF9yaW5nW2ldLmNtZHN0cyA9IGNwdV90b19sZTMyKFJFQUxfUlhfQlVGX1NJWkUpOworCQl9CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuczgzODIwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKwl1MzIgY21kc3RzOworCWludCBlbnRyeSA9IG5zLT5jdXJfcng7CisKKwluczgzODIwX2NoZWNrX2ludHIobmljKTsKKworCWNtZHN0cyA9IGxlMzJfdG9fY3B1KHJ4X3JpbmdbZW50cnldLmNtZHN0cyk7CisKKwlpZiAoICEgKCAoQ01EU1RTX09XTiAmIChjbWRzdHMpKSAmJiAoY21kc3RzICE9IChDTURTVFNfT1dOKSkgKSApCisJICByZXR1cm4gMDsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJaWYgKCEgKENNRFNUU19PSyAmIGNtZHN0cykgKQorCSAgcmV0dXJuIDA7CisKKwluaWMtPnBhY2tldGxlbiA9IGNtZHN0cyAmIDB4ZmZmZjsKKwltZW1jcHkobmljLT5wYWNrZXQsCisJICAgICAgIHJ4YiArIChlbnRyeSAqIFJFQUxfUlhfQlVGX1NJWkUpLAorCSAgICAgICBuaWMtPnBhY2tldGxlbik7CisJLy8JCQlyeF9yaW5nW2VudHJ5XS5saW5rID0gMDsKKwlyeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSBjcHVfdG9fbGUzMihDTURTVFNfT1dOKTsKKworCW5zLT5jdXJfcnggPSArK25zLT5jdXJfcnggJSBOUl9SWF9ERVNDOworCisJaWYgKG5zLT5jdXJfcnggPT0gMCkJLyogV2UgaGF2ZSB3cmFwcGVkIHRoZSByaW5nICovCisJICBraWNrX3J4KCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGtpY2tfdHgoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCWRwcmludGYoKCJraWNrX3R4XG4iKSk7CisJd3JpdGVsKENSX1RYRSwgbnMtPmJhc2UgKyBDUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzODIwX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHQsCS8qIFR5cGUgKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KKwkJCSAgICAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisKKwl1MTYgbnN0eXBlOworCXUzMiBjbWRzdHMsIGV4dHN0czsKKwlpbnQgY3VyX3R4ID0gMDsKKwl1MzIgaXNyID0gcmVhZGwobnMtPmJhc2UgKyBJU1IpOworCWlmIChJU1JfVFhJRExFICYgaXNyKQorCQlraWNrX3R4KG5pYyk7CisJLyogcG9pbnQgdG8gdGhlIGN1cnJlbnQgdHhiIGluY2FzZSBtdWx0aXBsZSB0eF9yaW5ncyBhcmUgdXNlZCAqLworCW1lbWNweSh0eGIsIGQsIEVUSF9BTEVOKTsKKwltZW1jcHkodHhiICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CisJbnN0eXBlID0gaHRvbnMoKHUxNikgdCk7CisJbWVtY3B5KHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopICYgbnN0eXBlLCAyKTsKKwltZW1jcHkodHhiICsgRVRIX0hMRU4sIHAsIHMpOworCXMgKz0gRVRIX0hMRU47CisJcyAmPSAweDBGRkY7CisJd2hpbGUgKHMgPCBFVEhfWkxFTikKKwkJdHhiW3MrK10gPSAnXDAnOworCisJLyogU2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKwlleHRzdHMgPSAwOworCWV4dHN0cyB8PSBFWFRTVFNfVURQUEtUOworCisJdHhfcmluZ1tjdXJfdHhdLmJ1ZnB0ciA9IHZpcnRfdG9fbGUzMmRlc2MoJnR4Yik7CisJdHhfcmluZ1tjdXJfdHhdLmV4dHN0cyA9IGNwdV90b19sZTMyKGV4dHN0cyk7CisKKwljbWRzdHMgPSBjcHVfdG9fbGUzMigwKTsKKwljbWRzdHMgfD0gY3B1X3RvX2xlMzIoQ01EU1RTX09XTiB8IHMpOworCXR4X3JpbmdbY3VyX3R4XS5jbWRzdHMgPSBjcHVfdG9fbGUzMihjbWRzdHMpOworCisJd3JpdGVsKHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMF0pLCBucy0+YmFzZSArIFRYRFApOworCWtpY2tfdHgobmljKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzODIwX2Rpc2FibGUgKCBzdHJ1Y3QgbmljICpuaWMgKSB7CisKKwkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KKwkvKiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyAzIHB1cnBvc2VzLgorCSAqIFRoaXMgZGlzYWJsZXMgRE1BIGFuZCBpbnRlcnJ1cHRzIHNvIHdlIGRvbid0IHJlY2VpdmUKKwkgKiAgdW5leHBlY3RlZCBwYWNrZXRzIG9yIGludGVycnVwdHMgZnJvbSB0aGUgY2FyZCBhZnRlcgorCSAqICBldGhlcmJvb3QgaGFzIGZpbmlzaGVkLiAKKwkgKiBUaGlzIGZyZWVzIHJlc291cmNlcyBzbyBldGhlcmJvb3QgbWF5IHVzZQorCSAqICB0aGlzIGRyaXZlciBvbiBhbm90aGVyIGludGVyZmFjZQorCSAqIFRoaXMgYWxsb3dzIGV0aGVyYm9vdCB0byByZWluaXRpYWxpemUgdGhlIGludGVyZmFjZQorCSAqICBpZiBzb21ldGhpbmcgaXMgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisJICovCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDAsIG5zLT5iYXNlICsgSU1SKTsKKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBJRVIpOworCXJlYWRsKG5zLT5iYXNlICsgSUVSKTsKKworCW5zLT51cCA9IDA7CisKKwluczgzODIwX2RvX3Jlc2V0KG5pYywgQ1JfUlNUKTsKKworCW5zLT5JTVJfY2FjaGUgJj0KKwkgICAgfihJU1JfUlhPSyB8IElTUl9SWERFU0MgfCBJU1JfUlhFUlIgfCBJU1JfUlhFQVJMWSB8CisJICAgICAgSVNSX1JYSURMRSk7CisJd3JpdGVsKG5zLT5JTVJfY2FjaGUsIG5zLT5iYXNlICsgSU1SKTsKKworCS8qIHRvdWNoIHRoZSBwY2kgYnVzLi4uICovCisJcmVhZGwobnMtPmJhc2UgKyBJTVIpOworCisJLyogYXNzdW1lcyB0aGUgdHJhbnNtaXR0ZXIgaXMgYWxyZWFkeSBkaXNhYmxlZCBhbmQgcmVzZXQgKi8KKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBSWERQX0hJKTsKKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBSWERQKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJUlEgLSBFbmFibGUsIERpc2FibGUsIG9yIEZvcmNlIGludGVycnVwdHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG5zODM4MjBfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgbnM4MzgyMF9vcGVyYXRpb25zID0geworCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKKwkucG9sbAkJPSBuczgzODIwX3BvbGwsCisJLnRyYW5zbWl0CT0gbnM4MzgyMF90cmFuc21pdCwKKwkuaXJxCQk9IG5zODM4MjBfaXJxLAorCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbnM4MzgyMF9uaWNzW10gPSB7CisJUENJX1JPTSgweDEwMGIsIDB4MDAyMiwgIm5zODM4MjAiLCAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciA4MzgyMCIsIDApLAorfTsKKworUENJX0RSSVZFUiAoIG5zODM4MjBfZHJpdmVyLCBuczgzODIwX25pY3MsIFBDSV9OT19DTEFTUyApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGJvYXJkX2ZvdW5kIDEKKyNkZWZpbmUgdmFsaWRfbGluayAwCitzdGF0aWMgaW50IG5zODM4MjBfcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgKSB7CisKKwlsb25nIGFkZHI7CisJaW50IHVzaW5nX2RhYyA9IDA7CisKKwlpZiAocGNpLT5pb2FkZHIgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoIm5zODM4MjAuYzogRm91bmQgJXMsIHZlbmRvcj0weCVoWCwgZGV2aWNlPTB4JWhYXG4iLAorCSAgICAgICBwY2ktPmRyaXZlcl9uYW1lLCBwY2ktPnZlbmRvciwgcGNpLT5kZXZpY2UpOworCisJLyogcG9pbnQgdG8gcHJpdmF0ZSBzdG9yYWdlICovCisJbnMgPSAmbnN4OworCisJYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworCWFkZHIgPSBwY2lfYmFyX3N0YXJ0KHBjaSwgUENJX0JBU0VfQUREUkVTU18xKTsKKworCW5zLT5iYXNlID0gaW9yZW1hcChhZGRyLCAoMVVMIDw8IDEyKSk7CisKKwlpZiAoIW5zLT5iYXNlKQorCQlyZXR1cm4gMDsKKworCW5pYy0+aXJxbm8gID0gMDsKKwluaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBJTVIpOworCXdyaXRlbCgwLCBucy0+YmFzZSArIElFUik7CisJcmVhZGwobnMtPmJhc2UgKyBJRVIpOworCisJbnMtPklNUl9jYWNoZSA9IDA7CisKKwluczgzODIwX2RvX3Jlc2V0KG5pYywgQ1JfUlNUKTsKKworCS8qIE11c3QgcmVzZXQgdGhlIHJhbSBiaXN0IGJlZm9yZSBydW5uaW5nIGl0ICovCisJd3JpdGVsKFBUU0NSX1JCSVNUX1JTVCwgbnMtPmJhc2UgKyBQVFNDUik7CisJbnM4MzgyMF9ydW5fYmlzdChuaWMsICJzcmFtIGJpc3QiLCBQVFNDUl9SQklTVF9FTiwKKwkJCSBQVFNDUl9SQklTVF9ET05FLCBQVFNDUl9SQklTVF9GQUlMKTsKKwluczgzODIwX3J1bl9iaXN0KG5pYywgImVlcHJvbSBiaXN0IiwgUFRTQ1JfRUVCSVNUX0VOLCAwLAorCQkJIFBUU0NSX0VFQklTVF9GQUlMKTsKKwluczgzODIwX3J1bl9iaXN0KG5pYywgImVlcHJvbSBsb2FkIiwgUFRTQ1JfRUVMT0FEX0VOLCAwLCAwKTsKKworCS8qIEkgbG92ZSBjb25maWcgcmVnaXN0ZXJzICovCisJbnMtPkNGR19jYWNoZSA9IHJlYWRsKG5zLT5iYXNlICsgQ0ZHKTsKKworCWlmICgobnMtPkNGR19jYWNoZSAmIENGR19QQ0k2NF9ERVQpKSB7CisJCXByaW50ZigiJXM6IGRldGVjdGVkIDY0IGJpdCBQQ0kgZGF0YSBidXMuXG4iLCBwY2ktPmRyaXZlcl9uYW1lKTsKKwkJLypkZXYtPkNGR19jYWNoZSB8PSBDRkdfREFUQTY0X0VOOyAqLworCQlpZiAoIShucy0+Q0ZHX2NhY2hlICYgQ0ZHX0RBVEE2NF9FTikpCisJCQlwcmludGYKKwkJCSAgICAoIiVzOiBFRVBST00gZGlkIG5vdCBlbmFibGUgNjQgYml0IGJ1cy4gIERpc2FibGVkLlxuIiwKKwkJCSAgICAgcGNpLT5kcml2ZXJfbmFtZSk7CisJfSBlbHNlCisJCW5zLT5DRkdfY2FjaGUgJj0gfihDRkdfREFUQTY0X0VOKTsKKworCW5zLT5DRkdfY2FjaGUgJj0gKENGR19UQklfRU4gfCBDRkdfTVJNX0RJUyB8IENGR19NV0lfRElTIHwKKwkJCSAgQ0ZHX1Q2NEFERFIgfCBDRkdfREFUQTY0X0VOIHwgQ0ZHX0VYVF8xMjUgfAorCQkJICBDRkdfTTY0QUREUik7CisJbnMtPkNGR19jYWNoZSB8PQorCSAgICBDRkdfUElOVF9EVVBTVFMgfCBDRkdfUElOVF9MTktTVFMgfCBDRkdfUElOVF9TUERTVFMgfAorCSAgICBDRkdfRVhUU1RTX0VOIHwgQ0ZHX0VYRCB8IENGR19QRVNFTDsKKwlucy0+Q0ZHX2NhY2hlIHw9IENGR19SRVFBTEc7CisJbnMtPkNGR19jYWNoZSB8PSBDRkdfUE9XOworCW5zLT5DRkdfY2FjaGUgfD0gQ0ZHX1RNUlRFU1Q7CisKKwkvKiBXaGVuIGNvbXBpbGVkIHdpdGggNjQgYml0IGFkZHJlc3NpbmcsIHdlIG11c3QgYWx3YXlzIGVuYWJsZQorCSAqIHRoZSA2NCBiaXQgZGVzY3JpcHRvciBmb3JtYXQuCisJICovCisjaWZkZWYgVVNFXzY0QklUX0FERFIKKwlucy0+Q0ZHX2NhY2hlIHw9IENGR19NNjRBRERSOworI2VuZGlmCisKKy8vRklYTUU6IEVuYWJsZSBzZWN0aW9uIG9uIGRhYyBvciByZW1vdmUgdGhpcworCWlmICh1c2luZ19kYWMpCisJCW5zLT5DRkdfY2FjaGUgfD0gQ0ZHX1Q2NEFERFI7CisKKwkvKiBCaWcgZW5kaWFuIG1vZGUgZG9lcyBub3Qgc2VlbSB0byBkbyB3aGF0IHRoZSBkb2NzIHN1Z2dlc3QgKi8KKwlucy0+Q0ZHX2NhY2hlICY9IH5DRkdfQkVNOworCisJLyogc2V0dXAgb3B0aWNhbCB0cmFuc2NlaXZlciBpZiB3ZSBoYXZlIG9uZSAqLworCWlmIChucy0+Q0ZHX2NhY2hlICYgQ0ZHX1RCSV9FTikgeworCQlkcHJpbnRmKCgiJXM6IGVuYWJsaW5nIG9wdGljYWwgdHJhbnNjZWl2ZXJcbiIsIHBjaS0+ZHJpdmVyX25hbWUpKTsKKwkJd3JpdGVsKHJlYWRsKG5zLT5iYXNlICsgR1BJT1IpIHwgMHgzZTgsIG5zLT5iYXNlICsgR1BJT1IpOworCisJCS8qIHNldHVwIGF1dG8gbmVnb3RpYXRpb24gZmVhdHVyZSBhZHZlcnRpc2VtZW50ICovCisJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIFRBTkFSKQorCQkgICAgICAgfCBUQU5BUl9IQUxGX0RVUCB8IFRBTkFSX0ZVTExfRFVQLAorCQkgICAgICAgbnMtPmJhc2UgKyBUQU5BUik7CisKKwkJLyogc3RhcnQgYXV0byBuZWdvdGlhdGlvbiAqLworCQl3cml0ZWwoVEJJQ1JfTVJfQU5fRU5BQkxFIHwgVEJJQ1JfTVJfUkVTVEFSVF9BTiwKKwkJICAgICAgIG5zLT5iYXNlICsgVEJJQ1IpOworCQl3cml0ZWwoVEJJQ1JfTVJfQU5fRU5BQkxFLCBucy0+YmFzZSArIFRCSUNSKTsKKwkJbnMtPmxpbmtzdGF0ZSA9IExJTktfQVVUT05FR09USUFURTsKKworCQlucy0+Q0ZHX2NhY2hlIHw9IENGR19NT0RFXzEwMDA7CisJfQorCXdyaXRlbChucy0+Q0ZHX2NhY2hlLCBucy0+YmFzZSArIENGRyk7CisJZHByaW50ZigoIkNGRzogJWhYXG4iLCBucy0+Q0ZHX2NhY2hlKSk7CisKKwkvKiBGSVhNRTogcmVzZXRfcGh5IGlzIGRlZmF1bHRlZCB0byAwLCBzaG91bGQgd2UgcmVzZXQgYW55d2F5PyAqLworCWlmIChyZXNldF9waHkpIHsKKwkJZHByaW50ZigoIiVzOiByZXNldHRpbmcgcGh5XG4iLCBwY2ktPmRyaXZlcl9uYW1lKSk7CisJCXdyaXRlbChucy0+Q0ZHX2NhY2hlIHwgQ0ZHX1BIWV9SU1QsIG5zLT5iYXNlICsgQ0ZHKTsKKwkJd3JpdGVsKG5zLT5DRkdfY2FjaGUsIG5zLT5iYXNlICsgQ0ZHKTsKKwl9CisjaWYgMAkJCQkvKiBIdWg/ICBUaGlzIHNldHMgdGhlIFBDSSBsYXRlbmN5IHJlZ2lzdGVyLiAgU2hvdWxkIGJlIGRvbmUgdmlhIAorCQkJCSAqIHRoZSBQQ0kgbGF5ZXIuICBGSVhNRS4KKwkJCQkgKi8KKwlpZiAocmVhZGwoZGV2LT5iYXNlICsgU1JSKSkKKwkJd3JpdGVsKHJlYWRsKGRldi0+YmFzZSArIDB4MjBjKSB8IDB4ZmUwMCwKKwkJICAgICAgIGRldi0+YmFzZSArIDB4MjBjKTsKKyNlbmRpZgorCisJLyogTm90ZSEgIFRoZSBETUEgYnVyc3Qgc2l6ZSBpbnRlcmFjdHMgd2l0aCBwYWNrZXQKKwkgKiB0cmFuc21pc3Npb24sIHN1Y2ggdGhhdCB0aGUgbGFyZ2VzdCBwYWNrZXQgdGhhdAorCSAqIGNhbiBiZSB0cmFuc21pdHRlZCBpcyA4MTkyIC0gRkxUSCAtIGJ1cnN0IHNpemUuCisJICogSWYgb25seSB0aGUgdHJhbnNtaXQgZmlmbyB3YXMgbGFyZ2VyLi4uCisJICovCisJLyogUmFtaXQgOiAxMDI0IERNQSBpcyBub3QgYSBnb29kIGlkZWEsIGl0IGVuZHMgdXAgYmFuZ2luZyAKKwkgKiBzb21lIERFTEwgYW5kIENPTVBBUSBTTVAgc3lzdGVtcyAqLworCXdyaXRlbChUWENGR19DU0kgfCBUWENGR19IQkkgfCBUWENGR19BVFAgfCBUWENGR19NWERNQTUxMgorCSAgICAgICB8ICgoMTYwMCAvIDMyKSAqIDB4MTAwKSwgbnMtPmJhc2UgKyBUWENGRyk7CisKKwkvKiBTZXQgUnggdG8gZnVsbCBkdXBsZXgsIGRvbid0IGFjY2VwdCBydW50LCBlcnJvcmVkLCBsb25nIG9yIGxlbmd0aAorCSAqIHJhbmdlIGVycm9yZWQgcGFja2V0cy4gIFVzZSA1MTIgYnl0ZSBETUEuCisJICovCisJLyogUmFtaXQgOiAxMDI0IERNQSBpcyBub3QgYSBnb29kIGlkZWEsIGl0IGVuZHMgdXAgYmFuZ2luZyAKKwkgKiBzb21lIERFTEwgYW5kIENPTVBBUSBTTVAgc3lzdGVtcyAKKwkgKiBUdXJuIG9uIEFMUCwgb25seSB3ZSBhcmUgYWNjcGV0aW5nIEp1bWJvIFBhY2tldHMgKi8KKwl3cml0ZWwoUlhDRkdfQUVQIHwgUlhDRkdfQVJQIHwgUlhDRkdfQUlSTCB8IFJYQ0ZHX1JYX0ZECisJICAgICAgIHwgUlhDRkdfU1RSSVBDUkMKKwkgICAgICAgLy98IFJYQ0ZHX0FMUAorCSAgICAgICB8IChSWENGR19NWERNQTUxMikgfCAwLCBucy0+YmFzZSArIFJYQ0ZHKTsKKworCS8qIERpc2FibGUgcHJpb3JpdHkgcXVldWVpbmcgKi8KKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBQUUNSKTsKKworCS8qIEVuYWJsZSBJUCBjaGVja3N1bSB2YWxpZGF0aW9uIGFuZCBkZXRldGlvbiBvZiBWTEFOIGhlYWRlcnMuCisJICogTm90ZTogZG8gbm90IHNldCB0aGUgcmVqZWN0IG9wdGlvbnMgYXMgYXQgbGVhc3QgdGhlIDB4MTAyCisJICogcmV2aXNpb24gb2YgdGhlIGNoaXAgZG9lcyBub3QgcHJvcGVybHkgYWNjZXB0IElQIGZyYWdtZW50cworCSAqIGF0IGxlYXN0IGZvciBVRFAuCisJICovCisJLyogUmFtaXQgOiBCZSBzdXJlIHRvIHR1cm4gb24gUlhDRkdfQVJQIGlmIFZMQU4ncyBhcmUgZW5hYmxlZCwgc2luY2UKKwkgKiB0aGUgTUFDIGl0IGNhbGN1bGF0ZXMgdGhlIHBhY2tldHNpemUgQUZURVIgc3RyaXBwaW5nIHRoZSBWTEFOCisJICogaGVhZGVyLCBhbmQgaWYgYSBWTEFOIFRhZ2dlZCBwYWNrZXQgb2YgNjQgYnl0ZXMgaXMgcmVjZWl2ZWQgKGxpa2UKKwkgKiBhIHBpbmcgd2l0aCBhIFZMQU4gaGVhZGVyKSB0aGVuIHRoZSBjYXJkLCBzdHJpcHMgdGhlIDQgYnl0ZSBWTEFOCisJICogdGFnIGFuZCB0aGVuIGNoZWNrcyB0aGUgcGFja2V0IHNpemUsIHNvIGlmIFJYQ0ZHX0FSUCBpcyBub3QgZW5hYmxlZCwKKwkgKiBpdCBkaXNjcmFyZHMgaXQhLiAgVGhlc2UgZ3V5cy4uLi4uLgorCSAqLworCXdyaXRlbChWUkNSX0lQRU4gfCBWUkNSX1ZUREVOLCBucy0+YmFzZSArIFZSQ1IpOworCisJLyogRW5hYmxlIHBlci1wYWNrZXQgVENQL1VEUC9JUCBjaGVja3N1bW1pbmcgKi8KKwl3cml0ZWwoVlRDUl9QUENISywgbnMtPmJhc2UgKyBWVENSKTsKKworCS8qIFJhbWl0IDogRW5hYmxlIGFzeW5jIGFuZCBzeW5jIHBhdXNlIGZyYW1lcyAqLworLy8gICAgICB3cml0ZWwoMCwgbnMtPmJhc2UgKyBQQ1IpOyAKKwl3cml0ZWwoKFBDUl9QU19NQ0FTVCB8IFBDUl9QU19EQSB8IFBDUl9QU0VOIHwgUENSX0ZGTE9fNEsgfAorCQlQQ1JfRkZISV84SyB8IFBDUl9TVExPXzQgfCBQQ1JfU1RISV84IHwgUENSX1BBVVNFX0NOVCksCisJICAgICAgIG5zLT5iYXNlICsgUENSKTsKKworCS8qIERpc2FibGUgV2FrZSBPbiBMYW4gKi8KKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBXQ1NSKTsKKworCW5zODM4MjBfZ2V0bWFjKG5pYywgbmljLT5ub2RlX2FkZHIpOworCisJaWYgKHVzaW5nX2RhYykgeworCQlkcHJpbnRmKCgiJXM6IHVzaW5nIDY0IGJpdCBhZGRyZXNzaW5nLlxuIiwgcGNpLT5kcml2ZXJfbmFtZSkpOworCX0KKworCWRwcmludGYoKCIlczogRFA4MzgyMCAlZC4lZDogJSEgaW89MHglaFhcbiIsCisJCSBwY2ktPmRyaXZlcl9uYW1lLAorCQkgKHVuc2lnbmVkKSByZWFkbChucy0+YmFzZSArIFNSUikgPj4gOCwKKwkJICh1bnNpZ25lZCkgcmVhZGwobnMtPmJhc2UgKyBTUlIpICYgMHhmZiwKKwkJIG5pYy0+bm9kZV9hZGRyLCBwY2ktPmlvYWRkcikpOworCisjaWZkZWYgUEhZX0NPREVfSVNfRklOSVNIRUQKKwluczgzODIwX3Byb2JlX3BoeShkZXYpOworI2VuZGlmCisKKwluczgzODIwX3Jlc2V0KG5pYyk7CisJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJbmljLT5uaWNfb3AJPSAmbnM4MzgyMF9vcGVyYXRpb25zOworCXJldHVybiAxOworfQorCitEUklWRVIgKCAiTlM4MzgyMC9QQ0kiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCBuczgzODIwX2RyaXZlciwKKwkgbnM4MzgyMF9wcm9iZSwgbnM4MzgyMF9kaXNhYmxlICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9uczgzOTAuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L25zODM5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjExNDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9uczgzOTAuYwpAQCAtMCwwICsxLDEwMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIRVJCT09UIC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KKworQXV0aG9yOiBNYXJ0aW4gUmVudGVycworICBEYXRlOiBNYXkvOTQKKworIFRoaXMgY29kZSBpcyBiYXNlZCBoZWF2aWx5IG9uIERhdmlkIEdyZWVubWFuJ3MgaWZfZWQuYyBkcml2ZXIKKworIENvcHlyaWdodCAoQykgMTk5My0xOTk0LCBEYXZpZCBHcmVlbm1hbiwgTWFydGluIFJlbnRlcnMuCisgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQsIG1vZGlmaWVkLCBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgc29sZCwgaW4KKyAgYm90aCBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgdGhlc2UKKyAgdGVybXMgYXJlIHJldGFpbmVkLiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIGFyZSB0aGUgYXV0aG9ycyByZXNwb25zaWJsZSBmb3IKKyAgdGhlIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGlzIHNvZnR3YXJlLCBub3IgZG8gdGhlIGF1dGhvcnMgYXNzdW1lIGFueQorICByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyBpbmN1cnJlZCB3aXRoIGl0cyB1c2UuCisKK011bHRpY2FzdCBzdXBwb3J0IGFkZGVkIGJ5IFRpbW90aHkgTGVnZ2UgKHRpbWxlZ2dlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkgMDkvMjgvMjAwMworUmVsb2NhdGlvbiBzdXBwb3J0IGFkZGVkIGJ5IEtlbiBZYXAgKGtlbl95YXBAdXNlcnMuc291cmNlZm9yZ2UubmV0KSAyOC8xMi8wMgorM2M1MDMgc3VwcG9ydCBhZGRlZCBieSBCaWxsIFBhdWwgKHdwYXVsQGN0ci5jb2x1bWJpYS5lZHUpIG9uIDExLzE1Lzk0CitTTUM4NDE2IHN1cHBvcnQgYWRkZWQgYnkgQmlsbCBQYXVsICh3cGF1bEBjdHIuY29sdW1iaWEuZWR1KSBvbiAxMi8yNS85NAorM2M1MDMgUElPIHN1cHBvcnQgYWRkZWQgYnkgSmltIEhhZ3VlIChqaW0uaGFndWVAYWNtLm9yZykgb24gMi8xNy85OAorUlggb3ZlcnJ1biBieSBLbGF1cyBFc3BlbmxhdWIgKGVzcGVubGF1YkBpbmZvcm1hdGlrLnVuaS11bG0uZGUpIG9uIDMvMTAvOTkKKyAgcGFydHMgdGFrZW4gZnJvbSB0aGUgTGludXggODM5MCBkcml2ZXIgKGJ5IERvbmFsZCBCZWNrZXIgYW5kIFBhdWwgR29ydG1ha2VyKQorU01DODQxNiBQSU8gc3VwcG9ydCBhZGRlZCBieSBBbmRyZXcgQmV0dGlzb24gKGFuZHJld2JAemlwLmNvbS5hdSkgb24gNC8zLzAyCisgIGJhc2VkIG9uIHRoZSBMaW51eCA4MzkwIGRyaXZlciAoYnkgRG9uYWxkIEJlY2tlciBhbmQgUGF1bCBHb3J0bWFrZXIpCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGSUxFX0xJQ0VOQ0UgKCBCU0QyICk7CisKKy8qICN3YXJuaW5nICJuczgzOTAuYzogRklYTUU6IHNwbGl0IElTQSBhbmQgUENJLCBjbGVhbiB1cCIgKi8KKworI2lmIDEKKworI2lmICFkZWZpbmVkKElOQ0xVREVfTlM4MzkwKSAmJiAhZGVmaW5lZChJTkNMVURFX1dEKSAmJiBcCisgICAgIWRlZmluZWQoSU5DTFVERV9ORSkgJiYgIWRlZmluZWQoSU5DTFVERV8zQzUwMykKKyAgLyogVGhlIGRyaXZlciBuYW1lZCBuczgzOTAgaXMgdGhlIFBDSSBkcml2ZXIsIG9mdGVuIGNhbGxlZAorICAgICAiUENJIG5lMjAwMCBjbG9uZXMiLiAqLworIyBkZWZpbmUgSU5DTFVERV9OUzgzOTAgMQorI2VuZGlmCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICJuczgzOTAuaCIKKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaWZkZWYJSU5DTFVERV9OUzgzOTAKKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxncHhlL2lzYS5oPgorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCWV0aF92ZW5kb3IsIGV0aF9mbGFnczsKKyNpZmRlZglJTkNMVURFX1dECitzdGF0aWMgdW5zaWduZWQgY2hhcglldGhfbGFhcjsKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIHNob3J0CWV0aF9uaWNfYmFzZSwgZXRoX2FzaWNfYmFzZTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCWV0aF9tZW1zaXplLCBldGhfcnhfc3RhcnQsIGV0aF90eF9zdGFydDsKK3N0YXRpYyBBZGRyZXNzCQlldGhfYm1lbSwgZXRoX3JtZW07CitzdGF0aWMgdW5zaWduZWQgY2hhcglldGhfZHJhaW5fcmVjZWl2ZXI7CisKKyNpZmRlZglJTkNMVURFX1dECitzdGF0aWMgc3RydWN0IHdkX2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgaWQ7CisJY2hhciBmbGFnczsKKwljaGFyIG1lbXNpemU7Cit9IHdkX2JvYXJkc1tdID0geworCXsiV0Q4MDAzUyIsCVRZUEVfV0Q4MDAzUywJMCwJCQlNRU1fODE5Mn0sCisJeyJXRDgwMDNFIiwJVFlQRV9XRDgwMDNFLAkwLAkJCU1FTV84MTkyfSwKKwl7IldEODAxM0VCVCIsCVRZUEVfV0Q4MDEzRUJULAlGTEFHXzE2QklULAkJTUVNXzE2Mzg0fSwKKwl7IldEODAwM1ciLAlUWVBFX1dEODAwM1csCTAsCQkJTUVNXzgxOTJ9LAorCXsiV0Q4MDAzRUIiLAlUWVBFX1dEODAwM0VCLAkwLAkJCU1FTV84MTkyfSwKKwl7IldEODAxM1ciLAlUWVBFX1dEODAxM1csCUZMQUdfMTZCSVQsCQlNRU1fMTYzODR9LAorCXsiV0Q4MDAzRVAvV0Q4MDEzRVAiLAorCQkJVFlQRV9XRDgwMTNFUCwJMCwJCQlNRU1fODE5Mn0sCisJeyJXRDgwMTNXQyIsCVRZUEVfV0Q4MDEzV0MsCUZMQUdfMTZCSVQsCQlNRU1fMTYzODR9LAorCXsiV0Q4MDEzRVBDIiwJVFlQRV9XRDgwMTNFUEMsCUZMQUdfMTZCSVQsCQlNRU1fMTYzODR9LAorCXsiU01DODIxNlQiLAlUWVBFX1NNQzgyMTZULAlGTEFHXzE2QklUIHwgRkxBR183OTAsCU1FTV8xNjM4NH0sCisJeyJTTUM4MjE2QyIsCVRZUEVfU01DODIxNkMsCUZMQUdfMTZCSVQgfCBGTEFHXzc5MCwJTUVNXzE2Mzg0fSwKKwl7IlNNQzg0MTZUIiwJVFlQRV9TTUM4NDE2VCwJRkxBR18xNkJJVCB8IEZMQUdfNzkwLAlNRU1fODE5Mn0sCisJeyJTTUM4NDE2Qy9CVCIsCVRZUEVfU01DODQxNkMsCUZMQUdfMTZCSVQgfCBGTEFHXzc5MCwJTUVNXzgxOTJ9LAorCXsiU01DODAxM0VCUCIsCVRZUEVfU01DODAxM0VCUCxGTEFHXzE2QklULAkJTUVNXzE2Mzg0fSwKKwl7TlVMTCwJCTAsCQkwLAkJCTB9Cit9OworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFXzNDNTAzCitzdGF0aWMgdW5zaWduZWQgY2hhcgl0NTAzX291dHB1dDsJLyogQVVJIG9yIGludGVybmFsIHhjdnIgKFRoaW5uZXQpICovCisjZW5kaWYKKworI2lmCWRlZmluZWQoSU5DTFVERV9XRCkKKyNkZWZpbmUJQVNJQ19QSU8JV0RfSUFSCisjZGVmaW5lCWV0aF9wcm9iZQl3ZF9wcm9iZQorI2lmCWRlZmluZWQoSU5DTFVERV8zQzUwMykgfHwgZGVmaW5lZChJTkNMVURFX05FKSB8fCBkZWZpbmVkKElOQ0xVREVfTlM4MzkwKQorRXJyb3IgeW91IG11c3Qgb25seSBkZWZpbmUgb25lIG9mIElOQ0xVREVfV0QsIElOQ0xVREVfM0M1MDMsIElOQ0xVREVfTkUsIElOQ0xVREVfTlM4MzkwCisjZW5kaWYKKyNlbmRpZgorCisjaWYJZGVmaW5lZChJTkNMVURFXzNDNTAzKQorI2RlZmluZQlldGhfcHJvYmUJdDUwM19wcm9iZQorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkgfHwgZGVmaW5lZChJTkNMVURFX1dEKQorRXJyb3IgeW91IG11c3Qgb25seSBkZWZpbmUgb25lIG9mIElOQ0xVREVfV0QsIElOQ0xVREVfM0M1MDMsIElOQ0xVREVfTkUsIElOQ0xVREVfTlM4MzkwCisjZW5kaWYKKyNlbmRpZgorCisjaWYJZGVmaW5lZChJTkNMVURFX05FKQorI2RlZmluZQlldGhfcHJvYmUJbmVfcHJvYmUKKyNpZglkZWZpbmVkKElOQ0xVREVfTlM4MzkwKSB8fCBkZWZpbmVkKElOQ0xVREVfM0M1MDMpIHx8IGRlZmluZWQoSU5DTFVERV9XRCkKK0Vycm9yIHlvdSBtdXN0IG9ubHkgZGVmaW5lIG9uZSBvZiBJTkNMVURFX1dELCBJTkNMVURFXzNDNTAzLCBJTkNMVURFX05FLCBJTkNMVURFX05TODM5MAorI2VuZGlmCisjZW5kaWYKKworI2lmCWRlZmluZWQoSU5DTFVERV9OUzgzOTApCisjZGVmaW5lCWV0aF9wcm9iZQluZXBjaV9wcm9iZQorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFXzNDNTAzKSB8fCBkZWZpbmVkKElOQ0xVREVfV0QpCitFcnJvciB5b3UgbXVzdCBvbmx5IGRlZmluZSBvbmUgb2YgSU5DTFVERV9XRCwgSU5DTFVERV8zQzUwMywgSU5DTFVERV9ORSwgSU5DTFVERV9OUzgzOTAKKyNlbmRpZgorI2VuZGlmCisKKyNpZglkZWZpbmVkKElOQ0xVREVfM0M1MDMpCisjZGVmaW5lCUFTSUNfUElPCV8zQ09NX1JGTVNCCisjZWxzZQorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkKKyNkZWZpbmUJQVNJQ19QSU8JTkVfREFUQQorI2VuZGlmCisjZW5kaWYKKworI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkgfHwgKGRlZmluZWQoSU5DTFVERV8zQzUwMykgJiYgIWRlZmluZWQoVDUwM19TSE1FTSkpIHx8IChkZWZpbmVkKElOQ0xVREVfV0QpICYmIGRlZmluZWQoV0RfNzkwX1BJTykpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9QSU9fUkVBRCAtIFJlYWQgYSBmcmFtZSB2aWEgUHJvZ3JhbW1lZCBJL08KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3Bpb19yZWFkKHVuc2lnbmVkIGludCBzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGNudCkKK3sKKyNpZmRlZglJTkNMVURFX1dECisJb3V0YihzcmMgJiAweGZmLCBldGhfYXNpY19iYXNlICsgV0RfR1AyKTsKKwlvdXRiKHNyYyA+PiA4LCBldGhfYXNpY19iYXNlICsgV0RfR1AyKTsKKyNlbHNlCisJb3V0YihEODM5MF9DT01NQU5EX1JEMiB8CisJCUQ4MzkwX0NPTU1BTkRfU1RBLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9DT01NQU5EKTsKKwlvdXRiKGNudCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUkJDUjApOworCW91dGIoY250Pj44LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SQkNSMSk7CisJb3V0YihzcmMsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1JTQVIwKTsKKwlvdXRiKHNyYz4+OCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUlNBUjEpOworCW91dGIoRDgzOTBfQ09NTUFORF9SRDAgfAorCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisKKyNpZmRlZglJTkNMVURFXzNDNTAzCisJb3V0YihzcmMgJiAweGZmLCBldGhfYXNpY19iYXNlICsgXzNDT01fREFMU0IpOworCW91dGIoc3JjID4+IDgsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9EQU1TQik7CisJb3V0Yih0NTAzX291dHB1dCB8IF8zQ09NX0NSX1NUQVJULCBldGhfYXNpY19iYXNlICsgXzNDT01fQ1IpOworI2VuZGlmCisjZW5kaWYKKworCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKQorCQljbnQgPSAoY250ICsgMSkgPj4gMTsKKworCXdoaWxlKGNudC0tKSB7CisjaWZkZWYJSU5DTFVERV8zQzUwMworCQl3aGlsZSgoaW5iKGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9TVFJFRykgJiBfM0NPTV9TVFJFR19EUFJEWSkgPT0gMCkKKwkJCTsKKyNlbmRpZgorCisJCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSB7CisJCQkqKCh1bnNpZ25lZCBzaG9ydCAqKWRzdCkgPSBpbncoZXRoX2FzaWNfYmFzZSArIEFTSUNfUElPKTsKKwkJCWRzdCArPSAyOworCQl9CisJCWVsc2UKKwkJCSooZHN0KyspID0gaW5iKGV0aF9hc2ljX2Jhc2UgKyBBU0lDX1BJTyk7CisJfQorCisjaWZkZWYJSU5DTFVERV8zQzUwMworCW91dGIodDUwM19vdXRwdXQsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9DUik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhfUElPX1dSSVRFIC0gV3JpdGUgYSBmcmFtZSB2aWEgUHJvZ3JhbW1lZCBJL08KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3Bpb193cml0ZShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGludCBkc3QsIHVuc2lnbmVkIGludCBjbnQpCit7CisjaWZkZWYJQ09NUEVYX1JMMjAwMF9GSVgKKwl1bnNpZ25lZCBpbnQgeDsKKyNlbmRpZgkvKiBDT01QRVhfUkwyMDAwX0ZJWCAqLworI2lmZGVmCUlOQ0xVREVfV0QKKwlvdXRiKGRzdCAmIDB4ZmYsIGV0aF9hc2ljX2Jhc2UgKyBXRF9HUDIpOworCW91dGIoZHN0ID4+IDgsIGV0aF9hc2ljX2Jhc2UgKyBXRF9HUDIpOworI2Vsc2UKKwlvdXRiKEQ4MzkwX0NPTU1BTkRfUkQyIHwKKwkJRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX0NPTU1BTkQpOworCW91dGIoRDgzOTBfSVNSX1JEQywgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfSVNSKTsKKwlvdXRiKGNudCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUkJDUjApOworCW91dGIoY250Pj44LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SQkNSMSk7CisJb3V0Yihkc3QsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1JTQVIwKTsKKwlvdXRiKGRzdD4+OCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUlNBUjEpOworCW91dGIoRDgzOTBfQ09NTUFORF9SRDEgfAorCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisKKyNpZmRlZglJTkNMVURFXzNDNTAzCisJb3V0Yihkc3QgJiAweGZmLCBldGhfYXNpY19iYXNlICsgXzNDT01fREFMU0IpOworCW91dGIoZHN0ID4+IDgsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9EQU1TQik7CisKKwlvdXRiKHQ1MDNfb3V0cHV0IHwgXzNDT01fQ1JfRERJUiB8IF8zQ09NX0NSX1NUQVJULCBldGhfYXNpY19iYXNlICsgXzNDT01fQ1IpOworI2VuZGlmCisjZW5kaWYKKworCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKQorCQljbnQgPSAoY250ICsgMSkgPj4gMTsKKworCXdoaWxlKGNudC0tKQorCXsKKyNpZmRlZglJTkNMVURFXzNDNTAzCisJCXdoaWxlKChpbmIoZXRoX2FzaWNfYmFzZSArIF8zQ09NX1NUUkVHKSAmIF8zQ09NX1NUUkVHX0RQUkRZKSA9PSAwKQorCQkJOworI2VuZGlmCisKKwkJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKKwkJCW91dHcoKigodW5zaWduZWQgc2hvcnQgKilzcmMpLCBldGhfYXNpY19iYXNlICsgQVNJQ19QSU8pOworCQkJc3JjICs9IDI7CisJCX0KKwkJZWxzZQorCQkJb3V0YigqKHNyYysrKSwgZXRoX2FzaWNfYmFzZSArIEFTSUNfUElPKTsKKwl9CisKKyNpZmRlZglJTkNMVURFXzNDNTAzCisJb3V0Yih0NTAzX291dHB1dCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0NSKTsKKyNlbHNlCisjaWZkZWYJQ09NUEVYX1JMMjAwMF9GSVgKKwlmb3IgKHggPSAwOworCQl4IDwgQ09NUEVYX1JMMjAwMF9UUklFUyAmJgorCQkoaW5iKGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX0lTUikgJiBEODM5MF9JU1JfUkRDKQorCQkhPSBEODM5MF9JU1JfUkRDOworCQkrK3gpOworCWlmICh4ID49IENPTVBFWF9STDIwMDBfVFJJRVMpCisJCXByaW50ZigiV2FybmluZzogQ29tcGV4IFJMMjAwMCBhYm9ydGVkIHdhaXQhXG4iKTsKKyNlbmRpZgkvKiBDT01QRVhfUkwyMDAwX0ZJWCAqLworI2lmbmRlZglJTkNMVURFX1dECisJd2hpbGUoKGluYihldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9JU1IpICYgRDgzOTBfSVNSX1JEQykKKwkJIT0gRDgzOTBfSVNSX1JEQyk7CisjZW5kaWYKKyNlbmRpZgorfQorI2Vsc2UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BJT19SRUFEIC0gRHVtbXkgcm91dGluZSB3aGVuIE5FMjAwMCBub3QgY29tcGlsZWQgaW4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3Bpb19yZWFkKHVuc2lnbmVkIGludCBzcmMgX191bnVzZWQsIHVuc2lnbmVkIGNoYXIgKmRzdCAgX191bnVzZWQsIHVuc2lnbmVkIGludCBjbnQgX191bnVzZWQpIHt9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2VuYWJsZV9tdWx0eWNhc3QgLSBFbmFibGUgTXVsdGljYXN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9tdWx0aWNhc3QodW5zaWduZWQgc2hvcnQgZXRoX25pY19iYXNlKSAKK3sKKwl1bnNpZ25lZCBjaGFyIG1jZmlsdGVyWzhdOworCWludCBpOworCW1lbXNldChtY2ZpbHRlciwgMHhGRiwgOCk7CisJb3V0Yig0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkNSKTsJCisJb3V0YihEODM5MF9DT01NQU5EX1JEMiArIEQ4MzkwX0NPTU1BTkRfUFMxLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9DT01NQU5EKTsKKwlmb3IoaT0wO2k8ODtpKyspCisJeworCQlvdXRiKG1jZmlsdGVyW2ldLCBldGhfbmljX2Jhc2UgKyA4ICsgaSk7CisJCWlmKGluYihldGhfbmljX2Jhc2UgKyA4ICsgaSkhPW1jZmlsdGVyW2ldKQorCQkJcHJpbnRmKCJFcnJvciBTTUMgODNDNjkwIE11bHRpY2FzdCBmaWx0ZXIgcmVhZC93cml0ZSBtaXNoYXAgJWRcbiIsaSk7CisJfQorCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgKyBEODM5MF9DT01NQU5EX1BTMCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0Yig0IHwgMHgwOCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JDUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTlM4MzkwX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzOTBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCWludCBpOworCisJZXRoX2RyYWluX3JlY2VpdmVyID0gMDsKKyNpZmRlZglJTkNMVURFX1dECisJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKQorCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwgRDgzOTBfQ09NTUFORF9TVFAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwllbHNlCisjZW5kaWYKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8IEQ4MzkwX0NPTU1BTkRfUkQyIHwKKwkJCUQ4MzkwX0NPTU1BTkRfU1RQLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpCisJCW91dGIoMHg0OSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0RDUik7CisJZWxzZQorCQlvdXRiKDB4NDgsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9EQ1IpOworCW91dGIoMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JCQ1IwKTsKKwlvdXRiKDAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9SQkNSMSk7CisJb3V0YigweDIwLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkNSKTsJLyogbW9uaXRvciBtb2RlICovCisJb3V0YigyLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfVENSKTsKKwlvdXRiKGV0aF90eF9zdGFydCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RQU1IpOworCW91dGIoZXRoX3J4X3N0YXJ0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUFNUQVJUKTsKKyNpZmRlZglJTkNMVURFX1dECisJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CisjaWZkZWYJV0RfNzkwX1BJTworCQlvdXRiKDB4MTAsIGV0aF9hc2ljX2Jhc2UgKyAweDA2KTsgLyogZGlzYWJsZSBpbnRlcnJ1cHRzLCBlbmFibGUgUElPICovCisJCW91dGIoMHgwMSwgZXRoX25pY19iYXNlICsgMHgwOSk7IC8qIGVuYWJsZSByaW5nIHJlYWQgYXV0by13cmFwICovCisjZWxzZQorCQlvdXRiKDAsIGV0aF9uaWNfYmFzZSArIDB4MDkpOworI2VuZGlmCisJfQorI2VuZGlmCisJb3V0YihldGhfbWVtc2l6ZSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1BTVE9QKTsKKwlvdXRiKGV0aF9tZW1zaXplIC0gMSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0JPVU5EKTsKKwlvdXRiKDB4RkYsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9JU1IpOworCW91dGIoMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0lNUik7CisjaWZkZWYJSU5DTFVERV9XRAorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMSB8CisJCQlEODM5MF9DT01NQU5EX1NUUCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCWVsc2UKKyNlbmRpZgorCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMxIHwKKwkJCUQ4MzkwX0NPTU1BTkRfUkQyIHwgRDgzOTBfQ09NTUFORF9TVFAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKQorCQlvdXRiKG5pYy0+bm9kZV9hZGRyW2ldLCBldGhfbmljX2Jhc2UrRDgzOTBfUDFfUEFSMCtpKTsKKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKQorCQlvdXRiKDB4RkYsIGV0aF9uaWNfYmFzZStEODM5MF9QMV9NQVIwK2kpOworCW91dGIoZXRoX3J4X3N0YXJ0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDFfQ1VSUik7CisjaWZkZWYJSU5DTFVERV9XRAorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8CisJCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCWVsc2UKKyNlbmRpZgorCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwKKwkJCUQ4MzkwX0NPTU1BTkRfUkQyIHwgRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwlvdXRiKDB4RkYsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9JU1IpOworCW91dGIoMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RDUik7CS8qIHRyYW5zbWl0dGVyIG9uICovCisJb3V0Yig0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkNSKTsJLyogYWxsb3cgcnggYnJvYWRjYXN0IGZyYW1lcyAqLworCisJZW5hYmxlX211bHRpY2FzdChldGhfbmljX2Jhc2UpOworCisjaWZkZWYJSU5DTFVERV8zQzUwMworICAgICAgICAvKgorICAgICAgICAgKiBObyB3YXkgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB3ZSdyZSBzdXBwb3NlZCB0byB1c2UKKyAgICAgICAgICogdGhlIDNDb20ncyB0cmFuc2NlaXZlciB1bmxlc3MgdGhlIHVzZXIgdGVsbHMgdXMuCisgICAgICAgICAqICdmbGFncycgc2hvdWxkIGhhdmUgc29tZSBjb21waWxlIHRpbWUgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgKiB3aGljaCBjYW4gYmUgY2hhbmdlZCBmcm9tIHRoZSBjb21tYW5kIG1lbnUuCisgICAgICAgICAqLworCXQ1MDNfb3V0cHV0ID0gKG5pYy0+ZmxhZ3MpID8gMCA6IF8zQ09NX0NSX1hTRUw7CisJb3V0Yih0NTAzX291dHB1dCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0NSKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IG5zODM5MF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKTsKKworI2lmbmRlZglJTkNMVURFXzNDNTAzCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9SWF9PVkVSUlVOIC0gQnJpbmcgYWRhcHRlciBiYWNrIHRvIHdvcmsgYWZ0ZXIgYW4gUlggb3ZlcnJ1bgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhfcnhfb3ZlcnJ1bihzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50IHN0YXJ0X3RpbWU7CisKKyNpZmRlZglJTkNMVURFX1dECisJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKQorCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwgRDgzOTBfQ09NTUFORF9TVFAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwllbHNlCisjZW5kaWYKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8IEQ4MzkwX0NPTU1BTkRfUkQyIHwKKwkJCUQ4MzkwX0NPTU1BTkRfU1RQLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisKKwkvKiB3YWl0IGZvciBhdCBsZWFzdCAxLjZtcyAtIHdlIHdhaXQgb25lIHRpbWVyIHRpY2sgKi8KKwlzdGFydF90aW1lID0gY3VycnRpY2tzKCk7CisJd2hpbGUgKGN1cnJ0aWNrcygpIC0gc3RhcnRfdGltZSA8PSAxKQorCQkvKiBOb3RoaW5nICovOworCisJb3V0YigwLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkJDUjApOwkvKiByZXNldCBieXRlIGNvdW50ZXIgKi8KKwlvdXRiKDAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9SQkNSMSk7CisKKwkvKgorCSAqIExpbnV4IGRyaXZlciBjaGVja3MgZm9yIGludGVycnVwdGVkIFRYIGhlcmUuIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSwKKwkgKiBiZWNhdXNlIHRoZSB0cmFuc21pdCByb3V0aW5lIHdhaXRzIHVudGlsIHRoZSBmcmFtZSBpcyBzZW50LgorCSAqLworCisJLyogZW50ZXIgbG9vcGJhY2sgbW9kZSBhbmQgcmVzdGFydCBOSUMgKi8KKwlvdXRiKDIsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UQ1IpOworI2lmZGVmCUlOQ0xVREVfV0QKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApCisJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfCBEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCWVsc2UKKyNlbmRpZgorCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwgRDgzOTBfQ09NTUFORF9SRDIgfAorCQkJRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKworCS8qIGNsZWFyIHRoZSBSWCByaW5nLCBhY2tub3dsZWRnZSBvdmVycnVuIGludGVycnVwdCAqLworCWV0aF9kcmFpbl9yZWNlaXZlciA9IDE7CisJd2hpbGUgKG5zODM5MF9wb2xsKG5pYywgMSkpCisJCS8qIE5vdGhpbmcgKi87CisJZXRoX2RyYWluX3JlY2VpdmVyID0gMDsKKwlvdXRiKEQ4MzkwX0lTUl9PVlcsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9JU1IpOworCisJLyogbGVhdmUgbG9vcGJhY2sgbW9kZSAtIG5vIHBhY2tldHMgdG8gYmUgcmVzZW50IChzZWUgTGludXggZHJpdmVyKSAqLworCW91dGIoMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RDUik7Cit9CisjZW5kaWYJLyogSU5DTFVERV8zQzUwMyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK05TODM5MF9UUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbnM4MzkwX3RyYW5zbWl0KAorCXN0cnVjdCBuaWMgKm5pYywKKwljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCisJdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLworCXVuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KKwljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLworeworI2lmIGRlZmluZWQoSU5DTFVERV8zQzUwMykgfHwgKGRlZmluZWQoSU5DTFVERV9XRCkgJiYgISBkZWZpbmVkKFdEXzc5MF9QSU8pKQorCUFkZHJlc3MJCWV0aF92bWVtID0gYnVzX3RvX3ZpcnQoZXRoX2JtZW0pOworI2VuZGlmCisjaWZkZWYJSU5DTFVERV8zQzUwMworICAgICAgICBpZiAoIShldGhfZmxhZ3MgJiBGTEFHX1BJTykpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilldGhfdm1lbSwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilldGhfdm1lbStFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsgLyogc3JjICovCisgICAgICAgICAgICAgICAgKigoY2hhciAqKWV0aF92bWVtKzEyKSA9IHQ+Pjg7CQkvKiB0eXBlICovCisgICAgICAgICAgICAgICAgKigoY2hhciAqKWV0aF92bWVtKzEzKSA9IHQ7CisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZXRoX3ZtZW0rRVRIX0hMRU4sIHAsIHMpOworICAgICAgICAgICAgICAgIHMgKz0gRVRIX0hMRU47CisgICAgICAgICAgICAgICAgd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF92bWVtKyhzKyspKSA9IDA7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9XRAorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSB7CisJCW91dGIoZXRoX2xhYXIgfCBXRF9MQUFSX00xNkVOLCBldGhfYXNpY19iYXNlICsgV0RfTEFBUik7CisJCWluYigweDg0KTsKKwl9CisjaWZuZGVmCVdEXzc5MF9QSU8KKwkvKiBNZW1vcnkgaW50ZXJmYWNlICovCisJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CisJCW91dGIoV0RfTVNSX01FTkIsIGV0aF9hc2ljX2Jhc2UgKyBXRF9NU1IpOworCQlpbmIoMHg4NCk7CisJfQorCWluYigweDg0KTsKKwltZW1jcHkoKGNoYXIgKilldGhfdm1lbSwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKwltZW1jcHkoKGNoYXIgKilldGhfdm1lbStFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsgLyogc3JjICovCisJKigoY2hhciAqKWV0aF92bWVtKzEyKSA9IHQ+Pjg7CQkvKiB0eXBlICovCisJKigoY2hhciAqKWV0aF92bWVtKzEzKSA9IHQ7CisJbWVtY3B5KChjaGFyICopZXRoX3ZtZW0rRVRIX0hMRU4sIHAsIHMpOworCXMgKz0gRVRIX0hMRU47CisJd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF92bWVtKyhzKyspKSA9IDA7CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CisJCW91dGIoMCwgZXRoX2FzaWNfYmFzZSArIFdEX01TUik7CisJCWluYigweDg0KTsKKwl9CisjZWxzZQorCWluYigweDg0KTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZglkZWZpbmVkKElOQ0xVREVfM0M1MDMpCisJaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKQorI2VuZGlmCisjaWYJZGVmaW5lZChJTkNMVURFX05FKSB8fCBkZWZpbmVkKElOQ0xVREVfTlM4MzkwKSB8fCAoZGVmaW5lZChJTkNMVURFXzNDNTAzKSAmJiAhZGVmaW5lZChUNTAzX1NITUVNKSkgfHwgKGRlZmluZWQoSU5DTFVERV9XRCkgJiYgZGVmaW5lZChXRF83OTBfUElPKSkKKwl7CisJCS8qIFByb2dyYW1tZWQgSS9PICovCisJCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJCXR5cGUgPSAodCA+PiA4KSB8ICh0IDw8IDgpOworCQlldGhfcGlvX3dyaXRlKCAodW5zaWduZWQgY2hhciAqKSBkLCBldGhfdHhfc3RhcnQ8PDgsIEVUSF9BTEVOKTsKKwkJZXRoX3Bpb193cml0ZShuaWMtPm5vZGVfYWRkciwgKGV0aF90eF9zdGFydDw8OCkrRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJLyogYmNjIGdlbmVyYXRlcyB3b3JzZSBjb2RlIHdpdGhvdXQgKGNvbnN0K2NvbnN0KSBiZWxvdyAqLworCQlldGhfcGlvX3dyaXRlKCh1bnNpZ25lZCBjaGFyICopJnR5cGUsIChldGhfdHhfc3RhcnQ8PDgpKyhFVEhfQUxFTitFVEhfQUxFTiksIDIpOworCQlldGhfcGlvX3dyaXRlKCAodW5zaWduZWQgY2hhciAqKSBwLCAoZXRoX3R4X3N0YXJ0PDw4KStFVEhfSExFTiwgcyk7CisJCXMgKz0gRVRIX0hMRU47CisJCWlmIChzIDwgRVRIX1pMRU4pIHMgPSBFVEhfWkxFTjsKKwl9CisjZW5kaWYKKyNpZglkZWZpbmVkKElOQ0xVREVfM0M1MDMpCisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfV0QKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeworCQlvdXRiKGV0aF9sYWFyICYgfldEX0xBQVJfTTE2RU4sIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKKwkJaW5iKDB4ODQpOworCX0KKwlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApCisJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfAorCQkJRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwllbHNlCisjZW5kaWYKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8CisJCQlEODM5MF9DT01NQU5EX1JEMiB8IEQ4MzkwX0NPTU1BTkRfU1RBLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0YihldGhfdHhfc3RhcnQsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UUFNSKTsKKwlvdXRiKHMsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UQkNSMCk7CisJb3V0YihzPj44LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfVEJDUjEpOworI2lmZGVmCUlOQ0xVREVfV0QKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApCisJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfAorCQkJRDgzOTBfQ09NTUFORF9UWFAgfCBEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCWVsc2UKKyNlbmRpZgorCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwKKwkJCUQ4MzkwX0NPTU1BTkRfVFhQIHwgRDgzOTBfQ09NTUFORF9SRDIgfAorCQkJRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitOUzgzOTBfUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuczgzOTBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHJzdGF0LCBjdXJyLCBuZXh0OworCXVuc2lnbmVkIHNob3J0IGxlbiwgZnJhZzsKKwl1bnNpZ25lZCBzaG9ydCBwa3RvZmY7CisJdW5zaWduZWQgY2hhciAqcDsKKwlzdHJ1Y3QgcmluZ2J1ZmZlciBwa3RoZHI7CisKKyNpZm5kZWYJSU5DTFVERV8zQzUwMworCS8qIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbjogc2VlIGV0aF9yeF9vdmVycnVuKCkgKi8KKwlpZiAoIWV0aF9kcmFpbl9yZWNlaXZlciAmJiAoaW5iKGV0aF9uaWNfYmFzZStEODM5MF9QMF9JU1IpICYgRDgzOTBfSVNSX09WVykpIHsKKwkJZXRoX3J4X292ZXJydW4obmljKTsKKwkJcmV0dXJuKDApOworCX0KKyNlbmRpZgkvKiBJTkNMVURFXzNDNTAzICovCisJcnN0YXQgPSBpbmIoZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JTUik7CisJaWYgKCEocnN0YXQgJiBEODM5MF9SU1RBVF9QUlgpKSByZXR1cm4oMCk7CisJbmV4dCA9IGluYihldGhfbmljX2Jhc2UrRDgzOTBfUDBfQk9VTkQpKzE7CisJaWYgKG5leHQgPj0gZXRoX21lbXNpemUpIG5leHQgPSBldGhfcnhfc3RhcnQ7CisJb3V0YihEODM5MF9DT01NQU5EX1BTMSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCWN1cnIgPSBpbmIoZXRoX25pY19iYXNlK0Q4MzkwX1AxX0NVUlIpOworCW91dGIoRDgzOTBfQ09NTUFORF9QUzAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwlpZiAoY3VyciA+PSBldGhfbWVtc2l6ZSkgY3Vycj1ldGhfcnhfc3RhcnQ7CisJaWYgKGN1cnIgPT0gbmV4dCkgcmV0dXJuKDApOworCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKyNpZmRlZglJTkNMVURFX1dECisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKKwkJb3V0YihldGhfbGFhciB8IFdEX0xBQVJfTTE2RU4sIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKKwkJaW5iKDB4ODQpOworCX0KKyNpZm5kZWYJV0RfNzkwX1BJTworCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgeworCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlICsgV0RfTVNSKTsKKwkJaW5iKDB4ODQpOworCX0KKyNlbmRpZgorCWluYigweDg0KTsKKyNlbmRpZgorCXBrdG9mZiA9IG5leHQgPDwgODsKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR19QSU8pCisJCWV0aF9waW9fcmVhZChwa3RvZmYsICh1bnNpZ25lZCBjaGFyICopJnBrdGhkciwgNCk7CisJZWxzZQorCQltZW1jcHkoJnBrdGhkciwgYnVzX3RvX3ZpcnQoZXRoX3JtZW0gKyBwa3RvZmYpLCA0KTsKKwlwa3RvZmYgKz0gc2l6ZW9mKHBrdGhkcik7CisJLyogaW5jb21pbmcgbGVuZ3RoIGluY2x1ZGVzIEZDUyBzbyBtdXN0IHN1YiA0ICovCisJbGVuID0gcGt0aGRyLmxlbiAtIDQ7CisJaWYgKChwa3RoZHIuc3RhdHVzICYgRDgzOTBfUlNUQVRfUFJYKSA9PSAwIHx8IGxlbiA8IEVUSF9aTEVOCisJCXx8IGxlbiA+IEVUSF9GUkFNRV9MRU4pIHsKKwkJcHJpbnRmKCJCb2d1cyBwYWNrZXQsIGlnbm9yaW5nXG4iKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJZWxzZSB7CisJCXAgPSBuaWMtPnBhY2tldDsKKwkJbmljLT5wYWNrZXRsZW4gPSBsZW47CQkvKiBhdmFpbGFibGUgdG8gY2FsbGVyICovCisJCWZyYWcgPSAoZXRoX21lbXNpemUgPDwgOCkgLSBwa3RvZmY7CisJCWlmIChsZW4gPiBmcmFnKSB7CQkvKiBXZSBoYXZlIGEgd3JhcC1hcm91bmQgKi8KKwkJCS8qIHJlYWQgZmlyc3QgcGFydCAqLworCQkJaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKQorCQkJCWV0aF9waW9fcmVhZChwa3RvZmYsIHAsIGZyYWcpOworCQkJZWxzZQorCQkJCW1lbWNweShwLCBidXNfdG9fdmlydChldGhfcm1lbSArIHBrdG9mZiksIGZyYWcpOworCQkJcGt0b2ZmID0gZXRoX3J4X3N0YXJ0IDw8IDg7CisJCQlwICs9IGZyYWc7CisJCQlsZW4gLT0gZnJhZzsKKwkJfQorCQkvKiByZWFkIHNlY29uZCBwYXJ0ICovCisJCWlmIChldGhfZmxhZ3MgJiBGTEFHX1BJTykKKwkJCWV0aF9waW9fcmVhZChwa3RvZmYsIHAsIGxlbik7CisJCWVsc2UKKwkJCW1lbWNweShwLCBidXNfdG9fdmlydChldGhfcm1lbSArIHBrdG9mZiksIGxlbik7CisJCXJldCA9IDE7CisJfQorI2lmZGVmCUlOQ0xVREVfV0QKKyNpZm5kZWYJV0RfNzkwX1BJTworCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgeworCQlvdXRiKDAsIGV0aF9hc2ljX2Jhc2UgKyBXRF9NU1IpOworCQlpbmIoMHg4NCk7CisJfQorI2VuZGlmCisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKKwkJb3V0YihldGhfbGFhciAmIH5XRF9MQUFSX00xNkVOLCBldGhfYXNpY19iYXNlICsgV0RfTEFBUik7CisJCWluYigweDg0KTsKKwl9CisJaW5iKDB4ODQpOworI2VuZGlmCisJbmV4dCA9IHBrdGhkci5uZXh0OwkJLyogZnJhbWUgbnVtYmVyIG9mIG5leHQgcGFja2V0ICovCisJaWYgKG5leHQgPT0gZXRoX3J4X3N0YXJ0KQorCQluZXh0ID0gZXRoX21lbXNpemU7CisJb3V0YihuZXh0LTEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9CT1VORCk7CisJcmV0dXJuKHJldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTlM4MzkwX0RJU0FCTEUgLSBUdXJuIG9mZiBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG5zODM5MF9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljICkgeworCW5zODM5MF9yZXNldChuaWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK05TODM5MF9JUlEgLSBFbmFibGUsIERpc2FibGUsIG9yIEZvcmNlIGludGVycnVwdHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbnM4MzkwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIG5zODM5MF9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyBuczgzOTBfb3BlcmF0aW9ucyA9IHsKKwkuY29ubmVjdAk9IGR1bW15X2Nvbm5lY3QsCisJLnBvbGwJCT0gbnM4MzkwX3BvbGwsCisJLnRyYW5zbWl0CT0gbnM4MzkwX3RyYW5zbWl0LAorCS5pcnEJCT0gbnM4MzkwX2lycSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYJSU5DTFVERV9OUzgzOTAKK3N0YXRpYyBpbnQgZXRoX3Byb2JlIChzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCisjZWxzZQorc3RhdGljIGludCBldGhfcHJvYmUgKHN0cnVjdCBkZXYgKmRldiwgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzIF9fdW51c2VkKQorI2VuZGlmCit7CisJaW50IGk7CisjaWZkZWYgSU5DTFVERV9OUzgzOTAKKwl1bnNpZ25lZCBzaG9ydCBwY2lfcHJvYmVfYWRkcnNbXSA9IHsgcGNpLT5pb2FkZHIsIDAgfTsKKwl1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMgPSBwY2lfcHJvYmVfYWRkcnM7CisjZW5kaWYKKwlldGhfdmVuZG9yID0gVkVORE9SX05PTkU7CisJZXRoX2RyYWluX3JlY2VpdmVyID0gMDsKKworCW5pYy0+aXJxbm8gID0gMDsKKworI2lmZGVmCUlOQ0xVREVfV0QKK3sKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJU2VhcmNoIGZvciBXRC9TTUMgY2FyZHMKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJc3RydWN0IHdkX2JvYXJkICpicmQ7CisJdW5zaWduZWQgc2hvcnQgY2hrc3VtOworCXVuc2lnbmVkIGNoYXIgYzsKKwlmb3IgKGV0aF9hc2ljX2Jhc2UgPSBXRF9MT1dfQkFTRTsgZXRoX2FzaWNfYmFzZSA8PSBXRF9ISUdIX0JBU0U7CisJCWV0aF9hc2ljX2Jhc2UgKz0gMHgyMCkgeworCQljaGtzdW0gPSAwOworCQlmb3IgKGk9ODsgaTwxNjsgaSsrKQorCQkJY2hrc3VtICs9IGluYihldGhfYXNpY19iYXNlK2kpOworCQkvKiBFeHRyYSBjaGVja3MgdG8gYXZvaWQgc291bmRjYXJkICovCisJCWlmICgoY2hrc3VtICYgMHhGRikgPT0gMHhGRiAmJgorCQkJaW5iKGV0aF9hc2ljX2Jhc2UrOCkgIT0gMHhGRiAmJgorCQkJaW5iKGV0aF9hc2ljX2Jhc2UrOSkgIT0gMHhGRikKKwkJCWJyZWFrOworCX0KKwlpZiAoZXRoX2FzaWNfYmFzZSA+IFdEX0hJR0hfQkFTRSkKKwkJcmV0dXJuICgwKTsKKwkvKiBXZSd2ZSBmb3VuZCBhIGJvYXJkICovCisJZXRoX3ZlbmRvciA9IFZFTkRPUl9XRDsKKwlldGhfbmljX2Jhc2UgPSBldGhfYXNpY19iYXNlICsgV0RfTklDX0FERFI7CisKKwluaWMtPmlvYWRkciA9IGV0aF9uaWNfYmFzZTsKKworCWMgPSBpbmIoZXRoX2FzaWNfYmFzZStXRF9CSUQpOwkvKiBHZXQgYm9hcmQgaWQgKi8KKwlmb3IgKGJyZCA9IHdkX2JvYXJkczsgYnJkLT5uYW1lOyBicmQrKykKKwkJaWYgKGJyZC0+aWQgPT0gYykgYnJlYWs7CisJaWYgKCFicmQtPm5hbWUpIHsKKwkJcHJpbnRmKCJVbmtub3duIFdEL1NNQyBOSUMgdHlwZSAlaGhYXG4iLCBjKTsKKwkJcmV0dXJuICgwKTsJLyogVW5rbm93biB0eXBlICovCisJfQorCWV0aF9mbGFncyA9IGJyZC0+ZmxhZ3M7CisJZXRoX21lbXNpemUgPSBicmQtPm1lbXNpemU7CisJZXRoX3R4X3N0YXJ0ID0gMDsKKwlldGhfcnhfc3RhcnQgPSBEODM5MF9UWEJVRl9TSVpFOworCWlmICgoYyA9PSBUWVBFX1dEODAxM0VQKSAmJgorCQkoaW5iKGV0aF9hc2ljX2Jhc2UgKyBXRF9JQ1IpICYgV0RfSUNSXzE2QklUKSkgeworCQkJZXRoX2ZsYWdzID0gRkxBR18xNkJJVDsKKwkJCWV0aF9tZW1zaXplID0gTUVNXzE2Mzg0OworCX0KKwlpZiAoKGMgJiBXRF9TT0ZUQ09ORklHKSAmJiAoIShldGhfZmxhZ3MgJiBGTEFHXzc5MCkpKSB7CisJCWV0aF9ibWVtID0gKDB4ODAwMDAgfAorCQkgKChpbmIoZXRoX2FzaWNfYmFzZSArIFdEX01TUikgJiAweDNGKSA8PCAxMykpOworCX0gZWxzZQorCQlldGhfYm1lbSA9IFdEX0RFRkFVTFRfTUVNOworCWlmIChicmQtPmlkID09IFRZUEVfU01DODIxNlQgfHwgYnJkLT5pZCA9PSBUWVBFX1NNQzgyMTZDKSB7CisJCS8qIGZyb20gTGludXggZHJpdmVyLCA4NDE2QlQgZGV0ZWN0cyBhcyA4MjE2IHNvbWV0aW1lcyAqLworCQl1bnNpZ25lZCBpbnQgYWRkciA9IGluYihldGhfYXNpY19iYXNlICsgMHhiKTsKKwkJaWYgKCgoYWRkciA+PiA0KSAmIDMpID09IDApIHsKKwkJCWJyZCArPSAyOworCQkJZXRoX21lbXNpemUgPSBicmQtPm1lbXNpemU7CisJCX0KKwl9CisJb3V0YigweDgwLCBldGhfYXNpY19iYXNlICsgV0RfTVNSKTsJLyogUmVzZXQgKi8KKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7CisJCW5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKGkrZXRoX2FzaWNfYmFzZStXRF9MQVIpOworCX0KKwlEQkcgKCAiXG4lcyBiYXNlICU0LjR4IiwgYnJkLT5uYW1lLCBldGhfYXNpY19iYXNlICk7CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CisjaWZkZWYJV0RfNzkwX1BJTworCQlEQkcgKCAiLCBQSU8gbW9kZSwgYWRkciAlc1xuIiwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApICk7CisJCWV0aF9ibWVtID0gMDsKKwkJZXRoX2ZsYWdzIHw9IEZMQUdfUElPOwkJLyogZm9yY2UgUElPIG1vZGUgKi8KKwkJb3V0YigwLCBldGhfYXNpY19iYXNlK1dEX01TUik7CisjZWxzZQorCQlEQkcgKCAiLCBNZW1vcnkgJXgsIE1BQyBBZGRyICVzXG4iLCBldGhfYm1lbSwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkcikgKTsKKworCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlK1dEX01TUik7CisJCW91dGIoKGluYihldGhfYXNpY19iYXNlKzB4MDQpIHwKKwkJCTB4ODApLCBldGhfYXNpY19iYXNlKzB4MDQpOworCQlvdXRiKCgodW5zaWduZWQpKGV0aF9ibWVtID4+IDEzKSAmIDB4MEYpIHwKKwkJCSgodW5zaWduZWQpKGV0aF9ibWVtID4+IDExKSAmIDB4NDApIHwKKwkJCShpbmIoZXRoX2FzaWNfYmFzZSsweDBCKSAmIDB4QjApLCBldGhfYXNpY19iYXNlKzB4MEIpOworCQlvdXRiKChpbmIoZXRoX2FzaWNfYmFzZSsweDA0KSAmCisJCQl+MHg4MCksIGV0aF9hc2ljX2Jhc2UrMHgwNCk7CisjZW5kaWYKKwl9IGVsc2UgeworCisJCURCRyAoIiwgTWVtb3J5ICV4LCBNQUMgQWRkciAlc1xuIiwgZXRoX2JtZW0sIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIpICk7CisKKwkJb3V0YigoKHVuc2lnbmVkKShldGhfYm1lbSA+PiAxMykgJiAweDNGKSB8IDB4NDAsIGV0aF9hc2ljX2Jhc2UrV0RfTVNSKTsKKwl9CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKKwkJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CisJCQlldGhfbGFhciA9IGluYihldGhfYXNpY19iYXNlICsgV0RfTEFBUik7CisJCQlvdXRiKFdEX0xBQVJfTTE2RU4sIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKKwkJfSBlbHNlIHsKKwkJCW91dGIoKGV0aF9sYWFyID0KKwkJCQlXRF9MQUFSX0wxNkVOIHwgMSksIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKKy8qCisJVGhlIHByZXZpb3VzIGxpbmUgdXNlZCB0byBiZQorCQkJCVdEX0xBQVJfTTE2RU4gfCBXRF9MQUFSX0wxNkVOIHwgMSkpOworCWpsdWtlQGRlYWtpbi5lZHUuYXUgcmVwb3J0ZWQgdGhhdCByZW1vdmluZyBXRF9MQUFSX00xNkVOIG1hZGUKKwlpdCB3b3JrIGZvciBXRDgwMTNzLiAgVGhpcyBzZWVtcyB0byB3b3JrIGZvciBteSA4MDEzIGJvYXJkcy4gSQorCWRvbid0IGtub3cgd2hhdCBpcyByZWFsbHkgaGFwcGVuaW5nLiAgSSB3aXNoIEkgaGFkIGRhdGEgc2hlZXRzCisJb3IgbW9yZSB0aW1lIHRvIGRlY29kZSB0aGUgTGludXggZHJpdmVyLiAtIEtlbgorKi8KKwkJfQorCQlpbmIoMHg4NCk7CisJfQorfQorI2VuZGlmCisjaWZkZWYJSU5DTFVERV8zQzUwMworI2lmZGVmCVQ1MDNfQVVJCisJbmljLT5mbGFncyA9IDE7CQkvKiBhdWkgKi8KKyNlbHNlCisJbmljLT5mbGFncyA9IDA7CQkvKiBubyBhdWkgKi8KKyNlbmRpZgorICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIFNlYXJjaCBmb3IgM0NvbSAzYzUwMyBpZiBubyBXRC9TTUMgY2FyZHMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWlmIChldGhfdmVuZG9yID09IFZFTkRPUl9OT05FKSB7CisJCWludAlpZHg7CisJCWludAlpb2Jhc2VfcmVnLCBtZW1iYXNlX3JlZzsKKwkJc3RhdGljIHVuc2lnbmVkIHNob3J0CWJhc2VbXSA9IHsKKwkJCTB4MzAwLCAweDMxMCwgMHgzMzAsIDB4MzUwLAorCQkJMHgyNTAsIDB4MjgwLCAweDJBMCwgMHgyRTAsIDAgfTsKKworCQkvKiBMb29wIHRocm91Z2ggcG9zc2libGUgYWRkcmVzc2VzIGNoZWNraW5nIGVhY2ggb25lICovCisKKwkJZm9yIChpZHggPSAwOyAoZXRoX25pY19iYXNlID0gYmFzZVtpZHhdKSAhPSAwOyArK2lkeCkgeworCisJCQlldGhfYXNpY19iYXNlID0gZXRoX25pY19iYXNlICsgXzNDT01fQVNJQ19PRkZTRVQ7CisvKgorICogTm90ZSB0aGF0IHdlIHVzZSB0aGUgc2FtZSBzZXR0aW5ncyBmb3IgYm90aCA4IGFuZCAxNiBiaXQgY2FyZHM6CisgKiBib3RoIGhhdmUgYW4gOEsgYmFuayBvZiBtZW1vcnkgYXQgcGFnZSAxIHdoaWxlIG9ubHkgdGhlIDE2IGJpdAorICogY2FyZHMgaGF2ZSBhIGJhbmsgYXQgcGFnZSAwLgorICovCisJCQlldGhfbWVtc2l6ZSA9IE1FTV8xNjM4NDsKKwkJCWV0aF90eF9zdGFydCA9IDMyOworCQkJZXRoX3J4X3N0YXJ0ID0gMzIgKyBEODM5MF9UWEJVRl9TSVpFOworCisJCS8qIENoZWNrIG91ciBiYXNlIGFkZHJlc3MuIGlvYmFzZSBhbmQgbWVtYmFzZSBzaG91bGQgKi8KKwkJLyogYm90aCBoYXZlIGEgbWF4aW11bSBvZiAxIGJpdCBzZXQgb3IgYmUgMC4gKi8KKworCQkJaW9iYXNlX3JlZyA9IGluYihldGhfYXNpY19iYXNlICsgXzNDT01fQkNGUik7CisJCQltZW1iYXNlX3JlZyA9IGluYihldGhfYXNpY19iYXNlICsgXzNDT01fUENGUik7CisKKwkJCWlmICgoaW9iYXNlX3JlZyAmIChpb2Jhc2VfcmVnIC0gMSkpIHx8CisJCQkJKG1lbWJhc2VfcmVnICYgKG1lbWJhc2VfcmVnIC0gMSkpKQorCQkJCWNvbnRpbnVlOwkJLyogbm9wZSAqLworCisJCS8qIE5vdyBnZXQgdGhlIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyAqLworCisJCQlldGhfZmxhZ3MgPSAwOworCisJCQlzd2l0Y2ggKG1lbWJhc2VfcmVnKSB7CisJCQkJY2FzZSBfM0NPTV9QQ0ZSX0RDMDAwOgorCQkJCQlldGhfYm1lbSA9IDB4ZGMwMDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgXzNDT01fUENGUl9EODAwMDoKKwkJCQkJZXRoX2JtZW0gPSAweGQ4MDAwOworCQkJCQlicmVhazsKKwkJCQljYXNlIF8zQ09NX1BDRlJfQ0MwMDA6CisJCQkJCWV0aF9ibWVtID0gMHhjYzAwMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBfM0NPTV9QQ0ZSX0M4MDAwOgorCQkJCQlldGhfYm1lbSA9IDB4YzgwMDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgXzNDT01fUENGUl9QSU86CisJCQkJCWV0aF9mbGFncyB8PSBGTEFHX1BJTzsKKwkJCQkJZXRoX2JtZW0gPSAwOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQljb250aW51ZTsJLyogbm9wZSAqLworCQkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJhc2VbaWR4XSA9PSAwKQkJLyogbm90IGZvdW5kICovCisJCQlyZXR1cm4gKDApOworI2lmbmRlZglUNTAzX1NITUVNCisJCWV0aF9mbGFncyB8PSBGTEFHX1BJTzsJCS8qIGZvcmNlIFBJTyBtb2RlICovCisJCWV0aF9ibWVtID0gMDsKKyNlbmRpZgorCQlldGhfdmVuZG9yID0gVkVORE9SXzNDT007CisKKworICAgICAgICAvKiBOZWVkIHRoaXMgdG8gbWFrZSBuczgzOTBfcG9sbCgpIGhhcHB5LiAqLworCisgICAgICAgICAgICAgICAgZXRoX3JtZW0gPSBldGhfYm1lbSAtIDB4MjAwMDsKKworICAgICAgICAvKiBSZXNldCBOSUMgYW5kIEFTSUMgKi8KKworICAgICAgICAgICAgICAgIG91dGIoXzNDT01fQ1JfUlNUIHwgXzNDT01fQ1JfWFNFTCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0NSICk7CisgICAgICAgICAgICAgICAgb3V0YihfM0NPTV9DUl9YU0VMLCBldGhfYXNpY19iYXNlICsgXzNDT01fQ1IgKTsKKworICAgICAgICAvKiBHZXQgb3VyIGV0aGVybmV0IGFkZHJlc3MgKi8KKworICAgICAgICAgICAgICAgIG91dGIoXzNDT01fQ1JfRUFMTyB8IF8zQ09NX0NSX1hTRUwsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9DUik7CisJCW5pYy0+aW9hZGRyID0gZXRoX25pY19iYXNlOworICAgICAgICAgICAgICAgIERCRyAoICJcbjNDb20gM2M1MDMgYmFzZSAlNC40eCwgIiwgZXRoX25pY19iYXNlICk7CisgICAgICAgICAgICAgICAgaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKQorCQkJREJHICggIlBJTyBtb2RlIiApOworICAgICAgICAgICAgICAgIGVsc2UKKwkJCURCRyAoICJtZW1vcnkgJTQuNHgiLCBldGhfYm1lbSApOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKGV0aF9uaWNfYmFzZStpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHICggIiwgJXMsIE1BQyBBZGRyICVzXG4iLCBuaWMtPmZsYWdzID8gIkFVSSIgOiAiaW50ZXJuYWwgeGN2ciIsCisJCSAgICAgIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIgKSApOworCisgICAgICAgICAgICAgICAgb3V0YihfM0NPTV9DUl9YU0VMLCBldGhfYXNpY19iYXNlICsgXzNDT01fQ1IpOworICAgICAgICAvKgorICAgICAgICAgKiBJbml0aWFsaXplIEdBIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuIFNldCBiYW5rIGFuZCBlbmFibGUgc2hhcmVkCisgICAgICAgICAqIG1lbS4gV2UgYWx3YXlzIHVzZSBiYW5rIDEuIERpc2FibGUgaW50ZXJydXB0cy4KKyAgICAgICAgICovCisgICAgICAgICAgICAgICAgb3V0YihfM0NPTV9HQUNGUl9SU0VMIHwKKwkJCV8zQ09NX0dBQ0ZSX01CUzAgfCBfM0NPTV9HQUNGUl9UQ00gfCBfM0NPTV9HQUNGUl9OSU0sIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9HQUNGUik7CisKKyAgICAgICAgICAgICAgICBvdXRiKDB4ZmYsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9WUFRSMik7CisgICAgICAgICAgICAgICAgb3V0YigweGZmLCBldGhfYXNpY19iYXNlICsgXzNDT01fVlBUUjEpOworICAgICAgICAgICAgICAgIG91dGIoMHgwMCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX1ZQVFIwKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xlYXIgbWVtb3J5IGFuZCB2ZXJpZnkgdGhhdCBpdCB3b3JrZWQgKHdlIHVzZSBvbmx5IDhLKQorICAgICAgICAgKi8KKworCQlpZiAoIShldGhfZmxhZ3MgJiBGTEFHX1BJTykpIHsKKwkJCW1lbXNldChidXNfdG9fdmlydChldGhfYm1lbSksIDAsIDB4MjAwMCk7CisJCQlmb3IoaSA9IDA7IGkgPCAweDIwMDA7ICsraSkKKwkJCQlpZiAoKigoY2hhciAqKShidXNfdG9fdmlydChldGhfYm1lbStpKSkpKSB7CisJCQkJCXByaW50ZiAoIkZhaWxlZCB0byBjbGVhciAzYzUwMyBzaGFyZWQgbWVtLlxuIik7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQl9CisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpemUgR0EgcGFnZS9zdGFydC9zdG9wIHJlZ2lzdGVycy4KKyAgICAgICAgICovCisgICAgICAgICAgICAgICAgb3V0YihldGhfdHhfc3RhcnQsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9QU1RSKTsKKyAgICAgICAgICAgICAgICBvdXRiKGV0aF9tZW1zaXplLCBldGhfYXNpY19iYXNlICsgXzNDT01fUFNQUik7CisgICAgICAgIH0KKyNlbmRpZgorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkKK3sKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJU2VhcmNoIGZvciBORTEwMDAvMjAwMCBpZiBubyBXRC9TTUMgb3IgM2NvbSBjYXJkcworCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwl1bnNpZ25lZCBjaGFyIGM7CisJaWYgKGV0aF92ZW5kb3IgPT0gVkVORE9SX05PTkUpIHsKKwkJdW5zaWduZWQgY2hhciByb21kYXRhWzE2XTsKKwkJdW5zaWduZWQgY2hhciB0ZXN0YnVmWzMyXTsKKwkJaW50IGlkeDsKKwkJc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdFtdID0gIk5FKjAwMCBtZW1vcnkiOworCQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmFzZVtdID0geworI2lmZGVmCU5FX1NDQU4KKwkJCU5FX1NDQU4sCisjZW5kaWYKKwkJCTAgfTsKKwkJLyogaWYgbm8gYWRkcmVzc2VzIHN1cHBsaWVkLCBmYWxsIGJhY2sgb24gZGVmYXVsdHMgKi8KKwkJaWYgKHByb2JlX2FkZHJzID09IDAgfHwgcHJvYmVfYWRkcnNbMF0gPT0gMCkKKwkJCXByb2JlX2FkZHJzID0gYmFzZTsKKwkJZXRoX2JtZW0gPSAwOwkJLyogTm8gc2hhcmVkIG1lbW9yeSAqLworCQlmb3IgKGlkeCA9IDA7IChldGhfbmljX2Jhc2UgPSBwcm9iZV9hZGRyc1tpZHhdKSAhPSAwOyArK2lkeCkgeworCQkJZXRoX2ZsYWdzID0gRkxBR19QSU87CisJCQlldGhfYXNpY19iYXNlID0gZXRoX25pY19iYXNlICsgTkVfQVNJQ19PRkZTRVQ7CisJCQlldGhfbWVtc2l6ZSA9IE1FTV8xNjM4NDsKKwkJCWV0aF90eF9zdGFydCA9IDMyOworCQkJZXRoX3J4X3N0YXJ0ID0gMzIgKyBEODM5MF9UWEJVRl9TSVpFOworCQkJYyA9IGluYihldGhfYXNpY19iYXNlICsgTkVfUkVTRVQpOworCQkJb3V0YihjLCBldGhfYXNpY19iYXNlICsgTkVfUkVTRVQpOworCQkJKHZvaWQpIGluYigweDg0KTsKKwkJCW91dGIoRDgzOTBfQ09NTUFORF9TVFAgfAorCQkJCUQ4MzkwX0NPTU1BTkRfUkQyLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9DT01NQU5EKTsKKwkJCW91dGIoRDgzOTBfUkNSX01PTiwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUkNSKTsKKwkJCW91dGIoRDgzOTBfRENSX0ZUMSB8IEQ4MzkwX0RDUl9MUywgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfRENSKTsKKwkJCW91dGIoTUVNXzgxOTIsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1BTVEFSVCk7CisJCQlvdXRiKE1FTV8xNjM4NCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUFNUT1ApOworI2lmZGVmCU5TODM5MF9GT1JDRV8xNkJJVAorCQkJZXRoX2ZsYWdzIHw9IEZMQUdfMTZCSVQ7CS8qIGZvcmNlIDE2LWJpdCBtb2RlICovCisjZW5kaWYKKworCQkJZXRoX3Bpb193cml0ZSggKHVuc2lnbmVkIGNoYXIgKikgdGVzdCwgODE5Miwgc2l6ZW9mKHRlc3QpKTsKKwkJCWV0aF9waW9fcmVhZCg4MTkyLCB0ZXN0YnVmLCBzaXplb2YodGVzdCkpOworCQkJaWYgKCFtZW1jbXAodGVzdCwgdGVzdGJ1Ziwgc2l6ZW9mKHRlc3QpKSkKKwkJCQlicmVhazsKKwkJCWV0aF9mbGFncyB8PSBGTEFHXzE2QklUOworCQkJZXRoX21lbXNpemUgPSBNRU1fMzI3Njg7CisJCQlldGhfdHhfc3RhcnQgPSA2NDsKKwkJCWV0aF9yeF9zdGFydCA9IDY0ICsgRDgzOTBfVFhCVUZfU0laRTsKKwkJCW91dGIoRDgzOTBfRENSX1dUUyB8CisJCQkJRDgzOTBfRENSX0ZUMSB8IEQ4MzkwX0RDUl9MUywgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfRENSKTsKKwkJCW91dGIoTUVNXzE2Mzg0LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9QU1RBUlQpOworCQkJb3V0YihNRU1fMzI3NjgsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1BTVE9QKTsKKwkJCWV0aF9waW9fd3JpdGUoICh1bnNpZ25lZCBjaGFyICopIHRlc3QsIDE2Mzg0LCBzaXplb2YodGVzdCkpOworCQkJZXRoX3Bpb19yZWFkKDE2Mzg0LCB0ZXN0YnVmLCBzaXplb2YodGVzdCkpOworCQkJaWYgKCFtZW1jbXAodGVzdGJ1ZiwgdGVzdCwgc2l6ZW9mKHRlc3QpKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoZXRoX25pY19iYXNlID09IDApCisJCQlyZXR1cm4gKDApOworCQlpZiAoZXRoX25pY19iYXNlID4gSVNBX01BWF9BRERSKQkvKiBQQ0kgcHJvYmFibHkgKi8KKwkJCWV0aF9mbGFncyB8PSBGTEFHXzE2QklUOworCQlldGhfdmVuZG9yID0gVkVORE9SX05PVkVMTDsKKwkJZXRoX3Bpb19yZWFkKDAsIHJvbWRhdGEsIHNpemVvZihyb21kYXRhKSk7CisJCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkJCW5pYy0+bm9kZV9hZGRyW2ldID0gcm9tZGF0YVtpICsgKChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSA/IGkgOiAwKV07CisJCX0KKwkJbmljLT5pb2FkZHIgPSBldGhfbmljX2Jhc2U7CisJCURCRyAoICJcbk5FJWMwMDAgYmFzZSAlNC40eCwgTUFDIEFkZHIgJXNcbiIsCisJCSAgICAgIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSA/ICcyJyA6ICcxJywgZXRoX25pY19iYXNlLAorCQkgICAgICBldGhfbnRvYSAoIG5pYy0+bm9kZV9hZGRyICkgKTsKKwl9Cit9CisjZW5kaWYKKwlpZiAoZXRoX3ZlbmRvciA9PSBWRU5ET1JfTk9ORSkKKwkJcmV0dXJuKDApOworICAgICAgICBpZiAoZXRoX3ZlbmRvciAhPSBWRU5ET1JfM0NPTSkKKwkJZXRoX3JtZW0gPSBldGhfYm1lbTsKKwluczgzOTBfcmVzZXQobmljKTsKKwluaWMtPm5pY19vcAk9ICZuczgzOTBfb3BlcmF0aW9uczsKKworICAgICAgICAvKiBCYXNlZCBvbiBQblAgSVNBIG1hcCAqLworI2lmZGVmCUlOQ0xVREVfV0QKKyAgICAgICAgZGV2LT5kZXZpZC52ZW5kb3JfaWQgPSBodG9ucyhHRU5FUklDX0lTQVBOUF9WRU5ET1IpOworICAgICAgICBkZXYtPmRldmlkLmRldmljZV9pZCA9IGh0b25zKDB4ODEyYSk7CisjZW5kaWYKKyNpZmRlZglJTkNMVURFXzNDNTAzCisgICAgICAgIGRldi0+ZGV2aWQudmVuZG9yX2lkID0gaHRvbnMoR0VORVJJQ19JU0FQTlBfVkVORE9SKTsKKyAgICAgICAgZGV2LT5kZXZpZC5kZXZpY2VfaWQgPSBodG9ucygweDgwZjMpOworI2VuZGlmCisjaWZkZWYJSU5DTFVERV9ORQorICAgICAgICBkZXYtPmRldmlkLnZlbmRvcl9pZCA9IGh0b25zKEdFTkVSSUNfSVNBUE5QX1ZFTkRPUik7CisgICAgICAgIGRldi0+ZGV2aWQuZGV2aWNlX2lkID0gaHRvbnMoMHg4MGQ2KTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCisjaWZkZWYJSU5DTFVERV9XRAorc3RydWN0IGlzYV9kcml2ZXIgd2RfZHJpdmVyIF9faXNhX2RyaXZlciA9IHsKKwkudHlwZSAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgPSAiV0QiLAorCS5wcm9iZSAgID0gd2RfcHJvYmUsCisJLmlvYWRkcnMgPSAwLCAKK307CitJU0FfUk9NKCJ3ZCIsIldEODAwMy84MDEzLCBTTUM4MjE2Lzg0MTYsIFNNQyA4M2M3OTAgKEV0aGVyRVopIik7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfM0M1MDMKK3N0cnVjdCBpc2FfZHJpdmVyIHQ1MDNfZHJpdmVyIF9faXNhX2RyaXZlciA9IHsKKwkudHlwZSAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgPSAiM0M1MDMiLAorCS5wcm9iZSAgID0gdDUwM19wcm9iZSwKKwkuaW9hZGRycyA9IDAsIAorfTsKK0lTQV9ST00oIjNjNTAzIiwiM0NvbTUwMywgRXRoZXJsaW5rIElJWy8xNl0iKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9ORQorc3RydWN0IGlzYV9kcml2ZXIgbmVfZHJpdmVyIF9faXNhX2RyaXZlciA9IHsKKwkudHlwZSAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgPSAiTkUqMDAwIiwKKwkucHJvYmUgICA9IG5lX3Byb2JlLAorCS5pb2FkZHJzID0gMCwgCit9OworSVNBX1JPTSgibmUiLCJORTEwMDAvMjAwMCBhbmQgY2xvbmVzIik7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfTlM4MzkwCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbmVwY2lfbmljc1tdID0geworLyogQSBmZXcgTkUyMDAwIFBDSSBjbG9uZXMsIGxpc3Qgbm90IGV4aGF1c3RpdmUgKi8KK1BDSV9ST00oMHgxMGVjLCAweDgwMjksICJydGw4MDI5IiwgICAgICAiUmVhbHRlayA4MDI5IiwgMCksCitQQ0lfUk9NKDB4MTE4NiwgMHgwMzAwLCAiZGxpbmstNTI4IiwgICAgIkQtTGluayBERS01MjgiLCAwKSwKK1BDSV9ST00oMHgxMDUwLCAweDA5NDAsICJ3aW5ib25kOTQwIiwgICAiV2luYm9uZCBORTIwMDAtUENJIiwgMCksCQkvKiBXaW5ib25kIDg2Qzk0MCAvIDg5Qzk0MCAqLworUENJX1JPTSgweDEwNTAsIDB4NWE1YSwgIndpbmJvbmQ5NDBmIiwgICJXaW5ib25kIFc4OWM5NDBGIiwgMCksCQkvKiBXaW5ib25kIDg5Qzk0MEYgKi8KK1BDSV9ST00oMHgxMWY2LCAweDE0MDEsICJjb21wZXhybDIwMDAiLCAiQ29tcGV4IFJlYWR5TGluayAyMDAwIiwgMCksCitQQ0lfUk9NKDB4OGUyZSwgMHgzMDAwLCAia3RpZXQzMnAyIiwgICAgIktUSSBFVDMyUDIiLCAwKSwKK1BDSV9ST00oMHg0YTE0LCAweDUwMDAsICJudjUwMDBzYyIsICAgICAiTmV0VmluIE5WNTAwMFNDIiwgMCksCitQQ0lfUk9NKDB4MTJjMywgMHgwMDU4LCAiaG9sdGVrODAyMzIiLCAgIkhvbHRlayBIVDgwMjMyIiwgMCksCitQQ0lfUk9NKDB4MTJjMywgMHg1NTk4LCAiaG9sdGVrODAyMjkiLCAgIkhvbHRlayBIVDgwMjI5IiwgMCksCitQQ0lfUk9NKDB4MTBiZCwgMHgwZTM0LCAic3VyZWNvbS1uZTM0IiwgIlN1cmVjb20gTkUzNCIsIDApLAorUENJX1JPTSgweDExMDYsIDB4MDkyNiwgInZpYTg2YzkyNiIsICAgICJWaWEgODZjOTI2IiwgMCksCit9OworCitQQ0lfRFJJVkVSICggbmVwY2lfZHJpdmVyLCBuZXBjaV9uaWNzLCBQQ0lfTk9fQ0xBU1MgKTsKKworRFJJVkVSICggIk5FMjAwMC9QQ0kiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCBuZXBjaV9kcml2ZXIsCisJIG5lcGNpX3Byb2JlLCBuczgzOTBfZGlzYWJsZSApOworCisjZW5kaWYgLyogSU5DTFVERV9OUzgzOTAgKi8KKworI2VuZGlmCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9uczgzOTAuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L25zODM5MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzI4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9uczgzOTAuaApAQCAtMCwwICsxLDI0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhFUkJPT1QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorCitBdXRob3I6IE1hcnRpbiBSZW50ZXJzCisgIERhdGU6IEp1bi85NAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggQlNEMiApOworCisjZGVmaW5lIFZFTkRPUl9OT05FCTAKKyNkZWZpbmUgVkVORE9SX1dECTEKKyNkZWZpbmUgVkVORE9SX05PVkVMTAkyCisjZGVmaW5lIFZFTkRPUl8zQ09NCTMKKworI2RlZmluZSBGTEFHX1BJTwkweDAxCisjZGVmaW5lIEZMQUdfMTZCSVQJMHgwMgorI2RlZmluZSBGTEFHXzc5MAkweDA0CisKKyNkZWZpbmUgTUVNXzgxOTIJMzIKKyNkZWZpbmUgTUVNXzE2Mzg0CTY0CisjZGVmaW5lIE1FTV8zMjc2OAkxMjgKKworI2RlZmluZQlJU0FfTUFYX0FERFIJMHg0MDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitXZXN0ZXJuIERpZ2l0YWwvU01DIEJvYXJkIERlZmluaXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgV0RfTE9XX0JBU0UJMHgyMDAKKyNkZWZpbmUgV0RfSElHSF9CQVNFCTB4M2UwCisjaWZuZGVmCVdEX0RFRkFVTFRfTUVNCisjZGVmaW5lIFdEX0RFRkFVTFRfTUVNCTB4RDAwMDAKKyNlbmRpZgorI2RlZmluZSBXRF9OSUNfQUREUgkweDEwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorV2VzdGVybiBEaWdpdGFsL1NNQyBBU0lDIEFkZHJlc3NlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFdEX01TUgkJMHgwMAorI2RlZmluZSBXRF9JQ1IJCTB4MDEKKyNkZWZpbmUgV0RfSUFSCQkweDAyCisjZGVmaW5lIFdEX0JJTwkJMHgwMworI2RlZmluZSBXRF9JUlIJCTB4MDQKKyNkZWZpbmUgV0RfTEFBUgkJMHgwNQorI2RlZmluZSBXRF9JSlIJCTB4MDYKKyNkZWZpbmUgV0RfR1AyCQkweDA3CisjZGVmaW5lIFdEX0xBUgkJMHgwOAorI2RlZmluZSBXRF9CSUQJCTB4MEUKKworI2RlZmluZSBXRF9JQ1JfMTZCSVQJMHgwMQorCisjZGVmaW5lIFdEX01TUl9NRU5CCTB4NDAKKworI2RlZmluZSBXRF9MQUFSX0wxNkVOCTB4NDAKKyNkZWZpbmUgV0RfTEFBUl9NMTZFTgkweDgwCisKKyNkZWZpbmUgV0RfU09GVENPTkZJRwkweDIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorV2VzdGVybiBEaWdpdGFsL1NNQyBCb2FyZCBUeXBlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRZUEVfV0Q4MDAzUwkweDAyCisjZGVmaW5lIFRZUEVfV0Q4MDAzRQkweDAzCisjZGVmaW5lIFRZUEVfV0Q4MDEzRUJUCTB4MDUKKyNkZWZpbmUgVFlQRV9XRDgwMDNXCTB4MjQKKyNkZWZpbmUgVFlQRV9XRDgwMDNFQgkweDI1CisjZGVmaW5lIFRZUEVfV0Q4MDEzVwkweDI2CisjZGVmaW5lIFRZUEVfV0Q4MDEzRVAJMHgyNworI2RlZmluZSBUWVBFX1dEODAxM1dDCTB4MjgKKyNkZWZpbmUgVFlQRV9XRDgwMTNFUEMJMHgyOQorI2RlZmluZSBUWVBFX1NNQzgyMTZUCTB4MmEKKyNkZWZpbmUgVFlQRV9TTUM4MjE2QwkweDJiCisjZGVmaW5lIFRZUEVfU01DODQxNlQJMHgwMAkvKiBCb2d1cyBlbnRyaWVzOiB0aGUgODQxNiBnZW5lcmF0ZXMgdGhlICovCisjZGVmaW5lIFRZUEVfU01DODQxNkMJMHgwMAkvKiB0aGUgc2FtZSBjb2RlcyBhcyB0aGUgODIxNi4gKi8KKyNkZWZpbmUgVFlQRV9TTUM4MDEzRUJQCTB4MmMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiszY29tIDNjNTAzIGRlZmluaXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfM0NPTV9CQVNFCisjZGVmaW5lIF8zQ09NX0JBU0UgMHgzMDAKKyNlbmRpZgorCisjZGVmaW5lIF8zQ09NX1RYX1BBR0VfT0ZGU0VUXzhCSVQgICAgIDB4MjAKKyNkZWZpbmUgXzNDT01fVFhfUEFHRV9PRkZTRVRfMTZCSVQgICAgMHgwCisjZGVmaW5lIF8zQ09NX1JYX1BBR0VfT0ZGU0VUXzE2QklUICAgIDB4MjAKKworI2RlZmluZSBfM0NPTV9BU0lDX09GRlNFVCAweDQwMAorI2RlZmluZSBfM0NPTV9OSUNfT0ZGU0VUIDB4MAorCisjZGVmaW5lIF8zQ09NX1BTVFIgICAgICAgICAgICAwCisjZGVmaW5lIF8zQ09NX1BTUFIgICAgICAgICAgICAxCisKKyNkZWZpbmUgXzNDT01fQkNGUiAgICAgICAgICAgIDMKKyNkZWZpbmUgXzNDT01fQkNGUl8yRTAgICAgICAgIDB4MDEKKyNkZWZpbmUgXzNDT01fQkNGUl8yQTAgICAgICAgIDB4MDIKKyNkZWZpbmUgXzNDT01fQkNGUl8yODAgICAgICAgIDB4MDQKKyNkZWZpbmUgXzNDT01fQkNGUl8yNTAgICAgICAgIDB4MDgKKyNkZWZpbmUgXzNDT01fQkNGUl8zNTAgICAgICAgIDB4MTAKKyNkZWZpbmUgXzNDT01fQkNGUl8zMzAgICAgICAgIDB4MjAKKyNkZWZpbmUgXzNDT01fQkNGUl8zMTAgICAgICAgIDB4NDAKKyNkZWZpbmUgXzNDT01fQkNGUl8zMDAgICAgICAgIDB4ODAKKyNkZWZpbmUgXzNDT01fUENGUiAgICAgICAgICAgIDQKKyNkZWZpbmUgXzNDT01fUENGUl9QSU8gICAgICAgIDAKKyNkZWZpbmUgXzNDT01fUENGUl9DODAwMCAgICAgIDB4MTAKKyNkZWZpbmUgXzNDT01fUENGUl9DQzAwMCAgICAgIDB4MjAKKyNkZWZpbmUgXzNDT01fUENGUl9EODAwMCAgICAgIDB4NDAKKyNkZWZpbmUgXzNDT01fUENGUl9EQzAwMCAgICAgIDB4ODAKKyNkZWZpbmUgXzNDT01fQ1IgICAgICAgICAgICAgIDYKKyNkZWZpbmUgXzNDT01fQ1JfUlNUICAgICAgICAgIDB4MDEgICAgLyogUmVzZXQgR0EgYW5kIE5JQyAqLworI2RlZmluZSBfM0NPTV9DUl9YU0VMICAgICAgICAgMHgwMiAgICAvKiBUcmFuc2NlaXZlciBzZWxlY3QuIEJOQz0xKGRlZikgQVVJPTAgKi8KKyNkZWZpbmUgXzNDT01fQ1JfRUFMTyAgICAgICAgIDB4MDQgICAgLyogd2luZG93IEVBIFBST00gMC0xNSB0byBJL08gYmFzZSAqLworI2RlZmluZSBfM0NPTV9DUl9FQUhJICAgICAgICAgMHgwOCAgICAvKiB3aW5kb3cgRUEgUFJPTSAxNi0zMSB0byBJL08gYmFzZSAqLworI2RlZmluZSBfM0NPTV9DUl9TSEFSRSAgICAgICAgMHgxMCAgICAvKiBzZWxlY3QgaW50ZXJydXB0IHNoYXJpbmcgb3B0aW9uICovCisjZGVmaW5lIF8zQ09NX0NSX0RCU0VMICAgICAgICAweDIwICAgIC8qIERvdWJsZSBidWZmZXIgc2VsZWN0ICovCisjZGVmaW5lIF8zQ09NX0NSX0RESVIgICAgICAgICAweDQwICAgIC8qIERNQSBkaXJlY3Rpb24gc2VsZWN0ICovCisjZGVmaW5lIF8zQ09NX0NSX1NUQVJUICAgICAgICAweDgwICAgIC8qIFN0YXJ0IERNQSBjb250cm9sbGVyICovCisjZGVmaW5lIF8zQ09NX0dBQ0ZSICAgICAgICAgICA1CisjZGVmaW5lIF8zQ09NX0dBQ0ZSX01CUzAgICAgICAweDAxCisjZGVmaW5lIF8zQ09NX0dBQ0ZSX01CUzEgICAgICAweDAyCisjZGVmaW5lIF8zQ09NX0dBQ0ZSX01CUzIgICAgICAweDA0CisjZGVmaW5lIF8zQ09NX0dBQ0ZSX1JTRUwgICAgICAweDA4ICAgIC8qIGVuYWJsZSBzaGFyZWQgbWVtb3J5ICovCisjZGVmaW5lIF8zQ09NX0dBQ0ZSX1RFU1QgICAgICAweDEwICAgIC8qIGZvciBHQSB0ZXN0aW5nICovCisjZGVmaW5lIF8zQ09NX0dBQ0ZSX09XUyAgICAgICAweDIwICAgIC8qIHNlbGVjdCAwV1MgYWNjZXNzIHRvIEdBICovCisjZGVmaW5lIF8zQ09NX0dBQ0ZSX1RDTSAgICAgICAweDQwICAgIC8qIE1hc2sgRE1BIGludGVycnVwdHMgKi8KKyNkZWZpbmUgXzNDT01fR0FDRlJfTklNICAgICAgIDB4ODAgICAgLyogTWFzayBOSUMgaW50ZXJydXB0cyAqLworI2RlZmluZSBfM0NPTV9TVFJFRyAgICAgICAgICAgNworI2RlZmluZSBfM0NPTV9TVFJFR19SRVYgICAgICAgMHgwNyAgICAvKiBHQSByZXZpc2lvbiAqLworI2RlZmluZSBfM0NPTV9TVFJFR19ESVAgICAgICAgMHgwOCAgICAvKiBETUEgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgXzNDT01fU1RSRUdfRFRDICAgICAgIDB4MTAgICAgLyogRE1BIHRlcm1pbmFsIGNvdW50ICovCisjZGVmaW5lIF8zQ09NX1NUUkVHX09GTFcgICAgICAweDIwICAgIC8qIE92ZXJmbG93ICovCisjZGVmaW5lIF8zQ09NX1NUUkVHX1VGTFcgICAgICAweDQwICAgIC8qIFVuZGVyZmxvdyAqLworI2RlZmluZSBfM0NPTV9TVFJFR19EUFJEWSAgICAgMHg4MCAgICAvKiBEYXRhIHBvcnQgcmVhZHkgKi8KKyNkZWZpbmUgXzNDT01fSURDRlIgICAgICAgICAgIDgKKyNkZWZpbmUgXzNDT01fSURDRlJfRFJRMCAgICAgIDB4MDEgICAgLyogRE1BIHJlcXVlc3QgMSBzZWxlY3QgKi8KKyNkZWZpbmUgXzNDT01fSURDRlJfRFJRMSAgICAgIDB4MDIgICAgLyogRE1BIHJlcXVlc3QgMiBzZWxlY3QgKi8KKyNkZWZpbmUgXzNDT01fSURDRlJfRFJRMiAgICAgIDB4MDQgICAgLyogRE1BIHJlcXVlc3QgMyBzZWxlY3QgKi8KKyNkZWZpbmUgXzNDT01fSURDRlJfVU5VU0VEICAgIDB4MDggICAgLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgXzNDT01fSURDRlJfSVJRMiAgICAgIDB4MTAgICAgLyogSW50ZXJydXB0IHJlcXVlc3QgMiBzZWxlY3QgKi8KKyNkZWZpbmUgXzNDT01fSURDRlJfSVJRMyAgICAgIDB4MjAgICAgLyogSW50ZXJydXB0IHJlcXVlc3QgMyBzZWxlY3QgKi8KKyNkZWZpbmUgXzNDT01fSURDRlJfSVJRNCAgICAgIDB4NDAgICAgLyogSW50ZXJydXB0IHJlcXVlc3QgNCBzZWxlY3QgKi8KKyNkZWZpbmUgXzNDT01fSURDRlJfSVJRNSAgICAgIDB4ODAgICAgLyogSW50ZXJydXB0IHJlcXVlc3QgNSBzZWxlY3QgKi8KKyNkZWZpbmUgXzNDT01fSVJRMiAgICAgIDIKKyNkZWZpbmUgXzNDT01fSVJRMyAgICAgIDMKKyNkZWZpbmUgXzNDT01fSVJRNCAgICAgIDQKKyNkZWZpbmUgXzNDT01fSVJRNSAgICAgIDUKKyNkZWZpbmUgXzNDT01fREFNU0IgICAgICAgICAgIDkKKyNkZWZpbmUgXzNDT01fREFMU0IgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgXzNDT01fVlBUUjIgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgXzNDT01fVlBUUjEgICAgICAgICAgIDB4MGMKKyNkZWZpbmUgXzNDT01fVlBUUjAgICAgICAgICAgIDB4MGQKKyNkZWZpbmUgXzNDT01fUkZNU0IgICAgICAgICAgIDB4MGUKKyNkZWZpbmUgXzNDT01fUkZMU0IgICAgICAgICAgIDB4MGYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitORTEwMDAvMjAwMCBkZWZpbml0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE5FX0FTSUNfT0ZGU0VUCTB4MTAKKyNkZWZpbmUgTkVfUkVTRVQJMHgwRgkJLyogVXNlZCB0byByZXNldCBjYXJkICovCisjZGVmaW5lIE5FX0RBVEEJCTB4MDAJCS8qIFVzZWQgdG8gcmVhZC93cml0ZSBOSUMgbWVtICovCisKKyNkZWZpbmUgQ09NUEVYX1JMMjAwMF9UUklFUwkyMDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis4MzkwIFJlZ2lzdGVyIERlZmluaXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRDgzOTBfUDBfQ09NTUFORAkweDAwCisjZGVmaW5lIEQ4MzkwX1AwX1BTVEFSVAkJMHgwMQorI2RlZmluZSBEODM5MF9QMF9QU1RPUAkJMHgwMgorI2RlZmluZSBEODM5MF9QMF9CT1VORAkJMHgwMworI2RlZmluZSBEODM5MF9QMF9UU1IJCTB4MDQKKyNkZWZpbmUJRDgzOTBfUDBfVFBTUgkJMHgwNAorI2RlZmluZSBEODM5MF9QMF9UQkNSMAkJMHgwNQorI2RlZmluZSBEODM5MF9QMF9UQkNSMQkJMHgwNgorI2RlZmluZSBEODM5MF9QMF9JU1IJCTB4MDcKKyNkZWZpbmUgRDgzOTBfUDBfUlNBUjAJCTB4MDgKKyNkZWZpbmUgRDgzOTBfUDBfUlNBUjEJCTB4MDkKKyNkZWZpbmUgRDgzOTBfUDBfUkJDUjAJCTB4MEEKKyNkZWZpbmUgRDgzOTBfUDBfUkJDUjEJCTB4MEIKKyNkZWZpbmUgRDgzOTBfUDBfUlNSCQkweDBDCisjZGVmaW5lIEQ4MzkwX1AwX1JDUgkJMHgwQworI2RlZmluZSBEODM5MF9QMF9UQ1IJCTB4MEQKKyNkZWZpbmUgRDgzOTBfUDBfRENSCQkweDBFCisjZGVmaW5lIEQ4MzkwX1AwX0lNUgkJMHgwRgorI2RlZmluZSBEODM5MF9QMV9DT01NQU5ECTB4MDAKKyNkZWZpbmUgRDgzOTBfUDFfUEFSMAkJMHgwMQorI2RlZmluZSBEODM5MF9QMV9QQVIxCQkweDAyCisjZGVmaW5lIEQ4MzkwX1AxX1BBUjIJCTB4MDMKKyNkZWZpbmUgRDgzOTBfUDFfUEFSMwkJMHgwNAorI2RlZmluZSBEODM5MF9QMV9QQVI0CQkweDA1CisjZGVmaW5lIEQ4MzkwX1AxX1BBUjUJCTB4MDYKKyNkZWZpbmUgRDgzOTBfUDFfQ1VSUgkJMHgwNworI2RlZmluZSBEODM5MF9QMV9NQVIwCQkweDA4CisKKyNkZWZpbmUgRDgzOTBfQ09NTUFORF9QUzAJMHgwCQkvKiBQYWdlIDAgc2VsZWN0ICovCisjZGVmaW5lIEQ4MzkwX0NPTU1BTkRfUFMxCTB4NDAJCS8qIFBhZ2UgMSBzZWxlY3QgKi8KKyNkZWZpbmUgRDgzOTBfQ09NTUFORF9QUzIJMHg4MAkJLyogUGFnZSAyIHNlbGVjdCAqLworI2RlZmluZQlEODM5MF9DT01NQU5EX1JEMgkweDIwCQkvKiBSZW1vdGUgRE1BIGNvbnRyb2wgKi8KKyNkZWZpbmUgRDgzOTBfQ09NTUFORF9SRDEJMHgxMAorI2RlZmluZSBEODM5MF9DT01NQU5EX1JEMAkweDA4CisjZGVmaW5lIEQ4MzkwX0NPTU1BTkRfVFhQCTB4MDQJCS8qIHRyYW5zbWl0IHBhY2tldCAqLworI2RlZmluZSBEODM5MF9DT01NQU5EX1NUQQkweDAyCQkvKiBzdGFydCAqLworI2RlZmluZSBEODM5MF9DT01NQU5EX1NUUAkweDAxCQkvKiBzdG9wICovCisKKyNkZWZpbmUgRDgzOTBfUkNSX01PTgkJMHgyMAkJLyogbW9uaXRvciBtb2RlICovCisKKyNkZWZpbmUgRDgzOTBfRENSX0ZUMQkJMHg0MAorI2RlZmluZSBEODM5MF9EQ1JfTFMJCTB4MDgJCS8qIExvb3BiYWNrIHNlbGVjdCAqLworI2RlZmluZSBEODM5MF9EQ1JfV1RTCQkweDAxCQkvKiBXb3JkIHRyYW5zZmVyIHNlbGVjdCAqLworCisjZGVmaW5lIEQ4MzkwX0lTUl9QUlgJCTB4MDEJCS8qIHN1Y2Nlc3NmdWwgcmVjdiAqLworI2RlZmluZSBEODM5MF9JU1JfUFRYCQkweDAyCQkvKiBzdWNjZXNzZnVsIHhtaXQgKi8KKyNkZWZpbmUgRDgzOTBfSVNSX1JYRQkJMHgwNAkJLyogcmVjZWl2ZSBlcnJvciAqLworI2RlZmluZSBEODM5MF9JU1JfVFhFCQkweDA4CQkvKiB0cmFuc21pdCBlcnJvciAqLworI2RlZmluZSBEODM5MF9JU1JfT1ZXCQkweDEwCQkvKiBPdmVyZmxvdyAqLworI2RlZmluZSBEODM5MF9JU1JfQ05UCQkweDIwCQkvKiBDb3VudGVyIG92ZXJmbG93ICovCisjZGVmaW5lIEQ4MzkwX0lTUl9SREMJCTB4NDAJCS8qIFJlbW90ZSBETUEgY29tcGxldGUgKi8KKyNkZWZpbmUgRDgzOTBfSVNSX1JTVAkJMHg4MAkJLyogcmVzZXQgKi8KKworI2RlZmluZSBEODM5MF9SU1RBVF9QUlgJCTB4MDEJCS8qIHN1Y2Nlc3NmdWwgcmVjdiAqLworI2RlZmluZSBEODM5MF9SU1RBVF9DUkMJCTB4MDIJCS8qIENSQyBlcnJvciAqLworI2RlZmluZSBEODM5MF9SU1RBVF9GQUUJCTB4MDQJCS8qIEZyYW1lIGFsaWdubWVudCBlcnJvciAqLworI2RlZmluZSBEODM5MF9SU1RBVF9PVkVSCTB4MDgJCS8qIEZJRk8gb3ZlcnJ1biAqLworCisjZGVmaW5lIEQ4MzkwX1RYQlVGX1NJWkUJNgorI2RlZmluZSBEODM5MF9SWEJVRl9FTkQJCTMyCisjZGVmaW5lIEQ4MzkwX1BBR0VfU0laRSAgICAgICAgIDI1NgorCitzdHJ1Y3QgcmluZ2J1ZmZlciB7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBuZXh0OworCXVuc2lnbmVkIHNob3J0IGxlbjsKK307CisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcDgwMjExaGRyLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9wODAyMTFoZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzU0NjcxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcDgwMjExaGRyLmgKQEAgLTAsMCArMSwzMDEgQEAKKy8qIHNyYy9pbmNsdWRlL3dsYW4vcDgwMjExaGRyLmgKKyoKKyogTWFjcm9zLCB0eXBlcywgYW5kIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgODAyLjExIE1BQyBoZWFkZXJzCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqCisqIGxpbnV4LXdsYW4KKyoKKyogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYworKiAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisqCisqICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCisqICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyogICB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKKyogICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorKiAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCisqICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCisqICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyogICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKKyogICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcworKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKyoKKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoKKyogSW5xdWlyaWVzIHJlZ2FyZGluZyB0aGUgbGludXgtd2xhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNhbiBiZQorKiBtYWRlIGRpcmVjdGx5IHRvOgorKgorKiBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMgSW5jLgorKiBpbmZvQGxpbnV4LXdsYW4uY29tCisqIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KKyoKKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoKKyogUG9ydGlvbnMgb2YgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgc29mdHdhcmUgd2VyZSBmdW5kZWQgYnkgCisqIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgorKgorKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKgorKiBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGNvbnN0YW50cyBhbmQgdHlwZXMgdXNlZCBpbiB0aGUgaW50ZXJmYWNlCisqIGJldHdlZW4gYSB3bGFuIGRyaXZlciBhbmQgdGhlIHVzZXIgbW9kZSB1dGlsaXRpZXMuCisqCisqIE5vdGU6IAorKiAgLSBDb25zdGFudCB2YWx1ZXMgYXJlIGFsd2F5cyBpbiBIT1NUIGJ5dGUgb3JkZXIuICBUbyBhc3NpZ24KKyogICAgdmFsdWVzIHRvIG11bHRpLWJ5dGUgZmllbGRzIHRoZXkgX211c3RfIGJlIGNvbnZlcnRlZCB0bworKiAgICBpZWVlIGJ5dGUgb3JkZXIuICBUbyByZXRyaWV2ZSBtdWx0aS1ieXRlIHZhbHVlcyBmcm9tIGluY29taW5nCisqICAgIGZyYW1lcywgdGhleSBtdXN0IGJlIGNvbnZlcnRlZCB0byBob3N0IG9yZGVyLgorKgorKiBBbGwgZnVuY3Rpb25zIGRlY2xhcmVkIGhlcmUgYXJlIGltcGxlbWVudGVkIGluIHA4MDIxMS5jCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTsKKworI2lmbmRlZiBfUDgwMjExSERSX0gKKyNkZWZpbmUgX1A4MDIxMUhEUl9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFByb2plY3QgSW5jbHVkZXMgKi8KKworI2lmbmRlZiAgX1dMQU5fQ09NUEFUX0gKKyNpbmNsdWRlIDx3bGFuL3dsYW5fY29tcGF0Lmg+CisjZW5kaWYKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ29uc3RhbnRzICovCisKKy8qLS0tIFNpemVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0xBTl9BRERSX0xFTgkJCTYKKyNkZWZpbmUgV0xBTl9DUkNfTEVOCQkJNAorI2RlZmluZSBXTEFOX0JTU0lEX0xFTgkJCTYKKyNkZWZpbmUgV0xBTl9CU1NfVFNfTEVOCQkJOAorI2RlZmluZSBXTEFOX0hEUl9BM19MRU4JCQkyNAorI2RlZmluZSBXTEFOX0hEUl9BNF9MRU4JCQkzMAorI2RlZmluZSBXTEFOX1NTSURfTUFYTEVOCQkzMgorI2RlZmluZSBXTEFOX0RBVEFfTUFYTEVOCQkyMzEyCisjZGVmaW5lIFdMQU5fQTNGUl9NQVhMRU4JCShXTEFOX0hEUl9BM19MRU4gKyBXTEFOX0RBVEFfTUFYTEVOICsgV0xBTl9DUkNfTEVOKQorI2RlZmluZSBXTEFOX0E0RlJfTUFYTEVOCQkoV0xBTl9IRFJfQTRfTEVOICsgV0xBTl9EQVRBX01BWExFTiArIFdMQU5fQ1JDX0xFTikKKyNkZWZpbmUgV0xBTl9CRUFDT05fRlJfTUFYTEVOCQkoV0xBTl9IRFJfQTNfTEVOICsgMzM0KQorI2RlZmluZSBXTEFOX0FUSU1fRlJfTUFYTEVOCQkoV0xBTl9IRFJfQTNfTEVOICsgMCkKKyNkZWZpbmUgV0xBTl9ESVNBU1NPQ19GUl9NQVhMRU4JCShXTEFOX0hEUl9BM19MRU4gKyAyKQorI2RlZmluZSBXTEFOX0FTU09DUkVRX0ZSX01BWExFTgkJKFdMQU5fSERSX0EzX0xFTiArIDQ4KQorI2RlZmluZSBXTEFOX0FTU09DUkVTUF9GUl9NQVhMRU4JKFdMQU5fSERSX0EzX0xFTiArIDE2KQorI2RlZmluZSBXTEFOX1JFQVNTT0NSRVFfRlJfTUFYTEVOCShXTEFOX0hEUl9BM19MRU4gKyA1NCkKKyNkZWZpbmUgV0xBTl9SRUFTU09DUkVTUF9GUl9NQVhMRU4JKFdMQU5fSERSX0EzX0xFTiArIDE2KQorI2RlZmluZSBXTEFOX1BST0JFUkVRX0ZSX01BWExFTgkJKFdMQU5fSERSX0EzX0xFTiArIDQ0KQorI2RlZmluZSBXTEFOX1BST0JFUkVTUF9GUl9NQVhMRU4JKFdMQU5fSERSX0EzX0xFTiArIDc4KQorI2RlZmluZSBXTEFOX0FVVEhFTl9GUl9NQVhMRU4JCShXTEFOX0hEUl9BM19MRU4gKyAyNjEpCisjZGVmaW5lIFdMQU5fREVBVVRIRU5fRlJfTUFYTEVOCQkoV0xBTl9IRFJfQTNfTEVOICsgMikKKyNkZWZpbmUgV0xBTl9XRVBfTktFWVMJCQk0CisjZGVmaW5lIFdMQU5fV0VQX01BWEtFWUxFTgkJMTMKKyNkZWZpbmUgV0xBTl9DSEFMTEVOR0VfSUVfTEVOCQkxMzAKKyNkZWZpbmUgV0xBTl9DSEFMTEVOR0VfTEVOCQkxMjgKKyNkZWZpbmUgV0xBTl9XRVBfSVZfTEVOCQkJNAorI2RlZmluZSBXTEFOX1dFUF9JQ1ZfTEVOCQk0CisKKy8qLS0tIEZyYW1lIENvbnRyb2wgRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGcmFtZSBUeXBlcyAqLworI2RlZmluZSBXTEFOX0ZUWVBFX01HTVQJCQkweDAwCisjZGVmaW5lIFdMQU5fRlRZUEVfQ1RMCQkJMHgwMQorI2RlZmluZSBXTEFOX0ZUWVBFX0RBVEEJCQkweDAyCisKKy8qIEZyYW1lIHN1YnR5cGVzICovCisvKiBNYW5hZ2VtZW50ICovCisjZGVmaW5lIFdMQU5fRlNUWVBFX0FTU09DUkVRCQkweDAwCisjZGVmaW5lIFdMQU5fRlNUWVBFX0FTU09DUkVTUAkJMHgwMQorI2RlZmluZSBXTEFOX0ZTVFlQRV9SRUFTU09DUkVRCQkweDAyCisjZGVmaW5lIFdMQU5fRlNUWVBFX1JFQVNTT0NSRVNQCQkweDAzCisjZGVmaW5lIFdMQU5fRlNUWVBFX1BST0JFUkVRCQkweDA0IAorI2RlZmluZSBXTEFOX0ZTVFlQRV9QUk9CRVJFU1AJCTB4MDUKKyNkZWZpbmUgV0xBTl9GU1RZUEVfQkVBQ09OCQkweDA4CisjZGVmaW5lIFdMQU5fRlNUWVBFX0FUSU0JCTB4MDkKKyNkZWZpbmUgV0xBTl9GU1RZUEVfRElTQVNTT0MJCTB4MGEKKyNkZWZpbmUgV0xBTl9GU1RZUEVfQVVUSEVOCQkweDBiCisjZGVmaW5lIFdMQU5fRlNUWVBFX0RFQVVUSEVOCQkweDBjCisKKy8qIENvbnRyb2wgKi8KKyNkZWZpbmUgV0xBTl9GU1RZUEVfQkxPQ0tBQ0tSRVEJCTB4OAorI2RlZmluZSBXTEFOX0ZTVFlQRV9CTE9DS0FDSyAgCQkweDkKKyNkZWZpbmUgV0xBTl9GU1RZUEVfUFNQT0xMCQkweDBhCisjZGVmaW5lIFdMQU5fRlNUWVBFX1JUUwkJCTB4MGIKKyNkZWZpbmUgV0xBTl9GU1RZUEVfQ1RTCQkJMHgwYworI2RlZmluZSBXTEFOX0ZTVFlQRV9BQ0sJCQkweDBkCisjZGVmaW5lIFdMQU5fRlNUWVBFX0NGRU5ECQkweDBlCisjZGVmaW5lIFdMQU5fRlNUWVBFX0NGRU5EQ0ZBQ0sJCTB4MGYKKworLyogRGF0YSAqLworI2RlZmluZSBXTEFOX0ZTVFlQRV9EQVRBT05MWQkJMHgwMAorI2RlZmluZSBXTEFOX0ZTVFlQRV9EQVRBX0NGQUNLCQkweDAxCisjZGVmaW5lIFdMQU5fRlNUWVBFX0RBVEFfQ0ZQT0xMCQkweDAyCisjZGVmaW5lIFdMQU5fRlNUWVBFX0RBVEFfQ0ZBQ0tfQ0ZQT0xMCTB4MDMKKyNkZWZpbmUgV0xBTl9GU1RZUEVfTlVMTAkJMHgwNAorI2RlZmluZSBXTEFOX0ZTVFlQRV9DRkFDSwkJMHgwNQorI2RlZmluZSBXTEFOX0ZTVFlQRV9DRlBPTEwJCTB4MDYKKyNkZWZpbmUgV0xBTl9GU1RZUEVfQ0ZBQ0tfQ0ZQT0xMCTB4MDcKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogTWFjcm9zICovCisKKy8qLS0tIEZDIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIE1hY3JvcyB0byBnZXQvc2V0IHRoZSBiaXRmaWVsZHMgb2YgdGhlIEZyYW1lIENvbnRyb2wgRmllbGQgKi8KKy8qICBHRVRfRkNfPz8/IC0gdGFrZXMgdGhlIGhvc3QgYnl0ZS1vcmRlciB2YWx1ZSBvZiBhbiBGQyAgICAgKi8KKy8qICAgICAgICAgICAgICAgYW5kIHJldHJpZXZlcyB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgYml0ZmllbGRzIGFuZCBtb3ZlcyB0aGF0IHZhbHVlIHNvIGl0cyBsc2IgaXMgKi8KKy8qICAgICAgICAgICAgICAgaW4gYml0IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTRVRfRkNfPz8/IC0gdGFrZXMgYSBob3N0IG9yZGVyIHZhbHVlIGZvciBvbmUgb2YgdGhlIEZDICAgKi8KKy8qICAgICAgICAgICAgICAgYml0ZmllbGRzIGFuZCBtb3ZlcyBpdCB0byB0aGUgcHJvcGVyIGJpdCAgICAgKi8KKy8qICAgICAgICAgICAgICAgbG9jYXRpb24gZm9yIE9SaW5nIGludG8gYSBob3N0IG9yZGVyIEZDLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgVG8gc2VuZCB0aGUgRkMgcHJvZHVjZWQgZnJvbSBTRVRfRkNfPz8/LCAgICAgKi8KKy8qICAgICAgICAgICAgICAgb25lIG11c3QgcHV0IHRoZSBieXRlcyBpbiBJRUVFIG9yZGVyLiAgICAgICAgKi8KKy8qICBlLmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBwcmludGYoInRoZSBmcmFtZSBzdWJ0eXBlIGlzICV4IiwgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICBHRVRfRkNfRlRZUEUoIGllZWUyaG9zdCggcnguZmMgKSkpICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICB0eC5mYyA9IGhvc3QyaWVlZSggU0VUX0ZDX0ZUWVBFKFdMQU5fRlRZUF9DVEwpIHwgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0ZDX0ZTVFlQRShXTEFOX0ZTVFlQRV9SVFMpICk7ICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBXTEFOX0dFVF9GQ19QVkVSKG4pCSAoKChVSU5UMTYpKG4pKSAmIChCSVQwIHwgQklUMSkpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZUWVBFKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQyIHwgQklUMykpID4+IDIpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZTVFlQRShuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUNHxCSVQ1fEJJVDZ8QklUNykpID4+IDQpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1RPRFMobikgCSgoKChVSU5UMTYpKG4pKSAmIChCSVQ4KSkgPj4gOCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfRlJPTURTKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQ5KSkgPj4gOSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfTU9SRUZSQUcobikgKCgoKFVJTlQxNikobikpICYgKEJJVDEwKSkgPj4gMTApCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1JFVFJZKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQxMSkpID4+IDExKQorI2RlZmluZSBXTEFOX0dFVF9GQ19QV1JNR1QobikJKCgoKFVJTlQxNikobikpICYgKEJJVDEyKSkgPj4gMTIpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVEQVRBKG4pICgoKChVSU5UMTYpKG4pKSAmIChCSVQxMykpID4+IDEzKQorI2RlZmluZSBXTEFOX0dFVF9GQ19JU1dFUChuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUMTQpKSA+PiAxNCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfT1JERVIobikJKCgoKFVJTlQxNikobikpICYgKEJJVDE1KSkgPj4gMTUpCisKKyNkZWZpbmUgV0xBTl9TRVRfRkNfUFZFUihuKQkoKFVJTlQxNikobikpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX0ZUWVBFKG4pCSgoKFVJTlQxNikobikpIDw8IDIpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX0ZTVFlQRShuKQkoKChVSU5UMTYpKG4pKSA8PCA0KQorI2RlZmluZSBXTEFOX1NFVF9GQ19UT0RTKG4pIAkoKChVSU5UMTYpKG4pKSA8PCA4KQorI2RlZmluZSBXTEFOX1NFVF9GQ19GUk9NRFMobikJKCgoVUlOVDE2KShuKSkgPDwgOSkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfTU9SRUZSQUcobikgKCgoVUlOVDE2KShuKSkgPDwgMTApCisjZGVmaW5lIFdMQU5fU0VUX0ZDX1JFVFJZKG4pCSgoKFVJTlQxNikobikpIDw8IDExKQorI2RlZmluZSBXTEFOX1NFVF9GQ19QV1JNR1QobikJKCgoVUlOVDE2KShuKSkgPDwgMTIpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVEQVRBKG4pICgoKFVJTlQxNikobikpIDw8IDEzKQorI2RlZmluZSBXTEFOX1NFVF9GQ19JU1dFUChuKQkoKChVSU5UMTYpKG4pKSA8PCAxNCkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfT1JERVIobikJKCgoVUlOVDE2KShuKSkgPDwgMTUpCisKKy8qLS0tIER1cmF0aW9uIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIE1hY3JvcyB0byBnZXQvc2V0IHRoZSBiaXRmaWVsZHMgb2YgdGhlIER1cmF0aW9uIEZpZWxkICAgICAgKi8KKy8qICAtIHRoZSBkdXJhdGlvbiB2YWx1ZSBpcyBvbmx5IHZhbGlkIHdoZW4gYml0MTUgaXMgemVybyAgICAgKi8KKy8qICAtIHRoZSBmaXJtd2FyZSBoYW5kbGVzIHRoZXNlIHZhbHVlcywgc28gSSdtIG5vdCBnb2luZyAgICAgKi8KKy8qICAgIHRoZXNlIG1hY3JvcyByaWdodCBub3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0gU2VxdWVuY2UgQ29udHJvbCAgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogTWFjcm9zIHRvIGdldC9zZXQgdGhlIGJpdGZpZWxkcyBvZiB0aGUgU2VxdWVuY2UgQ29udHJvbCAgICAqLworLyogRmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJHTlVNKG4pICgoKFVJTlQxNikobikpICYgKEJJVDB8QklUMXxCSVQyfEJJVDMpKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRTlVNKG4pICgoKChVSU5UMTYpKG4pKSAmICh+KEJJVDB8QklUMXxCSVQyfEJJVDMpKSkgPj4gNCkgCisKKy8qLS0tIERhdGEgcHRyIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENyZWF0ZXMgYSBVSU5UOCogdG8gdGhlIGRhdGEgcG9ydGlvbiBvZiBhIGZyYW1lICAgICAgICAgICAgKi8KKy8qIEFzc3VtZXMgeW91J3JlIHBhc3NpbmcgaW4gYSBwdHIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGRyKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0xBTl9IRFJfQTNfREFUQVAocCkgKCgoVUlOVDgqKShwKSkgKyBXTEFOX0hEUl9BM19MRU4pCisjZGVmaW5lIFdMQU5fSERSX0E0X0RBVEFQKHApICgoKFVJTlQ4KikocCkpICsgV0xBTl9IRFJfQTRfTEVOKQorCisjZGVmaW5lIERPVDExX1JBVEU1X0lTQkFTSUNfR0VUKHIpICAgICAoKChVSU5UOCkocikpICYgQklUNykKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFR5cGVzICovCisKKy8qIEJTUyBUaW1lc3RhbXAgKi8KK3R5cGVkZWYgVUlOVDggd2xhbl9ic3NfdHNfdFtXTEFOX0JTU19UU19MRU5dOworCisvKiBHZW5lcmljIDgwMi4xMSBIZWFkZXIgdHlwZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2hkcl9hMworeworCVVJTlQxNglmYzsKKwlVSU5UMTYJZHVyOworCVVJTlQ4CWExW1dMQU5fQUREUl9MRU5dOworCVVJTlQ4CWEyW1dMQU5fQUREUl9MRU5dOworCVVJTlQ4CWEzW1dMQU5fQUREUl9MRU5dOworCVVJTlQxNglzZXE7Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMV9oZHJfYTNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2hkcl9hNAoreworCVVJTlQxNglmYzsKKwlVSU5UMTYJZHVyOworCVVJTlQ4CWExW1dMQU5fQUREUl9MRU5dOworCVVJTlQ4CWEyW1dMQU5fQUREUl9MRU5dOworCVVJTlQ4CWEzW1dMQU5fQUREUl9MRU5dOworCVVJTlQxNglzZXE7CisJVUlOVDgJYTRbV0xBTl9BRERSX0xFTl07Cit9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMV9oZHJfYTRfdDsKKwordHlwZWRlZiB1bmlvbiBwODAyMTFfaGRyCit7CisJcDgwMjExX2hkcl9hM190CQlhMzsKKwlwODAyMTFfaGRyX2E0X3QJCWE0OworfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFfaGRyX3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEV4dGVybiBEZWNsYXJhdGlvbnMgKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCisKKy8qIEZyYW1lIGFuZCBoZWFkZXIgbGVuZ2h0IG1hY3JvcyAqLworCisjZGVmaW5lIFdMQU5fQ1RMX0ZSQU1FTEVOKGZzdHlwZSkgKFwKKwkoZnN0eXBlKSA9PSBXTEFOX0ZTVFlQRV9CTE9DS0FDS1JFUQk/IDI0IDogXAorCShmc3R5cGUpID09IFdMQU5fRlNUWVBFX0JMT0NLQUNLICAgCT8gMTUyIDogXAorCShmc3R5cGUpID09IFdMQU5fRlNUWVBFX1BTUE9MTAkJPyAyMCA6IFwKKwkoZnN0eXBlKSA9PSBXTEFOX0ZTVFlQRV9SVFMJCT8gMjAgOiBcCisJKGZzdHlwZSkgPT0gV0xBTl9GU1RZUEVfQ1RTCQk/IDE0IDogXAorCShmc3R5cGUpID09IFdMQU5fRlNUWVBFX0FDSwkJPyAxNCA6IFwKKwkoZnN0eXBlKSA9PSBXTEFOX0ZTVFlQRV9DRkVORAkJPyAyMCA6IFwKKwkoZnN0eXBlKSA9PSBXTEFOX0ZTVFlQRV9DRkVORENGQUNLCT8gMjAgOiA0KQorCisjZGVmaW5lIFdMQU5fRkNTX0xFTgkJCTQKKworLyogZnRjbCBpbiBIT1NUIG9yZGVyICovCitpbmxpbmUgc3RhdGljIFVJTlQxNiBwODAyMTFfaGVhZGVybGVuKFVJTlQxNiBmY3RsKQoreworCVVJTlQxNiBoZHJsZW4gPSAwOworCisJc3dpdGNoICggV0xBTl9HRVRfRkNfRlRZUEUoZmN0bCkgKSB7CisJY2FzZSBXTEFOX0ZUWVBFX01HTVQ6CisJCWhkcmxlbiA9IFdMQU5fSERSX0EzX0xFTjsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0ZUWVBFX0RBVEE6CisJCWhkcmxlbiA9IFdMQU5fSERSX0EzX0xFTjsKKwkJaWYgKCBXTEFOX0dFVF9GQ19UT0RTKGZjdGwpICYmIFdMQU5fR0VUX0ZDX0ZST01EUyhmY3RsKSApIHsKKwkJCWhkcmxlbiArPSBXTEFOX0FERFJfTEVOOworCQl9CisJCWJyZWFrOworCWNhc2UgV0xBTl9GVFlQRV9DVEw6CisJCWhkcmxlbiA9IFdMQU5fQ1RMX0ZSQU1FTEVOKFdMQU5fR0VUX0ZDX0ZTVFlQRShmY3RsKSkgLSAKKwkJCVdMQU5fRkNTX0xFTjsgCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWhkcmxlbiA9IFdMQU5fSERSX0EzX0xFTjsKKwl9CisJCisJcmV0dXJuIGhkcmxlbjsKK30KKworI2VuZGlmIC8qIF9QODAyMTFIRFJfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcGNuZXQzMi5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcGNuZXQzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyM2JjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9wY25ldDMyLmMKQEAgLTAsMCArMSwxMDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgcGNuZXQzMi5jIC0tIEV0aGVyYm9vdCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgQU1EIFBDbmV0MzIKKyogICAgV3JpdHRlbiAyMDAzLTIwMDMgYnkgVGltb3RoeSBMZWdnZSA8dGxlZ2dlQHJvZ2Vycy5jb20+CisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAgICBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYmFzZWQgb246CisqCQlwY25ldDMyLmM6IEFuIEFNRCBQQ25ldDMyIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXg6CisqCisqCShDKSAxOTk2LTE5OTkgVGhvbWFzIEJvZ2VuZG9lcmZlcgorKgkJU2VlIExpbnV4IERyaXZlciBmb3IgZnVsbCBpbmZvcm1hdGlvbgorKgkKKyoJVGhlIHRyYW5zbWl0IGFuZCBwb2xsIGZ1bmN0aW9ucyB3ZXJlIHdyaXR0ZW4gd2l0aCByZWZlcmVuY2UgdG86CisqCWxhbmNlLmMgLSBMQU5DRSBOSUMgZHJpdmVyIGZvciBFdGhlcmJvb3Qgd3JpdHRlbiBieSBLZW4gWWFwIAorKgkKKyoJTGludXggRHJpdmVyIFZlcnNpb24gMS4yN2EsIDEwLjAyLjIwMDIKKyogCisqIAorKiAgICBSRVZJU0lPTiBISVNUT1JZOgorKiAgICA9PT09PT09PT09PT09PT09CisqICAgIHYxLjAJMDgtMDYtMjAwMwl0aW1sZWdnZQlJbml0aWFsIHBvcnQgb2YgTGludXggZHJpdmVyCisqICAgIHYxLjEJMDgtMjMtMjAwMwl0aW1sZWdnZQlBZGQgbXVsdGljYXN0IHN1cHBvcnQKKyogICAgdjEuMgkwMS0xNy0yMDA0CXRpbWxlZ2dlCUluaXRpYWwgZHJpdmVyIG91dHB1dCBjbGVhbnVwCisqICAgIHYxLjMJMDMtMjktMjAwNAl0aW1sZWdnZQlNb3JlIGRyaXZlciBjbGVhbnVwCisqICAgIAorKiAgICBJbmRlbnQgT3B0aW9uczogaW5kZW50IC1rciAtaTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSAibWlpLmgiCisKKy8qIHZvaWQgaGV4X2R1bXAoY29uc3QgY2hhciAqZGF0YSwgY29uc3QgdW5zaWduZWQgaW50IGxlbik7ICovCisKKy8qIEV0aGVyYm9vdCBTcGVjaWZpYyBkZWZpbmF0aW9ucyAqLworI2RlZmluZSBkcnZfdmVyc2lvbiAidjEuMyIKKyNkZWZpbmUgZHJ2X2RhdGUgIjAzLTI5LTIwMDQiCisKK3N0YXRpYyB1MzIgaW9hZGRyOwkJLyogR2xvYmFsbHkgdXNlZCBmb3IgdGhlIGNhcmQncyBpbyBhZGRyZXNzICovCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIHBjbmV0MzJfb3BlcmF0aW9uczsKKworI2lmZGVmIEVERUJVRworI2RlZmluZSBkcHJpbnRmKHgpIHByaW50ZiB4CisjZWxzZQorI2RlZmluZSBkcHJpbnRmKHgpCisjZW5kaWYKKworLyogQ29uZGVuc2VkIG9wZXJhdGlvbnMgZm9yIHJlYWRhYmlsaXR5LiAqLworI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhhZGRyKSkKKyNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKSAgYnVzX3RvX3ZpcnQobGUzMl90b19jcHUoYWRkcikpCisKKy8qIEVuZCBFdGhlcmJvb3QgU3BlY2lmaWMgKi8KKworc3RhdGljIGludCBjYXJkc19mb3VuZCA9IDAgLyogX19pbml0ZGF0YSAqLyA7CisKKyNpZmRlZiBSRU1PVkUKKy8qIEZJWE1FOiBSZW1vdmUgdGhlc2UgdGhleSBhcmUgcHJvYmFibHkgcG9pbnRsZXNzICovCisKKy8qIAorICogVkxCIEkvTyBhZGRyZXNzZXMgCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGNuZXQzMl9wb3J0bGlzdFtdIC8qX19pbml0ZGF0YSAqLyAgPQoreyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMCB9OworCitzdGF0aWMgaW50IHBjbmV0MzJfZGVidWcgPSAxOworc3RhdGljIGludCB0eF9zdGFydCA9IDE7CS8qIE1hcHBpbmcgLS0gMDoyMCwgMTo2NCwgMjoxMjgsIDM6fjIyMCAoZGVwZW5kcyBvbiBjaGlwIHZlcnMpICovCitzdGF0aWMgaW50IHBjbmV0MzJ2bGI7CQkvKiBjaGVjayBmb3IgVkxCIGNhcmRzID8gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpwY25ldDMyX2RldjsKKworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSA4MDsKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMjAwOworI2VuZGlmCisjZGVmaW5lIFBDTkVUMzJfUE9SVF9BVUkgICAgICAweDAwCisjZGVmaW5lIFBDTkVUMzJfUE9SVF8xMEJUICAgICAweDAxCisjZGVmaW5lIFBDTkVUMzJfUE9SVF9HUFNJICAgICAweDAyCisjZGVmaW5lIFBDTkVUMzJfUE9SVF9NSUkgICAgICAweDAzCisKKyNkZWZpbmUgUENORVQzMl9QT1JUX1BPUlRTRUwgIDB4MDMKKyNkZWZpbmUgUENORVQzMl9QT1JUX0FTRUwgICAgIDB4MDQKKyNkZWZpbmUgUENORVQzMl9QT1JUXzEwMCAgICAgIDB4NDAKKyNkZWZpbmUgUENORVQzMl9QT1JUX0ZECSAgICAgIDB4ODAKKworI2RlZmluZSBQQ05FVDMyX0RNQV9NQVNLIDB4ZmZmZmZmZmYKKworLyoKKyAqIHRhYmxlIHRvIHRyYW5zbGF0ZSBvcHRpb24gdmFsdWVzIGZyb20gdHVsaXAKKyAqIHRvIGludGVybmFsIG9wdGlvbnMKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgb3B0aW9uc19tYXBwaW5nW10gPSB7CisJUENORVQzMl9QT1JUX0FTRUwsCS8qICAwIEF1dG8tc2VsZWN0ICAgICAgKi8KKwlQQ05FVDMyX1BPUlRfQVVJLAkvKiAgMSBCTkMvQVVJICAgICAgICAgICovCisJUENORVQzMl9QT1JUX0FVSSwJLyogIDIgQVVJL0JOQyAgICAgICAgICAqLworCVBDTkVUMzJfUE9SVF9BU0VMLAkvKiAgMyBub3Qgc3VwcG9ydGVkICAgICovCisJUENORVQzMl9QT1JUXzEwQlQgfCBQQ05FVDMyX1BPUlRfRkQsCS8qICA0IDEwYmFzZVQtRkQgICAgICAgKi8KKwlQQ05FVDMyX1BPUlRfQVNFTCwJLyogIDUgbm90IHN1cHBvcnRlZCAgICAqLworCVBDTkVUMzJfUE9SVF9BU0VMLAkvKiAgNiBub3Qgc3VwcG9ydGVkICAgICovCisJUENORVQzMl9QT1JUX0FTRUwsCS8qICA3IG5vdCBzdXBwb3J0ZWQgICAgKi8KKwlQQ05FVDMyX1BPUlRfQVNFTCwJLyogIDggbm90IHN1cHBvcnRlZCAgICAqLworCVBDTkVUMzJfUE9SVF9NSUksCS8qICA5IE1JSSAxMGJhc2VUICAgICAgKi8KKwlQQ05FVDMyX1BPUlRfTUlJIHwgUENORVQzMl9QT1JUX0ZELAkvKiAxMCBNSUkgMTBiYXNlVC1GRCAgICovCisJUENORVQzMl9QT1JUX01JSSwJLyogMTEgTUlJIChhdXRvc2VsKSAgICAqLworCVBDTkVUMzJfUE9SVF8xMEJULAkvKiAxMiAxMEJhc2VUICAgICAgICAgICovCisJUENORVQzMl9QT1JUX01JSSB8IFBDTkVUMzJfUE9SVF8xMDAsCS8qIDEzIE1JSSAxMDBCYXNlVHggICAgKi8KKwlQQ05FVDMyX1BPUlRfTUlJIHwgUENORVQzMl9QT1JUXzEwMCB8IFBDTkVUMzJfUE9SVF9GRCwJLyogMTQgTUlJIDEwMEJhc2VUeC1GRCAqLworCVBDTkVUMzJfUE9SVF9BU0VMCS8qIDE1IG5vdCBzdXBwb3J0ZWQgICAgKi8KK307CisKKyNkZWZpbmUgTUFYX1VOSVRTIDgJCS8qIE1vcmUgYXJlIHN1cHBvcnRlZCwgbGltaXQgb25seSBvbiBvcHRpb25zICovCitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXTsKKworLyoKKyAqCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKyAqIAorICogVGhpcyBkcml2ZXIgdXNlcyB0aGUgc2FtZSBzb2Z0d2FyZSBzdHJ1Y3R1cmUgYXMgdGhlIG5vcm1hbCBsYW5jZQorICogZHJpdmVyLiBTbyBsb29rIGZvciBhIHZlcmJvc2UgZGVzY3JpcHRpb24gaW4gbGFuY2UuYy4gVGhlIGRpZmZlcmVuY2VzCisgKiB0byB0aGUgbm9ybWFsIGxhbmNlIGRyaXZlciBpcyB0aGUgdXNlIG9mIHRoZSAzMmJpdCBtb2RlIG9mIFBDbmV0MzIKKyAqIGFuZCBQQ25ldFBDSSBjaGlwcy4gQmVjYXVzZSB0aGVzZSBjaGlwcyBhcmUgMzJiaXQgY2hpcHMsIHRoZXJlIGlzIG5vCisgKiAxNk1CIGxpbWl0YXRpb24gYW5kIHdlIGRvbid0IG5lZWQgYm91bmNlIGJ1ZmZlcnMuCisgKi8KKworCisKKy8qCisgKiBTZXQgdGhlIG51bWJlciBvZiBUeCBhbmQgUnggYnVmZmVycywgdXNpbmcgTG9nXzIoIyBidWZmZXJzKS4KKyAqIFJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMgYXJlIDQgVHggYnVmZmVycywgYW5kIDE2IFJ4IGJ1ZmZlcnMuCisgKiBUaGF0IHRyYW5zbGF0ZXMgdG8gMiAoNCA9PSAyXl4yKSBhbmQgNCAoMTYgPT0gMl5eNCkuCisgKi8KKyNpZm5kZWYgUENORVQzMl9MT0dfVFhfQlVGRkVSUworI2RlZmluZSBQQ05FVDMyX0xPR19UWF9CVUZGRVJTIDEKKyNkZWZpbmUgUENORVQzMl9MT0dfUlhfQlVGRkVSUyAyCisjZW5kaWYKKworI2RlZmluZSBUWF9SSU5HX1NJWkUJCSgxIDw8IChQQ05FVDMyX0xPR19UWF9CVUZGRVJTKSkKKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSwkoVFhfUklOR19TSVpFIC0gMSkKKy8qIEZJWE1FOiBGaXggdGhpcyB0byBhbGxvdyBtdWx0aXBsZSB0eF9yaW5nIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIFRYX1JJTkdfTEVOX0JJVFMJMHgwMDAwCS8qUENORVQzMl9MT0dfVFhfQlVGRkVSUykgPDwgMTIpICovCisKKyNkZWZpbmUgUlhfUklOR19TSVpFCQkoMSA8PCAoUENORVQzMl9MT0dfUlhfQlVGRkVSUykpCisjZGVmaW5lIFJYX1JJTkdfTU9EX01BU0sJKFJYX1JJTkdfU0laRSAtIDEpCisjZGVmaW5lIFJYX1JJTkdfTEVOX0JJVFMJKChQQ05FVDMyX0xPR19SWF9CVUZGRVJTKSA8PCA0KQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1NDQKKworLyogT2Zmc2V0cyBmcm9tIGJhc2UgSS9PIGFkZHJlc3MuICovCisjZGVmaW5lIFBDTkVUMzJfV0lPX1JEUAkJMHgxMAorI2RlZmluZSBQQ05FVDMyX1dJT19SQVAJCTB4MTIKKyNkZWZpbmUgUENORVQzMl9XSU9fUkVTRVQJMHgxNAorI2RlZmluZSBQQ05FVDMyX1dJT19CRFAJCTB4MTYKKworI2RlZmluZSBQQ05FVDMyX0RXSU9fUkRQCTB4MTAKKyNkZWZpbmUgUENORVQzMl9EV0lPX1JBUAkweDE0CisjZGVmaW5lIFBDTkVUMzJfRFdJT19SRVNFVAkweDE4CisjZGVmaW5lIFBDTkVUMzJfRFdJT19CRFAJMHgxQworCisjZGVmaW5lIFBDTkVUMzJfVE9UQUxfU0laRQkweDIwCisKKy8qIFRoZSBQQ05FVDMyIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IHBjbmV0MzJfcnhfaGVhZCB7CisJdTMyIGJhc2U7CisJczE2IGJ1Zl9sZW5ndGg7CisJczE2IHN0YXR1czsKKwl1MzIgbXNnX2xlbmd0aDsKKwl1MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgcGNuZXQzMl90eF9oZWFkIHsKKwl1MzIgYmFzZTsKKwlzMTYgbGVuZ3RoOworCXMxNiBzdGF0dXM7CisJdTMyIG1pc2M7CisJdTMyIHJlc2VydmVkOworfTsKKworLyogVGhlIFBDTkVUMzIgMzItQml0IGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgcGNuZXQzMl9pbml0X2Jsb2NrIHsKKwl1MTYgbW9kZTsKKwl1MTYgdGxlbl9ybGVuOworCXU4IHBoeXNfYWRkcls2XTsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTMyIGZpbHRlclsyXTsKKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKwl1MzIgcnhfcmluZzsKKwl1MzIgdHhfcmluZzsKK307CisvKiBQQ25ldDMyIGFjY2VzcyBmdW5jdGlvbnMgKi8KK3N0cnVjdCBwY25ldDMyX2FjY2VzcyB7CisJdTE2KCpyZWFkX2NzcikgKHVuc2lnbmVkIGxvbmcsIGludCk7CisJdm9pZCAoKndyaXRlX2NzcikgKHVuc2lnbmVkIGxvbmcsIGludCwgdTE2KTsKKwkgdTE2KCpyZWFkX2JjcikgKHVuc2lnbmVkIGxvbmcsIGludCk7CisJdm9pZCAoKndyaXRlX2JjcikgKHVuc2lnbmVkIGxvbmcsIGludCwgdTE2KTsKKwkgdTE2KCpyZWFkX3JhcCkgKHVuc2lnbmVkIGxvbmcpOworCXZvaWQgKCp3cml0ZV9yYXApICh1bnNpZ25lZCBsb25nLCB1MTYpOworCXZvaWQgKCpyZXNldCkgKHVuc2lnbmVkIGxvbmcpOworfTsKKworLyogRGVmaW5lIHRoZSBUWCBhbmQgUlggRGVzY3JpcHRvcnMgYW5kIFJpbmdzICovCitzdHJ1Y3QgeworCXN0cnVjdCBwY25ldDMyX3R4X2hlYWQgdHhfcmluZ1tUWF9SSU5HX1NJWkVdCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CisJc3RydWN0IHBjbmV0MzJfcnhfaGVhZCByeF9yaW5nW1JYX1JJTkdfU0laRV0KKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKKwl1bnNpZ25lZCBjaGFyIHR4YltUWF9SSU5HX1NJWkVdW1BLVF9CVUZfU1pdOworCXVuc2lnbmVkIGNoYXIgcnhiW1JYX1JJTkdfU0laRV1bUEtUX0JVRl9TWl07Cit9IHBjbmV0MzJfYnVmcyBfX3NoYXJlZDsKKworCisvKgorICogVGhlIGZpcnN0IHRocmVlIGZpZWxkcyBvZiBwY25ldDMyX3ByaXZhdGUgYXJlIHJlYWQgYnkgdGhlIGV0aGVybmV0IGRldmljZSAKKyAqIHNvIHdlIGFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBieSBwY2lfYWxsb2NfY29uc2lzdGVudCgpLgorICovCisjZGVmaW5lIE1JSV9DTlQgNAorc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSB7CisJc3RydWN0IHBjbmV0MzJfaW5pdF9ibG9jayBpbml0X2Jsb2NrOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwkvKiBQb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHBjaSBkZXZpY2Ugc3RydWN0dXJlICovCisJY29uc3QgY2hhciAqbmFtZTsKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworCXN0cnVjdCBza19idWZmICp0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHBjbmV0MzJfYWNjZXNzIGE7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwljaGFyIHR4X2Z1bGw7CisJaW50IG9wdGlvbnM7CisJaW50IHNoYXJlZF9pcnE6MSwJLyogc2hhcmVkIGlycSBwb3NzaWJsZSAqLworCSBsdGludDoxLAkJLyogZW5hYmxlIFR4RG9uZS1pbnRyIGluaGliaXRvciAqLworCSBkeHN1ZmxvOjEsCQkvKiBkaXNhYmxlIHRyYW5zbWl0IHN0b3Agb24gdWZsbyAqLworCSBtaWk6MTsJCQkvKiBtaWkgcG9ydCBhdmFpbGFibGUgKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCXVuc2lnbmVkIGNoYXIgcGh5c1tNSUlfQ05UXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dDsKKwlpbnQgZnVsbF9kdXBsZXg6MTsKK30gbHB4OworCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHA7CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pOworI2lmIDAKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwKKwkJICAgICAgIGludCB2YWwpOworI2VuZGlmCitlbnVtIHBjaV9mbGFnc19iaXQgeworCVBDSV9VU0VTX0lPID0gMSwgUENJX1VTRVNfTUVNID0gMiwgUENJX1VTRVNfTUFTVEVSID0gNCwKKwlQQ0lfQUREUjAgPSAweDEwIDw8IDAsIFBDSV9BRERSMSA9IDB4MTAgPDwgMSwgUENJX0FERFIyID0KKwkgICAgMHgxMCA8PCAyLCBQQ0lfQUREUjMgPSAweDEwIDw8IDMsCit9OworCisKK3N0YXRpYyB1MTYgcGNuZXQzMl93aW9fcmVhZF9jc3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisJb3V0dyhpbmRleCwgYWRkciArIFBDTkVUMzJfV0lPX1JBUCk7CisJcmV0dXJuIGludyhhZGRyICsgUENORVQzMl9XSU9fUkRQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl93aW9fd3JpdGVfY3NyKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworCW91dHcoaW5kZXgsIGFkZHIgKyBQQ05FVDMyX1dJT19SQVApOworCW91dHcodmFsLCBhZGRyICsgUENORVQzMl9XSU9fUkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX3dpb19yZWFkX2Jjcih1bnNpZ25lZCBsb25nIGFkZHIsIGludCBpbmRleCkKK3sKKwlvdXR3KGluZGV4LCBhZGRyICsgUENORVQzMl9XSU9fUkFQKTsKKwlyZXR1cm4gaW53KGFkZHIgKyBQQ05FVDMyX1dJT19CRFApOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dpb193cml0ZV9iY3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisJb3V0dyhpbmRleCwgYWRkciArIFBDTkVUMzJfV0lPX1JBUCk7CisJb3V0dyh2YWwsIGFkZHIgKyBQQ05FVDMyX1dJT19CRFApOworfQorCitzdGF0aWMgdTE2IHBjbmV0MzJfd2lvX3JlYWRfcmFwKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gaW53KGFkZHIgKyBQQ05FVDMyX1dJT19SQVApOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dpb193cml0ZV9yYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgdmFsKQoreworCW91dHcodmFsLCBhZGRyICsgUENORVQzMl9XSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl93aW9fcmVzZXQodW5zaWduZWQgbG9uZyBhZGRyKQoreworCWludyhhZGRyICsgUENORVQzMl9XSU9fUkVTRVQpOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfd2lvX2NoZWNrKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlvdXR3KDg4LCBhZGRyICsgUENORVQzMl9XSU9fUkFQKTsKKwlyZXR1cm4gKGludyhhZGRyICsgUENORVQzMl9XSU9fUkFQKSA9PSA4OCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgcGNuZXQzMl93aW8gPSB7CisgICAgICByZWFkX2NzcjpwY25ldDMyX3dpb19yZWFkX2NzciwKKyAgICAgIHdyaXRlX2NzcjpwY25ldDMyX3dpb193cml0ZV9jc3IsCisgICAgICByZWFkX2JjcjpwY25ldDMyX3dpb19yZWFkX2JjciwKKyAgICAgIHdyaXRlX2JjcjpwY25ldDMyX3dpb193cml0ZV9iY3IsCisgICAgICByZWFkX3JhcDpwY25ldDMyX3dpb19yZWFkX3JhcCwKKyAgICAgIHdyaXRlX3JhcDpwY25ldDMyX3dpb193cml0ZV9yYXAsCisgICAgICByZXNldDpwY25ldDMyX3dpb19yZXNldAorfTsKKworc3RhdGljIHUxNiBwY25ldDMyX2R3aW9fcmVhZF9jc3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisJb3V0bChpbmRleCwgYWRkciArIFBDTkVUMzJfRFdJT19SQVApOworCXJldHVybiAoaW5sKGFkZHIgKyBQQ05FVDMyX0RXSU9fUkRQKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZHdpb193cml0ZV9jc3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisJb3V0bChpbmRleCwgYWRkciArIFBDTkVUMzJfRFdJT19SQVApOworCW91dGwodmFsLCBhZGRyICsgUENORVQzMl9EV0lPX1JEUCk7Cit9CisKK3N0YXRpYyB1MTYgcGNuZXQzMl9kd2lvX3JlYWRfYmNyKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4KQoreworCW91dGwoaW5kZXgsIGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKTsKKwlyZXR1cm4gKGlubChhZGRyICsgUENORVQzMl9EV0lPX0JEUCkgJiAweGZmZmYpOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2R3aW9fd3JpdGVfYmNyKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworCW91dGwoaW5kZXgsIGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKTsKKwlvdXRsKHZhbCwgYWRkciArIFBDTkVUMzJfRFdJT19CRFApOworfQorCitzdGF0aWMgdTE2IHBjbmV0MzJfZHdpb19yZWFkX3JhcCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIChpbmwoYWRkciArIFBDTkVUMzJfRFdJT19SQVApICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3dyaXRlX3JhcCh1bnNpZ25lZCBsb25nIGFkZHIsIHUxNiB2YWwpCit7CisJb3V0bCh2YWwsIGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3Jlc2V0KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbmwoYWRkciArIFBDTkVUMzJfRFdJT19SRVNFVCk7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9kd2lvX2NoZWNrKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlvdXRsKDg4LCBhZGRyICsgUENORVQzMl9EV0lPX1JBUCk7CisJcmV0dXJuICgoaW5sKGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKSAmIDB4ZmZmZikgPT0gODgpOworfQorCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfYWNjZXNzIHBjbmV0MzJfZHdpbyA9IHsKKyAgICAgIHJlYWRfY3NyOnBjbmV0MzJfZHdpb19yZWFkX2NzciwKKyAgICAgIHdyaXRlX2NzcjpwY25ldDMyX2R3aW9fd3JpdGVfY3NyLAorICAgICAgcmVhZF9iY3I6cGNuZXQzMl9kd2lvX3JlYWRfYmNyLAorICAgICAgd3JpdGVfYmNyOnBjbmV0MzJfZHdpb193cml0ZV9iY3IsCisgICAgICByZWFkX3JhcDpwY25ldDMyX2R3aW9fcmVhZF9yYXAsCisgICAgICB3cml0ZV9yYXA6cGNuZXQzMl9kd2lvX3dyaXRlX3JhcCwKKyAgICAgIHJlc2V0OnBjbmV0MzJfZHdpb19yZXNldAorfTsKKworCisvKiBJbml0aWFsaXplIHRoZSBQQ05FVDMyIFJ4IGFuZCBUeCByaW5ncy4gKi8KK3N0YXRpYyBpbnQgcGNuZXQzMl9pbml0X3Jpbmcoc3RydWN0IG5pYyAqbmljKQoreworCWludCBpOworCisJbHAtPnR4X2Z1bGwgPSAwOworCWxwLT5jdXJfcnggPSBscC0+Y3VyX3R4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlwY25ldDMyX2J1ZnMucnhfcmluZ1tpXS5iYXNlID0KKwkJCXZpcnRfdG9fbGUzMmRlc2MoJnBjbmV0MzJfYnVmcy5yeGJbaV0pOworCQlwY25ldDMyX2J1ZnMucnhfcmluZ1tpXS5idWZfbGVuZ3RoID0gbGUxNl90b19jcHUoLVBLVF9CVUZfU1opOworCQlwY25ldDMyX2J1ZnMucnhfcmluZ1tpXS5zdGF0dXMgPSBsZTE2X3RvX2NwdSgweDgwMDApOworCX0KKworCS8qIFRoZSBUeCBidWZmZXIgYWRkcmVzcyBpcyBmaWxsZWQgaW4gYXMgbmVlZGVkLCBidXQgd2UgZG8gbmVlZCB0byBjbGVhcgorCSAgIHRoZSB1cHBlciBvd25lcnNoaXAgYml0LiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlwY25ldDMyX2J1ZnMudHhfcmluZ1tpXS5iYXNlID0gMDsKKwkJcGNuZXQzMl9idWZzLnR4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwl9CisKKworCWxwLT5pbml0X2Jsb2NrLnRsZW5fcmxlbiA9CisJICAgIGxlMTZfdG9fY3B1KFRYX1JJTkdfTEVOX0JJVFMgfCBSWF9SSU5HX0xFTl9CSVRTKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBuaWMtPm5vZGVfYWRkcltpXTsKKwlscC0+aW5pdF9ibG9jay5yeF9yaW5nID0gdmlydF90b19sZTMyZGVzYygmcGNuZXQzMl9idWZzLnJ4X3JpbmdbMF0pOworCWxwLT5pbml0X2Jsb2NrLnR4X3JpbmcgPSB2aXJ0X3RvX2xlMzJkZXNjKCZwY25ldDMyX2J1ZnMudHhfcmluZ1swXSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwY25ldDMyX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KKwl1MTYgdmFsOworCWludCBpOworCisJLyogUmVzZXQgdGhlIFBDTkVUMzIgKi8KKwlscC0+YS5yZXNldChpb2FkZHIpOworCisJLyogc3dpdGNoIHBjbmV0MzIgdG8gMzJiaXQgbW9kZSAqLworCWxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDIwLCAyKTsKKworCS8qIHNldC9yZXNldCBhdXRvc2VsZWN0IGJpdCAqLworCXZhbCA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMikgJiB+MjsKKwlpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkKKwkJdmFsIHw9IDI7CisJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMiwgdmFsKTsKKworCS8qIGhhbmRsZSBmdWxsIGR1cGxleCBzZXR0aW5nICovCisJaWYgKGxwLT5mdWxsX2R1cGxleCkgeworCQl2YWwgPSBscC0+YS5yZWFkX2Jjcihpb2FkZHIsIDkpICYgfjM7CisJCWlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9GRCkgeworCQkJdmFsIHw9IDE7CisJCQlpZiAobHAtPm9wdGlvbnMgPT0KKwkJCSAgICAoUENORVQzMl9QT1JUX0ZEIHwgUENORVQzMl9QT1JUX0FVSSkpCisJCQkJdmFsIHw9IDI7CisJCX0gZWxzZSBpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkgeworCQkJLyogd29ya2Fyb3VuZCBvZiB4U2VyaWVzMjUwLCB0dXJuIG9uIGZvciA3OUM5NzUgb25seSAqLworCQkJaSA9ICgobHAtPmEuCisJCQkgICAgICByZWFkX2Nzcihpb2FkZHIsCisJCQkJICAgICAgIDg4KSB8IChscC0+YS5yZWFkX2Nzcihpb2FkZHIsCisJCQkJCQkJICAgICA4OSkgPDwgMTYpKSA+PgorCQkJICAgICAxMikgJiAweGZmZmY7CisJCQlpZiAoaSA9PSAweDI2MjcpCisJCQkJdmFsIHw9IDM7CisJCX0KKwkJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgOSwgdmFsKTsKKwl9CisKKwkvKiBzZXQvcmVzZXQgR1BTSSBiaXQgaW4gdGVzdCByZWdpc3RlciAqLworCXZhbCA9IGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMTI0KSAmIH4weDEwOworCWlmICgobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfUE9SVFNFTCkgPT0gUENORVQzMl9QT1JUX0dQU0kpCisJCXZhbCB8PSAweDEwOworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDEyNCwgdmFsKTsKKworCWlmIChscC0+bWlpICYmICEobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkpIHsKKwkJdmFsID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMikgJiB+MHgzODsJLyogZGlzYWJsZSBBdXRvIE5lZ290aWF0aW9uLCBzZXQgMTBNcGJzLCBIRCAqLworCQlpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfRkQpCisJCQl2YWwgfD0gMHgxMDsKKwkJaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUXzEwMCkKKwkJCXZhbCB8PSAweDA4OworCQlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMiwgdmFsKTsKKwl9IGVsc2UgeworCQlpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkgewkvKiBlbmFibGUgYXV0byBuZWdvdGlhdGUsIHNldHVwLCBkaXNhYmxlIGZkICovCisJCQl2YWwgPSBscC0+YS5yZWFkX2Jjcihpb2FkZHIsIDMyKSAmIH4weDk4OworCQkJdmFsIHw9IDB4MjA7CisJCQlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMiwgdmFsKTsKKwkJfQorCX0KKworI2lmZGVmIERPX0RYU1VGTE8KKwlpZiAobHAtPmR4c3VmbG8pIHsJLyogRGlzYWJsZSB0cmFuc21pdCBzdG9wIG9uIHVuZGVyZmxvdyAqLworCQl2YWwgPSBscC0+YS5yZWFkX2Nzcihpb2FkZHIsIDMpOworCQl2YWwgfD0gMHg0MDsKKwkJbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgMywgdmFsKTsKKwl9CisjZW5kaWYKKwlpZiAoMSkKKwl7CisJCS8vZGlzYWJsZSBpbnRlcnJ1cHRzCisJCXZhbCA9IGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMyk7CisJCXZhbCA9IHZhbAorCQkJfCAoMSA8PCAxNCkgLy9CQUJMTSBpbnRyIGRpc2FibGVkCisJCQl8ICgxIDw8IDEyKSAvL01JU1NNIG1pc3NlZCBmcmFtZSBtYXNrIGludHIgZGlzYWJsZWQKKwkJCXwgKDEgPDwgMTApIC8vUklOVE0gcmVjZWl2ZSBpbnRyIGRpc2FibGVkCisJCQl8ICgxIDw8IDkpIC8vVElOVE0gdHJhbnNtaXQgaW50ciBkaXNhYmxlZAorCQkJfCAoMSA8PCA4KSAvL0lET05NIGluaXQgZG9uZSBpbnRyIGRpc2FibGVkCisJCQk7CisJCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDMsIHZhbCk7CisJfQorCisJaWYgKGxwLT5sdGludCkgewkvKiBFbmFibGUgVHhEb25lLWludHIgaW5oaWJpdG9yICovCisJCXZhbCA9IGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgNSk7CisJCXZhbCB8PSAoMSA8PCAxNCk7CisJCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDUsIHZhbCk7CisJfQorCWxwLT5pbml0X2Jsb2NrLm1vZGUgPQorCSAgICBsZTE2X3RvX2NwdSgobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfUE9SVFNFTCkgPDwgNyk7CisJbHAtPmluaXRfYmxvY2suZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwlscC0+aW5pdF9ibG9jay5maWx0ZXJbMV0gPSAweGZmZmZmZmZmOworCisJcGNuZXQzMl9pbml0X3JpbmcobmljKTsKKworCisJLyogUmUtaW5pdGlhbGl6ZSB0aGUgUENORVQzMiwgYW5kIHN0YXJ0IGl0IHdoZW4gZG9uZS4gKi8KKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAxLAorCQkJKHZpcnRfdG9fYnVzKCZscC0+aW5pdF9ibG9jaykpICYgMHhmZmZmKTsKKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAyLCAodmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKSkgPj4gMTYpOworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDQsIDB4MDkxNSk7CisJbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgMCwgMHgwMDAxKTsKKworCisJaSA9IDA7CisJd2hpbGUgKGkrKyA8IDEwMCkKKwkJaWYgKGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMCkgJiAweDAxMDApCisJCQlicmVhazsKKwkvKiAKKwkgKiBXZSB1c2VkIHRvIGNsZWFyIHRoZSBJbml0RG9uZSBiaXQsIDB4MDEwMCwgaGVyZSBidXQgTWFyayBTdG9ja3RvbgorCSAqIHJlcG9ydHMgdGhhdCBkb2luZyBzbyB0cmlnZ2VycyBhIGJ1ZyBpbiB0aGUgJzk3NC4KKwkgKi8KKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAwLCAweDAwNDIpOworCisJZHByaW50ZigoInBjbmV0MzIgb3BlbiwgY3NyMCAlaFguXG4iLCBscC0+YS5yZWFkX2Nzcihpb2FkZHIsIDApKSk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwY25ldDMyX3BvbGwoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcmV0cmlldmUpCit7CisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKworCXNpZ25lZCBjaGFyIHN0YXR1czsKKwlpbnQgZW50cnk7CisKKwllbnRyeSA9IGxwLT5jdXJfcnggJiBSWF9SSU5HX01PRF9NQVNLOworCXN0YXR1cyA9IChsZTE2X3RvX2NwdShwY25ldDMyX2J1ZnMucnhfcmluZ1tlbnRyeV0uc3RhdHVzKSA+PiA4KTsKKworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJaWYgKHN0YXR1cyA9PSAweDAzKSB7CisJCW5pYy0+cGFja2V0bGVuID0KKwkJCShsZTMyX3RvX2NwdShwY25ldDMyX2J1ZnMucnhfcmluZ1tlbnRyeV0ubXNnX2xlbmd0aCkKKwkJCSAmIDB4ZmZmKSAtIDQ7CisJCW1lbWNweShuaWMtPnBhY2tldCwgJnBjbmV0MzJfYnVmcy5yeGJbZW50cnldLCBuaWMtPnBhY2tldGxlbik7CisKKwkJLyogQW5kcmV3IEJveWQgb2YgUU5YIHJlcG9ydHMgdGhhdCBzb21lIHJldnMgb2YgdGhlIDc5Qzc2NQorCQkgKiBjbGVhciB0aGUgYnVmZmVyIGxlbmd0aCAqLworCQlwY25ldDMyX2J1ZnMucnhfcmluZ1tlbnRyeV0uYnVmX2xlbmd0aAorCQkJPSBsZTE2X3RvX2NwdSgtUEtUX0JVRl9TWik7CisJCS8qIHByaW1lIGZvciBuZXh0IHJlY2VpdmUgKi8KKwkJcGNuZXQzMl9idWZzLnJ4X3JpbmdbZW50cnldLnN0YXR1cyB8PSBsZTE2X3RvX2NwdSgweDgwMDApOworCQkvKiBTd2l0Y2ggdG8gdGhlIG5leHQgUnggcmluZyBidWZmZXIgKi8KKwkJbHAtPmN1cl9yeCsrOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwY25ldDMyX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHQsCS8qIFR5cGUgKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KKwkJCSAgICAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisJdW5zaWduZWQgbG9uZyB0aW1lOworCXU4ICpwdHhiOworCXUxNiBuc3R5cGU7CisJdTE2IHN0YXR1czsKKwlpbnQgZW50cnkgPSAwOwkJLypscC0+Y3VyX3R4ICYgVFhfUklOR19NT0RfTUFTSzsgKi8KKworCXN0YXR1cyA9IDB4ODMwMDsKKwkvKiBwb2ludCB0byB0aGUgY3VycmVudCB0eGIgaW5jYXNlIG11bHRpcGxlIHR4X3JpbmdzIGFyZSB1c2VkICovCisJcHR4YiA9IHBjbmV0MzJfYnVmcy50eGJbbHAtPmN1cl90eF07CisKKwkvKiBjb3B5IHRoZSBwYWNrZXQgdG8gcmluZyBidWZmZXIgKi8KKwltZW1jcHkocHR4YiwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKwltZW1jcHkocHR4YiArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwkvKiBzcmMgKi8KKwluc3R5cGUgPSBodG9ucygodTE2KSB0KTsJLyogdHlwZSAqLworCW1lbWNweShwdHhiICsgMiAqIEVUSF9BTEVOLCAodTggKikgJiBuc3R5cGUsIDIpOwkvKiB0eXBlICovCisJbWVtY3B5KHB0eGIgKyBFVEhfSExFTiwgcCwgcyk7CisKKwlzICs9IEVUSF9ITEVOOworCXdoaWxlIChzIDwgRVRIX1pMRU4pCS8qIHBhZCB0byBtaW4gbGVuZ3RoICovCisJCXB0eGJbcysrXSA9ICdcMCc7CisKKwlwY25ldDMyX2J1ZnMudHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gbGUxNl90b19jcHUoLXMpOworCXBjbmV0MzJfYnVmcy50eF9yaW5nW2VudHJ5XS5taXNjID0gMHgwMDAwMDAwMDsKKwlwY25ldDMyX2J1ZnMudHhfcmluZ1tlbnRyeV0uYmFzZSA9ICh1MzIpIHZpcnRfdG9fbGUzMmRlc2MocHR4Yik7CisKKwkvKiB3ZSBzZXQgdGhlIHRvcCBieXRlIGFzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgKi8KKwlwY25ldDMyX2J1ZnMudHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gbGUxNl90b19jcHUoc3RhdHVzKTsKKworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBwb2xsICovCisJbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgMCwgMHgwMDQ4KTsKKworCS8qIHdhaXQgZm9yIHRyYW5zbWl0IGNvbXBsZXRlICovCisJbHAtPmN1cl90eCA9IDA7CQkvKiAobHAtPmN1cl90eCArIDEpOyAqLworCXRpbWUgPSBjdXJydGlja3MoKSArIFRJQ0tTX1BFUl9TRUM7CS8qIHdhaXQgb25lIHNlY29uZCAqLworCXdoaWxlIChjdXJydGlja3MoKSA8IHRpbWUgJiYKKwkgICAgICAgKChzaG9ydCkgbGUxNl90b19jcHUocGNuZXQzMl9idWZzLnR4X3JpbmdbZW50cnldLnN0YXR1cykgPCAwKSk7CisKKwlpZiAoKHNob3J0KSBsZTE2X3RvX2NwdShwY25ldDMyX2J1ZnMudHhfcmluZ1tlbnRyeV0uc3RhdHVzKSA8IDApCisJCXByaW50ZigiUENORVQzMiB0aW1lZCBvdXQgb24gdHJhbnNtaXRcbiIpOworCisJLyogU3RvcCBwb2ludGluZyBhdCB0aGUgY3VycmVudCB0eGIKKwkgKiBvdGhlcndpc2UgdGhlIGNhcmQgY29udGludWVzIHRvIHNlbmQgdGhlIHBhY2tldCAqLworCXBjbmV0MzJfYnVmcy50eF9yaW5nW2VudHJ5XS5iYXNlID0gMDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBjbmV0MzJfZGlzYWJsZSAoIHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCApIHsKKwkvKiBTdG9wIHRoZSBQQ05FVDMyIGhlcmUgLS0gaXQgb2Nhc3Npb25hbGx5IHBvbGxzIG1lbW9yeSBpZiB3ZSBkb24ndCAqLworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDAsIDB4MDAwNCk7CisKKwkvKgorCSAqIFN3aXRjaCBiYWNrIHRvIDE2LWJpdCBtb2RlIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggZHVtYiAKKwkgKiBET1MgcGFja2V0IGRyaXZlciBhZnRlciBhIHdhcm0gcmVib290CisJICovCisJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMjAsIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGNuZXQzMl9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorWW91IHNob3VsZCBvbWl0IHRoZSBsYXN0IGFyZ3VtZW50IHN0cnVjdCBwY2lfZGV2aWNlICogZm9yIGEgbm9uLVBDSSBOSUMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcGNuZXQzMl9wcm9iZSAoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKworCWludCBpLCBtZWRpYTsKKwlpbnQgZmR4LCBtaWksIGZzZXQsIGR4c3VmbG8sIGx0aW50OworCWludCBjaGlwX3ZlcnNpb247CisJc3RydWN0IHBjbmV0MzJfYWNjZXNzICphID0gTlVMTDsKKwljaGFyICpjaGlwbmFtZTsKKwl1OCBwcm9tYWRkcls2XTsKKwlpbnQgc2hhcmVkID0gMTsKKworCWlmIChwY2ktPmlvYWRkciA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIEJBU0UgaXMgdXNlZCB0aHJvdWdob3V0IHRvIGFkZHJlc3MgdGhlIGNhcmQgKi8KKwlpb2FkZHIgPSBwY2ktPmlvYWRkcjsKKwlwcmludGYoInBjbmV0MzIuYzogRm91bmQgJXMsIFZlbmRvcj0weCVoWCBEZXZpY2U9MHglaFhcbiIsCisJICAgICAgIHBjaS0+ZHJpdmVyX25hbWUsIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSk7CisKKwluaWMtPmlycW5vICA9IDA7CisJbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkciAmIH4zOworCisJLyogcmVzZXQgdGhlIGNoaXAgKi8KKwlwY25ldDMyX3dpb19yZXNldChpb2FkZHIpOworCisJLyogTk9URTogMTYtYml0IGNoZWNrIGlzIGZpcnN0LCBvdGhlcndpc2Ugc29tZSBvbGRlciBQQ25ldCBjaGlwcyBmYWlsICovCisJaWYgKHBjbmV0MzJfd2lvX3JlYWRfY3NyKGlvYWRkciwgMCkgPT0gNAorCSAgICAmJiBwY25ldDMyX3dpb19jaGVjayhpb2FkZHIpKSB7CisJCWEgPSAmcGNuZXQzMl93aW87CisJfSBlbHNlIHsKKwkJcGNuZXQzMl9kd2lvX3Jlc2V0KGlvYWRkcik7CisJCWlmIChwY25ldDMyX2R3aW9fcmVhZF9jc3IoaW9hZGRyLCAwKSA9PSA0CisJCSAgICAmJiBwY25ldDMyX2R3aW9fY2hlY2soaW9hZGRyKSkgeworCQkJYSA9ICZwY25ldDMyX2R3aW87CisJCX0gZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJY2hpcF92ZXJzaW9uID0KKwkgICAgYS0+cmVhZF9jc3IoaW9hZGRyLCA4OCkgfCAoYS0+cmVhZF9jc3IoaW9hZGRyLCA4OSkgPDwgMTYpOworCisJZHByaW50ZigoIlBDbmV0IGNoaXAgdmVyc2lvbiBpcyAweCVYXG4iLCBjaGlwX3ZlcnNpb24pKTsKKwlpZiAoKGNoaXBfdmVyc2lvbiAmIDB4ZmZmKSAhPSAweDAwMykKKwkJcmV0dXJuIDA7CisKKwkvKiBpbml0aWFsaXplIHZhcmlhYmxlcyAqLworCWZkeCA9IG1paSA9IGZzZXQgPSBkeHN1ZmxvID0gbHRpbnQgPSAwOworCWNoaXBfdmVyc2lvbiA9IChjaGlwX3ZlcnNpb24gPj4gMTIpICYgMHhmZmZmOworCisJc3dpdGNoIChjaGlwX3ZlcnNpb24pIHsKKwljYXNlIDB4MjQyMDoKKwkJY2hpcG5hbWUgPSAiUENuZXQvUENJIDc5Qzk3MCI7CS8qIFBDSSAqLworCQlicmVhazsKKwljYXNlIDB4MjQzMDoKKwkJaWYgKHNoYXJlZCkKKwkJCWNoaXBuYW1lID0gIlBDbmV0L1BDSSA3OUM5NzAiOwkvKiA5NzAgZ2l2ZXMgdGhlIHdyb25nIGNoaXAgaWQgYmFjayAqLworCQllbHNlCisJCQljaGlwbmFtZSA9ICJQQ25ldC8zMiA3OUM5NjUiOwkvKiA0ODYvVkwgYnVzICovCisJCWJyZWFrOworCWNhc2UgMHgyNjIxOgorCQljaGlwbmFtZSA9ICJQQ25ldC9QQ0kgSUkgNzlDOTcwQSI7CS8qIFBDSSAqLworCQlmZHggPSAxOworCQlicmVhazsKKwljYXNlIDB4MjYyMzoKKwkJY2hpcG5hbWUgPSAiUENuZXQvRkFTVCA3OUM5NzEiOwkvKiBQQ0kgKi8KKwkJZmR4ID0gMTsKKwkJbWlpID0gMTsKKwkJZnNldCA9IDE7CisJCWx0aW50ID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDI2MjQ6CisJCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QrIDc5Qzk3MiI7CS8qIFBDSSAqLworCQlmZHggPSAxOworCQltaWkgPSAxOworCQlmc2V0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDI2MjU6CisJCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QgSUlJIDc5Qzk3MyI7CS8qIFBDSSAqLworCQlmZHggPSAxOworCQltaWkgPSAxOworCQlicmVhazsKKwljYXNlIDB4MjYyNjoKKwkJY2hpcG5hbWUgPSAiUENuZXQvSG9tZSA3OUM5NzgiOwkvKiBQQ0kgKi8KKwkJZmR4ID0gMTsKKwkJLyogCisJCSAqIFRoaXMgaXMgYmFzZWQgb24gc3BlY3MgcHVibGlzaGVkIGF0IHd3dy5hbWQuY29tLiAgVGhpcyBzZWN0aW9uCisJCSAqIGFzc3VtZXMgdGhhdCBhIGNhcmQgd2l0aCBhIDc5Qzk3OCB3YW50cyB0byBnbyBpbnRvIDFNYiBIb21lUE5BCisJCSAqIG1vZGUuICBUaGUgNzlDOTc4IGNhbiBhbHNvIGdvIGludG8gc3RhbmRhcmQgZXRoZXJuZXQsIGFuZCB0aGVyZQorCQkgKiBwcm9iYWJseSBzaG91bGQgYmUgc29tZSBzb3J0IG9mIG1vZHVsZSBvcHRpb24gdG8gc2VsZWN0IHRoZQorCQkgKiBtb2RlIGJ5IHdoaWNoIHRoZSBjYXJkIHNob3VsZCBvcGVyYXRlCisJCSAqLworCQkvKiBzd2l0Y2ggdG8gaG9tZSB3aXJpbmcgbW9kZSAqLworCQltZWRpYSA9IGEtPnJlYWRfYmNyKGlvYWRkciwgNDkpOworCisJCXByaW50ZigibWVkaWEgcmVzZXQgdG8gJSN4LlxuIiwgbWVkaWEpOworCQlhLT53cml0ZV9iY3IoaW9hZGRyLCA0OSwgbWVkaWEpOworCQlicmVhazsKKwljYXNlIDB4MjYyNzoKKwkJY2hpcG5hbWUgPSAiUENuZXQvRkFTVCBJSUkgNzlDOTc1IjsJLyogUENJICovCisJCWZkeCA9IDE7CisJCW1paSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNoaXBuYW1lID0gIlVOS05PV04iOworCQlwcmludGYoIlBDbmV0IHZlcnNpb24gJSN4LCBubyBQQ25ldDMyIGNoaXAuXG4iLAorCQkgICAgICAgY2hpcF92ZXJzaW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgT24gc2VsZWN0ZWQgY2hpcHMgdHVybiBvbiB0aGUgQkNSMTg6Tk9VRkxPIGJpdC4gVGhpcyBzdG9wcyB0cmFuc21pdAorCSAqICBzdGFydGluZyB1bnRpbCB0aGUgcGFja2V0IGlzIGxvYWRlZC4gU3RyaWtlIG9uZSBmb3IgcmVsaWFiaWxpdHksIGxvc2UKKwkgKiAgb25lIGZvciBsYXRlbmN5IC0gYWx0aG91Z2ggb24gUENJIHRoaXMgaXNudCBhIGJpZyBsb3NzLiBPbGRlciBjaGlwcyAKKwkgKiAgaGF2ZSBGSUZPJ3Mgc21hbGxlciB0aGFuIGEgcGFja2V0LCBzbyB5b3UgY2FuJ3QgZG8gdGhpcy4KKwkgKi8KKworCWlmIChmc2V0KSB7CisJCWEtPndyaXRlX2Jjcihpb2FkZHIsIDE4LAorCQkJICAgICAoYS0+cmVhZF9iY3IoaW9hZGRyLCAxOCkgfCAweDA4MDApKTsKKwkJYS0+d3JpdGVfY3NyKGlvYWRkciwgODAsCisJCQkgICAgIChhLT5yZWFkX2Nzcihpb2FkZHIsIDgwKSAmIDB4MEMwMCkgfCAweDBjMDApOworCQlkeHN1ZmxvID0gMTsKKwkJbHRpbnQgPSAxOworCX0KKworCURCRyAoICIlcyBhdCAlaFgsIiwgY2hpcG5hbWUsICh1bnNpZ25lZCBpbnQpIGlvYWRkciApOworCisJLyogcmVhZCBQUk9NIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcm9tYWRkcltpXSA9IGluYihpb2FkZHIgKyBpKTsKKworCS8qIFVwZGF0ZSB0aGUgbmljIHN0cnVjdHVyZSB3aXRoIHRoZSBNQUMgQWRkcmVzcyAqLworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCW5pYy0+bm9kZV9hZGRyW2ldID0gcHJvbWFkZHJbaV07CisJfQorCisJLyogUHJpbnQgb3V0IHNvbWUgaGFyZHdhcmUgaW5mbyAqLworCURCRyAoICIlczogSU8gQWRkciAweCVoWCwgTUFDIEFkZHIgJXNcbiAiLCBjaGlwbmFtZSwgKHVuc2lnbmVkIGludCkgaW9hZGRyLAorCSAgICAgIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIgKSApOworCisJLyogU2V0IHRvIHBjaSBidXMgbWFzdGVyICovCisJYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworCS8qIHBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLworCWxwID0gJmxweDsKKworI2lmIEVCREVCVUcKKwlpZiAoKChjaGlwX3ZlcnNpb24gKyAxKSAmIDB4ZmZmZSkgPT0gMHgyNjI0KSB7CS8qIFZlcnNpb24gMHgyNjIzIG9yIDB4MjYyNCAqLworCQlpID0gYS0+cmVhZF9jc3IoaW9hZGRyLCA4MCkgJiAweDBDMDA7CS8qIENoZWNrIHR4X3N0YXJ0X3B0ICovCisJCWRwcmludGYoKCIgICAgdHhfc3RhcnRfcHQoMHglaFgpOiIsIGkpKTsKKwkJc3dpdGNoIChpID4+IDEwKSB7CisJCWNhc2UgMDoKKwkJCWRwcmludGYoKCIgIDIwIGJ5dGVzLCIpKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkcHJpbnRmKCgiICA2NCBieXRlcywiKSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZHByaW50ZigoIiAxMjggYnl0ZXMsIikpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWRwcmludGYoKCJ+MjIwIGJ5dGVzLCIpKTsKKwkJCWJyZWFrOworCQl9CisJCWkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDE4KTsJLyogQ2hlY2sgQnVyc3QvQnVzIGNvbnRyb2wgKi8KKwkJZHByaW50ZigoIiBCQ1IxOCglaFgpOiIsIGkgJiAweGZmZmYpKTsKKwkJaWYgKGkgJiAoMSA8PCA1KSkKKwkJCWRwcmludGYoKCJCdXJzdFdyRW4gIikpOworCQlpZiAoaSAmICgxIDw8IDYpKQorCQkJZHByaW50ZigoIkJ1cnN0UmRFbiAiKSk7CisJCWlmIChpICYgKDEgPDwgNykpCisJCQlkcHJpbnRmKCgiRFdvcmRJTyAiKSk7CisJCWlmIChpICYgKDEgPDwgMTEpKQorCQkJZHByaW50ZigoIk5vVUZsb3cgIikpOworCQlpID0gYS0+cmVhZF9iY3IoaW9hZGRyLCAyNSk7CisJCWRwcmludGYoKCIgICAgU1JBTVNJWkU9MHglaFgsIiwgaSA8PCA4KSk7CisJCWkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDI2KTsKKwkJZHByaW50ZigoIiBTUkFNX0JORD0weCVoWCwiLCBpIDw8IDgpKTsKKwkJaSA9IGEtPnJlYWRfYmNyKGlvYWRkciwgMjcpOworCQlpZiAoaSAmICgxIDw8IDE0KSkKKwkJCWRwcmludGYoKCJMb3dMYXRSeCIpKTsKKwl9CisjZW5kaWYKKwlscC0+bmFtZSA9IGNoaXBuYW1lOworCWxwLT5zaGFyZWRfaXJxID0gc2hhcmVkOworCWxwLT5mdWxsX2R1cGxleCA9IGZkeDsKKwlscC0+ZHhzdWZsbyA9IGR4c3VmbG87CisJbHAtPmx0aW50ID0gbHRpbnQ7CisJbHAtPm1paSA9IG1paTsKKwkvKiBGSVhNRTogRml4IE9wdGlvbnMgZm9yIG9ubHkgb25lIGNhcmQgKi8KKwlpZiAoKGNhcmRzX2ZvdW5kID49IE1BWF9VTklUUykKKwkgICAgfHwgKCh1bnNpZ25lZCBpbnQpIG9wdGlvbnNbY2FyZHNfZm91bmRdID4gc2l6ZW9mKG9wdGlvbnNfbWFwcGluZykpKQorCQlscC0+b3B0aW9ucyA9IFBDTkVUMzJfUE9SVF9BU0VMOworCWVsc2UKKwkJbHAtPm9wdGlvbnMgPSBvcHRpb25zX21hcHBpbmdbb3B0aW9uc1tjYXJkc19mb3VuZF1dOworCisJaWYgKGZkeCAmJiAhKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpICYmCisJICAgICgoY2FyZHNfZm91bmQgPj0gTUFYX1VOSVRTKSB8fCBmdWxsX2R1cGxleFtjYXJkc19mb3VuZF0pKQorCQlscC0+b3B0aW9ucyB8PSBQQ05FVDMyX1BPUlRfRkQ7CisKKwlpZiAoIWEpIHsKKwkJcHJpbnRmKCJObyBhY2Nlc3MgbWV0aG9kc1xuIik7CisJCXJldHVybiAwOworCX0KKworCS8vICBscC0+YSA9ICphOworCS8vICBDYXVzZXMgYSBsb2FkZXI6CisJLy8gICAgIGJpbi9ibGliLmEocGNuZXQzMi5vKSgudGV4dCsweDZiNik6IEluIGZ1bmN0aW9uIGBwY25ldDMyX3Byb2JlJzoKKwkvLyAgICAgZHJpdmVycy9uZXQvcGNuZXQzMi5jOjg3MTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgbWVtY3B5JworCS8vICAgICBtYWtlOiAqKiogW2Jpbi9wY25ldDMyLmRzay50bXBdIEVycm9yIDEKKwkvLyAgU28gd2UgZG86CisJbWVtY3B5ICggJmxwLT5hLCBhLCBzaXplb2YgKCBscC0+YSApICk7CisJLy8gICBUbyBleHBsaWNpdHkgY2FsbCBtZW1jcHkuCisKKwkvKiBkZXRlY3Qgc3BlY2lhbCBUMS9FMSBXQU4gY2FyZCBieSBjaGVja2luZyBmb3IgTUFDIGFkZHJlc3MgKi8KKwlpZiAobmljLT5ub2RlX2FkZHJbMF0gPT0gMHgwMCAmJiBuaWMtPm5vZGVfYWRkclsxXSA9PSAweGUwCisJICAgICYmIG5pYy0+bm9kZV9hZGRyWzJdID09IDB4NzUpCisJCWxwLT5vcHRpb25zID0gUENORVQzMl9QT1JUX0ZEIHwgUENORVQzMl9QT1JUX0dQU0k7CisKKwlscC0+aW5pdF9ibG9jay5tb2RlID0gbGUxNl90b19jcHUoMHgwMDAzKTsJLyogRGlzYWJsZSBSeCBhbmQgVHguICovCisJbHAtPmluaXRfYmxvY2sudGxlbl9ybGVuID0KKwkgICAgbGUxNl90b19jcHUoVFhfUklOR19MRU5fQklUUyB8IFJYX1JJTkdfTEVOX0JJVFMpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWxwLT5pbml0X2Jsb2NrLnBoeXNfYWRkcltpXSA9IG5pYy0+bm9kZV9hZGRyW2ldOworCWxwLT5pbml0X2Jsb2NrLmZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJbHAtPmluaXRfYmxvY2suZmlsdGVyWzFdID0gMHhmZmZmZmZmZjsKKwlscC0+aW5pdF9ibG9jay5yeF9yaW5nID0gdmlydF90b19idXMoJnBjbmV0MzJfYnVmcy5yeF9yaW5nKTsKKwlscC0+aW5pdF9ibG9jay50eF9yaW5nID0gdmlydF90b19idXMoJnBjbmV0MzJfYnVmcy50eF9yaW5nKTsKKworCS8qIHN3aXRjaCBwY25ldDMyIHRvIDMyYml0IG1vZGUgKi8KKwlhLT53cml0ZV9iY3IoaW9hZGRyLCAyMCwgMik7CisKKwlhLT53cml0ZV9jc3IoaW9hZGRyLCAxLCAodmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKSkgJiAweGZmZmYpOworCWEtPndyaXRlX2Nzcihpb2FkZHIsIDIsICh2aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spKSA+PiAxNik7CisKKwkvKiAKKwkgKiBUbyBhdXRvLUlSUSB3ZSBlbmFibGUgdGhlIGluaXRpYWxpemF0aW9uLWRvbmUgYW5kIERNQSBlcnJvcgorCSAqIGludGVycnVwdHMuIEZvciBJU0EgYm9hcmRzIHdlIGdldCBhIERNQSBlcnJvciwgYnV0IFZMQiBhbmQgUENJCisJICogYm9hcmRzIHdpbGwgd29yay4KKwkgKi8KKwkvKiBUcmlnZ2VyIGFuIGluaXRpYWxpemF0aW9uIGp1c3QgZm9yIHRoZSBpbnRlcnJ1cHQuICovCisKKwkKKy8vCWEtPndyaXRlX2Nzcihpb2FkZHIsIDAsIDB4NDEpOyAKKy8vCW1kZWxheSgxKTsKKworCWNhcmRzX2ZvdW5kKys7CisKKwkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwlwY25ldDMyX3Jlc2V0KG5pYyk7CisJaWYgKG1paSkgeworCQlpbnQgdG1wOworCQlpbnQgcGh5LCBwaHlfaWR4ID0gMDsKKwkJdTE2IG1paV9scGE7CisJCWxwLT5waHlzWzBdID0gMTsJLyogRGVmYXVsdCBTZXR0aW5nICovCisJCWZvciAocGh5ID0gMTsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IE1JSV9DTlQ7IHBoeSsrKSB7CisJCQlpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChuaWMsIHBoeSwgTUlJX0JNU1IpOworCQkJaWYgKG1paV9zdGF0dXMgIT0gMHhmZmZmICYmIG1paV9zdGF0dXMgIT0gMHgwMDAwKSB7CisJCQkJbHAtPnBoeXNbcGh5X2lkeCsrXSA9IHBoeTsKKwkJCQlscC0+bWlpX2lmLmFkdmVydGlzaW5nID0KKwkJCQkgICAgbWRpb19yZWFkKG5pYywgcGh5LCBNSUlfQURWRVJUSVNFKTsKKwkJCQlpZiAoKG1paV9zdGF0dXMgJiAweDAwNDApID09IDApIHsKKwkJCQkgIHRtcCA9IHBoeTsKKwkJCQkgIGRwcmludGYgKCgiTUlJIFBIWSBmb3VuZCBhdCBhZGRyZXNzICVkLCBzdGF0dXMgIiAKKwkJCQkJICAgICIlaFggYWR2ZXJ0aXNpbmcgJWhYXG4iLCBwaHksIG1paV9zdGF0dXMsIAorCQkJCQkgICAgbHAtPm1paV9pZi5hZHZlcnRpc2luZykpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAocGh5X2lkeCA9PSAwKQorCQkJcHJpbnRmKCJObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQhXG4iKTsKKwkJbHAtPm1paV9pZi5waHlfaWQgPSBscC0+cGh5c1swXTsKKworCQlscC0+bWlpX2lmLmFkdmVydGlzaW5nID0KKwkJICAgIG1kaW9fcmVhZChuaWMsIGxwLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFKTsKKworCQltaWlfbHBhID0gbWRpb19yZWFkKG5pYywgbHAtPnBoeXNbMF0sIE1JSV9MUEEpOworCQlscC0+bWlpX2lmLmFkdmVydGlzaW5nICY9IG1paV9scGE7CisJCWlmIChscC0+bWlpX2lmLmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwMEZVTEwpCisJCQlwcmludGYoIjEwME1icHMgRnVsbC1EdXBsZXhcbiIpOworCQllbHNlIGlmIChscC0+bWlpX2lmLmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwMEhBTEYpCisJCQlwcmludGYoIjEwME1icHMgSGFsZi1EdXBsZXhcbiIpOworCQllbHNlIGlmIChscC0+bWlpX2lmLmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwRlVMTCkKKwkJCXByaW50ZigiMTBNYnBzIEZ1bGwtRHVwbGV4XG4iKTsKKwkJZWxzZSBpZiAobHAtPm1paV9pZi5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMEhBTEYpCisJCQlwcmludGYoIjEwTWJwcyBIYWxmLUR1cGxleFxuIik7CisJCWVsc2UKKwkJCXByaW50ZigiXG4iKTsKKwl9IGVsc2UgeworCQkvKiBUaGUgb2xkZXIgY2hpcHMgYXJlIGZpeGVkIDEwTWJwcywgYW5kIHNvbWUgc3VwcG9ydCBmdWxsIGR1cGxleCwKKwkJICogYWx0aG91Z2ggbm90IHZpYSBhdXRvbmVnb3RpYXRpb24sIGJ1dCBvbmx5IHZpYSBjb25maWd1cmF0aW9uLiAgKi8KKwkJaWYgKGZkeCkKKwkJCXByaW50ZigiMTBNYnBzIEZ1bGwtRHVwbGV4XG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIxME1icHMgSGFsZi1EdXBsZXhcbiIpOworCX0KKworCW5pYy0+bmljX29wCT0gJnBjbmV0MzJfb3BlcmF0aW9uczsKKworCXJldHVybiAxOworfQorc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSkKK3sKKwl1MTYgdmFsX291dDsKKwlpbnQgcGh5YWRkcjsKKworCWlmICghbHAtPm1paSkKKwkJcmV0dXJuIDA7CisKKwlwaHlhZGRyID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMyk7CisKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywKKwkJCSgocGh5X2lkICYgMHgxZikgPDwgNSkgfCAocmVnX251bSAmIDB4MWYpKTsKKwl2YWxfb3V0ID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzNCk7CisJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzMsIHBoeWFkZHIpOworCisJcmV0dXJuIHZhbF9vdXQ7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0sCisJCSAgICAgICBpbnQgdmFsKQoreworCWludCBwaHlhZGRyOworCisJaWYgKCFscC0+bWlpKQorCQlyZXR1cm47CisKKwlwaHlhZGRyID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMyk7CisKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywKKwkJCSgocGh5X2lkICYgMHgxZikgPDwgNSkgfCAocmVnX251bSAmIDB4MWYpKTsKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzNCwgdmFsKTsKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywgcGh5YWRkcik7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyBwY25ldDMyX29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QJPSBkdW1teV9jb25uZWN0LAorCS5wb2xsCQk9IHBjbmV0MzJfcG9sbCwKKwkudHJhbnNtaXQJPSBwY25ldDMyX3RyYW5zbWl0LAorCS5pcnEJCT0gcGNuZXQzMl9pcnEsCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY25ldDMyX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTAyMiwgMHgyMDAwLCAicGNuZXQzMiIsICJBTUQgUENuZXQvUENJIiwgMCksCisJUENJX1JPTSgweDEwMjIsIDB4MjYyNSwgInBjbmV0ZmFzdGlpaSIsICJBTUQgUENOZXQgRkFTVCBJSUkiLCAwKSwKKwlQQ0lfUk9NKDB4MTAyMiwgMHgyMDAxLCAiYW1kaG9tZXBuYSIsICJBTUQgUENuZXQvSG9tZVBOQSIsIDApLAorfTsKKworUENJX0RSSVZFUiAoIHBjbmV0MzJfZHJpdmVyLCBwY25ldDMyX25pY3MsIFBDSV9OT19DTEFTUyApOworCitEUklWRVIgKCAiUENORVQzMi9QQ0kiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCBwY25ldDMyX2RyaXZlciwKKwkgcGNuZXQzMl9wcm9iZSwgcGNuZXQzMl9kaXNhYmxlICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9waGFudG9tL254X2JpdG9wcy5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcGhhbnRvbS9ueF9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDY4NjMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcGhhbnRvbS9ueF9iaXRvcHMuaApAQCAtMCwwICsxLDE5NCBAQAorI2lmbmRlZiBfTlhfQklUT1BTX0gKKyNkZWZpbmUgX05YX0JJVE9QU19ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBOZXRYZW4gYml0IG9wZXJhdGlvbnMKKyAqCisgKi8KKworLyoqIERhdGF0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGEgYml0IGluIHRoZSBwc2V1ZG8tc3RydWN0dXJlcyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHBzZXVkb19iaXRfdDsKKworLyoqCisgKiBXcmFwcGVyIHN0cnVjdHVyZSBmb3IgcHNldWRvX2JpdF90IHN0cnVjdHVyZXMKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIHBzZXVkb19iaXRfdCBzdHJ1Y3R1cmVzLgorICogSXQgaGFzIHRoZSBjb3JyZWN0IHNpemUsIGFuZCBhbHNvIGVuY2Fwc3VsYXRlcyB0eXBlIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUgdW5kZXJseWluZyBwc2V1ZG9fYml0X3QtYmFzZWQgc3RydWN0dXJlLCB3aGljaCBhbGxvd3MgdGhlCisgKiBOWF9GSUxMIGV0Yy4gbWFjcm9zIHRvIHdvcmsgd2l0aG91dCByZXF1aXJpbmcgZXhwbGljaXQgdHlwZQorICogaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgTlhfUFNFVURPX0JJVF9TVFJVQ1QoIF9zdHJ1Y3R1cmUgKQkJCQkgICAgIFwKKwl1bmlvbiB7CQkJCQkJCQkgICAgIFwKKwkJdWludDhfdCBieXRlc1sgc2l6ZW9mICggX3N0cnVjdHVyZSApIC8gOCBdOwkJICAgICBcCisJCXVpbnQ2NF90IHF3b3Jkc1sgc2l6ZW9mICggX3N0cnVjdHVyZSApIC8gNjQgXTsJCSAgICAgXAorCQlfc3RydWN0dXJlICpkdW1teVswXTsJCQkJCSAgICAgXAorCX0gdTsKKworLyoqIEdldCBwc2V1ZG9fYml0X3Qgc3RydWN0dXJlIHR5cGUgZnJvbSB3cmFwcGVyIHN0cnVjdHVyZSBwb2ludGVyICovCisjZGVmaW5lIE5YX1BTRVVET19TVFJVQ1QoIF9wdHIgKQkJCQkJICAgICBcCisJdHlwZW9mICggKigoX3B0ciktPnUuZHVtbXlbMF0pICkKKworLyoqIEJpdCBvZmZzZXQgb2YgYSBmaWVsZCB3aXRoaW4gYSBwc2V1ZG9fYml0X3Qgc3RydWN0dXJlICovCisjZGVmaW5lIE5YX0JJVF9PRkZTRVQoIF9wdHIsIF9maWVsZCApCQkJCQkgICAgIFwKKwlvZmZzZXRvZiAoIE5YX1BTRVVET19TVFJVQ1QgKCBfcHRyICksIF9maWVsZCApCisKKy8qKiBCaXQgd2lkdGggb2YgYSBmaWVsZCB3aXRoaW4gYSBwc2V1ZG9fYml0X3Qgc3RydWN0dXJlICovCisjZGVmaW5lIE5YX0JJVF9XSURUSCggX3B0ciwgX2ZpZWxkICkJCQkJCSAgICAgXAorCXNpemVvZiAoICggKCBOWF9QU0VVRE9fU1RSVUNUICggX3B0ciApICogKSBOVUxMICktPl9maWVsZCApCisKKy8qKiBRd29yZCBvZmZzZXQgb2YgYSBmaWVsZCB3aXRoaW4gYSBwc2V1ZG9fYml0X3Qgc3RydWN0dXJlICovCisjZGVmaW5lIE5YX1FXT1JEX09GRlNFVCggX3B0ciwgX2ZpZWxkICkJCQkJCSAgICAgXAorCSggTlhfQklUX09GRlNFVCAoIF9wdHIsIF9maWVsZCApIC8gNjQgKQorCisvKiogUXdvcmQgYml0IG9mZnNldCBvZiBhIGZpZWxkIHdpdGhpbiBhIHBzZXVkb19iaXRfdCBzdHJ1Y3R1cmUKKyAqCisgKiBZZXMsIHVzaW5nIG1vZC02NCB3b3VsZCB3b3JrLCBidXQgd291bGQgbG9zZSB0aGUgY2hlY2sgZm9yIHRoZQorICogZXJyb3Igb2Ygc3BlY2lmeWluZyBhIG1pc21hdGNoZWQgZmllbGQgbmFtZSBhbmQgcXdvcmQgaW5kZXguCisgKi8KKyNkZWZpbmUgTlhfUVdPUkRfQklUX09GRlNFVCggX3B0ciwgX2luZGV4LCBfZmllbGQgKQkJCSAgICAgXAorCSggTlhfQklUX09GRlNFVCAoIF9wdHIsIF9maWVsZCApIC0gKCA2NCAqIChfaW5kZXgpICkgKQorCisvKiogQml0IG1hc2sgZm9yIGEgZmllbGQgd2l0aGluIGEgcHNldWRvX2JpdF90IHN0cnVjdHVyZSAqLworI2RlZmluZSBOWF9CSVRfTUFTSyggX3B0ciwgX2ZpZWxkICkJCQkJCSAgICAgXAorCSggKCB+KCAoIHVpbnQ2NF90ICkgMCApICkgPj4JCQkJCSAgICAgXAorCSAgKCA2NCAtIE5YX0JJVF9XSURUSCAoIF9wdHIsIF9maWVsZCApICkgKQorCisvKgorICogQXNzZW1ibGUgbmF0aXZlLWVuZGlhbiBxd29yZCBmcm9tIG5hbWVkIGZpZWxkcyBhbmQgdmFsdWVzCisgKgorICovCisKKyNkZWZpbmUgTlhfQVNTRU1CTEVfMSggX3B0ciwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSApCQkJICAgICBcCisJKCAoICggdWludDY0X3QpIChfdmFsdWUpICkgPDwJCQkJCSAgICAgXAorCSAgTlhfUVdPUkRfQklUX09GRlNFVCAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkICkgKQorCisjZGVmaW5lIE5YX0FTU0VNQkxFXzIoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCQkgICAgIFwKKwkoIE5YX0FTU0VNQkxFXzEgKCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgX3ZhbHVlICkgfAkJICAgICBcCisJICBOWF9BU1NFTUJMRV8xICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBOWF9BU1NFTUJMRV8zKCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgX3ZhbHVlLCAuLi4gKQkJICAgICBcCisJKCBOWF9BU1NFTUJMRV8xICggX3B0ciwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSApIHwJCSAgICAgXAorCSAgTlhfQVNTRU1CTEVfMiAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTlhfQVNTRU1CTEVfNCggX3B0ciwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSwgLi4uICkJCSAgICAgXAorCSggTlhfQVNTRU1CTEVfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CQkgICAgIFwKKwkgIE5YX0FTU0VNQkxFXzMgKCBfcHRyLCBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisjZGVmaW5lIE5YX0FTU0VNQkxFXzUoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCQkgICAgIFwKKwkoIE5YX0FTU0VNQkxFXzEgKCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgX3ZhbHVlICkgfAkJICAgICBcCisJICBOWF9BU1NFTUJMRV80ICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBOWF9BU1NFTUJMRV82KCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgX3ZhbHVlLCAuLi4gKQkJICAgICBcCisJKCBOWF9BU1NFTUJMRV8xICggX3B0ciwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSApIHwJCSAgICAgXAorCSAgTlhfQVNTRU1CTEVfNSAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTlhfQVNTRU1CTEVfNyggX3B0ciwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSwgLi4uICkJCSAgICAgXAorCSggTlhfQVNTRU1CTEVfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CQkgICAgIFwKKwkgIE5YX0FTU0VNQkxFXzYgKCBfcHRyLCBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisvKgorICogQnVpbGQgbmF0aXZlLWVuZGlhbiAocG9zaXRpdmUpIHF3b3JkIGJpdG1hc2tzIGZyb20gbmFtZWQgZmllbGRzCisgKgorICovCisKKyNkZWZpbmUgTlhfTUFTS18xKCBfcHRyLCBfaW5kZXgsIF9maWVsZCApCQkJICAgICBcCisJKCBOWF9CSVRfTUFTSyAoIF9wdHIsIF9maWVsZCApIDw8CQkJICAgICBcCisJICBOWF9RV09SRF9CSVRfT0ZGU0VUICggX3B0ciwgX2luZGV4LCBfZmllbGQgKSApCisKKyNkZWZpbmUgTlhfTUFTS18yKCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgLi4uICkJCQkgICAgIFwKKwkoIE5YX01BU0tfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkICkgfAkJCSAgICAgXAorCSAgTlhfTUFTS18xICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBOWF9NQVNLXzMoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCAuLi4gKQkJCSAgICAgXAorCSggTlhfTUFTS18xICggX3B0ciwgX2luZGV4LCBfZmllbGQgKSB8CQkJICAgICBcCisJICBOWF9NQVNLXzIgKCBfcHRyLCBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisjZGVmaW5lIE5YX01BU0tfNCggX3B0ciwgX2luZGV4LCBfZmllbGQsIC4uLiApCQkJICAgICBcCisJKCBOWF9NQVNLXzEgKCBfcHRyLCBfaW5kZXgsIF9maWVsZCApIHwJCQkgICAgIFwKKwkgIE5YX01BU0tfMyAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTlhfTUFTS181KCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgLi4uICkJCQkgICAgIFwKKwkoIE5YX01BU0tfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkICkgfAkJCSAgICAgXAorCSAgTlhfTUFTS180ICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBOWF9NQVNLXzYoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCAuLi4gKQkJCSAgICAgXAorCSggTlhfTUFTS18xICggX3B0ciwgX2luZGV4LCBfZmllbGQgKSB8CQkJICAgICBcCisJICBOWF9NQVNLXzUgKCBfcHRyLCBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisjZGVmaW5lIE5YX01BU0tfNyggX3B0ciwgX2luZGV4LCBfZmllbGQsIC4uLiApCQkJICAgICBcCisJKCBOWF9NQVNLXzEgKCBfcHRyLCBfaW5kZXgsIF9maWVsZCApIHwJCQkgICAgIFwKKwkgIE5YX01BU0tfNiAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKy8qCisgKiBQb3B1bGF0ZSBiaWctZW5kaWFuIHF3b3JkcyBmcm9tIG5hbWVkIGZpZWxkcyBhbmQgdmFsdWVzCisgKgorICovCisKKyNkZWZpbmUgTlhfRklMTCggX3B0ciwgX2luZGV4LCBfYXNzZW1ibGVkICkJCQkJICAgICBcCisJZG8gewkJCQkJCQkJICAgICBcCisJCXVpbnQ2NF90ICpfX3B0ciA9ICYoX3B0ciktPnUucXdvcmRzWyhfaW5kZXgpXTsJCSAgICAgXAorCQl1aW50NjRfdCBfX2Fzc2VtYmxlZCA9IChfYXNzZW1ibGVkKTsJCQkgICAgIFwKKwkJKl9fcHRyID0gY3B1X3RvX2xlNjQgKCBfX2Fzc2VtYmxlZCApOwkJCSAgICAgXAorCX0gd2hpbGUgKCAwICkKKworI2RlZmluZSBOWF9GSUxMXzEoIF9wdHIsIF9pbmRleCwgLi4uICkJCQkJCSAgICAgXAorCU5YX0ZJTEwgKCBfcHRyLCBfaW5kZXgsIE5YX0FTU0VNQkxFXzEgKCBfcHRyLCBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisjZGVmaW5lIE5YX0ZJTExfMiggX3B0ciwgX2luZGV4LCAuLi4gKQkJCQkJICAgICBcCisJTlhfRklMTCAoIF9wdHIsIF9pbmRleCwgTlhfQVNTRU1CTEVfMiAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTlhfRklMTF8zKCBfcHRyLCBfaW5kZXgsIC4uLiApCQkJCQkgICAgIFwKKwlOWF9GSUxMICggX3B0ciwgX2luZGV4LCBOWF9BU1NFTUJMRV8zICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBOWF9GSUxMXzQoIF9wdHIsIF9pbmRleCwgLi4uICkJCQkJCSAgICAgXAorCU5YX0ZJTEwgKCBfcHRyLCBfaW5kZXgsIE5YX0FTU0VNQkxFXzQgKCBfcHRyLCBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisjZGVmaW5lIE5YX0ZJTExfNSggX3B0ciwgX2luZGV4LCAuLi4gKQkJCQkJICAgICBcCisJTlhfRklMTCAoIF9wdHIsIF9pbmRleCwgTlhfQVNTRU1CTEVfNSAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgTlhfRklMTF82KCBfcHRyLCBfaW5kZXgsIC4uLiApCQkJCQkgICAgIFwKKwlOWF9GSUxMICggX3B0ciwgX2luZGV4LCBOWF9BU1NFTUJMRV82ICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBOWF9GSUxMXzcoIF9wdHIsIF9pbmRleCwgLi4uICkJCQkJCSAgICAgXAorCU5YX0ZJTEwgKCBfcHRyLCBfaW5kZXgsIE5YX0FTU0VNQkxFXzcgKCBfcHRyLCBfaW5kZXgsIF9fVkFfQVJHU19fICkgKQorCisvKiogRXh0cmFjdCB2YWx1ZSBvZiBuYW1lZCBmaWVsZCAqLworI2RlZmluZSBOWF9HRVQ2NCggX3B0ciwgX2ZpZWxkICkJCQkJCSAgICAgXAorCSggewkJCQkJCQkJICAgICBcCisJCXVuc2lnbmVkIGludCBfX2luZGV4ID0gTlhfUVdPUkRfT0ZGU0VUICggX3B0ciwgX2ZpZWxkICk7ICAgICBcCisJCXVpbnQ2NF90ICpfX3B0ciA9ICYoX3B0ciktPnUucXdvcmRzW19faW5kZXhdOwkJICAgICBcCisJCXVpbnQ2NF90IF9fdmFsdWUgPSBsZTY0X3RvX2NwdSAoICpfX3B0ciApOwkJICAgICBcCisJCV9fdmFsdWUgPj49CQkJCQkJICAgICBcCisJCSAgICBOWF9RV09SRF9CSVRfT0ZGU0VUICggX3B0ciwgX19pbmRleCwgX2ZpZWxkICk7CSAgICAgXAorCQlfX3ZhbHVlICY9IE5YX0JJVF9NQVNLICggX3B0ciwgX2ZpZWxkICk7CQkgICAgIFwKKwkJX192YWx1ZTsJCQkJCQkgICAgIFwKKwl9ICkKKworLyoqIEV4dHJhY3QgdmFsdWUgb2YgbmFtZWQgZmllbGQgKGZvciBmaWVsZHMgdXAgdG8gdGhlIHNpemUgb2YgYSBsb25nKSAqLworI2RlZmluZSBOWF9HRVQoIF9wdHIsIF9maWVsZCApCQkJCQkJICAgICBcCisJKCAoIHVuc2lnbmVkIGxvbmcgKSBOWF9HRVQ2NCAoIF9wdHIsIF9maWVsZCApICkKKworI2VuZGlmIC8qIF9OWF9CSVRPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcGhhbnRvbS9ueGhhbF9uaWNfaW50ZXJmYWNlLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9waGFudG9tL254aGFsX25pY19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDg3NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcGhhbnRvbS9ueGhhbF9uaWNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MDEgQEAKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisvKgorICogRGF0YSB0eXBlcyBhbmQgc3RydWN0dXJlIGZvciBIQUwgLSBOSUMgaW50ZXJmYWNlLgorICoKKyAqLworCisjaWZuZGVmIF9OWEhBTF9OSUNfSU5URVJGQUNFX0hfCisjZGVmaW5lIF9OWEhBTF9OSUNfSU5URVJGQUNFX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgIFNpbXBsZSBUeXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIFUzMiAgICAgbnhfcmVnX2FkZHJfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgUm9vdCBjcmItYmFzZWQgZmlybXdhcmUgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ1JCIFJvb3QgQ29tbWFuZAorCisgICBBIHNpbmdsZSBzZXQgb2YgY3JicyBpcyB1c2VkIGFjcm9zcyBhbGwgcGh5c2ljYWwvdmlydHVhbAorICAgZnVuY3Rpb25zIGZvciBjYXBhYmlsaXR5IHF1ZXJpZXMsIGluaXRpYWxpemF0aW9uLCBhbmQKKyAgIGNvbnRleHQgY3JlYXRpb24vZGVzdHJ1Y3Rpb24uIAorCisgICBUaGVyZSBhcmUgNCBDUkJTOgorICAgICAgIENvbW1hbmQvUmVzcG9uc2UgQ1JCCisgICAgICAgQXJndW1lbnQxIENSQgorICAgICAgIEFyZ3VtZW50MiBDUkIKKyAgICAgICBBcmd1bWVudDMgQ1JCCisgICAgICAgU2lnbmF0dXJlIENSQiAKKworICAgICAgIFRoZSBjbWQvcnNwIGNyYiBpcyBhbHdheXMgaW50aWF0ZWQgYnkgdGhlIGhvc3QgdmlhCisgICAgICAgYSBjb21tYW5kIGNvZGUgYW5kIGFsd2F5cyByZXNwb25kZWQgYnkgdGhlIGNhcmQgd2l0aAorICAgICAgIGEgcmVzcG9uc2UgY29kZS4gVGhlIGNtZCBhbmQgcnNwIGNvZGVzIGFyZSBkaXNqb2ludC4KKyAgICAgICBUaGUgc2VxdWVuY2Ugb2YgdXNlIGlzIGFsd2F5cyBDTUQsIFJTUCwgQ0xFQVIgQ01ELgorCisgICAgICAgVGhlIGFyZ3VtZW50cyBhcmUgZm9yIHBhc3NpbmcgaW4gY29tbWFuZCBzcGVjaWZpYworICAgICAgIGFuZCByZXNwb25zZSBzcGVjaWZpYyBwYXJhbWV0ZXJzL2RhdGEuIAorCisgICAgICAgVGhlIHNpZ25hdHVyZSBpcyBjb21wb3NlZCBvZiBhIG1hZ2ljIHZhbHVlLCB0aGUKKyAgICAgICBwY2kgZnVuY3Rpb24gaWQsIGFuZCBhIGNvbW1hbmQgc2VxdWVuY2UgaWQ6CisgICAgICAgICAgWzc6MF0gID0gcGNpIGZ1bmN0aW9uCisgICAgICAgICBbMTU6OF0gID0gdmVyc2lvbgorICAgICAgICAgWzMxOjE2XSA9IG1hZ2ljIG9mIDB4Y2FmZQorCisgICAgICAgVGhlIHBjaSBmdW5jdGlvbiBhbGxvd3MgdGhlIGNhcmQgdG8gdGFrZSBjb3JyZWN0CisgICAgICAgYWN0aW9uIGZvciB0aGUgZ2l2ZW4gcGFydGljdWxhciBjb21tYW5kcy4gCisgICAgICAgVGhlIGZpcm13YXJlIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3QKKyAgICAgICBhbiBlcnJhbnQgZHJpdmVyIHRoYXQgaGFzIGRpZWQgd2hpbGUgaG9sZGluZyAgCisgICAgICAgdGhlIHJvb3QgY3JiIGhhcmR3YXJlIGxvY2suIFN1Y2ggYW4gZXJyb3IgY29uZGl0aW9uCisgICAgICAgc2hvd3MgdXAgYXMgdGhlIGNtZC9yc3AgY3JiIHN0dWNrIGluIGEgbm9uLWNsZWFyIHN0YXRlLgorCisgICBJbnRlcmZhY2UgU2VxdWVuY2U6CisgICAgIEhvc3QgYWx3YXlzIG1ha2VzIHJlcXVlc3RzIGFuZCBmaXJtd2FyZSBhbHdheXMgcmVzcG9uZHMuCisgICAgIE5vdGUgdGhhdCBkYXRhIGZpZWxkIGlzIGFsd2F5cyBzZXQgcHJpb3IgdG8gY29tbWFuZCBmaWVsZC4KKworICAgICBbUkVBRF0gICAgICAgICAgICAgQ01EL1JTUCBDUkIgICAgICBBUkdVTUVOVCBGSUVMRAorICAgICBIb3N0IGdyYWIgbG9jaworICAgICBIb3N0ICAtPiAgICAgICAgICAgQ01EICAgICAgICAgICAgICBvcHRpb25hbCBwYXJhbWV0ZXIKKyAgICAgRlcgICA8LSAgKEdvb2QpICAgIFJTUC1PSyAgICAgICAgICAgREFUQQorICAgICBGVyAgIDwtICAoRmFpbCkgICAgUlNQLUZBSUwgICAgICAgICBvcHRpb25hbCBmYWlsdXJlIGNvZGUKKyAgICAgSG9zdCAtPiAgICAgICAgICAgIENMRUFSCisgICAgIEhvc3QgcmVsZWFzZSBsb2NrCisKKyAgICAgW1dSSVRFXSAgICAgICAgICAgIENNRC9SU1AgQ1JCICAgICAgQVJHVU1FTlQgRklFTEQKKyAgICAgSG9zdCBncmFiIGxvY2sKKyAgICAgSG9zdCAgLT4gICAgICAgICAgIENNRCAgICAgICAgICAgICAgREFUQQorICAgICBGVyAgIDwtICAoR29vZCkgICAgUlNQLU9LICAgICAgICAgICBvcHRpb25hbCB3cml0ZSBzdGF0dXMKKyAgICAgRlcgICA8LSAgKFdyaXRlKSAgIFJTUC1GQUlMICAgICAgICAgb3B0aW9uYWwgZmFpbHVyZSBjb2RlCisgICAgIEhvc3QgLT4gICAgICAgICAgICBDTEVBUgorICAgICBIb3N0IHJlbGVhc2UgbG9jaworCisqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgIENNRC9SU1AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBOWF9DRFJQX1NJR05BVFVSRV9UT19QQ0lGTihzaWduKSAgICAoKHNpZ24pICYgMHhmZikKKyNkZWZpbmUgTlhfQ0RSUF9TSUdOQVRVUkVfVE9fVkVSU0lPTihzaWduKSAgKCgoc2lnbik+PjgpICYgMHhmZikKKyNkZWZpbmUgTlhfQ0RSUF9TSUdOQVRVUkVfVE9fTUFHSUMoc2lnbikgICAgKCgoc2lnbik+PjE2KSAmIDB4ZmZmZikKKyNkZWZpbmUgTlhfQ0RSUF9TSUdOQVRVUkVfVkFMSUQoc2lnbikgICAgICAgXAorCSggTlhfQ0RSUF9TSUdOQVRVUkVfVE9fTUFHSUMoc2lnbikgPT0gMHhjYWZlICYmIFwKKwkgIE5YX0NEUlBfU0lHTkFUVVJFX1RPX1BDSUZOKHNpZ24pIDwgOCkKKyNkZWZpbmUgTlhfQ0RSUF9TSUdOQVRVUkVfTUFLRShwY2lmbix2ZXJzaW9uKSBcCisJKCAoKHBjaWZuKSAmIDB4ZmYpIHwJCSAgICAgIFwKKwkgICgoKHZlcnNpb24pICYgMHhmZikgPDwgOCkgfAkgICAgICBcCisJICAoMHhjYWZlIDw8IDE2KSApCisKKyNkZWZpbmUJTlhfQ0RSUF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZQlOWF9DRFJQX0NNRF9CSVQgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKy8qIEFsbCByZXNwb25zZXMgbXVzdCBoYXZlIHRoZSBOWF9DRFJQX0NNRF9CSVQgY2xlYXJlZAorICogaW4gdGhlIGNyYiBOWF9DRFJQX0NSQl9PRkZTRVQuICovCisjZGVmaW5lIE5YX0NEUlBfRk9STV9SU1AocnNwKSAgICAgICAgICAgICAgKHJzcCkKKyNkZWZpbmUgTlhfQ0RSUF9JU19SU1AocnNwKSAgICAgICAgICAgICAgICAoKChyc3ApICYgTlhfQ0RSUF9DTURfQklUKSA9PSAwKQorCisjZGVmaW5lCU5YX0NEUlBfUlNQX09LICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUJTlhfQ0RSUF9SU1BfRkFJTCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZQlOWF9DRFJQX1JTUF9USU1FT1VUICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisKKy8qIEFsbCBjb21tYW5kcyBtdXN0IGhhdmUgdGhlIE5YX0NEUlBfQ01EX0JJVCBzZXQgaW4KKyAqIHRoZSBjcmIgTlhfQ0RSUF9DUkJfT0ZGU0VULgorICogVGhlIG1hY3JvcyBiZWxvdyBkbyBub3QgaGF2ZSBpdCBleHBsaWNpdGx5IHNldCB0bworICogYWxsb3cgdGhlaXIgdXNlIGluIGxvb2t1cCB0YWJsZXMgKi8KKyNkZWZpbmUgTlhfQ0RSUF9GT1JNX0NNRChjbWQpICAgICAgICAgICAgICAgKE5YX0NEUlBfQ01EX0JJVCB8IChjbWQpKQorI2RlZmluZSBOWF9DRFJQX0lTX0NNRChjbWQpICAgICAgICAgICAgICAgICAoKChjbWQpICYgTlhfQ0RSUF9DTURfQklUKSAhPSAwKQorCisvKiBbQ01EXSBDYXBhYmlsaXR5IFZlY3RvciBbUlNQXSBDYXBhYmlsaXR5IFZlY3RvciAqLworI2RlZmluZSBOWF9DRFJQX0NNRF9TVUJNSVRfQ0FQQUJJTElUSUVTICAgICAweDAwMDAwMDAxCisKKy8qIFtDTURdIC0gW1JTUF0gUXVlcnkgVmFsdWUgKi8KKyNkZWZpbmUJTlhfQ0RSUF9DTURfUkVBRF9NQVhfUkRTX1BFUl9DVFggICAgMHgwMDAwMDAwMgorCisvKiBbQ01EXSAtIFtSU1BdIFF1ZXJ5IFZhbHVlICovCisjZGVmaW5lCU5YX0NEUlBfQ01EX1JFQURfTUFYX1NEU19QRVJfQ1RYICAgIDB4MDAwMDAwMDMKKworLyogW0NNRF0gLSBbUlNQXSBRdWVyeSBWYWx1ZSAqLworI2RlZmluZQlOWF9DRFJQX0NNRF9SRUFEX01BWF9SVUxFU19QRVJfQ1RYICAweDAwMDAwMDA0CisKKy8qIFtDTURdIC0gW1JTUF0gUXVlcnkgVmFsdWUgKi8KKyNkZWZpbmUJTlhfQ0RSUF9DTURfUkVBRF9NQVhfUlhfQ1RYICAgICAgICAgMHgwMDAwMDAwNQorCisvKiBbQ01EXSAtIFtSU1BdIFF1ZXJ5IFZhbHVlICovCisjZGVmaW5lCU5YX0NEUlBfQ01EX1JFQURfTUFYX1RYX0NUWCAgICAgICAgIDB4MDAwMDAwMDYKKworLyogW0NNRF0gUnggQ29uZmlnIERNQSBBZGRyIFtSU1BdIHJjb2RlICovCisjZGVmaW5lCU5YX0NEUlBfQ01EX0NSRUFURV9SWF9DVFggICAgICAgICAgIDB4MDAwMDAwMDcKKworLyogW0NNRF0gUnggQ29udGV4dCBIYW5kbGUsIFJlc2V0IEtpbmQgW1JTUF0gcmNvZGUgKi8KKyNkZWZpbmUJTlhfQ0RSUF9DTURfREVTVFJPWV9SWF9DVFggICAgICAgICAgMHgwMDAwMDAwOAorCisvKiBbQ01EXSBUeCBDb25maWcgRE1BIEFkZHIgW1JTUF0gcmNvZGUgKi8KKyNkZWZpbmUJTlhfQ0RSUF9DTURfQ1JFQVRFX1RYX0NUWCAgICAgICAgICAgMHgwMDAwMDAwOQorCisvKiBbQ01EXSBUeCBDb250ZXh0IEhhbmRsZSwgUmVzZXQgS2luZCBbUlNQXSByY29kZSAqLworI2RlZmluZQlOWF9DRFJQX0NNRF9ERVNUUk9ZX1RYX0NUWCAgICAgICAgICAweDAwMDAwMDBhCisKKy8qIFtDTURdIFN0YXQgc2V0dXAgZG1hIGFkZHIgLSBbUlNQXSBIYW5kbGUsIHJjb2RlICovCisjZGVmaW5lIE5YX0NEUlBfQ01EX1NFVFVQX1NUQVRJU1RJQ1MgICAgICAgIDB4MDAwMDAwMGUKKworLyogW0NNRF0gSGFuZGxlIC0gW1JTUF0gcmNvZGUgKi8KKyNkZWZpbmUgTlhfQ0RSUF9DTURfR0VUX1NUQVRJU1RJQ1MgICAgICAgICAgMHgwMDAwMDAwZgorCisvKiBbQ01EXSBIYW5kbGUgLSBbUlNQXSByY29kZSAqLworI2RlZmluZSBOWF9DRFJQX0NNRF9ERUxFVEVfU1RBVElTVElDUyAgICAgICAweDAwMDAwMDEwCisKKyNkZWZpbmUgTlhfQ0RSUF9DTURfTUFYICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICBDYXBhYmlsaXRpZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBOWF9DQVBfQklUKGNsYXNzLCBiaXQpICAgICAgICAgICAgICAoMSA8PCBiaXQpCisKKy8qIENsYXNzIDAgKGkuZS4gQVJHUyAxKQorICovCisjZGVmaW5lIE5YX0NBUDBfTEVHQUNZX0NPTlRFWFQgICAgICAgICAgICAgIE5YX0NBUF9CSVQoMCwgMCkKKyNkZWZpbmUgTlhfQ0FQMF9NVUxUSV9DT05URVhUICAgICAgICAgICAgICAgTlhfQ0FQX0JJVCgwLCAxKQorI2RlZmluZSBOWF9DQVAwX0xFR0FDWV9NTiAgICAgICAgICAgICAgICAgICBOWF9DQVBfQklUKDAsIDIpCisjZGVmaW5lIE5YX0NBUDBfTEVHQUNZX01TICAgICAgICAgICAgICAgICAgIE5YX0NBUF9CSVQoMCwgMykKKyNkZWZpbmUgTlhfQ0FQMF9DVVRfVEhST1VHSCAgICAgICAgICAgICAgICAgTlhfQ0FQX0JJVCgwLCA0KQorI2RlZmluZSBOWF9DQVAwX0xSTyAgICAgICAgICAgICAgICAgICAgICAgICBOWF9DQVBfQklUKDAsIDUpCisjZGVmaW5lIE5YX0NBUDBfTFNPICAgICAgICAgICAgICAgICAgICAgICAgIE5YX0NBUF9CSVQoMCwgNikKKworLyogQ2xhc3MgMSAoaS5lLiBBUkdTIDIpCisgKi8KKyNkZWZpbmUgTlhfQ0FQMV9OSUMgICAgICAgICAgICAgICAgICAgICAgICAgTlhfQ0FQX0JJVCgxLCAwKQorI2RlZmluZSBOWF9DQVAxX1BYRSAgICAgICAgICAgICAgICAgICAgICAgICBOWF9DQVBfQklUKDEsIDEpCisjZGVmaW5lIE5YX0NBUDFfQ0hJTU5FWSAgICAgICAgICAgICAgICAgICAgIE5YX0NBUF9CSVQoMSwgMikKKyNkZWZpbmUgTlhfQ0FQMV9MU0EgICAgICAgICAgICAgICAgICAgICAgICAgTlhfQ0FQX0JJVCgxLCAzKQorI2RlZmluZSBOWF9DQVAxX1JETUEgICAgICAgICAgICAgICAgICAgICAgICBOWF9DQVBfQklUKDEsIDQpCisjZGVmaW5lIE5YX0NBUDFfSVNDU0kgICAgICAgICAgICAgICAgICAgICAgIE5YX0NBUF9CSVQoMSwgNSkKKyNkZWZpbmUgTlhfQ0FQMV9GQ09FICAgICAgICAgICAgICAgICAgICAgICAgTlhfQ0FQX0JJVCgxLCA2KQorCisvKiBDbGFzcyAyIChpLmUuIEFSR1MgMykKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICBSdWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIFUzMiBueF9yeF9ydWxlX3R5cGVfdDsKKworI2RlZmluZQlOWF9SWF9SVUxFVFlQRV9ERUZBVUxUICAgICAgICAgICAgICAwCisjZGVmaW5lCU5YX1JYX1JVTEVUWVBFX01BQyAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUJTlhfUlhfUlVMRVRZUEVfTUFDX1ZMQU4gICAgICAgICAgICAgMgorI2RlZmluZQlOWF9SWF9SVUxFVFlQRV9NQUNfUlNTICAgICAgICAgICAgICAzCisjZGVmaW5lCU5YX1JYX1JVTEVUWVBFX01BQ19WTEFOX1JTUyAgICAgICAgIDQKKyNkZWZpbmUJTlhfUlhfUlVMRVRZUEVfTUFYICAgICAgICAgICAgICAgICAgNQorCit0eXBlZGVmIFUzMiBueF9yeF9ydWxlX2NtZF90OworCisjZGVmaW5lCU5YX1JYX1JVTEVDTURfQUREICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUJTlhfUlhfUlVMRUNNRF9SRU1PVkUgICAgICAgICAgICAgICAgMQorI2RlZmluZQlOWF9SWF9SVUxFQ01EX01BWCAgICAgICAgICAgICAgICAgICAyCisKK3R5cGVkZWYgc3RydWN0IG54X3J4X3J1bGVfYXJnX3MgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWNoYXIgbWFjWzZdOworCQl9IG07CisJCXN0cnVjdCB7CisJCQljaGFyIG1hY1s2XTsKKwkJCWNoYXIgdmxhbjsKKwkJfSBtdjsKKwkJc3RydWN0IHsKKwkJCWNoYXIgbWFjWzZdOworCQl9IG1yOworCQlzdHJ1Y3QgeworCQkJY2hhciBtYWNbNl07CisJCQljaGFyIHZsYW47CisJCX0gbXZyOworCX07CisJLyogd2lsbCBiZSB1bmlvbiBvZiBhbGwgdGhlIGRpZmZlcmVudCBhcmdzIGZvciBydWxlcyAqLworCVU2NCBkYXRhOworfSBueF9yeF9ydWxlX2FyZ190OworCit0eXBlZGVmIHN0cnVjdCBueF9yeF9ydWxlX3MgeworCVUzMiBpZDsKKwlVMzIgYWN0aXZlOworCW54X3J4X3J1bGVfYXJnX3QgYXJnOworCW54X3J4X3J1bGVfdHlwZV90IHR5cGU7Cit9IG54X3J4X3J1bGVfdDsKKworLyogTVNHIC0gUkVRVUlSRVMgVFggQ09OVEVYVCAqLworCisvKiBUaGUgcnVsZXMgY2FuIGJlIGFkZGVkL2RlbGV0ZWQgZnJvbSBib3RoIHRoZQorICogIGhvc3QgYW5kIGNhcmQgc2lkZXMgc28gcnEvcnNwIGFyZSBzaW1pbGFyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgbnhfaG9zdG1zZ19yeF9ydWxlX3MgeworCW54X3J4X3J1bGVfY21kX3QgY21kOworCW54X3J4X3J1bGVfdCBydWxlOworfSBueF9ob3N0bXNnX3J4X3J1bGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbnhfY2FyZG1zZ19yeF9ydWxlX3MgeworCW54X3Jjb2RlX3QgcmNvZGU7CisJbnhfcnhfcnVsZV9jbWRfdCBjbWQ7CisJbnhfcnhfcnVsZV90IHJ1bGU7Cit9IG54X2NhcmRtc2dfcnhfcnVsZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgIENvbW1vbiB0byBSeC9UeCBjb250ZXh0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29udGV4dCBzdGF0ZXMKKyAqLworCit0eXBlZGVmIFUzMiBueF9ob3N0X2N0eF9zdGF0ZV90OworCisjZGVmaW5lCU5YX0hPU1RfQ1RYX1NUQVRFX0ZSRUVEICAgICAgICAgICAgIDAJLyogSW52YWxpZCBzdGF0ZSAqLworI2RlZmluZQlOWF9IT1NUX0NUWF9TVEFURV9BTExPQ0FURUQgICAgICAgICAxCS8qIE5vdCBjb21taXR0ZWQgKi8KKy8qIFRoZSBmb2xsb3dpbmcgc3RhdGVzIGltcGx5IEZXIGlzIGF3YXJlIG9mIGNvbnRleHQgKi8KKyNkZWZpbmUJTlhfSE9TVF9DVFhfU1RBVEVfQUNUSVZFICAgICAgICAgICAgMgorI2RlZmluZQlOWF9IT1NUX0NUWF9TVEFURV9ESVNBQkxFRCAgICAgICAgICAzCisjZGVmaW5lCU5YX0hPU1RfQ1RYX1NUQVRFX1FVSUVTQ0VEICAgICAgICAgIDQKKyNkZWZpbmUJTlhfSE9TVF9DVFhfU1RBVEVfTUFYICAgICAgICAgICAgICAgNQorCisvKgorICogSW50ZXJydXB0IG1hc2sgY3JiIHVzZSBtdXN0IGJlIHNldCBpZGVudGljYWxseSBvbiB0aGUgVHggCisgKiBhbmQgUnggY29udGV4dCBjb25maWdzIGFjcm9zcyBhIHBjaSBmdW5jdGlvbiAKKyAqLworCisvKiBSeCBhbmQgVHggaGF2ZSB1bmlxdWUgaW50ZXJydXB0L2NyYiAqLworI2RlZmluZSBOWF9IT1NUX0lOVF9DUkJfTU9ERV9VTklRVUUgICAgICAgICAwCisvKiBSeCBhbmQgVHggc2hhcmUgYSBjb21tb24gaW50ZXJydXB0L2NyYiAqLworI2RlZmluZSBOWF9IT1NUX0lOVF9DUkJfTU9ERV9TSEFSRUQgICAgICAgICAxCS8qIDw9IExFR0FDWSAqLworLyogUnggZG9lcyBub3QgdXNlIGEgY3JiICovCisjZGVmaW5lIE5YX0hPU1RfSU5UX0NSQl9NT0RFX05PUlggICAgICAgICAgIDIKKy8qIFR4IGRvZXMgbm90IHVzZSBhIGNyYiAqLworI2RlZmluZSBOWF9IT1NUX0lOVF9DUkJfTU9ERV9OT1RYICAgICAgICAgICAzCisvKiBOZWl0aGVyIFJ4IG5vciBUeCB1c2UgYSBjcmIgKi8KKyNkZWZpbmUgTlhfSE9TVF9JTlRfQ1JCX01PREVfTk9SWFRYICAgICAgICAgNAorCisvKgorICogRGVzdHJveSBSeC9UeAorICovCisKKyNkZWZpbmUgTlhfREVTVFJPWV9DVFhfUkVTRVQgICAgICAgICAgICAgICAgMAorI2RlZmluZSBOWF9ERVNUUk9ZX0NUWF9EM19SRVNFVCAgICAgICAgICAgICAxCisjZGVmaW5lIE5YX0RFU1RST1lfQ1RYX01BWCAgICAgICAgICAgICAgICAgIDIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICBUeAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29tcG9uZW50cyBvZiB0aGUgaG9zdC1yZXF1ZXN0IGZvciBUeCBjb250ZXh0IGNyZWF0aW9uLgorICogQ1JCIC0gRE9FUyBOT1QgUkVRVUlSRSBSeC9UWCBDT05URVhUIAorICovCisKK3R5cGVkZWYgc3RydWN0IG54X2hvc3RycV9jZHNfcmluZ19zIHsKKwlVNjQgaG9zdF9waHlzX2FkZHI7CS8qIFJpbmcgYmFzZSBhZGRyICovCisJVTMyIHJpbmdfc2l6ZTsJCS8qIFJpbmcgZW50cmllcyAqLworCVUzMiByc3ZkOwkJLyogUGFkZGluZyAqLworfSBueF9ob3N0cnFfY2RzX3JpbmdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbnhfaG9zdHJxX3R4X2N0eF9zIHsKKwlVNjQgaG9zdF9yc3BfZG1hX2FkZHI7CS8qIFJlc3BvbnNlIGRtYSdkIGhlcmUgKi8KKwlVNjQgY21kX2NvbnNfZG1hX2FkZHI7CS8qICAqLworCVU2NCBkdW1teV9kbWFfYWRkcjsJLyogICovCisJVTMyIGNhcGFiaWxpdGllc1s0XTsJLyogRmxhZyBiaXQgdmVjdG9yICovCisJVTMyIGhvc3RfaW50X2NyYl9tb2RlOwkvKiBJbnRlcnJ1cHQgY3JiIHVzYWdlICovCisJVTMyIHJzdmQxOwkJLyogUGFkZGluZyAqLworCVUxNiByc3ZkMjsJCS8qIFBhZGRpbmcgKi8KKwlVMTYgaW50ZXJydXB0X2N0bDsKKwlVMTYgbXNpX2luZGV4OworCVUxNiByc3ZkMzsJCS8qIFBhZGRpbmcgKi8KKwlueF9ob3N0cnFfY2RzX3JpbmdfdCBjZHNfcmluZzsJLyogRGVzYyBvZiBjZHMgcmluZyAqLworCVU4ICByZXNlcnZlZFsxMjhdOwkvKiBmdXR1cmUgZXhwYW5zaW9uICovCit9IG54X2hvc3RycV90eF9jdHhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbnhfY2FyZHJzcF9jZHNfcmluZ19zIHsKKwlVMzIgaG9zdF9wcm9kdWNlcl9jcmI7CS8qIENyYiB0byB1c2UgKi8KKwlVMzIgaW50ZXJydXB0X2NyYjsJLyogQ3JiIHRvIHVzZSAqLworfSBueF9jYXJkcnNwX2Nkc19yaW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0IG54X2NhcmRyc3BfdHhfY3R4X3MgeworCVUzMiBob3N0X2N0eF9zdGF0ZTsJLyogU3RhcnRpbmcgc3RhdGUgKi8KKwlVMTYgY29udGV4dF9pZDsJCS8qIEhhbmRsZSBmb3IgY29udGV4dCAqLworCVU4ICBwaHlzX3BvcnQ7CQkvKiBQaHlzaWNhbCBpZCBvZiBwb3J0ICovCisJVTggIHZpcnRfcG9ydDsJCS8qIFZpcnR1YWwvTG9naWNhbCBpZCBvZiBwb3J0ICovCisJbnhfY2FyZHJzcF9jZHNfcmluZ190IGNkc19yaW5nOwkvKiBDYXJkIGNkcyBzZXR0aW5ncyAqLworCVU4ICByZXNlcnZlZFsxMjhdOwkvKiBmdXR1cmUgZXhwYW5zaW9uICovCit9IG54X2NhcmRyc3BfdHhfY3R4X3Q7CisKKyNkZWZpbmUgU0laRU9GX0hPU1RSUV9UWChIT1NUUlFfVFgpIAkJCVwKKwkJKCBzaXplb2YoSE9TVFJRX1RYKSkKKworI2RlZmluZSBTSVpFT0ZfQ0FSRFJTUF9UWChDQVJEUlNQX1RYKSAJCQlcCisJCSggc2l6ZW9mKENBUkRSU1BfVFgpKSAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgUngKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFJEUyByaW5nIG1hcHBpbmcgdG8gcHJvZHVjZXIgY3JicworICovCisKKy8qIEVhY2ggcmluZyBoYXMgYSB1bmlxdWUgY3JiICovCisjZGVmaW5lIE5YX0hPU1RfUkRTX0NSQl9NT0RFX1VOSVFVRSAgICAwCS8qIDw9IExFR0FDWSAqLworCisvKiBBbGwgY29uZmlndXJlZCBSRFMgUmluZ3Mgc2hhcmUgY29tbW9uIGNyYjoKKyAgICAgMSBSaW5nICAtIHNhbWUgYXMgdW5pcXVlCisgICAgIDIgUmluZ3MgLSAxNiwgMTYKKyAgICAgMyBSaW5ncyAtIDEwLCAxMCwgMTAgKi8KKyNkZWZpbmUgTlhfSE9TVF9SRFNfQ1JCX01PREVfU0hBUkVEICAgIDEKKworLyogQml0IHVzYWdlIGlzIHNwZWNpZmllZCBwZXItcmluZyB1c2luZyB0aGUKKyAgIHJpbmcncyBzaXplLiBTdW0gb2YgYml0IGxlbmd0aHMgbXVzdCBiZSA8PSAzMi4gCisgICBQYWNraW5nIGlzIFtSaW5nIE5dIC4uLiBbUmluZyAxXVtSaW5nIDBdICovCisjZGVmaW5lIE5YX0hPU1RfUkRTX0NSQl9NT0RFX0NVU1RPTSAgICAyCisjZGVmaW5lIE5YX0hPU1RfUkRTX0NSQl9NT0RFX01BWCAgICAgICAzCisKKworLyoKKyAqIFJEUyBUaW5nIFR5cGVzIAorICovCisKKyNkZWZpbmUgTlhfUkRTX1JJTkdfVFlQRV9OT1JNQUwgICAgICAgMAorI2RlZmluZSBOWF9SRFNfUklOR19UWVBFX0pVTUJPICAgICAgICAxCisjZGVmaW5lIE5YX1JEU19SSU5HX1RZUEVfTFJPICAgICAgICAgIDIKKyNkZWZpbmUgTlhfUkRTX1JJTkdfVFlQRV9NQVggICAgICAgICAgMworCisvKgorICogQ29tcG9uZW50cyBvZiB0aGUgaG9zdC1yZXF1ZXN0IGZvciBSeCBjb250ZXh0IGNyZWF0aW9uLgorICogQ1JCIC0gRE9FUyBOT1QgUkVRVUlSRSBSeC9UWCBDT05URVhUIAorICovCisKK3R5cGVkZWYgc3RydWN0IG54X2hvc3RycV9zZHNfcmluZ19zIHsKKwlVNjQgaG9zdF9waHlzX2FkZHI7CS8qIFJpbmcgYmFzZSBhZGRyICovCisJVTMyIHJpbmdfc2l6ZTsJCS8qIFJpbmcgZW50cmllcyAqLworCVUxNiBtc2lfaW5kZXg7CisJVTE2IHJzdmQ7CQkvKiBQYWRkaW5nICovCit9IG54X2hvc3RycV9zZHNfcmluZ190OworCit0eXBlZGVmIHN0cnVjdCBueF9ob3N0cnFfcmRzX3JpbmdfcyB7CisJVTY0IGhvc3RfcGh5c19hZGRyOwkvKiBSaW5nIGJhc2UgYWRkciAqLworCVU2NCBidWZmX3NpemU7CQkvKiBQYWNrZXQgYnVmZmVyIHNpemUgKi8KKwlVMzIgcmluZ19zaXplOwkJLyogUmluZyBlbnRyaWVzICovCisJVTMyIHJpbmdfa2luZDsJCS8qIENsYXNzIG9mIHJpbmcgKi8KK30gbnhfaG9zdHJxX3Jkc19yaW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0IG54X2hvc3RycV9yeF9jdHhfcyB7CisJVTY0IGhvc3RfcnNwX2RtYV9hZGRyOwkvKiBSZXNwb25zZSBkbWEnZCBoZXJlICovCisJVTMyIGNhcGFiaWxpdGllc1s0XTsJLyogRmxhZyBiaXQgdmVjdG9yICovCisJVTMyIGhvc3RfaW50X2NyYl9tb2RlOwkvKiBJbnRlcnJ1cHQgY3JiIHVzYWdlICovCisJVTMyIGhvc3RfcmRzX2NyYl9tb2RlOwkvKiBSRFMgY3JiIHVzYWdlICovCisJLyogVGhlc2UgcmluZyBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byBkYXRhWzBdIGJlbG93ICovCisJVTMyIHJkc19yaW5nX29mZnNldDsJLyogT2Zmc2V0IHRvIFJEUyBjb25maWcgKi8KKwlVMzIgc2RzX3Jpbmdfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gU0RTIGNvbmZpZyAqLworCVUxNiBudW1fcmRzX3JpbmdzOwkvKiBDb3VudCBvZiBSRFMgcmluZ3MgKi8KKwlVMTYgbnVtX3Nkc19yaW5nczsJLyogQ291bnQgb2YgU0RTIHJpbmdzICovCisJVTE2IHJzdmQxOwkJLyogUGFkZGluZyAqLworCVUxNiByc3ZkMjsJCS8qIFBhZGRpbmcgKi8KKwlVOCAgcmVzZXJ2ZWRbMTI4XTsgCS8qIHJlc2VydmUgc3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24qLworCS8qIE1VU1QgQkUgNjQtYml0IGFsaWduZWQuCisJICAgVGhlIGZvbGxvd2luZyBpcyBwYWNrZWQ6CisJICAgLSBOIGhvc3RycV9yZHNfcmluZ3MKKwkgICAtIE4gaG9zdHJxX3Nkc19yaW5ncyAqLworCWNoYXIgZGF0YVswXTsKK30gbnhfaG9zdHJxX3J4X2N0eF90OworCit0eXBlZGVmIHN0cnVjdCBueF9jYXJkcnNwX3Jkc19yaW5nX3MgeworCVUzMiBob3N0X3Byb2R1Y2VyX2NyYjsJLyogQ3JiIHRvIHVzZSAqLworCVUzMiByc3ZkMTsJCS8qIFBhZGRpbmcgKi8KK30gbnhfY2FyZHJzcF9yZHNfcmluZ190OworCit0eXBlZGVmIHN0cnVjdCBueF9jYXJkcnNwX3Nkc19yaW5nX3MgeworCVUzMiBob3N0X2NvbnN1bWVyX2NyYjsJLyogQ3JiIHRvIHVzZSAqLworCVUzMiBpbnRlcnJ1cHRfY3JiOwkvKiBDcmIgdG8gdXNlICovCit9IG54X2NhcmRyc3Bfc2RzX3JpbmdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbnhfY2FyZHJzcF9yeF9jdHhfcyB7CisJLyogVGhlc2UgcmluZyBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byBkYXRhWzBdIGJlbG93ICovCisJVTMyIHJkc19yaW5nX29mZnNldDsJLyogT2Zmc2V0IHRvIFJEUyBjb25maWcgKi8KKwlVMzIgc2RzX3Jpbmdfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gU0RTIGNvbmZpZyAqLworCVUzMiBob3N0X2N0eF9zdGF0ZTsJLyogU3RhcnRpbmcgU3RhdGUgKi8KKwlVMzIgbnVtX2ZuX3Blcl9wb3J0OwkvKiBIb3cgbWFueSBQQ0kgZm4gc2hhcmUgdGhlIHBvcnQgKi8KKwlVMTYgbnVtX3Jkc19yaW5nczsJLyogQ291bnQgb2YgUkRTIHJpbmdzICovCisJVTE2IG51bV9zZHNfcmluZ3M7CS8qIENvdW50IG9mIFNEUyByaW5ncyAqLworCVUxNiBjb250ZXh0X2lkOwkJLyogSGFuZGxlIGZvciBjb250ZXh0ICovCisJVTggIHBoeXNfcG9ydDsJCS8qIFBoeXNpY2FsIGlkIG9mIHBvcnQgKi8KKwlVOCAgdmlydF9wb3J0OwkJLyogVmlydHVhbC9Mb2dpY2FsIGlkIG9mIHBvcnQgKi8KKwlVOCAgcmVzZXJ2ZWRbMTI4XTsJLyogc2F2ZSBzcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCS8qICBNVVNUIEJFIDY0LWJpdCBhbGlnbmVkLgorCSAgIFRoZSBmb2xsb3dpbmcgaXMgcGFja2VkOgorCSAgIC0gTiBjYXJkcnNwX3Jkc19yaW5ncworCSAgIC0gTiBjYXJkcnNfc2RzX3JpbmdzICovCisJY2hhciBkYXRhWzBdOworfSBueF9jYXJkcnNwX3J4X2N0eF90OworCisjZGVmaW5lIFNJWkVPRl9IT1NUUlFfUlgoSE9TVFJRX1JYLCByZHNfcmluZ3MsIHNkc19yaW5ncykJXAorCSggc2l6ZW9mKEhPU1RSUV9SWCkgKyAJCQkJCVwKKwkocmRzX3JpbmdzKSooc2l6ZW9mIChueF9ob3N0cnFfcmRzX3JpbmdfdCkpICsJCVwKKwkoc2RzX3JpbmdzKSooc2l6ZW9mIChueF9ob3N0cnFfc2RzX3JpbmdfdCkpICkKKworI2RlZmluZSBTSVpFT0ZfQ0FSRFJTUF9SWChDQVJEUlNQX1JYLCByZHNfcmluZ3MsIHNkc19yaW5ncykgCVwKKwkoIHNpemVvZihDQVJEUlNQX1JYKSArIAkJCQkJXAorCShyZHNfcmluZ3MpKihzaXplb2YgKG54X2NhcmRyc3BfcmRzX3JpbmdfdCkpICsgCQlcCisJKHNkc19yaW5ncykqKHNpemVvZiAobnhfY2FyZHJzcF9zZHNfcmluZ190KSkgKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgIFN0YXRpc3RpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBtb2RlbCBvZiBzdGF0aXN0aWNzIHVwZGF0ZSB0byB1c2UgCisgKi8KKworI2RlZmluZSBOWF9TVEFUSVNUSUNTX01PREVfSU5WQUxJRCAgICAgICAwCisKKy8qIFBlcm1hbmVudCBzZXR1cDsgVXBkYXRlcyBhcmUgb25seSBzZW50IG9uIGV4cGxpY2l0IHJlcXVlc3QgCisgICAoTlhfQ0RSUF9DTURfR0VUX1NUQVRJU1RJQ1MpICovCisjZGVmaW5lIE5YX1NUQVRJU1RJQ1NfTU9ERV9QVUxMICAgICAgICAgIDEKKworLyogUGVybWFuZW50IHNldHVwOyBVcGRhdGVzIGFyZSBzZW50IGF1dG9tYXRpY2FsbHkgYW5kIG9uIAorICAgZXhwbGljaXQgcmVxdWVzdCAoTlhfQ0RSUF9DTURfR0VUX1NUQVRJU1RJQ1MpICovCisjZGVmaW5lIE5YX1NUQVRJU1RJQ1NfTU9ERV9QVVNIICAgICAgICAgIDIKKworLyogT25lIHRpbWUgc3RhdCB1cGRhdGUuICovCisjZGVmaW5lIE5YX1NUQVRJU1RJQ1NfTU9ERV9TSU5HTEVfU0hPVCAgIDMKKworI2RlZmluZSBOWF9TVEFUSVNUSUNTX01PREVfTUFYICAgICAgICAgICA0CisKKy8qCisgKiBXaGF0IHNldCBvZiBzdGF0cyAKKyAqLworI2RlZmluZSBOWF9TVEFUSVNUSUNTX1RZUEVfSU5WQUxJRCAgICAgICAwCisjZGVmaW5lIE5YX1NUQVRJU1RJQ1NfVFlQRV9OSUNfUlhfQ09SRSAgIDEKKyNkZWZpbmUgTlhfU1RBVElTVElDU19UWVBFX05JQ19UWF9DT1JFICAgMgorI2RlZmluZSBOWF9TVEFUSVNUSUNTX1RZUEVfTklDX1JYX0FMTCAgICAzCisjZGVmaW5lIE5YX1NUQVRJU1RJQ1NfVFlQRV9OSUNfVFhfQUxMICAgIDQKKyNkZWZpbmUgTlhfU1RBVElTVElDU19UWVBFX01BWCAgICAgICAgICAgNQorCisKKy8qCisgKiBSZXF1ZXN0IHRvIHNldHVwIHN0YXRpc3RpY3MgZ2F0aGVyaW5nLgorICogQ1JCIC0gRE9FUyBOT1QgUkVRVUlSRSBSeC9UWCBDT05URVhUIAorICovCisKK3R5cGVkZWYgc3RydWN0IG54X2hvc3RycV9zdGF0X3NldHVwX3MgeworCVU2NCBob3N0X3N0YXRfYnVmZmVyOwkvKiBXaGVyZSB0byBkbWEgc3RhdHMgKi8KKwlVMzIgaG9zdF9zdGF0X3NpemU7CS8qIFNpemUgb2Ygc3RhdCBidWZmZXIgKi8KKwlVMTYgY29udGV4dF9pZDsJCS8qIFdoaWNoIGNvbnRleHQgKi8KKwlVMTYgc3RhdF90eXBlOwkJLyogV2hhdCBjbGFzcyBvZiBzdGF0cyAqLworCVUxNiBzdGF0X21vZGU7CQkvKiBXaGVuIHRvIHVwZGF0ZSAqLworCVUxNiBzdGF0X2ludGVydmFsOwkvKiBGcmVxdWVuY3kgb2YgdXBkYXRlICovCit9IG54X2hvc3RycV9zdGF0X3NldHVwX3Q7CisKKworCisjZW5kaWYgLyogX05YSEFMX05JQ19JTlRFUkZBQ0VfSF8gKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3BoYW50b20vcGhhbnRvbS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcGhhbnRvbS9waGFudG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzZjIyZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3BoYW50b20vcGhhbnRvbS5jCkBAIC0wLDAgKzEsMjExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTmV0WGVuLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxncHhlL21hbGxvYy5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9zcGkuaD4KKyNpbmNsdWRlIDxncHhlL3NldHRpbmdzLmg+CisjaW5jbHVkZSAicGhhbnRvbS5oIgorCisvKioKKyAqIEBmaWxlCisgKgorICogTmV0WGVuIFBoYW50b20gTklDcworICoKKyAqLworCisvKiogTWF4aW11bSBudW1iZXIgb2YgcG9ydHMgKi8KKyNkZWZpbmUgUEhOX01BWF9OVU1fUE9SVFMgNAorCisvKiogTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGNvbW1hbmQgUEVHIHRvIGluaXRpYWxpc2UKKyAqCisgKiBCVUd4eHh4CisgKgorICogVGhlIGNvbW1hbmQgUEVHIHdpbGwgY3VycmVudGx5IHJlcG9ydCBpbml0aWFsaXNhdGlvbiBjb21wbGV0ZSBvbmx5CisgKiB3aGVuIGF0IGxlYXN0IG9uZSBQSFkgaGFzIGRldGVjdGVkIGEgbGluayAoc28gdGhhdCB0aGUgZ2xvYmFsIFBIWQorICogY2xvY2sgY2FuIGJlIHNldCB0byAxMEcvMUcgYXMgYXBwcm9wcmlhdGUpLiAgVGhpcyBjYW4gdGFrZSBhIHZlcnksCisgKiB2ZXJ5IGxvbmcgdGltZS4KKyAqCisgKiBBIGZ1dHVyZSBmaXJtd2FyZSByZXZpc2lvbiBzaG91bGQgZGVjb3VwbGUgUEhZIGluaXRpYWxpc2F0aW9uIGZyb20KKyAqIGZpcm13YXJlIGluaXRpYWxpc2F0aW9uLCBhdCB3aGljaCBwb2ludCB0aGUgY29tbWFuZCBQRUcgd2lsbCByZXBvcnQKKyAqIGluaXRpYWxpc2F0aW9uIGNvbXBsZXRlIG11Y2ggZWFybGllciwgYW5kIHRoaXMgdGltZW91dCBjYW4gYmUKKyAqIHJlZHVjZWQuCisgKi8KKyNkZWZpbmUgUEhOX0NNRFBFR19JTklUX1RJTUVPVVRfU0VDIDUwCisKKy8qKiBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgcmVjZWl2ZSBQRUcgdG8gaW5pdGlhbGlzZSAqLworI2RlZmluZSBQSE5fUkNWUEVHX0lOSVRfVElNRU9VVF9TRUMgMgorCisvKiogTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGZpcm13YXJlIHRvIGFjY2VwdCBhIGNvbW1hbmQgKi8KKyNkZWZpbmUgUEhOX0lTU1VFX0NNRF9USU1FT1VUX01TIDIwMDAKKworLyoqIE1heGltdW0gdGltZSB0byB3YWl0IGZvciB0ZXN0IG1lbW9yeSAqLworI2RlZmluZSBQSE5fVEVTVF9NRU1fVElNRU9VVF9NUyAxMDAKKworLyoqIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBDTFAgY29tbWFuZCB0byBiZSBpc3N1ZWQgKi8KKyNkZWZpbmUgUEhOX0NMUF9DTURfVElNRU9VVF9NUyA1MDAKKworLyoqIExpbmsgc3RhdGUgcG9sbCBmcmVxdWVuY3kKKyAqCisgKiBUaGUgbGluayBzdGF0ZSB3aWxsIGJlIGNoZWNrZWQgb25jZSBpbiBldmVyeSBOIGNhbGxzIHRvIHBvbGwoKS4KKyAqLworI2RlZmluZSBQSE5fTElOS19QT0xMX0ZSRVFVRU5DWSA0MDk2CisKKy8qKiBOdW1iZXIgb2YgUlggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUEhOX05VTV9SRFMgMzIKKworLyoqIFJYIG1heGltdW0gZmlsbCBsZXZlbC4gIE11c3QgYmUgc3RyaWN0bHkgbGVzcyB0aGFuIFBITl9OVU1fUkRTLiAqLworI2RlZmluZSBQSE5fUkRTX01BWF9GSUxMIDE2CisKKy8qKiBSWCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBQSE5fUlhfQlVGU0laRSAoIDMyIC8qIG1heCBMTCBwYWRkaW5nIGFkZGVkIGJ5IGNhcmQgKi8gKyBcCisJCQkgRVRIX0ZSQU1FX0xFTiApCisKKy8qKiBOdW1iZXIgb2YgUlggc3RhdHVzIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIFBITl9OVU1fU0RTIDMyCisKKy8qKiBOdW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUEhOX05VTV9DRFMgOAorCisvKiogQSBQaGFudG9tIGRlc2NyaXB0b3IgcmluZyBzZXQgKi8KK3N0cnVjdCBwaGFudG9tX2Rlc2NyaXB0b3JfcmluZ3MgeworCS8qKiBSWCBkZXNjcmlwdG9ycyAqLworCXN0cnVjdCBwaGFudG9tX3JkcyByZHNbUEhOX05VTV9SRFNdOworCS8qKiBSWCBzdGF0dXMgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgcGhhbnRvbV9zZHMgc2RzW1BITl9OVU1fU0RTXTsKKwkvKiogVFggZGVzY3JpcHRvcnMgKi8KKwl1bmlvbiBwaGFudG9tX2NkcyBjZHNbUEhOX05VTV9DRFNdOworCS8qKiBUWCBjb25zdW1lciBpbmRleCAqLworCXZvbGF0aWxlIHVpbnQzMl90IGNtZF9jb25zOworfTsKKworLyoqIFJYIGNvbnRleHQgY3JlYXRpb24gcmVxdWVzdCBhbmQgcmVzcG9uc2UgYnVmZmVycyAqLworc3RydWN0IHBoYW50b21fY3JlYXRlX3J4X2N0eF9ycXJzcCB7CisJc3RydWN0IHsKKwkJc3RydWN0IG54X2hvc3RycV9yeF9jdHhfcyByeF9jdHg7CisJCXN0cnVjdCBueF9ob3N0cnFfcmRzX3JpbmdfcyByZHM7CisJCXN0cnVjdCBueF9ob3N0cnFfc2RzX3JpbmdfcyBzZHM7CisJfSBfX3VubV9kbWFfYWxpZ25lZCBob3N0cnE7CisJc3RydWN0IHsKKwkJc3RydWN0IG54X2NhcmRyc3BfcnhfY3R4X3MgcnhfY3R4OworCQlzdHJ1Y3QgbnhfY2FyZHJzcF9yZHNfcmluZ19zIHJkczsKKwkJc3RydWN0IG54X2NhcmRyc3Bfc2RzX3JpbmdfcyBzZHM7CisJfSBfX3VubV9kbWFfYWxpZ25lZCBjYXJkcnNwOworfTsKKworLyoqIFRYIGNvbnRleHQgY3JlYXRpb24gcmVxdWVzdCBhbmQgcmVzcG9uc2UgYnVmZmVycyAqLworc3RydWN0IHBoYW50b21fY3JlYXRlX3R4X2N0eF9ycXJzcCB7CisJc3RydWN0IHsKKwkJc3RydWN0IG54X2hvc3RycV90eF9jdHhfcyB0eF9jdHg7CisJfSBfX3VubV9kbWFfYWxpZ25lZCBob3N0cnE7CisJc3RydWN0IHsKKwkJc3RydWN0IG54X2NhcmRyc3BfdHhfY3R4X3MgdHhfY3R4OworCX0gX191bm1fZG1hX2FsaWduZWQgY2FyZHJzcDsKK307CisKKy8qKiBBIFBoYW50b20gTklDICovCitzdHJ1Y3QgcGhhbnRvbV9uaWMgeworCS8qKiBCQVIgMCAqLworCXZvaWQgKmJhcjA7CisJLyoqIEN1cnJlbnQgQ1JCIHdpbmRvdyAqLworCXVuc2lnbmVkIGxvbmcgY3JiX3dpbmRvdzsKKwkvKiogQ1JCIHdpbmRvdyBhY2Nlc3MgbWV0aG9kICovCisJdW5zaWduZWQgbG9uZyAoICpjcmJfYWNjZXNzICkgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20sCisJCQkJCXVuc2lnbmVkIGxvbmcgcmVnICk7CisKKworCS8qKiBQb3J0IG51bWJlciAqLworCXVuc2lnbmVkIGludCBwb3J0OworCisKKwkvKiogUlggY29udGV4dCBJRCAqLworCXVpbnQxNl90IHJ4X2NvbnRleHRfaWQ7CisJLyoqIFJYIGRlc2NyaXB0b3IgcHJvZHVjZXIgQ1JCIG9mZnNldCAqLworCXVuc2lnbmVkIGxvbmcgcmRzX3Byb2R1Y2VyX2NyYjsKKwkvKiogUlggc3RhdHVzIGRlc2NyaXB0b3IgY29uc3VtZXIgQ1JCIG9mZnNldCAqLworCXVuc2lnbmVkIGxvbmcgc2RzX2NvbnN1bWVyX2NyYjsKKworCS8qKiBSWCBwcm9kdWNlciBpbmRleCAqLworCXVuc2lnbmVkIGludCByZHNfcHJvZHVjZXJfaWR4OworCS8qKiBSWCBjb25zdW1lciBpbmRleCAqLworCXVuc2lnbmVkIGludCByZHNfY29uc3VtZXJfaWR4OworCS8qKiBSWCBzdGF0dXMgY29uc3VtZXIgaW5kZXggKi8KKwl1bnNpZ25lZCBpbnQgc2RzX2NvbnN1bWVyX2lkeDsKKwkvKiogUlggSS9PIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgaW9fYnVmZmVyICpyZHNfaW9idWZbUEhOX1JEU19NQVhfRklMTF07CisKKworCS8qKiBUWCBjb250ZXh0IElEICovCisJdWludDE2X3QgdHhfY29udGV4dF9pZDsKKwkvKiogVFggZGVzY3JpcHRvciBwcm9kdWNlciBDUkIgb2Zmc2V0ICovCisJdW5zaWduZWQgbG9uZyBjZHNfcHJvZHVjZXJfY3JiOworCisJLyoqIFRYIHByb2R1Y2VyIGluZGV4ICovCisJdW5zaWduZWQgaW50IGNkc19wcm9kdWNlcl9pZHg7CisJLyoqIFRYIGNvbnN1bWVyIGluZGV4ICovCisJdW5zaWduZWQgaW50IGNkc19jb25zdW1lcl9pZHg7CisJLyoqIFRYIEkvTyBidWZmZXJzICovCisJc3RydWN0IGlvX2J1ZmZlciAqY2RzX2lvYnVmW1BITl9OVU1fQ0RTXTsKKworCisJLyoqIERlc2NyaXB0b3IgcmluZ3MgKi8KKwlzdHJ1Y3QgcGhhbnRvbV9kZXNjcmlwdG9yX3JpbmdzICpkZXNjOworCisKKwkvKiogTGFzdCBrbm93biBsaW5rIHN0YXRlICovCisJdWludDMyX3QgbGlua19zdGF0ZTsKKwkvKiogTGluayBzdGF0ZSBwb2xsIHRpbWVyICovCisJdW5zaWduZWQgbG9uZyBsaW5rX3BvbGxfdGltZXI7CisKKworCS8qKiBOb24tdm9sYXRpbGUgc2V0dGluZ3MgKi8KKwlzdHJ1Y3Qgc2V0dGluZ3Mgc2V0dGluZ3M7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ1JCIHJlZ2lzdGVyIGFjY2VzcworICoKKyAqLworCisvKioKKyAqIFByZXBhcmUgZm9yIGFjY2VzcyB0byBDUkIgcmVnaXN0ZXIgdmlhIDEyOE1CIEJBUgorICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAdiByZWcJCVJlZ2lzdGVyIG9mZnNldCB3aXRoaW4gYWJzdHJhY3QgYWRkcmVzcyBzcGFjZQorICogQHJldCBvZmZzZXQJCVJlZ2lzdGVyIG9mZnNldCB3aXRoaW4gUENJIEJBUjAKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGhhbnRvbV9jcmJfYWNjZXNzXzEyOG0gKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20sCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHJlZyApIHsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICggMHg2MDAwMDAwICsgKCByZWcgJiAweDFmZmZmZmYgKSApOworCXVpbnQzMl90IHdpbmRvdyA9ICggcmVnICYgMHgyMDAwMDAwICk7CisJdWludDMyX3QgdmVyaWZ5X3dpbmRvdzsKKworCWlmICggcGhhbnRvbS0+Y3JiX3dpbmRvdyAhPSB3aW5kb3cgKSB7CisKKwkJLyogV3JpdGUgdG8gdGhlIENSQiB3aW5kb3cgcmVnaXN0ZXIgKi8KKwkJd3JpdGVsICggd2luZG93LCBwaGFudG9tLT5iYXIwICsgVU5NXzEyOE1fQ1JCX1dJTkRPVyApOworCisJCS8qIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgcmVhY2hlZCB0aGUgY2FyZCAqLworCQl2ZXJpZnlfd2luZG93ID0gcmVhZGwgKCBwaGFudG9tLT5iYXIwICsgVU5NXzEyOE1fQ1JCX1dJTkRPVyApOworCQlhc3NlcnQgKCB2ZXJpZnlfd2luZG93ID09IHdpbmRvdyApOworCisJCS8qIFJlY29yZCBuZXcgd2luZG93ICovCisJCXBoYW50b20tPmNyYl93aW5kb3cgPSB3aW5kb3c7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyoqCisgKiBQcmVwYXJlIGZvciBhY2Nlc3MgdG8gQ1JCIHJlZ2lzdGVyIHZpYSAzMk1CIEJBUgorICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAdiByZWcJCVJlZ2lzdGVyIG9mZnNldCB3aXRoaW4gYWJzdHJhY3QgYWRkcmVzcyBzcGFjZQorICogQHJldCBvZmZzZXQJCVJlZ2lzdGVyIG9mZnNldCB3aXRoaW4gUENJIEJBUjAKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGhhbnRvbV9jcmJfYWNjZXNzXzMybSAoIHN0cnVjdCBwaGFudG9tX25pYyAqcGhhbnRvbSwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyByZWcgKSB7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAoIHJlZyAmIDB4MWZmZmZmZiApOworCXVpbnQzMl90IHdpbmRvdyA9ICggcmVnICYgMHgyMDAwMDAwICk7CisJdWludDMyX3QgdmVyaWZ5X3dpbmRvdzsKKworCWlmICggcGhhbnRvbS0+Y3JiX3dpbmRvdyAhPSB3aW5kb3cgKSB7CisKKwkJLyogV3JpdGUgdG8gdGhlIENSQiB3aW5kb3cgcmVnaXN0ZXIgKi8KKwkJd3JpdGVsICggd2luZG93LCBwaGFudG9tLT5iYXIwICsgVU5NXzMyTV9DUkJfV0lORE9XICk7CisKKwkJLyogRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyByZWFjaGVkIHRoZSBjYXJkICovCisJCXZlcmlmeV93aW5kb3cgPSByZWFkbCAoIHBoYW50b20tPmJhcjAgKyBVTk1fMzJNX0NSQl9XSU5ET1cgKTsKKwkJYXNzZXJ0ICggdmVyaWZ5X3dpbmRvdyA9PSB3aW5kb3cgKTsKKworCQkvKiBSZWNvcmQgbmV3IHdpbmRvdyAqLworCQlwaGFudG9tLT5jcmJfd2luZG93ID0gd2luZG93OworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qKgorICogUHJlcGFyZSBmb3IgYWNjZXNzIHRvIENSQiByZWdpc3RlciB2aWEgMk1CIEJBUgorICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAdiByZWcJCVJlZ2lzdGVyIG9mZnNldCB3aXRoaW4gYWJzdHJhY3QgYWRkcmVzcyBzcGFjZQorICogQHJldCBvZmZzZXQJCVJlZ2lzdGVyIG9mZnNldCB3aXRoaW4gUENJIEJBUjAKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGhhbnRvbV9jcmJfYWNjZXNzXzJtICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcmVnICkgeworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1aW50OF90IGJsb2NrOworCQl1aW50MTZfdCB3aW5kb3dfaGk7CisJfSByZWdfd2luZG93X2hpW10gPSB7CisJCXsgVU5NX0NSQl9CTEtfUENJRSwJMHg3NzMgfSwKKwkJeyBVTk1fQ1JCX0JMS19DQU0sCTB4NDE2IH0sCisJCXsgVU5NX0NSQl9CTEtfUk9NVVNCLAkweDQyMSB9LAorCQl7IFVOTV9DUkJfQkxLX1RFU1QsCTB4Mjk1IH0sCisJCXsgVU5NX0NSQl9CTEtfUEVHXzAsCTB4MzQwIH0sCisJCXsgVU5NX0NSQl9CTEtfUEVHXzEsCTB4MzQxIH0sCisJCXsgVU5NX0NSQl9CTEtfUEVHXzIsCTB4MzQyIH0sCisJCXsgVU5NX0NSQl9CTEtfUEVHXzMsCTB4MzQzIH0sCisJCXsgVU5NX0NSQl9CTEtfUEVHXzQsCTB4MzRiIH0sCisJfTsKKwl1bnNpZ25lZCBpbnQgYmxvY2sgPSBVTk1fQ1JCX0JMSyAoIHJlZyApOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gVU5NX0NSQl9PRkZTRVQgKCByZWcgKTsKKwl1aW50MzJfdCB3aW5kb3c7CisJdWludDMyX3QgdmVyaWZ5X3dpbmRvdzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8ICggc2l6ZW9mICggcmVnX3dpbmRvd19oaSApIC8KKwkJCSAgICBzaXplb2YgKCByZWdfd2luZG93X2hpWzBdICkgKSA7IGkrKyApIHsKKworCQlpZiAoIHJlZ193aW5kb3dfaGlbaV0uYmxvY2sgIT0gYmxvY2sgKQorCQkJY29udGludWU7CisKKwkJd2luZG93ID0gKCAoIHJlZ193aW5kb3dfaGlbaV0ud2luZG93X2hpIDw8IDIwICkgfAorCQkJICAgKCBvZmZzZXQgJiAweDAwMGYwMDAwICkgKTsKKworCQlpZiAoIHBoYW50b20tPmNyYl93aW5kb3cgIT0gd2luZG93ICkgeworCisJCQkvKiBXcml0ZSB0byB0aGUgQ1JCIHdpbmRvdyByZWdpc3RlciAqLworCQkJd3JpdGVsICggd2luZG93LCBwaGFudG9tLT5iYXIwICsgVU5NXzJNX0NSQl9XSU5ET1cgKTsKKworCQkJLyogRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyByZWFjaGVkIHRoZSBjYXJkICovCisJCQl2ZXJpZnlfd2luZG93ID0gcmVhZGwgKCBwaGFudG9tLT5iYXIwICsKKwkJCQkJCVVOTV8yTV9DUkJfV0lORE9XICk7CisJCQlhc3NlcnQgKCB2ZXJpZnlfd2luZG93ID09IHdpbmRvdyApOworCisJCQkvKiBSZWNvcmQgbmV3IHdpbmRvdyAqLworCQkJcGhhbnRvbS0+Y3JiX3dpbmRvdyA9IHdpbmRvdzsKKwkJfQorCisJCXJldHVybiAoIDB4MWUwMDAwICsgKCBvZmZzZXQgJiAweGZmZmYgKSApOworCX0KKworCWFzc2VydCAoIDAgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkIGZyb20gUGhhbnRvbSBDUkIgcmVnaXN0ZXIKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHYgcmVnCQlSZWdpc3RlciBvZmZzZXQgd2l0aGluIGFic3RyYWN0IGFkZHJlc3Mgc3BhY2UKKyAqIEByZXQJdmFsdWUJCVJlZ2lzdGVyIHZhbHVlCisgKi8KK3N0YXRpYyB1aW50MzJfdCBwaGFudG9tX3JlYWRsICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tLAorCQkJCXVuc2lnbmVkIGxvbmcgcmVnICkgeworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJb2Zmc2V0ID0gcGhhbnRvbS0+Y3JiX2FjY2VzcyAoIHBoYW50b20sIHJlZyApOworCXJldHVybiByZWFkbCAoIHBoYW50b20tPmJhcjAgKyBvZmZzZXQgKTsKK30KKworLyoqCisgKiBXcml0ZSB0byBQaGFudG9tIENSQiByZWdpc3RlcgorICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAdiB2YWx1ZQkJUmVnaXN0ZXIgdmFsdWUKKyAqIEB2IHJlZwkJUmVnaXN0ZXIgb2Zmc2V0IHdpdGhpbiBhYnN0cmFjdCBhZGRyZXNzIHNwYWNlCisgKi8KK3N0YXRpYyB2b2lkIHBoYW50b21fd3JpdGVsICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tLCB1aW50MzJfdCB2YWx1ZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyByZWcgKSB7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlvZmZzZXQgPSBwaGFudG9tLT5jcmJfYWNjZXNzICggcGhhbnRvbSwgcmVnICk7CisJd3JpdGVsICggdmFsdWUsIHBoYW50b20tPmJhcjAgKyBvZmZzZXQgKTsKK30KKworLyoqCisgKiBXcml0ZSB0byBQaGFudG9tIENSQiBISS9MTyByZWdpc3RlciBwYWlyCisgKgorICogQHYgcGhhbnRvbQkJUGhhbnRvbSBOSUMKKyAqIEB2IHZhbHVlCQlSZWdpc3RlciB2YWx1ZQorICogQHYgbG9fb2Zmc2V0CQlMTyByZWdpc3RlciBvZmZzZXQgd2l0aGluIENSQgorICogQHYgaGlfb2Zmc2V0CQlISSByZWdpc3RlciBvZmZzZXQgd2l0aGluIENSQgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGhhbnRvbV93cml0ZV9oaWxvICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tLAorCQkJCQl1aW50NjRfdCB2YWx1ZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBsb19vZmZzZXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgaGlfb2Zmc2V0ICkgeworCXVpbnQzMl90IGxvID0gKCB2YWx1ZSAmIDB4ZmZmZmZmZmZVTCApOworCXVpbnQzMl90IGhpID0gKCB2YWx1ZSA+PiAzMiApOworCisJcGhhbnRvbV93cml0ZWwgKCBwaGFudG9tLCBsbywgbG9fb2Zmc2V0ICk7CisJcGhhbnRvbV93cml0ZWwgKCBwaGFudG9tLCBoaSwgaGlfb2Zmc2V0ICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaXJtd2FyZSBtZXNzYWdlIGJ1ZmZlciBhY2Nlc3MgKGZvciBkZWJ1ZykKKyAqCisgKi8KKworLyoqCisgKiBSZWFkIGZyb20gUGhhbnRvbSB0ZXN0IG1lbW9yeQorICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAdiBvZmZzZXQJCU9mZnNldCB3aXRoaW4gdGVzdCBtZW1vcnkKKyAqIEB2IGJ1ZgkJOC1ieXRlIGJ1ZmZlciB0byBmaWxsCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBwaGFudG9tX3JlYWRfdGVzdF9tZW1fYmxvY2sgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20sCisJCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkJIHVpbnQzMl90IGJ1ZlsyXSApIHsKKwl1bnNpZ25lZCBpbnQgcmV0cmllczsKKwl1aW50MzJfdCB0ZXN0X2NvbnRyb2w7CisKKwlwaGFudG9tX3dyaXRlX2hpbG8gKCBwaGFudG9tLCBvZmZzZXQsIFVOTV9URVNUX0FERFJfTE8sCisJCQkgICAgIFVOTV9URVNUX0FERFJfSEkgKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIFVOTV9URVNUX0NPTlRST0xfRU5BQkxFLCBVTk1fVEVTVF9DT05UUk9MICk7CisJcGhhbnRvbV93cml0ZWwgKCBwaGFudG9tLAorCQkJICggVU5NX1RFU1RfQ09OVFJPTF9FTkFCTEUgfCBVTk1fVEVTVF9DT05UUk9MX1NUQVJUICksCisJCQkgVU5NX1RFU1RfQ09OVFJPTCApOworCQorCWZvciAoIHJldHJpZXMgPSAwIDsgcmV0cmllcyA8IFBITl9URVNUX01FTV9USU1FT1VUX01TIDsgcmV0cmllcysrICkgeworCQl0ZXN0X2NvbnRyb2wgPSBwaGFudG9tX3JlYWRsICggcGhhbnRvbSwgVU5NX1RFU1RfQ09OVFJPTCApOworCQlpZiAoICggdGVzdF9jb250cm9sICYgVU5NX1RFU1RfQ09OVFJPTF9CVVNZICkgPT0gMCApIHsKKwkJCWJ1ZlswXSA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fVEVTVF9SRERBVEFfTE8gKTsKKwkJCWJ1ZlsxXSA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fVEVTVF9SRERBVEFfSEkgKTsKKwkJCXJldHVybiAwOworCQl9CisJCW1kZWxheSAoIDEgKTsKKwl9CisKKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHRlc3QgbWVtb3J5XG4iLAorCSAgICAgICBwaGFudG9tICk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qKgorICogUmVhZCBzaW5nbGUgYnl0ZSBmcm9tIFBoYW50b20gdGVzdCBtZW1vcnkKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHYgb2Zmc2V0CQlPZmZzZXQgd2l0aGluIHRlc3QgbWVtb3J5CisgKiBAcmV0IGJ5dGUJCUJ5dGUgcmVhZCwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworc3RhdGljIGludCBwaGFudG9tX3JlYWRfdGVzdF9tZW0gKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20sCisJCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgKSB7CisJc3RhdGljIHVuaW9uIHsKKwkJdWludDhfdCBieXRlc1s4XTsKKwkJdWludDMyX3QgZHdvcmRzWzJdOworCX0gY2FjaGU7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FjaGVfb2Zmc2V0ID0gLTFVTDsKKwl1bnNpZ25lZCBsb25nIHN1Yl9vZmZzZXQ7CisJaW50IHJjOworCisJc3ViX29mZnNldCA9ICggb2Zmc2V0ICYgKCBzaXplb2YgKCBjYWNoZSApIC0gMSApICk7CisJb2Zmc2V0ID0gKCBvZmZzZXQgJiB+KCBzaXplb2YgKCBjYWNoZSApIC0gMSApICk7CisKKwlpZiAoIGNhY2hlX29mZnNldCAhPSBvZmZzZXQgKSB7CisJCWlmICggKCByYyA9IHBoYW50b21fcmVhZF90ZXN0X21lbV9ibG9jayAoIHBoYW50b20sIG9mZnNldCwKKwkJCQkJCQkgIGNhY2hlLmR3b3JkcyApKSAhPTAgKQorCQkJcmV0dXJuIHJjOworCQljYWNoZV9vZmZzZXQgPSBvZmZzZXQ7CisJfQorCisJcmV0dXJuIGNhY2hlLmJ5dGVzW3N1Yl9vZmZzZXRdOworfQorCisvKioKKyAqIER1bXAgUGhhbnRvbSBmaXJtd2FyZSBkbWVzZyBsb2cKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHYgbG9nCQlMb2cgbnVtYmVyCisgKiBAdiBtYXhfbGluZXMJCU1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHNob3csIG9yIC0xIHRvIHNob3cgYWxsCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBwaGFudG9tX2RtZXNnICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tLCB1bnNpZ25lZCBpbnQgbG9nLAorCQkJICAgIHVuc2lnbmVkIGludCBtYXhfbGluZXMgKSB7CisJdWludDMyX3QgaGVhZDsKKwl1aW50MzJfdCB0YWlsOworCXVpbnQzMl90IGxlbjsKKwl1aW50MzJfdCBzaWc7CisJdWludDMyX3Qgb2Zmc2V0OworCWludCBieXRlOworCisJLyogT3B0aW1pc2Ugb3V0IGZvciBub24tZGVidWcgYnVpbGRzICovCisJaWYgKCAhIERCR19MT0cgKQorCQlyZXR1cm4gMDsKKworCS8qIExvY2F0ZSBsb2cgKi8KKwloZWFkID0gcGhhbnRvbV9yZWFkbCAoIHBoYW50b20sIFVOTV9DQU1fUkFNX0RNRVNHX0hFQUQgKCBsb2cgKSApOworCWxlbiA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fQ0FNX1JBTV9ETUVTR19MRU4gKCBsb2cgKSApOworCXRhaWwgPSBwaGFudG9tX3JlYWRsICggcGhhbnRvbSwgVU5NX0NBTV9SQU1fRE1FU0dfVEFJTCAoIGxvZyApICk7CisJc2lnID0gcGhhbnRvbV9yZWFkbCAoIHBoYW50b20sIFVOTV9DQU1fUkFNX0RNRVNHX1NJRyAoIGxvZyApICk7CisJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGZpcm13YXJlIGRtZXNnIGJ1ZmZlciAlZCAoJTA4eC0lMDh4KVxuIiwKKwkgICAgICAgcGhhbnRvbSwgbG9nLCBoZWFkLCB0YWlsICk7CisJYXNzZXJ0ICggKCBoZWFkICYgMHgwNyApID09IDAgKTsKKwlpZiAoIHNpZyAhPSBVTk1fQ0FNX1JBTV9ETUVTR19TSUdfTUFHSUMgKSB7CisJCURCR0MgKCBwaGFudG9tLCAiV2FybmluZzogYmFkIHNpZ25hdHVyZSAlMDh4ICh3YW50ICUwOGx4KVxuIiwKKwkJICAgICAgIHNpZywgVU5NX0NBTV9SQU1fRE1FU0dfU0lHX01BR0lDICk7CisJfQorCisJLyogTG9jYXRlIHN0YXJ0IG9mIGxhc3QgKG1heF9saW5lcykgbGluZXMgKi8KKwlmb3IgKCBvZmZzZXQgPSB0YWlsIDsgb2Zmc2V0ID4gaGVhZCA7IG9mZnNldC0tICkgeworCQlpZiAoICggYnl0ZSA9IHBoYW50b21fcmVhZF90ZXN0X21lbSAoIHBoYW50b20sCisJCQkJCQkgICAgICAoIG9mZnNldCAtIDEgKSApICkgPCAwICkKKwkJCXJldHVybiBieXRlOworCQlpZiAoICggYnl0ZSA9PSAnXG4nICkgJiYgKCBtYXhfbGluZXMtLSA9PSAwICkgKQorCQkJYnJlYWs7CisJfQorCisJLyogUHJpbnQgbGluZXMgKi8KKwlmb3IgKCA7IG9mZnNldCA8IHRhaWwgOyBvZmZzZXQrKyApIHsKKwkJaWYgKCAoIGJ5dGUgPSBwaGFudG9tX3JlYWRfdGVzdF9tZW0gKCBwaGFudG9tLCBvZmZzZXQgKSApIDwgMCApCisJCQlyZXR1cm4gYnl0ZTsKKwkJREJHICggIiVjIiwgYnl0ZSApOworCX0KKwlEQkcgKCAiXG4iICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRHVtcCBQaGFudG9tIGZpcm13YXJlIGRtZXNnIGxvZ3MKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHYgbWF4X2xpbmVzCQlNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBzaG93LCBvciAtMSB0byBzaG93IGFsbAorICovCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgoIHVudXNlZCApKQorcGhhbnRvbV9kbWVzZ19hbGwgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20sIHVuc2lnbmVkIGludCBtYXhfbGluZXMgKSB7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBVTk1fQ0FNX1JBTV9OVU1fRE1FU0dfQlVGRkVSUyA7IGkrKyApCisJCXBoYW50b21fZG1lc2cgKCBwaGFudG9tLCBpLCBtYXhfbGluZXMgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpcm13YXJlIGludGVyZmFjZQorICoKKyAqLworCisvKioKKyAqIFdhaXQgZm9yIGZpcm13YXJlIHRvIGFjY2VwdCBjb21tYW5kCisgKgorICogQHYgcGhhbnRvbQkJUGhhbnRvbSBOSUMKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHBoYW50b21fd2FpdF9mb3JfY21kICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tICkgeworCXVuc2lnbmVkIGludCByZXRyaWVzOworCXVpbnQzMl90IGNkcnA7CisKKwlmb3IgKCByZXRyaWVzID0gMCA7IHJldHJpZXMgPCBQSE5fSVNTVUVfQ01EX1RJTUVPVVRfTVMgOyByZXRyaWVzKysgKSB7CisJCW1kZWxheSAoIDEgKTsKKwkJY2RycCA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fTklDX1JFR19OWF9DRFJQICk7CisJCWlmICggTlhfQ0RSUF9JU19SU1AgKCBjZHJwICkgKSB7CisJCQlzd2l0Y2ggKCBOWF9DRFJQX0ZPUk1fUlNQICggY2RycCApICkgeworCQkJY2FzZSBOWF9DRFJQX1JTUF9PSzoKKwkJCQlyZXR1cm4gMDsKKwkJCWNhc2UgTlhfQ0RSUF9SU1BfRkFJTDoKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWNhc2UgTlhfQ0RSUF9SU1BfVElNRU9VVDoKKwkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FUFJPVE87CisJCQl9CisJCX0KKwl9CisKKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgdGltZWQgb3V0IHdhaXRpbmcgZm9yIGZpcm13YXJlIHRvIGFjY2VwdCAiCisJICAgICAgICJjb21tYW5kXG4iLCBwaGFudG9tICk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qKgorICogSXNzdWUgY29tbWFuZCB0byBmaXJtd2FyZQorICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAdiBjb21tYW5kCQlGaXJtd2FyZSBjb21tYW5kCisgKiBAdiBhcmcxCQlBcmd1bWVudCAxCisgKiBAdiBhcmcyCQlBcmd1bWVudCAyCisgKiBAdiBhcmczCQlBcmd1bWVudCAzCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBwaGFudG9tX2lzc3VlX2NtZCAoIHN0cnVjdCBwaGFudG9tX25pYyAqcGhhbnRvbSwKKwkJCSAgICAgICB1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCBhcmcxLCB1aW50MzJfdCBhcmcyLAorCQkJICAgICAgIHVpbnQzMl90IGFyZzMgKSB7CisJdWludDMyX3Qgc2lnbmF0dXJlOworCWludCByYzsKKworCS8qIElzc3VlIGNvbW1hbmQgKi8KKwlzaWduYXR1cmUgPSBOWF9DRFJQX1NJR05BVFVSRV9NQUtFICggcGhhbnRvbS0+cG9ydCwKKwkJCQkJICAgICBOWEhBTF9WRVJTSU9OICk7CisJREJHQzIgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBpc3N1aW5nIGNvbW1hbmQgJTA4eCAoJTA4eCwgJTA4eCwgIgorCQkiJTA4eClcbiIsIHBoYW50b20sIGNvbW1hbmQsIGFyZzEsIGFyZzIsIGFyZzMgKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIHNpZ25hdHVyZSwgVU5NX05JQ19SRUdfTlhfU0lHTiApOworCXBoYW50b21fd3JpdGVsICggcGhhbnRvbSwgYXJnMSwgVU5NX05JQ19SRUdfTlhfQVJHMSApOworCXBoYW50b21fd3JpdGVsICggcGhhbnRvbSwgYXJnMiwgVU5NX05JQ19SRUdfTlhfQVJHMiApOworCXBoYW50b21fd3JpdGVsICggcGhhbnRvbSwgYXJnMywgVU5NX05JQ19SRUdfTlhfQVJHMyApOworCXBoYW50b21fd3JpdGVsICggcGhhbnRvbSwgTlhfQ0RSUF9GT1JNX0NNRCAoIGNvbW1hbmQgKSwKKwkJCSBVTk1fTklDX1JFR19OWF9DRFJQICk7CisKKwkvKiBXYWl0IGZvciBjb21tYW5kIHRvIGJlIGFjY2VwdGVkICovCisJaWYgKCAoIHJjID0gcGhhbnRvbV93YWl0X2Zvcl9jbWQgKCBwaGFudG9tICkgKSAhPSAwICkgeworCQlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgY291bGQgbm90IGlzc3VlIGNvbW1hbmQ6ICVzXG4iLAorCQkgICAgICAgcGhhbnRvbSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBJc3N1ZSBidWZmZXItZm9ybWF0IGNvbW1hbmQgdG8gZmlybXdhcmUKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHYgY29tbWFuZAkJRmlybXdhcmUgY29tbWFuZAorICogQHYgYnVmZmVyCQlCdWZmZXIgdG8gcGFzcyB0byBmaXJtd2FyZQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBwaGFudG9tX2lzc3VlX2J1Zl9jbWQgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20sCisJCQkJICAgdWludDMyX3QgY29tbWFuZCwgdm9pZCAqYnVmZmVyLAorCQkJCSAgIHNpemVfdCBsZW4gKSB7CisJdWludDY0X3QgcGh5c2FkZHI7CisKKwlwaHlzYWRkciA9IHZpcnRfdG9fYnVzICggYnVmZmVyICk7CisJcmV0dXJuIHBoYW50b21faXNzdWVfY21kICggcGhhbnRvbSwgY29tbWFuZCwgKCBwaHlzYWRkciA+PiAzMiApLAorCQkJCSAgICggcGh5c2FkZHIgJiAweGZmZmZmZmZmVUwgKSwgbGVuICk7Cit9CisKKy8qKgorICogQ3JlYXRlIFBoYW50b20gUlggY29udGV4dAorICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBwaGFudG9tX2NyZWF0ZV9yeF9jdHggKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gKSB7CisJc3RydWN0IHBoYW50b21fY3JlYXRlX3J4X2N0eF9ycXJzcCAqYnVmOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIGNvbnRleHQgY3JlYXRpb24gYnVmZmVyICovCisJYnVmID0gbWFsbG9jX2RtYSAoIHNpemVvZiAoICpidWYgKSwgVU5NX0RNQV9CVUZGRVJfQUxJR04gKTsKKwlpZiAoICEgYnVmICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQgKCBidWYsIDAsIHNpemVvZiAoICpidWYgKSApOworCQorCS8qIFByZXBhcmUgcmVxdWVzdCAqLworCWJ1Zi0+aG9zdHJxLnJ4X2N0eC5ob3N0X3JzcF9kbWFfYWRkciA9CisJCWNwdV90b19sZTY0ICggdmlydF90b19idXMgKCAmYnVmLT5jYXJkcnNwICkgKTsKKwlidWYtPmhvc3RycS5yeF9jdHguY2FwYWJpbGl0aWVzWzBdID0KKwkJY3B1X3RvX2xlMzIgKCBOWF9DQVAwX0xFR0FDWV9DT05URVhUIHwgTlhfQ0FQMF9MRUdBQ1lfTU4gKTsKKwlidWYtPmhvc3RycS5yeF9jdHguaG9zdF9pbnRfY3JiX21vZGUgPQorCQljcHVfdG9fbGUzMiAoIE5YX0hPU1RfSU5UX0NSQl9NT0RFX1NIQVJFRCApOworCWJ1Zi0+aG9zdHJxLnJ4X2N0eC5ob3N0X3Jkc19jcmJfbW9kZSA9CisJCWNwdV90b19sZTMyICggTlhfSE9TVF9SRFNfQ1JCX01PREVfVU5JUVVFICk7CisJYnVmLT5ob3N0cnEucnhfY3R4LnJkc19yaW5nX29mZnNldCA9IGNwdV90b19sZTMyICggMCApOworCWJ1Zi0+aG9zdHJxLnJ4X2N0eC5zZHNfcmluZ19vZmZzZXQgPQorCQljcHVfdG9fbGUzMiAoIHNpemVvZiAoIGJ1Zi0+aG9zdHJxLnJkcyApICk7CisJYnVmLT5ob3N0cnEucnhfY3R4Lm51bV9yZHNfcmluZ3MgPSBjcHVfdG9fbGUxNiAoIDEgKTsKKwlidWYtPmhvc3RycS5yeF9jdHgubnVtX3Nkc19yaW5ncyA9IGNwdV90b19sZTE2ICggMSApOworCWJ1Zi0+aG9zdHJxLnJkcy5ob3N0X3BoeXNfYWRkciA9CisJCWNwdV90b19sZTY0ICggdmlydF90b19idXMgKCBwaGFudG9tLT5kZXNjLT5yZHMgKSApOworCWJ1Zi0+aG9zdHJxLnJkcy5idWZmX3NpemUgPSBjcHVfdG9fbGU2NCAoIFBITl9SWF9CVUZTSVpFICk7CisJYnVmLT5ob3N0cnEucmRzLnJpbmdfc2l6ZSA9IGNwdV90b19sZTMyICggUEhOX05VTV9SRFMgKTsKKwlidWYtPmhvc3RycS5yZHMucmluZ19raW5kID0gY3B1X3RvX2xlMzIgKCBOWF9SRFNfUklOR19UWVBFX05PUk1BTCApOworCWJ1Zi0+aG9zdHJxLnNkcy5ob3N0X3BoeXNfYWRkciA9CisJCWNwdV90b19sZTY0ICggdmlydF90b19idXMgKCBwaGFudG9tLT5kZXNjLT5zZHMgKSApOworCWJ1Zi0+aG9zdHJxLnNkcy5yaW5nX3NpemUgPSBjcHVfdG9fbGUzMiAoIFBITl9OVU1fU0RTICk7CisKKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgY3JlYXRpbmcgUlggY29udGV4dFxuIiwgcGhhbnRvbSApOworCURCR0MyX0hEQSAoIHBoYW50b20sIHZpcnRfdG9fYnVzICggJmJ1Zi0+aG9zdHJxICksCisJCSAgICAmYnVmLT5ob3N0cnEsIHNpemVvZiAoIGJ1Zi0+aG9zdHJxICkgKTsKKworCS8qIElzc3VlIHJlcXVlc3QgKi8KKwlpZiAoICggcmMgPSBwaGFudG9tX2lzc3VlX2J1Zl9jbWQgKCBwaGFudG9tLAorCQkJCQkgICAgTlhfQ0RSUF9DTURfQ1JFQVRFX1JYX0NUWCwKKwkJCQkJICAgICZidWYtPmhvc3RycSwKKwkJCQkJICAgIHNpemVvZiAoIGJ1Zi0+aG9zdHJxICkgKSApICE9IDAgKSB7CisJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBjb3VsZCBub3QgY3JlYXRlIFJYIGNvbnRleHQ6ICIKKwkJICAgICAgICIlc1xuIiwgcGhhbnRvbSwgc3RyZXJyb3IgKCByYyApICk7CisJCURCR0MgKCBwaGFudG9tLCAiUmVxdWVzdDpcbiIgKTsKKwkJREJHQ19IREEgKCBwaGFudG9tLCB2aXJ0X3RvX2J1cyAoICZidWYtPmhvc3RycSApLAorCQkJICAgJmJ1Zi0+aG9zdHJxLCBzaXplb2YgKCBidWYtPmhvc3RycSApICk7CisJCURCR0MgKCBwaGFudG9tLCAiUmVzcG9uc2U6XG4iICk7CisJCURCR0NfSERBICggcGhhbnRvbSwgdmlydF90b19idXMgKCAmYnVmLT5jYXJkcnNwICksCisJCQkgICAmYnVmLT5jYXJkcnNwLCBzaXplb2YgKCBidWYtPmNhcmRyc3AgKSApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBSZXRyaWV2ZSBjb250ZXh0IHBhcmFtZXRlcnMgKi8KKwlwaGFudG9tLT5yeF9jb250ZXh0X2lkID0KKwkJbGUxNl90b19jcHUgKCBidWYtPmNhcmRyc3AucnhfY3R4LmNvbnRleHRfaWQgKTsKKwlwaGFudG9tLT5yZHNfcHJvZHVjZXJfY3JiID0KKwkJKCBVTk1fQ0FNX1JBTSArCisJCSAgbGUzMl90b19jcHUgKCBidWYtPmNhcmRyc3AucmRzLmhvc3RfcHJvZHVjZXJfY3JiICkpOworCXBoYW50b20tPnNkc19jb25zdW1lcl9jcmIgPQorCQkoIFVOTV9DQU1fUkFNICsKKwkJICBsZTMyX3RvX2NwdSAoIGJ1Zi0+Y2FyZHJzcC5zZHMuaG9zdF9jb25zdW1lcl9jcmIgKSk7CisKKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgY3JlYXRlZCBSWCBjb250ZXh0IChpZCAlMDR4LCBwb3J0IHBoeXMgIgorCSAgICAgICAiJTAyeCB2aXJ0ICUwMngpXG4iLCBwaGFudG9tLCBwaGFudG9tLT5yeF9jb250ZXh0X2lkLAorCSAgICAgICBidWYtPmNhcmRyc3AucnhfY3R4LnBoeXNfcG9ydCwgYnVmLT5jYXJkcnNwLnJ4X2N0eC52aXJ0X3BvcnQgKTsKKwlEQkdDMl9IREEgKCBwaGFudG9tLCB2aXJ0X3RvX2J1cyAoICZidWYtPmNhcmRyc3AgKSwKKwkJICAgICZidWYtPmNhcmRyc3AsIHNpemVvZiAoIGJ1Zi0+Y2FyZHJzcCApICk7CisJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIFJEUyBwcm9kdWNlciBDUkIgaXMgJTA4bHhcbiIsCisJICAgICAgIHBoYW50b20sIHBoYW50b20tPnJkc19wcm9kdWNlcl9jcmIgKTsKKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgU0RTIGNvbnN1bWVyIENSQiBpcyAlMDhseFxuIiwKKwkgICAgICAgcGhhbnRvbSwgcGhhbnRvbS0+c2RzX2NvbnN1bWVyX2NyYiApOworCisgb3V0OgorCWZyZWVfZG1hICggYnVmLCBzaXplb2YgKCAqYnVmICkgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogRGVzdHJveSBQaGFudG9tIFJYIGNvbnRleHQKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIHBoYW50b21fZGVzdHJveV9yeF9jdHggKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gKSB7CisJaW50IHJjOworCQorCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBkZXN0cm95aW5nIFJYIGNvbnRleHQgKGlkICUwNHgpXG4iLAorCSAgICAgICBwaGFudG9tLCBwaGFudG9tLT5yeF9jb250ZXh0X2lkICk7CisKKwkvKiBJc3N1ZSByZXF1ZXN0ICovCisJaWYgKCAoIHJjID0gcGhhbnRvbV9pc3N1ZV9jbWQgKCBwaGFudG9tLAorCQkJCQlOWF9DRFJQX0NNRF9ERVNUUk9ZX1JYX0NUWCwKKwkJCQkJcGhhbnRvbS0+cnhfY29udGV4dF9pZCwKKwkJCQkJTlhfREVTVFJPWV9DVFhfUkVTRVQsIDAgKSApICE9IDAgKSB7CisJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBjb3VsZCBub3QgZGVzdHJveSBSWCBjb250ZXh0OiAiCisJCSAgICAgICAiJXNcbiIsIHBoYW50b20sIHN0cmVycm9yICggcmMgKSApOworCQkvKiBXZSdyZSBwcm9iYWJseSBzY3Jld2VkICovCisJCXJldHVybjsKKwl9CisKKwkvKiBDbGVhciBjb250ZXh0IHBhcmFtZXRlcnMgKi8KKwlwaGFudG9tLT5yeF9jb250ZXh0X2lkID0gMDsKKwlwaGFudG9tLT5yZHNfcHJvZHVjZXJfY3JiID0gMDsKKwlwaGFudG9tLT5zZHNfY29uc3VtZXJfY3JiID0gMDsKKworCS8qIFJlc2V0IHNvZnR3YXJlIGNvdW50ZXJzICovCisJcGhhbnRvbS0+cmRzX3Byb2R1Y2VyX2lkeCA9IDA7CisJcGhhbnRvbS0+cmRzX2NvbnN1bWVyX2lkeCA9IDA7CisJcGhhbnRvbS0+c2RzX2NvbnN1bWVyX2lkeCA9IDA7Cit9CisKKy8qKgorICogQ3JlYXRlIFBoYW50b20gVFggY29udGV4dAorICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBwaGFudG9tX2NyZWF0ZV90eF9jdHggKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gKSB7CisJc3RydWN0IHBoYW50b21fY3JlYXRlX3R4X2N0eF9ycXJzcCAqYnVmOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIGNvbnRleHQgY3JlYXRpb24gYnVmZmVyICovCisJYnVmID0gbWFsbG9jX2RtYSAoIHNpemVvZiAoICpidWYgKSwgVU5NX0RNQV9CVUZGRVJfQUxJR04gKTsKKwlpZiAoICEgYnVmICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQgKCBidWYsIDAsIHNpemVvZiAoICpidWYgKSApOworCisJLyogUHJlcGFyZSByZXF1ZXN0ICovCisJYnVmLT5ob3N0cnEudHhfY3R4Lmhvc3RfcnNwX2RtYV9hZGRyID0KKwkJY3B1X3RvX2xlNjQgKCB2aXJ0X3RvX2J1cyAoICZidWYtPmNhcmRyc3AgKSApOworCWJ1Zi0+aG9zdHJxLnR4X2N0eC5jbWRfY29uc19kbWFfYWRkciA9CisJCWNwdV90b19sZTY0ICggdmlydF90b19idXMgKCAmcGhhbnRvbS0+ZGVzYy0+Y21kX2NvbnMgKSApOworCWJ1Zi0+aG9zdHJxLnR4X2N0eC5jYXBhYmlsaXRpZXNbMF0gPQorCQljcHVfdG9fbGUzMiAoIE5YX0NBUDBfTEVHQUNZX0NPTlRFWFQgfCBOWF9DQVAwX0xFR0FDWV9NTiApOworCWJ1Zi0+aG9zdHJxLnR4X2N0eC5ob3N0X2ludF9jcmJfbW9kZSA9CisJCWNwdV90b19sZTMyICggTlhfSE9TVF9JTlRfQ1JCX01PREVfU0hBUkVEICk7CisJYnVmLT5ob3N0cnEudHhfY3R4LmNkc19yaW5nLmhvc3RfcGh5c19hZGRyID0KKwkJY3B1X3RvX2xlNjQgKCB2aXJ0X3RvX2J1cyAoIHBoYW50b20tPmRlc2MtPmNkcyApICk7CisJYnVmLT5ob3N0cnEudHhfY3R4LmNkc19yaW5nLnJpbmdfc2l6ZSA9IGNwdV90b19sZTMyICggUEhOX05VTV9DRFMgKTsKKworCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBjcmVhdGluZyBUWCBjb250ZXh0XG4iLCBwaGFudG9tICk7CisJREJHQzJfSERBICggcGhhbnRvbSwgdmlydF90b19idXMgKCAmYnVmLT5ob3N0cnEgKSwKKwkJICAgICZidWYtPmhvc3RycSwgc2l6ZW9mICggYnVmLT5ob3N0cnEgKSApOworCisJLyogSXNzdWUgcmVxdWVzdCAqLworCWlmICggKCByYyA9IHBoYW50b21faXNzdWVfYnVmX2NtZCAoIHBoYW50b20sCisJCQkJCSAgICBOWF9DRFJQX0NNRF9DUkVBVEVfVFhfQ1RYLAorCQkJCQkgICAgJmJ1Zi0+aG9zdHJxLAorCQkJCQkgICAgc2l6ZW9mICggYnVmLT5ob3N0cnEgKSApICkgIT0gMCApIHsKKwkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGNvdWxkIG5vdCBjcmVhdGUgVFggY29udGV4dDogIgorCQkgICAgICAgIiVzXG4iLCBwaGFudG9tLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJREJHQyAoIHBoYW50b20sICJSZXF1ZXN0OlxuIiApOworCQlEQkdDX0hEQSAoIHBoYW50b20sIHZpcnRfdG9fYnVzICggJmJ1Zi0+aG9zdHJxICksCisJCQkgICAmYnVmLT5ob3N0cnEsIHNpemVvZiAoIGJ1Zi0+aG9zdHJxICkgKTsKKwkJREJHQyAoIHBoYW50b20sICJSZXNwb25zZTpcbiIgKTsKKwkJREJHQ19IREEgKCBwaGFudG9tLCB2aXJ0X3RvX2J1cyAoICZidWYtPmNhcmRyc3AgKSwKKwkJCSAgICZidWYtPmNhcmRyc3AsIHNpemVvZiAoIGJ1Zi0+Y2FyZHJzcCApICk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFJldHJpZXZlIGNvbnRleHQgcGFyYW1ldGVycyAqLworCXBoYW50b20tPnR4X2NvbnRleHRfaWQgPQorCQlsZTE2X3RvX2NwdSAoIGJ1Zi0+Y2FyZHJzcC50eF9jdHguY29udGV4dF9pZCApOworCXBoYW50b20tPmNkc19wcm9kdWNlcl9jcmIgPQorCQkoIFVOTV9DQU1fUkFNICsKKwkJICBsZTMyX3RvX2NwdShidWYtPmNhcmRyc3AudHhfY3R4LmNkc19yaW5nLmhvc3RfcHJvZHVjZXJfY3JiKSk7CisKKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgY3JlYXRlZCBUWCBjb250ZXh0IChpZCAlMDR4LCBwb3J0IHBoeXMgIgorCSAgICAgICAiJTAyeCB2aXJ0ICUwMngpXG4iLCBwaGFudG9tLCBwaGFudG9tLT50eF9jb250ZXh0X2lkLAorCSAgICAgICBidWYtPmNhcmRyc3AudHhfY3R4LnBoeXNfcG9ydCwgYnVmLT5jYXJkcnNwLnR4X2N0eC52aXJ0X3BvcnQgKTsKKwlEQkdDMl9IREEgKCBwaGFudG9tLCB2aXJ0X3RvX2J1cyAoICZidWYtPmNhcmRyc3AgKSwKKwkJICAgICZidWYtPmNhcmRyc3AsIHNpemVvZiAoIGJ1Zi0+Y2FyZHJzcCApICk7CisJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIENEUyBwcm9kdWNlciBDUkIgaXMgJTA4bHhcbiIsCisJICAgICAgIHBoYW50b20sIHBoYW50b20tPmNkc19wcm9kdWNlcl9jcmIgKTsKKworIG91dDoKKwlmcmVlX2RtYSAoIGJ1Ziwgc2l6ZW9mICggKmJ1ZiApICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIERlc3Ryb3kgUGhhbnRvbSBUWCBjb250ZXh0CisgKgorICogQHYgcGhhbnRvbQkJUGhhbnRvbSBOSUMKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgdm9pZCBwaGFudG9tX2Rlc3Ryb3lfdHhfY3R4ICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tICkgeworCWludCByYzsKKwkKKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgZGVzdHJveWluZyBUWCBjb250ZXh0IChpZCAlMDR4KVxuIiwKKwkgICAgICAgcGhhbnRvbSwgcGhhbnRvbS0+dHhfY29udGV4dF9pZCApOworCisJLyogSXNzdWUgcmVxdWVzdCAqLworCWlmICggKCByYyA9IHBoYW50b21faXNzdWVfY21kICggcGhhbnRvbSwKKwkJCQkJTlhfQ0RSUF9DTURfREVTVFJPWV9UWF9DVFgsCisJCQkJCXBoYW50b20tPnR4X2NvbnRleHRfaWQsCisJCQkJCU5YX0RFU1RST1lfQ1RYX1JFU0VULCAwICkgKSAhPSAwICkgeworCQlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgY291bGQgbm90IGRlc3Ryb3kgVFggY29udGV4dDogIgorCQkgICAgICAgIiVzXG4iLCBwaGFudG9tLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJLyogV2UncmUgcHJvYmFibHkgc2NyZXdlZCAqLworCQlyZXR1cm47CisJfQorCisJLyogQ2xlYXIgY29udGV4dCBwYXJhbWV0ZXJzICovCisJcGhhbnRvbS0+dHhfY29udGV4dF9pZCA9IDA7CisJcGhhbnRvbS0+Y2RzX3Byb2R1Y2VyX2NyYiA9IDA7CisKKwkvKiBSZXNldCBzb2Z0d2FyZSBjb3VudGVycyAqLworCXBoYW50b20tPmNkc19wcm9kdWNlcl9pZHggPSAwOworCXBoYW50b20tPmNkc19jb25zdW1lcl9pZHggPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVzY3JpcHRvciByaW5nIG1hbmFnZW1lbnQKKyAqCisgKi8KKworLyoqCisgKiBBbGxvY2F0ZSBQaGFudG9tIFJYIGRlc2NyaXB0b3IKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHJldCBpbmRleAkJUlggZGVzY3JpcHRvciBpbmRleCwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworc3RhdGljIGludCBwaGFudG9tX2FsbG9jX3JkcyAoIHN0cnVjdCBwaGFudG9tX25pYyAqcGhhbnRvbSApIHsKKwl1bnNpZ25lZCBpbnQgcmRzX3Byb2R1Y2VyX2lkeDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9yZHNfcHJvZHVjZXJfaWR4OworCisJLyogQ2hlY2sgZm9yIHNwYWNlIGluIHRoZSByaW5nLiAgUlggZGVzY3JpcHRvcnMgYXJlIGNvbnN1bWVkCisJICogb3V0IG9mIG9yZGVyLCBidXQgdGhleSBhcmUgKnJlYWQqIGJ5IHRoZSBoYXJkd2FyZSBpbiBzdHJpY3QKKwkgKiBvcmRlci4gIFdlIG1haW50YWluIGEgcGVzc2ltaXN0aWMgY29uc3VtZXIgaW5kZXgsIHdoaWNoIGlzCisJICogZ3VhcmFudGVlZCBuZXZlciB0byBiZSBhbiBvdmVyZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZgorCSAqIGRlc2NyaXB0b3JzIHJlYWQgYnkgdGhlIGhhcmR3YXJlLgorCSAqLworCXJkc19wcm9kdWNlcl9pZHggPSBwaGFudG9tLT5yZHNfcHJvZHVjZXJfaWR4OworCW5leHRfcmRzX3Byb2R1Y2VyX2lkeCA9ICggKCByZHNfcHJvZHVjZXJfaWR4ICsgMSApICUgUEhOX05VTV9SRFMgKTsKKwlpZiAoIG5leHRfcmRzX3Byb2R1Y2VyX2lkeCA9PSBwaGFudG9tLT5yZHNfY29uc3VtZXJfaWR4ICkgeworCQlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgUkRTIHJpbmcgZnVsbCAoaW5kZXggJWQgbm90ICIKKwkJICAgICAgICJjb25zdW1lZClcbiIsIHBoYW50b20sIG5leHRfcmRzX3Byb2R1Y2VyX2lkeCApOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJcmV0dXJuIHJkc19wcm9kdWNlcl9pZHg7Cit9CisKKy8qKgorICogUG9zdCBQaGFudG9tIFJYIGRlc2NyaXB0b3IKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHYgcmRzCQlSWCBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyB2b2lkIHBoYW50b21fcG9zdF9yZHMgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20sCisJCQkgICAgICAgc3RydWN0IHBoYW50b21fcmRzICpyZHMgKSB7CisJdW5zaWduZWQgaW50IHJkc19wcm9kdWNlcl9pZHg7CisJdW5zaWduZWQgaW50IG5leHRfcmRzX3Byb2R1Y2VyX2lkeDsKKwlzdHJ1Y3QgcGhhbnRvbV9yZHMgKmVudHJ5OworCisJLyogQ29weSBkZXNjcmlwdG9yIHRvIHJpbmcgKi8KKwlyZHNfcHJvZHVjZXJfaWR4ID0gcGhhbnRvbS0+cmRzX3Byb2R1Y2VyX2lkeDsKKwllbnRyeSA9ICZwaGFudG9tLT5kZXNjLT5yZHNbcmRzX3Byb2R1Y2VyX2lkeF07CisJbWVtY3B5ICggZW50cnksIHJkcywgc2l6ZW9mICggKmVudHJ5ICkgKTsKKwlEQkdDMiAoIHBoYW50b20sICJQaGFudG9tICVwIHBvc3RpbmcgUkRTICVsZCAoc2xvdCAlZCk6XG4iLAorCQlwaGFudG9tLCBOWF9HRVQgKCByZHMsIGhhbmRsZSApLCByZHNfcHJvZHVjZXJfaWR4ICk7CisJREJHQzJfSERBICggcGhhbnRvbSwgdmlydF90b19idXMgKCBlbnRyeSApLCBlbnRyeSwgc2l6ZW9mICggKmVudHJ5ICkgKTsKKworCS8qIFVwZGF0ZSBwcm9kdWNlciBpbmRleCAqLworCW5leHRfcmRzX3Byb2R1Y2VyX2lkeCA9ICggKCByZHNfcHJvZHVjZXJfaWR4ICsgMSApICUgUEhOX05VTV9SRFMgKTsKKwlwaGFudG9tLT5yZHNfcHJvZHVjZXJfaWR4ID0gbmV4dF9yZHNfcHJvZHVjZXJfaWR4OworCXdtYigpOworCXBoYW50b21fd3JpdGVsICggcGhhbnRvbSwgcGhhbnRvbS0+cmRzX3Byb2R1Y2VyX2lkeCwKKwkJCSBwaGFudG9tLT5yZHNfcHJvZHVjZXJfY3JiICk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgUGhhbnRvbSBUWCBkZXNjcmlwdG9yCisgKgorICogQHYgcGhhbnRvbQkJUGhhbnRvbSBOSUMKKyAqIEByZXQgaW5kZXgJCVRYIGRlc2NyaXB0b3IgaW5kZXgsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgcGhhbnRvbV9hbGxvY19jZHMgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gKSB7CisJdW5zaWduZWQgaW50IGNkc19wcm9kdWNlcl9pZHg7CisJdW5zaWduZWQgaW50IG5leHRfY2RzX3Byb2R1Y2VyX2lkeDsKKworCS8qIENoZWNrIGZvciBzcGFjZSBpbiB0aGUgcmluZy4gIFRYIGRlc2NyaXB0b3JzIGFyZSBjb25zdW1lZAorCSAqIGluIHN0cmljdCBvcmRlciwgc28gd2UganVzdCBjaGVjayBmb3IgYSBjb2xsaXNpb24gYWdhaW5zdAorCSAqIHRoZSBjb25zdW1lciBpbmRleC4KKwkgKi8KKwljZHNfcHJvZHVjZXJfaWR4ID0gcGhhbnRvbS0+Y2RzX3Byb2R1Y2VyX2lkeDsKKwluZXh0X2Nkc19wcm9kdWNlcl9pZHggPSAoICggY2RzX3Byb2R1Y2VyX2lkeCArIDEgKSAlIFBITl9OVU1fQ0RTICk7CisJaWYgKCBuZXh0X2Nkc19wcm9kdWNlcl9pZHggPT0gcGhhbnRvbS0+Y2RzX2NvbnN1bWVyX2lkeCApIHsKKwkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIENEUyByaW5nIGZ1bGwgKGluZGV4ICVkIG5vdCAiCisJCSAgICAgICAiY29uc3VtZWQpXG4iLCBwaGFudG9tLCBuZXh0X2Nkc19wcm9kdWNlcl9pZHggKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCXJldHVybiBjZHNfcHJvZHVjZXJfaWR4OworfQorCisvKioKKyAqIFBvc3QgUGhhbnRvbSBUWCBkZXNjcmlwdG9yCisgKgorICogQHYgcGhhbnRvbQkJUGhhbnRvbSBOSUMKKyAqIEB2IGNkcwkJVFggZGVzY3JpcHRvcgorICovCitzdGF0aWMgdm9pZCBwaGFudG9tX3Bvc3RfY2RzICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tLAorCQkJICAgICAgIHVuaW9uIHBoYW50b21fY2RzICpjZHMgKSB7CisJdW5zaWduZWQgaW50IGNkc19wcm9kdWNlcl9pZHg7CisJdW5zaWduZWQgaW50IG5leHRfY2RzX3Byb2R1Y2VyX2lkeDsKKwl1bmlvbiBwaGFudG9tX2NkcyAqZW50cnk7CisKKwkvKiBDb3B5IGRlc2NyaXB0b3IgdG8gcmluZyAqLworCWNkc19wcm9kdWNlcl9pZHggPSBwaGFudG9tLT5jZHNfcHJvZHVjZXJfaWR4OworCWVudHJ5ID0gJnBoYW50b20tPmRlc2MtPmNkc1tjZHNfcHJvZHVjZXJfaWR4XTsKKwltZW1jcHkgKCBlbnRyeSwgY2RzLCBzaXplb2YgKCAqZW50cnkgKSApOworCURCR0MyICggcGhhbnRvbSwgIlBoYW50b20gJXAgcG9zdGluZyBDRFMgJWQ6XG4iLAorCQlwaGFudG9tLCBjZHNfcHJvZHVjZXJfaWR4ICk7CisJREJHQzJfSERBICggcGhhbnRvbSwgdmlydF90b19idXMgKCBlbnRyeSApLCBlbnRyeSwgc2l6ZW9mICggKmVudHJ5ICkgKTsKKworCS8qIFVwZGF0ZSBwcm9kdWNlciBpbmRleCAqLworCW5leHRfY2RzX3Byb2R1Y2VyX2lkeCA9ICggKCBjZHNfcHJvZHVjZXJfaWR4ICsgMSApICUgUEhOX05VTV9DRFMgKTsKKwlwaGFudG9tLT5jZHNfcHJvZHVjZXJfaWR4ID0gbmV4dF9jZHNfcHJvZHVjZXJfaWR4OworCXdtYigpOworCXBoYW50b21fd3JpdGVsICggcGhhbnRvbSwgcGhhbnRvbS0+Y2RzX3Byb2R1Y2VyX2lkeCwKKwkJCSBwaGFudG9tLT5jZHNfcHJvZHVjZXJfY3JiICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNQUMgYWRkcmVzcyBtYW5hZ2VtZW50CisgKgorICovCisKKy8qKgorICogQWRkL3JlbW92ZSBNQUMgYWRkcmVzcworICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAdiBsbF9hZGRyCQlNQUMgYWRkcmVzcyB0byBhZGQgb3IgcmVtb3ZlCisgKiBAdiBvcGNvZGUJCU1BQyByZXF1ZXN0IG9wY29kZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcGhhbnRvbV91cGRhdGVfbWFjYWRkciAoIHN0cnVjdCBwaGFudG9tX25pYyAqcGhhbnRvbSwKKwkJCQkgICAgY29uc3QgdWludDhfdCAqbGxfYWRkciwKKwkJCQkgICAgdW5zaWduZWQgaW50IG9wY29kZSApIHsKKwl1bmlvbiBwaGFudG9tX2NkcyBjZHM7CisJaW50IGluZGV4OworCisJLyogR2V0IGRlc2NyaXB0b3IgcmluZyBlbnRyeSAqLworCWluZGV4ID0gcGhhbnRvbV9hbGxvY19jZHMgKCBwaGFudG9tICk7CisJaWYgKCBpbmRleCA8IDAgKQorCQlyZXR1cm4gaW5kZXg7CisKKwkvKiBGaWxsIGRlc2NyaXB0b3IgcmluZyBlbnRyeSAqLworCW1lbXNldCAoICZjZHMsIDAsIHNpemVvZiAoIGNkcyApICk7CisJTlhfRklMTF8xICggJmNkcywgMCwKKwkJICAgIG5pY19yZXF1ZXN0LmNvbW1vbi5vcGNvZGUsIFVOTV9OSUNfUkVRVUVTVCApOworCU5YX0ZJTExfMiAoICZjZHMsIDEsCisJCSAgICBuaWNfcmVxdWVzdC5oZWFkZXIub3Bjb2RlLCBVTk1fTUFDX0VWRU5ULAorCQkgICAgbmljX3JlcXVlc3QuaGVhZGVyLmNvbnRleHRfaWQsIHBoYW50b20tPnBvcnQgKTsKKwlOWF9GSUxMXzcgKCAmY2RzLCAyLAorCQkgICAgbmljX3JlcXVlc3QuYm9keS5tYWNfcmVxdWVzdC5vcGNvZGUsIG9wY29kZSwKKwkJICAgIG5pY19yZXF1ZXN0LmJvZHkubWFjX3JlcXVlc3QubWFjX2FkZHJfMCwgbGxfYWRkclswXSwKKwkJICAgIG5pY19yZXF1ZXN0LmJvZHkubWFjX3JlcXVlc3QubWFjX2FkZHJfMSwgbGxfYWRkclsxXSwKKwkJICAgIG5pY19yZXF1ZXN0LmJvZHkubWFjX3JlcXVlc3QubWFjX2FkZHJfMiwgbGxfYWRkclsyXSwKKwkJICAgIG5pY19yZXF1ZXN0LmJvZHkubWFjX3JlcXVlc3QubWFjX2FkZHJfMywgbGxfYWRkclszXSwKKwkJICAgIG5pY19yZXF1ZXN0LmJvZHkubWFjX3JlcXVlc3QubWFjX2FkZHJfNCwgbGxfYWRkcls0XSwKKwkJICAgIG5pY19yZXF1ZXN0LmJvZHkubWFjX3JlcXVlc3QubWFjX2FkZHJfNSwgbGxfYWRkcls1XSApOworCisJLyogUG9zdCBkZXNjcmlwdG9yICovCisJcGhhbnRvbV9wb3N0X2NkcyAoIHBoYW50b20sICZjZHMgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEFkZCBNQUMgYWRkcmVzcworICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAdiBsbF9hZGRyCQlNQUMgYWRkcmVzcyB0byBhZGQgb3IgcmVtb3ZlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBpbnQgcGhhbnRvbV9hZGRfbWFjYWRkciAoIHN0cnVjdCBwaGFudG9tX25pYyAqcGhhbnRvbSwKKwkJCQkJY29uc3QgdWludDhfdCAqbGxfYWRkciApIHsKKworCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBhZGRpbmcgTUFDIGFkZHJlc3MgJXNcbiIsCisJICAgICAgIHBoYW50b20sIGV0aF9udG9hICggbGxfYWRkciApICk7CisKKwlyZXR1cm4gcGhhbnRvbV91cGRhdGVfbWFjYWRkciAoIHBoYW50b20sIGxsX2FkZHIsIFVOTV9NQUNfQUREICk7Cit9CisKKy8qKgorICogUmVtb3ZlIE1BQyBhZGRyZXNzCisgKgorICogQHYgcGhhbnRvbQkJUGhhbnRvbSBOSUMKKyAqIEB2IGxsX2FkZHIJCU1BQyBhZGRyZXNzIHRvIGFkZCBvciByZW1vdmUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW5saW5lIGludCBwaGFudG9tX2RlbF9tYWNhZGRyICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tLAorCQkJCQljb25zdCB1aW50OF90ICpsbF9hZGRyICkgeworCisJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIHJlbW92aW5nIE1BQyBhZGRyZXNzICVzXG4iLAorCSAgICAgICBwaGFudG9tLCBldGhfbnRvYSAoIGxsX2FkZHIgKSApOworCisJcmV0dXJuIHBoYW50b21fdXBkYXRlX21hY2FkZHIgKCBwaGFudG9tLCBsbF9hZGRyLCBVTk1fTUFDX0RFTCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTGluayBzdGF0ZSBkZXRlY3Rpb24KKyAqCisgKi8KKworLyoqCisgKiBQb2xsIGxpbmsgc3RhdGUKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHBoYW50b21fcG9sbF9saW5rX3N0YXRlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworCXVpbnQzMl90IHhnX3N0YXRlX3AzOworCXVuc2lnbmVkIGludCBsaW5rOworCisJLyogUmVhZCBsaW5rIHN0YXRlICovCisJeGdfc3RhdGVfcDMgPSBwaGFudG9tX3JlYWRsICggcGhhbnRvbSwgVU5NX05JQ19SRUdfWEdfU1RBVEVfUDMgKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIGNoYW5nZSwgZG8gbm90aGluZyAqLworCWlmICggcGhhbnRvbS0+bGlua19zdGF0ZSA9PSB4Z19zdGF0ZV9wMyApCisJCXJldHVybjsKKworCS8qIFJlY29yZCBuZXcgbGluayBzdGF0ZSAqLworCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBuZXcgbGluayBzdGF0ZSAlMDh4ICh3YXMgJTA4eClcbiIsCisJICAgICAgIHBoYW50b20sIHhnX3N0YXRlX3AzLCBwaGFudG9tLT5saW5rX3N0YXRlICk7CisJcGhhbnRvbS0+bGlua19zdGF0ZSA9IHhnX3N0YXRlX3AzOworCisJLyogSW5kaWNhdGUgbGluayBzdGF0ZSB0byBnUFhFICovCisJbGluayA9IFVOTV9OSUNfUkVHX1hHX1NUQVRFX1AzX0xJTksgKCBwaGFudG9tLT5wb3J0LAorCQkJCQkgICAgICBwaGFudG9tLT5saW5rX3N0YXRlICk7CisJc3dpdGNoICggbGluayApIHsKKwljYXNlIFVOTV9OSUNfUkVHX1hHX1NUQVRFX1AzX0xJTktfVVA6CisJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBsaW5rIGlzIHVwXG4iLCBwaGFudG9tICk7CisJCW5ldGRldl9saW5rX3VwICggbmV0ZGV2ICk7CisJCWJyZWFrOworCWNhc2UgVU5NX05JQ19SRUdfWEdfU1RBVEVfUDNfTElOS19ET1dOOgorCQlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgbGluayBpcyBkb3duXG4iLCBwaGFudG9tICk7CisJCW5ldGRldl9saW5rX2Rvd24gKCBuZXRkZXYgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGJhZCBsaW5rIHN0YXRlICVkXG4iLAorCQkgICAgICAgcGhhbnRvbSwgbGluayApOworCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNYWluIGRyaXZlciBib2R5CisgKgorICovCisKKy8qKgorICogUmVmaWxsIGRlc2NyaXB0b3IgcmluZworICoKKyAqIEB2IG5ldGRldgkJTmV0IGRldmljZQorICovCitzdGF0aWMgdm9pZCBwaGFudG9tX3JlZmlsbF9yeF9yaW5nICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXN0cnVjdCBwaGFudG9tX3JkcyByZHM7CisJdW5zaWduZWQgaW50IGhhbmRsZTsKKwlpbnQgaW5kZXg7CisKKwlmb3IgKCBoYW5kbGUgPSAwIDsgaGFuZGxlIDwgUEhOX1JEU19NQVhfRklMTCA7IGhhbmRsZSsrICkgeworCisJCS8qIFNraXAgdGhpcyBpbmRleCBpZiB0aGUgZGVzY3JpcHRvciBoYXMgbm90IHlldCBiZWVuCisJCSAqIGNvbnN1bWVkLgorCQkgKi8KKwkJaWYgKCBwaGFudG9tLT5yZHNfaW9idWZbaGFuZGxlXSAhPSBOVUxMICkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFsbG9jYXRlIGRlc2NyaXB0b3IgcmluZyBlbnRyeSAqLworCQlpbmRleCA9IHBoYW50b21fYWxsb2NfcmRzICggcGhhbnRvbSApOworCQlhc3NlcnQgKCBQSE5fUkRTX01BWF9GSUxMIDwgUEhOX05VTV9SRFMgKTsKKwkJYXNzZXJ0ICggaW5kZXggPj0gMCApOyAvKiBHdWFyYW50ZWVkIGJ5IE1BWF9GSUxMIDwgTlVNX1JEUyApICovCisKKwkJLyogVHJ5IHRvIGFsbG9jYXRlIGFuIEkvTyBidWZmZXIgKi8KKwkJaW9idWYgPSBhbGxvY19pb2IgKCBQSE5fUlhfQlVGU0laRSApOworCQlpZiAoICEgaW9idWYgKSB7CisJCQkvKiBGYWlsdXJlIGlzIG5vbi1mYXRhbDsgd2Ugd2lsbCByZXRyeSBsYXRlciAqLworCQkJbmV0ZGV2X3J4X2VyciAoIG5ldGRldiwgTlVMTCwgLUVOT01FTSApOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBGaWxsIGRlc2NyaXB0b3IgcmluZyBlbnRyeSAqLworCQltZW1zZXQgKCAmcmRzLCAwLCBzaXplb2YgKCByZHMgKSApOworCQlOWF9GSUxMXzIgKCAmcmRzLCAwLAorCQkJICAgIGhhbmRsZSwgaGFuZGxlLAorCQkJICAgIGxlbmd0aCwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkJTlhfRklMTF8xICggJnJkcywgMSwKKwkJCSAgICBkbWFfYWRkciwgdmlydF90b19idXMgKCBpb2J1Zi0+ZGF0YSApICk7CisKKwkJLyogUmVjb3JkIEkvTyBidWZmZXIgKi8KKwkJYXNzZXJ0ICggcGhhbnRvbS0+cmRzX2lvYnVmW2hhbmRsZV0gPT0gTlVMTCApOworCQlwaGFudG9tLT5yZHNfaW9idWZbaGFuZGxlXSA9IGlvYnVmOworCisJCS8qIFBvc3QgZGVzY3JpcHRvciAqLworCQlwaGFudG9tX3Bvc3RfcmRzICggcGhhbnRvbSwgJnJkcyApOworCX0KK30KKworLyoqCisgKiBPcGVuIE5JQworICoKKyAqIEB2IG5ldGRldgkJTmV0IGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcGhhbnRvbV9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIGFuZCB6ZXJvIGRlc2NyaXB0b3IgcmluZ3MgKi8KKwlwaGFudG9tLT5kZXNjID0gbWFsbG9jX2RtYSAoIHNpemVvZiAoICoocGhhbnRvbS0+ZGVzYykgKSwKKwkJCQkJICBVTk1fRE1BX0JVRkZFUl9BTElHTiApOworCWlmICggISBwaGFudG9tLT5kZXNjICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2Rlc2M7CisJfQorCW1lbXNldCAoIHBoYW50b20tPmRlc2MsIDAsIHNpemVvZiAoICoocGhhbnRvbS0+ZGVzYykgKSApOworCisJLyogQ3JlYXRlIFJYIGNvbnRleHQgKi8KKwlpZiAoICggcmMgPSBwaGFudG9tX2NyZWF0ZV9yeF9jdHggKCBwaGFudG9tICkgKSAhPSAwICkKKwkJZ290byBlcnJfY3JlYXRlX3J4X2N0eDsKKworCS8qIENyZWF0ZSBUWCBjb250ZXh0ICovCisJaWYgKCAoIHJjID0gcGhhbnRvbV9jcmVhdGVfdHhfY3R4ICggcGhhbnRvbSApICkgIT0gMCApCisJCWdvdG8gZXJyX2NyZWF0ZV90eF9jdHg7CisKKwkvKiBGaWxsIHRoZSBSWCBkZXNjcmlwdG9yIHJpbmcgKi8KKwlwaGFudG9tX3JlZmlsbF9yeF9yaW5nICggbmV0ZGV2ICk7CisKKwkvKiBBZGQgTUFDIGFkZHJlc3NlcworCSAqCisJICogQlVHNTU4MworCSAqCisJICogV2Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIGVuYWJsZSByZWNlaXZpbmcgYWxsIG11bHRpY2FzdAorCSAqIHBhY2tldHMgKG9yLCBmYWlsaW5nIHRoYXQsIHByb21pc2N1b3VzIG1vZGUpLCBidXQgdGhlCisJICogZmlybXdhcmUgZG9lc24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGlzLgorCSAqLworCWlmICggKCByYyA9IHBoYW50b21fYWRkX21hY2FkZHIgKCBwaGFudG9tLAorCQkJCQkgIG5ldGRldi0+bGxfYnJvYWRjYXN0ICkgKSAhPSAwICkKKwkJZ290byBlcnJfYWRkX21hY2FkZHJfYnJvYWRjYXN0OworCWlmICggKCByYyA9IHBoYW50b21fYWRkX21hY2FkZHIgKCBwaGFudG9tLAorCQkJCQkgIG5ldGRldi0+bGxfYWRkciApICkgIT0gMCApCisJCWdvdG8gZXJyX2FkZF9tYWNhZGRyX3VuaWNhc3Q7CisKKwlyZXR1cm4gMDsKKworCXBoYW50b21fZGVsX21hY2FkZHIgKCBwaGFudG9tLCBuZXRkZXYtPmxsX2FkZHIgKTsKKyBlcnJfYWRkX21hY2FkZHJfdW5pY2FzdDoKKwlwaGFudG9tX2RlbF9tYWNhZGRyICggcGhhbnRvbSwgbmV0ZGV2LT5sbF9icm9hZGNhc3QgKTsKKyBlcnJfYWRkX21hY2FkZHJfYnJvYWRjYXN0OgorCXBoYW50b21fZGVzdHJveV90eF9jdHggKCBwaGFudG9tICk7CisgZXJyX2NyZWF0ZV90eF9jdHg6CisJcGhhbnRvbV9kZXN0cm95X3J4X2N0eCAoIHBoYW50b20gKTsKKyBlcnJfY3JlYXRlX3J4X2N0eDoKKwlmcmVlX2RtYSAoIHBoYW50b20tPmRlc2MsIHNpemVvZiAoICoocGhhbnRvbS0+ZGVzYykgKSApOworCXBoYW50b20tPmRlc2MgPSBOVUxMOworIGVycl9hbGxvY19kZXNjOgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBDbG9zZSBOSUMKKyAqCisgKiBAdiBuZXRkZXYJCU5ldCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgcGhhbnRvbV9jbG9zZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFNodXQgZG93biB0aGUgcG9ydCAqLworCXBoYW50b21fZGVsX21hY2FkZHIgKCBwaGFudG9tLCBuZXRkZXYtPmxsX2FkZHIgKTsKKwlwaGFudG9tX2RlbF9tYWNhZGRyICggcGhhbnRvbSwgbmV0ZGV2LT5sbF9icm9hZGNhc3QgKTsKKwlwaGFudG9tX2Rlc3Ryb3lfdHhfY3R4ICggcGhhbnRvbSApOworCXBoYW50b21fZGVzdHJveV9yeF9jdHggKCBwaGFudG9tICk7CisJZnJlZV9kbWEgKCBwaGFudG9tLT5kZXNjLCBzaXplb2YgKCAqKHBoYW50b20tPmRlc2MpICkgKTsKKwlwaGFudG9tLT5kZXNjID0gTlVMTDsKKworCS8qIEZsdXNoIGFueSB1bmNvbXBsZXRlZCBkZXNjcmlwdG9ycyAqLworCWZvciAoIGkgPSAwIDsgaSA8IFBITl9SRFNfTUFYX0ZJTEwgOyBpKysgKSB7CisJCWlvYnVmID0gcGhhbnRvbS0+cmRzX2lvYnVmW2ldOworCQlpZiAoIGlvYnVmICkgeworCQkJZnJlZV9pb2IgKCBpb2J1ZiApOworCQkJcGhhbnRvbS0+cmRzX2lvYnVmW2ldID0gTlVMTDsKKwkJfQorCX0KKwlmb3IgKCBpID0gMCA7IGkgPCBQSE5fTlVNX0NEUyA7IGkrKyApIHsKKwkJaW9idWYgPSBwaGFudG9tLT5jZHNfaW9idWZbaV07CisJCWlmICggaW9idWYgKSB7CisJCQluZXRkZXZfdHhfY29tcGxldGVfZXJyICggbmV0ZGV2LCBpb2J1ZiwgLUVDQU5DRUxFRCApOworCQkJcGhhbnRvbS0+Y2RzX2lvYnVmW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqIAorICogVHJhbnNtaXQgcGFja2V0CisgKgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHBoYW50b21fdHJhbnNtaXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKSB7CisJc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKwl1bmlvbiBwaGFudG9tX2NkcyBjZHM7CisJaW50IGluZGV4OworCisJLyogR2V0IGRlc2NyaXB0b3IgcmluZyBlbnRyeSAqLworCWluZGV4ID0gcGhhbnRvbV9hbGxvY19jZHMgKCBwaGFudG9tICk7CisJaWYgKCBpbmRleCA8IDAgKQorCQlyZXR1cm4gaW5kZXg7CisKKwkvKiBGaWxsIGRlc2NyaXB0b3IgcmluZyBlbnRyeSAqLworCW1lbXNldCAoICZjZHMsIDAsIHNpemVvZiAoIGNkcyApICk7CisJTlhfRklMTF8zICggJmNkcywgMCwKKwkJICAgIHR4Lm9wY29kZSwgVU5NX1RYX0VUSEVSX1BLVCwKKwkJICAgIHR4Lm51bV9idWZmZXJzLCAxLAorCQkgICAgdHgubGVuZ3RoLCBpb2JfbGVuICggaW9idWYgKSApOworCU5YX0ZJTExfMiAoICZjZHMsIDIsCisJCSAgICB0eC5wb3J0LCBwaGFudG9tLT5wb3J0LAorCQkgICAgdHguY29udGV4dF9pZCwgcGhhbnRvbS0+cG9ydCApOworCU5YX0ZJTExfMSAoICZjZHMsIDQsCisJCSAgICB0eC5idWZmZXIxX2RtYV9hZGRyLCB2aXJ0X3RvX2J1cyAoIGlvYnVmLT5kYXRhICkgKTsKKwlOWF9GSUxMXzEgKCAmY2RzLCA1LAorCQkgICAgdHguYnVmZmVyMV9sZW5ndGgsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisKKwkvKiBSZWNvcmQgSS9PIGJ1ZmZlciAqLworCWFzc2VydCAoIHBoYW50b20tPmNkc19pb2J1ZltpbmRleF0gPT0gTlVMTCApOworCXBoYW50b20tPmNkc19pb2J1ZltpbmRleF0gPSBpb2J1ZjsKKworCS8qIFBvc3QgZGVzY3JpcHRvciAqLworCXBoYW50b21fcG9zdF9jZHMgKCBwaGFudG9tLCAmY2RzICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQb2xsIGZvciByZWNlaXZlZCBwYWNrZXRzCisgKgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHBoYW50b21fcG9sbCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwl1bnNpZ25lZCBpbnQgY2RzX2NvbnN1bWVyX2lkeDsKKwl1bnNpZ25lZCBpbnQgcmF3X25ld19jZHNfY29uc3VtZXJfaWR4OworCXVuc2lnbmVkIGludCBuZXdfY2RzX2NvbnN1bWVyX2lkeDsKKwl1bnNpZ25lZCBpbnQgcmRzX2NvbnN1bWVyX2lkeDsKKwl1bnNpZ25lZCBpbnQgc2RzX2NvbnN1bWVyX2lkeDsKKwlzdHJ1Y3QgcGhhbnRvbV9zZHMgKnNkczsKKwl1bnNpZ25lZCBpbnQgc2RzX2hhbmRsZTsKKwl1bnNpZ25lZCBpbnQgc2RzX29wY29kZTsKKworCS8qIENoZWNrIGZvciBUWCBjb21wbGV0aW9ucyAqLworCWNkc19jb25zdW1lcl9pZHggPSBwaGFudG9tLT5jZHNfY29uc3VtZXJfaWR4OworCXJhd19uZXdfY2RzX2NvbnN1bWVyX2lkeCA9IHBoYW50b20tPmRlc2MtPmNtZF9jb25zOworCW5ld19jZHNfY29uc3VtZXJfaWR4ID0gbGUzMl90b19jcHUgKCByYXdfbmV3X2Nkc19jb25zdW1lcl9pZHggKTsKKwl3aGlsZSAoIGNkc19jb25zdW1lcl9pZHggIT0gbmV3X2Nkc19jb25zdW1lcl9pZHggKSB7CisJCURCR0MyICggcGhhbnRvbSwgIlBoYW50b20gJXAgQ0RTICVkIGNvbXBsZXRlXG4iLAorCQkJcGhhbnRvbSwgY2RzX2NvbnN1bWVyX2lkeCApOworCQkvKiBDb21wbGV0aW9ucyBtYXkgYmUgZm9yIGNvbW1hbmRzIG90aGVyIHRoYW4gVFgsIHNvCisJCSAqIHRoZXJlIG1heSBub3QgYWx3YXlzIGJlIGFuIGFzc29jaWF0ZWQgSS9PIGJ1ZmZlci4KKwkJICovCisJCWlmICggKCBpb2J1ZiA9IHBoYW50b20tPmNkc19pb2J1ZltjZHNfY29uc3VtZXJfaWR4XSApICkgeworCQkJbmV0ZGV2X3R4X2NvbXBsZXRlICggbmV0ZGV2LCBpb2J1ZiApOworCQkJcGhhbnRvbS0+Y2RzX2lvYnVmW2Nkc19jb25zdW1lcl9pZHhdID0gTlVMTDsKKwkJfQorCQljZHNfY29uc3VtZXJfaWR4ID0gKCAoIGNkc19jb25zdW1lcl9pZHggKyAxICkgJSBQSE5fTlVNX0NEUyApOworCQlwaGFudG9tLT5jZHNfY29uc3VtZXJfaWR4ID0gY2RzX2NvbnN1bWVyX2lkeDsKKwl9CisKKwkvKiBDaGVjayBmb3IgcmVjZWl2ZWQgcGFja2V0cyAqLworCXJkc19jb25zdW1lcl9pZHggPSBwaGFudG9tLT5yZHNfY29uc3VtZXJfaWR4OworCXNkc19jb25zdW1lcl9pZHggPSBwaGFudG9tLT5zZHNfY29uc3VtZXJfaWR4OworCXdoaWxlICggMSApIHsKKwkJc2RzID0gJnBoYW50b20tPmRlc2MtPnNkc1tzZHNfY29uc3VtZXJfaWR4XTsKKwkJaWYgKCBOWF9HRVQgKCBzZHMsIG93bmVyICkgPT0gMCApCisJCQlicmVhazsKKworCQlEQkdDMiAoIHBoYW50b20sICJQaGFudG9tICVwIFNEUyAlZCBzdGF0dXM6XG4iLAorCQkJcGhhbnRvbSwgc2RzX2NvbnN1bWVyX2lkeCApOworCQlEQkdDMl9IREEgKCBwaGFudG9tLCB2aXJ0X3RvX2J1cyAoIHNkcyApLCBzZHMsIHNpemVvZiAoKnNkcykgKTsKKworCQkvKiBDaGVjayByZWNlaXZlZCBvcGNvZGUgKi8KKwkJc2RzX29wY29kZSA9IE5YX0dFVCAoIHNkcywgb3Bjb2RlICk7CisJCWlmICggKCBzZHNfb3Bjb2RlID09IFVOTV9SWFBLVF9ERVNDICkgfHwKKwkJICAgICAoIHNkc19vcGNvZGUgPT0gVU5NX1NZTl9PRkZMT0FEICkgKSB7CisKKwkJCS8qIFNhbml0eSBjaGVjazogZW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBTRFMKKwkJCSAqIGRlc2NyaXB0b3IgaGFzIGJlZW4gd3JpdHRlbi4KKwkJCSAqLworCQkJaWYgKCBOWF9HRVQgKCBzZHMsIHRvdGFsX2xlbmd0aCApID09IDAgKSB7CisJCQkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIFNEUyAlZCAiCisJCQkJICAgICAgICJpbmNvbXBsZXRlOyBkZWZlcnJpbmdcbiIsCisJCQkJICAgICAgIHBoYW50b20sIHNkc19jb25zdW1lcl9pZHggKTsKKwkJCQkvKiBMZWF2ZSBmb3IgbmV4dCBwb2xsKCkgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogUHJvY2VzcyByZWNlaXZlZCBwYWNrZXQgKi8KKwkJCXNkc19oYW5kbGUgPSBOWF9HRVQgKCBzZHMsIGhhbmRsZSApOworCQkJaW9idWYgPSBwaGFudG9tLT5yZHNfaW9idWZbc2RzX2hhbmRsZV07CisJCQlhc3NlcnQgKCBpb2J1ZiAhPSBOVUxMICk7CisJCQlpb2JfcHV0ICggaW9idWYsIE5YX0dFVCAoIHNkcywgdG90YWxfbGVuZ3RoICkgKTsKKwkJCWlvYl9wdWxsICggaW9idWYsIE5YX0dFVCAoIHNkcywgcGt0X29mZnNldCApICk7CisJCQlEQkdDMiAoIHBoYW50b20sICJQaGFudG9tICVwIFJEUyAlZCBjb21wbGV0ZVxuIiwKKwkJCQlwaGFudG9tLCBzZHNfaGFuZGxlICk7CisJCQluZXRkZXZfcnggKCBuZXRkZXYsIGlvYnVmICk7CisJCQlwaGFudG9tLT5yZHNfaW9idWZbc2RzX2hhbmRsZV0gPSBOVUxMOworCisJCQkvKiBVcGRhdGUgUkRTIGNvbnN1bWVyIGNvdW50ZXIuICBUaGlzIGlzIGEKKwkJCSAqIGxvd2VyIGJvdW5kIGZvciB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzCisJCQkgKiB0aGF0IGhhdmUgYmVlbiByZWFkIGJ5IHRoZSBoYXJkd2FyZSwgc2luY2UKKwkJCSAqIHRoZSBoYXJkd2FyZSBtdXN0IGhhdmUgcmVhZCBhdCBsZWFzdCBvbmUKKwkJCSAqIGRlc2NyaXB0b3IgZm9yIGVhY2ggY29tcGxldGlvbiB0aGF0IHdlCisJCQkgKiByZWNlaXZlLgorCQkJICovCisJCQlyZHNfY29uc3VtZXJfaWR4ID0KKwkJCQkoICggcmRzX2NvbnN1bWVyX2lkeCArIDEgKSAlIFBITl9OVU1fUkRTICk7CisJCQlwaGFudG9tLT5yZHNfY29uc3VtZXJfaWR4ID0gcmRzX2NvbnN1bWVyX2lkeDsKKworCQl9IGVsc2UgeworCisJCQlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgdW5leHBlY3RlZCBTRFMgb3Bjb2RlICIKKwkJCSAgICAgICAiJTAyeFxuIiwgcGhhbnRvbSwgc2RzX29wY29kZSApOworCQkJREJHQ19IREEgKCBwaGFudG9tLCB2aXJ0X3RvX2J1cyAoIHNkcyApLAorCQkJCSAgIHNkcywgc2l6ZW9mICggKnNkcyApICk7CisJCX0KKwkJCQorCQkvKiBDbGVhciBzdGF0dXMgZGVzY3JpcHRvciAqLworCQltZW1zZXQgKCBzZHMsIDAsIHNpemVvZiAoICpzZHMgKSApOworCisJCS8qIFVwZGF0ZSBTRFMgY29uc3VtZXIgaW5kZXggKi8KKwkJc2RzX2NvbnN1bWVyX2lkeCA9ICggKCBzZHNfY29uc3VtZXJfaWR4ICsgMSApICUgUEhOX05VTV9TRFMgKTsKKwkJcGhhbnRvbS0+c2RzX2NvbnN1bWVyX2lkeCA9IHNkc19jb25zdW1lcl9pZHg7CisJCXdtYigpOworCQlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIHBoYW50b20tPnNkc19jb25zdW1lcl9pZHgsCisJCQkJIHBoYW50b20tPnNkc19jb25zdW1lcl9jcmIgKTsKKwl9CisKKwkvKiBSZWZpbGwgdGhlIFJYIGRlc2NyaXB0b3IgcmluZyAqLworCXBoYW50b21fcmVmaWxsX3J4X3JpbmcgKCBuZXRkZXYgKTsKKworCS8qIE9jY2FzaW9uYWxseSBwb2xsIHRoZSBsaW5rIHN0YXRlICovCisJaWYgKCBwaGFudG9tLT5saW5rX3BvbGxfdGltZXItLSA9PSAwICkgeworCQlwaGFudG9tX3BvbGxfbGlua19zdGF0ZSAoIG5ldGRldiApOworCQkvKiBSZXNldCB0aGUgbGluayBwb2xsIHRpbWVyICovCisJCXBoYW50b20tPmxpbmtfcG9sbF90aW1lciA9IFBITl9MSU5LX1BPTExfRlJFUVVFTkNZOworCX0KK30KKworLyoqCisgKiBFbmFibGUvZGlzYWJsZSBpbnRlcnJ1cHRzCisgKgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKiBAdiBlbmFibGUJSW50ZXJydXB0cyBzaG91bGQgYmUgZW5hYmxlZAorICovCitzdGF0aWMgdm9pZCBwaGFudG9tX2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBlbmFibGUgKSB7CisJc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBzd19pbnRfbWFza19yZWdbUEhOX01BWF9OVU1fUE9SVFNdID0geworCQlVTk1fTklDX1JFR19TV19JTlRfTUFTS18wLAorCQlVTk1fTklDX1JFR19TV19JTlRfTUFTS18xLAorCQlVTk1fTklDX1JFR19TV19JTlRfTUFTS18yLAorCQlVTk1fTklDX1JFR19TV19JTlRfTUFTS18zCisJfTsKKworCXBoYW50b21fd3JpdGVsICggcGhhbnRvbSwKKwkJCSAoIGVuYWJsZSA/IDEgOiAwICksCisJCQkgc3dfaW50X21hc2tfcmVnW3BoYW50b20tPnBvcnRdICk7Cit9CisKKy8qKiBQaGFudG9tIG5ldCBkZXZpY2Ugb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgcGhhbnRvbV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHBoYW50b21fb3BlbiwKKwkuY2xvc2UJCT0gcGhhbnRvbV9jbG9zZSwKKwkudHJhbnNtaXQJPSBwaGFudG9tX3RyYW5zbWl0LAorCS5wb2xsCQk9IHBoYW50b21fcG9sbCwKKwkuaXJxCQk9IHBoYW50b21faXJxLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENMUCBzZXR0aW5ncworICoKKyAqLworCisvKiogUGhhbnRvbSBDTFAgc2V0dGluZ3MgdGFnIG1hZ2ljICovCisjZGVmaW5lIFBITl9DTFBfVEFHX01BR0lDIDB4YzE5YzE5MDBVTAorCisvKiogUGhhbnRvbSBDTFAgc2V0dGluZ3MgdGFnIG1hZ2ljIG1hc2sgKi8KKyNkZWZpbmUgUEhOX0NMUF9UQUdfTUFHSUNfTUFTSyAweGZmZmZmZjAwVUwKKworLyoqIFBoYW50b20gQ0xQIGRhdGEKKyAqCisgKi8KK3VuaW9uIHBoYW50b21fY2xwX2RhdGEgeworCS8qKiBEYXRhIGJ5dGVzCisJICoKKwkgKiBUaGlzIGZpZWxkIGlzIHJpZ2h0LWFsaWduZWQ7IGlmIG9ubHkgTiBieXRlcyBhcmUgcHJlc2VudAorCSAqIHRoZW4gYnl0ZXNbMF0uLmJ5dGVzWzctTl0gc2hvdWxkIGJlIHplcm8sIGFuZCB0aGUgZGF0YQorCSAqIHNob3VsZCBiZSBpbiBieXRlc1s3LU4rMV0gdG8gYnl0ZXNbN107CisJICovCisJdWludDhfdCBieXRlc1s4XTsKKwkvKiogRHdvcmRzIGZvciB0aGUgQ0xQIGludGVyZmFjZSAqLworCXN0cnVjdCB7CisJCS8qKiBIaWdoIGR3b3JkLCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwkJdWludDMyX3QgaGk7CisJCS8qKiBMb3cgZHdvcmQsIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCQl1aW50MzJfdCBsbzsKKwl9IGR3b3JkczsKK307CisjZGVmaW5lIFBITl9DTFBfQkxLU0laRSAoIHNpemVvZiAoIHVuaW9uIHBoYW50b21fY2xwX2RhdGEgKSApCisKKy8qKgorICogV2FpdCBmb3IgUGhhbnRvbSBDTFAgY29tbWFuZCB0byBjb21wbGV0ZQorICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBwaGFudG9tX2NscF93YWl0ICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tICkgeworCXVuc2lnbmVkIGludCByZXRyaWVzOworCXVpbnQzMl90IHN0YXR1czsKKworCWZvciAoIHJldHJpZXMgPSAwIDsgcmV0cmllcyA8IFBITl9DTFBfQ01EX1RJTUVPVVRfTVMgOyByZXRyaWVzKysgKSB7CisJCXN0YXR1cyA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fQ0FNX1JBTV9DTFBfU1RBVFVTICk7CisJCWlmICggc3RhdHVzICYgVU5NX0NBTV9SQU1fQ0xQX1NUQVRVU19ET05FICkKKwkJCXJldHVybiAwOworCQltZGVsYXkgKCAxICk7CisJfQorCisJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIHRpbWVkIG91dCB3YWl0aW5nIGZvciBDTFAgY29tbWFuZFxuIiwKKwkgICAgICAgcGhhbnRvbSApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCisvKioKKyAqIElzc3VlIFBoYW50b20gQ0xQIGNvbW1hbmQKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHYgcG9ydAkJVmlydHVhbCBwb3J0IG51bWJlcgorICogQHYgb3Bjb2RlCQlPcGNvZGUKKyAqIEB2IGRhdGFfaW4JCURhdGEgaW4sIG9yIE5VTEwKKyAqIEB2IGRhdGFfb3V0CQlEYXRhIG91dCwgb3IgTlVMTAorICogQHYgb2Zmc2V0CQlPZmZzZXQgd2l0aGluIGRhdGEKKyAqIEB2IGxlbgkJRGF0YSBidWZmZXIgbGVuZ3RoCisgKiBAcmV0IGxlbgkJVG90YWwgdHJhbnNmZXIgbGVuZ3RoIChmb3IgcmVhZHMpLCBvciBuZWdhdGl2ZSBlcnJvcgorICovCitzdGF0aWMgaW50IHBoYW50b21fY2xwX2NtZCAoIHN0cnVjdCBwaGFudG9tX25pYyAqcGhhbnRvbSwgdW5zaWduZWQgaW50IHBvcnQsCisJCQkgICAgIHVuc2lnbmVkIGludCBvcGNvZGUsIGNvbnN0IHZvaWQgKmRhdGFfaW4sCisJCQkgICAgIHZvaWQgKmRhdGFfb3V0LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuICkgeworCXVuaW9uIHBoYW50b21fY2xwX2RhdGEgZGF0YTsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSAoIG9mZnNldCAvIHNpemVvZiAoIGRhdGEgKSApOworCXVuc2lnbmVkIGludCBsYXN0ID0gMDsKKwlzaXplX3QgaW5fZnJhZ19sZW47CisJdWludDhfdCAqaW5fZnJhZzsKKwl1aW50MzJfdCBjb21tYW5kOworCXVpbnQzMl90IHN0YXR1czsKKwlzaXplX3QgcmVhZF9sZW47CisJdW5zaWduZWQgaW50IGVycm9yOworCXNpemVfdCBvdXRfZnJhZ19sZW47CisJdWludDhfdCAqb3V0X2ZyYWc7CisJaW50IHJjOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWFzc2VydCAoICggb2Zmc2V0ICUgc2l6ZW9mICggZGF0YSApICkgPT0gMCApOworCWlmICggbGVuID4gMjU1ICkgeworCQlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgaW52YWxpZCBDTFAgbGVuZ3RoICV6ZFxuIiwKKwkJICAgICAgIHBoYW50b20sIGxlbiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayB0aGF0IENMUCBpbnRlcmZhY2UgaXMgcmVhZHkgKi8KKwlpZiAoICggcmMgPSBwaGFudG9tX2NscF93YWl0ICggcGhhbnRvbSApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIENvcHkgZGF0YSBpbiAqLworCW1lbXNldCAoICZkYXRhLCAwLCBzaXplb2YgKCBkYXRhICkgKTsKKwlpZiAoIGRhdGFfaW4gKSB7CisJCWFzc2VydCAoIG9mZnNldCA8IGxlbiApOworCQlpbl9mcmFnX2xlbiA9ICggbGVuIC0gb2Zmc2V0ICk7CisJCWlmICggaW5fZnJhZ19sZW4gPiBzaXplb2YgKCBkYXRhICkgKSB7CisJCQlpbl9mcmFnX2xlbiA9IHNpemVvZiAoIGRhdGEgKTsKKwkJfSBlbHNlIHsKKwkJCWxhc3QgPSAxOworCQl9CisJCWluX2ZyYWcgPSAmZGF0YS5ieXRlc1sgc2l6ZW9mICggZGF0YSApIC0gaW5fZnJhZ19sZW4gXTsKKwkJbWVtY3B5ICggaW5fZnJhZywgKCBkYXRhX2luICsgb2Zmc2V0ICksIGluX2ZyYWdfbGVuICk7CisJCXBoYW50b21fd3JpdGVsICggcGhhbnRvbSwgYmUzMl90b19jcHUgKCBkYXRhLmR3b3Jkcy5sbyApLAorCQkJCSBVTk1fQ0FNX1JBTV9DTFBfREFUQV9MTyApOworCQlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIGJlMzJfdG9fY3B1ICggZGF0YS5kd29yZHMuaGkgKSwKKwkJCQkgVU5NX0NBTV9SQU1fQ0xQX0RBVEFfSEkgKTsKKwl9CisKKwkvKiBJc3N1ZSBDTFAgY29tbWFuZCAqLworCWNvbW1hbmQgPSAoICggaW5kZXggPDwgMjQgKSB8ICggKCBkYXRhX2luID8gbGVuIDogMCApIDw8IDE2ICkgfAorCQkgICAgKCBwb3J0IDw8IDggKSB8ICggbGFzdCA8PCA3ICkgfCAoIG9wY29kZSA8PCAwICkgKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIGNvbW1hbmQsIFVOTV9DQU1fUkFNX0NMUF9DT01NQU5EICk7CisJbWIoKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIFVOTV9DQU1fUkFNX0NMUF9TVEFUVVNfU1RBUlQsCisJCQkgVU5NX0NBTV9SQU1fQ0xQX1NUQVRVUyApOworCisJLyogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCWlmICggKCByYyA9IHBoYW50b21fY2xwX3dhaXQgKCBwaGFudG9tICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogR2V0IGNvbW1hbmQgc3RhdHVzICovCisJc3RhdHVzID0gcGhhbnRvbV9yZWFkbCAoIHBoYW50b20sIFVOTV9DQU1fUkFNX0NMUF9TVEFUVVMgKTsKKwlyZWFkX2xlbiA9ICggKCBzdGF0dXMgPj4gMTYgKSAmIDB4ZmYgKTsKKwllcnJvciA9ICggKCBzdGF0dXMgPj4gOCApICYgMHhmZiApOworCWlmICggZXJyb3IgKSB7CisJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBDTFAgY29tbWFuZCBlcnJvciAlMDJ4XG4iLAorCQkgICAgICAgcGhhbnRvbSwgZXJyb3IgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQ29weSBkYXRhIG91dCAqLworCWlmICggZGF0YV9vdXQgKSB7CisJCWRhdGEuZHdvcmRzLmxvID0gY3B1X3RvX2JlMzIgKCBwaGFudG9tX3JlYWRsICggcGhhbnRvbSwKKwkJCQkJCSAgVU5NX0NBTV9SQU1fQ0xQX0RBVEFfTE8gKSApOworCQlkYXRhLmR3b3Jkcy5oaSA9IGNwdV90b19iZTMyICggcGhhbnRvbV9yZWFkbCAoIHBoYW50b20sCisJCQkJCQkgIFVOTV9DQU1fUkFNX0NMUF9EQVRBX0hJICkgKTsKKwkJb3V0X2ZyYWdfbGVuID0gKCByZWFkX2xlbiAtIG9mZnNldCApOworCQlpZiAoIG91dF9mcmFnX2xlbiA+IHNpemVvZiAoIGRhdGEgKSApCisJCQlvdXRfZnJhZ19sZW4gPSBzaXplb2YgKCBkYXRhICk7CisJCW91dF9mcmFnID0gJmRhdGEuYnl0ZXNbIHNpemVvZiAoIGRhdGEgKSAtIG91dF9mcmFnX2xlbiBdOworCQlpZiAoIG91dF9mcmFnX2xlbiA+ICggbGVuIC0gb2Zmc2V0ICkgKQorCQkJb3V0X2ZyYWdfbGVuID0gKCBsZW4gLSBvZmZzZXQgKTsKKwkJbWVtY3B5ICggKCBkYXRhX291dCArIG9mZnNldCApLCBvdXRfZnJhZywgb3V0X2ZyYWdfbGVuICk7CisJfQorCisJcmV0dXJuIHJlYWRfbGVuOworfQorCisvKioKKyAqIFN0b3JlIFBoYW50b20gQ0xQIHNldHRpbmcKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHYgcG9ydAkJVmlydHVhbCBwb3J0IG51bWJlcgorICogQHYgc2V0dGluZwkJU2V0dGluZyBudW1iZXIKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcGhhbnRvbV9jbHBfc3RvcmUgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20sIHVuc2lnbmVkIGludCBwb3J0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBzZXR0aW5nLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBsZW4gKSB7CisJdW5zaWduZWQgaW50IG9wY29kZSA9IHNldHRpbmc7CisJc2l6ZV90IG9mZnNldDsKKwlpbnQgcmM7CisKKwlmb3IgKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbGVuIDsgb2Zmc2V0ICs9IFBITl9DTFBfQkxLU0laRSApIHsKKwkJaWYgKCAoIHJjID0gcGhhbnRvbV9jbHBfY21kICggcGhhbnRvbSwgcG9ydCwgb3Bjb2RlLCBkYXRhLAorCQkJCQkgICAgICBOVUxMLCBvZmZzZXQsIGxlbiApICkgPCAwICkKKwkJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmV0Y2ggUGhhbnRvbSBDTFAgc2V0dGluZworICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAdiBwb3J0CQlWaXJ0dWFsIHBvcnQgbnVtYmVyCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIG51bWJlcgorICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgcGhhbnRvbV9jbHBfZmV0Y2ggKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20sIHVuc2lnbmVkIGludCBwb3J0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBzZXR0aW5nLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXVuc2lnbmVkIGludCBvcGNvZGUgPSAoIHNldHRpbmcgKyAxICk7CisJc2l6ZV90IG9mZnNldCA9IDA7CisJaW50IHJlYWRfbGVuOworCisJd2hpbGUgKCAxICkgeworCQlyZWFkX2xlbiA9IHBoYW50b21fY2xwX2NtZCAoIHBoYW50b20sIHBvcnQsIG9wY29kZSwgTlVMTCwKKwkJCQkJICAgICBkYXRhLCBvZmZzZXQsIGxlbiApOworCQlpZiAoIHJlYWRfbGVuIDwgMCApCisJCQlyZXR1cm4gcmVhZF9sZW47CisJCW9mZnNldCArPSBQSE5fQ0xQX0JMS1NJWkU7CisJCWlmICggb2Zmc2V0ID49ICggdW5zaWduZWQgKSByZWFkX2xlbiApCisJCQlicmVhazsKKwkJaWYgKCBvZmZzZXQgPj0gbGVuICkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVhZF9sZW47Cit9CisKKy8qKiBBIFBoYW50b20gQ0xQIHNldHRpbmcgKi8KK3N0cnVjdCBwaGFudG9tX2NscF9zZXR0aW5nIHsKKwkvKiogZ1BYRSBzZXR0aW5nICovCisJc3RydWN0IHNldHRpbmcgKnNldHRpbmc7CisJLyoqIFNldHRpbmcgbnVtYmVyICovCisJdW5zaWduZWQgaW50IGNscF9zZXR0aW5nOworfTsKKworLyoqIFBoYW50b20gQ0xQIHNldHRpbmdzICovCitzdGF0aWMgc3RydWN0IHBoYW50b21fY2xwX3NldHRpbmcgY2xwX3NldHRpbmdzW10gPSB7CisJeyAmbWFjX3NldHRpbmcsIDB4MDEgfSwKK307CisKKy8qKgorICogRmluZCBQaGFudG9tIENMUCBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZwkJZ1BYRSBzZXR0aW5nCisgKiBAdiBjbHBfc2V0dGluZwlTZXR0aW5nIG51bWJlciwgb3IgMCBpZiBub3QgZm91bmQKKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorcGhhbnRvbV9jbHBfc2V0dGluZyAoIHN0cnVjdCBwaGFudG9tX25pYyAqcGhhbnRvbSwgc3RydWN0IHNldHRpbmcgKnNldHRpbmcgKSB7CisJc3RydWN0IHBoYW50b21fY2xwX3NldHRpbmcgKmNscF9zZXR0aW5nOworCXVuc2lnbmVkIGludCBpOworCisJLyogU2VhcmNoIHRoZSBsaXN0IG9mIGV4cGxpY2l0bHktZGVmaW5lZCBzZXR0aW5ncyAqLworCWZvciAoIGkgPSAwIDsgaSA8ICggc2l6ZW9mICggY2xwX3NldHRpbmdzICkgLworCQkJICAgIHNpemVvZiAoIGNscF9zZXR0aW5nc1swXSApICkgOyBpKysgKSB7CisJCWNscF9zZXR0aW5nID0gJmNscF9zZXR0aW5nc1tpXTsKKwkJaWYgKCBzZXR0aW5nX2NtcCAoIHNldHRpbmcsIGNscF9zZXR0aW5nLT5zZXR0aW5nICkgPT0gMCApCisJCQlyZXR1cm4gY2xwX3NldHRpbmctPmNscF9zZXR0aW5nOworCX0KKworCS8qIEFsbG93IGZvciB1c2Ugb2YgbnVtYmVyZWQgc2V0dGluZ3MgKi8KKwlpZiAoICggc2V0dGluZy0+dGFnICYgUEhOX0NMUF9UQUdfTUFHSUNfTUFTSyApID09IFBITl9DTFBfVEFHX01BR0lDICkKKwkJcmV0dXJuICggc2V0dGluZy0+dGFnICYgflBITl9DTFBfVEFHX01BR0lDX01BU0sgKTsKKworCURCR0MyICggcGhhbnRvbSwgIlBoYW50b20gJXAgaGFzIG5vIFwiJXNcIiBzZXR0aW5nXG4iLAorCQlwaGFudG9tLCBzZXR0aW5nLT5uYW1lICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTdG9yZSBQaGFudG9tIENMUCBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIHN0b3JlCisgKiBAdiBkYXRhCQlTZXR0aW5nIGRhdGEsIG9yIE5VTEwgdG8gY2xlYXIgc2V0dGluZworICogQHYgbGVuCQlMZW5ndGggb2Ygc2V0dGluZyBkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBwaGFudG9tX3N0b3JlX3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJCSAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tID0KKwkJY29udGFpbmVyX29mICggc2V0dGluZ3MsIHN0cnVjdCBwaGFudG9tX25pYywgc2V0dGluZ3MgKTsKKwl1bnNpZ25lZCBpbnQgY2xwX3NldHRpbmc7CisJaW50IHJjOworCisJLyogRmluZCBQaGFudG9tIHNldHRpbmcgZXF1aXZhbGVudCB0byBnUFhFIHNldHRpbmcgKi8KKwljbHBfc2V0dGluZyA9IHBoYW50b21fY2xwX3NldHRpbmcgKCBwaGFudG9tLCBzZXR0aW5nICk7CisJaWYgKCAhIGNscF9zZXR0aW5nICkKKwkJcmV0dXJuIC1FTk9UU1VQOworCisJLyogU3RvcmUgc2V0dGluZyAqLworCWlmICggKCByYyA9IHBoYW50b21fY2xwX3N0b3JlICggcGhhbnRvbSwgcGhhbnRvbS0+cG9ydCwKKwkJCQkJY2xwX3NldHRpbmcsIGRhdGEsIGxlbiApICkgIT0gMCApIHsKKwkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGNvdWxkIG5vdCBzdG9yZSBzZXR0aW5nIFwiJXNcIjogIgorCQkgICAgICAgIiVzXG4iLCBwaGFudG9tLCBzZXR0aW5nLT5uYW1lLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEZldGNoIFBoYW50b20gQ0xQIHNldHRpbmcKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2sKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gZmV0Y2gKKyAqIEB2IGRhdGEJCUJ1ZmZlciB0byBmaWxsIHdpdGggc2V0dGluZyBkYXRhCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBidWZmZXIKKyAqIEByZXQgbGVuCQlMZW5ndGggb2Ygc2V0dGluZyBkYXRhLCBvciBuZWdhdGl2ZSBlcnJvcgorICovCitzdGF0aWMgaW50IHBoYW50b21fZmV0Y2hfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJICAgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkJICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gPQorCQljb250YWluZXJfb2YgKCBzZXR0aW5ncywgc3RydWN0IHBoYW50b21fbmljLCBzZXR0aW5ncyApOworCXVuc2lnbmVkIGludCBjbHBfc2V0dGluZzsKKwlpbnQgcmVhZF9sZW47CisJaW50IHJjOworCisJLyogRmluZCBQaGFudG9tIHNldHRpbmcgZXF1aXZhbGVudCB0byBnUFhFIHNldHRpbmcgKi8KKwljbHBfc2V0dGluZyA9IHBoYW50b21fY2xwX3NldHRpbmcgKCBwaGFudG9tLCBzZXR0aW5nICk7CisJaWYgKCAhIGNscF9zZXR0aW5nICkKKwkJcmV0dXJuIC1FTk9UU1VQOworCisJLyogRmV0Y2ggc2V0dGluZyAqLworCWlmICggKCByZWFkX2xlbiA9IHBoYW50b21fY2xwX2ZldGNoICggcGhhbnRvbSwgcGhhbnRvbS0+cG9ydCwKKwkJCQkJICAgICAgY2xwX3NldHRpbmcsIGRhdGEsIGxlbiApICkgPCAwICl7CisJCXJjID0gcmVhZF9sZW47CisJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBjb3VsZCBub3QgZmV0Y2ggc2V0dGluZyBcIiVzXCI6ICIKKwkJICAgICAgICIlc1xuIiwgcGhhbnRvbSwgc2V0dGluZy0+bmFtZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gcmVhZF9sZW47Cit9CisKKy8qKiBQaGFudG9tIENMUCBzZXR0aW5ncyBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHNldHRpbmdzX29wZXJhdGlvbnMgcGhhbnRvbV9zZXR0aW5nc19vcGVyYXRpb25zID0geworCS5zdG9yZQkJPSBwaGFudG9tX3N0b3JlX3NldHRpbmcsCisJLmZldGNoCQk9IHBoYW50b21fZmV0Y2hfc2V0dGluZywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbml0aWFsaXNhdGlvbgorICoKKyAqLworCisvKioKKyAqIE1hcCBQaGFudG9tIENSQiB3aW5kb3cKKyAqCisgKiBAdiBwaGFudG9tCQlQaGFudG9tIE5JQworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcGhhbnRvbV9tYXBfY3JiICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tLAorCQkJICAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCXVuc2lnbmVkIGxvbmcgYmFyMF9zdGFydDsKKwl1bnNpZ25lZCBsb25nIGJhcjBfc2l6ZTsKKworCWJhcjBfc3RhcnQgPSBwY2lfYmFyX3N0YXJ0ICggcGNpLCBQQ0lfQkFTRV9BRERSRVNTXzAgKTsKKwliYXIwX3NpemUgPSBwY2lfYmFyX3NpemUgKCBwY2ksIFBDSV9CQVNFX0FERFJFU1NfMCApOworCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBpcyBQQ0kgJTAyeDolMDJ4LiV4IHdpdGggQkFSMCBhdCAiCisJICAgICAgICIlMDhseCslbHhcbiIsIHBoYW50b20sIHBjaS0+YnVzLCBQQ0lfU0xPVCAoIHBjaS0+ZGV2Zm4gKSwKKwkgICAgICAgUENJX0ZVTkMgKCBwY2ktPmRldmZuICksIGJhcjBfc3RhcnQsIGJhcjBfc2l6ZSApOworCisJaWYgKCAhIGJhcjBfc3RhcnQgKSB7CisJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBCQVIgbm90IGFzc2lnbmVkOyBpZ25vcmluZ1xuIiwKKwkJICAgICAgIHBoYW50b20gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICggYmFyMF9zaXplICkgeworCWNhc2UgKCAxMjggKiAxMDI0ICogMTAyNCApIDoKKwkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGhhcyAxMjhNQiBCQVJcbiIsIHBoYW50b20gKTsKKwkJcGhhbnRvbS0+Y3JiX2FjY2VzcyA9IHBoYW50b21fY3JiX2FjY2Vzc18xMjhtOworCQlicmVhazsKKwljYXNlICggMzIgKiAxMDI0ICogMTAyNCApIDoKKwkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGhhcyAzMk1CIEJBUlxuIiwgcGhhbnRvbSApOworCQlwaGFudG9tLT5jcmJfYWNjZXNzID0gcGhhbnRvbV9jcmJfYWNjZXNzXzMybTsKKwkJYnJlYWs7CisJY2FzZSAoIDIgKiAxMDI0ICogMTAyNCApIDoKKwkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGhhcyAyTUIgQkFSXG4iLCBwaGFudG9tICk7CisJCXBoYW50b20tPmNyYl9hY2Nlc3MgPSBwaGFudG9tX2NyYl9hY2Nlc3NfMm07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBoYXMgYmFkIEJBUiBzaXplXG4iLCBwaGFudG9tICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBoYW50b20tPmJhcjAgPSBpb3JlbWFwICggYmFyMF9zdGFydCwgYmFyMF9zaXplICk7CisJaWYgKCAhIHBoYW50b20tPmJhcjAgKSB7CisJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBjb3VsZCBub3QgbWFwIEJBUjBcbiIsIHBoYW50b20gKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogTWFyayBjdXJyZW50IENSQiB3aW5kb3cgYXMgaW52YWxpZCwgc28gdGhhdCB0aGUgZmlyc3QKKwkgKiByZWFkL3dyaXRlIHdpbGwgc2V0IHRoZSBjdXJyZW50IHdpbmRvdy4KKwkgKi8KKwlwaGFudG9tLT5jcmJfd2luZG93ID0gLTFVTDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFVuaGFsdCBhbGwgUEVHcworICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKi8KK3N0YXRpYyB2b2lkIHBoYW50b21fdW5oYWx0X3BlZ3MgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gKSB7CisJdWludDMyX3QgaGFsdF9zdGF0dXM7CisKKwloYWx0X3N0YXR1cyA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fUEVHXzBfSEFMVF9TVEFUVVMgKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIGhhbHRfc3RhdHVzLCBVTk1fUEVHXzBfSEFMVF9TVEFUVVMgKTsKKwloYWx0X3N0YXR1cyA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fUEVHXzFfSEFMVF9TVEFUVVMgKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIGhhbHRfc3RhdHVzLCBVTk1fUEVHXzFfSEFMVF9TVEFUVVMgKTsKKwloYWx0X3N0YXR1cyA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fUEVHXzJfSEFMVF9TVEFUVVMgKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIGhhbHRfc3RhdHVzLCBVTk1fUEVHXzJfSEFMVF9TVEFUVVMgKTsKKwloYWx0X3N0YXR1cyA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fUEVHXzNfSEFMVF9TVEFUVVMgKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIGhhbHRfc3RhdHVzLCBVTk1fUEVHXzNfSEFMVF9TVEFUVVMgKTsKKwloYWx0X3N0YXR1cyA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLCBVTk1fUEVHXzRfSEFMVF9TVEFUVVMgKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIGhhbHRfc3RhdHVzLCBVTk1fUEVHXzRfSEFMVF9TVEFUVVMgKTsKK30KKworLyoqCisgKiBJbml0aWFsaXNlIHRoZSBQaGFudG9tIGNvbW1hbmQgUEVHCisgKgorICogQHYgcGhhbnRvbQkJUGhhbnRvbSBOSUMKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHBoYW50b21faW5pdF9jbWRwZWcgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gKSB7CisJdWludDMyX3QgY29sZF9ib290OworCXVpbnQzMl90IHN3X3Jlc2V0OworCXVuc2lnbmVkIGludCByZXRyaWVzOworCXVpbnQzMl90IGNtZHBlZ19zdGF0ZTsKKwl1aW50MzJfdCBsYXN0X2NtZHBlZ19zdGF0ZSA9IDA7CisKKwkvKiBDaGVjayBmb3IgYSBwcmV2aW91cyBpbml0aWFsaXNhdGlvbi4gIFRoaXMgY291bGQgaGF2ZQorCSAqIGhhcHBlbmVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIEJJT1MgdXNlZCB0aGUgVU5ESSBBUEkgdG8KKwkgKiBkcml2ZSB0aGUgTklDIHByaW9yIHRvIGEgZnVsbCBQWEUgYm9vdC4KKwkgKi8KKwljbWRwZWdfc3RhdGUgPSBwaGFudG9tX3JlYWRsICggcGhhbnRvbSwgVU5NX05JQ19SRUdfQ01EUEVHX1NUQVRFICk7CisJaWYgKCBjbWRwZWdfc3RhdGUgPT0gVU5NX05JQ19SRUdfQ01EUEVHX1NUQVRFX0lOSVRJQUxJWkVfQUNLICkgeworCQlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgY29tbWFuZCBQRUcgYWxyZWFkeSBpbml0aWFsaXplZFxuIiwKKwkJICAgICAgIHBoYW50b20gKTsKKwkJLyogVW5oYWx0IHRoZSBQRUdzLiAgUHJldmlvdXMgZmlybXdhcmUgKGUuZy4gQk9GTSkgbWF5CisJCSAqIGhhdmUgaGFsdGVkIHRoZSBQRUdzIHRvIHByZXZlbnQgaW50ZXJuYWwgYnVzCisJCSAqIGNvbGxpc2lvbnMgd2hlbiB0aGUgQklPUyByZS1yZWFkcyB0aGUgZXhwYW5zaW9uIFJPTS4KKwkJICovCisJCXBoYW50b21fdW5oYWx0X3BlZ3MgKCBwaGFudG9tICk7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIHRoaXMgd2FzIGEgY29sZCBib290LCBjaGVjayB0aGF0IHRoZSBoYXJkd2FyZSBjYW1lIHVwIG9rICovCisJY29sZF9ib290ID0gcGhhbnRvbV9yZWFkbCAoIHBoYW50b20sIFVOTV9DQU1fUkFNX0NPTERfQk9PVCApOworCWlmICggY29sZF9ib290ID09IFVOTV9DQU1fUkFNX0NPTERfQk9PVF9NQUdJQyApIHsKKwkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGNvbWluZyB1cCBmcm9tIGNvbGQgYm9vdFxuIiwKKwkJICAgICAgIHBoYW50b20gKTsKKwkJc3dfcmVzZXQgPSBwaGFudG9tX3JlYWRsICggcGhhbnRvbSwgVU5NX1JPTVVTQl9HTEJfU1dfUkVTRVQgKTsKKwkJaWYgKCBzd19yZXNldCAhPSBVTk1fUk9NVVNCX0dMQl9TV19SRVNFVF9NQUdJQyApIHsKKwkJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCByZXNldCBmYWlsZWQ6ICUwOHhcbiIsCisJCQkgICAgICAgcGhhbnRvbSwgc3dfcmVzZXQgKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfSBlbHNlIHsKKwkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGNvbWluZyB1cCBmcm9tIHdhcm0gYm9vdCAiCisJCSAgICAgICAiKCUwOHgpXG4iLCBwaGFudG9tLCBjb2xkX2Jvb3QgKTsKKwl9CisJLyogQ2xlYXIgY29sZC1ib290IGZsYWcgKi8KKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIDAsIFVOTV9DQU1fUkFNX0NPTERfQk9PVCApOworCisJLyogU2V0IHBvcnQgbW9kZXMgKi8KKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIFVOTV9DQU1fUkFNX1BPUlRfTU9ERV9BVVRPX05FR18xRywKKwkJCSBVTk1fQ0FNX1JBTV9XT0xfUE9SVF9NT0RFICk7CisKKwkvKiBQYXNzIGR1bW15IERNQSBhcmVhIHRvIGNhcmQgKi8KKwlwaGFudG9tX3dyaXRlX2hpbG8gKCBwaGFudG9tLCAwLAorCQkJICAgICBVTk1fTklDX1JFR19EVU1NWV9CVUZfQUREUl9MTywKKwkJCSAgICAgVU5NX05JQ19SRUdfRFVNTVlfQlVGX0FERFJfSEkgKTsKKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIFVOTV9OSUNfUkVHX0RVTU1ZX0JVRl9JTklULAorCQkJIFVOTV9OSUNfUkVHX0RVTU1ZX0JVRiApOworCisJLyogVGVsbCB0aGUgaGFyZHdhcmUgdGhhdCB0dW5pbmcgaXMgY29tcGxldGUgKi8KKwlwaGFudG9tX3dyaXRlbCAoIHBoYW50b20sIFVOTV9ST01VU0JfR0xCX1BFR1RVTkVfRE9ORV9NQUdJQywKKwkJCSBVTk1fUk9NVVNCX0dMQl9QRUdUVU5FX0RPTkUgKTsKKworCS8qIFdhaXQgZm9yIGNvbW1hbmQgUEVHIHRvIGZpbmlzaCBpbml0aWFsaXNpbmcgKi8KKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgaW5pdGlhbGlzaW5nIGNvbW1hbmQgUEVHICh3aWxsIHRha2UgdXAgdG8gIgorCSAgICAgICAiJWQgc2Vjb25kcykuLi5cbiIsIHBoYW50b20sIFBITl9DTURQRUdfSU5JVF9USU1FT1VUX1NFQyApOworCWZvciAoIHJldHJpZXMgPSAwOyByZXRyaWVzIDwgUEhOX0NNRFBFR19JTklUX1RJTUVPVVRfU0VDOyByZXRyaWVzKysgKSB7CisJCWNtZHBlZ19zdGF0ZSA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLAorCQkJCQkgICAgICAgVU5NX05JQ19SRUdfQ01EUEVHX1NUQVRFICk7CisJCWlmICggY21kcGVnX3N0YXRlICE9IGxhc3RfY21kcGVnX3N0YXRlICkgeworCQkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIGNvbW1hbmQgUEVHIHN0YXRlIGlzICIKKwkJCSAgICAgICAiJTA4eCBhZnRlciAlZCBzZWNvbmRzLi4uXG4iLAorCQkJICAgICAgIHBoYW50b20sIGNtZHBlZ19zdGF0ZSwgcmV0cmllcyApOworCQkJbGFzdF9jbWRwZWdfc3RhdGUgPSBjbWRwZWdfc3RhdGU7CisJCX0KKwkJaWYgKCBjbWRwZWdfc3RhdGUgPT0gVU5NX05JQ19SRUdfQ01EUEVHX1NUQVRFX0lOSVRJQUxJWkVEICkgeworCQkJLyogQWNrbm93bGVkZ2UgdGhlIFBFRyBpbml0aWFsaXNhdGlvbiAqLworCQkJcGhhbnRvbV93cml0ZWwgKCBwaGFudG9tLAorCQkJCSAgICAgICBVTk1fTklDX1JFR19DTURQRUdfU1RBVEVfSU5JVElBTElaRV9BQ0ssCisJCQkJICAgICAgIFVOTV9OSUNfUkVHX0NNRFBFR19TVEFURSApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbWRlbGF5ICggMTAwMCApOworCX0KKworCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY29tbWFuZCBQRUcgdG8gIgorCSAgICAgICAiaW5pdGlhbGlzZSAoc3RhdHVzICUwOHgpXG4iLCBwaGFudG9tLCBjbWRwZWdfc3RhdGUgKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyoqCisgKiBSZWFkIFBoYW50b20gTUFDIGFkZHJlc3MKKyAqCisgKiBAdiBwaGFudG9uX3BvcnQJUGhhbnRvbSBOSUMKKyAqIEB2IGh3X2FkZHIJCUJ1ZmZlciB0byBmaWxsIHdpdGggTUFDIGFkZHJlc3MKKyAqLworc3RhdGljIHZvaWQgcGhhbnRvbV9nZXRfbWFjYWRkciAoIHN0cnVjdCBwaGFudG9tX25pYyAqcGhhbnRvbSwKKwkJCQkgIHVpbnQ4X3QgKmh3X2FkZHIgKSB7CisJdW5pb24geworCQl1aW50OF90IG1hY19hZGRyWzJdW0VUSF9BTEVOXTsKKwkJdWludDMyX3QgZHdvcmRzWzNdOworCX0gdTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlpbnQgaTsKKworCS8qIFJlYWQgdGhlIHRocmVlIGR3b3JkcyB0aGF0IGluY2x1ZGUgdGhpcyBNQUMgYWRkcmVzcyBhbmQgb25lIG90aGVyICovCisJb2Zmc2V0ID0gKCBVTk1fQ0FNX1JBTV9NQUNfQUREUlMgKworCQkgICAoIDEyICogKCBwaGFudG9tLT5wb3J0IC8gMiApICkgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCAzIDsgaSsrLCBvZmZzZXQgKz0gNCApIHsKKwkJdS5kd29yZHNbaV0gPSBwaGFudG9tX3JlYWRsICggcGhhbnRvbSwgb2Zmc2V0ICk7CisJfQorCisJLyogQ29weSBvdXQgdGhlIHJlbGV2YW50IE1BQyBhZGRyZXNzICovCisJZm9yICggaSA9IDAgOyBpIDwgRVRIX0FMRU4gOyBpKysgKSB7CisJCWh3X2FkZHJbIEVUSF9BTEVOIC0gaSAtIDEgXSA9CisJCQl1Lm1hY19hZGRyWyBwaGFudG9tLT5wb3J0ICYgMSBdW2ldOworCX0KKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgTUFDIGFkZHJlc3MgaXMgJXNcbiIsCisJICAgICAgIHBoYW50b20sIGV0aF9udG9hICggaHdfYWRkciApICk7Cit9CisKKy8qKgorICogQ2hlY2sgUGhhbnRvbSBpcyBlbmFibGVkIGZvciBib290CisgKgorICogQHYgcGhhbnRvbl9wb3J0CVBoYW50b20gTklDCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGlzIGlzIHNvbWV0aGluZyBvZiBhbiB1Z2x5IGhhY2sgdG8gYWNjb21tb2RhdGUgYW4gT0VNCisgKiByZXF1aXJlbWVudC4gIFRoZSBOSUMgaGFzIG9ubHkgb25lIGV4cGFuc2lvbiBST00gQkFSLCByYXRoZXIgdGhhbgorICogb25lIHBlciBwb3J0LiAgVG8gYWxsb3cgaW5kaXZpZHVhbCBwb3J0cyB0byBiZSBzZWxlY3RpdmVseQorICogZW5hYmxlZC9kaXNhYmxlZCBmb3IgUFhFIGJvb3QgKGFzIHJlcXVpcmVkKSwgd2UgbXVzdCB0aGVyZWZvcmUKKyAqIGxlYXZlIHRoZSBleHBhbnNpb24gUk9NIGFsd2F5cyBlbmFibGVkLCBhbmQgcGxhY2UgdGhlIHBlci1wb3J0CisgKiBlbmFibGUvZGlzYWJsZSBsb2dpYyB3aXRoaW4gdGhlIGdQWEUgZHJpdmVyLgorICovCitzdGF0aWMgaW50IHBoYW50b21fY2hlY2tfYm9vdF9lbmFibGUgKCBzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gKSB7CisJdW5zaWduZWQgbG9uZyBib290X2VuYWJsZTsKKworCWJvb3RfZW5hYmxlID0gcGhhbnRvbV9yZWFkbCAoIHBoYW50b20sIFVOTV9DQU1fUkFNX0JPT1RfRU5BQkxFICk7CisJaWYgKCAhICggYm9vdF9lbmFibGUgJiAoIDEgPDwgcGhhbnRvbS0+cG9ydCApICkgKSB7CisJCURCR0MgKCBwaGFudG9tLCAiUGhhbnRvbSAlcCBQWEUgYm9vdCBpcyBkaXNhYmxlZFxuIiwKKwkJICAgICAgIHBoYW50b20gKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEluaXRpYWxpc2UgUGhhbnRvbSByZWNlaXZlIFBFRworICoKKyAqIEB2IHBoYW50b20JCVBoYW50b20gTklDCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBwaGFudG9tX2luaXRfcmN2cGVnICggc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tICkgeworCXVuc2lnbmVkIGludCByZXRyaWVzOworCXVpbnQzMl90IHJjdnBlZ19zdGF0ZTsKKwl1aW50MzJfdCBsYXN0X3JjdnBlZ19zdGF0ZSA9IDA7CisKKwlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgaW5pdGlhbGlzaW5nIHJlY2VpdmUgUEVHICh3aWxsIHRha2UgdXAgdG8gIgorCSAgICAgICAiJWQgc2Vjb25kcykuLi5cbiIsIHBoYW50b20sIFBITl9SQ1ZQRUdfSU5JVF9USU1FT1VUX1NFQyApOworCWZvciAoIHJldHJpZXMgPSAwOyByZXRyaWVzIDwgUEhOX1JDVlBFR19JTklUX1RJTUVPVVRfU0VDOyByZXRyaWVzKysgKSB7CisJCXJjdnBlZ19zdGF0ZSA9IHBoYW50b21fcmVhZGwgKCBwaGFudG9tLAorCQkJCQkgICAgICAgVU5NX05JQ19SRUdfUkNWUEVHX1NUQVRFICk7CisJCWlmICggcmN2cGVnX3N0YXRlICE9IGxhc3RfcmN2cGVnX3N0YXRlICkgeworCQkJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIHJlY2VpdmUgUEVHIHN0YXRlIGlzICIKKwkJCSAgICAgICAiJTA4eCBhZnRlciAlZCBzZWNvbmRzLi4uXG4iLAorCQkJICAgICAgIHBoYW50b20sIHJjdnBlZ19zdGF0ZSwgcmV0cmllcyApOworCQkJbGFzdF9yY3ZwZWdfc3RhdGUgPSByY3ZwZWdfc3RhdGU7CisJCX0KKwkJaWYgKCByY3ZwZWdfc3RhdGUgPT0gVU5NX05JQ19SRUdfUkNWUEVHX1NUQVRFX0lOSVRJQUxJWkVEICkKKwkJCXJldHVybiAwOworCQltZGVsYXkgKCAxMDAwICk7CisJfQorCisJREJHQyAoIHBoYW50b20sICJQaGFudG9tICVwIHRpbWVkIG91dCB3YWl0aW5nIGZvciByZWNlaXZlIFBFRyB0byAiCisJICAgICAgICJpbml0aWFsaXNlIChzdGF0dXMgJTA4eClcbiIsIHBoYW50b20sIHJjdnBlZ19zdGF0ZSApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCisvKioKKyAqIFByb2JlIFBDSSBkZXZpY2UKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqIEB2IGlkCQlQQ0kgSUQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHBoYW50b21fcHJvYmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkIF9fdW51c2VkICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHBoYW50b21fbmljICpwaGFudG9tOworCXN0cnVjdCBzZXR0aW5ncyAqcGFyZW50X3NldHRpbmdzOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIFBoYW50b20gZGV2aWNlICovCisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYgKCBzaXplb2YgKCAqcGhhbnRvbSApICk7CisJaWYgKCAhIG5ldGRldiApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19ldGhlcmRldjsKKwl9CisJbmV0ZGV2X2luaXQgKCBuZXRkZXYsICZwaGFudG9tX29wZXJhdGlvbnMgKTsKKwlwaGFudG9tID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKwlwY2lfc2V0X2RydmRhdGEgKCBwY2ksIG5ldGRldiApOworCW5ldGRldi0+ZGV2ID0gJnBjaS0+ZGV2OworCW1lbXNldCAoIHBoYW50b20sIDAsIHNpemVvZiAoICpwaGFudG9tICkgKTsKKwlwaGFudG9tLT5wb3J0ID0gUENJX0ZVTkMgKCBwY2ktPmRldmZuICk7CisJYXNzZXJ0ICggcGhhbnRvbS0+cG9ydCA8IFBITl9NQVhfTlVNX1BPUlRTICk7CisJc2V0dGluZ3NfaW5pdCAoICZwaGFudG9tLT5zZXR0aW5ncywKKwkJCSZwaGFudG9tX3NldHRpbmdzX29wZXJhdGlvbnMsCisJCQkmbmV0ZGV2LT5yZWZjbnQsICJjbHAiLCBQSE5fQ0xQX1RBR19NQUdJQyApOworCisJLyogRml4IHVwIFBDSSBkZXZpY2UgKi8KKwlhZGp1c3RfcGNpX2RldmljZSAoIHBjaSApOworCisJLyogTWFwIENSQiAqLworCWlmICggKCByYyA9IHBoYW50b21fbWFwX2NyYiAoIHBoYW50b20sIHBjaSApICkgIT0gMCApCisJCWdvdG8gZXJyX21hcF9jcmI7CisKKwkvKiBCVUc1OTQ1IC0gbmVlZCB0byBoYWNrIFBDSSBjb25maWcgc3BhY2Ugb24gUDMgQjEgc2lsaWNvbi4KKwkgKiBCMiB3aWxsIGhhdmUgdGhpcyBmaXhlZDsgcmVtb3ZlIHRoaXMgaGFjayB3aGVuIEIxIGlzIG5vCisJICogbG9uZ2VyIGluIHVzZS4KKwkgKi8KKwlpZiAoIFBDSV9GVU5DICggcGNpLT5kZXZmbiApID09IDAgKSB7CisJCXVuc2lnbmVkIGludCBpOworCQlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgeworCQkJdWludDMyX3QgdGVtcDsKKwkJCXBjaS0+ZGV2Zm4gPSBQQ0lfREVWRk4gKCBQQ0lfU0xPVCAoIHBjaS0+ZGV2Zm4gKSwgaSApOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkICggcGNpLCAweGM4LCAmdGVtcCApOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkICggcGNpLCAweGM4LCAmdGVtcCApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoIHBjaSwgMHhjOCwgMHhmMTAwMCApOworCQl9CisJCXBjaS0+ZGV2Zm4gPSBQQ0lfREVWRk4gKCBQQ0lfU0xPVCAoIHBjaS0+ZGV2Zm4gKSwgMCApOworCX0KKworCS8qIEluaXRpYWxpc2UgdGhlIGNvbW1hbmQgUEVHICovCisJaWYgKCAoIHJjID0gcGhhbnRvbV9pbml0X2NtZHBlZyAoIHBoYW50b20gKSApICE9IDAgKQorCQlnb3RvIGVycl9pbml0X2NtZHBlZzsKKworCS8qIEluaXRpYWxpc2UgdGhlIHJlY2VpdmUgUEVHICovCisJaWYgKCAoIHJjID0gcGhhbnRvbV9pbml0X3JjdnBlZyAoIHBoYW50b20gKSApICE9IDAgKQorCQlnb3RvIGVycl9pbml0X3JjdnBlZzsKKworCS8qIFJlYWQgTUFDIGFkZHJlc3NlcyAqLworCXBoYW50b21fZ2V0X21hY2FkZHIgKCBwaGFudG9tLCBuZXRkZXYtPmh3X2FkZHIgKTsKKworCS8qIFNraXAgaWYgYm9vdCBkaXNhYmxlZCBvbiBOSUMgKi8KKwlpZiAoICggcmMgPSBwaGFudG9tX2NoZWNrX2Jvb3RfZW5hYmxlICggcGhhbnRvbSApICkgIT0gMCApCisJCWdvdG8gZXJyX2NoZWNrX2Jvb3RfZW5hYmxlOworCisJLyogUmVnaXN0ZXIgbmV0d29yayBkZXZpY2VzICovCisJaWYgKCAoIHJjID0gcmVnaXN0ZXJfbmV0ZGV2ICggbmV0ZGV2ICkgKSAhPSAwICkgeworCQlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgY291bGQgbm90IHJlZ2lzdGVyIG5ldCBkZXZpY2U6ICIKKwkJICAgICAgICIlc1xuIiwgcGhhbnRvbSwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX3JlZ2lzdGVyX25ldGRldjsKKwl9CisKKwkvKiBSZWdpc3RlciBzZXR0aW5ncyBibG9ja3MgKi8KKwlwYXJlbnRfc2V0dGluZ3MgPSBuZXRkZXZfc2V0dGluZ3MgKCBuZXRkZXYgKTsKKwlpZiAoICggcmMgPSByZWdpc3Rlcl9zZXR0aW5ncyAoICZwaGFudG9tLT5zZXR0aW5ncywKKwkJCQkJcGFyZW50X3NldHRpbmdzICkgKSAhPSAwICkgeworCQlEQkdDICggcGhhbnRvbSwgIlBoYW50b20gJXAgY291bGQgbm90IHJlZ2lzdGVyIHNldHRpbmdzOiAiCisJCSAgICAgICAiJXNcbiIsIHBoYW50b20sIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9yZWdpc3Rlcl9zZXR0aW5nczsKKwl9CisKKwlyZXR1cm4gMDsKKworCXVucmVnaXN0ZXJfc2V0dGluZ3MgKCAmcGhhbnRvbS0+c2V0dGluZ3MgKTsKKyBlcnJfcmVnaXN0ZXJfc2V0dGluZ3M6CisJdW5yZWdpc3Rlcl9uZXRkZXYgKCBuZXRkZXYgKTsKKyBlcnJfcmVnaXN0ZXJfbmV0ZGV2OgorIGVycl9jaGVja19ib290X2VuYWJsZToKKyBlcnJfaW5pdF9yY3ZwZWc6CisgZXJyX2luaXRfY21kcGVnOgorIGVycl9tYXBfY3JiOgorCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworIGVycl9hbGxvY19ldGhlcmRldjoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVtb3ZlIFBDSSBkZXZpY2UKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgcGhhbnRvbV9yZW1vdmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKCBwY2kgKTsKKwlzdHJ1Y3QgcGhhbnRvbV9uaWMgKnBoYW50b20gPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworCisJdW5yZWdpc3Rlcl9zZXR0aW5ncyAoICZwaGFudG9tLT5zZXR0aW5ncyApOworCXVucmVnaXN0ZXJfbmV0ZGV2ICggbmV0ZGV2ICk7CisJbmV0ZGV2X251bGxpZnkgKCBuZXRkZXYgKTsKKwluZXRkZXZfcHV0ICggbmV0ZGV2ICk7Cit9CisKKy8qKiBQaGFudG9tIFBDSSBJRHMgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwaGFudG9tX25pY3NbXSA9IHsKKwlQQ0lfUk9NICggMHg0MDQwLCAweDAxMDAsICJueCIsICJOWCIsIDAgKSwKK307CisKKy8qKiBQaGFudG9tIFBDSSBkcml2ZXIgKi8KK3N0cnVjdCBwY2lfZHJpdmVyIHBoYW50b21fZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzID0gcGhhbnRvbV9uaWNzLAorCS5pZF9jb3VudCA9ICggc2l6ZW9mICggcGhhbnRvbV9uaWNzICkgLyBzaXplb2YgKCBwaGFudG9tX25pY3NbMF0gKSApLAorCS5wcm9iZSA9IHBoYW50b21fcHJvYmUsCisJLnJlbW92ZSA9IHBoYW50b21fcmVtb3ZlLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3BoYW50b20vcGhhbnRvbS5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcGhhbnRvbS9waGFudG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxOGE2OQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3BoYW50b20vcGhhbnRvbS5oCkBAIC0wLDAgKzEsMTk0IEBACisjaWZuZGVmIF9QSEFOVE9NX0gKKyNkZWZpbmUgX1BIQU5UT01fSAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOZXRYZW4sIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEBmaWxlCisgKgorICogTmV0WGVuIFBoYW50b20gTklDcworICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIERyYWcgaW4gaGFyZHdhcmUgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJueF9iaXRvcHMuaCIKKyNpbmNsdWRlICJwaGFudG9tX2h3LmgiCitzdHJ1Y3QgcGhhbnRvbV9yZHMgeyBOWF9QU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBwaGFudG9tX3Jkc19wYiApIH07CitzdHJ1Y3QgcGhhbnRvbV9zZHMgeyBOWF9QU0VVRE9fQklUX1NUUlVDVCAoIHN0cnVjdCBwaGFudG9tX3Nkc19wYiApIH07Cit1bmlvbiBwaGFudG9tX2NkcyB7IE5YX1BTRVVET19CSVRfU1RSVUNUICggdW5pb24gcGhhbnRvbV9jZHNfcGIgKSB9OworCisvKiBEcmFnIGluIGZpcm13YXJlIGludGVyZmFjZSBkZWZpbml0aW9ucyAqLwordHlwZWRlZiB1aW50OF90IFU4OwordHlwZWRlZiB1aW50MTZfdCBVMTY7Cit0eXBlZGVmIHVpbnQzMl90IFUzMjsKK3R5cGVkZWYgdWludDY0X3QgVTY0OwordHlwZWRlZiB1aW50MzJfdCBueF9yY29kZV90OworI2RlZmluZSBOWEhBTF9WRVJTSU9OIDEKKyNpbmNsdWRlICJueGhhbF9uaWNfaW50ZXJmYWNlLmgiCisKKy8qKiBETUEgYnVmZmVyIGFsaWdubWVudCAqLworI2RlZmluZSBVTk1fRE1BX0JVRkZFUl9BTElHTiAxNgorCisvKiogTWFyayBzdHJ1Y3R1cmUgYXMgRE1BLWFsaWduZWQgKi8KKyNkZWZpbmUgX191bm1fZG1hX2FsaWduZWQgX19hdHRyaWJ1dGVfXyAoKCBhbGlnbmVkICggVU5NX0RNQV9CVUZGRVJfQUxJR04gKSApKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2RlZmluZSBVTk1fMTI4TV9DUkJfV0lORE9XCQkweDYxMTAyMTBVTAorI2RlZmluZSBVTk1fMzJNX0NSQl9XSU5ET1cJCTB4MDExMDIxMFVMCisjZGVmaW5lIFVOTV8yTV9DUkJfV0lORE9XCQkweDAxMzAwNjBVTAorCisvKioKKyAqIFBoYW50b20gcmVnaXN0ZXIgYmxvY2tzCisgKgorICogVGhlIHVwcGVyIGFkZHJlc3MgYml0cyB2YXJ5IGJldHdlZW4gY2FyZHMuICBXZSBkZWZpbmUgYW4gYWJzdHJhY3QKKyAqIGFkZHJlc3Mgc3BhY2UgaW4gd2hpY2ggdGhlIHVwcGVyIDggYml0cyBvZiB0aGUgMzItYml0IHJlZ2lzdGVyCisgKiBhZGRyZXNzIGVuY29kZSB0aGUgcmVnaXN0ZXIgYmxvY2suICBUaGlzIGdldHMgdHJhbnNsYXRlZCB0byBhIGJ1cworICogYWRkcmVzcyBieSB0aGUgcGhhbnRvbV9jcmJfYWNjZXNzX3h4eCgpIG1ldGhvZHMuCisgKi8KK2VudW0gdW5tX3JlZ19ibG9ja3MgeworCVVOTV9DUkJfQkxLX1BDSUUJPSAweDAxLAorCVVOTV9DUkJfQkxLX0NBTQkJPSAweDIyLAorCVVOTV9DUkJfQkxLX1JPTVVTQgk9IDB4MzMsCisJVU5NX0NSQl9CTEtfVEVTVAk9IDB4MDIsCisJVU5NX0NSQl9CTEtfUEVHXzAJPSAweDExLAorCVVOTV9DUkJfQkxLX1BFR18xCT0gMHgxMiwKKwlVTk1fQ1JCX0JMS19QRUdfMgk9IDB4MTMsCisJVU5NX0NSQl9CTEtfUEVHXzMJPSAweDE0LAorCVVOTV9DUkJfQkxLX1BFR180CT0gMHgwZiwKK307CisjZGVmaW5lIFVOTV9DUkJfQkFTRShibGspCQkoIChibGspIDw8IDIwICkKKyNkZWZpbmUgVU5NX0NSQl9CTEsocmVnKQkJKCAocmVnKSA+PiAyMCApCisjZGVmaW5lIFVOTV9DUkJfT0ZGU0VUKHJlZykJCSggKHJlZykgJiAweDAwMGZmZmZmICkKKworI2RlZmluZSBVTk1fQ1JCX1BDSUUJCQlVTk1fQ1JCX0JBU0UgKCBVTk1fQ1JCX0JMS19QQ0lFICkKKyNkZWZpbmUgVU5NX1BDSUVfU0VNMl9MT0NLCQkoIFVOTV9DUkJfUENJRSArIDB4MWMwMTAgKQorI2RlZmluZSBVTk1fUENJRV9TRU0yX1VOTE9DSwkJKCBVTk1fQ1JCX1BDSUUgKyAweDFjMDE0ICkKKworI2RlZmluZSBVTk1fQ1JCX0NBTQkJCVVOTV9DUkJfQkFTRSAoIFVOTV9DUkJfQkxLX0NBTSApCisKKyNkZWZpbmUgVU5NX0NBTV9SQU0JCQkoIFVOTV9DUkJfQ0FNICsgMHgwMjAwMCApCisjZGVmaW5lIFVOTV9DQU1fUkFNX1BPUlRfTU9ERQkJKCBVTk1fQ0FNX1JBTSArIDB4MDAwMjQgKQorI2RlZmluZSBVTk1fQ0FNX1JBTV9QT1JUX01PREVfQVVUT19ORUcJCTQKKyNkZWZpbmUgVU5NX0NBTV9SQU1fUE9SVF9NT0RFX0FVVE9fTkVHXzFHCTUKKyNkZWZpbmUgVU5NX0NBTV9SQU1fRE1FU0dfSEVBRChuKQkoIFVOTV9DQU1fUkFNICsgMHgwMDAzMCArIChuKSAqIDB4MTAgKQorI2RlZmluZSBVTk1fQ0FNX1JBTV9ETUVTR19MRU4obikJKCBVTk1fQ0FNX1JBTSArIDB4MDAwMzQgKyAobikgKiAweDEwICkKKyNkZWZpbmUgVU5NX0NBTV9SQU1fRE1FU0dfVEFJTChuKQkoIFVOTV9DQU1fUkFNICsgMHgwMDAzOCArIChuKSAqIDB4MTAgKQorI2RlZmluZSBVTk1fQ0FNX1JBTV9ETUVTR19TSUcobikJKCBVTk1fQ0FNX1JBTSArIDB4MDAwM2MgKyAobikgKiAweDEwICkKKyNkZWZpbmUgVU5NX0NBTV9SQU1fRE1FU0dfU0lHX01BR0lDCQkweGNhZmViYWJlVUwKKyNkZWZpbmUgVU5NX0NBTV9SQU1fTlVNX0RNRVNHX0JVRkZFUlMJCTUKKyNkZWZpbmUgVU5NX0NBTV9SQU1fQ0xQX0NPTU1BTkQJCSggVU5NX0NBTV9SQU0gKyAweDAwMGMwICkKKyNkZWZpbmUgVU5NX0NBTV9SQU1fQ0xQX0NPTU1BTkRfTEFTVAkJMHgwMDAwMDA4MFVMCisjZGVmaW5lIFVOTV9DQU1fUkFNX0NMUF9EQVRBX0xPCQkoIFVOTV9DQU1fUkFNICsgMHgwMDBjNCApCisjZGVmaW5lIFVOTV9DQU1fUkFNX0NMUF9EQVRBX0hJCQkoIFVOTV9DQU1fUkFNICsgMHgwMDBjOCApCisjZGVmaW5lIFVOTV9DQU1fUkFNX0NMUF9TVEFUVVMJCSggVU5NX0NBTV9SQU0gKyAweDAwMGNjICkKKyNkZWZpbmUgVU5NX0NBTV9SQU1fQ0xQX1NUQVRVU19TVEFSVAkJMHgwMDAwMDAwMVVMCisjZGVmaW5lIFVOTV9DQU1fUkFNX0NMUF9TVEFUVVNfRE9ORQkJMHgwMDAwMDAwMlVMCisjZGVmaW5lIFVOTV9DQU1fUkFNX0NMUF9TVEFUVVNfRVJST1IJCTB4MDAwMGZmMDBVTAorI2RlZmluZSBVTk1fQ0FNX1JBTV9DTFBfU1RBVFVTX1VOSU5JVElBTElTRUQJMHhmZmZmZmZmZlVMCisjZGVmaW5lIFVOTV9DQU1fUkFNX0JPT1RfRU5BQkxFCQkoIFVOTV9DQU1fUkFNICsgMHgwMDBmYyApCisjZGVmaW5lIFVOTV9DQU1fUkFNX1dPTF9QT1JUX01PREUJKCBVTk1fQ0FNX1JBTSArIDB4MDAxOTggKQorI2RlZmluZSBVTk1fQ0FNX1JBTV9NQUNfQUREUlMJCSggVU5NX0NBTV9SQU0gKyAweDAwMWMwICkKKyNkZWZpbmUgVU5NX0NBTV9SQU1fQ09MRF9CT09UCQkoIFVOTV9DQU1fUkFNICsgMHgwMDFmYyApCisjZGVmaW5lIFVOTV9DQU1fUkFNX0NPTERfQk9PVF9NQUdJQwkJMHg1NTU1NTU1NVVMCisKKyNkZWZpbmUgVU5NX05JQ19SRUcJCQkoIFVOTV9DUkJfQ0FNICsgMHgwMjIwMCApCisjZGVmaW5lIFVOTV9OSUNfUkVHX05YX0NEUlAJCSggVU5NX05JQ19SRUcgKyAweDAwMDE4ICkKKyNkZWZpbmUgVU5NX05JQ19SRUdfTlhfQVJHMQkJKCBVTk1fTklDX1JFRyArIDB4MDAwMWMgKQorI2RlZmluZSBVTk1fTklDX1JFR19OWF9BUkcyCQkoIFVOTV9OSUNfUkVHICsgMHgwMDAyMCApCisjZGVmaW5lIFVOTV9OSUNfUkVHX05YX0FSRzMJCSggVU5NX05JQ19SRUcgKyAweDAwMDI0ICkKKyNkZWZpbmUgVU5NX05JQ19SRUdfTlhfU0lHTgkJKCBVTk1fTklDX1JFRyArIDB4MDAwMjggKQorI2RlZmluZSBVTk1fTklDX1JFR19EVU1NWV9CVUZfQUREUl9ISQkoIFVOTV9OSUNfUkVHICsgMHgwMDAzYyApCisjZGVmaW5lIFVOTV9OSUNfUkVHX0RVTU1ZX0JVRl9BRERSX0xPCSggVU5NX05JQ19SRUcgKyAweDAwMDQwICkKKyNkZWZpbmUgVU5NX05JQ19SRUdfQ01EUEVHX1NUQVRFCSggVU5NX05JQ19SRUcgKyAweDAwMDUwICkKKyNkZWZpbmUgVU5NX05JQ19SRUdfQ01EUEVHX1NUQVRFX0lOSVRJQUxJWkVECTB4ZmYwMQorI2RlZmluZSBVTk1fTklDX1JFR19DTURQRUdfU1RBVEVfSU5JVElBTElaRV9BQ0sJMHhmMDBmCisjZGVmaW5lIFVOTV9OSUNfUkVHX0RVTU1ZX0JVRgkJKCBVTk1fTklDX1JFRyArIDB4MDAwZmMgKQorI2RlZmluZSBVTk1fTklDX1JFR19EVU1NWV9CVUZfSU5JVAkJMAorI2RlZmluZSBVTk1fTklDX1JFR19YR19TVEFURV9QMwkJKCBVTk1fTklDX1JFRyArIDB4MDAwOTggKQorI2RlZmluZSBVTk1fTklDX1JFR19YR19TVEFURV9QM19MSU5LKCBwb3J0LCBzdGF0ZV9wMyApIFwKKwkoICggKHN0YXRlX3AzKSA+PiAoIChwb3J0KSAqIDQgKSApICYgMHgwZiApCisjZGVmaW5lIFVOTV9OSUNfUkVHX1hHX1NUQVRFX1AzX0xJTktfVVAJCTB4MDEKKyNkZWZpbmUgVU5NX05JQ19SRUdfWEdfU1RBVEVfUDNfTElOS19ET1dOCTB4MDIKKyNkZWZpbmUgVU5NX05JQ19SRUdfUkNWUEVHX1NUQVRFCSggVU5NX05JQ19SRUcgKyAweDAwMTNjICkKKyNkZWZpbmUgVU5NX05JQ19SRUdfUkNWUEVHX1NUQVRFX0lOSVRJQUxJWkVECTB4ZmYwMQorI2RlZmluZSBVTk1fTklDX1JFR19TV19JTlRfTUFTS18wCSggVU5NX05JQ19SRUcgKyAweDAwMWQ4ICkKKyNkZWZpbmUgVU5NX05JQ19SRUdfU1dfSU5UX01BU0tfMQkoIFVOTV9OSUNfUkVHICsgMHgwMDFlMCApCisjZGVmaW5lIFVOTV9OSUNfUkVHX1NXX0lOVF9NQVNLXzIJKCBVTk1fTklDX1JFRyArIDB4MDAxZTQgKQorI2RlZmluZSBVTk1fTklDX1JFR19TV19JTlRfTUFTS18zCSggVU5NX05JQ19SRUcgKyAweDAwMWU4ICkKKworI2RlZmluZSBVTk1fQ1JCX1JPTVVTQgkJCVVOTV9DUkJfQkFTRSAoIFVOTV9DUkJfQkxLX1JPTVVTQiApCisKKyNkZWZpbmUgVU5NX1JPTVVTQl9HTEIJCQkoIFVOTV9DUkJfUk9NVVNCICsgMHgwMDAwMCApCisjZGVmaW5lIFVOTV9ST01VU0JfR0xCX1NUQVRVUwkJKCBVTk1fUk9NVVNCX0dMQiArIDB4MDAwMDQgKQorI2RlZmluZSBVTk1fUk9NVVNCX0dMQl9TVEFUVVNfUk9NX0RPTkUJCSggMSA8PCAxICkKKyNkZWZpbmUgVU5NX1JPTVVTQl9HTEJfU1dfUkVTRVQJCSggVU5NX1JPTVVTQl9HTEIgKyAweDAwMDA4ICkKKyNkZWZpbmUgVU5NX1JPTVVTQl9HTEJfU1dfUkVTRVRfTUFHSUMJCTB4MDA4MDAwMGZVTAorI2RlZmluZSBVTk1fUk9NVVNCX0dMQl9QRUdUVU5FX0RPTkUJKCBVTk1fUk9NVVNCX0dMQiArIDB4MDAwNWMgKQorI2RlZmluZSBVTk1fUk9NVVNCX0dMQl9QRUdUVU5FX0RPTkVfTUFHSUMJMHgzMQorCisjZGVmaW5lIFVOTV9ST01VU0JfUk9NCQkJKCBVTk1fQ1JCX1JPTVVTQiArIDB4MTAwMDAgKQorI2RlZmluZSBVTk1fUk9NVVNCX1JPTV9JTlNUUl9PUENPREUJKCBVTk1fUk9NVVNCX1JPTSArIDB4MDAwMDQgKQorI2RlZmluZSBVTk1fUk9NVVNCX1JPTV9BRERSRVNTCQkoIFVOTV9ST01VU0JfUk9NICsgMHgwMDAwOCApCisjZGVmaW5lIFVOTV9ST01VU0JfUk9NX1dEQVRBCQkoIFVOTV9ST01VU0JfUk9NICsgMHgwMDAwYyApCisjZGVmaW5lIFVOTV9ST01VU0JfUk9NX0FCWVRFX0NOVAkoIFVOTV9ST01VU0JfUk9NICsgMHgwMDAxMCApCisjZGVmaW5lIFVOTV9ST01VU0JfUk9NX0RVTU1ZX0JZVEVfQ05UCSggVU5NX1JPTVVTQl9ST00gKyAweDAwMDE0ICkKKyNkZWZpbmUgVU5NX1JPTVVTQl9ST01fUkRBVEEJCSggVU5NX1JPTVVTQl9ST00gKyAweDAwMDE4ICkKKworI2RlZmluZSBVTk1fQ1JCX1RFU1QJCQlVTk1fQ1JCX0JBU0UgKCBVTk1fQ1JCX0JMS19URVNUICkKKworI2RlZmluZSBVTk1fVEVTVF9DT05UUk9MCQkoIFVOTV9DUkJfVEVTVCArIDB4MDAwOTAgKQorI2RlZmluZSBVTk1fVEVTVF9DT05UUk9MX1NUQVJUCQkJMHgwMQorI2RlZmluZSBVTk1fVEVTVF9DT05UUk9MX0VOQUJMRQkJCTB4MDIKKyNkZWZpbmUgVU5NX1RFU1RfQ09OVFJPTF9CVVNZCQkJMHgwOAorI2RlZmluZSBVTk1fVEVTVF9BRERSX0xPCQkoIFVOTV9DUkJfVEVTVCArIDB4MDAwOTQgKQorI2RlZmluZSBVTk1fVEVTVF9BRERSX0hJCQkoIFVOTV9DUkJfVEVTVCArIDB4MDAwOTggKQorI2RlZmluZSBVTk1fVEVTVF9SRERBVEFfTE8JCSggVU5NX0NSQl9URVNUICsgMHgwMDBhOCApCisjZGVmaW5lIFVOTV9URVNUX1JEREFUQV9ISQkJKCBVTk1fQ1JCX1RFU1QgKyAweDAwMGFjICkKKworI2RlZmluZSBVTk1fQ1JCX1BFR18wCQkJVU5NX0NSQl9CQVNFICggVU5NX0NSQl9CTEtfUEVHXzAgKQorI2RlZmluZSBVTk1fUEVHXzBfSEFMVF9TVEFUVVMJCSggVU5NX0NSQl9QRUdfMCArIDB4MDAwMzAgKQorI2RlZmluZSBVTk1fUEVHXzBfSEFMVAkJCSggVU5NX0NSQl9QRUdfMCArIDB4MDAwM2MgKQorCisjZGVmaW5lIFVOTV9DUkJfUEVHXzEJCQlVTk1fQ1JCX0JBU0UgKCBVTk1fQ1JCX0JMS19QRUdfMSApCisjZGVmaW5lIFVOTV9QRUdfMV9IQUxUX1NUQVRVUwkJKCBVTk1fQ1JCX1BFR18xICsgMHgwMDAzMCApCisjZGVmaW5lIFVOTV9QRUdfMV9IQUxUCQkJKCBVTk1fQ1JCX1BFR18xICsgMHgwMDAzYyApCisKKyNkZWZpbmUgVU5NX0NSQl9QRUdfMgkJCVVOTV9DUkJfQkFTRSAoIFVOTV9DUkJfQkxLX1BFR18yICkKKyNkZWZpbmUgVU5NX1BFR18yX0hBTFRfU1RBVFVTCQkoIFVOTV9DUkJfUEVHXzIgKyAweDAwMDMwICkKKyNkZWZpbmUgVU5NX1BFR18yX0hBTFQJCQkoIFVOTV9DUkJfUEVHXzIgKyAweDAwMDNjICkKKworI2RlZmluZSBVTk1fQ1JCX1BFR18zCQkJVU5NX0NSQl9CQVNFICggVU5NX0NSQl9CTEtfUEVHXzMgKQorI2RlZmluZSBVTk1fUEVHXzNfSEFMVF9TVEFUVVMJCSggVU5NX0NSQl9QRUdfMyArIDB4MDAwMzAgKQorI2RlZmluZSBVTk1fUEVHXzNfSEFMVAkJCSggVU5NX0NSQl9QRUdfMyArIDB4MDAwM2MgKQorCisjZGVmaW5lIFVOTV9DUkJfUEVHXzQJCQlVTk1fQ1JCX0JBU0UgKCBVTk1fQ1JCX0JMS19QRUdfNCApCisjZGVmaW5lIFVOTV9QRUdfNF9IQUxUX1NUQVRVUwkJKCBVTk1fQ1JCX1BFR180ICsgMHgwMDAzMCApCisjZGVmaW5lIFVOTV9QRUdfNF9IQUxUCQkJKCBVTk1fQ1JCX1BFR180ICsgMHgwMDAzYyApCisKKyNlbmRpZiAvKiBfUEhBTlRPTV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9waGFudG9tL3BoYW50b21faHcuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3BoYW50b20vcGhhbnRvbV9ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGYzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9waGFudG9tL3BoYW50b21faHcuaApAQCAtMCwwICsxLDE4NCBAQAorI2lmbmRlZiBfUEhBTlRPTV9IV19ICisjZGVmaW5lIF9QSEFOVE9NX0hXX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTmV0WGVuLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFBoYW50b20gaGFyZHdhcmUgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworLyoqIEEgUGhhbnRvbSBSWCBkZXNjcmlwdG9yICovCitzdHJ1Y3QgcGhhbnRvbV9yZHNfcGIgeworCXBzZXVkb19iaXRfdCBoYW5kbGVbMTZdOwkJLyoqPCBSZWZlcmVuY2UgaGFuZGxlICovCisJcHNldWRvX2JpdF90IGZsYWdzWzE2XTsJCQkvKio8IEZsYWdzICovCisJcHNldWRvX2JpdF90IGxlbmd0aFszMl07CQkvKio8IEJ1ZmZlciBsZW5ndGggKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJcHNldWRvX2JpdF90IGRtYV9hZGRyWzY0XTsJCS8qKjwgQnVmZmVyIERNQSBhZGRyZXNzICovCisKK307CisKKy8qKiBBIFBoYW50b20gUlggc3RhdHVzIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBwaGFudG9tX3Nkc19wYiB7CisJcHNldWRvX2JpdF90IHBvcnRbNF07CQkJLyoqPCBQb3J0IG51bWJlciAqLworCXBzZXVkb19iaXRfdCBzdGF0dXNbNF07CQkJLyoqPCBDaGVja3N1bSBzdGF0dXMgKi8KKwlwc2V1ZG9fYml0X3QgdHlwZVs0XTsJCQkvKio8IFR5cGUgKi8KKwlwc2V1ZG9fYml0X3QgdG90YWxfbGVuZ3RoWzE2XTsJCS8qKjwgVG90YWwgcGFja2V0IGxlbmd0aCAqLworCXBzZXVkb19iaXRfdCBoYW5kbGVbMTZdOwkJLyoqPCBSZWZlcmVuY2UgaGFuZGxlICovCisJcHNldWRvX2JpdF90IHByb3RvY29sWzRdOwkJLyoqPCBQcm90b2NvbCAqLworCXBzZXVkb19iaXRfdCBwa3Rfb2Zmc2V0WzVdOwkJLyoqPCBPZmZzZXQgdG8gcGFja2V0IHN0YXJ0ICovCisJcHNldWRvX2JpdF90IGRlc2NfY250WzNdOwkJLyoqPCBEZXNjcmlwdG9yIGNvdW50ICovCisJcHNldWRvX2JpdF90IG93bmVyWzJdOwkJCS8qKjwgT3duZXIgKi8KKwlwc2V1ZG9fYml0X3Qgb3Bjb2RlWzZdOwkJCS8qKjwgT3Bjb2RlICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCXBzZXVkb19iaXRfdCBoYXNoX3ZhbHVlWzMyXTsJCS8qKjwgUlNTIGhhc2ggdmFsdWUgKi8KKwlwc2V1ZG9fYml0X3QgaGFzaF90eXBlWzhdOwkJLyoqPCBSU1MgaGFzaCB0eXBlICovCisJcHNldWRvX2JpdF90IGxyb1s4XTsJCQkvKio8IExSTyBkYXRhICovCit9OworCisvKiogUGhhbnRvbSBSWCBzdGF0dXMgb3Bjb2RlcyAqLworZW51bSBwaGFudG9tX3Nkc19vcGNvZGUgeworCVVOTV9TWU5fT0ZGTE9BRCA9IDB4MDMsCisJVU5NX1JYUEtUX0RFU0MgPSAweDA0LAorfTsKKworLyoqIEEgUGhhbnRvbSBUWCBkZXNjcmlwdG9yICovCitzdHJ1Y3QgcGhhbnRvbV90eF9jZHNfcGIgeworCXBzZXVkb19iaXRfdCB0Y3BfaGRyX29mZnNldFs4XTsJCS8qKjwgVENQIGhlYWRlciBvZmZzZXQgKExTTykgKi8KKyAgICAgICAgcHNldWRvX2JpdF90IGlwX2hkcl9vZmZzZXRbOF07CQkvKio8IElQIGhlYWRlciBvZmZzZXQgKExTTykgKi8KKwlwc2V1ZG9fYml0X3QgZmxhZ3NbN107CQkJLyoqPCBGbGFncyAqLworCXBzZXVkb19iaXRfdCBvcGNvZGVbNl07CQkJLyoqPCBPcGNvZGUgKi8KKwlwc2V1ZG9fYml0X3QgaHdfcnN2ZF8wWzNdOwkJLyoqPCAoUmVzZXJ2ZWQpICovCisJcHNldWRvX2JpdF90IG51bV9idWZmZXJzWzhdOwkJLyoqPCBUb3RhbCBudW1iZXIgb2YgYnVmZmVycyAqLworCXBzZXVkb19iaXRfdCBsZW5ndGhbMjRdOwkJLyoqPCBUb3RhbCBsZW5ndGggKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJcHNldWRvX2JpdF90IGJ1ZmZlcjJfZG1hX2FkZHJbNjRdOwkvKio8IEJ1ZmZlciAyIERNQSBhZGRyZXNzICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCXBzZXVkb19iaXRfdCBoYW5kbGVbMTZdOwkJLyoqPCBSZWZlcmVuY2UgaGFuZGxlIChuL2EpICovCisJcHNldWRvX2JpdF90IHBvcnRfbXNzWzE2XTsJCS8qKjwgVENQIE1TUyAoTFNPKSAqLworCXBzZXVkb19iaXRfdCBwb3J0WzRdOwkJCS8qKjwgUG9ydCAqLworCXBzZXVkb19iaXRfdCBjb250ZXh0X2lkWzRdOwkJLyoqPCBDb250ZXh0IElEICovCisJcHNldWRvX2JpdF90IHRvdGFsX2hkcl9sZW5ndGhbOF07CS8qKjwgTUFDK0lQK1RDUCBoZWFkZXIgKExTTykgKi8KKwlwc2V1ZG9fYml0X3QgY29ubl9pZFsxNl07CQkvKio8IElQU2VjIGNvbm5lY3Rpb24gSUQgKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJcHNldWRvX2JpdF90IGJ1ZmZlcjNfZG1hX2FkZHJbNjRdOwkvKio8IEJ1ZmZlciAzIERNQSBhZGRyZXNzICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCXBzZXVkb19iaXRfdCBidWZmZXIxX2RtYV9hZGRyWzY0XTsJLyoqPCBCdWZmZXIgMSBETUEgYWRkcmVzcyAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlwc2V1ZG9fYml0X3QgYnVmZmVyMV9sZW5ndGhbMTZdOwkvKio8IEJ1ZmZlciAxIGxlbmd0aCAqLworCXBzZXVkb19iaXRfdCBidWZmZXIyX2xlbmd0aFsxNl07CS8qKjwgQnVmZmVyIDIgbGVuZ3RoICovCisJcHNldWRvX2JpdF90IGJ1ZmZlcjNfbGVuZ3RoWzE2XTsJLyoqPCBCdWZmZXIgMyBsZW5ndGggKi8KKwlwc2V1ZG9fYml0X3QgYnVmZmVyNF9sZW5ndGhbMTZdOwkvKio8IEJ1ZmZlciA0IGxlbmd0aCAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlwc2V1ZG9fYml0X3QgYnVmZmVyNF9kbWFfYWRkcls2NF07CS8qKjwgQnVmZmVyIDQgRE1BIGFkZHJlc3MgKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJcHNldWRvX2JpdF90IGh3X3JzdmRfMVs2NF07CQkvKio8IChSZXNlcnZlZCkgKi8KK307CisKKy8qKiBBIFBoYW50b20gTUFDIGFkZHJlc3MgcmVxdWVzdCBib2R5ICovCitzdHJ1Y3QgcGhhbnRvbV9uaWNfcmVxdWVzdF9ib2R5X21hY19yZXF1ZXN0X3BiIHsKKwlwc2V1ZG9fYml0X3Qgb3Bjb2RlWzhdOwkJCS8qKjwgT3Bjb2RlICovCisJcHNldWRvX2JpdF90IHRhZ1s4XTsJCQkvKio8IFRhZyAqLworCXBzZXVkb19iaXRfdCBtYWNfYWRkcl8wWzhdOwkJLyoqPCBNQUMgYWRkcmVzcyBieXRlIDAgKi8KKwlwc2V1ZG9fYml0X3QgbWFjX2FkZHJfMVs4XTsJCS8qKjwgTUFDIGFkZHJlc3MgYnl0ZSAxICovCisJcHNldWRvX2JpdF90IG1hY19hZGRyXzJbOF07CQkvKio8IE1BQyBhZGRyZXNzIGJ5dGUgMiAqLworCXBzZXVkb19iaXRfdCBtYWNfYWRkcl8zWzhdOwkJLyoqPCBNQUMgYWRkcmVzcyBieXRlIDMgKi8KKwlwc2V1ZG9fYml0X3QgbWFjX2FkZHJfNFs4XTsJCS8qKjwgTUFDIGFkZHJlc3MgYnl0ZSA0ICovCisJcHNldWRvX2JpdF90IG1hY19hZGRyXzVbOF07CQkvKio8IE1BQyBhZGRyZXNzIGJ5dGUgNSAqLworfTsKKworLyoqIFBoYW50b20gTUFDIHJlcXVlc3Qgb3Bjb2RlcyAqLworZW51bSBwaGFudG9tX21hY19yZXF1ZXN0X29wY29kZSB7CisJVU5NX01BQ19BREQgPSAweDAxLAkJCS8qKjwgQWRkIE1BQyBhZGRyZXNzICovCisJVU5NX01BQ19ERUwgPSAweDAyLAkJCS8qKjwgRGVsZXRlIE1BQyBhZGRyZXNzICovCit9OworCisvKiogQSBQaGFudG9tIE5JQyByZXF1ZXN0IGNvbW1hbmQgZGVzY3JpcHRvciAqLworc3RydWN0IHBoYW50b21fbmljX3JlcXVlc3RfY2RzX3BiIHsKKwlzdHJ1Y3QgeworCQlwc2V1ZG9fYml0X3QgZHN0X21pbm9yWzE4XTsKKwkJcHNldWRvX2JpdF90IGRzdF9zdWJxWzFdOworCQlwc2V1ZG9fYml0X3QgZHN0X21ham9yWzRdOworCQlwc2V1ZG9fYml0X3Qgb3Bjb2RlWzZdOworCQlwc2V1ZG9fYml0X3QgaHdfcnN2ZF8wWzNdOworCQlwc2V1ZG9fYml0X3QgbXNnaW5mb1syNF07CisJCXBzZXVkb19iaXRfdCBod19yc3ZkXzFbMl07CisJCXBzZXVkb19iaXRfdCBxbXNnX3R5cGVbNl07CisJfSBjb21tb247CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCXN0cnVjdCB7CisJCXBzZXVkb19iaXRfdCBvcGNvZGVbOF07CisJCXBzZXVkb19iaXRfdCBjb21wX2lkIFs4XTsKKwkJcHNldWRvX2JpdF90IGNvbnRleHRfaWRbMTZdOworCQlwc2V1ZG9fYml0X3QgbmVlZF9jb21wbGV0aW9uWzFdOworCQlwc2V1ZG9fYml0X3QgaHdfcnN2ZF8wWzIzXTsKKwkJcHNldWRvX2JpdF90IHN1Yl9vcGNvZGVbOF07CisJfSBoZWFkZXI7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCXVuaW9uIHsKKwkJc3RydWN0IHBoYW50b21fbmljX3JlcXVlc3RfYm9keV9tYWNfcmVxdWVzdF9wYiBtYWNfcmVxdWVzdDsKKwkJcHNldWRvX2JpdF90IHBhZGRpbmdbMzg0XTsKKwl9IGJvZHk7Cit9OworCisvKiogUGhhbnRvbSBOSUMgcmVxdWVzdCBvcGNvZGVzICovCitlbnVtIHBoYW50b21fbmljX3JlcXVlc3Rfb3Bjb2RlIHsKKwlVTk1fTUFDX0VWRU5UID0gMHgwMSwJCQkvKio8IEFkZC9kZWxldGUgTUFDIGFkZHJlc3MgKi8KK307CisKKy8qKiBBIFBoYW50b20gY29tbWFuZCBkZXNjcmlwdG9yICovCit1bmlvbiBwaGFudG9tX2Nkc19wYiB7CisJc3RydWN0IHBoYW50b21fdHhfY2RzX3BiIHR4OworCXN0cnVjdCBwaGFudG9tX25pY19yZXF1ZXN0X2Nkc19wYiBuaWNfcmVxdWVzdDsKK307CisKKy8qKiBQaGFudG9tIGNvbW1hbmQgZGVzY3JpcHRvciBvcGNvZGVzICovCitlbnVtIHBoYW50b21fY2RzX29wY29kZSB7CisJVU5NX1RYX0VUSEVSX1BLVCA9IDB4MDEsCQkvKio8IFRyYW5zbWl0IHJhdyBFdGhlcm5ldCAqLworCVVOTV9OSUNfUkVRVUVTVCA9IDB4MTQsCQkJLyoqPCBOSUMgcmVxdWVzdCAqLworfTsKKworI2VuZGlmIC8qIF9QSEFOVE9NX0hXX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3BuaWMuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3BuaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM2NzkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcG5pYy5jCkBAIC0wLDAgKzEsMjgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0V0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCitCb2NocyBQc2V1ZG8gTklDIGRyaXZlciBmb3IgRXRoZXJib290CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFNlZSBwbmljX2FwaS5oIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgQm9jaHMgUHNldWRvIE5JQy4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgInBuaWNfYXBpLmgiCisKK3N0cnVjdCBwbmljIHsKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHI7Cit9OworCisvKiAKKyAqIFV0aWxpdHkgZnVuY3Rpb25zOiBpc3N1ZSBhIFBOSUMgY29tbWFuZCwgcmV0cmlldmUgcmVzdWx0LiAgVXNlCisgKiBwbmljX2NvbW1hbmRfcXVpZXQgaWYgeW91IGRvbid0IHdhbnQgZmFpbHVyZSBjb2RlcyB0byBiZQorICogYXV0b21hdGljYWxseSBwcmludGVkLiAgUmV0dXJucyB0aGUgUE5JQyBzdGF0dXMgY29kZS4KKyAqIAorICogU2V0IG91dHB1dF9sZW5ndGggdG8gTlVMTCBvbmx5IGlmIHlvdSBleHBlY3QgdG8gcmVjZWl2ZSBleGFjdGx5CisgKiBvdXRwdXRfbWF4X2xlbmd0aCBieXRlcywgb3RoZXJ3aXNlIGl0J2xsIGNvbXBsYWluIHRoYXQgeW91IGRpZG4ndAorICogZ2V0IGVub3VnaCBkYXRhIChvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGlmIHlvdSBub3QgaW50ZXJlc3RlZCBpbgorICogZGlzY292ZXJpbmcgdGhlIG91dHB1dCBsZW5ndGggdGhlbiB5b3UncmUgZXhwZWN0aW5nIGEgZml4ZWQgYW1vdW50CisgKiBvZiBkYXRhKS4KKyAqLworCitzdGF0aWMgdWludDE2X3QgcG5pY19jb21tYW5kX3F1aWV0ICggc3RydWN0IHBuaWMgKnBuaWMsIHVpbnQxNl90IGNvbW1hbmQsCisJCQkJICAgICBjb25zdCB2b2lkICppbnB1dCwgdWludDE2X3QgaW5wdXRfbGVuZ3RoLAorCQkJCSAgICAgdm9pZCAqb3V0cHV0LCB1aW50MTZfdCBvdXRwdXRfbWF4X2xlbmd0aCwKKwkJCQkgICAgIHVpbnQxNl90ICpvdXRwdXRfbGVuZ3RoICkgeworCXVpbnQxNl90IHN0YXR1czsKKwl1aW50MTZfdCBfb3V0cHV0X2xlbmd0aDsKKworCWlmICggaW5wdXQgIT0gTlVMTCApIHsKKwkJLyogV3JpdGUgaW5wdXQgbGVuZ3RoICovCisJCW91dHcgKCBpbnB1dF9sZW5ndGgsIHBuaWMtPmlvYWRkciArIFBOSUNfUkVHX0xFTiApOworCQkvKiBXcml0ZSBpbnB1dCBkYXRhICovCisJCW91dHNiICggcG5pYy0+aW9hZGRyICsgUE5JQ19SRUdfREFUQSwgaW5wdXQsIGlucHV0X2xlbmd0aCApOworCX0KKwkvKiBXcml0ZSBjb21tYW5kICovCisJb3V0dyAoIGNvbW1hbmQsIHBuaWMtPmlvYWRkciArIFBOSUNfUkVHX0NNRCApOworCS8qIFJldHJpZXZlIHN0YXR1cyAqLworCXN0YXR1cyA9IGludyAoIHBuaWMtPmlvYWRkciArIFBOSUNfUkVHX1NUQVQgKTsKKwkvKiBSZXRyaWV2ZSBvdXRwdXQgbGVuZ3RoICovCisJX291dHB1dF9sZW5ndGggPSBpbncgKCBwbmljLT5pb2FkZHIgKyBQTklDX1JFR19MRU4gKTsKKwlpZiAoIG91dHB1dF9sZW5ndGggPT0gTlVMTCApIHsKKwkJaWYgKCBfb3V0cHV0X2xlbmd0aCAhPSBvdXRwdXRfbWF4X2xlbmd0aCApIHsKKwkJCXByaW50ZiAoICJwbmljX2NvbW1hbmQgJSNoeDogd3JvbmcgZGF0YSBsZW5ndGggIgorCQkJCSAicmV0dXJuZWQgKGV4cGVjdGVkICVkLCBnb3QgJWQpXG4iLCBjb21tYW5kLAorCQkJCSBvdXRwdXRfbWF4X2xlbmd0aCwgX291dHB1dF9sZW5ndGggKTsKKwkJfQorCX0gZWxzZSB7CisJCSpvdXRwdXRfbGVuZ3RoID0gX291dHB1dF9sZW5ndGg7CisJfQorCWlmICggb3V0cHV0ICE9IE5VTEwgKSB7CisJCWlmICggX291dHB1dF9sZW5ndGggPiBvdXRwdXRfbWF4X2xlbmd0aCApIHsKKwkJCXByaW50ZiAoICJwbmljX2NvbW1hbmQgJSNoeDogb3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgIgorCQkJCSAiKGhhdmUgJWQsIG5lZWQgJWQpXG4iLCBjb21tYW5kLAorCQkJCSBvdXRwdXRfbWF4X2xlbmd0aCwgX291dHB1dF9sZW5ndGggKTsKKwkJCV9vdXRwdXRfbGVuZ3RoID0gb3V0cHV0X21heF9sZW5ndGg7CisJCX0KKwkJLyogUmV0cmlldmUgb3V0cHV0IGRhdGEgKi8KKwkJaW5zYiAoIHBuaWMtPmlvYWRkciArIFBOSUNfUkVHX0RBVEEsIG91dHB1dCwgX291dHB1dF9sZW5ndGggKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHVpbnQxNl90IHBuaWNfY29tbWFuZCAoIHN0cnVjdCBwbmljICpwbmljLCB1aW50MTZfdCBjb21tYW5kLAorCQkJICAgICAgIGNvbnN0IHZvaWQgKmlucHV0LCB1aW50MTZfdCBpbnB1dF9sZW5ndGgsCisJCQkgICAgICAgdm9pZCAqb3V0cHV0LCB1aW50MTZfdCBvdXRwdXRfbWF4X2xlbmd0aCwKKwkJCSAgICAgICB1aW50MTZfdCAqb3V0cHV0X2xlbmd0aCApIHsKKwl1aW50MTZfdCBzdGF0dXMgPSBwbmljX2NvbW1hbmRfcXVpZXQgKCBwbmljLCBjb21tYW5kLAorCQkJCQkgICAgICAgaW5wdXQsIGlucHV0X2xlbmd0aCwKKwkJCQkJICAgICAgIG91dHB1dCwgb3V0cHV0X21heF9sZW5ndGgsCisJCQkJCSAgICAgICBvdXRwdXRfbGVuZ3RoICk7CisJaWYgKCBzdGF0dXMgPT0gUE5JQ19TVEFUVVNfT0sgKSByZXR1cm4gc3RhdHVzOworCXByaW50ZiAoICJQTklDIGNvbW1hbmQgJSNoeCAobGVuICUjaHgpIGZhaWxlZCB3aXRoIHN0YXR1cyAlI2h4XG4iLAorCQkgY29tbWFuZCwgaW5wdXRfbGVuZ3RoLCBzdGF0dXMgKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDaGVjayBBUEkgdmVyc2lvbiBtYXRjaGVzIHRoYXQgb2YgTklDICovCitzdGF0aWMgaW50IHBuaWNfYXBpX2NoZWNrICggdWludDE2X3QgYXBpX3ZlcnNpb24gKSB7CisJaWYgKCBhcGlfdmVyc2lvbiAhPSBQTklDX0FQSV9WRVJTSU9OICkgeworCQlwcmludGYgKCAiV2FybmluZzogQVBJIHZlcnNpb24gbWlzbWF0Y2ghICIKKwkJCSAiKE5JQydzIGlzICVkLiVkLCBvdXJzIGlzICVkLiVkKVxuIiwKKwkJCSBhcGlfdmVyc2lvbiA+PiA4LCBhcGlfdmVyc2lvbiAmIDB4ZmYsCisJCQkgUE5JQ19BUElfVkVSU0lPTiA+PiA4LCBQTklDX0FQSV9WRVJTSU9OICYgMHhmZiApOworCX0KKwlpZiAoIGFwaV92ZXJzaW9uIDwgUE5JQ19BUElfVkVSU0lPTiApIHsKKwkJcHJpbnRmICggIioqIFlvdSBtYXkgbmVlZCB0byB1cGRhdGUgeW91ciBjb3B5IG9mIEJvY2hzICoqXG4iICk7CisJfQorCXJldHVybiAoIGFwaV92ZXJzaW9uID09IFBOSUNfQVBJX1ZFUlNJT04gKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcG5pY19wb2xsICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgcG5pYyAqcG5pYyA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgcWxlbjsKKworCS8qIEZldGNoIGFsbCBhdmFpbGFibGUgcGFja2V0cyAqLworCXdoaWxlICggMSApIHsKKwkJaWYgKCBwbmljX2NvbW1hbmQgKCBwbmljLCBQTklDX0NNRF9SRUNWX1FMRU4sIE5VTEwsIDAsCisJCQkJICAgICZxbGVuLCBzaXplb2YgKCBxbGVuICksIE5VTEwgKQorCQkgICAgICE9IFBOSUNfU1RBVFVTX09LICkKKwkJCXJldHVybjsKKwkJaWYgKCBxbGVuID09IDAgKQorCQkJcmV0dXJuOworCQlpb2J1ZiA9IGFsbG9jX2lvYiAoIEVUSF9GUkFNRV9MRU4gKTsKKwkJaWYgKCAhIGlvYnVmICkgeworCQkJREJHICggImNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXJcbiIgKTsKKwkJCW5ldGRldl9yeF9lcnIgKCBuZXRkZXYsIE5VTEwsIC1FTk9NRU0gKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIHBuaWNfY29tbWFuZCAoIHBuaWMsIFBOSUNfQ01EX1JFQ1YsIE5VTEwsIDAsCisJCQkJICAgIGlvYnVmLT5kYXRhLCBFVEhfRlJBTUVfTEVOLCAmbGVuZ3RoICkKKwkJICAgICAhPSBQTklDX1NUQVRVU19PSyApIHsKKwkJCW5ldGRldl9yeF9lcnIgKCBuZXRkZXYsIGlvYnVmLCAtRUlPICk7CisJCQlyZXR1cm47CisJCX0KKwkJaW9iX3B1dCAoIGlvYnVmLCBsZW5ndGggKTsKKwkJbmV0ZGV2X3J4ICggbmV0ZGV2LCBpb2J1ZiApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcG5pY190cmFuc21pdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXN0cnVjdCBwbmljICpwbmljID0gbmV0ZGV2LT5wcml2OworCisJLyogUGFkIHRoZSBwYWNrZXQgKi8KKwlpb2JfcGFkICggaW9idWYsIEVUSF9aTEVOICk7CisKKwkvKiBTZW5kIHBhY2tldCAqLworCXBuaWNfY29tbWFuZCAoIHBuaWMsIFBOSUNfQ01EX1hNSVQsIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSwKKwkJICAgICAgIE5VTEwsIDAsIE5VTEwgKTsKKworCW5ldGRldl90eF9jb21wbGV0ZSAoIG5ldGRldiwgaW9idWYgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitPUEVOIC0gT3BlbiBuZXR3b3JrIGRldmljZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwbmljX29wZW4gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2IF9fdW51c2VkICkgeworCS8qIE5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDTE9TRSAtIENsb3NlIG5ldHdvcmsgZGV2aWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwbmljX2Nsb3NlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiBfX3VudXNlZCApIHsKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVJRIC0gRW5hYmxlL2Rpc2FibGUgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcG5pY19pcnEgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgZW5hYmxlICkgeworCXN0cnVjdCBwbmljICpwbmljID0gbmV0ZGV2LT5wcml2OworCXVpbnQ4X3QgbWFzayA9ICggZW5hYmxlID8gMSA6IDAgKTsKKwkKKwlwbmljX2NvbW1hbmQgKCBwbmljLCBQTklDX0NNRF9NQVNLX0lSUSwgJm1hc2ssIHNpemVvZiAoIG1hc2sgKSwKKwkJICAgICAgIE5VTEwsIDAsIE5VTEwgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitPUEVSQVRJT05TIFRBQkxFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BlcmF0aW9ucyBwbmljX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gcG5pY19vcGVuLAorCS5jbG9zZQkJPSBwbmljX2Nsb3NlLAorCS50cmFuc21pdAk9IHBuaWNfdHJhbnNtaXQsCisJLnBvbGwJCT0gcG5pY19wb2xsLAorCS5pcnEgICAJCT0gcG5pY19pcnEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBuaWNfcmVtb3ZlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhICggcGNpICk7CisJc3RydWN0IHBuaWMgKnBuaWMgPSBuZXRkZXYtPnByaXY7CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoIG5ldGRldiApOworCXBuaWNfY29tbWFuZCAoIHBuaWMsIFBOSUNfQ01EX1JFU0VULCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMICk7CisJbmV0ZGV2X251bGxpZnkgKCBuZXRkZXYgKTsKKwluZXRkZXZfcHV0ICggbmV0ZGV2ICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBuaWNfcHJvYmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkIF9fdW51c2VkICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHBuaWMgKnBuaWM7CisJdWludDE2X3QgYXBpX3ZlcnNpb247CisJdWludDE2X3Qgc3RhdHVzOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIG5ldCBkZXZpY2UgKi8KKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldiAoIHNpemVvZiAoICpwbmljICkgKTsKKwlpZiAoICEgbmV0ZGV2ICkKKwkJcmV0dXJuIC1FTk9NRU07CisJbmV0ZGV2X2luaXQgKCBuZXRkZXYsICZwbmljX29wZXJhdGlvbnMgKTsKKwlwbmljID0gbmV0ZGV2LT5wcml2OworCXBjaV9zZXRfZHJ2ZGF0YSAoIHBjaSwgbmV0ZGV2ICk7CisJbmV0ZGV2LT5kZXYgPSAmcGNpLT5kZXY7CisJcG5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHI7CisKKwkvKiBGaXggdXAgUENJIGRldmljZSAqLworCWFkanVzdF9wY2lfZGV2aWNlICggcGNpICk7CisJCisJLyogQVBJIHZlcnNpb24gY2hlY2sgKi8KKwlzdGF0dXMgPSBwbmljX2NvbW1hbmRfcXVpZXQgKCBwbmljLCBQTklDX0NNRF9BUElfVkVSLCBOVUxMLCAwLAorCQkJCSAgICAgICZhcGlfdmVyc2lvbiwKKwkJCQkgICAgICBzaXplb2YgKCBhcGlfdmVyc2lvbiApLCBOVUxMICk7CisJaWYgKCBzdGF0dXMgIT0gUE5JQ19TVEFUVVNfT0sgKSB7CisJCXByaW50ZiAoICJQTklDIGZhaWxlZCBpbnN0YWxsYXRpb24gY2hlY2ssIGNvZGUgJSNoeFxuIiwKKwkJCSBzdGF0dXMgKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CisJcG5pY19hcGlfY2hlY2sgKCBhcGlfdmVyc2lvbiApOworCisJLyogR2V0IE1BQyBhZGRyZXNzICovCisJc3RhdHVzID0gcG5pY19jb21tYW5kICggcG5pYywgUE5JQ19DTURfUkVBRF9NQUMsIE5VTEwsIDAsCisJCQkJbmV0ZGV2LT5od19hZGRyLCBFVEhfQUxFTiwgTlVMTCApOworCisJLyogTWFyayBhcyBsaW5rIHVwOyBQTklDIGhhcyBubyBjb25jZXB0IG9mIGxpbmsgc3RhdGUgKi8KKwluZXRkZXZfbGlua191cCAoIG5ldGRldiApOworCisJLyogUmVnaXN0ZXIgbmV0d29yayBkZXZpY2UgKi8KKwlpZiAoICggcmMgPSByZWdpc3Rlcl9uZXRkZXYgKCBuZXRkZXYgKSApICE9IDAgKQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworCisgZXJyOgorCS8qIEZyZWUgbmV0IGRldmljZSAqLworCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBuaWNfbmljc1tdID0geworLyogZ2VucnVsZXMucGwgZG9lc24ndCBsZXQgdXMgdXNlIG1hY3JvcyBmb3IgUENJIElEcy4uLiovCitQQ0lfUk9NICggMHhmZWZlLCAweGVmZWYsICJwbmljIiwgIkJvY2hzIFBzZXVkbyBOSUMgQWRhcHRvciIsIDAgKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHBuaWNfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzID0gcG5pY19uaWNzLAorCS5pZF9jb3VudCA9ICggc2l6ZW9mICggcG5pY19uaWNzICkgLyBzaXplb2YgKCBwbmljX25pY3NbMF0gKSApLAorCS5wcm9iZSA9IHBuaWNfcHJvYmUsCisJLnJlbW92ZSA9IHBuaWNfcmVtb3ZlLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3BuaWNfYXBpLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9wbmljX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTAyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9wbmljX2FwaS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb25zdGFudHMgZXRjLiBmb3IgdGhlIEJvY2hzL0V0aGVyYm9vdCBwc2V1ZG8tTklDCisgKiAKKyAqIFRoaXMgaGVhZGVyIGZpbGUgbXVzdCBiZSB2YWxpZCBDIGFuZCBDKysuCisgKgorICogT3BlcmF0aW9uIG9mIHRoZSBwc2V1ZG8tTklDIChQTklDKSBpcyBwcmV0dHkgc2ltcGxlLiAgVG8gd3JpdGUgYQorICogY29tbWFuZCBwbHVzIGRhdGEsIGZpcnN0IHdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8KKyAqIFBOSUNfUkVHX0xFTiwgdGhlbiB3cml0ZSB0aGUgZGF0YSBhIGJ5dGUgYXQgYSB0eXBlIHRvCisgKiBQTklDX1JFR19EQVRBLCB0aGVuIHdyaXRlIHRoZSBjb21tYW5kIGNvZGUgdG8gUE5JQ19SRUdfQ01ELiAgVGhlCisgKiBzdGF0dXMgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSBQTklDX1JFR19TVEFULiAgVGhlIGxlbmd0aCBvZiBhbnkKKyAqIGRhdGEgcmV0dXJuZWQgd2lsbCBiZSBpbiBQTklDX1JFR19MRU4gYW5kIGNhbiBiZSByZWFkIGEgYnl0ZSBhdCBhCisgKiB0aW1lIGZyb20gUE5JQ19SRUdfREFUQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qCisgKiBQQ0kgcGFyYW1ldGVycworICovCisjZGVmaW5lIFBOSUNfUENJX1ZFTkRPUgkweGZlZmUJLyogSG9wZWZ1bGx5IHRoZXNlIHdvbid0IGNsYXNoIHdpdGggKi8KKyNkZWZpbmUgUE5JQ19QQ0lfREVWSUNFIDB4ZWZlZgkvKiBhbnkgcmVhbCBQQ0kgZGV2aWNlIElEcy4gICAgICAgICAqLworCisvKgorICogJ0hhcmR3YXJlJyByZWdpc3RlciBhZGRyZXNzZXMsIG9mZnNldCBmcm9tIGlvX2Jhc2UKKyAqLworI2RlZmluZSBQTklDX1JFR19DTUQJMHgwMAkvKiBDb21tYW5kIHJlZ2lzdGVyLCAyIGJ5dGVzLCB3cml0ZSBvbmx5ICovCisjZGVmaW5lIFBOSUNfUkVHX1NUQVQJMHgwMAkvKiBTdGF0dXMgcmVnaXN0ZXIsIDIgYnl0ZXMsIHJlYWQgb25seSAqLworI2RlZmluZSBQTklDX1JFR19MRU4JMHgwMgkvKiBMZW5ndGggcmVnaXN0ZXIsIDIgYnl0ZXMsIHJlYWQtd3JpdGUgKi8KKyNkZWZpbmUgUE5JQ19SRUdfREFUQQkweDA0CS8qIERhdGEgcG9ydCwgMSBieXRlLCByZWFkLXdyaXRlICovCisvKgorICogUE5JQ19NQVhfUkVHIHVzZWQgaW4gQm9jaHMgdG8gY2xhaW0gaS9vIHNwYWNlCisgKi8KKyNkZWZpbmUgUE5JQ19NQVhfUkVHCTB4MDQKKworLyoKKyAqIENvbW1hbmQgY29kZSBkZWZpbml0aW9uczogd3JpdGUgdGhlc2UgaW50byBQTklDX1JFR19DTUQKKyAqLworI2RlZmluZSBQTklDX0NNRF9OT09QCQkweDAwMDAKKyNkZWZpbmUgUE5JQ19DTURfQVBJX1ZFUgkweDAwMDEKKyNkZWZpbmUgUE5JQ19DTURfUkVBRF9NQUMJMHgwMDAyCisjZGVmaW5lIFBOSUNfQ01EX1JFU0VUCQkweDAwMDMKKyNkZWZpbmUgUE5JQ19DTURfWE1JVAkJMHgwMDA0CisjZGVmaW5lIFBOSUNfQ01EX1JFQ1YJCTB4MDAwNQorI2RlZmluZSBQTklDX0NNRF9SRUNWX1FMRU4JMHgwMDA2CisjZGVmaW5lIFBOSUNfQ01EX01BU0tfSVJRCTB4MDAwNworI2RlZmluZSBQTklDX0NNRF9GT1JDRV9JUlEJMHgwMDA4CisKKy8qCisgKiBTdGF0dXMgY29kZSBkZWZpbml0aW9uczogcmVhZCB0aGVzZSBmcm9tIFBOSUNfUkVHX1NUQVQKKyAqCisgKiBXZSBhdm9pZCB1c2luZyBzdGF0dXMgY29kZXMgdGhhdCBtaWdodCBiZSBjb25mdXNlZCB3aXRoCisgKiByYW5kb21seS1yZWFkIGRhdGEgKGUuZy4gMHgwMDAwLCAweGZmZmYgZXRjLikKKyAqLworI2RlZmluZSBQTklDX1NUQVRVU19PSwkJMHg0ZjRiCQkvKiAnT0snICovCisjZGVmaW5lIFBOSUNfU1RBVFVTX1VOS05PV05fQ01ECTB4M2YzZgkJLyogJz8/JyAqLworCisvKgorICogT3RoZXIgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbgorICovCisKKyNkZWZpbmUgUE5JQ19BUElfVkVSU0lPTgkweDAxMDEJCS8qIDEuMSAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcHJpc20yLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9wcmlzbTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY2NTkyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcHJpc20yLmMKQEAgLTAsMCArMSw4NTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRXRoZXJib290IC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KK1ByaXNtMiBOSUMgZHJpdmVyIGZvciBFdGhlcmJvb3QKKworV3JpdHRlbiBieSBNaWNoYWVsIEJyb3duIG9mIEZlbiBTeXN0ZW1zIEx0ZAorJElkJAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxldGhlcmJvb3QuaD4KKyNpbmNsdWRlIDxuaWMuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKworLyoKKyAqIEhhcmQtY29kZWQgU1NJRAorICogTGVhdmUgYmxhbmsgaW4gb3JkZXIgdG8gY29ubmVjdCB0byBhbnkgYXZhaWxhYmxlIFNTSUQKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciBoYXJkY29kZWRfc3NpZFtdID0gIiI7CisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBpbmZvIHBhY2tldHMgdG8gd2FpdCBmb3Igb24gYSBqb2luIGF0dGVtcHQuCisgKiBTb21lIEFQcyAoaW5jbHVkaW5nIHRoZSBMaW5rc3lzIFdBUDExKSB3aWxsIHNlbmQgYSAieW91IGFyZSBkaXNjb25uZWN0ZWQiIHBhY2tldAorICogYmVmb3JlIHNlbmRpbmcgdGhlICJ5b3UgYXJlIGNvbm5lY3RlZCIgcGFja2V0LCBpZiB0aGUgY2FyZCBoYXMgcHJldmlvdXNseSBiZWVuCisgKiBhdHRhY2hlZCB0byB0aGUgQVAuCisgKgorICogMiBpcyBwcm9iYWJseSBhIHNlbnNpYmxlIHZhbHVlLCBidXQgWU1NVi4KKyAqLworCisjZGVmaW5lIE1BWF9KT0lOX0lORk9fQ09VTlQgMgorCisvKgorICogVHlwZSBvZiBQcmlzbTIgaW50ZXJmYWNlIHRvIHN1cHBvcnQKKyAqIElmIG5vdCBhbHJlYWR5IGRlZmluZWQsIHNlbGVjdCBQTFgKKyAqLworI2lmbmRlZiBXTEFOX0hPU1RJRgorI2RlZmluZSBXTEFOX0hPU1RJRiBXTEFOX1BMWAorI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlIHdsYW5fY29tcGF0LCBwODAyMTEgYW5kIGhmYTM4NHggaGVhZGVyIGZpbGVzIGZyb20gTGludXggUHJpc20yIGRyaXZlcgorICogV2UgbmVlZCB0byBoYWNrIHNvbWUgZGVmaW5lcyBpbiBvcmRlciB0byBhdm9pZCBjb21waWxpbmcga2VybmVsLXNwZWNpZmljIHJvdXRpbmVzCisgKi8KKworI2RlZmluZSBfX0xJTlVYX1dMQU5fXworI3VuZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgX19JMzg2X18KKyNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgorI2luY2x1ZGUgInA4MDIxMWhkci5oIgorI2luY2x1ZGUgImhmYTM4NHguaCIKKyNkZWZpbmUgQkFQX1RJTUVPVVQgKCA1MDAwICkKKworLyoKKyAqIEEgZmV3IGhhY2tzIHRvIG1ha2UgdGhlIGNvZGluZyBlbnZpcm9ubWVudCBtb3JlIExpbnV4LWxpa2UuICBUaGlzIG1ha2VzIGl0IHNvbWV3aGF0CisgKiBxdWlja2VyIHRvIGNvbnZlcnQgY29kZSBmcm9tIHRoZSBMaW51eCBQcmlzbTIgZHJpdmVyLgorICovCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNkZWZpbmUgX19sZTE2X3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoeCkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoeCkKKworI2RlZmluZSBoZmEzODR4Mmhvc3RfMTYobikJKF9fbGUxNl90b19jcHUoKFVJTlQxNikobikpKQorI2RlZmluZSBoZmEzODR4Mmhvc3RfMzIobikJKF9fbGUzMl90b19jcHUoKFVJTlQzMikobikpKQorI2RlZmluZSBob3N0MmhmYTM4NHhfMTYobikJKF9fY3B1X3RvX2xlMTYoKFVJTlQxNikobikpKQorI2RlZmluZSBob3N0MmhmYTM4NHhfMzIobikJKF9fY3B1X3RvX2xlMzIoKFVJTlQzMikobikpKQorCisvKgorICogUExYOTA1MiBQQ0kgcmVnaXN0ZXIgb2Zmc2V0cworICogVGFrZW4gZnJvbSBQTFg5MDUyIGRhdGFzaGVldCBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LnBseHRlY2guY29tL2Rvd25sb2FkLzkwNTIvZGF0YWJvb2svOTA1MmRiLTIwLnBkZgorICovCisKKyNkZWZpbmUgUExYX0xPQ0FMX0NPTkZJR19SRUdJU1RFUl9CQVNFICggUENJX0JBU0VfQUREUkVTU18xICkKKyNkZWZpbmUgUExYX0xPQ0FMX0FERFJFU1NfU1BBQ0VfMF9CQVNFICggUENJX0JBU0VfQUREUkVTU18yICkKKyNkZWZpbmUgUExYX0xPQ0FMX0FERFJFU1NfU1BBQ0VfMV9CQVNFICggUENJX0JBU0VfQUREUkVTU18zICkKKyNkZWZpbmUgUExYX0xPQ0FMX0FERFJFU1NfU1BBQ0VfMl9CQVNFICggUENJX0JBU0VfQUREUkVTU180ICkKKyNkZWZpbmUgUExYX0xPQ0FMX0FERFJFU1NfU1BBQ0VfM19CQVNFICggUENJX0JBU0VfQUREUkVTU181ICkKKworI2RlZmluZSBQUklTTTJfUExYX0FUVFJfTUVNX0JBU0UgICAgICAgKCBQTFhfTE9DQUxfQUREUkVTU19TUEFDRV8wX0JBU0UgKQorI2RlZmluZSBQUklTTTJfUExYX0lPX0JBU0UgICAgICAgICAgICAgKCBQTFhfTE9DQUxfQUREUkVTU19TUEFDRV8xX0JBU0UgKQorCisjZGVmaW5lIFBSSVNNMl9QQ0lfTUVNX0JBU0UgICAgICAgICAgICAoIFBDSV9CQVNFX0FERFJFU1NfMCApCisKKy8qCisgKiBQQ01DSUEgQ0lTIHR5cGVzCisgKiBUYWtlbiBmcm9tIGNpc3RwbC5oIGluIHBjbWNpYS1jcworICovCisKKyNkZWZpbmUgQ0lTVFBMX1ZFUlNfMSAgICAgICAgICAgKCAweDE1ICkKKyNkZWZpbmUgQ0lTVFBMX0VORCAgICAgICAgICAgICAgKCAweGZmICkKKworI2RlZmluZSBDSVNfU1RFUCAgICAgICAgICAgICAgICAoIDIgKQorI2RlZmluZSBDSVNUUExfSEVBREVSX0xFTiAgICAgICAoIDIgKiBDSVNfU1RFUCApCisjZGVmaW5lIENJU1RQTF9MRU5fT0ZGICAgICAgICAgICggMSAqIENJU19TVEVQICkKKyNkZWZpbmUgQ0lTVFBMX1ZFUlNfMV9TVFJfT0ZGICAgKCA0ICogQ0lTX1NURVAgKQorCisvKgorICogUHJpc20yIGNvbnN0YW50cworICogVGFrZW4gZnJvbSBwcmlzbTJzdGEuYyBpbiBsaW51eC13bGFuLW5nCisgKi8KKworI2RlZmluZSBDT1JfT0ZGU0VUICAgICAgKCAweDNlMCApICAgLyogQ09SIGF0dHJpYnV0ZSBvZmZzZXQgb2YgUHJpc20yIFBDIGNhcmQgKi8KKyNkZWZpbmUgQ09SX1ZBTFVFICAgICAgICggMHg0MSApICAgIC8qIEVuYWJsZSBQQyBjYXJkIHdpdGggaXJxIGluIGxldmVsIHRyaWdnZXIgKGJ1dCBpbnRlcnJ1cHRzIGRpc2FibGVkKSAqLworCisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyAqLworCisvKiBUaGUgaGZhMzg0eF90IHN0cnVjdHVyZSBpcyB1c2VkIGV4dGVuc2l2ZWx5IGluIHRoZSBMaW51eCBkcml2ZXIgYnV0IGlzIGlmZGVmJ2Qgb3V0IGluIG91ciBpbmNsdWRlIHNpbmNlIF9fS0VSTkVMX18gaXMgbm90IGRlZmluZWQuCisgKiBUaGlzIGlzIGEgZHVtbXkgdmVyc2lvbiB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGZpZWxkcyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBoZmEzODR4Cit7CisgIFVJTlQzMiBpb2Jhc2U7CisgIHZvaWQgKm1lbWJhc2U7CisgIFVJTlQxNiBsYXN0Y21kOworICBVSU5UMTYgc3RhdHVzOyAgICAgICAgIC8qIGluIGhvc3Qgb3JkZXIgKi8KKyAgVUlOVDE2IHJlc3AwOyAgICAgICAgICAvKiBpbiBob3N0IG9yZGVyICovCisgIFVJTlQxNiByZXNwMTsgICAgICAgICAgLyogaW4gaG9zdCBvcmRlciAqLworICBVSU5UMTYgcmVzcDI7ICAgICAgICAgIC8qIGluIGhvc3Qgb3JkZXIgKi8KKyAgVUlOVDggIGJzc2lkW1dMQU5fQlNTSURfTEVOXTsKK30gaGZhMzg0eF90OworCisvKiBUaGUgZ2xvYmFsIGluc3RhbmNlIG9mIHRoZSBoYXJkd2FyZSAoaS5lLiB3aGVyZSB3ZSBzdG9yZSBpb2Jhc2UgYW5kIG1lbWJhc2UsIGluIHRoZSBhYnNlbmNlIG9mIGFueXdoZXJlIGJldHRlciB0byBwdXQgdGhlbSAqLworc3RhdGljIGhmYTM4NHhfdCBod19nbG9iYWwgPSB7CisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLDAsMCwwLDAsMH0KK307CisKKy8qCisgKiA4MDIuMTEgaGVhZGVycyBpbiBhZGRpdGlvbiB0byB0aG9zZSBpbiBoZmEzODR4X3R4X2ZyYW1lX3QgKExMQyBhbmQgU05BUCkKKyAqIFRha2VuIGZyb20gcDgwMjExY29udi5oCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgd2xhbl9sbGMKK3sKKyAgVUlOVDggICBkc2FwOworICBVSU5UOCAgIHNzYXA7CisgIFVJTlQ4ICAgY3RsOworfSAgd2xhbl9sbGNfdDsKKworc3RhdGljIGNvbnN0IHdsYW5fbGxjX3Qgd2xhbl9sbGNfc25hcCA9IHsgMHhhYSwgMHhhYSwgMHgwMyB9OyAvKiBMTEMgaGVhZGVyIGluZGljYXRpbmcgU05BUCAoPykgKi8KKworI2RlZmluZSBXTEFOX0lFRUVfT1VJX0xFTiAzCit0eXBlZGVmIHN0cnVjdCB3bGFuX3NuYXAKK3sKKyAgVUlOVDggICBvdWlbV0xBTl9JRUVFX09VSV9MRU5dOworICBVSU5UMTYgIHR5cGU7Cit9IHdsYW5fc25hcF90OworCit0eXBlZGVmIHN0cnVjdCB3bGFuXzgwMjExaGRyCit7CisgIHdsYW5fbGxjX3QgbGxjOworICB3bGFuX3NuYXBfdCBzbmFwOworfSB3bGFuXzgwMjExaGRyX3Q7CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKworLyoKKyAqIEhhcmR3YXJlLWxldmVsIGhmYTM4NHggZnVuY3Rpb25zCisgKiBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIG9uZXMgaW4gaGZhMzg0eC5oICh3aGljaCBhcmUgaWZkZWYnZCBvdXQgc2luY2UgX19LRVJORUxfXyBpcyBub3QgZGVmaW5lZCkuCisgKiBCYXNpY2FsbHksIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlIHJlc3VsdCBvZiBoYW5kLWV2YWx1YXRpbmcgYWxsIHRoZSBpZmRlZnMgYW5kIGRlZmluZXMgaW4gdGhlIGhmYTM4NHguaCB2ZXJzaW9ucy4gCisgKi8KKworLyogUmV0cmlldmUgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGUgTUFDIHJlZ2lzdGVycy4gKi8KK3N0YXRpYyBpbmxpbmUgVUlOVDE2IGhmYTM4NHhfZ2V0cmVnKCBoZmEzODR4X3QgKmh3LCBVSU5UIHJlZyApCit7CisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKQorICByZXR1cm4gaW53ICggaHctPmlvYmFzZSArIHJlZyApOworI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorICByZXR1cm4gcmVhZHcgKCBody0+bWVtYmFzZSArIHJlZyApOworI2VuZGlmCit9CisKKy8qIFNldCB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZSBNQUMgcmVnaXN0ZXJzLiAqLworc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfc2V0cmVnKCBoZmEzODR4X3QgKmh3LCBVSU5UMTYgdmFsLCBVSU5UIHJlZyApCit7CisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKQorICBvdXR3ICggdmFsLCBody0+aW9iYXNlICsgcmVnICk7CisjZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisgIHdyaXRldyAoIHZhbCwgaHctPm1lbWJhc2UgKyByZWcgKTsKKyNlbmRpZgorICByZXR1cm47Cit9CisKKy8qIAorICogTm9zd2FwIHZlcnNpb25zCisgKiBFdGhlcmJvb3QgaXMgaTM4NiBvbmx5LCBzbyBzd2FwIGFuZCBub3N3YXAgYXJlIHRoZSBzYW1lLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgVUlOVDE2IGhmYTM4NHhfZ2V0cmVnX25vc3dhcCggaGZhMzg0eF90ICpodywgVUlOVCByZWcgKQoreworICByZXR1cm4gaGZhMzg0eF9nZXRyZWcgKCBodywgcmVnICk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgaGZhMzg0eF9zZXRyZWdfbm9zd2FwKCBoZmEzODR4X3QgKmh3LCBVSU5UMTYgdmFsLCBVSU5UIHJlZyApCit7CisgIGhmYTM4NHhfc2V0cmVnICggaHcsIHZhbCwgcmVnICk7Cit9CisKKy8qCisgKiBMb3ctbGV2ZWwgaGZhMzg0eCBmdW5jdGlvbnMKKyAqIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUgb25lcyBpbiBoZmEzODR4LmMsIG1vZGlmaWVkIHRvIHdvcmsgaW4gdGhlIEV0aGVyYm9vdCBlbnZpcm9ubWVudC4KKyAqLworCisvKgorICogaGZhMzg0eF9kb2NtZF93YWl0CisgKgorICogV2FpdHMgZm9yIGF2YWlsYWJpbGl0eSBvZiB0aGUgQ29tbWFuZCByZWdpc3RlciwgdGhlbgorICogaXNzdWVzIHRoZSBnaXZlbiBjb21tYW5kLiAgVGhlbiBwb2xscyB0aGUgRXZzdGF0IHJlZ2lzdGVyCisgKiB3YWl0aW5nIGZvciBjb21tYW5kIGNvbXBsZXRpb24uCisgKiBBcmd1bWVudHM6CisgKiAgICAgICBodyAgICAgICAgICAgICAgZGV2aWNlIHN0cnVjdHVyZQorICogICAgICAgY21kICAgICAgICAgICAgIENvbW1hbmQgaW4gaG9zdCBvcmRlcgorICogICAgICAgcGFybTAgICAgICAgICAgIFBhcmFtZXRlcjAgaW4gaG9zdCBvcmRlcgorICogICAgICAgcGFybTEgICAgICAgICAgIFBhcmFtZXRlcjEgaW4gaG9zdCBvcmRlcgorICogICAgICAgcGFybTIgICAgICAgICAgIFBhcmFtZXRlcjIgaW4gaG9zdCBvcmRlcgorICogUmV0dXJuczoKKyAqICAgICAgIDAgICAgICAgICAgICAgICBzdWNjZXNzCisgKiAgICAgICA+MCAgICAgICAgICAgICAgY29tbWFuZCBpbmRpY2F0ZWQgZXJyb3IsIFN0YXR1cyBhbmQgUmVzcDAtMiBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbiBodyBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgaGZhMzg0eF9kb2NtZF93YWl0KCBoZmEzODR4X3QgKmh3LCBVSU5UMTYgY21kLCBVSU5UMTYgcGFybTAsIFVJTlQxNiBwYXJtMSwgVUlOVDE2IHBhcm0yKQoreworICBVSU5UMTYgcmVnID0gMDsKKyAgVUlOVDE2IGNvdW50ZXIgPSAwOworICAKKyAgLyogd2FpdCBmb3IgdGhlIGJ1c3kgYml0IHRvIGNsZWFyICovCQorICBjb3VudGVyID0gMDsKKyAgcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKKyAgd2hpbGUgKCBIRkEzODR4X0NNRF9JU0JVU1kocmVnKSAmJiAoY291bnRlciA8IDEwKSApIHsKKyAgICByZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOworICAgIGNvdW50ZXIrKzsKKyAgICB1ZGVsYXkoMTApOworICB9CisgIGlmIChIRkEzODR4X0NNRF9JU0JVU1kocmVnKSkgeworICAgIHByaW50ZigiaGZhMzg0eF9jbWQgdGltZW91dCgxKSwgcmVnPTB4JTBoeC5cbiIsIHJlZyk7CisgICAgcmV0dXJuIC1FVElNRURPVVQ7CisgIH0KKworICAvKiBidXN5IGJpdCBjbGVhciwgd3JpdGUgY29tbWFuZCAqLworICBoZmEzODR4X3NldHJlZyhodywgcGFybTAsIEhGQTM4NHhfUEFSQU0wKTsKKyAgaGZhMzg0eF9zZXRyZWcoaHcsIHBhcm0xLCBIRkEzODR4X1BBUkFNMSk7CisgIGhmYTM4NHhfc2V0cmVnKGh3LCBwYXJtMiwgSEZBMzg0eF9QQVJBTTIpOworICBody0+bGFzdGNtZCA9IGNtZDsKKyAgaGZhMzg0eF9zZXRyZWcoaHcsIGNtZCwgSEZBMzg0eF9DTUQpOworICAKKyAgLyogTm93IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyAgY291bnRlciA9IDA7CisgIHJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7CisgIC8qIEluaXRpYWxpemF0aW9uIGlzIHRoZSBwcm9ibGVtLiAgSXQgdGFrZXMgYWJvdXQKKyAgICAgMTAwbXMuICJub3JtYWwiIGNvbW1hbmRzIGFyZSB0eXBpY2FsbHkgaXMgYWJvdXQKKyAgICAgMjAwLTQwMCB1cyAoSSd2ZSBuZXZlciBzZWVuIGxlc3MgdGhhbiAyMDApLiAgTG9uZ2VyCisgICAgIGlzIGJldHRlciBzbyB0aGF0IHdlJ3JlIG5vdCBoYW1tZXJpbmcgdGhlIGJ1cy4gKi8KKyAgd2hpbGUgKCAhSEZBMzg0eF9FVlNUQVRfSVNDTUQocmVnKSAmJiAoY291bnRlciA8IDUwMDApKSB7CisgICAgcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKKyAgICBjb3VudGVyKys7CisgICAgdWRlbGF5KDIwMCk7CisgIH0KKyAgaWYgKCAhIEhGQTM4NHhfRVZTVEFUX0lTQ01EKHJlZykgKSB7CisgICAgcHJpbnRmKCJoZmEzODR4X2NtZCB0aW1lb3V0KDIpLCByZWc9MHglMGh4LlxuIiwgcmVnKTsKKyAgICByZXR1cm4gLUVUSU1FRE9VVDsKKyAgfQorCisgIC8qIFJlYWQgc3RhdHVzIGFuZCByZXNwb25zZSAqLworICBody0+c3RhdHVzID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfU1RBVFVTKTsKKyAgaHctPnJlc3AwID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDApOworICBody0+cmVzcDEgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMSk7CisgIGh3LT5yZXNwMiA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AyKTsKKyAgaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfQ01ELCBIRkEzODR4X0VWQUNLKTsKKyAgcmV0dXJuIEhGQTM4NHhfU1RBVFVTX1JFU1VMVF9HRVQoaHctPnN0YXR1cyk7Cit9CisKKy8qCisgKiBQcmVwYXJlIEJBUCBmb3IgYWNjZXNzLiAgQXNzaWducyBGSUQgYW5kIFJJRCwgc2V0cyBvZmZzZXQgcmVnaXN0ZXIKKyAqIGFuZCB3YWl0cyBmb3IgQkFQIHRvIGJlY29tZSBhdmFpbGFibGUuCisgKgorICogQXJndW1lbnRzOgorICoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKKyAqCWlkCQlGSUQgb3IgUklELCBkZXN0aW5lZCBmb3IgdGhlIHNlbGVjdCByZWdpc3RlciAoaG9zdCBvcmRlcikKKyAqCW9mZnNldAkJQW4gX2V2ZW5fIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZm9yIHRoZSBnaXZlbiBGSUQvUklELgorICogUmV0dXJuczogCisgKgkwCQlzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgaGZhMzg0eF9wcmVwYXJlX2JhcChoZmEzODR4X3QgKmh3LCBVSU5UMTYgaWQsIFVJTlQxNiBvZmZzZXQpCit7CisgIGludCByZXN1bHQgPSAwOworICBVSU5UMTYgcmVnOworICBVSU5UMTYgaTsKKworICAvKiBWYWxpZGF0ZSBvZmZzZXQsIGJ1ZiwgYW5kIGxlbiAqLworICBpZiAoIChvZmZzZXQgPiBIRkEzODR4X0JBUF9PRkZTRVRfTUFYKSB8fCAob2Zmc2V0ICUgMikgKSB7CisgICAgcmVzdWx0ID0gLUVJTlZBTDsKKyAgfSBlbHNlIHsKKyAgICAvKiBXcml0ZSBmaWQvcmlkIGFuZCBvZmZzZXQgKi8KKyAgICBoZmEzODR4X3NldHJlZyhodywgaWQsIEhGQTM4NHhfU0VMRUNUMCk7CisgICAgdWRlbGF5KDEwKTsKKyAgICBoZmEzODR4X3NldHJlZyhodywgb2Zmc2V0LCBIRkEzODR4X09GRlNFVDApOworICAgIC8qIFdhaXQgZm9yIG9mZnNldFtidXN5XSB0byBjbGVhciAoc2VlIEJBUF9USU1FT1VUKSAqLworICAgIGkgPSAwOyAKKyAgICBkbyB7CisgICAgICByZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9PRkZTRVQwKTsKKyAgICAgIGlmICggaSA+IDAgKSB1ZGVsYXkoMik7CisgICAgICBpKys7CisgICAgfSB3aGlsZSAoIGkgPCBCQVBfVElNRU9VVCAmJiBIRkEzODR4X09GRlNFVF9JU0JVU1kocmVnKSk7CisgICAgaWYgKCBpID49IEJBUF9USU1FT1VUICkgeworICAgICAgLyogZmFpbHVyZSAqLworICAgICAgcmVzdWx0ID0gcmVnOworICAgIH0gZWxzZSBpZiAoIEhGQTM4NHhfT0ZGU0VUX0lTRVJSKHJlZykgKXsKKyAgICAgIC8qIGZhaWx1cmUgKi8KKyAgICAgIHJlc3VsdCA9IHJlZzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIENvcHkgZGF0YSBmcm9tIEJBUCB0byBtZW1vcnkuCisgKgorICogQXJndW1lbnRzOgorICoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKKyAqCWlkCQlGSUQgb3IgUklELCBkZXN0aW5lZCBmb3IgdGhlIHNlbGVjdCByZWdpc3RlciAoaG9zdCBvcmRlcikKKyAqCW9mZnNldAkJQW4gX2V2ZW5fIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZm9yIHRoZSBnaXZlbiBGSUQvUklELgorICoJYnVmCQlwdHIgdG8gYXJyYXkgb2YgYnl0ZXMKKyAqCWxlbgkJbGVuZ3RoIG9mIGRhdGEgdG8gdHJhbnNmZXIgaW4gYnl0ZXMKKyAqIFJldHVybnM6IAorICoJMAkJc3VjY2VzcworICovCitzdGF0aWMgaW50IGhmYTM4NHhfY29weV9mcm9tX2JhcChoZmEzODR4X3QgKmh3LCBVSU5UMTYgaWQsIFVJTlQxNiBvZmZzZXQsCisJCQkgIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCit7CisgIGludCByZXN1bHQgPSAwOworICBVSU5UOAkqZCA9IChVSU5UOCopYnVmOworICBVSU5UMTYgaTsKKyAgVUlOVDE2IHJlZyA9IDA7CisgIAorICAvKiBQcmVwYXJlIEJBUCAqLworICByZXN1bHQgPSBoZmEzODR4X3ByZXBhcmVfYmFwICggaHcsIGlkLCBvZmZzZXQgKTsKKyAgaWYgKCByZXN1bHQgPT0gMCApIHsKKyAgICAvKiBSZWFkIGV2ZW4obGVuKSBidWYgY29udGVudHMgZnJvbSBkYXRhIHJlZyAqLworICAgIGZvciAoIGkgPSAwOyBpIDwgKGxlbiAmIDB4ZmZmZSk7IGkrPTIgKSB7CisgICAgICAqKFVJTlQxNiopKCYoZFtpXSkpID0gaGZhMzg0eF9nZXRyZWdfbm9zd2FwKGh3LCBIRkEzODR4X0RBVEEwKTsKKyAgICB9CisgICAgLyogSWYgbGVuIG9kZCwgaGFuZGxlIGxhc3QgYnl0ZSAqLworICAgIGlmICggbGVuICUgMiApeworICAgICAgcmVnID0gaGZhMzg0eF9nZXRyZWdfbm9zd2FwKGh3LCBIRkEzODR4X0RBVEEwKTsKKyAgICAgIGRbbGVuLTFdID0gKChVSU5UOCopKCZyZWcpKVswXTsKKyAgICB9CisgIH0KKyAgaWYgKHJlc3VsdCkgeworICAgIHByaW50ZiAoICJjb3B5X2Zyb21fYmFwKCUjaHgsICUjaHgsICVkKSBmYWlsZWQsIHJlc3VsdD0lI2h4XG4iLCBpZCwgb2Zmc2V0LCBsZW4sIHJlc3VsdCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIENvcHkgZGF0YSBmcm9tIG1lbW9yeSB0byBCQVAuCisgKgorICogQXJndW1lbnRzOgorICoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKKyAqCWlkCQlGSUQgb3IgUklELCBkZXN0aW5lZCBmb3IgdGhlIHNlbGVjdCByZWdpc3RlciAoaG9zdCBvcmRlcikKKyAqCW9mZnNldAkJQW4gX2V2ZW5fIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZm9yIHRoZSBnaXZlbiBGSUQvUklELgorICoJYnVmCQlwdHIgdG8gYXJyYXkgb2YgYnl0ZXMKKyAqCWxlbgkJbGVuZ3RoIG9mIGRhdGEgdG8gdHJhbnNmZXIgaW4gYnl0ZXMKKyAqIFJldHVybnM6IAorICoJMAkJc3VjY2VzcworICovCitzdGF0aWMgaW50IGhmYTM4NHhfY29weV90b19iYXAoaGZhMzg0eF90ICpodywgVUlOVDE2IGlkLCBVSU5UMTYgb2Zmc2V0LAorCQkJdm9pZCAqYnVmLCBVSU5UIGxlbikKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIFVJTlQ4CSpkID0gKFVJTlQ4KilidWY7CisgIFVJTlQxNiBpOworICBVSU5UMTYgc2F2ZXJlZzsKKworICAvKiBQcmVwYXJlIEJBUCAqLworICByZXN1bHQgPSBoZmEzODR4X3ByZXBhcmVfYmFwICggaHcsIGlkLCBvZmZzZXQgKTsKKyAgaWYgKCByZXN1bHQgPT0gMCApIHsKKyAgICAvKiBXcml0ZSBldmVuKGxlbikgYnVmIGNvbnRlbnRzIHRvIGRhdGEgcmVnICovCisgICAgZm9yICggaSA9IDA7IGkgPCAobGVuICYgMHhmZmZlKTsgaSs9MiApIHsKKyAgICAgIGhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgKihVSU5UMTYqKSgmKGRbaV0pKSwgSEZBMzg0eF9EQVRBMCk7CisgICAgfQorICAgIC8qIElmIGxlbiBvZGQsIGhhbmRsZSBsYXN0IGJ5dGUgKi8KKyAgICBpZiAoIGxlbiAlIDIgKXsKKyAgICAgIHNhdmVyZWcgPSBoZmEzODR4X2dldHJlZ19ub3N3YXAoaHcsIEhGQTM4NHhfREFUQTApOworICAgICAgcmVzdWx0ID0gaGZhMzg0eF9wcmVwYXJlX2JhcCAoIGh3LCBpZCwgb2Zmc2V0ICsgKGxlbiAmIDB4ZmZmZSkgKTsKKyAgICAgIGlmICggcmVzdWx0ID09IDAgKSB7CisJKChVSU5UOCopKCZzYXZlcmVnKSlbMF0gPSBkW2xlbi0xXTsKKwloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsIHNhdmVyZWcsIEhGQTM4NHhfREFUQTApOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocmVzdWx0KSB7CisgICAgcHJpbnRmICggImNvcHlfdG9fYmFwKCUjaHgsICUjaHgsICVkKSBmYWlsZWQsIHJlc3VsdD0lI2h4XG4iLCBpZCwgb2Zmc2V0LCBsZW4sIHJlc3VsdCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFJlcXVlc3QgYSBnaXZlbiByZWNvcmQgdG8gYmUgY29waWVkIHRvL2Zyb20gdGhlIHJlY29yZCBidWZmZXIuCisgKgorICogQXJndW1lbnRzOgorICoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKKyAqCXdyaXRlCQlbMHwxXSBjb3B5IHRoZSByZWNvcmQgYnVmZmVyIHRvIHRoZSBnaXZlbgorICoJCQljb25maWd1cmF0aW9uIHJlY29yZC4gKGhvc3Qgb3JkZXIpCisgKglyaWQJCVJJRCBvZiB0aGUgcmVjb3JkIHRvIHJlYWQvd3JpdGUuIChob3N0IG9yZGVyKQorICoKKyAqIFJldHVybnM6IAorICoJMAkJc3VjY2VzcworICovCitzdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2NtZF9hY2Nlc3MoaGZhMzg0eF90ICpodywgVUlOVDE2IHdyaXRlLCBVSU5UMTYgcmlkKQoreworICByZXR1cm4gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfQUNDRVNTKSB8IEhGQTM4NHhfQ01EX1dSSVRFX1NFVCh3cml0ZSksIHJpZCwgMCwgMCk7Cit9CisKKy8qCisgKiBQZXJmb3JtcyB0aGUgc2VxdWVuY2UgbmVjZXNzYXJ5IHRvIHJlYWQgYSBjb25maWcvaW5mbyBpdGVtLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCWh3CQlkZXZpY2Ugc3RydWN0dXJlCisgKglyaWQJCWNvbmZpZy9pbmZvIHJlY29yZCBpZCAoaG9zdCBvcmRlcikKKyAqCWJ1ZgkJaG9zdCBzaWRlIHJlY29yZCBidWZmZXIuICBVcG9uIHJldHVybiBpdCB3aWxsCisgKgkJCWNvbnRhaW4gdGhlIGJvZHkgcG9ydGlvbiBvZiB0aGUgcmVjb3JkIChtaW51cyB0aGUgCisgKgkJCVJJRCBhbmQgbGVuKS4KKyAqCWxlbgkJYnVmZmVyIGxlbmd0aCAoaW4gYnl0ZXMsIHNob3VsZCBtYXRjaCByZWNvcmQgbGVuZ3RoKQorICoKKyAqIFJldHVybnM6IAorICoJMAkJc3VjY2VzcworICovCitzdGF0aWMgaW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgaGZhMzg0eF9yZWNfdAlyZWM7CisKKyAgLyogUmVxdWVzdCByZWFkIG9mIFJJRCAqLworICByZXN1bHQgPSBoZmEzODR4X2NtZF9hY2Nlc3MoIGh3LCAwLCByaWQpOworICBpZiAoIHJlc3VsdCApIHsKKyAgICBwcmludGYoIkNhbGwgdG8gaGZhMzg0eF9jbWRfYWNjZXNzIGZhaWxlZFxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8qIENvcHkgb3V0IHJlY29yZCBsZW5ndGggKi8KKyAgcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKCBodywgcmlkLCAwLCAmcmVjLCBzaXplb2YocmVjKSk7CisgIGlmICggcmVzdWx0ICkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAvKiBWYWxpZGF0ZSB0aGUgcmVjb3JkIGxlbmd0aCAqLworICBpZiAoICgoaGZhMzg0eDJob3N0XzE2KHJlYy5yZWNsZW4pLTEpKjIpICE9IGxlbiApIHsgIC8qIG5vdGUgYm9keSBsZW4gY2FsY3VsYXRpb24gaW4gYnl0ZXMgKi8KKyAgICBwcmludGYgKCAiUklEIGxlbiBtaXNtYXRjaCwgcmlkPSUjaHggaGxlbj0lZCBmd2xlbj0lZFxuIiwgcmlkLCBsZW4sIChoZmEzODR4Mmhvc3RfMTYocmVjLnJlY2xlbiktMSkqMik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8qIENvcHkgb3V0IHJlY29yZCBkYXRhICovCisgIHJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcCggaHcsIHJpZCwgc2l6ZW9mKHJlYyksIGJ1ZiwgbGVuKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFBlcmZvcm1zIHRoZSBzZXF1ZW5jZSBuZWNlc3NhcnkgdG8gcmVhZCBhIDE2LzMyIGJpdCBjb25maWcvaW5mbyBpdGVtCisgKiBhbmQgY29udmVydCBpdCB0byBob3N0IG9yZGVyLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCWh3CQlkZXZpY2Ugc3RydWN0dXJlCisgKglyaWQJCWNvbmZpZy9pbmZvIHJlY29yZCBpZCAoaW4gaG9zdCBvcmRlcikKKyAqCXZhbAkJcHRyIHRvIDE2LzMyIGJpdCBidWZmZXIgdG8gcmVjZWl2ZSB2YWx1ZSAoaW4gaG9zdCBvcmRlcikKKyAqCisgKiBSZXR1cm5zOiAKKyAqCTAJCXN1Y2Nlc3MKKyAqLworI2lmIDAgLyogTm90IGFjdHVhbGx5IHVzZWQgYW55d2hlcmUgKi8KK3N0YXRpYyBpbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKnZhbCkKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIHJpZCwgdmFsLCBzaXplb2YoVUlOVDE2KSk7CisgIGlmICggcmVzdWx0ID09IDAgKSB7CisgICAgKigoVUlOVDE2Kil2YWwpID0gaGZhMzg0eDJob3N0XzE2KCooKFVJTlQxNiopdmFsKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorI2lmIDAgLyogTm90IGFjdHVhbGx5IHVzZWQgYW55d2hlcmUgKi8KK3N0YXRpYyBpbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZzMyKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKnZhbCkKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIHJpZCwgdmFsLCBzaXplb2YoVUlOVDMyKSk7CisgIGlmICggcmVzdWx0ID09IDAgKSB7CisgICAgKigoVUlOVDMyKil2YWwpID0gaGZhMzg0eDJob3N0XzMyKCooKFVJTlQzMiopdmFsKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisvKgorICogUGVyZm9ybXMgdGhlIHNlcXVlbmNlIG5lY2Vzc2FyeSB0byB3cml0ZSBhIGNvbmZpZy9pbmZvIGl0ZW0uCisgKgorICogQXJndW1lbnRzOgorICoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKKyAqCXJpZAkJY29uZmlnL2luZm8gcmVjb3JkIGlkIChpbiBob3N0IG9yZGVyKQorICoJYnVmCQlob3N0IHNpZGUgcmVjb3JkIGJ1ZmZlcgorICoJbGVuCQlidWZmZXIgbGVuZ3RoIChpbiBieXRlcykKKyAqCisgKiBSZXR1cm5zOiAKKyAqCTAJCXN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbikKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIGhmYTM4NHhfcmVjX3QJcmVjOworCisgIHJlYy5yaWQgPSBob3N0MmhmYTM4NHhfMTYocmlkKTsKKyAgcmVjLnJlY2xlbiA9IGhvc3QyaGZhMzg0eF8xNigobGVuLzIpICsgMSk7IC8qIG5vdGUgY29udmVyc2lvbiB0byB3b3JkcywgKzEgZm9yIHJpZCBmaWVsZCAqLworICAvKiB3cml0ZSB0aGUgcmVjb3JkIGhlYWRlciAqLworICByZXN1bHQgPSBoZmEzODR4X2NvcHlfdG9fYmFwKCBodywgcmlkLCAwLCAmcmVjLCBzaXplb2YocmVjKSk7CisgIGlmICggcmVzdWx0ICkgeworICAgIHByaW50ZigiRmFpbHVyZSB3cml0aW5nIHJlY29yZCBoZWFkZXJcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvKiB3cml0ZSB0aGUgcmVjb3JkIGRhdGEgKGlmIHRoZXJlIGlzIGFueSkgKi8KKyAgaWYgKCBsZW4gPiAwICkgeworICAgIHJlc3VsdCA9IGhmYTM4NHhfY29weV90b19iYXAoIGh3LCByaWQsIHNpemVvZihyZWMpLCBidWYsIGxlbik7CisgICAgaWYgKCByZXN1bHQgKSB7CisgICAgICBwcmludGYoIkZhaWx1cmUgd3JpdGluZyByZWNvcmQgZGF0YVxuIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIC8qIFRyaWdnZXIgc2V0dGluZyBvZiByZWNvcmQgKi8KKyAgcmVzdWx0ID0gaGZhMzg0eF9jbWRfYWNjZXNzKCBodywgMSwgcmlkKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFBlcmZvcm1zIHRoZSBzZXF1ZW5jZSBuZWNlc3NhcnkgdG8gd3JpdGUgYSAxNi8zMiBiaXQgY29uZmlnL2luZm8gaXRlbS4KKyAqCisgKiBBcmd1bWVudHM6CisgKglodwkJZGV2aWNlIHN0cnVjdHVyZQorICoJcmlkCQljb25maWcvaW5mbyByZWNvcmQgaWQgKGluIGhvc3Qgb3JkZXIpCisgKgl2YWwJCTE2LzMyIGJpdCB2YWx1ZSB0byBzdG9yZSAoaW4gaG9zdCBvcmRlcikKKyAqCisgKiBSZXR1cm5zOiAKKyAqCTAJCXN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgVUlOVDE2ICp2YWwpCit7CisgIFVJTlQxNiB2YWx1ZTsKKyAgdmFsdWUgPSBob3N0MmhmYTM4NHhfMTYoKnZhbCk7CisgIHJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCByaWQsICZ2YWx1ZSwgc2l6ZW9mKFVJTlQxNikpOworfQorI2lmIDAgLyogTm90IGFjdHVhbGx5IHVzZWQgYW55d2hlcmUgKi8KK3N0YXRpYyBpbnQgaGZhMzg0eF9kcnZyX3NldGNvbmZpZzMyKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIFVJTlQzMiAqdmFsKQoreworICBVSU5UMzIgdmFsdWU7CisgIHZhbHVlID0gaG9zdDJoZmEzODR4XzMyKCp2YWwpOworICByZXR1cm4gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgcmlkLCAmdmFsdWUsIHNpemVvZihVSU5UMzIpKTsKK30KKyNlbmRpZgorCisvKgorICogV2FpdCBmb3IgYW4gZXZlbnQsIHdpdGggc3BlY2lmaWVkIGNoZWNraW5nIGludGVydmFsIGFuZCB0aW1lb3V0LgorICogQXV0b21hdGljYWxseSBhY2tub2x3ZWRnZXMgZXZlbnRzLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCWh3CQlkZXZpY2Ugc3RydWN0dXJlCisgKiAgICAgIGV2ZW50X21hc2sgICAgICBFVlNUQVQgcmVnaXN0ZXIgbWFzayBvZiBldmVudHMgdG8gd2FpdCBmb3IKKyAqCWV2ZW50X2FjawlFVkFDSyByZWdpc3RlciBzZXQgb2YgZXZlbnRzIHRvIGJlIGFja25vd2xlZGdlZCBpZiB0aGV5IGhhcHBlbiAoY2FuIGJlCisgKgkJCXVzZWQgdG8gYWNrbm93bGVkZ2UgImlnbm9yYWJsZSIgZXZlbnRzIGluIGFkZGl0aW9uIHRvIHRoZSAibWFpbiIgZXZlbnQpCisgKiAgICAgIHdhaXQgICAgICAgICAgICBUaW1lIChpbiB1cykgdG8gd2FpdCBiZXR3ZWVuIGVhY2ggcG9sbCBvZiB0aGUgcmVnaXN0ZXIKKyAqICAgICAgdGltZW91dCAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIHBvbGxzIGJlZm9yZSB0aW1pbmcgb3V0CisgKiAgICAgIGRlc2NyICAgICAgICAgICBEZXNjcmlwdGl2ZSB0ZXh0IHN0cmluZyBvZiB3aGF0IGlzIGJlaW5nIHdhaXRlZCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICh3aWxsIGJlIHByaW50ZWQgb3V0IGlmIGEgdGltZW91dCBoYXBwZW5zKQorICoKKyAqIFJldHVybnM6IAorICogICAgICB2YWx1ZSBvZiBFVlNUQVQgcmVnaXN0ZXIsIG9yIDAgb24gZmFpbHVyZSAKKyAqLworc3RhdGljIGludCBoZmEzODR4X3dhaXRfZm9yX2V2ZW50KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBldmVudF9tYXNrLCBVSU5UMTYgZXZlbnRfYWNrLCBpbnQgd2FpdCwgaW50IHRpbWVvdXQsIGNvbnN0IGNoYXIgKmRlc2NyKQoreworICBVSU5UMTYgcmVnOworICBpbnQgY291bnQgPSAwOworICAKKyAgZG8geworICAgIHJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7CisgICAgaWYgKCBjb3VudCA+IDAgKSB1ZGVsYXkod2FpdCk7CisgICAgY291bnQrKzsKKyAgfSB3aGlsZSAoICEocmVnICYgZXZlbnRfbWFzaykgJiYgY291bnQgPCB0aW1lb3V0KTsKKyAgaWYgKCBjb3VudCA+PSB0aW1lb3V0ICkgeworICAgIHByaW50ZigiaGZhMzg0eDogVGltZWQgb3V0IHdhaXRpbmcgZm9yICVzXG4iLCBkZXNjcik7CisgICAgcmV0dXJuIDA7IC8qIFJldHVybiBmYWlsdXJlICovCisgIH0KKyAgLyogQWNrbm93bGVkZ2UgYWxsIGV2ZW50cyB0aGF0IHdlIHdlcmUgd2FpdGluZyBvbiAqLworICBoZmEzODR4X3NldHJlZyhodywgcmVnICYgKCBldmVudF9tYXNrIHwgZXZlbnRfYWNrICksIEhGQTM4NHhfRVZBQ0spOworICByZXR1cm4gcmVnOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByaXNtMl9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworICBVSU5UMTYgcmVnOworICBVSU5UMTYgcnhmaWQ7CisgIFVJTlQxNiByZXN1bHQ7CisgIGhmYTM4NHhfcnhfZnJhbWVfdCByeGRlc2M7CisgIGhmYTM4NHhfdCAqaHcgPSAmaHdfZ2xvYmFsOworICAKKyAgLyogQ2hlY2sgZm9yIHJlY2VpdmVkIHBhY2tldCAqLworICByZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOworICBpZiAoICEgSEZBMzg0eF9FVlNUQVRfSVNSWChyZWcpICkgeworICAgIC8qIE5vIHBhY2tldCByZWNlaXZlZCAtIHJldHVybiAwICovCisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKworICAvKiBBY2tub3dsZWRnZSBSWCBldmVudCAqLworICBoZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19SWF9TRVQoMSksIEhGQTM4NHhfRVZBQ0spOworICAvKiBHZXQgUlggRklEICovICAKKyAgcnhmaWQgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SWEZJRCk7CisgIC8qIEdldCB0aGUgZGVzY3JpcHRvciAoaW5jbHVkaW5nIGhlYWRlcnMpICovCisgIHJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcChodywgcnhmaWQsIDAsICZyeGRlc2MsIHNpemVvZihyeGRlc2MpKTsKKyAgaWYgKCByZXN1bHQgKSB7CisgICAgcmV0dXJuIDA7IC8qIGZhaWwgKi8KKyAgfQorICAvKiBCeXRlIG9yZGVyIGNvbnZlcnQgb25jZSB1cCBmcm9udC4gKi8KKyAgcnhkZXNjLnN0YXR1cyA9IGhmYTM4NHgyaG9zdF8xNihyeGRlc2Muc3RhdHVzKTsKKyAgcnhkZXNjLnRpbWUgPSBoZmEzODR4Mmhvc3RfMzIocnhkZXNjLnRpbWUpOworICByeGRlc2MuZGF0YV9sZW4gPSBoZmEzODR4Mmhvc3RfMTYocnhkZXNjLmRhdGFfbGVuKTsKKworICAvKiBGaWxsIGluIG5pYy0+cGFja2V0bGVuICovCisgIG5pYy0+cGFja2V0bGVuID0gcnhkZXNjLmRhdGFfbGVuOworICBpZiAoIG5pYy0+cGFja2V0bGVuID4gMCApIHsKKyAgICAvKiBGaWxsIGluIG5pYy0+cGFja2V0ICovCisgICAgLyoKKyAgICAgKiBOT1RFOiBQYWNrZXRzIGFzIHJlY2VpdmVkIGhhdmUgYW4gOC1ieXRlIGhlYWRlciAoTExDK1NOQVAoPykpIHRlcm1pbmF0aW5nIHdpdGggdGhlIHBhY2tldCB0eXBlLgorICAgICAqIEV0aGVyYm9vdCBleHBlY3RzIGEgMTQtYnl0ZSBoZWFkZXIgdGVybWluYXRpbmcgd2l0aCB0aGUgcGFja2V0IHR5cGUgKGl0IGlnbm9yZXMgdGhlIHJlc3Qgb2YgdGhlCisgICAgICogaGVhZGVyKSwgc28gd2UgdXNlIGEgcXVpY2sgaGFjayB0byBhY2hpZXZlIHRoaXMuCisgICAgICovCisgICAgcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKGh3LCByeGZpZCwgSEZBMzg0eF9SWF9EQVRBX09GRiwKKwkJCQkgICBuaWMtPnBhY2tldCArIEVUSF9ITEVOIC0gc2l6ZW9mKHdsYW5fODAyMTFoZHJfdCksIG5pYy0+cGFja2V0bGVuKTsKKyAgICBpZiAoIHJlc3VsdCApIHsKKyAgICAgIHJldHVybiAwOyAvKiBmYWlsICovCisgICAgfQorICB9CisgIHJldHVybiAxOyAvKiBQYWNrZXQgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwcmlzbTJfdHJhbnNtaXQoCisJCQkgICAgc3RydWN0IG5pYyAqbmljLAorCQkJICAgIGNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgICB1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCisJCQkgICAgdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLworCQkJICAgIGNvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCit7CisgIGhmYTM4NHhfdCAqaHcgPSAmaHdfZ2xvYmFsOworICBoZmEzODR4X3R4X2ZyYW1lX3QgdHhkZXNjOworICB3bGFuXzgwMjExaGRyX3QgcDgwMjExaGRyID0geyB3bGFuX2xsY19zbmFwLCB7ezAsMCwwfSwwfSB9OworICBVSU5UMTYgZmlkOworICBVSU5UMTYgc3RhdHVzOworICBpbnQgcmVzdWx0OworCisgIC8vIFJlcXVlc3QgRklEIGFsbG9jYXRpb24KKyAgcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfQUxMT0MpLCBIRkEzODR4X0RSVlJfVFhCVUZfTUFYLCAwLCAwKTsKKyAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgcHJpbnRmKCJoZmEzODR4OiBUeCBGSUQgYWxsb2NhdGUgY29tbWFuZCBmYWlsZWQ6IEFib3J0aW5nIHRyYW5zbWl0Li5cbiIpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoICFoZmEzODR4X3dhaXRfZm9yX2V2ZW50KGh3LCBIRkEzODR4X0VWU1RBVF9BTExPQywgSEZBMzg0eF9FVkFDS19JTkZPLCAxMCwgNTAsICJUeCBGSUQgdG8gYmUgYWxsb2NhdGVkXG4iICkgKSByZXR1cm47CisgIGZpZCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0FMTE9DRklEKTsKKworICAvKiBCdWlsZCBUeCBmcmFtZSBzdHJ1Y3R1cmUgKi8KKyAgbWVtc2V0KCZ0eGRlc2MsIDAsIHNpemVvZih0eGRlc2MpKTsKKyAgdHhkZXNjLnR4X2NvbnRyb2wgPSBob3N0MmhmYTM4NHhfMTYoIEhGQTM4NHhfVFhfTUFDUE9SVF9TRVQoMCkgfCBIRkEzODR4X1RYX1NUUlVDVFlQRV9TRVQoMSkgfCAKKwkJCQkgICAgICAgSEZBMzg0eF9UWF9UWEVYX1NFVCgxKSB8IEhGQTM4NHhfVFhfVFhPS19TRVQoMSkgKTsKKyAgdHhkZXNjLmZyYW1lX2NvbnRyb2wgPSAgaG9zdDJpZWVlMTYoIFdMQU5fU0VUX0ZDX0ZUWVBFKFdMQU5fRlRZUEVfREFUQSkgfAorCQkJCSAgICAgICBXTEFOX1NFVF9GQ19GU1RZUEUoV0xBTl9GU1RZUEVfREFUQU9OTFkpIHwKKwkJCQkgICAgICAgV0xBTl9TRVRfRkNfVE9EUygxKSApOworICBtZW1jcHkodHhkZXNjLmFkZHJlc3MxLCBody0+YnNzaWQsIFdMQU5fQUREUl9MRU4pOworICBtZW1jcHkodHhkZXNjLmFkZHJlc3MyLCBuaWMtPm5vZGVfYWRkciwgV0xBTl9BRERSX0xFTik7CisgIG1lbWNweSh0eGRlc2MuYWRkcmVzczMsIGQsIFdMQU5fQUREUl9MRU4pOworICB0eGRlc2MuZGF0YV9sZW4gPSBob3N0MmhmYTM4NHhfMTYoIHNpemVvZih0eGRlc2MpICsgc2l6ZW9mKHA4MDIxMWhkcikgKyBzICk7CisgIC8qIFNldCB1cCBTTkFQIGhlYWRlciAqLworICAvKiBMZXQgT1VJIGRlZmF1bHQgdG8gUkZDMTA0MiAoMHgwMDAwMDApICovCisgIHA4MDIxMWhkci5zbmFwLnR5cGUgPSBodG9ucyh0KTsKKyAgCisgIC8qIENvcHkgdHhkZXNjLCBwODAyMTFoZHIgYW5kIHBheWxvYWQgcGFydHMgdG8gRklEICovCisgIHJlc3VsdCA9IGhmYTM4NHhfY29weV90b19iYXAoaHcsIGZpZCwgMCwgJnR4ZGVzYywgc2l6ZW9mKHR4ZGVzYykpOworICBpZiAoIHJlc3VsdCApIHJldHVybjsgLyogZmFpbCAqLworICByZXN1bHQgPSBoZmEzODR4X2NvcHlfdG9fYmFwKCBodywgZmlkLCBzaXplb2YodHhkZXNjKSwgJnA4MDIxMWhkciwgc2l6ZW9mKHA4MDIxMWhkcikgKTsKKyAgaWYgKCByZXN1bHQgKSByZXR1cm47IC8qIGZhaWwgKi8KKyAgcmVzdWx0ID0gaGZhMzg0eF9jb3B5X3RvX2JhcCggaHcsIGZpZCwgc2l6ZW9mKHR4ZGVzYykgKyBzaXplb2YocDgwMjExaGRyKSwgKFVJTlQ4KilwLCBzICk7CisgIGlmICggcmVzdWx0ICkgcmV0dXJuOyAvKiBmYWlsICovCisKKyAgLyogSXNzdWUgVHggY29tbWFuZCAqLworICByZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsIEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9UWCksIGZpZCwgMCwgMCk7CisgIGlmICggcmVzdWx0ICE9IDAgKSB7CisgICAgcHJpbnRmKCJoZmEzODR4OiBUcmFuc21pdCBmYWlsZWQgd2l0aCByZXN1bHQgJSNoeC5cbiIsIHJlc3VsdCk7CisgICAgcmV0dXJuOworICB9CisgIAorICAvKiBXYWl0IGZvciB0cmFuc21pdCBjb21wbGV0aW9uIChvciBleGNlcHRpb24pICovCisgIHJlc3VsdCA9IGhmYTM4NHhfd2FpdF9mb3JfZXZlbnQoaHcsIEhGQTM4NHhfRVZTVEFUX1RYRVhDIHwgSEZBMzg0eF9FVlNUQVRfVFgsIEhGQTM4NHhfRVZBQ0tfSU5GTywKKwkJCQkgIDIwMCwgNTAwLCAiVHggdG8gY29tcGxldGVcbiIgKTsKKyAgaWYgKCAhcmVzdWx0ICkgcmV0dXJuOyAvKiB0aW1lb3V0IGZhaWx1cmUgKi8KKyAgaWYgKCBIRkEzODR4X0VWU1RBVF9JU1RYRVhDKHJlc3VsdCkgKSB7CisgICAgZmlkID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfVFhDT01QTEZJRCk7CisgICAgcHJpbnRmICggIlR4IGV4Y2VwdGlvbiBvY2N1cnJlZCB3aXRoIGZpZCAlI2h4XG4iLCBmaWQgKTsKKyAgICByZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoaHcsIGZpZCwgMCwgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOworICAgIGlmICggcmVzdWx0ICkgcmV0dXJuOyAvKiBmYWlsICovCisgICAgcHJpbnRmKCJoZmEzODR4OiBUeCBlcnJvciBvY2N1cnJlZCAoc3RhdHVzICUjaHgpOlxuIiwgc3RhdHVzKTsKKyAgICBpZiAoIEhGQTM4NHhfVFhTVEFUVVNfSVNBQ0tFUlIoc3RhdHVzKSApIHsgcHJpbnRmKCIgLi4uYWNrbm93bGVkZ2VtZW50IGVycm9yXG4iKTsgfQorICAgIGlmICggSEZBMzg0eF9UWFNUQVRVU19JU0ZPUk1FUlIoc3RhdHVzKSApIHsgcHJpbnRmKCIgLi4uZm9ybWF0IGVycm9yXG4iKTsgfQorICAgIGlmICggSEZBMzg0eF9UWFNUQVRVU19JU0RJU0NPTihzdGF0dXMpICkgeyBwcmludGYoIiAuLi5kaXNjb25uZWN0ZWQgZXJyb3JcbiIpOyB9CisgICAgaWYgKCBIRkEzODR4X1RYU1RBVFVTX0lTQUdFREVSUihzdGF0dXMpICkgeyBwcmludGYoIiAuLi5BR0VEIGVycm9yXG4iKTsgfQorICAgIGlmICggSEZBMzg0eF9UWFNUQVRVU19JU1JFVFJZRVJSKHN0YXR1cykgKSB7IHByaW50ZigiIC4uLnJldHJ5IGVycm9yXG4iKTsgfQorICAgIHJldHVybjsgLyogZmFpbCAqLworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcHJpc20yX2Rpc2FibGUgKCBzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQgKSB7CisgIC8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcHJpc20yX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK09wZXJhdGlvbnMgdGFibGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgcHJpc20yX29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QJPSBkdW1teV9jb25uZWN0LAorCS5wb2xsCQk9IHByaXNtMl9wb2xsLAorCS50cmFuc21pdAk9IHByaXNtMl90cmFuc21pdCwKKwkuaXJxCQk9IHByaXNtMl9pcnEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorWW91IHNob3VsZCBvbWl0IHRoZSBsYXN0IGFyZ3VtZW50IHN0cnVjdCBwY2lfZGV2aWNlICogZm9yIGEgbm9uLVBDSSBOSUMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJpc20yX3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBoZmEzODR4X3QgKmh3ICkgeworICBpbnQgcmVzdWx0OworICBVSU5UMTYgdG1wMTYgPSAwOworICBVSU5UMTYgaW5mb2ZpZDsKKyAgaGZhMzg0eF9JbmZGcmFtZV90IGluZjsKKyAgY2hhciBzc2lkW0hGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTl07CisgIGludCBpbmZvX2NvdW50ID0gMDsKKworICBuaWMtPmlycW5vICA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSBjYXJkICovCisgIHJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgSEZBMzg0eF9DTURDT0RFX0lOSVQsIDAsMCwwKTsgLyogU2VuZCBpbml0aWFsaXplIGNvbW1hbmQgKi8KKyAgaWYgKCByZXN1bHQgKSBwcmludGYgKCAiSW5pdGlhbGl6ZSBjb21tYW5kIHJldHVybmVkICUjaHhcbiIsIHJlc3VsdCApOworICBoZmEzODR4X3NldHJlZyhodywgMCwgSEZBMzg0eF9JTlRFTik7IC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBoZmEzODR4X3NldHJlZyhodywgMHhmZmZmLCBIRkEzODR4X0VWQUNLKTsgLyogQWNrbm93bGVkZ2UgYW55IHNwdXJpb3VzIGV2ZW50cyAqLworCisgIERCRyAoICJNQUMgYWRkcmVzcyAlc1xuIiwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApICk7CisKKyAgLyogUmV0cmlldmUgTUFDIGFkZHJlc3MgKGFuZCBmaWxsIG91dCBuaWMtPm5vZGVfYWRkcikgKi8KKyAgaGZhMzg0eF9kcnZyX2dldGNvbmZpZyAoIGh3LCBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSLCBuaWMtPm5vZGVfYWRkciwgSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4gKTsKKworICAvKiBQcmVwYXJlIGNhcmQgZm9yIGF1dG9qb2luICovCisgIC8qIFRoaXMgcHJvY2VkdXJlIGlzIHJldmVyc2UtZW5naW5lZXJlZCBmcm9tIGEgcmVnaXN0ZXItbGV2ZWwgdHJhY2Ugb2YgdGhlIExpbnV4IGRyaXZlcidzIGpvaW4gcHJvY2VzcyAqLworICB0bXAxNiA9IFdMQU5fREFUQV9NQVhMRU47IC8qIFNldCBtYXhpbXVtIGRhdGEgbGVuZ3RoICovCisgIHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTiwgJnRtcDE2KTsKKyAgaWYgKCByZXN1bHQgKSBwcmludGYgKCAiU2V0IE1heCBEYXRhIExlbmd0aCBjb21tYW5kIHJldHVybmVkICUjaHhcbiIsIHJlc3VsdCApOworICB0bXAxNiA9IDB4MDAwZjsgLyogU2V0IHRyYW5zbWl0IHJhdGUoPykgKi8KKyAgcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9UWFJBVEVDTlRMLCAmdG1wMTYpOworICBpZiAoIHJlc3VsdCApIHByaW50ZiAoICJTZXQgVHJhbnNtaXQgUmF0ZSBjb21tYW5kIHJldHVybmVkICUjaHhcbiIsIHJlc3VsdCApOworICB0bXAxNiA9IEhGQTM4NHhfQ05GQVVUSEVOVElDQVRJT05fT1BFTlNZU1RFTTsgLyogU2V0IGF1dGhlbnRpY2F0aW9uIHR5cGUgdG8gT3BlblN5c3RlbSAqLworICByZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OLCAmdG1wMTYpOworICBpZiAoIHJlc3VsdCApIHByaW50ZiAoICJTZXQgQXV0aGVudGljYXRpb24gVHlwZSBjb21tYW5kIHJldHVybmVkICUjaHhcbiIsIHJlc3VsdCApOworICAvKiBTZXQgU1NJRCAqLworICBtZW1zZXQoc3NpZCwgMCwgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOKTsKKyAgZm9yICggdG1wMTY9MDsgdG1wMTY8c2l6ZW9mKGhhcmRjb2RlZF9zc2lkKTsgdG1wMTYrKyApIHsgc3NpZFsyK3RtcDE2XSA9IGhhcmRjb2RlZF9zc2lkW3RtcDE2XTsgfQorICBzc2lkWzBdID0gc2l6ZW9mKGhhcmRjb2RlZF9zc2lkKSAtIDE7IC8qIElnbm9yZSB0ZXJtaW5hdGluZyB6ZXJvICovCisgIHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lELCBzc2lkLCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4pOyAvKiBTZXQgdGhlIFNTSUQgKi8KKyAgaWYgKCByZXN1bHQgKSBwcmludGYgKCAiU2V0IFNTSUQgY29tbWFuZCByZXR1cm5lZCAlI2h4XG4iLCByZXN1bHQgKTsKKyAgdG1wMTYgPSAxOyAvKiBTZXQgcG9ydCB0eXBlIHRvIEVTUyBwb3J0ICovCisgIHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUsICZ0bXAxNik7CisgIGlmICggcmVzdWx0ICkgcHJpbnRmICggIlNldCBwb3J0IHR5cGUgY29tbWFuZCByZXR1cm5lZCAlI2h4XG4iLCByZXN1bHQgKTsKKyAgLyogRW5hYmxlIGNhcmQgKi8KKyAgcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfRU5BQkxFKSB8IEhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKDApLCAwLDAsMCk7CisgIGlmICggcmVzdWx0ICkgcHJpbnRmICggIkVuYWJsZSBjb21tYW5kIHJldHVybmVkICUjaHhcbiIsIHJlc3VsdCApOworCisgIGRvIHsKKyAgICAvKiBJbmNyZW1lbnQgaW5mb19jb3VudCwgYWJvcnQgaWYgdG9vIG1hbnkgYXR0ZW1wdHMuCisgICAgICogU2VlIGNvbW1lbnQgbmV4dCB0byBkZWZpbml0aW9uIG9mIE1BWF9KT0lOX0lORk9fQ09VTlQgZm9yIGV4cGxhbmF0aW9uLgorICAgICAqLworICAgIGluZm9fY291bnQrKzsKKyAgICBpZiAoIGluZm9fY291bnQgPiBNQVhfSk9JTl9JTkZPX0NPVU5UICkgeworICAgICAgcHJpbnRmICggIlRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyAtIGFib3J0aW5nXG4iICk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBXYWl0IGZvciBpbmZvIGZyYW1lIHRvIGluZGljYXRlIGxpbmsgc3RhdHVzICovCisgICAgaWYgKCBzaXplb2YoaGFyZGNvZGVkX3NzaWQpID09IDEgKSB7CisgICAgICAvKiBFbXB0eSBTU0lEID0+IGpvaW4gdG8gYW55IFNTSUQgKi8KKyAgICAgIHByaW50ZiAoICJBdHRlbXB0aW5nIHRvIGF1dG9qb2luIHRvIGFueSBhdmFpbGFibGUgYWNjZXNzIHBvaW50IChhdHRlbXB0ICVkKS4uLiIsIGluZm9fY291bnQgKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmICggIkF0dGVtcHRpbmcgdG8gYXV0b2pvaW4gdG8gU1NJRCAlcyAoYXR0ZW1wdCAlZCkuLi4iLCAmc3NpZFsyXSwgaW5mb19jb3VudCApOworICAgIH0KKyAgICAKKyAgICBpZiAoICFoZmEzODR4X3dhaXRfZm9yX2V2ZW50KGh3LCBIRkEzODR4X0VWU1RBVF9JTkZPLCAwLCAxMDAwLCAyMDAwLCAiSW5mbyBldmVudCIgKSApIHJldHVybiAwOworICAgIHByaW50ZigiZG9uZVxuIik7CisgICAgaW5mb2ZpZCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0lORk9GSUQpOworICAgIC8qIFJldHJpZXZlIHRoZSBsZW5ndGggKi8KKyAgICByZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoIGh3LCBpbmZvZmlkLCAwLCAmaW5mLmZyYW1lbGVuLCBzaXplb2YoVUlOVDE2KSk7CisgICAgaWYgKCByZXN1bHQgKSByZXR1cm4gMDsgLyogZmFpbCAqLworICAgIGluZi5mcmFtZWxlbiA9IGhmYTM4NHgyaG9zdF8xNihpbmYuZnJhbWVsZW4pOworICAgIC8qIFJldHJpZXZlIHRoZSByZXN0ICovCisgICAgcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKCBodywgaW5mb2ZpZCwgc2l6ZW9mKFVJTlQxNiksCisJCQkJICAgICYoaW5mLmluZm90eXBlKSwgaW5mLmZyYW1lbGVuICogc2l6ZW9mKFVJTlQxNikpOworICAgIGlmICggcmVzdWx0ICkgcmV0dXJuIDA7IC8qIGZhaWwgKi8KKyAgICBpZiAoIGluZi5pbmZvdHlwZSAhPSBIRkEzODR4X0lUX0xJTktTVEFUVVMgKSB7CisgICAgICAvKiBOb3QgYSBMaW5rIFN0YXR1cyBpbmZvIGZyYW1lOiBkaWUgKi8KKyAgICAgIHByaW50ZiAoICJVbmV4cGVjdGVkIGluZm8gZnJhbWUgdHlwZSAlI2h4IChub3QgTGlua1N0YXR1cyB0eXBlKVxuIiwgaW5mLmluZm90eXBlICk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW5mLmluZm8ubGlua3N0YXR1cy5saW5rc3RhdHVzID0gaGZhMzg0eDJob3N0XzE2KGluZi5pbmZvLmxpbmtzdGF0dXMubGlua3N0YXR1cyk7CisgICAgaWYgKCBpbmYuaW5mby5saW5rc3RhdHVzLmxpbmtzdGF0dXMgIT0gSEZBMzg0eF9MSU5LX0NPTk5FQ1RFRCApIHsKKyAgICAgIC8qIExpbmsgbm90IGNvbm5lY3RlZCAtIHJldHJ5ICovCisgICAgICBwcmludGYgKCAiTGluayBub3QgY29ubmVjdGVkIChzdGF0dXMgJSNoeClcbiIsIGluZi5pbmZvLmxpbmtzdGF0dXMubGlua3N0YXR1cyApOworICAgIH0KKyAgfSB3aGlsZSAoIGluZi5pbmZvLmxpbmtzdGF0dXMubGlua3N0YXR1cyAhPSBIRkEzODR4X0xJTktfQ09OTkVDVEVEICk7CisgICAgCisgIC8qIFJldHJpZXZlIEJTU0lEIGFuZCBwcmludCBDb25uZWN0ZWQgbWVzc2FnZSAqLworICByZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DVVJSRU5UQlNTSUQsIGh3LT5ic3NpZCwgV0xBTl9CU1NJRF9MRU4pOworCisgIERCRyAoICJMaW5rIGNvbm5lY3RlZCAoQlNTSUQgJXMgLSAiLCBldGhfbnRvYSAoIGh3LT5ic3NpZCApICk7CisgIERCRyAoICIgTUFDIGFkZHJlc3MgJXMpXG4iLCBldGhfbnRvYSAobmljLT5ub2RlX2FkZHIgKSApOworICAKKyAgLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisgIG5pYy0+bmljX29wCT0gJnByaXNtMl9vcGVyYXRpb25zOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcHJpc20yX3BjaS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcHJpc20yX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzFlNmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9wcmlzbTJfcGNpLmMKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorUHJpc20yIE5JQyBkcml2ZXIgZm9yIEV0aGVyYm9vdAorV3JhcHBlciBmb3IgcHJpc20yX3BjaQorCitXcml0dGVuIGJ5IE1pY2hhZWwgQnJvd24gb2YgRmVuIFN5c3RlbXMgTHRkCiskSWQkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8bmljLmg+CisKKyNkZWZpbmUgV0xBTl9IT1NUSUYgV0xBTl9QQ0kKKyNpbmNsdWRlICJwcmlzbTIuYyIKKworc3RhdGljIGludCBwcmlzbTJfcGNpX3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworICBoZmEzODR4X3QgKmh3ID0gJmh3X2dsb2JhbDsKKworICBwcmludGYgKCAiUHJpc20yLjUgaGFzIHJlZ2lzdGVycyBhdCAlI2x4XG4iLCBwY2ktPm1lbWJhc2UgKTsKKyAgaHctPm1lbWJhc2UgPSBpb3JlbWFwICggcGNpLT5tZW1iYXNlLCAweDEwMCApOworCisgIG5pYy0+aW9hZGRyID0gcGNpLT5tZW1iYXNlOworICBuaWMtPmlycW5vID0gMDsKKworICByZXR1cm4gcHJpc20yX3Byb2JlICggbmljLCBodyApOworfQorCitzdGF0aWMgdm9pZCBwcmlzbTJfcGNpX2Rpc2FibGUgKCBzdHJ1Y3QgbmljICpuaWMgKSB7CisgIHByaXNtMl9kaXNhYmxlICggbmljICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwcmlzbTJfcGNpX25pY3NbXSA9IHsKK1BDSV9ST00oMHgxMjYwLCAweDM4NzMsICJwcmlzbTJfcGNpIiwJIkhhcnJpcyBTZW1pY29uZHVjdG9yIFByaXNtMi41IGNsb25lIiwgMCksCitQQ0lfUk9NKDB4MTI2MCwgMHgzODczLCAiaHdwMDExNzAiLAkiQWN0aW9uVGVjIEhXUDAxMTcwIiwgMCksCitQQ0lfUk9NKDB4MTI2MCwgMHgzODczLCAiZHdsNTIwIiwJIkRMaW5rIERXTC01MjAiLCAwKSwKK307CisKK1BDSV9EUklWRVIgKCBwcmlzbTJfcGNpX2RyaXZlciwgcHJpc20yX3BjaV9uaWNzLCBQQ0lfTk9fQ0xBU1MgKTsKKworRFJJVkVSICggIlByaXNtMi9QQ0kiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCBwcmlzbTJfcGNpX2RyaXZlciwKKwkgcHJpc20yX3BjaV9wcm9iZSwgcHJpc20yX3BjaV9kaXNhYmxlICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9wcmlzbTJfcGx4LmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9wcmlzbTJfcGx4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiNWJlMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3ByaXNtMl9wbHguYwpAQCAtMCwwICsxLDEyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorUHJpc20yIE5JQyBkcml2ZXIgZm9yIEV0aGVyYm9vdAorV3JhcHBlciBmb3IgcHJpc20yX3BseAorCitXcml0dGVuIGJ5IE1pY2hhZWwgQnJvd24gb2YgRmVuIFN5c3RlbXMgTHRkCiskSWQkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8bmljLmg+CisKKyNkZWZpbmUgV0xBTl9IT1NUSUYgV0xBTl9QTFgKKyNpbmNsdWRlICJwcmlzbTIuYyIKKworLyoKKyAqIEZpbmQgUExYIGNhcmQuICBQcmludHMgb3V0IGluZm9ybWF0aW9uIHN0cmluZ3MgZnJvbSBQQ01DSUEgQ0lTIGFzIHZpc3VhbAorICogY29uZmlybWF0aW9uIG9mIHByZXNlbmNlIG9mIGNhcmQuCisgKgorICogQXJndW1lbnRzOgorICoJaHcJCWRldmljZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGluCisgKiAgICAgIHAgICAgICAgICAgICAgICBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDEgICAgICAgICAgICAgICBTdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgcHJpc20yX2ZpbmRfcGx4ICggaGZhMzg0eF90ICpodywgc3RydWN0IHBjaV9kZXZpY2UgKnAgKQoreworICBpbnQgZm91bmQgPSAwOworICB1aW50MzJfdCBwbHhfbGNyICA9IDA7IC8qIFBMWDkwNTIgTG9jYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBCYXNlIChJL08pICovCisgIHVpbnQzMl90IGF0dHJfbWVtID0gMDsgLyogUHJpc20yIEF0dHJpYnV0ZSBNZW1vcnkgQmFzZSAqLworICB1aW50MzJfdCBpb2Jhc2UgICA9IDA7IC8qIFByaXNtMiBJL08gQmFzZSAqLworICB1bnNpZ25lZCBjaGFyICpjaXNfdHBsICA9IE5VTEw7CisgIHVuc2lnbmVkIGNoYXIgKmNpc19zdHJpbmc7CisgIAorICAvKiBPYnRhaW4gYWxsIG1lbW9yeSBhbmQgSU8gYmFzZSBhZGRyZXNzZXMgKi8KKyAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKCBwLCBQTFhfTE9DQUxfQ09ORklHX1JFR0lTVEVSX0JBU0UsICZwbHhfbGNyKTsKKyAgcGx4X2xjciAmPSBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisgIHBjaV9yZWFkX2NvbmZpZ19kd29yZCggcCwgUFJJU00yX1BMWF9BVFRSX01FTV9CQVNFLCAmYXR0cl9tZW0pOworICBwY2lfcmVhZF9jb25maWdfZHdvcmQoIHAsIFBSSVNNMl9QTFhfSU9fQkFTRSwgJmlvYmFzZSk7CisgIGlvYmFzZSAmPSBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisKKyAgLyogRmlsbCBvdXQgaHcgc3RydWN0dXJlICovCisgIGh3LT5pb2Jhc2UgPSBpb2Jhc2U7CisgIHByaW50ZiAoICJQTFg5MDUyIGhhcyBsb2NhbCBjb25maWcgcmVnaXN0ZXJzIGF0ICUjeFxuIiwgcGx4X2xjciApOworICBwcmludGYgKCAiUHJpc20yIGhhcyBhdHRyaWJ1dGUgbWVtb3J5IGF0ICUjeCBhbmQgSS9PIGJhc2UgYXQgJSN4XG4iLCBhdHRyX21lbSwgaW9iYXNlICk7CisKKyAgLyogU2VhcmNoIGZvciBDSVMgc3RyaW5ncyAqLworICBwcmludGYgKCAiU2VhcmNoaW5nIGZvciBQQ01DSUEgY2FyZC4uLlxuIiApOworICBjaXNfdHBsID0gYnVzX3RvX3ZpcnQoYXR0cl9tZW0pOworICB3aGlsZSAoICpjaXNfdHBsICE9IENJU1RQTF9FTkQgKSB7CisgICAgaWYgKCAqY2lzX3RwbCA9PSBDSVNUUExfVkVSU18xICkgeworICAgICAgLyogQ0lTVFBMX1ZFUlNfMSBjb250YWlucyBzb21lIG5pY2UgdGV4dCBzdHJpbmdzICovCisgICAgICBwcmludGYgKCAiLi4uZm91bmQgIiApOworICAgICAgZm91bmQgPSAxOworICAgICAgY2lzX3N0cmluZyA9IGNpc190cGwgKyBDSVNUUExfVkVSU18xX1NUUl9PRkY7CisgICAgICB3aGlsZSAoICEgKCAoICpjaXNfc3RyaW5nID09IDAgKSAmJiAoICooY2lzX3N0cmluZytDSVNfU1RFUCkgPT0gMCApICkgKSB7CisJcHJpbnRmICggIiVjIiwgKmNpc19zdHJpbmcgPT0gMCA/ICcgJyA6ICpjaXNfc3RyaW5nICk7CisJY2lzX3N0cmluZyArPSBDSVNfU1RFUDsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoICJcbiIgKTsKKyAgICB9CisgICAgLyogcHJpbnRmICggIkNJUyB0dXBsZSB0eXBlICUjaGh4LCBsZW5ndGggJSNoaHhcbiIsICpjaXNfdHBsLCAqKGNpc190cGwrQ0lTVFBMX0xFTl9PRkYpICk7ICovCisgICAgY2lzX3RwbCArPSBDSVNUUExfSEVBREVSX0xFTiArIENJU19TVEVQICogKCAqKGNpc190cGwrQ0lTVFBMX0xFTl9PRkYpICk7CisgIH0KKyAgaWYgKCBmb3VuZCA9PSAwICkgeworICAgIHByaW50ZiAoICIuLi5ub3RoaW5nIGZvdW5kXG4iICk7CisgIH0KKyAgKCh1bnNpZ25lZCBjaGFyICopYnVzX3RvX3ZpcnQoYXR0cl9tZW0pKVtDT1JfT0ZGU0VUXSA9IENPUl9WQUxVRTsgLyogV3JpdGUgQ09SIHRvIGVuYWJsZSBQQyBjYXJkICovCisgIHJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludCBwcmlzbTJfcGx4X3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworICBoZmEzODR4X3QgKmh3ID0gJmh3X2dsb2JhbDsKKyAgCisgIC8qIEZpbmQgYW5kIGludGlhbGlzZSBQTFggUHJpc20yIGNhcmQgKi8KKyAgaWYgKCAhIHByaXNtMl9maW5kX3BseCAoIGh3LCBwY2kgKSApIHJldHVybiAwOworICBuaWMtPmlvYWRkciA9IGh3LT5pb2Jhc2U7CisgIG5pYy0+aXJxbm8gID0gMDsKKyAgcmV0dXJuIHByaXNtMl9wcm9iZSAoIG5pYywgaHcgKTsKK30KKworc3RhdGljIHZvaWQgcHJpc20yX3BseF9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljICkgeworICBwcmlzbTJfZGlzYWJsZSAoIG5pYyApOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcHJpc20yX3BseF9uaWNzW10gPSB7CitQQ0lfUk9NKDB4MTM4NSwgMHg0MTAwLCAibWEzMDEiLCAgICAgICAgICJOZXRnZWFyIE1BMzAxIiwgMCksCitQQ0lfUk9NKDB4MTBiNywgMHg3NzcwLCAiM2MtYWlyY29ubmVjdCIsICIzQ29tIEFpckNvbm5lY3QiLCAwKSwKK1BDSV9ST00oMHgxMTFhLCAweDEwMjMsICJzczEwMjMiLCAgICAgICAgIlNpZW1lbnMgU3BlZWRTdHJlYW0gU1MxMDIzIiwgMCksCitQQ0lfUk9NKDB4MTVlOCwgMHgwMTMwLCAiY29ycmVnYSIsICAgICAgICJDb3JyZWdhIiwgMCksCitQQ0lfUk9NKDB4MTYzOCwgMHgxMTAwLCAic21jMjYwMnciLCAgICAgICJTTUMgRVpDb25uZWN0IFNNQzI2MDJXIiwgMCksCS8qIG9yIEV1bWl0Y29tIFBDSSBXTDExMDAwLCBBZGR0cm9uIEFXQS0xMDAgKi8KK1BDSV9ST00oMHgxNmFiLCAweDExMDAsICJnbDI0MTEwcCIsICAgICAgIkdsb2JhbCBTdW4gVGVjaCBHTDI0MTEwUCIsIDApLAorUENJX1JPTSgweDE2YWIsIDB4MTEwMSwgIjE2YWItMTEwMSIsICAgICAiVW5rbm93biIsIDApLAorUENJX1JPTSgweDE2YWIsIDB4MTEwMiwgIndkdDExIiwgICAgICAgICAiTGlua3N5cyBXRFQxMSIsIDApLAorUENJX1JPTSgweDE2ZWMsIDB4MzY4NSwgInVzcjI0MTUiLCAgICAgICAiVVNSIDI0MTUiLCAwKSwKK1BDSV9ST00oMHhlYzgwLCAweGVjMDAsICJmNWQ2MDAwIiwgICAgICAgIkJlbGtpbiBGNUQ2MDAwIiwgMCksCitQQ0lfUk9NKDB4MTI2YywgMHg4MDMwLCAiZW1vYmlsaXR5IiwgICAgICJOb3J0ZWwgZW1vYmlsaXR5IiwgMCksCit9OworCitQQ0lfRFJJVkVSICggcHJpc20yX3BseF9kcml2ZXIsIHByaXNtMl9wbHhfbmljcywgUENJX05PX0NMQVNTICk7CisKKworRFJJVkVSICggIlByaXNtMi9QTFgiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCBwcmlzbTJfcGx4X2RyaXZlciwKKwkgcHJpc20yX3BseF9wcm9iZSwgcHJpc20yX3BseF9kaXNhYmxlICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9yODE2OS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcjgxNjkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDY4NzgyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcjgxNjkuYwpAQCAtMCwwICsxLDIyODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFydHkgQ29ubm9yIDxtZGNAZXRoZXJib290Lm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBFbnRpdHkgQ3liZXIsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gcnRsODE2OSBkYXRhIHNoZWV0cyBhbmQgd29yayBieToKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgU2h1Q2hlbiA8c2h1Y2hlbkByZWFsdGVrLmNvbS50dz4KKyAqIENvcHlyaWdodCAoYykgMjAwMyAtIDIwMDcgRnJhbmNvaXMgUm9taWV1IDxyb21pZXVAZnIuem9yZWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgYSBsb3Qgb2YgcGVvcGxlIHRvby4gUGxlYXNlIHJlc3BlY3QgdGhlaXIgd29yay4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorI2luY2x1ZGUgPG1paS5oPgorCisjaW5jbHVkZSAicjgxNjkuaCIKKworLyoqKiBMb3cgbGV2ZWwgaGFyZHdhcmUgcm91dGluZXMgKioqLworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHZvaWQgKmlvYWRkciwgaW50IHJlZ19hZGRyLCBpbnQgdmFsdWUpCit7CisJaW50IGk7CisKKwlEQkdQICggIm1kaW9fd3JpdGVcbiIgKTsKKworCVJUTF9XMzIoUEhZQVIsIDB4ODAwMDAwMDAgfCAocmVnX2FkZHIgJiAweDFmKSA8PCAxNiB8ICh2YWx1ZSAmIDB4ZmZmZikpOworCisJZm9yIChpID0gMjA7IGkgPiAwOyBpLS0pIHsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIFJUTDgxNjkgaGFzIGNvbXBsZXRlZCB3cml0aW5nIHRvIHRoZSBzcGVjaWZpZWQKKwkJICogTUlJIHJlZ2lzdGVyLgorCQkgKi8KKwkJaWYgKCEoUlRMX1IzMihQSFlBUikgJiAweDgwMDAwMDAwKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMjUpOworCX0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQodm9pZCAqaW9hZGRyLCBpbnQgcmVnX2FkZHIpCit7CisJaW50IGksIHZhbHVlID0gLTE7CisKKwlEQkdQICggIm1kaW9fcmVhZFxuIiApOworCisJUlRMX1czMihQSFlBUiwgMHgwIHwgKHJlZ19hZGRyICYgMHgxZikgPDwgMTYpOworCisJZm9yIChpID0gMjA7IGkgPiAwOyBpLS0pIHsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIFJUTDgxNjkgaGFzIGNvbXBsZXRlZCByZXRyaWV2aW5nIGRhdGEgZnJvbQorCQkgKiB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3Rlci4KKwkJICovCisJCWlmIChSVExfUjMyKFBIWUFSKSAmIDB4ODAwMDAwMDApIHsKKwkJCXZhbHVlID0gUlRMX1IzMihQSFlBUikgJiAweGZmZmY7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoMjUpOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fcGF0Y2godm9pZCAqaW9hZGRyLCBpbnQgcmVnX2FkZHIsIGludCB2YWx1ZSkKK3sKKwlEQkdQICggIm1kaW9fcGF0Y2hcbiIgKTsKKworCW1kaW9fd3JpdGUoaW9hZGRyLCByZWdfYWRkciwgbWRpb19yZWFkKGlvYWRkciwgcmVnX2FkZHIpIHwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBydGxfZXBoeV93cml0ZSh2b2lkICppb2FkZHIsIGludCByZWdfYWRkciwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCBpOworCisJREJHUCAoICJydGxfZXBoeV93cml0ZVxuIiApOworCisJUlRMX1czMihFUEhZQVIsIEVQSFlBUl9XUklURV9DTUQgfCAodmFsdWUgJiBFUEhZQVJfREFUQV9NQVNLKSB8CisJCShyZWdfYWRkciAmIEVQSFlBUl9SRUdfTUFTSykgPDwgRVBIWUFSX1JFR19TSElGVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKCEoUlRMX1IzMihFUEhZQVIpICYgRVBIWUFSX0ZMQUcpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgdTE2IHJ0bF9lcGh5X3JlYWQodm9pZCAqaW9hZGRyLCBpbnQgcmVnX2FkZHIpCit7CisJdTE2IHZhbHVlID0gMHhmZmZmOworCXVuc2lnbmVkIGludCBpOworCisJREJHUCAoICJydGxfZXBoeV9yZWFkXG4iICk7CisKKwlSVExfVzMyKEVQSFlBUiwgKHJlZ19hZGRyICYgRVBIWUFSX1JFR19NQVNLKSA8PCBFUEhZQVJfUkVHX1NISUZUKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoUlRMX1IzMihFUEhZQVIpICYgRVBIWUFSX0ZMQUcpIHsKKwkJCXZhbHVlID0gUlRMX1IzMihFUEhZQVIpICYgRVBIWUFSX0RBVEFfTUFTSzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBydGxfY3NpX3dyaXRlKHZvaWQgKmlvYWRkciwgaW50IGFkZHIsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCURCR1AgKCAicnRsX2NzaV93cml0ZVxuIiApOworCisJUlRMX1czMihDU0lEUiwgdmFsdWUpOworCVJUTF9XMzIoQ1NJQVIsIENTSUFSX1dSSVRFX0NNRCB8IChhZGRyICYgQ1NJQVJfQUREUl9NQVNLKSB8CisJCUNTSUFSX0JZVEVfRU5BQkxFIDw8IENTSUFSX0JZVEVfRU5BQkxFX1NISUZUKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoIShSVExfUjMyKENTSUFSKSAmIENTSUFSX0ZMQUcpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgdTMyIHJ0bF9jc2lfcmVhZCh2b2lkICppb2FkZHIsIGludCBhZGRyKQoreworCXUzMiB2YWx1ZSA9IH4weDAwOworCXVuc2lnbmVkIGludCBpOworCisJREJHUCAoICJydGxfY3NpX3JlYWRcbiIgKTsKKworCVJUTF9XMzIoQ1NJQVIsIChhZGRyICYgQ1NJQVJfQUREUl9NQVNLKSB8CisJCUNTSUFSX0JZVEVfRU5BQkxFIDw8IENTSUFSX0JZVEVfRU5BQkxFX1NISUZUKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoUlRMX1IzMihDU0lBUikgJiBDU0lBUl9GTEFHKSB7CisJCQl2YWx1ZSA9IFJUTF9SMzIoQ1NJRFIpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfaXJxX21hc2tfYW5kX2Fjayh2b2lkICppb2FkZHIpCit7CisJREJHUCAoICJydGw4MTY5X2lycV9tYXNrX2FuZF9hY2tcbiIgKTsKKworCVJUTF9XMTYoSW50ck1hc2ssIDB4MDAwMCk7CisKKwlSVExfVzE2KEludHJTdGF0dXMsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE2OV90YmlfcmVzZXRfcGVuZGluZyh2b2lkICppb2FkZHIpCit7CisJREJHUCAoICJydGw4MTY5X3RiaV9yZXNldF9wZW5kaW5nXG4iICk7CisKKwlyZXR1cm4gUlRMX1IzMihUQklDU1IpICYgVEJJUmVzZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE2OV94bWlpX3Jlc2V0X3BlbmRpbmcodm9pZCAqaW9hZGRyKQoreworCURCR1AgKCAicnRsODE2OV94bWlpX3Jlc2V0X3BlbmRpbmdcbiIgKTsKKworCXJldHVybiBtZGlvX3JlYWQoaW9hZGRyLCBNSUlfQk1DUikgJiBCTUNSX1JFU0VUOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0bDgxNjlfdGJpX2xpbmtfb2sodm9pZCAqaW9hZGRyKQoreworCURCR1AgKCAicnRsODE2OV90YmlfbGlua19va1xuIiApOworCisJcmV0dXJuIFJUTF9SMzIoVEJJQ1NSKSAmIFRCSUxpbmtPazsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTY5X3htaWlfbGlua19vayh2b2lkICppb2FkZHIpCit7CisJREJHUCAoICJydGw4MTY5X3htaWlfbGlua19va1xuIiApOworCisJcmV0dXJuIFJUTF9SOChQSFlzdGF0dXMpICYgTGlua1N0YXR1czsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV90YmlfcmVzZXRfZW5hYmxlKHZvaWQgKmlvYWRkcikKK3sKKwlEQkdQICggInJ0bDgxNjlfdGJpX3Jlc2V0X2VuYWJsZVxuIiApOworCisJUlRMX1czMihUQklDU1IsIFJUTF9SMzIoVEJJQ1NSKSB8IFRCSVJlc2V0KTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV94bWlpX3Jlc2V0X2VuYWJsZSh2b2lkICppb2FkZHIpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCURCR1AgKCAicnRsODE2OV94bWlpX3Jlc2V0X2VuYWJsZVxuIiApOworCisJdmFsID0gbWRpb19yZWFkKGlvYWRkciwgTUlJX0JNQ1IpIHwgQk1DUl9SRVNFVDsKKwltZGlvX3dyaXRlKGlvYWRkciwgTUlJX0JNQ1IsIHZhbCAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zZXRfc3BlZWRfdGJpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHU4IGF1dG9uZWcsIHUxNiBzcGVlZCwgdTggZHVwbGV4KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCByZXQgPSAwOworCXUzMiByZWc7CisKKwlEQkdQICggInJ0bDgxNjlfc2V0X3NwZWVkX3RiaVxuIiApOworCisJcmVnID0gUlRMX1IzMihUQklDU1IpOworCWlmICgoYXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpICYmIChzcGVlZCA9PSBTUEVFRF8xMDAwKSAmJgorCSAgICAoZHVwbGV4ID09IERVUExFWF9GVUxMKSkgeworCQlSVExfVzMyKFRCSUNTUiwgcmVnICYgfihUQklOd0VuYWJsZSB8IFRCSU53UmVzdGFydCkpOworCX0gZWxzZSBpZiAoYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKKwkJUlRMX1czMihUQklDU1IsIHJlZyB8IFRCSU53RW5hYmxlIHwgVEJJTndSZXN0YXJ0KTsKKwllbHNlIHsKKwkJREJHICggImluY29ycmVjdCBzcGVlZCBzZXR0aW5nIHJlZnVzZWQgaW4gVEJJIG1vZGVcbiIgKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zZXRfc3BlZWRfeG1paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgdTggYXV0b25lZywgdTE2IHNwZWVkLCB1OCBkdXBsZXgpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IGF1dG9fbmVnbywgZ2lnYV9jdHJsOworCisJREJHUCAoICJydGw4MTY5X3NldF9zcGVlZF94bWlpXG4iICk7CisKKwlhdXRvX25lZ28gPSBtZGlvX3JlYWQoaW9hZGRyLCBNSUlfQURWRVJUSVNFKTsKKwlhdXRvX25lZ28gJj0gfihBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEwRlVMTCB8CisJCSAgICAgICBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMKTsKKwlnaWdhX2N0cmwgPSBtZGlvX3JlYWQoaW9hZGRyLCBNSUlfQ1RSTDEwMDApOworCWdpZ2FfY3RybCAmPSB+KEFEVkVSVElTRV8xMDAwRlVMTCB8IEFEVkVSVElTRV8xMDAwSEFMRik7CisKKwlpZiAoYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlhdXRvX25lZ28gfD0gKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwKKwkJCSAgICAgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwpOworCQlnaWdhX2N0cmwgfD0gQURWRVJUSVNFXzEwMDBGVUxMIHwgQURWRVJUSVNFXzEwMDBIQUxGOworCX0gZWxzZSB7CisJCWlmIChzcGVlZCA9PSBTUEVFRF8xMCkKKwkJCWF1dG9fbmVnbyB8PSBBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEwRlVMTDsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQorCQkJYXV0b19uZWdvIHw9IEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEw7CisJCWVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCisJCQlnaWdhX2N0cmwgfD0gQURWRVJUSVNFXzEwMDBGVUxMIHwgQURWRVJUSVNFXzEwMDBIQUxGOworCisJCWlmIChkdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCQlhdXRvX25lZ28gJj0gfihBRFZFUlRJU0VfMTBGVUxMIHwgQURWRVJUSVNFXzEwMEZVTEwpOworCisJCWlmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQlhdXRvX25lZ28gJj0gfihBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEwMEhBTEYpOworCisJCS8qIFRoaXMgdHdlYWsgY29tZXMgc3RyYWlnaHQgZnJvbSBSZWFsdGVrJ3MgZHJpdmVyLiAqLworCQlpZiAoKHNwZWVkID09IFNQRUVEXzEwMCkgJiYgKGR1cGxleCA9PSBEVVBMRVhfSEFMRikgJiYKKwkJICAgICgodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTMpIHx8CisJCSAgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzE2KSkpIHsKKwkJCWF1dG9fbmVnbyA9IEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFX0NTTUE7CisJCX0KKwl9CisKKwkvKiBUaGUgODEwMGUvODEwMWUvODEwMmUgZG8gRmFzdCBFdGhlcm5ldCBvbmx5LiAqLworCWlmICgodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDcpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wOCkgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzA5KSB8fAorCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTApIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xMykgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzE0KSB8fAorCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTUpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xNikpIHsKKwkJaWYgKChnaWdhX2N0cmwgJiAoQURWRVJUSVNFXzEwMDBGVUxMIHwgQURWRVJUSVNFXzEwMDBIQUxGKSkpIHsKKwkJCURCRyAoICJQSFkgZG9lcyBub3Qgc3VwcG9ydCAxMDAwTWJwcy5cbiIgKTsKKwkJfQorCQlnaWdhX2N0cmwgJj0gfihBRFZFUlRJU0VfMTAwMEZVTEwgfCBBRFZFUlRJU0VfMTAwMEhBTEYpOworCX0KKworCWF1dG9fbmVnbyB8PSBBRFZFUlRJU0VfUEFVU0VfQ0FQIHwgQURWRVJUSVNFX1BBVVNFX0FTWU07CisKKwlpZiAoKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzExKSB8fAorCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTIpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPj0gUlRMX0dJR0FfTUFDX1ZFUl8xNykpIHsKKwkJLyoKKwkJICogV2FrZSB1cCB0aGUgUEhZLgorCQkgKiBWZW5kb3Igc3BlY2lmaWMgKDB4MWYpIGFuZCByZXNlcnZlZCAoMHgwZSkgTUlJIHJlZ2lzdGVycy4KKwkJICovCisJCW1kaW9fd3JpdGUoaW9hZGRyLCAweDFmLCAweDAwMDApOworCQltZGlvX3dyaXRlKGlvYWRkciwgMHgwZSwgMHgwMDAwKTsKKwl9CisKKwl0cC0+cGh5X2F1dG9fbmVnb19yZWcgPSBhdXRvX25lZ287CisJdHAtPnBoeV8xMDAwX2N0cmxfcmVnID0gZ2lnYV9jdHJsOworCisJbWRpb193cml0ZShpb2FkZHIsIE1JSV9BRFZFUlRJU0UsIGF1dG9fbmVnbyk7CisJbWRpb193cml0ZShpb2FkZHIsIE1JSV9DVFJMMTAwMCwgZ2lnYV9jdHJsKTsKKwltZGlvX3dyaXRlKGlvYWRkciwgTUlJX0JNQ1IsIEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zZXRfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgdTggYXV0b25lZywgdTE2IHNwZWVkLCB1OCBkdXBsZXgpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlEQkdQICggInJ0bDgxNjlfc2V0X3NwZWVkXG4iICk7CisKKwlyZXQgPSB0cC0+c2V0X3NwZWVkKGRldiwgYXV0b25lZywgc3BlZWQsIGR1cGxleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3dyaXRlX2dtaWlfcmVnX2JpdCh2b2lkICppb2FkZHIsIGludCByZWcsCisJCQkJICAgICAgIGludCBiaXRudW0sIGludCBiaXR2YWwpCit7CisJaW50IHZhbDsKKworCURCR1AgKCAicnRsODE2OV93cml0ZV9nbWlpX3JlZ19iaXRcbiIgKTsKKworCXZhbCA9IG1kaW9fcmVhZChpb2FkZHIsIHJlZyk7CisJdmFsID0gKGJpdHZhbCA9PSAxKSA/CisJCXZhbCB8IChiaXR2YWwgPDwgYml0bnVtKSA6ICB2YWwgJiB+KDB4MDAwMSA8PCBiaXRudW0pOworCW1kaW9fd3JpdGUoaW9hZGRyLCByZWcsIHZhbCAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfZ2V0X21hY192ZXJzaW9uKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLAorCQkJCSAgICB2b2lkICppb2FkZHIpCit7CisJLyoKKwkgKiBUaGUgZHJpdmVyIGN1cnJlbnRseSBoYW5kbGVzIHRoZSA4MTY4QmYgYW5kIHRoZSA4MTY4QmUgaWRlbnRpY2FsbHkKKwkgKiBidXQgdGhleSBjYW4gYmUgaWRlbnRpZmllZCBtb3JlIHNwZWNpZmljYWxseSB0aHJvdWdoIHRoZSB0ZXN0IGJlbG93CisJICogaWYgbmVlZGVkOgorCSAqCisJICogKFJUTF9SMzIoVHhDb25maWcpICYgMHg3MDAwMDApID09IDB4NTAwMDAwID8gODE2OEJmIDogODE2OEJlCisJICoKKwkgKiBTYW1lIHRoaW5nIGZvciB0aGUgODEwMUViIGFuZCB0aGUgODEwMUVjOgorCSAqCisJICogKFJUTF9SMzIoVHhDb25maWcpICYgMHg3MDAwMDApID09IDB4MjAwMDAwID8gODEwMUViIDogODEwMUVjCisJICovCisJY29uc3Qgc3RydWN0IHsKKwkJdTMyIG1hc2s7CisJCXUzMiB2YWw7CisJCWludCBtYWNfdmVyc2lvbjsKKwl9IG1hY19pbmZvW10gPSB7CisJCS8qIDgxNjhEIGZhbWlseS4gKi8KKwkJeyAweDdjODAwMDAwLCAweDI4MDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzI1IH0sCisKKwkJLyogODE2OEMgZmFtaWx5LiAqLworCQl7IDB4N2NmMDAwMDAsIDB4M2NhMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMjQgfSwKKwkJeyAweDdjZjAwMDAwLCAweDNjOTAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzIzIH0sCisJCXsgMHg3Y2YwMDAwMCwgMHgzYzgwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8xOCB9LAorCQl7IDB4N2M4MDAwMDAsIDB4M2M4MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMjQgfSwKKwkJeyAweDdjZjAwMDAwLCAweDNjMDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzE5IH0sCisJCXsgMHg3Y2YwMDAwMCwgMHgzYzIwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8yMCB9LAorCQl7IDB4N2NmMDAwMDAsIDB4M2MzMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMjEgfSwKKwkJeyAweDdjZjAwMDAwLCAweDNjNDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzIyIH0sCisJCXsgMHg3YzgwMDAwMCwgMHgzYzAwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8yMiB9LAorCisJCS8qIDgxNjhCIGZhbWlseS4gKi8KKwkJeyAweDdjZjAwMDAwLCAweDM4MDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzEyIH0sCisJCXsgMHg3Y2YwMDAwMCwgMHgzODUwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8xNyB9LAorCQl7IDB4N2M4MDAwMDAsIDB4MzgwMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMTcgfSwKKwkJeyAweDdjODAwMDAwLCAweDMwMDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzExIH0sCisKKwkJLyogODEwMSBmYW1pbHkuICovCisJCXsgMHg3Y2YwMDAwMCwgMHgzNGEwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8wOSB9LAorCQl7IDB4N2NmMDAwMDAsIDB4MjRhMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMDkgfSwKKwkJeyAweDdjZjAwMDAwLCAweDM0OTAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzA4IH0sCisJCXsgMHg3Y2YwMDAwMCwgMHgyNDkwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8wOCB9LAorCQl7IDB4N2NmMDAwMDAsIDB4MzQ4MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMDcgfSwKKwkJeyAweDdjZjAwMDAwLCAweDI0ODAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzA3IH0sCisJCXsgMHg3Y2YwMDAwMCwgMHgzNDAwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8xMyB9LAorCQl7IDB4N2NmMDAwMDAsIDB4MzQzMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMTAgfSwKKwkJeyAweDdjZjAwMDAwLCAweDM0MjAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzE2IH0sCisJCXsgMHg3YzgwMDAwMCwgMHgzNDgwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8wOSB9LAorCQl7IDB4N2M4MDAwMDAsIDB4MjQ4MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMDkgfSwKKwkJeyAweDdjODAwMDAwLCAweDM0MDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzE2IH0sCisJCS8qIEZJWE1FOiB3aGVyZSBkaWQgdGhlc2UgZW50cmllcyBjb21lIGZyb20gPyAtLSBGUiAqLworCQl7IDB4ZmM4MDAwMDAsIDB4Mzg4MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMTUgfSwKKwkJeyAweGZjODAwMDAwLCAweDMwODAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzE0IH0sCisKKwkJLyogODExMCBmYW1pbHkuICovCisJCXsgMHhmYzgwMDAwMCwgMHg5ODAwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8wNiB9LAorCQl7IDB4ZmM4MDAwMDAsIDB4MTgwMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMDUgfSwKKwkJeyAweGZjODAwMDAwLCAweDEwMDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzA0IH0sCisJCXsgMHhmYzgwMDAwMCwgMHgwNDAwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8wMyB9LAorCQl7IDB4ZmM4MDAwMDAsIDB4MDA4MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMDIgfSwKKwkJeyAweGZjODAwMDAwLCAweDAwMDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzAxIH0sCisKKwkJeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzAxIH0JLyogQ2F0Y2gtYWxsICovCisJfSwgKnAgPSBtYWNfaW5mbzsKKwl1MzIgcmVnOworCisJREJHUCAoICJydGw4MTY5X2dldF9tYWNfdmVyc2lvblxuIiApOworCisJcmVnID0gUlRMX1IzMihUeENvbmZpZyk7CisJd2hpbGUgKChyZWcgJiBwLT5tYXNrKSAhPSBwLT52YWwpCisJCXArKzsKKwl0cC0+bWFjX3ZlcnNpb24gPSBwLT5tYWNfdmVyc2lvbjsKKworCURCRyAoICJ0cC0+bWFjX3ZlcnNpb24gPSAlZFxuIiwgdHAtPm1hY192ZXJzaW9uICk7CisKKwlpZiAocC0+bWFzayA9PSAweDAwMDAwMDAwKSB7CisJCURCRyAoICJ1bmtub3duIE1BQyAoJTA4eClcbiIsIHJlZyApOworCX0KK30KKworc3RydWN0IHBoeV9yZWcgeworCXUxNiByZWc7CisJdTE2IHZhbDsKK307CisKK3N0YXRpYyB2b2lkIHJ0bF9waHlfd3JpdGUodm9pZCAqaW9hZGRyLCBzdHJ1Y3QgcGh5X3JlZyAqcmVncywgaW50IGxlbikKK3sKKwlEQkdQICggInJ0bF9waHlfd3JpdGVcbiIgKTsKKworCXdoaWxlIChsZW4tLSA+IDApIHsKKwkJbWRpb193cml0ZShpb2FkZHIsIHJlZ3MtPnJlZywgcmVncy0+dmFsKTsKKwkJcmVncysrOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsODE2OXNfaHdfcGh5X2NvbmZpZyh2b2lkICppb2FkZHIpCit7CisJc3RydWN0IHsKKwkJdTE2IHJlZ3NbNV07IC8qIEJld2FyZSBvZiBiaXQtc2lnbiBwcm9wYWdhdGlvbiAqLworCX0gcGh5X21hZ2ljWzVdID0geyB7CisJCXsgMHgwMDAwLAkvL3cgNCAxNSAxMiAwCisJCSAgMHgwMGExLAkvL3cgMyAxNSAwIDAwYTEKKwkJICAweDAwMDgsCS8vdyAyIDE1IDAgMDAwOAorCQkgIDB4MTAyMCwJLy93IDEgMTUgMCAxMDIwCisJCSAgMHgxMDAwIH0gfSx7CS8vdyAwIDE1IDAgMTAwMAorCQl7IDB4NzAwMCwJLy93IDQgMTUgMTIgNworCQkgIDB4ZmY0MSwJLy93IDMgMTUgMCBmZjQxCisJCSAgMHhkZTYwLAkvL3cgMiAxNSAwIGRlNjAKKwkJICAweDAxNDAsCS8vdyAxIDE1IDAgMDE0MAorCQkgIDB4MDA3NyB9IH0sewkvL3cgMCAxNSAwIDAwNzcKKwkJeyAweGEwMDAsCS8vdyA0IDE1IDEyIGEKKwkJICAweGRmMDEsCS8vdyAzIDE1IDAgZGYwMQorCQkgIDB4ZGYyMCwJLy93IDIgMTUgMCBkZjIwCisJCSAgMHhmZjk1LAkvL3cgMSAxNSAwIGZmOTUKKwkJICAweGZhMDAgfSB9LHsJLy93IDAgMTUgMCBmYTAwCisJCXsgMHhiMDAwLAkvL3cgNCAxNSAxMiBiCisJCSAgMHhmZjQxLAkvL3cgMyAxNSAwIGZmNDEKKwkJICAweGRlMjAsCS8vdyAyIDE1IDAgZGUyMAorCQkgIDB4MDE0MCwJLy93IDEgMTUgMCAwMTQwCisJCSAgMHgwMGJiIH0gfSx7CS8vdyAwIDE1IDAgMDBiYgorCQl7IDB4ZjAwMCwJLy93IDQgMTUgMTIgZgorCQkgIDB4ZGYwMSwJLy93IDMgMTUgMCBkZjAxCisJCSAgMHhkZjIwLAkvL3cgMiAxNSAwIGRmMjAKKwkJICAweGZmOTUsCS8vdyAxIDE1IDAgZmY5NQorCQkgIDB4YmYwMCB9CS8vdyAwIDE1IDAgYmYwMAorCQl9CisJfSwgKnAgPSBwaHlfbWFnaWM7CisJdW5zaWduZWQgaW50IGk7CisKKwlEQkdQICggInJ0bDgxNjlzX2h3X3BoeV9jb25maWdcbiIgKTsKKworCW1kaW9fd3JpdGUoaW9hZGRyLCAweDFmLCAweDAwMDEpOwkJLy93IDMxIDIgMCAxCisJbWRpb193cml0ZShpb2FkZHIsIDB4MTUsIDB4MTAwMCk7CQkvL3cgMjEgMTUgMCAxMDAwCisJbWRpb193cml0ZShpb2FkZHIsIDB4MTgsIDB4NjVjNyk7CQkvL3cgMjQgMTUgMCA2NWM3CisJcnRsODE2OV93cml0ZV9nbWlpX3JlZ19iaXQoaW9hZGRyLCA0LCAxMSwgMCk7CS8vdyA0IDExIDExIDAKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBoeV9tYWdpYyk7IGkrKywgcCsrKSB7CisJCWludCB2YWwsIHBvcyA9IDQ7CisKKwkJdmFsID0gKG1kaW9fcmVhZChpb2FkZHIsIHBvcykgJiAweDBmZmYpIHwgKHAtPnJlZ3NbMF0gJiAweGZmZmYpOworCQltZGlvX3dyaXRlKGlvYWRkciwgcG9zLCB2YWwpOworCQl3aGlsZSAoLS1wb3MgPj0gMCkKKwkJCW1kaW9fd3JpdGUoaW9hZGRyLCBwb3MsIHAtPnJlZ3NbNCAtIHBvc10gJiAweGZmZmYpOworCQlydGw4MTY5X3dyaXRlX2dtaWlfcmVnX2JpdChpb2FkZHIsIDQsIDExLCAxKTsgLy93IDQgMTEgMTEgMQorCQlydGw4MTY5X3dyaXRlX2dtaWlfcmVnX2JpdChpb2FkZHIsIDQsIDExLCAwKTsgLy93IDQgMTEgMTEgMAorCX0KKwltZGlvX3dyaXRlKGlvYWRkciwgMHgxZiwgMHgwMDAwKTsgLy93IDMxIDIgMCAwCit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlzYl9od19waHlfY29uZmlnKHZvaWQgKmlvYWRkcikKK3sKKwlzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRbXSA9IHsKKwkJeyAweDFmLCAweDAwMDIgfSwKKwkJeyAweDAxLCAweDkwZDAgfSwKKwkJeyAweDFmLCAweDAwMDAgfQorCX07CisKKwlEQkdQICggInJ0bDgxNjlzYl9od19waHlfY29uZmlnXG4iICk7CisKKwlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY4YmJfaHdfcGh5X2NvbmZpZyh2b2lkICppb2FkZHIpCit7CisJc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0W10gPSB7CisJCXsgMHgxMCwgMHhmNDFiIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0KKwl9OworCisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMSk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MTYsIDEgPDwgMCk7CisKKwlEQkdQICggInJ0bDgxNjhiYl9od19waHlfY29uZmlnXG4iICk7CisKKwlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY4YmVmX2h3X3BoeV9jb25maWcodm9pZCAqaW9hZGRyKQoreworCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdFtdID0geworCQl7IDB4MWYsIDB4MDAwMSB9LAorCQl7IDB4MTAsIDB4ZjQxYiB9LAorCQl7IDB4MWYsIDB4MDAwMCB9CisJfTsKKworCURCR1AgKCAicnRsODE2OGJlZl9od19waHlfY29uZmlnXG4iICk7CisKKwlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY4Y3BfMV9od19waHlfY29uZmlnKHZvaWQgKmlvYWRkcikKK3sKKwlzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRbXSA9IHsKKwkJeyAweDFmLCAweDAwMDAgfSwKKwkJeyAweDFkLCAweDBmMDAgfSwKKwkJeyAweDFmLCAweDAwMDIgfSwKKwkJeyAweDBjLCAweDFlYzggfSwKKwkJeyAweDFmLCAweDAwMDAgfQorCX07CisKKwlEQkdQICggInJ0bDgxNjhjcF8xX2h3X3BoeV9jb25maWdcbiIgKTsKKworCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXQsIEFSUkFZX1NJWkUocGh5X3JlZ19pbml0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjhjcF8yX2h3X3BoeV9jb25maWcodm9pZCAqaW9hZGRyKQoreworCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdFtdID0geworCQl7IDB4MWYsIDB4MDAwMSB9LAorCQl7IDB4MWQsIDB4M2Q5OCB9LAorCQl7IDB4MWYsIDB4MDAwMCB9CisJfTsKKworCURCR1AgKCAicnRsODE2OGNwXzJfaHdfcGh5X2NvbmZpZ1xuIiApOworCisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMCk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MTQsIDEgPDwgNSk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MGQsIDEgPDwgNSk7CisKKwlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY4Y18xX2h3X3BoeV9jb25maWcodm9pZCAqaW9hZGRyKQoreworCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdFtdID0geworCQl7IDB4MWYsIDB4MDAwMSB9LAorCQl7IDB4MTIsIDB4MjMwMCB9LAorCQl7IDB4MWYsIDB4MDAwMiB9LAorCQl7IDB4MDAsIDB4ODhkNCB9LAorCQl7IDB4MDEsIDB4ODJiMSB9LAorCQl7IDB4MDMsIDB4NzAwMiB9LAorCQl7IDB4MDgsIDB4OWUzMCB9LAorCQl7IDB4MDksIDB4MDFmMCB9LAorCQl7IDB4MGEsIDB4NTUwMCB9LAorCQl7IDB4MGMsIDB4MDBjOCB9LAorCQl7IDB4MWYsIDB4MDAwMyB9LAorCQl7IDB4MTIsIDB4YzA5NiB9LAorCQl7IDB4MTYsIDB4MDAwYSB9LAorCQl7IDB4MWYsIDB4MDAwMCB9LAorCQl7IDB4MWYsIDB4MDAwMCB9LAorCQl7IDB4MDksIDB4MjAwMCB9LAorCQl7IDB4MDksIDB4MDAwMCB9CisJfTsKKworCURCR1AgKCAicnRsODE2OGNfMV9od19waHlfY29uZmlnXG4iICk7CisKKwlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworCisJbWRpb19wYXRjaChpb2FkZHIsIDB4MTQsIDEgPDwgNSk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MGQsIDEgPDwgNSk7CisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjhjXzJfaHdfcGh5X2NvbmZpZyh2b2lkICppb2FkZHIpCit7CisJc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0W10gPSB7CisJCXsgMHgxZiwgMHgwMDAxIH0sCisJCXsgMHgxMiwgMHgyMzAwIH0sCisJCXsgMHgwMywgMHg4MDJmIH0sCisJCXsgMHgwMiwgMHg0ZjAyIH0sCisJCXsgMHgwMSwgMHgwNDA5IH0sCisJCXsgMHgwMCwgMHhmMDk5IH0sCisJCXsgMHgwNCwgMHg5ODAwIH0sCisJCXsgMHgwNCwgMHg5MDAwIH0sCisJCXsgMHgxZCwgMHgzZDk4IH0sCisJCXsgMHgxZiwgMHgwMDAyIH0sCisJCXsgMHgwYywgMHg3ZWI4IH0sCisJCXsgMHgwNiwgMHgwNzYxIH0sCisJCXsgMHgxZiwgMHgwMDAzIH0sCisJCXsgMHgxNiwgMHgwZjBhIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0KKwl9OworCisJREJHUCAoICJydGw4MTY4Y18yX2h3X3BoeV9jb25maWdcbiIgKTsKKworCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXQsIEFSUkFZX1NJWkUocGh5X3JlZ19pbml0KSk7CisKKwltZGlvX3BhdGNoKGlvYWRkciwgMHgxNiwgMSA8PCAwKTsKKwltZGlvX3BhdGNoKGlvYWRkciwgMHgxNCwgMSA8PCA1KTsKKwltZGlvX3BhdGNoKGlvYWRkciwgMHgwZCwgMSA8PCA1KTsKKwltZGlvX3dyaXRlKGlvYWRkciwgMHgxZiwgMHgwMDAwKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OGNfM19od19waHlfY29uZmlnKHZvaWQgKmlvYWRkcikKK3sKKwlzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRbXSA9IHsKKwkJeyAweDFmLCAweDAwMDEgfSwKKwkJeyAweDEyLCAweDIzMDAgfSwKKwkJeyAweDFkLCAweDNkOTggfSwKKwkJeyAweDFmLCAweDAwMDIgfSwKKwkJeyAweDBjLCAweDdlYjggfSwKKwkJeyAweDA2LCAweDU0NjEgfSwKKwkJeyAweDFmLCAweDAwMDMgfSwKKwkJeyAweDE2LCAweDBmMGEgfSwKKwkJeyAweDFmLCAweDAwMDAgfQorCX07CisKKwlEQkdQICggInJ0bDgxNjhjXzNfaHdfcGh5X2NvbmZpZ1xuIiApOworCisJcnRsX3BoeV93cml0ZShpb2FkZHIsIHBoeV9yZWdfaW5pdCwgQVJSQVlfU0laRShwaHlfcmVnX2luaXQpKTsKKworCW1kaW9fcGF0Y2goaW9hZGRyLCAweDE2LCAxIDw8IDApOworCW1kaW9fcGF0Y2goaW9hZGRyLCAweDE0LCAxIDw8IDUpOworCW1kaW9fcGF0Y2goaW9hZGRyLCAweDBkLCAxIDw8IDUpOworCW1kaW9fd3JpdGUoaW9hZGRyLCAweDFmLCAweDAwMDApOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY4Y180X2h3X3BoeV9jb25maWcodm9pZCAqaW9hZGRyKQoreworCURCR1AgKCAicnRsODE2OGNfNF9od19waHlfY29uZmlnXG4iICk7CisKKwlydGw4MTY4Y18zX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OGRfaHdfcGh5X2NvbmZpZyh2b2lkICppb2FkZHIpCit7CisJc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0XzBbXSA9IHsKKwkJeyAweDFmLCAweDAwMDEgfSwKKwkJeyAweDA5LCAweDI3NzAgfSwKKwkJeyAweDA4LCAweDA0ZDAgfSwKKwkJeyAweDBiLCAweGFkMTUgfSwKKwkJeyAweDBjLCAweDViZjAgfSwKKwkJeyAweDFjLCAweGYxMDEgfSwKKwkJeyAweDFmLCAweDAwMDMgfSwKKwkJeyAweDE0LCAweDk0ZDcgfSwKKwkJeyAweDEyLCAweGY0ZDYgfSwKKwkJeyAweDA5LCAweGNhMGYgfSwKKwkJeyAweDFmLCAweDAwMDIgfSwKKwkJeyAweDBiLCAweDBiMTAgfSwKKwkJeyAweDBjLCAweGQxZjcgfSwKKwkJeyAweDFmLCAweDAwMDIgfSwKKwkJeyAweDA2LCAweDU0NjEgfSwKKwkJeyAweDFmLCAweDAwMDIgfSwKKwkJeyAweDA1LCAweDY2NjIgfSwKKwkJeyAweDFmLCAweDAwMDAgfSwKKwkJeyAweDE0LCAweDAwNjAgfSwKKwkJeyAweDFmLCAweDAwMDAgfSwKKwkJeyAweDBkLCAweGY4YTAgfSwKKwkJeyAweDFmLCAweDAwMDUgfSwKKwkJeyAweDA1LCAweGZmYzIgfQorCX07CisKKwlEQkdQICggInJ0bDgxNjhkX2h3X3BoeV9jb25maWdcbiIgKTsKKworCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXRfMCwgQVJSQVlfU0laRShwaHlfcmVnX2luaXRfMCkpOworCisJaWYgKG1kaW9fcmVhZChpb2FkZHIsIDB4MDYpID09IDB4YzQwMCkgeworCQlzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRfMVtdID0geworCQkJeyAweDFmLCAweDAwMDUgfSwKKwkJCXsgMHgwMSwgMHgwMzAwIH0sCisJCQl7IDB4MWYsIDB4MDAwMCB9LAorCQkJeyAweDExLCAweDQwMWMgfSwKKwkJCXsgMHgxNiwgMHg0MTAwIH0sCisJCQl7IDB4MWYsIDB4MDAwNSB9LAorCQkJeyAweDA3LCAweDAwMTAgfSwKKwkJCXsgMHgwNSwgMHg4M2RjIH0sCisJCQl7IDB4MDYsIDB4MDg3ZCB9LAorCQkJeyAweDA1LCAweDgzMDAgfSwKKwkJCXsgMHgwNiwgMHgwMTAxIH0sCisJCQl7IDB4MDYsIDB4MDVmOCB9LAorCQkJeyAweDA2LCAweGY5ZmEgfSwKKwkJCXsgMHgwNiwgMHhmYmVmIH0sCisJCQl7IDB4MDYsIDB4NzllMiB9LAorCQkJeyAweDA2LCAweDgzNWYgfSwKKwkJCXsgMHgwNiwgMHhlMGY4IH0sCisJCQl7IDB4MDYsIDB4OWFlMSB9LAorCQkJeyAweDA2LCAweGY4OWIgfSwKKwkJCXsgMHgwNiwgMHhlZjMxIH0sCisJCQl7IDB4MDYsIDB4M2I2NSB9LAorCQkJeyAweDA2LCAweGFhMDcgfSwKKwkJCXsgMHgwNiwgMHg4MWU0IH0sCisJCQl7IDB4MDYsIDB4Zjg5YSB9LAorCQkJeyAweDA2LCAweGU1ZjggfSwKKwkJCXsgMHgwNiwgMHg5YmFmIH0sCisJCQl7IDB4MDYsIDB4MDZhZSB9LAorCQkJeyAweDA1LCAweDgzZGMgfSwKKwkJCXsgMHgwNiwgMHg4MzAwIH0sCisJCX07CisKKwkJcnRsX3BoeV93cml0ZShpb2FkZHIsIHBoeV9yZWdfaW5pdF8xLAorCQkJICAgICAgQVJSQVlfU0laRShwaHlfcmVnX2luaXRfMSkpOworCX0KKworCW1kaW9fd3JpdGUoaW9hZGRyLCAweDFmLCAweDAwMDApOworfQorCitzdGF0aWMgdm9pZCBydGw4MTAyZV9od19waHlfY29uZmlnKHZvaWQgKmlvYWRkcikKK3sKKwlzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRbXSA9IHsKKwkJeyAweDFmLCAweDAwMDMgfSwKKwkJeyAweDA4LCAweDQ0MWQgfSwKKwkJeyAweDAxLCAweDkxMDAgfSwKKwkJeyAweDFmLCAweDAwMDAgfQorCX07CisKKwlEQkdQICggInJ0bDgxMDJlX2h3X3BoeV9jb25maWdcbiIgKTsKKworCW1kaW9fd3JpdGUoaW9hZGRyLCAweDFmLCAweDAwMDApOworCW1kaW9fcGF0Y2goaW9hZGRyLCAweDExLCAxIDw8IDEyKTsKKwltZGlvX3BhdGNoKGlvYWRkciwgMHgxOSwgMSA8PCAxMyk7CisKKwlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfcGh5X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJREJHUCAoICJydGxfaHdfcGh5X2NvbmZpZ1xuIiApOworCisJREJHICggIm1hY192ZXJzaW9uID0gMHglMDJ4XG4iLCB0cC0+bWFjX3ZlcnNpb24gKTsKKworCXN3aXRjaCAodHAtPm1hY192ZXJzaW9uKSB7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzAxOgorCQlicmVhazsKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMDI6CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzAzOgorCQlydGw4MTY5c19od19waHlfY29uZmlnKGlvYWRkcik7CisJCWJyZWFrOworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8wNDoKKwkJcnRsODE2OXNiX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzA3OgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8wODoKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMDk6CisJCXJ0bDgxMDJlX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzExOgorCQlydGw4MTY4YmJfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOworCQlicmVhazsKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTI6CisJCXJ0bDgxNjhiZWZfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOworCQlicmVhazsKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTc6CisJCXJ0bDgxNjhiZWZfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOworCQlicmVhazsKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTg6CisJCXJ0bDgxNjhjcF8xX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzE5OgorCQlydGw4MTY4Y18xX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIwOgorCQlydGw4MTY4Y18yX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIxOgorCQlydGw4MTY4Y18zX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIyOgorCQlydGw4MTY4Y180X2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIzOgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yNDoKKwkJcnRsODE2OGNwXzJfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOworCQlicmVhazsKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjU6CisJCXJ0bDgxNjhkX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfcGh5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgX191bnVzZWQsCisJCQkgICAgICBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGludCBpOworCisJREJHUCAoICJydGw4MTY5X3BoeV9yZXNldFxuIiApOworCisJdHAtPnBoeV9yZXNldF9lbmFibGUoaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKCF0cC0+cGh5X3Jlc2V0X3BlbmRpbmcoaW9hZGRyKSkKKwkJCXJldHVybjsKKwkJbWRlbGF5ICggMSApOworCX0KKwlEQkcgKCAiUEhZIHJlc2V0IGZhaWxlZC5cbiIgKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9pbml0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJREJHUCAoICJydGw4MTY5X2luaXRfcGh5XG4iICk7CisKKwlydGxfaHdfcGh5X2NvbmZpZyhkZXYpOworCisJaWYgKHRwLT5tYWNfdmVyc2lvbiA8PSBSVExfR0lHQV9NQUNfVkVSXzA2KSB7CisJCURCRyAoICJTZXQgTUFDIFJlZyBDK0NSIE9mZnNldCAweDgyaCA9IDB4MDFoXG4iICk7CisJCVJUTF9XOCgweDgyLCAweDAxKTsKKwl9CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUodHAtPnBjaV9kZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDQwKTsKKworCWlmICh0cC0+bWFjX3ZlcnNpb24gPD0gUlRMX0dJR0FfTUFDX1ZFUl8wNikKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHRwLT5wY2lfZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAweDA4KTsKKworCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wMikgeworCQlEQkcgKCAiU2V0IE1BQyBSZWcgQytDUiBPZmZzZXQgMHg4MmggPSAweDAxaFxuIiApOworCQlSVExfVzgoMHg4MiwgMHgwMSk7CisJCURCRyAoICJTZXQgUEhZIFJlZyAweDBiaCA9IDB4MDBoXG4iICk7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAweDBiLCAweDAwMDApOyAvL3cgMHgwYiAxNSAwIDAKKwl9CisKKwlydGw4MTY5X3BoeV9yZXNldChkZXYsIHRwKTsKKworCS8qCisJICogcnRsODE2OV9zZXRfc3BlZWRfeG1paSB0YWtlcyBnb29kIGNhcmUgb2YgdGhlIEZhc3QgRXRoZXJuZXQKKwkgKiBvbmx5IDgxMDEuIERvbid0IHBhbmljLgorCSAqLworCXJ0bDgxNjlfc2V0X3NwZWVkKGRldiwgQVVUT05FR19FTkFCTEUsIFNQRUVEXzEwMDAsIERVUExFWF9GVUxMKTsKKworCWlmICgoUlRMX1I4KFBIWXN0YXR1cykgJiBUQklfRW5hYmxlKSkKKwkJREJHICggIlRCSSBhdXRvLW5lZ290aWF0aW5nXG4iICk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2NmZ19pbmZvIHsKKwl2b2lkICgqaHdfc3RhcnQpKHN0cnVjdCBuZXRfZGV2aWNlICopOworCXVuc2lnbmVkIGludCByZWdpb247CisJdW5zaWduZWQgaW50IGFsaWduOworCXUxNiBpbnRyX2V2ZW50OworCXUxNiBuYXBpX2V2ZW50OworCXVuc2lnbmVkIGZlYXR1cmVzOworfSBydGxfY2ZnX2luZm9zIFtdID0geworCVtSVExfQ0ZHXzBdID0geworCQkuaHdfc3RhcnQJPSBydGxfaHdfc3RhcnRfODE2OSwKKwkJLnJlZ2lvbgkJPSAxLAorCQkuYWxpZ24JCT0gMCwKKwkJLmludHJfZXZlbnQJPSBTWVNFcnIgfCBMaW5rQ2hnIHwgUnhPdmVyZmxvdyB8CisJCQkJICBSeEZJRk9PdmVyIHwgVHhFcnIgfCBUeE9LIHwgUnhPSyB8IFJ4RXJyLAorCQkubmFwaV9ldmVudAk9IFJ4RklGT092ZXIgfCBUeEVyciB8IFR4T0sgfCBSeE9LIHwgUnhPdmVyZmxvdywKKwkJLmZlYXR1cmVzCT0gUlRMX0ZFQVRVUkVfR01JSQorCX0sCisJW1JUTF9DRkdfMV0gPSB7CisJCS5od19zdGFydAk9IHJ0bF9od19zdGFydF84MTY4LAorCQkucmVnaW9uCQk9IDIsCisJCS5hbGlnbgkJPSA4LAorCQkuaW50cl9ldmVudAk9IFNZU0VyciB8IExpbmtDaGcgfCBSeE92ZXJmbG93IHwKKwkJCQkgIFR4RXJyIHwgVHhPSyB8IFJ4T0sgfCBSeEVyciwKKwkJLm5hcGlfZXZlbnQJPSBUeEVyciB8IFR4T0sgfCBSeE9LIHwgUnhPdmVyZmxvdywKKwkJLmZlYXR1cmVzCT0gUlRMX0ZFQVRVUkVfR01JSQorCX0sCisJW1JUTF9DRkdfMl0gPSB7CisJCS5od19zdGFydAk9IHJ0bF9od19zdGFydF84MTAxLAorCQkucmVnaW9uCQk9IDIsCisJCS5hbGlnbgkJPSA4LAorCQkuaW50cl9ldmVudAk9IFNZU0VyciB8IExpbmtDaGcgfCBSeE92ZXJmbG93IHwgUENTVGltZW91dCB8CisJCQkJICBSeEZJRk9PdmVyIHwgVHhFcnIgfCBUeE9LIHwgUnhPSyB8IFJ4RXJyLAorCQkubmFwaV9ldmVudAk9IFJ4RklGT092ZXIgfCBUeEVyciB8IFR4T0sgfCBSeE9LIHwgUnhPdmVyZmxvdywKKwl9Cit9OworCitzdGF0aWMgdm9pZCBydGw4MTY5X2h3X3Jlc2V0KHZvaWQgKmlvYWRkcikKK3sKKwlEQkdQICggInJ0bDgxNjlfaHdfcmVzZXRcbiIgKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCXJ0bDgxNjlfaXJxX21hc2tfYW5kX2Fjayhpb2FkZHIpOworCisJLyogUmVzZXQgdGhlIGNoaXBzZXQgKi8KKwlSVExfVzgoQ2hpcENtZCwgQ21kUmVzZXQpOworCisJLyogUENJIGNvbW1pdCAqLworCVJUTF9SOChDaGlwQ21kKTsKK30KKworc3RhdGljIHZvaWQgcnRsX3NldF9yeF90eF9jb25maWdfcmVnaXN0ZXJzKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTMyIGNmZyA9IHJ0bDgxNjlfcnhfY29uZmlnOworCisJREJHUCAoICJydGxfc2V0X3J4X3R4X2NvbmZpZ19yZWdpc3RlcnNcbiIgKTsKKworCWNmZyB8PSAoUlRMX1IzMihSeENvbmZpZykgJiBydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5SeENvbmZpZ01hc2spOworCVJUTF9XMzIoUnhDb25maWcsIGNmZyk7CisKKwkvKiBTZXQgRE1BIGJ1cnN0IHNpemUgYW5kIEludGVyZnJhbWUgR2FwIFRpbWUgKi8KKwlSVExfVzMyKFR4Q29uZmlnLCAoVFhfRE1BX0JVUlNUIDw8IFR4RE1BU2hpZnQpIHwKKwkJKEludGVyRnJhbWVHYXAgPDwgVHhJbnRlckZyYW1lR2FwU2hpZnQpKTsKK30KKworc3RhdGljIHZvaWQgcnRsX3NvZnRfcmVzZXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCURCR1AgKCAicnRsX2h3X3NvZnRfcmVzZXRcbiIgKTsKKworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJUlRMX1c4KENoaXBDbWQsIENtZFJlc2V0KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKChSVExfUjgoQ2hpcENtZCkgJiBDbWRSZXNldCkgPT0gMCkKKwkJCWJyZWFrOworCQltZGVsYXkgKCAxICk7CisJfQorCisJaWYgKCBpID09IDEwMCApIHsKKwkJREJHICggIlJlc2V0IEZhaWxlZCEgKD4gMTAwIGl0ZXJhdGlvbnMpXG4iICk7CisJfQorfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2ICggZGV2ICk7CisKKwlEQkdQICggInJ0bF9od19zdGFydFxuIiApOworCisJLyogU29mdCByZXNldCBOSUMgKi8KKwlydGxfc29mdF9yZXNldCAoIGRldiApOworCisJdHAtPmh3X3N0YXJ0ICggZGV2ICk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9zZXRfcnhfdHhfZGVzY19yZWdpc3RlcnMoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCQkJCSB2b2lkICppb2FkZHIpCit7CisJREJHUCAoICJydGxfc2V0X3J4X3R4X2Rlc2NfcmVnaXN0ZXJzXG4iICk7CisKKwkvKgorCSAqIE1hZ2ljIHNwZWxsOiBzb21lIGlvcDN4eCBBUk0gYm9hcmQgbmVlZHMgdGhlIFR4RGVzY0FkZHJIaWdoCisJICogcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbiBiZWZvcmUgVHhEZXNjQWRkckxvdyB0byB3b3JrLgorCSAqIFN3aXRjaGluZyBmcm9tIE1NSU8gdG8gSS9PIGFjY2VzcyBmaXhlcyB0aGUgaXNzdWUgYXMgd2VsbC4KKwkgKi8KKwlSVExfVzMyICggVHhEZXNjU3RhcnRBZGRySGlnaCwgMCApOworCVJUTF9XMzIgKCBUeERlc2NTdGFydEFkZHJMb3csIHZpcnRfdG9fYnVzICggdHAtPnR4X2Jhc2UgKSApOworCVJUTF9XMzIgKCBSeERlc2NBZGRySGlnaCwgMCApOworCVJUTF9XMzIgKCBSeERlc2NBZGRyTG93LCB2aXJ0X3RvX2J1cyAoIHRwLT5yeF9iYXNlICkgKTsKK30KKworc3RhdGljIHUxNiBydGxfcndfY3BsdXNjbWQodm9pZCAqaW9hZGRyKQoreworCXUxNiBjbWQ7CisKKwlEQkdQICggInJ0bF9yd19jcGx1c2NtZFxuIiApOworCisJY21kID0gUlRMX1IxNihDUGx1c0NtZCk7CisJUlRMX1cxNihDUGx1c0NtZCwgY21kKTsKKwlyZXR1cm4gY21kOworfQorCitzdGF0aWMgdm9pZCBydGxfc2V0X3J4X21heF9zaXplKHZvaWQgKmlvYWRkcikKK3sKKwlEQkdQICggInJ0bF9zZXRfcnhfbWF4X3NpemVcbiIgKTsKKworCVJUTF9XMTYgKCBSeE1heFNpemUsIFJYX0JVRl9TSVpFICk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfc2V0X21hZ2ljX3JlZyh2b2lkICppb2FkZHIsIHVuc2lnbmVkIG1hY192ZXJzaW9uKQoreworCXN0cnVjdCB7CisJCXUzMiBtYWNfdmVyc2lvbjsKKwkJdTMyIGNsazsKKwkJdTMyIHZhbDsKKwl9IGNmZzJfaW5mbyBbXSA9IHsKKwkJeyBSVExfR0lHQV9NQUNfVkVSXzA1LCBQQ0lfQ2xvY2tfMzNNSHosIDB4MDAwZmZmMDAgfSwgLy8gODExMFNDZAorCQl7IFJUTF9HSUdBX01BQ19WRVJfMDUsIFBDSV9DbG9ja182Nk1IeiwgMHgwMDBmZmZmZiB9LAorCQl7IFJUTF9HSUdBX01BQ19WRVJfMDYsIFBDSV9DbG9ja18zM01IeiwgMHgwMGZmZmYwMCB9LCAvLyA4MTEwU0NlCisJCXsgUlRMX0dJR0FfTUFDX1ZFUl8wNiwgUENJX0Nsb2NrXzY2TUh6LCAweDAwZmZmZmZmIH0KKwl9LCAqcCA9IGNmZzJfaW5mbzsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgY2xrOworCisJREJHUCAoICJydGw4MTY5X3NldF9tYWdpY19yZWdcbiIgKTsKKworCWNsayA9IFJUTF9SOChDb25maWcyKSAmIFBDSV9DbG9ja182Nk1IejsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjZmcyX2luZm8pOyBpKyssIHArKykgeworCQlpZiAoKHAtPm1hY192ZXJzaW9uID09IG1hY192ZXJzaW9uKSAmJiAocC0+Y2xrID09IGNsaykpIHsKKwkJCVJUTF9XMzIoMHg3YywgcC0+dmFsKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBydGxfc2V0X3J4X21vZGUgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MzIgdG1wOworCisJREJHUCAoICJydGxfc2V0X3J4X21vZGVcbiIgKTsKKworCS8qIEFjY2VwdCBhbGwgTXVsdGljYXN0IFBhY2tldHMgKi8KKworCVJUTF9XMzIgKCBNQVIwICsgMCwgMHhmZmZmZmZmZiApOworCVJUTF9XMzIgKCBNQVIwICsgNCwgMHhmZmZmZmZmZiApOworCisJdG1wID0gcnRsODE2OV9yeF9jb25maWcgfCBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXMgfAorCSAgICAgICggUlRMX1IzMiAoIFJ4Q29uZmlnICkgJiBydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5SeENvbmZpZ01hc2sgKTsKKworCVJUTF9XMzIgKCBSeENvbmZpZywgdG1wICk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTY5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYgPSB0cC0+cGNpX2RldjsKKworCURCR1AgKCAicnRsX2h3X3N0YXJ0XzgxNjlcbiIgKTsKKworCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wNSkgeworCQlSVExfVzE2KENQbHVzQ21kLCBSVExfUjE2KENQbHVzQ21kKSB8IFBDSU11bFJXKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDB4MDgpOworCX0KKworCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisKKwlpZiAoKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzAxKSB8fAorCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDIpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wMykgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzA0KSkKKwkJUlRMX1c4KENoaXBDbWQsIENtZFR4RW5iIHwgQ21kUnhFbmIpOworCisJUlRMX1c4KEVhcmx5VHhUaHJlcywgRWFybHlUeFRobGQpOworCisJcnRsX3NldF9yeF9tYXhfc2l6ZShpb2FkZHIpOworCisJaWYgKCh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wMSkgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzAyKSB8fAorCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDMpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wNCkpCisJCXJ0bF9zZXRfcnhfdHhfY29uZmlnX3JlZ2lzdGVycyh0cCk7CisKKwl0cC0+Y3BfY21kIHw9IHJ0bF9yd19jcGx1c2NtZChpb2FkZHIpIHwgUENJTXVsUlc7CisKKwlpZiAoKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzAyKSB8fAorCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDMpKSB7CisJCURCRyAoICJTZXQgTUFDIFJlZyBDK0NSIE9mZnNldCAweEUwLiAiCisJCQkiQml0LTMgYW5kIGJpdC0xNCBNVVNUIGJlIDFcbiIgKTsKKwkJdHAtPmNwX2NtZCB8PSAoMSA8PCAxNCk7CisJfQorCisJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisKKwlydGw4MTY5X3NldF9tYWdpY19yZWcoaW9hZGRyLCB0cC0+bWFjX3ZlcnNpb24pOworCisJLyoKKwkgKiBVbmRvY3VtZW50ZWQgY29ybmVyLiBTdXBwb3NlZGx5OgorCSAqIChUeFRpbWVyIDw8IDEyKSB8IChUeFBhY2tldHMgPDwgOCkgfCAoUnhUaW1lciA8PCA0KSB8IFJ4UGFja2V0cworCSAqLworCVJUTF9XMTYoSW50ck1pdGlnYXRlLCAweDAwMDApOworCisJcnRsX3NldF9yeF90eF9kZXNjX3JlZ2lzdGVycyh0cCwgaW9hZGRyKTsKKworCWlmICgodHAtPm1hY192ZXJzaW9uICE9IFJUTF9HSUdBX01BQ19WRVJfMDEpICYmCisJICAgICh0cC0+bWFjX3ZlcnNpb24gIT0gUlRMX0dJR0FfTUFDX1ZFUl8wMikgJiYKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiAhPSBSVExfR0lHQV9NQUNfVkVSXzAzKSAmJgorCSAgICAodHAtPm1hY192ZXJzaW9uICE9IFJUTF9HSUdBX01BQ19WRVJfMDQpKSB7CisJCVJUTF9XOChDaGlwQ21kLCBDbWRUeEVuYiB8IENtZFJ4RW5iKTsKKwkJcnRsX3NldF9yeF90eF9jb25maWdfcmVnaXN0ZXJzKHRwKTsKKwl9CisKKwlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKworCS8qIEluaXRpYWxseSBhIDEwIHVzIGRlbGF5LiBUdXJuZWQgaXQgaW50byBhIFBDSSBjb21taXQuIC0gRlIgKi8KKwlSVExfUjgoSW50ck1hc2spOworCisJUlRMX1czMihSeE1pc3NlZCwgMCk7CisKKwlydGxfc2V0X3J4X21vZGUoZGV2KTsKKworCS8qIG5vIGVhcmx5LXJ4IGludGVycnVwdHMgKi8KKwlSVExfVzE2KE11bHRpSW50ciwgUlRMX1IxNihNdWx0aUludHIpICYgMHhGMDAwKTsKKworCS8vICAgICAgICBSVExfVzE2KEludHJNYXNrLCB0cC0+aW50cl9ldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF90eF9wZXJmb3JtYW5jZV90d2VhayhzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwgdTE2IGZvcmNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjYXAgPSB0cC0+cGNpZV9jYXA7CisKKwlEQkdQICggInJ0bF90eF9wZXJmb3JtYW5jZV90d2Vha1xuIiApOworCisJaWYgKGNhcCkgeworCQl1MTYgY3RsOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIGNhcCArIFBDSV9FWFBfREVWQ1RMLCAmY3RsKTsKKwkJY3RsID0gKGN0bCAmIH5QQ0lfRVhQX0RFVkNUTF9SRUFEUlEpIHwgZm9yY2U7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBjYXAgKyBQQ0lfRVhQX0RFVkNUTCwgY3RsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9jc2lfYWNjZXNzX2VuYWJsZSh2b2lkICppb2FkZHIpCit7CisJdTMyIGNzaTsKKworCURCR1AgKCAicnRsX2NzaV9hY2Nlc3NfZW5hYmxlXG4iICk7CisKKwljc2kgPSBydGxfY3NpX3JlYWQoaW9hZGRyLCAweDA3MGMpICYgMHgwMGZmZmZmZjsKKwlydGxfY3NpX3dyaXRlKGlvYWRkciwgMHgwNzBjLCBjc2kgfCAweDI3MDAwMDAwKTsKK30KKworc3RydWN0IGVwaHlfaW5mbyB7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1MTYgbWFzazsKKwl1MTYgYml0czsKK307CisKK3N0YXRpYyB2b2lkIHJ0bF9lcGh5X2luaXQodm9pZCAqaW9hZGRyLCBzdHJ1Y3QgZXBoeV9pbmZvICplLCBpbnQgbGVuKQoreworCXUxNiB3OworCisJREJHUCAoICJydGxfZXBoeV9pbml0XG4iICk7CisKKwl3aGlsZSAobGVuLS0gPiAwKSB7CisJCXcgPSAocnRsX2VwaHlfcmVhZChpb2FkZHIsIGUtPm9mZnNldCkgJiB+ZS0+bWFzaykgfCBlLT5iaXRzOworCQlydGxfZXBoeV93cml0ZShpb2FkZHIsIGUtPm9mZnNldCwgdyk7CisJCWUrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9kaXNhYmxlX2Nsb2NrX3JlcXVlc3Qoc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNhcCA9IHRwLT5wY2llX2NhcDsKKworCURCR1AgKCAicnRsX2Rpc2FibGVfY2xvY2tfcmVxdWVzdFxuIiApOworCisJaWYgKGNhcCkgeworCQl1MTYgY3RsOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIGNhcCArIFBDSV9FWFBfTE5LQ1RMLCAmY3RsKTsKKwkJY3RsICY9IH5QQ0lfRVhQX0xOS0NUTF9DTEtSRVFfRU47CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBjYXAgKyBQQ0lfRVhQX0xOS0NUTCwgY3RsKTsKKwl9Cit9CisKKyNkZWZpbmUgUjgxNjhfQ1BDTURfUVVJUktfTUFTSyAoXAorCUVuYWJsZUJpc3QgfCBcCisJTWFjX2RiZ29fb2UgfCBcCisJRm9yY2VfaGFsZl9kdXAgfCBcCisJRm9yY2VfcnhmbG93X2VuIHwgXAorCUZvcmNlX3R4Zmxvd19lbiB8IFwKKwlDeHBsX2RiZ19zZWwgfCBcCisJQVNGIHwgXAorCVBrdENudHJEaXNhYmxlIHwgXAorCU1hY19kYmdvX3NlbCkKKworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxNjhiYih2b2lkICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KQoreworCURCR1AgKCAicnRsX2h3X3N0YXJ0XzgxNjhiYlxuIiApOworCisJUlRMX1c4KENvbmZpZzMsIFJUTF9SOChDb25maWczKSAmIH5CZWFjb25fZW4pOworCisJUlRMX1cxNihDUGx1c0NtZCwgUlRMX1IxNihDUGx1c0NtZCkgJiB+UjgxNjhfQ1BDTURfUVVJUktfTUFTSyk7CisKKwlydGxfdHhfcGVyZm9ybWFuY2VfdHdlYWsocGRldiwKKwkJKDB4NSA8PCBNQVhfUkVBRF9SRVFVRVNUX1NISUZUKSB8IFBDSV9FWFBfREVWQ1RMX05PU05PT1BfRU4pOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGJlZih2b2lkICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KQoreworCURCR1AgKCAicnRsX2h3X3N0YXJ0XzgxNjhiZWZcbiIgKTsKKworCXJ0bF9od19zdGFydF84MTY4YmIoaW9hZGRyLCBwZGV2KTsKKworCVJUTF9XOChFYXJseVR4VGhyZXMsIEVhcmx5VHhUaGxkKTsKKworCVJUTF9XOChDb25maWc0LCBSVExfUjgoQ29uZmlnNCkgJiB+KDEgPDwgMCkpOworfQorCitzdGF0aWMgdm9pZCBfX3J0bF9od19zdGFydF84MTY4Y3Aodm9pZCAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlEQkdQICggIl9fcnRsX2h3X3N0YXJ0XzgxNjhjcFxuIiApOworCisJUlRMX1c4KENvbmZpZzEsIFJUTF9SOChDb25maWcxKSB8IFNwZWVkX2Rvd24pOworCisJUlRMX1c4KENvbmZpZzMsIFJUTF9SOChDb25maWczKSAmIH5CZWFjb25fZW4pOworCisJcnRsX3R4X3BlcmZvcm1hbmNlX3R3ZWFrKHBkZXYsIDB4NSA8PCBNQVhfUkVBRF9SRVFVRVNUX1NISUZUKTsKKworCXJ0bF9kaXNhYmxlX2Nsb2NrX3JlcXVlc3QocGRldik7CisKKwlSVExfVzE2KENQbHVzQ21kLCBSVExfUjE2KENQbHVzQ21kKSAmIH5SODE2OF9DUENNRF9RVUlSS19NQVNLKTsKK30KKworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxNjhjcF8xKHZvaWQgKmlvYWRkciwgc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJc3RhdGljIHN0cnVjdCBlcGh5X2luZm8gZV9pbmZvXzgxNjhjcFtdID0geworCQl7IDB4MDEsIDAsCTB4MDAwMSB9LAorCQl7IDB4MDIsIDB4MDgwMCwJMHgxMDAwIH0sCisJCXsgMHgwMywgMCwJMHgwMDQyIH0sCisJCXsgMHgwNiwgMHgwMDgwLAkweDAwMDAgfSwKKwkJeyAweDA3LCAwLAkweDIwMDAgfQorCX07CisKKwlEQkdQICggInJ0bF9od19zdGFydF84MTY4Y3BfMVxuIiApOworCisJcnRsX2NzaV9hY2Nlc3NfZW5hYmxlKGlvYWRkcik7CisKKwlydGxfZXBoeV9pbml0KGlvYWRkciwgZV9pbmZvXzgxNjhjcCwgQVJSQVlfU0laRShlX2luZm9fODE2OGNwKSk7CisKKwlfX3J0bF9od19zdGFydF84MTY4Y3AoaW9hZGRyLCBwZGV2KTsKK30KKworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxNjhjcF8yKHZvaWQgKmlvYWRkciwgc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJREJHUCAoICJydGxfaHdfc3RhcnRfODE2OGNwXzJcbiIgKTsKKworCXJ0bF9jc2lfYWNjZXNzX2VuYWJsZShpb2FkZHIpOworCisJUlRMX1c4KENvbmZpZzMsIFJUTF9SOChDb25maWczKSAmIH5CZWFjb25fZW4pOworCisJcnRsX3R4X3BlcmZvcm1hbmNlX3R3ZWFrKHBkZXYsIDB4NSA8PCBNQVhfUkVBRF9SRVFVRVNUX1NISUZUKTsKKworCVJUTF9XMTYoQ1BsdXNDbWQsIFJUTF9SMTYoQ1BsdXNDbWQpICYgflI4MTY4X0NQQ01EX1FVSVJLX01BU0spOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGNwXzModm9pZCAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlEQkdQICggInJ0bF9od19zdGFydF84MTY4Y3BfM1xuIiApOworCisJcnRsX2NzaV9hY2Nlc3NfZW5hYmxlKGlvYWRkcik7CisKKwlSVExfVzgoQ29uZmlnMywgUlRMX1I4KENvbmZpZzMpICYgfkJlYWNvbl9lbik7CisKKwkvKiBNYWdpYy4gKi8KKwlSVExfVzgoREJHX1JFRywgMHgyMCk7CisKKwlSVExfVzgoRWFybHlUeFRocmVzLCBFYXJseVR4VGhsZCk7CisKKwlydGxfdHhfcGVyZm9ybWFuY2VfdHdlYWsocGRldiwgMHg1IDw8IE1BWF9SRUFEX1JFUVVFU1RfU0hJRlQpOworCisJUlRMX1cxNihDUGx1c0NtZCwgUlRMX1IxNihDUGx1c0NtZCkgJiB+UjgxNjhfQ1BDTURfUVVJUktfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTY4Y18xKHZvaWQgKmlvYWRkciwgc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJc3RhdGljIHN0cnVjdCBlcGh5X2luZm8gZV9pbmZvXzgxNjhjXzFbXSA9IHsKKwkJeyAweDAyLCAweDA4MDAsCTB4MTAwMCB9LAorCQl7IDB4MDMsIDAsCTB4MDAwMiB9LAorCQl7IDB4MDYsIDB4MDA4MCwJMHgwMDAwIH0KKwl9OworCisJREJHUCAoICJydGxfaHdfc3RhcnRfODE2OGNfMVxuIiApOworCisJcnRsX2NzaV9hY2Nlc3NfZW5hYmxlKGlvYWRkcik7CisKKwlSVExfVzgoREJHX1JFRywgMHgwNiB8IEZJWF9OQUtfMSB8IEZJWF9OQUtfMik7CisKKwlydGxfZXBoeV9pbml0KGlvYWRkciwgZV9pbmZvXzgxNjhjXzEsIEFSUkFZX1NJWkUoZV9pbmZvXzgxNjhjXzEpKTsKKworCV9fcnRsX2h3X3N0YXJ0XzgxNjhjcChpb2FkZHIsIHBkZXYpOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGNfMih2b2lkICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KQoreworCXN0YXRpYyBzdHJ1Y3QgZXBoeV9pbmZvIGVfaW5mb184MTY4Y18yW10gPSB7CisJCXsgMHgwMSwgMCwJMHgwMDAxIH0sCisJCXsgMHgwMywgMHgwNDAwLAkweDAyMjAgfQorCX07CisKKwlEQkdQICggInJ0bF9od19zdGFydF84MTY4Y18yXG4iICk7CisKKwlydGxfY3NpX2FjY2Vzc19lbmFibGUoaW9hZGRyKTsKKworCXJ0bF9lcGh5X2luaXQoaW9hZGRyLCBlX2luZm9fODE2OGNfMiwgQVJSQVlfU0laRShlX2luZm9fODE2OGNfMikpOworCisJX19ydGxfaHdfc3RhcnRfODE2OGNwKGlvYWRkciwgcGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTY4Y18zKHZvaWQgKmlvYWRkciwgc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJREJHUCAoICJydGxfaHdfc3RhcnRfODE2OGNfM1xuIiApOworCisJcnRsX2h3X3N0YXJ0XzgxNjhjXzIoaW9hZGRyLCBwZGV2KTsKK30KKworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxNjhjXzQodm9pZCAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlEQkdQICggInJ0bF9od19zdGFydF84MTY4Y180XG4iICk7CisKKwlydGxfY3NpX2FjY2Vzc19lbmFibGUoaW9hZGRyKTsKKworCV9fcnRsX2h3X3N0YXJ0XzgxNjhjcChpb2FkZHIsIHBkZXYpOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGQodm9pZCAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlEQkdQICggInJ0bF9od19zdGFydF84MTY4ZFxuIiApOworCisJcnRsX2NzaV9hY2Nlc3NfZW5hYmxlKGlvYWRkcik7CisKKwlydGxfZGlzYWJsZV9jbG9ja19yZXF1ZXN0KHBkZXYpOworCisJUlRMX1c4KEVhcmx5VHhUaHJlcywgRWFybHlUeFRobGQpOworCisJcnRsX3R4X3BlcmZvcm1hbmNlX3R3ZWFrKHBkZXYsIDB4NSA8PCBNQVhfUkVBRF9SRVFVRVNUX1NISUZUKTsKKworCVJUTF9XMTYoQ1BsdXNDbWQsIFJUTF9SMTYoQ1BsdXNDbWQpICYgflI4MTY4X0NQQ01EX1FVSVJLX01BU0spOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXN0cnVjdCBwY2lfZGV2aWNlICpwZGV2ID0gdHAtPnBjaV9kZXY7CisKKwlEQkdQICggInJ0bF9od19zdGFydF84MTY4XG4iICk7CisKKwlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCisJUlRMX1c4KEVhcmx5VHhUaHJlcywgRWFybHlUeFRobGQpOworCisJcnRsX3NldF9yeF9tYXhfc2l6ZShpb2FkZHIpOworCisJdHAtPmNwX2NtZCB8PSBSVExfUjE2KENQbHVzQ21kKSB8IFBrdENudHJEaXNhYmxlIHwgSU5UVF8xOworCisJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisKKwlSVExfVzE2KEludHJNaXRpZ2F0ZSwgMHg1MTUxKTsKKworCS8qIFdvcmsgYXJvdW5kIGZvciBSeEZJRk8gb3ZlcmZsb3cuICovCisJaWYgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzExKSB7CisJCXRwLT5pbnRyX2V2ZW50IHw9IFJ4RklGT092ZXIgfCBQQ1NUaW1lb3V0OworCQl0cC0+aW50cl9ldmVudCAmPSB+UnhPdmVyZmxvdzsKKwl9CisKKwlydGxfc2V0X3J4X3R4X2Rlc2NfcmVnaXN0ZXJzKHRwLCBpb2FkZHIpOworCisJcnRsX3NldF9yeF9tb2RlKGRldik7CisKKwlSVExfVzMyKFR4Q29uZmlnLCAoVFhfRE1BX0JVUlNUIDw8IFR4RE1BU2hpZnQpIHwKKwkJKEludGVyRnJhbWVHYXAgPDwgVHhJbnRlckZyYW1lR2FwU2hpZnQpKTsKKworCVJUTF9SOChJbnRyTWFzayk7CisKKwlzd2l0Y2ggKHRwLT5tYWNfdmVyc2lvbikgeworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xMToKKwkJcnRsX2h3X3N0YXJ0XzgxNjhiYihpb2FkZHIsIHBkZXYpOworCWJyZWFrOworCisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzEyOgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xNzoKKwkJcnRsX2h3X3N0YXJ0XzgxNjhiZWYoaW9hZGRyLCBwZGV2KTsKKwlicmVhazsKKworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xODoKKwkJcnRsX2h3X3N0YXJ0XzgxNjhjcF8xKGlvYWRkciwgcGRldik7CisJYnJlYWs7CisKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTk6CisJCXJ0bF9od19zdGFydF84MTY4Y18xKGlvYWRkciwgcGRldik7CisJYnJlYWs7CisKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjA6CisJCXJ0bF9od19zdGFydF84MTY4Y18yKGlvYWRkciwgcGRldik7CisJYnJlYWs7CisKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjE6CisJCXJ0bF9od19zdGFydF84MTY4Y18zKGlvYWRkciwgcGRldik7CisJYnJlYWs7CisKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjI6CisJCXJ0bF9od19zdGFydF84MTY4Y180KGlvYWRkciwgcGRldik7CisJYnJlYWs7CisKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjM6CisJCXJ0bF9od19zdGFydF84MTY4Y3BfMihpb2FkZHIsIHBkZXYpOworCWJyZWFrOworCisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzI0OgorCQlydGxfaHdfc3RhcnRfODE2OGNwXzMoaW9hZGRyLCBwZGV2KTsKKwlicmVhazsKKworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yNToKKwkJcnRsX2h3X3N0YXJ0XzgxNjhkKGlvYWRkciwgcGRldik7CisJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEQkcgKCAiVW5rbm93biBjaGlwc2V0IChtYWNfdmVyc2lvbiA9ICVkKS5cbiIsCisJCSAgICAgIHRwLT5tYWNfdmVyc2lvbiApOworCWJyZWFrOworCX0KKworCVJUTF9XOChDaGlwQ21kLCBDbWRUeEVuYiB8IENtZFJ4RW5iKTsKKworCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCisJUlRMX1cxNihNdWx0aUludHIsIFJUTF9SMTYoTXVsdGlJbnRyKSAmIDB4RjAwMCk7CisKKwkvLyAgICAgICAgUlRMX1cxNihJbnRyTWFzaywgdHAtPmludHJfZXZlbnQpOworfQorCisjZGVmaW5lIFI4MTBYX0NQQ01EX1FVSVJLX01BU0sgKFwKKwlFbmFibGVCaXN0IHwgXAorCU1hY19kYmdvX29lIHwgXAorCUZvcmNlX2hhbGZfZHVwIHwgXAorCUZvcmNlX2hhbGZfZHVwIHwgXAorCUZvcmNlX3R4Zmxvd19lbiB8IFwKKwlDeHBsX2RiZ19zZWwgfCBcCisJQVNGIHwgXAorCVBrdENudHJEaXNhYmxlIHwgXAorCVBDSURBQyB8IFwKKwlQQ0lNdWxSVykKKworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxMDJlXzEodm9pZCAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlzdGF0aWMgc3RydWN0IGVwaHlfaW5mbyBlX2luZm9fODEwMmVfMVtdID0geworCQl7IDB4MDEsCTAsIDB4NmU2NSB9LAorCQl7IDB4MDIsCTAsIDB4MDkxZiB9LAorCQl7IDB4MDMsCTAsIDB4YzJmOSB9LAorCQl7IDB4MDYsCTAsIDB4YWZiNSB9LAorCQl7IDB4MDcsCTAsIDB4MGUwMCB9LAorCQl7IDB4MTksCTAsIDB4ZWM4MCB9LAorCQl7IDB4MDEsCTAsIDB4MmU2NSB9LAorCQl7IDB4MDEsCTAsIDB4NmU2NSB9CisJfTsKKwl1OCBjZmcxOworCisJREJHUCAoICJydGxfaHdfc3RhcnRfODEwMmVfMVxuIiApOworCisJcnRsX2NzaV9hY2Nlc3NfZW5hYmxlKGlvYWRkcik7CisKKwlSVExfVzgoREJHX1JFRywgRklYX05BS18xKTsKKworCXJ0bF90eF9wZXJmb3JtYW5jZV90d2VhayhwZGV2LCAweDUgPDwgTUFYX1JFQURfUkVRVUVTVF9TSElGVCk7CisKKwlSVExfVzgoQ29uZmlnMSwKKwkgICAgICAgTEVEUzEgfCBMRURTMCB8IFNwZWVkX2Rvd24gfCBNRU1NQVAgfCBJT01BUCB8IFZQRCB8IFBNRW5hYmxlKTsKKwlSVExfVzgoQ29uZmlnMywgUlRMX1I4KENvbmZpZzMpICYgfkJlYWNvbl9lbik7CisKKwljZmcxID0gUlRMX1I4KENvbmZpZzEpOworCWlmICgoY2ZnMSAmIExFRFMwKSAmJiAoY2ZnMSAmIExFRFMxKSkKKwkJUlRMX1c4KENvbmZpZzEsIGNmZzEgJiB+TEVEUzApOworCisJUlRMX1cxNihDUGx1c0NtZCwgUlRMX1IxNihDUGx1c0NtZCkgJiB+UjgxMFhfQ1BDTURfUVVJUktfTUFTSyk7CisKKwlydGxfZXBoeV9pbml0KGlvYWRkciwgZV9pbmZvXzgxMDJlXzEsIEFSUkFZX1NJWkUoZV9pbmZvXzgxMDJlXzEpKTsKK30KKworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxMDJlXzIodm9pZCAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlEQkdQICggInJ0bF9od19zdGFydF84MTAyZV8yXG4iICk7CisKKwlydGxfY3NpX2FjY2Vzc19lbmFibGUoaW9hZGRyKTsKKworCXJ0bF90eF9wZXJmb3JtYW5jZV90d2VhayhwZGV2LCAweDUgPDwgTUFYX1JFQURfUkVRVUVTVF9TSElGVCk7CisKKwlSVExfVzgoQ29uZmlnMSwgTUVNTUFQIHwgSU9NQVAgfCBWUEQgfCBQTUVuYWJsZSk7CisJUlRMX1c4KENvbmZpZzMsIFJUTF9SOChDb25maWczKSAmIH5CZWFjb25fZW4pOworCisJUlRMX1cxNihDUGx1c0NtZCwgUlRMX1IxNihDUGx1c0NtZCkgJiB+UjgxMFhfQ1BDTURfUVVJUktfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTAyZV8zKHZvaWQgKmlvYWRkciwgc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJREJHUCAoICJydGxfaHdfc3RhcnRfODEwMmVfM1xuIiApOworCisJcnRsX2h3X3N0YXJ0XzgxMDJlXzIoaW9hZGRyLCBwZGV2KTsKKworCXJ0bF9lcGh5X3dyaXRlKGlvYWRkciwgMHgwMywgMHhjMmY5KTsKK30KKworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxMDEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiA9IHRwLT5wY2lfZGV2OworCisJREJHUCAoICJydGxfaHdfc3RhcnRfODEwMVxuIiApOworCisJaWYgKCh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xMykgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzE2KSkgeworCQlpbnQgY2FwID0gdHAtPnBjaWVfY2FwOworCisJCWlmIChjYXApIHsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBjYXAgKyBQQ0lfRVhQX0RFVkNUTCwKKwkJCQkJICAgICAgUENJX0VYUF9ERVZDVExfTk9TTk9PUF9FTik7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHRwLT5tYWNfdmVyc2lvbikgeworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8wNzoKKwkJcnRsX2h3X3N0YXJ0XzgxMDJlXzEoaW9hZGRyLCBwZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMDg6CisJCXJ0bF9od19zdGFydF84MTAyZV8zKGlvYWRkciwgcGRldik7CisJCWJyZWFrOworCisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzA5OgorCQlydGxfaHdfc3RhcnRfODEwMmVfMihpb2FkZHIsIHBkZXYpOworCQlicmVhazsKKwl9CisKKwlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCisJUlRMX1c4KEVhcmx5VHhUaHJlcywgRWFybHlUeFRobGQpOworCisJcnRsX3NldF9yeF9tYXhfc2l6ZShpb2FkZHIpOworCisJdHAtPmNwX2NtZCB8PSBydGxfcndfY3BsdXNjbWQoaW9hZGRyKSB8IFBDSU11bFJXOworCisJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisKKwlSVExfVzE2KEludHJNaXRpZ2F0ZSwgMHgwMDAwKTsKKworCXJ0bF9zZXRfcnhfdHhfZGVzY19yZWdpc3RlcnModHAsIGlvYWRkcik7CisKKwlSVExfVzgoQ2hpcENtZCwgQ21kVHhFbmIgfCBDbWRSeEVuYik7CisJcnRsX3NldF9yeF90eF9jb25maWdfcmVnaXN0ZXJzKHRwKTsKKworCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCisJUlRMX1I4KEludHJNYXNrKTsKKworCXJ0bF9zZXRfcnhfbW9kZShkZXYpOworCisJUlRMX1c4KENoaXBDbWQsIENtZFR4RW5iIHwgQ21kUnhFbmIpOworCisJUlRMX1cxNihNdWx0aUludHIsIFJUTF9SMTYoTXVsdGlJbnRyKSAmIDB4ZjAwMCk7CisKKwkvLyAgICAgICAgUlRMX1cxNihJbnRyTWFzaywgdHAtPmludHJfZXZlbnQpOworfQorCisvKioqIGdQWEUgQVBJIFN1cHBvcnQgUm91dGluZXMgKioqLworCisvKioKKyAqIHNldHVwX3R4X3Jlc291cmNlcyAtIGFsbG9jYXRlIHR4IHJlc291cmNlcyAoZGVzY3JpcHRvcnMpCisgKgorICogQHYgdHAJIERyaXZlciBwcml2YXRlIHN0b3JhZ2UKKyAqCisgKiBAcmV0IHJjICAgICAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50CitydGw4MTY5X3NldHVwX3R4X3Jlc291cmNlcyAoIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwICkKK3sKKwlEQkdQICggInJ0bDgxNjlfc2V0dXBfdHhfcmVzb3VyY2VzXG4iICk7CisKKwl0cC0+dHhfYmFzZSA9IG1hbGxvY19kbWEgKCBSODE2OV9UWF9SSU5HX0JZVEVTLCBUWF9SSU5HX0FMSUdOICk7CisKKwlpZiAoICEgdHAtPnR4X2Jhc2UgKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldCAoIHRwLT50eF9iYXNlLCAwLCBSODE2OV9UWF9SSU5HX0JZVEVTICk7CisKKwlEQkcgKCAidHAtPnR4X2Jhc2UgICAgICA9ICUjMDhseFxuIiwgdmlydF90b19idXMgKCB0cC0+dHhfYmFzZSApICk7CisKKwl0cC0+dHhfZmlsbF9jdHIgPSAwOworCXRwLT50eF9jdXJyID0gMDsKKwl0cC0+dHhfdGFpbCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3J0bDgxNjlfcHJvY2Vzc190eF9wYWNrZXRzICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworCisJdWludDMyX3QgdHhfc3RhdHVzOworCXN0cnVjdCBUeERlc2MgKnR4X2N1cnJfZGVzYzsKKworCURCR1AgKCAicnRsODE2OV9wcm9jZXNzX3R4X3BhY2tldHNcbiIgKTsKKworCXdoaWxlICggdHAtPnR4X3RhaWwgIT0gdHAtPnR4X2N1cnIgKSB7CisKKwkJdHhfY3Vycl9kZXNjID0gdHAtPnR4X2Jhc2UgICsgdHAtPnR4X3RhaWw7CisKKwkJdHhfc3RhdHVzID0gdHhfY3Vycl9kZXNjLT5vcHRzMTsKKworCQlEQkcyICggIkJlZm9yZSBEZXNjT3duIGNoZWNrIHR4X3N0YXR1czogJSMwOHhcbiIsIHR4X3N0YXR1cyApOworCisJCS8qIGlmIHRoZSBwYWNrZXQgYXQgdHhfdGFpbCBpcyBub3Qgb3duZWQgYnkgaGFyZHdhcmUgaXQgaXMgZm9yIHVzICovCisJCWlmICggdHhfc3RhdHVzICYgRGVzY093biApCisJCQlicmVhazsKKworCQlEQkcgKCAiVHJhbnNtaXR0ZWQgcGFja2V0LlxuIiApOworCQlEQkcgKCAidHAtPnR4X2ZpbGxfY3RyICAgICA9ICVkXG4iLCB0cC0+dHhfZmlsbF9jdHIgKTsKKwkJREJHICggInRwLT50eF90YWlsICAgICAgICAgPSAlZFxuIiwgdHAtPnR4X3RhaWwgKTsKKwkJREJHICggInRwLT50eF9jdXJyICAgICAgICAgPSAlZFxuIiwgdHAtPnR4X2N1cnIgKTsKKwkJREJHICggInR4X3N0YXR1cyAgICAgICAgICAgPSAlZFxuIiwgdHhfc3RhdHVzICk7CisJCURCRyAoICJ0eF9jdXJyX2Rlc2MgICAgICAgID0gJSMwOGx4XG4iLCB2aXJ0X3RvX2J1cyAoIHR4X2N1cnJfZGVzYyApICk7CisKKwkJLyogUGFzcyBwYWNrZXQgdG8gY29yZSBmb3IgcHJvY2Vzc2luZyAqLworCQluZXRkZXZfdHhfY29tcGxldGUgKCBuZXRkZXYsIHRwLT50eF9pb2J1Zlt0cC0+dHhfdGFpbF0gKTsKKworCQltZW1zZXQgKCB0eF9jdXJyX2Rlc2MsIDAsIHNpemVvZiAoICp0eF9jdXJyX2Rlc2MgKSApOworCisJCS8qIERlY3JlbWVudCBjb3VudCBvZiB1c2VkIGRlc2NyaXB0b3JzICovCisJCXRwLT50eF9maWxsX2N0ci0tOworCisJCS8qIEluY3JlbWVudCBzZW50IHBhY2tldHMgaW5kZXggKi8KKwkJdHAtPnR4X3RhaWwgPSAoIHRwLT50eF90YWlsICsgMSApICUgTlVNX1RYX0RFU0M7CisJfQorfQorCitzdGF0aWMgdm9pZAorcnRsODE2OV9mcmVlX3R4X3Jlc291cmNlcyAoIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwICkKK3sKKwlEQkdQICggInJ0bDgxNjlfZnJlZV90eF9yZXNvdXJjZXNcbiIgKTsKKworCWZyZWVfZG1hICggdHAtPnR4X2Jhc2UsIFI4MTY5X1RYX1JJTkdfQllURVMgKTsKK30KKworc3RhdGljIHZvaWQKK3J0bDgxNjlfcG9wdWxhdGVfcnhfZGVzY3JpcHRvciAoIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3QgUnhEZXNjICpyeF9kZXNjLCB1aW50MzJfdCBpbmRleCApCit7CisJREJHUCAoICJydGw4MTY5X3BvcHVsYXRlX3J4X2Rlc2NyaXB0b3JcbiIgKTsKKworCURCRyAoICJQb3B1bGF0aW5nIHJ4IGRlc2NyaXB0b3IgJWRcbiIsIGluZGV4ICk7CisKKwltZW1zZXQgKCByeF9kZXNjLCAwLCBzaXplb2YgKCAqcnhfZGVzYyApICk7CisKKwlyeF9kZXNjLT5hZGRyX2hpID0gMDsKKwlyeF9kZXNjLT5hZGRyX2xvID0gdmlydF90b19idXMgKCB0cC0+cnhfaW9idWZbaW5kZXhdLT5kYXRhICk7CisJcnhfZGVzYy0+b3B0czIgPSAwOworCXJ4X2Rlc2MtPm9wdHMxID0gKCBpbmRleCA9PSAoIE5VTV9SWF9ERVNDIC0gMSApID8gUmluZ0VuZCA6IDAgKSB8CisJCVJYX0JVRl9TSVpFOworCXJ4X2Rlc2MtPm9wdHMxIHw9IERlc2NPd247Cit9CisKKy8qKgorICogUmVmaWxsIGRlc2NyaXB0b3IgcmluZworICoKKyAqIEB2IG5ldGRldgkJTmV0IGRldmljZQorICovCitzdGF0aWMgdm9pZCBydGw4MTY5X3JlZmlsbF9yeF9yaW5nICggc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgKQoreworCXN0cnVjdCBSeERlc2MgKnJ4X2N1cnJfZGVzYzsKKwlpbnQgaTsKKworCURCR1AgKCAicnRsODE2OV9yZWZpbGxfcnhfcmluZ1xuIiApOworCisJZm9yICggaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrICkgeworCisJCXJ4X2N1cnJfZGVzYyA9ICggdHAtPnJ4X2Jhc2UgKSArIGk7CisKKwkJLyogRG9uJ3QgdG91Y2ggZGVzY3JpcHRvcnMgb3duZWQgYnkgdGhlIE5JQyAqLworCQlpZiAoIHJ4X2N1cnJfZGVzYy0+b3B0czEgJiBEZXNjT3duICkKKwkJCWNvbnRpbnVlOworCisJCS8qIERvbid0IHRvdWNoIGRlc2NyaXB0b3JzIHdpdGggaW9idWZzLCB0aGV5IHN0aWxsIG5lZWQgdG8gYmUKKwkJICAgcHJvY2Vzc2VkIGJ5IHRoZSBwb2xsIHJvdXRpbmUgKi8KKwkJaWYgKCB0cC0+cnhfaW9idWZbdHAtPnJ4X2N1cnJdICE9IE5VTEwgKQorCQkJY29udGludWU7CisKKwkJLyoqIElmIHdlIGNhbid0IGdldCBhbiBpb2J1ZiBmb3IgdGhpcyBkZXNjcmlwdG9yCisJCSAgICB0cnkgYWdhaW4gbGF0ZXIgKG5leHQgcG9sbCkuCisJCSAqLworCQlpZiAoICEgKCB0cC0+cnhfaW9idWZbaV0gPSBhbGxvY19pb2IgKCBSWF9CVUZfU0laRSApICkgKSB7CisJCQlEQkcgKCAiUmVmaWxsIHJ4IHJpbmcgZmFpbGVkISFcbiIgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcnRsODE2OV9wb3B1bGF0ZV9yeF9kZXNjcmlwdG9yICggdHAsIHJ4X2N1cnJfZGVzYywgaSApOworCX0KK30KKworLyoqCisgKiBzZXR1cF9yeF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBSeCByZXNvdXJjZXMgKERlc2NyaXB0b3JzKQorICoKKyAqIEB2IHRwOgkgRHJpdmVyIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogQHJldCByYyAgICAgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoKKyAqKi8KK3N0YXRpYyBpbnQKK3J0bDgxNjlfc2V0dXBfcnhfcmVzb3VyY2VzICggc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgKQoreworCURCR1AgKCAicnRsODE2OV9zZXR1cF9yeF9yZXNvdXJjZXNcbiIgKTsKKworCXRwLT5yeF9iYXNlID0gbWFsbG9jX2RtYSAoIFI4MTY5X1JYX1JJTkdfQllURVMsIFJYX1JJTkdfQUxJR04gKTsKKworCURCRyAoICJ0cC0+cnhfYmFzZSAgICAgID0gJSMwOGx4XG4iLCB2aXJ0X3RvX2J1cyAoIHRwLT5yeF9iYXNlICkgKTsKKworCWlmICggISB0cC0+cnhfYmFzZSApIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCAoIHRwLT5yeF9iYXNlLCAwLCBSODE2OV9SWF9SSU5HX0JZVEVTICk7CisKKwlydGw4MTY5X3JlZmlsbF9yeF9yaW5nICggdHAgKTsKKworCXRwLT5yeF9jdXJyID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcnRsODE2OV9wcm9jZXNzX3J4X3BhY2tldHMgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisJdWludDMyX3Qgcnhfc3RhdHVzOworCXVpbnQxNl90IHJ4X2xlbjsKKwlzdHJ1Y3QgUnhEZXNjICpyeF9jdXJyX2Rlc2M7CisJaW50IGk7CisKKwlEQkdQICggInJ0bDgxNjlfcHJvY2Vzc19yeF9wYWNrZXRzXG4iICk7CisKKwlmb3IgKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisKKwkJcnhfY3Vycl9kZXNjID0gdHAtPnJ4X2Jhc2UgICsgdHAtPnJ4X2N1cnI7CisKKwkJcnhfc3RhdHVzID0gcnhfY3Vycl9kZXNjLT5vcHRzMTsKKworCQlEQkcyICggIkJlZm9yZSBEZXNjT3duIGNoZWNrIHJ4X3N0YXR1czogJSMwOHhcbiIsIHJ4X3N0YXR1cyApOworCisJCS8qIEhhcmR3YXJlIHN0aWxsIG93bnMgdGhlIGRlc2NyaXB0b3IgKi8KKwkJaWYgKCByeF9zdGF0dXMgJiBEZXNjT3duICkKKwkJCWJyZWFrOworCisJCS8qIFdlIG93biB0aGUgZGVzY3JpcHRvciwgYnV0IGl0IGhhcyBub3QgYmVlbiByZWZpbGxlZCB5ZXQgKi8KKwkJaWYgKCB0cC0+cnhfaW9idWZbdHAtPnJ4X2N1cnJdID09IE5VTEwgKQorCQkJYnJlYWs7CisKKwkJcnhfbGVuID0gcnhfc3RhdHVzICYgMHgzZmZmOworCisJCURCRyAoICJSZWNlaXZlZCBwYWNrZXQuXG4iICk7CisJCURCRyAoICJ0cC0+cnhfY3VyciAgICAgICAgID0gJWRcbiIsIHRwLT5yeF9jdXJyICk7CisJCURCRyAoICJyeF9sZW4gICAgICAgICAgICAgID0gJWRcbiIsIHJ4X2xlbiApOworCQlEQkcgKCAicnhfc3RhdHVzICAgICAgICAgICA9ICUjMDh4XG4iLCByeF9zdGF0dXMgKTsKKwkJREJHICggInJ4X2N1cnJfZGVzYyAgICAgICAgPSAlIzA4bHhcbiIsIHZpcnRfdG9fYnVzICggcnhfY3Vycl9kZXNjICkgKTsKKworCQlpZiAoIHJ4X3N0YXR1cyAmIFJ4UkVTICkgeworCisJCQluZXRkZXZfcnhfZXJyICggbmV0ZGV2LCB0cC0+cnhfaW9idWZbdHAtPnJ4X2N1cnJdLCAtRUlOVkFMICk7CisKKwkJCURCRyAoICJydGw4MTY5X3BvbGw6IENvcnJ1cHRlZCBwYWNrZXQgcmVjZWl2ZWQhXG4iCisJCQkgICAgICAgIiByeF9zdGF0dXM6ICUjMDh4XG4iLCByeF9zdGF0dXMgKTsKKworCQl9IGVsc2UgCXsKKworCQkJLyogQWRqdXN0IHNpemUgb2YgdGhlIGlvYnVmIHRvIHJlZmxlY3QgcmVjZWl2ZWQgZGF0YSAqLworCQkJaW9iX3B1dCAoIHRwLT5yeF9pb2J1Zlt0cC0+cnhfY3Vycl0sIHJ4X2xlbiApOworCisJCQkvKiBBZGQgdGhpcyBwYWNrZXQgdG8gdGhlIHJlY2VpdmUgcXVldWUuICAqLworCQkJbmV0ZGV2X3J4ICggbmV0ZGV2LCB0cC0+cnhfaW9idWZbdHAtPnJ4X2N1cnJdICk7CisJCX0KKworCQkvKiBJbnZhbGlkYXRlIHRoaXMgaW9idWYgYW5kIGRlc2NyaXB0b3IgKi8KKwkJdHAtPnJ4X2lvYnVmW3RwLT5yeF9jdXJyXSA9IE5VTEw7CisJCW1lbXNldCAoIHJ4X2N1cnJfZGVzYywgMCwgc2l6ZW9mICggKnJ4X2N1cnJfZGVzYyApICk7CisKKwkJLyogVXBkYXRlIHBvaW50ZXIgdG8gbmV4dCBhdmFpbGFibGUgcnggZGVzY3JpcHRvciAqLworCQl0cC0+cnhfY3VyciA9ICggdHAtPnJ4X2N1cnIgKyAxICkgJSBOVU1fUlhfREVTQzsKKwl9CisJcnRsODE2OV9yZWZpbGxfcnhfcmluZyAoIHRwICk7Cit9CisKK3N0YXRpYyB2b2lkCitydGw4MTY5X2ZyZWVfcnhfcmVzb3VyY2VzICggc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgKQoreworCWludCBpOworCisJREJHUCAoICJydGw4MTY5X2ZyZWVfcnhfcmVzb3VyY2VzXG4iICk7CisKKwlmcmVlX2RtYSAoIHRwLT5yeF9iYXNlLCBSODE2OV9SWF9SSU5HX0JZVEVTICk7CisKKwlmb3IgKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisJCWZyZWVfaW9iICggdHAtPnJ4X2lvYnVmW2ldICk7CisJCXRwLT5yeF9pb2J1ZltpXSA9IE5VTEw7CisJfQorfQorCisvKioKKyAgICBGSVhNRTogQmVjYXVzZSBnUFhFJ3MgcGNpX2RldmljZV9pZCBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhCisgICAgZmllbGQgdG8gY29udGFpbiBhcmJpdHJhcnkgZGF0YSwgd2UgbmVlZCB0aGUgZm9sbG93aW5nIHRhYmxlIHRvCisgICAgYXNzb2NpYXRlIFBDSSBJRHMgd2l0aCBuaWMgdmFyaWFudHMsIGJlY2F1c2UgYSBsb3Qgb2YgZHJpdmVyCisgICAgcm91dGluZXMgZGVwZW5kIG9uIGtub3dpbmcgd2hpY2gga2luZCBvZiB2YXJpYW50IHRoZXkgYXJlIGRlYWxpbmcKKyAgICB3aXRoLiAtLW1kYworICoqLworCisjZGVmaW5lIF9SKFZFTkRPUixERVZJQ0UsSU5ERVgpIFwKKwl7IC52ZW5kb3IgPSBWRU5ET1IsIC5kZXZpY2UgPSBERVZJQ0UsIC5pbmRleCA9IElOREVYIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdWludDE2X3QgdmVuZG9yOworCXVpbnQxNl90IGRldmljZTsKKwlpbnQgaW5kZXg7Cit9IG5pY192YXJpYW50X3RhYmxlW10gPSB7CisJX1IoMHgxMGVjLCAweDgxMjksIFJUTF9DRkdfMCksCisJX1IoMHgxMGVjLCAweDgxMzYsIFJUTF9DRkdfMiksCisJX1IoMHgxMGVjLCAweDgxNjcsIFJUTF9DRkdfMCksCisJX1IoMHgxMGVjLCAweDgxNjgsIFJUTF9DRkdfMSksCisJX1IoMHgxMGVjLCAweDgxNjksIFJUTF9DRkdfMCksCisJX1IoMHgxMTg2LCAweDQzMDAsIFJUTF9DRkdfMCksCisJX1IoMHgxMjU5LCAweGMxMDcsIFJUTF9DRkdfMCksCisJX1IoMHgxNmVjLCAweDAxMTYsIFJUTF9DRkdfMCksCisJX1IoMHgxNzM3LCAweDEwMzIsIFJUTF9DRkdfMCksCisJX1IoMHgwMDAxLCAweDgxNjgsIFJUTF9DRkdfMiksCit9OworI3VuZGVmIF9SCisKK3N0YXRpYyBpbnQKK3J0bDgxNjlfZ2V0X25pY192YXJpYW50ICggdWludDE2X3QgdmVuZG9yLCB1aW50MTZfdCBkZXZpY2UgKQoreworCXUzMiBpOworCisJREJHUCAoICJydGw4MTY5X2dldF9uaWNfdmFyaWFudFxuIiApOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmljX3ZhcmlhbnRfdGFibGUpOyBpKyspIHsKKwkJaWYgKCAoIG5pY192YXJpYW50X3RhYmxlW2ldLnZlbmRvciA9PSB2ZW5kb3IgKSAmJgorCQkgICAgICggbmljX3ZhcmlhbnRfdGFibGVbaV0uZGV2aWNlID09IGRldmljZSApICkgeworCQkJcmV0dXJuICggbmljX3ZhcmlhbnRfdGFibGVbaV0uaW5kZXggKTsKKwkJfQorCX0KKwlEQkcgKCAiTm8gbWF0Y2hpbmcgTklDIHZhcmlhbnQgZm91bmQhXG4iICk7CisJcmV0dXJuICggUlRMX0NGR18wICk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfaXJxX2VuYWJsZSAoIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwICkKK3sKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJREJHUCAoICJydGw4MTY5X2lycV9lbmFibGVcbiIgKTsKKworCVJUTF9XMTYgKCBJbnRyTWFzaywgdHAtPmludHJfZXZlbnQgKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9pcnFfZGlzYWJsZSAoIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwICkKK3sKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJREJHUCAoICJydGw4MTY5X2lycV9kaXNhYmxlXG4iICk7CisKKwlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2sgKCBpb2FkZHIgKTsKK30KKworLyoqKiBnUFhFIENvcmUgQVBJIFJvdXRpbmVzICoqKi8KKworLyoqCisgKiBvcGVuIC0gQ2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlIGFjdGl2ZQorICoKKyAqIEB2IG5ldGRldgluZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZSwgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlCisgKgorICoqLworc3RhdGljIGludAorcnRsODE2OV9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IHJjOworCisJREJHUCAoICJydGw4MTY5X29wZW5cbiIgKTsKKworCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisJcmMgPSBydGw4MTY5X3NldHVwX3R4X3Jlc291cmNlcyAoIHRwICk7CisJaWYgKCByYyApIHsKKwkJREJHICggIkVycm9yIHNldHRpbmcgdXAgVFggcmVzb3VyY2VzIVxuIiApOworCQlnb3RvIGVycl9zZXR1cF90eDsKKwl9CisKKwkvKiBhbGxvY2F0ZSByZWNlaXZlIGRlc2NyaXB0b3JzICovCisJcmMgPSBydGw4MTY5X3NldHVwX3J4X3Jlc291cmNlcyAoIHRwICk7CisJaWYgKCByYyApIHsKKwkJREJHICggIkVycm9yIHNldHRpbmcgdXAgUlggcmVzb3VyY2VzIVxuIiApOworCQlnb3RvIGVycl9zZXR1cF9yeDsKKwl9CisKKwlydGxfaHdfc3RhcnQgKCBuZXRkZXYgKTsKKworCURCRyAoICJUeERlc2NTdGFydEFkZHJIaWdoICAgPSAlIzA4bHhcbiIsIFJUTF9SMzIgKCBUeERlc2NTdGFydEFkZHJIaWdoICkgKTsKKwlEQkcgKCAiVHhEZXNjU3RhcnRBZGRyTG93ICAgID0gJSMwOGx4XG4iLCBSVExfUjMyICggVHhEZXNjU3RhcnRBZGRyTG93ICApICk7CisJREJHICggIlJ4RGVzY0FkZHJIaWdoICAgICAgICA9ICUjMDhseFxuIiwgUlRMX1IzMiAoIFJ4RGVzY0FkZHJIaWdoICkgKTsKKwlEQkcgKCAiUnhEZXNjQWRkckxvdyAgICAgICAgID0gJSMwOGx4XG4iLCBSVExfUjMyICggUnhEZXNjQWRkckxvdyAgKSApOworCisJcmV0dXJuIDA7CisKK2Vycl9zZXR1cF9yeDoKKwlydGw4MTY5X2ZyZWVfdHhfcmVzb3VyY2VzICggdHAgKTsKK2Vycl9zZXR1cF90eDoKKwlydGw4MTY5X2h3X3Jlc2V0ICggaW9hZGRyICk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogdHJhbnNtaXQgLSBUcmFuc21pdCBhIHBhY2tldAorICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorICogQHYgaW9idWYJSS9PIGJ1ZmZlcgorICoKKyAqIEByZXQgcmMgICAgICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorcnRsODE2OV90cmFuc21pdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1aW50MzJfdCB0eF9sZW4gPSBpb2JfbGVuICggaW9idWYgKTsKKworCXN0cnVjdCBUeERlc2MgKnR4X2N1cnJfZGVzYzsKKworCURCR1AgKCJydGw4MTY5X3RyYW5zbWl0XG4iKTsKKworCWlmICggdHAtPnR4X2ZpbGxfY3RyID09IE5VTV9UWF9ERVNDICkgeworCQlEQkcgKCJUWCBvdmVyZmxvd1xuIik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwkvKioKKwkgKiAgVGhlIHJ0bDgxNjkgZmFtaWx5IGF1dG9tYXRpY2FsbHkgcGFkcyBzaG9ydCBwYWNrZXRzIHRvIGEKKwkgKiAgbWluaW11bSBzaXplLCBidXQgaWYgaXQgZGlkIG5vdCwgbGlrZSBzb21lIG9sZGVyIGNhcmRzLAorCSAqICB3ZSBjb3VsZCBkbzoKKwkgKiAgaW9iX3BhZCAoIGlvYnVmLCBFVEhfWkxFTiApOworCSAqLworCisJLyogU2F2ZSBwb2ludGVyIHRvIHRoaXMgaW9idWYgd2UgaGF2ZSBiZWVuIGdpdmVuIHRvIHRyYW5zbWl0IHNvCisJICAgd2UgY2FuIHBhc3MgaXQgdG8gbmV0ZGV2X3R4X2NvbXBsZXRlKCkgbGF0ZXIgKi8KKwl0cC0+dHhfaW9idWZbdHAtPnR4X2N1cnJdID0gaW9idWY7CisKKwl0eF9jdXJyX2Rlc2MgPSB0cC0+dHhfYmFzZSArIHRwLT50eF9jdXJyOworCisJREJHICggInRwLT50eF9maWxsX2N0ciA9ICVkXG4iLCB0cC0+dHhfZmlsbF9jdHIgKTsKKwlEQkcgKCAidHAtPnR4X2N1cnIgICAgID0gJWRcbiIsIHRwLT50eF9jdXJyICk7CisJREJHICggInR4X2N1cnJfZGVzYyAgICA9ICUjMDhseFxuIiwgdmlydF90b19idXMgKCB0eF9jdXJyX2Rlc2MgKSApOworCURCRyAoICJpb2J1Zi0+ZGF0YSAgICAgPSAlIzA4bHhcbiIsIHZpcnRfdG9fYnVzICggaW9idWYtPmRhdGEgKSApOworCURCRyAoICJ0eF9sZW4gICAgICAgICAgPSAlZFxuIiwgdHhfbGVuICk7CisKKwkvKiBDb25maWd1cmUgY3VycmVudCBkZXNjcmlwdG9yIHRvIHRyYW5zbWl0IHN1cHBsaWVkIHBhY2tldCAqLworCXR4X2N1cnJfZGVzYy0+YWRkcl9oaSA9IDA7CisJdHhfY3Vycl9kZXNjLT5hZGRyX2xvID0gdmlydF90b19idXMgKCBpb2J1Zi0+ZGF0YSApOworCXR4X2N1cnJfZGVzYy0+b3B0czIgPSAwOworCXR4X2N1cnJfZGVzYy0+b3B0czEgPSBGaXJzdEZyYWcgfCBMYXN0RnJhZyB8CisJCSggdHAtPnR4X2N1cnIgPT0gKCBOVU1fVFhfREVTQyAtIDEgKSA/IFJpbmdFbmQgOiAwICkgfAorCQl0eF9sZW47CisKKwkvKiBNYXJrIGRlc2NyaXB0b3IgYXMgb3duZWQgYnkgTklDICovCisJdHhfY3Vycl9kZXNjLT5vcHRzMSB8PSBEZXNjT3duOworCisJREJHICggInR4X2N1cnJfZGVzYy0+b3B0czEgICA9ICUjMDh4XG4iLCB0eF9jdXJyX2Rlc2MtPm9wdHMxICk7CisJREJHICggInR4X2N1cnJfZGVzYy0+b3B0czIgICA9ICUjMDh4XG4iLCB0eF9jdXJyX2Rlc2MtPm9wdHMyICk7CisJREJHICggInR4X2N1cnJfZGVzYy0+YWRkcl9oaSA9ICUjMDh4XG4iLCB0eF9jdXJyX2Rlc2MtPmFkZHJfaGkgKTsKKwlEQkcgKCAidHhfY3Vycl9kZXNjLT5hZGRyX2xvID0gJSMwOHhcbiIsIHR4X2N1cnJfZGVzYy0+YWRkcl9sbyApOworCisJUlRMX1c4ICggVHhQb2xsLCBOUFEgKTsJLyogc2V0IHBvbGxpbmcgYml0ICovCisKKwkvKiBQb2ludCB0byBuZXh0IGZyZWUgZGVzY3JpcHRvciAqLworCXRwLT50eF9jdXJyID0gKCB0cC0+dHhfY3VyciArIDEgKSAlIE5VTV9UWF9ERVNDOworCisJLyogSW5jcmVtZW50IG51bWJlciBvZiB0eCBkZXNjcmlwdG9ycyBpbiB1c2UgKi8KKwl0cC0+dHhfZmlsbF9jdHIrKzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBvbGwgLSBQb2xsIGZvciByZWNlaXZlZCBwYWNrZXRzCisgKgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkCitydGw4MTY5X3BvbGwgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKworCXVpbnQxNl90IGludHJfc3RhdHVzOworCXVpbnQxNl90IGludHJfbWFzazsKKworCURCR1AgKCAicnRsODE2OV9wb2xsXG4iICk7CisKKwlpbnRyX3N0YXR1cyA9IFJUTF9SMTYgKCBJbnRyU3RhdHVzICk7CisJaW50cl9tYXNrICAgPSBSVExfUjE2ICggSW50ck1hc2sgKTsKKworCURCRzIgKCAicnRsODE2OV9wb2xsIChiZWZvcmUpOiBpbnRyX21hc2sgPSAlIzA0eCAgaW50cl9zdGF0dXMgPSAlIzA0eFxuIiwKKwkgICAgICBpbnRyX21hc2ssIGludHJfc3RhdHVzICk7CisKKwlSVExfVzE2ICggSW50clN0YXR1cywgMHhmZmZmICk7CisKKwkvKiBob3RwbHVnIC8gbWFqb3IgZXJyb3IgLyBubyBtb3JlIHdvcmsgLyBzaGFyZWQgaXJxICovCisJaWYgKCBpbnRyX3N0YXR1cyA9PSAweGZmZmYgKQorCQlyZXR1cm47CisKKwkvKiBQcm9jZXNzIHRyYW5zbWl0dGVkIHBhY2tldHMgKi8KKwlydGw4MTY5X3Byb2Nlc3NfdHhfcGFja2V0cyAoIG5ldGRldiApOworCisJLyogUHJvY2VzcyByZWNlaXZlZCBwYWNrZXRzICAqLworCXJ0bDgxNjlfcHJvY2Vzc19yeF9wYWNrZXRzICggbmV0ZGV2ICk7Cit9CisKKy8qKgorICogY2xvc2UgLSBEaXNhYmxlIG5ldHdvcmsgaW50ZXJmYWNlCisgKgorICogQHYgbmV0ZGV2CW5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiovCitzdGF0aWMgdm9pZAorcnRsODE2OV9jbG9zZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJREJHUCAoICJyODE2OV9jbG9zZVxuIiApOworCisJcnRsODE2OV9od19yZXNldCAoIGlvYWRkciApOworCisJcnRsODE2OV9mcmVlX3R4X3Jlc291cmNlcyAoIHRwICk7CisJcnRsODE2OV9mcmVlX3J4X3Jlc291cmNlcyAoIHRwICk7Cit9CisKKy8qKgorICogaXJxIC0gZW5hYmxlIG9yIERpc2FibGUgaW50ZXJydXB0cworICoKKyAqIEB2IG5ldGRldiAgICBuZXR3b3JrIGFkYXB0ZXIKKyAqIEB2IGFjdGlvbiAgICByZXF1ZXN0ZWQgaW50ZXJydXB0IGFjdGlvbgorICoKKyAqKi8KK3N0YXRpYyB2b2lkCitydGw4MTY5X2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBhY3Rpb24gKQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYgKCBuZXRkZXYgKTsKKworCURCR1AgKCAicnRsODE2OV9pcnFcbiIgKTsKKworCXN3aXRjaCAoIGFjdGlvbiApIHsKKwljYXNlIDAgOgorCQlydGw4MTY5X2lycV9kaXNhYmxlICggdHAgKTsKKwkJYnJlYWs7CisJZGVmYXVsdCA6CisJCXJ0bDgxNjlfaXJxX2VuYWJsZSAoIHRwICk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgcnRsODE2OV9vcGVyYXRpb25zID0geworCS5vcGVuICAgICAgICAgICA9IHJ0bDgxNjlfb3BlbiwKKwkudHJhbnNtaXQgICAgICAgPSBydGw4MTY5X3RyYW5zbWl0LAorCS5wb2xsICAgICAgICAgICA9IHJ0bDgxNjlfcG9sbCwKKwkuY2xvc2UgICAgICAgICAgPSBydGw4MTY5X2Nsb3NlLAorCS5pcnEgICAgICAgICAgICA9IHJ0bDgxNjlfaXJxLAorfTsKKworLyoqCisgKiBwcm9iZSAtIEluaXRpYWwgY29uZmlndXJhdGlvbiBvZiBOSUMKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgaWQJUENJIElEcworICoKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKiovCitzdGF0aWMgaW50CitydGw4MTY5X3Byb2JlICggc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQgKQoreworCWludCBpLCByYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwOworCXZvaWQgKmlvYWRkcjsKKworCS8qKiBGSVhNRTogVGhpcyBsb29rdXAgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZ1BYRSBkb2VzIG5vdCBoYXZlIGEgImRhdGEiCisJICAgIGVsZW1lbnQgaW4gdGhlIHN0cnVjdHVyZSBwY2lfZGV2aWNlX2lkIHdoaWNoIGNhbiBwYXNzIGFuIGFyYml0cmFyeQorCSAgICBwaWVjZSBvZiBkYXRhIHRvIHRoZSBkcml2ZXIuICBJdCBtaWdodCBiZSB1c2VmdWwgdG8gYWRkIGl0LiBUaGVuIHdlCisJICAgIGNvdWxkIGp1c3QgdXNlIGVudC0+ZGF0YSBpbnN0ZWFkIG9mIGhhdmluZyB0byBsb29rIHVwIGNmZ19pbmRleC4KKwkqKi8KKwlpbnQgY2ZnX2luZGV4ID0gcnRsODE2OV9nZXRfbmljX3ZhcmlhbnQgKCBlbnQtPnZlbmRvciwgZW50LT5kZXZpY2UgKTsKKwljb25zdCBzdHJ1Y3QgcnRsX2NmZ19pbmZvICpjZmcgPSBydGxfY2ZnX2luZm9zICsgY2ZnX2luZGV4OworCisJREJHUCAoICJydGw4MTY5X3Byb2JlXG4iICk7CisKKwlEQkcgKCAiZW50LT52ZW5kb3IgPSAlIzA0eCwgZW50LT5kZXZpY2UgPSAlIzA0eFxuIiwgZW50LT52ZW5kb3IsIGVudC0+ZGV2aWNlICk7CisKKwlEQkcgKCAiY2ZnX2luZGV4ID0gJWRcbiIsIGNmZ19pbmRleCApOworCURCRyAoICJjZmctPmludHJfZXZlbnQgPSAlIzA0eFxuIiwgY2ZnLT5pbnRyX2V2ZW50ICk7CisKKwlyYyA9IC1FTk9NRU07CisKKwkvKiBBbGxvY2F0ZSBuZXQgZGV2aWNlICggYWxzbyBhbGxvY2F0ZXMgbWVtb3J5IGZvciBuZXRkZXYtPnByaXYKKwkgICBhbmQgbWFrZXMgbmV0ZGV2LXByaXYgcG9pbnQgdG8gaXQgKQorCSAqLworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2ICggc2l6ZW9mICggKnRwICkgKTsKKworCWlmICggISBuZXRkZXYgKQorCQlnb3RvIGVycl9hbGxvY19ldGhlcmRldjsKKworCS8qIEFzc29jaWF0ZSBkcml2ZXItc3BlY2lmaWMgbmV0d29yayBvcGVyYXRpb25zIHdpdGgKKwkgICBnZW5lcmljIG5ldHdvcmsgZGV2aWNlIGxheWVyCisJICovCisJbmV0ZGV2X2luaXQgKCBuZXRkZXYsICZydGw4MTY5X29wZXJhdGlvbnMgKTsKKworCS8qIEFzc29jaWF0ZSB0aGlzIG5ldHdvcmsgZGV2aWNlIHdpdGggdGhlIGdpdmVuIFBDSSBkZXZpY2UgKi8KKwlwY2lfc2V0X2RydmRhdGEgKCBwZGV2LCBuZXRkZXYgKTsKKwluZXRkZXYtPmRldiA9ICZwZGV2LT5kZXY7CisKKwkvKiBJbml0aWFsaXplIGRyaXZlciBwcml2YXRlIHN0b3JhZ2UgKi8KKwl0cCA9IG5ldGRldl9wcml2ICggbmV0ZGV2ICk7CisJbWVtc2V0ICggdHAsIDAsICggc2l6ZW9mICggKnRwICkgKSApOworCisJdHAtPnBjaV9kZXYgICAgPSBwZGV2OworCXRwLT5pcnFubyAgICAgID0gcGRldi0+aXJxOworCXRwLT5uZXRkZXYgICAgID0gbmV0ZGV2OworCXRwLT5jZmdfaW5kZXggID0gY2ZnX2luZGV4OworCXRwLT5pbnRyX2V2ZW50ID0gY2ZnLT5pbnRyX2V2ZW50OworCXRwLT5jcF9jbWQgICAgID0gUENJTXVsUlc7CisKKwl0cC0+aHdfc3RhcnQgPSBjZmctPmh3X3N0YXJ0OworCisJcmMgPSAtRUlPOworCisJYWRqdXN0X3BjaV9kZXZpY2UgKCBwZGV2ICk7CisKKwkvKiBpb3JlbWFwIE1NSU8gcmVnaW9uICovCisJaW9hZGRyID0gaW9yZW1hcCAoIHBkZXYtPm1lbWJhc2UsIFI4MTY5X1JFR1NfU0laRSApOworCisJaWYgKCAhIGlvYWRkciApIHsKKwkJREJHICggImNhbm5vdCByZW1hcCBNTUlPXG4iICk7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwl0cC0+bW1pb19hZGRyID0gaW9hZGRyOworCisJdHAtPnBjaWVfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eSAoIHBkZXYsIFBDSV9DQVBfSURfRVhQICk7CisJaWYgKCB0cC0+cGNpZV9jYXAgKSB7CisJCURCRyAoICAiUENJIEV4cHJlc3MgY2FwYWJpbGl0eVxuIiApOworCX0gZWxzZSB7CisJCURCRyAoICAiTm8gUENJIEV4cHJlc3MgY2FwYWJpbGl0eVxuIiApOworCX0KKworCS8qIE1hc2sgaW50ZXJydXB0cyBqdXN0IGluIGNhc2UgKi8KKwlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2sgKCBpb2FkZHIgKTsKKworCS8qIFNvZnQgcmVzZXQgTklDICovCisJcnRsX3NvZnRfcmVzZXQgKCBuZXRkZXYgKTsKKworCS8qIElkZW50aWZ5IGNoaXAgYXR0YWNoZWQgdG8gYm9hcmQgKi8KKwlydGw4MTY5X2dldF9tYWNfdmVyc2lvbiAoIHRwLCBpb2FkZHIgKTsKKworCWZvciAoIGkgPSAwOyAodTMyKSBpIDwgQVJSQVlfU0laRSAoIHJ0bF9jaGlwX2luZm8gKTsgaSsrICkgeworCQlpZiAoIHRwLT5tYWNfdmVyc2lvbiA9PSBydGxfY2hpcF9pbmZvW2ldLm1hY192ZXJzaW9uICkKKwkJCWJyZWFrOworCX0KKwlpZiAoIGkgPT0gQVJSQVlfU0laRShydGxfY2hpcF9pbmZvICkgKSB7CisJCS8qIFVua25vd24gY2hpcDogYXNzdW1lIGFycmF5IGVsZW1lbnQgIzAsIG9yaWdpbmFsIFJUTC04MTY5ICovCisJCURCRyAoICJVbmtub3duIGNoaXAgdmVyc2lvbiwgYXNzdW1pbmcgJXNcbiIsIHJ0bF9jaGlwX2luZm9bMF0ubmFtZSApOworCQlpID0gMDsKKwl9CisJdHAtPmNoaXBzZXQgPSBpOworCisJaWYgKCh0cC0+bWFjX3ZlcnNpb24gPD0gUlRMX0dJR0FfTUFDX1ZFUl8wNikgJiYKKwkgICAgKFJUTF9SOChQSFlzdGF0dXMpICYgVEJJX0VuYWJsZSkpIHsKKwkJdHAtPnNldF9zcGVlZCA9IHJ0bDgxNjlfc2V0X3NwZWVkX3RiaTsKKwkJdHAtPnBoeV9yZXNldF9lbmFibGUgPSBydGw4MTY5X3RiaV9yZXNldF9lbmFibGU7CisJCXRwLT5waHlfcmVzZXRfcGVuZGluZyA9IHJ0bDgxNjlfdGJpX3Jlc2V0X3BlbmRpbmc7CisJCXRwLT5saW5rX29rID0gcnRsODE2OV90YmlfbGlua19vazsKKworCQl0cC0+cGh5XzEwMDBfY3RybF9yZWcgPSBBRFZFUlRJU0VfMTAwMEZVTEw7IC8qIEltcGxpZWQgYnkgVEJJICovCisJfSBlbHNlIHsKKwkJdHAtPnNldF9zcGVlZCA9IHJ0bDgxNjlfc2V0X3NwZWVkX3htaWk7CisJCXRwLT5waHlfcmVzZXRfZW5hYmxlID0gcnRsODE2OV94bWlpX3Jlc2V0X2VuYWJsZTsKKwkJdHAtPnBoeV9yZXNldF9wZW5kaW5nID0gcnRsODE2OV94bWlpX3Jlc2V0X3BlbmRpbmc7CisJCXRwLT5saW5rX29rID0gcnRsODE2OV94bWlpX2xpbmtfb2s7CisJfQorCisJLyogR2V0IE1BQyBhZGRyZXNzICovCisJZm9yICggaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKyApCisJCW5ldGRldi0+aHdfYWRkcltpXSA9IFJUTF9SOCAoIE1BQzAgKyBpICk7CisKKwlEQkcgKCAiJXNcbiIsIGV0aF9udG9hICggbmV0ZGV2LT5od19hZGRyICkgKTsKKworCXJ0bDgxNjlfaW5pdF9waHkgKCBuZXRkZXYsIHRwICk7CisKKwlpZiAoICggcmMgPSByZWdpc3Rlcl9uZXRkZXYgKCBuZXRkZXYgKSApICE9IDAgKQorCQlnb3RvIGVycl9yZWdpc3RlcjsKKworCS8qIE1hcmsgYXMgbGluayB1cDsgd2UgZG9uJ3QgeWV0IGhhbmRsZSBsaW5rIHN0YXRlICovCisJbmV0ZGV2X2xpbmtfdXAgKCBuZXRkZXYgKTsKKworCURCRyAoICJydGw4MTY5X3Byb2JlIHN1Y2NlZWRlZCFcbiIgKTsKKworCS8qIE5vIGVycm9ycywgcmV0dXJuIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gMDsKKworLyogRXJyb3IgcmV0dXJuIHBhdGhzICovCitlcnJfcmVnaXN0ZXI6CitlcnJfaW9yZW1hcDoKKwluZXRkZXZfcHV0ICggbmV0ZGV2ICk7CitlcnJfYWxsb2NfZXRoZXJkZXY6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHJlbW92ZSAtIERldmljZSBSZW1vdmFsIFJvdXRpbmUKKyAqCisgKiBAdiBwZGV2IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CisgKgorICoqLworc3RhdGljIHZvaWQKK3J0bDgxNjlfcmVtb3ZlICggc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYgKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKCBwZGV2ICk7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdiAoIG5ldGRldiApOworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisKKwlEQkdQICggInJ0bDgxNjlfcmVtb3ZlXG4iICk7CisKKwlydGw4MTY5X2h3X3Jlc2V0ICggaW9hZGRyICk7CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoIG5ldGRldiApOworCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnRsODE2OV9uaWNzW10gPSB7CisJUENJX1JPTSgweDEwZWMsIDB4ODEyOSwgInJ0bDgxNjktMHg4MTI5IiwgInJ0bDgxNjktMHg4MTI5IiwgMCksCisJUENJX1JPTSgweDEwZWMsIDB4ODEzNiwgInJ0bDgxNjktMHg4MTM2IiwgInJ0bDgxNjktMHg4MTM2IiwgMCksCisJUENJX1JPTSgweDEwZWMsIDB4ODE2NywgInJ0bDgxNjktMHg4MTY3IiwgInJ0bDgxNjktMHg4MTY3IiwgMCksCisJUENJX1JPTSgweDEwZWMsIDB4ODE2OCwgInJ0bDgxNjktMHg4MTY4IiwgInJ0bDgxNjktMHg4MTY4IiwgMCksCisJUENJX1JPTSgweDEwZWMsIDB4ODE2OSwgInJ0bDgxNjktMHg4MTY5IiwgInJ0bDgxNjktMHg4MTY5IiwgMCksCisJUENJX1JPTSgweDExODYsIDB4NDMwMCwgInJ0bDgxNjktMHg0MzAwIiwgInJ0bDgxNjktMHg0MzAwIiwgMCksCisJUENJX1JPTSgweDEyNTksIDB4YzEwNywgInJ0bDgxNjktMHhjMTA3IiwgInJ0bDgxNjktMHhjMTA3IiwgMCksCisJUENJX1JPTSgweDE2ZWMsIDB4MDExNiwgInJ0bDgxNjktMHgwMTE2IiwgInJ0bDgxNjktMHgwMTE2IiwgMCksCisJUENJX1JPTSgweDE3MzcsIDB4MTAzMiwgInJ0bDgxNjktMHgxMDMyIiwgInJ0bDgxNjktMHgxMDMyIiwgMCksCisJUENJX1JPTSgweDAwMDEsIDB4ODE2OCwgInJ0bDgxNjktMHg4MTY4IiwgInJ0bDgxNjktMHg4MTY4IiwgMCksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBydGw4MTY5X2RyaXZlciBfX3BjaV9kcml2ZXIgPSB7CisgIC5pZHMgPSBydGw4MTY5X25pY3MsCisgIC5pZF9jb3VudCA9ICggc2l6ZW9mICggcnRsODE2OV9uaWNzICkgLyBzaXplb2YgKCBydGw4MTY5X25pY3NbMF0gKSApLAorICAucHJvYmUgPSBydGw4MTY5X3Byb2JlLAorICAucmVtb3ZlID0gcnRsODE2OV9yZW1vdmUsCit9OworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcjgxNjkuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3I4MTY5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2NzliMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3I4MTY5LmgKQEAgLTAsMCArMSw0ODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFydHkgQ29ubm9yIDxtZGNAZXRoZXJib290Lm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBFbnRpdHkgQ3liZXIsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gcnRsODE2OSBkYXRhIHNoZWV0cyBhbmQgd29yayBieToKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgU2h1Q2hlbiA8c2h1Y2hlbkByZWFsdGVrLmNvbS50dz4KKyAqIENvcHlyaWdodCAoYykgMjAwMyAtIDIwMDcgRnJhbmNvaXMgUm9taWV1IDxyb21pZXVAZnIuem9yZWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgYSBsb3Qgb2YgcGVvcGxlIHRvby4gUGxlYXNlIHJlc3BlY3QgdGhlaXIgd29yay4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaWZuZGVmIF9SODE2OV9IXworI2RlZmluZSBfUjgxNjlfSF8KKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKKworLyoqIEZJWE1FOiBpbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmggaGFzIHRoZXNlIFBDSSByZWdzLCBtYXliZQorCSAgIHdlIG5lZWQgc3VjaCBhIGZpbGUgaW4gZ1BYRT8KKyoqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVEwJICAgICAgICA4CS8qIERldmljZSBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9SRUFEUlEJMHg3MDAwCS8qIE1heF9SZWFkX1JlcXVlc3RfU2l6ZSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVEwJCTE2CS8qIExpbmsgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfQ0xLUkVRX0VOIDB4MTAwCS8qIEVuYWJsZSBjbGtyZXEgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX05PU05PT1BfRU4gMHgwODAwICAvKiBFbmFibGUgTm8gU25vb3AgKi8KKworLyoqIEZJWE1FOiB1cGRhdGUgbWlpLmggaW4gc3JjL2luY2x1ZGUvbWlpLmggZnJvbSBMaW51eCBzb3VyY2VzCisJICAgc28gd2UgZG9uJ3QgaGF2ZSB0byBpbmNsdWRlIHRoZXNlIGRlZmluaXRpaW9ucy4KKyoqLworLyogVGhlIGZvcmNlZCBzcGVlZCwgMTBNYiwgMTAwTWIsIGdpZ2FiaXQsIDIuNUdiLCAxMEdiRS4gKi8KKyNkZWZpbmUgU1BFRURfMTAJCTEwCisjZGVmaW5lIFNQRUVEXzEwMAkJMTAwCisjZGVmaW5lIFNQRUVEXzEwMDAJCTEwMDAKKyNkZWZpbmUgU1BFRURfMjUwMAkJMjUwMAorI2RlZmluZSBTUEVFRF8xMDAwMAkJMTAwMDAKKworLyogRHVwbGV4LCBoYWxmIG9yIGZ1bGwuICovCisjZGVmaW5lIERVUExFWF9IQUxGCQkweDAwCisjZGVmaW5lIERVUExFWF9GVUxMCQkweDAxCisKKyNkZWZpbmUgQVVUT05FR19ESVNBQkxFCQkweDAwCisjZGVmaW5lIEFVVE9ORUdfRU5BQkxFCQkweDAxCisKKy8qIE1BQyBhZGRyZXNzIGxlbmd0aCAqLworI2RlZmluZSBNQUNfQUREUl9MRU4JNgorCisjZGVmaW5lIE1BWF9SRUFEX1JFUVVFU1RfU0hJRlQJMTIKKyNkZWZpbmUgUlhfRklGT19USFJFU0gJNwkvKiA3IG1lYW5zIE5PIHRocmVzaG9sZCwgUnggYnVmZmVyIGxldmVsIGJlZm9yZSBmaXJzdCBQQ0kgeGZlci4gKi8KKyNkZWZpbmUgUlhfRE1BX0JVUlNUCTYJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCisjZGVmaW5lIFRYX0RNQV9CVVJTVAk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLworI2RlZmluZSBFYXJseVR4VGhsZAkweDNGCS8qIDB4M0YgbWVhbnMgTk8gZWFybHkgdHJhbnNtaXQgKi8KKyNkZWZpbmUgUnhQYWNrZXRNYXhTaXplCTB4M0ZFOAkvKiAxNksgLSAxIC0gRVRIX0hMRU4gLSBWTEFOIC0gQ1JDLi4uICovCisjZGVmaW5lIFNhZmVNdHUJCTB4MWMyMAkvKiAuLi4gYWN0dWFsbHkgbGlmZSBzdWNrcyBiZXlvbmQgfjdrICovCisjZGVmaW5lIEludGVyRnJhbWVHYXAJMHgwMwkvKiAzIG1lYW5zIEludGVyRnJhbWVHYXAgPSB0aGUgc2hvcnRlc3Qgb25lICovCisKKyNkZWZpbmUgUjgxNjlfUkVHU19TSVpFCQkyNTYKKyNkZWZpbmUgUjgxNjlfTkFQSV9XRUlHSFQJNjQKKyNkZWZpbmUgTlVNX1RYX0RFU0MJOAkvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MJOAkvKiBOdW1iZXIgb2YgUnggZGVzY3JpcHRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUlhfQlVGX1NJWkUJMTUzNgkvKiBSeCBCdWZmZXIgc2l6ZSAqLworI2RlZmluZSBSODE2OV9UWF9SSU5HX0JZVEVTCShOVU1fVFhfREVTQyAqIHNpemVvZihzdHJ1Y3QgVHhEZXNjKSkKKyNkZWZpbmUgUjgxNjlfUlhfUklOR19CWVRFUwkoTlVNX1JYX0RFU0MgKiBzaXplb2Yoc3RydWN0IFJ4RGVzYykpCisKKyNkZWZpbmUgVFhfUklOR19BTElHTgkJMjU2CisjZGVmaW5lIFJYX1JJTkdfQUxJR04JCTI1NgorCisjZGVmaW5lIFJUTDgxNjlfVFhfVElNRU9VVAkoNipIWikKKyNkZWZpbmUgUlRMODE2OV9QSFlfVElNRU9VVAkoMTAqSFopCisKKyNkZWZpbmUgUlRMX0VFUFJPTV9TSUcJCWNwdV90b19sZTMyKDB4ODEyOSkKKyNkZWZpbmUgUlRMX0VFUFJPTV9TSUdfTUFTSwljcHVfdG9fbGUzMigweGZmZmYpCisjZGVmaW5lIFJUTF9FRVBST01fU0lHX0FERFIJMHgwMDAwCisKKy8qIHdyaXRlL3JlYWQgTU1JTyByZWdpc3RlciAqLworI2RlZmluZSBSVExfVzgocmVnLCB2YWw4KQl3cml0ZWIgKCh2YWw4KSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9XMTYocmVnLCB2YWwxNikJd3JpdGV3ICgodmFsMTYpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1czMihyZWcsIHZhbDMyKQl3cml0ZWwgKCh2YWwzMiksIGlvYWRkciArIChyZWcpKQorI2RlZmluZSBSVExfUjgocmVnKQkJcmVhZGIgKGlvYWRkciArIChyZWcpKQorI2RlZmluZSBSVExfUjE2KHJlZykJCXJlYWR3IChpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1IzMihyZWcpCQkoKHVuc2lnbmVkIGxvbmcpIHJlYWRsIChpb2FkZHIgKyAocmVnKSkpCisKK2VudW0gbWFjX3ZlcnNpb24geworCVJUTF9HSUdBX01BQ19WRVJfMDEgPSAweDAxLCAvLyA4MTY5CisJUlRMX0dJR0FfTUFDX1ZFUl8wMiA9IDB4MDIsIC8vIDgxNjlTCisJUlRMX0dJR0FfTUFDX1ZFUl8wMyA9IDB4MDMsIC8vIDgxMTBTCisJUlRMX0dJR0FfTUFDX1ZFUl8wNCA9IDB4MDQsIC8vIDgxNjlTQgorCVJUTF9HSUdBX01BQ19WRVJfMDUgPSAweDA1LCAvLyA4MTEwU0NkCisJUlRMX0dJR0FfTUFDX1ZFUl8wNiA9IDB4MDYsIC8vIDgxMTBTQ2UKKwlSVExfR0lHQV9NQUNfVkVSXzA3ID0gMHgwNywgLy8gODEwMmUKKwlSVExfR0lHQV9NQUNfVkVSXzA4ID0gMHgwOCwgLy8gODEwMmUKKwlSVExfR0lHQV9NQUNfVkVSXzA5ID0gMHgwOSwgLy8gODEwMmUKKwlSVExfR0lHQV9NQUNfVkVSXzEwID0gMHgwYSwgLy8gODEwMWUKKwlSVExfR0lHQV9NQUNfVkVSXzExID0gMHgwYiwgLy8gODE2OEJiCisJUlRMX0dJR0FfTUFDX1ZFUl8xMiA9IDB4MGMsIC8vIDgxNjhCZQorCVJUTF9HSUdBX01BQ19WRVJfMTMgPSAweDBkLCAvLyA4MTAxRWIKKwlSVExfR0lHQV9NQUNfVkVSXzE0ID0gMHgwZSwgLy8gODEwMSA/CisJUlRMX0dJR0FfTUFDX1ZFUl8xNSA9IDB4MGYsIC8vIDgxMDEgPworCVJUTF9HSUdBX01BQ19WRVJfMTYgPSAweDExLCAvLyA4MTAxRWMKKwlSVExfR0lHQV9NQUNfVkVSXzE3ID0gMHgxMCwgLy8gODE2OEJmCisJUlRMX0dJR0FfTUFDX1ZFUl8xOCA9IDB4MTIsIC8vIDgxNjhDUAorCVJUTF9HSUdBX01BQ19WRVJfMTkgPSAweDEzLCAvLyA4MTY4QworCVJUTF9HSUdBX01BQ19WRVJfMjAgPSAweDE0LCAvLyA4MTY4QworCVJUTF9HSUdBX01BQ19WRVJfMjEgPSAweDE1LCAvLyA4MTY4QworCVJUTF9HSUdBX01BQ19WRVJfMjIgPSAweDE2LCAvLyA4MTY4QworCVJUTF9HSUdBX01BQ19WRVJfMjMgPSAweDE3LCAvLyA4MTY4Q1AKKwlSVExfR0lHQV9NQUNfVkVSXzI0ID0gMHgxOCwgLy8gODE2OENQCisJUlRMX0dJR0FfTUFDX1ZFUl8yNSA9IDB4MTksIC8vIDgxNjhECit9OworCisjZGVmaW5lIF9SKE5BTUUsTUFDLE1BU0spIFwKKwl7IC5uYW1lID0gTkFNRSwgLm1hY192ZXJzaW9uID0gTUFDLCAuUnhDb25maWdNYXNrID0gTUFTSyB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggbWFjX3ZlcnNpb247CisJdTMyIFJ4Q29uZmlnTWFzazsJLyogQ2xlYXJzIHRoZSBiaXRzIHN1cHBvcnRlZCBieSB0aGlzIGNoaXAgKi8KK30gcnRsX2NoaXBfaW5mb1tdID0geworCV9SKCJSVEw4MTY5IiwJCVJUTF9HSUdBX01BQ19WRVJfMDEsIDB4ZmY3ZTE4ODApLCAvLyA4MTY5CisJX1IoIlJUTDgxNjlzIiwJCVJUTF9HSUdBX01BQ19WRVJfMDIsIDB4ZmY3ZTE4ODApLCAvLyA4MTY5UworCV9SKCJSVEw4MTEwcyIsCQlSVExfR0lHQV9NQUNfVkVSXzAzLCAweGZmN2UxODgwKSwgLy8gODExMFMKKwlfUigiUlRMODE2OXNiLzgxMTBzYiIsCVJUTF9HSUdBX01BQ19WRVJfMDQsIDB4ZmY3ZTE4ODApLCAvLyA4MTY5U0IKKwlfUigiUlRMODE2OXNjLzgxMTBzYyIsCVJUTF9HSUdBX01BQ19WRVJfMDUsIDB4ZmY3ZTE4ODApLCAvLyA4MTEwU0NkCisJX1IoIlJUTDgxNjlzYy84MTEwc2MiLAlSVExfR0lHQV9NQUNfVkVSXzA2LCAweGZmN2UxODgwKSwgLy8gODExMFNDZQorCV9SKCJSVEw4MTAyZSIsCQlSVExfR0lHQV9NQUNfVkVSXzA3LCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODEwMmUiLAkJUlRMX0dJR0FfTUFDX1ZFUl8wOCwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCisJX1IoIlJUTDgxMDJlIiwJCVJUTF9HSUdBX01BQ19WRVJfMDksIDB4ZmY3ZTE4ODApLCAvLyBQQ0ktRQorCV9SKCJSVEw4MTAxZSIsCQlSVExfR0lHQV9NQUNfVkVSXzEwLCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODE2OGIvODExMWIiLAlSVExfR0lHQV9NQUNfVkVSXzExLCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODE2OGIvODExMWIiLAlSVExfR0lHQV9NQUNfVkVSXzEyLCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODEwMWUiLAkJUlRMX0dJR0FfTUFDX1ZFUl8xMywgMHhmZjdlMTg4MCksIC8vIFBDSS1FIDgxMzkKKwlfUigiUlRMODEwMGUiLAkJUlRMX0dJR0FfTUFDX1ZFUl8xNCwgMHhmZjdlMTg4MCksIC8vIFBDSS1FIDgxMzkKKwlfUigiUlRMODEwMGUiLAkJUlRMX0dJR0FfTUFDX1ZFUl8xNSwgMHhmZjdlMTg4MCksIC8vIFBDSS1FIDgxMzkKKwlfUigiUlRMODE2OGIvODExMWIiLAlSVExfR0lHQV9NQUNfVkVSXzE3LCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODEwMWUiLAkJUlRMX0dJR0FfTUFDX1ZFUl8xNiwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCisJX1IoIlJUTDgxNjhjcC84MTExY3AiLAlSVExfR0lHQV9NQUNfVkVSXzE4LCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODE2OGMvODExMWMiLAlSVExfR0lHQV9NQUNfVkVSXzE5LCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODE2OGMvODExMWMiLAlSVExfR0lHQV9NQUNfVkVSXzIwLCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODE2OGMvODExMWMiLAlSVExfR0lHQV9NQUNfVkVSXzIxLCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODE2OGMvODExMWMiLAlSVExfR0lHQV9NQUNfVkVSXzIyLCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODE2OGNwLzgxMTFjcCIsCVJUTF9HSUdBX01BQ19WRVJfMjMsIDB4ZmY3ZTE4ODApLCAvLyBQQ0ktRQorCV9SKCJSVEw4MTY4Y3AvODExMWNwIiwJUlRMX0dJR0FfTUFDX1ZFUl8yNCwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCisJX1IoIlJUTDgxNjhkLzgxMTFkIiwJUlRMX0dJR0FfTUFDX1ZFUl8yNSwgMHhmZjdlMTg4MCkgIC8vIFBDSS1FCit9OworI3VuZGVmIF9SCisKK2VudW0gY2ZnX3ZlcnNpb24geworCVJUTF9DRkdfMCA9IDB4MDAsCisJUlRMX0NGR18xLAorCVJUTF9DRkdfMgorfTsKKworI2lmIDAKKy8qKiBEZXZpY2UgVGFibGUgZnJvbSBMaW51eCBEcml2ZXIgKiovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnRsODE2OV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywJMHg4MTI5KSwgMCwgMCwgUlRMX0NGR18wIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywJMHg4MTM2KSwgMCwgMCwgUlRMX0NGR18yIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywJMHg4MTY3KSwgMCwgMCwgUlRMX0NGR18wIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywJMHg4MTY4KSwgMCwgMCwgUlRMX0NGR18xIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywJMHg4MTY5KSwgMCwgMCwgUlRMX0NGR18wIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfRExJTkssCTB4NDMwMCksIDAsIDAsIFJUTF9DRkdfMCB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FULAkJMHhjMTA3KSwgMCwgMCwgUlRMX0NGR18wIH0sCisJeyBQQ0lfREVWSUNFKDB4MTZlYywJCQkweDAxMTYpLCAwLCAwLCBSVExfQ0ZHXzAgfSwKKwl7IFBDSV9WRU5ET1JfSURfTElOS1NZUywJCTB4MTAzMiwKKwkJUENJX0FOWV9JRCwgMHgwMDI0LCAwLCAwLCBSVExfQ0ZHXzAgfSwKKwl7IDB4MDAwMSwJCQkJMHg4MTY4LAorCQlQQ0lfQU5ZX0lELCAweDI0MTAsIDAsIDAsIFJUTF9DRkdfMiB9LAorCXswLH0sCit9OworI2VuZGlmCisKK2VudW0gcnRsX3JlZ2lzdGVycyB7CisJTUFDMAkJPSAwLAkvKiBFdGhlcm5ldCBoYXJkd2FyZSBhZGRyZXNzLiAqLworCU1BQzQJCT0gNCwKKwlNQVIwCQk9IDgsCS8qIE11bHRpY2FzdCBmaWx0ZXIuICovCisJQ291bnRlckFkZHJMb3cJCT0gMHgxMCwKKwlDb3VudGVyQWRkckhpZ2gJCT0gMHgxNCwKKwlUeERlc2NTdGFydEFkZHJMb3cJPSAweDIwLAorCVR4RGVzY1N0YXJ0QWRkckhpZ2gJPSAweDI0LAorCVR4SERlc2NTdGFydEFkZHJMb3cJPSAweDI4LAorCVR4SERlc2NTdGFydEFkZHJIaWdoCT0gMHgyYywKKwlGTEFTSAkJPSAweDMwLAorCUVSU1IJCT0gMHgzNiwKKwlDaGlwQ21kCQk9IDB4MzcsCisJVHhQb2xsCQk9IDB4MzgsCisJSW50ck1hc2sJPSAweDNjLAorCUludHJTdGF0dXMJPSAweDNlLAorCVR4Q29uZmlnCT0gMHg0MCwKKwlSeENvbmZpZwk9IDB4NDQsCisJUnhNaXNzZWQJPSAweDRjLAorCUNmZzkzNDYJCT0gMHg1MCwKKwlDb25maWcwCQk9IDB4NTEsCisJQ29uZmlnMQkJPSAweDUyLAorCUNvbmZpZzIJCT0gMHg1MywKKwlDb25maWczCQk9IDB4NTQsCisJQ29uZmlnNAkJPSAweDU1LAorCUNvbmZpZzUJCT0gMHg1NiwKKwlNdWx0aUludHIJPSAweDVjLAorCVBIWUFSCQk9IDB4NjAsCisJUEhZc3RhdHVzCT0gMHg2YywKKwlSeE1heFNpemUJPSAweGRhLAorCUNQbHVzQ21kCT0gMHhlMCwKKwlJbnRyTWl0aWdhdGUJPSAweGUyLAorCVJ4RGVzY0FkZHJMb3cJPSAweGU0LAorCVJ4RGVzY0FkZHJIaWdoCT0gMHhlOCwKKwlFYXJseVR4VGhyZXMJPSAweGVjLAorCUZ1bmNFdmVudAk9IDB4ZjAsCisJRnVuY0V2ZW50TWFzawk9IDB4ZjQsCisJRnVuY1ByZXNldFN0YXRlCT0gMHhmOCwKKwlGdW5jRm9yY2VFdmVudAk9IDB4ZmMsCit9OworCitlbnVtIHJ0bDgxMTBfcmVnaXN0ZXJzIHsKKwlUQklDU1IJCQk9IDB4NjQsCisJVEJJX0FOQVIJCT0gMHg2OCwKKwlUQklfTFBBUgkJPSAweDZhLAorfTsKKworZW51bSBydGw4MTY4XzgxMDFfcmVnaXN0ZXJzIHsKKwlDU0lEUgkJCT0gMHg2NCwKKwlDU0lBUgkJCT0gMHg2OCwKKyNkZWZpbmUJQ1NJQVJfRkxBRwkJCTB4ODAwMDAwMDAKKyNkZWZpbmUJQ1NJQVJfV1JJVEVfQ01ECQkJMHg4MDAwMDAwMAorI2RlZmluZQlDU0lBUl9CWVRFX0VOQUJMRQkJMHgwZgorI2RlZmluZQlDU0lBUl9CWVRFX0VOQUJMRV9TSElGVAkJMTIKKyNkZWZpbmUJQ1NJQVJfQUREUl9NQVNLCQkJMHgwZmZmCisKKwlFUEhZQVIJCQk9IDB4ODAsCisjZGVmaW5lCUVQSFlBUl9GTEFHCQkJMHg4MDAwMDAwMAorI2RlZmluZQlFUEhZQVJfV1JJVEVfQ01ECQkweDgwMDAwMDAwCisjZGVmaW5lCUVQSFlBUl9SRUdfTUFTSwkJCTB4MWYKKyNkZWZpbmUJRVBIWUFSX1JFR19TSElGVAkJMTYKKyNkZWZpbmUJRVBIWUFSX0RBVEFfTUFTSwkJMHhmZmZmCisJREJHX1JFRwkJCT0gMHhkMSwKKyNkZWZpbmUJRklYX05BS18xCQkJKDEgPDwgNCkKKyNkZWZpbmUJRklYX05BS18yCQkJKDEgPDwgMykKK307CisKK2VudW0gcnRsX3JlZ2lzdGVyX2NvbnRlbnQgeworCS8qIEludGVycnVwdFN0YXR1c0JpdHMgKi8KKwlTWVNFcnIJCT0gMHg4MDAwLAorCVBDU1RpbWVvdXQJPSAweDQwMDAsCisJU1dJbnQJCT0gMHgwMTAwLAorCVR4RGVzY1VuYXZhaWwJPSAweDAwODAsCisJUnhGSUZPT3Zlcgk9IDB4MDA0MCwKKwlMaW5rQ2hnCQk9IDB4MDAyMCwKKwlSeE92ZXJmbG93CT0gMHgwMDEwLAorCVR4RXJyCQk9IDB4MDAwOCwKKwlUeE9LCQk9IDB4MDAwNCwKKwlSeEVycgkJPSAweDAwMDIsCisJUnhPSwkJPSAweDAwMDEsCisKKwkvKiBSeFN0YXR1c0Rlc2MgKi8KKwlSeEZPVkYJPSAoMSA8PCAyMyksCisJUnhSV1QJPSAoMSA8PCAyMiksCisJUnhSRVMJPSAoMSA8PCAyMSksCisJUnhSVU5UCT0gKDEgPDwgMjApLAorCVJ4Q1JDCT0gKDEgPDwgMTkpLAorCisJLyogQ2hpcENtZEJpdHMgKi8KKwlDbWRSZXNldAk9IDB4MTAsCisJQ21kUnhFbmIJPSAweDA4LAorCUNtZFR4RW5iCT0gMHgwNCwKKwlSeEJ1ZkVtcHR5CT0gMHgwMSwKKworCS8qIFRYUG9sbCByZWdpc3RlciBwLjUgKi8KKwlIUFEJCT0gMHg4MCwJCS8qIFBvbGwgY21kIG9uIHRoZSBoaWdoIHByaW8gcXVldWUgKi8KKwlOUFEJCT0gMHg0MCwJCS8qIFBvbGwgY21kIG9uIHRoZSBsb3cgcHJpbyBxdWV1ZSAqLworCUZTV0ludAkJPSAweDAxLAkJLyogRm9yY2VkIHNvZnR3YXJlIGludGVycnVwdCAqLworCisJLyogQ2ZnOTM0NkJpdHMgKi8KKwlDZmc5MzQ2X0xvY2sJPSAweDAwLAorCUNmZzkzNDZfVW5sb2NrCT0gMHhjMCwKKworCS8qIHJ4X21vZGVfYml0cyAqLworCUFjY2VwdEVycgk9IDB4MjAsCisJQWNjZXB0UnVudAk9IDB4MTAsCisJQWNjZXB0QnJvYWRjYXN0CT0gMHgwOCwKKwlBY2NlcHRNdWx0aWNhc3QJPSAweDA0LAorCUFjY2VwdE15UGh5cwk9IDB4MDIsCisJQWNjZXB0QWxsUGh5cwk9IDB4MDEsCisKKwkvKiBSeENvbmZpZ0JpdHMgKi8KKwlSeENmZ0ZJRk9TaGlmdAk9IDEzLAorCVJ4Q2ZnRE1BU2hpZnQJPSAgOCwKKworCS8qIFR4Q29uZmlnQml0cyAqLworCVR4SW50ZXJGcmFtZUdhcFNoaWZ0ID0gMjQsCisJVHhETUFTaGlmdCA9IDgsCS8qIERNQSBidXJzdCB2YWx1ZSAoMC03KSBpcyBzaGlmdCB0aGlzIG1hbnkgYml0cyAqLworCisJLyogQ29uZmlnMSByZWdpc3RlciBwLjI0ICovCisJTEVEUzEJCT0gKDEgPDwgNyksCisJTEVEUzAJCT0gKDEgPDwgNiksCisJTVNJRW5hYmxlCT0gKDEgPDwgNSksCS8qIEVuYWJsZSBNZXNzYWdlIFNpZ25hbGVkIEludGVycnVwdCAqLworCVNwZWVkX2Rvd24JPSAoMSA8PCA0KSwKKwlNRU1NQVAJCT0gKDEgPDwgMyksCisJSU9NQVAJCT0gKDEgPDwgMiksCisJVlBECQk9ICgxIDw8IDEpLAorCVBNRW5hYmxlCT0gKDEgPDwgMCksCS8qIFBvd2VyIE1hbmFnZW1lbnQgRW5hYmxlICovCisKKwkvKiBDb25maWcyIHJlZ2lzdGVyIHAuIDI1ICovCisJUENJX0Nsb2NrXzY2TUh6ID0gMHgwMSwKKwlQQ0lfQ2xvY2tfMzNNSHogPSAweDAwLAorCisJLyogQ29uZmlnMyByZWdpc3RlciBwLjI1ICovCisJTWFnaWNQYWNrZXQJPSAoMSA8PCA1KSwJLyogV2FrZSB1cCB3aGVuIHJlY2VpdmVzIGEgTWFnaWMgUGFja2V0ICovCisJTGlua1VwCQk9ICgxIDw8IDQpLAkvKiBXYWtlIHVwIHdoZW4gdGhlIGNhYmxlIGNvbm5lY3Rpb24gaXMgcmUtZXN0YWJsaXNoZWQgKi8KKwlCZWFjb25fZW4JPSAoMSA8PCAwKSwJLyogODE2OCBvbmx5LiBSZXNlcnZlZCBpbiB0aGUgODE2OGIgKi8KKworCS8qIENvbmZpZzUgcmVnaXN0ZXIgcC4yNyAqLworCUJXRgkJPSAoMSA8PCA2KSwJLyogQWNjZXB0IEJyb2FkY2FzdCB3YWtldXAgZnJhbWUgKi8KKwlNV0YJCT0gKDEgPDwgNSksCS8qIEFjY2VwdCBNdWx0aWNhc3Qgd2FrZXVwIGZyYW1lICovCisJVVdGCQk9ICgxIDw8IDQpLAkvKiBBY2NlcHQgVW5pY2FzdCB3YWtldXAgZnJhbWUgKi8KKwlMYW5XYWtlCQk9ICgxIDw8IDEpLAkvKiBMYW5XYWtlIGVuYWJsZS9kaXNhYmxlICovCisJUE1FU3RhdHVzCT0gKDEgPDwgMCksCS8qIFBNRSBzdGF0dXMgY2FuIGJlIHJlc2V0IGJ5IFBDSSBSU1QjICovCisKKwkvKiBUQklDU1IgcC4yOCAqLworCVRCSVJlc2V0CT0gMHg4MDAwMDAwMCwKKwlUQklMb29wYmFjawk9IDB4NDAwMDAwMDAsCisJVEJJTndFbmFibGUJPSAweDIwMDAwMDAwLAorCVRCSU53UmVzdGFydAk9IDB4MTAwMDAwMDAsCisJVEJJTGlua09rCT0gMHgwMjAwMDAwMCwKKwlUQklOd0NvbXBsZXRlCT0gMHgwMTAwMDAwMCwKKworCS8qIENQbHVzQ21kIHAuMzEgKi8KKwlFbmFibGVCaXN0CT0gKDEgPDwgMTUpLAkvLyA4MTY4IDgxMDEKKwlNYWNfZGJnb19vZQk9ICgxIDw8IDE0KSwJLy8gODE2OCA4MTAxCisJTm9ybWFsX21vZGUJPSAoMSA8PCAxMyksCS8vIHVudXNlZAorCUZvcmNlX2hhbGZfZHVwCT0gKDEgPDwgMTIpLAkvLyA4MTY4IDgxMDEKKwlGb3JjZV9yeGZsb3dfZW4JPSAoMSA8PCAxMSksCS8vIDgxNjggODEwMQorCUZvcmNlX3R4Zmxvd19lbgk9ICgxIDw8IDEwKSwJLy8gODE2OCA4MTAxCisJQ3hwbF9kYmdfc2VsCT0gKDEgPDwgOSksCS8vIDgxNjggODEwMQorCUFTRgkJPSAoMSA8PCA4KSwJLy8gODE2OCA4MTAxCisJUGt0Q250ckRpc2FibGUJPSAoMSA8PCA3KSwJLy8gODE2OCA4MTAxCisJTWFjX2RiZ29fc2VsCT0gMHgwMDFjLAkvLyA4MTY4CisJUnhWbGFuCQk9ICgxIDw8IDYpLAorCVJ4Q2hrU3VtCT0gKDEgPDwgNSksCisJUENJREFDCQk9ICgxIDw8IDQpLAorCVBDSU11bFJXCT0gKDEgPDwgMyksCisJSU5UVF8wCQk9IDB4MDAwMCwJLy8gODE2OAorCUlOVFRfMQkJPSAweDAwMDEsCS8vIDgxNjgKKwlJTlRUXzIJCT0gMHgwMDAyLAkvLyA4MTY4CisJSU5UVF8zCQk9IDB4MDAwMywJLy8gODE2OAorCisJLyogcnRsODE2OV9QSFlzdGF0dXMgKi8KKwlUQklfRW5hYmxlCT0gMHg4MCwKKwlUeEZsb3dDdHJsCT0gMHg0MCwKKwlSeEZsb3dDdHJsCT0gMHgyMCwKKwlfMTAwMGJwc0YJPSAweDEwLAorCV8xMDBicHMJCT0gMHgwOCwKKwlfMTBicHMJCT0gMHgwNCwKKwlMaW5rU3RhdHVzCT0gMHgwMiwKKwlGdWxsRHVwCQk9IDB4MDEsCisKKwkvKiBfVEJJQ1NSQml0ICovCisJVEJJTGlua09LCT0gMHgwMjAwMDAwMCwKKworCS8qIER1bXBDb3VudGVyQ29tbWFuZCAqLworCUNvdW50ZXJEdW1wCT0gMHg4LAorfTsKKworZW51bSBkZXNjX3N0YXR1c19iaXQgeworCURlc2NPd24JCT0gKDEgPDwgMzEpLCAvKiBEZXNjcmlwdG9yIGlzIG93bmVkIGJ5IE5JQyAqLworCVJpbmdFbmQJCT0gKDEgPDwgMzApLCAvKiBFbmQgb2YgZGVzY3JpcHRvciByaW5nICovCisJRmlyc3RGcmFnCT0gKDEgPDwgMjkpLCAvKiBGaXJzdCBzZWdtZW50IG9mIGEgcGFja2V0ICovCisJTGFzdEZyYWcJPSAoMSA8PCAyOCksIC8qIEZpbmFsIHNlZ21lbnQgb2YgYSBwYWNrZXQgKi8KKworCS8qIFR4IHByaXZhdGUgKi8KKwlMYXJnZVNlbmQJPSAoMSA8PCAyNyksIC8qIFRDUCBMYXJnZSBTZW5kIE9mZmxvYWQgKFRTTykgKi8KKwlNU1NTaGlmdAk9IDE2LCAgICAgICAgLyogTVNTIHZhbHVlIHBvc2l0aW9uICovCisJTVNTTWFzawkJPSAweGZmZiwgICAgIC8qIE1TUyB2YWx1ZSArIExhcmdlU2VuZCBiaXQ6IDEyIGJpdHMgKi8KKwlJUENTCQk9ICgxIDw8IDE4KSwgLyogQ2FsY3VsYXRlIElQIGNoZWNrc3VtICovCisJVURQQ1MJCT0gKDEgPDwgMTcpLCAvKiBDYWxjdWxhdGUgVURQL0lQIGNoZWNrc3VtICovCisJVENQQ1MJCT0gKDEgPDwgMTYpLCAvKiBDYWxjdWxhdGUgVENQL0lQIGNoZWNrc3VtICovCisJVHhWbGFuVGFnCT0gKDEgPDwgMTcpLCAvKiBBZGQgVkxBTiB0YWcgKi8KKworCS8qIFJ4IHByaXZhdGUgKi8KKwlQSUQxCQk9ICgxIDw8IDE4KSwgLyogUHJvdG9jb2wgSUQgYml0IDEvMiAqLworCVBJRDAJCT0gKDEgPDwgMTcpLCAvKiBQcm90b2NvbCBJRCBiaXQgMi8yICovCisKKyNkZWZpbmUgUnhQcm90b1VEUAkoUElEMSkKKyNkZWZpbmUgUnhQcm90b1RDUAkoUElEMCkKKyNkZWZpbmUgUnhQcm90b0lQCShQSUQxIHwgUElEMCkKKyNkZWZpbmUgUnhQcm90b01hc2sJUnhQcm90b0lQCisKKwlJUEZhaWwJCT0gKDEgPDwgMTYpLCAvKiBJUCBjaGVja3N1bSBmYWlsZWQgKi8KKwlVRFBGYWlsCQk9ICgxIDw8IDE1KSwgLyogVURQL0lQIGNoZWNrc3VtIGZhaWxlZCAqLworCVRDUEZhaWwJCT0gKDEgPDwgMTQpLCAvKiBUQ1AvSVAgY2hlY2tzdW0gZmFpbGVkICovCisJUnhWbGFuVGFnCT0gKDEgPDwgMTYpLCAvKiBWTEFOIHRhZyBhdmFpbGFibGUgKi8KK307CisKKyNkZWZpbmUgUnN2ZE1hc2sJMHgzZmZmYzAwMAorCitzdHJ1Y3QgVHhEZXNjIHsKKwl2b2xhdGlsZSB1aW50MzJfdCBvcHRzMTsKKwl2b2xhdGlsZSB1aW50MzJfdCBvcHRzMjsKKwl2b2xhdGlsZSB1aW50MzJfdCBhZGRyX2xvOworCXZvbGF0aWxlIHVpbnQzMl90IGFkZHJfaGk7Cit9OworCitzdHJ1Y3QgUnhEZXNjIHsKKwl2b2xhdGlsZSB1aW50MzJfdCBvcHRzMTsKKwl2b2xhdGlsZSB1aW50MzJfdCBvcHRzMjsKKwl2b2xhdGlsZSB1aW50MzJfdCBhZGRyX2xvOworCXZvbGF0aWxlIHVpbnQzMl90IGFkZHJfaGk7Cit9OworCitlbnVtIGZlYXR1cmVzIHsKKwlSVExfRkVBVFVSRV9XT0wJCT0gKDEgPDwgMCksCisJUlRMX0ZFQVRVUkVfTVNJCQk9ICgxIDw8IDEpLAorCVJUTF9GRUFUVVJFX0dNSUkJPSAoMSA8PCAyKSwKK307CisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTY5KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxNjgoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODEwMShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSB7CisKKwlzdHJ1Y3QgcGNpX2RldmljZSAqcGNpX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXVpbnQ4X3QgKmh3X2FkZHI7CisJdm9pZCAqbW1pb19hZGRyOworCXVpbnQzMl90IGlycW5vOworCisJaW50IGNoaXBzZXQ7CisJaW50IG1hY192ZXJzaW9uOworCWludCBjZmdfaW5kZXg7CisJdTE2IGludHJfZXZlbnQ7CisKKwlzdHJ1Y3QgaW9fYnVmZmVyICp0eF9pb2J1ZltOVU1fVFhfREVTQ107CisJc3RydWN0IGlvX2J1ZmZlciAqcnhfaW9idWZbTlVNX1JYX0RFU0NdOworCisJc3RydWN0IFR4RGVzYyAqdHhfYmFzZTsKKwlzdHJ1Y3QgUnhEZXNjICpyeF9iYXNlOworCisJdWludDMyX3QgdHhfY3VycjsKKwl1aW50MzJfdCByeF9jdXJyOworCisJdWludDMyX3QgdHhfdGFpbDsKKworCXVpbnQzMl90IHR4X2ZpbGxfY3RyOworCisJdTE2IGNwX2NtZDsKKworCWludCBwaHlfYXV0b19uZWdvX3JlZzsKKwlpbnQgcGh5XzEwMDBfY3RybF9yZWc7CisKKwlpbnQgKCAqc2V0X3NwZWVkICkgKHN0cnVjdCBuZXRfZGV2aWNlICosIHU4IGF1dG9uZWcsIHUxNiBzcGVlZCwgdTggZHVwbGV4ICk7CisJdm9pZCAoICpwaHlfcmVzZXRfZW5hYmxlICkgKCB2b2lkICppb2FkZHIgKTsKKwl2b2lkICggKmh3X3N0YXJ0ICkgKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisJdW5zaWduZWQgaW50ICggKnBoeV9yZXNldF9wZW5kaW5nICkgKCB2b2lkICppb2FkZHIgKTsKKwl1bnNpZ25lZCBpbnQgKCAqbGlua19vayApICggdm9pZCAqaW9hZGRyICk7CisKKwlpbnQgcGNpZV9jYXA7CisKKwl1bnNpZ25lZCBmZWF0dXJlczsKKworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBydGw4MTY5X3J4X2NvbmZpZyA9CisJKFJYX0ZJRk9fVEhSRVNIIDw8IFJ4Q2ZnRklGT1NoaWZ0KSB8IChSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisKKyNlbmRpZiAvKiBfUjgxNjlfSF8gKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxMzkuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxMzkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTRjZTYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODEzOS5jCkBAIC0wLDAgKzEsNTk0IEBACisvKiBydGw4MTM5LmMgLSBldGhlcmJvb3QgZHJpdmVyIGZvciB0aGUgUmVhbHRlayA4MTM5IGNoaXBzZXQKKworICBwb3J0ZWQgZnJvbSB0aGUgbGludXggZHJpdmVyIHdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlcgorICBieSBSYWluZXIgQmF3aWRhbWFubiAoUmFpbmVyLkJhd2lkYW1hbm5AaW5mb3JtYXRpay51bmktdWxtLmRlKSAxOTk5CisKKyAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBkcml2ZXI6CisgIC0gcmVtb3ZlZCBzdXBwb3J0IGZvciBpbnRlcnJ1cHRzLCBzd2l0Y2hpbmcgdG8gcG9sbGluZyBtb2RlICh5dWNrISkKKyAgLSByZW1vdmVkIHN1cHBvcnQgZm9yIHRoZSA4MTI5IGNoaXAgKGV4dGVybmFsIE1JSSkKKworKi8KKworRklMRV9MSUNFTkNFICggR1BMX0FOWSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmV2aXNpb24gSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgIDI3IE1heSAyMDA2CW1jYjMwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCAoTWljaGFlbCBCcm93bikKKyAgICAgUmV3cm90ZSB0byB1c2UgdGhlIG5ldyBuZXQgZHJpdmVyIEFQSSwgdGhlIHVwZGF0ZWQgUENJIEFQSSwgYW5kCisgICAgIHRoZSBnZW5lcmljIHRocmVlLXdpcmUgc2VyaWFsIGRldmljZSBzdXBwb3J0IGZvciBFRVBST00gYWNjZXNzLgorCisgIDI4IERlYyAyMDAyCWtlbl95YXBAdXNlcnMuc291cmNlZm9yZ2UubmV0IChLZW4gWWFwKQorICAgICBQdXQgaW4gdmlydF90b19idXMgY2FsbHMgdG8gYWxsb3cgRXRoZXJib290IHJlbG9jYXRpb24uCisKKyAgMDYgQXByIDIwMDEJa2VuX3lhcEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQgKEtlbiBZYXApCisgICAgIEZvbGxvd2luZyBlbWFpbCBmcm9tIEh5dW4tSm9vbiBDaGEsIGFkZGVkIGEgZGlzYWJsZSByb3V0aW5lLCBvdGhlcndpc2UKKyAgICAgTklDIHJlbWFpbnMgbGl2ZSBhbmQgY2FuIGNyYXNoIHRoZSBrZXJuZWwgbGF0ZXIuCisKKyAgNCBGZWIgMjAwMAllc3BlbmxhdWJAaW5mb3JtYXRpay51bmktdWxtLmRlIChLbGF1cyBFc3BlbmxhdWIpCisgICAgIFNodWZmbGVkIHRoaW5ncyBhcm91bmQsIHJlbW92ZWQgdGhlIGxlZnRvdmVycyBmcm9tIHRoZSA4MTI5IHN1cHBvcnQKKyAgICAgdGhhdCB3YXMgaW4gdGhlIExpbnV4IGRyaXZlciBhbmQgYWRkZWQgYSBiaXQgbW9yZSA4MTM5IGRlZmluaXRpb25zLgorICAgICBNb3ZlZCB0aGUgOEsgcmVjZWl2ZSBidWZmZXIgdG8gYSBmaXhlZCwgYXZhaWxhYmxlIGFkZHJlc3Mgb3V0c2lkZSB0aGUKKyAgICAgMHg5ODAwMC0weDlmZmZmIHJhbmdlLiAgVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIGJ1dCBjdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgd2F5IHRvIG1ha2Ugcm9vbSBmb3IgdGhlIEV0aGVyYm9vdCBmZWF0dXJlcyB0aGF0IG5lZWQgc3Vic3RhbnRpYWwgYW1vdW50cworICAgICBvZiBjb2RlIGxpa2UgdGhlIEFOU0kgY29uc29sZSBzdXBwb3J0LiAgQ3VycmVudGx5IHRoZSBidWZmZXIgaXMganVzdCBiZWxvdworICAgICAweDEwMDAwLCBzbyB0aGlzIGV2ZW4gY29uZm9ybXMgdG8gdGhlIHRhZ2dlZCBib290IGltYWdlIHNwZWNpZmljYXRpb24sCisgICAgIHdoaWNoIHJlc2VydmVzIHRoZSByYW5nZXMgMHgwMDAwMC0weDEwMDAwIGFuZCAweDk4MDAwLTB4QTAwMDAuICBNeQorICAgICBpbnRlcnByZXRhdGlvbiBvZiB0aGlzICJyZXNlcnZlZCIgaXMgdGhhdCBFdGhlcmJvb3QgbWF5IGRvIHdoYXRldmVyIGl0CisgICAgIGxpa2VzLCBhcyBsb25nIGFzIGl0cyBlbnZpcm9ubWVudCBpcyBrZXB0IGludGFjdCAobGlrZSB0aGUgQklPUworICAgICB2YXJpYWJsZXMpLiAgSG9wZWZ1bGx5IGZpeGVkIHJ0bF9wb2xsKCkgb25jZSBhbmQgZm9yIGFsbC4gIFRoZSBzeW1wdG9tcworICAgICB3ZXJlIHRoYXQgaWYgRXRoZXJib290IHdhcyBsZWZ0IGF0IHRoZSBib290IG1lbnUgZm9yIHNldmVyYWwgbWludXRlcywgdGhlCisgICAgIGZpcnN0IGV0aF9wb2xsIGZhaWxlZC4gIFNlZW1zIGxpa2UgSSBhbSB0aGUgb25seSBwZXJzb24gd2hvIGRvZXMgdGhpcy4KKyAgICAgRmlyc3Qgb2YgYWxsIEkgZml4ZWQgdGhlIGRlYnVnZ2luZyBjb2RlIGFuZCB0aGVuIHNldCBvdXQgZm9yIGEgbG9uZyBidWcKKyAgICAgaHVudGluZyBzZXNzaW9uLiAgSXQgdG9vayBtZSBhYm91dCBhIHdlZWsgZnVsbCB0aW1lIHdvcmsgLSBwb2tpbmcgYXJvdW5kCisgICAgIHZhcmlvdXMgcGxhY2VzIGluIHRoZSBkcml2ZXIsIHJlYWRpbmcgRG9uIEJlY2tlcidzIGFuZCBKZWZmIEdhcnppaydzIExpbnV4CisgICAgIGRyaXZlciBhbmQgZXZlbiB0aGUgRnJlZUJTRCBkcml2ZXIgKHdoYXQgYSBwaWVjZSBvZiBjcmFwISkgLSBhbmQKKyAgICAgZXZlbnR1YWxseSBzcG90dGVkIHRoZSBuYXN0eSB0aGluZzogdGhlIHRyYW5zbWl0IHJvdXRpbmUgd2FzIGFja25vd2xlZGdpbmcKKyAgICAgZWFjaCBhbmQgZXZlcnkgaW50ZXJydXB0IHBlbmRpbmcsIGluY2x1ZGluZyB0aGUgUnhPdmVycnVuIGFuZCBSeEZJRklPdmVyCisgICAgIGludGVycnVwdHMuICBUaGlzIGNvbmZ1c2VkIHRoZSBSVEw4MTM5IHRob3JvdWdobHkuICBJdCBkZXN0cm95ZWQgdGhlCisgICAgIFJ4IHJpbmcgY29udGVudHMgYnkgZHVtcGluZyB0aGUgMksgRklGTyBjb250ZW50cyByaWdodCB3aGVyZSB3ZSB3YW50ZWQgdG8KKyAgICAgZ2V0IHRoZSBuZXh0IHBhY2tldC4gIE9oIHdlbGwsIHdoYXQgZnVuLgorCisgIDE4IEphbiAyMDAwICAgbWRjQGV0aGVyYm9vdC5vcmcgKE1hcnR5IENvbm5vcikKKyAgICAgRHJhc3RpY2FsbHkgc2ltcGxpZmllZCBlcnJvciBoYW5kbGluZy4gIEJhc2ljYWxseSwgaWYgYW55IGVycm9yCisgICAgIGluIHRyYW5zbWlzc2lvbiBvciByZWNlcHRpb24gb2NjdXJzLCB0aGUgY2FyZCBpcyByZXNldC4KKyAgICAgQWxzbywgcG9pbnRlZCBhbGwgdHJhbnNtaXQgZGVzY3JpcHRvcnMgdG8gdGhlIHNhbWUgYnVmZmVyIHRvCisgICAgIHNhdmUgYnVmZmVyIHNwYWNlLiAgVGhpcyBzaG91bGQgZGVjcmVhc2UgZHJpdmVyIHNpemUgYW5kIGF2b2lkCisgICAgIGNvcnJ1cHRpb24gYmVjYXVzZSBvZiBleGNlZWRpbmcgMzJLIGR1cmluZyBydW50aW1lLgorCisgIDI4IEp1bCAxOTk5ICAgKE1hdHRoaWFzIE1laXhuZXIgLSBtZWl4bmVyQHJiZy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZSkKKyAgICAgcnRsX3BvbGwgd2FzIHF1aXRlIGJyb2tlbjogaXQgdXNlZCB0aGUgUnhPSyBpbnRlcnJ1cHQgZmxhZyBpbnN0ZWFkCisgICAgIG9mIHRoZSBSeEJ1ZmZlckVtcHR5IGZsYWcgd2hpY2ggb2Z0ZW4gcmVzdWx0ZWQgaW4gdmVyeSBiYWQKKyAgICAgdHJhbnNtaXNzaW9uIHBlcmZvcm1hY2UgLSBiZWxvdyAxa0J5dGVzL3MuCisKKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvc3BpX2JpdC5oPgorI2luY2x1ZGUgPGdweGUvdGhyZWV3aXJlLmg+CisjaW5jbHVkZSA8Z3B4ZS9udm8uaD4KKworI2RlZmluZSBUWF9SSU5HX1NJWkUgNAorCitzdHJ1Y3QgcnRsODEzOV90eCB7CisJdW5zaWduZWQgaW50IG5leHQ7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWZbVFhfUklOR19TSVpFXTsKK307CisKK3N0cnVjdCBydGw4MTM5X3J4IHsKKwl2b2lkICpyaW5nOworCXVuc2lnbmVkIGludCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgcnRsODEzOV9uaWMgeworCXVuc2lnbmVkIHNob3J0IGlvYWRkcjsKKwlzdHJ1Y3QgcnRsODEzOV90eCB0eDsKKwlzdHJ1Y3QgcnRsODEzOV9yeCByeDsKKwlzdHJ1Y3Qgc3BpX2JpdF9iYXNoZXIgc3BpYml0OworCXN0cnVjdCBzcGlfZGV2aWNlIGVlcHJvbTsKKwlzdHJ1Y3QgbnZvX2Jsb2NrIG52bzsKK307CisKKy8qIFR1bmluZyBQYXJhbWV0ZXJzICovCisjZGVmaW5lIFRYX0ZJRk9fVEhSRVNICTI1NgkvKiBJbiBieXRlcywgcm91bmRlZCBkb3duIHRvIDMyIGJ5dGUgdW5pdHMuICovCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNICTQJLyogUnggYnVmZmVyIGxldmVsIGJlZm9yZSBmaXJzdCBQQ0kgeGZlci4gICovCisjZGVmaW5lIFJYX0RNQV9CVVJTVAk0CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNCcgaXMgMjU2IGJ5dGVzICovCisjZGVmaW5lIFRYX0RNQV9CVVJTVAk0CS8qIENhbGN1bGF0ZSBhcyAxNjw8dmFsLiAqLworI2RlZmluZSBUWF9JUEcJCTMJLyogVGhpcyBpcyB0aGUgb25seSB2YWxpZCB2YWx1ZSAqLworI2RlZmluZSBSWF9CVUZfTEVOX0lEWAkwCS8qIDAsIDEsIDIgaXMgYWxsb3dlZCAtIDgsMTYsMzJLIHJ4IGJ1ZmZlciAqLworI2RlZmluZSBSWF9CVUZfTEVOICggKDgxOTIgPDwgUlhfQlVGX0xFTl9JRFgpICkKKyNkZWZpbmUgUlhfQlVGX1BBRCA0CisKKy8qIFN5bWJvbGljIG9mZnNldHMgdG8gcmVnaXN0ZXJzLiAqLworZW51bSBSVEw4MTM5X3JlZ2lzdGVycyB7CisJTUFDMD0wLAkJCS8qIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCisJTUFSMD04LAkJCS8qIE11bHRpY2FzdCBmaWx0ZXIuICovCisJVHhTdGF0dXMwPTB4MTAsCQkvKiBUcmFuc21pdCBzdGF0dXMgKGZvdXIgMzJiaXQgcmVnaXN0ZXJzKS4gKi8KKwlUeEFkZHIwPTB4MjAsCQkvKiBUeCBkZXNjcmlwdG9ycyAoYWxzbyBmb3VyIDMyYml0KS4gKi8KKwlSeEJ1Zj0weDMwLCBSeEVhcmx5Q250PTB4MzQsIFJ4RWFybHlTdGF0dXM9MHgzNiwKKwlDaGlwQ21kPTB4MzcsIFJ4QnVmUHRyPTB4MzgsIFJ4QnVmQWRkcj0weDNBLAorCUludHJNYXNrPTB4M0MsIEludHJTdGF0dXM9MHgzRSwKKwlUeENvbmZpZz0weDQwLCBSeENvbmZpZz0weDQ0LAorCVRpbWVyPTB4NDgsCQkvKiBnZW5lcmFsLXB1cnBvc2UgY291bnRlci4gKi8KKwlSeE1pc3NlZD0weDRDLAkJLyogMjQgYml0cyB2YWxpZCwgd3JpdGUgY2xlYXJzLiAqLworCUNmZzkzNDY9MHg1MCwgQ29uZmlnMD0weDUxLCBDb25maWcxPTB4NTIsCisJVGltZXJJbnRyUmVnPTB4NTQsCS8qIGludHIgaWYgZ3AgY291bnRlciByZWFjaGVzIHRoaXMgdmFsdWUgKi8KKwlNZWRpYVN0YXR1cz0weDU4LAorCUNvbmZpZzM9MHg1OSwKKwlNdWx0aUludHI9MHg1QywKKwlSZXZpc2lvbklEPTB4NUUsCS8qIHJldmlzaW9uIG9mIHRoZSBSVEw4MTM5IGNoaXAgKi8KKwlUeFN1bW1hcnk9MHg2MCwKKwlNSUlfQk1DUj0weDYyLCBNSUlfQk1TUj0weDY0LCBOV2F5QWR2ZXJ0PTB4NjYsIE5XYXlMUEFSPTB4NjgsCisJTldheUV4cGFuc2lvbj0weDZBLAorCURpc2Nvbm5lY3RDbnQ9MHg2QywgRmFsc2VDYXJyaWVyQ250PTB4NkUsCisJTldheVRlc3RSZWc9MHg3MCwKKwlSeENudD0weDcyLAkJLyogcGFja2V0IHJlY2VpdmVkIGNvdW50ZXIgKi8KKwlDU0NSPTB4NzQsCQkvKiBjaGlwIHN0YXR1cyBhbmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCVBoeVBhcm0xPTB4NzgsVHdpc3RlclBhcm09MHg3YyxQaHlQYXJtMj0weDgwLAkvKiB1bmRvY3VtZW50ZWQgKi8KKwkvKiBmcm9tIDB4ODQgb253YXJkcyBhcmUgYSBudW1iZXIgb2YgcG93ZXIgbWFuYWdlbWVudC93YWtldXAgZnJhbWUKKwkgKiBkZWZpbml0aW9ucyB3ZSB3aWxsIHByb2JhYmx5IG5ldmVyIG5lZWQgdG8ga25vdyBhYm91dC4gICovCit9OworCitlbnVtIFJ4RWFybHlTdGF0dXNCaXRzIHsKKwlFUkdvb2Q9MHgwOCwgRVJCYWQ9MHgwNCwgRVJPVlc9MHgwMiwgRVJPSz0weDAxCit9OworCitlbnVtIENoaXBDbWRCaXRzIHsKKwlDbWRSZXNldD0weDEwLCBDbWRSeEVuYj0weDA4LCBDbWRUeEVuYj0weDA0LCBSeEJ1ZkVtcHR5PTB4MDEsIH07CisKK2VudW0gSW50ck1hc2tCaXRzIHsKKwlTRVJSPTB4ODAwMCwgVGltZU91dD0weDQwMDAsIExlbkNoZz0weDIwMDAsCisJRk9WVz0weDQwLCBQVU5fTGlua0NoZz0weDIwLCBSWE9WVz0weDEwLAorCVRFUj0weDA4LCBUT0s9MHgwNCwgUkVSPTB4MDIsIFJPSz0weDAxCit9OworCisvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgYml0cywgdXNpbmcgbXkgb3duIG1lYW5pbmdmdWwgbmFtZXMuICovCitlbnVtIEludHJTdGF0dXNCaXRzIHsKKwlQQ0lFcnI9MHg4MDAwLCBQQ1NUaW1lb3V0PTB4NDAwMCwgQ2FibGVMZW5DaGFuZ2U9IDB4MjAwMCwKKwlSeEZJRk9PdmVyPTB4NDAsIFJ4VW5kZXJydW49MHgyMCwgUnhPdmVyZmxvdz0weDEwLAorCVR4RXJyPTB4MDgsIFR4T0s9MHgwNCwgUnhFcnI9MHgwMiwgUnhPSz0weDAxLAorfTsKK2VudW0gVHhTdGF0dXNCaXRzIHsKKwlUeEhvc3RPd25zPTB4MjAwMCwgVHhVbmRlcnJ1bj0weDQwMDAsIFR4U3RhdE9LPTB4ODAwMCwKKwlUeE91dE9mV2luZG93PTB4MjAwMDAwMDAsIFR4QWJvcnRlZD0weDQwMDAwMDAwLAorCVR4Q2Fycmllckxvc3Q9MHg4MDAwMDAwMCwKK307CitlbnVtIFJ4U3RhdHVzQml0cyB7CisJUnhNdWx0aWNhc3Q9MHg4MDAwLCBSeFBoeXNpY2FsPTB4NDAwMCwgUnhCcm9hZGNhc3Q9MHgyMDAwLAorCVJ4QmFkU3ltYm9sPTB4MDAyMCwgUnhSdW50PTB4MDAxMCwgUnhUb29Mb25nPTB4MDAwOCwgUnhDUkNFcnI9MHgwMDA0LAorCVJ4QmFkQWxpZ249MHgwMDAyLCBSeFN0YXR1c09LPTB4MDAwMSwKK307CisKK2VudW0gTWVkaWFTdGF0dXNCaXRzIHsKKwlNU1JUeEZsb3dFbmFibGU9MHg4MCwgTVNSUnhGbG93RW5hYmxlPTB4NDAsIE1TUlNwZWVkMTA9MHgwOCwKKwlNU1JMaW5rRmFpbD0weDA0LCBNU1JSeFBhdXNlRmxhZz0weDAyLCBNU1JUeFBhdXNlRmxhZz0weDAxLAorfTsKKworZW51bSBNSUlCTUNSQml0cyB7CisJQk1DUlJlc2V0PTB4ODAwMCwgQk1DUlNwZWVkMTAwPTB4MjAwMCwgQk1DUk5XYXlFbmFibGU9MHgxMDAwLAorCUJNQ1JSZXN0YXJ0TldheT0weDAyMDAsIEJNQ1JEdXBsZXg9MHgwMTAwLAorfTsKKworZW51bSBDU0NSQml0cyB7CisJQ1NDUl9MaW5rT0tCaXQ9MHgwNDAwLCBDU0NSX0xpbmtDaGFuZ2VCaXQ9MHgwODAwLAorCUNTQ1JfTGlua1N0YXR1c0JpdHM9MHgwZjAwMCwgQ1NDUl9MaW5rRG93bk9mZkNtZD0weDAwM2MwLAorCUNTQ1JfTGlua0Rvd25DbWQ9MHgwZjNjMCwKK307CisKK2VudW0gUnhDb25maWdCaXRzIHsKKwlSeENmZ1dyYXA9MHg4MCwKKwlFZXByb205MzU2PTB4NDAsCisJQWNjZXB0RXJyPTB4MjAsIEFjY2VwdFJ1bnQ9MHgxMCwgQWNjZXB0QnJvYWRjYXN0PTB4MDgsCisJQWNjZXB0TXVsdGljYXN0PTB4MDQsIEFjY2VwdE15UGh5cz0weDAyLCBBY2NlcHRBbGxQaHlzPTB4MDEsCit9OworCitlbnVtIENvbmZpZzFCaXRzIHsKKwlWUERFbmFibGU9MHgwMiwKK307CisKKy8qICBFRVBST00gYWNjZXNzICovCisjZGVmaW5lIEVFX00xCQkweDgwCS8qIE1vZGUgc2VsZWN0IGJpdCAxICovCisjZGVmaW5lIEVFX00wCQkweDQwCS8qIE1vZGUgc2VsZWN0IGJpdCAwICovCisjZGVmaW5lIEVFX0NTCQkweDA4CS8qIEVFUFJPTSBjaGlwIHNlbGVjdCAqLworI2RlZmluZSBFRV9TSwkJMHgwNAkvKiBFRVBST00gc2hpZnQgY2xvY2sgKi8KKyNkZWZpbmUgRUVfREkJCTB4MDIJLyogRGF0YSBpbiAqLworI2RlZmluZSBFRV9ETwkJMHgwMQkvKiBEYXRhIG91dCAqLworCisvKiBPZmZzZXRzIHdpdGhpbiBFRVBST00gKHRoZXNlIGFyZSB3b3JkIG9mZnNldHMpICovCisjZGVmaW5lIEVFX01BQyA3CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ0bF9lZV9iaXRzW10gPSB7CisJW1NQSV9CSVRfU0NMS10JPSBFRV9TSywKKwlbU1BJX0JJVF9NT1NJXQk9IEVFX0RJLAorCVtTUElfQklUX01JU09dCT0gRUVfRE8sCisJW1NQSV9CSVRfU1MoMCldCT0gKCBFRV9DUyB8IEVFX00xICksCit9OworCitzdGF0aWMgaW50IHJ0bF9zcGlfcmVhZF9iaXQgKCBzdHJ1Y3QgYml0X2Jhc2hlciAqYmFzaGVyLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJpdF9pZCApIHsKKwlzdHJ1Y3QgcnRsODEzOV9uaWMgKnJ0bCA9IGNvbnRhaW5lcl9vZiAoIGJhc2hlciwgc3RydWN0IHJ0bDgxMzlfbmljLAorCQkJCQkJIHNwaWJpdC5iYXNoZXIgKTsKKwl1aW50OF90IG1hc2sgPSBydGxfZWVfYml0c1tiaXRfaWRdOworCXVpbnQ4X3QgZWVyZWc7CisKKwllZXJlZyA9IGluYiAoIHJ0bC0+aW9hZGRyICsgQ2ZnOTM0NiApOworCXJldHVybiAoIGVlcmVnICYgbWFzayApOworfQorCitzdGF0aWMgdm9pZCBydGxfc3BpX3dyaXRlX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsCisJCQkJdW5zaWduZWQgaW50IGJpdF9pZCwgdW5zaWduZWQgbG9uZyBkYXRhICkgeworCXN0cnVjdCBydGw4MTM5X25pYyAqcnRsID0gY29udGFpbmVyX29mICggYmFzaGVyLCBzdHJ1Y3QgcnRsODEzOV9uaWMsCisJCQkJCQkgc3BpYml0LmJhc2hlciApOworCXVpbnQ4X3QgbWFzayA9IHJ0bF9lZV9iaXRzW2JpdF9pZF07CisJdWludDhfdCBlZXJlZzsKKworCWVlcmVnID0gaW5iICggcnRsLT5pb2FkZHIgKyBDZmc5MzQ2ICk7CisJZWVyZWcgJj0gfm1hc2s7CisJZWVyZWcgfD0gKCBkYXRhICYgbWFzayApOworCW91dGIgKCBlZXJlZywgcnRsLT5pb2FkZHIgKyBDZmc5MzQ2ICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYml0X2Jhc2hlcl9vcGVyYXRpb25zIHJ0bF9iYXNoZXJfb3BzID0geworCS5yZWFkID0gcnRsX3NwaV9yZWFkX2JpdCwKKwkud3JpdGUgPSBydGxfc3BpX3dyaXRlX2JpdCwKK307CisKKy8qKiBQb3J0aW9uIG9mIEVFUFJPTSBhdmFpbGFibGUgZm9yIG5vbi12b2xhdGlsZSBzdG9yZWQgb3B0aW9ucworICoKKyAqIFdlIHVzZSBvZmZzZXQgMHg0MCAoaS5lLiBhZGRyZXNzIDB4MjApLCBsZW5ndGggMHg0MC4gIFRoaXMgYmxvY2sgaXMKKyAqIG1hcmtlZCBhcyBWUEQgaW4gdGhlIHJ0bDgxMzkgZGF0YXNoZWV0cywgc28gd2UgdXNlIGl0IG9ubHkgaWYgd2UKKyAqIGRldGVjdCB0aGF0IHRoZSBjYXJkIGlzIG5vdCBzdXBwb3J0aW5nIFZQRC4KKyAqLworc3RhdGljIHN0cnVjdCBudm9fZnJhZ21lbnQgcnRsX252b19mcmFnbWVudHNbXSA9IHsKKwl7IDB4MjAsIDB4NDAgfSwKKwl7IDAsIDAgfQorfTsKKworLyoqCisgKiBTZXQgdXAgZm9yIEVFUFJPTSBhY2Nlc3MKKyAqCisgKiBAdiBuZXRkZXYJCU5ldCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgcnRsX2luaXRfZWVwcm9tICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgcnRsODEzOV9uaWMgKnJ0bCA9IG5ldGRldi0+cHJpdjsKKwlpbnQgZWU5MzU2OworCWludCB2cGQ7CisKKwkvKiBJbml0aWFsaXNlIHRocmVlLXdpcmUgYnVzICovCisJcnRsLT5zcGliaXQuYmFzaGVyLm9wID0gJnJ0bF9iYXNoZXJfb3BzOworCXJ0bC0+c3BpYml0LmJ1cy5tb2RlID0gU1BJX01PREVfVEhSRUVXSVJFOworCWluaXRfc3BpX2JpdF9iYXNoZXIgKCAmcnRsLT5zcGliaXQgKTsKKworCS8qIERldGVjdCBFRVBST00gdHlwZSBhbmQgaW5pdGlhbGlzZSB0aHJlZS13aXJlIGRldmljZSAqLworCWVlOTM1NiA9ICggaW53ICggcnRsLT5pb2FkZHIgKyBSeENvbmZpZyApICYgRWVwcm9tOTM1NiApOworCWlmICggZWU5MzU2ICkgeworCQlEQkdDICggcnRsLCAicnRsODEzOSAlcCBFRVBST00gaXMgYW4gQVQ5M0M1NlxuIiwgcnRsICk7CisJCWluaXRfYXQ5M2M1NiAoICZydGwtPmVlcHJvbSwgMTYgKTsKKwl9IGVsc2UgeworCQlEQkdDICggcnRsLCAicnRsODEzOSAlcCBFRVBST00gaXMgYW4gQVQ5M0M0NlxuIiwgcnRsICk7CisJCWluaXRfYXQ5M2M0NiAoICZydGwtPmVlcHJvbSwgMTYgKTsKKwl9CisJcnRsLT5lZXByb20uYnVzID0gJnJ0bC0+c3BpYml0LmJ1czsKKworCS8qIEluaXRpYWxpc2Ugc3BhY2UgZm9yIG5vbi12b2xhdGlsZSBvcHRpb25zLCBpZiBhdmFpbGFibGUgKi8KKwl2cGQgPSAoIGludyAoIHJ0bC0+aW9hZGRyICsgQ29uZmlnMSApICYgVlBERW5hYmxlICk7CisJaWYgKCB2cGQgKSB7CisJCURCR0MgKCBydGwsICJydGw4MTM5ICVwIEVFUFJPTSBpbiB1c2UgZm9yIFZQRDsgY2Fubm90IHVzZSAiCisJCSAgICAgICAiZm9yIG9wdGlvbnNcbiIsIHJ0bCApOworCX0gZWxzZSB7CisJCW52b19pbml0ICggJnJ0bC0+bnZvLCAmcnRsLT5lZXByb20ubnZzLCBydGxfbnZvX2ZyYWdtZW50cywKKwkJCSAgICZuZXRkZXYtPnJlZmNudCApOworCX0KK30KKworLyoqCisgKiBSZXNldCBOSUMKKyAqCisgKiBAdiBuZXRkZXYJCU5ldCBkZXZpY2UKKyAqCisgKiBJc3N1ZXMgYSBoYXJkd2FyZSByZXNldCBhbmQgd2FpdHMgZm9yIHRoZSByZXNldCB0byBjb21wbGV0ZS4KKyAqLworc3RhdGljIHZvaWQgcnRsX3Jlc2V0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgcnRsODEzOV9uaWMgKnJ0bCA9IG5ldGRldi0+cHJpdjsKKworCS8qIFJlc2V0IGNoaXAgKi8KKwlvdXRiICggQ21kUmVzZXQsIHJ0bC0+aW9hZGRyICsgQ2hpcENtZCApOworCW1kZWxheSAoIDEwICk7CisJbWVtc2V0ICggJnJ0bC0+dHgsIDAsIHNpemVvZiAoIHJ0bC0+dHggKSApOworCXJ0bC0+cngub2Zmc2V0ID0gMDsKK30KKworLyoqCisgKiBPcGVuIE5JQworICoKKyAqIEB2IG5ldGRldgkJTmV0IGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcnRsX29wZW4gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXN0cnVjdCBydGw4MTM5X25pYyAqcnRsID0gbmV0ZGV2LT5wcml2OworCWludCBpOworCisJLyogUHJvZ3JhbSB0aGUgTUFDIGFkZHJlc3MgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBFVEhfQUxFTiA7IGkrKyApCisJCW91dGIgKCBuZXRkZXYtPmxsX2FkZHJbaV0sIHJ0bC0+aW9hZGRyICsgTUFDMCArIGkgKTsKKworCS8qIFNldCB1cCBSWCByaW5nICovCisJcnRsLT5yeC5yaW5nID0gbWFsbG9jICggUlhfQlVGX0xFTiArIFJYX0JVRl9QQUQgKTsKKwlpZiAoICEgcnRsLT5yeC5yaW5nICkKKwkJcmV0dXJuIC1FTk9NRU07CisJb3V0bCAoIHZpcnRfdG9fYnVzICggcnRsLT5yeC5yaW5nICksIHJ0bC0+aW9hZGRyICsgUnhCdWYgKTsKKwlEQkdDICggcnRsLCAicnRsODEzOSAlcCBSWCByaW5nIGF0ICVseFxuIiwKKwkgICAgICAgcnRsLCB2aXJ0X3RvX2J1cyAoIHJ0bC0+cngucmluZyApICk7CisKKwkvKiBFbmFibGUgVFggYW5kIFJYICovCisJb3V0YiAoICggQ21kUnhFbmIgfCBDbWRUeEVuYiApLCBydGwtPmlvYWRkciArIENoaXBDbWQgKTsKKwlvdXRsICggKCAoIFJYX0ZJRk9fVEhSRVNIIDw8IDEzICkgfCAoIFJYX0JVRl9MRU5fSURYIDw8IDExICkgfAorCQkgKCBSWF9ETUFfQlVSU1QgPDwgOCApIHwgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwKKwkJIEFjY2VwdE15UGh5cyApLCBydGwtPmlvYWRkciArIFJ4Q29uZmlnICk7CisJb3V0bCAoIDB4ZmZmZmZmZmZVTCwgcnRsLT5pb2FkZHIgKyBNQVIwICsgMCApOworCW91dGwgKCAweGZmZmZmZmZmVUwsIHJ0bC0+aW9hZGRyICsgTUFSMCArIDQgKTsKKwlvdXRsICggKCAoIFRYX0RNQV9CVVJTVCA8PCA4ICkgfCAoIFRYX0lQRyA8PCAyNCApICksCisJICAgICAgIHJ0bC0+aW9hZGRyICsgVHhDb25maWcgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIENsb3NlIE5JQworICoKKyAqIEB2IG5ldGRldgkJTmV0IGRldmljZQorICovCitzdGF0aWMgdm9pZCBydGxfY2xvc2UgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXN0cnVjdCBydGw4MTM5X25pYyAqcnRsID0gbmV0ZGV2LT5wcml2OworCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlIHRvIGRpc2FibGUgZXZlcnl0aGluZyBpbiBvbmUgZ28gKi8KKwlydGxfcmVzZXQgKCBuZXRkZXYgKTsKKworCS8qIEZyZWUgUlggcmluZyAqLworCWZyZWUgKCBydGwtPnJ4LnJpbmcgKTsKKwlydGwtPnJ4LnJpbmcgPSBOVUxMOworfQorCisvKiogCisgKiBUcmFuc21pdCBwYWNrZXQKKyAqCisgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UKKyAqIEB2IGlvYnVmCUkvTyBidWZmZXIKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcnRsX3RyYW5zbWl0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKSB7CisJc3RydWN0IHJ0bDgxMzlfbmljICpydGwgPSBuZXRkZXYtPnByaXY7CisKKwkvKiBDaGVjayBmb3Igc3BhY2UgaW4gVFggcmluZyAqLworCWlmICggcnRsLT50eC5pb2J1ZltydGwtPnR4Lm5leHRdICE9IE5VTEwgKSB7CisJCURCR0MgKCBydGwsICJydGw4MTM5ICVwIFRYIG92ZXJmbG93XG4iLCBydGwgKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCS8qIFBhZCBhbmQgYWxpZ24gcGFja2V0ICovCisJaW9iX3BhZCAoIGlvYnVmLCBFVEhfWkxFTiApOworCisJLyogQWRkIHRvIFRYIHJpbmcgKi8KKwlEQkdDMiAoIHJ0bCwgInJ0bDgxMzkgJXAgVFggaWQgJWQgYXQgJWx4KyV6eFxuIiwgcnRsLCBydGwtPnR4Lm5leHQsCisJCXZpcnRfdG9fYnVzICggaW9idWYtPmRhdGEgKSwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwlydGwtPnR4LmlvYnVmW3J0bC0+dHgubmV4dF0gPSBpb2J1ZjsKKwlvdXRsICggdmlydF90b19idXMgKCBpb2J1Zi0+ZGF0YSApLAorCSAgICAgICBydGwtPmlvYWRkciArIFR4QWRkcjAgKyA0ICogcnRsLT50eC5uZXh0ICk7CisJb3V0bCAoICggKCAoIFRYX0ZJRk9fVEhSRVNIICYgMHg3ZTAgKSA8PCAxMSApIHwgaW9iX2xlbiAoIGlvYnVmICkgKSwKKwkgICAgICAgcnRsLT5pb2FkZHIgKyBUeFN0YXR1czAgKyA0ICogcnRsLT50eC5uZXh0ICk7CisJcnRsLT50eC5uZXh0ID0gKCBydGwtPnR4Lm5leHQgKyAxICkgJSBUWF9SSU5HX1NJWkU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQb2xsIGZvciByZWNlaXZlZCBwYWNrZXRzCisgKgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHJ0bF9wb2xsICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgcnRsODEzOV9uaWMgKnJ0bCA9IG5ldGRldi0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCB0c2FkOworCXVuc2lnbmVkIGludCByeF9zdGF0dXM7CisJdW5zaWduZWQgaW50IHJ4X2xlbjsKKwlzdHJ1Y3QgaW9fYnVmZmVyICpyeF9pb2I7CisJaW50IHdyYXBwZWRfbGVuOworCWludCBpOworCisJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0cyAqLworCXN0YXR1cyA9IGludyAoIHJ0bC0+aW9hZGRyICsgSW50clN0YXR1cyApOworCWlmICggISBzdGF0dXMgKQorCQlyZXR1cm47CisJb3V0dyAoIHN0YXR1cywgcnRsLT5pb2FkZHIgKyBJbnRyU3RhdHVzICk7CisKKwkvKiBIYW5kbGUgVFggY29tcGxldGlvbnMgKi8KKwl0c2FkID0gaW53ICggcnRsLT5pb2FkZHIgKyBUeFN1bW1hcnkgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBUWF9SSU5HX1NJWkUgOyBpKysgKSB7CisJCWlmICggKCBydGwtPnR4LmlvYnVmW2ldICE9IE5VTEwgKSAmJiAoIHRzYWQgJiAoIDEgPDwgaSApICkgKSB7CisJCQlEQkdDMiAoIHJ0bCwgInJ0bDgxMzkgJXAgVFggaWQgJWQgY29tcGxldGVcbiIsCisJCQkJcnRsLCBpICk7CisJCQluZXRkZXZfdHhfY29tcGxldGUgKCBuZXRkZXYsIHJ0bC0+dHguaW9idWZbaV0gKTsKKwkJCXJ0bC0+dHguaW9idWZbaV0gPSBOVUxMOworCQl9CisJfQorCisJLyogSGFuZGxlIHJlY2VpdmVkIHBhY2tldHMgKi8KKwl3aGlsZSAoICEgKCBpbncgKCBydGwtPmlvYWRkciArIENoaXBDbWQgKSAmIFJ4QnVmRW1wdHkgKSApIHsKKwkJcnhfc3RhdHVzID0gKiAoICggdWludDE2X3QgKiApCisJCQkJKCBydGwtPnJ4LnJpbmcgKyBydGwtPnJ4Lm9mZnNldCApICk7CisJCXJ4X2xlbiA9ICogKCAoIHVpbnQxNl90ICogKQorCQkJICAgICAoIHJ0bC0+cngucmluZyArIHJ0bC0+cngub2Zmc2V0ICsgMiApICk7CisJCWlmICggcnhfc3RhdHVzICYgUnhPSyApIHsKKwkJCURCR0MyICggcnRsLCAicnRsODEzOSAlcCBSWCBwYWNrZXQgYXQgb2Zmc2V0ICIKKwkJCQkiJXgrJXhcbiIsIHJ0bCwgcnRsLT5yeC5vZmZzZXQsIHJ4X2xlbiApOworCisJCQlyeF9pb2IgPSBhbGxvY19pb2IgKCByeF9sZW4gKTsKKwkJCWlmICggISByeF9pb2IgKSB7CisJCQkJbmV0ZGV2X3J4X2VyciAoIG5ldGRldiwgTlVMTCwgLUVOT01FTSApOworCQkJCS8qIExlYXZlIHBhY2tldCBmb3IgbmV4dCBjYWxsIHRvIHBvbGwoKSAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQl3cmFwcGVkX2xlbiA9ICggKCBydGwtPnJ4Lm9mZnNldCArIDQgKyByeF9sZW4gKQorCQkJCQktIFJYX0JVRl9MRU4gKTsKKwkJCWlmICggd3JhcHBlZF9sZW4gPCAwICkKKwkJCQl3cmFwcGVkX2xlbiA9IDA7CisKKwkJCW1lbWNweSAoIGlvYl9wdXQgKCByeF9pb2IsIHJ4X2xlbiAtIHdyYXBwZWRfbGVuICksCisJCQkJIHJ0bC0+cngucmluZyArIHJ0bC0+cngub2Zmc2V0ICsgNCwKKwkJCQkgcnhfbGVuIC0gd3JhcHBlZF9sZW4gKTsKKwkJCW1lbWNweSAoIGlvYl9wdXQgKCByeF9pb2IsIHdyYXBwZWRfbGVuICksCisJCQkJIHJ0bC0+cngucmluZywgd3JhcHBlZF9sZW4gKTsKKworCQkJbmV0ZGV2X3J4ICggbmV0ZGV2LCByeF9pb2IgKTsKKwkJfSBlbHNlIHsKKwkJCURCR0MgKCBydGwsICJydGw4MTM5ICVwIFJYIGJhZCBwYWNrZXQgKHN0YXR1cyAlIzA0eCAiCisJCQkgICAgICAgImxlbiAlZClcbiIsIHJ0bCwgcnhfc3RhdHVzLCByeF9sZW4gKTsKKwkJCW5ldGRldl9yeF9lcnIgKCBuZXRkZXYsIE5VTEwsIC1FSU5WQUwgKTsKKwkJfQorCQlydGwtPnJ4Lm9mZnNldCA9ICggKCAoIHJ0bC0+cngub2Zmc2V0ICsgNCArIHJ4X2xlbiArIDMgKSAmIH4zICkKKwkJCQkgICAlIFJYX0JVRl9MRU4gKTsKKwkJb3V0dyAoIHJ0bC0+cngub2Zmc2V0IC0gMTYsIHJ0bC0+aW9hZGRyICsgUnhCdWZQdHIgKTsKKwl9Cit9CisKKy8qKgorICogRW5hYmxlL2Rpc2FibGUgaW50ZXJydXB0cworICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorICogQHYgZW5hYmxlCUludGVycnVwdHMgc2hvdWxkIGJlIGVuYWJsZWQKKyAqLworc3RhdGljIHZvaWQgcnRsX2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBlbmFibGUgKSB7CisJc3RydWN0IHJ0bDgxMzlfbmljICpydGwgPSBuZXRkZXYtPnByaXY7CisKKwlEQkdDICggcnRsLCAicnRsODEzOSAlcCBpbnRlcnJ1cHRzICVzXG4iLAorCSAgICAgICBydGwsICggZW5hYmxlID8gImVuYWJsZWQiIDogImRpc2FibGVkIiApICk7CisJb3V0dyAoICggZW5hYmxlID8gKCBST0sgfCBSRVIgfCBUT0sgfCBURVIgKSA6IDAgKSwKKwkgICAgICAgcnRsLT5pb2FkZHIgKyBJbnRyTWFzayApOworfQorCisvKiogUlRMODEzOSBuZXQgZGV2aWNlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcGVyYXRpb25zIHJ0bF9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHJ0bF9vcGVuLAorCS5jbG9zZQkJPSBydGxfY2xvc2UsCisJLnRyYW5zbWl0CT0gcnRsX3RyYW5zbWl0LAorCS5wb2xsCQk9IHJ0bF9wb2xsLAorCS5pcnEJCT0gcnRsX2lycSwKK307CisKKy8qKgorICogUHJvYmUgUENJIGRldmljZQorICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiBpZAlQQ0kgSUQKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcnRsX3Byb2JlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBydGw4MTM5X25pYyAqcnRsOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIG5ldCBkZXZpY2UgKi8KKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldiAoIHNpemVvZiAoICpydGwgKSApOworCWlmICggISBuZXRkZXYgKQorCQlyZXR1cm4gLUVOT01FTTsKKwluZXRkZXZfaW5pdCAoIG5ldGRldiwgJnJ0bF9vcGVyYXRpb25zICk7CisJcnRsID0gbmV0ZGV2LT5wcml2OworCXBjaV9zZXRfZHJ2ZGF0YSAoIHBjaSwgbmV0ZGV2ICk7CisJbmV0ZGV2LT5kZXYgPSAmcGNpLT5kZXY7CisJbWVtc2V0ICggcnRsLCAwLCBzaXplb2YgKCAqcnRsICkgKTsKKwlydGwtPmlvYWRkciA9IHBjaS0+aW9hZGRyOworCisJLyogRml4IHVwIFBDSSBkZXZpY2UgKi8KKwlhZGp1c3RfcGNpX2RldmljZSAoIHBjaSApOworCisJLyogUmVzZXQgdGhlIE5JQywgc2V0IHVwIEVFUFJPTSBhY2Nlc3MgYW5kIHJlYWQgTUFDIGFkZHJlc3MgKi8KKwlydGxfcmVzZXQgKCBuZXRkZXYgKTsKKwlydGxfaW5pdF9lZXByb20gKCBuZXRkZXYgKTsKKwludnNfcmVhZCAoICZydGwtPmVlcHJvbS5udnMsIEVFX01BQywgbmV0ZGV2LT5od19hZGRyLCBFVEhfQUxFTiApOworCisJLyogTWFyayBhcyBsaW5rIHVwOyB3ZSBkb24ndCB5ZXQgaGFuZGxlIGxpbmsgc3RhdGUgKi8KKwluZXRkZXZfbGlua191cCAoIG5ldGRldiApOworCQorCS8qIFJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlICovCisJaWYgKCAoIHJjID0gcmVnaXN0ZXJfbmV0ZGV2ICggbmV0ZGV2ICkgKSAhPSAwICkKKwkJZ290byBlcnJfcmVnaXN0ZXJfbmV0ZGV2OworCisJLyogUmVnaXN0ZXIgbm9uLXZvbGF0aWxlIHN0b3JhZ2UgKi8KKwlpZiAoIHJ0bC0+bnZvLm52cyApIHsKKwkJaWYgKCAoIHJjID0gcmVnaXN0ZXJfbnZvICggJnJ0bC0+bnZvLAorCQkJCQkgICBuZXRkZXZfc2V0dGluZ3MgKCBuZXRkZXYgKSApICkgIT0gMCkKKwkJCWdvdG8gZXJyX3JlZ2lzdGVyX252bzsKKwl9CisKKwlyZXR1cm4gMDsKKworIGVycl9yZWdpc3Rlcl9udm86CisJdW5yZWdpc3Rlcl9uZXRkZXYgKCBuZXRkZXYgKTsKKyBlcnJfcmVnaXN0ZXJfbmV0ZGV2OgorCXJ0bF9yZXNldCAoIG5ldGRldiApOworCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZW1vdmUgUENJIGRldmljZQorICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHJ0bF9yZW1vdmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKCBwY2kgKTsKKwlzdHJ1Y3QgcnRsODEzOV9uaWMgKnJ0bCA9IG5ldGRldi0+cHJpdjsKKworCWlmICggcnRsLT5udm8ubnZzICkKKwkJdW5yZWdpc3Rlcl9udm8gKCAmcnRsLT5udm8gKTsKKwl1bnJlZ2lzdGVyX25ldGRldiAoIG5ldGRldiApOworCXJ0bF9yZXNldCAoIG5ldGRldiApOworCW5ldGRldl9udWxsaWZ5ICggbmV0ZGV2ICk7CisJbmV0ZGV2X3B1dCAoIG5ldGRldiApOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnRsODEzOV9uaWNzW10gPSB7CitQQ0lfUk9NKDB4MTBlYywgMHg4MTI5LCAicnRsODEyOSIsICAgICAgICJSZWFsdGVrIDgxMjkiLCAwKSwKK1BDSV9ST00oMHgxMGVjLCAweDgxMzksICJydGw4MTM5IiwgICAgICAgIlJlYWx0ZWsgODEzOSIsIDApLAorUENJX1JPTSgweDEwZWMsIDB4ODEzOCwgInJ0bDgxMzliIiwgICAgICAiUmVhbHRlayA4MTM5QiIsIDApLAorUENJX1JPTSgweDExODYsIDB4MTMwMCwgImRmZTUzOCIsICAgICAgICAiREZFNTMwVFgrL0RGRTUzOFRYIiwgMCksCitQQ0lfUk9NKDB4MTExMywgMHgxMjExLCAic21jMTIxMS0xIiwgICAgICJTTUMgRVoxMC8xMDAiLCAwKSwKK1BDSV9ST00oMHgxMTEyLCAweDEyMTEsICJzbWMxMjExIiwgICAgICAgIlNNQyBFWjEwLzEwMCIsIDApLAorUENJX1JPTSgweDE1MDAsIDB4MTM2MCwgImRlbHRhODEzOSIsICAgICAiRGVsdGEgRWxlY3Ryb25pY3MgODEzOSIsIDApLAorUENJX1JPTSgweDQwMzMsIDB4MTM2MCwgImFkZHRyb244MTM5IiwgICAiQWRkdHJvbiBUZWNobm9sb2d5IDgxMzkiLCAwKSwKK1BDSV9ST00oMHgxMTg2LCAweDEzNDAsICJkZmU2OTB0eGQiLCAgICAgIkQtTGluayBERkU2OTBUWEQiLCAwKSwKK1BDSV9ST00oMHgxM2QxLCAweGFiMDYsICJmZTIwMDB2eCIsICAgICAgIkFib0NvbSBGRTIwMDBWWCIsIDApLAorUENJX1JPTSgweDEyNTksIDB4YTExNywgImFsbGllZDgxMzkiLCAgICAiQWxsaWVkIFRlbGVzeW4gODEzOSIsIDApLAorUENJX1JPTSgweDE0ZWEsIDB4YWIwNiwgImZudzM2MDN0eCIsICAgICAiUGxhbmV4IEZOVy0zNjAzLVRYIiwgMCksCitQQ0lfUk9NKDB4MTRlYSwgMHhhYjA3LCAiZm53MzgwMHR4IiwgICAgICJQbGFuZXggRk5XLTM4MDAtVFgiLCAwKSwKK1BDSV9ST00oMHhmZmZmLCAweDgxMzksICJjbG9uZS1ydGw4MTM5IiwgIkNsb25lZCA4MTM5IiwgMCksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBydGw4MTM5X2RyaXZlciBfX3BjaV9kcml2ZXIgPSB7CisJLmlkcyA9IHJ0bDgxMzlfbmljcywKKwkuaWRfY291bnQgPSAoIHNpemVvZiAoIHJ0bDgxMzlfbmljcyApIC8gc2l6ZW9mICggcnRsODEzOV9uaWNzWzBdICkgKSwKKwkucHJvYmUgPSBydGxfcHJvYmUsCisJLnJlbW92ZSA9IHJ0bF9yZW1vdmUsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODE4eC9ydGw4MTgwLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ydGw4MTh4L3J0bDgxODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzJlYTIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODE4eC9ydGw4MTgwLmMKQEAgLTAsMCArMSwxNyBAQAorLyogUmVhbHRlayA4MTgwIGNhcmQ6IHJ0bDgxOHggZHJpdmVyICsgcnRsODE4MCBSRiBtb2R1bGVzICovCisKK0ZJTEVfTElDRU5DRShHUEwyX09SX0xBVEVSKTsKKworI2luY2x1ZGUgPGdweGUvcGNpLmg+CisKK1JFUVVJUkVfT0JKRUNUKHJ0bDgxOHgpOworUkVRVUlSRV9PQkpFQ1QocnRsODE4MF9ncmY1MTAxKTsKK1JFUVVJUkVfT0JKRUNUKHJ0bDgxODBfbWF4MjgyMCk7CitSRVFVSVJFX09CSkVDVChydGw4MTgwX3NhMjQwMCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBydGw4MTgwX25pY3NbXSBfX3VudXNlZCA9IHsKKwlQQ0lfUk9NKDB4MTBlYywgMHg4MTgwLCAicnRsODE4MCIsICJSZWFsdGVrIDgxODAiLCAwKSwKKwlQQ0lfUk9NKDB4MTc5OSwgMHg2MDAxLCAiZjVkNjAwMSIsICJCZWxraW4gRjVENjAwMSIsIDApLAorCVBDSV9ST00oMHgxNzk5LCAweDYwMjAsICJmNWQ2MDIwIiwgIkJlbGtpbiBGNUQ2MDIwIiwgMCksCisJUENJX1JPTSgweDExODYsIDB4MzMwMCwgImR3bDUxMCIsICAiRC1MaW5rIERXTC01MTAiLCAwKSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9ydGw4MTh4L3J0bDgxODBfZ3JmNTEwMS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODE4eC9ydGw4MTgwX2dyZjUxMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZhNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODE4eC9ydGw4MTgwX2dyZjUxMDEuYwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIFJhZGlvIHR1bmluZyBmb3IgR0NUIEdSRjUxMDEgb24gUlRMODE4MAorICoKKyAqIENvcHlyaWdodCAyMDA3IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb2RpZmllZCBzbGlnaHRseSBmb3IgZ1BYRSwgSnVuZSAyMDA5IGJ5IEpvc2h1YSBPcmVtYW4uCisgKgorICogQ29kZSBmcm9tIHRoZSBCU0QgZHJpdmVyIGFuZCB0aGUgcnRsODE4MSBwcm9qZWN0IGhhdmUgYmVlbgorICogdmVyeSB1c2VmdWwgdG8gdW5kZXJzdGFuZCBjZXJ0YWluIHRoaW5ncworICoKKyAqIEkgd2FudCB0byB0aGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgKiBwcm9qZWN0IEF1dGhvcnMuCisgKgorICogQSBzcGVjaWFsIEJpZyBUaGFua3MgYWxzbyBpcyBmb3IgYWxsIHBlb3BsZSB3aG8gZG9uYXRlZCBtZSBjYXJkcywKKyAqIG1ha2luZyBwb3NzaWJsZSB0aGUgY3JlYXRpb24gb2YgdGhlIG9yaWdpbmFsIHJ0bDgxODAgZHJpdmVyCisgKiBmcm9tIHdoaWNoIHRoaXMgY29kZSBpcyBkZXJpdmVkIQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXQ4MDIxMS5oPgorCisjaW5jbHVkZSAicnRsODE4eC5oIgorCitGSUxFX0xJQ0VOQ0UoR1BMMl9PTkxZKTsKKworI2RlZmluZSBHUkY1MTAxX0FOVEVOTkEgMHhBMworCitzdGF0aWMgY29uc3QgaW50IGdyZjUxMDFfZW5jb2RlW10gPSB7CisJMHgwLCAweDgsIDB4NCwgMHhDLAorCTB4MiwgMHhBLCAweDYsIDB4RSwKKwkweDEsIDB4OSwgMHg1LCAweEQsCisJMHgzLCAweEIsIDB4NywgMHhGCit9OworCitzdGF0aWMgdm9pZCB3cml0ZV9ncmY1MTAxKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgdTggYWRkciwgdTMyIGRhdGEpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl1MzIgcGh5X2NvbmZpZzsKKworCXBoeV9jb25maWcgPSAgZ3JmNTEwMV9lbmNvZGVbKGRhdGEgPj4gOCkgJiAweEZdOworCXBoeV9jb25maWcgfD0gZ3JmNTEwMV9lbmNvZGVbKGRhdGEgPj4gNCkgJiAweEZdIDw8IDQ7CisJcGh5X2NvbmZpZyB8PSBncmY1MTAxX2VuY29kZVtkYXRhICYgMHhGXSA8PCA4OworCXBoeV9jb25maWcgfD0gZ3JmNTEwMV9lbmNvZGVbKGFkZHIgPj4gMSkgJiAweEZdIDw8IDEyOworCXBoeV9jb25maWcgfD0gKGFkZHIgJiAxKSA8PCAxNjsKKwlwaHlfY29uZmlnIHw9IGdyZjUxMDFfZW5jb2RlWyhkYXRhICYgMHhmMDAwKSA+PiAxMl0gPDwgMjQ7CisKKwkvKiBNQUMgd2lsbCBiYW5nIGJpdHMgdG8gdGhlIGNoaXAgKi8KKwlwaHlfY29uZmlnIHw9IDB4OTAwMDAwMDA7CisKKwkvKiBUaGlzIHdhcyBvcmlnaW5hbGx5IGEgMzItYml0IHdyaXRlIHRvIGEgdHlwZWNhc3QKKwkgICBSRlBpbnNPdXRwdXQsIGJ1dCBnY2MgY29tcGxhaW5lZCBhYm91dCBhbGlhc2luZyBydWxlcy4gLUpCTyAqLworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwgcGh5X2NvbmZpZyAmIDB4ZmZmZik7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zRW5hYmxlLCBwaHlfY29uZmlnID4+IDE2KTsKKworCW1kZWxheSgzKTsKK30KKworc3RhdGljIHZvaWQgZ3JmNTEwMV93cml0ZV9waHlfYW50ZW5uYShzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIHNob3J0IGNoYW4pCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl1OCBhbnQgPSBHUkY1MTAxX0FOVEVOTkE7CisKKwlpZiAocHJpdi0+cmZwYXJhbSAmIFJGX1BBUkFNX0FOVEJERUZBVUxUKQorCQlhbnQgfD0gQkJfQU5URU5OQV9COworCisJaWYgKGNoYW4gPT0gMTQpCisJCWFudCB8PSBCQl9BTlRBVFRFTl9DSEFOMTQ7CisKKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDB4MTAsIGFudCk7Cit9CisKK3N0YXRpYyB2b2lkIGdyZjUxMDFfcmZfc2V0X2NoYW5uZWwoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVscCkKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCWludCBjaGFubmVsID0gY2hhbm5lbHAtPmNoYW5uZWxfbnI7CisJdTMyIHR4cHcgPSBwcml2LT50eHBvd2VyW2NoYW5uZWwgLSAxXSAmIDB4RkY7CisJdTMyIGNoYW4gPSBjaGFubmVsIC0gMTsKKworCS8qIHNldCBUWCBwb3dlciAqLworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDE1LCAweDApOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDA2LCB0eHB3KTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgxNSwgMHgxMCk7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MTUsIDB4MCk7CisKKwkvKiBzZXQgZnJlcXVlbmN5ICovCisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MDcsIDB4MCk7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MEIsIGNoYW4pOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDA3LCAweDEwMDApOworCisJZ3JmNTEwMV93cml0ZV9waHlfYW50ZW5uYShkZXYsIGNoYW5uZWwpOworfQorCitzdGF0aWMgdm9pZCBncmY1MTAxX3JmX3N0b3Aoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJdTMyIGFuYXBhcmFtOworCisJYW5hcGFyYW0gPSBwcml2LT5hbmFwYXJhbTsKKwlhbmFwYXJhbSAmPSAweDAwMGZmZmZmOworCWFuYXBhcmFtIHw9IDB4M2Y5MDAwMDA7CisJcnRsODE4eF9zZXRfYW5hcGFyYW0ocHJpdiwgYW5hcGFyYW0pOworCisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MDcsIDB4MCk7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MWYsIDB4NDUpOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDFmLCAweDUpOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDAwLCAweDhlNCk7Cit9CisKK3N0YXRpYyB2b2lkIGdyZjUxMDFfcmZfaW5pdChzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCXJ0bDgxOHhfc2V0X2FuYXBhcmFtKHByaXYsIHByaXYtPmFuYXBhcmFtKTsKKworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDFmLCAweDApOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDFmLCAweDApOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDFmLCAweDQwKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgxZiwgMHg2MCk7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MWYsIDB4NjEpOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDFmLCAweDYxKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgwMCwgMHhhZTQpOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDFmLCAweDEpOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDFmLCAweDQxKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgxZiwgMHg2MSk7CisKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgwMSwgMHgxYTIzKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgwMiwgMHg0OTcxKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgwMywgMHg0MWRlKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgwNCwgMHgyZDgwKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgwNSwgMHg2OGZmKTsJLyogMHg2MWZmIG9yaWdpbmFsIHZhbHVlICovCisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MDYsIDB4MCk7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MDcsIDB4MCk7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MDgsIDB4NzUzMyk7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MDksIDB4YzQwMSk7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MGEsIDB4MCk7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MGMsIDB4MWM3KTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgwZCwgMHgyOWQzKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgwZSwgMHgyZTgpOworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDEwLCAweDE5Mik7CisJd3JpdGVfZ3JmNTEwMShkZXYsIDB4MTEsIDB4MjQ4KTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgxMiwgMHgwKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgxMywgMHgyMGM0KTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgxNCwgMHhmNGZjKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgxNSwgMHgwKTsKKwl3cml0ZV9ncmY1MTAxKGRldiwgMHgxNiwgMHgxNTAwKTsKKworCXdyaXRlX2dyZjUxMDEoZGV2LCAweDA3LCAweDEwMDApOworCisJLyogYmFzZWJhbmQgY29uZmlndXJhdGlvbiAqLworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgMCwgMHhhOCk7CisJcnRsODE4eF93cml0ZV9waHkoZGV2LCAzLCAweDApOworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgNCwgMHhjMCk7CisJcnRsODE4eF93cml0ZV9waHkoZGV2LCA1LCAweDkwKTsKKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDYsIDB4MWUpOworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgNywgMHg2NCk7CisKKwlncmY1MTAxX3dyaXRlX3BoeV9hbnRlbm5hKGRldiwgMSk7CisKKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDB4MTEsIDB4ODgpOworCisJaWYgKHJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5DT05GSUcyKSAmCisJICAgIFJUTDgxOFhfQ09ORklHMl9BTlRFTk5BX0RJVikKKwkJcnRsODE4eF93cml0ZV9waHkoZGV2LCAweDEyLCAweGMwKTsgLyogZW5hYmxlIGFudCBkaXZlcnNpdHkgKi8KKwllbHNlCisJCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgMHgxMiwgMHg0MCk7IC8qIGRpc2FibGUgYW50IGRpdmVyc2l0eSAqLworCisJcnRsODE4eF93cml0ZV9waHkoZGV2LCAweDEzLCAweDkwIHwgcHJpdi0+Y3N0aHJlc2hvbGQpOworCisJcnRsODE4eF93cml0ZV9waHkoZGV2LCAweDE5LCAweDApOworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgMHgxYSwgMHhhMCk7CisJcnRsODE4eF93cml0ZV9waHkoZGV2LCAweDFiLCAweDQ0KTsKK30KKworc3RydWN0IHJ0bDgxOHhfcmZfb3BzIGdyZjUxMDFfcmZfb3BzIF9fcnRsODE4eF9yZl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIkdDVCBHUkY1MTAxIiwKKwkuaWQgICAgICAgICAgICAgPSA1LAorCS5pbml0CQk9IGdyZjUxMDFfcmZfaW5pdCwKKwkuc3RvcAkJPSBncmY1MTAxX3JmX3N0b3AsCisJLnNldF9jaGFuCT0gZ3JmNTEwMV9yZl9zZXRfY2hhbm5lbAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxOHgvcnRsODE4MF9tYXgyODIwLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ydGw4MTh4L3J0bDgxODBfbWF4MjgyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTQ5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ydGw4MTh4L3J0bDgxODBfbWF4MjgyMC5jCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogUmFkaW8gdHVuaW5nIGZvciBNYXhpbSBtYXgyODIwIG9uIFJUTDgxODAKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogTW9kaWZpZWQgc2xpZ2h0bHkgZm9yIGdQWEUsIEp1bmUgMjAwOSBieSBKb3NodWEgT3JlbWFuLgorICoKKyAqIENvZGUgZnJvbSB0aGUgQlNEIGRyaXZlciBhbmQgdGhlIHJ0bDgxODEgcHJvamVjdCBoYXZlIGJlZW4KKyAqIHZlcnkgdXNlZnVsIHRvIHVuZGVyc3RhbmQgY2VydGFpbiB0aGluZ3MKKyAqCisgKiBJIHdhbnQgdG8gdGhhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICogcHJvamVjdCBBdXRob3JzLgorICoKKyAqIEEgc3BlY2lhbCBCaWcgVGhhbmtzIGFsc28gaXMgZm9yIGFsbCBwZW9wbGUgd2hvIGRvbmF0ZWQgbWUgY2FyZHMsCisgKiBtYWtpbmcgcG9zc2libGUgdGhlIGNyZWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBydGw4MTgwIGRyaXZlcgorICogZnJvbSB3aGljaCB0aGlzIGNvZGUgaXMgZGVyaXZlZCEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvbmV0ODAyMTEuaD4KKworI2luY2x1ZGUgInJ0bDgxOHguaCIKKworRklMRV9MSUNFTkNFKEdQTDJfT05MWSk7CisKKyNkZWZpbmUgTUFYSU1fQU5URU5OQSAweGIzCisKK3N0YXRpYyBjb25zdCB1MzIgbWF4MjgyMF9jaGFuW10gPSB7CisJMTIsIC8qIENIIDEgKi8KKwkxNywKKwkyMiwKKwkyNywKKwkzMiwKKwkzNywKKwk0MiwKKwk0NywKKwk1MiwKKwk1NywKKwk2MiwKKwk2NywKKwk3MiwKKwk4NCwgLyogQ0ggMTQgKi8KK307CisKK3N0YXRpYyB2b2lkIHdyaXRlX21heDI4MjAoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCB1OCBhZGRyLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXUzMiBwaHlfY29uZmlnOworCisJcGh5X2NvbmZpZyA9IDB4OTAgKyAoZGF0YSAmIDB4Zik7CisJcGh5X2NvbmZpZyA8PD0gMTY7CisJcGh5X2NvbmZpZyArPSBhZGRyOworCXBoeV9jb25maWcgPDw9IDg7CisJcGh5X2NvbmZpZyArPSAoZGF0YSA+PiA0KSAmIDB4ZmY7CisKKwkvKiBUaGlzIHdhcyBvcmlnaW5hbGx5IGEgMzItYml0IHdyaXRlIHRvIGEgdHlwZWNhc3QKKwkgICBSRlBpbnNPdXRwdXQsIGJ1dCBnY2MgY29tcGxhaW5lZCBhYm91dCBhbGlhc2luZyBydWxlcy4gLUpCTyAqLworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwgcGh5X2NvbmZpZyAmIDB4ZmZmZik7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zRW5hYmxlLCBwaHlfY29uZmlnID4+IDE2KTsKKworCW1kZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQgbWF4MjgyMF93cml0ZV9waHlfYW50ZW5uYShzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIHNob3J0IGNoYW4pCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl1OCBhbnQ7CisKKwlhbnQgPSBNQVhJTV9BTlRFTk5BOworCWlmIChwcml2LT5yZnBhcmFtICYgUkZfUEFSQU1fQU5UQkRFRkFVTFQpCisJCWFudCB8PSBCQl9BTlRFTk5BX0I7CisJaWYgKGNoYW4gPT0gMTQpCisJCWFudCB8PSBCQl9BTlRBVFRFTl9DSEFOMTQ7CisKKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDB4MTAsIGFudCk7Cit9CisKK3N0YXRpYyB2b2lkIG1heDI4MjBfcmZfc2V0X2NoYW5uZWwoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVscCkKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCWludCBjaGFubmVsID0gY2hhbm5lbHAtPmNoYW5uZWxfbnI7CisJdW5zaWduZWQgaW50IGNoYW5faWR4ID0gY2hhbm5lbCAtIDE7CisJdTMyIHR4cHcgPSBwcml2LT50eHBvd2VyW2NoYW5faWR4XSAmIDB4RkY7CisJdTMyIGNoYW4gPSBtYXgyODIwX2NoYW5bY2hhbl9pZHhdOworCisJLyogV2hpbGUgcGhpbGlwcyBTQTI0MDAgZHJpdmUgdGhlIFBBIGJpYXMgZnJvbQorCSAqIHNhMjQwMCwgZm9yIE1BWElNIHdlIGRvIHRoaXMgZGlyZWN0bHkgZnJvbSBCQiAqLworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgMywgdHhwdyk7CisKKwltYXgyODIwX3dyaXRlX3BoeV9hbnRlbm5hKGRldiwgY2hhbm5lbCk7CisJd3JpdGVfbWF4MjgyMChkZXYsIDMsIGNoYW4pOworfQorCitzdGF0aWMgdm9pZCBtYXgyODIwX3JmX3N0b3Aoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KQoreworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgMywgMHg4KTsKKwl3cml0ZV9tYXgyODIwKGRldiwgMSwgMCk7Cit9CisKKworc3RhdGljIHZvaWQgbWF4MjgyMF9yZl9pbml0KHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJLyogTUFYSU0gZnJvbSBuZXRic2QgZHJpdmVyICovCisJd3JpdGVfbWF4MjgyMChkZXYsIDAsIDB4MDA3KTsgLyogdGVzdCBtb2RlIGFzIGluZGljYXRlZCBpbiBkYXRhc2hlZXQgKi8KKwl3cml0ZV9tYXgyODIwKGRldiwgMSwgMHgwMWUpOyAvKiBlbmFibGUgcmVnaXN0ZXIgKi8KKwl3cml0ZV9tYXgyODIwKGRldiwgMiwgMHgwMDEpOyAvKiBzeW50IHJlZ2lzdGVyICovCisKKwltYXgyODIwX3JmX3NldF9jaGFubmVsKGRldiwgTlVMTCk7CisKKwl3cml0ZV9tYXgyODIwKGRldiwgNCwgMHgzMTMpOyAvKiByeCByZWdpc3RlciAqLworCisJLyogUEEgaXMgZHJpdmVuIGRpcmVjdGx5IGJ5IHRoZSBCQiwgd2Uga2VlcCB0aGUgTUFYSU0gYmlhcworCSAqIGF0IHRoZSBoaWdoZXN0IHZhbHVlIGluIGNhc2UgdGhhdCBzZXR0aW5nIGl0IHRvIGxvd2VyCisJICogdmFsdWVzIG1heSBpbnRyb2R1Y2Ugc29tZSBmdXJ0aGVyIGF0dGVudWF0aW9uIHNvbWV3aGVyZS4uCisJICovCisJd3JpdGVfbWF4MjgyMChkZXYsIDUsIDB4MDBmKTsKKworCS8qIGJhc2ViYW5kIGNvbmZpZ3VyYXRpb24gKi8KKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDAsIDB4ODgpOyAvKiBzeXMxICAgICAgICovCisJcnRsODE4eF93cml0ZV9waHkoZGV2LCAzLCAweDA4KTsgLyogdHhhZ2MgICAgICAqLworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgNCwgMHhmOCk7IC8qIGxuYWRldCAgICAgKi8KKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDUsIDB4OTApOyAvKiBpZmFnY2luaXQgICovCisJcnRsODE4eF93cml0ZV9waHkoZGV2LCA2LCAweDFhKTsgLyogaWZhZ2NsaW1pdCAqLworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgNywgMHg2NCk7IC8qIGlmYWdjZGV0ICAgKi8KKworCW1heDI4MjBfd3JpdGVfcGh5X2FudGVubmEoZGV2LCAxKTsKKworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgMHgxMSwgMHg4OCk7IC8qIHRybCAqLworCisJaWYgKHJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5DT05GSUcyKSAmCisJICAgIFJUTDgxOFhfQ09ORklHMl9BTlRFTk5BX0RJVikKKwkJcnRsODE4eF93cml0ZV9waHkoZGV2LCAweDEyLCAweGM3KTsKKwllbHNlCisJCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgMHgxMiwgMHg0Nyk7CisKKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDB4MTMsIDB4OWIpOworCisJcnRsODE4eF93cml0ZV9waHkoZGV2LCAweDE5LCAweDApOyAgLyogQ0hFU1RMSU0gKi8KKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDB4MWEsIDB4OWYpOyAvKiBDSFNRTElNICAqLworCisJbWF4MjgyMF9yZl9zZXRfY2hhbm5lbChkZXYsIE5VTEwpOworfQorCitzdHJ1Y3QgcnRsODE4eF9yZl9vcHMgbWF4MjgyMF9yZl9vcHMgX19ydGw4MTh4X3JmX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiTWF4aW0gbWF4MjgyMCIsCisJLmlkCQk9IDQsCisJLmluaXQJCT0gbWF4MjgyMF9yZl9pbml0LAorCS5zdG9wCQk9IG1heDI4MjBfcmZfc3RvcCwKKwkuc2V0X2NoYW4JPSBtYXgyODIwX3JmX3NldF9jaGFubmVsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODE4eC9ydGw4MTgwX3NhMjQwMC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODE4eC9ydGw4MTgwX3NhMjQwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZmQzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ydGw4MTh4L3J0bDgxODBfc2EyNDAwLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBSYWRpbyB0dW5pbmcgZm9yIFBoaWxpcHMgU0EyNDAwIG9uIFJUTDgxODAKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogTW9kaWZpZWQgc2xpZ2h0bHkgZm9yIGdQWEUsIEp1bmUgMjAwOSBieSBKb3NodWEgT3JlbWFuLgorICoKKyAqIENvZGUgZnJvbSB0aGUgQlNEIGRyaXZlciBhbmQgdGhlIHJ0bDgxODEgcHJvamVjdCBoYXZlIGJlZW4KKyAqIHZlcnkgdXNlZnVsIHRvIHVuZGVyc3RhbmQgY2VydGFpbiB0aGluZ3MKKyAqCisgKiBJIHdhbnQgdG8gdGhhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICogcHJvamVjdCBBdXRob3JzLgorICoKKyAqIEEgc3BlY2lhbCBCaWcgVGhhbmtzIGFsc28gaXMgZm9yIGFsbCBwZW9wbGUgd2hvIGRvbmF0ZWQgbWUgY2FyZHMsCisgKiBtYWtpbmcgcG9zc2libGUgdGhlIGNyZWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBydGw4MTgwIGRyaXZlcgorICogZnJvbSB3aGljaCB0aGlzIGNvZGUgaXMgZGVyaXZlZCEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvbmV0ODAyMTEuaD4KKworI2luY2x1ZGUgInJ0bDgxOHguaCIKKworRklMRV9MSUNFTkNFKEdQTDJfT05MWSk7CisKKyNkZWZpbmUgU0EyNDAwX0FOVEVOTkEgMHg5MQorI2RlZmluZSBTQTI0MDBfRElHX0FOQVBBUkFNX1BXUjFfT04gMHg4CisjZGVmaW5lIFNBMjQwMF9BTkFfQU5BUEFSQU1fUFdSMV9PTiAweDI4CisjZGVmaW5lIFNBMjQwMF9BTkFQQVJBTV9QV1IwX09OIDB4MworCisvKiBSWCBzZW5zaXRpdml0eSBpbiBkYm0gKi8KKyNkZWZpbmUgU0EyNDAwX01BWF9TRU5TIDg1CisKKyNkZWZpbmUgU0EyNDAwX1JFRzRfRklSREFDX1NISUZUIDcKKworc3RhdGljIGNvbnN0IHUzMiBzYTI0MDBfY2hhbltdID0geworCTB4MDAwOTZjLCAvKiBjaDEgKi8KKwkweDA4MDk3MCwKKwkweDEwMDk3NCwKKwkweDE4MDk3OCwKKwkweDAwMDk4MCwKKwkweDA4MDk4NCwKKwkweDEwMDk4OCwKKwkweDE4MDk4YywKKwkweDAwMDk5NCwKKwkweDA4MDk5OCwKKwkweDEwMDk5YywKKwkweDE4MDlhMCwKKwkweDAwMDlhOCwKKwkweDAwMDliNCwgLyogY2ggMTQgKi8KK307CisKK3N0YXRpYyB2b2lkIHdyaXRlX3NhMjQwMChzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIHU4IGFkZHIsIHUzMiBkYXRhKQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJdTMyIHBoeV9jb25maWc7CisKKwkvKiBNQUMgd2lsbCBiYW5nIGJpdHMgdG8gdGhlIHNhMjQwMC4gc3cgMy13aXJlIGlzIE5PVCB1c2VkICovCisJcGh5X2NvbmZpZyA9IDB4YjAwMDAwMDA7CisKKwlwaHlfY29uZmlnIHw9ICgodTMyKShhZGRyICYgMHhmKSkgPDwgMjQ7CisJcGh5X2NvbmZpZyB8PSBkYXRhICYgMHhmZmZmZmY7CisKKwkvKiBUaGlzIHdhcyBvcmlnaW5hbGx5IGEgMzItYml0IHdyaXRlIHRvIGEgdHlwZWNhc3QKKwkgICBSRlBpbnNPdXRwdXQsIGJ1dCBnY2MgY29tcGxhaW5lZCBhYm91dCBhbGlhc2luZyBydWxlcy4gLUpCTyAqLworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwgcGh5X2NvbmZpZyAmIDB4ZmZmZik7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zRW5hYmxlLCBwaHlfY29uZmlnID4+IDE2KTsKKworCW1kZWxheSgzKTsKK30KKworc3RhdGljIHZvaWQgc2EyNDAwX3dyaXRlX3BoeV9hbnRlbm5hKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgc2hvcnQgY2hhbikKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXU4IGFudCA9IFNBMjQwMF9BTlRFTk5BOworCisJaWYgKHByaXYtPnJmcGFyYW0gJiBSRl9QQVJBTV9BTlRCREVGQVVMVCkKKwkJYW50IHw9IEJCX0FOVEVOTkFfQjsKKworCWlmIChjaGFuID09IDE0KQorCQlhbnQgfD0gQkJfQU5UQVRURU5fQ0hBTjE0OworCisJcnRsODE4eF93cml0ZV9waHkoZGV2LCAweDEwLCBhbnQpOworCit9CisKK3N0YXRpYyB2b2lkIHNhMjQwMF9yZl9zZXRfY2hhbm5lbChzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCAqY2hhbm5lbHApCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlpbnQgY2hhbm5lbCA9IGNoYW5uZWxwLT5jaGFubmVsX25yOworCXUzMiB0eHB3ID0gcHJpdi0+dHhwb3dlcltjaGFubmVsIC0gMV0gJiAweEZGOworCXUzMiBjaGFuID0gc2EyNDAwX2NoYW5bY2hhbm5lbCAtIDFdOworCisJd3JpdGVfc2EyNDAwKGRldiwgNywgdHhwdyk7CisKKwlzYTI0MDBfd3JpdGVfcGh5X2FudGVubmEoZGV2LCBjaGFubmVsKTsKKworCXdyaXRlX3NhMjQwMChkZXYsIDAsIGNoYW4pOworCXdyaXRlX3NhMjQwMChkZXYsIDEsIDB4YmI1MCk7CisJd3JpdGVfc2EyNDAwKGRldiwgMiwgMHg4MCk7CisJd3JpdGVfc2EyNDAwKGRldiwgMywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhMjQwMF9yZl9zdG9wKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9zYTI0MDAoZGV2LCA0LCAwKTsKK30KKworc3RhdGljIHZvaWQgc2EyNDAwX3JmX2luaXQoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJdTMyIGFuYXBhcmFtLCB0eGNvbmY7CisJdTggZmlyZGFjOworCWludCBhbmFsb2dwaHkgPSBwcml2LT5yZnBhcmFtICYgUkZfUEFSQU1fQU5BTE9HUEhZOworCisJYW5hcGFyYW0gPSBwcml2LT5hbmFwYXJhbTsKKwlhbmFwYXJhbSAmPSB+KDEgPDwgQU5BUEFSQU1fVFhEQUNPRkZfU0hJRlQpOworCWFuYXBhcmFtICY9IH5BTkFQQVJBTV9QV1IxX01BU0s7CisJYW5hcGFyYW0gJj0gfkFOQVBBUkFNX1BXUjBfTUFTSzsKKworCWlmIChhbmFsb2dwaHkpIHsKKwkJYW5hcGFyYW0gfD0gU0EyNDAwX0FOQV9BTkFQQVJBTV9QV1IxX09OIDw8IEFOQVBBUkFNX1BXUjFfU0hJRlQ7CisJCWZpcmRhYyA9IDA7CisJfSBlbHNlIHsKKwkJYW5hcGFyYW0gfD0gKFNBMjQwMF9ESUdfQU5BUEFSQU1fUFdSMV9PTiA8PCBBTkFQQVJBTV9QV1IxX1NISUZUKTsKKwkJYW5hcGFyYW0gfD0gKFNBMjQwMF9BTkFQQVJBTV9QV1IwX09OIDw8IEFOQVBBUkFNX1BXUjBfU0hJRlQpOworCQlmaXJkYWMgPSAxIDw8IFNBMjQwMF9SRUc0X0ZJUkRBQ19TSElGVDsKKwl9CisKKwlydGw4MTh4X3NldF9hbmFwYXJhbShwcml2LCBhbmFwYXJhbSk7CisKKwl3cml0ZV9zYTI0MDAoZGV2LCAwLCBzYTI0MDBfY2hhblswXSk7CisJd3JpdGVfc2EyNDAwKGRldiwgMSwgMHhiYjUwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LCAyLCAweDgwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LCAzLCAwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LCA0LCAweDE5MzQwIHwgZmlyZGFjKTsKKwl3cml0ZV9zYTI0MDAoZGV2LCA1LCAweDFkZmIgfCAoU0EyNDAwX01BWF9TRU5TIC0gNTQpIDw8IDE1KTsKKwl3cml0ZV9zYTI0MDAoZGV2LCA0LCAweDE5MzQ4IHwgZmlyZGFjKTsgLyogY2FsaWJyYXRlIFZDTyAqLworCisJaWYgKCFhbmFsb2dwaHkpCisJCXdyaXRlX3NhMjQwMChkZXYsIDQsIDB4MTkzOGMpOyAvKj8/PyovCisKKwl3cml0ZV9zYTI0MDAoZGV2LCA0LCAweDE5MzQwIHwgZmlyZGFjKTsKKworCXdyaXRlX3NhMjQwMChkZXYsIDAsIHNhMjQwMF9jaGFuWzBdKTsKKwl3cml0ZV9zYTI0MDAoZGV2LCAxLCAweGJiNTApOworCXdyaXRlX3NhMjQwMChkZXYsIDIsIDB4ODApOworCXdyaXRlX3NhMjQwMChkZXYsIDMsIDApOworCXdyaXRlX3NhMjQwMChkZXYsIDQsIDB4MTkzNDQgfCBmaXJkYWMpOyAvKiBjYWxpYnJhdGUgZmlsdGVyICovCisKKwkvKiBuZXcgZnJvbSBydGw4MTgwIGVtYmVkZGVkIGRyaXZlciAocnRsODE4MSBwcm9qZWN0KSAqLworCXdyaXRlX3NhMjQwMChkZXYsIDYsIDB4MTNmZiB8ICgxIDw8IDIzKSk7IC8qIE1BTlJYICovCisJd3JpdGVfc2EyNDAwKGRldiwgOCwgMCk7IC8qIFZDTyAqLworCisJaWYgKGFuYWxvZ3BoeSkgeworCQlydGw4MTh4X3NldF9hbmFwYXJhbShwcml2LCBhbmFwYXJhbSB8CisJCQkJICAgICAoMSA8PCBBTkFQQVJBTV9UWERBQ09GRl9TSElGVCkpOworCisJCXR4Y29uZiA9IHJ0bDgxOHhfaW9yZWFkMzIocHJpdiwgJnByaXYtPm1hcC0+VFhfQ09ORik7CisJCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPlRYX0NPTkYsCisJCQl0eGNvbmYgfCBSVEw4MThYX1RYX0NPTkZfTE9PUEJBQ0tfQ09OVCk7CisKKwkJd3JpdGVfc2EyNDAwKGRldiwgNCwgMHgxOTM0MSk7IC8qIGNhbGlicmF0ZXMgREMgKi8KKworCQkvKiBhIDV1cyBkZWxheSBpcyByZXF1aXJlZCBoZXJlLAorCQkgKiB3ZSByZWx5IG9uIHRoZSAzbXMgZGVsYXkgaW50cm9kdWNlZCBpbiB3cml0ZV9zYTI0MDAgKi8KKworCQl3cml0ZV9zYTI0MDAoZGV2LCA0LCAweDE5MzQ1KTsKKworCQkvKiBhIDIwdXMgZGVsYXkgaXMgcmVxdWlyZWQgaGVyZSwKKwkJICogd2UgcmVseSBvbiB0aGUgM21zIGRlbGF5IGludHJvZHVjZWQgaW4gd3JpdGVfc2EyNDAwICovCisKKwkJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgJnByaXYtPm1hcC0+VFhfQ09ORiwgdHhjb25mKTsKKworCQlydGw4MTh4X3NldF9hbmFwYXJhbShwcml2LCBhbmFwYXJhbSk7CisJfQorCS8qIGVuZCBuZXcgY29kZSAqLworCisJd3JpdGVfc2EyNDAwKGRldiwgNCwgMHgxOTM0MSB8IGZpcmRhYyk7IC8qIFJUWCBNT0RFICovCisKKwkvKiBiYXNlYmFuZCBjb25maWd1cmF0aW9uICovCisJcnRsODE4eF93cml0ZV9waHkoZGV2LCAwLCAweDk4KTsKKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDMsIDB4MzgpOworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgNCwgMHhlMCk7CisJcnRsODE4eF93cml0ZV9waHkoZGV2LCA1LCAweDkwKTsKKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDYsIDB4MWEpOworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgNywgMHg2NCk7CisKKwlzYTI0MDBfd3JpdGVfcGh5X2FudGVubmEoZGV2LCAxKTsKKworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgMHgxMSwgMHg4MCk7CisKKwlpZiAocnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzIpICYKKwkgICAgUlRMODE4WF9DT05GSUcyX0FOVEVOTkFfRElWKQorCQlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDB4MTIsIDB4YzcpOyAvKiBlbmFibGUgYW50IGRpdmVyc2l0eSAqLworCWVsc2UKKwkJcnRsODE4eF93cml0ZV9waHkoZGV2LCAweDEyLCAweDQ3KTsgLyogZGlzYWJsZSBhbnQgZGl2ZXJzaXR5ICovCisKKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDB4MTMsIDB4OTAgfCBwcml2LT5jc3RocmVzaG9sZCk7CisKKwlydGw4MTh4X3dyaXRlX3BoeShkZXYsIDB4MTksIDB4MCk7CisJcnRsODE4eF93cml0ZV9waHkoZGV2LCAweDFhLCAweGEwKTsKK30KKworc3RydWN0IHJ0bDgxOHhfcmZfb3BzIHNhMjQwMF9yZl9vcHMgX19ydGw4MTh4X3JmX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiUGhpbGlwcyBTQTI0MDAiLAorCS5pZAkJPSAzLAorCS5pbml0CQk9IHNhMjQwMF9yZl9pbml0LAorCS5zdG9wCQk9IHNhMjQwMF9yZl9zdG9wLAorCS5zZXRfY2hhbgk9IHNhMjQwMF9yZl9zZXRfY2hhbm5lbAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxOHgvcnRsODE4NS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODE4eC9ydGw4MTg1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhNWFiNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxOHgvcnRsODE4NS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFJlYWx0ZWsgODE4NSBjYXJkOiBydGw4MTh4IGRyaXZlciArIHJ0bDgxODVfcnRsODIyNSBSRiBtb2R1bGUgKi8KKworRklMRV9MSUNFTkNFKEdQTDJfT1JfTEFURVIpOworCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKworUkVRVUlSRV9PQkpFQ1QocnRsODE4eCk7CitSRVFVSVJFX09CSkVDVChydGw4MTg1X3J0bDgyMjUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnRsODE4NV9uaWNzW10gX191bnVzZWQgPSB7CisJUENJX1JPTSgweDEwZWMsIDB4ODE4NSwgInJ0bDgxODUiLCAiUmVhbHRlayA4MTg1IiwgMCksCisJUENJX1JPTSgweDE3OTksIDB4NzAwZiwgImY1ZDcwMDAiLCAiQmVsa2luIEY1RDcwMDAiLCAwKSwKKwlQQ0lfUk9NKDB4MTc5OSwgMHg3MDFmLCAiZjVkNzAxMCIsICJCZWxraW4gRjVENzAxMCIsIDApLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxOHgvcnRsODE4NV9ydGw4MjI1LmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ydGw4MTh4L3J0bDgxODVfcnRsODIyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZmMxODYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9ydGw4MTh4L3J0bDgxODVfcnRsODIyNS5jCkBAIC0wLDAgKzEsODA0IEBACisvKgorICogUmFkaW8gdHVuaW5nIGZvciBSVEw4MjI1IG9uIFJUTDgxODUKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBNaWNoYWVsIFd1IDxmbGFtaW5naWNlQHNvdXJtaWxrLm5ldD4KKyAqIENvcHlyaWdodCAyMDA3IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb2RpZmllZCBzbGlnaHRseSBmb3IgZ1BYRSwgSnVuZSAyMDA5IGJ5IEpvc2h1YSBPcmVtYW4KKyAqCisgKiBCYXNlZCBvbiB0aGUgcjgxODAgZHJpdmVyLCB3aGljaCBpczoKKyAqIENvcHlyaWdodCAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICoKKyAqIFRoYW5rcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0IQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXQ4MDIxMS5oPgorCisjaW5jbHVkZSAicnRsODE4eC5oIgorCitGSUxFX0xJQ0VOQ0UoR1BMMl9PTkxZKTsKKworI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNX09OCTB4YTAwMDBiNTkKKyNkZWZpbmUgUlRMODIyNV9BTkFQQVJBTTJfT04JMHg4NjBkZWMxMQorI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNX09GRgkweGEwMGJlYjU5CisjZGVmaW5lIFJUTDgyMjVfQU5BUEFSQU0yX09GRgkweDg0MGRlYzExCisKKyNkZWZpbmUgbWluKGEsYikgKCgoYSk8KGIpKT8oYSk6KGIpKQorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChpbnQpKHNpemVvZihhKS9zaXplb2YoKGEpWzBdKSkKKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCQkgIHU4IGFkZHIsIHU4IGRhdGEpCit7CisJcnRsODE4eF93cml0ZV9waHkoZGV2LCBhZGRyLCBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgyMjVfd3JpdGVfcGh5X2NjayhzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkJCSB1OCBhZGRyLCB1OCBkYXRhKQoreworCXJ0bDgxOHhfd3JpdGVfcGh5KGRldiwgYWRkciwgZGF0YSB8IDB4MTAwMDApOworfQorCitzdGF0aWMgdm9pZCBydGw4MjI1X3dyaXRlKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgdTggYWRkciwgdTE2IGRhdGEpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl1MTYgcmVnODAsIHJlZzg0LCByZWc4MjsKKwl1MzIgYmFuZ2RhdGE7CisJaW50IGk7CisKKwliYW5nZGF0YSA9IChkYXRhIDw8IDQpIHwgKGFkZHIgJiAweGYpOworCisJcmVnODAgPSBydGw4MTh4X2lvcmVhZDE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCkgJiAweGZmZjM7CisJcmVnODIgPSBydGw4MTh4X2lvcmVhZDE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc0VuYWJsZSk7CisKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNFbmFibGUsIHJlZzgyIHwgMHg3KTsKKworCXJlZzg0ID0gcnRsODE4eF9pb3JlYWQxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNTZWxlY3QpOworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc1NlbGVjdCwgcmVnODQgfCAweDcgfCAweDQwMCk7CisJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQpOworCXVkZWxheSgxMCk7CisKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNPdXRwdXQsIHJlZzgwIHwgKDEgPDwgMikpOworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwl1ZGVsYXkoMik7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LCByZWc4MCk7CisJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQpOworCXVkZWxheSgxMCk7CisKKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJdTE2IHJlZyA9IHJlZzgwIHwgISEoYmFuZ2RhdGEgJiAoMSA8PCBpKSk7CisKKwkJaWYgKGkgJiAxKQorCQkJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LCByZWcpOworCisJCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwgcmVnIHwgKDEgPDwgMSkpOworCQlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNPdXRwdXQsIHJlZyB8ICgxIDw8IDEpKTsKKworCQlpZiAoIShpICYgMSkpCisJCQlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNPdXRwdXQsIHJlZyk7CisJfQorCisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LCByZWc4MCB8ICgxIDw8IDIpKTsKKwlydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCk7CisJdWRlbGF5KDEwKTsKKworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwgcmVnODAgfCAoMSA8PCAyKSk7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zU2VsZWN0LCByZWc4NCB8IDB4NDAwKTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNFbmFibGUsIDB4MUZGRik7Cit9CisKK3N0YXRpYyB1MTYgcnRsODIyNV9yZWFkKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgdTggYWRkcikKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXUxNiByZWc4MCwgcmVnODIsIHJlZzg0LCBvdXQ7CisJaW50IGk7CisKKwlyZWc4MCA9IHJ0bDgxOHhfaW9yZWFkMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0KTsKKwlyZWc4MiA9IHJ0bDgxOHhfaW9yZWFkMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zRW5hYmxlKTsKKwlyZWc4NCA9IHJ0bDgxOHhfaW9yZWFkMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zU2VsZWN0KSB8IDB4NDAwOworCisJcmVnODAgJj0gfjB4RjsKKworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc0VuYWJsZSwgcmVnODIgfCAweDAwMEYpOworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc1NlbGVjdCwgcmVnODQgfCAweDAwMEYpOworCisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LCByZWc4MCB8ICgxIDw8IDIpKTsKKwlydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCk7CisJdWRlbGF5KDQpOworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwgcmVnODApOworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwl1ZGVsYXkoNSk7CisKKwlmb3IgKGkgPSA0OyBpID49IDA7IGktLSkgeworCQl1MTYgcmVnID0gcmVnODAgfCAoKGFkZHIgPj4gaSkgJiAxKTsKKworCQlpZiAoIShpICYgMSkpIHsKKwkJCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwgcmVnKTsKKwkJCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwkJCXVkZWxheSgxKTsKKwkJfQorCisJCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwKKwkJCQkgIHJlZyB8ICgxIDw8IDEpKTsKKwkJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQpOworCQl1ZGVsYXkoMik7CisJCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwKKwkJCQkgIHJlZyB8ICgxIDw8IDEpKTsKKwkJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQpOworCQl1ZGVsYXkoMik7CisKKwkJaWYgKGkgJiAxKSB7CisJCQlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNPdXRwdXQsIHJlZyk7CisJCQlydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCk7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwl9CisKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNFbmFibGUsIDB4MDAwRSk7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zU2VsZWN0LCAweDA0MEUpOworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNPdXRwdXQsCisJCQkgIHJlZzgwIHwgKDEgPDwgMykgfCAoMSA8PCAxKSk7CisJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQpOworCXVkZWxheSgyKTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNPdXRwdXQsCisJCQkgIHJlZzgwIHwgKDEgPDwgMykpOworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwl1ZGVsYXkoMik7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LAorCQkJICByZWc4MCB8ICgxIDw8IDMpKTsKKwlydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCk7CisJdWRlbGF5KDIpOworCisJb3V0ID0gMDsKKwlmb3IgKGkgPSAxMTsgaSA+PSAwOyBpLS0pIHsKKwkJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LAorCQkJCSAgcmVnODAgfCAoMSA8PCAzKSk7CisJCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwkJdWRlbGF5KDEpOworCQlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNPdXRwdXQsCisJCQkJICByZWc4MCB8ICgxIDw8IDMpIHwgKDEgPDwgMSkpOworCQlydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCk7CisJCXVkZWxheSgyKTsKKwkJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LAorCQkJCSAgcmVnODAgfCAoMSA8PCAzKSB8ICgxIDw8IDEpKTsKKwkJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQpOworCQl1ZGVsYXkoMik7CisJCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwKKwkJCQkgIHJlZzgwIHwgKDEgPDwgMykgfCAoMSA8PCAxKSk7CisJCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwkJdWRlbGF5KDIpOworCisJCWlmIChydGw4MTh4X2lvcmVhZDE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc0lucHV0KSAmICgxIDw8IDEpKQorCQkJb3V0IHw9IDEgPDwgaTsKKworCQlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNPdXRwdXQsCisJCQkJICByZWc4MCB8ICgxIDw8IDMpKTsKKwkJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQpOworCQl1ZGVsYXkoMik7CisJfQorCisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LAorCQkJICByZWc4MCB8ICgxIDw8IDMpIHwgKDEgPDwgMikpOworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwl1ZGVsYXkoMik7CisKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNFbmFibGUsIHJlZzgyKTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNTZWxlY3QsIHJlZzg0KTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNPdXRwdXQsIDB4MDNBMCk7CisKKwlyZXR1cm4gb3V0OworfQorCitzdGF0aWMgY29uc3QgdTE2IHJ0bDgyMjViY2RfcnhnYWluW10gPSB7CisJMHgwNDAwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA4LCAweDA0MDksCisJMHgwNDBhLCAweDA0MGIsIDB4MDUwMiwgMHgwNTAzLCAweDA1MDQsIDB4MDUwNSwgMHgwNTQwLCAweDA1NDEsCisJMHgwNTQyLCAweDA1NDMsIDB4MDU0NCwgMHgwNTQ1LCAweDA1ODAsIDB4MDU4MSwgMHgwNTgyLCAweDA1ODMsCisJMHgwNTg0LCAweDA1ODUsIDB4MDU4OCwgMHgwNTg5LCAweDA1OGEsIDB4MDU4YiwgMHgwNjQzLCAweDA2NDQsCisJMHgwNjQ1LCAweDA2ODAsIDB4MDY4MSwgMHgwNjgyLCAweDA2ODMsIDB4MDY4NCwgMHgwNjg1LCAweDA2ODgsCisJMHgwNjg5LCAweDA2OGEsIDB4MDY4YiwgMHgwNjhjLCAweDA3NDIsIDB4MDc0MywgMHgwNzQ0LCAweDA3NDUsCisJMHgwNzgwLCAweDA3ODEsIDB4MDc4MiwgMHgwNzgzLCAweDA3ODQsIDB4MDc4NSwgMHgwNzg4LCAweDA3ODksCisJMHgwNzhhLCAweDA3OGIsIDB4MDc4YywgMHgwNzhkLCAweDA3OTAsIDB4MDc5MSwgMHgwNzkyLCAweDA3OTMsCisJMHgwNzk0LCAweDA3OTUsIDB4MDc5OCwgMHgwNzk5LCAweDA3OWEsIDB4MDc5YiwgMHgwNzljLCAweDA3OWQsCisJMHgwN2EwLCAweDA3YTEsIDB4MDdhMiwgMHgwN2EzLCAweDA3YTQsIDB4MDdhNSwgMHgwN2E4LCAweDA3YTksCisJMHgwN2FhLCAweDA3YWIsIDB4MDdhYywgMHgwN2FkLCAweDA3YjAsIDB4MDdiMSwgMHgwN2IyLCAweDA3YjMsCisJMHgwN2I0LCAweDA3YjUsIDB4MDdiOCwgMHgwN2I5LCAweDA3YmEsIDB4MDdiYiwgMHgwN2JiCit9OworCitzdGF0aWMgY29uc3QgdTggcnRsODIyNV9hZ2NbXSA9IHsKKwkweDllLCAweDllLCAweDllLCAweDllLCAweDllLCAweDllLCAweDllLCAweDllLAorCTB4OWQsIDB4OWMsIDB4OWIsIDB4OWEsIDB4OTksIDB4OTgsIDB4OTcsIDB4OTYsCisJMHg5NSwgMHg5NCwgMHg5MywgMHg5MiwgMHg5MSwgMHg5MCwgMHg4ZiwgMHg4ZSwKKwkweDhkLCAweDhjLCAweDhiLCAweDhhLCAweDg5LCAweDg4LCAweDg3LCAweDg2LAorCTB4ODUsIDB4ODQsIDB4ODMsIDB4ODIsIDB4ODEsIDB4ODAsIDB4M2YsIDB4M2UsCisJMHgzZCwgMHgzYywgMHgzYiwgMHgzYSwgMHgzOSwgMHgzOCwgMHgzNywgMHgzNiwKKwkweDM1LCAweDM0LCAweDMzLCAweDMyLCAweDMxLCAweDMwLCAweDJmLCAweDJlLAorCTB4MmQsIDB4MmMsIDB4MmIsIDB4MmEsIDB4MjksIDB4MjgsIDB4MjcsIDB4MjYsCisJMHgyNSwgMHgyNCwgMHgyMywgMHgyMiwgMHgyMSwgMHgyMCwgMHgxZiwgMHgxZSwKKwkweDFkLCAweDFjLCAweDFiLCAweDFhLCAweDE5LCAweDE4LCAweDE3LCAweDE2LAorCTB4MTUsIDB4MTQsIDB4MTMsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MGYsIDB4MGUsCisJMHgwZCwgMHgwYywgMHgwYiwgMHgwYSwgMHgwOSwgMHgwOCwgMHgwNywgMHgwNiwKKwkweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorCTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxCit9OworCitzdGF0aWMgY29uc3QgdTggcnRsODIyNV9nYWluW10gPSB7CisJMHgyMywgMHg4OCwgMHg3YywgMHhhNSwgLyogLTgyZGJtICovCisJMHgyMywgMHg4OCwgMHg3YywgMHhiNSwgLyogLTgyZGJtICovCisJMHgyMywgMHg4OCwgMHg3YywgMHhjNSwgLyogLTgyZGJtICovCisJMHgzMywgMHg4MCwgMHg3OSwgMHhjNSwgLyogLTc4ZGJtICovCisJMHg0MywgMHg3OCwgMHg3NiwgMHhjNSwgLyogLTc0ZGJtICovCisJMHg1MywgMHg2MCwgMHg3MywgMHhjNSwgLyogLTcwZGJtICovCisJMHg2MywgMHg1OCwgMHg3MCwgMHhjNSwgLyogLTY2ZGJtICovCit9OworCitzdGF0aWMgY29uc3QgdTggcnRsODIyNV90aHJlc2hvbGRbXSA9IHsKKwkweDhkLCAweDhkLCAweDhkLCAweDhkLCAweDlkLCAweGFkLCAweGJkCit9OworCitzdGF0aWMgY29uc3QgdTggcnRsODIyNV90eF9nYWluX2Nja19vZmRtW10gPSB7CisJMHgwMiwgMHgwNiwgMHgwZSwgMHgxZSwgMHgzZSwgMHg3ZQorfTsKKworc3RhdGljIGNvbnN0IHU4IHJ0bDgyMjVfdHhfcG93ZXJfY2NrW10gPSB7CisJMHgxOCwgMHgxNywgMHgxNSwgMHgxMSwgMHgwYywgMHgwOCwgMHgwNCwgMHgwMiwKKwkweDFiLCAweDFhLCAweDE3LCAweDEzLCAweDBlLCAweDA5LCAweDA0LCAweDAyLAorCTB4MWYsIDB4MWUsIDB4MWEsIDB4MTUsIDB4MTAsIDB4MGEsIDB4MDUsIDB4MDIsCisJMHgyMiwgMHgyMSwgMHgxZCwgMHgxOCwgMHgxMSwgMHgwYiwgMHgwNiwgMHgwMiwKKwkweDI2LCAweDI1LCAweDIxLCAweDFiLCAweDE0LCAweDBkLCAweDA2LCAweDAzLAorCTB4MmIsIDB4MmEsIDB4MjUsIDB4MWUsIDB4MTYsIDB4MGUsIDB4MDcsIDB4MDMKK307CisKK3N0YXRpYyBjb25zdCB1OCBydGw4MjI1X3R4X3Bvd2VyX2Nja19jaDE0W10gPSB7CisJMHgxOCwgMHgxNywgMHgxNSwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDFiLCAweDFhLCAweDE3LCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MWYsIDB4MWUsIDB4MWEsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgyMiwgMHgyMSwgMHgxZCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDI2LCAweDI1LCAweDIxLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MmIsIDB4MmEsIDB4MjUsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBjb25zdCB1OCBydGw4MjI1X3R4X3Bvd2VyX29mZG1bXSA9IHsKKwkweDgwLCAweDkwLCAweGEyLCAweGI1LCAweGNiLCAweGU0Cit9OworCitzdGF0aWMgY29uc3QgdTMyIHJ0bDgyMjVfY2hhbltdID0geworCTB4MDg1YywgMHgwOGRjLCAweDA5NWMsIDB4MDlkYywgMHgwYTVjLCAweDBhZGMsIDB4MGI1YywKKwkweDBiZGMsIDB4MGM1YywgMHgwY2RjLCAweDBkNWMsIDB4MGRkYywgMHgwZTVjLCAweDBmNzIKK307CisKK3N0YXRpYyB2b2lkIHJ0bDgyMjVfcmZfc2V0X3R4X3Bvd2VyKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl1OCBjY2tfcG93ZXIsIG9mZG1fcG93ZXI7CisJY29uc3QgdTggKnRtcDsKKwl1MzIgcmVnOworCWludCBpOworCisJY2NrX3Bvd2VyID0gcHJpdi0+dHhwb3dlcltjaGFubmVsIC0gMV0gJiAweEZGOworCW9mZG1fcG93ZXIgPSBwcml2LT50eHBvd2VyW2NoYW5uZWwgLSAxXSA+PiA4OworCisJY2NrX3Bvd2VyID0gbWluKGNja19wb3dlciwgKHU4KTM1KTsKKwlvZmRtX3Bvd2VyID0gbWluKG9mZG1fcG93ZXIsICh1OCkzNSk7CisKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPlRYX0dBSU5fQ0NLLAorCQkJIHJ0bDgyMjVfdHhfZ2Fpbl9jY2tfb2ZkbVtjY2tfcG93ZXIgLyA2XSA+PiAxKTsKKworCWlmIChjaGFubmVsID09IDE0KQorCQl0bXAgPSAmcnRsODIyNV90eF9wb3dlcl9jY2tfY2gxNFsoY2NrX3Bvd2VyICUgNikgKiA4XTsKKwllbHNlCisJCXRtcCA9ICZydGw4MjI1X3R4X3Bvd2VyX2Nja1soY2NrX3Bvd2VyICUgNikgKiA4XTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQgKyBpLCAqdG1wKyspOworCisJbWRlbGF5KDEpOyAvKiBGSVhNRTogb3B0aW9uYWw/ICovCisKKwkvKiBhbmFwYXJhbTIgb24gKi8KKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQsIFJUTDgxOFhfRUVQUk9NX0NNRF9DT05GSUcpOworCXJlZyA9IHJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5DT05GSUczKTsKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzMsIHJlZyB8IFJUTDgxOFhfQ09ORklHM19BTkFQQVJBTV9XUklURSk7CisJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgJnByaXYtPm1hcC0+QU5BUEFSQU0yLCBSVEw4MjI1X0FOQVBBUkFNMl9PTik7CisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5DT05GSUczLCByZWcgJiB+UlRMODE4WF9DT05GSUczX0FOQVBBUkFNX1dSSVRFKTsKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQsIFJUTDgxOFhfRUVQUk9NX0NNRF9OT1JNQUwpOworCisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5UWF9HQUlOX09GRE0sCisJCQkgcnRsODIyNV90eF9nYWluX2Nja19vZmRtW29mZG1fcG93ZXIvNl0gPj4gMSk7CisKKwl0bXAgPSAmcnRsODIyNV90eF9wb3dlcl9vZmRtW29mZG1fcG93ZXIgJSA2XTsKKworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCA1LCAqdG1wKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgNywgKnRtcCk7CisKKwltZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgyMjVfcmZfaW5pdChzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCXJ0bDgxOHhfc2V0X2FuYXBhcmFtKHByaXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworCisJLyogaG9zdF9wY2lfaW5pdCAqLworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc091dHB1dCwgMHgwNDgwKTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNFbmFibGUsIDB4MUZGRik7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zU2VsZWN0LCAweDA0ODgpOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+R1BfRU5BQkxFLCAwKTsKKwlydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCk7CisJbWRlbGF5KDIwMCk7CS8qIEZJWE1FOiBlaGg/PyAqLworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+R1BfRU5BQkxFLCAweEZGICYgfigxIDw8IDYpKTsKKworCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPlJGX1RJTUlORywgMHgwMDBhODAwOCk7CisKKwkvKiBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHJlYWxseSB0byBjaGFuZ2UgQlJTUiB0byBkbyBSRiBjb25maWcgKi8KKwlydGw4MTh4X2lvcmVhZDE2KHByaXYsICZwcml2LT5tYXAtPkJSU1IpOworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPkJSU1IsIDB4RkZGRik7CisJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgJnByaXYtPm1hcC0+UkZfUEFSQSwgMHgwMDEwMDA0NCk7CisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01ELCBSVEw4MThYX0VFUFJPTV9DTURfQ09ORklHKTsKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzMsIDB4NDQpOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCwgUlRMODE4WF9FRVBST01fQ01EX05PUk1BTCk7CisKKwlydGw4MjI1X3dyaXRlKGRldiwgMHgwLCAweDA2Nyk7CisJcnRsODIyNV93cml0ZShkZXYsIDB4MSwgMHhGRTApOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDIsIDB4NDREKTsKKwlydGw4MjI1X3dyaXRlKGRldiwgMHgzLCAweDQ0MSk7CisJcnRsODIyNV93cml0ZShkZXYsIDB4NCwgMHg4QkUpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDUsIDB4QkYwKTsJCS8qIFRPRE86IG1pbmlwY2kgKi8KKwlydGw4MjI1X3dyaXRlKGRldiwgMHg2LCAweEFFNik7CisJcnRsODIyNV93cml0ZShkZXYsIDB4NywgcnRsODIyNV9jaGFuWzBdKTsKKwlydGw4MjI1X3dyaXRlKGRldiwgMHg4LCAweDAxRik7CisJcnRsODIyNV93cml0ZShkZXYsIDB4OSwgMHgzMzQpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweEEsIDB4RkQ0KTsKKwlydGw4MjI1X3dyaXRlKGRldiwgMHhCLCAweDM5MSk7CisJcnRsODIyNV93cml0ZShkZXYsIDB4QywgMHgwNTApOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweEQsIDB4NkRCKTsKKwlydGw4MjI1X3dyaXRlKGRldiwgMHhFLCAweDAyOSk7CisJcnRsODIyNV93cml0ZShkZXYsIDB4RiwgMHg5MTQpOyBtZGVsYXkoMSk7CisKKwlydGw4MjI1X3dyaXRlKGRldiwgMHgyLCAweEM0RCk7IG1kZWxheSgxMDApOworCisJcnRsODIyNV93cml0ZShkZXYsIDB4MCwgMHgxMjcpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocnRsODIyNWJjZF9yeGdhaW4pOyBpKyspIHsKKwkJcnRsODIyNV93cml0ZShkZXYsIDB4MSwgaSArIDEpOworCQlydGw4MjI1X3dyaXRlKGRldiwgMHgyLCBydGw4MjI1YmNkX3J4Z2FpbltpXSk7CisJfQorCisJcnRsODIyNV93cml0ZShkZXYsIDB4MCwgMHgwMjcpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDAsIDB4MjJGKTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNFbmFibGUsIDB4MUZGRik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShydGw4MjI1X2FnYyk7IGkrKykgeworCQlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHhCLCBydGw4MjI1X2FnY1tpXSk7CisJCW1kZWxheSgxKTsKKwkJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4QSwgMHg4MCArIGkpOworCQltZGVsYXkoMSk7CisJfQorCisJbWRlbGF5KDEpOworCisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDAsIDB4MDEpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDEsIDB4MDIpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDIsIDB4NjIpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDMsIDB4MDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDQsIDB4MDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4MDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDYsIDB4MDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDcsIDB4MDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDgsIDB4MDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MDksIDB4ZmUpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MGEsIDB4MDkpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MGIsIDB4ODApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MGMsIDB4MDEpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MGUsIDB4ZDMpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MGYsIDB4MzgpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTAsIDB4ODQpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4MDMpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTIsIDB4MjApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTMsIDB4MjApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTQsIDB4MDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIDB4NDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTYsIDB4MDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTksIDB4MTkpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MWEsIDB4MjApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIDB4NzYpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MWMsIDB4MDQpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MWUsIDB4OTUpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MWYsIDB4NzUpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjAsIDB4MWYpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MjcpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjIsIDB4MTYpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4NDYpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjUsIDB4MjApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4OTApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4ODgpOyBtZGVsYXkoMSk7CisKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDAwLCAweDk4KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MDMsIDB4MjApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHgwNCwgMHg3ZSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDA1LCAweDEyKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MDYsIDB4ZmMpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHgwNywgMHg3OCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDA4LCAweDJlKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg4OCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDEyLCAweDQ3KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4ZDApOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MTksIDB4MDApOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MWEsIDB4YTApOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MWIsIDB4MDgpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NDAsIDB4ODYpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OGQpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHg0MiwgMHgxNSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDQzLCAweDE4KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQsIDB4MWYpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHg0NSwgMHgxZSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDQ2LCAweDFhKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NDcsIDB4MTUpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHg0OCwgMHgxMCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDQ5LCAweDBhKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NGEsIDB4MDUpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHg0YiwgMHgwMik7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDRjLCAweDA1KTsgbWRlbGF5KDEpOworCisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5URVNUUiwgMHgwRCk7IG1kZWxheSgxKTsKKworCXJ0bDgyMjVfcmZfc2V0X3R4X3Bvd2VyKGRldiwgMSk7CisKKwkvKiBSWCBhbnRlbm5hIGRlZmF1bHQgdG8gQSAqLworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OWIpOyBtZGVsYXkoMSk7CS8qIEI6IDB4REIgKi8KKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgyNiwgMHg5MCk7IG1kZWxheSgxKTsJLyogQjogMHgxMCAqLworCisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5UWF9BTlRFTk5BLCAweDAzKTsJLyogQjogMHgwMCAqLworCW1kZWxheSgxKTsKKwlydGw4MTh4X2lvd3JpdGUzMihwcml2LCAodTMyICopKCh1OCAqKXByaXYtPm1hcCArIDB4OTQpLCAweDE1YzAwMDAyKTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNFbmFibGUsIDB4MUZGRik7CisKKwlydGw4MjI1X3dyaXRlKGRldiwgMHgwYywgMHg1MCk7CisJLyogc2V0IE9GRE0gaW5pdGlhbCBnYWluICovCisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIHJ0bDgyMjVfZ2Fpbls0ICogNF0pOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDIzLCBydGw4MjI1X2dhaW5bNCAqIDQgKyAxXSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyMjVfZ2Fpbls0ICogNCArIDJdKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgcnRsODIyNV9nYWluWzQgKiA0ICsgM10pOworCS8qIHNldCBDQ0sgdGhyZXNob2xkICovCisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgcnRsODIyNV90aHJlc2hvbGRbMF0pOworfQorCitzdGF0aWMgY29uc3QgdTggcnRsODIyNXoyX3R4X3Bvd2VyX2Nja19jaDE0W10gPSB7CisJMHgzNiwgMHgzNSwgMHgyZSwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGNvbnN0IHU4IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2tfQltdID0geworCTB4MzAsIDB4MmYsIDB4MjksIDB4MjEsIDB4MTksIDB4MTAsIDB4MDgsIDB4MDQKK307CisKK3N0YXRpYyBjb25zdCB1OCBydGw4MjI1ejJfdHhfcG93ZXJfY2NrX0FbXSA9IHsKKwkweDMzLCAweDMyLCAweDJiLCAweDIzLCAweDFhLCAweDExLCAweDA4LCAweDA0Cit9OworCitzdGF0aWMgY29uc3QgdTggcnRsODIyNXoyX3R4X3Bvd2VyX2Nja1tdID0geworCTB4MzYsIDB4MzUsIDB4MmUsIDB4MjUsIDB4MWMsIDB4MTIsIDB4MDksIDB4MDQKK307CisKK3N0YXRpYyB2b2lkIHJ0bDgyMjV6Ml9yZl9zZXRfdHhfcG93ZXIoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXU4IGNja19wb3dlciwgb2ZkbV9wb3dlcjsKKwljb25zdCB1OCAqdG1wOworCWludCBpOworCisJY2NrX3Bvd2VyID0gcHJpdi0+dHhwb3dlcltjaGFubmVsIC0gMV0gJiAweEZGOworCW9mZG1fcG93ZXIgPSBwcml2LT50eHBvd2VyW2NoYW5uZWwgLSAxXSA+PiA4OworCisJaWYgKGNoYW5uZWwgPT0gMTQpCisJCXRtcCA9IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2tfY2gxNDsKKwllbHNlIGlmIChjY2tfcG93ZXIgPT0gMTIpCisJCXRtcCA9IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2tfQjsKKwllbHNlIGlmIChjY2tfcG93ZXIgPT0gMTMpCisJCXRtcCA9IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2tfQTsKKwllbHNlCisJCXRtcCA9IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2s7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDQ0ICsgaSwgKnRtcCsrKTsKKworCWNja19wb3dlciA9IG1pbihjY2tfcG93ZXIsICh1OCkzNSk7CisJaWYgKGNja19wb3dlciA9PSAxMyB8fCBjY2tfcG93ZXIgPT0gMTQpCisJCWNja19wb3dlciA9IDEyOworCWlmIChjY2tfcG93ZXIgPj0gMTUpCisJCWNja19wb3dlciAtPSAyOworCisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5UWF9HQUlOX0NDSywgY2NrX3Bvd2VyKTsKKwlydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+VFhfR0FJTl9DQ0spOworCW1kZWxheSgxKTsKKworCW9mZG1fcG93ZXIgPSBtaW4ob2ZkbV9wb3dlciwgKHU4KTM1KTsKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPlRYX0dBSU5fT0ZETSwgb2ZkbV9wb3dlcik7CisKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMiwgMHg2Mik7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDUsIDB4MDApOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCA2LCAweDQwKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgNywgMHgwMCk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDgsIDB4NDApOworCisJbWRlbGF5KDEpOworfQorCitzdGF0aWMgY29uc3QgdTE2IHJ0bDgyMjV6Ml9yeGdhaW5bXSA9IHsKKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDgsIDB4MDAwOSwKKwkweDAwMGEsIDB4MDAwYiwgMHgwMTAyLCAweDAxMDMsIDB4MDEwNCwgMHgwMTA1LCAweDAxNDAsIDB4MDE0MSwKKwkweDAxNDIsIDB4MDE0MywgMHgwMTQ0LCAweDAxNDUsIDB4MDE4MCwgMHgwMTgxLCAweDAxODIsIDB4MDE4MywKKwkweDAxODQsIDB4MDE4NSwgMHgwMTg4LCAweDAxODksIDB4MDE4YSwgMHgwMThiLCAweDAyNDMsIDB4MDI0NCwKKwkweDAyNDUsIDB4MDI4MCwgMHgwMjgxLCAweDAyODIsIDB4MDI4MywgMHgwMjg0LCAweDAyODUsIDB4MDI4OCwKKwkweDAyODksIDB4MDI4YSwgMHgwMjhiLCAweDAyOGMsIDB4MDM0MiwgMHgwMzQzLCAweDAzNDQsIDB4MDM0NSwKKwkweDAzODAsIDB4MDM4MSwgMHgwMzgyLCAweDAzODMsIDB4MDM4NCwgMHgwMzg1LCAweDAzODgsIDB4MDM4OSwKKwkweDAzOGEsIDB4MDM4YiwgMHgwMzhjLCAweDAzOGQsIDB4MDM5MCwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywKKwkweDAzOTQsIDB4MDM5NSwgMHgwMzk4LCAweDAzOTksIDB4MDM5YSwgMHgwMzliLCAweDAzOWMsIDB4MDM5ZCwKKwkweDAzYTAsIDB4MDNhMSwgMHgwM2EyLCAweDAzYTMsIDB4MDNhNCwgMHgwM2E1LCAweDAzYTgsIDB4MDNhOSwKKwkweDAzYWEsIDB4MDNhYiwgMHgwM2FjLCAweDAzYWQsIDB4MDNiMCwgMHgwM2IxLCAweDAzYjIsIDB4MDNiMywKKwkweDAzYjQsIDB4MDNiNSwgMHgwM2I4LCAweDAzYjksIDB4MDNiYSwgMHgwM2JiLCAweDAzYmIKK307CisKK3N0YXRpYyB2b2lkIHJ0bDgyMjV6Ml9yZl9pbml0KHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCWludCBpOworCisJcnRsODE4eF9zZXRfYW5hcGFyYW0ocHJpdiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisKKwkvKiBob3N0X3BjaV9pbml0ICovCisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LCAweDA0ODApOworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc0VuYWJsZSwgMHgxRkZGKTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNTZWxlY3QsIDB4MDQ4OCk7CisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5HUF9FTkFCTEUsIDApOworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwltZGVsYXkoMjAwKTsJLyogRklYTUU6IGVoaD8/ICovCisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5HUF9FTkFCTEUsIDB4RkYgJiB+KDEgPDwgNikpOworCisJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgJnByaXYtPm1hcC0+UkZfVElNSU5HLCAweDAwMDg4MDA4KTsKKworCS8qIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgcmVhbGx5IHRvIGNoYW5nZSBCUlNSIHRvIGRvIFJGIGNvbmZpZyAqLworCXJ0bDgxOHhfaW9yZWFkMTYocHJpdiwgJnByaXYtPm1hcC0+QlJTUik7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+QlJTUiwgMHhGRkZGKTsKKwlydGw4MTh4X2lvd3JpdGUzMihwcml2LCAmcHJpdi0+bWFwLT5SRl9QQVJBLCAweDAwMTAwMDQ0KTsKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQsIFJUTDgxOFhfRUVQUk9NX0NNRF9DT05GSUcpOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+Q09ORklHMywgMHg0NCk7CisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01ELCBSVEw4MThYX0VFUFJPTV9DTURfTk9STUFMKTsKKworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc0VuYWJsZSwgMHgxRkZGKTsKKworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDAsIDB4MEI3KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDEsIDB4RUUwKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDIsIDB4NDREKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDMsIDB4NDQxKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDQsIDB4OEMzKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDUsIDB4QzcyKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDYsIDB4MEU2KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDcsIDB4ODJBKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDgsIDB4MDNGKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDksIDB4MzM1KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweGEsIDB4OUQ0KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweGIsIDB4N0JCKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweGMsIDB4ODUwKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweGQsIDB4Q0RGKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweGUsIDB4MDJCKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweGYsIDB4MTE0KTsgbWRlbGF5KDEwMCk7CisKKwlpZiAoIShydGw4MjI1X3JlYWQoZGV2LCA2KSAmICgxIDw8IDcpKSkgeworCQlydGw4MjI1X3dyaXRlKGRldiwgMHgwMiwgMHgwQzREKTsKKwkJbWRlbGF5KDIwMCk7CisJCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDAyLCAweDA0NEQpOworCQltZGVsYXkoMTAwKTsKKwkJLyogVE9ETzogcmVhZGQgY2FsaWJyYXRpb24gZmFpbHVyZSBtZXNzYWdlIHdoZW4gdGhlIGNhbGlicmF0aW9uCisJCSAgIGNoZWNrIHdvcmtzICovCisJfQorCisJcnRsODIyNV93cml0ZShkZXYsIDB4MCwgMHgxQjcpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDMsIDB4MDAyKTsKKwlydGw4MjI1X3dyaXRlKGRldiwgMHg1LCAweDAwNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShydGw4MjI1ejJfcnhnYWluKTsgaSsrKSB7CisJCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDEsIGkgKyAxKTsKKwkJcnRsODIyNV93cml0ZShkZXYsIDB4MiwgcnRsODIyNXoyX3J4Z2FpbltpXSk7CisJfQorCisJcnRsODIyNV93cml0ZShkZXYsIDB4MCwgMHgwQjcpOyBtZGVsYXkoMTAwKTsKKwlydGw4MjI1X3dyaXRlKGRldiwgMHgyLCAweEM0RCk7CisKKwltZGVsYXkoMjAwKTsKKwlydGw4MjI1X3dyaXRlKGRldiwgMHgyLCAweDQ0RCk7CisJbWRlbGF5KDEwMCk7CisKKwlydGw4MjI1X3dyaXRlKGRldiwgMHgwMCwgMHgyQkYpOworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweEZGLCAweEZGRkYpOworCisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zRW5hYmxlLCAweDFGRkYpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocnRsODIyNV9hZ2MpOyBpKyspIHsKKwkJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4QiwgcnRsODIyNV9hZ2NbaV0pOworCQltZGVsYXkoMSk7CisJCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweEEsIDB4ODAgKyBpKTsKKwkJbWRlbGF5KDEpOworCX0KKworCW1kZWxheSgxKTsKKworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDAwLCAweDAxKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDAxLCAweDAyKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDAyLCAweDYyKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDAzLCAweDAwKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDA0LCAweDAwKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweDAwKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDA2LCAweDQwKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDA3LCAweDAwKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDA4LCAweDQwKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDA5LCAweGZlKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDBhLCAweDA5KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDBiLCAweDgwKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDBjLCAweDAxKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDQzKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgwZSwgMHhkMyk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgwZiwgMHgzOCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxMCwgMHg4NCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHgwNik7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxMiwgMHgyMCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxMywgMHgyMCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxNCwgMHgwMCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxNiwgMHgwMCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxOSwgMHgxOSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxYSwgMHgyMCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgMHgxMSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxYywgMHgwNCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgMHhjNSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxZSwgMHhiMyk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxZiwgMHg3NSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgyMCwgMHgxZik7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgyNyk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgyMiwgMHgxNik7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgMHg4MCk7IG1kZWxheSgxKTsgLyogRklYTUU6IG5vdCBuZWVkZWQ/ICovCisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4NDYpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjUsIDB4MjApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4OTApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4ODgpOyBtZGVsYXkoMSk7CisKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDAwLCAweDk4KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MDMsIDB4MjApOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHgwNCwgMHg3ZSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDA1LCAweDEyKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MDYsIDB4ZmMpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHgwNywgMHg3OCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDA4LCAweDJlKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg4OCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDEyLCAweDQ3KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4ZDApOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MTksIDB4MDApOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MWEsIDB4YTApOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4MWIsIDB4MDgpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NDAsIDB4ODYpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OGEpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHg0MiwgMHgxNSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDQzLCAweDE4KTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQsIDB4MzYpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHg0NSwgMHgzNSk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDQ2LCAweDJlKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NDcsIDB4MjUpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHg0OCwgMHgxYyk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDQ5LCAweDEyKTsgbWRlbGF5KDEpOworCXJ0bDgyMjVfd3JpdGVfcGh5X2NjayhkZXYsIDB4NGEsIDB4MDkpOyBtZGVsYXkoMSk7CisJcnRsODIyNV93cml0ZV9waHlfY2NrKGRldiwgMHg0YiwgMHgwNCk7IG1kZWxheSgxKTsKKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDRjLCAweDA1KTsgbWRlbGF5KDEpOworCisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAodTggKilwcml2LT5tYXAgKyAweDVCLCAweDBEKTsgbWRlbGF5KDEpOworCisJcnRsODIyNXoyX3JmX3NldF90eF9wb3dlcihkZXYsIDEpOworCisJLyogUlggYW50ZW5uYSBkZWZhdWx0IHRvIEEgKi8KKwlydGw4MjI1X3dyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweDliKTsgbWRlbGF5KDEpOwkvKiBCOiAweERCICovCisJcnRsODIyNV93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4OTApOyBtZGVsYXkoMSk7CS8qIEI6IDB4MTAgKi8KKworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+VFhfQU5URU5OQSwgMHgwMyk7CS8qIEI6IDB4MDAgKi8KKwltZGVsYXkoMSk7CisJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgKHUzMiAqKSgodTggKilwcml2LT5tYXAgKyAweDk0KSwgMHgxNWMwMDAwMik7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zRW5hYmxlLCAweDFGRkYpOworfQorCitzdGF0aWMgdm9pZCBydGw4MjI1eF9yZl9pbml0KHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXUxNiByZWc4LCByZWc5OworCisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LCAweDA0ODApOworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPlJGUGluc1NlbGVjdCwgMHgwNDg4KTsKKwlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5SRlBpbnNFbmFibGUsIDB4MUZGRik7CisJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQpOworCW1kZWxheSgxMDApOworCisJcnRsODIyNV93cml0ZShkZXYsIDAsIDB4MUI3KTsKKworCXJlZzggPSBydGw4MjI1X3JlYWQoZGV2LCA4KTsKKwlyZWc5ID0gcnRsODIyNV9yZWFkKGRldiwgOSk7CisKKwlydGw4MjI1X3dyaXRlKGRldiwgMCwgMHgwQjcpOworCisJaWYgKHJlZzggIT0gMHg1ODggfHwgcmVnOSAhPSAweDcwMCkgeworCQlwcml2LT5yZl9mbGFnID0gMDsKKwkJcnRsODIyNV9yZl9pbml0KGRldik7CisJfSBlbHNlIHsKKwkJcHJpdi0+cmZfZmxhZyA9IDE7CisJCXJ0bDgyMjV6Ml9yZl9pbml0KGRldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBydGw4MjI1X3JmX3N0b3Aoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJdTggcmVnOworCisJcnRsODIyNV93cml0ZShkZXYsIDB4NCwgMHgxZik7IG1kZWxheSgxKTsKKworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCwgUlRMODE4WF9FRVBST01fQ01EX0NPTkZJRyk7CisJcmVnID0gcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzMpOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+Q09ORklHMywgcmVnIHwgUlRMODE4WF9DT05GSUczX0FOQVBBUkFNX1dSSVRFKTsKKwlydGw4MTh4X2lvd3JpdGUzMihwcml2LCAmcHJpdi0+bWFwLT5BTkFQQVJBTTIsIFJUTDgyMjVfQU5BUEFSQU0yX09GRik7CisJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgJnByaXYtPm1hcC0+QU5BUEFSQU0sIFJUTDgyMjVfQU5BUEFSQU1fT0ZGKTsKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzMsIHJlZyAmIH5SVEw4MThYX0NPTkZJRzNfQU5BUEFSQU1fV1JJVEUpOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCwgUlRMODE4WF9FRVBST01fQ01EX05PUk1BTCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgyMjVfcmZfc2V0X2NoYW5uZWwoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFubmVscCkKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCWludCBjaGFuID0gY2hhbm5lbHAtPmNoYW5uZWxfbnI7CisKKwlpZiAocHJpdi0+cmZfZmxhZykKKwkJcnRsODIyNXoyX3JmX3NldF90eF9wb3dlcihkZXYsIGNoYW4pOworCWVsc2UKKwkJcnRsODIyNV9yZl9zZXRfdHhfcG93ZXIoZGV2LCBjaGFuKTsKKworCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaGFuIC0gMV0pOworCW1kZWxheSgxMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgyMjVfcmZfY29uZl9lcnAoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwlpZiAoZGV2LT5waHlfZmxhZ3MgJiBORVQ4MDIxMV9QSFlfVVNFX1NIT1JUX1NMT1QpIHsKKwkJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5TTE9ULCAweDkpOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPlNJRlMsIDB4MjIpOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkRJRlMsIDB4MTQpOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkVJRlMsIDgxKTsKKwkJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5DV19WQUwsIDB4NzMpOworCX0gZWxzZSB7CisJCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+U0xPVCwgMHgxNCk7CisJCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+U0lGUywgMHg0NCk7CisJCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RElGUywgMHgyNCk7CisJCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RUlGUywgODEpOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNXX1ZBTCwgMHhhNSk7CisJfQorfQorCitzdHJ1Y3QgcnRsODE4eF9yZl9vcHMgcnRsODIyNV9vcHMgX19ydGw4MTh4X3JmX2RyaXZlciA9IHsKKwkubmFtZQkJPSAicnRsODIyNSIsCisJLmlkCQk9IDksCisJLmluaXQJCT0gcnRsODIyNXhfcmZfaW5pdCwKKwkuc3RvcAkJPSBydGw4MjI1X3JmX3N0b3AsCisJLnNldF9jaGFuCT0gcnRsODIyNV9yZl9zZXRfY2hhbm5lbCwKKwkuY29uZl9lcnAJPSBydGw4MjI1X3JmX2NvbmZfZXJwLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxOHgvcnRsODE4eC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODE4eC9ydGw4MTh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3Y2E0OAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxOHgvcnRsODE4eC5jCkBAIC0wLDAgKzEsODU1IEBACisKKy8qCisgKiBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciBSVEw4MTgwIC8gUlRMODE4NQorICoKKyAqIENvcHlyaWdodCAyMDA3IE1pY2hhZWwgV3UgPGZsYW1pbmdpY2VAc291cm1pbGsubmV0PgorICogQ29weXJpZ2h0IDIwMDcgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIE1vZGlmaWVkIGZvciBnUFhFLCBKdW5lIDIwMDksIGJ5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+CisgKgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICoKKyAqIFRoYW5rcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0IQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworRklMRV9MSUNFTkNFKEdQTDJfT05MWSk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGdweGUvbmV0ODAyMTEuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvdGhyZWV3aXJlLmg+CisKKyNpbmNsdWRlICJydGw4MTh4LmgiCisKKy8qIHJ0bDgxOHhfcmF0ZXNbaHcgcmF0ZSBudW1iZXJdID0gcmF0ZSBpbiAxMDBrYnBzIHVuaXRzICovCitzdGF0aWMgY29uc3QgdTE2IHJ0bDgxOHhfcmF0ZXNbXSA9IHsKKwkxMCwgMjAsIDU1LCAxMTAsIC8qIDgwMi4xMWIgKi8KKwk2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIC8qIDgwMi4xMWcgKi8KKwkwLCAwLCAwLCAwLAkJLyogaW5kZXggc2FmZWx5IHVzaW5nIGEgdmFsdWUgbWFza2VkIHdpdGggMHhGICovCit9OworI2RlZmluZSBSVEw4MThYX05SX0JfUkFURVMgIDQKKyNkZWZpbmUgUlRMODE4WF9OUl9SQVRFUyAgICAxMgorCisvKiB1c2VkIGJ5IFJGIGRyaXZlcnMgKi8KK3ZvaWQgcnRsODE4eF93cml0ZV9waHkoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCB1OCBhZGRyLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCWludCBpID0gMTA7CisJdTMyIGJ1ZjsKKworCWJ1ZiA9IChkYXRhIDw8IDgpIHwgYWRkcjsKKworCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICh1MzIgKikmcHJpdi0+bWFwLT5QSFlbMF0sIGJ1ZiB8IDB4ODApOworCXdoaWxlIChpLS0pIHsKKwkJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgKHUzMiAqKSZwcml2LT5tYXAtPlBIWVswXSwgYnVmKTsKKwkJaWYgKHJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5QSFlbMl0pID09IChkYXRhICYgMHhGRikpCisJCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCBydGw4MTh4X2hhbmRsZV9yeChzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBSVEw4MThYX1JYX1JJTkdfU0laRTsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCXN0cnVjdCBydGw4MTh4X3J4X2Rlc2MgKmVudHJ5ID0gJnByaXYtPnJ4X3JpbmdbcHJpdi0+cnhfaWR4XTsKKwkJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gcHJpdi0+cnhfYnVmW3ByaXYtPnJ4X2lkeF07CisJCXUzMiBmbGFncyA9IGxlMzJfdG9fY3B1KGVudHJ5LT5mbGFncyk7CisKKwkJaWYgKGZsYWdzICYgUlRMODE4WF9SWF9ERVNDX0ZMQUdfT1dOKQorCQkJcmV0dXJuOworCisJCWlmIChmbGFncyAmIChSVEw4MThYX1JYX0RFU0NfRkxBR19ETUFfRkFJTCB8CisJCQkgICAgIFJUTDgxOFhfUlhfREVTQ19GTEFHX0ZPRiB8CisJCQkgICAgIFJUTDgxOFhfUlhfREVTQ19GTEFHX1JYX0VSUikpIHsKKwkJCS8qIFRoaXMgaXMgY3JhcHB5IGhhcmR3YXJlLiBUaGUgTGludXggZHJpdmVyCisJCQkgICBkb2Vzbid0IGV2ZW4gbG9nIHRoZXNlLiAqLworCQkJZ290byBkb25lOworCQl9IGVsc2UgaWYgKGZsYWdzICYgUlRMODE4WF9SWF9ERVNDX0ZMQUdfQ1JDMzJfRVJSKSB7CisJCQkvKiBUaGlzIGlzIGFjdHVhbGx5IGEgY29ycnVwdCBwYWNrZXQuICovCisJCQlEQkcyKCJydGw4MTh4IFJYOiVkIENSQyBmYWlsOiBmbGFncyAlMDh4XG4iLAorCQkJICAgICBwcml2LT5yeF9pZHgsIGZsYWdzKTsKKwkJCW5ldDgwMjExX3J4X2VycihkZXYsIE5VTEwsIEVJTyk7CisJCX0gZWxzZSB7CisJCQl1MzIgZmxhZ3MyID0gbGUzMl90b19jcHUoZW50cnktPmZsYWdzMik7CisJCQlzdHJ1Y3QgaW9fYnVmZmVyICpuZXdfaW9iID0gYWxsb2NfaW9iKE1BWF9SWF9TSVpFKTsKKwkJCWlmICghbmV3X2lvYikgeworCQkJCW5ldDgwMjExX3J4X2VycihkZXYsIE5VTEwsIEVOT01FTSk7CisJCQkJZ290byBkb25lOworCQkJfQorCisJCQlEQkdQKCJydGw4MTh4IFJYOiVkIHN1Y2Nlc3M6IGZsYWdzICUwOHggJTA4eFxuIiwKKwkJCSAgICAgcHJpdi0+cnhfaWR4LCBmbGFncywgZmxhZ3MyKTsKKworCQkJaW9iX3B1dChpb2IsIGZsYWdzICYgMHhGRkYpOworCisJCQluZXQ4MDIxMV9yeChkZXYsIGlvYiwgKGZsYWdzMiA+PiA4KSAmIDB4N2YsCisJCQkJICAgIHJ0bDgxOHhfcmF0ZXNbKGZsYWdzID4+IDIwKSAmIDB4Zl0pOworCisJCQlpb2IgPSBuZXdfaW9iOworCQkJcHJpdi0+cnhfYnVmW3ByaXYtPnJ4X2lkeF0gPSBpb2I7CisJCX0KKworCWRvbmU6CisJCWVudHJ5LT5yeF9idWYgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhpb2ItPmRhdGEpKTsKKwkJZW50cnktPmZsYWdzID0gY3B1X3RvX2xlMzIoUlRMODE4WF9SWF9ERVNDX0ZMQUdfT1dOIHwgTUFYX1JYX1NJWkUpOworCisJCWlmIChwcml2LT5yeF9pZHggPT0gUlRMODE4WF9SWF9SSU5HX1NJWkUgLSAxKQorCQkJZW50cnktPmZsYWdzIHw9IGNwdV90b19sZTMyKFJUTDgxOFhfUlhfREVTQ19GTEFHX0VPUik7CisKKwkJcHJpdi0+cnhfaWR4ID0gKHByaXYtPnJ4X2lkeCArIDEpICUgUlRMODE4WF9SWF9SSU5HX1NJWkU7CisJfQorfQorCitzdGF0aWMgdm9pZCBydGw4MTh4X2hhbmRsZV90eChzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBSVEw4MThYX1RYX1JJTkdfU0laRTsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCXN0cnVjdCBydGw4MTh4X3R4X2Rlc2MgKmVudHJ5ID0gJnByaXYtPnR4X3JpbmdbcHJpdi0+dHhfY29uc107CisJCXN0cnVjdCBpb19idWZmZXIgKmlvYiA9IHByaXYtPnR4X2J1Zltwcml2LT50eF9jb25zXTsKKwkJdTMyIGZsYWdzID0gbGUzMl90b19jcHUoZW50cnktPmZsYWdzKTsKKwkJaW50IHJjOworCisJCWlmICgoZmxhZ3MgJiBSVEw4MThYX1RYX0RFU0NfRkxBR19PV04pIHx8ICFpb2IpCisJCQlyZXR1cm47CisKKwkJcmMgPSAwOworCQlpZiAoIShmbGFncyAmIFJUTDgxOFhfVFhfREVTQ19GTEFHX1RYX09LKSkgeworCQkJLyogb3VyIHBhY2tldCB3YXMgbm90IEFDS2VkIHByb3Blcmx5ICovCisJCQlyYyA9IEVJTzsKKwkJfQorCisJCW5ldDgwMjExX3R4X2NvbXBsZXRlKGRldiwgaW9iLCBmbGFncyAmIDB4RkYsIHJjKTsKKworCQlwcml2LT50eF9idWZbcHJpdi0+dHhfY29uc10gPSBOVUxMOworCQlwcml2LT50eF9jb25zID0gKHByaXYtPnR4X2NvbnMgKyAxKSAlIFJUTDgxOFhfVFhfUklOR19TSVpFOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsODE4eF9wb2xsKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXUxNiByZWcgPSBydGw4MTh4X2lvcmVhZDE2KHByaXYsICZwcml2LT5tYXAtPklOVF9TVEFUVVMpOworCisJaWYgKHJlZyA9PSAweEZGRkYpCisJCXJldHVybjsKKworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPklOVF9TVEFUVVMsIHJlZyk7CisKKwlpZiAocmVnICYgKFJUTDgxOFhfSU5UX1RYTl9PSyB8IFJUTDgxOFhfSU5UX1RYTl9FUlIpKQorCQlydGw4MTh4X2hhbmRsZV90eChkZXYpOworCisJaWYgKHJlZyAmIChSVEw4MThYX0lOVF9SWF9PSyB8IFJUTDgxOFhfSU5UX1JYX0VSUikpCisJCXJ0bDgxOHhfaGFuZGxlX3J4KGRldik7Cit9CisKKyNkZWZpbmUgRElWX1JPVU5EX1VQKG4sZCkgKCgobikrKGQpLTEpLyhkKSkKKworc3RhdGljIGludCBydGw4MTh4X3R4KHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgc3RydWN0IGlvX2J1ZmZlciAqaW9iKQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IHJ0bDgxOHhfdHhfZGVzYyAqZW50cnk7CisJdTMyIHR4X2ZsYWdzOworCXUxNiBwbGNwX2xlbiA9IDA7CisJaW50IGxlbiA9IGlvYl9sZW4oaW9iKTsKKworCXR4X2ZsYWdzID0gUlRMODE4WF9UWF9ERVNDX0ZMQUdfT1dOIHwgUlRMODE4WF9UWF9ERVNDX0ZMQUdfRlMgfAorCQlSVEw4MThYX1RYX0RFU0NfRkxBR19MUyB8IChwcml2LT5od19yYXRlIDw8IDI0KSB8IGxlbjsKKworCWlmIChwcml2LT5yODE4NSkgeworCQl0eF9mbGFncyB8PSBSVEw4MThYX1RYX0RFU0NfRkxBR19ETUEgfAorCQkJICAgIFJUTDgxOFhfVFhfREVTQ19GTEFHX05PX0VOQzsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgcmVtYWluZGVyOworCisJCXBsY3BfbGVuID0gRElWX1JPVU5EX1VQKDE2ICogKGxlbiArIDQpLAorCQkJCQkoZGV2LT5yYXRlc1tkZXYtPnJhdGVdICogMikgLyAxMCk7CisJCXJlbWFpbmRlciA9ICgxNiAqIChsZW4gKyA0KSkgJQorCQkJICAgICgoZGV2LT5yYXRlc1tkZXYtPnJhdGVdICogMikgLyAxMCk7CisKKwkJaWYgKHJlbWFpbmRlciA+IDAgJiYgcmVtYWluZGVyIDw9IDYpCisJCQlwbGNwX2xlbiB8PSAxIDw8IDE1OworCX0KKworCWVudHJ5ID0gJnByaXYtPnR4X3JpbmdbcHJpdi0+dHhfcHJvZF07CisKKwlpZiAoZGV2LT5waHlfZmxhZ3MgJiBORVQ4MDIxMV9QSFlfVVNFX1BST1RFQ1RJT04pIHsKKwkJdHhfZmxhZ3MgfD0gUlRMODE4WF9UWF9ERVNDX0ZMQUdfQ1RTOworCQl0eF9mbGFncyB8PSBwcml2LT5od19ydHNjdHNfcmF0ZSA8PCAxOTsKKwkJZW50cnktPnJ0c19kdXJhdGlvbiA9IG5ldDgwMjExX2N0c19kdXJhdGlvbihkZXYsIGxlbik7CisJfSBlbHNlIHsKKwkJZW50cnktPnJ0c19kdXJhdGlvbiA9IDA7CisJfQorCisJaWYgKGVudHJ5LT5mbGFncyAmIFJUTDgxOFhfVFhfREVTQ19GTEFHX09XTikgeworCQkvKiBjYXJkIGhhc24ndCBwcm9jZXNzZWQgdGhlIG9sZCBwYWNrZXQgeWV0ISAqLworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXByaXYtPnR4X2J1Zltwcml2LT50eF9wcm9kXSA9IGlvYjsKKwlwcml2LT50eF9wcm9kID0gKHByaXYtPnR4X3Byb2QgKyAxKSAlIFJUTDgxOFhfVFhfUklOR19TSVpFOworCisJZW50cnktPnBsY3BfbGVuID0gY3B1X3RvX2xlMTYocGxjcF9sZW4pOworCWVudHJ5LT50eF9idWYgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhpb2ItPmRhdGEpKTsKKwllbnRyeS0+ZnJhbWVfbGVuID0gY3B1X3RvX2xlMzIobGVuKTsKKwllbnRyeS0+ZmxhZ3MyID0gLyogYWx0ZXJuYXRlIHJldHJ5IHJhdGUgaW4gMTAwa2JwcyA8PCA0ICovIDA7CisJZW50cnktPnJldHJ5X2xpbWl0ID0gUlRMODE4WF9NQVhfUkVUUklFUzsKKwllbnRyeS0+ZmxhZ3MgPSBjcHVfdG9fbGUzMih0eF9mbGFncyk7CisKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPlRYX0RNQV9QT0xMSU5HLCAoMSA8PCA1KSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBydGw4MTh4X3NldF9hbmFwYXJhbShzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2LCB1MzIgYW5hcGFyYW0pCit7CisJdTggcmVnOworCisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01ELCBSVEw4MThYX0VFUFJPTV9DTURfQ09ORklHKTsKKwlyZWcgPSBydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+Q09ORklHMyk7CisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5DT05GSUczLAorCQkgcmVnIHwgUlRMODE4WF9DT05GSUczX0FOQVBBUkFNX1dSSVRFKTsKKwlydGw4MTh4X2lvd3JpdGUzMihwcml2LCAmcHJpdi0+bWFwLT5BTkFQQVJBTSwgYW5hcGFyYW0pOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+Q09ORklHMywKKwkJIHJlZyAmIH5SVEw4MThYX0NPTkZJRzNfQU5BUEFSQU1fV1JJVEUpOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCwgUlRMODE4WF9FRVBST01fQ01EX05PUk1BTCk7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE4eF9pbml0X2h3KHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXUxNiByZWc7CisKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNNRCwgMCk7CisJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNNRCk7CisJbWRlbGF5KDEwKTsKKworCS8qIHJlc2V0ICovCisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+SU5UX01BU0ssIDApOworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5DTUQpOworCisJcmVnID0gcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNNRCk7CisJcmVnICY9ICgxIDw8IDEpOworCXJlZyB8PSBSVEw4MThYX0NNRF9SRVNFVDsKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNNRCwgUlRMODE4WF9DTURfUkVTRVQpOworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5DTUQpOworCW1kZWxheSgyMDApOworCisJLyogY2hlY2sgc3VjY2VzcyBvZiByZXNldCAqLworCWlmIChydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+Q01EKSAmIFJUTDgxOFhfQ01EX1JFU0VUKSB7CisJCURCRygicnRsODE4eCAlczogcmVzZXQgdGltZW91dCFcbiIsIGRldi0+bmV0ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01ELCBSVEw4MThYX0VFUFJPTV9DTURfTE9BRCk7CisJcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNNRCk7CisJbWRlbGF5KDIwMCk7CisKKwlpZiAocnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzMpICYgKDEgPDwgMykpIHsKKwkJLyogRm9yIGNhcmRidXMgKi8KKwkJcmVnID0gcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzMpOworCQlyZWcgfD0gMSA8PCAxOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzMsIHJlZyk7CisJCXJlZyA9IHJ0bDgxOHhfaW9yZWFkMTYocHJpdiwgJnByaXYtPm1hcC0+RkVNUik7CisJCXJlZyB8PSAoMSA8PCAxNSkgfCAoMSA8PCAxNCkgfCAoMSA8PCA0KTsKKwkJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+RkVNUiwgcmVnKTsKKwl9CisKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPk1TUiwgMCk7CisKKwlpZiAoIXByaXYtPnI4MTg1KQorCQlydGw4MTh4X3NldF9hbmFwYXJhbShwcml2LCBwcml2LT5hbmFwYXJhbSk7CisKKwlydGw4MTh4X2lvd3JpdGUzMihwcml2LCAmcHJpdi0+bWFwLT5SRFNBUiwgcHJpdi0+cnhfcmluZ19kbWEpOworCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPlROUERBLCBwcml2LT50eF9yaW5nX2RtYSk7CisKKwkvKiBUT0RPOiBuZWNlc3Nhcnk/IHNwZWNzIGluZGljYXRlIG5vdCAqLworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCwgUlRMODE4WF9FRVBST01fQ01EX0NPTkZJRyk7CisJcmVnID0gcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzIpOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+Q09ORklHMiwgcmVnICYgfigxIDw8IDMpKTsKKwlpZiAocHJpdi0+cjgxODUpIHsKKwkJcmVnID0gcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzIpOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzIsIHJlZyB8ICgxIDw8IDQpKTsKKwl9CisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01ELCBSVEw4MThYX0VFUFJPTV9DTURfTk9STUFMKTsKKworCS8qIFRPRE86IHNldCBDT05GSUc1IGZvciBjYWxpYnJhdGluZyBBR0Mgb24gcnRsODE4MCArIHBoaWxpcHMgcmFkaW8/ICovCisKKwkvKiBUT0RPOiB0dXJuIG9mZiBodyB3ZXAgb24gcnRsODE4MCAqLworCisJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgJnByaXYtPm1hcC0+SU5UX1RJTUVPVVQsIDApOworCisJaWYgKHByaXYtPnI4MTg1KSB7CisJCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+V1BBX0NPTkYsIDApOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPlJBVEVfRkFMTEJBQ0ssIDB4ODEpOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPlJFU1BfUkFURSwgKDggPDwgNCkgfCAwKTsKKworCQlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5CUlNSLCAweDAxRjMpOworCisJCS8qIFRPRE86IHNldCBDbGtSdW4gZW5hYmxlPyBuZWNlc3Nhcnk/ICovCisJCXJlZyA9IHJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5HUF9FTkFCTEUpOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkdQX0VOQUJMRSwgcmVnICYgfigxIDw8IDYpKTsKKwkJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01ELCBSVEw4MThYX0VFUFJPTV9DTURfQ09ORklHKTsKKwkJcmVnID0gcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzMpOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzMsIHJlZyB8ICgxIDw8IDIpKTsKKwkJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01ELCBSVEw4MThYX0VFUFJPTV9DTURfTk9STUFMKTsKKwl9IGVsc2UgeworCQlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5CUlNSLCAweDEpOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPlNFQ1VSSVRZLCAwKTsKKworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPlBIWV9ERUxBWSwgMHg2KTsKKwkJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5DQVJSSUVSX1NFTlNFX0NPVU5URVIsIDB4NEMpOworCX0KKworCXByaXYtPnJmLT5pbml0KGRldik7CisJaWYgKHByaXYtPnI4MTg1KQorCQlydGw4MTh4X2lvd3JpdGUxNihwcml2LCAmcHJpdi0+bWFwLT5CUlNSLCAweDAxRjMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bDgxOHhfaW5pdF9yeF9yaW5nKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBydGw4MTh4X3J4X2Rlc2MgKmVudHJ5OworCWludCBpOworCisJcHJpdi0+cnhfcmluZyA9IG1hbGxvY19kbWEoc2l6ZW9mKCpwcml2LT5yeF9yaW5nKSAqIFJUTDgxOFhfUlhfUklOR19TSVpFLAorCQkJCSAgIFJUTDgxOFhfUklOR19BTElHTik7CisJcHJpdi0+cnhfcmluZ19kbWEgPSB2aXJ0X3RvX2J1cyhwcml2LT5yeF9yaW5nKTsKKwlpZiAoIXByaXYtPnJ4X3JpbmcpIHsKKwkJREJHKCJydGw4MTh4ICVzOiBjYW5ub3QgYWxsb2NhdGUgUlggcmluZ1xuIiwgZGV2LT5uZXRkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQocHJpdi0+cnhfcmluZywgMCwgc2l6ZW9mKCpwcml2LT5yeF9yaW5nKSAqIFJUTDgxOFhfUlhfUklOR19TSVpFKTsKKwlwcml2LT5yeF9pZHggPSAwOworCisJZm9yIChpID0gMDsgaSA8IFJUTDgxOFhfUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gYWxsb2NfaW9iKE1BWF9SWF9TSVpFKTsKKwkJZW50cnkgPSAmcHJpdi0+cnhfcmluZ1tpXTsKKwkJaWYgKCFpb2IpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlwcml2LT5yeF9idWZbaV0gPSBpb2I7CisJCWVudHJ5LT5yeF9idWYgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhpb2ItPmRhdGEpKTsKKwkJZW50cnktPmZsYWdzID0gY3B1X3RvX2xlMzIoUlRMODE4WF9SWF9ERVNDX0ZMQUdfT1dOIHwKKwkJCQkJICAgTUFYX1JYX1NJWkUpOworCX0KKwllbnRyeS0+ZmxhZ3MgfD0gY3B1X3RvX2xlMzIoUlRMODE4WF9SWF9ERVNDX0ZMQUdfRU9SKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnRsODE4eF9mcmVlX3J4X3Jpbmcoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlRMODE4WF9SWF9SSU5HX1NJWkU7IGkrKykgeworCQlmcmVlX2lvYihwcml2LT5yeF9idWZbaV0pOworCQlwcml2LT5yeF9idWZbaV0gPSBOVUxMOworCX0KKworCWZyZWVfZG1hKHByaXYtPnJ4X3JpbmcsIHNpemVvZigqcHJpdi0+cnhfcmluZykgKiBSVEw4MThYX1JYX1JJTkdfU0laRSk7CisJcHJpdi0+cnhfcmluZyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE4eF9pbml0X3R4X3Jpbmcoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwlwcml2LT50eF9yaW5nID0gbWFsbG9jX2RtYShzaXplb2YoKnByaXYtPnR4X3JpbmcpICogUlRMODE4WF9UWF9SSU5HX1NJWkUsCisJCQkJICAgUlRMODE4WF9SSU5HX0FMSUdOKTsKKwlwcml2LT50eF9yaW5nX2RtYSA9IHZpcnRfdG9fYnVzKHByaXYtPnR4X3JpbmcpOworCWlmICghcHJpdi0+dHhfcmluZykgeworCQlEQkcoInJ0bDgxOHggJXM6IGNhbm5vdCBhbGxvY2F0ZSBUWCByaW5nXG4iLCBkZXYtPm5ldGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChwcml2LT50eF9yaW5nLCAwLCBzaXplb2YoKnByaXYtPnR4X3JpbmcpICogUlRMODE4WF9UWF9SSU5HX1NJWkUpOworCXByaXYtPnR4X3Byb2QgPSBwcml2LT50eF9jb25zID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSVEw4MThYX1RYX1JJTkdfU0laRTsgaSsrKQorCQlwcml2LT50eF9yaW5nW2ldLm5leHRfdHhfZGVzYyA9IGNwdV90b19sZTMyKHByaXYtPnR4X3JpbmdfZG1hICsKKwkJCQkoKGkgKyAxKSAlIFJUTDgxOFhfVFhfUklOR19TSVpFKSAqIHNpemVvZigqcHJpdi0+dHhfcmluZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOHhfZnJlZV90eF9yaW5nKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJUTDgxOFhfVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKHByaXYtPnR4X2J1ZltpXSkKKwkJCW5ldDgwMjExX3R4X2NvbXBsZXRlKGRldiwgcHJpdi0+dHhfYnVmW2ldLCAwLCBFQ0FOQ0VMRUQpOworCQlwcml2LT50eF9idWZbaV0gPSBOVUxMOworCX0KKworCWZyZWVfZG1hKHByaXYtPnR4X3JpbmcsIHNpemVvZigqcHJpdi0+dHhfcmluZykgKiBSVEw4MThYX1RYX1JJTkdfU0laRSk7CisJcHJpdi0+dHhfcmluZyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOHhfaXJxKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPklOVF9NQVNLLCBlbmFibGU/IDB4RkZGRiA6IDApOworfQorCisvKiBTZXRzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgY2FyZC4gKi8KK3N0YXRpYyB2b2lkIHJ0bDgxOHhfc2V0X2h3YWRkcihzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIHU4ICpod2FkZHIpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQsIFJUTDgxOFhfRUVQUk9NX0NNRF9DT05GSUcpOworCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICh1MzIgKikmcHJpdi0+bWFwLT5NQUNbMF0sCisJCQkgIGxlMzJfdG9fY3B1KCoodTMyICopaHdhZGRyKSk7CisJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgKHUxNiAqKSZwcml2LT5tYXAtPk1BQ1s0XSwKKwkJCSAgbGUxNl90b19jcHUoKih1MTYgKikoaHdhZGRyICsgNCkpKTsKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQsIFJUTDgxOFhfRUVQUk9NX0NNRF9OT1JNQUwpOworfQorCitzdGF0aWMgaW50IHJ0bDgxOHhfc3RhcnQoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IHJldDsKKwl1MzIgcmVnOworCisJcmV0ID0gcnRsODE4eF9pbml0X3J4X3JpbmcoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcnRsODE4eF9pbml0X3R4X3JpbmcoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX3JpbmdzOworCisJcmV0ID0gcnRsODE4eF9pbml0X2h3KGRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZV9yaW5nczsKKworCXJ0bDgxOHhfc2V0X2h3YWRkcihkZXYsIGRldi0+bmV0ZGV2LT5sbF9hZGRyKTsKKworCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPlJEU0FSLCBwcml2LT5yeF9yaW5nX2RtYSk7CisJcnRsODE4eF9pb3dyaXRlMzIocHJpdiwgJnByaXYtPm1hcC0+VE5QREEsIHByaXYtPnR4X3JpbmdfZG1hKTsKKworCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPklOVF9NQVNLLCAwKTsKKworCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPk1BUlswXSwgfjApOworCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPk1BUlsxXSwgfjApOworCisJcmVnID0gUlRMODE4WF9SWF9DT05GX09OTFlFUkxQS1QgfAorCSAgICAgIFJUTDgxOFhfUlhfQ09ORl9SWF9BVVRPUkVTRVRQSFkgfAorCSAgICAgIFJUTDgxOFhfUlhfQ09ORl9NR01UIHwKKwkgICAgICBSVEw4MThYX1JYX0NPTkZfREFUQSB8CisJICAgICAgKDcgPDwgOCAvKiBNQVggUlggRE1BICovKSB8CisJICAgICAgUlRMODE4WF9SWF9DT05GX0JST0FEQ0FTVCB8CisJICAgICAgUlRMODE4WF9SWF9DT05GX05JQ01BQzsKKworCWlmIChwcml2LT5yODE4NSkKKwkJcmVnIHw9IFJUTDgxOFhfUlhfQ09ORl9DU0RNMSB8IFJUTDgxOFhfUlhfQ09ORl9DU0RNMjsKKwllbHNlIHsKKwkJcmVnIHw9IChwcml2LT5yZnBhcmFtICYgUkZfUEFSQU1fQ0FSUklFUlNFTlNFMSkKKwkJCT8gUlRMODE4WF9SWF9DT05GX0NTRE0xIDogMDsKKwkJcmVnIHw9IChwcml2LT5yZnBhcmFtICYgUkZfUEFSQU1fQ0FSUklFUlNFTlNFMikKKwkJCT8gUlRMODE4WF9SWF9DT05GX0NTRE0yIDogMDsKKwl9CisKKwlwcml2LT5yeF9jb25mID0gcmVnOworCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPlJYX0NPTkYsIHJlZyk7CisKKwlpZiAocHJpdi0+cjgxODUpIHsKKwkJcmVnID0gcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNXX0NPTkYpOworCQlyZWcgJj0gflJUTDgxOFhfQ1dfQ09ORl9QRVJQQUNLRVRfQ1dfU0hJRlQ7CisJCXJlZyB8PSBSVEw4MThYX0NXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkNXX0NPTkYsIHJlZyk7CisKKwkJcmVnID0gcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPlRYX0FHQ19DVEwpOworCQlyZWcgJj0gflJUTDgxOFhfVFhfQUdDX0NUTF9QRVJQQUNLRVRfR0FJTl9TSElGVDsKKwkJcmVnICY9IH5SVEw4MThYX1RYX0FHQ19DVExfUEVSUEFDS0VUX0FOVFNFTF9TSElGVDsKKwkJcmVnIHw9ICBSVEw4MThYX1RYX0FHQ19DVExfRkVFREJBQ0tfQU5UOworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPlRYX0FHQ19DVEwsIHJlZyk7CisKKwkJLyogZGlzYWJsZSBlYXJseSBUWCAqLworCQlydGw4MTh4X2lvd3JpdGU4KHByaXYsICh1OCAqKXByaXYtPm1hcCArIDB4ZWMsIDB4M2YpOworCX0KKworCXJlZyA9IHJ0bDgxOHhfaW9yZWFkMzIocHJpdiwgJnByaXYtPm1hcC0+VFhfQ09ORik7CisJcmVnIHw9ICg2IDw8IDIxIC8qIE1BWCBUWCBETUEgKi8pIHwKKwkgICAgICAgUlRMODE4WF9UWF9DT05GX05PX0lDVjsKKworCWlmIChwcml2LT5yODE4NSkKKwkJcmVnICY9IH5SVEw4MThYX1RYX0NPTkZfUFJPQkVfRFRTOworCWVsc2UKKwkJcmVnICY9IH5SVEw4MThYX1RYX0NPTkZfSFdfU0VRTlVNOworCisJLyogZGlmZmVyZW50IG1lYW5pbmcsIHNhbWUgdmFsdWUgb24gYm90aCBydGw4MTg1IGFuZCBydGw4MTgwICovCisJcmVnICY9IH5SVEw4MThYX1RYX0NPTkZfU0FUX0hXUExDUDsKKworCXJ0bDgxOHhfaW93cml0ZTMyKHByaXYsICZwcml2LT5tYXAtPlRYX0NPTkYsIHJlZyk7CisKKwlyZWcgPSBydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+Q01EKTsKKwlyZWcgfD0gUlRMODE4WF9DTURfUlhfRU5BQkxFOworCXJlZyB8PSBSVEw4MThYX0NNRF9UWF9FTkFCTEU7CisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5DTUQsIHJlZyk7CisKKwlEQkcoIiVzIHJ0bDgxOHg6IHN0YXJ0ZWRcbiIsIGRldi0+bmV0ZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworCisgZXJyX2ZyZWVfcmluZ3M6CisJcnRsODE4eF9mcmVlX3J4X3JpbmcoZGV2KTsKKwlpZiAocHJpdi0+dHhfcmluZykKKwkJcnRsODE4eF9mcmVlX3R4X3JpbmcoZGV2KTsKKworCURCRygiJXMgcnRsODE4eDogZmFpbGVkIHRvIHN0YXJ0XG4iLCBkZXYtPm5ldGRldi0+bmFtZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBydGw4MTh4X3N0b3Aoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJdTggcmVnOworCisJcnRsODE4eF9pcnEoZGV2LCAwKTsKKworCXJlZyA9IHJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5DTUQpOworCXJlZyAmPSB+UlRMODE4WF9DTURfVFhfRU5BQkxFOworCXJlZyAmPSB+UlRMODE4WF9DTURfUlhfRU5BQkxFOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+Q01ELCByZWcpOworCisJcHJpdi0+cmYtPnN0b3AoZGV2KTsKKworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCwgUlRMODE4WF9FRVBST01fQ01EX0NPTkZJRyk7CisJcmVnID0gcnRsODE4eF9pb3JlYWQ4KHByaXYsICZwcml2LT5tYXAtPkNPTkZJRzQpOworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+Q09ORklHNCwgcmVnIHwgUlRMODE4WF9DT05GSUc0X1ZDT09GRik7CisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01ELCBSVEw4MThYX0VFUFJPTV9DTURfTk9STUFMKTsKKworCXJ0bDgxOHhfZnJlZV9yeF9yaW5nKGRldik7CisJcnRsODE4eF9mcmVlX3R4X3JpbmcoZGV2KTsKK30KKworc3RhdGljIGludCBydGw4MTh4X2NvbmZpZyhzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCBjaGFuZ2VkKQoreworCXN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwlpZiAoY2hhbmdlZCAmIE5FVDgwMjExX0NGR19DSEFOTkVMKQorCQlwcml2LT5yZi0+c2V0X2NoYW4oZGV2LCAmZGV2LT5jaGFubmVsc1tkZXYtPmNoYW5uZWxdKTsKKworCWlmIChjaGFuZ2VkICYgTkVUODAyMTFfQ0ZHX0FTU09DKSB7CisJCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQkJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5CU1NJRFtpXSwgZGV2LT5ic3NpZFtpXSk7CisJCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+TVNSLAorCQkJCSBkZXYtPnN0YXRlICYgTkVUODAyMTFfQVNTT0NJQVRFRD8KKwkJCQkJUlRMODE4WF9NU1JfSU5GUkEgOiBSVEw4MThYX01TUl9OT19MSU5LKTsKKwl9CisKKwlpZiAoY2hhbmdlZCAmIE5FVDgwMjExX0NGR19QSFlfUEFSQU1TKQorCQlwcml2LT5yZi0+Y29uZl9lcnAoZGV2KTsKKworCWlmIChjaGFuZ2VkICYgTkVUODAyMTFfQ0ZHX1JBVEUpIHsKKwkJLyogZmlndXJlIG91dCB0aGUgaGFyZHdhcmUgcmF0ZSBudW1iZXIgZm9yIHRoZSBuZXcKKwkJICAgbG9naWNhbCByYXRlICovCisJCWludCBod19yYXRlOworCQlmb3IgKGh3X3JhdGUgPSAwOyBod19yYXRlIDwgUlRMODE4WF9OUl9SQVRFUyAmJgorCQkJICAgICBydGw4MTh4X3JhdGVzW2h3X3JhdGVdICE9IGRldi0+cmF0ZXNbZGV2LT5yYXRlXTsKKwkJICAgICBod19yYXRlKyspCisJCQk7CisJCWlmIChod19yYXRlID49IFJUTDgxOFhfTlJfUkFURVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5od19yYXRlID0gaHdfcmF0ZTsKKworCQkvKiBhbmQgdGhlIFJUUy9DVFMgcmF0ZSAqLworCQlmb3IgKGh3X3JhdGUgPSAwOyBod19yYXRlIDwgUlRMODE4WF9OUl9SQVRFUyAmJgorCQkJICAgICBydGw4MTh4X3JhdGVzW2h3X3JhdGVdICE9CisJCQkJZGV2LT5yYXRlc1tkZXYtPnJ0c2N0c19yYXRlXTsKKwkJICAgICBod19yYXRlKyspCisJCQk7CisJCWlmIChod19yYXRlID49IFJUTDgxOFhfTlJfUkFURVMpCisJCQlod19yYXRlID0gcHJpdi0+aHdfcmF0ZTsKKworCQlwcml2LT5od19ydHNjdHNfcmF0ZSA9IGh3X3JhdGU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCB1OCBydGw4MTh4X2VlcHJvbV9iaXRzW10gPSB7CisJW1NQSV9CSVRfU0NMS10gPSBSVEw4MThYX0VFUFJPTV9DTURfQ0ssCisJW1NQSV9CSVRfTUlTT10gPSBSVEw4MThYX0VFUFJPTV9DTURfUkVBRCwKKwlbU1BJX0JJVF9NT1NJXSA9IFJUTDgxOFhfRUVQUk9NX0NNRF9XUklURSwKKwlbU1BJX0JJVF9TUygwKV0gPSBSVEw4MThYX0VFUFJPTV9DTURfQ1MsCit9OworCitzdGF0aWMgaW50IHJ0bDgxOHhfc3BpX3JlYWRfYml0KHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsIHVuc2lnbmVkIGludCBiaXRfaWQpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihiYXNoZXIsIHN0cnVjdCBydGw4MTh4X3ByaXYsCisJCQkJCQkgc3BpYml0LmJhc2hlcik7CisKKwl1OCByZWcgPSBydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCk7CisJcmV0dXJuIHJlZyAmIHJ0bDgxOHhfZWVwcm9tX2JpdHNbYml0X2lkXTsKK30KKworc3RhdGljIHZvaWQgcnRsODE4eF9zcGlfd3JpdGVfYml0KHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsCisJCQkJICB1bnNpZ25lZCBpbnQgYml0X2lkLCB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihiYXNoZXIsIHN0cnVjdCBydGw4MTh4X3ByaXYsCisJCQkJCQkgc3BpYml0LmJhc2hlcik7CisKKwl1OCByZWcgPSBydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCk7CisJdTggbWFzayA9IHJ0bDgxOHhfZWVwcm9tX2JpdHNbYml0X2lkXTsKKwlyZWcgPSAocmVnICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKTsKKworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCwgcmVnKTsKKworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgc3RydWN0IGJpdF9iYXNoZXJfb3BlcmF0aW9ucyBydGw4MTh4X2Jhc2hlcl9vcHMgPSB7CisJLnJlYWQgPSBydGw4MTh4X3NwaV9yZWFkX2JpdCwKKwkud3JpdGUgPSBydGw4MTh4X3NwaV93cml0ZV9iaXQsCit9OworCisjaWYgREJHTFZMX01BWAorc3RhdGljIGNvbnN0IGNoYXIgKnJ0bDgxOHhfcmZfbmFtZXNbXSA9IHsKKwlOVUxMLAkJCS8qIG5vIDAgKi8KKwkiSW50ZXJzaWwiLCAiUkZNRCIsCS8qIHVuc3VwcG9ydGVkIDEtMiAqLworCSJTQTI0MDAiLCAibWF4MjgyMCIsICJHUkY1MTAxIiwJLyogc3VwcG9ydGVkIDMtNSAqLworCU5VTEwsIE5VTEwsIE5VTEwsCS8qIG5vIDYtOCAqLworCSJSVEw4MjI1IiwJCS8qIHN1cHBvcnRlZCA5ICovCisJIlJUTDgyNTUiLAkJLyogdW5zdXBwb3J0ZWQgMTAgKi8KK307CisjZGVmaW5lIFJUTDgxOFhfTlJfUkZfTkFNRVMgMTEKKyNlbmRpZgorCitzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlX29wZXJhdGlvbnMgcnRsODE4eF9vcGVyYXRpb25zID0geworCS5vcGVuID0gcnRsODE4eF9zdGFydCwKKwkuY2xvc2UgPSBydGw4MTh4X3N0b3AsCisJLnRyYW5zbWl0ID0gcnRsODE4eF90eCwKKwkucG9sbCA9IHJ0bDgxOHhfcG9sbCwKKwkuaXJxID0gcnRsODE4eF9pcnEsCisJLmNvbmZpZyA9IHJ0bDgxOHhfY29uZmlnLAorfTsKKworc3RhdGljIGludCBydGw4MTh4X3Byb2JlKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2LAorCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCBfX3VudXNlZCkKK3sKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXY7CisJc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgcnRsODE4eF9yZl9vcHMgKnJmOworCWludCBlcnIsIGk7CisJY29uc3QgY2hhciAqY2hpcF9uYW1lOworCXUzMiByZWc7CisJdTE2IGVlcHJvbV92YWw7CisJc3RydWN0IG5ldDgwMjExX2h3X2luZm8gKmh3aW5mbzsKKworCWh3aW5mbyA9IHphbGxvYyhzaXplb2YoKmh3aW5mbykpOworCWlmICghaHdpbmZvKSB7CisJCURCRygicnRsODE4eDogaHdpbmZvIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFkanVzdF9wY2lfZGV2aWNlKHBkZXYpOworCisJZGV2ID0gbmV0ODAyMTFfYWxsb2Moc2l6ZW9mKCpwcml2KSk7CisJaWYgKCFkZXYpIHsKKwkJREJHKCJydGw4MTh4OiBuZXQ4MDIxMSBhbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcml2ID0gZGV2LT5wcml2OworCXByaXYtPnBkZXYgPSBwZGV2OworCWRldi0+bmV0ZGV2LT5kZXYgPSAmcGRldi0+ZGV2OworCisJcHJpdi0+bWFwID0gKHN0cnVjdCBydGw4MTh4X2NzciAqKXBkZXYtPmlvYWRkcjsKKwlpZiAoIXByaXYtPm1hcCkgeworCQlEQkcoInJ0bDgxOHg6IGNhbm5vdCBmaW5kIGRldmljZSBtZW1vcnlcbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gZXJyX2ZyZWVfZGV2OworCX0KKworCXJlZyA9IHJ0bDgxOHhfaW9yZWFkMzIocHJpdiwgJnByaXYtPm1hcC0+VFhfQ09ORik7CisJcmVnICY9IFJUTDgxOFhfVFhfQ09ORl9IV1ZFUl9NQVNLOworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBSVEw4MThYX1RYX0NPTkZfUjgxODBfQUJDRDoKKwkJY2hpcF9uYW1lID0gIjAiOworCQlicmVhazsKKwljYXNlIFJUTDgxOFhfVFhfQ09ORl9SODE4MF9GOgorCQljaGlwX25hbWUgPSAiMHZGIjsKKwkJYnJlYWs7CisJY2FzZSBSVEw4MThYX1RYX0NPTkZfUjgxODVfQUJDOgorCQljaGlwX25hbWUgPSAiNSI7CisJCWJyZWFrOworCWNhc2UgUlRMODE4WF9UWF9DT05GX1I4MTg1X0Q6CisJCWNoaXBfbmFtZSA9ICI1dkQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkcoInJ0bDgxOHg6IFVua25vd24gY2hpcCEgKDB4JXgpXG4iLCByZWcgPj4gMjUpOworCQllcnIgPSAtRU5PU1lTOworCQlnb3RvIGVycl9mcmVlX2RldjsKKwl9CisKKwlwcml2LT5yODE4NSA9IHJlZyAmIFJUTDgxOFhfVFhfQ09ORl9SODE4NV9BQkM7CisKKwlod2luZm8tPmJhbmRzID0gTkVUODAyMTFfQkFORF9CSVRfMkdIWjsKKwlod2luZm8tPmZsYWdzID0gTkVUODAyMTFfSFdfUlhfSEFTX0ZDUzsKKwlod2luZm8tPnNpZ25hbF90eXBlID0gTkVUODAyMTFfU0lHTkFMX0FSQklUUkFSWTsKKwlod2luZm8tPnNpZ25hbF9tYXggPSA2NTsKKwlod2luZm8tPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSAxMDAwOworCisJbWVtY3B5KGh3aW5mby0+cmF0ZXNbTkVUODAyMTFfQkFORF8yR0haXSwgcnRsODE4eF9yYXRlcywKKwkgICAgICAgc2l6ZW9mKCpydGw4MTh4X3JhdGVzKSAqIFJUTDgxOFhfTlJfUkFURVMpOworCisJaWYgKHByaXYtPnI4MTg1KSB7CisJCWh3aW5mby0+bW9kZXMgPSBORVQ4MDIxMV9NT0RFX0IgfCBORVQ4MDIxMV9NT0RFX0c7CisJCWh3aW5mby0+bnJfcmF0ZXNbTkVUODAyMTFfQkFORF8yR0haXSA9IFJUTDgxOFhfTlJfUkFURVM7CisJfSBlbHNlIHsKKwkJaHdpbmZvLT5tb2RlcyA9IE5FVDgwMjExX01PREVfQjsKKwkJaHdpbmZvLT5ucl9yYXRlc1tORVQ4MDIxMV9CQU5EXzJHSFpdID0gUlRMODE4WF9OUl9CX1JBVEVTOworCX0KKworCXByaXYtPnNwaWJpdC5iYXNoZXIub3AgPSAmcnRsODE4eF9iYXNoZXJfb3BzOworCXByaXYtPnNwaWJpdC5idXMubW9kZSA9IFNQSV9NT0RFX1RIUkVFV0lSRTsKKwlpbml0X3NwaV9iaXRfYmFzaGVyKCZwcml2LT5zcGliaXQpOworCisJREJHMigicnRsODE4eCBSWF9DT05GOiAlMDh4XG4iLCBydGw4MTh4X2lvcmVhZDMyKHByaXYsICZwcml2LT5tYXAtPlJYX0NPTkYpKTsKKworCWlmIChydGw4MTh4X2lvcmVhZDMyKHByaXYsICZwcml2LT5tYXAtPlJYX0NPTkYpICYgKDEgPDwgNikpCisJCWluaXRfYXQ5M2M2NigmcHJpdi0+ZWVwcm9tLCAxNik7CisJZWxzZQorCQlpbml0X2F0OTNjNDYoJnByaXYtPmVlcHJvbSwgMTYpOworCXByaXYtPmVlcHJvbS5idXMgPSAmcHJpdi0+c3BpYml0LmJ1czsKKworCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+RUVQUk9NX0NNRCwgUlRMODE4WF9FRVBST01fQ01EX1BST0dSQU0pOworCXJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5FRVBST01fQ01EKTsKKwl1ZGVsYXkoMTApOworCisJbnZzX3JlYWQoJnByaXYtPmVlcHJvbS5udnMsIDB4MDYsICZlZXByb21fdmFsLCAyKTsKKwlEQkcyKCJydGw4MTh4IGVlcHJvbSB2YWwgPSAlMDR4XG4iLCBlZXByb21fdmFsKTsKKwllZXByb21fdmFsICY9IDB4RkY7CisKKwlwcml2LT5yZiA9IE5VTEw7CisJZm9yX2VhY2hfdGFibGVfZW50cnkocmYsIFJUTDgxOFhfUkZfRFJJVkVSUykgeworCQlpZiAocmYtPmlkID09IGVlcHJvbV92YWwpIHsKKwkJCXByaXYtPnJmID0gcmY7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcHJpdi0+cmYpIHsKKyNpZiBEQkdMVkxfTUFYCisJCWlmIChlZXByb21fdmFsIDwgUlRMODE4WF9OUl9SRl9OQU1FUyAmJgorCQkgICAgcnRsODE4eF9yZl9uYW1lc1tlZXByb21fdmFsXSAhPSBOVUxMKQorCQkJREJHKCJydGw4MTh4OiAlcyBSRiBmcm9udGVuZCBub3Qgc3VwcG9ydGVkIVxuIiwKKwkJCSAgICBydGw4MTh4X3JmX25hbWVzW2VlcHJvbV92YWxdKTsKKwkJZWxzZQorCQkJREJHKCJydGw4MTh4OiBSRiBmcm9udGVuZCAjJWQgbm90IHJlY29nbml6ZWQhXG4iLAorCQkJICAgIGVlcHJvbV92YWwpOworI2VuZGlmCisKKwkJZXJyID0gLUVOT1NZUzsKKwkJZ290byBlcnJfZnJlZV9kZXY7CisJfQorCisJbnZzX3JlYWQoJnByaXYtPmVlcHJvbS5udnMsIDB4MTcsICZlZXByb21fdmFsLCAyKTsKKwlwcml2LT5jc3RocmVzaG9sZCA9IGVlcHJvbV92YWwgPj4gODsKKwlpZiAoIXByaXYtPnI4MTg1KSB7CisJCW52c19yZWFkKCZwcml2LT5lZXByb20ubnZzLCAweEQsICZwcml2LT5hbmFwYXJhbSwgNCk7CisJCW52c19yZWFkKCZwcml2LT5lZXByb20ubnZzLCAweDE5LCAmcHJpdi0+cmZwYXJhbSwgMik7CisJCXByaXYtPmFuYXBhcmFtID0gbGUzMl90b19jcHUocHJpdi0+YW5hcGFyYW0pOworCQlwcml2LT5yZnBhcmFtID0gbGUxNl90b19jcHUocHJpdi0+cmZwYXJhbSk7CisJfQorCisJLyogcmVhZCB0aGUgTUFDIGFkZHJlc3MgKi8KKwludnNfcmVhZCgmcHJpdi0+ZWVwcm9tLm52cywgMHg3LCBod2luZm8tPmh3YWRkciwgNik7CisKKwkvKiBDQ0sgVFggcG93ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkgKz0gMikgeworCQl1MTYgdHhwd3I7CisJCW52c19yZWFkKCZwcml2LT5lZXByb20ubnZzLCAweDEwICsgKGkgPj4gMSksICZ0eHB3ciwgMik7CisJCXByaXYtPnR4cG93ZXJbaV0gPSB0eHB3ciAmIDB4RkY7CisJCXByaXYtPnR4cG93ZXJbaSArIDFdID0gdHhwd3IgPj4gODsKKwl9CisKKwkvKiBPRkRNIFRYIHBvd2VyICovCisJaWYgKHByaXYtPnI4MTg1KSB7CisJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSArPSAyKSB7CisJCQl1MTYgdHhwd3I7CisJCQludnNfcmVhZCgmcHJpdi0+ZWVwcm9tLm52cywgMHgyMCArIChpID4+IDEpLCAmdHhwd3IsIDIpOworCQkJcHJpdi0+dHhwb3dlcltpXSB8PSAodHhwd3IgJiAweEZGKSA8PCA4OworCQkJcHJpdi0+dHhwb3dlcltpICsgMV0gfD0gdHhwd3IgJiAweEZGMDA7CisJCX0KKwl9CisKKwlydGw4MTh4X2lvd3JpdGU4KHByaXYsICZwcml2LT5tYXAtPkVFUFJPTV9DTUQsIFJUTDgxOFhfRUVQUk9NX0NNRF9OT1JNQUwpOworCisJZXJyID0gbmV0ODAyMTFfcmVnaXN0ZXIoZGV2LCAmcnRsODE4eF9vcGVyYXRpb25zLCBod2luZm8pOworCWlmIChlcnIpIHsKKwkJREJHKCJydGw4MTh4OiBjYW5ub3QgcmVnaXN0ZXIgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9kZXY7CisJfQorCisJZnJlZShod2luZm8pOworCisJREJHKCJydGw4MTh4OiBSZWFsdGVrIFJUTDgxOCVzIChSRiBjaGlwICVzKSB3aXRoIGFkZHJlc3MgJXNcbiIsCisJICAgIGNoaXBfbmFtZSwgcHJpdi0+cmYtPm5hbWUsIG5ldGRldl9hZGRyKGRldi0+bmV0ZGV2KSk7CisKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2RldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJbmV0ODAyMTFfZnJlZShkZXYpOworCWZyZWUoaHdpbmZvKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBydGw4MTh4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJbmV0ODAyMTFfdW5yZWdpc3RlcihkZXYpOworCW5ldDgwMjExX2ZyZWUoZGV2KTsKK30KKworLyogSGlkZSBQQ0lfUk9NIGRlZmluaXRpb25zIGluIGhlcmUgZnJvbSBwYXJzZXJvbS5wbDsgdGhlIGRlZmluaXRpb25zCisgICB0aGF0IHNob3VsZCBiZSB1c2VkIGFyZSBpbiBydGw4MTgwLmMgYW5kIHJ0bDgxODUuYy4gKi8KKyNkZWZpbmUgUlRMX1JPTSBQQ0lfUk9NCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBydGw4MTh4X25pY3NbXSA9IHsKKwlSVExfUk9NKDB4MTBlYywgMHg4MTg1LCAicnRsODE4NSIsICJSZWFsdGVrIDgxODUiLCAwKSwKKwlSVExfUk9NKDB4MTc5OSwgMHg3MDBmLCAiZjVkNzAwMCIsICJCZWxraW4gRjVENzAwMCIsIDApLAorCVJUTF9ST00oMHgxNzk5LCAweDcwMWYsICJmNWQ3MDEwIiwgIkJlbGtpbiBGNUQ3MDEwIiwgMCksCisKKwlSVExfUk9NKDB4MTBlYywgMHg4MTgwLCAicnRsODE4MCIsICJSZWFsdGVrIDgxODAiLCAwKSwKKwlSVExfUk9NKDB4MTc5OSwgMHg2MDAxLCAiZjVkNjAwMSIsICJCZWxraW4gRjVENjAwMSIsIDApLAorCVJUTF9ST00oMHgxNzk5LCAweDYwMjAsICJmNWQ2MDIwIiwgIkJlbGtpbiBGNUQ2MDIwIiwgMCksCisJUlRMX1JPTSgweDExODYsIDB4MzMwMCwgImR3bDUxMCIsICAiRC1MaW5rIERXTC01MTAiLCAwKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHJ0bDgxOHhfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzICAgICAgICAgICAgPSBydGw4MTh4X25pY3MsCisJLmlkX2NvdW50ICAgICAgID0gc2l6ZW9mKHJ0bDgxOHhfbmljcykgLyBzaXplb2YocnRsODE4eF9uaWNzWzBdKSwKKwkucHJvYmUJCT0gcnRsODE4eF9wcm9iZSwKKwkucmVtb3ZlCQk9IHJ0bDgxOHhfcmVtb3ZlLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxOHgvcnRsODE4eC5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvcnRsODE4eC9ydGw4MTh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4MjFmYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3J0bDgxOHgvcnRsODE4eC5oCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIFJUTDgxOHggaGFyZHdhcmUKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBNaWNoYWVsIFd1IDxmbGFtaW5naWNlQHNvdXJtaWxrLm5ldD4KKyAqIENvcHlyaWdodCAyMDA3IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb2RpZmllZCBmb3IgZ1BYRSwgSnVuZSAyMDA5LCBieSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0PgorICoKKyAqIEJhc2VkIG9uIHRoZSByODE4NyBkcml2ZXIsIHdoaWNoIGlzOgorICogQ29weXJpZ2h0IDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiwgZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFJUTDgxOFhfSAorI2RlZmluZSBSVEw4MThYX0gKKworI2luY2x1ZGUgPGdweGUvc3BpX2JpdC5oPgorI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisKK0ZJTEVfTElDRU5DRShHUEwyX09OTFkpOworCitzdHJ1Y3QgcnRsODE4eF9jc3IgeworCXU4CU1BQ1s2XTsKKwl1OAlyZXNlcnZlZF8wWzJdOworCXUzMglNQVJbMl07CisJdTgJUlhfRklGT19DT1VOVDsKKwl1OAlyZXNlcnZlZF8xOworCXU4CVRYX0ZJRk9fQ09VTlQ7CisJdTgJQlFSRVE7CisJdTgJcmVzZXJ2ZWRfMls0XTsKKwl1MzIJVFNGVFsyXTsKKwl1MzIJVExQREE7CisJdTMyCVROUERBOworCXUzMglUSFBEQTsKKwl1MTYJQlJTUjsKKwl1OAlCU1NJRFs2XTsKKwl1OAlSRVNQX1JBVEU7CisJdTgJRUlGUzsKKwl1OAlyZXNlcnZlZF8zWzFdOworCXU4CUNNRDsKKyNkZWZpbmUgUlRMODE4WF9DTURfVFhfRU5BQkxFCQkoMSA8PCAyKQorI2RlZmluZSBSVEw4MThYX0NNRF9SWF9FTkFCTEUJCSgxIDw8IDMpCisjZGVmaW5lIFJUTDgxOFhfQ01EX1JFU0VUCQkoMSA8PCA0KQorCXU4CXJlc2VydmVkXzRbNF07CisJdTE2CUlOVF9NQVNLOworCXUxNglJTlRfU1RBVFVTOworI2RlZmluZSBSVEw4MThYX0lOVF9SWF9PSwkJKDEgPDwgIDApCisjZGVmaW5lIFJUTDgxOFhfSU5UX1JYX0VSUgkJKDEgPDwgIDEpCisjZGVmaW5lIFJUTDgxOFhfSU5UX1RYTF9PSwkJKDEgPDwgIDIpCisjZGVmaW5lIFJUTDgxOFhfSU5UX1RYTF9FUlIJCSgxIDw8ICAzKQorI2RlZmluZSBSVEw4MThYX0lOVF9SWF9EVQkJKDEgPDwgIDQpCisjZGVmaW5lIFJUTDgxOFhfSU5UX1JYX0ZPCQkoMSA8PCAgNSkKKyNkZWZpbmUgUlRMODE4WF9JTlRfVFhOX09LCQkoMSA8PCAgNikKKyNkZWZpbmUgUlRMODE4WF9JTlRfVFhOX0VSUgkJKDEgPDwgIDcpCisjZGVmaW5lIFJUTDgxOFhfSU5UX1RYSF9PSwkJKDEgPDwgIDgpCisjZGVmaW5lIFJUTDgxOFhfSU5UX1RYSF9FUlIJCSgxIDw8ICA5KQorI2RlZmluZSBSVEw4MThYX0lOVF9UWEJfT0sJCSgxIDw8IDEwKQorI2RlZmluZSBSVEw4MThYX0lOVF9UWEJfRVJSCQkoMSA8PCAxMSkKKyNkZWZpbmUgUlRMODE4WF9JTlRfQVRJTQkJKDEgPDwgMTIpCisjZGVmaW5lIFJUTDgxOFhfSU5UX0JFQUNPTgkJKDEgPDwgMTMpCisjZGVmaW5lIFJUTDgxOFhfSU5UX1RJTUVfT1VUCQkoMSA8PCAxNCkKKyNkZWZpbmUgUlRMODE4WF9JTlRfVFhfRk8JCSgxIDw8IDE1KQorCXUzMglUWF9DT05GOworI2RlZmluZSBSVEw4MThYX1RYX0NPTkZfTE9PUEJBQ0tfTUFDCSgxIDw8IDE3KQorI2RlZmluZSBSVEw4MThYX1RYX0NPTkZfTE9PUEJBQ0tfQ09OVAkoMyA8PCAxNykKKyNkZWZpbmUgUlRMODE4WF9UWF9DT05GX05PX0lDVgkJKDEgPDwgMTkpCisjZGVmaW5lIFJUTDgxOFhfVFhfQ09ORl9ESVNDVwkJKDEgPDwgMjApCisjZGVmaW5lIFJUTDgxOFhfVFhfQ09ORl9TQVRfSFdQTENQCSgxIDw8IDI0KQorI2RlZmluZSBSVEw4MThYX1RYX0NPTkZfUjgxODBfQUJDRAkoMiA8PCAyNSkKKyNkZWZpbmUgUlRMODE4WF9UWF9DT05GX1I4MTgwX0YJCSgzIDw8IDI1KQorI2RlZmluZSBSVEw4MThYX1RYX0NPTkZfUjgxODVfQUJDCSg0IDw8IDI1KQorI2RlZmluZSBSVEw4MThYX1RYX0NPTkZfUjgxODVfRAkJKDUgPDwgMjUpCisjZGVmaW5lIFJUTDgxOFhfVFhfQ09ORl9SODE4N3ZECQkoNSA8PCAyNSkKKyNkZWZpbmUgUlRMODE4WF9UWF9DT05GX1I4MTg3dkRfQgkoNiA8PCAyNSkKKyNkZWZpbmUgUlRMODE4WF9UWF9DT05GX0hXVkVSX01BU0sJKDcgPDwgMjUpCisjZGVmaW5lIFJUTDgxOFhfVFhfQ09ORl9ESVNSRVFRU0laRQkoMSA8PCAyOCkKKyNkZWZpbmUgUlRMODE4WF9UWF9DT05GX1BST0JFX0RUUwkoMSA8PCAyOSkKKyNkZWZpbmUgUlRMODE4WF9UWF9DT05GX0hXX1NFUU5VTQkoMSA8PCAzMCkKKyNkZWZpbmUgUlRMODE4WF9UWF9DT05GX0NXX01JTgkJKDEgPDwgMzEpCisJdTMyCVJYX0NPTkY7CisjZGVmaW5lIFJUTDgxOFhfUlhfQ09ORl9NT05JVE9SCQkoMSA8PCAgMCkKKyNkZWZpbmUgUlRMODE4WF9SWF9DT05GX05JQ01BQwkJKDEgPDwgIDEpCisjZGVmaW5lIFJUTDgxOFhfUlhfQ09ORl9NVUxUSUNBU1QJKDEgPDwgIDIpCisjZGVmaW5lIFJUTDgxOFhfUlhfQ09ORl9CUk9BRENBU1QJKDEgPDwgIDMpCisjZGVmaW5lIFJUTDgxOFhfUlhfQ09ORl9GQ1MJCSgxIDw8ICA1KQorI2RlZmluZSBSVEw4MThYX1JYX0NPTkZfREFUQQkJKDEgPDwgMTgpCisjZGVmaW5lIFJUTDgxOFhfUlhfQ09ORl9DVFJMCQkoMSA8PCAxOSkKKyNkZWZpbmUgUlRMODE4WF9SWF9DT05GX01HTVQJCSgxIDw8IDIwKQorI2RlZmluZSBSVEw4MThYX1JYX0NPTkZfQUREUjMJCSgxIDw8IDIxKQorI2RlZmluZSBSVEw4MThYX1JYX0NPTkZfUE0JCSgxIDw8IDIyKQorI2RlZmluZSBSVEw4MThYX1JYX0NPTkZfQlNTSUQJCSgxIDw8IDIzKQorI2RlZmluZSBSVEw4MThYX1JYX0NPTkZfUlhfQVVUT1JFU0VUUEhZCSgxIDw8IDI4KQorI2RlZmluZSBSVEw4MThYX1JYX0NPTkZfQ1NETTEJCSgxIDw8IDI5KQorI2RlZmluZSBSVEw4MThYX1JYX0NPTkZfQ1NETTIJCSgxIDw8IDMwKQorI2RlZmluZSBSVEw4MThYX1JYX0NPTkZfT05MWUVSTFBLVAkoMSA8PCAzMSkKKwl1MzIJSU5UX1RJTUVPVVQ7CisJdTMyCVRCREE7CisJdTgJRUVQUk9NX0NNRDsKKyNkZWZpbmUgUlRMODE4WF9FRVBST01fQ01EX1JFQUQJCSgxIDw8IDApCisjZGVmaW5lIFJUTDgxOFhfRUVQUk9NX0NNRF9XUklURQkoMSA8PCAxKQorI2RlZmluZSBSVEw4MThYX0VFUFJPTV9DTURfQ0sJCSgxIDw8IDIpCisjZGVmaW5lIFJUTDgxOFhfRUVQUk9NX0NNRF9DUwkJKDEgPDwgMykKKyNkZWZpbmUgUlRMODE4WF9FRVBST01fQ01EX05PUk1BTAkoMCA8PCA2KQorI2RlZmluZSBSVEw4MThYX0VFUFJPTV9DTURfTE9BRAkJKDEgPDwgNikKKyNkZWZpbmUgUlRMODE4WF9FRVBST01fQ01EX1BST0dSQU0JKDIgPDwgNikKKyNkZWZpbmUgUlRMODE4WF9FRVBST01fQ01EX0NPTkZJRwkoMyA8PCA2KQorCXU4CUNPTkZJRzA7CisJdTgJQ09ORklHMTsKKwl1OAlDT05GSUcyOworI2RlZmluZSBSVEw4MThYX0NPTkZJRzJfQU5URU5OQV9ESVYJKDEgPDwgNikKKwl1MzIJQU5BUEFSQU07CisJdTgJTVNSOworI2RlZmluZSBSVEw4MThYX01TUl9OT19MSU5LCQkoMCA8PCAyKQorI2RlZmluZSBSVEw4MThYX01TUl9BREhPQwkJKDEgPDwgMikKKyNkZWZpbmUgUlRMODE4WF9NU1JfSU5GUkEJCSgyIDw8IDIpCisjZGVmaW5lIFJUTDgxOFhfTVNSX01BU1RFUgkJKDMgPDwgMikKKyNkZWZpbmUgUlRMODE4WF9NU1JfRU5FRENBCQkoNCA8PCAyKQorCXU4CUNPTkZJRzM7CisjZGVmaW5lIFJUTDgxOFhfQ09ORklHM19BTkFQQVJBTV9XUklURQkoMSA8PCA2KQorI2RlZmluZSBSVEw4MThYX0NPTkZJRzNfR05UX1NFTEVDVAkoMSA8PCA3KQorCXU4CUNPTkZJRzQ7CisjZGVmaW5lIFJUTDgxOFhfQ09ORklHNF9QT1dFUk9GRgkoMSA8PCA2KQorI2RlZmluZSBSVEw4MThYX0NPTkZJRzRfVkNPT0ZGCQkoMSA8PCA3KQorCXU4CVRFU1RSOworCXU4CXJlc2VydmVkXzlbMl07CisJdTgJUEdTRUxFQ1Q7CisJdTgJU0VDVVJJVFk7CisJdTMyCUFOQVBBUkFNMjsKKwl1OAlyZXNlcnZlZF8xMFsxMl07CisJdTE2CUJFQUNPTl9JTlRFUlZBTDsKKwl1MTYJQVRJTV9XTkQ7CisJdTE2CUJFQUNPTl9JTlRFUlZBTF9USU1FOworCXUxNglBVElNVFJfSU5URVJWQUw7CisJdTgJUEhZX0RFTEFZOworCXU4CUNBUlJJRVJfU0VOU0VfQ09VTlRFUjsKKwl1OAlyZXNlcnZlZF8xMVsyXTsKKwl1OAlQSFlbNF07CisJdTE2CVJGUGluc091dHB1dDsKKwl1MTYJUkZQaW5zRW5hYmxlOworCXUxNglSRlBpbnNTZWxlY3Q7CisJdTE2CVJGUGluc0lucHV0OworCXUzMglSRl9QQVJBOworCXUzMglSRl9USU1JTkc7CisJdTgJR1BfRU5BQkxFOworCXU4CUdQSU87CisJdTgJcmVzZXJ2ZWRfMTJbMl07CisJdTMyCUhTU0lfUEFSQTsKKwl1OAlyZXNlcnZlZF8xM1s0XTsKKwl1OAlUWF9BR0NfQ1RMOworI2RlZmluZSBSVEw4MThYX1RYX0FHQ19DVExfUEVSUEFDS0VUX0dBSU5fU0hJRlQJCSgxIDw8IDApCisjZGVmaW5lIFJUTDgxOFhfVFhfQUdDX0NUTF9QRVJQQUNLRVRfQU5UU0VMX1NISUZUCSgxIDw8IDEpCisjZGVmaW5lIFJUTDgxOFhfVFhfQUdDX0NUTF9GRUVEQkFDS19BTlQJCQkoMSA8PCAyKQorCXU4CVRYX0dBSU5fQ0NLOworCXU4CVRYX0dBSU5fT0ZETTsKKwl1OAlUWF9BTlRFTk5BOworCXU4CXJlc2VydmVkXzE0WzE2XTsKKwl1OAlXUEFfQ09ORjsKKwl1OAlyZXNlcnZlZF8xNVszXTsKKwl1OAlTSUZTOworCXU4CURJRlM7CisJdTgJU0xPVDsKKwl1OAlyZXNlcnZlZF8xNls1XTsKKwl1OAlDV19DT05GOworI2RlZmluZSBSVEw4MThYX0NXX0NPTkZfUEVSUEFDS0VUX0NXX1NISUZUCSgxIDw8IDApCisjZGVmaW5lIFJUTDgxOFhfQ1dfQ09ORl9QRVJQQUNLRVRfUkVUUllfU0hJRlQJKDEgPDwgMSkKKwl1OAlDV19WQUw7CisJdTgJUkFURV9GQUxMQkFDSzsKKyNkZWZpbmUgUlRMODE4WF9SQVRFX0ZBTExCQUNLX0VOQUJMRQkoMSA8PCA3KQorCXU4CUFDTV9DT05UUk9MOworCXU4CXJlc2VydmVkXzE3WzI0XTsKKwl1OAlDT05GSUc1OworCXU4CVRYX0RNQV9QT0xMSU5HOworCXU4CXJlc2VydmVkXzE4WzJdOworCXUxNglDV1I7CisJdTgJUkVUUllfQ1RSOworCXU4CXJlc2VydmVkXzE5WzNdOworCXUxNglJTlRfTUlHOworLyogUlRMODE4WF9SODE4N0JfKjogbWFnaWMgbnVtYmVycyBmcm9tIGlvcmVnaXN0ZXJzICovCisjZGVmaW5lIFJUTDgxOFhfUjgxODdCX0IJMAorI2RlZmluZSBSVEw4MThYX1I4MTg3Ql9ECTEKKyNkZWZpbmUgUlRMODE4WF9SODE4N0JfRQkyCisJdTMyCVJEU0FSOworCXUxNglUSURfQUNfTUFQOworCXU4CXJlc2VydmVkXzIwWzRdOworCXU4CUFOQVBBUkFNMzsKKwl1OAlyZXNlcnZlZF8yMVs1XTsKKwl1MTYJRkVNUjsKKwl1OAlyZXNlcnZlZF8yMls0XTsKKwl1MTYJVEFMTFlfQ05UOworCXU4CVRBTExZX1NFTDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTUFYX1JYX1NJWkUgSUVFRTgwMjExX01BWF9GUkFNRV9MRU4KKworI2RlZmluZSBSRl9QQVJBTV9BTkFMT0dQSFkJKDEgPDwgMCkKKyNkZWZpbmUgUkZfUEFSQU1fQU5UQkRFRkFVTFQJKDEgPDwgMSkKKyNkZWZpbmUgUkZfUEFSQU1fQ0FSUklFUlNFTlNFMQkoMSA8PCAyKQorI2RlZmluZSBSRl9QQVJBTV9DQVJSSUVSU0VOU0UyCSgxIDw8IDMpCisKKyNkZWZpbmUgQkJfQU5UQVRURU5fQ0hBTjE0CTB4MEMKKyNkZWZpbmUgQkJfQU5URU5OQV9CIAkJMHg0MAorCisjZGVmaW5lIEJCX0hPU1RfQkFORyAJCSgxIDw8IDMwKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfRU4gCSgxIDw8IDIpCisjZGVmaW5lIEJCX0hPU1RfQkFOR19DTEsgCSgxIDw8IDEpCisjZGVmaW5lIEJCX0hPU1RfQkFOR19EQVRBCTEKKworI2RlZmluZSBBTkFQQVJBTV9UWERBQ09GRl9TSElGVAkyNworI2RlZmluZSBBTkFQQVJBTV9QV1IwX1NISUZUCTI4CisjZGVmaW5lIEFOQVBBUkFNX1BXUjBfTUFTSyAJKDB4MDcgPDwgQU5BUEFSQU1fUFdSMF9TSElGVCkKKyNkZWZpbmUgQU5BUEFSQU1fUFdSMV9TSElGVAkyMAorI2RlZmluZSBBTkFQQVJBTV9QV1IxX01BU0sJKDB4N0YgPDwgQU5BUEFSQU1fUFdSMV9TSElGVCkKKworI2RlZmluZSBSVEw4MThYX1JYX1JJTkdfU0laRQk4IC8qIGRvZXNuJ3QgaGF2ZSB0byBiZSBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgUlRMODE4WF9UWF9SSU5HX1NJWkUJOCAvKiBub3IgdGhpcyBbYnV0IDJebiBpcyB2ZXJ5IHNsaWdodGx5IGZhc3Rlcl0gKi8KKyNkZWZpbmUgUlRMODE4WF9SSU5HX0FMSUdOCTI1NgorCisjZGVmaW5lIFJUTDgxOFhfTUFYX1JFVFJJRVMgICAgIDQKKworZW51bSBydGw4MTh4X3R4X2Rlc2NfZmxhZ3MgeworCVJUTDgxOFhfVFhfREVTQ19GTEFHX05PX0VOQwk9ICgxIDw8IDE1KSwKKwlSVEw4MThYX1RYX0RFU0NfRkxBR19UWF9PSwk9ICgxIDw8IDE1KSwKKwlSVEw4MThYX1RYX0RFU0NfRkxBR19TUExDUAk9ICgxIDw8IDE2KSwKKwlSVEw4MThYX1RYX0RFU0NfRkxBR19SWF9VTkRFUgk9ICgxIDw8IDE2KSwKKwlSVEw4MThYX1RYX0RFU0NfRkxBR19NT1JFRlJBRwk9ICgxIDw8IDE3KSwKKwlSVEw4MThYX1RYX0RFU0NfRkxBR19DVFMJPSAoMSA8PCAxOCksCisJUlRMODE4WF9UWF9ERVNDX0ZMQUdfUlRTCT0gKDEgPDwgMjMpLAorCVJUTDgxOFhfVFhfREVTQ19GTEFHX0xTCQk9ICgxIDw8IDI4KSwKKwlSVEw4MThYX1RYX0RFU0NfRkxBR19GUwkJPSAoMSA8PCAyOSksCisJUlRMODE4WF9UWF9ERVNDX0ZMQUdfRE1BCT0gKDEgPDwgMzApLAorCVJUTDgxOFhfVFhfREVTQ19GTEFHX09XTgk9ICgxIDw8IDMxKQorfTsKKworc3RydWN0IHJ0bDgxOHhfdHhfZGVzYyB7CisJdTMyIGZsYWdzOworCXUxNiBydHNfZHVyYXRpb247CisJdTE2IHBsY3BfbGVuOworCXUzMiB0eF9idWY7CisJdTMyIGZyYW1lX2xlbjsKKwl1MzIgbmV4dF90eF9kZXNjOworCXU4IGN3OworCXU4IHJldHJ5X2xpbWl0OworCXU4IGFnYzsKKwl1OCBmbGFnczI7CisJdTMyIHJlc2VydmVkWzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gcnRsODE4eF9yeF9kZXNjX2ZsYWdzIHsKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19JQ1ZfRVJSCT0gKDEgPDwgMTIpLAorCVJUTDgxOFhfUlhfREVTQ19GTEFHX0NSQzMyX0VSUgk9ICgxIDw8IDEzKSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19QTQkJPSAoMSA8PCAxNCksCisJUlRMODE4WF9SWF9ERVNDX0ZMQUdfUlhfRVJSCT0gKDEgPDwgMTUpLAorCVJUTDgxOFhfUlhfREVTQ19GTEFHX0JDQVNUCT0gKDEgPDwgMTYpLAorCVJUTDgxOFhfUlhfREVTQ19GTEFHX1BBTQk9ICgxIDw8IDE3KSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19NQ0FTVAk9ICgxIDw8IDE4KSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19RT1MJPSAoMSA8PCAxOSksIC8qIFJUTDgxODcoQikgb25seSAqLworCVJUTDgxOFhfUlhfREVTQ19GTEFHX1RSU1cJPSAoMSA8PCAyNCksIC8qIFJUTDgxODcoQikgb25seSAqLworCVJUTDgxOFhfUlhfREVTQ19GTEFHX1NQTENQCT0gKDEgPDwgMjUpLAorCVJUTDgxOFhfUlhfREVTQ19GTEFHX0ZPRgk9ICgxIDw8IDI2KSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19ETUFfRkFJTAk9ICgxIDw8IDI3KSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19MUwkJPSAoMSA8PCAyOCksCisJUlRMODE4WF9SWF9ERVNDX0ZMQUdfRlMJCT0gKDEgPDwgMjkpLAorCVJUTDgxOFhfUlhfREVTQ19GTEFHX0VPUgk9ICgxIDw8IDMwKSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19PV04JPSAoMSA8PCAzMSkKK307CisKK3N0cnVjdCBydGw4MTh4X3J4X2Rlc2MgeworCXUzMiBmbGFnczsKKwl1MzIgZmxhZ3MyOworCXVuaW9uIHsKKwkJdTMyIHJ4X2J1ZjsKKwkJdTY0IHRzZnQ7CisJfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgcnRsODE4eF9wcml2IHsKKwlzdHJ1Y3QgcnRsODE4eF9jc3IgKm1hcDsKKwljb25zdCBzdHJ1Y3QgcnRsODE4eF9yZl9vcHMgKnJmOworCWludCByZl9mbGFnOyAvKiB3aGF0ZXZlciBSRiBkcml2ZXIgd2lzaGVzIHRvIHVzZSBpdCBmb3IgKi8KKwlpbnQgaHdfcmF0ZTsKKwlpbnQgaHdfcnRzY3RzX3JhdGU7CisKKwlzdHJ1Y3Qgc3BpX2JpdF9iYXNoZXIgc3BpYml0OworCXN0cnVjdCBzcGlfZGV2aWNlIGVlcHJvbTsKKworCXN0cnVjdCBydGw4MTh4X3J4X2Rlc2MgKnJ4X3Jpbmc7CisJdTMyIHJ4X3JpbmdfZG1hOworCXVuc2lnbmVkIGludCByeF9pZHg7CS8qIG5leHQgZGVzYyB0byBiZSBmaWxsZWQgYnkgY2FyZCAqLworCXN0cnVjdCBpb19idWZmZXIgKnJ4X2J1ZltSVEw4MThYX1JYX1JJTkdfU0laRV07CisKKwlzdHJ1Y3QgcnRsODE4eF90eF9kZXNjICp0eF9yaW5nOworCXUzMiB0eF9yaW5nX2RtYTsKKwl1bnNpZ25lZCBpbnQgdHhfY29uczsJLyogbmV4dCBkZXNjIHRvIGJlIGZpbGxlZCBieSBjYXJkICovCisJdW5zaWduZWQgaW50IHR4X3Byb2Q7CS8qIG5leHQgZGVzYyB0byBiZSBmaWxsZWQgYnkgZHJpdmVyICovCisJc3RydWN0IGlvX2J1ZmZlciAqdHhfYnVmW1JUTDgxOFhfVFhfUklOR19TSVpFXTsKKworCXN0cnVjdCBwY2lfZGV2aWNlICpwZGV2OworCXUzMiByeF9jb25mOworCisJdTE2IHR4cG93ZXJbMTRdOworCisJaW50IHI4MTg1OworCXUzMiBhbmFwYXJhbTsKKwl1MTYgcmZwYXJhbTsKKwl1OCBjc3RocmVzaG9sZDsKK307CisKK3ZvaWQgcnRsODE4eF93cml0ZV9waHkoc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCB1OCBhZGRyLCB1MzIgZGF0YSk7Cit2b2lkIHJ0bDgxOHhfc2V0X2FuYXBhcmFtKHN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYsIHUzMiBhbmFwYXJhbSk7CisKK3N0YXRpYyBpbmxpbmUgdTggcnRsODE4eF9pb3JlYWQ4KHN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgX191bnVzZWQsIHU4ICphZGRyKQoreworCXJldHVybiBpbmIoYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHJ0bDgxOHhfaW9yZWFkMTYoc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiBfX3VudXNlZCwgdTE2ICphZGRyKQoreworCXJldHVybiBpbncoYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ0bDgxOHhfaW9yZWFkMzIoc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiBfX3VudXNlZCwgdTMyICphZGRyKQoreworCXJldHVybiBpbmwoYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTh4X2lvd3JpdGU4KHN0cnVjdCBydGw4MTh4X3ByaXYgKnByaXYgX191bnVzZWQsCisJCQkJICAgIHU4ICphZGRyLCB1OCB2YWwpCit7CisJb3V0Yih2YWwsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsODE4eF9pb3dyaXRlMTYoc3RydWN0IHJ0bDgxOHhfcHJpdiAqcHJpdiBfX3VudXNlZCwKKwkJCQkgICAgIHUxNiAqYWRkciwgdTE2IHZhbCkKK3sKKwlvdXR3KHZhbCwgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTh4X2lvd3JpdGUzMihzdHJ1Y3QgcnRsODE4eF9wcml2ICpwcml2IF9fdW51c2VkLAorCQkJCSAgICAgdTMyICphZGRyLCB1MzIgdmFsKQoreworCW91dGwodmFsLCBhZGRyKTsKK30KKworI2RlZmluZSBSVEw4MThYX1JGX0RSSVZFUlMgX190YWJsZShzdHJ1Y3QgcnRsODE4eF9yZl9vcHMsICJydGw4MTh4X3JmX2RyaXZlcnMiKQorI2RlZmluZSBfX3J0bDgxOHhfcmZfZHJpdmVyIF9fdGFibGVfZW50cnkoUlRMODE4WF9SRl9EUklWRVJTLCAwMSkKKworc3RydWN0IHJ0bDgxOHhfcmZfb3BzIHsKKwljaGFyICpuYW1lOworCXU4IGlkOwkJCS8qIGFzIGlkZW50aWZpZWQgaW4gRUVQUk9NICovCisJdm9pZCAoKmluaXQpKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0b3ApKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldik7CisJdm9pZCAoKnNldF9jaGFuKShzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsICpjaGFuKTsKKwl2b2lkICgqY29uZl9lcnApKHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldik7IC8qIHNldCBiYXNlZCBvbiBkZXYtPmVycF9mbGFncyAqLworfTsKKworI2VuZGlmIC8qIFJUTDgxOFhfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc2lzMTkwLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9zaXMxOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDAxNDVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc2lzMTkwLmMKQEAgLTAsMCArMSwxMTc5IEBACisvKgorICAgc2lzMTkwLmM6IFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIFNpUzE5MCBldGhlcm5ldCBkcml2ZXIKKworICAgQ29weXJpZ2h0IChjKSAyMDAzIEsuTS4gTGl1IDxrbWxpdUBzaXMuY29tPgorICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKyAgIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSBGcmFuY29pcyBSb21pZXUgPHJvbWlldUBmci56b3JlaWwuY29tPgorCisgICBNb2RpZmllZCBmb3IgZ1BYRSAyMDA5IGJ5IFRob21hcyBNaWxldGljaCA8dGhvbWFzLm1pbGV0aWNoQGdtYWlsLmNvbT4KKworICAgQmFzZWQgb24gcjgxNjkuYywgdGczLmMsIDgxMzljcC5jLCBza2dlLmMsIGVwaWMxMDAuYyBhbmQgU2lTIDE5MC8xOTEKKyAgIGdlbnVpbmUgZHJpdmVyLgorCisgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorICAgcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorICAgYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKyAgIHN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTF9BTlkgKTsKKworI2luY2x1ZGUgInNpczE5MC5oIgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2lzMTkwX3BjaV90YmxbXSA9IHsKKwlQQ0lfUk9NICgweDEwMzksIDB4MDE5MCwgInNpczE5MCIsICJzaXMxOTAiLCAwKSwKKwlQQ0lfUk9NICgweDEwMzksIDB4MDE5MSwgInNpczE5MSIsICJzaXMxOTEiLCAwKSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKiogSEFDSyB0byBrZWVwIElTQSBicmlkZ2UgaW4gdGhlIFBDSSBkZXZpY2UgbGlzdCAqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNvbWUgc2lzMTkwIHZhcmlhbnRzIHN0b3JlIHRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgQklPUyBDTU9TLiBUbyByZWFkIGl0LCB3ZQorICogaGF2ZSB0byB1c2UgYSBQQ0kgdG8gSVNBIGJyaWRnZS4gVG8gYWNjZXNzIHRoZSBicmlkZ2Ugd2UgbmVlZCBhIGZldyB0aGluZ3MKKyAqIGZyb20gaXQncyBzdHJ1Y3QgcGNpX2RldmljZS4gV2UgZmFrZSB0aGUgc3VjY2Vzc2Z1bCBwcm9iZSBvZiBhIGRyaXZlciB0bworICoga2VlcCB0aGUgYnJpZGdlJ3Mgc3RydWN0IHBjaV9kZXZpY2UgaW4gdGhlIGxpc3Qgb2YgcGNpX2RldmljZXMuCisgKiBTZWUgZGV0YWlscyBpbiBzaXMxOTBfZ2V0X21hY19hZGRyX2Zyb21fYXBjKCkuCisgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNpczE5MF9pc2FfYnJpZGdlX3RibFtdID0geworCVBDSV9JRCAoMHgxMDM5LCAweDA5NjUsICIiLCAiIiwgMCksCisJUENJX0lEICgweDEwMzksIDB4MDk2NiwgIiIsICIiLCAwKSwKKwlQQ0lfSUQgKDB4MTAzOSwgMHgwOTY4LCAiIiwgIiIsIDApLAorfTsKKworc3RhdGljIGludCBzaXMxOTBfaXNhX2JyaWRnZV9wcm9iZShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiBfX3VudXNlZCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50IF9fdW51c2VkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfaXNhX2JyaWRnZV9yZW1vdmUoc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYgX191bnVzZWQpCit7CisJcmV0dXJuOworfQorCitzdHJ1Y3QgcGNpX2RyaXZlciBzaXMxOTBfaXNhX2JyaWRnZV9kcml2ZXIgX19wY2lfZHJpdmVyID0geworCS5pZHMJCT0gc2lzMTkwX2lzYV9icmlkZ2VfdGJsLAorCS5pZF9jb3VudAk9IChzaXplb2Yoc2lzMTkwX2lzYV9icmlkZ2VfdGJsKSAvCisJICAgICAgICAgICAgICAgICAgIHNpemVvZihzaXMxOTBfaXNhX2JyaWRnZV90YmxbMF0pKSwKKwkucHJvYmUJCT0gc2lzMTkwX2lzYV9icmlkZ2VfcHJvYmUsCisJLnJlbW92ZQkJPSBzaXMxOTBfaXNhX2JyaWRnZV9yZW1vdmUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogPC9IQUNLPiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3QgdTMyIHNpczE5MF9pbnRyX21hc2sgPQorCVJ4UUVtcHR5IHwgUnhRSW50IHwgVHhRMUludCB8IFR4UTBJbnQgfCBSeEhhbHQgfCBUeEhhbHQgfCBMaW5rQ2hhbmdlOworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiBSeC1hbGwtbXVsdGljYXN0KS4KKyAqIFRoZSBjaGlwcyB1c2UgYSA2NCBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4KKyAqLworc3RhdGljIGNvbnN0IGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKK3N0YXRpYyB2b2lkIF9fbWRpb19jbWQodm9pZCAqaW9hZGRyLCB1MzIgY3RsKQoreworCXVuc2lnbmVkIGludCBpOworCisJU0lTX1czMihHTUlJQ29udHJvbCwgY3RsKTsKKworCW1kZWxheSgxKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoIShTSVNfUjMyKEdNSUlDb250cm9sKSAmIEVobk1JSW5vdERvbmUpKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9CisKKwlpZiAoaSA+IDk5KQorCQlEQkcoInNpczE5MDogUEhZIGNvbW1hbmQgdGltZWQgb3V0ICFcbiIpOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHZvaWQgKmlvYWRkciwgaW50IHBoeV9pZCwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlfX21kaW9fY21kKGlvYWRkciwgRWhuTUlJcmVxIHwgRWhuTUlJd3JpdGUgfAorCQkoKCh1MzIpIHJlZykgPDwgRWhuTUlJcmVnU2hpZnQpIHwgKHBoeV9pZCA8PCBFaG5NSUlwbWRTaGlmdCkgfAorCQkoKCh1MzIpIHZhbCkgPDwgRWhuTUlJZGF0YVNoaWZ0KSk7Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHZvaWQgKmlvYWRkciwgaW50IHBoeV9pZCwgaW50IHJlZykKK3sKKwlfX21kaW9fY21kKGlvYWRkciwgRWhuTUlJcmVxIHwgRWhuTUlJcmVhZCB8CisJCSgoKHUzMikgcmVnKSA8PCBFaG5NSUlyZWdTaGlmdCkgfCAocGh5X2lkIDw8IEVobk1JSXBtZFNoaWZ0KSk7CisKKwlyZXR1cm4gKHUxNikgKFNJU19SMzIoR01JSUNvbnRyb2wpID4+IEVobk1JSWRhdGFTaGlmdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnLCBpbnQgdmFsKQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbWRpb193cml0ZSh0cC0+bW1pb19hZGRyLCBwaHlfaWQsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBfX21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnKQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIG1kaW9fcmVhZCh0cC0+bW1pb19hZGRyLCBwaHlfaWQsIHJlZyk7Cit9CisKK3N0YXRpYyB1MTYgbWRpb19yZWFkX2xhdGNoZWQodm9pZCAqaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgcmVnKQoreworCW1kaW9fcmVhZChpb2FkZHIsIHBoeV9pZCwgcmVnKTsKKwlyZXR1cm4gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCByZWcpOworfQorCitzdGF0aWMgdTE2IHNpczE5MF9yZWFkX2VlcHJvbSh2b2lkICppb2FkZHIsIHUzMiByZWcpCit7CisJdTE2IGRhdGEgPSAweGZmZmY7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIShTSVNfUjMyKFJPTUNvbnRyb2wpICYgMHgwMDAyKSkKKwkJcmV0dXJuIDA7CisKKwlTSVNfVzMyKFJPTUludGVyZmFjZSwgRUVSRVEgfCBFRVJPUCB8IChyZWcgPDwgMTApKTsKKworCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworCQlpZiAoIShTSVNfUjMyKFJPTUludGVyZmFjZSkgJiBFRVJFUSkpIHsKKwkJCWRhdGEgPSAoU0lTX1IzMihST01JbnRlcmZhY2UpICYgMHhmZmZmMDAwMCkgPj4gMTY7CisJCQlicmVhazsKKwkJfQorCQltZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9pcnFfbWFza19hbmRfYWNrKHZvaWQgKmlvYWRkcikKK3sKKwlTSVNfVzMyKEludHJNYXNrLCAweDAwKTsKKwlTSVNfVzMyKEludHJTdGF0dXMsIDB4ZmZmZmZmZmYpOworCVNJU19QQ0lfQ09NTUlUKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9hc2ljX2Rvd24odm9pZCAqaW9hZGRyKQoreworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggRE1BIHByb2Nlc3Nlcy4gKi8KKworCVNJU19XMzIoVHhDb250cm9sLCAweDFhMDApOworCVNJU19XMzIoUnhDb250cm9sLCAweDFhMDApOworCisJc2lzMTkwX2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpczE5MF9tYXJrX2FzX2xhc3RfZGVzY3JpcHRvcihzdHJ1Y3QgUnhEZXNjICpkZXNjKQoreworCWRlc2MtPnNpemUgfD0gY3B1X3RvX2xlMzIoUmluZ0VuZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaXMxOTBfZ2l2ZV90b19hc2ljKHN0cnVjdCBSeERlc2MgKmRlc2MpCit7CisJdTMyIGVvciA9IGxlMzJfdG9fY3B1KGRlc2MtPnNpemUpICYgUmluZ0VuZDsKKworCWRlc2MtPlBTaXplID0gMHgwOworCWRlc2MtPnNpemUgPSBjcHVfdG9fbGUzMigoUlhfQlVGX1NJWkUgJiBSWF9CVUZfTUFTSykgfCBlb3IpOworCXdtYigpOworCWRlc2MtPnN0YXR1cyA9IGNwdV90b19sZTMyKE9XTmJpdCB8IElOVGJpdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaXMxOTBfbWFwX3RvX2FzaWMoc3RydWN0IFJ4RGVzYyAqZGVzYywgdTMyIG1hcHBpbmcpCit7CisJZGVzYy0+YWRkciA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCXNpczE5MF9naXZlX3RvX2FzaWMoZGVzYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaXMxOTBfbWFrZV91bnVzYWJsZV9ieV9hc2ljKHN0cnVjdCBSeERlc2MgKmRlc2MpCit7CisJZGVzYy0+UFNpemUgPSAweDA7CisJZGVzYy0+YWRkciA9IGNwdV90b19sZTMyKDB4ZGVhZGJlZWYpOworCWRlc2MtPnNpemUgJj0gY3B1X3RvX2xlMzIoUmluZ0VuZCk7CisJd21iKCk7CisJZGVzYy0+c3RhdHVzID0gMHgwOworfQorCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqc2lzMTkwX2FsbG9jX3J4X2lvYihzdHJ1Y3QgUnhEZXNjICpkZXNjKQoreworCXN0cnVjdCBpb19idWZmZXIgKmlvYjsKKworCWlvYiA9IGFsbG9jX2lvYihSWF9CVUZfU0laRSk7CisJaWYgKGlvYikgeworCQl1MzIgbWFwcGluZzsKKworCQltYXBwaW5nID0gdmlydF90b19idXMoaW9iLT5kYXRhKTsKKwkJc2lzMTkwX21hcF90b19hc2ljKGRlc2MsIG1hcHBpbmcpOworCX0gZWxzZSB7CisJCURCRygic2lzMTkwOiBhbGxvY19pb2IgZmFpbGVkXG4iKTsKKwkJc2lzMTkwX21ha2VfdW51c2FibGVfYnlfYXNpYyhkZXNjKTsKKwl9CisKKwlyZXR1cm4gaW9iOworfQorCitzdGF0aWMgdTMyIHNpczE5MF9yeF9maWxsKHN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAsIHUzMiBzdGFydCwgdTMyIGVuZCkKK3sKKwl1MzIgY3VyOworCisJZm9yIChjdXIgPSBzdGFydDsgY3VyIDwgZW5kOyBjdXIrKykgeworCQl1bnNpZ25lZCBpbnQgaSA9IGN1ciAlIE5VTV9SWF9ERVNDOworCisJCWlmICh0cC0+UnhfaW9idWZbaV0pCisJCQljb250aW51ZTsKKworCQl0cC0+UnhfaW9idWZbaV0gPSBzaXMxOTBfYWxsb2NfcnhfaW9iKHRwLT5SeERlc2NSaW5nICsgaSk7CisKKwkJaWYgKCF0cC0+UnhfaW9idWZbaV0pCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGN1ciAtIHN0YXJ0OworfQorCitzdGF0aWMgaW5saW5lIGludCBzaXMxOTBfcnhfcGt0X2Vycih1MzIgc3RhdHVzKQoreworI2RlZmluZSBFcnJNYXNrCShPVlJVTiB8IFNIT1JUIHwgTElNSVQgfCBNSUlFUiB8IE5JQk9OIHwgQ09MT04gfCBBQk9SVCkKKworCWlmICgoc3RhdHVzICYgQ1JDT0spICYmICEoc3RhdHVzICYgRXJyTWFzaykpCisJCXJldHVybiAwOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNpczE5MF9wcm9jZXNzX3J4KHN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHApCit7CisJdTMyIHJ4X2xlZnQsIGN1cl9yeCA9IHRwLT5jdXJfcng7CisJdTMyIGRlbHRhLCBjb3VudDsKKworCXJ4X2xlZnQgPSBOVU1fUlhfREVTQyArIHRwLT5kaXJ0eV9yeCAtIGN1cl9yeDsKKworCWZvciAoOyByeF9sZWZ0ID4gMDsgcnhfbGVmdC0tLCBjdXJfcngrKykgeworCQl1bnNpZ25lZCBpbnQgZW50cnkgPSBjdXJfcnggJSBOVU1fUlhfREVTQzsKKwkJc3RydWN0IFJ4RGVzYyAqZGVzYyA9IHRwLT5SeERlc2NSaW5nICsgZW50cnk7CisJCXUzMiBzdGF0dXM7CisKKwkJaWYgKGxlMzJfdG9fY3B1KGRlc2MtPnN0YXR1cykgJiBPV05iaXQpCisJCQlicmVhazsKKworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdShkZXNjLT5QU2l6ZSk7CisKKwkJaWYgKHNpczE5MF9yeF9wa3RfZXJyKHN0YXR1cykgPCAwKSB7CisJCQlzaXMxOTBfZ2l2ZV90b19hc2ljKGRlc2MpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gdHAtPlJ4X2lvYnVmW2VudHJ5XTsKKwkJCXVuc2lnbmVkIGludCBwa3Rfc2l6ZSA9IChzdGF0dXMgJiBSeFNpemVNYXNrKSAtIDQ7CisKKwkJCWlmIChwa3Rfc2l6ZSA+IFJYX0JVRl9TSVpFKSB7CisJCQkJREJHKCJzaXMxOTA6IChmcmFnKSBzdGF0dXMgPSAlMDh4LlxuIiwgc3RhdHVzKTsKKwkJCQlzaXMxOTBfZ2l2ZV90b19hc2ljKGRlc2MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzaXMxOTBfbWFrZV91bnVzYWJsZV9ieV9hc2ljKGRlc2MpOworCisJCQlpb2JfcHV0KGlvYiwgcGt0X3NpemUpOworCisJCQlEQkcyKCJzaXMxOTA6IHJlY2VpdmVkIHBhY2tldC4gbGVuOiAlZFxuIiwgcGt0X3NpemUpOworCQkJbmV0ZGV2X3J4KHRwLT5kZXYsIGlvYik7CisJCQlEQkdJT19IRChpb2ItPmRhdGEsIDYwKTsKKwkJCXRwLT5SeF9pb2J1ZltlbnRyeV0gPSBOVUxMOworCQl9CisJfQorCWNvdW50ID0gY3VyX3J4IC0gdHAtPmN1cl9yeDsKKwl0cC0+Y3VyX3J4ID0gY3VyX3J4OworCisJZGVsdGEgPSBzaXMxOTBfcnhfZmlsbCh0cCwgdHAtPmRpcnR5X3J4LCB0cC0+Y3VyX3J4KTsKKwlpZiAoIWRlbHRhICYmIGNvdW50KQorCQlEQkcoInNpczE5MDogbm8gUnggYnVmZmVyIGFsbG9jYXRlZC5cbiIpOworCXRwLT5kaXJ0eV9yeCArPSBkZWx0YTsKKworCWlmICgoKHRwLT5kaXJ0eV9yeCArIE5VTV9SWF9ERVNDKSA9PSB0cC0+Y3VyX3J4KSkKKwkJREJHKCJzaXMxOTA6IFJ4IGJ1ZmZlcnMgZXhoYXVzdGVkLlxuIik7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpczE5MF90eF9wa3RfZXJyKHUzMiBzdGF0dXMpCit7CisjZGVmaW5lIFR4RXJyTWFzayAoV05EIHwgVEFCUlQgfCBGSUZPIHwgTElOSykKKworCWlmICghKHN0YXR1cyAmIFR4RXJyTWFzaykpCisJCXJldHVybiAwOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfcHJvY2Vzc190eChzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwKQoreworCXUzMiBwZW5kaW5nLCBkaXJ0eV90eCA9IHRwLT5kaXJ0eV90eDsKKworCXBlbmRpbmcgPSB0cC0+Y3VyX3R4IC0gZGlydHlfdHg7CisKKwlmb3IgKDsgcGVuZGluZzsgcGVuZGluZy0tLCBkaXJ0eV90eCsrKSB7CisJCXVuc2lnbmVkIGludCBlbnRyeSA9IGRpcnR5X3R4ICUgTlVNX1RYX0RFU0M7CisJCXN0cnVjdCBUeERlc2MgKnR4ZCA9IHRwLT5UeERlc2NSaW5nICsgZW50cnk7CisJCXUzMiBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0eGQtPnN0YXR1cyk7CisJCXN0cnVjdCBpb19idWZmZXIgKmlvYjsKKworCQlpZiAoc3RhdHVzICYgT1dOYml0KQorCQkJYnJlYWs7CisKKwkJaW9iID0gdHAtPlR4X2lvYnVmW2VudHJ5XTsKKworCQlpZiAoIWlvYikKKwkJCWJyZWFrOworCisJCWlmIChzaXMxOTBfdHhfcGt0X2VycihzdGF0dXMpID09IDApIHsKKwkJCURCRzIoInNpczE5MDogVHJhbnNtaXR0ZWQgcGFja2V0OiAlIzA4eFxuIiwgc3RhdHVzKTsKKwkJCW5ldGRldl90eF9jb21wbGV0ZSh0cC0+ZGV2LCBpb2IpOworCQl9IGVsc2UgeworCQkJREJHKCJzaXMxOTA6IFRyYW5zbWl0IGVycm9yOiAlIzA4eFxuIiwgc3RhdHVzKTsKKwkJCW5ldGRldl90eF9jb21wbGV0ZV9lcnIodHAtPmRldiwgaW9iLCAtRUlOVkFMKTsKKwkJfQorCisJCXRwLT5UeF9pb2J1ZltlbnRyeV0gPSBOVUxMOworCX0KKworCWlmICh0cC0+ZGlydHlfdHggIT0gZGlydHlfdHgpCisJCXRwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworfQorCisvKgorICogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwIGFmdGVyCisgKiB0aGUgVHggdGhyZWFkLgorICovCitzdGF0aWMgdm9pZCBzaXMxOTBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBTSVNfUjMyKEludHJTdGF0dXMpOworCisJaWYgKChzdGF0dXMgPT0gMHhmZmZmZmZmZikgfHwgIXN0YXR1cykKKwkJcmV0dXJuOworCisJU0lTX1czMihJbnRyU3RhdHVzLCBzdGF0dXMpOworCisJLyogc2lzMTkwX3BoeV90YXNrKCkgbmVlZHMgdG8gYmUgY2FsbGVkIGluIGV2ZW50IG9mIGEgTGlua0NoYW5nZSBhbmQKKwkgKiBhZnRlciBhdXRvLW5lZ290aWF0aW9uIGlzIGZpbmlzaGVkLiBGaW5pc2hpbmcgYXV0by1uZWcgd29uJ3QgZ2VuZXJhdGUKKwkgKiBhbnkgaW5kaWNhdGlvbiwgaGVuY2Ugd2UgY2FsbCBpdCBldmVyeSB0aW1lIGlmIHRoZSBsaW5rIGlzIGJhZC4gKi8KKwlpZiAoKHN0YXR1cyAmIExpbmtDaGFuZ2UpIHx8ICFuZXRkZXZfbGlua19vayhkZXYpKQorCQlzaXMxOTBfcGh5X3Rhc2sodHApOworCisJaWYgKHN0YXR1cyAmIFJ4UUludCkKKwkJc2lzMTkwX3Byb2Nlc3NfcngodHApOworCisJaWYgKHN0YXR1cyAmIFR4UTBJbnQpCisJCXNpczE5MF9wcm9jZXNzX3R4KHRwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpczE5MF9pbml0X3JpbmdfaW5kZXhlcyhzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwKQoreworCXRwLT5kaXJ0eV90eCA9IHRwLT5kaXJ0eV9yeCA9IHRwLT5jdXJfdHggPSB0cC0+Y3VyX3J4ID0gMDsKK30KKworc3RhdGljIGludCBzaXMxOTBfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzaXMxOTBfaW5pdF9yaW5nX2luZGV4ZXModHApOworCisJbWVtc2V0KHRwLT5UeF9pb2J1ZiwgMCwgTlVNX1RYX0RFU0MgKiBzaXplb2Yoc3RydWN0IGlvX2J1ZmZlciAqKSk7CisJbWVtc2V0KHRwLT5SeF9pb2J1ZiwgMCwgTlVNX1JYX0RFU0MgKiBzaXplb2Yoc3RydWN0IGlvX2J1ZmZlciAqKSk7CisKKwlpZiAoc2lzMTkwX3J4X2ZpbGwodHAsIDAsIE5VTV9SWF9ERVNDKSAhPSBOVU1fUlhfREVTQykKKwkJZ290byBlcnI7CisKKwlzaXMxOTBfbWFya19hc19sYXN0X2Rlc2NyaXB0b3IodHAtPlJ4RGVzY1JpbmcgKyBOVU1fUlhfREVTQyAtIDEpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlzaXMxOTBfZnJlZShkZXYpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUzMiBtY19maWx0ZXJbMl07CS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCXUxNiByeF9tb2RlOworCisJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5cyB8IEFjY2VwdE11bHRpY2FzdDsKKwltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCisJU0lTX1cxNihSeE1hY0NvbnRyb2wsIHJ4X21vZGUgfCAweDIpOworCVNJU19XMzIoUnhIYXNoVGFibGUsIG1jX2ZpbHRlclswXSk7CisJU0lTX1czMihSeEhhc2hUYWJsZSArIDQsIG1jX2ZpbHRlclsxXSk7CisKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3NvZnRfcmVzZXQodm9pZCAgKmlvYWRkcikKK3sKKwlTSVNfVzMyKEludHJDb250cm9sLCAweDgwMDApOworCVNJU19QQ0lfQ09NTUlUKCk7CisJU0lTX1czMihJbnRyQ29udHJvbCwgMHgwKTsKKwlzaXMxOTBfYXNpY19kb3duKGlvYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9od19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisKKwlzaXMxOTBfc29mdF9yZXNldChpb2FkZHIpOworCisJU0lTX1czMihUeERlc2NTdGFydEFkZHIsIHRwLT50eF9kbWEpOworCVNJU19XMzIoUnhEZXNjU3RhcnRBZGRyLCB0cC0+cnhfZG1hKTsKKworCVNJU19XMzIoSW50clN0YXR1cywgMHhmZmZmZmZmZik7CisJU0lTX1czMihJbnRyTWFzaywgMHgwKTsKKwlTSVNfVzMyKEdNSUlDb250cm9sLCAweDApOworCVNJU19XMzIoVHhNYWNDb250cm9sLCAweDYwKTsKKwlTSVNfVzE2KFJ4TWFjQ29udHJvbCwgMHgwMik7CisJU0lTX1czMihSeEhhc2hUYWJsZSwgMHgwKTsKKwlTSVNfVzMyKDB4NmMsIDB4MCk7CisJU0lTX1czMihSeFdvbEN0cmwsIDB4MCk7CisJU0lTX1czMihSeFdvbERhdGEsIDB4MCk7CisKKwlTSVNfUENJX0NPTU1JVCgpOworCisJc2lzMTkwX3NldF9yeF9tb2RlKGRldik7CisKKwlTSVNfVzMyKFR4Q29udHJvbCwgMHgxYTAwIHwgQ21kVHhFbmIpOworCVNJU19XMzIoUnhDb250cm9sLCAweDFhMWQpOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfcGh5X3Rhc2soc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPmRldjsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCBwaHlfaWQgPSB0cC0+bWlpX2lmLnBoeV9pZDsKKwlpbnQgY250ID0gMDsKKwl1MTYgdmFsOworCisJdmFsID0gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCBNSUlfQk1DUik7CisKKwkvKiAxMDBtcyB0aW1lb3V0IGlzIGNvbXBsZXRlbHkgYXJiaXRyYXJ5LiBJIGhhdmUgbm8gZGF0YXNoZWV0IHRvCisJICogY2hlY2sgd2hldGhlciB0aGF0J3MgYSBzZW5zaWJsZSB2YWx1ZSBvciBub3QuCisJICovCisJd2hpbGUgKCh2YWwgJiBCTUNSX1JFU0VUKSAmJiAoY250IDwgMTAwKSkgeworCQl2YWwgPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHlfaWQsIE1JSV9CTUNSKTsKKwkJbWRlbGF5KDEpOworCQljbnQrKzsKKwl9CisKKwlpZiAoY250ID4gOTkpIHsKKwkJREJHKCJzaXMxOTA6IEJNQ1JfUkVTRVQgdGltZW91dFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShtZGlvX3JlYWRfbGF0Y2hlZChpb2FkZHIsIHBoeV9pZCwgTUlJX0JNU1IpICYKKwkJICAgICBCTVNSX0FORUdDT01QTEVURSkpIHsKKwkJREJHKCJzaXMxOTA6IGF1dG8tbmVnb3RpYXRpbmcuLi5cbiIpOworCQluZXRkZXZfbGlua19kb3duKGRldik7CisJfSBlbHNlIHsKKwkJLyogUmVqb2ljZSAhICovCisJCXN0cnVjdCB7CisJCQlpbnQgdmFsOworCQkJdTMyIGN0bDsKKwkJCWNvbnN0IGNoYXIgKm1zZzsKKwkJfSByZWczMVtdID0geworCQkJeyBMUEFfMTAwMEZVTEwsIDB4MDcwMDBjMDAgfCAweDAwMDAxMDAwLAorCQkJCSIxMDAwIE1icHMgRnVsbCBEdXBsZXgiIH0sCisJCQl7IExQQV8xMDAwSEFMRiwgMHgwNzAwMGMwMCwKKwkJCQkiMTAwMCBNYnBzIEhhbGYgRHVwbGV4IiB9LAorCQkJeyBMUEFfMTAwRlVMTCwgMHgwNDAwMDgwMCB8IDB4MDAwMDEwMDAsCisJCQkJIjEwMCBNYnBzIEZ1bGwgRHVwbGV4IiB9LAorCQkJeyBMUEFfMTAwSEFMRiwgMHgwNDAwMDgwMCwKKwkJCQkiMTAwIE1icHMgSGFsZiBEdXBsZXgiIH0sCisJCQl7IExQQV8xMEZVTEwsIDB4MDQwMDA0MDAgfCAweDAwMDAxMDAwLAorCQkJCSIxMCBNYnBzIEZ1bGwgRHVwbGV4IiB9LAorCQkJeyBMUEFfMTBIQUxGLCAweDA0MDAwNDAwLAorCQkJCSIxMCBNYnBzIEhhbGYgRHVwbGV4IiB9LAorCQkJeyAwLCAweDA0MDAwNDAwLCAidW5rbm93biIgfQorCQl9LCAqcCA9IE5VTEw7CisJCXUxNiBhZHYsIGF1dG9leHAsIGdpZ2FkdiwgZ2lncmVjOworCisJCXZhbCA9IG1kaW9fcmVhZChpb2FkZHIsIHBoeV9pZCwgMHgxZik7CisKKwkJdmFsID0gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCBNSUlfTFBBKTsKKwkJYWR2ID0gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCBNSUlfQURWRVJUSVNFKTsKKworCQlhdXRvZXhwID0gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCBNSUlfRVhQQU5TSU9OKTsKKworCQlpZiAodmFsICYgTFBBX05QQUdFICYmIGF1dG9leHAgJiBFWFBBTlNJT05fTldBWSkgeworCQkJLyogY2hlY2sgZm9yIGdpZ2FiaXQgc3BlZWQgKi8KKwkJCWdpZ2FkdiA9IG1kaW9fcmVhZChpb2FkZHIsIHBoeV9pZCwgTUlJX0NUUkwxMDAwKTsKKwkJCWdpZ3JlYyA9IG1kaW9fcmVhZChpb2FkZHIsIHBoeV9pZCwgTUlJX1NUQVQxMDAwKTsKKwkJCXZhbCA9IChnaWdhZHYgJiAoZ2lncmVjID4+IDIpKTsKKwkJCWlmICh2YWwgJiBBRFZFUlRJU0VfMTAwMEZVTEwpCisJCQkJcCA9IHJlZzMxOworCQkJZWxzZSBpZiAodmFsICYgQURWRVJUSVNFXzEwMDBIQUxGKQorCQkJCXAgPSByZWczMSArIDE7CisJCX0KKworCQlpZiAoIXApIHsKKwkJCXZhbCAmPSBhZHY7CisKKwkJCWZvciAocCA9IHJlZzMxOyBwLT52YWw7IHArKykgeworCQkJCWlmICgodmFsICYgcC0+dmFsKSA9PSBwLT52YWwpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcC0+Y3RsIHw9IFNJU19SMzIoU3RhdGlvbkNvbnRyb2wpICYgfjB4MGYwMDFjMDA7CisKKwkJaWYgKCh0cC0+ZmVhdHVyZXMgJiBGX0hBU19SR01JSSkgJiYKKwkJICAgICh0cC0+ZmVhdHVyZXMgJiBGX1BIWV9CQ001NDYxKSkgeworCQkJLy8gU2V0IFR4IERlbGF5IGluIFJHTUlJIG1vZGUuCisJCQltZGlvX3dyaXRlKGlvYWRkciwgcGh5X2lkLCAweDE4LCAweGYxYzcpOworCQkJdWRlbGF5KDIwMCk7CisJCQltZGlvX3dyaXRlKGlvYWRkciwgcGh5X2lkLCAweDFjLCAweDhjMDApOworCQkJcC0+Y3RsIHw9IDB4MDMwMDAwMDA7CisJCX0KKworCQlTSVNfVzMyKFN0YXRpb25Db250cm9sLCBwLT5jdGwpOworCisJCWlmICh0cC0+ZmVhdHVyZXMgJiBGX0hBU19SR01JSSkgeworCQkJU0lTX1czMihSR0RlbGF5LCAweDA0NDEpOworCQkJU0lTX1czMihSR0RlbGF5LCAweDA0NDApOworCQl9CisKKwkJREJHKCJzaXMxOTA6IGxpbmsgb24gJXMgbW9kZS5cbiIsIHAtPm1zZyk7CisJCW5ldGRldl9saW5rX3VwKGRldik7CisJfQorfQorCitzdGF0aWMgaW50IHNpczE5MF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJLyogQWxsb2NhdGUgVFggcmluZyAqLworCXRwLT5UeERlc2NSaW5nID0gbWFsbG9jX2RtYShUWF9SSU5HX0JZVEVTLCBSSU5HX0FMSUdOTUVOVCk7CisJaWYgKCF0cC0+VHhEZXNjUmluZykgeworCQlEQkcoInNpczE5MDogVFggcmluZyBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXRwLT50eF9kbWEgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyh0cC0+VHhEZXNjUmluZykpOworCisJLyogQWxsb2NhdGUgUlggcmluZyAqLworCXRwLT5SeERlc2NSaW5nID0gbWFsbG9jX2RtYShSWF9SSU5HX0JZVEVTLCBSSU5HX0FMSUdOTUVOVCk7CisJaWYgKCF0cC0+UnhEZXNjUmluZykgeworCQlEQkcoInNpczE5MDogUlggcmluZyBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisJdHAtPnJ4X2RtYSA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKHRwLT5SeERlc2NSaW5nKSk7CisKKwlyYyA9IHNpczE5MF9pbml0X3JpbmcoZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogaW5pdCByeCBmaWx0ZXIsIGFsc28gcHJvZ3JhbSBNQUMgYWRkcmVzcyB0byBjYXJkICovCisJc2lzMTkwX2luaXRfcnhmaWx0ZXIoZGV2KTsKKworCXNpczE5MF9od19zdGFydChkZXYpOworb3V0OgorCXJldHVybiByYzsKKworZXJyb3I6CisJc2lzMTkwX2ZyZWUoZGV2KTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKworCWRvIHsKKwkJc2lzMTkwX2FzaWNfZG93bihpb2FkZHIpOworCX0gd2hpbGUgKFNJU19SMzIoSW50ck1hc2spKTsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWZyZWVfZG1hKHRwLT5UeERlc2NSaW5nLCBUWF9SSU5HX0JZVEVTKTsKKwlmcmVlX2RtYSh0cC0+UnhEZXNjUmluZywgUlhfUklOR19CWVRFUyk7CisKKwl0cC0+VHhEZXNjUmluZyA9IE5VTEw7CisJdHAtPlJ4RGVzY1JpbmcgPSBOVUxMOworCisJdHAtPnR4X2RtYSA9IDA7CisJdHAtPnJ4X2RtYSA9IDA7CisKKwl0cC0+Y3VyX3R4ID0gdHAtPmRpcnR5X3R4ID0gMDsKKwl0cC0+Y3VyX3J4ID0gdHAtPmRpcnR5X3J4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7CisJCWZyZWVfaW9iKHRwLT5SeF9pb2J1ZltpXSk7CisJCXRwLT5SeF9pb2J1ZltpXSA9IE5VTEw7CisJfQorCisJLyogdHggaW9fYnVmZmVycyBhcmVuJ3Qgb3duZWQgYnkgdGhlIGRyaXZlciwgc28gZG9uJ3QgZnJlZSB0aGVtICovCisJZm9yKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykKKwkJdHAtPlR4X2lvYnVmW2ldID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2lzMTkwX2Rvd24oZGV2KTsKKwlzaXMxOTBfZnJlZShkZXYpOworfQorCitzdGF0aWMgaW50IHNpczE5MF90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTMyIGxlbiwgZW50cnk7CisJc3RydWN0IFR4RGVzYyAqZGVzYzsKKworCWxlbiA9IGlvYl9sZW4oaW9iKTsKKwlpZiAobGVuIDwgRVRIX1pMRU4pIHsKKwkJaW9iX3BhZChpb2IsIEVUSF9aTEVOKTsKKwkJbGVuID0gRVRIX1pMRU47CisJfQorCisJZW50cnkgPSB0cC0+Y3VyX3R4ICUgTlVNX1RYX0RFU0M7CisJZGVzYyA9IHRwLT5UeERlc2NSaW5nICsgZW50cnk7CisKKwlpZiAobGUzMl90b19jcHUoZGVzYy0+c3RhdHVzKSAmIE9XTmJpdCkgeworCQlEQkcoInNpczE5MDogVHggUmluZyBmdWxsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdHAtPlR4X2lvYnVmW2VudHJ5XSA9IGlvYjsKKworCWRlc2MtPlBTaXplID0gY3B1X3RvX2xlMzIobGVuKTsKKwlkZXNjLT5hZGRyID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoaW9iLT5kYXRhKSk7CisKKwlkZXNjLT5zaXplID0gY3B1X3RvX2xlMzIobGVuKTsKKwlpZiAoZW50cnkgPT0gKE5VTV9UWF9ERVNDIC0gMSkpCisJCWRlc2MtPnNpemUgfD0gY3B1X3RvX2xlMzIoUmluZ0VuZCk7CisKKwl3bWIoKTsKKworCWRlc2MtPnN0YXR1cyA9IGNwdV90b19sZTMyKE9XTmJpdCB8IElOVGJpdCB8IERFRmJpdCB8IENSQ2JpdCB8IFBBRGJpdCk7CisKKwl0cC0+Y3VyX3R4Kys7CisKKwlTSVNfVzMyKFR4Q29udHJvbCwgMHgxYTAwIHwgQ21kUmVzZXQgfCBDbWRUeEVuYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX2ZyZWVfcGh5KHN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0X3BoeSkKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3BoeSAqY3VyLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXIsIG5leHQsIGZpcnN0X3BoeSwgbGlzdCkgeworCQlmcmVlKGN1cik7CisJfQorfQorCisvKioKKyAqCXNpczE5MF9kZWZhdWx0X3BoeSAtIFNlbGVjdCBkZWZhdWx0IFBIWSBmb3Igc2lzMTkwIG1hYy4KKyAqCUBkZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHByb2JlIGZvcgorICoKKyAqCVNlbGVjdCBmaXJzdCBkZXRlY3RlZCBQSFkgd2l0aCBsaW5rIGFzIGRlZmF1bHQuCisgKglJZiBubyBvbmUgaXMgbGluayBvbiwgc2VsZWN0IFBIWSB3aG9zZSB0eXBlcyBpcyBIT01FIGFzIGRlZmF1bHQuCisgKglJZiBIT01FIGRvZXNuJ3QgZXhpc3QsIHNlbGVjdCBMQU4uCisgKi8KK3N0YXRpYyB1MTYgc2lzMTkwX2RlZmF1bHRfcGh5KHN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHApCit7CisJc3RydWN0IHNpczE5MF9waHkgKnBoeSwgKnBoeV9ob21lLCAqcGh5X2RlZmF1bHQsICpwaHlfbGFuOworCXN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpX2lmID0gJnRwLT5taWlfaWY7CisJdm9pZCAgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTE2IHN0YXR1czsKKworCXBoeV9ob21lID0gcGh5X2RlZmF1bHQgPSBwaHlfbGFuID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGh5LCAmdHAtPmZpcnN0X3BoeSwgbGlzdCkgeworCQlzdGF0dXMgPSBtZGlvX3JlYWRfbGF0Y2hlZChpb2FkZHIsIHBoeS0+cGh5X2lkLCBNSUlfQk1TUik7CisKKwkJLy8gTGluayBPTiAmIE5vdCBzZWxlY3QgZGVmYXVsdCBQSFkgJiBub3QgZ2hvc3QgUEhZLgorCQlpZiAoKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykgJiYKKwkJICAgICFwaHlfZGVmYXVsdCAmJgorCQkgICAgKHBoeS0+dHlwZSAhPSBVTktOT1dOKSkgeworCQkJcGh5X2RlZmF1bHQgPSBwaHk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHktPnBoeV9pZCwgTUlJX0JNQ1IpOworCQkJbWRpb193cml0ZShpb2FkZHIsIHBoeS0+cGh5X2lkLCBNSUlfQk1DUiwKKwkJCQkgICBzdGF0dXMgfCBCTUNSX0FORU5BQkxFIHwgQk1DUl9JU09MQVRFKTsKKwkJCWlmIChwaHktPnR5cGUgPT0gSE9NRSkKKwkJCQlwaHlfaG9tZSA9IHBoeTsKKwkJCWVsc2UgaWYgKHBoeS0+dHlwZSA9PSBMQU4pCisJCQkJcGh5X2xhbiA9IHBoeTsKKwkJfQorCX0KKworCWlmICghcGh5X2RlZmF1bHQpIHsKKwkJaWYgKHBoeV9ob21lKQorCQkJcGh5X2RlZmF1bHQgPSBwaHlfaG9tZTsKKwkJZWxzZSBpZiAocGh5X2xhbikKKwkJCXBoeV9kZWZhdWx0ID0gcGh5X2xhbjsKKwkJZWxzZQorCQkJcGh5X2RlZmF1bHQgPSBsaXN0X2VudHJ5KCZ0cC0+Zmlyc3RfcGh5LAorCQkJCQkJIHN0cnVjdCBzaXMxOTBfcGh5LCBsaXN0KTsKKwl9CisKKwlpZiAobWlpX2lmLT5waHlfaWQgIT0gcGh5X2RlZmF1bHQtPnBoeV9pZCkgeworCQltaWlfaWYtPnBoeV9pZCA9IHBoeV9kZWZhdWx0LT5waHlfaWQ7CisJCURCRygic2lzMTkwOiBVc2luZyB0cmFuc2NlaXZlciBhdCBhZGRyZXNzICVkIGFzIGRlZmF1bHQuXG4iLAorCQkgICAgIG1paV9pZi0+cGh5X2lkKTsKKwl9CisKKwlzdGF0dXMgPSBtZGlvX3JlYWQoaW9hZGRyLCBtaWlfaWYtPnBoeV9pZCwgTUlJX0JNQ1IpOworCXN0YXR1cyAmPSAofkJNQ1JfSVNPTEFURSk7CisKKwltZGlvX3dyaXRlKGlvYWRkciwgbWlpX2lmLT5waHlfaWQsIE1JSV9CTUNSLCBzdGF0dXMpOworCXN0YXR1cyA9IG1kaW9fcmVhZF9sYXRjaGVkKGlvYWRkciwgbWlpX2lmLT5waHlfaWQsIE1JSV9CTVNSKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9pbml0X3BoeShzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwLAorCQkJICAgIHN0cnVjdCBzaXMxOTBfcGh5ICpwaHksIHVuc2lnbmVkIGludCBwaHlfaWQsCisJCQkgICAgdTE2IG1paV9zdGF0dXMpCit7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlzdHJ1Y3QgbWlpX2NoaXBfaW5mbyAqcDsKKworCUlOSVRfTElTVF9IRUFEKCZwaHktPmxpc3QpOworCXBoeS0+c3RhdHVzID0gbWlpX3N0YXR1czsKKwlwaHktPnBoeV9pZCA9IHBoeV9pZDsKKworCXBoeS0+aWRbMF0gPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHlfaWQsIE1JSV9QSFlTSUQxKTsKKwlwaHktPmlkWzFdID0gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCBNSUlfUEhZU0lEMik7CisKKwlmb3IgKHAgPSBtaWlfY2hpcF90YWJsZTsgcC0+dHlwZTsgcCsrKSB7CisJCWlmICgocC0+aWRbMF0gPT0gcGh5LT5pZFswXSkgJiYKKwkJICAgIChwLT5pZFsxXSA9PSAocGh5LT5pZFsxXSAmIDB4ZmZmMCkpKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwLT5pZFsxXSkgeworCQlwaHktPnR5cGUgPSAocC0+dHlwZSA9PSBNSVgpID8KKwkJCSgobWlpX3N0YXR1cyAmIChCTVNSXzEwMEZVTEwgfCBCTVNSXzEwMEhBTEYpKSA/CisJCQkJTEFOIDogSE9NRSkgOiBwLT50eXBlOworCQl0cC0+ZmVhdHVyZXMgfD0gcC0+ZmVhdHVyZTsKKworCQlEQkcoInNpczE5MDogJXMgdHJhbnNjZWl2ZXIgYXQgYWRkcmVzcyAlZC5cbiIsIHAtPm5hbWUsIHBoeV9pZCk7CisJfSBlbHNlIHsKKwkJcGh5LT50eXBlID0gVU5LTk9XTjsKKworCQlEQkcoInNpczE5MDogdW5rbm93biBQSFkgMHgleDoweCV4IHRyYW5zY2VpdmVyIGF0IGFkZHJlc3MgJWRcbiIsCisJCSAgICBwaHktPmlkWzBdLCAocGh5LT5pZFsxXSAmIDB4ZmZmMCksIHBoeV9pZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfbWlpX3Byb2JlXzg4ZTExMTFfZml4dXAoc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCkKK3sKKwlpZiAodHAtPmZlYXR1cmVzICYgRl9QSFlfODhFMTExMSkgeworCQl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCQlpbnQgcGh5X2lkID0gdHAtPm1paV9pZi5waHlfaWQ7CisJCXUxNiByZWdbMl1bMl0gPSB7CisJCQl7IDB4ODA4YiwgMHgwY2UxIH0sCisJCQl7IDB4ODA4ZiwgMHgwYzYwIH0KKwkJfSwgKnA7CisKKwkJcCA9ICh0cC0+ZmVhdHVyZXMgJiBGX0hBU19SR01JSSkgPyByZWdbMF0gOiByZWdbMV07CisKKwkJbWRpb193cml0ZShpb2FkZHIsIHBoeV9pZCwgMHgxYiwgcFswXSk7CisJCXVkZWxheSgyMDApOworCQltZGlvX3dyaXRlKGlvYWRkciwgcGh5X2lkLCAweDE0LCBwWzFdKTsKKwkJdWRlbGF5KDIwMCk7CisJfQorfQorCisvKioKKyAqCXNpczE5MF9taWlfcHJvYmUgLSBQcm9iZSBNSUkgUEhZIGZvciBzaXMxOTAKKyAqCUBkZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHByb2JlIGZvcgorICoKKyAqCVNlYXJjaCBmb3IgdG90YWwgb2YgMzIgcG9zc2libGUgbWlpIHBoeSBhZGRyZXNzZXMuCisgKglJZGVudGlmeSBhbmQgc2V0IGN1cnJlbnQgcGh5IGlmIGZvdW5kIG9uZSwKKyAqCXJldHVybiBlcnJvciBpZiBpdCBmYWlsZWQgdG8gZm91bmQuCisgKi8KK3N0YXRpYyBpbnQgc2lzMTkwX21paV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpX2lmID0gJnRwLT5taWlfaWY7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgcGh5X2lkOworCWludCByYyA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmdHAtPmZpcnN0X3BoeSk7CisKKwlmb3IgKHBoeV9pZCA9IDA7IHBoeV9pZCA8IFBIWV9NQVhfQUREUjsgcGh5X2lkKyspIHsKKwkJc3RydWN0IHNpczE5MF9waHkgKnBoeTsKKwkJdTE2IHN0YXR1czsKKworCQlzdGF0dXMgPSBtZGlvX3JlYWRfbGF0Y2hlZChpb2FkZHIsIHBoeV9pZCwgTUlJX0JNU1IpOworCisJCS8vIFRyeSBuZXh0IG1paSBpZiB0aGUgY3VycmVudCBvbmUgaXMgbm90IGFjY2Vzc2libGUuCisJCWlmIChzdGF0dXMgPT0gMHhmZmZmIHx8IHN0YXR1cyA9PSAweDAwMDApCisJCQljb250aW51ZTsKKworCQlwaHkgPSB6YWxsb2Moc2l6ZW9mKCpwaHkpKTsKKwkJaWYgKCFwaHkpIHsKKwkJCXNpczE5MF9mcmVlX3BoeSgmdHAtPmZpcnN0X3BoeSk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCURCRygic2lzMTkwOiBmb3VuZCBQSFlcbiIpOworCisJCXNpczE5MF9pbml0X3BoeSh0cCwgcGh5LCBwaHlfaWQsIHN0YXR1cyk7CisKKwkJbGlzdF9hZGQoJnRwLT5maXJzdF9waHksICZwaHktPmxpc3QpOworCX0KKworCWlmIChsaXN0X2VtcHR5KCZ0cC0+Zmlyc3RfcGh5KSkgeworCQlEQkcoInNpczE5MDogTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNlbGVjdCBkZWZhdWx0IFBIWSBmb3IgbWFjICovCisJc2lzMTkwX2RlZmF1bHRfcGh5KHRwKTsKKworCXNpczE5MF9taWlfcHJvYmVfODhlMTExMV9maXh1cCh0cCk7CisKKwltaWlfaWYtPmRldiA9IGRldjsKKwltaWlfaWYtPm1kaW9fcmVhZCA9IF9fbWRpb19yZWFkOworCW1paV9pZi0+bWRpb193cml0ZSA9IF9fbWRpb193cml0ZTsKKwltaWlfaWYtPnBoeV9pZF9tYXNrID0gUEhZX0lEX0FOWTsKKwltaWlfaWYtPnJlZ19udW1fbWFzayA9IE1JSV9SRUdfQU5ZOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX21paV9yZW1vdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNpczE5MF9mcmVlX3BoeSgmdHAtPmZpcnN0X3BoeSk7Cit9CisKK3N0YXRpYyBpbnQgc2lzMTkwX2luaXRfYm9hcmQoc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICoqbmV0ZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl2b2lkICppb2FkZHI7CisJaW50IHJjOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCp0cCkpOworCWlmICghZGV2KSB7CisJCURCRygic2lzMTkwOiB1bmFibGUgdG8gYWxsb2MgbmV3IGV0aGVyZGV2XG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXYtPmRldiA9ICZwZGV2LT5kZXY7CisKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisJbWVtc2V0KHRwLCAwLCBzaXplb2YoKnRwKSk7CisKKwl0cC0+ZGV2ID0gZGV2OworCisJYWRqdXN0X3BjaV9kZXZpY2UocGRldik7CisKKwlpb2FkZHIgPSBpb3JlbWFwKHBkZXYtPm1lbWJhc2UsIFNJUzE5MF9SRUdTX1NJWkUpOworCWlmICghaW9hZGRyKSB7CisJCURCRygic2lzMTkwOiBjYW5ub3QgcmVtYXAgTU1JTywgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKworCXRwLT5wY2lfZGV2aWNlID0gcGRldjsKKwl0cC0+bW1pb19hZGRyID0gaW9hZGRyOworCisJc2lzMTkwX2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKKworCXNpczE5MF9zb2Z0X3Jlc2V0KGlvYWRkcik7CisKKwkqbmV0ZGV2ID0gZGV2OworCisJcmV0dXJuIDA7CisKK2VycjoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9zZXRfcmdtaWkoc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCwgdTggcmVnKQoreworCXRwLT5mZWF0dXJlcyB8PSAocmVnICYgMHg4MCkgPyBGX0hBU19SR01JSSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc2lzMTkwX2dldF9tYWNfYWRkcl9mcm9tX2VlcHJvbShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiBfX3VudXNlZCwKKwkJCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUxNiBzaWc7CisJaW50IGk7CisKKwlEQkcoInNpczE5MDogUmVhZCBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTVxuIik7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBzYW5lIEVFUFJPTSAqLworCXNpZyA9ICh1MTYpIHNpczE5MF9yZWFkX2VlcHJvbShpb2FkZHIsIEVFUFJPTVNpZ25hdHVyZSk7CisKKwlpZiAoKHNpZyA9PSAweGZmZmYpIHx8IChzaWcgPT0gMHgwMDAwKSkgeworCQlEQkcoInNpczE5MDogRXJyb3IgRUVQUk9NIHJlYWQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogR2V0IE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOIC8gMjsgaSsrKSB7CisJCXUxNiB3ID0gc2lzMTkwX3JlYWRfZWVwcm9tKGlvYWRkciwgRUVQUk9NTUFDQWRkciArIGkpOworCisJCSgodTE2ICopZGV2LT5od19hZGRyKVtpXSA9IGNwdV90b19sZTE2KHcpOworCX0KKworCXNpczE5MF9zZXRfcmdtaWkodHAsIHNpczE5MF9yZWFkX2VlcHJvbShpb2FkZHIsIEVFUFJPTUluZm8pKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNpczE5MF9nZXRfbWFjX2FkZHJfZnJvbV9hcGMgLSBHZXQgTUFDIGFkZHJlc3MgZm9yIFNpUzk2eCBtb2RlbAorICoJQHBkZXY6IFBDSSBkZXZpY2UKKyAqCUBkZXY6ICBuZXR3b3JrIGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IKKyAqCisgKglTaVM5NnggbW9kZWwsIHVzZSBBUEMgQ01PUyBSQU0gdG8gc3RvcmUgTUFDIGFkZHJlc3MuCisgKglBUEMgQ01PUyBSQU0gaXMgYWNjZXNzZWQgdGhyb3VnaCBJU0EgYnJpZGdlLgorICoJTUFDIGFkZHJlc3MgaXMgcmVhZCBpbnRvIEBuZXRfZGV2LT5kZXZfYWRkci4KKyAqLworc3RhdGljIGludCBzaXMxOTBfZ2V0X21hY19hZGRyX2Zyb21fYXBjKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2aWNlICppc2FfYnJpZGdlID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlICpkOworCXU4IHJlZywgdG1wODsKKwl1bnNpZ25lZCBpbnQgaTsKKworCURCRygic2lzMTkwOiBSZWFkIE1BQyBhZGRyZXNzIGZyb20gQVBDLlxuIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICYocGRldi0+ZGV2LnNpYmxpbmdzKSwgc2libGluZ3MpIHsKKwkJdW5zaWduZWQgaW50IGk7CisJCWlzYV9icmlkZ2UgPSBjb250YWluZXJfb2YoZCwgc3RydWN0IHBjaV9kZXZpY2UsIGRldik7CisJCWZvcihpID0gMDsgaSA8IHNpczE5MF9pc2FfYnJpZGdlX2RyaXZlci5pZF9jb3VudDsgaSsrKSB7CisJCQlpZihpc2FfYnJpZGdlLT52ZW5kb3IgPT0KKwkJCSAgICAgc2lzMTkwX2lzYV9icmlkZ2VfZHJpdmVyLmlkc1tpXS52ZW5kb3IKKwkJCSAgICAgJiYgaXNhX2JyaWRnZS0+ZGV2aWNlID09CisJCQkgICAgIHNpczE5MF9pc2FfYnJpZGdlX2RyaXZlci5pZHNbaV0uZGV2aWNlKSB7CisJCQkJREJHKCJzaXMxOTA6IElTQSBicmlkZ2UgZm91bmRcbiIpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpc2FfYnJpZGdlID0gTlVMTDsKKwkJCX0KKwkJfQorCQlpZihpc2FfYnJpZGdlKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFpc2FfYnJpZGdlKSB7CisJCURCRygic2lzMTkwOiBDYW4gbm90IGZpbmQgSVNBIGJyaWRnZS5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBFbmFibGUgcG9ydCA3OGggJiA3OWggdG8gYWNjZXNzIEFQQyBSZWdpc3RlcnMuICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg0OCwgJnRtcDgpOworCXJlZyA9ICh0bXA4ICYgfjB4MDIpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDQ4LCByZWcpOworCXVkZWxheSg1MCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg0OCwgJnJlZyk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRiKDB4OSArIGksIDB4NzgpOworICAgICAgICAgICAgICAgIGRldi0+aHdfYWRkcltpXSA9IGluYigweDc5KTsKKyAgICAgICAgfQorCisJb3V0YigweDEyLCAweDc4KTsKKwlyZWcgPSBpbmIoMHg3OSk7CisKKwlzaXMxOTBfc2V0X3JnbWlpKHRwLCByZWcpOworCisJLyogUmVzdG9yZSB0aGUgdmFsdWUgdG8gSVNBIEJyaWRnZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDQ4LCB0bXA4KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICAgICAgc2lzMTkwX2luaXRfcnhmaWx0ZXIgLSBJbml0aWFsaXplIHRoZSBSeCBmaWx0ZXIKKyAqICAgICAgQGRldjogbmV0d29yayBkZXZpY2UgdG8gaW5pdGlhbGl6ZQorICoKKyAqICAgICAgU2V0IHJlY2VpdmUgZmlsdGVyIGFkZHJlc3MgdG8gb3VyIE1BQyBhZGRyZXNzCisgKiAgICAgIGFuZCBlbmFibGUgcGFja2V0IGZpbHRlcmluZy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNpczE5MF9pbml0X3J4ZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MTYgY3RsOworCWludCBpOworCisJY3RsID0gU0lTX1IxNihSeE1hY0NvbnRyb2wpOworCS8qCisJICogRGlzYWJsZSBwYWNrZXQgZmlsdGVyaW5nIGJlZm9yZSBzZXR0aW5nIGZpbHRlci4KKwkgKiBOb3RlOiBTaVMncyBkcml2ZXIgd3JpdGVzIDMyIGJpdHMgYnV0IFJ4TWFjQ29udHJvbCBpcyAxNiBiaXRzCisJICogb25seSBhbmQgZm9sbG93ZWQgYnkgUnhNYWNBZGRyICg2IGJ5dGVzKS4gU3RyYW5nZS4gLS0gRlIKKwkgKi8KKwlTSVNfVzE2KFJ4TWFjQ29udHJvbCwgY3RsICYgfjB4MGYwMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJU0lTX1c4KFJ4TWFjQWRkciArIGksIGRldi0+bGxfYWRkcltpXSk7CisKKwlTSVNfVzE2KFJ4TWFjQ29udHJvbCwgY3RsKTsKKwlTSVNfUENJX0NPTU1JVCgpOworfQorCitzdGF0aWMgaW50IHNpczE5MF9nZXRfbWFjX2FkZHIoc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYsCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByYzsKKworCXJjID0gc2lzMTkwX2dldF9tYWNfYWRkcl9mcm9tX2VlcHJvbShwZGV2LCBkZXYpOworCWlmIChyYyA8IDApIHsKKwkJdTggcmVnOworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NzMsICZyZWcpOworCisJCWlmIChyZWcgJiAweDAwMDAwMDAxKQorCQkJcmMgPSBzaXMxOTBfZ2V0X21hY19hZGRyX2Zyb21fYXBjKHBkZXYsIGRldik7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3NldF9zcGVlZF9hdXRvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgcGh5X2lkID0gdHAtPm1paV9pZi5waHlfaWQ7CisJaW50IHZhbDsKKworCURCRygic2lzMTkwOiBFbmFibGluZyBBdXRvLW5lZ290aWF0aW9uLlxuIik7CisKKwl2YWwgPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHlfaWQsIE1JSV9BRFZFUlRJU0UpOworCisJLy8gRW5hYmxlIDEwLzEwMCBGdWxsL0hhbGYgTW9kZSwgbGVhdmUgTUlJX0FEVkVSVElTRSBiaXQ0OjAKKwkvLyB1bmNoYW5nZWQuCisJbWRpb193cml0ZShpb2FkZHIsIHBoeV9pZCwgTUlJX0FEVkVSVElTRSwgKHZhbCAmIEFEVkVSVElTRV9TTENUKSB8CisJCSAgIEFEVkVSVElTRV8xMDBGVUxMIHwgQURWRVJUSVNFXzEwRlVMTCB8CisJCSAgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwSEFMRik7CisKKwkvLyBFbmFibGUgMTAwMCBGdWxsIE1vZGUuCisJbWRpb193cml0ZShpb2FkZHIsIHBoeV9pZCwgTUlJX0NUUkwxMDAwLCBBRFZFUlRJU0VfMTAwMEZVTEwpOworCisJLy8gRW5hYmxlIGF1dG8tbmVnb3RpYXRpb24gYW5kIHJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4KKwltZGlvX3dyaXRlKGlvYWRkciwgcGh5X2lkLCBNSUlfQk1DUiwKKwkJICAgQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUIHwgQk1DUl9SRVNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJU0lTX1czMihJbnRyU3RhdHVzLCAweGZmZmZmZmZmKTsKKworCWlmIChlbmFibGUgPT0gMCkKKwkJU0lTX1czMihJbnRyTWFzaywgMHgwMCk7CisJZWxzZQorCQlTSVNfVzMyKEludHJNYXNrLCBzaXMxOTBfaW50cl9tYXNrKTsKKworCVNJU19QQ0lfQ09NTUlUKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcGVyYXRpb25zIHNpczE5MF9uZXRkZXZfb3BzID0geworCS5vcGVuID0gc2lzMTkwX29wZW4sCisJLmNsb3NlID0gc2lzMTkwX2Nsb3NlLAorCS5wb2xsID0gc2lzMTkwX3BvbGwsCisJLnRyYW5zbWl0ID0gc2lzMTkwX3RyYW5zbWl0LAorCS5pcnEgPSBzaXMxOTBfaXJxLAorfTsKKworc3RhdGljIGludCBzaXMxOTBfcHJvYmUoc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50IF9fdW51c2VkKQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl2b2lkICppb2FkZHI7CisJaW50IHJjOworCisJcmMgPSBzaXMxOTBfaW5pdF9ib2FyZChwZGV2LCAmZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dDsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisKKwlyYyA9IHNpczE5MF9nZXRfbWFjX2FkZHIocGRldiwgZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCXJjID0gc2lzMTkwX21paV9wcm9iZShkZXYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCXNpczE5MF9zZXRfc3BlZWRfYXV0byhkZXYpOworCXNpczE5MF9waHlfdGFzayh0cCk7CisKKwluZXRkZXZfaW5pdChkZXYsICZzaXMxOTBfbmV0ZGV2X29wcyk7CisJbmV0ZGV2X2xpbmtfZG93bihkZXYpOworb3V0OgorCXJldHVybiByYzsKKworZXJyOgorCXNpczE5MF9taWlfcmVtb3ZlKGRldik7CisJaW91bm1hcCh0cC0+bW1pb19hZGRyKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKworCXNpczE5MF9taWlfcmVtb3ZlKGRldik7CisKKwkvKiBzaHV0ZG93biBjaGlwLCBkaXNhYmxlIGludGVycnVwdHMsIGV0YyAqLworCXNpczE5MF9zb2Z0X3Jlc2V0KGlvYWRkcik7CisKKwlpb3VubWFwKHRwLT5tbWlvX2FkZHIpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwluZXRkZXZfbnVsbGlmeShkZXYpOworCW5ldGRldl9wdXQoZGV2KTsKK30KKworc3RydWN0IHBjaV9kcml2ZXIgc2lzMTkwX3BjaV9kcml2ZXIgX19wY2lfZHJpdmVyID0geworCS5pZHMJCT0gc2lzMTkwX3BjaV90YmwsCisJLmlkX2NvdW50CT0gKHNpemVvZihzaXMxOTBfcGNpX3RibCkgLyBzaXplb2Yoc2lzMTkwX3BjaV90YmxbMF0pKSwKKwkucHJvYmUJCT0gc2lzMTkwX3Byb2JlLAorCS5yZW1vdmUJCT0gc2lzMTkwX3JlbW92ZSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9zaXMxOTAuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NpczE5MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGFjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9zaXMxOTAuaApAQCAtMCwwICsxLDMxMSBAQAorI2lmbmRlZiBfX1NJUzE5MF9IX18KKyNkZWZpbmUgX19TSVMxOTBfSF9fCisKK0ZJTEVfTElDRU5DRSAoIEdQTF9BTlkgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1paS5oPgorI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9pby5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL21hbGxvYy5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL3RpbWVyLmg+CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TSQkweDEwMzkKKworI2RlZmluZSBQSFlfTUFYX0FERFIJCTMyCisjZGVmaW5lIFBIWV9JRF9BTlkJCTB4MWYKKyNkZWZpbmUgTUlJX1JFR19BTlkJCTB4MWYKKworI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMyIKKyNkZWZpbmUgRFJWX05BTUUJCSJzaXMxOTAiCisjZGVmaW5lIFNJUzE5MF9EUklWRVJfTkFNRQlEUlZfTkFNRSAiIEdpZ2FiaXQgRXRoZXJuZXQgZHJpdmVyICIgRFJWX1ZFUlNJT04KKyNkZWZpbmUgUEZYIERSVl9OQU1FICI6ICIKKworI2RlZmluZSBzaXMxOTBfcnhfcXVvdGEoY291bnQsIHF1b3RhKQljb3VudAorCisjZGVmaW5lIE5VTV9UWF9ERVNDCQk4CS8qIFs4Li4xMDI0XSAqLworI2RlZmluZSBOVU1fUlhfREVTQwkJOAkvKiBbOC4uODE5Ml0gKi8KKyNkZWZpbmUgVFhfUklOR19CWVRFUwkJKE5VTV9UWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBUeERlc2MpKQorI2RlZmluZSBSWF9SSU5HX0JZVEVTCQkoTlVNX1JYX0RFU0MgKiBzaXplb2Yoc3RydWN0IFJ4RGVzYykpCisjZGVmaW5lIFJYX0JVRl9TSVpFCQkxNTM2CisjZGVmaW5lIFJYX0JVRl9NQVNLCQkweGZmZjgKKworI2RlZmluZSBSSU5HX0FMSUdOTUVOVAkJMjU2CisKKyNkZWZpbmUgU0lTMTkwX1JFR1NfU0laRQkweDgwCisKKy8qIEVuaGFuY2VkIFBIWSBhY2Nlc3MgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIEVobk1JSXJlYWQJCTB4MDAwMAorI2RlZmluZSBFaG5NSUl3cml0ZQkJMHgwMDIwCisjZGVmaW5lIEVobk1JSWRhdGFTaGlmdAkJMTYKKyNkZWZpbmUgRWhuTUlJcG1kU2hpZnQJCTYJLyogNzAxNiBvbmx5ICovCisjZGVmaW5lIEVobk1JSXJlZ1NoaWZ0CQkxMQorI2RlZmluZSBFaG5NSUlyZXEJCTB4MDAxMAorI2RlZmluZSBFaG5NSUlub3REb25lCQkweDAwMTAKKworLyogV3JpdGUvcmVhZCBNTUlPIHJlZ2lzdGVyICovCisjZGVmaW5lIFNJU19XOChyZWcsIHZhbCkJd3JpdGViICgodmFsKSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFNJU19XMTYocmVnLCB2YWwpCXdyaXRldyAoKHZhbCksIGlvYWRkciArIChyZWcpKQorI2RlZmluZSBTSVNfVzMyKHJlZywgdmFsKQl3cml0ZWwgKCh2YWwpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgU0lTX1I4KHJlZykJCXJlYWRiIChpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgU0lTX1IxNihyZWcpCQlyZWFkdyAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFNJU19SMzIocmVnKQkJcmVhZGwgKGlvYWRkciArIChyZWcpKQorCisjZGVmaW5lIFNJU19QQ0lfQ09NTUlUKCkJU0lTX1IzMihJbnRyQ29udHJvbCkKKworZW51bSBzaXMxOTBfcmVnaXN0ZXJzIHsKKwlUeENvbnRyb2wJCT0gMHgwMCwKKwlUeERlc2NTdGFydEFkZHIJCT0gMHgwNCwKKwlyc3YwCQkJPSAweDA4LAkvLyByZXNlcnZlZAorCVR4U3RzCQkJPSAweDBjLAkvLyB1bnVzZWQgKENvbnRyb2wvU3RhdHVzKQorCVJ4Q29udHJvbAkJPSAweDEwLAorCVJ4RGVzY1N0YXJ0QWRkcgkJPSAweDE0LAorCXJzdjEJCQk9IDB4MTgsCS8vIHJlc2VydmVkCisJUnhTdHMJCQk9IDB4MWMsCS8vIHVudXNlZAorCUludHJTdGF0dXMJCT0gMHgyMCwKKwlJbnRyTWFzawkJPSAweDI0LAorCUludHJDb250cm9sCQk9IDB4MjgsCisJSW50clRpbWVyCQk9IDB4MmMsCS8vIHVudXNlZCAoSW50ZXJ1cHQgVGltZXIpCisJUE1Db250cm9sCQk9IDB4MzAsCS8vIHVudXNlZCAoUG93ZXIgTWdtdCBDb250cm9sL1N0YXR1cykKKwlyc3YyCQkJPSAweDM0LAkvLyByZXNlcnZlZAorCVJPTUNvbnRyb2wJCT0gMHgzOCwKKwlST01JbnRlcmZhY2UJCT0gMHgzYywKKwlTdGF0aW9uQ29udHJvbAkJPSAweDQwLAorCUdNSUlDb250cm9sCQk9IDB4NDQsCisJR0lvQ1IJCQk9IDB4NDgsIC8vIHVudXNlZCAoR01BQyBJTyBDb21wZW5zYXRpb24pCisJR0lvQ3RybAkJCT0gMHg0YywgLy8gdW51c2VkIChHTUFDIElPIENvbnRyb2wpCisJVHhNYWNDb250cm9sCQk9IDB4NTAsCisJVHhMaW1pdAkJCT0gMHg1NCwgLy8gdW51c2VkIChUeCBNQUMgVGltZXIvVHJ5TGltaXQpCisJUkdEZWxheQkJCT0gMHg1OCwgLy8gdW51c2VkIChSR01JSSBUeCBJbnRlcm5hbCBEZWxheSkKKwlyc3YzCQkJPSAweDVjLCAvLyByZXNlcnZlZAorCVJ4TWFjQ29udHJvbAkJPSAweDYwLAorCVJ4TWFjQWRkcgkJPSAweDYyLAorCVJ4SGFzaFRhYmxlCQk9IDB4NjgsCisJLy8gVW5kb2N1bWVudGVkCQk9IDB4NmMsCisJUnhXb2xDdHJsCQk9IDB4NzAsCisJUnhXb2xEYXRhCQk9IDB4NzQsIC8vIHVudXNlZCAoUnggV09MIERhdGEgQWNjZXNzKQorCVJ4TVBTQ29udHJvbAkJPSAweDc4LAkvLyB1bnVzZWQgKFJ4IE1QUyBDb250cm9sKQorCXJzdjQJCQk9IDB4N2MsIC8vIHJlc2VydmVkCit9OworCitlbnVtIHNpczE5MF9yZWdpc3Rlcl9jb250ZW50IHsKKwkvKiBJbnRyU3RhdHVzICovCisJU29mdEludAkJCT0gMHg0MDAwMDAwMCwJLy8gdW51c2VkCisJVGltZXVwCQkJPSAweDIwMDAwMDAwLAkvLyB1bnVzZWQKKwlQYXVzZUZyYW1lCQk9IDB4MDAwODAwMDAsCS8vIHVudXNlZAorCU1hZ2ljUGFja2V0CQk9IDB4MDAwNDAwMDAsCS8vIHVudXNlZAorCVdha2V1cEZyYW1lCQk9IDB4MDAwMjAwMDAsCS8vIHVudXNlZAorCUxpbmtDaGFuZ2UJCT0gMHgwMDAxMDAwMCwKKwlSeFFFbXB0eQkJPSAweDAwMDAwMDgwLAorCVJ4UUludAkJCT0gMHgwMDAwMDA0MCwKKwlUeFExRW1wdHkJCT0gMHgwMDAwMDAyMCwJLy8gdW51c2VkCisJVHhRMUludAkJCT0gMHgwMDAwMDAxMCwKKwlUeFEwRW1wdHkJCT0gMHgwMDAwMDAwOCwJLy8gdW51c2VkCisJVHhRMEludAkJCT0gMHgwMDAwMDAwNCwKKwlSeEhhbHQJCQk9IDB4MDAwMDAwMDIsCisJVHhIYWx0CQkJPSAweDAwMDAwMDAxLAorCisJLyoge1J4L1R4fUNtZEJpdHMgKi8KKwlDbWRSZXNldAkJPSAweDEwLAorCUNtZFJ4RW5iCQk9IDB4MDgsCQkvLyB1bnVzZWQKKwlDbWRUeEVuYgkJPSAweDAxLAorCVJ4QnVmRW1wdHkJCT0gMHgwMSwJCS8vIHVudXNlZAorCisJLyogQ2ZnOTM0NkJpdHMgKi8KKwlDZmc5MzQ2X0xvY2sJCT0gMHgwMCwJCS8vIHVudXNlZAorCUNmZzkzNDZfVW5sb2NrCQk9IDB4YzAsCQkvLyB1bnVzZWQKKworCS8qIFJ4TWFjQ29udHJvbCAqLworCUFjY2VwdEVycgkJPSAweDIwLAkJLy8gdW51c2VkCisJQWNjZXB0UnVudAkJPSAweDEwLAkJLy8gdW51c2VkCisJQWNjZXB0QnJvYWRjYXN0CQk9IDB4MDgwMCwKKwlBY2NlcHRNdWx0aWNhc3QJCT0gMHgwNDAwLAorCUFjY2VwdE15UGh5cwkJPSAweDAyMDAsCisJQWNjZXB0QWxsUGh5cwkJPSAweDAxMDAsCisKKwkvKiBSeENvbmZpZ0JpdHMgKi8KKwlSeENmZ0ZJRk9TaGlmdAkJPSAxMywKKwlSeENmZ0RNQVNoaWZ0CQk9IDgsCQkvLyAweDFhIGluIFJ4Q29udHJvbCA/CisKKwkvKiBUeENvbmZpZ0JpdHMgKi8KKwlUeEludGVyRnJhbWVHYXBTaGlmdAk9IDI0LAorCVR4RE1BU2hpZnQJCT0gOCwgLyogRE1BIGJ1cnN0IHZhbHVlICgwLTcpIGlzIHNoaWZ0IHRoaXMgbWFueSBiaXRzICovCisKKwlMaW5rU3RhdHVzCQk9IDB4MDIsCQkvLyB1bnVzZWQKKwlGdWxsRHVwCQkJPSAweDAxLAkJLy8gdW51c2VkCisKKwkvKiBUQklDU1JCaXQgKi8KKwlUQklMaW5rT0sJCT0gMHgwMjAwMDAwMCwJLy8gdW51c2VkCit9OworCitzdHJ1Y3QgVHhEZXNjIHsKKwl2b2xhdGlsZSB1MzIgUFNpemU7CisJdm9sYXRpbGUgdTMyIHN0YXR1czsKKwl2b2xhdGlsZSB1MzIgYWRkcjsKKwl2b2xhdGlsZSB1MzIgc2l6ZTsKK307CisKK3N0cnVjdCBSeERlc2MgeworCXZvbGF0aWxlIHUzMiBQU2l6ZTsKKwl2b2xhdGlsZSB1MzIgc3RhdHVzOworCXZvbGF0aWxlIHUzMiBhZGRyOworCXZvbGF0aWxlIHUzMiBzaXplOworfTsKKworZW51bSBfRGVzY1N0YXR1c0JpdCB7CisJLyogX0Rlc2Muc3RhdHVzICovCisJT1dOYml0CQk9IDB4ODAwMDAwMDAsIC8vIFJYT1dOL1RYT1dOCisJSU5UYml0CQk9IDB4NDAwMDAwMDAsIC8vIFJYSU5UL1RYSU5UCisJQ1JDYml0CQk9IDB4MDAwMjAwMDAsIC8vIENSQ09GRi9DUkNFTgorCVBBRGJpdAkJPSAweDAwMDEwMDAwLCAvLyBQUkVBREQvUEFERU4KKwkvKiBfRGVzYy5zaXplICovCisJUmluZ0VuZAkJPSAweDgwMDAwMDAwLAorCS8qIFR4RGVzYy5zdGF0dXMgKi8KKwlMU0VOCQk9IDB4MDgwMDAwMDAsIC8vIFRTTyA/IC0tIEZSCisJSVBDUwkJPSAweDA0MDAwMDAwLAorCVRDUENTCQk9IDB4MDIwMDAwMDAsCisJVURQQ1MJCT0gMHgwMTAwMDAwMCwKKwlCU1RFTgkJPSAweDAwODAwMDAwLAorCUVYVEVOCQk9IDB4MDA0MDAwMDAsCisJREVGRU4JCT0gMHgwMDIwMDAwMCwKKwlCS0ZFTgkJPSAweDAwMTAwMDAwLAorCUNSU0VOCQk9IDB4MDAwODAwMDAsCisJQ09MRU4JCT0gMHgwMDA0MDAwMCwKKwlUSE9MMwkJPSAweDMwMDAwMDAwLAorCVRIT0wyCQk9IDB4MjAwMDAwMDAsCisJVEhPTDEJCT0gMHgxMDAwMDAwMCwKKwlUSE9MMAkJPSAweDAwMDAwMDAwLAorCisJV05ECQk9IDB4MDAwODAwMDAsCisJVEFCUlQJCT0gMHgwMDA0MDAwMCwKKwlGSUZPCQk9IDB4MDAwMjAwMDAsCisJTElOSwkJPSAweDAwMDEwMDAwLAorCUNvbENvdW50TWFzawk9IDB4MDAwMGZmZmYsCisJLyogUnhEZXNjLnN0YXR1cyAqLworCUlQT04JCT0gMHgyMDAwMDAwMCwKKwlUQ1BPTgkJPSAweDEwMDAwMDAwLAorCVVEUE9OCQk9IDB4MDgwMDAwMDAsCisJV2FrdXAJCT0gMHgwMDQwMDAwMCwKKwlNYWdpYwkJPSAweDAwMjAwMDAwLAorCVBhdXNlCQk9IDB4MDAxMDAwMDAsCisJREVGYml0CQk9IDB4MDAyMDAwMDAsCisJQkNBU1QJCT0gMHgwMDBjMDAwMCwKKwlNQ0FTVAkJPSAweDAwMDgwMDAwLAorCVVDQVNUCQk9IDB4MDAwNDAwMDAsCisJLyogUnhEZXNjLlBTaXplICovCisJVEFHT04JCT0gMHg4MDAwMDAwMCwKKwlSeERlc2NDb3VudE1hc2sJPSAweDdmMDAwMDAwLCAvLyBtdWx0aS1kZXNjIHBrdCB3aGVuID4gMSA/IC0tIEZSCisJQUJPUlQJCT0gMHgwMDgwMDAwMCwKKwlTSE9SVAkJPSAweDAwNDAwMDAwLAorCUxJTUlUCQk9IDB4MDAyMDAwMDAsCisJTUlJRVIJCT0gMHgwMDEwMDAwMCwKKwlPVlJVTgkJPSAweDAwMDgwMDAwLAorCU5JQk9OCQk9IDB4MDAwNDAwMDAsCisJQ09MT04JCT0gMHgwMDAyMDAwMCwKKwlDUkNPSwkJPSAweDAwMDEwMDAwLAorCVJ4U2l6ZU1hc2sJPSAweDAwMDBmZmZmCisJLyoKKwkqIFRoZSBhc2ljIGNvdWxkIGFwcGFyZW50bHkgZG8gdmxhbiwgVFNPLCBqdW1ibyAoc2lzMTkxIG9ubHkpIGFuZAorCSogcHJvdmlkZSB0d28gKHVudXNlZCB3aXRoIExpbnV4KSBUeCBxdWV1ZXMuIE5vIHB1YmxpY2FsbHkKKwkqIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIGFsYXMuCisJKi8KK307CisKK2VudW0gc2lzMTkwX2VlcHJvbV9hY2Nlc3NfcmVnaXN0ZXJfYml0cyB7CisJRUVDUwk9IDB4MDAwMDAwMDEsCS8vIHVudXNlZAorCUVFQ0xLCT0gMHgwMDAwMDAwMiwJLy8gdW51c2VkCisJRUVETwk9IDB4MDAwMDAwMDgsCS8vIHVudXNlZAorCUVFREkJPSAweDAwMDAwMDA0LAkvLyB1bnVzZWQKKwlFRVJFUQk9IDB4MDAwMDAwODAsCisJRUVST1AJPSAweDAwMDAwMjAwLAorCUVFV09QCT0gMHgwMDAwMDEwMAkvLyB1bnVzZWQKK307CisKKy8qIEVFUFJPTSBBZGRyZXNzZXMgKi8KK2VudW0gc2lzMTkwX2VlcHJvbV9hZGRyZXNzIHsKKwlFRVBST01TaWduYXR1cmUJPSAweDAwLAorCUVFUFJPTUNMSwk9IDB4MDEsCS8vIHVudXNlZAorCUVFUFJPTUluZm8JPSAweDAyLAorCUVFUFJPTU1BQ0FkZHIJPSAweDAzCit9OworCitlbnVtIHNpczE5MF9mZWF0dXJlIHsKKwlGX0hBU19SR01JSQk9IDEsCisJRl9QSFlfODhFMTExMQk9IDIsCisJRl9QSFlfQkNNNTQ2MQk9IDQKK307CisKK3N0cnVjdCBzaXMxOTBfcHJpdmF0ZSB7CisJdm9pZCAqbW1pb19hZGRyOworCXN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2aWNlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTMyIGN1cl9yeDsKKwl1MzIgY3VyX3R4OworCXUzMiBkaXJ0eV9yeDsKKwl1MzIgZGlydHlfdHg7CisJdTMyIHJ4X2RtYTsKKwl1MzIgdHhfZG1hOworCXN0cnVjdCBSeERlc2MgKlJ4RGVzY1Jpbmc7CisJc3RydWN0IFR4RGVzYyAqVHhEZXNjUmluZzsKKwlzdHJ1Y3QgaW9fYnVmZmVyICpSeF9pb2J1ZltOVU1fUlhfREVTQ107CisJc3RydWN0IGlvX2J1ZmZlciAqVHhfaW9idWZbTlVNX1RYX0RFU0NdOworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWlfaWY7CisJc3RydWN0IGxpc3RfaGVhZCBmaXJzdF9waHk7CisJdTMyIGZlYXR1cmVzOworfTsKKworc3RydWN0IHNpczE5MF9waHkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgcGh5X2lkOworCXUxNiBpZFsyXTsKKwl1MTYgc3RhdHVzOworCXU4ICB0eXBlOworfTsKKworZW51bSBzaXMxOTBfcGh5X3R5cGUgeworCVVOS05PV04JPSAweDAwLAorCUhPTUUJPSAweDAxLAorCUxBTgk9IDB4MDIsCisJTUlYCT0gMHgwMworfTsKKworc3RhdGljIHN0cnVjdCBtaWlfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXUxNiBpZFsyXTsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1MzIgZmVhdHVyZTsKK30gbWlpX2NoaXBfdGFibGVbXSA9IHsKKwl7ICJBdGhlcm9zIFBIWSIsICAgICAgICAgIHsgMHgwMDRkLCAweGQwMTAgfSwgTEFOLCAwIH0sCisJeyAiQXRoZXJvcyBQSFkgQVI4MDEyIiwgICB7IDB4MDA0ZCwgMHhkMDIwIH0sIExBTiwgMCB9LAorCXsgIkJyb2FkY29tIFBIWSBCQ001NDYxIiwgeyAweDAwMjAsIDB4NjBjMCB9LCBMQU4sIEZfUEhZX0JDTTU0NjEgfSwKKwl7ICJCcm9hZGNvbSBQSFkgQUMxMzEiLCAgIHsgMHgwMTQzLCAweGJjNzAgfSwgTEFOLCAwIH0sCisJeyAiQWdlcmUgUEhZIEVUMTEwMUIiLCAgICB7IDB4MDI4MiwgMHhmMDEwIH0sIExBTiwgMCB9LAorCXsgIk1hcnZlbGwgUEhZIDg4RTExMTEiLCAgeyAweDAxNDEsIDB4MGNjMCB9LCBMQU4sIEZfUEhZXzg4RTExMTEgfSwKKwl7ICJSZWFsdGVrIFBIWSBSVEw4MjAxIiwgIHsgMHgwMDAwLCAweDgyMDAgfSwgTEFOLCAwIH0sCisJeyBOVUxMLCB7IDB4MDAsIDB4MDAgfSwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworfSBzaXNfY2hpcF9pbmZvW10gPSB7CisJeyAiU2lTIDE5MCBQQ0kgRmFzdCBFdGhlcm5ldCBhZGFwdGVyIiB9LAorCXsgIlNpUyAxOTEgUENJIEdpZ2FiaXQgRXRoZXJuZXQgYWRhcHRlciIgfSwKK307CisKK3N0YXRpYyB2b2lkIHNpczE5MF9waHlfdGFzayhzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwKTsKK3N0YXRpYyB2b2lkIHNpczE5MF9mcmVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlubGluZSB2b2lkIHNpczE5MF9pbml0X3J4ZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NpczkwMC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc2lzOTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNGEwOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NpczkwMC5jCkBAIC0wLDAgKzEsMTMwNCBAQAorLyogLSotIE1vZGU6QzsgYy1iYXNpYy1vZmZzZXQ6NDsgLSotICovCisKKy8qIAorICAgc2lzOTAwLmM6IEFuIFNpUyA5MDAvNzAxNiBQQ0kgRmFzdCBFdGhlcm5ldCBkcml2ZXIgZm9yIEV0aGVyYm9vdAorICAgQ29weXJpZ2h0IChDKSAyMDAxIEVudGl0eSBDeWJlciwgSW5jLgorCisgICBSZXZpc2lvbjoJMS4wCU1hcmNoIDEsIDIwMDEKKyAgIAorICAgQXV0aG9yOiBNYXJ0eSBDb25ub3IgKG1kY0BldGhlcmJvb3Qub3JnKQorCisgICBBZGFwdGVkIGZyb20gYSBMaW51eCBkcml2ZXIgd2hpY2ggd2FzIHdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlcgorICAgYW5kIG1vZGlmaWVkIGJ5IE9sbGllIExobyBhbmQgQ2hpbi1TaGFuIExpIG9mIFNpUyBDb3Jwb3JhdGlvbi4KKyAgIFJld3JpdHRlbiBmb3IgRXRoZXJib290IGJ5IE1hcnR5IENvbm5vci4KKyAgIAorICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICAKKyAgIFJlZmVyZW5jZXM6CisgICBTaVMgNzAxNiBGYXN0IEV0aGVybmV0IFBDSSBCdXMgMTAvMTAwIE1icHMgTEFOIENvbnRyb2xsZXIgd2l0aCBPbk5vdyBTdXBwb3J0LAorICAgcHJlbGltaW5hcnkgUmV2LiAxLjAgSmFuLiAxNCwgMTk5OAorICAgU2lTIDkwMCBGYXN0IEV0aGVybmV0IFBDSSBCdXMgMTAvMTAwIE1icHMgTEFOIFNpbmdsZSBDaGlwIHdpdGggT25Ob3cgU3VwcG9ydCwKKyAgIHByZWxpbWluYXJ5IFJldi4gMS4wIE5vdi4gMTAsIDE5OTgKKyAgIFNpUyA3MDE0IFNpbmdsZSBDaGlwIDEwMEJBU0UtVFgvMTBCQVNFLVQgUGh5c2ljYWwgTGF5ZXIgU29sdXRpb24sCisgICBwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE4LCAxOTk4CisgICBodHRwOi8vd3d3LnNpcy5jb20udHcvc3VwcG9ydC9kYXRhYm9vay5odG0gKi8KKworRklMRV9MSUNFTkNFICggR1BMX0FOWSApOworCisvKiBSZXZpc2lvbiBIaXN0b3J5ICovCisKKy8qCisgIDA3IERlYyAyMDAzICB0aW1sZWdnZSAtIEVuYWJsZWQgTXVsdGljYXN0IFN1cHBvcnQKKyAgMDYgRGVjIDIwMDMgIHRpbWxlZ2dlIC0gRml4ZWQgcmVsb2NhdGlvbiBpc3N1ZSBpbiA1LjIKKyAgMDQgSmFuIDIwMDIgIENoaWVuLVl1IENoZW4sIERvdWcgQW1icmlza28sIE1hcnR5IENvbm5vciAgUGF0Y2ggdG8gRXRoZXJib290IDUuMC41CisgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTaVMgNjMwRVQgcGx1cyB2YXJpb3VzIGJ1ZyBmaXhlcyBmcm9tIGxpbnV4IGtlcm5lbAorICAgICBzb3VyY2UgMi40LjE3LgorICAwMSBNYXJjaCAyMDAxICBtZGMgICAgIDEuMAorICAgICBJbml0aWFsIFJlbGVhc2UuICBUZXN0ZWQgd2l0aCBQQ0kgYmFzZWQgc2lzOTAwIGNhcmQgYW5kIFRoaW5rTklDCisgICAgIGNvbXB1dGVyLgorICAyMCBNYXJjaCAyMDAxIFAuS29lZ2VsCisgICAgIGFkZGVkIHN1cHBvcnQgZm9yIHNpczYzMGUgYW5kIFBIWSBJQ1MxODkzIGFuZCBSVEw4MjAxCisgICAgIFRlc3RldCB3aXRoIFNJUzczMFMgY2hpcHNldCArIElDUzE4OTMKKyovCisKKwwKKy8qIEluY2x1ZGVzICovCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgIm5pYy5oIgorCisjaW5jbHVkZSAic2lzOTAwLmgiCisKKy8qIEdsb2JhbHMgKi8KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyBzaXM5MDBfb3BlcmF0aW9uczsKKworc3RhdGljIGludCBzaXM5MDBfZGVidWcgPSAwOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmVuZG9yLCBkZXZfaWQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb2FkZHI7CitzdGF0aWMgdTggcGNpX3JldmlzaW9uOworCitzdGF0aWMgdW5zaWduZWQgaW50IGN1cl9waHk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3VyX3J4OworCitzdHJ1Y3QgeworICAgIEJ1ZmZlckRlc2MgdHhkOworICAgIEJ1ZmZlckRlc2MgcnhkW05VTV9SWF9ERVNDXTsKKyAgICB1bnNpZ25lZCBjaGFyIHR4YltUWF9CVUZfU0laRV07CisgICAgdW5zaWduZWQgY2hhciByeGJbTlVNX1JYX0RFU0MgKiBSWF9CVUZfU0laRV07Cit9IHNpczkwMF9idWZzIF9fc2hhcmVkOworI2RlZmluZSB0eGQgc2lzOTAwX2J1ZnMudHhkCisjZGVmaW5lIHJ4ZCBzaXM5MDBfYnVmcy5yeGQKKyNkZWZpbmUgdHhiIHNpczkwMF9idWZzLnR4YgorI2RlZmluZSByeGIgc2lzOTAwX2J1ZnMucnhiCisKKyNpZiAwCitzdGF0aWMgc3RydWN0IG1hY19jaGlwX2luZm8geworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdTE2IHZlbmRvcl9pZCwgZGV2aWNlX2lkLCBmbGFnczsKKyAgICBpbnQgaW9fc2l6ZTsKK30gbWFjX2NoaXBfdGFibGVbXSA9IHsKKyAgICB7ICJTaVMgOTAwIFBDSSBGYXN0IEV0aGVybmV0IiwgUENJX1ZFTkRPUl9JRF9TSVMsIFBDSV9ERVZJQ0VfSURfU0lTOTAwLAorICAgICAgUENJX0NPTU1BTkRfSU98UENJX0NPTU1BTkRfTUFTVEVSLCBTSVM5MDBfVE9UQUxfU0laRX0sCisgICAgeyAiU2lTIDcwMTYgUENJIEZhc3QgRXRoZXJuZXQiLFBDSV9WRU5ET1JfSURfU0lTLCBQQ0lfREVWSUNFX0lEX1NJUzcwMTYsCisgICAgICBQQ0lfQ09NTUFORF9JT3xQQ0lfQ09NTUFORF9NQVNURVIsIFNJUzkwMF9UT1RBTF9TSVpFfSwKKyAgICB7MCwwLDAsMCwwfSAvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2lzOTAwX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpOworc3RhdGljIHZvaWQgYW1kNzljOTAxX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpOworc3RhdGljIHZvaWQgaWNzMTg5M19yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KTsKK3N0YXRpYyB2b2lkIHJ0bDgyMDFfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCk7CitzdGF0aWMgdm9pZCB2dDYxMDNfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCk7CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX2NoaXBfaW5mbyB7CisgICAgY29uc3QgY2hhciAqIG5hbWU7CisgICAgdTE2IHBoeV9pZDA7CisgICAgdTE2IHBoeV9pZDE7CisgICAgdm9pZCAoKnJlYWRfbW9kZSkgKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCk7Cit9IG1paV9jaGlwX3RhYmxlW10gPSB7CisgICAgeyJTaVMgOTAwIEludGVybmFsIE1JSSBQSFkiLCAweDAwMWQsIDB4ODAwMCwgc2lzOTAwX3JlYWRfbW9kZX0sCisgICAgeyJTaVMgNzAxNCBQaHlzaWNhbCBMYXllciBTb2x1dGlvbiIsIDB4MDAxNiwgMHhmODMwLHNpczkwMF9yZWFkX21vZGV9LAorICAgIHsiU2lTIDkwMCBvbiBGb3hjb25uIDY2MSA3TUkiLCAweDAxNDMsIDB4QkM3MCwgc2lzOTAwX3JlYWRfbW9kZX0sCisgICAgeyJBTUQgNzlDOTAxIDEwQkFTRS1UIFBIWSIsICAweDAwMDAsIDB4NkI3MCwgYW1kNzljOTAxX3JlYWRfbW9kZX0sCisgICAgeyJBTUQgNzlDOTAxIEhvbWVQTkEgUEhZIiwgICAweDAwMDAsIDB4NkI5MCwgYW1kNzljOTAxX3JlYWRfbW9kZX0sCisgICAgeyJJQ1MgMTg5MyBJbnRlZ3JhdGVkIFBIWWNlaXZlciIgICAsIDB4MDAxNSwgMHhmNDQwLGljczE4OTNfcmVhZF9tb2RlfSwKKy8vICB7Ik5TIDgzODUxIFBIWSIsMHgyMDAwLCAweDVDMjAsIE1JWCB9LAorICAgIHsiUlRMIDgyMDEgMTAvMTAwTWJwcyBQaHljZWl2ZXIiICAgLCAweDAwMDAsIDB4ODIwMCxydGw4MjAxX3JlYWRfbW9kZX0sCisgICAgeyJWSUEgNjEwMyAxMC8xMDBNYnBzIFBoeWNlaXZlciIsIDB4MDEwMSwgMHg4ZjIwLHZ0NjEwM19yZWFkX21vZGV9LAorICAgIHswLDAsMCwwfQorfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5IHsKKyAgICBzdHJ1Y3QgbWlpX3BoeSAqIG5leHQ7CisgICAgc3RydWN0IG1paV9jaGlwX2luZm8gKiBjaGlwX2luZm87CisgICAgaW50IHBoeV9hZGRyOworICAgIHUxNiBzdGF0dXM7Cit9IG1paTsKKworDAorCisjaWYgMAorLy8gUENJIHRvIElTQSBicmlkZ2UgZm9yIFNJUzY0MEUgYWNjZXNzCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2lzYV9icmlkZ2VfbGlzdFtdID0geworCXsgLnZlbmRvciA9IDB4MTAzOSwgLmRldmljZSA9IDB4MDAwOCwKKwkJLm5hbWUgPSAiU0lTIDg1QzUwMy81NTEzIFBDSSB0byBJU0EgYnJpZGdlIn0sCit9OworCitQQ0lfRFJJVkVSKCBzaXNfYnJpZGdlX3BjaV9kcml2ZXIsIHBjaV9pc2FfYnJpZGdlX2xpc3QsIFBDSV9OT19DTEFTUyApOworCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgc2lzX2JyaWRnZV9kcml2ZXIgPSB7CisgICAgLm5hbWUgPSAiU0lTIElTQSBicmlkZ2UiLAorICAgIC5idXNfZHJpdmVyID0gJnBjaV9kcml2ZXIsCisgICAgLmJ1c19kcml2ZXJfaW5mbyA9ICggc3RydWN0IGJ1c19kcml2ZXJfaW5mbyAqICkgJnNpc19icmlkZ2VfcGNpX2RyaXZlciwKK307CisjZW5kaWYKKworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworCitzdGF0aWMgaW50IHNpczkwMF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CisKK3N0YXRpYyB1MTYgIHNpczkwMF9yZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgc2lzOTAwX21kaW9fcmVzZXQobG9uZyBtZGlvX2FkZHIpOworc3RhdGljIHZvaWQgc2lzOTAwX21kaW9faWRsZShsb25nIG1kaW9fYWRkcik7CitzdGF0aWMgdTE2ICBzaXM5MDBfbWRpb19yZWFkKGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CisjaWYgMAorc3RhdGljIHZvaWQgc2lzOTAwX21kaW9fd3JpdGUoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgc2lzOTAwX2luaXQoc3RydWN0IG5pYyAqbmljKTsKKworc3RhdGljIHZvaWQgc2lzOTAwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CisKK3N0YXRpYyB2b2lkIHNpczkwMF9pbml0X3J4ZmlsdGVyKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBzaXM5MDBfaW5pdF90eGQoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHNpczkwMF9pbml0X3J4ZChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgc2lzOTAwX3NldF9yeF9tb2RlKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBzaXM5MDBfY2hlY2tfbW9kZShzdHJ1Y3QgbmljICpuaWMpOworCitzdGF0aWMgdm9pZCBzaXM5MDBfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApOworc3RhdGljIGludCAgc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpOworCitzdGF0aWMgdm9pZCBzaXM5MDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpOworCitzdGF0aWMgdm9pZCBzaXM5MDBfaXJxKHN0cnVjdCBuaWMgKm5pYywgaXJxX2FjdGlvbl90IGFjdGlvbik7CisKKy8qKgorICoJc2lzOTAwX2dldF9tYWNfYWRkcjogLSBHZXQgTUFDIGFkZHJlc3MgZm9yIHN0YW5kIGFsb25lIFNpUzkwMCBtb2RlbAorICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvcgorICoKKyAqCU9sZGVyIFNpUzkwMCBhbmQgZnJpZW5kcywgdXNlIEVFUFJPTSB0byBzdG9yZSBNQUMgYWRkcmVzcy4KKyAqCU1BQyBhZGRyZXNzIGlzIHJlYWQgZnJvbSByZWFkX2VlcHJvbSgpIGludG8gQG5ldF9kZXYtPmRldl9hZGRyLgorICovCisKK3N0YXRpYyBpbnQgc2lzOTAwX2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldmljZSAqIHBjaV9kZXYgX191bnVzZWQsIHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1MTYgc2lnbmF0dXJlOworCWludCBpOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgc2FuZSBFRVBST00gKi8KKwlzaWduYXR1cmUgPSAodTE2KSBzaXM5MDBfcmVhZF9lZXByb20oIEVFUFJPTVNpZ25hdHVyZSk7CisJaWYgKHNpZ25hdHVyZSA9PSAweGZmZmYgfHwgc2lnbmF0dXJlID09IDB4MDAwMCkgeworCQlwcmludGYgKCJzaXM5MDBfcHJvYmU6IEVycm9yIEVFUlBPTSByZWFkICVoWFxuIiwgc2lnbmF0dXJlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZ2V0IE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCSgodTE2ICopKG5pYy0+bm9kZV9hZGRyKSlbaV0gPSBzaXM5MDBfcmVhZF9lZXByb20oaStFRVBST01NQUNBZGRyKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglzaXM5NnhfZ2V0X21hY19hZGRyOiAtIEdldCBNQUMgYWRkcmVzcyBmb3IgU2lTOTYyIG9yIFNpUzk2MyBtb2RlbAorICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvciAKKyAqCisgKglTaVM5NjIgb3IgU2lTOTYzIG1vZGVsLCB1c2UgRUVQUk9NIHRvIHN0b3JlIE1BQyBhZGRyZXNzLiBBbmQgRUVQUk9NIAorICoJaXMgc2hhcmVkIGJ5CisgKglMQU4gYW5kIDEzOTQuIFdoZW4gYWNjZXNzIEVFUFJPTSwgc2VuZCBFRVJFUSBzaWduYWwgdG8gaGFyZHdhcmUgZmlyc3QgCisgKglhbmQgd2FpdCBmb3IgRUVHTlQuIElmIEVFR05UIGlzIE9OLCBFRVBST00gaXMgcGVybWl0dGVkIHRvIGJlIGFjY2VzcyAKKyAqCWJ5IExBTiwgb3RoZXJ3aXNlIGlzIG5vdC4gQWZ0ZXIgTUFDIGFkZHJlc3MgaXMgcmVhZCBmcm9tIEVFUFJPTSwgc2VuZAorICoJRUVET05FIHNpZ25hbCB0byByZWZ1c2UgRUVQUk9NIGFjY2VzcyBieSBMQU4uIAorICoJVGhlIEVFUFJPTSBtYXAgb2YgU2lTOTYyIG9yIFNpUzk2MyBpcyBkaWZmZXJlbnQgdG8gU2lTOTAwLiAKKyAqCVRoZSBzaWduYXR1cmUgZmllbGQgaW4gU2lTOTYyIG9yIFNpUzk2MyBzcGVjIGlzIG1lYW5pbmdsZXNzLiAKKyAqCU1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KKworc3RhdGljIGludCBzaXM5NnhfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2aWNlICogcGNpX2RldiBfX3VudXNlZCwgc3RydWN0IG5pYyAqbmljKQoreworLyogCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOyAqLworCWxvbmcgZWVfYWRkciA9IGlvYWRkciArIG1lYXI7CisJdTMyIHdhaXR0aW1lID0gMDsKKwlpbnQgaTsKKwkKKwlwcmludGYoIkFsdGVybmF0ZSBmdW5jdGlvblxuIik7CisKKwlvdXRsKEVFUkVRLCBlZV9hZGRyKTsKKwl3aGlsZSh3YWl0dGltZSA8IDIwMDApIHsKKwkJaWYoaW5sKGVlX2FkZHIpICYgRUVHTlQpIHsKKworCQkJLyogZ2V0IE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJICAgICAgICAoKHUxNiAqKShuaWMtPm5vZGVfYWRkcikpW2ldID0gc2lzOTAwX3JlYWRfZWVwcm9tKGkrRUVQUk9NTUFDQWRkcik7CisKKwkJCW91dGwoRUVET05FLCBlZV9hZGRyKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJdWRlbGF5KDEpOwkKKwkJCXdhaXR0aW1lICsrOworCQl9CisJfQorCW91dGwoRUVET05FLCBlZV9hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzaXM2MzBlX2dldF9tYWNfYWRkcjogLSBHZXQgTUFDIGFkZHJlc3MgZm9yIFNpUzYzMEUgbW9kZWwKKyAqCUBwY2lfZGV2OiB0aGUgc2lzOTAwIHBjaSBkZXZpY2UKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IKKyAqCisgKglTaVM2MzBFIG1vZGVsLCB1c2UgQVBDIENNT1MgUkFNIHRvIHN0b3JlIE1BQyBhZGRyZXNzLgorICoJQVBDIENNT1MgUkFNIGlzIGFjY2Vzc2VkIHRocm91Z2ggSVNBIGJyaWRnZS4KKyAqCU1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KKworc3RhdGljIGludCBzaXM2MzBlX2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldmljZSAqIHBjaV9kZXYgX191bnVzZWQsIHN0cnVjdCBuaWMgKm5pYykKK3sKKyNpZiAwCisJdTggcmVnOworCWludCBpOworCXN0cnVjdCBidXNfbG9jIGJ1c19sb2M7CisJdW5pb24geworCSAgICBzdHJ1Y3QgYnVzX2RldiBidXNfZGV2OworCSAgICBzdHJ1Y3QgcGNpX2RldmljZSBpc2FfYnJpZGdlOworCX0gdTsKKworCS8qIGZpbmQgUENJIHRvIElTQSBicmlkZ2UgKi8KKwltZW1zZXQoJmJ1c19sb2MsIDAsIHNpemVvZihidXNfbG9jKSk7CisJaWYgKCAhIGZpbmRfYnlfZHJpdmVyICggJmJ1c19sb2MsICZ1LmJ1c19kZXYsICZzaXNfYnJpZGdlX2RyaXZlciwgMCApICkKKwkgICAgcmV0dXJuIDA7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZSgmdS5pc2FfYnJpZGdlLCAweDQ4LCAmcmVnKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoJnUuaXNhX2JyaWRnZSwgMHg0OCwgcmVnIHwgMHg0MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwl7CisJCW91dGIoMHgwOSArIGksIDB4NzApOworCQkoKHU4ICopKG5pYy0+bm9kZV9hZGRyKSlbaV0gPSBpbmIoMHg3MSk7CisJfQorCXBjaV93cml0ZV9jb25maWdfYnl0ZSgmdS5pc2FfYnJpZGdlLCAweDQ4LCByZWcgJiB+MHg0MCk7CisKKwlyZXR1cm4gMTsKKyNlbmRpZgorCisJLyogRG9lcyBub3Qgd29yayB3aXRoIGN1cnJlbnQgYnVzL2RldmljZSBtb2RlbCAqLworCW1lbXNldCAoIG5pYy0+bm9kZV9hZGRyLCAwLCBzaXplb2YgKCBuaWMtPm5vZGVfYWRkciApICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogICAgICBzaXM2MzBlX2dldF9tYWNfYWRkcjogLSBHZXQgTUFDIGFkZHJlc3MgZm9yIFNpUzYzMEUgbW9kZWwKKyAqICAgICAgQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQorICogICAgICBAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gZ2V0IGFkZHJlc3MgZm9yCisgKgorICogICAgICBTaVM2MzBFIG1vZGVsLCB1c2UgQVBDIENNT1MgUkFNIHRvIHN0b3JlIE1BQyBhZGRyZXNzLgorICogICAgICBBUEMgQ01PUyBSQU0gaXMgYWNjZXNzZWQgdGhyb3VnaCBJU0EgYnJpZGdlLgorICogICAgICBNQUMgYWRkcmVzcyBpcyByZWFkIGludG8gQG5ldF9kZXYtPmRldl9hZGRyLgorICovCisKK3N0YXRpYyBpbnQgc2lzNjM1X2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldmljZSAqIHBjaV9kZXYgX191bnVzZWQsIHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICAgICAgdTMyIHJmY3JTYXZlOworICAgICAgICB1MzIgaTsKKwkKKwkKKyAgICAgICAgcmZjclNhdmUgPSBpbmwocmZjciArIGlvYWRkcik7CisKKyAgICAgICAgb3V0bChyZmNyU2F2ZSB8IFJFTE9BRCwgaW9hZGRyICsgY3IpOworICAgICAgICBvdXRsKDAsIGlvYWRkciArIGNyKTsKKworICAgICAgICAvKiBkaXNhYmxlIHBhY2tldCBmaWx0ZXJpbmcgYmVmb3JlIHNldHRpbmcgZmlsdGVyICovCisgICAgICAgIG91dGwocmZjclNhdmUgJiB+UkZFTiwgcmZjciArIGlvYWRkcik7CisKKyAgICAgICAgLyogbG9hZCBNQUMgYWRkciB0byBmaWx0ZXIgZGF0YSByZWdpc3RlciAqLworICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IDMgOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRsKChpIDw8IFJGQUREUl9zaGlmdCksIGlvYWRkciArIHJmY3IpOworICAgICAgICAgICAgICAgICooICgodTE2ICopbmljLT5ub2RlX2FkZHIpICsgaSkgPSBpbncoaW9hZGRyICsgcmZkcik7CisgICAgICAgIH0KKworICAgICAgICAvKiBlbmFibGUgcGFja2V0IGZpbGl0ZXJpbmcgKi8KKyAgICAgICAgb3V0bChyZmNyU2F2ZSB8IFJGRU4sIHJmY3IgKyBpb2FkZHIpOworCisgICAgICAgIHJldHVybiAxOworfQorDAorLyogCisgKiBGdW5jdGlvbjogc2lzOTAwX3Byb2JlCisgKgorICogRGVzY3JpcHRpb246IGluaXRpYWxpemVzIGluaXRpYWxpemVzIHRoZSBOSUMsIHJldHJpZXZlcyB0aGUKKyAqICAgIE1BQyBhZGRyZXNzIG9mIHRoZSBjYXJkLCBhbmQgc2V0cyB1cCBzb21lIGdsb2JhbHMgcmVxdWlyZWQgYnkgCisgKiAgICBvdGhlciByb3V0aW5lcy4KKyAqCisgKiBTaWRlIGVmZmVjdHM6CisgKiAgICAgICAgICAgIGxlYXZlcyB0aGUgaW9hZGRyZXNzIG9mIHRoZSBzaXM5MDAgY2hpcCBpbiB0aGUgdmFyaWFibGUgaW9hZGRyLgorICogICAgICAgICAgICBsZWF2ZXMgdGhlIHNpczkwMCBpbml0aWFsaXplZCwgYW5kIHJlYWR5IHRvIHJlY2lldmUgcGFja2V0cy4KKyAqCisgKiBSZXR1cm5zOiAgIHN0cnVjdCBuaWMgKjogICAgICAgICAgcG9pbnRlciB0byBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqLworCitzdGF0aWMgaW50IHNpczkwMF9wcm9iZSAoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKworICAgIGludCBpOworICAgIGludCBmb3VuZD0wOworICAgIGludCBwaHlfYWRkcjsKKyAgICB1OCByZXZpc2lvbjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHBjaS0+aW9hZGRyID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgbmljLT5pcnFubyAgPSAwOworICAgIG5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHI7CisKKyAgICBpb2FkZHIgID0gcGNpLT5pb2FkZHI7CisgICAgdmVuZG9yICA9IHBjaS0+dmVuZG9yOworICAgIGRldl9pZCAgPSBwY2ktPmRldmljZTsKKworICAgIC8qIHdha2V1cCBjaGlwICovCisgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2ksIDB4NDAsIDB4MDAwMDAwMDApOworCisgICAgYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworICAgIC8qIGdldCBNQUMgYWRkcmVzcyAqLworICAgIHJldCA9IDA7CisgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lfUkVWSVNJT04sICZyZXZpc2lvbik7CisgICAgCisgICAgLyogc2F2ZSBmb3IgdXNlIGxhdGVyIGluIHNpczkwMF9yZXNldCgpICovCisgICAgcGNpX3JldmlzaW9uID0gcmV2aXNpb247IAorCisgICAgaWYgKHJldmlzaW9uID09IFNJUzYzMEVfOTAwX1JFVikKKyAgICAgICAgcmV0ID0gc2lzNjMwZV9nZXRfbWFjX2FkZHIocGNpLCBuaWMpOworICAgIGVsc2UgaWYgKChyZXZpc2lvbiA+IDB4ODEpICYmIChyZXZpc2lvbiA8PSAweDkwKSkKKyAgICAgICAgcmV0ID0gc2lzNjM1X2dldF9tYWNfYWRkcihwY2ksIG5pYyk7CisgICAgZWxzZSBpZiAocmV2aXNpb24gPT0gU0lTOTZ4XzkwMF9SRVYpCisJcmV0ID0gc2lzOTZ4X2dldF9tYWNfYWRkcihwY2ksIG5pYyk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBzaXM5MDBfZ2V0X21hY19hZGRyKHBjaSwgbmljKTsKKworICAgIGlmIChyZXQgPT0gMCkKKyAgICB7CisgICAgICAgIHByaW50ZiAoInNpczkwMF9wcm9iZTogRXJyb3IgTUFDIGFkZHJlc3Mgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogNjMwRVQgOiBzZXQgdGhlIG1paSBhY2Nlc3MgbW9kZSBhcyBzb2Z0d2FyZS1tb2RlICovCisgICAgaWYgKHJldmlzaW9uID09IFNJUzYzMEVUXzkwMF9SRVYpCisJb3V0bChBQ0NFU1NNT0RFIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCisgICAgREJHKCAic2lzOTAwX3Byb2JlOiBWZW5kb3I6JSNoWCBEZXZpY2U6JSNoWFxuIiwgdmVuZG9yLCBkZXZfaWQgKTsKKworICAgIC8qIHByb2JlIGZvciBtaWkgdHJhbnNjZWl2ZXIgKi8KKyAgICAvKiBzZWFyY2ggZm9yIHRvdGFsIG9mIDMyIHBvc3NpYmxlIG1paSBwaHkgYWRkcmVzc2VzICovCisKKyAgICBmb3VuZCA9IDA7CisgICAgZm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgMzI7IHBoeV9hZGRyKyspIHsKKyAgICAgICAgdTE2IG1paV9zdGF0dXM7CisgICAgICAgIHUxNiBwaHlfaWQwLCBwaHlfaWQxOworCisgICAgICAgIG1paV9zdGF0dXMgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKyAgICAgICAgaWYgKG1paV9zdGF0dXMgPT0gMHhmZmZmIHx8IG1paV9zdGF0dXMgPT0gMHgwMDAwKQorICAgICAgICAgICAgLyogdGhlIG1paSBpcyBub3QgYWNjZXNzYWJsZSwgdHJ5IG5leHQgb25lICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgcGh5X2lkMCA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9QSFlfSUQwKTsKKyAgICAgICAgcGh5X2lkMSA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9QSFlfSUQxKTsKKworICAgICAgICAvKiBzZWFyY2ggb3VyIG1paSB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgbWlpICovIAorICAgICAgICBmb3IgKGkgPSAwOyBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxOyBpKyspIHsKKworICAgICAgICAgICAgaWYgKChwaHlfaWQwID09IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9pZDApICYmCisgICAgICAgICAgICAgICAgKChwaHlfaWQxICYgMHhGRkYwKSA9PSBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxKSl7CisKKyAgICAgICAgICAgICAgICBwcmludGYoInNpczkwMF9wcm9iZTogJXMgdHJhbnNjZWl2ZXIgZm91bmQgYXQgYWRkcmVzcyAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1paV9jaGlwX3RhYmxlW2ldLm5hbWUsIHBoeV9hZGRyKTsKKworICAgICAgICAgICAgICAgIG1paS5jaGlwX2luZm8gPSAmbWlpX2NoaXBfdGFibGVbaV07CisgICAgICAgICAgICAgICAgbWlpLnBoeV9hZGRyICA9IHBoeV9hZGRyOworICAgICAgICAgICAgICAgIG1paS5zdGF0dXMgICAgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICBtaWkubmV4dCAgICAgID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGZvdW5kPTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIGlmIChmb3VuZCA9PSAwKSB7CisgICAgICAgIHByaW50Zigic2lzOTAwX3Byb2JlOiBObyBNSUkgdHJhbnNjZWl2ZXJzIGZvdW5kIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEFyYml0cmFyaWx5IHNlbGVjdCB0aGUgbGFzdCBQSFkgZm91bmQgYXMgY3VycmVudCBQSFkgKi8KKyAgICBjdXJfcGh5ID0gbWlpLnBoeV9hZGRyOworICAgIHByaW50Zigic2lzOTAwX3Byb2JlOiBVc2luZyAlcyBhcyBkZWZhdWx0XG4iLCAgbWlpLmNoaXBfaW5mby0+bmFtZSk7CisKKyAgICAvKiBpbml0aWFsaXplIGRldmljZSAqLworICAgIHNpczkwMF9pbml0KG5pYyk7CisgICAgbmljLT5uaWNfb3AJPSAmc2lzOTAwX29wZXJhdGlvbnM7CisKKyAgICByZXR1cm4gMTsKK30KKworCisKKwwKKy8qIAorICogRUVQUk9NIFJvdXRpbmVzOiAgVGhlc2UgZnVuY3Rpb25zIHJlYWQgYW5kIHdyaXRlIHRvIEVFUFJPTSBmb3IgCisgKiAgICByZXRyaWV2aW5nIHRoZSBNQUMgYWRkcmVzcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCAKKyAqICAgIHRoZSBjYXJkLgorICovCisKKy8qIERlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLiAqLworI2RlZmluZSBlZXByb21fZGVsYXkoKSAgaW5sKGVlX2FkZHIpCisKKwwKKy8qIEZ1bmN0aW9uOiBzaXM5MDBfcmVhZF9lZXByb20KKyAqCisgKiBEZXNjcmlwdGlvbjogcmVhZHMgYW5kIHJldHVybnMgYSBnaXZlbiBsb2NhdGlvbiBmcm9tIEVFUFJPTQorICoKKyAqIEFyZ3VtZW50czogaW50IGxvY2F0aW9uOiAgICAgICByZXF1ZXN0ZWQgRUVQUk9NIGxvY2F0aW9uCisgKgorICogUmV0dXJuczogICB1MTY6ICAgICAgICAgICAgICAgIGNvbnRlbnRzIG9mIHJlcXVlc3RlZCBFRVBST00gbG9jYXRpb24KKyAqCisgKi8KKworLyogUmVhZCBTZXJpYWwgRUVQUk9NIHRocm91Z2ggRUVQUk9NIEFjY2VzcyBSZWdpc3RlciwgTm90ZSB0aGF0IGxvY2F0aW9uIGlzIAorICAgaW4gd29yZCAoMTYgYml0cykgdW5pdCAqLworc3RhdGljIHUxNiBzaXM5MDBfcmVhZF9lZXByb20oaW50IGxvY2F0aW9uKQoreworICAgIGludCBpOworICAgIHUxNiByZXR2YWwgPSAwOworICAgIGxvbmcgZWVfYWRkciA9IGlvYWRkciArIG1lYXI7CisgICAgdTMyIHJlYWRfY21kID0gbG9jYXRpb24gfCBFRXJlYWQ7CisKKyAgICBvdXRsKDAsIGVlX2FkZHIpOworICAgIGVlcHJvbV9kZWxheSgpOworICAgIG91dGwoRUVDUywgZWVfYWRkcik7CisgICAgZWVwcm9tX2RlbGF5KCk7CisKKyAgICAvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kICg5KSBiaXRzIG91dC4gKi8KKyAgICBmb3IgKGkgPSA4OyBpID49IDA7IGktLSkgeworICAgICAgICB1MzIgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFREkgfCBFRUNTIDogRUVDUzsKKyAgICAgICAgb3V0bChkYXRhdmFsLCBlZV9hZGRyKTsKKyAgICAgICAgZWVwcm9tX2RlbGF5KCk7CisgICAgICAgIG91dGwoZGF0YXZhbCB8IEVFQ0xLLCBlZV9hZGRyKTsKKyAgICAgICAgZWVwcm9tX2RlbGF5KCk7CisgICAgfQorICAgIG91dGwoRUVDUywgZWVfYWRkcik7CisgICAgZWVwcm9tX2RlbGF5KCk7CisKKyAgICAvKiByZWFkIHRoZSAxNi1iaXRzIGRhdGEgaW4gKi8KKyAgICBmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworICAgICAgICBvdXRsKEVFQ1MsIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoKTsKKyAgICAgICAgb3V0bChFRUNTIHwgRUVDTEssIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoKTsKKyAgICAgICAgcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5sKGVlX2FkZHIpICYgRUVETykgPyAxIDogMCk7CisgICAgICAgIGVlcHJvbV9kZWxheSgpOworICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisgICAgb3V0bCgwLCBlZV9hZGRyKTsKKyAgICBlZXByb21fZGVsYXkoKTsKKy8vICBvdXRsKEVFQ0xLLCBlZV9hZGRyKTsKKworICAgIHJldHVybiAocmV0dmFsKTsKK30KKworI2RlZmluZSBzaXM5MDBfbWRpb19kZWxheSgpICAgIGlubChtZGlvX2FkZHIpCisKKwwKKy8qIAorICAgUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSBtYW5hZ2VtZW50IHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQKKyAgIHNlcmlhbCBNRElPIHByb3RvY29sLiBOb3RlIHRoYXQgdGhlIGNvbW1hbmQgYml0cyBhbmQgZGF0YSBiaXRzIGFyZQorICAgc2VuZCBvdXQgc2VwZXJhdGVseSAKKyovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9tZGlvX2lkbGUobG9uZyBtZGlvX2FkZHIpCit7CisgICAgb3V0bChNRElPIHwgTURESVIsIG1kaW9fYWRkcik7CisgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICBvdXRsKE1ESU8gfCBNRERJUiB8IE1EQywgbWRpb19hZGRyKTsKK30KKworLyogU3luY3Jvbml6ZSB0aGUgTUlJIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGJ5IHNoaWZ0aW5nIDMyIG9uZSBiaXRzIG91dC4gKi8KK3N0YXRpYyB2b2lkIHNpczkwMF9tZGlvX3Jlc2V0KGxvbmcgbWRpb19hZGRyKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIG91dGwoTURESVIgfCBNRElPLCBtZGlvX2FkZHIpOworICAgICAgICBzaXM5MDBfbWRpb19kZWxheSgpOworICAgICAgICBvdXRsKE1ERElSIHwgTURJTyB8IE1EQywgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdTE2IHNpczkwMF9tZGlvX3JlYWQoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworICAgIGxvbmcgbWRpb19hZGRyID0gaW9hZGRyICsgbWVhcjsKKyAgICBpbnQgbWlpX2NtZCA9IE1JSXJlYWR8KHBoeV9pZDw8TUlJcG1kU2hpZnQpfChsb2NhdGlvbjw8TUlJcmVnU2hpZnQpOworICAgIHUxNiByZXR2YWwgPSAwOworICAgIGludCBpOworCisgICAgc2lzOTAwX21kaW9fcmVzZXQobWRpb19hZGRyKTsKKyAgICBzaXM5MDBfbWRpb19pZGxlKG1kaW9fYWRkcik7CisKKyAgICBmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ERElSIHwgTURJTyA6IE1ERElSOworICAgICAgICBvdXRsKGRhdGF2YWwsIG1kaW9fYWRkcik7CisgICAgICAgIHNpczkwMF9tZGlvX2RlbGF5KCk7CisgICAgICAgIG91dGwoZGF0YXZhbCB8IE1EQywgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSAxNiBkYXRhIGJpdHMuICovCisgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgb3V0bCgwLCBtZGlvX2FkZHIpOworICAgICAgICBzaXM5MDBfbWRpb19kZWxheSgpOworICAgICAgICByZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmwobWRpb19hZGRyKSAmIE1ESU8pID8gMSA6IDApOworICAgICAgICBvdXRsKE1EQywgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICB9CisgICAgb3V0bCgweDAwLCBtZGlvX2FkZHIpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBzaXM5MDBfbWRpb193cml0ZShpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKyAgICBsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIG1lYXI7CisgICAgaW50IG1paV9jbWQgPSBNSUl3cml0ZXwocGh5X2lkPDxNSUlwbWRTaGlmdCl8KGxvY2F0aW9uPDxNSUlyZWdTaGlmdCk7CisgICAgaW50IGk7CisKKyAgICBzaXM5MDBfbWRpb19yZXNldChtZGlvX2FkZHIpOworICAgIHNpczkwMF9tZGlvX2lkbGUobWRpb19hZGRyKTsKKworICAgIC8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworICAgIGZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworICAgICAgICBpbnQgZGF0YXZhbCA9IChtaWlfY21kICYgKDEgPDwgaSkpID8gTURESVIgfCBNRElPIDogTURESVI7CisgICAgICAgIG91dGIoZGF0YXZhbCwgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICAgICAgb3V0YihkYXRhdmFsIHwgTURDLCBtZGlvX2FkZHIpOworICAgICAgICBzaXM5MDBfbWRpb19kZWxheSgpOworICAgIH0KKyAgICBzaXM5MDBfbWRpb19kZWxheSgpOworCisgICAgLyogU2hpZnQgdGhlIHZhbHVlIGJpdHMgb3V0LiAqLworICAgIGZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworICAgICAgICBpbnQgZGF0YXZhbCA9ICh2YWx1ZSAmICgxIDw8IGkpKSA/IE1ERElSIHwgTURJTyA6IE1ERElSOworICAgICAgICBvdXRsKGRhdGF2YWwsIG1kaW9fYWRkcik7CisgICAgICAgIHNpczkwMF9tZGlvX2RlbGF5KCk7CisgICAgICAgIG91dGwoZGF0YXZhbCB8IE1EQywgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICB9CisgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICAgICAgCisgICAgLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisgICAgZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworICAgICAgICBvdXRiKDAsIG1kaW9fYWRkcik7CisgICAgICAgIHNpczkwMF9tZGlvX2RlbGF5KCk7CisgICAgICAgIG91dGIoTURDLCBtZGlvX2FkZHIpOworICAgICAgICBzaXM5MDBfbWRpb19kZWxheSgpOworICAgIH0KKyAgICBvdXRsKDB4MDAsIG1kaW9fYWRkcik7CisgICAgcmV0dXJuOworfQorI2VuZGlmCisKKwwKKy8qIEZ1bmN0aW9uOiBzaXM5MDBfaW5pdAorICoKKyAqIERlc2NyaXB0aW9uOiByZXNldHMgdGhlIGV0aGVybmV0IGNvbnRyb2xsZXIgY2hpcCBhbmQgdmFyaW91cworICogICAgZGF0YSBzdHJ1Y3R1cmVzIHJlcXVpcmVkIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgcGFja2V0cy4KKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZAorc2lzOTAwX2luaXQoc3RydWN0IG5pYyAqbmljKQoreworICAgIC8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisgICAgc2lzOTAwX3Jlc2V0KG5pYyk7CisKKyAgICBzaXM5MDBfaW5pdF9yeGZpbHRlcihuaWMpOworCisgICAgc2lzOTAwX2luaXRfdHhkKG5pYyk7CisgICAgc2lzOTAwX2luaXRfcnhkKG5pYyk7CisKKyAgICBzaXM5MDBfc2V0X3J4X21vZGUobmljKTsKKworICAgIHNpczkwMF9jaGVja19tb2RlKG5pYyk7CisKKyAgICBvdXRsKFJ4RU5BfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7Cit9CisKKwwKKy8qIAorICogRnVuY3Rpb246IHNpczkwMF9yZXNldAorICoKKyAqIERlc2NyaXB0aW9uOiBkaXNhYmxlcyBpbnRlcnJ1cHRzIGFuZCBzb2Z0IHJlc2V0cyB0aGUgY29udHJvbGxlciBjaGlwCisgKgorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZCAKK3NpczkwMF9yZXNldChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisgICAgaW50IGkgPSAwOworICAgIHUzMiBzdGF0dXMgPSBUeFJDTVAgfCBSeFJDTVA7CisKKyAgICBvdXRsKDAsIGlvYWRkciArIGllcik7CisgICAgb3V0bCgwLCBpb2FkZHIgKyBpbXIpOworICAgIG91dGwoMCwgaW9hZGRyICsgcmZjcik7CisKKyAgICBvdXRsKFJ4UkVTRVQgfCBUeFJFU0VUIHwgUkVTRVQgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBjaGlwIGhhcyBmaW5pc2hlZCB0aGUgcmVzZXQuICovCisgICAgd2hpbGUgKHN0YXR1cyAmJiAoaSsrIDwgMTAwMCkpIHsKKyAgICAgICAgc3RhdHVzIF49IChpbmwoaXNyICsgaW9hZGRyKSAmIHN0YXR1cyk7CisgICAgfQorCisgICAgaWYoIChwY2lfcmV2aXNpb24gPj0gU0lTNjM1QV85MDBfUkVWKSB8fCAocGNpX3JldmlzaW9uID09IFNJUzkwMEJfOTAwX1JFVikgKQorICAgICAgICAgICAgb3V0bChQRVNFTCB8IFJORF9DTlQsIGlvYWRkciArIGNmZyk7CisgICAgZWxzZQorICAgICAgICAgICAgb3V0bChQRVNFTCwgaW9hZGRyICsgY2ZnKTsKK30KKworDAorLyogRnVuY3Rpb246IHNpc19pbml0X3J4ZmlsdGVyCisgKgorICogRGVzY3JpcHRpb246IHNldHMgcmVjZWl2ZSBmaWx0ZXIgYWRkcmVzcyB0byBvdXIgTUFDIGFkZHJlc3MKKyAqCisgKiBBcmd1bWVudHM6IHN0cnVjdCBuaWMgKm5pYzogICAgICAgICAgTklDIGRhdGEgc3RydWN0dXJlCisgKgorICogcmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkCitzaXM5MDBfaW5pdF9yeGZpbHRlcihzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgdTMyIHJmY3JTYXZlOworICAgIGludCBpOworICAgICAgICAKKyAgICByZmNyU2F2ZSA9IGlubChyZmNyICsgaW9hZGRyKTsKKworICAgIC8qIGRpc2FibGUgcGFja2V0IGZpbHRlcmluZyBiZWZvcmUgc2V0dGluZyBmaWx0ZXIgKi8KKyAgICBvdXRsKHJmY3JTYXZlICYgflJGRU4sIHJmY3IgKyBpb2FkZHIpOworCisgICAgLyogbG9hZCBNQUMgYWRkciB0byBmaWx0ZXIgZGF0YSByZWdpc3RlciAqLworICAgIGZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgeworICAgICAgICB1MzIgdzsKKworICAgICAgICB3ID0gKHUzMikgKigodTE2ICopKG5pYy0+bm9kZV9hZGRyKStpKTsKKyAgICAgICAgb3V0bCgoaSA8PCBSRkFERFJfc2hpZnQpLCBpb2FkZHIgKyByZmNyKTsKKyAgICAgICAgb3V0bCh3LCBpb2FkZHIgKyByZmRyKTsKKworICAgICAgICBpZiAoc2lzOTAwX2RlYnVnID4gMCkKKyAgICAgICAgICAgIHByaW50Zigic2lzOTAwX2luaXRfcnhmaWx0ZXI6IFJlY2VpdmUgRmlsdGVyIEFkZHJzc1slZF09JVhcbiIsCisgICAgICAgICAgICAgICAgICAgaSwgaW5sKGlvYWRkciArIHJmZHIpKTsKKyAgICB9CisKKyAgICAvKiBlbmFibGUgcGFja2V0IGZpbGl0ZXJpbmcgKi8KKyAgICBvdXRsKHJmY3JTYXZlIHwgUkZFTiwgcmZjciArIGlvYWRkcik7Cit9CisKKwwKKy8qIAorICogRnVuY3Rpb246IHNpc19pbml0X3R4ZAorICoKKyAqIERlc2NyaXB0aW9uOiBpbml0aWFsaXplcyB0aGUgVHggZGVzY3JpcHRvcgorICoKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQKK3NpczkwMF9pbml0X3R4ZChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisgICAgdHhkLmxpbmsgICA9ICh1MzIpIDA7CisgICAgdHhkLmNtZHN0cyA9ICh1MzIpIDA7CisgICAgdHhkLmJ1ZnB0ciA9IHZpcnRfdG9fYnVzKCZ0eGJbMF0pOworCisgICAgLyogbG9hZCBUcmFuc21pdCBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCisgICAgb3V0bCh2aXJ0X3RvX2J1cygmdHhkKSwgaW9hZGRyICsgdHhkcCk7IAorICAgIGlmIChzaXM5MDBfZGVidWcgPiAwKQorICAgICAgICBwcmludGYoInNpczkwMF9pbml0X3R4ZDogVFggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJVhcbiIsIAorICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIHR4ZHApKTsKK30KKworDAorLyogRnVuY3Rpb246IHNpc19pbml0X3J4ZAorICoKKyAqIERlc2NyaXB0aW9uOiBpbml0aWFsaXplcyB0aGUgUnggZGVzY3JpcHRvciByaW5nCisgKiAgICAKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgCitzaXM5MDBfaW5pdF9yeGQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKSAKK3sgCisgICAgaW50IGk7CisKKyAgICBjdXJfcnggPSAwOyAKKworICAgIC8qIGluaXQgUlggZGVzY3JpcHRvciAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7CisgICAgICAgIHJ4ZFtpXS5saW5rICAgPSB2aXJ0X3RvX2J1cygoaSsxIDwgTlVNX1JYX0RFU0MpID8gJnJ4ZFtpKzFdIDogJnJ4ZFswXSk7CisgICAgICAgIHJ4ZFtpXS5jbWRzdHMgPSAodTMyKSBSWF9CVUZfU0laRTsKKyAgICAgICAgcnhkW2ldLmJ1ZnB0ciA9IHZpcnRfdG9fYnVzKCZyeGJbaSpSWF9CVUZfU0laRV0pOworICAgICAgICBpZiAoc2lzOTAwX2RlYnVnID4gMCkKKyAgICAgICAgICAgIHByaW50Zigic2lzOTAwX2luaXRfcnhkOiByeGRbJWRdPSVwIGxpbms9JVggY21kc3RzPSVYIGJ1ZnB0cj0lWFxuIiwgCisgICAgICAgICAgICAgICAgICAgaSwgJnJ4ZFtpXSwgKHVuc2lnbmVkIGludCkgcnhkW2ldLmxpbmssICh1bnNpZ25lZCBpbnQpIHJ4ZFtpXS5jbWRzdHMsCisJCSAgICh1bnNpZ25lZCBpbnQpIHJ4ZFtpXS5idWZwdHIpOworICAgIH0KKworICAgIC8qIGxvYWQgUmVjZWl2ZSBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCisgICAgb3V0bCh2aXJ0X3RvX2J1cygmcnhkWzBdKSwgaW9hZGRyICsgcnhkcCk7CisKKyAgICBpZiAoc2lzOTAwX2RlYnVnID4gMCkKKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfaW5pdF9yeGQ6IFJYIGRlc2NyaXB0b3IgcmVnaXN0ZXIgbG9hZGVkIHdpdGg6ICVYXG4iLCAKKyAgICAgICAgICAgICAgIGlubChpb2FkZHIgKyByeGRwKSk7CisKK30KKworDAorLyogRnVuY3Rpb246IHNpc19pbml0X3J4ZAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqICAgIHNldHMgdGhlIHJlY2VpdmUgbW9kZSB0byBhY2NlcHQgYWxsIGJyb2FkY2FzdCBwYWNrZXRzIGFuZCBwYWNrZXRzCisgKiAgICB3aXRoIG91ciBNQUMgYWRkcmVzcywgYW5kIHJlamVjdCBhbGwgbXVsdGljYXN0IHBhY2tldHMuICAgICAgCisgKiAgICAKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgc2lzOTAwX3NldF9yeF9tb2RlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKyAgICBpbnQgaSwgdGFibGVfZW50cmllczsKKyAgICB1MzIgcnhfbW9kZTsgCisgICAgdTE2IG1jX2ZpbHRlclsxNl0gPSB7MH07CS8qIDI1Ni8xMjggYml0cyBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLworICAgIAkKKyAgICBpZigocGNpX3JldmlzaW9uID09IFNJUzYzNUFfOTAwX1JFVikgfHwgKHBjaV9yZXZpc2lvbiA9PSBTSVM5MDBCXzkwMF9SRVYpKQorCXRhYmxlX2VudHJpZXMgPSAxNjsKKyAgICBlbHNlCisJdGFibGVfZW50cmllcyA9IDg7CisKKyAgICAvKiBhY2NlcHQgYWxsIG11bHRpY2FzdCBwYWNrZXQgKi8KKyAgICByeF9tb2RlID0gUkZBQUIgfCBSRkFBTTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGVfZW50cmllczsgaSsrKQorCQltY19maWx0ZXJbaV0gPSAweGZmZmY7CisJCQkJCQorICAgIC8qIHVwZGF0ZSBNdWx0aWNhc3QgSGFzaCBUYWJsZSBpbiBSZWNlaXZlIEZpbHRlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZV9lbnRyaWVzOyBpKyspIHsKKyAgICAgICAgLyogd2h5IHBsdXMgMHgwND8gVGhhdCBtYWtlcyB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgaGFzaCB0YWJsZS4gKi8KKyAgICAgICAgb3V0bCgodTMyKSgweDAwMDAwMDA0K2kpIDw8IFJGQUREUl9zaGlmdCwgaW9hZGRyICsgcmZjcik7CisgICAgICAgIG91dGwobWNfZmlsdGVyW2ldLCBpb2FkZHIgKyByZmRyKTsKKyAgICB9CisKKyAgICAvKiBBY2NlcHQgQnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgcGFja2V0cywgZGVzdGluYXRpb24gYWRkcmVzc2VzIHRoYXQgbWF0Y2ggCisgICAgICAgb3VyIE1BQyBhZGRyZXNzICovCisgICAgb3V0bChSRkVOIHwgcnhfbW9kZSwgaW9hZGRyICsgcmZjcik7CisKKyAgICByZXR1cm47Cit9CisKKwwKKy8qIEZ1bmN0aW9uOiBzaXM5MDBfY2hlY2tfbW9kZQorICoKKyAqIERlc2NyaXB0aW9uOiBjaGVja3MgdGhlIHN0YXRlIG9mIHRyYW5zbWl0IGFuZCByZWNlaXZlCisgKiAgICBwYXJhbWV0ZXJzIG9uIHRoZSBOSUMsIGFuZCB1cGRhdGVzIE5JQyByZWdpc3RlcnMgdG8gbWF0Y2gKKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZAorc2lzOTAwX2NoZWNrX21vZGUoc3RydWN0IG5pYyAqbmljKQoreworICAgIGludCBzcGVlZCwgZHVwbGV4OworICAgIHUzMiB0eF9mbGFncyA9IDAsIHJ4X2ZsYWdzID0gMDsKKworICAgIG1paS5jaGlwX2luZm8tPnJlYWRfbW9kZShuaWMsIGN1cl9waHksICZzcGVlZCwgJmR1cGxleCk7CisKKyAgICBpZiggaW5sKGlvYWRkciArIGNmZykgJiBFREJfTUFTVEVSX0VOICkgeworICAgICAgICB0eF9mbGFncyA9IFR4QVRQIHwgKERNQV9CVVJTVF82NCA8PCBUeE1YRE1BX3NoaWZ0KSB8IChUWF9GSUxMX1RIUkVTSCA8PCBUeEZJTExUX3NoaWZ0KTsKKwlyeF9mbGFncyA9IERNQV9CVVJTVF82NCA8PCBSeE1YRE1BX3NoaWZ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgICAgIHR4X2ZsYWdzID0gVHhBVFAgfCAoRE1BX0JVUlNUXzUxMiA8PCBUeE1YRE1BX3NoaWZ0KSB8IChUWF9GSUxMX1RIUkVTSCA8PCBUeEZJTExUX3NoaWZ0KTsKKyAgICAgICAgICAgIHJ4X2ZsYWdzID0gRE1BX0JVUlNUXzUxMiA8PCBSeE1YRE1BX3NoaWZ0OworICAgIH0KKworICAgIGlmIChzcGVlZCA9PSBIV19TUEVFRF9IT01FIHx8IHNwZWVkID09IEhXX1NQRUVEXzEwX01CUFMpIHsKKyAgICAgICAgcnhfZmxhZ3MgfD0gKFJ4RFJOVF8xMCA8PCBSeERSTlRfc2hpZnQpOworICAgICAgICB0eF9mbGFncyB8PSAoVHhEUk5UXzEwIDw8IFR4RFJOVF9zaGlmdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByeF9mbGFncyB8PSAoUnhEUk5UXzEwMCA8PCBSeERSTlRfc2hpZnQpOworICAgICAgICB0eF9mbGFncyB8PSAoVHhEUk5UXzEwMCA8PCBUeERSTlRfc2hpZnQpOworICAgIH0KKworICAgIGlmIChkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCkgeworICAgICAgICB0eF9mbGFncyB8PSAoVHhDU0kgfCBUeEhCSSk7CisgICAgICAgIHJ4X2ZsYWdzIHw9IFJ4QVRYOworICAgIH0KKworICAgIG91dGwgKHR4X2ZsYWdzLCBpb2FkZHIgKyB0eGNmZyk7CisgICAgb3V0bCAocnhfZmxhZ3MsIGlvYWRkciArIHJ4Y2ZnKTsKK30KKworDAorLyogRnVuY3Rpb246IHNpczkwMF9yZWFkX21vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjogcmV0cmlldmVzIGFuZCBkaXNwbGF5cyBzcGVlZCBhbmQgZHVwbGV4CisgKiAgICBwYXJhbWV0ZXJzIGZyb20gdGhlIE5JQworICogICAgCisgKiBBcmd1bWVudHM6IHN0cnVjdCBuaWMgKm5pYzogICAgICAgICAgTklDIGRhdGEgc3RydWN0dXJlCisgKgorICogUmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkCitzaXM5MDBfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgdTMyIHN0YXR1czsKKyAgICB1MTYgcGh5X2lkMCwgcGh5X2lkMTsKKyAgICAgICAgCisgICAgLyogU1RTT1VUIHJlZ2lzdGVyIGlzIExhdGNoZWQgb24gVHJhbnNpdGlvbiwgcmVhZCBvcGVyYXRpb24gdXBkYXRlcyBpdCAqLworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1NUU09VVCk7CisgICAgfSB3aGlsZSAoaSsrIDwgMik7CisKKyAgICAqc3BlZWQgPSBIV19TUEVFRF8xMF9NQlBTOworICAgICpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworICAgIAorICAgIGlmIChzdGF0dXMgJiAoTUlJX05XQVlfVFggfCBNSUlfTldBWV9UWF9GRFgpKQorCSpzcGVlZCA9IEhXX1NQRUVEXzEwMF9NQlBTOworICAgIGlmIChzdGF0dXMgJiAoIE1JSV9OV0FZX1RYX0ZEWCB8IE1JSV9OV0FZX1RfRkRYKSkKKwkqZHVwbGV4ID0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRDsKKwkKKyAgICAvKiBXb3JrYXJvdW5kIGZvciBSZWFsdGVrIFJUTDgyMDEgUEhZIGlzc3VlICovCisgICAgcGh5X2lkMCA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9QSFlfSUQwKTsKKyAgICBwaHlfaWQxID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1BIWV9JRDEpOworICAgIGlmKChwaHlfaWQwID09IDB4MDAwMCkgJiYgKChwaHlfaWQxICYgMHhGRkYwKSA9PSAweDgyMDApKXsKKwlpZihzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfQ09OVFJPTCkgJiBNSUlfQ05UTF9GRFgpCisJICAgICpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCWlmKHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIDB4MDAxOSkgJiAweDAxKQorCSAgICAqc3BlZWQgPSBIV19TUEVFRF8xMDBfTUJQUzsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICYgTUlJX1NUU09VVF9MSU5LX0ZBSUwpCisgICAgICAgIHByaW50Zigic2lzOTAwX3JlYWRfbW9kZTogTWVkaWEgTGluayBPZmZcbiIpOworICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfcmVhZF9tb2RlOiBNZWRpYSBMaW5rIE9uICVzICVzLWR1cGxleCBcbiIsIAorICAgICAgICAgICAgICAgKnNwZWVkID09IEhXX1NQRUVEXzEwMF9NQlBTID8gCisgICAgICAgICAgICAgICAiMTAwbWJwcyIgOiAiMTBtYnBzIiwKKyAgICAgICAgICAgICAgICpkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCA/CisgICAgICAgICAgICAgICAiZnVsbCIgOiAiaGFsZiIpOworfQorCisMCisvKiBGdW5jdGlvbjogYW1kNzljOTAxX3JlYWRfbW9kZQorICoKKyAqIERlc2NyaXB0aW9uOiByZXRyaWV2ZXMgYW5kIGRpc3BsYXlzIHNwZWVkIGFuZCBkdXBsZXgKKyAqICAgIHBhcmFtZXRlcnMgZnJvbSB0aGUgTklDCisgKiAgICAKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQKK2FtZDc5YzkwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQoreworICAgIGludCBpOworICAgIHUxNiBzdGF0dXM7CisgICAgICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHN0YXR1cyA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisgICAgaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9BVVRPKSB7CisgICAgICAgIC8qIDEwQkFTRS1UIFBIWSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgc3RhdHVzID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1NUQVRVU19TVU1NQVJZKTsKKyAgICAgICAgaWYgKHN0YXR1cyAmIE1JSV9TVFNTVU1fU1BEKQorICAgICAgICAgICAgKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisgICAgICAgIGlmIChzdGF0dXMgJiBNSUlfU1RTU1VNX0RQTFgpCisgICAgICAgICAgICAqZHVwbGV4ID0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmR1cGxleCA9IEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQ7CisKKyAgICAgICAgaWYgKHN0YXR1cyAmIE1JSV9TVFNTVU1fTElOSykKKyAgICAgICAgICAgIHByaW50ZigiYW1kNzljOTAxX3JlYWRfbW9kZTogTWVkaWEgTGluayBPbiAlcyAlcy1kdXBsZXggXG4iLCAKKyAgICAgICAgICAgICAgICAgICAqc3BlZWQgPT0gSFdfU1BFRURfMTAwX01CUFMgPyAKKyAgICAgICAgICAgICAgICAgICAiMTAwbWJwcyIgOiAiMTBtYnBzIiwKKyAgICAgICAgICAgICAgICAgICAqZHVwbGV4ID09IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQgPworICAgICAgICAgICAgICAgICAgICJmdWxsIiA6ICJoYWxmIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiYW1kNzljOTAxX3JlYWRfbW9kZTogTWVkaWEgTGluayBPZmZcbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogSG9tZVBOQSAqLworICAgICAgICAqc3BlZWQgPSBIV19TUEVFRF9IT01FOworICAgICAgICAqZHVwbGV4ID0gRkRYX0NBUEFCTEVfSEFMRl9TRUxFQ1RFRDsKKyAgICAgICAgaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0xJTkspCisgICAgICAgICAgICBwcmludGYoImFtZDc5YzkwMV9yZWFkX21vZGU6TWVkaWEgTGluayBPbiAxbWJwcyBoYWxmLWR1cGxleCBcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoImFtZDc5YzkwMV9yZWFkX21vZGU6IE1lZGlhIExpbmsgT2ZmXG4iKTsKKyAgICB9Cit9CisKKwwKKy8qKgorICoJaWNzMTg5M19yZWFkX21vZGU6IC0gcmVhZCBtZWRpYSBtb2RlIGZvciBJQ1MxODkzIFBIWQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHJlYWQgbW9kZSBmb3IKKyAqCUBwaHlfYWRkcjogbWlpIHBoeSBhZGRyZXNzCisgKglAc3BlZWQ6IHRoZSB0cmFuc21pdCBzcGVlZCB0byBiZSBkZXRlcm1pbmVkCisgKglAZHVwbGV4OiB0aGUgZHVwbGV4IG1vZGUgdG8gYmUgZGV0ZXJtaW5lZAorICoKKyAqCUlDUzE4OTMgUEhZIHVzZSBRdWljayBQb2xsIERldGFpbGVkIFN0YXR1cyByZWdpc3RlcgorICoJdG8gZGV0ZXJtaW5lIHRoZSBzcGVlZCBhbmQgZHVwbGV4IG1vZGUgZm9yIHNpczkwMAorICovCisKK3N0YXRpYyB2b2lkIGljczE4OTNfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCkKK3sKKwlpbnQgaSA9IDA7CisJdTMyIHN0YXR1czsKKworCS8qIE1JSV9RUERTVFMgaXMgTGF0Y2hlZCwgcmVhZCB0d2ljZSBpbiBzdWNjZXNzaW9uIHdpbGwgcmVmbGVjdCB0aGUgY3VycmVudCBzdGF0ZSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCXN0YXR1cyA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9RUERTVFMpOworCisJaWYgKHN0YXR1cyAmIE1JSV9TVFNJQ1NfU1BEKQorCQkqc3BlZWQgPSBIV19TUEVFRF8xMDBfTUJQUzsKKwllbHNlCisJCSpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisKKwlpZiAoc3RhdHVzICYgTUlJX1NUU0lDU19EUExYKQorCQkqZHVwbGV4ID0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRDsKKwllbHNlCisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCisJaWYgKHN0YXR1cyAmIE1JSV9TVFNJQ1NfTElOS1NUUykKKwkJcHJpbnRmKCJpY3MxODkzX3JlYWRfbW9kZTogTWVkaWEgTGluayBPbiAlcyAlcy1kdXBsZXggXG4iLAorCQkgICAgICAgKnNwZWVkID09IEhXX1NQRUVEXzEwMF9NQlBTID8KKwkJICAgICAgICIxMDBtYnBzIiA6ICIxMG1icHMiLAorCQkgICAgICAgKmR1cGxleCA9PSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEID8KKwkJICAgICAgICJmdWxsIiA6ICJoYWxmIik7CisJZWxzZQorCQlwcmludGYoImljczE4OTNfcmVhZF9tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7Cit9CisKKy8qKgorICoJcnRsODIwMV9yZWFkX21vZGU6IC0gcmVhZCBtZWRpYSBtb2RlIGZvciBydGw4MjAxIHBoeQorICoJQG5pYzogdGhlIG5ldCBkZXZpY2UgdG8gcmVhZCBtb2RlIGZvcgorICoJQHBoeV9hZGRyOiBtaWkgcGh5IGFkZHJlc3MKKyAqCUBzcGVlZDogdGhlIHRyYW5zbWl0IHNwZWVkIHRvIGJlIGRldGVybWluZWQKKyAqCUBkdXBsZXg6IHRoZSBkdXBsZXggbW9kZSB0byBiZSBkZXRlcm1pbmVkCisgKgorICoJcmVhZCBNSUlfU1RBVFVTIHJlZ2lzdGVyIGZyb20gcnRsODIwMSBwaHkKKyAqCXRvIGRldGVybWluZSB0aGUgc3BlZWQgYW5kIGR1cGxleCBtb2RlIGZvciBzaXM5MDAKKyAqLworCitzdGF0aWMgdm9pZCBydGw4MjAxX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpCit7CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UWF9GRFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCX0KKwllbHNlIGlmIChzdGF0dXMgJiBNSUlfU1RBVF9DQU5fVFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCX0KKwllbHNlIGlmIChzdGF0dXMgJiBNSUlfU1RBVF9DQU5fVF9GRFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTBfTUJQUzsKKwkJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQ7CisJfQorCWVsc2UgaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UKSB7CisJCSpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCX0KKworCWlmIChzdGF0dXMgJiBNSUlfU1RBVF9MSU5LKQorCQlwcmludGYoInJ0bDgyMDFfcmVhZF9tb2RlOiBNZWRpYSBMaW5rIE9uICVzICVzLWR1cGxleCBcbiIsCisJCSAgICAgICAqc3BlZWQgPT0gSFdfU1BFRURfMTAwX01CUFMgPworCQkgICAgICAgIjEwMG1icHMiIDogIjEwbWJwcyIsCisJCSAgICAgICAqZHVwbGV4ID09IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQgPworCQkgICAgICAgImZ1bGwiIDogImhhbGYiKTsKKwllbHNlCisJCXByaW50ZigicnRsODIwMV9yZWFkX2NvbmZpZ19tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7Cit9CisKKy8qKgorICoJdnQ2MTAzX3JlYWRfbW9kZTogLSByZWFkIG1lZGlhIG1vZGUgZm9yIHZ0NjEwMyBwaHkKKyAqCUBuaWM6IHRoZSBuZXQgZGV2aWNlIHRvIHJlYWQgbW9kZSBmb3IKKyAqCUBwaHlfYWRkcjogbWlpIHBoeSBhZGRyZXNzCisgKglAc3BlZWQ6IHRoZSB0cmFuc21pdCBzcGVlZCB0byBiZSBkZXRlcm1pbmVkCisgKglAZHVwbGV4OiB0aGUgZHVwbGV4IG1vZGUgdG8gYmUgZGV0ZXJtaW5lZAorICoKKyAqCXJlYWQgTUlJX1NUQVRVUyByZWdpc3RlciBmcm9tIHJ0bDgyMDEgcGh5CisgKgl0byBkZXRlcm1pbmUgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBmb3Igc2lzOTAwCisgKi8KKworc3RhdGljIHZvaWQgdnQ2MTAzX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpCit7CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UWF9GRFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCX0KKwllbHNlIGlmIChzdGF0dXMgJiBNSUlfU1RBVF9DQU5fVFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCX0KKwllbHNlIGlmIChzdGF0dXMgJiBNSUlfU1RBVF9DQU5fVF9GRFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTBfTUJQUzsKKwkJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQ7CisJfQorCWVsc2UgaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UKSB7CisJCSpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCX0KKworCWlmIChzdGF0dXMgJiBNSUlfU1RBVF9MSU5LKQorCQlwcmludGYoInZ0NjEwM19yZWFkX21vZGU6IE1lZGlhIExpbmsgT24gJXMgJXMtZHVwbGV4IFxuIiwKKwkJICAgICAgICpzcGVlZCA9PSBIV19TUEVFRF8xMDBfTUJQUyA/CisJCSAgICAgICAiMTAwbWJwcyIgOiAiMTBtYnBzIiwKKwkJICAgICAgICpkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCA/CisJCSAgICAgICAiZnVsbCIgOiAiaGFsZiIpOworCWVsc2UKKwkJcHJpbnRmKCJ2dDYxMDNfcmVhZF9jb25maWdfbW9kZTogTWVkaWEgTGluayBPZmZcbiIpOworfQorCisvKiBGdW5jdGlvbjogc2lzOTAwX3RyYW5zbWl0CisgKgorICogRGVzY3JpcHRpb246IHRyYW5zbWl0cyBhIHBhY2tldCBhbmQgd2FpdHMgZm9yIGNvbXBsZXRpb24gb3IgdGltZW91dC4KKyAqCisgKiBBcmd1bWVudHM6IGNoYXIgZFs2XTogICAgICAgICAgZGVzdGluYXRpb24gZXRoZXJuZXQgYWRkcmVzcy4KKyAqICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdDogICBldGhlcm5ldCBwcm90b2NvbCB0eXBlLgorICogICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzOiAgIHNpemUgb2YgdGhlIGRhdGEtcGFydCBvZiB0aGUgcGFja2V0LgorICogICAgICAgICAgICBjaGFyICpwOiAgICAgICAgICAgIHRoZSBkYXRhIGZvciB0aGUgcGFja2V0LgorICogICAgCisgKiBSZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQKK3NpczkwMF90cmFuc21pdChzdHJ1Y3QgbmljICAqbmljLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpkLCAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdCwgICAgIC8qIFR5cGUgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcywgICAgIC8qIHNpemUgKi8KKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcCkgICAgIC8qIFBhY2tldCAqLworeworICAgIHUzMiB0bywgbnN0eXBlOworICAgIHZvbGF0aWxlIHUzMiB0eF9zdGF0dXM7CisgICAgCisgICAgLyogU3RvcCB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICBvdXRsKFR4RElTIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCisgICAgLyogbG9hZCBUcmFuc21pdCBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCisgICAgb3V0bCh2aXJ0X3RvX2J1cygmdHhkKSwgaW9hZGRyICsgdHhkcCk7IAorICAgIGlmIChzaXM5MDBfZGVidWcgPiAxKQorICAgICAgICBwcmludGYoInNpczkwMF90cmFuc21pdDogVFggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJVhcbiIsIAorICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIHR4ZHApKTsKKworICAgIG1lbWNweSh0eGIsIGQsIEVUSF9BTEVOKTsKKyAgICBtZW1jcHkodHhiICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CisgICAgbnN0eXBlID0gaHRvbnModCk7CisgICAgbWVtY3B5KHR4YiArIDIgKiBFVEhfQUxFTiwgKGNoYXIqKSZuc3R5cGUsIDIpOworICAgIG1lbWNweSh0eGIgKyBFVEhfSExFTiwgcCwgcyk7CisKKyAgICBzICs9IEVUSF9ITEVOOworICAgIHMgJj0gRFNJWkU7CisKKyAgICBpZiAoc2lzOTAwX2RlYnVnID4gMSkKKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfdHJhbnNtaXQ6IHNlbmRpbmcgJWQgYnl0ZXMgZXRodHlwZSAlaFhcbiIsIChpbnQpIHMsIHQpOworCisgICAgLyogcGFkIHRvIG1pbmltdW0gcGFja2V0IHNpemUgKi8KKyAgICB3aGlsZSAocyA8IEVUSF9aTEVOKSAgCisgICAgICAgIHR4YltzKytdID0gJ1wwJzsKKworICAgIC8qIHNldCB0aGUgdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3IgYW5kIGVuYWJsZSBUcmFuc21pdCBTdGF0ZSBNYWNoaW5lICovCisgICAgdHhkLmJ1ZnB0ciA9IHZpcnRfdG9fYnVzKCZ0eGJbMF0pOworICAgIHR4ZC5jbWRzdHMgPSAodTMyKSBPV04gfCBzOworCisgICAgLyogcmVzdGFydCB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICBvdXRsKFR4RU5BIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCisgICAgaWYgKHNpczkwMF9kZWJ1ZyA+IDEpCisgICAgICAgIHByaW50Zigic2lzOTAwX3RyYW5zbWl0OiBRdWV1ZWQgVHggcGFja2V0IHNpemUgJWQuXG4iLCAoaW50KSBzKTsKKworICAgIHRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FT1VUOworCisgICAgd2hpbGUgKCgodHhfc3RhdHVzPXR4ZC5jbWRzdHMpICYgT1dOKSAmJiAoY3VycnRpY2tzKCkgPCB0bykpCisgICAgICAgIC8qIHdhaXQgKi8gOworCisgICAgaWYgKGN1cnJ0aWNrcygpID49IHRvKSB7CisgICAgICAgIHByaW50Zigic2lzOTAwX3RyYW5zbWl0OiBUWCBUaW1lb3V0ISBUeCBzdGF0dXMgJVguXG4iLCAKKwkgICAgICAgKHVuc2lnbmVkIGludCkgdHhfc3RhdHVzKTsKKyAgICB9CisgICAgCisgICAgaWYgKHR4X3N0YXR1cyAmIChBQk9SVCB8IFVOREVSUlVOIHwgT1dDT0xMKSkgeworICAgICAgICAvKiBwYWNrZXQgdW5zdWNjZXNzZnVsbHkgdHJhbnNtaXRlZCAqLworICAgICAgICBwcmludGYoInNpczkwMF90cmFuc21pdDogVHJhbnNtaXQgZXJyb3IsIFR4IHN0YXR1cyAlWC5cbiIsIAorCSAgICAgICAodW5zaWduZWQgaW50KSB0eF9zdGF0dXMpOworICAgIH0KKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworICAgIG91dGwoMCwgaW9hZGRyICsgaW1yKTsKK30KKworDAorLyogRnVuY3Rpb246IHNpczkwMF9wb2xsCisgKgorICogRGVzY3JpcHRpb246IGNoZWNrcyBmb3IgYSByZWNlaXZlZCBwYWNrZXQgYW5kIHJldHVybnMgaXQgaWYgZm91bmQuCisgKgorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgMSBpZiBhIHBhY2tldCB3YXMgcmVjaWV2ZWQuCisgKiAgICAgICAgICAgIDAgaWYgbm8gcGFjZXQgd2FzIHJlY2lldmVkLgorICoKKyAqIFNpZGUgZWZmZWN0czoKKyAqICAgICAgICAgICAgUmV0dXJucyAoY29waWVzKSB0aGUgcGFja2V0IHRvIHRoZSBhcnJheSBuaWMtPnBhY2tldC4KKyAqICAgICAgICAgICAgUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgaW4gbmljLT5wYWNrZXRsZW4uCisgKi8KKworc3RhdGljIGludAorc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisgICAgdTMyIHJ4X3N0YXR1cyA9IHJ4ZFtjdXJfcnhdLmNtZHN0czsKKyAgICB1MzIgaW50cl9zdGF0dXM7CisgICAgaW50IHJldHN0YXQgPSAwOworCisgICAgIC8qIGFja25vd2xlZGdlIGludGVycnVwdHMgYnkgcmVhZGluZyBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisgICAgaW50cl9zdGF0dXMgPSBpbmwoaW9hZGRyICsgaXNyKTsKKworICAgIGlmIChzaXM5MDBfZGVidWcgPiAyKQorICAgICAgICBwcmludGYoInNpczkwMF9wb2xsOiBjdXJfcng6JWQsIHN0YXR1czolWFxuIiwgY3VyX3J4LCAKKwkgICAgICAgKHVuc2lnbmVkIGludCkgcnhfc3RhdHVzKTsKKworICAgIGlmICghKHJ4X3N0YXR1cyAmIE9XTikpCisgICAgICAgIHJldHVybiByZXRzdGF0OworCisgICAgaWYgKHNpczkwMF9kZWJ1ZyA+IDEpCisgICAgICAgIHByaW50Zigic2lzOTAwX3BvbGw6IGdvdCBhIHBhY2tldDogY3VyX3J4OiVkLCBzdGF0dXM6JVhcbiIsCisgICAgICAgICAgICAgICBjdXJfcngsICh1bnNpZ25lZCBpbnQpIHJ4X3N0YXR1cyk7CisKKyAgICBpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKyAgICAKKyAgICBuaWMtPnBhY2tldGxlbiA9IChyeF9zdGF0dXMgJiBEU0laRSkgLSBDUkNfU0laRTsKKworICAgIGlmIChyeF9zdGF0dXMgJiAoQUJPUlR8T1ZFUlJVTnxUT09MT05HfFJVTlR8UlhJU0VSUnxDUkNFUlJ8RkFFUlIpKSB7CisgICAgICAgIC8qIGNvcnJ1cHRlZCBwYWNrZXQgcmVjZWl2ZWQgKi8KKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfcG9sbDogQ29ycnVwdGVkIHBhY2tldCByZWNlaXZlZCwgYnVmZmVyIHN0YXR1cyA9ICVYXG4iLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgcnhfc3RhdHVzKTsKKyAgICAgICAgcmV0c3RhdCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZ2l2ZSBwYWNrZXQgdG8gaGlnaGVyIGxldmVsIHJvdXRpbmUgKi8KKyAgICAgICAgbWVtY3B5KG5pYy0+cGFja2V0LCAocnhiICsgY3VyX3J4KlJYX0JVRl9TSVpFKSwgbmljLT5wYWNrZXRsZW4pOworICAgICAgICByZXRzdGF0ID0gMTsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gdGhlIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciB0byByZWNlaXZlIHJpbmcgKi8KKyAgICByeGRbY3VyX3J4XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKKyAgICByeGRbY3VyX3J4XS5idWZwdHIgPSB2aXJ0X3RvX2J1cygmcnhiW2N1cl9yeCpSWF9CVUZfU0laRV0pOworICAgICAgICAKKyAgICBpZiAoKytjdXJfcnggPT0gTlVNX1JYX0RFU0MpCisgICAgICAgIGN1cl9yeCA9IDA7CisKKyAgICAvKiByZS1lbmFibGUgdGhlIHBvdGVudGlhbGx5IGlkbGUgcmVjZWl2ZSBzdGF0ZSBtYWNoaW5lICovCisgICAgb3V0bChSeEVOQSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKKworICAgIHJldHVybiByZXRzdGF0OworCit9CisKKwwKKy8qIEZ1bmN0aW9uOiBzaXM5MDBfZGlzYWJsZQorICoKKyAqIERlc2NyaXB0aW9uOiBUdXJucyBvZmYgaW50ZXJydXB0cyBhbmQgc3RvcHMgVHggYW5kIFJ4IGVuZ2luZXMKKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZAorc2lzOTAwX2Rpc2FibGUgKCBzdHJ1Y3QgbmljICpuaWMgKSB7CisKKyAgICBzaXM5MDBfaW5pdChuaWMpOworCisgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKyAgICBvdXRsKDAsIGlvYWRkciArIGltcik7CisgICAgb3V0bCgwLCBpb2FkZHIgKyBpZXIpOworICAgIAorICAgIC8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggU3RhdHVzIE1hY2hpbmUgKi8KKyAgICBvdXRsKFJ4RElTIHwgVHhESVMgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7Cit9CisKKwwKKy8qIEZ1bmN0aW9uOiBzaXM5MDBfaXJxCisgKgorICogRGVzY3JpcHRpb246IEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UsIGludGVycnVwdHMKKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICogICAgICAgICAgICBpcnFfYWN0aW9uX3QgYWN0aW9uOiAgICAgIFJlcXVlc3RlZCBhY3Rpb24gICAgICAgCisgKgorICogUmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkCitzaXM5MDBfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIG91dGwoMCwgaW9hZGRyICsgaW1yKTsKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIG91dGwoKFJ4U09WUnxSeE9STnxSeEVSUnxSeE9LfFR4VVJOfFR4RVJSfFR4SURMRSksIGlvYWRkciArIGltcik7CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgc2lzOTAwX29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QJPSBkdW1teV9jb25uZWN0LAorCS5wb2xsCQk9IHNpczkwMF9wb2xsLAorCS50cmFuc21pdAk9IHNpczkwMF90cmFuc21pdCwKKwkuaXJxCQk9IHNpczkwMF9pcnEsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2lzOTAwX25pY3NbXSA9IHsKK1BDSV9ST00oMHgxMDM5LCAweDA5MDAsICJzaXM5MDAiLCAgIlNJUzkwMCIsIDApLAorUENJX1JPTSgweDEwMzksIDB4NzAxNiwgInNpczcwMTYiLCAiU0lTNzAxNiIsIDApLAorfTsKKworUENJX0RSSVZFUiAoIHNpczkwMF9kcml2ZXIsIHNpczkwMF9uaWNzLCBQQ0lfTk9fQ0xBU1MgKTsKKworRFJJVkVSICggIlNJUzkwMCIsIG5pY19kcml2ZXIsIHBjaV9kcml2ZXIsIHNpczkwMF9kcml2ZXIsCisJIHNpczkwMF9wcm9iZSwgc2lzOTAwX2Rpc2FibGUgKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NpczkwMC5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc2lzOTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1YzZiNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NpczkwMC5oCkBAIC0wLDAgKzEsMzc1IEBACisvKiAtKi0gTW9kZTpDOyBjLWJhc2ljLW9mZnNldDo0OyAtKi0gKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIFNpUyBldGhlcm5ldCBjb250cm9sbGVycyBpbmNsdWRpbmcgNzAxNC83MDE2IGFuZCA5MDAgCisgKiBSZWZlcmVuY2VzOgorICogICBTaVMgNzAxNiBGYXN0IEV0aGVybmV0IFBDSSBCdXMgMTAvMTAwIE1icHMgTEFOIENvbnRyb2xsZXIgd2l0aCBPbk5vdyBTdXBwb3J0LAorICogICAgICBwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE0LCAxOTk4CisgKiAgIFNpUyA5MDAgRmFzdCBFdGhlcm5ldCBQQ0kgQnVzIDEwLzEwMCBNYnBzIExBTiBTaW5nbGUgQ2hpcCB3aXRoIE9uTm93IFN1cHBvcnQsCisgKiAgICAgIHByZWxpbWluYXJ5IFJldi4gMS4wIE5vdi4gMTAsIDE5OTgKKyAqICAgU2lTIDcwMTQgU2luZ2xlIENoaXAgMTAwQkFTRS1UWC8xMEJBU0UtVCBQaHlzaWNhbCBMYXllciBTb2x1dGlvbiwKKyAqICAgICAgcHJlbGltaW5hcnkgUmV2LiAxLjAgSmFuLiAxOCwgMTk5OAorICogICBodHRwOi8vd3d3LnNpcy5jb20udHcvc3VwcG9ydC9kYXRhYm9vay5odG0KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUExfQU5ZICk7CisKKy8qIE1BQyBvcGVyYXRpb25sIHJlZ2lzdGVycyBvZiBTaVMgNzAxNiBhbmQgU2lTIDkwMCBldGhlcm5ldCBjb250cm9sbGVyICovCisvKiBUaGUgSS9PIGV4dGVudCwgU2lTIDkwMCBuZWVkcyAyNTYgYnl0ZXMgb2YgaW8gYWRkcmVzcyAqLworI2RlZmluZSBTSVM5MDBfVE9UQUxfU0laRSAweDEwMAorCisvKiBTeW1ib2xpYyBvZmZzZXRzIHRvIHJlZ2lzdGVycy4gKi8KK2VudW0gc2lzOTAwX3JlZ2lzdGVycyB7CisgICAgY3I9MHgwLCAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBSZWdpc3RlciAqLworICAgIGNmZz0weDQsICAgICAgICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyAgICBtZWFyPTB4OCwgICAgICAgICAgICAgICAvKiBFRVBST00gQWNjZXNzIFJlZ2lzdGVyICovCisgICAgcHRzY3I9MHhjLCAgICAgICAgICAgICAgLyogUENJIFRlc3QgQ29udHJvbCBSZWdpc3RlciAqLworICAgIGlzcj0weDEwLCAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyAgICBpbXI9MHgxNCwgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworICAgIGllcj0weDE4LCAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyAgICBlcGFyPTB4MTgsICAgICAgICAgICAgICAvKiBFbmhhbmNlZCBQSFkgQWNjZXNzIFJlZ2lzdGVyICovCisgICAgdHhkcD0weDIwLCAgICAgICAgICAgICAgLyogVHJhbnNtaXQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisgICAgdHhjZmc9MHgyNCwgICAgICAgICAgICAgLyogVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworICAgIHJ4ZHA9MHgzMCwgICAgICAgICAgICAgIC8qIFJlY2VpdmUgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisgICAgcnhjZmc9MHgzNCwgICAgICAgICAgICAgLyogUmVjZWl2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisgICAgZmxjdHJsPTB4MzgsICAgICAgICAgICAgLyogRmxvdyBDb250cm9sIFJlZ2lzdGVyICovCisgICAgcnhsZW49MHgzYywgICAgICAgICAgICAgLyogUmVjZWl2ZSBQYWNrZXQgTGVuZ3RoIFJlZ2lzdGVyICovCisgICAgcmZjcj0weDQ4LCAgICAgICAgICAgICAgLyogUmVjZWl2ZSBGaWx0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworICAgIHJmZHI9MHg0QywgICAgICAgICAgICAgIC8qIFJlY2VpdmUgRmlsdGVyIERhdGEgUmVnaXN0ZXIgKi8KKyAgICBwbWN0cmw9MHhCMCwgICAgICAgICAgICAvKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgICBwbWVyPTB4QjQgICAgICAgICAgICAgICAvKiBQb3dlciBNYW5hZ2VtZW50IFdha2UtdXAgRXZlbnQgUmVnaXN0ZXIgKi8KK307CisKKy8qIFN5bWJvbGljIG5hbWVzIGZvciBiaXRzIGluIHZhcmlvdXMgcmVnaXN0ZXJzICovCitlbnVtIHNpczkwMF9jb21tYW5kX3JlZ2lzdGVyX2JpdHMgeworICAgIFJFTE9BRCAgICAgPSAweDAwMDAwNDAwLAorICAgIEFDQ0VTU01PREUgPSAweDAwMDAwMjAwLAorICAgIFJFU0VUICAgICAgPSAweDAwMDAwMTAwLCAKKyAgICBTV0kgICAgICAgID0gMHgwMDAwMDA4MCwgCisgICAgUnhSRVNFVCAgICA9IDB4MDAwMDAwMjAsCisgICAgVHhSRVNFVCAgICA9IDB4MDAwMDAwMTAsIAorICAgIFJ4RElTICAgICAgPSAweDAwMDAwMDA4LCAKKyAgICBSeEVOQSAgICAgID0gMHgwMDAwMDAwNCwKKyAgICBUeERJUyAgICAgID0gMHgwMDAwMDAwMiwgCisgICAgVHhFTkEgICAgICA9IDB4MDAwMDAwMDEKK307CisKK2VudW0gc2lzOTAwX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfYml0cyB7CisgICAgREVTQ1JGTVQgPSAweDAwMDAwMTAwLCAvKiA3MDE2IHNwZWNpZmljICovCisgICAgUkVRQUxHICAgPSAweDAwMDAwMDgwLCAKKyAgICBTQiAgICAgICA9IDB4MDAwMDAwNDAsIAorICAgIFBPVyAgICAgID0gMHgwMDAwMDAyMCwgCisgICAgRVhEICAgICAgPSAweDAwMDAwMDEwLCAKKyAgICBQRVNFTCAgICA9IDB4MDAwMDAwMDgsIAorICAgIExQTSAgICAgID0gMHgwMDAwMDAwNCwgCisgICAgQkVNICAgICAgPSAweDAwMDAwMDAxLAorICAgIFJORF9DTlQgID0gMHgwMDAwMDQwMCwKKyAgICBGQUlSX0JBQ0tPRkYgPSAweDAwMDAwMjAwLAorICAgIEVEQl9NQVNURVJfRU4gPSAweDAwMDAyMDAwCit9OworCitlbnVtIHNpczkwMF9lZXByb21fYWNjZXNzX3JlaWdzdGVyX2JpdHMgeworICAgIE1EQyAgID0gMHgwMDAwMDA0MCwgCisgICAgTURESVIgPSAweDAwMDAwMDIwLCAKKyAgICBNRElPICA9IDB4MDAwMDAwMTAsIC8qIDcwMTYgc3BlY2lmaWMgKi8gCisgICAgRUVDUyAgPSAweDAwMDAwMDA4LCAKKyAgICBFRUNMSyA9IDB4MDAwMDAwMDQsIAorICAgIEVFRE8gID0gMHgwMDAwMDAwMiwKKyAgICBFRURJICA9IDB4MDAwMDAwMDEKK307CisKK2VudW0gc2lzOTAwX2ludGVycnVwdF9yZWdpc3Rlcl9iaXRzIHsKKyAgICBXS0VWVCAgICAgID0gMHgxMDAwMDAwMCwgCisgICAgVHhQQVVTRUVORCA9IDB4MDgwMDAwMDAsCisgICAgVHhQQVVTRSAgICA9IDB4MDQwMDAwMDAsCisgICAgVHhSQ01QICAgICA9IDB4MDIwMDAwMDAsCisgICAgUnhSQ01QICAgICA9IDB4MDEwMDAwMDAsCisgICAgRFBFUlIgICAgICA9IDB4MDA4MDAwMDAsCisgICAgU1NFUlIgICAgICA9IDB4MDA0MDAwMDAsCisgICAgUk1BQlQgICAgICA9IDB4MDAyMDAwMDAsCisgICAgUlRBQlQgICAgICA9IDB4MDAxMDAwMDAsCisgICAgUnhTT1ZSICAgICA9IDB4MDAwMTAwMDAsIAorICAgIEhJQkVSUiAgICAgPSAweDAwMDA4MDAwLCAKKyAgICBTV0lOVCAgICAgID0gMHgwMDAwMTAwMCwKKyAgICBNSUJJTlQgICAgID0gMHgwMDAwMDgwMCwgCisgICAgVHhVUk4gICAgICA9IDB4MDAwMDA0MDAsCisgICAgVHhJRExFICAgICA9IDB4MDAwMDAyMDAsCisgICAgVHhFUlIgICAgICA9IDB4MDAwMDAxMDAsCisgICAgVHhERVNDICAgICA9IDB4MDAwMDAwODAsCisgICAgVHhPSyAgICAgICA9IDB4MDAwMDAwNDAsCisgICAgUnhPUk4gICAgICA9IDB4MDAwMDAwMjAsIAorICAgIFJ4SURMRSAgICAgPSAweDAwMDAwMDEwLAorICAgIFJ4RUFSTFkgICAgPSAweDAwMDAwMDA4LAorICAgIFJ4RVJSICAgICAgPSAweDAwMDAwMDA0LAorICAgIFJ4REVTQyAgICAgPSAweDAwMDAwMDAyLAorICAgIFJ4T0sgICAgICAgPSAweDAwMDAwMDAxCit9OworCitlbnVtIHNpczkwMF9pbnRlcnJ1cHRfZW5hYmxlX3JlaWdzdGVyX2JpdHMgeworICAgIElFID0gMHgwMDAwMDAwMQorfTsKKworLyogbWF4aW11bSBkbWEgYnVyc3QgZnJvIHRyYW5zbWlzc2lvbiBhbmQgcmVjZWl2ZSovCisjZGVmaW5lIE1BWF9ETUFfUkFOR0UgICA3ICAgICAgIC8qIGFjdHVhbGx5IDAgbWVhbnMgTUFYSU1VTSAhISAqLworI2RlZmluZSBUeE1YRE1BX3NoaWZ0ICAgMjAKKyNkZWZpbmUgUnhNWERNQV9zaGlmdCAgIDIwCisjZGVmaW5lIFRYX0RNQV9CVVJTVCAgICAwCisjZGVmaW5lIFJYX0RNQV9CVVJTVCAgICAwCisKK2VudW0gc2lzOTAwX3R4X3J4X2RtYXsKKwkgICAgICAgIERNQV9CVVJTVF81MTIgPSAwLCAgICAgIERNQV9CVVJTVF82NCA9IDUKK307CisKKy8qIHRyYW5zbWl0IEZJRk8gdGhyZXNoaG9sZHMgKi8KKyNkZWZpbmUgVFhfRklMTF9USFJFU0ggIDE2ICAgICAgLyogMS80IEZJRk8gc2l6ZSAqLworI2RlZmluZSBUeEZJTExUX3NoaWZ0ICAgOAorI2RlZmluZSBUeERSTlRfc2hpZnQgICAgMAorI2RlZmluZSBUeERSTlRfMTAwICAgICAgNDggICAgICAvKiAzLzQgRklGTyBzaXplICovCisjZGVmaW5lIFR4RFJOVF8xMCAgICAgICAxNiAgICAgIC8qIDEvMiBGSUZPIHNpemUgKi8KKworZW51bSBzaXM5MDBfdHJhbnNtaXRfY29uZmlnX3JlZ2lzdGVyX2JpdHMgeworICAgIFR4Q1NJICAgPSAweDgwMDAwMDAwLAorICAgIFR4SEJJICAgPSAweDQwMDAwMDAwLAorICAgIFR4TUxCICAgPSAweDIwMDAwMDAwLAorICAgIFR4QVRQICAgPSAweDEwMDAwMDAwLAorICAgIFR4SUZHICAgPSAweDBDMDAwMDAwLAorICAgIFR4RklMTFQgPSAweDAwMDAzRjAwLAorICAgIFR4RFJOVCAgPSAweDAwMDAwMDNGCit9OworCisvKiByZWNldmllIEZJRk8gdGhyZXNob2xkcyAqLworI2RlZmluZSBSeERSTlRfc2hpZnQgICAgIDEKKyNkZWZpbmUgUnhEUk5UXzEwMCAgICAgIDE2ICAgICAgLyogMS8yIEZJRk8gc2l6ZSAqLworI2RlZmluZSBSeERSTlRfMTAgICAgICAgMjQgICAgICAvKiAzLzQgRklGTyBzaXplICovCisKK2VudW0gc2lzOTAwX3JldmVpdmVfY29uZmlnX3JlZ2lzdGVyX2JpdHMgeworICAgIFJ4QUVQICA9IDB4ODAwMDAwMDAsIAorICAgIFJ4QVJQICA9IDB4NDAwMDAwMDAsIAorICAgIFJ4QVRYICA9IDB4MTAwMDAwMDAsCisgICAgUnhBSkFCID0gMHgwODAwMDAwMCwgCisgICAgUnhEUk5UID0gMHgwMDAwMDA3RgorfTsKKworI2RlZmluZSBSRkFBX3NoaWZ0ICAgICAgMjgKKyNkZWZpbmUgUkZBRERSX3NoaWZ0ICAgIDE2CisKK2VudW0gc2lzOTAwX3JlY2VpdmVfZmlsdGVyX2NvbnRyb2xfcmVnaXN0ZXJfYml0cyB7CisgICAgUkZFTiAgPSAweDgwMDAwMDAwLCAKKyAgICBSRkFBQiA9IDB4NDAwMDAwMDAsIAorICAgIFJGQUFNID0gMHgyMDAwMDAwMCwKKyAgICBSRkFBUCA9IDB4MTAwMDAwMDAsIAorICAgIFJGUHJvbWlzY3VvdXMgPSAoUkZBQUJ8UkZBQU18UkZBQVApCit9OworCitlbnVtIHNpczkwMF9yZXZlaXZlX2ZpbHRlcl9kYXRhX21hc2sgeworICAgIFJGREFUID0gIDB4MDAwMEZGRkYKK307CisKKy8qIEVFUFJPTSBBZGRyZXNzZXMgKi8KK2VudW0gc2lzOTAwX2VlcHJvbV9hZGRyZXNzIHsKKyAgICBFRVBST01TaWduYXR1cmUgPSAweDAwLCAKKyAgICBFRVBST01WZW5kb3JJRCAgPSAweDAyLCAKKyAgICBFRVBST01EZXZpY2VJRCAgPSAweDAzLAorICAgIEVFUFJPTU1BQ0FkZHIgICA9IDB4MDgsIAorICAgIEVFUFJPTUNoZWNrc3VtICA9IDB4MGIKK307CisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiBSZWZlciB0byBOTTkzQ3h4IGRhdGFzaGVldCAqLworZW51bSBzaXM5MDBfZWVwcm9tX2NvbW1hbmQgeworICAgIEVFcmVhZCAgICAgICAgICA9IDB4MDE4MCwgCisgICAgRUV3cml0ZSAgICAgICAgID0gMHgwMTQwLCAKKyAgICBFRWVyYXNlICAgICAgICAgPSAweDAxQzAsIAorICAgIEVFd3JpdGVFbmFibGUgICA9IDB4MDEzMCwKKyAgICBFRXdyaXRlRGlzYWJsZSAgPSAweDAxMDAsCisgICAgRUVlcmFzZUFsbCAgICAgID0gMHgwMTIwLAorICAgIEVFd3JpdGVBbGwgICAgICA9IDB4MDExMCwgCisgICAgRUVhZGRyTWFzayAgICAgID0gMHgwMTNGLCAKKyAgICBFRWNtZFNoaWZ0IAkgICAgPSAxNgorfTsKKy8qIEZvciBTaVM5NjIgb3IgU2lTOTYzLCByZXF1ZXN0IHRoZSBlZXByb20gc29mdHdhcmUgYWNjZXNzICovCitlbnVtIHNpczk2eF9lZXByb21fY29tbWFuZCB7CisJRUVSRVEgPSAweDAwMDAwNDAwLCBFRURPTkUgPSAweDAwMDAwMjAwLCBFRUdOVCA9IDB4MDAwMDAxMDAKK307CisKKy8qIE1hbmFtZ2VtZW50IERhdGEgSS9PIChtZGlvKSBmcmFtZSAqLworI2RlZmluZSBNSUlyZWFkICAgICAgICAgMHg2MDAwCisjZGVmaW5lIE1JSXdyaXRlICAgICAgICAweDUwMDIKKyNkZWZpbmUgTUlJcG1kU2hpZnQgICAgIDcKKyNkZWZpbmUgTUlJcmVnU2hpZnQgICAgIDIKKyNkZWZpbmUgTUlJY21kTGVuICAgICAgIDE2CisjZGVmaW5lIE1JSWNtZFNoaWZ0ICAgICAxNgorCisvKiBCdWZmZXIgRGVzY3JpcHRvciBTdGF0dXMqLworZW51bSBzaXM5MDBfYnVmZmVyX3N0YXR1cyB7CisgICAgT1dOICAgID0gMHg4MDAwMDAwMCwgCisgICAgTU9SRSAgID0gMHg0MDAwMDAwMCwgCisgICAgSU5UUiAgID0gMHgyMDAwMDAwMCwKKyAgICBTVVBDUkMgPSAweDEwMDAwMDAwLCAKKyAgICBJTkNDUkMgPSAweDEwMDAwMDAwLAorICAgIE9LICAgICA9IDB4MDgwMDAwMDAsIAorICAgIERTSVpFICA9IDB4MDAwMDBGRkYKK307CisKKy8qIFN0YXR1cyBmb3IgVFggQnVmZmVycyAqLworZW51bSBzaXM5MDBfdHhfYnVmZmVyX3N0YXR1cyB7CisgICAgQUJPUlQgICAgICA9IDB4MDQwMDAwMDAsCisgICAgVU5ERVJSVU4gICA9IDB4MDIwMDAwMDAsIAorICAgIE5PQ0FSUklFUiAgPSAweDAxMDAwMDAwLAorICAgIERFRkVSRCAgICAgPSAweDAwODAwMDAwLCAKKyAgICBFWENERUZFUiAgID0gMHgwMDQwMDAwMCwgCisgICAgT1dDT0xMICAgICA9IDB4MDAyMDAwMDAsCisgICAgRVhDQ09MTCAgICA9IDB4MDAxMDAwMDAsIAorICAgIENPTENOVCAgICAgPSAweDAwMEYwMDAwCit9OworCitlbnVtIHNpczkwMF9yeF9idWZlcl9zdGF0dXMgeworICAgIE9WRVJSVU4gICAgPSAweDAyMDAwMDAwLAorICAgIERFU1QgICAgICAgPSAweDAwODAwMDAwLAorICAgIEJDQVNUICAgICAgPSAweDAxODAwMDAwLAorICAgIE1DQVNUICAgICAgPSAweDAxMDAwMDAwLAorICAgIFVOSU1BVENIICAgPSAweDAwODAwMDAwLAorICAgIFRPT0xPTkcgICAgPSAweDAwNDAwMDAwLAorICAgIFJVTlQgICAgICAgPSAweDAwMjAwMDAwLAorICAgIFJYSVNFUlIgICAgPSAweDAwMTAwMDAwLAorICAgIENSQ0VSUiAgICAgPSAweDAwMDgwMDAwLAorICAgIEZBRVJSICAgICAgPSAweDAwMDQwMDAwLAorICAgIExPT1BCSyAgICAgPSAweDAwMDIwMDAwLAorICAgIFJYQ09MICAgICAgPSAweDAwMDEwMDAwCit9OworCisvKiBNSUkgcmVnaXN0ZXIgb2Zmc2V0cyAqLworZW51bSBtaWlfcmVnaXN0ZXJzIHsKKyAgICBNSUlfQ09OVFJPTCA9IDB4MDAwMCwgCisgICAgTUlJX1NUQVRVUyAgPSAweDAwMDEsCisgICAgTUlJX1BIWV9JRDAgPSAweDAwMDIsCisgICAgTUlJX1BIWV9JRDEgPSAweDAwMDMsCisgICAgTUlJX0FOQURWICAgPSAweDAwMDQsCisgICAgTUlJX0FOTFBBUiAgPSAweDAwMDUsCisgICAgTUlJX0FORVhUICAgPSAweDAwMDYKK307CisKKy8qIG1paSByZWdpc3RlcnMgc3BlY2lmaWMgdG8gU2lTIDkwMCAqLworZW51bSBzaXNfbWlpX3JlZ2lzdGVycyB7CisgICAgTUlJX0NPTkZJRzEgPSAweDAwMTAsCisgICAgTUlJX0NPTkZJRzIgPSAweDAwMTEsCisgICAgTUlJX1NUU09VVCAgPSAweDAwMTIsCisgICAgTUlJX01BU0sgICAgPSAweDAwMTMsCisgICAgTUlJX1JFU1YgICAgPSAweDAwMTQKK307CisKKy8qIG1paSByZWdpc3RlcnMgc3BlY2lmaWMgdG8gQU1EIDc5QzkwMSAqLworZW51bSBhbWRfbWlpX3JlZ2lzdGVycyB7CisgICAgTUlJX1NUQVRVU19TVU1NQVJZID0gMHgwMDE4Cit9OworCisvKiBtaWkgcmVnaXN0ZXJzIHNwZWNpZmljIHRvIElDUyAxODkzICovCitlbnVtIGljc19taWlfcmVnaXN0ZXJzIHsKKwlNSUlfRVhUQ1RSTCAgPSAweDAwMTAsIE1JSV9RUERTVFMgPSAweDAwMTEsIE1JSV8xMEJUT1AgPSAweDAwMTIsCisJTUlJX0VYVENUUkwyID0gMHgwMDEzCit9OworCisKKworLyogTUlJIENvbnRyb2wgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zLiAqLworZW51bSBtaWlfY29udHJvbF9yZWdpc3Rlcl9iaXRzIHsKKyAgICBNSUlfQ05UTF9GRFggICAgICA9IDB4MDEwMCwKKyAgICBNSUlfQ05UTF9SU1RfQVVUTyA9IDB4MDIwMCwgCisgICAgTUlJX0NOVExfSVNPTEFURSAgPSAweDA0MDAsCisgICAgTUlJX0NOVExfUFdSRFdOICAgPSAweDA4MDAsCisgICAgTUlJX0NOVExfQVVUTyAgICAgPSAweDEwMDAsCisgICAgTUlJX0NOVExfU1BFRUQgICAgPSAweDIwMDAsCisgICAgTUlJX0NOVExfTFBCSyAgICAgPSAweDQwMDAsCisgICAgTUlJX0NOVExfUkVTRVQgICAgPSAweDgwMDAKK307CisKKy8qIE1JSSBTdGF0dXMgcmVnaXN0ZXIgYml0ICAqLworZW51bSBtaWlfc3RhdHVzX3JlZ2lzdGVyX2JpdHMgeworICAgIE1JSV9TVEFUX0VYVCAgICAgICAgPSAweDAwMDEsCisgICAgTUlJX1NUQVRfSkFCICAgICAgICA9IDB4MDAwMiwgCisgICAgTUlJX1NUQVRfTElOSyAgICAgICA9IDB4MDAwNCwKKyAgICBNSUlfU1RBVF9DQU5fQVVUTyAgID0gMHgwMDA4LCAKKyAgICBNSUlfU1RBVF9GQVVMVCAgICAgID0gMHgwMDEwLAorICAgIE1JSV9TVEFUX0FVVE9fRE9ORSAgPSAweDAwMjAsCisgICAgTUlJX1NUQVRfQ0FOX1QgICAgICA9IDB4MDgwMCwgCisgICAgTUlJX1NUQVRfQ0FOX1RfRkRYICA9IDB4MTAwMCwKKyAgICBNSUlfU1RBVF9DQU5fVFggICAgID0gMHgyMDAwLCAKKyAgICBNSUlfU1RBVF9DQU5fVFhfRkRYID0gMHg0MDAwLAorICAgIE1JSV9TVEFUX0NBTl9UNCAgICAgPSAweDgwMDAKK307CisKKyNkZWZpbmUgICAgICAgICBNSUlfSUQxX09VSV9MTyAgICAgICAgICAweEZDMDAgIC8qIGxvdyBiaXRzIG9mIE9VSSBtYXNrICovCisjZGVmaW5lICAgICAgICAgTUlJX0lEMV9NT0RFTCAgICAgICAgICAgMHgwM0YwICAvKiBtb2RlbCBudW1iZXIgKi8KKyNkZWZpbmUgICAgICAgICBNSUlfSUQxX1JFViAgICAgICAgICAgICAweDAwMEYgIC8qIG1vZGVsIG51bWJlciAqLworCisvKiBNSUkgTldBWSBSZWdpc3RlciBCaXRzIC4uLgorICAgdmFsaWQgZm9yIHRoZSBBTkFSIChBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQpIGFuZAorICAgQU5MUEFSIChBdXRvLU5lZ290aWF0aW9uIExpbmsgUGFydG5lcikgcmVnaXN0ZXJzICovCitlbnVtIG1paV9ud2F5X3JlZ2lzdGVyX2JpdHMgeworICAgIE1JSV9OV0FZX05PREVfU0VMID0gMHgwMDFmLAorICAgIE1JSV9OV0FZX0NTTUFfQ0QgID0gMHgwMDAxLAorICAgIE1JSV9OV0FZX1QgICAgICAgID0gMHgwMDIwLAorICAgIE1JSV9OV0FZX1RfRkRYICAgID0gMHgwMDQwLAorICAgIE1JSV9OV0FZX1RYICAgICAgID0gMHgwMDgwLAorICAgIE1JSV9OV0FZX1RYX0ZEWCAgID0gMHgwMTAwLAorICAgIE1JSV9OV0FZX1Q0ICAgICAgID0gMHgwMjAwLAorICAgIE1JSV9OV0FZX1BBVVNFICAgID0gMHgwNDAwLAorICAgIE1JSV9OV0FZX1JGICAgICAgID0gMHgyMDAwLAorICAgIE1JSV9OV0FZX0FDSyAgICAgID0gMHg0MDAwLAorICAgIE1JSV9OV0FZX05QICAgICAgID0gMHg4MDAwCit9OworCitlbnVtIG1paV9zdHNvdXRfcmVnaXN0ZXJfYml0cyB7CisgICAgTUlJX1NUU09VVF9MSU5LX0ZBSUwgPSAweDQwMDAsCisgICAgTUlJX1NUU09VVF9TUEQgICAgICAgPSAweDAwODAsCisgICAgTUlJX1NUU09VVF9EUExYICAgICAgPSAweDAwNDAKK307CisKK2VudW0gbWlpX3N0c2ljc19yZWdpc3Rlcl9iaXRzIHsKKwlNSUlfU1RTSUNTX1NQRCAgPSAweDgwMDAsIE1JSV9TVFNJQ1NfRFBMWCA9IDB4NDAwMCwKKwlNSUlfU1RTSUNTX0xJTktTVFMgPSAweDAwMDEKK307CisKK2VudW0gbWlpX3N0c3N1bV9yZWdpc3Rlcl9iaXRzIHsKKyAgICBNSUlfU1RTU1VNX0xJTksgPSAweDAwMDgsCisgICAgTUlJX1NUU1NVTV9EUExYID0gMHgwMDA0LAorICAgIE1JSV9TVFNTVU1fQVVUTyA9IDB4MDAwMiwKKyAgICBNSUlfU1RTU1VNX1NQRCAgPSAweDAwMDEKK307CisKK2VudW0gc2lzOTAwX3JldmlzaW9uX2lkIHsKKwlTSVM2MzBBXzkwMF9SRVYgPSAweDgwLAkJU0lTNjMwRV85MDBfUkVWID0gMHg4MSwKKwlTSVM2MzBTXzkwMF9SRVYgPSAweDgyLAkJU0lTNjMwRUExXzkwMF9SRVYgPSAweDgzLAorCVNJUzYzMEVUXzkwMF9SRVYgPSAweDg0LCAgICAgICAgU0lTNjM1QV85MDBfUkVWID0gMHg5MCwKKwlTSVM5NnhfOTAwX1JFViA9IDBYOTEsCQlTSVM5MDBCXzkwMF9SRVYgPSAweDAzCit9OworCitlbnVtIHNpczYzMF9yZXZpc2lvbl9pZCB7CisJU0lTNjMwQTAgICAgPSAweDAwLCBTSVM2MzBBMSAgICAgID0gMHgwMSwKKwlTSVM2MzBCMCAgICA9IDB4MTAsIFNJUzYzMEIxICAgICAgPSAweDExCit9OworCisjZGVmaW5lIEZEWF9DQVBBQkxFX0RVUExFWF9VTktOT1dOICAgICAgMAorI2RlZmluZSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEICAgICAgIDEKKyNkZWZpbmUgRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCAgICAgICAyCisKKyNkZWZpbmUgSFdfU1BFRURfVU5DT05GSUcgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhXX1NQRUVEX0hPTUUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBIV19TUEVFRF8xMF9NQlBTICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEhXX1NQRUVEXzEwMF9NQlBTICAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIEhXX1NQRUVEX0RFRkFVTFQgICAgICAgICAgICAgICAgKEhXX1NQRUVEXzEwMF9NQlBTKQorCisjZGVmaW5lIENSQ19TSVpFICAgICAgICA0CisjZGVmaW5lIE1BQ19IRUFERVJfU0laRSAxNAorCisjZGVmaW5lIFRYX0JVRl9TSVpFICAgICAxNTM2CisjZGVmaW5lIFJYX0JVRl9TSVpFICAgICAxNTM2CisKKyNkZWZpbmUgTlVNX1JYX0RFU0MgICAgIDQgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBSeCBkZXNjcmlwdG9yIHJlZ2lzdGVycy4gKi8KKworLyogVGltZSBpbiB0aWNrcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgICAgICAoNCpUSUNLU19QRVJfU0VDKQorCit0eXBlZGVmIHN0cnVjdCBfQnVmZmVyRGVzYyB7CisgICAgdTMyICAgICAgICAgICAgICBsaW5rOworICAgIHZvbGF0aWxlIHUzMiAgICAgY21kc3RzOworICAgIHUzMiAgICAgICAgICAgICAgYnVmcHRyOworfSBCdWZmZXJEZXNjOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc2tnZS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc2tnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmZTgyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9za2dlLmMKQEAgLTAsMCArMSwyNDcyIEBACisvKgorICogZ1BYRSBkcml2ZXIgZm9yIE1hcnZlbGwgWXVrb24gY2hpcHNldCBhbmQgU3lzS29ubmVjdCBHaWdhYml0CisgKiBFdGhlcm5ldCBhZGFwdGVycy4gRGVyaXZlZCBmcm9tIExpbnV4IHNrZ2UgZHJpdmVyICh2MS4xMyksIHdoaWNoIHdhcworICogYmFzZWQgb24gZWFybGllciBzazk4bGluLCBlMTAwIGFuZCBGcmVlQlNEIGlmX3NrIGRyaXZlcnMuCisgKgorICogVGhpcyBkcml2ZXIgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBzdXBwb3J0IGFsbCB0aGUgZmVhdHVyZXMgb2YgdGhlCisgKiBvcmlnaW5hbCBkcml2ZXIgc3VjaCBhcyBsaW5rIGZhaWwtb3ZlciBhbmQgbGluayBtYW5hZ2VtZW50IGJlY2F1c2UKKyAqIHRob3NlIHNob3VsZCBiZSBkb25lIGF0IGhpZ2hlciBsZXZlbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQG9zZGwub3JnPgorICoKKyAqIE1vZGlmaWVkIGZvciBnUFhFLCBKdWx5IDIwMDggYnkgTWljaGFlbCBEZWNrZXIgPG1yZDk5OUBnbWFpbC5jb20+CisgKiBUZXN0ZWQgYW5kIE1vZGlmaWVkIGluIERlY2VtYmVyIDIwMDkgYnkKKyAqICAgIFRob21hcyBNaWxldGljaCA8dGhvbWFzLm1pbGV0aWNoQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorCisjaW5jbHVkZSAic2tnZS5oIgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2tnZV9pZF90YWJsZVtdID0geworCVBDSV9ST00oMHgxMGI3LCAweDE3MDAsICAgICAiM0M5NDAiLCAgICAgIjNDT00gM0M5NDAiLCAwKSwKKwlQQ0lfUk9NKDB4MTBiNywgMHg4MGViLCAgICAgIjNDOTQwQiIsICAgICIzQ09NIDNDOTQwIiwgMCksCisJUENJX1JPTSgweDExNDgsIDB4NDMwMCwgICAgICJHRSIsICAgICAgICAiU3lza29ubmVjdCBHRSIsIDApLAorCVBDSV9ST00oMHgxMTQ4LCAweDQzMjAsICAgICAiWVUiLCAgICAgICAgIlN5c2tvbm5lY3QgWVUiLCAwKSwKKwlQQ0lfUk9NKDB4MTE4NiwgMHg0QzAwLCAgICAgIkRHRTUxMFQiLCAgICJETGluayBER0UtNTEwVCIsIDApLAorCVBDSV9ST00oMHgxMTg2LCAweDRiMDEsICAgICAiREdFNTMwVCIsICAgIkRMaW5rIERHRS01MzBUIiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDMyMCwgICAgICJpZDQzMjAiLCAgICAiTWFydmVsbCBpZDQzMjAiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg1MDA1LCAgICAgImlkNTAwNSIsICAgICJNYXJ2ZWxsIGlkNTAwNSIsIDApLCAvKiBCZWxraW4gKi8KKwlQQ0lfUk9NKDB4MTM3MSwgMHg0MzRlLCAgICAgIkdpZ2FjYXJkIiwgICJDTkVUIEdpZ2FjYXJkIiwgMCksCisJUENJX1JPTSgweDE3MzcsIDB4MTA2NCwgICAgICJFRzEwNjQiLCAgICAiTGlua3N5cyBFRzEwNjQiLCAwKSwKKwlQQ0lfUk9NKDB4MTczNywgMHhmZmZmLCAgICAgImlkX2FueSIsICAgICJMaW5rc3lzIFthbnldIiwgMCkKK307CisKK3N0YXRpYyBpbnQgc2tnZV91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNrZ2VfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNrZ2VfdHhfY2xlYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhtX3BoeV93cml0ZShzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnLCB1MTYgdmFsKTsKK3N0YXRpYyBpbnQgZ21fcGh5X3dyaXRlKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcsIHUxNiB2YWwpOworc3RhdGljIHZvaWQgeXVrb25faW5pdChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIGdlbmVzaXNfbWFjX2luaXQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCBnZW5lc2lzX2xpbmtfdXAoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSk7CisKK3N0YXRpYyB2b2lkIHNrZ2VfcGh5aXJxKHN0cnVjdCBza2dlX2h3ICpodyk7CitzdGF0aWMgdm9pZCBza2dlX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNrZ2VfeG1pdF9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IpOworc3RhdGljIHZvaWQgc2tnZV9uZXRfaXJxICggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSApOworCitzdGF0aWMgdm9pZCBza2dlX3J4X3JlZmlsbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgc2tnZV9vcGVyYXRpb25zID0geworCS5vcGVuICAgICA9IHNrZ2VfdXAsCisJLmNsb3NlICAgID0gc2tnZV9kb3duLAorCS50cmFuc21pdCA9IHNrZ2VfeG1pdF9mcmFtZSwKKwkucG9sbCAgICAgPSBza2dlX3BvbGwsCisJLmlycSAgICAgID0gc2tnZV9uZXRfaXJxCit9OworCisvKiBBdm9pZCBjb25kaXRpb25hbHMgYnkgdXNpbmcgYXJyYXkgKi8KK3N0YXRpYyBjb25zdCBpbnQgdHhxYWRkcltdID0geyBRX1hBMSwgUV9YQTIgfTsKK3N0YXRpYyBjb25zdCBpbnQgcnhxYWRkcltdID0geyBRX1IxLCBRX1IyIH07CitzdGF0aWMgY29uc3QgdTMyIHJ4aXJxbWFza1tdID0geyBJU19SMV9GLCBJU19SMl9GIH07CitzdGF0aWMgY29uc3QgdTMyIHR4aXJxbWFza1tdID0geyBJU19YQTFfRiwgSVNfWEEyX0YgfTsKK3N0YXRpYyBjb25zdCB1MzIgbmFwaW1hc2tbXSA9IHsgSVNfUjFfRnxJU19YQTFfRiwgSVNfUjJfRnxJU19YQTJfRiB9Oworc3RhdGljIGNvbnN0IHUzMiBwb3J0bWFza1tdID0geyBJU19QT1JUXzEsIElTX1BPUlRfMiB9OworCisvKiBEZXRlcm1pbmUgc3VwcG9ydGVkL2FkdmVydGlzZWQgbW9kZXMgYmFzZWQgb24gaGFyZHdhcmUuCisgKiBOb3RlOiBldGh0b29sIEFEVkVSVElTRURfeHh4ID09IFNVUFBPUlRFRF94eHgKKyAqLworc3RhdGljIHUzMiBza2dlX3N1cHBvcnRlZF9tb2Rlcyhjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcpCit7CisJdTMyIHN1cHBvcnRlZDsKKworCWlmIChody0+Y29wcGVyKSB7CisJCXN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYKKwkJCXwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbAorCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfSGFsZgorCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAorCQkJfCBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYKKwkJCXwgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsCisJCQl8IFNVUFBPUlRFRF9BdXRvbmVnfCBTVVBQT1JURURfVFA7CisKKwkJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKKwkJCXN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYKKwkJCQkJICAgICB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwKKwkJCQkJICAgICB8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCisJCQkJCSAgICAgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCk7CisKKwkJZWxzZSBpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTikKKwkJCXN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmOworCX0gZWxzZQorCQlzdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYKKwkJCXwgU1VQUE9SVEVEX0ZJQlJFIHwgU1VQUE9SVEVEX0F1dG9uZWc7CisKKwlyZXR1cm4gc3VwcG9ydGVkOworfQorCisvKiBDaGlwIGludGVybmFsIGZyZXF1ZW5jeSBmb3IgY2xvY2sgY2FsY3VsYXRpb25zICovCitzdGF0aWMgaW5saW5lIHUzMiBod2toeihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcpCit7CisJcmV0dXJuIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpID8gNTMxMjUgOiA3ODEyNTsKK30KKworLyogTWljcm9zZWNvbmRzIHRvIGNoaXAgSFogKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHNrZ2VfdXNlY3MyY2xrKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgdTMyIHVzZWMpCit7CisJcmV0dXJuIGh3a2h6KGh3KSAqIHVzZWMgLyAxMDAwOworfQorCitlbnVtIGxlZF9tb2RlIHsgTEVEX01PREVfT0ZGLCBMRURfTU9ERV9PTiwgTEVEX01PREVfVFNUIH07CitzdGF0aWMgdm9pZCBza2dlX2xlZChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlLCBlbnVtIGxlZF9tb2RlIG1vZGUpCit7CisJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CisJaW50IHBvcnQgPSBza2dlLT5wb3J0OworCisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBMRURfTU9ERV9PRkY6CisJCQlpZiAoaHctPnBoeV90eXBlID09IFNLX1BIWV9CQ09NKQorCQkJCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fUF9FWFRfQ1RSTCwgUEhZX0JfUEVDX0xFRF9PRkYpOworCQkJZWxzZSB7CisJCQkJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgVFhfTEVEX1ZBTCksIDApOworCQkJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfTEVEX0NUUkwpLCBMRURfVF9PRkYpOworCQkJfQorCQkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBMTktfTEVEX1JFRyksIExJTktMRURfT0ZGKTsKKwkJCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIFJYX0xFRF9WQUwpLCAwKTsKKwkJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfTEVEX0NUUkwpLCBMRURfVF9PRkYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBMRURfTU9ERV9PTjoKKwkJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX09OKTsKKwkJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX0xJTktTWU5DX09OKTsKKworCQkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9MRURfQ1RSTCksIExFRF9TVEFSVCk7CisJCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX0xFRF9DVFJMKSwgTEVEX1NUQVJUKTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBMRURfTU9ERV9UU1Q6CisJCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0xFRF9UU1QpLCBMRURfVF9PTik7CisJCQlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBSWF9MRURfVkFMKSwgMTAwKTsKKwkJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfTEVEX0NUUkwpLCBMRURfU1RBUlQpOworCisJCQlpZiAoaHctPnBoeV90eXBlID09IFNLX1BIWV9CQ09NKQorCQkJCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fUF9FWFRfQ1RSTCwgUEhZX0JfUEVDX0xFRF9PTik7CisJCQllbHNlIHsKKwkJCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX0xFRF9UU1QpLCBMRURfVF9PTik7CisJCQkJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgVFhfTEVEX1ZBTCksIDEwMCk7CisJCQkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9MRURfQ1RSTCksIExFRF9TVEFSVCk7CisJCQl9CisKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIExFRF9NT0RFX09GRjoKKwkJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX0NUUkwsIDApOworCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwKKwkJCQkgICAgIFBIWV9NX0xFRF9NT19EVVAoTU9fTEVEX09GRikgIHwKKwkJCQkgICAgIFBIWV9NX0xFRF9NT18xMChNT19MRURfT0ZGKSAgIHwKKwkJCQkgICAgIFBIWV9NX0xFRF9NT18xMDAoTU9fTEVEX09GRikgIHwKKwkJCQkgICAgIFBIWV9NX0xFRF9NT18xMDAwKE1PX0xFRF9PRkYpIHwKKwkJCQkgICAgIFBIWV9NX0xFRF9NT19SWChNT19MRURfT0ZGKSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfTU9ERV9PTjoKKwkJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX0NUUkwsCisJCQkJICAgICBQSFlfTV9MRURfUFVMU19EVVIoUFVMU18xNzBNUykgfAorCQkJCSAgICAgUEhZX01fTEVEX0JMSU5LX1JUKEJMSU5LXzg0TVMpIHwKKwkJCQkgICAgIFBIWV9NX0xFRENfVFhfQ1RSTCB8CisJCQkJICAgICBQSFlfTV9MRURDX0RQX0NUUkwpOworCisJCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9PVkVSLAorCQkJCSAgICAgUEhZX01fTEVEX01PX1JYKE1PX0xFRF9PRkYpIHwKKwkJCQkgICAgIChza2dlLT5zcGVlZCA9PSBTUEVFRF8xMDAgPworCQkJCSAgICAgIFBIWV9NX0xFRF9NT18xMDAoTU9fTEVEX09OKSA6IDApKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9NT0RFX1RTVDoKKwkJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX0NUUkwsIDApOworCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwKKwkJCQkgICAgIFBIWV9NX0xFRF9NT19EVVAoTU9fTEVEX09OKSAgfAorCQkJCSAgICAgUEhZX01fTEVEX01PXzEwKE1PX0xFRF9PTikgICB8CisJCQkJICAgICBQSFlfTV9MRURfTU9fMTAwKE1PX0xFRF9PTikgIHwKKwkJCQkgICAgIFBIWV9NX0xFRF9NT18xMDAwKE1PX0xFRF9PTikgfAorCQkJCSAgICAgUEhZX01fTEVEX01PX1JYKE1PX0xFRF9PTikpOworCQl9CisJfQorfQorCisvKgorICogSSd2ZSBsZWZ0IGluIHRoZXNlIEVFUFJPTSBhbmQgVlBEIGZ1bmN0aW9ucywgYXMgc29tZW9uZSBtYXkgZGVzaXJlIHRvCisgKiBpbnRlZ3JhdGUgdGhlbSBpbiB0aGUgZnV0dXJlLiAtbWRlY2sKKyAqCisgKiBzdGF0aWMgaW50IHNrZ2VfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKyAqIHsKKyAqIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAqIAl1MzIgcmVnMjsKKyAqCisgKiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNrZ2UtPmh3LT5wZGV2LCBQQ0lfREVWX1JFRzIsICZyZWcyKTsKKyAqIAlyZXR1cm4gMSA8PCAoICgocmVnMiAmIFBDSV9WUERfUk9NX1NaKSA+PiAxNCkgKyA4KTsKKyAqIH0KKyAqCisgKiBzdGF0aWMgdTMyIHNrZ2VfdnBkX3JlYWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjYXAsIHUxNiBvZmZzZXQpCisgKiB7CisgKiAJdTMyIHZhbDsKKyAqCisgKiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIGNhcCArIFBDSV9WUERfQUREUiwgb2Zmc2V0KTsKKyAqCisgKiAJZG8geworICogCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBjYXAgKyBQQ0lfVlBEX0FERFIsICZvZmZzZXQpOworICogCX0gd2hpbGUgKCEob2Zmc2V0ICYgUENJX1ZQRF9BRERSX0YpKTsKKyAqCisgKiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGNhcCArIFBDSV9WUERfREFUQSwgJnZhbCk7CisgKiAJcmV0dXJuIHZhbDsKKyAqIH0KKyAqCisgKiBzdGF0aWMgdm9pZCBza2dlX3ZwZF93cml0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGNhcCwgdTE2IG9mZnNldCwgdTMyIHZhbCkKKyAqIHsKKyAqIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGNhcCArIFBDSV9WUERfREFUQSwgdmFsKTsKKyAqIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgY2FwICsgUENJX1ZQRF9BRERSLAorICogCQkJICAgICAgb2Zmc2V0IHwgUENJX1ZQRF9BRERSX0YpOworICoKKyAqIAlkbyB7CisgKiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIGNhcCArIFBDSV9WUERfQUREUiwgJm9mZnNldCk7CisgKiAJfSB3aGlsZSAob2Zmc2V0ICYgUENJX1ZQRF9BRERSX0YpOworICogfQorICoKKyAqIHN0YXRpYyBpbnQgc2tnZV9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLAorICogCQkJICAgdTggKmRhdGEpCisgKiB7CisgKiAJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisgKiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBza2dlLT5ody0+cGRldjsKKyAqIAlpbnQgY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1ZQRCk7CisgKiAJaW50IGxlbmd0aCA9IGVlcHJvbS0+bGVuOworICogCXUxNiBvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKKyAqCisgKiAJaWYgKCFjYXApCisgKiAJCXJldHVybiAtRUlOVkFMOworICoKKyAqIAllZXByb20tPm1hZ2ljID0gU0tHRV9FRVBST01fTUFHSUM7CisgKgorICogCXdoaWxlIChsZW5ndGggPiAwKSB7CisgKiAJCXUzMiB2YWwgPSBza2dlX3ZwZF9yZWFkKHBkZXYsIGNhcCwgb2Zmc2V0KTsKKyAqIAkJaW50IG4gPSBtaW5fdChpbnQsIGxlbmd0aCwgc2l6ZW9mKHZhbCkpOworICoKKyAqIAkJbWVtY3B5KGRhdGEsICZ2YWwsIG4pOworICogCQlsZW5ndGggLT0gbjsKKyAqIAkJZGF0YSArPSBuOworICogCQlvZmZzZXQgKz0gbjsKKyAqIAl9CisgKiAJcmV0dXJuIDA7CisgKiB9CisgKgorICogc3RhdGljIGludCBza2dlX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sCisgKiAJCQkgICB1OCAqZGF0YSkKKyAqIHsKKyAqIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAqIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHNrZ2UtPmh3LT5wZGV2OworICogCWludCBjYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfVlBEKTsKKyAqIAlpbnQgbGVuZ3RoID0gZWVwcm9tLT5sZW47CisgKiAJdTE2IG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0OworICoKKyAqIAlpZiAoIWNhcCkKKyAqIAkJcmV0dXJuIC1FSU5WQUw7CisgKgorICogCWlmIChlZXByb20tPm1hZ2ljICE9IFNLR0VfRUVQUk9NX01BR0lDKQorICogCQlyZXR1cm4gLUVJTlZBTDsKKyAqCisgKiAJd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAqIAkJdTMyIHZhbDsKKyAqIAkJaW50IG4gPSBtaW5fdChpbnQsIGxlbmd0aCwgc2l6ZW9mKHZhbCkpOworICoKKyAqIAkJaWYgKG4gPCBzaXplb2YodmFsKSkKKyAqIAkJCXZhbCA9IHNrZ2VfdnBkX3JlYWQocGRldiwgY2FwLCBvZmZzZXQpOworICogCQltZW1jcHkoJnZhbCwgZGF0YSwgbik7CisgKgorICogCQlza2dlX3ZwZF93cml0ZShwZGV2LCBjYXAsIG9mZnNldCwgdmFsKTsKKyAqCisgKiAJCWxlbmd0aCAtPSBuOworICogCQlkYXRhICs9IG47CisgKiAJCW9mZnNldCArPSBuOworICogCX0KKyAqIAlyZXR1cm4gMDsKKyAqIH0KKyAqLworCisvKgorICogQWxsb2NhdGUgcmluZyBlbGVtZW50cyBhbmQgY2hhaW4gdGhlbSB0b2dldGhlcgorICogT25lLXRvLW9uZSBhc3NvY2lhdGlvbiBvZiBib2FyZCBkZXNjcmlwdG9ycyB3aXRoIHJpbmcgZWxlbWVudHMKKyAqLworc3RhdGljIGludCBza2dlX3JpbmdfYWxsb2Moc3RydWN0IHNrZ2VfcmluZyAqcmluZywgdm9pZCAqdmFkZHIsIHUzMiBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bSkKK3sKKwlzdHJ1Y3Qgc2tnZV90eF9kZXNjICpkOworCXN0cnVjdCBza2dlX2VsZW1lbnQgKmU7CisJdW5zaWduZWQgaW50IGk7CisKKwlyaW5nLT5zdGFydCA9IHphbGxvYyhudW0qc2l6ZW9mKCplKSk7CisJaWYgKCFyaW5nLT5zdGFydCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwLCBlID0gcmluZy0+c3RhcnQsIGQgPSB2YWRkcjsgaSA8IG51bTsgaSsrLCBlKyssIGQrKykgeworCQllLT5kZXNjID0gZDsKKwkJaWYgKGkgPT0gbnVtIC0gMSkgeworCQkJZS0+bmV4dCA9IHJpbmctPnN0YXJ0OworCQkJZC0+bmV4dF9vZmZzZXQgPSBiYXNlOworCQl9IGVsc2UgeworCQkJZS0+bmV4dCA9IGUgKyAxOworCQkJZC0+bmV4dF9vZmZzZXQgPSBiYXNlICsgKGkrMSkgKiBzaXplb2YoKmQpOworCQl9CisJfQorCXJpbmctPnRvX3VzZSA9IHJpbmctPnRvX2NsZWFuID0gcmluZy0+c3RhcnQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWxsb2NhdGUgYW5kIHNldHVwIGEgbmV3IGJ1ZmZlciBmb3IgcmVjZWl2aW5nICovCitzdGF0aWMgdm9pZCBza2dlX3J4X3NldHVwKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgX191bnVzZWQsCisJCQkgIHN0cnVjdCBza2dlX2VsZW1lbnQgKmUsCisJCQkgIHN0cnVjdCBpb19idWZmZXIgKmlvYiwgdW5zaWduZWQgaW50IGJ1ZnNpemUpCit7CisJc3RydWN0IHNrZ2VfcnhfZGVzYyAqcmQgPSBlLT5kZXNjOworCXU2NCBtYXA7CisKKwltYXAgPSAoIGlvYiAhPSBOVUxMICkgPyB2aXJ0X3RvX2J1cyhpb2ItPmRhdGEpIDogMDsKKworCXJkLT5kbWFfbG8gPSBtYXA7CisJcmQtPmRtYV9oaSA9IG1hcCA+PiAzMjsKKwllLT5pb2IgPSBpb2I7CisJcmQtPmNzdW0xX3N0YXJ0ID0gRVRIX0hMRU47CisJcmQtPmNzdW0yX3N0YXJ0ID0gRVRIX0hMRU47CisJcmQtPmNzdW0xID0gMDsKKwlyZC0+Y3N1bTIgPSAwOworCisJd21iKCk7CisKKwlyZC0+Y29udHJvbCA9IEJNVV9PV04gfCBCTVVfU1RGIHwgQk1VX0lSUV9FT0YgfCBCTVVfVENQX0NIRUNLIHwgYnVmc2l6ZTsKK30KKworLyogUmVzdW1lIHJlY2VpdmluZyB1c2luZyBleGlzdGluZyBza2IsCisgKiBOb3RlOiBETUEgYWRkcmVzcyBpcyBub3QgY2hhbmdlZCBieSBjaGlwLgorICogCSBNVFUgbm90IGNoYW5nZWQgd2hpbGUgcmVjZWl2ZXIgYWN0aXZlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2tnZV9yeF9yZXVzZShzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tnZV9yeF9kZXNjICpyZCA9IGUtPmRlc2M7CisKKwlyZC0+Y3N1bTIgPSAwOworCXJkLT5jc3VtMl9zdGFydCA9IEVUSF9ITEVOOworCisJd21iKCk7CisKKwlyZC0+Y29udHJvbCA9IEJNVV9PV04gfCBCTVVfU1RGIHwgQk1VX0lSUV9FT0YgfCBCTVVfVENQX0NIRUNLIHwgc2l6ZTsKK30KKworCisvKiBGcmVlIGFsbCAgYnVmZmVycyBpbiByZWNlaXZlIHJpbmcsIGFzc3VtZXMgcmVjZWl2ZXIgc3RvcHBlZCAqLworc3RhdGljIHZvaWQgc2tnZV9yeF9jbGVhbihzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQoreworCXN0cnVjdCBza2dlX3JpbmcgKnJpbmcgPSAmc2tnZS0+cnhfcmluZzsKKwlzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplOworCisJZSA9IHJpbmctPnN0YXJ0OworCWRvIHsKKwkJc3RydWN0IHNrZ2VfcnhfZGVzYyAqcmQgPSBlLT5kZXNjOworCQlyZC0+Y29udHJvbCA9IDA7CisJCWlmIChlLT5pb2IpIHsKKwkJCWZyZWVfaW9iKGUtPmlvYik7CisJCQllLT5pb2IgPSBOVUxMOworCQl9CisJfSB3aGlsZSAoKGUgPSBlLT5uZXh0KSAhPSByaW5nLT5zdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIHNrZ2VfbGlua191cChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQoreworCXNrZ2Vfd3JpdGU4KHNrZ2UtPmh3LCBTS19SRUcoc2tnZS0+cG9ydCwgTE5LX0xFRF9SRUcpLAorCQkgICAgTEVEX0JMS19PRkZ8TEVEX1NZTkNfT0ZGfExFRF9PTik7CisKKwluZXRkZXZfbGlua191cChza2dlLT5uZXRkZXYpOworCisJREJHMihQRlggIiVzOiBMaW5rIGlzIHVwIGF0ICVkIE1icHMsICVzIGR1cGxleFxuIiwKKwkgICAgIHNrZ2UtPm5ldGRldi0+bmFtZSwgc2tnZS0+c3BlZWQsCisJICAgICBza2dlLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgPyAiZnVsbCIgOiAiaGFsZiIpOworfQorCitzdGF0aWMgdm9pZCBza2dlX2xpbmtfZG93bihzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQoreworCXNrZ2Vfd3JpdGU4KHNrZ2UtPmh3LCBTS19SRUcoc2tnZS0+cG9ydCwgTE5LX0xFRF9SRUcpLCBMRURfT0ZGKTsKKwluZXRkZXZfbGlua19kb3duKHNrZ2UtPm5ldGRldik7CisKKwlEQkcyKFBGWCAiJXM6IExpbmsgaXMgZG93bi5cbiIsIHNrZ2UtPm5ldGRldi0+bmFtZSk7Cit9CisKKworc3RhdGljIHZvaWQgeG1fbGlua19kb3duKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGh3LT5kZXZbcG9ydF07CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9JTVNLLCBYTV9JTVNLX0RJU0FCTEUpOworCisJaWYgKG5ldGRldl9saW5rX29rKGRldikpCisJCXNrZ2VfbGlua19kb3duKHNrZ2UpOworfQorCitzdGF0aWMgaW50IF9feG1fcGh5X3JlYWQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZywgdTE2ICp2YWwpCit7CisJaW50IGk7CisKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9QSFlfQUREUiwgcmVnIHwgaHctPnBoeV9hZGRyKTsKKwkqdmFsID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9QSFlfREFUQSk7CisKKwlpZiAoaHctPnBoeV90eXBlID09IFNLX1BIWV9YTUFDKQorCQlnb3RvIHJlYWR5OworCisJZm9yIChpID0gMDsgaSA8IFBIWV9SRVRSSUVTOyBpKyspIHsKKwkJaWYgKHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkgJiBYTV9NTVVfUEhZX1JEWSkKKwkJCWdvdG8gcmVhZHk7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKKyByZWFkeToKKwkqdmFsID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9QSFlfREFUQSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUxNiB4bV9waHlfcmVhZChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnKQoreworCXUxNiB2ID0gMDsKKwlpZiAoX194bV9waHlfcmVhZChodywgcG9ydCwgcmVnLCAmdikpCisJCURCRyhQRlggIiVzOiBwaHkgcmVhZCB0aW1lZCBvdXRcbiIsCisJCSAgICAgICBody0+ZGV2W3BvcnRdLT5uYW1lKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGludCB4bV9waHlfd3JpdGUoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgaTsKKworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1BIWV9BRERSLCByZWcgfCBody0+cGh5X2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7CisJCWlmICghKHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkgJiBYTV9NTVVfUEhZX0JVU1kpKQorCQkJZ290byByZWFkeTsKKwkJdWRlbGF5KDEpOworCX0KKwlyZXR1cm4gLUVJTzsKKworIHJlYWR5OgorCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1BIWV9EQVRBLCB2YWwpOworCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7CisJCWlmICghKHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkgJiBYTV9NTVVfUEhZX0JVU1kpKQorCQkJcmV0dXJuIDA7CisJCXVkZWxheSgxKTsKKwl9CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVzaXNfaW5pdChzdHJ1Y3Qgc2tnZV9odyAqaHcpCit7CisJLyogc2V0IGJsaW5rIHNvdXJjZSBjb3VudGVyICovCisJc2tnZV93cml0ZTMyKGh3LCBCMl9CU0NfSU5JLCAoU0tfQkxLX0RVUiAqIFNLX0ZBQ1RfNTMpIC8gMTAwKTsKKwlza2dlX3dyaXRlOChodywgQjJfQlNDX0NUUkwsIEJTQ19TVEFSVCk7CisKKwkvKiBjb25maWd1cmUgbWFjIGFyYml0ZXIgKi8KKwlza2dlX3dyaXRlMTYoaHcsIEIzX01BX1RPX0NUUkwsIE1BX1JTVF9DTFIpOworCisJLyogY29uZmlndXJlIG1hYyBhcmJpdGVyIHRpbWVvdXQgdmFsdWVzICovCisJc2tnZV93cml0ZTgoaHcsIEIzX01BX1RPSU5JX1JYMSwgU0tfTUFDX1RPXzUzKTsKKwlza2dlX3dyaXRlOChodywgQjNfTUFfVE9JTklfUlgyLCBTS19NQUNfVE9fNTMpOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9UT0lOSV9UWDEsIFNLX01BQ19UT181Myk7CisJc2tnZV93cml0ZTgoaHcsIEIzX01BX1RPSU5JX1RYMiwgU0tfTUFDX1RPXzUzKTsKKworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9SQ0lOSV9SWDEsIDApOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9SQ0lOSV9SWDIsIDApOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9SQ0lOSV9UWDEsIDApOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9SQ0lOSV9UWDIsIDApOworCisJLyogY29uZmlndXJlIHBhY2tldCBhcmJpdGVyIHRpbWVvdXQgKi8KKwlza2dlX3dyaXRlMTYoaHcsIEIzX1BBX0NUUkwsIFBBX1JTVF9DTFIpOworCXNrZ2Vfd3JpdGUxNihodywgQjNfUEFfVE9JTklfUlgxLCBTS19QS1RfVE9fTUFYKTsKKwlza2dlX3dyaXRlMTYoaHcsIEIzX1BBX1RPSU5JX1RYMSwgU0tfUEtUX1RPX01BWCk7CisJc2tnZV93cml0ZTE2KGh3LCBCM19QQV9UT0lOSV9SWDIsIFNLX1BLVF9UT19NQVgpOworCXNrZ2Vfd3JpdGUxNihodywgQjNfUEFfVE9JTklfVFgyLCBTS19QS1RfVE9fTUFYKTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXNpc19yZXNldChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KQoreworCWNvbnN0IHU4IHplcm9bOF0gID0geyAwIH07CisJdTMyIHJlZzsKKworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR01BQ19JUlFfTVNLKSwgMCk7CisKKwkvKiByZXNldCB0aGUgc3RhdGlzdGljcyBtb2R1bGUgKi8KKwl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9HUF9QT1JULCBYTV9HUF9SRVNfU1RBVCk7CisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fSU1TSywgWE1fSU1TS19ESVNBQkxFKTsKKwl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCAwKTsJCS8qIGNsZWFyIE1vZGUgUmVnICovCisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fVFhfQ01ELCAwKTsJLyogcmVzZXQgVFggQ01EIFJlZyAqLworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1JYX0NNRCwgMCk7CS8qIHJlc2V0IFJYIENNRCBSZWcgKi8KKworCS8qIGRpc2FibGUgQnJvYWRjb20gUEhZIElSUSAqLworCWlmIChody0+cGh5X3R5cGUgPT0gU0tfUEhZX0JDT00pCisJCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFBIWV9CQ09NX0lOVF9NQVNLLCAweGZmZmYpOworCisJeG1fb3V0aGFzaChodywgcG9ydCwgWE1fSFNNLCB6ZXJvKTsKKworCS8qIEZsdXNoIFRYIGFuZCBSWCBmaWZvICovCisJcmVnID0geG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9NT0RFKTsKKwl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCByZWcgfCBYTV9NRF9GVEYpOworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsIHJlZyB8IFhNX01EX0ZSRik7Cit9CisKKworLyogQ29udmVydCBtb2RlIHRvIE1JSSB2YWx1ZXMgICovCitzdGF0aWMgY29uc3QgdTE2IHBoeV9wYXVzZV9tYXBbXSA9IHsKKwlbRkxPV19NT0RFX05PTkVdID0JMCwKKwlbRkxPV19NT0RFX0xPQ19TRU5EXSA9CVBIWV9BTl9QQVVTRV9BU1lNLAorCVtGTE9XX01PREVfU1lNTUVUUklDXSA9IFBIWV9BTl9QQVVTRV9DQVAsCisJW0ZMT1dfTU9ERV9TWU1fT1JfUkVNXSAgPSBQSFlfQU5fUEFVU0VfQ0FQIHwgUEhZX0FOX1BBVVNFX0FTWU0sCit9OworCisvKiBzcGVjaWFsIGRlZmluZXMgZm9yIEZJQkVSICg4OEUxMDExUyBvbmx5KSAqLworc3RhdGljIGNvbnN0IHUxNiBmaWJlcl9wYXVzZV9tYXBbXSA9IHsKKwlbRkxPV19NT0RFX05PTkVdCT0gUEhZX1hfUF9OT19QQVVTRSwKKwlbRkxPV19NT0RFX0xPQ19TRU5EXQk9IFBIWV9YX1BfQVNZTV9NRCwKKwlbRkxPV19NT0RFX1NZTU1FVFJJQ10JPSBQSFlfWF9QX1NZTV9NRCwKKwlbRkxPV19NT0RFX1NZTV9PUl9SRU1dCT0gUEhZX1hfUF9CT1RIX01ELAorfTsKKworCisvKiBDaGVjayBzdGF0dXMgb2YgQnJvYWRjb20gcGh5IGxpbmsgKi8KK3N0YXRpYyB2b2lkIGJjb21fY2hlY2tfbGluayhzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W3BvcnRdOworCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBzdGF0dXM7CisKKwkvKiByZWFkIHR3aWNlIGJlY2F1c2Ugb2YgbGF0Y2ggKi8KKwl4bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fU1RBVCk7CisJc3RhdHVzID0geG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX1NUQVQpOworCisJaWYgKChzdGF0dXMgJiBQSFlfU1RfTFNZTkMpID09IDApIHsKKwkJeG1fbGlua19kb3duKGh3LCBwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCXUxNiBscGEsIGF1eDsKKworCQlpZiAoIShzdGF0dXMgJiBQSFlfU1RfQU5fT1ZFUikpCisJCQlyZXR1cm47CisKKwkJbHBhID0geG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9YTUFDX0FVTkVfTFApOworCQlpZiAobHBhICYgUEhZX0JfQU5fUkYpIHsKKwkJCURCRyhQRlggIiVzOiByZW1vdGUgZmF1bHRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWF1eCA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfU1RBVCk7CisKKwkJLyogQ2hlY2sgRHVwbGV4IG1pc21hdGNoICovCisJCXN3aXRjaCAoYXV4ICYgUEhZX0JfQVNfQU5fUkVTX01TSykgeworCQljYXNlIFBIWV9CX1JFU18xMDAwRkQ6CisJCQlza2dlLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9CX1JFU18xMDAwSEQ6CisJCQlza2dlLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHKFBGWCAiJXM6IGR1cGxleCBtaXNtYXRjaFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogV2UgYXJlIHVzaW5nIElFRUUgODAyLjN6L0Q1LjAgVGFibGUgMzctNCAqLworCQlzd2l0Y2ggKGF1eCAmIFBIWV9CX0FTX1BBVVNFX01TSykgeworCQljYXNlIFBIWV9CX0FTX1BBVVNFX01TSzoKKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX1NZTU1FVFJJQzsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9CX0FTX1BSUjoKKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX1JFTV9TRU5EOworCQkJYnJlYWs7CisJCWNhc2UgUEhZX0JfQVNfUFJUOgorCQkJc2tnZS0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUQVRfTE9DX1NFTkQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX05PTkU7CisJCX0KKwkJc2tnZS0+c3BlZWQgPSBTUEVFRF8xMDAwOworCX0KKworCWlmICghbmV0ZGV2X2xpbmtfb2soZGV2KSkKKwkJZ2VuZXNpc19saW5rX3VwKHNrZ2UpOworfQorCisvKiBCcm9hZGNvbSA1NDAwIG9ubHkgc3VwcG9ydHMgZ2lhZ2FiaXQhIFN5c0tvbm5lY3QgZGlkIG5vdCBwdXQgYW4gYWRkaXRpb25hbAorICogUGh5IG9uIGZvciAxMDAgb3IgMTBNYml0IG9wZXJhdGlvbgorICovCitzdGF0aWMgdm9pZCBiY29tX3BoeV9pbml0KHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCit7CisJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CisJaW50IHBvcnQgPSBza2dlLT5wb3J0OworCXVuc2lnbmVkIGludCBpOworCXUxNiBpZDEsIHIsIGV4dCwgY3RsOworCisJLyogbWFnaWMgd29ya2Fyb3VuZCBwYXR0ZXJucyBmb3IgQnJvYWRjb20gKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJdTE2IHJlZzsKKwkJdTE2IHZhbDsKKwl9IEExaGFja1tdID0geworCQl7IDB4MTgsIDB4MGMyMCB9LCB7IDB4MTcsIDB4MDAxMiB9LCB7IDB4MTUsIDB4MTEwNCB9LAorCQl7IDB4MTcsIDB4MDAxMyB9LCB7IDB4MTUsIDB4MDQwNCB9LCB7IDB4MTcsIDB4ODAwNiB9LAorCQl7IDB4MTUsIDB4MDEzMiB9LCB7IDB4MTcsIDB4ODAwNiB9LCB7IDB4MTUsIDB4MDIzMiB9LAorCQl7IDB4MTcsIDB4ODAwRCB9LCB7IDB4MTUsIDB4MDAwRiB9LCB7IDB4MTgsIDB4MDQyMCB9LAorCX0sIEMwaGFja1tdID0geworCQl7IDB4MTgsIDB4MGMyMCB9LCB7IDB4MTcsIDB4MDAxMiB9LCB7IDB4MTUsIDB4MTIwNCB9LAorCQl7IDB4MTcsIDB4MDAxMyB9LCB7IDB4MTUsIDB4MEEwNCB9LCB7IDB4MTgsIDB4MDQyMCB9LAorCX07CisKKwkvKiByZWFkIElkIGZyb20gZXh0ZXJuYWwgUEhZIChhbGwgaGF2ZSB0aGUgc2FtZSBhZGRyZXNzKSAqLworCWlkMSA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfWE1BQ19JRDEpOworCisJLyogT3B0aW1pemUgTURJTyB0cmFuc2ZlciBieSBzdXBwcmVzc2luZyBwcmVhbWJsZS4gKi8KKwlyID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKKwlyIHw9ICBYTV9NTVVfTk9fUFJFOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQscik7CisKKwlzd2l0Y2ggKGlkMSkgeworCWNhc2UgUEhZX0JDT01fSUQxX0MwOgorCQkvKgorCQkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhIGZvciB0aGUgQzAgdHlwZS4KKwkJICogV3JpdGUgbWFnaWMgcGF0dGVybnMgdG8gcmVzZXJ2ZWQgcmVnaXN0ZXJzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoQzBoYWNrKTsgaSsrKQorCQkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LAorCQkJCSAgICAgQzBoYWNrW2ldLnJlZywgQzBoYWNrW2ldLnZhbCk7CisKKwkJYnJlYWs7CisJY2FzZSBQSFlfQkNPTV9JRDFfQTE6CisJCS8qCisJCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgZm9yIHRoZSBBMSB0eXBlLgorCQkgKiBXcml0ZSBtYWdpYyBwYXR0ZXJucyB0byByZXNlcnZlZCByZWdpc3RlcnMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShBMWhhY2spOyBpKyspCisJCQl4bV9waHlfd3JpdGUoaHcsIHBvcnQsCisJCQkJICAgICBBMWhhY2tbaV0ucmVnLCBBMWhhY2tbaV0udmFsKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhICgjMTA1MjMpIGZvciBhbGwgQkNvbSBQSFlzLgorCSAqIERpc2FibGUgUG93ZXIgTWFuYWdlbWVudCBhZnRlciByZXNldC4KKwkgKi8KKwlyID0geG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMKTsKKwlyIHw9IFBIWV9CX0FDX0RJU19QTTsKKwl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLCByKTsKKworCS8qIER1bW15IHJlYWQgKi8KKwl4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX0lTUkMpOworCisJZXh0ID0gUEhZX0JfUEVDX0VOX0xUUjsgLyogZW5hYmxlIHR4IGxlZCAqLworCWN0bCA9IFBIWV9DVF9TUDEwMDA7CS8qIGFsd2F5cyAxMDAwbWJpdCAqLworCisJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJLyoKKwkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSAjMSBmb3IgdGhlIEM1IHR5cGUuCisJCSAqIDEwMDBCYXNlLVQgTGluayBBY3F1aXNpdGlvbiBGYWlsdXJlIGluIFNsYXZlIE1vZGUKKwkJICogU2V0IFJlcGVhdGVyL0RURSBiaXQgMTAgb2YgdGhlIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlcgorCQkgKi8KKwkJdTE2IGFkdiA9IFBIWV9CXzEwMDBDX1JEOworCQlpZiAoc2tnZS0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQorCQkJYWR2IHw9IFBIWV9CXzEwMDBDX0FIRDsKKwkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKKwkJCWFkdiB8PSBQSFlfQl8xMDAwQ19BRkQ7CisJCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fMTAwMFRfQ1RSTCwgYWR2KTsKKworCQljdGwgfD0gUEhZX0NUX0FORSB8IFBIWV9DVF9SRV9DRkc7CisJfSBlbHNlIHsKKwkJaWYgKHNrZ2UtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCWN0bCB8PSBQSFlfQ1RfRFVQX01EOworCQkvKiBGb3JjZSB0byBzbGF2ZSAqLworCQl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NXzEwMDBUX0NUUkwsIFBIWV9CXzEwMDBDX01TRSk7CisJfQorCisJLyogU2V0IGF1dG9uZWdvdGlhdGlvbiBwYXVzZSBwYXJhbWV0ZXJzICovCisJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9BVU5FX0FEViwKKwkJICAgICBwaHlfcGF1c2VfbWFwW3NrZ2UtPmZsb3dfY29udHJvbF0gfCBQSFlfQU5fQ1NNQSk7CisKKwl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX1BfRVhUX0NUUkwsIGV4dCk7CisJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9DVFJMLCBjdGwpOworCisJLyogVXNlIGxpbmsgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgKi8KKwl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0lOVF9NQVNLLCBQSFlfQl9ERUZfTVNLKTsKK30KKworc3RhdGljIHZvaWQgeG1fcGh5X2luaXQoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKK3sKKwlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKKwlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CisJdTE2IGN0cmwgPSAwOworCisJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKKwkJCWN0cmwgfD0gUEhZX1hfQU5fSEQ7CisJCWlmIChza2dlLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCisJCQljdHJsIHw9IFBIWV9YX0FOX0ZEOworCisJCWN0cmwgfD0gZmliZXJfcGF1c2VfbWFwW3NrZ2UtPmZsb3dfY29udHJvbF07CisKKwkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfWE1BQ19BVU5FX0FEViwgY3RybCk7CisKKwkJLyogUmVzdGFydCBBdXRvLW5lZ290aWF0aW9uICovCisJCWN0cmwgPSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKKwl9IGVsc2UgeworCQkvKiBTZXQgRHVwbGV4TW9kZSBpbiBDb25maWcgcmVnaXN0ZXIgKi8KKwkJaWYgKHNrZ2UtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCWN0cmwgfD0gUEhZX0NUX0RVUF9NRDsKKwkJLyoKKwkJICogRG8gTk9UIGVuYWJsZSBBdXRvLW5lZ290aWF0aW9uIGhlcmUuIFRoaXMgd291bGQgaG9sZAorCQkgKiB0aGUgbGluayBkb3duIGJlY2F1c2Ugbm8gSURMRXMgYXJlIHRyYW5zbWl0dGVkCisJCSAqLworCX0KKworCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX1hNQUNfQ1RSTCwgY3RybCk7CisKKwkvKiBQb2xsIFBIWSBmb3Igc3RhdHVzIGNoYW5nZXMgKi8KKwlza2dlLT51c2VfeG1fbGlua190aW1lciA9IDE7Cit9CisKK3N0YXRpYyBpbnQgeG1fY2hlY2tfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OworCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKKwl1MTYgc3RhdHVzOworCisJLyogcmVhZCB0d2ljZSBiZWNhdXNlIG9mIGxhdGNoICovCisJeG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9YTUFDX1NUQVQpOworCXN0YXR1cyA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfWE1BQ19TVEFUKTsKKworCWlmICgoc3RhdHVzICYgUEhZX1NUX0xTWU5DKSA9PSAwKSB7CisJCXhtX2xpbmtfZG93bihodywgcG9ydCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCXUxNiBscGEsIHJlczsKKworCQlpZiAoIShzdGF0dXMgJiBQSFlfU1RfQU5fT1ZFUikpCisJCQlyZXR1cm4gMDsKKworCQlscGEgPSB4bV9waHlfcmVhZChodywgcG9ydCwgUEhZX1hNQUNfQVVORV9MUCk7CisJCWlmIChscGEgJiBQSFlfQl9BTl9SRikgeworCQkJREJHKFBGWCAiJXM6IHJlbW90ZSBmYXVsdFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZXMgPSB4bV9waHlfcmVhZChodywgcG9ydCwgUEhZX1hNQUNfUkVTX0FCSSk7CisKKwkJLyogQ2hlY2sgRHVwbGV4IG1pc21hdGNoICovCisJCXN3aXRjaCAocmVzICYgKFBIWV9YX1JTX0hEIHwgUEhZX1hfUlNfRkQpKSB7CisJCWNhc2UgUEhZX1hfUlNfRkQ6CisJCQlza2dlLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9YX1JTX0hEOgorCQkJc2tnZS0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCRyhQRlggIiVzOiBkdXBsZXggbWlzbWF0Y2hcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogV2UgYXJlIHVzaW5nIElFRUUgODAyLjN6L0Q1LjAgVGFibGUgMzctNCAqLworCQlpZiAoKHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfU1lNTUVUUklDIHx8CisJCSAgICAgc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9TWU1fT1JfUkVNKSAmJgorCQkgICAgKGxwYSAmIFBIWV9YX1BfU1lNX01EKSkKKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX1NZTU1FVFJJQzsKKwkJZWxzZSBpZiAoc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9TWU1fT1JfUkVNICYmCisJCQkgKGxwYSAmIFBIWV9YX1JTX1BBVVNFKSA9PSBQSFlfWF9QX0FTWU1fTUQpCisJCQkvKiBFbmFibGUgUEFVU0UgcmVjZWl2ZSwgZGlzYWJsZSBQQVVTRSB0cmFuc21pdCAqLworCQkJc2tnZS0+Zmxvd19zdGF0dXMgID0gRkxPV19TVEFUX1JFTV9TRU5EOworCQllbHNlIGlmIChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX0xPQ19TRU5EICYmCisJCQkgKGxwYSAmIFBIWV9YX1JTX1BBVVNFKSA9PSBQSFlfWF9QX0JPVEhfTUQpCisJCQkvKiBEaXNhYmxlIFBBVVNFIHJlY2VpdmUsIGVuYWJsZSBQQVVTRSB0cmFuc21pdCAqLworCQkJc2tnZS0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUQVRfTE9DX1NFTkQ7CisJCWVsc2UKKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX05PTkU7CisKKwkJc2tnZS0+c3BlZWQgPSBTUEVFRF8xMDAwOworCX0KKworCWlmICghbmV0ZGV2X2xpbmtfb2soZGV2KSkKKwkJZ2VuZXNpc19saW5rX3VwKHNrZ2UpOworCXJldHVybiAxOworfQorCisvKiBQb2xsIHRvIGNoZWNrIGZvciBsaW5rIGNvbWluZyB1cC4KKyAqCisgKiBTaW5jZSBpbnRlcm5hbCBQSFkgaXMgd2lyZWQgdG8gYSBsZXZlbCB0cmlnZ2VyZWQgcGluLCBjYW4ndAorICogZ2V0IGFuIGludGVycnVwdCB3aGVuIGNhcnJpZXIgaXMgZGV0ZWN0ZWQsIG5lZWQgdG8gcG9sbCBmb3IKKyAqIGxpbmsgY29taW5nIHVwLgorICovCitzdGF0aWMgdm9pZCB4bV9saW5rX3RpbWVyKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrZ2UtPm5ldGRldjsKKwlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKKwlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CisJaW50IGk7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IHRoZSBsaW5rIGJ5IGNoZWNraW5nIEdQSU8gcmVnaXN0ZXIgdGhyZWUgdGltZXMuCisJICogVGhpcyBwaW4gaGFzIHRoZSBzaWduYWwgZnJvbSB0aGUgbGlua19zeW5jIHBpbiBjb25uZWN0ZWQgdG8gaXQuCisJICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9HUF9QT1JUKSAmIFhNX0dQX0lOUF9BU1MpCisJCQlyZXR1cm47CisJfQorCisgICAgICAgIC8qIFJlLWVuYWJsZSBpbnRlcnJ1cHQgdG8gZGV0ZWN0IGxpbmsgZG93biAqLworCWlmICh4bV9jaGVja19saW5rKGRldikpIHsKKwkJdTE2IG1zayA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fSU1TSyk7CisJCW1zayAmPSB+WE1fSVNfSU5QX0FTUzsKKwkJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fSU1TSywgbXNrKTsKKwkJeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9JU1JDKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVzaXNfbWFjX2luaXQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltwb3J0XTsKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwl1MzIgcjsKKwljb25zdCB1OCB6ZXJvWzZdICA9IHsgMCB9OworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwxKSwKKwkJCSAgICAgTUZGX1NFVF9NQUNfUlNUKTsKKwkJaWYgKHNrZ2VfcmVhZDE2KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwxKSkgJiBNRkZfU0VUX01BQ19SU1QpCisJCQlnb3RvIHJlc2V0X29rOworCQl1ZGVsYXkoMSk7CisJfQorCisJREJHKFBGWCAiJXM6IGdlbmVzaXMgcmVzZXQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCisgcmVzZXRfb2s6CisJLyogVW5yZXNldCB0aGUgWE1BQy4gKi8KKwlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDEpLCBNRkZfQ0xSX01BQ19SU1QpOworCisJLyoKKwkgKiBQZXJmb3JtIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gZm9yIGV4dGVybmFsIFBIWXMsCisJICogbmFtZWx5IGZvciB0aGUgMTAwMGJhc2VUWCBjYXJkcyB0aGF0IHVzZSB0aGUgWE1BQydzCisJICogR01JSSBtb2RlLgorCSAqLworCWlmIChody0+cGh5X3R5cGUgIT0gU0tfUEhZX1hNQUMpIHsKKwkJLyogVGFrZSBleHRlcm5hbCBQaHkgb3V0IG9mIHJlc2V0ICovCisJCXIgPSBza2dlX3JlYWQzMihodywgQjJfR1BfSU8pOworCQlpZiAocG9ydCA9PSAwKQorCQkJciB8PSBHUF9ESVJfMHxHUF9JT18wOworCQllbHNlCisJCQlyIHw9IEdQX0RJUl8yfEdQX0lPXzI7CisKKwkJc2tnZV93cml0ZTMyKGh3LCBCMl9HUF9JTywgcik7CisKKwkJLyogRW5hYmxlIEdNSUkgaW50ZXJmYWNlICovCisJCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX0hXX0NGRywgWE1fSFdfR01JSV9NRCk7CisJfQorCisKKwlzd2l0Y2goaHctPnBoeV90eXBlKSB7CisJY2FzZSBTS19QSFlfWE1BQzoKKwkJeG1fcGh5X2luaXQoc2tnZSk7CisJCWJyZWFrOworCWNhc2UgU0tfUEhZX0JDT006CisJCWJjb21fcGh5X2luaXQoc2tnZSk7CisJCWJjb21fY2hlY2tfbGluayhodywgcG9ydCk7CisJfQorCisJLyogU2V0IFN0YXRpb24gQWRkcmVzcyAqLworCXhtX291dGFkZHIoaHcsIHBvcnQsIFhNX1NBLCBkZXYtPmxsX2FkZHIpOworCisJLyogV2UgZG9uJ3QgdXNlIG1hdGNoIGFkZHJlc3NlcyBzbyBjbGVhciAqLworCWZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQorCQl4bV9vdXRhZGRyKGh3LCBwb3J0LCBYTV9FWE0oaSksIHplcm8pOworCisJLyogQ2xlYXIgTUlCIGNvdW50ZXJzICovCisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fU1RBVF9DTUQsCisJCQlYTV9TQ19DTFJfUlhDIHwgWE1fU0NfQ0xSX1RYQyk7CisJLyogQ2xlYXIgdHdvIHRpbWVzIGFjY29yZGluZyB0byBFcnJhdGEgIzMgKi8KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9TVEFUX0NNRCwKKwkJCVhNX1NDX0NMUl9SWEMgfCBYTV9TQ19DTFJfVFhDKTsKKworCS8qIGNvbmZpZ3VyZSBSeCBIaWdoIFdhdGVyIE1hcmsgKFhNX1JYX0hJX1dNKSAqLworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1JYX0hJX1dNLCAxNDUwKTsKKworCS8qIFdlIGRvbid0IG5lZWQgdGhlIEZDUyBhcHBlbmRlZCB0byB0aGUgcGFja2V0LiAqLworCXIgPSBYTV9SWF9MRU5FUlJfT0sgfCBYTV9SWF9TVFJJUF9GQ1M7CisKKwlpZiAoc2tnZS0+ZHVwbGV4ID09IERVUExFWF9IQUxGKSB7CisJCS8qCisJCSAqIElmIGluIG1hbnVhbCBoYWxmIGR1cGxleCBtb2RlIHRoZSBvdGhlciBzaWRlIG1pZ2h0IGJlIGluCisJCSAqIGZ1bGwgZHVwbGV4IG1vZGUsIHNvIGlnbm9yZSBpZiBhIGNhcnJpZXIgZXh0ZW5zaW9uIGlzIG5vdCBzZWVuCisJCSAqIG9uIGZyYW1lcyByZWNlaXZlZAorCQkgKi8KKwkJciB8PSBYTV9SWF9ESVNfQ0VYVDsKKwl9CisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fUlhfQ01ELCByKTsKKworCS8qIFdlIHdhbnQgc2hvcnQgZnJhbWVzIHBhZGRlZCB0byA2MCBieXRlcy4gKi8KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9UWF9DTUQsIFhNX1RYX0FVVE9fUEFEKTsKKworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1RYX1RIUiwgNTEyKTsKKworCS8qCisJICogRW5hYmxlIHRoZSByZWNlcHRpb24gb2YgYWxsIGVycm9yIGZyYW1lcy4gVGhpcyBpcyBpcworCSAqIGEgbmVjZXNzYXJ5IGV2aWwgZHVlIHRvIHRoZSBkZXNpZ24gb2YgdGhlIFhNQUMuIFRoZQorCSAqIFhNQUMncyByZWNlaXZlIEZJRk8gaXMgb25seSA4SyBpbiBzaXplLCBob3dldmVyIGp1bWJvCisJICogZnJhbWVzIGNhbiBiZSB1cCB0byA5MDAwIGJ5dGVzIGluIGxlbmd0aC4gV2hlbiBiYWQKKwkgKiBmcmFtZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZCwgdGhlIFhNQUMncyBSWCBGSUZPIG9wZXJhdGVzCisJICogaW4gJ3N0b3JlIGFuZCBmb3J3YXJkJyBtb2RlLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUKKwkgKiBlbnRpcmUgZnJhbWUgaGFzIHRvIGZpdCBpbnRvIHRoZSBGSUZPLCBidXQgdGhhdCBtZWFucworCSAqIHRoYXQganVtYm8gZnJhbWVzIGxhcmdlciB0aGFuIDgxOTIgYnl0ZXMgd2lsbCBiZQorCSAqIHRydW5jYXRlZC4gRGlzYWJsaW5nIGFsbCBiYWQgZnJhbWUgZmlsdGVyaW5nIGNhdXNlcworCSAqIHRoZSBSWCBGSUZPIHRvIG9wZXJhdGUgaW4gc3RyZWFtaW5nIG1vZGUsIGluIHdoaWNoCisJICogY2FzZSB0aGUgWE1BQyB3aWxsIHN0YXJ0IHRyYW5zZmVycmluZyBmcmFtZXMgb3V0IG9mIHRoZQorCSAqIFJYIEZJRk8gYXMgc29vbiBhcyB0aGUgRklGTyB0aHJlc2hvbGQgaXMgcmVhY2hlZC4KKwkgKi8KKwl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCBYTV9ERUZfTU9ERSk7CisKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgUmVjZWl2ZSBDb3VudGVyIEV2ZW50IE1hc2sgKFhNX1JYX0VWX01TSykKKwkgKgktIEVuYWJsZSBhbGwgYml0cyBleGNlcHRpbmcgJ09jdGV0cyBSeCBPSyBMb3cgQ250T3YnCisJICoJICBhbmQgJ09jdGV0cyBSeCBPSyBIaSBDbnQgT3YnLgorCSAqLworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX1JYX0VWX01TSywgWE1SX0RFRl9NU0spOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBUcmFuc21pdCBDb3VudGVyIEV2ZW50IE1hc2sgKFhNX1RYX0VWX01TSykKKwkgKgktIEVuYWJsZSBhbGwgYml0cyBleGNlcHRpbmcgJ09jdGV0cyBUeCBPSyBMb3cgQ250T3YnCisJICoJICBhbmQgJ09jdGV0cyBUeCBPSyBIaSBDbnQgT3YnLgorCSAqLworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX1RYX0VWX01TSywgWE1UX0RFRl9NU0spOworCisJLyogQ29uZmlndXJlIE1BQyBhcmJpdGVyICovCisJc2tnZV93cml0ZTE2KGh3LCBCM19NQV9UT19DVFJMLCBNQV9SU1RfQ0xSKTsKKworCS8qIGNvbmZpZ3VyZSB0aW1lb3V0IHZhbHVlcyAqLworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9UT0lOSV9SWDEsIDcyKTsKKwlza2dlX3dyaXRlOChodywgQjNfTUFfVE9JTklfUlgyLCA3Mik7CisJc2tnZV93cml0ZTgoaHcsIEIzX01BX1RPSU5JX1RYMSwgNzIpOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9UT0lOSV9UWDIsIDcyKTsKKworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9SQ0lOSV9SWDEsIDApOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9SQ0lOSV9SWDIsIDApOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9SQ0lOSV9UWDEsIDApOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9SQ0lOSV9UWDIsIDApOworCisJLyogQ29uZmlndXJlIFJ4IE1BQyBGSUZPICovCisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9NRkZfQ1RSTDIpLCBNRkZfUlNUX0NMUik7CisJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfTUZGX0NUUkwxKSwgTUZGX0VOQV9USU1fUEFUKTsKKwlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9FTkFfT1BfTUQpOworCisJLyogQ29uZmlndXJlIFR4IE1BQyBGSUZPICovCisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDIpLCBNRkZfUlNUX0NMUik7CisJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwxKSwgTUZGX1RYX0NUUkxfREVGKTsKKwlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX01GRl9DVFJMMiksIE1GRl9FTkFfT1BfTUQpOworCisJLyogZW5hYmxlIHRpbWVvdXQgdGltZXJzICovCisJc2tnZV93cml0ZTE2KGh3LCBCM19QQV9DVFJMLAorCQkgICAgIChwb3J0ID09IDApID8gUEFfRU5BX1RPX1RYMSA6IFBBX0VOQV9UT19UWDIpOworfQorCitzdGF0aWMgdm9pZCBnZW5lc2lzX3N0b3Aoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKK3sKKwlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKKwlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CisJdW5zaWduZWQgcmV0cmllcyA9IDEwMDA7CisJdTE2IGNtZDsKKworCS8qIERpc2FibGUgVHggYW5kIFJ4ICovCisJY21kID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKKwljbWQgJj0gfihYTV9NTVVfRU5BX1JYIHwgWE1fTU1VX0VOQV9UWCk7CisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwgY21kKTsKKworCWdlbmVzaXNfcmVzZXQoaHcsIHBvcnQpOworCisJLyogQ2xlYXIgVHggcGFja2V0IGFyYml0ZXIgdGltZW91dCBJUlEgKi8KKwlza2dlX3dyaXRlMTYoaHcsIEIzX1BBX0NUUkwsCisJCSAgICAgcG9ydCA9PSAwID8gUEFfQ0xSX1RPX1RYMSA6IFBBX0NMUl9UT19UWDIpOworCisJLyogUmVzZXQgdGhlIE1BQyAqLworCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9DTFJfTUFDX1JTVCk7CisJZG8geworCQlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDEpLCBNRkZfU0VUX01BQ19SU1QpOworCQlpZiAoIShza2dlX3JlYWQxNihodywgU0tfUkVHKHBvcnQsIFRYX01GRl9DVFJMMSkpICYgTUZGX1NFVF9NQUNfUlNUKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKC0tcmV0cmllcyA+IDApOworCisJLyogRm9yIGV4dGVybmFsIFBIWXMgdGhlcmUgbXVzdCBiZSBzcGVjaWFsIGhhbmRsaW5nICovCisJaWYgKGh3LT5waHlfdHlwZSAhPSBTS19QSFlfWE1BQykgeworCQl1MzIgcmVnID0gc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKTsKKwkJaWYgKHBvcnQgPT0gMCkgeworCQkJcmVnIHw9IEdQX0RJUl8wOworCQkJcmVnICY9IH5HUF9JT18wOworCQl9IGVsc2UgeworCQkJcmVnIHw9IEdQX0RJUl8yOworCQkJcmVnICY9IH5HUF9JT18yOworCQl9CisJCXNrZ2Vfd3JpdGUzMihodywgQjJfR1BfSU8sIHJlZyk7CisJCXNrZ2VfcmVhZDMyKGh3LCBCMl9HUF9JTyk7CisJfQorCisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwKKwkJCXhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkKKwkJCSYgfihYTV9NTVVfRU5BX1JYIHwgWE1fTU1VX0VOQV9UWCkpOworCisJeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXNpc19saW5rX3VwKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCit7CisJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CisJaW50IHBvcnQgPSBza2dlLT5wb3J0OworCXUxNiBjbWQsIG1zazsKKwl1MzIgbW9kZTsKKworCWNtZCA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7CisKKwkvKgorCSAqIGVuYWJsaW5nIHBhdXNlIGZyYW1lIHJlY2VwdGlvbiBpcyByZXF1aXJlZCBmb3IgMTAwMEJUCisJICogYmVjYXVzZSB0aGUgWE1BQyBpcyBub3QgcmVzZXQgaWYgdGhlIGxpbmsgaXMgZ29pbmcgZG93bgorCSAqLworCWlmIChza2dlLT5mbG93X3N0YXR1cyA9PSBGTE9XX1NUQVRfTk9ORSB8fAorCSAgICBza2dlLT5mbG93X3N0YXR1cyA9PSBGTE9XX1NUQVRfTE9DX1NFTkQpCisJCS8qIERpc2FibGUgUGF1c2UgRnJhbWUgUmVjZXB0aW9uICovCisJCWNtZCB8PSBYTV9NTVVfSUdOX1BGOworCWVsc2UKKwkJLyogRW5hYmxlIFBhdXNlIEZyYW1lIFJlY2VwdGlvbiAqLworCQljbWQgJj0gflhNX01NVV9JR05fUEY7CisKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9NTVVfQ01ELCBjbWQpOworCisJbW9kZSA9IHhtX3JlYWQzMihodywgcG9ydCwgWE1fTU9ERSk7CisJaWYgKHNrZ2UtPmZsb3dfc3RhdHVzPT0gRkxPV19TVEFUX1NZTU1FVFJJQyB8fAorCSAgICBza2dlLT5mbG93X3N0YXR1cyA9PSBGTE9XX1NUQVRfTE9DX1NFTkQpIHsKKwkJLyoKKwkJICogQ29uZmlndXJlIFBhdXNlIEZyYW1lIEdlbmVyYXRpb24KKwkJICogVXNlIGludGVybmFsIGFuZCBleHRlcm5hbCBQYXVzZSBGcmFtZSBHZW5lcmF0aW9uLgorCQkgKiBTZW5kaW5nIHBhdXNlIGZyYW1lcyBpcyBlZGdlIHRyaWdnZXJlZC4KKwkJICogU2VuZCBhIFBhdXNlIGZyYW1lIHdpdGggdGhlIG1heGltdW0gcGF1c2UgdGltZSBpZgorCQkgKiBpbnRlcm5hbCBvZGVyIGV4dGVybmFsIEZJRk8gZnVsbCBjb25kaXRpb24gb2NjdXJzLgorCQkgKiBTZW5kIGEgemVybyBwYXVzZSB0aW1lIGZyYW1lIHRvIHJlLXN0YXJ0IHRyYW5zbWlzc2lvbi4KKwkJICovCisJCS8qIFhNX1BBVVNFX0RBID0gJzAxMDAwMEMyODAwMScgKGRlZmF1bHQpICovCisJCS8qIFhNX01BQ19QVElNRSA9IDB4ZmZmZiAobWF4aW11bSkgKi8KKwkJLyogcmVtZW1iZXIgdGhpcyB2YWx1ZSBpcyBkZWZpbmVkIGluIGJpZyBlbmRpYW4gKCEpICovCisJCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01BQ19QVElNRSwgMHhmZmZmKTsKKworCQltb2RlIHw9IFhNX1BBVVNFX01PREU7CisJCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX01GRl9DVFJMMSksIE1GRl9FTkFfUEFVU0UpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIGRpc2FibGUgcGF1c2UgZnJhbWUgZ2VuZXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgMTAwMEJUCisJCSAqIGJlY2F1c2UgdGhlIFhNQUMgaXMgbm90IHJlc2V0IGlmIHRoZSBsaW5rIGlzIGdvaW5nIGRvd24KKwkJICovCisJCS8qIERpc2FibGUgUGF1c2UgTW9kZSBpbiBNb2RlIFJlZ2lzdGVyICovCisJCW1vZGUgJj0gflhNX1BBVVNFX01PREU7CisKKwkJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfTUZGX0NUUkwxKSwgTUZGX0RJU19QQVVTRSk7CisJfQorCisJeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgbW9kZSk7CisKKwkvKiBUdXJuIG9uIGRldGVjdGlvbiBvZiBUeCB1bmRlcnJ1biAqLworCW1zayA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fSU1TSyk7CisJbXNrICY9IH5YTV9JU19UWEZfVVI7CisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fSU1TSywgbXNrKTsKKworCXhtX3JlYWQxNihodywgcG9ydCwgWE1fSVNSQyk7CisKKwkvKiBnZXQgTU1VIENvbW1hbmQgUmVnLiAqLworCWNtZCA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7CisJaWYgKGh3LT5waHlfdHlwZSAhPSBTS19QSFlfWE1BQyAmJiBza2dlLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCWNtZCB8PSBYTV9NTVVfR01JSV9GRDsKKworCS8qCisJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSAoIzEwNTIzKSBmb3IgYWxsIEJDb20gUGh5cworCSAqIEVuYWJsZSBQb3dlciBNYW5hZ2VtZW50IGFmdGVyIGxpbmsgdXAKKwkgKi8KKwlpZiAoaHctPnBoeV90eXBlID09IFNLX1BIWV9CQ09NKSB7CisJCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsCisJCQkgICAgIHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCkKKwkJCSAgICAgJiB+UEhZX0JfQUNfRElTX1BNKTsKKwkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywgUEhZX0JfREVGX01TSyk7CisJfQorCisJLyogZW5hYmxlIFJ4L1R4ICovCisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwKKwkJCWNtZCB8IFhNX01NVV9FTkFfUlggfCBYTV9NTVVfRU5BX1RYKTsKKwlza2dlX2xpbmtfdXAoc2tnZSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGJjb21fcGh5X2ludHIoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKK3sKKwlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKKwlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CisJdTE2IGlzcmM7CisKKwlpc3JjID0geG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX0lOVF9TVEFUKTsKKwlEQkdJTyhQRlggIiVzOiBwaHkgaW50ZXJydXB0IHN0YXR1cyAweCV4XG4iLAorCSAgICAgc2tnZS0+bmV0ZGV2LT5uYW1lLCBpc3JjKTsKKworCWlmIChpc3JjICYgUEhZX0JfSVNfUFNFKQorCQlEQkcoUEZYICIlczogdW5jb3JyZWN0YWJsZSBwYWlyIHN3YXAgZXJyb3JcbiIsCisJCSAgICBody0+ZGV2W3BvcnRdLT5uYW1lKTsKKworCS8qIFdvcmthcm91bmQgQkNvbSBFcnJhdGE6CisJICoJZW5hYmxlIGFuZCBkaXNhYmxlIGxvb3BiYWNrIG1vZGUgaWYgIk5PIEhDRCIgb2NjdXJzLgorCSAqLworCWlmIChpc3JjICYgUEhZX0JfSVNfTk9fSERDTCkgeworCQl1MTYgY3RybCA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9DVFJMKTsKKwkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9DVFJMLAorCQkJCSAgY3RybCB8IFBIWV9DVF9MT09QKTsKKwkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9DVFJMLAorCQkJCSAgY3RybCAmIH5QSFlfQ1RfTE9PUCk7CisJfQorCisJaWYgKGlzcmMgJiAoUEhZX0JfSVNfQU5fUFIgfCBQSFlfQl9JU19MU1RfQ0hBTkdFKSkKKwkJYmNvbV9jaGVja19saW5rKGh3LCBwb3J0KTsKKworfQorCitzdGF0aWMgaW50IGdtX3BoeV93cml0ZShzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnLCB1MTYgdmFsKQoreworCWludCBpOworCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1NNSV9EQVRBLCB2YWwpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCwKKwkJCSBHTV9TTUlfQ1RfUEhZX0FEKGh3LT5waHlfYWRkcikgfCBHTV9TTUlfQ1RfUkVHX0FEKHJlZykpOworCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7CisJCXVkZWxheSgxKTsKKworCQlpZiAoIShnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCkgJiBHTV9TTUlfQ1RfQlVTWSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlEQkcoUEZYICIlczogcGh5IHdyaXRlIHRpbWVvdXQgcG9ydCAleCByZWcgJXggdmFsICV4XG4iLAorCSAgICBody0+ZGV2W3BvcnRdLT5uYW1lLAorCSAgICBwb3J0LCByZWcsIHZhbCk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgX19nbV9waHlfcmVhZChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnLCB1MTYgKnZhbCkKK3sKKwlpbnQgaTsKKworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCwKKwkJCSBHTV9TTUlfQ1RfUEhZX0FEKGh3LT5waHlfYWRkcikKKwkJCSB8IEdNX1NNSV9DVF9SRUdfQUQocmVnKSB8IEdNX1NNSV9DVF9PUF9SRCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhZX1JFVFJJRVM7IGkrKykgeworCQl1ZGVsYXkoMSk7CisJCWlmIChnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCkgJiBHTV9TTUlfQ1RfUkRfVkFMKQorCQkJZ290byByZWFkeTsKKwl9CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKKyByZWFkeToKKwkqdmFsID0gZ21hX3JlYWQxNihodywgcG9ydCwgR01fU01JX0RBVEEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTE2IGdtX3BoeV9yZWFkKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcpCit7CisJdTE2IHYgPSAwOworCWlmIChfX2dtX3BoeV9yZWFkKGh3LCBwb3J0LCByZWcsICZ2KSkKKwkJREJHKFBGWCAiJXM6IHBoeSByZWFkIHRpbWVvdXQgcG9ydCAleCByZWcgJXggdmFsICV4XG4iLAorCSAgICAgICBody0+ZGV2W3BvcnRdLT5uYW1lLAorCSAgICAgICBwb3J0LCByZWcsIHYpOworCXJldHVybiB2OworfQorCisvKiBNYXJ2ZWxsIFBoeSBJbml0aWFsaXphdGlvbiAqLworc3RhdGljIHZvaWQgeXVrb25faW5pdChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KQoreworCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihody0+ZGV2W3BvcnRdKTsKKwl1MTYgY3RybCwgY3QxMDAwLCBhZHY7CisKKwlpZiAoc2tnZS0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl1MTYgZWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfRVhUX0NUUkwpOworCisJCWVjdHJsICY9IH4oUEhZX01fRUNfTV9EU0NfTVNLIHwgUEhZX01fRUNfU19EU0NfTVNLIHwKKwkJCSAgUEhZX01fRUNfTUFDX1NfTVNLKTsKKwkJZWN0cmwgfD0gUEhZX01fRUNfTUFDX1MoTUFDX1RYX0NMS18yNV9NSFopOworCisJCWVjdHJsIHw9IFBIWV9NX0VDX01fRFNDKDApIHwgUEhZX01fRUNfU19EU0MoMSk7CisKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTCwgZWN0cmwpOworCX0KKworCWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfQ1RSTCk7CisJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKQorCQljdHJsICY9IH5QSFlfQ1RfQU5FOworCisJY3RybCB8PSBQSFlfQ1RfUkVTRVQ7CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9DVFJMLCBjdHJsKTsKKworCWN0cmwgPSAwOworCWN0MTAwMCA9IDA7CisJYWR2ID0gUEhZX0FOX0NTTUE7CisKKwlpZiAoc2tnZS0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlpZiAoaHctPmNvcHBlcikgeworCQkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKKwkJCQljdDEwMDAgfD0gUEhZX01fMTAwMENfQUZEOworCQkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKKwkJCQljdDEwMDAgfD0gUEhZX01fMTAwMENfQUhEOworCQkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQkJCWFkdiB8PSBQSFlfTV9BTl8xMDBfRkQ7CisJCQlpZiAoc2tnZS0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCQkJYWR2IHw9IFBIWV9NX0FOXzEwMF9IRDsKKwkJCWlmIChza2dlLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQkJCWFkdiB8PSBQSFlfTV9BTl8xMF9GRDsKKwkJCWlmIChza2dlLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQkJCWFkdiB8PSBQSFlfTV9BTl8xMF9IRDsKKworCQkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KKwkJCWFkdiB8PSBwaHlfcGF1c2VfbWFwW3NrZ2UtPmZsb3dfY29udHJvbF07CisJCX0gZWxzZSB7CisJCQlpZiAoc2tnZS0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQkJCWFkdiB8PSBQSFlfTV9BTl8xMDAwWF9BRkQ7CisJCQlpZiAoc2tnZS0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQorCQkJCWFkdiB8PSBQSFlfTV9BTl8xMDAwWF9BSEQ7CisKKwkJCWFkdiB8PSBmaWJlcl9wYXVzZV9tYXBbc2tnZS0+Zmxvd19jb250cm9sXTsKKwkJfQorCisJCS8qIFJlc3RhcnQgQXV0by1uZWdvdGlhdGlvbiAqLworCQljdHJsIHw9IFBIWV9DVF9BTkUgfCBQSFlfQ1RfUkVfQ0ZHOworCX0gZWxzZSB7CisJCS8qIGZvcmNlZCBzcGVlZC9kdXBsZXggc2V0dGluZ3MgKi8KKwkJY3QxMDAwID0gUEhZX01fMTAwMENfTVNFOworCisJCWlmIChza2dlLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQljdHJsIHw9IFBIWV9DVF9EVVBfTUQ7CisKKwkJc3dpdGNoIChza2dlLT5zcGVlZCkgeworCQljYXNlIFNQRUVEXzEwMDA6CisJCQljdHJsIHw9IFBIWV9DVF9TUDEwMDA7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQljdHJsIHw9IFBIWV9DVF9TUDEwMDsKKwkJCWJyZWFrOworCQl9CisKKwkJY3RybCB8PSBQSFlfQ1RfUkVTRVQ7CisJfQorCisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl8xMDAwVF9DVFJMLCBjdDEwMDApOworCisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0FEViwgYWR2KTsKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0NUUkwsIGN0cmwpOworCisJLyogRW5hYmxlIHBoeSBpbnRlcnJ1cHQgb24gYXV0b25lZ290aWF0aW9uIGNvbXBsZXRlIChvciBsaW5rIHVwKSAqLworCWlmIChza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQorCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCBQSFlfTV9JU19BTl9NU0spOworCWVsc2UKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgUEhZX01fSVNfREVGX01TSyk7Cit9CisKK3N0YXRpYyB2b2lkIHl1a29uX3Jlc2V0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCit7CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgMCk7LyogZGlzYWJsZSBQSFkgSVJRcyAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gxLCAwKTsJLyogY2xlYXIgTUMgaGFzaCAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gyLCAwKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fTUNfQUREUl9IMywgMCk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDQsIDApOworCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsCisJCQkgZ21hX3JlYWQxNihodywgcG9ydCwgR01fUlhfQ1RSTCkKKwkJCSB8IEdNX1JYQ1JfVUNGX0VOQSB8IEdNX1JYQ1JfTUNGX0VOQSk7Cit9CisKKy8qIEFwcGFyZW50bHksIGVhcmx5IHZlcnNpb25zIG9mIFl1a29uLUxpdGUgaGFkIHdyb25nIGNoaXBfaWQ/ICovCitzdGF0aWMgaW50IGlzX3l1a29uX2xpdGVfYTAoc3RydWN0IHNrZ2VfaHcgKmh3KQoreworCXUzMiByZWc7CisJaW50IHJldDsKKworCWlmIChody0+Y2hpcF9pZCAhPSBDSElQX0lEX1lVS09OKQorCQlyZXR1cm4gMDsKKworCXJlZyA9IHNrZ2VfcmVhZDMyKGh3LCBCMl9GQVIpOworCXNrZ2Vfd3JpdGU4KGh3LCBCMl9GQVIgKyAzLCAweGZmKTsKKwlyZXQgPSAoc2tnZV9yZWFkOChodywgQjJfRkFSICsgMykgIT0gMCk7CisJc2tnZV93cml0ZTMyKGh3LCBCMl9GQVIsIHJlZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgeXVrb25fbWFjX2luaXQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoaHctPmRldltwb3J0XSk7CisJaW50IGk7CisJdTMyIHJlZzsKKwljb25zdCB1OCAqYWRkciA9IGh3LT5kZXZbcG9ydF0tPmxsX2FkZHI7CisKKwkvKiBXQSBjb2RlIGZvciBDT01BIG1vZGUgLS0gc2V0IFBIWSByZXNldCAqLworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0xJVEUgJiYKKwkgICAgaHctPmNoaXBfcmV2ID49IENISVBfUkVWX1lVX0xJVEVfQTMpIHsKKwkJcmVnID0gc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKTsKKwkJcmVnIHw9IEdQX0RJUl85IHwgR1BfSU9fOTsKKwkJc2tnZV93cml0ZTMyKGh3LCBCMl9HUF9JTywgcmVnKTsKKwl9CisKKwkvKiBoYXJkIHJlc2V0ICovCisJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgR1BIWV9DVFJMKSwgR1BDX1JTVF9TRVQpOworCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19SU1RfU0VUKTsKKworCS8qIFdBIGNvZGUgZm9yIENPTUEgbW9kZSAtLSBjbGVhciBQSFkgcmVzZXQgKi8KKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9MSVRFICYmCisJICAgIGh3LT5jaGlwX3JldiA+PSBDSElQX1JFVl9ZVV9MSVRFX0EzKSB7CisJCXJlZyA9IHNrZ2VfcmVhZDMyKGh3LCBCMl9HUF9JTyk7CisJCXJlZyB8PSBHUF9ESVJfOTsKKwkJcmVnICY9IH5HUF9JT185OworCQlza2dlX3dyaXRlMzIoaHcsIEIyX0dQX0lPLCByZWcpOworCX0KKworCS8qIFNldCBoYXJkd2FyZSBjb25maWcgbW9kZSAqLworCXJlZyA9IEdQQ19JTlRfUE9MX0hJIHwgR1BDX0RJU19GQyB8IEdQQ19ESVNfU0xFRVAgfAorCQlHUENfRU5BX1hDIHwgR1BDX0FORUdfQURWX0FMTF9NIHwgR1BDX0VOQV9QQVVTRTsKKwlyZWcgfD0gaHctPmNvcHBlciA/IEdQQ19IV0NGR19HTUlJX0NPUCA6IEdQQ19IV0NGR19HTUlJX0ZJQjsKKworCS8qIENsZWFyIEdNQyByZXNldCAqLworCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIEdQSFlfQ1RSTCksIHJlZyB8IEdQQ19SU1RfU0VUKTsKKwlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBHUEhZX0NUUkwpLCByZWcgfCBHUENfUlNUX0NMUik7CisJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgR01BQ19DVFJMKSwgR01DX1BBVVNFX09OIHwgR01DX1JTVF9DTFIpOworCisJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CisJCXJlZyA9IEdNX0dQQ1JfQVVfQUxMX0RJUzsKKwkJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsCisJCQkJIGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwpIHwgcmVnKTsKKworCQlzd2l0Y2ggKHNrZ2UtPnNwZWVkKSB7CisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCXJlZyAmPSB+R01fR1BDUl9TUEVFRF8xMDA7CisJCQlyZWcgfD0gR01fR1BDUl9TUEVFRF8xMDAwOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJcmVnICY9IH5HTV9HUENSX1NQRUVEXzEwMDA7CisJCQlyZWcgfD0gR01fR1BDUl9TUEVFRF8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCXJlZyAmPSB+KEdNX0dQQ1JfU1BFRURfMTAwMCB8IEdNX0dQQ1JfU1BFRURfMTAwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNrZ2UtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCXJlZyB8PSBHTV9HUENSX0RVUF9GVUxMOworCX0gZWxzZQorCQlyZWcgPSBHTV9HUENSX1NQRUVEXzEwMDAgfCBHTV9HUENSX1NQRUVEXzEwMCB8IEdNX0dQQ1JfRFVQX0ZVTEw7CisKKwlzd2l0Y2ggKHNrZ2UtPmZsb3dfY29udHJvbCkgeworCWNhc2UgRkxPV19NT0RFX05PTkU6CisJCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PRkYpOworCQlyZWcgfD0gR01fR1BDUl9GQ19UWF9ESVMgfCBHTV9HUENSX0ZDX1JYX0RJUyB8IEdNX0dQQ1JfQVVfRkNUX0RJUzsKKwkJYnJlYWs7CisJY2FzZSBGTE9XX01PREVfTE9DX1NFTkQ6CisJCS8qIGRpc2FibGUgUnggZmxvdy1jb250cm9sICovCisJCXJlZyB8PSBHTV9HUENSX0ZDX1JYX0RJUyB8IEdNX0dQQ1JfQVVfRkNUX0RJUzsKKwkJYnJlYWs7CisJY2FzZSBGTE9XX01PREVfU1lNTUVUUklDOgorCWNhc2UgRkxPV19NT0RFX1NZTV9PUl9SRU06CisJCS8qIGVuYWJsZSBUeCAmIFJ4IGZsb3ctY29udHJvbCAqLworCQlicmVhazsKKwl9CisKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgcmVnKTsKKwlza2dlX3JlYWQxNihodywgU0tfUkVHKHBvcnQsIEdNQUNfSVJRX1NSQykpOworCisJeXVrb25faW5pdChodywgcG9ydCk7CisKKwkvKiBNSUIgY2xlYXIgKi8KKwlyZWcgPSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9QSFlfQUREUik7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1BIWV9BRERSLCByZWcgfCBHTV9QQVJfTUlCX0NMUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgR01fTUlCX0NOVF9TSVpFOyBpKyspCisJCWdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX01JQl9DTlRfQkFTRSArIDgqaSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1BIWV9BRERSLCByZWcpOworCisJLyogdHJhbnNtaXQgY29udHJvbCAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9DVFJMLCBUWF9DT0xfVEhSKFRYX0NPTF9ERUYpKTsKKworCS8qIHJlY2VpdmUgY29udHJvbCByZWc6IHVuaWNhc3QgKyBtdWx0aWNhc3QgKyBubyBGQ1MgICovCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsCisJCQkgR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9DUkNfRElTIHwgR01fUlhDUl9NQ0ZfRU5BKTsKKworCS8qIHRyYW5zbWl0IGZsb3cgY29udHJvbCAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9GTE9XX0NUUkwsIDB4ZmZmZik7CisKKwkvKiB0cmFuc21pdCBwYXJhbWV0ZXIgKi8KKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fVFhfUEFSQU0sCisJCQkgVFhfSkFNX0xFTl9WQUwoVFhfSkFNX0xFTl9ERUYpIHwKKwkJCSBUWF9KQU1fSVBHX1ZBTChUWF9KQU1fSVBHX0RFRikgfAorCQkJIFRYX0lQR19KQU1fREFUQShUWF9JUEdfSkFNX0RFRikpOworCisJLyogY29uZmlndXJlIHRoZSBTZXJpYWwgTW9kZSBSZWdpc3RlciAqLworCXJlZyA9IERBVEFfQkxJTkRfVkFMKERBVEFfQkxJTkRfREVGKQorCQl8IEdNX1NNT0RfVkxBTl9FTkEKKwkJfCBJUEdfREFUQV9WQUwoSVBHX0RBVEFfREVGKTsKKworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9TRVJJQUxfTU9ERSwgcmVnKTsKKworCS8qIHBoeXNpY2FsIGFkZHJlc3M6IHVzZWQgZm9yIHBhdXNlIGZyYW1lcyAqLworCWdtYV9zZXRfYWRkcihodywgcG9ydCwgR01fU1JDX0FERFJfMUwsIGFkZHIpOworCS8qIHZpcnR1YWwgYWRkcmVzcyBmb3IgZGF0YSAqLworCWdtYV9zZXRfYWRkcihodywgcG9ydCwgR01fU1JDX0FERFJfMkwsIGFkZHIpOworCisJLyogZW5hYmxlIGludGVycnVwdCBtYXNrIGZvciBjb3VudGVyIG92ZXJmbG93cyAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9JUlFfTVNLLCAwKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fUlhfSVJRX01TSywgMCk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1RSX0lSUV9NU0ssIDApOworCisJLyogSW5pdGlhbGl6ZSBNYWMgRmlmbyAqLworCisJLyogQ29uZmlndXJlIFJ4IE1BQyBGSUZPICovCisJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0ZMX01TSyksIFJYX0ZGX0ZMX0RFRl9NU0spOworCXJlZyA9IEdNRl9PUEVSX09OIHwgR01GX1JYX0ZfRkxfT047CisKKwkvKiBkaXNhYmxlIFJ4IEdNQUMgRklGTyBGbHVzaCBmb3IgWVVLT04tTGl0ZSBSZXYuIEEwIG9ubHkgKi8KKwlpZiAoaXNfeXVrb25fbGl0ZV9hMChodykpCisJCXJlZyAmPSB+R01GX1JYX0ZfRkxfT047CisKKwlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9DVFJMX1QpLCBHTUZfUlNUX0NMUik7CisJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0NUUkxfVCksIHJlZyk7CisJLyoKKwkgKiBiZWNhdXNlIFBhdXNlIFBhY2tldCBUcnVuY2F0aW9uIGluIEdNQUMgaXMgbm90IHdvcmtpbmcKKwkgKiB3ZSBoYXZlIHRvIGluY3JlYXNlIHRoZSBGbHVzaCBUaHJlc2hvbGQgdG8gNjQgYnl0ZXMKKwkgKiBpbiBvcmRlciB0byBmbHVzaCBwYXVzZSBwYWNrZXRzIGluIFJ4IEZJRk8gb24gWXVrb24tMQorCSAqLworCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9GTF9USFIpLCBSWF9HTUZfRkxfVEhSX0RFRisxKTsKKworCS8qIENvbmZpZ3VyZSBUeCBNQUMgRklGTyAqLworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksIEdNRl9SU1RfQ0xSKTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX09QRVJfT04pOworfQorCisvKiBHbyBpbnRvIHBvd2VyIGRvd24gbW9kZSAqLworc3RhdGljIHZvaWQgeXVrb25fc3VzcGVuZChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KQoreworCXUxNiBjdHJsOworCisJY3RybCA9IGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCk7CisJY3RybCB8PSBQSFlfTV9QQ19QT0xfUl9ESVM7CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgY3RybCk7CisKKwljdHJsID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0NUUkwpOworCWN0cmwgfD0gUEhZX0NUX1JFU0VUOworCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfQ1RSTCwgY3RybCk7CisKKwkvKiBzd2l0Y2ggSUVFRSBjb21wYXRpYmxlIHBvd2VyIGRvd24gbW9kZSBvbiAqLworCWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfQ1RSTCk7CisJY3RybCB8PSBQSFlfQ1RfUERPV047CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9DVFJMLCBjdHJsKTsKK30KKworc3RhdGljIHZvaWQgeXVrb25fc3RvcChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQoreworCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OworCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKKworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR01BQ19JUlFfTVNLKSwgMCk7CisJeXVrb25fcmVzZXQoaHcsIHBvcnQpOworCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsCisJCQkgZ21hX3JlYWQxNihodywgcG9ydCwgR01fR1BfQ1RSTCkKKwkJCSAmIH4oR01fR1BDUl9UWF9FTkF8R01fR1BDUl9SWF9FTkEpKTsKKwlnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKTsKKworCXl1a29uX3N1c3BlbmQoaHcsIHBvcnQpOworCisJLyogc2V0IEdQSFkgQ29udHJvbCByZXNldCAqLworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR1BIWV9DVFJMKSwgR1BDX1JTVF9TRVQpOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR01BQ19DVFJMKSwgR01DX1JTVF9TRVQpOworfQorCitzdGF0aWMgdTE2IHl1a29uX3NwZWVkKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodyBfX3VudXNlZCwgdTE2IGF1eCkKK3sKKwlzd2l0Y2ggKGF1eCAmIFBIWV9NX1BTX1NQRUVEX01TSykgeworCWNhc2UgUEhZX01fUFNfU1BFRURfMTAwMDoKKwkJcmV0dXJuIFNQRUVEXzEwMDA7CisJY2FzZSBQSFlfTV9QU19TUEVFRF8xMDA6CisJCXJldHVybiBTUEVFRF8xMDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFNQRUVEXzEwOworCX0KK30KKworc3RhdGljIHZvaWQgeXVrb25fbGlua191cChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQoreworCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OworCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKKwl1MTYgcmVnOworCisJLyogRW5hYmxlIFRyYW5zbWl0IEZJRk8gVW5kZXJydW4gKi8KKwlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfSVJRX01TSyksIEdNQUNfREVGX01TSyk7CisKKwlyZWcgPSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKTsKKwlpZiAoc2tnZS0+ZHVwbGV4ID09IERVUExFWF9GVUxMIHx8IHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCXJlZyB8PSBHTV9HUENSX0RVUF9GVUxMOworCisJLyogZW5hYmxlIFJ4L1R4ICovCisJcmVnIHw9IEdNX0dQQ1JfUlhfRU5BIHwgR01fR1BDUl9UWF9FTkE7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsIHJlZyk7CisKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCBQSFlfTV9JU19ERUZfTVNLKTsKKwlza2dlX2xpbmtfdXAoc2tnZSk7Cit9CisKK3N0YXRpYyB2b2lkIHl1a29uX2xpbmtfZG93bihzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQoreworCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OworCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKKwl1MTYgY3RybDsKKworCWN0cmwgPSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKTsKKwljdHJsICY9IH4oR01fR1BDUl9SWF9FTkEgfCBHTV9HUENSX1RYX0VOQSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsIGN0cmwpOworCisJaWYgKHNrZ2UtPmZsb3dfc3RhdHVzID09IEZMT1dfU1RBVF9SRU1fU0VORCkgeworCQljdHJsID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0FVTkVfQURWKTsKKwkJY3RybCB8PSBQSFlfTV9BTl9BU1A7CisJCS8qIHJlc3RvcmUgQXN5bW1ldHJpYyBQYXVzZSBiaXQgKi8KKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0FEViwgY3RybCk7CisJfQorCisJc2tnZV9saW5rX2Rvd24oc2tnZSk7CisKKwl5dWtvbl9pbml0KGh3LCBwb3J0KTsKK30KKworc3RhdGljIHZvaWQgeXVrb25fcGh5X2ludHIoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKK3sKKwlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKKwlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CisJY29uc3QgY2hhciAqcmVhc29uID0gTlVMTDsKKwl1MTYgaXN0YXR1cywgcGh5c3RhdDsKKworCWlzdGF0dXMgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfSU5UX1NUQVQpOworCXBoeXN0YXQgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfUEhZX1NUQVQpOworCisJREJHSU8oUEZYICIlczogcGh5IGludGVycnVwdCBzdGF0dXMgMHgleCAweCV4XG4iLAorCSAgICAgc2tnZS0+bmV0ZGV2LT5uYW1lLCBpc3RhdHVzLCBwaHlzdGF0KTsKKworCWlmIChpc3RhdHVzICYgUEhZX01fSVNfQU5fQ09NUEwpIHsKKwkJaWYgKGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0xQKQorCQkgICAgJiBQSFlfTV9BTl9SRikgeworCQkJcmVhc29uID0gInJlbW90ZSBmYXVsdCI7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCWlmIChnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfMTAwMFRfU1RBVCkgJiBQSFlfQl8xMDAwU19NU0YpIHsKKwkJCXJlYXNvbiA9ICJtYXN0ZXIvc2xhdmUgZmF1bHQiOworCQkJZ290byBmYWlsZWQ7CisJCX0KKworCQlpZiAoIShwaHlzdGF0ICYgUEhZX01fUFNfU1BEVVBfUkVTKSkgeworCQkJcmVhc29uID0gInNwZWVkL2R1cGxleCI7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCXNrZ2UtPmR1cGxleCA9IChwaHlzdGF0ICYgUEhZX01fUFNfRlVMTF9EVVApCisJCQk/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJCXNrZ2UtPnNwZWVkID0geXVrb25fc3BlZWQoaHcsIHBoeXN0YXQpOworCisJCS8qIFdlIGFyZSB1c2luZyBJRUVFIDgwMi4zei9ENS4wIFRhYmxlIDM3LTQgKi8KKwkJc3dpdGNoIChwaHlzdGF0ICYgUEhZX01fUFNfUEFVU0VfTVNLKSB7CisJCWNhc2UgUEhZX01fUFNfUEFVU0VfTVNLOgorCQkJc2tnZS0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUQVRfU1lNTUVUUklDOworCQkJYnJlYWs7CisJCWNhc2UgUEhZX01fUFNfUlhfUF9FTjoKKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX1JFTV9TRU5EOworCQkJYnJlYWs7CisJCWNhc2UgUEhZX01fUFNfVFhfUF9FTjoKKwkJCXNrZ2UtPmZsb3dfc3RhdHVzID0gRkxPV19TVEFUX0xPQ19TRU5EOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlza2dlLT5mbG93X3N0YXR1cyA9IEZMT1dfU1RBVF9OT05FOworCQl9CisKKwkJaWYgKHNrZ2UtPmZsb3dfc3RhdHVzID09IEZMT1dfU1RBVF9OT05FIHx8CisJCSAgICAoc2tnZS0+c3BlZWQgPCBTUEVFRF8xMDAwICYmIHNrZ2UtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikpCisJCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PRkYpOworCQllbHNlCisJCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PTik7CisJCXl1a29uX2xpbmtfdXAoc2tnZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXN0YXR1cyAmIFBIWV9NX0lTX0xTUF9DSEFOR0UpCisJCXNrZ2UtPnNwZWVkID0geXVrb25fc3BlZWQoaHcsIHBoeXN0YXQpOworCisJaWYgKGlzdGF0dXMgJiBQSFlfTV9JU19EVVBfQ0hBTkdFKQorCQlza2dlLT5kdXBsZXggPSAocGh5c3RhdCAmIFBIWV9NX1BTX0ZVTExfRFVQKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJaWYgKGlzdGF0dXMgJiBQSFlfTV9JU19MU1RfQ0hBTkdFKSB7CisJCWlmIChwaHlzdGF0ICYgUEhZX01fUFNfTElOS19VUCkKKwkJCXl1a29uX2xpbmtfdXAoc2tnZSk7CisJCWVsc2UKKwkJCXl1a29uX2xpbmtfZG93bihza2dlKTsKKwl9CisJcmV0dXJuOworIGZhaWxlZDoKKwlEQkcoUEZYICIlczogYXV0b25lZ290aWF0aW9uIGZhaWxlZCAoJXMpXG4iLAorCSAgICAgICBza2dlLT5uZXRkZXYtPm5hbWUsIHJlYXNvbik7CisKKwkvKiBYWFggcmVzdGFydCBhdXRvbmVnb3RpYXRpb24/ICovCit9CisKK3N0YXRpYyB2b2lkIHNrZ2VfcmFtc2V0KHN0cnVjdCBza2dlX2h3ICpodywgdTE2IHEsIHUzMiBzdGFydCwgc2l6ZV90IGxlbikKK3sKKwl1MzIgZW5kOworCisJc3RhcnQgLz0gODsKKwlsZW4gLz0gODsKKwllbmQgPSBzdGFydCArIGxlbiAtIDE7CisKKwlza2dlX3dyaXRlOChodywgUkJfQUREUihxLCBSQl9DVFJMKSwgUkJfUlNUX0NMUik7CisJc2tnZV93cml0ZTMyKGh3LCBSQl9BRERSKHEsIFJCX1NUQVJUKSwgc3RhcnQpOworCXNrZ2Vfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9XUCksIHN0YXJ0KTsKKwlza2dlX3dyaXRlMzIoaHcsIFJCX0FERFIocSwgUkJfUlApLCBzdGFydCk7CisJc2tnZV93cml0ZTMyKGh3LCBSQl9BRERSKHEsIFJCX0VORCksIGVuZCk7CisKKwlpZiAocSA9PSBRX1IxIHx8IHEgPT0gUV9SMikgeworCQkvKiBTZXQgdGhyZXNob2xkcyBvbiByZWNlaXZlIHF1ZXVlJ3MgKi8KKwkJc2tnZV93cml0ZTMyKGh3LCBSQl9BRERSKHEsIFJCX1JYX1VUUFApLAorCQkJICAgICBzdGFydCArICgyKmxlbikvMyk7CisJCXNrZ2Vfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9SWF9MVFBQKSwKKwkJCSAgICAgc3RhcnQgKyAobGVuLzMpKTsKKwl9IGVsc2UgeworCQkvKiBFbmFibGUgc3RvcmUgJiBmb3J3YXJkIG9uIFR4IHF1ZXVlJ3MgYmVjYXVzZQorCQkgKiBUeCBGSUZPIGlzIG9ubHkgNEsgb24gR2VuZXNpcyBhbmQgMUsgb24gWXVrb24KKwkJICovCisJCXNrZ2Vfd3JpdGU4KGh3LCBSQl9BRERSKHEsIFJCX0NUUkwpLCBSQl9FTkFfU1RGV0QpOworCX0KKworCXNrZ2Vfd3JpdGU4KGh3LCBSQl9BRERSKHEsIFJCX0NUUkwpLCBSQl9FTkFfT1BfTUQpOworfQorCisvKiBTZXR1cCBCdXMgTWVtb3J5IEludGVyZmFjZSAqLworc3RhdGljIHZvaWQgc2tnZV9xc2V0KHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UsIHUxNiBxLAorCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplKQoreworCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OworCXUzMiB3YXRlcm1hcmsgPSAweDYwMDsKKwl1NjQgYmFzZSA9IHNrZ2UtPmRtYSArIChlLT5kZXNjIC0gc2tnZS0+bWVtKTsKKworCS8qIG9wdGltaXphdGlvbiB0byByZWR1Y2Ugd2luZG93IG9uIDMyYml0LzMzbWh6ICovCisJaWYgKChza2dlX3JlYWQxNihodywgQjBfQ1RTVCkgJiAoQ1NfQlVTX0NMT0NLIHwgQ1NfQlVTX1NMT1RfU1opKSA9PSAwKQorCQl3YXRlcm1hcmsgLz0gMjsKKworCXNrZ2Vfd3JpdGUzMihodywgUV9BRERSKHEsIFFfQ1NSKSwgQ1NSX0NMUl9SRVNFVCk7CisJc2tnZV93cml0ZTMyKGh3LCBRX0FERFIocSwgUV9GKSwgd2F0ZXJtYXJrKTsKKwlza2dlX3dyaXRlMzIoaHcsIFFfQUREUihxLCBRX0RBX0gpLCAodTMyKShiYXNlID4+IDMyKSk7CisJc2tnZV93cml0ZTMyKGh3LCBRX0FERFIocSwgUV9EQV9MKSwgKHUzMiliYXNlKTsKK30KKwordm9pZCBza2dlX2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZyZWUoc2tnZS0+cnhfcmluZy5zdGFydCk7CisJc2tnZS0+cnhfcmluZy5zdGFydCA9IE5VTEw7CisKKwlmcmVlKHNrZ2UtPnR4X3Jpbmcuc3RhcnQpOworCXNrZ2UtPnR4X3Jpbmcuc3RhcnQgPSBOVUxMOworCisJZnJlZV9kbWEoc2tnZS0+bWVtLCBSSU5HX1NJWkUpOworCXNrZ2UtPm1lbSA9IE5VTEw7CisJc2tnZS0+ZG1hID0gMDsKK30KKworc3RhdGljIGludCBza2dlX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CisJaW50IHBvcnQgPSBza2dlLT5wb3J0OworCXUzMiBjaHVuaywgcmFtX2FkZHI7CisJaW50IGVycjsKKworCURCRzIoUEZYICIlczogZW5hYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCisJc2tnZS0+bWVtID0gbWFsbG9jX2RtYShSSU5HX1NJWkUsIFNLR0VfUklOR19BTElHTik7CisJc2tnZS0+ZG1hID0gdmlydF90b19idXMoc2tnZS0+bWVtKTsKKwlpZiAoIXNrZ2UtPm1lbSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHNrZ2UtPm1lbSwgMCwgUklOR19TSVpFKTsKKworCWFzc2VydCghKHNrZ2UtPmRtYSAmIDcpKTsKKworCS8qIEZJWE1FOiBmaW5kIG91dCB3aGV0aGVyIDY0IGJpdCBnUFhFIHdpbGwgYmUgbG9hZGVkID4gNEdCICovCisJaWYgKCh1NjQpc2tnZS0+ZG1hID4+IDMyICE9ICgodTY0KSBza2dlLT5kbWEgKyBSSU5HX1NJWkUpID4+IDMyKSB7CisJCURCRyhQRlggInBjaV9hbGxvY19jb25zaXN0ZW50IHJlZ2lvbiBjcm9zc2VzIDRHIGJvdW5kYXJ5XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJZXJyID0gc2tnZV9yaW5nX2FsbG9jKCZza2dlLT5yeF9yaW5nLCBza2dlLT5tZW0sIHNrZ2UtPmRtYSwgTlVNX1JYX0RFU0MpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJLyogdGhpcyBjYWxsIHJlbGllcyBvbiBlLT5pb2IgYW5kIGQtPmNvbnRyb2wgdG8gYmUgMAorCSAqIFRoaXMgaXMgYXNzdXJlZCBieSBjYWxsaW5nIG1lbXNldCgpIG9uIHNrZ2UtPm1lbSBhbmQgdXNpbmcgemFsbG9jKCkKKwkgKiBmb3IgdGhlIHNrZ2VfZWxlbWVudCBzdHJ1Y3R1cmVzLgorCSAqLworCXNrZ2VfcnhfcmVmaWxsKGRldik7CisKKwllcnIgPSBza2dlX3JpbmdfYWxsb2MoJnNrZ2UtPnR4X3JpbmcsIHNrZ2UtPm1lbSArIFJYX1JJTkdfU0laRSwKKwkJCSAgICAgIHNrZ2UtPmRtYSArIFJYX1JJTkdfU0laRSwgTlVNX1RYX0RFU0MpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJLyogSW5pdGlhbGl6ZSBNQUMgKi8KKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKQorCQlnZW5lc2lzX21hY19pbml0KGh3LCBwb3J0KTsKKwllbHNlCisJCXl1a29uX21hY19pbml0KGh3LCBwb3J0KTsKKworCS8qIENvbmZpZ3VyZSBSQU1idWZmZXJzIC0gZXF1YWxseSBiZXR3ZWVuIHBvcnRzIGFuZCB0eC9yeCAqLworCWNodW5rID0gKGh3LT5yYW1fc2l6ZSAgLSBody0+cmFtX29mZnNldCkgLyAoaHctPnBvcnRzICogMik7CisJcmFtX2FkZHIgPSBody0+cmFtX29mZnNldCArIDIgKiBjaHVuayAqIHBvcnQ7CisKKwlza2dlX3JhbXNldChodywgcnhxYWRkcltwb3J0XSwgcmFtX2FkZHIsIGNodW5rKTsKKwlza2dlX3FzZXQoc2tnZSwgcnhxYWRkcltwb3J0XSwgc2tnZS0+cnhfcmluZy50b19jbGVhbik7CisKKwlhc3NlcnQoIShza2dlLT50eF9yaW5nLnRvX3VzZSAhPSBza2dlLT50eF9yaW5nLnRvX2NsZWFuKSk7CisJc2tnZV9yYW1zZXQoaHcsIHR4cWFkZHJbcG9ydF0sIHJhbV9hZGRyK2NodW5rLCBjaHVuayk7CisJc2tnZV9xc2V0KHNrZ2UsIHR4cWFkZHJbcG9ydF0sIHNrZ2UtPnR4X3JpbmcudG9fdXNlKTsKKworCS8qIFN0YXJ0IHJlY2VpdmVyIEJNVSAqLworCXdtYigpOworCXNrZ2Vfd3JpdGU4KGh3LCBRX0FERFIocnhxYWRkcltwb3J0XSwgUV9DU1IpLCBDU1JfU1RBUlQgfCBDU1JfSVJRX0NMX0YpOworCXNrZ2VfbGVkKHNrZ2UsIExFRF9NT0RFX09OKTsKKworCWh3LT5pbnRyX21hc2sgfD0gcG9ydG1hc2tbcG9ydF07CisJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKKworCXJldHVybiAwOworCisgZXJyOgorCXNrZ2VfcnhfY2xlYW4oc2tnZSk7CisJc2tnZV9mcmVlKGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBzdG9wIHJlY2VpdmVyICovCitzdGF0aWMgdm9pZCBza2dlX3J4X3N0b3Aoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKK3sKKwlza2dlX3dyaXRlOChodywgUV9BRERSKHJ4cWFkZHJbcG9ydF0sIFFfQ1NSKSwgQ1NSX1NUT1ApOworCXNrZ2Vfd3JpdGUzMihodywgUkJfQUREUihwb3J0ID8gUV9SMiA6IFFfUjEsIFJCX0NUUkwpLAorCQkgICAgIFJCX1JTVF9TRVR8UkJfRElTX09QX01EKTsKKwlza2dlX3dyaXRlMzIoaHcsIFFfQUREUihyeHFhZGRyW3BvcnRdLCBRX0NTUiksIENTUl9TRVRfUkVTRVQpOworfQorCitzdGF0aWMgdm9pZCBza2dlX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKKwlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CisKKwlpZiAoc2tnZS0+bWVtID09IE5VTEwpCisJCXJldHVybjsKKworCURCRzIoUEZYICIlczogZGlzYWJsaW5nIGludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKKworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMgJiYgaHctPnBoeV90eXBlID09IFNLX1BIWV9YTUFDKQorCQlza2dlLT51c2VfeG1fbGlua190aW1lciA9IDA7CisKKwluZXRkZXZfbGlua19kb3duKGRldik7CisKKwlody0+aW50cl9tYXNrICY9IH5wb3J0bWFza1twb3J0XTsKKwlza2dlX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGh3LT5pbnRyX21hc2spOworCisJc2tnZV93cml0ZTgoc2tnZS0+aHcsIFNLX1JFRyhza2dlLT5wb3J0LCBMTktfTEVEX1JFRyksIExFRF9PRkYpOworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCWdlbmVzaXNfc3RvcChza2dlKTsKKwllbHNlCisJCXl1a29uX3N0b3Aoc2tnZSk7CisKKwkvKiBTdG9wIHRyYW5zbWl0dGVyICovCisJc2tnZV93cml0ZTgoaHcsIFFfQUREUih0eHFhZGRyW3BvcnRdLCBRX0NTUiksIENTUl9TVE9QKTsKKwlza2dlX3dyaXRlMzIoaHcsIFJCX0FERFIodHhxYWRkcltwb3J0XSwgUkJfQ1RSTCksCisJCSAgICAgUkJfUlNUX1NFVHxSQl9ESVNfT1BfTUQpOworCisKKwkvKiBEaXNhYmxlIEZvcmNlIFN5bmMgYml0IGFuZCBFbmFibGUgQWxsb2MgYml0ICovCisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWEFfQ1RSTCksCisJCSAgICBUWEFfRElTX0ZTWU5DIHwgVFhBX0RJU19BTExPQyB8IFRYQV9TVE9QX1JDKTsKKworCS8qIFN0b3AgSW50ZXJ2YWwgVGltZXIgYW5kIExpbWl0IENvdW50ZXIgb2YgVHggQXJiaXRlciAqLworCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIFRYQV9JVElfSU5JKSwgMEwpOworCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIFRYQV9MSU1fSU5JKSwgMEwpOworCisJLyogUmVzZXQgUENJIEZJRk8gKi8KKwlza2dlX3dyaXRlMzIoaHcsIFFfQUREUih0eHFhZGRyW3BvcnRdLCBRX0NTUiksIENTUl9TRVRfUkVTRVQpOworCXNrZ2Vfd3JpdGUzMihodywgUkJfQUREUih0eHFhZGRyW3BvcnRdLCBSQl9DVFJMKSwgUkJfUlNUX1NFVCk7CisKKwkvKiBSZXNldCB0aGUgUkFNIEJ1ZmZlciBhc3luYyBUeCBxdWV1ZSAqLworCXNrZ2Vfd3JpdGU4KGh3LCBSQl9BRERSKHBvcnQgPT0gMCA/IFFfWEExIDogUV9YQTIsIFJCX0NUUkwpLCBSQl9SU1RfU0VUKTsKKworCXNrZ2Vfcnhfc3RvcChodywgcG9ydCk7CisKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX1JTVF9TRVQpOworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9SU1RfU0VUKTsKKwl9IGVsc2UgeworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9DVFJMX1QpLCBHTUZfUlNUX1NFVCk7CisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksIEdNRl9SU1RfU0VUKTsKKwl9CisKKwlza2dlX2xlZChza2dlLCBMRURfTU9ERV9PRkYpOworCisJc2tnZV90eF9jbGVhbihkZXYpOworCisJc2tnZV9yeF9jbGVhbihza2dlKTsKKworCXNrZ2VfZnJlZShkZXYpOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2tnZV90eF9hdmFpbChjb25zdCBzdHJ1Y3Qgc2tnZV9yaW5nICpyaW5nKQoreworCW1iKCk7CisJcmV0dXJuICgocmluZy0+dG9fY2xlYW4gPiByaW5nLT50b191c2UpID8gMCA6IE5VTV9UWF9ERVNDKQorCQkrIChyaW5nLT50b19jbGVhbiAtIHJpbmctPnRvX3VzZSkgLSAxOworfQorCitzdGF0aWMgaW50IHNrZ2VfeG1pdF9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IpCit7CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CisJc3RydWN0IHNrZ2VfZWxlbWVudCAqZTsKKwlzdHJ1Y3Qgc2tnZV90eF9kZXNjICp0ZDsKKwl1MzIgY29udHJvbCwgbGVuOworCXU2NCBtYXA7CisKKwlpZiAoc2tnZV90eF9hdmFpbCgmc2tnZS0+dHhfcmluZykgPCAxKQorCQlyZXR1cm4gLUVCVVNZOworCisJZSA9IHNrZ2UtPnR4X3JpbmcudG9fdXNlOworCXRkID0gZS0+ZGVzYzsKKwlhc3NlcnQoISh0ZC0+Y29udHJvbCAmIEJNVV9PV04pKTsKKwllLT5pb2IgPSBpb2I7CisJbGVuID0gaW9iX2xlbihpb2IpOworCW1hcCA9IHZpcnRfdG9fYnVzKGlvYi0+ZGF0YSk7CisKKwl0ZC0+ZG1hX2xvID0gbWFwOworCXRkLT5kbWFfaGkgPSBtYXAgPj4gMzI7CisKKwljb250cm9sID0gQk1VX0NIRUNLOworCisJY29udHJvbCB8PSBCTVVfRU9GfCBCTVVfSVJRX0VPRjsKKwkvKiBNYWtlIHN1cmUgYWxsIHRoZSBkZXNjcmlwdG9ycyB3cml0dGVuICovCisJd21iKCk7CisJdGQtPmNvbnRyb2wgPSBCTVVfT1dOIHwgQk1VX1NXIHwgQk1VX1NURiB8IGNvbnRyb2wgfCBsZW47CisJd21iKCk7CisKKwlza2dlX3dyaXRlOChodywgUV9BRERSKHR4cWFkZHJbc2tnZS0+cG9ydF0sIFFfQ1NSKSwgQ1NSX1NUQVJUKTsKKworCURCR0lPKFBGWCAiJXM6IHR4IHF1ZXVlZCwgc2xvdCAldGQsIGxlbiAlZFxuIiwKKwkgICAgIGRldi0+bmFtZSwgZSAtIHNrZ2UtPnR4X3Jpbmcuc3RhcnQsICh1bnNpZ25lZCBpbnQpbGVuKTsKKworCXNrZ2UtPnR4X3JpbmcudG9fdXNlID0gZS0+bmV4dDsKKwl3bWIoKTsKKworCWlmIChza2dlX3R4X2F2YWlsKCZza2dlLT50eF9yaW5nKSA8PSAxKSB7CisJCURCRyhQRlggIiVzOiB0cmFuc21pdCBxdWV1ZSBmdWxsXG4iLCBkZXYtPm5hbWUpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBGcmVlIGFsbCBidWZmZXJzIGluIHRyYW5zbWl0IHJpbmcgKi8KK3N0YXRpYyB2b2lkIHNrZ2VfdHhfY2xlYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplOworCisJZm9yIChlID0gc2tnZS0+dHhfcmluZy50b19jbGVhbjsgZSAhPSBza2dlLT50eF9yaW5nLnRvX3VzZTsgZSA9IGUtPm5leHQpIHsKKwkJc3RydWN0IHNrZ2VfdHhfZGVzYyAqdGQgPSBlLT5kZXNjOworCQl0ZC0+Y29udHJvbCA9IDA7CisJfQorCisJc2tnZS0+dHhfcmluZy50b19jbGVhbiA9IGU7Cit9CisKK3N0YXRpYyBjb25zdCB1OCBwYXVzZV9tY19hZGRyW0VUSF9BTEVOXSA9IHsgMHgxLCAweDgwLCAweGMyLCAweDAsIDB4MCwgMHgxIH07CisKK3N0YXRpYyBpbmxpbmUgdTE2IHBoeV9sZW5ndGgoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCB1MzIgc3RhdHVzKQoreworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCXJldHVybiBzdGF0dXMgPj4gWE1SX0ZTX0xFTl9TSElGVDsKKwllbHNlCisJCXJldHVybiBzdGF0dXMgPj4gR01SX0ZTX0xFTl9TSElGVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmFkX3BoeV9zdGF0dXMoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCB1MzIgc3RhdHVzKQoreworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCXJldHVybiAoc3RhdHVzICYgKFhNUl9GU19FUlIgfCBYTVJfRlNfMkxfVkxBTikpICE9IDA7CisJZWxzZQorCQlyZXR1cm4gKHN0YXR1cyAmIEdNUl9GU19BTllfRVJSKSB8fAorCQkJKHN0YXR1cyAmIEdNUl9GU19SWF9PSykgPT0gMDsKK30KKworLyogRnJlZSBhbGwgYnVmZmVycyBpbiBUeCByaW5nIHdoaWNoIGFyZSBubyBsb25nZXIgb3duZWQgYnkgZGV2aWNlICovCitzdGF0aWMgdm9pZCBza2dlX3R4X2RvbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tnZV9yaW5nICpyaW5nID0gJnNrZ2UtPnR4X3Jpbmc7CisJc3RydWN0IHNrZ2VfZWxlbWVudCAqZTsKKworCXNrZ2Vfd3JpdGU4KHNrZ2UtPmh3LCBRX0FERFIodHhxYWRkcltza2dlLT5wb3J0XSwgUV9DU1IpLCBDU1JfSVJRX0NMX0YpOworCisJZm9yIChlID0gcmluZy0+dG9fY2xlYW47IGUgIT0gcmluZy0+dG9fdXNlOyBlID0gZS0+bmV4dCkgeworCQl1MzIgY29udHJvbCA9ICgoY29uc3Qgc3RydWN0IHNrZ2VfdHhfZGVzYyAqKSBlLT5kZXNjKS0+Y29udHJvbDsKKworCQlpZiAoY29udHJvbCAmIEJNVV9PV04pCisJCQlicmVhazsKKworCQluZXRkZXZfdHhfY29tcGxldGUoZGV2LCBlLT5pb2IpOworCX0KKwlza2dlLT50eF9yaW5nLnRvX2NsZWFuID0gZTsKKworCS8qIENhbiBydW4gbG9ja2xlc3MgdW50aWwgd2UgbmVlZCB0byBzeW5jaHJvbml6ZSB0byByZXN0YXJ0IHF1ZXVlLiAqLworCW1iKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNrZ2VfcnhfcmVmaWxsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrZ2VfcmluZyAqcmluZyA9ICZza2dlLT5yeF9yaW5nOworCXN0cnVjdCBza2dlX2VsZW1lbnQgKmU7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iOworCXN0cnVjdCBza2dlX3J4X2Rlc2MgKnJkOworCXUzMiBjb250cm9sOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKyspIHsKKwkJZSA9IHJpbmctPnRvX2NsZWFuOworCQlyZCA9IGUtPmRlc2M7CisJCWlvYiA9IGUtPmlvYjsKKwkJY29udHJvbCA9IHJkLT5jb250cm9sOworCisJCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCQlpZiAoaW9iIHx8IChjb250cm9sICYgQk1VX09XTikpCisJCQljb250aW51ZTsKKworCQlEQkcyKCJyZWZpbGxpbmcgcnggZGVzYyAlZDogIiwgKHJpbmctPnRvX2NsZWFuIC0gcmluZy0+c3RhcnQpKTsKKworCQlpb2IgPSBhbGxvY19pb2IoUlhfQlVGX1NJWkUpOworCQlpZiAoaW9iKSB7CisJCQlza2dlX3J4X3NldHVwKHNrZ2UsIGUsIGlvYiwgUlhfQlVGX1NJWkUpOworCQl9IGVsc2UgeworCQkJREJHKCJkZXNjciAlZDogYWxsb2NfaW9iKCkgZmFpbGVkXG4iLAorCQkJICAgICAocmluZy0+dG9fY2xlYW4gLSByaW5nLT5zdGFydCkpOworCQkJLyogV2UgcGFzcyB0aGUgZGVzY3JpcHRvciB0byB0aGUgTklDIGV2ZW4gaWYgdGhlCisJCQkgKiBhbGxvY2F0aW9uIGZhaWxlZC4gVGhlIGNhcmQgd2lsbCBzdG9wIGFzIHNvb24gYXMgaXQKKwkJCSAqIGVuY291bnRlcnMgYSBkZXNjcmlwdG9yIHdpdGggdGhlIE9XTiBiaXQgc2V0IHRvIDAsCisJCQkgKiB0aHVzIG5ldmVyIGdldHRpbmcgdG8gdGhlIG5leHQgZGVzY3JpcHRvciB0aGF0IG1pZ2h0CisJCQkgKiBjb250YWluIGEgdmFsaWQgaW9fYnVmZmVyLiBUaGlzIHdvdWxkIGVmZmVjdGl2ZWx5CisJCQkgKiBzdGFsbCB0aGUgcmVjZWl2ZS4KKwkJCSAqLworCQkJc2tnZV9yeF9zZXR1cChza2dlLCBlLCBOVUxMLCAwKTsKKwkJfQorCisJCXJpbmctPnRvX2NsZWFuID0gZS0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNrZ2VfcnhfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza2dlX3JpbmcgKnJpbmcgPSAmc2tnZS0+cnhfcmluZzsKKwlzdHJ1Y3Qgc2tnZV9yeF9kZXNjICpyZDsKKwlzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplOworCXN0cnVjdCBpb19idWZmZXIgKmlvYjsKKwl1MzIgY29udHJvbDsKKwl1MTYgbGVuOworCWludCBpOworCisJZSA9IHJpbmctPnRvX2NsZWFuOworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7CisJCWlvYiA9IGUtPmlvYjsKKwkJcmQgPSBlLT5kZXNjOworCisJCXJtYigpOworCQljb250cm9sID0gcmQtPmNvbnRyb2w7CisKKwkJaWYgKChjb250cm9sICYgQk1VX09XTikpCisJCQlicmVhazsKKworCQlpZiAoIWlvYikKKwkJCWNvbnRpbnVlOworCisJCWxlbiA9IGNvbnRyb2wgJiBCTVVfQkJDOworCisJCS8qIGNhdGNoIFJYIGVycm9ycyAqLworCQlpZiAoKGJhZF9waHlfc3RhdHVzKHNrZ2UtPmh3LCByZC0+c3RhdHVzKSkgfHwKKwkJICAgKHBoeV9sZW5ndGgoc2tnZS0+aHcsIHJkLT5zdGF0dXMpICE9IGxlbikpIHsKKwkJCS8qIHJlcG9ydCByZWNlaXZlIGVycm9ycyAqLworCQkJREJHKCJyeCBlcnJvclxuIik7CisJCQluZXRkZXZfcnhfZXJyKGRldiwgaW9iLCAtRUlPKTsKKwkJfSBlbHNlIHsKKwkJCURCRzIoInJlY2VpdmVkIHBhY2tldCwgbGVuICVkXG4iLCBsZW4pOworCQkJaW9iX3B1dChpb2IsIGxlbik7CisJCQluZXRkZXZfcngoZGV2LCBpb2IpOworCQl9CisKKwkJLyogaW9fYnVmZmVyIHBhc3NlZCB0byBjb3JlLCBtYWtlIHN1cmUgd2UgZG9uJ3QgcmV1c2UgaXQgKi8KKwkJZS0+aW9iID0gTlVMTDsKKworCQllID0gZS0+bmV4dDsKKwl9CisJc2tnZV9yeF9yZWZpbGwoZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2tnZV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CisJdTMyIHN0YXR1czsKKworCS8qIHJlYWRpbmcgdGhpcyByZWdpc3RlciBBQ0tzIGludGVycnVwdHMgKi8KKwlzdGF0dXMgPSBza2dlX3JlYWQzMihodywgQjBfU1BfSVNSQyk7CisKKwkvKiBMaW5rIGV2ZW50PyAqLworCWlmIChzdGF0dXMgJiBJU19FWFRfUkVHKSB7CisJCXNrZ2VfcGh5aXJxKGh3KTsKKwkJaWYgKHNrZ2UtPnVzZV94bV9saW5rX3RpbWVyKQorCQkJeG1fbGlua190aW1lcihza2dlKTsKKwl9CisKKwlza2dlX3R4X2RvbmUoZGV2KTsKKworCXNrZ2Vfd3JpdGU4KGh3LCBRX0FERFIocnhxYWRkcltza2dlLT5wb3J0XSwgUV9DU1IpLCBDU1JfSVJRX0NMX0YpOworCisJc2tnZV9yeF9kb25lKGRldik7CisKKwkvKiByZXN0YXJ0IHJlY2VpdmVyICovCisJd21iKCk7CisJc2tnZV93cml0ZTgoaHcsIFFfQUREUihyeHFhZGRyW3NrZ2UtPnBvcnRdLCBRX0NTUiksIENTUl9TVEFSVCk7CisKKwlza2dlX3JlYWQzMihodywgQjBfSU1TSyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNrZ2VfcGh5aXJxKHN0cnVjdCBza2dlX2h3ICpodykKK3sKKwlpbnQgcG9ydDsKKworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBody0+cG9ydHM7IHBvcnQrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltwb3J0XTsKKwkJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisKKwkJaWYgKGh3LT5jaGlwX2lkICE9IENISVBfSURfR0VORVNJUykKKwkJCXl1a29uX3BoeV9pbnRyKHNrZ2UpOworCQllbHNlIGlmIChody0+cGh5X3R5cGUgPT0gU0tfUEhZX0JDT00pCisJCQliY29tX3BoeV9pbnRyKHNrZ2UpOworCX0KKworCWh3LT5pbnRyX21hc2sgfD0gSVNfRVhUX1JFRzsKKwlza2dlX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGh3LT5pbnRyX21hc2spOworCXNrZ2VfcmVhZDMyKGh3LCBCMF9JTVNLKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTggaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKK30gc2tnZV9jaGlwc1tdID0geworCXsgQ0hJUF9JRF9HRU5FU0lTLAkiR2VuZXNpcyIgfSwKKwl7IENISVBfSURfWVVLT04sCSAiWXVrb24iIH0sCisJeyBDSElQX0lEX1lVS09OX0xJVEUsCSAiWXVrb24tTGl0ZSJ9LAorCXsgQ0hJUF9JRF9ZVUtPTl9MUCwJICJZdWtvbi1MUCJ9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnNrZ2VfYm9hcmRfbmFtZShjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RhdGljIGNoYXIgYnVmWzE2XTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNrZ2VfY2hpcHMpOyBpKyspCisJCWlmIChza2dlX2NoaXBzW2ldLmlkID09IGh3LT5jaGlwX2lkKQorCQkJcmV0dXJuIHNrZ2VfY2hpcHNbaV0ubmFtZTsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgImNoaXBpZCAweCV4IiwgaHctPmNoaXBfaWQpOworCXJldHVybiBidWY7Cit9CisKKworLyoKKyAqIFNldHVwIHRoZSBib2FyZCBkYXRhIHN0cnVjdHVyZSwgYnV0IGRvbid0IGJyaW5nIHVwCisgKiB0aGUgcG9ydChzKQorICovCitzdGF0aWMgaW50IHNrZ2VfcmVzZXQoc3RydWN0IHNrZ2VfaHcgKmh3KQoreworCXUzMiByZWc7CisJdTE2IGN0c3QsIHBjaV9zdGF0dXM7CisJdTggdDgsIG1hY19jZmcsIHBtZF90eXBlOworCWludCBpOworCisJY3RzdCA9IHNrZ2VfcmVhZDE2KGh3LCBCMF9DVFNUKTsKKworCS8qIGRvIGEgU1cgcmVzZXQgKi8KKwlza2dlX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfUlNUX1NFVCk7CisJc2tnZV93cml0ZTgoaHcsIEIwX0NUU1QsIENTX1JTVF9DTFIpOworCisJLyogY2xlYXIgUENJIGVycm9ycywgaWYgYW55ICovCisJc2tnZV93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisJc2tnZV93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMiwgMCk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChody0+cGRldiwgUENJX1NUQVRVUywgJnBjaV9zdGF0dXMpOworCXBjaV93cml0ZV9jb25maWdfd29yZChody0+cGRldiwgUENJX1NUQVRVUywKKwkJCSAgICAgIHBjaV9zdGF0dXMgfCBQQ0lfU1RBVFVTX0VSUk9SX0JJVFMpOworCXNrZ2Vfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKKwlza2dlX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfTVJTVF9DTFIpOworCisJLyogcmVzdG9yZSBDTEtfUlVOIGJpdHMgKGZvciBZdWtvbi1MaXRlKSAqLworCXNrZ2Vfd3JpdGUxNihodywgQjBfQ1RTVCwKKwkJICAgICBjdHN0ICYgKENTX0NMS19SVU5fSE9UfENTX0NMS19SVU5fUlNUfENTX0NMS19SVU5fRU5BKSk7CisKKwlody0+Y2hpcF9pZCA9IHNrZ2VfcmVhZDgoaHcsIEIyX0NISVBfSUQpOworCWh3LT5waHlfdHlwZSA9IHNrZ2VfcmVhZDgoaHcsIEIyX0VfMSkgJiAweGY7CisJcG1kX3R5cGUgPSBza2dlX3JlYWQ4KGh3LCBCMl9QTURfVFlQKTsKKwlody0+Y29wcGVyID0gKHBtZF90eXBlID09ICdUJyB8fCBwbWRfdHlwZSA9PSAnMScpOworCisJc3dpdGNoIChody0+Y2hpcF9pZCkgeworCWNhc2UgQ0hJUF9JRF9HRU5FU0lTOgorCQlzd2l0Y2ggKGh3LT5waHlfdHlwZSkgeworCQljYXNlIFNLX1BIWV9YTUFDOgorCQkJaHctPnBoeV9hZGRyID0gUEhZX0FERFJfWE1BQzsKKwkJCWJyZWFrOworCQljYXNlIFNLX1BIWV9CQ09NOgorCQkJaHctPnBoeV9hZGRyID0gUEhZX0FERFJfQkNPTTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHKFBGWCAidW5zdXBwb3J0ZWQgcGh5IHR5cGUgMHgleFxuIiwKKwkJCSAgICAgICBody0+cGh5X3R5cGUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDSElQX0lEX1lVS09OOgorCWNhc2UgQ0hJUF9JRF9ZVUtPTl9MSVRFOgorCWNhc2UgQ0hJUF9JRF9ZVUtPTl9MUDoKKwkJaWYgKGh3LT5waHlfdHlwZSA8IFNLX1BIWV9NQVJWX0NPUFBFUiAmJiBwbWRfdHlwZSAhPSAnUycpCisJCQlody0+Y29wcGVyID0gMTsKKworCQlody0+cGh5X2FkZHIgPSBQSFlfQUREUl9NQVJWOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURCRyhQRlggInVuc3VwcG9ydGVkIGNoaXAgdHlwZSAweCV4XG4iLAorCQkgICAgICAgaHctPmNoaXBfaWQpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJbWFjX2NmZyA9IHNrZ2VfcmVhZDgoaHcsIEIyX01BQ19DRkcpOworCWh3LT5wb3J0cyA9IChtYWNfY2ZnICYgQ0ZHX1NOR19NQUMpID8gMSA6IDI7CisJaHctPmNoaXBfcmV2ID0gKG1hY19jZmcgJiBDRkdfQ0hJUF9SX01TSykgPj4gNDsKKworCS8qIHJlYWQgdGhlIGFkYXB0ZXJzIFJBTSBzaXplICovCisJdDggPSBza2dlX3JlYWQ4KGh3LCBCMl9FXzApOworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKwkJaWYgKHQ4ID09IDMpIHsKKwkJCS8qIHNwZWNpYWwgY2FzZTogNCB4IDY0ayB4IDM2LCBvZmZzZXQgPSAweDgwMDAwICovCisJCQlody0+cmFtX3NpemUgPSAweDEwMDAwMDsKKwkJCWh3LT5yYW1fb2Zmc2V0ID0gMHg4MDAwMDsKKwkJfSBlbHNlCisJCQlody0+cmFtX3NpemUgPSB0OCAqIDUxMjsKKwl9CisJZWxzZSBpZiAodDggPT0gMCkKKwkJaHctPnJhbV9zaXplID0gMHgyMDAwMDsKKwllbHNlCisJCWh3LT5yYW1fc2l6ZSA9IHQ4ICogNDA5NjsKKworCWh3LT5pbnRyX21hc2sgPSBJU19IV19FUlI7CisKKwkvKiBVc2UgUEhZIElSUSBmb3IgYWxsIGJ1dCBmaWJlciBiYXNlZCBHZW5lc2lzIGJvYXJkICovCisJaWYgKCEoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTICYmIGh3LT5waHlfdHlwZSA9PSBTS19QSFlfWE1BQykpCisJCWh3LT5pbnRyX21hc2sgfD0gSVNfRVhUX1JFRzsKKworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCWdlbmVzaXNfaW5pdChodyk7CisJZWxzZSB7CisJCS8qIHN3aXRjaCBwb3dlciB0byBWQ0MgKFdBIGZvciBWQVVYIHByb2JsZW0pICovCisJCXNrZ2Vfd3JpdGU4KGh3LCBCMF9QT1dFUl9DVFJMLAorCQkJICAgIFBDX1ZBVVhfRU5BIHwgUENfVkNDX0VOQSB8IFBDX1ZBVVhfT0ZGIHwgUENfVkNDX09OKTsKKworCQkvKiBhdm9pZCBib2FyZHMgd2l0aCBzdHVjayBIYXJkd2FyZSBlcnJvciBiaXRzICovCisJCWlmICgoc2tnZV9yZWFkMzIoaHcsIEIwX0lTUkMpICYgSVNfSFdfRVJSKSAmJgorCQkgICAgKHNrZ2VfcmVhZDMyKGh3LCBCMF9IV0VfSVNSQykgJiBJU19JUlFfU0VOU09SKSkgeworCQkJREJHKFBGWCAic3R1Y2sgaGFyZHdhcmUgc2Vuc29yIGJpdFxuIik7CisJCQlody0+aW50cl9tYXNrICY9IH5JU19IV19FUlI7CisJCX0KKworCQkvKiBDbGVhciBQSFkgQ09NQSAqLworCQlza2dlX3dyaXRlOChodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGh3LT5wZGV2LCBQQ0lfREVWX1JFRzEsICZyZWcpOworCQlyZWcgJj0gflBDSV9QSFlfQ09NQTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChody0+cGRldiwgUENJX0RFVl9SRUcxLCByZWcpOworCQlza2dlX3dyaXRlOChodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CisKKworCQlmb3IgKGkgPSAwOyBpIDwgaHctPnBvcnRzOyBpKyspIHsKKwkJCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKGksIEdNQUNfTElOS19DVFJMKSwgR01MQ19SU1RfU0VUKTsKKwkJCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKGksIEdNQUNfTElOS19DVFJMKSwgR01MQ19SU1RfQ0xSKTsKKwkJfQorCX0KKworCS8qIHR1cm4gb2ZmIGhhcmR3YXJlIHRpbWVyICh1bnVzZWQpICovCisJc2tnZV93cml0ZTgoaHcsIEIyX1RJX0NUUkwsIFRJTV9TVE9QKTsKKwlza2dlX3dyaXRlOChodywgQjJfVElfQ1RSTCwgVElNX0NMUl9JUlEpOworCXNrZ2Vfd3JpdGU4KGh3LCBCMF9MRUQsIExFRF9TVEFUX09OKTsKKworCS8qIGVuYWJsZSB0aGUgVHggQXJiaXRlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaHctPnBvcnRzOyBpKyspCisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcoaSwgVFhBX0NUUkwpLCBUWEFfRU5BX0FSQik7CisKKwkvKiBJbml0aWFsaXplIHJhbSBpbnRlcmZhY2UgKi8KKwlza2dlX3dyaXRlMTYoaHcsIEIzX1JJX0NUUkwsIFJJX1JTVF9DTFIpOworCisJc2tnZV93cml0ZTgoaHcsIEIzX1JJX1dUT19SMSwgU0tfUklfVE9fNTMpOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19SSV9XVE9fWEExLCBTS19SSV9UT181Myk7CisJc2tnZV93cml0ZTgoaHcsIEIzX1JJX1dUT19YUzEsIFNLX1JJX1RPXzUzKTsKKwlza2dlX3dyaXRlOChodywgQjNfUklfUlRPX1IxLCBTS19SSV9UT181Myk7CisJc2tnZV93cml0ZTgoaHcsIEIzX1JJX1JUT19YQTEsIFNLX1JJX1RPXzUzKTsKKwlza2dlX3dyaXRlOChodywgQjNfUklfUlRPX1hTMSwgU0tfUklfVE9fNTMpOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19SSV9XVE9fUjIsIFNLX1JJX1RPXzUzKTsKKwlza2dlX3dyaXRlOChodywgQjNfUklfV1RPX1hBMiwgU0tfUklfVE9fNTMpOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19SSV9XVE9fWFMyLCBTS19SSV9UT181Myk7CisJc2tnZV93cml0ZTgoaHcsIEIzX1JJX1JUT19SMiwgU0tfUklfVE9fNTMpOworCXNrZ2Vfd3JpdGU4KGh3LCBCM19SSV9SVE9fWEEyLCBTS19SSV9UT181Myk7CisJc2tnZV93cml0ZTgoaHcsIEIzX1JJX1JUT19YUzIsIFNLX1JJX1RPXzUzKTsKKworCXNrZ2Vfd3JpdGUzMihodywgQjBfSFdFX0lNU0ssIElTX0VSUl9NU0spOworCisJLyogU2V0IGludGVycnVwdCBtb2RlcmF0aW9uIGZvciBUcmFuc21pdCBvbmx5CisJICogUmVjZWl2ZSBpbnRlcnJ1cHRzIGF2b2lkZWQgYnkgTkFQSQorCSAqLworCXNrZ2Vfd3JpdGUzMihodywgQjJfSVJRTV9NU0ssIElTX1hBMV9GfElTX1hBMl9GKTsKKwlza2dlX3dyaXRlMzIoaHcsIEIyX0lSUU1fSU5JLCBza2dlX3VzZWNzMmNsayhodywgMTAwKSk7CisJc2tnZV93cml0ZTMyKGh3LCBCMl9JUlFNX0NUUkwsIFRJTV9TVEFSVCk7CisKKwlza2dlX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGh3LT5pbnRyX21hc2spOworCisJZm9yIChpID0gMDsgaSA8IGh3LT5wb3J0czsgaSsrKSB7CisJCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCQlnZW5lc2lzX3Jlc2V0KGh3LCBpKTsKKwkJZWxzZQorCQkJeXVrb25fcmVzZXQoaHcsIGkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXplIG5ldHdvcmsgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnNrZ2VfZGV2aW5pdChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LAorCQkJCSAgICAgICBpbnQgaGlnaG1lbSBfX3VudXNlZCkKK3sKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnNrZ2UpKTsKKworCWlmICghZGV2KSB7CisJCURCRyhQRlggImV0aGVyZGV2IGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRldi0+ZGV2ID0gJmh3LT5wZGV2LT5kZXY7CisKKwlza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlza2dlLT5uZXRkZXYgPSBkZXY7CisJc2tnZS0+aHcgPSBodzsKKworCS8qIEF1dG8gc3BlZWQgYW5kIGZsb3cgY29udHJvbCAqLworCXNrZ2UtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfU1lNX09SX1JFTTsKKwlza2dlLT5kdXBsZXggPSAtMTsKKwlza2dlLT5zcGVlZCA9IC0xOworCXNrZ2UtPmFkdmVydGlzaW5nID0gc2tnZV9zdXBwb3J0ZWRfbW9kZXMoaHcpOworCisJaHctPmRldltwb3J0XSA9IGRldjsKKworCXNrZ2UtPnBvcnQgPSBwb3J0OworCisJLyogcmVhZCB0aGUgbWFjIGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5od19hZGRyLCAodm9pZCAqKSAoaHctPnJlZ3MgKyBCMl9NQUNfMSArIHBvcnQqOCksIEVUSF9BTEVOKTsKKworCS8qIGRldmljZSBpcyBvZmYgdW50aWwgbGluayBkZXRlY3Rpb24gKi8KKwluZXRkZXZfbGlua19kb3duKGRldik7CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgdm9pZCBza2dlX3Nob3dfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCURCRzIoUEZYICIlczogYWRkciAlc1xuIiwKKwkgICAgIGRldi0+bmFtZSwgbmV0ZGV2X2FkZHIoZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgc2tnZV9wcm9iZShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50IF9fdW51c2VkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICpkZXYxOworCXN0cnVjdCBza2dlX2h3ICpodzsKKwlpbnQgZXJyLCB1c2luZ19kYWMgPSAwOworCisJYWRqdXN0X3BjaV9kZXZpY2UocGRldik7CisKKwllcnIgPSAtRU5PTUVNOworCWh3ID0gemFsbG9jKHNpemVvZigqaHcpKTsKKwlpZiAoIWh3KSB7CisJCURCRyhQRlggImNhbm5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBzdHJ1Y3RcbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOworCX0KKworCWh3LT5wZGV2ID0gcGRldjsKKworCWh3LT5yZWdzID0gKHUzMilpb3JlbWFwKHBjaV9iYXJfc3RhcnQocGRldiwgUENJX0JBU0VfQUREUkVTU18wKSwKKwkJCQlTS0dFX1JFR19TSVpFKTsKKwlpZiAoIWh3LT5yZWdzKSB7CisJCURCRyhQRlggImNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX2h3OworCX0KKworCWVyciA9IHNrZ2VfcmVzZXQoaHcpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCisJREJHKFBGWCAiIGFkZHIgMHglbGx4IGlycSAlZCBjaGlwICVzIHJldiAlZFxuIiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwZGV2LT5pb2FkZHIsIHBkZXYtPmlycSwKKwkgICAgc2tnZV9ib2FyZF9uYW1lKGh3KSwgaHctPmNoaXBfcmV2KTsKKworCWRldiA9IHNrZ2VfZGV2aW5pdChodywgMCwgdXNpbmdfZGFjKTsKKwlpZiAoIWRldikKKwkJZ290byBlcnJfb3V0X2xlZF9vZmY7CisKKwluZXRkZXZfaW5pdCAoIGRldiwgJnNrZ2Vfb3BlcmF0aW9ucyApOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlEQkcoUEZYICJjYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZVxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisKKwlza2dlX3Nob3dfYWRkcihkZXYpOworCisJaWYgKGh3LT5wb3J0cyA+IDEgJiYgKGRldjEgPSBza2dlX2RldmluaXQoaHcsIDEsIHVzaW5nX2RhYykpKSB7CisJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2MSkgPT0gMCkKKwkJCXNrZ2Vfc2hvd19hZGRyKGRldjEpOworCQllbHNlIHsKKwkJCS8qIEZhaWx1cmUgdG8gcmVnaXN0ZXIgc2Vjb25kIHBvcnQgbmVlZCBub3QgYmUgZmF0YWwgKi8KKwkJCURCRyhQRlggInJlZ2lzdGVyIG9mIHNlY29uZCBwb3J0IGZhaWxlZFxuIik7CisJCQlody0+ZGV2WzFdID0gTlVMTDsKKwkJCW5ldGRldl9udWxsaWZ5KGRldjEpOworCQkJbmV0ZGV2X3B1dChkZXYxKTsKKwkJfQorCX0KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaHcpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJbmV0ZGV2X251bGxpZnkoZGV2KTsKKwluZXRkZXZfcHV0KGRldik7CitlcnJfb3V0X2xlZF9vZmY6CisJc2tnZV93cml0ZTE2KGh3LCBCMF9MRUQsIExFRF9TVEFUX09GRik7CitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcCgodm9pZCopaHctPnJlZ3MpOworZXJyX291dF9mcmVlX2h3OgorCWZyZWUoaHcpOworZXJyX291dF9mcmVlX3JlZ2lvbnM6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHNrZ2VfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBza2dlX2h3ICpodyAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjAsICpkZXYxOworCisJaWYgKCFodykKKwkJcmV0dXJuOworCisJaWYgKChkZXYxID0gaHctPmRldlsxXSkpCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldjEpOworCWRldjAgPSBody0+ZGV2WzBdOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldjApOworCisJaHctPmludHJfbWFzayA9IDA7CisJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCAwKTsKKwlza2dlX3JlYWQzMihodywgQjBfSU1TSyk7CisKKwlza2dlX3dyaXRlMTYoaHcsIEIwX0xFRCwgTEVEX1NUQVRfT0ZGKTsKKwlza2dlX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfUlNUX1NFVCk7CisKKwlpZiAoZGV2MSkgeworCQluZXRkZXZfbnVsbGlmeShkZXYxKTsKKwkJbmV0ZGV2X3B1dChkZXYxKTsKKwl9CisJbmV0ZGV2X251bGxpZnkoZGV2MCk7CisJbmV0ZGV2X3B1dChkZXYwKTsKKworCWlvdW5tYXAoKHZvaWQqKWh3LT5yZWdzKTsKKwlmcmVlKGh3KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKy8qCisgKiBFbmFibGUgb3IgZGlzYWJsZSBJUlEgbWFza2luZy4KKyAqCisgKiBAdiBuZXRkZXYJCURldmljZSB0byBjb250cm9sLgorICogQHYgZW5hYmxlCQlaZXJvIHRvIG1hc2sgb2ZmIElSUSwgbm9uLXplcm8gdG8gZW5hYmxlIElSUS4KKyAqCisgKiBUaGlzIGlzIGEgZ1BYRSBOZXR3b3JrIERyaXZlciBBUEkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHNrZ2VfbmV0X2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlbmFibGUgKSB7CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CisKKwlpZiAoZW5hYmxlKQorCQlody0+aW50cl9tYXNrIHw9IHBvcnRtYXNrW3NrZ2UtPnBvcnRdOworCWVsc2UKKwkJaHctPmludHJfbWFzayAmPSB+cG9ydG1hc2tbc2tnZS0+cG9ydF07CisJc2tnZV93cml0ZTMyKGh3LCBCMF9JTVNLLCBody0+aW50cl9tYXNrKTsKK30KKworc3RydWN0IHBjaV9kcml2ZXIgc2tnZV9kcml2ZXIgX19wY2lfZHJpdmVyID0geworCS5pZHMgICAgICA9IHNrZ2VfaWRfdGFibGUsCisJLmlkX2NvdW50ID0gKCBzaXplb2YgKHNrZ2VfaWRfdGFibGUpIC8gc2l6ZW9mIChza2dlX2lkX3RhYmxlWzBdKSApLAorCS5wcm9iZSAgICA9IHNrZ2VfcHJvYmUsCisJLnJlbW92ZSAgID0gc2tnZV9yZW1vdmUKK307CisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NrZ2UuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NrZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YjA4ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc2tnZS5oCkBAIC0wLDAgKzEsMjYyMyBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgbmV3IE1hcnZlbGwgWXVrb24gLyBTeXNLb25uZWN0IGRyaXZlci4KKyAqLworI2lmbmRlZiBfU0tHRV9ICisjZGVmaW5lIF9TS0dFX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKy8qIFBDSSBjb25maWcgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDSV9ERVZfUkVHMQkweDQwCisjZGVmaW5lICBQQ0lfUEhZX0NPTUEJMHg4MDAwMDAwCisjZGVmaW5lICBQQ0lfVklPCTB4MjAwMDAwMAorCisjZGVmaW5lIFBDSV9ERVZfUkVHMgkweDQ0CisjZGVmaW5lICBQQ0lfVlBEX1JPTV9TWgk3TDw8MTQJLyogVlBEIFJPTSBzaXplIDA9MjU2LCAxPTUxMiwgLi4uICovCisjZGVmaW5lICBQQ0lfUkVWX0RFU0MJMTw8MgkvKiBSZXZlcnNlIERlc2NyaXB0b3IgYnl0ZXMgKi8KKworI2RlZmluZSBEUlZfTkFNRQkJInNrZ2UiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMS4xMyIKKyNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIiAiCisKKyNkZWZpbmUgTlVNX1RYX0RFU0MJCTgKKyNkZWZpbmUgTlVNX1JYX0RFU0MJCTgKKworLyogbWRlY2sgdXNlZCBhIDE2IGJ5dGUgYWxpZ25tZW50LCBidXQgZGF0YXNoZWV0IHNheXMgOCBieXRlcyBpcyBzdWZmaWNpZW50ICovCisjZGVmaW5lIFNLR0VfUklOR19BTElHTgkJOAorI2RlZmluZSBSWF9CVUZfU0laRQkJMTUzNgorI2RlZmluZSBQSFlfUkVUUklFUwkgICAgICAgIDEwMDAKKworI2RlZmluZSBUWF9SSU5HX1NJWkUJKCBOVU1fVFhfREVTQyAqIHNpemVvZiAoIHN0cnVjdCBza2dlX3J4X2Rlc2MgKSApCisjZGVmaW5lIFJYX1JJTkdfU0laRQkoIE5VTV9SWF9ERVNDICogc2l6ZW9mICggc3RydWN0IHNrZ2VfdHhfZGVzYyApICkKKyNkZWZpbmUgUklOR19TSVpFCSggVFhfUklOR19TSVpFICsgUlhfUklOR19TSVpFICkKKworI2RlZmluZSBTS0dFX1JFR19TSVpFCTB4NDAwMAorCisjZGVmaW5lIFNLR0VfRUVQUk9NX01BR0lDCTB4OTkzM2FhYmIKKworLyogQWRkZWQgZm9yIGdQWEUgLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGZyb20gZXRodG9vbC5oICovCisjZGVmaW5lIEFVVE9ORUdfRElTQUJMRQkweDAwCisjZGVmaW5lIEFVVE9ORUdfRU5BQkxFCTB4MDEKKworI2RlZmluZSBEVVBMRVhfSEFMRgkweDAwCisjZGVmaW5lIERVUExFWF9GVUxMCTB4MDEKKworI2RlZmluZSBTUEVFRF8xMAkxMAorI2RlZmluZSBTUEVFRF8xMDAJMTAwCisjZGVmaW5lIFNQRUVEXzEwMDAJMTAwMAorCisjZGVmaW5lIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmICAJKDEgPDwgMCkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgIAkoMSA8PCAxKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgCSgxIDw8IDIpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCAJKDEgPDwgMykKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZgkoMSA8PCA0KQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsCSgxIDw8IDUpCisKKyNkZWZpbmUgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiAgCSgxIDw8IDApCisjZGVmaW5lIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgIAkoMSA8PCAxKQorI2RlZmluZSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiAJKDEgPDwgMikKKyNkZWZpbmUgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgCSgxIDw8IDMpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZgkoMSA8PCA0KQorI2RlZmluZSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwJKDEgPDwgNSkKKyNkZWZpbmUgU1VQUE9SVEVEX0F1dG9uZWcJCSgxIDw8IDYpCisjZGVmaW5lIFNVUFBPUlRFRF9UUAkJCSgxIDw8IDcpCisjZGVmaW5lIFNVUFBPUlRFRF9GSUJSRQkJCSgxIDw8IDEwKQorCisvKiBmcm9tIGtlcm5lbC5oICovCisjZGVmaW5lIEFSUkFZX1NJWkUoYXJyKSAoc2l6ZW9mKGFycikgLyBzaXplb2YoKGFycilbMF0pKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFBDSV9TVEFUVVNfRVJST1JfQklUUyAoUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkgfCBcCisJCQkgICAgICAgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SIHwgXAorCQkJICAgICAgIFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVCB8IFwKKwkJCSAgICAgICBQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQgfCBcCisJCQkgICAgICAgUENJX1NUQVRVU19QQVJJVFkpCisKK2VudW0gY3NyX3JlZ3MgeworCUIwX1JBUAk9IDB4MDAwMCwKKwlCMF9DVFNUCT0gMHgwMDA0LAorCUIwX0xFRAk9IDB4MDAwNiwKKwlCMF9QT1dFUl9DVFJMCT0gMHgwMDA3LAorCUIwX0lTUkMJPSAweDAwMDgsCisJQjBfSU1TSwk9IDB4MDAwYywKKwlCMF9IV0VfSVNSQwk9IDB4MDAxMCwKKwlCMF9IV0VfSU1TSwk9IDB4MDAxNCwKKwlCMF9TUF9JU1JDCT0gMHgwMDE4LAorCUIwX1hNMV9JTVNLCT0gMHgwMDIwLAorCUIwX1hNMV9JU1JDCT0gMHgwMDI4LAorCUIwX1hNMV9QSFlfQUREUgk9IDB4MDAzMCwKKwlCMF9YTTFfUEhZX0RBVEEJPSAweDAwMzQsCisJQjBfWE0yX0lNU0sJPSAweDAwNDAsCisJQjBfWE0yX0lTUkMJPSAweDAwNDgsCisJQjBfWE0yX1BIWV9BRERSCT0gMHgwMDUwLAorCUIwX1hNMl9QSFlfREFUQQk9IDB4MDA1NCwKKwlCMF9SMV9DU1IJPSAweDAwNjAsCisJQjBfUjJfQ1NSCT0gMHgwMDY0LAorCUIwX1hTMV9DU1IJPSAweDAwNjgsCisJQjBfWEExX0NTUgk9IDB4MDA2YywKKwlCMF9YUzJfQ1NSCT0gMHgwMDcwLAorCUIwX1hBMl9DU1IJPSAweDAwNzQsCisKKwlCMl9NQUNfMQk9IDB4MDEwMCwKKwlCMl9NQUNfMgk9IDB4MDEwOCwKKwlCMl9NQUNfMwk9IDB4MDExMCwKKwlCMl9DT05OX1RZUAk9IDB4MDExOCwKKwlCMl9QTURfVFlQCT0gMHgwMTE5LAorCUIyX01BQ19DRkcJPSAweDAxMWEsCisJQjJfQ0hJUF9JRAk9IDB4MDExYiwKKwlCMl9FXzAJCT0gMHgwMTFjLAorCUIyX0VfMQkJPSAweDAxMWQsCisJQjJfRV8yCQk9IDB4MDExZSwKKwlCMl9FXzMJCT0gMHgwMTFmLAorCUIyX0ZBUgkJPSAweDAxMjAsCisJQjJfRkRQCQk9IDB4MDEyNCwKKwlCMl9MRF9DVFJMCT0gMHgwMTI4LAorCUIyX0xEX1RFU1QJPSAweDAxMjksCisJQjJfVElfSU5JCT0gMHgwMTMwLAorCUIyX1RJX1ZBTAk9IDB4MDEzNCwKKwlCMl9USV9DVFJMCT0gMHgwMTM4LAorCUIyX1RJX1RFU1QJPSAweDAxMzksCisJQjJfSVJRTV9JTkkJPSAweDAxNDAsCisJQjJfSVJRTV9WQUwJPSAweDAxNDQsCisJQjJfSVJRTV9DVFJMCT0gMHgwMTQ4LAorCUIyX0lSUU1fVEVTVAk9IDB4MDE0OSwKKwlCMl9JUlFNX01TSwk9IDB4MDE0YywKKwlCMl9JUlFNX0hXRV9NU0sJPSAweDAxNTAsCisJQjJfVFNUX0NUUkwxCT0gMHgwMTU4LAorCUIyX1RTVF9DVFJMMgk9IDB4MDE1OSwKKwlCMl9HUF9JTwk9IDB4MDE1YywKKwlCMl9JMkNfQ1RSTAk9IDB4MDE2MCwKKwlCMl9JMkNfREFUQQk9IDB4MDE2NCwKKwlCMl9JMkNfSVJRCT0gMHgwMTY4LAorCUIyX0kyQ19TVwk9IDB4MDE2YywKKwlCMl9CU0NfSU5JCT0gMHgwMTcwLAorCUIyX0JTQ19WQUwJPSAweDAxNzQsCisJQjJfQlNDX0NUUkwJPSAweDAxNzgsCisJQjJfQlNDX1NUQVQJPSAweDAxNzksCisJQjJfQlNDX1RTVAk9IDB4MDE3YSwKKworCUIzX1JBTV9BRERSCT0gMHgwMTgwLAorCUIzX1JBTV9EQVRBX0xPCT0gMHgwMTg0LAorCUIzX1JBTV9EQVRBX0hJCT0gMHgwMTg4LAorCUIzX1JJX1dUT19SMQk9IDB4MDE5MCwKKwlCM19SSV9XVE9fWEExCT0gMHgwMTkxLAorCUIzX1JJX1dUT19YUzEJPSAweDAxOTIsCisJQjNfUklfUlRPX1IxCT0gMHgwMTkzLAorCUIzX1JJX1JUT19YQTEJPSAweDAxOTQsCisJQjNfUklfUlRPX1hTMQk9IDB4MDE5NSwKKwlCM19SSV9XVE9fUjIJPSAweDAxOTYsCisJQjNfUklfV1RPX1hBMgk9IDB4MDE5NywKKwlCM19SSV9XVE9fWFMyCT0gMHgwMTk4LAorCUIzX1JJX1JUT19SMgk9IDB4MDE5OSwKKwlCM19SSV9SVE9fWEEyCT0gMHgwMTlhLAorCUIzX1JJX1JUT19YUzIJPSAweDAxOWIsCisJQjNfUklfVE9fVkFMCT0gMHgwMTljLAorCUIzX1JJX0NUUkwJPSAweDAxYTAsCisJQjNfUklfVEVTVAk9IDB4MDFhMiwKKwlCM19NQV9UT0lOSV9SWDEJPSAweDAxYjAsCisJQjNfTUFfVE9JTklfUlgyCT0gMHgwMWIxLAorCUIzX01BX1RPSU5JX1RYMQk9IDB4MDFiMiwKKwlCM19NQV9UT0lOSV9UWDIJPSAweDAxYjMsCisJQjNfTUFfVE9WQUxfUlgxCT0gMHgwMWI0LAorCUIzX01BX1RPVkFMX1JYMgk9IDB4MDFiNSwKKwlCM19NQV9UT1ZBTF9UWDEJPSAweDAxYjYsCisJQjNfTUFfVE9WQUxfVFgyCT0gMHgwMWI3LAorCUIzX01BX1RPX0NUUkwJPSAweDAxYjgsCisJQjNfTUFfVE9fVEVTVAk9IDB4MDFiYSwKKwlCM19NQV9SQ0lOSV9SWDEJPSAweDAxYzAsCisJQjNfTUFfUkNJTklfUlgyCT0gMHgwMWMxLAorCUIzX01BX1JDSU5JX1RYMQk9IDB4MDFjMiwKKwlCM19NQV9SQ0lOSV9UWDIJPSAweDAxYzMsCisJQjNfTUFfUkNWQUxfUlgxCT0gMHgwMWM0LAorCUIzX01BX1JDVkFMX1JYMgk9IDB4MDFjNSwKKwlCM19NQV9SQ1ZBTF9UWDEJPSAweDAxYzYsCisJQjNfTUFfUkNWQUxfVFgyCT0gMHgwMWM3LAorCUIzX01BX1JDX0NUUkwJPSAweDAxYzgsCisJQjNfTUFfUkNfVEVTVAk9IDB4MDFjYSwKKwlCM19QQV9UT0lOSV9SWDEJPSAweDAxZDAsCisJQjNfUEFfVE9JTklfUlgyCT0gMHgwMWQ0LAorCUIzX1BBX1RPSU5JX1RYMQk9IDB4MDFkOCwKKwlCM19QQV9UT0lOSV9UWDIJPSAweDAxZGMsCisJQjNfUEFfVE9WQUxfUlgxCT0gMHgwMWUwLAorCUIzX1BBX1RPVkFMX1JYMgk9IDB4MDFlNCwKKwlCM19QQV9UT1ZBTF9UWDEJPSAweDAxZTgsCisJQjNfUEFfVE9WQUxfVFgyCT0gMHgwMWVjLAorCUIzX1BBX0NUUkwJPSAweDAxZjAsCisJQjNfUEFfVEVTVAk9IDB4MDFmMiwKK307CisKKy8qCUIwX0NUU1QJCQkxNiBiaXQJQ29udHJvbC9TdGF0dXMgcmVnaXN0ZXIgKi8KK2VudW0geworCUNTX0NMS19SVU5fSE9UCT0gMTw8MTMsLyogQ0xLX1JVTiBob3QgbS4gKFlVS09OLUxpdGUgb25seSkgKi8KKwlDU19DTEtfUlVOX1JTVAk9IDE8PDEyLC8qIENMS19SVU4gcmVzZXQgIChZVUtPTi1MaXRlIG9ubHkpICovCisJQ1NfQ0xLX1JVTl9FTkEJPSAxPDwxMSwvKiBDTEtfUlVOIGVuYWJsZSAoWVVLT04tTGl0ZSBvbmx5KSAqLworCUNTX1ZBVVhfQVZBSUwJPSAxPDwxMCwvKiBWQVVYIGF2YWlsYWJsZSAoWVVLT04gb25seSkgKi8KKwlDU19CVVNfQ0xPQ0sJPSAxPDw5LAkvKiBCdXMgQ2xvY2sgMC8xID0gMzMvNjYgTUh6ICovCisJQ1NfQlVTX1NMT1RfU1oJPSAxPDw4LAkvKiBTbG90IFNpemUgMC8xID0gMzIvNjQgYml0IHNsb3QgKi8KKwlDU19TVF9TV19JUlEJPSAxPDw3LAkvKiBTZXQgSVJRIFNXIFJlcXVlc3QgKi8KKwlDU19DTF9TV19JUlEJPSAxPDw2LAkvKiBDbGVhciBJUlEgU1cgUmVxdWVzdCAqLworCUNTX1NUT1BfRE9ORQk9IDE8PDUsCS8qIFN0b3AgTWFzdGVyIGlzIGZpbmlzaGVkICovCisJQ1NfU1RPUF9NQVNUCT0gMTw8NCwJLyogQ29tbWFuZCBCaXQgdG8gc3RvcCB0aGUgbWFzdGVyICovCisJQ1NfTVJTVF9DTFIJPSAxPDwzLAkvKiBDbGVhciBNYXN0ZXIgcmVzZXQJKi8KKwlDU19NUlNUX1NFVAk9IDE8PDIsCS8qIFNldCBNYXN0ZXIgcmVzZXQJKi8KKwlDU19SU1RfQ0xSCT0gMTw8MSwJLyogQ2xlYXIgU29mdHdhcmUgcmVzZXQJKi8KKwlDU19SU1RfU0VUCT0gMSwJLyogU2V0ICAgU29mdHdhcmUgcmVzZXQJKi8KKworLyoJQjBfTEVECQkJIDggQml0CUxFRCByZWdpc3RlciAqLworLyogQml0ICA3Li4gMjoJcmVzZXJ2ZWQgKi8KKwlMRURfU1RBVF9PTgk9IDE8PDEsCS8qIFN0YXR1cyBMRUQgb24JKi8KKwlMRURfU1RBVF9PRkYJPSAxLAkJLyogU3RhdHVzIExFRCBvZmYJKi8KKworLyoJQjBfUE9XRVJfQ1RSTAkgOCBCaXQJUG93ZXIgQ29udHJvbCByZWcgKFlVS09OIG9ubHkpICovCisJUENfVkFVWF9FTkEJPSAxPDw3LAkvKiBTd2l0Y2ggVkFVWCBFbmFibGUgICovCisJUENfVkFVWF9ESVMJPSAxPDw2LAkvKiBTd2l0Y2ggVkFVWCBEaXNhYmxlICovCisJUENfVkNDX0VOQQk9IDE8PDUsCS8qIFN3aXRjaCBWQ0MgRW5hYmxlICAqLworCVBDX1ZDQ19ESVMJPSAxPDw0LAkvKiBTd2l0Y2ggVkNDIERpc2FibGUgKi8KKwlQQ19WQVVYX09OCT0gMTw8MywJLyogU3dpdGNoIFZBVVggT24gICovCisJUENfVkFVWF9PRkYJPSAxPDwyLAkvKiBTd2l0Y2ggVkFVWCBPZmYgKi8KKwlQQ19WQ0NfT04JPSAxPDwxLAkvKiBTd2l0Y2ggVkNDIE9uICAqLworCVBDX1ZDQ19PRkYJPSAxPDwwLAkvKiBTd2l0Y2ggVkNDIE9mZiAqLworfTsKKworLyoJQjJfSVJRTV9NU0sgCTMyIGJpdAlJUlEgTW9kZXJhdGlvbiBNYXNrICovCitlbnVtIHsKKwlJU19BTExfTVNLCT0gMHhiZmZmZmZmZnVsLAkvKiBBbGwgSW50ZXJydXB0IGJpdHMgKi8KKwlJU19IV19FUlIJPSAxPDwzMSwJLyogSW50ZXJydXB0IEhXIEVycm9yICovCisJCQkJCS8qIEJpdCAzMDoJcmVzZXJ2ZWQgKi8KKwlJU19QQV9UT19SWDEJPSAxPDwyOSwJLyogUGFja2V0IEFyYiBUaW1lb3V0IFJ4MSAqLworCUlTX1BBX1RPX1JYMgk9IDE8PDI4LAkvKiBQYWNrZXQgQXJiIFRpbWVvdXQgUngyICovCisJSVNfUEFfVE9fVFgxCT0gMTw8MjcsCS8qIFBhY2tldCBBcmIgVGltZW91dCBUeDEgKi8KKwlJU19QQV9UT19UWDIJPSAxPDwyNiwJLyogUGFja2V0IEFyYiBUaW1lb3V0IFR4MiAqLworCUlTX0kyQ19SRUFEWQk9IDE8PDI1LAkvKiBJUlEgb24gZW5kIG9mIEkyQyBUeCAqLworCUlTX0lSUV9TVwk9IDE8PDI0LAkvKiBTVyBmb3JjZWQgSVJRCSovCisJSVNfRVhUX1JFRwk9IDE8PDIzLAkvKiBJUlEgZnJvbSBMTTgwIG9yIFBIWSAoR0VORVNJUyBvbmx5KSAqLworCQkJCQkvKiBJUlEgZnJvbSBQSFkgKFlVS09OIG9ubHkpICovCisJSVNfVElNSU5UCT0gMTw8MjIsCS8qIElSUSBmcm9tIFRpbWVyCSovCisJSVNfTUFDMQkJPSAxPDwyMSwJLyogSVJRIGZyb20gTUFDIDEJKi8KKwlJU19MTktfU1lOQ19NMQk9IDE8PDIwLAkvKiBMaW5rIFN5bmMgQ250IHdyYXAgTUFDIDEgKi8KKwlJU19NQUMyCQk9IDE8PDE5LAkvKiBJUlEgZnJvbSBNQUMgMgkqLworCUlTX0xOS19TWU5DX00yCT0gMTw8MTgsCS8qIExpbmsgU3luYyBDbnQgd3JhcCBNQUMgMiAqLworLyogUmVjZWl2ZSBRdWV1ZSAxICovCisJSVNfUjFfQgkJPSAxPDwxNywJLyogUV9SMSBFbmQgb2YgQnVmZmVyICovCisJSVNfUjFfRgkJPSAxPDwxNiwJLyogUV9SMSBFbmQgb2YgRnJhbWUgKi8KKwlJU19SMV9DCQk9IDE8PDE1LAkvKiBRX1IxIEVuY29kaW5nIEVycm9yICovCisvKiBSZWNlaXZlIFF1ZXVlIDIgKi8KKwlJU19SMl9CCQk9IDE8PDE0LAkvKiBRX1IyIEVuZCBvZiBCdWZmZXIgKi8KKwlJU19SMl9GCQk9IDE8PDEzLAkvKiBRX1IyIEVuZCBvZiBGcmFtZSAqLworCUlTX1IyX0MJCT0gMTw8MTIsCS8qIFFfUjIgRW5jb2RpbmcgRXJyb3IgKi8KKy8qIFN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIDEgKi8KKwlJU19YUzFfQgk9IDE8PDExLAkvKiBRX1hTMSBFbmQgb2YgQnVmZmVyICovCisJSVNfWFMxX0YJPSAxPDwxMCwJLyogUV9YUzEgRW5kIG9mIEZyYW1lICovCisJSVNfWFMxX0MJPSAxPDw5LAkJLyogUV9YUzEgRW5jb2RpbmcgRXJyb3IgKi8KKy8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAxICovCisJSVNfWEExX0IJPSAxPDw4LAkJLyogUV9YQTEgRW5kIG9mIEJ1ZmZlciAqLworCUlTX1hBMV9GCT0gMTw8NywJCS8qIFFfWEExIEVuZCBvZiBGcmFtZSAqLworCUlTX1hBMV9DCT0gMTw8NiwJCS8qIFFfWEExIEVuY29kaW5nIEVycm9yICovCisvKiBTeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAyICovCisJSVNfWFMyX0IJPSAxPDw1LAkJLyogUV9YUzIgRW5kIG9mIEJ1ZmZlciAqLworCUlTX1hTMl9GCT0gMTw8NCwJCS8qIFFfWFMyIEVuZCBvZiBGcmFtZSAqLworCUlTX1hTMl9DCT0gMTw8MywJCS8qIFFfWFMyIEVuY29kaW5nIEVycm9yICovCisvKiBBc3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMiAqLworCUlTX1hBMl9CCT0gMTw8MiwJCS8qIFFfWEEyIEVuZCBvZiBCdWZmZXIgKi8KKwlJU19YQTJfRgk9IDE8PDEsCQkvKiBRX1hBMiBFbmQgb2YgRnJhbWUgKi8KKwlJU19YQTJfQwk9IDE8PDAsCQkvKiBRX1hBMiBFbmNvZGluZyBFcnJvciAqLworCisJSVNfVE9fUE9SVDEJPSBJU19QQV9UT19SWDEgfCBJU19QQV9UT19UWDEsCisJSVNfVE9fUE9SVDIJPSBJU19QQV9UT19SWDIgfCBJU19QQV9UT19UWDIsCisKKwlJU19QT1JUXzEJPSBJU19YQTFfRnwgSVNfUjFfRiB8IElTX1RPX1BPUlQxIHwgSVNfTUFDMSwKKwlJU19QT1JUXzIJPSBJU19YQTJfRnwgSVNfUjJfRiB8IElTX1RPX1BPUlQyIHwgSVNfTUFDMiwKK307CisKKworLyoJQjJfSVJRTV9IV0VfTVNLCTMyIGJpdAlJUlEgTW9kZXJhdGlvbiBIVyBFcnJvciBNYXNrICovCitlbnVtIHsKKwlJU19JUlFfVElTVF9PVgk9IDE8PDEzLCAvKiBUaW1lIFN0YW1wIFRpbWVyIE92ZXJmbG93IChZVUtPTiBvbmx5KSAqLworCUlTX0lSUV9TRU5TT1IJPSAxPDwxMiwgLyogSVJRIGZyb20gU2Vuc29yIChZVUtPTiBvbmx5KSAqLworCUlTX0lSUV9NU1RfRVJSCT0gMTw8MTEsIC8qIElSUSBtYXN0ZXIgZXJyb3IgZGV0ZWN0ZWQgKi8KKwlJU19JUlFfU1RBVAk9IDE8PDEwLCAvKiBJUlEgc3RhdHVzIGV4Y2VwdGlvbiAqLworCUlTX05PX1NUQVRfTTEJPSAxPDw5LAkvKiBObyBSeCBTdGF0dXMgZnJvbSBNQUMgMSAqLworCUlTX05PX1NUQVRfTTIJPSAxPDw4LAkvKiBObyBSeCBTdGF0dXMgZnJvbSBNQUMgMiAqLworCUlTX05PX1RJU1RfTTEJPSAxPDw3LAkvKiBObyBUaW1lIFN0YW1wIGZyb20gTUFDIDEgKi8KKwlJU19OT19USVNUX00yCT0gMTw8NiwJLyogTm8gVGltZSBTdGFtcCBmcm9tIE1BQyAyICovCisJSVNfUkFNX1JEX1BBUgk9IDE8PDUsCS8qIFJBTSBSZWFkICBQYXJpdHkgRXJyb3IgKi8KKwlJU19SQU1fV1JfUEFSCT0gMTw8NCwJLyogUkFNIFdyaXRlIFBhcml0eSBFcnJvciAqLworCUlTX00xX1BBUl9FUlIJPSAxPDwzLAkvKiBNQUMgMSBQYXJpdHkgRXJyb3IgKi8KKwlJU19NMl9QQVJfRVJSCT0gMTw8MiwJLyogTUFDIDIgUGFyaXR5IEVycm9yICovCisJSVNfUjFfUEFSX0VSUgk9IDE8PDEsCS8qIFF1ZXVlIFIxIFBhcml0eSBFcnJvciAqLworCUlTX1IyX1BBUl9FUlIJPSAxPDwwLAkvKiBRdWV1ZSBSMiBQYXJpdHkgRXJyb3IgKi8KKworCUlTX0VSUl9NU0sJPSBJU19JUlFfTVNUX0VSUiB8IElTX0lSUV9TVEFUCisJCQl8IElTX1JBTV9SRF9QQVIgfCBJU19SQU1fV1JfUEFSCisJCQl8IElTX00xX1BBUl9FUlIgfCBJU19NMl9QQVJfRVJSCisJCQl8IElTX1IxX1BBUl9FUlIgfCBJU19SMl9QQVJfRVJSLAorfTsKKworLyoJQjJfVFNUX0NUUkwxCSA4IGJpdAlUZXN0IENvbnRyb2wgUmVnaXN0ZXIgMSAqLworZW51bSB7CisJVFNUX0ZSQ19EUEVSUl9NUiA9IDE8PDcsIC8qIGZvcmNlIERBVEFQRVJSIG9uIE1TVCBSRCAqLworCVRTVF9GUkNfRFBFUlJfTVcgPSAxPDw2LCAvKiBmb3JjZSBEQVRBUEVSUiBvbiBNU1QgV1IgKi8KKwlUU1RfRlJDX0RQRVJSX1RSID0gMTw8NSwgLyogZm9yY2UgREFUQVBFUlIgb24gVFJHIFJEICovCisJVFNUX0ZSQ19EUEVSUl9UVyA9IDE8PDQsIC8qIGZvcmNlIERBVEFQRVJSIG9uIFRSRyBXUiAqLworCVRTVF9GUkNfQVBFUlJfTQkgPSAxPDwzLCAvKiBmb3JjZSBBRERSUEVSUiBvbiBNU1QgKi8KKwlUU1RfRlJDX0FQRVJSX1QJID0gMTw8MiwgLyogZm9yY2UgQUREUlBFUlIgb24gVFJHICovCisJVFNUX0NGR19XUklURV9PTiA9IDE8PDEsIC8qIEVuYWJsZSAgQ29uZmlnIFJlZyBXUiAqLworCVRTVF9DRkdfV1JJVEVfT0ZGPSAxPDwwLCAvKiBEaXNhYmxlIENvbmZpZyBSZWcgV1IgKi8KK307CisKKy8qCUIyX01BQ19DRkcJCSA4IGJpdAlNQUMgQ29uZmlndXJhdGlvbiAvIENoaXAgUmV2aXNpb24gKi8KK2VudW0geworCUNGR19DSElQX1JfTVNLCSAgPSAweGY8PDQsCS8qIEJpdCA3Li4gNDogQ2hpcCBSZXZpc2lvbiAqLworCQkJCQkvKiBCaXQgMy4uIDI6CXJlc2VydmVkICovCisJQ0ZHX0RJU19NMl9DTEsJICA9IDE8PDEsCS8qIERpc2FibGUgQ2xvY2sgZm9yIDJuZCBNQUMgKi8KKwlDRkdfU05HX01BQwkgID0gMTw8MCwJLyogTUFDIENvbmZpZzogMD0yIE1BQ3MgLyAxPTEgTUFDKi8KK307CisKKy8qCUIyX0NISVBfSUQJCSA4IGJpdCAJQ2hpcCBJZGVudGlmaWNhdGlvbiBOdW1iZXIgKi8KK2VudW0geworCUNISVBfSURfR0VORVNJUwkgICA9IDB4MGEsIC8qIENoaXAgSUQgZm9yIEdFTkVTSVMgKi8KKwlDSElQX0lEX1lVS09OCSAgID0gMHhiMCwgLyogQ2hpcCBJRCBmb3IgWVVLT04gKi8KKwlDSElQX0lEX1lVS09OX0xJVEUgPSAweGIxLCAvKiBDaGlwIElEIGZvciBZVUtPTi1MaXRlIChSZXYuIEExLUEzKSAqLworCUNISVBfSURfWVVLT05fTFAgICA9IDB4YjIsIC8qIENoaXAgSUQgZm9yIFlVS09OLUxQICovCisJQ0hJUF9JRF9ZVUtPTl9YTCAgID0gMHhiMywgLyogQ2hpcCBJRCBmb3IgWVVLT04tMiBYTCAqLworCUNISVBfSURfWVVLT05fRUMgICA9IDB4YjYsIC8qIENoaXAgSUQgZm9yIFlVS09OLTIgRUMgKi8KKwlDSElQX0lEX1lVS09OX0ZFICAgPSAweGI3LCAvKiBDaGlwIElEIGZvciBZVUtPTi0yIEZFICovCisKKwlDSElQX1JFVl9ZVV9MSVRFX0ExICA9IDMsCS8qIENoaXAgUmV2LiBmb3IgWVVLT04tTGl0ZSBBMSxBMiAqLworCUNISVBfUkVWX1lVX0xJVEVfQTMgID0gNywJLyogQ2hpcCBSZXYuIGZvciBZVUtPTi1MaXRlIEEzICovCit9OworCisvKglCMl9USV9DVFJMCQkgOCBiaXQJVGltZXIgY29udHJvbCAqLworLyoJQjJfSVJRTV9DVFJMCSA4IGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBDb250cm9sICovCitlbnVtIHsKKwlUSU1fU1RBUlQJPSAxPDwyLAkvKiBTdGFydCBUaW1lciAqLworCVRJTV9TVE9QCT0gMTw8MSwJLyogU3RvcCAgVGltZXIgKi8KKwlUSU1fQ0xSX0lSUQk9IDE8PDAsCS8qIENsZWFyIFRpbWVyIElSUSAoIUlSUU0pICovCit9OworCisvKglCMl9USV9URVNUCQkgOCBCaXQJVGltZXIgVGVzdCAqLworLyoJQjJfSVJRTV9URVNUCSA4IGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBUZXN0ICovCisvKglCMjhfRFBUX1RTVAkJIDggYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBUZXN0IFJlZyAqLworZW51bSB7CisJVElNX1RfT04JPSAxPDwyLAkvKiBUZXN0IG1vZGUgb24gKi8KKwlUSU1fVF9PRkYJPSAxPDwxLAkvKiBUZXN0IG1vZGUgb2ZmICovCisJVElNX1RfU1RFUAk9IDE8PDAsCS8qIFRlc3Qgc3RlcCAqLworfTsKKworLyoJQjJfR1BfSU8JCTMyIGJpdAlHZW5lcmFsIFB1cnBvc2UgSS9PIFJlZ2lzdGVyICovCitlbnVtIHsKKwlHUF9ESVJfOSA9IDE8PDI1LCAvKiBJT185IGRpcmVjdCwgMD1Jbi8xPU91dCAqLworCUdQX0RJUl84ID0gMTw8MjQsIC8qIElPXzggZGlyZWN0LCAwPUluLzE9T3V0ICovCisJR1BfRElSXzcgPSAxPDwyMywgLyogSU9fNyBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKwlHUF9ESVJfNiA9IDE8PDIyLCAvKiBJT182IGRpcmVjdCwgMD1Jbi8xPU91dCAqLworCUdQX0RJUl81ID0gMTw8MjEsIC8qIElPXzUgZGlyZWN0LCAwPUluLzE9T3V0ICovCisJR1BfRElSXzQgPSAxPDwyMCwgLyogSU9fNCBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKwlHUF9ESVJfMyA9IDE8PDE5LCAvKiBJT18zIGRpcmVjdCwgMD1Jbi8xPU91dCAqLworCUdQX0RJUl8yID0gMTw8MTgsIC8qIElPXzIgZGlyZWN0LCAwPUluLzE9T3V0ICovCisJR1BfRElSXzEgPSAxPDwxNywgLyogSU9fMSBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKwlHUF9ESVJfMCA9IDE8PDE2LCAvKiBJT18wIGRpcmVjdCwgMD1Jbi8xPU91dCAqLworCisJR1BfSU9fOQk9IDE8PDksCS8qIElPXzkgcGluICovCisJR1BfSU9fOAk9IDE8PDgsCS8qIElPXzggcGluICovCisJR1BfSU9fNwk9IDE8PDcsCS8qIElPXzcgcGluICovCisJR1BfSU9fNgk9IDE8PDYsCS8qIElPXzYgcGluICovCisJR1BfSU9fNQk9IDE8PDUsCS8qIElPXzUgcGluICovCisJR1BfSU9fNAk9IDE8PDQsCS8qIElPXzQgcGluICovCisJR1BfSU9fMwk9IDE8PDMsCS8qIElPXzMgcGluICovCisJR1BfSU9fMgk9IDE8PDIsCS8qIElPXzIgcGluICovCisJR1BfSU9fMQk9IDE8PDEsCS8qIElPXzEgcGluICovCisJR1BfSU9fMAk9IDE8PDAsCS8qIElPXzAgcGluICovCit9OworCisvKiBEZXNjcmlwdG9yIEJpdCBEZWZpbml0aW9uICovCisvKglUeEN0cmwJCVRyYW5zbWl0IEJ1ZmZlciBDb250cm9sIEZpZWxkICovCisvKglSeEN0cmwJCVJlY2VpdmUgIEJ1ZmZlciBDb250cm9sIEZpZWxkICovCitlbnVtIHsKKwlCTVVfT1dOCQk9IDE8PDMxLCAvKiBPV04gYml0OiAwPWhvc3QvMT1CTVUgKi8KKwlCTVVfU1RGCQk9IDE8PDMwLCAvKiBTdGFydCBvZiBGcmFtZSAqLworCUJNVV9FT0YJCT0gMTw8MjksIC8qIEVuZCBvZiBGcmFtZSAqLworCUJNVV9JUlFfRU9CCT0gMTw8MjgsIC8qIFJlcSAiRW5kIG9mIEJ1ZmZlciIgSVJRICovCisJQk1VX0lSUV9FT0YJPSAxPDwyNywgLyogUmVxICJFbmQgb2YgRnJhbWUiIElSUSAqLworCQkJCS8qIFR4Q3RybCBzcGVjaWZpYyBiaXRzICovCisJQk1VX1NURldECT0gMTw8MjYsIC8qIChUeCkJU3RvcmUgJiBGb3J3YXJkIEZyYW1lICovCisJQk1VX05PX0ZDUwk9IDE8PDI1LCAvKiAoVHgpIERpc2FibGUgTUFDIEZDUyAoQ1JDKSBnZW5lcmF0aW9uICovCisJQk1VX1NXCT0gMTw8MjQsIC8qIChUeCkJMSBiaXQgcmVzLiBmb3IgU1cgdXNlICovCisJCQkJLyogUnhDdHJsIHNwZWNpZmljIGJpdHMgKi8KKwlCTVVfREVWXzAJPSAxPDwyNiwgLyogKFJ4KQlUcmFuc2ZlciBkYXRhIHRvIERldjAgKi8KKwlCTVVfU1RBVF9WQUwJPSAxPDwyNSwgLyogKFJ4KQlSeCBTdGF0dXMgVmFsaWQgKi8KKwlCTVVfVElTVF9WQUwJPSAxPDwyNCwgLyogKFJ4KQlSeCBUaW1lU3RhbXAgVmFsaWQgKi8KKwkJCS8qIEJpdCAyMy4uMTY6CUJNVSBDaGVjayBPcGNvZGVzICovCisJQk1VX0NIRUNLCT0gMHg1NTw8MTYsIC8qIERlZmF1bHQgQk1VIGNoZWNrICovCisJQk1VX1RDUF9DSEVDSwk9IDB4NTY8PDE2LCAvKiBEZXNjciB3aXRoIFRDUCBleHQgKi8KKwlCTVVfVURQX0NIRUNLCT0gMHg1Nzw8MTYsIC8qIERlc2NyIHdpdGggVURQIGV4dCAoWVVLT04gb25seSkgKi8KKwlCTVVfQkJDCQk9IDB4ZmZmZkwsIC8qIEJpdCAxNS4uIDA6CUJ1ZmZlciBCeXRlIENvdW50ZXIgKi8KK307CisKKy8qCUIyX0JTQ19DVFJMCQkgOCBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgQ29udHJvbCAqLworZW51bSB7CisJIEJTQ19TVEFSVAk9IDE8PDEsCS8qIFN0YXJ0IEJsaW5rIFNvdXJjZSBDb3VudGVyICovCisJIEJTQ19TVE9QCT0gMTw8MCwJLyogU3RvcCAgQmxpbmsgU291cmNlIENvdW50ZXIgKi8KK307CisKKy8qCUIyX0JTQ19TVEFUCQkgOCBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgU3RhdHVzICovCitlbnVtIHsKKwlCU0NfU1JDCQk9IDE8PDAsCS8qIEJsaW5rIFNvdXJjZSwgMD1PZmYgLyAxPU9uICovCit9OworCisvKglCMl9CU0NfVFNUCQkxNiBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgVGVzdCBSZWcgKi8KK2VudW0geworCUJTQ19UX09OCT0gMTw8MiwJLyogVGVzdCBtb2RlIG9uICovCisJQlNDX1RfT0ZGCT0gMTw8MSwJLyogVGVzdCBtb2RlIG9mZiAqLworCUJTQ19UX1NURVAJPSAxPDwwLAkvKiBUZXN0IHN0ZXAgKi8KK307CisKKy8qCUIzX1JBTV9BRERSCQkzMiBiaXQJUkFNIEFkZHJlc3MsIHRvIHJlYWQgb3Igd3JpdGUgKi8KKwkJCQkJLyogQml0IDMxLi4xOToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUkFNX0FEUl9SQU4JMHgwMDA3ZmZmZkwJLyogQml0IDE4Li4gMDoJUkFNIEFkZHJlc3MgUmFuZ2UgKi8KKy8qIFJBTSBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCisKKy8qCUIzX1JJX0NUUkwJCTE2IGJpdAlSQU0gSWZhY2UgQ29udHJvbCBSZWdpc3RlciAqLworZW51bSB7CisJUklfQ0xSX1JEX1BFUlIJPSAxPDw5LAkvKiBDbGVhciBJUlEgUkFNIFJlYWQgUGFyaXR5IEVyciAqLworCVJJX0NMUl9XUl9QRVJSCT0gMTw8OCwJLyogQ2xlYXIgSVJRIFJBTSBXcml0ZSBQYXJpdHkgRXJyKi8KKworCVJJX1JTVF9DTFIJPSAxPDwxLAkvKiBDbGVhciBSQU0gSW50ZXJmYWNlIFJlc2V0ICovCisJUklfUlNUX1NFVAk9IDE8PDAsCS8qIFNldCAgIFJBTSBJbnRlcmZhY2UgUmVzZXQgKi8KK307CisKKy8qIE1BQyBBcmJpdGVyIFJlZ2lzdGVycyAqLworLyoJQjNfTUFfVE9fQ1RSTAkxNiBiaXQJTUFDIEFyYml0ZXIgVGltZW91dCBDdHJsIFJlZyAqLworZW51bSB7CisJTUFfRk9FX09OCT0gMTw8MywJLyogWE1BQyBGYXN0IE91dHB1dCBFbmFibGUgT04gKi8KKwlNQV9GT0VfT0ZGCT0gMTw8MiwJLyogWE1BQyBGYXN0IE91dHB1dCBFbmFibGUgT0ZGICovCisJTUFfUlNUX0NMUgk9IDE8PDEsCS8qIENsZWFyIE1BQyBBcmJpdGVyIFJlc2V0ICovCisJTUFfUlNUX1NFVAk9IDE8PDAsCS8qIFNldCAgIE1BQyBBcmJpdGVyIFJlc2V0ICovCisKK307CisKKy8qIFRpbWVvdXQgdmFsdWVzICovCisjZGVmaW5lIFNLX01BQ19UT181Mwk3MgkJLyogTUFDIGFyYml0ZXIgdGltZW91dCAqLworI2RlZmluZSBTS19QS1RfVE9fNTMJMHgyMDAwCQkvKiBQYWNrZXQgYXJiaXRlciB0aW1lb3V0ICovCisjZGVmaW5lIFNLX1BLVF9UT19NQVgJMHhmZmZmCQkvKiBNYXhpbXVtIHZhbHVlICovCisjZGVmaW5lIFNLX1JJX1RPXzUzCTM2CQkvKiBSQU0gaW50ZXJmYWNlIHRpbWVvdXQgKi8KKworLyogUGFja2V0IEFyYml0ZXIgUmVnaXN0ZXJzICovCisvKglCM19QQV9DVFJMCQkxNiBiaXQJUGFja2V0IEFyYml0ZXIgQ3RybCBSZWdpc3RlciAqLworZW51bSB7CisJUEFfQ0xSX1RPX1RYMgk9IDE8PDEzLC8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBUWDIgKi8KKwlQQV9DTFJfVE9fVFgxCT0gMTw8MTIsLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFRYMSAqLworCVBBX0NMUl9UT19SWDIJPSAxPDwxMSwvKiBDbGVhciBJUlEgUGFja2V0IFRpbWVvdXQgUlgyICovCisJUEFfQ0xSX1RPX1JYMQk9IDE8PDEwLC8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBSWDEgKi8KKwlQQV9FTkFfVE9fVFgyCT0gMTw8OSwJLyogRW5hYmxlICBUaW1lb3V0IFRpbWVyIFRYMiAqLworCVBBX0RJU19UT19UWDIJPSAxPDw4LAkvKiBEaXNhYmxlIFRpbWVvdXQgVGltZXIgVFgyICovCisJUEFfRU5BX1RPX1RYMQk9IDE8PDcsCS8qIEVuYWJsZSAgVGltZW91dCBUaW1lciBUWDEgKi8KKwlQQV9ESVNfVE9fVFgxCT0gMTw8NiwJLyogRGlzYWJsZSBUaW1lb3V0IFRpbWVyIFRYMSAqLworCVBBX0VOQV9UT19SWDIJPSAxPDw1LAkvKiBFbmFibGUgIFRpbWVvdXQgVGltZXIgUlgyICovCisJUEFfRElTX1RPX1JYMgk9IDE8PDQsCS8qIERpc2FibGUgVGltZW91dCBUaW1lciBSWDIgKi8KKwlQQV9FTkFfVE9fUlgxCT0gMTw8MywJLyogRW5hYmxlICBUaW1lb3V0IFRpbWVyIFJYMSAqLworCVBBX0RJU19UT19SWDEJPSAxPDwyLAkvKiBEaXNhYmxlIFRpbWVvdXQgVGltZXIgUlgxICovCisJUEFfUlNUX0NMUgk9IDE8PDEsCS8qIENsZWFyIE1BQyBBcmJpdGVyIFJlc2V0ICovCisJUEFfUlNUX1NFVAk9IDE8PDAsCS8qIFNldCAgIE1BQyBBcmJpdGVyIFJlc2V0ICovCit9OworCisjZGVmaW5lIFBBX0VOQV9UT19BTEwJKFBBX0VOQV9UT19SWDEgfCBQQV9FTkFfVE9fUlgyIHxcCisJCQkJCQlQQV9FTkFfVE9fVFgxIHwgUEFfRU5BX1RPX1RYMikKKworCisvKiBUcmFuc21pdCBBcmJpdGVyIFJlZ2lzdGVycyBNQUMgMSBhbmQgMiwgdXNlIFNLX1JFRygpIHRvIGFjY2VzcyAqLworLyoJVFhBX0lUSV9JTkkJCTMyIGJpdAlUeCBBcmIgSW50ZXJ2YWwgVGltZXIgSW5pdCBWYWwgKi8KKy8qCVRYQV9JVElfVkFMCQkzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIFZhbHVlICovCisvKglUWEFfTElNX0lOSQkJMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIEluaXQgVmFsICovCisvKglUWEFfTElNX1ZBTAkJMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIFZhbHVlICovCisKKyNkZWZpbmUgVFhBX01BWF9WQUwJMHgwMGZmZmZmZlVMCS8qIEJpdCAyMy4uIDA6CU1heCBUWEEgVGltZXIvQ250IFZhbCAqLworCisvKglUWEFfQ1RSTAkJIDggYml0CVR4IEFyYml0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworZW51bSB7CisJVFhBX0VOQV9GU1lOQwk9IDE8PDcsCS8qIEVuYWJsZSAgZm9yY2Ugb2Ygc3luYyBUeCBxdWV1ZSAqLworCVRYQV9ESVNfRlNZTkMJPSAxPDw2LAkvKiBEaXNhYmxlIGZvcmNlIG9mIHN5bmMgVHggcXVldWUgKi8KKwlUWEFfRU5BX0FMTE9DCT0gMTw8NSwJLyogRW5hYmxlICBhbGxvYyBvZiBmcmVlIGJhbmR3aWR0aCAqLworCVRYQV9ESVNfQUxMT0MJPSAxPDw0LAkvKiBEaXNhYmxlIGFsbG9jIG9mIGZyZWUgYmFuZHdpZHRoICovCisJVFhBX1NUQVJUX1JDCT0gMTw8MywJLyogU3RhcnQgc3luYyBSYXRlIENvbnRyb2wgKi8KKwlUWEFfU1RPUF9SQwk9IDE8PDIsCS8qIFN0b3AgIHN5bmMgUmF0ZSBDb250cm9sICovCisJVFhBX0VOQV9BUkIJPSAxPDwxLAkvKiBFbmFibGUgIFR4IEFyYml0ZXIgKi8KKwlUWEFfRElTX0FSQgk9IDE8PDAsCS8qIERpc2FibGUgVHggQXJiaXRlciAqLworfTsKKworLyoKKyAqCUJhbmsgNCAtIDUKKyAqLworLyogVHJhbnNtaXQgQXJiaXRlciBSZWdpc3RlcnMgTUFDIDEgYW5kIDIsIHVzZSBTS19SRUcoKSB0byBhY2Nlc3MgKi8KK2VudW0geworCVRYQV9JVElfSU5JCT0gMHgwMjAwLC8qIDMyIGJpdAlUeCBBcmIgSW50ZXJ2YWwgVGltZXIgSW5pdCBWYWwqLworCVRYQV9JVElfVkFMCT0gMHgwMjA0LC8qIDMyIGJpdAlUeCBBcmIgSW50ZXJ2YWwgVGltZXIgVmFsdWUgKi8KKwlUWEFfTElNX0lOSQk9IDB4MDIwOCwvKiAzMiBiaXQJVHggQXJiIExpbWl0IENvdW50ZXIgSW5pdCBWYWwgKi8KKwlUWEFfTElNX1ZBTAk9IDB4MDIwYywvKiAzMiBiaXQJVHggQXJiIExpbWl0IENvdW50ZXIgVmFsdWUgKi8KKwlUWEFfQ1RSTAk9IDB4MDIxMCwvKiAgOCBiaXQJVHggQXJiaXRlciBDb250cm9sIFJlZ2lzdGVyICovCisJVFhBX1RFU1QJPSAweDAyMTEsLyogIDggYml0CVR4IEFyYml0ZXIgVGVzdCBSZWdpc3RlciAqLworCVRYQV9TVEFUCT0gMHgwMjEyLC8qICA4IGJpdAlUeCBBcmJpdGVyIFN0YXR1cyBSZWdpc3RlciAqLworfTsKKworCitlbnVtIHsKKwlCNl9FWFRfUkVHCT0gMHgwMzAwLC8qIEV4dGVybmFsIHJlZ2lzdGVycyAoR0VORVNJUyBvbmx5KSAqLworCUI3X0NGR19TUEMJPSAweDAzODAsLyogY29weSBvZiB0aGUgQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCUI4X1JRMV9SRUdTCT0gMHgwNDAwLC8qIFJlY2VpdmUgUXVldWUgMSAqLworCUI4X1JRMl9SRUdTCT0gMHgwNDgwLC8qIFJlY2VpdmUgUXVldWUgMiAqLworCUI4X1RTMV9SRUdTCT0gMHgwNjAwLC8qIFRyYW5zbWl0IHN5bmMgcXVldWUgMSAqLworCUI4X1RBMV9SRUdTCT0gMHgwNjgwLC8qIFRyYW5zbWl0IGFzeW5jIHF1ZXVlIDEgKi8KKwlCOF9UUzJfUkVHUwk9IDB4MDcwMCwvKiBUcmFuc21pdCBzeW5jIHF1ZXVlIDIgKi8KKwlCOF9UQTJfUkVHUwk9IDB4MDc4MCwvKiBUcmFuc21pdCBzeW5jIHF1ZXVlIDIgKi8KKwlCMTZfUkFNX1JFR1MJPSAweDA4MDAsLyogUkFNIEJ1ZmZlciBSZWdpc3RlcnMgKi8KK307CisKKy8qIFF1ZXVlIFJlZ2lzdGVyIE9mZnNldHMsIHVzZSBRX0FERFIoKSB0byBhY2Nlc3MgKi8KK2VudW0geworCUI4X1FfUkVHUyA9IDB4MDQwMCwgLyogYmFzZSBvZiBRdWV1ZSByZWdpc3RlcnMgKi8KKwlRX0QJPSAweDAwLAkvKiA4KjMyCWJpdAlDdXJyZW50IERlc2NyaXB0b3IgKi8KKwlRX0RBX0wJPSAweDIwLAkvKiAzMiBiaXQJQ3VycmVudCBEZXNjcmlwdG9yIEFkZHJlc3MgTG93IGRXb3JkICovCisJUV9EQV9ICT0gMHgyNCwJLyogMzIgYml0CUN1cnJlbnQgRGVzY3JpcHRvciBBZGRyZXNzIEhpZ2ggZFdvcmQgKi8KKwlRX0FDX0wJPSAweDI4LAkvKiAzMiBiaXQJQ3VycmVudCBBZGRyZXNzIENvdW50ZXIgTG93IGRXb3JkICovCisJUV9BQ19ICT0gMHgyYywJLyogMzIgYml0CUN1cnJlbnQgQWRkcmVzcyBDb3VudGVyIEhpZ2ggZFdvcmQgKi8KKwlRX0JDCT0gMHgzMCwJLyogMzIgYml0CUN1cnJlbnQgQnl0ZSBDb3VudGVyICovCisJUV9DU1IJPSAweDM0LAkvKiAzMiBiaXQJQk1VIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovCisJUV9GCT0gMHgzOCwJLyogMzIgYml0CUZsYWcgUmVnaXN0ZXIgKi8KKwlRX1QxCT0gMHgzYywJLyogMzIgYml0CVRlc3QgUmVnaXN0ZXIgMSAqLworCVFfVDFfVFIJPSAweDNjLAkvKiAgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFRyYW5zZmVyIFNNICovCisJUV9UMV9XUgk9IDB4M2QsCS8qICA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgV3JpdGUgRGVzY3JpcHRvciBTTSAqLworCVFfVDFfUkQJPSAweDNlLAkvKiAgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFJlYWQgRGVzY3JpcHRvciBTTSAqLworCVFfVDFfU1YJPSAweDNmLAkvKiAgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFN1cGVydmlzb3IgU00gKi8KKwlRX1QyCT0gMHg0MCwJLyogMzIgYml0CVRlc3QgUmVnaXN0ZXIgMgkqLworCVFfVDMJPSAweDQ0LAkvKiAzMiBiaXQJVGVzdCBSZWdpc3RlciAzCSovCisKK307CisjZGVmaW5lIFFfQUREUihyZWcsIG9mZnMpIChCOF9RX1JFR1MgKyAocmVnKSArIChvZmZzKSkKKworLyogUkFNIEJ1ZmZlciBSZWdpc3RlciBPZmZzZXRzICovCitlbnVtIHsKKworCVJCX1NUQVJUPSAweDAwLC8qIDMyIGJpdAlSQU0gQnVmZmVyIFN0YXJ0IEFkZHJlc3MgKi8KKwlSQl9FTkQJPSAweDA0LC8qIDMyIGJpdAlSQU0gQnVmZmVyIEVuZCBBZGRyZXNzICovCisJUkJfV1AJPSAweDA4LC8qIDMyIGJpdAlSQU0gQnVmZmVyIFdyaXRlIFBvaW50ZXIgKi8KKwlSQl9SUAk9IDB4MGMsLyogMzIgYml0CVJBTSBCdWZmZXIgUmVhZCBQb2ludGVyICovCisJUkJfUlhfVVRQUD0gMHgxMCwvKiAzMiBiaXQJUnggVXBwZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrZXQgKi8KKwlSQl9SWF9MVFBQPSAweDE0LC8qIDMyIGJpdAlSeCBMb3dlciBUaHJlc2hvbGQsIFBhdXNlIFBhY2tldCAqLworCVJCX1JYX1VUSFA9IDB4MTgsLyogMzIgYml0CVJ4IFVwcGVyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisJUkJfUlhfTFRIUD0gMHgxYywvKiAzMiBiaXQJUnggTG93ZXIgVGhyZXNob2xkLCBIaWdoIFByaW8gKi8KKwkvKiAweDEwIC0gMHgxZjoJcmVzZXJ2ZWQgYXQgVHggUkFNIEJ1ZmZlciBSZWdpc3RlcnMgKi8KKwlSQl9QQwk9IDB4MjAsLyogMzIgYml0CVJBTSBCdWZmZXIgUGFja2V0IENvdW50ZXIgKi8KKwlSQl9MRVYJPSAweDI0LC8qIDMyIGJpdAlSQU0gQnVmZmVyIExldmVsIFJlZ2lzdGVyICovCisJUkJfQ1RSTAk9IDB4MjgsLyogMzIgYml0CVJBTSBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLworCVJCX1RTVDEJPSAweDI5LC8qICA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMSAqLworCVJCX1RTVDIJPSAweDJhLC8qICA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMiAqLworfTsKKworLyogUmVjZWl2ZSBhbmQgVHJhbnNtaXQgUXVldWVzICovCitlbnVtIHsKKwlRX1IxCT0gMHgwMDAwLAkvKiBSZWNlaXZlIFF1ZXVlIDEgKi8KKwlRX1IyCT0gMHgwMDgwLAkvKiBSZWNlaXZlIFF1ZXVlIDIgKi8KKwlRX1hTMQk9IDB4MDIwMCwJLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworCVFfWEExCT0gMHgwMjgwLAkvKiBBc3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworCVFfWFMyCT0gMHgwMzAwLAkvKiBTeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAyICovCisJUV9YQTIJPSAweDAzODAsCS8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAyICovCit9OworCisvKiBEaWZmZXJlbnQgTUFDIFR5cGVzICovCitlbnVtIHsKKwlTS19NQUNfWE1BQyA9CTAsCS8qIFhhcXRpIFhNQUMgSUkgKi8KKwlTS19NQUNfR01BQyA9CTEsCS8qIE1hcnZlbGwgR01BQyAqLworfTsKKworLyogRGlmZmVyZW50IFBIWSBUeXBlcyAqLworZW51bSB7CisJU0tfUEhZX1hNQUMJPSAwLC8qIGludGVncmF0ZWQgaW4gWE1BQyBJSSAqLworCVNLX1BIWV9CQ09NCT0gMSwvKiBCcm9hZGNvbSBCQ001NDAwICovCisJU0tfUEhZX0xPTkUJPSAyLC8qIExldmVsIE9uZSBMWFQxMDAwICBbbm90IHN1cHBvcnRlZF0qLworCVNLX1BIWV9OQVQJPSAzLC8qIE5hdGlvbmFsIERQODM4OTEgIFtub3Qgc3VwcG9ydGVkXSAqLworCVNLX1BIWV9NQVJWX0NPUFBFUj0gNCwvKiBNYXJ2ZWxsIDg4RTEwMTFTICovCisJU0tfUEhZX01BUlZfRklCRVIgPSA1LC8qIE1hcnZlbGwgODhFMTAxMVMgd29ya2luZyBvbiBmaWJlciAqLworfTsKKworLyogUEhZIGFkZHJlc3NlcyAoYml0cyAxMi4uOCBvZiBQSFkgYWRkcmVzcyByZWcpICovCitlbnVtIHsKKwlQSFlfQUREUl9YTUFDCT0gMDw8OCwKKwlQSFlfQUREUl9CQ09NCT0gMTw8OCwKKworLyogR1BIWSBhZGRyZXNzIChiaXRzIDE1Li4xMSBvZiBTTUkgY29udHJvbCByZWcpICovCisJUEhZX0FERFJfTUFSVgk9IDAsCit9OworCisjZGVmaW5lIFJCX0FERFIob2ZmcywgcXVldWUpICgodTE2KUIxNl9SQU1fUkVHUyArICh1MTYpKHF1ZXVlKSArIChvZmZzKSkKKworLyogUmVjZWl2ZSBNQUMgRklGTywgUmVjZWl2ZSBMRUQsIGFuZCBMaW5rX1N5bmMgcmVncyAoR0VORVNJUyBvbmx5KSAqLworZW51bSB7CisJUlhfTUZGX0VBCT0gMHgwYzAwLC8qIDMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIEVuZCBBZGRyZXNzICovCisJUlhfTUZGX1dQCT0gMHgwYzA0LC8qIDMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKworCVJYX01GRl9SUAk9IDB4MGMwYywvKiAzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBSZWFkIFBvaW50ZXIgKi8KKwlSWF9NRkZfUEMJPSAweDBjMTAsLyogMzIgYml0CVJlY2VpdmUgTUFDIEZJRk8gUGFja2V0IENudCAqLworCVJYX01GRl9MRVYJPSAweDBjMTQsLyogMzIgYml0CVJlY2VpdmUgTUFDIEZJRk8gTGV2ZWwgKi8KKwlSWF9NRkZfQ1RSTDEJPSAweDBjMTgsLyogMTYgYml0CVJlY2VpdmUgTUFDIEZJRk8gQ29udHJvbCBSZWcgMSovCisJUlhfTUZGX1NUQVRfVE8JPSAweDBjMWEsLyogIDggYml0CVJlY2VpdmUgTUFDIFN0YXR1cyBUaW1lb3V0ICovCisJUlhfTUZGX1RJU1RfVE8JPSAweDBjMWIsLyogIDggYml0CVJlY2VpdmUgTUFDIFRpbWUgU3RhbXAgVGltZW91dCAqLworCVJYX01GRl9DVFJMMgk9IDB4MGMxYywvKiAgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBDb250cm9sIFJlZyAyKi8KKwlSWF9NRkZfVFNUMQk9IDB4MGMxZCwvKiAgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBUZXN0IFJlZyAxICovCisJUlhfTUZGX1RTVDIJPSAweDBjMWUsLyogIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gVGVzdCBSZWcgMiAqLworCisJUlhfTEVEX0lOSQk9IDB4MGMyMCwvKiAzMiBiaXQJUmVjZWl2ZSBMRUQgQ250IEluaXQgVmFsdWUgKi8KKwlSWF9MRURfVkFMCT0gMHgwYzI0LC8qIDMyIGJpdAlSZWNlaXZlIExFRCBDbnQgQ3VycmVudCBWYWx1ZSAqLworCVJYX0xFRF9DVFJMCT0gMHgwYzI4LC8qICA4IGJpdAlSZWNlaXZlIExFRCBDbnQgQ29udHJvbCBSZWcgKi8KKwlSWF9MRURfVFNUCT0gMHgwYzI5LC8qICA4IGJpdAlSZWNlaXZlIExFRCBDbnQgVGVzdCBSZWdpc3RlciAqLworCisJTE5LX1NZTkNfSU5JCT0gMHgwYzMwLC8qIDMyIGJpdAlMaW5rIFN5bmMgQ250IEluaXQgVmFsdWUgKi8KKwlMTktfU1lOQ19WQUwJPSAweDBjMzQsLyogMzIgYml0CUxpbmsgU3luYyBDbnQgQ3VycmVudCBWYWx1ZSAqLworCUxOS19TWU5DX0NUUkwJPSAweDBjMzgsLyogIDggYml0CUxpbmsgU3luYyBDbnQgQ29udHJvbCBSZWdpc3RlciAqLworCUxOS19TWU5DX1RTVAk9IDB4MGMzOSwvKiAgOCBiaXQJTGluayBTeW5jIENudCBUZXN0IFJlZ2lzdGVyICovCisJTE5LX0xFRF9SRUcJPSAweDBjM2MsLyogIDggYml0CUxpbmsgTEVEIFJlZ2lzdGVyICovCit9OworCisvKiBSZWNlaXZlIGFuZCBUcmFuc21pdCBNQUMgRklGTyBSZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKy8qCVJYX01GRl9DVFJMMQkxNiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBDb250cm9sIFJlZyAxICovCitlbnVtIHsKKwlNRkZfRU5BX1JEWV9QQVQJPSAxPDwxMywJLyogRW5hYmxlICBSZWFkeSBQYXRjaCAqLworCU1GRl9ESVNfUkRZX1BBVAk9IDE8PDEyLAkvKiBEaXNhYmxlIFJlYWR5IFBhdGNoICovCisJTUZGX0VOQV9USU1fUEFUCT0gMTw8MTEsCS8qIEVuYWJsZSAgVGltaW5nIFBhdGNoICovCisJTUZGX0RJU19USU1fUEFUCT0gMTw8MTAsCS8qIERpc2FibGUgVGltaW5nIFBhdGNoICovCisJTUZGX0VOQV9BTE1fRlVMCT0gMTw8OSwJLyogRW5hYmxlICBBbG1vc3RGdWxsIFNpZ24gKi8KKwlNRkZfRElTX0FMTV9GVUwJPSAxPDw4LAkvKiBEaXNhYmxlIEFsbW9zdEZ1bGwgU2lnbiAqLworCU1GRl9FTkFfUEFVU0UJPSAxPDw3LAkvKiBFbmFibGUgIFBhdXNlIFNpZ25hbGluZyAqLworCU1GRl9ESVNfUEFVU0UJPSAxPDw2LAkvKiBEaXNhYmxlIFBhdXNlIFNpZ25hbGluZyAqLworCU1GRl9FTkFfRkxVU0gJPSAxPDw1LAkvKiBFbmFibGUgIEZyYW1lIEZsdXNoaW5nICovCisJTUZGX0RJU19GTFVTSAk9IDE8PDQsCS8qIERpc2FibGUgRnJhbWUgRmx1c2hpbmcgKi8KKwlNRkZfRU5BX1RJU1QJPSAxPDwzLAkvKiBFbmFibGUgIFRpbWUgU3RhbXAgR2VuZXIgKi8KKwlNRkZfRElTX1RJU1QJPSAxPDwyLAkvKiBEaXNhYmxlIFRpbWUgU3RhbXAgR2VuZXIgKi8KKwlNRkZfQ0xSX0lOVElTVAk9IDE8PDEsCS8qIENsZWFyIElSUSBObyBUaW1lIFN0YW1wICovCisJTUZGX0NMUl9JTlNUQVQJPSAxPDwwLAkvKiBDbGVhciBJUlEgTm8gU3RhdHVzICovCisJTUZGX1JYX0NUUkxfREVGID0gTUZGX0VOQV9USU1fUEFULAorfTsKKworLyoJVFhfTUZGX0NUUkwxCTE2IGJpdAlUcmFuc21pdCBNQUMgRklGTyBDb250cm9sIFJlZyAxICovCitlbnVtIHsKKwlNRkZfQ0xSX1BFUlIJPSAxPDwxNSwgLyogQ2xlYXIgUGFyaXR5IEVycm9yIElSUSAqLworCisJTUZGX0VOQV9QS1RfUkVDCT0gMTw8MTMsIC8qIEVuYWJsZSAgUGFja2V0IFJlY292ZXJ5ICovCisJTUZGX0RJU19QS1RfUkVDCT0gMTw8MTIsIC8qIERpc2FibGUgUGFja2V0IFJlY292ZXJ5ICovCisKKwlNRkZfRU5BX1c0RQk9IDE8PDcsCS8qIEVuYWJsZSAgV2FpdCBmb3IgRW1wdHkgKi8KKwlNRkZfRElTX1c0RQk9IDE8PDYsCS8qIERpc2FibGUgV2FpdCBmb3IgRW1wdHkgKi8KKworCU1GRl9FTkFfTE9PUEIJPSAxPDwzLAkvKiBFbmFibGUgIExvb3BiYWNrICovCisJTUZGX0RJU19MT09QQgk9IDE8PDIsCS8qIERpc2FibGUgTG9vcGJhY2sgKi8KKwlNRkZfQ0xSX01BQ19SU1QJPSAxPDwxLAkvKiBDbGVhciBYTUFDIFJlc2V0ICovCisJTUZGX1NFVF9NQUNfUlNUCT0gMTw8MCwJLyogU2V0ICAgWE1BQyBSZXNldCAqLworCisJTUZGX1RYX0NUUkxfREVGCSA9IE1GRl9FTkFfUEtUX1JFQyB8ICh1MTYpIE1GRl9FTkFfVElNX1BBVCB8IE1GRl9FTkFfRkxVU0gsCit9OworCisKKy8qCVJYX01GRl9UU1QyCSAJIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gVGVzdCBSZWdpc3RlciAyICovCisvKglUWF9NRkZfVFNUMgkgCSA4IGJpdAlUcmFuc21pdCBNQUMgRklGTyBUZXN0IFJlZ2lzdGVyIDIgKi8KK2VudW0geworCU1GRl9XU1BfVF9PTgk9IDE8PDYsCS8qIFR4OiBXcml0ZSBTaGFkb3cgUHRyIFRlc3RPbiAqLworCU1GRl9XU1BfVF9PRkYJPSAxPDw1LAkvKiBUeDogV3JpdGUgU2hhZG93IFB0ciBUc3RPZmYgKi8KKwlNRkZfV1NQX0lOQwk9IDE8PDQsCS8qIFR4OiBXcml0ZSBTaGFkb3cgUHRyIEluY3JlbWVudCAqLworCU1GRl9QQ19ERUMJPSAxPDwzLAkvKiBQYWNrZXQgQ291bnRlciBEZWNyZW1lbnQgKi8KKwlNRkZfUENfVF9PTgk9IDE8PDIsCS8qIFBhY2tldCBDb3VudGVyIFRlc3QgT24gKi8KKwlNRkZfUENfVF9PRkYJPSAxPDwxLAkvKiBQYWNrZXQgQ291bnRlciBUZXN0IE9mZiAqLworCU1GRl9QQ19JTkMJPSAxPDwwLAkvKiBQYWNrZXQgQ291bnRlciBJbmNyZW1lbnQgKi8KK307CisKKy8qCVJYX01GRl9UU1QxCSAJIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gVGVzdCBSZWdpc3RlciAxICovCisvKglUWF9NRkZfVFNUMQkgCSA4IGJpdAlUcmFuc21pdCBNQUMgRklGTyBUZXN0IFJlZ2lzdGVyIDEgKi8KK2VudW0geworCU1GRl9XUF9UX09OCT0gMTw8NiwJLyogV3JpdGUgUG9pbnRlciBUZXN0IE9uICovCisJTUZGX1dQX1RfT0ZGCT0gMTw8NSwJLyogV3JpdGUgUG9pbnRlciBUZXN0IE9mZiAqLworCU1GRl9XUF9JTkMJPSAxPDw0LAkvKiBXcml0ZSBQb2ludGVyIEluY3JlbSAqLworCisJTUZGX1JQX1RfT04JPSAxPDwyLAkvKiBSZWFkIFBvaW50ZXIgVGVzdCBPbiAqLworCU1GRl9SUF9UX09GRgk9IDE8PDEsCS8qIFJlYWQgUG9pbnRlciBUZXN0IE9mZiAqLworCU1GRl9SUF9ERUMJPSAxPDwwLAkvKiBSZWFkIFBvaW50ZXIgRGVjcmVtZW50ICovCit9OworCisvKglSWF9NRkZfQ1RSTDIJIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gQ29udHJvbCBSZWcgMiAqLworLyoJVFhfTUZGX0NUUkwyCSA4IGJpdAlUcmFuc21pdCBNQUMgRklGTyBDb250cm9sIFJlZyAyICovCitlbnVtIHsKKwlNRkZfRU5BX09QX01ECT0gMTw8MywJLyogRW5hYmxlICBPcGVyYXRpb24gTW9kZSAqLworCU1GRl9ESVNfT1BfTUQJPSAxPDwyLAkvKiBEaXNhYmxlIE9wZXJhdGlvbiBNb2RlICovCisJTUZGX1JTVF9DTFIJPSAxPDwxLAkvKiBDbGVhciBNQUMgRklGTyBSZXNldCAqLworCU1GRl9SU1RfU0VUCT0gMTw8MCwJLyogU2V0ICAgTUFDIEZJRk8gUmVzZXQgKi8KK307CisKKworLyoJTGluayBMRUQgQ291bnRlciBSZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKworLyoJUlhfTEVEX0NUUkwJCSA4IGJpdAlSZWNlaXZlIExFRCBDbnQgQ29udHJvbCBSZWcgKi8KKy8qCVRYX0xFRF9DVFJMCQkgOCBiaXQJVHJhbnNtaXQgTEVEIENudCBDb250cm9sIFJlZyAqLworLyoJTE5LX1NZTkNfQ1RSTAkgOCBiaXQJTGluayBTeW5jIENudCBDb250cm9sIFJlZ2lzdGVyICovCitlbnVtIHsKKwlMRURfU1RBUlQJPSAxPDwyLAkvKiBTdGFydCBUaW1lciAqLworCUxFRF9TVE9QCT0gMTw8MSwJLyogU3RvcCBUaW1lciAqLworCUxFRF9TVEFURQk9IDE8PDAsCS8qIFJ4L1R4OiBMRUQgU3RhdGUsIDE9TEVEIG9uICovCit9OworCisvKglSWF9MRURfVFNUCQkgOCBiaXQJUmVjZWl2ZSBMRUQgQ250IFRlc3QgUmVnaXN0ZXIgKi8KKy8qCVRYX0xFRF9UU1QJCSA4IGJpdAlUcmFuc21pdCBMRUQgQ250IFRlc3QgUmVnaXN0ZXIgKi8KKy8qCUxOS19TWU5DX1RTVAkgOCBiaXQJTGluayBTeW5jIENudCBUZXN0IFJlZ2lzdGVyICovCitlbnVtIHsKKwlMRURfVF9PTgk9IDE8PDIsCS8qIExFRCBDb3VudGVyIFRlc3QgbW9kZSBPbiAqLworCUxFRF9UX09GRgk9IDE8PDEsCS8qIExFRCBDb3VudGVyIFRlc3QgbW9kZSBPZmYgKi8KKwlMRURfVF9TVEVQCT0gMTw8MCwJLyogTEVEIENvdW50ZXIgU3RlcCAqLworfTsKKworLyoJTE5LX0xFRF9SRUcJIAkgOCBiaXQJTGluayBMRUQgUmVnaXN0ZXIgKi8KK2VudW0geworCUxFRF9CTEtfT04JPSAxPDw1LAkvKiBMaW5rIExFRCBCbGlua2luZyBPbiAqLworCUxFRF9CTEtfT0ZGCT0gMTw8NCwJLyogTGluayBMRUQgQmxpbmtpbmcgT2ZmICovCisJTEVEX1NZTkNfT04JPSAxPDwzLAkvKiBVc2UgU3luYyBXaXJlIHRvIHN3aXRjaCBMRUQgKi8KKwlMRURfU1lOQ19PRkYJPSAxPDwyLAkvKiBEaXNhYmxlIFN5bmMgV2lyZSBJbnB1dCAqLworCUxFRF9PTgk9IDE8PDEsCS8qIHN3aXRjaCBMRUQgb24gKi8KKwlMRURfT0ZGCT0gMTw8MCwJLyogc3dpdGNoIExFRCBvZmYgKi8KK307CisKKy8qIFJlY2VpdmUgR01BQyBGSUZPIChZVUtPTikgKi8KK2VudW0geworCVJYX0dNRl9FQQk9IDB4MGM0MCwvKiAzMiBiaXQJUnggR01BQyBGSUZPIEVuZCBBZGRyZXNzICovCisJUlhfR01GX0FGX1RIUgk9IDB4MGM0NCwvKiAzMiBiaXQJUnggR01BQyBGSUZPIEFsbW9zdCBGdWxsIFRocmVzaC4gKi8KKwlSWF9HTUZfQ1RSTF9UCT0gMHgwYzQ4LC8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gQ29udHJvbC9UZXN0ICovCisJUlhfR01GX0ZMX01TSwk9IDB4MGM0YywvKiAzMiBiaXQJUnggR01BQyBGSUZPIEZsdXNoIE1hc2sgKi8KKwlSWF9HTUZfRkxfVEhSCT0gMHgwYzUwLC8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gRmx1c2ggVGhyZXNob2xkICovCisJUlhfR01GX1dQCT0gMHgwYzYwLC8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gV3JpdGUgUG9pbnRlciAqLworCVJYX0dNRl9XTEVWCT0gMHgwYzY4LC8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gV3JpdGUgTGV2ZWwgKi8KKwlSWF9HTUZfUlAJPSAweDBjNzAsLyogMzIgYml0CVJ4IEdNQUMgRklGTyBSZWFkIFBvaW50ZXIgKi8KKwlSWF9HTUZfUkxFVgk9IDB4MGM3OCwvKiAzMiBiaXQJUnggR01BQyBGSUZPIFJlYWQgTGV2ZWwgKi8KK307CisKKworLyoJVFhBX1RFU1QJCSA4IGJpdAlUeCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXIgKi8KK2VudW0geworCVRYQV9JTlRfVF9PTgk9IDE8PDUsCS8qIFR4IEFyYiBJbnRlcnZhbCBUaW1lciBUZXN0IE9uICovCisJVFhBX0lOVF9UX09GRgk9IDE8PDQsCS8qIFR4IEFyYiBJbnRlcnZhbCBUaW1lciBUZXN0IE9mZiAqLworCVRYQV9JTlRfVF9TVEVQCT0gMTw8MywJLyogVHggQXJiIEludGVydmFsIFRpbWVyIFN0ZXAgKi8KKwlUWEFfTElNX1RfT04JPSAxPDwyLAkvKiBUeCBBcmIgTGltaXQgVGltZXIgVGVzdCBPbiAqLworCVRYQV9MSU1fVF9PRkYJPSAxPDwxLAkvKiBUeCBBcmIgTGltaXQgVGltZXIgVGVzdCBPZmYgKi8KKwlUWEFfTElNX1RfU1RFUAk9IDE8PDAsCS8qIFR4IEFyYiBMaW1pdCBUaW1lciBTdGVwICovCit9OworCisvKglUWEFfU1RBVAkJIDggYml0CVR4IEFyYml0ZXIgU3RhdHVzIFJlZ2lzdGVyICovCitlbnVtIHsKKwlUWEFfUFJJT19YUwk9IDE8PDAsCS8qIHN5bmMgcXVldWUgaGFzIHByaW8gdG8gc2VuZCAqLworfTsKKworCisvKglRX0JDCQkJMzIgYml0CUN1cnJlbnQgQnl0ZSBDb3VudGVyICovCisKKy8qIEJNVSBDb250cm9sIFN0YXR1cyBSZWdpc3RlcnMgKi8KKy8qCUIwX1IxX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgUnggUXVldWUgMSAqLworLyoJQjBfUjJfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBSeCBRdWV1ZSAyICovCisvKglCMF9YQTFfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBTeW5jIFR4IFF1ZXVlIDEgKi8KKy8qCUIwX1hTMV9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IEFzeW5jIFR4IFF1ZXVlIDEgKi8KKy8qCUIwX1hBMl9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IFN5bmMgVHggUXVldWUgMiAqLworLyoJQjBfWFMyX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgQXN5bmMgVHggUXVldWUgMiAqLworLyoJUV9DU1IJCQkzMiBiaXQJQk1VIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovCisKK2VudW0geworCUNTUl9TVl9JRExFCT0gMTw8MjQsCS8qIEJNVSBTTSBJZGxlICovCisKKwlDU1JfREVTQ19DTFIJPSAxPDwyMSwJLyogQ2xlYXIgUmVzZXQgZm9yIERlc2NyICovCisJQ1NSX0RFU0NfU0VUCT0gMTw8MjAsCS8qIFNldCAgIFJlc2V0IGZvciBEZXNjciAqLworCUNTUl9GSUZPX0NMUgk9IDE8PDE5LAkvKiBDbGVhciBSZXNldCBmb3IgRklGTyAqLworCUNTUl9GSUZPX1NFVAk9IDE8PDE4LAkvKiBTZXQgICBSZXNldCBmb3IgRklGTyAqLworCUNTUl9IUElfUlVOCT0gMTw8MTcsCS8qIFJlbGVhc2UgSFBJIFNNICovCisJQ1NSX0hQSV9SU1QJPSAxPDwxNiwJLyogUmVzZXQgICBIUEkgU00gdG8gSWRsZSAqLworCUNTUl9TVl9SVU4JPSAxPDwxNSwJLyogUmVsZWFzZSBTdXBlcnZpc29yIFNNICovCisJQ1NSX1NWX1JTVAk9IDE8PDE0LAkvKiBSZXNldCAgIFN1cGVydmlzb3IgU00gKi8KKwlDU1JfRFJFQURfUlVOCT0gMTw8MTMsCS8qIFJlbGVhc2UgRGVzY3IgUmVhZCBTTSAqLworCUNTUl9EUkVBRF9SU1QJPSAxPDwxMiwJLyogUmVzZXQgICBEZXNjciBSZWFkIFNNICovCisJQ1NSX0RXUklURV9SVU4JPSAxPDwxMSwJLyogUmVsZWFzZSBEZXNjciBXcml0ZSBTTSAqLworCUNTUl9EV1JJVEVfUlNUCT0gMTw8MTAsCS8qIFJlc2V0ICAgRGVzY3IgV3JpdGUgU00gKi8KKwlDU1JfVFJBTlNfUlVOCT0gMTw8OSwJCS8qIFJlbGVhc2UgVHJhbnNmZXIgU00gKi8KKwlDU1JfVFJBTlNfUlNUCT0gMTw8OCwJCS8qIFJlc2V0ICAgVHJhbnNmZXIgU00gKi8KKwlDU1JfRU5BX1BPTAk9IDE8PDcsCQkvKiBFbmFibGUgIERlc2NyIFBvbGxpbmcgKi8KKwlDU1JfRElTX1BPTAk9IDE8PDYsCQkvKiBEaXNhYmxlIERlc2NyIFBvbGxpbmcgKi8KKwlDU1JfU1RPUAk9IDE8PDUsCQkvKiBTdG9wICBSeC9UeCBRdWV1ZSAqLworCUNTUl9TVEFSVAk9IDE8PDQsCQkvKiBTdGFydCBSeC9UeCBRdWV1ZSAqLworCUNTUl9JUlFfQ0xfUAk9IDE8PDMsCQkvKiAoUngpCUNsZWFyIFBhcml0eSBJUlEgKi8KKwlDU1JfSVJRX0NMX0IJPSAxPDwyLAkJLyogQ2xlYXIgRU9CIElSUSAqLworCUNTUl9JUlFfQ0xfRgk9IDE8PDEsCQkvKiBDbGVhciBFT0YgSVJRICovCisJQ1NSX0lSUV9DTF9DCT0gMTw8MCwJCS8qIENsZWFyIEVSUiBJUlEgKi8KK307CisKKyNkZWZpbmUgQ1NSX1NFVF9SRVNFVAkoQ1NSX0RFU0NfU0VUIHwgQ1NSX0ZJRk9fU0VUIHwgQ1NSX0hQSV9SU1QgfFwKKwkJCUNTUl9TVl9SU1QgfCBDU1JfRFJFQURfUlNUIHwgQ1NSX0RXUklURV9SU1QgfFwKKwkJCUNTUl9UUkFOU19SU1QpCisjZGVmaW5lIENTUl9DTFJfUkVTRVQJKENTUl9ERVNDX0NMUiB8IENTUl9GSUZPX0NMUiB8IENTUl9IUElfUlVOIHxcCisJCQlDU1JfU1ZfUlVOIHwgQ1NSX0RSRUFEX1JVTiB8IENTUl9EV1JJVEVfUlVOIHxcCisJCQlDU1JfVFJBTlNfUlVOKQorCisvKglRX0YJCQkJMzIgYml0CUZsYWcgUmVnaXN0ZXIgKi8KK2VudW0geworCUZfQUxNX0ZVTEwJPSAxPDwyNywJLyogUnggRklGTzogYWxtb3N0IGZ1bGwgKi8KKwlGX0VNUFRZCQk9IDE8PDI3LAkvKiBUeCBGSUZPOiBlbXB0eSBmbGFnICovCisJRl9GSUZPX0VPRgk9IDE8PDI2LAkvKiBUYWcgKEVPRiBGbGFnKSBiaXQgaW4gRklGTyAqLworCUZfV01fUkVBQ0hFRAk9IDE8PDI1LAkvKiBXYXRlcm1hcmsgcmVhY2hlZCAqLworCisJRl9GSUZPX0xFVkVMCT0gMHgxZkw8PDE2LAkvKiBCaXQgMjMuLjE2OgkjIG9mIFF3b3JkcyBpbiBGSUZPICovCisJRl9XQVRFUl9NQVJLCT0gMHgwMDA3ZmZMLAkvKiBCaXQgMTAuLiAwOglXYXRlcm1hcmsgKi8KK307CisKKy8qIFJBTSBCdWZmZXIgUmVnaXN0ZXIgT2Zmc2V0cywgdXNlIFJCX0FERFIoUXVldWUsIE9mZnMpIHRvIGFjY2VzcyAqLworLyoJUkJfU1RBUlQJCTMyIGJpdAlSQU0gQnVmZmVyIFN0YXJ0IEFkZHJlc3MgKi8KKy8qCVJCX0VORAkJCTMyIGJpdAlSQU0gQnVmZmVyIEVuZCBBZGRyZXNzICovCisvKglSQl9XUAkJCTMyIGJpdAlSQU0gQnVmZmVyIFdyaXRlIFBvaW50ZXIgKi8KKy8qCVJCX1JQCQkJMzIgYml0CVJBTSBCdWZmZXIgUmVhZCBQb2ludGVyICovCisvKglSQl9SWF9VVFBQCQkzMiBiaXQJUnggVXBwZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrICovCisvKglSQl9SWF9MVFBQCQkzMiBiaXQJUnggTG93ZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrICovCisvKglSQl9SWF9VVEhQCQkzMiBiaXQJUnggVXBwZXIgVGhyZXNob2xkLCBIaWdoIFByaW8gKi8KKy8qCVJCX1JYX0xUSFAJCTMyIGJpdAlSeCBMb3dlciBUaHJlc2hvbGQsIEhpZ2ggUHJpbyAqLworLyoJUkJfUEMJCQkzMiBiaXQJUkFNIEJ1ZmZlciBQYWNrZXQgQ291bnRlciAqLworLyoJUkJfTEVWCQkJMzIgYml0CVJBTSBCdWZmZXIgTGV2ZWwgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBSQl9NU0sJMHgwMDA3ZmZmZgkvKiBCaXQgMTguLiAwOglSQU0gQnVmZmVyIFBvaW50ZXIgQml0cyAqLworLyoJUkJfVFNUMgkJCSA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMiAqLworLyoJUkJfVFNUMQkJCSA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMSAqLworCisvKglSQl9DVFJMCQkJIDggYml0CVJBTSBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLworZW51bSB7CisJUkJfRU5BX1NURldECT0gMTw8NSwJLyogRW5hYmxlICBTdG9yZSAmIEZvcndhcmQgKi8KKwlSQl9ESVNfU1RGV0QJPSAxPDw0LAkvKiBEaXNhYmxlIFN0b3JlICYgRm9yd2FyZCAqLworCVJCX0VOQV9PUF9NRAk9IDE8PDMsCS8qIEVuYWJsZSAgT3BlcmF0aW9uIE1vZGUgKi8KKwlSQl9ESVNfT1BfTUQJPSAxPDwyLAkvKiBEaXNhYmxlIE9wZXJhdGlvbiBNb2RlICovCisJUkJfUlNUX0NMUgk9IDE8PDEsCS8qIENsZWFyIFJBTSBCdWYgU1RNIFJlc2V0ICovCisJUkJfUlNUX1NFVAk9IDE8PDAsCS8qIFNldCAgIFJBTSBCdWYgU1RNIFJlc2V0ICovCit9OworCisvKiBUcmFuc21pdCBNQUMgRklGTyBhbmQgVHJhbnNtaXQgTEVEIFJlZ2lzdGVycyAoR0VORVNJUyBvbmx5KSwgKi8KK2VudW0geworCVRYX01GRl9FQQk9IDB4MGQwMCwvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gRW5kIEFkZHJlc3MgKi8KKwlUWF9NRkZfV1AJPSAweDBkMDQsLyogMzIgYml0CVRyYW5zbWl0IE1BQyBGSUZPIFdSIFBvaW50ZXIgKi8KKwlUWF9NRkZfV1NQCT0gMHgwZDA4LC8qIDMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBXUiBTaGFkb3cgUHRyICovCisJVFhfTUZGX1JQCT0gMHgwZDBjLC8qIDMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBSRCBQb2ludGVyICovCisJVFhfTUZGX1BDCT0gMHgwZDEwLC8qIDMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBQYWNrZXQgQ250ICovCisJVFhfTUZGX0xFVgk9IDB4MGQxNCwvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gTGV2ZWwgKi8KKwlUWF9NRkZfQ1RSTDEJPSAweDBkMTgsLyogMTYgYml0CVRyYW5zbWl0IE1BQyBGSUZPIEN0cmwgUmVnIDEgKi8KKwlUWF9NRkZfV0FGCT0gMHgwZDFhLC8qICA4IGJpdAlUcmFuc21pdCBNQUMgV2FpdCBhZnRlciBmbHVzaCAqLworCisJVFhfTUZGX0NUUkwyCT0gMHgwZDFjLC8qICA4IGJpdAlUcmFuc21pdCBNQUMgRklGTyBDdHJsIFJlZyAyICovCisJVFhfTUZGX1RTVDEJPSAweDBkMWQsLyogIDggYml0CVRyYW5zbWl0IE1BQyBGSUZPIFRlc3QgUmVnIDEgKi8KKwlUWF9NRkZfVFNUMgk9IDB4MGQxZSwvKiAgOCBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gVGVzdCBSZWcgMiAqLworCisJVFhfTEVEX0lOSQk9IDB4MGQyMCwvKiAzMiBiaXQJVHJhbnNtaXQgTEVEIENudCBJbml0IFZhbHVlICovCisJVFhfTEVEX1ZBTAk9IDB4MGQyNCwvKiAzMiBiaXQJVHJhbnNtaXQgTEVEIENudCBDdXJyZW50IFZhbCAqLworCVRYX0xFRF9DVFJMCT0gMHgwZDI4LC8qICA4IGJpdAlUcmFuc21pdCBMRUQgQ250IENvbnRyb2wgUmVnICovCisJVFhfTEVEX1RTVAk9IDB4MGQyOSwvKiAgOCBiaXQJVHJhbnNtaXQgTEVEIENudCBUZXN0IFJlZyAqLworfTsKKworLyogQ291bnRlciBhbmQgVGltZXIgY29uc3RhbnRzLCBmb3IgYSBob3N0IGNsb2NrIG9mIDYyLjUgTUh6ICovCisjZGVmaW5lIFNLX1hNSVRfRFVSCQkweDAwMmZhZjA4VUwJLyogIDUwIG1zICovCisjZGVmaW5lIFNLX0JMS19EVVIJCTB4MDFkY2Q2NTBVTAkvKiA1MDAgbXMgKi8KKworI2RlZmluZSBTS19EUE9MTF9ERUYJMHgwMGVlNmIyOFVMCS8qIDI1MCBtcyBhdCA2Mi41IE1IeiAqLworCisjZGVmaW5lIFNLX0RQT0xMX01BWAkweDAwZmZmZmZmVUwJLyogMjY4IG1zIGF0IDYyLjUgTUh6ICovCisJCQkJCS8qIDIxNSBtcyBhdCA3OC4xMiBNSHogKi8KKworI2RlZmluZSBTS19GQUNUXzYyCQkxMDAJLyogaXMgZ2l2ZW4gaW4gcGVyY2VudCAqLworI2RlZmluZSBTS19GQUNUXzUzCQkgODUgICAgIC8qIG9uIEdFTkVTSVM6CTUzLjEyIE1IeiAqLworI2RlZmluZSBTS19GQUNUXzc4CQkxMjUJLyogb24gWVVLT046CTc4LjEyIE1IeiAqLworCisKKy8qIFRyYW5zbWl0IEdNQUMgRklGTyAoWVVLT04gb25seSkgKi8KK2VudW0geworCVRYX0dNRl9FQQk9IDB4MGQ0MCwvKiAzMiBiaXQJVHggR01BQyBGSUZPIEVuZCBBZGRyZXNzICovCisJVFhfR01GX0FFX1RIUgk9IDB4MGQ0NCwvKiAzMiBiaXQJVHggR01BQyBGSUZPIEFsbW9zdCBFbXB0eSBUaHJlc2guKi8KKwlUWF9HTUZfQ1RSTF9UCT0gMHgwZDQ4LC8qIDMyIGJpdAlUeCBHTUFDIEZJRk8gQ29udHJvbC9UZXN0ICovCisKKwlUWF9HTUZfV1AJPSAweDBkNjAsLyogMzIgYml0IAlUeCBHTUFDIEZJRk8gV3JpdGUgUG9pbnRlciAqLworCVRYX0dNRl9XU1AJPSAweDBkNjQsLyogMzIgYml0IAlUeCBHTUFDIEZJRk8gV3JpdGUgU2hhZG93IFB0ci4gKi8KKwlUWF9HTUZfV0xFVgk9IDB4MGQ2OCwvKiAzMiBiaXQgCVR4IEdNQUMgRklGTyBXcml0ZSBMZXZlbCAqLworCisJVFhfR01GX1JQCT0gMHgwZDcwLC8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworCVRYX0dNRl9SU1RQCT0gMHgwZDc0LC8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFJlc3RhcnQgUG9pbnRlciAqLworCVRYX0dNRl9STEVWCT0gMHgwZDc4LC8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgTGV2ZWwgKi8KKworCS8qIERlc2NyaXB0b3IgUG9sbCBUaW1lciBSZWdpc3RlcnMgKi8KKwlCMjhfRFBUX0lOSQk9IDB4MGUwMCwvKiAyNCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEluaXQgVmFsICovCisJQjI4X0RQVF9WQUwJPSAweDBlMDQsLyogMjQgYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBDdXJyIFZhbCAqLworCUIyOF9EUFRfQ1RSTAk9IDB4MGUwOCwvKiAgOCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEN0cmwgUmVnICovCisKKwlCMjhfRFBUX1RTVAk9IDB4MGUwYSwvKiAgOCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIFRlc3QgUmVnICovCisKKwkvKiBUaW1lIFN0YW1wIFRpbWVyIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KKwlHTUFDX1RJX1NUX1ZBTAk9IDB4MGUxNCwvKiAzMiBiaXQJVGltZSBTdGFtcCBUaW1lciBDdXJyIFZhbCAqLworCUdNQUNfVElfU1RfQ1RSTAk9IDB4MGUxOCwvKiAgOCBiaXQJVGltZSBTdGFtcCBUaW1lciBDdHJsIFJlZyAqLworCUdNQUNfVElfU1RfVFNUCT0gMHgwZTFhLC8qICA4IGJpdAlUaW1lIFN0YW1wIFRpbWVyIFRlc3QgUmVnICovCit9OworCisKK2VudW0geworCUxJTktMRURfT0ZGIAkgICAgID0gMHgwMSwKKwlMSU5LTEVEX09OICAJICAgICA9IDB4MDIsCisJTElOS0xFRF9MSU5LU1lOQ19PRkYgPSAweDA0LAorCUxJTktMRURfTElOS1NZTkNfT04gID0gMHgwOCwKKwlMSU5LTEVEX0JMSU5LX09GRiAgICA9IDB4MTAsCisJTElOS0xFRF9CTElOS19PTiAgICAgPSAweDIwLAorfTsKKworLyogR01BQyBhbmQgR1BIWSBDb250cm9sIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KK2VudW0geworCUdNQUNfQ1RSTAk9IDB4MGYwMCwvKiAzMiBiaXQJR01BQyBDb250cm9sIFJlZyAqLworCUdQSFlfQ1RSTAk9IDB4MGYwNCwvKiAzMiBiaXQJR1BIWSBDb250cm9sIFJlZyAqLworCUdNQUNfSVJRX1NSQwk9IDB4MGYwOCwvKiAgOCBiaXQJR01BQyBJbnRlcnJ1cHQgU291cmNlIFJlZyAqLworCUdNQUNfSVJRX01TSwk9IDB4MGYwYywvKiAgOCBiaXQJR01BQyBJbnRlcnJ1cHQgTWFzayBSZWcgKi8KKwlHTUFDX0xJTktfQ1RSTAk9IDB4MGYxMCwvKiAxNiBiaXQJTGluayBDb250cm9sIFJlZyAqLworCisvKiBXYWtlLXVwIEZyYW1lIFBhdHRlcm4gTWF0Y2ggQ29udHJvbCBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCisKKwlXT0xfUkVHX09GRlMJPSAweDIwLC8qIEhXLUJ1ZzogQWRkcmVzcyBpcyArIDB4MjAgYWdhaW5zdCBzcGVjLiAqLworCisJV09MX0NUUkxfU1RBVAk9IDB4MGYyMCwvKiAxNiBiaXQJV09MIENvbnRyb2wvU3RhdHVzIFJlZyAqLworCVdPTF9NQVRDSF9DVEwJPSAweDBmMjIsLyogIDggYml0CVdPTCBNYXRjaCBDb250cm9sIFJlZyAqLworCVdPTF9NQVRDSF9SRVMJPSAweDBmMjMsLyogIDggYml0CVdPTCBNYXRjaCBSZXN1bHQgUmVnICovCisJV09MX01BQ19BRERSCT0gMHgwZjI0LC8qIDMyIGJpdAlXT0wgTUFDIEFkZHJlc3MgKi8KKwlXT0xfUEFUVF9SUFRSCT0gMHgwZjJjLC8qICA4IGJpdAlXT0wgUGF0dGVybiBSZWFkIFBvaW50ZXIgKi8KKworLyogV09MIFBhdHRlcm4gTGVuZ3RoIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KKworCVdPTF9QQVRUX0xFTl9MTwk9IDB4MGYzMCwvKiAzMiBiaXQJV09MIFBhdHRlcm4gTGVuZ3RoIDMuLjAgKi8KKwlXT0xfUEFUVF9MRU5fSEkJPSAweDBmMzQsLyogMjQgYml0CVdPTCBQYXR0ZXJuIExlbmd0aCA2Li40ICovCisKKy8qIFdPTCBQYXR0ZXJuIENvdW50ZXIgUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLworCisJV09MX1BBVFRfQ05UXzAJPSAweDBmMzgsLyogMzIgYml0CVdPTCBQYXR0ZXJuIENvdW50ZXIgMy4uMCAqLworCVdPTF9QQVRUX0NOVF80CT0gMHgwZjNjLC8qIDI0IGJpdAlXT0wgUGF0dGVybiBDb3VudGVyIDYuLjQgKi8KK307CisjZGVmaW5lIFdPTF9SRUdTKHBvcnQsIHgpCSh4ICsgKHBvcnQpKjB4ODApCisKK2VudW0geworCVdPTF9QQVRUX1JBTV8xCT0gMHgxMDAwLC8qICBXT0wgUGF0dGVybiBSQU0gTGluayAxICovCisJV09MX1BBVFRfUkFNXzIJPSAweDE0MDAsLyogIFdPTCBQYXR0ZXJuIFJBTSBMaW5rIDIgKi8KK307CisjZGVmaW5lIFdPTF9QQVRUX1JBTV9CQVNFKHBvcnQpCShXT0xfUEFUVF9SQU1fMSArIChwb3J0KSoweDQwMCkKKworZW51bSB7CisJQkFTRV9YTUFDXzEJPSAweDIwMDAsLyogWE1BQyAxIHJlZ2lzdGVycyAqLworCUJBU0VfR01BQ18xCT0gMHgyODAwLC8qIEdNQUMgMSByZWdpc3RlcnMgKi8KKwlCQVNFX1hNQUNfMgk9IDB4MzAwMCwvKiBYTUFDIDIgcmVnaXN0ZXJzICovCisJQkFTRV9HTUFDXzIJPSAweDM4MDAsLyogR01BQyAyIHJlZ2lzdGVycyAqLworfTsKKworLyoKKyAqIFJlY2VpdmUgRnJhbWUgU3RhdHVzIEVuY29kaW5nCisgKi8KK2VudW0geworCVhNUl9GU19MRU4JPSAweDNmZmY8PDE4LAkvKiBCaXQgMzEuLjE4OglSeCBGcmFtZSBMZW5ndGggKi8KKwlYTVJfRlNfTEVOX1NISUZUID0gMTgsCisJWE1SX0ZTXzJMX1ZMQU4JPSAxPDwxNywgLyogQml0IDE3Ogl0YWdnZWQgd2ggMkxldiBWTEFOIElEKi8KKwlYTVJfRlNfMV9WTEFOCT0gMTw8MTYsIC8qIEJpdCAxNjoJdGFnZ2VkIHdoIDFldiBWTEFOIElEKi8KKwlYTVJfRlNfQkMJPSAxPDwxNSwgLyogQml0IDE1OglCcm9hZGNhc3QgRnJhbWUgKi8KKwlYTVJfRlNfTUMJPSAxPDwxNCwgLyogQml0IDE0OglNdWx0aWNhc3QgRnJhbWUgKi8KKwlYTVJfRlNfVUMJPSAxPDwxMywgLyogQml0IDEzOglVbmljYXN0IEZyYW1lICovCisKKwlYTVJfRlNfQlVSU1QJPSAxPDwxMSwgLyogQml0IDExOglCdXJzdCBNb2RlICovCisJWE1SX0ZTX0NFWF9FUlIJPSAxPDwxMCwgLyogQml0IDEwOglDYXJyaWVyIEV4dC4gRXJyb3IgKi8KKwlYTVJfRlNfODAyXzMJPSAxPDw5LCAvKiBCaXQgIDk6CTgwMi4zIEZyYW1lICovCisJWE1SX0ZTX0NPTF9FUlIJPSAxPDw4LCAvKiBCaXQgIDg6CUNvbGxpc2lvbiBFcnJvciAqLworCVhNUl9GU19DQVJfRVJSCT0gMTw8NywgLyogQml0ICA3OglDYXJyaWVyIEV2ZW50IEVycm9yICovCisJWE1SX0ZTX0xFTl9FUlIJPSAxPDw2LCAvKiBCaXQgIDY6CUluLVJhbmdlIExlbmd0aCBFcnJvciAqLworCVhNUl9GU19GUkFfRVJSCT0gMTw8NSwgLyogQml0ICA1OglGcmFtaW5nIEVycm9yICovCisJWE1SX0ZTX1JVTlQJPSAxPDw0LCAvKiBCaXQgIDQ6CVJ1bnQgRnJhbWUgKi8KKwlYTVJfRlNfTE5HX0VSUgk9IDE8PDMsIC8qIEJpdCAgMzoJR2lhbnQgKEp1bWJvKSBGcmFtZSAqLworCVhNUl9GU19GQ1NfRVJSCT0gMTw8MiwgLyogQml0ICAyOglGcmFtZSBDaGVjayBTZXF1IEVyciAqLworCVhNUl9GU19FUlIJPSAxPDwxLCAvKiBCaXQgIDE6CUZyYW1lIEVycm9yICovCisJWE1SX0ZTX01DVFJMCT0gMTw8MCwgLyogQml0ICAwOglNQUMgQ29udHJvbCBQYWNrZXQgKi8KKworLyoKKyAqIFhNUl9GU19FUlIgd2lsbCBiZSBzZXQgaWYKKyAqCVhNUl9GU19GQ1NfRVJSLCBYTVJfRlNfTE5HX0VSUiwgWE1SX0ZTX1JVTlQsCisgKglYTVJfRlNfRlJBX0VSUiwgWE1SX0ZTX0xFTl9FUlIsIG9yIFhNUl9GU19DRVhfRVJSCisgKiBpcyBzZXQuIFhNUl9GU19MTkdfRVJSIGFuZCBYTVJfRlNfTEVOX0VSUiB3aWxsIGlzc3VlCisgKiBYTVJfRlNfRVJSIHVubGVzcyB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIFJlY2VpdmUgQ29tbWFuZAorICogUmVnaXN0ZXIgaXMgc2V0LgorICovCit9OworCisvKgorLCogWE1BQy1QSFkgUmVnaXN0ZXJzLCBpbmRpcmVjdCBhZGRyZXNzZWQgb3ZlciB0aGUgWE1BQworICovCitlbnVtIHsKKwlQSFlfWE1BQ19DVFJMCQk9IDB4MDAsLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworCVBIWV9YTUFDX1NUQVQJCT0gMHgwMSwvKiAxNiBiaXQgci93CVBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlQSFlfWE1BQ19JRDAJCT0gMHgwMiwvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKwlQSFlfWE1BQ19JRDEJCT0gMHgwMywvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKwlQSFlfWE1BQ19BVU5FX0FEVgk9IDB4MDQsLyogMTYgYml0IHIvdwlBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworCVBIWV9YTUFDX0FVTkVfTFAJPSAweDA1LC8qIDE2IGJpdCByL28JTGluayBQYXJ0bmVyIEFiaSBSZWcgKi8KKwlQSFlfWE1BQ19BVU5FX0VYUAk9IDB4MDYsLyogMTYgYml0IHIvbwlBdXRvLU5lZy4gRXhwYW5zaW9uIFJlZyAqLworCVBIWV9YTUFDX05FUEcJCT0gMHgwNywvKiAxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqLworCVBIWV9YTUFDX05FUEdfTFAJPSAweDA4LC8qIDE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqLworCisJUEhZX1hNQUNfRVhUX1NUQVQJPSAweDBmLC8qIDE2IGJpdCByL28JRXh0IFN0YXR1cyBSZWdpc3RlciAqLworCVBIWV9YTUFDX1JFU19BQkkJPSAweDEwLC8qIDE2IGJpdCByL28JUEhZIFJlc29sdmVkIEFiaWxpdHkgKi8KK307CisvKgorICogQnJvYWRjb20tUEhZIFJlZ2lzdGVycywgaW5kaXJlY3QgYWRkcmVzc2VkIG92ZXIgWE1BQworICovCitlbnVtIHsKKwlQSFlfQkNPTV9DVFJMCQk9IDB4MDAsLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworCVBIWV9CQ09NX1NUQVQJCT0gMHgwMSwvKiAxNiBiaXQgci9vCVBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlQSFlfQkNPTV9JRDAJCT0gMHgwMiwvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKwlQSFlfQkNPTV9JRDEJCT0gMHgwMywvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKwlQSFlfQkNPTV9BVU5FX0FEVgk9IDB4MDQsLyogMTYgYml0IHIvdwlBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworCVBIWV9CQ09NX0FVTkVfTFAJPSAweDA1LC8qIDE2IGJpdCByL28JTGluayBQYXJ0IEFiaWxpdHkgUmVnICovCisJUEhZX0JDT01fQVVORV9FWFAJPSAweDA2LC8qIDE2IGJpdCByL28JQXV0by1OZWcuIEV4cGFuc2lvbiBSZWcgKi8KKwlQSFlfQkNPTV9ORVBHCQk9IDB4MDcsLyogMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKwlQSFlfQkNPTV9ORVBHX0xQCT0gMHgwOCwvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKi8KKwkvKiBCcm9hZGNvbS1zcGVjaWZpYyByZWdpc3RlcnMgKi8KKwlQSFlfQkNPTV8xMDAwVF9DVFJMCT0gMHgwOSwvKiAxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKi8KKwlQSFlfQkNPTV8xMDAwVF9TVEFUCT0gMHgwYSwvKiAxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqLworCVBIWV9CQ09NX0VYVF9TVEFUCT0gMHgwZiwvKiAxNiBiaXQgci9vCUV4dGVuZGVkIFN0YXR1cyBSZWcgKi8KKwlQSFlfQkNPTV9QX0VYVF9DVFJMCT0gMHgxMCwvKiAxNiBiaXQgci93CVBIWSBFeHRlbmRlZCBDdHJsIFJlZyAqLworCVBIWV9CQ09NX1BfRVhUX1NUQVQJPSAweDExLC8qIDE2IGJpdCByL28JUEhZIEV4dGVuZGVkIFN0YXQgUmVnICovCisJUEhZX0JDT01fUkVfQ1RSCQk9IDB4MTIsLyogMTYgYml0IHIvdwlSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKwlQSFlfQkNPTV9GQ19DVFIJCT0gMHgxMywvKiAxNiBiaXQgci93CUZhbHNlIENhcnJpZXIgU2Vuc2UgQ250ICovCisJUEhZX0JDT01fUk5PX0NUUgk9IDB4MTQsLyogMTYgYml0IHIvdwlSZWNlaXZlciBOT1RfT0sgQ250ICovCisKKwlQSFlfQkNPTV9BVVhfQ1RSTAk9IDB4MTgsLyogMTYgYml0IHIvdwlBdXhpbGlhcnkgQ29udHJvbCBSZWcgKi8KKwlQSFlfQkNPTV9BVVhfU1RBVAk9IDB4MTksLyogMTYgYml0IHIvbwlBdXhpbGlhcnkgU3RhdCBTdW1tYXJ5ICovCisJUEhZX0JDT01fSU5UX1NUQVQJPSAweDFhLC8qIDE2IGJpdCByL28JSW50ZXJydXB0IFN0YXR1cyBSZWcgKi8KKwlQSFlfQkNPTV9JTlRfTUFTSwk9IDB4MWIsLyogMTYgYml0IHIvdwlJbnRlcnJ1cHQgTWFzayBSZWcgKi8KK307CisKKy8qCisgKiBNYXJ2ZWwtUEhZIFJlZ2lzdGVycywgaW5kaXJlY3QgYWRkcmVzc2VkIG92ZXIgR01BQworICovCitlbnVtIHsKKwlQSFlfTUFSVl9DVFJMCQk9IDB4MDAsLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworCVBIWV9NQVJWX1NUQVQJCT0gMHgwMSwvKiAxNiBiaXQgci9vCVBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlQSFlfTUFSVl9JRDAJCT0gMHgwMiwvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKwlQSFlfTUFSVl9JRDEJCT0gMHgwMywvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKwlQSFlfTUFSVl9BVU5FX0FEVgk9IDB4MDQsLyogMTYgYml0IHIvdwlBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworCVBIWV9NQVJWX0FVTkVfTFAJPSAweDA1LC8qIDE2IGJpdCByL28JTGluayBQYXJ0IEFiaWxpdHkgUmVnICovCisJUEhZX01BUlZfQVVORV9FWFAJPSAweDA2LC8qIDE2IGJpdCByL28JQXV0by1OZWcuIEV4cGFuc2lvbiBSZWcgKi8KKwlQSFlfTUFSVl9ORVBHCQk9IDB4MDcsLyogMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKwlQSFlfTUFSVl9ORVBHX0xQCT0gMHgwOCwvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKi8KKwkvKiBNYXJ2ZWwtc3BlY2lmaWMgcmVnaXN0ZXJzICovCisJUEhZX01BUlZfMTAwMFRfQ1RSTAk9IDB4MDksLyogMTYgYml0IHIvdwkxMDAwQmFzZS1UIENvbnRyb2wgUmVnICovCisJUEhZX01BUlZfMTAwMFRfU1RBVAk9IDB4MGEsLyogMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKwlQSFlfTUFSVl9FWFRfU1RBVAk9IDB4MGYsLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnICovCisJUEhZX01BUlZfUEhZX0NUUkwJPSAweDEwLC8qIDE2IGJpdCByL3cJUEhZIFNwZWNpZmljIEN0cmwgUmVnICovCisJUEhZX01BUlZfUEhZX1NUQVQJPSAweDExLC8qIDE2IGJpdCByL28JUEhZIFNwZWNpZmljIFN0YXQgUmVnICovCisJUEhZX01BUlZfSU5UX01BU0sJPSAweDEyLC8qIDE2IGJpdCByL3cJSW50ZXJydXB0IE1hc2sgUmVnICovCisJUEhZX01BUlZfSU5UX1NUQVQJPSAweDEzLC8qIDE2IGJpdCByL28JSW50ZXJydXB0IFN0YXR1cyBSZWcgKi8KKwlQSFlfTUFSVl9FWFRfQ1RSTAk9IDB4MTQsLyogMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjaWZpYyBDdHJsICovCisJUEhZX01BUlZfUlhFX0NOVAk9IDB4MTUsLyogMTYgYml0IHIvdwlSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKwlQSFlfTUFSVl9FWFRfQURSCT0gMHgxNiwvKiAxNiBiaXQgci93CUV4dC4gQWQuIGZvciBDYWJsZSBEaWFnLiAqLworCVBIWV9NQVJWX1BPUlRfSVJRCT0gMHgxNywvKiAxNiBiaXQgci9vCVBvcnQgMCBJUlEgKDg4RTExMTEgb25seSkgKi8KKwlQSFlfTUFSVl9MRURfQ1RSTAk9IDB4MTgsLyogMTYgYml0IHIvdwlMRUQgQ29udHJvbCBSZWcgKi8KKwlQSFlfTUFSVl9MRURfT1ZFUgk9IDB4MTksLyogMTYgYml0IHIvdwlNYW51YWwgTEVEIE92ZXJyaWRlIFJlZyAqLworCVBIWV9NQVJWX0VYVF9DVFJMXzIJPSAweDFhLC8qIDE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgQ3RybCAyICovCisJUEhZX01BUlZfRVhUX1BfU1RBVAk9IDB4MWIsLyogMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjLiBTdGF0IFJlZyAqLworCVBIWV9NQVJWX0NBQkxFX0RJQUcJPSAweDFjLC8qIDE2IGJpdCByL28JQ2FibGUgRGlhZ25vc3RpYyBSZWcgKi8KKwlQSFlfTUFSVl9QQUdFX0FERFIJPSAweDFkLC8qIDE2IGJpdCByL3cJRXh0ZW5kZWQgUGFnZSBBZGRyZXNzIFJlZyAqLworCVBIWV9NQVJWX1BBR0VfREFUQQk9IDB4MWUsLyogMTYgYml0IHIvdwlFeHRlbmRlZCBQYWdlIERhdGEgUmVnICovCisKKy8qIGZvciAxMC8xMDAgRmFzdCBFdGhlcm5ldCBQSFkgKDg4RTMwODIgb25seSkgKi8KKwlQSFlfTUFSVl9GRV9MRURfUEFSCT0gMHgxNiwvKiAxNiBiaXQgci93CUxFRCBQYXJhbGxlbCBTZWxlY3QgUmVnLiAqLworCVBIWV9NQVJWX0ZFX0xFRF9TRVIJPSAweDE3LC8qIDE2IGJpdCByL3cJTEVEIFN0cmVhbSBTZWxlY3QgUy4gTEVEICovCisJUEhZX01BUlZfRkVfVkNUX1RYCT0gMHgxYSwvKiAxNiBiaXQgci93CVZDVCBSZWcuIGZvciBUWFAvTiBQaW5zICovCisJUEhZX01BUlZfRkVfVkNUX1JYCT0gMHgxYiwvKiAxNiBiaXQgci9vCVZDVCBSZWcuIGZvciBSWFAvTiBQaW5zICovCisJUEhZX01BUlZfRkVfU1BFQ18yCT0gMHgxYywvKiAxNiBiaXQgci93CVNwZWNpZmljIENvbnRyb2wgUmVnLiAyICovCit9OworCitlbnVtIHsKKwlQSFlfQ1RfUkVTRVQJPSAxPDwxNSwgLyogQml0IDE1OiAoc2MpCWNsZWFyIGFsbCBQSFkgcmVsYXRlZCByZWdzICovCisJUEhZX0NUX0xPT1AJPSAxPDwxNCwgLyogQml0IDE0OgllbmFibGUgTG9vcGJhY2sgb3ZlciBQSFkgKi8KKwlQSFlfQ1RfU1BTX0xTQgk9IDE8PDEzLCAvKiBCaXQgMTM6CVNwZWVkIHNlbGVjdCwgbG93ZXIgYml0ICovCisJUEhZX0NUX0FORQk9IDE8PDEyLCAvKiBCaXQgMTI6CUF1dG8tTmVnb3RpYXRpb24gRW5hYmxlZCAqLworCVBIWV9DVF9QRE9XTgk9IDE8PDExLCAvKiBCaXQgMTE6CVBvd2VyIERvd24gTW9kZSAqLworCVBIWV9DVF9JU09MCT0gMTw8MTAsIC8qIEJpdCAxMDoJSXNvbGF0ZSBNb2RlICovCisJUEhZX0NUX1JFX0NGRwk9IDE8PDksIC8qIEJpdCAgOToJKHNjKSBSZXN0YXJ0IEF1dG8tTmVnb3RpYXRpb24gKi8KKwlQSFlfQ1RfRFVQX01ECT0gMTw8OCwgLyogQml0ICA4OglEdXBsZXggTW9kZSAqLworCVBIWV9DVF9DT0xfVFNUCT0gMTw8NywgLyogQml0ICA3OglDb2xsaXNpb24gVGVzdCBlbmFibGVkICovCisJUEhZX0NUX1NQU19NU0IJPSAxPDw2LCAvKiBCaXQgIDY6CVNwZWVkIHNlbGVjdCwgdXBwZXIgYml0ICovCit9OworCitlbnVtIHsKKwlQSFlfQ1RfU1AxMDAwCT0gUEhZX0NUX1NQU19NU0IsIC8qIGVuYWJsZSBzcGVlZCBvZiAxMDAwIE1icHMgKi8KKwlQSFlfQ1RfU1AxMDAJPSBQSFlfQ1RfU1BTX0xTQiwgLyogZW5hYmxlIHNwZWVkIG9mICAxMDAgTWJwcyAqLworCVBIWV9DVF9TUDEwCT0gMCwJCSAgLyogZW5hYmxlIHNwZWVkIG9mICAgMTAgTWJwcyAqLworfTsKKworZW51bSB7CisJUEhZX1NUX0VYVF9TVAk9IDE8PDgsIC8qIEJpdCAgODoJRXh0ZW5kZWQgU3RhdHVzIFByZXNlbnQgKi8KKworCVBIWV9TVF9QUkVfU1VQCT0gMTw8NiwgLyogQml0ICA2OglQcmVhbWJsZSBTdXBwcmVzc2lvbiAqLworCVBIWV9TVF9BTl9PVkVSCT0gMTw8NSwgLyogQml0ICA1OglBdXRvLU5lZ290aWF0aW9uIE92ZXIgKi8KKwlQSFlfU1RfUkVNX0ZMVAk9IDE8PDQsIC8qIEJpdCAgNDoJUmVtb3RlIEZhdWx0IENvbmRpdGlvbiBPY2N1cmVkICovCisJUEhZX1NUX0FOX0NBUAk9IDE8PDMsIC8qIEJpdCAgMzoJQXV0by1OZWdvdGlhdGlvbiBDYXBhYmlsaXR5ICovCisJUEhZX1NUX0xTWU5DCT0gMTw8MiwgLyogQml0ICAyOglMaW5rIFN5bmNocm9uaXplZCAqLworCVBIWV9TVF9KQUJfREVUCT0gMTw8MSwgLyogQml0ICAxOglKYWJiZXIgRGV0ZWN0ZWQgKi8KKwlQSFlfU1RfRVhUX1JFRwk9IDE8PDAsIC8qIEJpdCAgMDoJRXh0ZW5kZWQgUmVnaXN0ZXIgYXZhaWxhYmxlICovCit9OworCitlbnVtIHsKKwlQSFlfSTFfT1VJX01TSwk9IDB4M2Y8PDEwLCAvKiBCaXQgMTUuLjEwOglPcmdhbml6YXRpb24gVW5pcXVlIElEICovCisJUEhZX0kxX01PRF9OVU0JPSAweDNmPDw0LCAvKiBCaXQgIDkuLiA0OglNb2RlbCBOdW1iZXIgKi8KKwlQSFlfSTFfUkVWX01TSwk9IDB4ZiwgLyogQml0ICAzLi4gMDoJUmV2aXNpb24gTnVtYmVyICovCit9OworCisvKiBkaWZmZXJlbnQgQnJvYWRjb20gUEhZIElkcyAqLworZW51bSB7CisJUEhZX0JDT01fSUQxX0ExCT0gMHg2MDQxLAorCVBIWV9CQ09NX0lEMV9CMiA9IDB4NjA0MywKKwlQSFlfQkNPTV9JRDFfQzAJPSAweDYwNDQsCisJUEhZX0JDT01fSUQxX0M1CT0gMHg2MDQ3LAorfTsKKworLyogZGlmZmVyZW50IE1hcnZlbGwgUEhZIElkcyAqLworZW51bSB7CisJUEhZX01BUlZfSUQwX1ZBTD0gMHgwMTQxLCAvKiBNYXJ2ZWxsIFVuaXF1ZSBJZGVudGlmaWVyICovCisJUEhZX01BUlZfSUQxX0IwCT0gMHgwQzIzLCAvKiBZdWtvbiAoUEhZIDg4RTEwMTEpICovCisJUEhZX01BUlZfSUQxX0IyCT0gMHgwQzI1LCAvKiBZdWtvbi1QbHVzIChQSFkgODhFMTAxMSkgKi8KKwlQSFlfTUFSVl9JRDFfQzIJPSAweDBDQzIsIC8qIFl1a29uLUVDIChQSFkgODhFMTExMSkgKi8KKwlQSFlfTUFSVl9JRDFfWTIJPSAweDBDOTEsIC8qIFl1a29uLTIgKFBIWSA4OEUxMTEyKSAqLworfTsKKworLyogQWR2ZXJ0aXNlbWVudCByZWdpc3RlciBiaXRzICovCitlbnVtIHsKKwlQSFlfQU5fTlhUX1BHCT0gMTw8MTUsIC8qIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKwlQSFlfQU5fQUNLCT0gMTw8MTQsIC8qIEJpdCAxNDoJKHJvKSBBY2tub3dsZWRnZSBSZWNlaXZlZCAqLworCVBIWV9BTl9SRgk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCBCaXRzICovCisKKwlQSFlfQU5fUEFVU0VfQVNZTSA9IDE8PDExLC8qIEJpdCAxMToJVHJ5IGZvciBhc3ltbWV0cmljICovCisJUEhZX0FOX1BBVVNFX0NBUCA9IDE8PDEwLCAvKiBCaXQgMTA6CVRyeSBmb3IgcGF1c2UgKi8KKwlQSFlfQU5fMTAwQkFTRTQJPSAxPDw5LCAvKiBCaXQgOToJVHJ5IGZvciAxMDBtYnBzIDRrIHBhY2tldHMgKi8KKwlQSFlfQU5fMTAwRlVMTAk9IDE8PDgsIC8qIEJpdCA4OglUcnkgZm9yIDEwMG1icHMgZnVsbC1kdXBsZXggKi8KKwlQSFlfQU5fMTAwSEFMRgk9IDE8PDcsIC8qIEJpdCA3OglUcnkgZm9yIDEwMG1icHMgaGFsZi1kdXBsZXggKi8KKwlQSFlfQU5fMTBGVUxMCT0gMTw8NiwgLyogQml0IDY6CVRyeSBmb3IgMTBtYnBzIGZ1bGwtZHVwbGV4ICovCisJUEhZX0FOXzEwSEFMRgk9IDE8PDUsIC8qIEJpdCA1OglUcnkgZm9yIDEwbWJwcyBoYWxmLWR1cGxleCAqLworCVBIWV9BTl9DU01BCT0gMTw8MCwgLyogQml0IDA6CU9ubHkgc2VsZWN0b3Igc3VwcG9ydGVkICovCisJUEhZX0FOX1NFTAk9IDB4MWYsIC8qIEJpdCA0Li4wOglTZWxlY3RvciBGaWVsZCwgMDAwMDE9RXRoZXJuZXQqLworCVBIWV9BTl9GVUxMCT0gUEhZX0FOXzEwMEZVTEwgfCBQSFlfQU5fMTBGVUxMIHwgUEhZX0FOX0NTTUEsCisJUEhZX0FOX0FMTAk9IFBIWV9BTl8xMEhBTEYgfCBQSFlfQU5fMTBGVUxMIHwKKwkJCSAgUEhZX0FOXzEwMEhBTEYgfCBQSFlfQU5fMTAwRlVMTCwKK307CisKKy8qIFhtYWMgU3BlY2lmaWMgKi8KK2VudW0geworCVBIWV9YX0FOX05YVF9QRwk9IDE8PDE1LCAvKiBCaXQgMTU6CVJlcXVlc3QgTmV4dCBQYWdlICovCisJUEhZX1hfQU5fQUNLCT0gMTw8MTQsIC8qIEJpdCAxNDoJKHJvKSBBY2tub3dsZWRnZSBSZWNlaXZlZCAqLworCVBIWV9YX0FOX1JGQgk9IDM8PDEyLC8qIEJpdCAxMy4uMTI6CVJlbW90ZSBGYXVsdCBCaXRzICovCisKKwlQSFlfWF9BTl9QQVVTRQk9IDM8PDcsLyogQml0ICA4Li4gNzoJUGF1c2UgQml0cyAqLworCVBIWV9YX0FOX0hECT0gMTw8NiwgLyogQml0ICA2OglIYWxmIER1cGxleCAqLworCVBIWV9YX0FOX0ZECT0gMTw8NSwgLyogQml0ICA1OglGdWxsIER1cGxleCAqLworfTsKKworLyogUGF1c2UgQml0cyAoUEhZX1hfQU5fUEFVU0UgYW5kIFBIWV9YX1JTX1BBVVNFKSBlbmNvZGluZyAqLworZW51bSB7CisJUEhZX1hfUF9OT19QQVVTRT0gMDw8NywvKiBCaXQgIDguLjc6CW5vIFBhdXNlIE1vZGUgKi8KKwlQSFlfWF9QX1NZTV9NRAk9IDE8PDcsIC8qIEJpdCAgOC4uNzoJc3ltbWV0cmljIFBhdXNlIE1vZGUgKi8KKwlQSFlfWF9QX0FTWU1fTUQJPSAyPDw3LC8qIEJpdCAgOC4uNzoJYXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisJUEhZX1hfUF9CT1RIX01ECT0gMzw8NywvKiBCaXQgIDguLjc6CWJvdGggUGF1c2UgTW9kZSAqLworfTsKKworCisvKioqKiogIFBIWV9YTUFDX0VYVF9TVEFUCTE2IGJpdCByL3cJRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworZW51bSB7CisJUEhZX1hfRVhfRkQJPSAxPDwxNSwgLyogQml0IDE1OglEZXZpY2UgU3VwcG9ydHMgRnVsbCBEdXBsZXggKi8KKwlQSFlfWF9FWF9IRAk9IDE8PDE0LCAvKiBCaXQgMTQ6CURldmljZSBTdXBwb3J0cyBIYWxmIER1cGxleCAqLworfTsKKworLyoqKioqICBQSFlfWE1BQ19SRVNfQUJJCTE2IGJpdCByL28JUEhZIFJlc29sdmVkIEFiaWxpdHkgKioqKiovCitlbnVtIHsKKwlQSFlfWF9SU19QQVVTRQk9IDM8PDcsCS8qIEJpdCAgOC4uNzoJc2VsZWN0ZWQgUGF1c2UgTW9kZSAqLworCVBIWV9YX1JTX0hECT0gMTw8NiwJLyogQml0ICA2OglIYWxmIER1cGxleCBNb2RlIHNlbGVjdGVkICovCisJUEhZX1hfUlNfRkQJPSAxPDw1LAkvKiBCaXQgIDU6CUZ1bGwgRHVwbGV4IE1vZGUgc2VsZWN0ZWQgKi8KKwlQSFlfWF9SU19BQkxNSVMgPSAxPDw0LAkvKiBCaXQgIDQ6CWR1cGxleCBvciBwYXVzZSBjYXAgbWlzbWF0Y2ggKi8KKwlQSFlfWF9SU19QQVVNSVMgPSAxPDwzLAkvKiBCaXQgIDM6CXBhdXNlIGNhcGFiaWxpdHkgbWlzbWF0Y2ggKi8KK307CisKKy8qIFJlbW90ZSBGYXVsdCBCaXRzIChQSFlfWF9BTl9SRkIpIGVuY29kaW5nICovCitlbnVtIHsKKwlYX1JGQl9PSwk9IDA8PDEyLC8qIEJpdCAxMy4uMTIJTm8gZXJyb3JzLCBMaW5rIE9LICovCisJWF9SRkJfTEYJPSAxPDwxMiwvKiBCaXQgMTMuLjEyCUxpbmsgRmFpbHVyZSAqLworCVhfUkZCX09GRgk9IDI8PDEyLC8qIEJpdCAxMy4uMTIJT2ZmbGluZSAqLworCVhfUkZCX0FOX0VSUgk9IDM8PDEyLC8qIEJpdCAxMy4uMTIJQXV0by1OZWdvdGlhdGlvbiBFcnJvciAqLworfTsKKworLyogQnJvYWRjb20tU3BlY2lmaWMgKi8KKy8qKioqKiAgUEhZX0JDT01fMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCitlbnVtIHsKKwlQSFlfQl8xMDAwQ19URVNUCT0gNzw8MTMsLyogQml0IDE1Li4xMzoJVGVzdCBNb2RlcyAqLworCVBIWV9CXzEwMDBDX01TRQk9IDE8PDEyLCAvKiBCaXQgMTI6CU1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKwlQSFlfQl8xMDAwQ19NU0MJPSAxPDwxMSwgLyogQml0IDExOglNL1MgQ29uZmlndXJhdGlvbiAqLworCVBIWV9CXzEwMDBDX1JECT0gMTw8MTAsIC8qIEJpdCAxMDoJUmVwZWF0ZXIvRFRFICovCisJUEhZX0JfMTAwMENfQUZECT0gMTw8OSwgLyogQml0ICA5OglBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KKwlQSFlfQl8xMDAwQ19BSEQJPSAxPDw4LCAvKiBCaXQgIDg6CUFkdmVydGlzZSBIYWxmIER1cGxleCAqLworfTsKKworLyoqKioqICBQSFlfQkNPTV8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLworLyoqKioqICBQSFlfTUFSVl8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLworZW51bSB7CisJUEhZX0JfMTAwMFNfTVNGCT0gMTw8MTUsIC8qIEJpdCAxNToJTWFzdGVyL1NsYXZlIEZhdWx0ICovCisJUEhZX0JfMTAwMFNfTVNSCT0gMTw8MTQsIC8qIEJpdCAxNDoJTWFzdGVyL1NsYXZlIFJlc3VsdCAqLworCVBIWV9CXzEwMDBTX0xSUwk9IDE8PDEzLCAvKiBCaXQgMTM6CUxvY2FsIFJlY2VpdmVyIFN0YXR1cyAqLworCVBIWV9CXzEwMDBTX1JSUwk9IDE8PDEyLCAvKiBCaXQgMTI6CVJlbW90ZSBSZWNlaXZlciBTdGF0dXMgKi8KKwlQSFlfQl8xMDAwU19MUF9GRAk9IDE8PDExLCAvKiBCaXQgMTE6CUxpbmsgUGFydG5lciBjYW4gRkQgKi8KKwlQSFlfQl8xMDAwU19MUF9IRAk9IDE8PDEwLCAvKiBCaXQgMTA6CUxpbmsgUGFydG5lciBjYW4gSEQgKi8KKwkJCQkJCQkJCS8qIEJpdCAgOS4uODoJcmVzZXJ2ZWQgKi8KKwlQSFlfQl8xMDAwU19JRUMJPSAweGZmLCAvKiBCaXQgIDcuLjA6CUlkbGUgRXJyb3IgQ291bnQgKi8KK307CisKKy8qKioqKiAgUEhZX0JDT01fRVhUX1NUQVQJMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCitlbnVtIHsKKwlQSFlfQl9FU19YX0ZEX0NBUAk9IDE8PDE1LCAvKiBCaXQgMTU6CTEwMDBCYXNlLVggRkQgY2FwYWJsZSAqLworCVBIWV9CX0VTX1hfSERfQ0FQCT0gMTw8MTQsIC8qIEJpdCAxNDoJMTAwMEJhc2UtWCBIRCBjYXBhYmxlICovCisJUEhZX0JfRVNfVF9GRF9DQVAJPSAxPDwxMywgLyogQml0IDEzOgkxMDAwQmFzZS1UIEZEIGNhcGFibGUgKi8KKwlQSFlfQl9FU19UX0hEX0NBUAk9IDE8PDEyLCAvKiBCaXQgMTI6CTEwMDBCYXNlLVQgSEQgY2FwYWJsZSAqLworfTsKKworLyoqKioqICBQSFlfQkNPTV9QX0VYVF9DVFJMCTE2IGJpdCByL3cJUEhZIEV4dGVuZGVkIENvbnRyb2wgUmVnICoqKioqLworZW51bSB7CisJUEhZX0JfUEVDX01BQ19QSFkJPSAxPDwxNSwgLyogQml0IDE1OgkxMEJJVC9HTUktSW50ZXJmYWNlICovCisJUEhZX0JfUEVDX0RJU19DUk9TUwk9IDE8PDE0LCAvKiBCaXQgMTQ6CURpc2FibGUgTURJIENyb3Nzb3ZlciAqLworCVBIWV9CX1BFQ19UWF9ESVMJPSAxPDwxMywgLyogQml0IDEzOglUeCBvdXRwdXQgRGlzYWJsZWQgKi8KKwlQSFlfQl9QRUNfSU5UX0RJUwk9IDE8PDEyLCAvKiBCaXQgMTI6CUludGVycnVwdHMgRGlzYWJsZWQgKi8KKwlQSFlfQl9QRUNfRl9JTlQJPSAxPDwxMSwgLyogQml0IDExOglGb3JjZSBJbnRlcnJ1cHQgKi8KKwlQSFlfQl9QRUNfQllfNDUJPSAxPDwxMCwgLyogQml0IDEwOglCeXBhc3MgNEI1Qi1EZWNvZGVyICovCisJUEhZX0JfUEVDX0JZX1NDUgk9IDE8PDksIC8qIEJpdCAgOToJQnlwYXNzIFNjcmFtYmxlciAqLworCVBIWV9CX1BFQ19CWV9NTFQzCT0gMTw8OCwgLyogQml0ICA4OglCeXBhc3MgTUxUMyBFbmNvZGVyICovCisJUEhZX0JfUEVDX0JZX1JYQQk9IDE8PDcsIC8qIEJpdCAgNzoJQnlwYXNzIFJ4IEFsaWdubS4gKi8KKwlQSFlfQl9QRUNfUkVTX1NDUgk9IDE8PDYsIC8qIEJpdCAgNjoJUmVzZXQgU2NyYW1ibGVyICovCisJUEhZX0JfUEVDX0VOX0xUUgk9IDE8PDUsIC8qIEJpdCAgNToJRW5hIExFRCBUcmFmZmljIE1vZGUgKi8KKwlQSFlfQl9QRUNfTEVEX09OCT0gMTw8NCwgLyogQml0ICA0OglGb3JjZSBMRUQncyBvbiAqLworCVBIWV9CX1BFQ19MRURfT0ZGCT0gMTw8MywgLyogQml0ICAzOglGb3JjZSBMRUQncyBvZmYgKi8KKwlQSFlfQl9QRUNfRVhfSVBHCT0gMTw8MiwgLyogQml0ICAyOglFeHRlbmQgVHggSVBHIE1vZGUgKi8KKwlQSFlfQl9QRUNfM19MRUQJPSAxPDwxLCAvKiBCaXQgIDE6CVRocmVlIExpbmsgTEVEIG1vZGUgKi8KKwlQSFlfQl9QRUNfSElHSF9MQQk9IDE8PDAsIC8qIEJpdCAgMDoJR01JSSBGSUZPIEVsYXN0aWN5ICovCit9OworCisvKioqKiogIFBIWV9CQ09NX1BfRVhUX1NUQVQJMTYgYml0IHIvbwlQSFkgRXh0ZW5kZWQgU3RhdHVzIFJlZyAqKioqKi8KK2VudW0geworCVBIWV9CX1BFU19DUk9TU19TVEFUCT0gMTw8MTMsIC8qIEJpdCAxMzoJTURJIENyb3Nzb3ZlciBTdGF0dXMgKi8KKwlQSFlfQl9QRVNfSU5UX1NUQVQJPSAxPDwxMiwgLyogQml0IDEyOglJbnRlcnJ1cHQgU3RhdHVzICovCisJUEhZX0JfUEVTX1JSUwk9IDE8PDExLCAvKiBCaXQgMTE6CVJlbW90ZSBSZWNlaXZlciBTdGF0LiAqLworCVBIWV9CX1BFU19MUlMJPSAxPDwxMCwgLyogQml0IDEwOglMb2NhbCBSZWNlaXZlciBTdGF0LiAqLworCVBIWV9CX1BFU19MT0NLRUQJPSAxPDw5LCAvKiBCaXQgIDk6CUxvY2tlZCAqLworCVBIWV9CX1BFU19MUwk9IDE8PDgsIC8qIEJpdCAgODoJTGluayBTdGF0dXMgKi8KKwlQSFlfQl9QRVNfUkYJPSAxPDw3LCAvKiBCaXQgIDc6CVJlbW90ZSBGYXVsdCAqLworCVBIWV9CX1BFU19DRV9FUgk9IDE8PDYsIC8qIEJpdCAgNjoJQ2FycmllciBFeHQgRXJyb3IgKi8KKwlQSFlfQl9QRVNfQkFEX1NTRAk9IDE8PDUsIC8qIEJpdCAgNToJQmFkIFNTRCAqLworCVBIWV9CX1BFU19CQURfRVNECT0gMTw8NCwgLyogQml0ICA0OglCYWQgRVNEICovCisJUEhZX0JfUEVTX1JYX0VSCT0gMTw8MywgLyogQml0ICAzOglSZWNlaXZlIEVycm9yICovCisJUEhZX0JfUEVTX1RYX0VSCT0gMTw8MiwgLyogQml0ICAyOglUcmFuc21pdCBFcnJvciAqLworCVBIWV9CX1BFU19MT0NLX0VSCT0gMTw8MSwgLyogQml0ICAxOglMb2NrIEVycm9yICovCisJUEhZX0JfUEVTX01MVDNfRVIJPSAxPDwwLCAvKiBCaXQgIDA6CU1MVDMgY29kZSBFcnJvciAqLworfTsKKworLyogIFBIWV9CQ09NX0FVTkVfQURWCTE2IGJpdCByL3cJQXV0by1OZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50ICoqKioqLworLyogIFBIWV9CQ09NX0FVTkVfTFAJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCitlbnVtIHsKKwlQSFlfQl9BTl9SRgk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCAqLworCisJUEhZX0JfQU5fQVNQCT0gMTw8MTEsIC8qIEJpdCAxMToJQXN5bW1ldHJpYyBQYXVzZSAqLworCVBIWV9CX0FOX1BDCT0gMTw8MTAsIC8qIEJpdCAxMDoJUGF1c2UgQ2FwYWJsZSAqLworfTsKKworCisvKioqKiogIFBIWV9CQ09NX0ZDX0NUUgkJMTYgYml0IHIvdwlGYWxzZSBDYXJyaWVyIENvdW50ZXIgKioqKiovCitlbnVtIHsKKwlQSFlfQl9GQ19DVFIJPSAweGZmLCAvKiBCaXQgIDcuLjA6CUZhbHNlIENhcnJpZXIgQ291bnRlciAqLworCisvKioqKiogIFBIWV9CQ09NX1JOT19DVFIJMTYgYml0IHIvdwlSZWNlaXZlIE5PVF9PSyBDb3VudGVyICoqKioqLworCVBIWV9CX1JDX0xPQ19NU0sJPSAweGZmMDAsIC8qIEJpdCAxNS4uODoJTG9jYWwgUnggTk9UX09LIGNudCAqLworCVBIWV9CX1JDX1JFTV9NU0sJPSAweDAwZmYsIC8qIEJpdCAgNy4uMDoJUmVtb3RlIFJ4IE5PVF9PSyBjbnQgKi8KKworLyoqKioqICBQSFlfQkNPTV9BVVhfQ1RSTAkxNiBiaXQgci93CUF1eGlsaWFyeSBDb250cm9sIFJlZyAqKioqKi8KKwlQSFlfQl9BQ19MX1NRRQkJPSAxPDwxNSwgLyogQml0IDE1OglMb3cgU3F1ZWxjaCAqLworCVBIWV9CX0FDX0xPTkdfUEFDSwk9IDE8PDE0LCAvKiBCaXQgMTQ6CVJ4IExvbmcgUGFja2V0cyAqLworCVBIWV9CX0FDX0VSX0NUUkwJPSAzPDwxMiwvKiBCaXQgMTMuLjEyOglFZGdlcmF0ZSBDb250cm9sICovCisJCQkJCQkJCQkvKiBCaXQgMTE6CXJlc2VydmVkICovCisJUEhZX0JfQUNfVFhfVFNUCT0gMTw8MTAsIC8qIEJpdCAxMDoJVHggdGVzdCBiaXQsIGFsd2F5cyAxICovCisJCQkJCQkJCQkvKiBCaXQgIDkuLiA4OglyZXNlcnZlZCAqLworCVBIWV9CX0FDX0RJU19QUkYJPSAxPDw3LCAvKiBCaXQgIDc6CWRpcyBwYXJ0IHJlc3AgZmlsdGVyICovCisJCQkJCQkJCQkvKiBCaXQgIDY6CXJlc2VydmVkICovCisJUEhZX0JfQUNfRElTX1BNCT0gMTw8NSwgLyogQml0ICA1OglkaXMgcG93ZXIgbWFuYWdlbWVudCAqLworCQkJCQkJCQkJLyogQml0ICA0OglyZXNlcnZlZCAqLworCVBIWV9CX0FDX0RJQUcJPSAxPDwzLCAvKiBCaXQgIDM6CURpYWdub3N0aWMgTW9kZSAqLworfTsKKworLyoqKioqICBQSFlfQkNPTV9BVVhfU1RBVAkxNiBiaXQgci9vCUF1eGlsaWFyeSBTdGF0dXMgUmVnICoqKioqLworZW51bSB7CisJUEhZX0JfQVNfQU5fQwk9IDE8PDE1LCAvKiBCaXQgMTU6CUF1dG9OZWcgY29tcGxldGUgKi8KKwlQSFlfQl9BU19BTl9DQQk9IDE8PDE0LCAvKiBCaXQgMTQ6CUFOIENvbXBsZXRlIEFjayAqLworCVBIWV9CX0FTX0FOQUNLX0QJPSAxPDwxMywgLyogQml0IDEzOglBTiBBY2sgRGV0ZWN0ICovCisJUEhZX0JfQVNfQU5BQl9ECT0gMTw8MTIsIC8qIEJpdCAxMjoJQU4gQWJpbGl0eSBEZXRlY3QgKi8KKwlQSFlfQl9BU19OUFcJPSAxPDwxMSwgLyogQml0IDExOglBTiBOZXh0IFBhZ2UgV2FpdCAqLworCVBIWV9CX0FTX0FOX1JFU19NU0sJPSA3PDw4LC8qIEJpdCAxMC4uODoJQU4gSERDICovCisJUEhZX0JfQVNfUERGCT0gMTw8NywgLyogQml0ICA3OglQYXJhbGxlbCBEZXRlY3QuIEZhdWx0ICovCisJUEhZX0JfQVNfUkYJPSAxPDw2LCAvKiBCaXQgIDY6CVJlbW90ZSBGYXVsdCAqLworCVBIWV9CX0FTX0FOUF9SCT0gMTw8NSwgLyogQml0ICA1OglBTiBQYWdlIFJlY2VpdmVkICovCisJUEhZX0JfQVNfTFBfQU5BQgk9IDE8PDQsIC8qIEJpdCAgNDoJTFAgQU4gQWJpbGl0eSAqLworCVBIWV9CX0FTX0xQX05QQUIJPSAxPDwzLCAvKiBCaXQgIDM6CUxQIE5leHQgUGFnZSBBYmlsaXR5ICovCisJUEhZX0JfQVNfTFMJPSAxPDwyLCAvKiBCaXQgIDI6CUxpbmsgU3RhdHVzICovCisJUEhZX0JfQVNfUFJSCT0gMTw8MSwgLyogQml0ICAxOglQYXVzZSBSZXNvbHV0aW9uLVJ4ICovCisJUEhZX0JfQVNfUFJUCT0gMTw8MCwgLyogQml0ICAwOglQYXVzZSBSZXNvbHV0aW9uLVR4ICovCit9OworI2RlZmluZSBQSFlfQl9BU19QQVVTRV9NU0sJKFBIWV9CX0FTX1BSUiB8IFBIWV9CX0FTX1BSVCkKKworLyoqKioqICBQSFlfQkNPTV9JTlRfU1RBVAkxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnICoqKioqLworLyoqKioqICBQSFlfQkNPTV9JTlRfTUFTSwkxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZyAqKioqKi8KK2VudW0geworCVBIWV9CX0lTX1BTRQk9IDE8PDE0LCAvKiBCaXQgMTQ6CVBhaXIgU3dhcCBFcnJvciAqLworCVBIWV9CX0lTX01EWElfU0MJPSAxPDwxMywgLyogQml0IDEzOglNRElYIFN0YXR1cyBDaGFuZ2UgKi8KKwlQSFlfQl9JU19IQ1QJPSAxPDwxMiwgLyogQml0IDEyOgljb3VudGVyIGFib3ZlIDMyayAqLworCVBIWV9CX0lTX0xDVAk9IDE8PDExLCAvKiBCaXQgMTE6CWNvdW50ZXIgYWJvdmUgMTI4ICovCisJUEhZX0JfSVNfQU5fUFIJPSAxPDwxMCwgLyogQml0IDEwOglQYWdlIFJlY2VpdmVkICovCisJUEhZX0JfSVNfTk9fSERDTAk9IDE8PDksIC8qIEJpdCAgOToJTm8gSENEIExpbmsgKi8KKwlQSFlfQl9JU19OT19IREMJPSAxPDw4LCAvKiBCaXQgIDg6CU5vIEhDRCAqLworCVBIWV9CX0lTX05FR19VU0hEQwk9IDE8PDcsIC8qIEJpdCAgNzoJTmVnb3RpYXRlZCBVbnN1cC4gSENEICovCisJUEhZX0JfSVNfU0NSX1NfRVIJPSAxPDw2LCAvKiBCaXQgIDY6CVNjcmFtYmxlciBTeW5jIEVycm9yICovCisJUEhZX0JfSVNfUlJTX0NIQU5HRQk9IDE8PDUsIC8qIEJpdCAgNToJUmVtb3RlIFJ4IFN0YXQgQ2hhbmdlICovCisJUEhZX0JfSVNfTFJTX0NIQU5HRQk9IDE8PDQsIC8qIEJpdCAgNDoJTG9jYWwgUnggU3RhdCBDaGFuZ2UgKi8KKwlQSFlfQl9JU19EVVBfQ0hBTkdFCT0gMTw8MywgLyogQml0ICAzOglEdXBsZXggTW9kZSBDaGFuZ2UgKi8KKwlQSFlfQl9JU19MU1BfQ0hBTkdFCT0gMTw8MiwgLyogQml0ICAyOglMaW5rIFNwZWVkIENoYW5nZSAqLworCVBIWV9CX0lTX0xTVF9DSEFOR0UJPSAxPDwxLCAvKiBCaXQgIDE6CUxpbmsgU3RhdHVzIENoYW5nZWQgKi8KKwlQSFlfQl9JU19DUkNfRVIJPSAxPDwwLCAvKiBCaXQgIDA6CUNSQyBFcnJvciAqLworfTsKKyNkZWZpbmUgUEhZX0JfREVGX01TSwlcCisJKH4oUEhZX0JfSVNfUFNFIHwgUEhZX0JfSVNfQU5fUFIgfCBQSFlfQl9JU19EVVBfQ0hBTkdFIHwgXAorCSAgICBQSFlfQl9JU19MU1BfQ0hBTkdFIHwgUEhZX0JfSVNfTFNUX0NIQU5HRSkpCisKKy8qIFBhdXNlIEJpdHMgKFBIWV9CX0FOX0FTUCBhbmQgUEhZX0JfQU5fUEMpIGVuY29kaW5nICovCitlbnVtIHsKKwlQSFlfQl9QX05PX1BBVVNFCT0gMDw8MTAsLyogQml0IDExLi4xMDoJbm8gUGF1c2UgTW9kZSAqLworCVBIWV9CX1BfU1lNX01ECT0gMTw8MTAsIC8qIEJpdCAxMS4uMTA6CXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisJUEhZX0JfUF9BU1lNX01ECT0gMjw8MTAsLyogQml0IDExLi4xMDoJYXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisJUEhZX0JfUF9CT1RIX01ECT0gMzw8MTAsLyogQml0IDExLi4xMDoJYm90aCBQYXVzZSBNb2RlICovCit9OworLyoKKyAqIFJlc29sdmVkIER1cGxleCBtb2RlIGFuZCBDYXBhYmlsaXRpZXMgKEF1eCBTdGF0dXMgU3VtbWFyeSBSZWcpCisgKi8KK2VudW0geworCVBIWV9CX1JFU18xMDAwRkQJPSA3PDw4LC8qIEJpdCAxMC4uODoJMTAwMEJhc2UtVCBGdWxsIER1cC4gKi8KKwlQSFlfQl9SRVNfMTAwMEhECT0gNjw8OCwvKiBCaXQgMTAuLjg6CTEwMDBCYXNlLVQgSGFsZiBEdXAuICovCit9OworCisvKiogTWFydmVsbC1TcGVjaWZpYyAqLworZW51bSB7CisJUEhZX01fQU5fTlhUX1BHCT0gMTw8MTUsIC8qIFJlcXVlc3QgTmV4dCBQYWdlICovCisJUEhZX01fQU5fQUNLCT0gMTw8MTQsIC8qIChybykJQWNrbm93bGVkZ2UgUmVjZWl2ZWQgKi8KKwlQSFlfTV9BTl9SRgk9IDE8PDEzLCAvKiBSZW1vdGUgRmF1bHQgKi8KKworCVBIWV9NX0FOX0FTUAk9IDE8PDExLCAvKiBBc3ltbWV0cmljIFBhdXNlICovCisJUEhZX01fQU5fUEMJPSAxPDwxMCwgLyogTUFDIFBhdXNlIGltcGxlbWVudGVkICovCisJUEhZX01fQU5fMTAwX1Q0CT0gMTw8OSwgLyogTm90IGNhcC4gMTAwQmFzZS1UNCAoYWx3YXlzIDApICovCisJUEhZX01fQU5fMTAwX0ZECT0gMTw8OCwgLyogQWR2ZXJ0aXNlIDEwMEJhc2UtVFggRnVsbCBEdXBsZXggKi8KKwlQSFlfTV9BTl8xMDBfSEQJPSAxPDw3LCAvKiBBZHZlcnRpc2UgMTAwQmFzZS1UWCBIYWxmIER1cGxleCAqLworCVBIWV9NX0FOXzEwX0ZECT0gMTw8NiwgLyogQWR2ZXJ0aXNlIDEwQmFzZS1UWCBGdWxsIER1cGxleCAqLworCVBIWV9NX0FOXzEwX0hECT0gMTw8NSwgLyogQWR2ZXJ0aXNlIDEwQmFzZS1UWCBIYWxmIER1cGxleCAqLworCVBIWV9NX0FOX1NFTF9NU0sgPTB4MWY8PDQsCS8qIEJpdCAgNC4uIDA6IFNlbGVjdG9yIEZpZWxkIE1hc2sgKi8KK307CisKKy8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgRklCRVIgKDg4RTEwMTFTIG9ubHkpICovCitlbnVtIHsKKwlQSFlfTV9BTl9BU1BfWAkJPSAxPDw4LCAvKiBBc3ltbWV0cmljIFBhdXNlICovCisJUEhZX01fQU5fUENfWAkJPSAxPDw3LCAvKiBNQUMgUGF1c2UgaW1wbGVtZW50ZWQgKi8KKwlQSFlfTV9BTl8xMDAwWF9BSEQJPSAxPDw2LCAvKiBBZHZlcnRpc2UgMTAwMDBCYXNlLVggSGFsZiBEdXBsZXggKi8KKwlQSFlfTV9BTl8xMDAwWF9BRkQJPSAxPDw1LCAvKiBBZHZlcnRpc2UgMTAwMDBCYXNlLVggRnVsbCBEdXBsZXggKi8KK307CisKKy8qIFBhdXNlIEJpdHMgKFBIWV9NX0FOX0FTUF9YIGFuZCBQSFlfTV9BTl9QQ19YKSBlbmNvZGluZyAqLworZW51bSB7CisJUEhZX01fUF9OT19QQVVTRV9YCT0gMDw8NywvKiBCaXQgIDguLiA3OglubyBQYXVzZSBNb2RlICovCisJUEhZX01fUF9TWU1fTURfWAk9IDE8PDcsIC8qIEJpdCAgOC4uIDc6CXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisJUEhZX01fUF9BU1lNX01EX1gJPSAyPDw3LC8qIEJpdCAgOC4uIDc6CWFzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLworCVBIWV9NX1BfQk9USF9NRF9YCT0gMzw8NywvKiBCaXQgIDguLiA3Oglib3RoIFBhdXNlIE1vZGUgKi8KK307CisKKy8qKioqKiAgUEhZX01BUlZfMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCitlbnVtIHsKKwlQSFlfTV8xMDAwQ19URVNUPSA3PDwxMywvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCisJUEhZX01fMTAwMENfTVNFCT0gMTw8MTIsIC8qIE1hbnVhbCBNYXN0ZXIvU2xhdmUgRW5hYmxlICovCisJUEhZX01fMTAwMENfTVNDCT0gMTw8MTEsIC8qIE0vUyBDb25maWd1cmF0aW9uICgxPU1hc3RlcikgKi8KKwlQSFlfTV8xMDAwQ19NUEQJPSAxPDwxMCwgLyogTXVsdGktUG9ydCBEZXZpY2UgKi8KKwlQSFlfTV8xMDAwQ19BRkQJPSAxPDw5LCAvKiBBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KKwlQSFlfTV8xMDAwQ19BSEQJPSAxPDw4LCAvKiBBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KK307CisKKy8qKioqKiAgUEhZX01BUlZfUEhZX0NUUkwJMTYgYml0IHIvdwlQSFkgU3BlY2lmaWMgQ3RybCBSZWcgKioqKiovCitlbnVtIHsKKwlQSFlfTV9QQ19UWF9GRkRfTVNLCT0gMzw8MTQsLyogQml0IDE1Li4xNDogVHggRklGTyBEZXB0aCBNYXNrICovCisJUEhZX01fUENfUlhfRkZEX01TSwk9IDM8PDEyLC8qIEJpdCAxMy4uMTI6IFJ4IEZJRk8gRGVwdGggTWFzayAqLworCVBIWV9NX1BDX0FTU19DUlNfVFgJPSAxPDwxMSwgLyogQXNzZXJ0IENSUyBvbiBUcmFuc21pdCAqLworCVBIWV9NX1BDX0ZMX0dPT0QJPSAxPDwxMCwgLyogRm9yY2UgTGluayBHb29kICovCisJUEhZX01fUENfRU5fREVUX01TSwk9IDM8PDgsLyogQml0ICA5Li4gODogRW5lcmd5IERldGVjdCBNYXNrICovCisJUEhZX01fUENfRU5BX0VYVF9ECT0gMTw8NywgLyogRW5hYmxlIEV4dC4gRGlzdGFuY2UgKDEwQlQpICovCisJUEhZX01fUENfTURJWF9NU0sJPSAzPDw1LC8qIEJpdCAgNi4uIDU6IE1ESS9NRElYIENvbmZpZy4gTWFzayAqLworCVBIWV9NX1BDX0RJU18xMjVDTEsJPSAxPDw0LCAvKiBEaXNhYmxlIDEyNSBDTEsgKi8KKwlQSFlfTV9QQ19NQUNfUE9XX1VQCT0gMTw8MywgLyogTUFDIFBvd2VyIHVwICovCisJUEhZX01fUENfU1FFX1RfRU5BCT0gMTw8MiwgLyogU1FFIFRlc3QgRW5hYmxlZCAqLworCVBIWV9NX1BDX1BPTF9SX0RJUwk9IDE8PDEsIC8qIFBvbGFyaXR5IFJldmVyc2FsIERpc2FibGVkICovCisJUEhZX01fUENfRElTX0pBQkJFUgk9IDE8PDAsIC8qIERpc2FibGUgSmFiYmVyICovCit9OworCitlbnVtIHsKKwlQSFlfTV9QQ19FTl9ERVQJCT0gMjw8OCwJLyogRW5lcmd5IERldGVjdCAoTW9kZSAxKSAqLworCVBIWV9NX1BDX0VOX0RFVF9QTFVTCT0gMzw8OCwgLyogRW5lcmd5IERldGVjdCBQbHVzIChNb2RlIDIpICovCit9OworCitlbnVtIHsKKwlQSFlfTV9QQ19NQU5fTURJCT0gMCwgLyogMDAgPSBNYW51YWwgTURJIGNvbmZpZ3VyYXRpb24gKi8KKwlQSFlfTV9QQ19NQU5fTURJWAk9IDEsIC8qIDAxID0gTWFudWFsIE1ESVggY29uZmlndXJhdGlvbiAqLworCVBIWV9NX1BDX0VOQV9BVVRPCT0gMywgLyogMTEgPSBFbmFibGUgQXV0b21hdGljIENyb3Nzb3ZlciAqLworfTsKKworLyogZm9yIDEwLzEwMCBGYXN0IEV0aGVybmV0IFBIWSAoODhFMzA4MiBvbmx5KSAqLworZW51bSB7CisJUEhZX01fUENfRU5BX0RURV9EVAk9IDE8PDE1LCAvKiBFbmFibGUgRGF0YSBUZXJtaW5hbCBFcXUuIChEVEUpIERldGVjdCAqLworCVBIWV9NX1BDX0VOQV9FTkVfRFQJPSAxPDwxNCwgLyogRW5hYmxlIEVuZXJneSBEZXRlY3QgKHNlbnNlICYgcHVsc2UpICovCisJUEhZX01fUENfRElTX05MUF9DSwk9IDE8PDEzLCAvKiBEaXNhYmxlIE5vcm1hbCBMaW5rIFB1bHMgKE5MUCkgQ2hlY2sgKi8KKwlQSFlfTV9QQ19FTkFfTElQX05QCT0gMTw8MTIsIC8qIEVuYWJsZSBMaW5rIFBhcnRuZXIgTmV4dCBQYWdlIFJlZy4gKi8KKwlQSFlfTV9QQ19ESVNfTkxQX0dOCT0gMTw8MTEsIC8qIERpc2FibGUgTm9ybWFsIExpbmsgUHVscyBHZW5lcmF0aW9uICovCisKKwlQSFlfTV9QQ19ESVNfU0NSQU1CCT0gMTw8OSwgLyogRGlzYWJsZSBTY3JhbWJsZXIgKi8KKwlQSFlfTV9QQ19ESVNfRkVGSQk9IDE8PDgsIC8qIERpc2FibGUgRmFyIEVuZCBGYXVsdCBJbmRpYy4gKEZFRkkpICovCisKKwlQSFlfTV9QQ19TSF9UUF9TRUwJPSAxPDw2LCAvKiBTaGllbGRlZCBUd2lzdGVkIFBhaXIgU2VsZWN0ICovCisJUEhZX01fUENfUlhfRkRfTVNLCT0gMzw8MiwvKiBCaXQgIDMuLiAyOiBSeCBGSUZPIERlcHRoIE1hc2sgKi8KK307CisKKy8qKioqKiAgUEhZX01BUlZfUEhZX1NUQVQJMTYgYml0IHIvbwlQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZyAqKioqKi8KK2VudW0geworCVBIWV9NX1BTX1NQRUVEX01TSwk9IDM8PDE0LCAvKiBCaXQgMTUuLjE0OiBTcGVlZCBNYXNrICovCisJUEhZX01fUFNfU1BFRURfMTAwMAk9IDE8PDE1LCAvKgkJMTAgPSAxMDAwIE1icHMgKi8KKwlQSFlfTV9QU19TUEVFRF8xMDAJPSAxPDwxNCwgLyoJCTAxID0gIDEwMCBNYnBzICovCisJUEhZX01fUFNfU1BFRURfMTAJPSAwLAkgLyoJCTAwID0gICAxMCBNYnBzICovCisJUEhZX01fUFNfRlVMTF9EVVAJPSAxPDwxMywgLyogRnVsbCBEdXBsZXggKi8KKwlQSFlfTV9QU19QQUdFX1JFQwk9IDE8PDEyLCAvKiBQYWdlIFJlY2VpdmVkICovCisJUEhZX01fUFNfU1BEVVBfUkVTCT0gMTw8MTEsIC8qIFNwZWVkICYgRHVwbGV4IFJlc29sdmVkICovCisJUEhZX01fUFNfTElOS19VUAk9IDE8PDEwLCAvKiBMaW5rIFVwICovCisJUEhZX01fUFNfQ0FCTEVfTVNLCT0gNzw8NywgIC8qIEJpdCAgOS4uIDc6IENhYmxlIExlbmd0aCBNYXNrICovCisJUEhZX01fUFNfTURJX1hfU1RBVAk9IDE8PDYsICAvKiBNREkgQ3Jvc3NvdmVyIFN0YXQgKDE9TURJWCkgKi8KKwlQSFlfTV9QU19ET1dOU19TVEFUCT0gMTw8NSwgIC8qIERvd25zaGlmdCBTdGF0dXMgKDE9ZG93bnNoLikgKi8KKwlQSFlfTV9QU19FTkRFVF9TVEFUCT0gMTw8NCwgIC8qIEVuZXJneSBEZXRlY3QgU3RhdHVzICgxPWFjdCkgKi8KKwlQSFlfTV9QU19UWF9QX0VOCT0gMTw8MywgIC8qIFR4IFBhdXNlIEVuYWJsZWQgKi8KKwlQSFlfTV9QU19SWF9QX0VOCT0gMTw8MiwgIC8qIFJ4IFBhdXNlIEVuYWJsZWQgKi8KKwlQSFlfTV9QU19QT0xfUkVWCT0gMTw8MSwgIC8qIFBvbGFyaXR5IFJldmVyc2VkICovCisJUEhZX01fUFNfSkFCQkVSCQk9IDE8PDAsICAvKiBKYWJiZXIgKi8KK307CisKKyNkZWZpbmUgUEhZX01fUFNfUEFVU0VfTVNLCShQSFlfTV9QU19UWF9QX0VOIHwgUEhZX01fUFNfUlhfUF9FTikKKworLyogZm9yIDEwLzEwMCBGYXN0IEV0aGVybmV0IFBIWSAoODhFMzA4MiBvbmx5KSAqLworZW51bSB7CisJUEhZX01fUFNfRFRFX0RFVEVDVAk9IDE8PDE1LCAvKiBEYXRhIFRlcm1pbmFsIEVxdWlwbWVudCAoRFRFKSBEZXRlY3RlZCAqLworCVBIWV9NX1BTX1JFU19TUEVFRAk9IDE8PDE0LCAvKiBSZXNvbHZlZCBTcGVlZCAoMT0xMDAgTWJwcywgMD0xMCBNYnBzICovCit9OworCitlbnVtIHsKKwlQSFlfTV9JU19BTl9FUlJPUgk9IDE8PDE1LCAvKiBBdXRvLU5lZ290aWF0aW9uIEVycm9yICovCisJUEhZX01fSVNfTFNQX0NIQU5HRQk9IDE8PDE0LCAvKiBMaW5rIFNwZWVkIENoYW5nZWQgKi8KKwlQSFlfTV9JU19EVVBfQ0hBTkdFCT0gMTw8MTMsIC8qIER1cGxleCBNb2RlIENoYW5nZWQgKi8KKwlQSFlfTV9JU19BTl9QUgkJPSAxPDwxMiwgLyogUGFnZSBSZWNlaXZlZCAqLworCVBIWV9NX0lTX0FOX0NPTVBMCT0gMTw8MTEsIC8qIEF1dG8tTmVnb3RpYXRpb24gQ29tcGxldGVkICovCisJUEhZX01fSVNfTFNUX0NIQU5HRQk9IDE8PDEwLCAvKiBMaW5rIFN0YXR1cyBDaGFuZ2VkICovCisJUEhZX01fSVNfU1lNQl9FUlJPUgk9IDE8PDksIC8qIFN5bWJvbCBFcnJvciAqLworCVBIWV9NX0lTX0ZBTFNFX0NBUlIJPSAxPDw4LCAvKiBGYWxzZSBDYXJyaWVyICovCisJUEhZX01fSVNfRklGT19FUlJPUgk9IDE8PDcsIC8qIEZJRk8gT3ZlcmZsb3cvVW5kZXJydW4gRXJyb3IgKi8KKwlQSFlfTV9JU19NRElfQ0hBTkdFCT0gMTw8NiwgLyogTURJIENyb3Nzb3ZlciBDaGFuZ2VkICovCisJUEhZX01fSVNfRE9XTlNIX0RFVAk9IDE8PDUsIC8qIERvd25zaGlmdCBEZXRlY3RlZCAqLworCVBIWV9NX0lTX0VORF9DSEFOR0UJPSAxPDw0LCAvKiBFbmVyZ3kgRGV0ZWN0IENoYW5nZWQgKi8KKworCVBIWV9NX0lTX0RURV9DSEFOR0UJPSAxPDwyLCAvKiBEVEUgUG93ZXIgRGV0LiBTdGF0dXMgQ2hhbmdlZCAqLworCVBIWV9NX0lTX1BPTF9DSEFOR0UJPSAxPDwxLCAvKiBQb2xhcml0eSBDaGFuZ2VkICovCisJUEhZX01fSVNfSkFCQkVSCQk9IDE8PDAsIC8qIEphYmJlciAqLworCisJUEhZX01fSVNfREVGX01TSwk9IFBIWV9NX0lTX0FOX0VSUk9SIHwgUEhZX01fSVNfTFNQX0NIQU5HRSB8CisJCQkJICBQSFlfTV9JU19MU1RfQ0hBTkdFIHwgUEhZX01fSVNfRklGT19FUlJPUiwKKworCVBIWV9NX0lTX0FOX01TSwkJPSBQSFlfTV9JU19BTl9FUlJPUiB8IFBIWV9NX0lTX0FOX0NPTVBMLAorfTsKKworLyoqKioqICBQSFlfTUFSVl9FWFRfQ1RSTAkxNiBiaXQgci93CUV4dC4gUEhZIFNwZWNpZmljIEN0cmwgKioqKiovCitlbnVtIHsKKwlQSFlfTV9FQ19FTkFfQkNfRVhUID0gMTw8MTUsIC8qIEVuYWJsZSBCbG9jayBDYXJyLiBFeHQuICg4OEUxMTExIG9ubHkpICovCisJUEhZX01fRUNfRU5BX0xJTl9MQiA9IDE8PDE0LCAvKiBFbmFibGUgTGluZSBMb29wYmFjayAoODhFMTExMSBvbmx5KSAqLworCisJUEhZX01fRUNfRElTX0xJTktfUCA9IDE8PDEyLCAvKiBEaXNhYmxlIExpbmsgUHVsc2VzICg4OEUxMTExIG9ubHkpICovCisJUEhZX01fRUNfTV9EU0NfTVNLICA9IDM8PDEwLCAvKiBCaXQgMTEuLjEwOglNYXN0ZXIgRG93bnNoaWZ0IENvdW50ZXIgKi8KKwkJCQkJLyogKDg4RTEwMTEgb25seSkgKi8KKwlQSFlfTV9FQ19TX0RTQ19NU0sgID0gMzw8OCwgIC8qIEJpdCAgOS4uIDg6CVNsYXZlICBEb3duc2hpZnQgQ291bnRlciAqLworCQkJCSAgICAgICAvKiAoODhFMTAxMSBvbmx5KSAqLworCVBIWV9NX0VDX01fRFNDX01TSzIgID0gNzw8OSwgLyogQml0IDExLi4gOToJTWFzdGVyIERvd25zaGlmdCBDb3VudGVyICovCisJCQkJCS8qICg4OEUxMTExIG9ubHkpICovCisJUEhZX01fRUNfRE9XTl9TX0VOQSAgPSAxPDw4LCAvKiBEb3duc2hpZnQgRW5hYmxlICg4OEUxMTExIG9ubHkpICovCisJCQkJCS8qICEhISBFcnJhdGEgaW4gc3BlYy4gKDEgPSBkaXNhYmxlKSAqLworCVBIWV9NX0VDX1JYX1RJTV9DVCAgID0gMTw8NywgLyogUkdNSUkgUnggVGltaW5nIENvbnRyb2wqLworCVBIWV9NX0VDX01BQ19TX01TSyAgID0gNzw8NCwgLyogQml0ICA2Li4gNDoJRGVmLiBNQUMgaW50ZXJmYWNlIHNwZWVkICovCisJUEhZX01fRUNfRklCX0FOX0VOQSAgPSAxPDwzLCAvKiBGaWJlciBBdXRvLU5lZy4gRW5hYmxlICg4OEUxMDExUyBvbmx5KSAqLworCVBIWV9NX0VDX0RURV9EX0VOQSAgID0gMTw8MiwgLyogRFRFIERldGVjdCBFbmFibGUgKDg4RTExMTEgb25seSkgKi8KKwlQSFlfTV9FQ19UWF9USU1fQ1QgICA9IDE8PDEsIC8qIFJHTUlJIFR4IFRpbWluZyBDb250cm9sICovCisJUEhZX01fRUNfVFJBTlNfRElTICAgPSAxPDwwLCAvKiBUcmFuc21pdHRlciBEaXNhYmxlICg4OEUxMTExIG9ubHkpICovfTsKKworI2RlZmluZSBQSFlfTV9FQ19NX0RTQyh4KQkoKHUxNikoeCk8PDEwKSAvKiAwMD0xeDsgMDE9Mng7IDEwPTN4OyAxMT00eCAqLworI2RlZmluZSBQSFlfTV9FQ19TX0RTQyh4KQkoKHUxNikoeCk8PDgpIC8qIDAwPWRpczsgMDE9MXg7IDEwPTJ4OyAxMT0zeCAqLworI2RlZmluZSBQSFlfTV9FQ19NQUNfUyh4KQkoKHUxNikoeCk8PDQpIC8qIDAxWD0wOyAxMTA9Mi41OyAxMTE9MjUgKE1IeikgKi8KKworI2RlZmluZSBQSFlfTV9FQ19NX0RTQ18yKHgpCSgodTE2KSh4KTw8OSkgLyogMDAwPTF4OyAwMDE9Mng7IDAxMD0zeDsgMDExPTR4ICovCisJCQkJCQkJCQkJCS8qIDEwMD01eDsgMTAxPTZ4OyAxMTA9N3g7IDExMT04eCAqLworZW51bSB7CisJTUFDX1RYX0NMS18wX01IWgk9IDIsCisJTUFDX1RYX0NMS18yXzVfTUhaCT0gNiwKKwlNQUNfVFhfQ0xLXzI1X01IWiAJPSA3LAorfTsKKworLyoqKioqICBQSFlfTUFSVl9MRURfQ1RSTAkxNiBiaXQgci93CUxFRCBDb250cm9sIFJlZyAqKioqKi8KK2VudW0geworCVBIWV9NX0xFRENfRElTX0xFRAk9IDE8PDE1LCAvKiBEaXNhYmxlIExFRCAqLworCVBIWV9NX0xFRENfUFVMU19NU0sJPSA3PDwxMiwvKiBCaXQgMTQuLjEyOiBQdWxzZSBTdHJldGNoIE1hc2sgKi8KKwlQSFlfTV9MRURDX0ZfSU5UCT0gMTw8MTEsIC8qIEZvcmNlIEludGVycnVwdCAqLworCVBIWV9NX0xFRENfQkxfUl9NU0sJPSA3PDw4LC8qIEJpdCAxMC4uIDg6IEJsaW5rIFJhdGUgTWFzayAqLworCVBIWV9NX0xFRENfRFBfQ19MU0IJPSAxPDw3LCAvKiBEdXBsZXggQ29udHJvbCAoTFNCLCA4OEUxMTExIG9ubHkpICovCisJUEhZX01fTEVEQ19UWF9DX0xTQgk9IDE8PDYsIC8qIFR4IENvbnRyb2wgKExTQiwgODhFMTExMSBvbmx5KSAqLworCVBIWV9NX0xFRENfTEtfQ19NU0sJPSA3PDwzLC8qIEJpdCAgNS4uIDM6IExpbmsgQ29udHJvbCBNYXNrICovCisJCQkJCS8qICg4OEUxMTExIG9ubHkpICovCit9OworI2RlZmluZSBQSFlfTV9MRURfUFVMU19EVVIoeCkJKCgodTE2KSh4KTw8MTIpICYgUEhZX01fTEVEQ19QVUxTX01TSykKKyNkZWZpbmUgUEhZX01fTEVEX0JMSU5LX1JUKHgpCSgoKHUxNikoeCk8PDgpICYgUEhZX01fTEVEQ19CTF9SX01TSykKKworZW51bSB7CisJUEhZX01fTEVEQ19MSU5LX01TSwk9IDM8PDMsIC8qIEJpdCAgNC4uIDM6IExpbmsgQ29udHJvbCBNYXNrICovCisJCQkJCS8qICg4OEUxMDExIG9ubHkpICovCisJUEhZX01fTEVEQ19EUF9DVFJMCT0gMTw8MiwgLyogRHVwbGV4IENvbnRyb2wgKi8KKwlQSFlfTV9MRURDX0RQX0NfTVNCCT0gMTw8MiwgLyogRHVwbGV4IENvbnRyb2wgKE1TQiwgODhFMTExMSBvbmx5KSAqLworCVBIWV9NX0xFRENfUlhfQ1RSTAk9IDE8PDEsIC8qIFJ4IEFjdGl2aXR5IC8gTGluayAqLworCVBIWV9NX0xFRENfVFhfQ1RSTAk9IDE8PDAsIC8qIFR4IEFjdGl2aXR5IC8gTGluayAqLworCVBIWV9NX0xFRENfVFhfQ19NU0IJPSAxPDwwLCAvKiBUeCBDb250cm9sIChNU0IsIDg4RTExMTEgb25seSkgKi8KK307CisKK2VudW0geworCVBVTFNfTk9fU1RSCT0gMCwgLyogbm8gcHVsc2Ugc3RyZXRjaGluZyAqLworCVBVTFNfMjFNUwk9IDEsIC8qIDIxIG1zIHRvIDQyIG1zICovCisJUFVMU180Mk1TCT0gMiwgLyogNDIgbXMgdG8gODQgbXMgKi8KKwlQVUxTXzg0TVMJPSAzLCAvKiA4NCBtcyB0byAxNzAgbXMgKi8KKwlQVUxTXzE3ME1TCT0gNCwgLyogMTcwIG1zIHRvIDM0MCBtcyAqLworCVBVTFNfMzQwTVMJPSA1LCAvKiAzNDAgbXMgdG8gNjcwIG1zICovCisJUFVMU182NzBNUwk9IDYsIC8qIDY3MCBtcyB0byAxLjMgcyAqLworCVBVTFNfMTMwME1TCT0gNywgLyogMS4zIHMgdG8gMi43IHMgKi8KK307CisKKworZW51bSB7CisJQkxJTktfNDJNUwk9IDAsIC8qIDQyIG1zICovCisJQkxJTktfODRNUwk9IDEsIC8qIDg0IG1zICovCisJQkxJTktfMTcwTVMJPSAyLCAvKiAxNzAgbXMgKi8KKwlCTElOS18zNDBNUwk9IDMsIC8qIDM0MCBtcyAqLworCUJMSU5LXzY3ME1TCT0gNCwgLyogNjcwIG1zICovCit9OworCisvKioqKiogIFBIWV9NQVJWX0xFRF9PVkVSCTE2IGJpdCByL3cJTWFudWFsIExFRCBPdmVycmlkZSBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9NX0xFRF9NT19TR01JSSh4KQkoKHgpPDwxNCkgLyogQml0IDE1Li4xNDogIFNHTUlJIEFOIFRpbWVyICovCisJCQkJCQkJCQkJLyogQml0IDEzLi4xMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PX0RVUCh4KQkoKHgpPDwxMCkgLyogQml0IDExLi4xMDogIER1cGxleCAqLworI2RlZmluZSBQSFlfTV9MRURfTU9fMTAoeCkJKCh4KTw8OCkgLyogQml0ICA5Li4gODogIExpbmsgMTAgKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PXzEwMCh4KQkoKHgpPDw2KSAvKiBCaXQgIDcuLiA2OiAgTGluayAxMDAgKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PXzEwMDAoeCkJKCh4KTw8NCkgLyogQml0ICA1Li4gNDogIExpbmsgMTAwMCAqLworI2RlZmluZSBQSFlfTV9MRURfTU9fUlgoeCkJKCh4KTw8MikgLyogQml0ICAzLi4gMjogIFJ4ICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT19UWCh4KQkoKHgpPDwwKSAvKiBCaXQgIDEuLiAwOiAgVHggKi8KKworZW51bSB7CisJTU9fTEVEX05PUk0JPSAwLAorCU1PX0xFRF9CTElOSwk9IDEsCisJTU9fTEVEX09GRgk9IDIsCisJTU9fTEVEX09OCT0gMywKK307CisKKy8qKioqKiAgUEhZX01BUlZfRVhUX0NUUkxfMgkxNiBiaXQgci93CUV4dC4gUEhZIFNwZWNpZmljIEN0cmwgMiAqKioqKi8KK2VudW0geworCVBIWV9NX0VDMl9GSV9JTVBFRAk9IDE8PDYsIC8qIEZpYmVyIElucHV0ICBJbXBlZGFuY2UgKi8KKwlQSFlfTV9FQzJfRk9fSU1QRUQJPSAxPDw1LCAvKiBGaWJlciBPdXRwdXQgSW1wZWRhbmNlICovCisJUEhZX01fRUMyX0ZPX01fQ0xLCT0gMTw8NCwgLyogRmliZXIgTW9kZSBDbG9jayBFbmFibGUgKi8KKwlQSFlfTV9FQzJfRk9fQk9PU1QJPSAxPDwzLCAvKiBGaWJlciBPdXRwdXQgQm9vc3QgKi8KKwlQSFlfTV9FQzJfRk9fQU1fTVNLCT0gNywgLyogQml0ICAyLi4gMDoJRmliZXIgT3V0cHV0IEFtcGxpdHVkZSAqLworfTsKKworLyoqKioqICBQSFlfTUFSVl9FWFRfUF9TVEFUIDE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgU3RhdHVzICoqKioqLworZW51bSB7CisJUEhZX01fRkNfQVVUT19TRUwJPSAxPDwxNSwgLyogRmliZXIvQ29wcGVyIEF1dG8gU2VsLiBEaXMuICovCisJUEhZX01fRkNfQU5fUkVHX0FDQwk9IDE8PDE0LCAvKiBGaWJlci9Db3BwZXIgQU4gUmVnLiBBY2Nlc3MgKi8KKwlQSFlfTV9GQ19SRVNPTFVUSU9OCT0gMTw8MTMsIC8qIEZpYmVyL0NvcHBlciBSZXNvbHV0aW9uICovCisJUEhZX01fU0VSX0lGX0FOX0JQCT0gMTw8MTIsIC8qIFNlci4gSUYgQU4gQnlwYXNzIEVuYWJsZSAqLworCVBIWV9NX1NFUl9JRl9CUF9TVAk9IDE8PDExLCAvKiBTZXIuIElGIEFOIEJ5cGFzcyBTdGF0dXMgKi8KKwlQSFlfTV9JUlFfUE9MQVJJVFkJPSAxPDwxMCwgLyogSVJRIHBvbGFyaXR5ICovCisJUEhZX01fRElTX0FVVF9NRUQJPSAxPDw5LCAvKiBEaXNhYmxlIEF1dC4gTWVkaXVtIFJlZy4gU2VsZWN0aW9uICovCisJCQkJCQkJCQkvKiAoODhFMTExMSBvbmx5KSAqLworCQkJCQkJCQkvKiBCaXQgIDkuLiA0OiByZXNlcnZlZCAoODhFMTAxMSBvbmx5KSAqLworCVBIWV9NX1VORE9DMQk9IDE8PDcsIC8qIHVuZG9jdW1lbnRlZCBiaXQgISEgKi8KKwlQSFlfTV9EVEVfUE9XX1NUQVQJPSAxPDw0LCAvKiBEVEUgUG93ZXIgU3RhdHVzICg4OEUxMTExIG9ubHkpICovCisJUEhZX01fTU9ERV9NQVNLCT0gMHhmLCAvKiBCaXQgIDMuLiAwOiBjb3B5IG9mIEhXQ0ZHIE1PREVbMzowXSAqLworfTsKKworLyoqKioqICBQSFlfTUFSVl9DQUJMRV9ESUFHCTE2IGJpdCByL28JQ2FibGUgRGlhZ25vc3RpYyBSZWcgKioqKiovCitlbnVtIHsKKwlQSFlfTV9DQUJEX0VOQV9URVNUCT0gMTw8MTUsIC8qIEVuYWJsZSBUZXN0IChQYWdlIDApICovCisJUEhZX01fQ0FCRF9ESVNfV0FJVAk9IDE8PDE1LCAvKiBEaXNhYmxlIFdhaXRpbmcgUGVyaW9kIChQYWdlIDEpICovCisJCQkJCS8qICg4OEUxMTExIG9ubHkpICovCisJUEhZX01fQ0FCRF9TVEFUX01TSwk9IDM8PDEzLCAvKiBCaXQgMTQuLjEzOiBTdGF0dXMgTWFzayAqLworCVBIWV9NX0NBQkRfQU1QTF9NU0sJPSAweDFmPDw4LCAvKiBCaXQgMTIuLiA4OiBBbXBsaXR1ZGUgTWFzayAqLworCQkJCQkvKiAoODhFMTExMSBvbmx5KSAqLworCVBIWV9NX0NBQkRfRElTVF9NU0sJPSAweGZmLCAvKiBCaXQgIDcuLiAwOiBEaXN0YW5jZSBNYXNrICovCit9OworCisvKiB2YWx1ZXMgZm9yIENhYmxlIERpYWdub3N0aWMgU3RhdHVzICgxMT1mYWlsOyAwMD1PSzsgMTA9b3BlbjsgMDE9c2hvcnQpICovCitlbnVtIHsKKwlDQUJEX1NUQVRfTk9STUFMPSAwLAorCUNBQkRfU1RBVF9TSE9SVAk9IDEsCisJQ0FCRF9TVEFUX09QRU4JPSAyLAorCUNBQkRfU1RBVF9GQUlMCT0gMywKK307CisKKy8qIGZvciAxMC8xMDAgRmFzdCBFdGhlcm5ldCBQSFkgKDg4RTMwODIgb25seSkgKi8KKy8qKioqKiAgUEhZX01BUlZfRkVfTEVEX1BBUgkJMTYgYml0IHIvdwlMRUQgUGFyYWxsZWwgU2VsZWN0IFJlZy4gKioqKiovCisJCQkJCQkJCQkvKiBCaXQgMTUuLjEyOiByZXNlcnZlZCAodXNlZCBpbnRlcm5hbGx5KSAqLworZW51bSB7CisJUEhZX01fRkVMUF9MRUQyX01TSyA9IDB4Zjw8OCwJLyogQml0IDExLi4gODogTEVEMiBNYXNrIChMSU5LKSAqLworCVBIWV9NX0ZFTFBfTEVEMV9NU0sgPSAweGY8PDQsCS8qIEJpdCAgNy4uIDQ6IExFRDEgTWFzayAoQUNUKSAqLworCVBIWV9NX0ZFTFBfTEVEMF9NU0sgPSAweGYsIC8qIEJpdCAgMy4uIDA6IExFRDAgTWFzayAoU1BFRUQpICovCit9OworCisjZGVmaW5lIFBIWV9NX0ZFTFBfTEVEMl9DVFJMKHgpCSgoKHgpPDw4KSAmIFBIWV9NX0ZFTFBfTEVEMl9NU0spCisjZGVmaW5lIFBIWV9NX0ZFTFBfTEVEMV9DVFJMKHgpCSgoKHgpPDw0KSAmIFBIWV9NX0ZFTFBfTEVEMV9NU0spCisjZGVmaW5lIFBIWV9NX0ZFTFBfTEVEMF9DVFJMKHgpCSgoKHgpPDwwKSAmIFBIWV9NX0ZFTFBfTEVEMF9NU0spCisKK2VudW0geworCUxFRF9QQVJfQ1RSTF9DT0xYCT0gMHgwMCwKKwlMRURfUEFSX0NUUkxfRVJST1IJPSAweDAxLAorCUxFRF9QQVJfQ1RSTF9EVVBMRVgJPSAweDAyLAorCUxFRF9QQVJfQ1RSTF9EUF9DT0wJPSAweDAzLAorCUxFRF9QQVJfQ1RSTF9TUEVFRAk9IDB4MDQsCisJTEVEX1BBUl9DVFJMX0xJTksJPSAweDA1LAorCUxFRF9QQVJfQ1RSTF9UWAkJPSAweDA2LAorCUxFRF9QQVJfQ1RSTF9SWAkJPSAweDA3LAorCUxFRF9QQVJfQ1RSTF9BQ1QJPSAweDA4LAorCUxFRF9QQVJfQ1RSTF9MTktfUlgJPSAweDA5LAorCUxFRF9QQVJfQ1RSTF9MTktfQUMJPSAweDBhLAorCUxFRF9QQVJfQ1RSTF9BQ1RfQkwJPSAweDBiLAorCUxFRF9QQVJfQ1RSTF9UWF9CTAk9IDB4MGMsCisJTEVEX1BBUl9DVFJMX1JYX0JMCT0gMHgwZCwKKwlMRURfUEFSX0NUUkxfQ09MX0JMCT0gMHgwZSwKKwlMRURfUEFSX0NUUkxfSU5BQ1QJPSAweDBmCit9OworCisvKioqKiosUEhZX01BUlZfRkVfU1BFQ18yCQkxNiBiaXQgci93CVNwZWNpZmljIENvbnRyb2wgUmVnLiAyICoqKioqLworZW51bSB7CisJUEhZX01fRkVTQ19ESVNfV0FJVAk9IDE8PDIsIC8qIERpc2FibGUgVERSIFdhaXRpbmcgUGVyaW9kICovCisJUEhZX01fRkVTQ19FTkFfTUNMSwk9IDE8PDEsIC8qIEVuYWJsZSBNQUMgUnggQ2xvY2sgaW4gc2xlZXAgbW9kZSAqLworCVBIWV9NX0ZFU0NfU0VMX0NMX0EJPSAxPDwwLCAvKiBTZWxlY3QgQ2xhc3MgQSBkcml2ZXIgKDEwMEItVFgpICovCit9OworCisKKy8qKioqKiAgUEhZX01BUlZfUEhZX0NUUkwgKHBhZ2UgMykJCTE2IGJpdCByL3cJTEVEIENvbnRyb2wgUmVnLiAqKioqKi8KK2VudW0geworCVBIWV9NX0xFRENfTE9TX01TSwk9IDB4Zjw8MTIsIC8qIEJpdCAxNS4uMTI6IExPUyBMRUQgQ3RybC4gTWFzayAqLworCVBIWV9NX0xFRENfSU5JVF9NU0sJPSAweGY8PDgsIC8qIEJpdCAxMS4uIDg6IElOSVQgTEVEIEN0cmwuIE1hc2sgKi8KKwlQSFlfTV9MRURDX1NUQTFfTVNLCT0gMHhmPDw0LCAvKiBCaXQgIDcuLiA0OiBTVEFUMSBMRUQgQ3RybC4gTWFzayAqLworCVBIWV9NX0xFRENfU1RBMF9NU0sJPSAweGYsIC8qIEJpdCAgMy4uIDA6IFNUQVQwIExFRCBDdHJsLiBNYXNrICovCit9OworCisjZGVmaW5lIFBIWV9NX0xFRENfTE9TX0NUUkwoeCkJKCgoeCk8PDEyKSAmIFBIWV9NX0xFRENfTE9TX01TSykKKyNkZWZpbmUgUEhZX01fTEVEQ19JTklUX0NUUkwoeCkJKCgoeCk8PDgpICYgUEhZX01fTEVEQ19JTklUX01TSykKKyNkZWZpbmUgUEhZX01fTEVEQ19TVEExX0NUUkwoeCkJKCgoeCk8PDQpICYgUEhZX01fTEVEQ19TVEExX01TSykKKyNkZWZpbmUgUEhZX01fTEVEQ19TVEEwX0NUUkwoeCkJKCgoeCk8PDApICYgUEhZX01fTEVEQ19TVEEwX01TSykKKworLyogR01BQyByZWdpc3RlcnMgICovCisvKiBQb3J0IFJlZ2lzdGVycyAqLworZW51bSB7CisJR01fR1BfU1RBVAk9IDB4MDAwMCwJLyogMTYgYml0IHIvbwlHZW5lcmFsIFB1cnBvc2UgU3RhdHVzICovCisJR01fR1BfQ1RSTAk9IDB4MDAwNCwJLyogMTYgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCAqLworCUdNX1RYX0NUUkwJPSAweDAwMDgsCS8qIDE2IGJpdCByL3cJVHJhbnNtaXQgQ29udHJvbCBSZWcuICovCisJR01fUlhfQ1RSTAk9IDB4MDAwYywJLyogMTYgYml0IHIvdwlSZWNlaXZlIENvbnRyb2wgUmVnLiAqLworCUdNX1RYX0ZMT1dfQ1RSTAk9IDB4MDAxMCwJLyogMTYgYml0IHIvdwlUcmFuc21pdCBGbG93LUNvbnRyb2wgKi8KKwlHTV9UWF9QQVJBTQk9IDB4MDAxNCwJLyogMTYgYml0IHIvdwlUcmFuc21pdCBQYXJhbWV0ZXIgUmVnLiAqLworCUdNX1NFUklBTF9NT0RFCT0gMHgwMDE4LAkvKiAxNiBiaXQgci93CVNlcmlhbCBNb2RlIFJlZ2lzdGVyICovCisvKiBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlcnMgKi8KKwlHTV9TUkNfQUREUl8xTAk9IDB4MDAxYywJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAxIChsb3cpICovCisJR01fU1JDX0FERFJfMU0JPSAweDAwMjAsCS8qIDE2IGJpdCByL3cJU291cmNlIEFkZHJlc3MgMSAobWlkZGxlKSAqLworCUdNX1NSQ19BRERSXzFICT0gMHgwMDI0LAkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDEgKGhpZ2gpICovCisJR01fU1JDX0FERFJfMkwJPSAweDAwMjgsCS8qIDE2IGJpdCByL3cJU291cmNlIEFkZHJlc3MgMiAobG93KSAqLworCUdNX1NSQ19BRERSXzJNCT0gMHgwMDJjLAkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDIgKG1pZGRsZSkgKi8KKwlHTV9TUkNfQUREUl8ySAk9IDB4MDAzMCwJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAyIChoaWdoKSAqLworCisvKiBNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIFJlZ2lzdGVycyAqLworCUdNX01DX0FERFJfSDEJPSAweDAwMzQsCS8qIDE2IGJpdCByL3cJTXVsdGljYXN0IEFkZHJlc3MgSGFzaCAxICovCisJR01fTUNfQUREUl9IMgk9IDB4MDAzOCwJLyogMTYgYml0IHIvdwlNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIDIgKi8KKwlHTV9NQ19BRERSX0gzCT0gMHgwMDNjLAkvKiAxNiBiaXQgci93CU11bHRpY2FzdCBBZGRyZXNzIEhhc2ggMyAqLworCUdNX01DX0FERFJfSDQJPSAweDAwNDAsCS8qIDE2IGJpdCByL3cJTXVsdGljYXN0IEFkZHJlc3MgSGFzaCA0ICovCisKKy8qIEludGVycnVwdCBTb3VyY2UgUmVnaXN0ZXJzICovCisJR01fVFhfSVJRX1NSQwk9IDB4MDA0NCwJLyogMTYgYml0IHIvbwlUeCBPdmVyZmxvdyBJUlEgU291cmNlICovCisJR01fUlhfSVJRX1NSQwk9IDB4MDA0OCwJLyogMTYgYml0IHIvbwlSeCBPdmVyZmxvdyBJUlEgU291cmNlICovCisJR01fVFJfSVJRX1NSQwk9IDB4MDA0YywJLyogMTYgYml0IHIvbwlUeC9SeCBPdmVyLiBJUlEgU291cmNlICovCisKKy8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVycyAqLworCUdNX1RYX0lSUV9NU0sJPSAweDAwNTAsCS8qIDE2IGJpdCByL3cJVHggT3ZlcmZsb3cgSVJRIE1hc2sgKi8KKwlHTV9SWF9JUlFfTVNLCT0gMHgwMDU0LAkvKiAxNiBiaXQgci93CVJ4IE92ZXJmbG93IElSUSBNYXNrICovCisJR01fVFJfSVJRX01TSwk9IDB4MDA1OCwJLyogMTYgYml0IHIvdwlUeC9SeCBPdmVyLiBJUlEgTWFzayAqLworCisvKiBTZXJpYWwgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFNNSSkgUmVnaXN0ZXJzICovCisJR01fU01JX0NUUkwJPSAweDAwODAsCS8qIDE2IGJpdCByL3cJU01JIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlHTV9TTUlfREFUQQk9IDB4MDA4NCwJLyogMTYgYml0IHIvdwlTTUkgRGF0YSBSZWdpc3RlciAqLworCUdNX1BIWV9BRERSCT0gMHgwMDg4LAkvKiAxNiBiaXQgci93CUdQSFkgQWRkcmVzcyBSZWdpc3RlciAqLworfTsKKworLyogTUlCIENvdW50ZXJzICovCisjZGVmaW5lIEdNX01JQl9DTlRfQkFTRQkweDAxMDAJCS8qIEJhc2UgQWRkcmVzcyBvZiBNSUIgQ291bnRlcnMgKi8KKyNkZWZpbmUgR01fTUlCX0NOVF9TSVpFCTQ0CQkvKiBOdW1iZXIgb2YgTUlCIENvdW50ZXJzICovCisKKy8qCisgKiBNSUIgQ291bnRlcnMgYmFzZSBhZGRyZXNzIGRlZmluaXRpb25zIChsb3cgd29yZCkgLQorICogdXNlIG9mZnNldCA0IGZvciBhY2Nlc3MgdG8gaGlnaCB3b3JkCSgzMiBiaXQgci9vKQorICovCitlbnVtIHsKKwlHTV9SWEZfVUNfT0sgID0gR01fTUlCX0NOVF9CQVNFICsgMCwJLyogVW5pY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKwlHTV9SWEZfQkNfT0sJPSBHTV9NSUJfQ05UX0JBU0UgKyA4LAkvKiBCcm9hZGNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisJR01fUlhGX01QQVVTRQk9IEdNX01JQl9DTlRfQkFTRSArIDE2LAkvKiBQYXVzZSBNQUMgQ3RybCBGcmFtZXMgUmVjZWl2ZWQgKi8KKwlHTV9SWEZfTUNfT0sJPSBHTV9NSUJfQ05UX0JBU0UgKyAyNCwJLyogTXVsdGljYXN0IEZyYW1lcyBSZWNlaXZlZCBPSyAqLworCUdNX1JYRl9GQ1NfRVJSCT0gR01fTUlCX0NOVF9CQVNFICsgMzIsCS8qIFJ4IEZyYW1lIENoZWNrIFNlcS4gRXJyb3IgKi8KKwkvKiBHTV9NSUJfQ05UX0JBU0UgKyA0MDoJcmVzZXJ2ZWQgKi8KKwlHTV9SWE9fT0tfTE8JPSBHTV9NSUJfQ05UX0JBU0UgKyA0OCwJLyogT2N0ZXRzIFJlY2VpdmVkIE9LIExvdyAqLworCUdNX1JYT19PS19ISQk9IEdNX01JQl9DTlRfQkFTRSArIDU2LAkvKiBPY3RldHMgUmVjZWl2ZWQgT0sgSGlnaCAqLworCUdNX1JYT19FUlJfTE8JPSBHTV9NSUJfQ05UX0JBU0UgKyA2NCwJLyogT2N0ZXRzIFJlY2VpdmVkIEludmFsaWQgTG93ICovCisJR01fUlhPX0VSUl9ISQk9IEdNX01JQl9DTlRfQkFTRSArIDcyLAkvKiBPY3RldHMgUmVjZWl2ZWQgSW52YWxpZCBIaWdoICovCisJR01fUlhGX1NIVAk9IEdNX01JQl9DTlRfQkFTRSArIDgwLAkvKiBGcmFtZXMgPDY0IEJ5dGUgUmVjZWl2ZWQgT0sgKi8KKwlHTV9SWEVfRlJBRwk9IEdNX01JQl9DTlRfQkFTRSArIDg4LAkvKiBGcmFtZXMgPDY0IEJ5dGUgUmVjZWl2ZWQgd2l0aCBGQ1MgRXJyICovCisJR01fUlhGXzY0Qgk9IEdNX01JQl9DTlRfQkFTRSArIDk2LAkvKiA2NCBCeXRlIFJ4IEZyYW1lICovCisJR01fUlhGXzEyN0IJPSBHTV9NSUJfQ05UX0JBU0UgKyAxMDQsCS8qIDY1LTEyNyBCeXRlIFJ4IEZyYW1lICovCisJR01fUlhGXzI1NUIJPSBHTV9NSUJfQ05UX0JBU0UgKyAxMTIsCS8qIDEyOC0yNTUgQnl0ZSBSeCBGcmFtZSAqLworCUdNX1JYRl81MTFCCT0gR01fTUlCX0NOVF9CQVNFICsgMTIwLAkvKiAyNTYtNTExIEJ5dGUgUnggRnJhbWUgKi8KKwlHTV9SWEZfMTAyM0IJPSBHTV9NSUJfQ05UX0JBU0UgKyAxMjgsCS8qIDUxMi0xMDIzIEJ5dGUgUnggRnJhbWUgKi8KKwlHTV9SWEZfMTUxOEIJPSBHTV9NSUJfQ05UX0JBU0UgKyAxMzYsCS8qIDEwMjQtMTUxOCBCeXRlIFJ4IEZyYW1lICovCisJR01fUlhGX01BWF9TWgk9IEdNX01JQl9DTlRfQkFTRSArIDE0NCwJLyogMTUxOS1NYXhTaXplIEJ5dGUgUnggRnJhbWUgKi8KKwlHTV9SWEZfTE5HX0VSUgk9IEdNX01JQl9DTlRfQkFTRSArIDE1MiwJLyogUnggRnJhbWUgdG9vIExvbmcgRXJyb3IgKi8KKwlHTV9SWEZfSkFCX1BLVAk9IEdNX01JQl9DTlRfQkFTRSArIDE2MCwJLyogUnggSmFiYmVyIFBhY2tldCBGcmFtZSAqLworCS8qIEdNX01JQl9DTlRfQkFTRSArIDE2ODoJcmVzZXJ2ZWQgKi8KKwlHTV9SWEVfRklGT19PVgk9IEdNX01JQl9DTlRfQkFTRSArIDE3NiwJLyogUnggRklGTyBvdmVyZmxvdyBFdmVudCAqLworCS8qIEdNX01JQl9DTlRfQkFTRSArIDE4NDoJcmVzZXJ2ZWQgKi8KKwlHTV9UWEZfVUNfT0sJPSBHTV9NSUJfQ05UX0JBU0UgKyAxOTIsCS8qIFVuaWNhc3QgRnJhbWVzIFhtaXR0ZWQgT0sgKi8KKwlHTV9UWEZfQkNfT0sJPSBHTV9NSUJfQ05UX0JBU0UgKyAyMDAsCS8qIEJyb2FkY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworCUdNX1RYRl9NUEFVU0UJPSBHTV9NSUJfQ05UX0JBU0UgKyAyMDgsCS8qIFBhdXNlIE1BQyBDdHJsIEZyYW1lcyBYbWl0dGVkICovCisJR01fVFhGX01DX09LCT0gR01fTUlCX0NOVF9CQVNFICsgMjE2LAkvKiBNdWx0aWNhc3QgRnJhbWVzIFhtaXR0ZWQgT0sgKi8KKwlHTV9UWE9fT0tfTE8JPSBHTV9NSUJfQ05UX0JBU0UgKyAyMjQsCS8qIE9jdGV0cyBUcmFuc21pdHRlZCBPSyBMb3cgKi8KKwlHTV9UWE9fT0tfSEkJPSBHTV9NSUJfQ05UX0JBU0UgKyAyMzIsCS8qIE9jdGV0cyBUcmFuc21pdHRlZCBPSyBIaWdoICovCisJR01fVFhGXzY0Qgk9IEdNX01JQl9DTlRfQkFTRSArIDI0MCwJLyogNjQgQnl0ZSBUeCBGcmFtZSAqLworCUdNX1RYRl8xMjdCCT0gR01fTUlCX0NOVF9CQVNFICsgMjQ4LAkvKiA2NS0xMjcgQnl0ZSBUeCBGcmFtZSAqLworCUdNX1RYRl8yNTVCCT0gR01fTUlCX0NOVF9CQVNFICsgMjU2LAkvKiAxMjgtMjU1IEJ5dGUgVHggRnJhbWUgKi8KKwlHTV9UWEZfNTExQgk9IEdNX01JQl9DTlRfQkFTRSArIDI2NCwJLyogMjU2LTUxMSBCeXRlIFR4IEZyYW1lICovCisJR01fVFhGXzEwMjNCCT0gR01fTUlCX0NOVF9CQVNFICsgMjcyLAkvKiA1MTItMTAyMyBCeXRlIFR4IEZyYW1lICovCisJR01fVFhGXzE1MThCCT0gR01fTUlCX0NOVF9CQVNFICsgMjgwLAkvKiAxMDI0LTE1MTggQnl0ZSBUeCBGcmFtZSAqLworCUdNX1RYRl9NQVhfU1oJPSBHTV9NSUJfQ05UX0JBU0UgKyAyODgsCS8qIDE1MTktTWF4U2l6ZSBCeXRlIFR4IEZyYW1lICovCisKKwlHTV9UWEZfQ09MCT0gR01fTUlCX0NOVF9CQVNFICsgMzA0LAkvKiBUeCBDb2xsaXNpb24gKi8KKwlHTV9UWEZfTEFUX0NPTAk9IEdNX01JQl9DTlRfQkFTRSArIDMxMiwJLyogVHggTGF0ZSBDb2xsaXNpb24gKi8KKwlHTV9UWEZfQUJPX0NPTAk9IEdNX01JQl9DTlRfQkFTRSArIDMyMCwJLyogVHggYWJvcnRlZCBkdWUgdG8gRXhjZXMuIENvbC4gKi8KKwlHTV9UWEZfTVVMX0NPTAk9IEdNX01JQl9DTlRfQkFTRSArIDMyOCwJLyogVHggTXVsdGlwbGUgQ29sbGlzaW9uICovCisJR01fVFhGX1NOR19DT0wJPSBHTV9NSUJfQ05UX0JBU0UgKyAzMzYsCS8qIFR4IFNpbmdsZSBDb2xsaXNpb24gKi8KKwlHTV9UWEVfRklGT19VUgk9IEdNX01JQl9DTlRfQkFTRSArIDM0NCwJLyogVHggRklGTyBVbmRlcnJ1biBFdmVudCAqLworfTsKKworLyogR01BQyBCaXQgRGVmaW5pdGlvbnMgKi8KKy8qCUdNX0dQX1NUQVQJMTYgYml0IHIvbwlHZW5lcmFsIFB1cnBvc2UgU3RhdHVzIFJlZ2lzdGVyICovCitlbnVtIHsKKwlHTV9HUFNSX1NQRUVECQk9IDE8PDE1LCAvKiBCaXQgMTU6CVBvcnQgU3BlZWQgKDEgPSAxMDAgTWJwcykgKi8KKwlHTV9HUFNSX0RVUExFWAkJPSAxPDwxNCwgLyogQml0IDE0OglEdXBsZXggTW9kZSAoMSA9IEZ1bGwpICovCisJR01fR1BTUl9GQ19UWF9ESVMJPSAxPDwxMywgLyogQml0IDEzOglUeCBGbG93LUNvbnRyb2wgTW9kZSBEaXNhYmxlZCAqLworCUdNX0dQU1JfTElOS19VUAkJPSAxPDwxMiwgLyogQml0IDEyOglMaW5rIFVwIFN0YXR1cyAqLworCUdNX0dQU1JfUEFVU0UJCT0gMTw8MTEsIC8qIEJpdCAxMToJUGF1c2UgU3RhdGUgKi8KKwlHTV9HUFNSX1RYX0FDVElWRQk9IDE8PDEwLCAvKiBCaXQgMTA6CVR4IGluIFByb2dyZXNzICovCisJR01fR1BTUl9FWENfQ09MCQk9IDE8PDksCS8qIEJpdCAgOToJRXhjZXNzaXZlIENvbGxpc2lvbnMgT2NjdXJlZCAqLworCUdNX0dQU1JfTEFUX0NPTAkJPSAxPDw4LAkvKiBCaXQgIDg6CUxhdGUgQ29sbGlzaW9ucyBPY2N1cmVkICovCisKKwlHTV9HUFNSX1BIWV9TVF9DSAk9IDE8PDUsCS8qIEJpdCAgNToJUEhZIFN0YXR1cyBDaGFuZ2UgKi8KKwlHTV9HUFNSX0dJR19TUEVFRAk9IDE8PDQsCS8qIEJpdCAgNDoJR2lnYWJpdCBTcGVlZCAoMSA9IDEwMDAgTWJwcykgKi8KKwlHTV9HUFNSX1BBUlRfTU9ERQk9IDE8PDMsCS8qIEJpdCAgMzoJUGFydGl0aW9uIG1vZGUgKi8KKwlHTV9HUFNSX0ZDX1JYX0RJUwk9IDE8PDIsCS8qIEJpdCAgMjoJUnggRmxvdy1Db250cm9sIE1vZGUgRGlzYWJsZWQgKi8KKwlHTV9HUFNSX1BST01fRU4JCT0gMTw8MSwJLyogQml0ICAxOglQcm9taXNjdW91cyBNb2RlIEVuYWJsZWQgKi8KK307CisKKy8qCUdNX0dQX0NUUkwJMTYgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlciAqLworZW51bSB7CisJR01fR1BDUl9QUk9NX0VOQQk9IDE8PDE0LAkvKiBCaXQgMTQ6CUVuYWJsZSBQcm9taXNjdW91cyBNb2RlICovCisJR01fR1BDUl9GQ19UWF9ESVMJPSAxPDwxMywgLyogQml0IDEzOglEaXNhYmxlIFR4IEZsb3ctQ29udHJvbCBNb2RlICovCisJR01fR1BDUl9UWF9FTkEJCT0gMTw8MTIsIC8qIEJpdCAxMjoJRW5hYmxlIFRyYW5zbWl0ICovCisJR01fR1BDUl9SWF9FTkEJCT0gMTw8MTEsIC8qIEJpdCAxMToJRW5hYmxlIFJlY2VpdmUgKi8KKwlHTV9HUENSX0JVUlNUX0VOQQk9IDE8PDEwLCAvKiBCaXQgMTA6CUVuYWJsZSBCdXJzdCBNb2RlICovCisJR01fR1BDUl9MT09QX0VOQQk9IDE8PDksCS8qIEJpdCAgOToJRW5hYmxlIE1BQyBMb29wYmFjayBNb2RlICovCisJR01fR1BDUl9QQVJUX0VOQQk9IDE8PDgsCS8qIEJpdCAgODoJRW5hYmxlIFBhcnRpdGlvbiBNb2RlICovCisJR01fR1BDUl9HSUdTX0VOQQk9IDE8PDcsCS8qIEJpdCAgNzoJR2lnYWJpdCBTcGVlZCAoMTAwMCBNYnBzKSAqLworCUdNX0dQQ1JfRkxfUEFTUwkJPSAxPDw2LAkvKiBCaXQgIDY6CUZvcmNlIExpbmsgUGFzcyAqLworCUdNX0dQQ1JfRFVQX0ZVTEwJPSAxPDw1LAkvKiBCaXQgIDU6CUZ1bGwgRHVwbGV4IE1vZGUgKi8KKwlHTV9HUENSX0ZDX1JYX0RJUwk9IDE8PDQsCS8qIEJpdCAgNDoJRGlzYWJsZSBSeCBGbG93LUNvbnRyb2wgTW9kZSAqLworCUdNX0dQQ1JfU1BFRURfMTAwCT0gMTw8MywgICAvKiBCaXQgIDM6CVBvcnQgU3BlZWQgMTAwIE1icHMgKi8KKwlHTV9HUENSX0FVX0RVUF9ESVMJPSAxPDwyLAkvKiBCaXQgIDI6CURpc2FibGUgQXV0by1VcGRhdGUgRHVwbGV4ICovCisJR01fR1BDUl9BVV9GQ1RfRElTCT0gMTw8MSwJLyogQml0ICAxOglEaXNhYmxlIEF1dG8tVXBkYXRlIEZsb3ctQy4gKi8KKwlHTV9HUENSX0FVX1NQRF9ESVMJPSAxPDwwLAkvKiBCaXQgIDA6CURpc2FibGUgQXV0by1VcGRhdGUgU3BlZWQgKi8KK307CisKKyNkZWZpbmUgR01fR1BDUl9TUEVFRF8xMDAwCShHTV9HUENSX0dJR1NfRU5BIHwgR01fR1BDUl9TUEVFRF8xMDApCisjZGVmaW5lIEdNX0dQQ1JfQVVfQUxMX0RJUwkoR01fR1BDUl9BVV9EVVBfRElTIHwgR01fR1BDUl9BVV9GQ1RfRElTfEdNX0dQQ1JfQVVfU1BEX0RJUykKKworLyoJR01fVFhfQ1RSTAkJCTE2IGJpdCByL3cJVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAqLworZW51bSB7CisJR01fVFhDUl9GT1JDRV9KQU0JPSAxPDwxNSwgLyogQml0IDE1OglGb3JjZSBKYW0gLyBGbG93LUNvbnRyb2wgKi8KKwlHTV9UWENSX0NSQ19ESVMJCT0gMTw8MTQsIC8qIEJpdCAxNDoJRGlzYWJsZSBpbnNlcnRpb24gb2YgQ1JDICovCisJR01fVFhDUl9QQURfRElTCQk9IDE8PDEzLCAvKiBCaXQgMTM6CURpc2FibGUgcGFkZGluZyBvZiBwYWNrZXRzICovCisJR01fVFhDUl9DT0xfVEhSX01TSwk9IDc8PDEwLCAvKiBCaXQgMTIuLjEwOglDb2xsaXNpb24gVGhyZXNob2xkICovCit9OworCisjZGVmaW5lIFRYX0NPTF9USFIoeCkJCSgoKHgpPDwxMCkgJiBHTV9UWENSX0NPTF9USFJfTVNLKQorI2RlZmluZSBUWF9DT0xfREVGCQkweDA0CS8qIGxhdGUgY29sbGlzaW9uIGFmdGVyIDY0IGJ5dGUgKi8KKworLyoJR01fUlhfQ1RSTAkJCTE2IGJpdCByL3cJUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCitlbnVtIHsKKwlHTV9SWENSX1VDRl9FTkEJPSAxPDwxNSwgLyogQml0IDE1OglFbmFibGUgVW5pY2FzdCBmaWx0ZXJpbmcgKi8KKwlHTV9SWENSX01DRl9FTkEJPSAxPDwxNCwgLyogQml0IDE0OglFbmFibGUgTXVsdGljYXN0IGZpbHRlcmluZyAqLworCUdNX1JYQ1JfQ1JDX0RJUwk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW92ZSA0LWJ5dGUgQ1JDICovCisJR01fUlhDUl9QQVNTX0ZDCT0gMTw8MTIsIC8qIEJpdCAxMjoJUGFzcyBGQyBwYWNrZXRzIHRvIEZJRk8gKi8KK307CisKKy8qCUdNX1RYX1BBUkFNCQkxNiBiaXQgci93CVRyYW5zbWl0IFBhcmFtZXRlciBSZWdpc3RlciAqLworZW51bSB7CisJR01fVFhQQV9KQU1MRU5fTVNLCT0gMHgwMzw8MTQsCS8qIEJpdCAxNS4uMTQ6CUphbSBMZW5ndGggKi8KKwlHTV9UWFBBX0pBTUlQR19NU0sJPSAweDFmPDw5LAkvKiBCaXQgMTMuLjk6CUphbSBJUEcgKi8KKwlHTV9UWFBBX0pBTURBVF9NU0sJPSAweDFmPDw0LAkvKiBCaXQgIDguLjQ6CUlQRyBKYW0gdG8gRGF0YSAqLworCisJVFhfSkFNX0xFTl9ERUYJCT0gMHgwMywKKwlUWF9KQU1fSVBHX0RFRgkJPSAweDBiLAorCVRYX0lQR19KQU1fREVGCQk9IDB4MWMsCit9OworCisjZGVmaW5lIFRYX0pBTV9MRU5fVkFMKHgpCSgoKHgpPDwxNCkgJiBHTV9UWFBBX0pBTUxFTl9NU0spCisjZGVmaW5lIFRYX0pBTV9JUEdfVkFMKHgpCSgoKHgpPDw5KSAgJiBHTV9UWFBBX0pBTUlQR19NU0spCisjZGVmaW5lIFRYX0lQR19KQU1fREFUQSh4KQkoKCh4KTw8NCkgICYgR01fVFhQQV9KQU1EQVRfTVNLKQorCisKKy8qCUdNX1NFUklBTF9NT0RFCQkJMTYgYml0IHIvdwlTZXJpYWwgTW9kZSBSZWdpc3RlciAqLworZW51bSB7CisJR01fU01PRF9EQVRBQkxfTVNLCT0gMHgxZjw8MTEsIC8qIEJpdCAxNS4uMTE6CURhdGEgQmxpbmRlciAoci9vKSAqLworCUdNX1NNT0RfTElNSVRfNAkJPSAxPDwxMCwgLyogQml0IDEwOgk0IGNvbnNlY3V0aXZlIFR4IHRyaWFscyAqLworCUdNX1NNT0RfVkxBTl9FTkEJPSAxPDw5LAkvKiBCaXQgIDk6CUVuYWJsZSBWTEFOICAoTWF4LiBGcmFtZSBMZW4pICovCisJR01fU01PRF9KVU1CT19FTkEJPSAxPDw4LAkvKiBCaXQgIDg6CUVuYWJsZSBKdW1ibyAoTWF4LiBGcmFtZSBMZW4pICovCisJIEdNX1NNT0RfSVBHX01TSwk9IDB4MWYJLyogQml0IDQuLjA6CUludGVyLVBhY2tldCBHYXAgKElQRykgKi8KK307CisKKyNkZWZpbmUgREFUQV9CTElORF9WQUwoeCkJKCgoeCk8PDExKSAmIEdNX1NNT0RfREFUQUJMX01TSykKKyNkZWZpbmUgREFUQV9CTElORF9ERUYJCTB4MDQKKworI2RlZmluZSBJUEdfREFUQV9WQUwoeCkJCSh4ICYgR01fU01PRF9JUEdfTVNLKQorI2RlZmluZSBJUEdfREFUQV9ERUYJCTB4MWUKKworLyoJR01fU01JX0NUUkwJCQkxNiBiaXQgci93CVNNSSBDb250cm9sIFJlZ2lzdGVyICovCitlbnVtIHsKKwlHTV9TTUlfQ1RfUEhZX0FfTVNLCT0gMHgxZjw8MTEsIC8qIEJpdCAxNS4uMTE6CVBIWSBEZXZpY2UgQWRkcmVzcyAqLworCUdNX1NNSV9DVF9SRUdfQV9NU0sJPSAweDFmPDw2LCAvKiBCaXQgMTAuLiA2OglQSFkgUmVnaXN0ZXIgQWRkcmVzcyAqLworCUdNX1NNSV9DVF9PUF9SRAkJPSAxPDw1LAkvKiBCaXQgIDU6CU9wQ29kZSBSZWFkICgwPVdyaXRlKSovCisJR01fU01JX0NUX1JEX1ZBTAk9IDE8PDQsCS8qIEJpdCAgNDoJUmVhZCBWYWxpZCAoUmVhZCBjb21wbGV0ZWQpICovCisJR01fU01JX0NUX0JVU1kJCT0gMTw8MywJLyogQml0ICAzOglCdXN5IChPcGVyYXRpb24gaW4gcHJvZ3Jlc3MpICovCit9OworCisjZGVmaW5lIEdNX1NNSV9DVF9QSFlfQUQoeCkJKCgoeCk8PDExKSAmIEdNX1NNSV9DVF9QSFlfQV9NU0spCisjZGVmaW5lIEdNX1NNSV9DVF9SRUdfQUQoeCkJKCgoeCk8PDYpICYgR01fU01JX0NUX1JFR19BX01TSykKKworLyoJR01fUEhZX0FERFIJCQkJMTYgYml0IHIvdwlHUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KK2VudW0geworCUdNX1BBUl9NSUJfQ0xSCT0gMTw8NSwJLyogQml0ICA1OglTZXQgTUlCIENsZWFyIENvdW50ZXIgTW9kZSAqLworCUdNX1BBUl9NSUJfVFNUCT0gMTw8NCwJLyogQml0ICA0OglNSUIgTG9hZCBDb3VudGVyIChUZXN0IE1vZGUpICovCit9OworCisvKiBSZWNlaXZlIEZyYW1lIFN0YXR1cyBFbmNvZGluZyAqLworZW51bSB7CisJR01SX0ZTX0xFTgk9IDB4ZmZmZjw8MTYsIC8qIEJpdCAzMS4uMTY6CVJ4IEZyYW1lIExlbmd0aCAqLworCUdNUl9GU19MRU5fU0hJRlQgPSAxNiwKKwlHTVJfRlNfVkxBTgk9IDE8PDEzLCAvKiBCaXQgMTM6CVZMQU4gUGFja2V0ICovCisJR01SX0ZTX0pBQkJFUgk9IDE8PDEyLCAvKiBCaXQgMTI6CUphYmJlciBQYWNrZXQgKi8KKwlHTVJfRlNfVU5fU0laRQk9IDE8PDExLCAvKiBCaXQgMTE6CVVuZGVyc2l6ZSBQYWNrZXQgKi8KKwlHTVJfRlNfTUMJPSAxPDwxMCwgLyogQml0IDEwOglNdWx0aWNhc3QgUGFja2V0ICovCisJR01SX0ZTX0JDCT0gMTw8OSwgLyogQml0ICA5OglCcm9hZGNhc3QgUGFja2V0ICovCisJR01SX0ZTX1JYX09LCT0gMTw8OCwgLyogQml0ICA4OglSZWNlaXZlIE9LIChHb29kIFBhY2tldCkgKi8KKwlHTVJfRlNfR09PRF9GQwk9IDE8PDcsIC8qIEJpdCAgNzoJR29vZCBGbG93LUNvbnRyb2wgUGFja2V0ICovCisJR01SX0ZTX0JBRF9GQwk9IDE8PDYsIC8qIEJpdCAgNjoJQmFkICBGbG93LUNvbnRyb2wgUGFja2V0ICovCisJR01SX0ZTX01JSV9FUlIJPSAxPDw1LCAvKiBCaXQgIDU6CU1JSSBFcnJvciAqLworCUdNUl9GU19MT05HX0VSUgk9IDE8PDQsIC8qIEJpdCAgNDoJVG9vIExvbmcgUGFja2V0ICovCisJR01SX0ZTX0ZSQUdNRU5UCT0gMTw8MywgLyogQml0ICAzOglGcmFnbWVudCAqLworCisJR01SX0ZTX0NSQ19FUlIJPSAxPDwxLCAvKiBCaXQgIDE6CUNSQyBFcnJvciAqLworCUdNUl9GU19SWF9GRl9PVgk9IDE8PDAsIC8qIEJpdCAgMDoJUnggRklGTyBPdmVyZmxvdyAqLworCisvKgorICogR01SX0ZTX0FOWV9FUlIgKGFuYWxvZ291cyB0byBYTVJfRlNfQU5ZX0VSUikKKyAqLworCUdNUl9GU19BTllfRVJSCT0gR01SX0ZTX0NSQ19FUlIgfCBHTVJfRlNfTE9OR19FUlIgfAorCQkJICBHTVJfRlNfTUlJX0VSUiB8IEdNUl9GU19CQURfRkMgfCBHTVJfRlNfR09PRF9GQyB8CisJCQkgIEdNUl9GU19KQUJCRVIsCisvKiBSeCBHTUFDIEZJRk8gRmx1c2ggTWFzayAoZGVmYXVsdCkgKi8KKwlSWF9GRl9GTF9ERUZfTVNLID0gR01SX0ZTX0NSQ19FUlIgfCBHTVJfRlNfUlhfRkZfT1YgfEdNUl9GU19NSUlfRVJSIHwKKwkJCSAgIEdNUl9GU19CQURfRkMgfCAgR01SX0ZTX1VOX1NJWkUgfCBHTVJfRlNfSkFCQkVSLAorfTsKKworLyoJUlhfR01GX0NUUkxfVAkzMiBiaXQJUnggR01BQyBGSUZPIENvbnRyb2wvVGVzdCAqLworZW51bSB7CisJR01GX1dQX1RTVF9PTgk9IDE8PDE0LAkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT24gKi8KKwlHTUZfV1BfVFNUX09GRgk9IDE8PDEzLAkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT2ZmICovCisJR01GX1dQX1NURVAJPSAxPDwxMiwJLyogV3JpdGUgUG9pbnRlciBTdGVwL0luY3JlbWVudCAqLworCisJR01GX1JQX1RTVF9PTgk9IDE8PDEwLAkvKiBSZWFkIFBvaW50ZXIgVGVzdCBPbiAqLworCUdNRl9SUF9UU1RfT0ZGCT0gMTw8OSwJCS8qIFJlYWQgUG9pbnRlciBUZXN0IE9mZiAqLworCUdNRl9SUF9TVEVQCT0gMTw8OCwJCS8qIFJlYWQgUG9pbnRlciBTdGVwL0luY3JlbWVudCAqLworCUdNRl9SWF9GX0ZMX09OCT0gMTw8NywJCS8qIFJ4IEZJRk8gRmx1c2ggTW9kZSBPbiAqLworCUdNRl9SWF9GX0ZMX09GRgk9IDE8PDYsCQkvKiBSeCBGSUZPIEZsdXNoIE1vZGUgT2ZmICovCisJR01GX0NMSV9SWF9GTwk9IDE8PDUsCQkvKiBDbGVhciBJUlEgUnggRklGTyBPdmVycnVuICovCisJR01GX0NMSV9SWF9GQwk9IDE8PDQsCQkvKiBDbGVhciBJUlEgUnggRnJhbWUgQ29tcGxldGUgKi8KKwlHTUZfT1BFUl9PTgk9IDE8PDMsCQkvKiBPcGVyYXRpb25hbCBNb2RlIE9uICovCisJR01GX09QRVJfT0ZGCT0gMTw8MiwJCS8qIE9wZXJhdGlvbmFsIE1vZGUgT2ZmICovCisJR01GX1JTVF9DTFIJPSAxPDwxLAkJLyogQ2xlYXIgR01BQyBGSUZPIFJlc2V0ICovCisJR01GX1JTVF9TRVQJPSAxPDwwLAkJLyogU2V0ICAgR01BQyBGSUZPIFJlc2V0ICovCisKKwlSWF9HTUZfRkxfVEhSX0RFRiA9IDB4YSwJLyogZmx1c2ggdGhyZXNob2xkIChkZWZhdWx0KSAqLworfTsKKworCisvKglUWF9HTUZfQ1RSTF9UCTMyIGJpdAlUeCBHTUFDIEZJRk8gQ29udHJvbC9UZXN0ICovCitlbnVtIHsKKwlHTUZfV1NQX1RTVF9PTgk9IDE8PDE4LCAvKiBXcml0ZSBTaGFkb3cgUG9pbnRlciBUZXN0IE9uICovCisJR01GX1dTUF9UU1RfT0ZGCT0gMTw8MTcsIC8qIFdyaXRlIFNoYWRvdyBQb2ludGVyIFRlc3QgT2ZmICovCisJR01GX1dTUF9TVEVQCT0gMTw8MTYsIC8qIFdyaXRlIFNoYWRvdyBQb2ludGVyIFN0ZXAvSW5jcmVtZW50ICovCisKKwlHTUZfQ0xJX1RYX0ZVCT0gMTw8NiwJLyogQ2xlYXIgSVJRIFR4IEZJRk8gVW5kZXJydW4gKi8KKwlHTUZfQ0xJX1RYX0ZDCT0gMTw8NSwJLyogQ2xlYXIgSVJRIFR4IEZyYW1lIENvbXBsZXRlICovCisJR01GX0NMSV9UWF9QRQk9IDE8PDQsCS8qIENsZWFyIElSUSBUeCBQYXJpdHkgRXJyb3IgKi8KK307CisKKy8qCUdNQUNfVElfU1RfQ1RSTAkgOCBiaXQJVGltZSBTdGFtcCBUaW1lciBDdHJsIFJlZyAoWVVLT04gb25seSkgKi8KK2VudW0geworCUdNVF9TVF9TVEFSVAk9IDE8PDIsCS8qIFN0YXJ0IFRpbWUgU3RhbXAgVGltZXIgKi8KKwlHTVRfU1RfU1RPUAk9IDE8PDEsCS8qIFN0b3AgIFRpbWUgU3RhbXAgVGltZXIgKi8KKwlHTVRfU1RfQ0xSX0lSUQk9IDE8PDAsCS8qIENsZWFyIFRpbWUgU3RhbXAgVGltZXIgSVJRICovCit9OworCisvKglHTUFDX0NUUkwJCTMyIGJpdAlHTUFDIENvbnRyb2wgUmVnIChZVUtPTiBvbmx5KSAqLworZW51bSB7CisJR01DX0hfQlVSU1RfT04JPSAxPDw3LAkvKiBIYWxmIER1cGxleCBCdXJzdCBNb2RlIE9uICovCisJR01DX0hfQlVSU1RfT0ZGCT0gMTw8NiwJLyogSGFsZiBEdXBsZXggQnVyc3QgTW9kZSBPZmYgKi8KKwlHTUNfRl9MT09QQl9PTgk9IDE8PDUsCS8qIEZJRk8gTG9vcGJhY2sgT24gKi8KKwlHTUNfRl9MT09QQl9PRkYJPSAxPDw0LAkvKiBGSUZPIExvb3BiYWNrIE9mZiAqLworCUdNQ19QQVVTRV9PTgk9IDE8PDMsCS8qIFBhdXNlIE9uICovCisJR01DX1BBVVNFX09GRgk9IDE8PDIsCS8qIFBhdXNlIE9mZiAqLworCUdNQ19SU1RfQ0xSCT0gMTw8MSwJLyogQ2xlYXIgR01BQyBSZXNldCAqLworCUdNQ19SU1RfU0VUCT0gMTw8MCwJLyogU2V0ICAgR01BQyBSZXNldCAqLworfTsKKworLyoJR1BIWV9DVFJMCQkzMiBiaXQJR1BIWSBDb250cm9sIFJlZyAoWVVLT04gb25seSkgKi8KK2VudW0geworCUdQQ19TRUxfQkRUCT0gMTw8MjgsIC8qIFNlbGVjdCBCaS1EaXIuIFRyYW5zZmVyIGZvciBNREMvTURJTyAqLworCUdQQ19JTlRfUE9MX0hJCT0gMTw8MjcsIC8qIElSUSBQb2xhcml0eSBpcyBBY3RpdmUgSElHSCAqLworCUdQQ183NV9PSE0JPSAxPDwyNiwgLyogVXNlIDc1IE9obSBUZXJtaW5hdGlvbiBpbnN0ZWFkIG9mIDUwICovCisJR1BDX0RJU19GQwk9IDE8PDI1LCAvKiBEaXNhYmxlIEF1dG9tYXRpYyBGaWJlci9Db3BwZXIgRGV0ZWN0aW9uICovCisJR1BDX0RJU19TTEVFUAk9IDE8PDI0LCAvKiBEaXNhYmxlIEVuZXJneSBEZXRlY3QgKi8KKwlHUENfSFdDRkdfTV8zCT0gMTw8MjMsIC8qIEhXQ0ZHX01PREVbM10gKi8KKwlHUENfSFdDRkdfTV8yCT0gMTw8MjIsIC8qIEhXQ0ZHX01PREVbMl0gKi8KKwlHUENfSFdDRkdfTV8xCT0gMTw8MjEsIC8qIEhXQ0ZHX01PREVbMV0gKi8KKwlHUENfSFdDRkdfTV8wCT0gMTw8MjAsIC8qIEhXQ0ZHX01PREVbMF0gKi8KKwlHUENfQU5FR18wCT0gMTw8MTksIC8qIEFORUdbMF0gKi8KKwlHUENfRU5BX1hDCT0gMTw8MTgsIC8qIEVuYWJsZSBNREkgY3Jvc3NvdmVyICovCisJR1BDX0RJU18xMjUJPSAxPDwxNywgLyogRGlzYWJsZSAxMjUgTUh6IGNsb2NrICovCisJR1BDX0FORUdfMwk9IDE8PDE2LCAvKiBBTkVHWzNdICovCisJR1BDX0FORUdfMgk9IDE8PDE1LCAvKiBBTkVHWzJdICovCisJR1BDX0FORUdfMQk9IDE8PDE0LCAvKiBBTkVHWzFdICovCisJR1BDX0VOQV9QQVVTRQk9IDE8PDEzLCAvKiBFbmFibGUgUGF1c2UgKFNZTV9PUl9SRU0pICovCisJR1BDX1BIWUFERFJfNAk9IDE8PDEyLCAvKiBCaXQgNCBvZiBQaHkgQWRkciAqLworCUdQQ19QSFlBRERSXzMJPSAxPDwxMSwgLyogQml0IDMgb2YgUGh5IEFkZHIgKi8KKwlHUENfUEhZQUREUl8yCT0gMTw8MTAsIC8qIEJpdCAyIG9mIFBoeSBBZGRyICovCisJR1BDX1BIWUFERFJfMQk9IDE8PDksCSAvKiBCaXQgMSBvZiBQaHkgQWRkciAqLworCUdQQ19QSFlBRERSXzAJPSAxPDw4LAkgLyogQml0IDAgb2YgUGh5IEFkZHIgKi8KKwkJCQkJCS8qIEJpdHMgIDcuLjI6CXJlc2VydmVkICovCisJR1BDX1JTVF9DTFIJPSAxPDwxLAkvKiBDbGVhciBHUEhZIFJlc2V0ICovCisJR1BDX1JTVF9TRVQJPSAxPDwwLAkvKiBTZXQgICBHUEhZIFJlc2V0ICovCit9OworCisjZGVmaW5lIEdQQ19IV0NGR19HTUlJX0NPUCAoR1BDX0hXQ0ZHX01fM3xHUENfSFdDRkdfTV8yIHwgR1BDX0hXQ0ZHX01fMSB8IEdQQ19IV0NGR19NXzApCisjZGVmaW5lIEdQQ19IV0NGR19HTUlJX0ZJQiAoR1BDX0hXQ0ZHX01fMiB8IEdQQ19IV0NGR19NXzEgfCBHUENfSFdDRkdfTV8wKQorI2RlZmluZSBHUENfQU5FR19BRFZfQUxMX00gIChHUENfQU5FR18zIHwgR1BDX0FORUdfMiB8IEdQQ19BTkVHXzEgfCBHUENfQU5FR18wKQorCisvKiBmb3JjZWQgc3BlZWQgYW5kIGR1cGxleCBtb2RlIChkb24ndCBtaXggd2l0aCBvdGhlciBBTkVHIGJpdHMpICovCisjZGVmaW5lIEdQQ19GUkMxME1CSVRfSEFMRgkwCisjZGVmaW5lIEdQQ19GUkMxME1CSVRfRlVMTAlHUENfQU5FR18wCisjZGVmaW5lIEdQQ19GUkMxMDBNQklUX0hBTEYJR1BDX0FORUdfMQorI2RlZmluZSBHUENfRlJDMTAwTUJJVF9GVUxMCShHUENfQU5FR18wIHwgR1BDX0FORUdfMSkKKworLyogYXV0by1uZWdvdGlhdGlvbiB3aXRoIGxpbWl0ZWQgYWR2ZXJ0aXNlZCBzcGVlZHMgKi8KKy8qIG1peCBvbmx5IHdpdGggbWFzdGVyL3NsYXZlIHNldHRpbmdzIChmb3IgY29wcGVyKSAqLworI2RlZmluZSBHUENfQURWXzEwMDBfSEFMRglHUENfQU5FR18yCisjZGVmaW5lIEdQQ19BRFZfMTAwMF9GVUxMCUdQQ19BTkVHXzMKKyNkZWZpbmUgR1BDX0FEVl9BTEwJCShHUENfQU5FR18yIHwgR1BDX0FORUdfMykKKworLyogbWFzdGVyL3NsYXZlIHNldHRpbmdzICovCisvKiBvbmx5IGZvciBjb3BwZXIgd2l0aCAxMDAwIE1icHMgKi8KKyNkZWZpbmUgR1BDX0ZPUkNFX01BU1RFUgkwCisjZGVmaW5lIEdQQ19GT1JDRV9TTEFWRQkJR1BDX0FORUdfMAorI2RlZmluZSBHUENfUFJFRl9NQVNURVIJCUdQQ19BTkVHXzEKKyNkZWZpbmUgR1BDX1BSRUZfU0xBVkUJCShHUENfQU5FR18xIHwgR1BDX0FORUdfMCkKKworLyoJR01BQ19JUlFfU1JDCSA4IGJpdAlHTUFDIEludGVycnVwdCBTb3VyY2UgUmVnIChZVUtPTiBvbmx5KSAqLworLyoJR01BQ19JUlFfTVNLCSA4IGJpdAlHTUFDIEludGVycnVwdCBNYXNrICAgUmVnIChZVUtPTiBvbmx5KSAqLworZW51bSB7CisJR01fSVNfVFhfQ09fT1YJPSAxPDw1LAkvKiBUcmFuc21pdCBDb3VudGVyIE92ZXJmbG93IElSUSAqLworCUdNX0lTX1JYX0NPX09WCT0gMTw8NCwJLyogUmVjZWl2ZSBDb3VudGVyIE92ZXJmbG93IElSUSAqLworCUdNX0lTX1RYX0ZGX1VSCT0gMTw8MywJLyogVHJhbnNtaXQgRklGTyBVbmRlcnJ1biAqLworCUdNX0lTX1RYX0NPTVBMCT0gMTw8MiwJLyogRnJhbWUgVHJhbnNtaXNzaW9uIENvbXBsZXRlICovCisJR01fSVNfUlhfRkZfT1IJPSAxPDwxLAkvKiBSZWNlaXZlIEZJRk8gT3ZlcnJ1biAqLworCUdNX0lTX1JYX0NPTVBMCT0gMTw8MCwJLyogRnJhbWUgUmVjZXB0aW9uIENvbXBsZXRlICovCisKKyNkZWZpbmUgR01BQ19ERUZfTVNLCShHTV9JU19SWF9GRl9PUiB8IEdNX0lTX1RYX0ZGX1VSKQorCisvKglHTUFDX0xJTktfQ1RSTAkxNiBiaXQJR01BQyBMaW5rIENvbnRyb2wgUmVnIChZVUtPTiBvbmx5KSAqLworCQkJCQkJLyogQml0cyAxNS4uIDI6CXJlc2VydmVkICovCisJR01MQ19SU1RfQ0xSCT0gMTw8MSwJLyogQ2xlYXIgR01BQyBMaW5rIFJlc2V0ICovCisJR01MQ19SU1RfU0VUCT0gMTw8MCwJLyogU2V0ICAgR01BQyBMaW5rIFJlc2V0ICovCisKKworLyoJV09MX0NUUkxfU1RBVAkxNiBiaXQJV09MIENvbnRyb2wvU3RhdHVzIFJlZyAqLworCVdPTF9DVExfTElOS19DSEdfT0NDCQk9IDE8PDE1LAorCVdPTF9DVExfTUFHSUNfUEtUX09DQwkJPSAxPDwxNCwKKwlXT0xfQ1RMX1BBVFRFUk5fT0NDCQk9IDE8PDEzLAorCVdPTF9DVExfQ0xFQVJfUkVTVUxUCQk9IDE8PDEyLAorCVdPTF9DVExfRU5BX1BNRV9PTl9MSU5LX0NIRwk9IDE8PDExLAorCVdPTF9DVExfRElTX1BNRV9PTl9MSU5LX0NIRwk9IDE8PDEwLAorCVdPTF9DVExfRU5BX1BNRV9PTl9NQUdJQ19QS1QJPSAxPDw5LAorCVdPTF9DVExfRElTX1BNRV9PTl9NQUdJQ19QS1QJPSAxPDw4LAorCVdPTF9DVExfRU5BX1BNRV9PTl9QQVRURVJOCT0gMTw8NywKKwlXT0xfQ1RMX0RJU19QTUVfT05fUEFUVEVSTgk9IDE8PDYsCisJV09MX0NUTF9FTkFfTElOS19DSEdfVU5JVAk9IDE8PDUsCisJV09MX0NUTF9ESVNfTElOS19DSEdfVU5JVAk9IDE8PDQsCisJV09MX0NUTF9FTkFfTUFHSUNfUEtUX1VOSVQJPSAxPDwzLAorCVdPTF9DVExfRElTX01BR0lDX1BLVF9VTklUCT0gMTw8MiwKKwlXT0xfQ1RMX0VOQV9QQVRURVJOX1VOSVQJPSAxPDwxLAorCVdPTF9DVExfRElTX1BBVFRFUk5fVU5JVAk9IDE8PDAsCit9OworCisjZGVmaW5lIFdPTF9DVExfREVGQVVMVAkJCQlcCisJKFdPTF9DVExfRElTX1BNRV9PTl9MSU5LX0NIRyB8CVwKKwlXT0xfQ1RMX0RJU19QTUVfT05fUEFUVEVSTiB8CVwKKwlXT0xfQ1RMX0RJU19QTUVfT05fTUFHSUNfUEtUIHwJXAorCVdPTF9DVExfRElTX0xJTktfQ0hHX1VOSVQgfAkJXAorCVdPTF9DVExfRElTX1BBVFRFUk5fVU5JVCB8CQlcCisJV09MX0NUTF9ESVNfTUFHSUNfUEtUX1VOSVQpCisKKy8qCVdPTF9NQVRDSF9DVEwJIDggYml0CVdPTCBNYXRjaCBDb250cm9sIFJlZyAqLworI2RlZmluZSBXT0xfQ1RMX1BBVFRfRU5BKHgpCSgxIDw8ICh4KSkKKworCisvKiBYTUFDIElJIHJlZ2lzdGVycwkJCQkgICAgICAqLworZW51bSB7CisJWE1fTU1VX0NNRAk9IDB4MDAwMCwgLyogMTYgYml0IHIvdwlNTVUgQ29tbWFuZCBSZWdpc3RlciAqLworCVhNX1BPRkYJCT0gMHgwMDA4LCAvKiAzMiBiaXQgci93CVBhY2tldCBPZmZzZXQgUmVnaXN0ZXIgKi8KKwlYTV9CVVJTVAk9IDB4MDAwYywgLyogMzIgYml0IHIvdwlCdXJzdCBSZWdpc3RlciBmb3IgaGFsZiBkdXBsZXgqLworCVhNXzFMX1ZMQU5fVEFHCT0gMHgwMDEwLCAvKiAxNiBiaXQgci93CU9uZSBMZXZlbCBWTEFOIFRhZyBJRCAqLworCVhNXzJMX1ZMQU5fVEFHCT0gMHgwMDE0LCAvKiAxNiBiaXQgci93CVR3byBMZXZlbCBWTEFOIFRhZyBJRCAqLworCVhNX1RYX0NNRAk9IDB4MDAyMCwgLyogMTYgYml0IHIvdwlUcmFuc21pdCBDb21tYW5kIFJlZ2lzdGVyICovCisJWE1fVFhfUlRfTElNCT0gMHgwMDI0LCAvKiAxNiBiaXQgci93CVRyYW5zbWl0IFJldHJ5IExpbWl0IFJlZ2lzdGVyICovCisJWE1fVFhfU1RJTUUJPSAweDAwMjgsIC8qIDE2IGJpdCByL3cJVHJhbnNtaXQgU2xvdHRpbWUgUmVnaXN0ZXIgKi8KKwlYTV9UWF9JUEcJPSAweDAwMmMsIC8qIDE2IGJpdCByL3cJVHJhbnNtaXQgSW50ZXIgUGFja2V0IEdhcCAqLworCVhNX1JYX0NNRAk9IDB4MDAzMCwgLyogMTYgYml0IHIvdwlSZWNlaXZlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKwlYTV9QSFlfQUREUgk9IDB4MDAzNCwgLyogMTYgYml0IHIvdwlQSFkgQWRkcmVzcyBSZWdpc3RlciAqLworCVhNX1BIWV9EQVRBCT0gMHgwMDM4LCAvKiAxNiBiaXQgci93CVBIWSBEYXRhIFJlZ2lzdGVyICovCisJWE1fR1BfUE9SVAk9IDB4MDA0MCwgLyogMzIgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgUG9ydCBSZWdpc3RlciAqLworCVhNX0lNU0sJCT0gMHgwMDQ0LCAvKiAxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisJWE1fSVNSQwkJPSAweDAwNDgsIC8qIDE2IGJpdCByL28JSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworCVhNX0hXX0NGRwk9IDB4MDA0YywgLyogMTYgYml0IHIvdwlIYXJkd2FyZSBDb25maWcgUmVnaXN0ZXIgKi8KKwlYTV9UWF9MT19XTQk9IDB4MDA2MCwgLyogMTYgYml0IHIvdwlUeCBGSUZPIExvdyBXYXRlciBNYXJrICovCisJWE1fVFhfSElfV00JPSAweDAwNjIsIC8qIDE2IGJpdCByL3cJVHggRklGTyBIaWdoIFdhdGVyIE1hcmsgKi8KKwlYTV9UWF9USFIJPSAweDAwNjQsIC8qIDE2IGJpdCByL3cJVHggUmVxdWVzdCBUaHJlc2hvbGQgKi8KKwlYTV9IVF9USFIJPSAweDAwNjYsIC8qIDE2IGJpdCByL3cJSG9zdCBSZXF1ZXN0IFRocmVzaG9sZCAqLworCVhNX1BBVVNFX0RBCT0gMHgwMDY4LCAvKiBOQSByZWcgci93CVBhdXNlIERlc3RpbmF0aW9uIEFkZHJlc3MgKi8KKwlYTV9DVExfUEFSQQk9IDB4MDA3MCwgLyogMzIgYml0IHIvdwlDb250cm9sIFBhcmFtZXRlciBSZWdpc3RlciAqLworCVhNX01BQ19PUENPREUJPSAweDAwNzQsIC8qIDE2IGJpdCByL3cJT3Bjb2RlIGZvciBNQUMgY29udHJvbCBmcmFtZXMgKi8KKwlYTV9NQUNfUFRJTUUJPSAweDAwNzYsIC8qIDE2IGJpdCByL3cJUGF1c2UgdGltZSBmb3IgTUFDIGN0cmwgZnJhbWVzKi8KKwlYTV9UWF9TVEFUCT0gMHgwMDc4LCAvKiAzMiBiaXQgci9vCVR4IFN0YXR1cyBMSUZPIFJlZ2lzdGVyICovCisKKwlYTV9FWE1fU1RBUlQJPSAweDAwODAsIC8qIHIvdwlTdGFydCBBZGRyZXNzIG9mIHRoZSBFWE0gUmVncyAqLworI2RlZmluZSBYTV9FWE0ocmVnKQkoWE1fRVhNX1NUQVJUICsgKChyZWcpIDw8IDMpKQorfTsKKworZW51bSB7CisJWE1fU1JDX0NISwk9IDB4MDEwMCwgLyogTkEgcmVnIHIvdwlTb3VyY2UgQ2hlY2sgQWRkcmVzcyBSZWdpc3RlciAqLworCVhNX1NBCQk9IDB4MDEwOCwgLyogTkEgcmVnIHIvdwlTdGF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwlYTV9IU00JCT0gMHgwMTEwLCAvKiA2NCBiaXQgci93CUhhc2ggTWF0Y2ggQWRkcmVzcyBSZWdpc3RlcnMgKi8KKwlYTV9SWF9MT19XTQk9IDB4MDExOCwgLyogMTYgYml0IHIvdwlSZWNlaXZlIExvdyBXYXRlciBNYXJrICovCisJWE1fUlhfSElfV00JPSAweDAxMWEsIC8qIDE2IGJpdCByL3cJUmVjZWl2ZSBIaWdoIFdhdGVyIE1hcmsgKi8KKwlYTV9SWF9USFIJPSAweDAxMWMsIC8qIDMyIGJpdCByL3cJUmVjZWl2ZSBSZXF1ZXN0IFRocmVzaG9sZCAqLworCVhNX0RFVl9JRAk9IDB4MDEyMCwgLyogMzIgYml0IHIvbwlEZXZpY2UgSUQgUmVnaXN0ZXIgKi8KKwlYTV9NT0RFCQk9IDB4MDEyNCwgLyogMzIgYml0IHIvdwlNb2RlIFJlZ2lzdGVyICovCisJWE1fTFNBCQk9IDB4MDEyOCwgLyogTkEgcmVnIHIvbwlMYXN0IFNvdXJjZSBSZWdpc3RlciAqLworCVhNX1RTX1JFQUQJPSAweDAxMzAsIC8qIDMyIGJpdCByL28JVGltZSBTdGFtcCBSZWFkIFJlZ2lzdGVyICovCisJWE1fVFNfTE9BRAk9IDB4MDEzNCwgLyogMzIgYml0IHIvbwlUaW1lIFN0YW1wIExvYWQgVmFsdWUgKi8KKwlYTV9TVEFUX0NNRAk9IDB4MDIwMCwgLyogMTYgYml0IHIvdwlTdGF0aXN0aWNzIENvbW1hbmQgUmVnaXN0ZXIgKi8KKwlYTV9SWF9DTlRfRVYJPSAweDAyMDQsIC8qIDMyIGJpdCByL28JUnggQ291bnRlciBFdmVudCBSZWdpc3RlciAqLworCVhNX1RYX0NOVF9FVgk9IDB4MDIwOCwgLyogMzIgYml0IHIvbwlUeCBDb3VudGVyIEV2ZW50IFJlZ2lzdGVyICovCisJWE1fUlhfRVZfTVNLCT0gMHgwMjBjLCAvKiAzMiBiaXQgci93CVJ4IENvdW50ZXIgRXZlbnQgTWFzayAqLworCVhNX1RYX0VWX01TSwk9IDB4MDIxMCwgLyogMzIgYml0IHIvdwlUeCBDb3VudGVyIEV2ZW50IE1hc2sgKi8KKwlYTV9UWEZfT0sJPSAweDAyODAsIC8qIDMyIGJpdCByL28JRnJhbWVzIFRyYW5zbWl0dGVkIE9LIENvbnV0ZXIgKi8KKwlYTV9UWE9fT0tfSEkJPSAweDAyODQsIC8qIDMyIGJpdCByL28JT2N0ZXRzIFRyYW5zbWl0dGVkIE9LIEhpZ2ggQ250Ki8KKwlYTV9UWE9fT0tfTE8JPSAweDAyODgsIC8qIDMyIGJpdCByL28JT2N0ZXRzIFRyYW5zbWl0dGVkIE9LIExvdyBDbnQgKi8KKwlYTV9UWEZfQkNfT0sJPSAweDAyOGMsIC8qIDMyIGJpdCByL28JQnJvYWRjYXN0IEZyYW1lcyBYbWl0dGVkIE9LICovCisJWE1fVFhGX01DX09LCT0gMHgwMjkwLCAvKiAzMiBiaXQgci9vCU11bHRpY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworCVhNX1RYRl9VQ19PSwk9IDB4MDI5NCwgLyogMzIgYml0IHIvbwlVbmljYXN0IEZyYW1lcyBYbWl0dGVkIE9LICovCisJWE1fVFhGX0xPTkcJPSAweDAyOTgsIC8qIDMyIGJpdCByL28JVHggTG9uZyBGcmFtZSBDb3VudGVyICovCisJWE1fVFhFX0JVUlNUCT0gMHgwMjljLCAvKiAzMiBiaXQgci9vCVR4IEJ1cnN0IEV2ZW50IENvdW50ZXIgKi8KKwlYTV9UWEZfTVBBVVNFCT0gMHgwMmEwLCAvKiAzMiBiaXQgci9vCVR4IFBhdXNlIE1BQyBDdHJsIEZyYW1lIENudCAqLworCVhNX1RYRl9NQ1RSTAk9IDB4MDJhNCwgLyogMzIgYml0IHIvbwlUeCBNQUMgQ3RybCBGcmFtZSBDb3VudGVyICovCisJWE1fVFhGX1NOR19DT0wJPSAweDAyYTgsIC8qIDMyIGJpdCByL28JVHggU2luZ2xlIENvbGxpc2lvbiBDb3VudGVyICovCisJWE1fVFhGX01VTF9DT0wJPSAweDAyYWMsIC8qIDMyIGJpdCByL28JVHggTXVsdGlwbGUgQ29sbGlzaW9uIENvdW50ZXIgKi8KKwlYTV9UWEZfQUJPX0NPTAk9IDB4MDJiMCwgLyogMzIgYml0IHIvbwlUeCBhYm9ydGVkIGR1ZSB0byBFeGNlcy4gQ29sLiAqLworCVhNX1RYRl9MQVRfQ09MCT0gMHgwMmI0LCAvKiAzMiBiaXQgci9vCVR4IExhdGUgQ29sbGlzaW9uIENvdW50ZXIgKi8KKwlYTV9UWEZfREVGCT0gMHgwMmI4LCAvKiAzMiBiaXQgci9vCVR4IERlZmVycmVkIEZyYW1lIENvdW50ZXIgKi8KKwlYTV9UWEZfRVhfREVGCT0gMHgwMmJjLCAvKiAzMiBiaXQgci9vCVR4IEV4Y2Vzc2l2ZSBEZWZlcmFsbCBDb3VudGVyICovCisJWE1fVFhFX0ZJRk9fVVIJPSAweDAyYzAsIC8qIDMyIGJpdCByL28JVHggRklGTyBVbmRlcnJ1biBFdmVudCBDbnQgKi8KKwlYTV9UWEVfQ1NfRVJSCT0gMHgwMmM0LCAvKiAzMiBiaXQgci9vCVR4IENhcnJpZXIgU2Vuc2UgRXJyb3IgQ250ICovCisJWE1fVFhQX1VUSUwJPSAweDAyYzgsIC8qIDMyIGJpdCByL28JVHggVXRpbGl6YXRpb24gaW4gJSAqLworCVhNX1RYRl82NEIJPSAweDAyZDAsIC8qIDMyIGJpdCByL28JNjQgQnl0ZSBUeCBGcmFtZSBDb3VudGVyICovCisJWE1fVFhGXzEyN0IJPSAweDAyZDQsIC8qIDMyIGJpdCByL28JNjUtMTI3IEJ5dGUgVHggRnJhbWUgQ291bnRlciAqLworCVhNX1RYRl8yNTVCCT0gMHgwMmQ4LCAvKiAzMiBiaXQgci9vCTEyOC0yNTUgQnl0ZSBUeCBGcmFtZSBDb3VudGVyICovCisJWE1fVFhGXzUxMUIJPSAweDAyZGMsIC8qIDMyIGJpdCByL28JMjU2LTUxMSBCeXRlIFR4IEZyYW1lIENvdW50ZXIgKi8KKwlYTV9UWEZfMTAyM0IJPSAweDAyZTAsIC8qIDMyIGJpdCByL28JNTEyLTEwMjMgQnl0ZSBUeCBGcmFtZSBDb3VudGVyKi8KKwlYTV9UWEZfTUFYX1NaCT0gMHgwMmU0LCAvKiAzMiBiaXQgci9vCTEwMjQtTWF4U2l6ZSBCeXRlIFR4IEZyYW1lIENudCovCisJWE1fUlhGX09LCT0gMHgwMzAwLCAvKiAzMiBiaXQgci9vCUZyYW1lcyBSZWNlaXZlZCBPSyAqLworCVhNX1JYT19PS19ISQk9IDB4MDMwNCwgLyogMzIgYml0IHIvbwlPY3RldHMgUmVjZWl2ZWQgT0sgSGlnaCBDbnQgKi8KKwlYTV9SWE9fT0tfTE8JPSAweDAzMDgsIC8qIDMyIGJpdCByL28JT2N0ZXRzIFJlY2VpdmVkIE9LIExvdyBDb3VudGVyKi8KKwlYTV9SWEZfQkNfT0sJPSAweDAzMGMsIC8qIDMyIGJpdCByL28JQnJvYWRjYXN0IEZyYW1lcyBSZWNlaXZlZCBPSyAqLworCVhNX1JYRl9NQ19PSwk9IDB4MDMxMCwgLyogMzIgYml0IHIvbwlNdWx0aWNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisJWE1fUlhGX1VDX09LCT0gMHgwMzE0LCAvKiAzMiBiaXQgci9vCVVuaWNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisJWE1fUlhGX01QQVVTRQk9IDB4MDMxOCwgLyogMzIgYml0IHIvbwlSeCBQYXVzZSBNQUMgQ3RybCBGcmFtZSBDbnQgKi8KKwlYTV9SWEZfTUNUUkwJPSAweDAzMWMsIC8qIDMyIGJpdCByL28JUnggTUFDIEN0cmwgRnJhbWUgQ291bnRlciAqLworCVhNX1JYRl9JTlZfTVAJPSAweDAzMjAsIC8qIDMyIGJpdCByL28JUnggaW52YWxpZCBQYXVzZSBGcmFtZSBDbnQgKi8KKwlYTV9SWEZfSU5WX01PQwk9IDB4MDMyNCwgLyogMzIgYml0IHIvbwlSeCBGcmFtZXMgd2l0aCBpbnYuIE1BQyBPcGNvZGUqLworCVhNX1JYRV9CVVJTVAk9IDB4MDMyOCwgLyogMzIgYml0IHIvbwlSeCBCdXJzdCBFdmVudCBDb3VudGVyICovCisJWE1fUlhFX0ZNSVNTCT0gMHgwMzJjLCAvKiAzMiBiaXQgci9vCVJ4IE1pc3NlZCBGcmFtZXMgRXZlbnQgQ250ICovCisJWE1fUlhGX0ZSQV9FUlIJPSAweDAzMzAsIC8qIDMyIGJpdCByL28JUnggRnJhbWluZyBFcnJvciBDb3VudGVyICovCisJWE1fUlhFX0ZJRk9fT1YJPSAweDAzMzQsIC8qIDMyIGJpdCByL28JUnggRklGTyBvdmVyZmxvdyBFdmVudCBDbnQgKi8KKwlYTV9SWEZfSkFCX1BLVAk9IDB4MDMzOCwgLyogMzIgYml0IHIvbwlSeCBKYWJiZXIgUGFja2V0IEZyYW1lIENudCAqLworCVhNX1JYRV9DQVJfRVJSCT0gMHgwMzNjLCAvKiAzMiBiaXQgci9vCVJ4IENhcnJpZXIgRXZlbnQgRXJyb3IgQ250ICovCisJWE1fUlhGX0xFTl9FUlIJPSAweDAzNDAsIC8qIDMyIGJpdCByL28JUnggaW4gUmFuZ2UgTGVuZ3RoIEVycm9yICovCisJWE1fUlhFX1NZTV9FUlIJPSAweDAzNDQsIC8qIDMyIGJpdCByL28JUnggU3ltYm9sIEVycm9yIENvdW50ZXIgKi8KKwlYTV9SWEVfU0hUX0VSUgk9IDB4MDM0OCwgLyogMzIgYml0IHIvbwlSeCBTaG9ydCBFdmVudCBFcnJvciBDbnQgKi8KKwlYTV9SWEVfUlVOVAk9IDB4MDM0YywgLyogMzIgYml0IHIvbwlSeCBSdW50IEV2ZW50IENvdW50ZXIgKi8KKwlYTV9SWEZfTE5HX0VSUgk9IDB4MDM1MCwgLyogMzIgYml0IHIvbwlSeCBGcmFtZSB0b28gTG9uZyBFcnJvciBDbnQgKi8KKwlYTV9SWEZfRkNTX0VSUgk9IDB4MDM1NCwgLyogMzIgYml0IHIvbwlSeCBGcmFtZSBDaGVjayBTZXEuIEVycm9yIENudCAqLworCVhNX1JYRl9DRVhfRVJSCT0gMHgwMzVjLCAvKiAzMiBiaXQgci9vCVJ4IENhcnJpZXIgRXh0IEVycm9yIEZyYW1lIENudCovCisJWE1fUlhQX1VUSUwJPSAweDAzNjAsIC8qIDMyIGJpdCByL28JUnggVXRpbGl6YXRpb24gaW4gJSAqLworCVhNX1JYRl82NEIJPSAweDAzNjgsIC8qIDMyIGJpdCByL28JNjQgQnl0ZSBSeCBGcmFtZSBDb3VudGVyICovCisJWE1fUlhGXzEyN0IJPSAweDAzNmMsIC8qIDMyIGJpdCByL28JNjUtMTI3IEJ5dGUgUnggRnJhbWUgQ291bnRlciAqLworCVhNX1JYRl8yNTVCCT0gMHgwMzcwLCAvKiAzMiBiaXQgci9vCTEyOC0yNTUgQnl0ZSBSeCBGcmFtZSBDb3VudGVyICovCisJWE1fUlhGXzUxMUIJPSAweDAzNzQsIC8qIDMyIGJpdCByL28JMjU2LTUxMSBCeXRlIFJ4IEZyYW1lIENvdW50ZXIgKi8KKwlYTV9SWEZfMTAyM0IJPSAweDAzNzgsIC8qIDMyIGJpdCByL28JNTEyLTEwMjMgQnl0ZSBSeCBGcmFtZSBDb3VudGVyKi8KKwlYTV9SWEZfTUFYX1NaCT0gMHgwMzdjLCAvKiAzMiBiaXQgci9vCTEwMjQtTWF4U2l6ZSBCeXRlIFJ4IEZyYW1lIENudCovCit9OworCisvKglYTV9NTVVfQ01ECTE2IGJpdCByL3cJTU1VIENvbW1hbmQgUmVnaXN0ZXIgKi8KK2VudW0geworCVhNX01NVV9QSFlfUkRZCT0gMTw8MTIsIC8qIEJpdCAxMjoJUEhZIFJlYWQgUmVhZHkgKi8KKwlYTV9NTVVfUEhZX0JVU1kJPSAxPDwxMSwgLyogQml0IDExOglQSFkgQnVzeSAqLworCVhNX01NVV9JR05fUEYJPSAxPDwxMCwgLyogQml0IDEwOglJZ25vcmUgUGF1c2UgRnJhbWUgKi8KKwlYTV9NTVVfTUFDX0xCCT0gMTw8OSwJIC8qIEJpdCAgOToJRW5hYmxlIE1BQyBMb29wYmFjayAqLworCVhNX01NVV9GUkNfQ09MCT0gMTw8NywJIC8qIEJpdCAgNzoJRm9yY2UgQ29sbGlzaW9uICovCisJWE1fTU1VX1NJTV9DT0wJPSAxPDw2LAkgLyogQml0ICA2OglTaW11bGF0ZSBDb2xsaXNpb24gKi8KKwlYTV9NTVVfTk9fUFJFCT0gMTw8NSwJIC8qIEJpdCAgNToJTm8gTURJTyBQcmVhbWJsZSAqLworCVhNX01NVV9HTUlJX0ZECT0gMTw8NCwJIC8qIEJpdCAgNDoJR01JSSB1c2VzIEZ1bGwgRHVwbGV4ICovCisJWE1fTU1VX1JBVF9DVFJMCT0gMTw8MywJIC8qIEJpdCAgMzoJRW5hYmxlIFJhdGUgQ29udHJvbCAqLworCVhNX01NVV9HTUlJX0xPT1A9IDE8PDIsCSAvKiBCaXQgIDI6CVBIWSBpcyBpbiBMb29wYmFjayBNb2RlICovCisJWE1fTU1VX0VOQV9SWAk9IDE8PDEsCSAvKiBCaXQgIDE6CUVuYWJsZSBSZWNlaXZlciAqLworCVhNX01NVV9FTkFfVFgJPSAxPDwwLAkgLyogQml0ICAwOglFbmFibGUgVHJhbnNtaXR0ZXIgKi8KK307CisKKworLyoJWE1fVFhfQ01ECTE2IGJpdCByL3cJVHJhbnNtaXQgQ29tbWFuZCBSZWdpc3RlciAqLworZW51bSB7CisJWE1fVFhfQksyQksJPSAxPDw2LAkvKiBCaXQgIDY6CUlnbm9yIENhcnJpZXIgU2Vuc2UgKFR4IEJrMkJrKSovCisJWE1fVFhfRU5DX0JZUAk9IDE8PDUsCS8qIEJpdCAgNToJU2V0IEVuY29kZXIgaW4gQnlwYXNzIE1vZGUgKi8KKwlYTV9UWF9TQU1fTElORQk9IDE8PDQsCS8qIEJpdCAgNDogKHNjKQlTdGFydCB1dGlsaXphdGlvbiBjYWxjdWxhdGlvbiAqLworCVhNX1RYX05PX0dJR19NRAk9IDE8PDMsCS8qIEJpdCAgMzoJRGlzYWJsZSBDYXJyaWVyIEV4dGVuc2lvbiAqLworCVhNX1RYX05PX1BSRQk9IDE8PDIsCS8qIEJpdCAgMjoJRGlzYWJsZSBQcmVhbWJsZSBHZW5lcmF0aW9uICovCisJWE1fVFhfTk9fQ1JDCT0gMTw8MSwJLyogQml0ICAxOglEaXNhYmxlIENSQyBHZW5lcmF0aW9uICovCisJWE1fVFhfQVVUT19QQUQJPSAxPDwwLAkvKiBCaXQgIDA6CUVuYWJsZSBBdXRvbWF0aWMgUGFkZGluZyAqLworfTsKKworLyoJWE1fVFhfUlRfTElNCTE2IGJpdCByL3cJVHJhbnNtaXQgUmV0cnkgTGltaXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fUlRfTElNX01TSwkweDFmCS8qIEJpdCAgNC4uMDoJVHggUmV0cnkgTGltaXQgKi8KKworCisvKglYTV9UWF9TVElNRQkxNiBiaXQgci93CVRyYW5zbWl0IFNsb3R0aW1lIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1NUSU1FX01TSwkweDdmCS8qIEJpdCAgNi4uMDoJVHggU2xvdHRpbWUgYml0cyAqLworCisKKy8qCVhNX1RYX0lQRwkxNiBiaXQgci93CVRyYW5zbWl0IEludGVyIFBhY2tldCBHYXAgKi8KKyNkZWZpbmUgWE1fSVBHX01TSwkJMHhmZgkvKiBCaXQgIDcuLjA6CUlQRyB2YWx1ZSBiaXRzICovCisKKworLyoJWE1fUlhfQ01ECTE2IGJpdCByL3cJUmVjZWl2ZSBDb21tYW5kIFJlZ2lzdGVyICovCitlbnVtIHsKKwlYTV9SWF9MRU5FUlJfT0sJPSAxPDw4LAkvKiBCaXQgIDgJZG9uJ3Qgc2V0IFJ4IEVyciBiaXQgZm9yICovCisJCQkJLyoJCWlucmFuZ2UgZXJyb3IgcGFja2V0cyAqLworCVhNX1JYX0JJR19QS19PSwk9IDE8PDcsCS8qIEJpdCAgNwlkb24ndCBzZXQgUnggRXJyIGJpdCBmb3IgKi8KKwkJCQkvKgkJanVtYm8gcGFja2V0cyAqLworCVhNX1JYX0lQR19DQVAJPSAxPDw2LAkvKiBCaXQgIDYJcmVwbC4gdHlwZSBmaWVsZCB3aXRoIElQRyAqLworCVhNX1JYX1RQX01ECT0gMTw8NSwJLyogQml0ICA1OglFbmFibGUgdHJhbnNwYXJlbnQgTW9kZSAqLworCVhNX1JYX1NUUklQX0ZDUwk9IDE8PDQsCS8qIEJpdCAgNDoJRW5hYmxlIEZDUyBTdHJpcHBpbmcgKi8KKwlYTV9SWF9TRUxGX1JYCT0gMTw8MywJLyogQml0ICAzOiAJRW5hYmxlIFJ4IG9mIG93biBwYWNrZXRzICovCisJWE1fUlhfU0FNX0xJTkUJPSAxPDwyLAkvKiBCaXQgIDI6IChzYykJU3RhcnQgdXRpbGl6YXRpb24gY2FsY3VsYXRpb24gKi8KKwlYTV9SWF9TVFJJUF9QQUQJPSAxPDwxLAkvKiBCaXQgIDE6CVN0cmlwIHBhZCBieXRlcyBvZiBSeCBmcmFtZXMgKi8KKwlYTV9SWF9ESVNfQ0VYVAk9IDE8PDAsCS8qIEJpdCAgMDoJRGlzYWJsZSBjYXJyaWVyIGV4dC4gY2hlY2sgKi8KK307CisKKworLyoJWE1fR1BfUE9SVAkzMiBiaXQgci93CUdlbmVyYWwgUHVycG9zZSBQb3J0IFJlZ2lzdGVyICovCitlbnVtIHsKKwlYTV9HUF9BTklQCT0gMTw8NiwJLyogQml0ICA2OiAocm8pCUF1dG8tTmVnLiBpbiBwcm9ncmVzcyAqLworCVhNX0dQX0ZSQ19JTlQJPSAxPDw1LAkvKiBCaXQgIDU6IChzYykJRm9yY2UgSW50ZXJydXB0ICovCisJWE1fR1BfUkVTX01BQwk9IDE8PDMsCS8qIEJpdCAgMzogKHNjKQlSZXNldCBNQUMgYW5kIEZJRk9zICovCisJWE1fR1BfUkVTX1NUQVQJPSAxPDwyLAkvKiBCaXQgIDI6IChzYykJUmVzZXQgdGhlIHN0YXRpc3RpY3MgbW9kdWxlICovCisJWE1fR1BfSU5QX0FTUwk9IDE8PDAsCS8qIEJpdCAgMDogKHJvKSBHUCBJbnB1dCBQaW4gYXNzZXJ0ZWQgKi8KK307CisKKworLyoJWE1fSU1TSwkJMTYgYml0IHIvdwlJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworLyoJWE1fSVNSQwkJMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCitlbnVtIHsKKwlYTV9JU19MTktfQUUJPSAxPDwxNCwgLyogQml0IDE0OglMaW5rIEFzeW5jaHJvbm91cyBFdmVudCAqLworCVhNX0lTX1RYX0FCT1JUCT0gMTw8MTMsIC8qIEJpdCAxMzoJVHJhbnNtaXQgQWJvcnQsIGxhdGUgQ29sLiBldGMgKi8KKwlYTV9JU19GUkNfSU5UCT0gMTw8MTIsIC8qIEJpdCAxMjoJRm9yY2UgSU5UIGJpdCBzZXQgaW4gR1AgKi8KKwlYTV9JU19JTlBfQVNTCT0gMTw8MTEsIC8qIEJpdCAxMToJSW5wdXQgQXNzZXJ0ZWQsIEdQIGJpdCAwIHNldCAqLworCVhNX0lTX0xJUEFfUkMJPSAxPDwxMCwgLyogQml0IDEwOglMaW5rIFBhcnRuZXIgcmVxdWVzdHMgY29uZmlnICovCisJWE1fSVNfUlhfUEFHRQk9IDE8PDksCS8qIEJpdCAgOToJUGFnZSBSZWNlaXZlZCAqLworCVhNX0lTX1RYX1BBR0UJPSAxPDw4LAkvKiBCaXQgIDg6CU5leHQgUGFnZSBMb2FkZWQgZm9yIFRyYW5zbWl0ICovCisJWE1fSVNfQU5ECT0gMTw8NywJLyogQml0ICA3OglBdXRvLU5lZ290aWF0aW9uIERvbmUgKi8KKwlYTV9JU19UU0NfT1YJPSAxPDw2LAkvKiBCaXQgIDY6CVRpbWUgU3RhbXAgQ291bnRlciBPdmVyZmxvdyAqLworCVhNX0lTX1JYQ19PVgk9IDE8PDUsCS8qIEJpdCAgNToJUnggQ291bnRlciBFdmVudCBPdmVyZmxvdyAqLworCVhNX0lTX1RYQ19PVgk9IDE8PDQsCS8qIEJpdCAgNDoJVHggQ291bnRlciBFdmVudCBPdmVyZmxvdyAqLworCVhNX0lTX1JYRl9PVgk9IDE8PDMsCS8qIEJpdCAgMzoJUmVjZWl2ZSBGSUZPIE92ZXJmbG93ICovCisJWE1fSVNfVFhGX1VSCT0gMTw8MiwJLyogQml0ICAyOglUcmFuc21pdCBGSUZPIFVuZGVycnVuICovCisJWE1fSVNfVFhfQ09NUAk9IDE8PDEsCS8qIEJpdCAgMToJRnJhbWUgVHggQ29tcGxldGUgKi8KKwlYTV9JU19SWF9DT01QCT0gMTw8MCwJLyogQml0ICAwOglGcmFtZSBSeCBDb21wbGV0ZSAqLworCisJWE1fSU1TS19ESVNBQkxFCT0gMHhmZmZmLAorfTsKKworLyoJWE1fSFdfQ0ZHCTE2IGJpdCByL3cJSGFyZHdhcmUgQ29uZmlnIFJlZ2lzdGVyICovCitlbnVtIHsKKwlYTV9IV19HRU5fRU9QCT0gMTw8MywJLyogQml0ICAzOglnZW5lcmF0ZSBFbmQgb2YgUGFja2V0IHB1bHNlICovCisJWE1fSFdfQ09NNFNJRwk9IDE8PDIsCS8qIEJpdCAgMjoJdXNlIENvbW1hIERldGVjdCBmb3IgU2lnLiBEZXQuKi8KKwlYTV9IV19HTUlJX01ECT0gMTw8MCwJLyogQml0ICAwOglHTUlJIEludGVyZmFjZSBzZWxlY3RlZCAqLworfTsKKworCisvKglYTV9UWF9MT19XTQkxNiBiaXQgci93CVR4IEZJRk8gTG93IFdhdGVyIE1hcmsgKi8KKy8qCVhNX1RYX0hJX1dNCTE2IGJpdCByL3cJVHggRklGTyBIaWdoIFdhdGVyIE1hcmsgKi8KKyNkZWZpbmUgWE1fVFhfV01fTVNLCTB4MDFmZgkvKiBCaXQgIDkuLiAwCVR4IEZJRk8gV2F0ZXJtYXJrIGJpdHMgKi8KKworLyoJWE1fVFhfVEhSCTE2IGJpdCByL3cJVHggUmVxdWVzdCBUaHJlc2hvbGQgKi8KKy8qCVhNX0hUX1RIUgkxNiBiaXQgci93CUhvc3QgUmVxdWVzdCBUaHJlc2hvbGQgKi8KKy8qCVhNX1JYX1RIUgkxNiBiaXQgci93CVJ4IFJlcXVlc3QgVGhyZXNob2xkICovCisjZGVmaW5lIFhNX1RIUl9NU0sJCTB4MDNmZgkvKiBCaXQgMTAuLiAwCVJ4L1R4IFJlcXVlc3QgVGhyZXNob2xkIGJpdHMgKi8KKworCisvKglYTV9UWF9TVEFUCTMyIGJpdCByL28JVHggU3RhdHVzIExJRk8gUmVnaXN0ZXIgKi8KK2VudW0geworCVhNX1NUX1ZBTElECT0gKDFVTDw8MzEpLAkvKiBCaXQgMzE6CVN0YXR1cyBWYWxpZCAqLworCVhNX1NUX0JZVEVfQ05UCT0gKDB4M2ZmZkw8PDE3KSwJLyogQml0IDMwLi4xNzoJVHggZnJhbWUgTGVuZ3RoICovCisJWE1fU1RfUkVUUllfQ05UCT0gKDB4MWZMPDwxMiksCS8qIEJpdCAxNi4uMTI6CVJldHJ5IENvdW50ICovCisJWE1fU1RfRVhfQ09MCT0gMTw8MTEsCS8qIEJpdCAxMToJRXhjZXNzaXZlIENvbGxpc2lvbnMgKi8KKwlYTV9TVF9FWF9ERUYJPSAxPDwxMCwJLyogQml0IDEwOglFeGNlc3NpdmUgRGVmZXJyYWwgKi8KKwlYTV9TVF9CVVJTVAk9IDE8PDksCQkvKiBCaXQgIDk6CXAuIHhtaXR0ZWQgaW4gYnVyc3QgbWQqLworCVhNX1NUX0RFRkVSCT0gMTw8OCwJCS8qIEJpdCAgODoJcGFja2V0IHdhcyBkZWZlcmVkICovCisJWE1fU1RfQkMJPSAxPDw3LAkJLyogQml0ICA3OglCcm9hZGNhc3QgcGFja2V0ICovCisJWE1fU1RfTUMJPSAxPDw2LAkJLyogQml0ICA2OglNdWx0aWNhc3QgcGFja2V0ICovCisJWE1fU1RfVUMJPSAxPDw1LAkJLyogQml0ICA1OglVbmljYXN0IHBhY2tldCAqLworCVhNX1NUX1RYX1VSCT0gMTw8NCwJCS8qIEJpdCAgNDoJRklGTyBVbmRlcnJ1biBvY2N1cmVkICovCisJWE1fU1RfQ1NfRVJSCT0gMTw8MywJCS8qIEJpdCAgMzoJQ2FycmllciBTZW5zZSBFcnJvciAqLworCVhNX1NUX0xBVF9DT0wJPSAxPDwyLAkJLyogQml0ICAyOglMYXRlIENvbGxpc2lvbiBFcnJvciAqLworCVhNX1NUX01VTF9DT0wJPSAxPDwxLAkJLyogQml0ICAxOglNdWx0aXBsZSBDb2xsaXNpb25zICovCisJWE1fU1RfU0dOX0NPTAk9IDE8PDAsCQkvKiBCaXQgIDA6CVNpbmdsZSBDb2xsaXNpb24gKi8KK307CisKKy8qCVhNX1JYX0xPX1dNCTE2IGJpdCByL3cJUmVjZWl2ZSBMb3cgV2F0ZXIgTWFyayAqLworLyoJWE1fUlhfSElfV00JMTYgYml0IHIvdwlSZWNlaXZlIEhpZ2ggV2F0ZXIgTWFyayAqLworI2RlZmluZSBYTV9SWF9XTV9NU0sJMHgwM2ZmCQkvKiBCaXQgMTEuLiAwOglSeCBGSUZPIFdhdGVybWFyayBiaXRzICovCisKKworLyoJWE1fREVWX0lECTMyIGJpdCByL28JRGV2aWNlIElEIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0RFVl9PVUkJKDB4MDBmZmZmZmZVTDw8OCkJLyogQml0IDMxLi44OglEZXZpY2UgT1VJICovCisjZGVmaW5lIFhNX0RFVl9SRVYJKDB4MDdMIDw8IDUpCQkvKiBCaXQgIDcuLjU6CUNoaXAgUmV2IE51bSAqLworCisKKy8qCVhNX01PREUJCTMyIGJpdCByL3cJTW9kZSBSZWdpc3RlciAqLworZW51bSB7CisJWE1fTURfRU5BX1JFSgk9IDE8PDI2LCAvKiBCaXQgMjY6CUVuYWJsZSBGcmFtZSBSZWplY3QgKi8KKwlYTV9NRF9TUE9FX0UJPSAxPDwyNSwgLyogQml0IDI1OglTZW5kIFBhdXNlIG9uIEVkZ2UgKi8KKwkJCQkJCQkJCS8qIAkJZXh0ZXJuIGdlbmVyYXRlZCAqLworCVhNX01EX1RYX1JFUAk9IDE8PDI0LCAvKiBCaXQgMjQ6CVRyYW5zbWl0IFJlcGVhdGVyIE1vZGUgKi8KKwlYTV9NRF9TUE9GRl9JCT0gMTw8MjMsIC8qIEJpdCAyMzoJU2VuZCBQYXVzZSBvbiBGSUZPIGZ1bGwgKi8KKwkJCQkJCQkJCS8qCQlpbnRlcm4gZ2VuZXJhdGVkICovCisJWE1fTURfTEVfU1RXCT0gMTw8MjIsIC8qIEJpdCAyMjoJUnggU3RhdCBXb3JkIGluIExpdHRsZSBFbmRpYW4gKi8KKwlYTV9NRF9UWF9DT05UCT0gMTw8MjEsIC8qIEJpdCAyMToJU2VuZCBDb250aW51b3VzICovCisJWE1fTURfVFhfUEFVU0UJPSAxPDwyMCwgLyogQml0IDIwOiAoc2MpCVNlbmQgUGF1c2UgRnJhbWUgKi8KKwlYTV9NRF9BVFMJPSAxPDwxOSwgLyogQml0IDE5OglBcHBlbmQgVGltZSBTdGFtcCAqLworCVhNX01EX1NQT0xfSQk9IDE8PDE4LCAvKiBCaXQgMTg6CVNlbmQgUGF1c2Ugb24gTG93ICovCisJCQkJCQkJCQkvKgkJaW50ZXJuIGdlbmVyYXRlZCAqLworCVhNX01EX1NQT0hfSQk9IDE8PDE3LCAvKiBCaXQgMTc6CVNlbmQgUGF1c2Ugb24gSGlnaCAqLworCQkJCQkJCQkJLyoJCWludGVybiBnZW5lcmF0ZWQgKi8KKwlYTV9NRF9DQVAJPSAxPDwxNiwgLyogQml0IDE2OglDaGVjayBBZGRyZXNzIFBhaXIgKi8KKwlYTV9NRF9FTkFfSEFTSAk9IDE8PDE1LCAvKiBCaXQgMTU6CUVuYWJsZSBIYXNoaW5nICovCisJWE1fTURfQ1NBCT0gMTw8MTQsIC8qIEJpdCAxNDoJQ2hlY2sgU3RhdGlvbiBBZGRyZXNzICovCisJWE1fTURfQ0FBCT0gMTw8MTMsIC8qIEJpdCAxMzoJQ2hlY2sgQWRkcmVzcyBBcnJheSAqLworCVhNX01EX1JYX01DVFJMCT0gMTw8MTIsIC8qIEJpdCAxMjoJUnggTUFDIENvbnRyb2wgRnJhbWUgKi8KKwlYTV9NRF9SWF9SVU5UCT0gMTw8MTEsIC8qIEJpdCAxMToJUnggUnVudCBGcmFtZXMgKi8KKwlYTV9NRF9SWF9JUkxFCT0gMTw8MTAsIC8qIEJpdCAxMDoJUnggaW4gUmFuZ2UgTGVuIEVyciBGcmFtZSAqLworCVhNX01EX1JYX0xPTkcJPSAxPDw5LCAgLyogQml0ICA5OglSeCBMb25nIEZyYW1lICovCisJWE1fTURfUlhfQ1JDRQk9IDE8PDgsICAvKiBCaXQgIDg6CVJ4IENSQyBFcnJvciBGcmFtZSAqLworCVhNX01EX1JYX0VSUgk9IDE8PDcsICAvKiBCaXQgIDc6CVJ4IEVycm9yIEZyYW1lICovCisJWE1fTURfRElTX1VDCT0gMTw8NiwgIC8qIEJpdCAgNjoJRGlzYWJsZSBSeCBVbmljYXN0ICovCisJWE1fTURfRElTX01DCT0gMTw8NSwgIC8qIEJpdCAgNToJRGlzYWJsZSBSeCBNdWx0aWNhc3QgKi8KKwlYTV9NRF9ESVNfQkMJPSAxPDw0LCAgLyogQml0ICA0OglEaXNhYmxlIFJ4IEJyb2FkY2FzdCAqLworCVhNX01EX0VOQV9QUk9NCT0gMTw8MywgIC8qIEJpdCAgMzoJRW5hYmxlIFByb21pc2N1b3VzICovCisJWE1fTURfRU5BX0JFCT0gMTw8MiwgIC8qIEJpdCAgMjoJRW5hYmxlIEJpZyBFbmRpYW4gKi8KKwlYTV9NRF9GVEYJPSAxPDwxLCAgLyogQml0ICAxOiAoc2MpCUZsdXNoIFR4IEZJRk8gKi8KKwlYTV9NRF9GUkYJPSAxPDwwLCAgLyogQml0ICAwOiAoc2MpCUZsdXNoIFJ4IEZJRk8gKi8KK307CisKKyNkZWZpbmUgWE1fUEFVU0VfTU9ERQkoWE1fTURfU1BPRV9FIHwgWE1fTURfU1BPTF9JIHwgWE1fTURfU1BPSF9JKQorI2RlZmluZSBYTV9ERUZfTU9ERQkoWE1fTURfUlhfUlVOVCB8IFhNX01EX1JYX0lSTEUgfCBYTV9NRF9SWF9MT05HIHxcCisJCQkgWE1fTURfUlhfQ1JDRSB8IFhNX01EX1JYX0VSUiB8IFhNX01EX0NTQSkKKworLyoJWE1fU1RBVF9DTUQJMTYgYml0IHIvdwlTdGF0aXN0aWNzIENvbW1hbmQgUmVnaXN0ZXIgKi8KK2VudW0geworCVhNX1NDX1NOUF9SWEMJPSAxPDw1LAkvKiBCaXQgIDU6IChzYykJU25hcCBSeCBDb3VudGVycyAqLworCVhNX1NDX1NOUF9UWEMJPSAxPDw0LAkvKiBCaXQgIDQ6IChzYykJU25hcCBUeCBDb3VudGVycyAqLworCVhNX1NDX0NQX1JYQwk9IDE8PDMsCS8qIEJpdCAgMzogCUNvcHkgUnggQ291bnRlcnMgQ29udGludW91c2x5ICovCisJWE1fU0NfQ1BfVFhDCT0gMTw8MiwJLyogQml0ICAyOglDb3B5IFR4IENvdW50ZXJzIENvbnRpbnVvdXNseSAqLworCVhNX1NDX0NMUl9SWEMJPSAxPDwxLAkvKiBCaXQgIDE6IChzYykJQ2xlYXIgUnggQ291bnRlcnMgKi8KKwlYTV9TQ19DTFJfVFhDCT0gMTw8MCwJLyogQml0ICAwOiAoc2MpIENsZWFyIFR4IENvdW50ZXJzICovCit9OworCisKKy8qCVhNX1JYX0NOVF9FVgkzMiBiaXQgci9vCVJ4IENvdW50ZXIgRXZlbnQgUmVnaXN0ZXIgKi8KKy8qCVhNX1JYX0VWX01TSwkzMiBiaXQgci93CVJ4IENvdW50ZXIgRXZlbnQgTWFzayAqLworZW51bSB7CisJWE1SX01BWF9TWl9PVgk9IDE8PDMxLCAvKiBCaXQgMzE6CTEwMjQtTWF4U2l6ZSBSeCBDbnQgT3YqLworCVhNUl8xMDIzQl9PVgk9IDE8PDMwLCAvKiBCaXQgMzA6CTUxMi0xMDIzQnl0ZSBSeCBDbnQgT3YqLworCVhNUl81MTFCX09WCT0gMTw8MjksIC8qIEJpdCAyOToJMjU2LTUxMSBCeXRlIFJ4IENudCBPdiovCisJWE1SXzI1NUJfT1YJPSAxPDwyOCwgLyogQml0IDI4OgkxMjgtMjU1IEJ5dGUgUnggQ250IE92Ki8KKwlYTVJfMTI3Ql9PVgk9IDE8PDI3LCAvKiBCaXQgMjc6CTY1LTEyNyBCeXRlIFJ4IENudCBPdiAqLworCVhNUl82NEJfT1YJPSAxPDwyNiwgLyogQml0IDI2Ogk2NCBCeXRlIFJ4IENudCBPdiAqLworCVhNUl9VVElMX09WCT0gMTw8MjUsIC8qIEJpdCAyNToJUnggVXRpbCBDbnQgT3ZlcmZsb3cgKi8KKwlYTVJfVVRJTF9VUgk9IDE8PDI0LCAvKiBCaXQgMjQ6CVJ4IFV0aWwgQ250IFVuZGVycnVuICovCisJWE1SX0NFWF9FUlJfT1YJPSAxPDwyMywgLyogQml0IDIzOglDRVhUIEVyciBDbnQgT3YgKi8KKwlYTVJfRkNTX0VSUl9PVgk9IDE8PDIxLCAvKiBCaXQgMjE6CVJ4IEZDUyBFcnJvciBDbnQgT3YgKi8KKwlYTVJfTE5HX0VSUl9PVgk9IDE8PDIwLCAvKiBCaXQgMjA6CVJ4IHRvbyBMb25nIEVyciBDbnQgT3YqLworCVhNUl9SVU5UX09WCT0gMTw8MTksIC8qIEJpdCAxOToJUnVudCBFdmVudCBDbnQgT3YgKi8KKwlYTVJfU0hUX0VSUl9PVgk9IDE8PDE4LCAvKiBCaXQgMTg6CVJ4IFNob3J0IEV2IEVyciBDbnQgT3YqLworCVhNUl9TWU1fRVJSX09WCT0gMTw8MTcsIC8qIEJpdCAxNzoJUnggU3ltIEVyciBDbnQgT3YgKi8KKwlYTVJfQ0FSX0VSUl9PVgk9IDE8PDE1LCAvKiBCaXQgMTU6CVJ4IENhcnIgRXYgRXJyIENudCBPdiAqLworCVhNUl9KQUJfUEtUX09WCT0gMTw8MTQsIC8qIEJpdCAxNDoJUnggSmFiYiBQYWNrZXQgQ250IE92ICovCisJWE1SX0ZJRk9fT1YJPSAxPDwxMywgLyogQml0IDEzOglSeCBGSUZPIE92IEV2IENudCBPdiAqLworCVhNUl9GUkFfRVJSX09WCT0gMTw8MTIsIC8qIEJpdCAxMjoJUnggRnJhbWluZyBFcnIgQ250IE92ICovCisJWE1SX0ZNSVNTX09WCT0gMTw8MTEsIC8qIEJpdCAxMToJUnggTWlzc2VkIEV2IENudCBPdiAqLworCVhNUl9CVVJTVAk9IDE8PDEwLCAvKiBCaXQgMTA6CVJ4IEJ1cnN0IEV2ZW50IENudCBPdiAqLworCVhNUl9JTlZfTU9DCT0gMTw8OSwgIC8qIEJpdCAgOToJUnggd2l0aCBpbnYuIE1BQyBPQyBPdiovCisJWE1SX0lOVl9NUAk9IDE8PDgsICAvKiBCaXQgIDg6CVJ4IGludiBQYXVzZSBGcmFtZSBPdiAqLworCVhNUl9NQ1RSTF9PVgk9IDE8PDcsICAvKiBCaXQgIDc6CVJ4IE1BQyBDdHJsLUYgQ250IE92ICovCisJWE1SX01QQVVTRV9PVgk9IDE8PDYsICAvKiBCaXQgIDY6CVJ4IFBhdXNlIE1BQyBDdHJsLUYgT3YqLworCVhNUl9VQ19PS19PVgk9IDE8PDUsICAvKiBCaXQgIDU6CVJ4IFVuaWNhc3QgRnJhbWUgQ250T3YqLworCVhNUl9NQ19PS19PVgk9IDE8PDQsICAvKiBCaXQgIDQ6CVJ4IE11bHRpY2FzdCBDbnQgT3YgKi8KKwlYTVJfQkNfT0tfT1YJPSAxPDwzLCAgLyogQml0ICAzOglSeCBCcm9hZGNhc3QgQ250IE92ICovCisJWE1SX09LX0xPX09WCT0gMTw8MiwgIC8qIEJpdCAgMjoJT2N0ZXRzIFJ4IE9LIExvdyBDbnRPdiovCisJWE1SX09LX0hJX09WCT0gMTw8MSwgIC8qIEJpdCAgMToJT2N0ZXRzIFJ4IE9LIEhpIENudCBPdiovCisJWE1SX09LX09WCT0gMTw8MCwgIC8qIEJpdCAgMDoJRnJhbWVzIFJlY2VpdmVkIE9rIE92ICovCit9OworCisjZGVmaW5lIFhNUl9ERUZfTVNLCQkoWE1SX09LX0xPX09WIHwgWE1SX09LX0hJX09WKQorCisvKglYTV9UWF9DTlRfRVYJMzIgYml0IHIvbwlUeCBDb3VudGVyIEV2ZW50IFJlZ2lzdGVyICovCisvKglYTV9UWF9FVl9NU0sJMzIgYml0IHIvdwlUeCBDb3VudGVyIEV2ZW50IE1hc2sgKi8KK2VudW0geworCVhNVF9NQVhfU1pfT1YJPSAxPDwyNSwJLyogQml0IDI1OgkxMDI0LU1heFNpemUgVHggQ250IE92Ki8KKwlYTVRfMTAyM0JfT1YJPSAxPDwyNCwJLyogQml0IDI0Ogk1MTItMTAyM0J5dGUgVHggQ250IE92Ki8KKwlYTVRfNTExQl9PVgk9IDE8PDIzLAkvKiBCaXQgMjM6CTI1Ni01MTEgQnl0ZSBUeCBDbnQgT3YqLworCVhNVF8yNTVCX09WCT0gMTw8MjIsCS8qIEJpdCAyMjoJMTI4LTI1NSBCeXRlIFR4IENudCBPdiovCisJWE1UXzEyN0JfT1YJPSAxPDwyMSwJLyogQml0IDIxOgk2NS0xMjcgQnl0ZSBUeCBDbnQgT3YgKi8KKwlYTVRfNjRCX09WCT0gMTw8MjAsCS8qIEJpdCAyMDoJNjQgQnl0ZSBUeCBDbnQgT3YgKi8KKwlYTVRfVVRJTF9PVgk9IDE8PDE5LAkvKiBCaXQgMTk6CVR4IFV0aWwgQ250IE92ZXJmbG93ICovCisJWE1UX1VUSUxfVVIJPSAxPDwxOCwJLyogQml0IDE4OglUeCBVdGlsIENudCBVbmRlcnJ1biAqLworCVhNVF9DU19FUlJfT1YJPSAxPDwxNywJLyogQml0IDE3OglUeCBDYXJyIFNlbiBFcnIgQ250IE92Ki8KKwlYTVRfRklGT19VUl9PVgk9IDE8PDE2LAkvKiBCaXQgMTY6CVR4IEZJRk8gVXIgRXYgQ250IE92ICovCisJWE1UX0VYX0RFRl9PVgk9IDE8PDE1LAkvKiBCaXQgMTU6CVR4IEV4IERlZmVyYWxsIENudCBPdiAqLworCVhNVF9ERUYJPSAxPDwxNCwJLyogQml0IDE0OglUeCBEZWZlcnJlZCBDbnQgT3YgKi8KKwlYTVRfTEFUX0NPTF9PVgk9IDE8PDEzLAkvKiBCaXQgMTM6CVR4IExhdGUgQ29sIENudCBPdiAqLworCVhNVF9BQk9fQ09MX09WCT0gMTw8MTIsCS8qIEJpdCAxMjoJVHggYWJvIGR1ZXRvIEV4IENvbCBPdiovCisJWE1UX01VTF9DT0xfT1YJPSAxPDwxMSwJLyogQml0IDExOglUeCBNdWx0IENvbCBDbnQgT3YgKi8KKwlYTVRfU05HX0NPTAk9IDE8PDEwLAkvKiBCaXQgMTA6CVR4IFNpbmdsZSBDb2wgQ250IE92ICovCisJWE1UX01DVFJMX09WCT0gMTw8OSwJCS8qIEJpdCAgOToJVHggTUFDIEN0cmwgQ291bnRlciBPdiovCisJWE1UX01QQVVTRQk9IDE8PDgsCQkvKiBCaXQgIDg6CVR4IFBhdXNlIE1BQyBDdHJsLUYgT3YqLworCVhNVF9CVVJTVAk9IDE8PDcsCQkvKiBCaXQgIDc6CVR4IEJ1cnN0IEV2ZW50IENudCBPdiAqLworCVhNVF9MT05HCT0gMTw8NiwJCS8qIEJpdCAgNjoJVHggTG9uZyBGcmFtZSBDbnQgT3YgKi8KKwlYTVRfVUNfT0tfT1YJPSAxPDw1LAkJLyogQml0ICA1OglUeCBVbmljYXN0IENudCBPdiAqLworCVhNVF9NQ19PS19PVgk9IDE8PDQsCQkvKiBCaXQgIDQ6CVR4IE11bHRpY2FzdCBDbnQgT3YgKi8KKwlYTVRfQkNfT0tfT1YJPSAxPDwzLAkJLyogQml0ICAzOglUeCBCcm9hZGNhc3QgQ250IE92ICovCisJWE1UX09LX0xPX09WCT0gMTw8MiwJCS8qIEJpdCAgMjoJT2N0ZXRzIFR4IE9LIExvdyBDbnRPdiovCisJWE1UX09LX0hJX09WCT0gMTw8MSwJCS8qIEJpdCAgMToJT2N0ZXRzIFR4IE9LIEhpIENudCBPdiovCisJWE1UX09LX09WCT0gMTw8MCwJCS8qIEJpdCAgMDoJRnJhbWVzIFR4IE9rIE92ICovCit9OworCisKKyNkZWZpbmUgWE1UX0RFRl9NU0sJCShYTVRfT0tfTE9fT1YgfCBYTVRfT0tfSElfT1YpCisKK3N0cnVjdCBza2dlX3J4X2Rlc2MgeworCXUzMgkJY29udHJvbDsKKwl1MzIJCW5leHRfb2Zmc2V0OworCXUzMgkJZG1hX2xvOworCXUzMgkJZG1hX2hpOworCXUzMgkJc3RhdHVzOworCXUzMgkJdGltZXN0YW1wOworCXUxNgkJY3N1bTI7CisJdTE2CQljc3VtMTsKKwl1MTYJCWNzdW0yX3N0YXJ0OworCXUxNgkJY3N1bTFfc3RhcnQ7Cit9OworCitzdHJ1Y3Qgc2tnZV90eF9kZXNjIHsKKwl1MzIJCWNvbnRyb2w7CisJdTMyCQluZXh0X29mZnNldDsKKwl1MzIJCWRtYV9sbzsKKwl1MzIJCWRtYV9oaTsKKwl1MzIJCXN0YXR1czsKKwl1MzIJCWNzdW1fb2ZmczsKKwl1MTYJCWNzdW1fd3JpdGU7CisJdTE2CQljc3VtX3N0YXJ0OworCXUzMgkJcnN2ZDsKK307CisKK3N0cnVjdCBza2dlX2VsZW1lbnQgeworCXN0cnVjdCBza2dlX2VsZW1lbnQJKm5leHQ7CisJdm9pZAkJCSpkZXNjOworCXN0cnVjdCBpb19idWZmZXIJKmlvYjsKK307CisKK3N0cnVjdCBza2dlX3JpbmcgeworCXN0cnVjdCBza2dlX2VsZW1lbnQgKnRvX2NsZWFuOworCXN0cnVjdCBza2dlX2VsZW1lbnQgKnRvX3VzZTsKKwlzdHJ1Y3Qgc2tnZV9lbGVtZW50ICpzdGFydDsKK307CisKKworc3RydWN0IHNrZ2VfaHcgeworCXUzMgkgICAgIHJlZ3M7CisJc3RydWN0IHBjaV9kZXZpY2UgICAgKnBkZXY7CisJdTMyCQkgICAgIGludHJfbWFzazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAqZGV2WzJdOworCisJdTgJICAgICAJICAgICBjaGlwX2lkOworCXU4CQkgICAgIGNoaXBfcmV2OworCXU4CQkgICAgIGNvcHBlcjsKKwl1OAkJICAgICBwb3J0czsKKwl1OAkJICAgICBwaHlfdHlwZTsKKworCXUzMgkgICAgIAkgICAgIHJhbV9zaXplOworCXUzMgkgICAgIAkgICAgIHJhbV9vZmZzZXQ7CisJdTE2CQkgICAgIHBoeV9hZGRyOworfTsKKworZW51bSBwYXVzZV9jb250cm9sIHsKKwlGTE9XX01PREVfTk9ORSAJCT0gMSwgLyogTm8gRmxvdy1Db250cm9sICovCisJRkxPV19NT0RFX0xPQ19TRU5ECT0gMiwgLyogTG9jYWwgc3RhdGlvbiBzZW5kcyBQQVVTRSAqLworCUZMT1dfTU9ERV9TWU1NRVRSSUMJPSAzLCAvKiBCb3RoIHN0YXRpb25zIG1heSBzZW5kIFBBVVNFICovCisJRkxPV19NT0RFX1NZTV9PUl9SRU0JPSA0LCAvKiBCb3RoIHN0YXRpb25zIG1heSBzZW5kIFBBVVNFIG9yCisJCQkJICAgICAgKiBqdXN0IHRoZSByZW1vdGUgc3RhdGlvbiBtYXkgc2VuZCBQQVVTRQorCQkJCSAgICAgICovCit9OworCitlbnVtIHBhdXNlX3N0YXR1cyB7CisJRkxPV19TVEFUX0lOREVURVJNSU5BVEVEPTAsCS8qIGluZGV0ZXJtaW5hdGVkICovCisJRkxPV19TVEFUX05PTkUsCQkJLyogTm8gRmxvdyBDb250cm9sICovCisJRkxPV19TVEFUX1JFTV9TRU5ELAkJLyogUmVtb3RlIFN0YXRpb24gc2VuZHMgUEFVU0UgKi8KKwlGTE9XX1NUQVRfTE9DX1NFTkQsCQkvKiBMb2NhbCBzdGF0aW9uIHNlbmRzIFBBVVNFICovCisJRkxPV19TVEFUX1NZTU1FVFJJQywJCS8qIEJvdGggc3RhdGlvbiBtYXkgc2VuZCBQQVVTRSAqLworfTsKKworCitzdHJ1Y3Qgc2tnZV9wb3J0IHsKKwlzdHJ1Y3Qgc2tnZV9odwkgICAgICpodzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAqbmV0ZGV2OworCWludAkJICAgICBwb3J0OworCisJc3RydWN0IHNrZ2VfcmluZyAgICAgdHhfcmluZzsKKwlzdHJ1Y3Qgc2tnZV9yaW5nICAgICByeF9yaW5nOworCisJZW51bSBwYXVzZV9jb250cm9sICAgZmxvd19jb250cm9sOworCWVudW0gcGF1c2Vfc3RhdHVzICAgIGZsb3dfc3RhdHVzOworCXU4CQkgICAgIGF1dG9uZWc7CS8qIEFVVE9ORUdfRU5BQkxFLCBBVVRPTkVHX0RJU0FCTEUgKi8KKwl1OAkJICAgICBkdXBsZXg7CS8qIERVUExFWF9IQUxGLCBEVVBMRVhfRlVMTCAqLworCXUxNgkJICAgICBzcGVlZDsJLyogU1BFRURfMTAwMCwgU1BFRURfMTAwLCAuLi4gKi8KKwl1MzIJCSAgICAgYWR2ZXJ0aXNpbmc7CisKKwl2b2lkCQkgICAgICptZW07CS8qIFBDSSBtZW1vcnkgZm9yIHJpbmdzICovCisJdTMyCQkgICAgIGRtYTsKKwlpbnQJCSAgICAgdXNlX3htX2xpbmtfdGltZXI7Cit9OworCisKKy8qIFJlZ2lzdGVyIGFjY2Vzc29yIGZvciBtZW1vcnkgbWFwcGVkIGRldmljZSAqLworc3RhdGljIGlubGluZSB1MzIgc2tnZV9yZWFkMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcmVnKQoreworCXJldHVybiByZWFkbChody0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNrZ2VfcmVhZDE2KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZHcoaHctPnJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHNrZ2VfcmVhZDgoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcmVnKQoreworCXJldHVybiByZWFkYihody0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2dlX3dyaXRlMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcmVnLCB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIGh3LT5yZWdzICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrZ2Vfd3JpdGUxNihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCByZWcsIHUxNiB2YWwpCit7CisJd3JpdGV3KHZhbCwgaHctPnJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tnZV93cml0ZTgoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcmVnLCB1OCB2YWwpCit7CisJd3JpdGViKHZhbCwgaHctPnJlZ3MgKyByZWcpOworfQorCisvKiBNQUMgUmVsYXRlZCBSZWdpc3RlcnMgaW5zaWRlIHRoZSBkZXZpY2UuICovCisjZGVmaW5lIFNLX1JFRyhwb3J0LHJlZykJKCgocG9ydCk8PDcpKyh1MTYpKHJlZykpCisjZGVmaW5lIFNLX1hNQUNfUkVHKHBvcnQsIHJlZykgXAorCSgoQkFTRV9YTUFDXzEgKyAocG9ydCkgKiAoQkFTRV9YTUFDXzIgLSBCQVNFX1hNQUNfMSkpIHwgKHJlZykgPDwgMSkKKworc3RhdGljIGlubGluZSB1MzIgeG1fcmVhZDMyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcpCit7CisJdTMyIHY7CisJdiA9IHNrZ2VfcmVhZDE2KGh3LCBTS19YTUFDX1JFRyhwb3J0LCByZWcpKTsKKwl2IHw9ICh1MzIpc2tnZV9yZWFkMTYoaHcsIFNLX1hNQUNfUkVHKHBvcnQsIHJlZysyKSkgPDwgMTY7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHhtX3JlYWQxNihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnKQoreworCXJldHVybiBza2dlX3JlYWQxNihodywgU0tfWE1BQ19SRUcocG9ydCxyZWcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhtX3dyaXRlMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHIsIHUzMiB2KQoreworCXNrZ2Vfd3JpdGUxNihodywgU0tfWE1BQ19SRUcocG9ydCxyKSwgdiAmIDB4ZmZmZik7CisJc2tnZV93cml0ZTE2KGh3LCBTS19YTUFDX1JFRyhwb3J0LHIrMiksIHYgPj4gMTYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeG1fd3JpdGUxNihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTE2IHYpCit7CisJc2tnZV93cml0ZTE2KGh3LCBTS19YTUFDX1JFRyhwb3J0LHIpLCB2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhtX291dGhhc2goY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZywKKwkJCQkgICBjb25zdCB1OCAqaGFzaCkKK3sKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCByZWcsICAgKHUxNiloYXNoWzBdIHwgKCh1MTYpaGFzaFsxXSA8PCA4KSk7CisJeG1fd3JpdGUxNihodywgcG9ydCwgcmVnKzIsICh1MTYpaGFzaFsyXSB8ICgodTE2KWhhc2hbM10gPDwgOCkpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys0LCAodTE2KWhhc2hbNF0gfCAoKHUxNiloYXNoWzVdIDw8IDgpKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCByZWcrNiwgKHUxNiloYXNoWzZdIHwgKCh1MTYpaGFzaFs3XSA8PCA4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4bV9vdXRhZGRyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcsCisJCQkJICAgY29uc3QgdTggKmFkZHIpCit7CisJeG1fd3JpdGUxNihodywgcG9ydCwgcmVnLCAgICh1MTYpYWRkclswXSB8ICgodTE2KWFkZHJbMV0gPDwgOCkpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIHJlZysyLCAodTE2KWFkZHJbMl0gfCAoKHUxNilhZGRyWzNdIDw8IDgpKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCByZWcrNCwgKHUxNilhZGRyWzRdIHwgKCh1MTYpYWRkcls1XSA8PCA4KSk7Cit9CisKKyNkZWZpbmUgU0tfR01BQ19SRUcocG9ydCxyZWcpIFwKKwkoQkFTRV9HTUFDXzEgKyAocG9ydCkgKiAoQkFTRV9HTUFDXzItQkFTRV9HTUFDXzEpICsgKHJlZykpCisKK3N0YXRpYyBpbmxpbmUgdTE2IGdtYV9yZWFkMTYoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKK3sKKwlyZXR1cm4gc2tnZV9yZWFkMTYoaHcsIFNLX0dNQUNfUkVHKHBvcnQscmVnKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdtYV9yZWFkMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKK3sKKwlyZXR1cm4gKHUzMikgc2tnZV9yZWFkMTYoaHcsIFNLX0dNQUNfUkVHKHBvcnQscmVnKSkKKwkJfCAoKHUzMilza2dlX3JlYWQxNihodywgU0tfR01BQ19SRUcocG9ydCxyZWcrNCkpIDw8IDE2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdtYV93cml0ZTE2KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByLCB1MTYgdikKK3sKKwlza2dlX3dyaXRlMTYoaHcsIFNLX0dNQUNfUkVHKHBvcnQsciksIHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ21hX3NldF9hZGRyKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcsCisJCQkJICAgIGNvbnN0IHU4ICphZGRyKQoreworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCByZWcsICAodTE2KSBhZGRyWzBdIHwgKCh1MTYpIGFkZHJbMV0gPDwgOCkpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCByZWcrNCwodTE2KSBhZGRyWzJdIHwgKCh1MTYpIGFkZHJbM10gPDwgOCkpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCByZWcrOCwodTE2KSBhZGRyWzRdIHwgKCh1MTYpIGFkZHJbNV0gPDwgOCkpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NreTIuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NreTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDk0MGFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc2t5Mi5jCkBAIC0wLDAgKzEsMjM5OSBAQAorLyoKKyAqIGdQWEUgZHJpdmVyIGZvciBNYXJ2ZWxsIFl1a29uIDIgY2hpcHNldC4gRGVyaXZlZCBmcm9tIExpbnV4IHNreTIgZHJpdmVyCisgKiAodjEuMjIpLCB3aGljaCB3YXMgYmFzZWQgb24gZWFybGllciBzazk4bGluIGFuZCBza2dlIGRyaXZlcnMuCisgKgorICogVGhpcyBkcml2ZXIgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBzdXBwb3J0IGFsbCB0aGUgZmVhdHVyZXMKKyAqIG9mIHRoZSBvcmlnaW5hbCBkcml2ZXIgc3VjaCBhcyBsaW5rIGZhaWwtb3ZlciBhbmQgbGluayBtYW5hZ2VtZW50IGJlY2F1c2UKKyAqIHRob3NlIHNob3VsZCBiZSBkb25lIGF0IGhpZ2hlciBsZXZlbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQG9zZGwub3JnPgorICoKKyAqIE1vZGlmaWVkIGZvciBnUFhFLCBBcHJpbCAyMDA5IGJ5IEpvc2h1YSBPcmVtYW4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL3BjaS5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8bWlpLmg+CisKKyNpbmNsdWRlICJza3kyLmgiCisKKyNkZWZpbmUgRFJWX05BTUUJCSJza3kyIgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMjIiCisjZGVmaW5lIFBGWAkJCURSVl9OQU1FICIgIgorCisvKgorICogVGhlIFl1a29uIElJIGNoaXBzZXQgdGFrZXMgNjQgYml0IGNvbW1hbmQgYmxvY2tzIChjYWxsZWQgbGlzdCBlbGVtZW50cykKKyAqIHRoYXQgYXJlIG9yZ2FuaXplZCBpbnRvIHRocmVlIChyZWNlaXZlLCB0cmFuc21pdCwgc3RhdHVzKSBkaWZmZXJlbnQgcmluZ3MKKyAqIHNpbWlsYXIgdG8gVGlnb24zLgorICoKKyAqIEVhY2ggcmluZyBzdGFydCBtdXN0IGJlIGFsaWduZWQgdG8gYSA0ayBib3VuZGFyeS4gWW91IHdpbGwgZ2V0IG15c3RlcmlvdXMKKyAqICJpbnZhbGlkIExFIiBlcnJvcnMgaWYgdGhleSdyZSBub3QuCisgKgorICogVGhlIGNhcmQgc2lsZW50bHkgZm9yY2VzIGVhY2ggcmluZyBzaXplIHRvIGJlIGF0IGxlYXN0IDEyOC4gSWYgeW91CisgKiBhY3QgYXMgdGhvdWdoIG9uZSBvZiB0aGVtIGlzIHNtYWxsZXIgKGJ5IHNldHRpbmcgdGhlIGJlbG93CisgKiAjZGVmaW5lcykgeW91J2xsIGdldCBiYWQgYnVncy4KKyAqLworCisjZGVmaW5lIFJYX0xFX1NJWkUJICAgIAkxMjgKKyNkZWZpbmUgUlhfTEVfQllURVMJCShSWF9MRV9TSVpFKnNpemVvZihzdHJ1Y3Qgc2t5Ml9yeF9sZSkpCisjZGVmaW5lIFJYX1JJTkdfQUxJR04JCTQwOTYKKyNkZWZpbmUgUlhfUEVORElORwkJKFJYX0xFX1NJWkUvNiAtIDIpCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCQkxMjgKKyNkZWZpbmUgVFhfUEVORElORwkJKFRYX1JJTkdfU0laRSAtIDEpCisjZGVmaW5lIFRYX1JJTkdfQUxJR04JCTQwOTYKKyNkZWZpbmUgTUFYX1NLQl9UWF9MRQkJNAorCisjZGVmaW5lIFNUQVRVU19SSU5HX1NJWkUJNTEyCS8qIDIgcG9ydHMgKiAoVFggKyBSWCkgKi8KKyNkZWZpbmUgU1RBVFVTX0xFX0JZVEVTCQkoU1RBVFVTX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IHNreTJfc3RhdHVzX2xlKSkKKyNkZWZpbmUgU1RBVFVTX1JJTkdfQUxJR04gICAgICAgNDA5NgorI2RlZmluZSBQSFlfUkVUUklFUwkJMTAwMAorCisjZGVmaW5lIFNLWTJfRUVQUk9NX01BR0lDCTB4OTk1NWFhYmIKKworCisjZGVmaW5lIFJJTkdfTkVYVCh4LHMpCSgoKHgpKzEpICYgKChzKS0xKSkKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNreTJfaWRfdGFibGVbXSA9IHsKKwlQQ0lfUk9NKDB4MTE0OCwgMHg5MDAwLCAic2s5c3h4IiwgIlN5c2tvbm5lY3QgU0stOVN4eCIsIDApLAorCVBDSV9ST00oMHgxMTQ4LCAweDllMDAsICJzazlleHgiLCAiU3lza29ubmVjdCBTSy05RXh4IiwgMCksCisJUENJX1JPTSgweDExODYsIDB4NGIwMCwgImRnZTU2MHQiLCAiRC1MaW5rIERHRS01NjBUIiwgMCksCisJUENJX1JPTSgweDExODYsIDB4NDAwMSwgImRnZTU1MHN4IiwgIkQtTGluayBER0UtNTUwU1giLCAwKSwKKwlQQ0lfUk9NKDB4MTE4NiwgMHg0YjAyLCAiZGdlNTYwc3giLCAiRC1MaW5rIERHRS01NjBTWCIsIDApLAorCVBDSV9ST00oMHgxMTg2LCAweDRiMDMsICJkZ2U1NTB0IiwgIkQtTGluayBER0UtNTUwVCIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNDAsICJtODhlODAyMSIsICJNYXJ2ZWxsIDg4RTgwMjEiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzQxLCAibTg4ZTgwMjIiLCAiTWFydmVsbCA4OEU4MDIyIiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM0MiwgIm04OGU4MDYxIiwgIk1hcnZlbGwgODhFODA2MSIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNDMsICJtODhlODA2MiIsICJNYXJ2ZWxsIDg4RTgwNjIiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzQ0LCAibTg4ZTgwMjFiIiwgIk1hcnZlbGwgODhFODAyMSIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNDUsICJtODhlODAyMmIiLCAiTWFydmVsbCA4OEU4MDIyIiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM0NiwgIm04OGU4MDYxYiIsICJNYXJ2ZWxsIDg4RTgwNjEiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzQ3LCAibTg4ZTgwNjJiIiwgIk1hcnZlbGwgODhFODA2MiIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNTAsICJtODhlODAzNSIsICJNYXJ2ZWxsIDg4RTgwMzUiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzUxLCAibTg4ZTgwMzYiLCAiTWFydmVsbCA4OEU4MDM2IiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM1MiwgIm04OGU4MDM4IiwgIk1hcnZlbGwgODhFODAzOCIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNTMsICJtODhlODAzOSIsICJNYXJ2ZWxsIDg4RTgwMzkiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzU0LCAibTg4ZTgwNDAiLCAiTWFydmVsbCA4OEU4MDQwIiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM1NSwgIm04OGU4MDQwdCIsICJNYXJ2ZWxsIDg4RTgwNDBUIiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM1NiwgIm04OGVjMDMzIiwgIk1hcnZlbCA4OEVDMDMzIiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM1NywgIm04OGU4MDQyIiwgIk1hcnZlbGwgODhFODA0MiIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNWEsICJtODhlODA0OCIsICJNYXJ2ZWxsIDg4RTgwNDgiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzYwLCAibTg4ZTgwNTIiLCAiTWFydmVsbCA4OEU4MDUyIiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM2MSwgIm04OGU4MDUwIiwgIk1hcnZlbGwgODhFODA1MCIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNjIsICJtODhlODA1MyIsICJNYXJ2ZWxsIDg4RTgwNTMiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzYzLCAibTg4ZTgwNTUiLCAiTWFydmVsbCA4OEU4MDU1IiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM2NCwgIm04OGU4MDU2IiwgIk1hcnZlbGwgODhFODA1NiIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNjUsICJtODhlODA3MCIsICJNYXJ2ZWxsIDg4RTgwNzAiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzY2LCAibTg4ZWMwMzYiLCAiTWFydmVsbCA4OEVDMDM2IiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM2NywgIm04OGVjMDMyIiwgIk1hcnZlbGwgODhFQzAzMiIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNjgsICJtODhlYzAzNCIsICJNYXJ2ZWxsIDg4RUMwMzQiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzY5LCAibTg4ZWMwNDIiLCAiTWFydmVsbCA4OEVDMDQyIiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM2YSwgIm04OGU4MDU4IiwgIk1hcnZlbGwgODhFODA1OCIsIDApLAorCVBDSV9ST00oMHgxMWFiLCAweDQzNmIsICJtODhlODA3MSIsICJNYXJ2ZWxsIDg4RTgwNzEiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzZjLCAibTg4ZTgwNzIiLCAiTWFydmVsbCA4OEU4MDcyIiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM2ZCwgIm04OGU4MDU1YiIsICJNYXJ2ZWxsIDg4RTgwNTUiLCAwKSwKKwlQQ0lfUk9NKDB4MTFhYiwgMHg0MzcwLCAibTg4ZTgwNzUiLCAiTWFydmVsbCA4OEU4MDc1IiwgMCksCisJUENJX1JPTSgweDExYWIsIDB4NDM4MCwgIm04OGU4MDU3IiwgIk1hcnZlbGwgODhFODA1NyIsIDApCit9OworCisvKiBBdm9pZCBjb25kaXRpb25hbHMgYnkgdXNpbmcgYXJyYXkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB0eHFhZGRyW10gPSB7IFFfWEExLCBRX1hBMiB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHJ4cWFkZHJbXSA9IHsgUV9SMSwgUV9SMiB9Oworc3RhdGljIGNvbnN0IHUzMiBwb3J0aXJxX21za1tdID0geyBZMl9JU19QT1JUXzEsIFkyX0lTX1BPUlRfMiB9OworCitzdGF0aWMgdm9pZCBza3kyX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEFjY2VzcyB0byBQSFkgdmlhIHNlcmlhbCBpbnRlcmNvbm5lY3QgKi8KK3N0YXRpYyBpbnQgZ21fcGh5X3dyaXRlKHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcG9ydCwgdTE2IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgaTsKKworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9TTUlfREFUQSwgdmFsKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fU01JX0NUUkwsCisJCSAgICBHTV9TTUlfQ1RfUEhZX0FEKFBIWV9BRERSX01BUlYpIHwgR01fU01JX0NUX1JFR19BRChyZWcpKTsKKworCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7CisJCXUxNiBjdHJsID0gZ21hX3JlYWQxNihodywgcG9ydCwgR01fU01JX0NUUkwpOworCQlpZiAoY3RybCA9PSAweGZmZmYpCisJCQlnb3RvIGlvX2Vycm9yOworCisJCWlmICghKGN0cmwgJiBHTV9TTUlfQ1RfQlVTWSkpCisJCQlyZXR1cm4gMDsKKworCQl1ZGVsYXkoMTApOworCX0KKworCURCRyhQRlggIiVzOiBwaHkgd3JpdGUgdGltZW91dFxuIiwgaHctPmRldltwb3J0XS0+bmFtZSk7CisJcmV0dXJuIC1FVElNRURPVVQ7CisKK2lvX2Vycm9yOgorCURCRyhQRlggIiVzOiBwaHkgSS9PIGVycm9yXG4iLCBody0+ZGV2W3BvcnRdLT5uYW1lKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBfX2dtX3BoeV9yZWFkKHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcG9ydCwgdTE2IHJlZywgdTE2ICp2YWwpCit7CisJaW50IGk7CisKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fU01JX0NUUkwsIEdNX1NNSV9DVF9QSFlfQUQoUEhZX0FERFJfTUFSVikKKwkJICAgIHwgR01fU01JX0NUX1JFR19BRChyZWcpIHwgR01fU01JX0NUX09QX1JEKTsKKworCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7CisJCXUxNiBjdHJsID0gZ21hX3JlYWQxNihodywgcG9ydCwgR01fU01JX0NUUkwpOworCQlpZiAoY3RybCA9PSAweGZmZmYpCisJCQlnb3RvIGlvX2Vycm9yOworCisJCWlmIChjdHJsICYgR01fU01JX0NUX1JEX1ZBTCkgeworCQkJKnZhbCA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1NNSV9EQVRBKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlEQkcoUEZYICIlczogcGh5IHJlYWQgdGltZW91dFxuIiwgaHctPmRldltwb3J0XS0+bmFtZSk7CisJcmV0dXJuIC1FVElNRURPVVQ7Citpb19lcnJvcjoKKwlEQkcoUEZYICIlczogcGh5IEkvTyBlcnJvclxuIiwgaHctPmRldltwb3J0XS0+bmFtZSk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGdtX3BoeV9yZWFkKHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcG9ydCwgdTE2IHJlZykKK3sKKwl1MTYgdiA9IDA7CisJX19nbV9waHlfcmVhZChodywgcG9ydCwgcmVnLCAmdik7CisJcmV0dXJuIHY7Cit9CisKKworc3RhdGljIHZvaWQgc2t5Ml9wb3dlcl9vbihzdHJ1Y3Qgc2t5Ml9odyAqaHcpCit7CisJLyogc3dpdGNoIHBvd2VyIHRvIFZDQyAoV0EgZm9yIFZBVVggcHJvYmxlbSkgKi8KKwlza3kyX3dyaXRlOChodywgQjBfUE9XRVJfQ1RSTCwKKwkJICAgIFBDX1ZBVVhfRU5BIHwgUENfVkNDX0VOQSB8IFBDX1ZBVVhfT0ZGIHwgUENfVkNDX09OKTsKKworCS8qIGRpc2FibGUgQ29yZSBDbG9jayBEaXZpc2lvbiwgKi8KKwlza3kyX3dyaXRlMzIoaHcsIEIyX1kyX0NMS19DVFJMLCBZMl9DTEtfRElWX0RJUyk7CisKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCAmJiBody0+Y2hpcF9yZXYgPiAxKQorCQkvKiBlbmFibGUgYml0cyBhcmUgaW52ZXJ0ZWQgKi8KKwkJc2t5Ml93cml0ZTgoaHcsIEIyX1kyX0NMS19HQVRFLAorCQkJICAgIFkyX1BDSV9DTEtfTE5LMV9ESVMgfCBZMl9DT1JfQ0xLX0xOSzFfRElTIHwKKwkJCSAgICBZMl9DTEtfR0FUX0xOSzFfRElTIHwgWTJfUENJX0NMS19MTksyX0RJUyB8CisJCQkgICAgWTJfQ09SX0NMS19MTksyX0RJUyB8IFkyX0NMS19HQVRfTE5LMl9ESVMpOworCWVsc2UKKwkJc2t5Ml93cml0ZTgoaHcsIEIyX1kyX0NMS19HQVRFLCAwKTsKKworCWlmIChody0+ZmxhZ3MgJiBTS1kyX0hXX0FEVl9QT1dFUl9DVEwpIHsKKwkJdTMyIHJlZzsKKworCQlza3kyX3BjaV93cml0ZTMyKGh3LCBQQ0lfREVWX1JFRzMsIDApOworCisJCXJlZyA9IHNreTJfcGNpX3JlYWQzMihodywgUENJX0RFVl9SRUc0KTsKKwkJLyogc2V0IGFsbCBiaXRzIHRvIDAgZXhjZXB0IGJpdHMgMTUuLjEyIGFuZCA4ICovCisJCXJlZyAmPSBQX0FTUE1fQ09OVFJPTF9NU0s7CisJCXNreTJfcGNpX3dyaXRlMzIoaHcsIFBDSV9ERVZfUkVHNCwgcmVnKTsKKworCQlyZWcgPSBza3kyX3BjaV9yZWFkMzIoaHcsIFBDSV9ERVZfUkVHNSk7CisJCS8qIHNldCBhbGwgYml0cyB0byAwIGV4Y2VwdCBiaXRzIDI4ICYgMjcgKi8KKwkJcmVnICY9IFBfQ1RMX1RJTV9WTUFJTl9BVl9NU0s7CisJCXNreTJfcGNpX3dyaXRlMzIoaHcsIFBDSV9ERVZfUkVHNSwgcmVnKTsKKworCQlza3kyX3BjaV93cml0ZTMyKGh3LCBQQ0lfQ0ZHX1JFR18xLCAwKTsKKworCQkvKiBFbmFibGUgd29ya2Fyb3VuZCBmb3IgZGV2IDQuMTA3IG9uIFl1a29uLVVsdHJhICYgRXh0cmVtZSAqLworCQlyZWcgPSBza3kyX3JlYWQzMihodywgQjJfR1BfSU8pOworCQlyZWcgfD0gR0xCX0dQSU9fU1RBVF9SQUNFX0RJUzsKKwkJc2t5Ml93cml0ZTMyKGh3LCBCMl9HUF9JTywgcmVnKTsKKworCQlza3kyX3JlYWQzMihodywgQjJfR1BfSU8pOworCX0KK30KKworc3RhdGljIHZvaWQgc2t5Ml9wb3dlcl9hdXgoc3RydWN0IHNreTJfaHcgKmh3KQoreworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX1hMICYmIGh3LT5jaGlwX3JldiA+IDEpCisJCXNreTJfd3JpdGU4KGh3LCBCMl9ZMl9DTEtfR0FURSwgMCk7CisJZWxzZQorCQkvKiBlbmFibGUgYml0cyBhcmUgaW52ZXJ0ZWQgKi8KKwkJc2t5Ml93cml0ZTgoaHcsIEIyX1kyX0NMS19HQVRFLAorCQkJICAgIFkyX1BDSV9DTEtfTE5LMV9ESVMgfCBZMl9DT1JfQ0xLX0xOSzFfRElTIHwKKwkJCSAgICBZMl9DTEtfR0FUX0xOSzFfRElTIHwgWTJfUENJX0NMS19MTksyX0RJUyB8CisJCQkgICAgWTJfQ09SX0NMS19MTksyX0RJUyB8IFkyX0NMS19HQVRfTE5LMl9ESVMpOworCisJLyogc3dpdGNoIHBvd2VyIHRvIFZBVVggKi8KKwlpZiAoc2t5Ml9yZWFkMTYoaHcsIEIwX0NUU1QpICYgWTJfVkFVWF9BVkFJTCkKKwkJc2t5Ml93cml0ZTgoaHcsIEIwX1BPV0VSX0NUUkwsCisJCQkgICAgKFBDX1ZBVVhfRU5BIHwgUENfVkNDX0VOQSB8CisJCQkgICAgIFBDX1ZBVVhfT04gfCBQQ19WQ0NfT0ZGKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNreTJfZ21hY19yZXNldChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHBvcnQpCit7CisJdTE2IHJlZzsKKworCS8qIGRpc2FibGUgYWxsIEdNQUMgSVJRJ3MgKi8KKwlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfSVJRX01TSyksIDApOworCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDEsIDApOwkvKiBjbGVhciBNQyBoYXNoICovCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDIsIDApOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gzLCAwKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fTUNfQUREUl9INCwgMCk7CisKKwlyZWcgPSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9SWF9DVFJMKTsKKwlyZWcgfD0gR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9NQ0ZfRU5BOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9SWF9DVFJMLCByZWcpOworfQorCisvKiBmbG93IGNvbnRyb2wgdG8gYWR2ZXJ0aXNlIGJpdHMgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29wcGVyX2ZjX2FkdltdID0geworCVtGQ19OT05FXQk9IDAsCisJW0ZDX1RYXQkJPSBQSFlfTV9BTl9BU1AsCisJW0ZDX1JYXQkJPSBQSFlfTV9BTl9QQywKKwlbRkNfQk9USF0JPSBQSFlfTV9BTl9QQyB8IFBIWV9NX0FOX0FTUCwKK307CisKKy8qIGZsb3cgY29udHJvbCB0byBhZHZlcnRpc2UgYml0cyB3aGVuIHVzaW5nIDEwMDBCYXNlWCAqLworc3RhdGljIGNvbnN0IHUxNiBmaWJlcl9mY19hZHZbXSA9IHsKKwlbRkNfTk9ORV0gPSBQSFlfTV9QX05PX1BBVVNFX1gsCisJW0ZDX1RYXSAgID0gUEhZX01fUF9BU1lNX01EX1gsCisJW0ZDX1JYXQkgID0gUEhZX01fUF9TWU1fTURfWCwKKwlbRkNfQk9USF0gPSBQSFlfTV9QX0JPVEhfTURfWCwKK307CisKKy8qIGZsb3cgY29udHJvbCB0byBHTUEgZGlzYWJsZSBiaXRzICovCitzdGF0aWMgY29uc3QgdTE2IGdtX2ZjX2Rpc2FibGVbXSA9IHsKKwlbRkNfTk9ORV0gPSBHTV9HUENSX0ZDX1JYX0RJUyB8IEdNX0dQQ1JfRkNfVFhfRElTLAorCVtGQ19UWF0JICA9IEdNX0dQQ1JfRkNfUlhfRElTLAorCVtGQ19SWF0JICA9IEdNX0dQQ1JfRkNfVFhfRElTLAorCVtGQ19CT1RIXSA9IDAsCit9OworCisKK3N0YXRpYyB2b2lkIHNreTJfcGh5X2luaXQoc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCBwb3J0KQoreworCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihody0+ZGV2W3BvcnRdKTsKKwl1MTYgY3RybCwgY3QxMDAwLCBhZHYsIHBnLCBsZWRjdHJsLCBsZWRvdmVyLCByZWc7CisKKwlpZiAoc2t5Mi0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSAmJgorCSAgICAhKGh3LT5mbGFncyAmIFNLWTJfSFdfTkVXRVJfUEhZKSkgeworCQl1MTYgZWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfRVhUX0NUUkwpOworCisJCWVjdHJsICY9IH4oUEhZX01fRUNfTV9EU0NfTVNLIHwgUEhZX01fRUNfU19EU0NfTVNLIHwKKwkJCSAgIFBIWV9NX0VDX01BQ19TX01TSyk7CisJCWVjdHJsIHw9IFBIWV9NX0VDX01BQ19TKE1BQ19UWF9DTEtfMjVfTUhaKTsKKworCQkvKiBvbiBQSFkgODhFMTA0MCBSZXYuRDAgKGFuZCBuZXdlcikgZG93bnNoaWZ0IGNvbnRyb2wgY2hhbmdlZCAqLworCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQykKKwkJCS8qIHNldCBkb3duc2hpZnQgY291bnRlciB0byAzeCBhbmQgZW5hYmxlIGRvd25zaGlmdCAqLworCQkJZWN0cmwgfD0gUEhZX01fRUNfRFNDXzIoMikgfCBQSFlfTV9FQ19ET1dOX1NfRU5BOworCQllbHNlCisJCQkvKiBzZXQgbWFzdGVyICYgc2xhdmUgZG93bnNoaWZ0IGNvdW50ZXIgdG8gMXggKi8KKwkJCWVjdHJsIHw9IFBIWV9NX0VDX01fRFNDKDApIHwgUEhZX01fRUNfU19EU0MoMSk7CisKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTCwgZWN0cmwpOworCX0KKworCWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfUEhZX0NUUkwpOworCWlmIChza3kyX2lzX2NvcHBlcihodykpIHsKKwkJaWYgKCEoaHctPmZsYWdzICYgU0tZMl9IV19HSUdBQklUKSkgeworCQkJLyogZW5hYmxlIGF1dG9tYXRpYyBjcm9zc292ZXIgKi8KKwkJCWN0cmwgfD0gUEhZX01fUENfTURJX1hNT0RFKFBIWV9NX1BDX0VOQV9BVVRPKSA+PiAxOworCisJCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9GRV9QICYmCisJCQkgICAgaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0ZFMl9BMCkgeworCQkJCXUxNiBzcGVjOworCisJCQkJLyogRW5hYmxlIENsYXNzIEEgZHJpdmVyIGZvciBGRSsgQTAgKi8KKwkJCQlzcGVjID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0ZFX1NQRUNfMik7CisJCQkJc3BlYyB8PSBQSFlfTV9GRVNDX1NFTF9DTF9BOworCQkJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRkVfU1BFQ18yLCBzcGVjKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGRpc2FibGUgZW5lcmd5IGRldGVjdCAqLworCQkJY3RybCAmPSB+UEhZX01fUENfRU5fREVUX01TSzsKKworCQkJLyogZW5hYmxlIGF1dG9tYXRpYyBjcm9zc292ZXIgKi8KKwkJCWN0cmwgfD0gUEhZX01fUENfTURJX1hNT0RFKFBIWV9NX1BDX0VOQV9BVVRPKTsKKworCQkJLyogZG93bnNoaWZ0IG9uIFBIWSA4OEUxMTEyIGFuZCA4OEUxMTQ5IGlzIGNoYW5nZWQgKi8KKwkJCWlmIChza3kyLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFCisJCQkgICAgJiYgKGh3LT5mbGFncyAmIFNLWTJfSFdfTkVXRVJfUEhZKSkgeworCQkJCS8qIHNldCBkb3duc2hpZnQgY291bnRlciB0byAzeCBhbmQgZW5hYmxlIGRvd25zaGlmdCAqLworCQkJCWN0cmwgJj0gflBIWV9NX1BDX0RTQ19NU0s7CisJCQkJY3RybCB8PSBQSFlfTV9QQ19EU0MoMikgfCBQSFlfTV9QQ19ET1dOX1NfRU5BOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogd29ya2Fyb3VuZCBmb3IgZGV2aWF0aW9uICM0Ljg4IChDUkMgZXJyb3JzKSAqLworCQkvKiBkaXNhYmxlIEF1dG9tYXRpYyBDcm9zc292ZXIgKi8KKworCQljdHJsICY9IH5QSFlfTV9QQ19NRElYX01TSzsKKwl9CisKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCBjdHJsKTsKKworCS8qIHNwZWNpYWwgc2V0dXAgZm9yIFBIWSA4OEUxMTEyIEZpYmVyICovCisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fWEwgJiYgKGh3LT5mbGFncyAmIFNLWTJfSFdfRklCUkVfUEhZKSkgeworCQlwZyA9IGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQURSKTsKKworCQkvKiBGaWJlcjogc2VsZWN0IDEwMDBCQVNFLVggb25seSBtb2RlIE1BQyBTcGVjaWZpYyBDdHJsIFJlZy4gKi8KKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQURSLCAyKTsKKwkJY3RybCA9IGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCk7CisJCWN0cmwgJj0gflBIWV9NX01BQ19NRF9NU0s7CisJCWN0cmwgfD0gUEhZX01fTUFDX01PREVfU0VMKFBIWV9NX01BQ19NRF8xMDAwQlgpOworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCBjdHJsKTsKKworCQlpZiAoaHctPnBtZF90eXBlICA9PSAnUCcpIHsKKwkJCS8qIHNlbGVjdCBwYWdlIDEgdG8gYWNjZXNzIEZpYmVyIHJlZ2lzdGVycyAqLworCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQURSLCAxKTsKKworCQkJLyogZm9yIFNGUC1tb2R1bGUgc2V0IFNJR0RFVCBwb2xhcml0eSB0byBsb3cgKi8KKwkJCWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfUEhZX0NUUkwpOworCQkJY3RybCB8PSBQSFlfTV9GSUJfU0lHRF9QT0w7CisJCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCBjdHJsKTsKKwkJfQorCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUiwgcGcpOworCX0KKworCWN0cmwgPSBQSFlfQ1RfUkVTRVQ7CisJY3QxMDAwID0gMDsKKwlhZHYgPSBQSFlfQU5fQ1NNQTsKKwlyZWcgPSAwOworCisJaWYgKHNreTItPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKHNreTJfaXNfY29wcGVyKGh3KSkgeworCQkJaWYgKHNreTItPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKKwkJCQljdDEwMDAgfD0gUEhZX01fMTAwMENfQUZEOworCQkJaWYgKHNreTItPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKKwkJCQljdDEwMDAgfD0gUEhZX01fMTAwMENfQUhEOworCQkJaWYgKHNreTItPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQkJCWFkdiB8PSBQSFlfTV9BTl8xMDBfRkQ7CisJCQlpZiAoc2t5Mi0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCQkJYWR2IHw9IFBIWV9NX0FOXzEwMF9IRDsKKwkJCWlmIChza3kyLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQkJCWFkdiB8PSBQSFlfTV9BTl8xMF9GRDsKKwkJCWlmIChza3kyLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQkJCWFkdiB8PSBQSFlfTV9BTl8xMF9IRDsKKworCQkJYWR2IHw9IGNvcHBlcl9mY19hZHZbc2t5Mi0+Zmxvd19tb2RlXTsKKwkJfSBlbHNlIHsJLyogc3BlY2lhbCBkZWZpbmVzIGZvciBGSUJFUiAoODhFMTA0MFMgb25seSkgKi8KKwkJCWlmIChza3kyLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCisJCQkJYWR2IHw9IFBIWV9NX0FOXzEwMDBYX0FGRDsKKwkJCWlmIChza3kyLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpCisJCQkJYWR2IHw9IFBIWV9NX0FOXzEwMDBYX0FIRDsKKworCQkJYWR2IHw9IGZpYmVyX2ZjX2Fkdltza3kyLT5mbG93X21vZGVdOworCQl9CisKKwkJLyogUmVzdGFydCBBdXRvLW5lZ290aWF0aW9uICovCisJCWN0cmwgfD0gUEhZX0NUX0FORSB8IFBIWV9DVF9SRV9DRkc7CisJfSBlbHNlIHsKKwkJLyogZm9yY2VkIHNwZWVkL2R1cGxleCBzZXR0aW5ncyAqLworCQljdDEwMDAgPSBQSFlfTV8xMDAwQ19NU0U7CisKKwkJLyogRGlzYWJsZSBhdXRvIHVwZGF0ZSBmb3IgZHVwbGV4IGZsb3cgY29udHJvbCBhbmQgc3BlZWQgKi8KKwkJcmVnIHw9IEdNX0dQQ1JfQVVfQUxMX0RJUzsKKworCQlzd2l0Y2ggKHNreTItPnNwZWVkKSB7CisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCWN0cmwgfD0gUEhZX0NUX1NQMTAwMDsKKwkJCXJlZyB8PSBHTV9HUENSX1NQRUVEXzEwMDA7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQljdHJsIHw9IFBIWV9DVF9TUDEwMDsKKwkJCXJlZyB8PSBHTV9HUENSX1NQRUVEXzEwMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNreTItPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgeworCQkJcmVnIHw9IEdNX0dQQ1JfRFVQX0ZVTEw7CisJCQljdHJsIHw9IFBIWV9DVF9EVVBfTUQ7CisJCX0gZWxzZSBpZiAoc2t5Mi0+c3BlZWQgPCBTUEVFRF8xMDAwKQorCQkJc2t5Mi0+Zmxvd19tb2RlID0gRkNfTk9ORTsKKworCisJCXJlZyB8PSBnbV9mY19kaXNhYmxlW3NreTItPmZsb3dfbW9kZV07CisKKwkJLyogRm9yd2FyZCBwYXVzZSBwYWNrZXRzIHRvIEdNQUM/ICovCisJCWlmIChza3kyLT5mbG93X21vZGUgJiBGQ19SWCkKKwkJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR01BQ19DVFJMKSwgR01DX1BBVVNFX09OKTsKKwkJZWxzZQorCQkJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT0ZGKTsKKwl9CisKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgcmVnKTsKKworCWlmIChody0+ZmxhZ3MgJiBTS1kyX0hXX0dJR0FCSVQpCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfMTAwMFRfQ1RSTCwgY3QxMDAwKTsKKworCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfQVVORV9BRFYsIGFkdik7CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9DVFJMLCBjdHJsKTsKKworCS8qIFNldHVwIFBoeSBMRUQncyAqLworCWxlZGN0cmwgPSBQSFlfTV9MRURfUFVMU19EVVIoUFVMU18xNzBNUyk7CisJbGVkb3ZlciA9IDA7CisKKwlzd2l0Y2ggKGh3LT5jaGlwX2lkKSB7CisJY2FzZSBDSElQX0lEX1lVS09OX0ZFOgorCQkvKiBvbiA4OEUzMDgyIHRoZXNlIGJpdHMgYXJlIGF0IDExLi45IChzaGlmdGVkIGxlZnQpICovCisJCWxlZGN0cmwgfD0gUEhZX01fTEVEX0JMSU5LX1JUKEJMSU5LXzg0TVMpIDw8IDE7CisKKwkJY3RybCA9IGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9GRV9MRURfUEFSKTsKKworCQkvKiBkZWxldGUgQUNUIExFRCBjb250cm9sIGJpdHMgKi8KKwkJY3RybCAmPSB+UEhZX01fRkVMUF9MRUQxX01TSzsKKwkJLyogY2hhbmdlIEFDVCBMRUQgY29udHJvbCB0byBibGluayBtb2RlICovCisJCWN0cmwgfD0gUEhZX01fRkVMUF9MRUQxX0NUUkwoTEVEX1BBUl9DVFJMX0FDVF9CTCk7CisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRkVfTEVEX1BBUiwgY3RybCk7CisJCWJyZWFrOworCisJY2FzZSBDSElQX0lEX1lVS09OX0ZFX1A6CisJCS8qIEVuYWJsZSBMaW5rIFBhcnRuZXIgTmV4dCBQYWdlICovCisJCWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfUEhZX0NUUkwpOworCQljdHJsIHw9IFBIWV9NX1BDX0VOQV9MSVBfTlA7CisKKwkJLyogZGlzYWJsZSBFbmVyZ3kgRGV0ZWN0IGFuZCBlbmFibGUgc2NyYW1ibGVyICovCisJCWN0cmwgJj0gfihQSFlfTV9QQ19FTkFfRU5FX0RUIHwgUEhZX01fUENfRElTX1NDUkFNQik7CisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsIGN0cmwpOworCisJCS8qIHNldCBMRUQyIC0+IEFDVCwgTEVEMSAtPiBMSU5LLCBMRUQwIC0+IFNQRUVEICovCisJCWN0cmwgPSBQSFlfTV9GRUxQX0xFRDJfQ1RSTChMRURfUEFSX0NUUkxfQUNUX0JMKSB8CisJCQlQSFlfTV9GRUxQX0xFRDFfQ1RSTChMRURfUEFSX0NUUkxfTElOSykgfAorCQkJUEhZX01fRkVMUF9MRUQwX0NUUkwoTEVEX1BBUl9DVFJMX1NQRUVEKTsKKworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0ZFX0xFRF9QQVIsIGN0cmwpOworCQlicmVhazsKKworCWNhc2UgQ0hJUF9JRF9ZVUtPTl9YTDoKKwkJcGcgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUik7CisKKwkJLyogc2VsZWN0IHBhZ2UgMyB0byBhY2Nlc3MgTEVEIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQURSLCAzKTsKKworCQkvKiBzZXQgTEVEIEZ1bmN0aW9uIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwKKwkJCSAgICAgKFBIWV9NX0xFRENfTE9TX0NUUkwoMSkgfAkvKiBMSU5LL0FDVCAqLworCQkJICAgICAgUEhZX01fTEVEQ19JTklUX0NUUkwoNykgfAkvKiAxMCBNYnBzICovCisJCQkgICAgICBQSFlfTV9MRURDX1NUQTFfQ1RSTCg3KSB8CS8qIDEwMCBNYnBzICovCisJCQkgICAgICBQSFlfTV9MRURDX1NUQTBfQ1RSTCg3KSkpOwkvKiAxMDAwIE1icHMgKi8KKworCQkvKiBzZXQgUG9sYXJpdHkgQ29udHJvbCByZWdpc3RlciAqLworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX1BIWV9TVEFULAorCQkJICAgICAoUEhZX01fUE9MQ19MUzFfUF9NSVgoNCkgfAorCQkJICAgICAgUEhZX01fUE9MQ19JUzBfUF9NSVgoNCkgfAorCQkJICAgICAgUEhZX01fUE9MQ19MT1NfQ1RSTCgyKSB8CisJCQkgICAgICBQSFlfTV9QT0xDX0lOSVRfQ1RSTCgyKSB8CisJCQkgICAgICBQSFlfTV9QT0xDX1NUQTFfQ1RSTCgyKSB8CisJCQkgICAgICBQSFlfTV9QT0xDX1NUQTBfQ1RSTCgyKSkpOworCisJCS8qIHJlc3RvcmUgcGFnZSByZWdpc3RlciAqLworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9BRFIsIHBnKTsKKwkJYnJlYWs7CisKKwljYXNlIENISVBfSURfWVVLT05fRUNfVToKKwljYXNlIENISVBfSURfWVVLT05fRVg6CisJY2FzZSBDSElQX0lEX1lVS09OX1NVUFI6CisJCXBnID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9BRFIpOworCisJCS8qIHNlbGVjdCBwYWdlIDMgdG8gYWNjZXNzIExFRCBjb250cm9sIHJlZ2lzdGVyICovCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUiwgMyk7CisKKwkJLyogc2V0IExFRCBGdW5jdGlvbiBDb250cm9sIHJlZ2lzdGVyICovCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsCisJCQkgICAgIChQSFlfTV9MRURDX0xPU19DVFJMKDEpIHwJLyogTElOSy9BQ1QgKi8KKwkJCSAgICAgIFBIWV9NX0xFRENfSU5JVF9DVFJMKDgpIHwJLyogMTAgTWJwcyAqLworCQkJICAgICAgUEhZX01fTEVEQ19TVEExX0NUUkwoNykgfAkvKiAxMDAgTWJwcyAqLworCQkJICAgICAgUEhZX01fTEVEQ19TVEEwX0NUUkwoNykpKTsvKiAxMDAwIE1icHMgKi8KKworCQkvKiBzZXQgQmxpbmsgUmF0ZSBpbiBMRUQgVGltZXIgQ29udHJvbCBSZWdpc3RlciAqLworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLAorCQkJICAgICBsZWRjdHJsIHwgUEhZX01fTEVEX0JMSU5LX1JUKEJMSU5LXzg0TVMpKTsKKwkJLyogcmVzdG9yZSBwYWdlIHJlZ2lzdGVyICovCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUiwgcGcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIHNldCBUeCBMRUQgKExFRF9UWCkgdG8gYmxpbmsgbW9kZSBvbiBSeCBPUiBUeCBhY3Rpdml0eSAqLworCQlsZWRjdHJsIHw9IFBIWV9NX0xFRF9CTElOS19SVChCTElOS184NE1TKSB8IFBIWV9NX0xFRENfVFhfQ1RSTDsKKworCQkvKiB0dXJuIG9mZiB0aGUgUnggTEVEIChMRURfUlgpICovCisJCWxlZG92ZXIgfD0gUEhZX01fTEVEX01PX1JYKE1PX0xFRF9PRkYpOworCX0KKworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9VTF8yKSB7CisJCS8qIGFwcGx5IGZpeGVzIGluIFBIWSBBRkUgKi8KKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQURSLCAyNTUpOworCisJCS8qIGluY3JlYXNlIGRpZmZlcmVudGlhbCBzaWduYWwgYW1wbGl0dWRlIGluIDEwQkFTRS1UICovCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgMHgxOCwgMHhhYTk5KTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCAweDE3LCAweDIwMTEpOworCisJCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UpIHsKKwkJCS8qIGZpeCBmb3IgSUVFRSBBL0IgU3ltbWV0cnkgZmFpbHVyZSBpbiAxMDAwQkFTRS1UICovCisJCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIDB4MTgsIDB4YTIwNCk7CisJCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIDB4MTcsIDB4MjAwMik7CisJCX0KKworCQkvKiBzZXQgcGFnZSByZWdpc3RlciB0byAwICovCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUiwgMCk7CisJfSBlbHNlIGlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0ZFX1AgJiYKKwkJICAgaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0ZFMl9BMCkgeworCQkvKiBhcHBseSB3b3JrYXJvdW5kIGZvciBpbnRlZ3JhdGVkIHJlc2lzdG9ycyBjYWxpYnJhdGlvbiAqLworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX1BBR0VfQUREUiwgMTcpOworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX1BBR0VfREFUQSwgMHgzZjYwKTsKKwl9IGVsc2UgaWYgKGh3LT5jaGlwX2lkICE9IENISVBfSURfWVVLT05fRVggJiYKKwkJICAgaHctPmNoaXBfaWQgPCBDSElQX0lEX1lVS09OX1NVUFIpIHsKKwkJLyogbm8gZWZmZWN0IG9uIFl1a29uLVhMICovCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX0NUUkwsIGxlZGN0cmwpOworCisJCWlmIChza3kyLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSB8fCBza3kyLT5zcGVlZCA9PSBTUEVFRF8xMDApIHsKKwkJCS8qIHR1cm4gb24gMTAwIE1icHMgTEVEIChMRURfTElOSzEwMCkgKi8KKwkJCWxlZG92ZXIgfD0gUEhZX01fTEVEX01PXzEwMChNT19MRURfT04pOworCQl9CisKKwkJaWYgKGxlZG92ZXIpCisJCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9PVkVSLCBsZWRvdmVyKTsKKworCX0KKworCS8qIEVuYWJsZSBwaHkgaW50ZXJydXB0IG9uIGF1dG8tbmVnb3RpYXRpb24gY29tcGxldGUgKG9yIGxpbmsgdXApICovCisJaWYgKHNreTItPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIFBIWV9NX0lTX0FOX0NPTVBMKTsKKwllbHNlCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIFBIWV9NX0RFRl9NU0spOworfQorCitzdGF0aWMgY29uc3QgdTMyIHBoeV9wb3dlcltdID0geyBQQ0lfWTJfUEhZMV9QT1dELCBQQ0lfWTJfUEhZMl9QT1dEIH07CitzdGF0aWMgY29uc3QgdTMyIGNvbWFfbW9kZVtdID0geyBQQ0lfWTJfUEhZMV9DT01BLCBQQ0lfWTJfUEhZMl9DT01BIH07CisKK3N0YXRpYyB2b2lkIHNreTJfcGh5X3Bvd2VyX3VwKHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcG9ydCkKK3sKKwl1MzIgcmVnMTsKKworCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOworCXJlZzEgPSBza3kyX3BjaV9yZWFkMzIoaHcsIFBDSV9ERVZfUkVHMSk7CisJcmVnMSAmPSB+cGh5X3Bvd2VyW3BvcnRdOworCisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fWEwgJiYgaHctPmNoaXBfcmV2ID4gMSkKKwkJcmVnMSB8PSBjb21hX21vZGVbcG9ydF07CisKKwlza3kyX3BjaV93cml0ZTMyKGh3LCBQQ0lfREVWX1JFRzEsIHJlZzEpOworCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKKwlza3kyX3BjaV9yZWFkMzIoaHcsIFBDSV9ERVZfUkVHMSk7CisKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9GRSkKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9DVFJMLCBQSFlfQ1RfQU5FKTsKKwllbHNlIGlmIChody0+ZmxhZ3MgJiBTS1kyX0hXX0FEVl9QT1dFUl9DVEwpCisJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR1BIWV9DVFJMKSwgR1BDX1JTVF9DTFIpOworfQorCitzdGF0aWMgdm9pZCBza3kyX3BoeV9wb3dlcl9kb3duKHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcG9ydCkKK3sKKwl1MzIgcmVnMTsKKwl1MTYgY3RybDsKKworCS8qIHJlbGVhc2UgR1BIWSBDb250cm9sIHJlc2V0ICovCisJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHUEhZX0NUUkwpLCBHUENfUlNUX0NMUik7CisKKwkvKiByZWxlYXNlIEdNQUMgcmVzZXQgKi8KKwlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19SU1RfQ0xSKTsKKworCWlmIChody0+ZmxhZ3MgJiBTS1kyX0hXX05FV0VSX1BIWSkgeworCQkvKiBzZWxlY3QgcGFnZSAyIHRvIGFjY2VzcyBNQUMgY29udHJvbCByZWdpc3RlciAqLworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9BRFIsIDIpOworCisJCWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfUEhZX0NUUkwpOworCQkvKiBhbGxvdyBHTUlJIFBvd2VyIERvd24gKi8KKwkJY3RybCAmPSB+UEhZX01fTUFDX0dNSUZfUFVQOworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCBjdHJsKTsKKworCQkvKiBzZXQgcGFnZSByZWdpc3RlciBiYWNrIHRvIDAgKi8KKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQURSLCAwKTsKKwl9CisKKwkvKiBzZXR1cCBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlciAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLAorCQkgICAgR01fR1BDUl9GTF9QQVNTIHwgR01fR1BDUl9TUEVFRF8xMDAgfCBHTV9HUENSX0FVX0FMTF9ESVMpOworCisJaWYgKGh3LT5jaGlwX2lkICE9IENISVBfSURfWVVLT05fRUMpIHsKKwkJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVSkgeworCQkJLyogc2VsZWN0IHBhZ2UgMiB0byBhY2Nlc3MgTUFDIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUiwgMik7CisKKwkJCWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfUEhZX0NUUkwpOworCQkJLyogZW5hYmxlIFBvd2VyIERvd24gKi8KKwkJCWN0cmwgfD0gUEhZX01fUENfUE9XX0RfRU5BOworCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgY3RybCk7CisKKwkJCS8qIHNldCBwYWdlIHJlZ2lzdGVyIGJhY2sgdG8gMCAqLworCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQURSLCAwKTsKKwkJfQorCisJCS8qIHNldCBJRUVFIGNvbXBhdGlibGUgUG93ZXIgRG93biBNb2RlIChkZXYuICM0Ljk5KSAqLworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0NUUkwsIFBIWV9DVF9QRE9XTik7CisJfQorCisJc2t5Ml93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisJcmVnMSA9IHNreTJfcGNpX3JlYWQzMihodywgUENJX0RFVl9SRUcxKTsKKwlyZWcxIHw9IHBoeV9wb3dlcltwb3J0XTsJCS8qIHNldCBQSFkgdG8gUG93ZXJEb3duL0NPTUEgTW9kZSAqLworCXNreTJfcGNpX3dyaXRlMzIoaHcsIFBDSV9ERVZfUkVHMSwgcmVnMSk7CisJc2t5Ml93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOworfQorCitzdGF0aWMgdm9pZCBza3kyX3NldF90eF9zdGZ3ZChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHBvcnQpCit7CisJaWYgKCAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FWCAmJgorCSAgICAgIGh3LT5jaGlwX3JldiAhPSBDSElQX1JFVl9ZVV9FWF9BMCkgfHwKKwkgICAgIGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRkVfUCB8fAorCSAgICAgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9TVVBSKSB7CisJCS8qIGRpc2FibGUganVtYm8gZnJhbWVzIG9uIGRldmljZXMgdGhhdCBzdXBwb3J0IHRoZW0gKi8KKwkJc2t5Ml93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksCisJCQkgICAgIFRYX0pVTUJPX0RJUyB8IFRYX1NURldfRU5BKTsKKwl9IGVsc2UgeworCQlza3kyX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgVFhfU1RGV19FTkEpOworCX0KK30KKworc3RhdGljIHZvaWQgc2t5Ml9tYWNfaW5pdChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHBvcnQpCit7CisJdTE2IHJlZzsKKwl1MzIgcnhfcmVnOworCWludCBpOworCWNvbnN0IHU4ICphZGRyID0gaHctPmRldltwb3J0XS0+bGxfYWRkcjsKKworCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR1BIWV9DVFJMKSwgR1BDX1JTVF9TRVQpOworCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR1BIWV9DVFJMKSwgR1BDX1JTVF9DTFIpOworCisJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUlNUX0NMUik7CisKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCAmJiBody0+Y2hpcF9yZXYgPT0gMCAmJiBwb3J0ID09IDEpIHsKKwkJLyogV0EgREVWXzQ3MiAtLSBsb29rcyBsaWtlIGNyb3NzZWQgd2lyZXMgb24gcG9ydCAyICovCisJCS8qIGNsZWFyIEdNQUMgMSBDb250cm9sIHJlc2V0ICovCisJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcoMCwgR01BQ19DVFJMKSwgR01DX1JTVF9DTFIpOworCQlkbyB7CisJCQlza3kyX3dyaXRlOChodywgU0tfUkVHKDEsIEdNQUNfQ1RSTCksIEdNQ19SU1RfU0VUKTsKKwkJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcoMSwgR01BQ19DVFJMKSwgR01DX1JTVF9DTFIpOworCQl9IHdoaWxlIChnbV9waHlfcmVhZChodywgMSwgUEhZX01BUlZfSUQwKSAhPSBQSFlfTUFSVl9JRDBfVkFMIHx8CisJCQkgZ21fcGh5X3JlYWQoaHcsIDEsIFBIWV9NQVJWX0lEMSkgIT0gUEhZX01BUlZfSUQxX1kyIHx8CisJCQkgZ21fcGh5X3JlYWQoaHcsIDEsIFBIWV9NQVJWX0lOVF9NQVNLKSAhPSAwKTsKKwl9CisKKwlza3kyX3JlYWQxNihodywgU0tfUkVHKHBvcnQsIEdNQUNfSVJRX1NSQykpOworCisJLyogRW5hYmxlIFRyYW5zbWl0IEZJRk8gVW5kZXJydW4gKi8KKwlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfSVJRX01TSyksIEdNQUNfREVGX01TSyk7CisKKwlza3kyX3BoeV9wb3dlcl91cChodywgcG9ydCk7CisJc2t5Ml9waHlfaW5pdChodywgcG9ydCk7CisKKwkvKiBNSUIgY2xlYXIgKi8KKwlyZWcgPSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9QSFlfQUREUik7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1BIWV9BRERSLCByZWcgfCBHTV9QQVJfTUlCX0NMUik7CisKKwlmb3IgKGkgPSBHTV9NSUJfQ05UX0JBU0U7IGkgPD0gR01fTUlCX0NOVF9FTkQ7IGkgKz0gNCkKKwkJZ21hX3JlYWQxNihodywgcG9ydCwgaSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1BIWV9BRERSLCByZWcpOworCisJLyogdHJhbnNtaXQgY29udHJvbCAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9DVFJMLCBUWF9DT0xfVEhSKFRYX0NPTF9ERUYpKTsKKworCS8qIHJlY2VpdmUgY29udHJvbCByZWc6IHVuaWNhc3QgKyBtdWx0aWNhc3QgKyBubyBGQ1MgICovCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsCisJCSAgICBHTV9SWENSX1VDRl9FTkEgfCBHTV9SWENSX0NSQ19ESVMgfCBHTV9SWENSX01DRl9FTkEpOworCisJLyogdHJhbnNtaXQgZmxvdyBjb250cm9sICovCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1RYX0ZMT1dfQ1RSTCwgMHhmZmZmKTsKKworCS8qIHRyYW5zbWl0IHBhcmFtZXRlciAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9QQVJBTSwKKwkJICAgIFRYX0pBTV9MRU5fVkFMKFRYX0pBTV9MRU5fREVGKSB8CisJCSAgICBUWF9KQU1fSVBHX1ZBTChUWF9KQU1fSVBHX0RFRikgfAorCQkgICAgVFhfSVBHX0pBTV9EQVRBKFRYX0lQR19KQU1fREVGKSB8CisJCSAgICBUWF9CQUNLX09GRl9MSU0oVFhfQk9GX0xJTV9ERUYpKTsKKworCS8qIHNlcmlhbCBtb2RlIHJlZ2lzdGVyICovCisJcmVnID0gREFUQV9CTElORF9WQUwoREFUQV9CTElORF9ERUYpIHwKKwkJR01fU01PRF9WTEFOX0VOQSB8IElQR19EQVRBX1ZBTChJUEdfREFUQV9ERUYpOworCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1NFUklBTF9NT0RFLCByZWcpOworCisJLyogdmlydHVhbCBhZGRyZXNzIGZvciBkYXRhICovCisJZ21hX3NldF9hZGRyKGh3LCBwb3J0LCBHTV9TUkNfQUREUl8yTCwgYWRkcik7CisKKwkvKiBwaHlzaWNhbCBhZGRyZXNzOiB1c2VkIGZvciBwYXVzZSBmcmFtZXMgKi8KKwlnbWFfc2V0X2FkZHIoaHcsIHBvcnQsIEdNX1NSQ19BRERSXzFMLCBhZGRyKTsKKworCS8qIGlnbm9yZSBjb3VudGVyIG92ZXJmbG93cyAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9JUlFfTVNLLCAwKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fUlhfSVJRX01TSywgMCk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1RSX0lSUV9NU0ssIDApOworCisJLyogQ29uZmlndXJlIFJ4IE1BQyBGSUZPICovCisJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9DTFIpOworCXJ4X3JlZyA9IEdNRl9PUEVSX09OIHwgR01GX1JYX0ZfRkxfT047CisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRVggfHwKKwkgICAgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9GRV9QKQorCQlyeF9yZWcgfD0gR01GX1JYX09WRVJfT047CisKKwlza3kyX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgcnhfcmVnKTsKKworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX1hMKSB7CisJCS8qIEhhcmR3YXJlIGVycmF0YSAtIGNsZWFyIGZsdXNoIG1hc2sgKi8KKwkJc2t5Ml93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0ZMX01TSyksIDApOworCX0gZWxzZSB7CisJCS8qIEZsdXNoIFJ4IE1BQyBGSUZPIG9uIGFueSBmbG93IGNvbnRyb2wgb3IgZXJyb3IgKi8KKwkJc2t5Ml93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0ZMX01TSyksIEdNUl9GU19BTllfRVJSKTsKKwl9CisKKwkvKiBTZXQgdGhyZXNob2xkIHRvIDB4YSAoNjQgYnl0ZXMpICsgMSB0byB3b3JrYXJvdW5kIHBhdXNlIGJ1ZyAgKi8KKwlyZWcgPSBSWF9HTUZfRkxfVEhSX0RFRiArIDE7CisJLyogQW5vdGhlciBtYWdpYyBteXN0ZXJ5IHdvcmthcm91bmQgZnJvbSBzazk4bGluICovCisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRkVfUCAmJgorCSAgICBody0+Y2hpcF9yZXYgPT0gQ0hJUF9SRVZfWVVfRkUyX0EwKQorCQlyZWcgPSAweDE3ODsKKwlza3kyX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfRkxfVEhSKSwgcmVnKTsKKworCS8qIENvbmZpZ3VyZSBUeCBNQUMgRklGTyAqLworCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksIEdNRl9SU1RfQ0xSKTsKKwlza3kyX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX09QRVJfT04pOworCisJLyogT24gY2hpcHMgd2l0aG91dCByYW0gYnVmZmVyLCBwYXVzZSBpcyBjb250cm9sZWQgYnkgTUFDIGxldmVsICovCisJaWYgKCEoaHctPmZsYWdzICYgU0tZMl9IV19SQU1fQlVGRkVSKSkgeworCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9MUF9USFIpLCA3NjgvOCk7CisJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX1VQX1RIUiksIDEwMjQvOCk7CisKKwkJc2t5Ml9zZXRfdHhfc3Rmd2QoaHcsIHBvcnQpOworCX0KKworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0ZFX1AgJiYKKwkgICAgaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0ZFMl9BMCkgeworCQkvKiBkaXNhYmxlIGR5bmFtaWMgd2F0ZXJtYXJrICovCisJCXJlZyA9IHNreTJfcmVhZDE2KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0VBKSk7CisJCXJlZyAmPSB+VFhfRFlOX1dNX0VOQTsKKwkJc2t5Ml93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0VBKSwgcmVnKTsKKwl9Cit9CisKKy8qIEFzc2lnbiBSYW0gQnVmZmVyIGFsbG9jYXRpb24gdG8gcXVldWUgKi8KK3N0YXRpYyB2b2lkIHNreTJfcmFtc2V0KHN0cnVjdCBza3kyX2h3ICpodywgdTE2IHEsIHUzMiBzdGFydCwgdTMyIHNwYWNlKQoreworCXUzMiBlbmQ7CisKKwkvKiBjb252ZXJ0IGZyb20gSyBieXRlcyB0byBxd29yZHMgdXNlZCBmb3IgaHcgcmVnaXN0ZXIgKi8KKwlzdGFydCAqPSAxMDI0Lzg7CisJc3BhY2UgKj0gMTAyNC84OworCWVuZCA9IHN0YXJ0ICsgc3BhY2UgLSAxOworCisJc2t5Ml93cml0ZTgoaHcsIFJCX0FERFIocSwgUkJfQ1RSTCksIFJCX1JTVF9DTFIpOworCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9TVEFSVCksIHN0YXJ0KTsKKwlza3kyX3dyaXRlMzIoaHcsIFJCX0FERFIocSwgUkJfRU5EKSwgZW5kKTsKKwlza3kyX3dyaXRlMzIoaHcsIFJCX0FERFIocSwgUkJfV1ApLCBzdGFydCk7CisJc2t5Ml93cml0ZTMyKGh3LCBSQl9BRERSKHEsIFJCX1JQKSwgc3RhcnQpOworCisJaWYgKHEgPT0gUV9SMSB8fCBxID09IFFfUjIpIHsKKwkJdTMyIHRwID0gc3BhY2UgLSBzcGFjZS80OworCisJCS8qIE9uIHJlY2VpdmUgcXVldWUncyBzZXQgdGhlIHRocmVzaG9sZHMKKwkJICogZ2l2ZSByZWNlaXZlciBwcmlvcml0eSB3aGVuID4gMy80IGZ1bGwKKwkJICogc2VuZCBwYXVzZSB3aGVuIGRvd24gdG8gMksKKwkJICovCisJCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9SWF9VVEhQKSwgdHApOworCQlza3kyX3dyaXRlMzIoaHcsIFJCX0FERFIocSwgUkJfUlhfTFRIUCksIHNwYWNlLzIpOworCisJCXRwID0gc3BhY2UgLSAyMDQ4Lzg7CisJCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9SWF9VVFBQKSwgdHApOworCQlza3kyX3dyaXRlMzIoaHcsIFJCX0FERFIocSwgUkJfUlhfTFRQUCksIHNwYWNlLzQpOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBzdG9yZSAmIGZvcndhcmQgb24gVHggcXVldWUncyBiZWNhdXNlCisJCSAqIFR4IEZJRk8gaXMgb25seSAxSyBvbiBZdWtvbgorCQkgKi8KKwkJc2t5Ml93cml0ZTgoaHcsIFJCX0FERFIocSwgUkJfQ1RSTCksIFJCX0VOQV9TVEZXRCk7CisJfQorCisJc2t5Ml93cml0ZTgoaHcsIFJCX0FERFIocSwgUkJfQ1RSTCksIFJCX0VOQV9PUF9NRCk7CisJc2t5Ml9yZWFkOChodywgUkJfQUREUihxLCBSQl9DVFJMKSk7Cit9CisKKy8qIFNldHVwIEJ1cyBNZW1vcnkgSW50ZXJmYWNlICovCitzdGF0aWMgdm9pZCBza3kyX3FzZXQoc3RydWN0IHNreTJfaHcgKmh3LCB1MTYgcSkKK3sKKwlza3kyX3dyaXRlMzIoaHcsIFFfQUREUihxLCBRX0NTUiksIEJNVV9DTFJfUkVTRVQpOworCXNreTJfd3JpdGUzMihodywgUV9BRERSKHEsIFFfQ1NSKSwgQk1VX09QRVJfSU5JVCk7CisJc2t5Ml93cml0ZTMyKGh3LCBRX0FERFIocSwgUV9DU1IpLCBCTVVfRklGT19PUF9PTik7CisJc2t5Ml93cml0ZTMyKGh3LCBRX0FERFIocSwgUV9XTSksICBCTVVfV01fREVGQVVMVCk7Cit9CisKKy8qIFNldHVwIHByZWZldGNoIHVuaXQgcmVnaXN0ZXJzLiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbgorICogaGFyZHdhcmUgYW5kIGRyaXZlciBsaXN0IGVsZW1lbnRzCisgKi8KK3N0YXRpYyB2b2lkIHNreTJfcHJlZmV0Y2hfaW5pdChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHUzMiBxYWRkciwKKwkJCQkgICAgICB1NjQgYWRkciwgdTMyIGxhc3QpCit7CisJc2t5Ml93cml0ZTMyKGh3LCBZMl9RQUREUihxYWRkciwgUFJFRl9VTklUX0NUUkwpLCBQUkVGX1VOSVRfUlNUX1NFVCk7CisJc2t5Ml93cml0ZTMyKGh3LCBZMl9RQUREUihxYWRkciwgUFJFRl9VTklUX0NUUkwpLCBQUkVGX1VOSVRfUlNUX0NMUik7CisJc2t5Ml93cml0ZTMyKGh3LCBZMl9RQUREUihxYWRkciwgUFJFRl9VTklUX0FERFJfSEkpLCBhZGRyID4+IDMyKTsKKwlza3kyX3dyaXRlMzIoaHcsIFkyX1FBRERSKHFhZGRyLCBQUkVGX1VOSVRfQUREUl9MTyksICh1MzIpIGFkZHIpOworCXNreTJfd3JpdGUxNihodywgWTJfUUFERFIocWFkZHIsIFBSRUZfVU5JVF9MQVNUX0lEWCksIGxhc3QpOworCXNreTJfd3JpdGUzMihodywgWTJfUUFERFIocWFkZHIsIFBSRUZfVU5JVF9DVFJMKSwgUFJFRl9VTklUX09QX09OKTsKKworCXNreTJfcmVhZDMyKGh3LCBZMl9RQUREUihxYWRkciwgUFJFRl9VTklUX0NUUkwpKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2t5Ml90eF9sZSAqZ2V0X3R4X2xlKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCit7CisJc3RydWN0IHNreTJfdHhfbGUgKmxlID0gc2t5Mi0+dHhfbGUgKyBza3kyLT50eF9wcm9kOworCisJc2t5Mi0+dHhfcHJvZCA9IFJJTkdfTkVYVChza3kyLT50eF9wcm9kLCBUWF9SSU5HX1NJWkUpOworCWxlLT5jdHJsID0gMDsKKwlyZXR1cm4gbGU7Cit9CisKK3N0YXRpYyB2b2lkIHR4X2luaXQoc3RydWN0IHNreTJfcG9ydCAqc2t5MikKK3sKKwlzdHJ1Y3Qgc2t5Ml90eF9sZSAqbGU7CisKKwlza3kyLT50eF9wcm9kID0gc2t5Mi0+dHhfY29ucyA9IDA7CisKKwlsZSA9IGdldF90eF9sZShza3kyKTsKKwlsZS0+YWRkciA9IDA7CisJbGUtPm9wY29kZSA9IE9QX0FERFI2NCB8IEhXX09XTkVSOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0eF9yaW5nX2luZm8gKnR4X2xlX3JlKHN0cnVjdCBza3kyX3BvcnQgKnNreTIsCisJCQkJCSAgICBzdHJ1Y3Qgc2t5Ml90eF9sZSAqbGUpCit7CisJcmV0dXJuIHNreTItPnR4X3JpbmcgKyAobGUgLSBza3kyLT50eF9sZSk7Cit9CisKKy8qIFVwZGF0ZSBjaGlwJ3MgbmV4dCBwb2ludGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2t5Ml9wdXRfaWR4KHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcSwgdTE2IGlkeCkKK3sKKwkvKiBNYWtlIHN1cmUgd3JpdGUnIHRvIGRlc2NyaXB0b3JzIGFyZSBjb21wbGV0ZSBiZWZvcmUgd2UgdGVsbCBoYXJkd2FyZSAqLworCXdtYigpOworCXNreTJfd3JpdGUxNihodywgWTJfUUFERFIocSwgUFJFRl9VTklUX1BVVF9JRFgpLCBpZHgpOworCURCR0lPKFBGWCAicXVldWUgJSN4IGlkeCA8LSAlZFxuIiwgcSwgaWR4KTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza3kyX3J4X2xlICpza3kyX25leHRfcngoc3RydWN0IHNreTJfcG9ydCAqc2t5MikKK3sKKwlzdHJ1Y3Qgc2t5Ml9yeF9sZSAqbGUgPSBza3kyLT5yeF9sZSArIHNreTItPnJ4X3B1dDsKKworCXNreTItPnJ4X3B1dCA9IFJJTkdfTkVYVChza3kyLT5yeF9wdXQsIFJYX0xFX1NJWkUpOworCWxlLT5jdHJsID0gMDsKKwlyZXR1cm4gbGU7Cit9CisKKy8qIEJ1aWxkIGRlc2NyaXB0aW9uIHRvIGhhcmR3YXJlIGZvciBvbmUgcmVjZWl2ZSBzZWdtZW50ICovCitzdGF0aWMgdm9pZCBza3kyX3J4X2FkZChzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyLCAgdTggb3AsCisJCQl1MzIgbWFwLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHNreTJfcnhfbGUgKmxlOworCisJbGUgPSBza3kyX25leHRfcngoc2t5Mik7CisJbGUtPmFkZHIgPSBjcHVfdG9fbGUzMihtYXApOworCWxlLT5sZW5ndGggPSBjcHVfdG9fbGUxNihsZW4pOworCWxlLT5vcGNvZGUgPSBvcCB8IEhXX09XTkVSOworfQorCisvKiBCdWlsZCBkZXNjcmlwdGlvbiB0byBoYXJkd2FyZSBmb3Igb25lIHBvc3NpYmx5IGZyYWdtZW50ZWQgc2tiICovCitzdGF0aWMgdm9pZCBza3kyX3J4X3N1Ym1pdChzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyLAorCQkJICAgY29uc3Qgc3RydWN0IHJ4X3JpbmdfaW5mbyAqcmUpCit7CisJc2t5Ml9yeF9hZGQoc2t5MiwgT1BfUEFDS0VULCByZS0+ZGF0YV9hZGRyLCBza3kyLT5yeF9kYXRhX3NpemUpOworfQorCisKK3N0YXRpYyB2b2lkIHNreTJfcnhfbWFwX2lvYihzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiBfX3VudXNlZCwKKwkJCSAgICBzdHJ1Y3QgcnhfcmluZ19pbmZvICpyZSwKKwkJCSAgICB1bnNpZ25lZCBzaXplIF9fdW51c2VkKQoreworCXN0cnVjdCBpb19idWZmZXIgKmlvYiA9IHJlLT5pb2I7CisJcmUtPmRhdGFfYWRkciA9IHZpcnRfdG9fYnVzKGlvYi0+ZGF0YSk7Cit9CisKKy8qIERpYWJsZSB0aGUgY2hlY2tzdW0gb2ZmbG9hZGluZy4KKyAqLworc3RhdGljIHZvaWQgcnhfc2V0X2NoZWNrc3VtKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCit7CisJc3RydWN0IHNreTJfcnhfbGUgKmxlID0gc2t5Ml9uZXh0X3J4KHNreTIpOworCisJbGUtPmFkZHIgPSBjcHVfdG9fbGUzMigoRVRIX0hMRU4gPDwgMTYpIHwgRVRIX0hMRU4pOworCWxlLT5jdHJsID0gMDsKKwlsZS0+b3Bjb2RlID0gT1BfVENQU1RBUlQgfCBIV19PV05FUjsKKworCXNreTJfd3JpdGUzMihza3kyLT5odywKKwkJICAgICBRX0FERFIocnhxYWRkcltza3kyLT5wb3J0XSwgUV9DU1IpLAorCQkgICAgIEJNVV9ESVNfUlhfQ0hLU1VNKTsKK30KKworLyoKKyAqIFRoZSBSWCBTdG9wIGNvbW1hbmQgd2lsbCBub3Qgd29yayBmb3IgWXVrb24tMiBpZiB0aGUgQk1VIGRvZXMgbm90CisgKiByZWFjaCB0aGUgZW5kIG9mIHBhY2tldCBhbmQgc2luY2Ugd2UgY2FuJ3QgbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZQorICogaW5jb21pbmcgZGF0YSwgd2UgbXVzdCByZXNldCB0aGUgQk1VIHdoaWxlIGl0IGlzIG5vdCBkb2luZyBhIERNQQorICogdHJhbnNmZXIuIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIFJYIHBhdGggaXMgc3RpbGwgYWN0aXZlLAorICogdGhlIFJYIFJBTSBidWZmZXIgd2lsbCBiZSBzdG9wcGVkIGZpcnN0LCBzbyBhbnkgcG9zc2libGUgaW5jb21pbmcKKyAqIGRhdGEgd2lsbCBub3QgdHJpZ2dlciBhIERNQS4gQWZ0ZXIgdGhlIFJBTSBidWZmZXIgaXMgc3RvcHBlZCwgdGhlCisgKiBCTVUgaXMgcG9sbGVkIHVudGlsIGFueSBETUEgaW4gcHJvZ3Jlc3MgaXMgZW5kZWQgYW5kIG9ubHkgdGhlbiBpdAorICogd2lsbCBiZSByZXNldC4KKyAqLworc3RhdGljIHZvaWQgc2t5Ml9yeF9zdG9wKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCit7CisJc3RydWN0IHNreTJfaHcgKmh3ID0gc2t5Mi0+aHc7CisJdW5zaWduZWQgcnhxID0gcnhxYWRkcltza3kyLT5wb3J0XTsKKwlpbnQgaTsKKworCS8qIGRpc2FibGUgdGhlIFJBTSBCdWZmZXIgcmVjZWl2ZSBxdWV1ZSAqLworCXNreTJfd3JpdGU4KGh3LCBSQl9BRERSKHJ4cSwgUkJfQ1RSTCksIFJCX0RJU19PUF9NRCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHhmZmZmOyBpKyspCisJCWlmIChza3kyX3JlYWQ4KGh3LCBSQl9BRERSKHJ4cSwgUV9SU0wpKQorCQkgICAgPT0gc2t5Ml9yZWFkOChodywgUkJfQUREUihyeHEsIFFfUkwpKSkKKwkJCWdvdG8gc3RvcHBlZDsKKworCURCRyhQRlggIiVzOiByZWNlaXZlciBzdG9wIGZhaWxlZFxuIiwgc2t5Mi0+bmV0ZGV2LT5uYW1lKTsKK3N0b3BwZWQ6CisJc2t5Ml93cml0ZTMyKGh3LCBRX0FERFIocnhxLCBRX0NTUiksIEJNVV9SU1RfU0VUIHwgQk1VX0ZJRk9fUlNUKTsKKworCS8qIHJlc2V0IHRoZSBSeCBwcmVmZXRjaCB1bml0ICovCisJc2t5Ml93cml0ZTMyKGh3LCBZMl9RQUREUihyeHEsIFBSRUZfVU5JVF9DVFJMKSwgUFJFRl9VTklUX1JTVF9TRVQpOworCXdtYigpOworfQorCisvKiBDbGVhbiBvdXQgcmVjZWl2ZSBidWZmZXIgYXJlYSwgYXNzdW1lcyByZWNlaXZlciBoYXJkd2FyZSBzdG9wcGVkICovCitzdGF0aWMgdm9pZCBza3kyX3J4X2NsZWFuKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCit7CisJdW5zaWduZWQgaTsKKworCW1lbXNldChza3kyLT5yeF9sZSwgMCwgUlhfTEVfQllURVMpOworCWZvciAoaSA9IDA7IGkgPCBSWF9QRU5ESU5HOyBpKyspIHsKKwkJc3RydWN0IHJ4X3JpbmdfaW5mbyAqcmUgPSBza3kyLT5yeF9yaW5nICsgaTsKKworCQlpZiAocmUtPmlvYikgeworCQkJZnJlZV9pb2IocmUtPmlvYik7CisJCQlyZS0+aW9iID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoKKyAqIEFsbG9jYXRlIGFuIGlvYiBmb3IgcmVjZWl2aW5nLgorICovCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqc2t5Ml9yeF9hbGxvYyhzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyKQoreworCXN0cnVjdCBpb19idWZmZXIgKmlvYjsKKworCWlvYiA9IGFsbG9jX2lvYihza3kyLT5yeF9kYXRhX3NpemUgKyBFVEhfREFUQV9BTElHTik7CisJaWYgKCFpb2IpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBDYXJkcyB3aXRoIGEgUkFNIGJ1ZmZlciBoYW5nIGluIHRoZSByeCBGSUZPIGlmIHRoZQorCSAqIHJlY2VpdmUgYnVmZmVyIGlzbid0IGFsaWduZWQgdG8gKExpbnV4IG1vZHVsZSBjb21tZW50cyBzYXkKKwkgKiA2NCBieXRlcywgTGludXggbW9kdWxlIGNvZGUgc2F5cyA4IGJ5dGVzKS4gU2luY2UgaW9fYnVmZmVycworCSAqIGFyZSBhbHdheXMgMmtiLWFsaWduZWQgdW5kZXIgZ1BYRSwganVzdCBsZWF2ZSBpdCBiZQorCSAqIHdpdGhvdXQgRVRIX0RBVEFfQUxJR04gaW4gdGhvc2UgY2FzZXMuCisJICoKKwkgKiBYWFggVGhpcyBjYXVzZXMgdW5hbGlnbmVkIGFjY2VzcyB0byB0aGUgSVAgaGVhZGVyLAorCSAqIHdoaWNoIGlzIHVuZGVzaXJhYmxlLCBidXQgaXQncyBsZXNzIHVuZGVzaXJhYmxlIHRoYW4gdGhlCisJICogY2FyZCBoYW5naW5nLgorCSAqLworCWlmICghKHNreTItPmh3LT5mbGFncyAmIFNLWTJfSFdfUkFNX0JVRkZFUikpIHsKKwkJaW9iX3Jlc2VydmUoaW9iLCBFVEhfREFUQV9BTElHTik7CisJfQorCisJcmV0dXJuIGlvYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNreTJfcnhfdXBkYXRlKHN0cnVjdCBza3kyX3BvcnQgKnNreTIsIHVuc2lnbmVkIHJ4cSkKK3sKKwlza3kyX3B1dF9pZHgoc2t5Mi0+aHcsIHJ4cSwgc2t5Mi0+cnhfcHV0KTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuZCBzZXR1cCByZWNlaXZlciBidWZmZXIgcG9vbC4KKyAqIE5vcm1hbCBjYXNlIHRoaXMgZW5kcyB1cCBjcmVhdGluZyBvbmUgbGlzdCBlbGVtZW50IGZvciBza2IKKyAqIGluIHRoZSByZWNlaXZlIHJpbmcuIE9uZSBlbGVtZW50IGlzIHVzZWQgZm9yIGNoZWNrc3VtCisgKiBlbmFibGUvZGlzYWJsZSwgYW5kIG9uZSBleHRyYSB0byBhdm9pZCB3cmFwLgorICovCitzdGF0aWMgaW50IHNreTJfcnhfc3RhcnQoc3RydWN0IHNreTJfcG9ydCAqc2t5MikKK3sKKwlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBza3kyLT5odzsKKwlzdHJ1Y3QgcnhfcmluZ19pbmZvICpyZTsKKwl1bnNpZ25lZCByeHEgPSByeHFhZGRyW3NreTItPnBvcnRdOworCXVuc2lnbmVkIGksIHNpemUsIHRocmVzaDsKKworCXNreTItPnJ4X3B1dCA9IHNreTItPnJ4X25leHQgPSAwOworCXNreTJfcXNldChodywgcnhxKTsKKworCS8qIE9uIFBDSSBleHByZXNzIGxvd2VyaW5nIHRoZSB3YXRlcm1hcmsgZ2l2ZXMgYmV0dGVyIHBlcmZvcm1hbmNlICovCisJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaHctPnBkZXYsIFBDSV9DQVBfSURfRVhQKSkKKwkJc2t5Ml93cml0ZTMyKGh3LCBRX0FERFIocnhxLCBRX1dNKSwgQk1VX1dNX1BFWCk7CisKKwkvKiBUaGVzZSBjaGlwcyBoYXZlIG5vIHJhbSBidWZmZXI/CisJICogTUFDIFJ4IFJBTSBSZWFkIGlzIGNvbnRyb2xsZWQgYnkgaGFyZHdhcmUgKi8KKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VICYmCisJICAgIChody0+Y2hpcF9yZXYgPT0gQ0hJUF9SRVZfWVVfRUNfVV9BMQorCSAgICAgfHwgaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0VDX1VfQjApKQorCQlza3kyX3dyaXRlMzIoaHcsIFFfQUREUihyeHEsIFFfVEVTVCksIEZfTV9SWF9SQU1fRElTKTsKKworCXNreTJfcHJlZmV0Y2hfaW5pdChodywgcnhxLCBza3kyLT5yeF9sZV9tYXAsIFJYX0xFX1NJWkUgLSAxKTsKKworCWlmICghKGh3LT5mbGFncyAmIFNLWTJfSFdfTkVXX0xFKSkKKwkJcnhfc2V0X2NoZWNrc3VtKHNreTIpOworCisJLyogU3BhY2UgbmVlZGVkIGZvciBmcmFtZSBkYXRhICsgaGVhZGVycyByb3VuZGVkIHVwICovCisJc2l6ZSA9IChFVEhfRlJBTUVfTEVOICsgOCkgJiB+NzsKKworCS8qIFN0b3BwaW5nIHBvaW50IGZvciBoYXJkd2FyZSB0cnVuY2F0aW9uICovCisJdGhyZXNoID0gKHNpemUgLSA4KSAvIHNpemVvZih1MzIpOworCisJc2t5Mi0+cnhfZGF0YV9zaXplID0gc2l6ZTsKKworCS8qIEZpbGwgUnggcmluZyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9QRU5ESU5HOyBpKyspIHsKKwkJcmUgPSBza3kyLT5yeF9yaW5nICsgaTsKKworCQlyZS0+aW9iID0gc2t5Ml9yeF9hbGxvYyhza3kyKTsKKwkJaWYgKCFyZS0+aW9iKQorCQkJZ290byBub21lbTsKKworCQlza3kyX3J4X21hcF9pb2IoaHctPnBkZXYsIHJlLCBza3kyLT5yeF9kYXRhX3NpemUpOworCQlza3kyX3J4X3N1Ym1pdChza3kyLCByZSk7CisJfQorCisJLyoKKwkgKiBUaGUgcmVjZWl2ZXIgaGFuZ3MgaWYgaXQgcmVjZWl2ZXMgZnJhbWVzIGxhcmdlciB0aGFuIHRoZQorCSAqIHBhY2tldCBidWZmZXIuIEFzIGEgd29ya2Fyb3VuZCwgdHJ1bmNhdGUgb3ZlcnNpemUgZnJhbWVzLCBidXQKKwkgKiB0aGUgcmVnaXN0ZXIgaXMgbGltaXRlZCB0byA5IGJpdHMsIHNvIGlmIHlvdSBkbyBmcmFtZXMgPiAyMDUyCisJICogeW91IGJldHRlciBnZXQgdGhlIE1UVSByaWdodCEKKwkgKi8KKwlpZiAodGhyZXNoID4gMHgxZmYpCisJCXNreTJfd3JpdGUzMihodywgU0tfUkVHKHNreTItPnBvcnQsIFJYX0dNRl9DVFJMX1QpLCBSWF9UUlVOQ19PRkYpOworCWVsc2UgeworCQlza3kyX3dyaXRlMTYoaHcsIFNLX1JFRyhza3kyLT5wb3J0LCBSWF9HTUZfVFJfVEhSKSwgdGhyZXNoKTsKKwkJc2t5Ml93cml0ZTMyKGh3LCBTS19SRUcoc2t5Mi0+cG9ydCwgUlhfR01GX0NUUkxfVCksIFJYX1RSVU5DX09OKTsKKwl9CisKKwkvKiBUZWxsIGNoaXAgYWJvdXQgYXZhaWxhYmxlIGJ1ZmZlcnMgKi8KKwlza3kyX3J4X3VwZGF0ZShza3kyLCByeHEpOworCXJldHVybiAwOworbm9tZW06CisJc2t5Ml9yeF9jbGVhbihza3kyKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogRnJlZSB0aGUgbGUgYW5kIHJpbmcgYnVmZmVycyAqLworc3RhdGljIHZvaWQgc2t5Ml9mcmVlX3JpbmdzKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCit7CisJZnJlZV9kbWEoc2t5Mi0+cnhfbGUsIFJYX0xFX0JZVEVTKTsKKwlmcmVlKHNreTItPnJ4X3JpbmcpOworCisJZnJlZV9kbWEoc2t5Mi0+dHhfbGUsIFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3Qgc2t5Ml90eF9sZSkpOworCWZyZWUoc2t5Mi0+dHhfcmluZyk7CisKKwlza3kyLT50eF9sZSA9IE5VTEw7CisJc2t5Mi0+cnhfbGUgPSBOVUxMOworCisJc2t5Mi0+cnhfcmluZyA9IE5VTEw7CisJc2t5Mi0+dHhfcmluZyA9IE5VTEw7Cit9CisKKy8qIEJyaW5nIHVwIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworc3RhdGljIGludCBza3kyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNreTJfaHcgKmh3ID0gc2t5Mi0+aHc7CisJdW5zaWduZWQgcG9ydCA9IHNreTItPnBvcnQ7CisJdTMyIGltYXNrLCByYW1zaXplOworCWludCBlcnIgPSAtRU5PTUVNOworCisJbmV0ZGV2X2xpbmtfZG93bihkZXYpOworCisJLyogbXVzdCBiZSBwb3dlciBvZiAyICovCisJc2t5Mi0+dHhfbGUgPSBtYWxsb2NfZG1hKFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3Qgc2t5Ml90eF9sZSksIFRYX1JJTkdfQUxJR04pOworCXNreTItPnR4X2xlX21hcCA9IHZpcnRfdG9fYnVzKHNreTItPnR4X2xlKTsKKwlpZiAoIXNreTItPnR4X2xlKQorCQlnb3RvIGVycl9vdXQ7CisJbWVtc2V0KHNreTItPnR4X2xlLCAwLCBUWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHNreTJfdHhfbGUpKTsKKworCXNreTItPnR4X3JpbmcgPSB6YWxsb2MoVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCB0eF9yaW5nX2luZm8pKTsKKwlpZiAoIXNreTItPnR4X3JpbmcpCisJCWdvdG8gZXJyX291dDsKKworCXR4X2luaXQoc2t5Mik7CisKKwlza3kyLT5yeF9sZSA9IG1hbGxvY19kbWEoUlhfTEVfQllURVMsIFJYX1JJTkdfQUxJR04pOworCXNreTItPnJ4X2xlX21hcCA9IHZpcnRfdG9fYnVzKHNreTItPnJ4X2xlKTsKKwlpZiAoIXNreTItPnJ4X2xlKQorCQlnb3RvIGVycl9vdXQ7CisJbWVtc2V0KHNreTItPnJ4X2xlLCAwLCBSWF9MRV9CWVRFUyk7CisKKwlza3kyLT5yeF9yaW5nID0gemFsbG9jKFJYX1BFTkRJTkcgKiBzaXplb2Yoc3RydWN0IHJ4X3JpbmdfaW5mbykpOworCWlmICghc2t5Mi0+cnhfcmluZykKKwkJZ290byBlcnJfb3V0OworCisJc2t5Ml9tYWNfaW5pdChodywgcG9ydCk7CisKKwkvKiBSZWdpc3RlciBpcyBudW1iZXIgb2YgNEsgYmxvY2tzIG9uIGludGVybmFsIFJBTSBidWZmZXIuICovCisJcmFtc2l6ZSA9IHNreTJfcmVhZDgoaHcsIEIyX0VfMCkgKiA0OworCWlmIChyYW1zaXplID4gMCkgeworCQl1MzIgcnhzcGFjZTsKKworCQlody0+ZmxhZ3MgfD0gU0tZMl9IV19SQU1fQlVGRkVSOworCQlEQkcyKFBGWCAiJXM6IHJhbSBidWZmZXIgJWRLXG4iLCBkZXYtPm5hbWUsIHJhbXNpemUpOworCQlpZiAocmFtc2l6ZSA8IDE2KQorCQkJcnhzcGFjZSA9IHJhbXNpemUgLyAyOworCQllbHNlCisJCQlyeHNwYWNlID0gOCArICgyKihyYW1zaXplIC0gMTYpKS8zOworCisJCXNreTJfcmFtc2V0KGh3LCByeHFhZGRyW3BvcnRdLCAwLCByeHNwYWNlKTsKKwkJc2t5Ml9yYW1zZXQoaHcsIHR4cWFkZHJbcG9ydF0sIHJ4c3BhY2UsIHJhbXNpemUgLSByeHNwYWNlKTsKKworCQkvKiBNYWtlIHN1cmUgU3luY1EgaXMgZGlzYWJsZWQgKi8KKwkJc2t5Ml93cml0ZTgoaHcsIFJCX0FERFIocG9ydCA9PSAwID8gUV9YUzEgOiBRX1hTMiwgUkJfQ1RSTCksCisJCQkgICAgUkJfUlNUX1NFVCk7CisJfQorCisJc2t5Ml9xc2V0KGh3LCB0eHFhZGRyW3BvcnRdKTsKKworCS8qIFRoaXMgaXMgY29waWVkIGZyb20gc2s5OGxpbiAxMC4wLjUuMzsgbm8gb25lIHRlbGxzIG1lIGFib3V0IGVycmF0dGEncyAqLworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VYICYmIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FWF9CMCkKKwkJc2t5Ml93cml0ZTMyKGh3LCBRX0FERFIodHhxYWRkcltwb3J0XSwgUV9URVNUKSwgRl9UWF9DSEtfQVVUT19PRkYpOworCisJLyogU2V0IGFsbW9zdCBlbXB0eSB0aHJlc2hvbGQgKi8KKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VCisJICAgICYmIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FQ19VX0EwKQorCQlza3kyX3dyaXRlMTYoaHcsIFFfQUREUih0eHFhZGRyW3BvcnRdLCBRX0FMKSwgRUNVX1RYRkZfTEVWKTsKKworCXNreTJfcHJlZmV0Y2hfaW5pdChodywgdHhxYWRkcltwb3J0XSwgc2t5Mi0+dHhfbGVfbWFwLAorCQkJICAgVFhfUklOR19TSVpFIC0gMSk7CisKKwllcnIgPSBza3kyX3J4X3N0YXJ0KHNreTIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZyb20gcGh5L21hYyBmb3IgcG9ydCAqLworCWltYXNrID0gc2t5Ml9yZWFkMzIoaHcsIEIwX0lNU0spOworCWltYXNrIHw9IHBvcnRpcnFfbXNrW3BvcnRdOworCXNreTJfd3JpdGUzMihodywgQjBfSU1TSywgaW1hc2spOworCisJREJHSU8oUEZYICIlczogbGUgYmFzZXM6IHN0ICVwIFsleF0sIHJ4ICVwIFsleF0sIHR4ICVwIFsleF1cbiIsCisJICAgICAgZGV2LT5uYW1lLCBody0+c3RfbGUsIGh3LT5zdF9kbWEsIHNreTItPnJ4X2xlLCBza3kyLT5yeF9sZV9tYXAsCisJICAgICAgc2t5Mi0+dHhfbGUsIHNreTItPnR4X2xlX21hcCk7CisKKwlza3kyX3NldF9tdWx0aWNhc3QoZGV2KTsKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlza3kyX2ZyZWVfcmluZ3Moc2t5Mik7CisJcmV0dXJuIGVycjsKK30KKworLyogTW9kdWxhciBzdWJ0cmFjdGlvbiBpbiByaW5nICovCitzdGF0aWMgaW5saW5lIGludCB0eF9kaXN0KHVuc2lnbmVkIHRhaWwsIHVuc2lnbmVkIGhlYWQpCit7CisJcmV0dXJuIChoZWFkIC0gdGFpbCkgJiAoVFhfUklOR19TSVpFIC0gMSk7Cit9CisKKy8qIE51bWJlciBvZiBsaXN0IGVsZW1lbnRzIGF2YWlsYWJsZSBmb3IgbmV4dCB0eCAqLworc3RhdGljIGlubGluZSBpbnQgdHhfYXZhaWwoY29uc3Qgc3RydWN0IHNreTJfcG9ydCAqc2t5MikKK3sKKwlyZXR1cm4gVFhfUEVORElORyAtIHR4X2Rpc3Qoc2t5Mi0+dHhfY29ucywgc2t5Mi0+dHhfcHJvZCk7Cit9CisKKworLyoKKyAqIFB1dCBvbmUgcGFja2V0IGluIHJpbmcgZm9yIHRyYW5zbWl0LgorICogQSBzaW5nbGUgcGFja2V0IGNhbiBnZW5lcmF0ZSBtdWx0aXBsZSBsaXN0IGVsZW1lbnRzLCBhbmQKKyAqIHRoZSBudW1iZXIgb2YgcmluZyBlbGVtZW50cyB3aWxsIHByb2JhYmx5IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyCisgKiBvZiBsaXN0IGVsZW1lbnRzIHVzZWQuCisgKi8KK3N0YXRpYyBpbnQgc2t5Ml94bWl0X2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYikKK3sKKwlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBza3kyLT5odzsKKwlzdHJ1Y3Qgc2t5Ml90eF9sZSAqbGUgPSBOVUxMOworCXN0cnVjdCB0eF9yaW5nX2luZm8gKnJlOworCXVuc2lnbmVkIGxlbjsKKwl1MzIgbWFwcGluZzsKKwl1OCBjdHJsOworCisJaWYgKHR4X2F2YWlsKHNreTIpIDwgMSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWxlbiA9IGlvYl9sZW4oaW9iKTsKKwltYXBwaW5nID0gdmlydF90b19idXMoaW9iLT5kYXRhKTsKKworCURCR0lPKFBGWCAiJXM6IHR4IHF1ZXVlZCwgc2xvdCAlZCwgbGVuICVkXG4iLCBkZXYtPm5hbWUsCisJICAgICAgc2t5Mi0+dHhfcHJvZCwgbGVuKTsKKworCWN0cmwgPSAwOworCisJbGUgPSBnZXRfdHhfbGUoc2t5Mik7CisJbGUtPmFkZHIgPSBjcHVfdG9fbGUzMigodTMyKSBtYXBwaW5nKTsKKwlsZS0+bGVuZ3RoID0gY3B1X3RvX2xlMTYobGVuKTsKKwlsZS0+Y3RybCA9IGN0cmw7CisJbGUtPm9wY29kZSA9IChPUF9QQUNLRVQgfCBIV19PV05FUik7CisKKwlyZSA9IHR4X2xlX3JlKHNreTIsIGxlKTsKKwlyZS0+aW9iID0gaW9iOworCisJbGUtPmN0cmwgfD0gRU9QOworCisJc2t5Ml9wdXRfaWR4KGh3LCB0eHFhZGRyW3NreTItPnBvcnRdLCBza3kyLT50eF9wcm9kKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnJlZSByaW5nIGVsZW1lbnRzIGZyb20gc3RhcnRpbmcgYXQgdHhfY29ucyB1bnRpbCAiZG9uZSIKKyAqCisgKiBOQjogdGhlIGhhcmR3YXJlIHdpbGwgdGVsbCB1cyBhYm91dCBwYXJ0aWFsIGNvbXBsZXRpb24gb2YgbXVsdGktcGFydAorICogICAgIGJ1ZmZlcnMgc28gbWFrZSBzdXJlIG5vdCB0byBmcmVlIGlvYiB0b28gZWFybHkuCisgKi8KK3N0YXRpYyB2b2lkIHNreTJfdHhfY29tcGxldGUoc3RydWN0IHNreTJfcG9ydCAqc2t5MiwgdTE2IGRvbmUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNreTItPm5ldGRldjsKKwl1bnNpZ25lZCBpZHg7CisKKwlhc3NlcnQoZG9uZSA8IFRYX1JJTkdfU0laRSk7CisKKwlmb3IgKGlkeCA9IHNreTItPnR4X2NvbnM7IGlkeCAhPSBkb25lOworCSAgICAgaWR4ID0gUklOR19ORVhUKGlkeCwgVFhfUklOR19TSVpFKSkgeworCQlzdHJ1Y3Qgc2t5Ml90eF9sZSAqbGUgPSBza3kyLT50eF9sZSArIGlkeDsKKwkJc3RydWN0IHR4X3JpbmdfaW5mbyAqcmUgPSBza3kyLT50eF9yaW5nICsgaWR4OworCisJCWlmIChsZS0+Y3RybCAmIEVPUCkgeworCQkJREJHSU8oUEZYICIlczogdHggZG9uZSAlZFxuIiwgZGV2LT5uYW1lLCBpZHgpOworCQkJbmV0ZGV2X3R4X2NvbXBsZXRlKGRldiwgcmUtPmlvYik7CisJCX0KKwl9CisKKwlza3kyLT50eF9jb25zID0gaWR4OworCW1iKCk7Cit9CisKKy8qIENsZWFudXAgYWxsIHVudHJhbnNtaXR0ZWQgYnVmZmVycywgYXNzdW1lIHRyYW5zbWl0dGVyIG5vdCBydW5uaW5nICovCitzdGF0aWMgdm9pZCBza3kyX3R4X2NsZWFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CisKKwlza3kyX3R4X2NvbXBsZXRlKHNreTIsIHNreTItPnR4X3Byb2QpOworfQorCisvKiBOZXR3b3JrIHNodXRkb3duICovCitzdGF0aWMgdm9pZCBza3kyX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBza3kyLT5odzsKKwl1bnNpZ25lZCBwb3J0ID0gc2t5Mi0+cG9ydDsKKwl1MTYgY3RybDsKKwl1MzIgaW1hc2s7CisKKwkvKiBOZXZlciByZWFsbHkgZ290IHN0YXJ0ZWQhICovCisJaWYgKCFza3kyLT50eF9sZSkKKwkJcmV0dXJuOworCisJREJHMihQRlggIiVzOiBkaXNhYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCisJLyogRGlzYWJsZSBwb3J0IElSUSAqLworCWltYXNrID0gc2t5Ml9yZWFkMzIoaHcsIEIwX0lNU0spOworCWltYXNrICY9IH5wb3J0aXJxX21za1twb3J0XTsKKwlza3kyX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGltYXNrKTsKKworCXNreTJfZ21hY19yZXNldChodywgcG9ydCk7CisKKwkvKiBTdG9wIHRyYW5zbWl0dGVyICovCisJc2t5Ml93cml0ZTMyKGh3LCBRX0FERFIodHhxYWRkcltwb3J0XSwgUV9DU1IpLCBCTVVfU1RPUCk7CisJc2t5Ml9yZWFkMzIoaHcsIFFfQUREUih0eHFhZGRyW3BvcnRdLCBRX0NTUikpOworCisJc2t5Ml93cml0ZTMyKGh3LCBSQl9BRERSKHR4cWFkZHJbcG9ydF0sIFJCX0NUUkwpLAorCQkgICAgIFJCX1JTVF9TRVQgfCBSQl9ESVNfT1BfTUQpOworCisJY3RybCA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwpOworCWN0cmwgJj0gfihHTV9HUENSX1RYX0VOQSB8IEdNX0dQQ1JfUlhfRU5BKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgY3RybCk7CisKKwlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdQSFlfQ1RSTCksIEdQQ19SU1RfU0VUKTsKKworCS8qIFdvcmthcm91bmQgc2hhcmVkIEdNQUMgcmVzZXQgKi8KKwlpZiAoIShody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX1hMICYmIGh3LT5jaGlwX3JldiA9PSAwCisJICAgICAgJiYgcG9ydCA9PSAwICYmIGh3LT5kZXZbMV0pKQorCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19SU1RfU0VUKTsKKworCS8qIERpc2FibGUgRm9yY2UgU3luYyBiaXQgYW5kIEVuYWJsZSBBbGxvYyBiaXQgKi8KKwlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYQV9DVFJMKSwKKwkJICAgIFRYQV9ESVNfRlNZTkMgfCBUWEFfRElTX0FMTE9DIHwgVFhBX1NUT1BfUkMpOworCisJLyogU3RvcCBJbnRlcnZhbCBUaW1lciBhbmQgTGltaXQgQ291bnRlciBvZiBUeCBBcmJpdGVyICovCisJc2t5Ml93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgVFhBX0lUSV9JTkkpLCAwTCk7CisJc2t5Ml93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgVFhBX0xJTV9JTkkpLCAwTCk7CisKKwkvKiBSZXNldCB0aGUgUENJIEZJRk8gb2YgdGhlIGFzeW5jIFR4IHF1ZXVlICovCisJc2t5Ml93cml0ZTMyKGh3LCBRX0FERFIodHhxYWRkcltwb3J0XSwgUV9DU1IpLAorCQkgICAgIEJNVV9SU1RfU0VUIHwgQk1VX0ZJRk9fUlNUKTsKKworCS8qIFJlc2V0IHRoZSBUeCBwcmVmZXRjaCB1bml0cyAqLworCXNreTJfd3JpdGUzMihodywgWTJfUUFERFIodHhxYWRkcltwb3J0XSwgUFJFRl9VTklUX0NUUkwpLAorCQkgICAgIFBSRUZfVU5JVF9SU1RfU0VUKTsKKworCXNreTJfd3JpdGUzMihodywgUkJfQUREUih0eHFhZGRyW3BvcnRdLCBSQl9DVFJMKSwgUkJfUlNUX1NFVCk7CisKKwlza3kyX3J4X3N0b3Aoc2t5Mik7CisKKwlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9DVFJMX1QpLCBHTUZfUlNUX1NFVCk7CisJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9TRVQpOworCisJc2t5Ml9waHlfcG93ZXJfZG93bihodywgcG9ydCk7CisKKwkvKiB0dXJuIG9mZiBMRUQncyAqLworCXNreTJfd3JpdGUxNihodywgQjBfWTJMRUQsIExFRF9TVEFUX09GRik7CisKKwlza3kyX3R4X2NsZWFuKGRldik7CisJc2t5Ml9yeF9jbGVhbihza3kyKTsKKworCXNreTJfZnJlZV9yaW5ncyhza3kyKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHUxNiBza3kyX3BoeV9zcGVlZChjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHUxNiBhdXgpCit7CisJaWYgKGh3LT5mbGFncyAmIFNLWTJfSFdfRklCUkVfUEhZKQorCQlyZXR1cm4gU1BFRURfMTAwMDsKKworCWlmICghKGh3LT5mbGFncyAmIFNLWTJfSFdfR0lHQUJJVCkpIHsKKwkJaWYgKGF1eCAmIFBIWV9NX1BTX1NQRUVEXzEwMCkKKwkJCXJldHVybiBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCXJldHVybiBTUEVFRF8xMDsKKwl9CisKKwlzd2l0Y2ggKGF1eCAmIFBIWV9NX1BTX1NQRUVEX01TSykgeworCWNhc2UgUEhZX01fUFNfU1BFRURfMTAwMDoKKwkJcmV0dXJuIFNQRUVEXzEwMDA7CisJY2FzZSBQSFlfTV9QU19TUEVFRF8xMDA6CisJCXJldHVybiBTUEVFRF8xMDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFNQRUVEXzEwOworCX0KK30KKworc3RhdGljIHZvaWQgc2t5Ml9saW5rX3VwKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCit7CisJc3RydWN0IHNreTJfaHcgKmh3ID0gc2t5Mi0+aHc7CisJdW5zaWduZWQgcG9ydCA9IHNreTItPnBvcnQ7CisJdTE2IHJlZzsKKwlzdGF0aWMgY29uc3QgY2hhciAqZmNfbmFtZVtdID0geworCQlbRkNfTk9ORV0JPSAibm9uZSIsCisJCVtGQ19UWF0JCT0gInR4IiwKKwkJW0ZDX1JYXQkJPSAicngiLAorCQlbRkNfQk9USF0JPSAiYm90aCIsCisJfTsKKworCS8qIGVuYWJsZSBSeC9UeCAqLworCXJlZyA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwpOworCXJlZyB8PSBHTV9HUENSX1JYX0VOQSB8IEdNX0dQQ1JfVFhfRU5BOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLCByZWcpOworCisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgUEhZX01fREVGX01TSyk7CisKKwluZXRkZXZfbGlua191cChza3kyLT5uZXRkZXYpOworCisJLyogVHVybiBvbiBsaW5rIExFRCAqLworCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLAorCQkgICAgTElOS0xFRF9PTiB8IExJTktMRURfQkxJTktfT0ZGIHwgTElOS0xFRF9MSU5LU1lOQ19PRkYpOworCisJREJHKFBGWCAiJXM6IExpbmsgaXMgdXAgYXQgJWQgTWJwcywgJXMgZHVwbGV4LCBmbG93IGNvbnRyb2wgJXNcbiIsCisJICAgIHNreTItPm5ldGRldi0+bmFtZSwgc2t5Mi0+c3BlZWQsCisJICAgIHNreTItPmR1cGxleCA9PSBEVVBMRVhfRlVMTCA/ICJmdWxsIiA6ICJoYWxmIiwKKwkgICAgZmNfbmFtZVtza3kyLT5mbG93X3N0YXR1c10pOworfQorCitzdGF0aWMgdm9pZCBza3kyX2xpbmtfZG93bihzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyKQoreworCXN0cnVjdCBza3kyX2h3ICpodyA9IHNreTItPmh3OworCXVuc2lnbmVkIHBvcnQgPSBza3kyLT5wb3J0OworCXUxNiByZWc7CisKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCAwKTsKKworCXJlZyA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwpOworCXJlZyAmPSB+KEdNX0dQQ1JfUlhfRU5BIHwgR01fR1BDUl9UWF9FTkEpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLCByZWcpOworCisJbmV0ZGV2X2xpbmtfZG93bihza3kyLT5uZXRkZXYpOworCisJLyogVHVybiBvbiBsaW5rIExFRCAqLworCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX09GRik7CisKKwlEQkcoUEZYICIlczogTGluayBpcyBkb3duLlxuIiwgc2t5Mi0+bmV0ZGV2LT5uYW1lKTsKKworCXNreTJfcGh5X2luaXQoaHcsIHBvcnQpOworfQorCitzdGF0aWMgaW50IHNreTJfYXV0b25lZ19kb25lKHN0cnVjdCBza3kyX3BvcnQgKnNreTIsIHUxNiBhdXgpCit7CisJc3RydWN0IHNreTJfaHcgKmh3ID0gc2t5Mi0+aHc7CisJdW5zaWduZWQgcG9ydCA9IHNreTItPnBvcnQ7CisJdTE2IGFkdmVydCwgbHBhOworCisJYWR2ZXJ0ID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0FVTkVfQURWKTsKKwlscGEgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfQVVORV9MUCk7CisJaWYgKGxwYSAmIFBIWV9NX0FOX1JGKSB7CisJCURCRyhQRlggIiVzOiByZW1vdGUgZmF1bHRcbiIsIHNreTItPm5ldGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIShhdXggJiBQSFlfTV9QU19TUERVUF9SRVMpKSB7CisJCURCRyhQRlggIiVzOiBzcGVlZC9kdXBsZXggbWlzbWF0Y2hcbiIsIHNreTItPm5ldGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlza3kyLT5zcGVlZCA9IHNreTJfcGh5X3NwZWVkKGh3LCBhdXgpOworCXNreTItPmR1cGxleCA9IChhdXggJiBQSFlfTV9QU19GVUxMX0RVUCkgPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCisJLyogU2luY2UgdGhlIHBhdXNlIHJlc3VsdCBiaXRzIHNlZW0gdG8gaW4gZGlmZmVyZW50IHBvc2l0aW9ucyBvbgorCSAqIGRpZmZlcmVudCBjaGlwcy4gbG9vayBhdCByZWdpc3RlcnMuCisJICovCisKKwlza3kyLT5mbG93X3N0YXR1cyA9IEZDX05PTkU7CisJaWYgKGFkdmVydCAmIEFEVkVSVElTRV9QQVVTRV9DQVApIHsKKwkJaWYgKGxwYSAmIExQQV9QQVVTRV9DQVApCisJCQlza3kyLT5mbG93X3N0YXR1cyA9IEZDX0JPVEg7CisJCWVsc2UgaWYgKGFkdmVydCAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKQorCQkJc2t5Mi0+Zmxvd19zdGF0dXMgPSBGQ19SWDsKKwl9IGVsc2UgaWYgKGFkdmVydCAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSB7CisJCWlmICgobHBhICYgTFBBX1BBVVNFX0NBUCkgJiYgKGxwYSAmIExQQV9QQVVTRV9BU1lNKSkKKwkJCXNreTItPmZsb3dfc3RhdHVzID0gRkNfVFg7CisJfQorCisJaWYgKHNreTItPmR1cGxleCA9PSBEVVBMRVhfSEFMRiAmJiBza3kyLT5zcGVlZCA8IFNQRUVEXzEwMDAKKwkgICAgJiYgIShody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FWCkpCisJCXNreTItPmZsb3dfc3RhdHVzID0gRkNfTk9ORTsKKworCWlmIChza3kyLT5mbG93X3N0YXR1cyAmIEZDX1RYKQorCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PTik7CisJZWxzZQorCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PRkYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEludGVycnVwdCBmcm9tIFBIWSAqLworc3RhdGljIHZvaWQgc2t5Ml9waHlfaW50cihzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHBvcnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGh3LT5kZXZbcG9ydF07CisJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IGlzdGF0dXMsIHBoeXN0YXQ7CisKKwlpc3RhdHVzID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9TVEFUKTsKKwlwaHlzdGF0ID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX1BIWV9TVEFUKTsKKworCURCR0lPKFBGWCAiJXM6IHBoeSBpbnRlcnJ1cHQgc3RhdHVzIDB4JXggMHgleFxuIiwKKwkgICAgICBza3kyLT5uZXRkZXYtPm5hbWUsIGlzdGF0dXMsIHBoeXN0YXQpOworCisJaWYgKHNreTItPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgJiYgKGlzdGF0dXMgJiBQSFlfTV9JU19BTl9DT01QTCkpIHsKKwkJaWYgKHNreTJfYXV0b25lZ19kb25lKHNreTIsIHBoeXN0YXQpID09IDApCisJCQlza3kyX2xpbmtfdXAoc2t5Mik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXN0YXR1cyAmIFBIWV9NX0lTX0xTUF9DSEFOR0UpCisJCXNreTItPnNwZWVkID0gc2t5Ml9waHlfc3BlZWQoaHcsIHBoeXN0YXQpOworCisJaWYgKGlzdGF0dXMgJiBQSFlfTV9JU19EVVBfQ0hBTkdFKQorCQlza3kyLT5kdXBsZXggPQorCQkgICAgKHBoeXN0YXQgJiBQSFlfTV9QU19GVUxMX0RVUCkgPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCisJaWYgKGlzdGF0dXMgJiBQSFlfTV9JU19MU1RfQ0hBTkdFKSB7CisJCWlmIChwaHlzdGF0ICYgUEhZX01fUFNfTElOS19VUCkKKwkJCXNreTJfbGlua191cChza3kyKTsKKwkJZWxzZQorCQkJc2t5Ml9saW5rX2Rvd24oc2t5Mik7CisJfQorfQorCisvKiBOb3JtYWwgcGFja2V0IC0gdGFrZSBpb2IgZnJvbSByaW5nIGVsZW1lbnQgYW5kIHB1dCBpbiBhIG5ldyBvbmUgICovCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqcmVjZWl2ZV9uZXcoc3RydWN0IHNreTJfcG9ydCAqc2t5MiwKKwkJCQkgICAgIHN0cnVjdCByeF9yaW5nX2luZm8gKnJlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2IsICpuaW9iOworCXVuc2lnbmVkIGhkcl9zcGFjZSA9IHNreTItPnJ4X2RhdGFfc2l6ZTsKKworCS8qIERvbid0IGJlIHRyaWNreSBhYm91dCByZXVzaW5nIHBhZ2VzICh5ZXQpICovCisJbmlvYiA9IHNreTJfcnhfYWxsb2Moc2t5Mik7CisJaWYgKCFuaW9iKQorCQlyZXR1cm4gTlVMTDsKKworCWlvYiA9IHJlLT5pb2I7CisKKwlyZS0+aW9iID0gbmlvYjsKKwlza3kyX3J4X21hcF9pb2Ioc2t5Mi0+aHctPnBkZXYsIHJlLCBoZHJfc3BhY2UpOworCisJaW9iX3B1dChpb2IsIGxlbmd0aCk7CisJcmV0dXJuIGlvYjsKK30KKworLyoKKyAqIFJlY2VpdmUgb25lIHBhY2tldC4KKyAqIEZvciBsYXJnZXIgcGFja2V0cywgZ2V0IG5ldyBidWZmZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW9fYnVmZmVyICpza3kyX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICB1MTYgbGVuZ3RoLCB1MzIgc3RhdHVzKQoreworCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCByeF9yaW5nX2luZm8gKnJlID0gc2t5Mi0+cnhfcmluZyArIHNreTItPnJ4X25leHQ7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gTlVMTDsKKwl1MTYgY291bnQgPSAoc3RhdHVzICYgR01SX0ZTX0xFTikgPj4gMTY7CisKKwlEQkdJTyhQRlggIiVzOiByeCBzbG90ICVkIHN0YXR1cyAweCV4IGxlbiAlZFxuIiwKKwkgICAgICBkZXYtPm5hbWUsIHNreTItPnJ4X25leHQsIHN0YXR1cywgbGVuZ3RoKTsKKworCXNreTItPnJ4X25leHQgPSAoc2t5Mi0+cnhfbmV4dCArIDEpICUgUlhfUEVORElORzsKKworCS8qIFRoaXMgY2hpcCBoYXMgaGFyZHdhcmUgcHJvYmxlbXMgdGhhdCBnZW5lcmF0ZXMgYm9ndXMgc3RhdHVzLgorCSAqIFNvIGRvIG9ubHkgbWFyZ2luYWwgY2hlY2tpbmcgYW5kIGV4cGVjdCBoaWdoZXIgbGV2ZWwgcHJvdG9jb2xzCisJICogdG8gaGFuZGxlIGNyYXAgZnJhbWVzLgorCSAqLworCWlmIChza3kyLT5ody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0ZFX1AgJiYKKwkgICAgc2t5Mi0+aHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0ZFMl9BMCAmJgorCSAgICBsZW5ndGggPT0gY291bnQpCisJCWdvdG8gb2theTsKKworCWlmIChzdGF0dXMgJiBHTVJfRlNfQU5ZX0VSUikKKwkJZ290byBlcnJvcjsKKworCWlmICghKHN0YXR1cyAmIEdNUl9GU19SWF9PSykpCisJCWdvdG8gcmVzdWJtaXQ7CisKKwkvKiBpZiBsZW5ndGggcmVwb3J0ZWQgYnkgRE1BIGRvZXMgbm90IG1hdGNoIFBIWSwgcGFja2V0IHdhcyB0cnVuY2F0ZWQgKi8KKwlpZiAobGVuZ3RoICE9IGNvdW50KQorCQlnb3RvIGxlbl9lcnJvcjsKKworb2theToKKwlpb2IgPSByZWNlaXZlX25ldyhza3kyLCByZSwgbGVuZ3RoKTsKK3Jlc3VibWl0OgorCXNreTJfcnhfc3VibWl0KHNreTIsIHJlKTsKKworCXJldHVybiBpb2I7CisKK2xlbl9lcnJvcjoKKwkvKiBUcnVuY2F0aW9uIG9mIG92ZXJsZW5ndGggcGFja2V0cworCSAgIGNhdXNlcyBQSFkgbGVuZ3RoIHRvIG5vdCBtYXRjaCBNQUMgbGVuZ3RoICovCisJREJHMihQRlggIiVzOiByeCBsZW5ndGggZXJyb3I6IHN0YXR1cyAlI3ggbGVuZ3RoICVkXG4iLAorCSAgICAgZGV2LT5uYW1lLCBzdGF0dXMsIGxlbmd0aCk7CisKKwkvKiBQYXNzIE5VTEwgYXMgaW9iIGJlY2F1c2Ugd2Ugd2FudCB0byBrZWVwIG91ciBpb2IgaW4gdGhlCisJICAgcmluZyBmb3IgdGhlIG5leHQgcGFja2V0LiAqLworCW5ldGRldl9yeF9lcnIoZGV2LCBOVUxMLCAtRUlOVkFMKTsKKwlnb3RvIHJlc3VibWl0OworCitlcnJvcjoKKwlpZiAoc3RhdHVzICYgR01SX0ZTX1JYX0ZGX09WKSB7CisJCURCRzIoUEZYICIlczogRklGTyBvdmVyZmxvdyBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X3J4X2VycihkZXYsIE5VTEwsIC1FQlVTWSk7CisJCWdvdG8gcmVzdWJtaXQ7CisJfQorCisJREJHMihQRlggIiVzOiByeCBlcnJvciwgc3RhdHVzIDB4JXggbGVuZ3RoICVkXG4iLAorCSAgICAgZGV2LT5uYW1lLCBzdGF0dXMsIGxlbmd0aCk7CisJbmV0ZGV2X3J4X2VycihkZXYsIE5VTEwsIC1FSU8pOworCisJZ290byByZXN1Ym1pdDsKK30KKworLyogVHJhbnNtaXQgY29tcGxldGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBza3kyX3R4X2RvbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGxhc3QpCit7CisJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CisKKwlza3kyX3R4X2NvbXBsZXRlKHNreTIsIGxhc3QpOworfQorCisvKiBQcm9jZXNzIHN0YXR1cyByZXNwb25zZSByaW5nICovCitzdGF0aWMgdm9pZCBza3kyX3N0YXR1c19pbnRyKHN0cnVjdCBza3kyX2h3ICpodywgdTE2IGlkeCkKK3sKKwl1bnNpZ25lZCByeFsyXSA9IHsgMCwgMCB9OworCisJcm1iKCk7CisJZG8geworCQlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyOworCQlzdHJ1Y3Qgc2t5Ml9zdGF0dXNfbGUgKmxlICA9IGh3LT5zdF9sZSArIGh3LT5zdF9pZHg7CisJCXVuc2lnbmVkIHBvcnQ7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXN0cnVjdCBpb19idWZmZXIgKmlvYjsKKwkJdTMyIHN0YXR1czsKKwkJdTE2IGxlbmd0aDsKKwkJdTggb3Bjb2RlID0gbGUtPm9wY29kZTsKKworCQlpZiAoIShvcGNvZGUgJiBIV19PV05FUikpCisJCQlicmVhazsKKworCQlwb3J0ID0gbGUtPmNzcyAmIENTU19MSU5LX0JJVDsKKwkJZGV2ID0gaHctPmRldltwb3J0XTsKKwkJc2t5MiA9IG5ldGRldl9wcml2KGRldik7CisJCWxlbmd0aCA9IGxlMTZfdG9fY3B1KGxlLT5sZW5ndGgpOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdShsZS0+c3RhdHVzKTsKKworCQlody0+c3RfaWR4ID0gUklOR19ORVhUKGh3LT5zdF9pZHgsIFNUQVRVU19SSU5HX1NJWkUpOworCisJCWxlLT5vcGNvZGUgPSAwOworCQlzd2l0Y2ggKG9wY29kZSAmIH5IV19PV05FUikgeworCQljYXNlIE9QX1JYU1RBVDoKKwkJCSsrcnhbcG9ydF07CisJCQlpb2IgPSBza3kyX3JlY2VpdmUoZGV2LCBsZW5ndGgsIHN0YXR1cyk7CisJCQlpZiAoIWlvYikgeworCQkJCW5ldGRldl9yeF9lcnIoZGV2LCBOVUxMLCAtRU5PTUVNKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbmV0ZGV2X3J4KGRldiwgaW9iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT1BfUlhDSEtTOgorCQkJREJHMihQRlggInN0YXR1cyBPUF9SWENIS1MgYnV0IGNoZWNrc3VtIG9mZmxvYWRpbmcgZGlzYWJsZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPUF9UWElOREVYTEU6CisJCQkvKiBUWCBpbmRleCByZXBvcnRzIHN0YXR1cyBmb3IgYm90aCBwb3J0cyAqLworCQkJYXNzZXJ0KFRYX1JJTkdfU0laRSA8PSAweDEwMDApOworCQkJc2t5Ml90eF9kb25lKGh3LT5kZXZbMF0sIHN0YXR1cyAmIDB4ZmZmKTsKKwkJCWlmIChody0+ZGV2WzFdKQorCQkJCXNreTJfdHhfZG9uZShody0+ZGV2WzFdLAorCQkJCSAgICAgKChzdGF0dXMgPj4gMjQpICYgMHhmZikKKwkJCQkJICAgICB8ICh1MTYpKGxlbmd0aCAmIDB4ZikgPDwgOCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJREJHKFBGWCAidW5rbm93biBzdGF0dXMgb3Bjb2RlIDB4JXhcbiIsIG9wY29kZSk7CisJCX0KKwl9IHdoaWxlIChody0+c3RfaWR4ICE9IGlkeCk7CisKKwkvKiBGdWxseSBwcm9jZXNzZWQgc3RhdHVzIHJpbmcgc28gY2xlYXIgaXJxICovCisJc2t5Ml93cml0ZTMyKGh3LCBTVEFUX0NUUkwsIFNDX1NUQVRfQ0xSX0lSUSk7CisKKwlpZiAocnhbMF0pCisJCXNreTJfcnhfdXBkYXRlKG5ldGRldl9wcml2KGh3LT5kZXZbMF0pLCBRX1IxKTsKKworCWlmIChyeFsxXSkKKwkJc2t5Ml9yeF91cGRhdGUobmV0ZGV2X3ByaXYoaHctPmRldlsxXSksIFFfUjIpOworfQorCitzdGF0aWMgdm9pZCBza3kyX2h3X2Vycm9yKHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcG9ydCwgdTMyIHN0YXR1cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltwb3J0XTsKKworCURCR0lPKFBGWCAiJXM6IGh3IGVycm9yIGludGVycnVwdCBzdGF0dXMgMHgleFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIFkyX0lTX1BBUl9SRDEpIHsKKwkJREJHKFBGWCAiJXM6IHJhbSBkYXRhIHJlYWQgcGFyaXR5IGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkvKiBDbGVhciBJUlEgKi8KKwkJc2t5Ml93cml0ZTE2KGh3LCBSQU1fQlVGRkVSKHBvcnQsIEIzX1JJX0NUUkwpLCBSSV9DTFJfUkRfUEVSUik7CisJfQorCisJaWYgKHN0YXR1cyAmIFkyX0lTX1BBUl9XUjEpIHsKKwkJREJHKFBGWCAiJXM6IHJhbSBkYXRhIHdyaXRlIHBhcml0eSBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJc2t5Ml93cml0ZTE2KGh3LCBSQU1fQlVGRkVSKHBvcnQsIEIzX1JJX0NUUkwpLCBSSV9DTFJfV1JfUEVSUik7CisJfQorCisJaWYgKHN0YXR1cyAmIFkyX0lTX1BBUl9NQUMxKSB7CisJCURCRyhQRlggIiVzOiBNQUMgcGFyaXR5IGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfQ0xJX1RYX1BFKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgWTJfSVNfUEFSX1JYMSkgeworCQlEQkcoUEZYICIlczogUlggcGFyaXR5IGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQlza3kyX3dyaXRlMzIoaHcsIFFfQUREUihyeHFhZGRyW3BvcnRdLCBRX0NTUiksIEJNVV9DTFJfSVJRX1BBUik7CisJfQorCisJaWYgKHN0YXR1cyAmIFkyX0lTX1RDUF9UWEExKSB7CisJCURCRyhQRlggIiVzOiBUQ1Agc2VnbWVudGF0aW9uIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQlza3kyX3dyaXRlMzIoaHcsIFFfQUREUih0eHFhZGRyW3BvcnRdLCBRX0NTUiksIEJNVV9DTFJfSVJRX1RDUCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBza3kyX2h3X2ludHIoc3RydWN0IHNreTJfaHcgKmh3KQoreworCXUzMiBzdGF0dXMgPSBza3kyX3JlYWQzMihodywgQjBfSFdFX0lTUkMpOworCXUzMiBod21zayA9IHNreTJfcmVhZDMyKGh3LCBCMF9IV0VfSU1TSyk7CisKKwlzdGF0dXMgJj0gaHdtc2s7CisKKwlpZiAoc3RhdHVzICYgWTJfSVNfVElTVF9PVikKKwkJc2t5Ml93cml0ZTgoaHcsIEdNQUNfVElfU1RfQ1RSTCwgR01UX1NUX0NMUl9JUlEpOworCisJaWYgKHN0YXR1cyAmIChZMl9JU19NU1RfRVJSIHwgWTJfSVNfSVJRX1NUQVQpKSB7CisJCXUxNiBwY2lfZXJyOworCisJCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOworCQlwY2lfZXJyID0gc2t5Ml9wY2lfcmVhZDE2KGh3LCBQQ0lfU1RBVFVTKTsKKwkJREJHKFBGWCAiUENJIGhhcmR3YXJlIGVycm9yICgweCV4KVxuIiwgcGNpX2Vycik7CisKKwkJc2t5Ml9wY2lfd3JpdGUxNihodywgUENJX1NUQVRVUywKKwkJCQkgcGNpX2VyciB8IFBDSV9TVEFUVVNfRVJST1JfQklUUyk7CisJCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgWTJfSVNfUENJX0VYUCkgeworCQkvKiBQQ0ktRXhwcmVzcyB1bmNvcnJlY3RhYmxlIEVycm9yIG9jY3VycmVkICovCisJCXUzMiBlcnI7CisKKwkJc2t5Ml93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisJCWVyciA9IHNreTJfcmVhZDMyKGh3LCBZMl9DRkdfQUVSICsgUENJX0VSUl9VTkNPUl9TVEFUVVMpOworCQlza3kyX3dyaXRlMzIoaHcsIFkyX0NGR19BRVIgKyBQQ0lfRVJSX1VOQ09SX1NUQVRVUywKKwkJCSAgICAgMHhmZmZmZmZmZnVsKTsKKwkJREJHKFBGWCAiUENJLUV4cHJlc3MgZXJyb3IgKDB4JXgpXG4iLCBlcnIpOworCisJCXNreTJfcmVhZDMyKGh3LCBZMl9DRkdfQUVSICsgUENJX0VSUl9VTkNPUl9TVEFUVVMpOworCQlza3kyX3dyaXRlOChodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CisJfQorCisJaWYgKHN0YXR1cyAmIFkyX0hXRV9MMV9NQVNLKQorCQlza3kyX2h3X2Vycm9yKGh3LCAwLCBzdGF0dXMpOworCXN0YXR1cyA+Pj0gODsKKwlpZiAoc3RhdHVzICYgWTJfSFdFX0wxX01BU0spCisJCXNreTJfaHdfZXJyb3IoaHcsIDEsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNreTJfbWFjX2ludHIoc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCBwb3J0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W3BvcnRdOworCXU4IHN0YXR1cyA9IHNreTJfcmVhZDgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0lSUV9TUkMpKTsKKworCURCR0lPKFBGWCAiJXM6IG1hYyBpbnRlcnJ1cHQgc3RhdHVzIDB4JXhcbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBHTV9JU19SWF9DT19PVikKKwkJZ21hX3JlYWQxNihodywgcG9ydCwgR01fUlhfSVJRX1NSQyk7CisKKwlpZiAoc3RhdHVzICYgR01fSVNfVFhfQ09fT1YpCisJCWdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1RYX0lSUV9TUkMpOworCisJaWYgKHN0YXR1cyAmIEdNX0lTX1JYX0ZGX09SKSB7CisJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0NUUkxfVCksIEdNRl9DTElfUlhfRk8pOworCX0KKworCWlmIChzdGF0dXMgJiBHTV9JU19UWF9GRl9VUikgeworCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfQ0xJX1RYX0ZVKTsKKwl9Cit9CisKKy8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBpdCBpcyBhIGJ1Zy4gKi8KK3N0YXRpYyB2b2lkIHNreTJfbGVfZXJyb3Ioc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCBwb3J0LAorCQkJICB1MTYgcSwgdW5zaWduZWQgcmluZ19zaXplIF9fdW51c2VkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W3BvcnRdOworCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpZHg7CisJY29uc3QgdTY0ICpsZSA9IChxID09IFFfUjEgfHwgcSA9PSBRX1IyKQorCQk/ICh1NjQgKikgc2t5Mi0+cnhfbGUgOiAodTY0ICopIHNreTItPnR4X2xlOworCisJaWR4ID0gc2t5Ml9yZWFkMTYoaHcsIFkyX1FBRERSKHEsIFBSRUZfVU5JVF9HRVRfSURYKSk7CisJREJHKFBGWCAiJXM6IGRlc2NyaXB0b3IgZXJyb3IgcT0lI3ggZ2V0PSVkIFslbGx4XSBsYXN0PSVkIHB1dD0lZCBzaG91bGQgYmUgJWRcbiIsCisJICAgIGRldi0+bmFtZSwgKHVuc2lnbmVkKSBxLCBpZHgsICh1bnNpZ25lZCBsb25nIGxvbmcpIGxlW2lkeF0sCisJICAgIChpbnQpIHNreTJfcmVhZDE2KGh3LCBZMl9RQUREUihxLCBQUkVGX1VOSVRfTEFTVF9JRFgpKSwKKwkgICAgKGludCkgc2t5Ml9yZWFkMTYoaHcsIFkyX1FBRERSKHEsIFBSRUZfVU5JVF9QVVRfSURYKSksCisJICAgIGxlID09ICh1NjQgKilza3kyLT5yeF9sZT8gc2t5Mi0+cnhfcHV0IDogc2t5Mi0+dHhfcHJvZCk7CisKKwlza3kyX3dyaXRlMzIoaHcsIFFfQUREUihxLCBRX0NTUiksIEJNVV9DTFJfSVJRX0NISyk7Cit9CisKKy8qIEhhcmR3YXJlL3NvZnR3YXJlIGVycm9yIGhhbmRsaW5nICovCitzdGF0aWMgdm9pZCBza3kyX2Vycl9pbnRyKHN0cnVjdCBza3kyX2h3ICpodywgdTMyIHN0YXR1cykKK3sKKwlEQkcoUEZYICJlcnJvciBpbnRlcnJ1cHQgc3RhdHVzPSUjeFxuIiwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBZMl9JU19IV19FUlIpCisJCXNreTJfaHdfaW50cihodyk7CisKKwlpZiAoc3RhdHVzICYgWTJfSVNfSVJRX01BQzEpCisJCXNreTJfbWFjX2ludHIoaHcsIDApOworCisJaWYgKHN0YXR1cyAmIFkyX0lTX0lSUV9NQUMyKQorCQlza3kyX21hY19pbnRyKGh3LCAxKTsKKworCWlmIChzdGF0dXMgJiBZMl9JU19DSEtfUlgxKQorCQlza3kyX2xlX2Vycm9yKGh3LCAwLCBRX1IxLCBSWF9MRV9TSVpFKTsKKworCWlmIChzdGF0dXMgJiBZMl9JU19DSEtfUlgyKQorCQlza3kyX2xlX2Vycm9yKGh3LCAxLCBRX1IyLCBSWF9MRV9TSVpFKTsKKworCWlmIChzdGF0dXMgJiBZMl9JU19DSEtfVFhBMSkKKwkJc2t5Ml9sZV9lcnJvcihodywgMCwgUV9YQTEsIFRYX1JJTkdfU0laRSk7CisKKwlpZiAoc3RhdHVzICYgWTJfSVNfQ0hLX1RYQTIpCisJCXNreTJfbGVfZXJyb3IoaHcsIDEsIFFfWEEyLCBUWF9SSU5HX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBza3kyX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBza3kyLT5odzsKKwl1MzIgc3RhdHVzID0gc2t5Ml9yZWFkMzIoaHcsIEIwX1kyX1NQX0VJU1IpOworCXUxNiBpZHg7CisKKwlpZiAoc3RhdHVzICYgWTJfSVNfRVJST1IpCisJCXNreTJfZXJyX2ludHIoaHcsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgWTJfSVNfSVJRX1BIWTEpCisJCXNreTJfcGh5X2ludHIoaHcsIDApOworCisJaWYgKHN0YXR1cyAmIFkyX0lTX0lSUV9QSFkyKQorCQlza3kyX3BoeV9pbnRyKGh3LCAxKTsKKworCXdoaWxlICgoaWR4ID0gc2t5Ml9yZWFkMTYoaHcsIFNUQVRfUFVUX0lEWCkpICE9IGh3LT5zdF9pZHgpIHsKKwkJc2t5Ml9zdGF0dXNfaW50cihodywgaWR4KTsKKwl9CisKKwkvKiBCdWcvRXJyYXRhIHdvcmthcm91bmQ/CisJICogTmVlZCB0byBraWNrIHRoZSBUWCBpcnEgbW9kZXJhdGlvbiB0aW1lci4KKwkgKi8KKwlpZiAoc2t5Ml9yZWFkOChodywgU1RBVF9UWF9USU1FUl9DVFJMKSA9PSBUSU1fU1RBUlQpIHsKKwkJc2t5Ml93cml0ZTgoaHcsIFNUQVRfVFhfVElNRVJfQ1RSTCwgVElNX1NUT1ApOworCQlza3kyX3dyaXRlOChodywgU1RBVF9UWF9USU1FUl9DVFJMLCBUSU1fU1RBUlQpOworCX0KKwlza3kyX3JlYWQzMihodywgQjBfWTJfU1BfTElTUik7Cit9CisKKy8qIENoaXAgaW50ZXJuYWwgZnJlcXVlbmN5IGZvciBjbG9jayBjYWxjdWxhdGlvbnMgKi8KK3N0YXRpYyB1MzIgc2t5Ml9taHooY29uc3Qgc3RydWN0IHNreTJfaHcgKmh3KQoreworCXN3aXRjaCAoaHctPmNoaXBfaWQpIHsKKwljYXNlIENISVBfSURfWVVLT05fRUM6CisJY2FzZSBDSElQX0lEX1lVS09OX0VDX1U6CisJY2FzZSBDSElQX0lEX1lVS09OX0VYOgorCWNhc2UgQ0hJUF9JRF9ZVUtPTl9TVVBSOgorCWNhc2UgQ0hJUF9JRF9ZVUtPTl9VTF8yOgorCQlyZXR1cm4gMTI1OworCisJY2FzZSBDSElQX0lEX1lVS09OX0ZFOgorCQlyZXR1cm4gMTAwOworCisJY2FzZSBDSElQX0lEX1lVS09OX0ZFX1A6CisJCXJldHVybiA1MDsKKworCWNhc2UgQ0hJUF9JRF9ZVUtPTl9YTDoKKwkJcmV0dXJuIDE1NjsKKworCWRlZmF1bHQ6CisJCURCRyhQRlggInVua25vd24gY2hpcCBJRCFcbiIpOworCQlyZXR1cm4gMTAwOwkvKiBib2d1cyAqLworCX0KK30KKworc3RhdGljIGlubGluZSB1MzIgc2t5Ml91czJjbGsoY29uc3Qgc3RydWN0IHNreTJfaHcgKmh3LCB1MzIgdXMpCit7CisJcmV0dXJuIHNreTJfbWh6KGh3KSAqIHVzOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBza3kyX2NsazJ1cyhjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHUzMiBjbGspCit7CisJcmV0dXJuIGNsayAvIHNreTJfbWh6KGh3KTsKK30KKworc3RhdGljIGludCBza3kyX2luaXQoc3RydWN0IHNreTJfaHcgKmh3KQoreworCXU4IHQ4OworCisJLyogRW5hYmxlIGFsbCBjbG9ja3MgYW5kIGNoZWNrIGZvciBiYWQgUENJIGFjY2VzcyAqLworCXNreTJfcGNpX3dyaXRlMzIoaHcsIFBDSV9ERVZfUkVHMywgMCk7CisKKwlza3kyX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfUlNUX0NMUik7CisKKwlody0+Y2hpcF9pZCA9IHNreTJfcmVhZDgoaHcsIEIyX0NISVBfSUQpOworCWh3LT5jaGlwX3JldiA9IChza3kyX3JlYWQ4KGh3LCBCMl9NQUNfQ0ZHKSAmIENGR19DSElQX1JfTVNLKSA+PiA0OworCisJc3dpdGNoKGh3LT5jaGlwX2lkKSB7CisJY2FzZSBDSElQX0lEX1lVS09OX1hMOgorCQlody0+ZmxhZ3MgPSBTS1kyX0hXX0dJR0FCSVQgfCBTS1kyX0hXX05FV0VSX1BIWTsKKwkJYnJlYWs7CisKKwljYXNlIENISVBfSURfWVVLT05fRUNfVToKKwkJaHctPmZsYWdzID0gU0tZMl9IV19HSUdBQklUCisJCQl8IFNLWTJfSFdfTkVXRVJfUEhZCisJCQl8IFNLWTJfSFdfQURWX1BPV0VSX0NUTDsKKwkJYnJlYWs7CisKKwljYXNlIENISVBfSURfWVVLT05fRVg6CisJCWh3LT5mbGFncyA9IFNLWTJfSFdfR0lHQUJJVAorCQkJfCBTS1kyX0hXX05FV0VSX1BIWQorCQkJfCBTS1kyX0hXX05FV19MRQorCQkJfCBTS1kyX0hXX0FEVl9QT1dFUl9DVEw7CisJCWJyZWFrOworCisJY2FzZSBDSElQX0lEX1lVS09OX0VDOgorCQkvKiBUaGlzIHJldiBpcyByZWFsbHkgb2xkLCBhbmQgcmVxdWlyZXMgdW50ZXN0ZWQgd29ya2Fyb3VuZHMgKi8KKwkJaWYgKGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FQ19BMSkgeworCQkJREJHKFBGWCAidW5zdXBwb3J0ZWQgcmV2aXNpb24gWXVrb24tRUMgcmV2IEExXG4iKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCQlody0+ZmxhZ3MgPSBTS1kyX0hXX0dJR0FCSVQ7CisJCWJyZWFrOworCisJY2FzZSBDSElQX0lEX1lVS09OX0ZFOgorCQlicmVhazsKKworCWNhc2UgQ0hJUF9JRF9ZVUtPTl9GRV9QOgorCQlody0+ZmxhZ3MgPSBTS1kyX0hXX05FV0VSX1BIWQorCQkJfCBTS1kyX0hXX05FV19MRQorCQkJfCBTS1kyX0hXX0FVVE9fVFhfU1VNCisJCQl8IFNLWTJfSFdfQURWX1BPV0VSX0NUTDsKKwkJYnJlYWs7CisKKwljYXNlIENISVBfSURfWVVLT05fU1VQUjoKKwkJaHctPmZsYWdzID0gU0tZMl9IV19HSUdBQklUCisJCQl8IFNLWTJfSFdfTkVXRVJfUEhZCisJCQl8IFNLWTJfSFdfTkVXX0xFCisJCQl8IFNLWTJfSFdfQVVUT19UWF9TVU0KKwkJCXwgU0tZMl9IV19BRFZfUE9XRVJfQ1RMOworCQlicmVhazsKKworCWNhc2UgQ0hJUF9JRF9ZVUtPTl9VTF8yOgorCQlody0+ZmxhZ3MgPSBTS1kyX0hXX0dJR0FCSVQKKwkJCXwgU0tZMl9IV19BRFZfUE9XRVJfQ1RMOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURCRyhQRlggInVuc3VwcG9ydGVkIGNoaXAgdHlwZSAweCV4XG4iLCBody0+Y2hpcF9pZCk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlody0+cG1kX3R5cGUgPSBza3kyX3JlYWQ4KGh3LCBCMl9QTURfVFlQKTsKKwlpZiAoaHctPnBtZF90eXBlID09ICdMJyB8fCBody0+cG1kX3R5cGUgPT0gJ1MnIHx8IGh3LT5wbWRfdHlwZSA9PSAnUCcpCisJCWh3LT5mbGFncyB8PSBTS1kyX0hXX0ZJQlJFX1BIWTsKKworCWh3LT5wb3J0cyA9IDE7CisJdDggPSBza3kyX3JlYWQ4KGh3LCBCMl9ZMl9IV19SRVMpOworCWlmICgodDggJiBDRkdfRFVBTF9NQUNfTVNLKSA9PSBDRkdfRFVBTF9NQUNfTVNLKSB7CisJCWlmICghKHNreTJfcmVhZDgoaHcsIEIyX1kyX0NMS19HQVRFKSAmIFkyX1NUQVRVU19MTksyX0lOQUMpKQorCQkJKytody0+cG9ydHM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNreTJfcmVzZXQoc3RydWN0IHNreTJfaHcgKmh3KQoreworCXUxNiBzdGF0dXM7CisJaW50IGksIGNhcDsKKwl1MzIgaHdlX21hc2sgPSBZMl9IV0VfQUxMX01BU0s7CisKKwkvKiBkaXNhYmxlIEFTRiAqLworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VYKSB7CisJCXN0YXR1cyA9IHNreTJfcmVhZDE2KGh3LCBIQ1VfQ0NTUik7CisJCXN0YXR1cyAmPSB+KEhDVV9DQ1NSX0FIQl9SU1QgfCBIQ1VfQ0NTUl9DUFVfUlNUX01PREUgfAorCQkJICAgIEhDVV9DQ1NSX1VDX1NUQVRFX01TSyk7CisJCXNreTJfd3JpdGUxNihodywgSENVX0NDU1IsIHN0YXR1cyk7CisJfSBlbHNlCisJCXNreTJfd3JpdGU4KGh3LCBCMjhfWTJfQVNGX1NUQVRfQ01ELCBZMl9BU0ZfUkVTRVQpOworCXNreTJfd3JpdGUxNihodywgQjBfQ1RTVCwgWTJfQVNGX0RJU0FCTEUpOworCisJLyogZG8gYSBTVyByZXNldCAqLworCXNreTJfd3JpdGU4KGh3LCBCMF9DVFNULCBDU19SU1RfU0VUKTsKKwlza3kyX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfUlNUX0NMUik7CisKKwkvKiBhbGxvdyB3cml0ZXMgdG8gUENJIGNvbmZpZyAqLworCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOworCisJLyogY2xlYXIgUENJIGVycm9ycywgaWYgYW55ICovCisJc3RhdHVzID0gc2t5Ml9wY2lfcmVhZDE2KGh3LCBQQ0lfU1RBVFVTKTsKKwlzdGF0dXMgfD0gUENJX1NUQVRVU19FUlJPUl9CSVRTOworCXNreTJfcGNpX3dyaXRlMTYoaHcsIFBDSV9TVEFUVVMsIHN0YXR1cyk7CisKKwlza3kyX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfTVJTVF9DTFIpOworCisJY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShody0+cGRldiwgUENJX0NBUF9JRF9FWFApOworCWlmIChjYXApIHsKKwkJc2t5Ml93cml0ZTMyKGh3LCBZMl9DRkdfQUVSICsgUENJX0VSUl9VTkNPUl9TVEFUVVMsCisJCQkgICAgIDB4ZmZmZmZmZmZ1bCk7CisKKwkJLyogSWYgYW4gZXJyb3IgYml0IGlzIHN0dWNrIG9uIGlnbm9yZSBpdCAqLworCQlpZiAoc2t5Ml9yZWFkMzIoaHcsIEIwX0hXRV9JU1JDKSAmIFkyX0lTX1BDSV9FWFApCisJCQlEQkcoUEZYICJpZ25vcmluZyBzdHVjayBlcnJvciByZXBvcnQgYml0XG4iKTsKKwkJZWxzZQorCQkJaHdlX21hc2sgfD0gWTJfSVNfUENJX0VYUDsKKwl9CisKKwlza3kyX3Bvd2VyX29uKGh3KTsKKwlza3kyX3dyaXRlOChodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPnBvcnRzOyBpKyspIHsKKwkJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhpLCBHTUFDX0xJTktfQ1RSTCksIEdNTENfUlNUX1NFVCk7CisJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcoaSwgR01BQ19MSU5LX0NUUkwpLCBHTUxDX1JTVF9DTFIpOworCisJCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VYIHx8CisJCSAgICBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX1NVUFIpCisJCQlza3kyX3dyaXRlMTYoaHcsIFNLX1JFRyhpLCBHTUFDX0NUUkwpLAorCQkJCSAgICAgR01DX0JZUF9NQUNTRUNSWF9PTiB8IEdNQ19CWVBfTUFDU0VDVFhfT04KKwkJCQkgICAgIHwgR01DX0JZUF9SRVRSX09OKTsKKwl9CisKKwkvKiBDbGVhciBJMkMgSVJRIG5vaXNlICovCisJc2t5Ml93cml0ZTMyKGh3LCBCMl9JMkNfSVJRLCAxKTsKKworCS8qIHR1cm4gb2ZmIGhhcmR3YXJlIHRpbWVyICh1bnVzZWQpICovCisJc2t5Ml93cml0ZTgoaHcsIEIyX1RJX0NUUkwsIFRJTV9TVE9QKTsKKwlza3kyX3dyaXRlOChodywgQjJfVElfQ1RSTCwgVElNX0NMUl9JUlEpOworCisJc2t5Ml93cml0ZTgoaHcsIEIwX1kyTEVELCBMRURfU1RBVF9PTik7CisKKwkvKiBUdXJuIG9mZiBkZXNjcmlwdG9yIHBvbGxpbmcgKi8KKwlza3kyX3dyaXRlMzIoaHcsIEIyOF9EUFRfQ1RSTCwgRFBUX1NUT1ApOworCisJLyogVHVybiBvZmYgcmVjZWl2ZSB0aW1lc3RhbXAgKi8KKwlza3kyX3dyaXRlOChodywgR01BQ19USV9TVF9DVFJMLCBHTVRfU1RfU1RPUCk7CisJc2t5Ml93cml0ZTgoaHcsIEdNQUNfVElfU1RfQ1RSTCwgR01UX1NUX0NMUl9JUlEpOworCisJLyogZW5hYmxlIHRoZSBUeCBBcmJpdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykKKwkJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhpLCBUWEFfQ1RSTCksIFRYQV9FTkFfQVJCKTsKKworCS8qIEluaXRpYWxpemUgcmFtIGludGVyZmFjZSAqLworCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykgeworCQlza3kyX3dyaXRlOChodywgUkFNX0JVRkZFUihpLCBCM19SSV9DVFJMKSwgUklfUlNUX0NMUik7CisKKwkJc2t5Ml93cml0ZTgoaHcsIFJBTV9CVUZGRVIoaSwgQjNfUklfV1RPX1IxKSwgU0tfUklfVE9fNTMpOworCQlza3kyX3dyaXRlOChodywgUkFNX0JVRkZFUihpLCBCM19SSV9XVE9fWEExKSwgU0tfUklfVE9fNTMpOworCQlza3kyX3dyaXRlOChodywgUkFNX0JVRkZFUihpLCBCM19SSV9XVE9fWFMxKSwgU0tfUklfVE9fNTMpOworCQlza3kyX3dyaXRlOChodywgUkFNX0JVRkZFUihpLCBCM19SSV9SVE9fUjEpLCBTS19SSV9UT181Myk7CisJCXNreTJfd3JpdGU4KGh3LCBSQU1fQlVGRkVSKGksIEIzX1JJX1JUT19YQTEpLCBTS19SSV9UT181Myk7CisJCXNreTJfd3JpdGU4KGh3LCBSQU1fQlVGRkVSKGksIEIzX1JJX1JUT19YUzEpLCBTS19SSV9UT181Myk7CisJCXNreTJfd3JpdGU4KGh3LCBSQU1fQlVGRkVSKGksIEIzX1JJX1dUT19SMiksIFNLX1JJX1RPXzUzKTsKKwkJc2t5Ml93cml0ZTgoaHcsIFJBTV9CVUZGRVIoaSwgQjNfUklfV1RPX1hBMiksIFNLX1JJX1RPXzUzKTsKKwkJc2t5Ml93cml0ZTgoaHcsIFJBTV9CVUZGRVIoaSwgQjNfUklfV1RPX1hTMiksIFNLX1JJX1RPXzUzKTsKKwkJc2t5Ml93cml0ZTgoaHcsIFJBTV9CVUZGRVIoaSwgQjNfUklfUlRPX1IyKSwgU0tfUklfVE9fNTMpOworCQlza3kyX3dyaXRlOChodywgUkFNX0JVRkZFUihpLCBCM19SSV9SVE9fWEEyKSwgU0tfUklfVE9fNTMpOworCQlza3kyX3dyaXRlOChodywgUkFNX0JVRkZFUihpLCBCM19SSV9SVE9fWFMyKSwgU0tfUklfVE9fNTMpOworCX0KKworCXNreTJfd3JpdGUzMihodywgQjBfSFdFX0lNU0ssIGh3ZV9tYXNrKTsKKworCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykKKwkJc2t5Ml9nbWFjX3Jlc2V0KGh3LCBpKTsKKworCW1lbXNldChody0+c3RfbGUsIDAsIFNUQVRVU19MRV9CWVRFUyk7CisJaHctPnN0X2lkeCA9IDA7CisKKwlza3kyX3dyaXRlMzIoaHcsIFNUQVRfQ1RSTCwgU0NfU1RBVF9SU1RfU0VUKTsKKwlza3kyX3dyaXRlMzIoaHcsIFNUQVRfQ1RSTCwgU0NfU1RBVF9SU1RfQ0xSKTsKKworCXNreTJfd3JpdGUzMihodywgU1RBVF9MSVNUX0FERFJfTE8sIGh3LT5zdF9kbWEpOworCXNreTJfd3JpdGUzMihodywgU1RBVF9MSVNUX0FERFJfSEksICh1NjQpIGh3LT5zdF9kbWEgPj4gMzIpOworCisJLyogU2V0IHRoZSBsaXN0IGxhc3QgaW5kZXggKi8KKwlza3kyX3dyaXRlMTYoaHcsIFNUQVRfTEFTVF9JRFgsIFNUQVRVU19SSU5HX1NJWkUgLSAxKTsKKworCXNreTJfd3JpdGUxNihodywgU1RBVF9UWF9JRFhfVEgsIDEwKTsKKwlza3kyX3dyaXRlOChodywgU1RBVF9GSUZPX1dNLCAxNik7CisKKwkvKiBzZXQgU3RhdHVzLUZJRk8gSVNSIHdhdGVybWFyayAqLworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX1hMICYmIGh3LT5jaGlwX3JldiA9PSAwKQorCQlza3kyX3dyaXRlOChodywgU1RBVF9GSUZPX0lTUl9XTSwgNCk7CisJZWxzZQorCQlza3kyX3dyaXRlOChodywgU1RBVF9GSUZPX0lTUl9XTSwgMTYpOworCisJc2t5Ml93cml0ZTMyKGh3LCBTVEFUX1RYX1RJTUVSX0lOSSwgc2t5Ml91czJjbGsoaHcsIDEwMDApKTsKKwlza3kyX3dyaXRlMzIoaHcsIFNUQVRfSVNSX1RJTUVSX0lOSSwgc2t5Ml91czJjbGsoaHcsIDIwKSk7CisJc2t5Ml93cml0ZTMyKGh3LCBTVEFUX0xFVl9USU1FUl9JTkksIHNreTJfdXMyY2xrKGh3LCAxMDApKTsKKworCS8qIGVuYWJsZSBzdGF0dXMgdW5pdCAqLworCXNreTJfd3JpdGUzMihodywgU1RBVF9DVFJMLCBTQ19TVEFUX09QX09OKTsKKworCXNreTJfd3JpdGU4KGh3LCBTVEFUX1RYX1RJTUVSX0NUUkwsIFRJTV9TVEFSVCk7CisJc2t5Ml93cml0ZTgoaHcsIFNUQVRfTEVWX1RJTUVSX0NUUkwsIFRJTV9TVEFSVCk7CisJc2t5Ml93cml0ZTgoaHcsIFNUQVRfSVNSX1RJTUVSX0NUUkwsIFRJTV9TVEFSVCk7Cit9CisKK3N0YXRpYyB1MzIgc2t5Ml9zdXBwb3J0ZWRfbW9kZXMoY29uc3Qgc3RydWN0IHNreTJfaHcgKmh3KQoreworCWlmIChza3kyX2lzX2NvcHBlcihodykpIHsKKwkJdTMyIG1vZGVzID0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZgorCQkJfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsCisJCQl8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCisJCQl8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsCisJCQl8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX1RQOworCisJCWlmIChody0+ZmxhZ3MgJiBTS1kyX0hXX0dJR0FCSVQpCisJCQltb2RlcyB8PSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYKKwkJCQl8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKwkJcmV0dXJuIG1vZGVzOworCX0gZWxzZQorCQlyZXR1cm4gIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZgorCQkJfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwKKwkJCXwgU1VQUE9SVEVEX0F1dG9uZWcKKwkJCXwgU1VQUE9SVEVEX0ZJQlJFOworfQorCitzdGF0aWMgdm9pZCBza3kyX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBza3kyLT5odzsKKwl1bnNpZ25lZCBwb3J0ID0gc2t5Mi0+cG9ydDsKKwl1MTYgcmVnOworCXU4IGZpbHRlcls4XTsKKwlpbnQgcnhfcGF1c2U7CisKKwlyeF9wYXVzZSA9IChza3kyLT5mbG93X3N0YXR1cyA9PSBGQ19SWCB8fCBza3kyLT5mbG93X3N0YXR1cyA9PSBGQ19CT1RIKTsKKworCXJlZyA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwpOworCXJlZyB8PSBHTV9SWENSX1VDRl9FTkE7CisKKwltZW1zZXQoZmlsdGVyLCAweGZmLCBzaXplb2YoZmlsdGVyKSk7CisKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fTUNfQUREUl9IMSwKKwkJICAgICh1MTYpIGZpbHRlclswXSB8ICgodTE2KSBmaWx0ZXJbMV0gPDwgOCkpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gyLAorCQkgICAgKHUxNikgZmlsdGVyWzJdIHwgKCh1MTYpIGZpbHRlclszXSA8PCA4KSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDMsCisJCSAgICAodTE2KSBmaWx0ZXJbNF0gfCAoKHUxNikgZmlsdGVyWzVdIDw8IDgpKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fTUNfQUREUl9INCwKKwkJICAgICh1MTYpIGZpbHRlcls2XSB8ICgodTE2KSBmaWx0ZXJbN10gPDwgOCkpOworCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsIHJlZyk7Cit9CisKKy8qIEluaXRpYWxpemUgbmV0d29yayBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqc2t5Ml9pbml0X25ldGRldihzdHJ1Y3Qgc2t5Ml9odyAqaHcsCisJCQkJCQkgICAgIHVuc2lnbmVkIHBvcnQpCit7CisJc3RydWN0IHNreTJfcG9ydCAqc2t5MjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpza3kyKSk7CisKKwlpZiAoIWRldikgeworCQlEQkcoUEZYICJldGhlcmRldiBhbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkZXYtPmRldiA9ICZody0+cGRldi0+ZGV2OworCisJc2t5MiA9IG5ldGRldl9wcml2KGRldik7CisJc2t5Mi0+bmV0ZGV2ID0gZGV2OworCXNreTItPmh3ID0gaHc7CisKKwkvKiBBdXRvIHNwZWVkIGFuZCBmbG93IGNvbnRyb2wgKi8KKwlza3kyLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJc2t5Mi0+Zmxvd19tb2RlID0gRkNfQk9USDsKKworCXNreTItPmR1cGxleCA9IC0xOworCXNreTItPnNwZWVkID0gLTE7CisJc2t5Mi0+YWR2ZXJ0aXNpbmcgPSBza3kyX3N1cHBvcnRlZF9tb2Rlcyhodyk7CisKKwlody0+ZGV2W3BvcnRdID0gZGV2OworCisJc2t5Mi0+cG9ydCA9IHBvcnQ7CisKKwkvKiByZWFkIHRoZSBtYWMgYWRkcmVzcyAqLworCW1lbWNweShkZXYtPmh3X2FkZHIsICh2b2lkICopKGh3LT5yZWdzICsgQjJfTUFDXzEgKyBwb3J0ICogOCksIEVUSF9BTEVOKTsKKworCXJldHVybiBkZXY7Cit9CisKK3N0YXRpYyB2b2lkIHNreTJfc2hvd19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJREJHMihQRlggIiVzOiBhZGRyICVzXG4iLCBkZXYtPm5hbWUsIG5ldGRldl9hZGRyKGRldikpOworfQorCisjaWYgREJHTFZMX01BWAorLyogVGhpcyBkcml2ZXIgc3VwcG9ydHMgeXVrb24yIGNoaXBzZXQgb25seSAqLworc3RhdGljIGNvbnN0IGNoYXIgKnNreTJfbmFtZSh1OCBjaGlwaWQsIGNoYXIgKmJ1ZiwgaW50IHN6KQoreworCWNvbnN0IGNoYXIgKm5hbWVbXSA9IHsKKwkJIlhMIiwJCS8qIDB4YjMgKi8KKwkJIkVDIFVsdHJhIiwgCS8qIDB4YjQgKi8KKwkJIkV4dHJlbWUiLAkvKiAweGI1ICovCisJCSJFQyIsCQkvKiAweGI2ICovCisJCSJGRSIsCQkvKiAweGI3ICovCisJCSJGRSsiLAkJLyogMHhiOCAqLworCQkiU3VwcmVtZSIsCS8qIDB4YjkgKi8KKwkJIlVMIDIiLAkJLyogMHhiYSAqLworCX07CisKKwlpZiAoY2hpcGlkID49IENISVBfSURfWVVLT05fWEwgJiYgY2hpcGlkIDw9IENISVBfSURfWVVLT05fVUxfMikKKwkJc3RybmNweShidWYsIG5hbWVbY2hpcGlkIC0gQ0hJUF9JRF9ZVUtPTl9YTF0sIHN6KTsKKwllbHNlCisJCXNucHJpbnRmKGJ1Ziwgc3osICIoY2hpcCAlI3gpIiwgY2hpcGlkKTsKKwlyZXR1cm4gYnVmOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNreTJfbmV0X2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza3kyX2h3ICpodyA9IHNreTItPmh3OworCisJdTMyIGltYXNrID0gc2t5Ml9yZWFkMzIoaHcsIEIwX0lNU0spOworCWlmIChlbmFibGUpCisJCWltYXNrIHw9IHBvcnRpcnFfbXNrW3NreTItPnBvcnRdOworCWVsc2UKKwkJaW1hc2sgJj0gfnBvcnRpcnFfbXNrW3NreTItPnBvcnRdOworCXNreTJfd3JpdGUzMihodywgQjBfSU1TSywgaW1hc2spOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BlcmF0aW9ucyBza3kyX29wZXJhdGlvbnMgPSB7CisJLm9wZW4gICAgID0gc2t5Ml91cCwKKwkuY2xvc2UgICAgPSBza3kyX2Rvd24sCisJLnRyYW5zbWl0ID0gc2t5Ml94bWl0X2ZyYW1lLAorCS5wb2xsICAgICA9IHNreTJfcG9sbCwKKwkuaXJxICAgICAgPSBza3kyX25ldF9pcnEKK307CisKK3N0YXRpYyBpbnQgc2t5Ml9wcm9iZShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwKKwkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCBfX3VudXNlZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBza3kyX2h3ICpodzsKKwlpbnQgZXJyOworCWNoYXIgYnVmMVsxNl0gX191bnVzZWQ7CS8qIG9ubHkgZm9yIGRlYnVnZ2luZyAqLworCisJYWRqdXN0X3BjaV9kZXZpY2UocGRldik7CisKKwllcnIgPSAtRU5PTUVNOworCWh3ID0gemFsbG9jKHNpemVvZigqaHcpKTsKKwlpZiAoIWh3KSB7CisJCURCRyhQRlggImNhbm5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBzdHJ1Y3RcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaHctPnBkZXYgPSBwZGV2OworCisJaHctPnJlZ3MgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKHBjaV9iYXJfc3RhcnQocGRldiwgUENJX0JBU0VfQUREUkVTU18wKSwgMHg0MDAwKTsKKwlpZiAoIWh3LT5yZWdzKSB7CisJCURCRyhQRlggImNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX2h3OworCX0KKworCS8qIHJpbmcgZm9yIHN0YXR1cyByZXNwb25zZXMgKi8KKwlody0+c3RfbGUgPSBtYWxsb2NfZG1hKFNUQVRVU19MRV9CWVRFUywgU1RBVFVTX1JJTkdfQUxJR04pOworCWlmICghaHctPnN0X2xlKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwlody0+c3RfZG1hID0gdmlydF90b19idXMoaHctPnN0X2xlKTsKKwltZW1zZXQoaHctPnN0X2xlLCAwLCBTVEFUVVNfTEVfQllURVMpOworCisJZXJyID0gc2t5Ml9pbml0KGh3KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKworI2lmIERCR0xWTF9NQVgKKwlEQkcyKFBGWCAiWXVrb24tMiAlcyBjaGlwIHJldmlzaW9uICVkXG4iLAorCSAgICAgc2t5Ml9uYW1lKGh3LT5jaGlwX2lkLCBidWYxLCBzaXplb2YoYnVmMSkpLCBody0+Y2hpcF9yZXYpOworI2VuZGlmCisKKwlza3kyX3Jlc2V0KGh3KTsKKworCWRldiA9IHNreTJfaW5pdF9uZXRkZXYoaHcsIDApOworCWlmICghZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX3BjaTsKKwl9CisKKwluZXRkZXZfaW5pdChkZXYsICZza3kyX29wZXJhdGlvbnMpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlEQkcoUEZYICJjYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZVxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisKKwlza3kyX3dyaXRlMzIoaHcsIEIwX0lNU0ssIFkyX0lTX0JBU0UpOworCisJc2t5Ml9zaG93X2FkZHIoZGV2KTsKKworCWlmIChody0+cG9ydHMgPiAxKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYxOworCisJCWRldjEgPSBza3kyX2luaXRfbmV0ZGV2KGh3LCAxKTsKKwkJaWYgKCFkZXYxKQorCQkJREJHKFBGWCAiYWxsb2NhdGlvbiBmb3Igc2Vjb25kIGRldmljZSBmYWlsZWRcbiIpOworCQllbHNlIGlmICgoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldjEpKSkgeworCQkJREJHKFBGWCAicmVnaXN0ZXIgb2Ygc2Vjb25kIHBvcnQgZmFpbGVkICglZClcbiIsIGVycik7CisJCQlody0+ZGV2WzFdID0gTlVMTDsKKwkJCW5ldGRldl9udWxsaWZ5KGRldjEpOworCQkJbmV0ZGV2X3B1dChkZXYxKTsKKwkJfSBlbHNlCisJCQlza3kyX3Nob3dfYWRkcihkZXYxKTsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCW5ldGRldl9udWxsaWZ5KGRldik7CisJbmV0ZGV2X3B1dChkZXYpOworZXJyX291dF9mcmVlX3BjaToKKwlza3kyX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfUlNUX1NFVCk7CisJZnJlZV9kbWEoaHctPnN0X2xlLCBTVEFUVVNfTEVfQllURVMpOworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAoKHZvaWQgKilody0+cmVncyk7CitlcnJfb3V0X2ZyZWVfaHc6CisJZnJlZShodyk7CitlcnJfb3V0OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBza3kyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlpZiAoIWh3KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSBody0+cG9ydHMtMTsgaSA+PSAwOyAtLWkpCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGh3LT5kZXZbaV0pOworCisJc2t5Ml93cml0ZTMyKGh3LCBCMF9JTVNLLCAwKTsKKworCXNreTJfcG93ZXJfYXV4KGh3KTsKKworCXNreTJfd3JpdGUxNihodywgQjBfWTJMRUQsIExFRF9TVEFUX09GRik7CisJc2t5Ml93cml0ZTgoaHcsIEIwX0NUU1QsIENTX1JTVF9TRVQpOworCXNreTJfcmVhZDgoaHcsIEIwX0NUU1QpOworCisJZnJlZV9kbWEoaHctPnN0X2xlLCBTVEFUVVNfTEVfQllURVMpOworCisJZm9yIChpID0gaHctPnBvcnRzLTE7IGkgPj0gMDsgLS1pKSB7CisJCW5ldGRldl9udWxsaWZ5KGh3LT5kZXZbaV0pOworCQluZXRkZXZfcHV0KGh3LT5kZXZbaV0pOworCX0KKworCWlvdW5tYXAoKHZvaWQgKilody0+cmVncyk7CisJZnJlZShodyk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0cnVjdCBwY2lfZHJpdmVyIHNreTJfZHJpdmVyIF9fcGNpX2RyaXZlciA9IHsKKwkuaWRzICAgICAgPSBza3kyX2lkX3RhYmxlLAorCS5pZF9jb3VudCA9IChzaXplb2YgKHNreTJfaWRfdGFibGUpIC8gc2l6ZW9mIChza3kyX2lkX3RhYmxlWzBdKSksCisJLnByb2JlICAgID0gc2t5Ml9wcm9iZSwKKwkucmVtb3ZlICAgPSBza3kyX3JlbW92ZQorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NreTIuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NreTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTYzZmJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc2t5Mi5oCkBAIC0wLDAgKzEsMjE3NiBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgbmV3IE1hcnZlbGwgWXVrb24gMiBkcml2ZXIuCisgKi8KKyNpZm5kZWYgX1NLWTJfSAorI2RlZmluZSBfU0tZMl9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisvKiBBZGRlZCBmb3IgZ1BYRSAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhlc2Ugd2VyZSBkZWZpbmVkIGluIExpbnV4IGV0aHRvb2wuaC4gVGhlaXIgdmFsdWVzIGFyZSBhcmJpdHJhcnk7CisgICB0aGV5IGFpZCBvbmx5IGluIGJvb2trZWVwaW5nIGZvciB0aGUgZHJpdmVyLiAqLworCisjZGVmaW5lIEFVVE9ORUdfRElTQUJMRSAweDAwCisjZGVmaW5lIEFVVE9ORUdfRU5BQkxFIDB4MDEKKworI2RlZmluZSBEVVBMRVhfSEFMRiAgICAweDAwCisjZGVmaW5lIERVUExFWF9GVUxMICAgIDB4MDEKKworI2RlZmluZSBTUEVFRF8xMCAgICAgICAxMAorI2RlZmluZSBTUEVFRF8xMDAgICAgICAxMDAKKyNkZWZpbmUgU1BFRURfMTAwMCAgICAgMTAwMAorCisjZGVmaW5lIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCAgICAgICAoMSA8PCAzKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCAgICAgICgxIDw8IDUpCisKKyNkZWZpbmUgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiAgICAgICAoMSA8PCA0KQorI2RlZmluZSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgU1VQUE9SVEVEX0F1dG9uZWcgICAgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIFNVUFBPUlRFRF9UUCAgICAgICAgICAgICAgICAgICAoMSA8PCA3KQorI2RlZmluZSBTVVBQT1JURURfRklCUkUgICAgICAgICAgICAgICAgKDEgPDwgMTApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFBDSSBjb25maWcgcmVnaXN0ZXJzICovCitlbnVtIHsKKwlQQ0lfREVWX1JFRzEJPSAweDQwLAorCVBDSV9ERVZfUkVHMgk9IDB4NDQsCisJUENJX0RFVl9TVEFUVVMgID0gMHg3YywKKwlQQ0lfREVWX1JFRzMJPSAweDgwLAorCVBDSV9ERVZfUkVHNAk9IDB4ODQsCisJUENJX0RFVl9SRUc1ICAgID0gMHg4OCwKKwlQQ0lfQ0ZHX1JFR18wCT0gMHg5MCwKKwlQQ0lfQ0ZHX1JFR18xCT0gMHg5NCwKK307CisKKy8qIFl1a29uLTIgKi8KK2VudW0gcGNpX2Rldl9yZWdfMSB7CisJUENJX1kyX1BJR19FTkEJID0gMTw8MzEsIC8qIEVuYWJsZSBQbHVnLWluLUdvIChZVUtPTi0yKSAqLworCVBDSV9ZMl9ETExfRElTCSA9IDE8PDMwLCAvKiBEaXNhYmxlIFBDSSBETEwgKFlVS09OLTIpICovCisJUENJX1NXX1BXUl9PTl9SU1Q9IDE8PDMwLCAvKiBTVyBQb3dlciBvbiBSZXNldCAoWXVrb24tRVgpICovCisJUENJX1kyX1BIWTJfQ09NQSA9IDE8PDI5LCAvKiBTZXQgUEhZIDIgdG8gQ29tYSBNb2RlIChZVUtPTi0yKSAqLworCVBDSV9ZMl9QSFkxX0NPTUEgPSAxPDwyOCwgLyogU2V0IFBIWSAxIHRvIENvbWEgTW9kZSAoWVVLT04tMikgKi8KKwlQQ0lfWTJfUEhZMl9QT1dEID0gMTw8MjcsIC8qIFNldCBQSFkgMiB0byBQb3dlciBEb3duIChZVUtPTi0yKSAqLworCVBDSV9ZMl9QSFkxX1BPV0QgPSAxPDwyNiwgLyogU2V0IFBIWSAxIHRvIFBvd2VyIERvd24gKFlVS09OLTIpICovCisJUENJX1kyX1BNRV9MRUdBQ1k9IDE8PDE1LCAvKiBQQ0kgRXhwcmVzcyBsZWdhY3kgcG93ZXIgbWFuYWdlbWVudCBtb2RlICovCisKKwlQQ0lfUEhZX0xOS19USU1fTVNLPSAzTDw8OCwvKiBCaXQgIDkuLiA4OglHUEhZIExpbmsgVHJpZ2dlciBUaW1lciAqLworCVBDSV9FTkFfTDFfRVZFTlQgPSAxPDw3LCAvKiBFbmFibGUgUEVYIEwxIEV2ZW50ICovCisJUENJX0VOQV9HUEhZX0xOSyA9IDE8PDYsIC8qIEVuYWJsZSBQRVggTDEgb24gR1BIWSBMaW5rIGRvd24gKi8KKwlQQ0lfRk9SQ0VfUEVYX0wxID0gMTw8NSwgLyogRm9yY2UgdG8gUEVYIEwxICovCit9OworCitlbnVtIHBjaV9kZXZfcmVnXzIgeworCVBDSV9WUERfV1JfVEhSCT0gMHhmZkw8PDI0LAkvKiBCaXQgMzEuLjI0OglWUEQgV3JpdGUgVGhyZXNob2xkICovCisJUENJX0RFVl9TRUwJPSAweDdmTDw8MTcsCS8qIEJpdCAyMy4uMTc6CUVFUFJPTSBEZXZpY2UgU2VsZWN0ICovCisJUENJX1ZQRF9ST01fU1oJPSA3TDw8MTQsCS8qIEJpdCAxNi4uMTQ6CVZQRCBST00gU2l6ZQkqLworCisJUENJX1BBVENIX0RJUgk9IDB4Zkw8PDgsCS8qIEJpdCAxMS4uIDg6CUV4dCBQYXRjaGVzIGRpciAzLi4wICovCisJUENJX0VYVF9QQVRDSFMJPSAweGZMPDw0LAkvKiBCaXQJNy4uIDQ6CUV4dGVuZGVkIFBhdGNoZXMgMy4uMCAqLworCVBDSV9FTl9EVU1NWV9SRAk9IDE8PDMsCQkvKiBFbmFibGUgRHVtbXkgUmVhZCAqLworCVBDSV9SRVZfREVTQwk9IDE8PDIsCQkvKiBSZXZlcnNlIERlc2MuIEJ5dGVzICovCisKKwlQQ0lfVVNFREFUQTY0CT0gMTw8MCwJCS8qIFVzZSA2NEJpdCBEYXRhIGJ1cyBleHQgKi8KK307CisKKy8qCVBDSV9PVVJfUkVHXzQJCTMyIGJpdAlPdXIgUmVnaXN0ZXIgNCAoWXVrb24tRUNVIG9ubHkpICovCitlbnVtIHBjaV9kZXZfcmVnXzQgeworCQkJCS8qIChMaW5rIFRyYWluaW5nICYgU3RhdHVzIFN0YXRlIE1hY2hpbmUpICovCisJUF9QRVhfTFRTU01fU1RBVF9NU0sJPSAweDdmTDw8MjUsCS8qIEJpdCAzMS4uMjU6CVBFWCBMVFNTTSBNYXNrICovCisjZGVmaW5lIFBfUEVYX0xUU1NNX1NUQVQoeCkJKCh4IDw8IDI1KSAmIFBfUEVYX0xUU1NNX1NUQVRfTVNLKQorCVBfUEVYX0xUU1NNX0wxX1NUQVQJPSAweDM0LAorCVBfUEVYX0xUU1NNX0RFVF9TVEFUCT0gMHgwMSwKKwlQX1RJTUVSX1ZBTFVFX01TSwk9IDB4ZmZMPDwxNiwJLyogQml0IDIzLi4xNjoJVGltZXIgVmFsdWUgTWFzayAqLworCQkJCQkvKiAoQWN0aXZlIFN0YXRlIFBvd2VyIE1hbmFnZW1lbnQpICovCisJUF9GT1JDRV9BU1BNX1JFUVVFU1QJPSAxPDwxNSwgLyogRm9yY2UgQVNQTSBSZXF1ZXN0IChBMSBvbmx5KSAqLworCVBfQVNQTV9HUEhZX0xJTktfRE9XTgk9IDE8PDE0LCAvKiBHUEhZIExpbmsgRG93biAoQTEgb25seSkgKi8KKwlQX0FTUE1fSU5UX0ZJRk9fRU1QVFkJPSAxPDwxMywgLyogSW50ZXJuYWwgRklGTyBFbXB0eSAoQTEgb25seSkgKi8KKwlQX0FTUE1fQ0xLUlVOX1JFUVVFU1QJPSAxPDwxMiwgLyogQ0xLUlVOIFJlcXVlc3QgKEExIG9ubHkpICovCisKKwlQX0FTUE1fRk9SQ0VfQ0xLUkVRX0VOQQk9IDE8PDQsCS8qIEZvcmNlIENMS1JFUSBFbmFibGUgKEExYiBvbmx5KSAqLworCVBfQVNQTV9DTEtSRVFfUEFEX0NUTAk9IDE8PDMsCS8qIENMS1JFUSBQQUQgQ29udHJvbCAoQTEgb25seSkgKi8KKwlQX0FTUE1fQTFfTU9ERV9TRUxFQ1QJPSAxPDwyLAkvKiBBMSBNb2RlIFNlbGVjdCAoQTEgb25seSkgKi8KKwlQX0NMS19HQVRFX1BFWF9VTklUX0VOQQk9IDE8PDEsCS8qIEVuYWJsZSBHYXRlIFBFWCBVbml0IENsb2NrICovCisJUF9DTEtfR0FURV9ST09UX0NPUl9FTkEJPSAxPDwwLAkvKiBFbmFibGUgR2F0ZSBSb290IENvcmUgQ2xvY2sgKi8KKwlQX0FTUE1fQ09OVFJPTF9NU0sJPSBQX0ZPUkNFX0FTUE1fUkVRVUVTVCB8IFBfQVNQTV9HUEhZX0xJTktfRE9XTgorCQkJCSAgfCBQX0FTUE1fQ0xLUlVOX1JFUVVFU1QgfCBQX0FTUE1fSU5UX0ZJRk9fRU1QVFksCit9OworCisvKglQQ0lfT1VSX1JFR181CQkzMiBiaXQJT3VyIFJlZ2lzdGVyIDUgKFl1a29uLUVDVSBvbmx5KSAqLworZW51bSBwY2lfZGV2X3JlZ181IHsKKwkJCQkJLyogQml0IDMxLi4yNzoJZm9yIEEzICYgbGF0ZXIgKi8KKwlQX0NUTF9ESVZfQ09SRV9DTEtfRU5BCT0gMTw8MzEsIC8qIERpdmlkZSBDb3JlIENsb2NrIEVuYWJsZSAqLworCVBfQ1RMX1NSRVNFVF9WTUFJTl9BVgk9IDE8PDMwLCAvKiBTb2Z0IFJlc2V0IGZvciBWbWFpbl9hdiBEZS1HbGl0Y2ggKi8KKwlQX0NUTF9CWVBBU1NfVk1BSU5fQVYJPSAxPDwyOSwgLyogQnlwYXNzIEVuLiBmb3IgVm1haW5fYXYgRGUtR2xpdGNoICovCisJUF9DVExfVElNX1ZNQUlOX0FWX01TSwk9IDM8PDI3LCAvKiBCaXQgMjguLjI3OiBUaW1lciBWbWFpbl9hdiBNYXNrICovCisJCQkJCSAvKiBCaXQgMjYuLjE2OiBSZWxlYXNlIENsb2NrIG9uIEV2ZW50ICovCisJUF9SRUxfUENJRV9SU1RfREVfQVNTCT0gMTw8MjYsIC8qIFBDSWUgUmVzZXQgRGUtQXNzZXJ0ZWQgKi8KKwlQX1JFTF9HUEhZX1JFQ19QQUNLRVQJPSAxPDwyNSwgLyogR1BIWSBSZWNlaXZlZCBQYWNrZXQgKi8KKwlQX1JFTF9JTlRfRklGT19OX0VNUFRZCT0gMTw8MjQsIC8qIEludGVybmFsIEZJRk8gTm90IEVtcHR5ICovCisJUF9SRUxfTUFJTl9QV1JfQVZBSUwJPSAxPDwyMywgLyogTWFpbiBQb3dlciBBdmFpbGFibGUgKi8KKwlQX1JFTF9DTEtSVU5fUkVRX1JFTAk9IDE8PDIyLCAvKiBDTEtSVU4gUmVxdWVzdCBSZWxlYXNlICovCisJUF9SRUxfUENJRV9SRVNFVF9BU1MJPSAxPDwyMSwgLyogUENJZSBSZXNldCBBc3NlcnRlZCAqLworCVBfUkVMX1BNRV9BU1NFUlRFRAk9IDE8PDIwLCAvKiBQTUUgQXNzZXJ0ZWQgKi8KKwlQX1JFTF9QQ0lFX0VYSVRfTDFfU1QJPSAxPDwxOSwgLyogUENJZSBFeGl0IEwxIFN0YXRlICovCisJUF9SRUxfTE9BREVSX05PVF9GSU4JPSAxPDwxOCwgLyogRVBST00gTG9hZGVyIE5vdCBGaW5pc2hlZCAqLworCVBfUkVMX1BDSUVfUlhfRVhfSURMRQk9IDE8PDE3LCAvKiBQQ0llIFJ4IEV4aXQgRWxlY3RyaWNhbCBJZGxlIFN0YXRlICovCisJUF9SRUxfR1BIWV9MSU5LX1VQCT0gMTw8MTYsIC8qIEdQSFkgTGluayBVcCAqLworCisJCQkJCS8qIEJpdCAxMC4uIDA6IE1hc2sgZm9yIEdhdGUgQ2xvY2sgKi8KKwlQX0dBVF9QQ0lFX1JTVF9BU1NFUlRFRAk9IDE8PDEwLC8qIFBDSWUgUmVzZXQgQXNzZXJ0ZWQgKi8KKwlQX0dBVF9HUEhZX05fUkVDX1BBQ0tFVAk9IDE8PDksIC8qIEdQSFkgTm90IFJlY2VpdmVkIFBhY2tldCAqLworCVBfR0FUX0lOVF9GSUZPX0VNUFRZCT0gMTw8OCwgLyogSW50ZXJuYWwgRklGTyBFbXB0eSAqLworCVBfR0FUX01BSU5fUFdSX05fQVZBSUwJPSAxPDw3LCAvKiBNYWluIFBvd2VyIE5vdCBBdmFpbGFibGUgKi8KKwlQX0dBVF9DTEtSVU5fUkVRX1JFTAk9IDE8PDYsIC8qIENMS1JVTiBOb3QgUmVxdWVzdGVkICovCisJUF9HQVRfUENJRV9SRVNFVF9BU1MJPSAxPDw1LCAvKiBQQ0llIFJlc2V0IEFzc2VydGVkICovCisJUF9HQVRfUE1FX0RFX0FTU0VSVEVECT0gMTw8NCwgLyogUE1FIERlLUFzc2VydGVkICovCisJUF9HQVRfUENJRV9FTlRFUl9MMV9TVAk9IDE8PDMsIC8qIFBDSWUgRW50ZXIgTDEgU3RhdGUgKi8KKwlQX0dBVF9MT0FERVJfRklOSVNIRUQJPSAxPDwyLCAvKiBFUFJPTSBMb2FkZXIgRmluaXNoZWQgKi8KKwlQX0dBVF9QQ0lFX1JYX0VMX0lETEUJPSAxPDwxLCAvKiBQQ0llIFJ4IEVsZWN0cmljYWwgSWRsZSBTdGF0ZSAqLworCVBfR0FUX0dQSFlfTElOS19ET1dOCT0gMTw8MCwJLyogR1BIWSBMaW5rIERvd24gKi8KKworCVBDSUVfT1VSNV9FVkVOVF9DTEtfRDNfU0VUID0gUF9SRUxfR1BIWV9SRUNfUEFDS0VUIHwKKwkJCQkgICAgIFBfUkVMX0lOVF9GSUZPX05fRU1QVFkgfAorCQkJCSAgICAgUF9SRUxfUENJRV9FWElUX0wxX1NUIHwKKwkJCQkgICAgIFBfUkVMX1BDSUVfUlhfRVhfSURMRSB8CisJCQkJICAgICBQX0dBVF9HUEhZX05fUkVDX1BBQ0tFVCB8CisJCQkJICAgICBQX0dBVF9JTlRfRklGT19FTVBUWSB8CisJCQkJICAgICBQX0dBVF9QQ0lFX0VOVEVSX0wxX1NUIHwKKwkJCQkgICAgIFBfR0FUX1BDSUVfUlhfRUxfSURMRSwKK307CisKKyMvKglQQ0lfQ0ZHX1JFR18xCQkJMzIgYml0CUNvbmZpZyBSZWdpc3RlciAxIChZdWtvbi1FeHQgb25seSkgKi8KK2VudW0gcGNpX2NmZ19yZWcxIHsKKwlQX0NGMV9ESVNfUkVMX0VWVF9SU1QJPSAxPDwyNCwgLyogRGlzLiBSZWwuIEV2ZW50IGR1cmluZyBQQ0lFIHJlc2V0ICovCisJCQkJCQkJCQkJLyogQml0IDIzLi4yMTogUmVsZWFzZSBDbG9jayBvbiBFdmVudCAqLworCVBfQ0YxX1JFTF9MRFJfTk9UX0ZJTgk9IDE8PDIzLCAvKiBFRVBST00gTG9hZGVyIE5vdCBGaW5pc2hlZCAqLworCVBfQ0YxX1JFTF9WTUFJTl9BVkxCTAk9IDE8PDIyLCAvKiBWbWFpbiBhdmFpbGFibGUgKi8KKwlQX0NGMV9SRUxfUENJRV9SRVNFVAk9IDE8PDIxLCAvKiBQQ0ktRSByZXNldCAqLworCQkJCQkJCQkJCS8qIEJpdCAyMC4uMTg6IEdhdGUgQ2xvY2sgb24gRXZlbnQgKi8KKwlQX0NGMV9HQVRfTERSX05PVF9GSU4JPSAxPDwyMCwgLyogRUVQUk9NIExvYWRlciBGaW5pc2hlZCAqLworCVBfQ0YxX0dBVF9QQ0lFX1JYX0lETEUJPSAxPDwxOSwgLyogUENJLUUgUnggRWxlY3RyaWNhbCBpZGxlICovCisJUF9DRjFfR0FUX1BDSUVfUkVTRVQJPSAxPDwxOCwgLyogUENJLUUgUmVzZXQgKi8KKwlQX0NGMV9QUlNUX1BIWV9DTEtSRVEJPSAxPDwxNywgLyogRW5hYmxlIFBDSS1FIHJzdCAmIFBNMlBIWSBnZW4uIENMS1JFUSAqLworCVBfQ0YxX1BDSUVfUlNUX0NMS1JFUQk9IDE8PDE2LCAvKiBFbmFibGUgUENJLUUgcnN0IGdlbmVyYXRlIENMS1JFUSAqLworCisJUF9DRjFfRU5BX0NGR19MRFJfRE9ORQk9IDE8PDgsIC8qIEVuYWJsZSBjb3JlIGxldmVsIENvbmZpZyBsb2FkZXIgZG9uZSAqLworCisJUF9DRjFfRU5BX1RYQk1VX1JEX0lETEUJPSAxPDwxLCAvKiBFbmFibGUgVFggQk1VIFJlYWQgIElETEUgZm9yIEFTUE0gKi8KKwlQX0NGMV9FTkFfVFhCTVVfV1JfSURMRQk9IDE8PDAsIC8qIEVuYWJsZSBUWCBCTVUgV3JpdGUgSURMRSBmb3IgQVNQTSAqLworCisJUENJRV9DRkcxX0VWRU5UX0NMS19EM19TRVQgPSBQX0NGMV9ESVNfUkVMX0VWVF9SU1QgfAorCQkJCQlQX0NGMV9SRUxfTERSX05PVF9GSU4gfAorCQkJCQlQX0NGMV9SRUxfVk1BSU5fQVZMQkwgfAorCQkJCQlQX0NGMV9SRUxfUENJRV9SRVNFVCB8CisJCQkJCVBfQ0YxX0dBVF9MRFJfTk9UX0ZJTiB8CisJCQkJCVBfQ0YxX0dBVF9QQ0lFX1JFU0VUIHwKKwkJCQkJUF9DRjFfUFJTVF9QSFlfQ0xLUkVRIHwKKwkJCQkJUF9DRjFfRU5BX0NGR19MRFJfRE9ORSB8CisJCQkJCVBfQ0YxX0VOQV9UWEJNVV9SRF9JRExFIHwKKwkJCQkJUF9DRjFfRU5BX1RYQk1VX1dSX0lETEUsCit9OworCisKKyNkZWZpbmUgUENJX1NUQVRVU19FUlJPUl9CSVRTIChQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSB8IFwKKwkJCSAgICAgICBQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IgfCBcCisJCQkgICAgICAgUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUIHwgXAorCQkJICAgICAgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCB8IFwKKwkJCSAgICAgICBQQ0lfU1RBVFVTX1BBUklUWSkKKworZW51bSBjc3JfcmVncyB7CisJQjBfUkFQCQk9IDB4MDAwMCwKKwlCMF9DVFNUCQk9IDB4MDAwNCwKKwlCMF9ZMkxFRAk9IDB4MDAwNSwKKwlCMF9QT1dFUl9DVFJMCT0gMHgwMDA3LAorCUIwX0lTUkMJCT0gMHgwMDA4LAorCUIwX0lNU0sJCT0gMHgwMDBjLAorCUIwX0hXRV9JU1JDCT0gMHgwMDEwLAorCUIwX0hXRV9JTVNLCT0gMHgwMDE0LAorCisJLyogU3BlY2lhbCBJU1IgcmVnaXN0ZXJzIChZdWtvbi0yIG9ubHkpICovCisJQjBfWTJfU1BfSVNSQzIJPSAweDAwMWMsCisJQjBfWTJfU1BfSVNSQzMJPSAweDAwMjAsCisJQjBfWTJfU1BfRUlTUgk9IDB4MDAyNCwKKwlCMF9ZMl9TUF9MSVNSCT0gMHgwMDI4LAorCUIwX1kyX1NQX0lDUgk9IDB4MDAyYywKKworCUIyX01BQ18xCT0gMHgwMTAwLAorCUIyX01BQ18yCT0gMHgwMTA4LAorCUIyX01BQ18zCT0gMHgwMTEwLAorCUIyX0NPTk5fVFlQCT0gMHgwMTE4LAorCUIyX1BNRF9UWVAJPSAweDAxMTksCisJQjJfTUFDX0NGRwk9IDB4MDExYSwKKwlCMl9DSElQX0lECT0gMHgwMTFiLAorCUIyX0VfMAkJPSAweDAxMWMsCisKKwlCMl9ZMl9DTEtfR0FURSAgPSAweDAxMWQsCisJQjJfWTJfSFdfUkVTCT0gMHgwMTFlLAorCUIyX0VfMwkJPSAweDAxMWYsCisJQjJfWTJfQ0xLX0NUUkwJPSAweDAxMjAsCisKKwlCMl9USV9JTkkJPSAweDAxMzAsCisJQjJfVElfVkFMCT0gMHgwMTM0LAorCUIyX1RJX0NUUkwJPSAweDAxMzgsCisJQjJfVElfVEVTVAk9IDB4MDEzOSwKKworCUIyX1RTVF9DVFJMMQk9IDB4MDE1OCwKKwlCMl9UU1RfQ1RSTDIJPSAweDAxNTksCisJQjJfR1BfSU8JPSAweDAxNWMsCisKKwlCMl9JMkNfQ1RSTAk9IDB4MDE2MCwKKwlCMl9JMkNfREFUQQk9IDB4MDE2NCwKKwlCMl9JMkNfSVJRCT0gMHgwMTY4LAorCUIyX0kyQ19TVwk9IDB4MDE2YywKKworCUIzX1JBTV9BRERSCT0gMHgwMTgwLAorCUIzX1JBTV9EQVRBX0xPCT0gMHgwMTg0LAorCUIzX1JBTV9EQVRBX0hJCT0gMHgwMTg4LAorCisvKiBSQU0gSW50ZXJmYWNlIFJlZ2lzdGVycyAqLworLyogWXVrb24tMjogdXNlIFJBTV9CVUZGRVIoKSB0byBhY2Nlc3MgdGhlIFJBTSBidWZmZXIgKi8KKy8qCisgKiBUaGUgSFctU3BlYy4gY2FsbHMgdGhpcyByZWdpc3RlcnMgVGltZW91dCBWYWx1ZSAwLi4xMS4gQnV0IHRoaXMgbmFtZXMgYXJlCisgKiBub3QgdXNhYmxlIGluIFNXLiBQbGVhc2Ugbm90aWNlIHRoZXNlIGFyZSBOT1QgcmVhbCB0aW1lb3V0cywgdGhlc2UgYXJlCisgKiB0aGUgbnVtYmVyIG9mIHFXb3JkcyB0cmFuc2ZlcnJlZCBjb250aW51b3VzbHkuCisgKi8KKyNkZWZpbmUgUkFNX0JVRkZFUihwb3J0LCByZWcpCShyZWcgfCAocG9ydCA8PDYpKQorCisJQjNfUklfV1RPX1IxCT0gMHgwMTkwLAorCUIzX1JJX1dUT19YQTEJPSAweDAxOTEsCisJQjNfUklfV1RPX1hTMQk9IDB4MDE5MiwKKwlCM19SSV9SVE9fUjEJPSAweDAxOTMsCisJQjNfUklfUlRPX1hBMQk9IDB4MDE5NCwKKwlCM19SSV9SVE9fWFMxCT0gMHgwMTk1LAorCUIzX1JJX1dUT19SMgk9IDB4MDE5NiwKKwlCM19SSV9XVE9fWEEyCT0gMHgwMTk3LAorCUIzX1JJX1dUT19YUzIJPSAweDAxOTgsCisJQjNfUklfUlRPX1IyCT0gMHgwMTk5LAorCUIzX1JJX1JUT19YQTIJPSAweDAxOWEsCisJQjNfUklfUlRPX1hTMgk9IDB4MDE5YiwKKwlCM19SSV9UT19WQUwJPSAweDAxOWMsCisJQjNfUklfQ1RSTAk9IDB4MDFhMCwKKwlCM19SSV9URVNUCT0gMHgwMWEyLAorCUIzX01BX1RPSU5JX1JYMQk9IDB4MDFiMCwKKwlCM19NQV9UT0lOSV9SWDIJPSAweDAxYjEsCisJQjNfTUFfVE9JTklfVFgxCT0gMHgwMWIyLAorCUIzX01BX1RPSU5JX1RYMgk9IDB4MDFiMywKKwlCM19NQV9UT1ZBTF9SWDEJPSAweDAxYjQsCisJQjNfTUFfVE9WQUxfUlgyCT0gMHgwMWI1LAorCUIzX01BX1RPVkFMX1RYMQk9IDB4MDFiNiwKKwlCM19NQV9UT1ZBTF9UWDIJPSAweDAxYjcsCisJQjNfTUFfVE9fQ1RSTAk9IDB4MDFiOCwKKwlCM19NQV9UT19URVNUCT0gMHgwMWJhLAorCUIzX01BX1JDSU5JX1JYMQk9IDB4MDFjMCwKKwlCM19NQV9SQ0lOSV9SWDIJPSAweDAxYzEsCisJQjNfTUFfUkNJTklfVFgxCT0gMHgwMWMyLAorCUIzX01BX1JDSU5JX1RYMgk9IDB4MDFjMywKKwlCM19NQV9SQ1ZBTF9SWDEJPSAweDAxYzQsCisJQjNfTUFfUkNWQUxfUlgyCT0gMHgwMWM1LAorCUIzX01BX1JDVkFMX1RYMQk9IDB4MDFjNiwKKwlCM19NQV9SQ1ZBTF9UWDIJPSAweDAxYzcsCisJQjNfTUFfUkNfQ1RSTAk9IDB4MDFjOCwKKwlCM19NQV9SQ19URVNUCT0gMHgwMWNhLAorCUIzX1BBX1RPSU5JX1JYMQk9IDB4MDFkMCwKKwlCM19QQV9UT0lOSV9SWDIJPSAweDAxZDQsCisJQjNfUEFfVE9JTklfVFgxCT0gMHgwMWQ4LAorCUIzX1BBX1RPSU5JX1RYMgk9IDB4MDFkYywKKwlCM19QQV9UT1ZBTF9SWDEJPSAweDAxZTAsCisJQjNfUEFfVE9WQUxfUlgyCT0gMHgwMWU0LAorCUIzX1BBX1RPVkFMX1RYMQk9IDB4MDFlOCwKKwlCM19QQV9UT1ZBTF9UWDIJPSAweDAxZWMsCisJQjNfUEFfQ1RSTAk9IDB4MDFmMCwKKwlCM19QQV9URVNUCT0gMHgwMWYyLAorCisJWTJfQ0ZHX1NQQwk9IDB4MWMwMCwJLyogUENJIGNvbmZpZyBzcGFjZSByZWdpb24gKi8KKwlZMl9DRkdfQUVSICAgICAgPSAweDFkMDAsCS8qIFBDSSBBZHZhbmNlZCBFcnJvciBSZXBvcnQgcmVnaW9uICovCit9OworCisvKglCMF9DVFNUCQkJMTYgYml0CUNvbnRyb2wvU3RhdHVzIHJlZ2lzdGVyICovCitlbnVtIHsKKwlZMl9WTUFJTl9BVkFJTAk9IDE8PDE3LC8qIFZNQUlOIGF2YWlsYWJsZSAoWVVLT04tMiBvbmx5KSAqLworCVkyX1ZBVVhfQVZBSUwJPSAxPDwxNiwvKiBWQVVYIGF2YWlsYWJsZSAoWVVLT04tMiBvbmx5KSAqLworCVkyX0hXX1dPTF9PTgk9IDE8PDE1LC8qIEhXIFdPTCBPbiAgKFl1a29uLUVDIFVsdHJhIEExIG9ubHkpICovCisJWTJfSFdfV09MX09GRgk9IDE8PDE0LC8qIEhXIFdPTCBPbiAgKFl1a29uLUVDIFVsdHJhIEExIG9ubHkpICovCisJWTJfQVNGX0VOQUJMRQk9IDE8PDEzLC8qIEFTRiBVbml0IEVuYWJsZSAoWVVLT04tMiBvbmx5KSAqLworCVkyX0FTRl9ESVNBQkxFCT0gMTw8MTIsLyogQVNGIFVuaXQgRGlzYWJsZSAoWVVLT04tMiBvbmx5KSAqLworCVkyX0NMS19SVU5fRU5BCT0gMTw8MTEsLyogQ0xLX1JVTiBFbmFibGUgIChZVUtPTi0yIG9ubHkpICovCisJWTJfQ0xLX1JVTl9ESVMJPSAxPDwxMCwvKiBDTEtfUlVOIERpc2FibGUgKFlVS09OLTIgb25seSkgKi8KKwlZMl9MRURfU1RBVF9PTgk9IDE8PDksIC8qIFN0YXR1cyBMRUQgT24gIChZVUtPTi0yIG9ubHkpICovCisJWTJfTEVEX1NUQVRfT0ZGCT0gMTw8OCwgLyogU3RhdHVzIExFRCBPZmYgKFlVS09OLTIgb25seSkgKi8KKworCUNTX1NUX1NXX0lSUQk9IDE8PDcsCS8qIFNldCBJUlEgU1cgUmVxdWVzdCAqLworCUNTX0NMX1NXX0lSUQk9IDE8PDYsCS8qIENsZWFyIElSUSBTVyBSZXF1ZXN0ICovCisJQ1NfU1RPUF9ET05FCT0gMTw8NSwJLyogU3RvcCBNYXN0ZXIgaXMgZmluaXNoZWQgKi8KKwlDU19TVE9QX01BU1QJPSAxPDw0LAkvKiBDb21tYW5kIEJpdCB0byBzdG9wIHRoZSBtYXN0ZXIgKi8KKwlDU19NUlNUX0NMUgk9IDE8PDMsCS8qIENsZWFyIE1hc3RlciByZXNldAkqLworCUNTX01SU1RfU0VUCT0gMTw8MiwJLyogU2V0IE1hc3RlciByZXNldAkqLworCUNTX1JTVF9DTFIJPSAxPDwxLAkvKiBDbGVhciBTb2Z0d2FyZSByZXNldAkqLworCUNTX1JTVF9TRVQJPSAxLAkvKiBTZXQgICBTb2Z0d2FyZSByZXNldAkqLworfTsKKworLyoJQjBfTEVECQkJIDggQml0CUxFRCByZWdpc3RlciAqLworZW51bSB7CisvKiBCaXQgIDcuLiAyOglyZXNlcnZlZCAqLworCUxFRF9TVEFUX09OCT0gMTw8MSwJLyogU3RhdHVzIExFRCBvbgkqLworCUxFRF9TVEFUX09GRgk9IDEsCS8qIFN0YXR1cyBMRUQgb2ZmCSovCit9OworCisvKglCMF9QT1dFUl9DVFJMCSA4IEJpdAlQb3dlciBDb250cm9sIHJlZyAoWVVLT04gb25seSkgKi8KK2VudW0geworCVBDX1ZBVVhfRU5BCT0gMTw8NywJLyogU3dpdGNoIFZBVVggRW5hYmxlICAqLworCVBDX1ZBVVhfRElTCT0gMTw8NiwJLyogU3dpdGNoIFZBVVggRGlzYWJsZSAqLworCVBDX1ZDQ19FTkEJPSAxPDw1LAkvKiBTd2l0Y2ggVkNDIEVuYWJsZSAgKi8KKwlQQ19WQ0NfRElTCT0gMTw8NCwJLyogU3dpdGNoIFZDQyBEaXNhYmxlICovCisJUENfVkFVWF9PTgk9IDE8PDMsCS8qIFN3aXRjaCBWQVVYIE9uICAqLworCVBDX1ZBVVhfT0ZGCT0gMTw8MiwJLyogU3dpdGNoIFZBVVggT2ZmICovCisJUENfVkNDX09OCT0gMTw8MSwJLyogU3dpdGNoIFZDQyBPbiAgKi8KKwlQQ19WQ0NfT0ZGCT0gMTw8MCwJLyogU3dpdGNoIFZDQyBPZmYgKi8KK307CisKKy8qCUIyX0lSUU1fTVNLIAkzMiBiaXQJSVJRIE1vZGVyYXRpb24gTWFzayAqLworCisvKglCMF9ZMl9TUF9JU1JDMgkzMiBiaXQJU3BlY2lhbCBJbnRlcnJ1cHQgU291cmNlIFJlZyAyICovCisvKglCMF9ZMl9TUF9JU1JDMwkzMiBiaXQJU3BlY2lhbCBJbnRlcnJ1cHQgU291cmNlIFJlZyAzICovCisvKglCMF9ZMl9TUF9FSVNSCTMyIGJpdAlFbnRlciBJU1IgUmVnICovCisvKglCMF9ZMl9TUF9MSVNSCTMyIGJpdAlMZWF2ZSBJU1IgUmVnICovCitlbnVtIHsKKwlZMl9JU19IV19FUlIJPSAxPDwzMSwJLyogSW50ZXJydXB0IEhXIEVycm9yICovCisJWTJfSVNfU1RBVF9CTVUJPSAxPDwzMCwJLyogU3RhdHVzIEJNVSBJbnRlcnJ1cHQgKi8KKwlZMl9JU19BU0YJPSAxPDwyOSwJLyogQVNGIHN1YnN5c3RlbSBJbnRlcnJ1cHQgKi8KKworCVkyX0lTX1BPTExfQ0hLCT0gMTw8MjcsCS8qIENoZWNrIElSUSBmcm9tIHBvbGxpbmcgdW5pdCAqLworCVkyX0lTX1RXU0lfUkRZCT0gMTw8MjYsCS8qIElSUSBvbiBlbmQgb2YgVFdTSSBUeCAqLworCVkyX0lTX0lSUV9TVwk9IDE8PDI1LAkvKiBTVyBmb3JjZWQgSVJRCSovCisJWTJfSVNfVElNSU5UCT0gMTw8MjQsCS8qIElSUSBmcm9tIFRpbWVyCSovCisKKwlZMl9JU19JUlFfUEhZMgk9IDE8PDEyLAkvKiBJbnRlcnJ1cHQgZnJvbSBQSFkgMiAqLworCVkyX0lTX0lSUV9NQUMyCT0gMTw8MTEsCS8qIEludGVycnVwdCBmcm9tIE1BQyAyICovCisJWTJfSVNfQ0hLX1JYMgk9IDE8PDEwLAkvKiBEZXNjcmlwdG9yIGVycm9yIFJ4IDIgKi8KKwlZMl9JU19DSEtfVFhTMgk9IDE8PDksCQkvKiBEZXNjcmlwdG9yIGVycm9yIFRYUyAyICovCisJWTJfSVNfQ0hLX1RYQTIJPSAxPDw4LAkJLyogRGVzY3JpcHRvciBlcnJvciBUWEEgMiAqLworCisJWTJfSVNfSVJRX1BIWTEJPSAxPDw0LAkJLyogSW50ZXJydXB0IGZyb20gUEhZIDEgKi8KKwlZMl9JU19JUlFfTUFDMQk9IDE8PDMsCQkvKiBJbnRlcnJ1cHQgZnJvbSBNQUMgMSAqLworCVkyX0lTX0NIS19SWDEJPSAxPDwyLAkJLyogRGVzY3JpcHRvciBlcnJvciBSeCAxICovCisJWTJfSVNfQ0hLX1RYUzEJPSAxPDwxLAkJLyogRGVzY3JpcHRvciBlcnJvciBUWFMgMSAqLworCVkyX0lTX0NIS19UWEExCT0gMTw8MCwJCS8qIERlc2NyaXB0b3IgZXJyb3IgVFhBIDEgKi8KKworCVkyX0lTX0JBU0UJPSBZMl9JU19IV19FUlIgfCBZMl9JU19TVEFUX0JNVSwKKwlZMl9JU19QT1JUXzEJPSBZMl9JU19JUlFfUEhZMSB8IFkyX0lTX0lSUV9NQUMxCisJCSAgICAgICAgICB8IFkyX0lTX0NIS19UWEExIHwgWTJfSVNfQ0hLX1JYMSwKKwlZMl9JU19QT1JUXzIJPSBZMl9JU19JUlFfUEhZMiB8IFkyX0lTX0lSUV9NQUMyCisJCQkgIHwgWTJfSVNfQ0hLX1RYQTIgfCBZMl9JU19DSEtfUlgyLAorCVkyX0lTX0VSUk9SICAgICA9IFkyX0lTX0hXX0VSUiB8CisJCQkgIFkyX0lTX0lSUV9NQUMxIHwgWTJfSVNfQ0hLX1RYQTEgfCBZMl9JU19DSEtfUlgxIHwKKwkJCSAgWTJfSVNfSVJRX01BQzIgfCBZMl9JU19DSEtfVFhBMiB8IFkyX0lTX0NIS19SWDIsCit9OworCisvKglCMl9JUlFNX0hXRV9NU0sJMzIgYml0CUlSUSBNb2RlcmF0aW9uIEhXIEVycm9yIE1hc2sgKi8KK2VudW0geworCUlTX0VSUl9NU0sJPSAweDAwMDAzZmZmLC8qIAkJQWxsIEVycm9yIGJpdHMgKi8KKworCUlTX0lSUV9USVNUX09WCT0gMTw8MTMsIC8qIFRpbWUgU3RhbXAgVGltZXIgT3ZlcmZsb3cgKFlVS09OIG9ubHkpICovCisJSVNfSVJRX1NFTlNPUgk9IDE8PDEyLCAvKiBJUlEgZnJvbSBTZW5zb3IgKFlVS09OIG9ubHkpICovCisJSVNfSVJRX01TVF9FUlIJPSAxPDwxMSwgLyogSVJRIG1hc3RlciBlcnJvciBkZXRlY3RlZCAqLworCUlTX0lSUV9TVEFUCT0gMTw8MTAsIC8qIElSUSBzdGF0dXMgZXhjZXB0aW9uICovCisJSVNfTk9fU1RBVF9NMQk9IDE8PDksCS8qIE5vIFJ4IFN0YXR1cyBmcm9tIE1BQyAxICovCisJSVNfTk9fU1RBVF9NMgk9IDE8PDgsCS8qIE5vIFJ4IFN0YXR1cyBmcm9tIE1BQyAyICovCisJSVNfTk9fVElTVF9NMQk9IDE8PDcsCS8qIE5vIFRpbWUgU3RhbXAgZnJvbSBNQUMgMSAqLworCUlTX05PX1RJU1RfTTIJPSAxPDw2LAkvKiBObyBUaW1lIFN0YW1wIGZyb20gTUFDIDIgKi8KKwlJU19SQU1fUkRfUEFSCT0gMTw8NSwJLyogUkFNIFJlYWQgIFBhcml0eSBFcnJvciAqLworCUlTX1JBTV9XUl9QQVIJPSAxPDw0LAkvKiBSQU0gV3JpdGUgUGFyaXR5IEVycm9yICovCisJSVNfTTFfUEFSX0VSUgk9IDE8PDMsCS8qIE1BQyAxIFBhcml0eSBFcnJvciAqLworCUlTX00yX1BBUl9FUlIJPSAxPDwyLAkvKiBNQUMgMiBQYXJpdHkgRXJyb3IgKi8KKwlJU19SMV9QQVJfRVJSCT0gMTw8MSwJLyogUXVldWUgUjEgUGFyaXR5IEVycm9yICovCisJSVNfUjJfUEFSX0VSUgk9IDE8PDAsCS8qIFF1ZXVlIFIyIFBhcml0eSBFcnJvciAqLworfTsKKworLyogSGFyZHdhcmUgZXJyb3IgaW50ZXJydXB0IG1hc2sgZm9yIFl1a29uIDIgKi8KK2VudW0geworCVkyX0lTX1RJU1RfT1YJPSAxPDwyOSwvKiBUaW1lIFN0YW1wIFRpbWVyIG92ZXJmbG93IGludGVycnVwdCAqLworCVkyX0lTX1NFTlNPUgk9IDE8PDI4LCAvKiBTZW5zb3IgaW50ZXJydXB0ICovCisJWTJfSVNfTVNUX0VSUgk9IDE8PDI3LCAvKiBNYXN0ZXIgZXJyb3IgaW50ZXJydXB0ICovCisJWTJfSVNfSVJRX1NUQVQJPSAxPDwyNiwgLyogU3RhdHVzIGV4Y2VwdGlvbiBpbnRlcnJ1cHQgKi8KKwlZMl9JU19QQ0lfRVhQCT0gMTw8MjUsIC8qIFBDSS1FeHByZXNzIGludGVycnVwdCAqLworCVkyX0lTX1BDSV9ORVhQCT0gMTw8MjQsIC8qIFBDSS1FeHByZXNzIGVycm9yIHNpbWlsYXIgdG8gUENJIGVycm9yICovCisJCQkJCQkvKiBMaW5rIDIgKi8KKwlZMl9JU19QQVJfUkQyCT0gMTw8MTMsIC8qIFJlYWQgUkFNIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgKi8KKwlZMl9JU19QQVJfV1IyCT0gMTw8MTIsIC8qIFdyaXRlIFJBTSBwYXJpdHkgZXJyb3IgaW50ZXJydXB0ICovCisJWTJfSVNfUEFSX01BQzIJPSAxPDwxMSwgLyogTUFDIGhhcmR3YXJlIGZhdWx0IGludGVycnVwdCAqLworCVkyX0lTX1BBUl9SWDIJPSAxPDwxMCwgLyogUGFyaXR5IEVycm9yIFJ4IFF1ZXVlIDIgKi8KKwlZMl9JU19UQ1BfVFhTMgk9IDE8PDksIC8qIFRDUCBsZW5ndGggbWlzbWF0Y2ggc3luYyBUeCBxdWV1ZSBJUlEgKi8KKwlZMl9JU19UQ1BfVFhBMgk9IDE8PDgsIC8qIFRDUCBsZW5ndGggbWlzbWF0Y2ggYXN5bmMgVHggcXVldWUgSVJRICovCisJCQkJCQkvKiBMaW5rIDEgKi8KKwlZMl9JU19QQVJfUkQxCT0gMTw8NSwgLyogUmVhZCBSQU0gcGFyaXR5IGVycm9yIGludGVycnVwdCAqLworCVkyX0lTX1BBUl9XUjEJPSAxPDw0LCAvKiBXcml0ZSBSQU0gcGFyaXR5IGVycm9yIGludGVycnVwdCAqLworCVkyX0lTX1BBUl9NQUMxCT0gMTw8MywgLyogTUFDIGhhcmR3YXJlIGZhdWx0IGludGVycnVwdCAqLworCVkyX0lTX1BBUl9SWDEJPSAxPDwyLCAvKiBQYXJpdHkgRXJyb3IgUnggUXVldWUgMSAqLworCVkyX0lTX1RDUF9UWFMxCT0gMTw8MSwgLyogVENQIGxlbmd0aCBtaXNtYXRjaCBzeW5jIFR4IHF1ZXVlIElSUSAqLworCVkyX0lTX1RDUF9UWEExCT0gMTw8MCwgLyogVENQIGxlbmd0aCBtaXNtYXRjaCBhc3luYyBUeCBxdWV1ZSBJUlEgKi8KKworCVkyX0hXRV9MMV9NQVNLCT0gWTJfSVNfUEFSX1JEMSB8IFkyX0lTX1BBUl9XUjEgfCBZMl9JU19QQVJfTUFDMSB8CisJCQkgIFkyX0lTX1BBUl9SWDEgfCBZMl9JU19UQ1BfVFhTMXwgWTJfSVNfVENQX1RYQTEsCisJWTJfSFdFX0wyX01BU0sJPSBZMl9JU19QQVJfUkQyIHwgWTJfSVNfUEFSX1dSMiB8IFkyX0lTX1BBUl9NQUMyIHwKKwkJCSAgWTJfSVNfUEFSX1JYMiB8IFkyX0lTX1RDUF9UWFMyfCBZMl9JU19UQ1BfVFhBMiwKKworCVkyX0hXRV9BTExfTUFTSwk9IFkyX0lTX1RJU1RfT1YgfCBZMl9JU19NU1RfRVJSIHwgWTJfSVNfSVJRX1NUQVQgfAorCQkJICBZMl9IV0VfTDFfTUFTSyB8IFkyX0hXRV9MMl9NQVNLLAorfTsKKworLyoJQjI4X0RQVF9DVFJMCSA4IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgQ3RybCBSZWcgKi8KK2VudW0geworCURQVF9TVEFSVAk9IDE8PDEsCisJRFBUX1NUT1AJPSAxPDwwLAorfTsKKworLyoJQjJfVFNUX0NUUkwxCSA4IGJpdAlUZXN0IENvbnRyb2wgUmVnaXN0ZXIgMSAqLworZW51bSB7CisJVFNUX0ZSQ19EUEVSUl9NUiA9IDE8PDcsIC8qIGZvcmNlIERBVEFQRVJSIG9uIE1TVCBSRCAqLworCVRTVF9GUkNfRFBFUlJfTVcgPSAxPDw2LCAvKiBmb3JjZSBEQVRBUEVSUiBvbiBNU1QgV1IgKi8KKwlUU1RfRlJDX0RQRVJSX1RSID0gMTw8NSwgLyogZm9yY2UgREFUQVBFUlIgb24gVFJHIFJEICovCisJVFNUX0ZSQ19EUEVSUl9UVyA9IDE8PDQsIC8qIGZvcmNlIERBVEFQRVJSIG9uIFRSRyBXUiAqLworCVRTVF9GUkNfQVBFUlJfTQkgPSAxPDwzLCAvKiBmb3JjZSBBRERSUEVSUiBvbiBNU1QgKi8KKwlUU1RfRlJDX0FQRVJSX1QJID0gMTw8MiwgLyogZm9yY2UgQUREUlBFUlIgb24gVFJHICovCisJVFNUX0NGR19XUklURV9PTiA9IDE8PDEsIC8qIEVuYWJsZSAgQ29uZmlnIFJlZyBXUiAqLworCVRTVF9DRkdfV1JJVEVfT0ZGPSAxPDwwLCAvKiBEaXNhYmxlIENvbmZpZyBSZWcgV1IgKi8KK307CisKKy8qIAlCMl9HUElPICovCitlbnVtIHsKKwlHTEJfR1BJT19DTEtfREVCX0VOQSA9IDE8PDMxLAkvKiBDbG9jayBEZWJ1ZyBFbmFibGUgKi8KKwlHTEJfR1BJT19DTEtfREJHX01TSyA9IDB4Zjw8MjYsIC8qIENsb2NrIERlYnVnICovCisKKwlHTEJfR1BJT19JTlRfUlNUX0QzX0RJUyA9IDE8PDE1LCAvKiBEaXNhYmxlIEludGVybmFsIFJlc2V0IEFmdGVyIEQzIHRvIEQwICovCisJR0xCX0dQSU9fTEVEX1BBRF9TUEVFRF9VUCA9IDE8PDE0LCAvKiBMRUQgUEFEIFNwZWVkIFVwICovCisJR0xCX0dQSU9fU1RBVF9SQUNFX0RJUwk9IDE8PDEzLCAvKiBTdGF0dXMgUmFjZSBEaXNhYmxlICovCisJR0xCX0dQSU9fVEVTVF9TRUxfTVNLCT0gMzw8MTEsIC8qIFRlc3Rtb2RlIFNlbGVjdCAqLworCUdMQl9HUElPX1RFU1RfU0VMX0JBU0UJPSAxPDwxMSwKKwlHTEJfR1BJT19SQU5EX0VOQQk9IDE8PDEwLCAvKiBSYW5kb20gRW5hYmxlICovCisJR0xCX0dQSU9fUkFORF9CSVRfMQk9IDE8PDksICAvKiBSYW5kb20gQml0IDEgKi8KK307CisKKy8qCUIyX01BQ19DRkcJCSA4IGJpdAlNQUMgQ29uZmlndXJhdGlvbiAvIENoaXAgUmV2aXNpb24gKi8KK2VudW0geworCUNGR19DSElQX1JfTVNLCSAgPSAweGY8PDQsCS8qIEJpdCA3Li4gNDogQ2hpcCBSZXZpc2lvbiAqLworCQkJCQkvKiBCaXQgMy4uIDI6CXJlc2VydmVkICovCisJQ0ZHX0RJU19NMl9DTEsJICA9IDE8PDEsCS8qIERpc2FibGUgQ2xvY2sgZm9yIDJuZCBNQUMgKi8KKwlDRkdfU05HX01BQwkgID0gMTw8MCwJLyogTUFDIENvbmZpZzogMD0yIE1BQ3MgLyAxPTEgTUFDKi8KK307CisKKy8qCUIyX0NISVBfSUQJCSA4IGJpdCAJQ2hpcCBJZGVudGlmaWNhdGlvbiBOdW1iZXIgKi8KK2VudW0geworCUNISVBfSURfWVVLT05fWEwgICA9IDB4YjMsIC8qIFlVS09OLTIgWEwgKi8KKwlDSElQX0lEX1lVS09OX0VDX1UgPSAweGI0LCAvKiBZVUtPTi0yIEVDIFVsdHJhICovCisJQ0hJUF9JRF9ZVUtPTl9FWCAgID0gMHhiNSwgLyogWVVLT04tMiBFeHRyZW1lICovCisJQ0hJUF9JRF9ZVUtPTl9FQyAgID0gMHhiNiwgLyogWVVLT04tMiBFQyAqLworCUNISVBfSURfWVVLT05fRkUgICA9IDB4YjcsIC8qIFlVS09OLTIgRkUgKi8KKwlDSElQX0lEX1lVS09OX0ZFX1AgPSAweGI4LCAvKiBZVUtPTi0yIEZFKyAqLworCUNISVBfSURfWVVLT05fU1VQUiA9IDB4YjksIC8qIFlVS09OLTIgU3VwcmVtZSAqLworCUNISVBfSURfWVVLT05fVUxfMiA9IDB4YmEsIC8qIFlVS09OLTIgVWx0cmEgMiAqLworfTsKK2VudW0geXVrb25fZWNfcmV2IHsKKwlDSElQX1JFVl9ZVV9FQ19BMSAgICA9IDAsICAvKiBDaGlwIFJldi4gZm9yIFl1a29uLUVDIEExL0EwICovCisJQ0hJUF9SRVZfWVVfRUNfQTIgICAgPSAxLCAgLyogQ2hpcCBSZXYuIGZvciBZdWtvbi1FQyBBMiAqLworCUNISVBfUkVWX1lVX0VDX0EzICAgID0gMiwgIC8qIENoaXAgUmV2LiBmb3IgWXVrb24tRUMgQTMgKi8KK307CitlbnVtIHl1a29uX2VjX3VfcmV2IHsKKwlDSElQX1JFVl9ZVV9FQ19VX0EwICA9IDEsCisJQ0hJUF9SRVZfWVVfRUNfVV9BMSAgPSAyLAorCUNISVBfUkVWX1lVX0VDX1VfQjAgID0gMywKK307CitlbnVtIHl1a29uX2ZlX3JldiB7CisJQ0hJUF9SRVZfWVVfRkVfQTEgICAgPSAxLAorCUNISVBfUkVWX1lVX0ZFX0EyICAgID0gMiwKK307CitlbnVtIHl1a29uX2ZlX3BfcmV2IHsKKwlDSElQX1JFVl9ZVV9GRTJfQTAgICA9IDAsCit9OworZW51bSB5dWtvbl9leF9yZXYgeworCUNISVBfUkVWX1lVX0VYX0EwICAgID0gMSwKKwlDSElQX1JFVl9ZVV9FWF9CMCAgICA9IDIsCit9OworZW51bSB5dWtvbl9zdXByX3JldiB7CisJQ0hJUF9SRVZfWVVfU1VfQTAgICAgPSAwLAorfTsKKworCisvKglCMl9ZMl9DTEtfR0FURQkgOCBiaXQJQ2xvY2sgR2F0aW5nIChZdWtvbi0yIG9ubHkpICovCitlbnVtIHsKKwlZMl9TVEFUVVNfTE5LMl9JTkFDCT0gMTw8NywgLyogU3RhdHVzIExpbmsgMiBpbmFjdGl2ZSAoMCA9IGFjdGl2ZSkgKi8KKwlZMl9DTEtfR0FUX0xOSzJfRElTCT0gMTw8NiwgLyogRGlzYWJsZSBjbG9jayBnYXRpbmcgTGluayAyICovCisJWTJfQ09SX0NMS19MTksyX0RJUwk9IDE8PDUsIC8qIERpc2FibGUgQ29yZSBjbG9jayBMaW5rIDIgKi8KKwlZMl9QQ0lfQ0xLX0xOSzJfRElTCT0gMTw8NCwgLyogRGlzYWJsZSBQQ0kgY2xvY2sgTGluayAyICovCisJWTJfU1RBVFVTX0xOSzFfSU5BQwk9IDE8PDMsIC8qIFN0YXR1cyBMaW5rIDEgaW5hY3RpdmUgKDAgPSBhY3RpdmUpICovCisJWTJfQ0xLX0dBVF9MTksxX0RJUwk9IDE8PDIsIC8qIERpc2FibGUgY2xvY2sgZ2F0aW5nIExpbmsgMSAqLworCVkyX0NPUl9DTEtfTE5LMV9ESVMJPSAxPDwxLCAvKiBEaXNhYmxlIENvcmUgY2xvY2sgTGluayAxICovCisJWTJfUENJX0NMS19MTksxX0RJUwk9IDE8PDAsIC8qIERpc2FibGUgUENJIGNsb2NrIExpbmsgMSAqLworfTsKKworLyoJQjJfWTJfSFdfUkVTCTggYml0CUhXIFJlc291cmNlcyAoWXVrb24tMiBvbmx5KSAqLworZW51bSB7CisJQ0ZHX0xFRF9NT0RFX01TSwk9IDc8PDIsCS8qIEJpdCAgNC4uIDI6CUxFRCBNb2RlIE1hc2sgKi8KKwlDRkdfTElOS18yX0FWQUlMCT0gMTw8MSwJLyogTGluayAyIGF2YWlsYWJsZSAqLworCUNGR19MSU5LXzFfQVZBSUwJPSAxPDwwLAkvKiBMaW5rIDEgYXZhaWxhYmxlICovCit9OworI2RlZmluZSBDRkdfTEVEX01PREUoeCkJCSgoKHgpICYgQ0ZHX0xFRF9NT0RFX01TSykgPj4gMikKKyNkZWZpbmUgQ0ZHX0RVQUxfTUFDX01TSwkoQ0ZHX0xJTktfMl9BVkFJTCB8IENGR19MSU5LXzFfQVZBSUwpCisKKworLyogQjJfWTJfQ0xLX0NUUkwJMzIgYml0CUNsb2NrIEZyZXF1ZW5jeSBDb250cm9sIFJlZ2lzdGVyIChZdWtvbi0yL0VDKSAqLworZW51bSB7CisJWTJfQ0xLX0RJVl9WQUxfTVNLCT0gMHhmZjw8MTYsLyogQml0IDIzLi4xNjogQ2xvY2sgRGl2aXNvciBWYWx1ZSAqLworI2RlZmluZQlZMl9DTEtfRElWX1ZBTCh4KQkoKCh4KTw8MTYpICYgWTJfQ0xLX0RJVl9WQUxfTVNLKQorCVkyX0NMS19ESVZfVkFMMl9NU0sJPSA3PDwyMSwgICAvKiBCaXQgMjMuLjIxOiBDbG9jayBEaXZpc29yIFZhbHVlICovCisJWTJfQ0xLX1NFTEVDVDJfTVNLCT0gMHgxZjw8MTYsLyogQml0IDIwLi4xNjogQ2xvY2sgU2VsZWN0ICovCisjZGVmaW5lIFkyX0NMS19ESVZfVkFMXzIoeCkJKCgoeCk8PDIxKSAmIFkyX0NMS19ESVZfVkFMMl9NU0spCisjZGVmaW5lIFkyX0NMS19TRUxfVkFMXzIoeCkJKCgoeCk8PDE2KSAmIFkyX0NMS19TRUxFQ1QyX01TSykKKwlZMl9DTEtfRElWX0VOQQkJPSAxPDwxLCAvKiBFbmFibGUgIENvcmUgQ2xvY2sgRGl2aXNpb24gKi8KKwlZMl9DTEtfRElWX0RJUwkJPSAxPDwwLAkvKiBEaXNhYmxlIENvcmUgQ2xvY2sgRGl2aXNpb24gKi8KK307CisKKy8qCUIyX1RJX0NUUkwJCSA4IGJpdAlUaW1lciBjb250cm9sICovCisvKglCMl9JUlFNX0NUUkwJIDggYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIENvbnRyb2wgKi8KK2VudW0geworCVRJTV9TVEFSVAk9IDE8PDIsCS8qIFN0YXJ0IFRpbWVyICovCisJVElNX1NUT1AJPSAxPDwxLAkvKiBTdG9wICBUaW1lciAqLworCVRJTV9DTFJfSVJRCT0gMTw8MCwJLyogQ2xlYXIgVGltZXIgSVJRICghSVJRTSkgKi8KK307CisKKy8qCUIyX1RJX1RFU1QJCSA4IEJpdAlUaW1lciBUZXN0ICovCisvKglCMl9JUlFNX1RFU1QJIDggYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFRlc3QgKi8KKy8qCUIyOF9EUFRfVFNUCQkgOCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIFRlc3QgUmVnICovCitlbnVtIHsKKwlUSU1fVF9PTgk9IDE8PDIsCS8qIFRlc3QgbW9kZSBvbiAqLworCVRJTV9UX09GRgk9IDE8PDEsCS8qIFRlc3QgbW9kZSBvZmYgKi8KKwlUSU1fVF9TVEVQCT0gMTw8MCwJLyogVGVzdCBzdGVwICovCit9OworCisvKglCM19SQU1fQUREUgkJMzIgYml0CVJBTSBBZGRyZXNzLCB0byByZWFkIG9yIHdyaXRlICovCisJCQkJCS8qIEJpdCAzMS4uMTk6CXJlc2VydmVkICovCisjZGVmaW5lIFJBTV9BRFJfUkFOCTB4MDAwN2ZmZmZMCS8qIEJpdCAxOC4uIDA6CVJBTSBBZGRyZXNzIFJhbmdlICovCisvKiBSQU0gSW50ZXJmYWNlIFJlZ2lzdGVycyAqLworCisvKglCM19SSV9DVFJMCQkxNiBiaXQJUkFNIEludGVyZmFjZSBDb250cm9sIFJlZ2lzdGVyICovCitlbnVtIHsKKwlSSV9DTFJfUkRfUEVSUgk9IDE8PDksCS8qIENsZWFyIElSUSBSQU0gUmVhZCBQYXJpdHkgRXJyICovCisJUklfQ0xSX1dSX1BFUlIJPSAxPDw4LAkvKiBDbGVhciBJUlEgUkFNIFdyaXRlIFBhcml0eSBFcnIqLworCisJUklfUlNUX0NMUgk9IDE8PDEsCS8qIENsZWFyIFJBTSBJbnRlcmZhY2UgUmVzZXQgKi8KKwlSSV9SU1RfU0VUCT0gMTw8MCwJLyogU2V0ICAgUkFNIEludGVyZmFjZSBSZXNldCAqLworfTsKKworI2RlZmluZSBTS19SSV9UT181MwkzNgkJLyogUkFNIGludGVyZmFjZSB0aW1lb3V0ICovCisKKworLyogUG9ydCByZWxhdGVkIHJlZ2lzdGVycyBGSUZPLCBhbmQgQXJiaXRlciAqLworI2RlZmluZSBTS19SRUcocG9ydCxyZWcpCSgoKHBvcnQpPDw3KSsocmVnKSkKKworLyogVHJhbnNtaXQgQXJiaXRlciBSZWdpc3RlcnMgTUFDIDEgYW5kIDIsIHVzZSBTS19SRUcoKSB0byBhY2Nlc3MgKi8KKy8qCVRYQV9JVElfSU5JCQkzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIEluaXQgVmFsICovCisvKglUWEFfSVRJX1ZBTAkJMzIgYml0CVR4IEFyYiBJbnRlcnZhbCBUaW1lciBWYWx1ZSAqLworLyoJVFhBX0xJTV9JTkkJCTMyIGJpdAlUeCBBcmIgTGltaXQgQ291bnRlciBJbml0IFZhbCAqLworLyoJVFhBX0xJTV9WQUwJCTMyIGJpdAlUeCBBcmIgTGltaXQgQ291bnRlciBWYWx1ZSAqLworCisjZGVmaW5lIFRYQV9NQVhfVkFMCTB4MDBmZmZmZmZVTAkvKiBCaXQgMjMuLiAwOglNYXggVFhBIFRpbWVyL0NudCBWYWwgKi8KKworLyoJVFhBX0NUUkwJCSA4IGJpdAlUeCBBcmJpdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KK2VudW0geworCVRYQV9FTkFfRlNZTkMJPSAxPDw3LAkvKiBFbmFibGUgIGZvcmNlIG9mIHN5bmMgVHggcXVldWUgKi8KKwlUWEFfRElTX0ZTWU5DCT0gMTw8NiwJLyogRGlzYWJsZSBmb3JjZSBvZiBzeW5jIFR4IHF1ZXVlICovCisJVFhBX0VOQV9BTExPQwk9IDE8PDUsCS8qIEVuYWJsZSAgYWxsb2Mgb2YgZnJlZSBiYW5kd2lkdGggKi8KKwlUWEFfRElTX0FMTE9DCT0gMTw8NCwJLyogRGlzYWJsZSBhbGxvYyBvZiBmcmVlIGJhbmR3aWR0aCAqLworCVRYQV9TVEFSVF9SQwk9IDE8PDMsCS8qIFN0YXJ0IHN5bmMgUmF0ZSBDb250cm9sICovCisJVFhBX1NUT1BfUkMJPSAxPDwyLAkvKiBTdG9wICBzeW5jIFJhdGUgQ29udHJvbCAqLworCVRYQV9FTkFfQVJCCT0gMTw8MSwJLyogRW5hYmxlICBUeCBBcmJpdGVyICovCisJVFhBX0RJU19BUkIJPSAxPDwwLAkvKiBEaXNhYmxlIFR4IEFyYml0ZXIgKi8KK307CisKKy8qCisgKglCYW5rIDQgLSA1CisgKi8KKy8qIFRyYW5zbWl0IEFyYml0ZXIgUmVnaXN0ZXJzIE1BQyAxIGFuZCAyLCB1c2UgU0tfUkVHKCkgdG8gYWNjZXNzICovCitlbnVtIHsKKwlUWEFfSVRJX0lOSQk9IDB4MDIwMCwvKiAzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIEluaXQgVmFsKi8KKwlUWEFfSVRJX1ZBTAk9IDB4MDIwNCwvKiAzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIFZhbHVlICovCisJVFhBX0xJTV9JTkkJPSAweDAyMDgsLyogMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIEluaXQgVmFsICovCisJVFhBX0xJTV9WQUwJPSAweDAyMGMsLyogMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIFZhbHVlICovCisJVFhBX0NUUkwJPSAweDAyMTAsLyogIDggYml0CVR4IEFyYml0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworCVRYQV9URVNUCT0gMHgwMjExLC8qICA4IGJpdAlUeCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXIgKi8KKwlUWEFfU1RBVAk9IDB4MDIxMiwvKiAgOCBiaXQJVHggQXJiaXRlciBTdGF0dXMgUmVnaXN0ZXIgKi8KK307CisKKworZW51bSB7CisJQjZfRVhUX1JFRwk9IDB4MDMwMCwvKiBFeHRlcm5hbCByZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKwlCN19DRkdfU1BDCT0gMHgwMzgwLC8qIGNvcHkgb2YgdGhlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlCOF9SUTFfUkVHUwk9IDB4MDQwMCwvKiBSZWNlaXZlIFF1ZXVlIDEgKi8KKwlCOF9SUTJfUkVHUwk9IDB4MDQ4MCwvKiBSZWNlaXZlIFF1ZXVlIDIgKi8KKwlCOF9UUzFfUkVHUwk9IDB4MDYwMCwvKiBUcmFuc21pdCBzeW5jIHF1ZXVlIDEgKi8KKwlCOF9UQTFfUkVHUwk9IDB4MDY4MCwvKiBUcmFuc21pdCBhc3luYyBxdWV1ZSAxICovCisJQjhfVFMyX1JFR1MJPSAweDA3MDAsLyogVHJhbnNtaXQgc3luYyBxdWV1ZSAyICovCisJQjhfVEEyX1JFR1MJPSAweDA3ODAsLyogVHJhbnNtaXQgc3luYyBxdWV1ZSAyICovCisJQjE2X1JBTV9SRUdTCT0gMHgwODAwLC8qIFJBTSBCdWZmZXIgUmVnaXN0ZXJzICovCit9OworCisvKiBRdWV1ZSBSZWdpc3RlciBPZmZzZXRzLCB1c2UgUV9BRERSKCkgdG8gYWNjZXNzICovCitlbnVtIHsKKwlCOF9RX1JFR1MgPSAweDA0MDAsIC8qIGJhc2Ugb2YgUXVldWUgcmVnaXN0ZXJzICovCisJUV9ECT0gMHgwMCwJLyogOCozMgliaXQJQ3VycmVudCBEZXNjcmlwdG9yICovCisJUV9WTEFOICA9IDB4MjAsIC8qIDE2IGJpdAlDdXJyZW50IFZMQU4gVGFnICovCisJUV9ET05FCT0gMHgyNCwJLyogMTYgYml0CURvbmUgSW5kZXggKi8KKwlRX0FDX0wJPSAweDI4LAkvKiAzMiBiaXQJQ3VycmVudCBBZGRyZXNzIENvdW50ZXIgTG93IGRXb3JkICovCisJUV9BQ19ICT0gMHgyYywJLyogMzIgYml0CUN1cnJlbnQgQWRkcmVzcyBDb3VudGVyIEhpZ2ggZFdvcmQgKi8KKwlRX0JDCT0gMHgzMCwJLyogMzIgYml0CUN1cnJlbnQgQnl0ZSBDb3VudGVyICovCisJUV9DU1IJPSAweDM0LAkvKiAzMiBiaXQJQk1VIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovCisJUV9URVNUCT0gMHgzOCwJLyogMzIgYml0CVRlc3QvQ29udHJvbCBSZWdpc3RlciAqLworCisvKiBZdWtvbi0yICovCisJUV9XTQk9IDB4NDAsCS8qIDE2IGJpdAlGSUZPIFdhdGVybWFyayAqLworCVFfQUwJPSAweDQyLAkvKiAgOCBiaXQJRklGTyBBbGlnbm1lbnQgKi8KKwlRX1JTUAk9IDB4NDQsCS8qIDE2IGJpdAlGSUZPIFJlYWQgU2hhZG93IFBvaW50ZXIgKi8KKwlRX1JTTAk9IDB4NDYsCS8qICA4IGJpdAlGSUZPIFJlYWQgU2hhZG93IExldmVsICovCisJUV9SUAk9IDB4NDgsCS8qICA4IGJpdAlGSUZPIFJlYWQgUG9pbnRlciAqLworCVFfUkwJPSAweDRhLAkvKiAgOCBiaXQJRklGTyBSZWFkIExldmVsICovCisJUV9XUAk9IDB4NGMsCS8qICA4IGJpdAlGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKwlRX1dTUAk9IDB4NGQsCS8qICA4IGJpdAlGSUZPIFdyaXRlIFNoYWRvdyBQb2ludGVyICovCisJUV9XTAk9IDB4NGUsCS8qICA4IGJpdAlGSUZPIFdyaXRlIExldmVsICovCisJUV9XU0wJPSAweDRmLAkvKiAgOCBiaXQJRklGTyBXcml0ZSBTaGFkb3cgTGV2ZWwgKi8KK307CisjZGVmaW5lIFFfQUREUihyZWcsIG9mZnMpIChCOF9RX1JFR1MgKyAocmVnKSArIChvZmZzKSkKKworLyoJUV9URVNUCQkJCTMyIGJpdAlUZXN0IFJlZ2lzdGVyICovCitlbnVtIHsKKwkvKiBUcmFuc21pdCAqLworCUZfVFhfQ0hLX0FVVE9fT0ZGID0gMTw8MzEsIC8qIFR4IGNoZWNrc3VtIGF1dG8gY2FsYyBvZmYgKFl1a29uIEVYKSAqLworCUZfVFhfQ0hLX0FVVE9fT04gID0gMTw8MzAsIC8qIFR4IGNoZWNrc3VtIGF1dG8gY2FsYyBvZmYgKFl1a29uIEVYKSAqLworCisJLyogUmVjZWl2ZSAqLworCUZfTV9SWF9SQU1fRElTCT0gMTw8MjQsIC8qIE1BQyBSeCBSQU0gUmVhZCBQb3J0IGRpc2FibGUgKi8KKworCS8qIEhhcmR3YXJlIHRlc3RiaXRzIG5vdCB1c2VkICovCit9OworCisvKiBRdWV1ZSBQcmVmZXRjaCBVbml0IE9mZnNldHMsIHVzZSBZMl9RQUREUigpIHRvIGFkZHJlc3MgKFl1a29uLTIgb25seSkqLworZW51bSB7CisJWTJfQjhfUFJFRl9SRUdTCQk9IDB4MDQ1MCwKKworCVBSRUZfVU5JVF9DVFJMCQk9IDB4MDAsCS8qIDMyIGJpdAlDb250cm9sIHJlZ2lzdGVyICovCisJUFJFRl9VTklUX0xBU1RfSURYCT0gMHgwNCwJLyogMTYgYml0CUxhc3QgSW5kZXggKi8KKwlQUkVGX1VOSVRfQUREUl9MTwk9IDB4MDgsCS8qIDMyIGJpdAlMaXN0IHN0YXJ0IGFkZHIsIGxvdyBwYXJ0ICovCisJUFJFRl9VTklUX0FERFJfSEkJPSAweDBjLAkvKiAzMiBiaXQJTGlzdCBzdGFydCBhZGRyLCBoaWdoIHBhcnQqLworCVBSRUZfVU5JVF9HRVRfSURYCT0gMHgxMCwJLyogMTYgYml0CUdldCBJbmRleCAqLworCVBSRUZfVU5JVF9QVVRfSURYCT0gMHgxNCwJLyogMTYgYml0CVB1dCBJbmRleCAqLworCVBSRUZfVU5JVF9GSUZPX1dQCT0gMHgyMCwJLyogIDggYml0CUZJRk8gd3JpdGUgcG9pbnRlciAqLworCVBSRUZfVU5JVF9GSUZPX1JQCT0gMHgyNCwJLyogIDggYml0CUZJRk8gcmVhZCBwb2ludGVyICovCisJUFJFRl9VTklUX0ZJRk9fV00JPSAweDI4LAkvKiAgOCBiaXQJRklGTyB3YXRlcm1hcmsgKi8KKwlQUkVGX1VOSVRfRklGT19MRVYJPSAweDJjLAkvKiAgOCBiaXQJRklGTyBsZXZlbCAqLworCisJUFJFRl9VTklUX01BU0tfSURYCT0gMHgwZmZmLAorfTsKKyNkZWZpbmUgWTJfUUFERFIocSxyZWcpCQkoWTJfQjhfUFJFRl9SRUdTICsgKHEpICsgKHJlZykpCisKKy8qIFJBTSBCdWZmZXIgUmVnaXN0ZXIgT2Zmc2V0cyAqLworZW51bSB7CisKKwlSQl9TVEFSVAk9IDB4MDAsLyogMzIgYml0CVJBTSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAqLworCVJCX0VORAk9IDB4MDQsLyogMzIgYml0CVJBTSBCdWZmZXIgRW5kIEFkZHJlc3MgKi8KKwlSQl9XUAk9IDB4MDgsLyogMzIgYml0CVJBTSBCdWZmZXIgV3JpdGUgUG9pbnRlciAqLworCVJCX1JQCT0gMHgwYywvKiAzMiBiaXQJUkFNIEJ1ZmZlciBSZWFkIFBvaW50ZXIgKi8KKwlSQl9SWF9VVFBQCT0gMHgxMCwvKiAzMiBiaXQJUnggVXBwZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrZXQgKi8KKwlSQl9SWF9MVFBQCT0gMHgxNCwvKiAzMiBiaXQJUnggTG93ZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrZXQgKi8KKwlSQl9SWF9VVEhQCT0gMHgxOCwvKiAzMiBiaXQJUnggVXBwZXIgVGhyZXNob2xkLCBIaWdoIFByaW8gKi8KKwlSQl9SWF9MVEhQCT0gMHgxYywvKiAzMiBiaXQJUnggTG93ZXIgVGhyZXNob2xkLCBIaWdoIFByaW8gKi8KKwkvKiAweDEwIC0gMHgxZjoJcmVzZXJ2ZWQgYXQgVHggUkFNIEJ1ZmZlciBSZWdpc3RlcnMgKi8KKwlSQl9QQwk9IDB4MjAsLyogMzIgYml0CVJBTSBCdWZmZXIgUGFja2V0IENvdW50ZXIgKi8KKwlSQl9MRVYJPSAweDI0LC8qIDMyIGJpdAlSQU0gQnVmZmVyIExldmVsIFJlZ2lzdGVyICovCisJUkJfQ1RSTAk9IDB4MjgsLyogMzIgYml0CVJBTSBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLworCVJCX1RTVDEJPSAweDI5LC8qICA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMSAqLworCVJCX1RTVDIJPSAweDJhLC8qICA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMiAqLworfTsKKworLyogUmVjZWl2ZSBhbmQgVHJhbnNtaXQgUXVldWVzICovCitlbnVtIHsKKwlRX1IxCT0gMHgwMDAwLAkvKiBSZWNlaXZlIFF1ZXVlIDEgKi8KKwlRX1IyCT0gMHgwMDgwLAkvKiBSZWNlaXZlIFF1ZXVlIDIgKi8KKwlRX1hTMQk9IDB4MDIwMCwJLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworCVFfWEExCT0gMHgwMjgwLAkvKiBBc3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworCVFfWFMyCT0gMHgwMzAwLAkvKiBTeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAyICovCisJUV9YQTIJPSAweDAzODAsCS8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAyICovCit9OworCisvKiBEaWZmZXJlbnQgUEhZIFR5cGVzICovCitlbnVtIHsKKwlQSFlfQUREUl9NQVJWCT0gMCwKK307CisKKyNkZWZpbmUgUkJfQUREUihvZmZzLCBxdWV1ZSkgKCh1MTYpIEIxNl9SQU1fUkVHUyArIChxdWV1ZSkgKyAob2ZmcykpCisKKworZW51bSB7CisJTE5LX1NZTkNfSU5JCT0gMHgwYzMwLC8qIDMyIGJpdAlMaW5rIFN5bmMgQ250IEluaXQgVmFsdWUgKi8KKwlMTktfU1lOQ19WQUwJPSAweDBjMzQsLyogMzIgYml0CUxpbmsgU3luYyBDbnQgQ3VycmVudCBWYWx1ZSAqLworCUxOS19TWU5DX0NUUkwJPSAweDBjMzgsLyogIDggYml0CUxpbmsgU3luYyBDbnQgQ29udHJvbCBSZWdpc3RlciAqLworCUxOS19TWU5DX1RTVAk9IDB4MGMzOSwvKiAgOCBiaXQJTGluayBTeW5jIENudCBUZXN0IFJlZ2lzdGVyICovCisKKwlMTktfTEVEX1JFRwk9IDB4MGMzYywvKiAgOCBiaXQJTGluayBMRUQgUmVnaXN0ZXIgKi8KKworLyogUmVjZWl2ZSBHTUFDIEZJRk8gKFlVS09OIGFuZCBZdWtvbi0yKSAqLworCisJUlhfR01GX0VBCT0gMHgwYzQwLC8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gRW5kIEFkZHJlc3MgKi8KKwlSWF9HTUZfQUZfVEhSCT0gMHgwYzQ0LC8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gQWxtb3N0IEZ1bGwgVGhyZXNoLiAqLworCVJYX0dNRl9DVFJMX1QJPSAweDBjNDgsLyogMzIgYml0CVJ4IEdNQUMgRklGTyBDb250cm9sL1Rlc3QgKi8KKwlSWF9HTUZfRkxfTVNLCT0gMHgwYzRjLC8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gRmx1c2ggTWFzayAqLworCVJYX0dNRl9GTF9USFIJPSAweDBjNTAsLyogMzIgYml0CVJ4IEdNQUMgRklGTyBGbHVzaCBUaHJlc2hvbGQgKi8KKwlSWF9HTUZfVFJfVEhSCT0gMHgwYzU0LC8qIDMyIGJpdAlSeCBUcnVuY2F0aW9uIFRocmVzaG9sZCAoWXVrb24tMikgKi8KKwlSWF9HTUZfVVBfVEhSCT0gMHgwYzU4LC8qICA4IGJpdAlSeCBVcHBlciBQYXVzZSBUaHIgKFl1a29uLUVDX1UpICovCisJUlhfR01GX0xQX1RIUgk9IDB4MGM1YSwvKiAgOCBiaXQJUnggTG93ZXIgUGF1c2UgVGhyIChZdWtvbi1FQ19VKSAqLworCVJYX0dNRl9WTEFOCT0gMHgwYzVjLC8qIDMyIGJpdAlSeCBWTEFOIFR5cGUgUmVnaXN0ZXIgKFl1a29uLTIpICovCisJUlhfR01GX1dQCT0gMHgwYzYwLC8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gV3JpdGUgUG9pbnRlciAqLworCisJUlhfR01GX1dMRVYJPSAweDBjNjgsLyogMzIgYml0CVJ4IEdNQUMgRklGTyBXcml0ZSBMZXZlbCAqLworCisJUlhfR01GX1JQCT0gMHgwYzcwLC8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gUmVhZCBQb2ludGVyICovCisKKwlSWF9HTUZfUkxFVgk9IDB4MGM3OCwvKiAzMiBiaXQJUnggR01BQyBGSUZPIFJlYWQgTGV2ZWwgKi8KK307CisKKworLyoJUV9CQwkJCTMyIGJpdAlDdXJyZW50IEJ5dGUgQ291bnRlciAqLworCisvKiBCTVUgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXJzICovCisvKglCMF9SMV9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IFJ4IFF1ZXVlIDEgKi8KKy8qCUIwX1IyX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgUnggUXVldWUgMiAqLworLyoJQjBfWEExX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgU3luYyBUeCBRdWV1ZSAxICovCisvKglCMF9YUzFfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBBc3luYyBUeCBRdWV1ZSAxICovCisvKglCMF9YQTJfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBTeW5jIFR4IFF1ZXVlIDIgKi8KKy8qCUIwX1hTMl9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IEFzeW5jIFR4IFF1ZXVlIDIgKi8KKy8qCVFfQ1NSCQkJMzIgYml0CUJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworCisvKiBSeCBCTVUgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlcnMgKFl1a29uLTIpICovCitlbnVtIHsKKwlCTVVfSURMRQk9IDE8PDMxLCAvKiBCTVUgSWRsZSBTdGF0ZSAqLworCUJNVV9SWF9UQ1BfUEtUCT0gMTw8MzAsIC8qIFJ4IFRDUCBQYWNrZXQgKHdoZW4gUlNTIEhhc2ggZW5hYmxlZCkgKi8KKwlCTVVfUlhfSVBfUEtUCT0gMTw8MjksIC8qIFJ4IElQICBQYWNrZXQgKHdoZW4gUlNTIEhhc2ggZW5hYmxlZCkgKi8KKworCUJNVV9FTkFfUlhfUlNTX0hBU0ggPSAxPDwxNSwgLyogRW5hYmxlICBSeCBSU1MgSGFzaCAqLworCUJNVV9ESVNfUlhfUlNTX0hBU0ggPSAxPDwxNCwgLyogRGlzYWJsZSBSeCBSU1MgSGFzaCAqLworCUJNVV9FTkFfUlhfQ0hLU1VNID0gMTw8MTMsIC8qIEVuYWJsZSAgUnggVENQL0lQIENoZWNrc3VtIENoZWNrICovCisJQk1VX0RJU19SWF9DSEtTVU0gPSAxPDwxMiwgLyogRGlzYWJsZSBSeCBUQ1AvSVAgQ2hlY2tzdW0gQ2hlY2sgKi8KKwlCTVVfQ0xSX0lSUV9QQVIJPSAxPDwxMSwgLyogQ2xlYXIgSVJRIG9uIFBhcml0eSBlcnJvcnMgKFJ4KSAqLworCUJNVV9DTFJfSVJRX1RDUAk9IDE8PDExLCAvKiBDbGVhciBJUlEgb24gVENQIHNlZ21lbnQuIGVycm9yIChUeCkgKi8KKwlCTVVfQ0xSX0lSUV9DSEsJPSAxPDwxMCwgLyogQ2xlYXIgSVJRIENoZWNrICovCisJQk1VX1NUT1AJPSAxPDw5LCAvKiBTdG9wICBSeC9UeCBRdWV1ZSAqLworCUJNVV9TVEFSVAk9IDE8PDgsIC8qIFN0YXJ0IFJ4L1R4IFF1ZXVlICovCisJQk1VX0ZJRk9fT1BfT04JPSAxPDw3LCAvKiBGSUZPIE9wZXJhdGlvbmFsIE9uICovCisJQk1VX0ZJRk9fT1BfT0ZGCT0gMTw8NiwgLyogRklGTyBPcGVyYXRpb25hbCBPZmYgKi8KKwlCTVVfRklGT19FTkEJPSAxPDw1LCAvKiBFbmFibGUgRklGTyAqLworCUJNVV9GSUZPX1JTVAk9IDE8PDQsIC8qIFJlc2V0ICBGSUZPICovCisJQk1VX09QX09OCT0gMTw8MywgLyogQk1VIE9wZXJhdGlvbmFsIE9uICovCisJQk1VX09QX09GRgk9IDE8PDIsIC8qIEJNVSBPcGVyYXRpb25hbCBPZmYgKi8KKwlCTVVfUlNUX0NMUgk9IDE8PDEsIC8qIENsZWFyIEJNVSBSZXNldCAoRW5hYmxlKSAqLworCUJNVV9SU1RfU0VUCT0gMTw8MCwgLyogU2V0ICAgQk1VIFJlc2V0ICovCisKKwlCTVVfQ0xSX1JFU0VUCT0gQk1VX0ZJRk9fUlNUIHwgQk1VX09QX09GRiB8IEJNVV9SU1RfQ0xSLAorCUJNVV9PUEVSX0lOSVQJPSBCTVVfQ0xSX0lSUV9QQVIgfCBCTVVfQ0xSX0lSUV9DSEsgfCBCTVVfU1RBUlQgfAorCQkJICBCTVVfRklGT19FTkEgfCBCTVVfT1BfT04sCisKKwlCTVVfV01fREVGQVVMVCA9IDB4NjAwLAorCUJNVV9XTV9QRVggICAgID0gMHg4MCwKK307CisKKy8qIFR4IEJNVSBDb250cm9sIC8gU3RhdHVzIFJlZ2lzdGVycyAoWXVrb24tMikgKi8KKwkJCQkJCQkJLyogQml0IDMxOiBzYW1lIGFzIGZvciBSeCAqLworZW51bSB7CisJQk1VX1RYX0lQSURJTkNSX09OCT0gMTw8MTMsIC8qIEVuYWJsZSAgSVAgSUQgSW5jcmVtZW50ICovCisJQk1VX1RYX0lQSURJTkNSX09GRgk9IDE8PDEyLCAvKiBEaXNhYmxlIElQIElEIEluY3JlbWVudCAqLworCUJNVV9UWF9DTFJfSVJRX1RDUAk9IDE8PDExLCAvKiBDbGVhciBJUlEgb24gVENQIHNlZ21lbnQgbGVuZ3RoIG1pc21hdGNoICovCit9OworCisvKiBRdWV1ZSBQcmVmZXRjaCBVbml0IE9mZnNldHMsIHVzZSBZMl9RQUREUigpIHRvIGFkZHJlc3MgKFl1a29uLTIgb25seSkqLworLyogUFJFRl9VTklUX0NUUkwJMzIgYml0CVByZWZldGNoIENvbnRyb2wgcmVnaXN0ZXIgKi8KK2VudW0geworCVBSRUZfVU5JVF9PUF9PTgkJPSAxPDwzLAkvKiBwcmVmZXRjaCB1bml0IG9wZXJhdGlvbmFsICovCisJUFJFRl9VTklUX09QX09GRgk9IDE8PDIsCS8qIHByZWZldGNoIHVuaXQgbm90IG9wZXJhdGlvbmFsICovCisJUFJFRl9VTklUX1JTVF9DTFIJPSAxPDwxLAkvKiBDbGVhciBQcmVmZXRjaCBVbml0IFJlc2V0ICovCisJUFJFRl9VTklUX1JTVF9TRVQJPSAxPDwwLAkvKiBTZXQgICBQcmVmZXRjaCBVbml0IFJlc2V0ICovCit9OworCisvKiBSQU0gQnVmZmVyIFJlZ2lzdGVyIE9mZnNldHMsIHVzZSBSQl9BRERSKFF1ZXVlLCBPZmZzKSB0byBhY2Nlc3MgKi8KKy8qCVJCX1NUQVJUCQkzMiBiaXQJUkFNIEJ1ZmZlciBTdGFydCBBZGRyZXNzICovCisvKglSQl9FTkQJCQkzMiBiaXQJUkFNIEJ1ZmZlciBFbmQgQWRkcmVzcyAqLworLyoJUkJfV1AJCQkzMiBiaXQJUkFNIEJ1ZmZlciBXcml0ZSBQb2ludGVyICovCisvKglSQl9SUAkJCTMyIGJpdAlSQU0gQnVmZmVyIFJlYWQgUG9pbnRlciAqLworLyoJUkJfUlhfVVRQUAkJMzIgYml0CVJ4IFVwcGVyIFRocmVzaG9sZCwgUGF1c2UgUGFjayAqLworLyoJUkJfUlhfTFRQUAkJMzIgYml0CVJ4IExvd2VyIFRocmVzaG9sZCwgUGF1c2UgUGFjayAqLworLyoJUkJfUlhfVVRIUAkJMzIgYml0CVJ4IFVwcGVyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisvKglSQl9SWF9MVEhQCQkzMiBiaXQJUnggTG93ZXIgVGhyZXNob2xkLCBIaWdoIFByaW8gKi8KKy8qCVJCX1BDCQkJMzIgYml0CVJBTSBCdWZmZXIgUGFja2V0IENvdW50ZXIgKi8KKy8qCVJCX0xFVgkJCTMyIGJpdAlSQU0gQnVmZmVyIExldmVsIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUkJfTVNLCTB4MDAwN2ZmZmYJLyogQml0IDE4Li4gMDoJUkFNIEJ1ZmZlciBQb2ludGVyIEJpdHMgKi8KKy8qCVJCX1RTVDIJCQkgOCBiaXQJUkFNIEJ1ZmZlciBUZXN0IFJlZ2lzdGVyIDIgKi8KKy8qCVJCX1RTVDEJCQkgOCBiaXQJUkFNIEJ1ZmZlciBUZXN0IFJlZ2lzdGVyIDEgKi8KKworLyoJUkJfQ1RSTAkJCSA4IGJpdAlSQU0gQnVmZmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KK2VudW0geworCVJCX0VOQV9TVEZXRAk9IDE8PDUsCS8qIEVuYWJsZSAgU3RvcmUgJiBGb3J3YXJkICovCisJUkJfRElTX1NURldECT0gMTw8NCwJLyogRGlzYWJsZSBTdG9yZSAmIEZvcndhcmQgKi8KKwlSQl9FTkFfT1BfTUQJPSAxPDwzLAkvKiBFbmFibGUgIE9wZXJhdGlvbiBNb2RlICovCisJUkJfRElTX09QX01ECT0gMTw8MiwJLyogRGlzYWJsZSBPcGVyYXRpb24gTW9kZSAqLworCVJCX1JTVF9DTFIJPSAxPDwxLAkvKiBDbGVhciBSQU0gQnVmIFNUTSBSZXNldCAqLworCVJCX1JTVF9TRVQJPSAxPDwwLAkvKiBTZXQgICBSQU0gQnVmIFNUTSBSZXNldCAqLworfTsKKworCisvKiBUcmFuc21pdCBHTUFDIEZJRk8gKFlVS09OIG9ubHkpICovCitlbnVtIHsKKwlUWF9HTUZfRUEJPSAweDBkNDAsLyogMzIgYml0CVR4IEdNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworCVRYX0dNRl9BRV9USFIJPSAweDBkNDQsLyogMzIgYml0CVR4IEdNQUMgRklGTyBBbG1vc3QgRW1wdHkgVGhyZXNoLiovCisJVFhfR01GX0NUUkxfVAk9IDB4MGQ0OCwvKiAzMiBiaXQJVHggR01BQyBGSUZPIENvbnRyb2wvVGVzdCAqLworCisJVFhfR01GX1dQCT0gMHgwZDYwLC8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKwlUWF9HTUZfV1NQCT0gMHgwZDY0LC8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFdyaXRlIFNoYWRvdyBQdHIuICovCisJVFhfR01GX1dMRVYJPSAweDBkNjgsLyogMzIgYml0IAlUeCBHTUFDIEZJRk8gV3JpdGUgTGV2ZWwgKi8KKworCVRYX0dNRl9SUAk9IDB4MGQ3MCwvKiAzMiBiaXQgCVR4IEdNQUMgRklGTyBSZWFkIFBvaW50ZXIgKi8KKwlUWF9HTUZfUlNUUAk9IDB4MGQ3NCwvKiAzMiBiaXQgCVR4IEdNQUMgRklGTyBSZXN0YXJ0IFBvaW50ZXIgKi8KKwlUWF9HTUZfUkxFVgk9IDB4MGQ3OCwvKiAzMiBiaXQgCVR4IEdNQUMgRklGTyBSZWFkIExldmVsICovCisKKwkvKiBUaHJlc2hvbGQgdmFsdWVzIGZvciBZdWtvbi1FQyBVbHRyYSBhbmQgRXh0cmVtZSAqLworCUVDVV9BRV9USFIJPSAweDAwNzAsIC8qIEFsbW9zdCBFbXB0eSBUaHJlc2hvbGQgKi8KKwlFQ1VfVFhGRl9MRVYJPSAweDAxYTAsIC8qIFR4IEJNVSBGSUZPIExldmVsICovCisJRUNVX0pVTUJPX1dNCT0gMHgwMDgwLCAvKiBKdW1ibyBNb2RlIFdhdGVybWFyayAqLworfTsKKworLyogRGVzY3JpcHRvciBQb2xsIFRpbWVyIFJlZ2lzdGVycyAqLworZW51bSB7CisJQjI4X0RQVF9JTkkJPSAweDBlMDAsLyogMjQgYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBJbml0IFZhbCAqLworCUIyOF9EUFRfVkFMCT0gMHgwZTA0LC8qIDI0IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgQ3VyciBWYWwgKi8KKwlCMjhfRFBUX0NUUkwJPSAweDBlMDgsLyogIDggYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBDdHJsIFJlZyAqLworCisJQjI4X0RQVF9UU1QJPSAweDBlMGEsLyogIDggYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBUZXN0IFJlZyAqLworfTsKKworLyogVGltZSBTdGFtcCBUaW1lciBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCitlbnVtIHsKKwlHTUFDX1RJX1NUX1ZBTAk9IDB4MGUxNCwvKiAzMiBiaXQJVGltZSBTdGFtcCBUaW1lciBDdXJyIFZhbCAqLworCUdNQUNfVElfU1RfQ1RSTAk9IDB4MGUxOCwvKiAgOCBiaXQJVGltZSBTdGFtcCBUaW1lciBDdHJsIFJlZyAqLworCUdNQUNfVElfU1RfVFNUCT0gMHgwZTFhLC8qICA4IGJpdAlUaW1lIFN0YW1wIFRpbWVyIFRlc3QgUmVnICovCit9OworCisvKiBQb2xsaW5nIFVuaXQgUmVnaXN0ZXJzIChZdWtvbi0yIG9ubHkpICovCitlbnVtIHsKKwlQT0xMX0NUUkwJPSAweDBlMjAsIC8qIDMyIGJpdAlQb2xsaW5nIFVuaXQgQ29udHJvbCBSZWcgKi8KKwlQT0xMX0xBU1RfSURYCT0gMHgwZTI0LC8qIDE2IGJpdAlQb2xsaW5nIFVuaXQgTGlzdCBMYXN0IEluZGV4ICovCisKKwlQT0xMX0xJU1RfQUREUl9MTz0gMHgwZTI4LC8qIDMyIGJpdAlQb2xsLiBMaXN0IFN0YXJ0IEFkZHIgKGxvdykgKi8KKwlQT0xMX0xJU1RfQUREUl9IST0gMHgwZTJjLC8qIDMyIGJpdAlQb2xsLiBMaXN0IFN0YXJ0IEFkZHIgKGhpZ2gpICovCit9OworCitlbnVtIHsKKwlTTUJfQ0ZHCQkgPSAweDBlNDAsIC8qIDMyIGJpdAlTTUJ1cyBDb25maWcgUmVnaXN0ZXIgKi8KKwlTTUJfQ1NSCQkgPSAweDBlNDQsIC8qIDMyIGJpdAlTTUJ1cyBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworfTsKKworZW51bSB7CisJQ1BVX1dET0cJID0gMHgwZTQ4LCAvKiAzMiBiaXQJV2F0Y2hkb2cgUmVnaXN0ZXIgICovCisJQ1BVX0NOVFIJID0gMHgwZTRDLCAvKiAzMiBiaXQJQ291bnRlciBSZWdpc3RlciAgKi8KKwlDUFVfVElNCQkgPSAweDBlNTAsLyogMzIgYml0CVRpbWVyIENvbXBhcmUgUmVnaXN0ZXIgICovCisJQ1BVX0FIQl9BRERSCSA9IDB4MGU1NCwgLyogMzIgYml0CUNQVSBBSEIgRGVidWcgIFJlZ2lzdGVyICAqLworCUNQVV9BSEJfV0RBVEEJID0gMHgwZTU4LCAvKiAzMiBiaXQJQ1BVIEFIQiBEZWJ1ZyAgUmVnaXN0ZXIgICovCisJQ1BVX0FIQl9SREFUQQkgPSAweDBlNUMsIC8qIDMyIGJpdAlDUFUgQUhCIERlYnVnICBSZWdpc3RlciAgKi8KKwlIQ1VfTUFQX0JBU0UJID0gMHgwZTYwLCAvKiAzMiBiaXQJUmVzZXQgTWFwcGluZyBCYXNlICovCisJQ1BVX0FIQl9DVFJMCSA9IDB4MGU2NCwgLyogMzIgYml0CUNQVSBBSEIgRGVidWcgIFJlZ2lzdGVyICAqLworCUhDVV9DQ1NSCSA9IDB4MGU2OCwgLyogMzIgYml0CUNQVSBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlIQ1VfSENTUgkgPSAweDBlNkMsIC8qIDMyIGJpdAlIb3N0IENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAqLworfTsKKworLyogQVNGIFN1YnN5c3RlbSBSZWdpc3RlcnMgKFl1a29uLTIgb25seSkgKi8KK2VudW0geworCUIyOF9ZMl9TTUJfQ09ORklHICA9IDB4MGU0MCwvKiAzMiBiaXQJQVNGIFNNQnVzIENvbmZpZyBSZWdpc3RlciAqLworCUIyOF9ZMl9TTUJfQ1NEX1JFRyA9IDB4MGU0NCwvKiAzMiBiaXQJQVNGIFNNQiBDb250cm9sL1N0YXR1cy9EYXRhICovCisJQjI4X1kyX0FTRl9JUlFfVl9CQVNFPTB4MGU2MCwvKiAzMiBiaXQJQVNGIElSUSBWZWN0b3IgQmFzZSAqLworCisJQjI4X1kyX0FTRl9TVEFUX0NNRD0gMHgwZTY4LC8qIDMyIGJpdAlBU0YgU3RhdHVzIGFuZCBDb21tYW5kIFJlZyAqLworCUIyOF9ZMl9BU0ZfSE9TVF9DT009IDB4MGU2YywvKiAzMiBiaXQJQVNGIEhvc3QgQ29tbXVuaWNhdGlvbiBSZWcgKi8KKwlCMjhfWTJfREFUQV9SRUdfMSAgPSAweDBlNzAsLyogMzIgYml0CUFTRi9Ib3N0IERhdGEgUmVnaXN0ZXIgMSAqLworCUIyOF9ZMl9EQVRBX1JFR18yICA9IDB4MGU3NCwvKiAzMiBiaXQJQVNGL0hvc3QgRGF0YSBSZWdpc3RlciAyICovCisJQjI4X1kyX0RBVEFfUkVHXzMgID0gMHgwZTc4LC8qIDMyIGJpdAlBU0YvSG9zdCBEYXRhIFJlZ2lzdGVyIDMgKi8KKwlCMjhfWTJfREFUQV9SRUdfNCAgPSAweDBlN2MsLyogMzIgYml0CUFTRi9Ib3N0IERhdGEgUmVnaXN0ZXIgNCAqLworfTsKKworLyogU3RhdHVzIEJNVSBSZWdpc3RlcnMgKFl1a29uLTIgb25seSkqLworZW51bSB7CisJU1RBVF9DVFJMCT0gMHgwZTgwLC8qIDMyIGJpdAlTdGF0dXMgQk1VIENvbnRyb2wgUmVnICovCisJU1RBVF9MQVNUX0lEWAk9IDB4MGU4NCwvKiAxNiBiaXQJU3RhdHVzIEJNVSBMYXN0IEluZGV4ICovCisKKwlTVEFUX0xJU1RfQUREUl9MTz0gMHgwZTg4LC8qIDMyIGJpdAlTdGF0dXMgTGlzdCBTdGFydCBBZGRyIChsb3cpICovCisJU1RBVF9MSVNUX0FERFJfSEk9IDB4MGU4YywvKiAzMiBiaXQJU3RhdHVzIExpc3QgU3RhcnQgQWRkciAoaGlnaCkgKi8KKwlTVEFUX1RYQTFfUklEWAk9IDB4MGU5MCwvKiAxNiBiaXQJU3RhdHVzIFR4QTEgUmVwb3J0IEluZGV4IFJlZyAqLworCVNUQVRfVFhTMV9SSURYCT0gMHgwZTkyLC8qIDE2IGJpdAlTdGF0dXMgVHhTMSBSZXBvcnQgSW5kZXggUmVnICovCisJU1RBVF9UWEEyX1JJRFgJPSAweDBlOTQsLyogMTYgYml0CVN0YXR1cyBUeEEyIFJlcG9ydCBJbmRleCBSZWcgKi8KKwlTVEFUX1RYUzJfUklEWAk9IDB4MGU5NiwvKiAxNiBiaXQJU3RhdHVzIFR4UzIgUmVwb3J0IEluZGV4IFJlZyAqLworCVNUQVRfVFhfSURYX1RICT0gMHgwZTk4LC8qIDE2IGJpdAlTdGF0dXMgVHggSW5kZXggVGhyZXNob2xkIFJlZyAqLworCVNUQVRfUFVUX0lEWAk9IDB4MGU5YywvKiAxNiBiaXQJU3RhdHVzIFB1dCBJbmRleCBSZWcgKi8KKworLyogRklGTyBDb250cm9sL1N0YXR1cyBSZWdpc3RlcnMgKFl1a29uLTIgb25seSkqLworCVNUQVRfRklGT19XUAk9IDB4MGVhMCwvKiAgOCBiaXQJU3RhdHVzIEZJRk8gV3JpdGUgUG9pbnRlciBSZWcgKi8KKwlTVEFUX0ZJRk9fUlAJPSAweDBlYTQsLyogIDggYml0CVN0YXR1cyBGSUZPIFJlYWQgUG9pbnRlciBSZWcgKi8KKwlTVEFUX0ZJRk9fUlNQCT0gMHgwZWE2LC8qICA4IGJpdAlTdGF0dXMgRklGTyBSZWFkIFNoYWRvdyBQdHIgKi8KKwlTVEFUX0ZJRk9fTEVWRUwJPSAweDBlYTgsLyogIDggYml0CVN0YXR1cyBGSUZPIExldmVsIFJlZyAqLworCVNUQVRfRklGT19TSExWTAk9IDB4MGVhYSwvKiAgOCBiaXQJU3RhdHVzIEZJRk8gU2hhZG93IExldmVsIFJlZyAqLworCVNUQVRfRklGT19XTQk9IDB4MGVhYywvKiAgOCBiaXQJU3RhdHVzIEZJRk8gV2F0ZXJtYXJrIFJlZyAqLworCVNUQVRfRklGT19JU1JfV009IDB4MGVhZCwvKiAgOCBiaXQJU3RhdHVzIEZJRk8gSVNSIFdhdGVybWFyayBSZWcgKi8KKworLyogTGV2ZWwgYW5kIElTUiBUaW1lciBSZWdpc3RlcnMgKFl1a29uLTIgb25seSkqLworCVNUQVRfTEVWX1RJTUVSX0lOST0gMHgwZWIwLC8qIDMyIGJpdAlMZXZlbCBUaW1lciBJbml0LiBWYWx1ZSBSZWcgKi8KKwlTVEFUX0xFVl9USU1FUl9DTlQ9IDB4MGViNCwvKiAzMiBiaXQJTGV2ZWwgVGltZXIgQ291bnRlciBSZWcgKi8KKwlTVEFUX0xFVl9USU1FUl9DVFJMPSAweDBlYjgsLyogIDggYml0CUxldmVsIFRpbWVyIENvbnRyb2wgUmVnICovCisJU1RBVF9MRVZfVElNRVJfVEVTVD0gMHgwZWI5LC8qICA4IGJpdAlMZXZlbCBUaW1lciBUZXN0IFJlZyAqLworCVNUQVRfVFhfVElNRVJfSU5JICA9IDB4MGVjMCwvKiAzMiBiaXQJVHggVGltZXIgSW5pdC4gVmFsdWUgUmVnICovCisJU1RBVF9UWF9USU1FUl9DTlQgID0gMHgwZWM0LC8qIDMyIGJpdAlUeCBUaW1lciBDb3VudGVyIFJlZyAqLworCVNUQVRfVFhfVElNRVJfQ1RSTCA9IDB4MGVjOCwvKiAgOCBiaXQJVHggVGltZXIgQ29udHJvbCBSZWcgKi8KKwlTVEFUX1RYX1RJTUVSX1RFU1QgPSAweDBlYzksLyogIDggYml0CVR4IFRpbWVyIFRlc3QgUmVnICovCisJU1RBVF9JU1JfVElNRVJfSU5JID0gMHgwZWQwLC8qIDMyIGJpdAlJU1IgVGltZXIgSW5pdC4gVmFsdWUgUmVnICovCisJU1RBVF9JU1JfVElNRVJfQ05UID0gMHgwZWQ0LC8qIDMyIGJpdAlJU1IgVGltZXIgQ291bnRlciBSZWcgKi8KKwlTVEFUX0lTUl9USU1FUl9DVFJMPSAweDBlZDgsLyogIDggYml0CUlTUiBUaW1lciBDb250cm9sIFJlZyAqLworCVNUQVRfSVNSX1RJTUVSX1RFU1Q9IDB4MGVkOSwvKiAgOCBiaXQJSVNSIFRpbWVyIFRlc3QgUmVnICovCit9OworCitlbnVtIHsKKwlMSU5LTEVEX09GRiAJICAgICA9IDB4MDEsCisJTElOS0xFRF9PTiAgCSAgICAgPSAweDAyLAorCUxJTktMRURfTElOS1NZTkNfT0ZGID0gMHgwNCwKKwlMSU5LTEVEX0xJTktTWU5DX09OICA9IDB4MDgsCisJTElOS0xFRF9CTElOS19PRkYgICAgPSAweDEwLAorCUxJTktMRURfQkxJTktfT04gICAgID0gMHgyMCwKK307CisKKy8qIEdNQUMgYW5kIEdQSFkgQ29udHJvbCBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCitlbnVtIHsKKwlHTUFDX0NUUkwJPSAweDBmMDAsLyogMzIgYml0CUdNQUMgQ29udHJvbCBSZWcgKi8KKwlHUEhZX0NUUkwJPSAweDBmMDQsLyogMzIgYml0CUdQSFkgQ29udHJvbCBSZWcgKi8KKwlHTUFDX0lSUV9TUkMJPSAweDBmMDgsLyogIDggYml0CUdNQUMgSW50ZXJydXB0IFNvdXJjZSBSZWcgKi8KKwlHTUFDX0lSUV9NU0sJPSAweDBmMGMsLyogIDggYml0CUdNQUMgSW50ZXJydXB0IE1hc2sgUmVnICovCisJR01BQ19MSU5LX0NUUkwJPSAweDBmMTAsLyogMTYgYml0CUxpbmsgQ29udHJvbCBSZWcgKi8KKworLyogV2FrZS11cCBGcmFtZSBQYXR0ZXJuIE1hdGNoIENvbnRyb2wgUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLworCVdPTF9DVFJMX1NUQVQJPSAweDBmMjAsLyogMTYgYml0CVdPTCBDb250cm9sL1N0YXR1cyBSZWcgKi8KKwlXT0xfTUFUQ0hfQ1RMCT0gMHgwZjIyLC8qICA4IGJpdAlXT0wgTWF0Y2ggQ29udHJvbCBSZWcgKi8KKwlXT0xfTUFUQ0hfUkVTCT0gMHgwZjIzLC8qICA4IGJpdAlXT0wgTWF0Y2ggUmVzdWx0IFJlZyAqLworCVdPTF9NQUNfQUREUgk9IDB4MGYyNCwvKiAzMiBiaXQJV09MIE1BQyBBZGRyZXNzICovCisJV09MX1BBVFRfUlBUUgk9IDB4MGYyYywvKiAgOCBiaXQJV09MIFBhdHRlcm4gUmVhZCBQb2ludGVyICovCisKKy8qIFdPTCBQYXR0ZXJuIExlbmd0aCBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCisJV09MX1BBVFRfTEVOX0xPCT0gMHgwZjMwLC8qIDMyIGJpdAlXT0wgUGF0dGVybiBMZW5ndGggMy4uMCAqLworCVdPTF9QQVRUX0xFTl9ISQk9IDB4MGYzNCwvKiAyNCBiaXQJV09MIFBhdHRlcm4gTGVuZ3RoIDYuLjQgKi8KKworLyogV09MIFBhdHRlcm4gQ291bnRlciBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCisJV09MX1BBVFRfQ05UXzAJPSAweDBmMzgsLyogMzIgYml0CVdPTCBQYXR0ZXJuIENvdW50ZXIgMy4uMCAqLworCVdPTF9QQVRUX0NOVF80CT0gMHgwZjNjLC8qIDI0IGJpdAlXT0wgUGF0dGVybiBDb3VudGVyIDYuLjQgKi8KK307CisjZGVmaW5lIFdPTF9SRUdTKHBvcnQsIHgpCSh4ICsgKHBvcnQpKjB4ODApCisKK2VudW0geworCVdPTF9QQVRUX1JBTV8xCT0gMHgxMDAwLC8qICBXT0wgUGF0dGVybiBSQU0gTGluayAxICovCisJV09MX1BBVFRfUkFNXzIJPSAweDE0MDAsLyogIFdPTCBQYXR0ZXJuIFJBTSBMaW5rIDIgKi8KK307CisjZGVmaW5lIFdPTF9QQVRUX1JBTV9CQVNFKHBvcnQpCShXT0xfUEFUVF9SQU1fMSArIChwb3J0KSoweDQwMCkKKworZW51bSB7CisJQkFTRV9HTUFDXzEJPSAweDI4MDAsLyogR01BQyAxIHJlZ2lzdGVycyAqLworCUJBU0VfR01BQ18yCT0gMHgzODAwLC8qIEdNQUMgMiByZWdpc3RlcnMgKi8KK307CisKKy8qCisgKiBNYXJ2ZWwtUEhZIFJlZ2lzdGVycywgaW5kaXJlY3QgYWRkcmVzc2VkIG92ZXIgR01BQworICovCitlbnVtIHsKKwlQSFlfTUFSVl9DVFJMCQk9IDB4MDAsLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworCVBIWV9NQVJWX1NUQVQJCT0gMHgwMSwvKiAxNiBiaXQgci9vCVBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlQSFlfTUFSVl9JRDAJCT0gMHgwMiwvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKwlQSFlfTUFSVl9JRDEJCT0gMHgwMywvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKwlQSFlfTUFSVl9BVU5FX0FEVgk9IDB4MDQsLyogMTYgYml0IHIvdwlBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworCVBIWV9NQVJWX0FVTkVfTFAJPSAweDA1LC8qIDE2IGJpdCByL28JTGluayBQYXJ0IEFiaWxpdHkgUmVnICovCisJUEhZX01BUlZfQVVORV9FWFAJPSAweDA2LC8qIDE2IGJpdCByL28JQXV0by1OZWcuIEV4cGFuc2lvbiBSZWcgKi8KKwlQSFlfTUFSVl9ORVBHCQk9IDB4MDcsLyogMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKwlQSFlfTUFSVl9ORVBHX0xQCT0gMHgwOCwvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKi8KKwkvKiBNYXJ2ZWwtc3BlY2lmaWMgcmVnaXN0ZXJzICovCisJUEhZX01BUlZfMTAwMFRfQ1RSTAk9IDB4MDksLyogMTYgYml0IHIvdwkxMDAwQmFzZS1UIENvbnRyb2wgUmVnICovCisJUEhZX01BUlZfMTAwMFRfU1RBVAk9IDB4MGEsLyogMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKwlQSFlfTUFSVl9FWFRfU1RBVAk9IDB4MGYsLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnICovCisJUEhZX01BUlZfUEhZX0NUUkwJPSAweDEwLC8qIDE2IGJpdCByL3cJUEhZIFNwZWNpZmljIEN0cmwgUmVnICovCisJUEhZX01BUlZfUEhZX1NUQVQJPSAweDExLC8qIDE2IGJpdCByL28JUEhZIFNwZWNpZmljIFN0YXQgUmVnICovCisJUEhZX01BUlZfSU5UX01BU0sJPSAweDEyLC8qIDE2IGJpdCByL3cJSW50ZXJydXB0IE1hc2sgUmVnICovCisJUEhZX01BUlZfSU5UX1NUQVQJPSAweDEzLC8qIDE2IGJpdCByL28JSW50ZXJydXB0IFN0YXR1cyBSZWcgKi8KKwlQSFlfTUFSVl9FWFRfQ1RSTAk9IDB4MTQsLyogMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjaWZpYyBDdHJsICovCisJUEhZX01BUlZfUlhFX0NOVAk9IDB4MTUsLyogMTYgYml0IHIvdwlSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKwlQSFlfTUFSVl9FWFRfQURSCT0gMHgxNiwvKiAxNiBiaXQgci93CUV4dC4gQWQuIGZvciBDYWJsZSBEaWFnLiAqLworCVBIWV9NQVJWX1BPUlRfSVJRCT0gMHgxNywvKiAxNiBiaXQgci9vCVBvcnQgMCBJUlEgKDg4RTExMTEgb25seSkgKi8KKwlQSFlfTUFSVl9MRURfQ1RSTAk9IDB4MTgsLyogMTYgYml0IHIvdwlMRUQgQ29udHJvbCBSZWcgKi8KKwlQSFlfTUFSVl9MRURfT1ZFUgk9IDB4MTksLyogMTYgYml0IHIvdwlNYW51YWwgTEVEIE92ZXJyaWRlIFJlZyAqLworCVBIWV9NQVJWX0VYVF9DVFJMXzIJPSAweDFhLC8qIDE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgQ3RybCAyICovCisJUEhZX01BUlZfRVhUX1BfU1RBVAk9IDB4MWIsLyogMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjLiBTdGF0IFJlZyAqLworCVBIWV9NQVJWX0NBQkxFX0RJQUcJPSAweDFjLC8qIDE2IGJpdCByL28JQ2FibGUgRGlhZ25vc3RpYyBSZWcgKi8KKwlQSFlfTUFSVl9QQUdFX0FERFIJPSAweDFkLC8qIDE2IGJpdCByL3cJRXh0ZW5kZWQgUGFnZSBBZGRyZXNzIFJlZyAqLworCVBIWV9NQVJWX1BBR0VfREFUQQk9IDB4MWUsLyogMTYgYml0IHIvdwlFeHRlbmRlZCBQYWdlIERhdGEgUmVnICovCisKKy8qIGZvciAxMC8xMDAgRmFzdCBFdGhlcm5ldCBQSFkgKDg4RTMwODIgb25seSkgKi8KKwlQSFlfTUFSVl9GRV9MRURfUEFSCT0gMHgxNiwvKiAxNiBiaXQgci93CUxFRCBQYXJhbGxlbCBTZWxlY3QgUmVnLiAqLworCVBIWV9NQVJWX0ZFX0xFRF9TRVIJPSAweDE3LC8qIDE2IGJpdCByL3cJTEVEIFN0cmVhbSBTZWxlY3QgUy4gTEVEICovCisJUEhZX01BUlZfRkVfVkNUX1RYCT0gMHgxYSwvKiAxNiBiaXQgci93CVZDVCBSZWcuIGZvciBUWFAvTiBQaW5zICovCisJUEhZX01BUlZfRkVfVkNUX1JYCT0gMHgxYiwvKiAxNiBiaXQgci9vCVZDVCBSZWcuIGZvciBSWFAvTiBQaW5zICovCisJUEhZX01BUlZfRkVfU1BFQ18yCT0gMHgxYywvKiAxNiBiaXQgci93CVNwZWNpZmljIENvbnRyb2wgUmVnLiAyICovCit9OworCitlbnVtIHsKKwlQSFlfQ1RfUkVTRVQJPSAxPDwxNSwgLyogQml0IDE1OiAoc2MpCWNsZWFyIGFsbCBQSFkgcmVsYXRlZCByZWdzICovCisJUEhZX0NUX0xPT1AJPSAxPDwxNCwgLyogQml0IDE0OgllbmFibGUgTG9vcGJhY2sgb3ZlciBQSFkgKi8KKwlQSFlfQ1RfU1BTX0xTQgk9IDE8PDEzLCAvKiBCaXQgMTM6CVNwZWVkIHNlbGVjdCwgbG93ZXIgYml0ICovCisJUEhZX0NUX0FORQk9IDE8PDEyLCAvKiBCaXQgMTI6CUF1dG8tTmVnb3RpYXRpb24gRW5hYmxlZCAqLworCVBIWV9DVF9QRE9XTgk9IDE8PDExLCAvKiBCaXQgMTE6CVBvd2VyIERvd24gTW9kZSAqLworCVBIWV9DVF9JU09MCT0gMTw8MTAsIC8qIEJpdCAxMDoJSXNvbGF0ZSBNb2RlICovCisJUEhZX0NUX1JFX0NGRwk9IDE8PDksIC8qIEJpdCAgOToJKHNjKSBSZXN0YXJ0IEF1dG8tTmVnb3RpYXRpb24gKi8KKwlQSFlfQ1RfRFVQX01ECT0gMTw8OCwgLyogQml0ICA4OglEdXBsZXggTW9kZSAqLworCVBIWV9DVF9DT0xfVFNUCT0gMTw8NywgLyogQml0ICA3OglDb2xsaXNpb24gVGVzdCBlbmFibGVkICovCisJUEhZX0NUX1NQU19NU0IJPSAxPDw2LCAvKiBCaXQgIDY6CVNwZWVkIHNlbGVjdCwgdXBwZXIgYml0ICovCit9OworCitlbnVtIHsKKwlQSFlfQ1RfU1AxMDAwCT0gUEhZX0NUX1NQU19NU0IsIC8qIGVuYWJsZSBzcGVlZCBvZiAxMDAwIE1icHMgKi8KKwlQSFlfQ1RfU1AxMDAJPSBQSFlfQ1RfU1BTX0xTQiwgLyogZW5hYmxlIHNwZWVkIG9mICAxMDAgTWJwcyAqLworCVBIWV9DVF9TUDEwCT0gMCwJCSAgLyogZW5hYmxlIHNwZWVkIG9mICAgMTAgTWJwcyAqLworfTsKKworZW51bSB7CisJUEhZX1NUX0VYVF9TVAk9IDE8PDgsIC8qIEJpdCAgODoJRXh0ZW5kZWQgU3RhdHVzIFByZXNlbnQgKi8KKworCVBIWV9TVF9QUkVfU1VQCT0gMTw8NiwgLyogQml0ICA2OglQcmVhbWJsZSBTdXBwcmVzc2lvbiAqLworCVBIWV9TVF9BTl9PVkVSCT0gMTw8NSwgLyogQml0ICA1OglBdXRvLU5lZ290aWF0aW9uIE92ZXIgKi8KKwlQSFlfU1RfUkVNX0ZMVAk9IDE8PDQsIC8qIEJpdCAgNDoJUmVtb3RlIEZhdWx0IENvbmRpdGlvbiBPY2N1cmVkICovCisJUEhZX1NUX0FOX0NBUAk9IDE8PDMsIC8qIEJpdCAgMzoJQXV0by1OZWdvdGlhdGlvbiBDYXBhYmlsaXR5ICovCisJUEhZX1NUX0xTWU5DCT0gMTw8MiwgLyogQml0ICAyOglMaW5rIFN5bmNocm9uaXplZCAqLworCVBIWV9TVF9KQUJfREVUCT0gMTw8MSwgLyogQml0ICAxOglKYWJiZXIgRGV0ZWN0ZWQgKi8KKwlQSFlfU1RfRVhUX1JFRwk9IDE8PDAsIC8qIEJpdCAgMDoJRXh0ZW5kZWQgUmVnaXN0ZXIgYXZhaWxhYmxlICovCit9OworCitlbnVtIHsKKwlQSFlfSTFfT1VJX01TSwk9IDB4M2Y8PDEwLCAvKiBCaXQgMTUuLjEwOglPcmdhbml6YXRpb24gVW5pcXVlIElEICovCisJUEhZX0kxX01PRF9OVU0JPSAweDNmPDw0LCAvKiBCaXQgIDkuLiA0OglNb2RlbCBOdW1iZXIgKi8KKwlQSFlfSTFfUkVWX01TSwk9IDB4ZiwgLyogQml0ICAzLi4gMDoJUmV2aXNpb24gTnVtYmVyICovCit9OworCisvKiBkaWZmZXJlbnQgTWFydmVsbCBQSFkgSWRzICovCitlbnVtIHsKKwlQSFlfTUFSVl9JRDBfVkFMPSAweDAxNDEsIC8qIE1hcnZlbGwgVW5pcXVlIElkZW50aWZpZXIgKi8KKworCVBIWV9CQ09NX0lEMV9BMQk9IDB4NjA0MSwKKwlQSFlfQkNPTV9JRDFfQjIJPSAweDYwNDMsCisJUEhZX0JDT01fSUQxX0MwCT0gMHg2MDQ0LAorCVBIWV9CQ09NX0lEMV9DNQk9IDB4NjA0NywKKworCVBIWV9NQVJWX0lEMV9CMAk9IDB4MEMyMywgLyogWXVrb24gCShQSFkgODhFMTAxMSkgKi8KKwlQSFlfTUFSVl9JRDFfQjIJPSAweDBDMjUsIC8qIFl1a29uLVBsdXMgKFBIWSA4OEUxMDExKSAqLworCVBIWV9NQVJWX0lEMV9DMgk9IDB4MENDMiwgLyogWXVrb24tRUMJKFBIWSA4OEUxMTExKSAqLworCVBIWV9NQVJWX0lEMV9ZMgk9IDB4MEM5MSwgLyogWXVrb24tMgkoUEhZIDg4RTExMTIpICovCisJUEhZX01BUlZfSUQxX0ZFID0gMHgwQzgzLCAvKiBZdWtvbi1GRSAgIChQSFkgODhFMzA4MiBSZXYuQTEpICovCisJUEhZX01BUlZfSUQxX0VDVT0gMHgwQ0IwLCAvKiBZdWtvbi1FQ1UgIChQSFkgODhFMTE0OSBSZXYuQjI/KSAqLworfTsKKworLyogQWR2ZXJ0aXNlbWVudCByZWdpc3RlciBiaXRzICovCitlbnVtIHsKKwlQSFlfQU5fTlhUX1BHCT0gMTw8MTUsIC8qIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKwlQSFlfQU5fQUNLCT0gMTw8MTQsIC8qIEJpdCAxNDoJKHJvKSBBY2tub3dsZWRnZSBSZWNlaXZlZCAqLworCVBIWV9BTl9SRgk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCBCaXRzICovCisKKwlQSFlfQU5fUEFVU0VfQVNZTSA9IDE8PDExLC8qIEJpdCAxMToJVHJ5IGZvciBhc3ltbWV0cmljICovCisJUEhZX0FOX1BBVVNFX0NBUCA9IDE8PDEwLCAvKiBCaXQgMTA6CVRyeSBmb3IgcGF1c2UgKi8KKwlQSFlfQU5fMTAwQkFTRTQJPSAxPDw5LCAvKiBCaXQgOToJVHJ5IGZvciAxMDBtYnBzIDRrIHBhY2tldHMgKi8KKwlQSFlfQU5fMTAwRlVMTAk9IDE8PDgsIC8qIEJpdCA4OglUcnkgZm9yIDEwMG1icHMgZnVsbC1kdXBsZXggKi8KKwlQSFlfQU5fMTAwSEFMRgk9IDE8PDcsIC8qIEJpdCA3OglUcnkgZm9yIDEwMG1icHMgaGFsZi1kdXBsZXggKi8KKwlQSFlfQU5fMTBGVUxMCT0gMTw8NiwgLyogQml0IDY6CVRyeSBmb3IgMTBtYnBzIGZ1bGwtZHVwbGV4ICovCisJUEhZX0FOXzEwSEFMRgk9IDE8PDUsIC8qIEJpdCA1OglUcnkgZm9yIDEwbWJwcyBoYWxmLWR1cGxleCAqLworCVBIWV9BTl9DU01BCT0gMTw8MCwgLyogQml0IDA6CU9ubHkgc2VsZWN0b3Igc3VwcG9ydGVkICovCisJUEhZX0FOX1NFTAk9IDB4MWYsIC8qIEJpdCA0Li4wOglTZWxlY3RvciBGaWVsZCwgMDAwMDE9RXRoZXJuZXQqLworCVBIWV9BTl9GVUxMCT0gUEhZX0FOXzEwMEZVTEwgfCBQSFlfQU5fMTBGVUxMIHwgUEhZX0FOX0NTTUEsCisJUEhZX0FOX0FMTAk9IFBIWV9BTl8xMEhBTEYgfCBQSFlfQU5fMTBGVUxMIHwKKwkJCSAgUEhZX0FOXzEwMEhBTEYgfCBQSFlfQU5fMTAwRlVMTCwKK307CisKKy8qKioqKiAgUEhZX0JDT01fMTAwMFRfU1RBVAkxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqKioqKi8KKy8qKioqKiAgUEhZX01BUlZfMTAwMFRfU1RBVAkxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqKioqKi8KK2VudW0geworCVBIWV9CXzEwMDBTX01TRgk9IDE8PDE1LCAvKiBCaXQgMTU6CU1hc3Rlci9TbGF2ZSBGYXVsdCAqLworCVBIWV9CXzEwMDBTX01TUgk9IDE8PDE0LCAvKiBCaXQgMTQ6CU1hc3Rlci9TbGF2ZSBSZXN1bHQgKi8KKwlQSFlfQl8xMDAwU19MUlMJPSAxPDwxMywgLyogQml0IDEzOglMb2NhbCBSZWNlaXZlciBTdGF0dXMgKi8KKwlQSFlfQl8xMDAwU19SUlMJPSAxPDwxMiwgLyogQml0IDEyOglSZW1vdGUgUmVjZWl2ZXIgU3RhdHVzICovCisJUEhZX0JfMTAwMFNfTFBfRkQJPSAxPDwxMSwgLyogQml0IDExOglMaW5rIFBhcnRuZXIgY2FuIEZEICovCisJUEhZX0JfMTAwMFNfTFBfSEQJPSAxPDwxMCwgLyogQml0IDEwOglMaW5rIFBhcnRuZXIgY2FuIEhEICovCisJCQkJCQkJCQkvKiBCaXQgIDkuLjg6CXJlc2VydmVkICovCisJUEhZX0JfMTAwMFNfSUVDCT0gMHhmZiwgLyogQml0ICA3Li4wOglJZGxlIEVycm9yIENvdW50ICovCit9OworCisvKiogTWFydmVsbC1TcGVjaWZpYyAqLworZW51bSB7CisJUEhZX01fQU5fTlhUX1BHCT0gMTw8MTUsIC8qIFJlcXVlc3QgTmV4dCBQYWdlICovCisJUEhZX01fQU5fQUNLCT0gMTw8MTQsIC8qIChybykJQWNrbm93bGVkZ2UgUmVjZWl2ZWQgKi8KKwlQSFlfTV9BTl9SRgk9IDE8PDEzLCAvKiBSZW1vdGUgRmF1bHQgKi8KKworCVBIWV9NX0FOX0FTUAk9IDE8PDExLCAvKiBBc3ltbWV0cmljIFBhdXNlICovCisJUEhZX01fQU5fUEMJPSAxPDwxMCwgLyogTUFDIFBhdXNlIGltcGxlbWVudGVkICovCisJUEhZX01fQU5fMTAwX1Q0CT0gMTw8OSwgLyogTm90IGNhcC4gMTAwQmFzZS1UNCAoYWx3YXlzIDApICovCisJUEhZX01fQU5fMTAwX0ZECT0gMTw8OCwgLyogQWR2ZXJ0aXNlIDEwMEJhc2UtVFggRnVsbCBEdXBsZXggKi8KKwlQSFlfTV9BTl8xMDBfSEQJPSAxPDw3LCAvKiBBZHZlcnRpc2UgMTAwQmFzZS1UWCBIYWxmIER1cGxleCAqLworCVBIWV9NX0FOXzEwX0ZECT0gMTw8NiwgLyogQWR2ZXJ0aXNlIDEwQmFzZS1UWCBGdWxsIER1cGxleCAqLworCVBIWV9NX0FOXzEwX0hECT0gMTw8NSwgLyogQWR2ZXJ0aXNlIDEwQmFzZS1UWCBIYWxmIER1cGxleCAqLworCVBIWV9NX0FOX1NFTF9NU0sgPTB4MWY8PDQsCS8qIEJpdCAgNC4uIDA6IFNlbGVjdG9yIEZpZWxkIE1hc2sgKi8KK307CisKKy8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgRklCRVIgKDg4RTEwMTFTIG9ubHkpICovCitlbnVtIHsKKwlQSFlfTV9BTl9BU1BfWAk9IDE8PDgsIC8qIEFzeW1tZXRyaWMgUGF1c2UgKi8KKwlQSFlfTV9BTl9QQ19YCT0gMTw8NywgLyogTUFDIFBhdXNlIGltcGxlbWVudGVkICovCisJUEhZX01fQU5fMTAwMFhfQUhECT0gMTw8NiwgLyogQWR2ZXJ0aXNlIDEwMDAwQmFzZS1YIEhhbGYgRHVwbGV4ICovCisJUEhZX01fQU5fMTAwMFhfQUZECT0gMTw8NSwgLyogQWR2ZXJ0aXNlIDEwMDAwQmFzZS1YIEZ1bGwgRHVwbGV4ICovCit9OworCisvKiBQYXVzZSBCaXRzIChQSFlfTV9BTl9BU1BfWCBhbmQgUEhZX01fQU5fUENfWCkgZW5jb2RpbmcgKi8KK2VudW0geworCVBIWV9NX1BfTk9fUEFVU0VfWAk9IDA8PDcsLyogQml0ICA4Li4gNzoJbm8gUGF1c2UgTW9kZSAqLworCVBIWV9NX1BfU1lNX01EX1gJPSAxPDw3LCAvKiBCaXQgIDguLiA3OglzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLworCVBIWV9NX1BfQVNZTV9NRF9YCT0gMjw8NywvKiBCaXQgIDguLiA3Oglhc3ltbWV0cmljIFBhdXNlIE1vZGUgKi8KKwlQSFlfTV9QX0JPVEhfTURfWAk9IDM8PDcsLyogQml0ICA4Li4gNzoJYm90aCBQYXVzZSBNb2RlICovCit9OworCisvKioqKiogIFBIWV9NQVJWXzEwMDBUX0NUUkwJMTYgYml0IHIvdwkxMDAwQmFzZS1UIENvbnRyb2wgUmVnICoqKioqLworZW51bSB7CisJUEhZX01fMTAwMENfVEVTVAk9IDc8PDEzLC8qIEJpdCAxNS4uMTM6CVRlc3QgTW9kZXMgKi8KKwlQSFlfTV8xMDAwQ19NU0UJPSAxPDwxMiwgLyogTWFudWFsIE1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKwlQSFlfTV8xMDAwQ19NU0MJPSAxPDwxMSwgLyogTS9TIENvbmZpZ3VyYXRpb24gKDE9TWFzdGVyKSAqLworCVBIWV9NXzEwMDBDX01QRAk9IDE8PDEwLCAvKiBNdWx0aS1Qb3J0IERldmljZSAqLworCVBIWV9NXzEwMDBDX0FGRAk9IDE8PDksIC8qIEFkdmVydGlzZSBGdWxsIER1cGxleCAqLworCVBIWV9NXzEwMDBDX0FIRAk9IDE8PDgsIC8qIEFkdmVydGlzZSBIYWxmIER1cGxleCAqLworfTsKKworLyoqKioqICBQSFlfTUFSVl9QSFlfQ1RSTAkxNiBiaXQgci93CVBIWSBTcGVjaWZpYyBDdHJsIFJlZyAqKioqKi8KK2VudW0geworCVBIWV9NX1BDX1RYX0ZGRF9NU0sJPSAzPDwxNCwvKiBCaXQgMTUuLjE0OiBUeCBGSUZPIERlcHRoIE1hc2sgKi8KKwlQSFlfTV9QQ19SWF9GRkRfTVNLCT0gMzw8MTIsLyogQml0IDEzLi4xMjogUnggRklGTyBEZXB0aCBNYXNrICovCisJUEhZX01fUENfQVNTX0NSU19UWAk9IDE8PDExLCAvKiBBc3NlcnQgQ1JTIG9uIFRyYW5zbWl0ICovCisJUEhZX01fUENfRkxfR09PRAk9IDE8PDEwLCAvKiBGb3JjZSBMaW5rIEdvb2QgKi8KKwlQSFlfTV9QQ19FTl9ERVRfTVNLCT0gMzw8OCwvKiBCaXQgIDkuLiA4OiBFbmVyZ3kgRGV0ZWN0IE1hc2sgKi8KKwlQSFlfTV9QQ19FTkFfRVhUX0QJPSAxPDw3LCAvKiBFbmFibGUgRXh0LiBEaXN0YW5jZSAoMTBCVCkgKi8KKwlQSFlfTV9QQ19NRElYX01TSwk9IDM8PDUsLyogQml0ICA2Li4gNTogTURJL01ESVggQ29uZmlnLiBNYXNrICovCisJUEhZX01fUENfRElTXzEyNUNMSwk9IDE8PDQsIC8qIERpc2FibGUgMTI1IENMSyAqLworCVBIWV9NX1BDX01BQ19QT1dfVVAJPSAxPDwzLCAvKiBNQUMgUG93ZXIgdXAgKi8KKwlQSFlfTV9QQ19TUUVfVF9FTkEJPSAxPDwyLCAvKiBTUUUgVGVzdCBFbmFibGVkICovCisJUEhZX01fUENfUE9MX1JfRElTCT0gMTw8MSwgLyogUG9sYXJpdHkgUmV2ZXJzYWwgRGlzYWJsZWQgKi8KKwlQSFlfTV9QQ19ESVNfSkFCQkVSCT0gMTw8MCwgLyogRGlzYWJsZSBKYWJiZXIgKi8KK307CisKK2VudW0geworCVBIWV9NX1BDX0VOX0RFVAkJPSAyPDw4LAkvKiBFbmVyZ3kgRGV0ZWN0IChNb2RlIDEpICovCisJUEhZX01fUENfRU5fREVUX1BMVVMJPSAzPDw4LCAvKiBFbmVyZ3kgRGV0ZWN0IFBsdXMgKE1vZGUgMikgKi8KK307CisKKyNkZWZpbmUgUEhZX01fUENfTURJX1hNT0RFKHgpCSgoKHUxNikoeCk8PDUpICYgUEhZX01fUENfTURJWF9NU0spCisKK2VudW0geworCVBIWV9NX1BDX01BTl9NREkJPSAwLCAvKiAwMCA9IE1hbnVhbCBNREkgY29uZmlndXJhdGlvbiAqLworCVBIWV9NX1BDX01BTl9NRElYCT0gMSwgLyogMDEgPSBNYW51YWwgTURJWCBjb25maWd1cmF0aW9uICovCisJUEhZX01fUENfRU5BX0FVVE8JPSAzLCAvKiAxMSA9IEVuYWJsZSBBdXRvbWF0aWMgQ3Jvc3NvdmVyICovCit9OworCisvKiBmb3IgWXVrb24tRUMgVWx0cmEgR2lnYWJpdCBFdGhlcm5ldCBQSFkgKDg4RTExNDkgb25seSkgKi8KK2VudW0geworCVBIWV9NX1BDX0NPUF9UWF9ESVMJPSAxPDwzLCAvKiBDb3BwZXIgVHJhbnNtaXR0ZXIgRGlzYWJsZSAqLworCVBIWV9NX1BDX1BPV19EX0VOQQk9IDE8PDIsCS8qIFBvd2VyIERvd24gRW5hYmxlICovCit9OworCisvKiBmb3IgMTAvMTAwIEZhc3QgRXRoZXJuZXQgUEhZICg4OEUzMDgyIG9ubHkpICovCitlbnVtIHsKKwlQSFlfTV9QQ19FTkFfRFRFX0RUCT0gMTw8MTUsIC8qIEVuYWJsZSBEYXRhIFRlcm1pbmFsIEVxdS4gKERURSkgRGV0ZWN0ICovCisJUEhZX01fUENfRU5BX0VORV9EVAk9IDE8PDE0LCAvKiBFbmFibGUgRW5lcmd5IERldGVjdCAoc2Vuc2UgJiBwdWxzZSkgKi8KKwlQSFlfTV9QQ19ESVNfTkxQX0NLCT0gMTw8MTMsIC8qIERpc2FibGUgTm9ybWFsIExpbmsgUHVscyAoTkxQKSBDaGVjayAqLworCVBIWV9NX1BDX0VOQV9MSVBfTlAJPSAxPDwxMiwgLyogRW5hYmxlIExpbmsgUGFydG5lciBOZXh0IFBhZ2UgUmVnLiAqLworCVBIWV9NX1BDX0RJU19OTFBfR04JPSAxPDwxMSwgLyogRGlzYWJsZSBOb3JtYWwgTGluayBQdWxzIEdlbmVyYXRpb24gKi8KKworCVBIWV9NX1BDX0RJU19TQ1JBTUIJPSAxPDw5LCAvKiBEaXNhYmxlIFNjcmFtYmxlciAqLworCVBIWV9NX1BDX0RJU19GRUZJCT0gMTw8OCwgLyogRGlzYWJsZSBGYXIgRW5kIEZhdWx0IEluZGljLiAoRkVGSSkgKi8KKworCVBIWV9NX1BDX1NIX1RQX1NFTAk9IDE8PDYsIC8qIFNoaWVsZGVkIFR3aXN0ZWQgUGFpciBTZWxlY3QgKi8KKwlQSFlfTV9QQ19SWF9GRF9NU0sJPSAzPDwyLC8qIEJpdCAgMy4uIDI6IFJ4IEZJRk8gRGVwdGggTWFzayAqLworfTsKKworLyoqKioqICBQSFlfTUFSVl9QSFlfU1RBVAkxNiBiaXQgci9vCVBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnICoqKioqLworZW51bSB7CisJUEhZX01fUFNfU1BFRURfTVNLCT0gMzw8MTQsIC8qIEJpdCAxNS4uMTQ6IFNwZWVkIE1hc2sgKi8KKwlQSFlfTV9QU19TUEVFRF8xMDAwCT0gMTw8MTUsIC8qCQkxMCA9IDEwMDAgTWJwcyAqLworCVBIWV9NX1BTX1NQRUVEXzEwMAk9IDE8PDE0LCAvKgkJMDEgPSAgMTAwIE1icHMgKi8KKwlQSFlfTV9QU19TUEVFRF8xMAk9IDAsCSAvKgkJMDAgPSAgIDEwIE1icHMgKi8KKwlQSFlfTV9QU19GVUxMX0RVUAk9IDE8PDEzLCAvKiBGdWxsIER1cGxleCAqLworCVBIWV9NX1BTX1BBR0VfUkVDCT0gMTw8MTIsIC8qIFBhZ2UgUmVjZWl2ZWQgKi8KKwlQSFlfTV9QU19TUERVUF9SRVMJPSAxPDwxMSwgLyogU3BlZWQgJiBEdXBsZXggUmVzb2x2ZWQgKi8KKwlQSFlfTV9QU19MSU5LX1VQCT0gMTw8MTAsIC8qIExpbmsgVXAgKi8KKwlQSFlfTV9QU19DQUJMRV9NU0sJPSA3PDw3LCAgLyogQml0ICA5Li4gNzogQ2FibGUgTGVuZ3RoIE1hc2sgKi8KKwlQSFlfTV9QU19NRElfWF9TVEFUCT0gMTw8NiwgIC8qIE1ESSBDcm9zc292ZXIgU3RhdCAoMT1NRElYKSAqLworCVBIWV9NX1BTX0RPV05TX1NUQVQJPSAxPDw1LCAgLyogRG93bnNoaWZ0IFN0YXR1cyAoMT1kb3duc2guKSAqLworCVBIWV9NX1BTX0VOREVUX1NUQVQJPSAxPDw0LCAgLyogRW5lcmd5IERldGVjdCBTdGF0dXMgKDE9YWN0KSAqLworCVBIWV9NX1BTX1RYX1BfRU4JPSAxPDwzLCAgLyogVHggUGF1c2UgRW5hYmxlZCAqLworCVBIWV9NX1BTX1JYX1BfRU4JPSAxPDwyLCAgLyogUnggUGF1c2UgRW5hYmxlZCAqLworCVBIWV9NX1BTX1BPTF9SRVYJPSAxPDwxLCAgLyogUG9sYXJpdHkgUmV2ZXJzZWQgKi8KKwlQSFlfTV9QU19KQUJCRVIJCT0gMTw8MCwgIC8qIEphYmJlciAqLworfTsKKworI2RlZmluZSBQSFlfTV9QU19QQVVTRV9NU0sJKFBIWV9NX1BTX1RYX1BfRU4gfCBQSFlfTV9QU19SWF9QX0VOKQorCisvKiBmb3IgMTAvMTAwIEZhc3QgRXRoZXJuZXQgUEhZICg4OEUzMDgyIG9ubHkpICovCitlbnVtIHsKKwlQSFlfTV9QU19EVEVfREVURUNUCT0gMTw8MTUsIC8qIERhdGEgVGVybWluYWwgRXF1aXBtZW50IChEVEUpIERldGVjdGVkICovCisJUEhZX01fUFNfUkVTX1NQRUVECT0gMTw8MTQsIC8qIFJlc29sdmVkIFNwZWVkICgxPTEwMCBNYnBzLCAwPTEwIE1icHMgKi8KK307CisKK2VudW0geworCVBIWV9NX0lTX0FOX0VSUk9SCT0gMTw8MTUsIC8qIEF1dG8tTmVnb3RpYXRpb24gRXJyb3IgKi8KKwlQSFlfTV9JU19MU1BfQ0hBTkdFCT0gMTw8MTQsIC8qIExpbmsgU3BlZWQgQ2hhbmdlZCAqLworCVBIWV9NX0lTX0RVUF9DSEFOR0UJPSAxPDwxMywgLyogRHVwbGV4IE1vZGUgQ2hhbmdlZCAqLworCVBIWV9NX0lTX0FOX1BSCQk9IDE8PDEyLCAvKiBQYWdlIFJlY2VpdmVkICovCisJUEhZX01fSVNfQU5fQ09NUEwJPSAxPDwxMSwgLyogQXV0by1OZWdvdGlhdGlvbiBDb21wbGV0ZWQgKi8KKwlQSFlfTV9JU19MU1RfQ0hBTkdFCT0gMTw8MTAsIC8qIExpbmsgU3RhdHVzIENoYW5nZWQgKi8KKwlQSFlfTV9JU19TWU1CX0VSUk9SCT0gMTw8OSwgLyogU3ltYm9sIEVycm9yICovCisJUEhZX01fSVNfRkFMU0VfQ0FSUgk9IDE8PDgsIC8qIEZhbHNlIENhcnJpZXIgKi8KKwlQSFlfTV9JU19GSUZPX0VSUk9SCT0gMTw8NywgLyogRklGTyBPdmVyZmxvdy9VbmRlcnJ1biBFcnJvciAqLworCVBIWV9NX0lTX01ESV9DSEFOR0UJPSAxPDw2LCAvKiBNREkgQ3Jvc3NvdmVyIENoYW5nZWQgKi8KKwlQSFlfTV9JU19ET1dOU0hfREVUCT0gMTw8NSwgLyogRG93bnNoaWZ0IERldGVjdGVkICovCisJUEhZX01fSVNfRU5EX0NIQU5HRQk9IDE8PDQsIC8qIEVuZXJneSBEZXRlY3QgQ2hhbmdlZCAqLworCisJUEhZX01fSVNfRFRFX0NIQU5HRQk9IDE8PDIsIC8qIERURSBQb3dlciBEZXQuIFN0YXR1cyBDaGFuZ2VkICovCisJUEhZX01fSVNfUE9MX0NIQU5HRQk9IDE8PDEsIC8qIFBvbGFyaXR5IENoYW5nZWQgKi8KKwlQSFlfTV9JU19KQUJCRVIJCT0gMTw8MCwgLyogSmFiYmVyICovCisKKwlQSFlfTV9ERUZfTVNLCQk9IFBIWV9NX0lTX0xTUF9DSEFOR0UgfCBQSFlfTV9JU19MU1RfQ0hBTkdFCisJCQkJIHwgUEhZX01fSVNfRFVQX0NIQU5HRSwKKwlQSFlfTV9BTl9NU0sJICAgICAgID0gUEhZX01fSVNfQU5fRVJST1IgfCBQSFlfTV9JU19BTl9DT01QTCwKK307CisKKworLyoqKioqICBQSFlfTUFSVl9FWFRfQ1RSTAkxNiBiaXQgci93CUV4dC4gUEhZIFNwZWNpZmljIEN0cmwgKioqKiovCitlbnVtIHsKKwlQSFlfTV9FQ19FTkFfQkNfRVhUID0gMTw8MTUsIC8qIEVuYWJsZSBCbG9jayBDYXJyLiBFeHQuICg4OEUxMTExIG9ubHkpICovCisJUEhZX01fRUNfRU5BX0xJTl9MQiA9IDE8PDE0LCAvKiBFbmFibGUgTGluZSBMb29wYmFjayAoODhFMTExMSBvbmx5KSAqLworCisJUEhZX01fRUNfRElTX0xJTktfUCA9IDE8PDEyLCAvKiBEaXNhYmxlIExpbmsgUHVsc2VzICg4OEUxMTExIG9ubHkpICovCisJUEhZX01fRUNfTV9EU0NfTVNLICA9IDM8PDEwLCAvKiBCaXQgMTEuLjEwOglNYXN0ZXIgRG93bnNoaWZ0IENvdW50ZXIgKi8KKwkJCQkJLyogKDg4RTEwMTEgb25seSkgKi8KKwlQSFlfTV9FQ19TX0RTQ19NU0sgID0gMzw8OCwvKiBCaXQgIDkuLiA4OglTbGF2ZSAgRG93bnNoaWZ0IENvdW50ZXIgKi8KKwkJCQkgICAgICAgLyogKDg4RTEwMTEgb25seSkgKi8KKwlQSFlfTV9FQ19NX0RTQ19NU0syID0gNzw8OSwvKiBCaXQgMTEuLiA5OglNYXN0ZXIgRG93bnNoaWZ0IENvdW50ZXIgKi8KKwkJCQkJLyogKDg4RTExMTEgb25seSkgKi8KKwlQSFlfTV9FQ19ET1dOX1NfRU5BID0gMTw8OCwgLyogRG93bnNoaWZ0IEVuYWJsZSAoODhFMTExMSBvbmx5KSAqLworCQkJCQkvKiAhISEgRXJyYXRhIGluIHNwZWMuICgxID0gZGlzYWJsZSkgKi8KKwlQSFlfTV9FQ19SWF9USU1fQ1QgID0gMTw8NywgLyogUkdNSUkgUnggVGltaW5nIENvbnRyb2wqLworCVBIWV9NX0VDX01BQ19TX01TSyAgPSA3PDw0LC8qIEJpdCAgNi4uIDQ6CURlZi4gTUFDIGludGVyZmFjZSBzcGVlZCAqLworCVBIWV9NX0VDX0ZJQl9BTl9FTkEgPSAxPDwzLCAvKiBGaWJlciBBdXRvLU5lZy4gRW5hYmxlICg4OEUxMDExUyBvbmx5KSAqLworCVBIWV9NX0VDX0RURV9EX0VOQSAgPSAxPDwyLCAvKiBEVEUgRGV0ZWN0IEVuYWJsZSAoODhFMTExMSBvbmx5KSAqLworCVBIWV9NX0VDX1RYX1RJTV9DVCAgPSAxPDwxLCAvKiBSR01JSSBUeCBUaW1pbmcgQ29udHJvbCAqLworCVBIWV9NX0VDX1RSQU5TX0RJUyAgPSAxPDwwLCAvKiBUcmFuc21pdHRlciBEaXNhYmxlICg4OEUxMTExIG9ubHkpICovfTsKKworI2RlZmluZSBQSFlfTV9FQ19NX0RTQyh4KQkoKHUxNikoeCk8PDEwICYgUEhZX01fRUNfTV9EU0NfTVNLKQorCQkJCQkvKiAwMD0xeDsgMDE9Mng7IDEwPTN4OyAxMT00eCAqLworI2RlZmluZSBQSFlfTV9FQ19TX0RTQyh4KQkoKHUxNikoeCk8PDggJiBQSFlfTV9FQ19TX0RTQ19NU0spCisJCQkJCS8qIDAwPWRpczsgMDE9MXg7IDEwPTJ4OyAxMT0zeCAqLworI2RlZmluZSBQSFlfTV9FQ19EU0NfMih4KQkoKHUxNikoeCk8PDkgJiBQSFlfTV9FQ19NX0RTQ19NU0syKQorCQkJCQkvKiAwMDA9MXg7IDAwMT0yeDsgMDEwPTN4OyAwMTE9NHggKi8KKyNkZWZpbmUgUEhZX01fRUNfTUFDX1MoeCkJKCh1MTYpKHgpPDw0ICYgUEhZX01fRUNfTUFDX1NfTVNLKQorCQkJCQkvKiAwMVg9MDsgMTEwPTIuNTsgMTExPTI1IChNSHopICovCisKKy8qIGZvciBZdWtvbi0yIEdpZ2FiaXQgRXRoZXJuZXQgUEhZICg4OEUxMTEyIG9ubHkpICovCitlbnVtIHsKKwlQSFlfTV9QQ19ESVNfTElOS19QYQk9IDE8PDE1LC8qIERpc2FibGUgTGluayBQdWxzZXMgKi8KKwlQSFlfTV9QQ19EU0NfTVNLCT0gNzw8MTIsLyogQml0IDE0Li4xMjoJRG93bnNoaWZ0IENvdW50ZXIgKi8KKwlQSFlfTV9QQ19ET1dOX1NfRU5BCT0gMTw8MTEsLyogRG93bnNoaWZ0IEVuYWJsZSAqLworfTsKKy8qICEhISBFcnJhdGEgaW4gc3BlYy4gKDEgPSBkaXNhYmxlKSAqLworCisjZGVmaW5lIFBIWV9NX1BDX0RTQyh4KQkJCSgoKHUxNikoeCk8PDEyKSAmIFBIWV9NX1BDX0RTQ19NU0spCisJCQkJCQkJCQkJCS8qIDEwMD01eDsgMTAxPTZ4OyAxMTA9N3g7IDExMT04eCAqLworZW51bSB7CisJTUFDX1RYX0NMS18wX01IWgk9IDIsCisJTUFDX1RYX0NMS18yXzVfTUhaCT0gNiwKKwlNQUNfVFhfQ0xLXzI1X01IWiAJPSA3LAorfTsKKworLyoqKioqICBQSFlfTUFSVl9MRURfQ1RSTAkxNiBiaXQgci93CUxFRCBDb250cm9sIFJlZyAqKioqKi8KK2VudW0geworCVBIWV9NX0xFRENfRElTX0xFRAk9IDE8PDE1LCAvKiBEaXNhYmxlIExFRCAqLworCVBIWV9NX0xFRENfUFVMU19NU0sJPSA3PDwxMiwvKiBCaXQgMTQuLjEyOiBQdWxzZSBTdHJldGNoIE1hc2sgKi8KKwlQSFlfTV9MRURDX0ZfSU5UCT0gMTw8MTEsIC8qIEZvcmNlIEludGVycnVwdCAqLworCVBIWV9NX0xFRENfQkxfUl9NU0sJPSA3PDw4LC8qIEJpdCAxMC4uIDg6IEJsaW5rIFJhdGUgTWFzayAqLworCVBIWV9NX0xFRENfRFBfQ19MU0IJPSAxPDw3LCAvKiBEdXBsZXggQ29udHJvbCAoTFNCLCA4OEUxMTExIG9ubHkpICovCisJUEhZX01fTEVEQ19UWF9DX0xTQgk9IDE8PDYsIC8qIFR4IENvbnRyb2wgKExTQiwgODhFMTExMSBvbmx5KSAqLworCVBIWV9NX0xFRENfTEtfQ19NU0sJPSA3PDwzLC8qIEJpdCAgNS4uIDM6IExpbmsgQ29udHJvbCBNYXNrICovCisJCQkJCS8qICg4OEUxMTExIG9ubHkpICovCit9OworCitlbnVtIHsKKwlQSFlfTV9MRURDX0xJTktfTVNLCT0gMzw8MywvKiBCaXQgIDQuLiAzOiBMaW5rIENvbnRyb2wgTWFzayAqLworCQkJCQkJCQkJLyogKDg4RTEwMTEgb25seSkgKi8KKwlQSFlfTV9MRURDX0RQX0NUUkwJPSAxPDwyLCAvKiBEdXBsZXggQ29udHJvbCAqLworCVBIWV9NX0xFRENfRFBfQ19NU0IJPSAxPDwyLCAvKiBEdXBsZXggQ29udHJvbCAoTVNCLCA4OEUxMTExIG9ubHkpICovCisJUEhZX01fTEVEQ19SWF9DVFJMCT0gMTw8MSwgLyogUnggQWN0aXZpdHkgLyBMaW5rICovCisJUEhZX01fTEVEQ19UWF9DVFJMCT0gMTw8MCwgLyogVHggQWN0aXZpdHkgLyBMaW5rICovCisJUEhZX01fTEVEQ19UWF9DX01TQgk9IDE8PDAsIC8qIFR4IENvbnRyb2wgKE1TQiwgODhFMTExMSBvbmx5KSAqLworfTsKKworI2RlZmluZSBQSFlfTV9MRURfUFVMU19EVVIoeCkJKCgodTE2KSh4KTw8MTIpICYgUEhZX01fTEVEQ19QVUxTX01TSykKKworLyoqKioqICBQSFlfTUFSVl9QSFlfU1RBVCAocGFnZSAzKTE2IGJpdCByL3cJUG9sYXJpdHkgQ29udHJvbCBSZWcuICoqKioqLworZW51bSB7CisJUEhZX01fUE9MQ19MUzFNX01TSwk9IDB4Zjw8MTIsIC8qIEJpdCAxNS4uMTI6IExPUyxTVEFUMSBNaXggJSBNYXNrICovCisJUEhZX01fUE9MQ19JUzBNX01TSwk9IDB4Zjw8OCwgIC8qIEJpdCAxMS4uIDg6IElOSVQsU1RBVDAgTWl4ICUgTWFzayAqLworCVBIWV9NX1BPTENfTE9TX01TSwk9IDB4Mzw8NiwgIC8qIEJpdCAgNy4uIDY6IExPUyBQb2wuIEN0cmwuIE1hc2sgKi8KKwlQSFlfTV9QT0xDX0lOSVRfTVNLCT0gMHgzPDw0LCAgLyogQml0ICA1Li4gNDogSU5JVCBQb2wuIEN0cmwuIE1hc2sgKi8KKwlQSFlfTV9QT0xDX1NUQTFfTVNLCT0gMHgzPDwyLCAgLyogQml0ICAzLi4gMjogU1RBVDEgUG9sLiBDdHJsLiBNYXNrICovCisJUEhZX01fUE9MQ19TVEEwX01TSwk9IDB4MywgICAgIC8qIEJpdCAgMS4uIDA6IFNUQVQwIFBvbC4gQ3RybC4gTWFzayAqLworfTsKKworI2RlZmluZSBQSFlfTV9QT0xDX0xTMV9QX01JWCh4KQkoKCh4KTw8MTIpICYgUEhZX01fUE9MQ19MUzFNX01TSykKKyNkZWZpbmUgUEhZX01fUE9MQ19JUzBfUF9NSVgoeCkJKCgoeCk8PDgpICYgUEhZX01fUE9MQ19JUzBNX01TSykKKyNkZWZpbmUgUEhZX01fUE9MQ19MT1NfQ1RSTCh4KQkoKCh4KTw8NikgJiBQSFlfTV9QT0xDX0xPU19NU0spCisjZGVmaW5lIFBIWV9NX1BPTENfSU5JVF9DVFJMKHgpCSgoKHgpPDw0KSAmIFBIWV9NX1BPTENfSU5JVF9NU0spCisjZGVmaW5lIFBIWV9NX1BPTENfU1RBMV9DVFJMKHgpCSgoKHgpPDwyKSAmIFBIWV9NX1BPTENfU1RBMV9NU0spCisjZGVmaW5lIFBIWV9NX1BPTENfU1RBMF9DVFJMKHgpCSgoKHgpPDwwKSAmIFBIWV9NX1BPTENfU1RBMF9NU0spCisKK2VudW0geworCVBVTFNfTk9fU1RSCT0gMCwvKiBubyBwdWxzZSBzdHJldGNoaW5nICovCisJUFVMU18yMU1TCT0gMSwvKiAyMSBtcyB0byA0MiBtcyAqLworCVBVTFNfNDJNUwk9IDIsLyogNDIgbXMgdG8gODQgbXMgKi8KKwlQVUxTXzg0TVMJPSAzLC8qIDg0IG1zIHRvIDE3MCBtcyAqLworCVBVTFNfMTcwTVMJPSA0LC8qIDE3MCBtcyB0byAzNDAgbXMgKi8KKwlQVUxTXzM0ME1TCT0gNSwvKiAzNDAgbXMgdG8gNjcwIG1zICovCisJUFVMU182NzBNUwk9IDYsLyogNjcwIG1zIHRvIDEuMyBzICovCisJUFVMU18xMzAwTVMJPSA3LC8qIDEuMyBzIHRvIDIuNyBzICovCit9OworCisjZGVmaW5lIFBIWV9NX0xFRF9CTElOS19SVCh4KQkoKCh1MTYpKHgpPDw4KSAmIFBIWV9NX0xFRENfQkxfUl9NU0spCisKK2VudW0geworCUJMSU5LXzQyTVMJPSAwLC8qIDQyIG1zICovCisJQkxJTktfODRNUwk9IDEsLyogODQgbXMgKi8KKwlCTElOS18xNzBNUwk9IDIsLyogMTcwIG1zICovCisJQkxJTktfMzQwTVMJPSAzLC8qIDM0MCBtcyAqLworCUJMSU5LXzY3ME1TCT0gNCwvKiA2NzAgbXMgKi8KK307CisKKy8qKioqKiAgUEhZX01BUlZfTEVEX09WRVIJMTYgYml0IHIvdwlNYW51YWwgTEVEIE92ZXJyaWRlIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PX1NHTUlJKHgpCSgoeCk8PDE0KQkvKiBCaXQgMTUuLjE0OiAgU0dNSUkgQU4gVGltZXIgKi8KKworI2RlZmluZSBQSFlfTV9MRURfTU9fRFVQKHgpCSgoeCk8PDEwKQkvKiBCaXQgMTEuLjEwOiAgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT18xMCh4KQkoKHgpPDw4KQkvKiBCaXQgIDkuLiA4OiAgTGluayAxMCAqLworI2RlZmluZSBQSFlfTV9MRURfTU9fMTAwKHgpCSgoeCk8PDYpCS8qIEJpdCAgNy4uIDY6ICBMaW5rIDEwMCAqLworI2RlZmluZSBQSFlfTV9MRURfTU9fMTAwMCh4KQkoKHgpPDw0KQkvKiBCaXQgIDUuLiA0OiAgTGluayAxMDAwICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT19SWCh4KQkoKHgpPDwyKQkvKiBCaXQgIDMuLiAyOiAgUnggKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PX1RYKHgpCSgoeCk8PDApCS8qIEJpdCAgMS4uIDA6ICBUeCAqLworCitlbnVtIGxlZF9tb2RlIHsKKwlNT19MRURfTk9STSAgPSAwLAorCU1PX0xFRF9CTElOSyA9IDEsCisJTU9fTEVEX09GRiAgID0gMiwKKwlNT19MRURfT04gICAgPSAzLAorfTsKKworLyoqKioqICBQSFlfTUFSVl9FWFRfQ1RSTF8yCTE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgQ3RybCAyICoqKioqLworZW51bSB7CisJUEhZX01fRUMyX0ZJX0lNUEVECT0gMTw8NiwgLyogRmliZXIgSW5wdXQgIEltcGVkYW5jZSAqLworCVBIWV9NX0VDMl9GT19JTVBFRAk9IDE8PDUsIC8qIEZpYmVyIE91dHB1dCBJbXBlZGFuY2UgKi8KKwlQSFlfTV9FQzJfRk9fTV9DTEsJPSAxPDw0LCAvKiBGaWJlciBNb2RlIENsb2NrIEVuYWJsZSAqLworCVBIWV9NX0VDMl9GT19CT09TVAk9IDE8PDMsIC8qIEZpYmVyIE91dHB1dCBCb29zdCAqLworCVBIWV9NX0VDMl9GT19BTV9NU0sJPSA3LC8qIEJpdCAgMi4uIDA6CUZpYmVyIE91dHB1dCBBbXBsaXR1ZGUgKi8KK307CisKKy8qKioqKiAgUEhZX01BUlZfRVhUX1BfU1RBVCAxNiBiaXQgci93CUV4dC4gUEhZIFNwZWNpZmljIFN0YXR1cyAqKioqKi8KK2VudW0geworCVBIWV9NX0ZDX0FVVE9fU0VMCT0gMTw8MTUsIC8qIEZpYmVyL0NvcHBlciBBdXRvIFNlbC4gRGlzLiAqLworCVBIWV9NX0ZDX0FOX1JFR19BQ0MJPSAxPDwxNCwgLyogRmliZXIvQ29wcGVyIEFOIFJlZy4gQWNjZXNzICovCisJUEhZX01fRkNfUkVTT0xVVElPTgk9IDE8PDEzLCAvKiBGaWJlci9Db3BwZXIgUmVzb2x1dGlvbiAqLworCVBIWV9NX1NFUl9JRl9BTl9CUAk9IDE8PDEyLCAvKiBTZXIuIElGIEFOIEJ5cGFzcyBFbmFibGUgKi8KKwlQSFlfTV9TRVJfSUZfQlBfU1QJPSAxPDwxMSwgLyogU2VyLiBJRiBBTiBCeXBhc3MgU3RhdHVzICovCisJUEhZX01fSVJRX1BPTEFSSVRZCT0gMTw8MTAsIC8qIElSUSBwb2xhcml0eSAqLworCVBIWV9NX0RJU19BVVRfTUVECT0gMTw8OSwgLyogRGlzYWJsZSBBdXQuIE1lZGl1bSBSZWcuIFNlbGVjdGlvbiAqLworCS8qICg4OEUxMTExIG9ubHkpICovCisKKwlQSFlfTV9VTkRPQzEJCT0gMTw8NywgLyogdW5kb2N1bWVudGVkIGJpdCAhISAqLworCVBIWV9NX0RURV9QT1dfU1RBVAk9IDE8PDQsIC8qIERURSBQb3dlciBTdGF0dXMgKDg4RTExMTEgb25seSkgKi8KKwlQSFlfTV9NT0RFX01BU0sJPSAweGYsIC8qIEJpdCAgMy4uIDA6IGNvcHkgb2YgSFdDRkcgTU9ERVszOjBdICovCit9OworCisvKiBmb3IgMTAvMTAwIEZhc3QgRXRoZXJuZXQgUEhZICg4OEUzMDgyIG9ubHkpICovCisvKioqKiogIFBIWV9NQVJWX0ZFX0xFRF9QQVIJCTE2IGJpdCByL3cJTEVEIFBhcmFsbGVsIFNlbGVjdCBSZWcuICoqKioqLworCQkJCQkJCQkJLyogQml0IDE1Li4xMjogcmVzZXJ2ZWQgKHVzZWQgaW50ZXJuYWxseSkgKi8KK2VudW0geworCVBIWV9NX0ZFTFBfTEVEMl9NU0sgPSAweGY8PDgsCS8qIEJpdCAxMS4uIDg6IExFRDIgTWFzayAoTElOSykgKi8KKwlQSFlfTV9GRUxQX0xFRDFfTVNLID0gMHhmPDw0LAkvKiBCaXQgIDcuLiA0OiBMRUQxIE1hc2sgKEFDVCkgKi8KKwlQSFlfTV9GRUxQX0xFRDBfTVNLID0gMHhmLCAvKiBCaXQgIDMuLiAwOiBMRUQwIE1hc2sgKFNQRUVEKSAqLworfTsKKworI2RlZmluZSBQSFlfTV9GRUxQX0xFRDJfQ1RSTCh4KQkoKCh1MTYpKHgpPDw4KSAmIFBIWV9NX0ZFTFBfTEVEMl9NU0spCisjZGVmaW5lIFBIWV9NX0ZFTFBfTEVEMV9DVFJMKHgpCSgoKHUxNikoeCk8PDQpICYgUEhZX01fRkVMUF9MRUQxX01TSykKKyNkZWZpbmUgUEhZX01fRkVMUF9MRUQwX0NUUkwoeCkJKCgodTE2KSh4KTw8MCkgJiBQSFlfTV9GRUxQX0xFRDBfTVNLKQorCitlbnVtIHsKKwlMRURfUEFSX0NUUkxfQ09MWAk9IDB4MDAsCisJTEVEX1BBUl9DVFJMX0VSUk9SCT0gMHgwMSwKKwlMRURfUEFSX0NUUkxfRFVQTEVYCT0gMHgwMiwKKwlMRURfUEFSX0NUUkxfRFBfQ09MCT0gMHgwMywKKwlMRURfUEFSX0NUUkxfU1BFRUQJPSAweDA0LAorCUxFRF9QQVJfQ1RSTF9MSU5LCT0gMHgwNSwKKwlMRURfUEFSX0NUUkxfVFgJCT0gMHgwNiwKKwlMRURfUEFSX0NUUkxfUlgJCT0gMHgwNywKKwlMRURfUEFSX0NUUkxfQUNUCT0gMHgwOCwKKwlMRURfUEFSX0NUUkxfTE5LX1JYCT0gMHgwOSwKKwlMRURfUEFSX0NUUkxfTE5LX0FDCT0gMHgwYSwKKwlMRURfUEFSX0NUUkxfQUNUX0JMCT0gMHgwYiwKKwlMRURfUEFSX0NUUkxfVFhfQkwJPSAweDBjLAorCUxFRF9QQVJfQ1RSTF9SWF9CTAk9IDB4MGQsCisJTEVEX1BBUl9DVFJMX0NPTF9CTAk9IDB4MGUsCisJTEVEX1BBUl9DVFJMX0lOQUNUCT0gMHgwZgorfTsKKworLyoqKioqLFBIWV9NQVJWX0ZFX1NQRUNfMgkJMTYgYml0IHIvdwlTcGVjaWZpYyBDb250cm9sIFJlZy4gMiAqKioqKi8KK2VudW0geworCVBIWV9NX0ZFU0NfRElTX1dBSVQJPSAxPDwyLCAvKiBEaXNhYmxlIFREUiBXYWl0aW5nIFBlcmlvZCAqLworCVBIWV9NX0ZFU0NfRU5BX01DTEsJPSAxPDwxLCAvKiBFbmFibGUgTUFDIFJ4IENsb2NrIGluIHNsZWVwIG1vZGUgKi8KKwlQSFlfTV9GRVNDX1NFTF9DTF9BCT0gMTw8MCwgLyogU2VsZWN0IENsYXNzIEEgZHJpdmVyICgxMDBCLVRYKSAqLworfTsKKworLyogZm9yIFl1a29uLTIgR2lnYWJpdCBFdGhlcm5ldCBQSFkgKDg4RTExMTIgb25seSkgKi8KKy8qKioqKiAgUEhZX01BUlZfUEhZX0NUUkwgKHBhZ2UgMSkJCTE2IGJpdCByL3cJRmliZXIgU3BlY2lmaWMgQ3RybCAqKioqKi8KK2VudW0geworCVBIWV9NX0ZJQl9GT1JDRV9MTksJPSAxPDwxMCwvKiBGb3JjZSBMaW5rIEdvb2QgKi8KKwlQSFlfTV9GSUJfU0lHRF9QT0wJPSAxPDw5LAkvKiBTSUdERVQgUG9sYXJpdHkgKi8KKwlQSFlfTV9GSUJfVFhfRElTCT0gMTw8MywJLyogVHJhbnNtaXR0ZXIgRGlzYWJsZSAqLworfTsKKworLyogZm9yIFl1a29uLTIgR2lnYWJpdCBFdGhlcm5ldCBQSFkgKDg4RTExMTIgb25seSkgKi8KKy8qKioqKiAgUEhZX01BUlZfUEhZX0NUUkwgKHBhZ2UgMikJCTE2IGJpdCByL3cJTUFDIFNwZWNpZmljIEN0cmwgKioqKiovCitlbnVtIHsKKwlQSFlfTV9NQUNfTURfTVNLCT0gNzw8NywgLyogQml0ICA5Li4gNzogTW9kZSBTZWxlY3QgTWFzayAqLworCVBIWV9NX01BQ19HTUlGX1BVUAk9IDE8PDMsCS8qIEdNSUkgUG93ZXIgVXAgKDg4RTExNDkgb25seSkgKi8KKwlQSFlfTV9NQUNfTURfQVVUTwk9IDMsLyogQXV0byBDb3BwZXIvMTAwMEJhc2UtWCAqLworCVBIWV9NX01BQ19NRF9DT1BQRVIJPSA1LC8qIENvcHBlciBvbmx5ICovCisJUEhZX01fTUFDX01EXzEwMDBCWAk9IDcsLyogMTAwMEJhc2UtWCBvbmx5ICovCit9OworI2RlZmluZSBQSFlfTV9NQUNfTU9ERV9TRUwoeCkJKCgoeCk8PDcpICYgUEhZX01fTUFDX01EX01TSykKKworLyoqKioqICBQSFlfTUFSVl9QSFlfQ1RSTCAocGFnZSAzKQkJMTYgYml0IHIvdwlMRUQgQ29udHJvbCBSZWcuICoqKioqLworZW51bSB7CisJUEhZX01fTEVEQ19MT1NfTVNLCT0gMHhmPDwxMiwvKiBCaXQgMTUuLjEyOiBMT1MgTEVEIEN0cmwuIE1hc2sgKi8KKwlQSFlfTV9MRURDX0lOSVRfTVNLCT0gMHhmPDw4LCAvKiBCaXQgMTEuLiA4OiBJTklUIExFRCBDdHJsLiBNYXNrICovCisJUEhZX01fTEVEQ19TVEExX01TSwk9IDB4Zjw8NCwvKiBCaXQgIDcuLiA0OiBTVEFUMSBMRUQgQ3RybC4gTWFzayAqLworCVBIWV9NX0xFRENfU1RBMF9NU0sJPSAweGYsIC8qIEJpdCAgMy4uIDA6IFNUQVQwIExFRCBDdHJsLiBNYXNrICovCit9OworCisjZGVmaW5lIFBIWV9NX0xFRENfTE9TX0NUUkwoeCkJKCgoeCk8PDEyKSAmIFBIWV9NX0xFRENfTE9TX01TSykKKyNkZWZpbmUgUEhZX01fTEVEQ19JTklUX0NUUkwoeCkJKCgoeCk8PDgpICYgUEhZX01fTEVEQ19JTklUX01TSykKKyNkZWZpbmUgUEhZX01fTEVEQ19TVEExX0NUUkwoeCkJKCgoeCk8PDQpICYgUEhZX01fTEVEQ19TVEExX01TSykKKyNkZWZpbmUgUEhZX01fTEVEQ19TVEEwX0NUUkwoeCkJKCgoeCk8PDApICYgUEhZX01fTEVEQ19TVEEwX01TSykKKworLyogR01BQyByZWdpc3RlcnMgICovCisvKiBQb3J0IFJlZ2lzdGVycyAqLworZW51bSB7CisJR01fR1BfU1RBVAk9IDB4MDAwMCwJLyogMTYgYml0IHIvbwlHZW5lcmFsIFB1cnBvc2UgU3RhdHVzICovCisJR01fR1BfQ1RSTAk9IDB4MDAwNCwJLyogMTYgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCAqLworCUdNX1RYX0NUUkwJPSAweDAwMDgsCS8qIDE2IGJpdCByL3cJVHJhbnNtaXQgQ29udHJvbCBSZWcuICovCisJR01fUlhfQ1RSTAk9IDB4MDAwYywJLyogMTYgYml0IHIvdwlSZWNlaXZlIENvbnRyb2wgUmVnLiAqLworCUdNX1RYX0ZMT1dfQ1RSTAk9IDB4MDAxMCwJLyogMTYgYml0IHIvdwlUcmFuc21pdCBGbG93LUNvbnRyb2wgKi8KKwlHTV9UWF9QQVJBTQk9IDB4MDAxNCwJLyogMTYgYml0IHIvdwlUcmFuc21pdCBQYXJhbWV0ZXIgUmVnLiAqLworCUdNX1NFUklBTF9NT0RFCT0gMHgwMDE4LAkvKiAxNiBiaXQgci93CVNlcmlhbCBNb2RlIFJlZ2lzdGVyICovCisvKiBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlcnMgKi8KKwlHTV9TUkNfQUREUl8xTAk9IDB4MDAxYywJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAxIChsb3cpICovCisJR01fU1JDX0FERFJfMU0JPSAweDAwMjAsCS8qIDE2IGJpdCByL3cJU291cmNlIEFkZHJlc3MgMSAobWlkZGxlKSAqLworCUdNX1NSQ19BRERSXzFICT0gMHgwMDI0LAkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDEgKGhpZ2gpICovCisJR01fU1JDX0FERFJfMkwJPSAweDAwMjgsCS8qIDE2IGJpdCByL3cJU291cmNlIEFkZHJlc3MgMiAobG93KSAqLworCUdNX1NSQ19BRERSXzJNCT0gMHgwMDJjLAkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDIgKG1pZGRsZSkgKi8KKwlHTV9TUkNfQUREUl8ySAk9IDB4MDAzMCwJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAyIChoaWdoKSAqLworCisvKiBNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIFJlZ2lzdGVycyAqLworCUdNX01DX0FERFJfSDEJPSAweDAwMzQsCS8qIDE2IGJpdCByL3cJTXVsdGljYXN0IEFkZHJlc3MgSGFzaCAxICovCisJR01fTUNfQUREUl9IMgk9IDB4MDAzOCwJLyogMTYgYml0IHIvdwlNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIDIgKi8KKwlHTV9NQ19BRERSX0gzCT0gMHgwMDNjLAkvKiAxNiBiaXQgci93CU11bHRpY2FzdCBBZGRyZXNzIEhhc2ggMyAqLworCUdNX01DX0FERFJfSDQJPSAweDAwNDAsCS8qIDE2IGJpdCByL3cJTXVsdGljYXN0IEFkZHJlc3MgSGFzaCA0ICovCisKKy8qIEludGVycnVwdCBTb3VyY2UgUmVnaXN0ZXJzICovCisJR01fVFhfSVJRX1NSQwk9IDB4MDA0NCwJLyogMTYgYml0IHIvbwlUeCBPdmVyZmxvdyBJUlEgU291cmNlICovCisJR01fUlhfSVJRX1NSQwk9IDB4MDA0OCwJLyogMTYgYml0IHIvbwlSeCBPdmVyZmxvdyBJUlEgU291cmNlICovCisJR01fVFJfSVJRX1NSQwk9IDB4MDA0YywJLyogMTYgYml0IHIvbwlUeC9SeCBPdmVyLiBJUlEgU291cmNlICovCisKKy8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVycyAqLworCUdNX1RYX0lSUV9NU0sJPSAweDAwNTAsCS8qIDE2IGJpdCByL3cJVHggT3ZlcmZsb3cgSVJRIE1hc2sgKi8KKwlHTV9SWF9JUlFfTVNLCT0gMHgwMDU0LAkvKiAxNiBiaXQgci93CVJ4IE92ZXJmbG93IElSUSBNYXNrICovCisJR01fVFJfSVJRX01TSwk9IDB4MDA1OCwJLyogMTYgYml0IHIvdwlUeC9SeCBPdmVyLiBJUlEgTWFzayAqLworCisvKiBTZXJpYWwgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFNNSSkgUmVnaXN0ZXJzICovCisJR01fU01JX0NUUkwJPSAweDAwODAsCS8qIDE2IGJpdCByL3cJU01JIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlHTV9TTUlfREFUQQk9IDB4MDA4NCwJLyogMTYgYml0IHIvdwlTTUkgRGF0YSBSZWdpc3RlciAqLworCUdNX1BIWV9BRERSCT0gMHgwMDg4LAkvKiAxNiBiaXQgci93CUdQSFkgQWRkcmVzcyBSZWdpc3RlciAqLworLyogTUlCIENvdW50ZXJzICovCisJR01fTUlCX0NOVF9CQVNFCT0gMHgwMTAwLAkvKiBCYXNlIEFkZHJlc3Mgb2YgTUlCIENvdW50ZXJzICovCisJR01fTUlCX0NOVF9FTkQJPSAweDAyNUMsCS8qIExhc3QgTUlCIGNvdW50ZXIgKi8KK307CisKKworLyoKKyAqIE1JQiBDb3VudGVycyBiYXNlIGFkZHJlc3MgZGVmaW5pdGlvbnMgKGxvdyB3b3JkKSAtCisgKiB1c2Ugb2Zmc2V0IDQgZm9yIGFjY2VzcyB0byBoaWdoIHdvcmQJKDMyIGJpdCByL28pCisgKi8KK2VudW0geworCUdNX1JYRl9VQ19PSyAgICA9IEdNX01JQl9DTlRfQkFTRSArIDAsCS8qIFVuaWNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisJR01fUlhGX0JDX09LCT0gR01fTUlCX0NOVF9CQVNFICsgOCwJLyogQnJvYWRjYXN0IEZyYW1lcyBSZWNlaXZlZCBPSyAqLworCUdNX1JYRl9NUEFVU0UJPSBHTV9NSUJfQ05UX0JBU0UgKyAxNiwJLyogUGF1c2UgTUFDIEN0cmwgRnJhbWVzIFJlY2VpdmVkICovCisJR01fUlhGX01DX09LCT0gR01fTUlCX0NOVF9CQVNFICsgMjQsCS8qIE11bHRpY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKwlHTV9SWEZfRkNTX0VSUgk9IEdNX01JQl9DTlRfQkFTRSArIDMyLAkvKiBSeCBGcmFtZSBDaGVjayBTZXEuIEVycm9yICovCisKKwlHTV9SWE9fT0tfTE8JPSBHTV9NSUJfQ05UX0JBU0UgKyA0OCwJLyogT2N0ZXRzIFJlY2VpdmVkIE9LIExvdyAqLworCUdNX1JYT19PS19ISQk9IEdNX01JQl9DTlRfQkFTRSArIDU2LAkvKiBPY3RldHMgUmVjZWl2ZWQgT0sgSGlnaCAqLworCUdNX1JYT19FUlJfTE8JPSBHTV9NSUJfQ05UX0JBU0UgKyA2NCwJLyogT2N0ZXRzIFJlY2VpdmVkIEludmFsaWQgTG93ICovCisJR01fUlhPX0VSUl9ISQk9IEdNX01JQl9DTlRfQkFTRSArIDcyLAkvKiBPY3RldHMgUmVjZWl2ZWQgSW52YWxpZCBIaWdoICovCisJR01fUlhGX1NIVAk9IEdNX01JQl9DTlRfQkFTRSArIDgwLAkvKiBGcmFtZXMgPDY0IEJ5dGUgUmVjZWl2ZWQgT0sgKi8KKwlHTV9SWEVfRlJBRwk9IEdNX01JQl9DTlRfQkFTRSArIDg4LAkvKiBGcmFtZXMgPDY0IEJ5dGUgUmVjZWl2ZWQgd2l0aCBGQ1MgRXJyICovCisJR01fUlhGXzY0Qgk9IEdNX01JQl9DTlRfQkFTRSArIDk2LAkvKiA2NCBCeXRlIFJ4IEZyYW1lICovCisJR01fUlhGXzEyN0IJPSBHTV9NSUJfQ05UX0JBU0UgKyAxMDQsLyogNjUtMTI3IEJ5dGUgUnggRnJhbWUgKi8KKwlHTV9SWEZfMjU1Qgk9IEdNX01JQl9DTlRfQkFTRSArIDExMiwvKiAxMjgtMjU1IEJ5dGUgUnggRnJhbWUgKi8KKwlHTV9SWEZfNTExQgk9IEdNX01JQl9DTlRfQkFTRSArIDEyMCwvKiAyNTYtNTExIEJ5dGUgUnggRnJhbWUgKi8KKwlHTV9SWEZfMTAyM0IJPSBHTV9NSUJfQ05UX0JBU0UgKyAxMjgsLyogNTEyLTEwMjMgQnl0ZSBSeCBGcmFtZSAqLworCUdNX1JYRl8xNTE4Qgk9IEdNX01JQl9DTlRfQkFTRSArIDEzNiwvKiAxMDI0LTE1MTggQnl0ZSBSeCBGcmFtZSAqLworCUdNX1JYRl9NQVhfU1oJPSBHTV9NSUJfQ05UX0JBU0UgKyAxNDQsLyogMTUxOS1NYXhTaXplIEJ5dGUgUnggRnJhbWUgKi8KKwlHTV9SWEZfTE5HX0VSUgk9IEdNX01JQl9DTlRfQkFTRSArIDE1MiwvKiBSeCBGcmFtZSB0b28gTG9uZyBFcnJvciAqLworCUdNX1JYRl9KQUJfUEtUCT0gR01fTUlCX0NOVF9CQVNFICsgMTYwLC8qIFJ4IEphYmJlciBQYWNrZXQgRnJhbWUgKi8KKworCUdNX1JYRV9GSUZPX09WCT0gR01fTUlCX0NOVF9CQVNFICsgMTc2LC8qIFJ4IEZJRk8gb3ZlcmZsb3cgRXZlbnQgKi8KKwlHTV9UWEZfVUNfT0sJPSBHTV9NSUJfQ05UX0JBU0UgKyAxOTIsLyogVW5pY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworCUdNX1RYRl9CQ19PSwk9IEdNX01JQl9DTlRfQkFTRSArIDIwMCwvKiBCcm9hZGNhc3QgRnJhbWVzIFhtaXR0ZWQgT0sgKi8KKwlHTV9UWEZfTVBBVVNFCT0gR01fTUlCX0NOVF9CQVNFICsgMjA4LC8qIFBhdXNlIE1BQyBDdHJsIEZyYW1lcyBYbWl0dGVkICovCisJR01fVFhGX01DX09LCT0gR01fTUlCX0NOVF9CQVNFICsgMjE2LC8qIE11bHRpY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworCUdNX1RYT19PS19MTwk9IEdNX01JQl9DTlRfQkFTRSArIDIyNCwvKiBPY3RldHMgVHJhbnNtaXR0ZWQgT0sgTG93ICovCisJR01fVFhPX09LX0hJCT0gR01fTUlCX0NOVF9CQVNFICsgMjMyLC8qIE9jdGV0cyBUcmFuc21pdHRlZCBPSyBIaWdoICovCisJR01fVFhGXzY0Qgk9IEdNX01JQl9DTlRfQkFTRSArIDI0MCwvKiA2NCBCeXRlIFR4IEZyYW1lICovCisJR01fVFhGXzEyN0IJPSBHTV9NSUJfQ05UX0JBU0UgKyAyNDgsLyogNjUtMTI3IEJ5dGUgVHggRnJhbWUgKi8KKwlHTV9UWEZfMjU1Qgk9IEdNX01JQl9DTlRfQkFTRSArIDI1NiwvKiAxMjgtMjU1IEJ5dGUgVHggRnJhbWUgKi8KKwlHTV9UWEZfNTExQgk9IEdNX01JQl9DTlRfQkFTRSArIDI2NCwvKiAyNTYtNTExIEJ5dGUgVHggRnJhbWUgKi8KKwlHTV9UWEZfMTAyM0IJPSBHTV9NSUJfQ05UX0JBU0UgKyAyNzIsLyogNTEyLTEwMjMgQnl0ZSBUeCBGcmFtZSAqLworCUdNX1RYRl8xNTE4Qgk9IEdNX01JQl9DTlRfQkFTRSArIDI4MCwvKiAxMDI0LTE1MTggQnl0ZSBUeCBGcmFtZSAqLworCUdNX1RYRl9NQVhfU1oJPSBHTV9NSUJfQ05UX0JBU0UgKyAyODgsLyogMTUxOS1NYXhTaXplIEJ5dGUgVHggRnJhbWUgKi8KKworCUdNX1RYRl9DT0wJPSBHTV9NSUJfQ05UX0JBU0UgKyAzMDQsLyogVHggQ29sbGlzaW9uICovCisJR01fVFhGX0xBVF9DT0wJPSBHTV9NSUJfQ05UX0JBU0UgKyAzMTIsLyogVHggTGF0ZSBDb2xsaXNpb24gKi8KKwlHTV9UWEZfQUJPX0NPTAk9IEdNX01JQl9DTlRfQkFTRSArIDMyMCwvKiBUeCBhYm9ydGVkIGR1ZSB0byBFeGNlcy4gQ29sLiAqLworCUdNX1RYRl9NVUxfQ09MCT0gR01fTUlCX0NOVF9CQVNFICsgMzI4LC8qIFR4IE11bHRpcGxlIENvbGxpc2lvbiAqLworCUdNX1RYRl9TTkdfQ09MCT0gR01fTUlCX0NOVF9CQVNFICsgMzM2LC8qIFR4IFNpbmdsZSBDb2xsaXNpb24gKi8KKwlHTV9UWEVfRklGT19VUgk9IEdNX01JQl9DTlRfQkFTRSArIDM0NCwvKiBUeCBGSUZPIFVuZGVycnVuIEV2ZW50ICovCit9OworCisvKiBHTUFDIEJpdCBEZWZpbml0aW9ucyAqLworLyoJR01fR1BfU1RBVAkxNiBiaXQgci9vCUdlbmVyYWwgUHVycG9zZSBTdGF0dXMgUmVnaXN0ZXIgKi8KK2VudW0geworCUdNX0dQU1JfU1BFRUQJCT0gMTw8MTUsIC8qIEJpdCAxNToJUG9ydCBTcGVlZCAoMSA9IDEwMCBNYnBzKSAqLworCUdNX0dQU1JfRFVQTEVYCQk9IDE8PDE0LCAvKiBCaXQgMTQ6CUR1cGxleCBNb2RlICgxID0gRnVsbCkgKi8KKwlHTV9HUFNSX0ZDX1RYX0RJUwk9IDE8PDEzLCAvKiBCaXQgMTM6CVR4IEZsb3ctQ29udHJvbCBNb2RlIERpc2FibGVkICovCisJR01fR1BTUl9MSU5LX1VQCQk9IDE8PDEyLCAvKiBCaXQgMTI6CUxpbmsgVXAgU3RhdHVzICovCisJR01fR1BTUl9QQVVTRQkJPSAxPDwxMSwgLyogQml0IDExOglQYXVzZSBTdGF0ZSAqLworCUdNX0dQU1JfVFhfQUNUSVZFCT0gMTw8MTAsIC8qIEJpdCAxMDoJVHggaW4gUHJvZ3Jlc3MgKi8KKwlHTV9HUFNSX0VYQ19DT0wJCT0gMTw8OSwJLyogQml0ICA5OglFeGNlc3NpdmUgQ29sbGlzaW9ucyBPY2N1cmVkICovCisJR01fR1BTUl9MQVRfQ09MCQk9IDE8PDgsCS8qIEJpdCAgODoJTGF0ZSBDb2xsaXNpb25zIE9jY3VyZWQgKi8KKworCUdNX0dQU1JfUEhZX1NUX0NICT0gMTw8NSwJLyogQml0ICA1OglQSFkgU3RhdHVzIENoYW5nZSAqLworCUdNX0dQU1JfR0lHX1NQRUVECT0gMTw8NCwJLyogQml0ICA0OglHaWdhYml0IFNwZWVkICgxID0gMTAwMCBNYnBzKSAqLworCUdNX0dQU1JfUEFSVF9NT0RFCT0gMTw8MywJLyogQml0ICAzOglQYXJ0aXRpb24gbW9kZSAqLworCUdNX0dQU1JfRkNfUlhfRElTCT0gMTw8MiwJLyogQml0ICAyOglSeCBGbG93LUNvbnRyb2wgTW9kZSBEaXNhYmxlZCAqLworCUdNX0dQU1JfUFJPTV9FTgkJPSAxPDwxLAkvKiBCaXQgIDE6CVByb21pc2N1b3VzIE1vZGUgRW5hYmxlZCAqLworfTsKKworLyoJR01fR1BfQ1RSTAkxNiBiaXQgci93CUdlbmVyYWwgUHVycG9zZSBDb250cm9sIFJlZ2lzdGVyICovCitlbnVtIHsKKwlHTV9HUENSX1BST01fRU5BCT0gMTw8MTQsCS8qIEJpdCAxNDoJRW5hYmxlIFByb21pc2N1b3VzIE1vZGUgKi8KKwlHTV9HUENSX0ZDX1RYX0RJUwk9IDE8PDEzLCAvKiBCaXQgMTM6CURpc2FibGUgVHggRmxvdy1Db250cm9sIE1vZGUgKi8KKwlHTV9HUENSX1RYX0VOQQkJPSAxPDwxMiwgLyogQml0IDEyOglFbmFibGUgVHJhbnNtaXQgKi8KKwlHTV9HUENSX1JYX0VOQQkJPSAxPDwxMSwgLyogQml0IDExOglFbmFibGUgUmVjZWl2ZSAqLworCUdNX0dQQ1JfQlVSU1RfRU5BCT0gMTw8MTAsIC8qIEJpdCAxMDoJRW5hYmxlIEJ1cnN0IE1vZGUgKi8KKwlHTV9HUENSX0xPT1BfRU5BCT0gMTw8OSwJLyogQml0ICA5OglFbmFibGUgTUFDIExvb3BiYWNrIE1vZGUgKi8KKwlHTV9HUENSX1BBUlRfRU5BCT0gMTw8OCwJLyogQml0ICA4OglFbmFibGUgUGFydGl0aW9uIE1vZGUgKi8KKwlHTV9HUENSX0dJR1NfRU5BCT0gMTw8NywJLyogQml0ICA3OglHaWdhYml0IFNwZWVkICgxMDAwIE1icHMpICovCisJR01fR1BDUl9GTF9QQVNTCQk9IDE8PDYsCS8qIEJpdCAgNjoJRm9yY2UgTGluayBQYXNzICovCisJR01fR1BDUl9EVVBfRlVMTAk9IDE8PDUsCS8qIEJpdCAgNToJRnVsbCBEdXBsZXggTW9kZSAqLworCUdNX0dQQ1JfRkNfUlhfRElTCT0gMTw8NCwJLyogQml0ICA0OglEaXNhYmxlIFJ4IEZsb3ctQ29udHJvbCBNb2RlICovCisJR01fR1BDUl9TUEVFRF8xMDAJPSAxPDwzLCAgIC8qIEJpdCAgMzoJUG9ydCBTcGVlZCAxMDAgTWJwcyAqLworCUdNX0dQQ1JfQVVfRFVQX0RJUwk9IDE8PDIsCS8qIEJpdCAgMjoJRGlzYWJsZSBBdXRvLVVwZGF0ZSBEdXBsZXggKi8KKwlHTV9HUENSX0FVX0ZDVF9ESVMJPSAxPDwxLAkvKiBCaXQgIDE6CURpc2FibGUgQXV0by1VcGRhdGUgRmxvdy1DLiAqLworCUdNX0dQQ1JfQVVfU1BEX0RJUwk9IDE8PDAsCS8qIEJpdCAgMDoJRGlzYWJsZSBBdXRvLVVwZGF0ZSBTcGVlZCAqLworfTsKKworI2RlZmluZSBHTV9HUENSX1NQRUVEXzEwMDAJKEdNX0dQQ1JfR0lHU19FTkEgfCBHTV9HUENSX1NQRUVEXzEwMCkKKyNkZWZpbmUgR01fR1BDUl9BVV9BTExfRElTCShHTV9HUENSX0FVX0RVUF9ESVMgfCBHTV9HUENSX0FVX0ZDVF9ESVN8R01fR1BDUl9BVV9TUERfRElTKQorCisvKglHTV9UWF9DVFJMCQkJMTYgYml0IHIvdwlUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCitlbnVtIHsKKwlHTV9UWENSX0ZPUkNFX0pBTQk9IDE8PDE1LCAvKiBCaXQgMTU6CUZvcmNlIEphbSAvIEZsb3ctQ29udHJvbCAqLworCUdNX1RYQ1JfQ1JDX0RJUwkJPSAxPDwxNCwgLyogQml0IDE0OglEaXNhYmxlIGluc2VydGlvbiBvZiBDUkMgKi8KKwlHTV9UWENSX1BBRF9ESVMJCT0gMTw8MTMsIC8qIEJpdCAxMzoJRGlzYWJsZSBwYWRkaW5nIG9mIHBhY2tldHMgKi8KKwlHTV9UWENSX0NPTF9USFJfTVNLCT0gNzw8MTAsIC8qIEJpdCAxMi4uMTA6CUNvbGxpc2lvbiBUaHJlc2hvbGQgKi8KK307CisKKyNkZWZpbmUgVFhfQ09MX1RIUih4KQkJKCgoeCk8PDEwKSAmIEdNX1RYQ1JfQ09MX1RIUl9NU0spCisjZGVmaW5lIFRYX0NPTF9ERUYJCTB4MDQKKworLyoJR01fUlhfQ1RSTAkJCTE2IGJpdCByL3cJUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCitlbnVtIHsKKwlHTV9SWENSX1VDRl9FTkEJPSAxPDwxNSwgLyogQml0IDE1OglFbmFibGUgVW5pY2FzdCBmaWx0ZXJpbmcgKi8KKwlHTV9SWENSX01DRl9FTkEJPSAxPDwxNCwgLyogQml0IDE0OglFbmFibGUgTXVsdGljYXN0IGZpbHRlcmluZyAqLworCUdNX1JYQ1JfQ1JDX0RJUwk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW92ZSA0LWJ5dGUgQ1JDICovCisJR01fUlhDUl9QQVNTX0ZDCT0gMTw8MTIsIC8qIEJpdCAxMjoJUGFzcyBGQyBwYWNrZXRzIHRvIEZJRk8gKi8KK307CisKKy8qCUdNX1RYX1BBUkFNCQkxNiBiaXQgci93CVRyYW5zbWl0IFBhcmFtZXRlciBSZWdpc3RlciAqLworZW51bSB7CisJR01fVFhQQV9KQU1MRU5fTVNLCT0gMHgwMzw8MTQsCS8qIEJpdCAxNS4uMTQ6CUphbSBMZW5ndGggKi8KKwlHTV9UWFBBX0pBTUlQR19NU0sJPSAweDFmPDw5LAkvKiBCaXQgMTMuLjk6CUphbSBJUEcgKi8KKwlHTV9UWFBBX0pBTURBVF9NU0sJPSAweDFmPDw0LAkvKiBCaXQgIDguLjQ6CUlQRyBKYW0gdG8gRGF0YSAqLworCUdNX1RYUEFfQk9fTElNX01TSwk9IDB4MGYsCQkvKiBCaXQgIDMuLiAwOiBCYWNrb2ZmIExpbWl0IE1hc2sgKi8KKworCVRYX0pBTV9MRU5fREVGCQk9IDB4MDMsCisJVFhfSkFNX0lQR19ERUYJCT0gMHgwYiwKKwlUWF9JUEdfSkFNX0RFRgkJPSAweDFjLAorCVRYX0JPRl9MSU1fREVGCQk9IDB4MDQsCit9OworCisjZGVmaW5lIFRYX0pBTV9MRU5fVkFMKHgpCSgoKHgpPDwxNCkgJiBHTV9UWFBBX0pBTUxFTl9NU0spCisjZGVmaW5lIFRYX0pBTV9JUEdfVkFMKHgpCSgoKHgpPDw5KSAgJiBHTV9UWFBBX0pBTUlQR19NU0spCisjZGVmaW5lIFRYX0lQR19KQU1fREFUQSh4KQkoKCh4KTw8NCkgICYgR01fVFhQQV9KQU1EQVRfTVNLKQorI2RlZmluZSBUWF9CQUNLX09GRl9MSU0oeCkJKCh4KSAmIEdNX1RYUEFfQk9fTElNX01TSykKKworCisvKglHTV9TRVJJQUxfTU9ERQkJCTE2IGJpdCByL3cJU2VyaWFsIE1vZGUgUmVnaXN0ZXIgKi8KK2VudW0geworCUdNX1NNT0RfREFUQUJMX01TSwk9IDB4MWY8PDExLCAvKiBCaXQgMTUuLjExOglEYXRhIEJsaW5kZXIgKHIvbykgKi8KKwlHTV9TTU9EX0xJTUlUXzQJCT0gMTw8MTAsIC8qIEJpdCAxMDoJNCBjb25zZWN1dGl2ZSBUeCB0cmlhbHMgKi8KKwlHTV9TTU9EX1ZMQU5fRU5BCT0gMTw8OSwJLyogQml0ICA5OglFbmFibGUgVkxBTiAgKE1heC4gRnJhbWUgTGVuKSAqLworCUdNX1NNT0RfSlVNQk9fRU5BCT0gMTw8OCwJLyogQml0ICA4OglFbmFibGUgSnVtYm8gKE1heC4gRnJhbWUgTGVuKSAqLworCSBHTV9TTU9EX0lQR19NU0sJPSAweDFmCS8qIEJpdCA0Li4wOglJbnRlci1QYWNrZXQgR2FwIChJUEcpICovCit9OworCisjZGVmaW5lIERBVEFfQkxJTkRfVkFMKHgpCSgoKHgpPDwxMSkgJiBHTV9TTU9EX0RBVEFCTF9NU0spCisjZGVmaW5lIERBVEFfQkxJTkRfREVGCQkweDA0CisKKyNkZWZpbmUgSVBHX0RBVEFfVkFMKHgpCQkoeCAmIEdNX1NNT0RfSVBHX01TSykKKyNkZWZpbmUgSVBHX0RBVEFfREVGCQkweDFlCisKKy8qCUdNX1NNSV9DVFJMCQkJMTYgYml0IHIvdwlTTUkgQ29udHJvbCBSZWdpc3RlciAqLworZW51bSB7CisJR01fU01JX0NUX1BIWV9BX01TSwk9IDB4MWY8PDExLC8qIEJpdCAxNS4uMTE6CVBIWSBEZXZpY2UgQWRkcmVzcyAqLworCUdNX1NNSV9DVF9SRUdfQV9NU0sJPSAweDFmPDw2LC8qIEJpdCAxMC4uIDY6CVBIWSBSZWdpc3RlciBBZGRyZXNzICovCisJR01fU01JX0NUX09QX1JECQk9IDE8PDUsCS8qIEJpdCAgNToJT3BDb2RlIFJlYWQgKDA9V3JpdGUpKi8KKwlHTV9TTUlfQ1RfUkRfVkFMCT0gMTw8NCwJLyogQml0ICA0OglSZWFkIFZhbGlkIChSZWFkIGNvbXBsZXRlZCkgKi8KKwlHTV9TTUlfQ1RfQlVTWQkJPSAxPDwzLAkvKiBCaXQgIDM6CUJ1c3kgKE9wZXJhdGlvbiBpbiBwcm9ncmVzcykgKi8KK307CisKKyNkZWZpbmUgR01fU01JX0NUX1BIWV9BRCh4KQkoKCh1MTYpKHgpPDwxMSkgJiBHTV9TTUlfQ1RfUEhZX0FfTVNLKQorI2RlZmluZSBHTV9TTUlfQ1RfUkVHX0FEKHgpCSgoKHUxNikoeCk8PDYpICYgR01fU01JX0NUX1JFR19BX01TSykKKworLyoJR01fUEhZX0FERFIJCQkJMTYgYml0IHIvdwlHUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KK2VudW0geworCUdNX1BBUl9NSUJfQ0xSCT0gMTw8NSwJLyogQml0ICA1OglTZXQgTUlCIENsZWFyIENvdW50ZXIgTW9kZSAqLworCUdNX1BBUl9NSUJfVFNUCT0gMTw8NCwJLyogQml0ICA0OglNSUIgTG9hZCBDb3VudGVyIChUZXN0IE1vZGUpICovCit9OworCisvKiBSZWNlaXZlIEZyYW1lIFN0YXR1cyBFbmNvZGluZyAqLworZW51bSB7CisJR01SX0ZTX0xFTgk9IDB4N2ZmZjw8MTYsIC8qIEJpdCAzMC4uMTY6CVJ4IEZyYW1lIExlbmd0aCAqLworCUdNUl9GU19WTEFOCT0gMTw8MTMsIC8qIFZMQU4gUGFja2V0ICovCisJR01SX0ZTX0pBQkJFUgk9IDE8PDEyLCAvKiBKYWJiZXIgUGFja2V0ICovCisJR01SX0ZTX1VOX1NJWkUJPSAxPDwxMSwgLyogVW5kZXJzaXplIFBhY2tldCAqLworCUdNUl9GU19NQwk9IDE8PDEwLCAvKiBNdWx0aWNhc3QgUGFja2V0ICovCisJR01SX0ZTX0JDCT0gMTw8OSwgIC8qIEJyb2FkY2FzdCBQYWNrZXQgKi8KKwlHTVJfRlNfUlhfT0sJPSAxPDw4LCAgLyogUmVjZWl2ZSBPSyAoR29vZCBQYWNrZXQpICovCisJR01SX0ZTX0dPT0RfRkMJPSAxPDw3LCAgLyogR29vZCBGbG93LUNvbnRyb2wgUGFja2V0ICovCisJR01SX0ZTX0JBRF9GQwk9IDE8PDYsICAvKiBCYWQgIEZsb3ctQ29udHJvbCBQYWNrZXQgKi8KKwlHTVJfRlNfTUlJX0VSUgk9IDE8PDUsICAvKiBNSUkgRXJyb3IgKi8KKwlHTVJfRlNfTE9OR19FUlIJPSAxPDw0LCAgLyogVG9vIExvbmcgUGFja2V0ICovCisJR01SX0ZTX0ZSQUdNRU5UCT0gMTw8MywgIC8qIEZyYWdtZW50ICovCisKKwlHTVJfRlNfQ1JDX0VSUgk9IDE8PDEsICAvKiBDUkMgRXJyb3IgKi8KKwlHTVJfRlNfUlhfRkZfT1YJPSAxPDwwLCAgLyogUnggRklGTyBPdmVyZmxvdyAqLworCisJR01SX0ZTX0FOWV9FUlIJPSBHTVJfRlNfUlhfRkZfT1YgfCBHTVJfRlNfQ1JDX0VSUiB8CisJCQkgIEdNUl9GU19GUkFHTUVOVCB8IEdNUl9GU19MT05HX0VSUiB8CisJCQkgIEdNUl9GU19NSUlfRVJSIHwgR01SX0ZTX0JBRF9GQyB8CisJCQkgIEdNUl9GU19VTl9TSVpFIHwgR01SX0ZTX0pBQkJFUiwKK307CisKKy8qCVJYX0dNRl9DVFJMX1QJMzIgYml0CVJ4IEdNQUMgRklGTyBDb250cm9sL1Rlc3QgKi8KK2VudW0geworCVJYX1RSVU5DX09OCT0gMTw8MjcsICAJLyogZW5hYmxlICBwYWNrZXQgdHJ1bmNhdGlvbiAqLworCVJYX1RSVU5DX09GRgk9IDE8PDI2LCAJLyogZGlzYWJsZSBwYWNrZXQgdHJ1bmNhdGlvbiAqLworCVJYX1ZMQU5fU1RSSVBfT04gPSAxPDwyNSwJLyogZW5hYmxlICBWTEFOIHN0cmlwcGluZyAqLworCVJYX1ZMQU5fU1RSSVBfT0ZGID0gMTw8MjQsCS8qIGRpc2FibGUgVkxBTiBzdHJpcHBpbmcgKi8KKworCVJYX01BQ1NFQ19GTFVTSF9PTiAgPSAxPDwyMywKKwlSWF9NQUNTRUNfRkxVU0hfT0ZGID0gMTw8MjIsCisJUlhfTUFDU0VDX0FTRl9GTFVTSF9PTiA9IDE8PDIxLAorCVJYX01BQ1NFQ19BU0ZfRkxVU0hfT0ZGID0gMTw8MjAsCisKKwlHTUZfUlhfT1ZFUl9PTiAgICAgID0gMTw8MTksCS8qIGVuYWJsZSBmbHVzaGluZyBvbiByZWNlaXZlIG92ZXJydW4gKi8KKwlHTUZfUlhfT1ZFUl9PRkYgICAgID0gMTw8MTgsCS8qIGRpc2FibGUgZmx1c2hpbmcgb24gcmVjZWl2ZSBvdmVycnVuICovCisJR01GX0FTRl9SWF9PVkVSX09OICA9IDE8PDE3LAkvKiBlbmFibGUgZmx1c2hpbmcgb2YgQVNGIHdoZW4gb3ZlcnJ1biAqLworCUdNRl9BU0ZfUlhfT1ZFUl9PRkYgPSAxPDwxNiwJLyogZGlzYWJsZSBmbHVzaGluZyBvZiBBU0Ygd2hlbiBvdmVycnVuICovCisKKwlHTUZfV1BfVFNUX09OCT0gMTw8MTQsCS8qIFdyaXRlIFBvaW50ZXIgVGVzdCBPbiAqLworCUdNRl9XUF9UU1RfT0ZGCT0gMTw8MTMsCS8qIFdyaXRlIFBvaW50ZXIgVGVzdCBPZmYgKi8KKwlHTUZfV1BfU1RFUAk9IDE8PDEyLAkvKiBXcml0ZSBQb2ludGVyIFN0ZXAvSW5jcmVtZW50ICovCisKKwlHTUZfUlBfVFNUX09OCT0gMTw8MTAsCS8qIFJlYWQgUG9pbnRlciBUZXN0IE9uICovCisJR01GX1JQX1RTVF9PRkYJPSAxPDw5LAkJLyogUmVhZCBQb2ludGVyIFRlc3QgT2ZmICovCisJR01GX1JQX1NURVAJPSAxPDw4LAkJLyogUmVhZCBQb2ludGVyIFN0ZXAvSW5jcmVtZW50ICovCisJR01GX1JYX0ZfRkxfT04JPSAxPDw3LAkJLyogUnggRklGTyBGbHVzaCBNb2RlIE9uICovCisJR01GX1JYX0ZfRkxfT0ZGCT0gMTw8NiwJCS8qIFJ4IEZJRk8gRmx1c2ggTW9kZSBPZmYgKi8KKwlHTUZfQ0xJX1JYX0ZPCT0gMTw8NSwJCS8qIENsZWFyIElSUSBSeCBGSUZPIE92ZXJydW4gKi8KKwlHTUZfQ0xJX1JYX0MJPSAxPDw0LAkJLyogQ2xlYXIgSVJRIFJ4IEZyYW1lIENvbXBsZXRlICovCisKKwlHTUZfT1BFUl9PTgk9IDE8PDMsCQkvKiBPcGVyYXRpb25hbCBNb2RlIE9uICovCisJR01GX09QRVJfT0ZGCT0gMTw8MiwJCS8qIE9wZXJhdGlvbmFsIE1vZGUgT2ZmICovCisJR01GX1JTVF9DTFIJPSAxPDwxLAkJLyogQ2xlYXIgR01BQyBGSUZPIFJlc2V0ICovCisJR01GX1JTVF9TRVQJPSAxPDwwLAkJLyogU2V0ICAgR01BQyBGSUZPIFJlc2V0ICovCisKKwlSWF9HTUZfRkxfVEhSX0RFRiA9IDB4YSwJLyogZmx1c2ggdGhyZXNob2xkIChkZWZhdWx0KSAqLworCisJR01GX1JYX0NUUkxfREVGCT0gR01GX09QRVJfT04gfCBHTUZfUlhfRl9GTF9PTiwKK307CisKKy8qCVRYX0dNRl9FQQkJMzIgYml0CVR4IEdNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworZW51bSB7CisJVFhfRFlOX1dNX0VOQQk9IDMsCS8qIFl1a29uLUZFKyBzcGVjaWZpYyAqLworfTsKKworLyoJVFhfR01GX0NUUkxfVAkzMiBiaXQJVHggR01BQyBGSUZPIENvbnRyb2wvVGVzdCAqLworZW51bSB7CisJVFhfU1RGV19ESVMJPSAxPDwzMSwvKiBEaXNhYmxlIFN0b3JlICYgRm9yd2FyZCAoWXVrb24tRUMgVWx0cmEpICovCisJVFhfU1RGV19FTkEJPSAxPDwzMCwvKiBFbmFibGUgIFN0b3JlICYgRm9yd2FyZCAoWXVrb24tRUMgVWx0cmEpICovCisKKwlUWF9WTEFOX1RBR19PTgk9IDE8PDI1LC8qIGVuYWJsZSAgVkxBTiB0YWdnaW5nICovCisJVFhfVkxBTl9UQUdfT0ZGCT0gMTw8MjQsLyogZGlzYWJsZSBWTEFOIHRhZ2dpbmcgKi8KKworCVRYX0pVTUJPX0VOQQk9IDE8PDIzLC8qIFBDSSBKdW1ibyBNb2RlIGVuYWJsZSAoWXVrb24tRUMgVWx0cmEpICovCisJVFhfSlVNQk9fRElTCT0gMTw8MjIsLyogUENJIEp1bWJvIE1vZGUgZW5hYmxlIChZdWtvbi1FQyBVbHRyYSkgKi8KKworCUdNRl9XU1BfVFNUX09OCT0gMTw8MTgsLyogV3JpdGUgU2hhZG93IFBvaW50ZXIgVGVzdCBPbiAqLworCUdNRl9XU1BfVFNUX09GRgk9IDE8PDE3LC8qIFdyaXRlIFNoYWRvdyBQb2ludGVyIFRlc3QgT2ZmICovCisJR01GX1dTUF9TVEVQCT0gMTw8MTYsLyogV3JpdGUgU2hhZG93IFBvaW50ZXIgU3RlcC9JbmNyZW1lbnQgKi8KKworCUdNRl9DTElfVFhfRlUJPSAxPDw2LAkvKiBDbGVhciBJUlEgVHggRklGTyBVbmRlcnJ1biAqLworCUdNRl9DTElfVFhfRkMJPSAxPDw1LAkvKiBDbGVhciBJUlEgVHggRnJhbWUgQ29tcGxldGUgKi8KKwlHTUZfQ0xJX1RYX1BFCT0gMTw8NCwJLyogQ2xlYXIgSVJRIFR4IFBhcml0eSBFcnJvciAqLworfTsKKworLyoJR01BQ19USV9TVF9DVFJMCSA4IGJpdAlUaW1lIFN0YW1wIFRpbWVyIEN0cmwgUmVnIChZVUtPTiBvbmx5KSAqLworZW51bSB7CisJR01UX1NUX1NUQVJUCT0gMTw8MiwJLyogU3RhcnQgVGltZSBTdGFtcCBUaW1lciAqLworCUdNVF9TVF9TVE9QCT0gMTw8MSwJLyogU3RvcCAgVGltZSBTdGFtcCBUaW1lciAqLworCUdNVF9TVF9DTFJfSVJRCT0gMTw8MCwJLyogQ2xlYXIgVGltZSBTdGFtcCBUaW1lciBJUlEgKi8KK307CisKKy8qIEIyOF9ZMl9BU0ZfU1RBVF9DTUQJCTMyIGJpdAlBU0YgU3RhdHVzIGFuZCBDb21tYW5kIFJlZyAqLworZW51bSB7CisJWTJfQVNGX09TX1BSRVMJPSAxPDw0LAkvKiBBU0Ygb3BlcmF0aW9uIHN5c3RlbSBwcmVzZW50ICovCisJWTJfQVNGX1JFU0VUCT0gMTw8MywJLyogQVNGIHN5c3RlbSBpbiByZXNldCBzdGF0ZSAqLworCVkyX0FTRl9SVU5OSU5HCT0gMTw8MiwJLyogQVNGIHN5c3RlbSBvcGVyYXRpb25hbCAqLworCVkyX0FTRl9DTFJfSFNUSSA9IDE8PDEsCS8qIENsZWFyIEFTRiBJUlEgKi8KKwlZMl9BU0ZfSVJRCT0gMTw8MCwJLyogSXNzdWUgYW4gSVJRIHRvIEFTRiBzeXN0ZW0gKi8KKworCVkyX0FTRl9VQ19TVEFURSA9IDM8PDIsCS8qIEFTRiB1QyBTdGF0ZSAqLworCVkyX0FTRl9DTEtfSEFMVAk9IDAsCS8qIEFTRiBzeXN0ZW0gY2xvY2sgc3RvcHBlZCAqLworfTsKKworLyogQjI4X1kyX0FTRl9IT1NUX0NPTQkzMiBiaXQJQVNGIEhvc3QgQ29tbXVuaWNhdGlvbiBSZWcgKi8KK2VudW0geworCVkyX0FTRl9DTFJfQVNGSSA9IDE8PDEsCS8qIENsZWFyIGhvc3QgSVJRICovCisJWTJfQVNGX0hPU1RfSVJRID0gMTw8MCwJLyogSXNzdWUgYW4gSVJRIHRvIEhPU1Qgc3lzdGVtICovCit9OworLyoJSENVX0NDU1IJQ1BVIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAqLworZW51bSB7CisJSENVX0NDU1JfU01CQUxFUlRfTU9OSVRPUj0gMTw8MjcsIC8qIFNNQkFMRVJUIHBpbiBtb25pdG9yICovCisJSENVX0NDU1JfQ1BVX1NMRUVQCT0gMTw8MjYsIC8qIENQVSBzbGVlcCBzdGF0dXMgKi8KKwkvKiBDbG9jayBTdHJldGNoaW5nIFRpbWVvdXQgKi8KKwlIQ1VfQ0NTUl9DU19UTwkJPSAxPDwyNSwKKwlIQ1VfQ0NTUl9XRE9HCQk9IDE8PDI0LCAvKiBXYXRjaGRvZyBSZXNldCAqLworCisJSENVX0NDU1JfQ0xSX0lSUV9IT1NUCT0gMTw8MTcsIC8qIENsZWFyIElSUV9IT1NUICovCisJSENVX0NDU1JfU0VUX0lSUV9IQ1UJPSAxPDwxNiwgLyogU2V0IElSUV9IQ1UgKi8KKworCUhDVV9DQ1NSX0FIQl9SU1QJPSAxPDw5LCAvKiBSZXNldCBBSEIgYnJpZGdlICovCisJSENVX0NDU1JfQ1BVX1JTVF9NT0RFCT0gMTw8OCwgLyogQ1BVIFJlc2V0IE1vZGUgKi8KKworCUhDVV9DQ1NSX1NFVF9TWU5DX0NQVQk9IDE8PDUsCisJSENVX0NDU1JfQ1BVX0NMS19ESVZJREVfTVNLID0gMzw8MywvKiBDUFUgQ2xvY2sgRGl2aWRlICovCisJSENVX0NDU1JfQ1BVX0NMS19ESVZJREVfQkFTRT0gMTw8MywKKwlIQ1VfQ0NTUl9PU19QUlNOVAk9IDE8PDIsIC8qIEFTRiBPUyBQcmVzZW50ICovCisvKiBNaWNyb2NvbnRyb2xsZXIgU3RhdGUgKi8KKwlIQ1VfQ0NTUl9VQ19TVEFURV9NU0sJPSAzLAorCUhDVV9DQ1NSX1VDX1NUQVRFX0JBU0UJPSAxPDwwLAorCUhDVV9DQ1NSX0FTRl9SRVNFVAk9IDAsCisJSENVX0NDU1JfQVNGX0hBTFRFRAk9IDE8PDEsCisJSENVX0NDU1JfQVNGX1JVTk5JTkcJPSAxPDwwLAorfTsKKworLyoJSENVX0hDU1IJSG9zdCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KK2VudW0geworCUhDVV9IQ1NSX1NFVF9JUlFfQ1BVCT0gMTw8MTYsIC8qIFNldCBJUlFfQ1BVICovCisKKwlIQ1VfSENTUl9DTFJfSVJRX0hDVQk9IDE8PDEsIC8qIENsZWFyIElSUV9IQ1UgKi8KKwlIQ1VfSENTUl9TRVRfSVJRX0hPU1QJPSAxPDwwLAkvKiBTZXQgSVJRX0hPU1QgKi8KK307CisKKy8qCVNUQVRfQ1RSTAkJMzIgYml0CVN0YXR1cyBCTVUgY29udHJvbCByZWdpc3RlciAoWXVrb24tMiBvbmx5KSAqLworZW51bSB7CisJU0NfU1RBVF9DTFJfSVJRCT0gMTw8NCwJLyogU3RhdHVzIEJ1cnN0IElSUSBjbGVhciAqLworCVNDX1NUQVRfT1BfT04JPSAxPDwzLAkvKiBPcGVyYXRpb25hbCBNb2RlIE9uICovCisJU0NfU1RBVF9PUF9PRkYJPSAxPDwyLAkvKiBPcGVyYXRpb25hbCBNb2RlIE9mZiAqLworCVNDX1NUQVRfUlNUX0NMUgk9IDE8PDEsCS8qIENsZWFyIFN0YXR1cyBVbml0IFJlc2V0IChFbmFibGUpICovCisJU0NfU1RBVF9SU1RfU0VUCT0gMTw8MCwJLyogU2V0ICAgU3RhdHVzIFVuaXQgUmVzZXQgKi8KK307CisKKy8qCUdNQUNfQ1RSTAkJMzIgYml0CUdNQUMgQ29udHJvbCBSZWcgKFlVS09OIG9ubHkpICovCitlbnVtIHsKKwlHTUNfU0VUX1JTVAkgICAgPSAxPDwxNSwvKiBNQUMgU0VDIFJTVCAqLworCUdNQ19TRUNfUlNUX09GRiAgICAgPSAxPDwxNCwvKiBNQUMgU0VDIFJTdCBPRkYgKi8KKwlHTUNfQllQX01BQ1NFQ1JYX09OID0gMTw8MTMsLyogQnlwYXNzIG1hY3NlYyBSWCAqLworCUdNQ19CWVBfTUFDU0VDUlhfT0ZGPSAxPDwxMiwvKiBCeXBhc3MgbWFjc2VjIFJYIG9mZiAqLworCUdNQ19CWVBfTUFDU0VDVFhfT04gPSAxPDwxMSwvKiBCeXBhc3MgbWFjc2VjIFRYICovCisJR01DX0JZUF9NQUNTRUNUWF9PRkY9IDE8PDEwLC8qIEJ5cGFzcyBtYWNzZWMgVFggIG9mZiovCisJR01DX0JZUF9SRVRSX09OCT0gMTw8OSwgLyogQnlwYXNzIHJldHJhbnNtaXQgRklGTyBPbiAqLworCUdNQ19CWVBfUkVUUl9PRkY9IDE8PDgsIC8qIEJ5cGFzcyByZXRyYW5zbWl0IEZJRk8gT2ZmICovCisKKwlHTUNfSF9CVVJTVF9PTgk9IDE8PDcsCS8qIEhhbGYgRHVwbGV4IEJ1cnN0IE1vZGUgT24gKi8KKwlHTUNfSF9CVVJTVF9PRkYJPSAxPDw2LAkvKiBIYWxmIER1cGxleCBCdXJzdCBNb2RlIE9mZiAqLworCUdNQ19GX0xPT1BCX09OCT0gMTw8NSwJLyogRklGTyBMb29wYmFjayBPbiAqLworCUdNQ19GX0xPT1BCX09GRgk9IDE8PDQsCS8qIEZJRk8gTG9vcGJhY2sgT2ZmICovCisJR01DX1BBVVNFX09OCT0gMTw8MywJLyogUGF1c2UgT24gKi8KKwlHTUNfUEFVU0VfT0ZGCT0gMTw8MiwJLyogUGF1c2UgT2ZmICovCisJR01DX1JTVF9DTFIJPSAxPDwxLAkvKiBDbGVhciBHTUFDIFJlc2V0ICovCisJR01DX1JTVF9TRVQJPSAxPDwwLAkvKiBTZXQgICBHTUFDIFJlc2V0ICovCit9OworCisvKglHUEhZX0NUUkwJCTMyIGJpdAlHUEhZIENvbnRyb2wgUmVnIChZVUtPTiBvbmx5KSAqLworZW51bSB7CisJR1BDX1RYX1BBVVNFCT0gMTw8MzAsIC8qIFR4IHBhdXNlIGVuYWJsZWQgKHJvKSAqLworCUdQQ19SWF9QQVVTRQk9IDE8PDI5LCAvKiBSeCBwYXVzZSBlbmFibGVkIChybykgKi8KKwlHUENfU1BFRUQJPSAzPDwyNywgLyogUEhZIHNwZWVkIChybykgKi8KKwlHUENfTElOSwk9IDE8PDI2LCAvKiBMaW5rIHVwIChybykgKi8KKwlHUENfRFVQTEVYCT0gMTw8MjUsIC8qIER1cGxleCAocm8pICovCisJR1BDX0NMT0NLCT0gMTw8MjQsIC8qIDEyNU1oeiBjbG9jayBzdGFibGUgKHJvKSAqLworCisJR1BDX1BET1dOCT0gMTw8MjMsIC8qIEludGVybmFsIHJlZ3VsYXRvciAyLjUgcG93ZXIgZG93biAqLworCUdQQ19UU1RNT0RFCT0gMTw8MjIsIC8qIFRlc3QgbW9kZSAqLworCUdQQ19SRUcxOAk9IDE8PDIxLCAvKiBSZWcxOCBQb3dlciBkb3duICovCisJR1BDX1JFRzEyU0VMCT0gMzw8MTksIC8qIFJlZzEyIHBvd2VyIHNldHRpbmcgKi8KKwlHUENfUkVHMThTRUwJPSAzPDwxNywgLyogUmVnMTggcG93ZXIgc2V0dGluZyAqLworCUdQQ19TUElMT0NLCT0gMTw8MTYsIC8qIFNQSSBsb2NrIChBU0YpICovCisKKwlHUENfTEVETVVYCT0gMzw8MTQsIC8qIExFRCBNdXggKi8KKwlHUENfSU5UUE9MCT0gMTw8MTMsIC8qIEludGVycnVwdCBwb2xhcml0eSAqLworCUdQQ19ERVRFQ1QJPSAxPDwxMiwgLyogRW5lcmd5IGRldGVjdCAqLworCUdQQ18xMDAwSEQJPSAxPDwxMSwgLyogRW5hYmxlIDEwMDBNYml0IEhEICovCisJR1BDX1NMQVZFCT0gMTw8MTAsIC8qIFNsYXZlIG1vZGUgKi8KKwlHUENfUEFVU0UJPSAxPDw5LCAvKiBQYXVzZSBlbmFibGUgKi8KKwlHUENfTEVEQ1RMCT0gMzw8NiwgLyogR1BIWSBMZWRzICovCisKKwlHUENfUlNUX0NMUgk9IDE8PDEsCS8qIENsZWFyIEdQSFkgUmVzZXQgKi8KKwlHUENfUlNUX1NFVAk9IDE8PDAsCS8qIFNldCAgIEdQSFkgUmVzZXQgKi8KK307CisKKy8qCUdNQUNfSVJRX1NSQwkgOCBiaXQJR01BQyBJbnRlcnJ1cHQgU291cmNlIFJlZyAoWVVLT04gb25seSkgKi8KKy8qCUdNQUNfSVJRX01TSwkgOCBiaXQJR01BQyBJbnRlcnJ1cHQgTWFzayAgIFJlZyAoWVVLT04gb25seSkgKi8KK2VudW0geworCUdNX0lTX1RYX0NPX09WCT0gMTw8NSwJLyogVHJhbnNtaXQgQ291bnRlciBPdmVyZmxvdyBJUlEgKi8KKwlHTV9JU19SWF9DT19PVgk9IDE8PDQsCS8qIFJlY2VpdmUgQ291bnRlciBPdmVyZmxvdyBJUlEgKi8KKwlHTV9JU19UWF9GRl9VUgk9IDE8PDMsCS8qIFRyYW5zbWl0IEZJRk8gVW5kZXJydW4gKi8KKwlHTV9JU19UWF9DT01QTAk9IDE8PDIsCS8qIEZyYW1lIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSAqLworCUdNX0lTX1JYX0ZGX09SCT0gMTw8MSwJLyogUmVjZWl2ZSBGSUZPIE92ZXJydW4gKi8KKwlHTV9JU19SWF9DT01QTAk9IDE8PDAsCS8qIEZyYW1lIFJlY2VwdGlvbiBDb21wbGV0ZSAqLworCisjZGVmaW5lIEdNQUNfREVGX01TSyAgICAgR01fSVNfVFhfRkZfVVIKK307CisKKy8qCUdNQUNfTElOS19DVFJMCTE2IGJpdAlHTUFDIExpbmsgQ29udHJvbCBSZWcgKFlVS09OIG9ubHkpICovCitlbnVtIHsJCQkJCQkvKiBCaXRzIDE1Li4gMjoJcmVzZXJ2ZWQgKi8KKwlHTUxDX1JTVF9DTFIJPSAxPDwxLAkvKiBDbGVhciBHTUFDIExpbmsgUmVzZXQgKi8KKwlHTUxDX1JTVF9TRVQJPSAxPDwwLAkvKiBTZXQgICBHTUFDIExpbmsgUmVzZXQgKi8KK307CisKKworLyoJV09MX0NUUkxfU1RBVAkxNiBiaXQJV09MIENvbnRyb2wvU3RhdHVzIFJlZyAqLworZW51bSB7CisJV09MX0NUTF9MSU5LX0NIR19PQ0MJCT0gMTw8MTUsCisJV09MX0NUTF9NQUdJQ19QS1RfT0NDCQk9IDE8PDE0LAorCVdPTF9DVExfUEFUVEVSTl9PQ0MJCT0gMTw8MTMsCisJV09MX0NUTF9DTEVBUl9SRVNVTFQJCT0gMTw8MTIsCisJV09MX0NUTF9FTkFfUE1FX09OX0xJTktfQ0hHCT0gMTw8MTEsCisJV09MX0NUTF9ESVNfUE1FX09OX0xJTktfQ0hHCT0gMTw8MTAsCisJV09MX0NUTF9FTkFfUE1FX09OX01BR0lDX1BLVAk9IDE8PDksCisJV09MX0NUTF9ESVNfUE1FX09OX01BR0lDX1BLVAk9IDE8PDgsCisJV09MX0NUTF9FTkFfUE1FX09OX1BBVFRFUk4JPSAxPDw3LAorCVdPTF9DVExfRElTX1BNRV9PTl9QQVRURVJOCT0gMTw8NiwKKwlXT0xfQ1RMX0VOQV9MSU5LX0NIR19VTklUCT0gMTw8NSwKKwlXT0xfQ1RMX0RJU19MSU5LX0NIR19VTklUCT0gMTw8NCwKKwlXT0xfQ1RMX0VOQV9NQUdJQ19QS1RfVU5JVAk9IDE8PDMsCisJV09MX0NUTF9ESVNfTUFHSUNfUEtUX1VOSVQJPSAxPDwyLAorCVdPTF9DVExfRU5BX1BBVFRFUk5fVU5JVAk9IDE8PDEsCisJV09MX0NUTF9ESVNfUEFUVEVSTl9VTklUCT0gMTw8MCwKK307CisKKworLyogQ29udHJvbCBmbGFncyAqLworZW51bSB7CisJVURQVENQCT0gMTw8MCwKKwlDQUxTVU0JPSAxPDwxLAorCVdSX1NVTQk9IDE8PDIsCisJSU5JVF9TVU09IDE8PDMsCisJTE9DS19TVU09IDE8PDQsCisJSU5TX1ZMQU49IDE8PDUsCisJRU9QCT0gMTw8NywKK307CisKK2VudW0geworCUhXX09XTkVSIAk9IDE8PDcsCisJT1BfVENQV1JJVEUJPSAweDExLAorCU9QX1RDUFNUQVJUCT0gMHgxMiwKKwlPUF9UQ1BJTklUCT0gMHgxNCwKKwlPUF9UQ1BMQ0sJPSAweDE4LAorCU9QX1RDUENIS1NVTQk9IE9QX1RDUFNUQVJULAorCU9QX1RDUElTCT0gT1BfVENQSU5JVCB8IE9QX1RDUFNUQVJULAorCU9QX1RDUExXCT0gT1BfVENQTENLIHwgT1BfVENQV1JJVEUsCisJT1BfVENQTFNXCT0gT1BfVENQTENLIHwgT1BfVENQU1RBUlQgfCBPUF9UQ1BXUklURSwKKwlPUF9UQ1BMSVNXCT0gT1BfVENQTENLIHwgT1BfVENQSU5JVCB8IE9QX1RDUFNUQVJUIHwgT1BfVENQV1JJVEUsCisKKwlPUF9BRERSNjQJPSAweDIxLAorCU9QX1ZMQU4JCT0gMHgyMiwKKwlPUF9BRERSNjRWTEFOCT0gT1BfQUREUjY0IHwgT1BfVkxBTiwKKwlPUF9MUkdMRU4JPSAweDI0LAorCU9QX0xSR0xFTlZMQU4JPSBPUF9MUkdMRU4gfCBPUF9WTEFOLAorCU9QX01TUwkJPSAweDI4LAorCU9QX01TU1ZMQU4JPSBPUF9NU1MgfCBPUF9WTEFOLAorCisJT1BfQlVGRkVSCT0gMHg0MCwKKwlPUF9QQUNLRVQJPSAweDQxLAorCU9QX0xBUkdFU0VORAk9IDB4NDMsCisJT1BfTFNPVjIJPSAweDQ1LAorCisvKiBZVUtPTi0yIFNUQVRVUyBvcGNvZGVzIGRlZmluZXMgKi8KKwlPUF9SWFNUQVQJPSAweDYwLAorCU9QX1JYVElNRVNUQU1QCT0gMHg2MSwKKwlPUF9SWFZMQU4JPSAweDYyLAorCU9QX1JYQ0hLUwk9IDB4NjQsCisJT1BfUlhDSEtTVkxBTgk9IE9QX1JYQ0hLUyB8IE9QX1JYVkxBTiwKKwlPUF9SWFRJTUVWTEFOCT0gT1BfUlhUSU1FU1RBTVAgfCBPUF9SWFZMQU4sCisJT1BfUlNTX0hBU0gJPSAweDY1LAorCU9QX1RYSU5ERVhMRQk9IDB4NjgsCisJT1BfTUFDU0VDCT0gMHg2YywKKwlPUF9QVVRJRFgJPSAweDcwLAorfTsKKworZW51bSBzdGF0dXNfY3NzIHsKKwlDU1NfVENQVURQQ1NPSwk9IDE8PDcsCS8qIFRDUCAvIFVEUCBjaGVja3N1bSBpcyBvayAqLworCUNTU19JU1VEUAk9IDE8PDYsIC8qIHBhY2tldCBpcyBhIFVEUCBwYWNrZXQgKi8KKwlDU1NfSVNUQ1AJPSAxPDw1LCAvKiBwYWNrZXQgaXMgYSBUQ1AgcGFja2V0ICovCisJQ1NTX0lTSVBGUkFHCT0gMTw8NCwgLyogcGFja2V0IGlzIGEgVENQL1VEUCBmcmFnLCBDUyBjYWxjIG5vdCBkb25lICovCisJQ1NTX0lTSVBWNgk9IDE8PDMsIC8qIHBhY2tldCBpcyBhIElQdjYgcGFja2V0ICovCisJQ1NTX0lQVjRDU1VNT0sJPSAxPDwyLCAvKiBJUCB2NDogVENQIGhlYWRlciBjaGVja3N1bSBpcyBvayAqLworCUNTU19JU0lQVjQJPSAxPDwxLCAvKiBwYWNrZXQgaXMgYSBJUHY0IHBhY2tldCAqLworCUNTU19MSU5LX0JJVAk9IDE8PDAsIC8qIHBvcnQgbnVtYmVyIChsZWdhY3kpICovCit9OworCisvKiBZdWtvbiAyIGhhcmR3YXJlIGludGVyZmFjZSAqLworc3RydWN0IHNreTJfdHhfbGUgeworCXUzMglhZGRyOworCXUxNglsZW5ndGg7CS8qIGFsc28gdmxhbiB0YWcgb3IgY2hlY2tzdW0gc3RhcnQgKi8KKwl1OAljdHJsOworCXU4CW9wY29kZTsKK30gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2t5Ml9yeF9sZSB7CisJdTMyCWFkZHI7CisJdTE2CWxlbmd0aDsKKwl1OAljdHJsOworCXU4CW9wY29kZTsKK30gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2t5Ml9zdGF0dXNfbGUgeworCXUzMglzdGF0dXM7CS8qIGFsc28gY2hlY2tzdW0gKi8KKwl1MTYJbGVuZ3RoOwkvKiBhbHNvIHZsYW4gdGFnICovCisJdTgJY3NzOworCXU4CW9wY29kZTsKK30gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCitzdHJ1Y3QgdHhfcmluZ19pbmZvIHsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2I7CisJdTMyIG1hcGFkZHI7CisJdTMyIG1hcGxlbjsKK307CisKK3N0cnVjdCByeF9yaW5nX2luZm8geworCXN0cnVjdCBpb19idWZmZXIgKmlvYjsKKwl1MzIJZGF0YV9hZGRyOworCXUzMglkYXRhX3NpemU7Cit9OworCitlbnVtIGZsb3dfY29udHJvbCB7CisJRkNfTk9ORQk9IDAsCisJRkNfVFgJPSAxLAorCUZDX1JYCT0gMiwKKwlGQ19CT1RICT0gMywKK307CisKK3N0cnVjdCBza3kyX3BvcnQgeworCXN0cnVjdCBza3kyX2h3CSAgICAgKmh3OworCXN0cnVjdCBuZXRfZGV2aWNlICAgICpuZXRkZXY7CisJdW5zaWduZWQJICAgICBwb3J0OworCisJc3RydWN0IHR4X3JpbmdfaW5mbyAgKnR4X3Jpbmc7CisJc3RydWN0IHNreTJfdHhfbGUgICAgKnR4X2xlOworCXUxNgkJICAgICB0eF9jb25zOwkJLyogbmV4dCBsZSB0byBjaGVjayAqLworCXUxNgkJICAgICB0eF9wcm9kOwkJLyogbmV4dCBsZSB0byB1c2UgKi8KKworCXN0cnVjdCByeF9yaW5nX2luZm8gICpyeF9yaW5nOworCXN0cnVjdCBza3kyX3J4X2xlICAgICpyeF9sZTsKKworCXUxNgkJICAgICByeF9uZXh0OwkJLyogbmV4dCByZSB0byBjaGVjayAqLworCXUxNgkJICAgICByeF9wdXQ7CQkvKiBuZXh0IGxlIGluZGV4IHRvIHVzZSAqLworCXUxNgkJICAgICByeF9kYXRhX3NpemU7CisKKwl1MzIJCSAgICAgcnhfbGVfbWFwOworCXUzMgkJICAgICB0eF9sZV9tYXA7CisJdTE2CQkgICAgIGFkdmVydGlzaW5nOwkvKiBBRFZFUlRJU0VEXyBiaXRzICovCisJdTE2CQkgICAgIHNwZWVkOwkvKiBTUEVFRF8xMDAwLCBTUEVFRF8xMDAsIC4uLiAqLworCXU4CQkgICAgIGF1dG9uZWc7CS8qIEFVVE9ORUdfRU5BQkxFLCBBVVRPTkVHX0RJU0FCTEUgKi8KKwl1OAkJICAgICBkdXBsZXg7CS8qIERVUExFWF9IQUxGLCBEVVBMRVhfRlVMTCAqLworCWVudW0gZmxvd19jb250cm9sICAgIGZsb3dfbW9kZTsKKwllbnVtIGZsb3dfY29udHJvbCAgICBmbG93X3N0YXR1czsKK307CisKK3N0cnVjdCBza3kyX2h3IHsKKwl1bnNpZ25lZCBsb25nCSAgICAgcmVnczsKKwlzdHJ1Y3QgcGNpX2RldmljZSAgICAqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAqZGV2WzJdOworCXVuc2lnbmVkIGxvbmcJICAgICBmbGFnczsKKyNkZWZpbmUgU0tZMl9IV19VU0VfTVNJCQkweDAwMDAwMDAxCisjZGVmaW5lIFNLWTJfSFdfRklCUkVfUEhZCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0tZMl9IV19HSUdBQklUCQkweDAwMDAwMDA0CisjZGVmaW5lIFNLWTJfSFdfTkVXRVJfUEhZCTB4MDAwMDAwMDgKKyNkZWZpbmUgU0tZMl9IV19SQU1fQlVGRkVSCTB4MDAwMDAwMTAKKyNkZWZpbmUgU0tZMl9IV19ORVdfTEUJCTB4MDAwMDAwMjAJLyogbmV3IExTT3YyIGZvcm1hdCAqLworI2RlZmluZSBTS1kyX0hXX0FVVE9fVFhfU1VNCTB4MDAwMDAwNDAJLyogbmV3IElQIGRlY29kZSBmb3IgVHggKi8KKyNkZWZpbmUgU0tZMl9IV19BRFZfUE9XRVJfQ1RMCTB4MDAwMDAwODAJLyogYWRkaXRpb25hbCBQSFkgcG93ZXIgcmVncyAqLworCisJdTgJICAgICAJICAgICBjaGlwX2lkOworCXU4CQkgICAgIGNoaXBfcmV2OworCXU4CQkgICAgIHBtZF90eXBlOworCXU4CQkgICAgIHBvcnRzOworCisJc3RydWN0IHNreTJfc3RhdHVzX2xlICpzdF9sZTsKKwl1MzIJCSAgICAgc3RfaWR4OworCXUzMgkJICAgICBzdF9kbWE7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBza3kyX2lzX2NvcHBlcihjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcpCit7CisJcmV0dXJuICEoaHctPmZsYWdzICYgU0tZMl9IV19GSUJSRV9QSFkpOworfQorCisvKiBSZWdpc3RlciBhY2Nlc3NvciBmb3IgbWVtb3J5IG1hcHBlZCBkZXZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHNreTJfcmVhZDMyKGNvbnN0IHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcmVnKQoreworCXJldHVybiByZWFkbChody0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNreTJfcmVhZDE2KGNvbnN0IHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcmVnKQoreworCXJldHVybiByZWFkdyhody0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggc2t5Ml9yZWFkOChjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHJlZykKK3sKKwlyZXR1cm4gcmVhZGIoaHctPnJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2t5Ml93cml0ZTMyKGNvbnN0IHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcmVnLCB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIGh3LT5yZWdzICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNreTJfd3JpdGUxNihjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHJlZywgdTE2IHZhbCkKK3sKKwl3cml0ZXcodmFsLCBody0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza3kyX3dyaXRlOChjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHJlZywgdTggdmFsKQoreworCXdyaXRlYih2YWwsIGh3LT5yZWdzICsgcmVnKTsKK30KKworLyogWXVrb24gUEhZIHJlbGF0ZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNLX0dNQUNfUkVHKHBvcnQscmVnKSBcCisJKEJBU0VfR01BQ18xICsgKHBvcnQpICogKEJBU0VfR01BQ18yLUJBU0VfR01BQ18xKSArIChyZWcpKQorI2RlZmluZSBHTV9QSFlfUkVUUklFUwkxMDAKKworc3RhdGljIGlubGluZSB1MTYgZ21hX3JlYWQxNihjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHBvcnQsIHVuc2lnbmVkIHJlZykKK3sKKwlyZXR1cm4gc2t5Ml9yZWFkMTYoaHcsIFNLX0dNQUNfUkVHKHBvcnQscmVnKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdtYV9yZWFkMzIoc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCBwb3J0LCB1bnNpZ25lZCByZWcpCit7CisJdW5zaWduZWQgYmFzZSA9IFNLX0dNQUNfUkVHKHBvcnQsIHJlZyk7CisJcmV0dXJuICh1MzIpIHNreTJfcmVhZDE2KGh3LCBiYXNlKQorCQl8ICh1MzIpIHNreTJfcmVhZDE2KGh3LCBiYXNlKzQpIDw8IDE2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ21hX3dyaXRlMTYoY29uc3Qgc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCBwb3J0LCBpbnQgciwgdTE2IHYpCit7CisJc2t5Ml93cml0ZTE2KGh3LCBTS19HTUFDX1JFRyhwb3J0LHIpLCB2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdtYV9zZXRfYWRkcihzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHBvcnQsIHVuc2lnbmVkIHJlZywKKwkJCQkgICAgY29uc3QgdTggKmFkZHIpCit7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIHJlZywgICh1MTYpIGFkZHJbMF0gfCAoKHUxNikgYWRkclsxXSA8PCA4KSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys0LCh1MTYpIGFkZHJbMl0gfCAoKHUxNikgYWRkclszXSA8PCA4KSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys4LCh1MTYpIGFkZHJbNF0gfCAoKHUxNikgYWRkcls1XSA8PCA4KSk7Cit9CisKKy8qIFBDSSBjb25maWcgc3BhY2UgYWNjZXNzICovCitzdGF0aWMgaW5saW5lIHUzMiBza3kyX3BjaV9yZWFkMzIoY29uc3Qgc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCByZWcpCit7CisJcmV0dXJuIHNreTJfcmVhZDMyKGh3LCBZMl9DRkdfU1BDICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgc2t5Ml9wY2lfcmVhZDE2KGNvbnN0IHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcmVnKQoreworCXJldHVybiBza3kyX3JlYWQxNihodywgWTJfQ0ZHX1NQQyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza3kyX3BjaV93cml0ZTMyKHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcmVnLCB1MzIgdmFsKQoreworCXNreTJfd3JpdGUzMihodywgWTJfQ0ZHX1NQQyArIHJlZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNreTJfcGNpX3dyaXRlMTYoc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCByZWcsIHUxNiB2YWwpCit7CisJc2t5Ml93cml0ZTE2KGh3LCBZMl9DRkdfU1BDICsgcmVnLCB2YWwpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9zbWM5MDAwLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9zbWM5MDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiZjEwNAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NtYzkwMDAuYwpAQCAtMCwwICsxLDk1NSBAQAorI2lmZGVmIEFMTE1VTFRJCisjZXJyb3IgbXVsdGljYXN0IHN1cHBvcnQgaXMgbm90IHlldCBpbXBsZW1lbnRlZAorI2VuZGlmCisgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNtYzkwMDAuYworICogVGhpcyBpcyBhIEV0aGVyYm9vdCBkcml2ZXIgZm9yIFNNQydzIDkwMDAgc2VyaWVzIG9mIEV0aGVybmV0IGNhcmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYW5pZWwgRW5nc3Ry9m0gPGRhbmllbC5lbmdzdHJvbUByaWtzbmV0dC5ubz4KKyAqIEJhc2VkIG9uIHRoZSBMaW51eCBTTUM5MDAwIGRyaXZlciwgc21jOTE5NC5jIGJ5IEVyaWMgU3RhaGxtYW4KKyAqIENvcHlyaWdodCAoQykgMTk5NiBieSBFcmlrIFN0YWhsbWFuIDxlcmljQHZ0LmVkdT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAiRmVhdHVyZXMiIG9mIHRoZSBTTUMgY2hpcDoKKyAqICAgNDYwOCBieXRlIHBhY2tldCBtZW1vcnkuICggZm9yIHRoZSA5MUM5Mi80LiAgT3RoZXJzIGhhdmUgbW9yZSApCisgKiAgIEVFUFJPTSBmb3IgY29uZmlndXJhdGlvbgorICogICBBVUkvVFAgc2VsZWN0aW9uCisgKgorICogQXV0aG9ycworICoJRXJpayBTdGFobG1hbgkJCQk8ZXJpa0B2dC5lZHU+CisgKiAgICAgIERhbmllbCBFbmdzdHL2bSAgICAgICAgICAgICAgICAgICAgICAgICA8ZGFuaWVsLmVuZ3N0cm9tQHJpa3NuZXR0Lm5vPgorICoKKyAqIEhpc3RvcnkKKyAqIDk4LTA5LTI1ICAgICAgICAgICAgICBEYW5pZWwgRW5nc3Ry9m0gRXRoZXJib290IGRyaXZlciBjcmF0ZWQgZnJvbSBFcmljJ3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGludXggZHJpdmVyLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRklMRV9MSUNFTkNFICggR1BMX0FOWSApOworCisjZGVmaW5lIExJTlVYX09VVF9NQUNST1MgMQorI2RlZmluZSBTTUM5MDAwX0RFQlVHICAgIDAKKworI2lmIFNNQzkwMDBfREVCVUcgPiAxCisjZGVmaW5lIFBSSU5USzIgcHJpbnRmCisjZWxzZQorI2RlZmluZSBQUklOVEsyKGFyZ3MuLi4pCisjZW5kaWYKKworI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgPGdweGUvaXNhLmg+CisjaW5jbHVkZSAic21jOTAwMC5oIgorCisjIGRlZmluZSBfb3V0YiBvdXRiCisjIGRlZmluZSBfb3V0dyBvdXR3CisKK3N0YXRpYyBjb25zdCBjaGFyICAgICAgIHNtYzkwMDBfdmVyc2lvbltdID0gIlZlcnNpb24gMC45OSA5OC0wOS0zMCI7CitzdGF0aWMgY29uc3QgY2hhciAgICAgICAqaW50ZXJmYWNlc1sgMiBdID0geyAiVFAiLCAiQVVJIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgICAgICAgKmNoaXBfaWRzWyAxNSBdID0gIHsKKyAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAvKiAzICovICJTTUM5MUM5MC85MUM5MiIsCisgICAvKiA0ICovICJTTUM5MUM5NCIsCisgICAvKiA1ICovICJTTUM5MUM5NSIsCisgICBOVUxMLAorICAgLyogNyAqLyAiU01DOTFDMTAwIiwKKyAgIC8qIDggKi8gIlNNQzkxQzEwMEZEIiwKKyAgIC8qIDkgKi8gIlNNQzkxQzExeEZEIiwKKyAgIE5VTEwsIE5VTEwsCisgICBOVUxMLCBOVUxMLCBOVUxMCit9Oworc3RhdGljIGNvbnN0IGNoYXIgICAgICBzbWM5MWM5Nl9pZFtdID0gIlNNQzkxQzk2IjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuIFJlYWRzIGEgcmVnaXN0ZXIgZnJvbSB0aGUgTUlJIE1hbmFnZW1lbnQgc2VyaWFsIGludGVyZmFjZQorIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB3b3JkIHNtY19yZWFkX3BoeV9yZWdpc3RlcihpbnQgaW9hZGRyLCBieXRlIHBoeWFkZHIsIGJ5dGUgcGh5cmVnKQoreworICAgIGludCBvbGRCYW5rOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGJ5dGUgbWFzazsKKyAgICB3b3JkIG1paV9yZWc7CisgICAgYnl0ZSBiaXRzWzY0XTsKKyAgICBpbnQgY2xrX2lkeCA9IDA7CisgICAgaW50IGlucHV0X2lkeDsKKyAgICB3b3JkIHBoeWRhdGE7CisKKyAgICAvLyAzMiBjb25zZWN1dGl2ZSBvbmVzIG9uIE1ETyB0byBlc3RhYmxpc2ggc3luYworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQorICAgICAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRSB8IE1JSV9NRE87CisKKyAgICAvLyBTdGFydCBjb2RlIDwwMT4KKyAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRTsKKyAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRSB8IE1JSV9NRE87CisKKyAgICAvLyBSZWFkIGNvbW1hbmQgPDEwPgorICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FIHwgTUlJX01ETzsKKyAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRTsKKworICAgIC8vIE91dHB1dCB0aGUgUEhZIGFkZHJlc3MsIG1zYiBmaXJzdAorICAgIG1hc2sgPSAoYnl0ZSkweDEwOworICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpCisgICAgeworICAgICAgICBpZiAocGh5YWRkciAmIG1hc2spCisgICAgICAgICAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRSB8IE1JSV9NRE87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FOworCisgICAgICAgIC8vIFNoaWZ0IHRvIG5leHQgbG93ZXN0IGJpdAorICAgICAgICBtYXNrID4+PSAxOworICAgIH0KKworICAgIC8vIE91dHB1dCB0aGUgcGh5IHJlZ2lzdGVyIG51bWJlciwgbXNiIGZpcnN0CisgICAgbWFzayA9IChieXRlKTB4MTA7CisgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChwaHlyZWcgJiBtYXNrKQorICAgICAgICAgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0UgfCBNSUlfTURPOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRTsKKworICAgICAgICAvLyBTaGlmdCB0byBuZXh0IGxvd2VzdCBiaXQKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICB9CisKKyAgICAvLyBUcmlzdGF0ZSBhbmQgdHVybmFyb3VuZCAoMiBiaXQgdGltZXMpCisgICAgYml0c1tjbGtfaWR4KytdID0gMDsKKyAgICAvL2JpdHNbY2xrX2lkeCsrXSA9IDA7CisKKyAgICAvLyBJbnB1dCBzdGFydHMgYXQgdGhpcyBiaXQgdGltZQorICAgIGlucHV0X2lkeCA9IGNsa19pZHg7CisKKyAgICAvLyBXaWxsIGlucHV0IDE2IGJpdHMKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkKKyAgICAgICAgYml0c1tjbGtfaWR4KytdID0gMDsKKworICAgIC8vIEZpbmFsIGNsb2NrIGJpdAorICAgIGJpdHNbY2xrX2lkeCsrXSA9IDA7CisKKyAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGJhbmsKKyAgICBvbGRCYW5rID0gaW53KCBpb2FkZHIrQkFOS19TRUxFQ1QgKTsKKworICAgIC8vIFNlbGVjdCBiYW5rIDMKKyAgICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAzKTsKKworICAgIC8vIEdldCB0aGUgY3VycmVudCBNSUkgcmVnaXN0ZXIgdmFsdWUKKyAgICBtaWlfcmVnID0gaW53KCBpb2FkZHIrTUlJX1JFRyApOworCisgICAgLy8gVHVybiBvZmYgYWxsIE1JSSBJbnRlcmZhY2UgYml0cworICAgIG1paV9yZWcgJj0gfihNSUlfTURPRXxNSUlfTUNMS3xNSUlfTURJfE1JSV9NRE8pOworCisgICAgLy8gQ2xvY2sgYWxsIDY0IGN5Y2xlcworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoYml0cyk7ICsraSkKKyAgICB7CisgICAgICAgIC8vIENsb2NrIExvdyAtIG91dHB1dCBkYXRhCisgICAgICAgIG91dHcoIG1paV9yZWcgfCBiaXRzW2ldLCBpb2FkZHIrTUlJX1JFRyApOworICAgICAgICB1ZGVsYXkoNTApOworCisKKyAgICAgICAgLy8gQ2xvY2sgSGkgLSBpbnB1dCBkYXRhCisgICAgICAgIG91dHcoIG1paV9yZWcgfCBiaXRzW2ldIHwgTUlJX01DTEssIGlvYWRkcitNSUlfUkVHICk7CisgICAgICAgIHVkZWxheSg1MCk7CisgICAgICAgIGJpdHNbaV0gfD0gaW53KCBpb2FkZHIrTUlJX1JFRyApICYgTUlJX01ESTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdG8gaWRsZSBzdGF0ZQorICAgIC8vIFNldCBjbG9jayB0byBsb3csIGRhdGEgdG8gbG93LCBhbmQgb3V0cHV0IHRyaXN0YXRlZAorICAgIG91dHcoIG1paV9yZWcsIGlvYWRkcitNSUlfUkVHICk7CisgICAgdWRlbGF5KDUwKTsKKworICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgYmFuayBzZWxlY3QKKyAgICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCBvbGRCYW5rKTsKKworICAgIC8vIFJlY292ZXIgaW5wdXQgZGF0YQorICAgIHBoeWRhdGEgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorICAgIHsKKyAgICAgICAgcGh5ZGF0YSA8PD0gMTsKKworICAgICAgICBpZiAoYml0c1tpbnB1dF9pZHgrK10gJiBNSUlfTURJKQorICAgICAgICAgICAgcGh5ZGF0YSB8PSAweDAwMDE7CisgICAgfQorCisjaWYgKFNNQ19ERUJVRyA+IDIgKQorICAgICAgICBwcmludGYoInNtY19yZWFkX3BoeV9yZWdpc3RlcigpOiBwaHlhZGRyPSV4LHBoeXJlZz0leCxwaHlkYXRhPSV4XG4iLAorICAgICAgICAgICAgICAgcGh5YWRkciwgcGh5cmVnLCBwaHlkYXRhKTsKKyNlbmRpZgorCisgICAgICAgIHJldHVybihwaHlkYXRhKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gV3JpdGVzIGEgcmVnaXN0ZXIgdG8gdGhlIE1JSSBNYW5hZ2VtZW50IHNlcmlhbCBpbnRlcmZhY2UKKyAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBzbWNfd3JpdGVfcGh5X3JlZ2lzdGVyKGludCBpb2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgcGh5YWRkciwgYnl0ZSBwaHlyZWcsIHdvcmQgcGh5ZGF0YSkKK3sKKyAgICBpbnQgb2xkQmFuazsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB3b3JkIG1hc2s7CisgICAgd29yZCBtaWlfcmVnOworICAgIGJ5dGUgYml0c1s2NV07CisgICAgaW50IGNsa19pZHggPSAwOworCisgICAgLy8gMzIgY29uc2VjdXRpdmUgb25lcyBvbiBNRE8gdG8gZXN0YWJsaXNoIHN5bmMKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKKyAgICAgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0UgfCBNSUlfTURPOworCisgICAgLy8gU3RhcnQgY29kZSA8MDE+CisgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0U7CisgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0UgfCBNSUlfTURPOworCisgICAgLy8gV3JpdGUgY29tbWFuZCA8MDE+CisgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0U7CisgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0UgfCBNSUlfTURPOworCisgICAgLy8gT3V0cHV0IHRoZSBQSFkgYWRkcmVzcywgbXNiIGZpcnN0CisgICAgbWFzayA9IChieXRlKTB4MTA7CisgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChwaHlhZGRyICYgbWFzaykKKyAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FIHwgTUlJX01ETzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0U7CisKKyAgICAgICAgICAgICAgICAvLyBTaGlmdCB0byBuZXh0IGxvd2VzdCBiaXQKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICB9CisKKyAgICAvLyBPdXRwdXQgdGhlIHBoeSByZWdpc3RlciBudW1iZXIsIG1zYiBmaXJzdAorICAgIG1hc2sgPSAoYnl0ZSkweDEwOworICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpCisgICAgeworICAgICAgICBpZiAocGh5cmVnICYgbWFzaykKKyAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FIHwgTUlJX01ETzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0U7CisKKyAgICAgICAgLy8gU2hpZnQgdG8gbmV4dCBsb3dlc3QgYml0CisgICAgICAgIG1hc2sgPj49IDE7CisgICAgfQorCisgICAgLy8gVHJpc3RhdGUgYW5kIHR1cm5hcm91bmQgKDIgYml0IHRpbWVzKQorICAgIGJpdHNbY2xrX2lkeCsrXSA9IDA7CisgICAgYml0c1tjbGtfaWR4KytdID0gMDsKKworICAgIC8vIFdyaXRlIG91dCAxNiBiaXRzIG9mIGRhdGEsIG1zYiBmaXJzdAorICAgIG1hc2sgPSAweDgwMDA7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCisgICAgeworICAgICAgICBpZiAocGh5ZGF0YSAmIG1hc2spCisgICAgICAgICAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRSB8IE1JSV9NRE87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FOworCisgICAgICAgIC8vIFNoaWZ0IHRvIG5leHQgbG93ZXN0IGJpdAorICAgICAgICBtYXNrID4+PSAxOworICAgIH0KKworICAgIC8vIEZpbmFsIGNsb2NrIGJpdCAodHJpc3RhdGUpCisgICAgYml0c1tjbGtfaWR4KytdID0gMDsKKworICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgYmFuaworICAgIG9sZEJhbmsgPSBpbncoIGlvYWRkcitCQU5LX1NFTEVDVCApOworCisgICAgLy8gU2VsZWN0IGJhbmsgMworICAgIFNNQ19TRUxFQ1RfQkFOSyhpb2FkZHIsIDMpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IE1JSSByZWdpc3RlciB2YWx1ZQorICAgIG1paV9yZWcgPSBpbncoIGlvYWRkcitNSUlfUkVHICk7CisKKyAgICAvLyBUdXJuIG9mZiBhbGwgTUlJIEludGVyZmFjZSBiaXRzCisgICAgbWlpX3JlZyAmPSB+KE1JSV9NRE9FfE1JSV9NQ0xLfE1JSV9NREl8TUlJX01ETyk7CisKKyAgICAvLyBDbG9jayBhbGwgY3ljbGVzCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihiaXRzKTsgKytpKQorICAgIHsKKyAgICAgICAgLy8gQ2xvY2sgTG93IC0gb3V0cHV0IGRhdGEKKyAgICAgICAgb3V0dyggbWlpX3JlZyB8IGJpdHNbaV0sIGlvYWRkcitNSUlfUkVHICk7CisgICAgICAgIHVkZWxheSg1MCk7CisKKworICAgICAgICAvLyBDbG9jayBIaSAtIGlucHV0IGRhdGEKKyAgICAgICAgb3V0dyggbWlpX3JlZyB8IGJpdHNbaV0gfCBNSUlfTUNMSywgaW9hZGRyK01JSV9SRUcgKTsKKyAgICAgICAgdWRlbGF5KDUwKTsKKyAgICAgICAgYml0c1tpXSB8PSBpbncoIGlvYWRkcitNSUlfUkVHICkgJiBNSUlfTURJOworICAgIH0KKworICAgIC8vIFJldHVybiB0byBpZGxlIHN0YXRlCisgICAgLy8gU2V0IGNsb2NrIHRvIGxvdywgZGF0YSB0byBsb3csIGFuZCBvdXRwdXQgdHJpc3RhdGVkCisgICAgb3V0dyggbWlpX3JlZywgaW9hZGRyK01JSV9SRUcgKTsKKyAgICB1ZGVsYXkoNTApOworCisgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBiYW5rIHNlbGVjdAorICAgIFNNQ19TRUxFQ1RfQkFOSyhpb2FkZHIsIG9sZEJhbmspOworCisjaWYgKFNNQ19ERUJVRyA+IDIgKQorICAgICAgICBwcmludGYoInNtY193cml0ZV9waHlfcmVnaXN0ZXIoKTogcGh5YWRkcj0leCxwaHlyZWc9JXgscGh5ZGF0YT0leFxuIiwKKyAgICAgICAgICAgICAgIHBoeWFkZHIsIHBoeXJlZywgcGh5ZGF0YSk7CisjZW5kaWYKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gRmluZHMgYW5kIHJlcG9ydHMgdGhlIFBIWSBhZGRyZXNzCisgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBzbWNfZGV0ZWN0X3BoeShpbnQgaW9hZGRyLCBieXRlICpwcGh5YWRkcikKK3sKKyAgICB3b3JkIHBoeV9pZDE7CisgICAgd29yZCBwaHlfaWQyOworICAgIGludCBwaHlhZGRyOworICAgIGludCBmb3VuZCA9IDA7CisKKyAgICAvLyBTY2FuIGFsbCAzMiBQSFkgYWRkcmVzc2VzIGlmIG5lY2Vzc2FyeQorICAgIGZvciAocGh5YWRkciA9IDA7IHBoeWFkZHIgPCAzMjsgKytwaHlhZGRyKQorICAgIHsKKyAgICAgICAgLy8gUmVhZCB0aGUgUEhZIGlkZW50aWZpZXJzCisgICAgICAgIHBoeV9pZDEgID0gc21jX3JlYWRfcGh5X3JlZ2lzdGVyKGlvYWRkciwgcGh5YWRkciwgUEhZX0lEMV9SRUcpOworICAgICAgICBwaHlfaWQyICA9IHNtY19yZWFkX3BoeV9yZWdpc3Rlcihpb2FkZHIsIHBoeWFkZHIsIFBIWV9JRDJfUkVHKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgaXQgaXMgYSB2YWxpZCBpZGVudGlmaWVyCisgICAgICAgIGlmICgocGh5X2lkMiA+IDB4MDAwMCkgJiYgKHBoeV9pZDIgPCAweGZmZmYpICYmCisgICAgICAgICAgICAgKHBoeV9pZDEgPiAweDAwMDApICYmIChwaHlfaWQxIDwgMHhmZmZmKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwaHlfaWQxICE9IDB4ODAwMCkgJiYgKHBoeV9pZDIgIT0gMHg4MDAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBQSFkncyBhZGRyZXNzCisgICAgICAgICAgICAgICAgKnBwaHlhZGRyID0gcGh5YWRkcjsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJObyBQSFkgZm91bmRcbiIpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBQSFkgdHlwZQorICAgIGlmICggKHBoeV9pZDEgPT0gMHgwMDE2KSAmJiAoKHBoeV9pZDIgJiAweEZGRjApID09IDB4Rjg0MCApICkKKyAgICB7CisgICAgICAgIHByaW50ZigiUEhZPUxBTjgzQzE4MyAoTEFOOTFDMTExIEludGVybmFsKVxuIik7CisgICAgfQorCisgICAgaWYgKCAocGh5X2lkMSA9PSAweDAyODIpICYmICgocGh5X2lkMiAmIDB4RkZGMCkgPT0gMHgxQzUwKSApCisgICAgeworICAgICAgICBwcmludGYoIlBIWT1MQU44M0MxODBcbiIpOworICAgIH0KKworICAgIHJldHVybigxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuIENvbmZpZ3VyZXMgdGhlIHNwZWNpZmllZCBQSFkgdXNpbmcgQXV0b25lZ290aWF0aW9uLiBDYWxscworIC4gc21jX3BoeV9maXhlZCgpIGlmIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBjZXJ0YWluIGNvbmZpZy4KKyAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBzbWNfcGh5X2NvbmZpZ3VyZShpbnQgaW9hZGRyKQoreworICAgIGludCB0aW1lb3V0OworICAgIGJ5dGUgcGh5YWRkcjsKKyAgICB3b3JkIG15X3BoeV9jYXBzOyAvLyBNeSBQSFkgY2FwYWJpbGl0aWVzCisgICAgd29yZCBteV9hZF9jYXBzOyAvLyBNeSBBZHZlcnRpc2VkIGNhcGFiaWxpdGllcworICAgIHdvcmQgc3RhdHVzOworICAgIGludCBmYWlsZWQgPSAwOworICAgIGludCBycGNfY3VyX21vZGUgPSBSUENfREVGQVVMVDsKKyAgICBpbnQgbGFzdFBoeTE4OworCisgICAgLy8gRmluZCB0aGUgYWRkcmVzcyBhbmQgdHlwZSBvZiBvdXIgcGh5CisgICAgaWYgKCFzbWNfZGV0ZWN0X3BoeShpb2FkZHIsICZwaHlhZGRyKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBSZXNldCB0aGUgUEhZLCBzZXR0aW5nIGFsbCBvdGhlciBiaXRzIHRvIHplcm8KKyAgICBzbWNfd3JpdGVfcGh5X3JlZ2lzdGVyKGlvYWRkciwgcGh5YWRkciwgUEhZX0NOVExfUkVHLCBQSFlfQ05UTF9SU1QpOworCisgICAgLy8gV2FpdCBmb3IgdGhlIHJlc2V0IHRvIGNvbXBsZXRlLCBvciB0aW1lIG91dAorICAgIHRpbWVvdXQgPSA2OyAvLyBXYWl0IHVwIHRvIDMgc2Vjb25kcworICAgIHdoaWxlICh0aW1lb3V0LS0pCisgICAgeworICAgICAgICBpZiAoIShzbWNfcmVhZF9waHlfcmVnaXN0ZXIoaW9hZGRyLCBwaHlhZGRyLCBQSFlfQ05UTF9SRUcpCisgICAgICAgICAgICAgICYgUEhZX0NOVExfUlNUKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcmVzZXQgY29tcGxldGUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWRlbGF5KDUwMCk7IC8vIHdhaXQgNTAwIG1pbGxpc2VjcworICAgIH0KKworICAgIGlmICh0aW1lb3V0IDwgMSkKKyAgICB7CisgICAgICAgIFBSSU5USzIoIlBIWSByZXNldCB0aW1lZCBvdXRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUmVhZCBQSFkgUmVnaXN0ZXIgMTgsIFN0YXR1cyBPdXRwdXQKKyAgICBsYXN0UGh5MTggPSBzbWNfcmVhZF9waHlfcmVnaXN0ZXIoaW9hZGRyLCBwaHlhZGRyLCBQSFlfSU5UX1JFRyk7CisKKyAgICAvLyBFbmFibGUgUEhZIEludGVycnVwdHMgKGZvciByZWdpc3RlciAxOCkKKyAgICAvLyBJbnRlcnJ1cHRzIGxpc3RlZCBoZXJlIGFyZSBkaXNhYmxlZAorICAgIHNtY193cml0ZV9waHlfcmVnaXN0ZXIoaW9hZGRyLCBwaHlhZGRyLCBQSFlfTUFTS19SRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQSFlfSU5UX0xPU1NTWU5DIHwgUEhZX0lOVF9DV1JEIHwgUEhZX0lOVF9TU0QgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSFlfSU5UX0VTRCB8IFBIWV9JTlRfUlBPTCB8IFBIWV9JTlRfSkFCIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX0lOVF9TUERERVQgfCBQSFlfSU5UX0RQTFhERVQpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBSZWNlaXZlL1BoeSBDb250cm9sIHJlZ2lzdGVyICovCisgICAgU01DX1NFTEVDVF9CQU5LKGlvYWRkciwgMCk7CisgICAgb3V0dyggcnBjX2N1cl9tb2RlLCBpb2FkZHIgKyBSUENfUkVHICk7CisKKyAgICAvLyBDb3B5IG91ciBjYXBhYmlsaXRpZXMgZnJvbSBQSFlfU1RBVF9SRUcgdG8gUEhZX0FEX1JFRworICAgIG15X3BoeV9jYXBzID0gc21jX3JlYWRfcGh5X3JlZ2lzdGVyKGlvYWRkciwgcGh5YWRkciwgUEhZX1NUQVRfUkVHKTsKKyAgICBteV9hZF9jYXBzICA9IFBIWV9BRF9DU01BOyAvLyBJIGFtIENTTUEgY2FwYWJsZQorCisgICAgaWYgKG15X3BoeV9jYXBzICYgUEhZX1NUQVRfQ0FQX1Q0KQorICAgICAgICBteV9hZF9jYXBzIHw9IFBIWV9BRF9UNDsKKworICAgIGlmIChteV9waHlfY2FwcyAmIFBIWV9TVEFUX0NBUF9UWEYpCisgICAgICAgIG15X2FkX2NhcHMgfD0gUEhZX0FEX1RYX0ZEWDsKKworICAgIGlmIChteV9waHlfY2FwcyAmIFBIWV9TVEFUX0NBUF9UWEgpCisgICAgICAgIG15X2FkX2NhcHMgfD0gUEhZX0FEX1RYX0hEWDsKKworICAgIGlmIChteV9waHlfY2FwcyAmIFBIWV9TVEFUX0NBUF9URikKKyAgICAgICAgbXlfYWRfY2FwcyB8PSBQSFlfQURfMTBfRkRYOworCisgICAgaWYgKG15X3BoeV9jYXBzICYgUEhZX1NUQVRfQ0FQX1RIKQorICAgICAgICBteV9hZF9jYXBzIHw9IFBIWV9BRF8xMF9IRFg7CisKKyAgICAvLyBVcGRhdGUgb3VyIEF1dG8tTmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKKyAgICBzbWNfd3JpdGVfcGh5X3JlZ2lzdGVyKGlvYWRkciwgcGh5YWRkciwgUEhZX0FEX1JFRywgbXlfYWRfY2Fwcyk7CisKKyAgICBQUklOVEsyKCJwaHkgY2Fwcz0leFxuIiwgbXlfcGh5X2NhcHMpOworICAgIFBSSU5USzIoInBoeSBhZHZlcnRpc2VkIGNhcHM9JXhcbiIsIG15X2FkX2NhcHMpOworCisgICAgLy8gUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uIHByb2Nlc3MgaW4gb3JkZXIgdG8gYWR2ZXJ0aXNlIG15IGNhcHMKKyAgICBzbWNfd3JpdGVfcGh5X3JlZ2lzdGVyKCBpb2FkZHIsIHBoeWFkZHIsIFBIWV9DTlRMX1JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSFlfQ05UTF9BTkVHX0VOIHwgUEhZX0NOVExfQU5FR19SU1QgKTsKKworICAgIC8vIFdhaXQgZm9yIHRoZSBhdXRvLW5lZ290aWF0aW9uIHRvIGNvbXBsZXRlLiAgVGhpcyBtYXkgdGFrZSBmcm9tCisgICAgLy8gMiB0byAzIHNlY29uZHMuCisgICAgLy8gV2FpdCBmb3IgdGhlIHJlc2V0IHRvIGNvbXBsZXRlLCBvciB0aW1lIG91dAorICAgIHRpbWVvdXQgPSAyMDsgLy8gV2FpdCB1cCB0byAxMCBzZWNvbmRzCisgICAgd2hpbGUgKHRpbWVvdXQtLSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHNtY19yZWFkX3BoeV9yZWdpc3Rlcihpb2FkZHIsIHBoeWFkZHIsIFBIWV9TVEFUX1JFRyk7CisgICAgICAgIGlmIChzdGF0dXMgJiBQSFlfU1RBVF9BTkVHX0FDSykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gYXV0by1uZWdvdGlhdGUgY29tcGxldGUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWRlbGF5KDUwMCk7IC8vIHdhaXQgNTAwIG1pbGxpc2VjcworCisgICAgICAgIC8vIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiBpZiByZW1vdGUgZmF1bHQKKyAgICAgICAgaWYgKHN0YXR1cyAmIFBIWV9TVEFUX1JFTV9GTFQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBSSU5USzIoIlBIWSByZW1vdGUgZmF1bHQgZGV0ZWN0ZWRcbiIpOworCisgICAgICAgICAgICAvLyBSZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24KKyAgICAgICAgICAgIFBSSU5USzIoIlBIWSByZXN0YXJ0aW5nIGF1dG8tbmVnb3RpYXRpb25cbiIpOworICAgICAgICAgICAgc21jX3dyaXRlX3BoeV9yZWdpc3RlciggaW9hZGRyLCBwaHlhZGRyLCBQSFlfQ05UTF9SRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSFlfQ05UTF9BTkVHX0VOIHwgUEhZX0NOVExfQU5FR19SU1QgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX0NOVExfU1BFRUQgfCBQSFlfQ05UTF9EUExYKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aW1lb3V0IDwgMSkKKyAgICB7CisgICAgICAgIFBSSU5USzIoIlBIWSBhdXRvLW5lZ290aWF0ZSB0aW1lZCBvdXRcbiIpOworICAgICAgICBmYWlsZWQgPSAxOworICAgIH0KKworICAgIC8vIEZhaWwgaWYgd2UgZGV0ZWN0ZWQgYW4gYXV0by1uZWdvdGlhdGUgcmVtb3RlIGZhdWx0CisgICAgaWYgKHN0YXR1cyAmIFBIWV9TVEFUX1JFTV9GTFQpCisgICAgeworICAgICAgICBQUklOVEsyKCJQSFkgcmVtb3RlIGZhdWx0IGRldGVjdGVkXG4iKTsKKyAgICAgICAgZmFpbGVkID0gMTsKKyAgICB9CisKKyAgICAvLyBTZXQgb3VyIHN5c2N0bCBwYXJhbWV0ZXJzIHRvIG1hdGNoIGF1dG8tbmVnb3RpYXRpb24gcmVzdWx0cworICAgIGlmICggbGFzdFBoeTE4ICYgUEhZX0lOVF9TUERERVQgKQorICAgIHsKKyAgICAgICAgUFJJTlRLMigiUEhZIDEwMEJhc2VUXG4iKTsKKyAgICAgICAgcnBjX2N1cl9tb2RlIHw9IFJQQ19TUEVFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUFJJTlRLMigiUEhZIDEwQmFzZVRcbiIpOworICAgICAgICBycGNfY3VyX21vZGUgJj0gflJQQ19TUEVFRDsKKyAgICB9CisKKyAgICBpZiAoIGxhc3RQaHkxOCAmIFBIWV9JTlRfRFBMWERFVCApCisgICAgeworICAgICAgICBQUklOVEsyKCJQSFkgRnVsbCBEdXBsZXhcbiIpOworICAgICAgICBycGNfY3VyX21vZGUgfD0gUlBDX0RQTFg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBSSU5USzIoIlBIWSBIYWxmIER1cGxleFxuIik7CisgICAgICAgIHJwY19jdXJfbW9kZSAmPSB+UlBDX0RQTFg7CisgICAgfQorCisgICAgLy8gUmUtQ29uZmlndXJlIHRoZSBSZWNlaXZlL1BoeSBDb250cm9sIHJlZ2lzdGVyCisgICAgb3V0dyggcnBjX2N1cl9tb2RlLCBpb2FkZHIgKyBSUENfUkVHICk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogc21jX3Jlc2V0KCBpbnQgaW9hZGRyICkKKyAqIFB1cnBvc2U6CisgKglUaGlzIHNldHMgdGhlIFNNQzkxeHggY2hpcCB0byBpdHMgbm9ybWFsIHN0YXRlLCBob3BlZnVsbHkgZnJvbSB3aGF0ZXZlcgorICoJbWVzcyB0aGF0IGFueSBvdGhlciBET1MgZHJpdmVyIGhhcyBwdXQgaXQgaW4uCisgKgorICogTWF5YmUgSSBzaG91bGQgcmVzZXQgbW9yZSByZWdpc3RlcnMgdG8gZGVmYXVsdHMgaW4gaGVyZT8gIFNPRlRSRVNFVCAgc2hvdWxkCisgKiBkbyB0aGF0IGZvciBtZS4KKyAqCisgKiBNZXRob2Q6CisgKgkxLiAgc2VuZCBhIFNPRlQgUkVTRVQKKyAqCTIuICB3YWl0IGZvciBpdCB0byBmaW5pc2gKKyAqCTMuICByZXNldCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdAorICogICAgICA0LiAgY2xlYXIgYWxsIGludGVycnVwdHMKKyAqCisqLworc3RhdGljIHZvaWQgc21jX3Jlc2V0KGludCBpb2FkZHIpCit7CisgICAvKiBUaGlzIHJlc2V0cyB0aGUgcmVnaXN0ZXJzIG1vc3RseSB0byBkZWZhdWx0cywgYnV0IGRvZXNuJ3QKKyAgICAqIGFmZmVjdCBFRVBST00uICBUaGF0IHNlZW1zIHVubmVjZXNzYXJ5ICovCisgICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAwKTsKKyAgIF9vdXR3KCBSQ1JfU09GVFJFU0VULCBpb2FkZHIgKyBSQ1IgKTsKKworICAgLyogdGhpcyBzaG91bGQgcGF1c2UgZW5vdWdoIGZvciB0aGUgY2hpcCB0byBiZSBoYXBweSAqLworICAgU01DX0RFTEFZKGlvYWRkcik7CisKKyAgIC8qIFNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgdG8KKyAgICAqIGRlZmF1bHQgdmFsdWVzICovCisgICBfb3V0dyhSQ1JfQ0xFQVIsIGlvYWRkciArIFJDUik7CisgICBfb3V0dyhUQ1JfQ0xFQVIsIGlvYWRkciArIFRDUik7CisKKyAgIC8qIFJlc2V0IHRoZSBNTVUgKi8KKyAgIFNNQ19TRUxFQ1RfQkFOSyhpb2FkZHIsIDIpOworICAgX291dHcoIE1DX1JFU0VULCBpb2FkZHIgKyBNTVVfQ01EICk7CisKKyAgIC8qIE5vdGU6ICBJdCBkb2Vzbid0IHNlZW0gdGhhdCB3YWl0aW5nIGZvciB0aGUgTU1VIGJ1c3kgaXMgbmVlZGVkIGhlcmUsCisgICAgKiBidXQgdGhpcyBpcyBhIHBsYWNlIHdoZXJlIGZ1dHVyZSBjaGlwc2V0cyBfQ09VTERfIGJyZWFrLiAgQmUgd2FyeQorICAgICogb2YgaXNzdWluZyBhbm90aGVyIE1NVSBjb21tYW5kIHJpZ2h0IGFmdGVyIHRoaXMgKi8KKyAgIF9vdXRiKDAsIGlvYWRkciArIElOVF9NQVNLKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBzbWM5MDAwX3Byb2JlX2FkZHIoIGludCBpb2FkZHIgKQorICoKKyAqIFB1cnBvc2U6CisgKglUZXN0cyB0byBzZWUgaWYgYSBnaXZlbiBpb2FkZHIgcG9pbnRzIHRvIGFuIFNNQzl4eHggY2hpcC4KKyAqCVJldHVybnMgYSAxIG9uIHN1Y2Nlc3MKKyAqCisgKiBBbGdvcml0aG06CisgKgkoMSkgc2VlIGlmIHRoZSBoaWdoIGJ5dGUgb2YgQkFOS19TRUxFQ1QgaXMgMHgzMworICoJKDIpIGNvbXBhcmUgdGhlIGlvYWRkciB3aXRoIHRoZSBiYXNlIHJlZ2lzdGVyJ3MgYWRkcmVzcworICoJKDMpIHNlZSBpZiBJIHJlY29nbml6ZSB0aGUgY2hpcCBJRCBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBzbWM5MDAwX3Byb2JlX2FkZHIoIGlzYV9wcm9iZV9hZGRyX3QgaW9hZGRyICkKK3sKKyAgIHdvcmQgYmFuazsKKyAgIHdvcmQJcmV2aXNpb25fcmVnaXN0ZXI7CisgICB3b3JkIGJhc2VfYWRkcmVzc19yZWdpc3RlcjsKKworICAgLyogRmlyc3QsIHNlZSBpZiB0aGUgaGlnaCBieXRlIGlzIDB4MzMgKi8KKyAgIGJhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworICAgaWYgKChiYW5rICYgMHhGRjAwKSAhPSAweDMzMDApIHsKKyAgICAgIHJldHVybiAwOworICAgfQorICAgLyogVGhlIGFib3ZlIE1JR0hUIGluZGljYXRlIGEgZGV2aWNlLCBidXQgSSBuZWVkIHRvIHdyaXRlIHRvIGZ1cnRoZXIKKyAgICAqCXRlc3QgdGhpcy4gICovCisgICBfb3V0dygweDAsIGlvYWRkciArIEJBTktfU0VMRUNUKTsKKyAgIGJhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworICAgaWYgKChiYW5rICYgMHhGRjAwKSAhPSAweDMzMDApIHsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICAvKiB3ZWxsLCB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb25jZSwgc28gaG9wZWZ1bGx5IGFub3RoZXIgdGltZSB3b24ndAorICAgICogIGh1cnQuICBUaGlzIHRpbWUsIEkgbmVlZCB0byBzd2l0Y2ggdGhlIGJhbmsgcmVnaXN0ZXIgdG8gYmFuayAxLAorICAgICogIHNvIEkgY2FuIGFjY2VzcyB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCisgICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAxKTsKKyAgIGJhc2VfYWRkcmVzc19yZWdpc3RlciA9IGludyhpb2FkZHIgKyBCQVNFKTsKKworICAgaWYgKGlvYWRkciAhPSAoYmFzZV9hZGRyZXNzX3JlZ2lzdGVyID4+IDMgJiAweDNFMCkpICB7CisgICAgICBEQkcoIlNNQzkwMDA6IElPQUREUiAlaFggZG9lc24ndCBtYXRjaCBjb25maWd1cmF0aW9uICglaFgpLiIKKwkgICJQcm9iYWJseSBub3QgYSBTTUMgY2hpcFxuIiwKKwkgIGlvYWRkciwgYmFzZV9hZGRyZXNzX3JlZ2lzdGVyID4+IDMgJiAweDNFMCk7CisgICAgICAvKiB3ZWxsLCB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGRpZG4ndCBtYXRjaC4gIE11c3Qgbm90IGhhdmUKKyAgICAgICAqIGJlZW4gYSBTTUMgY2hpcCBhZnRlciBhbGwuICovCisgICAgICByZXR1cm4gMDsKKyAgIH0KKworCisgICAvKiBjaGVjayBpZiB0aGUgcmV2aXNpb24gcmVnaXN0ZXIgaXMgc29tZXRoaW5nIHRoYXQgSSByZWNvZ25pemUuCisgICAgKiBUaGVzZSBtaWdodCBuZWVkIHRvIGJlIGFkZGVkIHRvIGxhdGVyLCBhcyBmdXR1cmUgcmV2aXNpb25zCisgICAgKiBjb3VsZCBiZSBhZGRlZC4gICovCisgICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAzKTsKKyAgIHJldmlzaW9uX3JlZ2lzdGVyICA9IGludyhpb2FkZHIgKyBSRVZJU0lPTik7CisgICBpZiAoIWNoaXBfaWRzWyhyZXZpc2lvbl9yZWdpc3RlciA+PiA0KSAmIDB4Rl0pIHsKKyAgICAgIC8qIEkgZG9uJ3QgcmVjb2duaXplIHRoaXMgY2hpcCwgc28uLi4gKi8KKyAgICAgIERCRyggIlNNQzkwMDA6IElPICVoWDogVW5yZWNvZ25pemVkIHJldmlzaW9uIHJlZ2lzdGVyOiIKKwkgICAiICVoWCwgQ29udGFjdCBhdXRob3IuXG4iLCBpb2FkZHIsIHJldmlzaW9uX3JlZ2lzdGVyICk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgLyogYXQgdGhpcyBwb2ludCBJJ2xsIGFzc3VtZSB0aGF0IHRoZSBjaGlwIGlzIGFuIFNNQzl4eHguCisgICAgKiBJdCBtaWdodCBiZSBwcnVkZW50IHRvIGNoZWNrIGEgbGlzdGluZyBvZiBNQUMgYWRkcmVzc2VzCisgICAgKiBhZ2FpbnN0IHRoZSBoYXJkd2FyZSBhZGRyZXNzLCBvciBkbyBzb21lIG90aGVyIHRlc3RzLiAqLworICAgcmV0dXJuIDE7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFVEhfVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc21jOTAwMF90cmFuc21pdCgKKwlzdHJ1Y3QgbmljICpuaWMsCisJY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLworCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCisJY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KK3sKKyAgIHdvcmQgbGVuZ3RoOyAvKiByZWFsLCBsZW5ndGggaW5jbC4gaGVhZGVyICovCisgICB3b3JkIG51bVBhZ2VzOworICAgdW5zaWduZWQgbG9uZyB0aW1lX291dDsKKyAgIGJ5dGUJcGFja2V0X25vOworICAgd29yZCBzdGF0dXM7CisgICBpbnQgaTsKKworICAgLyogV2UgZG9udCBwYWQgaGVyZSBzaW5jZSB3ZSBjYW4gaGF2ZSB0aGUgaGFyZHdhcmUgZG9pbmcgaXQgZm9yIHVzICovCisgICBsZW5ndGggPSAocyArIEVUSF9ITEVOICsgMSkmfjE7CisKKyAgIC8qIGNvbnZlcnQgdG8gTU1VIHBhZ2VzICovCisgICBudW1QYWdlcyA9IGxlbmd0aCAvIDI1NjsKKworICAgaWYgKG51bVBhZ2VzID4gNyApIHsKKyAgICAgIERCRygiU01DOTAwMDogRmFyIHRvbyBiaWcgcGFja2V0IGVycm9yLiBcbiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBkb250IHRyeSBtb3JlIHRoYW4sIHNheSAzMCB0aW1lcyAqLworICAgZm9yIChpPTA7aTwzMDtpKyspIHsKKyAgICAgIC8qIG5vdywgdHJ5IHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgKi8KKyAgICAgIFNNQ19TRUxFQ1RfQkFOSyhuaWMtPmlvYWRkciwgMik7CisgICAgICBfb3V0dyhNQ19BTExPQyB8IG51bVBhZ2VzLCBuaWMtPmlvYWRkciArIE1NVV9DTUQpOworCisgICAgICBzdGF0dXMgPSAwOworICAgICAgLyogd2FpdCBmb3IgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHRvIGZpbm5pc2ggKi8KKyAgICAgIGZvciAodGltZV9vdXQgPSBjdXJydGlja3MoKSArIDUqVElDS1NfUEVSX1NFQzsgY3VycnRpY2tzKCkgPCB0aW1lX291dDsgKSB7CisJIHN0YXR1cyA9IGluYihuaWMtPmlvYWRkciArIElOVEVSUlVQVCk7CisJIGlmICggc3RhdHVzICYgSU1fQUxMT0NfSU5UICkgeworCSAgICAvKiBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0ICovCisJICAgIF9vdXRiKElNX0FMTE9DX0lOVCwgbmljLT5pb2FkZHIgKyBJTlRFUlJVUFQpOworCSAgICBicmVhazsKKwkgfQorICAgICAgfQorCisgICAgICBpZiAoKHN0YXR1cyAmIElNX0FMTE9DX0lOVCkgIT0gMCApIHsKKwkgLyogV2UndmUgZ290IHRoZSBtZW1vcnkgKi8KKwkgYnJlYWs7CisgICAgICB9IGVsc2UgeworCSBwcmludGYoIlNNQzkwMDA6IE1lbW9yeSBhbGxvY2F0aW9uIHRpbWVkIG91dCwgcmVzZXR0aW5nIE1NVS5cbiIpOworCSBfb3V0dyhNQ19SRVNFVCwgbmljLT5pb2FkZHIgKyBNTVVfQ01EKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogSWYgSSBnZXQgaGVyZSwgSSBfa25vd18gdGhlcmUgaXMgYSBwYWNrZXQgc2xvdCB3YWl0aW5nIGZvciBtZSAqLworICAgcGFja2V0X25vID0gaW5iKG5pYy0+aW9hZGRyICsgUE5SX0FSUiArIDEpOworICAgaWYgKHBhY2tldF9ubyAmIDB4ODApIHsKKyAgICAgIC8qIG9yIGlzbid0IHRoZXJlPyAgQkFEIENISVAhICovCisgICAgICBwcmludGYoIlNNQzkwMDA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gXG4iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogd2UgaGF2ZSBhIHBhY2tldCBhZGRyZXNzLCBzbyB0ZWxsIHRoZSBjYXJkIHRvIHVzZSBpdCAqLworICAgX291dGIocGFja2V0X25vLCBuaWMtPmlvYWRkciArIFBOUl9BUlIpOworCisgICAvKiBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KKyAgIF9vdXR3KFBUUl9BVVRPSU5DLCBuaWMtPmlvYWRkciArIFBPSU5URVIpOworCisjaWYJU01DOTAwMF9ERUJVRyA+IDIKKyAgIHByaW50ZigiVHJ5aW5nIHRvIHhtaXQgcGFja2V0IG9mIGxlbmd0aCAlaFhcbiIsIGxlbmd0aCApOworI2VuZGlmCisKKyAgIC8qIHNlbmQgdGhlIHBhY2tldCBsZW5ndGggKCArNiBmb3Igc3RhdHVzLCBsZW5ndGggYW5kIGN0bCBieXRlICkKKyAgICAqIGFuZCB0aGUgc3RhdHVzIHdvcmQgKCBzZXQgdG8gemVyb3MgKSAqLworICAgX291dHcoMCwgbmljLT5pb2FkZHIgKyBEQVRBXzEgKTsKKworICAgLyogc2VuZCB0aGUgcGFja2V0IGxlbmd0aCAoICs2IGZvciBzdGF0dXMgd29yZHMsIGxlbmd0aCwgYW5kIGN0bCkgKi8KKyAgIF9vdXRiKChsZW5ndGgrNikgJiAweEZGLCAgbmljLT5pb2FkZHIgKyBEQVRBXzEpOworICAgX291dGIoKGxlbmd0aCs2KSA+PiA4ICwgICBuaWMtPmlvYWRkciArIERBVEFfMSk7CisKKyAgIC8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2V0ICovCisKKyAgIC8qIFRoZSBldGhlcm5ldCBoZWFkZXIgZmlyc3QuLi4gKi8KKyAgIG91dHN3KG5pYy0+aW9hZGRyICsgREFUQV8xLCBkLCBFVEhfQUxFTiA+PiAxKTsKKyAgIG91dHN3KG5pYy0+aW9hZGRyICsgREFUQV8xLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4gPj4gMSk7CisgICBfb3V0dyhodG9ucyh0KSwgbmljLT5pb2FkZHIgKyBEQVRBXzEpOworCisgICAvKiAuLi4gdGhlIGRhdGEgLi4uICovCisgICBvdXRzdyhuaWMtPmlvYWRkciArIERBVEFfMSAsIHAsIHMgPj4gMSk7CisKKyAgIC8qIC4uLiBhbmQgdGhlIGxhc3QgYnl0ZSwgaWYgdGhlcmUgaXMgb25lLiAgICovCisgICBpZiAoKHMgJiAxKSA9PSAwKSB7CisgICAgICBfb3V0dygwLCBuaWMtPmlvYWRkciArIERBVEFfMSk7CisgICB9IGVsc2UgeworICAgICAgX291dGIocFtzLTFdLCBuaWMtPmlvYWRkciArIERBVEFfMSk7CisgICAgICBfb3V0YigweDIwLCBuaWMtPmlvYWRkciArIERBVEFfMSk7CisgICB9CisKKyAgIC8qIGFuZCBsZXQgdGhlIGNoaXBzZXQgZGVhbCB3aXRoIGl0ICovCisgICBfb3V0dyhNQ19FTlFVRVVFICwgbmljLT5pb2FkZHIgKyBNTVVfQ01EKTsKKworICAgc3RhdHVzID0gMDsgdGltZV9vdXQgPSBjdXJydGlja3MoKSArIDUqVElDS1NfUEVSX1NFQzsKKyAgIGRvIHsKKyAgICAgIHN0YXR1cyA9IGluYihuaWMtPmlvYWRkciArIElOVEVSUlVQVCk7CisKKyAgICAgIGlmICgoc3RhdHVzICYgSU1fVFhfSU5UICkgIT0gMCkgeworCSB3b3JkIHR4X3N0YXR1czsKKworCSAvKiBhY2sgaW50ZXJydXB0ICovCisJIF9vdXRiKElNX1RYX0lOVCwgbmljLT5pb2FkZHIgKyBJTlRFUlJVUFQpOworCisJIHBhY2tldF9ubyA9IGludyhuaWMtPmlvYWRkciArIEZJRk9fUE9SVFMpOworCSBwYWNrZXRfbm8gJj0gMHg3RjsKKworCSAvKiBzZWxlY3QgdGhpcyBhcyB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbSAqLworCSBfb3V0YiggcGFja2V0X25vLCBuaWMtPmlvYWRkciArIFBOUl9BUlIgKTsKKworCSAvKiByZWFkIHRoZSBmaXJzdCB3b3JkIGZyb20gdGhpcyBwYWNrZXQgKi8KKwkgX291dHcoIFBUUl9BVVRPSU5DIHwgUFRSX1JFQUQsIG5pYy0+aW9hZGRyICsgUE9JTlRFUiApOworCisJIHR4X3N0YXR1cyA9IGludyggbmljLT5pb2FkZHIgKyBEQVRBXzEgKTsKKworCSBpZiAoMCA9PSAodHhfc3RhdHVzICYgVFNfU1VDQ0VTUykpIHsKKwkgICAgREJHKCJTTUM5MDAwOiBUWCBGQUlMIFNUQVRVUzogJWhYIFxuIiwgdHhfc3RhdHVzKTsKKwkgICAgLyogcmUtZW5hYmxlIHRyYW5zbWl0ICovCisJICAgIFNNQ19TRUxFQ1RfQkFOSyhuaWMtPmlvYWRkciwgMCk7CisJICAgIF9vdXR3KGludyhuaWMtPmlvYWRkciArIFRDUiApIHwgVENSX0VOQUJMRSwgbmljLT5pb2FkZHIgKyBUQ1IgKTsKKwkgfQorCisJIC8qIGtpbGwgdGhlIHBhY2tldCAqLworCSBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDIpOworCSBfb3V0dyhNQ19GUkVFUEtULCBuaWMtPmlvYWRkciArIE1NVV9DTUQpOworCisJIHJldHVybjsKKyAgICAgIH0KKyAgIH13aGlsZShjdXJydGlja3MoKSA8IHRpbWVfb3V0KTsKKworICAgcHJpbnRmKCJTTUM5MDAwOiBUWCB0aW1lZCBvdXQsIHJlc2V0dGluZyBib2FyZFxuIik7CisgICBzbWNfcmVzZXQobmljLT5pb2FkZHIpOworICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVUSF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgc21jOTAwMF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworICAgU01DX1NFTEVDVF9CQU5LKG5pYy0+aW9hZGRyLCAyKTsKKyAgIGlmIChpbncobmljLT5pb2FkZHIgKyBGSUZPX1BPUlRTKSAmIEZQX1JYRU1QVFkpCisgICAgIHJldHVybiAwOworICAgCisgICBpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKworICAgLyogIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldCAqLworICAgX291dHcoUFRSX1JFQUQgfCBQVFJfUkNWIHwgUFRSX0FVVE9JTkMsIG5pYy0+aW9hZGRyICsgUE9JTlRFUik7CisKKyAgIC8qIEZpcnN0IHJlYWQgdGhlIHN0YXR1cyBhbmQgY2hlY2sgdGhhdCB3ZSdyZSBvayAqLworICAgaWYgKCEoaW53KG5pYy0+aW9hZGRyICsgREFUQV8xKSAmIFJTX0VSUk9SUykpIHsKKyAgICAgIC8qIE5leHQ6IHJlYWQgdGhlIHBhY2tldCBsZW5ndGggYW5kIG1hc2sgb2ZmIHRoZSB0b3AgYml0cyAqLworICAgICAgbmljLT5wYWNrZXRsZW4gPSAoaW53KG5pYy0+aW9hZGRyICsgREFUQV8xKSAmIDB4MDdmZik7CisKKyAgICAgIC8qIHRoZSBwYWNrZXQgbGVuZ3RoIGluY2x1ZGVzIHRoZSAzIGV4dHJhIHdvcmRzICovCisgICAgICBuaWMtPnBhY2tldGxlbiAtPSA2OworI2lmCVNNQzkwMDBfREVCVUcgPiAyCisgICAgICBwcmludGYoIiBSZWFkaW5nICVkIHdvcmRzIChhbmQgJWQgYnl0ZShzKSlcbiIsCisJICAgICAgIChuaWMtPnBhY2tldGxlbiA+PiAxKSwgbmljLT5wYWNrZXRsZW4gJiAxKTsKKyNlbmRpZgorICAgICAgLyogcmVhZCB0aGUgcGFja2V0IChhbmQgdGhlIGxhc3QgImV4dHJhIiB3b3JkKSAqLworICAgICAgaW5zdyhuaWMtPmlvYWRkciArIERBVEFfMSwgbmljLT5wYWNrZXQsIChuaWMtPnBhY2tldGxlbisyKSA+PiAxKTsKKyAgICAgIC8qIGlzIHRoZXJlIGFuIG9kZCBsYXN0IGJ5dGUgPyAqLworICAgICAgaWYgKG5pYy0+cGFja2V0W25pYy0+cGFja2V0bGVuKzFdICYgMHgyMCkKKwkgbmljLT5wYWNrZXRsZW4rKzsKKworICAgICAgLyogIGVycm9yIG9yIGdvb2QsIHRlbGwgdGhlIGNhcmQgdG8gZ2V0IHJpZCBvZiB0aGlzIHBhY2tldCAqLworICAgICAgX291dHcoTUNfUkVMRUFTRSwgbmljLT5pb2FkZHIgKyBNTVVfQ01EKTsKKyAgICAgIHJldHVybiAxOworICAgfQorCisgICBwcmludGYoIlNNQzkwMDA6IFJYIGVycm9yXG4iKTsKKyAgIC8qICBlcnJvciBvciBnb29kLCB0ZWxsIHRoZSBjYXJkIHRvIGdldCByaWQgb2YgdGhpcyBwYWNrZXQgKi8KKyAgIF9vdXR3KE1DX1JFTEVBU0UsIG5pYy0+aW9hZGRyICsgTU1VX0NNRCk7CisgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc21jOTAwMF9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgaXNhX2RldmljZSAqaXNhIF9fdW51c2VkICkgeworCisgICBzbWNfcmVzZXQobmljLT5pb2FkZHIpOworCisgICAvKiBubyBtb3JlIGludGVycnVwdHMgZm9yIG1lICovCisgICBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDIpOworICAgX291dGIoIDAsIG5pYy0+aW9hZGRyICsgSU5UX01BU0spOworCisgICAvKiBhbmQgdGVsbCB0aGUgY2FyZCB0byBzdGF5IGF3YXkgZnJvbSB0aGF0IG5hc3R5IG91dHNpZGUgd29ybGQgKi8KKyAgIFNNQ19TRUxFQ1RfQkFOSyhuaWMtPmlvYWRkciwgMCk7CisgICBfb3V0YiggUkNSX0NMRUFSLCBuaWMtPmlvYWRkciArIFJDUiApOworICAgX291dGIoIFRDUl9DTEVBUiwgbmljLT5pb2FkZHIgKyBUQ1IgKTsKK30KKworc3RhdGljIHZvaWQgc21jOTAwMF9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyBzbWM5MDAwX29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QJPSBkdW1teV9jb25uZWN0LAorCS5wb2xsCQk9IHNtYzkwMDBfcG9sbCwKKwkudHJhbnNtaXQJPSBzbWM5MDAwX3RyYW5zbWl0LAorCS5pcnEJCT0gc21jOTAwMF9pcnEsCisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRVRIX1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzbWM5MDAwX3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgaXNhX2RldmljZSAqaXNhICkgeworCisgICB1bnNpZ25lZCBzaG9ydCAgIHJldmlzaW9uOworICAgaW50CSAgICAgICAgICAgIG1lbW9yeTsKKyAgIGludCAgICAgICAgICAgICAgbWVkaWE7CisgICBjb25zdCBjaGFyICoJICAgIHZlcnNpb25fc3RyaW5nOworICAgY29uc3QgY2hhciAqCSAgICBpZl9zdHJpbmc7CisgICBpbnQgICAgICAgICAgICAgIGk7CisKKyAgIG5pYy0+aXJxbm8gID0gMDsKKyAgIG5pYy0+aW9hZGRyID0gaXNhLT5pb2FkZHI7CisKKyAgIC8qCisgICAgKiBHZXQgdGhlIE1BQyBhZGRyZXNzICggYmFuayAxLCByZWdzIDQgLSA5ICkKKyAgICAqLworICAgU01DX1NFTEVDVF9CQU5LKG5pYy0+aW9hZGRyLCAxKTsKKyAgIGZvciAoIGkgPSAwOyBpIDwgNjsgaSArPSAyICkgeworICAgICAgd29yZCBhZGRyZXNzOworCisgICAgICBhZGRyZXNzID0gaW53KG5pYy0+aW9hZGRyICsgQUREUjAgKyBpKTsKKyAgICAgIG5pYy0+bm9kZV9hZGRyW2krMV0gPSBhZGRyZXNzID4+IDg7CisgICAgICBuaWMtPm5vZGVfYWRkcltpXSA9IGFkZHJlc3MgJiAweEZGOworICAgfQorCisgICAvKiBnZXQgdGhlIG1lbW9yeSBpbmZvcm1hdGlvbiAqLworICAgU01DX1NFTEVDVF9CQU5LKG5pYy0+aW9hZGRyLCAwKTsKKyAgIG1lbW9yeSA9ICggaW53KG5pYy0+aW9hZGRyICsgTUNSKSA+PiA5ICkgICYgMHg3OyAgLyogbXVsdGlwbGllciAqLworICAgbWVtb3J5ICo9IDI1NiAqIChpbncobmljLT5pb2FkZHIgKyBNSVIpICYgMHhGRik7CisKKyAgIC8qCisgICAgKiBOb3csIEkgd2FudCB0byBmaW5kIG91dCBtb3JlIGFib3V0IHRoZSBjaGlwLiAgVGhpcyBpcyBzb3J0IG9mCisgICAgKiByZWR1bmRhbnQsIGJ1dCBpdCdzIGNsZWFuZXIgdG8gaGF2ZSBpdCBpbiBib3RoLCByYXRoZXIgdGhhbiBoYXZpbmcKKyAgICAqIG9uZSBWRVJZIGxvbmcgcHJvYmUgcHJvY2VkdXJlLgorICAgICovCisgICBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDMpOworICAgcmV2aXNpb24gID0gaW53KG5pYy0+aW9hZGRyICsgUkVWSVNJT04pOworICAgdmVyc2lvbl9zdHJpbmcgPSBjaGlwX2lkc1socmV2aXNpb24gPj4gNCkgJiAweEZdOworCisgICBpZiAoKChyZXZpc2lvbiAmIDB4RjApID4+IDQgPT0gQ0hJUF85MTk2KSAmJgorICAgICAgICgocmV2aXNpb24gJiAweDBGKSA+PSBSRVZfOTE5NikpIHsKKyAgICAgIC8qIFRoaXMgaXMgYSA5MWM5Ni4gJ2M5NiBoYXMgdGhlIHNhbWUgY2hpcCBpZCBhcyAnYzk0ICg0KSBidXQKKyAgICAgICAqIGEgcmV2aXNpb24gc3RhcnRpbmcgYXQgNiAqLworICAgICAgdmVyc2lvbl9zdHJpbmcgPSBzbWM5MWM5Nl9pZDsKKyAgIH0KKworICAgaWYgKCAhdmVyc2lvbl9zdHJpbmcgKSB7CisgICAgICAvKiBJIHNob3VsZG4ndCBnZXQgaGVyZSBiZWNhdXNlIHRoaXMgY2FsbCB3YXMgZG9uZSBiZWZvcmUuLi4uICovCisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgLyogaXMgaXQgdXNpbmcgQVVJIG9yIDEwQmFzZVQgPyAqLworICAgU01DX1NFTEVDVF9CQU5LKG5pYy0+aW9hZGRyLCAxKTsKKyAgIGlmIChpbncobmljLT5pb2FkZHIgKyBDT05GSUcpICYgQ0ZHX0FVSV9TRUxFQ1QpCisgICAgIG1lZGlhID0gMjsKKyAgIGVsc2UKKyAgICAgbWVkaWEgPSAxOworCisgICBpZl9zdHJpbmcgPSBpbnRlcmZhY2VzW21lZGlhIC0gMV07CisKKyAgIC8qIG5vdywgcmVzZXQgdGhlIGNoaXAsIGFuZCBwdXQgaXQgaW50byBhIGtub3duIHN0YXRlICovCisgICBzbWNfcmVzZXQobmljLT5pb2FkZHIpOworCisgICBwcmludGYoIlNNQzkwMDAgJXNcbiIsIHNtYzkwMDBfdmVyc2lvbik7CisgICBEQkcoIkNvcHlyaWdodCAoQykgMTk5OCBEYW5pZWwgRW5nc3RyXHg5NG1cbiIpOworICAgREJHKCJDb3B5cmlnaHQgKEMpIDE5OTYgRXJpYyBTdGFobG1hblxuIik7CisKKyAgIHByaW50ZigiJXMgcmV2OiVkIEkvTyBwb3J0OiVoWCBJbnRlcmZhY2U6JXMgUkFNOiVkIGJ5dGVzIFxuIiwKKwkgIHZlcnNpb25fc3RyaW5nLCByZXZpc2lvbiAmIDB4RiwKKwkgIG5pYy0+aW9hZGRyLCBpZl9zdHJpbmcsIG1lbW9yeSApOworCisgICBEQkcgKCAiRXRoZXJuZXQgTUFDIGFkZHJlc3M6ICVzXG4iLCBldGhfbnRvYSAoIG5pYy0+bm9kZV9hZGRyICkgKTsKKworICAgU01DX1NFTEVDVF9CQU5LKG5pYy0+aW9hZGRyLCAwKTsKKworICAgLyogc2VlIHRoZSBoZWFkZXIgZmlsZSBmb3Igb3B0aW9ucyBpbiBUQ1IvUkNSIE5PUk1BTCovCisgICBfb3V0dyhUQ1JfTk9STUFMLCBuaWMtPmlvYWRkciArIFRDUik7CisgICBfb3V0dyhSQ1JfTk9STUFMLCBuaWMtPmlvYWRkciArIFJDUik7CisKKyAgIC8qIFNlbGVjdCB3aGljaCBpbnRlcmZhY2UgdG8gdXNlICovCisgICBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDEpOworICAgaWYgKCBtZWRpYSA9PSAxICkgeworICAgICAgX291dHcoIGludyggbmljLT5pb2FkZHIgKyBDT05GSUcgKSAmIH5DRkdfQVVJX1NFTEVDVCwKKwkgICBuaWMtPmlvYWRkciArIENPTkZJRyApOworICAgfQorICAgZWxzZSBpZiAoIG1lZGlhID09IDIgKSB7CisgICAgICBfb3V0dyggaW53KCBuaWMtPmlvYWRkciArIENPTkZJRyApIHwgQ0ZHX0FVSV9TRUxFQ1QsCisJICAgbmljLT5pb2FkZHIgKyBDT05GSUcgKTsKKyAgIH0KKworICAgc21jX3BoeV9jb25maWd1cmUobmljLT5pb2FkZHIpOworIAorICAgbmljLT5uaWNfb3AJPSAmc21jOTAwMF9vcGVyYXRpb25zOworICAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgU01DOTAwMCBjYW4gYmUgYXQgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9ydCBhZGRyZXNzZXMuICBUbworICogY2hhbmdlIGZvciBhIHNsaWdodGx5IGRpZmZlcmVudCBjYXJkLCB5b3UgY2FuIGFkZCBpdCB0byB0aGUgYXJyYXkuCisgKgorICovCitzdGF0aWMgaXNhX3Byb2JlX2FkZHJfdCBzbWM5MDAwX3Byb2JlX2FkZHJzW10gPSB7CisgICAweDIwMCwgMHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODAsIDB4MkEwLCAweDJDMCwgMHgyRTAsCisgICAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgzODAsIDB4M0EwLCAweDNDMCwgMHgzRTAsCit9OworCitJU0FfRFJJVkVSICggc21jOTAwMF9kcml2ZXIsIHNtYzkwMDBfcHJvYmVfYWRkcnMsIHNtYzkwMDBfcHJvYmVfYWRkciwKKwkJICAgICBHRU5FUklDX0lTQVBOUF9WRU5ET1IsIDB4ODIyOCApOworCitEUklWRVIgKCAiU01DOTAwMCIsIG5pY19kcml2ZXIsIGlzYV9kcml2ZXIsIHNtYzkwMDBfZHJpdmVyLAorCSBzbWM5MDAwX3Byb2JlLCBzbWM5MDAwX2Rpc2FibGUgKTsKKworSVNBX1JPTSAoICJzbWM5MDAwIiwgIlNNQzkwMDAiICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC9zbWM5MDAwLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC9zbWM5MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiMGUxOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3NtYzkwMDAuaApAQCAtMCwwICsxLDQyOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNtYzkwMDAuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBieSBEYW5pZWwgRW5nc3Ry9m0KKyAqIENvcHlyaWdodCAoQykgMTk5NiBieSBFcmlrIFN0YWhsbWFuCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGFuZCBhY2Nlc3MgbWFjcm9zIGZvcgorICogdGhlIFNNQzkxeHh4IGNoaXBzZXQuCisgKgorICogSW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoaXMgZmlsZSB3YXMgb2J0YWluZWQgZnJvbSB0aGUgU01DOTFDOTQKKyAqIG1hbnVhbCBmcm9tIFNNQy4gIFRvIGdldCBhIGNvcHksIGlmIHlvdSByZWFsbHkgd2FudCBvbmUsIHlvdSBjYW4gZmluZAorICogaW5mb3JtYXRpb24gdW5kZXIgd3d3LnNtc2MuY29tIGluIHRoZSBjb21wb25lbnRzIGRpdmlzaW9uLgorICogKCB0aGlzIHRoYW5rcyB0byBhZHZpY2UgZnJvbSBEb25hbGQgQmVja2VyICkuCisgKgorICogQXV0aG9ycworICogICAgICBEYW5pZWwgRW5nc3Ry9m0gICAgICAgICAgICAgICAgICAgICAgICAgPGRhbmllbC5lbmdzdHJvbUByaWtzbmV0dC5ubz4KKyAqCUVyaWsgU3RhaGxtYW4JCQkJPGVyaWtAdnQuZWR1PgorICoKKyAqIEhpc3RvcnkKKyAqIDk2LTAxLTA2CQkgRXJpayBTdGFobG1hbiAgIG1vdmVkIGRlZmluaXRpb25zIGhlcmUgZnJvbSBtYWluIC5jCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUKKyAqIDk2LTAxLTE5CQkgRXJpayBTdGFobG1hbgkgcG9saXNoZWQgdGhpcyB1cCBzb21lLCBhbmQgYWRkZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0dGVyIGVycm9yIGhhbmRsaW5nCisgKiA5OC0wOS0yNSAgICAgICAgICAgICAgRGFuaWVsIEVuZ3N0cvZtIGFkanVzdGVkIGZvciBFdGhlcmJvb3QKKyAqIDk4LTA5LTI3ICAgICAgICAgICAgICBEYW5pZWwgRW5nc3Ry9m0gbW92ZWQgc29tZSBzdGF0aWMgc3RyaW5ncyBiYWNrIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluIC5jIGZpbGUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRklMRV9MSUNFTkNFICggR1BMX0FOWSApOworCisjaWZuZGVmCV9TTUM5MDAwX0hfCisjIGRlZmluZSBfU01DOTAwMF9IXworCisvKiBJIHdhbnQgc29tZSBzaW1wbGUgdHlwZXMgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJCWJ5dGU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQkJd29yZDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJCWR3b3JkOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIFNNQyByZWdpc3RlcnMgaXMgcHJvYmFibHkgaW4gb3JkZXIgaGVyZSwKKyAqIGFsdGhvdWdoIGZvciBkZXRhaWxzLCB0aGUgU01DIGRhdGFzaGVldCBpcyBpbnZhbHVhYmxlLgorICoKKyAqIEJhc2ljYWxseSwgdGhlIGNoaXAgaGFzIDQgYmFua3Mgb2YgcmVnaXN0ZXJzICggMCB0byAzICksIHdoaWNoCisgKiBhcmUgYWNjZXNzZWQgYnkgd3JpdGluZyBhIG51bWJlciBpbnRvIHRoZSBCQU5LX1NFTEVDVCByZWdpc3RlcgorICogKCBJIGFsc28gdXNlIGEgU01DX1NFTEVDVF9CQU5LIG1hY3JvIGZvciB0aGlzICkuCisgKgorICogVGhlIGJhbmtzIGFyZSBjb25maWd1cmVkIHNvIHRoYXQgZm9yIG1vc3QgcHVycG9zZXMsIGJhbmsgMiBpcyBhbGwKKyAqIHRoYXQgaXMgbmVlZGVkIGZvciBzaW1wbGUgcnVuIHRpbWUgdGFza3MuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEJhbmsgU2VsZWN0IFJlZ2lzdGVyOgorICoKKyAqCQl5eXl5IHl5eXkgMDAwMCAwMHh4CisgKgkJeHgJCT0gYmFuayBudW1iZXIKKyAqCQl5eXl5IHl5eXkJPSAweDMzLCBmb3IgaWRlbnRpZmljYXRpb24gcHVycG9zZXMuCisgKi8KKyNkZWZpbmUJQkFOS19TRUxFQ1QJCTE0CisKKy8qIEJBTksgMCAgKi8KKworI2RlZmluZQlUQ1IJCTAJLyogdHJhbnNtaXQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBUQ1JfRU5BQkxFCTB4MDAwMQkvKiBpZiB0aGlzIGlzIDEsIHdlIGNhbiB0cmFuc21pdCAqLworI2RlZmluZSBUQ1JfRkRVUExYCTB4MDgwMAkvKiByZWNlaXZlIHBhY2tldHMgc2VudCBvdXQgKi8KKyNkZWZpbmUgVENSX1NUUF9TUUVUCTB4MTAwMAkvKiBzdG9wIHRyYW5zbWl0dGluZyBpZiBTaWduYWwgcXVhbGl0eSBlcnJvciAqLworI2RlZmluZQlUQ1JfTU9OX0NOUwkweDA0MDAJLyogbW9uaXRvcnMgdGhlIGNhcnJpZXIgc3RhdHVzICovCisjZGVmaW5lCVRDUl9QQURfRU5BQkxFCTB4MDA4MAkvKiBwYWRzIHNob3J0IHBhY2tldHMgdG8gNjQgYnl0ZXMgKi8KKworI2RlZmluZQlUQ1JfQ0xFQVIJMAkvKiBkbyBOT1RISU5HICovCisvKiB0aGUgbm9ybWFsIHNldHRpbmdzIGZvciB0aGUgVENSIHJlZ2lzdGVyIDogKi8KKyNkZWZpbmUJVENSX05PUk1BTAkoVENSX0VOQUJMRSB8IFRDUl9QQURfRU5BQkxFKQorCisKKyNkZWZpbmUgRVBIX1NUQVRVUwkyCisjZGVmaW5lIEVTX0xJTktfT0sJMHg0MDAwCS8qIGlzIHRoZSBsaW5rIGludGVncml0eSBvayA/ICovCisKKyNkZWZpbmUJUkNSCQk0CisjZGVmaW5lIFJDUl9TT0ZUUkVTRVQJMHg4MDAwCS8qIHJlc2V0cyB0aGUgY2hpcCAqLworI2RlZmluZQlSQ1JfU1RSSVBfQ1JDCTB4MjAwCS8qIHN0cmlwcyBDUkMgKi8KKyNkZWZpbmUgUkNSX0VOQUJMRQkweDEwMAkvKiBJRkYgdGhpcyBpcyBzZXQsIHdlIGNhbiByZWNlaXZlIHBhY2tldHMgKi8KKyNkZWZpbmUgUkNSX0FMTVVMCTB4NAkvKiByZWNlaXZlIGFsbCBtdWx0aWNhc3QgcGFja2V0cyAqLworI2RlZmluZQlSQ1JfUFJPTUlTQwkweDIJLyogZW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKworLyogdGhlIG5vcm1hbCBzZXR0aW5ncyBmb3IgdGhlIFJDUiByZWdpc3RlciA6ICovCisjZGVmaW5lCVJDUl9OT1JNQUwJKFJDUl9TVFJJUF9DUkMgfCBSQ1JfRU5BQkxFKQorI2RlZmluZSBSQ1JfQ0xFQVIJMHgwCQkvKiBzZXQgaXQgdG8gYSBiYXNlIHN0YXRlICovCisKKyNkZWZpbmUJQ09VTlRFUgkJNgorI2RlZmluZQlNSVIJCTgKKyNkZWZpbmUJTUNSCQkxMAorLyogMTIgaXMgcmVzZXJ2ZWQgKi8KKworLy8gUmVjZWl2ZS9QaHkgQ29udHJvbCBSZWdpc3RlcgorLyogQkFOSyAwICAqLworI2RlZmluZSBSUENfUkVHICAgICAgICAgMHgwMDBBCisjZGVmaW5lIFJQQ19TUEVFRCAgICAgICAweDIwMDAgIC8vIFdoZW4gMSBQSFkgaXMgaW4gMTAwTWJwcyBtb2RlLgorI2RlZmluZSBSUENfRFBMWCAgICAgICAgMHgxMDAwICAvLyBXaGVuIDEgUEhZIGlzIGluIEZ1bGwtRHVwbGV4IE1vZGUKKyNkZWZpbmUgUlBDX0FORUcgICAgICAgIDB4MDgwMCAgLy8gV2hlbiAxIFBIWSBpcyBpbiBBdXRvLU5lZ290aWF0ZSBNb2RlCisjZGVmaW5lIFJQQ19MU1hBX1NIRlQgICA1ICAgICAgIC8vIEJpdHMgdG8gc2hpZnQgTFMyQSxMUzFBLExTMEEgdG8gbHNiCisjZGVmaW5lIFJQQ19MU1hCX1NIRlQgICAyICAgICAgIC8vIEJpdHMgdG8gZ2V0IExTMkIsTFMxQixMUzBCIHRvIGxzYgorI2RlZmluZSBSUENfTEVEXzEwMF8xMCAgKDB4MDApICAvLyBMRUQgPSAxMDBNYnBzIE9SJ3Mgd2l0aCAxME1icHMgbGluayBkZXRlY3QKKyNkZWZpbmUgUlBDX0xFRF9SRVMgICAgICgweDAxKSAgLy8gTEVEID0gUmVzZXJ2ZWQKKyNkZWZpbmUgUlBDX0xFRF8xMCAgICAgICgweDAyKSAgLy8gTEVEID0gMTBNYnBzIGxpbmsgZGV0ZWN0CisjZGVmaW5lIFJQQ19MRURfRkQgICAgICAoMHgwMykgIC8vIExFRCA9IEZ1bGwgRHVwbGV4IE1vZGUKKyNkZWZpbmUgUlBDX0xFRF9UWF9SWCAgICgweDA0KSAgLy8gTEVEID0gVFggb3IgUlggcGFja2V0IG9jY3VycmVkCisjZGVmaW5lIFJQQ19MRURfMTAwICAgICAoMHgwNSkgIC8vIExFRCA9IDEwME1icHMgbGluayBkZWN0ZWN0CisjZGVmaW5lIFJQQ19MRURfVFggICAgICAoMHgwNikgIC8vIExFRCA9IFRYIHBhY2tldCBvY2N1cnJlZAorI2RlZmluZSBSUENfTEVEX1JYICAgICAgKDB4MDcpICAvLyBMRUQgPSBSWCBwYWNrZXQgb2NjdXJyZWQKKyNkZWZpbmUgUlBDX0RFRkFVTFQgKFJQQ19BTkVHIHwgKFJQQ19MRURfMTAwIDw8IFJQQ19MU1hBX1NIRlQpIHwgKFJQQ19MRURfRkQgPDwgUlBDX0xTWEJfU0hGVCkgfCBSUENfU1BFRUQgfCBSUENfRFBMWCkKKworLy8gUmVjZWl2ZS9QaHkgQ29udHJvbCBSZWdpc3RlcgorLyogQkFOSyAwICAqLworI2RlZmluZSBSUENfUkVHICAgICAgICAgMHgwMDBBCisjZGVmaW5lIFJQQ19TUEVFRCAgICAgICAweDIwMDAgIC8vIFdoZW4gMSBQSFkgaXMgaW4gMTAwTWJwcyBtb2RlLgorI2RlZmluZSBSUENfRFBMWCAgICAgICAgMHgxMDAwICAvLyBXaGVuIDEgUEhZIGlzIGluIEZ1bGwtRHVwbGV4IE1vZGUKKyNkZWZpbmUgUlBDX0FORUcgICAgICAgIDB4MDgwMCAgLy8gV2hlbiAxIFBIWSBpcyBpbiBBdXRvLU5lZ290aWF0ZSBNb2RlCisjZGVmaW5lIFJQQ19MU1hBX1NIRlQgICA1ICAgICAgIC8vIEJpdHMgdG8gc2hpZnQgTFMyQSxMUzFBLExTMEEgdG8gbHNiCisjZGVmaW5lIFJQQ19MU1hCX1NIRlQgICAyICAgICAgIC8vIEJpdHMgdG8gZ2V0IExTMkIsTFMxQixMUzBCIHRvIGxzYgorI2RlZmluZSBSUENfTEVEXzEwMF8xMCAgKDB4MDApICAvLyBMRUQgPSAxMDBNYnBzIE9SJ3Mgd2l0aCAxME1icHMgbGluayBkZXRlY3QKKyNkZWZpbmUgUlBDX0xFRF9SRVMgICAgICgweDAxKSAgLy8gTEVEID0gUmVzZXJ2ZWQKKyNkZWZpbmUgUlBDX0xFRF8xMCAgICAgICgweDAyKSAgLy8gTEVEID0gMTBNYnBzIGxpbmsgZGV0ZWN0CisjZGVmaW5lIFJQQ19MRURfRkQgICAgICAoMHgwMykgIC8vIExFRCA9IEZ1bGwgRHVwbGV4IE1vZGUKKyNkZWZpbmUgUlBDX0xFRF9UWF9SWCAgICgweDA0KSAgLy8gTEVEID0gVFggb3IgUlggcGFja2V0IG9jY3VycmVkCisjZGVmaW5lIFJQQ19MRURfMTAwICAgICAoMHgwNSkgIC8vIExFRCA9IDEwME1icHMgbGluayBkZWN0ZWN0CisjZGVmaW5lIFJQQ19MRURfVFggICAgICAoMHgwNikgIC8vIExFRCA9IFRYIHBhY2tldCBvY2N1cnJlZAorI2RlZmluZSBSUENfTEVEX1JYICAgICAgKDB4MDcpICAvLyBMRUQgPSBSWCBwYWNrZXQgb2NjdXJyZWQKKyNkZWZpbmUgUlBDX0RFRkFVTFQgKFJQQ19BTkVHIHwgKFJQQ19MRURfMTAwIDw8IFJQQ19MU1hBX1NIRlQpIHwgKFJQQ19MRURfRkQgPDwgUlBDX0xTWEJfU0hGVCkgfCBSUENfU1BFRUQgfCBSUENfRFBMWCkKKworLyogQkFOSyAxICovCisjZGVmaW5lIENPTkZJRwkJCTAKKyNkZWZpbmUgQ0ZHX0FVSV9TRUxFQ1QJCTB4MTAwCisjZGVmaW5lCUJBU0UJCQkyCisjZGVmaW5lCUFERFIwCQkJNAorI2RlZmluZQlBRERSMQkJCTYKKyNkZWZpbmUJQUREUjIJCQk4CisjZGVmaW5lCUdFTkVSQUwJCQkxMAorI2RlZmluZQlDT05UUk9MCQkJMTIKKyNkZWZpbmUJQ1RMX1BPV0VSRE9XTgkJMHgyMDAwCisjZGVmaW5lCUNUTF9MRV9FTkFCTEUJCTB4ODAKKyNkZWZpbmUJQ1RMX0NSX0VOQUJMRQkJMHg0MAorI2RlZmluZQlDVExfVEVfRU5BQkxFCQkweDAwMjAKKyNkZWZpbmUgQ1RMX0FVVE9fUkVMRUFTRQkweDA4MDAKKyNkZWZpbmUJQ1RMX0VQUk9NX0FDQ0VTUwkweDAwMDMgLyogaGlnaCBpZiBFcHJvbSBpcyBiZWluZyByZWFkICovCisKKy8qIEJBTksgMiAqLworI2RlZmluZSBNTVVfQ01ECQkwCisjZGVmaW5lIE1DX0JVU1kJCTEJLyogb25seSByZWFkYWJsZSBiaXQgaW4gdGhlIHJlZ2lzdGVyICovCisjZGVmaW5lIE1DX05PUAkJMAorI2RlZmluZQlNQ19BTExPQwkweDIwCS8qIG9yIHdpdGggbnVtYmVyIG9mIDI1NiBieXRlIHBhY2tldHMgKi8KKyNkZWZpbmUJTUNfUkVTRVQJMHg0MAorI2RlZmluZQlNQ19SRU1PVkUJMHg2MAkvKiByZW1vdmUgdGhlIGN1cnJlbnQgcnggcGFja2V0ICovCisjZGVmaW5lIE1DX1JFTEVBU0UJMHg4MAkvKiByZW1vdmUgYW5kIHJlbGVhc2UgdGhlIGN1cnJlbnQgcnggcGFja2V0ICovCisjZGVmaW5lIE1DX0ZSRUVQS1QJMHhBMAkvKiBSZWxlYXNlIHBhY2tldCBpbiBQTlIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNfRU5RVUVVRQkweEMwCS8qIEVucXVldWUgdGhlIHBhY2tldCBmb3IgdHJhbnNtaXQgKi8KKworI2RlZmluZQlQTlJfQVJSCQkyCisjZGVmaW5lIEZJRk9fUE9SVFMJNAorCisjZGVmaW5lIEZQX1JYRU1QVFkJMHg4MDAwCisjZGVmaW5lIEZQX1RYRU1QVFkJMHg4MAorCisjZGVmaW5lCVBPSU5URVIJCTYKKyNkZWZpbmUgUFRSX1JFQUQJMHgyMDAwCisjZGVmaW5lCVBUUl9SQ1YJCTB4ODAwMAorI2RlZmluZQlQVFJfQVVUT0lOQwkweDQwMDAKKyNkZWZpbmUgUFRSX0FVVE9fSU5DCTB4MDA0MAorCisjZGVmaW5lCURBVEFfMQkJOAorI2RlZmluZQlEQVRBXzIJCTEwCisjZGVmaW5lCUlOVEVSUlVQVAkxMgorCisjZGVmaW5lIElOVF9NQVNLCTEzCisjZGVmaW5lIElNX1JDVl9JTlQJMHgxCisjZGVmaW5lCUlNX1RYX0lOVAkweDIKKyNkZWZpbmUJSU1fVFhfRU1QVFlfSU5UCTB4NAorI2RlZmluZQlJTV9BTExPQ19JTlQJMHg4CisjZGVmaW5lCUlNX1JYX09WUk5fSU5UCTB4MTAKKyNkZWZpbmUJSU1fRVBIX0lOVAkweDIwCisjZGVmaW5lCUlNX0VSQ1ZfSU5UCTB4NDAgLyogbm90IG9uIFNNQzkxOTIgKi8KKworLyogQkFOSyAzICovCisjZGVmaW5lCU1VTFRJQ0FTVDEJMAorI2RlZmluZQlNVUxUSUNBU1QyCTIKKyNkZWZpbmUJTVVMVElDQVNUMwk0CisjZGVmaW5lCU1VTFRJQ0FTVDQJNgorI2RlZmluZQlNR01UCQk4CisjZGVmaW5lCVJFVklTSU9OCTEwIC8qICggaGk6IGNoaXAgaWQgICBsb3c6IHJldiAjICkgKi8KKworLy8gTWFuYWdlbWVudCBJbnRlcmZhY2UgUmVnaXN0ZXIgKE1JSSkKKyNkZWZpbmUgTUlJX1JFRyAgICAgICAgIDB4MDAwOAorI2RlZmluZSBNSUlfTVNLX0NSUzEwMCAgMHg0MDAwIC8vIERpc2FibGVzIENSUzEwMCBkZXRlY3Rpb24gZHVyaW5nIHR4IGhhbGYgZHVwCisjZGVmaW5lIE1JSV9NRE9FICAgICAgICAweDAwMDggLy8gTUlJIE91dHB1dCBFbmFibGUKKyNkZWZpbmUgTUlJX01DTEsgICAgICAgIDB4MDAwNCAvLyBNSUkgQ2xvY2ssIHBpbiBNRENMSworI2RlZmluZSBNSUlfTURJICAgICAgICAgMHgwMDAyIC8vIE1JSSBJbnB1dCwgcGluIE1ESQorI2RlZmluZSBNSUlfTURPICAgICAgICAgMHgwMDAxIC8vIE1JSSBPdXRwdXQsIHBpbiBNRE8KKworLyogdGhpcyBpcyBOT1Qgb24gU01DOTE5MiAqLworI2RlZmluZQlFUkNWCQkxMgorCisvKiBOb3RlIHRoYXQgOTE5NCBhbmQgOTE5NiBoYXZlIHRoZSBzbWFtZSBjaGlwIGlkLAorICogdGhlIDkxOTYgd2lsbCBoYXZlIHJldmlzaW9ucyBzdGFydGluZyBhdCA2ICovCisjZGVmaW5lIENISVBfOTE5MAkzCisjZGVmaW5lIENISVBfOTE5NAk0CisjZGVmaW5lIENISVBfOTE5NQk1CisjZGVmaW5lIENISVBfOTE5Ngk0CisjZGVmaW5lIENISVBfOTExMDAJNworI2RlZmluZSBDSElQXzkxMTAwRkQJOAorCisjZGVmaW5lIFJFVl85MTk2CTYKKworLyoKKyAqIFRyYW5zbWl0IHN0YXR1cyBiaXRzCisgKi8KKyNkZWZpbmUgVFNfU1VDQ0VTUwkweDAwMDEKKyNkZWZpbmUgVFNfTE9TVENBUgkweDA0MDAKKyNkZWZpbmUgVFNfTEFUQ09MCTB4MDIwMAorI2RlZmluZSBUU18xNkNPTAkweDAwMTAKKworLyoKKyAqIFJlY2VpdmUgc3RhdHVzIGJpdHMKKyAqLworI2RlZmluZSBSU19BTEdORVJSCTB4ODAwMAorI2RlZmluZSBSU19CQURDUkMJMHgyMDAwCisjZGVmaW5lIFJTX09EREZSQU1FCTB4MTAwMAorI2RlZmluZSBSU19UT09MT05HCTB4MDgwMAorI2RlZmluZSBSU19UT09TSE9SVAkweDA0MDAKKyNkZWZpbmUgUlNfTVVMVElDQVNUCTB4MDAwMQorI2RlZmluZSBSU19FUlJPUlMJKFJTX0FMR05FUlIgfCBSU19CQURDUkMgfCBSU19UT09MT05HIHwgUlNfVE9PU0hPUlQpCisKKy8vIFBIWSBSZWdpc3RlciBBZGRyZXNzZXMgKExBTjkxQzExMSBJbnRlcm5hbCBQSFkpCisKKy8vIFBIWSBDb250cm9sIFJlZ2lzdGVyCisjZGVmaW5lIFBIWV9DTlRMX1JFRyAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUEhZX0NOVExfUlNUICAgICAgICAgICAgMHg4MDAwICAvLyAxPVBIWSBSZXNldAorI2RlZmluZSBQSFlfQ05UTF9MUEJLICAgICAgICAgICAweDQwMDAgIC8vIDE9UEhZIExvb3BiYWNrCisjZGVmaW5lIFBIWV9DTlRMX1NQRUVEICAgICAgICAgIDB4MjAwMCAgLy8gMT0xMDBNYnBzLCAwPTEwTXBicworI2RlZmluZSBQSFlfQ05UTF9BTkVHX0VOICAgICAgICAweDEwMDAgLy8gMT1FbmFibGUgQXV0byBuZWdvdGlhdGlvbgorI2RlZmluZSBQSFlfQ05UTF9QRE4gICAgICAgICAgICAweDA4MDAgIC8vIDE9UEhZIFBvd2VyIERvd24gbW9kZQorI2RlZmluZSBQSFlfQ05UTF9NSUlfRElTICAgICAgICAweDA0MDAgIC8vIDE9TUlJIDQgYml0IGludGVyZmFjZSBkaXNhYmxlZAorI2RlZmluZSBQSFlfQ05UTF9BTkVHX1JTVCAgICAgICAweDAyMDAgLy8gMT1SZXNldCBBdXRvIG5lZ290aWF0ZQorI2RlZmluZSBQSFlfQ05UTF9EUExYICAgICAgICAgICAweDAxMDAgIC8vIDE9RnVsbCBEdXBsZXgsIDA9SGFsZiBEdXBsZXgKKyNkZWZpbmUgUEhZX0NOVExfQ09MVFNUICAgICAgICAgMHgwMDgwICAvLyAxPSBNSUkgQ29saXNpb24gVGVzdAorCisvLyBQSFkgU3RhdHVzIFJlZ2lzdGVyCisjZGVmaW5lIFBIWV9TVEFUX1JFRyAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUEhZX1NUQVRfQ0FQX1Q0ICAgICAgICAgMHg4MDAwICAvLyAxPTEwMEJhc2UtVDQgY2FwYWJsZQorI2RlZmluZSBQSFlfU1RBVF9DQVBfVFhGICAgICAgICAweDQwMDAgIC8vIDE9MTAwQmFzZS1YIGZ1bGwgZHVwbGV4IGNhcGFibGUKKyNkZWZpbmUgUEhZX1NUQVRfQ0FQX1RYSCAgICAgICAgMHgyMDAwICAvLyAxPTEwMEJhc2UtWCBoYWxmIGR1cGxleCBjYXBhYmxlCisjZGVmaW5lIFBIWV9TVEFUX0NBUF9URiAgICAgICAgIDB4MTAwMCAgLy8gMT0xME1icHMgZnVsbCBkdXBsZXggY2FwYWJsZQorI2RlZmluZSBQSFlfU1RBVF9DQVBfVEggICAgICAgICAweDA4MDAgIC8vIDE9MTBNYnBzIGhhbGYgZHVwbGV4IGNhcGFibGUKKyNkZWZpbmUgUEhZX1NUQVRfQ0FQX1NVUFIgICAgICAgMHgwMDQwICAvLyAxPXJlY3YgbWdtdCBmcmFtZXMgd2l0aCBub3QgcHJlYW1ibGUKKyNkZWZpbmUgUEhZX1NUQVRfQU5FR19BQ0sgICAgICAgMHgwMDIwICAvLyAxPUFORUcgaGFzIGNvbXBsZXRlZAorI2RlZmluZSBQSFlfU1RBVF9SRU1fRkxUICAgICAgICAweDAwMTAgIC8vIDE9UmVtb3RlIEZhdWx0IGRldGVjdGVkCisjZGVmaW5lIFBIWV9TVEFUX0NBUF9BTkVHICAgICAgIDB4MDAwOCAgLy8gMT1BdXRvIG5lZ290aWF0ZSBjYXBhYmxlCisjZGVmaW5lIFBIWV9TVEFUX0xJTksgICAgICAgICAgIDB4MDAwNCAgLy8gMT12YWxpZCBsaW5rCisjZGVmaW5lIFBIWV9TVEFUX0pBQiAgICAgICAgICAgIDB4MDAwMiAgLy8gMT0xME1icHMgamFiYmVyIGNvbmRpdGlvbgorI2RlZmluZSBQSFlfU1RBVF9FWFJFRyAgICAgICAgICAweDAwMDEgIC8vIDE9ZXh0ZW5kZWQgcmVnaXN0ZXJzIGltcGxlbWVudGVkCisKKy8vIFBIWSBJZGVudGlmaWVyIFJlZ2lzdGVycworI2RlZmluZSBQSFlfSUQxX1JFRyAgICAgICAgICAgICAweDAyICAgIC8vIFBIWSBJZGVudGlmaWVyIDEKKyNkZWZpbmUgUEhZX0lEMl9SRUcgICAgICAgICAgICAgMHgwMyAgICAvLyBQSFkgSWRlbnRpZmllciAyCisKKy8vIFBIWSBBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKKyNkZWZpbmUgUEhZX0FEX1JFRyAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBQSFlfQURfTlAgICAgICAgICAgICAgICAweDgwMDAgIC8vIDE9UEhZIHJlcXVlc3RzIGV4Y2hhbmdlIG9mIE5leHQgUGFnZQorI2RlZmluZSBQSFlfQURfQUNLICAgICAgICAgICAgICAweDQwMDAgIC8vIDE9Z290IGxpbmsgY29kZSB3b3JkIGZyb20gcmVtb3RlCisjZGVmaW5lIFBIWV9BRF9SRiAgICAgICAgICAgICAgIDB4MjAwMCAgLy8gMT1hZHZlcnRpc2UgcmVtb3RlIGZhdWx0CisjZGVmaW5lIFBIWV9BRF9UNCAgICAgICAgICAgICAgIDB4MDIwMCAgLy8gMT1QSFkgaXMgY2FwYWJsZSBvZiAxMDBCYXNlLVQ0CisjZGVmaW5lIFBIWV9BRF9UWF9GRFggICAgICAgICAgIDB4MDEwMCAgLy8gMT1QSFkgaXMgY2FwYWJsZSBvZiAxMDBCYXNlLVRYIEZEUExYCisjZGVmaW5lIFBIWV9BRF9UWF9IRFggICAgICAgICAgIDB4MDA4MCAgLy8gMT1QSFkgaXMgY2FwYWJsZSBvZiAxMDBCYXNlLVRYIEhEUExYCisjZGVmaW5lIFBIWV9BRF8xMF9GRFggICAgICAgICAgIDB4MDA0MCAgLy8gMT1QSFkgaXMgY2FwYWJsZSBvZiAxMEJhc2UtVCBGRFBMWAorI2RlZmluZSBQSFlfQURfMTBfSERYICAgICAgICAgICAweDAwMjAgIC8vIDE9UEhZIGlzIGNhcGFibGUgb2YgMTBCYXNlLVQgSERQTFgKKyNkZWZpbmUgUEhZX0FEX0NTTUEgICAgICAgICAgICAgMHgwMDAxICAvLyAxPVBIWSBpcyBjYXBhYmxlIG9mIDgwMi4zIENNU0EKKworLy8gUEhZIEF1dG8tbmVnb3RpYXRpb24gUmVtb3RlIEVuZCBDYXBhYmlsaXR5IFJlZ2lzdGVyCisjZGVmaW5lIFBIWV9STVRfUkVHICAgICAgICAgICAgIDB4MDUKKy8vIFVzZXMgc2FtZSBiaXQgZGVmaW5pdGlvbnMgYXMgUEhZX0FEX1JFRworCisvLyBQSFkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCisjZGVmaW5lIFBIWV9DRkcxX1JFRyAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUEhZX0NGRzFfTE5LRElTICAgICAgICAgMHg4MDAwICAvLyAxPVJ4IExpbmsgRGV0ZWN0IEZ1bmN0aW9uIGRpc2FibGVkCisjZGVmaW5lIFBIWV9DRkcxX1hNVERJUyAgICAgICAgIDB4NDAwMCAgLy8gMT1UUCBUcmFuc21pdHRlciBEaXNhYmxlZAorI2RlZmluZSBQSFlfQ0ZHMV9YTVRQRE4gICAgICAgICAweDIwMDAgIC8vIDE9VFAgVHJhbnNtaXR0ZXIgUG93ZXJlZCBEb3duCisjZGVmaW5lIFBIWV9DRkcxX0JZUFNDUiAgICAgICAgIDB4MDQwMCAgLy8gMT1CeXBhc3Mgc2NyYW1ibGVyL2Rlc2NyYW1ibGVyCisjZGVmaW5lIFBIWV9DRkcxX1VOU0NEUyAgICAgICAgIDB4MDIwMCAgLy8gMT1VbnNjcmFtYmxlIElkbGUgUmVjZXB0aW9uIERpc2FibGUKKyNkZWZpbmUgUEhZX0NGRzFfRVFMWlIgICAgICAgICAgMHgwMTAwICAvLyAxPVJ4IEVxdWFsaXplciBEaXNhYmxlZAorI2RlZmluZSBQSFlfQ0ZHMV9DQUJMRSAgICAgICAgICAweDAwODAgIC8vIDE9U1RQKDE1MG9obSksIDA9VVRQKDEwMG9obSkKKyNkZWZpbmUgUEhZX0NGRzFfUkxWTDAgICAgICAgICAgMHgwMDQwICAvLyAxPVJ4IFNxdWVsY2ggbGV2ZWwgcmVkdWNlZCBieSA0LjVkYgorI2RlZmluZSBQSFlfQ0ZHMV9UTFZMX1NISUZUICAgICAyICAgICAgIC8vIFRyYW5zbWl0IE91dHB1dCBMZXZlbCBBZGp1c3QKKyNkZWZpbmUgUEhZX0NGRzFfVExWTF9NQVNLICAgICAgMHgwMDNDCisjZGVmaW5lIFBIWV9DRkcxX1RSRl9NQVNLICAgICAgIDB4MDAwMyAgLy8gVHJhbnNtaXR0ZXIgUmlzZS9GYWxsIHRpbWUKKworCisvLyBQSFkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCisjZGVmaW5lIFBIWV9DRkcyX1JFRyAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgUEhZX0NGRzJfQVBPTERJUyAgICAgICAgMHgwMDIwICAvLyAxPUF1dG8gUG9sYXJpdHkgQ29ycmVjdGlvbiBkaXNhYmxlZAorI2RlZmluZSBQSFlfQ0ZHMl9KQUJESVMgICAgICAgICAweDAwMTAgIC8vIDE9SmFiYmVyIGRpc2FibGVkCisjZGVmaW5lIFBIWV9DRkcyX01SRUcgICAgICAgICAgIDB4MDAwOCAgLy8gMT1NdWx0aXBsZSByZWdpc3RlciBhY2Nlc3MgKE1JSSBtZ3QpCisjZGVmaW5lIFBIWV9DRkcyX0lOVE1ESU8gICAgICAgIDB4MDAwNCAgLy8gMT1JbnRlcnJ1cHQgc2lnbmFsZWQgd2l0aCBNRElPIHB1bHNlbworCisvLyBQSFkgU3RhdHVzIE91dHB1dCAoYW5kIEludGVycnVwdCBzdGF0dXMpIFJlZ2lzdGVyCisjZGVmaW5lIFBIWV9JTlRfUkVHICAgICAgICAgICAgIDB4MTIgICAgLy8gU3RhdHVzIE91dHB1dCAoSW50ZXJydXB0IFN0YXR1cykKKyNkZWZpbmUgUEhZX0lOVF9JTlQgICAgICAgICAgICAgMHg4MDAwICAvLyAxPWJpdHMgaGF2ZSBjaGFuZ2VkIHNpbmNlIGxhc3QgcmVhZAorI2RlZmluZSBQSFlfSU5UX0xOS0ZBSUwgICAgICAgICAweDQwMDAgIC8vIDE9TGluayBOb3QgZGV0ZWN0ZWQKKyNkZWZpbmUgUEhZX0lOVF9MT1NTU1lOQyAgICAgICAgMHgyMDAwICAvLyAxPURlc2NyYW1ibGVyIGhhcyBsb3N0IHN5bmMKKyNkZWZpbmUgUEhZX0lOVF9DV1JEICAgICAgICAgICAgMHgxMDAwICAvLyAxPUludmFsaWQgNEI1QiBjb2RlIGRldGVjdGVkIG9uIHJ4CisjZGVmaW5lIFBIWV9JTlRfU1NEICAgICAgICAgICAgIDB4MDgwMCAgLy8gMT1ObyBTdGFydCBPZiBTdHJlYW0gZGV0ZWN0ZWQgb24gcngKKyNkZWZpbmUgUEhZX0lOVF9FU0QgICAgICAgICAgICAgMHgwNDAwICAvLyAxPU5vIEVuZCBPZiBTdHJlYW0gZGV0ZWN0ZWQgb24gcngKKyNkZWZpbmUgUEhZX0lOVF9SUE9MICAgICAgICAgICAgMHgwMjAwICAvLyAxPVJldmVyc2UgUG9sYXJpdHkgZGV0ZWN0ZWQKKyNkZWZpbmUgUEhZX0lOVF9KQUIgICAgICAgICAgICAgMHgwMTAwICAvLyAxPUphYmJlciBkZXRlY3RlZAorI2RlZmluZSBQSFlfSU5UX1NQRERFVCAgICAgICAgICAweDAwODAgIC8vIDE9MTAwQmFzZS1UWCBtb2RlLCAwPTEwQmFzZS1UIG1vZGUKKyNkZWZpbmUgUEhZX0lOVF9EUExYREVUICAgICAgICAgMHgwMDQwICAvLyAxPURldmljZSBpbiBGdWxsIER1cGxleAorCisvLyBQSFkgSW50ZXJydXB0L1N0YXR1cyBNYXNrIFJlZ2lzdGVyCisjZGVmaW5lIFBIWV9NQVNLX1JFRyAgICAgICAgICAgIDB4MTMgICAgLy8gSW50ZXJydXB0IE1hc2sKKy8vIFVzZXMgdGhlIHNhbWUgYml0IGRlZmluaXRpb25zIGFzIFBIWV9JTlRfUkVHCisKKworLy8gUEhZIFJlZ2lzdGVyIEFkZHJlc3NlcyAoTEFOOTFDMTExIEludGVybmFsIFBIWSkKKworLy8gUEhZIENvbnRyb2wgUmVnaXN0ZXIKKyNkZWZpbmUgUEhZX0NOVExfUkVHICAgICAgICAgICAgMHgwMAorI2RlZmluZSBQSFlfQ05UTF9SU1QgICAgICAgICAgICAweDgwMDAgIC8vIDE9UEhZIFJlc2V0CisjZGVmaW5lIFBIWV9DTlRMX0xQQksgICAgICAgICAgIDB4NDAwMCAgLy8gMT1QSFkgTG9vcGJhY2sKKyNkZWZpbmUgUEhZX0NOVExfU1BFRUQgICAgICAgICAgMHgyMDAwICAvLyAxPTEwME1icHMsIDA9MTBNcGJzCisjZGVmaW5lIFBIWV9DTlRMX0FORUdfRU4gICAgICAgIDB4MTAwMCAvLyAxPUVuYWJsZSBBdXRvIG5lZ290aWF0aW9uCisjZGVmaW5lIFBIWV9DTlRMX1BETiAgICAgICAgICAgIDB4MDgwMCAgLy8gMT1QSFkgUG93ZXIgRG93biBtb2RlCisjZGVmaW5lIFBIWV9DTlRMX01JSV9ESVMgICAgICAgIDB4MDQwMCAgLy8gMT1NSUkgNCBiaXQgaW50ZXJmYWNlIGRpc2FibGVkCisjZGVmaW5lIFBIWV9DTlRMX0FORUdfUlNUICAgICAgIDB4MDIwMCAvLyAxPVJlc2V0IEF1dG8gbmVnb3RpYXRlCisjZGVmaW5lIFBIWV9DTlRMX0RQTFggICAgICAgICAgIDB4MDEwMCAgLy8gMT1GdWxsIER1cGxleCwgMD1IYWxmIER1cGxleAorI2RlZmluZSBQSFlfQ05UTF9DT0xUU1QgICAgICAgICAweDAwODAgIC8vIDE9IE1JSSBDb2xpc2lvbiBUZXN0CisKKy8vIFBIWSBTdGF0dXMgUmVnaXN0ZXIKKyNkZWZpbmUgUEhZX1NUQVRfUkVHICAgICAgICAgICAgMHgwMQorI2RlZmluZSBQSFlfU1RBVF9DQVBfVDQgICAgICAgICAweDgwMDAgIC8vIDE9MTAwQmFzZS1UNCBjYXBhYmxlCisjZGVmaW5lIFBIWV9TVEFUX0NBUF9UWEYgICAgICAgIDB4NDAwMCAgLy8gMT0xMDBCYXNlLVggZnVsbCBkdXBsZXggY2FwYWJsZQorI2RlZmluZSBQSFlfU1RBVF9DQVBfVFhIICAgICAgICAweDIwMDAgIC8vIDE9MTAwQmFzZS1YIGhhbGYgZHVwbGV4IGNhcGFibGUKKyNkZWZpbmUgUEhZX1NUQVRfQ0FQX1RGICAgICAgICAgMHgxMDAwICAvLyAxPTEwTWJwcyBmdWxsIGR1cGxleCBjYXBhYmxlCisjZGVmaW5lIFBIWV9TVEFUX0NBUF9USCAgICAgICAgIDB4MDgwMCAgLy8gMT0xME1icHMgaGFsZiBkdXBsZXggY2FwYWJsZQorI2RlZmluZSBQSFlfU1RBVF9DQVBfU1VQUiAgICAgICAweDAwNDAgIC8vIDE9cmVjdiBtZ210IGZyYW1lcyB3aXRoIG5vdCBwcmVhbWJsZQorI2RlZmluZSBQSFlfU1RBVF9BTkVHX0FDSyAgICAgICAweDAwMjAgIC8vIDE9QU5FRyBoYXMgY29tcGxldGVkCisjZGVmaW5lIFBIWV9TVEFUX1JFTV9GTFQgICAgICAgIDB4MDAxMCAgLy8gMT1SZW1vdGUgRmF1bHQgZGV0ZWN0ZWQKKyNkZWZpbmUgUEhZX1NUQVRfQ0FQX0FORUcgICAgICAgMHgwMDA4ICAvLyAxPUF1dG8gbmVnb3RpYXRlIGNhcGFibGUKKyNkZWZpbmUgUEhZX1NUQVRfTElOSyAgICAgICAgICAgMHgwMDA0ICAvLyAxPXZhbGlkIGxpbmsKKyNkZWZpbmUgUEhZX1NUQVRfSkFCICAgICAgICAgICAgMHgwMDAyICAvLyAxPTEwTWJwcyBqYWJiZXIgY29uZGl0aW9uCisjZGVmaW5lIFBIWV9TVEFUX0VYUkVHICAgICAgICAgIDB4MDAwMSAgLy8gMT1leHRlbmRlZCByZWdpc3RlcnMgaW1wbGVtZW50ZWQKKworLy8gUEhZIElkZW50aWZpZXIgUmVnaXN0ZXJzCisjZGVmaW5lIFBIWV9JRDFfUkVHICAgICAgICAgICAgIDB4MDIgICAgLy8gUEhZIElkZW50aWZpZXIgMQorI2RlZmluZSBQSFlfSUQyX1JFRyAgICAgICAgICAgICAweDAzICAgIC8vIFBIWSBJZGVudGlmaWVyIDIKKworLy8gUEhZIEF1dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCBSZWdpc3RlcgorI2RlZmluZSBQSFlfQURfUkVHICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFBIWV9BRF9OUCAgICAgICAgICAgICAgIDB4ODAwMCAgLy8gMT1QSFkgcmVxdWVzdHMgZXhjaGFuZ2Ugb2YgTmV4dCBQYWdlCisjZGVmaW5lIFBIWV9BRF9BQ0sgICAgICAgICAgICAgIDB4NDAwMCAgLy8gMT1nb3QgbGluayBjb2RlIHdvcmQgZnJvbSByZW1vdGUKKyNkZWZpbmUgUEhZX0FEX1JGICAgICAgICAgICAgICAgMHgyMDAwICAvLyAxPWFkdmVydGlzZSByZW1vdGUgZmF1bHQKKyNkZWZpbmUgUEhZX0FEX1Q0ICAgICAgICAgICAgICAgMHgwMjAwICAvLyAxPVBIWSBpcyBjYXBhYmxlIG9mIDEwMEJhc2UtVDQKKyNkZWZpbmUgUEhZX0FEX1RYX0ZEWCAgICAgICAgICAgMHgwMTAwICAvLyAxPVBIWSBpcyBjYXBhYmxlIG9mIDEwMEJhc2UtVFggRkRQTFgKKyNkZWZpbmUgUEhZX0FEX1RYX0hEWCAgICAgICAgICAgMHgwMDgwICAvLyAxPVBIWSBpcyBjYXBhYmxlIG9mIDEwMEJhc2UtVFggSERQTFgKKyNkZWZpbmUgUEhZX0FEXzEwX0ZEWCAgICAgICAgICAgMHgwMDQwICAvLyAxPVBIWSBpcyBjYXBhYmxlIG9mIDEwQmFzZS1UIEZEUExYCisjZGVmaW5lIFBIWV9BRF8xMF9IRFggICAgICAgICAgIDB4MDAyMCAgLy8gMT1QSFkgaXMgY2FwYWJsZSBvZiAxMEJhc2UtVCBIRFBMWAorI2RlZmluZSBQSFlfQURfQ1NNQSAgICAgICAgICAgICAweDAwMDEgIC8vIDE9UEhZIGlzIGNhcGFibGUgb2YgODAyLjMgQ01TQQorCisvLyBQSFkgQXV0by1uZWdvdGlhdGlvbiBSZW1vdGUgRW5kIENhcGFiaWxpdHkgUmVnaXN0ZXIKKyNkZWZpbmUgUEhZX1JNVF9SRUcgICAgICAgICAgICAgMHgwNQorLy8gVXNlcyBzYW1lIGJpdCBkZWZpbml0aW9ucyBhcyBQSFlfQURfUkVHCisKKy8vIFBIWSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEKKyNkZWZpbmUgUEhZX0NGRzFfUkVHICAgICAgICAgICAgMHgxMAorI2RlZmluZSBQSFlfQ0ZHMV9MTktESVMgICAgICAgICAweDgwMDAgIC8vIDE9UnggTGluayBEZXRlY3QgRnVuY3Rpb24gZGlzYWJsZWQKKyNkZWZpbmUgUEhZX0NGRzFfWE1URElTICAgICAgICAgMHg0MDAwICAvLyAxPVRQIFRyYW5zbWl0dGVyIERpc2FibGVkCisjZGVmaW5lIFBIWV9DRkcxX1hNVFBETiAgICAgICAgIDB4MjAwMCAgLy8gMT1UUCBUcmFuc21pdHRlciBQb3dlcmVkIERvd24KKyNkZWZpbmUgUEhZX0NGRzFfQllQU0NSICAgICAgICAgMHgwNDAwICAvLyAxPUJ5cGFzcyBzY3JhbWJsZXIvZGVzY3JhbWJsZXIKKyNkZWZpbmUgUEhZX0NGRzFfVU5TQ0RTICAgICAgICAgMHgwMjAwICAvLyAxPVVuc2NyYW1ibGUgSWRsZSBSZWNlcHRpb24gRGlzYWJsZQorI2RlZmluZSBQSFlfQ0ZHMV9FUUxaUiAgICAgICAgICAweDAxMDAgIC8vIDE9UnggRXF1YWxpemVyIERpc2FibGVkCisjZGVmaW5lIFBIWV9DRkcxX0NBQkxFICAgICAgICAgIDB4MDA4MCAgLy8gMT1TVFAoMTUwb2htKSwgMD1VVFAoMTAwb2htKQorI2RlZmluZSBQSFlfQ0ZHMV9STFZMMCAgICAgICAgICAweDAwNDAgIC8vIDE9UnggU3F1ZWxjaCBsZXZlbCByZWR1Y2VkIGJ5IDQuNWRiCisjZGVmaW5lIFBIWV9DRkcxX1RMVkxfU0hJRlQgICAgIDIgICAgICAgLy8gVHJhbnNtaXQgT3V0cHV0IExldmVsIEFkanVzdAorI2RlZmluZSBQSFlfQ0ZHMV9UTFZMX01BU0sgICAgICAweDAwM0MKKyNkZWZpbmUgUEhZX0NGRzFfVFJGX01BU0sgICAgICAgMHgwMDAzICAvLyBUcmFuc21pdHRlciBSaXNlL0ZhbGwgdGltZQorCisKKy8vIFBIWSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIKKyNkZWZpbmUgUEhZX0NGRzJfUkVHICAgICAgICAgICAgMHgxMQorI2RlZmluZSBQSFlfQ0ZHMl9BUE9MRElTICAgICAgICAweDAwMjAgIC8vIDE9QXV0byBQb2xhcml0eSBDb3JyZWN0aW9uIGRpc2FibGVkCisjZGVmaW5lIFBIWV9DRkcyX0pBQkRJUyAgICAgICAgIDB4MDAxMCAgLy8gMT1KYWJiZXIgZGlzYWJsZWQKKyNkZWZpbmUgUEhZX0NGRzJfTVJFRyAgICAgICAgICAgMHgwMDA4ICAvLyAxPU11bHRpcGxlIHJlZ2lzdGVyIGFjY2VzcyAoTUlJIG1ndCkKKyNkZWZpbmUgUEhZX0NGRzJfSU5UTURJTyAgICAgICAgMHgwMDA0ICAvLyAxPUludGVycnVwdCBzaWduYWxlZCB3aXRoIE1ESU8gcHVsc2VvCisKKy8vIFBIWSBTdGF0dXMgT3V0cHV0IChhbmQgSW50ZXJydXB0IHN0YXR1cykgUmVnaXN0ZXIKKyNkZWZpbmUgUEhZX0lOVF9SRUcgICAgICAgICAgICAgMHgxMiAgICAvLyBTdGF0dXMgT3V0cHV0IChJbnRlcnJ1cHQgU3RhdHVzKQorI2RlZmluZSBQSFlfSU5UX0lOVCAgICAgICAgICAgICAweDgwMDAgIC8vIDE9Yml0cyBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCByZWFkCisjZGVmaW5lIFBIWV9JTlRfTE5LRkFJTCAgICAgICAgIDB4NDAwMCAgLy8gMT1MaW5rIE5vdCBkZXRlY3RlZAorI2RlZmluZSBQSFlfSU5UX0xPU1NTWU5DICAgICAgICAweDIwMDAgIC8vIDE9RGVzY3JhbWJsZXIgaGFzIGxvc3Qgc3luYworI2RlZmluZSBQSFlfSU5UX0NXUkQgICAgICAgICAgICAweDEwMDAgIC8vIDE9SW52YWxpZCA0QjVCIGNvZGUgZGV0ZWN0ZWQgb24gcngKKyNkZWZpbmUgUEhZX0lOVF9TU0QgICAgICAgICAgICAgMHgwODAwICAvLyAxPU5vIFN0YXJ0IE9mIFN0cmVhbSBkZXRlY3RlZCBvbiByeAorI2RlZmluZSBQSFlfSU5UX0VTRCAgICAgICAgICAgICAweDA0MDAgIC8vIDE9Tm8gRW5kIE9mIFN0cmVhbSBkZXRlY3RlZCBvbiByeAorI2RlZmluZSBQSFlfSU5UX1JQT0wgICAgICAgICAgICAweDAyMDAgIC8vIDE9UmV2ZXJzZSBQb2xhcml0eSBkZXRlY3RlZAorI2RlZmluZSBQSFlfSU5UX0pBQiAgICAgICAgICAgICAweDAxMDAgIC8vIDE9SmFiYmVyIGRldGVjdGVkCisjZGVmaW5lIFBIWV9JTlRfU1BEREVUICAgICAgICAgIDB4MDA4MCAgLy8gMT0xMDBCYXNlLVRYIG1vZGUsIDA9MTBCYXNlLVQgbW9kZQorI2RlZmluZSBQSFlfSU5UX0RQTFhERVQgICAgICAgICAweDAwNDAgIC8vIDE9RGV2aWNlIGluIEZ1bGwgRHVwbGV4CisKKy8vIFBIWSBJbnRlcnJ1cHQvU3RhdHVzIE1hc2sgUmVnaXN0ZXIKKyNkZWZpbmUgUEhZX01BU0tfUkVHICAgICAgICAgICAgMHgxMyAgICAvLyBJbnRlcnJ1cHQgTWFzaworLy8gVXNlcyB0aGUgc2FtZSBiaXQgZGVmaW5pdGlvbnMgYXMgUEhZX0lOVF9SRUcKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBJIGRlZmluZSBzb21lIG1hY3JvcyB0byBtYWtlIGl0IGVhc2llciB0byBkbyBzb21ld2hhdCBjb21tb24KKyAqIG9yIHNsaWdodGx5IGNvbXBsaWNhdGVkLCByZXBlYXRlZCB0YXNrcy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHNlbGVjdCBhIHJlZ2lzdGVyIGJhbmssIDAgdG8gMyAgKi8KKworI2RlZmluZSBTTUNfU0VMRUNUX0JBTksoeCwgeSkgeyBfb3V0dyggeSwgeCArIEJBTktfU0VMRUNUICk7IH0KKworLyogZGVmaW5lIGEgc21hbGwgZGVsYXkgZm9yIHRoZSByZXNldCAqLworI2RlZmluZSBTTUNfREVMQVkoeCkgeyBpbncoIHggKyBSQ1IgKTtcCisJCQlpbncoIHggKyBSQ1IgKTtcCisJCQlpbncoIHggKyBSQ1IgKTsgfQorCisKKyNlbmRpZgkvKiBfU01DXzkwMDBfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvc3VuZGFuY2UuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0NmFjMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKQEAgLTAsMCArMSw4OTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICBzdW5kYW5jZS5jIC0tIEV0aGVyYm9vdCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU3VuZGFuY2UgU1QyMDEgIkFsdGEiLgorKiAgICBXcml0dGVuIDIwMDItMjAwMiBieSBUaW1vdGh5IExlZ2dlIDx0bGVnZ2VAcm9nZXJzLmNvbT4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqICAgIFBvcnRpb25zIG9mIHRoaXMgY29kZSBiYXNlZCBvbjoKKyogICAgICAgICAgICAgICBzdW5kYW5jZS5jOiBBIExpbnV4IGRldmljZSBkcml2ZXIgZm9yIHRoZSBTdW5kYW5jZSBTVDIwMSAiQWx0YSIKKyogICAgICAgICAgICAgICBXcml0dGVuIDE5OTktMjAwMiBieSBEb25hbGQgQmVja2VyCisqCisqICAgICAgICAgICAgICAgdHVsaXAuYzogVHVsaXAgYW5kIENsb25lIEV0aGVyYm9vdCBEcml2ZXIKKyogICAgICAgICAgICAgICBCeSBNYXJ0eSBDb25uZXIKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDEgRW50aXR5IEN5YmVyLCBJbmMuCisqCisqICAgIExpbnV4IERyaXZlciBWZXJzaW9uIExLMS4wOWEsIDEwLUp1bC0yMDAzICgyLjQuMjUpCisqCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyogICAgdjEuMQkwMS0wMS0yMDAzCXRpbWxlZ2dlCUluaXRpYWwgaW1wbGVtZW50YXRpb24KKyogICAgdjEuNwkwNC0xMC0yMDAzCXRpbWxlZ2dlCVRyYW5zZmVycyBMaW51eCBLZXJuZWwgKDMwIHNlYykKKyogICAgdjEuOAkwNC0xMy0yMDAzCXRpbWxlZ2dlCUZpeCBtdWx0aXBsZSB0cmFuc21pc3Npb24gYnVnCisqICAgIHYxLjkJMDgtMTktMjAwMwl0aW1sZWdnZQlTdXBwb3J0IE11bHRpY2FzdAorKiAgICB2MS4xMAkwMS0xNy0yMDA0CXRpbWxlZ2dlCUluaXRpYWwgZHJpdmVyIG91dHB1dCBjbGVhbnVwCisqICAgIHYxLjExCTAzLTIxLTIwMDQJdGltbGVnZ2UJUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMKKyogICAgdjEuMTIJMDMtMjEtMjAwNAl0aW1sZWdnZQlSZW1vdmUgZXhjZXNzIE1JSSBkZWZpbmVzCisqICAgIHYxLjEzCTAzLTI0LTIwMDQJdGltbGVnZ2UJVXBkYXRlIHRvIExpbnV4IDIuNC4yNSBkcml2ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisvKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLworI2luY2x1ZGUgIm5pYy5oIgorLyogdG8gZ2V0IHRoZSBQQ0kgc3VwcG9ydCBmdW5jdGlvbnMsIGlmIHRoaXMgaXMgYSBQQ0kgTklDICovCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlICJtaWkuaCIKKworI2RlZmluZSBkcnZfdmVyc2lvbiAidjEuMTIiCisjZGVmaW5lIGRydl9kYXRlICIyMDA0LTAzLTIxIgorCisjZGVmaW5lIEhaIDEwMAorCisvKiBDb25kZW5zZWQgb3BlcmF0aW9ucyBmb3IgcmVhZGFiaWxpdHkuICovCisjZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKGFkZHIpKQorI2RlZmluZSBsZTMyZGVzY190b192aXJ0KGFkZHIpICBidXNfdG9fdmlydChsZTMyX3RvX2NwdShhZGRyKSkKKworLyogU2V0IHRoZSBtdHUgKi8KK3N0YXRpYyBpbnQgbXR1ID0gMTUxNDsKKworLyogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiByeC1hbGwtbXVsdGljYXN0KS4KKyAgIFRoZSBzdW5kYW5jZSB1c2VzIGEgNjQgZWxlbWVudCBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBFdGhlcm5ldCBDUkMuICAqLworLy8gc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAgIFNldHRpbmcgdG8gPiAxNTE4IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4KKyAgIFRoaXMgY2hpcCBjYW4gcmVjZWl2ZSBpbnRvIGFueSBieXRlIGFsaWdubWVudCBidWZmZXJzLCBzbyB3b3JkLW9yaWVudGVkCisgICBhcmNocyBkbyBub3QgbmVlZCBhIGNvcHktYWxpZ24gb2YgdGhlIElQIGhlYWRlci4gKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMDsKK3N0YXRpYyBpbnQgZmxvd2N0cmwgPSAxOworCisvKiBBbGxvdyBmb3JjaW5nIHRoZSBtZWRpYSB0eXBlICovCisvKiBtZWRpYVtdIHNwZWNpZmllcyB0aGUgbWVkaWEgdHlwZSB0aGUgTklDIG9wZXJhdGVzIGF0LgorCQkgYXV0b3NlbnNlCUF1dG9zZW5zaW5nIGFjdGl2ZSBtZWRpYS4KKwkJIDEwbWJwc19oZCAJMTBNYnBzIGhhbGYgZHVwbGV4LgorCQkgMTBtYnBzX2ZkIAkxME1icHMgZnVsbCBkdXBsZXguCisJCSAxMDBtYnBzX2hkIAkxMDBNYnBzIGhhbGYgZHVwbGV4LgorCQkgMTAwbWJwc19mZCAJMTAwTWJwcyBmdWxsIGR1cGxleC4KKyovCitzdGF0aWMgY2hhciBtZWRpYVtdID0gImF1dG9zZW5zZSI7CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogQXMgRXRoZXJib290IHVzZXMgYSBQb2xsaW5nIGRyaXZlciAgd2UgY2FuIGtlZXAgdGhlIG51bWJlciBvZiByaW5ncwordG8gdGhlIG1pbmltdW0gbnVtYmVyIHJlcXVpcmVkLiAgSW4gZ2VuZXJhbCB0aGF0IGlzIDEgdHJhbnNtaXQgYW5kIDQgcmVjZWl2ZSByZWNlaXZlIHJpbmdzLiAgSG93ZXZlciBzb21lIGNhcmRzIHJlcXVpcmUgdGhhdAordGhlcmUgYmUgYSBtaW5pbXVtIG9mIDIgcmluZ3MgICovCisjZGVmaW5lIFRYX1JJTkdfU0laRQkyCisjZGVmaW5lIFRYX1FVRVVFX0xFTgkxMAkvKiBMaW1pdCByaW5nIGVudHJpZXMgYWN0dWFsbHkgdXNlZC4gICovCisjZGVmaW5lIFJYX1JJTkdfU0laRQk0CisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FX09VVAkgICg0KkhaKQorI2RlZmluZSBQS1RfQlVGX1NaCTE1MzYKKworLyogT2Zmc2V0cyB0byB0aGUgZGV2aWNlIHJlZ2lzdGVycy4KKyAgIFVubGlrZSBzb2Z0d2FyZS1vbmx5IHN5c3RlbXMsIGRldmljZSBkcml2ZXJzIGludGVyYWN0IHdpdGggY29tcGxleCBoYXJkd2FyZS4KKyAgIEl0J3Mgbm90IHVzZWZ1bCB0byBkZWZpbmUgc3ltYm9saWMgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIGJpdCBpbiB0aGUKKyAgIGRldmljZS4gIFRoZSBuYW1lIGNhbiBvbmx5IHBhcnRpYWxseSBkb2N1bWVudCB0aGUgc2VtYW50aWNzIGFuZCBtYWtlCisgICB0aGUgZHJpdmVyIGxvbmdlciBhbmQgbW9yZSBkaWZmaWN1bHQgdG8gcmVhZC4KKyAgIEluIGdlbmVyYWwsIG9ubHkgdGhlIGltcG9ydGFudCBjb25maWd1cmF0aW9uIHZhbHVlcyBvciBiaXRzIGNoYW5nZWQKKyAgIG11bHRpcGxlIHRpbWVzIHNob3VsZCBiZSBkZWZpbmVkIHN5bWJvbGljYWxseS4KKyovCitlbnVtIGFsdGFfb2Zmc2V0cyB7CisJRE1BQ3RybCA9IDB4MDAsCisJVHhMaXN0UHRyID0gMHgwNCwKKwlUeERNQUJ1cnN0VGhyZXNoID0gMHgwOCwKKwlUeERNQVVyZ2VudFRocmVzaCA9IDB4MDksCisJVHhETUFQb2xsUGVyaW9kID0gMHgwYSwKKwlSeERNQVN0YXR1cyA9IDB4MGMsCisJUnhMaXN0UHRyID0gMHgxMCwKKwlEZWJ1Z0N0cmwwID0gMHgxYSwKKwlEZWJ1Z0N0cmwxID0gMHgxYywKKwlSeERNQUJ1cnN0VGhyZXNoID0gMHgxNCwKKwlSeERNQVVyZ2VudFRocmVzaCA9IDB4MTUsCisJUnhETUFQb2xsUGVyaW9kID0gMHgxNiwKKwlMRURDdHJsID0gMHgxYSwKKwlBU0lDQ3RybCA9IDB4MzAsCisJRUVEYXRhID0gMHgzNCwKKwlFRUN0cmwgPSAweDM2LAorCVR4U3RhcnRUaHJlc2ggPSAweDNjLAorCVJ4RWFybHlUaHJlc2ggPSAweDNlLAorCUZsYXNoQWRkciA9IDB4NDAsCisJRmxhc2hEYXRhID0gMHg0NCwKKwlUeFN0YXR1cyA9IDB4NDYsCisJVHhGcmFtZUlkID0gMHg0NywKKwlEb3duQ291bnRlciA9IDB4MTgsCisJSW50ckNsZWFyID0gMHg0YSwKKwlJbnRyRW5hYmxlID0gMHg0YywKKwlJbnRyU3RhdHVzID0gMHg0ZSwKKwlNQUNDdHJsMCA9IDB4NTAsCisJTUFDQ3RybDEgPSAweDUyLAorCVN0YXRpb25BZGRyID0gMHg1NCwKKwlNYXhGcmFtZVNpemUgPSAweDVBLAorCVJ4TW9kZSA9IDB4NWMsCisJTUlJQ3RybCA9IDB4NWUsCisJTXVsdGljYXN0RmlsdGVyMCA9IDB4NjAsCisJTXVsdGljYXN0RmlsdGVyMSA9IDB4NjQsCisJUnhPY3RldHNMb3cgPSAweDY4LAorCVJ4T2N0ZXRzSGlnaCA9IDB4NmEsCisJVHhPY3RldHNMb3cgPSAweDZjLAorCVR4T2N0ZXRzSGlnaCA9IDB4NmUsCisJVHhGcmFtZXNPSyA9IDB4NzAsCisJUnhGcmFtZXNPSyA9IDB4NzIsCisJU3RhdHNDYXJyaWVyRXJyb3IgPSAweDc0LAorCVN0YXRzTGF0ZUNvbGwgPSAweDc1LAorCVN0YXRzTXVsdGlDb2xsID0gMHg3NiwKKwlTdGF0c09uZUNvbGwgPSAweDc3LAorCVN0YXRzVHhEZWZlciA9IDB4NzgsCisJUnhNaXNzZWQgPSAweDc5LAorCVN0YXRzVHhYU0RlZmVyID0gMHg3YSwKKwlTdGF0c1R4QWJvcnQgPSAweDdiLAorCVN0YXRzQmNhc3RUeCA9IDB4N2MsCisJU3RhdHNCY2FzdFJ4ID0gMHg3ZCwKKwlTdGF0c01jYXN0VHggPSAweDdlLAorCVN0YXRzTWNhc3RSeCA9IDB4N2YsCisJLyogQWxpYXNlZCBhbmQgYm9ndXMgdmFsdWVzISAqLworCVJ4U3RhdHVzID0gMHgwYywKK307CitlbnVtIEFTSUNDdHJsX0hpV29yZF9iaXQgeworCUdsb2JhbFJlc2V0ID0gMHgwMDAxLAorCVJ4UmVzZXQgPSAweDAwMDIsCisJVHhSZXNldCA9IDB4MDAwNCwKKwlETUFSZXNldCA9IDB4MDAwOCwKKwlGSUZPUmVzZXQgPSAweDAwMTAsCisJTmV0d29ya1Jlc2V0ID0gMHgwMDIwLAorCUhvc3RSZXNldCA9IDB4MDA0MCwKKwlSZXNldEJ1c3kgPSAweDA0MDAsCit9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKwlJbnRyU3VtbWFyeSA9IDB4MDAwMSwgSW50clBDSUVyciA9IDB4MDAwMiwgSW50ck1BQ0N0cmwgPSAweDAwMDgsCisJSW50clR4RG9uZSA9IDB4MDAwNCwgSW50clJ4RG9uZSA9IDB4MDAxMCwgSW50clJ4U3RhcnQgPSAweDAwMjAsCisJSW50ckRydlJxc3QgPSAweDAwNDAsCisJU3RhdHNNYXggPSAweDAwODAsIExpbmtDaGFuZ2UgPSAweDAxMDAsCisJSW50clR4RE1BRG9uZSA9IDB4MDIwMCwgSW50clJ4RE1BRG9uZSA9IDB4MDQwMCwKK307CisKKy8qIEJpdHMgaW4gdGhlIFJ4TW9kZSByZWdpc3Rlci4gKi8KK2VudW0gcnhfbW9kZV9iaXRzIHsKKwlBY2NlcHRBbGxJUE11bHRpID0gMHgyMCwgQWNjZXB0TXVsdGlIYXNoID0gMHgxMCwgQWNjZXB0QWxsID0gMHgwOCwKKwlBY2NlcHRCcm9hZGNhc3QgPSAweDA0LCBBY2NlcHRNdWx0aWNhc3QgPSAweDAyLCBBY2NlcHRNeVBoeXMgPQorCSAgICAweDAxLAorfTsKKy8qIEJpdHMgaW4gTUFDQ3RybC4gKi8KK2VudW0gbWFjX2N0cmwwX2JpdHMgeworCUVuYkZ1bGxEdXBsZXggPSAweDIwLCBFbmJSY3ZMYXJnZUZyYW1lID0gMHg0MCwKKwlFbmJGbG93Q3RybCA9IDB4MTAwLCBFbmJQYXNzUnhDUkMgPSAweDIwMCwKK307CitlbnVtIG1hY19jdHJsMV9iaXRzIHsKKwlTdGF0c0VuYWJsZSA9IDB4MDAyMCwgU3RhdHNEaXNhYmxlID0gMHgwMDQwLCBTdGF0c0VuYWJsZWQgPSAweDAwODAsCisJVHhFbmFibGUgPSAweDAxMDAsIFR4RGlzYWJsZSA9IDB4MDIwMCwgVHhFbmFibGVkID0gMHgwNDAwLAorCVJ4RW5hYmxlID0gMHgwODAwLCBSeERpc2FibGUgPSAweDEwMDAsIFJ4RW5hYmxlZCA9IDB4MjAwMCwKK307CisKKy8qIFRoZSBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3JzLgorICAgVXNpbmcgb25seSAzMiBiaXQgZmllbGRzIHNpbXBsaWZpZXMgc29mdHdhcmUgZW5kaWFuIGNvcnJlY3Rpb24uCisgICBUaGlzIHN0cnVjdHVyZSBtdXN0IGJlIGFsaWduZWQsIGFuZCBzaG91bGQgYXZvaWQgc3Bhbm5pbmcgY2FjaGUgbGluZXMuCisqLworc3RydWN0IG5ldGRldl9kZXNjIHsKKwl1MzIgbmV4dF9kZXNjOworCXUzMiBzdGF0dXM7CisJdTMyIGFkZHI7CisJdTMyIGxlbmd0aDsKK307CisKKy8qIEJpdHMgaW4gbmV0ZGV2X2Rlc2Muc3RhdHVzICovCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeworCURlc2NPd24gPSAweDgwMDAsCisJRGVzY0VuZFBhY2tldCA9IDB4NDAwMCwKKwlEZXNjRW5kUmluZyA9IDB4MjAwMCwKKwlMYXN0RnJhZyA9IDB4ODAwMDAwMDAsCisJRGVzY0ludHJPblR4ID0gMHg4MDAwLAorCURlc2NJbnRyT25ETUFEb25lID0gMHg4MDAwMDAwMCwKKwlEaXNhYmxlQWxpZ24gPSAweDAwMDAwMDAxLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGVzY3JpcHRvciBSaW5nIGFuZCBCdWZmZXIgZGVmaW5hdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZWZpbmUgdGhlIFRYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0ZGV2X2Rlc2MgdHhfcmluZ1tUWF9SSU5HX1NJWkVdOworCisvKiBEZWZpbmUgdGhlIFJYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0ZGV2X2Rlc2MgcnhfcmluZ1tSWF9SSU5HX1NJWkVdOworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUEtUX0JVRl9TWiBmb3IgZWFjaCBSWCBhbmQgVFggZGVzY3JpcHRvci4KKyAgIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhIHBhcnQgb2YgdGhpcyBidWZmZXIgKi8KK3N0cnVjdCB7CisJdW5zaWduZWQgY2hhciB0eGJbUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRV07CisJdW5zaWduZWQgY2hhciByeGJbUlhfUklOR19TSVpFICogUEtUX0JVRl9TWl07Cit9IHJ4X3R4X2J1ZiBfX3NoYXJlZDsKKyNkZWZpbmUgcnhiIHJ4X3R4X2J1Zi5yeGIKKyNkZWZpbmUgdHhiIHJ4X3R4X2J1Zi50eGIKKworLyogRklYTUU6IE1vdmUgQkFTRSB0byB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyB1MzIgQkFTRTsKKyNkZWZpbmUgRUVQUk9NX1NJWkUJMTI4CisKK2VudW0gcGNpX2lkX2ZsYWdzX2JpdHMgeworCVBDSV9VU0VTX0lPID0gMSwgUENJX1VTRVNfTUVNID0gMiwgUENJX1VTRVNfTUFTVEVSID0gNCwKKwlQQ0lfQUREUjAgPSAwIDw8IDQsIFBDSV9BRERSMSA9IDEgPDwgNCwgUENJX0FERFIyID0KKwkgICAgMiA8PCA0LCBQQ0lfQUREUjMgPSAzIDw8IDQsCit9OworCitlbnVtIGNoaXBfY2FwYWJpbGl0eV9mbGFncyB7IENhbkhhdmVNSUkgPSAxLCBLZW5kaW5Qa3REcm9wQnVnID0gMiwgfTsKKyNkZWZpbmUgUENJX0lPVFlQRSAoUENJX1VTRVNfTUFTVEVSIHwgUENJX1VTRVNfSU8gIHwgUENJX0FERFIwKQorCisjZGVmaW5lIE1JSV9DTlQJCTQKK3N0YXRpYyBzdHJ1Y3Qgc3VuZGFuY2VfcHJpdmF0ZSB7CisJY29uc3QgY2hhciAqbmljX25hbWU7CisJLyogRnJlcXVlbnRseSB1c2VkIHZhbHVlcyAqLworCisJdW5zaWduZWQgaW50IGN1cl9yeDsJLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2llcyAqLworCXVuc2lnbmVkIGludCBtdHU7CisKKwkvKiBUaGVzZSB2YWx1ZXMga2VlcCB0cmFjayBvZiB0aGUgdHJhbmNlaXZlci9tZWRpYSBpbiB1c2UgKi8KKwl1bnNpZ25lZCBpbnQgZmxvd2N0cmw6MTsKKwl1bnNpZ25lZCBpbnQgYW5fZW5hYmxlOjE7CisKKwl1bnNpZ25lZCBpbnQgc3BlZWQ7CisKKwkvKiBNSUkgdHJhbmNlaXZlciBzZWN0aW9uICovCisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsKKwlpbnQgbWlpX3ByZWFtYmxlX3JlcXVpcmVkOworCXVuc2lnbmVkIGNoYXIgcGh5c1tNSUlfQ05UXTsKKwl1bnNpZ25lZCBjaGFyIHBjaV9yZXZfaWQ7Cit9IHNkeDsKKworc3RhdGljIHN0cnVjdCBzdW5kYW5jZV9wcml2YXRlICpzZGM7CisKKy8qIFN0YXRpb24gQWRkcmVzcyBsb2NhdGlvbiB3aXRoaW4gdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fU0FfT0ZGU0VUCTB4MTAKKyNkZWZpbmUgREVGQVVMVF9JTlRSIChJbnRyUnhETUFEb25lIHwgSW50clBDSUVyciB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludHJEcnZScXN0IHwgSW50clR4RG9uZSB8IFN0YXRzTWF4IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgTGlua0NoYW5nZSkKKworc3RhdGljIGludCBlZXByb21fcmVhZChsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9pZCwgdW5zaWduZWQgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2lkLCB1bnNpZ25lZCBpbnQgbG9jYXRpb24sCisJCSAgICAgICBpbnQgdmFsdWUpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5pYyAqbmljKTsKKworc3RhdGljIHZvaWQgY2hlY2tfZHVwbGV4KHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgbWlpX2xwYSA9IG1kaW9fcmVhZChuaWMsIHNkYy0+cGh5c1swXSwgTUlJX0xQQSk7CisJaW50IG5lZ290aWF0ZWQgPSBtaWlfbHBhICYgc2RjLT5taWlfaWYuYWR2ZXJ0aXNpbmc7CisJaW50IGR1cGxleDsKKworCS8qIEZvcmNlIG1lZGlhICovCisJaWYgKCFzZGMtPmFuX2VuYWJsZSB8fCBtaWlfbHBhID09IDB4ZmZmZikgeworCQlpZiAoc2RjLT5taWlfaWYuZnVsbF9kdXBsZXgpCisJCQlvdXR3KGludyhCQVNFICsgTUFDQ3RybDApIHwgRW5iRnVsbER1cGxleCwKKwkJCSAgICAgQkFTRSArIE1BQ0N0cmwwKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEF1dG9uZWdvdGlhdGlvbiAqLworCWR1cGxleCA9IChuZWdvdGlhdGVkICYgMHgwMTAwKSB8fCAobmVnb3RpYXRlZCAmIDB4MDFDMCkgPT0gMHgwMDQwOworCWlmIChzZGMtPm1paV9pZi5mdWxsX2R1cGxleCAhPSBkdXBsZXgpIHsKKwkJc2RjLT5taWlfaWYuZnVsbF9kdXBsZXggPSBkdXBsZXg7CisJCURCRyAoIiVzOiBTZXR0aW5nICVzLWR1cGxleCBiYXNlZCBvbiBNSUkgIyVkICIKKwkJCSAibmVnb3RpYXRlZCBjYXBhYmlsaXR5ICU0LjR4LlxuIiwgc2RjLT5uaWNfbmFtZSwKKwkJCSBkdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsIHNkYy0+cGh5c1swXSwKKwkJCSBuZWdvdGlhdGVkICk7CisJCW91dHcoaW53KEJBU0UgKyBNQUNDdHJsMCkgfCBkdXBsZXggPyAweDIwIDogMCwKKwkJICAgICBCQVNFICsgTUFDQ3RybDApOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBpbml0X3JpbmcgLSBzZXR1cCB0aGUgdHggYW5kIHJ4IGRlc2NyaXB0b3JzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGluaXRfcmluZyhzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJaW50IGk7CisKKwlzZGMtPmN1cl9yeCA9IDA7CisKKwkvKiBJbml0aWFsaXplIGFsbCB0aGUgUnggZGVzY3JpcHRvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJcnhfcmluZ1tpXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nW2kgKyAxXSk7CisJCXJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJcnhfcmluZ1tpXS5sZW5ndGggPSAwOworCQlyeF9yaW5nW2ldLmFkZHIgPSAwOworCX0KKworCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcgKi8KKwlyeF9yaW5nW2kgLSAxXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlyeF9yaW5nW2ldLmFkZHIgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeGJbaSAqIFBLVF9CVUZfU1pdKTsKKwkJcnhfcmluZ1tpXS5sZW5ndGggPSBjcHVfdG9fbGUzMihQS1RfQlVGX1NaIHwgTGFzdEZyYWcpOworCX0KKworCS8qIFdlIG9ubHkgdXNlIG9uZSB0cmFuc21pdCBidWZmZXIsIGJ1dCB0d28KKwkgKiBkZXNjcmlwdG9ycyBzbyB0cmFuc21pdCBlbmdpbmVzIGhhdmUgc29tZXdoZXJlCisJICogdG8gcG9pbnQgc2hvdWxkIHRoZXkgZmVlbCB0aGUgbmVlZCAqLworCXR4X3JpbmdbMF0uc3RhdHVzID0gMHgwMDAwMDAwMDsKKwl0eF9yaW5nWzBdLmFkZHIgPSB2aXJ0X3RvX2J1cygmdHhiWzBdKTsKKwl0eF9yaW5nWzBdLm5leHRfZGVzYyA9IDA7CS8qIHZpcnRfdG9fYnVzKCZ0eF9yaW5nWzFdKTsgKi8KKworCS8qIFRoaXMgZGVzY3JpcHRvciBpcyBuZXZlciB1c2VkICovCisJdHhfcmluZ1sxXS5zdGF0dXMgPSAweDAwMDAwMDAwOworCXR4X3JpbmdbMV0uYWRkciA9IDA7CS8qdmlydF90b19idXMoJnR4YlswXSk7ICovCisJdHhfcmluZ1sxXS5uZXh0X2Rlc2MgPSAwOworCisJLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZywKKwkgKiB0aG91Z2ggdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJdHhfcmluZ1sxXS5sZW5ndGggPSBjcHVfdG9fbGUzMihMYXN0RnJhZyB8IFBLVF9CVUZfU1opOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBSRVNFVCAtIFJlc2V0IEFkYXB0ZXIKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc3VuZGFuY2VfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCWludCBpOworCisJaW5pdF9yaW5nKG5pYyk7CisKKwlvdXRsKHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbMF0pLCBCQVNFICsgUnhMaXN0UHRyKTsKKwkvKiBUaGUgVHggTGlzdCBQb2ludGVyIGlzIHdyaXR0ZW4gYXMgcGFja2V0cyBhcmUgcXVldWVkICovCisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKwkvKiBfX3NldF9tYWNfYWRkcihkZXYpOyAqLworCXsKKwkJdTE2IGFkZHIxNjsKKworCQlhZGRyMTYgPSAobmljLT5ub2RlX2FkZHJbMF0gfCAobmljLT5ub2RlX2FkZHJbMV0gPDwgOCkpOworCQlvdXR3KGFkZHIxNiwgQkFTRSArIFN0YXRpb25BZGRyKTsKKwkJYWRkcjE2ID0gKG5pYy0+bm9kZV9hZGRyWzJdIHwgKG5pYy0+bm9kZV9hZGRyWzNdIDw8IDgpKTsKKwkJb3V0dyhhZGRyMTYsIEJBU0UgKyBTdGF0aW9uQWRkciArIDIpOworCQlhZGRyMTYgPSAobmljLT5ub2RlX2FkZHJbNF0gfCAobmljLT5ub2RlX2FkZHJbNV0gPDwgOCkpOworCQlvdXR3KGFkZHIxNiwgQkFTRSArIFN0YXRpb25BZGRyICsgNCk7CisJfQorCisJb3V0dyhzZGMtPm10dSArIDE0LCBCQVNFICsgTWF4RnJhbWVTaXplKTsKKwlpZiAoc2RjLT5tdHUgPiAyMDQ3KQkvKiB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIHdpdGggZGVmYXVsdCBvcHRpb25zICovCisJCW91dGwoaW5sKEJBU0UgKyBBU0lDQ3RybCkgfCAweDBjLCBCQVNFICsgQVNJQ0N0cmwpOworCisJc2V0X3J4X21vZGUobmljKTsKKworCW91dHcoMCwgQkFTRSArIERvd25Db3VudGVyKTsKKwkvKiBTZXQgdGhlIGNoaXAgdG8gcG9sbCBldmVyeSBOKjMwbnNlYyAqLworCW91dGIoMTAwLCBCQVNFICsgUnhETUFQb2xsUGVyaW9kKTsKKworCS8qIEZpeCBERkUtNTgwVFggcGFja2V0IGRyb3AgaXNzdWUgKi8KKwlpZiAoc2RjLT5wY2lfcmV2X2lkID49IDB4MTQpCisJCXdyaXRlYigweDAxLCBCQVNFICsgRGVidWdDdHJsMSk7CisKKwlvdXR3KFJ4RW5hYmxlIHwgVHhFbmFibGUsIEJBU0UgKyBNQUNDdHJsMSk7CisKKwkvKiBDb25zdHJ1Y3QgYSBwZXJmZWN0IGZpbHRlciBmcmFtZSB3aXRoIHRoZSBtYWMgYWRkcmVzcyBhcyBmaXJzdCBtYXRjaAorCSAqIGFuZCBicm9hZGNhc3QgZm9yIGFsbCBvdGhlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTkyOyBpKyspCisJCXR4YltpXSA9IDB4RkY7CisKKwl0eGJbMF0gPSBuaWMtPm5vZGVfYWRkclswXTsKKwl0eGJbMV0gPSBuaWMtPm5vZGVfYWRkclsxXTsKKwl0eGJbMl0gPSBuaWMtPm5vZGVfYWRkclsyXTsKKwl0eGJbM10gPSBuaWMtPm5vZGVfYWRkclszXTsKKwl0eGJbNF0gPSBuaWMtPm5vZGVfYWRkcls0XTsKKwl0eGJbNV0gPSBuaWMtPm5vZGVfYWRkcls1XTsKKworCURCRyAoICIlczogRG9uZSBzdW5kYW5jZV9yZXNldCwgc3RhdHVzOiBSeCAlaFggVHggJWhYICIKKwkgICAgICAiTUFDIENvbnRyb2wgJWhYLCAlaFggJWhYXG4iLAorCSAgICAgIHNkYy0+bmljX25hbWUsIChpbnQpIGlubChCQVNFICsgUnhTdGF0dXMpLAorCSAgICAgIChpbnQpIGludyhCQVNFICsgVHhTdGF0dXMpLCAoaW50KSBpbmwoQkFTRSArIE1BQ0N0cmwwKSwKKwkgICAgICAoaW50KSBpbncoQkFTRSArIE1BQ0N0cmwxKSwgKGludCkgaW53KEJBU0UgKyBNQUNDdHJsMCkgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJUlEgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzdW5kYW5jZV9pcnEgKCBzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24gKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBpbnRyX3N0YXR1czsKKworCXN3aXRjaCAoIGFjdGlvbiApIHsKKwljYXNlIERJU0FCTEUgOgorCWNhc2UgRU5BQkxFIDoKKwkJaW50cl9zdGF0dXMgPSBpbncobmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsKKwkJaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1cyAmIH5ERUZBVUxUX0lOVFI7CisJCWlmICggYWN0aW9uID09IEVOQUJMRSApIAorCQkJaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1cyB8IERFRkFVTFRfSU5UUjsKKwkJb3V0dyhpbnRyX3N0YXR1cywgbmljLT5pb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgRk9SQ0UgOgorCQlvdXR3KDB4MDIwMCwgQkFTRSArIEFTSUNDdHJsKTsKKwkJYnJlYWs7CisgICAgICAgIH0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgc3VuZGFuY2VfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyZWl2ZSkKK3sKKwkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCisJLyogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4gKi8KKwkvKiBuaWMtPnBhY2tldGxlbiBzaG91bGQgY29udGFpbiBsZW5ndGggb2YgZGF0YSAqLworCWludCBlbnRyeSA9IHNkYy0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCXUzMiBmcmFtZV9zdGF0dXMgPSBsZTMyX3RvX2NwdShyeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCWludCBpbnRyX3N0YXR1czsKKwlpbnQgcGt0X2xlbiA9IDA7CisKKwlpZiAoIShmcmFtZV9zdGF0dXMgJiBEZXNjT3duKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBUaGVyZSBpcyBhIHBhY2tldCByZWFkeSAqLworCWlmKCFyZXRyZWl2ZSkKKwkJcmV0dXJuIDE7CisKKwlpbnRyX3N0YXR1cyA9IGludyhuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOworCW91dHcoaW50cl9zdGF0dXMsIG5pYy0+aW9hZGRyICsgSW50clN0YXR1cyk7CisKKwlwa3RfbGVuID0gZnJhbWVfc3RhdHVzICYgMHgxZmZmOworCisJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAxZjQwMDApIHsKKwkJREJHICggIlBvbGxpbmcgZnJhbWVfc3RhdHVzIGVycm9yXG4iICk7CS8qIERvIHdlIHJlYWxseSBjYXJlIGFib3V0IHRoaXMgKi8KKwl9IGVsc2UgeworCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhaykgeworCQkJLyogRklYTUU6IFdoYXQgc2hvdWxkIGhhcHBlbiBXaWxsIHRoaXMgZXZlciBvY2N1ciAqLworCQkJcHJpbnRmKCJQb2xsIEVycm9yOiBwa3RfbGVuIDwgcnhfY29weWJyZWFrIik7CisJCX0gZWxzZSB7CisJCQluaWMtPnBhY2tldGxlbiA9IHBrdF9sZW47CisJCQltZW1jcHkobmljLT5wYWNrZXQsIHJ4YiArCisJCQkgICAgICAgKHNkYy0+Y3VyX3J4ICogUEtUX0JVRl9TWiksIG5pYy0+cGFja2V0bGVuKTsKKworCQl9CisJfQorCXJ4X3JpbmdbZW50cnldLmxlbmd0aCA9IGNwdV90b19sZTMyKFBLVF9CVUZfU1ogfCBMYXN0RnJhZyk7CisJcnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsKKwllbnRyeSsrOworCXNkYy0+Y3VyX3J4ID0gZW50cnkgJSBSWF9SSU5HX1NJWkU7CisJb3V0dyhERUZBVUxUX0lOVFIgJiB+KEludHJSeERvbmV8SW50clJ4RE1BRG9uZSksIAorCQluaWMtPmlvYWRkciArIEludHJTdGF0dXMpOworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc3VuZGFuY2VfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLAkvKiBEZXN0aW5hdGlvbiAqLworCQkJICAgICAgdW5zaWduZWQgaW50IHQsCS8qIFR5cGUgKi8KKwkJCSAgICAgIHVuc2lnbmVkIGludCBzLAkvKiBzaXplICovCisJCQkgICAgICBjb25zdCBjaGFyICpwKQorewkJCQkvKiBQYWNrZXQgKi8KKwl1MTYgbnN0eXBlOworCXUzMiB0bzsKKworCS8qIERpc2FibGUgdGhlIFR4ICovCisJb3V0dyhUeERpc2FibGUsIEJBU0UgKyBNQUNDdHJsMSk7CisKKwltZW1jcHkodHhiLCBkLCBFVEhfQUxFTik7CisJbWVtY3B5KHR4YiArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCW5zdHlwZSA9IGh0b25zKCh1MTYpIHQpOworCW1lbWNweSh0eGIgKyAyICogRVRIX0FMRU4sICh1OCAqKSAmIG5zdHlwZSwgMik7CisJbWVtY3B5KHR4YiArIEVUSF9ITEVOLCBwLCBzKTsKKworCXMgKz0gRVRIX0hMRU47CisJcyAmPSAweDBGRkY7CisJd2hpbGUgKHMgPCBFVEhfWkxFTikKKwkJdHhiW3MrK10gPSAnXDAnOworCisJLyogU2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKwl0eF9yaW5nWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKHMgfCBMYXN0RnJhZyk7CisJdHhfcmluZ1swXS5zdGF0dXMgPSBjcHVfdG9fbGUzMigweDAwMDAwMDAxKTsKKworCS8qIFBvaW50IHRvIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKwlvdXRsKHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMF0pLCBCQVNFICsgVHhMaXN0UHRyKTsKKworCS8qIEVuYWJsZSBUeCAqLworCW91dHcoVHhFbmFibGUsIEJBU0UgKyBNQUNDdHJsMSk7CisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCAqLworCW91dHcoMCwgQkFTRSArIFR4U3RhdHVzKTsKKworCXRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FX09VVDsKKwl3aGlsZSAoISh0eF9yaW5nWzBdLnN0YXR1cyAmIDB4MDAwMTAwMDApICYmIChjdXJydGlja3MoKSA8IHRvKSk7CS8qIHdhaXQgKi8KKworCWlmIChjdXJydGlja3MoKSA+PSB0bykgeworCQlwcmludGYoIlRYIFRpbWUgT3V0Iik7CisJfQorCS8qIERpc2FibGUgVHggKi8KKwlvdXR3KFR4RGlzYWJsZSwgQkFTRSArIE1BQ0N0cmwxKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHN1bmRhbmNlX2Rpc2FibGUgKCBzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQgKSB7CisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJLyogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgMyBwdXJwb3Nlcy4KKwkgKiBUaGlzIGRpc2FibGVzIERNQSBhbmQgaW50ZXJydXB0cyBzbyB3ZSBkb24ndCByZWNlaXZlCisJICogIHVuZXhwZWN0ZWQgcGFja2V0cyBvciBpbnRlcnJ1cHRzIGZyb20gdGhlIGNhcmQgYWZ0ZXIKKwkgKiAgZXRoZXJib290IGhhcyBmaW5pc2hlZC4KKwkgKiBUaGlzIGZyZWVzIHJlc291cmNlcyBzbyBldGhlcmJvb3QgbWF5IHVzZQorCSAqICB0aGlzIGRyaXZlciBvbiBhbm90aGVyIGludGVyZmFjZQorCSAqIFRoaXMgYWxsb3dzIGV0aGVyYm9vdCB0byByZWluaXRpYWxpemUgdGhlIGludGVyZmFjZQorCSAqICBpZiBzb21ldGhpbmcgaXMgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisJICovCisJb3V0dygweDAwMDAsIEJBU0UgKyBJbnRyRW5hYmxlKTsKKwkvKiBTdG9wIHRoZSBDaGlwY2hpcHMgVHggYW5kIFJ4IFN0YXR1cyAqLworCW91dHcoVHhEaXNhYmxlIHwgUnhEaXNhYmxlIHwgU3RhdHNEaXNhYmxlLCBCQVNFICsgTUFDQ3RybDEpOworfQorCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIHN1bmRhbmNlX29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QJPSBkdW1teV9jb25uZWN0LAorCS5wb2xsCQk9IHN1bmRhbmNlX3BvbGwsCisJLnRyYW5zbWl0CT0gc3VuZGFuY2VfdHJhbnNtaXQsCisJLmlycQkJPSBzdW5kYW5jZV9pcnEsCisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHN1bmRhbmNlX3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCisJdTggZWVfZGF0YVtFRVBST01fU0laRV07CisJdTE2IG1paV9jdGw7CisJaW50IGk7CisJaW50IHNwZWVkOworCisJaWYgKHBjaS0+aW9hZGRyID09IDApCisJCXJldHVybiAwOworCisJLyogQkFTRSBpcyB1c2VkIHRocm91Z2hvdXQgdG8gYWRkcmVzcyB0aGUgY2FyZCAqLworCUJBU0UgPSBwY2ktPmlvYWRkcjsKKwlwcmludGYoIiBzdW5kYW5jZS5jOiBGb3VuZCAlcyBWZW5kb3I9MHglaFggRGV2aWNlPTB4JWhYXG4iLAorCSAgICAgICBwY2ktPmRyaXZlcl9uYW1lLCBwY2ktPnZlbmRvciwgcGNpLT5kZXZpY2UpOworCisJLyogR2V0IHRoZSBNQUMgQWRkcmVzcyBieSByZWFkaW5nIHRoZSBFRVBST00gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCSgodTE2ICopIGVlX2RhdGEpW2ldID0KKwkJICAgIGxlMTZfdG9fY3B1KGVlcHJvbV9yZWFkKEJBU0UsIGkgKyBFRVBST01fU0FfT0ZGU0VUKSk7CisJfQorCS8qIFVwZGF0ZSB0aGUgbmljIHN0cnVjdHVyZSB3aXRoIHRoZSBNQUMgQWRkcmVzcyAqLworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCW5pYy0+bm9kZV9hZGRyW2ldID0gZWVfZGF0YVtpXTsKKwl9CisKKwkvKiBTZXQgdGhlIGNhcmQgYXMgUENJIEJ1cyBNYXN0ZXIgKi8KKwlhZGp1c3RfcGNpX2RldmljZShwY2kpOworCisvLyAgICAgIHNkYy0+bWlpX2lmLmRldiA9IHBjaTsKKy8vICAgICAgc2RjLT5taWlfaWYucGh5X2lkX21hc2sgPSAweDFmOworLy8gICAgICBzZGMtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworCisJLyogcG9pbnQgdG8gcHJpdmF0ZSBzdG9yYWdlICovCisJc2RjID0gJnNkeDsKKworCXNkYy0+bmljX25hbWUgPSBwY2ktPmRyaXZlcl9uYW1lOworCXNkYy0+bXR1ID0gbXR1OworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lfUkVWSVNJT05fSUQsICZzZGMtPnBjaV9yZXZfaWQpOworCisJREJHICggIkRldmljZSByZXZpc2lvbiBpZDogJWh4XG4iLCBzZGMtPnBjaV9yZXZfaWQgKTsKKworCS8qIFByaW50IG91dCBzb21lIGhhcmR3YXJlIGluZm8gKi8KKwlEQkcgKCAiJXM6ICVzIGF0IGlvYWRkciAlaFgsICIsIHBjaS0+ZHJpdmVyX25hbWUsIG5pYy0+bm9kZV9hZGRyLCAodW5zaWduZWQgaW50KSBCQVNFKTsKKworCXNkYy0+bWlpX3ByZWFtYmxlX3JlcXVpcmVkID0gMDsKKwlpZiAoMSkgeworCQlpbnQgcGh5LCBwaHlfaWR4ID0gMDsKKwkJc2RjLT5waHlzWzBdID0gMTsJLyogRGVmYXVsdCBTZXR0aW5nICovCisJCXNkYy0+bWlpX3ByZWFtYmxlX3JlcXVpcmVkKys7CisJCWZvciAocGh5ID0gMTsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IE1JSV9DTlQ7IHBoeSsrKSB7CisJCQlpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChuaWMsIHBoeSwgTUlJX0JNU1IpOworCQkJaWYgKG1paV9zdGF0dXMgIT0gMHhmZmZmICYmIG1paV9zdGF0dXMgIT0gMHgwMDAwKSB7CisJCQkJc2RjLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJc2RjLT5taWlfaWYuYWR2ZXJ0aXNpbmcgPQorCQkJCSAgICBtZGlvX3JlYWQobmljLCBwaHksIE1JSV9BRFZFUlRJU0UpOworCQkJCWlmICgobWlpX3N0YXR1cyAmIDB4MDA0MCkgPT0gMCkKKwkJCQkJc2RjLT5taWlfcHJlYW1ibGVfcmVxdWlyZWQrKzsKKwkJCQlEQkcgCisJCQkJICAgICggIiVzOiBNSUkgUEhZIGZvdW5kIGF0IGFkZHJlc3MgJWQsIHN0YXR1cyAiICIlaFggYWR2ZXJ0aXNpbmcgJWhYXG4iLCBzZGMtPm5pY19uYW1lLCBwaHksIG1paV9zdGF0dXMsIHNkYy0+bWlpX2lmLmFkdmVydGlzaW5nICk7CisJCQl9CisJCX0KKwkJc2RjLT5taWlfcHJlYW1ibGVfcmVxdWlyZWQtLTsKKwkJaWYgKHBoeV9pZHggPT0gMCkKKwkJCXByaW50ZigiJXM6IE5vIE1JSSB0cmFuc2NlaXZlciBmb3VuZCFcbiIsCisJCQkgICAgICAgc2RjLT5uaWNfbmFtZSk7CisJCXNkYy0+bWlpX2lmLnBoeV9pZCA9IHNkYy0+cGh5c1swXTsKKwl9CisKKwkvKiBQYXJzZSBvdmVycmlkZSBjb25maWd1cmF0aW9uICovCisJc2RjLT5hbl9lbmFibGUgPSAxOworCWlmIChzdHJjYXNlY21wKG1lZGlhLCAiYXV0b3NlbnNlIikgIT0gMCkgeworCQlzZGMtPmFuX2VuYWJsZSA9IDA7CisJCWlmIChzdHJjYXNlY21wKG1lZGlhLCAiMTAwbWJwc19mZCIpID09IDAgfHwKKwkJICAgIHN0cmNhc2VjbXAobWVkaWEsICI0IikgPT0gMCkgeworCQkJc2RjLT5zcGVlZCA9IDEwMDsKKwkJCXNkYy0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjYXNlY21wKG1lZGlhLCAiMTAwbWJwc19oZCIpID09IDAKKwkJCSAgIHx8IHN0cmNhc2VjbXAobWVkaWEsICIzIikgPT0gMCkgeworCQkJc2RjLT5zcGVlZCA9IDEwMDsKKwkJCXNkYy0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMDsKKwkJfSBlbHNlIGlmIChzdHJjYXNlY21wKG1lZGlhLCAiMTBtYnBzX2ZkIikgPT0gMCB8fAorCQkJICAgc3RyY2FzZWNtcChtZWRpYSwgIjIiKSA9PSAwKSB7CisJCQlzZGMtPnNwZWVkID0gMTA7CisJCQlzZGMtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisJCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChtZWRpYSwgIjEwbWJwc19oZCIpID09IDAgfHwKKwkJCSAgIHN0cmNhc2VjbXAobWVkaWEsICIxIikgPT0gMCkgeworCQkJc2RjLT5zcGVlZCA9IDEwOworCQkJc2RjLT5taWlfaWYuZnVsbF9kdXBsZXggPSAwOworCQl9IGVsc2UgeworCQkJc2RjLT5hbl9lbmFibGUgPSAxOworCQl9CisJfQorCWlmIChmbG93Y3RybCA9PSAxKQorCQlzZGMtPmZsb3djdHJsID0gMTsKKworCS8qIEZpYnJlIFBIWT8gKi8KKwlpZiAoaW5sKEJBU0UgKyBBU0lDQ3RybCkgJiAweDgwKSB7CisJCS8qIERlZmF1bHQgMTAwTWJwcyBGdWxsICovCisJCWlmIChzZGMtPmFuX2VuYWJsZSkgeworCQkJc2RjLT5zcGVlZCA9IDEwMDsKKwkJCXNkYy0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKwkJCXNkYy0+YW5fZW5hYmxlID0gMDsKKwkJfQorCX0KKworCS8qIFRoZSBMaW51eCBkcml2ZXIgdXNlcyBmbG93IGNvbnRyb2wgYW5kIHJlc2V0cyB0aGUgbGluayBoZXJlLiAgVGhpcyBtZWFucyB0aGUKKwkgICBtaWkgc2VjdGlvbiBmcm9tIGFib3ZlIHdvdWxkIG5lZWQgdG8gYmUgcmUgZG9uZSBJIGJlbGlldmUuICBTaW5jZSBpdCBzZXJ2ZXMKKwkgICBubyByZWFsIHB1cnBvc2UgbGVhdmUgaXQgb3V0LiAqLworCisJLyogRm9yY2UgbWVkaWEgdHlwZSAqLworCWlmICghc2RjLT5hbl9lbmFibGUpIHsKKwkJbWlpX2N0bCA9IDA7CisJCW1paV9jdGwgfD0gKHNkYy0+c3BlZWQgPT0gMTAwKSA/IEJNQ1JfU1BFRUQxMDAgOiAwOworCQltaWlfY3RsIHw9IChzZGMtPm1paV9pZi5mdWxsX2R1cGxleCkgPyBCTUNSX0ZVTExEUExYIDogMDsKKwkJbWRpb193cml0ZShuaWMsIHNkYy0+cGh5c1swXSwgTUlJX0JNQ1IsIG1paV9jdGwpOworCQlwcmludGYoIk92ZXJyaWRlIHNwZWVkPSVkLCAlcyBkdXBsZXhcbiIsCisJCSAgICAgICBzZGMtPnNwZWVkLAorCQkgICAgICAgc2RjLT5taWlfaWYuZnVsbF9kdXBsZXggPyAiRnVsbCIgOiAiSGFsZiIpOworCX0KKworCS8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24gKi8KKwlEQkcgKCAiQVNJQyBDb250cm9sIGlzICUjeFxuIiwgaW5sKEJBU0UgKyBBU0lDQ3RybCkgKTsKKwlvdXR3KDB4MDA3ZiwgQkFTRSArIEFTSUNDdHJsICsgMik7CisKKwkvKgorCSogd2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUKKwkqIHRoaXMgaXMgaGVhdmlseSBpbnNwaXJlZCBieSB0aGUgbGludXggc3VuZGFuY2UgZHJpdmVyCisJKiBhY2NvcmRpbmcgdG8gdGhlIGxpbnV4IGRyaXZlciBpdCBjYW4gdGFrZSB1cCB0byAxbXMgZm9yIHRoZSByZXNldAorCSogdG8gY29tcGxldGUKKwkqLworCWkgPSAwOworCXdoaWxlKGlubChCQVNFICsgQVNJQ0N0cmwpICYgKFJlc2V0QnVzeSA8PCAxNikpIHsKKwkJaWYoaSsrID49IDEwKSB7CisJCQlEQkcoInN1bmRhbmNlOiBOSUMgcmVzZXQgZGlkIG5vdCBjb21wbGV0ZS5cbiIpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCisJREJHICggIkFTSUMgQ29udHJvbCBpcyBub3cgJSN4LlxuIiwgaW5sKEJBU0UgKyBBU0lDQ3RybCkgKTsKKworCXN1bmRhbmNlX3Jlc2V0KG5pYyk7CisJaWYgKHNkYy0+YW5fZW5hYmxlKSB7CisJCXUxNiBtaWlfYWR2ZXJ0aXNlLCBtaWlfbHBhOworCQltaWlfYWR2ZXJ0aXNlID0KKwkJICAgIG1kaW9fcmVhZChuaWMsIHNkYy0+cGh5c1swXSwgTUlJX0FEVkVSVElTRSk7CisJCW1paV9scGEgPSBtZGlvX3JlYWQobmljLCBzZGMtPnBoeXNbMF0sIE1JSV9MUEEpOworCQltaWlfYWR2ZXJ0aXNlICY9IG1paV9scGE7CisJCWlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwMEZVTEwpCisJCQlzZGMtPnNwZWVkID0gMTAwOworCQllbHNlIGlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwMEhBTEYpCisJCQlzZGMtPnNwZWVkID0gMTAwOworCQllbHNlIGlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwRlVMTCkKKwkJCXNkYy0+c3BlZWQgPSAxMDsKKwkJZWxzZSBpZiAobWlpX2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMEhBTEYpCisJCQlzZGMtPnNwZWVkID0gMTA7CisJfSBlbHNlIHsKKwkJbWlpX2N0bCA9IG1kaW9fcmVhZChuaWMsIHNkYy0+cGh5c1swXSwgTUlJX0JNQ1IpOworCQlzcGVlZCA9IChtaWlfY3RsICYgQk1DUl9TUEVFRDEwMCkgPyAxMDAgOiAxMDsKKwkJc2RjLT5zcGVlZCA9IHNwZWVkOworCQlwcmludGYoIiVzOiBMaW5rIGNoYW5nZWQ6ICVkTWJwcyAsIiwgc2RjLT5uaWNfbmFtZSwgc3BlZWQpOworCQlwcmludGYoIiVzIGR1cGxleC5cbiIsIChtaWlfY3RsICYgQk1DUl9GVUxMRFBMWCkgPworCQkgICAgICAgImZ1bGwiIDogImhhbGYiKTsKKwl9CisJY2hlY2tfZHVwbGV4KG5pYyk7CisJaWYgKHNkYy0+Zmxvd2N0cmwgJiYgc2RjLT5taWlfaWYuZnVsbF9kdXBsZXgpIHsKKwkJb3V0dyhpbncoQkFTRSArIE11bHRpY2FzdEZpbHRlcjEgKyAyKSB8IDB4MDIwMCwKKwkJICAgICBCQVNFICsgTXVsdGljYXN0RmlsdGVyMSArIDIpOworCQlvdXR3KGludyhCQVNFICsgTUFDQ3RybDApIHwgRW5iRmxvd0N0cmwsIEJBU0UgKyBNQUNDdHJsMCk7CisJfQorCXByaW50ZigiJWRNYnBzLCAlcy1EdXBsZXhcbiIsIHNkYy0+c3BlZWQsCisJICAgICAgIHNkYy0+bWlpX2lmLmZ1bGxfZHVwbGV4ID8gIkZ1bGwiIDogIkhhbGYiKTsKKworCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCW5pYy0+bmljX29wCT0gJnN1bmRhbmNlX29wZXJhdGlvbnM7CisKKwluaWMtPmlycW5vICA9IHBjaS0+aXJxOworCW5pYy0+aW9hZGRyID0gQkFTRTsKKworCXJldHVybiAxOworfQorCisKKy8qIFJlYWQgdGhlIEVFUFJPTSBhbmQgTUlJIE1hbmFnZW1lbnQgRGF0YSBJL08gKE1ESU8pIGludGVyZmFjZXMuICovCitzdGF0aWMgaW50IGVlcHJvbV9yZWFkKGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGJvZ3VzY250ID0gMTAwMDA7CS8qIFR5cGljYWwgMTkwMCB0aWNrcyAqLworCW91dHcoMHgwMjAwIHwgKGxvY2F0aW9uICYgMHhmZiksIGlvYWRkciArIEVFQ3RybCk7CisJZG8geworCQlpZiAoIShpbncoaW9hZGRyICsgRUVDdHJsKSAmIDB4ODAwMCkpIHsKKwkJCXJldHVybiBpbncoaW9hZGRyICsgRUVEYXRhKTsKKwkJfQorCX0KKwl3aGlsZSAoLS1ib2d1c2NudCA+IDApOworCXJldHVybiAwOworfQorCisvKiAgTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKwlSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQgc2VyaWFsCisJTURJTyBwcm90b2NvbC4gIFNlZSB0aGUgTUlJIHNwZWNpZmljYXRpb25zIG9yIERQODM4NDBBIGRhdGEgc2hlZXQKKwlmb3IgZGV0YWlscy4KKworCVRoZSBtYXhpbXVtIGRhdGEgY2xvY2sgcmF0ZSBpcyAyLjUgTWh6LgorCVRoZSB0aW1pbmcgaXMgZGVjb3VwbGVkIGZyb20gdGhlIHByb2Nlc3NvciBjbG9jayBieSBmbHVzaGluZyB0aGUgd3JpdGUKKwlmcm9tIHRoZSBDUFUgd3JpdGUgYnVmZmVyIHdpdGggYSBmb2xsb3dpbmcgcmVhZCwgYW5kIHVzaW5nIFBDSQorCXRyYW5zYWN0aW9uIHRpbWUuICovCisKKyNkZWZpbmUgbWRpb19pbihtZGlvX2FkZHIpIGluYihtZGlvX2FkZHIpCisjZGVmaW5lIG1kaW9fb3V0KHZhbHVlLCBtZGlvX2FkZHIpIG91dGIodmFsdWUsIG1kaW9fYWRkcikKKyNkZWZpbmUgbWRpb19kZWxheShtZGlvX2FkZHIpIGluYihtZGlvX2FkZHIpCisKK2VudW0gbWlpX3JlZ19iaXRzIHsKKwlNRElPX1NoaWZ0Q2xrID0gMHgwMDAxLCBNRElPX0RhdGEgPSAweDAwMDIsIE1ESU9fRW5iT3V0cHV0ID0KKwkgICAgMHgwMDA0LAorfTsKKyNkZWZpbmUgTURJT19FbmJJbiAgKDApCisjZGVmaW5lIE1ESU9fV1JJVEUwIChNRElPX0VuYk91dHB1dCkKKyNkZWZpbmUgTURJT19XUklURTEgKE1ESU9fRGF0YSB8IE1ESU9fRW5iT3V0cHV0KQorCisvKiBHZW5lcmF0ZSB0aGUgcHJlYW1ibGUgcmVxdWlyZWQgZm9yIGluaXRpYWwgc3luY2hyb25pemF0aW9uIGFuZAorICAgYSBmZXcgb2xkZXIgdHJhbnNjZWl2ZXJzLiAqLworc3RhdGljIHZvaWQgbWRpb19zeW5jKGxvbmcgbWRpb19hZGRyKQoreworCWludCBiaXRzID0gMzI7CisKKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIGF0IGxlYXN0IDMyIGxvZ2ljIG9uZXMuICovCisJd2hpbGUgKC0tYml0cyA+PSAwKSB7CisJCW1kaW9fb3V0KE1ESU9fV1JJVEUxLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJCW1kaW9fb3V0KE1ESU9fV1JJVEUxIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCX0KK30KKworc3RhdGljIGludAorbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgdW5zaWduZWQgaW50IGxvY2F0aW9uKQoreworCWxvbmcgbWRpb19hZGRyID0gQkFTRSArIE1JSUN0cmw7CisJaW50IG1paV9jbWQgPSAoMHhmNiA8PCAxMCkgfCAocGh5X2lkIDw8IDUpIHwgbG9jYXRpb247CisJaW50IGksIHJldHZhbCA9IDA7CisKKwlpZiAoc2RjLT5taWlfcHJlYW1ibGVfcmVxdWlyZWQpCisJCW1kaW9fc3luYyhtZGlvX2FkZHIpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPQorCQkgICAgKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCisJCW1kaW9fb3V0KGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwkJbWRpb19vdXQoZGF0YXZhbCB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKwlmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCQltZGlvX291dChNRElPX0VuYkluLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKG1kaW9faW4obWRpb19hZGRyKSAmIE1ESU9fRGF0YSkKKwkJCQkJICA/IDEgOiAwKTsKKwkJbWRpb19vdXQoTURJT19FbmJJbiB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJcmV0dXJuIChyZXR2YWwgPj4gMSkgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkCittZGlvX3dyaXRlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwKKwkgICB1bnNpZ25lZCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlsb25nIG1kaW9fYWRkciA9IEJBU0UgKyBNSUlDdHJsOworCWludCBtaWlfY21kID0KKwkgICAgKDB4NTAwMiA8PCAxNikgfCAocGh5X2lkIDw8IDIzKSB8IChsb2NhdGlvbiA8PCAxOCkgfCB2YWx1ZTsKKwlpbnQgaTsKKworCWlmIChzZGMtPm1paV9wcmVhbWJsZV9yZXF1aXJlZCkKKwkJbWRpb19zeW5jKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPQorCQkgICAgKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCQltZGlvX291dChkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJCW1kaW9fb3V0KGRhdGF2YWwgfCBNRElPX1NoaWZ0Q2xrLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJfQorCS8qIENsZWFyIG91dCBleHRyYSBiaXRzLiAqLworCWZvciAoaSA9IDI7IGkgPiAwOyBpLS0pIHsKKwkJbWRpb19vdXQoTURJT19FbmJJbiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCQltZGlvX291dChNRElPX0VuYkluIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwlpbnQgaTsKKwl1MTYgbWNfZmlsdGVyWzRdOwkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwl1MzIgcnhfbW9kZTsKKworCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOworCisJaWYgKHNkYy0+bWlpX2lmLmZ1bGxfZHVwbGV4ICYmIHNkYy0+Zmxvd2N0cmwpCisJCW1jX2ZpbHRlclszXSB8PSAweDAyMDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJb3V0dyhtY19maWx0ZXJbaV0sIEJBU0UgKyBNdWx0aWNhc3RGaWx0ZXIwICsgaSAqIDIpOworCW91dGIocnhfbW9kZSwgQkFTRSArIFJ4TW9kZSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3VuZGFuY2Vfbmljc1tdID0geworCVBDSV9ST00oMHgxM2YwLCAweDAyMDEsICJzdW5kYW5jZSIsICJTVDIwMSBTdW5kYW5jZSAnQWx0YScgYmFzZWQgQWRhcHRvciIsIDApLAorCVBDSV9ST00oMHgxMTg2LCAweDEwMDIsICJkZmU1MzB0eHMiLCAiRC1MaW5rIERGRTUzMFRYUyAoU3VuZGFuY2UgU1QyMDEgQWx0YSkiLCAwKSwKKwlQQ0lfUk9NKDB4MTNmMCwgMHgwMjAwLCAiaXAxMDBhIiwgIklDKyBJUDEwMEEiLCAwKSwKK307CisKK1BDSV9EUklWRVIgKCBzdW5kYW5jZV9kcml2ZXIsIHN1bmRhbmNlX25pY3MsIFBDSV9OT19DTEFTUyApOworCitEUklWRVIgKCAiU1VOREFOQ0UvUENJIiwgbmljX2RyaXZlciwgcGNpX2RyaXZlciwgc3VuZGFuY2VfZHJpdmVyLAorCSBzdW5kYW5jZV9wcm9iZSwgc3VuZGFuY2VfZGlzYWJsZSApOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdGczLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC90ZzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDAyN2IyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdGczLmMKQEAgLTAsMCArMSwzNDM1IEBACisvKiAkSWQkCisgKiB0ZzMuYzogQnJvYWRjb20gVGlnb24zIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEplZmYgR2FyemlrIChqZ2FyemlrQG1hbmRyYWtlc29mdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRXJpYyBCaWVkZXJtYW4gKGViaWVkZXJtYW5AbG54aS5jb20pICBbZXRoZXJib290IHBvcnRdCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKy8qIDExLTEzLTIwMDMJdGltbGVnZ2UJRml4IElzc3VlIHdpdGggTmV0R2VhciBHQTMwMlQgCisgKiAxMS0xOC0yMDAzICAgZWJpZWRlcm0gICAgICAgIEdlbmVyYWxpemUgTmV0R2VhciBGaXggdG8gd2hhdCB0aGUgY29kZSB3YXMgc3VwcG9zZWQgdG8gYmUuCisgKiAwMS0wNi0yMDA1ICAgQWxmIChGcmVkZXJpYyBPbGl2aWUpIEFkZCBEZWxsIGJjbSA1NzUxICgweDE2NzcpIHN1cHBvcnQKKyAqIDA0LTE1LTIwMDUgICBNYXJ0aW4gVm9ndCBBZGQgRnVqaXRzdSBTaWVtZW5zIENvbXB1dGVyIChGU0MpIDB4MTczNCBiY20gNTc1MSAweDEwNWQgc3VwcG9ydAorICovCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgPG1paS5oPgorI2luY2x1ZGUgInRnMy5oIgorCisjZGVmaW5lIFNVUFBPUlRfQ09QUEVSX1BIWSAgMQorI2RlZmluZSBTVVBQT1JUX0ZJQkVSX1BIWSAgIDEKKyNkZWZpbmUgU1VQUE9SVF9MSU5LX1JFUE9SVCAxCisjZGVmaW5lIFNVUFBPUlRfUEFSVE5PX1NUUiAgMQorI2RlZmluZSBTVVBQT1JUX1BIWV9TVFIgICAgIDEKKworc3RhdGljIHN0cnVjdCB0ZzMgdGczOworCisvKiBUaGVzZSBudW1iZXJzIHNlZW0gdG8gYmUgaGFyZCBjb2RlZCBpbiB0aGUgTklDIGZpcm13YXJlIHNvbWVob3cuCisgKiBZb3UgY2FuJ3QgY2hhbmdlIHRoZSByaW5nIHNpemVzLCBidXQgeW91IGNhbiBjaGFuZ2Ugd2hlcmUgeW91IHBsYWNlCisgKiB0aGVtIGluIHRoZSBOSUMgb25ib2FyZCBtZW1vcnkuCisgKi8KKyNkZWZpbmUgVEczX1JYX1JJTkdfU0laRQkJNTEyCisjZGVmaW5lIFRHM19ERUZfUlhfUklOR19QRU5ESU5HCQkyMAkvKiBSWF9SSU5HX1BFTkRJTkcgc2VlbXMgdG8gYmUgby5rLiBhdCAyMCBhbmQgMjAwICovCisjZGVmaW5lIFRHM19SWF9SQ0JfUklOR19TSVpFCTEwMjQKKworLyoJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1ID8gXAorCSA1MTIgOiAxMDI0KSAqLworI2RlZmluZSBURzNfVFhfUklOR19TSVpFCQk1MTIKKyNkZWZpbmUgVEczX0RFRl9UWF9SSU5HX1BFTkRJTkcJCShURzNfVFhfUklOR19TSVpFIC0gMSkKKworI2RlZmluZSBURzNfUlhfUklOR19CWVRFUwkoc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpICogVEczX1JYX1JJTkdfU0laRSkKKyNkZWZpbmUgVEczX1JYX1JDQl9SSU5HX0JZVEVTCShzaXplb2Yoc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYykgKiBURzNfUlhfUkNCX1JJTkdfU0laRSkKKworI2RlZmluZSBURzNfVFhfUklOR19CWVRFUwkoc2l6ZW9mKHN0cnVjdCB0ZzNfdHhfYnVmZmVyX2Rlc2MpICogVEczX1RYX1JJTkdfU0laRSkKKyNkZWZpbmUgTkVYVF9UWChOKQkJKCgoTikgKyAxKSAmIChURzNfVFhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIFBSRVZfVFgoTikJCSgoKE4pIC0gMSkgJiAoVEczX1RYX1JJTkdfU0laRSAtIDEpKQorCisjZGVmaW5lIFJYX1BLVF9CVUZfU1oJCSgxNTM2ICsgMiArIDY0KQorCitzdHJ1Y3QgZXRoX2ZyYW1lIHsKKwl1aW50OF90ICBkc3RfYWRkcltFVEhfQUxFTl07CisJdWludDhfdCAgc3JjX2FkZHJbRVRIX0FMRU5dOworCXVpbnQxNl90IHR5cGU7CisJdWludDhfdCAgZGF0YSBbRVRIX0ZSQU1FX0xFTiAtIEVUSF9ITEVOXTsKK307CisKK3N0cnVjdCBic3MgeworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2Mgcnhfc3RkW1RHM19SWF9SSU5HX1NJWkVdOworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgcnhfcmNiW1RHM19SWF9SQ0JfUklOR19TSVpFXTsKKwlzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjIHR4X3JpbmdbVEczX1RYX1JJTkdfU0laRV07CisJc3RydWN0IHRnM19od19zdGF0dXMgICAgICBod19zdGF0dXM7CisJc3RydWN0IHRnM19od19zdGF0cyAgICAgICBod19zdGF0czsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgIHJ4X2J1ZnNbVEczX0RFRl9SWF9SSU5HX1BFTkRJTkddW1JYX1BLVF9CVUZfU1pdOworCXN0cnVjdCBldGhfZnJhbWUJICB0eF9mcmFtZVsyXTsKK30gdGczX2JzcyBfX3NoYXJlZDsKKworLyoqCisgKiBwY2lfc2F2ZV9zdGF0ZSAtIHNhdmUgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIG9mIGEgZGV2aWNlIGJlZm9yZSBzdXNwZW5kaW5nCisgKiBAZGV2OiAtIFBDSSBkZXZpY2UgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgKKyAqIEBidWZmZXI6IC0gYnVmZmVyIHRvIGhvbGQgY29uZmlnIHNwYWNlIGNvbnRleHQKKyAqCisgKiBAYnVmZmVyIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVudGlyZSBQQ0kgMi4yIGNvbmZpZyBzcGFjZSAKKyAqICg+PSA2NCBieXRlcykuCisgKi8KK3N0YXRpYyBpbnQgcGNpX3NhdmVfc3RhdGUoc3RydWN0IHBjaV9kZXZpY2UgKmRldiwgdWludDMyX3QgKmJ1ZmZlcikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgaSAqIDQsJmJ1ZmZlcltpXSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKiAKKyAqIHBjaV9yZXN0b3JlX3N0YXRlIC0gUmVzdG9yZSB0aGUgc2F2ZWQgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCisgKiBAZGV2OiAtIFBDSSBkZXZpY2UgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgKKyAqIEBidWZmZXI6IC0gc2F2ZWQgUENJIGNvbmZpZyBzcGFjZQorICoKKyAqLworc3RhdGljIGludCBwY2lfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCB1aW50MzJfdCAqYnVmZmVyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LGkgKiA0LCBidWZmZXJbaV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZzNfd3JpdGVfaW5kaXJlY3RfcmVnMzIodWludDMyX3Qgb2ZmLCB1aW50MzJfdCB2YWwpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0ZzMucGRldiwgVEczUENJX1JFR19CQVNFX0FERFIsIG9mZik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0ZzMucGRldiwgVEczUENJX1JFR19EQVRBLCB2YWwpOworfQorCisjZGVmaW5lIHR3MzIocmVnLHZhbCkJCXRnM193cml0ZV9pbmRpcmVjdF9yZWczMigocmVnKSwodmFsKSkKKyNkZWZpbmUgdHczMl9tYWlsYm94KHJlZywgdmFsKQl3cml0ZWwoKCh2YWwpICYgMHhmZmZmZmZmZiksIHRnMy5yZWdzICsgKHJlZykpCisjZGVmaW5lIHR3MTYocmVnLHZhbCkJCXdyaXRldygoKHZhbCkgJiAweGZmZmYpLCB0ZzMucmVncyArIChyZWcpKQorI2RlZmluZSB0dzgocmVnLHZhbCkJCXdyaXRlYigoKHZhbCkgJiAweGZmKSwgdGczLnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgdHIzMihyZWcpCQlyZWFkbCh0ZzMucmVncyArIChyZWcpKQorI2RlZmluZSB0cjE2KHJlZykJCXJlYWR3KHRnMy5yZWdzICsgKHJlZykpCisjZGVmaW5lIHRyOChyZWcpCQlyZWFkYih0ZzMucmVncyArIChyZWcpKQorCitzdGF0aWMgdm9pZCB0dzMyX2NhcmVmdWxseSh1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKwl0dzMyKHJlZywgdmFsKTsKKwl0cjMyKHJlZyk7CisJdWRlbGF5KDEwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHR3MzJfbWFpbGJveDIodWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJdHczMl9tYWlsYm94KHJlZywgdmFsKTsKKwl0cjMyKHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM193cml0ZV9tZW0odWludDMyX3Qgb2ZmLCB1aW50MzJfdCB2YWwpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0ZzMucGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCBvZmYpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodGczLnBkZXYsIFRHM1BDSV9NRU1fV0lOX0RBVEEsIHZhbCk7CisKKwkvKiBBbHdheXMgbGVhdmUgdGhpcyBhcyB6ZXJvLiAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodGczLnBkZXYsIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19yZWFkX21lbSh1aW50MzJfdCBvZmYsIHVpbnQzMl90ICp2YWwpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0ZzMucGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCBvZmYpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0ZzMucGRldiwgVEczUENJX01FTV9XSU5fREFUQSwgdmFsKTsKKworCS8qIEFsd2F5cyBsZWF2ZSB0aGlzIGFzIHplcm8uICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0ZzMucGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKK30KKworc3RhdGljIHZvaWQgdGczX2Rpc2FibGVfaW50cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl0dzMyKFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKKwkgICAgICh0cC0+bWlzY19ob3N0X2N0cmwgfCBNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpKTsKKwl0dzMyX21haWxib3gyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMHgwMDAwMDAwMSk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zd2l0Y2hfY2xvY2tzKHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IG9yaWdfY2xvY2tfY3RybCwgY2xvY2tfY3RybDsKKworCWNsb2NrX2N0cmwgPSB0cjMyKFRHM1BDSV9DTE9DS19DVFJMKTsKKworCW9yaWdfY2xvY2tfY3RybCA9IGNsb2NrX2N0cmw7CisJY2xvY2tfY3RybCAmPSAoQ0xPQ0tfQ1RSTF9GT1JDRV9DTEtSVU4gfCBDTE9DS19DVFJMX0NMS1JVTl9PRU5BQkxFIHwgMHgxZik7CisJdHAtPnBjaV9jbG9ja19jdHJsID0gY2xvY2tfY3RybDsKKwkKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSAmJgorCSAgICAoISgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApCisJICAgICAgICYmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpKSAmJgorCQkob3JpZ19jbG9ja19jdHJsICYgQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFKSE9MCkgeworCQl0dzMyX2NhcmVmdWxseShURzNQQ0lfQ0xPQ0tfQ1RSTCwgCisJCQljbG9ja19jdHJsIHwgKENMT0NLX0NUUkxfNDRNSFpfQ09SRSB8IENMT0NLX0NUUkxfQUxUQ0xLKSk7CisJCXR3MzJfY2FyZWZ1bGx5KFRHM1BDSV9DTE9DS19DVFJMLCAKKwkJCWNsb2NrX2N0cmwgfCAoQ0xPQ0tfQ1RSTF9BTFRDTEspKTsKKwl9CisJdHczMl9jYXJlZnVsbHkoVEczUENJX0NMT0NLX0NUUkwsIGNsb2NrX2N0cmwpOworfQorCisjZGVmaW5lIFBIWV9CVVNZX0xPT1BTCTUwMDAKKworc3RhdGljIGludCB0ZzNfcmVhZHBoeShzdHJ1Y3QgdGczICp0cCwgaW50IHJlZywgdWludDMyX3QgKnZhbCkKK3sKKwl1aW50MzJfdCBmcmFtZV92YWw7CisJaW50IGxvb3BzLCByZXQ7CisKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUgJiB+TUFDX01JX01PREVfQVVUT19QT0xMKTsKKworCSp2YWwgPSAweGZmZmZmZmZmOworCisJZnJhbWVfdmFsICA9ICgoUEhZX0FERFIgPDwgTUlfQ09NX1BIWV9BRERSX1NISUZUKSAmCisJCSAgICAgIE1JX0NPTV9QSFlfQUREUl9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKChyZWcgPDwgTUlfQ09NX1JFR19BRERSX1NISUZUKSAmCisJCSAgICAgIE1JX0NPTV9SRUdfQUREUl9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKE1JX0NPTV9DTURfUkVBRCB8IE1JX0NPTV9TVEFSVCk7CisJCisJdHczMl9jYXJlZnVsbHkoTUFDX01JX0NPTSwgZnJhbWVfdmFsKTsKKworCWxvb3BzID0gUEhZX0JVU1lfTE9PUFM7CisJd2hpbGUgKGxvb3BzLS0gPiAwKSB7CisJCXVkZWxheSgxMCk7CisJCWZyYW1lX3ZhbCA9IHRyMzIoTUFDX01JX0NPTSk7CisKKwkJaWYgKChmcmFtZV92YWwgJiBNSV9DT01fQlVTWSkgPT0gMCkgeworCQkJdWRlbGF5KDUpOworCQkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0ID0gLUVCVVNZOworCWlmIChsb29wcyA+IDApIHsKKwkJKnZhbCA9IGZyYW1lX3ZhbCAmIE1JX0NPTV9EQVRBX01BU0s7CisJCXJldCA9IDA7CisJfQorCisJdHczMl9jYXJlZnVsbHkoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGczX3dyaXRlcGh5KHN0cnVjdCB0ZzMgKnRwLCBpbnQgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJdWludDMyX3QgZnJhbWVfdmFsOworCWludCBsb29wcywgcmV0OworCisJdHczMl9jYXJlZnVsbHkoTUFDX01JX01PREUsIHRwLT5taV9tb2RlICYgfk1BQ19NSV9NT0RFX0FVVE9fUE9MTCk7CisKKwlmcmFtZV92YWwgID0gKChQSFlfQUREUiA8PCBNSV9DT01fUEhZX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1BIWV9BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAoKHJlZyA8PCBNSV9DT01fUkVHX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1JFR19BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAodmFsICYgTUlfQ09NX0RBVEFfTUFTSyk7CisJZnJhbWVfdmFsIHw9IChNSV9DT01fQ01EX1dSSVRFIHwgTUlfQ09NX1NUQVJUKTsKKwkKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfQ09NLCBmcmFtZV92YWwpOworCisJbG9vcHMgPSBQSFlfQlVTWV9MT09QUzsKKwl3aGlsZSAobG9vcHMtLSA+IDApIHsKKwkJdWRlbGF5KDEwKTsKKwkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKwkJaWYgKChmcmFtZV92YWwgJiBNSV9DT01fQlVTWSkgPT0gMCkgeworCQkJdWRlbGF5KDUpOworCQkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0ID0gLUVCVVNZOworCWlmIChsb29wcyA+IDApCisJCXJldCA9IDA7CisKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZzNfd3JpdGVkc3Aoc3RydWN0IHRnMyAqdHAsIHVpbnQxNl90IGFkZHIsIHVpbnQxNl90IHZhbCkKK3sKKwlpbnQgZXJyOworCWVyciAgPSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIGFkZHIpOworCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIHZhbCk7CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgdm9pZCB0ZzNfcGh5X3NldF93aXJlc3BlZWQoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgdmFsOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQpCisJCXJldHVybjsKKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHg3MDA3KTsKKwl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgJnZhbCk7CisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAodmFsIHwgKDEgPDwgMTUpIHwgKDEgPDwgNCkpKTsKK30KKworc3RhdGljIGludCB0ZzNfYm1jcl9yZXNldChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCBwaHlfY29udHJvbDsKKwlpbnQgbGltaXQsIGVycjsKKworCS8qIE9LLCByZXNldCBpdCwgYW5kIHBvbGwgdGhlIEJNQ1JfUkVTRVQgYml0IHVudGlsIGl0CisJICogY2xlYXJzIG9yIHdlIHRpbWUgb3V0LgorCSAqLworCXBoeV9jb250cm9sID0gQk1DUl9SRVNFVDsKKwllcnIgPSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBwaHlfY29udHJvbCk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbGltaXQgPSA1MDAwOworCXdoaWxlIChsaW1pdC0tKSB7CisJCWVyciA9IHRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJnBoeV9jb250cm9sKTsKKwkJaWYgKGVyciAhPSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoKHBoeV9jb250cm9sICYgQk1DUl9SRVNFVCkgPT0gMCkgeworCQkJdWRlbGF5KDQwKTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChsaW1pdCA8PSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3dhaXRfbWFjcm9fZG9uZShzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgbGltaXQgPSAxMDA7CisKKwl3aGlsZSAobGltaXQtLSkgeworCQl1aW50MzJfdCB0bXAzMjsKKworCQl0ZzNfcmVhZHBoeSh0cCwgMHgxNiwgJnRtcDMyKTsKKwkJaWYgKCh0bXAzMiAmIDB4MTAwMCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAobGltaXQgPD0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19waHlfd3JpdGVfYW5kX2NoZWNrX3Rlc3RwYXQoc3RydWN0IHRnMyAqdHAsIGludCAqcmVzZXRwKQoreworCXN0YXRpYyBjb25zdCB1aW50MzJfdCB0ZXN0X3BhdFs0XVs2XSA9IHsKKwl7IDB4MDAwMDU1NTUsIDB4MDAwMDAwMDUsIDB4MDAwMDJhYWEsIDB4MDAwMDAwMGEsIDB4MDAwMDM0NTYsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwMDJhYWEsIDB4MDAwMDAwMGEsIDB4MDAwMDMzMzMsIDB4MDAwMDAwMDMsIDB4MDAwMDc4OWEsIDB4MDAwMDAwMDUgfSwKKwl7IDB4MDAwMDVhNWEsIDB4MDAwMDAwMDUsIDB4MDAwMDJhNmEsIDB4MDAwMDAwMGEsIDB4MDAwMDFiY2QsIDB4MDAwMDAwMDMgfSwKKwl7IDB4MDAwMDJhNWEsIDB4MDAwMDAwMGEsIDB4MDAwMDMzYzMsIDB4MDAwMDAwMDMsIDB4MDAwMDJlZjEsIDB4MDAwMDAwMDUgfQorCX07CisJaW50IGNoYW47CisKKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgNDsgY2hhbisrKSB7CisJCWludCBpOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywKKwkJCShjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAyKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULAorCQkJCXRlc3RfcGF0W2NoYW5dW2ldKTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDIwMik7CisJCWlmICh0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkgeworCQkJKnJlc2V0cCA9IDE7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLAorCQkJICAgICAoY2hhbiAqIDB4MjAwMCkgfCAweDAyMDApOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDA4Mik7CisJCWlmICh0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkgeworCQkJKnJlc2V0cCA9IDE7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDA4MDIpOworCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpIHsKKwkJCSpyZXNldHAgPSAxOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpICs9IDIpIHsKKwkJCXVpbnQzMl90IGxvdywgaGlnaDsKKworCQkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsICZsb3cpOworCQkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsICZoaWdoKTsKKwkJCWlmICh0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkgeworCQkJCSpyZXNldHAgPSAxOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQlsb3cgJj0gMHg3ZmZmOworCQkJaGlnaCAmPSAweDAwMGY7CisJCQlpZiAobG93ICE9IHRlc3RfcGF0W2NoYW5dW2ldIHx8CisJCQkgICAgaGlnaCAhPSB0ZXN0X3BhdFtjaGFuXVtpKzFdKSB7CisJCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDAwMGIpOworCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHg0MDAxKTsKKwkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4NDAwNSk7CisKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BoeV9yZXNldF9jaGFucGF0KHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBjaGFuOworCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IDQ7IGNoYW4rKykgeworCQlpbnQgaTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAyKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMDApOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDIwMik7CisJCWlmICh0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BoeV9yZXNldF81NzAzXzRfNShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCByZWczMiwgcGh5OV9vcmlnOworCWludCByZXRyaWVzLCBkb19waHlfcmVzZXQsIGVycjsKKworCXJldHJpZXMgPSAxMDsKKwlkb19waHlfcmVzZXQgPSAxOworCWRvIHsKKwkJaWYgKGRvX3BoeV9yZXNldCkgeworCQkJZXJyID0gdGczX2JtY3JfcmVzZXQodHApOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQkJZG9fcGh5X3Jlc2V0ID0gMDsKKwkJfQorCQkKKwkJLyogRGlzYWJsZSB0cmFuc21pdHRlciBhbmQgaW50ZXJydXB0LiAgKi8KKwkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsICZyZWczMik7CisJCXJlZzMyIHw9IDB4MzAwMDsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCByZWczMik7CisKKwkJLyogU2V0IGZ1bGwtZHVwbGV4LCAxMDAwIG1icHMuICAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLAorCQkJQk1DUl9GVUxMRFBMWCB8IFRHM19CTUNSX1NQRUVEMTAwMCk7CisKKwkJLyogU2V0IHRvIG1hc3RlciBtb2RlLiAgKi8KKwkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQ1RSTCwgJnBoeTlfb3JpZyk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLAorCQkJKE1JSV9URzNfQ1RSTF9BU19NQVNURVIgfAorCQkJCU1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKSk7CisKKwkJLyogRW5hYmxlIFNNX0RTUF9DTE9DSyBhbmQgNmRCLiAgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDBjMDApOworCisJCS8qIEJsb2NrIHRoZSBQSFkgY29udHJvbCBhY2Nlc3MuICAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4ODAwNSk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwODAwKTsKKworCQllcnIgPSB0ZzNfcGh5X3dyaXRlX2FuZF9jaGVja190ZXN0cGF0KHRwLCAmZG9fcGh5X3Jlc2V0KTsKKwkJaWYgKCFlcnIpCisJCQlicmVhazsKKwl9IHdoaWxlICgtLXJldHJpZXMpOworCisJZXJyID0gdGczX3BoeV9yZXNldF9jaGFucGF0KHRwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgwMDUpOworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMDAwKTsKKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MjAwKTsKKwl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDAwMCk7CisKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MDQwMCk7CisKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgcGh5OV9vcmlnKTsKKworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCAmcmVnMzIpOworCXJlZzMyICY9IH4weDMwMDA7CisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLCByZWczMik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBUaGlzIHdpbGwgcmVzZXQgdGhlIHRpZ29uMyBQSFkgaWYgdGhlcmUgaXMgbm8gdmFsaWQKKyAqIGxpbmsuCisgKi8KK3N0YXRpYyBpbnQgdGczX3BoeV9yZXNldChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCBwaHlfc3RhdHVzOworCWludCBlcnI7CisKKwllcnIgID0gdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmcGh5X3N0YXR1cyk7CisJZXJyIHw9IHRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJnBoeV9zdGF0dXMpOworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpIHx8CisJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgfHwKKwkJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSkgeworCQllcnIgPSB0ZzNfcGh5X3Jlc2V0XzU3MDNfNF81KHRwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkgIC8vIFRha2VuIGZyb20gQnJvYWRjb20ncyBzb3VyY2UgY29kZQorCSAgdGczX3dyaXRlcGh5KHRwLCAweDE4LCAweDBjMDApOworCSAgdGczX3dyaXRlcGh5KHRwLCAweDE3LCAweDAwMGEpOworCSAgdGczX3dyaXRlcGh5KHRwLCAweDE1LCAweDMxMGIpOworCSAgdGczX3dyaXRlcGh5KHRwLCAweDE3LCAweDIwMWYpOworCSAgdGczX3dyaXRlcGh5KHRwLCAweDE1LCAweDk1MDYpOworCSAgdGczX3dyaXRlcGh5KHRwLCAweDE3LCAweDQwMWYpOworCSAgdGczX3dyaXRlcGh5KHRwLCAweDE1LCAweDE0ZTIpOworCSAgdGczX3dyaXRlcGh5KHRwLCAweDE4LCAweDA0MDApOworCX0KKwllcnIgPSB0ZzNfYm1jcl9yZXNldCh0cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKyBvdXQ6CisJdGczX3BoeV9zZXRfd2lyZXNwZWVkKHRwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGczX3NldF9wb3dlcl9zdGF0ZV8wKHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQxNl90IHBvd2VyX2NvbnRyb2w7CisJaW50IHBtID0gdHAtPnBtX2NhcDsKKworCS8qIE1ha2Ugc3VyZSByZWdpc3RlciBhY2Nlc3NlcyAoaW5kaXJlY3Qgb3Igb3RoZXJ3aXNlKQorCSAqIHdpbGwgZnVuY3Rpb24gY29ycmVjdGx5LgorCSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsICBURzNQQ0lfTUlTQ19IT1NUX0NUUkwsIHRwLT5taXNjX2hvc3RfY3RybCk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwgcG0gKyBQQ0lfUE1fQ1RSTCwgJnBvd2VyX2NvbnRyb2wpOworCisJcG93ZXJfY29udHJvbCB8PSBQQ0lfUE1fQ1RSTF9QTUVfU1RBVFVTOworCXBvd2VyX2NvbnRyb2wgJj0gfihQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLKTsKKwlwb3dlcl9jb250cm9sIHw9IDA7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBwbSArIFBDSV9QTV9DVFJMLCBwb3dlcl9jb250cm9sKTsKKworCXR3MzJfY2FyZWZ1bGx5KEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwpOworCisJcmV0dXJuOworfQorCisKKyNpZiBTVVBQT1JUX0xJTktfUkVQT1JUCitzdGF0aWMgdm9pZCB0ZzNfbGlua19yZXBvcnQoc3RydWN0IHRnMyAqdHApCit7CisJaWYgKCF0cC0+Y2Fycmllcl9vaykgeworCQlwcmludGYoIkxpbmsgaXMgZG93bi5cbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiTGluayBpcyB1cCBhdCAlZCBNYnBzLCAlcyBkdXBsZXguICVzICVzICVzXG4iLAorCQkJKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCA/CisJCQkgICAgICAgMTAwMCA6CisJCQkodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMDAgPworCQkJCTEwMCA6IDEwKSksCisJCQkodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwgPyAgCisJCQkJImZ1bGwiIDogImhhbGYiKSwKKwkJCSh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVFhfUEFVU0UpID8gIlRYIiA6ICIiLAorCQkJKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19SWF9QQVVTRSkgPyAiUlgiIDogIiIsCisJCQkodHAtPnRnM19mbGFncyAmIChURzNfRkxBR19UWF9QQVVTRSB8VEczX0ZMQUdfUlhfUEFVU0UpKSA/ICJmbG93IGNvbnRyb2wiIDogIiIpOworCX0KK30KKyNlbHNlCisjZGVmaW5lIHRnM19saW5rX3JlcG9ydCh0cCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0ZzNfc2V0dXBfZmxvd19jb250cm9sKHN0cnVjdCB0ZzMgKnRwLCB1aW50MzJfdCBsb2NhbF9hZHYsIHVpbnQzMl90IHJlbW90ZV9hZHYpCit7CisJdWludDMyX3QgbmV3X3RnM19mbGFncyA9IDA7CisKKwlpZiAobG9jYWxfYWR2ICYgQURWRVJUSVNFX1BBVVNFX0NBUCkgeworCQlpZiAobG9jYWxfYWR2ICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pIHsKKwkJCWlmIChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0NBUCkKKwkJCQluZXdfdGczX2ZsYWdzIHw9CisJCQkJCShURzNfRkxBR19SWF9QQVVTRSB8CisJCQkJCSBURzNfRkxBR19UWF9QQVVTRSk7CisJCQllbHNlIGlmIChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0FTWU0pCisJCQkJbmV3X3RnM19mbGFncyB8PQorCQkJCQkoVEczX0ZMQUdfUlhfUEFVU0UpOworCQl9IGVsc2UgeworCQkJaWYgKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQ0FQKQorCQkJCW5ld190ZzNfZmxhZ3MgfD0KKwkJCQkJKFRHM19GTEFHX1JYX1BBVVNFIHwKKwkJCQkJIFRHM19GTEFHX1RYX1BBVVNFKTsKKwkJfQorCX0gZWxzZSBpZiAobG9jYWxfYWR2ICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pIHsKKwkJaWYgKChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0NBUCkgJiYKKwkJICAgIChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0FTWU0pKQorCQkJbmV3X3RnM19mbGFncyB8PSBURzNfRkxBR19UWF9QQVVTRTsKKwl9CisKKwl0cC0+dGczX2ZsYWdzICY9IH4oVEczX0ZMQUdfUlhfUEFVU0UgfCBURzNfRkxBR19UWF9QQVVTRSk7CisJdHAtPnRnM19mbGFncyB8PSBuZXdfdGczX2ZsYWdzOworCisJaWYgKG5ld190ZzNfZmxhZ3MgJiBURzNfRkxBR19SWF9QQVVTRSkKKwkJdHAtPnJ4X21vZGUgfD0gUlhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFOworCWVsc2UKKwkJdHAtPnJ4X21vZGUgJj0gflJYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKKworCWlmIChuZXdfdGczX2ZsYWdzICYgVEczX0ZMQUdfVFhfUEFVU0UpCisJCXRwLT50eF9tb2RlIHw9IFRYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKKwllbHNlCisJCXRwLT50eF9tb2RlICY9IH5UWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEU7Cit9CisKKyNpZiBTVVBQT1JUX0NPUFBFUl9QSFkKK3N0YXRpYyB2b2lkIHRnM19hdXhfc3RhdF90b19zcGVlZF9kdXBsZXgoCisJc3RydWN0IHRnMyAqdHAgX191bnVzZWQsIHVpbnQzMl90IHZhbCwgdWludDhfdCAqc3BlZWQsIHVpbnQ4X3QgKmR1cGxleCkKK3sKKwlzdGF0aWMgY29uc3QgdWludDhfdCBtYXBbXSA9IHsKKwkJWzBdID0gKFNQRUVEX0lOVkFMSUQgPDwgMikgfCBEVVBMRVhfSU5WQUxJRCwKKwkJW01JSV9URzNfQVVYX1NUQVRfMTBIQUxGID4+IDhdICAgPSAoU1BFRURfMTAgPDwgMikgfCBEVVBMRVhfSEFMRiwKKwkJW01JSV9URzNfQVVYX1NUQVRfMTBGVUxMID4+IDhdICAgPSAoU1BFRURfMTAgPDwgMikgfCBEVVBMRVhfRlVMTCwKKwkJW01JSV9URzNfQVVYX1NUQVRfMTAwSEFMRiA+PiA4XSAgPSAoU1BFRURfMTAwIDw8IDIpIHwgRFVQTEVYX0hBTEYsCisJCVtNSUlfVEczX0FVWF9TVEFUXzEwMF80ID4+IDhdID0gKFNQRUVEX0lOVkFMSUQgPDwgMikgfCBEVVBMRVhfSU5WQUxJRCwKKwkJW01JSV9URzNfQVVYX1NUQVRfMTAwRlVMTCA+PiA4XSAgPSAoU1BFRURfMTAwIDw8IDIpIHwgRFVQTEVYX0ZVTEwsCisJCVtNSUlfVEczX0FVWF9TVEFUXzEwMDBIQUxGID4+IDhdID0gKFNQRUVEXzEwMDAgPDwgMikgfCBEVVBMRVhfSEFMRiwKKwkJW01JSV9URzNfQVVYX1NUQVRfMTAwMEZVTEwgPj4gOF0gPSAoU1BFRURfMTAwMCA8PCAyKSB8IERVUExFWF9GVUxMLAorCX07CisJdWludDhfdCByZXN1bHQ7CisJcmVzdWx0ID0gbWFwWyh2YWwgJiBNSUlfVEczX0FVWF9TVEFUX1NQRE1BU0spID4+IDhdOworCSpzcGVlZCA9IHJlc3VsdCA+PiAyOworCSpkdXBsZXggPSByZXN1bHQgJiAzOworfQorCitzdGF0aWMgaW50IHRnM19waHlfY29wcGVyX2JlZ2luKHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IG5ld19hZHY7CisKKwl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPQorCQkoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCQlBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCQkJQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9NSUkpOworCQorCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpIHsKKwkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICY9CisJCQl+KEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKTsKKwl9CisJCisJbmV3X2FkdiA9IChBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOworCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikgeworCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJfQorCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkgeworCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJfQorCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpIHsKKwkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwl9CisJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkgeworCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDBGVUxMOworCX0KKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9BRFZFUlRJU0UsIG5ld19hZHYpOworCQorCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJgorCQkoQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpKSB7CisJCW5ld19hZHYgPSAwOworCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikgeworCQkJbmV3X2FkdiB8PSBNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRjsKKwkJfQorCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkgeworCQkJbmV3X2FkdiB8PSBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTDsKKwkJfQorCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpICYmCisJCQkodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTAgfHwKKwkJCQl0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMCkpIHsKKwkJCW5ld19hZHYgfD0gKE1JSV9URzNfQ1RSTF9BU19NQVNURVIgfAorCQkJCU1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKTsKKwkJfQorCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgbmV3X2Fkdik7CisJfSBlbHNlIHsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIDApOworCX0KKworCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsIEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfaW5pdF81NDAxcGh5X2RzcChzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgZXJyOworCisJLyogVHVybiBvZmYgdGFwIHBvd2VyIG1hbmFnZW1lbnQuICovCisJZXJyICA9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwYzIwKTsKKwkKKwllcnIgfD0gdGczX3dyaXRlZHNwKHRwLCAweDAwMTIsIDB4MTgwNCk7CisJZXJyIHw9IHRnM193cml0ZWRzcCh0cCwgMHgwMDEzLCAweDEyMDQpOworCWVyciB8PSB0ZzNfd3JpdGVkc3AodHAsIDB4ODAwNiwgMHgwMTMyKTsKKwllcnIgfD0gdGczX3dyaXRlZHNwKHRwLCAweDgwMDYsIDB4MDIzMik7CisJZXJyIHw9IHRnM193cml0ZWRzcCh0cCwgMHgyMDFmLCAweDBhMjApOworCisJdWRlbGF5KDQwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGczX3NldHVwX2NvcHBlcl9waHkoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGN1cnJlbnRfbGlua191cDsKKwl1aW50MzJfdCBibXNyLCBkdW1teTsKKwlpbnQgaSwgZXJyOworCisJdHczMl9jYXJlZnVsbHkoTUFDX1NUQVRVUywKKwkJKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRAorCQkgfCBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQpKTsKKworCXRwLT5taV9tb2RlID0gTUFDX01JX01PREVfQkFTRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDAyKTsKKworCS8qIFNvbWUgdGhpcmQtcGFydHkgUEhZcyBuZWVkIHRvIGJlIHJlc2V0IG9uIGxpbmsgZ29pbmcKKwkgKiBkb3duLgorCSAqLworCWlmICgJKAkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpIHx8CisJCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHx8CisJCQkodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTApKSAmJgorCQkodHAtPmNhcnJpZXJfb2spKSB7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKwkJaWYgKCEoYm1zciAmIEJNU1JfTFNUQVRVUykpCisJCQl0ZzNfcGh5X3Jlc2V0KHRwKTsKKwl9CisKKwlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0lEX0JDTTU0MDEpIHsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCisJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSkKKwkJCWJtc3IgPSAwOworCisJCWlmICghKGJtc3IgJiBCTVNSX0xTVEFUVVMpKSB7CisJCQllcnIgPSB0ZzNfaW5pdF81NDAxcGh5X2RzcCh0cCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisKKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQkJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQkJCXVkZWxheSgxMCk7CisJCQkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJCQkJaWYgKGJtc3IgJiBCTVNSX0xTVEFUVVMpIHsKKwkJCQkJdWRlbGF5KDQwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfUkVWX01BU0spID09IFBIWV9SRVZfQkNNNTQwMV9CMCAmJgorCQkJICAgICEoYm1zciAmIEJNU1JfTFNUQVRVUykgJiYKKwkJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDApIHsKKwkJCQllcnIgPSB0ZzNfcGh5X3Jlc2V0KHRwKTsKKwkJCQlpZiAoIWVycikKKwkJCQkJZXJyID0gdGczX2luaXRfNTQwMXBoeV9kc3AodHApOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJCSAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKSB7CisJCS8qIDU3MDEge0EwLEIwfSBDUkMgYnVnIHdvcmthcm91bmQgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCAweDE1LCAweDBhNzUpOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGM2OCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4ZDY4KTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhjNjgpOworCX0KKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4uLiAqLworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0lNQVNLLCB+MCk7CisKKwlpZiAodHAtPmxlZF9tb2RlID09IGxlZF9tb2RlX3RocmVlX2xpbmspCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwKKwkJCSAgICAgTUlJX1RHM19FWFRfQ1RSTF9MTkszX0xFRF9NT0RFKTsKKwllbHNlCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgMCk7CisKKwljdXJyZW50X2xpbmtfdXAgPSAwOworCisJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisKKwlpZiAoYm1zciAmIEJNU1JfTFNUQVRVUykgeworCQl1aW50MzJfdCBhdXhfc3RhdCwgYm1jcjsKKworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19BVVhfU1RBVCwgJmF1eF9zdGF0KTsKKwkJZm9yIChpID0gMDsgaSA8IDIwMDA7IGkrKykgeworCQkJdWRlbGF5KDEwKTsKKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0FVWF9TVEFULCAmYXV4X3N0YXQpOworCQkJaWYgKGF1eF9zdGF0KQorCQkJCWJyZWFrOworCQl9CisKKwkJdGczX2F1eF9zdGF0X3RvX3NwZWVkX2R1cGxleCh0cCwgYXV4X3N0YXQsCisJCQkmdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCwKKwkJCSZ0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCk7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJmJtY3IpOworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZibWNyKTsKKwkJaWYgKGJtY3IgJiBCTUNSX0FORU5BQkxFKSB7CisJCQl1aW50MzJfdCBnaWdfY3RybDsKKwkJCQorCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJCQorCQkJLyogRm9yY2UgYXV0b25lZyByZXN0YXJ0IGlmIHdlIGFyZSBleGl0aW5nCisJCQkgKiBsb3cgcG93ZXIgbW9kZS4KKwkJCSAqLworCQkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQ1RSTCwgJmdpZ19jdHJsKTsKKwkJCWlmICghKGdpZ19jdHJsICYgKE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGIHwKKwkJCQkgICAgICBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTCkpKSB7CisJCQkJY3VycmVudF9saW5rX3VwID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCX0KKwl9CisKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDEgJiYKKwkJKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID09IERVUExFWF9GVUxMKSkgeworCQl1aW50MzJfdCBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9BRFZFUlRJU0UsICZsb2NhbF9hZHYpOworCQlsb2NhbF9hZHYgJj0gKEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTSk7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9MUEEsICZyZW1vdGVfYWR2KTsKKwkJcmVtb3RlX2FkdiAmPSAoTFBBX1BBVVNFX0NBUCB8IExQQV9QQVVTRV9BU1lNKTsKKworCQkvKiBJZiB3ZSBhcmUgbm90IGFkdmVydGlzaW5nIGZ1bGwgcGF1c2UgY2FwYWJpbGl0eSwKKwkJICogc29tZXRoaW5nIGlzIHdyb25nLiAgQnJpbmcgdGhlIGxpbmsgZG93biBhbmQgcmVjb25maWd1cmUuCisJCSAqLworCQlpZiAobG9jYWxfYWR2ICE9IEFEVkVSVElTRV9QQVVTRV9DQVApIHsKKwkJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCX0gZWxzZSB7CisJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCBsb2NhbF9hZHYsIHJlbW90ZV9hZHYpOworCQl9CisJfQorCisJaWYgKGN1cnJlbnRfbGlua191cCA9PSAwKSB7CisJCXVpbnQzMl90IHRtcDsKKworCQl0ZzNfcGh5X2NvcHBlcl9iZWdpbih0cCk7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmdG1wKTsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmdG1wKTsKKwkJaWYgKHRtcCAmIEJNU1JfTFNUQVRVUykKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJfQorCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDEpIHsKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwIHx8CisJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7CisJCWVsc2UKKwkJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKKwl9IGVsc2UKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOworCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9IQUxGX0RVUExFWDsKKwlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9IQUxGX0RVUExFWDsKKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApIHsKKwkJaWYgKCh0cC0+bGVkX21vZGUgPT0gbGVkX21vZGVfbGluazEwKSB8fAorCQkgICAgKGN1cnJlbnRfbGlua191cCA9PSAxICYmCisJCSAgICAgdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMCkpCisJCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwl9IGVsc2UgeworCQlpZiAoY3VycmVudF9saW5rX3VwID09IDEpCisJCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwkJdHczMihNQUNfTEVEX0NUUkwsIExFRF9DVFJMX1BIWV9NT0RFXzEpOworCX0KKworCS8qID8/PyBXaXRob3V0IHRoaXMgc2V0dGluZyBOZXRnZWFyIEdBMzAyVCBQSFkgZG9lcyBub3QKKwkgKiA/Pz8gc2VuZC9yZWNlaXZlIHBhY2tldHMuLi4KKwkgKiBXaXRoIHRoaXMgb3RoZXIgUEhZcyBjYW5ub3QgYnJpbmcgdXAgdGhlIGxpbmsKKwkgKi8KKwlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0lEX0JDTTU0MTEgJiYKKwkJdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDBfQUxUSU1BKSB7CisJCXRwLT5taV9tb2RlIHw9IE1BQ19NSV9NT0RFX0FVVE9fUE9MTDsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwl9CisKKwl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCS8qIExpbmsgY2hhbmdlIHBvbGxlZC4gKi8KKwl0dzMyX2NhcmVmdWxseShNQUNfRVZFTlQsIDApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwICYmCisJICAgIGN1cnJlbnRfbGlua191cCA9PSAxICYmCisJICAgIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCAmJgorCSAgICAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpIHx8CisJICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSV9ISUdIX1NQRUVEKSkpIHsKKwkJdWRlbGF5KDEyMCk7CisJCXR3MzJfY2FyZWZ1bGx5KE1BQ19TVEFUVVMsCisJCQkoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCXRnM193cml0ZV9tZW0oCisJCQkgICAgICBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YLAorCQkJICAgICAgTklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzIpOworCX0KKworCWlmIChjdXJyZW50X2xpbmtfdXAgIT0gdHAtPmNhcnJpZXJfb2spIHsKKwkJdHAtPmNhcnJpZXJfb2sgPSBjdXJyZW50X2xpbmtfdXA7CisJCXRnM19saW5rX3JlcG9ydCh0cCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSB0ZzNfc2V0dXBfY29wcGVyX3BoeShUUCkgKC1FSU5WQUwpCisjZW5kaWYgLyogU1VQUE9SVF9DT1BQRVJfUEhZICovCisKKyNpZiBTVVBQT1JUX0ZJQkVSX1BIWQorc3RydWN0IHRnM19maWJlcl9hbmVnaW5mbyB7CisJaW50IHN0YXRlOworI2RlZmluZSBBTkVHX1NUQVRFX1VOS05PV04JCTAKKyNkZWZpbmUgQU5FR19TVEFURV9BTl9FTkFCTEUJCTEKKyNkZWZpbmUgQU5FR19TVEFURV9SRVNUQVJUX0lOSVQJCTIKKyNkZWZpbmUgQU5FR19TVEFURV9SRVNUQVJUCQkzCisjZGVmaW5lIEFORUdfU1RBVEVfRElTQUJMRV9MSU5LX09LCTQKKyNkZWZpbmUgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVF9JTklUCTUKKyNkZWZpbmUgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVAk2CisjZGVmaW5lIEFORUdfU1RBVEVfQUNLX0RFVEVDVF9JTklUCTcKKyNkZWZpbmUgQU5FR19TVEFURV9BQ0tfREVURUNUCQk4CisjZGVmaW5lIEFORUdfU1RBVEVfQ09NUExFVEVfQUNLX0lOSVQJOQorI2RlZmluZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDSwkJMTAKKyNkZWZpbmUgQU5FR19TVEFURV9JRExFX0RFVEVDVF9JTklUCTExCisjZGVmaW5lIEFORUdfU1RBVEVfSURMRV9ERVRFQ1QJCTEyCisjZGVmaW5lIEFORUdfU1RBVEVfTElOS19PSwkJMTMKKyNkZWZpbmUgQU5FR19TVEFURV9ORVhUX1BBR0VfV0FJVF9JTklUCTE0CisjZGVmaW5lIEFORUdfU1RBVEVfTkVYVF9QQUdFX1dBSVQJMTUKKworCXVpbnQzMl90IGZsYWdzOworI2RlZmluZSBNUl9BTl9FTkFCTEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTVJfUkVTVEFSVF9BTgkJMHgwMDAwMDAwMgorI2RlZmluZSBNUl9BTl9DT01QTEVURQkJMHgwMDAwMDAwNAorI2RlZmluZSBNUl9QQUdFX1JYCQkweDAwMDAwMDA4CisjZGVmaW5lIE1SX05QX0xPQURFRAkJMHgwMDAwMDAxMAorI2RlZmluZSBNUl9UT0dHTEVfVFgJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTVJfTFBfQURWX0ZVTExfRFVQTEVYCTB4MDAwMDAwNDAKKyNkZWZpbmUgTVJfTFBfQURWX0hBTEZfRFVQTEVYCTB4MDAwMDAwODAKKyNkZWZpbmUgTVJfTFBfQURWX1NZTV9QQVVTRQkweDAwMDAwMTAwCisjZGVmaW5lIE1SX0xQX0FEVl9BU1lNX1BBVVNFCTB4MDAwMDAyMDAKKyNkZWZpbmUgTVJfTFBfQURWX1JFTU9URV9GQVVMVDEJMHgwMDAwMDQwMAorI2RlZmluZSBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMgkweDAwMDAwODAwCisjZGVmaW5lIE1SX0xQX0FEVl9ORVhUX1BBR0UJMHgwMDAwMTAwMAorI2RlZmluZSBNUl9UT0dHTEVfUlgJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTVJfTlBfUlgJCTB4MDAwMDQwMDAKKworI2RlZmluZSBNUl9MSU5LX09LCQkweDgwMDAwMDAwCisKKwl1bnNpZ25lZCBsb25nIGxpbmtfdGltZSwgY3VyX3RpbWU7CisKKwl1aW50MzJfdCBhYmlsaXR5X21hdGNoX2NmZzsKKwlpbnQgYWJpbGl0eV9tYXRjaF9jb3VudDsKKworCWNoYXIgYWJpbGl0eV9tYXRjaCwgaWRsZV9tYXRjaCwgYWNrX21hdGNoOworCisJdWludDMyX3QgdHhjb25maWcsIHJ4Y29uZmlnOworI2RlZmluZSBBTkVHX0NGR19OUAkJMHgwMDAwMDA4MAorI2RlZmluZSBBTkVHX0NGR19BQ0sJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQU5FR19DRkdfUkYyCQkweDAwMDAwMDIwCisjZGVmaW5lIEFORUdfQ0ZHX1JGMQkJMHgwMDAwMDAxMAorI2RlZmluZSBBTkVHX0NGR19QUzIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQU5FR19DRkdfUFMxCQkweDAwMDA4MDAwCisjZGVmaW5lIEFORUdfQ0ZHX0hECQkweDAwMDA0MDAwCisjZGVmaW5lIEFORUdfQ0ZHX0ZECQkweDAwMDAyMDAwCisjZGVmaW5lIEFORUdfQ0ZHX0lOVkFMCQkweDAwMDAxZjA2CisKK307CisjZGVmaW5lIEFORUdfT0sJCTAKKyNkZWZpbmUgQU5FR19ET05FCTEKKyNkZWZpbmUgQU5FR19USU1FUl9FTkFCCTIKKyNkZWZpbmUgQU5FR19GQUlMRUQJLTEKKworI2RlZmluZSBBTkVHX1NUQVRFX1NFVFRMRV9USU1FCTEwMDAwCisKK3N0YXRpYyBpbnQgdGczX2ZpYmVyX2FuZWdfc21hY2hpbmUoc3RydWN0IHRnMyAqdHAsCisJCQkJICAgc3RydWN0IHRnM19maWJlcl9hbmVnaW5mbyAqYXApCit7CisJdW5zaWduZWQgbG9uZyBkZWx0YTsKKwl1aW50MzJfdCByeF9jZmdfcmVnOworCWludCByZXQ7CisKKwlpZiAoYXAtPnN0YXRlID09IEFORUdfU1RBVEVfVU5LTk9XTikgeworCQlhcC0+cnhjb25maWcgPSAwOworCQlhcC0+bGlua190aW1lID0gMDsKKwkJYXAtPmN1cl90aW1lID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDA7CisJCWFwLT5pZGxlX21hdGNoID0gMDsKKwkJYXAtPmFja19tYXRjaCA9IDA7CisJfQorCWFwLT5jdXJfdGltZSsrOworCisJaWYgKHRyMzIoTUFDX1NUQVRVUykgJiBNQUNfU1RBVFVTX1JDVkRfQ0ZHKSB7CisJCXJ4X2NmZ19yZWcgPSB0cjMyKE1BQ19SWF9BVVRPX05FRyk7CisKKwkJaWYgKHJ4X2NmZ19yZWcgIT0gYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnKSB7CisJCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSByeF9jZmdfcmVnOworCQkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAwOworCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKCsrYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPiAxKSB7CisJCQkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAxOworCQkJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IHJ4X2NmZ19yZWc7CisJCQl9CisJCX0KKwkJaWYgKHJ4X2NmZ19yZWcgJiBBTkVHX0NGR19BQ0spCisJCQlhcC0+YWNrX21hdGNoID0gMTsKKwkJZWxzZQorCQkJYXAtPmFja19tYXRjaCA9IDA7CisKKwkJYXAtPmlkbGVfbWF0Y2ggPSAwOworCX0gZWxzZSB7CisJCWFwLT5pZGxlX21hdGNoID0gMTsKKwkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDA7CisJCWFwLT5hY2tfbWF0Y2ggPSAwOworCisJCXJ4X2NmZ19yZWcgPSAwOworCX0KKworCWFwLT5yeGNvbmZpZyA9IHJ4X2NmZ19yZWc7CisJcmV0ID0gQU5FR19PSzsKKworCXN3aXRjaChhcC0+c3RhdGUpIHsKKwljYXNlIEFORUdfU1RBVEVfVU5LTk9XTjoKKwkJaWYgKGFwLT5mbGFncyAmIChNUl9BTl9FTkFCTEUgfCBNUl9SRVNUQVJUX0FOKSkKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBBTkVHX1NUQVRFX0FOX0VOQUJMRToKKwkJYXAtPmZsYWdzICY9IH4oTVJfQU5fQ09NUExFVEUgfCBNUl9QQUdFX1JYKTsKKwkJaWYgKGFwLT5mbGFncyAmIE1SX0FOX0VOQUJMRSkgeworCQkJYXAtPmxpbmtfdGltZSA9IDA7CisJCQlhcC0+Y3VyX3RpbWUgPSAwOworCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gMDsKKwkJCWFwLT5hYmlsaXR5X21hdGNoX2NvdW50ID0gMDsKKwkJCWFwLT5hYmlsaXR5X21hdGNoID0gMDsKKwkJCWFwLT5pZGxlX21hdGNoID0gMDsKKwkJCWFwLT5hY2tfbWF0Y2ggPSAwOworCisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX1JFU1RBUlRfSU5JVDsKKwkJfSBlbHNlIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfRElTQUJMRV9MSU5LX09LOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX1JFU1RBUlRfSU5JVDoKKwkJYXAtPmxpbmtfdGltZSA9IGFwLT5jdXJfdGltZTsKKwkJYXAtPmZsYWdzICY9IH4oTVJfTlBfTE9BREVEKTsKKwkJYXAtPnR4Y29uZmlnID0gMDsKKwkJdHczMihNQUNfVFhfQVVUT19ORUcsIDApOworCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfU0VORF9DT05GSUdTOworCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfUkVTVEFSVDsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgQU5FR19TVEFURV9SRVNUQVJUOgorCQlkZWx0YSA9IGFwLT5jdXJfdGltZSAtIGFwLT5saW5rX3RpbWU7CisJCWlmIChkZWx0YSA+IEFORUdfU1RBVEVfU0VUVExFX1RJTUUpIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IEFORUdfVElNRVJfRU5BQjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9ESVNBQkxFX0xJTktfT0s6CisJCXJldCA9IEFORUdfRE9ORTsKKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVDoKKwkJYXAtPmZsYWdzICY9IH4oTVJfVE9HR0xFX1RYKTsKKwkJYXAtPnR4Y29uZmlnID0gKEFORUdfQ0ZHX0ZEIHwgQU5FR19DRkdfUFMxKTsKKwkJdHczMihNQUNfVFhfQVVUT19ORUcsIGFwLT50eGNvbmZpZyk7CisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1Q7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0FCSUxJVFlfREVURUNUOgorCQlpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJiBhcC0+cnhjb25maWcgIT0gMCkgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BQ0tfREVURUNUX0lOSVQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQUNLX0RFVEVDVF9JTklUOgorCQlhcC0+dHhjb25maWcgfD0gQU5FR19DRkdfQUNLOworCQl0dzMyKE1BQ19UWF9BVVRPX05FRywgYXAtPnR4Y29uZmlnKTsKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1NFTkRfQ09ORklHUzsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BQ0tfREVURUNUOworCisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBBTkVHX1NUQVRFX0FDS19ERVRFQ1Q6CisJCWlmIChhcC0+YWNrX21hdGNoICE9IDApIHsKKwkJCWlmICgoYXAtPnJ4Y29uZmlnICYgfkFORUdfQ0ZHX0FDSykgPT0KKwkJCSAgICAoYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnICYgfkFORUdfQ0ZHX0FDSykpIHsKKwkJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDS19JTklUOworCQkJfSBlbHNlIHsKKwkJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FOX0VOQUJMRTsKKwkJCX0KKwkJfSBlbHNlIGlmIChhcC0+YWJpbGl0eV9tYXRjaCAhPSAwICYmCisJCQkgICBhcC0+cnhjb25maWcgPT0gMCkgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BTl9FTkFCTEU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQ09NUExFVEVfQUNLX0lOSVQ6CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19JTlZBTCkgeworCQkJcmV0ID0gQU5FR19GQUlMRUQ7CisJCQlicmVhazsKKwkJfQorCQlhcC0+ZmxhZ3MgJj0gfihNUl9MUF9BRFZfRlVMTF9EVVBMRVggfAorCQkJICAgICAgIE1SX0xQX0FEVl9IQUxGX0RVUExFWCB8CisJCQkgICAgICAgTVJfTFBfQURWX1NZTV9QQVVTRSB8CisJCQkgICAgICAgTVJfTFBfQURWX0FTWU1fUEFVU0UgfAorCQkJICAgICAgIE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQxIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMiB8CisJCQkgICAgICAgTVJfTFBfQURWX05FWFRfUEFHRSB8CisJCQkgICAgICAgTVJfVE9HR0xFX1JYIHwKKwkJCSAgICAgICBNUl9OUF9SWCk7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19GRCkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfRlVMTF9EVVBMRVg7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19IRCkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfSEFMRl9EVVBMRVg7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19QUzEpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX1NZTV9QQVVTRTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX1BTMikKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfQVNZTV9QQVVTRTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX1JGMSkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX1JGMikKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMjsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX05QKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9ORVhUX1BBR0U7CisKKwkJYXAtPmxpbmtfdGltZSA9IGFwLT5jdXJfdGltZTsKKworCQlhcC0+ZmxhZ3MgXj0gKE1SX1RPR0dMRV9UWCk7CisJCWlmIChhcC0+cnhjb25maWcgJiAweDAwMDgpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfVE9HR0xFX1JYOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfTlApCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTlBfUlg7CisJCWFwLT5mbGFncyB8PSBNUl9QQUdFX1JYOworCisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQ09NUExFVEVfQUNLOworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDSzoKKwkJaWYgKGFwLT5hYmlsaXR5X21hdGNoICE9IDAgJiYKKwkJICAgIGFwLT5yeGNvbmZpZyA9PSAwKSB7CisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FOX0VOQUJMRTsKKwkJCWJyZWFrOworCQl9CisJCWRlbHRhID0gYXAtPmN1cl90aW1lIC0gYXAtPmxpbmtfdGltZTsKKwkJaWYgKGRlbHRhID4gQU5FR19TVEFURV9TRVRUTEVfVElNRSkgeworCQkJaWYgKCEoYXAtPmZsYWdzICYgKE1SX0xQX0FEVl9ORVhUX1BBR0UpKSkgeworCQkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfSURMRV9ERVRFQ1RfSU5JVDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChhcC0+dHhjb25maWcgJiBBTkVHX0NGR19OUCkgPT0gMCAmJgorCQkJCSAgICAhKGFwLT5mbGFncyAmIE1SX05QX1JYKSkgeworCQkJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0lETEVfREVURUNUX0lOSVQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0ID0gQU5FR19GQUlMRUQ7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0lETEVfREVURUNUX0lOSVQ6CisJCWFwLT5saW5rX3RpbWUgPSBhcC0+Y3VyX3RpbWU7CisJCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfU0VORF9DT05GSUdTOworCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0lETEVfREVURUNUOworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0lETEVfREVURUNUOgorCQlpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJgorCQkgICAgYXAtPnJ4Y29uZmlnID09IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQkJYnJlYWs7CisJCX0KKwkJZGVsdGEgPSBhcC0+Y3VyX3RpbWUgLSBhcC0+bGlua190aW1lOworCQlpZiAoZGVsdGEgPiBBTkVHX1NUQVRFX1NFVFRMRV9USU1FKSB7CisJCQkvKiBYWFggYW5vdGhlciBnZW0gZnJvbSB0aGUgQnJvYWRjb20gZHJpdmVyIDooICovCisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0xJTktfT0s7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfTElOS19PSzoKKwkJYXAtPmZsYWdzIHw9IChNUl9BTl9DT01QTEVURSB8IE1SX0xJTktfT0spOworCQlyZXQgPSBBTkVHX0RPTkU7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUX0lOSVQ6CisJCS8qID8/PyB1bmltcGxlbWVudGVkICovCisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUOgorCQkvKiA/Pz8gdW5pbXBsZW1lbnRlZCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IEFORUdfRkFJTEVEOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZzNfc2V0dXBfZmliZXJfcGh5KHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IG9yaWdfcGF1c2VfY2ZnOworCXVpbnQxNl90IG9yaWdfYWN0aXZlX3NwZWVkOworCXVpbnQ4X3Qgb3JpZ19hY3RpdmVfZHVwbGV4OworCWludCBjdXJyZW50X2xpbmtfdXA7CisJaW50IGk7CisKKwlvcmlnX3BhdXNlX2NmZyA9CisJCSh0cC0+dGczX2ZsYWdzICYgKFRHM19GTEFHX1JYX1BBVVNFIHwKKwkJCQkgIFRHM19GTEFHX1RYX1BBVVNFKSk7CisJb3JpZ19hY3RpdmVfc3BlZWQgPSB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkOworCW9yaWdfYWN0aXZlX2R1cGxleCA9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4OworCisJdHAtPm1hY19tb2RlICY9IH4oTUFDX01PREVfUE9SVF9NT0RFX01BU0sgfCBNQUNfTU9ERV9IQUxGX0RVUExFWCk7CisJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7CisJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwkvKiBSZXNldCB3aGVuIGluaXR0aW5nIGZpcnN0IHRpbWUgb3Igd2UgaGF2ZSBhIGxpbmsuICovCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0lOSVRfQ09NUExFVEUpIHx8CisJICAgICh0cjMyKE1BQ19TVEFUVVMpICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworCQkvKiBTZXQgUExMIGxvY2sgcmFuZ2UuICovCisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHg4MDA3KTsKKworCQkvKiBTVyByZXNldCAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKworCQkvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KKwkJbWRlbGF5KDUpOworCisJCS8qIENvbmZpZyBtb2RlOyBzZWxlY3QgUE1BL0NoIDEgcmVncy4gKi8KKwkJdGczX3dyaXRlcGh5KHRwLCAweDEwLCAweDg0MTEpOworCisJCS8qIEVuYWJsZSBhdXRvLWxvY2sgYW5kIGNvbWRldCwgc2VsZWN0IHR4Y2xrIGZvciB0eC4gKi8KKwkJdGczX3dyaXRlcGh5KHRwLCAweDExLCAweDBhMTApOworCisJCXRnM193cml0ZXBoeSh0cCwgMHgxOCwgMHgwMGEwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDQxZmYpOworCisJCS8qIEFzc2VydCBhbmQgZGVhc3NlcnQgUE9SLiAqLworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTMsIDB4MDQwMCk7CisJCXVkZWxheSg0MCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxMywgMHgwMDAwKTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTEsIDB4MGE1MCk7CisJCXVkZWxheSg0MCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxMSwgMHgwYTEwKTsKKworCQkvKiBXYWl0IGZvciBzaWduYWwgdG8gc3RhYmlsaXplICovCisJCW1kZWxheSgxNTApOworCisJCS8qIERlc2VsZWN0IHRoZSBjaGFubmVsIHJlZ2lzdGVyIHNvIHdlIGNhbiByZWFkIHRoZSBQSFlJRAorCQkgKiBsYXRlci4KKwkJICovCisJCXRnM193cml0ZXBoeSh0cCwgMHgxMCwgMHg4MDExKTsKKwl9CisKKwkvKiBEaXNhYmxlIGxpbmsgY2hhbmdlIGludGVycnVwdC4gICovCisJdHczMl9jYXJlZnVsbHkoTUFDX0VWRU5ULCAwKTsKKworCWN1cnJlbnRfbGlua191cCA9IDA7CisJaWYgKHRyMzIoTUFDX1NUQVRVUykgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpIHsKKwkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTCkpIHsKKwkJCXN0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8gYW5pbmZvOworCQkJaW50IHN0YXR1cyA9IEFORUdfRkFJTEVEOworCQkJdW5zaWduZWQgaW50IHRpY2s7CisJCQl1aW50MzJfdCB0bXA7CisKKwkJCW1lbXNldCgmYW5pbmZvLCAwLCBzaXplb2YoYW5pbmZvKSk7CisJCQlhbmluZm8uZmxhZ3MgfD0gKE1SX0FOX0VOQUJMRSk7CisKKwkJCXR3MzIoTUFDX1RYX0FVVE9fTkVHLCAwKTsKKworCQkJdG1wID0gdHAtPm1hY19tb2RlICYgfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLOworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRtcCB8IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJKTsKKworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSB8IE1BQ19NT0RFX1NFTkRfQ09ORklHUyk7CisKKwkJCWFuaW5mby5zdGF0ZSA9IEFORUdfU1RBVEVfVU5LTk9XTjsKKwkJCWFuaW5mby5jdXJfdGltZSA9IDA7CisJCQl0aWNrID0gMDsKKwkJCXdoaWxlICgrK3RpY2sgPCAxOTUwMDApIHsKKwkJCQlzdGF0dXMgPSB0ZzNfZmliZXJfYW5lZ19zbWFjaGluZSh0cCwgJmFuaW5mbyk7CisJCQkJaWYgKHN0YXR1cyA9PSBBTkVHX0RPTkUgfHwKKwkJCQkgICAgc3RhdHVzID09IEFORUdfRkFJTEVEKQorCQkJCQlicmVhazsKKworCQkJCXVkZWxheSgxKTsKKwkJCX0KKworCQkJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCQkJaWYgKHN0YXR1cyA9PSBBTkVHX0RPTkUgJiYKKwkJCSAgICAoYW5pbmZvLmZsYWdzICYKKwkJCSAgICAgKE1SX0FOX0NPTVBMRVRFIHwgTVJfTElOS19PSyB8CisJCQkgICAgICBNUl9MUF9BRFZfRlVMTF9EVVBMRVgpKSkgeworCQkJCXVpbnQzMl90IGxvY2FsX2FkdiwgcmVtb3RlX2FkdjsKKworCQkJCWxvY2FsX2FkdiA9IEFEVkVSVElTRV9QQVVTRV9DQVA7CisJCQkJcmVtb3RlX2FkdiA9IDA7CisJCQkJaWYgKGFuaW5mby5mbGFncyAmIE1SX0xQX0FEVl9TWU1fUEFVU0UpCisJCQkJCXJlbW90ZV9hZHYgfD0gTFBBX1BBVVNFX0NBUDsKKwkJCQlpZiAoYW5pbmZvLmZsYWdzICYgTVJfTFBfQURWX0FTWU1fUEFVU0UpCisJCQkJCXJlbW90ZV9hZHYgfD0gTFBBX1BBVVNFX0FTWU07CisKKwkJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCBsb2NhbF9hZHYsIHJlbW90ZV9hZHYpOworCisJCQkJdHAtPnRnM19mbGFncyB8PQorCQkJCQlURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEw7CisJCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCA2MDsgaSsrKSB7CisJCQkJdWRlbGF5KDIwKTsKKwkJCQl0dzMyX2NhcmVmdWxseShNQUNfU1RBVFVTLAorCQkJCQkoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCQkJaWYgKCh0cjMyKE1BQ19TVEFUVVMpICYKKwkJCQkgICAgIChNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8CisJCQkJICAgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGN1cnJlbnRfbGlua191cCA9PSAwICYmCisJCQkgICAgKHRyMzIoTUFDX1NUQVRVUykgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpKSB7CisJCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEZvcmNpbmcgMTAwMEZEIGxpbmsgdXAuICovCisJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQl9CisJfQorCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCisJdHAtPmh3X3N0YXR1cy0+c3RhdHVzID0KKwkJKFNEX1NUQVRVU19VUERBVEVEIHwKKwkJICh0cC0+aHdfc3RhdHVzLT5zdGF0dXMgJiB+U0RfU1RBVFVTX0xJTktfQ0hHKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJdWRlbGF5KDIwKTsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX1NUQVRVUywKKwkJCShNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8IE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKTsKKwkJaWYgKCh0cjMyKE1BQ19TVEFUVVMpICYKKwkJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkgICAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmICgodHIzMihNQUNfU1RBVFVTKSAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgPT0gMCkKKwkJY3VycmVudF9saW5rX3VwID0gMDsKKworCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMSkgeworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gU1BFRURfMTAwMDsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwl9IGVsc2UgeworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gU1BFRURfSU5WQUxJRDsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwl9CisKKwlpZiAoY3VycmVudF9saW5rX3VwICE9IHRwLT5jYXJyaWVyX29rKSB7CisJCXRwLT5jYXJyaWVyX29rID0gY3VycmVudF9saW5rX3VwOworCQl0ZzNfbGlua19yZXBvcnQodHApOworCX0gZWxzZSB7CisJCXVpbnQzMl90IG5vd19wYXVzZV9jZmcgPQorCQkJdHAtPnRnM19mbGFncyAmIChURzNfRkxBR19SWF9QQVVTRSB8CisJCQkJCSBURzNfRkxBR19UWF9QQVVTRSk7CisJCWlmIChvcmlnX3BhdXNlX2NmZyAhPSBub3dfcGF1c2VfY2ZnIHx8CisJCSAgICBvcmlnX2FjdGl2ZV9zcGVlZCAhPSB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkIHx8CisJCSAgICBvcmlnX2FjdGl2ZV9kdXBsZXggIT0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXgpCisJCQl0ZzNfbGlua19yZXBvcnQodHApOworCX0KKworCWlmICgodHIzMihNQUNfU1RBVFVTKSAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgPT0gMCkgeworCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlIHwgTUFDX01PREVfTElOS19QT0xBUklUWSk7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSU5JVF9DT01QTEVURSkgeworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHRnM19zZXR1cF9maWJlcl9waHkoVFApICgtRUlOVkFMKQorI2VuZGlmIC8qIFNVUFBPUlRfRklCRVJfUEhZICovCisKK3N0YXRpYyBpbnQgdGczX3NldHVwX3BoeShzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgZXJyOworCisJaWYgKHRwLT5waHlfaWQgPT0gUEhZX0lEX1NFUkRFUykgeworCQllcnIgPSB0ZzNfc2V0dXBfZmliZXJfcGh5KHRwKTsKKwl9IGVsc2UgeworCQllcnIgPSB0ZzNfc2V0dXBfY29wcGVyX3BoeSh0cCk7CisJfQorCisJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCAmJgorCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJdHczMihNQUNfVFhfTEVOR1RIUywKKwkJICAgICAoKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCSAgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJCSAgICAgICgweGZmIDw8IFRYX0xFTkdUSFNfU0xPVF9USU1FX1NISUZUKSkpOworCWVsc2UKKwkJdHczMihNQUNfVFhfTEVOR1RIUywKKwkJICAgICAoKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCSAgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJCSAgICAgICgzMiA8PCBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVCkpKTsKKworCXJldHVybiBlcnI7Cit9CisKKworI2RlZmluZSBNQVhfV0FJVF9DTlQgMTAwMAorCisvKiBUbyBzdG9wIGEgYmxvY2ssIGNsZWFyIHRoZSBlbmFibGUgYml0IGFuZCBwb2xsIHRpbGwgaXQKKyAqIGNsZWFycy4gIAorICovCitzdGF0aWMgaW50IHRnM19zdG9wX2Jsb2NrKHN0cnVjdCB0ZzMgKnRwLCB1bnNpZ25lZCBsb25nIG9mcywgdWludDMyX3QgZW5hYmxlX2JpdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1aW50MzJfdCB2YWw7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODcpIHsKKwkJc3dpdGNoKG9mcykgeworCQljYXNlIFJDVkxTQ19NT0RFOgorCQljYXNlIERNQUNfTU9ERToKKwkJY2FzZSBNQkZSRUVfTU9ERToKKwkJY2FzZSBCVUZNR1JfTU9ERToKKwkJY2FzZSBNRU1BUkJfTU9ERToKKwkJCS8qIFdlIGNhbid0IGVuYWJsZS9kaXNhYmxlIHRoZXNlIGJpdHMgb2YgdGhlCisJCQkgKiA1NzA1IG9yIDU3ODcsIGp1c3Qgc2F5IHN1Y2Nlc3MuCisJCQkgKi8KKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJdmFsID0gdHIzMihvZnMpOworCXZhbCAmPSB+ZW5hYmxlX2JpdDsKKwl0dzMyKG9mcywgdmFsKTsKKwl0cjMyKG9mcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1dBSVRfQ05UOyBpKyspIHsKKwkJdWRlbGF5KDEwMCk7CisJCXZhbCA9IHRyMzIob2ZzKTsKKwkJaWYgKCh2YWwgJiBlbmFibGVfYml0KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gTUFYX1dBSVRfQ05UKSB7CisJCXByaW50ZiggInRnM19zdG9wX2Jsb2NrIHRpbWVkIG91dCwgb2ZzPSUjbHggZW5hYmxlX2JpdD0lM3hcbiIsCisJCSAgICAgICBvZnMsIGVuYWJsZV9iaXQgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX2Fib3J0X2h3KHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBpLCBlcnI7CisJdWludDMyX3QgdmFsOworCisJdGczX2Rpc2FibGVfaW50cyh0cCk7CisKKwl0cC0+cnhfbW9kZSAmPSB+UlhfTU9ERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX1JYX01PREUsIHRwLT5yeF9tb2RlKTsKKworCWVyciAgPSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWQkRJX01PREUsICAgUkNWQkRJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJDVkxQQ19NT0RFLCAgIFJDVkxQQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZMU0NfTU9ERSwgICBSQ1ZMU0NfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWREJESV9NT0RFLCAgUkNWREJESV9NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZEQ0NfTU9ERSwgICBSQ1ZEQ0NfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWQ0NfTU9ERSwgICAgUkNWQ0NfTU9ERV9FTkFCTEUpOworCisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBTTkRCRFNfTU9ERSwgICBTTkRCRFNfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EQkRJX01PREUsICAgU05EQkRJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNORERBVEFJX01PREUsIFNORERBVEFJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJETUFDX01PREUsICAgIFJETUFDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNORERBVEFDX01PREUsIFNORERBVEFDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNOREJEQ19NT0RFLCAgIFNOREJEQ19NT0RFX0VOQUJMRSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX1RERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwl0cC0+dHhfbW9kZSAmPSB+VFhfTU9ERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX1RYX01PREUsIHRwLT50eF9tb2RlKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfV0FJVF9DTlQ7IGkrKykgeworCQl1ZGVsYXkoMTAwKTsKKwkJaWYgKCEodHIzMihNQUNfVFhfTU9ERSkgJiBUWF9NT0RFX0VOQUJMRSkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gTUFYX1dBSVRfQ05UKSB7CisJCXByaW50ZigidGczX2Fib3J0X2h3IHRpbWVkIG91dCBUWF9NT0RFX0VOQUJMRSB3aWxsIG5vdCBjbGVhciBNQUNfVFhfTU9ERT0leFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpIHRyMzIoTUFDX1RYX01PREUpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZXJyICA9IHRnM19zdG9wX2Jsb2NrKHRwLCBIT1NUQ0NfTU9ERSwgSE9TVENDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFdETUFDX01PREUsICBXRE1BQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBNQkZSRUVfTU9ERSwgTUJGUkVFX01PREVfRU5BQkxFKTsKKworCXZhbCA9IHRyMzIoRlRRX1JFU0VUKTsKKwl2YWwgfD0gRlRRX1JFU0VUX0RNQV9SRUFEX1FVRVVFIHwgRlRRX1JFU0VUX0RNQV9ISUdIX1BSSV9SRUFEIHwKKwkgICAgICAgRlRRX1JFU0VUX1NFTkRfQkRfQ09NUExFVElPTiB8IEZUUV9SRVNFVF9ETUFfV1JJVEUgfAorCSAgICAgICBGVFFfUkVTRVRfRE1BX0hJR0hfUFJJX1dSSVRFIHwgRlRRX1JFU0VUX1NFTkRfREFUQV9DT01QTEVUSU9OIHwKKwkgICAgICAgRlRRX1JFU0VUX0hPU1RfQ09BTEVTQ0lORyB8IEZUUV9SRVNFVF9NQUNfVFggfAorCSAgICAgICBGVFFfUkVTRVRfUlhfQkRfQ09NUExFVEUgfCBGVFFfUkVTRVRfUlhfTElTVF9QTENNVCB8CisgICAgICAgICAgICAgICBGVFFfUkVTRVRfUlhfREFUQV9DT01QTEVUSU9OOworCXR3MzIoRlRRX1JFU0VULCB2YWwpOworCisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBCVUZNR1JfTU9ERSwgQlVGTUdSX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIE1FTUFSQl9NT0RFLCBNRU1BUkJfTU9ERV9FTkFCTEUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KHRwLT5od19zdGF0dXMsIDAsIFRHM19IV19TVEFUVVNfU0laRSk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB0ZzNfY2hpcF9yZXNldChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCB2YWw7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzA0KSkgeworCQkvKiBGb3JjZSBOVlJBTSB0byBzZXR0bGUuCisJCSAqIFRoaXMgZGVhbHMgd2l0aCBhIGNoaXAgYnVnIHdoaWNoIGNhbiByZXN1bHQgaW4gRUVQUk9NCisJCSAqIGNvcnJ1cHRpb24uCisJCSAqLworCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX05WUkFNKSB7CisJCQlpbnQgaTsKKwkKKwkJCXR3MzIoTlZSQU1fU1dBUkIsIFNXQVJCX1JFUV9TRVQxKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgeworCQkJCWlmICh0cjMyKE5WUkFNX1NXQVJCKSAmIFNXQVJCX0dOVDEpCisJCQkJCWJyZWFrOworCQkJCXVkZWxheSgxMCk7CisJCQl9CisJCX0KKwl9CisJLyogSW4gRXRoZXJib290IHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIDU3MDEKKwkgKiBSRUdfV1JJVEVfQlVHIGJlY2F1c2Ugd2UgZG8gYWxsIHJlZ2lzdGVyIHdyaXRlcyBpbmRpcmVjdGx5LgorCSAqLworCisJLy8gQWxmOiBoZXJlIHBhdGNoZWQKKwkvKiBkbyB0aGUgcmVzZXQgKi8KKwl2YWwgPSBHUkNfTUlTQ19DRkdfQ09SRUNMS19SRVNFVDsKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgeworCQlpZiAodHIzMigweDdlMmMpID09IDB4NjApIHsKKwkJCXR3MzIoMHg3ZTJjLCAweDIwKTsKKwkJfQorCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3NTBfQTApIHsKKwkJCXR3MzIoR1JDX01JU0NfQ0ZHLCAoMSA8PCAyOSkpOworCQkJdmFsIHw9ICgxIDw8IDI5KTsKKwkJfQorCX0KKwkKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KQorCSAgICB8fCAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApCisJICAgIHx8IChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc4NykpIHsKKwkJdmFsIHw9IEdSQ19NSVNDX0NGR19LRUVQX0dQSFlfUE9XRVI7CisJfQorCisJLy8gQWxmIDogUGxlYXNlIFZBTElEQVRFIFRISVMuCisJLy8gSXQgaXMgbmVjZXNzYXJ5IGluIG15IGNhc2UgKDU3NTEpIHRvIHByZXZlbnQgYSByZWJvb3QsIGJ1dAorCS8vIEkgaGF2ZSBubyBpZGVhIGFib3V0IGEgc2lkZSBlZmZlY3Qgb24gYW55IG90aGVyIHZlcnNpb24uCisJLy8gSXQgYXBwZWFycyB0byBiZSB3aGF0J3MgZG9uZSBpbiB0aWdvbjMuYyBmcm9tIEJyb2FkY29tCisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzUwX0EwKSB7CisJICB0dzMyKEdSQ19NSVNDX0NGRywgMHgyMDAwMDAwMCkgOworCSAgdmFsIHw9IDB4MjAwMDAwMDAgOworCX0KKworCXR3MzIoR1JDX01JU0NfQ0ZHLCB2YWwpOworCisJLyogRmx1c2ggUENJIHBvc3RlZCB3cml0ZXMuICBUaGUgbm9ybWFsIE1NSU8gcmVnaXN0ZXJzCisJICogYXJlIGluYWNjZXNzaWJsZSBhdCB0aGlzIHRpbWUgc28gdGhpcyBpcyB0aGUgb25seQorCSAqIHdheSB0byBtYWtlIHRoaXMgcmVsaWFibHkuICBJIHRyaWVkIHRvIHVzZSBpbmRpcmVjdAorCSAqIHJlZ2lzdGVyIHJlYWQvd3JpdGUgYnV0IHRoaXMgdXBzZXQgc29tZSA1NzAxIHZhcmlhbnRzLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsICZ2YWwpOworCisJdWRlbGF5KDEyMCk7CisKKwkvKiBSZS1lbmFibGUgaW5kaXJlY3QgcmVnaXN0ZXIgYWNjZXNzZXMuICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLAorCQkJICAgICAgIHRwLT5taXNjX2hvc3RfY3RybCk7CisKKwkvKiBTZXQgTUFYIFBDSSByZXRyeSB0byB6ZXJvLiAqLworCXZhbCA9IChQQ0lTVEFURV9ST01fRU5BQkxFIHwgUENJU1RBVEVfUk9NX1JFVFJZX0VOQUJMRSk7CisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA0X0EwICYmCisJICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSkKKwkJdmFsIHw9IFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QQ0lTVEFURSwgdmFsKTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHRwLT5wZGV2LCB0cC0+cGNpX2NmZ19zdGF0ZSk7CisKKwkvKiBNYWtlIHN1cmUgUENJLVggcmVsYXhlZCBvcmRlcmluZyBiaXQgaXMgY2xlYXIuICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfWF9DQVBTLCAmdmFsKTsKKwl2YWwgJj0gflBDSVhfQ0FQU19SRUxBWEVEX09SREVSSU5HOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9YX0NBUFMsIHZhbCk7CisKKwl0dzMyKE1FTUFSQl9NT0RFLCBNRU1BUkJfTU9ERV9FTkFCTEUpOworCisJaWYgKCgodHAtPm5pY19zcmFtX2RhdGFfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfTUlOSV9QQ0kpICE9IDApICYmCisJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkpIHsKKwkJdHAtPnBjaV9jbG9ja19jdHJsIHw9CisJCQkoQ0xPQ0tfQ1RSTF9GT1JDRV9DTEtSVU4gfCBDTE9DS19DVFJMX0NMS1JVTl9PRU5BQkxFKTsKKwkJdHczMihURzNQQ0lfQ0xPQ0tfQ1RSTCwgdHAtPnBjaV9jbG9ja19jdHJsKTsKKwl9CisKKwl0dzMyKFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwgdHAtPm1pc2NfaG9zdF9jdHJsKTsKK30KKworc3RhdGljIHZvaWQgdGczX3N0b3BfZncoc3RydWN0IHRnMyAqdHApCit7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSB7CisJCXVpbnQzMl90IHZhbDsKKwkJaW50IGk7CisKKwkJdGczX3dyaXRlX21lbShOSUNfU1JBTV9GV19DTURfTUJPWCwgRldDTURfTklDRFJWX1BBVVNFX0ZXKTsKKwkJdmFsID0gdHIzMihHUkNfUlhfQ1BVX0VWRU5UKTsKKwkJdmFsIHw9ICgxIDw8IDE0KTsKKwkJdHczMihHUkNfUlhfQ1BVX0VWRU5ULCB2YWwpOworCisJCS8qIFdhaXQgZm9yIFJYIGNwdSB0byBBQ0sgdGhlIGV2ZW50LiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQlpZiAoISh0cjMyKEdSQ19SWF9DUFVfRVZFTlQpICYgKDEgPDwgMTQpKSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB0ZzNfcmVzdGFydF9mdyhzdHJ1Y3QgdGczICp0cCwgdWludDMyX3Qgc3RhdGUpCit7CisJdWludDMyX3QgdmFsOworCWludCBpOworCQorCXRnM193cml0ZV9tZW0oTklDX1NSQU1fRklSTVdBUkVfTUJPWCwgCisJCU5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxKTsKKwkvKiBXYWl0IGZvciBmaXJtd2FyZSBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKwkJdGczX3JlYWRfbWVtKE5JQ19TUkFNX0ZJUk1XQVJFX01CT1gsICZ2YWwpOworCQlpZiAodmFsID09ICh1aW50MzJfdCkgfk5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChpID49IDEwMDAwMCAmJgorCQkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzA0KSAmJgorCQkgICAgIShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc4NykpIHsKKwkJcHJpbnRmICggIkZpcm13YXJlIHdpbGwgbm90IHJlc3RhcnQgbWFnaWM9JSN4XG4iLAorCQkJdmFsICk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpIHsKKwkgIHN0YXRlID0gRFJWX1NUQVRFX1NVU1BFTkQ7CisJfQorCisJaWYgKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSAmJgorCSAgICAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3NTBfQTApKSB7CisJICAvLyBFbmFibGUgUENJRSBidWcgZml4CisJICB0ZzNfcmVhZF9tZW0oMHg3YzAwLCAmdmFsKTsKKwkgIHRnM193cml0ZV9tZW0oMHg3YzAwLCB2YWwgfCAweDAyMDAwMDAwKTsKKwl9CisJdGczX3dyaXRlX21lbShOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwgc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19oYWx0KHN0cnVjdCB0ZzMgKnRwKQoreworCXRnM19zdG9wX2Z3KHRwKTsKKwl0ZzNfYWJvcnRfaHcodHApOworCXRnM19jaGlwX3Jlc2V0KHRwKTsKKwlyZXR1cm4gdGczX3Jlc3RhcnRfZncodHAsIERSVl9TVEFURV9VTkxPQUQpOworfQorCitzdGF0aWMgdm9pZCBfX3RnM19zZXRfbWFjX2FkZHIoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgYWRkcl9oaWdoLCBhZGRyX2xvdzsKKwlpbnQgaTsKKworCWFkZHJfaGlnaCA9ICgodHAtPm5pYy0+bm9kZV9hZGRyWzBdIDw8IDgpIHwKKwkJICAgICB0cC0+bmljLT5ub2RlX2FkZHJbMV0pOworCWFkZHJfbG93ID0gKCh0cC0+bmljLT5ub2RlX2FkZHJbMl0gPDwgMjQpIHwKKwkJICAgICh0cC0+bmljLT5ub2RlX2FkZHJbM10gPDwgMTYpIHwKKwkJICAgICh0cC0+bmljLT5ub2RlX2FkZHJbNF0gPDwgIDgpIHwKKwkJICAgICh0cC0+bmljLT5ub2RlX2FkZHJbNV0gPDwgIDApKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXR3MzIoTUFDX0FERFJfMF9ISUdIICsgKGkgKiA4KSwgYWRkcl9oaWdoKTsKKwkJdHczMihNQUNfQUREUl8wX0xPVyArIChpICogOCksIGFkZHJfbG93KTsKKwl9CisKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAwKSAmJgorCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEpICYmCisJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkpIHsKKwkJZm9yKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQkJdHczMihNQUNfRVhUQUREUl8wX0hJR0ggKyAoaSAqIDgpLCBhZGRyX2hpZ2gpOworCQkJdHczMihNQUNfRVhUQUREUl8wX0xPVyArIChpICogOCksIGFkZHJfbG93KTsKKwkJfQorCX0KKwlhZGRyX2hpZ2ggPSAodHAtPm5pYy0+bm9kZV9hZGRyWzBdICsKKwkJICAgICB0cC0+bmljLT5ub2RlX2FkZHJbMV0gKworCQkgICAgIHRwLT5uaWMtPm5vZGVfYWRkclsyXSArCisJCSAgICAgdHAtPm5pYy0+bm9kZV9hZGRyWzNdICsKKwkJICAgICB0cC0+bmljLT5ub2RlX2FkZHJbNF0gKworCQkgICAgIHRwLT5uaWMtPm5vZGVfYWRkcls1XSkgJgorCQlUWF9CQUNLT0ZGX1NFRURfTUFTSzsKKwl0dzMyKE1BQ19UWF9CQUNLT0ZGX1NFRUQsIGFkZHJfaGlnaCk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zZXRfYmRpbmZvKHN0cnVjdCB0ZzMgKnRwLCB1aW50MzJfdCBiZGluZm9fYWRkciwKKwkJCSAgIGRtYV9hZGRyX3QgbWFwcGluZywgdWludDMyX3QgbWF4bGVuX2ZsYWdzLAorCQkJICAgdWludDMyX3QgbmljX2FkZHIpCit7CisJdGczX3dyaXRlX21lbSgoYmRpbmZvX2FkZHIgKworCQkgICAgICAgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gpLAorCQkgICAgICAoKHVpbnQ2NF90KSBtYXBwaW5nID4+IDMyKSk7CisJdGczX3dyaXRlX21lbSgoYmRpbmZvX2FkZHIgKworCQkgICAgICAgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVyksCisJCSAgICAgICgodWludDY0X3QpIG1hcHBpbmcgJiAweGZmZmZmZmZmKSk7CisJdGczX3dyaXRlX21lbSgoYmRpbmZvX2FkZHIgKworCQkgICAgICAgVEczX0JESU5GT19NQVhMRU5fRkxBR1MpLAorCQkgICAgICAgbWF4bGVuX2ZsYWdzKTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUpIHsKKwkJdGczX3dyaXRlX21lbSgoYmRpbmZvX2FkZHIgKyBURzNfQkRJTkZPX05JQ19BRERSKSwgbmljX2FkZHIpOworCX0KK30KKworCitzdGF0aWMgdm9pZCB0ZzNfaW5pdF9yaW5ncyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1bnNpZ25lZCBpOworCisJLyogWmVybyBvdXQgdGhlIHRnMyB2YXJpYWJsZXMgKi8KKwltZW1zZXQoJnRnM19ic3MsIDAsIHNpemVvZih0ZzNfYnNzKSk7CisJdHAtPnJ4X3N0ZCAgICA9ICZ0ZzNfYnNzLnJ4X3N0ZFswXTsKKwl0cC0+cnhfcmNiICAgID0gJnRnM19ic3MucnhfcmNiWzBdOworCXRwLT50eF9yaW5nICAgPSAmdGczX2Jzcy50eF9yaW5nWzBdOworCXRwLT5od19zdGF0dXMgPSAmdGczX2Jzcy5od19zdGF0dXM7CisJdHAtPmh3X3N0YXRzICA9ICZ0ZzNfYnNzLmh3X3N0YXRzOworCXRwLT5tYWNfbW9kZSAgPSAwOworCisKKwkvKiBJbml0aWFsaXplIHR4L3J4IHJpbmdzIGZvciBwYWNrZXQgcHJvY2Vzc2luZy4KKwkgKgorCSAqIFRoZSBjaGlwIGhhcyBiZWVuIHNodXQgZG93biBhbmQgdGhlIGRyaXZlciBkZXRhY2hlZCBmcm9tCisJICogdGhlIG5ldHdvcmtpbmcsIHNvIG5vIGludGVycnVwdHMgb3IgbmV3IHR4IHBhY2tldHMgd2lsbAorCSAqIGVuZCB1cCBpbiB0aGUgZHJpdmVyLgorCSAqLworCisJLyogSW5pdGlhbGl6ZSBpbnZhcmlhbnRzIG9mIHRoZSByaW5ncywgd2Ugb25seSBzZXQgdGhpcworCSAqIHN0dWZmIG9uY2UuICBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGNhcmQgZG9lcyBub3QKKwkgKiB3cml0ZSBpbnRvIHRoZSByeCBidWZmZXIgcG9zdGluZyByaW5ncy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVEczX1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgKnJ4ZDsKKworCQlyeGQgPSAmdHAtPnJ4X3N0ZFtpXTsKKwkJcnhkLT5pZHhfbGVuID0gKFJYX1BLVF9CVUZfU1ogLSAyIC0gNjQpCTw8IFJYRF9MRU5fU0hJRlQ7CisJCXJ4ZC0+dHlwZV9mbGFncyA9IChSWERfRkxBR19FTkQgPDwgUlhEX0ZMQUdTX1NISUZUKTsKKwkJcnhkLT5vcGFxdWUgPSAoUlhEX09QQVFVRV9SSU5HX1NURCB8IChpIDw8IFJYRF9PUEFRVUVfSU5ERVhfU0hJRlQpKTsKKworCQkvKiBOb3RlIHdoZXJlIHRoZSByZWNlaXZlIGJ1ZmZlciBmb3IgdGhlIHJpbmcgaXMgcGxhY2VkICovCisJCXJ4ZC0+YWRkcl9oaSA9IDA7CisJCXJ4ZC0+YWRkcl9sbyA9IHZpcnRfdG9fYnVzKAorCQkJJnRnM19ic3MucnhfYnVmc1tpJVRHM19ERUZfUlhfUklOR19QRU5ESU5HXVsyXSk7CisJfQorfQorCisjZGVmaW5lIFRHM19XUklURV9TRVRUSU5HUyhUQUJMRSkgXAorZG8geyBcCisJY29uc3QgdWludDMyX3QgKl90YWJsZSwgKl9lbmQ7IFwKKwlfdGFibGUgPSBUQUJMRTsgXAorCV9lbmQgPSBfdGFibGUgKyBzaXplb2YoVEFCTEUpL3NpemVvZihUQUJMRVswXSk7ICBcCisJZm9yKDsgX3RhYmxlIDwgX2VuZDsgX3RhYmxlICs9IDIpIHsgXAorCQl0dzMyKF90YWJsZVswXSwgX3RhYmxlWzFdKTsgXAorCX0gXAorfSB3aGlsZSgwKQorCisKKy8qIGluaXRpYWxpemUvcmVzZXQgdGhlIHRnMyAqLworc3RhdGljIGludCB0ZzNfc2V0dXBfaHcoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgdmFsLCByZG1hY19tb2RlOworCWludCBpLCBlcnIsIGxpbWl0OworCisJLyogU2ltcGx5IGRvbid0IHN1cHBvcnQgc2V0dXBzIHdpdGggZXh0cmVtbHkgYnVnZ3kgZmlybXdhcmUgaW4gZXRoZXJib290ICovCisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwKSB7CisJCXByaW50ZigiRXJyb3IgNTcwMV9BMCBmaXJtd2FyZSBidWcgZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKworCS8qIE9yaWdpbmFsbHkgdGhpcyB3YXMgYWxsIGluIHRnM19pbml0X2h3ICovCisKKwkvKiBGb3JjZSB0aGUgY2hpcCBpbnRvIEQwLiAqLworCXRnM19zZXRfcG93ZXJfc3RhdGVfMCh0cCk7CisKKwl0ZzNfc3dpdGNoX2Nsb2Nrcyh0cCk7CisKKwl0dzMyKFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgMCk7CisKKwkvLyBUaGlzIHNob3VsZCBnbyBzb21ld2hlcmUgZWxzZQorI2RlZmluZSBUM19QQ0lFX0NBUEFCSUxJVFlfSURfUkVHICAgICAgICAgICAweEQwCisjZGVmaW5lIFQzX1BDSUVfQ0FQQUJJTElUWV9JRCAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgVDNfUENJRV9DQVBBQklMSVRZX1JFRyAgICAgICAgICAgICAgMHhEMgorCisJLyogT3JpZ2luYWxseSB0aGlzIHdhcyBhbGwgaW4gdGczX3Jlc2V0X2h3ICovCisKKwl0ZzNfc3RvcF9mdyh0cCk7CisKKwkvKiBObyBuZWVkIHRvIGNhbGwgdGczX2Fib3J0X2h3IGhlcmUsIGl0IGlzIGNhbGxlZCBiZWZvcmUgdGczX3NldHVwX2h3LiAqLworCisJdGczX2NoaXBfcmVzZXQodHApOworCisJdHczMihHUkNfTU9ERSwgdHAtPmdyY19tb2RlKTsgIC8qIFJlZHVuZGFudD8gKi8KKworCWVyciA9IHRnM19yZXN0YXJ0X2Z3KHRwLCBEUlZfU1RBVEVfU1RBUlQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAodHAtPnBoeV9pZCA9PSBQSFlfSURfU0VSREVTKSB7CisJCXRwLT5tYWNfbW9kZSA9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7CisJfQorCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCisKKwkvKiBUaGlzIHdvcmtzIGFyb3VuZCBhbiBpc3N1ZSB3aXRoIEF0aGxvbiBjaGlwc2V0cyBvbgorCSAqIEIzIHRpZ29uMyBzaWxpY29uLiAgVGhpcyBiaXQgaGFzIG5vIGVmZmVjdCBvbiBhbnkKKwkgKiBvdGhlciByZXZpc2lvbi4KKwkgKiBBbGY6IEV4Y2VwdCA1NzUwICEgKHdoaWNoIHJlYm9vdHMpCisJICovCisKKyAgICAgICAgaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykpCisJICB0cC0+cGNpX2Nsb2NrX2N0cmwgfD0gQ0xPQ0tfQ1RSTF9ERUxBWV9QQ0lfR1JBTlQ7CisJdHczMl9jYXJlZnVsbHkoVEczUENJX0NMT0NLX0NUUkwsIHRwLT5wY2lfY2xvY2tfY3RybCk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDRfQTAgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpKSB7CisJCXZhbCA9IHRyMzIoVEczUENJX1BDSVNUQVRFKTsKKwkJdmFsIHw9IFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BOworCQl0dzMyKFRHM1BDSV9QQ0lTVEFURSwgdmFsKTsKKwl9CisKKwkvKiBEZXNjcmlwdG9yIHJpbmcgaW5pdCBtYXkgbWFrZSBhY2Nlc3NlcyB0byB0aGUKKwkgKiBOSUMgU1JBTSBhcmVhIHRvIHNldHVwIHRoZSBUWCBkZXNjcmlwdG9ycywgc28gd2UKKwkgKiBjYW4gb25seSBkbyB0aGlzIGFmdGVyIHRoZSBoYXJkd2FyZSBoYXMgYmVlbgorCSAqIHN1Y2Nlc3NmdWxseSByZXNldC4KKwkgKi8KKwl0ZzNfaW5pdF9yaW5ncyh0cCk7CisKKwkvKiBDbGVhciBzdGF0aXN0aWNzL3N0YXR1cyBibG9jayBpbiBjaGlwICovCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSB7CisJCWZvciAoaSA9IE5JQ19TUkFNX1NUQVRTX0JMSzsKKwkJICAgICBpIDwgTklDX1NSQU1fU1RBVFVTX0JMSyArIFRHM19IV19TVEFUVVNfU0laRTsKKwkJICAgICBpICs9IHNpemVvZih1aW50MzJfdCkpIHsKKwkJCXRnM193cml0ZV9tZW0oaSwgMCk7CisJCQl1ZGVsYXkoNDApOworCQl9CisJfQorCisJLyogVGhpcyB2YWx1ZSBpcyBkZXRlcm1pbmVkIGR1cmluZyB0aGUgcHJvYmUgdGltZSBETUEKKwkgKiBlbmdpbmUgdGVzdCwgdGczX3NldHVwX2RtYS4KKwkgKi8KKwl0dzMyKFRHM1BDSV9ETUFfUldfQ1RSTCwgdHAtPmRtYV9yd2N0cmwpOworCisJdHAtPmdyY19tb2RlICY9IH4oR1JDX01PREVfSE9TVF9TRU5EQkRTIHwKKwkJCSAgR1JDX01PREVfNFhfTklDX1NFTkRfUklOR1MgfAorCQkJICBHUkNfTU9ERV9OT19UWF9QSERSX0NTVU0gfAorCQkJICBHUkNfTU9ERV9OT19SWF9QSERSX0NTVU0pOworCXRwLT5ncmNfbW9kZSB8PSBHUkNfTU9ERV9IT1NUX1NFTkRCRFM7CisJdHAtPmdyY19tb2RlIHw9IEdSQ19NT0RFX05PX1RYX1BIRFJfQ1NVTTsKKwl0cC0+Z3JjX21vZGUgfD0gR1JDX01PREVfTk9fUlhfUEhEUl9DU1VNOworCisJdHczMihHUkNfTU9ERSwKKwkJdHAtPmdyY19tb2RlIHwgCisJCShHUkNfTU9ERV9JUlFfT05fTUFDX0FUVE4gfCBHUkNfTU9ERV9IT1NUX1NUQUNLVVApKTsKKworCS8qIFNldHVwIHRoZSB0aW1lciBwcmVzY2FsYXIgcmVnaXN0ZXIuICBDbG9jayBpcyBhbHdheXMgNjZNaHouICovCisJdHczMihHUkNfTUlTQ19DRkcsCisJICAgICAoNjUgPDwgR1JDX01JU0NfQ0ZHX1BSRVNDQUxBUl9TSElGVCkpOworCisJLyogSW5pdGlhbGl6ZSBNQlVGL0RFU0MgcG9vbC4gKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODcpIHsKKwkJLyogRG8gbm90aGluZy4gKi8KKwl9IGVsc2UgaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgJiYKKwkJKHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzIxKSkgeworCQl0dzMyKEJVRk1HUl9NQl9QT09MX0FERFIsIE5JQ19TUkFNX01CVUZfUE9PTF9CQVNFKTsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KQorCQkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLCBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTY0KTsKKwkJZWxzZQorCQkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLCBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTk2KTsKKwkJdHczMihCVUZNR1JfRE1BX0RFU0NfUE9PTF9BRERSLCBOSUNfU1JBTV9ETUFfREVTQ19QT09MX0JBU0UpOworCQl0dzMyKEJVRk1HUl9ETUFfREVTQ19QT09MX1NJWkUsIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfU0laRSk7CisJfQorCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19KVU1CT19FTkFCTEUpKSB7CisJCXR3MzIoQlVGTUdSX01CX1JETUFfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyKTsKKwkJdHczMihCVUZNR1JfTUJfTUFDUlhfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfbWFjX3J4X2xvd193YXRlcik7CisJCXR3MzIoQlVGTUdSX01CX0hJR0hfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9oaWdoX3dhdGVyKTsKKwl9IGVsc2UgeworCQl0dzMyKEJVRk1HUl9NQl9SRE1BX0xPV19XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibyk7CisJCXR3MzIoQlVGTUdSX01CX01BQ1JYX0xPV19XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX21hY19yeF9sb3dfd2F0ZXJfanVtYm8pOworCQl0dzMyKEJVRk1HUl9NQl9ISUdIX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfaGlnaF93YXRlcl9qdW1ibyk7CisJfQorCXR3MzIoQlVGTUdSX0RNQV9MT1dfV0FURVIsCisJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5kbWFfbG93X3dhdGVyKTsKKwl0dzMyKEJVRk1HUl9ETUFfSElHSF9XQVRFUiwKKwkgICAgIHRwLT5idWZtZ3JfY29uZmlnLmRtYV9oaWdoX3dhdGVyKTsKKworCXR3MzIoQlVGTUdSX01PREUsIEJVRk1HUl9NT0RFX0VOQUJMRSB8IEJVRk1HUl9NT0RFX0FUVE5fRU5BQkxFKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisJCWlmICh0cjMyKEJVRk1HUl9NT0RFKSAmIEJVRk1HUl9NT0RFX0VOQUJMRSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA+PSAyMDAwKSB7CisJCXByaW50ZigidGczX3NldHVwX2h3IGNhbm5vdCBlbmFibGUgQlVGTUdSXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdHczMihGVFFfUkVTRVQsIDB4ZmZmZmZmZmYpOworCXR3MzIoRlRRX1JFU0VULCAweDAwMDAwMDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisJCWlmICh0cjMyKEZUUV9SRVNFVCkgPT0gMHgwMDAwMDAwMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA+PSAyMDAwKSB7CisJCXByaW50ZigidGczX3NldHVwX2h3IGNhbm5vdCByZXNldCBGVFFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBJbml0aWFsaXplIFRHM19CRElORk8ncyBhdDoKKwkgKiAgUkNWREJESV9TVERfQkQ6CXN0YW5kYXJkIGV0aCBzaXplIHJ4IHJpbmcKKwkgKiAgUkNWREJESV9KVU1CT19CRDoJanVtYm8gZnJhbWUgcnggcmluZworCSAqICBSQ1ZEQkRJX01JTklfQkQ6CXNtYWxsIGZyYW1lIHJ4IHJpbmcgKD8/PyBkb2VzIG5vdCB3b3JrKQorCSAqCisJICogbGlrZSBzbzoKKwkgKiAgVEczX0JESU5GT19IT1NUX0FERFI6CWhpZ2gvbG93IHBhcnRzIG9mIERNQSBhZGRyZXNzIG9mIHJpbmcKKwkgKiAgVEczX0JESU5GT19NQVhMRU5fRkxBR1M6CShyeCBtYXggYnVmZmVyIHNpemUgPDwgMTYpIHwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmcgYXR0cmlidXRlIGZsYWdzCisJICogIFRHM19CRElORk9fTklDX0FERFI6CWxvY2F0aW9uIG9mIGRlc2NyaXB0b3JzIGluIG5pYyBTUkFNCisJICoKKwkgKiBTdGFuZGFyZCByZWNlaXZlIHJpbmcgQCBOSUNfU1JBTV9SWF9CVUZGRVJfREVTQywgNTEyIGVudHJpZXMuCisJICogSnVtYm8gcmVjZWl2ZSByaW5nIEAgTklDX1NSQU1fUlhfSlVNQk9fQlVGRkVSX0RFU0MsIDI1NiBlbnRyaWVzLgorCSAqCisJICogPz8/IE5vIHNwYWNlIGFsbG9jYXRlZCBmb3IgbWluaSByZWNlaXZlIHJpbmc/IDooCisJICoKKwkgKiBUaGUgc2l6ZSBvZiBlYWNoIHJpbmcgaXMgZml4ZWQgaW4gdGhlIGZpcm13YXJlLCBidXQgdGhlIGxvY2F0aW9uIGlzCisJICogY29uZmlndXJhYmxlLgorCSAqLworCXsKKwkJc3RhdGljIGNvbnN0IHVpbnQzMl90IHRhYmxlX2FsbFtdID0geworCQkJLyogU2V0dXAgcmVwbGVuaXNoIHRocmVzaG9sZHMuICovCisJCQlSQ1ZCRElfU1REX1RIUkVTSCwgVEczX0RFRl9SWF9SSU5HX1BFTkRJTkcgLyA4LAorCisJCQkvKiBFdGhlcmJvb3QgbGl2ZXMgYmVsb3cgNEdCICovCisJCQlSQ1ZEQkRJX1NURF9CRCArIFRHM19CRElORk9fSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdILCAwLAorCQkJUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX05JQ19BRERSLCBOSUNfU1JBTV9SWF9CVUZGRVJfREVTQywKKwkJfTsKKwkJc3RhdGljIGNvbnN0IHVpbnQzMl90IHRhYmxlX25vdF81NzA1W10gPSB7CisJCQkvKiBCdWZmZXIgbWF4aW11bSBsZW5ndGggKi8KKwkJCVJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsIFJYX1NURF9NQVhfU0laRSA8PCBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZULAorCQkJCisJCQkvKiBEaXNhYmxlIHRoZSBtaW5pIGZyYW1lIHJ4IHJpbmcgKi8KKwkJCVJDVkRCRElfTUlOSV9CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAlCRElORk9fRkxBR1NfRElTQUJMRUQsCisJCQkKKwkJCS8qIERpc2FibGUgdGhlIGp1bWJvIGZyYW1lIHJ4IHJpbmcgKi8KKwkJCVJDVkJESV9KVU1CT19USFJFU0gsIDAsCisJCQlSQ1ZEQkRJX0pVTUJPX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsIEJESU5GT19GTEFHU19ESVNBQkxFRCwKKwkJCQorCQkJCisJCX07CisJCVRHM19XUklURV9TRVRUSU5HUyh0YWJsZV9hbGwpOworCQl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVywgCisJCQl2aXJ0X3RvX2J1cyh0cC0+cnhfc3RkKSk7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSB8fAorCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODcpIHsKKwkJCXR3MzIoUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJCQlSWF9TVERfTUFYX1NJWkVfNTcwNSA8PCBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKTsKKwkJfSBlbHNlIHsKKwkJCVRHM19XUklURV9TRVRUSU5HUyh0YWJsZV9ub3RfNTcwNSk7CisJCX0KKwl9CisKKwkKKwkvKiBUaGVyZSBpcyBvbmx5IG9uZSBzZW5kIHJpbmcgb24gNTcwNSBhbmQgNTc4Nywgbm8gbmVlZCB0byBleHBsaWNpdGx5CisJICogZGlzYWJsZSB0aGUgb3RoZXJzLgorCSAqLworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSAmJgorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc4NykgeworCQkvKiBDbGVhciBvdXQgc2VuZCBSQ0IgcmluZyBpbiBTUkFNLiAqLworCQlmb3IgKGkgPSBOSUNfU1JBTV9TRU5EX1JDQjsgaSA8IE5JQ19TUkFNX1JDVl9SRVRfUkNCOyBpICs9IFRHM19CRElORk9fU0laRSkKKwkJCXRnM193cml0ZV9tZW0oaSArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLCBCRElORk9fRkxBR1NfRElTQUJMRUQpOworCX0KKworCXRwLT50eF9wcm9kID0gMDsKKwl0dzMyX21haWxib3goTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMCk7CisJdHczMl9tYWlsYm94MihNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCisJdGczX3NldF9iZGluZm8odHAsCisJCU5JQ19TUkFNX1NFTkRfUkNCLAorCQl2aXJ0X3RvX2J1cyh0cC0+dHhfcmluZyksCisJCShURzNfVFhfUklOR19TSVpFIDw8IEJESU5GT19GTEFHU19NQVhMRU5fU0hJRlQpLAorCQlOSUNfU1JBTV9UWF9CVUZGRVJfREVTQyk7CisKKwkvKiBUaGVyZSBpcyBvbmx5IG9uZSByZWNlaXZlIHJldHVybiByaW5nIG9uIDU3MDUgYW5kIDU3ODcsIG5vIG5lZWQgdG8KKwkgKiBleHBsaWNpdGx5IGRpc2FibGUgdGhlIG90aGVycy4KKwkgKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3ODcpIHsKKwkJZm9yIChpID0gTklDX1NSQU1fUkNWX1JFVF9SQ0I7IGkgPCBOSUNfU1JBTV9TVEFUU19CTEs7IGkgKz0gVEczX0JESU5GT19TSVpFKSB7CisJCQl0ZzNfd3JpdGVfbWVtKGkgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJCQlCRElORk9fRkxBR1NfRElTQUJMRUQpOworCQl9CisJfQorCisJdHAtPnJ4X3JjYl9wdHIgPSAwOworCXR3MzJfbWFpbGJveDIoTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCisJdGczX3NldF9iZGluZm8odHAsCisJCU5JQ19TUkFNX1JDVl9SRVRfUkNCLAorCQl2aXJ0X3RvX2J1cyh0cC0+cnhfcmNiKSwKKwkJKFRHM19SWF9SQ0JfUklOR19TSVpFIDw8IEJESU5GT19GTEFHU19NQVhMRU5fU0hJRlQpLAorCQkwKTsKKworCXRwLT5yeF9zdGRfcHRyID0gVEczX0RFRl9SWF9SSU5HX1BFTkRJTkc7CisJdHczMl9tYWlsYm94MihNQUlMQk9YX1JDVl9TVERfUFJPRF9JRFggKyBURzNfNjRCSVRfUkVHX0xPVywKKwkJICAgICB0cC0+cnhfc3RkX3B0cik7CisKKwl0dzMyX21haWxib3gyKE1BSUxCT1hfUkNWX0pVTUJPX1BST0RfSURYICsgVEczXzY0QklUX1JFR19MT1csIDApOworCisJLyogSW5pdGlhbGl6ZSBNQUMgYWRkcmVzcyBhbmQgYmFja29mZiBzZWVkLiAqLworCV9fdGczX3NldF9tYWNfYWRkcih0cCk7CisKKwkvKiBDYWxjdWxhdGUgUkRNQUNfTU9ERSBzZXR0aW5nIGVhcmx5LCB3ZSBuZWVkIGl0IHRvIGRldGVybWluZQorCSAqIHRoZSBSQ1ZMUENfU1RBVEVfRU5BQkxFIG1hc2suCisJICovCisJcmRtYWNfbW9kZSA9IChSRE1BQ19NT0RFX0VOQUJMRSB8IFJETUFDX01PREVfVEdUQUJPUlRfRU5BQiB8CisJCVJETUFDX01PREVfTVNUQUJPUlRfRU5BQiB8IFJETUFDX01PREVfUEFSSVRZRVJSX0VOQUIgfAorCQlSRE1BQ19NT0RFX0FERFJPRkxPV19FTkFCIHwgUkRNQUNfTU9ERV9GSUZPT0ZMT1dfRU5BQiB8CisJCVJETUFDX01PREVfRklGT1VSVU5fRU5BQiB8IFJETUFDX01PREVfRklGT09SRUFEX0VOQUIgfAorCQlSRE1BQ19NT0RFX0xOR1JFQURfRU5BQik7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19TUExJVF9NT0RFKQorCQlyZG1hY19tb2RlIHw9IFJETUFDX01PREVfU1BMSVRfRU5BQkxFOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgeworCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDVfQTApIHsKKwkJCWlmICghKHRyMzIoVEczUENJX1BDSVNUQVRFKSAmIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdIKSAmJgorCQkJCSEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9JU181Nzg4KSkgeworCQkJCXJkbWFjX21vZGUgfD0gUkRNQUNfTU9ERV9GSUZPX0xPTkdfQlVSU1Q7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTZXR1cCBob3N0IGNvYWxlc2NpbmcgZW5naW5lLiAqLworCXR3MzIoSE9TVENDX01PREUsIDApOworCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJaWYgKCEodHIzMihIT1NUQ0NfTU9ERSkgJiBIT1NUQ0NfTU9ERV9FTkFCTEUpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJdHAtPm1hY19tb2RlID0gTUFDX01PREVfVFhTVEFUX0VOQUJMRSB8IE1BQ19NT0RFX1JYU1RBVF9FTkFCTEUgfAorCQlNQUNfTU9ERV9UREVfRU5BQkxFIHwgTUFDX01PREVfUkRFX0VOQUJMRSB8IE1BQ19NT0RFX0ZIREVfRU5BQkxFOworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUgfCBNQUNfTU9ERV9SWFNUQVRfQ0xFQVIgfCBNQUNfTU9ERV9UWFNUQVRfQ0xFQVIpOworCisJdHAtPmdyY19sb2NhbF9jdHJsID0gR1JDX0xDTENUUkxfSU5UX09OX0FUVE4gfCBHUkNfTENMQ1RSTF9BVVRPX1NFRVBST007CisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwKQorCQl0cC0+Z3JjX2xvY2FsX2N0cmwgfD0gKEdSQ19MQ0xDVFJMX0dQSU9fT0UxIHwKKwkJCQkgICAgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxKTsKKwl0dzMyX2NhcmVmdWxseShHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsKTsKKworCXR3MzJfbWFpbGJveChNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCXRyMzIoTUFJTEJPWF9JTlRFUlJVUFRfMCk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUpIHsKKwkJdHczMl9jYXJlZnVsbHkoRE1BQ19NT0RFLCBETUFDX01PREVfRU5BQkxFKTsKKwl9CisKKwl2YWwgPSAoCVdETUFDX01PREVfRU5BQkxFIHwgV0RNQUNfTU9ERV9UR1RBQk9SVF9FTkFCIHwKKwkJV0RNQUNfTU9ERV9NU1RBQk9SVF9FTkFCIHwgV0RNQUNfTU9ERV9QQVJJVFlFUlJfRU5BQiB8CisJCVdETUFDX01PREVfQUREUk9GTE9XX0VOQUIgfCBXRE1BQ19NT0RFX0ZJRk9PRkxPV19FTkFCIHwKKwkJV0RNQUNfTU9ERV9GSUZPVVJVTl9FTkFCIHwgV0RNQUNfTU9ERV9GSUZPT1JFQURfRU5BQiB8CisJCVdETUFDX01PREVfTE5HUkVBRF9FTkFCKTsKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSAmJgorCQkoKHRyMzIoVEczUENJX1BDSVNUQVRFKSAmIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdIKSAhPSAwKSAmJgorCQkhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSVNfNTc4OCkpIHsKKwkJdmFsIHw9IFdETUFDX01PREVfUlhfQUNDRUw7CisJfQorCisJLyogSG9zdCBjb2FsZXNjaW5nIGJ1ZyBmaXggKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODcpCisJCXZhbCB8PSAoMSA8PCAyOSk7CisKKwl0dzMyX2NhcmVmdWxseShXRE1BQ19NT0RFLCB2YWwpOworCisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSAhPSAwKSB7CisJCXZhbCA9IHRyMzIoVEczUENJX1hfQ0FQUyk7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMykgeworCQkJdmFsICY9IFBDSVhfQ0FQU19CVVJTVF9NQVNLOworCQkJdmFsIHw9IChQQ0lYX0NBUFNfTUFYX0JVUlNUX0NQSU9CIDw8IFBDSVhfQ0FQU19CVVJTVF9TSElGVCk7CisJCX0gZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHsKKwkJCXZhbCAmPSB+KFBDSVhfQ0FQU19TUExJVF9NQVNLIHwgUENJWF9DQVBTX0JVUlNUX01BU0spOworCQkJdmFsIHw9IChQQ0lYX0NBUFNfTUFYX0JVUlNUX0NQSU9CIDw8IFBDSVhfQ0FQU19CVVJTVF9TSElGVCk7CisJCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1NQTElUX01PREUpCisJCQkJdmFsIHw9ICh0cC0+c3BsaXRfbW9kZV9tYXhfcmVxcyA8PAorCQkJCQlQQ0lYX0NBUFNfU1BMSVRfU0hJRlQpOworCQl9CisJCXR3MzIoVEczUENJX1hfQ0FQUywgdmFsKTsKKwl9CisKKwl0dzMyX2NhcmVmdWxseShSRE1BQ19NT0RFLCByZG1hY19tb2RlKTsKKwl7CisJCXN0YXRpYyBjb25zdCB1aW50MzJfdCB0YWJsZV9hbGxbXSA9IHsKKwkJCS8qIE1UVSArIGV0aGVybmV0IGhlYWRlciArIEZDUyArIG9wdGlvbmFsIFZMQU4gdGFnICovCisJCQlNQUNfUlhfTVRVX1NJWkUsIEVUSF9NQVhfTVRVICsgRVRIX0hMRU4gKyA4LAorCQkJCisJCQkvKiBUaGUgc2xvdCB0aW1lIGlzIGNoYW5nZWQgYnkgdGczX3NldHVwX3BoeSBpZiB3ZQorCQkJICogcnVuIGF0IGdpZ2FiaXQgd2l0aCBoYWxmIGR1cGxleC4KKwkJCSAqLworCQkJTUFDX1RYX0xFTkdUSFMsCQorCQkJKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCQkoNiA8PCBUWF9MRU5HVEhTX0lQR19TSElGVCkgfAorCQkJKDMyIDw8IFRYX0xFTkdUSFNfU0xPVF9USU1FX1NISUZUKSwKKwkJCQorCQkJLyogUmVjZWl2ZSBydWxlcy4gKi8KKwkJCU1BQ19SQ1ZfUlVMRV9DRkcsIFJDVl9SVUxFX0NGR19ERUZBVUxUX0NMQVNTLAorCQkJUkNWTFBDX0NPTkZJRywgMHgwMTgxLAorCQkJCisJCQkvKiBSZWNlaXZlL3NlbmQgc3RhdGlzdGljcy4gKi8KKwkJCVJDVkxQQ19TVEFUU19FTkFCTEUsIDB4ZmZmZmZmLAorCQkJUkNWTFBDX1NUQVRTQ1RSTCwgUkNWTFBDX1NUQVRTQ1RSTF9FTkFCTEUsCisJCQlTTkREQVRBSV9TVEFUU0VOQUIsIDB4ZmZmZmZmLAorCQkJU05EREFUQUlfU1RBVFNDVFJMLCAoU05EREFUQUlfU0NUUkxfRU5BQkxFIHxTTkREQVRBSV9TQ1RSTF9GQVNUVVBEKSwKKwkJCQorCQkJLyogSG9zdCBjb2FsZXNjaW5nIGVuZ2luZSAqLworCQkJSE9TVENDX1JYQ09MX1RJQ0tTLCAwLAorCQkJSE9TVENDX1RYQ09MX1RJQ0tTLCBMT1dfVFhDT0xfVElDS1MsCisJCQlIT1NUQ0NfUlhNQVhfRlJBTUVTLCAxLAorCQkJSE9TVENDX1RYTUFYX0ZSQU1FUywgTE9XX1JYTUFYX0ZSQU1FUywKKwkJCUhPU1RDQ19SWENPQUxfTUFYRl9JTlQsIDEsCisJCQlIT1NUQ0NfVFhDT0FMX01BWEZfSU5ULCAwLAorCQkJCisJCQkvKiBTdGF0dXMvc3RhdGlzdGljcyBibG9jayBhZGRyZXNzLiAqLworCQkJLyogRXRoZXJib290IGxpdmVzIGJlbG93IDRHQiwgc28gSElHSCA9PSAwICovCisJCQlIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gsIDAsCisKKwkJCS8qIE5vIG5lZWQgdG8gZW5hYmxlIDMyYnl0ZSBjb2FsZXNjZSBtb2RlLiAqLworCQkJSE9TVENDX01PREUsIEhPU1RDQ19NT0RFX0VOQUJMRSB8IDAsCisJCQkKKwkJCVJDVkNDX01PREUsIFJDVkNDX01PREVfRU5BQkxFIHwgUkNWQ0NfTU9ERV9BVFROX0VOQUJMRSwKKwkJCVJDVkxQQ19NT0RFLCBSQ1ZMUENfTU9ERV9FTkFCTEUsCisJCQkKKwkJCVJDVkRDQ19NT0RFLCBSQ1ZEQ0NfTU9ERV9FTkFCTEUgfCBSQ1ZEQ0NfTU9ERV9BVFROX0VOQUJMRSwKKworCQkJU05EREFUQUNfTU9ERSwgU05EREFUQUNfTU9ERV9FTkFCTEUsCisJCQlTTkRCRENfTU9ERSwgU05EQkRDX01PREVfRU5BQkxFIHwgU05EQkRDX01PREVfQVRUTl9FTkFCTEUsCisJCQlSQ1ZCRElfTU9ERSwgUkNWQkRJX01PREVfRU5BQkxFIHwgUkNWQkRJX01PREVfUkNCX0FUVE5fRU5BQiwKKwkJCVJDVkRCRElfTU9ERSwgUkNWREJESV9NT0RFX0VOQUJMRSB8IFJDVkRCRElfTU9ERV9JTlZfUklOR19TWiwKKwkJCVNORERBVEFJX01PREUsIFNORERBVEFJX01PREVfRU5BQkxFLAorCQkJU05EQkRJX01PREUsIFNOREJESV9NT0RFX0VOQUJMRSB8IFNOREJESV9NT0RFX0FUVE5fRU5BQkxFLAorCQkJU05EQkRTX01PREUsIFNOREJEU19NT0RFX0VOQUJMRSB8IFNOREJEU19NT0RFX0FUVE5fRU5BQkxFLAorCQkJCisJCQkvKiBBY2NlcHQgYWxsIG11bHRpY2FzdCBmcmFtZXMuICovCisJCQlNQUNfSEFTSF9SRUdfMCwgMHhmZmZmZmZmZiwKKwkJCU1BQ19IQVNIX1JFR18xLCAweGZmZmZmZmZmLAorCQkJTUFDX0hBU0hfUkVHXzIsIDB4ZmZmZmZmZmYsCisJCQlNQUNfSEFTSF9SRUdfMywgMHhmZmZmZmZmZiwKKwkJfTsKKwkJc3RhdGljIGNvbnN0IHVpbnQzMl90IHRhYmxlX25vdF81NzA1W10gPSB7CisJCQkvKiBIb3N0IGNvYWxlc2NpbmcgZW5naW5lICovCisJCQlIT1NUQ0NfUlhDT0FMX1RJQ0tfSU5ULCAwLAorCQkJSE9TVENDX1RYQ09BTF9USUNLX0lOVCwgMCwKKworCQkJLyogU3RhdHVzL3N0YXRpc3RpY3MgYmxvY2sgYWRkcmVzcy4gKi8KKwkJCS8qIEV0aGVyYm9vdCBsaXZlcyBiZWxvdyA0R0IsIHNvIEhJR0ggPT0gMCAqLworCQkJSE9TVENDX1NUQVRfQ09BTF9USUNLUywgREVGQVVMVF9TVEFUX0NPQUxfVElDS1MsCisJCQlIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCwgMCwKKwkJCUhPU1RDQ19TVEFUU19CTEtfTklDX0FERFIsIE5JQ19TUkFNX1NUQVRTX0JMSywKKwkJCUhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSLCBOSUNfU1JBTV9TVEFUVVNfQkxLLAorCisJCQlSQ1ZMU0NfTU9ERSwgUkNWTFNDX01PREVfRU5BQkxFIHwgUkNWTFNDX01PREVfQVRUTl9FTkFCTEUsCisKKwkJCU1CRlJFRV9NT0RFLCBNQkZSRUVfTU9ERV9FTkFCTEUsCisJCX07CisJCVRHM19XUklURV9TRVRUSU5HUyh0YWJsZV9hbGwpOworCQl0dzMyKEhPU1RDQ19TVEFUU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19MT1csCisJCQl2aXJ0X3RvX2J1cyh0cC0+aHdfc3RhdHMpKTsKKwkJdHczMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVywKKwkJCXZpcnRfdG9fYnVzKHRwLT5od19zdGF0dXMpKTsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1ICYmCisJCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc4NykgeworCQkJVEczX1dSSVRFX1NFVFRJTkdTKHRhYmxlX25vdF81NzA1KTsKKwkJfQorCX0KKworCXRwLT50eF9tb2RlID0gVFhfTU9ERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX1RYX01PREUsIHRwLT50eF9tb2RlKTsKKworCXRwLT5yeF9tb2RlID0gUlhfTU9ERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX1JYX01PREUsIHRwLT5yeF9tb2RlKTsKKworCXRwLT5taV9tb2RlID0gTUFDX01JX01PREVfQkFTRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCisJdHczMihNQUNfTEVEX0NUUkwsIDApOworCXR3MzIoTUFDX01JX1NUQVQsIE1BQ19NSV9TVEFUX0xOS1NUQVRfQVRUTl9FTkFCKTsKKwlpZiAodHAtPnBoeV9pZCA9PSBQSFlfSURfU0VSREVTKSB7CisJCXR3MzJfY2FyZWZ1bGx5KE1BQ19SWF9NT0RFLCBSWF9NT0RFX1JFU0VUKTsKKwl9CisJdHAtPnJ4X21vZGUgfD0gUlhfTU9ERV9LRUVQX1ZMQU5fVEFHOyAvKiBkcm9wIHRhZ2dlZCB2bGFuIHBhY2tldHMgKi8KKwl0dzMyX2NhcmVmdWxseShNQUNfUlhfTU9ERSwgdHAtPnJ4X21vZGUpOworCisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAzX0ExKQorCQl0dzMyKE1BQ19TRVJERVNfQ0ZHLCAweDYxNjAwMCk7CisKKwkvKiBQcmV2ZW50IGNoaXAgZnJvbSBkcm9wcGluZyBmcmFtZXMgd2hlbiBmbG93IGNvbnRyb2wKKwkgKiBpcyBlbmFibGVkLgorCSAqLworCXR3MzIoTUFDX0xPV19XTUFSS19NQVhfUlhfRlJBTUUsIDIpOworCXRyMzIoTUFDX0xPV19XTUFSS19NQVhfUlhfRlJBTUUpOworCisJZXJyID0gdGczX3NldHVwX3BoeSh0cCk7CisKKwkvKiBJZ25vcmUgQ1JDIHN0YXRzICovCisKKwkvKiBJbml0aWFsaXplIHJlY2VpdmUgcnVsZXMuICovCisJdHczMihNQUNfUkNWX1JVTEVfMCwgIDB4YzIwMDAwMDAgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCXR3MzIoTUFDX1JDVl9WQUxVRV8wLCAweGZmZmZmZmZmICYgUkNWX1JVTEVfRElTQUJMRV9NQVNLKTsKKwl0dzMyKE1BQ19SQ1ZfUlVMRV8xLCAgMHg4NjAwMDAwNCAmIFJDVl9SVUxFX0RJU0FCTEVfTUFTSyk7CisJdHczMihNQUNfUkNWX1ZBTFVFXzEsIDB4ZmZmZmZmZmYgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkKKwkgICAgfHwgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSkKKwkJbGltaXQgPSA4OworCWVsc2UKKwkJbGltaXQgPSAxNjsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpCisJCWxpbWl0IC09IDQ7CisJc3dpdGNoIChsaW1pdCkgeworCWNhc2UgMTY6CXR3MzIoTUFDX1JDVl9SVUxFXzE1LCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8xNSwgIDApOworCWNhc2UgMTU6CXR3MzIoTUFDX1JDVl9SVUxFXzE0LCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8xNCwgIDApOworCWNhc2UgMTQ6CXR3MzIoTUFDX1JDVl9SVUxFXzEzLCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8xMywgIDApOworCWNhc2UgMTM6CXR3MzIoTUFDX1JDVl9SVUxFXzEyLCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8xMiwgIDApOworCWNhc2UgMTI6CXR3MzIoTUFDX1JDVl9SVUxFXzExLCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8xMSwgIDApOworCWNhc2UgMTE6CXR3MzIoTUFDX1JDVl9SVUxFXzEwLCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8xMCwgIDApOworCWNhc2UgMTA6CXR3MzIoTUFDX1JDVl9SVUxFXzksICAwKTsgIHR3MzIoTUFDX1JDVl9WQUxVRV85LCAgMCk7CisJY2FzZSA5OgkJdHczMihNQUNfUkNWX1JVTEVfOCwgIDApOyAgdHczMihNQUNfUkNWX1ZBTFVFXzgsICAwKTsKKwljYXNlIDg6CQl0dzMyKE1BQ19SQ1ZfUlVMRV83LCAgMCk7ICB0dzMyKE1BQ19SQ1ZfVkFMVUVfNywgIDApOworCWNhc2UgNzoJCXR3MzIoTUFDX1JDVl9SVUxFXzYsICAwKTsgIHR3MzIoTUFDX1JDVl9WQUxVRV82LCAgMCk7CisJY2FzZSA2OgkJdHczMihNQUNfUkNWX1JVTEVfNSwgIDApOyAgdHczMihNQUNfUkNWX1ZBTFVFXzUsICAwKTsKKwljYXNlIDU6CQl0dzMyKE1BQ19SQ1ZfUlVMRV80LCAgMCk7ICB0dzMyKE1BQ19SQ1ZfVkFMVUVfNCwgIDApOworCWNhc2UgNDoJCS8qIHR3MzIoTUFDX1JDVl9SVUxFXzMsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzMsICAwKTsgKi8KKwljYXNlIDM6CQkvKiB0dzMyKE1BQ19SQ1ZfUlVMRV8yLCAgMCk7IHR3MzIoTUFDX1JDVl9WQUxVRV8yLCAgMCk7ICovCisJY2FzZSAyOgorCWNhc2UgMToKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9OworCisJcmV0dXJuIGVycjsKK30KKworCisKKy8qIENoaXBzIG90aGVyIHRoYW4gNTcwMC81NzAxIHVzZSB0aGUgTlZSQU0gZm9yIGZldGNoaW5nIGluZm8uICovCitzdGF0aWMgdm9pZCB0ZzNfbnZyYW1faW5pdChzdHJ1Y3QgdGczICp0cCkKK3sKKwl0dzMyKEdSQ19FRVBST01fQUREUiwKKwkgICAgIChFRVBST01fQUREUl9GU01fUkVTRVQgfAorCSAgICAgIChFRVBST01fREVGQVVMVF9DTE9DS19QRVJJT0QgPDwKKwkgICAgICAgRUVQUk9NX0FERFJfQ0xLUEVSRF9TSElGVCkpKTsKKworCW1kZWxheSgxKTsKKworCS8qIEVuYWJsZSBzZWVwcm9tIGFjY2Vzc2VzLiAqLworCXR3MzJfY2FyZWZ1bGx5KEdSQ19MT0NBTF9DVFJMLAorCQl0cjMyKEdSQ19MT0NBTF9DVFJMKSB8IEdSQ19MQ0xDVFJMX0FVVE9fU0VFUFJPTSk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDAgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEpIHsKKwkJdWludDMyX3QgbnZjZmcxID0gdHIzMihOVlJBTV9DRkcxKTsKKworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX05WUkFNOworCQlpZiAobnZjZmcxICYgTlZSQU1fQ0ZHMV9GTEFTSElGX0VOQUIpIHsKKwkJCWlmIChudmNmZzEgJiBOVlJBTV9DRkcxX0JVRkZFUkVEX01PREUpCisJCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19OVlJBTV9CVUZGRVJFRDsKKwkJfSBlbHNlIHsKKwkJCW52Y2ZnMSAmPSB+TlZSQU1fQ0ZHMV9DT01QQVRfQllQQVNTOworCQkJdHczMihOVlJBTV9DRkcxLCBudmNmZzEpOworCQl9CisKKwl9IGVsc2UgeworCQl0cC0+dGczX2ZsYWdzICY9IH4oVEczX0ZMQUdfTlZSQU0gfCBURzNfRkxBR19OVlJBTV9CVUZGRVJFRCk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgdGczX252cmFtX3JlYWRfdXNpbmdfZWVwcm9tKAorCXN0cnVjdCB0ZzMgKnRwIF9fdW51c2VkLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90ICp2YWwpCit7CisJdWludDMyX3QgdG1wOworCWludCBpOworCisJaWYgKG9mZnNldCA+IEVFUFJPTV9BRERSX0FERFJfTUFTSyB8fAorCQkob2Zmc2V0ICUgNCkgIT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0bXAgPSB0cjMyKEdSQ19FRVBST01fQUREUikgJiB+KEVFUFJPTV9BRERSX0FERFJfTUFTSyB8CisJCQkJCUVFUFJPTV9BRERSX0RFVklEX01BU0sgfAorCQkJCQlFRVBST01fQUREUl9SRUFEKTsKKwl0dzMyKEdSQ19FRVBST01fQUREUiwKKwkgICAgIHRtcCB8CisJICAgICAoMCA8PCBFRVBST01fQUREUl9ERVZJRF9TSElGVCkgfAorCSAgICAgKChvZmZzZXQgPDwgRUVQUk9NX0FERFJfQUREUl9TSElGVCkgJgorCSAgICAgIEVFUFJPTV9BRERSX0FERFJfTUFTSykgfAorCSAgICAgRUVQUk9NX0FERFJfUkVBRCB8IEVFUFJPTV9BRERSX1NUQVJUKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCXRtcCA9IHRyMzIoR1JDX0VFUFJPTV9BRERSKTsKKworCQlpZiAodG1wICYgRUVQUk9NX0FERFJfQ09NUExFVEUpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorCWlmICghKHRtcCAmIEVFUFJPTV9BRERSX0NPTVBMRVRFKSkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCSp2YWwgPSB0cjMyKEdSQ19FRVBST01fREFUQSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX252cmFtX3JlYWQoc3RydWN0IHRnMyAqdHAsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgKnZhbCkKK3sKKwlpbnQgaSwgc2F3X2RvbmVfY2xlYXI7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pKQorCQlyZXR1cm4gdGczX252cmFtX3JlYWRfdXNpbmdfZWVwcm9tKHRwLCBvZmZzZXQsIHZhbCk7CisKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX05WUkFNX0JVRkZFUkVEKQorCQlvZmZzZXQgPSAoKG9mZnNldCAvIE5WUkFNX0JVRkZFUkVEX1BBR0VfU0laRSkgPDwKKwkJCSAgTlZSQU1fQlVGRkVSRURfUEFHRV9QT1MpICsKKwkJCShvZmZzZXQgJSBOVlJBTV9CVUZGRVJFRF9QQUdFX1NJWkUpOworCisJaWYgKG9mZnNldCA+IE5WUkFNX0FERFJfTVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXR3MzIoTlZSQU1fU1dBUkIsIFNXQVJCX1JFUV9TRVQxKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisJCWlmICh0cjMyKE5WUkFNX1NXQVJCKSAmIFNXQVJCX0dOVDEpCisJCQlicmVhazsKKwkJdWRlbGF5KDIwKTsKKwl9CisKKwl0dzMyKE5WUkFNX0FERFIsIG9mZnNldCk7CisJdHczMihOVlJBTV9DTUQsCisJICAgICBOVlJBTV9DTURfUkQgfCBOVlJBTV9DTURfR08gfAorCSAgICAgTlZSQU1fQ01EX0ZJUlNUIHwgTlZSQU1fQ01EX0xBU1QgfCBOVlJBTV9DTURfRE9ORSk7CisKKwkvKiBXYWl0IGZvciBkb25lIGJpdCB0byBjbGVhciB0aGVuIHNldCBhZ2Fpbi4gKi8KKwlzYXdfZG9uZV9jbGVhciA9IDA7CisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQl1ZGVsYXkoMTApOworCQlpZiAoIXNhd19kb25lX2NsZWFyICYmCisJCSAgICAhKHRyMzIoTlZSQU1fQ01EKSAmIE5WUkFNX0NNRF9ET05FKSkKKwkJCXNhd19kb25lX2NsZWFyID0gMTsKKwkJZWxzZSBpZiAoc2F3X2RvbmVfY2xlYXIgJiYKKwkJCSAodHIzMihOVlJBTV9DTUQpICYgTlZSQU1fQ01EX0RPTkUpKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IDEwMDApIHsKKwkJdHczMihOVlJBTV9TV0FSQiwgU1dBUkJfUkVRX0NMUjEpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCSp2YWwgPSBic3dhcF8zMih0cjMyKE5WUkFNX1JEREFUQSkpOworCXR3MzIoTlZSQU1fU1dBUkIsIDB4MjApOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzdWJzeXNfdGJsX2VudCB7CisJdWludDE2X3Qgc3Vic3lzX3ZlbmRvciwgc3Vic3lzX2RldmlkOworCXVpbnQzMl90IHBoeV9pZDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3Vic3lzX3RibF9lbnQgc3Vic3lzX2lkX3RvX3BoeV9pZFtdID0geworCS8qIEJyb2FkY29tIGJvYXJkcy4gKi8KKwl7IDB4MTRlNCwgMHgxNjQ0LCBQSFlfSURfQkNNNTQwMSB9LCAvKiBCQ005NTcwMEE2ICovCisJeyAweDE0ZTQsIDB4MDAwMSwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFBNSAqLworCXsgMHgxNGU0LCAweDAwMDIsIFBIWV9JRF9CQ004MDAyIH0sIC8qIEJDTTk1NzAwVDYgKi8KKwl7IDB4MTRlNCwgMHgwMDAzLCBQSFlfSURfU0VSREVTICB9LCAvKiBCQ005NTcwMEE5ICovCisJeyAweDE0ZTQsIDB4MDAwNSwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFUMSAqLworCXsgMHgxNGU0LCAweDAwMDYsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxVDggKi8KKwl7IDB4MTRlNCwgMHgwMDA3LCBQSFlfSURfU0VSREVTICB9LCAvKiBCQ005NTcwMUE3ICovCisJeyAweDE0ZTQsIDB4MDAwOCwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFBMTAgKi8KKwl7IDB4MTRlNCwgMHg4MDA4LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwMUExMiAqLworCXsgMHgxNGU0LCAweDAwMDksIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAzQXgxICovCisJeyAweDE0ZTQsIDB4ODAwOSwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDNBeDIgKi8KKworCS8qIDNjb20gYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDAsIFBIWV9JRF9CQ001NDAxIH0sIC8qIDNDOTk2VCAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDYsIFBIWV9JRF9CQ001NzAxIH0sIC8qIDNDOTk2QlQgKi8KKwkvKiB7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDAyLCBQSFlfSURfWFhYIH0sICAgICAzQzk5NkNUICovCisJLyogeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwMywgUEhZX0lEX1hYWCB9LCAgICAgM0M5OTdUICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwNCwgUEhZX0lEX1NFUkRFUyAgfSwgLyogM0M5OTZTWCAqLworCS8qIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDUsIFBIWV9JRF9YWFggfSwgICAgIDNDOTk3U1ogKi8KKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDA3LCBQSFlfSURfQkNNNTcwMSB9LCAvKiAzQzEwMDBUICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwOCwgUEhZX0lEX0JDTTU3MDEgfSwgLyogM0M5NDBCUjAxICovCisKKwkvKiBERUxMIGJvYXJkcy4gKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMGQxLCBQSFlfSURfQkNNNTQwMSB9LCAvKiBWSVBFUiAqLworCXsgUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAxMDYsIFBIWV9JRF9CQ001NDAxIH0sIC8qIEpBR1VBUiAqLworCXsgUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAxMDksIFBIWV9JRF9CQ001NDExIH0sIC8qIE1FUkxPVCAqLworCXsgUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAxMGEsIFBIWV9JRF9CQ001NDExIH0sIC8qIFNMSU1fTUVSTE9UICovCisJeyBQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDE3OSwgUEhZX0lEX0JDTTU3NTEgfSwgLyogRXRoZXJYcHJlc3MgKi8KKwkKKwkvKiBGdWppdHN1IFNpZW1lbnMgQ29tcHV0ZXIgKi8KKwl7IFBDSV9WRU5ET1JfSURfRlNDLCAweDEwNWQsIFBIWV9JRF9CQ001NzUxIH0sIC8qIEZ1dHJvIEMyMDAgKi8JCisKKwkvKiBDb21wYXEgYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA3YywgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkFOU0hFRSAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA5YSwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkFOU0hFRV8yICovCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgMHgwMDdkLCBQSFlfSURfU0VSREVTICB9LCAvKiBDSEFOR0VMSU5HICovCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgMHgwMDg1LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBOQzc3ODAgKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwOTksIFBIWV9JRF9CQ001NzAxIH0gIC8qIE5DNzc4MF8yICovCit9OworCitzdGF0aWMgaW50IHRnM19waHlfcHJvYmUoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgZWVwcm9tX3BoeV9pZCwgaHdfcGh5X2lkXzEsIGh3X3BoeV9pZF8yOworCXVpbnQzMl90IGh3X3BoeV9pZCwgaHdfcGh5X2lkX21hc2tlZDsKKwllbnVtIHBoeV9sZWRfbW9kZSBlZXByb21fbGVkX21vZGU7CisJdWludDMyX3QgdmFsOworCXVuc2lnbmVkIGk7CisJaW50IGVlcHJvbV9zaWduYXR1cmVfZm91bmQsIGVycjsKKworCXRwLT5waHlfaWQgPSBQSFlfSURfSU5WQUxJRDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3Vic3lzX2lkX3RvX3BoeV9pZCkvc2l6ZW9mKHN1YnN5c19pZF90b19waHlfaWRbMF0pOyBpKyspIHsKKwkJaWYgKChzdWJzeXNfaWRfdG9fcGh5X2lkW2ldLnN1YnN5c192ZW5kb3IgPT0gdHAtPnN1YnN5c3RlbV92ZW5kb3IpICYmCisJCQkoc3Vic3lzX2lkX3RvX3BoeV9pZFtpXS5zdWJzeXNfZGV2aWQgPT0gdHAtPnN1YnN5c3RlbV9kZXZpY2UpKSB7CisJCQl0cC0+cGh5X2lkID0gc3Vic3lzX2lkX3RvX3BoeV9pZFtpXS5waHlfaWQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWVlcHJvbV9waHlfaWQgPSBQSFlfSURfSU5WQUxJRDsKKwllZXByb21fbGVkX21vZGUgPSBsZWRfbW9kZV9hdXRvOworCWVlcHJvbV9zaWduYXR1cmVfZm91bmQgPSAwOworCXRnM19yZWFkX21lbShOSUNfU1JBTV9EQVRBX1NJRywgJnZhbCk7CisJaWYgKHZhbCA9PSBOSUNfU1JBTV9EQVRBX1NJR19NQUdJQykgeworCQl1aW50MzJfdCBuaWNfY2ZnOworCisJCXRnM19yZWFkX21lbShOSUNfU1JBTV9EQVRBX0NGRywgJm5pY19jZmcpOworCQl0cC0+bmljX3NyYW1fZGF0YV9jZmcgPSBuaWNfY2ZnOworCisJCWVlcHJvbV9zaWduYXR1cmVfZm91bmQgPSAxOworCisJCWlmICgobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX01BU0spID09CisJCSAgICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9GSUJFUikgeworCQkJZWVwcm9tX3BoeV9pZCA9IFBIWV9JRF9TRVJERVM7CisJCX0gZWxzZSB7CisJCQl1aW50MzJfdCBuaWNfcGh5X2lkOworCisJCQl0ZzNfcmVhZF9tZW0oTklDX1NSQU1fREFUQV9QSFlfSUQsICZuaWNfcGh5X2lkKTsKKwkJCWlmIChuaWNfcGh5X2lkICE9IDApIHsKKwkJCQl1aW50MzJfdCBpZDEgPSBuaWNfcGh5X2lkICYgTklDX1NSQU1fREFUQV9QSFlfSUQxX01BU0s7CisJCQkJdWludDMyX3QgaWQyID0gbmljX3BoeV9pZCAmIE5JQ19TUkFNX0RBVEFfUEhZX0lEMl9NQVNLOworCisJCQkJZWVwcm9tX3BoeV9pZCAgPSAoaWQxID4+IDE2KSA8PCAxMDsKKwkJCQllZXByb21fcGh5X2lkIHw9IChpZDIgJiAweGZjMDApIDw8IDE2OworCQkJCWVlcHJvbV9waHlfaWQgfD0gKGlkMiAmIDB4MDNmZikgPDwgIDA7CisJCQl9CisJCX0KKworCQlzd2l0Y2ggKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9NQVNLKSB7CisJCWNhc2UgTklDX1NSQU1fREFUQV9DRkdfTEVEX1RSSVBMRV9TUEQ6CisJCQllZXByb21fbGVkX21vZGUgPSBsZWRfbW9kZV90aHJlZV9saW5rOworCQkJYnJlYWs7CisKKwkJY2FzZSBOSUNfU1JBTV9EQVRBX0NGR19MRURfTElOS19TUEQ6CisJCQllZXByb21fbGVkX21vZGUgPSBsZWRfbW9kZV9saW5rMTA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZWVwcm9tX2xlZF9tb2RlID0gbGVkX21vZGVfYXV0bzsKKwkJCWJyZWFrOworCQl9OworCQlpZiAoKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMykgfHwKKwkJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgfHwKKwkJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkpICYmCisJCQkobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0VFUFJPTV9XUCkpIHsKKwkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1Q7CisJCX0KKworCQlpZiAobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0FTRl9FTkFCTEUpCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0VOQUJMRV9BU0Y7CisJCWlmIChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfRklCRVJfV09MKQorCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19TRVJERVNfV09MX0NBUDsKKwl9CisKKwkvKiBOb3cgcmVhZCB0aGUgcGh5c2ljYWwgUEhZX0lEIGZyb20gdGhlIGNoaXAgYW5kIHZlcmlmeQorCSAqIHRoYXQgaXQgaXMgc2FuZS4gIElmIGl0IGRvZXNuJ3QgbG9vayBnb29kLCB3ZSBmYWxsIGJhY2sKKwkgKiB0byBlaXRoZXIgdGhlIGhhcmQtY29kZWQgdGFibGUgYmFzZWQgUEhZX0lEIGFuZCBmYWlsaW5nCisJICogdGhhdCB0aGUgdmFsdWUgZm91bmQgaW4gdGhlIGVlcHJvbSBhcmVhLgorCSAqLworCWVyciAgPSB0ZzNfcmVhZHBoeSh0cCwgTUlJX1BIWVNJRDEsICZod19waHlfaWRfMSk7CisJZXJyIHw9IHRnM19yZWFkcGh5KHRwLCBNSUlfUEhZU0lEMiwgJmh3X3BoeV9pZF8yKTsKKworCWh3X3BoeV9pZCAgPSAoaHdfcGh5X2lkXzEgJiAweGZmZmYpIDw8IDEwOworCWh3X3BoeV9pZCB8PSAoaHdfcGh5X2lkXzIgJiAweGZjMDApIDw8IDE2OworCWh3X3BoeV9pZCB8PSAoaHdfcGh5X2lkXzIgJiAweDAzZmYpIDw8ICAwOworCisJaHdfcGh5X2lkX21hc2tlZCA9IGh3X3BoeV9pZCAmIFBIWV9JRF9NQVNLOworCisJaWYgKCFlcnIgJiYgS05PV05fUEhZX0lEKGh3X3BoeV9pZF9tYXNrZWQpKSB7CisJCXRwLT5waHlfaWQgPSBod19waHlfaWQ7CisJfSBlbHNlIHsKKwkJLyogcGh5X2lkIGN1cnJlbnRseSBob2xkcyB0aGUgdmFsdWUgZm91bmQgaW4gdGhlCisJCSAqIHN1YnN5c19pZF90b19waHlfaWRbXSB0YWJsZSBvciBQSFlfSURfSU5WQUxJRAorCQkgKiBpZiBhIG1hdGNoIHdhcyBub3QgZm91bmQgdGhlcmUuCisJCSAqLworCQlpZiAodHAtPnBoeV9pZCA9PSBQSFlfSURfSU5WQUxJRCkgeworCQkJaWYgKCFlZXByb21fc2lnbmF0dXJlX2ZvdW5kIHx8CisJCQkgICAgIUtOT1dOX1BIWV9JRChlZXByb21fcGh5X2lkICYgUEhZX0lEX01BU0spKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJdHAtPnBoeV9pZCA9IGVlcHJvbV9waHlfaWQ7CisJCX0KKwl9CisKKwllcnIgPSB0ZzNfcGh5X3Jlc2V0KHRwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKSB7CisJCXVpbnQzMl90IG1paV90ZzNfY3RybDsKKwkJCisJCS8qIFRoZXNlIGNoaXBzLCB3aGVuIHJlc2V0LCBvbmx5IGFkdmVydGlzZSAxME1iCisJCSAqIGNhcGFiaWxpdGllcy4gIEZpeCB0aGF0LgorCQkgKi8KKwkJZXJyICA9IHRnM193cml0ZXBoeSh0cCwgTUlJX0FEVkVSVElTRSwKKwkJCQkgICAgKEFEVkVSVElTRV9DU01BIHwKKwkJCQkgICAgIEFEVkVSVElTRV9QQVVTRV9DQVAgfAorCQkJCSAgICAgQURWRVJUSVNFXzEwSEFMRiB8CisJCQkJICAgICBBRFZFUlRJU0VfMTBGVUxMIHwKKwkJCQkgICAgIEFEVkVSVElTRV8xMDBIQUxGIHwKKwkJCQkgICAgIEFEVkVSVElTRV8xMDBGVUxMKSk7CisJCW1paV90ZzNfY3RybCA9IChNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRiB8CisJCQkJTUlJX1RHM19DVFJMX0FEVl8xMDAwX0ZVTEwgfAorCQkJCU1JSV9URzNfQ1RSTF9BU19NQVNURVIgfAorCQkJCU1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKTsKKwkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkKKwkJCW1paV90ZzNfY3RybCA9IDA7CisKKwkJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBtaWlfdGczX2N0cmwpOworCQllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwKKwkJCQkgICAgKEJNQ1JfQU5SRVNUQVJUIHwgQk1DUl9BTkVOQUJMRSkpOworCX0KKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMykgeworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MGMwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgyMDFmKTsKKwkJdGczX3dyaXRlZHNwKHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDJhYWEpOworCX0KKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgeworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGQ2OCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4ZDY4KTsKKwl9CisKKwkvKiBFbmFibGUgRXRoZXJuZXRAV2lyZVNwZWVkICovCisJdGczX3BoeV9zZXRfd2lyZXNwZWVkKHRwKTsKKworCWlmICghZXJyICYmICgodHAtPnBoeV9pZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfSURfQkNNNTQwMSkpIHsKKwkJZXJyID0gdGczX2luaXRfNTQwMXBoeV9kc3AodHApOworCX0KKworCS8qIERldGVybWluZSB0aGUgUEhZIGxlZCBtb2RlLiAKKwkgKiBCZSBjYXJlZnVsIGlmIHRoaXMgZ2V0cyBzZXQgd3JvbmcgaXQgY2FuIHJlc3VsdCBpbiBhbiBpbmFiaWxpdHkgdG8gCisJICogZXN0YWJsaXNoIGEgbGluay4KKwkgKi8KKwlpZiAodHAtPnBoeV9pZCA9PSBQSFlfSURfU0VSREVTKSB7CisJCXRwLT5sZWRfbW9kZSA9IGxlZF9tb2RlX3RocmVlX2xpbms7CisJfQorCWVsc2UgaWYgKHRwLT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfREVMTCkgeworCQl0cC0+bGVkX21vZGUgPSBsZWRfbW9kZV9saW5rMTA7CisJfSBlbHNlIHsKKwkJdHAtPmxlZF9tb2RlID0gbGVkX21vZGVfdGhyZWVfbGluazsKKwkJaWYgKGVlcHJvbV9zaWduYXR1cmVfZm91bmQgJiYKKwkJICAgIGVlcHJvbV9sZWRfbW9kZSAhPSBsZWRfbW9kZV9hdXRvKQorCQkJdHAtPmxlZF9tb2RlID0gZWVwcm9tX2xlZF9tb2RlOworCX0KKworCWlmICh0cC0+cGh5X2lkID09IFBIWV9JRF9TRVJERVMpCisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9CisJCQkoQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQkgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgQURWRVJUSVNFRF9BdXRvbmVnIHwKKwkJCSBBRFZFUlRJU0VEX0ZJQlJFKTsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKQorCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJj0KKwkJCX4oQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQkgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCisJcmV0dXJuIGVycjsKK30KKworI2lmIFNVUFBPUlRfUEFSVE5PX1NUUgorc3RhdGljIHZvaWQgdGczX3JlYWRfcGFydG5vKHN0cnVjdCB0ZzMgKnRwKQoreworCXVuc2lnbmVkIGNoYXIgdnBkX2RhdGFbMjU2XTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gNCkgeworCQl1aW50MzJfdCB0bXA7CisKKwkJaWYgKHRnM19udnJhbV9yZWFkKHRwLCAweDEwMCArIGksICZ0bXApKQorCQkJZ290byBvdXRfbm90X2ZvdW5kOworCisJCXZwZF9kYXRhW2kgKyAwXSA9ICgodG1wID4+ICAwKSAmIDB4ZmYpOworCQl2cGRfZGF0YVtpICsgMV0gPSAoKHRtcCA+PiAgOCkgJiAweGZmKTsKKwkJdnBkX2RhdGFbaSArIDJdID0gKCh0bXAgPj4gMTYpICYgMHhmZik7CisJCXZwZF9kYXRhW2kgKyAzXSA9ICgodG1wID4+IDI0KSAmIDB4ZmYpOworCX0KKworCS8qIE5vdyBwYXJzZSBhbmQgZmluZCB0aGUgcGFydCBudW1iZXIuICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgKSB7CisJCXVuc2lnbmVkIGNoYXIgdmFsID0gdnBkX2RhdGFbaV07CisJCWludCBibG9ja19lbmQ7CisKKwkJaWYgKHZhbCA9PSAweDgyIHx8IHZhbCA9PSAweDkxKSB7CisJCQlpID0gKGkgKyAzICsKKwkJCSAgICAgKHZwZF9kYXRhW2kgKyAxXSArCisJCQkgICAgICAodnBkX2RhdGFbaSArIDJdIDw8IDgpKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2YWwgIT0gMHg5MCkKKwkJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCQlibG9ja19lbmQgPSAoaSArIDMgKworCQkJICAgICAodnBkX2RhdGFbaSArIDFdICsKKwkJCSAgICAgICh2cGRfZGF0YVtpICsgMl0gPDwgOCkpKTsKKwkJaSArPSAzOworCQl3aGlsZSAoaSA8IGJsb2NrX2VuZCkgeworCQkJaWYgKHZwZF9kYXRhW2kgKyAwXSA9PSAnUCcgJiYKKwkJCSAgICB2cGRfZGF0YVtpICsgMV0gPT0gJ04nKSB7CisJCQkJaW50IHBhcnRub19sZW4gPSB2cGRfZGF0YVtpICsgMl07CisKKwkJCQlpZiAocGFydG5vX2xlbiA+IDI0KQorCQkJCQlnb3RvIG91dF9ub3RfZm91bmQ7CisKKwkJCQltZW1jcHkodHAtPmJvYXJkX3BhcnRfbnVtYmVyLAorCQkJCSAgICAgICAmdnBkX2RhdGFbaSArIDNdLAorCQkJCSAgICAgICBwYXJ0bm9fbGVuKTsKKworCQkJCS8qIFN1Y2Nlc3MuICovCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJLyogUGFydCBudW1iZXIgbm90IGZvdW5kLiAqLworCQlnb3RvIG91dF9ub3RfZm91bmQ7CisJfQorCitvdXRfbm90X2ZvdW5kOgorCW1lbWNweSh0cC0+Ym9hcmRfcGFydF9udW1iZXIsICJub25lIiwgc2l6ZW9mKCJub25lIikpOworfQorI2Vsc2UKKyNkZWZpbmUgdGczX3JlYWRfcGFydG5vKFRQKSAoKFRQKS0+Ym9hcmRfcGFydF9udW1iZXJbMF0gPSAnXDAnKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdGczX2dldF9pbnZhcmlhbnRzKHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IG1pc2NfY3RybF9yZWc7CisJdWludDMyX3QgcGNpX3N0YXRlX3JlZywgZ3JjX21pc2NfY2ZnOworCXVpbnQxNl90IHBjaV9jbWQ7CisJdWludDhfdCAgcGNpX2xhdGVuY3k7CisJdWludDMyX3QgdmFsIDsKKwlpbnQgZXJyOworCisJLyogUmVhZCB0aGUgc3Vic3lzdGVtIHZlbmRvciBhbmQgZGV2aWNlIGlkcyAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnRwLT5zdWJzeXN0ZW1fdmVuZG9yKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnRwLT5zdWJzeXN0ZW1fZGV2aWNlKTsKKworCS8qIFRoZSBzdW5fNTcwNCBjb2RlIG5lZWRzIGluZnJhc3RydWN0dXJlIGV0aGVyYm9vdCBkb2VzIGhhdmUKKwkgKiBpZ25vcmUgaXQgZm9yIG5vdy4KKwkgKi8KKworCS8qIElmIHdlIGhhdmUgYW4gQU1EIDc2MiBvciBJbnRlbCBJQ0gvSUNIMCBjaGlwc2V0LCB3cml0ZQorCSAqIHJlb3JkZXJpbmcgdG8gdGhlIG1haWxib3ggcmVnaXN0ZXJzIGRvbmUgYnkgdGhlIGhvc3QKKwkgKiBjb250cm9sbGVyIGNhbiBjYXVzZSBtYWpvciB0cm91Ymxlcy4gIFdlIHJlYWQgYmFjayBmcm9tCisJICogZXZlcnkgbWFpbGJveCByZWdpc3RlciB3cml0ZSB0byBmb3JjZSB0aGUgd3JpdGVzIHRvIGJlCisJICogcG9zdGVkIHRvIHRoZSBjaGlwIGluIG9yZGVyLgorCSAqCisJICogVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSIGhhcyBiZWVuIGZvcmNlZCBvbi4KKwkgKi8KKworCS8qIEZvcmNlIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlIG9mZi4gIElmIHdlIGxlYXZlIGl0IG9uLAorCSAqIHRoZW4gb24gNTcwMF9CWCBjaGlwcyB3ZSBoYXZlIHRvIGVuYWJsZSBhIHdvcmthcm91bmQuCisJICogVGhlIHdvcmthcm91bmQgaXMgdG8gc2V0IHRoZSBURzNQQ0lfRE1BX1JXX0NUUkwgYm91bmRyeQorCSAqIHRvIG1hdGNoIHRoZSBjYWNoZWxpbmUgc2l6ZS4gIFRoZSBCcm9hZGNvbSBkcml2ZXIgaGF2ZSB0aGlzCisJICogd29ya2Fyb3VuZCBidXQgdHVybnMgTVdJIG9mZiBhbGwgdGhlIHRpbWVzIHNvIG5ldmVyIHVzZXMKKwkgKiBpdC4gIFRoaXMgc2VlbXMgdG8gc3VnZ2VzdCB0aGF0IHRoZSB3b3JrYXJvdW5kIGlzIGluc3VmZmljaWVudC4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsICZwY2lfY21kKTsKKwlwY2lfY21kICY9IH5QQ0lfQ09NTUFORF9JTlZBTElEQVRFOworCS8qIEFsc28sIGZvcmNlIFNFUlIjL1BFUlIjIGluIFBDSSBjb21tYW5kLiAqLworCXBjaV9jbWQgfD0gUENJX0NPTU1BTkRfUEFSSVRZIHwgUENJX0NPTU1BTkRfU0VSUjsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsIFBDSV9DT01NQU5ELCBwY2lfY21kKTsKKworCS8qIEl0IGlzIGFic29sdXRlbHkgY3JpdGljYWwgdGhhdCBURzNQQ0lfTUlTQ19IT1NUX0NUUkwKKwkgKiBoYXMgdGhlIHJlZ2lzdGVyIGluZGlyZWN0IHdyaXRlIGVuYWJsZSBiaXQgc2V0IGJlZm9yZQorCSAqIHdlIHRyeSB0byBhY2Nlc3MgYW55IG9mIHRoZSBNTUlPIHJlZ2lzdGVycy4gIEl0IGlzIGFsc28KKwkgKiBjcml0aWNhbCB0aGF0IHRoZSBQQ0ktWCBodyB3b3JrYXJvdW5kIHNpdHVhdGlvbiBpcyBkZWNpZGVkCisJICogYmVmb3JlIHRoYXQgYXMgd2VsbC4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwgJm1pc2NfY3RybF9yZWcpOworCisJdHAtPnBjaV9jaGlwX3Jldl9pZCA9IChtaXNjX2N0cmxfcmVnID4+IE1JU0NfSE9TVF9DVFJMX0NISVBSRVZfU0hJRlQpOworCisJLyogSW5pdGlhbGl6ZSBtaXNjIGhvc3QgY29udHJvbCBpbiBQQ0kgYmxvY2suICovCisJdHAtPm1pc2NfaG9zdF9jdHJsIHw9IChtaXNjX2N0cmxfcmVnICYKKwkJCSAgICAgICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJCQkgICAgICAgdHAtPm1pc2NfaG9zdF9jdHJsKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHRwLT5wZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnBjaV9sYXRlbmN5KTsKKwlpZiAocGNpX2xhdGVuY3kgPCA2NCkgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUodHAtPnBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCA2NCk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUENJU1RBVEUsICZwY2lfc3RhdGVfcmVnKTsKKworCS8qIElmIHRoaXMgaXMgYSA1NzAwIEJYIGNoaXBzZXQsIGFuZCB3ZSBhcmUgaW4gUENJLVgKKwkgKiBtb2RlLCBlbmFibGUgcmVnaXN0ZXIgd3JpdGUgd29ya2Fyb3VuZC4KKwkgKgorCSAqIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHVzZSBpbmRpcmVjdCByZWdpc3RlciBhY2Nlc3NlcworCSAqIGZvciBhbGwgY2hpcCB3cml0ZXMgbm90IHRvIG1haWxib3ggcmVnaXN0ZXJzLgorCSAqCisJICogSW4gZXRoZXJib290IHRvIHNpbXBsaWZ5IHRoaW5ncyB3ZSBqdXN0IGFsd2F5cyB1c2UgdGhpcyB3b3JrIGFyb3VuZC4KKwkgKi8KKwlpZiAoKHBjaV9zdGF0ZV9yZWcgJiBQQ0lTVEFURV9DT05WX1BDSV9NT0RFKSA9PSAwKSB7CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUENJWF9NT0RFOworCX0KKwkvKiBCYWNrIHRvIGJhY2sgcmVnaXN0ZXIgd3JpdGVzIGNhbiBjYXVzZSBwcm9ibGVtcyBvbiB0aGUgNTcwMSwKKwkgKiB0aGUgd29ya2Fyb3VuZCBpcyB0byByZWFkIGJhY2sgYWxsIHJlZyB3cml0ZXMgZXhjZXB0IHRob3NlIHRvCisJICogbWFpbGJveCByZWdzLgorCSAqIEluIGV0aGVyYm9vdCB3ZSBhbHdheXMgdXNlIGluZGlyZWN0IHJlZ2lzdGVyIGFjY2Vzc2VzIHNvCisJICogd2UgZG9uJ3Qgc2VlIHRoaXMuCisJICovCisKKwlpZiAoKHBjaV9zdGF0ZV9yZWcgJiBQQ0lTVEFURV9CVVNfU1BFRURfSElHSCkgIT0gMCkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lfSElHSF9TUEVFRDsKKwlpZiAoKHBjaV9zdGF0ZV9yZWcgJiBQQ0lTVEFURV9CVVNfMzJCSVQpICE9IDApCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUENJXzMyQklUOworCisJLyogQ2hpcC1zcGVjaWZpYyBmaXh1cCBmcm9tIEJyb2FkY29tIGRyaXZlciAqLworCWlmICgodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDRfQTApICYmCisJICAgICghKHBjaV9zdGF0ZV9yZWcgJiBQQ0lTVEFURV9SRVRSWV9TQU1FX0RNQSkpKSB7CisJCXBjaV9zdGF0ZV9yZWcgfD0gUENJU1RBVEVfUkVUUllfU0FNRV9ETUE7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QQ0lTVEFURSwgcGNpX3N0YXRlX3JlZyk7CisJfQorCisJLyogZGV0ZXJtaW5lIGlmIGl0IGlzIFBDSUUgc3lzdGVtICovCisJLy8gQWxmIDogSSBoYXZlIG5vIGlkZWEgd2hhdCB0aGlzIGlzIGFib3V0Li4uCisJLy8gQnV0IGl0J3MgZGVmaW5pdGVseSB1c2VmdWxsCisJdmFsID0gcGNpX2ZpbmRfY2FwYWJpbGl0eSh0cC0+cGRldiwgUENJX0NBUF9JRF9FWFApOworCWlmICh2YWwpCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BDSV9FWFBSRVNTOworCisJLyogRm9yY2UgdGhlIGNoaXAgaW50byBEMC4gKi8KKwl0ZzNfc2V0X3Bvd2VyX3N0YXRlXzAodHApOworCisJLyogRXRoZXJib290IGRvZXMgbm90IGFzayB0aGUgdGczIHRvIGRvIGNoZWNrc3VtcyAqLworCS8qIEV0aGVyYm9vdCBkb2VzIG5vdCBhc2sgdGhlIHRnMyB0byBkbyBqdW1ibyBmcmFtZXMgKi8KKwkvKiBFaHRlcmJvb3QgZG9lcyBub3QgYXNrIHRoZSB0ZzMgdG8gdXNlIFdha2VPbkxhbi4gKi8KKworCS8qIEEgZmV3IGJvYXJkcyBkb24ndCB3YW50IEV0aGVybmV0QFdpcmVTcGVlZCBwaHkgZmVhdHVyZSAqLworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApIHx8CisJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgfHwKKwkJKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgJiYKKwkJCSh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcwNV9BMCkgJiYKKwkJCSh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcwNV9BMSkpKSB7CisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX05PX0VUSF9XSVJFX1NQRUVEOworCX0KKworCS8qIEF2b2lkIHRhZ2dlZCBpcnEgc3RhdHVzIGV0aGVyYm9vdCBkb2VzIG5vdCB1c2UgaXJxcyAqLworCisJLyogT25seSA1NzAxIGFuZCBsYXRlciBzdXBwb3J0IHRhZ2dlZCBpcnEgc3RhdHVzIG1vZGUuCisJICogQWxzbywgNTc4OCBjaGlwcyBjYW5ub3QgdXNlIHRhZ2dlZCBpcnEgc3RhdHVzLgorCSAqCisJICogSG93ZXZlciwgc2luY2UgZXRoZXJib290IGRvZXMgbm90IHVzZSBpcnFzIGF2b2lkIHRhZ2dlZCBpcnFzCisJICogc3RhdHVzICBiZWNhdXNlIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9uIGlzIG1vcmUgZGlmZmljdWx0IHRvCisJICogZnVsbHkgY2xlYXIgaW4gdGhhdCBtb2RlLgorCSAqLworCQorCS8qIFNpbmNlIHNvbWUgNTcwMF9BWCAmJiA1NzAwX0JYIGhhdmUgcHJvYmxlbXMgd2l0aCAzMkJZVEUKKwkgKiBjb2FsZXNjZV9tb2RlLCBhbmQgdGhlIHJlc3Qgd29yayBmaW5lIGFueXRoaW5nIHNldC4KKwkgKiBEb24ndCBlbmFibGUgSE9TVF9DQ19NT0RFXzMyQllURSBpbiBldGhlcmJvb3QuCisJICovCisKKwkvKiBJbml0aWFsaXplIE1BQyBNSSBtb2RlLCBwb2xsaW5nIGRpc2FibGVkLiAqLworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisKKwkvKiBJbml0aWFsaXplIGRhdGEvZGVzY3JpcHRvciBieXRlL3dvcmQgc3dhcHBpbmcuICovCisJdHczMihHUkNfTU9ERSwgdHAtPmdyY19tb2RlKTsKKworCXRnM19zd2l0Y2hfY2xvY2tzKHRwKTsKKworCS8qIENsZWFyIHRoaXMgb3V0IGZvciBzYW5pdHkuICovCisJdHczMihURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworCisJLyogRXRoZXJib290IGRvZXMgbm90IG5lZWQgdG8gY2hlY2sgaWYgdGhlIFBDSVhfVEFSR0VUX0hXQlVHCisJICogaXMgbmVlZGVkLiAgSXQgYWx3YXlzIHVzZXMgaXQuCisJICovCisJCisJdWRlbGF5KDUwKTsKKwl0ZzNfbnZyYW1faW5pdCh0cCk7CisKKwkvKiBUaGUgVFggZGVzY3JpcHRvcnMgd2lsbCByZXNpZGUgaW4gbWFpbiBtZW1vcnkuCisJICovCisKKwkvKiBTZWUgd2hpY2ggYm9hcmQgd2UgYXJlIHVzaW5nLgorCSAqLworCWdyY19taXNjX2NmZyA9IHRyMzIoR1JDX01JU0NfQ0ZHKTsKKwlncmNfbWlzY19jZmcgJj0gR1JDX01JU0NfQ0ZHX0JPQVJEX0lEX01BU0s7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgJiYKKwkgICAgZ3JjX21pc2NfY2ZnID09IEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzA0Q0lPQkUpIHsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19TUExJVF9NT0RFOworCQl0cC0+c3BsaXRfbW9kZV9tYXhfcmVxcyA9IFNQTElUX01PREVfNTcwNF9NQVhfUkVROworCX0KKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSAmJgorCSAgICAoZ3JjX21pc2NfY2ZnID09IEdSQ19NSVNDX0NGR19CT0FSRF9JRF81Nzg4IHx8CisJICAgICBncmNfbWlzY19jZmcgPT0gR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3ODhNKSkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfSVNfNTc4ODsKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxCTB4MTcwZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxXzIJMHgxNzBlCisKKwkvKiB0aGVzZSBhcmUgbGltaXRlZCB0byAxMC8xMDAgb25seSAqLworCWlmICgoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzKSAmJgorCQkgICAgKChncmNfbWlzY19jZmcgPT0gMHg4MDAwKSB8fCAoZ3JjX21pc2NfY2ZnID09IDB4NDAwMCkpKSB8fAorCQkoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSAmJgorCQkJKHRwLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSkgJiYKKwkJCSgodHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxKSB8fAorCQkJCSh0cC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU5MDFfMikpKSkgeworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHXzEwXzEwMF9PTkxZOworCX0KKworCWVyciA9IHRnM19waHlfcHJvYmUodHApOworCWlmIChlcnIpIHsKKwkJcHJpbnRmKCJwaHkgcHJvYmUgZmFpbGVkLCBlcnIgJWRcbiIsIGVycik7CisJfQorCisJdGczX3JlYWRfcGFydG5vKHRwKTsKKworCisJLyogNTcwMCBCWCBjaGlwcyBuZWVkIHRvIGhhdmUgdGhlaXIgVFggcHJvZHVjZXIgaW5kZXggbWFpbGJveGVzCisJICogd3JpdHRlbiB0d2ljZSB0byB3b3JrYXJvdW5kIGEgYnVnLgorCSAqIEluIGV0aGVyYm9vdCB3ZSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseSB0byBzaW1wbGlmeSB0aGluZ3MuCisJICovCisKKwkvKiA1NzAwIGNoaXBzIGNhbiBnZXQgY29uZnVzZWQgaWYgVFggYnVmZmVycyBzdHJhZGRsZSB0aGUKKwkgKiA0R0IgYWRkcmVzcyBib3VuZGFyeSBpbiBzb21lIGNhc2VzLgorCSAqIAorCSAqIEluIGV0aGVyYm9vdCB3ZSBjYW4gaWdub3JlIHRoZSBwcm9ibGVtIGFzIGV0aGVyYm9vdCBsaXZlcyBiZWxvdyA0R0IuCisJICovCisKKwkvKiBJbiBldGhlcmJvb3Qgd2FrZS1vbi1sYW4gaXMgdW5jb25kaXRpb25hbGx5IGRpc2FibGVkICovCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCAgdGczX2dldF9kZXZpY2VfYWRkcmVzcyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSB0cC0+bmljOworCXVpbnQzMl90IGhpLCBsbywgbWFjX29mZnNldDsKKworCWlmIChQQ0lfRlVOQyh0cC0+cGRldi0+ZGV2Zm4pID09IDApCisJCW1hY19vZmZzZXQgPSAweDdjOworCWVsc2UKKwkJbWFjX29mZnNldCA9IDB4Y2M7CisKKwkvKiBGaXJzdCB0cnkgdG8gZ2V0IGl0IGZyb20gTUFDIGFkZHJlc3MgbWFpbGJveC4gKi8KKwl0ZzNfcmVhZF9tZW0oTklDX1NSQU1fTUFDX0FERFJfSElHSF9NQk9YLCAmaGkpOworCWlmICgoaGkgPj4gMTYpID09IDB4NDg0YikgeworCQluaWMtPm5vZGVfYWRkclswXSA9IChoaSA+PiAgOCkgJiAweGZmOworCQluaWMtPm5vZGVfYWRkclsxXSA9IChoaSA+PiAgMCkgJiAweGZmOworCisJCXRnM19yZWFkX21lbShOSUNfU1JBTV9NQUNfQUREUl9MT1dfTUJPWCwgJmxvKTsKKwkJbmljLT5ub2RlX2FkZHJbMl0gPSAobG8gPj4gMjQpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbM10gPSAobG8gPj4gMTYpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbNF0gPSAobG8gPj4gIDgpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbNV0gPSAobG8gPj4gIDApICYgMHhmZjsKKwl9CisJLyogTmV4dCwgdHJ5IE5WUkFNLiAqLworCWVsc2UgaWYgKCF0ZzNfbnZyYW1fcmVhZCh0cCwgbWFjX29mZnNldCArIDAsICZoaSkgJiYKKwkJICF0ZzNfbnZyYW1fcmVhZCh0cCwgbWFjX29mZnNldCArIDQsICZsbykpIHsKKwkJbmljLT5ub2RlX2FkZHJbMF0gPSAoKGhpID4+IDE2KSAmIDB4ZmYpOworCQluaWMtPm5vZGVfYWRkclsxXSA9ICgoaGkgPj4gMjQpICYgMHhmZik7CisJCW5pYy0+bm9kZV9hZGRyWzJdID0gKChsbyA+PiAgMCkgJiAweGZmKTsKKwkJbmljLT5ub2RlX2FkZHJbM10gPSAoKGxvID4+ICA4KSAmIDB4ZmYpOworCQluaWMtPm5vZGVfYWRkcls0XSA9ICgobG8gPj4gMTYpICYgMHhmZik7CisJCW5pYy0+bm9kZV9hZGRyWzVdID0gKChsbyA+PiAyNCkgJiAweGZmKTsKKwl9CisJLyogRmluYWxseSBqdXN0IGZldGNoIGl0IG91dCBvZiB0aGUgTUFDIGNvbnRyb2wgcmVncy4gKi8KKwllbHNlIHsKKwkJaGkgPSB0cjMyKE1BQ19BRERSXzBfSElHSCk7CisJCWxvID0gdHIzMihNQUNfQUREUl8wX0xPVyk7CisKKwkJbmljLT5ub2RlX2FkZHJbNV0gPSBsbyAmIDB4ZmY7CisJCW5pYy0+bm9kZV9hZGRyWzRdID0gKGxvID4+IDgpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbM10gPSAobG8gPj4gMTYpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbMl0gPSAobG8gPj4gMjQpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbMV0gPSBoaSAmIDB4ZmY7CisJCW5pYy0+bm9kZV9hZGRyWzBdID0gKGhpID4+IDgpICYgMHhmZjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHRnM19zZXR1cF9kbWEoc3RydWN0IHRnMyAqdHApCit7CisJdHczMihURzNQQ0lfQ0xPQ0tfQ1RSTCwgMCk7CisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID09IDApIHsKKwkJdHAtPmRtYV9yd2N0cmwgPQorCQkJKDB4NyA8PCBETUFfUldDVFJMX1BDSV9XUklURV9DTURfU0hJRlQpIHwKKwkJCSgweDYgPDwgRE1BX1JXQ1RSTF9QQ0lfUkVBRF9DTURfU0hJRlQpIHwKKwkJCSgweDcgPDwgRE1BX1JXQ1RSTF9XUklURV9XQVRFUl9TSElGVCkgfAorCQkJKDB4NyA8PCBETUFfUldDVFJMX1JFQURfV0FURVJfU0hJRlQpIHwKKwkJCSgweDBmIDw8IERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVCk7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgeworCQkJdHAtPmRtYV9yd2N0cmwgJj0gfihETUFfUldDVFJMX01JTl9ETUEgPDwgRE1BX1JXQ1RSTF9NSU5fRE1BX1NISUZUKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkKKwkJCXRwLT5kbWFfcndjdHJsID0KKwkJCQkoMHg3IDw8IERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRF9TSElGVCkgfAorCQkJCSgweDYgPDwgRE1BX1JXQ1RSTF9QQ0lfUkVBRF9DTURfU0hJRlQpIHwKKwkJCQkoMHgzIDw8IERNQV9SV0NUUkxfV1JJVEVfV0FURVJfU0hJRlQpIHwKKwkJCQkoMHg3IDw8IERNQV9SV0NUUkxfUkVBRF9XQVRFUl9TSElGVCkgfAorCQkJCSgweDAwIDw8IERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVCk7CisJCWVsc2UKKwkJCXRwLT5kbWFfcndjdHJsID0KKwkJCQkoMHg3IDw8IERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRF9TSElGVCkgfAorCQkJCSgweDYgPDwgRE1BX1JXQ1RSTF9QQ0lfUkVBRF9DTURfU0hJRlQpIHwKKwkJCQkoMHgzIDw8IERNQV9SV0NUUkxfV1JJVEVfV0FURVJfU0hJRlQpIHwKKwkJCQkoMHgzIDw8IERNQV9SV0NUUkxfUkVBRF9XQVRFUl9TSElGVCkgfAorCQkJCSgweDBmIDw8IERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVCk7CisKKwkJLyogV2hlZWUsIHNvbWUgbW9yZSBjaGlwIGJ1Z3MuLi4gKi8KKwkJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMykgfHwKKwkJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkpIHsKKwkJCXVpbnQzMl90IGNjdmFsID0gdHIzMihURzNQQ0lfQ0xPQ0tfQ1RSTCkgJiAweDFmOworCisJCQlpZiAoKGNjdmFsID09IDB4NikgfHwgKGNjdmFsID09IDB4NykpIHsKKwkJCQl0cC0+ZG1hX3J3Y3RybCB8PSBETUFfUldDVFJMX09ORV9ETUE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzKSB8fAorCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpKSB7CisJCXRwLT5kbWFfcndjdHJsICY9IH4oRE1BX1JXQ1RSTF9NSU5fRE1BIDw8IERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVCk7CisJfQorCisJLyoKKwkgIEFsZiA6IFRyaWVkIHRoYXQsIGJ1dCBpdCBkb2VzIG5vdCB3b3JrLiBTaG91bGQgYmUgdGhpcyB3YXkgdGhvdWdoIDotKAorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSB7CisgICAgCSAgdHAtPmRtYV9yd2N0cmwgfD0gMHgwMDFmMDAwMDsKKwl9CisJKi8KKwl0cC0+ZG1hX3J3Y3RybCB8PSBETUFfUldDVFJMX0FTU0VSVF9BTExfQkU7CisKKwl0dzMyKFRHM1BDSV9ETUFfUldfQ1RSTCwgdHAtPmRtYV9yd2N0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19pbml0X2xpbmtfY29uZmlnKHN0cnVjdCB0ZzMgKnRwKQoreworCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9CisJCShBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCSBBRFZFUlRJU0VEX0F1dG9uZWcgfCBBRFZFUlRJU0VEX01JSSk7CisJdHAtPmNhcnJpZXJfb2sgPSAwOworCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7Cit9CisKKworI2lmIFNVUFBPUlRfUEhZX1NUUgorc3RhdGljIGNvbnN0IGNoYXIgKiB0ZzNfcGh5X3N0cmluZyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzd2l0Y2ggKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgeworCWNhc2UgUEhZX0lEX0JDTTU0MDA6CXJldHVybiAiNTQwMCI7CisJY2FzZSBQSFlfSURfQkNNNTQwMToJcmV0dXJuICI1NDAxIjsKKwljYXNlIFBIWV9JRF9CQ001NDExOglyZXR1cm4gIjU0MTEiOworCWNhc2UgUEhZX0lEX0JDTTU3MDE6CXJldHVybiAiNTcwMSI7CisJY2FzZSBQSFlfSURfQkNNNTcwMzoJcmV0dXJuICI1NzAzIjsKKwljYXNlIFBIWV9JRF9CQ001NzA0OglyZXR1cm4gIjU3MDQiOworICAgICAgICBjYXNlIFBIWV9JRF9CQ001NzA1OiAgICByZXR1cm4gIjU3MDUiOworICAgICAgICBjYXNlIFBIWV9JRF9CQ001NzUwOiAgICByZXR1cm4gIjU3NTAiOworCWNhc2UgUEhZX0lEX0JDTTU3NTE6CXJldHVybiAiNTc1MSI7IAorCWNhc2UgUEhZX0lEX0JDTTU3ODc6CXJldHVybiAiNTc4NyI7CisJY2FzZSBQSFlfSURfQkNNODAwMjoJcmV0dXJuICI4MDAyL3NlcmRlcyI7CisJY2FzZSBQSFlfSURfU0VSREVTOglyZXR1cm4gInNlcmRlcyI7CisJZGVmYXVsdDoJCXJldHVybiAidW5rbm93biI7CisJfTsKK30KKyNlbHNlCisjZGVmaW5lIHRnM19waHlfc3RyaW5nKFRQKSAiPyIKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIHRnM19wb2xsX2xpbmsoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgbWFjX3N0YXQ7CisKKwltYWNfc3RhdCA9IHRyMzIoTUFDX1NUQVRVUyk7CisJaWYgKHRwLT5waHlfaWQgPT0gUEhZX0lEX1NFUkRFUykgeworCQlpZiAodHAtPmNhcnJpZXJfb2s/CisJCQkobWFjX3N0YXQgJiBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQpOgorCQkJKG1hY19zdGF0ICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSAmIH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSyk7CisJCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCQkJdGczX3NldHVwX3BoeSh0cCk7CisJCX0KKwl9CisJZWxzZSB7CisJCWlmIChtYWNfc3RhdCAmIE1BQ19TVEFUVVNfTE5LU1RBVEVfQ0hBTkdFRCkgeworCQkJdGczX3NldHVwX3BoeSh0cCk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRnM19hY2tfaXJxcyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlpZiAodHAtPmh3X3N0YXR1cy0+c3RhdHVzICYgU0RfU1RBVFVTX1VQREFURUQpIHsKKwkJLyoKKwkJICogd3JpdGluZyBhbnkgdmFsdWUgdG8gaW50ci1tYm94LTAgY2xlYXJzIFBDSSBJTlRBIyBhbmQKKwkJICogY2hpcC1pbnRlcm5hbCBpbnRlcnJ1cHQgcGVuZGluZyBldmVudHMuCisJCSAqIHdyaXRpbmcgbm9uLXplcm8gdG8gaW50ci1tYm94LTAgYWRkaXRpb25hbCB0ZWxscyB0aGUKKwkJICogTklDIHRvIHN0b3Agc2VuZGluZyB1cyBpcnFzLCBlbmdhZ2luZyAiaW4taW50ci1oYW5kbGVyIgorCQkgKiBldmVudCBjb2FsZXNjaW5nLgorCQkgKi8KKwkJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgCisJCQkweDAwMDAwMDAxKTsKKwkJLyoKKwkJICogRmx1c2ggUENJIHdyaXRlLiAgVGhpcyBhbHNvIGd1YXJhbnRlZXMgdGhhdCBvdXIKKwkJICogc3RhdHVzIGJsb2NrIGhhcyBiZWVuIGZsdXNoZWQgdG8gaG9zdCBtZW1vcnkuCisJCSAqLworCQl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7CisJCXRwLT5od19zdGF0dXMtPnN0YXR1cyAmPSB+U0RfU1RBVFVTX1VQREFURUQ7CisJfQorfQorCitzdGF0aWMgaW50IHRnM19wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworCS8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KKwkvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLworCS8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCisKKwlzdHJ1Y3QgdGczICp0cCA9ICZ0ZzM7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IDA7CisKKwlpZiAoICh0cC0+aHdfc3RhdHVzLT5pZHhbMF0ucnhfcHJvZHVjZXIgIT0gdHAtPnJ4X3JjYl9wdHIpICYmICFyZXRyaWV2ZSApIAorCSAgcmV0dXJuIDE7CisKKwl0ZzNfYWNrX2lycXModHApOworCisJaWYgKHRwLT5od19zdGF0dXMtPmlkeFswXS5yeF9wcm9kdWNlciAhPSB0cC0+cnhfcmNiX3B0cikgeworCQlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjICpkZXNjOworCQl1bnNpZ25lZCBpbnQgbGVuOworCQlkZXNjID0gJnRwLT5yeF9yY2JbdHAtPnJ4X3JjYl9wdHJdOworCQlpZiAoKGRlc2MtPm9wYXF1ZSAmIFJYRF9PUEFRVUVfUklOR19NQVNLKSA9PSBSWERfT1BBUVVFX1JJTkdfU1REKSB7CisJCQlsZW4gPSAoKGRlc2MtPmlkeF9sZW4gJiBSWERfTEVOX01BU0spID4+IFJYRF9MRU5fU0hJRlQpIC0gNDsgLyogb21pdCBjcmMgKi8KKwkJCQorCQkJbmljLT5wYWNrZXRsZW4gPSBsZW47CisJCQltZW1jcHkobmljLT5wYWNrZXQsIGJ1c190b192aXJ0KGRlc2MtPmFkZHJfbG8pLCBsZW4pOworCQkJcmVzdWx0ID0gMTsKKwkJfQorCQl0cC0+cnhfcmNiX3B0ciA9ICh0cC0+cnhfcmNiX3B0ciArIDEpICUgVEczX1JYX1JDQl9SSU5HX1NJWkU7CisJCQorCQkvKiBBQ0sgdGhlIHN0YXR1cyByaW5nICovCisJCXR3MzJfbWFpbGJveDIoTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIHRwLT5yeF9yY2JfcHRyKTsKKworCQkvKiBSZWZpbGwgUlggcmluZy4gKi8KKwkJaWYgKHJlc3VsdCkgeworCQkJdHAtPnJ4X3N0ZF9wdHIgPSAodHAtPnJ4X3N0ZF9wdHIgKyAxKSAlIFRHM19SWF9SSU5HX1NJWkU7CisJCQl0dzMyX21haWxib3gyKE1BSUxCT1hfUkNWX1NURF9QUk9EX0lEWCArIFRHM182NEJJVF9SRUdfTE9XLCB0cC0+cnhfc3RkX3B0cik7CisJCX0KKwl9CisJdGczX3BvbGxfbGluayh0cCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAwCitzdGF0aWMgdm9pZCB0ZzNfc2V0X3R4ZChzdHJ1Y3QgdGczICp0cCwgaW50IGVudHJ5LAorCWRtYV9hZGRyX3QgbWFwcGluZywgaW50IGxlbiwgdWludDMyX3QgZmxhZ3MsCisJdWludDMyX3QgbXNzX2FuZF9pc19lbmQpCit7CisJc3RydWN0IHRnM190eF9idWZmZXJfZGVzYyAqdHhkID0gICZ0cC0+dHhfcmluZ1tlbnRyeV07CisJaW50IGlzX2VuZCA9IChtc3NfYW5kX2lzX2VuZCAmIDB4MSk7CisJaWYgKGlzX2VuZCkgeworCQlmbGFncyB8PSBUWERfRkxBR19FTkQ7CisJfQorCisJdHhkLT5hZGRyX2hpICAgPSAwOworCXR4ZC0+YWRkcl9sbyAgID0gbWFwcGluZyAmIDB4ZmZmZmZmZmY7CisJdHhkLT5sZW5fZmxhZ3MgPSAobGVuIDw8IFRYRF9MRU5fU0hJRlQpIHwgZmxhZ3M7CisJdHhkLT52bGFuX3RhZyAgPSAwIDw8IFRYRF9WTEFOX1RBR19TSElGVDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0ZzNfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkc3RfYWRkciwKKwl1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHNpemUsIGNvbnN0IGNoYXIgKnBhY2tldCkKK3sKKwlzdGF0aWMgaW50IGZyYW1lX2lkeDsKKwlzdHJ1Y3QgZXRoX2ZyYW1lICpmcmFtZTsKKwkKKwkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KKwlzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjICp0eGQ7CisJc3RydWN0IHRnMyAqdHA7CisJdWludDMyX3QgZW50cnk7CisJaW50IGk7CisKKwkvKiBXYWl0IHVudGlsIHRoZXJlIGlzIGEgZnJlZSBwYWNrZXQgZnJhbWUgKi8KKwl0cCA9ICZ0ZzM7CisJaSA9IDA7CisJZW50cnkgPSB0cC0+dHhfcHJvZDsKKwl3aGlsZSgodHAtPmh3X3N0YXR1cy0+aWR4WzBdLnR4X2NvbnN1bWVyICE9IGVudHJ5KSAmJgorCQkodHAtPmh3X3N0YXR1cy0+aWR4WzBdLnR4X2NvbnN1bWVyICE9IFBSRVZfVFgoZW50cnkpKSkgeworCQltZGVsYXkoMTApOwkvKiBnaXZlIHRoZSBuaWNrIGEgY2hhbmNlICovCisJCWlmICgrK2kgPiA1MDApIHsgLyogdGltZW91dCA1cyBmb3IgdHJhbnNtaXQgKi8KKwkJCXByaW50ZigidHJhbnNtaXQgdGltZWQgb3V0XG4iKTsKKwkJCXRnM19oYWx0KHRwKTsKKwkJCXRnM19zZXR1cF9odyh0cCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKGkgIT0gMCkgeworCQlwcmludGYoIiMiKTsKKwl9CisJCisJLyogQ29weSB0aGUgcGFja2V0IHRvIHRoZSBvdXIgbG9jYWwgYnVmZmVyICovCisJZnJhbWUgPSAmdGczX2Jzcy50eF9mcmFtZVtmcmFtZV9pZHhdOworCW1lbWNweShmcmFtZS0+ZHN0X2FkZHIsIGRzdF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGZyYW1lLT5zcmNfYWRkciwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKwlmcmFtZS0+dHlwZSA9IGh0b25zKHR5cGUpOworCW1lbXNldChmcmFtZS0+ZGF0YSwgMCwgc2l6ZW9mKGZyYW1lLT5kYXRhKSk7CisJbWVtY3B5KGZyYW1lLT5kYXRhLCBwYWNrZXQsIHNpemUpOworCisJLyogU2V0dXAgdGhlIHJpbmcgYnVmZmVyIGVudHJ5IHRvIHRyYW5zbWl0ICovCisJdHhkICAgICAgICAgICAgPSAmdHAtPnR4X3JpbmdbZW50cnldOworCXR4ZC0+YWRkcl9oaSAgID0gMDsgLyogRXRoZXJib290IHJ1bnMgdW5kZXIgNEdCICovCisJdHhkLT5hZGRyX2xvICAgPSB2aXJ0X3RvX2J1cyhmcmFtZSk7CisJdHhkLT5sZW5fZmxhZ3MgPSAoKHNpemUgKyBFVEhfSExFTikgPDwgVFhEX0xFTl9TSElGVCkgfCBUWERfRkxBR19FTkQ7CisJdHhkLT52bGFuX3RhZyAgPSAwIDw8IFRYRF9WTEFOX1RBR19TSElGVDsKKworCS8qIEFkdmFuY2UgdG8gdGhlIG5leHQgZW50cnkgKi8KKwllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCWZyYW1lX2lkeCBePSAxOworCisJLyogUGFja2V0cyBhcmUgcmVhZHksIHVwZGF0ZSBUeCBwcm9kdWNlciBpZHggbG9jYWwgYW5kIG9uIGNhcmQgKi8KKwl0dzMyX21haWxib3goKE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1cpLCBlbnRyeSk7CisJdHczMl9tYWlsYm94MigoTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVyksIGVudHJ5KTsKKwl0cC0+dHhfcHJvZCA9IGVudHJ5OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRnM19kaXNhYmxlICggc3RydWN0IG5pYyAqbmljIF9fdW51c2VkICkgeworCXN0cnVjdCB0ZzMgKnRwID0gJnRnMzsKKwkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KKwkvKiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyAzIHB1cnBvc2VzLgorCSAqIFRoaXMgZGlzYWJsZXMgRE1BIGFuZCBpbnRlcnJ1cHRzIHNvIHdlIGRvbid0IHJlY2VpdmUKKwkgKiAgdW5leHBlY3RlZCBwYWNrZXRzIG9yIGludGVycnVwdHMgZnJvbSB0aGUgY2FyZCBhZnRlcgorCSAqICBldGhlcmJvb3QgaGFzIGZpbmlzaGVkLiAKKwkgKiBUaGlzIGZyZWVzIHJlc291cmNlcyBzbyBldGhlcmJvb3QgbWF5IHVzZQorCSAqICB0aGlzIGRyaXZlciBvbiBhbm90aGVyIGludGVyZmFjZQorCSAqIFRoaXMgYWxsb3dzIGV0aGVyYm9vdCB0byByZWluaXRpYWxpemUgdGhlIGludGVyZmFjZQorCSAqICBpZiBzb21ldGhpbmcgaXMgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisJICovCisJdGczX2hhbHQodHApOworCXRwLT50ZzNfZmxhZ3MgJj0gfihURzNfRkxBR19JTklUX0NPTVBMRVRFfFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTCk7CisJdHAtPmNhcnJpZXJfb2sgPSAwOworCWlvdW5tYXAoKHZvaWQgKil0cC0+cmVncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVJRIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0ZzNfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmljX29wZXJhdGlvbnMgdGczX29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QJPSBkdW1teV9jb25uZWN0LAorCS5wb2xsCQk9IHRnM19wb2xsLAorCS50cmFuc21pdAk9IHRnM190cmFuc21pdCwKKwkuaXJxCQk9IHRnM19pcnEsCisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCitZb3Ugc2hvdWxkIG9taXQgdGhlIGxhc3QgYXJndW1lbnQgc3RydWN0IHBjaV9kZXZpY2UgKiBmb3IgYSBub24tUENJIE5JQworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB0ZzNfcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2ICkgeworCisJc3RydWN0IHRnMyAqdHAgPSAmdGczOworCXVuc2lnbmVkIGxvbmcgdGczcmVnX2Jhc2UsIHRnM3JlZ19sZW47CisJaW50IGksIGVyciwgcG1fY2FwOworCisJbWVtc2V0KHRwLCAwLCBzaXplb2YoKnRwKSk7CisKKwlhZGp1c3RfcGNpX2RldmljZShwZGV2KTsKKworCW5pYy0+aXJxbm8gID0gMDsKKyAgICAgICAgbmljLT5pb2FkZHIgPSBwZGV2LT5pb2FkZHI7CisKKwkvKiBGaW5kIHBvd2VyLW1hbmFnZW1lbnQgY2FwYWJpbGl0eS4gKi8KKwlwbV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOworCWlmIChwbV9jYXAgPT0gMCkgeworCQlwcmludGYoIkNhbm5vdCBmaW5kIFBvd2VyTWFuYWdlbWVudCBjYXBhYmlsaXR5LCBhYm9ydGluZy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJdGczcmVnX2Jhc2UgPSBwY2lfYmFyX3N0YXJ0KHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCk7CisJaWYgKHRnM3JlZ19iYXNlID09IC0xVUwpIHsKKwkJcHJpbnRmKCJVbnVzZWFibGUgYmFyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXRnM3JlZ19sZW4gID0gcGNpX2Jhcl9zaXplKHBkZXYsICBQQ0lfQkFTRV9BRERSRVNTXzApOworCisJdHAtPnBkZXYgICAgICAgPSBwZGV2OworCXRwLT5uaWMgICAgICAgID0gbmljOworCXRwLT5wbV9jYXAgICAgID0gcG1fY2FwOworCXRwLT5yeF9tb2RlICAgID0gMDsKKwl0cC0+dHhfbW9kZSAgICA9IDA7CisJdHAtPm1pX21vZGUgICAgPSBNQUNfTUlfTU9ERV9CQVNFOworCXRwLT50ZzNfZmxhZ3MgID0gMCAmIH5URzNfRkxBR19JTklUX0NPTVBMRVRFOyAKKwkKKwkvKiBUaGUgd29yZC9ieXRlIHN3YXAgY29udHJvbHMgaGVyZSBjb250cm9sIHJlZ2lzdGVyIGFjY2VzcyBieXRlCisJICogc3dhcHBpbmcuICBETUEgZGF0YSBieXRlIHN3YXBwaW5nIGlzIGNvbnRyb2xsZWQgaW4gdGhlIEdSQ19NT0RFCisJICogc2V0dGluZyBiZWxvdy4KKwkgKi8KKwl0cC0+bWlzY19ob3N0X2N0cmwgPQorCQlNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQgfAorCQlNSVNDX0hPU1RfQ1RSTF9XT1JEX1NXQVAgfAorCQlNSVNDX0hPU1RfQ1RSTF9JTkRJUl9BQ0NFU1MgfAorCQlNSVNDX0hPU1RfQ1RSTF9QQ0lTVEFURV9SVzsKKworCS8qIFRoZSBOT05GUk0gKG5vbi1mcmFtZSkgYnl0ZS93b3JkIHN3YXAgY29udHJvbHMgdGFrZSBlZmZlY3QKKwkgKiBvbiBkZXNjcmlwdG9yIGVudHJpZXMsIGFueXRoaW5nIHdoaWNoIGlzbid0IHBhY2tldCBkYXRhLgorCSAqCisJICogVGhlIFN0cm9uZ0FSTSBjaGlwcyBvbiB0aGUgYm9hcmQgKG9uZSBmb3IgdHgsIG9uZSBmb3IgcngpCisJICogYXJlIHJ1bm5pbmcgaW4gYmlnLWVuZGlhbiBtb2RlLgorCSAqLworCXRwLT5ncmNfbW9kZSA9IChHUkNfTU9ERV9XU1dBUF9EQVRBIHwgR1JDX01PREVfQlNXQVBfREFUQSB8CisJCQlHUkNfTU9ERV9XU1dBUF9OT05GUk1fREFUQSk7CisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXRwLT5ncmNfbW9kZSB8PSBHUkNfTU9ERV9CU1dBUF9OT05GUk1fREFUQTsKKyNlbmRpZgorCXRwLT5yZWdzID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAodGczcmVnX2Jhc2UsIHRnM3JlZ19sZW4pOworCWlmICh0cC0+cmVncyA9PSAwVUwpIHsKKwkJcHJpbnRmKCJDYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnMsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdGczX2luaXRfbGlua19jb25maWcodHApOworCisJZXJyID0gdGczX2dldF9pbnZhcmlhbnRzKHRwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ZigiUHJvYmxlbSBmZXRjaGluZyBpbnZhcmlhbnRzIG9mIGNoaXAsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWVyciA9IHRnM19nZXRfZGV2aWNlX2FkZHJlc3ModHApOworCWlmIChlcnIpIHsKKwkJcHJpbnRmKCJDb3VsZCBub3Qgb2J0YWluIHZhbGlkIGV0aGVybmV0IGFkZHJlc3MsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCURCRyAoICJFdGhlcm5ldCBhZGRyOiAlc1xuIiwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApICk7CisKKwl0ZzNfc2V0dXBfZG1hKHRwKTsKKworCS8qIE5vdyB0aGF0IHdlIGhhdmUgZnVsbHkgc2V0dXAgdGhlIGNoaXAsIHNhdmUgYXdheSBhIHNuYXBzaG90CisJICogb2YgdGhlIFBDSSBjb25maWcgc3BhY2UuICBXZSBuZWVkIHRvIHJlc3RvcmUgdGhpcyBhZnRlcgorCSAqIEdSQ19NSVNDX0NGRyBjb3JlIGNsb2NrIHJlc2V0cyBhbmQgc29tZSByZXN1bWUgZXZlbnRzLgorCSAqLworCXBjaV9zYXZlX3N0YXRlKHRwLT5wZGV2LCB0cC0+cGNpX2NmZ19zdGF0ZSk7CisKKwlwcmludGYoIlRpZ29uMyBbcGFydG5vKCVzKSByZXYgJWh4IFBIWSglcyldIChQQ0klczolczolcylcbiIsCisJCXRwLT5ib2FyZF9wYXJ0X251bWJlciwKKwkJdHAtPnBjaV9jaGlwX3Jldl9pZCwKKwkJdGczX3BoeV9zdHJpbmcodHApLAorCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID8gIlgiIDogIiIpLAorCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lfSElHSF9TUEVFRCkgPworCQkJKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSA/ICIxMzNNSHoiIDogIjY2TUh6IikgOgorCQkJKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSA/ICIxMDBNSHoiIDogIjMzTUh6IikpLAorCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lfMzJCSVQpID8gIjMyLWJpdCIgOiAiNjQtYml0IikpOworCisKKwllcnIgPSB0ZzNfc2V0dXBfaHcodHApOyAKKwlpZiAoZXJyKSB7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0gCisJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19JTklUX0NPTVBMRVRFOworCisJLyogV2FpdCBmb3IgYSByZWFzb25hYmxlIHRpbWUgZm9yIHRoZSBsaW5rIHRvIGNvbWUgdXAgKi8KKwl0ZzNfcG9sbF9saW5rKHRwKTsKKwlmb3IoaSA9IDA7ICF0cC0+Y2Fycmllcl9vayAmJiAoaSA8IFZBTElEX0xJTktfVElNRU9VVCoxMDApOyBpKyspIHsKKwkJbWRlbGF5KDEpOworCQl0ZzNfcG9sbF9saW5rKHRwKTsKKwl9CisJaWYgKCF0cC0+Y2Fycmllcl9vayl7CisJCXByaW50ZigiVmFsaWQgbGluayBub3QgZXN0YWJsaXNoZWRcbiIpOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwluaWMtPm5pY19vcAk9ICZ0ZzNfb3BlcmF0aW9uczsKKwlyZXR1cm4gMTsKKworIGVycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKCh2b2lkICopdHAtPnJlZ3MpOworCXJldHVybiAwOworIGVycl9vdXRfZGlzYWJsZToKKwl0ZzNfZGlzYWJsZShuaWMpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0ZzNfbmljc1tdID0geworUENJX1JPTSgweDE0ZTQsIDB4MTY0NCwgInRnMy01NzAwIiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDAiLCAwKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NDUsICJ0ZzMtNTcwMSIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAxIiwgMCksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjQ2LCAidGczLTU3MDIiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwMiIsIDApLAorUENJX1JPTSgweDE0ZTQsIDB4MTY0NywgInRnMy01NzAzIiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDMiLCAwKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NDgsICJ0ZzMtNTcwNCIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzA0IiwgMCksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjRkLCAidGczLTU3MDJGRSIsICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwMkZFIiwgMCksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjUzLCAidGczLTU3MDUiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwNSIsIDApLAorUENJX1JPTSgweDE0ZTQsIDB4MTY1NCwgInRnMy01NzA1XzIiLCAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDVfMiIsIDApLAorUENJX1JPTSgweDE0ZTQsIDB4MTY1OSwgInRnMy01NzIxIiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MjEiLCAwKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NWQsICJ0ZzMtNTcwNU0iLCAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzA1TSIsIDApLAorUENJX1JPTSgweDE0ZTQsIDB4MTY1ZSwgInRnMy01NzA1TV8yIiwgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDVNXzIiLCAwKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NzcsICJ0ZzMtNTc1MSIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzUxIiwgMCksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjdhLCAidGczLTU3NTQiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTc1NCIsIDApLAorUENJX1JPTSgweDE0ZTQsIDB4MTY5MywgInRnMy01Nzg3IiwJICAgIkJyb2FkY29tIFRpZ29uIDMgNTc4NyIsIDApLAorUENJX1JPTSgweDE0ZTQsIDB4MTY5NiwgInRnMy01NzgyIiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3ODIiLCAwKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2OWEsICJ0ZzMtNTc4NiIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1Nzg2IiwgMCksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjljLCAidGczLTU3ODgiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTc4OCIsIDApLAorUENJX1JPTSgweDE0ZTQsIDB4MTY5ZCwgInRnMy01Nzg5IiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3ODkiLCAwKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2YTYsICJ0ZzMtNTcwMlgiLCAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAyWCIsIDApLAorUENJX1JPTSgweDE0ZTQsIDB4MTZhNywgInRnMy01NzAzWCIsICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDNYIiwgMCksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNmE4LCAidGczLTU3MDRTIiwgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwNFMiLCAwKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2YzYsICJ0ZzMtNTcwMkEzIiwgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAyQTMiLCAwKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2YzcsICJ0ZzMtNTcwM0EzIiwgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAzQTMiLCAwKSwKK1BDSV9ST00oMHgxNGU0LCAweDE3MGQsICJ0ZzMtNTkwMSIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1OTAxIiwgMCksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNzBlLCAidGczLTU5MDFfMiIsICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTkwMV8yIiwgMCksCitQQ0lfUk9NKDB4MTE0OCwgMHg0NDAwLCAidGczLTlEWFgiLCAgICAgICAgIlN5c2tvbm5lY3QgOURYWCIsIDApLAorUENJX1JPTSgweDExNDgsIDB4NDUwMCwgInRnMy05TVhYIiwgICAgICAgICJTeXNrb25uZWN0IDlNWFgiLCAwKSwKK1BDSV9ST00oMHgxNzNiLCAweDAzZTgsICJ0ZzMtYWMxMDAwIiwgICAgICAiQWx0aW1hIEFDMTAwMCIsIDApLAorUENJX1JPTSgweDE3M2IsIDB4MDNlOSwgInRnMy1hYzEwMDEiLCAgICAgICJBbHRpbWEgQUMxMDAxIiwgMCksCitQQ0lfUk9NKDB4MTczYiwgMHgwM2VhLCAidGczLWFjOTEwMCIsICAgICAgIkFsdGltYSBBQzkxMDAiLCAwKSwKK1BDSV9ST00oMHgxNzNiLCAweDAzZWIsICJ0ZzMtYWMxMDAzIiwgICAgICAiQWx0aW1hIEFDMTAwMyIsIDApLAorUENJX1JPTSgweDBlMTEsIDB4MDBjYSwgInRnMy1ocCIsCSAgICJIUCBUaWdvbiAzIiwgMCksCit9OworCitQQ0lfRFJJVkVSICggdGczX2RyaXZlciwgdGczX25pY3MsIFBDSV9OT19DTEFTUyApOworCitEUklWRVIgKCAiVEczIiwgbmljX2RyaXZlciwgcGNpX2RyaXZlciwgdGczX2RyaXZlciwKKwkgdGczX3Byb2JlLCB0ZzNfZGlzYWJsZSApOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdGczLmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC90ZzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWViMGFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdGczLmgKQEAgLTAsMCArMSwyMTIxIEBACisvKiAkSWQkCisgKiB0ZzMuaDogRGVmaW5pdGlvbnMgZm9yIEJyb2FkY29tIFRpZ29uMyBldGhlcm5ldCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSBKZWZmIEdhcnppayAoamdhcnppa0BtYW5kcmFrZXNvZnQuY29tKQorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisjaWZuZGVmIF9UM19ICisjZGVmaW5lIF9UM19ICisKKyNpbmNsdWRlICJzdGRpbnQuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRtYV9hZGRyX3Q7CisKKy8qIEZyb20gbWlpLmggKi8KKworLyogSW5kaWNhdGVzIHdoYXQgZmVhdHVyZXMgYXJlIGFkdmVydGlzZWQgYnkgdGhlIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYJCSgxIDw8IDApCisjZGVmaW5lIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsCQkoMSA8PCAxKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYJKDEgPDwgMikKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsCSgxIDw8IDMpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYJKDEgPDwgNCkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbAkoMSA8PCA1KQorI2RlZmluZSBBRFZFUlRJU0VEX0F1dG9uZWcJCSgxIDw8IDYpCisjZGVmaW5lIEFEVkVSVElTRURfVFAJCQkoMSA8PCA3KQorI2RlZmluZSBBRFZFUlRJU0VEX0FVSQkJCSgxIDw8IDgpCisjZGVmaW5lIEFEVkVSVElTRURfTUlJCQkJKDEgPDwgOSkKKyNkZWZpbmUgQURWRVJUSVNFRF9GSUJSRQkJKDEgPDwgMTApCisjZGVmaW5lIEFEVkVSVElTRURfQk5DCQkJKDEgPDwgMTEpCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGFsbCBpbnZvbHZlZCBpbiBmb3JjaW5nIGEgcGFydGljdWxhciBsaW5rCisgKiBtb2RlIGZvciB0aGUgZGV2aWNlIGZvciBzZXR0aW5nIHRoaW5ncy4gIFdoZW4gZ2V0dGluZyB0aGUKKyAqIGRldmljZXMgc2V0dGluZ3MsIHRoZXNlIGluZGljYXRlIHRoZSBjdXJyZW50IG1vZGUgYW5kIHdoZXRoZXIKKyAqIGl0IHdhcyBmb2NlZCB1cCBpbnRvIHRoaXMgbW9kZSBvciBhdXRvbmVnb3RpYXRlZC4KKyAqLworCisvKiBUaGUgZm9yY2VkIHNwZWVkLCAxME1iLCAxMDBNYiwgZ2lnYWJpdC4gKi8KKyNkZWZpbmUgU1BFRURfMTAJCTAKKyNkZWZpbmUgU1BFRURfMTAwCQkxCisjZGVmaW5lIFNQRUVEXzEwMDAJCTIKKyNkZWZpbmUgU1BFRURfSU5WQUxJRCAgICAgICAgICAgMworCisKKy8qIER1cGxleCwgaGFsZiBvciBmdWxsLiAqLworI2RlZmluZSBEVVBMRVhfSEFMRgkJMHgwMAorI2RlZmluZSBEVVBMRVhfRlVMTAkJMHgwMQorI2RlZmluZSBEVVBMRVhfSU5WQUxJRCAgICAgICAgICAweDAyCisKKy8qIFdoaWNoIGNvbm5lY3RvciBwb3J0LiAqLworI2RlZmluZSBQT1JUX1RQCQkJMHgwMAorI2RlZmluZSBQT1JUX0FVSQkJMHgwMQorI2RlZmluZSBQT1JUX01JSQkJMHgwMgorI2RlZmluZSBQT1JUX0ZJQlJFCQkweDAzCisjZGVmaW5lIFBPUlRfQk5DCQkweDA0CisKKy8qIFdoaWNoIHRyYW5jZWl2ZXIgdG8gdXNlLiAqLworI2RlZmluZSBYQ1ZSX0lOVEVSTkFMCQkweDAwCisjZGVmaW5lIFhDVlJfRVhURVJOQUwJCTB4MDEKKyNkZWZpbmUgWENWUl9EVU1NWTEJCTB4MDIKKyNkZWZpbmUgWENWUl9EVU1NWTIJCTB4MDMKKyNkZWZpbmUgWENWUl9EVU1NWTMJCTB4MDQKKworLyogRW5hYmxlIG9yIGRpc2FibGUgYXV0b25lZ290aWF0aW9uLiAgSWYgdGhpcyBpcyBzZXQgdG8gZW5hYmxlLAorICogdGhlIGZvcmNlZCBsaW5rIG1vZGVzIGFib3ZlIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQuCisgKi8KKyNkZWZpbmUgQVVUT05FR19ESVNBQkxFCQkweDAwCisjZGVmaW5lIEFVVE9ORUdfRU5BQkxFCQkweDAxCisKKy8qIFdha2UtT24tTGFuIG9wdGlvbnMuICovCisjZGVmaW5lIFdBS0VfUEhZCQkoMSA8PCAwKQorI2RlZmluZSBXQUtFX1VDQVNUCQkoMSA8PCAxKQorI2RlZmluZSBXQUtFX01DQVNUCQkoMSA8PCAyKQorI2RlZmluZSBXQUtFX0JDQVNUCQkoMSA8PCAzKQorI2RlZmluZSBXQUtFX0FSUAkJKDEgPDwgNCkKKyNkZWZpbmUgV0FLRV9NQUdJQwkJKDEgPDwgNSkKKyNkZWZpbmUgV0FLRV9NQUdJQ1NFQ1VSRQkoMSA8PCA2KSAvKiBvbmx5IG1lYW5pbmdmdWwgaWYgV0FLRV9NQUdJQyAqLworCisvKiBGcm9tIHRnMy5oICovCisKKyNkZWZpbmUgVEczXzY0QklUX1JFR19ISUdICQkweDAwVUwKKyNkZWZpbmUgVEczXzY0QklUX1JFR19MT1cJCTB4MDRVTAorCisvKiBEZXNjcmlwdG9yIGJsb2NrIGluZm8uICovCisjZGVmaW5lIFRHM19CRElORk9fSE9TVF9BRERSCQkweDBVTCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVEczX0JESU5GT19NQVhMRU5fRkxBR1MJCTB4OFVMIC8qIDMyLWJpdCAqLworI2RlZmluZSAgQkRJTkZPX0ZMQUdTX1VTRV9FWFRfUkVDVgkgMHgwMDAwMDAwMSAvKiBleHQgcnhfYnVmZmVyX2Rlc2MgKi8KKyNkZWZpbmUgIEJESU5GT19GTEFHU19ESVNBQkxFRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEJESU5GT19GTEFHU19NQVhMRU5fTUFTSwkgMHhmZmZmMDAwMAorI2RlZmluZSAgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVAkgMTYKKyNkZWZpbmUgVEczX0JESU5GT19OSUNfQUREUgkJMHhjVUwgLyogMzItYml0ICovCisjZGVmaW5lIFRHM19CRElORk9fU0laRQkJCTB4MTBVTAorCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEICAJCTI1NgorCisjZGVmaW5lIFJYX1NURF9NQVhfU0laRQkJCTE1MzYKKyNkZWZpbmUgUlhfU1REX01BWF9TSVpFXzU3MDUJCTUxMgorI2RlZmluZSBSWF9KVU1CT19NQVhfU0laRQkJMHhkZWFkYmVlZiAvKiBYWFggKi8KKworLyogRmlyc3QgMjU2IGJ5dGVzIGFyZSBhIG1pcnJvciBvZiBQQ0kgY29uZmlnIHNwYWNlLiAqLworI2RlZmluZSBURzNQQ0lfVkVORE9SCQkJMHgwMDAwMDAwMAorI2RlZmluZSAgVEczUENJX1ZFTkRPUl9CUk9BRENPTQkJIDB4MTRlNAorI2RlZmluZSBURzNQQ0lfREVWSUNFCQkJMHgwMDAwMDAwMgorI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfMQkJIDB4MTY0NCAvKiBCQ001NzAwICovCisjZGVmaW5lICBURzNQQ0lfREVWSUNFX1RJR09OM18yCQkgMHgxNjQ1IC8qIEJDTTU3MDEgKi8KKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzMJCSAweDE2NDYgLyogQkNNNTcwMiAqLworI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNAkJIDB4MTY0NyAvKiBCQ001NzAzICovCisjZGVmaW5lIFRHM1BDSV9DT01NQU5ECQkJMHgwMDAwMDAwNAorI2RlZmluZSBURzNQQ0lfU1RBVFVTCQkJMHgwMDAwMDAwNgorI2RlZmluZSBURzNQQ0lfQ0NSRVZJRAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVEczUENJX0NBQ0hFTElORVNaCQkweDAwMDAwMDBjCisjZGVmaW5lIFRHM1BDSV9MQVRUSU1FUgkJCTB4MDAwMDAwMGQKKyNkZWZpbmUgVEczUENJX0hFQURFUlRZUEUJCTB4MDAwMDAwMGUKKyNkZWZpbmUgVEczUENJX0JJU1QJCQkweDAwMDAwMDBmCisjZGVmaW5lIFRHM1BDSV9CQVNFMF9MT1cJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVEczUENJX0JBU0UwX0hJR0gJCTB4MDAwMDAwMTQKKy8qIDB4MTggLS0+IDB4MmMgdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9TVUJTWVNWRU5JRAkJMHgwMDAwMDAyYworI2RlZmluZSBURzNQQ0lfU1VCU1lTSUQJCQkweDAwMDAwMDJlCisjZGVmaW5lIFRHM1BDSV9ST01BRERSCQkJMHgwMDAwMDAzMAorI2RlZmluZSBURzNQQ0lfQ0FQTElTVAkJCTB4MDAwMDAwMzQKKy8qIDB4MzUgLS0+IDB4M2MgdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9JUlFfTElORQkJCTB4MDAwMDAwM2MKKyNkZWZpbmUgVEczUENJX0lSUV9QSU4JCQkweDAwMDAwMDNkCisjZGVmaW5lIFRHM1BDSV9NSU5fR05UCQkJMHgwMDAwMDAzZQorI2RlZmluZSBURzNQQ0lfTUFYX0xBVAkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgVEczUENJX1hfQ0FQUwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19SRUxBWEVEX09SREVSSU5HCSAweDAwMDIwMDAwCisjZGVmaW5lICBQQ0lYX0NBUFNfU1BMSVRfTUFTSwkJIDB4MDA3MDAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19TUExJVF9TSElGVAkJIDIwCisjZGVmaW5lICBQQ0lYX0NBUFNfQlVSU1RfTUFTSwkJIDB4MDAwYzAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19CVVJTVF9TSElGVAkJIDE4CisjZGVmaW5lICBQQ0lYX0NBUFNfTUFYX0JVUlNUX0NQSU9CCSAyCisjZGVmaW5lIFRHM1BDSV9QTV9DQVBfUFRSCQkweDAwMDAwMDQxCisjZGVmaW5lIFRHM1BDSV9YX0NPTU1BTkQJCTB4MDAwMDAwNDIKKyNkZWZpbmUgVEczUENJX1hfU1RBVFVTCQkJMHgwMDAwMDA0NAorI2RlZmluZSBURzNQQ0lfUE1fQ0FQX0lECQkweDAwMDAwMDQ4CisjZGVmaW5lIFRHM1BDSV9WUERfQ0FQX1BUUgkJMHgwMDAwMDA0OQorI2RlZmluZSBURzNQQ0lfUE1fQ0FQUwkJCTB4MDAwMDAwNGEKKyNkZWZpbmUgVEczUENJX1BNX0NUUkxfU1RBVAkJMHgwMDAwMDA0YworI2RlZmluZSBURzNQQ0lfQlJfU1VQUF9FWFQJCTB4MDAwMDAwNGUKKyNkZWZpbmUgVEczUENJX1BNX0RBVEEJCQkweDAwMDAwMDRmCisjZGVmaW5lIFRHM1BDSV9WUERfQ0FQX0lECQkweDAwMDAwMDUwCisjZGVmaW5lIFRHM1BDSV9NU0lfQ0FQX1BUUgkJMHgwMDAwMDA1MQorI2RlZmluZSBURzNQQ0lfVlBEX0FERFJfRkxBRwkJMHgwMDAwMDA1MgorI2RlZmluZSAgVlBEX0FERFJfRkxBR19XUklURQkJMHgwMDAwODAwMAorI2RlZmluZSBURzNQQ0lfVlBEX0RBVEEJCQkweDAwMDAwMDU0CisjZGVmaW5lIFRHM1BDSV9NU0lfQ0FQX0lECQkweDAwMDAwMDU4CisjZGVmaW5lIFRHM1BDSV9OWFRfQ0FQX1BUUgkJMHgwMDAwMDA1OQorI2RlZmluZSBURzNQQ0lfTVNJX0NUUkwJCQkweDAwMDAwMDVhCisjZGVmaW5lIFRHM1BDSV9NU0lfQUREUl9MT1cJCTB4MDAwMDAwNWMKKyNkZWZpbmUgVEczUENJX01TSV9BRERSX0hJR0gJCTB4MDAwMDAwNjAKKyNkZWZpbmUgVEczUENJX01TSV9EQVRBCQkJMHgwMDAwMDA2NAorLyogMHg2NiAtLT4gMHg2OCB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX01JU0NfSE9TVF9DVFJMCQkweDAwMDAwMDY4CisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DTEVBUl9JTlQJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVAkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfQllURV9TV0FQCSAweDAwMDAwMDA0CisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9XT1JEX1NXQVAJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1BDSVNUQVRFX1JXCSAweDAwMDAwMDEwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DTEtSRUdfUlcJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1JFR1dPUkRfU1dBUAkgMHgwMDAwMDA0MAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfSU5ESVJfQUNDRVNTCSAweDAwMDAwMDgwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9JUlFfTUFTS19NT0RFCSAweDAwMDAwMTAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9UQUdHRURfU1RBVFVTCSAweDAwMDAwMjAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWCQkgMHhmZmZmMDAwMAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfQ0hJUFJFVl9TSElGVAkgMTYKKyNkZWZpbmUgIEdFVF9DSElQX1JFVl9JRChNSVNDX0hPU1RfQ1RSTCkgXAorCSAoKChNSVNDX0hPU1RfQ1RSTCkgJiBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWKSA+PiBcCisJICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWX1NISUZUKQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0EwCQkgMHg3MDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQTEJCSAweDcwMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9CMAkJIDB4NzEwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0IxCQkgMHg3MTAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQjMJCSAweDcxMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9BTFRJTUEJCSAweDcxMDQKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9DMAkJIDB4NzIwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0EwCQkgMHgwMDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDFfQjAJCSAweDAxMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMV9CMgkJIDB4MDEwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0I1CQkgMHgwMTA1CisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTAJCSAweDEwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwM19BMQkJIDB4MTAwMQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAzX0EyCQkgMHgxMDAyCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTMJCSAweDEwMDMKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNF9BMAkJIDB4MjAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA0X0ExCQkgMHgyMDAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDRfQTIJCSAweDIwMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNV9BMAkJIDB4MzAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0ExCQkgMHgzMDAxCisjZGVmaW5lCSBDSElQUkVWX0lEXzU3MDVfQTIgICAgICAgICAgICAgIDB4MzAwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0EzICAgICAgICAgICAgICAweDMwMDMKKyNkZWZpbmUgIENISVBSRVZfSURfNTcyMSAgICAgICAgICAgICAgICAgMHg0MTAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3NTBfQTAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzUwX0ExICAgICAgICAgICAgICAweDQwMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTc1MF9BMyAgICAgICAgICAgICAgMHg0MDAzCisjZGVmaW5lICBHRVRfQVNJQ19SRVYoQ0hJUF9SRVZfSUQpCSgoQ0hJUF9SRVZfSUQpID4+IDEyKQorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDAJCQkgMHgwNworI2RlZmluZSAgIEFTSUNfUkVWXzU3MDEJCQkgMHgwMAorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDMJCQkgMHgwMQorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDQJCQkgMHgwMgorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDUJCQkgMHgwMworI2RlZmluZSAgIEFTSUNfUkVWXzU3NTAJCQkgMHgwNAorI2RlZmluZSAgIEFTSUNfUkVWXzU3ODcJCQkgMHgwYgorI2RlZmluZSAgR0VUX0NISVBfUkVWKENISVBfUkVWX0lEKQkoKENISVBfUkVWX0lEKSA+PiA4KQorI2RlZmluZSAgIENISVBSRVZfNTcwMF9BWAkJIDB4NzAKKyNkZWZpbmUgICBDSElQUkVWXzU3MDBfQlgJCSAweDcxCisjZGVmaW5lICAgQ0hJUFJFVl81NzAwX0NYCQkgMHg3MgorI2RlZmluZSAgIENISVBSRVZfNTcwMV9BWAkJIDB4MDAKKyNkZWZpbmUgIEdFVF9NRVRBTF9SRVYoQ0hJUF9SRVZfSUQpCSgoQ0hJUF9SRVZfSUQpICYgMHhmZikKKyNkZWZpbmUgICBNRVRBTF9SRVZfQTAJCQkgMHgwMAorI2RlZmluZSAgIE1FVEFMX1JFVl9BMQkJCSAweDAxCisjZGVmaW5lICAgTUVUQUxfUkVWX0IwCQkJIDB4MDAKKyNkZWZpbmUgICBNRVRBTF9SRVZfQjEJCQkgMHgwMQorI2RlZmluZSAgIE1FVEFMX1JFVl9CMgkJCSAweDAyCisjZGVmaW5lIFRHM1BDSV9ETUFfUldfQ1RSTAkJMHgwMDAwMDA2YworI2RlZmluZSAgRE1BX1JXQ1RSTF9NSU5fRE1BCQkgMHgwMDAwMDBmZgorI2RlZmluZSAgRE1BX1JXQ1RSTF9NSU5fRE1BX1NISUZUCSAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfTUFTSwkgMHgwMDAwMDcwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZX0RJU0FCCSAweDAwMDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMTYJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8zMgkgMHgwMDAwMDIwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzY0CSAweDAwMDAwMzAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMTI4CSAweDAwMDAwNDAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMjU2CSAweDAwMDAwNTAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfNTEyCSAweDAwMDAwNjAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMTAyNAkgMHgwMDAwMDcwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV9NQVNLCSAweDAwMDAzODAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZX0RJU0FCCSAweDAwMDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzE2CSAweDAwMDAwODAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzMyCSAweDAwMDAxMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzY0CSAweDAwMDAxODAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzEyOAkgMHgwMDAwMjAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8yNTYJIDB4MDAwMDI4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfNTEyCSAweDAwMDAzMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzEwMjQJIDB4MDAwMDM4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfT05FX0RNQQkJIDB4MDAwMDQwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9XQVRFUgkJIDB4MDAwNzAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9XQVRFUl9TSElGVAkgMTYKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfV0FURVIJCSAweDAwMzgwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX1dBVEVSX1NISUZUCSAxOQorI2RlZmluZSAgRE1BX1JXQ1RSTF9VU0VfTUVNX1JFQURfTVVMVAkgMHgwMDQwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9BU1NFUlRfQUxMX0JFCSAweDAwODAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1BDSV9SRUFEX0NNRAkgMHgwZjAwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9QQ0lfUkVBRF9DTURfU0hJRlQJIDI0CisjZGVmaW5lICBETUFfUldDVFJMX1BDSV9XUklURV9DTUQJIDB4ZjAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRF9TSElGVAkgMjgKKyNkZWZpbmUgVEczUENJX1BDSVNUQVRFCQkJMHgwMDAwMDA3MAorI2RlZmluZSAgUENJU1RBVEVfRk9SQ0VfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBQQ0lTVEFURV9JTlRfTk9UX0FDVElWRQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUENJU1RBVEVfQ09OVl9QQ0lfTU9ERQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdICSAweDAwMDAwMDA4CisjZGVmaW5lICBQQ0lTVEFURV9CVVNfMzJCSVQJCSAweDAwMDAwMDEwCisjZGVmaW5lICBQQ0lTVEFURV9ST01fRU5BQkxFCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgUENJU1RBVEVfUk9NX1JFVFJZX0VOQUJMRQkgMHgwMDAwMDA0MAorI2RlZmluZSAgUENJU1RBVEVfRkxBVF9WSUVXCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgUENJU1RBVEVfUkVUUllfU0FNRV9ETUEJIDB4MDAwMDIwMDAKKyNkZWZpbmUgVEczUENJX0NMT0NLX0NUUkwJCTB4MDAwMDAwNzQKKyNkZWZpbmUgIENMT0NLX0NUUkxfQ09SRUNMS19ESVNBQkxFCSAweDAwMDAwMjAwCisjZGVmaW5lICBDTE9DS19DVFJMX1JYQ0xLX0RJU0FCTEUJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfVFhDTEtfRElTQUJMRQkgMHgwMDAwMDgwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9BTFRDTEsJCSAweDAwMDAxMDAwCisjZGVmaW5lICBDTE9DS19DVFJMX1BXUkRPV05fUExMMTMzCSAweDAwMDA4MDAwCisjZGVmaW5lICBDTE9DS19DVFJMXzQ0TUhaX0NPUkUJCSAweDAwMDQwMDAwCisjZGVmaW5lICBDTE9DS19DVFJMXzYyNV9DT1JFCQkgMHgwMDEwMDAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9GT1JDRV9DTEtSVU4JIDB4MDAyMDAwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfQ0xLUlVOX09FTkFCTEUJIDB4MDA0MDAwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfREVMQVlfUENJX0dSQU5UCSAweDgwMDAwMDAwCisjZGVmaW5lIFRHM1BDSV9SRUdfQkFTRV9BRERSCQkweDAwMDAwMDc4CisjZGVmaW5lIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUgkweDAwMDAwMDdjCisjZGVmaW5lIFRHM1BDSV9SRUdfREFUQQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgVEczUENJX01FTV9XSU5fREFUQQkJMHgwMDAwMDA4NAorI2RlZmluZSBURzNQQ0lfTU9ERV9DVFJMCQkweDAwMDAwMDg4CisjZGVmaW5lIFRHM1BDSV9NSVNDX0NGRwkJCTB4MDAwMDAwOGMKKyNkZWZpbmUgVEczUENJX01JU0NfTE9DQUxfQ1RSTAkJMHgwMDAwMDA5MAorLyogMHg5NCAtLT4gMHg5OCB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX1NURF9SSU5HX1BST0RfSURYCTB4MDAwMDAwOTggLyogNjQtYml0ICovCisjZGVmaW5lIFRHM1BDSV9SQ1ZfUkVUX1JJTkdfQ09OX0lEWAkweDAwMDAwMGEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBURzNQQ0lfU05EX1BST0RfSURYCQkweDAwMDAwMGE4IC8qIDY0LWJpdCAqLworLyogMHhiMCAtLT4gMHgxMDAgdW51c2VkICovCisKKy8qIDB4MTAwIC0tPiAweDIwMCB1bnVzZWQgKi8KKworLyogTWFpbGJveCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMAkJMHgwMDAwMDIwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMQkJMHgwMDAwMDIwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMgkJMHgwMDAwMDIxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMwkJMHgwMDAwMDIxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzAJCTB4MDAwMDAyMjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF8xCQkweDAwMDAwMjI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfMgkJMHgwMDAwMDIzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzMJCTB4MDAwMDAyMzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF80CQkweDAwMDAwMjQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfNQkJMHgwMDAwMDI0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzYJCTB4MDAwMDAyNTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF83CQkweDAwMDAwMjU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JFTE9BRF9TVEFUCQkweDAwMDAwMjYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVl9TVERfUFJPRF9JRFgJMHgwMDAwMDI2OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZfSlVNQk9fUFJPRF9JRFgJMHgwMDAwMDI3MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZfTUlOSV9QUk9EX0lEWAkweDAwMDAwMjc4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzAJMHgwMDAwMDI4MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xCTB4MDAwMDAyODggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMgkweDAwMDAwMjkwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzMJMHgwMDAwMDI5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF80CTB4MDAwMDAyYTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfNQkweDAwMDAwMmE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzYJMHgwMDAwMDJiMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF83CTB4MDAwMDAyYjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfOAkweDAwMDAwMmMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzkJMHgwMDAwMDJjOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xMAkweDAwMDAwMmQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzExCTB4MDAwMDAyZDggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTIJMHgwMDAwMDJlMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xMwkweDAwMDAwMmU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzE0CTB4MDAwMDAyZjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTUJMHgwMDAwMDJmOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAJMHgwMDAwMDMwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEJMHgwMDAwMDMwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzIJMHgwMDAwMDMxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzMJMHgwMDAwMDMxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzQJMHgwMDAwMDMyMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzUJMHgwMDAwMDMyOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzYJMHgwMDAwMDMzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzcJMHgwMDAwMDMzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzgJMHgwMDAwMDM0MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzkJMHgwMDAwMDM0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEwCTB4MDAwMDAzNTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xMQkweDAwMDAwMzU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTIJMHgwMDAwMDM2MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEzCTB4MDAwMDAzNjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xNAkweDAwMDAwMzcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTUJMHgwMDAwMDM3OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMAkweDAwMDAwMzgwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xCTB4MDAwMDAzODggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzIJMHgwMDAwMDM5MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMwkweDAwMDAwMzk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF80CTB4MDAwMDAzYTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzUJMHgwMDAwMDNhOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfNgkweDAwMDAwM2IwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF83CTB4MDAwMDAzYjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzgJMHgwMDAwMDNjMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfOQkweDAwMDAwM2M4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMAkweDAwMDAwM2QwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMQkweDAwMDAwM2Q4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMgkweDAwMDAwM2UwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMwkweDAwMDAwM2U4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xNAkweDAwMDAwM2YwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xNQkweDAwMDAwM2Y4IC8qIDY0LWJpdCAqLworCisvKiBNQUMgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUFDX01PREUJCQkweDAwMDAwNDAwCisjZGVmaW5lICBNQUNfTU9ERV9SRVNFVAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNQUNfTU9ERV9IQUxGX0RVUExFWAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLCSAweDAwMDAwMDBjCisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfVEJJCQkgMHgwMDAwMDAwYworI2RlZmluZSAgTUFDX01PREVfUE9SVF9NT0RFX0dNSUkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9NSUkJCSAweDAwMDAwMDA0CisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfTk9ORQkgMHgwMDAwMDAwMAorI2RlZmluZSAgTUFDX01PREVfUE9SVF9JTlRfTFBCQUNLCSAweDAwMDAwMDEwCisjZGVmaW5lICBNQUNfTU9ERV9UQUdHRURfTUFDX0NUUkwJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE1BQ19NT0RFX1RYX0JVUlNUSU5HCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgTUFDX01PREVfTUFYX0RFRkVSCQkgMHgwMDAwMDIwMAorI2RlZmluZSAgTUFDX01PREVfTElOS19QT0xBUklUWQkJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JYU1RBVF9FTkFCTEUJCSAweDAwMDAwODAwCisjZGVmaW5lICBNQUNfTU9ERV9SWFNUQVRfQ0xFQVIJCSAweDAwMDAxMDAwCisjZGVmaW5lICBNQUNfTU9ERV9SWFNUQVRfRkxVU0gJCSAweDAwMDAyMDAwCisjZGVmaW5lICBNQUNfTU9ERV9UWFNUQVRfRU5BQkxFCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgTUFDX01PREVfVFhTVEFUX0NMRUFSCQkgMHgwMDAwODAwMAorI2RlZmluZSAgTUFDX01PREVfVFhTVEFUX0ZMVVNICQkgMHgwMDAxMDAwMAorI2RlZmluZSAgTUFDX01PREVfU0VORF9DT05GSUdTCQkgMHgwMDAyMDAwMAorI2RlZmluZSAgTUFDX01PREVfTUFHSUNfUEtUX0VOQUJMRQkgMHgwMDA0MDAwMAorI2RlZmluZSAgTUFDX01PREVfQUNQSV9FTkFCTEUJCSAweDAwMDgwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9NSVBfRU5BQkxFCQkgMHgwMDEwMDAwMAorI2RlZmluZSAgTUFDX01PREVfVERFX0VOQUJMRQkJIDB4MDAyMDAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JERV9FTkFCTEUJCSAweDAwNDAwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9GSERFX0VOQUJMRQkJIDB4MDA4MDAwMDAKKyNkZWZpbmUgTUFDX1NUQVRVUwkJCTB4MDAwMDA0MDQKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUENTX1NZTkNFRAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1BQ19TVEFUVVNfU0lHTkFMX0RFVAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUkNWRF9DRkcJCSAweDAwMDAwMDA0CisjZGVmaW5lICBNQUNfU1RBVFVTX0NGR19DSEFOR0VECQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUE9SVF9ERUNfRVJSCSAweDAwMDAwNDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfTUlfQ09NUExFVElPTgkgMHgwMDQwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19NSV9JTlRFUlJVUFQJIDB4MDA4MDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfQVBfRVJST1IJCSAweDAxMDAwMDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX09ESV9FUlJPUgkJIDB4MDIwMDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUlhTVEFUX09WRVJSVU4JIDB4MDQwMDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfVFhTVEFUX09WRVJSVU4JIDB4MDgwMDAwMDAKKyNkZWZpbmUgTUFDX0VWRU5UCQkJMHgwMDAwMDQwOAorI2RlZmluZSAgTUFDX0VWRU5UX1BPUlRfREVDT0RFX0VSUgkgMHgwMDAwMDQwMAorI2RlZmluZSAgTUFDX0VWRU5UX0xOS1NUQVRFX0NIQU5HRUQJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9NSV9DT01QTEVUSU9OCSAweDAwNDAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfTUlfSU5URVJSVVBUCQkgMHgwMDgwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX0FQX0VSUk9SCQkgMHgwMTAwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX09ESV9FUlJPUgkJIDB4MDIwMDAwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9SWFNUQVRfT1ZFUlJVTgkgMHgwNDAwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX1RYU1RBVF9PVkVSUlVOCSAweDA4MDAwMDAwCisjZGVmaW5lIE1BQ19MRURfQ1RSTAkJCTB4MDAwMDA0MGMKKyNkZWZpbmUgIExFRF9DVFJMX0xOS0xFRF9PVkVSUklERQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTEVEX0NUUkxfMTAwME1CUFNfT04JCSAweDAwMDAwMDAyCisjZGVmaW5lICBMRURfQ1RSTF8xMDBNQlBTX09OCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgTEVEX0NUUkxfMTBNQlBTX09OCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19PVkVSUklERQkgMHgwMDAwMDAxMAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19CTElOSwkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIExFRF9DVFJMX1RSQUZGSUNfTEVECQkgMHgwMDAwMDA0MAorI2RlZmluZSAgTEVEX0NUUkxfMTAwME1CUFNfU1RBVFVTCSAweDAwMDAwMDgwCisjZGVmaW5lICBMRURfQ1RSTF8xMDBNQlBTX1NUQVRVUwkgMHgwMDAwMDEwMAorI2RlZmluZSAgTEVEX0NUUkxfMTBNQlBTX1NUQVRVUwkJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIExFRF9DVFJMX1RSQUZGSUNfU1RBVFVTCSAweDAwMDAwNDAwCisjZGVmaW5lICBMRURfQ1RSTF9NQUNfTU9ERQkJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIExFRF9DVFJMX1BIWV9NT0RFXzEJCSAweDAwMDAwODAwCisjZGVmaW5lICBMRURfQ1RSTF9QSFlfTU9ERV8yCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgTEVEX0NUUkxfQkxJTktfUkFURV9NQVNLCSAweDdmZjgwMDAwCisjZGVmaW5lICBMRURfQ1RSTF9CTElOS19SQVRFX1NISUZUCSAxOQorI2RlZmluZSAgTEVEX0NUUkxfQkxJTktfUEVSX09WRVJSSURFCSAweDAwMDgwMDAwCisjZGVmaW5lICBMRURfQ1RSTF9CTElOS19SQVRFX09WRVJSSURFCSAweDgwMDAwMDAwCisjZGVmaW5lIE1BQ19BRERSXzBfSElHSAkJCTB4MDAwMDA0MTAgLyogdXBwZXIgMiBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8wX0xPVwkJCTB4MDAwMDA0MTQgLyogbG93ZXIgNCBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8xX0hJR0gJCQkweDAwMDAwNDE4IC8qIHVwcGVyIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfMV9MT1cJCQkweDAwMDAwNDFjIC8qIGxvd2VyIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfMl9ISUdICQkJMHgwMDAwMDQyMCAvKiB1cHBlciAyIGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzJfTE9XCQkJMHgwMDAwMDQyNCAvKiBsb3dlciA0IGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzNfSElHSAkJCTB4MDAwMDA0MjggLyogdXBwZXIgMiBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8zX0xPVwkJCTB4MDAwMDA0MmMgLyogbG93ZXIgNCBieXRlcyAqLworI2RlZmluZSBNQUNfQUNQSV9NQlVGX1BUUgkJMHgwMDAwMDQzMAorI2RlZmluZSBNQUNfQUNQSV9MRU5fT0ZGU0VUCQkweDAwMDAwNDM0CisjZGVmaW5lICBBQ1BJX0xFTk9GRl9MRU5fTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgIEFDUElfTEVOT0ZGX0xFTl9TSElGVAkJIDAKKyNkZWZpbmUgIEFDUElfTEVOT0ZGX09GRl9NQVNLCQkgMHgwZmZmMDAwMAorI2RlZmluZSAgQUNQSV9MRU5PRkZfT0ZGX1NISUZUCQkgMTYKKyNkZWZpbmUgTUFDX1RYX0JBQ0tPRkZfU0VFRAkJMHgwMDAwMDQzOAorI2RlZmluZSAgVFhfQkFDS09GRl9TRUVEX01BU0sJCSAweDAwMDAwM2ZmCisjZGVmaW5lIE1BQ19SWF9NVFVfU0laRQkJCTB4MDAwMDA0M2MKKyNkZWZpbmUgIFJYX01UVV9TSVpFX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lIE1BQ19QQ1NfVEVTVAkJCTB4MDAwMDA0NDAKKyNkZWZpbmUgIFBDU19URVNUX1BBVFRFUk5fTUFTSwkJIDB4MDAwZmZmZmYKKyNkZWZpbmUgIFBDU19URVNUX1BBVFRFUk5fU0hJRlQJCSAwCisjZGVmaW5lICBQQ1NfVEVTVF9FTkFCTEUJCSAweDAwMTAwMDAwCisjZGVmaW5lIE1BQ19UWF9BVVRPX05FRwkJCTB4MDAwMDA0NDQKKyNkZWZpbmUgIFRYX0FVVE9fTkVHX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lICBUWF9BVVRPX05FR19TSElGVAkJIDAKKyNkZWZpbmUgTUFDX1JYX0FVVE9fTkVHCQkJMHgwMDAwMDQ0OAorI2RlZmluZSAgUlhfQVVUT19ORUdfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgIFJYX0FVVE9fTkVHX1NISUZUCQkgMAorI2RlZmluZSBNQUNfTUlfQ09NCQkJMHgwMDAwMDQ0YworI2RlZmluZSAgTUlfQ09NX0NNRF9NQVNLCQkgMHgwYzAwMDAwMAorI2RlZmluZSAgTUlfQ09NX0NNRF9XUklURQkJIDB4MDQwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9DTURfUkVBRAkJIDB4MDgwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9SRUFEX0ZBSUxFRAkJIDB4MTAwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9TVEFSVAkJCSAweDIwMDAwMDAwCisjZGVmaW5lICBNSV9DT01fQlVTWQkJCSAweDIwMDAwMDAwCisjZGVmaW5lICBNSV9DT01fUEhZX0FERFJfTUFTSwkJIDB4MDNlMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9QSFlfQUREUl9TSElGVAkJIDIxCisjZGVmaW5lICBNSV9DT01fUkVHX0FERFJfTUFTSwkJIDB4MDAxZjAwMDAKKyNkZWZpbmUgIE1JX0NPTV9SRUdfQUREUl9TSElGVAkJIDE2CisjZGVmaW5lICBNSV9DT01fREFUQV9NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSBNQUNfTUlfU1RBVAkJCTB4MDAwMDA0NTAKKyNkZWZpbmUgIE1BQ19NSV9TVEFUX0xOS1NUQVRfQVRUTl9FTkFCCSAweDAwMDAwMDAxCisjZGVmaW5lIE1BQ19NSV9NT0RFCQkJMHgwMDAwMDQ1NAorI2RlZmluZSAgTUFDX01JX01PREVfQ0xLXzEwTUhaCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTUFDX01JX01PREVfU0hPUlRfUFJFQU1CTEUJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIE1BQ19NSV9NT0RFX0FVVE9fUE9MTAkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE1BQ19NSV9NT0RFX0NPUkVfQ0xLXzYyTUhaCSAweDAwMDA4MDAwCisjZGVmaW5lICBNQUNfTUlfTU9ERV9CQVNFCQkgMHgwMDBjMDAwMCAvKiBYWFggbWFnaWMgdmFsdWVzIFhYWCAqLworI2RlZmluZSBNQUNfQVVUT19QT0xMX1NUQVRVUwkJMHgwMDAwMDQ1OAorI2RlZmluZSAgTUFDX0FVVE9fUE9MTF9FUlJPUgkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgTUFDX1RYX01PREUJCQkweDAwMDAwNDVjCisjZGVmaW5lICBUWF9NT0RFX1JFU0VUCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFRYX01PREVfRU5BQkxFCQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFRYX01PREVfRkxPV19DVFJMX0VOQUJMRQkgMHgwMDAwMDAxMAorI2RlZmluZSAgVFhfTU9ERV9CSUdfQkNLT0ZGX0VOQUJMRQkgMHgwMDAwMDAyMAorI2RlZmluZSAgVFhfTU9ERV9MT05HX1BBVVNFX0VOQUJMRQkgMHgwMDAwMDA0MAorI2RlZmluZSBNQUNfVFhfU1RBVFVTCQkJMHgwMDAwMDQ2MAorI2RlZmluZSAgVFhfU1RBVFVTX1hPRkZFRAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFRYX1NUQVRVU19TRU5UX1hPRkYJCSAweDAwMDAwMDAyCisjZGVmaW5lICBUWF9TVEFUVVNfU0VOVF9YT04JCSAweDAwMDAwMDA0CisjZGVmaW5lICBUWF9TVEFUVVNfTElOS19VUAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFRYX1NUQVRVU19PRElfVU5ERVJSVU4JCSAweDAwMDAwMDEwCisjZGVmaW5lICBUWF9TVEFUVVNfT0RJX09WRVJSVU4JCSAweDAwMDAwMDIwCisjZGVmaW5lIE1BQ19UWF9MRU5HVEhTCQkJMHgwMDAwMDQ2NAorI2RlZmluZSAgVFhfTEVOR1RIU19TTE9UX1RJTUVfTUFTSwkgMHgwMDAwMDBmZgorI2RlZmluZSAgVFhfTEVOR1RIU19TTE9UX1RJTUVfU0hJRlQJIDAKKyNkZWZpbmUgIFRYX0xFTkdUSFNfSVBHX01BU0sJCSAweDAwMDAwZjAwCisjZGVmaW5lICBUWF9MRU5HVEhTX0lQR19TSElGVAkJIDgKKyNkZWZpbmUgIFRYX0xFTkdUSFNfSVBHX0NSU19NQVNLCSAweDAwMDAzMDAwCisjZGVmaW5lICBUWF9MRU5HVEhTX0lQR19DUlNfU0hJRlQJIDEyCisjZGVmaW5lIE1BQ19SWF9NT0RFCQkJMHgwMDAwMDQ2OAorI2RlZmluZSAgUlhfTU9ERV9SRVNFVAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSWF9NT0RFX0VOQUJMRQkJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJYX01PREVfS0VFUF9NQUNfQ1RSTAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJYX01PREVfS0VFUF9QQVVTRQkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFJYX01PREVfQUNDRVBUX09WRVJTSVpFRAkgMHgwMDAwMDAyMAorI2RlZmluZSAgUlhfTU9ERV9BQ0NFUFRfUlVOVFMJCSAweDAwMDAwMDQwCisjZGVmaW5lICBSWF9NT0RFX0xFTl9DSEVDSwkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFJYX01PREVfUFJPTUlTQwkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFJYX01PREVfTk9fQ1JDX0NIRUNLCQkgMHgwMDAwMDIwMAorI2RlZmluZSAgUlhfTU9ERV9LRUVQX1ZMQU5fVEFHCQkgMHgwMDAwMDQwMAorI2RlZmluZSBNQUNfUlhfU1RBVFVTCQkJMHgwMDAwMDQ2YworI2RlZmluZSAgUlhfU1RBVFVTX1JFTU9URV9UWF9YT0ZGRUQJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJYX1NUQVRVU19YT0ZGX1JDVkQJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSWF9TVEFUVVNfWE9OX1JDVkQJCSAweDAwMDAwMDA0CisjZGVmaW5lIE1BQ19IQVNIX1JFR18wCQkJMHgwMDAwMDQ3MAorI2RlZmluZSBNQUNfSEFTSF9SRUdfMQkJCTB4MDAwMDA0NzQKKyNkZWZpbmUgTUFDX0hBU0hfUkVHXzIJCQkweDAwMDAwNDc4CisjZGVmaW5lIE1BQ19IQVNIX1JFR18zCQkJMHgwMDAwMDQ3YworI2RlZmluZSBNQUNfUkNWX1JVTEVfMAkJCTB4MDAwMDA0ODAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8wCQkJMHgwMDAwMDQ4NAorI2RlZmluZSBNQUNfUkNWX1JVTEVfMQkJCTB4MDAwMDA0ODgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xCQkJMHgwMDAwMDQ4YworI2RlZmluZSBNQUNfUkNWX1JVTEVfMgkJCTB4MDAwMDA0OTAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8yCQkJMHgwMDAwMDQ5NAorI2RlZmluZSBNQUNfUkNWX1JVTEVfMwkJCTB4MDAwMDA0OTgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8zCQkJMHgwMDAwMDQ5YworI2RlZmluZSBNQUNfUkNWX1JVTEVfNAkJCTB4MDAwMDA0YTAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV80CQkJMHgwMDAwMDRhNAorI2RlZmluZSBNQUNfUkNWX1JVTEVfNQkJCTB4MDAwMDA0YTgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV81CQkJMHgwMDAwMDRhYworI2RlZmluZSBNQUNfUkNWX1JVTEVfNgkJCTB4MDAwMDA0YjAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV82CQkJMHgwMDAwMDRiNAorI2RlZmluZSBNQUNfUkNWX1JVTEVfNwkJCTB4MDAwMDA0YjgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV83CQkJMHgwMDAwMDRiYworI2RlZmluZSBNQUNfUkNWX1JVTEVfOAkJCTB4MDAwMDA0YzAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV84CQkJMHgwMDAwMDRjNAorI2RlZmluZSBNQUNfUkNWX1JVTEVfOQkJCTB4MDAwMDA0YzgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV85CQkJMHgwMDAwMDRjYworI2RlZmluZSBNQUNfUkNWX1JVTEVfMTAJCQkweDAwMDAwNGQwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTAJCTB4MDAwMDA0ZDQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzExCQkJMHgwMDAwMDRkOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzExCQkweDAwMDAwNGRjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xMgkJCTB4MDAwMDA0ZTAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xMgkJMHgwMDAwMDRlNAorI2RlZmluZSBNQUNfUkNWX1JVTEVfMTMJCQkweDAwMDAwNGU4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTMJCTB4MDAwMDA0ZWMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzE0CQkJMHgwMDAwMDRmMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzE0CQkweDAwMDAwNGY0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xNQkJCTB4MDAwMDA0ZjgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xNQkJMHgwMDAwMDRmYworI2RlZmluZSAgUkNWX1JVTEVfRElTQUJMRV9NQVNLCQkgMHg3ZmZmZmZmZgorI2RlZmluZSBNQUNfUkNWX1JVTEVfQ0ZHCQkweDAwMDAwNTAwCisjZGVmaW5lICBSQ1ZfUlVMRV9DRkdfREVGQVVMVF9DTEFTUwkweDAwMDAwMDA4CisjZGVmaW5lIE1BQ19MT1dfV01BUktfTUFYX1JYX0ZSQU1FCTB4MDAwMDA1MDQKKy8qIDB4NTA4IC0tPiAweDUyMCB1bnVzZWQgKi8KKyNkZWZpbmUgTUFDX0hBU0hSRUdVXzAJCQkweDAwMDAwNTIwCisjZGVmaW5lIE1BQ19IQVNIUkVHVV8xCQkJMHgwMDAwMDUyNAorI2RlZmluZSBNQUNfSEFTSFJFR1VfMgkJCTB4MDAwMDA1MjgKKyNkZWZpbmUgTUFDX0hBU0hSRUdVXzMJCQkweDAwMDAwNTJjCisjZGVmaW5lIE1BQ19FWFRBRERSXzBfSElHSAkJMHgwMDAwMDUzMAorI2RlZmluZSBNQUNfRVhUQUREUl8wX0xPVwkJMHgwMDAwMDUzNAorI2RlZmluZSBNQUNfRVhUQUREUl8xX0hJR0gJCTB4MDAwMDA1MzgKKyNkZWZpbmUgTUFDX0VYVEFERFJfMV9MT1cJCTB4MDAwMDA1M2MKKyNkZWZpbmUgTUFDX0VYVEFERFJfMl9ISUdICQkweDAwMDAwNTQwCisjZGVmaW5lIE1BQ19FWFRBRERSXzJfTE9XCQkweDAwMDAwNTQ0CisjZGVmaW5lIE1BQ19FWFRBRERSXzNfSElHSAkJMHgwMDAwMDU0OAorI2RlZmluZSBNQUNfRVhUQUREUl8zX0xPVwkJMHgwMDAwMDU0YworI2RlZmluZSBNQUNfRVhUQUREUl80X0hJR0gJCTB4MDAwMDA1NTAKKyNkZWZpbmUgTUFDX0VYVEFERFJfNF9MT1cJCTB4MDAwMDA1NTQKKyNkZWZpbmUgTUFDX0VYVEFERFJfNV9ISUdICQkweDAwMDAwNTU4CisjZGVmaW5lIE1BQ19FWFRBRERSXzVfTE9XCQkweDAwMDAwNTVjCisjZGVmaW5lIE1BQ19FWFRBRERSXzZfSElHSAkJMHgwMDAwMDU2MAorI2RlZmluZSBNQUNfRVhUQUREUl82X0xPVwkJMHgwMDAwMDU2NAorI2RlZmluZSBNQUNfRVhUQUREUl83X0hJR0gJCTB4MDAwMDA1NjgKKyNkZWZpbmUgTUFDX0VYVEFERFJfN19MT1cJCTB4MDAwMDA1NmMKKyNkZWZpbmUgTUFDX0VYVEFERFJfOF9ISUdICQkweDAwMDAwNTcwCisjZGVmaW5lIE1BQ19FWFRBRERSXzhfTE9XCQkweDAwMDAwNTc0CisjZGVmaW5lIE1BQ19FWFRBRERSXzlfSElHSAkJMHgwMDAwMDU3OAorI2RlZmluZSBNQUNfRVhUQUREUl85X0xPVwkJMHgwMDAwMDU3YworI2RlZmluZSBNQUNfRVhUQUREUl8xMF9ISUdICQkweDAwMDAwNTgwCisjZGVmaW5lIE1BQ19FWFRBRERSXzEwX0xPVwkJMHgwMDAwMDU4NAorI2RlZmluZSBNQUNfRVhUQUREUl8xMV9ISUdICQkweDAwMDAwNTg4CisjZGVmaW5lIE1BQ19FWFRBRERSXzExX0xPVwkJMHgwMDAwMDU4YworI2RlZmluZSBNQUNfU0VSREVTX0NGRwkJCTB4MDAwMDA1OTAKKyNkZWZpbmUgTUFDX1NFUkRFU19TVEFUCQkJMHgwMDAwMDU5NAorLyogMHg1OTggLS0+IDB4NjAwIHVudXNlZCAqLworI2RlZmluZSBNQUNfVFhfTUFDX1NUQVRFX0JBU0UJCTB4MDAwMDA2MDAgLyogMTYgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX1JYX01BQ19TVEFURV9CQVNFCQkweDAwMDAwNjEwIC8qIDIwIGJ5dGVzICovCisvKiAweDYyNCAtLT4gMHg4MDAgdW51c2VkICovCisjZGVmaW5lIE1BQ19UWF9TVEFUU19PQ1RFVFMJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1YxCQkweDAwMDAwODA0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19DT0xMSVNJT05TCQkweDAwMDAwODA4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19YT05fU0VOVAkJMHgwMDAwMDgwYworI2RlZmluZSBNQUNfVFhfU1RBVFNfWE9GRl9TRU5UCQkweDAwMDAwODEwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWMgkJMHgwMDAwMDgxNAorI2RlZmluZSBNQUNfVFhfU1RBVFNfTUFDX0VSUk9SUwkJMHgwMDAwMDgxOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfU0lOR0xFX0NPTExJU0lPTlMJMHgwMDAwMDgxYworI2RlZmluZSBNQUNfVFhfU1RBVFNfTVVMVF9DT0xMSVNJT05TCTB4MDAwMDA4MjAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0RFRkVSUkVECQkweDAwMDAwODI0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWMwkJMHgwMDAwMDgyOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfRVhDRVNTSVZFX0NPTAkweDAwMDAwODJjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19MQVRFX0NPTAkJMHgwMDAwMDgzMAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMQkJMHgwMDAwMDgzNAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMgkJMHgwMDAwMDgzOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMwkJMHgwMDAwMDgzYworI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNAkJMHgwMDAwMDg0MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNQkJMHgwMDAwMDg0NAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNgkJMHgwMDAwMDg0OAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNwkJMHgwMDAwMDg0YworI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfOAkJMHgwMDAwMDg1MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfOQkJMHgwMDAwMDg1NAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTAJCTB4MDAwMDA4NTgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzExCQkweDAwMDAwODVjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xMgkJMHgwMDAwMDg2MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTMJCTB4MDAwMDA4NjQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzE0CQkweDAwMDAwODY4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19VQ0FTVAkJMHgwMDAwMDg2YworI2RlZmluZSBNQUNfVFhfU1RBVFNfTUNBU1QJCTB4MDAwMDA4NzAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0JDQVNUCQkweDAwMDAwODc0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNV8xCQkweDAwMDAwODc4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNV8yCQkweDAwMDAwODdjCisjZGVmaW5lIE1BQ19SWF9TVEFUU19PQ1RFVFMJCTB4MDAwMDA4ODAKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1JFU1YxCQkweDAwMDAwODg0CisjZGVmaW5lIE1BQ19SWF9TVEFUU19GUkFHTUVOVFMJCTB4MDAwMDA4ODgKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1VDQVNUCQkweDAwMDAwODhjCisjZGVmaW5lIE1BQ19SWF9TVEFUU19NQ0FTVAkJMHgwMDAwMDg5MAorI2RlZmluZSBNQUNfUlhfU1RBVFNfQkNBU1QJCTB4MDAwMDA4OTQKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0ZDU19FUlJPUlMJCTB4MDAwMDA4OTgKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0FMSUdOX0VSUk9SUwkweDAwMDAwODljCisjZGVmaW5lIE1BQ19SWF9TVEFUU19YT05fUEFVU0VfUkVDVkQJMHgwMDAwMDhhMAorI2RlZmluZSBNQUNfUlhfU1RBVFNfWE9GRl9QQVVTRV9SRUNWRAkweDAwMDAwOGE0CisjZGVmaW5lIE1BQ19SWF9TVEFUU19NQUNfQ1RSTF9SRUNWRAkweDAwMDAwOGE4CisjZGVmaW5lIE1BQ19SWF9TVEFUU19YT0ZGX0VOVEVSRUQJMHgwMDAwMDhhYworI2RlZmluZSBNQUNfUlhfU1RBVFNfRlJBTUVfVE9PX0xPTkcJMHgwMDAwMDhiMAorI2RlZmluZSBNQUNfUlhfU1RBVFNfSkFCQkVSUwkJMHgwMDAwMDhiNAorI2RlZmluZSBNQUNfUlhfU1RBVFNfVU5ERVJTSVpFCQkweDAwMDAwOGI4CisvKiAweDhiYyAtLT4gMHhjMDAgdW51c2VkICovCisKKy8qIFNlbmQgZGF0YSBpbml0aWF0b3IgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU05EREFUQUlfTU9ERQkJCTB4MDAwMDBjMDAKKyNkZWZpbmUgIFNORERBVEFJX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkREQVRBSV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNORERBVEFJX01PREVfU1RBVF9PRkxPV19FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lIFNORERBVEFJX1NUQVRVUwkJCTB4MDAwMDBjMDQKKyNkZWZpbmUgIFNORERBVEFJX1NUQVRVU19TVEFUX09GTE9XCSAweDAwMDAwMDA0CisjZGVmaW5lIFNORERBVEFJX1NUQVRTQ1RSTAkJMHgwMDAwMGMwOAorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRU5BQkxFCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRkFTVFVQRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNORERBVEFJX1NDVFJMX0NMRUFSCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRkxVU0gJCSAweDAwMDAwMDA4CisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9GT1JDRV9aRVJPCSAweDAwMDAwMDEwCisjZGVmaW5lIFNORERBVEFJX1NUQVRTRU5BQgkJMHgwMDAwMGMwYworI2RlZmluZSBTTkREQVRBSV9TVEFUU0lOQ01BU0sJCTB4MDAwMDBjMTAKKy8qIDB4YzE0IC0tPiAweGM4MCB1bnVzZWQgKi8KKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8wCQkweDAwMDAwYzgwCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMQkJMHgwMDAwMGM4NAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzIJCTB4MDAwMDBjODgKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8zCQkweDAwMDAwYzhjCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfNAkJMHgwMDAwMGM5MAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzUJCTB4MDAwMDBjOTQKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF82CQkweDAwMDAwYzk4CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfNwkJMHgwMDAwMGM5YworI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzgJCTB4MDAwMDBjYTAKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF85CQkweDAwMDAwY2E0CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTAJCTB4MDAwMDBjYTgKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xMQkJMHgwMDAwMGNhYworI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzEyCQkweDAwMDAwY2IwCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTMJCTB4MDAwMDBjYjQKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xNAkJMHgwMDAwMGNiOAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzE1CQkweDAwMDAwY2JjCisjZGVmaW5lIFNORERBVEFJX0RNQV9SRFFfRlVMTF9DTlQJMHgwMDAwMGNjMAorI2RlZmluZSBTTkREQVRBSV9ETUFfUFJJT19SRFFfRlVMTF9DTlQJMHgwMDAwMGNjNAorI2RlZmluZSBTTkREQVRBSV9TRENRX0ZVTExfQ05UCQkweDAwMDAwY2M4CisjZGVmaW5lIFNORERBVEFJX05JQ1JOR19TU05EX1BJRFhfQ05UCTB4MDAwMDBjY2MKKyNkZWZpbmUgU05EREFUQUlfU1RBVFNfVVBEQVRFRF9DTlQJMHgwMDAwMGNkMAorI2RlZmluZSBTTkREQVRBSV9JTlRFUlJVUFRTX0NOVAkJMHgwMDAwMGNkNAorI2RlZmluZSBTTkREQVRBSV9BVk9JRF9JTlRFUlJVUFRTX0NOVAkweDAwMDAwY2Q4CisjZGVmaW5lIFNORERBVEFJX1NORF9USFJFU0hfSElUX0NOVAkweDAwMDAwY2RjCisvKiAweGNlMCAtLT4gMHgxMDAwIHVudXNlZCAqLworCisvKiBTZW5kIGRhdGEgY29tcGxldGlvbiBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkREQVRBQ19NT0RFCQkJMHgwMDAwMTAwMAorI2RlZmluZSAgU05EREFUQUNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNORERBVEFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorLyogMHgxMDA0IC0tPiAweDE0MDAgdW51c2VkICovCisKKy8qIFNlbmQgQkQgcmluZyBzZWxlY3RvciAqLworI2RlZmluZSBTTkRCRFNfTU9ERQkJCTB4MDAwMDE0MDAKKyNkZWZpbmUgIFNOREJEU19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EQkRTX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EQkRTX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EQkRTX1NUQVRVUwkJCTB4MDAwMDE0MDQKKyNkZWZpbmUgIFNOREJEU19TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRFNfSFdESUFHCQkJMHgwMDAwMTQwOAorLyogMHgxNDBjIC0tPiAweDE0NDAgKi8KKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzAJCTB4MDAwMDE0NDAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEJCTB4MDAwMDE0NDQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzIJCTB4MDAwMDE0NDgKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzMJCTB4MDAwMDE0NGMKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzQJCTB4MDAwMDE0NTAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzUJCTB4MDAwMDE0NTQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzYJCTB4MDAwMDE0NTgKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzcJCTB4MDAwMDE0NWMKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzgJCTB4MDAwMDE0NjAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzkJCTB4MDAwMDE0NjQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEwCQkweDAwMDAxNDY4CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xMQkJMHgwMDAwMTQ2YworI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTIJCTB4MDAwMDE0NzAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEzCQkweDAwMDAxNDc0CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xNAkJMHgwMDAwMTQ3OAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTUJCTB4MDAwMDE0N2MKKy8qIDB4MTQ4MCAtLT4gMHgxODAwIHVudXNlZCAqLworCisvKiBTZW5kIEJEIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkRCRElfTU9ERQkJCTB4MDAwMDE4MDAKKyNkZWZpbmUgIFNOREJESV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EQkRJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EQkRJX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EQkRJX1NUQVRVUwkJCTB4MDAwMDE4MDQKKyNkZWZpbmUgIFNOREJESV9TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMAkJMHgwMDAwMTgwOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMQkJMHgwMDAwMTgwYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMgkJMHgwMDAwMTgxMAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMwkJMHgwMDAwMTgxNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNAkJMHgwMDAwMTgxOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNQkJMHgwMDAwMTgxYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNgkJMHgwMDAwMTgyMAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNwkJMHgwMDAwMTgyNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfOAkJMHgwMDAwMTgyOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfOQkJMHgwMDAwMTgyYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTAJCTB4MDAwMDE4MzAKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzExCQkweDAwMDAxODM0CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xMgkJMHgwMDAwMTgzOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTMJCTB4MDAwMDE4M2MKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzE0CQkweDAwMDAxODQwCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xNQkJMHgwMDAwMTg0NAorLyogMHgxODQ4IC0tPiAweDFjMDAgdW51c2VkICovCisKKy8qIFNlbmQgQkQgY29tcGxldGlvbiBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkRCRENfTU9ERQkJCTB4MDAwMDFjMDAKKyNkZWZpbmUgU05EQkRDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lIFNOREJEQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgU05EQkRDX01PREVfQVRUTl9FTkFCTEUJCSAweDAwMDAwMDA0CisvKiAweDFjMDQgLS0+IDB4MjAwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBsaXN0IHBsYWNlbWVudCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZMUENfTU9ERQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgIFJDVkxQQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWTFBDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWTFBDX01PREVfQ0xBU1MwX0FUVE5fRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWTFBDX01PREVfTUFQT09SX0FBVFROX0VOQUIJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkxQQ19NT0RFX1NUQVRfT0ZMT1dfRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSBSQ1ZMUENfU1RBVFVTCQkJMHgwMDAwMjAwNAorI2RlZmluZSAgUkNWTFBDX1NUQVRVU19DTEFTUzAJCSAweDAwMDAwMDA0CisjZGVmaW5lICBSQ1ZMUENfU1RBVFVTX01BUE9PUgkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkxQQ19TVEFUVVNfU1RBVF9PRkxPVwkgMHgwMDAwMDAxMAorI2RlZmluZSBSQ1ZMUENfTE9DSwkJCTB4MDAwMDIwMDgKKyNkZWZpbmUgIFJDVkxQQ19MT0NLX1JFUV9NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgUkNWTFBDX0xPQ0tfUkVRX1NISUZUCQkgMAorI2RlZmluZSAgUkNWTFBDX0xPQ0tfR1JBTlRfTUFTSwkJIDB4ZmZmZjAwMDAKKyNkZWZpbmUgIFJDVkxQQ19MT0NLX0dSQU5UX1NISUZUCSAxNgorI2RlZmluZSBSQ1ZMUENfTk9OX0VNUFRZX0JJVFMJCTB4MDAwMDIwMGMKKyNkZWZpbmUgIFJDVkxQQ19OT05fRU1QVFlfQklUU19NQVNLCSAweDAwMDBmZmZmCisjZGVmaW5lIFJDVkxQQ19DT05GSUcJCQkweDAwMDAyMDEwCisjZGVmaW5lIFJDVkxQQ19TVEFUU0NUUkwJCTB4MDAwMDIwMTQKKyNkZWZpbmUgIFJDVkxQQ19TVEFUU0NUUkxfRU5BQkxFCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZMUENfU1RBVFNDVFJMX0ZBU1RVUEQJIDB4MDAwMDAwMDIKKyNkZWZpbmUgUkNWTFBDX1NUQVRTX0VOQUJMRQkJMHgwMDAwMjAxOAorI2RlZmluZSAgUkNWTFBDX1NUQVRTRU5BQl9MTkdCUlNUX1JGSVgJIDB4MDA0MDAwMDAKKyNkZWZpbmUgUkNWTFBDX1NUQVRTX0lOQ01BU0sJCTB4MDAwMDIwMWMKKy8qIDB4MjAyMCAtLT4gMHgyMTAwIHVudXNlZCAqLworI2RlZmluZSBSQ1ZMUENfU0VMTFNUX0JBU0UJCTB4MDAwMDIxMDAgLyogMTYgMTYtYnl0ZSBlbnRyaWVzICovCisjZGVmaW5lICBTRUxMU1RfVEFJTAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgIFNFTExTVF9DT05UCQkJMHgwMDAwMDAwOAorI2RlZmluZSAgU0VMTFNUX1VOVVNFRAkJCTB4MDAwMDAwMGMKKyNkZWZpbmUgUkNWTFBDX0NPU19DTlRMX0JBU0UJCTB4MDAwMDIyMDAgLyogMTYgNC1ieXRlIGVudHJpZXMgKi8KKyNkZWZpbmUgUkNWTFBDX0RST1BfRklMVEVSX0NOVAkJMHgwMDAwMjI0MAorI2RlZmluZSBSQ1ZMUENfRE1BX1dRX0ZVTExfQ05UCQkweDAwMDAyMjQ0CisjZGVmaW5lIFJDVkxQQ19ETUFfSElQUklPX1dRX0ZVTExfQ05UCTB4MDAwMDIyNDgKKyNkZWZpbmUgUkNWTFBDX05PX1JDVl9CRF9DTlQJCTB4MDAwMDIyNGMKKyNkZWZpbmUgUkNWTFBDX0lOX0RJU0NBUkRTX0NOVAkJMHgwMDAwMjI1MAorI2RlZmluZSBSQ1ZMUENfSU5fRVJST1JTX0NOVAkJMHgwMDAwMjI1NAorI2RlZmluZSBSQ1ZMUENfUkNWX1RIUkVTSF9ISVRfQ05UCTB4MDAwMDIyNTgKKy8qIDB4MjI1YyAtLT4gMHgyNDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgSW5pdGlhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgUkNWREJESV9NT0RFCQkJMHgwMDAwMjQwMAorI2RlZmluZSAgUkNWREJESV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWREJESV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkRCRElfTU9ERV9KVU1CT0JEX05FRURFRAkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWREJESV9NT0RFX0ZSTV9UT09fQklHCSAweDAwMDAwMDA4CisjZGVmaW5lICBSQ1ZEQkRJX01PREVfSU5WX1JJTkdfU1oJIDB4MDAwMDAwMTAKKyNkZWZpbmUgUkNWREJESV9TVEFUVVMJCQkweDAwMDAyNDA0CisjZGVmaW5lICBSQ1ZEQkRJX1NUQVRVU19KVU1CT0JEX05FRURFRAkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWREJESV9TVEFUVVNfRlJNX1RPT19CSUcJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkRCRElfU1RBVFVTX0lOVl9SSU5HX1NaCSAweDAwMDAwMDEwCisjZGVmaW5lIFJDVkRCRElfU1BMSVRfRlJBTUVfTUlOU1oJMHgwMDAwMjQwOAorLyogMHgyNDBjIC0tPiAweDI0NDAgdW51c2VkICovCisjZGVmaW5lIFJDVkRCRElfSlVNQk9fQkQJCTB4MDAwMDI0NDAgLyogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgUkNWREJESV9TVERfQkQJCQkweDAwMDAyNDUwIC8qIFRHM19CRElORk9fLi4uICovCisjZGVmaW5lIFJDVkRCRElfTUlOSV9CRAkJCTB4MDAwMDI0NjAgLyogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgUkNWREJESV9KVU1CT19DT05fSURYCQkweDAwMDAyNDcwCisjZGVmaW5lIFJDVkRCRElfU1REX0NPTl9JRFgJCTB4MDAwMDI0NzQKKyNkZWZpbmUgUkNWREJESV9NSU5JX0NPTl9JRFgJCTB4MDAwMDI0NzgKKy8qIDB4MjQ3YyAtLT4gMHgyNDgwIHVudXNlZCAqLworI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzAJCTB4MDAwMDI0ODAKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xCQkweDAwMDAyNDg0CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMgkJMHgwMDAwMjQ4OAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzMJCTB4MDAwMDI0OGMKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF80CQkweDAwMDAyNDkwCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfNQkJMHgwMDAwMjQ5NAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzYJCTB4MDAwMDI0OTgKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF83CQkweDAwMDAyNDljCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfOAkJMHgwMDAwMjRhMAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzkJCTB4MDAwMDI0YTQKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xMAkJMHgwMDAwMjRhOAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzExCQkweDAwMDAyNGFjCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTIJCTB4MDAwMDI0YjAKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xMwkJMHgwMDAwMjRiNAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzE0CQkweDAwMDAyNGI4CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTUJCTB4MDAwMDI0YmMKKyNkZWZpbmUgUkNWREJESV9IV0RJQUcJCQkweDAwMDAyNGMwCisvKiAweDI0YzQgLS0+IDB4MjgwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBEYXRhIENvbXBsZXRpb24gQ29udHJvbCAqLworI2RlZmluZSBSQ1ZEQ0NfTU9ERQkJCTB4MDAwMDI4MDAKKyNkZWZpbmUgIFJDVkRDQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWRENDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWRENDX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKy8qIDB4MjgwNCAtLT4gMHgyYzAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZCRElfTU9ERQkJCTB4MDAwMDJjMDAKKyNkZWZpbmUgIFJDVkJESV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWQkRJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWQkRJX01PREVfUkNCX0FUVE5fRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSBSQ1ZCRElfU1RBVFVTCQkJMHgwMDAwMmMwNAorI2RlZmluZSAgUkNWQkRJX1NUQVRVU19SQ0JfQVRUTgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWQkRJX0pVTUJPX1BST0RfSURYCQkweDAwMDAyYzA4CisjZGVmaW5lIFJDVkJESV9TVERfUFJPRF9JRFgJCTB4MDAwMDJjMGMKKyNkZWZpbmUgUkNWQkRJX01JTklfUFJPRF9JRFgJCTB4MDAwMDJjMTAKKyNkZWZpbmUgUkNWQkRJX01JTklfVEhSRVNICQkweDAwMDAyYzE0CisjZGVmaW5lIFJDVkJESV9TVERfVEhSRVNICQkweDAwMDAyYzE4CisjZGVmaW5lIFJDVkJESV9KVU1CT19USFJFU0gJCTB4MDAwMDJjMWMKKy8qIDB4MmMyMCAtLT4gMHgzMDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIEJEIENvbXBsZXRpb24gQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkNWQ0NfTU9ERQkJCTB4MDAwMDMwMDAKKyNkZWZpbmUgIFJDVkNDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZDQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkNDX01PREVfQVRUTl9FTkFCTEUJCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkNDX1NUQVRVUwkJCTB4MDAwMDMwMDQKKyNkZWZpbmUgIFJDVkNDX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkNDX0pVTVBfUFJPRF9JRFgJCTB4MDAwMDMwMDgKKyNkZWZpbmUgUkNWQ0NfU1REX1BST0RfSURYCQkweDAwMDAzMDBjCisjZGVmaW5lIFJDVkNDX01JTklfUFJPRF9JRFgJCTB4MDAwMDMwMTAKKy8qIDB4MzAxNCAtLT4gMHgzNDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIGxpc3Qgc2VsZWN0b3IgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkNWTFNDX01PREUJCQkweDAwMDAzNDAwCisjZGVmaW5lICBSQ1ZMU0NfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkxTQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkxTQ19NT0RFX0FUVE5fRU5BQkxFCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkxTQ19TVEFUVVMJCQkweDAwMDAzNDA0CisjZGVmaW5lICBSQ1ZMU0NfU1RBVFVTX0VSUk9SX0FUVE4JIDB4MDAwMDAwMDQKKy8qIDB4MzQwOCAtLT4gMHgzODAwIHVudXNlZCAqLworCisvKiBNYnVmIGNsdXN0ZXIgZnJlZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUJGUkVFX01PREUJCQkweDAwMDAzODAwCisjZGVmaW5lICBNQkZSRUVfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1CRlJFRV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgTUJGUkVFX1NUQVRVUwkJCTB4MDAwMDM4MDQKKy8qIDB4MzgwOCAtLT4gMHgzYzAwIHVudXNlZCAqLworCisvKiBIb3N0IGNvYWxlc2NpbmcgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSE9TVENDX01PREUJCQkweDAwMDAzYzAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0FUVE4JCSAweDAwMDAwMDA0CisjZGVmaW5lICBIT1NUQ0NfTU9ERV9OT1cJCSAweDAwMDAwMDA4CisjZGVmaW5lICBIT1NUQ0NfTU9ERV9GVUxMX1NUQVRVUwkgMHgwMDAwMDAwMAorI2RlZmluZSAgSE9TVENDX01PREVfNjRCWVRFCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgSE9TVENDX01PREVfMzJCWVRFCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgSE9TVENDX01PREVfQ0xSVElDS19SWEJECSAweDAwMDAwMjAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9DTFJUSUNLX1RYQkQJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX05PSU5UX09OX05PVwkgMHgwMDAwMDgwMAorI2RlZmluZSAgSE9TVENDX01PREVfTk9JTlRfT05fRk9SQ0UJIDB4MDAwMDEwMDAKKyNkZWZpbmUgSE9TVENDX1NUQVRVUwkJCTB4MDAwMDNjMDQKKyNkZWZpbmUgIEhPU1RDQ19TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBIT1NUQ0NfUlhDT0xfVElDS1MJCTB4MDAwMDNjMDgKKyNkZWZpbmUgIExPV19SWENPTF9USUNLUwkJIDB4MDAwMDAwMzIKKyNkZWZpbmUgIERFRkFVTFRfUlhDT0xfVElDS1MJCSAweDAwMDAwMDQ4CisjZGVmaW5lICBISUdIX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDA5NgorI2RlZmluZSBIT1NUQ0NfVFhDT0xfVElDS1MJCTB4MDAwMDNjMGMKKyNkZWZpbmUgIExPV19UWENPTF9USUNLUwkJIDB4MDAwMDAwOTYKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0xfVElDS1MJCSAweDAwMDAwMTJjCisjZGVmaW5lICBISUdIX1RYQ09MX1RJQ0tTCQkgMHgwMDAwMDE0NQorI2RlZmluZSBIT1NUQ0NfUlhNQVhfRlJBTUVTCQkweDAwMDAzYzEwCisjZGVmaW5lICBMT1dfUlhNQVhfRlJBTUVTCQkgMHgwMDAwMDAwNQorI2RlZmluZSAgREVGQVVMVF9SWE1BWF9GUkFNRVMJCSAweDAwMDAwMDA4CisjZGVmaW5lICBISUdIX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMTIKKyNkZWZpbmUgSE9TVENDX1RYTUFYX0ZSQU1FUwkJMHgwMDAwM2MxNAorI2RlZmluZSAgTE9XX1RYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMzUKKyNkZWZpbmUgIERFRkFVTFRfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDA0YgorI2RlZmluZSAgSElHSF9UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDUyCisjZGVmaW5lIEhPU1RDQ19SWENPQUxfVElDS19JTlQJCTB4MDAwMDNjMTgKKyNkZWZpbmUgIERFRkFVTFRfUlhDT0FMX1RJQ0tfSU5UCSAweDAwMDAwMDE5CisjZGVmaW5lIEhPU1RDQ19UWENPQUxfVElDS19JTlQJCTB4MDAwMDNjMWMKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0FMX1RJQ0tfSU5UCSAweDAwMDAwMDE5CisjZGVmaW5lIEhPU1RDQ19SWENPQUxfTUFYRl9JTlQJCTB4MDAwMDNjMjAKKyNkZWZpbmUgIERFRkFVTFRfUlhDT0FMX01BWEZfSU5UCSAweDAwMDAwMDA1CisjZGVmaW5lIEhPU1RDQ19UWENPQUxfTUFYRl9JTlQJCTB4MDAwMDNjMjQKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0FMX01BWEZfSU5UCSAweDAwMDAwMDA1CisjZGVmaW5lIEhPU1RDQ19TVEFUX0NPQUxfVElDS1MJCTB4MDAwMDNjMjgKKyNkZWZpbmUgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTCSAweDAwMGY0MjQwCisvKiAweDNjMmMgLS0+IDB4M2MzMCB1bnVzZWQgKi8KKyNkZWZpbmUgSE9TVENDX1NUQVRTX0JMS19IT1NUX0FERFIJMHgwMDAwM2MzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSCTB4MDAwMDNjMzggLyogNjQtYml0ICovCisjZGVmaW5lIEhPU1RDQ19TVEFUU19CTEtfTklDX0FERFIJMHgwMDAwM2M0MAorI2RlZmluZSBIT1NUQ0NfU1RBVFVTX0JMS19OSUNfQUREUgkweDAwMDAzYzQ0CisjZGVmaW5lIEhPU1RDQ19GTE9XX0FUVE4JCTB4MDAwMDNjNDgKKy8qIDB4M2M0YyAtLT4gMHgzYzUwIHVudXNlZCAqLworI2RlZmluZSBIT1NUQ0NfSlVNQk9fQ09OX0lEWAkJMHgwMDAwM2M1MAorI2RlZmluZSBIT1NUQ0NfU1REX0NPTl9JRFgJCTB4MDAwMDNjNTQKKyNkZWZpbmUgSE9TVENDX01JTklfQ09OX0lEWAkJMHgwMDAwM2M1OAorLyogMHgzYzVjIC0tPiAweDNjODAgdW51c2VkICovCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMAkJMHgwMDAwM2M4MAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEJCTB4MDAwMDNjODQKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8yCQkweDAwMDAzYzg4CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMwkJMHgwMDAwM2M4YworI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzQJCTB4MDAwMDNjOTAKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF81CQkweDAwMDAzYzk0CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfNgkJMHgwMDAwM2M5OAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzcJCTB4MDAwMDNjOWMKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF84CQkweDAwMDAzY2EwCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfOQkJMHgwMDAwM2NhNAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEwCQkweDAwMDAzY2E4CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTEJCTB4MDAwMDNjYWMKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xMgkJMHgwMDAwM2NiMAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEzCQkweDAwMDAzY2I0CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTQJCTB4MDAwMDNjYjgKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xNQkJMHgwMDAwM2NiYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMAkJMHgwMDAwM2NjMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMQkJMHgwMDAwM2NjNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMgkJMHgwMDAwM2NjOAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMwkJMHgwMDAwM2NjYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNAkJMHgwMDAwM2NkMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNQkJMHgwMDAwM2NkNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNgkJMHgwMDAwM2NkOAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNwkJMHgwMDAwM2NkYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfOAkJMHgwMDAwM2NlMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfOQkJMHgwMDAwM2NlNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTAJCTB4MDAwMDNjZTgKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzExCQkweDAwMDAzY2VjCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xMgkJMHgwMDAwM2NmMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTMJCTB4MDAwMDNjZjQKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzE0CQkweDAwMDAzY2Y4CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xNQkJMHgwMDAwM2NmYworLyogMHgzZDAwIC0tPiAweDQwMDAgdW51c2VkICovCisKKy8qIE1lbW9yeSBhcmJpdGVyIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1FTUFSQl9NT0RFCQkJMHgwMDAwNDAwMAorI2RlZmluZSAgTUVNQVJCX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNRU1BUkJfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIE1FTUFSQl9TVEFUVVMJCQkweDAwMDA0MDA0CisjZGVmaW5lIE1FTUFSQl9UUkFQX0FERFJfTE9XCQkweDAwMDA0MDA4CisjZGVmaW5lIE1FTUFSQl9UUkFQX0FERFJfSElHSAkJMHgwMDAwNDAwYworLyogMHg0MDEwIC0tPiAweDQ0MDAgdW51c2VkICovCisKKy8qIEJ1ZmZlciBtYW5hZ2VyIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJVRk1HUl9NT0RFCQkJMHgwMDAwNDQwMAorI2RlZmluZSAgQlVGTUdSX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBCVUZNR1JfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBCVUZNR1JfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSAgQlVGTUdSX01PREVfQk1fVEVTVAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIEJVRk1HUl9NT0RFX01CTE9XX0FUVE5fRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSBCVUZNR1JfU1RBVFVTCQkJMHgwMDAwNDQwNAorI2RlZmluZSAgQlVGTUdSX1NUQVRVU19FUlJPUgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIEJVRk1HUl9TVEFUVVNfTUJMT1cJCSAweDAwMDAwMDEwCisjZGVmaW5lIEJVRk1HUl9NQl9QT09MX0FERFIJCTB4MDAwMDQ0MDgKKyNkZWZpbmUgQlVGTUdSX01CX1BPT0xfU0laRQkJMHgwMDAwNDQwYworI2RlZmluZSBCVUZNR1JfTUJfUkRNQV9MT1dfV0FURVIJMHgwMDAwNDQxMAorI2RlZmluZSAgREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUgkgMHgwMDAwMDA1MAorI2RlZmluZSAgREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUl81NzA1CSAweDAwMDAwMDAwCisjZGVmaW5lICBERUZBVUxUX01CX1JETUFfTE9XX1dBVEVSX0pVTUJPIDB4MDAwMDAxMzAKKyNkZWZpbmUgQlVGTUdSX01CX01BQ1JYX0xPV19XQVRFUgkweDAwMDA0NDE0CisjZGVmaW5lICBERUZBVUxUX01CX01BQ1JYX0xPV19XQVRFUgkgIDB4MDAwMDAwMjAKKyNkZWZpbmUgIERFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSXzU3MDUgIDB4MDAwMDAwMTAKKyNkZWZpbmUgIERFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSX0pVTUJPIDB4MDAwMDAwOTgKKyNkZWZpbmUgQlVGTUdSX01CX0hJR0hfV0FURVIJCTB4MDAwMDQ0MTgKKyNkZWZpbmUgIERFRkFVTFRfTUJfSElHSF9XQVRFUgkJIDB4MDAwMDAwNjAKKyNkZWZpbmUgIERFRkFVTFRfTUJfSElHSF9XQVRFUl81NzA1CSAweDAwMDAwMDYwCisjZGVmaW5lICBERUZBVUxUX01CX0hJR0hfV0FURVJfSlVNQk8JIDB4MDAwMDAxN2MKKyNkZWZpbmUgQlVGTUdSX1JYX01CX0FMTE9DX1JFUQkJMHgwMDAwNDQxYworI2RlZmluZSAgQlVGTUdSX01CX0FMTE9DX0JJVAkJIDB4MTAwMDAwMDAKKyNkZWZpbmUgQlVGTUdSX1JYX01CX0FMTE9DX1JFU1AJCTB4MDAwMDQ0MjAKKyNkZWZpbmUgQlVGTUdSX1RYX01CX0FMTE9DX1JFUQkJMHgwMDAwNDQyNAorI2RlZmluZSBCVUZNR1JfVFhfTUJfQUxMT0NfUkVTUAkJMHgwMDAwNDQyOAorI2RlZmluZSBCVUZNR1JfRE1BX0RFU0NfUE9PTF9BRERSCTB4MDAwMDQ0MmMKKyNkZWZpbmUgQlVGTUdSX0RNQV9ERVNDX1BPT0xfU0laRQkweDAwMDA0NDMwCisjZGVmaW5lIEJVRk1HUl9ETUFfTE9XX1dBVEVSCQkweDAwMDA0NDM0CisjZGVmaW5lICBERUZBVUxUX0RNQV9MT1dfV0FURVIJCSAweDAwMDAwMDA1CisjZGVmaW5lIEJVRk1HUl9ETUFfSElHSF9XQVRFUgkJMHgwMDAwNDQzOAorI2RlZmluZSAgREVGQVVMVF9ETUFfSElHSF9XQVRFUgkJIDB4MDAwMDAwMGEKKyNkZWZpbmUgQlVGTUdSX1JYX0RNQV9BTExPQ19SRVEJCTB4MDAwMDQ0M2MKKyNkZWZpbmUgQlVGTUdSX1JYX0RNQV9BTExPQ19SRVNQCTB4MDAwMDQ0NDAKKyNkZWZpbmUgQlVGTUdSX1RYX0RNQV9BTExPQ19SRVEJCTB4MDAwMDQ0NDQKKyNkZWZpbmUgQlVGTUdSX1RYX0RNQV9BTExPQ19SRVNQCTB4MDAwMDQ0NDgKKyNkZWZpbmUgQlVGTUdSX0hXRElBR18wCQkJMHgwMDAwNDQ0YworI2RlZmluZSBCVUZNR1JfSFdESUFHXzEJCQkweDAwMDA0NDUwCisjZGVmaW5lIEJVRk1HUl9IV0RJQUdfMgkJCTB4MDAwMDQ0NTQKKy8qIDB4NDQ1OCAtLT4gMHg0ODAwIHVudXNlZCAqLworCisvKiBSZWFkIERNQSBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSRE1BQ19NT0RFCQkJMHgwMDAwNDgwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJETUFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkRNQUNfTU9ERV9UR1RBQk9SVF9FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lICBSRE1BQ19NT0RFX01TVEFCT1JUX0VOQUIJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJETUFDX01PREVfUEFSSVRZRVJSX0VOQUIJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFJETUFDX01PREVfQUREUk9GTE9XX0VOQUIJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT09GTE9XX0VOQUIJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT1VSVU5fRU5BQgkgMHgwMDAwMDA4MAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPT1JFQURfRU5BQgkgMHgwMDAwMDEwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9MTkdSRUFEX0VOQUIJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFJETUFDX01PREVfU1BMSVRfRU5BQkxFCSAweDAwMDAwODAwCisjZGVmaW5lICBSRE1BQ19NT0RFX1NQTElUX1JFU0VUCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPX1NJWkVfMTI4CSAweDAwMDIwMDAwCisjZGVmaW5lICBSRE1BQ19NT0RFX0ZJRk9fTE9OR19CVVJTVAkgMHgwMDAzMDAwMAorI2RlZmluZSBSRE1BQ19TVEFUVVMJCQkweDAwMDA0ODA0CisjZGVmaW5lICBSRE1BQ19TVEFUVVNfVEdUQUJPUlQJCSAweDAwMDAwMDA0CisjZGVmaW5lICBSRE1BQ19TVEFUVVNfTVNUQUJPUlQJCSAweDAwMDAwMDA4CisjZGVmaW5lICBSRE1BQ19TVEFUVVNfUEFSSVRZRVJSCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0FERFJPRkxPVwkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19GSUZPT0ZMT1cJCSAweDAwMDAwMDQwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfRklGT1VSVU4JCSAweDAwMDAwMDgwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfRklGT09SRUFECQkgMHgwMDAwMDEwMAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0xOR1JFQUQJCSAweDAwMDAwMjAwCisvKiAweDQ4MDggLS0+IDB4NGMwMCB1bnVzZWQgKi8KKworLyogV3JpdGUgRE1BIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFdETUFDX01PREUJCQkweDAwMDA0YzAwCisjZGVmaW5lICBXRE1BQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgV0RNQUNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBXRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFdETUFDX01PREVfTVNUQUJPUlRfRU5BQgkgMHgwMDAwMDAwOAorI2RlZmluZSAgV0RNQUNfTU9ERV9QQVJJVFlFUlJfRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSAgV0RNQUNfTU9ERV9BRERST0ZMT1dfRU5BQgkgMHgwMDAwMDAyMAorI2RlZmluZSAgV0RNQUNfTU9ERV9GSUZPT0ZMT1dfRU5BQgkgMHgwMDAwMDA0MAorI2RlZmluZSAgV0RNQUNfTU9ERV9GSUZPVVJVTl9FTkFCCSAweDAwMDAwMDgwCisjZGVmaW5lICBXRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCCSAweDAwMDAwMTAwCisjZGVmaW5lICBXRE1BQ19NT0RFX0xOR1JFQURfRU5BQgkgMHgwMDAwMDIwMAorI2RlZmluZSAgV0RNQUNfTU9ERV9SWF9BQ0NFTAkgCSAweDAwMDAwNDAwCisjZGVmaW5lIFdETUFDX1NUQVRVUwkJCTB4MDAwMDRjMDQKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19UR1RBQk9SVAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19NU1RBQk9SVAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19QQVJJVFlFUlIJCSAweDAwMDAwMDEwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfQUREUk9GTE9XCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX0ZJRk9PRkxPVwkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19GSUZPVVJVTgkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19GSUZPT1JFQUQJCSAweDAwMDAwMTAwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfTE5HUkVBRAkJIDB4MDAwMDAyMDAKKy8qIDB4NGMwOCAtLT4gMHg1MDAwIHVudXNlZCAqLworCisvKiBQZXItY3B1IHJlZ2lzdGVyIG9mZnNldHMgKGFybTkpICovCisjZGVmaW5lIENQVV9NT0RFCQkJMHgwMDAwMDAwMAorI2RlZmluZSAgQ1BVX01PREVfUkVTRVQJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgQ1BVX01PREVfSEFMVAkJCSAweDAwMDAwNDAwCisjZGVmaW5lIENQVV9TVEFURQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ1BVX0VWVE1BU0sJCQkweDAwMDAwMDA4CisvKiAweGMgLS0+IDB4MWMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ1BVX1BDCQkJCTB4MDAwMDAwMWMKKyNkZWZpbmUgQ1BVX0lOU04JCQkweDAwMDAwMDIwCisjZGVmaW5lIENQVV9TUEFEX1VGTE9XCQkJMHgwMDAwMDAyNAorI2RlZmluZSBDUFVfV0RPR19DTEVBUgkJCTB4MDAwMDAwMjgKKyNkZWZpbmUgQ1BVX1dET0dfVkVDVE9SCQkJMHgwMDAwMDAyYworI2RlZmluZSBDUFVfV0RPR19QQwkJCTB4MDAwMDAwMzAKKyNkZWZpbmUgQ1BVX0hXX0JQCQkJMHgwMDAwMDAzNAorLyogMHgzOCAtLT4gMHg0NCB1bnVzZWQgKi8KKyNkZWZpbmUgQ1BVX1dET0dfU0FWRURfU1RBVEUJCTB4MDAwMDAwNDQKKyNkZWZpbmUgQ1BVX0xBU1RfQlJBTkNIX0FERFIJCTB4MDAwMDAwNDgKKyNkZWZpbmUgQ1BVX1NQQURfVUZMT1dfU0VUCQkweDAwMDAwMDRjCisvKiAweDUwIC0tPiAweDIwMCB1bnVzZWQgKi8KKyNkZWZpbmUgQ1BVX1IwCQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgQ1BVX1IxCQkJCTB4MDAwMDAyMDQKKyNkZWZpbmUgQ1BVX1IyCQkJCTB4MDAwMDAyMDgKKyNkZWZpbmUgQ1BVX1IzCQkJCTB4MDAwMDAyMGMKKyNkZWZpbmUgQ1BVX1I0CQkJCTB4MDAwMDAyMTAKKyNkZWZpbmUgQ1BVX1I1CQkJCTB4MDAwMDAyMTQKKyNkZWZpbmUgQ1BVX1I2CQkJCTB4MDAwMDAyMTgKKyNkZWZpbmUgQ1BVX1I3CQkJCTB4MDAwMDAyMWMKKyNkZWZpbmUgQ1BVX1I4CQkJCTB4MDAwMDAyMjAKKyNkZWZpbmUgQ1BVX1I5CQkJCTB4MDAwMDAyMjQKKyNkZWZpbmUgQ1BVX1IxMAkJCQkweDAwMDAwMjI4CisjZGVmaW5lIENQVV9SMTEJCQkJMHgwMDAwMDIyYworI2RlZmluZSBDUFVfUjEyCQkJCTB4MDAwMDAyMzAKKyNkZWZpbmUgQ1BVX1IxMwkJCQkweDAwMDAwMjM0CisjZGVmaW5lIENQVV9SMTQJCQkJMHgwMDAwMDIzOAorI2RlZmluZSBDUFVfUjE1CQkJCTB4MDAwMDAyM2MKKyNkZWZpbmUgQ1BVX1IxNgkJCQkweDAwMDAwMjQwCisjZGVmaW5lIENQVV9SMTcJCQkJMHgwMDAwMDI0NAorI2RlZmluZSBDUFVfUjE4CQkJCTB4MDAwMDAyNDgKKyNkZWZpbmUgQ1BVX1IxOQkJCQkweDAwMDAwMjRjCisjZGVmaW5lIENQVV9SMjAJCQkJMHgwMDAwMDI1MAorI2RlZmluZSBDUFVfUjIxCQkJCTB4MDAwMDAyNTQKKyNkZWZpbmUgQ1BVX1IyMgkJCQkweDAwMDAwMjU4CisjZGVmaW5lIENQVV9SMjMJCQkJMHgwMDAwMDI1YworI2RlZmluZSBDUFVfUjI0CQkJCTB4MDAwMDAyNjAKKyNkZWZpbmUgQ1BVX1IyNQkJCQkweDAwMDAwMjY0CisjZGVmaW5lIENQVV9SMjYJCQkJMHgwMDAwMDI2OAorI2RlZmluZSBDUFVfUjI3CQkJCTB4MDAwMDAyNmMKKyNkZWZpbmUgQ1BVX1IyOAkJCQkweDAwMDAwMjcwCisjZGVmaW5lIENQVV9SMjkJCQkJMHgwMDAwMDI3NAorI2RlZmluZSBDUFVfUjMwCQkJCTB4MDAwMDAyNzgKKyNkZWZpbmUgQ1BVX1IzMQkJCQkweDAwMDAwMjdjCisvKiAweDI4MCAtLT4gMHg0MDAgdW51c2VkICovCisKKyNkZWZpbmUgUlhfQ1BVX0JBU0UJCQkweDAwMDA1MDAwCisjZGVmaW5lIFRYX0NQVV9CQVNFCQkJMHgwMDAwNTQwMAorCisvKiBNYWlsYm94ZXMgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMAkJMHgwMDAwNTgwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMQkJMHgwMDAwNTgwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMgkJMHgwMDAwNTgxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMwkJMHgwMDAwNTgxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzAJCTB4MDAwMDU4MjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF8xCQkweDAwMDA1ODI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfMgkJMHgwMDAwNTgzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzMJCTB4MDAwMDU4MzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF80CQkweDAwMDA1ODQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfNQkJMHgwMDAwNTg0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzYJCTB4MDAwMDU4NTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF83CQkweDAwMDA1ODU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JFTE9BRF9TVEFUCQkweDAwMDA1ODYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlNURF9QUk9EX0lEWAkJMHgwMDAwNTg2OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZKVU1CT19QUk9EX0lEWAkweDAwMDA1ODcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVk1JTklfUFJPRF9JRFgJMHgwMDAwNTg3OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8wCTB4MDAwMDU4ODAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMQkweDAwMDA1ODg4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzIJMHgwMDAwNTg5MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8zCTB4MDAwMDU4OTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfNAkweDAwMDA1OGEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzUJMHgwMDAwNThhOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF82CTB4MDAwMDU4YjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfNwkweDAwMDA1OGI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzgJMHgwMDAwNThjMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF85CTB4MDAwMDU4YzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTAJMHgwMDAwNThkMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xMQkweDAwMDA1OGQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzEyCTB4MDAwMDU4ZTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTMJMHgwMDAwNThlOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xNAkweDAwMDA1OGYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzE1CTB4MDAwMDU4ZjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8wCTB4MDAwMDU5MDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xCTB4MDAwMDU5MDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8yCTB4MDAwMDU5MTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8zCTB4MDAwMDU5MTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF80CTB4MDAwMDU5MjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF81CTB4MDAwMDU5MjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF82CTB4MDAwMDU5MzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF83CTB4MDAwMDU5MzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF84CTB4MDAwMDU5NDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF85CTB4MDAwMDU5NDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xMAkweDAwMDA1OTUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTEJMHgwMDAwNTk1OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzEyCTB4MDAwMDU5NjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xMwkweDAwMDA1OTY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTQJMHgwMDAwNTk3MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzE1CTB4MDAwMDU5NzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzAJMHgwMDAwNTk4MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMQkweDAwMDA1OTg4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8yCTB4MDAwMDU5OTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzMJMHgwMDAwNTk5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfNAkweDAwMDA1OWEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF81CTB4MDAwMDU5YTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzYJMHgwMDAwNTliMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfNwkweDAwMDA1OWI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF84CTB4MDAwMDU5YzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzkJMHgwMDAwNTljOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTAJMHgwMDAwNTlkMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTEJMHgwMDAwNTlkOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTIJMHgwMDAwNTllMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTMJMHgwMDAwNTllOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTQJMHgwMDAwNTlmMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTUJMHgwMDAwNTlmOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9ISUdIX1BSSU9fRVZfVkVDVE9SCTB4MDAwMDVhMDAKKyNkZWZpbmUgR1JDTUJPWF9ISUdIX1BSSU9fRVZfTUFTSwkweDAwMDA1YTA0CisjZGVmaW5lIEdSQ01CT1hfTE9XX1BSSU9fRVZfVkVDCQkweDAwMDA1YTA4CisjZGVmaW5lIEdSQ01CT1hfTE9XX1BSSU9fRVZfTUFTSwkweDAwMDA1YTBjCisvKiAweDVhMTAgLS0+IDB4NWMwMCAqLworCisvKiBGbG93IFRocm91Z2ggcXVldWVzICovCisjZGVmaW5lIEZUUV9SRVNFVAkJCTB4MDAwMDVjMDAKKyNkZWZpbmUgRlRRX1JFU0VUX0RNQV9SRUFEX1FVRVVFCSgxIDw8IDEpCisjZGVmaW5lIEZUUV9SRVNFVF9ETUFfSElHSF9QUklfUkVBRAkoMSA8PCAyKQorI2RlZmluZSBGVFFfUkVTRVRfU0VORF9CRF9DT01QTEVUSU9OCSgxIDw8IDQpCisjZGVmaW5lIEZUUV9SRVNFVF9ETUFfV1JJVEUJCSgxIDw8IDYpCisjZGVmaW5lIEZUUV9SRVNFVF9ETUFfSElHSF9QUklfV1JJVEUJKDEgPDwgNykKKyNkZWZpbmUgRlRRX1JFU0VUX1NFTkRfREFUQV9DT01QTEVUSU9OCSgxIDw8IDkpCisjZGVmaW5lIEZUUV9SRVNFVF9IT1NUX0NPQUxFU0NJTkcJKDEgPDwgMTApCisjZGVmaW5lIEZUUV9SRVNFVF9NQUNfVFgJCSgxIDw8IDExKQorI2RlZmluZSBGVFFfUkVTRVRfUlhfQkRfQ09NUExFVEUJKDEgPDwgMTMpCisjZGVmaW5lIEZUUV9SRVNFVF9SWF9MSVNUX1BMQ01UCQkoMSA8PCAxNCkKKyNkZWZpbmUgRlRRX1JFU0VUX1JYX0RBVEFfQ09NUExFVElPTgkoMSA8PCAxNikKKy8qIDB4NWMwNCAtLT4gMHg1YzEwIHVudXNlZCAqLworI2RlZmluZSBGVFFfRE1BX05PUk1fUkVBRF9DVEwJCTB4MDAwMDVjMTAKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1JFQURfRlVMTF9DTlQJMHgwMDAwNWMxNAorI2RlZmluZSBGVFFfRE1BX05PUk1fUkVBRF9GSUZPX0VOUURFUQkweDAwMDA1YzE4CisjZGVmaW5lIEZUUV9ETUFfTk9STV9SRUFEX1dSSVRFX1BFRUsJMHgwMDAwNWMxYworI2RlZmluZSBGVFFfRE1BX0hJR0hfUkVBRF9DVEwJCTB4MDAwMDVjMjAKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1JFQURfRlVMTF9DTlQJMHgwMDAwNWMyNAorI2RlZmluZSBGVFFfRE1BX0hJR0hfUkVBRF9GSUZPX0VOUURFUQkweDAwMDA1YzI4CisjZGVmaW5lIEZUUV9ETUFfSElHSF9SRUFEX1dSSVRFX1BFRUsJMHgwMDAwNWMyYworI2RlZmluZSBGVFFfRE1BX0NPTVBfRElTQ19DVEwJCTB4MDAwMDVjMzAKKyNkZWZpbmUgRlRRX0RNQV9DT01QX0RJU0NfRlVMTF9DTlQJMHgwMDAwNWMzNAorI2RlZmluZSBGVFFfRE1BX0NPTVBfRElTQ19GSUZPX0VOUURFUQkweDAwMDA1YzM4CisjZGVmaW5lIEZUUV9ETUFfQ09NUF9ESVNDX1dSSVRFX1BFRUsJMHgwMDAwNWMzYworI2RlZmluZSBGVFFfU0VORF9CRF9DT01QX0NUTAkJMHgwMDAwNWM0MAorI2RlZmluZSBGVFFfU0VORF9CRF9DT01QX0ZVTExfQ05UCTB4MDAwMDVjNDQKKyNkZWZpbmUgRlRRX1NFTkRfQkRfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1YzQ4CisjZGVmaW5lIEZUUV9TRU5EX0JEX0NPTVBfV1JJVEVfUEVFSwkweDAwMDA1YzRjCisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfSU5JVF9DVEwJCTB4MDAwMDVjNTAKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX0ZVTExfQ05UCTB4MDAwMDVjNTQKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX0ZJRk9fRU5RREVRCTB4MDAwMDVjNTgKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX1dSSVRFX1BFRUsJMHgwMDAwNWM1YworI2RlZmluZSBGVFFfRE1BX05PUk1fV1JJVEVfQ1RMCQkweDAwMDA1YzYwCisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9GVUxMX0NOVAkweDAwMDA1YzY0CisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9GSUZPX0VOUURFUQkweDAwMDA1YzY4CisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9XUklURV9QRUVLCTB4MDAwMDVjNmMKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1dSSVRFX0NUTAkJMHgwMDAwNWM3MAorI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfRlVMTF9DTlQJMHgwMDAwNWM3NAorI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfRklGT19FTlFERVEJMHgwMDAwNWM3OAorI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfV1JJVEVfUEVFSwkweDAwMDA1YzdjCisjZGVmaW5lIEZUUV9TV1RZUEUxX0NUTAkJCTB4MDAwMDVjODAKKyNkZWZpbmUgRlRRX1NXVFlQRTFfRlVMTF9DTlQJCTB4MDAwMDVjODQKKyNkZWZpbmUgRlRRX1NXVFlQRTFfRklGT19FTlFERVEJCTB4MDAwMDVjODgKKyNkZWZpbmUgRlRRX1NXVFlQRTFfV1JJVEVfUEVFSwkJMHgwMDAwNWM4YworI2RlZmluZSBGVFFfU0VORF9EQVRBX0NPTVBfQ1RMCQkweDAwMDA1YzkwCisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9GVUxMX0NOVAkweDAwMDA1Yzk0CisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1Yzk4CisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9XUklURV9QRUVLCTB4MDAwMDVjOWMKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9DVEwJCTB4MDAwMDVjYTAKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9GVUxMX0NOVAkJMHgwMDAwNWNhNAorI2RlZmluZSBGVFFfSE9TVF9DT0FMX0ZJRk9fRU5RREVRCTB4MDAwMDVjYTgKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9XUklURV9QRUVLCTB4MDAwMDVjYWMKKyNkZWZpbmUgRlRRX01BQ19UWF9DVEwJCQkweDAwMDA1Y2IwCisjZGVmaW5lIEZUUV9NQUNfVFhfRlVMTF9DTlQJCTB4MDAwMDVjYjQKKyNkZWZpbmUgRlRRX01BQ19UWF9GSUZPX0VOUURFUQkJMHgwMDAwNWNiOAorI2RlZmluZSBGVFFfTUFDX1RYX1dSSVRFX1BFRUsJCTB4MDAwMDVjYmMKKyNkZWZpbmUgRlRRX01CX0ZSRUVfQ1RMCQkJMHgwMDAwNWNjMAorI2RlZmluZSBGVFFfTUJfRlJFRV9GVUxMX0NOVAkJMHgwMDAwNWNjNAorI2RlZmluZSBGVFFfTUJfRlJFRV9GSUZPX0VOUURFUQkJMHgwMDAwNWNjOAorI2RlZmluZSBGVFFfTUJfRlJFRV9XUklURV9QRUVLCQkweDAwMDA1Y2NjCisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX0NUTAkJMHgwMDAwNWNkMAorI2RlZmluZSBGVFFfUkNWQkRfQ09NUF9GVUxMX0NOVAkJMHgwMDAwNWNkNAorI2RlZmluZSBGVFFfUkNWQkRfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1Y2Q4CisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX1dSSVRFX1BFRUsJMHgwMDAwNWNkYworI2RlZmluZSBGVFFfUkNWTFNUX1BMTVRfQ1RMCQkweDAwMDA1Y2UwCisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9GVUxMX0NOVAkweDAwMDA1Y2U0CisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9GSUZPX0VOUURFUQkweDAwMDA1Y2U4CisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9XUklURV9QRUVLCTB4MDAwMDVjZWMKKyNkZWZpbmUgRlRRX1JDVkRBVEFfSU5JX0NUTAkJMHgwMDAwNWNmMAorI2RlZmluZSBGVFFfUkNWREFUQV9JTklfRlVMTF9DTlQJMHgwMDAwNWNmNAorI2RlZmluZSBGVFFfUkNWREFUQV9JTklfRklGT19FTlFERVEJMHgwMDAwNWNmOAorI2RlZmluZSBGVFFfUkNWREFUQV9JTklfV1JJVEVfUEVFSwkweDAwMDA1Y2ZjCisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0NPTVBfQ1RMCQkweDAwMDA1ZDAwCisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0NPTVBfRlVMTF9DTlQJMHgwMDAwNWQwNAorI2RlZmluZSBGVFFfUkNWREFUQV9DT01QX0ZJRk9fRU5RREVRCTB4MDAwMDVkMDgKKyNkZWZpbmUgRlRRX1JDVkRBVEFfQ09NUF9XUklURV9QRUVLCTB4MDAwMDVkMGMKKyNkZWZpbmUgRlRRX1NXVFlQRTJfQ1RMCQkJMHgwMDAwNWQxMAorI2RlZmluZSBGVFFfU1dUWVBFMl9GVUxMX0NOVAkJMHgwMDAwNWQxNAorI2RlZmluZSBGVFFfU1dUWVBFMl9GSUZPX0VOUURFUQkJMHgwMDAwNWQxOAorI2RlZmluZSBGVFFfU1dUWVBFMl9XUklURV9QRUVLCQkweDAwMDA1ZDFjCisvKiAweDVkMjAgLS0+IDB4NjAwMCB1bnVzZWQgKi8KKworLyogTWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1TR0lOVF9NT0RFCQkJMHgwMDAwNjAwMAorI2RlZmluZSAgTVNHSU5UX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNU0dJTlRfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIE1TR0lOVF9TVEFUVVMJCQkweDAwMDA2MDA0CisjZGVmaW5lIE1TR0lOVF9GSUZPCQkJMHgwMDAwNjAwOAorLyogMHg2MDBjIC0tPiAweDY0MDAgdW51c2VkICovCisKKy8qIERNQSBjb21wbGV0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBETUFDX01PREUJCQkweDAwMDA2NDAwCisjZGVmaW5lICBETUFDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBETUFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorLyogMHg2NDA0IC0tPiAweDY4MDAgdW51c2VkICovCisKKy8qIEdSQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1JDX01PREUJCQkweDAwMDA2ODAwCisjZGVmaW5lICBHUkNfTU9ERV9VUERfT05fQ09BTAkJMHgwMDAwMDAwMQorI2RlZmluZSAgR1JDX01PREVfQlNXQVBfTk9ORlJNX0RBVEEJMHgwMDAwMDAwMgorI2RlZmluZSAgR1JDX01PREVfV1NXQVBfTk9ORlJNX0RBVEEJMHgwMDAwMDAwNAorI2RlZmluZSAgR1JDX01PREVfQlNXQVBfREFUQQkJMHgwMDAwMDAxMAorI2RlZmluZSAgR1JDX01PREVfV1NXQVBfREFUQQkJMHgwMDAwMDAyMAorI2RlZmluZSAgR1JDX01PREVfU1BMSVRIRFIJCTB4MDAwMDAxMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PRlJNX0NSQUNLSU5HCTB4MDAwMDAyMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lOQ0xfQ1JDCQkweDAwMDAwNDAwCisjZGVmaW5lICBHUkNfTU9ERV9BTExPV19CQURfRlJNUwkweDAwMDAwODAwCisjZGVmaW5lICBHUkNfTU9ERV9OT0lSUV9PTl9TRU5EUwkweDAwMDAyMDAwCisjZGVmaW5lICBHUkNfTU9ERV9OT0lSUV9PTl9SQ1YJCTB4MDAwMDQwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0ZPUkNFX1BDSTMyQklUCTB4MDAwMDgwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0hPU1RfU1RBQ0tVUAkJMHgwMDAxMDAwMAorI2RlZmluZSAgR1JDX01PREVfSE9TVF9TRU5EQkRTCQkweDAwMDIwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9OT19UWF9QSERSX0NTVU0JMHgwMDEwMDAwMAorI2RlZmluZSAgR1JDX01PREVfTk9fUlhfUEhEUl9DU1VNCTB4MDA4MDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lSUV9PTl9UWF9DUFVfQVRUTgkweDAxMDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fUlhfQ1BVX0FUVE4JMHgwMjAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX01BQ19BVFROCTB4MDQwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lSUV9PTl9ETUFfQVRUTgkweDA4MDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fRkxPV19BVFROCTB4MTAwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFXzRYX05JQ19TRU5EX1JJTkdTCTB4MjAwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX01DQVNUX0ZSTV9FTkFCTEUJMHg0MDAwMDAwMAorI2RlZmluZSBHUkNfTUlTQ19DRkcJCQkweDAwMDA2ODA0CisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQ09SRUNMS19SRVNFVAkweDAwMDAwMDAxCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfUFJFU0NBTEFSX01BU0sJMHgwMDAwMDBmZQorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX1BSRVNDQUxBUl9TSElGVAkxCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfTUFTSwkweDAwMDFlMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwMAkweDAwMDFlMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwMQkweDAwMDAwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwMkZFCTB4MDAwMDQwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzAzCTB4MDAwMDAwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzAzUwkweDAwMDAyMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwNAkweDAwMDAwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwNENJT0JFIDB4MDAwMDQwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzA0X0EyCTB4MDAwMDgwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81Nzg4CTB4MDAwMTAwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81Nzg4TQkweDAwMDE4MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfQUM5MTAwMkExIDB4MDAwMTgwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19LRUVQX0dQSFlfUE9XRVIJMHgwNDAwMDAwMAorI2RlZmluZSBHUkNfTE9DQUxfQ1RSTAkJCTB4MDAwMDY4MDgKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0lOVF9BQ1RJVkUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0NMRUFSSU5UCQkweDAwMDAwMDAyCisjZGVmaW5lICBHUkNfTENMQ1RSTF9TRVRJTlQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0lOVF9PTl9BVFROCTB4MDAwMDAwMDgKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fSU5QVVQwCTB4MDAwMDAxMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fSU5QVVQxCTB4MDAwMDAyMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fSU5QVVQyCTB4MDAwMDA0MDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT0UwCQkweDAwMDAwODAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09FMQkJMHgwMDAwMTAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PRTIJCTB4MDAwMDIwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMAkweDAwMDA0MDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEJMHgwMDAwODAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQyCTB4MDAwMTAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0VYVE1FTV9FTkFCTEUJMHgwMDAyMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfTUFTSwkJMHgwMDFjMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfMjU2SwkJMHgwMDAwMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfNTEySwkJMHgwMDA0MDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfMU0JCTB4MDAwODAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzJNCQkweDAwMGMwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl80TQkJMHgwMDEwMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfOE0JCTB4MDAxNDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzE2TQkJMHgwMDE4MDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfQkFOS19TRUxFQ1QJMHgwMDIwMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfU1NSQU1fVFlQRQkJMHgwMDQwMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfQVVUT19TRUVQUk9NCTB4MDEwMDAwMDAKKyNkZWZpbmUgR1JDX1RJTUVSCQkJMHgwMDAwNjgwYworI2RlZmluZSBHUkNfUlhfQ1BVX0VWRU5UCQkweDAwMDA2ODEwCisjZGVmaW5lIEdSQ19SWF9USU1FUl9SRUYJCTB4MDAwMDY4MTQKKyNkZWZpbmUgR1JDX1JYX0NQVV9TRU0JCQkweDAwMDA2ODE4CisjZGVmaW5lIEdSQ19SRU1PVEVfUlhfQ1BVX0FUVE4JCTB4MDAwMDY4MWMKKyNkZWZpbmUgR1JDX1RYX0NQVV9FVkVOVAkJMHgwMDAwNjgyMAorI2RlZmluZSBHUkNfVFhfVElNRVJfUkVGCQkweDAwMDA2ODI0CisjZGVmaW5lIEdSQ19UWF9DUFVfU0VNCQkJMHgwMDAwNjgyOAorI2RlZmluZSBHUkNfUkVNT1RFX1RYX0NQVV9BVFROCQkweDAwMDA2ODJjCisjZGVmaW5lIEdSQ19NRU1fUE9XRVJfVVAJCTB4MDAwMDY4MzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ19FRVBST01fQUREUgkJCTB4MDAwMDY4MzgKKyNkZWZpbmUgIEVFUFJPTV9BRERSX1dSSVRFCQkweDAwMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9SRUFECQkweDgwMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9DT01QTEVURQkJMHg0MDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfRlNNX1JFU0VUCQkweDIwMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9ERVZJRF9NQVNLCQkweDFjMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9ERVZJRF9TSElGVAkyNgorI2RlZmluZSAgRUVQUk9NX0FERFJfU1RBUlQJCTB4MDIwMDAwMDAKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0NMS1BFUkRfU0hJRlQJMTYKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0FERFJfTUFTSwkJMHgwMDAwZmZmZgorI2RlZmluZSAgRUVQUk9NX0FERFJfQUREUl9TSElGVAkJMAorI2RlZmluZSAgRUVQUk9NX0RFRkFVTFRfQ0xPQ0tfUEVSSU9ECTB4NjAKKyNkZWZpbmUgIEVFUFJPTV9DSElQX1NJWkUJCSg2NCAqIDEwMjQpCisjZGVmaW5lIEdSQ19FRVBST01fREFUQQkJCTB4MDAwMDY4M2MKKyNkZWZpbmUgR1JDX0VFUFJPTV9DVFJMCQkJMHgwMDAwNjg0MAorI2RlZmluZSBHUkNfTURJX0NUUkwJCQkweDAwMDA2ODQ0CisjZGVmaW5lIEdSQ19TRUVQUk9NX0RFTEFZCQkweDAwMDA2ODQ4CisvKiAweDY4NGMgLS0+IDB4NmMwMCB1bnVzZWQgKi8KKworLyogMHg2YzAwIC0tPiAweDcwMDAgdW51c2VkICovCisKKy8qIE5WUkFNIENvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIE5WUkFNX0NNRAkJCTB4MDAwMDcwMDAKKyNkZWZpbmUgIE5WUkFNX0NNRF9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE5WUkFNX0NNRF9ET05FCQkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE5WUkFNX0NNRF9HTwkJCSAweDAwMDAwMDEwCisjZGVmaW5lICBOVlJBTV9DTURfV1IJCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgTlZSQU1fQ01EX1JECQkJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIE5WUkFNX0NNRF9FUkFTRQkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIE5WUkFNX0NNRF9GSVJTVAkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE5WUkFNX0NNRF9MQVNUCQkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgTlZSQU1fU1RBVAkJCTB4MDAwMDcwMDQKKyNkZWZpbmUgTlZSQU1fV1JEQVRBCQkJMHgwMDAwNzAwOAorI2RlZmluZSBOVlJBTV9BRERSCQkJMHgwMDAwNzAwYworI2RlZmluZSAgTlZSQU1fQUREUl9NU0sJCQkweDAwZmZmZmZmCisjZGVmaW5lIE5WUkFNX1JEREFUQQkJCTB4MDAwMDcwMTAKKyNkZWZpbmUgTlZSQU1fQ0ZHMQkJCTB4MDAwMDcwMTQKKyNkZWZpbmUgIE5WUkFNX0NGRzFfRkxBU0hJRl9FTkFCCSAweDAwMDAwMDAxCisjZGVmaW5lICBOVlJBTV9DRkcxX0JVRkZFUkVEX01PREUJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIE5WUkFNX0NGRzFfUEFTU19USFJVCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgTlZSQU1fQ0ZHMV9CSVRfQkFORwkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE5WUkFNX0NGRzFfQ09NUEFUX0JZUEFTUwkgMHg4MDAwMDAwMAorI2RlZmluZSBOVlJBTV9DRkcyCQkJMHgwMDAwNzAxOAorI2RlZmluZSBOVlJBTV9DRkczCQkJMHgwMDAwNzAxYworI2RlZmluZSBOVlJBTV9TV0FSQgkJCTB4MDAwMDcwMjAKKyNkZWZpbmUgIFNXQVJCX1JFUV9TRVQwCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNXQVJCX1JFUV9TRVQxCQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNXQVJCX1JFUV9TRVQyCQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFNXQVJCX1JFUV9TRVQzCQkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFNXQVJCX1JFUV9DTFIwCQkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFNXQVJCX1JFUV9DTFIxCQkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFNXQVJCX1JFUV9DTFIyCQkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFNXQVJCX1JFUV9DTFIzCQkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFNXQVJCX0dOVDAJCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgU1dBUkJfR05UMQkJCSAweDAwMDAwMjAwCisjZGVmaW5lICBTV0FSQl9HTlQyCQkJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIFNXQVJCX0dOVDMJCQkgMHgwMDAwMDgwMAorI2RlZmluZSAgU1dBUkJfUkVRMAkJCSAweDAwMDAxMDAwCisjZGVmaW5lICBTV0FSQl9SRVExCQkJIDB4MDAwMDIwMDAKKyNkZWZpbmUgIFNXQVJCX1JFUTIJCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgU1dBUkJfUkVRMwkJCSAweDAwMDA4MDAwCisjZGVmaW5lICAgIE5WUkFNX0JVRkZFUkVEX1BBR0VfU0laRQkgICAyNjQKKyNkZWZpbmUgICAgTlZSQU1fQlVGRkVSRURfUEFHRV9QT1MJICAgOQorLyogMHg3MDI0IC0tPiAweDc0MDAgdW51c2VkICovCisKKy8qIDB4NzQwMCAtLT4gMHg4MDAwIHVudXNlZCAqLworCisvKiAzMksgV2luZG93IGludG8gTklDIGludGVybmFsIG1lbW9yeSAqLworI2RlZmluZSBOSUNfU1JBTV9XSU5fQkFTRQkJMHgwMDAwODAwMAorCisvKiBPZmZzZXRzIGludG8gZmlyc3QgMzJrIG9mIE5JQyBpbnRlcm5hbCBtZW1vcnkuICovCisjZGVmaW5lIE5JQ19TUkFNX1BBR0VfWkVSTwkJMHgwMDAwMDAwMAorI2RlZmluZSBOSUNfU1JBTV9TRU5EX1JDQgkJMHgwMDAwMDEwMCAvKiAxNiAqIFRHM19CRElORk9fLi4uICovCisjZGVmaW5lIE5JQ19TUkFNX1JDVl9SRVRfUkNCCQkweDAwMDAwMjAwIC8qIDE2ICogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgTklDX1NSQU1fU1RBVFNfQkxLCQkweDAwMDAwMzAwCisjZGVmaW5lIE5JQ19TUkFNX1NUQVRVU19CTEsJCTB4MDAwMDBiMDAKKworI2RlZmluZSBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YCQkweDAwMDAwYjUwCisjZGVmaW5lICBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YX01BR0lDMQkgMHg0QjY1NzY1NAorI2RlZmluZSAgTklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzIJIDB4NDg2MTc2NGIgLyogIWRtYSBvbiBsaW5rY2hnICovCisKKyNkZWZpbmUgTklDX1NSQU1fREFUQV9TSUcJCTB4MDAwMDBiNTQKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfU0lHX01BR0lDCSAweDRiNjU3NjU0IC8qIGFzY2lpIGZvciAnS2V2VCcgKi8KKworI2RlZmluZSBOSUNfU1JBTV9EQVRBX0NGRwkJCTB4MDAwMDBiNTgKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9NT0RFX01BU0sJIDB4MDAwMDAwMGMKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9NT0RFX1VOS05PV04JIDB4MDAwMDAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9UUklQTEVfU1BECSAweDAwMDAwMDA0CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19MRURfT1BFTl9EUkFJTgkgMHgwMDAwMDAwNAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX0xJTktfU1BECQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX09VVFBVVAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX01BU0sJIDB4MDAwMDAwMzAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX1VOS05PV04JIDB4MDAwMDAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX0NPUFBFUgkgMHgwMDAwMDAxMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfUEhZX1RZUEVfRklCRVIJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1dPTF9FTkFCTEUJCSAweDAwMDAwMDQwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19BU0ZfRU5BQkxFCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfRUVQUk9NX1dQCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTUlOSV9QQ0kJCSAweDAwMDAxMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19GSUJFUl9XT0wJCSAweDAwMDA0MDAwCisKKyNkZWZpbmUgTklDX1NSQU1fREFUQV9QSFlfSUQJCTB4MDAwMDBiNzQKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfUEhZX0lEMV9NQVNLCSAweGZmZmYwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX1BIWV9JRDJfTUFTSwkgMHgwMDAwZmZmZgorCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0NNRF9NQk9YCQkweDAwMDAwYjc4CisjZGVmaW5lICBGV0NNRF9OSUNEUlZfQUxJVkUJCSAweDAwMDAwMDAxCisjZGVmaW5lICBGV0NNRF9OSUNEUlZfUEFVU0VfRlcJCSAweDAwMDAwMDAyCisjZGVmaW5lICBGV0NNRF9OSUNEUlZfSVBWNEFERFJfQ0hHCSAweDAwMDAwMDAzCisjZGVmaW5lICBGV0NNRF9OSUNEUlZfSVBWNkFERFJfQ0hHCSAweDAwMDAwMDA0CisjZGVmaW5lICBGV0NNRF9OSUNEUlZfRklYX0RNQVIJCSAweDAwMDAwMDA1CisjZGVmaW5lICBGV0NNRF9OSUNEUlZfRklYX0RNQVcJCSAweDAwMDAwMDA2CisjZGVmaW5lIE5JQ19TUkFNX0ZXX0NNRF9MRU5fTUJPWAkweDAwMDAwYjdjCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0NNRF9EQVRBX01CT1gJMHgwMDAwMGI4MAorI2RlZmluZSBOSUNfU1JBTV9GV19BU0ZfU1RBVFVTX01CT1gJMHgwMDAwMGMwMAorI2RlZmluZSBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWAkweDAwMDAwYzA0CisjZGVmaW5lICBEUlZfU1RBVEVfU1RBUlQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBEUlZfU1RBVEVfVU5MT0FECQkgMHgwMDAwMDAwMgorI2RlZmluZSAgRFJWX1NUQVRFX1dPTAkJCSAweDAwMDAwMDAzCisjZGVmaW5lICBEUlZfU1RBVEVfU1VTUEVORAkJIDB4MDAwMDAwMDQKKworI2RlZmluZSBOSUNfU1JBTV9GV19SRVNFVF9UWVBFX01CT1gJMHgwMDAwMGMwOAorCisjZGVmaW5lIE5JQ19TUkFNX01BQ19BRERSX0hJR0hfTUJPWAkweDAwMDAwYzE0CisjZGVmaW5lIE5JQ19TUkFNX01BQ19BRERSX0xPV19NQk9YCTB4MDAwMDBjMTgKKworI2RlZmluZSBOSUNfU1JBTV9SWF9NSU5JX0JVRkZFUl9ERVNDCTB4MDAwMDEwMDAKKworI2RlZmluZSBOSUNfU1JBTV9ETUFfREVTQ19QT09MX0JBU0UJMHgwMDAwMjAwMAorI2RlZmluZSAgTklDX1NSQU1fRE1BX0RFU0NfUE9PTF9TSVpFCSAweDAwMDAyMDAwCisjZGVmaW5lIE5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDCQkweDAwMDA0MDAwIC8qIDUxMiBlbnRyaWVzICovCisjZGVmaW5lIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDCQkweDAwMDA2MDAwIC8qIDI1NiBlbnRyaWVzICovCisjZGVmaW5lIE5JQ19TUkFNX1JYX0pVTUJPX0JVRkZFUl9ERVNDCTB4MDAwMDcwMDAgLyogMjU2IGVudHJpZXMgKi8KKyNkZWZpbmUgTklDX1NSQU1fTUJVRl9QT09MX0JBU0UJCTB4MDAwMDgwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFOTYJIDB4MDAwMTgwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFNjQJIDB4MDAwMTAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9CQVNFNTcwNQkweDAwMDEwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTU3MDUJMHgwMDAwZTAwMAorCisvKiBDdXJyZW50bHkgdGhpcyBpcyBmaXhlZC4gKi8KKyNkZWZpbmUgUEhZX0FERFIJCTB4MDEKKworLyogVGlnb24zIHNwZWNpZmljIFBIWSBNSUkgcmVnaXN0ZXJzLiAqLworI2RlZmluZSAgVEczX0JNQ1JfU1BFRUQxMDAwCQkweDAwNDAKKworI2RlZmluZSBNSUlfVEczX0NUUkwJCQkweDA5IC8qIDEwMDAtYmFzZVQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgTUlJX1RHM19DVFJMX0FEVl8xMDAwX0hBTEYJMHgwMTAwCisjZGVmaW5lICBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTAkweDAyMDAKKyNkZWZpbmUgIE1JSV9URzNfQ1RSTF9BU19NQVNURVIJCTB4MDgwMAorI2RlZmluZSAgTUlJX1RHM19DVFJMX0VOQUJMRV9BU19NQVNURVIJMHgxMDAwCisKKyNkZWZpbmUgTUlJX1RHM19FWFRfQ1RSTAkJMHgxMCAvKiBFeHRlbmRlZCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICBNSUlfVEczX0VYVF9DVFJMX0xOSzNfTEVEX01PREUJMHgwMDAyCisjZGVmaW5lICBNSUlfVEczX0VYVF9DVFJMX1RCSQkJMHg4MDAwCisKKyNkZWZpbmUgTUlJX1RHM19FWFRfU1RBVAkJMHgxMSAvKiBFeHRlbmRlZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIE1JSV9URzNfRVhUX1NUQVRfTFBBU1MJCTB4MDEwMAorCisjZGVmaW5lIE1JSV9URzNfRFNQX1JXX1BPUlQJCTB4MTUgLyogRFNQIGNvZWZmaWNpZW50IHJlYWQvd3JpdGUgcG9ydCAqLworCisjZGVmaW5lIE1JSV9URzNfRFNQX0FERFJFU1MJCTB4MTcgLyogRFNQIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBNSUlfVEczX0FVWF9DVFJMCQkweDE4IC8qIGF1eGlsbGlhcnkgY29udHJvbCByZWdpc3RlciAqLworCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVQJCTB4MTkgLyogYXV4aWxsaWFyeSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF9MUEFTUwkJMHgwMDA0CisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfU1BETUFTSwkweDA3MDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMEhBTEYJCTB4MDEwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwRlVMTAkJMHgwMjAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTAwSEFMRgkweDAzMDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMDBfNAkJMHgwNDAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTAwRlVMTAkweDA1MDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMDAwSEFMRgkweDA2MDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMDAwRlVMTAkweDA3MDAKKworI2RlZmluZSBNSUlfVEczX0lTVEFUCQkJMHgxYSAvKiBJUlEgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9URzNfSU1BU0sJCQkweDFiIC8qIElSUSBtYXNrIHJlZ2lzdGVyICovCisKKy8qIElTVEFUL0lNQVNLIGV2ZW50IGJpdHMgKi8KKyNkZWZpbmUgTUlJX1RHM19JTlRfTElOS0NIRwkJMHgwMDAyCisjZGVmaW5lIE1JSV9URzNfSU5UX1NQRUVEQ0hHCQkweDAwMDQKKyNkZWZpbmUgTUlJX1RHM19JTlRfRFVQTEVYQ0hHCQkweDAwMDgKKyNkZWZpbmUgTUlJX1RHM19JTlRfQU5FR19QQUdFX1JYCTB4MDQwMAorCisKKy8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBtYW5hZ2UgdGhlIFRYIGRlc2NyaXB0b3JzIG9uIHRoZSB0aWdvbjMuCisgKiBFaXRoZXIgdGhlIGRlc2NyaXB0b3JzIGFyZSBpbiBob3N0IERNQSdhYmxlIG1lbW9yeSwgb3IgdGhleQorICogZXhpc3Qgb25seSBpbiB0aGUgY2FyZHMgb24tY2hpcCBTUkFNLiAgQWxsIDE2IHNlbmQgYmRzIGFyZSB1bmRlcgorICogdGhlIHNhbWUgbW9kZSwgdGhleSBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgaW5kaXZpZHVhbGx5LgorICoKKyAqIFRoZSBtb2RlIHdlIHVzZSBpcyBjb250cm9sbGVkIGJ5IFRHM19GTEFHX0hPU1RfVFhEUyBpbiB0cC0+dGczX2ZsYWdzLgorICoKKyAqIFRvIHVzZSBob3N0IG1lbW9yeSBUWCBkZXNjcmlwdG9yczoKKyAqCTEpIFNldCBHUkNfTU9ERV9IT1NUX1NFTkRCRFMgaW4gR1JDX01PREUgcmVnaXN0ZXIuCisgKgkgICBNYWtlIHN1cmUgR1JDX01PREVfNFhfTklDX1NFTkRfUklOR1MgaXMgY2xlYXIuCisgKgkyKSBBbGxvY2F0ZSBETUEnYWJsZSBtZW1vcnkuCisgKgkzKSBJbiBOSUNfU1JBTV9TRU5EX1JDQiAob2YgZGVzaXJlZCBpbmRleCkgb2Ygb24tY2hpcCBTUkFNOgorICoJICAgYSkgU2V0IFRHM19CRElORk9fSE9TVF9BRERSIHRvIERNQSBhZGRyZXNzIG9mIG1lbW9yeQorICoJICAgICAgb2J0YWluZWQgaW4gc3RlcCAyCisgKgkgICBiKSBTZXQgVEczX0JESU5GT19OSUNfQUREUiB0byBOSUNfU1JBTV9UWF9CVUZGRVJfREVTQy4KKyAqCSAgIGMpIFNldCBsZW4gZmllbGQgb2YgVEczX0JESU5GT19NQVhMRU5fRkxBR1MgdG8gbnVtYmVyCisgKiAgICAgICAgICAgIG9mIFRYIGRlc2NyaXB0b3JzLiAgTGVhdmUgZmxhZ3MgZmllbGQgY2xlYXIuCisgKgk0KSBBY2Nlc3MgVFggZGVzY3JpcHRvcnMgdmlhIGhvc3QgbWVtb3J5LiAgVGhlIGNoaXAKKyAqCSAgIHdpbGwgcmVmZXRjaCBpbnRvIGxvY2FsIFNSQU0gYXMgbmVlZGVkIHdoZW4gcHJvZHVjZXIKKyAqCSAgIGluZGV4IG1haWxib3hlcyBhcmUgdXBkYXRlZC4KKyAqCisgKiBUbyB1c2Ugb24tY2hpcCBUWCBkZXNjcmlwdG9yczoKKyAqCTEpIFNldCBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUyBpbiBHUkNfTU9ERSByZWdpc3Rlci4KKyAqCSAgIE1ha2Ugc3VyZSBHUkNfTU9ERV9IT1NUX1NFTkRCRFMgaXMgY2xlYXIuCisgKgkyKSBJbiBOSUNfU1JBTV9TRU5EX1JDQiAob2YgZGVzaXJlZCBpbmRleCkgb2Ygb24tY2hpcCBTUkFNOgorICoJICAgYSkgU2V0IFRHM19CRElORk9fSE9TVF9BRERSIHRvIHplcm8uCisgKgkgICBiKSBTZXQgVEczX0JESU5GT19OSUNfQUREUiB0byBOSUNfU1JBTV9UWF9CVUZGRVJfREVTQworICoJICAgYykgVEczX0JESU5GT19NQVhMRU5fRkxBR1MgaXMgZG9uJ3QgY2FyZS4KKyAqCTMpIEFjY2VzcyBUWCBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiBvbi1jaGlwIFNSQU0KKyAqCSAgIHVzaW5nIG5vcm1hbCB7cmVhZCx3cml0ZX1sKCkuICAoYW5kIG5vdCB1c2luZworICogICAgICAgICBwb2ludGVyIGRlcmVmZXJlbmNpbmcgb2YgaW9yZW1hcCgpJ2QgbWVtb3J5IGxpa2UKKyAqCSAgIHRoZSBicm9rZW4gQnJvYWRjb20gZHJpdmVyIGRvZXMpCisgKgorICogTm90ZSB0aGF0IEJESU5GT19GTEFHU19ESVNBQkxFRCBzaG91bGQgYmUgc2V0IGluIHRoZSBmbGFncyBmaWVsZCBvZgorICogVEczX0JESU5GT19NQVhMRU5fRkxBR1Mgb2YgYWxsIHVudXNlZCBTRU5EX1JDQiBpbmRpY2VzLgorICovCitzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjIHsKKwl1aW50MzJfdAkJCWFkZHJfaGk7CisJdWludDMyX3QJCQlhZGRyX2xvOworCisJdWludDMyX3QJCQlsZW5fZmxhZ3M7CisjZGVmaW5lIFRYRF9GTEFHX1RDUFVEUF9DU1VNCQkweDAwMDEKKyNkZWZpbmUgVFhEX0ZMQUdfSVBfQ1NVTQkJMHgwMDAyCisjZGVmaW5lIFRYRF9GTEFHX0VORAkJCTB4MDAwNAorI2RlZmluZSBUWERfRkxBR19JUF9GUkFHCQkweDAwMDgKKyNkZWZpbmUgVFhEX0ZMQUdfSVBfRlJBR19FTkQJCTB4MDAxMAorI2RlZmluZSBUWERfRkxBR19WTEFOCQkJMHgwMDQwCisjZGVmaW5lIFRYRF9GTEFHX0NPQUxfTk9XCQkweDAwODAKKyNkZWZpbmUgVFhEX0ZMQUdfQ1BVX1BSRV9ETUEJCTB4MDEwMAorI2RlZmluZSBUWERfRkxBR19DUFVfUE9TVF9ETUEJCTB4MDIwMAorI2RlZmluZSBUWERfRkxBR19BRERfU1JDX0FERFIJCTB4MTAwMAorI2RlZmluZSBUWERfRkxBR19DSE9PU0VfU1JDX0FERFIJMHg2MDAwCisjZGVmaW5lIFRYRF9GTEFHX05PX0NSQwkJCTB4ODAwMAorI2RlZmluZSBUWERfTEVOX1NISUZUCQkJMTYKKworCXVpbnQzMl90CQkJdmxhbl90YWc7CisjZGVmaW5lIFRYRF9WTEFOX1RBR19TSElGVAkJMAorI2RlZmluZSBUWERfTVNTX1NISUZUCQkJMTYKK307CisKKyNkZWZpbmUgVFhEX0FERFIJCQkweDAwVUwgLyogNjQtYml0ICovCisjZGVmaW5lIFRYRF9MRU5fRkxBR1MJCQkweDA4VUwgLyogMzItYml0ICh1cHBlciAxNi1iaXRzIGFyZSBsZW4pICovCisjZGVmaW5lIFRYRF9WTEFOX1RBRwkJCTB4MGNVTCAvKiAzMi1iaXQgKHVwcGVyIDE2LWJpdHMgYXJlIHRhZykgKi8KKyNkZWZpbmUgVFhEX1NJWkUJCQkweDEwVUwKKworc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyB7CisJdWludDMyX3QJCQlhZGRyX2hpOworCXVpbnQzMl90CQkJYWRkcl9sbzsKKworCXVpbnQzMl90CQkJaWR4X2xlbjsKKyNkZWZpbmUgUlhEX0lEWF9NQVNLCTB4ZmZmZjAwMDAKKyNkZWZpbmUgUlhEX0lEWF9TSElGVAkxNgorI2RlZmluZSBSWERfTEVOX01BU0sJMHgwMDAwZmZmZgorI2RlZmluZSBSWERfTEVOX1NISUZUCTAKKworCXVpbnQzMl90CQkJdHlwZV9mbGFnczsKKyNkZWZpbmUgUlhEX1RZUEVfU0hJRlQJMTYKKyNkZWZpbmUgUlhEX0ZMQUdTX1NISUZUCTAKKworI2RlZmluZSBSWERfRkxBR19FTkQJCQkweDAwMDQKKyNkZWZpbmUgUlhEX0ZMQUdfTUlOSQkJCTB4MDgwMAorI2RlZmluZSBSWERfRkxBR19KVU1CTwkJCTB4MDAyMAorI2RlZmluZSBSWERfRkxBR19WTEFOCQkJMHgwMDQwCisjZGVmaW5lIFJYRF9GTEFHX0VSUk9SCQkJMHgwNDAwCisjZGVmaW5lIFJYRF9GTEFHX0lQX0NTVU0JCTB4MTAwMAorI2RlZmluZSBSWERfRkxBR19UQ1BVRFBfQ1NVTQkJMHgyMDAwCisjZGVmaW5lIFJYRF9GTEFHX0lTX1RDUAkJCTB4NDAwMAorCisJdWludDMyX3QJCQlpcF90Y3BfY3N1bTsKKyNkZWZpbmUgUlhEX0lQQ1NVTV9NQVNLCQkweGZmZmYwMDAwCisjZGVmaW5lIFJYRF9JUENTVU1fU0hJRlQJMTYKKyNkZWZpbmUgUlhEX1RDUENTVU1fTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIFJYRF9UQ1BDU1VNX1NISUZUCTAKKworCXVpbnQzMl90CQkJZXJyX3ZsYW47CisKKyNkZWZpbmUgUlhEX1ZMQU5fTUFTSwkJCTB4MDAwMGZmZmYKKworI2RlZmluZSBSWERfRVJSX0JBRF9DUkMJCQkweDAwMDEwMDAwCisjZGVmaW5lIFJYRF9FUlJfQ09MTElTSU9OCQkweDAwMDIwMDAwCisjZGVmaW5lIFJYRF9FUlJfTElOS19MT1NUCQkweDAwMDQwMDAwCisjZGVmaW5lIFJYRF9FUlJfUEhZX0RFQ09ERQkJMHgwMDA4MDAwMAorI2RlZmluZSBSWERfRVJSX09ERF9OSUJCTEVfUkNWRF9NSUkJMHgwMDEwMDAwMAorI2RlZmluZSBSWERfRVJSX01BQ19BQlJUCQkweDAwMjAwMDAwCisjZGVmaW5lIFJYRF9FUlJfVE9PX1NNQUxMCQkweDAwNDAwMDAwCisjZGVmaW5lIFJYRF9FUlJfTk9fUkVTT1VSQ0VTCQkweDAwODAwMDAwCisjZGVmaW5lIFJYRF9FUlJfSFVHRV9GUkFNRQkJMHgwMTAwMDAwMAorI2RlZmluZSBSWERfRVJSX01BU0sJCQkweGZmZmYwMDAwCisKKwl1aW50MzJfdAkJCXJlc2VydmVkOworCXVpbnQzMl90CQkJb3BhcXVlOworI2RlZmluZSBSWERfT1BBUVVFX0lOREVYX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgUlhEX09QQVFVRV9JTkRFWF9TSElGVAkJMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfU1RECQkweDAwMDEwMDAwCisjZGVmaW5lIFJYRF9PUEFRVUVfUklOR19KVU1CTwkJMHgwMDAyMDAwMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfTUlOSQkJMHgwMDA0MDAwMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfTUFTSwkJMHgwMDA3MDAwMAorfTsKKworc3RydWN0IHRnM19leHRfcnhfYnVmZmVyX2Rlc2MgeworCXN0cnVjdCB7CisJCXVpbnQzMl90CQlhZGRyX2hpOworCQl1aW50MzJfdAkJYWRkcl9sbzsKKwl9CQkJCWFkZHJsaXN0WzNdOworCXVpbnQzMl90CQkJbGVuMl9sZW4xOworCXVpbnQzMl90CQkJcmVzdl9sZW4zOworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MJc3RkOworfTsKKworLyogV2Ugb25seSB1c2UgdGhpcyB3aGVuIHRlc3Rpbmcgb3V0IHRoZSBETUEgZW5naW5lCisgKiBhdCBwcm9iZSB0aW1lLiAgVGhpcyBpcyB0aGUgaW50ZXJuYWwgZm9ybWF0IG9mIGJ1ZmZlcgorICogZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgY2hpcCBhdCBOSUNfU1JBTV9ETUFfREVTQ1MuCisgKi8KK3N0cnVjdCB0ZzNfaW50ZXJuYWxfYnVmZmVyX2Rlc2MgeworCXVpbnQzMl90CQkJYWRkcl9oaTsKKwl1aW50MzJfdAkJCWFkZHJfbG87CisJdWludDMyX3QJCQluaWNfbWJ1ZjsKKwkvKiBYWFggRklYIFRISVMgKi8KKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdWludDE2X3QJCQljcWlkX3NxaWQ7CisJdWludDE2X3QJCQlsZW47CisjZWxzZQorCXVpbnQxNl90CQkJbGVuOworCXVpbnQxNl90CQkJY3FpZF9zcWlkOworI2VuZGlmCisJdWludDMyX3QJCQlmbGFnczsKKwl1aW50MzJfdAkJCV9fY29va2llMTsKKwl1aW50MzJfdAkJCV9fY29va2llMjsKKwl1aW50MzJfdAkJCV9fY29va2llMzsKK307CisKKyNkZWZpbmUgVEczX0hXX1NUQVRVU19TSVpFCQkweDUwCitzdHJ1Y3QgdGczX2h3X3N0YXR1cyB7CisJdWludDMyX3QJCQlzdGF0dXM7CisjZGVmaW5lIFNEX1NUQVRVU19VUERBVEVECQkweDAwMDAwMDAxCisjZGVmaW5lIFNEX1NUQVRVU19MSU5LX0NIRwkJMHgwMDAwMDAwMgorI2RlZmluZSBTRF9TVEFUVVNfRVJST1IJCQkweDAwMDAwMDA0CisKKwl1aW50MzJfdAkJCXN0YXR1c190YWc7CisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdWludDE2X3QJCQlyeF9jb25zdW1lcjsKKwl1aW50MTZfdAkJCXJ4X2p1bWJvX2NvbnN1bWVyOworI2Vsc2UKKwl1aW50MTZfdAkJCXJ4X2p1bWJvX2NvbnN1bWVyOworCXVpbnQxNl90CQkJcnhfY29uc3VtZXI7CisjZW5kaWYKKworI2lmIF9fQllURV9PUkRFUiA9PSAgX19CSUdfRU5ESUFOCisJdWludDE2X3QJCQlyZXNlcnZlZDsKKwl1aW50MTZfdAkJCXJ4X21pbmlfY29uc3VtZXI7CisjZWxzZQorCXVpbnQxNl90CQkJcnhfbWluaV9jb25zdW1lcjsKKwl1aW50MTZfdAkJCXJlc2VydmVkOworI2VuZGlmCisJc3RydWN0IHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gIF9fQklHX0VORElBTgorCQl1aW50MTZfdAkJdHhfY29uc3VtZXI7CisJCXVpbnQxNl90CQlyeF9wcm9kdWNlcjsKKyNlbHNlCisJCXVpbnQxNl90CQlyeF9wcm9kdWNlcjsKKwkJdWludDE2X3QJCXR4X2NvbnN1bWVyOworI2VuZGlmCisJfQkJCQlpZHhbMTZdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGhpZ2gsIGxvdzsKK30gdGczX3N0YXQ2NF90OworCitzdHJ1Y3QgdGczX2h3X3N0YXRzIHsKKwl1aW50OF90CQkJCV9fcmVzZXJ2ZWQwWzB4NDAwLTB4MzAwXTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIE1BQy4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlyeF9vY3RldHM7CisJdWludDY0X3QJCQlfX3Jlc2VydmVkMTsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9mcmFnbWVudHM7CisJdGczX3N0YXQ2NF90CQkJcnhfdWNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9tY2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4X2JjYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfZmNzX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9hbGlnbl9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfeG9uX3BhdXNlX3JjdmQ7CisJdGczX3N0YXQ2NF90CQkJcnhfeG9mZl9wYXVzZV9yY3ZkOworCXRnM19zdGF0NjRfdAkJCXJ4X21hY19jdHJsX3JjdmQ7CisJdGczX3N0YXQ2NF90CQkJcnhfeG9mZl9lbnRlcmVkOworCXRnM19zdGF0NjRfdAkJCXJ4X2ZyYW1lX3Rvb19sb25nX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9qYWJiZXJzOworCXRnM19zdGF0NjRfdAkJCXJ4X3VuZGVyc2l6ZV9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4X2luX2xlbmd0aF9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfb3V0X2xlbmd0aF9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfNjRfb3JfbGVzc19vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzY1X3RvXzEyN19vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzEyOF90b18yNTVfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8yNTZfdG9fNTExX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfNTEyX3RvXzEwMjNfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8xMDI0X3RvXzE1MjJfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8xNTIzX3RvXzIwNDdfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8yMDQ4X3RvXzQwOTVfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF80MDk2X3RvXzgxOTFfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF84MTkyX3RvXzkwMjJfb2N0ZXRfcGFja2V0czsKKworCXVpbnQ2NF90CQkJX191bnVzZWQwWzM3XTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBUcmFuc21pdCBNQUMuICovCisJdGczX3N0YXQ2NF90CQkJdHhfb2N0ZXRzOworCXVpbnQ2NF90CQkJX19yZXNlcnZlZDI7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF94b25fc2VudDsKKwl0ZzNfc3RhdDY0X3QJCQl0eF94b2ZmX3NlbnQ7CisJdGczX3N0YXQ2NF90CQkJdHhfZmxvd19jb250cm9sOworCXRnM19zdGF0NjRfdAkJCXR4X21hY19lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJdHhfc2luZ2xlX2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfbXVsdF9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X2RlZmVycmVkOworCXVpbnQ2NF90CQkJX19yZXNlcnZlZDM7CisJdGczX3N0YXQ2NF90CQkJdHhfZXhjZXNzaXZlX2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfbGF0ZV9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMnRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfM3RpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfNHRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfNXRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfNnRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfN3RpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfOHRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfOXRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTB0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzExdGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xMnRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTN0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzE0dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xNXRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X3VjYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJdHhfbWNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9iY2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXR4X2NhcnJpZXJfc2Vuc2VfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXR4X2Rpc2NhcmRzOworCXRnM19zdGF0NjRfdAkJCXR4X2Vycm9yczsKKworCXVpbnQ2NF90CQkJX191bnVzZWQxWzMxXTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIExpc3QgUGxhY2VtZW50LiAqLworCXRnM19zdGF0NjRfdAkJCUNPU19yeF9wYWNrZXRzWzE2XTsKKwl0ZzNfc3RhdDY0X3QJCQlDT1NfcnhfZmlsdGVyX2Ryb3BwZWQ7CisJdGczX3N0YXQ2NF90CQkJZG1hX3dyaXRlcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCWRtYV93cml0ZV9wcmlvcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCXJ4YmRzX2VtcHR5OworCXRnM19zdGF0NjRfdAkJCXJ4X2Rpc2NhcmRzOworCXRnM19zdGF0NjRfdAkJCXJ4X2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF90aHJlc2hvbGRfaGl0OworCisJdWludDY0X3QJCQlfX3VudXNlZDJbOV07CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgU2VuZCBEYXRhIEluaXRpYXRvci4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlDT1Nfb3V0X3BhY2tldHNbMTZdOworCXRnM19zdGF0NjRfdAkJCWRtYV9yZWFkcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCWRtYV9yZWFkX3ByaW9xX2Z1bGw7CisJdGczX3N0YXQ2NF90CQkJdHhfY29tcF9xdWV1ZV9mdWxsOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IEhvc3QgQ29hbGVzY2luZy4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlyaW5nX3NldF9zZW5kX3Byb2RfaW5kZXg7CisJdGczX3N0YXQ2NF90CQkJcmluZ19zdGF0dXNfdXBkYXRlOworCXRnM19zdGF0NjRfdAkJCW5pY19pcnFzOworCXRnM19zdGF0NjRfdAkJCW5pY19hdm9pZGVkX2lycXM7CisJdGczX3N0YXQ2NF90CQkJbmljX3R4X3RocmVzaG9sZF9oaXQ7CisKKwl1aW50OF90CQkJCV9fcmVzZXJ2ZWQ0WzB4YjAwLTB4OWMwXTsKK307CisKK2VudW0gcGh5X2xlZF9tb2RlIHsKKwlsZWRfbW9kZV9hdXRvLAorCWxlZF9tb2RlX3RocmVlX2xpbmssCisJbGVkX21vZGVfbGluazEwCit9OworCisjaWYgMAorLyogJ21hcHBpbmcnIGlzIHN1cGVyZmx1b3VzIGFzIHRoZSBjaGlwIGRvZXMgbm90IHdyaXRlIGludG8KKyAqIHRoZSB0eC9yeCBwb3N0IHJpbmdzIHNvIHdlIGNvdWxkIGp1c3QgZmV0Y2ggaXQgZnJvbSB0aGVyZS4KKyAqIEJ1dCB0aGUgY2FjaGUgYmVoYXZpb3IgaXMgYmV0dGVyIGhvdyB3ZSBhcmUgZG9pbmcgaXQgbm93LgorICovCitzdHJ1Y3QgcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJCSpza2I7CisJREVDTEFSRV9QQ0lfVU5NQVBfQUREUihtYXBwaW5nKQorfTsKKworc3RydWN0IHR4X3JpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYJCQkqc2tiOworCURFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwcGluZykKKwl1aW50MzJfdAkJCXByZXZfdmxhbl90YWc7Cit9OworI2VuZGlmCisKK3N0cnVjdCB0ZzNfY29uZmlnX2luZm8geworCXVpbnQzMl90CQkJZmxhZ3M7Cit9OworCitzdHJ1Y3QgdGczX2xpbmtfY29uZmlnIHsKKwkvKiBEZXNjcmliZXMgd2hhdCB3ZSdyZSB0cnlpbmcgdG8gZ2V0LiAqLworCXVpbnQzMl90CQkJYWR2ZXJ0aXNpbmc7CisjaWYgMAorCXVpbnQxNl90CQkJc3BlZWQ7CisJdWludDhfdAkJCQlkdXBsZXg7CisJdWludDhfdAkJCQlhdXRvbmVnOworI2RlZmluZSBTUEVFRF9JTlZBTElECQkweGZmZmYKKyNkZWZpbmUgRFVQTEVYX0lOVkFMSUQJCTB4ZmYKKyNkZWZpbmUgQVVUT05FR19JTlZBTElECQkweGZmCisjZW5kaWYKKworCS8qIERlc2NyaWJlcyB3aGF0IHdlIGFjdHVhbGx5IGhhdmUuICovCisJdWludDhfdAkJCQlhY3RpdmVfc3BlZWQ7CisJdWludDhfdAkJCQlhY3RpdmVfZHVwbGV4OworCisJLyogV2hlbiB3ZSBnbyBpbiBhbmQgb3V0IG9mIGxvdyBwb3dlciBtb2RlIHdlIG5lZWQKKwkgKiB0byBzd2FwIHdpdGggdGhpcyBzdGF0ZS4KKwkgKi8KKyNpZiAwCisJaW50CQkJCXBoeV9pc19sb3dfcG93ZXI7CisJdWludDE2X3QJCQlvcmlnX3NwZWVkOworCXVpbnQ4X3QJCQkJb3JpZ19kdXBsZXg7CisJdWludDhfdAkJCQlvcmlnX2F1dG9uZWc7CisjZW5kaWYKK307CisKK3N0cnVjdCB0ZzNfYnVmbWdyX2NvbmZpZyB7CisJdWludDMyX3QJCW1idWZfcmVhZF9kbWFfbG93X3dhdGVyOworCXVpbnQzMl90CQltYnVmX21hY19yeF9sb3dfd2F0ZXI7CisJdWludDMyX3QJCW1idWZfaGlnaF93YXRlcjsKKworCXVpbnQzMl90CQltYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibzsKKwl1aW50MzJfdAkJbWJ1Zl9tYWNfcnhfbG93X3dhdGVyX2p1bWJvOworCXVpbnQzMl90CQltYnVmX2hpZ2hfd2F0ZXJfanVtYm87CisKKwl1aW50MzJfdAkJZG1hX2xvd193YXRlcjsKKwl1aW50MzJfdAkJZG1hX2hpZ2hfd2F0ZXI7Cit9OworCitzdHJ1Y3QgdGczIHsKKyNpZiAwCisJLyogU01QIGxvY2tpbmcgc3RyYXRlZ3k6CisJICoKKwkgKiBsb2NrOiBIZWxkIGR1cmluZyBhbGwgb3BlcmF0aW9ucyBleGNlcHQgVFggcGFja2V0CisJICogICAgICAgcHJvY2Vzc2luZy4KKwkgKgorCSAqIHR4X2xvY2s6IEhlbGQgZHVyaW5nIHRnM19zdGFydF94bWl0eyxfNGdidWd9IGFuZCB0ZzNfdHgKKwkgKgorCSAqIElmIHlvdSB3YW50IHRvIHNodXQgdXAgYWxsIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIHlvdSBtdXN0CisJICogYWNxdWlyZSBib3RoIGxvY2tzLCAnbG9jaycgdGFrZW4gYmVmb3JlICd0eF9sb2NrJy4gIElSUXMgbXVzdAorCSAqIGJlIGRpc2FibGVkIHRvIHRha2UgJ2xvY2snIGJ1dCBvbmx5IHNvZnRpcnEgZGlzYWJsaW5nIGlzCisJICogbmVjZXNzYXJ5IGZvciBhY3F1aXNpdGlvbiBvZiAndHhfbG9jaycuCisJICovCisJc3BpbmxvY2tfdAkJCWxvY2s7CisJc3BpbmxvY2tfdAkJCXR4X2xvY2s7CisjZW5kaWYKKworCXVpbnQzMl90CQkJdHhfcHJvZDsKKyNpZiAwCisJdWludDMyX3QJCQl0eF9jb25zOworI2VuZGlmCisJdWludDMyX3QJCQlyeF9yY2JfcHRyOworCXVpbnQzMl90CQkJcnhfc3RkX3B0cjsKKyNpZiAwCisJdWludDMyX3QJCQlyeF9qdW1ib19wdHI7CisJc3BpbmxvY2tfdAkJCWluZGlyZWN0X2xvY2s7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkJbmV0X3N0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCQluZXRfc3RhdHNfcHJldjsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcJCQlwaHlfY3JjX2Vycm9yczsKKworI2lmIDAKKwl1aW50MzJfdAkJCXJ4X29mZnNldDsKKyNlbmRpZgorCXVpbnQzMl90CQkJdGczX2ZsYWdzOworI2lmIDAKKyNkZWZpbmUgVEczX0ZMQUdfSE9TVF9UWERTCQkweDAwMDAwMDAxCisjZW5kaWYKKyNkZWZpbmUgVEczX0ZMQUdfVFhEX01CT1hfSFdCVUcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVEczX0ZMQUdfUlhfQ0hFQ0tTVU1TCQkweDAwMDAwMDA0CisjZGVmaW5lIFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRwkweDAwMDAwMDA4CisjZGVmaW5lIFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQJMHgwMDAwMDAxMAorI2RlZmluZSBURzNfRkxBR19FTkFCTEVfQVNGCQkweDAwMDAwMDIwCisjZGVmaW5lIFRHM19GTEFHXzU3MDFfUkVHX1dSSVRFX0JVRwkweDAwMDAwMDQwCisjZGVmaW5lIFRHM19GTEFHX1BPTExfU0VSREVTCQkweDAwMDAwMDgwCisjZGVmaW5lIFRHM19GTEFHX01CT1hfV1JJVEVfUkVPUkRFUgkweDAwMDAwMTAwCisjZGVmaW5lIFRHM19GTEFHX1BDSVhfVEFSR0VUX0hXQlVHCTB4MDAwMDAyMDAKKyNkZWZpbmUgVEczX0ZMQUdfV09MX1NQRUVEXzEwME1CCTB4MDAwMDA0MDAKKyNkZWZpbmUgVEczX0ZMQUdfV09MX0VOQUJMRQkJMHgwMDAwMDgwMAorI2RlZmluZSBURzNfRkxBR19FRVBST01fV1JJVEVfUFJPVAkweDAwMDAxMDAwCisjZGVmaW5lIFRHM19GTEFHX05WUkFNCQkJMHgwMDAwMjAwMAorI2RlZmluZSBURzNfRkxBR19OVlJBTV9CVUZGRVJFRAkJMHgwMDAwNDAwMAorI2RlZmluZSBURzNfRkxBR19SWF9QQVVTRQkJMHgwMDAwODAwMAorI2RlZmluZSBURzNfRkxBR19UWF9QQVVTRQkJMHgwMDAxMDAwMAorI2RlZmluZSBURzNfRkxBR19QQ0lYX01PREUJCTB4MDAwMjAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUENJX0hJR0hfU1BFRUQJCTB4MDAwNDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUENJXzMyQklUCQkweDAwMDgwMDAwCisjZGVmaW5lIFRHM19GTEFHX05PX1RYX1BTRVVET19DU1VNCTB4MDAxMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfTk9fUlhfUFNFVURPX0NTVU0JMHgwMDIwMDAwMAorI2RlZmluZSBURzNfRkxBR19TRVJERVNfV09MX0NBUAkJMHgwMDQwMDAwMAorI2RlZmluZSBURzNfRkxBR19KVU1CT19FTkFCTEUJCTB4MDA4MDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfMTBfMTAwX09OTFkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUEFVU0VfQVVUT05FRwkJMHgwMjAwMDAwMAorI2RlZmluZSBURzNfRkxBR19QQVVTRV9SWAkJMHgwNDAwMDAwMAorI2RlZmluZSBURzNfRkxBR19QQVVTRV9UWAkJMHgwODAwMDAwMAorI2RlZmluZSBURzNfRkxBR19CUk9LRU5fQ0hFQ0tTVU1TCTB4MTAwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfR09UX1NFUkRFU19GTE9XQ1RMCTB4MjAwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfU1BMSVRfTU9ERQkJMHg0MDAwMDAwMAorI2RlZmluZSBURzNfRkxBR19JTklUX0NPTVBMRVRFCQkweDgwMDAwMDAwCisKKwl1aW50MzJfdAkJCXRnM19mbGFnczI7CisjZGVmaW5lIFRHM19GTEcyX1JFU1RBUlRfVElNRVIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVEczX0ZMRzJfU1VOXzU3MDQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQJMHgwMDAwMDAwNAorI2RlZmluZSBURzNfRkxHMl9JU181Nzg4CQkweDAwMDAwMDA4CisjZGVmaW5lIFRHM19GTEcyX01BWF9SWFBFTkRfNjQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVEczX0ZMRzJfVFNPX0NBUEFCTEUJCTB4MDAwMDAwMjAKKyAgLy8gQWxmOiBIb3BlIEknbSBub3QgYnJlYWtpbmcgYW55dGhpbmcgaGVyZSAhCisjZGVmaW5lIFRHM19GTEcyX1BDSV9FWFBSRVNTICAgICAgICAgICAgMHgwMDAwMDA0MAorCisKKworCXVpbnQzMl90CQkJc3BsaXRfbW9kZV9tYXhfcmVxczsKKyNkZWZpbmUgU1BMSVRfTU9ERV81NzA0X01BWF9SRVEJCTMKKworI2lmIDAKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJdGltZXI7CisJdWludDE2X3QJCQl0aW1lcl9jb3VudGVyOworCXVpbnQxNl90CQkJdGltZXJfbXVsdGlwbGllcjsKKwl1aW50MzJfdAkJCXRpbWVyX29mZnNldDsKKwl1aW50MTZfdAkJCWFzZl9jb3VudGVyOworCXVpbnQxNl90CQkJYXNmX211bHRpcGxpZXI7CisjZW5kaWYKKworCXN0cnVjdCB0ZzNfbGlua19jb25maWcJCWxpbmtfY29uZmlnOworCXN0cnVjdCB0ZzNfYnVmbWdyX2NvbmZpZwlidWZtZ3JfY29uZmlnOworCisjaWYgMAorCXVpbnQzMl90CQkJcnhfcGVuZGluZzsKKwl1aW50MzJfdAkJCXJ4X2p1bWJvX3BlbmRpbmc7CisJdWludDMyX3QJCQl0eF9wZW5kaW5nOworI2VuZGlmCisKKwkvKiBjYWNoZSBoL3cgdmFsdWVzLCBvZnRlbiBwYXNzZWQgc3RyYWlnaHQgdG8gaC93ICovCisJdWludDMyX3QJCQlyeF9tb2RlOworCXVpbnQzMl90CQkJdHhfbW9kZTsKKwl1aW50MzJfdAkJCW1hY19tb2RlOworCXVpbnQzMl90CQkJbWlfbW9kZTsKKwl1aW50MzJfdAkJCW1pc2NfaG9zdF9jdHJsOworCXVpbnQzMl90CQkJZ3JjX21vZGU7CisJdWludDMyX3QJCQlncmNfbG9jYWxfY3RybDsKKwl1aW50MzJfdAkJCWRtYV9yd2N0cmw7CisjaWYgMAorCXVpbnQzMl90CQkJY29hbGVzY2VfbW9kZTsKKyNlbmRpZgorCisJLyogUENJIGJsb2NrICovCisJdWludDE2X3QJCQlwY2lfY2hpcF9yZXZfaWQ7CisjaWYgMAorCXVpbnQ4X3QJCQkJcGNpX2NhY2hlbGluZV9zejsKKwl1aW50OF90CQkJCXBjaV9sYXRfdGltZXI7CisJdWludDhfdAkJCQlwY2lfaGRyX3R5cGU7CisJdWludDhfdAkJCQlwY2lfYmlzdDsKKyNlbmRpZgorCXVpbnQzMl90CQkJcGNpX2NmZ19zdGF0ZVs2NCAvIHNpemVvZih1aW50MzJfdCldOworCisJaW50CQkJCXBtX2NhcDsKKworCS8qIFBIWSBpbmZvICovCisJdWludDMyX3QJCQlwaHlfaWQ7CisjZGVmaW5lIFBIWV9JRF9NQVNLCQkJMHhmZmZmZmZmMAorI2RlZmluZSBQSFlfSURfQkNNNTQwMAkJCTB4NjAwMDgwNDAKKyNkZWZpbmUgUEhZX0lEX0JDTTU0MDEJCQkweDYwMDA4MDUwCisjZGVmaW5lIFBIWV9JRF9CQ001NDExCQkJMHg2MDAwODA3MAorI2RlZmluZSBQSFlfSURfQkNNNTcwMQkJCTB4NjAwMDgxMTAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3MDMJCQkweDYwMDA4MTYwCisjZGVmaW5lIFBIWV9JRF9CQ001NzA0CQkJMHg2MDAwODE5MAorI2RlZmluZSBQSFlfSURfQkNNNTcwNQkJCTB4NjAwMDgxYTAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3NTAJCQkweDYwMDA4MTgwCisjZGVmaW5lIFBIWV9JRF9CQ001Nzg3CQkJMHhiYzA1MGNlMAorI2RlZmluZSBQSFlfSURfQkNNODAwMgkJCTB4NjAwMTAxNDAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3NTEJCQkweDAwMjA2MTgwCisjZGVmaW5lIFBIWV9JRF9TRVJERVMJCQkweGZlZWRiZWUwCisjZGVmaW5lIFBIWV9JRF9JTlZBTElECQkJMHhmZmZmZmZmZgorI2RlZmluZSBQSFlfSURfUkVWX01BU0sJCQkweDAwMDAwMDBmCisjZGVmaW5lIFBIWV9SRVZfQkNNNTQwMV9CMAkJMHgxCisjZGVmaW5lIFBIWV9SRVZfQkNNNTQwMV9CMgkJMHgzCisjZGVmaW5lIFBIWV9SRVZfQkNNNTQwMV9DMAkJMHg2CisjZGVmaW5lIFBIWV9SRVZfQkNNNTQxMV9YMAkJMHgxIC8qIEZvdW5kIG9uIE5ldGdlYXIgR0EzMDJUICovCisKKwllbnVtIHBoeV9sZWRfbW9kZQkJbGVkX21vZGU7CisKKwljaGFyCQkJCWJvYXJkX3BhcnRfbnVtYmVyWzI0XTsKKwl1aW50MzJfdAkJCW5pY19zcmFtX2RhdGFfY2ZnOworCXVpbnQzMl90CQkJcGNpX2Nsb2NrX2N0cmw7CisjaWYgMAorCXN0cnVjdCBwY2lfZGV2aWNlCQkqcGRldl9wZWVyOworI2VuZGlmCisKKwkvKiBUaGlzIG1hY3JvIGFzc3VtZXMgdGhlIHBhc3NlZCBQSFkgSUQgaXMgYWxyZWFkeSBtYXNrZWQKKwkgKiB3aXRoIFBIWV9JRF9NQVNLLgorCSAqLworI2RlZmluZSBLTk9XTl9QSFlfSUQoWCkJCVwKKwkoKFgpID09IFBIWV9JRF9CQ001NDAwIHx8IChYKSA9PSBQSFlfSURfQkNNNTQwMSB8fCBcCisJIChYKSA9PSBQSFlfSURfQkNNNTQxMSB8fCAoWCkgPT0gUEhZX0lEX0JDTTU3MDEgfHwgXAorCSAoWCkgPT0gUEhZX0lEX0JDTTU3MDMgfHwgKFgpID09IFBIWV9JRF9CQ001NzA0IHx8IFwKKwkgKFgpID09IFBIWV9JRF9CQ001NzA1IHx8IChYKSA9PSBQSFlfSURfQkNNNTc1MCB8fCBcCisJIChYKSA9PSBQSFlfSURfQkNNNTc1MSB8fCAoWCkgPT0gUEhZX0lEX0JDTTU3ODcgfHwgXAorCSAoWCkgPT0gUEhZX0lEX0JDTTgwMDIgfHwgKFgpID09IFBIWV9JRF9TRVJERVMpCisKKwl1bnNpZ25lZCBsb25nCQkJcmVnczsKKwlzdHJ1Y3QgcGNpX2RldmljZQkJKnBkZXY7CisJc3RydWN0IG5pYwkJCSpuaWM7CisjaWYgMAorCXN0cnVjdCBuZXRfZGV2aWNlCQkqZGV2OworI2VuZGlmCisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKKwlzdHJ1Y3Qgdmxhbl9ncm91cAkJKnZsZ3JwOworI2VuZGlmCisKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjCSpyeF9zdGQ7CisjaWYgMAorCXN0cnVjdCByaW5nX2luZm8JCSpyeF9zdGRfYnVmZmVyczsKKwlkbWFfYWRkcl90CQkJcnhfc3RkX21hcHBpbmc7CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYwkqcnhfanVtYm87CisJc3RydWN0IHJpbmdfaW5mbwkJKnJ4X2p1bWJvX2J1ZmZlcnM7CisJZG1hX2FkZHJfdAkJCXJ4X2p1bWJvX21hcHBpbmc7CisjZW5kaWYKKworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MJKnJ4X3JjYjsKKyNpZiAwCisJZG1hX2FkZHJfdAkJCXJ4X3JjYl9tYXBwaW5nOworI2VuZGlmCisKKwkvKiBUWCBkZXNjcyBhcmUgb25seSB1c2VkIGlmIFRHM19GTEFHX0hPU1RfVFhEUyBpcyBzZXQuICovCisJc3RydWN0IHRnM190eF9idWZmZXJfZGVzYwkqdHhfcmluZzsKKyNpZiAwCisJc3RydWN0IHR4X3JpbmdfaW5mbwkJKnR4X2J1ZmZlcnM7CisJZG1hX2FkZHJfdAkJCXR4X2Rlc2NfbWFwcGluZzsKKyNlbmRpZgorCisJc3RydWN0IHRnM19od19zdGF0dXMJCSpod19zdGF0dXM7CisjaWYgMAorCWRtYV9hZGRyX3QJCQlzdGF0dXNfbWFwcGluZzsKKyNlbmRpZgorI2lmIDAKKwl1aW50MzJfdAkJCW1zZ19lbmFibGU7CisjZW5kaWYKKworCXN0cnVjdCB0ZzNfaHdfc3RhdHMJCSpod19zdGF0czsKKyNpZiAwCisJZG1hX2FkZHJfdAkJCXN0YXRzX21hcHBpbmc7CisjZW5kaWYKKworCWludAkJCQljYXJyaWVyX29rOworCXVpbnQxNl90CQkJc3Vic3lzdGVtX3ZlbmRvcjsKKwl1aW50MTZfdAkJCXN1YnN5c3RlbV9kZXZpY2U7Cit9OworCisjZW5kaWYgLyogIShfVDNfSCkgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3RsYW4uYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3RsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWYwNGZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdGxhbi5jCkBAIC0wLDAgKzEsMTcyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgIHRsYW4uYyAtLSBFdGhlcmJvb3QgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIFRodW5kZXJMQU4KKyogICAgV3JpdHRlbiAyMDAzLTIwMDMgYnkgVGltb3RoeSBMZWdnZSA8dGxlZ2dlQHJvZ2Vycy5jb20+CisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAgICBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYmFzZWQgb246CisqCWxhbi5jOiBMaW51eCBUaHVuZGVyTGFuIERyaXZlcjoKKyoKKyoJYnkgSmFtZXMgQmFua3MKKyoKKyogIAkoQykgMTk5Ny0xOTk4IENhbGRlcmEsIEluYy4KKyoJKEMpIDE5OTggSmFtZXMgQmFua3MKKyoJKEMpIDE5OTktMjAwMSBUb3JiZW4gTWF0aGlhc2VuCisqCShDKSAyMDAyIFNhbXVlbCBDaGVzc21hbgorKgorKiAgICBSRVZJU0lPTiBISVNUT1JZOgorKiAgICA9PT09PT09PT09PT09PT09CisqICAgIHYxLjAJMDctMDgtMjAwMwl0aW1sZWdnZQlJbml0aWFsIG5vdCBxdWl0ZSB3b3JraW5nIHZlcnNpb24KKyogICAgdjEuMQkwNy0yNy0yMDAzCXRpbWxlZ2dlCVN5bmMgNS4wIGFuZCA1LjEgdmVyc2lvbnMKKyogICAgdjEuMgkwOC0xOS0yMDAzCXRpbWxlZ2dlCUltcGxlbWVudCBNdWx0aWNhc3QgU3VwcG9ydAorKiAgICB2MS4zCTA4LTIzLTIwMDMJdGltbGVnZ2UJRml4IHRoZSB0cmFuc21pdCBGdW5jdGlvbgorKiAgICB2MS40CTAxLTE3LTIwMDQJdGltbGVnZ2UJSW5pdGlhbCBkcml2ZXIgb3V0cHV0IGNsZWFudXAgICAgCisqICAgIAorKiAgICBJbmRlbnQgT3B0aW9uczogaW5kZW50IC1rciAtaTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8bWlpLmg+CisjaW5jbHVkZSAidGxhbi5oIgorCisjZGVmaW5lIGRydl92ZXJzaW9uICJ2MS40IgorI2RlZmluZSBkcnZfZGF0ZSAiMDEtMTctMjAwNCIKKworLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLworI2RlZmluZSBIWiAxMDAKKyNkZWZpbmUgVFhfVElNRV9PVVQJICAoNipIWikKKworLyogQ29uZGVuc2VkIG9wZXJhdGlvbnMgZm9yIHJlYWRhYmlsaXR5LiAqLworI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhhZGRyKSkKKyNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKSAgYnVzX3RvX3ZpcnQobGUzMl90b19jcHUoYWRkcikpCisKK3N0YXRpYyB2b2lkIFRMYW5fUmVzZXRMaXN0cyhzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpOworc3RhdGljIHZvaWQgVExhbl9SZXNldEFkYXB0ZXIoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKTsKK3N0YXRpYyB2b2lkIFRMYW5fRmluaXNoUmVzZXQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKTsKKworc3RhdGljIHZvaWQgVExhbl9FZVNlbmRTdGFydCh1MTYpOworc3RhdGljIGludCBUTGFuX0VlU2VuZEJ5dGUodTE2LCB1OCwgaW50KTsKK3N0YXRpYyB2b2lkIFRMYW5fRWVSZWNlaXZlQnl0ZSh1MTYsIHU4ICosIGludCk7CitzdGF0aWMgaW50IFRMYW5fRWVSZWFkQnl0ZSh1MTYgaW9fYmFzZSwgdTgsIHU4ICopOworCitzdGF0aWMgdm9pZCBUTGFuX1BoeURldGVjdChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgVExhbl9QaHlQb3dlckRvd24oc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIFRMYW5fUGh5UG93ZXJVcChzdHJ1Y3QgbmljICpuaWMpOworCisKK3N0YXRpYyB2b2lkIFRMYW5fU2V0TWFjKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IGFyZWcsIHVuc2lnbmVkIGNoYXIgKm1hYyk7CisKK3N0YXRpYyB2b2lkIFRMYW5fUGh5UmVzZXQoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIFRMYW5fUGh5U3RhcnRMaW5rKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBUTGFuX1BoeUZpbmlzaEF1dG9OZWcoc3RydWN0IG5pYyAqbmljKTsKKworI2lmZGVmIE1PTklUT1IKK3N0YXRpYyB2b2lkIFRMYW5fUGh5TW9uaXRvcihzdHJ1Y3QgbmljICpuaWMpOworI2VuZGlmCisKKworc3RhdGljIHZvaWQgcmVmaWxsX3J4KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCk7CisKK3N0YXRpYyBpbnQgVExhbl9NaWlSZWFkUmVnKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdTE2LCB1MTYsIHUxNiAqKTsKK3N0YXRpYyB2b2lkIFRMYW5fTWlpU2VuZERhdGEodTE2LCB1MzIsIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIFRMYW5fTWlpU3luYyh1MTYpOworc3RhdGljIHZvaWQgVExhbl9NaWlXcml0ZVJlZyhzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIHUxNiwgdTE2LCB1MTYpOworCisKK3N0YXRpYyBjb25zdCBjaGFyICptZWRpYVtdID0geworCSIxMEJhc2VULUhEICIsICIxMEJhc2VULUZEICIsICIxMDBiYXNlVHgtSEQgIiwKKwkiMTAwYmFzZVR4LUZEIiwgIjEwMGJhc2VUNCIsIDAKK307CisKKy8qIFRoaXMgbXVjaCBtYXRjaCB0bGFuX3BjaV90YmxbXSEgICovCitlbnVtIHRsYW5fbmljcyB7CisJTkVURUwxMCA9IDAsIE5FVEVMMTAwID0gMSwgTkVURkxFWDNJID0gMiwgVEhVTkRFUiA9IDMsIE5FVEZMRVgzQiA9CisJICAgIDQsIE5FVEVMMTAwUEkgPSA1LAorCU5FVEVMMTAwRCA9IDYsIE5FVEVMMTAwSSA9IDcsIE9DMjE4MyA9IDgsIE9DMjMyNSA9IDksIE9DMjMyNiA9CisJICAgIDEwLCBORVRFTExJR0VOVF8xMF8xMDBfV1NfNTEwMCA9IDExLAorCU5FVEVMTElHRU5UXzEwX1QyID0gMTIKK307CisKK3N0cnVjdCBwY2lfaWRfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbmljX2lkOworCXN0cnVjdCBtYXRjaF9pbmZvIHsKKwkJdTMyIHBjaSwgcGNpX21hc2ssIHN1YnN5c3RlbSwgc3Vic3lzdGVtX21hc2s7CisJCXUzMiByZXZpc2lvbiwgcmV2aXNpb25fbWFzazsJLyogT25seSA4IGJpdHMuICovCisJfSBpZDsKKwl1MzIgZmxhZ3M7CisJdTE2IGFkZHJPZnM7CQkvKiBBZGRyZXNzIE9mZnNldCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfaWRfaW5mbyB0bGFuX3BjaV90YmxbXSA9IHsKKwl7IkNvbXBhcSBOZXRlbGxpZ2VudCAxMCBUIFBDSSBVVFAiLCBORVRFTDEwLAorCSB7MHhhZTM0MGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODN9LAorCXsiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBQQ0kgVVRQIiwgTkVURUwxMDAsCisJIHsweGFlMzIwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4M30sCisJeyJDb21wYXEgSW50ZWdyYXRlZCBOZXRGbGV4LTMvUCIsIE5FVEZMRVgzSSwKKwkgezB4YWUzNTBlMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfTk9ORSwgMHg4M30sCisJeyJDb21wYXEgTmV0RmxleC0zL1AiLCBUSFVOREVSLAorCSB7MHhmMTMwMGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZIHwgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSwgMHg4M30sCisJeyJDb21wYXEgTmV0RmxleC0zL1AiLCBORVRGTEVYM0IsCisJIHsweGYxNTAwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX05PTkUsIDB4ODN9LAorCXsiQ29tcGFxIE5ldGVsbGlnZW50IEludGVncmF0ZWQgMTAvMTAwIFRYIFVUUCIsIE5FVEVMMTAwUEksCisJIHsweGFlNDMwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4M30sCisJeyJDb21wYXEgTmV0ZWxsaWdlbnQgRHVhbCAxMC8xMDAgVFggUENJIFVUUCIsIE5FVEVMMTAwRCwKKwkgezB4YWU0MDBlMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfTk9ORSwgMHg4M30sCisJeyJDb21wYXEgTmV0ZWxsaWdlbnQgMTAvMTAwIFRYIEVtYmVkZGVkIFVUUCIsIE5FVEVMMTAwSSwKKwkgezB4YjAxMTBlMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfTk9ORSwgMHg4M30sCisJeyJPbGljb20gT0MtMjE4My8yMTg1IiwgT0MyMTgzLAorCSB7MHgwMDEzMTA4ZCwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwLCAweDgzfSwKKwl7Ik9saWNvbSBPQy0yMzI1IiwgT0MyMzI1LAorCSB7MHgwMDEyMTA4ZCwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZLCAweEY4fSwKKwl7Ik9saWNvbSBPQy0yMzI2IiwgT0MyMzI2LAorCSB7MHgwMDE0MTA4ZCwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwLCAweEY4fSwKKwl7IkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggVVRQIiwgTkVURUxMSUdFTlRfMTBfMTAwX1dTXzUxMDAsCisJIHsweGIwMzAwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4M30sCisJeyJDb21wYXEgTmV0ZWxsaWdlbnQgMTAgVC8yIFBDSSBVVFAvQ29heCIsIE5FVEVMTElHRU5UXzEwX1QyLAorCSB7MHhiMDEyMGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9OT05FLCAweDgzfSwKKwl7IkNvbXBhcSBOZXRGbGV4LTMvRSIsIDAsCS8qIEVJU0EgY2FyZCAqLworCSB7MCwgMCwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQgfCBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSB8CisJIFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFksIDB4ODN9LAorCXsiQ29tcGFxIE5ldEZsZXgtMy9FIiwgMCwJLyogRUlTQSBjYXJkICovCisJIHswLCAwLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4M30sCisJezAsIDAsCisJIHswLCAwLCAwLCAwLCAwLCAwfSwKKwkgMCwgMH0sCit9OworCitzdHJ1Y3QgVExhbkxpc3QgeworCXUzMiBmb3J3YXJkOworCXUxNiBjU3RhdDsKKwl1MTYgZnJhbWVTaXplOworCXN0cnVjdCB7CisJCXUzMiBjb3VudDsKKwkJdTMyIGFkZHJlc3M7CisJfSBidWZmZXJbVExBTl9CVUZGRVJTX1BFUl9MSVNUXTsKK307CisKK3N0cnVjdCB7CisJc3RydWN0IFRMYW5MaXN0IHR4X3JpbmdbVExBTl9OVU1fVFhfTElTVFNdOworCXVuc2lnbmVkIGNoYXIgdHhiW1RMQU5fTUFYX0ZSQU1FX1NJWkUgKiBUTEFOX05VTV9UWF9MSVNUU107CisJc3RydWN0IFRMYW5MaXN0IHJ4X3JpbmdbVExBTl9OVU1fUlhfTElTVFNdOworCXVuc2lnbmVkIGNoYXIgcnhiW1RMQU5fTUFYX0ZSQU1FX1NJWkUgKiBUTEFOX05VTV9SWF9MSVNUU107Cit9IHRsYW5fYnVmZmVycyBfX3NoYXJlZDsKKyNkZWZpbmUgdHhfcmluZyB0bGFuX2J1ZmZlcnMudHhfcmluZworI2RlZmluZSB0eGIgdGxhbl9idWZmZXJzLnR4YgorI2RlZmluZSByeF9yaW5nIHRsYW5fYnVmZmVycy5yeF9yaW5nCisjZGVmaW5lIHJ4YiB0bGFuX2J1ZmZlcnMucnhiCisKK3R5cGVkZWYgdTggVExhbkJ1ZmZlcltUTEFOX01BWF9GUkFNRV9TSVpFXTsKKworc3RhdGljIGludCBjaGlwX2lkeDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRMQU4gUHJpdmF0ZSBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHRsYW5fcHJpdmF0ZSB7CisJdW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkOwkvKiBQQ0kgVmVuZG9yIGNvZGUgKi8KKwl1bnNpZ25lZCBzaG9ydCBkZXZfaWQ7CS8qIFBDSSBEZXZpY2UgY29kZSAqLworCWNvbnN0IGNoYXIgKm5pY19uYW1lOworCXVuc2lnbmVkIGludCBjdXJfcngsIGRpcnR5X3J4OwkvKiBQcm9kdWNlci9jb25zdW1lciByaW5nIGluZGljaWVzICovCisJdW5zaWduZWQgcnhfYnVmX3N6OwkvKiBCYXNlZCBvbiBtdHUgKyBTbGFjayAqLworCXN0cnVjdCBUTGFuTGlzdCAqdHhMaXN0OworCXUzMiB0eEhlYWQ7CisJdTMyIHR4SW5Qcm9ncmVzczsKKwl1MzIgdHhUYWlsOworCWludCBlb2M7CisJdTMyIHBoeU9ubGluZTsKKwl1MzIgYXVpOworCXUzMiBkdXBsZXg7CisJdTMyIHBoeVsyXTsKKwl1MzIgcGh5TnVtOworCXUzMiBzcGVlZDsKKwl1OCB0bGFuUmV2OworCXU4IHRsYW5GdWxsRHVwbGV4OworCXU4IGxpbms7CisJdTggbmVnX2JlX3ZlcmJvc2U7Cit9IFRMYW5Qcml2YXRlSW5mbzsKKworc3RhdGljIHN0cnVjdCB0bGFuX3ByaXZhdGUgKnByaXY7CisKK3N0YXRpYyB1MzIgQkFTRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKglUTGFuX1Jlc2V0TGlzdHMKKyoKKyoJUmV0dXJuczoKKyoJCU5vdGhpbmcKKyoJUGFybXM6CisqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbGlzdAorKgkJCXN0dWN0dXJlcyB0byBiZSByZXNldC4KKyoKKyoJVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggbWFuYWdpbmcKKyoJdGhlIFRMQU4gbGlzdHMgdG8gdGhlaXIgaW5pdGlhbCB2YWx1ZXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgVExhbl9SZXNldExpc3RzKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKworCWludCBpOworCXN0cnVjdCBUTGFuTGlzdCAqbGlzdDsKKwlwcml2LT50eEhlYWQgPSAwOworCXByaXYtPnR4VGFpbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKykgeworCQlsaXN0ID0gJnR4X3JpbmdbaV07CisJCWxpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9VTlVTRUQ7CisJCWxpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gdmlydF90b19idXModHhiICsgCisJCQkJKGkgKiBUTEFOX01BWF9GUkFNRV9TSVpFKSk7IAorCQlsaXN0LT5idWZmZXJbMl0uY291bnQgPSAwOworCQlsaXN0LT5idWZmZXJbMl0uYWRkcmVzcyA9IDA7CisJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwl9CisKKwlwcml2LT5jdXJfcnggPSAwOworCXByaXYtPnJ4X2J1Zl9zeiA9IChUTEFOX01BWF9GUkFNRV9TSVpFKTsKKy8vCXByaXYtPnJ4X2hlYWRfZGVzYyA9ICZyeF9yaW5nWzBdOworCisJLyogSW5pdGlhbGl6ZSBhbGwgdGhlIFJ4IGRlc2NyaXB0b3JzICovCisJZm9yIChpID0gMDsgaSA8IFRMQU5fTlVNX1JYX0xJU1RTOyBpKyspIHsKKwkJcnhfcmluZ1tpXS5mb3J3YXJkID0gdmlydF90b19sZTMyZGVzYygmcnhfcmluZ1tpICsgMV0pOworCQlyeF9yaW5nW2ldLmNTdGF0ID0gVExBTl9DU1RBVF9SRUFEWTsKKwkJcnhfcmluZ1tpXS5mcmFtZVNpemUgPSBUTEFOX01BWF9GUkFNRV9TSVpFOworCQlyeF9yaW5nW2ldLmJ1ZmZlclswXS5jb3VudCA9CisJCSAgICBUTEFOX01BWF9GUkFNRV9TSVpFIHwgVExBTl9MQVNUX0JVRkZFUjsKKwkJcnhfcmluZ1tpXS5idWZmZXJbMF0uYWRkcmVzcyA9CisJCSAgICB2aXJ0X3RvX2xlMzJkZXNjKCZyeGJbaSAqIFRMQU5fTUFYX0ZSQU1FX1NJWkVdKTsKKwkJcnhfcmluZ1tpXS5idWZmZXJbMV0uY291bnQgPSAwOworCQlyeF9yaW5nW2ldLmJ1ZmZlclsxXS5hZGRyZXNzID0gMDsKKwl9CisKKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nICovCisJcnhfcmluZ1tpIC0gMV0uZm9yd2FyZCA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbMF0pOworCXByaXYtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkgKGkgLSBUTEFOX05VTV9SWF9MSVNUUyk7CisKK30gLyogVExhbl9SZXNldExpc3RzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJVExhbl9SZXNldAorKgorKglSZXR1cm5zOgorKgkJMAorKglQYXJtczoKKyoJCWRldglQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUgb2YgYWRhcHRlcgorKgkJCXRvIGJlIHJlc2V0LgorKgorKglUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgYWRhcHRlciBhbmQgaXQncyBwaHlzaWNhbAorKglkZXZpY2UuICBTZWUgQ2hhcC4gMywgcHAuIDktMTAgb2YgdGhlICJUaHVuZGVyTEFOCisqCVByb2dyYW1tZXIncyBHdWlkZSIgZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSB0cmllcyB0bworKglpbXBsZW1lbnQgd2hhdCBpcyBkZXRhaWxlZCB0aGVyZSwgdGhvdWdoIGFkanVzdG1lbnRzCisqCWhhdmUgYmVlbiBtYWRlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9SZXNldEFkYXB0ZXIoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCWludCBpOworCXUzMiBhZGRyOworCXUzMiBkYXRhOworCXU4IGRhdGE4OworCisJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBGQUxTRTsKKwlwcml2LT5waHlPbmxpbmUgPSAwOworLyogIDEuCUFzc2VydCByZXNldCBiaXQuICovCisKKwlkYXRhID0gaW5sKEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKwlkYXRhIHw9IFRMQU5fSENfQURfUlNUOworCW91dGwoZGF0YSwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCisJdWRlbGF5KDEwMDApOworCisvKiAgMi4JVHVybiBvZmYgaW50ZXJydXB0cy4gKCBQcm9iYWJseSBpc24ndCBuZWNlc3NhcnkgKSAqLworCisJZGF0YSA9IGlubChCQVNFICsgVExBTl9IT1NUX0NNRCk7CisJZGF0YSB8PSBUTEFOX0hDX0lOVF9PRkY7CisJb3V0bChkYXRhLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CisvKiAgMy4JQ2xlYXIgQVJFR3MgYW5kIEhBU0hzLiAqLworCisJZm9yIChpID0gVExBTl9BUkVHXzA7IGkgPD0gVExBTl9IQVNIXzI7IGkgKz0gNCkgeworCQlUTGFuX0Rpb1dyaXRlMzIoQkFTRSwgKHUxNikgaSwgMCk7CisJfQorCisvKiAgNC4JU2V0dXAgTmV0Q29uZmlnIHJlZ2lzdGVyLiAqLworCisJZGF0YSA9CisJICAgIFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47CisJVExhbl9EaW9Xcml0ZTE2KEJBU0UsIFRMQU5fTkVUX0NPTkZJRywgKHUxNikgZGF0YSk7CisKKy8qICA1LglMb2FkIExkX1RtciBhbmQgTGRfVGhyIGluIEhPU1RfQ01ELiAqLworCisJb3V0bChUTEFOX0hDX0xEX1RNUiB8IDB4M2YsIEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKwlvdXRsKFRMQU5fSENfTERfVEhSIHwgMHgwLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CisKKy8qICA2LglVbnJlc2V0IHRoZSBNSUkgYnkgc2V0dGluZyBOTVJTVCAoaW4gTmV0U2lvKSB0byAxLiAqLworCisJb3V0dyhUTEFOX05FVF9TSU8sIEJBU0UgKyBUTEFOX0RJT19BRFIpOworCWFkZHIgPSBCQVNFICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTk1SU1QsIGFkZHIpOworCisvKiAgNy4JU2V0dXAgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMuICovCisKKwlpZiAocHJpdi0+dGxhblJldiA+PSAweDMwKSB7CisJCWRhdGE4ID0gVExBTl9JRF9UWF9FT0MgfCBUTEFOX0lEX1JYX0VPQzsKKwkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9JTlRfRElTLCBkYXRhOCk7CisJfQorCVRMYW5fUGh5RGV0ZWN0KG5pYyk7CisJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTjsKKworCWlmICh0bGFuX3BjaV90YmxbY2hpcF9pZHhdLmZsYWdzICYgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSkgeworCQlkYXRhIHw9IFRMQU5fTkVUX0NGR19CSVQ7CisJCWlmIChwcml2LT5hdWkgPT0gMSkgeworCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9BQ09NTUlULCAweDBhKTsKKwkJfSBlbHNlIGlmIChwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgeworCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9BQ09NTUlULCAweDAwKTsKKwkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJfSBlbHNlIHsKKwkJCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fQUNPTU1JVCwgMHgwOCk7CisJCX0KKwl9CisKKwlpZiAocHJpdi0+cGh5TnVtID09IDApIHsKKwkJZGF0YSB8PSBUTEFOX05FVF9DRkdfUEhZX0VOOworCX0KKwlUTGFuX0Rpb1dyaXRlMTYoQkFTRSwgVExBTl9ORVRfQ09ORklHLCAodTE2KSBkYXRhKTsKKworCWlmICh0bGFuX3BjaV90YmxbY2hpcF9pZHhdLmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkpIHsKKwkJVExhbl9GaW5pc2hSZXNldChuaWMpOworCX0gZWxzZSB7CisJCVRMYW5fUGh5UG93ZXJEb3duKG5pYyk7CisJfQorCit9CS8qIFRMYW5fUmVzZXRBZGFwdGVyICovCisKK3ZvaWQgVExhbl9GaW5pc2hSZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisKKwl1OCBkYXRhOworCXUzMiBwaHk7CisJdTggc2lvOworCXUxNiBzdGF0dXM7CisJdTE2IHBhcnRuZXI7CisJdTE2IHRscGh5X2N0bDsKKwl1MTYgdGxwaHlfcGFyOworCXUxNiB0bHBoeV9pZDEsIHRscGh5X2lkMjsKKwlpbnQgaTsKKworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisJZGF0YSA9IFRMQU5fTkVUX0NNRF9OUkVTRVQgfCBUTEFOX05FVF9DTURfTldSQVA7CisJaWYgKHByaXYtPnRsYW5GdWxsRHVwbGV4KSB7CisJCWRhdGEgfD0gVExBTl9ORVRfQ01EX0RVUExFWDsKKwl9CisJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9ORVRfQ01ELCBkYXRhKTsKKwlkYXRhID0gVExBTl9ORVRfTUFTS19NQVNLNCB8IFRMQU5fTkVUX01BU0tfTUFTSzU7CisJaWYgKHByaXYtPnBoeU51bSA9PSAwKSB7CisJCWRhdGEgfD0gVExBTl9ORVRfTUFTS19NQVNLNzsKKwl9CisJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9ORVRfTUFTSywgZGF0YSk7CisJVExhbl9EaW9Xcml0ZTE2KEJBU0UsIFRMQU5fTUFYX1JYLCAoKDE1MzYpICsgNykgJiB+Nyk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfUEhZU0lEMSwgJnRscGh5X2lkMSk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfUEhZU0lEMiwgJnRscGh5X2lkMik7CisKKwlpZiAoKHRsYW5fcGNpX3RibFtjaGlwX2lkeF0uZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSkKKwkgICAgfHwgKHByaXYtPmF1aSkpIHsKKwkJc3RhdHVzID0gQk1TUl9MU1RBVFVTOworCQlEQkcgKCAiVExBTjogICVzOiBMaW5rIGZvcmNlZC5cbiIsIHByaXYtPm5pY19uYW1lICk7CisJfSBlbHNlIHsKKwkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfQk1TUiwgJnN0YXR1cyk7CisJCXVkZWxheSgxMDAwKTsKKwkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfQk1TUiwgJnN0YXR1cyk7CisJCWlmICgoc3RhdHVzICYgQk1TUl9MU1RBVFVTKSAmJgkvKiBXZSBvbmx5IHN1cHBvcnQgbGluayBpbmZvIG9uIE5hdC5TZW0uIFBIWSdzICovCisJCSAgICAodGxwaHlfaWQxID09IE5BVF9TRU1fSUQxKQorCQkgICAgJiYgKHRscGh5X2lkMiA9PSBOQVRfU0VNX0lEMikpIHsKKwkJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0xQQSwgJnBhcnRuZXIpOworCQkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBUTEFOX1RMUEhZX1BBUiwKKwkJCQkJJnRscGh5X3Bhcik7CisKKwkJCURCRyAoICJUTEFOOiAlczogTGluayBhY3RpdmUgd2l0aCAiLAorCQkJICAgICAgIHByaXYtPm5pY19uYW1lICk7CisJCQlpZiAoISh0bHBoeV9wYXIgJiBUTEFOX1BIWV9BTl9FTl9TVEFUKSkgeworCQkJCURCRyAoICJmb3JjZWQgMTAlc01icHMgJXMtRHVwbGV4XG4iLAorCQkJCSAgICAgICB0bHBoeV9wYXIgJiBUTEFOX1BIWV9TUEVFRF8xMDAgPyAiIgorCQkJCSAgICAgICA6ICIwIiwKKwkJCQkgICAgICAgdGxwaHlfcGFyICYgVExBTl9QSFlfRFVQTEVYX0ZVTEwgPworCQkJCSAgICAgICAiRnVsbCIgOiAiSGFsZiIgKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHIAorCQkJCSAgICAoICJBdXRvTmVnb3RpYXRpb24gZW5hYmxlZCwgYXQgMTAlc01icHMgJXMtRHVwbGV4XG4iLAorCQkJCSAgICAgdGxwaHlfcGFyICYgVExBTl9QSFlfU1BFRURfMTAwID8gIiIgOgorCQkJCSAgICAgIjAiLAorCQkJCSAgICAgdGxwaHlfcGFyICYgVExBTl9QSFlfRFVQTEVYX0ZVTEwgPworCQkJCSAgICAgIkZ1bGwiIDogIkhhbGYiICk7CisJCQkJREJHICggIlRMQU46IFBhcnRuZXIgY2FwYWJpbGl0eTogIiApOworCQkJCWZvciAoaSA9IDU7IGkgPD0gMTA7IGkrKykKKwkJCQkJaWYgKHBhcnRuZXIgJiAoMSA8PCBpKSkgeworCQkJCQkJREJHICggIiVzIiwgbWVkaWFbaSAtIDVdICk7CisJCQkJCX0KKwkJCQlEQkcgKCAiXG4iICk7CisJCQl9CisKKwkJCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyk7CisjaWZkZWYgTU9OSVRPUgorCQkJLyogV2UgaGF2ZSBsaW5rIGJlYXQuLmZvciBub3cgYW55d2F5ICovCisJCQlwcml2LT5saW5rID0gMTsKKwkJCS8qRW5hYmxpbmcgbGluayBiZWF0IG1vbml0b3JpbmcgKi8KKwkJCS8qIFRMYW5fU2V0VGltZXIoIG5pYywgKDEwKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsgKi8KKwkJCW1kZWxheSgxMDAwMCk7CisJCQlUTGFuX1BoeU1vbml0b3IobmljKTsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykgeworCQkJREJHICggIlRMQU46ICVzOiBMaW5rIGFjdGl2ZVxuIiwgcHJpdi0+bmljX25hbWUgKTsKKwkJCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyk7CisJCX0KKwl9CisKKwlpZiAocHJpdi0+cGh5TnVtID09IDApIHsKKwkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBUTEFOX1RMUEhZX0NUTCwgJnRscGh5X2N0bCk7CisJCXRscGh5X2N0bCB8PSBUTEFOX1RDX0lOVEVOOworCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBUTEFOX1RMUEhZX0NUTCwgdGxwaHlfY3RsKTsKKwkJc2lvID0gVExhbl9EaW9SZWFkOChCQVNFLCBUTEFOX05FVF9TSU8pOworCQlzaW8gfD0gVExBTl9ORVRfU0lPX01JTlRFTjsKKwkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9ORVRfU0lPLCBzaW8pOworCX0KKworCWlmIChzdGF0dXMgJiBCTVNSX0xTVEFUVVMpIHsKKwkJVExhbl9TZXRNYWMobmljLCAwLCBuaWMtPm5vZGVfYWRkcik7CisJCXByaXYtPnBoeU9ubGluZSA9IDE7CisJCW91dGIoKFRMQU5fSENfSU5UX09OID4+IDgpLCBCQVNFICsgVExBTl9IT1NUX0NNRCArIDEpOworCQlvdXRsKHZpcnRfdG9fYnVzKCZyeF9yaW5nKSwgQkFTRSArIFRMQU5fQ0hfUEFSTSk7CisJCW91dGwoVExBTl9IQ19HTyB8IFRMQU5fSENfUlQsIEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKwl9IGVsc2UgeworCQlEQkcgCisJCSAgICAoICJUTEFOOiAlczogTGluayBpbmFjdGl2ZSwgd2lsbCByZXRyeSBpbiAxMCBzZWNzLi4uXG4iLAorCQkgICAgIHByaXYtPm5pY19uYW1lICk7CisJCS8qIFRMYW5fU2V0VGltZXIoIG5pYywgKDEwKkhaKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsgKi8KKwkJbWRlbGF5KDEwMDAwKTsKKwkJVExhbl9GaW5pc2hSZXNldChuaWMpOworCQlyZXR1cm47CisKKwl9CisKK30JLyogVExhbl9GaW5pc2hSZXNldCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHRsYW5fcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKwkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCisJLyogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4gKi8KKwkvKiBuaWMtPnBhY2tldGxlbiBzaG91bGQgY29udGFpbiBsZW5ndGggb2YgZGF0YSAqLworCXUzMiBmcmFtZXNpemU7CisJdTMyIGhvc3RfY21kID0gMDsKKwl1MzIgYWNrID0gMTsKKwlpbnQgZW9jID0gMDsKKwlpbnQgZW50cnkgPSBwcml2LT5jdXJfcnggJSBUTEFOX05VTV9SWF9MSVNUUzsKKwl1MTYgdG1wQ1N0YXQgPSBsZTMyX3RvX2NwdShyeF9yaW5nW2VudHJ5XS5jU3RhdCk7CisJdTE2IGhvc3RfaW50ID0gaW53KEJBU0UgKyBUTEFOX0hPU1RfSU5UKTsKKworCWlmICgodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0ZSTV9DTVApICYmICFyZXRyaWV2ZSkKKwkgIHJldHVybiAxOworCisJb3V0dyhob3N0X2ludCwgQkFTRSArIFRMQU5fSE9TVF9JTlQpOworCisJaWYgKCEodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0ZSTV9DTVApKQorCQlyZXR1cm4gMDsKKworCS8qIHByaW50ZigiUEktMTogMHglaFhcbiIsIGhvc3RfaW50KTsgKi8KKwlpZiAodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0VPQykKKwkJZW9jID0gMTsKKworCWZyYW1lc2l6ZSA9IHJ4X3JpbmdbZW50cnldLmZyYW1lU2l6ZTsKKworCW5pYy0+cGFja2V0bGVuID0gZnJhbWVzaXplOworCisJREJHICggIi4lZC4iLCAodW5zaWduZWQgaW50KSBmcmFtZXNpemUgKTsgCisgICAgIAorCW1lbWNweShuaWMtPnBhY2tldCwgcnhiICsKKwkgICAgICAgKHByaXYtPmN1cl9yeCAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUpLCBuaWMtPnBhY2tldGxlbik7CisKKwlyeF9yaW5nW2VudHJ5XS5jU3RhdCA9IDA7CisKKwlEQkcgKCAiJWQiLCBlbnRyeSApOyAgCisKKwllbnRyeSA9IChlbnRyeSArIDEpICUgVExBTl9OVU1fUlhfTElTVFM7CisJcHJpdi0+Y3VyX3J4ID0gZW50cnk7CisJaWYgKGVvYykgeworCQlpZiAoKHJ4X3JpbmdbZW50cnldLmNTdGF0ICYgVExBTl9DU1RBVF9SRUFEWSkgPT0KKwkJICAgIFRMQU5fQ1NUQVRfUkVBRFkpIHsKKwkJCWFjayB8PSBUTEFOX0hDX0dPIHwgVExBTl9IQ19SVDsKKwkJCWhvc3RfY21kID0gVExBTl9IQ19BQ0sgfCBhY2sgfCAweDAwMUMwMDAwOworCQkJb3V0bChob3N0X2NtZCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCQl9CisJfSBlbHNlIHsKKwkJaG9zdF9jbWQgPSBUTEFOX0hDX0FDSyB8IGFjayB8ICgweDAwMEMwMDAwKTsKKwkJb3V0bChob3N0X2NtZCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCQkKKwkJREJHICggIkFDOiAweCVoWFxuIiwgaW53KEJBU0UgKyBUTEFOX0NIX1BBUk0pICk7IAorCQlEQkcgKCAiUEktMjogMHglaFhcbiIsIGludyhCQVNFICsgVExBTl9IT1NUX0lOVCkgKTsKKwl9CisJcmVmaWxsX3J4KG5pYyk7CisJcmV0dXJuICgxKTsJCS8qIGluaXRpYWxseSBhcyB0aGlzIGlzIGNhbGxlZCB0byBmbHVzaCB0aGUgaW5wdXQgKi8KK30KKworc3RhdGljIHZvaWQgcmVmaWxsX3J4KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwlpbnQgZW50cnkgPSAwOworCisJZm9yICg7CisJICAgICAocHJpdi0+Y3VyX3J4IC0gcHJpdi0+ZGlydHlfcnggKworCSAgICAgIFRMQU5fTlVNX1JYX0xJU1RTKSAlIFRMQU5fTlVNX1JYX0xJU1RTID4gMDsKKwkgICAgIHByaXYtPmRpcnR5X3J4ID0gKHByaXYtPmRpcnR5X3J4ICsgMSkgJSBUTEFOX05VTV9SWF9MSVNUUykgeworCQllbnRyeSA9IHByaXYtPmRpcnR5X3J4ICUgVExBTl9OVU1fVFhfTElTVFM7CisJCXJ4X3JpbmdbZW50cnldLmZyYW1lU2l6ZSA9IFRMQU5fTUFYX0ZSQU1FX1NJWkU7CisJCXJ4X3JpbmdbZW50cnldLmNTdGF0ID0gVExBTl9DU1RBVF9SRUFEWTsKKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRsYW5fdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLAkvKiBEZXN0aW5hdGlvbiAqLworCQkJICB1bnNpZ25lZCBpbnQgdCwJLyogVHlwZSAqLworCQkJICB1bnNpZ25lZCBpbnQgcywJLyogc2l6ZSAqLworCQkJICBjb25zdCBjaGFyICpwKQorewkJCQkvKiBQYWNrZXQgKi8KKwl1MTYgbnN0eXBlOworCXUzMiB0bzsKKwlzdHJ1Y3QgVExhbkxpc3QgKnRhaWxfbGlzdDsKKwlzdHJ1Y3QgVExhbkxpc3QgKmhlYWRfbGlzdDsKKwl1OCAqdGFpbF9idWZmZXI7CisJdTMyIGFjayA9IDA7CisJdTMyIGhvc3RfY21kOworCWludCBlb2MgPSAwOworCXUxNiB0bXBDU3RhdDsKKwl1MTYgaG9zdF9pbnQgPSBpbncoQkFTRSArIFRMQU5fSE9TVF9JTlQpOworCisJaW50IGVudHJ5ID0gMDsKKworCURCRyAoICJJTlQwLTB4JWhYXG4iLCBob3N0X2ludCApOworCisJaWYgKCFwcml2LT5waHlPbmxpbmUpIHsKKwkJcHJpbnRmKCJUUkFOU01JVDogICVzIFBIWSBpcyBub3QgcmVhZHlcbiIsIHByaXYtPm5pY19uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXRhaWxfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4VGFpbDsKKworCWlmICh0YWlsX2xpc3QtPmNTdGF0ICE9IFRMQU5fQ1NUQVRfVU5VU0VEKSB7CisJCXByaW50ZigiVFJBTlNNSVQ6ICVzIGlzIGJ1c3kgKEhlYWQ9JXAgVGFpbD0leClcbiIsCisJCSAgICAgICBwcml2LT5uaWNfbmFtZSwgcHJpdi0+dHhMaXN0LCAodW5zaWduZWQgaW50KSBwcml2LT50eFRhaWwpOworCQl0eF9yaW5nW2VudHJ5XS5jU3RhdCA9IFRMQU5fQ1NUQVRfVU5VU0VEOworLy8JCXByaXYtPnR4QnVzeUNvdW50Kys7CisJCXJldHVybjsKKwl9CisKKwl0YWlsX2xpc3QtPmZvcndhcmQgPSAwOworCisJdGFpbF9idWZmZXIgPSB0eGIgKyAocHJpdi0+dHhUYWlsICogVExBTl9NQVhfRlJBTUVfU0laRSk7CisKKwkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KKwltZW1jcHkodGFpbF9idWZmZXIsIGQsIEVUSF9BTEVOKTsKKwltZW1jcHkodGFpbF9idWZmZXIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKwluc3R5cGUgPSBodG9ucygodTE2KSB0KTsKKwltZW1jcHkodGFpbF9idWZmZXIgKyAyICogRVRIX0FMRU4sICh1OCAqKSAmIG5zdHlwZSwgMik7CisJbWVtY3B5KHRhaWxfYnVmZmVyICsgRVRIX0hMRU4sIHAsIHMpOworCisJcyArPSBFVEhfSExFTjsKKwlzICY9IDB4MEZGRjsKKwl3aGlsZSAocyA8IEVUSF9aTEVOKQorCQl0YWlsX2J1ZmZlcltzKytdID0gJ1wwJzsKKworCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCS8qIFJlY2VpdmUKKwkgKiAwMDAwIDAwMDAgMDAwMSAxMTAwCisJICogMDAwMCAwMDAwIDAwMDAgMTEwMAorCSAqIDAwMDAgMDAwMCAwMDAwIDAwMTEgPSAweDAwMDMKKwkgKgorCSAqIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAxMQorCSAqIDAwMDAgMDAwMCAwMDAwIDExMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCA9IDB4MDAwQzAwMDAKKwkgKgorCSAqIFRyYW5zbWl0CisJICogMDAwMCAwMDAwIDAwMDEgMTEwMAorCSAqIDAwMDAgMDAwMCAwMDAwIDAxMDAKKwkgKiAwMDAwIDAwMDAgMDAwMCAwMDAxID0gMHgwMDAxCisJICoKKwkgKiAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDEKKwkgKiAwMDAwIDAwMDAgMDAwMCAwMTAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgPSAweDAwMDQwMDAwCisJICogKi8KKworCS8qIFNldHVwIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yICovCisJdGFpbF9saXN0LT5mcmFtZVNpemUgPSAodTE2KSBzOworCXRhaWxfbGlzdC0+YnVmZmVyWzBdLmNvdW50ID0gVExBTl9MQVNUX0JVRkZFUiB8ICh1MzIpIHM7CisJdGFpbF9saXN0LT5idWZmZXJbMV0uY291bnQgPSAwOworCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmFkZHJlc3MgPSAwOworCisJdGFpbF9saXN0LT5jU3RhdCA9IFRMQU5fQ1NUQVRfUkVBRFk7CisKKwlEQkcgKCAiSU5UMS0weCVoWFxuIiwgaW53KEJBU0UgKyBUTEFOX0hPU1RfSU5UKSApOworCisJaWYgKCFwcml2LT50eEluUHJvZ3Jlc3MpIHsKKwkJcHJpdi0+dHhJblByb2dyZXNzID0gMTsKKwkJb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKHRhaWxfbGlzdCksIEJBU0UgKyBUTEFOX0NIX1BBUk0pOworCQlvdXRsKFRMQU5fSENfR08sIEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKwl9IGVsc2UgeworCQlpZiAocHJpdi0+dHhUYWlsID09IDApIHsKKwkJCURCRyAoICJPdXQgYnVmZmVyXG4iICk7CisJCQkocHJpdi0+dHhMaXN0ICsgKFRMQU5fTlVNX1RYX0xJU1RTIC0gMSkpLT5mb3J3YXJkID0KKwkJCSAgICB2aXJ0X3RvX2xlMzJkZXNjKHRhaWxfbGlzdCk7CisJCX0gZWxzZSB7CisJCQlEQkcgKCAiRml4IHRoaXMgXG4iICk7CisJCQkocHJpdi0+dHhMaXN0ICsgKHByaXYtPnR4VGFpbCAtIDEpKS0+Zm9yd2FyZCA9CisJCQkgICAgdmlydF90b19sZTMyZGVzYyh0YWlsX2xpc3QpOworCQl9CisJfQorCQorCUNJUkNfSU5DKHByaXYtPnR4VGFpbCwgVExBTl9OVU1fVFhfTElTVFMpOworCisJREJHICggIklOVDItMHglaFhcbiIsIGludyhCQVNFICsgVExBTl9IT1NUX0lOVCkgKTsKKworCXRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FX09VVDsKKwl3aGlsZSAoKHRhaWxfbGlzdC0+Y1N0YXQgPT0gVExBTl9DU1RBVF9SRUFEWSkgJiYgY3VycnRpY2tzKCkgPCB0byk7CisKKwloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisJd2hpbGUgKCgodG1wQ1N0YXQgPSBoZWFkX2xpc3QtPmNTdGF0KSAmIFRMQU5fQ1NUQVRfRlJNX0NNUCkgCisJCQkmJiAoYWNrIDwgMjU1KSkgeworCQlhY2srKzsKKwkJaWYodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0VPQykKKwkJCWVvYyA9MTsKKwkJaGVhZF9saXN0LT5jU3RhdCA9IFRMQU5fQ1NUQVRfVU5VU0VEOworCQlDSVJDX0lOQyhwcml2LT50eEhlYWQsIFRMQU5fTlVNX1RYX0xJU1RTKTsKKwkJaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOworCQkKKwl9CisJaWYoIWFjaykKKwkJcHJpbnRmKCJJbmNvbXBsZXRlIFRYIEZyYW1lXG4iKTsKKworCWlmKGVvYykgeworCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisJCWlmICgoaGVhZF9saXN0LT5jU3RhdCAmIFRMQU5fQ1NUQVRfUkVBRFkpID09IFRMQU5fQ1NUQVRfUkVBRFkpIHsKKwkJCW91dGwodmlydF90b19sZTMyZGVzYyhoZWFkX2xpc3QpLCBCQVNFICsgVExBTl9DSF9QQVJNKTsKKwkJCWFjayB8PSBUTEFOX0hDX0dPOworCQl9IGVsc2UgeworCQkJcHJpdi0+dHhJblByb2dyZXNzID0gMDsKKwkJfQorCX0KKwlpZihhY2spIHsKKwkJaG9zdF9jbWQgPSBUTEFOX0hDX0FDSyB8IGFjazsKKwkJb3V0bChob3N0X2NtZCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCX0KKwkKKwlpZihwcml2LT50bGFuUmV2IDwgMHgzMCApIHsKKwkJYWNrID0gMTsKKwkJaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOworCQlpZiAoKGhlYWRfbGlzdC0+Y1N0YXQgJiBUTEFOX0NTVEFUX1JFQURZKSA9PSBUTEFOX0NTVEFUX1JFQURZKSB7CisJCQlvdXRsKHZpcnRfdG9fbGUzMmRlc2MoaGVhZF9saXN0KSwgQkFTRSArIFRMQU5fQ0hfUEFSTSk7CisJCQlhY2sgfD0gVExBTl9IQ19HTzsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnR4SW5Qcm9ncmVzcyA9IDA7CisJCX0KKwkJaG9zdF9jbWQgPSBUTEFOX0hDX0FDSyB8IGFjayB8IDB4MDAxNDAwMDA7CisJCW91dGwoaG9zdF9jbWQsIEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKwkJCisJfQorCQkJCisJaWYgKGN1cnJ0aWNrcygpID49IHRvKSB7CisJCXByaW50ZigiVFggVGltZSBPdXQiKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdGxhbl9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljIF9fdW51c2VkICkgeworCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLworCS8qIFRoaXMgZnVuY3Rpb24gc2VydmVzIDMgcHVycG9zZXMuCisJICogVGhpcyBkaXNhYmxlcyBETUEgYW5kIGludGVycnVwdHMgc28gd2UgZG9uJ3QgcmVjZWl2ZQorCSAqICB1bmV4cGVjdGVkIHBhY2tldHMgb3IgaW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFmdGVyCisJICogIGV0aGVyYm9vdCBoYXMgZmluaXNoZWQuCisJICogVGhpcyBmcmVlcyByZXNvdXJjZXMgc28gZXRoZXJib290IG1heSB1c2UKKwkgKiAgdGhpcyBkcml2ZXIgb24gYW5vdGhlciBpbnRlcmZhY2UKKwkgKiBUaGlzIGFsbG93cyBldGhlcmJvb3QgdG8gcmVpbml0aWFsaXplIHRoZSBpbnRlcmZhY2UKKwkgKiAgaWYgc29tZXRoaW5nIGlzIHNvbWV0aGluZyBnb2VzIHdyb25nLgorCSAqCisJICovCisJb3V0bChUTEFOX0hDX0FEX1JTVCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdGxhbl9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyB0bGFuX29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QJPSBkdW1teV9jb25uZWN0LAorCS5wb2xsCQk9IHRsYW5fcG9sbCwKKwkudHJhbnNtaXQJPSB0bGFuX3RyYW5zbWl0LAorCS5pcnEJCT0gdGxhbl9pcnEsCisKK307CisKK3N0YXRpYyB2b2lkIFRMYW5fU2V0TXVsdGljYXN0TGlzdChzdHJ1Y3QgbmljICpuaWMpIHsKKwlpbnQgaTsKKwl1OCB0bXA7CisKKwkvKiAhSUZGX1BST01JU0MgKi8KKwl0bXAgPSBUTGFuX0Rpb1JlYWQ4KEJBU0UsIFRMQU5fTkVUX0NNRCk7CisJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9ORVRfQ01ELCB0bXAgJiB+VExBTl9ORVRfQ01EX0NBRik7CisKKwkvKiBJRkZfQUxMTVVMVEkgKi8KKwlmb3IoaSA9IDA7IGk8IDM7IGkrKykKKwkJVExhbl9TZXRNYWMobmljLCBpICsgMSwgTlVMTCk7CisJVExhbl9EaW9Xcml0ZTMyKEJBU0UsIFRMQU5fSEFTSF8xLCAweEZGRkZGRkZGKTsKKwlUTGFuX0Rpb1dyaXRlMzIoQkFTRSwgVExBTl9IQVNIXzIsIDB4RkZGRkZGRkYpOworCisJCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGJvYXJkX2ZvdW5kIDEKKyNkZWZpbmUgdmFsaWRfbGluayAwCitzdGF0aWMgaW50IHRsYW5fcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgKSB7CisKKwl1MTYgZGF0YSA9IDA7CisJaW50IGVycjsKKwlpbnQgaTsKKworCWlmIChwY2ktPmlvYWRkciA9PSAwKQorCQlyZXR1cm4gMDsKKworCW5pYy0+aXJxbm8gID0gMDsKKwluaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyOworCisJQkFTRSA9IHBjaS0+aW9hZGRyOworCisJLyogU2V0IG5pYyBhcyBQQ0kgYnVzIG1hc3RlciAqLworCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CisJCisJLyogUG9pbnQgdG8gcHJpdmF0ZSBzdG9yYWdlICovCisJcHJpdiA9ICZUTGFuUHJpdmF0ZUluZm87CisKKwkvKiBGaWd1cmUgb3V0IHdoaWNoIGNoaXAgd2UncmUgZGVhbGluZyB3aXRoICovCisJaSA9IDA7CisJY2hpcF9pZHggPSAtMTsKKwl3aGlsZSAodGxhbl9wY2lfdGJsW2ldLm5hbWUpIHsKKwkJaWYgKCgoKHUzMikgcGNpLT5kZXZpY2UgPDwgMTYpIHwgcGNpLT52ZW5kb3IpID09CisJCSAgICAodGxhbl9wY2lfdGJsW2ldLmlkLnBjaSAmIDB4ZmZmZmZmZmYpKSB7CisJCQljaGlwX2lkeCA9IGk7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCisJcHJpdi0+dmVuZG9yX2lkID0gcGNpLT52ZW5kb3I7CisJcHJpdi0+ZGV2X2lkID0gcGNpLT5kZXZpY2U7CisJcHJpdi0+bmljX25hbWUgPSBwY2ktPmRyaXZlcl9uYW1lOworCXByaXYtPmVvYyA9IDA7CisKKwllcnIgPSAwOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWVyciB8PSBUTGFuX0VlUmVhZEJ5dGUoQkFTRSwKKwkJCQkgICAgICAgKHU4KSB0bGFuX3BjaV90YmxbY2hpcF9pZHhdLgorCQkJCSAgICAgICBhZGRyT2ZzICsgaSwKKwkJCQkgICAgICAgKHU4ICopICYgbmljLT5ub2RlX2FkZHJbaV0pOworCWlmIChlcnIpIHsKKyAgCSAgICBwcmludGYgKCAiVExBTjogJXM6IEVycm9yIHJlYWRpbmcgTUFDIGZyb20gZWVwcm9tOiAlZFxuIiwKKwkJICAgIHBjaS0+ZHJpdmVyX25hbWUsIGVycik7CisJfSBlbHNlIHsKKwkgICAgREJHICggIiVzOiAlcyBhdCBpb2FkZHIgJSNsWCwgIiwgCisJCSAgcGNpLT5kcml2ZXJfbmFtZSwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApLCBwY2ktPmlvYWRkciApOworCX0KKworCXByaXYtPnRsYW5SZXYgPSBUTGFuX0Rpb1JlYWQ4KEJBU0UsIFRMQU5fREVGX1JFVklTSU9OKTsKKwlwcmludGYoInJldmlzaW9uOiAweCVoWFxuIiwgcHJpdi0+dGxhblJldik7CisKKwlUTGFuX1Jlc2V0TGlzdHMobmljKTsKKwlUTGFuX1Jlc2V0QWRhcHRlcihuaWMpOworCisJZGF0YSA9IGlubChCQVNFICsgVExBTl9IT1NUX0NNRCk7CisJZGF0YSB8PSBUTEFOX0hDX0lOVF9PRkY7CisJb3V0dyhkYXRhLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CisKKwlUTGFuX1NldE11bHRpY2FzdExpc3QobmljKTsKKwl1ZGVsYXkoMTAwKTsgCisJcHJpdi0+dHhMaXN0ID0gdHhfcmluZzsKKworLyoJaWYgKGJvYXJkX2ZvdW5kICYmIHZhbGlkX2xpbmspCisJeyovCisJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJbmljLT5uaWNfb3AJPSAmdGxhbl9vcGVyYXRpb25zOworCXJldHVybiAxOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlUaHVuZGVyTEFOIERyaXZlciBFZXByb20gcm91dGluZXMKKworCVRoZSBDb21wYXEgTmV0ZWxsaWdlbnQgMTAgYW5kIDEwLzEwMCBjYXJkcyB1c2UgYSBNaWNyb2NoaXAgMjRDMDJBCisJRUVQUk9NLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBNaWNyb2NoaXAncworCWRhdGEgc2hlZXQuICBJIGRvbid0IGtub3cgaG93IHdlbGwgdGhpcyBmdW5jdGlvbnMgd2lsbCB3b3JrIHdpdGgKKwlvdGhlciBFRVBST01zLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJVExhbl9FZVNlbmRTdGFydAorKgorKglSZXR1cm5zOgorKgkJTm90aGluZworKglQYXJtczoKKyoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworKgkJCQl1c2UuCisqCisqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBzdGFydCBjeWNsZSB0byBhbiBFRVBST00gYXR0YWNoZWQKKyoJdG8gYSBUTEFOIGNoaXAuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX0VlU2VuZFN0YXJ0KHUxNiBpb19iYXNlKQoreworCXUxNiBzaW87CisKKwlvdXR3KFRMQU5fTkVUX1NJTywgaW9fYmFzZSArIFRMQU5fRElPX0FEUik7CisJc2lvID0gaW9fYmFzZSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisKKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8pOworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvKTsKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKworfQkvKiBUTGFuX0VlU2VuZFN0YXJ0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJVExhbl9FZVNlbmRCeXRlCisqCisqCVJldHVybnM6CisqCQlJZiB0aGUgY29ycmVjdCBhY2sgd2FzIHJlY2VpdmVkLCAwLCBvdGhlcndpc2UgMQorKglQYXJtczoJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKKyoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCisqCQkJCXVzZS4KKyoJCWRhdGEJCVRoZSA4IGJpdHMgb2YgaW5mb3JtYXRpb24gdG8KKyoJCQkJc2VuZCB0byB0aGUgRUVQUk9NLgorKgkJc3RvcAkJSWYgVExBTl9FRVBST01fU1RPUCBpcyBwYXNzZWQsIGEKKyoJCQkJc3RvcCBjeWNsZSBpcyBzZW50IGFmdGVyIHRoZQorKgkJCQlieXRlIGlzIHNlbnQgYWZ0ZXIgdGhlIGFjayBpcworKgkJCQlyZWFkLgorKgorKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgYnl0ZSBvbiB0aGUgc2VyaWFsIEVFUFJPTSBsaW5lLAorKglkcml2aW5nIHRoZSBjbG9jayB0byBzZW5kIGVhY2ggYml0LiBUaGUgZnVuY3Rpb24gdGhlbgorKglyZXZlcnNlcyB0cmFuc21pc3Npb24gZGlyZWN0aW9uIGFuZCByZWFkcyBhbiBhY2tub3dsZWRnZQorKgliaXQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IFRMYW5fRWVTZW5kQnl0ZSh1MTYgaW9fYmFzZSwgdTggZGF0YSwgaW50IHN0b3ApCit7CisJaW50IGVycjsKKwl1OCBwbGFjZTsKKwl1MTYgc2lvOworCisJb3V0dyhUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGlvX2Jhc2UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCisJLyogQXNzdW1lIGNsb2NrIGlzIGxvdywgdHggaXMgZW5hYmxlZDsgKi8KKwlmb3IgKHBsYWNlID0gMHg4MDsgcGxhY2UgIT0gMDsgcGxhY2UgPj49IDEpIHsKKwkJaWYgKHBsYWNlICYgZGF0YSkKKwkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsKKwkJZWxzZQorCQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJfQorCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8pOworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwllcnIgPSBUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8pOworCisJaWYgKCghZXJyKSAmJiBzdG9wKSB7CisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8pOwkvKiBTVE9QLCByYWlzZSBkYXRhIHdoaWxlIGNsb2NrIGlzIGhpZ2ggKi8KKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CisJfQorCisJcmV0dXJuIChlcnIpOworCit9CS8qIFRMYW5fRWVTZW5kQnl0ZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCVRMYW5fRWVSZWNlaXZlQnl0ZQorKgorKglSZXR1cm5zOgorKgkJTm90aGluZworKglQYXJtczoKKyoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworKgkJCQl1c2UuCisqCQlkYXRhCQlBbiBhZGRyZXNzIHRvIGEgY2hhciB0byBob2xkIHRoZQorKgkJCQlkYXRhIHNlbnQgZnJvbSB0aGUgRUVQUk9NLgorKgkJc3RvcAkJSWYgVExBTl9FRVBST01fU1RPUCBpcyBwYXNzZWQsIGEKKyoJCQkJc3RvcCBjeWNsZSBpcyBzZW50IGFmdGVyIHRoZQorKgkJCQlieXRlIGlzIHJlY2VpdmVkLCBhbmQgbm8gYWNrIGlzCisqCQkJCXNlbnQuCisqCisqCVRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgOCBiaXRzIG9mIGRhdGEgZnJvbSB0aGUgRUVQUk9NCisqCW92ZXIgdGhlIHNlcmlhbCBsaW5rLiAgSXQgdGhlbiBzZW5kcyBhbmQgYWNrIGJpdCwgb3Igbm8KKyoJYWNrIGFuZCBhIHN0b3AgYml0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlCisqCWRhdGEgYWZ0ZXIgdGhlIGFkZHJlc3Mgb2YgYSBieXRlIGluIHRoZSBFRVBST00gaGFzIGJlZW4KKyoJc2VudC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fRWVSZWNlaXZlQnl0ZSh1MTYgaW9fYmFzZSwgdTggKiBkYXRhLCBpbnQgc3RvcCkKK3sKKwl1OCBwbGFjZTsKKwl1MTYgc2lvOworCisJb3V0dyhUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGlvX2Jhc2UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCSpkYXRhID0gMDsKKworCS8qIEFzc3VtZSBjbG9jayBpcyBsb3csIHR4IGlzIGVuYWJsZWQ7ICovCisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyk7CisJZm9yIChwbGFjZSA9IDB4ODA7IHBsYWNlOyBwbGFjZSA+Pj0gMSkgeworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJCWlmIChUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbykpCisJCQkqZGF0YSB8PSBwbGFjZTsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJfQorCisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8pOworCWlmICghc3RvcCkgeworCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsJLyogQWNrID0gMCAqLworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCX0gZWxzZSB7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsJLyogTm8gYWNrID0gMSAoPykgKi8KKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CS8qIFNUT1AsIHJhaXNlIGRhdGEgd2hpbGUgY2xvY2sgaXMgaGlnaCAqLworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsKKwl9CisKK30JLyogVExhbl9FZVJlY2VpdmVCeXRlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJVExhbl9FZVJlYWRCeXRlCisqCisqCVJldHVybnM6CisqCQlObyBlcnJvciA9IDAsIGVsc2UsIHRoZSBzdGFnZSBhdCB3aGljaCB0aGUgZXJyb3IKKyoJCW9jY3VycmVkLgorKglQYXJtczoKKyoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworKgkJCQl1c2UuCisqCQllZV9hZGRyCQlUaGUgYWRkcmVzcyBvZiB0aGUgYnl0ZSBpbiB0aGUKKyoJCQkJRUVQUk9NIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorKgkJCQlyZXRyaWV2ZWQuCisqCQlkYXRhCQlBbiBhZGRyZXNzIHRvIGEgY2hhciB0byBob2xkIHRoZQorKgkJCQlkYXRhIG9idGFpbmVkIGZyb20gdGhlIEVFUFJPTS4KKyoKKyoJVGhpcyBmdW5jdGlvbiByZWFkcyBhIGJ5dGUgb2YgaW5mb3JtYXRpb24gZnJvbSBhbiBieXRlCisqCWNlbGwgaW4gdGhlIEVFUFJPTS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgVExhbl9FZVJlYWRCeXRlKHUxNiBpb19iYXNlLCB1OCBlZV9hZGRyLCB1OCAqIGRhdGEpCit7CisJaW50IGVycjsKKwlpbnQgcmV0ID0gMDsKKworCisJVExhbl9FZVNlbmRTdGFydChpb19iYXNlKTsKKwllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoaW9fYmFzZSwgMHhBMCwgVExBTl9FRVBST01fQUNLKTsKKwlpZiAoZXJyKSB7CisJCXJldCA9IDE7CisJCWdvdG8gZmFpbDsKKwl9CisJZXJyID0gVExhbl9FZVNlbmRCeXRlKGlvX2Jhc2UsIGVlX2FkZHIsIFRMQU5fRUVQUk9NX0FDSyk7CisJaWYgKGVycikgeworCQlyZXQgPSAyOworCQlnb3RvIGZhaWw7CisJfQorCVRMYW5fRWVTZW5kU3RhcnQoaW9fYmFzZSk7CisJZXJyID0gVExhbl9FZVNlbmRCeXRlKGlvX2Jhc2UsIDB4QTEsIFRMQU5fRUVQUk9NX0FDSyk7CisJaWYgKGVycikgeworCQlyZXQgPSAzOworCQlnb3RvIGZhaWw7CisJfQorCVRMYW5fRWVSZWNlaXZlQnl0ZShpb19iYXNlLCBkYXRhLCBUTEFOX0VFUFJPTV9TVE9QKTsKKyAgICAgIGZhaWw6CisKKwlyZXR1cm4gcmV0OworCit9CS8qIFRMYW5fRWVSZWFkQnl0ZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1RodW5kZXJMQU4gRHJpdmVyIE1JSSBSb3V0aW5lcworCitUaGVzZSByb3V0aW5lcyBhcmUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluIENoYXAuIDIgb2YgdGhlCisiVGh1bmRlckxBTiBQcm9ncmFtbWVyJ3MgR3VpZGUiLCBwcC4gMTUtMjQuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKglUTGFuX01paVJlYWRSZWcKKyoKKyoJUmV0dXJuczoKKyoJCTAJaWYgYWNrIHJlY2VpdmVkIG9rCisqCQkxCW90aGVyd2lzZS4KKyoKKyoJUGFybXM6CisqCQlkZXYJCVRoZSBkZXZpY2Ugc3RydWN0dXJlIGNvbnRhaW5pbmcKKyoJCQkJVGhlIGlvIGFkZHJlc3MgYW5kIGludGVycnVwdCBjb3VudAorKgkJCQlmb3IgdGhpcyBkZXZpY2UuCisqCQlwaHkJCVRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgdG8gYmUgcXVlcmllZC4KKyoJCXJlZwkJVGhlIHJlZ2lzdGVyIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorKgkJCQlyZXRyZWl2ZWQuCisqCQl2YWwJCUEgcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHN0b3JlIHRoZQorKgkJCQlyZXRyaWV2ZWQgdmFsdWUuCisqCisqCVRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgVExBTidzIE1JSSBidXMgdG8gcmV0cmVpdmUgdGhlIGNvbnRlbnRzCisqCW9mIGEgZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbworKglhbmQgdGhlbiByZWFkcyB0aGUgMTYtYml0IHJlZ2lzdGVyIHZhbHVlIGZyb20gdGhlIE1JSSBidXMgdmlhCisqCXRoZSBUTEFOIFNJTyByZWdpc3Rlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgVExhbl9NaWlSZWFkUmVnKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdTE2IHBoeSwgdTE2IHJlZywgdTE2ICogdmFsKQoreworCXU4IG5hY2s7CisJdTE2IHNpbywgdG1wOworCXUzMiBpOworCWludCBlcnI7CisJaW50IG1pbnRlbjsKKworCWVyciA9IEZBTFNFOworCW91dHcoVExBTl9ORVRfU0lPLCBCQVNFICsgVExBTl9ESU9fQURSKTsKKwlzaW8gPSBCQVNFICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCVRMYW5fTWlpU3luYyhCQVNFKTsKKworCW1pbnRlbiA9IFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyk7CisJaWYgKG1pbnRlbikKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOworCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCAweDEsIDIpOwkvKiBTdGFydCAoIDAxYiApICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCAweDIsIDIpOwkvKiBSZWFkICAoIDEwYiApICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCBwaHksIDUpOwkvKiBEZXZpY2UgIyAgICAgICovCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCByZWcsIDUpOwkvKiBSZWdpc3RlciAjICAgICovCisKKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01UWEVOLCBzaW8pOwkvKiBDaGFuZ2UgZGlyZWN0aW9uICovCisKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwkvKiBDbG9jayBJZGxlIGJpdCAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CS8qIFdhaXQgMzAwbnMgKi8KKworCW5hY2sgPSBUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fTURBVEEsIHNpbyk7CS8qIENoZWNrIGZvciBBQ0sgKi8KKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJLyogRmluaXNoIEFDSyAqLworCWlmIChuYWNrKSB7CQkvKiBObyBBQ0ssIHNvIGZha2UgaXQgKi8KKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJfQorCQl0bXAgPSAweGZmZmY7CisJCWVyciA9IFRSVUU7CisJfSBlbHNlIHsJCS8qIEFDSywgc28gcmVhZCBkYXRhICovCisJCWZvciAodG1wID0gMCwgaSA9IDB4ODAwMDsgaTsgaSA+Pj0gMSkgeworCQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJCWlmIChUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fTURBVEEsIHNpbykpCisJCQkJdG1wIHw9IGk7CisJCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJfQorCX0KKworCisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJLyogSWRsZSBjeWNsZSAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCisJaWYgKG1pbnRlbikKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKKworCSp2YWwgPSB0bXA7CisKKwlyZXR1cm4gZXJyOworCit9CQkJCS8qIFRMYW5fTWlpUmVhZFJlZyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCVRMYW5fTWlpU2VuZERhdGEKKyoKKyoJUmV0dXJuczoKKyoJCU5vdGhpbmcKKyoJUGFybXM6CisqCQliYXNlX3BvcnQJVGhlIGJhc2UgSU8gcG9ydCBvZiB0aGUgYWRhcHRlcglpbgorKgkJCQlxdWVzdGlvbi4KKyoJCWRldgkJVGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSB0byBiZSBxdWVyaWVkLgorKgkJZGF0YQkJVGhlIHZhbHVlIHRvIGJlIHBsYWNlZCBvbiB0aGUgTUlJIGJ1cy4KKyoJCW51bV9iaXRzCVRoZSBudW1iZXIgb2YgYml0cyBpbiBkYXRhIHRoYXQgYXJlIHRvCisqCQkJCWJlIHBsYWNlZCBvbiB0aGUgTUlJIGJ1cy4KKyoKKyoJVGhpcyBmdW5jdGlvbiBzZW5kcyBvbiBzZXF1ZW5jZSBvZiBiaXRzIG9uIHRoZSBNSUkKKyoJY29uZmlndXJhdGlvbiBidXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX01paVNlbmREYXRhKHUxNiBiYXNlX3BvcnQsIHUzMiBkYXRhLCB1bnNpZ25lZCBudW1fYml0cykKK3sKKwl1MTYgc2lvOworCXUzMiBpOworCisJaWYgKG51bV9iaXRzID09IDApCisJCXJldHVybjsKKworCW91dHcoVExBTl9ORVRfU0lPLCBiYXNlX3BvcnQgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGJhc2VfcG9ydCArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01UWEVOLCBzaW8pOworCisJZm9yIChpID0gKDB4MSA8PCAobnVtX2JpdHMgLSAxKSk7IGk7IGkgPj49IDEpIHsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJKHZvaWQpIFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQlpZiAoZGF0YSAmIGkpCisJCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTURBVEEsIHNpbyk7CisJCWVsc2UKKwkJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01EQVRBLCBzaW8pOworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJKHZvaWQpIFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCX0KKworfQkJCQkvKiBUTGFuX01paVNlbmREYXRhICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJVExhbl9NaWlTeW5jCisqCisqCVJldHVybnM6CisqCQlOb3RoaW5nCisqCVBhcm1zOgorKgkJYmFzZV9wb3J0CVRoZSBiYXNlIElPIHBvcnQgb2YgdGhlIGFkYXB0ZXIgaW4KKyoJCQkJcXVlc3Rpb24uCisqCisqCVRoaXMgZnVuY3Rpb25zIHN5bmNzIGFsbCBQSFlzIGluIHRlcm1zIG9mIHRoZSBNSUkgY29uZmlndXJhdGlvbgorKglidXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX01paVN5bmModTE2IGJhc2VfcG9ydCkKK3sKKwlpbnQgaTsKKwl1MTYgc2lvOworCisJb3V0dyhUTEFOX05FVF9TSU8sIGJhc2VfcG9ydCArIFRMQU5fRElPX0FEUik7CisJc2lvID0gYmFzZV9wb3J0ICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01UWEVOLCBzaW8pOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCX0KKworfQkJCQkvKiBUTGFuX01paVN5bmMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKglUTGFuX01paVdyaXRlUmVnCisqCisqCVJldHVybnM6CisqCQlOb3RoaW5nCisqCVBhcm1zOgorKgkJZGV2CQlUaGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhlIGRldmljZQorKgkJCQl0byB3cml0ZSB0by4KKyoJCXBoeQkJVGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSB0byBiZSB3cml0dGVuIHRvLgorKgkJcmVnCQlUaGUgcmVnaXN0ZXIgd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCisqCQkJCXdyaXR0ZW4uCisqCQl2YWwJCVRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSByZWdpc3Rlci4KKyoKKyoJVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBUTEFOJ3MgTUlJIGJ1cyB0byB3cml0ZSB0aGUgY29udGVudHMgb2YgYQorKglnaXZlbiByZWdpc3RlciBvbiBhIFBIWS4gIEl0IHNlbmRzIHRoZSBhcHByb3ByaWF0ZSBpbmZvIGFuZCB0aGVuCisqCXdyaXRlcyB0aGUgMTYtYml0IHJlZ2lzdGVyIHZhbHVlIGZyb20gdGhlIE1JSSBjb25maWd1cmF0aW9uIGJ1cworKgl2aWEgdGhlIFRMQU4gU0lPIHJlZ2lzdGVyLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9NaWlXcml0ZVJlZyhzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIHUxNiBwaHksIHUxNiByZWcsIHUxNiB2YWwpCit7CisJdTE2IHNpbzsKKwlpbnQgbWludGVuOworCisJb3V0dyhUTEFOX05FVF9TSU8sIEJBU0UgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IEJBU0UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCisJVExhbl9NaWlTeW5jKEJBU0UpOworCisJbWludGVuID0gVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKKwlpZiAobWludGVuKQorCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyk7CisKKwlUTGFuX01paVNlbmREYXRhKEJBU0UsIDB4MSwgMik7CS8qIFN0YXJ0ICggMDFiICkgKi8KKwlUTGFuX01paVNlbmREYXRhKEJBU0UsIDB4MSwgMik7CS8qIFdyaXRlICggMDFiICkgKi8KKwlUTGFuX01paVNlbmREYXRhKEJBU0UsIHBoeSwgNSk7CS8qIERldmljZSAjICAgICAgKi8KKwlUTGFuX01paVNlbmREYXRhKEJBU0UsIHJlZywgNSk7CS8qIFJlZ2lzdGVyICMgICAgKi8KKworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgMHgyLCAyKTsJLyogU2VuZCBBQ0sgKi8KKwlUTGFuX01paVNlbmREYXRhKEJBU0UsIHZhbCwgMTYpOwkvKiBTZW5kIERhdGEgKi8KKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CS8qIElkbGUgY3ljbGUgKi8KKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKworCWlmIChtaW50ZW4pCisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyk7CisKKworfQkJCQkvKiBUTGFuX01paVdyaXRlUmVnICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJVExhbl9TZXRNYWMKKyoKKyoJUmV0dXJuczoKKyoJCU5vdGhpbmcKKyoJUGFybXM6CisqCQlkZXYJUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlIG9mIGFkYXB0ZXIKKyoJCQlvbiB3aGljaCB0byBjaGFuZ2UgdGhlIEFSRUcuCisqCQlhcmVnCVRoZSBBUkVHIHRvIHNldCB0aGUgYWRkcmVzcyBpbiAoMCAtIDMpLgorKgkJbWFjCUEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjaGFycy4gIEVhY2gKKyoJCQllbGVtZW50IHN0b3JlcyBvbmUgYnl0ZSBvZiB0aGUgYWRkcmVzcy4KKyoJCQlJRSwgaXQgaXNuJ3QgaW4gYXNjaWkuCisqCisqCVRoaXMgZnVuY3Rpb24gdHJhbnNmZXJzIGEgTUFDIGFkZHJlc3MgdG8gb25lIG9mIHRoZQorKglUTEFOIEFSRUdzIChhZGRyZXNzIHJlZ2lzdGVycykuICBUaGUgVExBTiBjaGlwIGxvY2tzCisqCXRoZSByZWdpc3RlciBvbiB3cml0aW5nIHRvIG9mZnNldCAwIGFuZCB1bmxvY2tzIHRoZQorKglyZWdpc3RlciBhZnRlciB3cml0aW5nIHRvIG9mZnNldCA1LiAgSWYgTlVMTCBpcyBwYXNzZWQKKyoJaW4gbWFjLCB0aGVuIHRoZSBBUkVHIGlzIGZpbGxlZCB3aXRoIDAncy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fU2V0TWFjKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IGFyZWcsIHVuc2lnbmVkIGNoYXIgKm1hYykKK3sKKwlpbnQgaTsKKworCWFyZWcgKj0gNjsKKworCWlmIChtYWMgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwKKwkJCQkgICAgICAgbWFjW2ldKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwgMCk7CisJfQorCit9CQkJCS8qIFRMYW5fU2V0TWFjICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJVExhbl9QaHlEZXRlY3QKKyoKKyoJUmV0dXJuczoKKyoJCU5vdGhpbmcKKyoJUGFybXM6CisqCQlkZXYJQSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoZSBhZGFwdGVyCisqCQkJZm9yIHdoaWNoIHRoZSBQSFkgbmVlZHMgZGV0ZXJtaW5lZC4KKyoKKyoJU28gZmFyIEkndmUgZm91bmQgdGhhdCBhZGFwdGVycyB3aGljaCBoYXZlIGV4dGVybmFsIFBIWXMKKyoJbWF5IGFsc28gdXNlIHRoZSBpbnRlcm5hbCBQSFkgZm9yIHBhcnQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkuCisqCShlZywgQVVJL1RoaW5uZXQpLiAgVGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgaWYgdGhpcyBUTEFOCisqCWNoaXAgaGFzIGFuIGludGVybmFsIFBIWSwgYW5kIHRoZW4gZmluZHMgdGhlIGZpcnN0IGV4dGVybmFsCisqCVBIWSAoc3RhcnRpbmcgZnJvbSBhZGRyZXNzIDApIGlmIGl0IGV4aXN0cykuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1BoeURldGVjdChzdHJ1Y3QgbmljICpuaWMpCit7CisJdTE2IGNvbnRyb2w7CisJdTE2IGhpOworCXUxNiBsbzsKKwl1MzIgcGh5OworCisJaWYgKHRsYW5fcGNpX3RibFtjaGlwX2lkeF0uZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSkgeworCQlwcml2LT5waHlOdW0gPSAweEZGRkY7CisJCXJldHVybjsKKwl9CisKKwlUTGFuX01paVJlYWRSZWcobmljLCBUTEFOX1BIWV9NQVhfQUREUiwgTUlJX1BIWVNJRDEsICZoaSk7CisKKwlpZiAoaGkgIT0gMHhGRkZGKSB7CisJCXByaXYtPnBoeVswXSA9IFRMQU5fUEhZX01BWF9BRERSOworCX0gZWxzZSB7CisJCXByaXYtPnBoeVswXSA9IFRMQU5fUEhZX05PTkU7CisJfQorCisJcHJpdi0+cGh5WzFdID0gVExBTl9QSFlfTk9ORTsKKwlmb3IgKHBoeSA9IDA7IHBoeSA8PSBUTEFOX1BIWV9NQVhfQUREUjsgcGh5KyspIHsKKwkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfQk1DUiwgJmNvbnRyb2wpOworCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9QSFlTSUQxLCAmaGkpOworCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9QSFlTSUQyLCAmbG8pOworCQlpZiAoKGNvbnRyb2wgIT0gMHhGRkZGKSB8fCAoaGkgIT0gMHhGRkZGKQorCQkgICAgfHwgKGxvICE9IDB4RkZGRikpIHsKKwkJCXByaW50ZigiUEhZIGZvdW5kIGF0ICVoWCAlaFggJWhYICVoWFxuIiwgCisJCQkgICAgICAgKHVuc2lnbmVkIGludCkgcGh5LCBjb250cm9sLCBoaSwgbG8pOworCQkJaWYgKChwcml2LT5waHlbMV0gPT0gVExBTl9QSFlfTk9ORSkKKwkJCSAgICAmJiAocGh5ICE9IFRMQU5fUEhZX01BWF9BRERSKSkgeworCQkJCXByaXYtPnBoeVsxXSA9IHBoeTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChwcml2LT5waHlbMV0gIT0gVExBTl9QSFlfTk9ORSkgeworCQlwcml2LT5waHlOdW0gPSAxOworCX0gZWxzZSBpZiAocHJpdi0+cGh5WzBdICE9IFRMQU5fUEhZX05PTkUpIHsKKwkJcHJpdi0+cGh5TnVtID0gMDsKKwl9IGVsc2UgeworCQlwcmludGYKKwkJICAgICgiVExBTjogIENhbm5vdCBpbml0aWFsaXplIGRldmljZSwgbm8gUEhZIHdhcyBmb3VuZCFcbiIpOworCX0KKworfQkJCQkvKiBUTGFuX1BoeURldGVjdCAqLworCit2b2lkIFRMYW5fUGh5UG93ZXJEb3duKHN0cnVjdCBuaWMgKm5pYykKK3sKKworCXUxNiB2YWx1ZTsKKwlEQkcgKCAiJXM6IFBvd2VyaW5nIGRvd24gUEhZKHMpLlxuIiwgcHJpdi0+bmljX25hbWUgKTsKKwl2YWx1ZSA9IEJNQ1JfUERPV04gfCBCTUNSX0xPT1BCQUNLIHwgQk1DUl9JU09MQVRFOworCVRMYW5fTWlpU3luYyhCQVNFKTsKKwlUTGFuX01paVdyaXRlUmVnKG5pYywgcHJpdi0+cGh5W3ByaXYtPnBoeU51bV0sIE1JSV9CTUNSLCB2YWx1ZSk7CisJaWYgKChwcml2LT5waHlOdW0gPT0gMCkgJiYgKHByaXYtPnBoeVsxXSAhPSBUTEFOX1BIWV9OT05FKQorCSAgICAmJgorCSAgICAoISh0bGFuX3BjaV90YmxbY2hpcF9pZHhdLgorCSAgICAgICBmbGFncyAmIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwKSkpIHsKKwkJVExhbl9NaWlTeW5jKEJBU0UpOworCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcHJpdi0+cGh5WzFdLCBNSUlfQk1DUiwgdmFsdWUpOworCX0KKworCS8qIFdhaXQgZm9yIDUwIG1zIGFuZCBwb3dlcnVwCisJICogVGhpcyBpcyBhYml0cmFyeS4gIEl0IGlzIGludGVuZGVkIHRvIG1ha2Ugc3VyZSB0aGUKKwkgKiB0cmFuY2VpdmVyIHNldHRsZXMuCisJICovCisJLyogVExhbl9TZXRUaW1lciggZGV2LCAoSFovMjApLCBUTEFOX1RJTUVSX1BIWV9QVVAgKTsgKi8KKwltZGVsYXkoNTApOworCVRMYW5fUGh5UG93ZXJVcChuaWMpOworCit9CQkJCS8qIFRMYW5fUGh5UG93ZXJEb3duICovCisKKwordm9pZCBUTGFuX1BoeVBvd2VyVXAoc3RydWN0IG5pYyAqbmljKQoreworCXUxNiB2YWx1ZTsKKworCURCRyAoICIlczogUG93ZXJpbmcgdXAgUEhZLlxuIiwgcHJpdi0+bmljX25hbWUgKTsKKwlUTGFuX01paVN5bmMoQkFTRSk7CisJdmFsdWUgPSBCTUNSX0xPT1BCQUNLOworCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwcml2LT5waHlbcHJpdi0+cGh5TnVtXSwgTUlJX0JNQ1IsIHZhbHVlKTsKKwlUTGFuX01paVN5bmMoQkFTRSk7CisJLyogV2FpdCBmb3IgNTAwIG1zIGFuZCByZXNldCB0aGUKKwkgKiB0cmFuY2VpdmVyLiAgVGhlIFRMQU4gZG9jcyBzYXkgYm90aCA1MCBtcyBhbmQKKwkgKiA1MDAgbXMsIHNvIGRvIHRoZSBsb25nZXIsIGp1c3QgaW4gY2FzZS4KKwkgKi8KKwltZGVsYXkoNTAwKTsKKwlUTGFuX1BoeVJlc2V0KG5pYyk7CisJLyogVExhbl9TZXRUaW1lciggZGV2LCAoSFovMjApLCBUTEFOX1RJTUVSX1BIWV9SRVNFVCApOyAqLworCit9CQkJCS8qIFRMYW5fUGh5UG93ZXJVcCAqLworCit2b2lkIFRMYW5fUGh5UmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCXUxNiBwaHk7CisJdTE2IHZhbHVlOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwlEQkcgKCAiJXM6IFJlc2V0aW5nIFBIWS5cbiIsIHByaXYtPm5pY19uYW1lICk7CisJVExhbl9NaWlTeW5jKEJBU0UpOworCXZhbHVlID0gQk1DUl9MT09QQkFDSyB8IEJNQ1JfUkVTRVQ7CisJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0JNQ1IsIHZhbHVlKTsKKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9CTUNSLCAmdmFsdWUpOworCXdoaWxlICh2YWx1ZSAmIEJNQ1JfUkVTRVQpIHsKKwkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfQk1DUiwgJnZhbHVlKTsKKwl9CisKKwkvKiBXYWl0IGZvciA1MDAgbXMgYW5kIGluaXRpYWxpemUuCisJICogSSBkb24ndCByZW1lbWJlciB3aHkgSSB3YWl0IHRoaXMgbG9uZy4KKwkgKiBJJ3ZlIGNoYW5nZWQgdGhpcyB0byA1MG1zLCBhcyBpdCBzZWVtcyBsb25nIGVub3VnaC4KKwkgKi8KKwkvKiBUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTksgKTsgKi8KKwltZGVsYXkoNTApOworCVRMYW5fUGh5U3RhcnRMaW5rKG5pYyk7CisKK30JCQkJLyogVExhbl9QaHlSZXNldCAqLworCisKK3ZvaWQgVExhbl9QaHlTdGFydExpbmsoc3RydWN0IG5pYyAqbmljKQoreworCisJdTE2IGFiaWxpdHk7CisJdTE2IGNvbnRyb2w7CisJdTE2IGRhdGE7CisJdTE2IHBoeTsKKwl1MTYgc3RhdHVzOworCXUxNiB0Y3RsOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisJREJHICggIiVzOiBUcnlpbmcgdG8gYWN0aXZhdGUgbGluay5cbiIsIHByaXYtPm5pY19uYW1lICk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfQk1TUiwgJnN0YXR1cyk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfQk1TUiwgJmFiaWxpdHkpOworCisJaWYgKChzdGF0dXMgJiBCTVNSX0FORUdDQVBBQkxFKSAmJiAoIXByaXYtPmF1aSkpIHsKKwkJYWJpbGl0eSA9IHN0YXR1cyA+PiAxMTsKKwkJaWYgKHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAgJiYKKwkJICAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9IQUxGKSB7CisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfQk1DUiwgMHgwMDAwKTsKKwkJfSBlbHNlIGlmIChwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwICYmCisJCQkgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgeworCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0JNQ1IsIDB4MDEwMCk7CisJCX0gZWxzZSBpZiAocHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMDAgJiYKKwkJCSAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9IQUxGKSB7CisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfQk1DUiwgMHgyMDAwKTsKKwkJfSBlbHNlIGlmIChwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwMCAmJgorCQkJICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwpIHsKKwkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9CTUNSLCAweDIxMDApOworCQl9IGVsc2UgeworCisJCQkvKiBTZXQgQXV0by1OZWcgYWR2ZXJ0aXNlbWVudCAqLworCQkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0FEVkVSVElTRSwKKwkJCQkJIChhYmlsaXR5IDw8IDUpIHwgMSk7CisJCQkvKiBFbmFibGVlIEF1dG8tTmVnICovCisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfQk1DUiwgMHgxMDAwKTsKKwkJCS8qIFJlc3RhcnQgQXV0by1OZWcgKi8KKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9CTUNSLCAweDEyMDApOworCQkJLyogV2FpdCBmb3IgNCBzZWMgZm9yIGF1dG9uZWdvdGlhdGlvbgorCQkJICogdG8gY29tcGxldGUuICBUaGUgbWF4IHNwZWMgdGltZSBpcyBsZXNzIHRoYW4gdGhpcworCQkJICogYnV0IHRoZSBjYXJkIG5lZWQgYWRkaXRpb25hbCB0aW1lIHRvIHN0YXJ0IEFOLgorCQkJICogLjUgc2VjIHNob3VsZCBiZSBwbGVudHkgZXh0cmEuCisJCQkgKi8KKwkJCURCRyAoICJUTEFOOiAlczogU3RhcnRpbmcgYXV0b25lZ290aWF0aW9uLlxuIiwKKwkJCSAgICAgICBwcml2LT5uaWNfbmFtZSApOworCQkJbWRlbGF5KDQwMDApOworCQkJVExhbl9QaHlGaW5pc2hBdXRvTmVnKG5pYyk7CisJCQkvKiBUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9QSFlfRklOSVNIX0FOICk7ICovCisJCQlyZXR1cm47CisJCX0KKworCX0KKworCWlmICgocHJpdi0+YXVpKSAmJiAocHJpdi0+cGh5TnVtICE9IDApKSB7CisJCXByaXYtPnBoeU51bSA9IDA7CisJCWRhdGEgPQorCQkgICAgVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOIHwKKwkJICAgIFRMQU5fTkVUX0NGR19QSFlfRU47CisJCVRMYW5fRGlvV3JpdGUxNihCQVNFLCBUTEFOX05FVF9DT05GSUcsIGRhdGEpOworCQltZGVsYXkoNTApOworCQkvKiBUTGFuX1NldFRpbWVyKCBkZXYsICg0MCpIWi8xMDAwKSwgVExBTl9USU1FUl9QSFlfUERPV04gKTsgKi8KKwkJVExhbl9QaHlQb3dlckRvd24obmljKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAocHJpdi0+cGh5TnVtID09IDApIHsKKwkJY29udHJvbCA9IDA7CisJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgVExBTl9UTFBIWV9DVEwsICZ0Y3RsKTsKKwkJaWYgKHByaXYtPmF1aSkgeworCQkJdGN0bCB8PSBUTEFOX1RDX0FVSVNFTDsKKwkJfSBlbHNlIHsKKwkJCXRjdGwgJj0gflRMQU5fVENfQVVJU0VMOworCQkJaWYgKHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMKSB7CisJCQkJY29udHJvbCB8PSBCTUNSX0ZVTExEUExYOworCQkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJCX0KKwkJCWlmIChwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwMCkgeworCQkJCWNvbnRyb2wgfD0gQk1DUl9TUEVFRDEwMDsKKwkJCX0KKwkJfQorCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfQk1DUiwgY29udHJvbCk7CisJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0Y3RsKTsKKwl9CisKKwkvKiBXYWl0IGZvciAyIHNlYyB0byBnaXZlIHRoZSB0cmFuY2VpdmVyIHRpbWUKKwkgKiB0byBlc3RhYmxpc2ggbGluay4KKwkgKi8KKwkvKiBUTGFuX1NldFRpbWVyKCBkZXYsICg0KkhaKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsgKi8KKwltZGVsYXkoMjAwMCk7CisJVExhbl9GaW5pc2hSZXNldChuaWMpOworCit9CQkJCS8qIFRMYW5fUGh5U3RhcnRMaW5rICovCisKK3ZvaWQgVExhbl9QaHlGaW5pc2hBdXRvTmVnKHN0cnVjdCBuaWMgKm5pYykKK3sKKworCXUxNiBhbl9hZHY7CisJdTE2IGFuX2xwYTsKKwl1MTYgZGF0YTsKKwl1MTYgbW9kZTsKKwl1MTYgcGh5OworCXUxNiBzdGF0dXM7CisKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0JNU1IsICZzdGF0dXMpOworCXVkZWxheSgxMDAwKTsKKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9CTVNSLCAmc3RhdHVzKTsKKworCWlmICghKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKSkgeworCQkvKiBXYWl0IGZvciA4IHNlYyB0byBnaXZlIHRoZSBwcm9jZXNzCisJCSAqIG1vcmUgdGltZS4gIFBlcmhhcHMgd2Ugc2hvdWxkIGZhaWwgYWZ0ZXIgYSB3aGlsZS4KKwkJICovCisJCWlmICghcHJpdi0+bmVnX2JlX3ZlcmJvc2UrKykgeworCQkJcHJpbnRmCisJCQkgICAgKCJUTEFOOiAgR2l2aW5nIGF1dG9uZWdvdGlhdGlvbiBtb3JlIHRpbWUuXG4iKTsKKwkJCXByaW50ZgorCQkJICAgICgiVExBTjogIFBsZWFzZSBjaGVjayB0aGF0IHlvdXIgYWRhcHRlciBoYXNcbiIpOworCQkJcHJpbnRmCisJCQkgICAgKCJUTEFOOiAgYmVlbiBwcm9wZXJseSBjb25uZWN0ZWQgdG8gYSBIVUIgb3IgU3dpdGNoLlxuIik7CisJCQlwcmludGYKKwkJCSAgICAoIlRMQU46ICBUcnlpbmcgdG8gZXN0YWJsaXNoIGxpbmsgaW4gdGhlIGJhY2tncm91bmQuLi5cbiIpOworCQl9CisJCW1kZWxheSg4MDAwKTsKKwkJVExhbl9QaHlGaW5pc2hBdXRvTmVnKG5pYyk7CisJCS8qIFRMYW5fU2V0VGltZXIoIGRldiwgKDgqSFopLCBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4gKTsgKi8KKwkJcmV0dXJuOworCX0KKworCURCRyAoICJUTEFOOiAlczogQXV0b25lZ290aWF0aW9uIGNvbXBsZXRlLlxuIiwgcHJpdi0+bmljX25hbWUgKTsKKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9BRFZFUlRJU0UsICZhbl9hZHYpOworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0xQQSwgJmFuX2xwYSk7CisJbW9kZSA9IGFuX2FkdiAmIGFuX2xwYSAmIDB4MDNFMDsKKwlpZiAobW9kZSAmIDB4MDEwMCkgeworCQlwcmludGYoIkZ1bGwgRHVwbGV4XG4iKTsKKwkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCX0gZWxzZSBpZiAoIShtb2RlICYgMHgwMDgwKSAmJiAobW9kZSAmIDB4MDA0MCkpIHsKKwkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQlwcmludGYoIkZ1bGwgRHVwbGV4XG4iKTsKKwl9CisKKwlpZiAoKCEobW9kZSAmIDB4MDE4MCkpCisJICAgICYmICh0bGFuX3BjaV90YmxbY2hpcF9pZHhdLmZsYWdzICYgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTApCisJICAgICYmIChwcml2LT5waHlOdW0gIT0gMCkpIHsKKwkJcHJpdi0+cGh5TnVtID0gMDsKKwkJZGF0YSA9CisJCSAgICBUTEFOX05FVF9DRkdfMUZSQUcgfCBUTEFOX05FVF9DRkdfMUNIQU4gfAorCQkgICAgVExBTl9ORVRfQ0ZHX1BIWV9FTjsKKwkJVExhbl9EaW9Xcml0ZTE2KEJBU0UsIFRMQU5fTkVUX0NPTkZJRywgZGF0YSk7CisJCS8qIFRMYW5fU2V0VGltZXIoIG5pYywgKDQwMCpIWi8xMDAwKSwgVExBTl9USU1FUl9QSFlfUERPV04gKTsgKi8KKwkJbWRlbGF5KDQwMCk7CisJCVRMYW5fUGh5UG93ZXJEb3duKG5pYyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocHJpdi0+cGh5TnVtID09IDApIHsKKwkJaWYgKChwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkKKwkJICAgIHx8IChhbl9hZHYgJiBhbl9scGEgJiAweDAwNDApKSB7CisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfQk1DUiwKKwkJCQkJIEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0ZVTExEUExYKTsKKwkJCURCRyAKKwkJCSAgICAoICJUTEFOOiAgU3RhcnRpbmcgaW50ZXJuYWwgUEhZIHdpdGggRlVMTC1EVVBMRVhcbiIgKTsKKwkJfSBlbHNlIHsKKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9CTUNSLAorCQkJCQkgQk1DUl9BTkVOQUJMRSk7CisJCQlEQkcgCisJCQkgICAgKCAiVExBTjogIFN0YXJ0aW5nIGludGVybmFsIFBIWSB3aXRoIEhBTEYtRFVQTEVYXG4iICk7CisJCX0KKwl9CisKKwkvKiBXYWl0IGZvciAxMDAgbXMuICBObyByZWFzb24gaW4gcGFydGl0aWN1bGFyLgorCSAqLworCS8qIFRMYW5fU2V0VGltZXIoIGRldiwgKEhaLzEwKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsgKi8KKwltZGVsYXkoMTAwKTsKKwlUTGFuX0ZpbmlzaFJlc2V0KG5pYyk7CisKK30JCQkJLyogVExhbl9QaHlGaW5pc2hBdXRvTmVnICovCisKKyNpZmRlZiBNT05JVE9SCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICBUTGFuX3BoeU1vbml0b3IKKyoKKyogICAgICBSZXR1cm5zOgorKiAgICAgICAgICAgICAgTm9uZQorKgorKiAgICAgIFBhcmFtczoKKyogICAgICAgICAgICAgIGRldiAgICAgICAgICAgICBUaGUgZGV2aWNlIHN0cnVjdHVyZSBvZiB0aGlzIGRldmljZS4KKyoKKyoKKyogICAgICBUaGlzIGZ1bmN0aW9uIG1vbml0b3JzIFBIWSBjb25kaXRpb24gYnkgcmVhZGluZyB0aGUgc3RhdHVzCisqICAgICAgcmVnaXN0ZXIgdmlhIHRoZSBNSUkgYnVzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGdpdmUgaW5mbworKiAgICAgIGFib3V0IGxpbmsgY2hhbmdlcyAodXAvZG93biksIGFuZCBwb3NzaWJsZSBzd2l0Y2ggdG8gYWx0ZXJuYXRlCisqICAgICAgbWVkaWEuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1BoeU1vbml0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7CisJdTE2IHBoeTsKKwl1MTYgcGh5X3N0YXR1czsKKworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisJLyogR2V0IFBIWSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9CTVNSLCAmcGh5X3N0YXR1cyk7CisKKwkvKiBDaGVjayBpZiBsaW5rIGhhcyBiZWVuIGxvc3QgKi8KKwlpZiAoIShwaHlfc3RhdHVzICYgQk1TUl9MU1RBVFVTKSkgeworCQlpZiAocHJpdi0+bGluaykgeworCQkJcHJpdi0+bGluayA9IDA7CisJCQlwcmludGYoIlRMQU46ICVzIGhhcyBsb3N0IGxpbmtcbiIsIHByaXYtPm5pY19uYW1lKTsKKwkJCXByaXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsKKwkJCW1kZWxheSgyMDAwKTsKKwkJCVRMYW5fUGh5TW9uaXRvcihuaWMpOworCQkJLyogVExhbl9TZXRUaW1lciggZGV2LCAoMipIWiksIFRMQU5fVElNRVJfTElOS19CRUFUICk7ICovCisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBMaW5rIHJlc3RhYmxpc2hlZD8gKi8KKwlpZiAoKHBoeV9zdGF0dXMgJiBCTVNSX0xTVEFUVVMpICYmICFwcml2LT5saW5rKSB7CisJCXByaXYtPmxpbmsgPSAxOworCQlwcmludGYoIlRMQU46ICVzIGhhcyByZWVzdGFibGlzaGVkIGxpbmtcbiIsCisJCSAgICAgICBwcml2LT5uaWNfbmFtZSk7CisJCXByaXYtPmZsYWdzIHw9IElGRl9SVU5OSU5HOworCX0KKworCS8qIFNldHVwIGEgbmV3IG1vbml0b3IgKi8KKwkvKiBUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsgKi8KKwltZGVsYXkoMjAwMCk7CisJVExhbl9QaHlNb25pdG9yKG5pYyk7Cit9CisKKyNlbmRpZgkJCQkvKiBNT05JVE9SICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0bGFuX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MGUxMSwgMHhhZTM0LCAibmV0ZWwxMCIsICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAgVCBQQ0kgVVRQIiwgMCksCisJUENJX1JPTSgweDBlMTEsIDB4YWUzMiwgIm5ldGVsMTAwIiwiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBQQ0kgVVRQIiwgMCksCisJUENJX1JPTSgweDBlMTEsIDB4YWUzNSwgIm5ldGZsZXgzaSIsICJDb21wYXEgSW50ZWdyYXRlZCBOZXRGbGV4LTMvUCIsIDApLAorCVBDSV9ST00oMHgwZTExLCAweGYxMzAsICJ0aHVuZGVyIiwgIkNvbXBhcSBOZXRGbGV4LTMvUCIsIDApLAorCVBDSV9ST00oMHgwZTExLCAweGYxNTAsICJuZXRmbGV4M2IiLCAiQ29tcGFxIE5ldEZsZXgtMy9QIiwgMCksCisJUENJX1JPTSgweDBlMTEsIDB4YWU0MywgIm5ldGVsMTAwcGkiLCAiQ29tcGFxIE5ldGVsbGlnZW50IEludGVncmF0ZWQgMTAvMTAwIFRYIFVUUCIsIDApLAorCVBDSV9ST00oMHgwZTExLCAweGFlNDAsICJuZXRlbDEwMGQiLCAiQ29tcGFxIE5ldGVsbGlnZW50IER1YWwgMTAvMTAwIFRYIFBDSSBVVFAiLCAwKSwKKwlQQ0lfUk9NKDB4MGUxMSwgMHhiMDExLCAibmV0ZWwxMDBpIiwgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggRW1iZWRkZWQgVVRQIiwgMCksCisJUENJX1JPTSgweDEwOGQsIDB4MDAxMywgIm9jMjE4MyIsICJPbGljb20gT0MtMjE4My8yMTg1IiwgMCksCisJUENJX1JPTSgweDEwOGQsIDB4MDAxMiwgIm9jMjMyNSIsICJPbGljb20gT0MtMjMyNSIsIDApLAorCVBDSV9ST00oMHgxMDhkLCAweDAwMTQsICJvYzIzMjYiLCAiT2xpY29tIE9DLTIzMjYiLCAwKSwKKwlQQ0lfUk9NKDB4MGUxMSwgMHhiMDMwLCAibmV0ZWxsaWdlbnRfMTBfMTAwX3dzXzUxMDAiLCAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBVVFAiLCAwKSwKKwlQQ0lfUk9NKDB4MGUxMSwgMHhiMDEyLCAibmV0ZWxsaWdlbnRfMTBfdDIiLCAiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQvMiBQQ0kgVVRQL0NvYXgiLCAwKSwKK307CisKK1BDSV9EUklWRVIgKCB0bGFuX2RyaXZlciwgdGxhbl9uaWNzLCBQQ0lfTk9fQ0xBU1MgKTsKKworRFJJVkVSICggIlRMQU4vUENJIiwgbmljX2RyaXZlciwgcGNpX2RyaXZlciwgdGxhbl9kcml2ZXIsCisJIHRsYW5fcHJvYmUsIHRsYW5fZGlzYWJsZSApOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdGxhbi5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdGxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjNjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC90bGFuLmgKQEAgLTAsMCArMSw0OTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICB0bGFuLmMgLS0gRXRoZXJib290IGRldmljZSBkcml2ZXIgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUaHVuZGVyTEFOCisqICAgIFdyaXR0ZW4gMjAwMy0yMDAzIGJ5IFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogICAgUG9ydGlvbnMgb2YgdGhpcyBjb2RlIChhbG1vc3QgYWxsKSBiYXNlZCBvbjoKKyogICAgICAgICAgICAgICB0bGFuLmM6IExpbnV4IFRodW5kZXJMYW4gRHJpdmVyOgorKgorKgkJCQlieSBKYW1lcyBCYW5rcworKgorKiAgCQkJCShDKSAxOTk3LTE5OTggQ2FsZGVyYSwgSW5jLgorKgkJCSAgCShDKSAxOTk4IEphbWVzIEJhbmtzCisqCQkJCShDKSAxOTk5LTIwMDEgVG9yYmVuIE1hdGhpYXNlbgorKgkJCQkoQykgMjAwMiBTYW11ZWwgQ2hlc3NtYW4KKyoKKyogICAgUkVWSVNJT04gSElTVE9SWToKKyogICAgPT09PT09PT09PT09PT09PQorKiAgICB2MS4wCTA3LTA4LTIwMDMJdGltbGVnZ2UJSW5pdGlhbCBub3QgcXVpdGUgd29ya2luZyB2ZXJzaW9uCisqCisqIEluZGVudCBTdHlsZTogaW5kZW50IC1rciAtaTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVExhbiBEZWZpbml0aW9ucworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGQUxTRQkJCTAKKyNkZWZpbmUgVFJVRQkJCTEKKworI2RlZmluZSBUTEFOX01JTl9GUkFNRV9TSVpFCTY0CisjZGVmaW5lIFRMQU5fTUFYX0ZSQU1FX1NJWkUJMTYwMAorCisjZGVmaW5lIFRMQU5fTlVNX1JYX0xJU1RTCTQKKyNkZWZpbmUgVExBTl9OVU1fVFhfTElTVFMJMgorCisjZGVmaW5lIFRMQU5fSUdOT1JFCQkwCisjZGVmaW5lIFRMQU5fUkVDT1JECQkxCisvKgorI2RlZmluZSBUTEFOX0RCRyhsdmwsIGZvcm1hdCwgYXJncy4uLikJaWYgKGRlYnVnJmx2bCkgcHJpbnRmKCJUTEFOOiAiIGZvcm1hdCwgIyNhcmdzICk7CisqLworI2RlZmluZSBUTEFOX0RFQlVHX0dOUkwJCTB4MDAwMQorI2RlZmluZSBUTEFOX0RFQlVHX1RYCQkweDAwMDIKKyNkZWZpbmUgVExBTl9ERUJVR19SWAkJMHgwMDA0CisjZGVmaW5lIFRMQU5fREVCVUdfTElTVAkJMHgwMDA4CisjZGVmaW5lIFRMQU5fREVCVUdfUFJPQkUJMHgwMDEwCisKKyNkZWZpbmUgVFhfVElNRU9VVAkJKDEwKkhaKQkvKiBXZSBuZWVkIHRpbWUgZm9yIGF1dG8tbmVnICovCisjZGVmaW5lIE1BWF9UTEFOX0JPQVJEUwkJOAkvKiBNYXggbnVtYmVyIG9mIGJvYXJkcyBpbnN0YWxsZWQgYXQgYSB0aW1lICovCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIERldmljZSBJZGVudGlmaWNhdGlvbiBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRFTExJR0VOVF8xMF9UMgkJCTB4QjAxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwXzEwMF9XU181MTAwCTB4QjAzMAorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMTgzCQkJMHgwMDEzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNQkJCTB4MDAxMgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjYJCQkweDAwMTQKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB0bGFuX2FkYXB0ZXJfZW50cnkgeworCXUxNiB2ZW5kb3JJZDsKKwl1MTYgZGV2aWNlSWQ7CisJY2hhciAqZGV2aWNlTGFiZWw7CisJdTMyIGZsYWdzOworCXUxNiBhZGRyT2ZzOworfSBUTGFuQWRhcHRlckVudHJ5OworCisjZGVmaW5lIFRMQU5fQURBUFRFUl9OT05FCQkweDAwMDAwMDAwCisjZGVmaW5lIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZCTB4MDAwMDAwMDEKKyNkZWZpbmUgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWQkweDAwMDAwMDAyCisjZGVmaW5lIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwCTB4MDAwMDAwMDQKKyNkZWZpbmUgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRAkweDAwMDAwMDA4CisKKyNkZWZpbmUgVExBTl9TUEVFRF9ERUZBVUxUCTAKKyNkZWZpbmUgVExBTl9TUEVFRF8xMAkJMTAKKyNkZWZpbmUgVExBTl9TUEVFRF8xMDAJCTEwMAorCisjZGVmaW5lIFRMQU5fRFVQTEVYX0RFRkFVTFQJMAorI2RlZmluZSBUTEFOX0RVUExFWF9IQUxGCTEKKyNkZWZpbmUgVExBTl9EVVBMRVhfRlVMTAkyCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRUlTQSBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRUlTQV9JRCAgICAgIDB4YzgwCS8qIEVJU0EgSUQgUmVnaXN0ZXJzICovCisjZGVmaW5lIEVJU0FfSUQwICAgICAweGM4MAkvKiBFSVNBIElEIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgRUlTQV9JRDEgICAgIDB4YzgxCS8qIEVJU0EgSUQgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBFSVNBX0lEMiAgICAgMHhjODIJLyogRUlTQSBJRCBSZWdpc3RlciAyICovCisjZGVmaW5lIEVJU0FfSUQzICAgICAweGM4MwkvKiBFSVNBIElEIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgRUlTQV9DUiAgICAgIDB4Yzg0CS8qIEVJU0EgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBFSVNBX1JFRzAgICAgMHhjODgJLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgRUlTQV9SRUcxICAgIDB4Yzg5CS8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lIEVJU0FfUkVHMiAgICAweGM4YQkvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBFSVNBX1JFRzMgICAgMHhjOGYJLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgRUlTQV9BUFJPTSAgIDB4YzkwCS8qIEV0aGVybmV0IEFkZHJlc3MgUFJPTSAqLworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFJ4L1R4IExpc3QgRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRMQU5fQlVGRkVSU19QRVJfTElTVAkxMAorI2RlZmluZSBUTEFOX0xBU1RfQlVGRkVSCTB4ODAwMDAwMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9VTlVTRUQJMHg4MDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfRlJNX0NNUAkweDQwMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9SRUFEWQkweDMwMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9FT0MJCTB4MDgwMAorI2RlZmluZSBUTEFOX0NTVEFUX1JYX0VSUk9SCTB4MDQwMAorI2RlZmluZSBUTEFOX0NTVEFUX1BBU1NfQ1JDCTB4MDIwMAorI2RlZmluZSBUTEFOX0NTVEFUX0RQX1BSCTB4MDEwMAorCisKKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFBIWSBkZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9QSFlfTUFYX0FERFIJMHgxRgorI2RlZmluZSBUTEFOX1BIWV9OT05FCQkweDIwCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVExhbiBEcml2ZXIgVGltZXIgRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRMQU5fVElNRVJfTElOS19CRUFUCQkxCisjZGVmaW5lIFRMQU5fVElNRVJfQUNUSVZJVFkJCTIKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfUERPV04JCTMKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfUFVQCQk0CisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX1JFU0VUCQk1CisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTksJNgorI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4JNworI2RlZmluZSBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVAkJOAorCisjZGVmaW5lIFRMQU5fVElNRVJfQUNUX0RFTEFZCQkoSFovMTApCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBUTGFuIERyaXZlciBFZXByb20gRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRMQU5fRUVQUk9NX0FDSwkJMAorI2RlZmluZSBUTEFOX0VFUFJPTV9TVE9QCTEKKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEhvc3QgUmVnaXN0ZXIgT2Zmc2V0cyBhbmQgQ29udGVudHMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRMQU5fSE9TVF9DTUQJCQkweDAwCisjZGVmaW5lIAlUTEFOX0hDX0dPCQkweDgwMDAwMDAwCisjZGVmaW5lCQlUTEFOX0hDX1NUT1AJCTB4NDAwMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfQUNLCQkweDIwMDAwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0NTX01BU0sJCTB4MUZFMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfRU9DCQkweDAwMTAwMDAwCisjZGVmaW5lCQlUTEFOX0hDX1JUCQkweDAwMDgwMDAwCisjZGVmaW5lCQlUTEFOX0hDX05FUwkJMHgwMDA0MDAwMAorI2RlZmluZQkJVExBTl9IQ19BRF9SU1QJCTB4MDAwMDgwMDAKKyNkZWZpbmUJCVRMQU5fSENfTERfVE1SCQkweDAwMDA0MDAwCisjZGVmaW5lCQlUTEFOX0hDX0xEX1RIUgkJMHgwMDAwMjAwMAorI2RlZmluZQkJVExBTl9IQ19SRVFfSU5UCQkweDAwMDAxMDAwCisjZGVmaW5lCQlUTEFOX0hDX0lOVF9PRkYJCTB4MDAwMDA4MDAKKyNkZWZpbmUJCVRMQU5fSENfSU5UX09OCQkweDAwMDAwNDAwCisjZGVmaW5lCQlUTEFOX0hDX0FDX01BU0sJCTB4MDAwMDAwRkYKKyNkZWZpbmUgVExBTl9DSF9QQVJNCQkJMHgwNAorI2RlZmluZSBUTEFOX0RJT19BRFIJCQkweDA4CisjZGVmaW5lCQlUTEFOX0RBX0FEUl9JTkMJCTB4ODAwMAorI2RlZmluZQkJVExBTl9EQV9SQU1fQURSCQkweDQwMDAKKyNkZWZpbmUgVExBTl9IT1NUX0lOVAkJCTB4MEEKKyNkZWZpbmUJCVRMQU5fSElfSVZfTUFTSwkJMHgxRkUwCisjZGVmaW5lCQlUTEFOX0hJX0lUX01BU0sJCTB4MDAxQworI2RlZmluZSBUTEFOX0RJT19EQVRBCQkJMHgwQworCisKKy8qIFRodW5kZXJMQU4gSW50ZXJuYWwgUmVnaXN0ZXIgRElPIE9mZnNldHMgKi8KKworI2RlZmluZSBUTEFOX05FVF9DTUQJCQkweDAwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfTlJFU0VUCTB4ODAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OV1JBUAkweDQwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfQ1NGCTB4MjAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DQUYJMHgxMAorI2RlZmluZQkJVExBTl9ORVRfQ01EX05PQlJYCTB4MDgKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9EVVBMRVgJMHgwNAorI2RlZmluZQkJVExBTl9ORVRfQ01EX1RSRlJBTQkweDAyCisjZGVmaW5lCQlUTEFOX05FVF9DTURfVFhQQUNFCTB4MDEKKyNkZWZpbmUgVExBTl9ORVRfU0lPCQkJMHgwMQorI2RlZmluZSAJVExBTl9ORVRfU0lPX01JTlRFTgkweDgwCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fRUNMT0sJMHg0MAorI2RlZmluZQkJVExBTl9ORVRfU0lPX0VUWEVOCTB4MjAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19FREFUQQkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTk1SU1QJMHgwOAorI2RlZmluZQkJVExBTl9ORVRfU0lPX01DTEsJMHgwNAorI2RlZmluZQkJVExBTl9ORVRfU0lPX01UWEVOCTB4MDIKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19NREFUQQkweDAxCisjZGVmaW5lIFRMQU5fTkVUX1NUUwkJCTB4MDIKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19NSVJRCTB4ODAKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19IQkVBVAkweDQwCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfVFhTVE9QCTB4MjAKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19SWFNUT1AJMHgxMAorI2RlZmluZQkJVExBTl9ORVRfU1RTX1JTUlZECTB4MEYKKyNkZWZpbmUgVExBTl9ORVRfTUFTSwkJCTB4MDMKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzcJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNgkweDQwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s1CTB4MjAKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzQJMHgxMAorI2RlZmluZQkJVExBTl9ORVRfTUFTS19SU1JWRAkweDBGCisjZGVmaW5lIFRMQU5fTkVUX0NPTkZJRwkJCTB4MDQKKyNkZWZpbmUgCVRMQU5fTkVUX0NGR19SQ0xLCTB4ODAwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1RDTEsJMHg0MDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfQklUCTB4MjAwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1JYQ1JDCTB4MTAwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BFRgkweDA4MDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR18xRlJBRwkweDA0MDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR18xQ0hBTgkweDAyMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19NVEVTVAkweDAxMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19QSFlfRU4JMHgwMDgwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfTVNNQVNLCTB4MDA3RgorI2RlZmluZSBUTEFOX01BTl9URVNUCQkJMHgwNgorI2RlZmluZSBUTEFOX0RFRl9WRU5ET1JfSUQJCTB4MDgKKyNkZWZpbmUgVExBTl9ERUZfREVWSUNFX0lECQkweDBBCisjZGVmaW5lIFRMQU5fREVGX1JFVklTSU9OCQkweDBDCisjZGVmaW5lIFRMQU5fREVGX1NVQkNMQVNTCQkweDBECisjZGVmaW5lIFRMQU5fREVGX01JTl9MQVQJCTB4MEUKKyNkZWZpbmUgVExBTl9ERUZfTUFYX0xBVAkJMHgwRgorI2RlZmluZSBUTEFOX0FSRUdfMAkJCTB4MTAKKyNkZWZpbmUgVExBTl9BUkVHXzEJCQkweDE2CisjZGVmaW5lIFRMQU5fQVJFR18yCQkJMHgxQworI2RlZmluZSBUTEFOX0FSRUdfMwkJCTB4MjIKKyNkZWZpbmUgVExBTl9IQVNIXzEJCQkweDI4CisjZGVmaW5lIFRMQU5fSEFTSF8yCQkJMHgyQworI2RlZmluZSBUTEFOX0dPT0RfVFhfRlJNUwkJMHgzMAorI2RlZmluZSBUTEFOX1RYX1VOREVSVU5TCQkweDMzCisjZGVmaW5lIFRMQU5fR09PRF9SWF9GUk1TCQkweDM0CisjZGVmaW5lIFRMQU5fUlhfT1ZFUlJVTlMJCTB4MzcKKyNkZWZpbmUgVExBTl9ERUZFUlJFRF9UWAkJMHgzOAorI2RlZmluZSBUTEFOX0NSQ19FUlJPUlMJCQkweDNBCisjZGVmaW5lIFRMQU5fQ09ERV9FUlJPUlMJCTB4M0IKKyNkZWZpbmUgVExBTl9NVUxUSUNPTF9GUk1TCQkweDNDCisjZGVmaW5lIFRMQU5fU0lOR0xFQ09MX0ZSTVMJCTB4M0UKKyNkZWZpbmUgVExBTl9FWENFU1NDT0xfRlJNUwkJMHg0MAorI2RlZmluZSBUTEFOX0xBVEVfQ09MUwkJCTB4NDEKKyNkZWZpbmUgVExBTl9DQVJSSUVSX0xPU1MJCTB4NDIKKyNkZWZpbmUgVExBTl9BQ09NTUlUCQkJMHg0MworI2RlZmluZSBUTEFOX0xFRF9SRUcJCQkweDQ0CisjZGVmaW5lCQlUTEFOX0xFRF9BQ1QJCTB4MTAKKyNkZWZpbmUJCVRMQU5fTEVEX0xJTksJCTB4MDEKKyNkZWZpbmUgVExBTl9CU0laRV9SRUcJCQkweDQ1CisjZGVmaW5lIFRMQU5fTUFYX1JYCQkJMHg0NgorI2RlZmluZSBUTEFOX0lOVF9ESVMJCQkweDQ4CisjZGVmaW5lCQlUTEFOX0lEX1RYX0VPQwkJMHgwNAorI2RlZmluZQkJVExBTl9JRF9SWF9FT0YJCTB4MDIKKyNkZWZpbmUJCVRMQU5fSURfUlhfRU9DCQkweDAxCisKKworCisvKiBUaHVuZGVyTEFOIEludGVycnVwdCBDb2RlcyAqLworCisjZGVmaW5lIFRMQU5fSU5UX05VTUJFUl9PRl9JTlRTCTgKKworI2RlZmluZSBUTEFOX0lOVF9OT05FCQkJMHgwMDAwCisjZGVmaW5lIFRMQU5fSU5UX1RYX0VPRgkJCTB4MDAwMQorI2RlZmluZSBUTEFOX0lOVF9TVEFUX09WRVJGTE9XCQkweDAwMDIKKyNkZWZpbmUgVExBTl9JTlRfUlhfRU9GCQkJMHgwMDAzCisjZGVmaW5lIFRMQU5fSU5UX0RVTU1ZCQkJMHgwMDA0CisjZGVmaW5lIFRMQU5fSU5UX1RYX0VPQwkJCTB4MDAwNQorI2RlZmluZSBUTEFOX0lOVF9TVEFUVVNfQ0hFQ0sJCTB4MDAwNgorI2RlZmluZSBUTEFOX0lOVF9SWF9FT0MJCQkweDAwMDcKKworCisKKy8qIFRodW5kZXJMQU4gTUlJIFJlZ2lzdGVycyAqLworCisvKiBUaHVuZGVyTEFOIFNwZWNpZmljIE1JSS9QSFkgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgVExBTl9UTFBIWV9JRAkJCTB4MTAKKyNkZWZpbmUgVExBTl9UTFBIWV9DVEwJCQkweDExCisjZGVmaW5lIAlUTEFOX1RDX0lHTElOSwkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX1RDX1NXQVBPTAkJMHg0MDAwCisjZGVmaW5lCQlUTEFOX1RDX0FVSVNFTAkJMHgyMDAwCisjZGVmaW5lCQlUTEFOX1RDX1NRRUVOCQkweDEwMDAKKyNkZWZpbmUJCVRMQU5fVENfTVRFU1QJCTB4MDgwMAorI2RlZmluZQkJVExBTl9UQ19SRVNFUlZFRAkweDA3RjgKKyNkZWZpbmUJCVRMQU5fVENfTkZFVwkJMHgwMDA0CisjZGVmaW5lCQlUTEFOX1RDX0lOVEVOCQkweDAwMDIKKyNkZWZpbmUJCVRMQU5fVENfVElOVAkJMHgwMDAxCisjZGVmaW5lIFRMQU5fVExQSFlfU1RTCQkJMHgxMgorI2RlZmluZQkJVExBTl9UU19NSU5UCQkweDgwMDAKKyNkZWZpbmUJCVRMQU5fVFNfUEhPSwkJMHg0MDAwCisjZGVmaW5lCQlUTEFOX1RTX1BPTE9LCQkweDIwMDAKKyNkZWZpbmUJCVRMQU5fVFNfVFBFTkVSR1kJMHgxMDAwCisjZGVmaW5lCQlUTEFOX1RTX1JFU0VSVkVECTB4MEZGRgorI2RlZmluZSBUTEFOX1RMUEhZX1BBUgkJCTB4MTkKKyNkZWZpbmUJCVRMQU5fUEhZX0NJTV9TVEFUCTB4MDAyMAorI2RlZmluZQkJVExBTl9QSFlfU1BFRURfMTAwCTB4MDA0MAorI2RlZmluZQkJVExBTl9QSFlfRFVQTEVYX0ZVTEwJMHgwMDgwCisjZGVmaW5lCQlUTEFOX1BIWV9BTl9FTl9TVEFUICAgICAweDA0MDAKKworLyogTmF0aW9uYWwgU2VtLiAmIExldmVsMSBQSFkgaWQncyAqLworI2RlZmluZSBOQVRfU0VNX0lEMQkJCTB4MjAwMAorI2RlZmluZSBOQVRfU0VNX0lEMgkJCTB4NUMwMQorI2RlZmluZSBMRVZFTDFfSUQxCQkJMHg3ODEwCisjZGVmaW5lIExFVkVMMV9JRDIJCQkweDAwMDAKKworI2RlZmluZSBDSVJDX0lOQyggYSwgYiApIGlmICggKythID49IGIgKSBhID0gMAorCisvKiBSb3V0aW5lcyB0byBhY2Nlc3MgaW50ZXJuYWwgcmVnaXN0ZXJzLiAqLworCitzdGF0aWMgaW5saW5lIHU4IFRMYW5fRGlvUmVhZDgodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW5iKChiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBKSArIChpbnRlcm5hbF9hZGRyICYgMHgzKSkpOworCit9CQkJCS8qIFRMYW5fRGlvUmVhZDggKi8KKworCisKKworc3RhdGljIGlubGluZSB1MTYgVExhbl9EaW9SZWFkMTYodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW53KChiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBKSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSkpOworCit9CQkJCS8qIFRMYW5fRGlvUmVhZDE2ICovCisKKworCisKK3N0YXRpYyBpbmxpbmUgdTMyIFRMYW5fRGlvUmVhZDMyKHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlyZXR1cm4gKGlubChiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBKSk7CisKK30JCQkJLyogVExhbl9EaW9SZWFkMzIgKi8KKworCisKKworc3RhdGljIGlubGluZSB2b2lkIFRMYW5fRGlvV3JpdGU4KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1OCBkYXRhKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlvdXRiKGRhdGEsIGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAoaW50ZXJuYWxfYWRkciAmIDB4MykpOworCit9CisKKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBUTGFuX0Rpb1dyaXRlMTYodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIsIHUxNiBkYXRhKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlvdXR3KGRhdGEsIGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAoaW50ZXJuYWxfYWRkciAmIDB4MikpOworCit9CisKKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBUTGFuX0Rpb1dyaXRlMzIodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIsIHUzMiBkYXRhKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlvdXRsKGRhdGEsIGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAoaW50ZXJuYWxfYWRkciAmIDB4MikpOworCit9CisKKworCisjaWYgMAorc3RhdGljIGlubGluZSB2b2lkIFRMYW5fQ2xlYXJCaXQodTggYml0LCB1MTYgcG9ydCkKK3sKKwlvdXRiX3AoaW5iX3AocG9ydCkgJiB+Yml0LCBwb3J0KTsKK30KKworCisKKworc3RhdGljIGlubGluZSBpbnQgVExhbl9HZXRCaXQodTggYml0LCB1MTYgcG9ydCkKK3sKKwlyZXR1cm4gKChpbnQpIChpbmJfcChwb3J0KSAmIGJpdCkpOworfQorCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgVExhbl9TZXRCaXQodTggYml0LCB1MTYgcG9ydCkKK3sKKwlvdXRiX3AoaW5iX3AocG9ydCkgfCBiaXQsIHBvcnQpOworfQorI2VuZGlmCisKKyNkZWZpbmUgVExhbl9DbGVhckJpdCggYml0LCBwb3J0ICkJb3V0Yl9wKGluYl9wKHBvcnQpICYgfmJpdCwgcG9ydCkKKyNkZWZpbmUgVExhbl9HZXRCaXQoIGJpdCwgcG9ydCApCSgoaW50KSAoaW5iX3AocG9ydCkgJiBiaXQpKQorI2RlZmluZSBUTGFuX1NldEJpdCggYml0LCBwb3J0ICkJb3V0Yl9wKGluYl9wKHBvcnQpIHwgYml0LCBwb3J0KQorCisjaWZkZWYgSV9MSUtFX0FfRkFTVF9IQVNIX0ZVTkNUSU9OCisvKiBnaXZlbiA2IGJ5dGVzLCB2aWV3IHRoZW0gYXMgOCA2LWJpdCBudW1iZXJzIGFuZCByZXR1cm4gdGhlIFhPUiBvZiB0aG9zZSAqLworLyogdGhlIGNvZGUgYmVsb3cgaXMgYWJvdXQgc2V2ZW4gdGltZXMgYXMgZmFzdCBhcyB0aGUgb3JpZ2luYWwgY29kZSAqLworc3RhdGljIGlubGluZSB1MzIgVExhbl9IYXNoRnVuYyh1OCAqIGEpCit7CisJdTggaGFzaDsKKworCWhhc2ggPSAoYVswXSBeIGFbM10pOwkvKiAmIDA3NyAqLworCWhhc2ggXj0gKChhWzBdIF4gYVszXSkgPj4gNik7CS8qICYgMDAzICovCisJaGFzaCBePSAoKGFbMV0gXiBhWzRdKSA8PCAyKTsJLyogJiAwNzQgKi8KKwloYXNoIF49ICgoYVsxXSBeIGFbNF0pID4+IDQpOwkvKiAmIDAxNyAqLworCWhhc2ggXj0gKChhWzJdIF4gYVs1XSkgPDwgNCk7CS8qICYgMDYwICovCisJaGFzaCBePSAoKGFbMl0gXiBhWzVdKSA+PiAyKTsJLyogJiAwNzcgKi8KKworCXJldHVybiAoaGFzaCAmIDA3Nyk7Cit9CisKKyNlbHNlCQkJCS8qIG9yaWdpbmFsIGNvZGUgKi8KKworc3RhdGljIGlubGluZSB1MzIgeG9yKHUzMiBhLCB1MzIgYikKK3sKKwlyZXR1cm4gKChhICYmICFiKSB8fCAoIWEgJiYgYikpOworfQorCisjZGVmaW5lIFhPUjgoIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGggKQl4b3IoIGEsIHhvciggYiwgeG9yKCBjLCB4b3IoIGQsIHhvciggZSwgeG9yKCBmLCB4b3IoIGcsIGggKSApICkgKSApICkgKQorI2RlZmluZSBEQSggYSwgYml0ICkJCQkJCSggKCAodTgpIGFbYml0LzhdICkgJiAoICh1OCkgKCAxIDw8IGJpdCU4ICkgKSApCisKK3N0YXRpYyBpbmxpbmUgdTMyIFRMYW5fSGFzaEZ1bmModTggKiBhKQoreworCXUzMiBoYXNoOworCisJaGFzaCA9CisJICAgIFhPUjgoREEoYSwgMCksIERBKGEsIDYpLCBEQShhLCAxMiksIERBKGEsIDE4KSwgREEoYSwgMjQpLAorCQkgREEoYSwgMzApLCBEQShhLCAzNiksIERBKGEsIDQyKSk7CisJaGFzaCB8PQorCSAgICBYT1I4KERBKGEsIDEpLCBEQShhLCA3KSwgREEoYSwgMTMpLCBEQShhLCAxOSksIERBKGEsIDI1KSwKKwkJIERBKGEsIDMxKSwgREEoYSwgMzcpLCBEQShhLCA0MykpIDw8IDE7CisJaGFzaCB8PQorCSAgICBYT1I4KERBKGEsIDIpLCBEQShhLCA4KSwgREEoYSwgMTQpLCBEQShhLCAyMCksIERBKGEsIDI2KSwKKwkJIERBKGEsIDMyKSwgREEoYSwgMzgpLCBEQShhLCA0NCkpIDw8IDI7CisJaGFzaCB8PQorCSAgICBYT1I4KERBKGEsIDMpLCBEQShhLCA5KSwgREEoYSwgMTUpLCBEQShhLCAyMSksIERBKGEsIDI3KSwKKwkJIERBKGEsIDMzKSwgREEoYSwgMzkpLCBEQShhLCA0NSkpIDw8IDM7CisJaGFzaCB8PQorCSAgICBYT1I4KERBKGEsIDQpLCBEQShhLCAxMCksIERBKGEsIDE2KSwgREEoYSwgMjIpLCBEQShhLCAyOCksCisJCSBEQShhLCAzNCksIERBKGEsIDQwKSwgREEoYSwgNDYpKSA8PCA0OworCWhhc2ggfD0KKwkgICAgWE9SOChEQShhLCA1KSwgREEoYSwgMTEpLCBEQShhLCAxNyksIERBKGEsIDIzKSwgREEoYSwgMjkpLAorCQkgREEoYSwgMzUpLCBEQShhLCA0MSksIERBKGEsIDQ3KSkgPDwgNTsKKworCXJldHVybiBoYXNoOworCit9CisKKyNlbmRpZgkJCQkvKiBJX0xJS0VfQV9GQVNUX0hBU0hfRlVOQ1RJT04gKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3R1bGlwLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC90dWxpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOGUwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC90dWxpcC5jCkBAIC0wLDAgKzEsMjA5OSBAQAorLyogLSotIE1vZGU6QzsgYy1iYXNpYy1vZmZzZXQ6NDsgLSotICovCisKKy8qCisgIFR1bGlwIGFuZCBjbG9uZSBFdGhlcmJvb3QgRHJpdmVyCisKKyAgQnkgTWFydHkgQ29ubm9yIChtZGNAZXRoZXJib290Lm9yZykKKyAgQ29weXJpZ2h0IChDKSAyMDAxIEVudGl0eSBDeWJlciwgSW5jLgorCisgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgQXMgb2YgQXByaWwgMjAwMSB0aGlzIGRyaXZlciBzaG91bGQgc3VwcG9ydCBtb3N0IHR1bGlwIGNhcmRzIHRoYXQgCisgIHRoZSBMaW51eCB0dWxpcCBkcml2ZXIgc3VwcG9ydHMgYmVjYXVzZSBEb25hbGQgQmVja2VyJ3MgTGludXggbWVkaWEgCisgIGRldGVjdGlvbiBjb2RlIGlzIG5vdyBpbmNsdWRlZC4KKworICBCYXNlZCBvbiBLZW4gWWFwJ3MgVHVsaXAgRXRoZXJib290IERyaXZlciBhbmQgRG9uYWxkIEJlY2tlcidzCisgIExpbnV4IFR1bGlwIERyaXZlci4gU3VwcG9ydHMgTi1XYXkgc3BlZWQgYXV0by1jb25maWd1cmF0aW9uIG9uCisgIE1YOTg3MTUsIE1YOTg3MTVBIGFuZCBNWDk4NzI1LiBTdXBwb3J0IGluZXhwZW5zaXZlIFBDSSAxMC8xMDAgY2FyZHMKKyAgYmFzZWQgb24gdGhlIE1hY3Jvbml4IE1YOTg3eDUgY2hpcCwgc3VjaCBhcyB0aGUgU09IT3dhcmUgRmFzdAorICBtb2RlbCBTRkExMTBBLCBhbmQgdGhlIExpbmtTWVMgbW9kZWwgTE5FMTAwVFguIFRoZSBOZXRHZWFyCisgIG1vZGVsIEZBMzEwWCwgYmFzZWQgb24gdGhlIExDODJDMTY4IGNoaXAgaXMgc3VwcG9ydGVkLgorICBUaGUgVFJFTkRuZXQgVEUxMDAtUENJQSBOSUMgd2hpY2ggdXNlcyBhIGdlbnVpbmUgSW50ZWwgMjExNDMtUEQKKyAgY2hpcHNldCBpcyBzdXBwb3J0ZWQuIEFsc28sIERhdmljb20gRE05MTAyJ3MuCisKKyAgRG9jdW1lbnRhdGlvbiBhbmQgc291cmNlIGNvZGUgdXNlZDoKKyAgU291cmNlIGZvciBFdGhlcmJvb3QgZHJpdmVyIGF0CisgIGh0dHA6Ly9ldGhlcmJvb3Quc291cmNlZm9yZ2UubmV0LworICBNWDk4NzE1QSBEYXRhIFNoZWV0IGFuZCBNWDk4NzE1QSBBcHBsaWNhdGlvbiBOb3RlCisgIG9uIGh0dHA6Ly93d3cubWFjcm9uaXguY29tLyAgKFBERiBmb3JtYXQgZmlsZXMpCisgIFNvdXJjZSBmb3IgTGludXggdHVsaXAgZHJpdmVyIGF0CisgIGh0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9kcml2ZXJzL3R1bGlwLmh0bWwKKworICBBZGFwdGVkIGJ5IEtlbiBZYXAgZnJvbQorICBGcmVlQlNEIG5ldGJvb3QgREVDIDIxMTQzIGRyaXZlcgorICBBdXRob3I6IERhdmlkIFNoYXJwCisgIGRhdGU6IE5vdi85OAorCisgIFNvbWUgY29kZSBmcmFnbWVudHMgd2VyZSB0YWtlbiBmcm9tIHZlcmlvdXMgcGxhY2VzLCBLZW4gWWFwJ3MKKyAgZXRoZXJib290LCBGcmVlQlNEJ3MgaWZfZGUuYywgYW5kIHZhcmlvdXMgTGludXggcmVsYXRlZCBmaWxlcy4KKyAgREVDJ3MgbWFudWFscyBmb3IgdGhlIDIxMTQzIGFuZCBTUk9NIGZvcm1hdCB3ZXJlIHZlcnkgaGVscGZ1bC4KKyAgVGhlIExpbnV4IGRlIGRyaXZlciBkZXZlbG9wbWVudCBwYWdlIGhhcyBhIG51bWJlciBvZiBsaW5rcyB0bworICB1c2VmdWwgcmVsYXRlZCBpbmZvcm1hdGlvbi4gIEhhdmUgYSBsb29rIGF0OgorICBmdHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9wdWIvbGludXgvZHJpdmVycy90dWxpcC1kZXZlbC5odG1sCisqLworCitGSUxFX0xJQ0VOQ0UgKCBHUExfQU5ZICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSZXZpc2lvbiBIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgMDggRmViIDIwMDUgIFJhbWVzaCBDaGFuZGVyIGNoaGFiYXJhbWVzaCBhdCB5YWhvby5jby5pbiBhZGRlZCB0YWJsZSBlbnRyaWVzCisgICAgICAgICAgICAgICBmb3IgU0dUaG9tc29uIFNURTEwLzEwMEEKKyAgMDcgU2VwIDIwMDMgIHRpbWxlZ2dlCU11bHRpY2FzdCBTdXBwb3J0IEFkZGVkCisgIDExIEFwciAyMDAxICBtZGMgICAgIFtwYXRjaCB0byBldGhlcmJvb3QgNC43LjI0XQorICAgICBNYWpvciByZXdyaXRlIHRvIGluY2x1ZGUgTGludXggdHVsaXAgZHJpdmVyIG1lZGlhIGRldGVjdGlvbgorICAgICBjb2RlLiAgVGhpcyBkcml2ZXIgc2hvdWxkIHN1cHBvcnQgYSBsb3QgbW9yZSBjYXJkcyBub3cuCisgIDE2IEp1bCAyMDAwICBtZGMgICAgIDAuNzViMTEKKyAgICAgQWRkZWQgc3VwcG9ydCBmb3IgQURNdGVrIDA5ODUgQ2VudGF1ci1QLCBhICJDb21ldCIgdHVsaXAgY2xvbmUKKyAgICAgd2hpY2ggaXMgdXNlZCBvbiB0aGUgTGlua1NZUyBMTkUxMDBUWCB2NC54IGNhcmRzLiAgV2UgYWxyZWFkeQorICAgICBzdXBwb3J0IExORTEwMFRYIHYyLjAgY2FyZHMsIHdoaWNoIHVzZSBhIGRpZmZlcmVudCBjb250cm9sbGVyLgorICAwNCBKdWwgMjAwMCAgIGphbSAgICAgPworICAgICBBZGRlZCB0ZXN0IG9mIHN0YXR1cyBhZnRlciByZWNlaXZpbmcgYSBwYWNrZXQgZnJvbSB0aGUgY2FyZC4KKyAgICAgQWxzbyB1bmNvbW1lbnRlZCB0aGUgdHVsaXBfZGlzYWJsZSByb3V0aW5lLiAgU3RyYXkgcGFja2V0cworICAgICBzZWVtZWQgdG8gYmUgY2F1c2luZyBwcm9ibGVtcy4KKyAgMjcgQXByIDIwMDAgICBuamwgICAgID8KKyAgMjkgRmViIDIwMDAgICBtZGMgICAgIDAuNzViNworICAgICBJbmNyZWFzZWQgcmVzZXQgZGVsYXkgdG8gMyBzZWNvbmRzIGJlY2F1c2UgTWFjcm9uaXggY2FyZHMgc2VlbSB0bworICAgICBuZWVkIG1vcmUgcmVzZXQgdGltZSBiZWZvcmUgY2FyZCBjb21lcyBiYWNrIHRvIGEgdXNhYmxlIHN0YXRlLgorICAyNiBGZWIgMjAwMCAgIG1kYyAgICAgMC43NWI2CisgICAgIEFkZGVkIGEgMSBzZWNvbmQgZGVsYXkgYWZ0ZXIgaW5pdGlhbGl6aW5nIHRoZSB0cmFuc21pdHRlciBiZWNhdXNlCisgICAgIHNvbWUgY2FyZHMgc2VlbSB0byBuZWVkIHRoZSB0aW1lIG9yIHRoZXkgZHJvcCB0aGUgZmlyc3QgcGFja2V0IAorICAgICB0cmFuc21pdHRlZC4KKyAgMjMgRmViIDIwMDAgICBtZGMgICAgIDAuNzViNQorICAgICByZW1vdmVkIHVkZWxheSBjb2RlIGFuZCB1c2VkIGN1cnJ0aWNrcygpIGZvciBtb3JlIHJlbGlhYmxlIGRlbGF5CisgICAgIGNvZGUgaW4gcmVzZXQgcGF1c2UgYW5kIHNhbml0eSB0aW1lb3V0cy4gIEFkZGVkIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgYW5kIFRYIGRlYnVnZ2luZyBjb2RlLgorICAyMSBGZWIgMjAwMCAgIG1kYyAgICAgcGF0Y2ggdG8gRXRoZXJib290IDQuNC4zCisgICAgIEluY29ycG9yYXRlZCBwYXRjaGVzIGZyb20gQm9iIEVkd2FyZHMgYW5kIFBhdWwgTWFja2VycmFzIG9mIAorICAgICBMaW51eGNhcmUncyBPWkxhYnMgdG8gZGVhbCB3aXRoIGluZWZmaWNpZW5jaWVzIGluIHR1bGlwX3RyYW5zbWl0CisgICAgIGFuZCB1ZGVsYXkuICBXZSBub3cgd2FpdCBmb3IgcGFja2V0IHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZQorICAgICAob3Igc2FuaXR5IHRpbWVvdXQpLgorICAwNCBGZWIgMjAwMCAgIFJvYmVydC5FZHdhcmRzQGFudS5lZHUuYXUgcGF0Y2ggdG8gRXRoZXJib290IDQuNC4yCisgICAgIHBhdGNoIHRvIHR1bGlwLmMgdGhhdCBpbXBsZW1lbnRzIHRoZSBhdXRvbWF0aWMgc2VsZWN0aW9uIG9mIHRoZSBNSUkKKyAgICAgaW50ZXJmYWNlIG9uIGNhcmRzIHVzaW5nIHRoZSBJbnRlbC9ERUMgMjExNDMgcmVmZXJlbmNlIGRlc2lnbiwgaW4KKyAgICAgcGFydGljdWxhciwgdGhlIFRSRU5EbmV0IFRFMTAwLVBDSUEgTklDIHdoaWNoIHVzZXMgYSBnZW51aW5lIEludGVsCisgICAgIDIxMTQzLVBEIGNoaXBzZXQuCisgIDExIEphbiAyMDAwICAgbWRjICAgICAwLjc1YjQKKyAgICAgQWRkZWQgc3VwcG9ydCBmb3IgTmV0R2VhciBGQTMxMFRYIGNhcmQgYmFzZWQgb24gdGhlIExDODJDMTY4CisgICAgIGNoaXAuICBUaGlzIHNob3VsZCBhbHNvIHN1cHBvcnQgTGl0ZS1PbiBMQzgyQzE2OCBib2FyZHMuCisgICAgIEFkZGVkIHNpbXBsZSBNSUkgc3VwcG9ydC4gUmUtYXJyYW5nZWQgY29kZSB0byBiZXR0ZXIgbW9kdWxhcml6ZQorICAgICBpbml0aWFsaXphdGlvbnMuCisgIDA0IERlYyAxOTk5ICAgbWRjICAgICAwLjc1YjMKKyAgICAgQWRkZWQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgTE5FMTAwVFggUENJIGNhcmRzLiAgU2hvdWxkIHdvcmsgZm9yCisgICAgIFBOSUMyIGNhcmRzLiBObyBNSUkgc3VwcG9ydCwgYnV0IHNpbmdsZSBpbnRlcmZhY2UgKFJKNDUpIHR1bGlwCisgICAgIGNhcmRzIHNlZW0gdG8gbm90IGNhcmUuCisgIDAzIERlYyAxOTk5ICAgbWRjICAgICAwLjc1YjIKKyAgICAgUmVuYW1lZCBmcm9tIG14OTg3eDUgdG8gdHVsaXAsIG1lcmdlZCBpbiBvcmlnaW5hbCB0dWxpcCBpbml0IGNvZGUKKyAgICAgZnJvbSB0dWxpcC5jIHRvIHN1cHBvcnQgb3RoZXIgdHVsaXAgY29tcGF0aWJsZSBjYXJkcy4KKyAgMDIgRGVjIDE5OTkgICBtZGMgICAgIDAuNzViMQorICAgICBSZWxlYXNlZCBCZXRhIE1YOTg3eDUgRHJpdmVyIGZvciBjb2RlIHJldmlldyBhbmQgdGVzdGluZyB0byBuZXRib290CisgICAgIGFuZCB0aGluZ3VpbiBtYWlsaW5nIGxpc3RzLgorKi8KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisKKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKworLyogVXNlciBzZXR0YWJsZSBwYXJhbWV0ZXJzICovCisKKyN1bmRlZglUVUxJUF9ERUJVRworI3VuZGVmCVRVTElQX0RFQlVHX1dIRVJFCisjaWZkZWYJVFVMSVBfREVCVUcKK3N0YXRpYyBpbnQgdHVsaXBfZGVidWcgPSAyOyAgICAgICAgICAgICAvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCisjZW5kaWYKKworI2RlZmluZSBUWF9USU1FX09VVCAgICAgICAyKlRJQ0tTX1BFUl9TRUMKKworLyogaGVscGZ1bCBtYWNyb3MgaWYgb24gYSBiaWdfZW5kaWFuIG1hY2hpbmUgZm9yIGNoYW5naW5nIGJ5dGUgb3JkZXIuCisgICBub3Qgc3RyaWN0bHkgbmVlZGVkIG9uIEludGVsICovCisjZGVmaW5lIGdldF91bmFsaWduZWQocHRyKSAoKihwdHIpKQorI2RlZmluZSBwdXRfdW5hbGlnbmVkKHZhbCwgcHRyKSAoKHZvaWQpKCAqKHB0cikgPSAodmFsKSApKQorI2RlZmluZSBnZXRfdTE2KHB0cikgKCoodTE2ICopKHB0cikpCisjZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIHZpcnRfdG9fYnVzKGFkZHIpCisKKyNkZWZpbmUgVFVMSVBfSU9UWVBFICBQQ0lfVVNFU19NQVNURVIgfCBQQ0lfVVNFU19JTyB8IFBDSV9BRERSMAorI2RlZmluZSBUVUxJUF9TSVpFIDB4ODAKKworLyogVGhpcyBpcyBhIG15c3RlcmlvdXMgdmFsdWUgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBDU1IxMSBpbiB0aGUgMjEwNDAgKG9ubHkpCisgICB0byBzdXBwb3J0IGEgcHJlLU5XYXkgZnVsbC1kdXBsZXggc2lnbmFsaW5nIG1lY2hhbmlzbSB1c2luZyBzaG9ydCBmcmFtZXMuCisgICBObyBvbmUga25vd3Mgd2hhdCBpdCBzaG91bGQgYmUsIGJ1dCBpZiBsZWZ0IGF0IGl0cyBkZWZhdWx0IHZhbHVlIHNvbWUKKyAgIDEwYmFzZTIoISkgcGFja2V0cyB0cmlnZ2VyIGEgZnVsbC1kdXBsZXgtcmVxdWVzdCBpbnRlcnJ1cHQuICovCisjZGVmaW5lIEZVTExfRFVQTEVYX01BR0lDICAgICAgIDB4Njk2OQorCitzdGF0aWMgY29uc3QgaW50IGNzcjAgPSAweDAxQTAwMDAwIHwgMHg4MDAwOworCisvKiAgVGhlIHBvc3NpYmxlIG1lZGlhIHR5cGVzIHRoYXQgY2FuIGJlIHNldCBpbiBvcHRpb25zW10gYXJlOiAqLworI2RlZmluZSBNRURJQV9NQVNLIDMxCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1lZGlhbmFtZVszMl0gPSB7CisgICAgIjEwYmFzZVQiLCAiMTBiYXNlMiIsICJBVUkiLCAiMTAwYmFzZVR4IiwKKyAgICAiMTBiYXNlVC1GRFgiLCAiMTAwYmFzZVR4LUZEWCIsICIxMDBiYXNlVDQiLCAiMTAwYmFzZUZ4IiwKKyAgICAiMTAwYmFzZUZ4LUZEWCIsICJNSUkgMTBiYXNlVCIsICJNSUkgMTBiYXNlVC1GRFgiLCAiTUlJIiwKKyAgICAiMTBiYXNlVChmb3JjZWQpIiwgIk1JSSAxMDBiYXNlVHgiLCAiTUlJIDEwMGJhc2VUeC1GRFgiLCAiTUlJIDEwMGJhc2VUNCIsCisgICAgIk1JSSAxMDBiYXNlRngtSERYIiwgIk1JSSAxMDBiYXNlRngtRkRYIiwgIkhvbWUtUE5BIDFNYnBzIiwgIkludmFsaWQtMTkiLAorfTsKKworLyogVGhpcyBtdWNoIG1hdGNoIHR1bGlwX3RibFtdISAgTm90ZSAyMTE0MiA9PSAyMTE0My4gKi8KK2VudW0gdHVsaXBfY2hpcHMgeworICAgIERDMjEwNDA9MCwgREMyMTA0MT0xLCBEQzIxMTQwPTIsIERDMjExNDI9MywgREMyMTE0Mz0zLAorICAgIExDODJDMTY4LCBNWDk4NzEzLCBNWDk4NzE1LCBNWDk4NzI1LCBBWDg4MTQxLCBBWDg4MTQwLCBQTklDMiwgQ09NRVQsCisgICAgQ09NUEVYOTg4MSwgSTIxMTQ1LCBYSVJDT00sIFNHVGhvbXNvbiwJLypSYW1lc2ggQ2hhbmRlciovCit9OworCitlbnVtIHBjaV9pZF9mbGFnc19iaXRzIHsKKyAgICAvKiBTZXQgUENJIGNvbW1hbmQgcmVnaXN0ZXIgYml0cyBiZWZvcmUgY2FsbGluZyBwcm9iZTEoKS4gKi8KKyAgICBQQ0lfVVNFU19JTz0xLCBQQ0lfVVNFU19NRU09MiwgUENJX1VTRVNfTUFTVEVSPTQsCisgICAgLyogUmVhZCBhbmQgbWFwIHRoZSBzaW5nbGUgZm9sbG93aW5nIFBDSSBCQVIuICovCisgICAgUENJX0FERFIwPTA8PDQsIFBDSV9BRERSMT0xPDw0LCBQQ0lfQUREUjI9Mjw8NCwgUENJX0FERFIzPTM8PDQsCisgICAgUENJX0FERFJfNjRCSVRTPTB4MTAwLCBQQ0lfTk9fQUNQSV9XQUtFPTB4MjAwLCBQQ0lfTk9fTUlOX0xBVEVOQ1k9MHg0MDAsCisgICAgUENJX1VOVVNFRF9JUlE9MHg4MDAsCit9OworCitzdHJ1Y3QgcGNpX2lkX2luZm8geworICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IG1hdGNoX2luZm8geworICAgICAgICB1MzIgcGNpLCBwY2lfbWFzaywgc3Vic3lzdGVtLCBzdWJzeXN0ZW1fbWFzazsKKyAgICAgICAgdTMyIHJldmlzaW9uLCByZXZpc2lvbl9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IDggYml0cy4gKi8KKyAgICB9IGlkOworICAgIGVudW0gcGNpX2lkX2ZsYWdzX2JpdHMgcGNpX2ZsYWdzOworICAgIGludCBpb19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZGVkIGZvciBJL08gcmVnaW9uIGNoZWNrIG9yIGlvcmVtYXAoKS4gKi8KKyAgICBpbnQgZHJ2X2ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERyaXZlciB1c2UsIGludGVuZGVkIGFzIGNhcGFiaWxpdHkgZmxhZ3MuICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9pZF9pbmZvIHBjaV9pZF90YmxbXSA9IHsKKyAgICB7ICJEaWdpdGFsIERDMjEwNDAgVHVsaXAiLCB7IDB4MDAwMjEwMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMHg4MCwgREMyMTA0MCB9LAorICAgIHsgIkRpZ2l0YWwgREMyMTA0MSBUdWxpcCIsIHsgMHgwMDE0MTAxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAweDgwLCBEQzIxMDQxIH0sCisgICAgeyAiRGlnaXRhbCBEUzIxMTQwQSBUdWxpcCIsIHsgMHgwMDA5MTAxMSwgMHhmZmZmZmZmZiwgMCwwLCAweDIwLDB4ZjAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMHg4MCwgREMyMTE0MCB9LAorICAgIHsgIkRpZ2l0YWwgRFMyMTE0MCBUdWxpcCIsIHsgMHgwMDA5MTAxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAweDgwLCBEQzIxMTQwIH0sCisgICAgeyAiRGlnaXRhbCBEUzIxMTQzIFR1bGlwIiwgeyAweDAwMTkxMDExLCAweGZmZmZmZmZmLCAwLDAsIDY1LDB4ZmYgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgVFVMSVBfU0laRSwgREMyMTE0MiB9LAorICAgIHsgIkRpZ2l0YWwgRFMyMTE0MiBUdWxpcCIsIHsgMHgwMDE5MTAxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCBUVUxJUF9TSVpFLCBEQzIxMTQyIH0sCisgICAgeyAiS2luZ3N0b24gS05FMTEwdHggKFBOSUMpIiwgeyAweDAwMDIxMUFELCAweGZmZmZmZmZmLCAweGYwMDIyNjQ2LCAweGZmZmZmZmZmLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgTEM4MkMxNjggfSwKKyAgICB7ICJMaXRlLU9uIDgyYzE2OCBQTklDIiwgeyAweDAwMDIxMUFELCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgTEM4MkMxNjggfSwKKyAgICB7ICJNYWNyb25peCA5ODcxMyBQTUFDIiwgeyAweDA1MTIxMGQ5LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgTVg5ODcxMyB9LAorICAgIHsgIk1hY3Jvbml4IDk4NzE1IFBNQUMiLCB7IDB4MDUzMTEwZDksIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMjU2LCBNWDk4NzE1IH0sCisgICAgeyAiTWFjcm9uaXggOTg3MjUgUE1BQyIsIHsgMHgwNTMxMTBkOSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIE1YOTg3MjUgfSwKKyAgICB7ICJBU0lYIEFYODgxNDEiLCB7IDB4MTQwMDEyNUIsIDB4ZmZmZmZmZmYsIDAsMCwgMHgxMCwgMHhmMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAxMjgsIEFYODgxNDEgfSwKKyAgICB7ICJBU0lYIEFYODgxNDAiLCB7IDB4MTQwMDEyNUIsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMTI4LCBBWDg4MTQwIH0sCisgICAgeyAiTGl0ZS1PbiBMQzgyQzExNSBQTklDLUlJIiwgeyAweGMxMTUxMUFELCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgUE5JQzIgfSwKKyAgICB7ICJBRE10ZWsgQU45ODEgQ29tZXQiLCB7IDB4MDk4MTEzMTcsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMjU2LCBDT01FVCB9LAorICAgIHsgIkFETVRlayBBTjk4MyBDb21ldCIsIHsgMHgxMjE2MTExMywgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIENPTUVUIH0sCisgICAgeyAiQURNVGVrIENvbWV0IEFOOTgzYiIsIHsgMHg5NTExMTMxNywgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIENPTUVUIH0sCisgICAgeyAiQURNdGVrIENlbnRhdXItUCIsIHsgMHgwOTg1MTMxNywgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIENPTUVUIH0sCisgICAgeyAiQURNdGVrIENlbnRhdXItQyIsIHsgMHgxOTg1MTMxNywgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIENPTUVUIH0sCisgICAgeyAiQ29tcGV4IFJMMTAwLVRYIiwgeyAweDk4ODExMUY2LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDEyOCwgQ09NUEVYOTg4MSB9LAorICAgIHsgIkludGVsIDIxMTQ1IFR1bGlwIiwgeyAweDAwMzk4MDg2LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDEyOCwgSTIxMTQ1IH0sCisgICAgeyAiWGlyY29tIFR1bGlwIGNsb25lIiwgeyAweDAwMDMxMTVkLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDEyOCwgWElSQ09NIH0sCisgICAgeyAiRGF2aWNvbSBETTkxMDIiLCB7IDB4OTEwMjEyODIsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMHg4MCwgREMyMTE0MCB9LAorICAgIHsgIkRhdmljb20gRE05MTAwIiwgeyAweDkxMDAxMjgyLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDB4ODAsIERDMjExNDAgfSwKKyAgICB7ICJNYWNyb25peCBteGljLTk4NzE1IChFTjEyMTcpIiwgeyAweDEyMTcxMTEzLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgTVg5ODcxNSB9LAorICAgIHsgIjNDb20gM2NTT0hPMTAwQi1UWCAoQURNdGVrIENlbnR1YXIpIiwgeyAweDkzMDAxMGI3LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIFRVTElQX1NJWkUsIENPTUVUIH0sCisgICAgeyAiU0cgVGhvbXNvbiBTVEUxMC8xMDBBIiwgeyAweDI3NzQxMDRhLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgQ09NRVQgfSwJLypSYW1lc2ggQ2hhbmRlciovCisgICAgeyAwLCB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgMCwgMCwgMCB9LAorfTsKKworZW51bSB0YmxfZmxhZyB7CisgICAgSEFTX01JST0xLCBIQVNfTUVESUFfVEFCTEU9MiwgQ1NSMTJfSU5fU1JPTT00LCBBTFdBWVNfQ0hFQ0tfTUlJPTgsCisgICAgSEFTX1BXUkRXTj0weDEwLCBNQ19IQVNIX09OTFk9MHgyMCwgLyogSGFzaC1vbmx5IG11bHRpY2FzdCBmaWx0ZXIuICovCisgICAgSEFTX1BOSUNOV0FZPTB4ODAsIEhBU19OV0FZPTB4NDAsICAgLyogVXNlcyBpbnRlcm5hbCBOV2F5IHhjdnIuICovCisgICAgSEFTX0lOVFJfTUlUSUdBVElPTj0weDEwMCwgSVNfQVNJWD0weDIwMCwgSEFTXzgwMjNYPTB4NDAwLAorfTsKKworLyogTm90ZTogdGhpcyB0YWJsZSBtdXN0IG1hdGNoICBlbnVtIHR1bGlwX2NoaXBzICBhYm92ZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgdHVsaXBfY2hpcF90YWJsZSB7CisgICAgY2hhciAqY2hpcF9uYW1lOworICAgIGludCBmbGFnczsKK30gdHVsaXBfdGJsW10gPSB7CisgICAgeyAiRGlnaXRhbCBEQzIxMDQwIFR1bGlwIiwgMH0sCisgICAgeyAiRGlnaXRhbCBEQzIxMDQxIFR1bGlwIiwgSEFTX01FRElBX1RBQkxFIHwgSEFTX05XQVkgfSwKKyAgICB7ICJEaWdpdGFsIERTMjExNDAgVHVsaXAiLCBIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB9LAorICAgIHsgIkRpZ2l0YWwgRFMyMTE0MyBUdWxpcCIsIEhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBBTFdBWVNfQ0hFQ0tfTUlJIAorICAgICAgfCBIQVNfUFdSRFdOIHwgSEFTX05XQVkgICB8IEhBU19JTlRSX01JVElHQVRJT04gfSwKKyAgICB7ICJMaXRlLU9uIDgyYzE2OCBQTklDIiwgSEFTX01JSSB8IEhBU19QTklDTldBWSB9LAorICAgIHsgIk1hY3Jvbml4IDk4NzEzIFBNQUMiLCBIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB9LAorICAgIHsgIk1hY3Jvbml4IDk4NzE1IFBNQUMiLCBIQVNfTUVESUFfVEFCTEUgfSwKKyAgICB7ICJNYWNyb25peCA5ODcyNSBQTUFDIiwgSEFTX01FRElBX1RBQkxFIH0sCisgICAgeyAiQVNJWCBBWDg4MTQwIiwgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gCisgICAgICB8IE1DX0hBU0hfT05MWSB8IElTX0FTSVggfSwKKyAgICB7ICJBU0lYIEFYODgxNDEiLCBIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB8IE1DX0hBU0hfT05MWSAKKyAgICAgIHwgSVNfQVNJWCB9LAorICAgIHsgIkxpdGUtT24gUE5JQy1JSSIsIEhBU19NSUkgfCBIQVNfTldBWSB8IEhBU184MDIzWCB9LAorICAgIHsgIkFETXRlayBDb21ldCIsIEhBU19NSUkgfCBNQ19IQVNIX09OTFkgfSwKKyAgICB7ICJDb21wZXggOTg4MSBQTUFDIiwgICAgICAgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfSwKKyAgICB7ICJJbnRlbCBEUzIxMTQ1IFR1bGlwIiwgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IEFMV0FZU19DSEVDS19NSUkgCisgICAgICB8IEhBU19QV1JEV04gfCBIQVNfTldBWSB9LAorICAgIHsgIlhpcmNvbSB0dWxpcCB3b3JrLWFsaWtlIiwgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IEFMV0FZU19DSEVDS19NSUkgCisgICAgICB8IEhBU19QV1JEV04gfCBIQVNfTldBWSB9LAorICAgIHsgIlNHVGhvbXNvbiBTVEUxMC8xMDBBIiwgSEFTX01JSSB8IE1DX0hBU0hfT05MWSB9LAkvKlJhbWVzaCBDaGFuZGVyKi8gICAKKyAgICB7IDAsIDAgfSwKK307CisKKy8qIEEgZnVsbC1kdXBsZXggbWFwIGZvciBtZWRpYSB0eXBlcy4gKi8KK2VudW0gTWVkaWFJcyB7CisgICAgTWVkaWFJc0ZEID0gMSwgTWVkaWFBbHdheXNGRD0yLCBNZWRpYUlzTUlJPTQsIE1lZGlhSXNGeD04LAorICAgIE1lZGlhSXMxMDA9MTZ9OworCitzdGF0aWMgY29uc3QgY2hhciBtZWRpYV9jYXBbMzJdID0KK3swLDAsMCwxNiwgIDMsMTksMTYsMjQsICAyNyw0LDcsNSwgMCwyMCwyMywyMCwgMjAsMzEsMCwwLCB9Oworc3RhdGljIHU4IHQyMTA0MF9jc3IxM1tdID0gezIsMHgwQyw4LDQsICA0LDAsMCwwLCAwLDAsMCwwLCA0LDAsMCwwfTsKKworLyogMjEwNDEgdHJhbnNjZWl2ZXIgcmVnaXN0ZXIgc2V0dGluZ3M6IDEwLVQsIDEwLTIsIEFVSSwgMTAtVCwgMTBULUZEICovCitzdGF0aWMgdTE2IHQyMTA0MV9jc3IxM1tdID0geyAweEVGMDEsIDB4RUYwOSwgMHhFRjA5LCAweEVGMDEsIDB4RUYwOSwgfTsKK3N0YXRpYyB1MTYgdDIxMDQxX2NzcjE0W10gPSB7IDB4RkZGRiwgMHhGN0ZELCAweEY3RkQsIDB4N0YzRiwgMHg3RjNELCB9Oworc3RhdGljIHUxNiB0MjEwNDFfY3NyMTVbXSA9IHsgMHgwMDA4LCAweDAwMDYsIDB4MDAwRSwgMHgwMDA4LCAweDAwMDgsIH07CisKKy8qIG5vdCB1c2VkCitzdGF0aWMgdTE2IHQyMTE0Ml9jc3IxM1tdID0geyAweDAwMDEsIDB4MDAwOSwgMHgwMDA5LCAweDAwMDAsIDB4MDAwMSwgfTsKKyovCitzdGF0aWMgdTE2IHQyMTE0Ml9jc3IxNFtdID0geyAweEZGRkYsIDB4MDcwNSwgMHgwNzA1LCAweDAwMDAsIDB4N0YzRCwgfTsKKy8qIG5vdCB1c2VkCitzdGF0aWMgdTE2IHQyMTE0Ml9jc3IxNVtdID0geyAweDAwMDgsIDB4MDAwNiwgMHgwMDBFLCAweDAwMDgsIDB4MDAwOCwgfTsKKyovCisKKy8qIE9mZnNldHMgdG8gdGhlIENvbW1hbmQgYW5kIFN0YXR1cyBSZWdpc3RlcnMsICJDU1JzIi4gIEFsbCBhY2Nlc3NlcworICAgbXVzdCBiZSBsb25nd29yZCBpbnN0cnVjdGlvbnMgYW5kIHF1YWR3b3JkIGFsaWduZWQuICovCitlbnVtIHR1bGlwX29mZnNldHMgeworICAgIENTUjA9MCwgICAgIENTUjE9MHgwOCwgIENTUjI9MHgxMCwgIENTUjM9MHgxOCwgIENTUjQ9MHgyMCwgIENTUjU9MHgyOCwKKyAgICBDU1I2PTB4MzAsICBDU1I3PTB4MzgsICBDU1I4PTB4NDAsICBDU1I5PTB4NDgsIENTUjEwPTB4NTAsIENTUjExPTB4NTgsCisgICAgQ1NSMTI9MHg2MCwgQ1NSMTM9MHg2OCwgQ1NSMTQ9MHg3MCwgQ1NSMTU9MHg3OCwgQ1NSMTY9MHg4MCwgQ1NSMjA9MHhBMAorfTsKKworLyogVGhlIGJpdHMgaW4gdGhlIENTUjUgc3RhdHVzIHJlZ2lzdGVycywgbW9zdGx5IGludGVycnVwdCBzb3VyY2VzLiAqLworZW51bSBzdGF0dXNfYml0cyB7CisgICAgVGltZXJJbnQ9MHg4MDAsIFRQTG5rRmFpbD0weDEwMDAsIFRQTG5rUGFzcz0weDEwLAorICAgIE5vcm1hbEludHI9MHgxMDAwMCwgQWJub3JtYWxJbnRyPTB4ODAwMCwKKyAgICBSeEphYmJlcj0weDIwMCwgUnhEaWVkPTB4MTAwLCBSeE5vQnVmPTB4ODAsIFJ4SW50cj0weDQwLAorICAgIFR4RklGT1VuZGVyZmxvdz0weDIwLCBUeEphYmJlcj0weDA4LCBUeE5vQnVmPTB4MDQsIFR4RGllZD0weDAyLCBUeEludHI9MHgwMSwKK307CisKKy8qIFRoZSBjb25maWd1cmF0aW9uIGJpdHMgaW4gQ1NSNi4gKi8KK2VudW0gY3NyNl9tb2RlX2JpdHMgeworCVR4T249MHgyMDAwLCBSeE9uPTB4MDAwMiwgRnVsbER1cGxleD0weDAyMDAsCisJQWNjZXB0QnJvYWRjYXN0PTB4MDEwMCwgQWNjZXB0QWxsTXVsdGljYXN0PTB4MDA4MCwKKwlBY2NlcHRBbGxQaHlzPTB4MDA0MCwgQWNjZXB0UnVudD0weDAwMDgsCit9OworCisKK2VudW0gZGVzY19zdGF0dXNfYml0cyB7CisgICAgRGVzY093bmRlZD0weDgwMDAwMDAwLCBSeERlc2NGYXRhbEVycj0weDgwMDAsIFJ4V2hvbGVQa3Q9MHgwMzAwLAorfTsKKworc3RydWN0IG1lZGlhbGVhZiB7CisgICAgdTggdHlwZTsKKyAgICB1OCBtZWRpYTsKKyAgICB1bnNpZ25lZCBjaGFyICpsZWFmZGF0YTsKK307CisKK3N0cnVjdCBtZWRpYXRhYmxlIHsKKyAgICB1MTYgZGVmYXVsdG1lZGlhOworICAgIHU4IGxlYWZjb3VudCwgY3NyMTJkaXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2UgcGluIGRpcmVjdGlvbnMuICovCisgICAgdW5zaWduZWQgaGFzX21paToxLCBoYXNfbm9ubWlpOjEsIGhhc19yZXNldDo2OworICAgIHUzMiBjc3IxNWRpciwgY3NyMTV2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMTE0MyBOV2F5IHNldHRpbmcuICovCisgICAgc3RydWN0IG1lZGlhbGVhZiBtbGVhZlswXTsKK307CisKK3N0cnVjdCBtZWRpYWluZm8geworICAgIHN0cnVjdCBtZWRpYWluZm8gKm5leHQ7CisgICAgaW50IGluZm9fdHlwZTsKKyAgICBpbnQgaW5kZXg7CisgICAgdW5zaWduZWQgY2hhciAqaW5mbzsKK307CisKKy8qIEVFUFJPTSBBZGRyZXNzIHdpZHRoIGRlZmluaXRpb25zICovCisjZGVmaW5lIEVFUFJPTV9BRERSTEVOIDYKKyNkZWZpbmUgRUVQUk9NX1NJWkUgICAgMTI4ICAgICAgICAgICAgICAvKiAyIDw8IEVFUFJPTV9BRERSTEVOICovCisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworI2RlZmluZSBFRV9XUklURV9DTUQgICAgKDUgPDwgYWRkcl9sZW4pCisjZGVmaW5lIEVFX1JFQURfQ01EICAgICAoNiA8PCBhZGRyX2xlbikKKyNkZWZpbmUgRUVfRVJBU0VfQ01EICAgICg3IDw8IGFkZHJfbGVuKQorCisvKiBFRVBST01fQ3RybCBiaXRzLiAqLworI2RlZmluZSBFRV9TSElGVF9DTEsgICAgMHgwMiAgICAvKiBFRVBST00gc2hpZnQgY2xvY2suICovCisjZGVmaW5lIEVFX0NTICAgICAgICAgICAweDAxICAgIC8qIEVFUFJPTSBjaGlwIHNlbGVjdC4gKi8KKyNkZWZpbmUgRUVfREFUQV9XUklURSAgIDB4MDQgICAgLyogRUVQUk9NIGNoaXAgZGF0YSBpbi4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfMCAgICAgIDB4MDEKKyNkZWZpbmUgRUVfV1JJVEVfMSAgICAgIDB4MDUKKyNkZWZpbmUgRUVfREFUQV9SRUFEICAgIDB4MDggICAgLyogRUVQUk9NIGNoaXAgZGF0YSBvdXQuICovCisjZGVmaW5lIEVFX0VOQiAgICAgICAgICAoMHg0ODAwIHwgRUVfQ1MpCisKKy8qIERlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLiAgRXZlbiBhdCAzM01oeiBjdXJyZW50IFBDSQorICAgaW1wbGVtZW50YXRpb25zIGRvbid0IG92ZXJydW4gdGhlIEVFUFJPTSBjbG9jay4gIFdlIGFkZCBhIGJ1cworICAgdHVybi1hcm91bmQgdG8gaW5zdXJlIHRoYXQgdGhpcyByZW1haW5zIHRydWUuICAqLworI2RlZmluZSBlZXByb21fZGVsYXkoKSAgaW5sKGVlX2FkZHIpCisKKy8qIFNpemUgb2YgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyAqLworI2RlZmluZSBCVUZMRU4gMTUzNgorCisvKiBSaW5nLXdyYXAgZmxhZyBpbiBsZW5ndGggZmllbGQsIHVzZSBmb3IgbGFzdCByaW5nIGVudHJ5LgorICAgMHgwMTAwMDAwMCBtZWFucyBjaGFpbiBvbiBidWZmZXIyIGFkZHJlc3MsCisgICAweDAyMDAwMDAwIG1lYW5zIHVzZSB0aGUgcmluZyBzdGFydCBhZGRyZXNzIGluIENTUjIvMy4KKyAgIE5vdGU6IFNvbWUgd29yay1hbGlrZSBjaGlwcyBkbyBub3QgZnVuY3Rpb24gY29ycmVjdGx5IGluIGNoYWluZWQgbW9kZS4KKyAgIFRoZSBBU0lYIGNoaXAgd29ya3Mgb25seSBpbiBjaGFpbmVkIG1vZGUuCisgICBUaHVzIHdlIGluZGljYXRlIHJpbmcgbW9kZSwgYnV0IGFsd2F5cyB3cml0ZSB0aGUgJ25leHQnIGZpZWxkIGZvcgorICAgY2hhaW5lZCBtb2RlIGFzIHdlbGwuICovCisjZGVmaW5lIERFU0NfUklOR19XUkFQIDB4MDIwMDAwMDAKKworLyogdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvciBmb3JtYXQgKi8KK3N0cnVjdCB0dWxpcF9yeF9kZXNjIHsKKyAgICB2b2xhdGlsZSB1MzIgc3RhdHVzOworICAgIHUzMiBsZW5ndGg7CisgICAgdTMyIGJ1ZmZlcjEsIGJ1ZmZlcjI7Cit9OworCitzdHJ1Y3QgdHVsaXBfdHhfZGVzYyB7CisgICAgdm9sYXRpbGUgdTMyIHN0YXR1czsKKyAgICB1MzIgbGVuZ3RoOworICAgIHUzMiBidWZmZXIxLCBidWZmZXIyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdsb2JhbCBTdG9yYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTMyIGlvYWRkcjsKKworc3RydWN0IHR1bGlwX3ByaXZhdGUgeworICAgIGludCBjdXJfcng7CisgICAgaW50IGNoaXBfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW50byB0dWxpcF90YmxbXSAgKi8KKyAgICBpbnQgcGNpX2lkX2lkeDsgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbnRvIHBjaV9pZF90YmxbXSAqLworICAgIGludCByZXZpc2lvbjsKKyAgICBpbnQgZmxhZ3M7CisgICAgdW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkOyAgICAgICAgICAgLyogUENJIGNhcmQgdmVuZG9yIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBkZXZfaWQ7ICAgICAgICAgICAgICAvKiBQQ0kgY2FyZCBkZXZpY2UgY29kZSAqLworICAgIHVuc2lnbmVkIGNoYXIgZWhkcltFVEhfSExFTl07ICAgICAgIC8qIGJ1ZmZlciBmb3IgZXRoZXJuZXQgaGVhZGVyICovCisgICAgY29uc3QgY2hhciAqbmljX25hbWU7CisgICAgdW5zaWduZWQgaW50IGNzcjAsIGNzcjY7ICAgICAgICAgICAgLyogQ3VycmVudCBDU1IwLCBDU1I2IHNldHRpbmdzLiAqLworICAgIHVuc2lnbmVkIGludCBpZl9wb3J0OworICAgIHVuc2lnbmVkIGludCBmdWxsX2R1cGxleDsgICAgICAgICAvKiBGdWxsLWR1cGxleCBvcGVyYXRpb24gcmVxdWVzdGVkLiAqLworICAgIHVuc2lnbmVkIGludCBmdWxsX2R1cGxleF9sb2NrOworICAgIHVuc2lnbmVkIGludCBtZWRpYWxvY2s7ICAgICAgICAgICAvKiBEbyBub3Qgc2Vuc2UgbWVkaWEgdHlwZS4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbWVkaWFzZW5zZTsgICAgICAgICAgLyogTWVkaWEgc2Vuc2luZyBpbiBwcm9ncmVzcy4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbndheSwgbndheXNldDsgICAgIC8qIDIxMTQzIGludGVybmFsIE5XYXkuICovCisgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDsKKyAgICB1bnNpZ25lZCBjaGFyIGVlcHJvbVtFRVBST01fU0laRV07ICAvKiBTZXJpYWwgRUVQUk9NIGNvbnRlbnRzLiAqLworICAgIHU4IG1lZGlhX3RhYmxlX3N0b3JhZ2VbKHNpemVvZihzdHJ1Y3QgbWVkaWF0YWJsZSkgKyAzMipzaXplb2Yoc3RydWN0IG1lZGlhbGVhZikpXTsKKyAgICB1MTYgc3ltX2FkdmVydGlzZSwgbWlpX2FkdmVydGlzZTsgICAvKiBOV2F5IHRvLWFkdmVydGlzZS4gKi8KKyAgICBzdHJ1Y3QgbWVkaWF0YWJsZSAqbXRhYmxlOworICAgIHUxNiBscGFyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxMTQzIExpbmsgcGFydG5lciBhYmlsaXR5LiAqLworICAgIHUxNiBhZHZlcnRpc2luZ1s0XTsgICAgICAgICAgICAgICAgIC8qIE1JSSBhZHZlcnRpc2UsIGZyb20gU1JPTSB0YWJsZS4gKi8KKyAgICBzaWduZWQgY2hhciBwaHlzWzRdLCBtaWlfY250OyAgICAgICAvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKyAgICBpbnQgY3VyX2luZGV4OyAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IG1lZGlhIGluZGV4LiAqLworICAgIGludCBzYXZlZF9pZl9wb3J0OworfTsKKworLyogTm90ZTogdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyBtdXN0IGJlIGxvbmd3b3JkIGFsaWduZWQgYW5kCisgICBsb25nd29yZCBkaXZpc2FibGUgKi8KKworI2RlZmluZSBUWF9SSU5HX1NJWkUJMgorI2RlZmluZSBSWF9SSU5HX1NJWkUJNAorc3RydWN0IHsKKyAgICBzdHJ1Y3QgdHVsaXBfdHhfZGVzYyB0eF9yaW5nW1RYX1JJTkdfU0laRV07CisgICAgdW5zaWduZWQgY2hhciB0eGJbQlVGTEVOXTsKKyAgICBzdHJ1Y3QgdHVsaXBfcnhfZGVzYyByeF9yaW5nW1JYX1JJTkdfU0laRV07CisgICAgdW5zaWduZWQgY2hhciByeGJbUlhfUklOR19TSVpFICogQlVGTEVOXTsKKyAgICBzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSB0cHg7Cit9IHR1bGlwX2JzcyBfX3NoYXJlZCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworI2RlZmluZSB0eF9yaW5nIHR1bGlwX2Jzcy50eF9yaW5nCisjZGVmaW5lIHR4YiB0dWxpcF9ic3MudHhiCisjZGVmaW5lIHJ4X3JpbmcgdHVsaXBfYnNzLnJ4X3JpbmcKKyNkZWZpbmUgcnhiIHR1bGlwX2Jzcy5yeGIKKworc3RhdGljIHN0cnVjdCB0dWxpcF9wcml2YXRlICp0cDsKKworLyogS25vd24gY2FyZHMgdGhhdCBoYXZlIG9sZC1zdHlsZSBFRVBST01zLgorICAgV3JpdGluZyB0aGlzIHRhYmxlIGlzIGRlc2NyaWJlZCBhdAorICAgaHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L2RyaXZlcnMvdHVsaXAtZHJpdmVycy90dWxpcC1tZWRpYS5odG1sICovCitzdGF0aWMgc3RydWN0IGZpeHVwcyB7CisgICAgY2hhciAqbmFtZTsKKyAgICB1bnNpZ25lZCBjaGFyIGFkZHIwLCBhZGRyMSwgYWRkcjI7CisgICAgdTE2IG5ld3RhYmxlWzMyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXggbGVuZ3RoIGJlbG93LiAqLworfSBlZXByb21fZml4dXBzW10gPSB7CisgICAgeyJBc2FudGUiLCAwLCAwLCAweDk0LCB7MHgxZTAwLCAweDAwMDAsIDB4MDgwMCwgMHgwMTAwLCAweDAxOGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4ZTA3OCwgMHgwMDAxLCAweDAwNTAsIDB4MDAxOCB9fSwKKyAgICB7IlNNQzkzMzJEU1QiLCAwLCAwLCAweEMwLCB7IDB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDQxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgMHgwMDlFLCAvKiAxMGJhc2VUICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAzLCAweDAwNkQsIC8qIDEwMGJhc2VUeCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTA1LCAweDAwNkQsIC8qIDEwMGJhc2VUeC1GRCAqLyB9fSwKKyAgICB7IkNvZ2VudCBFTTEwMCIsIDAsIDAsIDB4OTIsIHsgMHgxZTAwLCAweDAwMDAsIDB4MDgwMCwgMHgwNjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDcsIDB4ODAyMSwgLyogMTAwYmFzZUZ4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwOCwgMHg4MDIxLCAvKiAxMDBiYXNlRngtRkQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwLCAweDAwOUUsIC8qIDEwYmFzZVQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0LCAweDAwOUUsIC8qIDEwYmFzZVQtRkQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAzLCAweDAwNkQsIC8qIDEwMGJhc2VUeCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDUsIDB4MDA2RCwgLyogMTAwYmFzZVR4LUZEICovIH19LAorICAgIHsiTWF4dGVjaCBOWC0xMTAiLCAwLCAwLCAweEU4LCB7IDB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDUxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDEsIDB4MDA5RSwgLyogMTBiYXNlMiwgQ1NSMTIgMHgxMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAweDAwOUUsIC8qIDEwYmFzZVQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMywgMHgwMDZELCAvKiAxMDBiYXNlVHgsIENTUjEyIDB4MDMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMDUsIDB4MDA2RCwgLyogMTAwYmFzZVR4LUZEIENTUjEyIDB4MDMgKi99fSwKKyAgICB7IkFjY3RvbiBFTjEyMDciLCAwLCAwLCAweEU4LCB7IDB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDUxRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUIwMSwgMHgwMDAwLCAvKiAxMGJhc2UyLCAgIENTUjEyIDB4MUIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIwMCwgMHgwMDlFLCAvKiAxMGJhc2VULCAgIENTUjEyIDB4MEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIwNCwgMHgwMDlFLCAvKiAxMGJhc2VULUZELENTUjEyIDB4MEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUIwMywgMHgwMDZELCAvKiAxMDBiYXNlVHgsIENTUjEyIDB4MUIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUIwNSwgMHgwMDZELCAvKiAxMDBiYXNlVHgtRkQgQ1NSMTIgMHgxQiAqLworICAgIH19LAorICAgIHswLCAwLCAwLCAwLCB7fX19OworCitzdGF0aWMgY29uc3QgY2hhciAqIGJsb2NrX25hbWVbXSA9IHsiMjExNDAgbm9uLU1JSSIsICIyMTE0MCBNSUkgUEhZIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMTE0MiBTZXJpYWwgUEhZIiwgIjIxMTQyIE1JSSBQSFkiLCAiMjExNDMgU1lNIFBIWSIsICIyMTE0MyByZXNldCBtZXRob2QifTsKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgcmVhZF9lZXByb20odW5zaWduZWQgbG9uZyBpb2FkZHIsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKTsKK3N0YXRpYyB2b2lkIHBhcnNlX2VlcHJvbShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCB0dWxpcF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgdm9pZCB0dWxpcF9pbml0X3Jpbmcoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHR1bGlwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCB0dWxpcF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApOworc3RhdGljIGludCB0dWxpcF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKTsKK3N0YXRpYyB2b2lkIHR1bGlwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIG53YXlfc3RhcnQoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHBuaWNfZG9fbndheShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgc2VsZWN0X21lZGlhKHN0cnVjdCBuaWMgKm5pYywgaW50IHN0YXJ0dXApOworc3RhdGljIHZvaWQgaW5pdF9tZWRpYShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgc3RhcnRfbGluayhzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCB0dWxpcF9jaGVja19kdXBsZXgoc3RydWN0IG5pYyAqbmljKTsKKworc3RhdGljIHZvaWQgdHVsaXBfd2FpdCh1bnNpZ25lZCBpbnQgbnRpY2tzKTsKKworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCitzdGF0aWMgdm9pZCB3aGVyZWFtaShjb25zdCBjaGFyICpzdHIpOworI2VuZGlmCisKKyNpZmRlZiBUVUxJUF9ERUJVRworc3RhdGljIHZvaWQgdHVsaXBfbW9yZSh2b2lkKTsKKyNlbmRpZgorCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVXRpbGl0eSBSb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorc3RhdGljIHZvaWQgd2hlcmVhbWkgKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKyAgICBwcmludGYoIiVzOiAlc1xuIiwgdHAtPm5pY19uYW1lLCBzdHIpOworICAgIC8qIHNsZWVwKDIpOyAqLworfQorI2VuZGlmCisKKyNpZmRlZiAgVFVMSVBfREVCVUcKK3N0YXRpYyB2b2lkIHR1bGlwX21vcmUodm9pZCkKK3sKKyAgICBwcmludGYoIlxuXG4tLSBtb3JlIC0tIik7CisgICAgd2hpbGUgKCFpc2tleSgpKQorICAgICAgICAvKiB3YWl0ICovOworICAgIGdldGNoYXIoKTsKKyAgICBwcmludGYoIlxuXG4iKTsKK30KKyNlbmRpZiAvKiBUVUxJUF9ERUJVRyAqLworCitzdGF0aWMgdm9pZCB0dWxpcF93YWl0KHVuc2lnbmVkIGludCBudGlja3MpCit7CisgICAgdW5zaWduZWQgaW50IHRvID0gY3VycnRpY2tzKCkgKyBudGlja3M7CisgICAgd2hpbGUgKGN1cnJ0aWNrcygpIDwgdG8pCisgICAgICAgIC8qIHdhaXQgKi8gOworfQorCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVkaWEgRGVzY3JpcHRvciBDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1JSSB0cmFuc2NlaXZlciBjb250cm9sIHNlY3Rpb24uCisgICBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQgc2VyaWFsCisgICBNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAorICAgZm9yIGRldGFpbHMuICovCisKKy8qIFRoZSBtYXhpbXVtIGRhdGEgY2xvY2sgcmF0ZSBpcyAyLjUgTWh6LiAgVGhlIG1pbmltdW0gdGltaW5nIGlzIHVzdWFsbHkKKyAgIG1ldCBieSBiYWNrLXRvLWJhY2sgUENJIEkvTyBjeWNsZXMsIGJ1dCB3ZSBpbnNlcnQgYSBkZWxheSB0byBhdm9pZAorICAgIm92ZXJjbG9ja2luZyIgaXNzdWVzIG9yIGZ1dHVyZSA2Nk1oeiBQQ0kuICovCisjZGVmaW5lIG1kaW9fZGVsYXkoKSBpbmwobWRpb19hZGRyKQorCisvKiBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQgc2VyaWFsCisgICBNRElPIHByb3RvY29sLiAgSXQgaXMganVzdCBkaWZmZXJlbnQgZW5vdWdoIGZyb20gdGhlIEVFUFJPTSBwcm90b2NvbAorICAgdG8gbm90IHNoYXJlIGNvZGUuICBUaGUgbWF4aXVtIGRhdGEgY2xvY2sgcmF0ZSBpcyAyLjUgTWh6LiAqLworI2RlZmluZSBNRElPX1NISUZUX0NMSyAgMHgxMDAwMAorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUwIDB4MDAwMDAKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMSAweDIwMDAwCisjZGVmaW5lIE1ESU9fRU5CICAgICAgICAgICAgICAgIDB4MDAwMDAgICAgICAgICAvKiBJZ25vcmUgdGhlIDB4MDIwMDAgZGF0YWJvb2sgc2V0dGluZy4gKi8KKyNkZWZpbmUgTURJT19FTkJfSU4gICAgICAgICAgICAgMHg0MDAwMAorI2RlZmluZSBNRElPX0RBVEFfUkVBRCAgMHg4MDAwMAorCisvKiBNSUkgdHJhbnNjZWl2ZXIgY29udHJvbCBzZWN0aW9uLgorICAgUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkIHNlcmlhbAorICAgTURJTyBwcm90b2NvbC4gIFNlZSB0aGUgTUlJIHNwZWNpZmljYXRpb25zIG9yIERQODM4NDBBIGRhdGEgc2hlZXQKKyAgIGZvciBkZXRhaWxzLiAqLworCitpbnQgbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworICAgIGludCBpOworICAgIGludCByZWFkX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKyAgICBpbnQgcmV0dmFsID0gMDsKKyAgICBsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIENTUjk7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJtZGlvX3JlYWRcbiIpOworI2VuZGlmCisKKyAgICBpZiAodHAtPmNoaXBfaWQgPT0gTEM4MkMxNjgpIHsKKwlpbnQgaSA9IDEwMDA7CisJb3V0bCgweDYwMDIwMDAwICsgKHBoeV9pZDw8MjMpICsgKGxvY2F0aW9uPDwxOCksIGlvYWRkciArIDB4QTApOworCWlubChpb2FkZHIgKyAweEEwKTsKKwlpbmwoaW9hZGRyICsgMHhBMCk7CisJd2hpbGUgKC0taSA+IDApCisJICAgIGlmICggISAoKHJldHZhbCA9IGlubChpb2FkZHIgKyAweEEwKSkgJiAweDgwMDAwMDAwKSkKKwkJcmV0dXJuIHJldHZhbCAmIDB4ZmZmZjsKKwlyZXR1cm4gMHhmZmZmOworICAgIH0KKworICAgIGlmICh0cC0+Y2hpcF9pZCA9PSBDT01FVCkgeworCWlmIChwaHlfaWQgPT0gMSkgeworCSAgICBpZiAobG9jYXRpb24gPCA3KQorCQlyZXR1cm4gaW5sKGlvYWRkciArIDB4QjQgKyAobG9jYXRpb248PDIpKTsKKwkgICAgZWxzZSBpZiAobG9jYXRpb24gPT0gMTcpCisJCXJldHVybiBpbmwoaW9hZGRyICsgMHhEMCk7CisJICAgIGVsc2UgaWYgKGxvY2F0aW9uID49IDI5ICYmIGxvY2F0aW9uIDw9IDMxKQorCQlyZXR1cm4gaW5sKGlvYWRkciArIDB4RDQgKyAoKGxvY2F0aW9uLTI5KTw8MikpOworCX0KKwlyZXR1cm4gMHhmZmZmOworICAgIH0KKworICAgIC8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KKyAgICBmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pIHsKKwlvdXRsKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSwgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisgICAgfQorICAgIC8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisgICAgZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJaW50IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogMDsKKworCW91dGwoTURJT19FTkIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCW1kaW9fZGVsYXkoKTsKKwlvdXRsKE1ESU9fRU5CIHwgZGF0YXZhbCB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCW1kaW9fZGVsYXkoKTsKKyAgICB9CisgICAgLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKyAgICBmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCW91dGwoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlubChtZGlvX2FkZHIpICYgTURJT19EQVRBX1JFQUQpID8gMSA6IDApOworCW91dGwoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisgICAgfQorICAgIHJldHVybiAocmV0dmFsPj4xKSAmIDB4ZmZmZjsKK30KKwordm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit7CisgICAgaW50IGk7CisgICAgaW50IGNtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb248PDE4KSB8IHZhbHVlOworICAgIGxvbmcgbWRpb19hZGRyID0gaW9hZGRyICsgQ1NSOTsKKworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCisgICAgd2hlcmVhbWkoIm1kaW9fd3JpdGVcbiIpOworI2VuZGlmCisKKyAgICBpZiAodHAtPmNoaXBfaWQgPT0gTEM4MkMxNjgpIHsKKwlpbnQgaSA9IDEwMDA7CisJb3V0bChjbWQsIGlvYWRkciArIDB4QTApOworCWRvCisJICAgIGlmICggISAoaW5sKGlvYWRkciArIDB4QTApICYgMHg4MDAwMDAwMCkpCisJCWJyZWFrOworCXdoaWxlICgtLWkgPiAwKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKHRwLT5jaGlwX2lkID09IENPTUVUKSB7CisJaWYgKHBoeV9pZCAhPSAxKQorCSAgICByZXR1cm47CisJaWYgKGxvY2F0aW9uIDwgNykKKwkgICAgb3V0bCh2YWx1ZSwgaW9hZGRyICsgMHhCNCArIChsb2NhdGlvbjw8MikpOworCWVsc2UgaWYgKGxvY2F0aW9uID09IDE3KQorCSAgICBvdXRsKHZhbHVlLCBpb2FkZHIgKyAweEQwKTsKKwllbHNlIGlmIChsb2NhdGlvbiA+PSAyOSAmJiBsb2NhdGlvbiA8PSAzMSkKKwkgICAgb3V0bCh2YWx1ZSwgaW9hZGRyICsgMHhENCArICgobG9jYXRpb24tMjkpPDwyKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgMzIgbG9naWMgb25lcy4gKi8KKyAgICBmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pIHsKKwlvdXRsKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSwgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisgICAgfQorICAgIC8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworICAgIGZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCWludCBkYXRhdmFsID0gKGNtZCAmICgxIDw8IGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiAwOworCW91dGwoTURJT19FTkIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCW1kaW9fZGVsYXkoKTsKKwlvdXRsKE1ESU9fRU5CIHwgZGF0YXZhbCB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCW1kaW9fZGVsYXkoKTsKKyAgICB9CisgICAgLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisgICAgZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworCW91dGwoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworCW91dGwoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisgICAgfQorfQorCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRUVQUk9NIFJlYWRpbmcgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFRVBST00gcm91dGluZXMgYWRhcHRlZCBmcm9tIHRoZSBMaW51eCBUdWxpcCBDb2RlICovCisvKiBSZWFkaW5nIGEgc2VyaWFsIEVFUFJPTSBpcyBhICJiaXQiIGdydW5neSwgYnV0IHdlIHdvcmsgb3VyIHdheQorICAgdGhyb3VnaDotPi4KKyovCitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbikKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBzaG9ydCByZXR2YWwgPSAwOworICAgIGxvbmcgZWVfYWRkciA9IGlvYWRkciArIENTUjk7CisgICAgaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SRUFEX0NNRDsKKworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCisgICAgd2hlcmVhbWkoInJlYWRfZWVwcm9tXG4iKTsKKyNlbmRpZgorCisgICAgb3V0bChFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworICAgIG91dGwoRUVfRU5CLCBlZV9hZGRyKTsKKworICAgIC8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisgICAgZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworICAgICAgICBzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CisgICAgICAgIG91dGwoRUVfRU5CIHwgZGF0YXZhbCwgZWVfYWRkcik7CisgICAgICAgIGVlcHJvbV9kZWxheSgpOworICAgICAgICBvdXRsKEVFX0VOQiB8IGRhdGF2YWwgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoKTsKKyAgICB9CisgICAgb3V0bChFRV9FTkIsIGVlX2FkZHIpOworCisgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgb3V0bChFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoKTsKKyAgICAgICAgcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5sKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKyAgICAgICAgb3V0bChFRV9FTkIsIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoKTsKKyAgICB9CisKKyAgICAvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisgICAgb3V0bChFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFRVBST00gUGFyc2luZyBDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2VlcHJvbShzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgdW5zaWduZWQgY2hhciAqcCwgKmVlX2RhdGEgPSB0cC0+ZWVwcm9tOworICAgIGludCBuZXdfYWR2ZXJ0aXNlID0gMDsKKyAgICBpbnQgaTsKKworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCisgICAgd2hlcmVhbWkoInBhcnNlX2VlcHJvbVxuIik7CisjZW5kaWYKKworICAgIHRwLT5tdGFibGUgPSAwOworICAgIC8qIERldGVjdCBhbiBvbGQtc3R5bGUgKFNBIG9ubHkpIEVFUFJPTSBsYXlvdXQ6CisgICAgICAgbWVtY21wKGVlX2RhdGEsIGVlX2RhdGErMTYsIDgpLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICsrKQorICAgICAgICBpZiAoZWVfZGF0YVtpXSAhPSBlZV9kYXRhWzE2K2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGkgPj0gOCkgeworICAgICAgICAvKiBEbyBhIGZpeC11cCBiYXNlZCBvbiB0aGUgdmVuZG9yIGhhbGYgb2YgdGhlIHN0YXRpb24gYWRkcmVzcy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgZWVwcm9tX2ZpeHVwc1tpXS5uYW1lOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuaWMtPm5vZGVfYWRkclswXSA9PSBlZXByb21fZml4dXBzW2ldLmFkZHIwCisgICAgICAgICAgICAgICAgJiYgIG5pYy0+bm9kZV9hZGRyWzFdID09IGVlcHJvbV9maXh1cHNbaV0uYWRkcjEKKyAgICAgICAgICAgICAgICAmJiAgbmljLT5ub2RlX2FkZHJbMl0gPT0gZWVwcm9tX2ZpeHVwc1tpXS5hZGRyMikgeworICAgICAgICAgICAgICAgIGlmIChuaWMtPm5vZGVfYWRkclsyXSA9PSAweEU4ICAmJiAgZWVfZGF0YVsweDFhXSA9PSAweDU1KQorICAgICAgICAgICAgICAgICAgICBpKys7ICAgICAgICAgICAgICAgIC8qIEFuIEFjY3RvbiBFTjEyMDcsIG5vdCBhbiBvdXRsYXcgTWF4dGVjaC4gKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoZWVfZGF0YSArIDI2LCBlZXByb21fZml4dXBzW2ldLm5ld3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWVwcm9tX2ZpeHVwc1tpXS5uZXd0YWJsZSkpOworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogT2xkIGZvcm1hdCBFRVBST00gb24gJyVzJyBib2FyZC5cbiVzOiBVc2luZyBzdWJzdGl0dXRlIG1lZGlhIGNvbnRyb2wgaW5mby5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgZWVwcm9tX2ZpeHVwc1tpXS5uYW1lLCB0cC0+bmljX25hbWUpOworI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVlcHJvbV9maXh1cHNbaV0ubmFtZSA9PSBOVUxMKSB7IC8qIE5vIGZpeHVwIGZvdW5kLiAqLworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgICAgICBwcmludGYoIiVzOiBPbGQgc3R5bGUgRUVQUk9NIHdpdGggbm8gbWVkaWEgc2VsZWN0aW9uIGluZm9ybWF0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUpOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZWVfZGF0YVsxOV0gPiAxKSB7CisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgcHJpbnRmKCIlczogIE11bHRpcG9ydCBjYXJkcyAoJWQgcG9ydHMpIG1heSBub3Qgd29yayBjb3JyZWN0bHkuXG4iLCAKKyAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgZWVfZGF0YVsxOV0pOworI2VuZGlmCisgICAgfQorCisgICAgcCA9ICh2b2lkICopZWVfZGF0YSArIGVlX2RhdGFbMjddOworCisgICAgaWYgKGVlX2RhdGFbMjddID09IDApIHsgICAgICAgICAgICAgLyogTm8gdmFsaWQgbWVkaWEgdGFibGUuICovCisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkgeworICAgICAgICAgICAgcHJpbnRmKCIlczogIE5vIFZhbGlkIE1lZGlhIFRhYmxlLiBlZV9kYXRhWzI3XSA9ICVoaFhcbiIsIAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgZWVfZGF0YVsyN10pOworICAgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IERDMjEwNDEpIHsKKyAgICAgICAgaW50IG1lZGlhID0gZ2V0X3UxNihwKTsKKyAgICAgICAgaW50IGNvdW50ID0gcFsyXTsKKyAgICAgICAgcCArPSAzOworCisgICAgICAgIHByaW50ZigiJXM6IDIxMDQxIE1lZGlhIHRhYmxlLCBkZWZhdWx0IG1lZGlhICVoWCAoJXMpLlxuIiwKKyAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgbWVkaWEsCisgICAgICAgICAgICAgICBtZWRpYSAmIDB4MDgwMCA/ICJBdXRvc2Vuc2UiIDogbWVkaWFuYW1lW21lZGlhICYgMTVdKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgbWVkaWFfYmxvY2sgPSAqcCsrOworICAgICAgICAgICAgaW50IG1lZGlhX2NvZGUgPSBtZWRpYV9ibG9jayAmIE1FRElBX01BU0s7CisgICAgICAgICAgICBpZiAobWVkaWFfYmxvY2sgJiAweDQwKQorICAgICAgICAgICAgICAgIHAgKz0gNjsKKyAgICAgICAgICAgIHN3aXRjaChtZWRpYV9jb2RlKSB7CisgICAgICAgICAgICBjYXNlIDA6IG5ld19hZHZlcnRpc2UgfD0gMHgwMDIwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDogbmV3X2FkdmVydGlzZSB8PSAweDAwNDA7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIlczogIDIxMDQxIG1lZGlhICMlZCwgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgbWVkaWFfY29kZSwgbWVkaWFuYW1lW21lZGlhX2NvZGVdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgY3NyMTJkaXIgPSAwOworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIHN0cnVjdCBtZWRpYXRhYmxlICptdGFibGU7CisgICAgICAgIHUxNiBtZWRpYSA9IGdldF91MTYocCk7CisKKyAgICAgICAgcCArPSAyOworICAgICAgICBpZiAodHAtPmZsYWdzICYgQ1NSMTJfSU5fU1JPTSkKKyAgICAgICAgICAgIGNzcjEyZGlyID0gKnArKzsKKyAgICAgICAgY291bnQgPSAqcCsrOworCisgICAgICAgIHRwLT5tdGFibGUgPSBtdGFibGUgPSAoc3RydWN0IG1lZGlhdGFibGUgKikmdHAtPm1lZGlhX3RhYmxlX3N0b3JhZ2VbMF07CisKKyAgICAgICAgbXRhYmxlLT5kZWZhdWx0bWVkaWEgPSBtZWRpYTsKKyAgICAgICAgbXRhYmxlLT5sZWFmY291bnQgPSBjb3VudDsKKyAgICAgICAgbXRhYmxlLT5jc3IxMmRpciA9IGNzcjEyZGlyOworICAgICAgICBtdGFibGUtPmhhc19ub25taWkgPSBtdGFibGUtPmhhc19taWkgPSBtdGFibGUtPmhhc19yZXNldCA9IDA7CisgICAgICAgIG10YWJsZS0+Y3NyMTVkaXIgPSBtdGFibGUtPmNzcjE1dmFsID0gMDsKKworICAgICAgICBwcmludGYoIiVzOiAgRUVQUk9NIGRlZmF1bHQgbWVkaWEgdHlwZSAlcy5cbiIsIHRwLT5uaWNfbmFtZSwKKyAgICAgICAgICAgICAgIG1lZGlhICYgMHgwODAwID8gIkF1dG9zZW5zZSIgOiBtZWRpYW5hbWVbbWVkaWEgJiBNRURJQV9NQVNLXSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCBtZWRpYWxlYWYgKmxlYWYgPSAmbXRhYmxlLT5tbGVhZltpXTsKKworICAgICAgICAgICAgaWYgKChwWzBdICYgMHg4MCkgPT0gMCkgeyAvKiAyMTE0MCBDb21wYWN0IGJsb2NrLiAqLworICAgICAgICAgICAgICAgIGxlYWYtPnR5cGUgPSAwOworICAgICAgICAgICAgICAgIGxlYWYtPm1lZGlhID0gcFswXSAmIDB4M2Y7CisgICAgICAgICAgICAgICAgbGVhZi0+bGVhZmRhdGEgPSBwOworICAgICAgICAgICAgICAgIGlmICgocFsyXSAmIDB4NjEpID09IDB4MDEpICAgICAgLyogQm9ndXMsIGJ1dCBabnl4IGJvYXJkcyBkbyBpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgbXRhYmxlLT5oYXNfbWlpID0gMTsKKyAgICAgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaChsZWFmLT50eXBlID0gcFsxXSkgeworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgbXRhYmxlLT5oYXNfcmVzZXQgPSBpOworICAgICAgICAgICAgICAgICAgICBsZWFmLT5tZWRpYSA9IHBbMl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgbXRhYmxlLT5oYXNfbWlpID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbGVhZi0+bWVkaWEgPSAxMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBpZiAoKHBbMl0gJiAweDNmKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1MzIgYmFzZTE1ID0gKHBbMl0gJiAweDQwKSA/IGdldF91MTYocCArIDcpIDogMHgwMDA4OworICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICpwMSA9ICh1MTYgKikocCArIChwWzJdICYgMHg0MCA/IDkgOiAzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtdGFibGUtPmNzcjE1ZGlyID0gKGdldF91bmFsaWduZWQocDEgKyAwKTw8MTYpICsgYmFzZTE1OworICAgICAgICAgICAgICAgICAgICAgICAgbXRhYmxlLT5jc3IxNXZhbCA9IChnZXRfdW5hbGlnbmVkKHAxICsgMSk8PDE2KSArIGJhc2UxNTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2guICovCisgICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIG10YWJsZS0+aGFzX25vbm1paSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGxlYWYtPm1lZGlhID0gcFsyXSAmIE1FRElBX01BU0s7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobGVhZi0+bWVkaWEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBuZXdfYWR2ZXJ0aXNlIHw9IDB4MDAyMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogbmV3X2FkdmVydGlzZSB8PSAweDAwNDA7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IG5ld19hZHZlcnRpc2UgfD0gMHgwMDgwOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiBuZXdfYWR2ZXJ0aXNlIHw9IDB4MDEwMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogbmV3X2FkdmVydGlzZSB8PSAweDAyMDA7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGxlYWYtPm1lZGlhID0gMTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlYWYtPmxlYWZkYXRhID0gcCArIDI7CisgICAgICAgICAgICAgICAgcCArPSAocFswXSAmIDB4M2YpICsgMTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSAgJiYgIGxlYWYtPm1lZGlhID09IDExKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnAgPSBsZWFmLT5sZWFmZGF0YTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiAgTUlJIGludGVyZmFjZSBQSFkgJWQsIHNldHVwL3Jlc2V0IHNlcXVlbmNlcyAlZC8lZCBsb25nLCBjYXBhYmlsaXRpZXMgJWhoWCAlaGhYLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCBicFswXSwgYnBbMV0sIGJwWzIgKyBicFsxXSoyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgYnBbNSArIGJwWzIgKyBicFsxXSoyXSoyXSwgYnBbNCArIGJwWzIgKyBicFsxXSoyXSoyXSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHByaW50ZigiJXM6ICBJbmRleCAjJWQgLSBNZWRpYSAlcyAoIyVkKSBkZXNjcmliZWQgIgorICAgICAgICAgICAgICAgICAgICJieSBhICVzICglZCkgYmxvY2suXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgaSwgbWVkaWFuYW1lW2xlYWYtPm1lZGlhXSwgbGVhZi0+bWVkaWEsCisgICAgICAgICAgICAgICAgICAgbGVhZi0+dHlwZSA8IDYgPyBibG9ja19uYW1lW2xlYWYtPnR5cGVdIDogIlVOS05PV04iLAorICAgICAgICAgICAgICAgICAgIGxlYWYtPnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChuZXdfYWR2ZXJ0aXNlKQorICAgICAgICAgICAgdHAtPnN5bV9hZHZlcnRpc2UgPSBuZXdfYWR2ZXJ0aXNlOworICAgIH0KK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHR1bGlwX2luaXRfcmluZyAtIHNldHVwIHRoZSB0eCBhbmQgcnggZGVzY3JpcHRvcnMgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0dWxpcF9pbml0X3Jpbmcoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworICAgIGludCBpOworCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKKyAgICB3aGVyZWFtaSgidHVsaXBfaW5pdF9yaW5nXG4iKTsKKyNlbmRpZgorCisgICAgdHAtPmN1cl9yeCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwlyeF9yaW5nW2ldLnN0YXR1cyAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKKwlyeF9yaW5nW2ldLmxlbmd0aCAgPSBjcHVfdG9fbGUzMihCVUZMRU4pOworCXJ4X3JpbmdbaV0uYnVmZmVyMSA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4YltpICogQlVGTEVOXSk7CisJcnhfcmluZ1tpXS5idWZmZXIyID0gdmlydF90b19sZTMyZGVzYygmcnhfcmluZ1tpKzFdKTsKKyAgICB9CisgICAgLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKyAgICByeF9yaW5nW2ktMV0ubGVuZ3RoICAgID0gY3B1X3RvX2xlMzIoREVTQ19SSU5HX1dSQVAgfCBCVUZMRU4pOworICAgIHJ4X3JpbmdbaS0xXS5idWZmZXIyICAgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKTsKKworICAgIC8qIFdlIG9ubHkgdXNlIDEgdHJhbnNtaXQgYnVmZmVyLCBidXQgd2UgdXNlIDIgZGVzY3JpcHRvcnMgc28KKyAgICAgICB0cmFuc21pdCBlbmdpbmVzIGhhdmUgc29tZXdoZXJlIHRvIHBvaW50IHRvIGlmIHRoZXkgZmVlbCB0aGUgbmVlZCAqLworCisgICAgdHhfcmluZ1swXS5zdGF0dXMgID0gMHgwMDAwMDAwMDsKKyAgICB0eF9yaW5nWzBdLmJ1ZmZlcjEgPSB2aXJ0X3RvX2xlMzJkZXNjKCZ0eGJbMF0pOworICAgIHR4X3JpbmdbMF0uYnVmZmVyMiA9IHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMV0pOworCisgICAgLyogdGhpcyBkZXNjcmlwdG9yIHNob3VsZCBuZXZlciBnZXQgdXNlZCwgc2luY2UgaXQgd2lsbCBuZXZlciBiZSBvd25lZAorICAgICAgIGJ5IHRoZSBtYWNoaW5lIChzdGF0dXMgd2lsbCBhbHdheXMgPT0gMCkgKi8KKyAgICB0eF9yaW5nWzFdLnN0YXR1cyAgPSAweDAwMDAwMDAwOworICAgIHR4X3JpbmdbMV0uYnVmZmVyMSA9IHZpcnRfdG9fbGUzMmRlc2MoJnR4YlswXSk7CisgICAgdHhfcmluZ1sxXS5idWZmZXIyID0gdmlydF90b19sZTMyZGVzYygmdHhfcmluZ1swXSk7CisKKyAgICAvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLCB0aG91Z2ggdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisgICAgdHhfcmluZ1sxXS5sZW5ndGggID0gY3B1X3RvX2xlMzIoREVTQ19SSU5HX1dSQVAgfCBCVUZMRU4pOworfQorDAorCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpIHsKKwlpbnQgY3NyNiA9IGlubChpb2FkZHIgKyBDU1I2KSAmIH4weDAwRDU7CisKKwl0cC0+Y3NyNiAmPSB+MHgwMEQ1OworIAorCS8qICFJRkZfUFJPTUlTQyAqLworCXRwLT5jc3I2IHw9IEFjY2VwdEFsbE11bHRpY2FzdDsKKwljc3I2IHw9IEFjY2VwdEFsbE11bHRpY2FzdDsKKworCW91dGwoY3NyNiwgaW9hZGRyICsgQ1NSNik7CisKKwkKKwkKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV0aF9yZXNldCAtIFJlc2V0IGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdHVsaXBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGxvbmcgdG87CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJ0dWxpcF9yZXNldFxuIik7CisjZW5kaWYKKworICAgIC8qIFN0b3AgVHggYW5kIFJYICovCisgICAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgwMDAwMjAwMiwgaW9hZGRyICsgQ1NSNik7CisKKyAgICAvKiBPbiBzb21lIGNoaXAgcmV2cyB3ZSBtdXN0IHNldCB0aGUgTUlJL1NZTSBwb3J0IGJlZm9yZSB0aGUgcmVzZXQhPyAqLworICAgIGlmICh0cC0+bWlpX2NudCAgfHwgICh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+aGFzX21paSkpIHsKKwlvdXRsKDB4ODE0QzAwMDAsIGlvYWRkciArIENTUjYpOworICAgIH0KKyAKKyAgICAvKiBSZXNldCB0aGUgY2hpcCwgaG9sZGluZyBiaXQgMCBzZXQgYXQgbGVhc3QgNTAgUENJIGN5Y2xlcy4gKi8KKyAgICBvdXRsKDB4MDAwMDAwMDEsIGlvYWRkciArIENTUjApOworICAgIHR1bGlwX3dhaXQoMSk7CisKKyAgICAvKiB0dXJuIG9mZiByZXNldCBhbmQgc2V0IGNhY2hlIGFsaWduPTE2bHdvcmQsIGJ1cnN0PXVubGltaXQgKi8KKyAgICBvdXRsKHRwLT5jc3IwLCBpb2FkZHIgKyBDU1IwKTsKKworICAgIC8qICBXYWl0IHRoZSBzcGVjaWZpZWQgNTAgUENJIGN5Y2xlcyBhZnRlciBhIHJlc2V0ICovCisgICAgdHVsaXBfd2FpdCgxKTsKKworICAgIC8qIHNldCB1cCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBkZXNjcmlwdG9ycyAqLworICAgIHR1bGlwX2luaXRfcmluZyhuaWMpOworCisgICAgaWYgKHRwLT5jaGlwX2lkID09IFBOSUMyKSB7CisgICAgICAgIHUzMiBhZGRyX2hpZ2ggPSAobmljLT5ub2RlX2FkZHJbMV08PDgpICsgKG5pYy0+bm9kZV9hZGRyWzBdPDwwKTsKKyAgICAgICAgLyogVGhpcyBhZGRyZXNzIHNldHRpbmcgZG9lcyBub3QgYXBwZWFyIHRvIGltcGFjdCBjaGlwIG9wZXJhdGlvbj8/ICovCisgICAgICAgIG91dGwoKG5pYy0+bm9kZV9hZGRyWzVdPDw4KSArIG5pYy0+bm9kZV9hZGRyWzRdICsKKyAgICAgICAgICAgICAobmljLT5ub2RlX2FkZHJbM108PDI0KSArIChuaWMtPm5vZGVfYWRkclsyXTw8MTYpLAorICAgICAgICAgICAgIGlvYWRkciArIDB4QjApOworICAgICAgICBvdXRsKGFkZHJfaGlnaCArIChhZGRyX2hpZ2g8PDE2KSwgaW9hZGRyICsgMHhCOCk7CisgICAgfQorCisgICAgLyogTUNfSEFTSF9PTkxZIGJvYXJkcyBkb24ndCBzdXBwb3J0IHNldHVwIHBhY2tldHMgKi8KKyAgICBpZiAodHAtPmZsYWdzICYgTUNfSEFTSF9PTkxZKSB7CisgICAgICAgIHUzMiBhZGRyX2xvdyA9IGNwdV90b19sZTMyKGdldF91bmFsaWduZWQoKHUzMiAqKW5pYy0+bm9kZV9hZGRyKSk7CisgICAgICAgIHUzMiBhZGRyX2hpZ2ggPSBjcHVfdG9fbGUzMihnZXRfdW5hbGlnbmVkKCh1MTYgKikobmljLT5ub2RlX2FkZHIrNCkpKTsKKworCS8qIGNsZWFyIG11bHRpY2FzdCBoYXNoIGZpbHRlcnMgYW5kIHNldHVwIE1BQyBhZGRyZXNzIGZpbHRlcnMgKi8KKwlpZiAodHAtPmZsYWdzICYgSVNfQVNJWCkgeworICAgICAgICAgICAgb3V0bCgwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICBvdXRsKGFkZHJfbG93LCAgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICAgICAgb3V0bCgxLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICBvdXRsKGFkZHJfaGlnaCwgaW9hZGRyICsgQ1NSMTQpOworCSAgICBvdXRsKDIsIGlvYWRkciArIENTUjEzKTsKKwkgICAgb3V0bCgwLCBpb2FkZHIgKyBDU1IxNCk7CisJICAgIG91dGwoMywgaW9hZGRyICsgQ1NSMTMpOworCSAgICBvdXRsKDAsIGlvYWRkciArIENTUjE0KTsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IENPTUVUKSB7CisgICAgICAgICAgICBvdXRsKGFkZHJfbG93LCAgaW9hZGRyICsgMHhBNCk7CisgICAgICAgICAgICBvdXRsKGFkZHJfaGlnaCwgaW9hZGRyICsgMHhBOCk7CisgICAgICAgICAgICBvdXRsKDAsIGlvYWRkciArIDB4QUMpOworICAgICAgICAgICAgb3V0bCgwLCBpb2FkZHIgKyAweEIwKTsKKwl9CisgICAgfSBlbHNlIHsKKwkvKiBmb3Igb3RoZXIgYm9hcmRzIHdlIHNlbmQgYSBzZXR1cCBwYWNrZXQgdG8gaW5pdGlhbGl6ZQorCSAgIHRoZSBmaWx0ZXJzICovCisJdTMyIHR4X2ZsYWdzID0gMHgwODAwMDAwMCB8IDE5MjsKKworCS8qIGNvbnN0cnVjdCBwZXJmZWN0IGZpbHRlciBmcmFtZSB3aXRoIG1hYyBhZGRyZXNzIGFzIGZpcnN0IG1hdGNoCisJICAgYW5kIGJyb2FkY2FzdCBhZGRyZXNzIGZvciBhbGwgb3RoZXJzICovCisJZm9yIChpPTA7IGk8MTkyOyBpKyspIAorCSAgICB0eGJbaV0gPSAweEZGOworCXR4YlswXSA9IG5pYy0+bm9kZV9hZGRyWzBdOworCXR4YlsxXSA9IG5pYy0+bm9kZV9hZGRyWzFdOworCXR4Yls0XSA9IG5pYy0+bm9kZV9hZGRyWzJdOworCXR4Yls1XSA9IG5pYy0+bm9kZV9hZGRyWzNdOworCXR4Yls4XSA9IG5pYy0+bm9kZV9hZGRyWzRdOworCXR4Yls5XSA9IG5pYy0+bm9kZV9hZGRyWzVdOworCisJdHhfcmluZ1swXS5sZW5ndGggID0gY3B1X3RvX2xlMzIodHhfZmxhZ3MpOworCXR4X3JpbmdbMF0uYnVmZmVyMSA9IHZpcnRfdG9fbGUzMmRlc2MoJnR4YlswXSk7CisJdHhfcmluZ1swXS5zdGF0dXMgID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CisgICAgfQorCisgICAgLyogUG9pbnQgdG8gcnggYW5kIHR4IGRlc2NyaXB0b3JzICovCisgICAgb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKSwgaW9hZGRyICsgQ1NSMyk7CisgICAgb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKCZ0eF9yaW5nWzBdKSwgaW9hZGRyICsgQ1NSNCk7CisKKyAgICBpbml0X21lZGlhKG5pYyk7CisKKyAgICAvKiBzZXQgdGhlIGNoaXAncyBvcGVyYXRpbmcgbW9kZSAoYnV0IGRvbid0IHR1cm4gb24geG1pdCBhbmQgcmVjdiB5ZXQpICovCisgICAgb3V0bCgodHAtPmNzcjYgJiB+MHgwMDAwMjAwMiksIGlvYWRkciArIENTUjYpOworCisgICAgLyogc2VuZCBzZXR1cCBwYWNrZXQgZm9yIGNhcmRzIHRoYXQgc3VwcG9ydCBpdCAqLworICAgIGlmICghKHRwLT5mbGFncyAmIE1DX0hBU0hfT05MWSkpIHsKKwkvKiBlbmFibGUgdHJhbnNtaXQgIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwlvdXRsKHRwLT5jc3I2IHwgMHgwMDAwMjAwMCwgaW9hZGRyICsgQ1NSNik7CisJLyogaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZCAqLworCW91dGwoMCwgaW9hZGRyICsgQ1NSMSk7CisKKwl0byA9IGN1cnJ0aWNrcygpICsgVFhfVElNRV9PVVQ7CisJd2hpbGUgKCh0eF9yaW5nWzBdLnN0YXR1cyAmIDB4ODAwMDAwMDApICYmIChjdXJydGlja3MoKSA8IHRvKSkKKwkgICAgLyogd2FpdCAqLyA7CisKKwlpZiAoY3VycnRpY2tzKCkgPj0gdG8pIHsKKwkgICAgcHJpbnRmICgiJXM6IFRYIFNldHVwIFRpbWVvdXQuXG4iLCB0cC0+bmljX25hbWUpOworCX0KKyAgICB9CisKKyAgICBpZiAodHAtPmNoaXBfaWQgPT0gTEM4MkMxNjgpCisJdHVsaXBfY2hlY2tfZHVwbGV4KG5pYyk7CisKKyAgICBzZXRfcnhfbW9kZShuaWMpOyAJCisgICAgICAgIAorICAgIC8qIGVuYWJsZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSAqLworICAgIG91dGwodHAtPmNzcjYgfCAweDAwMDAyMDAyLCBpb2FkZHIgKyBDU1I2KTsKK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV0aF90cmFuc21pdCAtIFRyYW5zbWl0IGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdHVsaXBfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpwKQoreworICAgIHUxNiBuc3R5cGU7CisgICAgdTMyIHRvOworICAgIHUzMiBjc3I2ID0gaW5sKGlvYWRkciArIENTUjYpOworCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUgICAgCisgICAgd2hlcmVhbWkoInR1bGlwX3RyYW5zbWl0XG4iKTsKKyNlbmRpZgorCisgICAgLyogRGlzYWJsZSBUeCAqLworICAgIG91dGwoY3NyNiAmIH4weDAwMDAyMDAwLCBpb2FkZHIgKyBDU1I2KTsKKworICAgIG1lbWNweSh0eGIsIGQsIEVUSF9BTEVOKTsKKyAgICBtZW1jcHkodHhiICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CisgICAgbnN0eXBlID0gaHRvbnMoKHUxNikgdCk7CisgICAgbWVtY3B5KHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopJm5zdHlwZSwgMik7CisgICAgbWVtY3B5KHR4YiArIEVUSF9ITEVOLCBwLCBzKTsKKworICAgIHMgKz0gRVRIX0hMRU47CisgICAgcyAmPSAweDBGRkY7CisKKyAgICAvKiBwYWQgdG8gbWluaW11bSBwYWNrZXQgc2l6ZSAqLworICAgIHdoaWxlIChzIDwgRVRIX1pMRU4pICAKKyAgICAgICAgdHhiW3MrK10gPSAnXDAnOworCisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorCXByaW50ZigiJXM6IHNlbmRpbmcgJWQgYnl0ZXMgZXRodHlwZSAlaFhcbiIsIHRwLT5uaWNfbmFtZSwgcywgdCk7CisjZW5kaWYKKyAgICAgICAgCisgICAgLyogc2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKyAgICAvKiAweDYwMDAwMDAwID0gbm8gaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KKyAgICB0eF9yaW5nWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKDB4NjAwMDAwMDAgfCBzKTsKKyAgICB0eF9yaW5nWzBdLnN0YXR1cyA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCisgICAgLyogUG9pbnQgdG8gdHJhbnNtaXQgZGVzY3JpcHRvciAqLworICAgIG91dGwodmlydF90b19sZTMyZGVzYygmdHhfcmluZ1swXSksIGlvYWRkciArIENTUjQpOworCisgICAgLyogRW5hYmxlIFR4ICovCisgICAgb3V0bChjc3I2IHwgMHgwMDAwMjAwMCwgaW9hZGRyICsgQ1NSNik7CisgICAgLyogaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZCAqLworICAgIG91dGwoMCwgaW9hZGRyICsgQ1NSMSk7CisKKyAgICB0byA9IGN1cnJ0aWNrcygpICsgVFhfVElNRV9PVVQ7CisgICAgd2hpbGUgKCh0eF9yaW5nWzBdLnN0YXR1cyAmIDB4ODAwMDAwMDApICYmIChjdXJydGlja3MoKSA8IHRvKSkKKyAgICAgICAgLyogd2FpdCAqLyA7CisKKyAgICBpZiAoY3VycnRpY2tzKCkgPj0gdG8pIHsKKyAgICAgICAgcHJpbnRmICgiVFggVGltZW91dCFcbiIpOworICAgIH0KKworICAgIC8qIERpc2FibGUgVHggKi8KKyAgICBvdXRsKGNzcjYgJiB+MHgwMDAwMjAwMCwgaW9hZGRyICsgQ1NSNik7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXRoX3BvbGwgLSBXYWl0IGZvciBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHR1bGlwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJ0dWxpcF9wb2xsXG4iKTsKKyNlbmRpZgorCisgICAgLyogbm8gcGFja2V0IHdhaXRpbmcuIHBhY2tldCBzdGlsbCBvd25lZCBieSBOSUMgKi8KKyAgICBpZiAocnhfcmluZ1t0cC0+Y3VyX3J4XS5zdGF0dXMgJiAweDgwMDAwMDAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKKyAgICB3aGVyZWFtaSgidHVsaXBfcG9sbCBnb3Qgb25lXG4iKTsKKyNlbmRpZgorCisgICAgbmljLT5wYWNrZXRsZW4gPSAocnhfcmluZ1t0cC0+Y3VyX3J4XS5zdGF0dXMgJiAweDNGRkYwMDAwKSA+PiAxNjsKKworICAgIC8qIGlmIHdlIGdldCBhIGNvcnJ1cHRlZCBwYWNrZXQuIHRocm93IGl0IGF3YXkgYW5kIG1vdmUgb24gKi8KKyAgICBpZiAocnhfcmluZ1t0cC0+Y3VyX3J4XS5zdGF0dXMgJiAweDAwMDA4MDAwKSB7CisJLyogcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGFuZCBidWZmZXIgdG8gcmVjZWl2ZSByaW5nICovCisgICAgICAgIHJ4X3JpbmdbdHAtPmN1cl9yeF0uc3RhdHVzID0gMHg4MDAwMDAwMDsKKwl0cC0+Y3VyX3J4ID0gKCsrdHAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGNvcHkgcGFja2V0IHRvIHdvcmtpbmcgYnVmZmVyICovCisgICAgbWVtY3B5KG5pYy0+cGFja2V0LCByeGIgKyB0cC0+Y3VyX3J4ICogQlVGTEVOLCBuaWMtPnBhY2tldGxlbik7CisKKyAgICAvKiByZXR1cm4gdGhlIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciB0byByZWNlaXZlIHJpbmcgKi8KKyAgICByeF9yaW5nW3RwLT5jdXJfcnhdLnN0YXR1cyA9IDB4ODAwMDAwMDA7CisgICAgdHAtPmN1cl9yeCA9ICgrK3RwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCisgICAgcmV0dXJuIDE7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXRoX2Rpc2FibGUgLSBEaXNhYmxlIHRoZSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0dWxpcF9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljICkgeworCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKKyAgICB3aGVyZWFtaSgidHVsaXBfZGlzYWJsZVxuIik7CisjZW5kaWYKKworICAgIHR1bGlwX3Jlc2V0KG5pYyk7CisKKyAgICAvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICBvdXRsKDB4MDAwMDAwMDAsIGlvYWRkciArIENTUjcpOworCisgICAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisgICAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgwMDAwMjAwMiwgaW9hZGRyICsgQ1NSNik7CisKKyAgICAvKiBDbGVhciB0aGUgbWlzc2VkLXBhY2tldCBjb3VudGVyLiAqLworICAgIGlubChpb2FkZHIgKyBDU1I4KTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKklSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHR1bGlwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorDAorc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyB0dWxpcF9vcGVyYXRpb25zID0geworCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKKwkucG9sbAkJPSB0dWxpcF9wb2xsLAorCS50cmFuc21pdAk9IHR1bGlwX3RyYW5zbWl0LAorCS5pcnEJCT0gdHVsaXBfaXJxLAorCit9OworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV0aF9wcm9iZSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB0dWxpcF9wcm9iZSAoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSApIHsKKworICAgIHUzMiBpOworICAgIHU4ICBjaGlwX3JldjsKKyAgICB1OCBlZV9kYXRhW0VFUFJPTV9TSVpFXTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzdW07CisgICAgaW50IGNoaXBfaWR4OworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGxhc3RfcGh5c19hZGRyW0VUSF9BTEVOXSA9IHsweDAwLCAnTCcsICdpJywgJ24nLCAndScsICd4J307CisKKyAgICBpZiAocGNpLT5pb2FkZHIgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpb2FkZHIgICAgICAgICA9IHBjaS0+aW9hZGRyOworICAgIG5pYy0+aW9hZGRyICAgID0gcGNpLT5pb2FkZHIgJiB+MzsKKyAgICBuaWMtPmlycW5vICAgICA9IDA7CisKKyAgICAvKiBwb2ludCB0byBwcml2YXRlIHN0b3JhZ2UgKi8KKyAgICB0cCA9ICZ0dWxpcF9ic3MudHB4OworCisgICAgdHAtPnZlbmRvcl9pZCAgPSBwY2ktPnZlbmRvcjsKKyAgICB0cC0+ZGV2X2lkICAgICA9IHBjaS0+ZGV2aWNlOworICAgIHRwLT5uaWNfbmFtZSAgID0gcGNpLT5kcml2ZXJfbmFtZTsKKworICAgIHRwLT5pZl9wb3J0ID0gMDsKKyAgICB0cC0+ZGVmYXVsdF9wb3J0ID0gMDsKKworICAgIGFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CisKKyAgICAvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICBvdXRsKDB4MDAwMDAwMDAsIGlvYWRkciArIENTUjcpOworCisgICAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisgICAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgwMDAwMjAwMiwgaW9hZGRyICsgQ1NSNik7CisKKyAgICAvKiBDbGVhciB0aGUgbWlzc2VkLXBhY2tldCBjb3VudGVyLiAqLworICAgIGlubChpb2FkZHIgKyBDU1I4KTsKKworICAgIHByaW50ZigiXG4iKTsgICAgICAgICAgICAgICAgLyogc28gd2Ugc3RhcnQgb24gYSBmcmVzaCBsaW5lICovCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKKyAgICB3aGVyZWFtaSgidHVsaXBfcHJvYmVcbiIpOworI2VuZGlmCisKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJcHJpbnRmICgiJXM6IExvb2tpbmcgZm9yIFR1bGlwIENoaXA6IFZlbmRvcj0laFggIERldmljZT0laFhcbiIsIHRwLT5uaWNfbmFtZSwKKwkJdHAtPnZlbmRvciwgdHAtPmRldl9pZCk7CisjZW5kaWYKKworICAgIC8qIEZpZ3VyZSBvdXQgd2hpY2ggY2hpcCB3ZSdyZSBkZWFsaW5nIHdpdGggKi8KKyAgICBpID0gMDsKKyAgICBjaGlwX2lkeCA9IC0xOworICAKKyAgICB3aGlsZSAocGNpX2lkX3RibFtpXS5uYW1lKSB7CisgICAgICAgIGlmICggKCgodTMyKSB0cC0+ZGV2X2lkIDw8IDE2KSB8IHRwLT52ZW5kb3JfaWQpID09IAorICAgICAgICAgICAgIChwY2lfaWRfdGJsW2ldLmlkLnBjaSAmIHBjaV9pZF90YmxbaV0uaWQucGNpX21hc2spICkgeworICAgICAgICAgICAgY2hpcF9pZHggPSBwY2lfaWRfdGJsW2ldLmRydl9mbGFnczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICB9CisKKyAgICBpZiAoY2hpcF9pZHggPT0gLTEpIHsKKyAgICAgICAgcHJpbnRmICgiJXM6IFVua25vd24gVHVsaXAgQ2hpcDogVmVuZG9yPSVoWCAgRGV2aWNlPSVoWFxuIiwgdHAtPm5pY19uYW1lLAorICAgICAgICAgICAgICAgIHRwLT52ZW5kb3JfaWQsIHRwLT5kZXZfaWQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB0cC0+cGNpX2lkX2lkeCA9IGk7CisgICAgdHAtPmZsYWdzID0gdHVsaXBfdGJsW2NoaXBfaWR4XS5mbGFnczsKKworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkgeworCXByaW50ZiAoIiVzOiB0cC0+cGNpX2lkX2lkeCA9PSAlZCwgIG5hbWUgPT0gJXNcbiIsIHRwLT5uaWNfbmFtZSwgCisJCXRwLT5wY2lfaWRfaWR4LCBwY2lfaWRfdGJsW3RwLT5wY2lfaWRfaWR4XS5uYW1lKTsKKwlwcmludGYgKCIlczogY2hpcF9pZHggPT0gJWQsIG5hbWUgPT0gJXNcbiIsIHRwLT5uaWNfbmFtZSwgY2hpcF9pZHgsIAorCQl0dWxpcF90YmxbY2hpcF9pZHhdLmNoaXBfbmFtZSk7CisgICAgfQorI2VuZGlmCisgIAorICAgIC8qIEJyaW5nIHRoZSAyMTA0MS8yMTE0MyBvdXQgb2Ygc2xlZXAgbW9kZS4KKyAgICAgICBDYXV0aW9uOiBTbm9vemUgbW9kZSBkb2VzIG5vdCB3b3JrIHdpdGggc29tZSBib2FyZHMhICovCisgICAgaWYgKHRwLT5mbGFncyAmIEhBU19QV1JEV04pCisgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCAweDQwLCAweDAwMDAwMDAwKTsKKworICAgIGlmIChpbmwoaW9hZGRyICsgQ1NSNSkgPT0gMHhGRkZGRkZGRikgeworICAgICAgICBwcmludGYoIiVzOiBUaGUgVHVsaXAgY2hpcCBhdCAlWCBpcyBub3QgZnVuY3Rpb25pbmcuXG4iLAorICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCAodW5zaWduZWQgaW50KSBpb2FkZHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAKKyAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTiwgJmNoaXBfcmV2KTsKKworICAgIHByaW50ZigiJXM6IFtjaGlwOiAlc10gcmV2ICVkIGF0ICVoWFxuIiwgdHAtPm5pY19uYW1lLAorICAgICAgICAgICB0dWxpcF90YmxbY2hpcF9pZHhdLmNoaXBfbmFtZSwgY2hpcF9yZXYsICh1bnNpZ25lZCBpbnQpIGlvYWRkcik7CisgICAgcHJpbnRmKCIlczogVmVuZG9yPSVoWCAgRGV2aWNlPSVoWCIsIHRwLT5uaWNfbmFtZSwgdHAtPnZlbmRvcl9pZCwgdHAtPmRldl9pZCk7CisKKyAgICBpZiAoY2hpcF9pZHggPT0gREMyMTA0MSAgJiYgIGlubChpb2FkZHIgKyBDU1I5KSAmIDB4ODAwMCkgeworICAgICAgICBwcmludGYoIiAyMTA0MCBjb21wYXRpYmxlIG1vZGUuIik7CisgICAgICAgIGNoaXBfaWR4ID0gREMyMTA0MDsKKyAgICB9CisKKyAgICBwcmludGYoIlxuIik7CisKKyAgICAvKiBUaGUgU1JPTS9FRVBST00gaW50ZXJmYWNlIHZhcmllcyBkcmFtYXRpY2FsbHkuICovCisgICAgc3VtID0gMDsKKyAgICBpZiAoY2hpcF9pZHggPT0gREMyMTA0MCkgeworICAgICAgICBvdXRsKDAsIGlvYWRkciArIENTUjkpOyAgICAgICAgIC8qIFJlc2V0IHRoZSBwb2ludGVyIHdpdGggYSBkdW1teSB3cml0ZS4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YWx1ZSwgYm9ndXNjbnQgPSAxMDAwMDA7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHZhbHVlID0gaW5sKGlvYWRkciArIENTUjkpOworICAgICAgICAgICAgd2hpbGUgKHZhbHVlIDwgMCAgJiYgLS1ib2d1c2NudCA+IDApOworICAgICAgICAgICAgbmljLT5ub2RlX2FkZHJbaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIHN1bSArPSB2YWx1ZSAmIDB4ZmY7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoaXBfaWR4ID09IExDODJDMTY4KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YWx1ZSwgYm9ndXNjbnQgPSAxMDAwMDA7CisgICAgICAgICAgICBvdXRsKDB4NjAwIHwgaSwgaW9hZGRyICsgMHg5OCk7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHZhbHVlID0gaW5sKGlvYWRkciArIENTUjkpOworICAgICAgICAgICAgd2hpbGUgKHZhbHVlIDwgMCAgJiYgLS1ib2d1c2NudCA+IDApOworICAgICAgICAgICAgcHV0X3VuYWxpZ25lZChsZTE2X3RvX2NwdSh2YWx1ZSksICgodTE2KiluaWMtPm5vZGVfYWRkcikgKyBpKTsKKyAgICAgICAgICAgIHN1bSArPSB2YWx1ZSAmIDB4ZmZmZjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2hpcF9pZHggPT0gQ09NRVQpIHsKKyAgICAgICAgLyogTm8gbmVlZCB0byByZWFkIHRoZSBFRVBST00uICovCisgICAgICAgIHB1dF91bmFsaWduZWQoaW5sKGlvYWRkciArIDB4QTQpLCAodTMyICopbmljLT5ub2RlX2FkZHIpOworICAgICAgICBwdXRfdW5hbGlnbmVkKGlubChpb2FkZHIgKyAweEE4KSwgKHUxNiAqKShuaWMtPm5vZGVfYWRkciArIDQpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpICsrKQorICAgICAgICAgICAgc3VtICs9IG5pYy0+bm9kZV9hZGRyW2ldOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEEgc2VyaWFsIEVFUFJPTSBpbnRlcmZhY2UsIHdlIHJlYWQgbm93IGFuZCBzb3J0IGl0IG91dCBsYXRlci4gKi8KKyAgICAgICAgaW50IHNhX29mZnNldCA9IDA7CisgICAgICAgIGludCBlZV9hZGRyX3NpemUgPSByZWFkX2VlcHJvbShpb2FkZHIsIDB4ZmYsIDgpICYgMHg0MDAwMCA/IDggOiA2OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoZWVfZGF0YSkvMjsgaSsrKQorICAgICAgICAgICAgKCh1MTYgKillZV9kYXRhKVtpXSA9CisgICAgICAgICAgICAgICAgbGUxNl90b19jcHUocmVhZF9lZXByb20oaW9hZGRyLCBpLCBlZV9hZGRyX3NpemUpKTsKKworICAgICAgICAvKiBERUMgbm93IGhhcyBhIHNwZWNpZmljYXRpb24gKHNlZSBOb3RlcykgYnV0IGVhcmx5IGJvYXJkIG1ha2VycworICAgICAgICAgICBqdXN0IHB1dCB0aGUgYWRkcmVzcyBpbiB0aGUgZmlyc3QgRUVQUk9NIGxvY2F0aW9ucy4gKi8KKyAgICAgICAgLyogVGhpcyBkb2VzICBtZW1jbXAoZWVkYXRhLCBlZWRhdGErMTYsIDgpICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICsrKQorICAgICAgICAgICAgaWYgKGVlX2RhdGFbaV0gIT0gZWVfZGF0YVsxNitpXSkKKyAgICAgICAgICAgICAgICBzYV9vZmZzZXQgPSAyMDsKKyAgICAgICAgaWYgKGVlX2RhdGFbMF0gPT0gMHhmZiAgJiYgIGVlX2RhdGFbMV0gPT0gMHhmZiAmJiAgZWVfZGF0YVsyXSA9PSAwKSB7CisgICAgICAgICAgICBzYV9vZmZzZXQgPSAyOyAgICAgICAgICAgICAgLyogR3JyciwgZGFtbiBNYXRyb3ggYm9hcmRzLiAqLworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSArKykgeworICAgICAgICAgICAgbmljLT5ub2RlX2FkZHJbaV0gPSBlZV9kYXRhW2kgKyBzYV9vZmZzZXRdOworICAgICAgICAgICAgc3VtICs9IGVlX2RhdGFbaSArIHNhX29mZnNldF07CisgICAgICAgIH0KKyAgICB9CisgICAgLyogTGl0ZS1PbiBib2FyZHMgaGF2ZSB0aGUgYWRkcmVzcyBieXRlLXN3YXBwZWQuICovCisgICAgaWYgKChuaWMtPm5vZGVfYWRkclswXSA9PSAweEEwICB8fCAgbmljLT5ub2RlX2FkZHJbMF0gPT0gMHhDMCkKKyAgICAgICAgJiYgIG5pYy0+bm9kZV9hZGRyWzFdID09IDB4MDApCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSs9MikgeworICAgICAgICAgICAgY2hhciB0bXAgPSBuaWMtPm5vZGVfYWRkcltpXTsKKyAgICAgICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gbmljLT5ub2RlX2FkZHJbaSsxXTsKKyAgICAgICAgICAgIG5pYy0+bm9kZV9hZGRyW2krMV0gPSB0bXA7CisgICAgICAgIH0KKworICAgIGlmIChzdW0gPT0gMCAgfHwgc3VtID09IEVUSF9BTEVOKjB4ZmYpIHsKKyAgICAgICAgcHJpbnRmKCIlczogRUVQUk9NIG5vdCBwcmVzZW50IVxuIiwgdHAtPm5pY19uYW1lKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOLTE7IGkrKykKKyAgICAgICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gbGFzdF9waHlzX2FkZHJbaV07CisgICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gbGFzdF9waHlzX2FkZHJbaV0gKyAxOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorICAgICAgICBsYXN0X3BoeXNfYWRkcltpXSA9IG5pYy0+bm9kZV9hZGRyW2ldOworCisgICAgREJHICggIiVzOiAlcyBhdCBpb2FkZHIgJWhYXG4iLCB0cC0+bmljX25hbWUsIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIgKSwgCisJICAodW5zaWduZWQgaW50KSBpb2FkZHIgKTsKKworICAgIHRwLT5jaGlwX2lkID0gY2hpcF9pZHg7CisgICAgdHAtPnJldmlzaW9uID0gY2hpcF9yZXY7CisgICAgdHAtPmNzcjAgPSBjc3IwOworCisgICAgLyogQnVnRml4ZXM6IFRoZSAyMTE0My1URCBoYW5ncyB3aXRoIFBDSSBXcml0ZS1hbmQtSW52YWxpZGF0ZSBjeWNsZXMuCisgICAgICAgQW5kIHRoZSBBU0lYIG11c3QgaGF2ZSBhIGJ1cnN0IGxpbWl0IG9yIGhvcnJpYmxlIHRoaW5ncyBoYXBwZW4uICovCisgICAgaWYgKGNoaXBfaWR4ID09IERDMjExNDMgICYmICBjaGlwX3JldiA9PSA2NSkKKyAgICAgICAgdHAtPmNzcjAgJj0gfjB4MDEwMDAwMDA7CisgICAgZWxzZSBpZiAodHAtPmZsYWdzICYgSVNfQVNJWCkKKyAgICAgICAgdHAtPmNzcjAgfD0gMHgyMDAwOworCisgICAgaWYgKG1lZGlhX2NhcFt0cC0+ZGVmYXVsdF9wb3J0XSAmIE1lZGlhSXNNSUkpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHUxNiBtZWRpYTJhZHZlcnRbXSA9IHsgMHgyMCwgMHg0MCwgMHgwM2UwLCAweDYwLAorCQkJCQkgICAgMHg4MCwgMHgxMDAsIDB4MjAwIH07CisgICAgICAgIHRwLT5taWlfYWR2ZXJ0aXNlID0gbWVkaWEyYWR2ZXJ0W3RwLT5kZWZhdWx0X3BvcnQgLSA5XTsKKyAgICAgICAgdHAtPm1paV9hZHZlcnRpc2UgfD0gKHRwLT5mbGFncyAmIEhBU184MDIzWCk7IC8qIE1hdGNoaW5nIGJpdHMhICovCisgICAgfQorCisgICAgLyogVGhpcyBpcyBsb2dpY2FsbHkgcGFydCBvZiB0aGUgcHJvYmUgcm91dGluZSwgYnV0IHRvbyBjb21wbGV4CisgICAgICAgdG8gd3JpdGUgaW5saW5lLiAqLworICAgIGlmICh0cC0+ZmxhZ3MgJiBIQVNfTUVESUFfVEFCTEUpIHsKKyAgICAgICAgbWVtY3B5KHRwLT5lZXByb20sIGVlX2RhdGEsIHNpemVvZih0cC0+ZWVwcm9tKSk7CisgICAgICAgIHBhcnNlX2VlcHJvbShuaWMpOworICAgIH0KKworICAgIHN0YXJ0X2xpbmsobmljKTsKKworICAgIC8qIHJlc2V0IHRoZSBkZXZpY2UgYW5kIG1ha2UgcmVhZHkgZm9yIHR4IGFuZCByeCBvZiBwYWNrZXRzICovCisgICAgdHVsaXBfcmVzZXQobmljKTsKKyAgICBuaWMtPm5pY19vcAk9ICZ0dWxpcF9vcGVyYXRpb25zOworCisgICAgLyogZ2l2ZSB0aGUgYm9hcmQgYSBjaGFuY2UgdG8gcmVzZXQgYmVmb3JlIHJldHVybmluZyAqLworICAgIHR1bGlwX3dhaXQoNCpUSUNLU19QRVJfU0VDKTsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9saW5rKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBpbnQgaTsKKworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCisgICAgd2hlcmVhbWkoInN0YXJ0X2xpbmtcbiIpOworI2VuZGlmCisKKyAgICBpZiAoKHRwLT5mbGFncyAmIEFMV0FZU19DSEVDS19NSUkpIHx8CisgICAgICAgICh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+aGFzX21paSkgfHwKKyAgICAgICAgKCAhIHRwLT5tdGFibGUgICYmICAodHAtPmZsYWdzICYgSEFTX01JSSkpKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBwaHksIHBoeV9pZHg7CisgICAgICAgIGlmICh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+aGFzX21paSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRwLT5tdGFibGUtPmxlYWZjb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGlmICh0cC0+bXRhYmxlLT5tbGVhZltpXS5tZWRpYSA9PSAxMSkgeworICAgICAgICAgICAgICAgICAgICB0cC0+Y3VyX2luZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgdHAtPnNhdmVkX2lmX3BvcnQgPSB0cC0+aWZfcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0X21lZGlhKG5pYywgMik7CisgICAgICAgICAgICAgICAgICAgIHRwLT5pZl9wb3J0ID0gdHAtPnNhdmVkX2lmX3BvcnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIGNvbm5lY3RlZCBNSUkgeGN2cnMuICovCisgICAgICAgIGZvciAocGh5ID0gMCwgcGh5X2lkeCA9IDA7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBzaXplb2YodHAtPnBoeXMpOworICAgICAgICAgICAgIHBoeSsrKSB7CisgICAgICAgICAgICBpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChuaWMsIHBoeSwgMSk7CisgICAgICAgICAgICBpZiAoKG1paV9zdGF0dXMgJiAweDgzMDEpID09IDB4ODAwMSB8fAorICAgICAgICAgICAgICAgICgobWlpX3N0YXR1cyAmIDB4ODAwMCkgPT0gMCAgJiYgKG1paV9zdGF0dXMgJiAweDc4MDApICE9IDApKSB7CisgICAgICAgICAgICAgICAgaW50IG1paV9yZWcwID0gbWRpb19yZWFkKG5pYywgcGh5LCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgbWlpX2FkdmVydCA9IG1kaW9fcmVhZChuaWMsIHBoeSwgNCk7CisgICAgICAgICAgICAgICAgaW50IHRvX2FkdmVydDsKKworICAgICAgICAgICAgICAgIGlmICh0cC0+bWlpX2FkdmVydGlzZSkKKyAgICAgICAgICAgICAgICAgICAgdG9fYWR2ZXJ0ID0gdHAtPm1paV9hZHZlcnRpc2U7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdKQorICAgICAgICAgICAgICAgICAgICB0b19hZHZlcnQgPSB0cC0+YWR2ZXJ0aXNpbmdbcGh5X2lkeF07CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogTGVhdmUgdW5jaGFuZ2VkLiAqLworICAgICAgICAgICAgICAgICAgICB0cC0+bWlpX2FkdmVydGlzZSA9IHRvX2FkdmVydCA9IG1paV9hZHZlcnQ7CisKKyAgICAgICAgICAgICAgICB0cC0+cGh5c1twaHlfaWR4KytdID0gcGh5OworICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICBNSUkgdHJhbnNjZWl2ZXIgJWQgY29uZmlnICVoWCBzdGF0dXMgJWhYIGFkdmVydGlzaW5nICVoWC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgcGh5LCBtaWlfcmVnMCwgbWlpX3N0YXR1cywgbWlpX2FkdmVydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeHVwIGZvciBETGluayB3aXRoIG1pc3dpcmVkIFBIWS4gKi8KKyAgICAgICAgICAgICAgICBpZiAobWlpX2FkdmVydCAhPSB0b19hZHZlcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogIEFkdmVydGlzaW5nICVoWCBvbiBQSFkgJWQgcHJldmlvdXNseSBhZHZlcnRpc2luZyAlaFguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCB0b19hZHZlcnQsIHBoeSwgbWlpX2FkdmVydCk7CisgICAgICAgICAgICAgICAgICAgIG1kaW9fd3JpdGUobmljLCBwaHksIDQsIHRvX2FkdmVydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgYXV0b25lZ290aWF0aW9uOiBzb21lIGJvYXJkcyBkZWZhdWx0IHRvIG9mZi4gKi8KKyAgICAgICAgICAgICAgICBtZGlvX3dyaXRlKG5pYywgcGh5LCAwLCBtaWlfcmVnMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAodHAtPmZ1bGxfZHVwbGV4ID8gMHgxMTAwIDogMHgxMDAwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdJk1lZGlhSXMxMDAgPyAweDIwMDA6MCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRwLT5taWlfY250ID0gcGh5X2lkeDsKKyAgICAgICAgaWYgKHRwLT5tdGFibGUgICYmICB0cC0+bXRhYmxlLT5oYXNfbWlpICAmJiAgcGh5X2lkeCA9PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIiVzOiAqKipXQVJOSU5HKioqOiBObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQhXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSk7CisgICAgICAgICAgICB0cC0+cGh5c1swXSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNldCB0aGUgeGN2ciBpbnRlcmZhY2UgYW5kIHR1cm4gb24gaGVhcnRiZWF0LiAqLworICAgIHN3aXRjaCAodHAtPmNoaXBfaWQpIHsKKyAgICBjYXNlIERDMjEwNDA6CisgICAgICAgIG91dGwoMHgwMDAwMDAwMCwgaW9hZGRyICsgQ1NSMTMpOworICAgICAgICBvdXRsKDB4MDAwMDAwMDQsIGlvYWRkciArIENTUjEzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEQzIxMDQxOgorICAgICAgICAvKiBUaGlzIGlzIG53YXlfc3RhcnQoKS4gKi8KKyAgICAgICAgaWYgKHRwLT5zeW1fYWR2ZXJ0aXNlID09IDApCisgICAgICAgICAgICB0cC0+c3ltX2FkdmVydGlzZSA9IDB4MDA2MTsKKyAgICAgICAgb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgIG91dGwoMHhGRkZGRkZGRiwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICBvdXRsKDB4MDAwMDAwMDgsIGlvYWRkciArIENTUjE1KTsgLyogTGlzdGVuIG9uIEFVSSBhbHNvLiAqLworICAgICAgICBvdXRsKGlubChpb2FkZHIgKyBDU1I2KSB8IDB4MDIwMCwgaW9hZGRyICsgQ1NSNik7CisgICAgICAgIG91dGwoMHgwMDAwRUYwMSwgaW9hZGRyICsgQ1NSMTMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERDMjExNDA6IGRlZmF1bHQ6CisgICAgICAgIGlmICh0cC0+bXRhYmxlKQorICAgICAgICAgICAgb3V0bCh0cC0+bXRhYmxlLT5jc3IxMmRpciB8IDB4MTAwLCBpb2FkZHIgKyBDU1IxMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREMyMTE0MjoKKyAgICBjYXNlIFBOSUMyOgorICAgICAgICBpZiAodHAtPm1paV9jbnQgIHx8ICBtZWRpYV9jYXBbdHAtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworICAgICAgICAgICAgb3V0bCgweDgyMDIwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgICAgICAgICAgIG91dGwoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICBvdXRsKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICAgICAgb3V0bCgweDgyMEUwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBud2F5X3N0YXJ0KG5pYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEM4MkMxNjg6CisgICAgICAgIGlmICggISB0cC0+bWlpX2NudCkgeworICAgICAgICAgICAgdHAtPm53YXkgPSAxOworICAgICAgICAgICAgdHAtPm53YXlzZXQgPSAwOworICAgICAgICAgICAgb3V0bCgweDAwNDIwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgICAgICAgICAgIG91dGwoMHgzMCwgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICAgICAgb3V0bCgweDAwMDFGMDc4LCBpb2FkZHIgKyAweEI4KTsKKyAgICAgICAgICAgIG91dGwoMHgwMjAxRjA3OCwgaW9hZGRyICsgMHhCOCk7IC8qIFR1cm4gb24gYXV0b25lZ290aWF0aW9uLiAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVg5ODcxMzogY2FzZSBDT01QRVg5ODgxOgorICAgICAgICBvdXRsKDB4MDAwMDAwMDAsIGlvYWRkciArIENTUjYpOworICAgICAgICBvdXRsKDB4MDAwNzExQzAsIGlvYWRkciArIENTUjE0KTsgLyogVHVybiBvbiBOV2F5LiAqLworICAgICAgICBvdXRsKDB4MDAwMDAwMDEsIGlvYWRkciArIENTUjEzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNWDk4NzE1OiBjYXNlIE1YOTg3MjU6CisgICAgICAgIG91dGwoMHgwMWE4MDAwMCwgaW9hZGRyICsgQ1NSNik7CisgICAgICAgIG91dGwoMHhGRkZGRkZGRiwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICBvdXRsKDB4MDAwMDEwMDAsIGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT01FVDoKKyAgICAgICAgLyogTm8gaW5pdGlhbGl6YXRpb24gbmVjZXNzYXJ5LiAqLworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG53YXlfc3RhcnQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworICAgIGludCBjc3IxNCA9ICgodHAtPnN5bV9hZHZlcnRpc2UgJiAweDA3ODApIDw8IDkpICB8CisgICAgICAgICgodHAtPnN5bV9hZHZlcnRpc2UmMHgwMDIwKTw8MSkgfCAweGZmYmY7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJud2F5X3N0YXJ0XG4iKTsKKyNlbmRpZgorCisgICAgdHAtPmlmX3BvcnQgPSAwOworICAgIHRwLT5ud2F5ID0gdHAtPm1lZGlhc2Vuc2UgPSAxOworICAgIHRwLT5ud2F5c2V0ID0gdHAtPmxwYXIgPSAwOworICAgIGlmICh0cC0+Y2hpcF9pZCA9PSBQTklDMikgeworICAgICAgICB0cC0+Y3NyNiA9IDB4MDEwMDAwMDAgfCAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAwNDAgPyAweDAyMDAgOiAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBUVUxJUF9ERUJVRworICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgIHByaW50ZigiJXM6IFJlc3RhcnRpbmcgaW50ZXJuYWwgTldheSBhdXRvbmVnb3RpYXRpb24sICVYLlxuIiwKKyAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgY3NyMTQpOworI2VuZGlmCisgICAgb3V0bCgweDAwMDEsIGlvYWRkciArIENTUjEzKTsKKyAgICBvdXRsKGNzcjE0LCBpb2FkZHIgKyBDU1IxNCk7CisgICAgdHAtPmNzcjYgPSAweDgyNDIwMDAwIHwgKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwMDQwID8gMHgwMjAwIDogMCk7CisgICAgb3V0bCh0cC0+Y3NyNiwgaW9hZGRyICsgQ1NSNik7CisgICAgaWYgKHRwLT5tdGFibGUgICYmICB0cC0+bXRhYmxlLT5jc3IxNWRpcikgeworICAgICAgICBvdXRsKHRwLT5tdGFibGUtPmNzcjE1ZGlyLCBpb2FkZHIgKyBDU1IxNSk7CisgICAgICAgIG91dGwodHAtPm10YWJsZS0+Y3NyMTV2YWwsIGlvYWRkciArIENTUjE1KTsKKyAgICB9IGVsc2UgaWYgKHRwLT5jaGlwX2lkICE9IFBOSUMyKQorICAgICAgICBvdXR3KDB4MDAwOCwgaW9hZGRyICsgQ1NSMTUpOworICAgIGlmICh0cC0+Y2hpcF9pZCA9PSBEQzIxMDQxKSAgICAgICAgICAgICAgICAgLyogVHJpZ2dlciBOV0FZLiAqLworICAgICAgICBvdXRsKDB4RUYwMSwgaW9hZGRyICsgQ1NSMTIpOworICAgIGVsc2UKKyAgICAgICAgb3V0bCgweDEzMDEsIGlvYWRkciArIENTUjEyKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9tZWRpYShzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgaW50IGk7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJpbml0X21lZGlhXG4iKTsKKyNlbmRpZgorCisgICAgdHAtPnNhdmVkX2lmX3BvcnQgPSB0cC0+aWZfcG9ydDsKKyAgICBpZiAodHAtPmlmX3BvcnQgPT0gMCkKKyAgICAgICAgdHAtPmlmX3BvcnQgPSB0cC0+ZGVmYXVsdF9wb3J0OworCisgICAgLyogQWxsb3cgc2VsZWN0aW5nIGEgZGVmYXVsdCBtZWRpYS4gKi8KKyAgICBpID0gMDsKKyAgICBpZiAodHAtPm10YWJsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG1lZGlhX3BpY2tlZDsKKyAgICBpZiAodHAtPmlmX3BvcnQpIHsKKyAgICAgICAgaW50IGxvb2tpbmdfZm9yID0gbWVkaWFfY2FwW3RwLT5pZl9wb3J0XSAmIE1lZGlhSXNNSUkgPyAxMSA6CisgICAgICAgICAgICAodHAtPmlmX3BvcnQgPT0gMTIgPyAwIDogdHAtPmlmX3BvcnQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHAtPm10YWJsZS0+bGVhZmNvdW50OyBpKyspCisgICAgICAgICAgICBpZiAodHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWEgPT0gbG9va2luZ19mb3IpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBVc2luZyB1c2VyLXNwZWNpZmllZCBtZWRpYSAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgbWVkaWFuYW1lW3RwLT5pZl9wb3J0XSk7CisgICAgICAgICAgICAgICAgZ290byBtZWRpYV9waWNrZWQ7CisgICAgICAgICAgICB9CisgICAgfQorICAgIGlmICgodHAtPm10YWJsZS0+ZGVmYXVsdG1lZGlhICYgMHgwODAwKSA9PSAwKSB7CisgICAgICAgIGludCBsb29raW5nX2ZvciA9IHRwLT5tdGFibGUtPmRlZmF1bHRtZWRpYSAmIDE1OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHAtPm10YWJsZS0+bGVhZmNvdW50OyBpKyspCisgICAgICAgICAgICBpZiAodHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWEgPT0gbG9va2luZ19mb3IpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBVc2luZyBFRVBST00tc2V0IG1lZGlhICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCBtZWRpYW5hbWVbbG9va2luZ19mb3JdKTsKKyAgICAgICAgICAgICAgICBnb3RvIG1lZGlhX3BpY2tlZDsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgLyogU3RhcnQgc2Vuc2luZyBmaXJzdCBub24tZnVsbC1kdXBsZXggbWVkaWEuICovCisgICAgZm9yIChpID0gdHAtPm10YWJsZS0+bGVhZmNvdW50IC0gMTsKKyAgICAgICAgIChtZWRpYV9jYXBbdHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWFdICYgTWVkaWFBbHdheXNGRCkgJiYgaSA+IDA7IGktLSkKKyAgICAgICAgOworIG1lZGlhX3BpY2tlZDoKKworICAgIHRwLT5jc3I2ID0gMDsKKyAgICB0cC0+Y3VyX2luZGV4ID0gaTsKKyAgICB0cC0+bndheXNldCA9IDA7CisKKyAgICBpZiAodHAtPmlmX3BvcnQpIHsKKyAgICAgICAgaWYgKHRwLT5jaGlwX2lkID09IERDMjExNDMgICYmICBtZWRpYV9jYXBbdHAtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworICAgICAgICAgICAgLyogV2UgbXVzdCByZXNldCB0aGUgbWVkaWEgQ1NScyB3aGVuIHdlIGZvcmNlLXNlbGVjdCBNSUkgbW9kZS4gKi8KKyAgICAgICAgICAgIG91dGwoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICBvdXRsKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICAgICAgb3V0bCgweDAwMDgsIGlvYWRkciArIENTUjE1KTsKKyAgICAgICAgfQorICAgICAgICBzZWxlY3RfbWVkaWEobmljLCAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2godHAtPmNoaXBfaWQpIHsKKyAgICBjYXNlIERDMjEwNDE6CisgICAgICAgIC8qIHRwLT5ud2F5ID0gMTsqLworICAgICAgICBud2F5X3N0YXJ0KG5pYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREMyMTE0MjoKKyAgICAgICAgaWYgKHRwLT5taWlfY250KSB7CisgICAgICAgICAgICBzZWxlY3RfbWVkaWEobmljLCAxKTsKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBVc2luZyBNSUkgdHJhbnNjZWl2ZXIgJWQsIHN0YXR1cyAlaFguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIHRwLT5waHlzWzBdLCBtZGlvX3JlYWQobmljLCB0cC0+cGh5c1swXSwgMSkpOworI2VuZGlmCisgICAgICAgICAgICBvdXRsKDB4ODIwMjAwMDAsIGlvYWRkciArIENTUjYpOworICAgICAgICAgICAgdHAtPmNzcjYgPSAweDgyMEUwMDAwOworICAgICAgICAgICAgdHAtPmlmX3BvcnQgPSAxMTsKKyAgICAgICAgICAgIG91dGwoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICBvdXRsKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG53YXlfc3RhcnQobmljKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQTklDMjoKKyAgICAgICAgbndheV9zdGFydChuaWMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExDODJDMTY4OgorICAgICAgICBpZiAodHAtPm1paV9jbnQpIHsKKyAgICAgICAgICAgIHRwLT5pZl9wb3J0ID0gMTE7CisgICAgICAgICAgICB0cC0+Y3NyNiA9IDB4ODE0QzAwMDAgfCAodHAtPmZ1bGxfZHVwbGV4ID8gMHgwMjAwIDogMCk7CisgICAgICAgICAgICBvdXRsKDB4MDAwMSwgaW9hZGRyICsgQ1NSMTUpOworICAgICAgICB9IGVsc2UgaWYgKGlubChpb2FkZHIgKyBDU1I1KSAmIFRQTG5rUGFzcykKKyAgICAgICAgICAgIHBuaWNfZG9fbndheShuaWMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFN0YXJ0IHdpdGggMTBtYnBzIHRvIGRvIGF1dG9uZWdvdGlhdGlvbi4gKi8KKyAgICAgICAgICAgIG91dGwoMHgzMiwgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICAgICAgdHAtPmNzcjYgPSAweDAwNDIwMDAwOworICAgICAgICAgICAgb3V0bCgweDAwMDFCMDc4LCBpb2FkZHIgKyAweEI4KTsKKyAgICAgICAgICAgIG91dGwoMHgwMjAxQjA3OCwgaW9hZGRyICsgMHhCOCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNWDk4NzEzOiBjYXNlIENPTVBFWDk4ODE6CisgICAgICAgIHRwLT5pZl9wb3J0ID0gMDsKKyAgICAgICAgdHAtPmNzcjYgPSAweDAxODgwMDAwIHwgKHRwLT5mdWxsX2R1cGxleCA/IDB4MDIwMCA6IDApOworICAgICAgICBvdXRsKDB4MGYzNzAwMDAgfCBpbncoaW9hZGRyICsgMHg4MCksIGlvYWRkciArIDB4ODApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1YOTg3MTU6IGNhc2UgTVg5ODcyNToKKyAgICAgICAgLyogUHJvdmlkZWQgYnkgQk9MTywgTWFjcm9uaXggLSAxMi8xMC8xOTk4LiAqLworICAgICAgICB0cC0+aWZfcG9ydCA9IDA7CisgICAgICAgIHRwLT5jc3I2ID0gMHgwMWE4MDIwMDsKKyAgICAgICAgb3V0bCgweDBmMzcwMDAwIHwgaW53KGlvYWRkciArIDB4ODApLCBpb2FkZHIgKyAweDgwKTsKKyAgICAgICAgb3V0bCgweDExMDAwIHwgaW53KGlvYWRkciArIDB4YTApLCBpb2FkZHIgKyAweGEwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT01FVDoKKyAgICAgICAgLyogRW5hYmxlIGF1dG9tYXRpYyBUeCB1bmRlcnJ1biByZWNvdmVyeSAqLworICAgICAgICBvdXRsKGlubChpb2FkZHIgKyAweDg4KSB8IDEsIGlvYWRkciArIDB4ODgpOworICAgICAgICB0cC0+aWZfcG9ydCA9IDA7CisJdHAtPmNzcjYgPSAweDAwMDQwMDAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFYODgxNDA6IGNhc2UgQVg4ODE0MToKKyAgICAgICAgdHAtPmNzcjYgPSB0cC0+bWlpX2NudCA/IDB4MDAwNDAxMDAgOiAweDAwMDAwMTAwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzZWxlY3RfbWVkaWEobmljLCAxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBuaWNfZG9fbndheShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisgICAgdTMyIHBoeV9yZWcgPSBpbmwoaW9hZGRyICsgMHhCOCk7CisgICAgdTMyIG5ld19jc3I2ID0gdHAtPmNzcjYgJiB+MHg0MEM0MDIwMDsKKworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCisgICAgd2hlcmVhbWkoInBuaWNfZG9fbndheVxuIik7CisjZW5kaWYKKworICAgIGlmIChwaHlfcmVnICYgMHg3ODAwMDAwMCkgeyAvKiBJZ25vcmUgYmFzZVQ0ICovCisgICAgICAgIGlmIChwaHlfcmVnICYgMHgyMDAwMDAwMCkgICAgICAgICAgICAgICB0cC0+aWZfcG9ydCA9IDU7CisgICAgICAgIGVsc2UgaWYgKHBoeV9yZWcgJiAweDQwMDAwMDAwKSAgdHAtPmlmX3BvcnQgPSAzOworICAgICAgICBlbHNlIGlmIChwaHlfcmVnICYgMHgxMDAwMDAwMCkgIHRwLT5pZl9wb3J0ID0gNDsKKyAgICAgICAgZWxzZSBpZiAocGh5X3JlZyAmIDB4MDgwMDAwMDApICB0cC0+aWZfcG9ydCA9IDA7CisgICAgICAgIHRwLT5ud2F5c2V0ID0gMTsKKyAgICAgICAgbmV3X2NzcjYgPSAodHAtPmlmX3BvcnQgJiAxKSA/IDB4MDE4NjAwMDAgOiAweDAwNDIwMDAwOworICAgICAgICBvdXRsKDB4MzIgfCAodHAtPmlmX3BvcnQgJiAxKSwgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICBpZiAodHAtPmlmX3BvcnQgJiAxKQorICAgICAgICAgICAgb3V0bCgweDFGODY4LCBpb2FkZHIgKyAweEI4KTsKKyAgICAgICAgaWYgKHBoeV9yZWcgJiAweDMwMDAwMDAwKSB7CisgICAgICAgICAgICB0cC0+ZnVsbF9kdXBsZXggPSAxOworICAgICAgICAgICAgbmV3X2NzcjYgfD0gMHgwMDAwMDIwMDsKKyAgICAgICAgfQorI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICBwcmludGYoIiVzOiBQTklDIGF1dG9uZWdvdGlhdGVkIHN0YXR1cyAlWCwgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgcGh5X3JlZywgbWVkaWFuYW1lW3RwLT5pZl9wb3J0XSk7CisjZW5kaWYKKyAgICAgICAgaWYgKHRwLT5jc3I2ICE9IG5ld19jc3I2KSB7CisgICAgICAgICAgICB0cC0+Y3NyNiA9IG5ld19jc3I2OworICAgICAgICAgICAgb3V0bCh0cC0+Y3NyNiB8IDB4MDAwMiwgaW9hZGRyICsgQ1NSNik7ICAgICAvKiBSZXN0YXJ0IFR4ICovCisgICAgICAgICAgICBvdXRsKHRwLT5jc3I2IHwgMHgyMDAyLCBpb2FkZHIgKyBDU1I2KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogU2V0IHVwIHRoZSB0cmFuc2NlaXZlciBjb250cm9sIHJlZ2lzdGVycyBmb3IgdGhlIHNlbGVjdGVkIG1lZGlhIHR5cGUuICovCitzdGF0aWMgdm9pZCBzZWxlY3RfbWVkaWEoc3RydWN0IG5pYyAqbmljLCBpbnQgc3RhcnR1cCkKK3sKKyAgICBzdHJ1Y3QgbWVkaWF0YWJsZSAqbXRhYmxlID0gdHAtPm10YWJsZTsKKyAgICB1MzIgbmV3X2NzcjY7CisgICAgaW50IGk7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJzZWxlY3RfbWVkaWFcbiIpOworI2VuZGlmCisKKyAgICBpZiAobXRhYmxlKSB7CisgICAgICAgIHN0cnVjdCBtZWRpYWxlYWYgKm1sZWFmID0gJm10YWJsZS0+bWxlYWZbdHAtPmN1cl9pbmRleF07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBtbGVhZi0+bGVhZmRhdGE7CisgICAgICAgIHN3aXRjaCAobWxlYWYtPnR5cGUpIHsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxMTQwIG5vbi1NSUkgeGN2ci4gKi8KKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBVc2luZyBhIDIxMTQwIG5vbi1NSUkgdHJhbnNjZWl2ZXIiCisgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBjb250cm9sIHNldHRpbmcgJWhoWC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgcFsxXSk7CisjZW5kaWYKKyAgICAgICAgICAgIHRwLT5pZl9wb3J0ID0gcFswXTsKKyAgICAgICAgICAgIGlmIChzdGFydHVwKQorICAgICAgICAgICAgICAgIG91dGwobXRhYmxlLT5jc3IxMmRpciB8IDB4MTAwLCBpb2FkZHIgKyBDU1IxMik7CisgICAgICAgICAgICBvdXRsKHBbMV0sIGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgICAgIG5ld19jc3I2ID0gMHgwMjAwMDAwMCB8ICgocFsyXSAmIDB4NzEpIDw8IDE4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IGNhc2UgNDogeworICAgICAgICAgICAgdTE2IHNldHVwWzVdOworICAgICAgICAgICAgdTMyIGNzcjEzdmFsLCBjc3IxNHZhbCwgY3NyMTVkaXIsIGNzcjE1dmFsOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICBzZXR1cFtpXSA9IGdldF91MTYoJnBbaSoyICsgMV0pOworCisgICAgICAgICAgICB0cC0+aWZfcG9ydCA9IHBbMF0gJiAxNTsKKyAgICAgICAgICAgIGlmIChtZWRpYV9jYXBbdHAtPmlmX3BvcnRdICYgTWVkaWFBbHdheXNGRCkKKyAgICAgICAgICAgICAgICB0cC0+ZnVsbF9kdXBsZXggPSAxOworCisgICAgICAgICAgICBpZiAoc3RhcnR1cCAmJiBtdGFibGUtPmhhc19yZXNldCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBtZWRpYWxlYWYgKnJsZWFmID0gJm10YWJsZS0+bWxlYWZbbXRhYmxlLT5oYXNfcmVzZXRdOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnJzdCA9IHJsZWFmLT5sZWFmZGF0YTsKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICAgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IFJlc2V0dGluZyB0aGUgdHJhbnNjZWl2ZXIuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByc3RbMF07IGkrKykKKyAgICAgICAgICAgICAgICAgICAgb3V0bChnZXRfdTE2KHJzdCArIDEgKyAoaTw8MSkpIDw8IDE2LCBpb2FkZHIgKyBDU1IxNSk7CisgICAgICAgICAgICB9CisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogMjExNDMgbm9uLU1JSSAlcyB0cmFuc2NlaXZlciBjb250cm9sICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiVoWC8laFguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIG1lZGlhbmFtZVt0cC0+aWZfcG9ydF0sIHNldHVwWzBdLCBzZXR1cFsxXSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChwWzBdICYgMHg0MCkgeyAgLyogU0lBIChDU1IxMy0xNSkgc2V0dXAgdmFsdWVzIGFyZSBwcm92aWRlZC4gKi8KKyAgICAgICAgICAgICAgICBjc3IxM3ZhbCA9IHNldHVwWzBdOworICAgICAgICAgICAgICAgIGNzcjE0dmFsID0gc2V0dXBbMV07CisgICAgICAgICAgICAgICAgY3NyMTVkaXIgPSAoc2V0dXBbM108PDE2KSB8IHNldHVwWzJdOworICAgICAgICAgICAgICAgIGNzcjE1dmFsID0gKHNldHVwWzRdPDwxNikgfCBzZXR1cFsyXTsKKyAgICAgICAgICAgICAgICBvdXRsKDAsIGlvYWRkciArIENTUjEzKTsKKyAgICAgICAgICAgICAgICBvdXRsKGNzcjE0dmFsLCBpb2FkZHIgKyBDU1IxNCk7CisgICAgICAgICAgICAgICAgb3V0bChjc3IxNWRpciwgaW9hZGRyICsgQ1NSMTUpOyAvKiBEaXJlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBvdXRsKGNzcjE1dmFsLCBpb2FkZHIgKyBDU1IxNSk7IC8qIERhdGEgKi8KKyAgICAgICAgICAgICAgICBvdXRsKGNzcjEzdmFsLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNzcjEzdmFsID0gMTsKKyAgICAgICAgICAgICAgICBjc3IxNHZhbCA9IDB4MDAwM0ZGN0Y7CisgICAgICAgICAgICAgICAgY3NyMTVkaXIgPSAoc2V0dXBbMF08PDE2KSB8IDB4MDAwODsKKyAgICAgICAgICAgICAgICBjc3IxNXZhbCA9IChzZXR1cFsxXTw8MTYpIHwgMHgwMDA4OworICAgICAgICAgICAgICAgIGlmICh0cC0+aWZfcG9ydCA8PSA0KQorICAgICAgICAgICAgICAgICAgICBjc3IxNHZhbCA9IHQyMTE0Ml9jc3IxNFt0cC0+aWZfcG9ydF07CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0dXApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0bCgwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICAgICAgICAgIG91dGwoY3NyMTR2YWwsIGlvYWRkciArIENTUjE0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0bChjc3IxNWRpciwgaW9hZGRyICsgQ1NSMTUpOyAvKiBEaXJlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBvdXRsKGNzcjE1dmFsLCBpb2FkZHIgKyBDU1IxNSk7IC8qIERhdGEgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnR1cCkgb3V0bChjc3IxM3ZhbCwgaW9hZGRyICsgQ1NSMTMpOworICAgICAgICAgICAgfQorI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICBTZXR0aW5nIENTUjE1IHRvICVYLyVYLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCBjc3IxNWRpciwgY3NyMTV2YWwpOworI2VuZGlmCisgICAgICAgICAgICBpZiAobWxlYWYtPnR5cGUgPT0gNCkKKyAgICAgICAgICAgICAgICBuZXdfY3NyNiA9IDB4ODIwMjAwMDAgfCAoKHNldHVwWzJdICYgMHg3MSkgPDwgMTgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5ld19jc3I2ID0gMHg4MjQyMDAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMTogY2FzZSAzOiB7CisgICAgICAgICAgICBpbnQgcGh5X251bSA9IHBbMF07CisgICAgICAgICAgICBpbnQgaW5pdF9sZW5ndGggPSBwWzFdOworICAgICAgICAgICAgdTE2ICptaXNjX2luZm87CisKKyAgICAgICAgICAgIHRwLT5pZl9wb3J0ID0gMTE7CisgICAgICAgICAgICBuZXdfY3NyNiA9IDB4MDIwRTAwMDA7CisgICAgICAgICAgICBpZiAobWxlYWYtPnR5cGUgPT0gMykgeyAgICAgLyogMjExNDIgKi8KKyAgICAgICAgICAgICAgICB1MTYgKmluaXRfc2VxdWVuY2UgPSAodTE2KikocCsyKTsKKyAgICAgICAgICAgICAgICB1MTYgKnJlc2V0X3NlcXVlbmNlID0gJigodTE2KikocCszKSlbaW5pdF9sZW5ndGhdOworICAgICAgICAgICAgICAgIGludCByZXNldF9sZW5ndGggPSBwWzIgKyBpbml0X2xlbmd0aCoyXTsKKyAgICAgICAgICAgICAgICBtaXNjX2luZm8gPSByZXNldF9zZXF1ZW5jZSArIHJlc2V0X2xlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnR1cCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlc2V0X2xlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0bChnZXRfdTE2KCZyZXNldF9zZXF1ZW5jZVtpXSkgPDwgMTYsIGlvYWRkciArIENTUjE1KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5pdF9sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgb3V0bChnZXRfdTE2KCZpbml0X3NlcXVlbmNlW2ldKSA8PCAxNiwgaW9hZGRyICsgQ1NSMTUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1OCAqaW5pdF9zZXF1ZW5jZSA9IHAgKyAyOworICAgICAgICAgICAgICAgIHU4ICpyZXNldF9zZXF1ZW5jZSA9IHAgKyAzICsgaW5pdF9sZW5ndGg7CisgICAgICAgICAgICAgICAgaW50IHJlc2V0X2xlbmd0aCA9IHBbMiArIGluaXRfbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBtaXNjX2luZm8gPSAodTE2KikocmVzZXRfc2VxdWVuY2UgKyByZXNldF9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChzdGFydHVwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dGwobXRhYmxlLT5jc3IxMmRpciB8IDB4MTAwLCBpb2FkZHIgKyBDU1IxMik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXNldF9sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGwocmVzZXRfc2VxdWVuY2VbaV0sIGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluaXRfbGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIG91dGwoaW5pdF9zZXF1ZW5jZVtpXSwgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHAtPmFkdmVydGlzaW5nW3BoeV9udW1dID0gZ2V0X3UxNigmbWlzY19pbmZvWzFdKSB8IDE7CisgICAgICAgICAgICBpZiAoc3RhcnR1cCA8IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAodHAtPm1paV9hZHZlcnRpc2UgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdHAtPm1paV9hZHZlcnRpc2UgPSB0cC0+YWR2ZXJ0aXNpbmdbcGh5X251bV07CisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzOiAgQWR2ZXJ0aXNpbmcgJWhYIG9uIE1JSSAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIHRwLT5taWlfYWR2ZXJ0aXNlLCB0cC0+cGh5c1twaHlfbnVtXSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBtZGlvX3dyaXRlKG5pYywgdHAtPnBoeXNbcGh5X251bV0sIDQsIHRwLT5taWlfYWR2ZXJ0aXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIiVzOiAgSW52YWxpZCBtZWRpYSB0YWJsZSBzZWxlY3Rpb24gJWQuXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgbWxlYWYtPnR5cGUpOworICAgICAgICAgICAgbmV3X2NzcjYgPSAweDAyMEUwMDAwOworICAgICAgICB9CisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKyAgICAgICAgICAgIHByaW50ZigiJXM6IFVzaW5nIG1lZGlhIHR5cGUgJXMsIENTUjEyIGlzICVoaFguXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgbWVkaWFuYW1lW3RwLT5pZl9wb3J0XSwKKyAgICAgICAgICAgICAgICAgICBpbmwoaW9hZGRyICsgQ1NSMTIpICYgMHhmZik7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IERDMjEwNDEpIHsKKyAgICAgICAgaW50IHBvcnQgPSB0cC0+aWZfcG9ydCA8PSA0ID8gdHAtPmlmX3BvcnQgOiAwOworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICBwcmludGYoIiVzOiAyMTA0MSB1c2luZyBtZWRpYSAlcywgQ1NSMTIgaXMgJWhYLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIG1lZGlhbmFtZVtwb3J0ID09IDMgPyAxMjogcG9ydF0sCisgICAgICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIENTUjEyKSk7CisjZW5kaWYKKyAgICAgICAgb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1IxMyk7IC8qIFJlc2V0IHRoZSBzZXJpYWwgaW50ZXJmYWNlICovCisgICAgICAgIG91dGwodDIxMDQxX2NzcjE0W3BvcnRdLCBpb2FkZHIgKyBDU1IxNCk7CisgICAgICAgIG91dGwodDIxMDQxX2NzcjE1W3BvcnRdLCBpb2FkZHIgKyBDU1IxNSk7CisgICAgICAgIG91dGwodDIxMDQxX2NzcjEzW3BvcnRdLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgIG5ld19jc3I2ID0gMHg4MDAyMDAwMDsKKyAgICB9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IExDODJDMTY4KSB7CisgICAgICAgIGlmIChzdGFydHVwICYmICEgdHAtPm1lZGlhbG9jaykKKyAgICAgICAgICAgIHRwLT5pZl9wb3J0ID0gdHAtPm1paV9jbnQgPyAxMSA6IDA7CisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkgICAgcHJpbnRmKCIlczogUE5JQyBQSFkgc3RhdHVzIGlzICVoWCwgbWVkaWEgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgaW5sKGlvYWRkciArIDB4QjgpLCBtZWRpYW5hbWVbdHAtPmlmX3BvcnRdKTsKKyNlbmRpZgorICAgICAgICBpZiAodHAtPm1paV9jbnQpIHsKKyAgICAgICAgICAgIG5ld19jc3I2ID0gMHg4MTBDMDAwMDsKKyAgICAgICAgICAgIG91dGwoMHgwMDAxLCBpb2FkZHIgKyBDU1IxNSk7CisgICAgICAgICAgICBvdXRsKDB4MDIwMUIwN0EsIGlvYWRkciArIDB4QjgpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0dXApIHsKKyAgICAgICAgICAgIC8qIFN0YXJ0IHdpdGggMTBtYnBzIHRvIGRvIGF1dG9uZWdvdGlhdGlvbi4gKi8KKyAgICAgICAgICAgIG91dGwoMHgzMiwgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICAgICAgbmV3X2NzcjYgPSAweDAwNDIwMDAwOworICAgICAgICAgICAgb3V0bCgweDAwMDFCMDc4LCBpb2FkZHIgKyAweEI4KTsKKyAgICAgICAgICAgIG91dGwoMHgwMjAxQjA3OCwgaW9hZGRyICsgMHhCOCk7CisgICAgICAgIH0gZWxzZSBpZiAodHAtPmlmX3BvcnQgPT0gMyAgfHwgIHRwLT5pZl9wb3J0ID09IDUpIHsKKyAgICAgICAgICAgIG91dGwoMHgzMywgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICAgICAgbmV3X2NzcjYgPSAweDAxODYwMDAwOworICAgICAgICAgICAgLyogVHJpZ2dlciBhdXRvbmVnb3RpYXRpb24uICovCisgICAgICAgICAgICBvdXRsKHN0YXJ0dXAgPyAweDAyMDFGODY4IDogMHgwMDAxRjg2OCwgaW9hZGRyICsgMHhCOCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRsKDB4MzIsIGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgICAgIG5ld19jc3I2ID0gMHgwMDQyMDAwMDsKKyAgICAgICAgICAgIG91dGwoMHgxRjA3OCwgaW9hZGRyICsgMHhCOCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IERDMjEwNDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjEwNDAgKi8KKyAgICAgICAgLyogVHVybiBvbiB0aGUgeGN2ciBpbnRlcmZhY2UuICovCisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgaW50IGNzcjEyID0gaW5sKGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKyAgICAgICAgICAgIHByaW50ZigiJXM6IDIxMDQwIG1lZGlhIHR5cGUgaXMgJXMsIENTUjEyIGlzICVoaFguXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgbWVkaWFuYW1lW3RwLT5pZl9wb3J0XSwgY3NyMTIpOworI2VuZGlmCisgICAgICAgIGlmIChtZWRpYV9jYXBbdHAtPmlmX3BvcnRdICYgTWVkaWFBbHdheXNGRCkKKyAgICAgICAgICAgIHRwLT5mdWxsX2R1cGxleCA9IDE7CisgICAgICAgIG5ld19jc3I2ID0gMHgyMDAwMDsKKyAgICAgICAgLyogU2V0IHRoZSBmdWxsIGR1cGx1eCBtYXRjaCBmcmFtZS4gKi8KKyAgICAgICAgb3V0bChGVUxMX0RVUExFWF9NQUdJQywgaW9hZGRyICsgQ1NSMTEpOworICAgICAgICBvdXRsKDB4MDAwMDAwMDAsIGlvYWRkciArIENTUjEzKTsgLyogUmVzZXQgdGhlIHNlcmlhbCBpbnRlcmZhY2UgKi8KKyAgICAgICAgaWYgKHQyMTA0MF9jc3IxM1t0cC0+aWZfcG9ydF0gJiA4KSB7CisgICAgICAgICAgICBvdXRsKDB4MDcwNSwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICAgICAgb3V0bCgweDAwMDYsIGlvYWRkciArIENTUjE1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dGwoMHhmZmZmLCBpb2FkZHIgKyBDU1IxNCk7CisgICAgICAgICAgICBvdXRsKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTUpOworICAgICAgICB9CisgICAgICAgIG91dGwoMHg4ZjAxIHwgdDIxMDQwX2NzcjEzW3RwLT5pZl9wb3J0XSwgaW9hZGRyICsgQ1NSMTMpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5rbm93biBjaGlwIHR5cGUgd2l0aCBubyBtZWRpYSB0YWJsZS4gKi8KKyAgICAgICAgaWYgKHRwLT5kZWZhdWx0X3BvcnQgPT0gMCkKKyAgICAgICAgICAgIHRwLT5pZl9wb3J0ID0gdHAtPm1paV9jbnQgPyAxMSA6IDM7CisgICAgICAgIGlmIChtZWRpYV9jYXBbdHAtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworICAgICAgICAgICAgbmV3X2NzcjYgPSAweDAyMEUwMDAwOworICAgICAgICB9IGVsc2UgaWYgKG1lZGlhX2NhcFt0cC0+aWZfcG9ydF0gJiBNZWRpYUlzRngpIHsKKyAgICAgICAgICAgIG5ld19jc3I2ID0gMHgwMjg2MDAwMDA7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbmV3X2NzcjYgPSAweDAzODYwMDAwMDsKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorICAgICAgICAgICAgcHJpbnRmKCIlczogTm8gbWVkaWEgZGVzY3JpcHRpb24gdGFibGUsIGFzc3VtaW5nICIKKyAgICAgICAgICAgICAgICAgICAiJXMgdHJhbnNjZWl2ZXIsIENTUjEyICVoaFguXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgbWVkaWFuYW1lW3RwLT5pZl9wb3J0XSwKKyAgICAgICAgICAgICAgICAgICBpbmwoaW9hZGRyICsgQ1NSMTIpKTsKKyNlbmRpZgorICAgIH0KKworICAgIHRwLT5jc3I2ID0gbmV3X2NzcjYgfCAodHAtPmNzcjYgJiAweGZkZmYpIHwgKHRwLT5mdWxsX2R1cGxleCA/IDB4MDIwMCA6IDApOworICAgIHJldHVybjsKK30KKworLyoKKyAgQ2hlY2sgdGhlIE1JSSBuZWdvdGlhdGVkIGR1cGxleCBhbmQgY2hhbmdlIHRoZSBDU1I2IHNldHRpbmcgaWYKKyAgcmVxdWlyZWQuCisgIFJldHVybiAwIGlmIGV2ZXJ5dGhpbmcgaXMgT0suCisgIFJldHVybiA8IDAgaWYgdGhlIHRyYW5zY2VpdmVyIGlzIG1pc3Npbmcgb3IgaGFzIG5vIGxpbmsgYmVhdC4KKyovCitzdGF0aWMgaW50IHR1bGlwX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgICAgIHVuc2lnbmVkIGludCBibXNyLCBscGEsIG5lZ290aWF0ZWQsIG5ld19jc3I2OworCisgICAgICAgIGJtc3IgPSBtZGlvX3JlYWQobmljLCB0cC0+cGh5c1swXSwgMSk7CisgICAgICAgIGxwYSA9IG1kaW9fcmVhZChuaWMsIHRwLT5waHlzWzBdLCA1KTsKKworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogTUlJIHN0YXR1cyAlI3gsIExpbmsgcGFydG5lciByZXBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUjeC5cbiIsIHRwLT5uaWNfbmFtZSwgYm1zciwgbHBhKTsKKyNlbmRpZgorCisgICAgICAgIGlmIChibXNyID09IDB4ZmZmZikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGlmICgoYm1zciAmIDQpID09IDApIHsgCisgICAgICAgICAgICAgICAgaW50IG5ld19ibXNyID0gbWRpb19yZWFkKG5pYywgdHAtPnBoeXNbMF0sIDEpOyAKKyAgICAgICAgICAgICAgICBpZiAoKG5ld19ibXNyICYgNCkgPT0gMCkgeyAKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnICA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IE5vIGxpbmsgYmVhdCBvbiB0aGUgTUlJIGludGVyZmFjZSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdGF0dXMgJSN4LlxuIiwgdHAtPm5pY19uYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYm1zcik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHAtPmZ1bGxfZHVwbGV4ID0gbHBhICYgMHgxNDA7CisKKyAgICAgICAgbmV3X2NzcjYgPSB0cC0+Y3NyNjsKKyAgICAgICAgbmVnb3RpYXRlZCA9IGxwYSAmIHRwLT5hZHZlcnRpc2luZ1swXTsKKworICAgICAgICBpZihuZWdvdGlhdGVkICYgMHgzODApIG5ld19jc3I2ICY9IH4weDQwMDAwMDsgCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgbmV3X2NzcjYgfD0gMHg0MDAwMDA7CisgICAgICAgIGlmICh0cC0+ZnVsbF9kdXBsZXgpICAgbmV3X2NzcjYgfD0gMHgyMDA7IAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgIG5ld19jc3I2ICY9IH4weDIwMDsKKworICAgICAgICBpZiAobmV3X2NzcjYgIT0gdHAtPmNzcjYpIHsKKyAgICAgICAgICAgICAgICB0cC0+Y3NyNiA9IG5ld19jc3I2OworCisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogU2V0dGluZyAlcy1kdXBsZXggYmFzZWQgb24gTUlJIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyVkIGxpbmsgcGFydG5lciBjYXBhYmlsaXR5IG9mICUjeC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5mdWxsX2R1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnBoeXNbMF0sIGxwYSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdHVsaXBfbmljc1tdID0geworUENJX1JPTSgweDEwMTEsIDB4MDAwMiwgImRjMjEwNDAiLCAgICAgIkRpZ2l0YWwgVHVsaXAiLCAwKSwKK1BDSV9ST00oMHgxMDExLCAweDAwMDksICJkczIxMTQwIiwgICAgICJEaWdpdGFsIFR1bGlwIEZhc3QiLCAwKSwKK1BDSV9ST00oMHgxMDExLCAweDAwMTQsICJkYzIxMDQxIiwgICAgICJEaWdpdGFsIFR1bGlwKyIsIDApLAorUENJX1JPTSgweDEwMTEsIDB4MDAxOSwgImRzMjExNDIiLCAgICAgIkRpZ2l0YWwgVHVsaXAgMjExNDIiLCAwKSwKK1BDSV9ST00oMHgxMGI3LCAweDkzMDAsICIzY3NvaG8xMDBiLXR4IiwiM0NvbVNPSE8xMDBCLVRYIiwgMCksCitQQ0lfUk9NKDB4MTBiOSwgMHg1MjYxLCAiYWxpMTU2MyIsICAgICAiQUxpIDE1NjMgaW50ZWdyYXRlZCBldGhlcm5ldCIsIDApLAorUENJX1JPTSgweDEwZDksIDB4MDUxMiwgIm14OTg3MTMiLCAgICAgIk1hY3Jvbml4IE1YOTg3eDMiLCAwKSwKK1BDSV9ST00oMHgxMGQ5LCAweDA1MzEsICJteDk4NzE1IiwgICAgICJNYWNyb25peCBNWDk4N3g1IiwgMCksCitQQ0lfUk9NKDB4MTExMywgMHgxMjE3LCAibXhpYy05ODcxNSIsICAiTWFjcm9uaXggTVg5ODd4NSIsIDApLAorUENJX1JPTSgweDExYWQsIDB4YzExNSwgImxjODJjMTE1IiwgICAgIkxpbmtTeXMgTE5FMTAwVFgiLCAwKSwKK1BDSV9ST00oMHgxMWFkLCAweDAwMDIsICI4MmMxNjgiLCAgICAgICJOZXRnZWFyIEZBMzEwVFgiLCAwKSwKK1BDSV9ST00oMHgxMjgyLCAweDkxMDAsICJkbTkxMDAiLCAgICAgICJEYXZpY29tIDkxMDAiLCAwKSwKK1BDSV9ST00oMHgxMjgyLCAweDkxMDIsICJkbTkxMDIiLCAgICAgICJEYXZpY29tIDkxMDIiLCAwKSwKK1BDSV9ST00oMHgxMjgyLCAweDkwMDksICJkbTkwMDkiLCAgICAgICJEYXZpY29tIDkwMDkiLCAwKSwKK1BDSV9ST00oMHgxMjgyLCAweDkxMzIsICJkbTkxMzIiLCAgICAgICJEYXZpY29tIDkxMzIiLCAwKSwKK1BDSV9ST00oMHgxMzE3LCAweDA5ODUsICJjZW50YXVyLXAiLCAgICJBRE10ZWsgQ2VudGF1ci1QIiwgMCksCitQQ0lfUk9NKDB4MTMxNywgMHgwOTgxLCAiYW45ODEiLCAgICAgICAiQURNdGVrIEFOOTgxIENvbWV0IiwgMCksCQkvKiBBRE1UZWsgQ2VudGF1ci1QIChzdG1pY3JvKSAqLworUENJX1JPTSgweDExMTMsIDB4MTIxNiwgImFuOTgzIiwgICAgICAgIkFETVRlayBBTjk4MyBDb21ldCIsIDApLAorUENJX1JPTSgweDEzMTcsIDB4OTUxMSwgImFuOTgzYiIsICAgICAgIkFETVRlayBDb21ldCA5ODNiIiwgMCksCitQQ0lfUk9NKDB4MTMxNywgMHgxOTg1LCAiY2VudGF1ci1jIiwgICAiQURNVGVrIENlbnRhdXItQyIsIDApLAorUENJX1JPTSgweDgwODYsIDB4MDAzOSwgImludGVsMjExNDUiLCAgIkludGVsIFR1bGlwIiwgMCksCitQQ0lfUk9NKDB4MTI1YiwgMHgxNDAwLCAiYXg4ODE0MCIsICAgICAiQVNJWCBBWDg4MTQwIiwgMCksCitQQ0lfUk9NKDB4MTFmNiwgMHg5ODgxLCAicmwxMDB0eCIsICAgICAiQ29tcGV4IFJMMTAwLVRYIiwgMCksCitQQ0lfUk9NKDB4MTE1ZCwgMHgwMDAzLCAieGlyY29tdHVsaXAiLCAiWGlyY29tIFR1bGlwIiwgMCksCitQQ0lfUk9NKDB4MTA0YSwgMHgwOTgxLCAidHVsaXAtMDk4MSIsICAiVHVsaXAgMHgxMDRhIDB4MDk4MSIsIDApLAorUENJX1JPTSgweDEwNGEsIDB4Mjc3NCwgIlNHVGhvbXNvbi1TVEUxMDEwMEEiLCAiVHVsaXAgMHgxMDRhIDB4Mjc3NCIsIDApLAkvKk1vZGlmaWVkIGJ5IFJhbWVzaCBDaGFuZGVyKi8KK1BDSV9ST00oMHgxMTEzLCAweDk1MTEsICJ0dWxpcC05NTExIiwgICJUdWxpcCAweDExMTMgMHg5NTExIiwgMCksCitQQ0lfUk9NKDB4MTE4NiwgMHgxNTYxLCAidHVsaXAtMTU2MSIsICAiVHVsaXAgMHgxMTg2IDB4MTU2MSIsIDApLAorUENJX1JPTSgweDEyNTksIDB4YTEyMCwgInR1bGlwLWExMjAiLCAgIlR1bGlwIDB4MTI1OSAweGExMjAiLCAwKSwKK1BDSV9ST00oMHgxM2QxLCAweGFiMDIsICJ0dWxpcC1hYjAyIiwgICJUdWxpcCAweDEzZDEgMHhhYjAyIiwgMCksCitQQ0lfUk9NKDB4MTNkMSwgMHhhYjAzLCAidHVsaXAtYWIwMyIsICAiVHVsaXAgMHgxM2QxIDB4YWIwMyIsIDApLAorUENJX1JPTSgweDEzZDEsIDB4YWIwOCwgInR1bGlwLWFiMDgiLCAgIlR1bGlwIDB4MTNkMSAweGFiMDgiLCAwKSwKK1BDSV9ST00oMHgxNGYxLCAweDE4MDMsICJsYW5maW5pdHkiLCAgICJDb25leGFudCBMQU5maW5pdHkiLCAwKSwKK1BDSV9ST00oMHgxNjI2LCAweDg0MTAsICJ0dWxpcC04NDEwIiwgICJUdWxpcCAweDE2MjYgMHg4NDEwIiwgMCksCitQQ0lfUk9NKDB4MTczNywgMHhhYjA4LCAidHVsaXAtMTczNy1hYjA4IiwiVHVsaXAgMHgxNzM3IDB4YWIwOCIsIDApLAorUENJX1JPTSgweDE3MzcsIDB4YWIwOSwgInR1bGlwLWFiMDkiLCAgIlR1bGlwIDB4MTczNyAweGFiMDkiLCAwKSwKK307CisKK1BDSV9EUklWRVIgKCB0dWxpcF9kcml2ZXIsIHR1bGlwX25pY3MsIFBDSV9OT19DTEFTUyApOworCitEUklWRVIgKCAiVHVsaXAiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCB0dWxpcF9kcml2ZXIsCisJIHR1bGlwX3Byb2JlLCB0dWxpcF9kaXNhYmxlICk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC90dWxpcC50eHQgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC90dWxpcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmNjc1NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3R1bGlwLnR4dApAQCAtMCwwICsxLDU0IEBACitUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCit0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworVGhpcyBpcyBhIHR1bGlwIGFuZCBjbG9uZSBkcml2ZXIgZm9yIEV0aGVyYm9vdC4gIFNlZSB0aGUgcmV2aXNpb24KK2hpc3RvcnkgaW4gdGhlIHR1bGlwLmMgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gY2hhbmdlcy4gIFRoaXMgdmVyc2lvbgorb2YgdGhlIGRyaXZlciBpbmNvcnBvcmF0ZXMgY2hhbmdlcyBmcm9tIEJvYiBFZHdhcmRzIGFuZCBQYXVsIE1hY2tlcnJhcword2hvIGNhbnRyaWJ1dGVkIGNoYW5nZXMgdG8gc3VwcG9ydCB0aGUgVFJFTkRuZXQgVEUxMDAtUENJQSBOSUMgd2hpY2gKK3VzZXMgYSBnZW51aW5lIEludGVsIDIxMTQzLVBEIGNoaXBzZXQuICBUaGVyZSBhcmUgYWxzbyB2YXJpb3VzIGNvZGUKK2NsZWFudXBzIHRvIG1ha2UgdGltZS1iYXNlZCBhY3Rpdml0aWVzIG1vcmUgcmVsaWFibGUuCisKK09mIGNvdXJzZSB5b3UgaGF2ZSB0byBoYXZlIGFsbCB0aGUgdXN1YWwgRXRoZXJib290IGVudmlyb25tZW50CisoYm9vdHAvZGhjcC9ORlMpIHNldCB1cCwgYW5kIHlvdSBuZWVkIGEgTGludXgga2VybmVsIHdpdGggdjAuOTFnCisoNy4xNi45OSkgb3IgbGF0ZXIgb2YgdGhlIHR1bGlwLmMgZHJpdmVyIGNvbXBpbGVkIGluIHRvIHN1cHBvcnQgc29tZQorTVg5ODcxNSBiYXNlZCBjYXJkcy4gIFRoYXQgZmlsZSBpcyBhdmFpbGFibGUgYXQ6CisKKyAgaHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L2RyaXZlcnMvdGVzdC90dWxpcC5jCisKK05PVEVTCisKK0kndmUgdGVzdGVkIHRoaXMgZHJpdmVyIHdpdGggYSBTT0hPd2FyZSBGYXN0IDEwLzEwMCBNb2RlbCBTREExMTBBLAorYSBMaW5rc3lzIExORTEwMFRYIHYyLjAsIGFuZCBhIE5ldGdlYXIgRkEzMTBUWCBjYXJkLCBhbmQgaXQgd29ya2VkIGF0Citib3RoIDEwIGFuZCAxMDAgbWJpdHMuIE90aGVyIGNhcmRzIGJhc2VkIG9uIHRoZSB0dWxpcCBmYW1pbHkgbWF5IHdvcmsgYXMKK3dlbGwuCisKK1RoZXNlIGNhcmRzIGFyZSBhYm91dCAyMCRVUywgYXJlIHN1cHBvcnRlZCBieSBMaW51eCBhbmQgbm93IEV0aGVyYm9vdCwKK2FuZCBiZWluZyBQQ0ksIHRoZXkgYXV0by1jb25maWd1cmUgSVJRIGFuZCBJT0FERFIgYW5kIGF1dG8tbmVnb3RpYXRlCisxMC8xMDAgaGFsZi9mdWxsIGR1cGxleC4gSXQgc2VlbXMgbGlrZSBhIHByZXR0eSBnb29kIHZhbHVlIGNvbXBhcmVkIHRvCitzb21lIG9mIHRoZSBwcmljaWVyIGNhcmRzLCBhbmQgY2FuIGxvd2VyIHRoZSBjb3N0IG9mIGJ1aWxkaW5nL2FkYXB0aW5nCit0aGluIGNsaWVudCB3b3Jrc3RhdGlvbnMgc3Vic3RhbnRpYWxseSB3aGlsZSBnaXZpbmcgYSBjb25zaWRlcmFibGUKK3BlcmZvcm1hbmNlIGluY3JlYXNlLgorCitPbiBzb21lIFBDSSB0dWxpcCBjbG9uZSBjaGlwc2V0cyAoTVg5ODd4NSwgTEM4MkMxMTUsIExDODJDMTY4KSB0aGlzIGRyaXZlciAKK2xldHMgdGhlIGNhcmQgY2hvb3NlIHRoZSBmYXN0ZXN0IHNwZWVkIGl0IGNhbiBuZWdvdGlhdGUgd2l0aCB0aGUgcGVlcgorZGV2aWNlLiAgT24gb3RoZXIgY2FyZHMsIGl0IGNob29zZXMgMTBtYml0IGhhbGYtZHVwbGV4LgorCitJIGJ1cm5lZCBhbiBBTTI3QzI1NiAoMzJLQnl0ZSkgRVBST00gd2l0aCBteDk4N3g1Lmx6cm9tIGFuZCBpdCB3b3JrZWQuCitBY2NvcmRpbmcgdG8gdGhlIGRhdGEgc2hlZXQgdGhlIE1YOTg3MTVBIHN1cHBvcnRzIHVwIHRvIDY0SyAoMjdDNTEyKQorRVBST01zLCAKKworSSd2ZSBsaWJlcmFsbHkgY29tbWVudGVkIHRoZSBjb2RlIGFuZCBoZWFkZXIgZmlsZXMgaW4gdGhlIGhvcGUgdGhhdCBpdAord2lsbCBoZWxwIHRoZSBuZXh0IHBlcnNvbiB3aG8gaGFja3MgdGhlIGNvZGUgb3IgbmVlZHMgdG8gc3VwcG9ydCBzb21lCit0dWxpcCBjbG9uZSBjYXJkLCBvciB3aXNoZXMgdG8gYWRkIGZ1bmN0aW9uYWxpdHkuCisKK0FueXdheSwgcGxlYXNlIHRlc3QgdGhpcyBpZiB5b3UgY2FuIG9uIHlvdXIgdHVsaXAgYmFzZWQgY2FyZCwgYW5kIGxldAorbWUgKG1kY0BldGhlcmJvb3Qub3JnKSBhbmQgdGhlIEV0aGVyYm9vdC1EaXNjdXNzIGxpc3QKKyhldGhlcmJvb3QtZGlzY3Vzc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQpIGtub3cgaG93IHRoaW5ncyBnby4gIEkgYWxzbword291bGQgYXBwcmVjaWF0ZSBjb2RlIHJldmlldyBieSBwZW9wbGUgd2hvIHByb2dyYW0uICBJJ20gYSBzdHJvbmcKK2JlbGlldmVyIGluICJhbm90aGVyIHNldCBvZiBleWVzIi4KKworUmVnYXJkcywKKworTWFydHkgQ29ubm9yCittZGNAZXRoZXJib290Lm9yZworaHR0cDovL3d3dy5ldGhlcmJvb3Qub3JnLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC92aWEtcmhpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU2MjMwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKQEAgLTAsMCArMSwxNDQ3IEBACisvKiByaGluZS5jOkZhc3QgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisJQWRhcHRlZCAwOS1qYW4tMjAwMCBieSBQYW9sbyBNYXJpbmkgKHBhb2xvbUBwcmlzbWEtZW5nLml0KQorCisgICAgICAgIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBhbHNvIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdCByZXRhaW4KKwl0aGlzIGF1dGhvcnNoaXAgYW5kIGNvcHlyaWdodCBub3RpY2UuCisKKwlVbmRlciBubyBjaXJjdW1zdGFuY2VzIGFyZSB0aGUgYXV0aG9ycyByZXNwb25zaWJsZSBmb3IKKwl0aGUgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoaXMgc29mdHdhcmUsIG5vciBkbyB0aGUgYXV0aG9ycyBhc3N1bWUgYW55CisJcmVzcG9uc2liaWxpdHkgZm9yIGRhbWFnZXMgaW5jdXJyZWQgd2l0aCBpdHMgdXNlLgorCisJVGhpcyBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSBWSUEgVlQ4NkMxMDBBIFJoaW5lLUlJIFBDSSBGYXN0IEV0aGVybmV0CisJY29udHJvbGxlci4KKworKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPSAicmhpbmUuYyB2MS4wLjIgMjAwNC0xMC0yOVxuIjsKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLiAqLworCisvLyBtYXggdGltZSBvdXQgZGVsYXkgdGltZQorI2RlZmluZSBXX01BWF9USU1FT1VUCTB4MEZGRlUKKworLyogU2l6ZSBvZiB0aGUgaW4tbWVtb3J5IHJlY2VpdmUgcmluZy4gKi8KKyNkZWZpbmUgUlhfQlVGX0xFTl9JRFgJMwkvKiAwPT04SywgMT09MTZLLCAyPT0zMkssIDM9PTY0SyAqLworI2RlZmluZSBSWF9CVUZfTEVOICg4MTkyIDw8IFJYX0JVRl9MRU5fSURYKQorCisvKiBTaXplIG9mIHRoZSBUeCBib3VuY2UgYnVmZmVycyAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4gKi8KKyNkZWZpbmUgVFhfQlVGX1NJWkUJMTUzNgorI2RlZmluZSBSWF9CVUZfU0laRQkxNTM2CisKKy8qIFBDSSBUdW5pbmcgUGFyYW1ldGVycworICAgVGhyZXNob2xkIGlzIGJ5dGVzIHRyYW5zZmVycmVkIHRvIGNoaXAgYmVmb3JlIHRyYW5zbWlzc2lvbiBzdGFydHMuICovCisjZGVmaW5lIFRYX0ZJRk9fVEhSRVNIIDI1NgkvKiBJbiBieXRlcywgcm91bmRlZCBkb3duIHRvIDMyIGJ5dGUgdW5pdHMuICovCisKKy8qIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIGxvZ18yKGJ5dGVzKS00OiAgMCA9PSAxNiBieXRlcyAuLiA2PT0xMDI0LiAqLworI2RlZmluZSBSWF9GSUZPX1RIUkVTSAk0CS8qIFJ4IGJ1ZmZlciBsZXZlbCBiZWZvcmUgZmlyc3QgUENJIHhmZXIuICAqLworI2RlZmluZSBSWF9ETUFfQlVSU1QJNAkvKiBNYXhpbXVtIFBDSSBidXJzdCwgJzQnIGlzIDI1NiBieXRlcyAqLworI2RlZmluZSBUWF9ETUFfQlVSU1QJNAorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICgoMjAwMCpIWikvMTAwMCkKKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorCisvKiBkZWZpbmUgYWxsIGlvYWRkciAqLworCisjZGVmaW5lIGJ5UEFSMAkJCQlpb2FkZHIKKyNkZWZpbmUgYnlSQ1IJCQkJaW9hZGRyICsgNgorI2RlZmluZSBieVRDUgkJCQlpb2FkZHIgKyA3CisjZGVmaW5lIGJ5Q1IwCQkJCWlvYWRkciArIDgKKyNkZWZpbmUgYnlDUjEJCQkJaW9hZGRyICsgOQorI2RlZmluZSBieUlTUjAJCQkJaW9hZGRyICsgMHgwYworI2RlZmluZSBieUlTUjEJCQkJaW9hZGRyICsgMHgwZAorI2RlZmluZSBieUlNUjAJCQkJaW9hZGRyICsgMHgwZQorI2RlZmluZSBieUlNUjEJCQkJaW9hZGRyICsgMHgwZgorI2RlZmluZSBieU1BUjAJCQkJaW9hZGRyICsgMHgxMAorI2RlZmluZSBieU1BUjEJCQkJaW9hZGRyICsgMHgxMQorI2RlZmluZSBieU1BUjIJCQkJaW9hZGRyICsgMHgxMgorI2RlZmluZSBieU1BUjMJCQkJaW9hZGRyICsgMHgxMworI2RlZmluZSBieU1BUjQJCQkJaW9hZGRyICsgMHgxNAorI2RlZmluZSBieU1BUjUJCQkJaW9hZGRyICsgMHgxNQorI2RlZmluZSBieU1BUjYJCQkJaW9hZGRyICsgMHgxNgorI2RlZmluZSBieU1BUjcJCQkJaW9hZGRyICsgMHgxNworI2RlZmluZSBkd0N1cnJlbnRSeERlc2NBZGRyCQlpb2FkZHIgKyAweDE4CisjZGVmaW5lIGR3Q3VycmVudFR4RGVzY0FkZHIJCWlvYWRkciArIDB4MWMKKyNkZWZpbmUgZHdDdXJyZW50UkRTRTAJCQlpb2FkZHIgKyAweDIwCisjZGVmaW5lIGR3Q3VycmVudFJEU0UxCQkJaW9hZGRyICsgMHgyNAorI2RlZmluZSBkd0N1cnJlbnRSRFNFMgkJCWlvYWRkciArIDB4MjgKKyNkZWZpbmUgZHdDdXJyZW50UkRTRTMJCQlpb2FkZHIgKyAweDJjCisjZGVmaW5lIGR3TmV4dFJEU0UwCQkJaW9hZGRyICsgMHgzMAorI2RlZmluZSBkd05leHRSRFNFMQkJCWlvYWRkciArIDB4MzQKKyNkZWZpbmUgZHdOZXh0UkRTRTIJCQlpb2FkZHIgKyAweDM4CisjZGVmaW5lIGR3TmV4dFJEU0UzCQkJaW9hZGRyICsgMHgzYworI2RlZmluZSBkd0N1cnJlbnRURFNFMAkJCWlvYWRkciArIDB4NDAKKyNkZWZpbmUgZHdDdXJyZW50VERTRTEJCQlpb2FkZHIgKyAweDQ0CisjZGVmaW5lIGR3Q3VycmVudFREU0UyCQkJaW9hZGRyICsgMHg0OAorI2RlZmluZSBkd0N1cnJlbnRURFNFMwkJCWlvYWRkciArIDB4NGMKKyNkZWZpbmUgZHdOZXh0VERTRTAJCQlpb2FkZHIgKyAweDUwCisjZGVmaW5lIGR3TmV4dFREU0UxCQkJaW9hZGRyICsgMHg1NAorI2RlZmluZSBkd05leHRURFNFMgkJCWlvYWRkciArIDB4NTgKKyNkZWZpbmUgZHdOZXh0VERTRTMJCQlpb2FkZHIgKyAweDVjCisjZGVmaW5lIGR3Q3VyclJ4RE1BUHRyCQkJaW9hZGRyICsgMHg2MAorI2RlZmluZSBkd0N1cnJUeERNQVB0cgkJCWlvYWRkciArIDB4NjQKKyNkZWZpbmUgYnlNUEhZCQkJCWlvYWRkciArIDB4NmMKKyNkZWZpbmUgYnlNSUlTUgkJCQlpb2FkZHIgKyAweDZkCisjZGVmaW5lIGJ5QkNSMAkJCQlpb2FkZHIgKyAweDZlCisjZGVmaW5lIGJ5QkNSMQkJCQlpb2FkZHIgKyAweDZmCisjZGVmaW5lIGJ5TUlJQ1IJCQkJaW9hZGRyICsgMHg3MAorI2RlZmluZSBieU1JSUFECQkJCWlvYWRkciArIDB4NzEKKyNkZWZpbmUgd01JSURBVEEJCQlpb2FkZHIgKyAweDcyCisjZGVmaW5lIGJ5RUVDU1IJCQkJaW9hZGRyICsgMHg3NAorI2RlZmluZSBieVRFU1QJCQkJaW9hZGRyICsgMHg3NQorI2RlZmluZSBieUdQSU8JCQkJaW9hZGRyICsgMHg3NgorI2RlZmluZSBieUNGR0EJCQkJaW9hZGRyICsgMHg3OAorI2RlZmluZSBieUNGR0IJCQkJaW9hZGRyICsgMHg3OQorI2RlZmluZSBieUNGR0MJCQkJaW9hZGRyICsgMHg3YQorI2RlZmluZSBieUNGR0QJCQkJaW9hZGRyICsgMHg3YgorI2RlZmluZSB3VGFsbHlDbnRNUEEJCQlpb2FkZHIgKyAweDdjCisjZGVmaW5lIHdUYWxseUNudENSQwkJCWlvYWRkciArIDB4N2QKKyNkZWZpbmUgYnlTVElDS0hXCQkJaW9hZGRyICsgMHg4MworI2RlZmluZSBieVdPTGNyQ2xyCQkJaW9hZGRyICsgMHhBNAorI2RlZmluZSBieVdPTGNnQ2xyCQkJaW9hZGRyICsgMHhBNworI2RlZmluZSBieVB3cmNzckNscgkJCWlvYWRkciArIDB4QUMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4aW9hZGRyIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQml0cyBpbiB0aGUgUkNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSQ1JfUlJGVDIJCTB4ODAKKyNkZWZpbmUgUkNSX1JSRlQxCQkweDQwCisjZGVmaW5lIFJDUl9SUkZUMAkJMHgyMAorI2RlZmluZSBSQ1JfUFJPTQkJMHgxMAorI2RlZmluZSBSQ1JfQUIJCQkweDA4CisjZGVmaW5lIFJDUl9BTQkJCTB4MDQKKyNkZWZpbmUgUkNSX0FSCQkJMHgwMgorI2RlZmluZSBSQ1JfU0VQCQkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgVENSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBUQ1JfUlRTRgkJMHg4MAorI2RlZmluZSBUQ1JfUlRGVDEJCTB4NDAKKyNkZWZpbmUgVENSX1JURlQwCQkweDIwCisjZGVmaW5lIFRDUl9PRlNFVAkJMHgwOAorI2RlZmluZSBUQ1JfTEIxCQkJMHgwNAkvKiBsb29wYmFja1sxXSAqLworI2RlZmluZSBUQ1JfTEIwCQkJMHgwMgkvKiBsb29wYmFja1swXSAqLworCisvKgorICogQml0cyBpbiB0aGUgQ1IwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDUjBfUkRNRAkJMHg0MAkvKiByeCBkZXNjcmlwdG9yIHBvbGxpbmcgZGVtYW5kICovCisjZGVmaW5lIENSMF9URE1ECQkweDIwCS8qIHR4IGRlc2NyaXB0b3IgcG9sbGluZyBkZW1hbmQgKi8KKyNkZWZpbmUgQ1IwX1RYT04JCTB4MTAKKyNkZWZpbmUgQ1IwX1JYT04JCTB4MDgKKyNkZWZpbmUgQ1IwX1NUT1AJCTB4MDQJLyogc3RvcCBOSUMsIGRlZmF1bHQgPSAxICovCisjZGVmaW5lIENSMF9TVFJUCQkweDAyCS8qIHN0YXJ0IE5JQyAqLworI2RlZmluZSBDUjBfSU5JVAkJMHgwMQkvKiBzdGFydCBpbml0IHByb2Nlc3MgKi8KKworCisvKgorICogQml0cyBpbiB0aGUgQ1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDUjFfU0ZSU1QJCTB4ODAJLyogc29mdHdhcmUgcmVzZXQgKi8KKyNkZWZpbmUgQ1IxX1JETUQxCQkweDQwCS8qIFJETUQxICovCisjZGVmaW5lIENSMV9URE1EMQkJMHgyMAkvKiBURE1EMSAqLworI2RlZmluZSBDUjFfS0VZUEFHCQkweDEwCS8qIHR1cm4gb24gcGFyL2tleSAqLworI2RlZmluZSBDUjFfRFBPTEwJCTB4MDgJLyogZGlzYWJsZSByeC90eCBhdXRvIHBvbGxpbmcgKi8KKyNkZWZpbmUgQ1IxX0ZEWAkJCTB4MDQJLyogZnVsbCBkdXBsZXggbW9kZSAqLworI2RlZmluZSBDUjFfRVRFTgkJMHgwMgkvKiBlYXJseSB0eCBtb2RlICovCisjZGVmaW5lIENSMV9FUkVOCQkweDAxCS8qIGVhcmx5IHJ4IG1vZGUgKi8KKworLyoKKyAqIEJpdHMgaW4gdGhlIENSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDUl9SRE1ECQkJMHgwMDQwCS8qIHJ4IGRlc2NyaXB0b3IgcG9sbGluZyBkZW1hbmQgKi8KKyNkZWZpbmUgQ1JfVERNRAkJCTB4MDAyMAkvKiB0eCBkZXNjcmlwdG9yIHBvbGxpbmcgZGVtYW5kICovCisjZGVmaW5lIENSX1RYT04JCQkweDAwMTAKKyNkZWZpbmUgQ1JfUlhPTgkJCTB4MDAwOAorI2RlZmluZSBDUl9TVE9QCQkJMHgwMDA0CS8qIHN0b3AgTklDLCBkZWZhdWx0ID0gMSAqLworI2RlZmluZSBDUl9TVFJUCQkJMHgwMDAyCS8qIHN0YXJ0IE5JQyAqLworI2RlZmluZSBDUl9JTklUCQkJMHgwMDAxCS8qIHN0YXJ0IGluaXQgcHJvY2VzcyAqLworI2RlZmluZSBDUl9TRlJTVAkJMHg4MDAwCS8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIENSX1JETUQxCQkweDQwMDAJLyogUkRNRDEgKi8KKyNkZWZpbmUgQ1JfVERNRDEJCTB4MjAwMAkvKiBURE1EMSAqLworI2RlZmluZSBDUl9LRVlQQUcJCTB4MTAwMAkvKiB0dXJuIG9uIHBhci9rZXkgKi8KKyNkZWZpbmUgQ1JfRFBPTEwJCTB4MDgwMAkvKiBkaXNhYmxlIHJ4L3R4IGF1dG8gcG9sbGluZyAqLworI2RlZmluZSBDUl9GRFgJCQkweDA0MDAJLyogZnVsbCBkdXBsZXggbW9kZSAqLworI2RlZmluZSBDUl9FVEVOCQkJMHgwMjAwCS8qIGVhcmx5IHR4IG1vZGUgKi8KKyNkZWZpbmUgQ1JfRVJFTgkJCTB4MDEwMAkvKiBlYXJseSByeCBtb2RlICovCisKKy8qCisgKiBCaXRzIGluIHRoZSBJTVIwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBJTVIwX0NOVE0JCTB4ODAKKyNkZWZpbmUgSU1SMF9CRU0JCTB4NDAKKyNkZWZpbmUgSU1SMF9SVU0JCTB4MjAKKyNkZWZpbmUgSU1SMF9UVU0JCTB4MTAKKyNkZWZpbmUgSU1SMF9UWEVNCQkweDA4CisjZGVmaW5lIElNUjBfUlhFTQkJMHgwNAorI2RlZmluZSBJTVIwX1BUWE0JCTB4MDIKKyNkZWZpbmUgSU1SMF9QUlhNCQkweDAxCisKKy8qIGRlZmluZSBpbXJzaGFkb3cgKi8KKworI2RlZmluZSBJTVJTaGFkb3cJCTB4NUFGRgorCisvKgorICogQml0cyBpbiB0aGUgSU1SMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgSU1SMV9JTklUTQkJMHg4MAorI2RlZmluZSBJTVIxX1NSQ00JCTB4NDAKKyNkZWZpbmUgSU1SMV9OQkZNCQkweDEwCisjZGVmaW5lIElNUjFfUFJBSU0JCTB4MDgKKyNkZWZpbmUgSU1SMV9SRVMwTQkJMHgwNAorI2RlZmluZSBJTVIxX0VUTQkJMHgwMgorI2RlZmluZSBJTVIxX0VSTQkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgSVNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBJU1JfSU5JVEkJCTB4ODAwMAorI2RlZmluZSBJU1JfU1JDSQkJMHg0MDAwCisjZGVmaW5lIElTUl9BQlRJCQkweDIwMDAKKyNkZWZpbmUgSVNSX05PUkJGCQkweDEwMDAKKyNkZWZpbmUgSVNSX1BLVFJBCQkweDA4MDAKKyNkZWZpbmUgSVNSX1JFUzAJCTB4MDQwMAorI2RlZmluZSBJU1JfRVRJCQkJMHgwMjAwCisjZGVmaW5lIElTUl9FUkkJCQkweDAxMDAKKyNkZWZpbmUgSVNSX0NOVAkJCTB4MDA4MAorI2RlZmluZSBJU1JfQkUJCQkweDAwNDAKKyNkZWZpbmUgSVNSX1JVCQkJMHgwMDIwCisjZGVmaW5lIElTUl9UVQkJCTB4MDAxMAorI2RlZmluZSBJU1JfVFhFCQkJMHgwMDA4CisjZGVmaW5lIElTUl9SWEUJCQkweDAwMDQKKyNkZWZpbmUgSVNSX1BUWAkJCTB4MDAwMgorI2RlZmluZSBJU1JfUFJYCQkJMHgwMDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBJU1IwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBJU1IwX0NOVAkJMHg4MAorI2RlZmluZSBJU1IwX0JFCQkJMHg0MAorI2RlZmluZSBJU1IwX1JVCQkJMHgyMAorI2RlZmluZSBJU1IwX1RVCQkJMHgxMAorI2RlZmluZSBJU1IwX1RYRQkJMHgwOAorI2RlZmluZSBJU1IwX1JYRQkJMHgwNAorI2RlZmluZSBJU1IwX1BUWAkJMHgwMgorI2RlZmluZSBJU1IwX1BSWAkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgSVNSMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgSVNSMV9JTklUSQkJMHg4MAorI2RlZmluZSBJU1IxX1NSQ0kJCTB4NDAKKyNkZWZpbmUgSVNSMV9OT1JCRgkJMHgxMAorI2RlZmluZSBJU1IxX1BLVFJBCQkweDA4CisjZGVmaW5lIElTUjFfRVRJCQkweDAyCisjZGVmaW5lIElTUjFfRVJJCQkweDAxCisKKy8qIElTUiBBQk5PUk1BTCBDT05ESVRJT04gKi8KKworI2RlZmluZSBJU1JfQUJOT1JNQUwgSVNSX0JFK0lTUl9SVStJU1JfVFUrSVNSX0NOVCtJU1JfTk9SQkYrSVNSX1BLVFJBCisKKy8qCisgKiBCaXRzIGluIHRoZSBNSUlTUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJU1JfTUlJRVJSCQkweDA4CisjZGVmaW5lIE1JSVNSX01SRVJSCQkweDA0CisjZGVmaW5lIE1JSVNSX0xOS0ZMCQkweDAyCisjZGVmaW5lIE1JSVNSX1NQRUVECQkweDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBNSUlDUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJQ1JfTUFVVE8JCTB4ODAKKyNkZWZpbmUgTUlJQ1JfUkNNRAkJMHg0MAorI2RlZmluZSBNSUlDUl9XQ01ECQkweDIwCisjZGVmaW5lIE1JSUNSX01EUE0JCTB4MTAKKyNkZWZpbmUgTUlJQ1JfTU9VVAkJMHgwOAorI2RlZmluZSBNSUlDUl9NRE8JCTB4MDQKKyNkZWZpbmUgTUlJQ1JfTURJCQkweDAyCisjZGVmaW5lIE1JSUNSX01EQwkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgRUVDU1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIEVFQ1NSX0VFUFIJCTB4ODAJLyogZWVwcm9tIHByb2dyYW1lZCBzdGF0dXMsIDczaCBtZWFucyBwcm9ncmFtZWQgKi8KKyNkZWZpbmUgRUVDU1JfRU1CUAkJMHg0MAkvKiBlZXByb20gZW1iZWRlZCBwcm9ncmFtbWluZyAqLworI2RlZmluZSBFRUNTUl9BVVRPTEQJCTB4MjAJLyogZWVwcm9tIGNvbnRlbnQgcmVsb2FkICovCisjZGVmaW5lIEVFQ1NSX0RQTQkJMHgxMAkvKiBlZXByb20gZGlyZWN0IHByb2dyYW1taW5nICovCisjZGVmaW5lIEVFQ1NSX0NTCQkweDA4CS8qIGVlcHJvbSBDUyBwaW4gKi8KKyNkZWZpbmUgRUVDU1JfU0sJCTB4MDQJLyogZWVwcm9tIFNLIHBpbiAqLworI2RlZmluZSBFRUNTUl9ESQkJMHgwMgkvKiBlZXByb20gREkgcGluICovCisjZGVmaW5lIEVFQ1NSX0RPCQkweDAxCS8qIGVlcHJvbSBETyBwaW4gKi8KKworLyoKKyAqIEJpdHMgaW4gdGhlIEJDUjAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIEJDUjBfQ1JGVDIJCTB4MjAKKyNkZWZpbmUgQkNSMF9DUkZUMQkJMHgxMAorI2RlZmluZSBCQ1IwX0NSRlQwCQkweDA4CisjZGVmaW5lIEJDUjBfRE1BTDIJCTB4MDQKKyNkZWZpbmUgQkNSMF9ETUFMMQkJMHgwMgorI2RlZmluZSBCQ1IwX0RNQUwwCQkweDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBCQ1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBCQ1IxX0NUU0YJCTB4MjAKKyNkZWZpbmUgQkNSMV9DVEZUMQkJMHgxMAorI2RlZmluZSBCQ1IxX0NURlQwCQkweDA4CisjZGVmaW5lIEJDUjFfUE9UMgkJMHgwNAorI2RlZmluZSBCQ1IxX1BPVDEJCTB4MDIKKyNkZWZpbmUgQkNSMV9QT1QwCQkweDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBDRkdBIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdBX0VFTE9BRAkJMHg4MAkvKiBlbmFibGUgZWVwcm9tIGVtYmVkZWQgYW5kIGRpcmVjdCBwcm9ncmFtbWluZyAqLworI2RlZmluZSBDRkdBX0pVTVBFUgkJMHg0MAorI2RlZmluZSBDRkdBX01UR1BJTwkJMHgwOAorI2RlZmluZSBDRkdBX1QxMEVOCQkweDAyCisjZGVmaW5lIENGR0FfQVVUTwkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgQ0ZHQiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHQl9QRAkJCTB4ODAKKyNkZWZpbmUgQ0ZHQl9QT0xFTgkJMHgwMgorI2RlZmluZSBDRkdCX0xOS0VOCQkweDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBDRkdDIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdDX00xMFRJTwkJMHg4MAorI2RlZmluZSBDRkdDX00xMFBPTAkJMHg0MAorI2RlZmluZSBDRkdDX1BIWTEJCTB4MjAKKyNkZWZpbmUgQ0ZHQ19QSFkwCQkweDEwCisjZGVmaW5lIENGR0NfQlRTRUwJCTB4MDgKKyNkZWZpbmUgQ0ZHQ19CUFMyCQkweDA0CS8qIGJvb3Ryb20gc2VsZWN0WzJdICovCisjZGVmaW5lIENGR0NfQlBTMQkJMHgwMgkvKiBib290cm9tIHNlbGVjdFsxXSAqLworI2RlZmluZSBDRkdDX0JQUzAJCTB4MDEJLyogYm9vdHJvbSBzZWxlY3RbMF0gKi8KKworLyoKKyAqIEJpdHMgaW4gdGhlIENGR0QgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENGR0RfR1BJT0VOCQkweDgwCisjZGVmaW5lIENGR0RfRElBRwkJMHg0MAorI2RlZmluZSBDRkdEX01BR0lDCQkweDEwCisjZGVmaW5lIENGR0RfUkFORE9NCQkweDA4CisjZGVmaW5lIENGR0RfQ0ZEWAkJMHgwNAorI2RlZmluZSBDRkdEX0NFUkVOCQkweDAyCisjZGVmaW5lIENGR0RfQ0VURU4JCTB4MDEKKworLyogQml0cyBpbiBSU1IgKi8KKyNkZWZpbmUgUlNSX1JFUlIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUlNSX0NSQwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUlNSX0ZBRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUlNSX0ZPVgkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUlNSX0xPTkcJCTB4MDAwMDAwMTAKKyNkZWZpbmUgUlNSX1JVTlQJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUlNSX1NFUlIJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUlNSX0JVRkYJCTB4MDAwMDAwODAKKyNkZWZpbmUgUlNSX0VEUAkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgUlNSX1NUUAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgUlNSX0NITgkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgUlNSX1BIWQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgUlNSX0JBUgkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgUlNSX01BUgkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgUlNSX1JYT0sJCTB4MDAwMDgwMDAKKyNkZWZpbmUgUlNSX0FCTk9STUFMCQlSU1JfUkVSUitSU1JfTE9ORytSU1JfUlVOVAorCisvKiBCaXRzIGluIFRTUiAqLworI2RlZmluZSBUU1JfTkNSMAkJMHgwMDAwMDAwMQorI2RlZmluZSBUU1JfTkNSMQkJMHgwMDAwMDAwMgorI2RlZmluZSBUU1JfTkNSMgkJMHgwMDAwMDAwNAorI2RlZmluZSBUU1JfTkNSMwkJMHgwMDAwMDAwOAorI2RlZmluZSBUU1JfQ09MUwkJMHgwMDAwMDAxMAorI2RlZmluZSBUU1JfQ0RICQkJMHgwMDAwMDA4MAorI2RlZmluZSBUU1JfQUJUCQkJMHgwMDAwMDEwMAorI2RlZmluZSBUU1JfT1dDCQkJMHgwMDAwMDIwMAorI2RlZmluZSBUU1JfQ1JTCQkJMHgwMDAwMDQwMAorI2RlZmluZSBUU1JfVURGCQkJMHgwMDAwMDgwMAorI2RlZmluZSBUU1JfVEJVRkYJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFNSX1NFUlIJCTB4MDAwMDIwMDAKKyNkZWZpbmUgVFNSX0pBQgkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgVFNSX1RFUlIJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVFNSX0FCTk9STUFMCQlUU1JfVEVSUitUU1JfT1dDK1RTUl9BQlQrVFNSX0pBQitUU1JfQ1JTCisjZGVmaW5lIFRTUl9PV05fQklUCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgQ0JfREVMQVlfTE9PUF9XQUlUCTEwCS8qIDEwbXMgKi8KKy8qIGVuYWJsZWQgbWFzayB2YWx1ZSBvZiBpcnEgKi8KKworI2RlZmluZSBXX0lNUl9NQVNLX1ZBTFVFCTB4MUJGRgkvKiBpbml0aWFsIHZhbHVlIG9mIElNUiAqLworCisvKiBFdGhlcm5ldCBhZGRyZXNzIGZpbHRlciB0eXBlICovCisjZGVmaW5lIFBLVF9UWVBFX0RJUkVDVEVECTB4MDAwMQkvKiBvYnNvbGV0ZSwgZGlyZWN0ZWQgYWRkcmVzcyBpcyBhbHdheXMgYWNjZXB0ZWQgKi8KKyNkZWZpbmUgUEtUX1RZUEVfTVVMVElDQVNUCTB4MDAwMgorI2RlZmluZSBQS1RfVFlQRV9BTExfTVVMVElDQVNUCTB4MDAwNAorI2RlZmluZSBQS1RfVFlQRV9CUk9BRENBU1QJMHgwMDA4CisjZGVmaW5lIFBLVF9UWVBFX1BST01JU0NVT1VTCTB4MDAyMAorI2RlZmluZSBQS1RfVFlQRV9MT05HCQkweDIwMDAKKyNkZWZpbmUgUEtUX1RZUEVfUlVOVAkJMHg0MDAwCisjZGVmaW5lIFBLVF9UWVBFX0VSUk9SCQkweDgwMDAJLyogYWNjZXB0IGVycm9yIHBhY2tldHMsIGUuZy4gQ1JDIGVycm9yICovCisKKy8qIExvb3BiYWNrIG1vZGUgKi8KKworI2RlZmluZSBOSUNfTEJfTk9ORQkJMHgwMAorI2RlZmluZSBOSUNfTEJfSU5URVJOQUwJCTB4MDEKKyNkZWZpbmUgTklDX0xCX1BIWQkJMHgwMgkvKiBNSUkgb3IgSW50ZXJuYWwtMTBCYXNlVCBsb29wYmFjayAqLworCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJMgorI2RlZmluZSBSWF9SSU5HX1NJWkUJCTIKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4gKi8KKworI2RlZmluZSBQQ0lfUkVHX01PREUzCQkweDUzCisjZGVmaW5lIE1PREUzX01JSU9OCQkweDA0ICAgIC8qIGluIFBDSV9SRUdfTU9EMyBPRiBQQ0kgc3BhY2UgKi8KKworZW51bSByaGluZV9yZXZzIHsKKyAgICBWVDg2QzEwMEEgICAgICAgPSAweDAwLAorICAgIFZUdW5rbm93bjAgICAgICA9IDB4MjAsCisgICAgVlQ2MTAyICAgICAgICAgID0gMHg0MCwKKyAgICBWVDgyMzEgICAgICAgICAgPSAweDUwLCAvKiBJbnRlZ3JhdGVkIE1BQyAqLworICAgIFZUODIzMyAgICAgICAgICA9IDB4NjAsIC8qIEludGVncmF0ZWQgTUFDICovCisgICAgVlQ4MjM1ICAgICAgICAgID0gMHg3NCwgLyogSW50ZWdyYXRlZCBNQUMgKi8KKyAgICBWVDgyMzcgICAgICAgICAgPSAweDc4LCAvKiBJbnRlZ3JhdGVkIE1BQyAqLworICAgIFZUdW5rbm93bjEgICAgICA9IDB4N0MsCisgICAgVlQ2MTA1ICAgICAgICAgID0gMHg4MCwKKyAgICBWVDYxMDVfQjAgICAgICAgPSAweDgzLAorICAgIFZUNjEwNUwgCSAgICA9IDB4OEEsCisgICAgVlQ2MTA3ICAgICAgICAgID0gMHg4QywKKyAgICBWVHVua25vd24yICAgICAgPSAweDhFLAorICAgIFZUNjEwNU0gICAgICAgICA9IDB4OTAsCit9OworCisvKiBUcmFuc21pdCBhbmQgcmVjZWl2ZSBkZXNjcmlwdG9ycyBkZWZpbml0aW9uICovCisKK3N0cnVjdCByaGluZV90eF9kZXNjCit7CisgICAgdW5pb24gVlRDX3R4X3N0YXR1c190YWcKKyAgICB7CisJc3RydWN0CisJeworCSAgICB1bnNpZ25lZCBsb25nIG5jcm86MTsKKwkgICAgdW5zaWduZWQgbG9uZyBuY3IxOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgbmNyMjoxOworCSAgICB1bnNpZ25lZCBsb25nIG5jcjM6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBjb2xzOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZV8xOjI7CisJICAgIHVuc2lnbmVkIGxvbmcgY2RoOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgYWJ0OjE7CisJICAgIHVuc2lnbmVkIGxvbmcgb3djOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgY3JzOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgdWRmOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgdGJ1ZmY6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBzZXJyOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgamFiOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgdGVycjoxOworCSAgICB1bnNpZ25lZCBsb25nIHJlc2VydmVfMjoxNTsKKwkgICAgdW5zaWduZWQgbG9uZyBvd25fYml0OjE7CisJfQorCWJpdHM7CisJdW5zaWduZWQgbG9uZyBsdzsKKyAgICB9CisgICAgdHhfc3RhdHVzOworCisgICAgdW5pb24gVlRDX3R4X2N0cmxfdGFnCisgICAgeworCXN0cnVjdAorCXsKKwkgICAgdW5zaWduZWQgbG9uZyB0eF9idWZfc2l6ZToxMTsKKwkgICAgdW5zaWduZWQgbG9uZyBleHRlbmRfdHhfYnVmX3NpemU6NDsKKwkgICAgdW5zaWduZWQgbG9uZyBjaG46MTsKKwkgICAgdW5zaWduZWQgbG9uZyBjcmM6MTsKKwkgICAgdW5zaWduZWQgbG9uZyByZXNlcnZlXzE6NDsKKwkgICAgdW5zaWduZWQgbG9uZyBzdHA6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBlZHA6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBpYzoxOworCSAgICB1bnNpZ25lZCBsb25nIHJlc2VydmVfMjo4OworCX0KKwliaXRzOworCXVuc2lnbmVkIGxvbmcgbHc7CisgICAgfQorICAgIHR4X2N0cmw7CisKKyAgICB1bnNpZ25lZCBsb25nIGJ1Zl9hZGRyXzE6MzI7CisgICAgdW5zaWduZWQgbG9uZyBidWZfYWRkcl8yOjMyOworCit9OworCitzdHJ1Y3QgcmhpbmVfcnhfZGVzYworeworICAgIHVuaW9uIFZUQ19yeF9zdGF0dXNfdGFnCisgICAgeworCXN0cnVjdAorCXsKKwkgICAgdW5zaWduZWQgbG9uZyByZXJyOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgY3JjX2Vycm9yOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgZmFlOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgZm92OjE7CisJICAgIHVuc2lnbmVkIGxvbmcgdG9vbG9uZzoxOworCSAgICB1bnNpZ25lZCBsb25nIHJ1bnQ6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBzZXJyOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgYnVmZjoxOworCSAgICB1bnNpZ25lZCBsb25nIGVkcDoxOworCSAgICB1bnNpZ25lZCBsb25nIHN0cDoxOworCSAgICB1bnNpZ25lZCBsb25nIGNobjoxOworCSAgICB1bnNpZ25lZCBsb25nIHBoeToxOworCSAgICB1bnNpZ25lZCBsb25nIGJhcjoxOworCSAgICB1bnNpZ25lZCBsb25nIG1hcjoxOworCSAgICB1bnNpZ25lZCBsb25nIHJlc2VydmVfMToxOworCSAgICB1bnNpZ25lZCBsb25nIHJ4b2s6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBmcmFtZV9sZW5ndGg6MTE7CisJICAgIHVuc2lnbmVkIGxvbmcgcmV2ZXJ2ZV8yOjQ7CisJICAgIHVuc2lnbmVkIGxvbmcgb3duX2JpdDoxOworCX0KKwliaXRzOworCXVuc2lnbmVkIGxvbmcgbHc7CisgICAgfQorICAgIHJ4X3N0YXR1czsKKworICAgIHVuaW9uIFZUQ19yeF9jdHJsX3RhZworICAgIHsKKwlzdHJ1Y3QKKwl7CisJICAgIHVuc2lnbmVkIGxvbmcgcnhfYnVmX3NpemU6MTE7CisJICAgIHVuc2lnbmVkIGxvbmcgZXh0ZW5kX3J4X2J1Zl9zaXplOjQ7CisJICAgIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWRfMToxNzsKKwl9CisJYml0czsKKwl1bnNpZ25lZCBsb25nIGx3OworICAgIH0KKyAgICByeF9jdHJsOworCisgICAgdW5zaWduZWQgbG9uZyBidWZfYWRkcl8xOjMyOworICAgIHVuc2lnbmVkIGxvbmcgYnVmX2FkZHJfMjozMjsKKworfTsKKworc3RydWN0IHsKKwljaGFyIHR4YnVmW1RYX1JJTkdfU0laRSAqIFBLVF9CVUZfU1ogKyAzMl07CisJY2hhciByeGJ1ZltSWF9SSU5HX1NJWkUgKiBQS1RfQlVGX1NaICsgMzJdOworCWNoYXIgdHhkZXNjW1RYX1JJTkdfU0laRSAqIHNpemVvZiAoc3RydWN0IHJoaW5lX3R4X2Rlc2MpICsgMzJdOworCWNoYXIgcnhkZXNjW1JYX1JJTkdfU0laRSAqIHNpemVvZiAoc3RydWN0IHJoaW5lX3J4X2Rlc2MpICsgMzJdOworfSByaGluZV9idWZmZXJzIF9fc2hhcmVkOworCisvKiBUaGUgSS9PIGV4dGVudC4gKi8KKyNkZWZpbmUgcmhpbmVfVE9UQUxfU0laRSAweDgwCisKKyNpZmRlZglIQVZFX0RFVkxJU1QKK3N0cnVjdCBuZXRkZXZfZW50cnkgcmhpbmVfZHJ2ID0KKyAgICB7ICJyaGluZSIsIHJoaW5lX3Byb2JlLCByaGluZV9UT1RBTF9TSVpFLCBOVUxMIH07CisjZW5kaWYKKworc3RhdGljIGludCByaGluZV9kZWJ1ZyA9IDE7CisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgVklBIDg2YzEwMEEgUmhpbmUtSUkgUENJIEZhc3QgRXRoZXJuZXQKK2NvbnRyb2xsZXIuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitCb2FyZHMgd2l0aCB0aGlzIGNoaXAgYXJlIGZ1bmN0aW9uYWwgb25seSBpbiBhIGJ1cy1tYXN0ZXIgUENJIHNsb3QuCisKK01hbnkgb3BlcmF0aW9uYWwgc2V0dGluZ3MgYXJlIGxvYWRlZCBmcm9tIHRoZSBFRVBST00gdG8gdGhlIENvbmZpZyB3b3JkIGF0CitvZmZzZXQgMHg3OC4gIFRoaXMgZHJpdmVyIGFzc3VtZXMgdGhhdCB0aGV5IGFyZSBjb3JyZWN0LgorSWYgdGhpcyBkcml2ZXIgaXMgY29tcGlsZWQgdG8gdXNlIFBDSSBtZW1vcnkgc3BhY2Ugb3BlcmF0aW9ucyB0aGUgRUVQUk9NCittdXN0IGJlIGNvbmZpZ3VyZWQgdG8gZW5hYmxlIG1lbW9yeSBvcHMuCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitJSUlhLiBSaW5nIGJ1ZmZlcnMKKworVGhpcyBkcml2ZXIgdXNlcyB0d28gc3RhdGljYWxseSBhbGxvY2F0ZWQgZml4ZWQtc2l6ZSBkZXNjcmlwdG9yIGxpc3RzCitmb3JtZWQgaW50byByaW5ncyBieSBhIGJyYW5jaCBmcm9tIHRoZSBmaW5hbCBkZXNjcmlwdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YKK3RoZSBsaXN0LiAgVGhlIHJpbmcgc2l6ZXMgYXJlIHNldCBhdCBjb21waWxlIHRpbWUgYnkgUlgvVFhfUklOR19TSVpFLgorCitJSUliL2MuIFRyYW5zbWl0L1JlY2VpdmUgU3RydWN0dXJlCisKK1RoaXMgZHJpdmVyIGF0dGVtcHRzIHRvIHVzZSBhIHplcm8tY29weSByZWNlaXZlIGFuZCB0cmFuc21pdCBzY2hlbWUuCisKK0FsYXMsIGFsbCBkYXRhIGJ1ZmZlcnMgYXJlIHJlcXVpcmVkIHRvIHN0YXJ0IG9uIGEgMzIgYml0IGJvdW5kYXJ5LCBzbwordGhlIGRyaXZlciBtdXN0IG9mdGVuIGNvcHkgdHJhbnNtaXQgcGFja2V0cyBpbnRvIGJvdW5jZSBidWZmZXJzLgorCitUaGUgZHJpdmVyIGFsbG9jYXRlcyBmdWxsIGZyYW1lIHNpemUgc2tidWZmcyBmb3IgdGhlIFJ4IHJpbmcgYnVmZmVycyBhdAorb3BlbigpIHRpbWUgYW5kIHBhc3NlcyB0aGUgc2tiLT5kYXRhIGZpZWxkIHRvIHRoZSBjaGlwIGFzIHJlY2VpdmUgZGF0YQorYnVmZmVycy4gIFdoZW4gYW4gaW5jb21pbmcgZnJhbWUgaXMgbGVzcyB0aGFuIFJYX0NPUFlCUkVBSyBieXRlcyBsb25nLAorYSBmcmVzaCBza2J1ZmYgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgaXMgY29waWVkIHRvIHRoZSBuZXcgc2tidWZmLgorV2hlbiB0aGUgaW5jb21pbmcgZnJhbWUgaXMgbGFyZ2VyLCB0aGUgc2tidWZmIGlzIHBhc3NlZCBkaXJlY3RseSB1cCB0aGUKK3Byb3RvY29sIHN0YWNrLiAgQnVmZmVycyBjb25zdW1lZCB0aGlzIHdheSBhcmUgcmVwbGFjZWQgYnkgbmV3bHkgYWxsb2NhdGVkCitza2J1ZmZzIGluIHRoZSBsYXN0IHBoYXNlIG9mIG5ldGRldl9yeCgpLgorCitUaGUgUlhfQ09QWUJSRUFLIHZhbHVlIGlzIGNob3NlbiB0byB0cmFkZS1vZmYgdGhlIG1lbW9yeSB3YXN0ZWQgYnkKK3VzaW5nIGEgZnVsbC1zaXplZCBza2J1ZmYgZm9yIHNtYWxsIGZyYW1lcyB2cy4gdGhlIGNvcHlpbmcgY29zdHMgb2YgbGFyZ2VyCitmcmFtZXMuICBOZXcgYm9hcmRzIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBnZW5lcm91c2x5IGNvbmZpZ3VyZWQgbWFjaGluZXMKK2FuZCB0aGUgdW5kZXJmaWxsZWQgYnVmZmVycyBoYXZlIG5lZ2xpZ2libGUgaW1wYWN0IGNvbXBhcmVkIHRvIHRoZSBiZW5lZml0IG9mCithIHNpbmdsZSBhbGxvY2F0aW9uIHNpemUsIHNvIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHplcm8gcmVzdWx0cyBpbiBuZXZlcgorY29weWluZyBwYWNrZXRzLiAgV2hlbiBjb3B5aW5nIGlzIGRvbmUsIHRoZSBjb3N0IGlzIHVzdWFsbHkgbWl0aWdhdGVkIGJ5IHVzaW5nCithIGNvbWJpbmVkIGNvcHkvY2hlY2tzdW0gcm91dGluZS4gIENvcHlpbmcgYWxzbyBwcmVsb2FkcyB0aGUgY2FjaGUsIHdoaWNoIGlzCittb3N0IHVzZWZ1bCB3aXRoIHNtYWxsIGZyYW1lcy4KKworU2luY2UgdGhlIFZJQSBjaGlwcyBhcmUgb25seSBhYmxlIHRvIHRyYW5zZmVyIGRhdGEgdG8gYnVmZmVycyBvbiAzMiBiaXQKK2JvdW5kYXJpZXMsIHRoZSB0aGUgSVAgaGVhZGVyIGF0IG9mZnNldCAxNCBpbiBhbiBldGhlcm5ldCBmcmFtZSBpc24ndAorbG9uZ3dvcmQgYWxpZ25lZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiAgQ29weWluZyB0aGVzZSB1bmFsaWduZWQgYnVmZmVycworaGFzIHRoZSBiZW5lZmljaWFsIGVmZmVjdCBvZiAxNi1ieXRlIGFsaWduaW5nIHRoZSBJUCBoZWFkZXIuCisKK0lJSWQuIFN5bmNocm9uaXphdGlvbgorCitUaGUgZHJpdmVyIHJ1bnMgYXMgdHdvIGluZGVwZW5kZW50LCBzaW5nbGUtdGhyZWFkZWQgZmxvd3Mgb2YgY29udHJvbC4gIE9uZQoraXMgdGhlIHNlbmQtcGFja2V0IHJvdXRpbmUsIHdoaWNoIGVuZm9yY2VzIHNpbmdsZS10aHJlYWRlZCB1c2UgYnkgdGhlCitkZXYtPnRidXN5IGZsYWcuICBUaGUgb3RoZXIgdGhyZWFkIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2ggaXMgc2luZ2xlCit0aHJlYWRlZCBieSB0aGUgaGFyZHdhcmUgYW5kIGludGVycnVwdCBoYW5kbGluZyBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcgYW5kICdkZXYtPnRidXN5JworZmxhZy4gIEl0IHNldHMgdGhlIHRidXN5IGZsYWcgd2hlbmV2ZXIgaXQncyBxdWV1aW5nIGEgVHggcGFja2V0LiBJZiB0aGUgbmV4dAorcXVldWUgc2xvdCBpcyBlbXB0eSwgaXQgY2xlYXJzIHRoZSB0YnVzeSBmbGFnIHdoZW4gZmluaXNoZWQgb3RoZXJ3aXNlIGl0IHNldHMKK3RoZSAnbHAtPnR4X2Z1bGwnIGZsYWcuCisKK1RoZSBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgZXhjbHVzaXZlIGNvbnRyb2wgb3ZlciB0aGUgUnggcmluZyBhbmQgcmVjb3JkcyBzdGF0cworZnJvbSB0aGUgVHggcmluZy4gIEFmdGVyIHJlYXBpbmcgdGhlIHN0YXRzLCBpdCBtYXJrcyB0aGUgVHggcXVldWUgZW50cnkgYXMKK2VtcHR5IGJ5IGluY3JlbWVudGluZyB0aGUgZGlydHlfdHggbWFyay4gSWZmIHRoZSAnbHAtPnR4X2Z1bGwnIGZsYWcgaXMgc2V0LCBpdAorY2xlYXJzIGJvdGggdGhlIHR4X2Z1bGwgYW5kIHRidXN5IGZsYWdzLgorCitJVi4gTm90ZXMKKworSVZiLiBSZWZlcmVuY2VzCisKK1ByZWxpbWluYXJ5IFZUODZDMTAwQSBtYW51YWwgZnJvbSBodHRwOi8vd3d3LnZpYS5jb20udHcvCitodHRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvbGludXgvbWlzYy8xMDBtYnBzLmh0bWwKK2h0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9taXNjL05XYXkuaHRtbAorCitJVmMuIEVycmF0YQorCitUaGUgVlQ4NkMxMDBBIG1hbnVhbCBpcyBub3QgcmVsaWFibGUgaW5mb3JtYXRpb24uCitUaGUgY2hpcCBkb2VzIG5vdCBoYW5kbGUgdW5hbGlnbmVkIHRyYW5zbWl0IG9yIHJlY2VpdmUgYnVmZmVycywgcmVzdWx0aW5nCitpbiBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBmb3IgYm91bmNlIGJ1ZmZlciBjb3BpZXMgb24gdHJhbnNtaXQKK2FuZCB1bmFsaWduZWQgSVAgaGVhZGVycyBvbiByZWNlaXZlLgorVGhlIGNoaXAgZG9lcyBub3QgcGFkIHRvIG1pbmltdW0gdHJhbnNtaXQgbGVuZ3RoLgorCisqLworCisvKiBUaGUgcmVzdCBvZiB0aGVzZSB2YWx1ZXMgc2hvdWxkIG5ldmVyIGNoYW5nZS4gKi8KKyNkZWZpbmUgTlVNX1RYX0RFU0MJMgkvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMuICovCisKK3N0YXRpYyBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZQoreworICAgIGNoYXIgZGV2bmFtZVs4XTsJCS8qIFVzZWQgb25seSBmb3Iga2VybmVsIGRlYnVnZ2luZy4gKi8KKyAgICBjb25zdCBjaGFyICpwcm9kdWN0X25hbWU7CisgICAgc3RydWN0IHJoaW5lX3J4X2Rlc2MgKnJ4X3Jpbmc7CisgICAgc3RydWN0IHJoaW5lX3R4X2Rlc2MgKnR4X3Jpbmc7CisgICAgY2hhciAqcnhfYnVmZnNbUlhfUklOR19TSVpFXTsKKyAgICBjaGFyICp0eF9idWZmc1tUWF9SSU5HX1NJWkVdOworCisgICAgLyogdGVtcG9yYXJ5IFJ4IGJ1ZmZlcnMuICovCisKKyAgICBpbnQgY2hpcF9pZDsKKyAgICBpbnQgY2hpcF9yZXZpc2lvbjsKKyAgICB1bnNpZ25lZCBzaG9ydCBpb2FkZHI7CisgICAgdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkvKiBUaGUgbmV4dCBmcmVlIGFuZCB1c2VkIGVudHJpZXMgKi8KKyAgICB1bnNpZ25lZCBpbnQgZGlydHlfcngsIGRpcnR5X3R4OworICAgIC8qIFRoZSBzYXZlZCBhZGRyZXNzIG9mIGEgc2VudC1pbi1wbGFjZSBwYWNrZXQvYnVmZmVyLCBmb3Igc2tmcmVlKCkuICovCisgICAgc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworICAgIHVuc2lnbmVkIGNoYXIgbWNfZmlsdGVyWzhdOwkvKiBDdXJyZW50IG11bHRpY2FzdCBmaWx0ZXIuICovCisgICAgY2hhciBwaHlzWzRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisgICAgdW5zaWduZWQgaW50IHR4X2Z1bGw6MTsJLyogVGhlIFR4IHF1ZXVlIGlzIGZ1bGwuICovCisgICAgdW5zaWduZWQgaW50IGZ1bGxfZHVwbGV4OjE7CS8qIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbiByZXF1ZXN0ZWQuICovCisgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDo0OwkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbWVkaWEyOjQ7CS8qIFNlY29uZGFyeSBtb25pdG9yZWQgbWVkaWEgcG9ydC4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbWVkaWFsb2NrOjE7CS8qIERvbid0IHNlbnNlIG1lZGlhIHR5cGUuICovCisgICAgdW5zaWduZWQgaW50IG1lZGlhc2Vuc2U6MTsJLyogTWVkaWEgc2Vuc2luZyBpbiBwcm9ncmVzcy4gKi8KK30KK3JoaW5lOworCitzdGF0aWMgdm9pZCByaGluZV9wcm9iZTEgKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwgaW50IGlvYWRkciwKKwkJCQkgaW50IGNoaXBfaWQsIGludCBvcHRpb25zKTsKK3N0YXRpYyBpbnQgUXVlcnlBdXRvIChpbnQpOworc3RhdGljIGludCBSZWFkTUlJIChpbnQgYnlNSUlJbmRleCwgaW50KTsKK3N0YXRpYyB2b2lkIFdyaXRlTUlJIChjaGFyLCBjaGFyLCBjaGFyLCBpbnQpOworc3RhdGljIHZvaWQgTUlJRGVsYXkgKHZvaWQpOworc3RhdGljIHZvaWQgcmhpbmVfaW5pdF9yaW5nIChzdHJ1Y3QgbmljICpkZXYpOworc3RhdGljIHZvaWQgcmhpbmVfZGlzYWJsZSAoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHJoaW5lX3Jlc2V0IChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCByaGluZV9wb2xsIChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyZWl2ZSk7CitzdGF0aWMgdm9pZCByaGluZV90cmFuc21pdCAoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCk7CitzdGF0aWMgdm9pZCByZWxvYWRfZWVwcm9tKGludCBpb2FkZHIpOworCisKK3N0YXRpYyB2b2lkIHJlbG9hZF9lZXByb20oaW50IGlvYWRkcikKK3sKKwlpbnQgaTsKKwlvdXRiKDB4MjAsIGJ5RUVDU1IpOworCS8qIFR5cGljYWxseSAyIGN5Y2xlcyB0byByZWxvYWQuICovCisJZm9yIChpID0gMDsgaSA8IDE1MDsgaSsrKQorCQlpZiAoISAoaW5iKGJ5RUVDU1IpICYgMHgyMCkpCisJCQlicmVhazsKK30KKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZAorcmhpbmVfaW5pdF9yaW5nIChzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwID0gKHN0cnVjdCByaGluZV9wcml2YXRlICopIG5pYy0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgdHAtPnR4X2Z1bGwgPSAwOworICAgIHRwLT5jdXJfcnggPSB0cC0+Y3VyX3R4ID0gMDsKKyAgICB0cC0+ZGlydHlfcnggPSB0cC0+ZGlydHlfdHggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorICAgIHsKKworCXRwLT5yeF9yaW5nW2ldLnJ4X3N0YXR1cy5iaXRzLm93bl9iaXQgPSAxOworCXRwLT5yeF9yaW5nW2ldLnJ4X2N0cmwuYml0cy5yeF9idWZfc2l6ZSA9IDE1MzY7CisKKwl0cC0+cnhfcmluZ1tpXS5idWZfYWRkcl8xID0gdmlydF90b19idXMgKHRwLT5yeF9idWZmc1tpXSk7CisJdHAtPnJ4X3JpbmdbaV0uYnVmX2FkZHJfMiA9IHZpcnRfdG9fYnVzICgmdHAtPnJ4X3JpbmdbaSArIDFdKTsKKwkvKiBwcmludGYoIlslZF1idWYxPSVoWCxidWYyPSVoWCIsaSx0cC0+cnhfcmluZ1tpXS5idWZfYWRkcl8xLHRwLT5yeF9yaW5nW2ldLmJ1Zl9hZGRyXzIpOyAqLworICAgIH0KKyAgICAvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworICAgIC8qIHRwLT5yeF9yaW5nW2ktMV0ucnhfY3RybC5iaXRzLnJ4X2J1Zl9zaXplID0xNTE4OyAqLworICAgIHRwLT5yeF9yaW5nW2kgLSAxXS5idWZfYWRkcl8yID0gdmlydF90b19idXMgKCZ0cC0+cnhfcmluZ1swXSk7CisgICAgLypwcmludGYoIlslZF1idWYxPSVoWCxidWYyPSVoWCIsaS0xLHRwLT5yeF9yaW5nW2ktMV0uYnVmX2FkZHJfMSx0cC0+cnhfcmluZ1tpLTFdLmJ1Zl9hZGRyXzIpOyAqLworCisgICAgLyogVGhlIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsIGJ1dCB3ZQorICAgICAgIGRvIG5lZWQgdG8gY2xlYXIgdGhlIG93bmVyc2hpcCBiaXQuICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisgICAgeworCisJdHAtPnR4X3JpbmdbaV0udHhfc3RhdHVzLmx3ID0gMDsKKwl0cC0+dHhfcmluZ1tpXS50eF9jdHJsLmx3ID0gMHgwMGUwODAwMDsKKwl0cC0+dHhfcmluZ1tpXS5idWZfYWRkcl8xID0gdmlydF90b19idXMgKHRwLT50eF9idWZmc1tpXSk7CisJdHAtPnR4X3JpbmdbaV0uYnVmX2FkZHJfMiA9IHZpcnRfdG9fYnVzICgmdHAtPnR4X3JpbmdbaSArIDFdKTsKKwkvKiBwcmludGYoIlslZF1idWYxPSVoWCxidWYyPSVoWCIsaSx0cC0+dHhfcmluZ1tpXS5idWZfYWRkcl8xLHRwLT50eF9yaW5nW2ldLmJ1Zl9hZGRyXzIpOyAqLworICAgIH0KKworICAgIHRwLT50eF9yaW5nW2kgLSAxXS5idWZfYWRkcl8yID0gdmlydF90b19idXMgKCZ0cC0+dHhfcmluZ1swXSk7CisgICAgLyogcHJpbnRmKCJbJWRdYnVmMT0laFgsYnVmMj0laFgiLGksdHAtPnR4X3JpbmdbaS0xXS5idWZfYWRkcl8xLHRwLT50eF9yaW5nW2ktMV0uYnVmX2FkZHJfMik7ICovCit9CisKK2ludAorUXVlcnlBdXRvIChpbnQgaW9hZGRyKQoreworICAgIGludCBieU1JSUluZGV4OworICAgIGludCBNSUlSZXR1cm47CisKKwlpbnQgYWR2ZXJ0aXNpbmcsbWlpX3JlZzU7CisJaW50IG5lZ29jaWF0ZWQ7CisKKyAgICBieU1JSUluZGV4ID0gMHgwNDsKKyAgICBNSUlSZXR1cm4gPSBSZWFkTUlJIChieU1JSUluZGV4LCBpb2FkZHIpOworCWFkdmVydGlzaW5nPU1JSVJldHVybjsKKworICAgIGJ5TUlJSW5kZXggPSAweDA1OworICAgIE1JSVJldHVybiA9IFJlYWRNSUkgKGJ5TUlJSW5kZXgsIGlvYWRkcik7CisJbWlpX3JlZzU9TUlJUmV0dXJuOworCisJbmVnb2NpYXRlZD1taWlfcmVnNSAmIGFkdmVydGlzaW5nOworCisJaWYgKCAobmVnb2NpYXRlZCAmIDB4MTAwKSB8fCAobmVnb2NpYXRlZCAmIDB4MUMwKSA9PSAweDQwICkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKKworfQorCitpbnQKK1JlYWRNSUkgKGludCBieU1JSUluZGV4LCBpbnQgaW9hZGRyKQoreworICAgIGludCBSZXR1cm5NSUk7CisgICAgY2hhciBieU1JSUFkcmJhazsKKyAgICBjaGFyIGJ5TUlJQ1JiYWs7CisgICAgY2hhciBieU1JSXRlbXA7CisgICAgdW5zaWduZWQgbG9uZyBjdDsKKworICAgIGJ5TUlJQWRyYmFrID0gaW5iIChieU1JSUFEKTsKKyAgICBieU1JSUNSYmFrID0gaW5iIChieU1JSUNSKTsKKyAgICBvdXRiIChieU1JSUNSYmFrICYgMHg3ZiwgYnlNSUlDUik7CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICBvdXRiIChieU1JSUluZGV4LCBieU1JSUFEKTsKKyAgICBNSUlEZWxheSAoKTsKKworICAgIG91dGIgKGluYiAoYnlNSUlDUikgfCAweDQwLCBieU1JSUNSKTsKKworICAgIGJ5TUlJdGVtcCA9IGluYiAoYnlNSUlDUik7CisgICAgYnlNSUl0ZW1wID0gYnlNSUl0ZW1wICYgMHg0MDsKKworICAgIGN0ID0gY3VycnRpY2tzKCk7CisgICAgd2hpbGUgKGJ5TUlJdGVtcCAhPSAwICYmIGN0ICsgMioxMDAwIDwgY3VycnRpY2tzKCkpCisgICAgeworCWJ5TUlJdGVtcCA9IGluYiAoYnlNSUlDUik7CisJYnlNSUl0ZW1wID0gYnlNSUl0ZW1wICYgMHg0MDsKKyAgICB9CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICBSZXR1cm5NSUkgPSBpbncgKHdNSUlEQVRBKTsKKworICAgIG91dGIgKGJ5TUlJQWRyYmFrLCBieU1JSUFEKTsKKyAgICBvdXRiIChieU1JSUNSYmFrLCBieU1JSUNSKTsKKyAgICBNSUlEZWxheSAoKTsKKworICAgIHJldHVybiAoUmV0dXJuTUlJKTsKKworfQorCit2b2lkCitXcml0ZU1JSSAoY2hhciBieU1JSVNldEJ5dGUsIGNoYXIgYnlNSUlTZXRCaXQsIGNoYXIgYnlNSUlPUCwgaW50IGlvYWRkcikKK3sKKyAgICBpbnQgUmVhZE1JSXRtcDsKKyAgICBpbnQgTUlJTWFzazsKKyAgICBjaGFyIGJ5TUlJQWRyYmFrOworICAgIGNoYXIgYnlNSUlDUmJhazsKKyAgICBjaGFyIGJ5TUlJdGVtcDsKKyAgICB1bnNpZ25lZCBsb25nIGN0OworCisKKyAgICBieU1JSUFkcmJhayA9IGluYiAoYnlNSUlBRCk7CisKKyAgICBieU1JSUNSYmFrID0gaW5iIChieU1JSUNSKTsKKyAgICBvdXRiIChieU1JSUNSYmFrICYgMHg3ZiwgYnlNSUlDUik7CisgICAgTUlJRGVsYXkgKCk7CisgICAgb3V0YiAoYnlNSUlTZXRCeXRlLCBieU1JSUFEKTsKKyAgICBNSUlEZWxheSAoKTsKKworICAgIG91dGIgKGluYiAoYnlNSUlDUikgfCAweDQwLCBieU1JSUNSKTsKKworICAgIGJ5TUlJdGVtcCA9IGluYiAoYnlNSUlDUik7CisgICAgYnlNSUl0ZW1wID0gYnlNSUl0ZW1wICYgMHg0MDsKKworICAgIGN0ID0gY3VycnRpY2tzKCk7CisgICAgd2hpbGUgKGJ5TUlJdGVtcCAhPSAwICYmIGN0ICsgMioxMDAwIDwgY3VycnRpY2tzKCkpCisgICAgeworCWJ5TUlJdGVtcCA9IGluYiAoYnlNSUlDUik7CisJYnlNSUl0ZW1wID0gYnlNSUl0ZW1wICYgMHg0MDsKKyAgICB9CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICBSZWFkTUlJdG1wID0gaW53ICh3TUlJREFUQSk7CisgICAgTUlJTWFzayA9IDB4MDAwMTsKKyAgICBNSUlNYXNrID0gTUlJTWFzayA8PCBieU1JSVNldEJpdDsKKworCisgICAgaWYgKGJ5TUlJT1AgPT0gMCkKKyAgICB7CisJTUlJTWFzayA9IH5NSUlNYXNrOworCVJlYWRNSUl0bXAgPSBSZWFkTUlJdG1wICYgTUlJTWFzazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlSZWFkTUlJdG1wID0gUmVhZE1JSXRtcCB8IE1JSU1hc2s7CisKKyAgICB9CisgICAgb3V0dyAoUmVhZE1JSXRtcCwgd01JSURBVEEpOworICAgIE1JSURlbGF5ICgpOworCisgICAgb3V0YiAoaW5iIChieU1JSUNSKSB8IDB4MjAsIGJ5TUlJQ1IpOworICAgIGJ5TUlJdGVtcCA9IGluYiAoYnlNSUlDUik7CisgICAgYnlNSUl0ZW1wID0gYnlNSUl0ZW1wICYgMHgyMDsKKworICAgIGN0ID0gY3VycnRpY2tzKCk7CisgICAgd2hpbGUgKGJ5TUlJdGVtcCAhPSAwICYmIGN0ICsgMioxMDAwIDwgY3VycnRpY2tzKCkpCisgICAgeworCWJ5TUlJdGVtcCA9IGluYiAoYnlNSUlDUik7CisJYnlNSUl0ZW1wID0gYnlNSUl0ZW1wICYgMHgyMDsKKyAgICB9CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICBvdXRiIChieU1JSUFkcmJhayAmIDB4N2YsIGJ5TUlJQUQpOworICAgIG91dGIgKGJ5TUlJQ1JiYWssIGJ5TUlJQ1IpOworICAgIE1JSURlbGF5ICgpOworCit9CisKK3ZvaWQKK01JSURlbGF5ICh2b2lkKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAweDdmZmY7IGkrKykKKyAgICB7CisgICAgICAgICggdm9pZCApIGluYiAoMHg2MSk7CisgICAgICAgICggdm9pZCApIGluYiAoMHg2MSk7CisgICAgICAgICggdm9pZCApIGluYiAoMHg2MSk7CisgICAgICAgICggdm9pZCApIGluYiAoMHg2MSk7CisgICAgfQorfQorCisvKiBPZmZzZXRzIHRvIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLworZW51bSByZWdpc3Rlcl9vZmZzZXRzIHsKKyAgICAgICAgU3RhdGlvbkFkZHI9MHgwMCwgUnhDb25maWc9MHgwNiwgVHhDb25maWc9MHgwNywgQ2hpcENtZD0weDA4LAorICAgICAgICBJbnRyU3RhdHVzPTB4MEMsIEludHJFbmFibGU9MHgwRSwKKyAgICAgICAgTXVsdGljYXN0RmlsdGVyMD0weDEwLCBNdWx0aWNhc3RGaWx0ZXIxPTB4MTQsCisgICAgICAgIFJ4UmluZ1B0cj0weDE4LCBUeFJpbmdQdHI9MHgxQywgR0ZJRk9UZXN0PTB4NTQsCisgICAgICAgIE1JSVBoeUFkZHI9MHg2QywgTUlJU3RhdHVzPTB4NkQsIFBDSUJ1c0NvbmZpZz0weDZFLAorICAgICAgICBNSUlDbWQ9MHg3MCwgTUlJUmVnQWRkcj0weDcxLCBNSUlEYXRhPTB4NzIsIE1BQ1JlZ0VFY3NyPTB4NzQsCisgICAgICAgIENvbmZpZ0E9MHg3OCwgQ29uZmlnQj0weDc5LCBDb25maWdDPTB4N0EsIENvbmZpZ0Q9MHg3QiwKKyAgICAgICAgUnhNaXNzZWQ9MHg3QywgUnhDUkNFcnJzPTB4N0UsIE1pc2NDbWQ9MHg4MSwKKyAgICAgICAgU3RpY2t5SFc9MHg4MywgSW50clN0YXR1czI9MHg4NCwgV09MY3JDbHI9MHhBNCwgV09MY2dDbHI9MHhBNywKKyAgICAgICAgUHdyY3NyQ2xyPTB4QUMsCit9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKyAgICAgICAgSW50clJ4RG9uZT0weDAwMDEsIEludHJSeEVycj0weDAwMDQsIEludHJSeEVtcHR5PTB4MDAyMCwKKyAgICAgICAgSW50clR4RG9uZT0weDAwMDIsIEludHJUeEVycm9yPTB4MDAwOCwgSW50clR4VW5kZXJydW49MHgwMjEwLAorICAgICAgICBJbnRyUENJRXJyPTB4MDA0MCwKKyAgICAgICAgSW50clN0YXRzTWF4PTB4MDA4MCwgSW50clJ4RWFybHk9MHgwMTAwLAorICAgICAgICBJbnRyUnhPdmVyZmxvdz0weDA0MDAsIEludHJSeERyb3BwZWQ9MHgwODAwLCBJbnRyUnhOb0J1Zj0weDEwMDAsCisgICAgICAgIEludHJUeEFib3J0ZWQ9MHgyMDAwLCBJbnRyTGlua0NoYW5nZT0weDQwMDAsCisgICAgICAgIEludHJSeFdha2VVcD0weDgwMDAsCisgICAgICAgIEludHJOb3JtYWxTdW1tYXJ5PTB4MDAwMywgSW50ckFibm9ybWFsU3VtbWFyeT0weEMyNjAsCisgICAgICAgIEludHJUeERlc2NSYWNlPTB4MDgwMDAwLCAgICAgICAgLyogbWFwcGVkIGZyb20gSW50clN0YXR1czIgKi8KKyAgICAgICAgSW50clR4RXJyU3VtbWFyeT0weDA4MjIxOCwKK307CisjZGVmaW5lIERFRkFVTFRfSU5UUiAoSW50clJ4RG9uZSB8IEludHJSeEVyciB8IEludHJSeEVtcHR5fCBJbnRyUnhPdmVyZmxvdyB8IFwKKyAgICAgICAgICAgICAgICAgICBJbnRyUnhEcm9wcGVkIHwgSW50clJ4Tm9CdWYpIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgSVJRIC0gUFhFIElSUSBIYW5kbGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJoaW5lX2lycSAoIHN0cnVjdCBuaWMgKm5pYywgaXJxX2FjdGlvbl90IGFjdGlvbiApIHsKKyAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHAgPSAoc3RydWN0IHJoaW5lX3ByaXZhdGUgKikgbmljLT5wcml2X2RhdGE7CisgICAgLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisgICAgdW5zaWduZWQgaW50IGludHJfc3RhdHVzOworCisgICAgc3dpdGNoICggYWN0aW9uICkgeworICAgICAgICBjYXNlIERJU0FCTEUgOgorICAgICAgICBjYXNlIEVOQUJMRSA6CisgICAgICAgICAgICBpbnRyX3N0YXR1cyA9IGludyhuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOworICAgICAgICAgICAgLyogT24gUmhpbmUtSUksIEJpdCAzIGluZGljYXRlcyBUeCBkZXNjcmlwdG9yIHdyaXRlLWJhY2sgcmFjZS4gKi8KKworICAgICAgICAgICAgLyogYWRkZWQgY29tbWVudCBieSBndWFyZCAqLworICAgICAgICAgICAgLyogRm9yIHN1cHBvcnRpbmcgVlQ2MTA3LCBwbGVhc2UgdXNlIHJldmlzaW9uIGlkIHRvIHJlY29nbml6ZSBkaWZmZXJlbnQgY2hpcHMgaW4gZHJpdmVyICovCisgICAgICAgICAgICAvLyBpZiAodHAtPmNoaXBfaWQgPT0gMHgzMDY1KQorICAgICAgICAgICAgaWYoIHRwLT5jaGlwX3JldmlzaW9uIDwgMHg4MCAmJiB0cC0+Y2hpcF9yZXZpc2lvbiA+PTB4NDAgKQorICAgICAgICAgICAgICAgIGludHJfc3RhdHVzIHw9IGluYihuaWMtPmlvYWRkciArIEludHJTdGF0dXMyKSA8PCAxNjsKKyAgICAgICAgICAgICAgICBpbnRyX3N0YXR1cyA9IChpbnRyX3N0YXR1cyAmIH5ERUZBVUxUX0lOVFIpOworICAgICAgICAgICAgICAgIGlmICggYWN0aW9uID09IEVOQUJMRSApIAorICAgICAgICAgICAgICAgICAgICBpbnRyX3N0YXR1cyA9IGludHJfc3RhdHVzIHwgREVGQVVMVF9JTlRSOworICAgICAgICAgICAgICAgICAgICBvdXR3KGludHJfc3RhdHVzLCBuaWMtPmlvYWRkciArIEludHJFbmFibGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZPUkNFIDoKKyAgICAgICAgICAgIG91dHcoMHgwMDEwLCBuaWMtPmlvYWRkciArIDB4ODQpOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorfQorCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIHJoaW5lX29wZXJhdGlvbnM7CisKK3N0YXRpYyBpbnQKK3JoaW5lX3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICkgeworCisgICAgc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwID0gKHN0cnVjdCByaGluZV9wcml2YXRlICopIG5pYy0+cHJpdl9kYXRhOworCisgICAgaWYgKCFwY2ktPmlvYWRkcikKKwlyZXR1cm4gMDsKKworICAgIHJoaW5lX3Byb2JlMSAobmljLCBwY2ksIHBjaS0+aW9hZGRyLCBwY2ktPmRldmljZSwgLTEpOworCisgICAgYWRqdXN0X3BjaV9kZXZpY2UgKCBwY2kgKTsKKworICAgIHJoaW5lX3Jlc2V0IChuaWMpOworCisgICAgbmljLT5uaWNfb3AJPSAmcmhpbmVfb3BlcmF0aW9uczsKKworICAgIG5pYy0+aXJxbm8JICA9IHBjaS0+aXJxOworICAgIG5pYy0+aW9hZGRyICAgPSB0cC0+aW9hZGRyOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkgeworICAgIAlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHAgPSAoc3RydWN0IHJoaW5lX3ByaXZhdGUgKikgbmljLT5wcml2X2RhdGE7CisJdW5zaWduZWQgY2hhciByeF9tb2RlOworICAgIAlpbnQgaW9hZGRyID0gdHAtPmlvYWRkcjsKKworCS8qICEgSUZGX1BST01JU0MgKi8KKwlvdXRsKDB4ZmZmZmZmZmYsIGJ5TUFSMCk7CisJb3V0bCgweGZmZmZmZmZmLCBieU1BUjQpOworCXJ4X21vZGUgPSAweDBDOworCisJb3V0YigweDYwIC8qIHRocmVzaCAqLyB8IHJ4X21vZGUsIGJ5UkNSICk7Cit9CisKK3N0YXRpYyB2b2lkCityaGluZV9wcm9iZTEgKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwgaW50IGlvYWRkciwgaW50IGNoaXBfaWQsIGludCBvcHRpb25zKQoreworICAgIHN0cnVjdCByaGluZV9wcml2YXRlICp0cDsKKyAgICBzdGF0aWMgaW50IGRpZF92ZXJzaW9uID0gMDsJLyogQWxyZWFkeSBwcmludGVkIHZlcnNpb24gaW5mby4gKi8KKyAgICB1bnNpZ25lZCBpbnQgaSwgd3c7CisgICAgdW5zaWduZWQgaW50IHRpbWVvdXQ7CisgICAgaW50IEZEWEZsYWc7CisgICAgaW50IGJ5TUlJdmFsdWUsIExpbmVTcGVlZCwgTUlJQ1JiYWs7CisgICAgdWludDhfdCByZXZpc2lvbl9pZDsgICAgCisgICAgdW5zaWduZWQgY2hhciBtb2RlM19yZWc7CisKKyAgICBpZiAocmhpbmVfZGVidWcgPiAwICYmIGRpZF92ZXJzaW9uKysgPT0gMCkKKwlwcmludGYgKCIlcyIsdmVyc2lvbik7CisKKyAgICAvLyBnZXQgcmV2aXNpb24gaWQuCisgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lfUkVWSVNJT04sICZyZXZpc2lvbl9pZCk7CisKKyAgICAvKiBELUxpbmsgcHJvdmlkZWQgcmVzZXQgY29kZSAod2l0aCBjb21tZW50IGFkZGl0aW9ucykgKi8KKyAgICBpZiAocmV2aXNpb25faWQgPj0gMHg0MCkgeworCXVuc2lnbmVkIGNoYXIgYnlPcmdWYWx1ZTsKKwkKKwlpZihyaGluZV9kZWJ1ZyA+IDApCisJCXByaW50ZigiRW5hYmxpbmcgU3RpY2t5IEJpdCBXb3JrYXJvdW5kIGZvciBDaGlwX2lkOiAweCVoWFxuIgorCQkJCSwgY2hpcF9pZCk7CisJLyogY2xlYXIgc3RpY2t5IGJpdCBiZWZvcmUgcmVzZXQgJiByZWFkIGV0aGVybmV0IGFkZHJlc3MgKi8KKwlieU9yZ1ZhbHVlID0gaW5iKGJ5U1RJQ0tIVyk7CisJYnlPcmdWYWx1ZSA9IGJ5T3JnVmFsdWUgJiAweEZDOworCW91dGIoYnlPcmdWYWx1ZSwgYnlTVElDS0hXKTsKKworCS8qIChiaXRzIHdyaXR0ZW4gYXJlIGNsZWFyZWQ/KSAqLworCS8qIGRpc2FibGUgZm9yY2UgUE1FLWVuYWJsZSAqLworCW91dGIoMHg4MCwgYnlXT0xjZ0Nscik7CisJLyogZGlzYWJsZSBwb3dlci1ldmVudCBjb25maWcgYml0ICovCisJb3V0YigweEZGLCBieVdPTGNyQ2xyKTsKKwkvKiBjbGVhciBwb3dlciBzdGF0dXMgKHVuZG9jdW1lbnRlZCBpbiB2dDYxMDIgZG9jcz8pICovCisJb3V0YigweEZGLCBieVB3cmNzckNscik7CisJCisgICAgfQorCisgICAgLyogUmVzZXQgdGhlIGNoaXAgdG8gZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbi4gKi8KKyAgICBvdXR3KENSX1NGUlNULCBieUNSMCk7CisgICAgLy8gaWYgdnQzMDQzIGRlbGF5IGFmdGVyIHJlc2V0CisgICAgaWYgKHJldmlzaW9uX2lkIDwweDQwKSB7CisgICAgICAgdWRlbGF5KDEwMDAwKTsKKyAgICB9CisgICAgLy8gcG9sbGluZyB0aWxsIHNvZnR3YXJlIHJlc2V0IGNvbXBsZXRlCisgICAgLy8gV19NQVhfVElNRU9VVCBpcyB0aGUgdGltZW91dCBwZXJpb2QKKyAgICBmb3Iod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKKyAgICAgICAgaWYgKChpbncoYnlDUjApICYgQ1JfU0ZSU1QpID09IDApCisJCWJyZWFrOworICAgICAgICB9CisKKyAgICAvLyBpc3N1ZSBBVVRPTG9hZCBpbiBFRUNTUiB0byByZWxvYWQgZWVwcm9tCisgICAgb3V0YigweDIwLCBieUVFQ1NSICk7CisKKyAgICAvLyBpZiB2dDMwNjUgZGVsYXkgYWZ0ZXIgcmVzZXQKKyAgICBpZiAocmV2aXNpb25faWQgPj0weDQwKSB7CisJLy8gZGVsYXkgOG1zIHRvIGxldCBNQUMgc3RhYmxlCisJbWRlbGF5KDgpOworICAgICAgICAvKgorICAgICAgICAgKiBmb3IgMzA2NUQsIEVFUFJPTSByZWxvYWRlZCB3aWxsIGNhdXNlIGJpdCAwIGluIE1BQ19SRUdfQ0ZHQQorICAgICAgICAgKiB0dXJuZWQgb24uICBpdCBtYWtlcyBNQUMgcmVjZWl2ZSBtYWdpYyBwYWNrZXQKKyAgICAgICAgICogYXV0b21hdGljYWxseS4gU28sIHdlIHR1cm4gaXQgb2ZmLiAoRC1MaW5rKQorICAgICAgICAgKi8KKyAgICAgICAgIG91dGIoaW5iKGJ5Q0ZHQSkgJiAweEZFLCBieUNGR0EpOworICAgIH0KKworICAgIC8qIHR1cm4gb24gYml0MiBpbiBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlciAweDUzICwgb25seSBmb3IgMzA2NSovCisgICAgaWYgKHJldmlzaW9uX2lkID49IDB4NDApIHsKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lfUkVHX01PREUzLCAmbW9kZTNfcmVnKTsKKyAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaSwgUENJX1JFR19NT0RFMywgbW9kZTNfcmVnfE1PREUzX01JSU9OKTsKKyAgICB9CisKKworICAgIC8qIGJhY2sgb2ZmIGFsZ29yaXRobSAsZGlzYWJsZSB0aGUgcmlnaHQtbW9zdCA0LWJpdCBvZmYgQ0ZHRCovCisgICAgb3V0YihpbmIoYnlDRkdEKSAmICh+KENGR0RfUkFORE9NIHwgQ0ZHRF9DRkRYIHwgQ0ZHRF9DRVJFTiB8IENGR0RfQ0VURU4pKSwgYnlDRkdEKTsKKworICAgIC8qIHJlbG9hZCBlZXByb20gKi8KKyAgICByZWxvYWRfZWVwcm9tKGlvYWRkcik7CisKKyAgICAvKiBQZXJoYXBzIHRoaXMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgRUVQUk9NPyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCW5pYy0+bm9kZV9hZGRyW2ldID0gaW5iIChieVBBUjAgKyBpKTsKKworICAgIERCRyAoICJJTyBhZGRyZXNzICUjaFggRXRoZXJuZXQgQWRkcmVzczogJXNcbiIsIGlvYWRkciwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApICk7CisKKyAgICAvKiByZXN0YXJ0IE1JSSBhdXRvLW5lZ290aWF0aW9uICovCisgICAgV3JpdGVNSUkgKDAsIDksIDEsIGlvYWRkcik7CisgICAgcHJpbnRmICgiQW5hbHl6aW5nIE1lZGlhIHR5cGUsdGhpcyBtYXkgdGFrZSBzZXZlcmFsIHNlY29uZHMuLi4gIik7CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB7CisJLyogbmVlZCB0byB3YWl0IDEgbWlsbGlzZWNvbmQgLSB3ZSB3aWxsIHJvdW5kIGl0IHVwIHRvIDUwLTEwMG1zICovCisJdGltZW91dCA9IGN1cnJ0aWNrcygpICsgMjsKKwlmb3IgKHRpbWVvdXQgPSBjdXJydGlja3MoKSArIDI7IGN1cnJ0aWNrcygpIDwgdGltZW91dDspCisJICAgIC8qIG5vdGhpbmcgKi87CisJaWYgKFJlYWRNSUkgKDEsIGlvYWRkcikgJiAweDAwMjApCisJICAgIGJyZWFrOworICAgIH0KKyAgICBwcmludGYgKCJPSy5cbiIpOworCisjaWYgMAorCS8qIEpKTSA6IGZvciBEZWJ1ZyAqLworCXByaW50ZigiTUlJIDogQWRkcmVzcyAlaGhYICIsaW5iKGlvYWRkcisweDZjKSk7CisJeworCSB1bnNpZ25lZCBjaGFyIHN0MSxzdDIsYWR2MSxhZHYyLGwxLGwyOworCQorCSBzdDE9UmVhZE1JSSgxLGlvYWRkcik+Pjg7CisJIHN0Mj1SZWFkTUlJKDEsaW9hZGRyKSYweEZGOworCSBhZHYxPVJlYWRNSUkoNCxpb2FkZHIpPj44OworCSBhZHYyPVJlYWRNSUkoNCxpb2FkZHIpJjB4RkY7CisJIGwxPVJlYWRNSUkoNSxpb2FkZHIpPj44OworCSBsMj1SZWFkTUlJKDUsaW9hZGRyKSYweEZGOworCSBwcmludGYoIiBzdGF0dXMgMHglaGhYJWhoWCwgYWR2ZXJ0aXNpbmcgMHglaGhYJWhoWCwgbGluayAweCVoaFglaGhYXG4iLCBzdDEsc3QyLGFkdjEsYWR2MixsMSxsMik7CisJfQorI2VuZGlmCisKKyAgICAKKyAgICAvKiBxdWVyeSBNSUkgdG8ga25vdyBMaW5lU3BlZWQsZHVwbGV4IG1vZGUgKi8KKyAgICBieU1JSXZhbHVlID0gaW5iIChpb2FkZHIgKyAweDZkKTsKKyAgICBMaW5lU3BlZWQgPSBieU1JSXZhbHVlICYgTUlJU1JfU1BFRUQ7CisgICAgaWYgKExpbmVTcGVlZCAhPSAwKQkJCQkJCS8vSkpNCisgICAgeworCXByaW50ZiAoIkxpbmVzcGVlZD0xME1icyIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXByaW50ZiAoIkxpbmVzcGVlZD0xMDBNYnMiKTsKKyAgICB9CisJCisgICAgRkRYRmxhZyA9IFF1ZXJ5QXV0byAoaW9hZGRyKTsKKyAgICBpZiAoRkRYRmxhZyA9PSAxKQorICAgIHsKKwlwcmludGYgKCIgRnVsbGR1cGxleFxuIik7CisJb3V0dyAoQ1JfRkRYLCBieUNSMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJpbnRmICgiIEhhbGZkdXBsZXhcbiIpOworICAgIH0KKworCisgICAgLyogc2V0IE1JSSAxMCBGVUxMIE9OLCBvbmx5IGFwcGx5IGluIHZ0MzA0MyAqLworICAgIGlmKGNoaXBfaWQgPT0gMHgzMDQzKQorICAgICAgICBXcml0ZU1JSSAoMHgxNywgMSwgMSwgaW9hZGRyKTsKKworICAgIC8qIHR1cm4gb24gTUlJIGxpbmsgY2hhbmdlICovCisgICAgTUlJQ1JiYWsgPSBpbmIgKGJ5TUlJQ1IpOworICAgIG91dGIgKE1JSUNSYmFrICYgMHg3RiwgYnlNSUlDUik7CisgICAgTUlJRGVsYXkgKCk7CisgICAgb3V0YiAoMHg0MSwgYnlNSUlBRCk7CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICAvKiB3aGlsZSgoaW5iKGJ5TUlJQUQpJjB4MjApPT0wKSA7ICovCisgICAgb3V0YiAoTUlJQ1JiYWsgfCAweDgwLCBieU1JSUNSKTsKKworICAgIG5pYy0+cHJpdl9kYXRhID0gJnJoaW5lOworICAgIHRwID0gJnJoaW5lOworICAgIHRwLT5jaGlwX2lkID0gY2hpcF9pZDsKKyAgICB0cC0+aW9hZGRyID0gaW9hZGRyOworICAgIHRwLT5waHlzWzBdID0gLTE7CisgICAgdHAtPmNoaXBfcmV2aXNpb24gPSByZXZpc2lvbl9pZDsKKworICAgIC8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworICAgIGlmIChvcHRpb25zID4gMCkKKyAgICB7CisJdHAtPmZ1bGxfZHVwbGV4ID0gKG9wdGlvbnMgJiAxNikgPyAxIDogMDsKKwl0cC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9ucyAmIDE1OworCWlmICh0cC0+ZGVmYXVsdF9wb3J0KQorCSAgICB0cC0+bWVkaWFsb2NrID0gMTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCAKK3JoaW5lX2Rpc2FibGUgKCBzdHJ1Y3QgbmljICpuaWMgKSB7CisKKyAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHAgPSAoc3RydWN0IHJoaW5lX3ByaXZhdGUgKikgbmljLT5wcml2X2RhdGE7CisgICAgaW50IGlvYWRkciA9IHRwLT5pb2FkZHI7CisKKyAgICByaGluZV9yZXNldChuaWMpOworCisgICAgcHJpbnRmICgicmhpbmUgZGlzYWJsZVxuIik7CisgICAgLyogU3dpdGNoIHRvIGxvb3BiYWNrIG1vZGUgdG8gYXZvaWQgaGFyZHdhcmUgcmFjZXMuICovCisgICAgb3V0YigweDYwIHwgMHgwMSwgYnlUQ1IpOworICAgIC8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworICAgIG91dHcoQ1JfU1RPUCwgYnlDUjApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCityaGluZV9yZXNldCAoc3RydWN0IG5pYyAqbmljKQoreworICAgIHN0cnVjdCByaGluZV9wcml2YXRlICp0cCA9IChzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqKSBuaWMtPnByaXZfZGF0YTsKKyAgICBpbnQgaW9hZGRyID0gdHAtPmlvYWRkcjsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgRkRYRmxhZywgQ1JiYWs7CisgICAgdm9pZCAqcnhfcmluZ190bXA7CisgICAgdm9pZCAqdHhfcmluZ190bXA7CisgICAgdm9pZCAqcnhfYnVmc190bXA7CisgICAgdm9pZCAqdHhfYnVmc190bXA7CisgICAgdW5zaWduZWQgbG9uZyByeF9yaW5nX3RtcDE7CisgICAgdW5zaWduZWQgbG9uZyB0eF9yaW5nX3RtcDE7CisgICAgdW5zaWduZWQgbG9uZyByeF9idWZzX3RtcDE7CisgICAgdW5zaWduZWQgbG9uZyB0eF9idWZzX3RtcDE7CisKKyAgICAvKiBwcmludGYgKCJyaGluZV9yZXNldFxuIik7ICovCisgICAgLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKyAgICAvKm91dGIoQ21kUmVzZXQsIGlvYWRkciArIENoaXBDbWQpOyAqLworCisgICAgdHhfYnVmc190bXAgPSByaGluZV9idWZmZXJzLnR4YnVmOworICAgIHR4X3JpbmdfdG1wID0gcmhpbmVfYnVmZmVycy50eGRlc2M7CisgICAgcnhfYnVmc190bXAgPSByaGluZV9idWZmZXJzLnJ4YnVmOworICAgIHJ4X3JpbmdfdG1wID0gcmhpbmVfYnVmZmVycy5yeGRlc2M7CisKKyAgICAvKiB0dW5lIFJEIFREIDMyIGJ5dGUgYWxpZ25tZW50ICovCisgICAgcnhfcmluZ190bXAxID0gdmlydF90b19idXMgKCByeF9yaW5nX3RtcCApOworICAgIGogPSAocnhfcmluZ190bXAxICsgMzIpICYgKH4weDFmKTsKKyAgICAvKiBwcmludGYgKCJ0eHJpbmdbJWRdIiwgaik7ICovCisgICAgdHAtPnJ4X3JpbmcgPSAoc3RydWN0IHJoaW5lX3J4X2Rlc2MgKikgYnVzX3RvX3ZpcnQgKGopOworCisgICAgdHhfcmluZ190bXAxID0gdmlydF90b19idXMgKCB0eF9yaW5nX3RtcCApOworICAgIGogPSAodHhfcmluZ190bXAxICsgMzIpICYgKH4weDFmKTsKKyAgICB0cC0+dHhfcmluZyA9IChzdHJ1Y3QgcmhpbmVfdHhfZGVzYyAqKSBidXNfdG9fdmlydCAoaik7CisgICAgLyogcHJpbnRmICgicnhyaW5nWyVYXSIsIGopOyAqLworCisKKyAgICB0eF9idWZzX3RtcDEgPSB2aXJ0X3RvX2J1cyAoIHR4X2J1ZnNfdG1wICk7CisgICAgaiA9IChpbnQpICh0eF9idWZzX3RtcDEgKyAzMikgJiAofjB4MWYpOworICAgIHR4X2J1ZnNfdG1wID0gYnVzX3RvX3ZpcnQgKGopOworICAgIC8qIHByaW50ZiAoInR4YlslWF0iLCBqKTsgKi8KKworICAgIHJ4X2J1ZnNfdG1wMSA9IHZpcnRfdG9fYnVzICggcnhfYnVmc190bXAgKTsKKyAgICBqID0gKGludCkgKHJ4X2J1ZnNfdG1wMSArIDMyKSAmICh+MHgxZik7CisgICAgcnhfYnVmc190bXAgPSBidXNfdG9fdmlydCAoaik7CisgICAgLyogcHJpbnRmICgicnhiWyVYXVslWF0iLCByeF9idWZzX3RtcDEsIGopOyAqLworCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorICAgIHsKKwl0cC0+cnhfYnVmZnNbaV0gPSAoY2hhciAqKSByeF9idWZzX3RtcDsKKwkvKiBwcmludGYoInJbJVhdIix0cC0+cnhfYnVmZnNbaV0pOyAqLworCXJ4X2J1ZnNfdG1wICs9IDE1MzY7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorICAgIHsKKwl0cC0+dHhfYnVmZnNbaV0gPSAoY2hhciAqKSB0eF9idWZzX3RtcDsKKwkvKiBwcmludGYoInRbJVhdIix0cC0+dHhfYnVmZnNbaV0pOyAgKi8KKwl0eF9idWZzX3RtcCArPSAxNTM2OworICAgIH0KKworICAgIC8qIHNvZnR3YXJlIHJlc2V0ICovCisgICAgb3V0YiAoQ1IxX1NGUlNULCBieUNSMSk7CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICAvKiBwcmludGYgKCJpbml0IHJpbmciKTsgKi8KKyAgICByaGluZV9pbml0X3JpbmcgKG5pYyk7CisgICAgLyp3cml0ZSBURCBSRCBEZXNjcmlwdG9yIHRvIE1BQyAqLworICAgIG91dGwgKHZpcnRfdG9fYnVzICh0cC0+cnhfcmluZyksIGR3Q3VycmVudFJ4RGVzY0FkZHIpOworICAgIG91dGwgKHZpcnRfdG9fYnVzICh0cC0+dHhfcmluZyksIGR3Q3VycmVudFR4RGVzY0FkZHIpOworCisgICAgLyogU2V0dXAgTXVsdGljYXN0ICovCQorICAgIHNldF9yeF9tb2RlKG5pYyk7CisKKyAgICAvKiBzZXQgVENSIFJDUiB0aHJlc2hvbGQgdG8gc3RvcmUgYW5kIGZvcndhcmQqLworICAgIG91dGIgKDB4M2UsIGJ5QkNSMCk7CisgICAgb3V0YiAoMHgzOCwgYnlCQ1IxKTsKKyAgICBvdXRiICgweDJjLCBieVJDUik7CisgICAgb3V0YiAoMHg2MCwgYnlUQ1IpOworICAgIC8qIFNldCBGdWxsZHVwZXggKi8KKyAgICBGRFhGbGFnID0gUXVlcnlBdXRvIChpb2FkZHIpOworICAgIGlmIChGRFhGbGFnID09IDEpCisgICAgeworCW91dGIgKENGR0RfQ0ZEWCwgYnlDRkdEKTsKKwlvdXR3IChDUl9GRFgsIGJ5Q1IwKTsKKyAgICB9CisKKyAgICAvKiBLSUNLIE5JQyB0byBXT1JLICovCisgICAgQ1JiYWsgPSBpbncgKGJ5Q1IwKTsKKyAgICBDUmJhayA9IENSYmFrICYgMHhGRkZCOwkvKiBub3QgQ1JfU1RPUCAqLworICAgIG91dHcgKChDUmJhayB8IENSX1NUUlQgfCBDUl9UWE9OIHwgQ1JfUlhPTiB8IENSX0RQT0xMKSwgYnlDUjApOworCisgICAgLyogZGlzYWJsZSBhbGwga25vd24gaW50ZXJydXB0ICovCisgICAgb3V0dyAoMCwgYnlJTVIwKTsKK30KKy8qIEJld2FyZSBvZiBQQ0kgcG9zdGVkIHdyaXRlcyAqLworI2RlZmluZSBJT1NZTkMgIGRvIHsgaW5iKG5pYy0+aW9hZGRyICsgU3RhdGlvbkFkZHIpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW50CityaGluZV9wb2xsIChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyZWl2ZSkKK3sKKyAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHAgPSAoc3RydWN0IHJoaW5lX3ByaXZhdGUgKikgbmljLT5wcml2X2RhdGE7CisgICAgaW50IHJ4c3RhdHVzLCBnb29kID0gMDs7CisKKyAgICBpZiAodHAtPnJ4X3JpbmdbdHAtPmN1cl9yeF0ucnhfc3RhdHVzLmJpdHMub3duX2JpdCA9PSAwKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGludHJfc3RhdHVzOworICAgICAgICAvKiBUaGVyZSBpcyBhIHBhY2tldCByZWFkeSAqLworICAgICAgICBpZighcmV0cmVpdmUpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBpbnRyX3N0YXR1cyA9IGludyhuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOworICAgICAgICAvKiBPbiBSaGluZS1JSSwgQml0IDMgaW5kaWNhdGVzIFR4IGRlc2NyaXB0b3Igd3JpdGUtYmFjayByYWNlLiAqLworI2lmIDAKKwlpZiAodHAtPmNoaXBfaWQgPT0gMHgzMDY1KQorCSAgaW50cl9zdGF0dXMgfD0gaW5iKG5pYy0+aW9hZGRyICsgSW50clN0YXR1czIpIDw8IDE2OworI2VuZGlmCisgICAgICAgIC8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworICAgICAgICBpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhEZXNjUmFjZSkKKyAgICAgICAgICAgb3V0YigweDA4LCBuaWMtPmlvYWRkciArIEludHJTdGF0dXMyKTsKKyAgICAgICAgb3V0dyhpbnRyX3N0YXR1cyAmIDB4ZmZmZiwgbmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsKKwlJT1NZTkM7CisKKwlyeHN0YXR1cyA9IHRwLT5yeF9yaW5nW3RwLT5jdXJfcnhdLnJ4X3N0YXR1cy5sdzsKKwlpZiAoKHJ4c3RhdHVzICYgMHgwMzAwKSAhPSAweDAzMDApCisJeworCSAgICBwcmludGYoInJoaW5lX3BvbGw6IGJhZCBzdGF0dXNcbiIpOworCX0KKwllbHNlIGlmIChyeHN0YXR1cyAmIChSU1JfQUJOT1JNQUwpKQorCXsKKwkgICAgcHJpbnRmICgicnhlcnJbJVhdXG4iLCByeHN0YXR1cyk7CisJfQorCWVsc2UKKwkgICAgZ29vZCA9IDE7CisKKwlpZiAoZ29vZCkKKwl7CisJICAgIG5pYy0+cGFja2V0bGVuID0gdHAtPnJ4X3JpbmdbdHAtPmN1cl9yeF0ucnhfc3RhdHVzLmJpdHMuZnJhbWVfbGVuZ3RoOworCSAgICBtZW1jcHkgKG5pYy0+cGFja2V0LCB0cC0+cnhfYnVmZnNbdHAtPmN1cl9yeF0sIG5pYy0+cGFja2V0bGVuKTsKKwkgICAgLyogcHJpbnRmICgiUGFja2V0IFJYZWRcbiIpOyAqLworCX0KKwl0cC0+cnhfcmluZ1t0cC0+Y3VyX3J4XS5yeF9zdGF0dXMuYml0cy5vd25fYml0ID0gMTsKKwl0cC0+Y3VyX3J4Kys7CisJdHAtPmN1cl9yeCA9IHRwLT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisgICAgfQorICAgICAgICAvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKyAgICAgICAgb3V0dyhERUZBVUxUX0lOVFIgJiB+SW50clJ4RG9uZSwgbmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsKKworICAgICAgICBJT1NZTkM7CisKKyAgICByZXR1cm4gZ29vZDsKK30KKworc3RhdGljIHZvaWQKK3JoaW5lX3RyYW5zbWl0IChzdHJ1Y3QgbmljICpuaWMsCisJCWNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHAgPSAoc3RydWN0IHJoaW5lX3ByaXZhdGUgKikgbmljLT5wcml2X2RhdGE7CisgICAgaW50IGlvYWRkciA9IHRwLT5pb2FkZHI7CisgICAgaW50IGVudHJ5OworICAgIHVuc2lnbmVkIGNoYXIgQ1IxYmFrOworICAgIHVuc2lnbmVkIGNoYXIgQ1IwYmFrOworICAgIHVuc2lnbmVkIGludCBuc3R5cGU7CisgICAgdW5zaWduZWQgbG9uZyBjdDsKKworCisgICAgLypwcmludGYgKCJyaGluZV90cmFuc21pdFxuIik7ICovCisgICAgLyogc2V0dXAgZXRoZXJuZXQgaGVhZGVyICovCisKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworICAgIGVudHJ5ID0gdHAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworICAgIG1lbWNweSAodHAtPnR4X2J1ZmZzW2VudHJ5XSwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKyAgICBtZW1jcHkgKHRwLT50eF9idWZmc1tlbnRyeV0gKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsJLyogc3JjICovCisgICAgCisgICAgbnN0eXBlPWh0b25zKHQpOworICAgIG1lbWNweSh0cC0+dHhfYnVmZnNbZW50cnldICsgMiAqIEVUSF9BTEVOLCAoY2hhciopJm5zdHlwZSwgMik7CisKKyAgICBtZW1jcHkgKHRwLT50eF9idWZmc1tlbnRyeV0gKyBFVEhfSExFTiwgcCwgcyk7CisgICAgcyArPSBFVEhfSExFTjsKKyAgICB3aGlsZSAocyA8IEVUSF9aTEVOKQorCSooKGNoYXIgKikgdHAtPnR4X2J1ZmZzW2VudHJ5XSArIChzKyspKSA9IDA7CisKKyAgICB0cC0+dHhfcmluZ1tlbnRyeV0udHhfY3RybC5iaXRzLnR4X2J1Zl9zaXplID0gczsKKworICAgIHRwLT50eF9yaW5nW2VudHJ5XS50eF9zdGF0dXMuYml0cy5vd25fYml0ID0gMTsKKworCisgICAgQ1IxYmFrID0gaW5iIChieUNSMSk7CisKKyAgICBDUjFiYWsgPSBDUjFiYWsgfCBDUjFfVERNRDE7CisgICAgLypwcmludGYoInRkc3c9WyVYXSIsdHAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cy5sdyk7ICovCisgICAgLypwcmludGYoInRkY3c9WyVYXSIsdHAtPnR4X3JpbmdbZW50cnldLnR4X2N0cmwubHcpOyAqLworICAgIC8qcHJpbnRmKCJ0ZGJ1ZjE9WyVYXSIsdHAtPnR4X3JpbmdbZW50cnldLmJ1Zl9hZGRyXzEpOyAqLworICAgIC8qcHJpbnRmKCJ0ZGJ1ZjI9WyVYXSIsdHAtPnR4X3JpbmdbZW50cnldLmJ1Zl9hZGRyXzIpOyAqLworICAgIC8qcHJpbnRmKCJ0ZDE9WyVYXSIsaW5sKGR3Q3VycmVudFREU0UwKSk7ICovCisgICAgLypwcmludGYoInRkMj1bJVhdIixpbmwoZHdDdXJyZW50VERTRTEpKTsgKi8KKyAgICAvKnByaW50ZigidGQzPVslWF0iLGlubChkd0N1cnJlbnRURFNFMikpOyAqLworICAgIC8qcHJpbnRmKCJ0ZDQ9WyVYXSIsaW5sKGR3Q3VycmVudFREU0UzKSk7ICovCisKKyAgICBvdXRiIChDUjFiYWssIGJ5Q1IxKTsKKyAgICBkbworICAgIHsKKwljdCA9IGN1cnJ0aWNrcygpOworICAgICAgICAvKiBXYWl0IHVudGlsIHRyYW5zbWl0IGlzIGZpbmlzaGVkIG9yIHRpbWVvdXQqLworICAgICAgICB3aGlsZSgodHAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cy5iaXRzLm93bl9iaXQgIT0wKSAmJgorCQljdCArIDEwKjEwMDAgPCBjdXJydGlja3MoKSkKKyAgICAgICAgOworCisgICAgICAgIGlmKHRwLT50eF9yaW5nW2VudHJ5XS50eF9zdGF0dXMuYml0cy50ZXJyID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZih0cC0+dHhfcmluZ1tlbnRyeV0udHhfc3RhdHVzLmJpdHMuYWJ0ID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHR1cm4gb24gVFgKKyAgICAgICAgICAgIENSMGJhayA9IGluYihieUNSMCk7CisgICAgICAgICAgICBDUjBiYWsgPSBDUjBiYWt8Q1JfVFhPTjsKKyAgICAgICAgICAgIG91dGIoQ1IwYmFrLGJ5Q1IwKTsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICB0cC0+Y3VyX3R4Kys7CisKKyAgICAvKm91dHcoSU1SU2hhZG93LGJ5SU1SMCk7ICovCisgICAgLypkZXZfa2ZyZWVfc2tiKHRwLT50eF9za2J1ZmZbZW50cnldLCBGUkVFX1dSSVRFKTsgKi8KKyAgICAvKnRwLT50eF9za2J1ZmZbZW50cnldID0gMDsgKi8KK30KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyByaGluZV9vcGVyYXRpb25zID0geworCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKKwkucG9sbAkJPSByaGluZV9wb2xsLAorCS50cmFuc21pdAk9IHJoaW5lX3RyYW5zbWl0LAorCS5pcnEJCT0gcmhpbmVfaXJxLAorCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcmhpbmVfbmljc1tdID0geworUENJX1JPTSgweDExMDYsIDB4MzA2NSwgImRsaW5rLTUzMHR4IiwgICAgICJWSUEgNjEwMiIsIDApLAorUENJX1JPTSgweDExMDYsIDB4MzEwNiwgInZpYS1yaGluZS02MTA1IiwgICJWSUEgNjEwNSIsIDApLAorUENJX1JPTSgweDExMDYsIDB4MzA0MywgImRsaW5rLTUzMHR4LW9sZCIsICJWSUEgMzA0MyIsIDApLAkJLyogUmhpbmUtSSA4NmMxMDBhICovCitQQ0lfUk9NKDB4MTEwNiwgMHgzMDUzLCAidmlhNjEwNW0iLCAgICAgICAgIlZJQSA2MTA1TSIsIDApLAorUENJX1JPTSgweDExMDYsIDB4NjEwMCwgInZpYS1yaGluZS1vbGQiLCAgICJWSUEgODZDMTAwQSIsIDApLAkvKiBSaGluZS1JSSAqLworfTsKKworUENJX0RSSVZFUiAoIHJoaW5lX2RyaXZlciwgcmhpbmVfbmljcywgUENJX05PX0NMQVNTICk7CisKK0RSSVZFUiAoICJWSUEgODZDMTAwIiwgbmljX2RyaXZlciwgcGNpX2RyaXZlciwgcmhpbmVfZHJpdmVyLAorCSByaGluZV9wcm9iZSwgcmhpbmVfZGlzYWJsZSApOworCisvKiBFT0YgdmlhLXJoaW5lLmMgKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2MjVhYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCkBAIC0wLDAgKzEsMTkzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgIHZpYS12ZWxvY2l0eS5jOiBFdGhlcmJvb3QgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFZJQSA2MTIwIEdpZ2FiaXQKKyogICAgQ2hhbmdlcyBmb3IgRXRoZXJib290IHBvcnQ6CisqICAgICAgIENvcHlyaWdodCAoYykgMjAwNiBieSBUaW1vdGh5IExlZ2dlIDx0bGVnZ2VAcm9nZXJzLmNvbT4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqICAgIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uOgorKiAgICAgICAgIHZpYS12ZWxvY2l0eS5jOiBWSUEgVmVsb2NpdHkgVlQ2MTIwLCBWVDYxMjIgRXRoZXJuZXQgZHJpdmVyIAorKiAgICAgICAgICAgICBUaGUgY2hhbmdlcyBhcmUgKGMpIENvcHlyaWdodCAyMDA0LCBSZWQgSGF0IEluYy4gCisqICAgICAgICAgICAgICAgIDxhbGFuQHJlZGhhdC5jb20+CisqICAgICAgICAgICAgIEFkZGl0aW9uYWwgZml4ZXMgYW5kIGNsZWFuIHVwOiBGcmFuY29pcyBSb21pZXUKKyoKKyogICAgIE9yaWdpbmFsIGNvZGU6CisqICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LCAyMDAzIFZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLgorKiAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqICAgICAgICAgICAgIEF1dGhvcjogQ2h1YW5nIExpYW5nLVNoaW5nLCBBSiBKaWFuZworKiAKKyogICAgTGludXggRHJpdmVyIFZlcnNpb24gMi42LjE1LjQKKyogCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyoKKyogICAgdjEuMAkwMy0wNi0yMDA2CXRpbWxlZ2dlCUluaXRpYWwgcG9ydCBvZiBMaW51eCBkcml2ZXIKKyogICAgCisqICAgIEluZGVudCBPcHRpb25zOiBpbmRlbnQgLWtyIC1pOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorCisjaW5jbHVkZSAidmlhLXZlbG9jaXR5LmgiCisKK3R5cGVkZWYgaW50IHBjaV9wb3dlcl90OworCisjZGVmaW5lIFBDSV9EMCAgKChpbnQpIDApCisjZGVmaW5lIFBDSV9EMSAgKChpbnQpIDEpCisjZGVmaW5lIFBDSV9EMiAgKChpbnQpIDIpCisjZGVmaW5lIFBDSV9EM2hvdCAgICAgICAoKGludCkgMykKKyNkZWZpbmUgUENJX0QzY29sZCAgICAgICgoaW50KSA0KQorI2RlZmluZSBQQ0lfUE9XRVJfRVJST1IgKChpbnQpIC0xKQorCisKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCisvL0ZJWE1FOiBNb3ZlIHRvIHBjaS5jCitpbnQgcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCBpbnQgc3RhdGUpOworCisvKiBGSVhNRTogTW92ZSBCQVNFIHRvIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworc3RhdGljIHUzMiBCQVNFOworCisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCisjZGVmaW5lIFZFTE9DSVRZX1BBUkFNKE4sRCkgXAorICAgICAgICBzdGF0aWMgY29uc3QgaW50IE5bTUFYX1VOSVRTXT1PUFRJT05fREVGQVVMVDsKKy8qICAgICAgICBNT0RVTEVfUEFSTShOLCAiMS0iIF9fTU9EVUxFX1NUUklORyhNQVhfVU5JVFMpICJpIik7XAorICAgICAgICBNT0RVTEVfUEFSTV9ERVNDKE4sIEQpOyAqLworCitWRUxPQ0lUWV9QQVJBTShSeERlc2NyaXB0b3JzLCAiTnVtYmVyIG9mIHJlY2VpdmUgZGVzY3JpcHRvcnMiKTsKK1ZFTE9DSVRZX1BBUkFNKFR4RGVzY3JpcHRvcnMsICJOdW1iZXIgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcnMiKTsKKworCisjZGVmaW5lIFZMQU5fSURfTUlOICAgICAwCisjZGVmaW5lIFZMQU5fSURfTUFYICAgICA0MDk1CisjZGVmaW5lIFZMQU5fSURfREVGICAgICAwCisvKiBWSURfc2V0dGluZ1tdIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIFZJRCBvZiBOSUMuCisgICAwOiBkZWZhdWx0IFZJRC4KKyAgIDEtNDA5NDogb3RoZXIgVklEcy4KKyovCitWRUxPQ0lUWV9QQVJBTShWSURfc2V0dGluZywgIjgwMi4xUSBWTEFOIElEIik7CisKKyNkZWZpbmUgUlhfVEhSRVNIX01JTiAgIDAKKyNkZWZpbmUgUlhfVEhSRVNIX01BWCAgIDMKKyNkZWZpbmUgUlhfVEhSRVNIX0RFRiAgIDAKKy8qIHJ4X3RocmVzaFtdIGlzIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSByZWNlaXZlIGZpZm8gdGhyZXNob2xkLgorICAgMDogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgMTI4IGJ5dGVzLgorICAgMTogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgNTEyIGJ5dGVzLgorICAgMjogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgMTAyNCBieXRlcy4KKyAgIDM6IGluZGljYXRlIHRoZSByeGZpZm8gdGhyZXNob2xkIGlzIHN0b3JlICYgZm9yd2FyZC4KKyovCitWRUxPQ0lUWV9QQVJBTShyeF90aHJlc2gsICJSZWNlaXZlIGZpZm8gdGhyZXNob2xkIik7CisKKyNkZWZpbmUgRE1BX0xFTkdUSF9NSU4gIDAKKyNkZWZpbmUgRE1BX0xFTkdUSF9NQVggIDcKKyNkZWZpbmUgRE1BX0xFTkdUSF9ERUYgIDAKKworLyogRE1BX2xlbmd0aFtdIGlzIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBETUEgbGVuZ3RoCisgICAwOiA4IERXT1JEcworICAgMTogMTYgRFdPUkRzCisgICAyOiAzMiBEV09SRHMKKyAgIDM6IDY0IERXT1JEcworICAgNDogMTI4IERXT1JEcworICAgNTogMjU2IERXT1JEcworICAgNjogU0YoZmx1c2ggdGlsbCBlbXBseSkKKyAgIDc6IFNGKGZsdXNoIHRpbGwgZW1wbHkpCisqLworVkVMT0NJVFlfUEFSQU0oRE1BX2xlbmd0aCwgIkRNQSBsZW5ndGgiKTsKKworI2RlZmluZSBUQUdHSU5HX0RFRiAgICAgMAorLyogZW5hYmxlX3RhZ2dpbmdbXSBpcyB1c2VkIGZvciBlbmFibGluZyA4MDIuMVEgVklEIHRhZ2dpbmcuCisgICAwOiBkaXNhYmxlIFZJRCBzZWV0aW5nKGRlZmF1bHQpLgorICAgMTogZW5hYmxlIFZJRCBzZXR0aW5nLgorKi8KK1ZFTE9DSVRZX1BBUkFNKGVuYWJsZV90YWdnaW5nLCAiRW5hYmxlIDgwMi4xUSB0YWdnaW5nIik7CisKKyNkZWZpbmUgSVBfQUxJR19ERUYgICAgIDAKKy8qIElQX2J5dGVfYWxpZ25bXSBpcyB1c2VkIGZvciBJUCBoZWFkZXIgRFdPUkQgYnl0ZSBhbGlnbmVkCisgICAwOiBpbmRpY2F0ZSB0aGUgSVAgaGVhZGVyIHdvbid0IGJlIERXT1JEIGJ5dGUgYWxpZ25lZC4oRGVmYXVsdCkgLgorICAgMTogaW5kaWNhdGUgdGhlIElQIGhlYWRlciB3aWxsIGJlIERXT1JEIGJ5dGUgYWxpZ25lZC4KKyAgICAgIEluIHNvbWUgZW52aXJvbWVudCwgdGhlIElQIGhlYWRlciBzaG91bGQgYmUgRFdPUkQgYnl0ZSBhbGlnbmVkLAorICAgICAgb3IgdGhlIHBhY2tldCB3aWxsIGJlIGRyb3BlZCB3aGVuIHdlIHJlY2VpdmUgaXQuIChlZzogSVBWUykKKyovCitWRUxPQ0lUWV9QQVJBTShJUF9ieXRlX2FsaWduLCAiRW5hYmxlIElQIGhlYWRlciBkd29yZCBhbGlnbmVkIik7CisKKyNkZWZpbmUgVFhfQ1NVTV9ERUYgICAgIDEKKy8qIHR4Y3N1bV9vZmZsb2FkW10gaXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgY2hlY2tzdW0gb2ZmbG9hZCBhYmlsaXR5IG9mIE5JQy4KKyAgIChXZSBvbmx5IHN1cHBvcnQgUlggY2hlY2tzdW0gb2ZmbG9hZCBub3cpCisgICAwOiBkaXNhYmxlIGNzdW1fb2ZmbG9hZFtjaGVja3N1bSBvZmZsb2FkCisgICAxOiBlbmFibGUgY2hlY2tzdW0gb2ZmbG9hZC4gKERlZmF1bHQpCisqLworVkVMT0NJVFlfUEFSQU0odHhjc3VtX29mZmxvYWQsICJFbmFibGUgdHJhbnNtaXQgcGFja2V0IGNoZWNrc3VtIG9mZmxvYWQiKTsKKworI2RlZmluZSBGTE9XX0NOVExfREVGICAgMQorI2RlZmluZSBGTE9XX0NOVExfTUlOICAgMQorI2RlZmluZSBGTE9XX0NOVExfTUFYICAgNQorCisvKiBmbG93X2NvbnRyb2xbXSBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBmbG93IGNvbnRyb2wgYWJpbGl0eSBvZiBOSUMuCisgICAxOiBoYXJkd2FyZSBkZWFmdWx0IC0gQVVUTyAoZGVmYXVsdCkuIFVzZSBIYXJkd2FyZSBkZWZhdWx0IHZhbHVlIGluIEFOQVIuCisgICAyOiBlbmFibGUgVFggZmxvdyBjb250cm9sLgorICAgMzogZW5hYmxlIFJYIGZsb3cgY29udHJvbC4KKyAgIDQ6IGVuYWJsZSBSWC9UWCBmbG93IGNvbnRyb2wuCisgICA1OiBkaXNhYmxlCisqLworVkVMT0NJVFlfUEFSQU0oZmxvd19jb250cm9sLCAiRW5hYmxlIGZsb3cgY29udHJvbCBhYmlsaXR5Iik7CisKKyNkZWZpbmUgTUVEX0xOS19ERUYgMAorI2RlZmluZSBNRURfTE5LX01JTiAwCisjZGVmaW5lIE1FRF9MTktfTUFYIDQKKy8qIHNwZWVkX2R1cGxleFtdIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBvZiBOSUMuCisgICAwOiBpbmRpY2F0ZSBhdXRvbmVnb3RpYXRpb24gZm9yIGJvdGggc3BlZWQgYW5kIGR1cGxleCBtb2RlCisgICAxOiBpbmRpY2F0ZSAxMDBNYnBzIGhhbGYgZHVwbGV4IG1vZGUKKyAgIDI6IGluZGljYXRlIDEwME1icHMgZnVsbCBkdXBsZXggbW9kZQorICAgMzogaW5kaWNhdGUgMTBNYnBzIGhhbGYgZHVwbGV4IG1vZGUKKyAgIDQ6IGluZGljYXRlIDEwTWJwcyBmdWxsIGR1cGxleCBtb2RlCisKKyAgIE5vdGU6CisgICAgICAgIGlmIEVFUFJPTSBoYXZlIGJlZW4gc2V0IHRvIHRoZSBmb3JjZSBtb2RlLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkCisgICAgICAgICAgICBieSBkcml2ZXIuCisqLworVkVMT0NJVFlfUEFSQU0oc3BlZWRfZHVwbGV4LCAiU2V0dGluZyB0aGUgc3BlZWQgYW5kIGR1cGxleCBtb2RlIik7CisKKyNkZWZpbmUgVkFMX1BLVF9MRU5fREVGICAgICAwCisvKiBWYWxQa3RMZW5bXSBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBjaGVja3N1bSBvZmZsb2FkIGFiaWxpdHkgb2YgTklDLgorICAgMDogUmVjZWl2ZSBmcmFtZSB3aXRoIGludmFsaWQgbGF5ZXIgMiBsZW5ndGggKERlZmF1bHQpCisgICAxOiBEcm9wIGZyYW1lIHdpdGggaW52YWxpZCBsYXllciAyIGxlbmd0aAorKi8KK1ZFTE9DSVRZX1BBUkFNKFZhbFBrdExlbiwgIlJlY2VpdmluZyBvciBEcm9wIGludmFsaWQgODAyLjMgZnJhbWUiKTsKKworI2RlZmluZSBXT0xfT1BUX0RFRiAgICAgMAorI2RlZmluZSBXT0xfT1BUX01JTiAgICAgMAorI2RlZmluZSBXT0xfT1BUX01BWCAgICAgNworLyogd29sX29wdHNbXSBpcyB1c2VkIGZvciBjb250cm9sbGluZyB3YWtlIG9uIGxhbiBiZWhhdmlvci4KKyAgIDA6IFdha2UgdXAgaWYgcmVjZXZpZWQgYSBtYWdpYyBwYWNrZXQuIChEZWZhdWx0KQorICAgMTogV2FrZSB1cCBpZiBsaW5rIHN0YXR1cyBpcyBvbi9vZmYuCisgICAyOiBXYWtlIHVwIGlmIHJlY2V2aWVkIGFuIGFycCBwYWNrZXQuCisgICA0OiBXYWtlIHVwIGlmIHJlY2V2aWVkIGFueSB1bmljYXN0IHBhY2tldC4KKyAgIFRob3NlIHZhbHVlIGNhbiBiZSBzdW1lZCB1cCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgb3B0aW9uLgorKi8KK1ZFTE9DSVRZX1BBUkFNKHdvbF9vcHRzLCAiV2FrZSBPbiBMYW4gb3B0aW9ucyIpOworCisjZGVmaW5lIElOVF9XT1JLU19ERUYgICAyMAorI2RlZmluZSBJTlRfV09SS1NfTUlOICAgMTAKKyNkZWZpbmUgSU5UX1dPUktTX01BWCAgIDY0CisKK1ZFTE9DSVRZX1BBUkFNKGludF93b3JrcywgIk51bWJlciBvZiBwYWNrZXRzIHBlciBpbnRlcnJ1cHQgc2VydmljZXMiKTsKKworLyogVGhlIGRlc2NyaXB0b3JzIGZvciB0aGlzIGNhcmQgYXJlIHJlcXVpcmVkIHRvIGJlIGFsaWduZWQgb24KKzY0IGJ5dGUgYm91bmRhcmllcy4gIEFzIHRoZSBhbGlnbiBhdHRyaWJ1dGUgZG9lcyBub3QgZ3VhcmFudGVlIGFsaWdubWVudAorZ3JlYXRlciB0aGFuIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHN0YXJ0IGFkZHJlc3MgKHdoaWNoIGZvciBFdGhlcmJvb3QKK2lzIDE2IGJ5dGVzIG9mIGFsaWdubWVudCkgaXQgcmVxdWlyZXMgc29tZSBleHRyYSBzdGVwcy4gIEFkZCA2NCB0byB0aGUgCitzaXplIG9mIHRoZSBhcnJheSBhbmQgdGhlIGluaXRfcmluZyBhZGp1c3RzIHRoZSBhbGlnbm1lbnQgKi8KKworLyogRGVmaW5lIHRoZSBUWCBEZXNjcmlwdG9yICovCitzdGF0aWMgdTggdHhfcmluZ1tUWF9ERVNDX0RFRiAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKyA2NF07CisKKy8qIENyZWF0ZSBhIHN0YXRpYyBidWZmZXIgb2Ygc2l6ZSBQS1RfQlVGX1NaIGZvciBlYWNoIFRYIERlc2NyaXB0b3IuICAKK0FsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhIHBhcnQgb2YgdGhpcyBidWZmZXIgKi8KK3N0YXRpYyB1OCB0eGJbKFRYX0RFU0NfREVGICogUEtUX0JVRl9TWikgKyA2NF07CisKKy8qIERlZmluZSB0aGUgUlggRGVzY3JpcHRvciAqLworc3RhdGljIHU4IHJ4X3JpbmdbUlhfREVTQ19ERUYgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICsgNjRdOworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUEtUX0JVRl9TWiBmb3IgZWFjaCBSWCBEZXNjcmlwdG9yCisgICBBbGwgZGVzY3JpcHRvcnMgcG9pbnQgdG8gYSBwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdTggcnhiWyhSWF9ERVNDX0RFRiAqIFBLVF9CVUZfU1opICsgNjRdOworCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9pbml0X2luZm8oc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYsCisJCQkgICAgICAgc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsCisJCQkgICAgICAgc3RydWN0IHZlbG9jaXR5X2luZm9fdGJsICppbmZvKTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfZ2V0X3BjaV9pbmZvKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICosCisJCQkJIHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfb3BlbihzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOworCitzdGF0aWMgaW50IHZlbG9jaXR5X3NvZnRfcmVzZXQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpOworc3RhdGljIHZvaWQgdmVsb2NpdHlfaW5pdF9jYW1fZmlsdGVyKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKTsKK3N0YXRpYyB2b2lkIG1paV9pbml0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCB1MzIgbWlpX3N0YXR1cyk7CitzdGF0aWMgdTMyIHZlbG9jaXR5X2dldF9vcHRfbWVkaWFfbW9kZShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9wcmludF9saW5rX3N0YXR1cyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCBzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsKHN0cnVjdCBtYWNfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBlbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpOworc3RhdGljIHZvaWQgZW5hYmxlX21paV9hdXRvcG9sbChzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCB2ZWxvY2l0eV9taWlfcmVhZChzdHJ1Y3QgbWFjX3JlZ3MgKiwgdTggYnlJZHgsIHUxNiAqIHBkYXRhKTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfbWlpX3dyaXRlKHN0cnVjdCBtYWNfcmVncyAqLCB1OCBieU1paUFkZHIsIHUxNiBkYXRhKTsKK3N0YXRpYyB1MzIgbWlpX2NoZWNrX21lZGlhX21vZGUoc3RydWN0IG1hY19yZWdzICpyZWdzKTsKK3N0YXRpYyB1MzIgY2hlY2tfY29ubmVjdGlvbl90eXBlKHN0cnVjdCBtYWNfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHZlbG9jaXR5X3NldF9tZWRpYV9tb2RlKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLAorCQkJCSAgIHUzMiBtaWlfc3RhdHVzKTsKKworCisvKgorICoJSW50ZXJuYWwgYm9hcmQgdmFyaWFudHMuIEF0IHRoZSBtb21lbnQgd2UgaGF2ZSBvbmx5IG9uZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgdmVsb2NpdHlfaW5mb190YmwgY2hpcF9pbmZvX3RhYmxlW10gPSB7CisJe0NISVBfVFlQRV9WVDYxMTAsCisJICJWSUEgTmV0d29ya2luZyBWZWxvY2l0eSBGYW1pbHkgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyIiwgMjU2LCAxLAorCSAweDAwRkZGRkZGVUx9LAorCXswLCBOVUxMLCAwLCAwLCAwfQorfTsKKworLyoqCisgKgl2ZWxvY2l0eV9zZXRfaW50X29wdAktCXBhcnNlciBmb3IgaW50ZWdlciBvcHRpb25zCisgKglAb3B0OiBwb2ludGVyIHRvIG9wdGlvbiB2YWx1ZQorICoJQHZhbDogdmFsdWUgdGhlIHVzZXIgcmVxdWVzdGVkIChvciAtMSBmb3IgZGVmYXVsdCkKKyAqCUBtaW46IGxvd2VzdCB2YWx1ZSBhbGxvd2VkCisgKglAbWF4OiBoaWdoZXN0IHZhbHVlIGFsbG93ZWQKKyAqCUBkZWY6IGRlZmF1bHQgdmFsdWUKKyAqCUBuYW1lOiBwcm9wZXJ0eSBuYW1lCisgKglAZGV2OiBkZXZpY2UgbmFtZQorICoKKyAqCVNldCBhbiBpbnRlZ2VyIHByb3BlcnR5IGluIHRoZSBtb2R1bGUgb3B0aW9ucy4gVGhpcyBmdW5jdGlvbiBkb2VzCisgKglhbGwgdGhlIHZlcmlmaWNhdGlvbiBhbmQgY2hlY2tpbmcgYXMgd2VsbCBhcyByZXBvcnRpbmcgc28gdGhhdAorICoJd2UgZG9uJ3QgZHVwbGljYXRlIGNvZGUgZm9yIGVhY2ggb3B0aW9uLgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3NldF9pbnRfb3B0KGludCAqb3B0LCBpbnQgdmFsLCBpbnQgbWluLCBpbnQgbWF4LAorCQkJCSBpbnQgZGVmLCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZXZuYW1lKQoreworCWlmICh2YWwgPT0gLTEpIHsKKwkJcHJpbnRmKCIlczogc2V0IHZhbHVlIG9mIHBhcmFtZXRlciAlcyB0byAlZFxuIiwKKwkJICAgICAgIGRldm5hbWUsIG5hbWUsIGRlZik7CisJCSpvcHQgPSBkZWY7CisJfSBlbHNlIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSB7CisJCXByaW50ZgorCQkgICAgKCIlczogdGhlIHZhbHVlIG9mIHBhcmFtZXRlciAlcyBpcyBpbnZhbGlkLCB0aGUgdmFsaWQgcmFuZ2UgaXMgKCVkLSVkKVxuIiwKKwkJICAgICBkZXZuYW1lLCBuYW1lLCBtaW4sIG1heCk7CisJCSpvcHQgPSBkZWY7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlczogc2V0IHZhbHVlIG9mIHBhcmFtZXRlciAlcyB0byAlZFxuIiwKKwkJICAgICAgIGRldm5hbWUsIG5hbWUsIHZhbCk7CisJCSpvcHQgPSB2YWw7CisJfQorfQorCisvKioKKyAqCXZlbG9jaXR5X3NldF9ib29sX29wdAktCXBhcnNlciBmb3IgYm9vbGVhbiBvcHRpb25zCisgKglAb3B0OiBwb2ludGVyIHRvIG9wdGlvbiB2YWx1ZQorICoJQHZhbDogdmFsdWUgdGhlIHVzZXIgcmVxdWVzdGVkIChvciAtMSBmb3IgZGVmYXVsdCkKKyAqCUBkZWY6IGRlZmF1bHQgdmFsdWUgKHllcy9ubykKKyAqCUBmbGFnOiBudW1lcmljIHZhbHVlIHRvIHNldCBmb3IgdHJ1ZS4KKyAqCUBuYW1lOiBwcm9wZXJ0eSBuYW1lCisgKglAZGV2OiBkZXZpY2UgbmFtZQorICoKKyAqCVNldCBhIGJvb2xlYW4gcHJvcGVydHkgaW4gdGhlIG1vZHVsZSBvcHRpb25zLiBUaGlzIGZ1bmN0aW9uIGRvZXMKKyAqCWFsbCB0aGUgdmVyaWZpY2F0aW9uIGFuZCBjaGVja2luZyBhcyB3ZWxsIGFzIHJlcG9ydGluZyBzbyB0aGF0CisgKgl3ZSBkb24ndCBkdXBsaWNhdGUgY29kZSBmb3IgZWFjaCBvcHRpb24uCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KHUzMiAqIG9wdCwgaW50IHZhbCwgaW50IGRlZiwgdTMyIGZsYWcsCisJCQkJICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZXZuYW1lKQoreworCSgqb3B0KSAmPSAofmZsYWcpOworCWlmICh2YWwgPT0gLTEpIHsKKwkJcHJpbnRmKCIlczogc2V0IHBhcmFtZXRlciAlcyB0byAlc1xuIiwKKwkJICAgICAgIGRldm5hbWUsIG5hbWUsIGRlZiA/ICJUUlVFIiA6ICJGQUxTRSIpOworCQkqb3B0IHw9IChkZWYgPyBmbGFnIDogMCk7CisJfSBlbHNlIGlmICh2YWwgPCAwIHx8IHZhbCA+IDEpIHsKKwkJcHJpbnRmCisJCSAgICAoIiVzOiB0aGUgdmFsdWUgb2YgcGFyYW1ldGVyICVzIGlzIGludmFsaWQsIHRoZSB2YWxpZCByYW5nZSBpcyAoMC0xKVxuIiwKKwkJICAgICBkZXZuYW1lLCBuYW1lKTsKKwkJKm9wdCB8PSAoZGVmID8gZmxhZyA6IDApOworCX0gZWxzZSB7CisJCXByaW50ZigiJXM6IHNldCBwYXJhbWV0ZXIgJXMgdG8gJXNcbiIsCisJCSAgICAgICBkZXZuYW1lLCBuYW1lLCB2YWwgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKwkJKm9wdCB8PSAodmFsID8gZmxhZyA6IDApOworCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9nZXRfb3B0aW9ucwktCXNldCBvcHRpb25zIG9uIGRldmljZQorICoJQG9wdHM6IG9wdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKyAqCUBpbmRleDogaW5kZXggb2Ygb3B0aW9uIHRvIHVzZSBpbiBtb2R1bGUgb3B0aW9ucyBhcnJheQorICoJQGRldm5hbWU6IGRldmljZSBuYW1lCisgKgorICoJVHVybiB0aGUgbW9kdWxlIGFuZCBjb21tYW5kIG9wdGlvbnMgaW50byBhIHNpbmdsZSBzdHJ1Y3R1cmUKKyAqCWZvciB0aGUgY3VycmVudCBkZXZpY2UKKyAqLworCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9nZXRfb3B0aW9ucyhzdHJ1Y3QgdmVsb2NpdHlfb3B0ICpvcHRzLCBpbnQgaW5kZXgsCisJCQkJIGNvbnN0IGNoYXIgKmRldm5hbWUpCit7CisKKwkvKiBGSVhNRSBEbyB0aGUgb3B0aW9ucyBuZWVkIHRvIGJlIGNvbmZpZ3VyYWJsZSAqLworCXZlbG9jaXR5X3NldF9pbnRfb3B0KCZvcHRzLT5yeF90aHJlc2gsIC0xLCBSWF9USFJFU0hfTUlOLAorCQkJICAgICBSWF9USFJFU0hfTUFYLCBSWF9USFJFU0hfREVGLCAicnhfdGhyZXNoIiwKKwkJCSAgICAgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoJm9wdHMtPkRNQV9sZW5ndGgsIERNQV9sZW5ndGhbaW5kZXhdLAorCQkJICAgICBETUFfTEVOR1RIX01JTiwgRE1BX0xFTkdUSF9NQVgsCisJCQkgICAgIERNQV9MRU5HVEhfREVGLCAiRE1BX2xlbmd0aCIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KCZvcHRzLT5udW1yeCwgUnhEZXNjcmlwdG9yc1tpbmRleF0sCisJCQkgICAgIFJYX0RFU0NfTUlOLCBSWF9ERVNDX01BWCwgUlhfREVTQ19ERUYsCisJCQkgICAgICJSeERlc2NyaXB0b3JzIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoJm9wdHMtPm51bXR4LCBUeERlc2NyaXB0b3JzW2luZGV4XSwKKwkJCSAgICAgVFhfREVTQ19NSU4sIFRYX0RFU0NfTUFYLCBUWF9ERVNDX0RFRiwKKwkJCSAgICAgIlR4RGVzY3JpcHRvcnMiLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgmb3B0cy0+dmlkLCBWSURfc2V0dGluZ1tpbmRleF0sIFZMQU5fSURfTUlOLAorCQkJICAgICBWTEFOX0lEX01BWCwgVkxBTl9JRF9ERUYsICJWSURfc2V0dGluZyIsCisJCQkgICAgIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9ib29sX29wdCgmb3B0cy0+ZmxhZ3MsIGVuYWJsZV90YWdnaW5nW2luZGV4XSwKKwkJCSAgICAgIFRBR0dJTkdfREVGLCBWRUxPQ0lUWV9GTEFHU19UQUdHSU5HLAorCQkJICAgICAgImVuYWJsZV90YWdnaW5nIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KCZvcHRzLT5mbGFncywgdHhjc3VtX29mZmxvYWRbaW5kZXhdLAorCQkJICAgICAgVFhfQ1NVTV9ERUYsIFZFTE9DSVRZX0ZMQUdTX1RYX0NTVU0sCisJCQkgICAgICAidHhjc3VtX29mZmxvYWQiLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgmb3B0cy0+Zmxvd19jbnRsLCBmbG93X2NvbnRyb2xbaW5kZXhdLAorCQkJICAgICBGTE9XX0NOVExfTUlOLCBGTE9XX0NOVExfTUFYLCBGTE9XX0NOVExfREVGLAorCQkJICAgICAiZmxvd19jb250cm9sIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KCZvcHRzLT5mbGFncywgSVBfYnl0ZV9hbGlnbltpbmRleF0sCisJCQkgICAgICBJUF9BTElHX0RFRiwgVkVMT0NJVFlfRkxBR1NfSVBfQUxJR04sCisJCQkgICAgICAiSVBfYnl0ZV9hbGlnbiIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9ib29sX29wdCgmb3B0cy0+ZmxhZ3MsIFZhbFBrdExlbltpbmRleF0sCisJCQkgICAgICBWQUxfUEtUX0xFTl9ERUYsIFZFTE9DSVRZX0ZMQUdTX1ZBTF9QS1RfTEVOLAorCQkJICAgICAgIlZhbFBrdExlbiIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KCh2b2lkICopICZvcHRzLT5zcGRfZHB4LCBzcGVlZF9kdXBsZXhbaW5kZXhdLAorCQkJICAgICBNRURfTE5LX01JTiwgTUVEX0xOS19NQVgsIE1FRF9MTktfREVGLAorCQkJICAgICAiTWVkaWEgbGluayBtb2RlIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoKGludCAqKSAmb3B0cy0+d29sX29wdHMsIHdvbF9vcHRzW2luZGV4XSwKKwkJCSAgICAgV09MX09QVF9NSU4sIFdPTF9PUFRfTUFYLCBXT0xfT1BUX0RFRiwKKwkJCSAgICAgIldha2UgT24gTGFuIG9wdGlvbnMiLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgoaW50ICopICZvcHRzLT5pbnRfd29ya3MsIGludF93b3Jrc1tpbmRleF0sCisJCQkgICAgIElOVF9XT1JLU19NSU4sIElOVF9XT1JLU19NQVgsIElOVF9XT1JLU19ERUYsCisJCQkgICAgICJJbnRlcnJ1cHQgc2VydmljZSB3b3JrcyIsIGRldm5hbWUpOworCW9wdHMtPm51bXJ4ID0gKG9wdHMtPm51bXJ4ICYgfjMpOworfQorCisvKioKKyAqCXZlbG9jaXR5X2luaXRfY2FtX2ZpbHRlcgktCWluaXRpYWxpc2UgQ0FNCisgKglAdnB0cjogdmVsb2NpdHkgdG8gcHJvZ3JhbQorICoKKyAqCUluaXRpYWxpemUgdGhlIGNvbnRlbnQgYWRkcmVzc2FibGUgbWVtb3J5IHVzZWQgZm9yIGZpbHRlcnMuIExvYWQKKyAqCWFwcHJvcHJpYXRlbHkgYWNjb3JkaW5nIHRvIHRoZSBwcmVzZW5jZSBvZiBWTEFOCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfaW5pdF9jYW1fZmlsdGVyKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBtYWNfcmVncyAqcmVncyA9IHZwdHItPm1hY19yZWdzOworCisJLyogVHVybiBvbiBNQ0ZHX1BRRU4sIHR1cm4gb2ZmIE1DRkdfUlRHT1BUICovCisJV09SRF9SRUdfQklUU19TRVQoTUNGR19QUUVOLCBNQ0ZHX1JUR09QVCwgJnJlZ3MtPk1DRkcpOworCVdPUkRfUkVHX0JJVFNfT04oTUNGR19WSURGUiwgJnJlZ3MtPk1DRkcpOworCisJLyogRGlzYWJsZSBhbGwgQ0FNcyAqLworCW1lbXNldCh2cHRyLT52Q0FNbWFzaywgMCwgc2l6ZW9mKHU4KSAqIDgpOworCW1lbXNldCh2cHRyLT5tQ0FNbWFzaywgMCwgc2l6ZW9mKHU4KSAqIDgpOworCW1hY19zZXRfY2FtX21hc2socmVncywgdnB0ci0+dkNBTW1hc2ssIFZFTE9DSVRZX1ZMQU5fSURfQ0FNKTsKKwltYWNfc2V0X2NhbV9tYXNrKHJlZ3MsIHZwdHItPm1DQU1tYXNrLCBWRUxPQ0lUWV9NVUxUSUNBU1RfQ0FNKTsKKworCS8qIEVuYWJsZSBmaXJzdCBWQ0FNICovCisJaWYgKHZwdHItPmZsYWdzICYgVkVMT0NJVFlfRkxBR1NfVEFHR0lORykgeworCQkvKiBJZiBUYWdnaW5nIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBWTEFOIElEIGlzIG5vdCB6ZXJvLCB0aGVuCisJCSAgIHR1cm4gb24gTUNGR19SVEdPUFQgYWxzbyAqLworCQlpZiAodnB0ci0+b3B0aW9ucy52aWQgIT0gMCkKKwkJCVdPUkRfUkVHX0JJVFNfT04oTUNGR19SVEdPUFQsICZyZWdzLT5NQ0ZHKTsKKworCQltYWNfc2V0X2NhbShyZWdzLCAwLCAodTggKikgJiAodnB0ci0+b3B0aW9ucy52aWQpLAorCQkJICAgIFZFTE9DSVRZX1ZMQU5fSURfQ0FNKTsKKwkJdnB0ci0+dkNBTW1hc2tbMF0gfD0gMTsKKwkJbWFjX3NldF9jYW1fbWFzayhyZWdzLCB2cHRyLT52Q0FNbWFzaywKKwkJCQkgVkVMT0NJVFlfVkxBTl9JRF9DQU0pOworCX0gZWxzZSB7CisJCXUxNiB0ZW1wID0gMDsKKwkJbWFjX3NldF9jYW0ocmVncywgMCwgKHU4ICopICYgdGVtcCwgVkVMT0NJVFlfVkxBTl9JRF9DQU0pOworCQl0ZW1wID0gMTsKKwkJbWFjX3NldF9jYW1fbWFzayhyZWdzLCAodTggKikgJiB0ZW1wLAorCQkJCSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmVsb2NpdHlfZ2l2ZV9tYW55X3J4X2Rlc2NzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBtYWNfcmVncyAqcmVncyA9IHZwdHItPm1hY19yZWdzOworCWludCBhdmFpbCwgZGlydHksIHVudXNhYmxlOworCisJLyoKKwkgKiBSRCBudW1iZXIgbXVzdCBiZSBlcXVhbCB0byA0WCBwZXIgaGFyZHdhcmUgc3BlYworCSAqIChwcm9ncmFtbWluZyBndWlkZSByZXYgMS4yMCwgcC4xMykKKwkgKi8KKwlpZiAodnB0ci0+cmRfZmlsbGVkIDwgNCkKKwkJcmV0dXJuOworCisJd21iKCk7CisKKwl1bnVzYWJsZSA9IHZwdHItPnJkX2ZpbGxlZCAmIDB4MDAwMzsKKwlkaXJ0eSA9IHZwdHItPnJkX2RpcnR5IC0gdW51c2FibGU7CisJZm9yIChhdmFpbCA9IHZwdHItPnJkX2ZpbGxlZCAmIDB4ZmZmYzsgYXZhaWw7IGF2YWlsLS0pIHsKKwkJZGlydHkgPSAoZGlydHkgPiAwKSA/IGRpcnR5IC0gMSA6IHZwdHItPm9wdGlvbnMubnVtcnggLSAxOworLy8gICAgICAgICAgICAgIHByaW50ZigicmV0dXJuIGRpcnR5OiAlZFxuIiwgZGlydHkpOworCQl2cHRyLT5yZF9yaW5nW2RpcnR5XS5yZGVzYzAub3duZXIgPSBPV05FRF9CWV9OSUM7CisJfQorCisJd3JpdGV3KHZwdHItPnJkX2ZpbGxlZCAmIDB4ZmZmYywgJnJlZ3MtPlJCUkRVKTsKKwl2cHRyLT5yZF9maWxsZWQgPSB1bnVzYWJsZTsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9yeF9yZWZpbGwoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJaW50IGRpcnR5ID0gdnB0ci0+cmRfZGlydHksIGRvbmUgPSAwLCByZXQgPSAwOworCisvLyAgICAgIHByaW50ZigicnhfcmVmaWxsIC0gcmRfY3VyciA9ICVkLCBkaXJ0eSA9ICVkXG4iLCB2cHRyLT5yZF9jdXJyLCBkaXJ0eSk7CisJZG8geworCQlzdHJ1Y3QgcnhfZGVzYyAqcmQgPSB2cHRyLT5yZF9yaW5nICsgZGlydHk7CisKKwkJLyogRmluZSBmb3IgYW4gYWxsIHplcm8gUnggZGVzYyBhdCBpbml0IHRpbWUgYXMgd2VsbCAqLworCQlpZiAocmQtPnJkZXNjMC5vd25lciA9PSBPV05FRF9CWV9OSUMpCisJCQlicmVhazsKKy8vICAgICAgICAgICAgICBwcmludGYoInJ4X3JlZmlsbCAtIGFmdGVyIG93bmVyICVkXG4iLCBkaXJ0eSk7CisKKwkJcmQtPmludGVuID0gMTsKKwkJcmQtPnBhX2hpZ2ggPSAwOworCQlyZC0+cmRlc2MwLmxlbiA9IGNwdV90b19sZTMyKHZwdHItPnJ4X2J1Zl9zeik7OworCisJCWRvbmUrKzsKKwkJZGlydHkgPSAoZGlydHkgPCB2cHRyLT5vcHRpb25zLm51bXJ4IC0gMSkgPyBkaXJ0eSArIDEgOiAwOworCX0gd2hpbGUgKGRpcnR5ICE9IHZwdHItPnJkX2N1cnIpOworCisJaWYgKGRvbmUpIHsKKy8vICAgICAgICAgICAgICBwcmludGYoIlxuR2l2ZSBCYWNrIERlc2NcbiIpOworCQl2cHRyLT5yZF9kaXJ0eSA9IGRpcnR5OworCQl2cHRyLT5yZF9maWxsZWQgKz0gZG9uZTsKKwkJdmVsb2NpdHlfZ2l2ZV9tYW55X3J4X2Rlc2NzKHZwdHIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2V4dGVybiB2b2lkIGhleF9kdW1wKGNvbnN0IGNoYXIgKmRhdGEsIGNvbnN0IHVuc2lnbmVkIGludCBsZW4pOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB2ZWxvY2l0eV9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworCS8qIFdvcmsgb3V0IHdoZXRoZXIgb3Igbm90IHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvCisJICogcmVhZC4gIFJldHVybiAwIGlmIG5vdC4KKwkgKi8KKworCWludCByZF9jdXJyID0gdnB0ci0+cmRfY3VyciAlIFJYX0RFU0NfREVGOworCXN0cnVjdCByeF9kZXNjICpyZCA9ICYodnB0ci0+cmRfcmluZ1tyZF9jdXJyXSk7CisKKwlpZiAocmQtPnJkZXNjMC5vd25lciA9PSBPV05FRF9CWV9OSUMpCisJCXJldHVybiAwOworCXJtYigpOworCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKwkvKgorCSAqICAgICAgRG9uJ3QgZHJvcCBDRSBvciBSTCBlcnJvciBmcmFtZSBhbHRob3VnaCBSWE9LIGlzIG9mZgorCSAqLworCWlmICgocmQtPnJkZXNjMC5SU1IgJiBSU1JfUlhPSykKKwkgICAgfHwgKCEocmQtPnJkZXNjMC5SU1IgJiBSU1JfUlhPSykKKwkJJiYgKHJkLT5yZGVzYzAuUlNSICYgKFJTUl9DRSB8IFJTUl9STCkpKSkgeworCisJCW5pYy0+cGFja2V0bGVuID0gcmQtPnJkZXNjMC5sZW47CisJCS8vIHB0ci0+cnhiICsgKHJkX2N1cnIgKiBQS1RfQlVGX1NaKQorCQltZW1jcHkobmljLT5wYWNrZXQsIGJ1c190b192aXJ0KHJkLT5wYV9sb3cpLAorCQkgICAgICAgbmljLT5wYWNrZXRsZW4gLSA0KTsKKworCQl2cHRyLT5yZF9jdXJyKys7CisJCXZwdHItPnJkX2N1cnIgPSB2cHRyLT5yZF9jdXJyICUgUlhfREVTQ19ERUY7CisJCXZlbG9jaXR5X3J4X3JlZmlsbCh2cHRyKTsKKwkJcmV0dXJuIDE7CS8qIFJlbW92ZSB0aGlzIGxpbmUgb25jZSB0aGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCAqLworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBUWF9USU1FT1VUICAoMTAwMCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdmVsb2NpdHlfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkZXN0LAkvKiBEZXN0aW5hdGlvbiAqLworCQkJICAgICAgdW5zaWduZWQgaW50IHR5cGUsCS8qIFR5cGUgKi8KKwkJCSAgICAgIHVuc2lnbmVkIGludCBzaXplLAkvKiBzaXplICovCisJCQkgICAgICBjb25zdCBjaGFyICpwYWNrZXQpCit7CQkJCS8qIFBhY2tldCAqLworCXUxNiBuc3R5cGU7CisJdTMyIHRvOworCXU4ICpwdHhiOworCXVuc2lnbmVkIGludCBwa3RsZW47CisJc3RydWN0IHR4X2Rlc2MgKnRkX3B0cjsKKworCWludCBlbnRyeSA9IHZwdHItPnRkX2N1cnIgJSBUWF9ERVNDX0RFRjsKKwl0ZF9wdHIgPSAmKHZwdHItPnRkX3JpbmdzW2VudHJ5XSk7CisKKwkvKiBwb2ludCB0byB0aGUgY3VycmVudCB0eGIgaW5jYXNlIG11bHRpcGxlIHR4X3JpbmdzIGFyZSB1c2VkICovCisJcHR4YiA9IHZwdHItPnR4YiArIChlbnRyeSAqIFBLVF9CVUZfU1opOworCW1lbWNweShwdHhiLCBkZXN0LCBFVEhfQUxFTik7CS8qIERlc3RpbmF0aW9uICovCisJbWVtY3B5KHB0eGIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsJLyogU291cmNlICovCisJbnN0eXBlID0gaHRvbnMoKHUxNikgdHlwZSk7CS8qIFR5cGUgKi8KKwltZW1jcHkocHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopICYgbnN0eXBlLCAyKTsJLyogVHlwZSAqLworCW1lbWNweShwdHhiICsgRVRIX0hMRU4sIHBhY2tldCwgc2l6ZSk7CisKKwl0ZF9wdHItPnRkZXNjMS5UQ1BMUyA9IFRDUExTX05PUk1BTDsKKwl0ZF9wdHItPnRkZXNjMS5UQ1IgPSBUQ1IwX1RJQzsKKwl0ZF9wdHItPnRkX2J1ZlswXS5xdWV1ZSA9IDA7CisKKwlzaXplICs9IEVUSF9ITEVOOworCXdoaWxlIChzaXplIDwgRVRIX1pMRU4pCS8qIHBhZCB0byBtaW4gbGVuZ3RoICovCisJCXB0eGJbc2l6ZSsrXSA9ICdcMCc7CisKKwlpZiAoc2l6ZSA8IEVUSF9aTEVOKSB7CisvLyAgICAgICAgICAgICAgcHJpbnRmKCJQYWRkIHRoYXQgcGFja2V0XG4iKTsKKwkJcGt0bGVuID0gRVRIX1pMRU47CisvLyAgICAgICAgICAgICAgICBtZW1jcHkocHR4Yiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCW1lbXNldChwdHhiICsgc2l6ZSwgMCwgRVRIX1pMRU4gLSBzaXplKTsKKworCQl2cHRyLT50ZF9yaW5nc1tlbnRyeV0udGRlc2MwLnBrdHNpemUgPSBwa3RsZW47CisJCXZwdHItPnRkX3JpbmdzW2VudHJ5XS50ZF9idWZbMF0ucGFfbG93ID0gdmlydF90b19idXMocHR4Yik7CisJCXZwdHItPnRkX3JpbmdzW2VudHJ5XS50ZF9idWZbMF0ucGFfaGlnaCAmPQorCQkgICAgY3B1X3RvX2xlMzIoMHhmZmZmMDAwMFVMKTsKKwkJdnB0ci0+dGRfcmluZ3NbZW50cnldLnRkX2J1ZlswXS5idWZzaXplID0KKwkJICAgIHZwdHItPnRkX3JpbmdzW2VudHJ5XS50ZGVzYzAucGt0c2l6ZTsKKwkJdnB0ci0+dGRfcmluZ3NbZW50cnldLnRkZXNjMS5DTURaID0gMjsKKwl9IGVsc2UgeworLy8gICAgICAgICAgICAgIHByaW50ZigiQ29ycmVjdCBzaXplIHBhY2tldFxuIik7CisJCXRkX3B0ci0+dGRlc2MwLnBrdHNpemUgPSBzaXplOworCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9sb3cgPSB2aXJ0X3RvX2J1cyhwdHhiKTsKKwkJdGRfcHRyLT50ZF9idWZbMF0ucGFfaGlnaCA9IDA7CisJCXRkX3B0ci0+dGRfYnVmWzBdLmJ1ZnNpemUgPSB0ZF9wdHItPnRkZXNjMC5wa3RzaXplOworLy8gICAgICAgICAgICAgICAgdGRpbmZvLT5uc2tiX2RtYSA9IDE7CisJCXRkX3B0ci0+dGRlc2MxLkNNRFogPSAyOworCX0KKworCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1RBR0dJTkcpIHsKKwkJdGRfcHRyLT50ZGVzYzEucHFpbmYuVklEID0gKHZwdHItPm9wdGlvbnMudmlkICYgMHhmZmYpOworCQl0ZF9wdHItPnRkZXNjMS5wcWluZi5wcmlvcml0eSA9IDA7CisJCXRkX3B0ci0+dGRlc2MxLnBxaW5mLkNGSSA9IDA7CisJCXRkX3B0ci0+dGRlc2MxLlRDUiB8PSBUQ1IwX1ZFVEFHOworCX0KKworCXZwdHItPnRkX2N1cnIgPSAoZW50cnkgKyAxKTsKKworCXsKKworCQlpbnQgcHJldiA9IGVudHJ5IC0gMTsKKworCQlpZiAocHJldiA8IDApCisJCQlwcmV2ID0gVFhfREVTQ19ERUYgLSAxOworCQl0ZF9wdHItPnRkZXNjMC5vd25lciB8PSBPV05FRF9CWV9OSUM7CisJCXRkX3B0ciA9ICYodnB0ci0+dGRfcmluZ3NbcHJldl0pOworCQl0ZF9wdHItPnRkX2J1ZlswXS5xdWV1ZSA9IDE7CisJCW1hY190eF9xdWV1ZV93YWtlKHZwdHItPm1hY19yZWdzLCAwKTsKKworCX0KKworCXRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FT1VUOworCXdoaWxlICgodGRfcHRyLT50ZGVzYzAub3duZXIgJiBPV05FRF9CWV9OSUMpICYmIChjdXJydGlja3MoKSA8IHRvKSk7CS8qIHdhaXQgKi8KKworCWlmIChjdXJydGlja3MoKSA+PSB0bykgeworCQlwcmludGYoIlRYIFRpbWUgT3V0Iik7CisJfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdmVsb2NpdHlfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJLyogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgMyBwdXJwb3Nlcy4KKwkgKiBUaGlzIGRpc2FibGVzIERNQSBhbmQgaW50ZXJydXB0cyBzbyB3ZSBkb24ndCByZWNlaXZlCisJICogIHVuZXhwZWN0ZWQgcGFja2V0cyBvciBpbnRlcnJ1cHRzIGZyb20gdGhlIGNhcmQgYWZ0ZXIKKwkgKiAgZXRoZXJib290IGhhcyBmaW5pc2hlZC4gCisJICogVGhpcyBmcmVlcyByZXNvdXJjZXMgc28gZXRoZXJib290IG1heSB1c2UKKwkgKiAgdGhpcyBkcml2ZXIgb24gYW5vdGhlciBpbnRlcmZhY2UKKwkgKiBUaGlzIGFsbG93cyBldGhlcmJvb3QgdG8gcmVpbml0aWFsaXplIHRoZSBpbnRlcmZhY2UKKwkgKiAgaWYgc29tZXRoaW5nIGlzIHNvbWV0aGluZyBnb2VzIHdyb25nLgorCSAqLworCXN0cnVjdCBtYWNfcmVncyAqcmVncyA9IHZwdHItPm1hY19yZWdzOworCW1hY19kaXNhYmxlX2ludChyZWdzKTsKKwl3cml0ZWwoQ1IwX1NUT1AsICZyZWdzLT5DUjBTZXQpOworCXdyaXRldygweEZGRkYsICZyZWdzLT5URENTUkNscik7CisJd3JpdGViKDB4RkYsICZyZWdzLT5SRENTUkNscik7CisJc2FmZV9kaXNhYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKwltYWNfY2xlYXJfaXNyKHJlZ3MpOworCisJLyogUG93ZXIgZG93biB0aGUgY2hpcCAqLworLy8gICAgICBwY2lfc2V0X3Bvd2VyX3N0YXRlKHZwdHItPnBkZXYsIFBDSV9EM2hvdCk7CisKKwl2cHRyLT5mbGFncyAmPSAoflZFTE9DSVRZX0ZMQUdTX09QRU5FRCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVJRIC0gaGFuZGxlIGludGVycnVwdHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24pCit7CisJLyogVGhpcyByb3V0aW5lIGlzIHNvbWV3aGF0IG9wdGlvbmFsLiAgRXRoZXJib290IGl0c2VsZgorCSAqIGRvZXNuJ3QgdXNlIGludGVycnVwdHMsIGJ1dCB0aGV5IGFyZSByZXF1aXJlZCB1bmRlciBzb21lCisJICogY2lyY3Vtc3RhbmNlcyB3aGVuIHdlJ3JlIGFjdGluZyBhcyBhIFBYRSBzdGFjay4KKwkgKgorCSAqIElmIHlvdSBkb24ndCBpbXBsZW1lbnQgdGhpcyByb3V0aW5lLCB0aGUgb25seSBlZmZlY3Qgd2lsbAorCSAqIGJlIHRoYXQgeW91ciBkcml2ZXIgY2Fubm90IGJlIHVzZWQgdmlhIEV0aGVyYm9vdCdzIFVOREkKKwkgKiBBUEkuICBUaGlzIHdvbid0IGFmZmVjdCBwcm9ncmFtcyB0aGF0IHVzZSBvbmx5IHRoZSBVRFAKKwkgKiBwb3J0aW9uIG9mIHRoZSBQWEUgQVBJLCBzdWNoIGFzIHB4ZWxpbnV4LgorCSAqLworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIERJU0FCTEU6CisJY2FzZSBFTkFCTEU6CisJCS8qIFNldCByZWNlaXZlIGludGVycnVwdCBlbmFibGVkL2Rpc2FibGVkIHN0YXRlICovCisJCS8qCisJCSAgIG91dGIgKCBhY3Rpb24gPT0gRU5BQkxFID8gSW50ck1hc2tFbmFibGVkIDogSW50ck1hc2tEaXNhYmxlZCwKKwkJICAgbmljLT5pb2FkZHIgKyBJbnRyTWFza1JlZ2lzdGVyICk7CisJCSAqLworCQlicmVhazsKKwljYXNlIEZPUkNFOgorCQkvKiBGb3JjZSBOSUMgdG8gZ2VuZXJhdGUgYSByZWNlaXZlIGludGVycnVwdCAqLworCQkvKgorCQkgICBvdXRiICggRm9yY2VJbnRlcnJ1cHQsIG5pYy0+aW9hZGRyICsgSW50ckZvcmNlUmVnaXN0ZXIgKTsKKwkJICovCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyB2ZWxvY2l0eV9vcGVyYXRpb25zID0geworCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKKwkucG9sbAkJPSB2ZWxvY2l0eV9wb2xsLAorCS50cmFuc21pdAk9IHZlbG9jaXR5X3RyYW5zbWl0LAorCS5pcnEJCT0gdmVsb2NpdHlfaXJxLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdmVsb2NpdHlfcHJvYmUoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKwlpbnQgcmV0LCBpOworCXN0cnVjdCBtYWNfcmVncyAqcmVnczsKKworCXByaW50ZigidmlhLXZlbG9jaXR5LmM6IEZvdW5kICVzIFZlbmRvcj0weCVoWCBEZXZpY2U9MHglaFhcbiIsCisJICAgICAgIHBjaS0+ZHJpdmVyX25hbWUsIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSk7CisKKwkvKiBwb2ludCB0byBwcml2YXRlIHN0b3JhZ2UgKi8KKwl2cHRyID0gJnZwdHg7CisJaW5mbyA9IGNoaXBfaW5mb190YWJsZTsKKworCXZlbG9jaXR5X2luaXRfaW5mbyhwY2ksIHZwdHIsIGluZm8pOworCisvL0ZJWE1FOiBwY2lfZW5hYmxlX2RldmljZShwY2kpOworLy9GSVhNRTogcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CisKKwlyZXQgPSB2ZWxvY2l0eV9nZXRfcGNpX2luZm8odnB0ciwgcGNpKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGYoIkZhaWxlZCB0byBmaW5kIFBDSSBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVncyA9IGlvcmVtYXAodnB0ci0+bWVtYWRkciwgdnB0ci0+aW9fc2l6ZSk7CisJaWYgKHJlZ3MgPT0gTlVMTCkgeworCQlwcmludGYoIlVuYWJsZSB0byByZW1hcCBpb1xuIik7CisJCXJldHVybiAwOworCX0KKworCXZwdHItPm1hY19yZWdzID0gcmVnczsKKworCUJBU0UgPSB2cHRyLT5pb2FkZHI7CisKKwlwcmludGYoIkNoaXAgSUQ6ICVoWFxuIiwgdnB0ci0+Y2hpcF9pZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQluaWMtPm5vZGVfYWRkcltpXSA9IHJlYWRiKCZyZWdzLT5QQVJbaV0pOworCisJREJHICggIiVzOiAlcyBhdCBpb2FkZHIgJSNoWFxuIiwgcGNpLT5kcml2ZXJfbmFtZSwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApLAorCSAgICAgICh1bnNpZ25lZCBpbnQpIEJBU0UgKTsKKworCXZlbG9jaXR5X2dldF9vcHRpb25zKCZ2cHRyLT5vcHRpb25zLCAwLCBwY2ktPmRyaXZlcl9uYW1lKTsKKworCS8qIAorCSAqICAgICAgTWFzayBvdXQgdGhlIG9wdGlvbnMgY2Fubm90IGJlIHNldCB0byB0aGUgY2hpcAorCSAqLworCXZwdHItPm9wdGlvbnMuZmxhZ3MgJj0gMHgwMEZGRkZGRlVMOwkvL2luZm8tPmZsYWdzID0gMHgwMEZGRkZGRlVMOworCisJLyoKKwkgKiAgICAgIEVuYWJsZSB0aGUgY2hpcCBzcGVjaWZpZWQgY2FwYmlsaXRpZXMKKwkgKi8KKworCXZwdHItPmZsYWdzID0KKwkgICAgdnB0ci0+b3B0aW9ucy4KKwkgICAgZmxhZ3MgfCAoMHgwMEZGRkZGRlVMIC8qaW5mby0+ZmxhZ3MgKi8gICYgMHhGRjAwMDAwMFVMKTsKKworCXZwdHItPndvbF9vcHRzID0gdnB0ci0+b3B0aW9ucy53b2xfb3B0czsKKwl2cHRyLT5mbGFncyB8PSBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRDsKKworCXZwdHItPnBoeV9pZCA9IE1JSV9HRVRfUEhZX0lEKHZwdHItPm1hY19yZWdzKTsKKworCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1RYX0NTVU0pIHsKKwkJcHJpbnRmKCJmZWF0dXJlcyBtaXNzaW5nXG4iKTsKKwl9CisKKwkvKiBhbmQgbGVhdmUgdGhlIGNoaXAgcG93ZXJlZCBkb3duICovCisvLyBGSVhNRTogICAgICAgcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EM2hvdCk7CisKKwljaGVja19jb25uZWN0aW9uX3R5cGUodnB0ci0+bWFjX3JlZ3MpOworCXZlbG9jaXR5X29wZW4obmljLCBwY2kpOworCisJLyogc3RvcmUgTklDIHBhcmFtZXRlcnMgKi8KKwluaWMtPm5pY19vcCA9ICZ2ZWxvY2l0eV9vcGVyYXRpb25zOworCXJldHVybiAxOworfQorCisvLyNkZWZpbmUgSU9SRVNPVVJDRV9JTyAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgICAgIC8qIFJlc291cmNlIHR5cGUgKi8KKworLyoqCisgKgl2ZWxvY2l0eV9pbml0X2luZm8JLQlpbml0IHByaXZhdGUgZGF0YQorICoJQHBkZXY6IFBDSSBkZXZpY2UKKyAqCUB2cHRyOiBWZWxvY2l0eSBpbmZvCisgKglAaW5mbzogQm9hcmQgdHlwZQorICoKKyAqCVNldCB1cCB0aGUgaW5pdGlhbCB2ZWxvY2l0eV9pbmZvIHN0cnVjdCBmb3IgdGhlIGRldmljZSB0aGF0IGhhcyBiZWVuCisgKglkaXNjb3ZlcmVkLgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2luaXRfaW5mbyhzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwKKwkJCSAgICAgICBzdHJ1Y3QgdmVsb2NpdHlfaW5mb190YmwgKmluZm8pCit7CisJbWVtc2V0KHZwdHIsIDAsIHNpemVvZihzdHJ1Y3QgdmVsb2NpdHlfaW5mbykpOworCisJdnB0ci0+cGRldiA9IHBkZXY7CisJdnB0ci0+Y2hpcF9pZCA9IGluZm8tPmNoaXBfaWQ7CisJdnB0ci0+aW9fc2l6ZSA9IGluZm8tPmlvX3NpemU7CisJdnB0ci0+bnVtX3R4cSA9IGluZm8tPnR4cXVldWU7CisJdnB0ci0+bXVsdGljYXN0X2xpbWl0ID0gTUNBTV9TSVpFOworCisJcHJpbnRmCisJICAgICgiY2hpcF9pZDogMHglaFgsIGlvX3NpemU6ICVkLCBudW1fdHhxICVkLCBtdWx0aWNhc3RfbGltaXQ6ICVkXG4iLAorCSAgICAgdnB0ci0+Y2hpcF9pZCwgKHVuc2lnbmVkIGludCkgdnB0ci0+aW9fc2l6ZSwgdnB0ci0+bnVtX3R4cSwKKwkgICAgIHZwdHItPm11bHRpY2FzdF9saW1pdCk7CisJcHJpbnRmKCJOYW1lOiAlc1xuIiwgaW5mby0+bmFtZSk7CisKKy8vICAgICAgc3Bpbl9sb2NrX2luaXQoJnZwdHItPmxvY2spOworLy8gICAgICBJTklUX0xJU1RfSEVBRCgmdnB0ci0+bGlzdCk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZ2V0X3BjaV9pbmZvCS0JcmV0cmlldmUgUENJIGluZm8gZm9yIGRldmljZQorICoJQHZwdHI6IHZlbG9jaXR5IGRldmljZQorICoJQHBkZXY6IFBDSSBkZXZpY2UgaXQgbWF0Y2hlcworICoKKyAqCVJldHJpZXZlIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBkYXRhIHRoYXQgaW50ZXJlc3RzIHVzIGZyb20KKyAqCXRoZSBrZXJuZWwgUENJIGxheWVyCisgKi8KKworI2RlZmluZSBJT1JFU09VUkNFX0lPICAgMHgwMDAwMDEwMAkvKiBSZXNvdXJjZSB0eXBlICovCisjZGVmaW5lIElPUkVTT1VSQ0VfUFJFRkVUQ0ggICAgICAgIDB4MDAwMDEwMDAJLyogTm8gc2lkZSBlZmZlY3RzICovCisKKyNkZWZpbmUgSU9SRVNPVVJDRV9NRU0gICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCQVJfMCAgICAgICAgICAgMAorI2RlZmluZSBCQVJfMSAgICAgICAgICAgMQorI2RlZmluZSBCQVJfNSAgICAgICAgICAgNQorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRSAweDAxCS8qIDAgPSBtZW1vcnksIDEgPSBJL08gKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8gMHgwMQorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkgMHgwMAorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV9NQVNLIDB4MDYKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMzIgICAweDAwCS8qIDMyIGJpdCBhZGRyZXNzICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzFNICAgMHgwMgkvKiBCZWxvdyAxTSBbb2Jzb2xldGVdICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0ICAgMHgwNAkvKiA2NCBiaXQgYWRkcmVzcyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fUFJFRkVUQ0ggIDB4MDgJLyogcHJlZmV0Y2hhYmxlPyAqLworLy8jZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLICAgICAgKH4weDBmVUwpCisvLyAjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0sgICAgICAgKH4weDAzVUwpCisKK3Vuc2lnbmVkIGxvbmcgcGNpX3Jlc291cmNlX2ZsYWdzKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgYmFyKQoreworCXVpbnQzMl90IGwsIHN6OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGJhciwgJmwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgYmFyLCB+MCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGJhciwgJnN6KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGJhciwgbCk7CisKKwlpZiAoIXN6IHx8IHN6ID09IDB4ZmZmZmZmZmYpCisJCXByaW50ZigiV2VpcmQgc2l6ZVxuIik7CisJaWYgKGwgPT0gMHhmZmZmZmZmZikKKwkJbCA9IDA7CisJaWYgKChsICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkpIHsKKwkJLyogICAgc3ogPSBwY2lfc2l6ZShsLCBzeiwgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CisJCSAgIGlmICghc3opCisJCSAgIGNvbnRpbnVlOworCQkgICByZXMtPnN0YXJ0ID0gbCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJCSAqLyBmbGFncyB8PSBsICYgflBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJCXByaW50ZigiTWVtb3J5IFJlc291cmNlXG4iKTsKKwl9IGVsc2UgeworCQkvLyAgICAgICAgICAgIHN6ID0gcGNpX3NpemUobCwgc3osIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSyAmIDB4ZmZmZik7CisJCS8vLyAgICAgICAgIGlmICghc3opCisJCS8vLyAgICAgICAgICAgICAgY29udGludWU7CisvLyAgICAgICAgICAgICAgcmVzLT5zdGFydCA9IGwgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisJCWZsYWdzIHw9IGwgJiB+UENJX0JBU0VfQUREUkVTU19JT19NQVNLOworCQlwcmludGYoIkkvTyBSZXNvdXJjZVxuIik7CisJfQorCWlmIChmbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pIHsKKwkJcHJpbnRmKCJXaHkgaXMgaXQgaGVyZVxuIik7CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfSU87CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJoZXJlXG4iKTsKKy8vZmxhZ3MgJj0gfklPUkVTT1VSQ0VfSU87CisJfQorCisKKwlpZiAoZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9QUkVGRVRDSCkKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX1BSRUZFVENIOworCisKKwlyZXR1cm4gZmxhZ3M7Cit9CitzdGF0aWMgaW50IHZlbG9jaXR5X2dldF9wY2lfaW5mbyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwKKwkJCQkgc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnZwdHItPnJldl9pZCkgPCAwKSB7CisJCXByaW50ZigiREVCVUc6IHBjaV9yZWFkX2NvbmZpZ19ieXRlIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGp1c3RfcGNpX2RldmljZShwZGV2KTsKKworCXZwdHItPmlvYWRkciA9IHBjaV9iYXJfc3RhcnQocGRldiwgUENJX0JBU0VfQUREUkVTU18wKTsKKwl2cHRyLT5tZW1hZGRyID0gcGNpX2Jhcl9zdGFydChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEpOworCisJcHJpbnRmKCJMb29raW5nIGZvciBJL08gUmVzb3VyY2UgLSBGb3VuZDoiKTsKKwlpZiAoIQorCSAgICAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCkgJiBJT1JFU09VUkNFX0lPKSkKKwl7CisJCXByaW50ZgorCQkgICAgKCJERUJVRzogcmVnaW9uICMwIGlzIG5vdCBhbiBJL08gcmVzb3VyY2UsIGFib3J0aW5nLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGYoIkxvb2tpbmcgZm9yIE1lbW9yeSBSZXNvdXJjZSAtIEZvdW5kOiIpOworCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSkgJiBJT1JFU09VUkNFX0lPKSkgeworCQlwcmludGYoIkRFQlVHOiByZWdpb24gIzEgaXMgYW4gSS9PIHJlc291cmNlLCBhYm9ydGluZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHBjaV9iYXJfc2l6ZShwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEpIDwgMjU2KSB7CisJCXByaW50ZigiREVCVUc6IHJlZ2lvbiAjMSBpcyB0b28gc21hbGwuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwl2cHRyLT5wZGV2ID0gcGRldjsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXZlbG9jaXR5X3ByaW50X2xpbmtfc3RhdHVzCS0JbGluayBzdGF0dXMgcmVwb3J0aW5nCisgKglAdnB0cjogdmVsb2NpdHkgdG8gcmVwb3J0IG9uCisgKgorICoJVHVybiB0aGUgbGluayBzdGF0dXMgb2YgdGhlIHZlbG9jaXR5IGNhcmQgaW50byBhIGtlcm5lbCBsb2cKKyAqCWRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgbGluayBzdGF0ZSwgZGV0YWlsaW5nIHNwZWVkIGFuZCBkdXBsZXgKKyAqCXN0YXR1cworICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3ByaW50X2xpbmtfc3RhdHVzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCisJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9MSU5LX0ZBSUwpIHsKKwkJcHJpbnRmKCJmYWlsZWQgdG8gZGV0ZWN0IGNhYmxlIGxpbmtcbiIpOworCX0gZWxzZSBpZiAodnB0ci0+b3B0aW9ucy5zcGRfZHB4ID09IFNQRF9EUFhfQVVUTykgeworCQlwcmludGYoIkxpbmsgYXV0b25lZ2F0aW9uIik7CisKKwkJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9TUEVFRF8xMDAwKQorCQkJcHJpbnRmKCIgc3BlZWQgMTAwME0gYnBzIik7CisJCWVsc2UgaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9TUEVFRF8xMDApCisJCQlwcmludGYoIiBzcGVlZCAxMDBNIGJwcyIpOworCQllbHNlCisJCQlwcmludGYoIiBzcGVlZCAxME0gYnBzIik7CisKKwkJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCXByaW50ZigiIGZ1bGwgZHVwbGV4XG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIgaGFsZiBkdXBsZXhcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiTGluayBmb3JjZWQiKTsKKwkJc3dpdGNoICh2cHRyLT5vcHRpb25zLnNwZF9kcHgpIHsKKwkJY2FzZSBTUERfRFBYXzEwMF9IQUxGOgorCQkJcHJpbnRmKCIgc3BlZWQgMTAwTSBicHMgaGFsZiBkdXBsZXhcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU1BEX0RQWF8xMDBfRlVMTDoKKwkJCXByaW50ZigiIHNwZWVkIDEwME0gYnBzIGZ1bGwgZHVwbGV4XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNQRF9EUFhfMTBfSEFMRjoKKwkJCXByaW50ZigiIHNwZWVkIDEwTSBicHMgaGFsZiBkdXBsZXhcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU1BEX0RQWF8xMF9GVUxMOgorCQkJcHJpbnRmKCIgc3BlZWQgMTBNIGJwcyBmdWxsIGR1cGxleFxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioKKyAqCXZlbG9jaXR5X3J4X3Jlc2V0CS0JaGFuZGxlIGEgcmVjZWl2ZSByZXNldAorICoJQHZwdHI6IHZlbG9jaXR5IHdlIGFyZSByZXNldHRpbmcKKyAqCisgKglSZXNldCB0aGUgb3duZXJzaGlwIGFuZCBzdGF0dXMgZm9yIHRoZSByZWNlaXZlIHJpbmcgc2lkZS4KKyAqCUhhbmQgYWxsIHRoZSByZWNlaXZlIHF1ZXVlIHRvIHRoZSBOSUMuCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfcnhfcmVzZXQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisKKwlzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlpbnQgaTsKKworLy9wdHItPnJkX2RpcnR5ID0gdnB0ci0+cmRfZmlsbGVkID0gdnB0ci0+cmRfY3VyciA9IDA7CisKKwkvKgorCSAqICAgICAgSW5pdCBzdGF0ZSwgYWxsIFJEIGVudHJpZXMgYmVsb25nIHRvIHRoZSBOSUMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdnB0ci0+b3B0aW9ucy5udW1yeDsgKytpKQorCQl2cHRyLT5yZF9yaW5nW2ldLnJkZXNjMC5vd25lciA9IE9XTkVEX0JZX05JQzsKKworCXdyaXRldyhSWF9ERVNDX0RFRiwgJnJlZ3MtPlJCUkRVKTsKKwl3cml0ZWwodmlydF90b19sZTMyZGVzYyh2cHRyLT5yZF9yaW5nKSwgJnJlZ3MtPlJEQmFzZUxvKTsKKwl3cml0ZXcoMCwgJnJlZ3MtPlJESWR4KTsKKwl3cml0ZXcoUlhfREVTQ19ERUYgLSAxLCAmcmVncy0+UkRDU2l6ZSk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9yZWdpc3RlcnMJLQlpbml0aWFsaXNlIE1BQyByZWdpc3RlcnMKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byBpbml0CisgKglAdHlwZTogdHlwZSBvZiBpbml0aWFsaXNhdGlvbiAoaG90IG9yIGNvbGQpCisgKgorICoJSW5pdGlhbGlzZSB0aGUgTUFDIG9uIGEgcmVzZXQgb3Igb24gZmlyc3Qgc2V0IHVwIG9uIHRoZQorICoJaGFyZHdhcmUuCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfaW5pdF9yZWdpc3RlcnMoc3RydWN0IG5pYyAqbmljLAorCQkJCSAgICBzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwKKwkJCQkgICAgZW51bSB2ZWxvY2l0eV9pbml0X3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlpbnQgaSwgbWlpX3N0YXR1czsKKworCW1hY193b2xfcmVzZXQocmVncyk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFZFTE9DSVRZX0lOSVRfUkVTRVQ6CisJY2FzZSBWRUxPQ0lUWV9JTklUX1dPTDoKKworLy9uZXRpZl9zdG9wX3F1ZXVlKHZwdHItPmRldik7CisKKwkJLyoKKwkJICogICAgICBSZXNldCBSWCB0byBwcmV2ZW50IFJYIHBvaW50ZXIgbm90IG9uIHRoZSA0WCBsb2NhdGlvbgorCQkgKi8KKwkJdmVsb2NpdHlfcnhfcmVzZXQodnB0cik7CisJCW1hY19yeF9xdWV1ZV9ydW4ocmVncyk7CisJCW1hY19yeF9xdWV1ZV93YWtlKHJlZ3MpOworCisJCW1paV9zdGF0dXMgPSB2ZWxvY2l0eV9nZXRfb3B0X21lZGlhX21vZGUodnB0cik7CisKKwkJaWYgKHZlbG9jaXR5X3NldF9tZWRpYV9tb2RlKHZwdHIsIG1paV9zdGF0dXMpICE9CisJCSAgICBWRUxPQ0lUWV9MSU5LX0NIQU5HRSkgeworCQkJdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXModnB0cik7CisJCQlpZiAoISh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfTElOS19GQUlMKSkKKwkJCQlwcmludGYoIkxpbmsgRmFpbGVkXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSh2cHRyLT5kZXYpOworCQl9CisKKwkJZW5hYmxlX2Zsb3dfY29udHJvbF9hYmlsaXR5KHZwdHIpOworCisJCW1hY19jbGVhcl9pc3IocmVncyk7CisJCXdyaXRlbChDUjBfU1RPUCwgJnJlZ3MtPkNSMENscik7CisJCS8vd3JpdGVsKChDUjBfRFBPTEwgfCBDUjBfVFhPTiB8IENSMF9SWE9OIHwgQ1IwX1NUUlQpLCAKKwkJd3JpdGVsKChDUjBfRFBPTEwgfCBDUjBfVFhPTiB8IENSMF9SWE9OIHwgQ1IwX1NUUlQpLAorCQkgICAgICAgJnJlZ3MtPkNSMFNldCk7CisJCWJyZWFrOworCisJY2FzZSBWRUxPQ0lUWV9JTklUX0NPTEQ6CisJZGVmYXVsdDoKKwkJLyoKKwkJICogICAgICBEbyByZXNldAorCQkgKi8KKwkJdmVsb2NpdHlfc29mdF9yZXNldCh2cHRyKTsKKwkJbWRlbGF5KDUpOworCisJCW1hY19lZXByb21fcmVsb2FkKHJlZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQl3cml0ZWIobmljLT5ub2RlX2FkZHJbaV0sICYocmVncy0+UEFSW2ldKSk7CisJCX0KKwkJLyoKKwkJICogICAgICBjbGVhciBQcmVfQUNQSSBiaXQuCisJCSAqLworCQlCWVRFX1JFR19CSVRTX09GRihDRkdBX1BBQ1BJLCAmKHJlZ3MtPkNGR0EpKTsKKwkJbWFjX3NldF9yeF90aHJlc2gocmVncywgdnB0ci0+b3B0aW9ucy5yeF90aHJlc2gpOworCQltYWNfc2V0X2RtYV9sZW5ndGgocmVncywgdnB0ci0+b3B0aW9ucy5ETUFfbGVuZ3RoKTsKKworCQl3cml0ZWIoV09MQ0ZHX1NBTSB8IFdPTENGR19TQUIsICZyZWdzLT5XT0xDRkdTZXQpOworCQkvKgorCQkgKiAgICAgIEJhY2sgb2ZmIGFsZ29yaXRobSB1c2Ugb3JpZ2luYWwgSUVFRSBzdGFuZGFyZAorCQkgKi8KKwkJQllURV9SRUdfQklUU19TRVQoQ0ZHQl9PRlNFVCwKKwkJCQkgIChDRkdCX0NSQU5ET00gfCBDRkdCX0NBUCB8IENGR0JfTUJBIHwKKwkJCQkgICBDRkdCX0JBS09QVCksICZyZWdzLT5DRkdCKTsKKworCQkvKgorCQkgKiAgICAgIEluaXQgQ0FNIGZpbHRlcgorCQkgKi8KKwkJdmVsb2NpdHlfaW5pdF9jYW1fZmlsdGVyKHZwdHIpOworCisJCS8qCisJCSAqICAgICAgU2V0IHBhY2tldCBmaWx0ZXI6IFJlY2VpdmUgZGlyZWN0ZWQgYW5kIGJyb2FkY2FzdCBhZGRyZXNzCisJCSAqLworLy9GSVhNRSBNdWx0aWNhc3QgICAgICAgICAgICAgICB2ZWxvY2l0eV9zZXRfbXVsdGkobmljKTsKKworCQkvKgorCQkgKiAgICAgIEVuYWJsZSBNSUkgYXV0by1wb2xsaW5nCisJCSAqLworCQllbmFibGVfbWlpX2F1dG9wb2xsKHJlZ3MpOworCisJCXZwdHItPmludF9tYXNrID0gSU5UX01BU0tfREVGOworCisJCXdyaXRlbCh2aXJ0X3RvX2xlMzJkZXNjKHZwdHItPnJkX3JpbmcpLCAmcmVncy0+UkRCYXNlTG8pOworCQl3cml0ZXcodnB0ci0+b3B0aW9ucy5udW1yeCAtIDEsICZyZWdzLT5SRENTaXplKTsKKwkJbWFjX3J4X3F1ZXVlX3J1bihyZWdzKTsKKwkJbWFjX3J4X3F1ZXVlX3dha2UocmVncyk7CisKKwkJd3JpdGV3KHZwdHItPm9wdGlvbnMubnVtdHggLSAxLCAmcmVncy0+VERDU2l6ZSk7CisKKy8vICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdnB0ci0+bnVtX3R4cTsgaSsrKSB7CisJCXdyaXRlbCh2aXJ0X3RvX2xlMzJkZXNjKHZwdHItPnRkX3JpbmdzKSwKKwkJICAgICAgICYocmVncy0+VERCYXNlTG9bMF0pKTsKKwkJbWFjX3R4X3F1ZXVlX3J1bihyZWdzLCAwKTsKKy8vICAgICAgICAgICAgICB9CisKKwkJaW5pdF9mbG93X2NvbnRyb2xfcmVnaXN0ZXIodnB0cik7CisKKwkJd3JpdGVsKENSMF9TVE9QLCAmcmVncy0+Q1IwQ2xyKTsKKwkJd3JpdGVsKChDUjBfRFBPTEwgfCBDUjBfVFhPTiB8IENSMF9SWE9OIHwgQ1IwX1NUUlQpLAorCQkgICAgICAgJnJlZ3MtPkNSMFNldCk7CisKKwkJbWlpX3N0YXR1cyA9IHZlbG9jaXR5X2dldF9vcHRfbWVkaWFfbW9kZSh2cHRyKTsKKy8vICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKHZwdHItPmRldik7CisKKwkJbWlpX2luaXQodnB0ciwgbWlpX3N0YXR1cyk7CisKKwkJaWYgKHZlbG9jaXR5X3NldF9tZWRpYV9tb2RlKHZwdHIsIG1paV9zdGF0dXMpICE9CisJCSAgICBWRUxPQ0lUWV9MSU5LX0NIQU5HRSkgeworCQkJdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXModnB0cik7CisJCQlpZiAoISh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfTElOS19GQUlMKSkKKwkJCQlwcmludGYoIkxpbmsgRmFhYWlsbGxcbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKHZwdHItPmRldik7CisJCX0KKworCQllbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkodnB0cik7CisJCW1hY19od19taWJzX2luaXQocmVncyk7CisJCW1hY193cml0ZV9pbnRfbWFzayh2cHRyLT5pbnRfbWFzaywgcmVncyk7CisJCW1hY19jbGVhcl9pc3IocmVncyk7CisKKworCX0KKwl2ZWxvY2l0eV9wcmludF9saW5rX3N0YXR1cyh2cHRyKTsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9zb2Z0X3Jlc2V0CS0Jc29mdCByZXNldAorICoJQHZwdHI6IHZlbG9jaXR5IHRvIHJlc2V0CisgKgorICoJS2ljayBvZmYgYSBzb2Z0IHJlc2V0IG9mIHRoZSB2ZWxvY2l0eSBhZGFwdGVyIGFuZCB0aGVuIHBvbGwKKyAqCXVudGlsIHRoZSByZXNldCBzZXF1ZW5jZSBoYXMgY29tcGxldGVkIGJlZm9yZSByZXR1cm5pbmcuCisgKi8KKworc3RhdGljIGludCB2ZWxvY2l0eV9zb2Z0X3Jlc2V0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBtYWNfcmVncyAqcmVncyA9IHZwdHItPm1hY19yZWdzOworCXVuc2lnbmVkIGludCBpID0gMDsKKworCXdyaXRlbChDUjBfU0ZSU1QsICZyZWdzLT5DUjBTZXQpOworCisJZm9yIChpID0gMDsgaSA8IFdfTUFYX1RJTUVPVVQ7IGkrKykgeworCQl1ZGVsYXkoNSk7CisJCWlmICghRFdPUkRfUkVHX0JJVFNfSVNfT04oQ1IwX1NGUlNULCAmcmVncy0+Q1IwU2V0KSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IFdfTUFYX1RJTUVPVVQpIHsKKwkJd3JpdGVsKENSMF9GT1JTUlNULCAmcmVncy0+Q1IwU2V0KTsKKwkJLyogRklYTUU6IFBDSSBQT1NUSU5HICovCisJCS8qIGRlbGF5IDJtcyAqLworCQltZGVsYXkoMik7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCXZlbG9jaXR5X2luaXRfcmluZ3MJLQlzZXQgdXAgRE1BIHJpbmdzCisgKglAdnB0cjogVmVsb2NpdHkgdG8gc2V0IHVwCisgKgorICoJQWxsb2NhdGUgUENJIG1hcHBlZCBETUEgcmluZ3MgZm9yIHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCBsYXllcgorICoJdG8gdXNlLgorICovCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfaW5pdF9yaW5ncyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKworCWludCBpZHg7CisKKwl2cHRyLT5yZF9jdXJyID0gMDsKKwl2cHRyLT50ZF9jdXJyID0gMDsKKwltZW1zZXQodnB0ci0+dGRfcmluZ3MsIDAsIFRYX0RFU0NfREVGICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSk7CisJbWVtc2V0KHZwdHItPnJkX3JpbmcsIDAsIFJYX0RFU0NfREVGICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSk7CisvLyAgICAgIG1lbXNldCh2cHRyLT50eF9idWZmcywgMCwgVFhfREVTQ19ERUYgKiBQS1RfQlVGX1NaKTsKKworCisJZm9yIChpZHggPSAwOyBpZHggPCBSWF9ERVNDX0RFRjsgaWR4KyspIHsKKwkJdnB0ci0+cmRfcmluZ1tpZHhdLnJkZXNjMC5SU1IgPSAwOworCQl2cHRyLT5yZF9yaW5nW2lkeF0ucmRlc2MwLmxlbiA9IDA7CisJCXZwdHItPnJkX3JpbmdbaWR4XS5yZGVzYzAucmVzZXJ2ZWQgPSAwOworCQl2cHRyLT5yZF9yaW5nW2lkeF0ucmRlc2MwLm93bmVyID0gMDsKKwkJdnB0ci0+cmRfcmluZ1tpZHhdLmxlbiA9IGNwdV90b19sZTMyKHZwdHItPnJ4X2J1Zl9zeik7CisJCXZwdHItPnJkX3JpbmdbaWR4XS5pbnRlbiA9IDE7CisJCXZwdHItPnJkX3JpbmdbaWR4XS5wYV9sb3cgPQorCQkgICAgdmlydF90b19idXModnB0ci0+cnhiICsgKFJYX0RFU0NfREVGICogaWR4KSk7CisJCXZwdHItPnJkX3JpbmdbaWR4XS5wYV9oaWdoID0gMDsKKwkJdnB0ci0+cmRfcmluZ1tpZHhdLnJkZXNjMC5vd25lciA9IE9XTkVEX0JZX05JQzsKKwl9CisKKy8qCWZvciAoaSA9IDA7IGlkeCA8IFRYX0RFU0NfREVGOyBpZHgrKyApIHsKKwkJdnB0ci0+dGRfcmluZ3NbaWR4XS50ZGVzYzEuVENQTFMgPSBUQ1BMU19OT1JNQUw7CisJCXZwdHItPnRkX3JpbmdzW2lkeF0udGRlc2MxLlRDUiA9IFRDUjBfVElDOworCQl2cHRyLT50ZF9yaW5nc1tpZHhdLnRkX2J1ZlswXS5xdWV1ZSA9IDA7CisJCXZwdHItPnRkX3JpbmdzW2lkeF0udGRlc2MwLm93bmVyID0gfk9XTkVEX0JZX05JQzsKKwkJdnB0ci0+dGRfcmluZ3NbaWR4XS50ZGVzYzAucGt0c2l6ZSA9IDA7CisJCXZwdHItPnRkX3JpbmdzW2lkeF0udGRfYnVmWzBdLnBhX2xvdyA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKHZwdHItPnR4YiArIChpZHggKiBQS1RfQlVGX1NaKSkpOworCQl2cHRyLT50ZF9yaW5nc1tpZHhdLnRkX2J1ZlswXS5wYV9oaWdoID0gMDsKKwkJdnB0ci0+dGRfcmluZ3NbaWR4XS50ZF9idWZbMF0uYnVmc2l6ZSA9IDA7CisJCXZwdHItPnRkX3JpbmdzW2lkeF0udGRlc2MxLkNNRFogPSAyOworCX0KKyovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfb3BlbgkJLQlpbnRlcmZhY2UgYWN0aXZhdGlvbiBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBsYXllciBkZXZpY2UgdG8gb3BlbgorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGxheWVyIGJyaW5ncyB0aGUgaW50ZXJmYWNlIHVwLiBSZXR1cm5zCisgKglhIG5lZ2F0aXZlIHBvc2l4IGVycm9yIGNvZGUgb24gZmFpbHVyZSwgb3IgemVybyBvbiBzdWNjZXNzLgorICoKKyAqCUFsbCB0aGUgcmluZyBhbGxvY2F0aW9uIGFuZCBzZXQgdXAgaXMgZG9uZSBvbiBvcGVuIGZvciB0aGlzCisgKglhZGFwdGVyIHRvIG1pbmltaXNlIG1lbW9yeSB1c2FnZSB3aGVuIGluYWN0aXZlCisgKi8KKworI2RlZmluZSBQQ0lfQllURV9SRUdfQklUU19PTih4LGkscCkgZG97XAorICAgIHU4IGJ5UmVnO1wKKyAgICBwY2lfcmVhZF9jb25maWdfYnl0ZSgocCksIChpKSwgJihieVJlZykpO1wKKyAgICAoYnlSZWcpIHw9ICh4KTtcCisgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKChwKSwgKGkpLCAoYnlSZWcpKTtcCit9IHdoaWxlICgwKQorCisvLworLy8gUmVnaXN0ZXJzIGluIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorLy8KKyNkZWZpbmUgUENJX1JFR19DT01NQU5EICAgICAgICAgMHgwNAkvLworI2RlZmluZSBQQ0lfUkVHX01PREUwICAgICAgICAgICAweDYwCS8vCisjZGVmaW5lIFBDSV9SRUdfTU9ERTEgICAgICAgICAgIDB4NjEJLy8KKyNkZWZpbmUgUENJX1JFR19NT0RFMiAgICAgICAgICAgMHg2MgkvLworI2RlZmluZSBQQ0lfUkVHX01PREUzICAgICAgICAgICAweDYzCS8vCisjZGVmaW5lIFBDSV9SRUdfREVMQVlfVElNRVIgICAgIDB4NjQJLy8KKworLy8gQml0cyBpbiB0aGUgKE1PREUyLCAweDYyKSByZWdpc3RlcgorLy8KKyNkZWZpbmUgTU9ERTJfUENFUk9QVCAgICAgICAweDgwCS8vIHRha2UgUENJIGJ1cyBFUnJvciBhcyBhIGZhdGFsIGFuZCBzaHV0ZG93biBmcm9tIHNvZnR3YXJlIGNvbnRyb2wKKyNkZWZpbmUgTU9ERTJfVFhRMTYgICAgICAgICAweDQwCS8vIFRYIHdyaXRlLWJhY2sgUXVldWUgY29udHJvbC4gMC0+MzIgZW50cmllcyBhdmFpbGFibGUgaW4gVHggd3JpdGUtYmFjayBxdWV1ZSwgMS0+MTYgZW50cmllcworI2RlZmluZSBNT0RFMl9UWFBPU1QgICAgICAgIDB4MDgJLy8gKE5vdCBzdXBwb3J0IGluIFZUMzExOSkKKyNkZWZpbmUgTU9ERTJfQVVUT09QVCAgICAgICAweDA0CS8vIChWVDMxMTkgR0hDSSB3aXRob3V0IHN1Y2ggYmVoYXZpb3IpCisjZGVmaW5lIE1PREUyX01PREUxMFQgICAgICAgMHgwMgkvLyB1c2VkIHRvIGNvbnRyb2wgdHggVGhyZXNob2xkIGZvciAxME0gY2FzZQorI2RlZmluZSBNT0RFMl9UQ1BMU09QVCAgICAgIDB4MDEJLy8gVENQIGxhcmdlIHNlbmQgZmllbGQgdXBkYXRlIGRpc2FibGUsIGhhcmR3YXJlIHdpbGwgbm90IHVwZGF0ZSByZWxhdGVkIGZpZWxkcywgbGVhdmUgaXQgdG8gc29mdHdhcmUuCisKKy8vCisvLyBCaXRzIGluIHRoZSBNT0RFMyByZWdpc3RlcgorLy8KKyNkZWZpbmUgTU9ERTNfTUlJT04gICAgICAgICAweDA0CS8vIE1JSSBzeW1ib2wgY29kaW5lIGVycm9yIGRldGVjdCBlbmFibGUgPz8KKworLy8gQml0cyBpbiB0aGUgKENPTU1BTkQsIDB4MDQpIHJlZ2lzdGVyCisjZGVmaW5lIENPTU1BTkRfQlVTTSAgICAgICAgMHgwNAorI2RlZmluZSBDT01NQU5EX1dBSVQgICAgICAgIDB4ODAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfb3BlbihzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgX191bnVzZWQpCit7CisJaW50IHJldDsKKworCXU4IGRpZmY7CisJdTMyIFR4UGh5QWRkciwgUnhQaHlBZGRyOworCXUzMiBUeEJ1ZlBoeUFkZHIsIFJ4QnVmUGh5QWRkcjsKKwl2cHRyLT5UeERlc2NBcnJheXMgPSB0eF9yaW5nOworCWlmICh2cHRyLT5UeERlc2NBcnJheXMgPT0gMCkKKwkJcHJpbnRmKCJBbGxvdCBFcnJvciIpOworCisJLyogVHggRGVzY3JpcHRvciBuZWVkcyA2NCBieXRlcyBhbGlnbm1lbnQ7ICovCisJVHhQaHlBZGRyID0gdmlydF90b19idXModnB0ci0+VHhEZXNjQXJyYXlzKTsKKwlwcmludGYoIlVuYWxpZ25lZCBBZGRyZXNzIDogJVhcbiIsIFR4UGh5QWRkcik7CisJZGlmZiA9IDY0IC0gKFR4UGh5QWRkciAtICgoVHhQaHlBZGRyID4+IDYpIDw8IDYpKTsKKwlUeFBoeUFkZHIgKz0gZGlmZjsKKwl2cHRyLT50ZF9yaW5ncyA9IChzdHJ1Y3QgdHhfZGVzYyAqKSAodnB0ci0+VHhEZXNjQXJyYXlzICsgZGlmZik7CisKKwlwcmludGYoIkFsaWduZWQgQWRkcmVzczogJWxYXG4iLCB2aXJ0X3RvX2J1cyh2cHRyLT50ZF9yaW5ncykpOworCXZwdHItPnR4X2J1ZmZzID0gdHhiOworCS8qIFJ4IEJ1ZmZlciBuZWVkcyA2NCBieXRlcyBhbGlnbm1lbnQ7ICovCisJVHhCdWZQaHlBZGRyID0gdmlydF90b19idXModnB0ci0+dHhfYnVmZnMpOworCWRpZmYgPSA2NCAtIChUeEJ1ZlBoeUFkZHIgLSAoKFR4QnVmUGh5QWRkciA+PiA2KSA8PCA2KSk7CisJVHhCdWZQaHlBZGRyICs9IGRpZmY7CisJdnB0ci0+dHhiID0gKHVuc2lnbmVkIGNoYXIgKikgKHZwdHItPnR4X2J1ZmZzICsgZGlmZik7CisKKwl2cHRyLT5SeERlc2NBcnJheXMgPSByeF9yaW5nOworCS8qIFJ4IERlc2NyaXB0b3IgbmVlZHMgNjQgYnl0ZXMgYWxpZ25tZW50OyAqLworCVJ4UGh5QWRkciA9IHZpcnRfdG9fYnVzKHZwdHItPlJ4RGVzY0FycmF5cyk7CisJZGlmZiA9IDY0IC0gKFJ4UGh5QWRkciAtICgoUnhQaHlBZGRyID4+IDYpIDw8IDYpKTsKKwlSeFBoeUFkZHIgKz0gZGlmZjsKKwl2cHRyLT5yZF9yaW5nID0gKHN0cnVjdCByeF9kZXNjICopICh2cHRyLT5SeERlc2NBcnJheXMgKyBkaWZmKTsKKworCXZwdHItPnJ4X2J1ZmZzID0gcnhiOworCS8qIFJ4IEJ1ZmZlciBuZWVkcyA2NCBieXRlcyBhbGlnbm1lbnQ7ICovCisJUnhCdWZQaHlBZGRyID0gdmlydF90b19idXModnB0ci0+cnhfYnVmZnMpOworCWRpZmYgPSA2NCAtIChSeEJ1ZlBoeUFkZHIgLSAoKFJ4QnVmUGh5QWRkciA+PiA2KSA8PCA2KSk7CisJUnhCdWZQaHlBZGRyICs9IGRpZmY7CisJdnB0ci0+cnhiID0gKHVuc2lnbmVkIGNoYXIgKikgKHZwdHItPnJ4X2J1ZmZzICsgZGlmZik7CisKKwlpZiAodnB0ci0+UnhEZXNjQXJyYXlzID09IE5VTEwgfHwgdnB0ci0+UnhEZXNjQXJyYXlzID09IE5VTEwpIHsKKwkJcHJpbnRmKCJBbGxvY2F0ZSB0eF9yaW5nIG9yIHJkX3JpbmcgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdnB0ci0+cnhfYnVmX3N6ID0gUEtUX0JVRl9TWjsKKy8qCisgICAgLy8gdHVybiB0aGlzIG9uIHRvIGF2b2lkIHJldHJ5IGZvcmV2ZXIKKyAgICBQQ0lfQllURV9SRUdfQklUU19PTihNT0RFMl9QQ0VST1BULCBQQ0lfUkVHX01PREUyLCBwY2kpOworICAgIC8vIGZvciBzb21lIGxlZ2FjeSBCSU9TIGFuZCBPUyBkb24ndCBvcGVuIEJ1c00KKyAgICAvLyBiaXQgaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UuIFNvLCB0dXJuIGl0IG9uLgorICAgIFBDSV9CWVRFX1JFR19CSVRTX09OKENPTU1BTkRfQlVTTSwgUENJX1JFR19DT01NQU5ELCBwY2kpOworICAgIC8vIHR1cm4gdGhpcyBvbiB0byBkZXRlY3QgTUlJIGNvZGluZyBlcnJvcgorICAgIFBDSV9CWVRFX1JFR19CSVRTX09OKE1PREUzX01JSU9OLCBQQ0lfUkVHX01PREUzLCBwY2kpOworICovCisJcmV0ID0gdmVsb2NpdHlfaW5pdF9yaW5ncyh2cHRyKTsKKworCS8qIEVuc3VyZSBjaGlwIGlzIHJ1bm5pbmcgKi8KKy8vRklYTUU6ICAgICAgICBwY2lfc2V0X3Bvd2VyX3N0YXRlKHZwdHItPnBkZXYsIFBDSV9EMCk7CisKKwl2ZWxvY2l0eV9pbml0X3JlZ2lzdGVycyhuaWMsIHZwdHIsIFZFTE9DSVRZX0lOSVRfQ09MRCk7CisJbWFjX3dyaXRlX2ludF9tYXNrKDAsIHZwdHItPm1hY19yZWdzKTsKKy8vICAgICAgX2ludCh2cHRyLT5tYWNfcmVncyk7CisJLy9tYWNfZW5hYmxlX2ludCh2cHRyLT5tYWNfcmVncyk7CisKKwl2cHRyLT5mbGFncyB8PSBWRUxPQ0lUWV9GTEFHU19PUEVORUQ7CisJcmV0dXJuIDE7CisKK30KKworLyoKKyAqIE1JSSBhY2Nlc3MgLCBtZWRpYSBsaW5rIG1vZGUgc2V0dGluZyBmdW5jdGlvbnMKKyAqLworCisKKy8qKgorICoJbWlpX2luaXQJLQlzZXQgdXAgTUlJCisgKglAdnB0cjogdmVsb2NpdHkgYWRhcHRlcgorICoJQG1paV9zdGF0dXM6ICBsaW5rcyB0YXR1cworICoKKyAqCVNldCB1cCB0aGUgUEhZIGZvciB0aGUgY3VycmVudCBsaW5rIHN0YXRlLgorICovCisKK3N0YXRpYyB2b2lkIG1paV9pbml0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCB1MzIgbWlpX3N0YXR1cyBfX3VudXNlZCkKK3sKKwl1MTYgQk1DUjsKKworCXN3aXRjaCAoUEhZSURfR0VUX1BIWV9JRCh2cHRyLT5waHlfaWQpKSB7CisJY2FzZSBQSFlJRF9DSUNBREFfQ1M4MjAxOgorCQkvKgorCQkgKiAgICAgIFJlc2V0IHRvIGhhcmR3YXJlIGRlZmF1bHQKKwkJICovCisJCU1JSV9SRUdfQklUU19PRkYoKEFOQVJfQVNNRElSIHwgQU5BUl9QQVVTRSksIE1JSV9SRUdfQU5BUiwKKwkJCQkgdnB0ci0+bWFjX3JlZ3MpOworCQkvKgorCQkgKiAgICAgIFR1cm4gb24gRUNIT0RJUyBiaXQgaW4gTldheS1mb3JjZWQgZnVsbCBtb2RlIGFuZCB0dXJuIGl0CisJCSAqICAgICAgb2ZmIGl0IGluIE5XYXktZm9yY2VkIGhhbGYgbW9kZSBmb3IgTldheS1mb3JjZWQgdi5zLiAKKwkJICogICAgICBsZWdhY3ktZm9yY2VkIGlzc3VlLgorCQkgKi8KKwkJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCU1JSV9SRUdfQklUU19PTihUQ1NSX0VDSE9ESVMsIE1JSV9SRUdfVENTUiwKKwkJCQkJdnB0ci0+bWFjX3JlZ3MpOworCQllbHNlCisJCQlNSUlfUkVHX0JJVFNfT0ZGKFRDU1JfRUNIT0RJUywgTUlJX1JFR19UQ1NSLAorCQkJCQkgdnB0ci0+bWFjX3JlZ3MpOworCQkvKgorCQkgKiAgICAgIFR1cm4gb24gTGluay9BY3Rpdml0eSBMRUQgZW5hYmxlIGJpdCBmb3IgQ0lTODIwMQorCQkgKi8KKwkJTUlJX1JFR19CSVRTX09OKFBMRURfTEFMQkUsIE1JSV9SRUdfUExFRCwgdnB0ci0+bWFjX3JlZ3MpOworCQlicmVhazsKKwljYXNlIFBIWUlEX1ZUMzIxNl8zMkJJVDoKKwljYXNlIFBIWUlEX1ZUMzIxNl82NEJJVDoKKwkJLyoKKwkJICogICAgICBSZXNldCB0byBoYXJkd2FyZSBkZWZhdWx0CisJCSAqLworCQlNSUlfUkVHX0JJVFNfT04oKEFOQVJfQVNNRElSIHwgQU5BUl9QQVVTRSksIE1JSV9SRUdfQU5BUiwKKwkJCQl2cHRyLT5tYWNfcmVncyk7CisJCS8qCisJCSAqICAgICAgVHVybiBvbiBFQ0hPRElTIGJpdCBpbiBOV2F5LWZvcmNlZCBmdWxsIG1vZGUgYW5kIHR1cm4gaXQKKwkJICogICAgICBvZmYgaXQgaW4gTldheS1mb3JjZWQgaGFsZiBtb2RlIGZvciBOV2F5LWZvcmNlZCB2LnMuIAorCQkgKiAgICAgIGxlZ2FjeS1mb3JjZWQgaXNzdWUKKwkJICovCisJCWlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpCisJCQlNSUlfUkVHX0JJVFNfT04oVENTUl9FQ0hPRElTLCBNSUlfUkVHX1RDU1IsCisJCQkJCXZwdHItPm1hY19yZWdzKTsKKwkJZWxzZQorCQkJTUlJX1JFR19CSVRTX09GRihUQ1NSX0VDSE9ESVMsIE1JSV9SRUdfVENTUiwKKwkJCQkJIHZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFBIWUlEX01BUlZFTExfMTAwMDoKKwljYXNlIFBIWUlEX01BUlZFTExfMTAwMFM6CisJCS8qCisJCSAqICAgICAgQXNzZXJ0IENSUyBvbiBUcmFuc21pdCAKKwkJICovCisJCU1JSV9SRUdfQklUU19PTihQU0NSX0FDUlNUWCwgTUlJX1JFR19QU0NSLCB2cHRyLT5tYWNfcmVncyk7CisJCS8qCisJCSAqICAgICAgUmVzZXQgdG8gaGFyZHdhcmUgZGVmYXVsdCAKKwkJICovCisJCU1JSV9SRUdfQklUU19PTigoQU5BUl9BU01ESVIgfCBBTkFSX1BBVVNFKSwgTUlJX1JFR19BTkFSLAorCQkJCXZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwl2ZWxvY2l0eV9taWlfcmVhZCh2cHRyLT5tYWNfcmVncywgTUlJX1JFR19CTUNSLCAmQk1DUik7CisJaWYgKEJNQ1IgJiBCTUNSX0lTTykgeworCQlCTUNSICY9IH5CTUNSX0lTTzsKKwkJdmVsb2NpdHlfbWlpX3dyaXRlKHZwdHItPm1hY19yZWdzLCBNSUlfUkVHX0JNQ1IsIEJNQ1IpOworCX0KK30KKworLyoqCisgKglzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsCS0JYXV0b3BvbGwgb2ZmCisgKglAcmVnczogdmVsb2NpdHkgcmVnaXN0ZXJzCisgKgorICoJVHVybiBvZmYgdGhlIGF1dG9wb2xsIGFuZCB3YWl0IGZvciBpdCB0byBkaXNhYmxlIG9uIHRoZSBjaGlwCisgKi8KKworc3RhdGljIHZvaWQgc2FmZV9kaXNhYmxlX21paV9hdXRvcG9sbChzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MpCit7CisJdTE2IHd3OworCisJLyogIHR1cm4gb2ZmIE1BVVRPICovCisJd3JpdGViKDAsICZyZWdzLT5NSUlDUik7CisJZm9yICh3dyA9IDA7IHd3IDwgV19NQVhfVElNRU9VVDsgd3crKykgeworCQl1ZGVsYXkoMSk7CisJCWlmIChCWVRFX1JFR19CSVRTX0lTX09OKE1JSVNSX01JRExFLCAmcmVncy0+TUlJU1IpKQorCQkJYnJlYWs7CisJfQorfQorCisvKioKKyAqCWVuYWJsZV9taWlfYXV0b3BvbGwJLQl0dXJuIG9uIGF1dG9wb2xsaW5nCisgKglAcmVnczogdmVsb2NpdHkgcmVnaXN0ZXJzCisgKgorICoJRW5hYmxlIHRoZSBNSUkgbGluayBzdGF0dXMgYXV0b3BvbGwgZmVhdHVyZSBvbiB0aGUgVmVsb2NpdHkKKyAqCWhhcmR3YXJlLiBXYWl0IGZvciBpdCB0byBlbmFibGUuCisgKi8KKworc3RhdGljIHZvaWQgZW5hYmxlX21paV9hdXRvcG9sbChzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IGlpOworCisJd3JpdGViKDAsICYocmVncy0+TUlJQ1IpKTsKKwl3cml0ZWIoTUlJQURSX1NXTVBMLCAmcmVncy0+TUlJQURSKTsKKworCWZvciAoaWkgPSAwOyBpaSA8IFdfTUFYX1RJTUVPVVQ7IGlpKyspIHsKKwkJdWRlbGF5KDEpOworCQlpZiAoQllURV9SRUdfQklUU19JU19PTihNSUlTUl9NSURMRSwgJnJlZ3MtPk1JSVNSKSkKKwkJCWJyZWFrOworCX0KKworCXdyaXRlYihNSUlDUl9NQVVUTywgJnJlZ3MtPk1JSUNSKTsKKworCWZvciAoaWkgPSAwOyBpaSA8IFdfTUFYX1RJTUVPVVQ7IGlpKyspIHsKKwkJdWRlbGF5KDEpOworCQlpZiAoIUJZVEVfUkVHX0JJVFNfSVNfT04oTUlJU1JfTUlETEUsICZyZWdzLT5NSUlTUikpCisJCQlicmVhazsKKwl9CisKK30KKworLyoqCisgKgl2ZWxvY2l0eV9taWlfcmVhZAktCXJlYWQgTUlJIGRhdGEKKyAqCUByZWdzOiB2ZWxvY2l0eSByZWdpc3RlcnMKKyAqCUBpbmRleDogTUlJIHJlZ2lzdGVyIGluZGV4CisgKglAZGF0YTogYnVmZmVyIGZvciByZWNlaXZlZCBkYXRhCisgKgorICoJUGVyZm9ybSBhIHNpbmdsZSByZWFkIG9mIGFuIE1JSSAxNmJpdCByZWdpc3Rlci4gUmV0dXJucyB6ZXJvCisgKglvbiBzdWNjZXNzIG9yIC1FVElNRURPVVQgaWYgdGhlIFBIWSBkaWQgbm90IHJlc3BvbmQuCisgKi8KKworc3RhdGljIGludCB2ZWxvY2l0eV9taWlfcmVhZChzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MsIHU4IGluZGV4LCB1MTYgKiBkYXRhKQoreworCXUxNiB3dzsKKworCS8qCisJICogICAgICBEaXNhYmxlIE1JSUNSX01BVVRPLCBzbyB0aGF0IG1paSBhZGRyIGNhbiBiZSBzZXQgbm9ybWFsbHkKKwkgKi8KKwlzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsKHJlZ3MpOworCisJd3JpdGViKGluZGV4LCAmcmVncy0+TUlJQURSKTsKKworCUJZVEVfUkVHX0JJVFNfT04oTUlJQ1JfUkNNRCwgJnJlZ3MtPk1JSUNSKTsKKworCWZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKKwkJaWYgKCEocmVhZGIoJnJlZ3MtPk1JSUNSKSAmIE1JSUNSX1JDTUQpKQorCQkJYnJlYWs7CisJfQorCisJKmRhdGEgPSByZWFkdygmcmVncy0+TUlJREFUQSk7CisKKwllbmFibGVfbWlpX2F1dG9wb2xsKHJlZ3MpOworCWlmICh3dyA9PSBXX01BWF9USU1FT1VUKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfbWlpX3dyaXRlCS0Jd3JpdGUgTUlJIGRhdGEKKyAqCUByZWdzOiB2ZWxvY2l0eSByZWdpc3RlcnMKKyAqCUBpbmRleDogTUlJIHJlZ2lzdGVyIGluZGV4CisgKglAZGF0YTogMTZiaXQgZGF0YSBmb3IgdGhlIE1JSSByZWdpc3RlcgorICoKKyAqCVBlcmZvcm0gYSBzaW5nbGUgd3JpdGUgdG8gYW4gTUlJIDE2Yml0IHJlZ2lzdGVyLiBSZXR1cm5zIHplcm8KKyAqCW9uIHN1Y2Nlc3Mgb3IgLUVUSU1FRE9VVCBpZiB0aGUgUEhZIGRpZCBub3QgcmVzcG9uZC4KKyAqLworCitzdGF0aWMgaW50IHZlbG9jaXR5X21paV93cml0ZShzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MsIHU4IG1paV9hZGRyLCB1MTYgZGF0YSkKK3sKKwl1MTYgd3c7CisKKwkvKgorCSAqICAgICAgRGlzYWJsZSBNSUlDUl9NQVVUTywgc28gdGhhdCBtaWkgYWRkciBjYW4gYmUgc2V0IG5vcm1hbGx5CisJICovCisJc2FmZV9kaXNhYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKworCS8qIE1JSSByZWcgb2Zmc2V0ICovCisJd3JpdGViKG1paV9hZGRyLCAmcmVncy0+TUlJQURSKTsKKwkvKiBzZXQgTUlJIGRhdGEgKi8KKwl3cml0ZXcoZGF0YSwgJnJlZ3MtPk1JSURBVEEpOworCisJLyogdHVybiBvbiBNSUlDUl9XQ01EICovCisJQllURV9SRUdfQklUU19PTihNSUlDUl9XQ01ELCAmcmVncy0+TUlJQ1IpOworCisJLyogV19NQVhfVElNRU9VVCBpcyB0aGUgdGltZW91dCBwZXJpb2QgKi8KKwlmb3IgKHd3ID0gMDsgd3cgPCBXX01BWF9USU1FT1VUOyB3dysrKSB7CisJCXVkZWxheSg1KTsKKwkJaWYgKCEocmVhZGIoJnJlZ3MtPk1JSUNSKSAmIE1JSUNSX1dDTUQpKQorCQkJYnJlYWs7CisJfQorCWVuYWJsZV9taWlfYXV0b3BvbGwocmVncyk7CisKKwlpZiAod3cgPT0gV19NQVhfVElNRU9VVCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKioKKyAqCXZlbG9jaXR5X2dldF9vcHRfbWVkaWFfbW9kZQktCWdldCBtZWRpYSBzZWxlY3Rpb24KKyAqCUB2cHRyOiB2ZWxvY2l0eSBhZGFwdGVyCisgKgorICoJR2V0IHRoZSBtZWRpYSBtb2RlIHN0b3JlZCBpbiBFRVBST00gb3IgbW9kdWxlIG9wdGlvbnMgYW5kIGxvYWQKKyAqCW1paV9zdGF0dXMgYWNjb3JkaW5nbHkuIFRoZSByZXF1ZXN0ZWQgbGluayBzdGF0ZSBpbmZvcm1hdGlvbgorICoJaXMgYWxzbyByZXR1cm5lZC4KKyAqLworCitzdGF0aWMgdTMyIHZlbG9jaXR5X2dldF9vcHRfbWVkaWFfbW9kZShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwl1MzIgc3RhdHVzID0gMDsKKworCXN3aXRjaCAodnB0ci0+b3B0aW9ucy5zcGRfZHB4KSB7CisJY2FzZSBTUERfRFBYX0FVVE86CisJCXN0YXR1cyA9IFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFOworCQlicmVhazsKKwljYXNlIFNQRF9EUFhfMTAwX0ZVTEw6CisJCXN0YXR1cyA9IFZFTE9DSVRZX1NQRUVEXzEwMCB8IFZFTE9DSVRZX0RVUExFWF9GVUxMOworCQlicmVhazsKKwljYXNlIFNQRF9EUFhfMTBfRlVMTDoKKwkJc3RhdHVzID0gVkVMT0NJVFlfU1BFRURfMTAgfCBWRUxPQ0lUWV9EVVBMRVhfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBTUERfRFBYXzEwMF9IQUxGOgorCQlzdGF0dXMgPSBWRUxPQ0lUWV9TUEVFRF8xMDA7CisJCWJyZWFrOworCWNhc2UgU1BEX0RQWF8xMF9IQUxGOgorCQlzdGF0dXMgPSBWRUxPQ0lUWV9TUEVFRF8xMDsKKwkJYnJlYWs7CisJfQorCXZwdHItPm1paV9zdGF0dXMgPSBzdGF0dXM7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKgltaWlfc2V0X2F1dG9fb24JCS0JYXV0b25lZ290aWF0ZSBvbgorICoJQHZwdHI6IHZlbG9jaXR5CisgKgorICoJRW5hYmxlIGF1dG9uZWdvdGF0aW9uIG9uIHRoaXMgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIHZvaWQgbWlpX3NldF9hdXRvX29uKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWlmIChNSUlfUkVHX0JJVFNfSVNfT04oQk1DUl9BVVRPLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKSkKKwkJTUlJX1JFR19CSVRTX09OKEJNQ1JfUkVBVVRPLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKTsKKwllbHNlCisJCU1JSV9SRUdfQklUU19PTihCTUNSX0FVVE8sIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOworfQorCisKKy8qCitzdGF0aWMgdm9pZCBtaWlfc2V0X2F1dG9fb2ZmKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICogdnB0cikKK3sKKyAgICBNSUlfUkVHX0JJVFNfT0ZGKEJNQ1JfQVVUTywgTUlJX1JFR19CTUNSLCB2cHRyLT5tYWNfcmVncyk7Cit9CisqLworCisvKioKKyAqCXNldF9taWlfZmxvd19jb250cm9sCS0JZmxvdyBjb250cm9sIHNldHVwCisgKglAdnB0cjogdmVsb2NpdHkgaW50ZXJmYWNlCisgKgorICoJU2V0IHVwIHRoZSBmbG93IGNvbnRyb2wgb24gdGhpcyBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvCisgKgl0aGUgc3VwcGxpZWQgdXNlci9lZXByb20gb3B0aW9ucy4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbWlpX2Zsb3dfY29udHJvbChzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwkvKkVuYWJsZSBvciBEaXNhYmxlIFBBVVNFIGluIEFOQVIgKi8KKwlzd2l0Y2ggKHZwdHItPm9wdGlvbnMuZmxvd19jbnRsKSB7CisJY2FzZSBGTE9XX0NOVExfVFg6CisJCU1JSV9SRUdfQklUU19PRkYoQU5BUl9QQVVTRSwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCU1JSV9SRUdfQklUU19PTihBTkFSX0FTTURJUiwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfUlg6CisJCU1JSV9SRUdfQklUU19PTihBTkFSX1BBVVNFLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJTUlJX1JFR19CSVRTX09OKEFOQVJfQVNNRElSLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ05UTF9UWF9SWDoKKwkJTUlJX1JFR19CSVRTX09OKEFOQVJfUEFVU0UsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT04oQU5BUl9BU01ESVIsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlicmVhazsKKworCWNhc2UgRkxPV19DTlRMX0RJU0FCTEU6CisJCU1JSV9SRUdfQklUU19PRkYoQU5BUl9QQVVTRSwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCU1JSV9SRUdfQklUU19PRkYoQU5BUl9BU01ESVIsIE1JSV9SRUdfQU5BUiwKKwkJCQkgdnB0ci0+bWFjX3JlZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfc2V0X21lZGlhX21vZGUJCS0Jc2V0IG1lZGlhIG1vZGUKKyAqCUBtaWlfc3RhdHVzOiBvbGQgTUlJIGxpbmsgc3RhdGUKKyAqCisgKglDaGVjayB0aGUgbWVkaWEgbGluayBzdGF0ZSBhbmQgY29uZmlndXJlIHRoZSBmbG93IGNvbnRyb2wKKyAqCVBIWSBhbmQgYWxzbyB2ZWxvY2l0eSBoYXJkd2FyZSBzZXR1cCBhY2NvcmRpbmdseS4gSW4gcGFydGljdWxhcgorICoJd2UgbmVlZCB0byBzZXQgdXAgQ0QgcG9sbGluZyBhbmQgZnJhbWUgYnVyc3RpbmcuCisgKi8KKworc3RhdGljIGludCB2ZWxvY2l0eV9zZXRfbWVkaWFfbW9kZShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwKKwkJCQkgICB1MzIgbWlpX3N0YXR1cykKK3sKKwl1MzIgY3Vycl9zdGF0dXM7CisJc3RydWN0IG1hY19yZWdzICpyZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwl2cHRyLT5taWlfc3RhdHVzID0gbWlpX2NoZWNrX21lZGlhX21vZGUodnB0ci0+bWFjX3JlZ3MpOworCWN1cnJfc3RhdHVzID0gdnB0ci0+bWlpX3N0YXR1cyAmICh+VkVMT0NJVFlfTElOS19GQUlMKTsKKworCS8qIFNldCBtaWkgbGluayBzdGF0dXMgKi8KKwlzZXRfbWlpX2Zsb3dfY29udHJvbCh2cHRyKTsKKworCS8qCisJICAgQ2hlY2sgaWYgbmV3IHN0YXR1cyBpcyBjb25zaXNlbnQgd2l0aCBjdXJyZW50IHN0YXR1cworCSAgIGlmICgoKG1paV9zdGF0dXMgJiBjdXJyX3N0YXR1cykgJiBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSkKKwkgICB8fCAobWlpX3N0YXR1cz09Y3Vycl9zdGF0dXMpKSB7CisJICAgdnB0ci0+bWlpX3N0YXR1cz1taWlfY2hlY2tfbWVkaWFfbW9kZSh2cHRyLT5tYWNfcmVncyk7CisJICAgdnB0ci0+bWlpX3N0YXR1cz1jaGVja19jb25uZWN0aW9uX3R5cGUodnB0ci0+bWFjX3JlZ3MpOworCSAgIHByaW50ZihNU0dfTEVWRUxfSU5GTywgIlZlbG9jaXR5IGxpbmsgbm8gY2hhbmdlXG4iKTsKKwkgICByZXR1cm4gMDsKKwkgICB9CisJICovCisKKwlpZiAoUEhZSURfR0VUX1BIWV9JRCh2cHRyLT5waHlfaWQpID09IFBIWUlEX0NJQ0FEQV9DUzgyMDEpIHsKKwkJTUlJX1JFR19CSVRTX09OKEFVWENSX01EUFBTLCBNSUlfUkVHX0FVWENSLAorCQkJCXZwdHItPm1hY19yZWdzKTsKKwl9CisKKwkvKgorCSAqICAgICAgSWYgY29ubmVjdGlvbiB0eXBlIGlzIEFVVE8KKwkgKi8KKwlpZiAobWlpX3N0YXR1cyAmIFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFKSB7CisJCXByaW50ZigiVmVsb2NpdHkgaXMgQVVUTyBtb2RlXG4iKTsKKwkJLyogY2xlYXIgZm9yY2UgTUFDIG1vZGUgYml0ICovCisJCUJZVEVfUkVHX0JJVFNfT0ZGKENISVBHQ1JfRkNNT0RFLCAmcmVncy0+Q0hJUEdDUik7CisJCS8qIHNldCBkdXBsZXggbW9kZSBvZiBNQUMgYWNjb3JkaW5nIHRvIGR1cGxleCBtb2RlIG9mIE1JSSAqLworCQlNSUlfUkVHX0JJVFNfT04oQU5BUl9UWEZEIHwgQU5BUl9UWCB8IEFOQVJfMTBGRCB8IEFOQVJfMTAsCisJCQkJTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCU1JSV9SRUdfQklUU19PTihHMTAwMENSXzEwMDBGRCB8IEcxMDAwQ1JfMTAwMCwKKwkJCQlNSUlfUkVHX0cxMDAwQ1IsIHZwdHItPm1hY19yZWdzKTsKKwkJTUlJX1JFR19CSVRTX09OKEJNQ1JfU1BFRUQxRywgTUlJX1JFR19CTUNSLAorCQkJCXZwdHItPm1hY19yZWdzKTsKKworCQkvKiBlbmFibGUgQVVUTy1ORUdPIG1vZGUgKi8KKwkJbWlpX3NldF9hdXRvX29uKHZwdHIpOworCX0gZWxzZSB7CisJCXUxNiBBTkFSOworCQl1OCBDSElQR0NSOworCisJCS8qCisJCSAqIDEuIGlmIGl0J3MgMzExOSwgZGlzYWJsZSBmcmFtZSBidXJzdGluZyBpbiBoYWxmZHVwbGV4IG1vZGUKKwkJICogICAgYW5kIGVuYWJsZSBpdCBpbiBmdWxsZHVwbGV4IG1vZGUKKwkJICogMi4gc2V0IGNvcnJlY3QgTUlJL0dNSUkgYW5kIGhhbGYvZnVsbCBkdXBsZXggbW9kZSBpbiBDSElQR0NSCisJCSAqIDMuIG9ubHkgZW5hYmxlIENEIGhlYXJ0IGJlYXQgY291bnRlciBpbiAxMEhEIG1vZGUKKwkJICovCisKKwkJLyogc2V0IGZvcmNlIE1BQyBtb2RlIGJpdCAqLworCQlCWVRFX1JFR19CSVRTX09OKENISVBHQ1JfRkNNT0RFLCAmcmVncy0+Q0hJUEdDUik7CisKKwkJQ0hJUEdDUiA9IHJlYWRiKCZyZWdzLT5DSElQR0NSKTsKKwkJQ0hJUEdDUiAmPSB+Q0hJUEdDUl9GQ0dNSUk7CisKKwkJaWYgKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkgeworCQkJQ0hJUEdDUiB8PSBDSElQR0NSX0ZDRkRYOworCQkJd3JpdGViKENISVBHQ1IsICZyZWdzLT5DSElQR0NSKTsKKwkJCXByaW50ZgorCQkJICAgICgiREVCVUc6IHNldCBWZWxvY2l0eSB0byBmb3JjZWQgZnVsbCBtb2RlXG4iKTsKKwkJCWlmICh2cHRyLT5yZXZfaWQgPCBSRVZfSURfVlQzMjE2X0EwKQorCQkJCUJZVEVfUkVHX0JJVFNfT0ZGKFRDUl9UQjJCRElTLCAmcmVncy0+VENSKTsKKwkJfSBlbHNlIHsKKwkJCUNISVBHQ1IgJj0gfkNISVBHQ1JfRkNGRFg7CisJCQlwcmludGYKKwkJCSAgICAoIkRFQlVHOiBzZXQgVmVsb2NpdHkgdG8gZm9yY2VkIGhhbGYgbW9kZVxuIik7CisJCQl3cml0ZWIoQ0hJUEdDUiwgJnJlZ3MtPkNISVBHQ1IpOworCQkJaWYgKHZwdHItPnJldl9pZCA8IFJFVl9JRF9WVDMyMTZfQTApCisJCQkJQllURV9SRUdfQklUU19PTihUQ1JfVEIyQkRJUywgJnJlZ3MtPlRDUik7CisJCX0KKworCQlNSUlfUkVHX0JJVFNfT0ZGKEcxMDAwQ1JfMTAwMEZEIHwgRzEwMDBDUl8xMDAwLAorCQkJCSBNSUlfUkVHX0cxMDAwQ1IsIHZwdHItPm1hY19yZWdzKTsKKworCQlpZiAoIShtaWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpCisJCSAgICAmJiAobWlpX3N0YXR1cyAmIFZFTE9DSVRZX1NQRUVEXzEwKSkgeworCQkJQllURV9SRUdfQklUU19PRkYoVEVTVENGR19IQkRJUywgJnJlZ3MtPlRFU1RDRkcpOworCQl9IGVsc2UgeworCQkJQllURV9SRUdfQklUU19PTihURVNUQ0ZHX0hCRElTLCAmcmVncy0+VEVTVENGRyk7CisJCX0KKwkJLyogTUlJX1JFR19CSVRTX09GRihCTUNSX1NQRUVEMUcsIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOyAqLworCQl2ZWxvY2l0eV9taWlfcmVhZCh2cHRyLT5tYWNfcmVncywgTUlJX1JFR19BTkFSLCAmQU5BUik7CisJCUFOQVIgJj0gKH4oQU5BUl9UWEZEIHwgQU5BUl9UWCB8IEFOQVJfMTBGRCB8IEFOQVJfMTApKTsKKwkJaWYgKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9TUEVFRF8xMDApIHsKKwkJCWlmIChtaWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpCisJCQkJQU5BUiB8PSBBTkFSX1RYRkQ7CisJCQllbHNlCisJCQkJQU5BUiB8PSBBTkFSX1RYOworCQl9IGVsc2UgeworCQkJaWYgKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCQlBTkFSIHw9IEFOQVJfMTBGRDsKKwkJCWVsc2UKKwkJCQlBTkFSIHw9IEFOQVJfMTA7CisJCX0KKwkJdmVsb2NpdHlfbWlpX3dyaXRlKHZwdHItPm1hY19yZWdzLCBNSUlfUkVHX0FOQVIsIEFOQVIpOworCQkvKiBlbmFibGUgQVVUTy1ORUdPIG1vZGUgKi8KKwkJbWlpX3NldF9hdXRvX29uKHZwdHIpOworCQkvKiBNSUlfUkVHX0JJVFNfT04oQk1DUl9BVVRPLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKTsgKi8KKwl9CisJLyogdnB0ci0+bWlpX3N0YXR1cz1taWlfY2hlY2tfbWVkaWFfbW9kZSh2cHRyLT5tYWNfcmVncyk7ICovCisJLyogdnB0ci0+bWlpX3N0YXR1cz1jaGVja19jb25uZWN0aW9uX3R5cGUodnB0ci0+bWFjX3JlZ3MpOyAqLworCXJldHVybiBWRUxPQ0lUWV9MSU5LX0NIQU5HRTsKK30KKworLyoqCisgKgltaWlfY2hlY2tfbWVkaWFfbW9kZQktCWNoZWNrIG1lZGlhIHN0YXRlCisgKglAcmVnczogdmVsb2NpdHkgcmVnaXN0ZXJzCisgKgorICoJQ2hlY2sgdGhlIGN1cnJlbnQgTUlJIHN0YXR1cyBhbmQgZGV0ZXJtaW5lIHRoZSBsaW5rIHN0YXR1cworICoJYWNjb3JkaW5nbHkKKyAqLworCitzdGF0aWMgdTMyIG1paV9jaGVja19tZWRpYV9tb2RlKHN0cnVjdCBtYWNfcmVncyAqcmVncykKK3sKKwl1MzIgc3RhdHVzID0gMDsKKwl1MTYgQU5BUjsKKworCWlmICghTUlJX1JFR19CSVRTX0lTX09OKEJNU1JfTE5LLCBNSUlfUkVHX0JNU1IsIHJlZ3MpKQorCQlzdGF0dXMgfD0gVkVMT0NJVFlfTElOS19GQUlMOworCisJaWYgKE1JSV9SRUdfQklUU19JU19PTihHMTAwMENSXzEwMDBGRCwgTUlJX1JFR19HMTAwMENSLCByZWdzKSkKKwkJc3RhdHVzIHw9IFZFTE9DSVRZX1NQRUVEXzEwMDAgfCBWRUxPQ0lUWV9EVVBMRVhfRlVMTDsKKwllbHNlIGlmIChNSUlfUkVHX0JJVFNfSVNfT04oRzEwMDBDUl8xMDAwLCBNSUlfUkVHX0cxMDAwQ1IsIHJlZ3MpKQorCQlzdGF0dXMgfD0gKFZFTE9DSVRZX1NQRUVEXzEwMDApOworCWVsc2UgeworCQl2ZWxvY2l0eV9taWlfcmVhZChyZWdzLCBNSUlfUkVHX0FOQVIsICZBTkFSKTsKKwkJaWYgKEFOQVIgJiBBTkFSX1RYRkQpCisJCQlzdGF0dXMgfD0KKwkJCSAgICAoVkVMT0NJVFlfU1BFRURfMTAwIHwgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpOworCQllbHNlIGlmIChBTkFSICYgQU5BUl9UWCkKKwkJCXN0YXR1cyB8PSBWRUxPQ0lUWV9TUEVFRF8xMDA7CisJCWVsc2UgaWYgKEFOQVIgJiBBTkFSXzEwRkQpCisJCQlzdGF0dXMgfD0KKwkJCSAgICAoVkVMT0NJVFlfU1BFRURfMTAgfCBWRUxPQ0lUWV9EVVBMRVhfRlVMTCk7CisJCWVsc2UKKwkJCXN0YXR1cyB8PSAoVkVMT0NJVFlfU1BFRURfMTApOworCX0KKworCWlmIChNSUlfUkVHX0JJVFNfSVNfT04oQk1DUl9BVVRPLCBNSUlfUkVHX0JNQ1IsIHJlZ3MpKSB7CisJCXZlbG9jaXR5X21paV9yZWFkKHJlZ3MsIE1JSV9SRUdfQU5BUiwgJkFOQVIpOworCQlpZiAoKEFOQVIgJiAoQU5BUl9UWEZEIHwgQU5BUl9UWCB8IEFOQVJfMTBGRCB8IEFOQVJfMTApKQorCQkgICAgPT0gKEFOQVJfVFhGRCB8IEFOQVJfVFggfCBBTkFSXzEwRkQgfCBBTkFSXzEwKSkgeworCQkJaWYgKE1JSV9SRUdfQklUU19JU19PTgorCQkJICAgIChHMTAwMENSXzEwMDAgfCBHMTAwMENSXzEwMDBGRCwKKwkJCSAgICAgTUlJX1JFR19HMTAwMENSLCByZWdzKSkKKwkJCQlzdGF0dXMgfD0gVkVMT0NJVFlfQVVUT05FR19FTkFCTEU7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdTMyIGNoZWNrX2Nvbm5lY3Rpb25fdHlwZShzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MpCit7CisJdTMyIHN0YXR1cyA9IDA7CisJdTggUEhZU1IwOworCXUxNiBBTkFSOworCVBIWVNSMCA9IHJlYWRiKCZyZWdzLT5QSFlTUjApOworCisJLyoKKwkgICBpZiAoIShQSFlTUjAgJiBQSFlTUjBfTElOS0dEKSkKKwkgICBzdGF0dXN8PVZFTE9DSVRZX0xJTktfRkFJTDsKKwkgKi8KKworCWlmIChQSFlTUjAgJiBQSFlTUjBfRkRQWCkKKwkJc3RhdHVzIHw9IFZFTE9DSVRZX0RVUExFWF9GVUxMOworCisJaWYgKFBIWVNSMCAmIFBIWVNSMF9TUERHKQorCQlzdGF0dXMgfD0gVkVMT0NJVFlfU1BFRURfMTAwMDsKKwlpZiAoUEhZU1IwICYgUEhZU1IwX1NQRDEwKQorCQlzdGF0dXMgfD0gVkVMT0NJVFlfU1BFRURfMTA7CisJZWxzZQorCQlzdGF0dXMgfD0gVkVMT0NJVFlfU1BFRURfMTAwOworCisJaWYgKE1JSV9SRUdfQklUU19JU19PTihCTUNSX0FVVE8sIE1JSV9SRUdfQk1DUiwgcmVncykpIHsKKwkJdmVsb2NpdHlfbWlpX3JlYWQocmVncywgTUlJX1JFR19BTkFSLCAmQU5BUik7CisJCWlmICgoQU5BUiAmIChBTkFSX1RYRkQgfCBBTkFSX1RYIHwgQU5BUl8xMEZEIHwgQU5BUl8xMCkpCisJCSAgICA9PSAoQU5BUl9UWEZEIHwgQU5BUl9UWCB8IEFOQVJfMTBGRCB8IEFOQVJfMTApKSB7CisJCQlpZiAoTUlJX1JFR19CSVRTX0lTX09OCisJCQkgICAgKEcxMDAwQ1JfMTAwMCB8IEcxMDAwQ1JfMTAwMEZELAorCQkJICAgICBNSUlfUkVHX0cxMDAwQ1IsIHJlZ3MpKQorCQkJCXN0YXR1cyB8PSBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoJZW5hYmxlX2Zsb3dfY29udHJvbF9hYmlsaXR5CS0JZmxvdyBjb250cm9sCisgKglAdnB0cjogdmVsb2l0eSB0byBjb25maWd1cmUKKyAqCisgKglTZXQgdXAgZmxvdyBjb250cm9sIGFjY29yZGluZyB0byB0aGUgZmxvdyBjb250cm9sIG9wdGlvbnMKKyAqCWRldGVybWluZWQgYnkgdGhlIGVlcHJvbS9jb25maWd1cmF0aW9uLgorICovCisKK3N0YXRpYyB2b2lkIGVuYWJsZV9mbG93X2NvbnRyb2xfYWJpbGl0eShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKworCXN0cnVjdCBtYWNfcmVncyAqcmVncyA9IHZwdHItPm1hY19yZWdzOworCisJc3dpdGNoICh2cHRyLT5vcHRpb25zLmZsb3dfY250bCkgeworCisJY2FzZSBGTE9XX0NOVExfREVGQVVMVDoKKwkJaWYgKEJZVEVfUkVHX0JJVFNfSVNfT04oUEhZU1IwX1JYRkxDLCAmcmVncy0+UEhZU1IwKSkKKwkJCXdyaXRlbChDUjBfRkRYUkZDRU4sICZyZWdzLT5DUjBTZXQpOworCQllbHNlCisJCQl3cml0ZWwoQ1IwX0ZEWFJGQ0VOLCAmcmVncy0+Q1IwQ2xyKTsKKworCQlpZiAoQllURV9SRUdfQklUU19JU19PTihQSFlTUjBfVFhGTEMsICZyZWdzLT5QSFlTUjApKQorCQkJd3JpdGVsKENSMF9GRFhURkNFTiwgJnJlZ3MtPkNSMFNldCk7CisJCWVsc2UKKwkJCXdyaXRlbChDUjBfRkRYVEZDRU4sICZyZWdzLT5DUjBDbHIpOworCQlicmVhazsKKworCWNhc2UgRkxPV19DTlRMX1RYOgorCQl3cml0ZWwoQ1IwX0ZEWFRGQ0VOLCAmcmVncy0+Q1IwU2V0KTsKKwkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMENscik7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfUlg6CisJCXdyaXRlbChDUjBfRkRYUkZDRU4sICZyZWdzLT5DUjBTZXQpOworCQl3cml0ZWwoQ1IwX0ZEWFRGQ0VOLCAmcmVncy0+Q1IwQ2xyKTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ05UTF9UWF9SWDoKKwkJd3JpdGVsKENSMF9GRFhURkNFTiwgJnJlZ3MtPkNSMFNldCk7CisJCXdyaXRlbChDUjBfRkRYUkZDRU4sICZyZWdzLT5DUjBTZXQpOworCQlicmVhazsKKworCWNhc2UgRkxPV19DTlRMX0RJU0FCTEU6CisJCXdyaXRlbChDUjBfRkRYUkZDRU4sICZyZWdzLT5DUjBDbHIpOworCQl3cml0ZWwoQ1IwX0ZEWFRGQ0VOLCAmcmVncy0+Q1IwQ2xyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKK30KKworLyogRklYTUU6IE1vdmUgdG8gcGNpLmMgKi8KKy8qKgorICogcGNpX3NldF9wb3dlcl9zdGF0ZSAtIFNldCB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCisgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAorICogQHN0YXRlOiBQb3dlciBzdGF0ZSB3ZSdyZSBlbnRlcmluZworICoKKyAqIFRyYW5zaXRpb24gYSBkZXZpY2UgdG8gYSBuZXcgcG93ZXIgc3RhdGUsIHVzaW5nIHRoZSBQb3dlciBNYW5hZ2VtZW50IAorICogQ2FwYWJpbGl0aWVzIGluIHRoZSBkZXZpY2UncyBjb25maWcgc3BhY2UuCisgKgorICogUkVUVVJOIFZBTFVFOiAKKyAqIC1FSU5WQUwgaWYgdHJ5aW5nIHRvIGVudGVyIGEgbG93ZXIgc3RhdGUgdGhhbiB3ZSdyZSBhbHJlYWR5IGluLgorICogMCBpZiB3ZSdyZSBhbHJlYWR5IGluIHRoZSByZXF1ZXN0ZWQgc3RhdGUuCisgKiAtRUlPIGlmIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFBDSSBQTS4KKyAqIDAgaWYgd2UgY2FuIHN1Y2Nlc3NmdWxseSBjaGFuZ2UgdGhlIHBvd2VyIHN0YXRlLgorICovCisKK2ludCBwY2lfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIGludCBzdGF0ZSkKK3sKKwlpbnQgcG07CisJdTE2IHBtY3NyOworCWludCBjdXJyZW50X3N0YXRlID0gMDsKKworCS8qIGJvdW5kIHRoZSBzdGF0ZSB3ZSdyZSBlbnRlcmluZyAqLworCWlmIChzdGF0ZSA+IDMpCisJCXN0YXRlID0gMzsKKworCS8qIFZhbGlkYXRlIGN1cnJlbnQgc3RhdGU6CisJICogQ2FuIGVudGVyIEQwIGZyb20gYW55IHN0YXRlLCBidXQgaWYgd2UgY2FuIG9ubHkgZ28gZGVlcGVyIAorCSAqIHRvIHNsZWVwIGlmIHdlJ3JlIGFscmVhZHkgaW4gYSBsb3cgcG93ZXIgc3RhdGUKKwkgKi8KKwlpZiAoc3RhdGUgPiAwICYmIGN1cnJlbnRfc3RhdGUgPiBzdGF0ZSkKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKGN1cnJlbnRfc3RhdGUgPT0gc3RhdGUpCisJCXJldHVybiAwOwkvKiB3ZSdyZSBhbHJlYWR5IHRoZXJlICovCisKKwkvKiBmaW5kIFBDSSBQTSBjYXBhYmlsaXR5IGluIGxpc3QgKi8KKwlwbSA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKKworCS8qIGFib3J0IGlmIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IFBNIGNhcGFiaWxpdGllcyAqLworCWlmICghcG0pCisJCXJldHVybiAtMjsKKworCS8qIGNoZWNrIGlmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIHRoZSBkZXNpcmVkIHN0YXRlICovCisJaWYgKHN0YXRlID09IDEgfHwgc3RhdGUgPT0gMikgeworCQl1MTYgcG1jOworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBtICsgUENJX1BNX1BNQywgJnBtYyk7CisJCWlmIChzdGF0ZSA9PSAxICYmICEocG1jICYgUENJX1BNX0NBUF9EMSkpCisJCQlyZXR1cm4gLTI7CisJCWVsc2UgaWYgKHN0YXRlID09IDIgJiYgIShwbWMgJiBQQ0lfUE1fQ0FQX0QyKSkKKwkJCXJldHVybiAtMjsKKwl9CisKKwkvKiBJZiB3ZSdyZSBpbiBEMywgZm9yY2UgZW50aXJlIHdvcmQgdG8gMC4KKwkgKiBUaGlzIGRvZXNuJ3QgYWZmZWN0IFBNRV9TdGF0dXMsIGRpc2FibGVzIFBNRV9FbiwgYW5kCisJICogc2V0cyBQb3dlclN0YXRlIHRvIDAuCisJICovCisJaWYgKGN1cnJlbnRfc3RhdGUgPj0gMykKKwkJcG1jc3IgPSAwOworCWVsc2UgeworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBtICsgUENJX1BNX0NUUkwsICZwbWNzcik7CisJCXBtY3NyICY9IH5QQ0lfUE1fQ1RSTF9TVEFURV9NQVNLOworCQlwbWNzciB8PSBzdGF0ZTsKKwl9CisKKwkvKiBlbnRlciBzcGVjaWZpZWQgc3RhdGUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBwbSArIFBDSV9QTV9DVFJMLCBwbWNzcik7CisKKwkvKiBNYW5kYXRvcnkgcG93ZXIgbWFuYWdlbWVudCB0cmFuc2l0aW9uIGRlbGF5cyAqLworCS8qIHNlZSBQQ0kgUE0gMS4xIDUuNi4xIHRhYmxlIDE4ICovCisJaWYgKHN0YXRlID09IDMgfHwgY3VycmVudF9zdGF0ZSA9PSAzKQorCQltZGVsYXkoMTApOworCWVsc2UgaWYgKHN0YXRlID09IDIgfHwgY3VycmVudF9zdGF0ZSA9PSAyKQorCQl1ZGVsYXkoMjAwKTsKKwljdXJyZW50X3N0YXRlID0gc3RhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZlbG9jaXR5X25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTEwNiwgMHgzMTE5LCAidmlhLXZlbG9jaXR5IiwgIlZJQSBOZXR3b3JraW5nIFZlbG9jaXR5IEZhbWlseSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIiLCAwKSwKK307CisKK1BDSV9EUklWRVIgKCB2ZWxvY2l0eV9kcml2ZXIsIHZlbG9jaXR5X25pY3MsIFBDSV9OT19DTEFTUyApOworCitEUklWRVIgKCAiVklBLVZFTE9DSVRZL1BDSSIsIG5pY19kcml2ZXIsIHBjaV9kcml2ZXIsIHZlbG9jaXR5X2RyaXZlciwKKyAgICAgICAgIHZlbG9jaXR5X3Byb2JlLCB2ZWxvY2l0eV9kaXNhYmxlICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaCBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzAyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaApAQCAtMCwwICsxLDE5MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMDMgVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBGaWxlOiB2aWEtdmVsb2NpdHkuaAorICoKKyAqIFB1cnBvc2U6IEhlYWRlciBmaWxlIHRvIGRlZmluZSBkcml2ZXIncyBwcml2YXRlIHN0cnVjdHVyZXMuCisgKgorICogQXV0aG9yOiBDaHVhbmcgTGlhbmctU2hpbmcsIEFKIEppYW5nCisgKgorICogRGF0ZTogSmFuIDI0LCAyMDAzCisgKgorICogQ2hhbmdlcyBmb3IgRXRoZXJib290IFBvcnQ6IAorICogICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IGJ5IFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorICovCisKKyNpZm5kZWYgVkVMT0NJVFlfSAorI2RlZmluZSBWRUxPQ0lUWV9ICisKKyNkZWZpbmUgVkVMT0NJVFlfVFhfQ1NVTV9TVVBQT1JUCisKKyNkZWZpbmUgVkVMT0NJVFlfTkFNRSAgICAgICAgICAidmlhLXZlbG9jaXR5IgorI2RlZmluZSBWRUxPQ0lUWV9GVUxMX0RSVl9OQU0gICJWSUEgTmV0d29ya2luZyBWZWxvY2l0eSBGYW1pbHkgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyIERyaXZlciIKKyNkZWZpbmUgVkVMT0NJVFlfVkVSU0lPTiAgICAgICAiMS4xMyIKKworI2RlZmluZSBQS1RfQlVGX1NaICAgICAgICAgIDE1NjQKKworI2RlZmluZSBNQVhfVU5JVFMgICAgICAgICAgIDgKKyNkZWZpbmUgT1BUSU9OX0RFRkFVTFQgICAgICB7IFswIC4uLiBNQVhfVU5JVFMtMV0gPSAtMX0KKworI2RlZmluZSBSRVZfSURfVlQ2MTEwICAgICAgICgwKQorCisjZGVmaW5lIEJZVEVfUkVHX0JJVFNfT04oeCxwKSAgICAgICBkbyB7IHdyaXRlYihyZWFkYigocCkpfCh4KSwocCkpO30gd2hpbGUgKDApCisjZGVmaW5lIFdPUkRfUkVHX0JJVFNfT04oeCxwKSAgICAgICBkbyB7IHdyaXRldyhyZWFkdygocCkpfCh4KSwocCkpO30gd2hpbGUgKDApCisjZGVmaW5lIERXT1JEX1JFR19CSVRTX09OKHgscCkgICAgICBkbyB7IHdyaXRlbChyZWFkbCgocCkpfCh4KSwocCkpO30gd2hpbGUgKDApCisKKyNkZWZpbmUgQllURV9SRUdfQklUU19JU19PTih4LHApICAgIChyZWFkYigocCkpICYgKHgpKQorI2RlZmluZSBXT1JEX1JFR19CSVRTX0lTX09OKHgscCkgICAgKHJlYWR3KChwKSkgJiAoeCkpCisjZGVmaW5lIERXT1JEX1JFR19CSVRTX0lTX09OKHgscCkgICAocmVhZGwoKHApKSAmICh4KSkKKworI2RlZmluZSBCWVRFX1JFR19CSVRTX09GRih4LHApICAgICAgZG8geyB3cml0ZWIocmVhZGIoKHApKSAmICh+KHgpKSwocCkpO30gd2hpbGUgKDApCisjZGVmaW5lIFdPUkRfUkVHX0JJVFNfT0ZGKHgscCkgICAgICBkbyB7IHdyaXRldyhyZWFkdygocCkpICYgKH4oeCkpLChwKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgRFdPUkRfUkVHX0JJVFNfT0ZGKHgscCkgICAgIGRvIHsgd3JpdGVsKHJlYWRsKChwKSkgJiAofih4KSksKHApKTt9IHdoaWxlICgwKQorCisjZGVmaW5lIEJZVEVfUkVHX0JJVFNfU0VUKHgsbSxwKSAgICBkbyB7IHdyaXRlYiggKHJlYWRiKChwKSkgJiAofihtKSkpIHwoeCksKHApKTt9IHdoaWxlICgwKQorI2RlZmluZSBXT1JEX1JFR19CSVRTX1NFVCh4LG0scCkgICAgZG8geyB3cml0ZXcoIChyZWFkdygocCkpICYgKH4obSkpKSB8KHgpLChwKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgRFdPUkRfUkVHX0JJVFNfU0VUKHgsbSxwKSAgIGRvIHsgd3JpdGVsKCAocmVhZGwoKHApKSAmICh+KG0pKSl8KHgpLChwKSk7fSAgd2hpbGUgKDApCisKKyNkZWZpbmUgVkFSX1VTRUQocCkgICAgIGRvIHsocCk9KHApO30gd2hpbGUgKDApCisKKy8qCisgKiBQdXJwb3NlOiBTdHJ1Y3R1cmVzIGZvciBNQVggUlgvVFggZGVzY3JpcHRvcnMuCisgKi8KKworCisjZGVmaW5lIEJfT1dORURfQllfQ0hJUCAgICAgMQorI2RlZmluZSBCX09XTkVEX0JZX0hPU1QgICAgIDAKKworLyoKKyAqIEJpdHMgaW4gdGhlIFJTUjAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFJTUl9ERVRBRyAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUlNSX1NOVEFHICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBSU1JfUlhFUiAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFJTUl9STCAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgUlNSX0NFICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBSU1JfRkFFICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFJTUl9DUkMgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUlNSX1ZJRE0gICAgICAgICAgIDB4MDAwMQorCisvKgorICogQml0cyBpbiB0aGUgUlNSMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUlNSX1JYT0sgICAgICAgICAgIDB4ODAwMAkvLyByeCBPSworI2RlZmluZSBSU1JfUEZUICAgICAgICAgICAgMHg0MDAwCS8vIFBlcmZlY3QgZmlsdGVyaW5nIGFkZHJlc3MgbWF0Y2gKKyNkZWZpbmUgUlNSX01BUiAgICAgICAgICAgIDB4MjAwMAkvLyBNQUMgYWNjZXB0IG11bHRpY2FzdCBhZGRyZXNzIHBhY2tldAorI2RlZmluZSBSU1JfQkFSICAgICAgICAgICAgMHgxMDAwCS8vIE1BQyBhY2NlcHQgYnJvYWRjYXN0IGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUl9QSFkgICAgICAgICAgICAweDA4MDAJLy8gTUFDIGFjY2VwdCBwaHlzaWNhbCBhZGRyZXNzIHBhY2tldAorI2RlZmluZSBSU1JfVlRBRyAgICAgICAgICAgMHgwNDAwCS8vIDgwMi4xcC8xcSB0YWdnaW5nIHBhY2tldCBpbmRpY2F0b3IKKyNkZWZpbmUgUlNSX1NUUCAgICAgICAgICAgIDB4MDIwMAkvLyBzdGFydCBvZiBwYWNrZXQKKyNkZWZpbmUgUlNSX0VEUCAgICAgICAgICAgIDB4MDEwMAkvLyBlbmQgb2YgcGFja2V0CisKKy8qCisgKiBCaXRzIGluIHRoZSBSU1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSU1IxX1JYT0sgICAgICAgICAgIDB4ODAJLy8gcnggT0sKKyNkZWZpbmUgUlNSMV9QRlQgICAgICAgICAgICAweDQwCS8vIFBlcmZlY3QgZmlsdGVyaW5nIGFkZHJlc3MgbWF0Y2gKKyNkZWZpbmUgUlNSMV9NQVIgICAgICAgICAgICAweDIwCS8vIE1BQyBhY2NlcHQgbXVsdGljYXN0IGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUjFfQkFSICAgICAgICAgICAgMHgxMAkvLyBNQUMgYWNjZXB0IGJyb2FkY2FzdCBhZGRyZXNzIHBhY2tldAorI2RlZmluZSBSU1IxX1BIWSAgICAgICAgICAgIDB4MDgJLy8gTUFDIGFjY2VwdCBwaHlzaWNhbCBhZGRyZXNzIHBhY2tldAorI2RlZmluZSBSU1IxX1ZUQUcgICAgICAgICAgIDB4MDQJLy8gODAyLjFwLzFxIHRhZ2dpbmcgcGFja2V0IGluZGljYXRvcgorI2RlZmluZSBSU1IxX1NUUCAgICAgICAgICAgIDB4MDIJLy8gc3RhcnQgb2YgcGFja2V0CisjZGVmaW5lIFJTUjFfRURQICAgICAgICAgICAgMHgwMQkvLyBlbmQgb2YgcGFja2V0CisKKy8qCisgKiBCaXRzIGluIHRoZSBDU00gcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENTTV9JUE9LICAgICAgICAgICAgMHg0MAkvL0lQIENoZWNrdXNtIHZhbGlkYXRpYW9uIG9rCisjZGVmaW5lIENTTV9UVVBPSyAgICAgICAgICAgMHgyMAkvL1RDUC9VRFAgQ2hlY2t1c20gdmFsaWRhdGlhb24gb2sKKyNkZWZpbmUgQ1NNX0ZSQUcgICAgICAgICAgICAweDEwCS8vRnJhZ21lbnQgSVAgZGF0YWdyYW0KKyNkZWZpbmUgQ1NNX0lQS1QgICAgICAgICAgICAweDA0CS8vUmVjZWl2ZWQgYW4gSVAgcGFja2V0CisjZGVmaW5lIENTTV9UQ1BLVCAgICAgICAgICAgMHgwMgkvL1JlY2VpdmVkIGEgVENQIHBhY2tldAorI2RlZmluZSBDU01fVURQS1QgICAgICAgICAgIDB4MDEJLy9SZWNlaXZlZCBhIFVEUCBwYWNrZXQKKworLyoKKyAqIEJpdHMgaW4gdGhlIFRTUjAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRTUjBfQUJUICAgICAgICAgICAgMHgwMDgwCS8vIFR4IGFib3J0IGJlY2F1c2Ugb2YgZXhjZXNzaXZlIGNvbGxpc2lvbgorI2RlZmluZSBUU1IwX09XVCAgICAgICAgICAgIDB4MDA0MAkvLyBKdW1ibyBmcmFtZSBUeCBhYm9ydAorI2RlZmluZSBUU1IwX09XQyAgICAgICAgICAgIDB4MDAyMAkvLyBPdXQgb2Ygd2luZG93IGNvbGxpc2lvbgorI2RlZmluZSBUU1IwX0NPTFMgICAgICAgICAgIDB4MDAxMAkvLyBleHBlcmllbmNlIGNvbGxpc2lvbiBpbiB0aGlzIHRyYW5zbWl0IGV2ZW50CisjZGVmaW5lIFRTUjBfTkNSMyAgICAgICAgICAgMHgwMDA4CS8vIGNvbGxpc2lvbiByZXRyeSBjb3VudGVyWzNdCisjZGVmaW5lIFRTUjBfTkNSMiAgICAgICAgICAgMHgwMDA0CS8vIGNvbGxpc2lvbiByZXRyeSBjb3VudGVyWzJdCisjZGVmaW5lIFRTUjBfTkNSMSAgICAgICAgICAgMHgwMDAyCS8vIGNvbGxpc2lvbiByZXRyeSBjb3VudGVyWzFdCisjZGVmaW5lIFRTUjBfTkNSMCAgICAgICAgICAgMHgwMDAxCS8vIGNvbGxpc2lvbiByZXRyeSBjb3VudGVyWzBdCisjZGVmaW5lIFRTUjBfVEVSUiAgICAgICAgICAgMHg4MDAwCS8vCisjZGVmaW5lIFRTUjBfRkRYICAgICAgICAgICAgMHg0MDAwCS8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgc2VydmljZWQgYnkgZnVsbCBkdXBsZXggbW9kZQorI2RlZmluZSBUU1IwX0dNSUkgICAgICAgICAgIDB4MjAwMAkvLyBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIHNlcnZpY2VkIGJ5IEdNSUkgbW9kZQorI2RlZmluZSBUU1IwX0xOS0ZMICAgICAgICAgIDB4MTAwMAkvLyBwYWNrZXQgc2VydmljZWQgZHVyaW5nIGxpbmsgZG93bgorI2RlZmluZSBUU1IwX1NIRE4gICAgICAgICAgIDB4MDQwMAkvLyBzaHV0ZG93biBjYXNlCisjZGVmaW5lIFRTUjBfQ1JTICAgICAgICAgICAgMHgwMjAwCS8vIGNhcnJpZXIgc2Vuc2UgbG9zdAorI2RlZmluZSBUU1IwX0NESCAgICAgICAgICAgIDB4MDEwMAkvLyBBUUUgdGVzdCBmYWlsIChDRCBoZWFydGJlYXQpCisKKy8qCisgKiBCaXRzIGluIHRoZSBUU1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBUU1IxX1RFUlIgICAgICAgICAgIDB4ODAJLy8KKyNkZWZpbmUgVFNSMV9GRFggICAgICAgICAgICAweDQwCS8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgc2VydmljZWQgYnkgZnVsbCBkdXBsZXggbW9kZQorI2RlZmluZSBUU1IxX0dNSUkgICAgICAgICAgIDB4MjAJLy8gY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzZXJ2aWNlZCBieSBHTUlJIG1vZGUKKyNkZWZpbmUgVFNSMV9MTktGTCAgICAgICAgICAweDEwCS8vIHBhY2tldCBzZXJ2aWNlZCBkdXJpbmcgbGluayBkb3duCisjZGVmaW5lIFRTUjFfU0hETiAgICAgICAgICAgMHgwNAkvLyBzaHV0ZG93biBjYXNlCisjZGVmaW5lIFRTUjFfQ1JTICAgICAgICAgICAgMHgwMgkvLyBjYXJyaWVyIHNlbnNlIGxvc3QKKyNkZWZpbmUgVFNSMV9DREggICAgICAgICAgICAweDAxCS8vIEFRRSB0ZXN0IGZhaWwgKENEIGhlYXJ0YmVhdCkKKworLy8KKy8vIEJpdHMgaW4gdGhlIFRDUjAgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIFRDUjBfVElDICAgICAgICAgICAgMHg4MAkvLyBhc3NlcnQgaW50ZXJydXB0IGltbWVkaWF0ZWx5IHdoaWxlIGRlc2NyaXB0b3IgaGFzIGJlZW4gc2VuZCBjb21wbGV0ZQorI2RlZmluZSBUQ1IwX1BJQyAgICAgICAgICAgIDB4NDAJLy8gcHJpb3JpdHkgaW50ZXJydXB0IHJlcXVlc3QsIElOQSMgaXMgaXNzdWVkIG92ZXIgYWRhcHRpdmUgaW50ZXJydXB0IHNjaGVtZQorI2RlZmluZSBUQ1IwX1ZFVEFHICAgICAgICAgIDB4MjAJLy8gZW5hYmxlIFZMQU4gdGFnCisjZGVmaW5lIFRDUjBfSVBDSyAgICAgICAgICAgMHgxMAkvLyByZXF1ZXN0IElQICBjaGVja3N1bSBjYWxjdWxhdGlvbi4KKyNkZWZpbmUgVENSMF9VRFBDSyAgICAgICAgICAweDA4CS8vIHJlcXVlc3QgVURQIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgorI2RlZmluZSBUQ1IwX1RDUENLICAgICAgICAgIDB4MDQJLy8gcmVxdWVzdCBUQ1AgY2hlY2tzdW0gY2FsY3VsYXRpb24uCisjZGVmaW5lIFRDUjBfSk1CTyAgICAgICAgICAgMHgwMgkvLyBpbmRpY2F0ZSBhIGp1bWJvIHBhY2tldCBpbiBHTUFDIHNpZGUKKyNkZWZpbmUgVENSMF9DUkMgICAgICAgICAgICAweDAxCS8vIGRpc2FibGUgQ1JDIGdlbmVyYXRpb24KKworI2RlZmluZSBUQ1BMU19OT1JNQUwgICAgICAgIDMKKyNkZWZpbmUgVENQTFNfU1RBUlQgICAgICAgICAyCisjZGVmaW5lIFRDUExTX0VORCAgICAgICAgICAgMQorI2RlZmluZSBUQ1BMU19NRUQgICAgICAgICAgIDAKKworCisvLyBtYXggdHJhbnNtaXQgb3IgcmVjZWl2ZSBidWZmZXIgc2l6ZQorI2RlZmluZSBDQl9SWF9CVUZfU0laRSAgICAgMjA0OFVMCS8vIG1heCBidWZmZXIgc2l6ZQorCQkJCQkvLyBOT1RFOiBtdXN0IGJlIG11bHRpcGxlIG9mIDQKKworI2RlZmluZSBDQl9NQVhfUkRfTlVNICAgICAgIDUxMgkvLyBNQVggIyBvZiBSRAorI2RlZmluZSBDQl9NQVhfVERfTlVNICAgICAgIDI1NgkvLyBNQVggIyBvZiBURAorCisjZGVmaW5lIENCX0lOSVRfUkRfTlVNXzMxMTkgMTI4CS8vIGluaXQgIyBvZiBSRCwgZm9yIHNldHVwIFZUMzExOQorI2RlZmluZSBDQl9JTklUX1REX05VTV8zMTE5IDY0CS8vIGluaXQgIyBvZiBURCwgZm9yIHNldHVwIFZUMzExOQorCisjZGVmaW5lIENCX0lOSVRfUkRfTlVNICAgICAgMTI4CS8vIGluaXQgIyBvZiBSRCwgZm9yIHNldHVwIGRlZmF1bHQKKyNkZWZpbmUgQ0JfSU5JVF9URF9OVU0gICAgICA2NAkvLyBpbml0ICMgb2YgVEQsIGZvciBzZXR1cCBkZWZhdWx0CisKKy8vIGZvciAzMTE5CisjZGVmaW5lIENCX1REX1JJTkdfTlVNICAgICAgNAkvLyAjIG9mIFREIHJpbmdzLgorI2RlZmluZSBDQl9NQVhfU0VHX1BFUl9QS1QgIDcJLy8gbWF4IGRhdGEgc2VnIHBlciBwYWNrZXQgKFR4KQorCisKKy8qCisgKglJZiBjb2xsaXNpb25zIGV4Y2VzcyAxNSB0aW1lcyAsIHR4IHdpbGwgYWJvcnQsIGFuZAorICoJaWYgdHggZmlmbyB1bmRlcmZsb3csIHR4IHdpbGwgZmFpbAorICoJd2Ugc2hvdWxkIHRyeSB0byByZXNlbmQgaXQKKyAqLworCisjZGVmaW5lIENCX01BWF9UWF9BQk9SVF9SRVRSWSAgIDMKKworLyoKKyAqCVJlY2VpdmUgZGVzY3JpcHRvcgorICovCisKK3N0cnVjdCByZGVzYzAgeworCXUxNiBSU1I7CQkvKiBSZWNlaXZlIHN0YXR1cyAqLworCXUxNiBsZW46MTQ7CQkvKiBSZWNlaXZlZCBwYWNrZXQgbGVuZ3RoICovCisJdTE2IHJlc2VydmVkOjE7CisJdTE2IG93bmVyOjE7CQkvKiBXaG8gb3ducyB0aGlzIGJ1ZmZlciA/ICovCit9OworCitzdHJ1Y3QgcmRlc2MxIHsKKwl1MTYgUFFUQUc7CisJdTggQ1NNOworCXU4IElQS1Q7Cit9OworCitzdHJ1Y3QgcnhfZGVzYyB7CisJc3RydWN0IHJkZXNjMCByZGVzYzA7CisJc3RydWN0IHJkZXNjMSByZGVzYzE7CisJdTMyIHBhX2xvdzsJCS8qIExvdyAzMiBiaXQgUENJIGFkZHJlc3MgKi8KKwl1MTYgcGFfaGlnaDsJCS8qIE5leHQgMTYgYml0IFBDSSBhZGRyZXNzICg0OCB0b3RhbCkgKi8KKwl1MTYgbGVuOjE1OwkJLyogRnJhbWUgc2l6ZSAqLworCXUxNiBpbnRlbjoxOwkJLyogRW5hYmxlIGludGVycnVwdCAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKgorICoJVHJhbnNtaXQgZGVzY3JpcHRvcgorICovCisKK3N0cnVjdCB0ZGVzYzAgeworCXUxNiBUU1I7CQkvKiBUcmFuc21pdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwl1MTYgcGt0c2l6ZToxNDsJCS8qIFNpemUgb2YgZnJhbWUgKi8KKwl1MTYgcmVzZXJ2ZWQ6MTsKKwl1MTYgb3duZXI6MTsJCS8qIFdobyBvd25zIHRoZSBidWZmZXIgKi8KK307CisKK3N0cnVjdCBwcWluZiB7CQkJLyogUHJpb3JpdHkgcXVldWUgaW5mbyAqLworCXUxNiBWSUQ6MTI7CisJdTE2IENGSToxOworCXUxNiBwcmlvcml0eTozOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgdGRlc2MxIHsKKwlzdHJ1Y3QgcHFpbmYgcHFpbmY7CisJdTggVENSOworCXU4IFRDUExTOjI7CisJdTggcmVzZXJ2ZWQ6MjsKKwl1OCBDTURaOjQ7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCB0ZF9idWYgeworCXUzMiBwYV9sb3c7CisJdTE2IHBhX2hpZ2g7CisJdTE2IGJ1ZnNpemU6MTQ7CisJdTE2IHJlc2VydmVkOjE7CisJdTE2IHF1ZXVlOjE7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCB0eF9kZXNjIHsKKwlzdHJ1Y3QgdGRlc2MwIHRkZXNjMDsKKwlzdHJ1Y3QgdGRlc2MxIHRkZXNjMTsKKwlzdHJ1Y3QgdGRfYnVmIHRkX2J1Zls3XTsKK307CisKKyNpZmRlZiBMSU5VWAorc3RydWN0IHZlbG9jaXR5X3JkX2luZm8geworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBza2JfZG1hOworfTsKKworCisvKioKKyAqCWFsbG9jX3JkX2luZm8JCS0JYWxsb2NhdGUgYW4gcmQgaW5mbyBibG9jaworICoKKyAqCUFsb2NhdGUgYW5kIGluaXRpYWxpemUgYSByZWNlaXZlIGluZm8gc3RydWN0dXJlIHVzZWQgZm9yIGtlZXBpbmcKKyAqCXRyYWNrIG9mIGtlcm5lbCBzaWRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZWFjaCByZWNlaXZlCisgKglkZXNjcmlwdG9yIHdlIGFyZSB1c2luZworICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZlbG9jaXR5X3JkX2luZm8gKmFsbG9jX3JkX2luZm8odm9pZCkKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyAqcHRyOworCWlmICgocHRyID0KKwkgICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWVsc2UgeworCQltZW1zZXQocHRyLCAwLCBzaXplb2Yoc3RydWN0IHZlbG9jaXR5X3JkX2luZm8pKTsKKwkJcmV0dXJuIHB0cjsKKwl9Cit9CisKKy8qCisgKglVc2VkIHRvIHRyYWNrIHRyYW5zbWl0IHNpZGUgYnVmZmVycy4KKyAqLworCitzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCAqYnVmOworCWludCBuc2tiX2RtYTsKKwlkbWFfYWRkcl90IHNrYl9kbWFbN107CisJZG1hX2FkZHJfdCBidWZfZG1hOworfTsKKworI2VuZGlmCitlbnVtIHsKKwlPV05FRF9CWV9IT1NUID0gMCwKKwlPV05FRF9CWV9OSUMgPSAxCit9IHZlbG9jaXR5X293bmVyOworCisKKy8qCisgKglNQUMgcmVnaXN0ZXJzIGFuZCBtYWNyb3MuCisgKi8KKworCisjZGVmaW5lIE1DQU1fU0laRSAgICAgICAgICAgNjQKKyNkZWZpbmUgVkNBTV9TSVpFICAgICAgICAgICA2NAorI2RlZmluZSBUWF9RVUVVRV9OTyAgICAgICAgIDQKKworI2RlZmluZSBNQVhfSFdfTUlCX0NPVU5URVIgIDMyCisjZGVmaW5lIFZFTE9DSVRZX01JTl9NVFUgICAgKDE1MTQtMTQpCisjZGVmaW5lIFZFTE9DSVRZX01BWF9NVFUgICAgKDkwMDApCisKKy8qCisgKglSZWdpc3RlcnMgaW4gdGhlIE1BQworICovCisKKyNkZWZpbmUgTUFDX1JFR19QQVIgICAgICAgICAweDAwCS8vIHBoeXNpY2FsIGFkZHJlc3MKKyNkZWZpbmUgTUFDX1JFR19SQ1IgICAgICAgICAweDA2CisjZGVmaW5lIE1BQ19SRUdfVENSICAgICAgICAgMHgwNworI2RlZmluZSBNQUNfUkVHX0NSMF9TRVQgICAgIDB4MDgKKyNkZWZpbmUgTUFDX1JFR19DUjFfU0VUICAgICAweDA5CisjZGVmaW5lIE1BQ19SRUdfQ1IyX1NFVCAgICAgMHgwQQorI2RlZmluZSBNQUNfUkVHX0NSM19TRVQgICAgIDB4MEIKKyNkZWZpbmUgTUFDX1JFR19DUjBfQ0xSICAgICAweDBDCisjZGVmaW5lIE1BQ19SRUdfQ1IxX0NMUiAgICAgMHgwRAorI2RlZmluZSBNQUNfUkVHX0NSMl9DTFIgICAgIDB4MEUKKyNkZWZpbmUgTUFDX1JFR19DUjNfQ0xSICAgICAweDBGCisjZGVmaW5lIE1BQ19SRUdfTUFSICAgICAgICAgMHgxMAorI2RlZmluZSBNQUNfUkVHX0NBTSAgICAgICAgIDB4MTAKKyNkZWZpbmUgTUFDX1JFR19ERUNfQkFTRV9ISSAweDE4CisjZGVmaW5lIE1BQ19SRUdfREJGX0JBU0VfSEkgMHgxQworI2RlZmluZSBNQUNfUkVHX0lTUl9DVEwgICAgIDB4MjAKKyNkZWZpbmUgTUFDX1JFR19JU1JfSE9UTVIgICAweDIwCisjZGVmaW5lIE1BQ19SRUdfSVNSX1RTVVBUSFIgMHgyMAorI2RlZmluZSBNQUNfUkVHX0lTUl9SU1VQVEhSIDB4MjAKKyNkZWZpbmUgTUFDX1JFR19JU1JfQ1RMMSAgICAweDIxCisjZGVmaW5lIE1BQ19SRUdfVFhFX1NSICAgICAgMHgyMgorI2RlZmluZSBNQUNfUkVHX1JYRV9TUiAgICAgIDB4MjMKKyNkZWZpbmUgTUFDX1JFR19JU1IgICAgICAgICAweDI0CisjZGVmaW5lIE1BQ19SRUdfSVNSMCAgICAgICAgMHgyNAorI2RlZmluZSBNQUNfUkVHX0lTUjEgICAgICAgIDB4MjUKKyNkZWZpbmUgTUFDX1JFR19JU1IyICAgICAgICAweDI2CisjZGVmaW5lIE1BQ19SRUdfSVNSMyAgICAgICAgMHgyNworI2RlZmluZSBNQUNfUkVHX0lNUiAgICAgICAgIDB4MjgKKyNkZWZpbmUgTUFDX1JFR19JTVIwICAgICAgICAweDI4CisjZGVmaW5lIE1BQ19SRUdfSU1SMSAgICAgICAgMHgyOQorI2RlZmluZSBNQUNfUkVHX0lNUjIgICAgICAgIDB4MkEKKyNkZWZpbmUgTUFDX1JFR19JTVIzICAgICAgICAweDJCCisjZGVmaW5lIE1BQ19SRUdfVERDU1JfU0VUICAgMHgzMAorI2RlZmluZSBNQUNfUkVHX1JEQ1NSX1NFVCAgIDB4MzIKKyNkZWZpbmUgTUFDX1JFR19URENTUl9DTFIgICAweDM0CisjZGVmaW5lIE1BQ19SRUdfUkRDU1JfQ0xSICAgMHgzNgorI2RlZmluZSBNQUNfUkVHX1JEQkFTRV9MTyAgIDB4MzgKKyNkZWZpbmUgTUFDX1JFR19SRElORFggICAgICAweDNDCisjZGVmaW5lIE1BQ19SRUdfVERCQVNFX0xPICAgMHg0MAorI2RlZmluZSBNQUNfUkVHX1JEQ1NJWkUgICAgIDB4NTAKKyNkZWZpbmUgTUFDX1JFR19URENTSVpFICAgICAweDUyCisjZGVmaW5lIE1BQ19SRUdfVERJTkRYICAgICAgMHg1NAorI2RlZmluZSBNQUNfUkVHX1RESURYMCAgICAgIDB4NTQKKyNkZWZpbmUgTUFDX1JFR19URElEWDEgICAgICAweDU2CisjZGVmaW5lIE1BQ19SRUdfVERJRFgyICAgICAgMHg1OAorI2RlZmluZSBNQUNfUkVHX1RESURYMyAgICAgIDB4NUEKKyNkZWZpbmUgTUFDX1JFR19QQVVTRV9USU1FUiAweDVDCisjZGVmaW5lIE1BQ19SRUdfUkJSRFUgICAgICAgMHg1RQorI2RlZmluZSBNQUNfUkVHX0ZJRk9fVEVTVDAgIDB4NjAKKyNkZWZpbmUgTUFDX1JFR19GSUZPX1RFU1QxICAweDY0CisjZGVmaW5lIE1BQ19SRUdfQ0FNQUREUiAgICAgMHg2OAorI2RlZmluZSBNQUNfUkVHX0NBTUNSICAgICAgIDB4NjkKKyNkZWZpbmUgTUFDX1JFR19HRlRFU1QgICAgICAweDZBCisjZGVmaW5lIE1BQ19SRUdfRlRTVENNRCAgICAgMHg2QgorI2RlZmluZSBNQUNfUkVHX01JSUNGRyAgICAgIDB4NkMKKyNkZWZpbmUgTUFDX1JFR19NSUlTUiAgICAgICAweDZECisjZGVmaW5lIE1BQ19SRUdfUEhZU1IwICAgICAgMHg2RQorI2RlZmluZSBNQUNfUkVHX1BIWVNSMSAgICAgIDB4NkYKKyNkZWZpbmUgTUFDX1JFR19NSUlDUiAgICAgICAweDcwCisjZGVmaW5lIE1BQ19SRUdfTUlJQURSICAgICAgMHg3MQorI2RlZmluZSBNQUNfUkVHX01JSURBVEEgICAgIDB4NzIKKyNkZWZpbmUgTUFDX1JFR19TT0ZUX1RJTUVSMCAweDc0CisjZGVmaW5lIE1BQ19SRUdfU09GVF9USU1FUjEgMHg3NgorI2RlZmluZSBNQUNfUkVHX0NGR0EgICAgICAgIDB4NzgKKyNkZWZpbmUgTUFDX1JFR19DRkdCICAgICAgICAweDc5CisjZGVmaW5lIE1BQ19SRUdfQ0ZHQyAgICAgICAgMHg3QQorI2RlZmluZSBNQUNfUkVHX0NGR0QgICAgICAgIDB4N0IKKyNkZWZpbmUgTUFDX1JFR19EQ0ZHMCAgICAgICAweDdDCisjZGVmaW5lIE1BQ19SRUdfRENGRzEgICAgICAgMHg3RAorI2RlZmluZSBNQUNfUkVHX01DRkcwICAgICAgIDB4N0UKKyNkZWZpbmUgTUFDX1JFR19NQ0ZHMSAgICAgICAweDdGCisKKyNkZWZpbmUgTUFDX1JFR19UQklTVCAgICAgICAweDgwCisjZGVmaW5lIE1BQ19SRUdfUkJJU1QgICAgICAgMHg4MQorI2RlZmluZSBNQUNfUkVHX1BNQ0MgICAgICAgIDB4ODIKKyNkZWZpbmUgTUFDX1JFR19TVElDS0hXICAgICAweDgzCisjZGVmaW5lIE1BQ19SRUdfTUlCQ1IgICAgICAgMHg4NAorI2RlZmluZSBNQUNfUkVHX0VFUlNWICAgICAgIDB4ODUKKyNkZWZpbmUgTUFDX1JFR19SRVZJRCAgICAgICAweDg2CisjZGVmaW5lIE1BQ19SRUdfTUlCUkVBRCAgICAgMHg4OAorI2RlZmluZSBNQUNfUkVHX0JQTUEgICAgICAgIDB4OEMKKyNkZWZpbmUgTUFDX1JFR19FRVdSX0RBVEEgICAweDhDCisjZGVmaW5lIE1BQ19SRUdfQlBNRF9XUiAgICAgMHg4RgorI2RlZmluZSBNQUNfUkVHX0JQQ01EICAgICAgIDB4OTAKKyNkZWZpbmUgTUFDX1JFR19CUE1EX1JEICAgICAweDkxCisjZGVmaW5lIE1BQ19SRUdfRUVDSEtTVU0gICAgMHg5MgorI2RlZmluZSBNQUNfUkVHX0VFQ1NSICAgICAgIDB4OTMKKyNkZWZpbmUgTUFDX1JFR19FRVJEX0RBVEEgICAweDk0CisjZGVmaW5lIE1BQ19SRUdfRUFERFIgICAgICAgMHg5NgorI2RlZmluZSBNQUNfUkVHX0VNQkNNRCAgICAgIDB4OTcKKyNkZWZpbmUgTUFDX1JFR19KTVBTUjAgICAgICAweDk4CisjZGVmaW5lIE1BQ19SRUdfSk1QU1IxICAgICAgMHg5OQorI2RlZmluZSBNQUNfUkVHX0pNUFNSMiAgICAgIDB4OUEKKyNkZWZpbmUgTUFDX1JFR19KTVBTUjMgICAgICAweDlCCisjZGVmaW5lIE1BQ19SRUdfQ0hJUEdTUiAgICAgMHg5QworI2RlZmluZSBNQUNfUkVHX1RFU1RDRkcgICAgIDB4OUQKKyNkZWZpbmUgTUFDX1JFR19ERUJVRyAgICAgICAweDlFCisjZGVmaW5lIE1BQ19SRUdfQ0hJUEdDUiAgICAgMHg5RgorI2RlZmluZSBNQUNfUkVHX1dPTENSMF9TRVQgIDB4QTAKKyNkZWZpbmUgTUFDX1JFR19XT0xDUjFfU0VUICAweEExCisjZGVmaW5lIE1BQ19SRUdfUFdDRkdfU0VUICAgMHhBMgorI2RlZmluZSBNQUNfUkVHX1dPTENGR19TRVQgIDB4QTMKKyNkZWZpbmUgTUFDX1JFR19XT0xDUjBfQ0xSICAweEE0CisjZGVmaW5lIE1BQ19SRUdfV09MQ1IxX0NMUiAgMHhBNQorI2RlZmluZSBNQUNfUkVHX1BXQ0ZHX0NMUiAgIDB4QTYKKyNkZWZpbmUgTUFDX1JFR19XT0xDRkdfQ0xSICAweEE3CisjZGVmaW5lIE1BQ19SRUdfV09MU1IwX1NFVCAgMHhBOAorI2RlZmluZSBNQUNfUkVHX1dPTFNSMV9TRVQgIDB4QTkKKyNkZWZpbmUgTUFDX1JFR19XT0xTUjBfQ0xSICAweEFDCisjZGVmaW5lIE1BQ19SRUdfV09MU1IxX0NMUiAgMHhBRAorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzAgIDB4QjAKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkMxICAweEIyCisjZGVmaW5lIE1BQ19SRUdfUEFUUk5fQ1JDMiAgMHhCNAorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzMgIDB4QjYKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkM0ICAweEI4CisjZGVmaW5lIE1BQ19SRUdfUEFUUk5fQ1JDNSAgMHhCQQorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzYgIDB4QkMKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkM3ICAweEJFCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzBfMCAgMHhDMAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0swXzEgIDB4QzQKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMF8yICAweEM4CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzBfMyAgMHhDQworI2RlZmluZSBNQUNfUkVHX0JZVEVNU0sxXzAgIDB4RDAKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMV8xICAweEQ0CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzFfMiAgMHhEOAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0sxXzMgIDB4REMKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMl8wICAweEUwCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzJfMSAgMHhFNAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0syXzIgIDB4RTgKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMl8zICAweEVDCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzNfMCAgMHhGMAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0szXzEgIDB4RjQKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLM18yICAweEY4CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzNfMyAgMHhGQworCisvKgorICoJQml0cyBpbiB0aGUgUkNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSQ1JfQVMgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgUkNSX0FQICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFJDUl9BTCAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBSQ1JfUFJPTSAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkNSX0FCICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFJDUl9BTSAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBSQ1JfQVIgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUkNSX1NFUCAgICAgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBUQ1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRDUl9UQjJCRElTICAgICAgICAgMHg4MAorI2RlZmluZSBUQ1JfQ09MVE1DMSAgICAgICAgIDB4MDgKKyNkZWZpbmUgVENSX0NPTFRNQzAgICAgICAgICAweDA0CisjZGVmaW5lIFRDUl9MQjEgICAgICAgICAgICAgMHgwMgkvKiBsb29wYmFja1sxXSAqLworI2RlZmluZSBUQ1JfTEIwICAgICAgICAgICAgIDB4MDEJLyogbG9vcGJhY2tbMF0gKi8KKworLyoKKyAqCUJpdHMgaW4gdGhlIENSMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1IwX1RYT04gICAgICAgICAgICAweDAwMDAwMDA4VUwKKyNkZWZpbmUgQ1IwX1JYT04gICAgICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgQ1IwX1NUT1AgICAgICAgICAgICAweDAwMDAwMDAyVUwJLyogc3RvcCBNQUMsIGRlZmF1bHQgPSAxICovCisjZGVmaW5lIENSMF9TVFJUICAgICAgICAgICAgMHgwMDAwMDAwMVVMCS8qIHN0YXJ0IE1BQyAqLworI2RlZmluZSBDUjBfU0ZSU1QgICAgICAgICAgIDB4MDAwMDgwMDBVTAkvKiBzb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBDUjBfVE0xRU4gICAgICAgICAgIDB4MDAwMDQwMDBVTAorI2RlZmluZSBDUjBfVE0wRU4gICAgICAgICAgIDB4MDAwMDIwMDBVTAorI2RlZmluZSBDUjBfRFBPTEwgICAgICAgICAgIDB4MDAwMDA4MDBVTAkvKiBkaXNhYmxlIHJ4L3R4IGF1dG8gcG9sbGluZyAqLworI2RlZmluZSBDUjBfRElTQVUgICAgICAgICAgIDB4MDAwMDAxMDBVTAorI2RlZmluZSBDUjBfWE9ORU4gICAgICAgICAgIDB4MDA4MDAwMDBVTAorI2RlZmluZSBDUjBfRkRYVEZDRU4gICAgICAgIDB4MDA0MDAwMDBVTAkvKiBmdWxsLWR1cGxleCBUWCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMF9GRFhSRkNFTiAgICAgICAgMHgwMDIwMDAwMFVMCS8qIGZ1bGwtZHVwbGV4IFJYIGZsb3cgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgQ1IwX0hEWEZDRU4gICAgICAgICAweDAwMTAwMDAwVUwJLyogaGFsZi1kdXBsZXggZmxvdyBjb250cm9sIGVuYWJsZSAqLworI2RlZmluZSBDUjBfWEhJVEgxICAgICAgICAgIDB4MDAwODAwMDBVTAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjBfWEhJVEgwICAgICAgICAgIDB4MDAwNDAwMDBVTAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMCAqLworI2RlZmluZSBDUjBfWExUSDEgICAgICAgICAgIDB4MDAwMjAwMDBVTAkvKiBUWCBwYXVzZSBmcmFtZSBsb3cgdGhyZXNob2xkIDEgKi8KKyNkZWZpbmUgQ1IwX1hMVEgwICAgICAgICAgICAweDAwMDEwMDAwVUwJLyogVFggcGF1c2UgZnJhbWUgbG93IHRocmVzaG9sZCAwICovCisjZGVmaW5lIENSMF9HU1BSU1QgICAgICAgICAgMHg4MDAwMDAwMFVMCisjZGVmaW5lIENSMF9GT1JTUlNUICAgICAgICAgMHg0MDAwMDAwMFVMCisjZGVmaW5lIENSMF9GUEhZUlNUICAgICAgICAgMHgyMDAwMDAwMFVMCisjZGVmaW5lIENSMF9ESUFHICAgICAgICAgICAgMHgxMDAwMDAwMFVMCisjZGVmaW5lIENSMF9JTlRQQ1RMICAgICAgICAgMHgwNDAwMDAwMFVMCisjZGVmaW5lIENSMF9HSU5UTVNLMSAgICAgICAgMHgwMjAwMDAwMFVMCisjZGVmaW5lIENSMF9HSU5UTVNLMCAgICAgICAgMHgwMTAwMDAwMFVMCisKKy8qCisgKglCaXRzIGluIHRoZSBDUjEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENSMV9TRlJTVCAgICAgICAgICAgMHg4MAkvKiBzb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBDUjFfVE0xRU4gICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ1IxX1RNMEVOICAgICAgICAgICAweDIwCisjZGVmaW5lIENSMV9EUE9MTCAgICAgICAgICAgMHgwOAkvKiBkaXNhYmxlIHJ4L3R4IGF1dG8gcG9sbGluZyAqLworI2RlZmluZSBDUjFfRElTQVUgICAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIENSMiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1IyX1hPTkVOICAgICAgICAgICAweDgwCisjZGVmaW5lIENSMl9GRFhURkNFTiAgICAgICAgMHg0MAkvKiBmdWxsLWR1cGxleCBUWCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMl9GRFhSRkNFTiAgICAgICAgMHgyMAkvKiBmdWxsLWR1cGxleCBSWCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMl9IRFhGQ0VOICAgICAgICAgMHgxMAkvKiBoYWxmLWR1cGxleCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMl9YSElUSDEgICAgICAgICAgMHgwOAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjJfWEhJVEgwICAgICAgICAgIDB4MDQJLyogVFggWE9OIGhpZ2ggdGhyZXNob2xkIDAgKi8KKyNkZWZpbmUgQ1IyX1hMVEgxICAgICAgICAgICAweDAyCS8qIFRYIHBhdXNlIGZyYW1lIGxvdyB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjJfWExUSDAgICAgICAgICAgIDB4MDEJLyogVFggcGF1c2UgZnJhbWUgbG93IHRocmVzaG9sZCAwICovCisKKy8qCisgKglCaXRzIGluIHRoZSBDUjMgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENSM19HU1BSU1QgICAgICAgICAgMHg4MAorI2RlZmluZSBDUjNfRk9SU1JTVCAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ1IzX0ZQSFlSU1QgICAgICAgICAweDIwCisjZGVmaW5lIENSM19ESUFHICAgICAgICAgICAgMHgxMAorI2RlZmluZSBDUjNfSU5UUENUTCAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ1IzX0dJTlRNU0sxICAgICAgICAweDAyCisjZGVmaW5lIENSM19HSU5UTVNLMCAgICAgICAgMHgwMQorCisjZGVmaW5lIElTUkNUTF9VRFBJTlQgICAgICAgMHg4MDAwCisjZGVmaW5lIElTUkNUTF9UU1VQRElTICAgICAgMHg0MDAwCisjZGVmaW5lIElTUkNUTF9SU1VQRElTICAgICAgMHgyMDAwCisjZGVmaW5lIElTUkNUTF9QTVNLMSAgICAgICAgMHgxMDAwCisjZGVmaW5lIElTUkNUTF9QTVNLMCAgICAgICAgMHgwODAwCisjZGVmaW5lIElTUkNUTF9JTlRQRCAgICAgICAgMHgwNDAwCisjZGVmaW5lIElTUkNUTF9IQ1JMRCAgICAgICAgMHgwMjAwCisjZGVmaW5lIElTUkNUTF9TQ1JMRCAgICAgICAgMHgwMTAwCisKKy8qCisgKglCaXRzIGluIHRoZSBJU1JfQ1RMMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgSVNSQ1RMMV9VRFBJTlQgICAgICAweDgwCisjZGVmaW5lIElTUkNUTDFfVFNVUERJUyAgICAgMHg0MAorI2RlZmluZSBJU1JDVEwxX1JTVVBESVMgICAgIDB4MjAKKyNkZWZpbmUgSVNSQ1RMMV9QTVNLMSAgICAgICAweDEwCisjZGVmaW5lIElTUkNUTDFfUE1TSzAgICAgICAgMHgwOAorI2RlZmluZSBJU1JDVEwxX0lOVFBEICAgICAgIDB4MDQKKyNkZWZpbmUgSVNSQ1RMMV9IQ1JMRCAgICAgICAweDAyCisjZGVmaW5lIElTUkNUTDFfU0NSTEQgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgVFhFX1NSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBUWEVTUl9URkRCUyAgICAgICAgIDB4MDgKKyNkZWZpbmUgVFhFU1JfVERXQlMgICAgICAgICAweDA0CisjZGVmaW5lIFRYRVNSX1REUkJTICAgICAgICAgMHgwMgorI2RlZmluZSBUWEVTUl9URFNUUiAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIFJYRV9TUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUlhFU1JfUkZEQlMgICAgICAgICAweDA4CisjZGVmaW5lIFJYRVNSX1JEV0JTICAgICAgICAgMHgwNAorI2RlZmluZSBSWEVTUl9SRFJCUyAgICAgICAgIDB4MDIKKyNkZWZpbmUgUlhFU1JfUkRTVFIgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBJU1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIElTUl9JU1IzICAgICAgICAgICAgMHg4MDAwMDAwMFVMCisjZGVmaW5lIElTUl9JU1IyICAgICAgICAgICAgMHg0MDAwMDAwMFVMCisjZGVmaW5lIElTUl9JU1IxICAgICAgICAgICAgMHgyMDAwMDAwMFVMCisjZGVmaW5lIElTUl9JU1IwICAgICAgICAgICAgMHgxMDAwMDAwMFVMCisjZGVmaW5lIElTUl9UWFNUTEkgICAgICAgICAgMHgwMjAwMDAwMFVMCisjZGVmaW5lIElTUl9SWFNUTEkgICAgICAgICAgMHgwMTAwMDAwMFVMCisjZGVmaW5lIElTUl9IRkxEICAgICAgICAgICAgMHgwMDgwMDAwMFVMCisjZGVmaW5lIElTUl9VRFBJICAgICAgICAgICAgMHgwMDQwMDAwMFVMCisjZGVmaW5lIElTUl9NSUJGSSAgICAgICAgICAgMHgwMDIwMDAwMFVMCisjZGVmaW5lIElTUl9TSEROSSAgICAgICAgICAgMHgwMDEwMDAwMFVMCisjZGVmaW5lIElTUl9QSFlJICAgICAgICAgICAgMHgwMDA4MDAwMFVMCisjZGVmaW5lIElTUl9QV0VJICAgICAgICAgICAgMHgwMDA0MDAwMFVMCisjZGVmaW5lIElTUl9UTVIxSSAgICAgICAgICAgMHgwMDAyMDAwMFVMCisjZGVmaW5lIElTUl9UTVIwSSAgICAgICAgICAgMHgwMDAxMDAwMFVMCisjZGVmaW5lIElTUl9TUkNJICAgICAgICAgICAgMHgwMDAwODAwMFVMCisjZGVmaW5lIElTUl9MU1RQRUkgICAgICAgICAgMHgwMDAwNDAwMFVMCisjZGVmaW5lIElTUl9MU1RFSSAgICAgICAgICAgMHgwMDAwMjAwMFVMCisjZGVmaW5lIElTUl9PVkZJICAgICAgICAgICAgMHgwMDAwMTAwMFVMCisjZGVmaW5lIElTUl9GTE9OSSAgICAgICAgICAgMHgwMDAwMDgwMFVMCisjZGVmaW5lIElTUl9SQUNFSSAgICAgICAgICAgMHgwMDAwMDQwMFVMCisjZGVmaW5lIElTUl9UWFdCMUkgICAgICAgICAgMHgwMDAwMDIwMFVMCisjZGVmaW5lIElTUl9UWFdCMEkgICAgICAgICAgMHgwMDAwMDEwMFVMCisjZGVmaW5lIElTUl9QVFgzSSAgICAgICAgICAgMHgwMDAwMDA4MFVMCisjZGVmaW5lIElTUl9QVFgySSAgICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIElTUl9QVFgxSSAgICAgICAgICAgMHgwMDAwMDAyMFVMCisjZGVmaW5lIElTUl9QVFgwSSAgICAgICAgICAgMHgwMDAwMDAxMFVMCisjZGVmaW5lIElTUl9QVFhJICAgICAgICAgICAgMHgwMDAwMDAwOFVMCisjZGVmaW5lIElTUl9QUlhJICAgICAgICAgICAgMHgwMDAwMDAwNFVMCisjZGVmaW5lIElTUl9QUFRYSSAgICAgICAgICAgMHgwMDAwMDAwMlVMCisjZGVmaW5lIElTUl9QUFJYSSAgICAgICAgICAgMHgwMDAwMDAwMVVMCisKKy8qCisgKglCaXRzIGluIHRoZSBJTVIgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIElNUl9UWFNUTE0gICAgICAgICAgMHgwMjAwMDAwMFVMCisjZGVmaW5lIElNUl9VRFBJTSAgICAgICAgICAgMHgwMDQwMDAwMFVMCisjZGVmaW5lIElNUl9NSUJGSU0gICAgICAgICAgMHgwMDIwMDAwMFVMCisjZGVmaW5lIElNUl9TSEROSU0gICAgICAgICAgMHgwMDEwMDAwMFVMCisjZGVmaW5lIElNUl9QSFlJTSAgICAgICAgICAgMHgwMDA4MDAwMFVMCisjZGVmaW5lIElNUl9QV0VJTSAgICAgICAgICAgMHgwMDA0MDAwMFVMCisjZGVmaW5lIElNUl9UTVIxSU0gICAgICAgICAgMHgwMDAyMDAwMFVMCisjZGVmaW5lIElNUl9UTVIwSU0gICAgICAgICAgMHgwMDAxMDAwMFVMCisKKyNkZWZpbmUgSU1SX1NSQ0lNICAgICAgICAgICAweDAwMDA4MDAwVUwKKyNkZWZpbmUgSU1SX0xTVFBFSU0gICAgICAgICAweDAwMDA0MDAwVUwKKyNkZWZpbmUgSU1SX0xTVEVJTSAgICAgICAgICAweDAwMDAyMDAwVUwKKyNkZWZpbmUgSU1SX09WRklNICAgICAgICAgICAweDAwMDAxMDAwVUwKKyNkZWZpbmUgSU1SX0ZMT05JTSAgICAgICAgICAweDAwMDAwODAwVUwKKyNkZWZpbmUgSU1SX1JBQ0VJTSAgICAgICAgICAweDAwMDAwNDAwVUwKKyNkZWZpbmUgSU1SX1RYV0IxSU0gICAgICAgICAweDAwMDAwMjAwVUwKKyNkZWZpbmUgSU1SX1RYV0IwSU0gICAgICAgICAweDAwMDAwMTAwVUwKKworI2RlZmluZSBJTVJfUFRYM0lNICAgICAgICAgIDB4MDAwMDAwODBVTAorI2RlZmluZSBJTVJfUFRYMklNICAgICAgICAgIDB4MDAwMDAwNDBVTAorI2RlZmluZSBJTVJfUFRYMUlNICAgICAgICAgIDB4MDAwMDAwMjBVTAorI2RlZmluZSBJTVJfUFRYMElNICAgICAgICAgIDB4MDAwMDAwMTBVTAorI2RlZmluZSBJTVJfUFRYSU0gICAgICAgICAgIDB4MDAwMDAwMDhVTAorI2RlZmluZSBJTVJfUFJYSU0gICAgICAgICAgIDB4MDAwMDAwMDRVTAorI2RlZmluZSBJTVJfUFBUWElNICAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSBJTVJfUFBSWElNICAgICAgICAgIDB4MDAwMDAwMDFVTAorCisvKiAweDAwMTNGQjBGVUwgID0gIGluaXRpYWwgdmFsdWUgb2YgSU1SICovCisKKyNkZWZpbmUgSU5UX01BU0tfREVGICAgICAgICAoIElNUl9QUFRYSU18SU1SX1BQUlhJTXwgSU1SX1BUWElNfElNUl9QUlhJTSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVJfUFdFSU18SU1SX1RYV0IwSU18SU1SX1RYV0IxSU18SU1SX0ZMT05JTXwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVJfT1ZGSU18SU1SX0xTVEVJTXxJTVJfTFNUUEVJTXxJTVJfU1JDSU18SU1SX01JQkZJTXxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1SX1NIRE5JTSB8SU1SX1RNUjFJTXxJTVJfVE1SMElNfElNUl9UWFNUTE0gKQorCisvKgorICoJQml0cyBpbiB0aGUgVERDU1IwLzEsIFJEQ1NSMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgVFJEQ1NSX0RFQUQgICAgICAgICAweDAwMDgKKyNkZWZpbmUgVFJEQ1NSX1dBSyAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgVFJEQ1NSX0FDVCAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVFJEQ1NSX1JVTgkgICAgMHgwMDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBDQU1BRERSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDQU1BRERSX0NBTUVOICAgICAgIDB4ODAKKyNkZWZpbmUgQ0FNQUREUl9WQ0FNU0wgICAgICAweDQwCisKKy8qCisgKglCaXRzIGluIHRoZSBDQU1DUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0FNQ1JfUFMxICAgICAgICAgICAweDgwCisjZGVmaW5lIENBTUNSX1BTMCAgICAgICAgICAgMHg0MAorI2RlZmluZSBDQU1DUl9BSVRSUEtUICAgICAgIDB4MjAKKyNkZWZpbmUgQ0FNQ1JfQUlUUjE2ICAgICAgICAweDEwCisjZGVmaW5lIENBTUNSX0NBTVJEICAgICAgICAgMHgwOAorI2RlZmluZSBDQU1DUl9DQU1XUiAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0FNQ1JfUFNfQ0FNX01BU0sgICAweDQwCisjZGVmaW5lIENBTUNSX1BTX0NBTV9EQVRBICAgMHg4MAorI2RlZmluZSBDQU1DUl9QU19NQVIgICAgICAgIDB4MDAKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1JSUNGRyByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJQ0ZHX01QTzEgICAgICAgICAweDgwCisjZGVmaW5lIE1JSUNGR19NUE8wICAgICAgICAgMHg0MAorI2RlZmluZSBNSUlDRkdfTUZEQyAgICAgICAgIDB4MjAKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1JSVNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNSUlTUl9NSURMRSAgICAgICAgIDB4ODAKKworLyoKKyAqCSBCaXRzIGluIHRoZSBQSFlTUjAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFBIWVNSMF9QSFlSU1QgICAgICAgMHg4MAorI2RlZmluZSBQSFlTUjBfTElOS0dEICAgICAgIDB4NDAKKyNkZWZpbmUgUEhZU1IwX0ZEUFggICAgICAgICAweDEwCisjZGVmaW5lIFBIWVNSMF9TUERHICAgICAgICAgMHgwOAorI2RlZmluZSBQSFlTUjBfU1BEMTAgICAgICAgIDB4MDQKKyNkZWZpbmUgUEhZU1IwX1JYRkxDICAgICAgICAweDAyCisjZGVmaW5lIFBIWVNSMF9UWEZMQyAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgUEhZU1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBQSFlTUjFfUEhZVEJJICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1JSUNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNSUlDUl9NQVVUTyAgICAgICAgIDB4ODAKKyNkZWZpbmUgTUlJQ1JfUkNNRCAgICAgICAgICAweDQwCisjZGVmaW5lIE1JSUNSX1dDTUQgICAgICAgICAgMHgyMAorI2RlZmluZSBNSUlDUl9NRFBNICAgICAgICAgIDB4MTAKKyNkZWZpbmUgTUlJQ1JfTU9VVCAgICAgICAgICAweDA4CisjZGVmaW5lIE1JSUNSX01ETyAgICAgICAgICAgMHgwNAorI2RlZmluZSBNSUlDUl9NREkgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUlJQ1JfTURDICAgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUlBRFIgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIE1JSUFEUl9TV01QTCAgICAgICAgMHg4MAorCisvKgorICoJQml0cyBpbiB0aGUgQ0ZHQSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHQV9QTUhDVEcgICAgICAgICAweDA4CisjZGVmaW5lIENGR0FfR1BJTzFQRCAgICAgICAgMHgwNAorI2RlZmluZSBDRkdBX0FCU0hETiAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ0ZHQV9QQUNQSSAgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBDRkdCIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdCX0dUQ0tPUFQgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0ZHQl9NSUlPUFQgICAgICAgICAweDQwCisjZGVmaW5lIENGR0JfQ1JTRU9QVCAgICAgICAgMHgyMAorI2RlZmluZSBDRkdCX09GU0VUICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQ0ZHQl9DUkFORE9NICAgICAgICAweDA4CisjZGVmaW5lIENGR0JfQ0FQICAgICAgICAgICAgMHgwNAorI2RlZmluZSBDRkdCX01CQSAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ0ZHQl9CQUtPUFQgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBDRkdDIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdDX0VFTE9BRCAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0ZHQ19CUk9QVCAgICAgICAgICAweDQwCisjZGVmaW5lIENGR0NfRExZRU4gICAgICAgICAgMHgyMAorI2RlZmluZSBDRkdDX0RUU0VMICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQ0ZHQ19CVFNFTCAgICAgICAgICAweDA4CisjZGVmaW5lIENGR0NfQlBTMiAgICAgICAgICAgMHgwNAkvKiBib290cm9tIHNlbGVjdFsyXSAqLworI2RlZmluZSBDRkdDX0JQUzEgICAgICAgICAgIDB4MDIJLyogYm9vdHJvbSBzZWxlY3RbMV0gKi8KKyNkZWZpbmUgQ0ZHQ19CUFMwICAgICAgICAgICAweDAxCS8qIGJvb3Ryb20gc2VsZWN0WzBdICovCisKKy8qCisgKiBCaXRzIGluIHRoZSBDRkdEIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdEX0lPRElTICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0ZHRF9NU0xWREFDRU4gICAgICAweDQwCisjZGVmaW5lIENGR0RfQ0ZHREFDRU4gICAgICAgMHgyMAorI2RlZmluZSBDRkdEX1BDSTY0RU4gICAgICAgIDB4MTAKKyNkZWZpbmUgQ0ZHRF9IVE1STDQgICAgICAgICAweDA4CisKKy8qCisgKglCaXRzIGluIHRoZSBEQ0ZHMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgRENGR19YTVdJICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgRENGR19YTVJNICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgRENGR19YTVJMICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRENGR19QRVJESVMgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRENGR19NUldBSVQgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRENGR19NV1dBSVQgICAgICAgICAweDAyMDAKKyNkZWZpbmUgRENGR19MQVRNRU4gICAgICAgICAweDAxMDAKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1DRkcwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNQ0ZHX1JYQVJCICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBNQ0ZHX1JGVDEgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBNQ0ZHX1JGVDAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBNQ0ZHX0xPV1RIT1BUICAgICAgIDB4MDAwOAorI2RlZmluZSBNQ0ZHX1BRRU4gICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBNQ0ZHX1JUR09QVCAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNQ0ZHX1ZJREZSICAgICAgICAgIDB4MDAwMQorCisvKgorICoJQml0cyBpbiB0aGUgTUNGRzEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIE1DRkdfVFhBUkIgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIE1DRkdfVFhRQksxICAgICAgICAgMHgwODAwCisjZGVmaW5lIE1DRkdfVFhRQkswICAgICAgICAgMHgwNDAwCisjZGVmaW5lIE1DRkdfVFhRTk9CSyAgICAgICAgMHgwMjAwCisjZGVmaW5lIE1DRkdfU05BUE9QVCAgICAgICAgMHgwMTAwCisKKy8qCisgKglCaXRzIGluIHRoZSBQTUNDICByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUE1DQ19EU0kgICAgICAgICAgICAweDgwCisjZGVmaW5lIFBNQ0NfRDJfRElTICAgICAgICAgMHg0MAorI2RlZmluZSBQTUNDX0QxX0RJUyAgICAgICAgIDB4MjAKKyNkZWZpbmUgUE1DQ19EM0NfRU4gICAgICAgICAweDEwCisjZGVmaW5lIFBNQ0NfRDNIX0VOICAgICAgICAgMHgwOAorI2RlZmluZSBQTUNDX0QyX0VOICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUE1DQ19EMV9FTiAgICAgICAgICAweDAyCisjZGVmaW5lIFBNQ0NfRDBfRU4gICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiBTVElDS0hXCisgKi8KKworI2RlZmluZSBTVElDS0hXX1NXUFRBRyAgICAgIDB4MTAKKyNkZWZpbmUgU1RJQ0tIV19XT0xTUiAgICAgICAweDA4CisjZGVmaW5lIFNUSUNLSFdfV09MRU4gICAgICAgMHgwNAorI2RlZmluZSBTVElDS0hXX0RTMSAgICAgICAgIDB4MDIJLyogUi9XIGJ5IHNvZnR3YXJlL2NmZyBjeWNsZSAqLworI2RlZmluZSBTVElDS0hXX0RTMCAgICAgICAgIDB4MDEJLyogc3VzcGVuZCB3ZWxsIERTIHdyaXRlIHBvcnQgKi8KKworLyoKKyAqCUJpdHMgaW4gdGhlIE1JQkNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNSUJDUl9NSUJJU1RPSyAgICAgIDB4ODAKKyNkZWZpbmUgTUlCQ1JfTUlCSVNUR08gICAgICAweDQwCisjZGVmaW5lIE1JQkNSX01JQklOQyAgICAgICAgMHgyMAorI2RlZmluZSBNSUJDUl9NSUJISSAgICAgICAgIDB4MTAKKyNkZWZpbmUgTUlCQ1JfTUlCRlJaICAgICAgICAweDA4CisjZGVmaW5lIE1JQkNSX01JQkZMU0ggICAgICAgMHgwNAorI2RlZmluZSBNSUJDUl9NUFRSSU5JICAgICAgIDB4MDIKKyNkZWZpbmUgTUlCQ1JfTUlCQ0xSICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBFRVJTViByZWdpc3RlcgorICovCisKKyNkZWZpbmUgRUVSU1ZfQk9PVF9SUEwgICAgICAoKHU4KSAweDAxKQkvKiBCb290IG1ldGhvZCBzZWxlY3Rpb24gZm9yIFZUNjExMCAqLworCisjZGVmaW5lIEVFUlNWX0JPT1RfTUFTSyAgICAgKCh1OCkgMHgwNikKKyNkZWZpbmUgRUVSU1ZfQk9PVF9JTlQxOSAgICAoKHU4KSAweDAwKQorI2RlZmluZSBFRVJTVl9CT09UX0lOVDE4ICAgICgodTgpIDB4MDIpCisjZGVmaW5lIEVFUlNWX0JPT1RfTE9DQUwgICAgKCh1OCkgMHgwNCkKKyNkZWZpbmUgRUVSU1ZfQk9PVF9CRVYgICAgICAoKHU4KSAweDA2KQorCisKKy8qCisgKglCaXRzIGluIEJQQ01ECisgKi8KKworI2RlZmluZSBCUENNRF9CUERORSAgICAgICAgIDB4ODAKKyNkZWZpbmUgQlBDTURfRUJQV1IgICAgICAgICAweDAyCisjZGVmaW5lIEJQQ01EX0VCUFJEICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgRUVDU1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIEVFQ1NSX0VNQlAgICAgICAgICAgMHg0MAkvKiBlZXByb20gZW1iZWRlZCBwcm9ncmFtbWluZyAqLworI2RlZmluZSBFRUNTUl9SRUxPQUQgICAgICAgIDB4MjAJLyogZWVwcm9tIGNvbnRlbnQgcmVsb2FkICovCisjZGVmaW5lIEVFQ1NSX0RQTSAgICAgICAgICAgMHgxMAkvKiBlZXByb20gZGlyZWN0IHByb2dyYW1taW5nICovCisjZGVmaW5lIEVFQ1NSX0VDUyAgICAgICAgICAgMHgwOAkvKiBlZXByb20gQ1MgcGluICovCisjZGVmaW5lIEVFQ1NSX0VDSyAgICAgICAgICAgMHgwNAkvKiBlZXByb20gQ0sgcGluICovCisjZGVmaW5lIEVFQ1NSX0VESSAgICAgICAgICAgMHgwMgkvKiBlZXByb20gREkgcGluICovCisjZGVmaW5lIEVFQ1NSX0VETyAgICAgICAgICAgMHgwMQkvKiBlZXByb20gRE8gcGluICovCisKKy8qCisgKglCaXRzIGluIHRoZSBFTUJDTUQgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIEVNQkNNRF9FRE9ORSAgICAgICAgMHg4MAorI2RlZmluZSBFTUJDTURfRVdESVMgICAgICAgIDB4MDgKKyNkZWZpbmUgRU1CQ01EX0VXRU4gICAgICAgICAweDA0CisjZGVmaW5lIEVNQkNNRF9FV1IgICAgICAgICAgMHgwMgorI2RlZmluZSBFTUJDTURfRVJEICAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gVEVTVENGRyByZWdpc3RlcgorICovCisKKyNkZWZpbmUgVEVTVENGR19IQkRJUyAgICAgICAweDgwCisKKy8qCisgKglCaXRzIGluIENISVBHQ1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENISVBHQ1JfRkNHTUlJICAgICAgMHg4MAorI2RlZmluZSBDSElQR0NSX0ZDRkRYICAgICAgIDB4NDAKKyNkZWZpbmUgQ0hJUEdDUl9GQ1JFU1YgICAgICAweDIwCisjZGVmaW5lIENISVBHQ1JfRkNNT0RFICAgICAgMHgxMAorI2RlZmluZSBDSElQR0NSX0xQU09QVCAgICAgIDB4MDgKKyNkZWZpbmUgQ0hJUEdDUl9UTTFVUyAgICAgICAweDA0CisjZGVmaW5lIENISVBHQ1JfVE0wVVMgICAgICAgMHgwMgorI2RlZmluZSBDSElQR0NSX1BIWUlOVEVOICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gV09MQ1IwCisgKi8KKworI2RlZmluZSBXT0xDUl9NU1dPTEVONyAgICAgIDB4MDA4MAkvKiBlbmFibGUgcGF0dGVybiBtYXRjaCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgV09MQ1JfTVNXT0xFTjYgICAgICAweDAwNDAKKyNkZWZpbmUgV09MQ1JfTVNXT0xFTjUgICAgICAweDAwMjAKKyNkZWZpbmUgV09MQ1JfTVNXT0xFTjQgICAgICAweDAwMTAKKyNkZWZpbmUgV09MQ1JfTVNXT0xFTjMgICAgICAweDAwMDgKKyNkZWZpbmUgV09MQ1JfTVNXT0xFTjIgICAgICAweDAwMDQKKyNkZWZpbmUgV09MQ1JfTVNXT0xFTjEgICAgICAweDAwMDIKKyNkZWZpbmUgV09MQ1JfTVNXT0xFTjAgICAgICAweDAwMDEKKyNkZWZpbmUgV09MQ1JfQVJQX0VOICAgICAgICAweDAwMDEKKworLyoKKyAqCUJpdHMgaW4gV09MQ1IxCisgKi8KKworI2RlZmluZSBXT0xDUl9MSU5LT0ZGX0VOICAgICAgMHgwODAwCS8qIGxpbmsgb2ZmIGRldGVjdGVkIGVuYWJsZSAqLworI2RlZmluZSBXT0xDUl9MSU5LT05fRU4gICAgICAgMHgwNDAwCS8qIGxpbmsgb24gZGV0ZWN0ZWQgZW5hYmxlICovCisjZGVmaW5lIFdPTENSX01BR0lDX0VOICAgICAgICAweDAyMDAJLyogbWFnaWMgcGFja2V0IGZpbHRlciBlbmFibGUgKi8KKyNkZWZpbmUgV09MQ1JfVU5JQ0FTVF9FTiAgICAgIDB4MDEwMAkvKiB1bmljYXN0IGZpbHRlciBlbmFibGUgKi8KKworCisvKgorICoJQml0cyBpbiBQV0NGRworICovCisKKyNkZWZpbmUgUFdDRkdfUEhZUFdPUFQgICAgICAgICAgMHg4MAkvKiBpbnRlcm5hbCBNSUkgSS9GIHRpbWluZyAqLworI2RlZmluZSBQV0NGR19QQ0lTVElDSyAgICAgICAgICAweDQwCS8qIFBDSSBzdGlja3kgUi9XIGVuYWJsZSAqLworI2RlZmluZSBQV0NGR19XT0xUWVBFICAgICAgICAgICAweDIwCS8qIHB1bHNlKDEpIG9yIGJ1dHRvbiAoMCkgKi8KKyNkZWZpbmUgUFdDRkdfTEVHQ1lfV09MICAgICAgICAgMHgxMAorI2RlZmluZSBQV0NGR19QTUNTUl9QTUVfU1IgICAgICAweDA4CisjZGVmaW5lIFBXQ0ZHX1BNQ1NSX1BNRV9FTiAgICAgIDB4MDQJLyogY29udHJvbCBieSBQQ0lTVElDSyAqLworI2RlZmluZSBQV0NGR19MRUdBQ1lfV09MU1IgICAgICAweDAyCS8qIExlZ2FjeSBXT0xfU1Igc2hhZG93ICovCisjZGVmaW5lIFBXQ0ZHX0xFR0FDWV9XT0xFTiAgICAgIDB4MDEJLyogTGVnYWN5IFdPTF9FTiBzaGFkb3cgKi8KKworLyoKKyAqCUJpdHMgaW4gV09MQ0ZHCisgKi8KKworI2RlZmluZSBXT0xDRkdfUE1FT1ZSICAgICAgICAgICAweDgwCS8qIGZvciBsZWdhY3kgdXNlLCBmb3JjZSBQTUVFTiBhbHdheXMgKi8KKyNkZWZpbmUgV09MQ0ZHX1NBTSAgICAgICAgICAgICAgMHgyMAkvKiBhY2NlcHQgbXVsdGljYXN0IGNhc2UgcmVzZXQsIGRlZmF1bHQ9MCAqLworI2RlZmluZSBXT0xDRkdfU0FCICAgICAgICAgICAgICAweDEwCS8qIGFjY2VwdCBicm9hZGNhc3QgY2FzZSByZXNldCwgZGVmYXVsdD0wICovCisjZGVmaW5lIFdPTENGR19TTUlJQUNDICAgICAgICAgIDB4MDgJLyogPz8gKi8KKyNkZWZpbmUgV09MQ0ZHX1NHRU5XSCAgICAgICAgICAgMHgwMgorI2RlZmluZSBXT0xDRkdfUEhZSU5URU4gICAgICAgICAweDAxCS8qIDA6UEhZSU5UIHRyaWdnZXIgZW5hYmxlLCAxOnVzZSBpbnRlcm5hbCBNSUkKKwkJCQkJICAgdG8gcmVwb3J0IHN0YXR1cyBjaGFuZ2UgKi8KKy8qCisgKglCaXRzIGluIFdPTFNSMQorICovCisKKyNkZWZpbmUgV09MU1JfTElOS09GRl9JTlQgICAgICAweDA4MDAKKyNkZWZpbmUgV09MU1JfTElOS09OX0lOVCAgICAgICAweDA0MDAKKyNkZWZpbmUgV09MU1JfTUFHSUNfSU5UICAgICAgICAweDAyMDAKKyNkZWZpbmUgV09MU1JfVU5JQ0FTVF9JTlQgICAgICAweDAxMDAKKworLyoKKyAqCUV0aGVybmV0IGFkZHJlc3MgZmlsdGVyIHR5cGUKKyAqLworCisjZGVmaW5lIFBLVF9UWVBFX05PTkUgICAgICAgICAgICAgICAweDAwMDAJLyogVHVybiBvZmYgcmVjZWl2ZXIgKi8KKyNkZWZpbmUgUEtUX1RZUEVfRElSRUNURUQgICAgICAgICAgIDB4MDAwMQkvKiBvYnNlbGV0ZSwgZGlyZWN0ZWQgYWRkcmVzcyBpcyBhbHdheXMgYWNjZXB0ZWQgKi8KKyNkZWZpbmUgUEtUX1RZUEVfTVVMVElDQVNUICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQS1RfVFlQRV9BTExfTVVMVElDQVNUICAgICAgMHgwMDA0CisjZGVmaW5lIFBLVF9UWVBFX0JST0FEQ0FTVCAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUEtUX1RZUEVfUFJPTUlTQ1VPVVMgICAgICAgIDB4MDAyMAorI2RlZmluZSBQS1RfVFlQRV9MT05HICAgICAgICAgICAgICAgMHgyMDAwCS8qIE5PVEUuLi4uIHRoZSBkZWZpbml0aW9uIG9mIExPTkcgaXMgPjIwNDggYnl0ZXMgaW4gb3VyIGNoaXAgKi8KKyNkZWZpbmUgUEtUX1RZUEVfUlVOVCAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBQS1RfVFlQRV9FUlJPUiAgICAgICAgICAgICAgMHg4MDAwCS8qIEFjY2VwdCBlcnJvciBwYWNrZXRzLCBlLmcuIENSQyBlcnJvciAqLworCisvKgorICoJTG9vcGJhY2sgbW9kZQorICovCisKKyNkZWZpbmUgTUFDX0xCX05PTkUgICAgICAgICAweDAwCisjZGVmaW5lIE1BQ19MQl9JTlRFUk5BTCAgICAgMHgwMQorI2RlZmluZSBNQUNfTEJfRVhURVJOQUwgICAgIDB4MDIKKworLyoKKyAqCUVuYWJsZWQgbWFzayB2YWx1ZSBvZiBpcnEKKyAqLworCisjaWYgZGVmaW5lZChfU0lNKQorI2RlZmluZSBJTVJfTUFTS19WQUxVRSAgICAgIDB4MDAzM0ZGMEZVTAkvKiBpbml0aWFsIHZhbHVlIG9mIElNUgorCQkJCQkJICAgc2V0IElNUjAgdG8gMHgwRiBhY2NvcmRpbmcgdG8gc3BlYyAqLworCisjZWxzZQorI2RlZmluZSBJTVJfTUFTS19WQUxVRSAgICAgIDB4MDAxM0ZCMEZVTAkvKiBpbml0aWFsIHZhbHVlIG9mIElNUgorCQkJCQkJICAgaWdub3JlIE1JQkZJLFJBQ0VJIHRvCisJCQkJCQkgICByZWR1Y2UgaW50ci4gZnJlcXVlbmN5CisJCQkJCQkgICBOT1RFLi4uLiBkbyBub3QgZW5hYmxlIE5vQnVmIGludCBtYXNrIGF0IGRyaXZlciBkcml2ZXIKKwkJCQkJCSAgIHdoZW4gKDEpIE5vQnVmIC0+IFJ4VGhyZXNob2xkID0gU0YKKwkJCQkJCSAgICgyKSBPSyAgICAtPiBSeFRocmVzaG9sZCA9IG9yaWdpbmFsIHZhbHVlCisJCQkJCQkgKi8KKyNlbmRpZgorCisvKgorICoJUmV2aXNpb24gaWQKKyAqLworCisjZGVmaW5lIFJFVl9JRF9WVDMxMTlfQTAJMHgwMAorI2RlZmluZSBSRVZfSURfVlQzMTE5X0ExCTB4MDEKKyNkZWZpbmUgUkVWX0lEX1ZUMzIxNl9BMAkweDEwCisKKy8qCisgKglNYXggdGltZSBvdXQgZGVsYXkgdGltZQorICovCisKKyNkZWZpbmUgV19NQVhfVElNRU9VVCAgICAgICAweDBGRkZVCisKKworLyoKKyAqCU1BQyByZWdpc3RlcnMgYXMgYSBzdHJ1Y3R1cmUuIENhbm5vdCBiZSBkaXJlY3RseSBhY2Nlc3NlZCB0aGlzCisgKgl3YXkgYnV0IGdlbmVyYXRlcyBvZmZzZXRzIGZvciByZWFkbC93cml0ZWwoKSBjYWxscworICovCisKK3N0cnVjdCBtYWNfcmVncyB7CisJdm9sYXRpbGUgdTggUEFSWzZdOwkvKiAweDAwICovCisJdm9sYXRpbGUgdTggUkNSOworCXZvbGF0aWxlIHU4IFRDUjsKKworCXZvbGF0aWxlIHUzMiBDUjBTZXQ7CS8qIDB4MDggKi8KKwl2b2xhdGlsZSB1MzIgQ1IwQ2xyOwkvKiAweDBDICovCisKKwl2b2xhdGlsZSB1OCBNQVJDQU1bOF07CS8qIDB4MTAgKi8KKworCXZvbGF0aWxlIHUzMiBEZWNCYXNlSGk7CS8qIDB4MTggKi8KKwl2b2xhdGlsZSB1MTYgRGJmQmFzZUhpOwkvKiAweDFDICovCisJdm9sYXRpbGUgdTE2IHJlc2VydmVkXzFFOworCisJdm9sYXRpbGUgdTE2IElTUkNUTDsJLyogMHgyMCAqLworCXZvbGF0aWxlIHU4IFRYRVNSOworCXZvbGF0aWxlIHU4IFJYRVNSOworCisJdm9sYXRpbGUgdTMyIElTUjsJLyogMHgyNCAqLworCXZvbGF0aWxlIHUzMiBJTVI7CisKKwl2b2xhdGlsZSB1MzIgVERTdGF0dXNQb3J0OwkvKiAweDJDICovCisKKwl2b2xhdGlsZSB1MTYgVERDU1JTZXQ7CS8qIDB4MzAgKi8KKwl2b2xhdGlsZSB1OCBSRENTUlNldDsKKwl2b2xhdGlsZSB1OCByZXNlcnZlZF8zMzsKKwl2b2xhdGlsZSB1MTYgVERDU1JDbHI7CisJdm9sYXRpbGUgdTggUkRDU1JDbHI7CisJdm9sYXRpbGUgdTggcmVzZXJ2ZWRfMzc7CisKKwl2b2xhdGlsZSB1MzIgUkRCYXNlTG87CS8qIDB4MzggKi8KKwl2b2xhdGlsZSB1MTYgUkRJZHg7CS8qIDB4M0MgKi8KKwl2b2xhdGlsZSB1MTYgcmVzZXJ2ZWRfM0U7CisKKwl2b2xhdGlsZSB1MzIgVERCYXNlTG9bNF07CS8qIDB4NDAgKi8KKworCXZvbGF0aWxlIHUxNiBSRENTaXplOwkvKiAweDUwICovCisJdm9sYXRpbGUgdTE2IFREQ1NpemU7CS8qIDB4NTIgKi8KKwl2b2xhdGlsZSB1MTYgVERJZHhbNF07CS8qIDB4NTQgKi8KKwl2b2xhdGlsZSB1MTYgdHhfcGF1c2VfdGltZXI7CS8qIDB4NUMgKi8KKwl2b2xhdGlsZSB1MTYgUkJSRFU7CS8qIDB4NUUgKi8KKworCXZvbGF0aWxlIHUzMiBGSUZPVGVzdDA7CS8qIDB4NjAgKi8KKwl2b2xhdGlsZSB1MzIgRklGT1Rlc3QxOwkvKiAweDY0ICovCisKKwl2b2xhdGlsZSB1OCBDQU1BRERSOwkvKiAweDY4ICovCisJdm9sYXRpbGUgdTggQ0FNQ1I7CS8qIDB4NjkgKi8KKwl2b2xhdGlsZSB1OCBHRlRFU1Q7CS8qIDB4NkEgKi8KKwl2b2xhdGlsZSB1OCBGVFNUQ01EOwkvKiAweDZCICovCisKKwl2b2xhdGlsZSB1OCBNSUlDRkc7CS8qIDB4NkMgKi8KKwl2b2xhdGlsZSB1OCBNSUlTUjsKKwl2b2xhdGlsZSB1OCBQSFlTUjA7CisJdm9sYXRpbGUgdTggUEhZU1IxOworCXZvbGF0aWxlIHU4IE1JSUNSOworCXZvbGF0aWxlIHU4IE1JSUFEUjsKKwl2b2xhdGlsZSB1MTYgTUlJREFUQTsKKworCXZvbGF0aWxlIHUxNiBTb2Z0VGltZXIwOwkvKiAweDc0ICovCisJdm9sYXRpbGUgdTE2IFNvZnRUaW1lcjE7CisKKwl2b2xhdGlsZSB1OCBDRkdBOwkvKiAweDc4ICovCisJdm9sYXRpbGUgdTggQ0ZHQjsKKwl2b2xhdGlsZSB1OCBDRkdDOworCXZvbGF0aWxlIHU4IENGR0Q7CisKKwl2b2xhdGlsZSB1MTYgRENGRzsJLyogMHg3QyAqLworCXZvbGF0aWxlIHUxNiBNQ0ZHOworCisJdm9sYXRpbGUgdTggVEJJU1Q7CS8qIDB4ODAgKi8KKwl2b2xhdGlsZSB1OCBSQklTVDsKKwl2b2xhdGlsZSB1OCBQTUNQT1JUOworCXZvbGF0aWxlIHU4IFNUSUNLSFc7CisKKwl2b2xhdGlsZSB1OCBNSUJDUjsJLyogMHg4NCAqLworCXZvbGF0aWxlIHU4IHJlc2VydmVkXzg1OworCXZvbGF0aWxlIHU4IHJldl9pZDsKKwl2b2xhdGlsZSB1OCBQT1JTVFM7CisKKwl2b2xhdGlsZSB1MzIgTUlCRGF0YTsJLyogMHg4OCAqLworCisJdm9sYXRpbGUgdTE2IEVFV3JEYXRhOworCisJdm9sYXRpbGUgdTggcmVzZXJ2ZWRfOEU7CisJdm9sYXRpbGUgdTggQlBNRFdyOworCXZvbGF0aWxlIHU4IEJQQ01EOworCXZvbGF0aWxlIHU4IEJQTURSZDsKKworCXZvbGF0aWxlIHU4IEVFQ0hLU1VNOwkvKiAweDkyICovCisJdm9sYXRpbGUgdTggRUVDU1I7CisKKwl2b2xhdGlsZSB1MTYgRUVSZERhdGE7CS8qIDB4OTQgKi8KKwl2b2xhdGlsZSB1OCBFQUREUjsKKwl2b2xhdGlsZSB1OCBFTUJDTUQ7CisKKworCXZvbGF0aWxlIHU4IEpNUFNSMDsJLyogMHg5OCAqLworCXZvbGF0aWxlIHU4IEpNUFNSMTsKKwl2b2xhdGlsZSB1OCBKTVBTUjI7CisJdm9sYXRpbGUgdTggSk1QU1IzOworCXZvbGF0aWxlIHU4IENISVBHU1I7CS8qIDB4OUMgKi8KKwl2b2xhdGlsZSB1OCBURVNUQ0ZHOworCXZvbGF0aWxlIHU4IERFQlVHOworCXZvbGF0aWxlIHU4IENISVBHQ1I7CisKKwl2b2xhdGlsZSB1MTYgV09MQ1JTZXQ7CS8qIDB4QTAgKi8KKwl2b2xhdGlsZSB1OCBQV0NGR1NldDsKKwl2b2xhdGlsZSB1OCBXT0xDRkdTZXQ7CisKKwl2b2xhdGlsZSB1MTYgV09MQ1JDbHI7CS8qIDB4QTQgKi8KKwl2b2xhdGlsZSB1OCBQV0NGR0NMUjsKKwl2b2xhdGlsZSB1OCBXT0xDRkdDbHI7CisKKwl2b2xhdGlsZSB1MTYgV09MU1JTZXQ7CS8qIDB4QTggKi8KKwl2b2xhdGlsZSB1MTYgcmVzZXJ2ZWRfQUE7CisKKwl2b2xhdGlsZSB1MTYgV09MU1JDbHI7CS8qIDB4QUMgKi8KKwl2b2xhdGlsZSB1MTYgcmVzZXJ2ZWRfQUU7CisKKwl2b2xhdGlsZSB1MTYgUGF0dGVybkNSQ1s4XTsJLyogMHhCMCAqLworCXZvbGF0aWxlIHUzMiBCeXRlTWFza1s0XVs0XTsJLyogMHhDMCAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisKK2VudW0gaHdfbWliIHsKKwlIV19NSUJfaWZSeEFsbFBrdHMgPSAwLAorCUhXX01JQl9pZlJ4T2tQa3RzLAorCUhXX01JQl9pZlR4T2tQa3RzLAorCUhXX01JQl9pZlJ4RXJyb3JQa3RzLAorCUhXX01JQl9pZlJ4UnVudE9rUGt0LAorCUhXX01JQl9pZlJ4UnVudEVyclBrdCwKKwlIV19NSUJfaWZSeDY0UGt0cywKKwlIV19NSUJfaWZUeDY0UGt0cywKKwlIV19NSUJfaWZSeDY1VG8xMjdQa3RzLAorCUhXX01JQl9pZlR4NjVUbzEyN1BrdHMsCisJSFdfTUlCX2lmUngxMjhUbzI1NVBrdHMsCisJSFdfTUlCX2lmVHgxMjhUbzI1NVBrdHMsCisJSFdfTUlCX2lmUngyNTZUbzUxMVBrdHMsCisJSFdfTUlCX2lmVHgyNTZUbzUxMVBrdHMsCisJSFdfTUlCX2lmUng1MTJUbzEwMjNQa3RzLAorCUhXX01JQl9pZlR4NTEyVG8xMDIzUGt0cywKKwlIV19NSUJfaWZSeDEwMjRUbzE1MThQa3RzLAorCUhXX01JQl9pZlR4MTAyNFRvMTUxOFBrdHMsCisJSFdfTUlCX2lmVHhFdGhlckNvbGxpc2lvbnMsCisJSFdfTUlCX2lmUnhQa3RDUkNFLAorCUhXX01JQl9pZlJ4SnVtYm9Qa3RzLAorCUhXX01JQl9pZlR4SnVtYm9Qa3RzLAorCUhXX01JQl9pZlJ4TWFjQ29udHJvbEZyYW1lcywKKwlIV19NSUJfaWZUeE1hY0NvbnRyb2xGcmFtZXMsCisJSFdfTUlCX2lmUnhQa3RGQUUsCisJSFdfTUlCX2lmUnhMb25nT2tQa3QsCisJSFdfTUlCX2lmUnhMb25nUGt0RXJyUGt0LAorCUhXX01JQl9pZlRYU1FFRXJyb3JzLAorCUhXX01JQl9pZlJ4Tm9idWYsCisJSFdfTUlCX2lmUnhTeW1ib2xFcnJvcnMsCisJSFdfTUlCX2lmSW5SYW5nZUxlbmd0aEVycm9ycywKKwlIV19NSUJfaWZMYXRlQ29sbGlzaW9ucywKKwlIV19NSUJfU0laRQorfTsKKworZW51bSBjaGlwX3R5cGUgeworCUNISVBfVFlQRV9WVDYxMTAgPSAxLAorfTsKKworc3RydWN0IHZlbG9jaXR5X2luZm9fdGJsIHsKKwllbnVtIGNoaXBfdHlwZSBjaGlwX2lkOworCWNoYXIgKm5hbWU7CisJaW50IGlvX3NpemU7CisJaW50IHR4cXVldWU7CisJdTMyIGZsYWdzOworfTsKKworc3RhdGljIHN0cnVjdCB2ZWxvY2l0eV9pbmZvX3RibCAqaW5mbzsKKworI2RlZmluZSBtYWNfaHdfbWlic19pbml0KHJlZ3MpIHtcCisJQllURV9SRUdfQklUU19PTihNSUJDUl9NSUJGUlosJigocmVncyktPk1JQkNSKSk7XAorCUJZVEVfUkVHX0JJVFNfT04oTUlCQ1JfTUlCQ0xSLCYoKHJlZ3MpLT5NSUJDUikpO1wKKwlkbyB7fVwKKwkJd2hpbGUgKEJZVEVfUkVHX0JJVFNfSVNfT04oTUlCQ1JfTUlCQ0xSLCYoKHJlZ3MpLT5NSUJDUikpKTtcCisJQllURV9SRUdfQklUU19PRkYoTUlCQ1JfTUlCRlJaLCYoKHJlZ3MpLT5NSUJDUikpO1wKK30KKworI2RlZmluZSBtYWNfcmVhZF9pc3IocmVncykgIAkJcmVhZGwoJigocmVncyktPklTUikpCisjZGVmaW5lIG1hY193cml0ZV9pc3IocmVncywgeCkgIAl3cml0ZWwoKHgpLCYoKHJlZ3MpLT5JU1IpKQorI2RlZmluZSBtYWNfY2xlYXJfaXNyKHJlZ3MpIAkJd3JpdGVsKDB4ZmZmZmZmZmZMLCYoKHJlZ3MpLT5JU1IpKQorCisjZGVmaW5lIG1hY193cml0ZV9pbnRfbWFzayhtYXNrLCByZWdzKSAJd3JpdGVsKChtYXNrKSwmKChyZWdzKS0+SU1SKSk7CisjZGVmaW5lIG1hY19kaXNhYmxlX2ludChyZWdzKSAgICAgICAJd3JpdGVsKENSMF9HSU5UTVNLMSwmKChyZWdzKS0+Q1IwQ2xyKSkKKyNkZWZpbmUgbWFjX2VuYWJsZV9pbnQocmVncykgICAgCXdyaXRlbChDUjBfR0lOVE1TSzEsJigocmVncyktPkNSMFNldCkpCisKKyNkZWZpbmUgbWFjX2h3X21pYnNfcmVhZChyZWdzLCBNSUJzKSB7XAorCWludCBpO1wKKwlCWVRFX1JFR19CSVRTX09OKE1JQkNSX01QVFJJTkksJigocmVncyktPk1JQkNSKSk7XAorCWZvciAoaT0wO2k8SFdfTUlCX1NJWkU7aSsrKSB7XAorCQkoTUlCcylbaV09cmVhZGwoJigocmVncyktPk1JQkRhdGEpKTtcCisJfVwKK30KKworI2RlZmluZSBtYWNfc2V0X2RtYV9sZW5ndGgocmVncywgbikge1wKKwlCWVRFX1JFR19CSVRTX1NFVCgobiksMHgwNywmKChyZWdzKS0+RENGRykpO1wKK30KKworI2RlZmluZSBtYWNfc2V0X3J4X3RocmVzaChyZWdzLCBuKSB7XAorCUJZVEVfUkVHX0JJVFNfU0VUKChuKSwoTUNGR19SRlQwfE1DRkdfUkZUMSksJigocmVncyktPk1DRkcpKTtcCit9CisKKyNkZWZpbmUgbWFjX3J4X3F1ZXVlX3J1bihyZWdzKSB7XAorCXdyaXRlYihUUkRDU1JfUlVOLCAmKChyZWdzKS0+UkRDU1JTZXQpKTtcCit9CisKKyNkZWZpbmUgbWFjX3J4X3F1ZXVlX3dha2UocmVncykge1wKKwl3cml0ZWIoVFJEQ1NSX1dBSywgJigocmVncyktPlJEQ1NSU2V0KSk7XAorfQorCisjZGVmaW5lIG1hY190eF9xdWV1ZV9ydW4ocmVncywgbikge1wKKwl3cml0ZXcoVFJEQ1NSX1JVTjw8KChuKSo0KSwmKChyZWdzKS0+VERDU1JTZXQpKTtcCit9CisKKyNkZWZpbmUgbWFjX3R4X3F1ZXVlX3dha2UocmVncywgbikge1wKKwl3cml0ZXcoVFJEQ1NSX1dBSzw8KG4qNCksJigocmVncyktPlREQ1NSU2V0KSk7XAorfQorCisjZGVmaW5lIG1hY19lZXByb21fcmVsb2FkKHJlZ3MpIHtcCisJaW50IGk9MDtcCisJQllURV9SRUdfQklUU19PTihFRUNTUl9SRUxPQUQsJigocmVncyktPkVFQ1NSKSk7XAorCWRvIHtcCisJCXVkZWxheSgxMCk7XAorCQlpZiAoaSsrPjB4MTAwMCkge1wKKwkJCWJyZWFrO1wKKwkJfVwKKwl9d2hpbGUgKEJZVEVfUkVHX0JJVFNfSVNfT04oRUVDU1JfUkVMT0FELCYoKHJlZ3MpLT5FRUNTUikpKTtcCit9CisKK2VudW0gdmVsb2NpdHlfY2FtX3R5cGUgeworCVZFTE9DSVRZX1ZMQU5fSURfQ0FNID0gMCwKKwlWRUxPQ0lUWV9NVUxUSUNBU1RfQ0FNCit9OworCisvKioKKyAqCW1hY19nZXRfY2FtX21hc2sJLQlSZWFkIGEgQ0FNIG1hc2sKKyAqCUByZWdzOiByZWdpc3RlciBibG9jayBmb3IgdGhpcyB2ZWxvY2l0eQorICoJQG1hc2s6IGJ1ZmZlciB0byBzdG9yZSBtYXNrCisgKglAY2FtX3R5cGU6IENBTSB0byBmZXRjaAorICoKKyAqCUZldGNoIHRoZSBtYXNrIGJpdHMgb2YgdGhlIHNlbGVjdGVkIENBTSBhbmQgc3RvcmUgdGhlbSBpbnRvIHRoZQorICoJcHJvdmlkZWQgbWFzayBidWZmZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1hY19nZXRfY2FtX21hc2soc3RydWN0IG1hY19yZWdzICpyZWdzLCB1OCAqIG1hc2ssCisJCQkJICAgIGVudW0gdmVsb2NpdHlfY2FtX3R5cGUgY2FtX3R5cGUpCit7CisJaW50IGk7CisJLyogU2VsZWN0IENBTSBtYXNrICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfQ0FNX01BU0ssIENBTUNSX1BTMSB8IENBTUNSX1BTMCwKKwkJCSAgJnJlZ3MtPkNBTUNSKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJd3JpdGViKENBTUFERFJfVkNBTVNMLCAmcmVncy0+Q0FNQUREUik7CisJZWxzZQorCQl3cml0ZWIoMCwgJnJlZ3MtPkNBTUFERFIpOworCisJLyogcmVhZCBtYXNrICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJKm1hc2srKyA9IHJlYWRiKCYocmVncy0+TUFSQ0FNW2ldKSk7CisKKwkvKiBkaXNhYmxlIENBTUVOICovCisJd3JpdGViKDAsICZyZWdzLT5DQU1BRERSKTsKKworCS8qIFNlbGVjdCBtYXIgKi8KKwlCWVRFX1JFR19CSVRTX1NFVChDQU1DUl9QU19NQVIsIENBTUNSX1BTMSB8IENBTUNSX1BTMCwKKwkJCSAgJnJlZ3MtPkNBTUNSKTsKKworfQorCisvKioKKyAqCW1hY19zZXRfY2FtX21hc2sJLQlTZXQgYSBDQU0gbWFzaworICoJQHJlZ3M6IHJlZ2lzdGVyIGJsb2NrIGZvciB0aGlzIHZlbG9jaXR5CisgKglAbWFzazogQ0FNIG1hc2sgdG8gbG9hZAorICoJQGNhbV90eXBlOiBDQU0gdG8gc3RvcmUKKyAqCisgKglTdG9yZSBhIG5ldyBtYXNrIGludG8gYSBDQU0KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjX3NldF9jYW1fbWFzayhzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MsIHU4ICogbWFzaywKKwkJCQkgICAgZW51bSB2ZWxvY2l0eV9jYW1fdHlwZSBjYW1fdHlwZSkKK3sKKwlpbnQgaTsKKwkvKiBTZWxlY3QgQ0FNIG1hc2sgKi8KKwlCWVRFX1JFR19CSVRTX1NFVChDQU1DUl9QU19DQU1fTUFTSywgQ0FNQ1JfUFMxIHwgQ0FNQ1JfUFMwLAorCQkJICAmcmVncy0+Q0FNQ1IpOworCisJaWYgKGNhbV90eXBlID09IFZFTE9DSVRZX1ZMQU5fSURfQ0FNKQorCQl3cml0ZWIoQ0FNQUREUl9DQU1FTiB8IENBTUFERFJfVkNBTVNMLCAmcmVncy0+Q0FNQUREUik7CisJZWxzZQorCQl3cml0ZWIoQ0FNQUREUl9DQU1FTiwgJnJlZ3MtPkNBTUFERFIpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl3cml0ZWIoKm1hc2srKywgJihyZWdzLT5NQVJDQU1baV0pKTsKKwl9CisJLyogZGlzYWJsZSBDQU1FTiAqLworCXdyaXRlYigwLCAmcmVncy0+Q0FNQUREUik7CisKKwkvKiBTZWxlY3QgbWFyICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfTUFSLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsCisJCQkgICZyZWdzLT5DQU1DUik7Cit9CisKKy8qKgorICoJbWFjX3NldF9jYW0JLQlzZXQgQ0FNIGRhdGEKKyAqCUByZWdzOiByZWdpc3RlciBibG9jayBvZiB0aGlzIHZlbG9jaXR5CisgKglAaWR4OiBDYW0gaW5kZXgKKyAqCUBhZGRyOiAyIG9yIDYgYnl0ZXMgb2YgQ0FNIGRhdGEKKyAqCUBjYW1fdHlwZTogQ0FNIHRvIGxvYWQKKyAqCisgKglMb2FkIGFuIGFkZHJlc3Mgb3IgdmxhbiB0YWcgaW50byBhIENBTQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNfc2V0X2NhbShzdHJ1Y3QgbWFjX3JlZ3MgKnJlZ3MsIGludCBpZHgsIHU4ICogYWRkciwKKwkJCSAgICAgICBlbnVtIHZlbG9jaXR5X2NhbV90eXBlIGNhbV90eXBlKQoreworCWludCBpOworCisJLyogU2VsZWN0IENBTSBtYXNrICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfQ0FNX0RBVEEsIENBTUNSX1BTMSB8IENBTUNSX1BTMCwKKwkJCSAgJnJlZ3MtPkNBTUNSKTsKKworCWlkeCAmPSAoNjQgLSAxKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJd3JpdGViKENBTUFERFJfQ0FNRU4gfCBDQU1BRERSX1ZDQU1TTCB8IGlkeCwKKwkJICAgICAgICZyZWdzLT5DQU1BRERSKTsKKwllbHNlCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgaWR4LCAmcmVncy0+Q0FNQUREUik7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRldygqKCh1MTYgKikgYWRkciksICZyZWdzLT5NQVJDQU1bMF0pOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQl3cml0ZWIoKmFkZHIrKywgJihyZWdzLT5NQVJDQU1baV0pKTsKKwkJfQorCX0KKwlCWVRFX1JFR19CSVRTX09OKENBTUNSX0NBTVdSLCAmcmVncy0+Q0FNQ1IpOworCisJdWRlbGF5KDEwKTsKKworCXdyaXRlYigwLCAmcmVncy0+Q0FNQUREUik7CisKKwkvKiBTZWxlY3QgbWFyICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfTUFSLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsCisJCQkgICZyZWdzLT5DQU1DUik7Cit9CisKKy8qKgorICoJbWFjX2dldF9jYW0JLQlmZXRjaCBDQU0gZGF0YQorICoJQHJlZ3M6IHJlZ2lzdGVyIGJsb2NrIG9mIHRoaXMgdmVsb2NpdHkKKyAqCUBpZHg6IENhbSBpbmRleAorICoJQGFkZHI6IGJ1ZmZlciB0byBob2xkIHVwIHRvIDYgYnl0ZXMgb2YgQ0FNIGRhdGEKKyAqCUBjYW1fdHlwZTogQ0FNIHRvIGxvYWQKKyAqCisgKglMb2FkIGFuIGFkZHJlc3Mgb3IgdmxhbiB0YWcgZnJvbSBhIENBTSBpbnRvIHRoZSBidWZmZXIgcHJvdmlkZWQgYnkKKyAqCXRoZSBjYWxsZXIuIFZMQU4gdGFncyBhcmUgMiBieXRlcyB0aGUgYWRkcmVzcyBjYW0gZW50cmllcyBhcmUgNi4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjX2dldF9jYW0oc3RydWN0IG1hY19yZWdzICpyZWdzLCBpbnQgaWR4LCB1OCAqIGFkZHIsCisJCQkgICAgICAgZW51bSB2ZWxvY2l0eV9jYW1fdHlwZSBjYW1fdHlwZSkKK3sKKwlpbnQgaTsKKworCS8qIFNlbGVjdCBDQU0gbWFzayAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX0NBTV9EQVRBLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsCisJCQkgICZyZWdzLT5DQU1DUik7CisKKwlpZHggJj0gKDY0IC0gMSk7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgQ0FNQUREUl9WQ0FNU0wgfCBpZHgsCisJCSAgICAgICAmcmVncy0+Q0FNQUREUik7CisJZWxzZQorCQl3cml0ZWIoQ0FNQUREUl9DQU1FTiB8IGlkeCwgJnJlZ3MtPkNBTUFERFIpOworCisJQllURV9SRUdfQklUU19PTihDQU1DUl9DQU1SRCwgJnJlZ3MtPkNBTUNSKTsKKworCXVkZWxheSgxMCk7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCSooKHUxNiAqKSBhZGRyKSA9IHJlYWR3KCYocmVncy0+TUFSQ0FNWzBdKSk7CisJZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrLCBhZGRyKyspCisJCQkqKCh1OCAqKSBhZGRyKSA9IHJlYWRiKCYocmVncy0+TUFSQ0FNW2ldKSk7CisKKwl3cml0ZWIoMCwgJnJlZ3MtPkNBTUFERFIpOworCisJLyogU2VsZWN0IG1hciAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX01BUiwgQ0FNQ1JfUFMxIHwgQ0FNQ1JfUFMwLAorCQkJICAmcmVncy0+Q0FNQ1IpOworfQorCisvKioKKyAqCW1hY193b2xfcmVzZXQJLQlyZXNldCBXT0wgYWZ0ZXIgZXhpdGluZyBsb3cgcG93ZXIKKyAqCUByZWdzOiByZWdpc3RlciBibG9jayBvZiB0aGlzIHZlbG9jaXR5CisgKgorICoJQ2FsbGVkIGFmdGVyIHdlIGRyb3Agb3V0IG9mIHdha2Ugb24gbGFuIG1vZGUgaW4gb3JkZXIgdG8KKyAqCXJlc2V0IHRoZSBXYWtlIG9uIGxhbiBmZWF0dXJlcy4gVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlc3RvcmUKKyAqCXRoZSByZXN0IG9mIHRoZSBsb2dpYyBmcm9tIHRoZSByZXN1bHQgb2Ygc2xlZXAvd2FrZXVwCisgKi8KKworaW5saW5lIHN0YXRpYyB2b2lkIG1hY193b2xfcmVzZXQoc3RydWN0IG1hY19yZWdzICpyZWdzKQoreworCisJLyogVHVybiBvZmYgU1dQVEFHIHJpZ2h0IGFmdGVyIGxlYXZpbmcgcG93ZXIgbW9kZSAqLworCUJZVEVfUkVHX0JJVFNfT0ZGKFNUSUNLSFdfU1dQVEFHLCAmcmVncy0+U1RJQ0tIVyk7CisJLyogY2xlYXIgc3RpY2t5IGJpdHMgKi8KKwlCWVRFX1JFR19CSVRTX09GRigoU1RJQ0tIV19EUzEgfCBTVElDS0hXX0RTMCksICZyZWdzLT5TVElDS0hXKTsKKworCUJZVEVfUkVHX0JJVFNfT0ZGKENISVBHQ1JfRkNHTUlJLCAmcmVncy0+Q0hJUEdDUik7CisJQllURV9SRUdfQklUU19PRkYoQ0hJUEdDUl9GQ01PREUsICZyZWdzLT5DSElQR0NSKTsKKwkvKiBkaXNhYmxlIGZvcmNlIFBNRS1lbmFibGUgKi8KKwl3cml0ZWIoV09MQ0ZHX1BNRU9WUiwgJnJlZ3MtPldPTENGR0Nscik7CisJLyogZGlzYWJsZSBwb3dlci1ldmVudCBjb25maWcgYml0ICovCisJd3JpdGV3KDB4RkZGRiwgJnJlZ3MtPldPTENSQ2xyKTsKKwkvKiBjbGVhciBwb3dlciBzdGF0dXMgKi8KKwl3cml0ZXcoMHhGRkZGLCAmcmVncy0+V09MU1JDbHIpOworfQorCisKKy8qCisgKiBIZWFkZXIgZm9yIFdPTCBkZWZpbml0aW9ucy4gVXNlZCB0byBjb21wdXRlIGhhc2hlcworICovCisKK3R5cGVkZWYgdTggTUNBTV9BRERSW0VUSF9BTEVOXTsKKworc3RydWN0IGFycF9wYWNrZXQgeworCXU4IGRlc3RfbWFjW0VUSF9BTEVOXTsKKwl1OCBzcmNfbWFjW0VUSF9BTEVOXTsKKwl1MTYgdHlwZTsKKwl1MTYgYXJfaHJkOworCXUxNiBhcl9wcm87CisJdTggYXJfaGxuOworCXU4IGFyX3BsbjsKKwl1MTYgYXJfb3A7CisJdTggYXJfc2hhW0VUSF9BTEVOXTsKKwl1OCBhcl9zaXBbNF07CisJdTggYXJfdGhhW0VUSF9BTEVOXTsKKwl1OCBhcl90aXBbNF07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBfbWFnaWNfcGFja2V0IHsKKwl1OCBkZXN0X21hY1s2XTsKKwl1OCBzcmNfbWFjWzZdOworCXUxNiB0eXBlOworCXU4IE1BQ1sxNl1bNl07CisJdTggcGFzc3dvcmRbNl07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKglTdG9yZSBmb3IgY2hpcCBjb250ZXh0IHdoZW4gc2F2aW5nIGFuZCByZXN0b3Jpbmcgc3RhdHVzLiBOb3QKKyAqCWFsbCBmaWVsZHMgYXJlIHNhdmVkL3Jlc3RvcmVkIGN1cnJlbnRseS4KKyAqLworCitzdHJ1Y3QgdmVsb2NpdHlfY29udGV4dCB7CisJdTggbWFjX3JlZ1syNTZdOworCU1DQU1fQUREUiBjYW1fYWRkcltNQ0FNX1NJWkVdOworCXUxNiB2Y2FtW1ZDQU1fU0laRV07CisJdTMyIGNhbW1hc2tbMl07CisJdTMyIHBhdGNyY1syXTsKKwl1MzIgcGF0dGVybls4XTsKK307CisKKworLyoKKyAqCU1JSSByZWdpc3RlcnMuCisgKi8KKworCisvKgorICoJUmVnaXN0ZXJzIGluIHRoZSBNSUkgKG9mZnNldCB1bml0IGlzIFdPUkQpCisgKi8KKworI2RlZmluZSBNSUlfUkVHX0JNQ1IgICAgICAgIDB4MDAJLy8gcGh5c2ljYWwgYWRkcmVzcworI2RlZmluZSBNSUlfUkVHX0JNU1IgICAgICAgIDB4MDEJLy8KKyNkZWZpbmUgTUlJX1JFR19QSFlJRDEgICAgICAweDAyCS8vIE9VSQorI2RlZmluZSBNSUlfUkVHX1BIWUlEMiAgICAgIDB4MDMJLy8gT1VJICsgTW9kdWxlIElEICsgUkVWIElECisjZGVmaW5lIE1JSV9SRUdfQU5BUiAgICAgICAgMHgwNAkvLworI2RlZmluZSBNSUlfUkVHX0FOTFBBUiAgICAgIDB4MDUJLy8KKyNkZWZpbmUgTUlJX1JFR19HMTAwMENSICAgICAweDA5CS8vCisjZGVmaW5lIE1JSV9SRUdfRzEwMDBTUiAgICAgMHgwQQkvLworI2RlZmluZSBNSUlfUkVHX01PRENGRyAgICAgIDB4MTAJLy8KKyNkZWZpbmUgTUlJX1JFR19UQ1NSICAgICAgICAweDE2CS8vCisjZGVmaW5lIE1JSV9SRUdfUExFRCAgICAgICAgMHgxQgkvLworLy8gTlMsIE1ZU09OIG9ubHkKKyNkZWZpbmUgTUlJX1JFR19QQ1IgICAgICAgICAweDE3CS8vCisvLyBFU0kgb25seQorI2RlZmluZSBNSUlfUkVHX1BDU1IgICAgICAgIDB4MTcJLy8KKyNkZWZpbmUgTUlJX1JFR19BVVhDUiAgICAgICAweDFDCS8vCisKKy8vIE1hcnZlbGwgODhFMTAwMC84OEUxMDAwUworI2RlZmluZSBNSUlfUkVHX1BTQ1IgICAgICAgIDB4MTAJLy8gUEhZIHNwZWNpZmljIGNvbnRyb2wgcmVnaXN0ZXIKKworLy8KKy8vIEJpdHMgaW4gdGhlIEJNQ1IgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIEJNQ1JfUkVTRVQgICAgICAgICAgMHg4MDAwCS8vCisjZGVmaW5lIEJNQ1JfTEJLICAgICAgICAgICAgMHg0MDAwCS8vCisjZGVmaW5lIEJNQ1JfU1BFRUQxMDAgICAgICAgMHgyMDAwCS8vCisjZGVmaW5lIEJNQ1JfQVVUTyAgICAgICAgICAgMHgxMDAwCS8vCisjZGVmaW5lIEJNQ1JfUEQgICAgICAgICAgICAgMHgwODAwCS8vCisjZGVmaW5lIEJNQ1JfSVNPICAgICAgICAgICAgMHgwNDAwCS8vCisjZGVmaW5lIEJNQ1JfUkVBVVRPICAgICAgICAgMHgwMjAwCS8vCisjZGVmaW5lIEJNQ1JfRkRYICAgICAgICAgICAgMHgwMTAwCS8vCisjZGVmaW5lIEJNQ1JfU1BFRUQxRyAgICAgICAgMHgwMDQwCS8vCisvLworLy8gQml0cyBpbiB0aGUgQk1TUiByZWdpc3RlcgorLy8KKyNkZWZpbmUgQk1TUl9BVVRPQ00gICAgICAgICAweDAwMjAJLy8KKyNkZWZpbmUgQk1TUl9MTksgICAgICAgICAgICAweDAwMDQJLy8KKworLy8KKy8vIEJpdHMgaW4gdGhlIEFOQVIgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIEFOQVJfQVNNRElSICAgICAgICAgMHgwODAwCS8vIEFzeW1tZXRyaWMgUEFVU0Ugc3VwcG9ydAorI2RlZmluZSBBTkFSX1BBVVNFICAgICAgICAgIDB4MDQwMAkvLyBTeW1tZXRyaWMgUEFVU0UgU3VwcG9ydAorI2RlZmluZSBBTkFSX1Q0ICAgICAgICAgICAgIDB4MDIwMAkvLworI2RlZmluZSBBTkFSX1RYRkQgICAgICAgICAgIDB4MDEwMAkvLworI2RlZmluZSBBTkFSX1RYICAgICAgICAgICAgIDB4MDA4MAkvLworI2RlZmluZSBBTkFSXzEwRkQgICAgICAgICAgIDB4MDA0MAkvLworI2RlZmluZSBBTkFSXzEwICAgICAgICAgICAgIDB4MDAyMAkvLworLy8KKy8vIEJpdHMgaW4gdGhlIEFOTFBBUiByZWdpc3RlcgorLy8KKyNkZWZpbmUgQU5MUEFSX0FTTURJUiAgICAgICAweDA4MDAJLy8gQXN5bW1ldHJpYyBQQVVTRSBzdXBwb3J0CisjZGVmaW5lIEFOTFBBUl9QQVVTRSAgICAgICAgMHgwNDAwCS8vIFN5bW1ldHJpYyBQQVVTRSBTdXBwb3J0CisjZGVmaW5lIEFOTFBBUl9UNCAgICAgICAgICAgMHgwMjAwCS8vCisjZGVmaW5lIEFOTFBBUl9UWEZEICAgICAgICAgMHgwMTAwCS8vCisjZGVmaW5lIEFOTFBBUl9UWCAgICAgICAgICAgMHgwMDgwCS8vCisjZGVmaW5lIEFOTFBBUl8xMEZEICAgICAgICAgMHgwMDQwCS8vCisjZGVmaW5lIEFOTFBBUl8xMCAgICAgICAgICAgMHgwMDIwCS8vCisKKy8vCisvLyBCaXRzIGluIHRoZSBHMTAwMENSIHJlZ2lzdGVyCisvLworI2RlZmluZSBHMTAwMENSXzEwMDBGRCAgICAgIDB4MDIwMAkvLyBQSFkgaXMgMTAwMC1UIEZ1bGwtZHVwbGV4IGNhcGFibGUKKyNkZWZpbmUgRzEwMDBDUl8xMDAwICAgICAgICAweDAxMDAJLy8gUEhZIGlzIDEwMDAtVCBIYWxmLWR1cGxleCBjYXBhYmxlCisKKy8vCisvLyBCaXRzIGluIHRoZSBHMTAwMFNSIHJlZ2lzdGVyCisvLworI2RlZmluZSBHMTAwMFNSXzEwMDBGRCAgICAgIDB4MDgwMAkvLyBMUCBQSFkgaXMgMTAwMC1UIEZ1bGwtZHVwbGV4IGNhcGFibGUKKyNkZWZpbmUgRzEwMDBTUl8xMDAwICAgICAgICAweDA0MDAJLy8gTFAgUEhZIGlzIDEwMDAtVCBIYWxmLWR1cGxleCBjYXBhYmxlCisKKyNkZWZpbmUgVENTUl9FQ0hPRElTICAgICAgICAweDIwMDAJLy8KKyNkZWZpbmUgQVVYQ1JfTURQUFMgICAgICAgICAweDAwMDQJLy8KKworLy8gQml0cyBpbiB0aGUgUExFRCByZWdpc3RlcgorI2RlZmluZSBQTEVEX0xBTEJFCQkJMHgwMDA0CS8vCisKKy8vIE1hcnZlbGwgODhFMTAwMC84OEUxMDAwUyBCaXRzIGluIHRoZSBQSFkgc3BlY2lmaWMgY29udHJvbCByZWdpc3RlciAoMTBoKQorI2RlZmluZSBQU0NSX0FDUlNUWCAgICAgICAgIDB4MDgwMAkvLyBBc3NlcnQgQ1JTIG9uIFRyYW5zbWl0CisKKyNkZWZpbmUgUEhZSURfQ0lDQURBX0NTODIwMSAweDAwMEZDNDEwVUwKKyNkZWZpbmUgUEhZSURfVlQzMjE2XzMyQklUICAweDAwMEZDNjEwVUwKKyNkZWZpbmUgUEhZSURfVlQzMjE2XzY0QklUICAweDAwMEZDNjAwVUwKKyNkZWZpbmUgUEhZSURfTUFSVkVMTF8xMDAwICAweDAxNDEwQzUwVUwKKyNkZWZpbmUgUEhZSURfTUFSVkVMTF8xMDAwUyAweDAxNDEwQzQwVUwKKworI2RlZmluZSBQSFlJRF9SRVZfSURfTUFTSyAgIDB4MDAwMDAwMEZVTAorCisjZGVmaW5lIFBIWUlEX0dFVF9QSFlfUkVWX0lEKGkpICAgICAoKGkpICYgUEhZSURfUkVWX0lEX01BU0spCisjZGVmaW5lIFBIWUlEX0dFVF9QSFlfSUQoaSkgICAgICAgICAoKGkpICYgflBIWUlEX1JFVl9JRF9NQVNLKQorCisjZGVmaW5lIE1JSV9SRUdfQklUU19PTih4LGkscCkgZG8ge1wKKyAgICB1MTYgdztcCisgICAgdmVsb2NpdHlfbWlpX3JlYWQoKHApLChpKSwmKHcpKTtcCisgICAgKHcpfD0oeCk7XAorICAgIHZlbG9jaXR5X21paV93cml0ZSgocCksKGkpLCh3KSk7XAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNSUlfUkVHX0JJVFNfT0ZGKHgsaSxwKSBkbyB7XAorICAgIHUxNiB3O1wKKyAgICB2ZWxvY2l0eV9taWlfcmVhZCgocCksKGkpLCYodykpO1wKKyAgICAodykmPSh+KHgpKTtcCisgICAgdmVsb2NpdHlfbWlpX3dyaXRlKChwKSwoaSksKHcpKTtcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1JSV9SRUdfQklUU19JU19PTih4LGkscCkgKHtcCisgICAgdTE2IHc7XAorICAgIHZlbG9jaXR5X21paV9yZWFkKChwKSwoaSksJih3KSk7XAorICAgICgoaW50KSAoKHcpICYgKHgpKSk7fSkKKworI2RlZmluZSBNSUlfR0VUX1BIWV9JRChwKSAoe1wKKyAgICB1MzIgaWQ7ICBcCisgICAgdTE2IGlkMjsgXAorICAgIHUxNiBpZDE7IFwKKyAgICB2ZWxvY2l0eV9taWlfcmVhZCgocCksTUlJX1JFR19QSFlJRDIsICZpZDIpO1wKKyAgICB2ZWxvY2l0eV9taWlfcmVhZCgocCksTUlJX1JFR19QSFlJRDEsICZpZDEpO1wKKyAgICBpZCA9ICggKCAodTMyKWlkMiApIDw8IDE2ICkgfCBpZDE7CQlcCisgICAgKGlkKTt9KQorCisjaWZkZWYgTElOVVgKKy8qCisgKiBJbmxpbmUgZGVidWcgcm91dGluZQorICovCisKKworZW51bSB2ZWxvY2l0eV9tc2dfbGV2ZWwgeworCU1TR19MRVZFTF9FUlIgPSAwLAkvL0Vycm9ycyB0aGF0IHdpbGwgY2F1c2UgYWJub3JtYWwgb3BlcmF0aW9uLgorCU1TR19MRVZFTF9OT1RJQ0UgPSAxLAkvL1NvbWUgZXJyb3JzIG5lZWQgdXNlcnMgdG8gYmUgbm90aWZpZWQuCisJTVNHX0xFVkVMX0lORk8gPSAyLAkvL05vcm1hbCBtZXNzYWdlLgorCU1TR19MRVZFTF9WRVJCT1NFID0gMywJLy9XaWxsIHJlcG9ydCBhbGwgdHJpdmFsIGVycm9ycy4KKwlNU0dfTEVWRUxfREVCVUcgPSA0CS8vT25seSBmb3IgZGVidWcgcHVycG9zZS4KK307CisKKyNpZmRlZiBWRUxPQ0lUWV9ERUJVRworI2RlZmluZSBBU1NFUlQoeCkgeyBcCisJaWYgKCEoeCkpIHsgXAorCQlwcmludGsoS0VSTl9FUlIgImFzc2VydGlvbiAlcyBmYWlsZWQ6IGZpbGUgJXMgbGluZSAlZFxuIiwgI3gsXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7XAorCQlCVUcoKTsgXAorCX1cCit9CisjZGVmaW5lIFZFTE9DSVRZX0RCRyhwLGFyZ3MuLi4pIHByaW50ayhwLCAjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBBU1NFUlQoeCkKKyNkZWZpbmUgVkVMT0NJVFlfREJHKHgpCisjZW5kaWYKKworI2RlZmluZSBWRUxPQ0lUWV9QUlQobCwgcCwgYXJncy4uLikgZG8ge2lmIChsPD1tc2dsZXZlbCkgcHJpbnRmKCBwICwjI2FyZ3MpO30gd2hpbGUgKDApCisKKyNkZWZpbmUgVkVMT0NJVFlfUFJUX0NBTU1BU0socCx0KSB7XAorCWludCBpO1wKKwlpZiAoKHQpPT1WRUxPQ0lUWV9NVUxUSUNBU1RfQ0FNKSB7XAorICAgICAgICAJZm9yIChpPTA7aTwoTUNBTV9TSVpFLzgpO2krKylcCisJCQlwcmludGsoIiUwMlgiLChwKS0+bUNBTW1hc2tbaV0pO1wKKwl9XAorCWVsc2Uge1wKKwkJZm9yIChpPTA7aTwoVkNBTV9TSVpFLzgpO2krKylcCisJCQlwcmludGsoIiUwMlgiLChwKS0+dkNBTW1hc2tbaV0pO1wKKwl9XAorCXByaW50aygiXG4iKTtcCit9CisKKyNlbmRpZgorCisjZGVmaW5lICAgICBWRUxPQ0lUWV9XT0xfTUFHSUMgICAgICAgICAgICAgMHgwMDAwMDAwMFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9XT0xfUEhZICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9XT0xfQVJQICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9XT0xfVUNBU1QgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9XT0xfQkNBU1QgICAgICAgICAgICAgMHgwMDAwMDAxMFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9XT0xfTUNBU1QgICAgICAgICAgICAgMHgwMDAwMDAyMFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9XT0xfTUFHSUNfU0VDICAgICAgICAgMHgwMDAwMDA0MFVMCisKKy8qCisgKglGbGFncyBmb3Igb3B0aW9ucworICovCisKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1RBR0dJTkcgICAgICAgICAweDAwMDAwMDAxVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1RYX0NTVU0gICAgICAgICAweDAwMDAwMDAyVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1JYX0NTVU0gICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX0lQX0FMSUdOICAgICAgICAweDAwMDAwMDA4VUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1ZBTF9QS1RfTEVOICAgICAweDAwMDAwMDEwVUwKKworI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfRkxPV19DVFJMICAgICAgIDB4MDEwMDAwMDBVTAorCisvKgorICoJRmxhZ3MgZm9yIGRyaXZlciBzdGF0dXMKKyAqLworCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19PUEVORUQgICAgICAgICAgMHgwMDAxMDAwMFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19WTU5TX0NPTk5FQ1RFRCAgMHgwMDAyMDAwMFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19WTU5TX0NPTU1JVFRFRCAgMHgwMDA0MDAwMFVMCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRCAgICAgMHgwMDA4MDAwMFVMCisKKy8qCisgKglGbGFncyBmb3IgTUlJIHN0YXR1cworICovCisKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0xJTktfRkFJTCAgICAgICAgICAgICAweDAwMDAwMDAxVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1NQRUVEXzEwICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1NQRUVEXzEwMCAgICAgICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1NQRUVEXzEwMDAgICAgICAgICAgICAweDAwMDAwMDA4VUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0RVUExFWF9GVUxMICAgICAgICAgICAweDAwMDAwMDEwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFICAgICAgICAweDAwMDAwMDIwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZPUkNFRF9CWV9FRVBST00gICAgICAweDAwMDAwMDQwVUwKKworLyoKKyAqCUZvciB2ZWxvY2l0eV9zZXRfbWVkaWFfZHVwbGV4CisgKi8KKworI2RlZmluZSAgICAgVkVMT0NJVFlfTElOS19DSEFOR0UgICAgICAgICAgIDB4MDAwMDAwMDFVTAorCitlbnVtIHNwZWVkX29wdCB7CisJU1BEX0RQWF9BVVRPID0gMCwKKwlTUERfRFBYXzEwMF9IQUxGID0gMSwKKwlTUERfRFBYXzEwMF9GVUxMID0gMiwKKwlTUERfRFBYXzEwX0hBTEYgPSAzLAorCVNQRF9EUFhfMTBfRlVMTCA9IDQKK307CisKK2VudW0gdmVsb2NpdHlfaW5pdF90eXBlIHsKKwlWRUxPQ0lUWV9JTklUX0NPTEQgPSAwLAorCVZFTE9DSVRZX0lOSVRfUkVTRVQsCisJVkVMT0NJVFlfSU5JVF9XT0wKK307CisKK2VudW0gdmVsb2NpdHlfZmxvd19jbnRsX3R5cGUgeworCUZMT1dfQ05UTF9ERUZBVUxUID0gMSwKKwlGTE9XX0NOVExfVFgsCisJRkxPV19DTlRMX1JYLAorCUZMT1dfQ05UTF9UWF9SWCwKKwlGTE9XX0NOVExfRElTQUJMRSwKK307CisKK3N0cnVjdCB2ZWxvY2l0eV9vcHQgeworCWludCBudW1yeDsJCS8qIE51bWJlciBvZiBSWCBkZXNjcmlwdG9ycyAqLworCWludCBudW10eDsJCS8qIE51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyAqLworCWVudW0gc3BlZWRfb3B0IHNwZF9kcHg7CS8qIE1lZGlhIGxpbmsgbW9kZSAqLworCWludCB2aWQ7CQkvKiB2bGFuIGlkICovCisJaW50IERNQV9sZW5ndGg7CQkvKiBETUEgbGVuZ3RoICovCisJaW50IHJ4X3RocmVzaDsJCS8qIFJYX1RIUkVTSCAqLworCWludCBmbG93X2NudGw7CisJaW50IHdvbF9vcHRzOwkJLyogV2FrZSBvbiBsYW4gb3B0aW9ucyAqLworCWludCB0ZF9pbnRfY291bnQ7CisJaW50IGludF93b3JrczsKKwlpbnQgcnhfYmFuZHdpZHRoX2hpOworCWludCByeF9iYW5kd2lkdGhfbG87CisJaW50IHJ4X2JhbmR3aWR0aF9lbjsKKwl1MzIgZmxhZ3M7Cit9OworCisjZGVmaW5lIFJYX0RFU0NfTUlOICAgICA0CisjZGVmaW5lIFJYX0RFU0NfTUFYICAgICAyNTUKKyNkZWZpbmUgUlhfREVTQ19ERUYgICAgIFJYX0RFU0NfTUlOCisKKyNkZWZpbmUgVFhfREVTQ19NSU4gICAgIDEKKyNkZWZpbmUgVFhfREVTQ19NQVggICAgIDI1NgorI2RlZmluZSBUWF9ERVNDX0RFRiAgICAgVFhfREVTQ19NSU4KKworc3RhdGljIHN0cnVjdCB2ZWxvY2l0eV9pbmZvIHsKKy8vICAgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHBjaV9kZXZpY2UgKnBkZXY7CisvLyAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisvLyAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisjaWZkZWYgQ09ORklHX1BNCisJdTMyIHBjaV9zdGF0ZVsxNl07CisjZW5kaWYKKworLy8gICAgICBkbWFfYWRkcl90IHJkX3Bvb2xfZG1hOworLy8gICAgICBkbWFfYWRkcl90IHRkX3Bvb2xfZG1hW1RYX1FVRVVFX05PXTsKKworLy8gICAgICBkbWFfYWRkcl90IHR4X2J1ZnNfZG1hOworCXU4ICp0eF9idWZzOworCisJdTggaXBfYWRkcls0XTsKKwllbnVtIGNoaXBfdHlwZSBjaGlwX2lkOworCisJc3RydWN0IG1hY19yZWdzICptYWNfcmVnczsKKwl1bnNpZ25lZCBsb25nIG1lbWFkZHI7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJdTMyIGlvX3NpemU7CisKKwl1OCByZXZfaWQ7CisKKyNkZWZpbmUgQVZBSUxfVEQocCxxKSAgICgocCktPm9wdGlvbnMubnVtdHgtKChwKS0+dGRfdXNlZFsocSldKSkKKworCWludCBudW1fdHhxOworCisJdm9sYXRpbGUgaW50IHRkX3VzZWRbVFhfUVVFVUVfTk9dOworCWludCB0ZF9jdXJyOworCWludCB0ZF90YWlsW1RYX1FVRVVFX05PXTsKKwl1bnNpZ25lZCBjaGFyICpUeERlc2NBcnJheXM7CS8qIEluZGV4IG9mIFR4IERlc2NyaXB0b3IgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAqUnhEZXNjQXJyYXlzOwkvKiBJbmRleCBvZiBSeCBEZXNjcmlwdG9yIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZmZzOworCXVuc2lnbmVkIGNoYXIgKnJ4X2J1ZmZzOworCisJdW5zaWduZWQgY2hhciAqdHhiOworCXVuc2lnbmVkIGNoYXIgKnJ4YjsKKwlzdHJ1Y3QgdHhfZGVzYyAqdGRfcmluZ3M7CisJc3RydWN0IHZlbG9jaXR5X3RkX2luZm8gKnRkX2luZm9zW1RYX1FVRVVFX05PXTsKKworCWludCByZF9jdXJyOworCWludCByZF9kaXJ0eTsKKwl1MzIgcmRfZmlsbGVkOworCXN0cnVjdCByeF9kZXNjICpyZF9yaW5nOworCXN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvICpyZF9pbmZvOwkvKiBJdCdzIGFuIGFycmF5ICovCisKKyNkZWZpbmUgR0VUX1JEX0JZX0lEWCh2cHRyLCBpZHgpICAgKHZwdHItPnJkX3JpbmdbaWR4XSkKKwl1MzIgbWliX2NvdW50ZXJbTUFYX0hXX01JQl9DT1VOVEVSXTsKKwlzdHJ1Y3QgdmVsb2NpdHlfb3B0IG9wdGlvbnM7CisKKwl1MzIgaW50X21hc2s7CisKKwl1MzIgZmxhZ3M7CisKKwlpbnQgcnhfYnVmX3N6OworCXUzMiBtaWlfc3RhdHVzOworCXUzMiBwaHlfaWQ7CisJaW50IG11bHRpY2FzdF9saW1pdDsKKworCXU4IHZDQU1tYXNrWyhWQ0FNX1NJWkUgLyA4KV07CisJdTggbUNBTW1hc2tbKE1DQU1fU0laRSAvIDgpXTsKKworLy8gICAgICBzcGlubG9ja190IGxvY2s7CisKKwlpbnQgd29sX29wdHM7CisJdTggd29sX3Bhc3N3ZFs2XTsKKworCXN0cnVjdCB2ZWxvY2l0eV9jb250ZXh0IGNvbnRleHQ7CisKKwl1MzIgdGlja3M7CisJdTMyIHJ4X2J5dGVzOworCit9IHZwdHg7CisKK3N0YXRpYyBzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cjsKKworI2lmZGVmIExJTlVYCisvKioKKyAqCXZlbG9jaXR5X2dldF9pcAkJLQlmaW5kIGFuIElQIGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UKKyAqCUB2cHRyOiBWZWxvY2l0eSB0byBxdWVyeQorICoKKyAqCURpZyBvdXQgYW4gSVAgYWRkcmVzcyBmb3IgdGhpcyBpbnRlcmZhY2Ugc28gdGhhdCB3ZSBjYW4KKyAqCWNvbmZpZ3VyZSB3YWtldXAgd2l0aCBXT0wgZm9yIEFSUC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIElQCisgKglhZGRyZXNzZXMgb24gdGhpcyBjaGFpbiB0aGVuIHdlIHVzZSB0aGUgZmlyc3QgLSBtdWx0aS1JUCBXT0wgaXMgbm90CisgKglzdXBwb3J0ZWQuCisgKgorICoJQ0hFQ0sgTUU6IGxvY2tpbmcKKyAqLworCitpbmxpbmUgc3RhdGljIGludCB2ZWxvY2l0eV9nZXRfaXAoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gKHN0cnVjdCBpbl9kZXZpY2UgKikgdnB0ci0+ZGV2LT5pcF9wdHI7CisJc3RydWN0IGluX2lmYWRkciAqaWZhOworCisJaWYgKGluX2RldiAhPSBOVUxMKSB7CisJCWlmYSA9IChzdHJ1Y3QgaW5faWZhZGRyICopIGluX2Rldi0+aWZhX2xpc3Q7CisJCWlmIChpZmEgIT0gTlVMTCkgeworCQkJbWVtY3B5KHZwdHItPmlwX2FkZHIsICZpZmEtPmlmYV9hZGRyZXNzLCA0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqCXZlbG9jaXR5X3VwZGF0ZV9od19taWJzCS0JZmV0Y2ggTUlCIGNvdW50ZXJzIGZyb20gY2hpcAorICoJQHZwdHI6IHZlbG9jaXR5IHRvIHVwZGF0ZQorICoKKyAqCVRoZSB2ZWxvY2l0eSBoYXJkd2FyZSBrZWVwcyBjZXJ0YWluIGNvdW50ZXJzIGluIHRoZSBoYXJkd2FyZQorICogCXNpZGUuIFdlIG5lZWQgdG8gcmVhZCB0aGVzZSB3aGVuIHRoZSB1c2VyIGFza3MgZm9yIHN0YXRpc3RpY3MKKyAqCW9yIHdoZW4gdGhleSBvdmVyZmxvdyAoY2F1c2luZyBhbiBpbnRlcnJ1cHQpLiBUaGUgcmVhZCBvZiB0aGUKKyAqCXN0YXRpc3RpYyBjbGVhcnMgaXQsIHNvIHdlIGtlZXAgcnVubmluZyBtYXN0ZXIgY291bnRlcnMgaW4gdXNlcgorICoJc3BhY2UuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHZlbG9jaXR5X3VwZGF0ZV9od19taWJzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXUzMiB0bXA7CisJaW50IGk7CisJQllURV9SRUdfQklUU19PTihNSUJDUl9NSUJGTFNILCAmKHZwdHItPm1hY19yZWdzLT5NSUJDUikpOworCisJd2hpbGUgKEJZVEVfUkVHX0JJVFNfSVNfT04KKwkgICAgICAgKE1JQkNSX01JQkZMU0gsICYodnB0ci0+bWFjX3JlZ3MtPk1JQkNSKSkpOworCisJQllURV9SRUdfQklUU19PTihNSUJDUl9NUFRSSU5JLCAmKHZwdHItPm1hY19yZWdzLT5NSUJDUikpOworCWZvciAoaSA9IDA7IGkgPCBIV19NSUJfU0laRTsgaSsrKSB7CisJCXRtcCA9IHJlYWRsKCYodnB0ci0+bWFjX3JlZ3MtPk1JQkRhdGEpKSAmIDB4MDBGRkZGRkZVTDsKKwkJdnB0ci0+bWliX2NvdW50ZXJbaV0gKz0gdG1wOworCX0KK30KKyNlbmRpZgorLyoqCisgKglpbml0X2Zsb3dfY29udHJvbF9yZWdpc3RlciAJLQlzZXQgdXAgZmxvdyBjb250cm9sCisgKglAdnB0cjogdmVsb2NpdHkgdG8gY29uZmlndXJlCisgKgorICoJQ29uZmlndXJlIHRoZSBmbG93IGNvbnRyb2wgcmVnaXN0ZXJzIGZvciB0aGlzIHZlbG9jaXR5IGRldmljZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9mbG93X2NvbnRyb2xfcmVnaXN0ZXIoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG1hY19yZWdzICpyZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwkvKiBTZXQge1hISVRIMSwgWEhJVEgwLCBYTFRIMSwgWExUSDB9IGluIEZsb3dDUjEgdG8gezEsIDAsIDEsIDF9CisJICAgZGVwZW5kIG9uIFJEPTY0LCBhbmQgVHVybiBvbiBYTk9FTiBpbiBGbG93Q1IxICovCisJd3JpdGVsKChDUjBfWE9ORU4gfCBDUjBfWEhJVEgxIHwgQ1IwX1hMVEgxIHwgQ1IwX1hMVEgwKSwKKwkgICAgICAgJnJlZ3MtPkNSMFNldCk7CisJd3JpdGVsKChDUjBfRkRYVEZDRU4gfCBDUjBfRkRYUkZDRU4gfCBDUjBfSERYRkNFTiB8IENSMF9YSElUSDApLAorCSAgICAgICAmcmVncy0+Q1IwQ2xyKTsKKworCS8qIFNldCBUeFBhdXNlVGltZXIgdG8gMHhGRkZGICovCisJd3JpdGV3KDB4RkZGRiwgJnJlZ3MtPnR4X3BhdXNlX3RpbWVyKTsKKworCS8qIEluaXRpYWxpemUgUkJSRFUgdG8gUnggYnVmZmVyIGNvdW50LiAqLworCXdyaXRldyh2cHRyLT5vcHRpb25zLm51bXJ4LCAmcmVncy0+UkJSRFUpOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdmlydGlvLW5ldC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdmlydGlvLW5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZmNjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC92aXJ0aW8tbmV0LmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qIHZpcnRpby1uZXQuYyAtIGV0aGVyYm9vdCBkcml2ZXIgZm9yIHZpcnRpbyBuZXR3b3JrIGludGVyZmFjZQorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwOCBCdWxsIFMuQS5TLgorICoKKyAqICBBdXRob3I6IExhdXJlbnQgVml2aWVyIDxMYXVyZW50LlZpdmllckBidWxsLm5ldD4KKyAqCisgKiBzb21lIHBhcnRzIGZyb20gTGludXggVmlydGlvIFBDSSBkcml2ZXIKKyAqCisgKiAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKiAgQXV0aG9yczogQW50aG9ueSBMaWd1b3JpICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiAgc29tZSBwYXJ0cyBmcm9tIExpbnV4IFZpcnRpbyBSaW5nCisgKgorICogIENvcHlyaWdodCBSdXN0eSBSdXNzZWxsIElCTSBDb3Jwb3JhdGlvbiAyMDA3CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICoKKyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAiZ3B4ZS92aXJ0aW8tcmluZy5oIgorI2luY2x1ZGUgImdweGUvdmlydGlvLXBjaS5oIgorI2luY2x1ZGUgInZpcnRpby1uZXQuaCIKKworI2RlZmluZSBCVUcoKSBkbyB7IFwKKyAgIHByaW50ZigiQlVHOiBmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBcCisgICB3aGlsZSgxKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgQlVHX09OKGNvbmRpdGlvbikgZG8geyBpZiAoY29uZGl0aW9uKSBCVUcoKTsgfSB3aGlsZSAoMCkKKworLyogRXRoZXJuZXQgaGVhZGVyICovCisKK3N0cnVjdCBldGhfaGRyIHsKKyAgIHVuc2lnbmVkIGNoYXIgZHN0X2FkZHJbRVRIX0FMRU5dOworICAgdW5zaWduZWQgY2hhciBzcmNfYWRkcltFVEhfQUxFTl07CisgICB1bnNpZ25lZCBzaG9ydCB0eXBlOworfTsKKworc3RydWN0IGV0aF9mcmFtZSB7CisgICBzdHJ1Y3QgZXRoX2hkciBoZHI7CisgICB1bnNpZ25lZCBjaGFyIGRhdGFbRVRIX0ZSQU1FX0xFTl07Cit9OworCisvKiBUWDogdmlydGlvIGhlYWRlciBhbmQgZXRoIGJ1ZmZlciAqLworCitzdGF0aWMgc3RydWN0IHZpcnRpb19uZXRfaGRyIHR4X3ZpcnRpb19oZHI7CitzdGF0aWMgc3RydWN0IGV0aF9mcmFtZSB0eF9ldGhfZnJhbWU7CisKKy8qIFJYOiB2aXJ0aW8gaGVhZGVycyBhbmQgYnVmZmVycyAqLworCisjZGVmaW5lIFJYX0JVRl9OQiAgNgorc3RhdGljIHN0cnVjdCB2aXJ0aW9fbmV0X2hkciByeF9oZHJbUlhfQlVGX05CXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4X2J1ZmZlcltSWF9CVUZfTkJdW0VUSF9GUkFNRV9MRU5dOworCisvKiB2aXJ0aW8gcXVldWVzIGFuZCB2cmluZ3MgKi8KKworZW51bSB7CisgICBSWF9JTkRFWCA9IDAsCisgICBUWF9JTkRFWCwKKyAgIFFVRVVFX05CCit9OworCitzdGF0aWMgc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSB2aXJ0cXVldWVbUVVFVUVfTkJdOworCisvKgorICogdmlydG5ldF9kaXNhYmxlCisgKgorICogVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisgKgorICovCisKK3N0YXRpYyB2b2lkIHZpcnRuZXRfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCit7CisgICBpbnQgaTsKKworICAgZm9yIChpID0gMDsgaSA8IFFVRVVFX05COyBpKyspIHsKKyAgICAgICAgICAgdnJpbmdfZGlzYWJsZV9jYigmdmlydHF1ZXVlW2ldKTsKKyAgICAgICAgICAgdnBfZGVsX3ZxKG5pYy0+aW9hZGRyLCBpKTsKKyAgIH0KKyAgIHZwX3Jlc2V0KG5pYy0+aW9hZGRyKTsKK30KKworLyoKKyAqIHZpcnRuZXRfcG9sbAorICoKKyAqIFdhaXQgZm9yIGEgZnJhbWUKKyAqCisgKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHBhY2tldCByZWFkeSB0byByZWFkCisgKgorICogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4KKyAqIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhCisgKgorICovCitzdGF0aWMgaW50IHZpcnRuZXRfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKyAgIHVuc2lnbmVkIGludCBsZW47CisgICB1MTYgdG9rZW47CisgICBzdHJ1Y3QgdmlydGlvX25ldF9oZHIgKmhkcjsKKyAgIHN0cnVjdCB2cmluZ19saXN0IGxpc3RbMl07CisKKyAgIGlmICghdnJpbmdfbW9yZV91c2VkKCZ2aXJ0cXVldWVbUlhfSU5ERVhdKSkKKyAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgIGlmICghcmV0cmlldmUpCisgICAgICAgICAgIHJldHVybiAxOworCisgICB0b2tlbiA9IHZyaW5nX2dldF9idWYoJnZpcnRxdWV1ZVtSWF9JTkRFWF0sICZsZW4pOworCisgICBCVUdfT04obGVuID4gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcikgKyBFVEhfRlJBTUVfTEVOKTsKKworICAgaGRyID0gJnJ4X2hkclt0b2tlbl07ICAgLyogRklYTUU6IGNoZWNrIGZsYWdzICovCisgICBsZW4gLT0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcik7CisKKyAgIG5pYy0+cGFja2V0bGVuID0gbGVuOworICAgbWVtY3B5KG5pYy0+cGFja2V0LCAoY2hhciAqKXJ4X2J1ZmZlclt0b2tlbl0sIG5pYy0+cGFja2V0bGVuKTsKKworICAgLyogYWRkIGJ1ZmZlciB0byBkZXNjICovCisKKyAgIGxpc3RbMF0uYWRkciA9IChjaGFyKikmcnhfaGRyW3Rva2VuXTsKKyAgIGxpc3RbMF0ubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcik7CisgICBsaXN0WzFdLmFkZHIgPSAoY2hhciopJnJ4X2J1ZmZlclt0b2tlbl07CisgICBsaXN0WzFdLmxlbmd0aCA9IEVUSF9GUkFNRV9MRU47CisKKyAgIHZyaW5nX2FkZF9idWYoJnZpcnRxdWV1ZVtSWF9JTkRFWF0sIGxpc3QsIDAsIDIsIHRva2VuLCAwKTsKKyAgIHZyaW5nX2tpY2sobmljLT5pb2FkZHIsICZ2aXJ0cXVldWVbUlhfSU5ERVhdLCAxKTsKKworICAgcmV0dXJuIDE7Cit9CisKKy8qCisgKgorICogdmlydG5ldF90cmFuc21pdAorICoKKyAqIFRyYW5zbWl0IGEgZnJhbWUKKyAqCisgKi8KKworc3RhdGljIHZvaWQgdmlydG5ldF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmRlc3RhZGRyLAorICAgICAgICB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqZGF0YSkKK3sKKyAgIHN0cnVjdCB2cmluZ19saXN0IGxpc3RbMl07CisKKyAgIC8qCisgICAgKiBmcm9tIGh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy93aWtpL2Rldi9kZXZtYW51YWwgOgorICAgICogICAgICJZb3UgZG8gbm90IG5lZWQgbW9yZSB0aGFuIG9uZSB0cmFuc21pdCBidWZmZXIuIgorICAgICovCisKKyAgIC8qIEZJWE1FOiBpbml0aWFsaXplIGhlYWRlciBhY2NvcmRpbmcgdG8gdnBfZ2V0X2ZlYXR1cmVzKCkgKi8KKworICAgdHhfdmlydGlvX2hkci5mbGFncyA9IDA7CisgICB0eF92aXJ0aW9faGRyLmNzdW1fb2Zmc2V0ID0gMDsKKyAgIHR4X3ZpcnRpb19oZHIuY3N1bV9zdGFydCA9IDA7CisgICB0eF92aXJ0aW9faGRyLmdzb190eXBlID0gVklSVElPX05FVF9IRFJfR1NPX05PTkU7CisgICB0eF92aXJ0aW9faGRyLmdzb19zaXplID0gMDsKKyAgIHR4X3ZpcnRpb19oZHIuaGRyX2xlbiA9IDA7CisKKyAgIC8qIGFkZCBldGhlcm5ldCBmcmFtZSBpbnRvIHZyaW5nICovCisKKyAgIEJVR19PTihsZW4gPiBzaXplb2YodHhfZXRoX2ZyYW1lLmRhdGEpKTsKKworICAgbWVtY3B5KHR4X2V0aF9mcmFtZS5oZHIuZHN0X2FkZHIsIGRlc3RhZGRyLCBFVEhfQUxFTik7CisgICBtZW1jcHkodHhfZXRoX2ZyYW1lLmhkci5zcmNfYWRkciwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKyAgIHR4X2V0aF9mcmFtZS5oZHIudHlwZSA9IGh0b25zKHR5cGUpOworICAgbWVtY3B5KHR4X2V0aF9mcmFtZS5kYXRhLCBkYXRhLCBsZW4pOworCisgICBsaXN0WzBdLmFkZHIgPSAoY2hhciopJnR4X3ZpcnRpb19oZHI7CisgICBsaXN0WzBdLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHIpOworICAgbGlzdFsxXS5hZGRyID0gKGNoYXIqKSZ0eF9ldGhfZnJhbWU7CisgICBsaXN0WzFdLmxlbmd0aCA9IEVUSF9GUkFNRV9MRU47CisKKyAgIHZyaW5nX2FkZF9idWYoJnZpcnRxdWV1ZVtUWF9JTkRFWF0sIGxpc3QsIDIsIDAsIDAsIDApOworCisgICB2cmluZ19raWNrKG5pYy0+aW9hZGRyLCAmdmlydHF1ZXVlW1RYX0lOREVYXSwgMSk7CisKKyAgIC8qCisgICAgKiBodHRwOi8vd3d3LmV0aGVyYm9vdC5vcmcvd2lraS9kZXYvZGV2bWFudWFsCisgICAgKgorICAgICogICAiWW91IHNob3VsZCBlbnN1cmUgdGhlIHBhY2tldCBpcyBmdWxseSB0cmFuc21pdHRlZAorICAgICogICAgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoaXMgcm91dGluZSIKKyAgICAqLworCisgICB3aGlsZSAoIXZyaW5nX21vcmVfdXNlZCgmdmlydHF1ZXVlW1RYX0lOREVYXSkpIHsKKyAgICAgICAgICAgbWIoKTsKKyAgICAgICAgICAgdWRlbGF5KDEwKTsKKyAgIH0KKworICAgLyogZnJlZSBkZXNjICovCisKKyAgICh2b2lkKXZyaW5nX2dldF9idWYoJnZpcnRxdWV1ZVtUWF9JTkRFWF0sIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCB2aXJ0bmV0X2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24pCit7CisgICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgICBjYXNlIERJU0FCTEUgOgorICAgICAgICAgICB2cmluZ19kaXNhYmxlX2NiKCZ2aXJ0cXVldWVbUlhfSU5ERVhdKTsKKyAgICAgICAgICAgdnJpbmdfZGlzYWJsZV9jYigmdmlydHF1ZXVlW1RYX0lOREVYXSk7CisgICAgICAgICAgIGJyZWFrOworICAgY2FzZSBFTkFCTEUgOgorICAgICAgICAgICB2cmluZ19lbmFibGVfY2IoJnZpcnRxdWV1ZVtSWF9JTkRFWF0pOworICAgICAgICAgICB2cmluZ19lbmFibGVfY2IoJnZpcnRxdWV1ZVtUWF9JTkRFWF0pOworICAgICAgICAgICBicmVhazsKKyAgIGNhc2UgRk9SQ0UgOgorICAgICAgICAgICBicmVhazsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgcHJvdmlkZV9idWZmZXJzKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgIGludCBpOworICAgc3RydWN0IHZyaW5nX2xpc3QgbGlzdFsyXTsKKworICAgZm9yIChpID0gMDsgaSA8IFJYX0JVRl9OQjsgaSsrKSB7CisgICAgICAgICAgIGxpc3RbMF0uYWRkciA9IChjaGFyKikmcnhfaGRyW2ldOworICAgICAgICAgICBsaXN0WzBdLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHIpOworICAgICAgICAgICBsaXN0WzFdLmFkZHIgPSAoY2hhciopJnJ4X2J1ZmZlcltpXTsKKyAgICAgICAgICAgbGlzdFsxXS5sZW5ndGggPSBFVEhfRlJBTUVfTEVOOworICAgICAgICAgICB2cmluZ19hZGRfYnVmKCZ2aXJ0cXVldWVbUlhfSU5ERVhdLCBsaXN0LCAwLCAyLCBpLCBpKTsKKyAgIH0KKworICAgLyogbm9maWZ5ICovCisKKyAgIHZyaW5nX2tpY2sobmljLT5pb2FkZHIsICZ2aXJ0cXVldWVbUlhfSU5ERVhdLCBpKTsKK30KKworc3RhdGljIHN0cnVjdCBuaWNfb3BlcmF0aW9ucyB2aXJ0bmV0X29wZXJhdGlvbnMgPSB7CisJLmNvbm5lY3QgPSBkdW1teV9jb25uZWN0LAorCS5wb2xsID0gdmlydG5ldF9wb2xsLAorCS50cmFuc21pdCA9IHZpcnRuZXRfdHJhbnNtaXQsCisJLmlycSA9IHZpcnRuZXRfaXJxLAorfTsKKworLyoKKyAqIHZpcnRuZXRfcHJvYmUKKyAqCisgKiBMb29rIGZvciBhIHZpcnRpbyBuZXR3b3JrIGFkYXB0ZXIKKyAqCisgKi8KKworc3RhdGljIGludCB2aXJ0bmV0X3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKyAgIHUzMiBmZWF0dXJlczsKKyAgIGludCBpOworCisgICAvKiBNYXNrIHRoZSBiaXQgdGhhdCBzYXlzICJ0aGlzIGlzIGFuIGlvIGFkZHIiICovCisKKyAgIG5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKKworICAgLyogQ29weSBJUlEgZnJvbSBQQ0kgaW5mb3JtYXRpb24gKi8KKworICAgbmljLT5pcnFubyA9IHBjaS0+aXJxOworCisgICBwcmludGYoIkkvTyBhZGRyZXNzIDB4JTA4eCwgSVJRICMlZFxuIiwgbmljLT5pb2FkZHIsIG5pYy0+aXJxbm8pOworCisgICBhZGp1c3RfcGNpX2RldmljZShwY2kpOworCisgICB2cF9yZXNldChuaWMtPmlvYWRkcik7CisKKyAgIGZlYXR1cmVzID0gdnBfZ2V0X2ZlYXR1cmVzKG5pYy0+aW9hZGRyKTsKKyAgIGlmIChmZWF0dXJlcyAmICgxIDw8IFZJUlRJT19ORVRfRl9NQUMpKSB7CisgICAgICAgICAgIHZwX2dldChuaWMtPmlvYWRkciwgb2Zmc2V0b2Yoc3RydWN0IHZpcnRpb19uZXRfY29uZmlnLCBtYWMpLAorICAgICAgICAgICAgICAgICAgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKyAgICAgICAgICAgcHJpbnRmKCJNQUMgYWRkcmVzcyAiKTsKKwkgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworICAgICAgICAgICAgICAgICAgIHByaW50ZigiJTAyeCVjIiwgbmljLT5ub2RlX2FkZHJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpID09IEVUSF9BTEVOIC0gMSkgPyAnXG4nIDogJzonKTsKKyAgICAgICAgICAgfQorICAgfQorCisgICAvKiBpbml0aWFsaXplIGVtaXQvcmVjZWl2ZSBxdWV1ZSAqLworCisgICBmb3IgKGkgPSAwOyBpIDwgUVVFVUVfTkI7IGkrKykgeworICAgICAgICAgICB2aXJ0cXVldWVbaV0uZnJlZV9oZWFkID0gMDsKKyAgICAgICAgICAgdmlydHF1ZXVlW2ldLmxhc3RfdXNlZF9pZHggPSAwOworICAgICAgICAgICBtZW1zZXQoKGNoYXIqKSZ2aXJ0cXVldWVbaV0ucXVldWUsIDAsIHNpemVvZih2aXJ0cXVldWVbaV0ucXVldWUpKTsKKyAgICAgICAgICAgaWYgKHZwX2ZpbmRfdnEobmljLT5pb2FkZHIsIGksICZ2aXJ0cXVldWVbaV0pID09IC0xKQorICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ2Fubm90IHJlZ2lzdGVyIHF1ZXVlICMlZFxuIiwgaSk7CisgICB9CisKKyAgIC8qIHByb3ZpZGUgc29tZSByZWNlaXZlIGJ1ZmZlcnMgKi8KKworICAgIHByb3ZpZGVfYnVmZmVycyhuaWMpOworCisgICAvKiBkZWZpbmUgTklDIGludGVyZmFjZSAqLworCisgICAgbmljLT5uaWNfb3AgPSAmdmlydG5ldF9vcGVyYXRpb25zOworCisgICAvKiBkcml2ZXIgaXMgcmVhZHkgKi8KKworICAgdnBfc2V0X2ZlYXR1cmVzKG5pYy0+aW9hZGRyLCBmZWF0dXJlcyAmICgxIDw8IFZJUlRJT19ORVRfRl9NQUMpKTsKKyAgIHZwX3NldF9zdGF0dXMobmljLT5pb2FkZHIsIFZJUlRJT19DT05GSUdfU19EUklWRVIgfCBWSVJUSU9fQ09ORklHX1NfRFJJVkVSX09LKTsKKworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aXJ0bmV0X25pY3NbXSA9IHsKK1BDSV9ST00oMHgxYWY0LCAweDEwMDAsICJ2aXJ0aW8tbmV0IiwgICAgICAgICAgICAgICJWaXJ0aW8gTmV0d29yayBJbnRlcmZhY2UiLCAwKSwKK307CisKK1BDSV9EUklWRVIgKCB2aXJ0bmV0X2RyaXZlciwgdmlydG5ldF9uaWNzLCBQQ0lfTk9fQ0xBU1MgKTsKKworRFJJVkVSICggIlZJUlRJTy1ORVQiLCBuaWNfZHJpdmVyLCBwY2lfZHJpdmVyLCB2aXJ0bmV0X2RyaXZlciwKKwkgdmlydG5ldF9wcm9iZSwgdmlydG5ldF9kaXNhYmxlICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC92aXJ0aW8tbmV0LmggYi9ncHhlL3NyYy9kcml2ZXJzL25ldC92aXJ0aW8tbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiZWYyOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3ZpcnRpby1uZXQuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9WSVJUSU9fTkVUX0hfCisjIGRlZmluZSBfVklSVElPX05FVF9IXworCisvKiBUaGUgZmVhdHVyZSBiaXRtYXAgZm9yIHZpcnRpbyBuZXQgKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0NTVU0gICAgICAgMCAgICAgICAvKiBIb3N0IGhhbmRsZXMgcGt0cyB3LyBwYXJ0aWFsIGNzdW0gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dVRVNUX0NTVU0gMSAgICAgICAvKiBHdWVzdCBoYW5kbGVzIHBrdHMgdy8gcGFydGlhbCBjc3VtICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9NQUMgICAgICAgIDUgICAgICAgLyogSG9zdCBoYXMgZ2l2ZW4gTUFDIGFkZHJlc3MuICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9HU08gICAgICAgIDYgICAgICAgLyogSG9zdCBoYW5kbGVzIHBrdHMgdy8gYW55IEdTTyB0eXBlICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9HVUVTVF9UU080IDcgICAgICAgLyogR3Vlc3QgY2FuIGhhbmRsZSBUU092NCBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dVRVNUX1RTTzYgOCAgICAgICAvKiBHdWVzdCBjYW4gaGFuZGxlIFRTT3Y2IGluLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfR1VFU1RfRUNOICA5ICAgICAgIC8qIEd1ZXN0IGNhbiBoYW5kbGUgVFNPWzZdIHcvIEVDTiBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dVRVNUX1VGTyAgMTAgICAgICAvKiBHdWVzdCBjYW4gaGFuZGxlIFVGTyBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0hPU1RfVFNPNCAgMTEgICAgICAvKiBIb3N0IGNhbiBoYW5kbGUgVFNPdjQgaW4uICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9IT1NUX1RTTzYgIDEyICAgICAgLyogSG9zdCBjYW4gaGFuZGxlIFRTT3Y2IGluLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfSE9TVF9FQ04gICAxMyAgICAgIC8qIEhvc3QgY2FuIGhhbmRsZSBUU09bNl0gdy8gRUNOIGluLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfSE9TVF9VRk8gICAxNCAgICAgIC8qIEhvc3QgY2FuIGhhbmRsZSBVRk8gaW4uICovCisKK3N0cnVjdCB2aXJ0aW9fbmV0X2NvbmZpZworeworICAgLyogVGhlIGNvbmZpZyBkZWZpbmluZyBtYWMgYWRkcmVzcyAoaWYgVklSVElPX05FVF9GX01BQykgKi8KKyAgIHU4IG1hY1s2XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFRoaXMgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHNjYXR0ZXItZ2F0aGVyIGxpc3QuICBJZiB5b3UgZG9uJ3QKKyAqIHNwZWNpZnkgR1NPIG9yIENTVU0gZmVhdHVyZXMsIHlvdSBjYW4gc2ltcGx5IGlnbm9yZSB0aGUgaGVhZGVyLiAqLworCitzdHJ1Y3QgdmlydGlvX25ldF9oZHIKK3sKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfRl9ORUVEU19DU1VNICAgICAxICAgICAgIC8vIFVzZSBjc3VtX3N0YXJ0LCBjc3VtX29mZnNldAorICAgdWludDhfdCBmbGFnczsKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfR1NPX05PTkUgICAgICAgICAwICAgICAgIC8vIE5vdCBhIEdTTyBmcmFtZQorI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9HU09fVENQVjQgICAgICAgIDEgICAgICAgLy8gR1NPIGZyYW1lLCBJUHY0IFRDUCAoVFNPKQorLyogRklYTUU6IERvIHdlIG5lZWQgdGhpcz8gIElmIHRoZXkgc2FpZCB0aGV5IGNhbiBoYW5kbGUgRUNOLCBkbyB0aGV5IGNhcmU/ICovCisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0dTT19UQ1BWNF9FQ04gICAgMiAgICAgICAvLyBHU08gZnJhbWUsIElQdjQgVENQIHcvIEVDTgorI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9HU09fVURQICAgICAgICAgIDMgICAgICAgLy8gR1NPIGZyYW1lLCBJUHY0IFVEUCAoVUZPKQorI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9HU09fVENQVjYgICAgICAgIDQgICAgICAgLy8gR1NPIGZyYW1lLCBJUHY2IFRDUAorI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9HU09fRUNOICAgICAgICAgIDB4ODAgICAgLy8gVENQIGhhcyBFQ04gc2V0CisgICB1aW50OF90IGdzb190eXBlOworICAgdWludDE2X3QgaGRyX2xlbjsKKyAgIHVpbnQxNl90IGdzb19zaXplOworICAgdWludDE2X3QgY3N1bV9zdGFydDsKKyAgIHVpbnQxNl90IGNzdW1fb2Zmc2V0OworfTsKKyNlbmRpZiAvKiBfVklSVElPX05FVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdzg5Yzg0MC5jIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvdzg5Yzg0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjE4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9kcml2ZXJzL25ldC93ODljODQwLmMKQEAgLTAsMCArMSw5NjQgQEAKKy8qCisgKiBFdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorICoKKyAqIHc4OWM4NDAuYyAtLSBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgd2luYm9uZC04NDAgZHJpdmVyIGZvciBldGhlcmJvb3QuCisgKgorICovCisKKy8qCisgKiBBZGFwdGVkIGJ5IElnb3IgVi4gS292YWxlbmtvCisgKiAgLS0gPGdhcnJpc29uQG1haWwucnU+CisgKiAgIE9SCisgKiAgLS0gPGlrb0BjcmVjLm1pcHQucnU+CisgKiBJbml0aWFsIGFkYXB0YWlvbiBzdGFnZSwgaW5jbHVkaW5nIHRlc3RpbmcsIGNvbXBsZXRlZCAyMyBBdWd1c3QgMjAwMC4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKgorICogICAgICAgICAgICAgIGRhdGUgICAgICAgdmVyc2lvbiAgYnkgICB3aGF0CisgKiAgV3JpdHRlbjogICAgQXVnIDIwIDIwMDAgIFYwLjEwICBpa28gIEluaXRpYWwgcmV2aXNpb24uCisgKiBjaGFuZ2VzOiAgICAgQXVnIDIyIDIwMDAgIFYwLjkwICBpa28gIFdvcmtzIQorICogICAgICAgICAgICAgIEF1ZyAyMyAyMDAwICBWMC45MSAgaWtvICBDbGVhbnVwLCBwb3N0ZWQgdG8gZXRoZXJib290CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW50YWluZXIuCisgKiAgICAgICAgICAgICAgQXVnIDI2IDIwMDAgIFYwLjkyICBpa28gIEZpeGVkIFJ4IHJpbmcgaGFuZGxpbmcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0IExpbnV4IEtlcm5lbCAoVE0pCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSBsb2FkZWQgdXNpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBkcml2ZXIuCisgKiAgICAgICAgICAgICAgSmFuIDA3IDIwMDEgIFYwLjkzICBpa28gIFRyYW5zbWl0dGVyIHRpbWVvdXRzIGFyZSBoYW5kbGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRpbWVyMiByb3V0aW5lcy4gUHJvcG9zZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgS2VuIFlhcCB0byBlbGltaW5hdGUgQ1BVIHNwZWVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kuCisgKiAgICAgICAgICAgICBEZWMgMTIgMjAwMyAgVjAuOTQgICB0aW1sZWdnZQlGaXhlZCBpc3N1ZXMgaW4gNS4yLCByZW1vdmVkIAorICogICAgICAgICAgICAgCQkJCQlpbnRlcnJ1cHQgdXNhZ2UsIGVuYWJsZWQKKyAqICAgICAgICAgICAgIAkJCQkJbXVsdGljYXN0IHN1cHBvcnQKKyAqCisgKiBUaGlzIGlzIHRoZSBldGhlcmJvb3QgZHJpdmVyIGZvciBjYXJkcyBiYXNlZCBvbiBXaW5ib25kIFc4OWM4NDBGIGNoaXAuCisgKgorICogSXQgd2FzIHdyaXR0ZW4gZnJvbSBza2VsZXRvbiBzb3VyY2UsIHdpdGggRG9uYWxkIEJlY2tlcidzIHdpbmJvbmQtODQwLmMKKyAqIGtlcm5lbCBkcml2ZXIgYXMgYSBndWlkZWxpbmUuIE1vc3RseSB0aGUgdzg5Yzg0MCByZWxhdGVkIGRlZmluaXRpb25zCisgKiBhbmQgdGhlIGxvd2VyIGxldmVsIHJvdXRpbmVzIGhhdmUgYmVlbiBjdXQtYW5kLXBhc3RlZCBpbnRvIHRoaXMgc291cmNlLgorICoKKyAqIEZyYW5rbHkgc3BlYWtpbmcsIGFib3V0IDkwJSBvZiB0aGUgY29kZSB3YXMgb2J0YWluZWQgdXNpbmcgY3V0J24ncGFzdGUKKyAqIHNlcXVlbmNlIDopIHdoaWxlIHRoZSByZW1haW5kZXIgYXBwZWFyZWQgd2hpbGUgYnJhaW5zdG9ybWluZworICogTGludXggS2VybmVsIDIuNC4wLXRlc3RYIHNvdXJjZSBjb2RlLiBUaGFua3MsIERvbmFsZCBhbmQgTGludXMhCisgKgorICogVGhlcmUgd2FzIGEgZGVtYW5kIGZvciB1c2luZyB0aGlzIGNhcmQgaW4gYSByYXRoZXIgbGFyZ2UKKyAqIHJlbW90ZSBib290IGVudmlyb25tZW50IGF0IE1TS1AgT1ZUSSBMYWIgb2YKKyAqIE1vc2NvdyBJbnN0aXR1dGUgZm9yIFBoeXNpY3MgYW5kIFRlY2hub2xvZ3kgKE1JUFQpIC0tIGh0dHA6Ly93d3cubWlwdC5ydS8KKyAqIHNvIHlvdSBtYXkgY291bnQgdGhhdCBmb3IgbW90aXZhdGlvbi4KKyAqCisgKi8KKworLyoKKyAqIElmIHlvdSB3YW50IHRvIHNlZSBkZWJ1Z2dpbmcgb3V0cHV0IHRoZW4gZGVmaW5lIFc4OUM4NDBfREVCVUcKKyAqLworCisvKgorI2RlZmluZSBXODlDODQwX0RFQlVHCisqLworCisvKgorICogS2VlcCB1c2luZyBJT19PUFMgZm9yIEV0aGVyYm9vdCBkcml2ZXIhCisgKi8KKyNkZWZpbmUgVVNFX0lPX09QUworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICp3ODljODQwX3ZlcnNpb24gPSAiZHJpdmVyIFZlcnNpb24gMC45NCAtIERlY2VtYmVyIDEyLCAyMDAzIjsKKworLyogTGludXggc3VwcG9ydCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgdmlydF90b19idXMoYWRkcikKKyNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKSAgYnVzX3RvX3ZpcnQoYWRkcikKKworLyoKKyNkZWZpbmUgY3B1X3RvX2xlMzIodmFsKSAodmFsKQorI2RlZmluZSBsZTMyX3RvX2NwdSh2YWwpICh2YWwpCisqLworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGNvbXBpbGUgZWZmaWNpZW5jeS4KKyAgIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4KKyAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KKyAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgMgorI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgMgorCisvKiBUaGUgcHJlc3VtZWQgRklGTyBzaXplIGZvciB3b3JraW5nIGFyb3VuZCB0aGUgVHgtRklGTy1vdmVyZmxvdyBidWcuCisgICBUbyBhdm9pZCBvdmVyZmxvd2luZyB3ZSBkb24ndCBxdWV1ZSBhZ2FpbiB1bnRpbCB3ZSBoYXZlIHJvb20gZm9yIGEKKyAgIGZ1bGwtc2l6ZSBwYWNrZXQuCisgKi8KKyNkZWZpbmUgVFhfRklGT19TSVpFICgyMDQ4KQorI2RlZmluZSBUWF9CVUdfRklGT19MSU1JVCAoVFhfRklGT19TSVpFLTE1MTQtMTYpCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKDEwKjEwMDApCisKKyNkZWZpbmUgUEtUX0JVRl9TWiAgMTUzNiAgLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKworLyoKKyAqIFVzZWQgdG8gYmUgdGhpcyBtdWNoIENQVSBsb29wcyBvbiBDZWxlcm9uQDQwMCAoPyksCisgKiBub3cgdXNpbmcgcmVhbCB0aW1lciBhbmQgVFhfVElNRU9VVCEKKyAqICNkZWZpbmUgVFhfTE9PUF9DT1VOVCAxMDAwMDAwMAorICovCisKKyNpZiAhZGVmaW5lZChfX09QVElNSVpFX18pCisjd2FybmluZyAgWW91IG11c3QgY29tcGlsZSB0aGlzIGZpbGUgd2l0aCB0aGUgY29ycmVjdCBvcHRpb25zIQorI3dhcm5pbmcgIFNlZSB0aGUgbGFzdCBsaW5lcyBvZiB0aGUgc291cmNlIGZpbGUuCisjZXJyb3IgWW91IG11c3QgY29tcGlsZSB0aGlzIGRyaXZlciB3aXRoICItTyIuCisjZW5kaWYKKworZW51bSBjaGlwX2NhcGFiaWxpdHlfZmxhZ3Mge0NhbkhhdmVNSUk9MSwgSGFzQnJva2VuVHg9Mn07CisKKyNpZmRlZiBVU0VfSU9fT1BTCisjZGVmaW5lIFc4NDBfRkxBR1MgKFBDSV9VU0VTX0lPIHwgUENJX0FERFIwIHwgUENJX1VTRVNfTUFTVEVSKQorI2Vsc2UKKyNkZWZpbmUgVzg0MF9GTEFHUyAoUENJX1VTRVNfTUVNIHwgUENJX0FERFIxIHwgUENJX1VTRVNfTUFTVEVSKQorI2VuZGlmCisKK3N0YXRpYyB1MzIgZHJpdmVyX2ZsYWdzID0gQ2FuSGF2ZU1JSSB8IEhhc0Jyb2tlblR4OworCisvKiBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiB0byB1c2UgUENJIG1lbW9yeSBzcGFjZSwgaG93ZXZlciBzb21lIHg4NiBzeXN0ZW1zCisgICB3b3JrIG9ubHkgd2l0aCBJL08gc3BhY2UgYWNjZXNzZXMuICBQYXNzIC1EVVNFX0lPX09QUyB0byB1c2UgUENJIEkvTyBzcGFjZQorICAgYWNjZXNzZXMgaW5zdGVhZCBvZiBtZW1vcnkgc3BhY2UuICovCisKKyNpZmRlZiBVU0VfSU9fT1BTCisjdW5kZWYgcmVhZGIKKyN1bmRlZiByZWFkdworI3VuZGVmIHJlYWRsCisjdW5kZWYgd3JpdGViCisjdW5kZWYgd3JpdGV3CisjdW5kZWYgd3JpdGVsCisjZGVmaW5lIHJlYWRiIGluYgorI2RlZmluZSByZWFkdyBpbncKKyNkZWZpbmUgcmVhZGwgaW5sCisjZGVmaW5lIHdyaXRlYiBvdXRiCisjZGVmaW5lIHdyaXRldyBvdXR3CisjZGVmaW5lIHdyaXRlbCBvdXRsCisjZW5kaWYKKworLyogT2Zmc2V0cyB0byB0aGUgQ29tbWFuZCBhbmQgU3RhdHVzIFJlZ2lzdGVycywgIkNTUnMiLgorICAgV2hpbGUgc2ltaWxhciB0byB0aGUgVHVsaXAsIHRoZXNlIHJlZ2lzdGVycyBhcmUgbG9uZ3dvcmQgYWxpZ25lZC4KKyAgIE5vdGU6IEl0J3Mgbm90IHVzZWZ1bCB0byBkZWZpbmUgc3ltYm9saWMgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIGJpdCBpbgorICAgdGhlIGRldmljZS4gIFRoZSBuYW1lIGNhbiBvbmx5IHBhcnRpYWxseSBkb2N1bWVudCB0aGUgc2VtYW50aWNzIGFuZCBtYWtlCisgICB0aGUgZHJpdmVyIGxvbmdlciBhbmQgbW9yZSBkaWZmaWN1bHQgdG8gcmVhZC4KKyovCitlbnVtIHc4NDBfb2Zmc2V0cyB7CisgICAgUENJQnVzQ2ZnPTB4MDAsIFR4U3RhcnREZW1hbmQ9MHgwNCwgUnhTdGFydERlbWFuZD0weDA4LAorICAgIFJ4UmluZ1B0cj0weDBDLCBUeFJpbmdQdHI9MHgxMCwKKyAgICBJbnRyU3RhdHVzPTB4MTQsIE5ldHdvcmtDb25maWc9MHgxOCwgSW50ckVuYWJsZT0weDFDLAorICAgIFJ4TWlzc2VkPTB4MjAsIEVFQ3RybD0weDI0LCBNSUlDdHJsPTB4MjQsIEJvb3RSb209MHgyOCwgR1BUaW1lcj0weDJDLAorICAgIEN1clJ4RGVzY0FkZHI9MHgzMCwgQ3VyUnhCdWZBZGRyPTB4MzQsICAgICAgICAgICAgLyogRGVidWcgdXNlICovCisgICAgTXVsdGljYXN0RmlsdGVyMD0weDM4LCBNdWx0aWNhc3RGaWx0ZXIxPTB4M0MsIFN0YXRpb25BZGRyPTB4NDAsCisgICAgQ3VyVHhEZXNjQWRkcj0weDRDLCBDdXJUeEJ1ZkFkZHI9MHg1MCwKK307CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvZW5hYmxlIHJlZ2lzdGVycy4gKi8KKy8qIFRoZSBiaXRzIGluIHRoZSBJbnRyIFN0YXR1cy9FbmFibGUgcmVnaXN0ZXJzLCBtb3N0bHkgaW50ZXJydXB0IHNvdXJjZXMuICovCitlbnVtIGludHJfc3RhdHVzX2JpdHMgeworICAgIE5vcm1hbEludHI9MHgxMDAwMCwgQWJub3JtYWxJbnRyPTB4ODAwMCwKKyAgICBJbnRyUENJRXJyPTB4MjAwMCwgVGltZXJJbnQ9MHg4MDAsCisgICAgSW50clJ4RGllZD0weDEwMCwgUnhOb0J1Zj0weDgwLCBJbnRyUnhEb25lPTB4NDAsCisgICAgVHhGSUZPVW5kZXJmbG93PTB4MjAsIFJ4RXJySW50cj0weDEwLAorICAgIFR4SWRsZT0weDA0LCBJbnRyVHhTdG9wcGVkPTB4MDIsIEludHJUeERvbmU9MHgwMSwKK307CisKKy8qIEJpdHMgaW4gdGhlIE5ldHdvcmtDb25maWcgcmVnaXN0ZXIuICovCitlbnVtIHJ4X21vZGVfYml0cyB7CisgICAgQWNjZXB0RXJyPTB4ODAsIEFjY2VwdFJ1bnQ9MHg0MCwKKyAgICBBY2NlcHRCcm9hZGNhc3Q9MHgyMCwgQWNjZXB0TXVsdGljYXN0PTB4MTAsCisgICAgQWNjZXB0QWxsUGh5cz0weDA4LCBBY2NlcHRNeVBoeXM9MHgwMiwKK307CisKK2VudW0gbWlpX3JlZ19iaXRzIHsKKyAgICBNRElPX1NoaWZ0Q2xrPTB4MTAwMDAsIE1ESU9fRGF0YUluPTB4ODAwMDAsIE1ESU9fRGF0YU91dD0weDIwMDAwLAorICAgIE1ESU9fRW5iT3V0cHV0PTB4NDAwMDAsIE1ESU9fRW5iSW4gPSAweDAwMDAwLAorfTsKKworLyogVGhlIFR1bGlwIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3Qgdzg0MF9yeF9kZXNjIHsKKyAgICBzMzIgc3RhdHVzOworICAgIHMzMiBsZW5ndGg7CisgICAgdTMyIGJ1ZmZlcjE7CisgICAgdTMyIG5leHRfZGVzYzsKK307CisKK3N0cnVjdCB3ODQwX3R4X2Rlc2MgeworICAgIHMzMiBzdGF0dXM7CisgICAgczMyIGxlbmd0aDsKKyAgICB1MzIgYnVmZmVyMSwgYnVmZmVyMjsgICAgICAgICAgICAgICAgLyogV2UgdXNlIG9ubHkgYnVmZmVyIDEuICAqLworfTsKKworLyogQml0cyBpbiBuZXR3b3JrX2Rlc2Muc3RhdHVzICovCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeworICAgIERlc2NPd249MHg4MDAwMDAwMCwgRGVzY0VuZFJpbmc9MHgwMjAwMDAwMCwgRGVzY1VzZUxpbms9MHgwMTAwMDAwMCwKKyAgICBEZXNjV2hvbGVQa3Q9MHg2MDAwMDAwMCwgRGVzY1N0YXJ0UGt0PTB4MjAwMDAwMDAsIERlc2NFbmRQa3Q9MHg0MDAwMDAwMCwKKyAgICBEZXNjSW50cj0weDgwMDAwMDAwLAorfTsKKyNkZWZpbmUgUFJJVl9BTElHTiAgICAxNSAgICAgLyogUmVxdWlyZWQgYWxpZ25tZW50IG1hc2sgKi8KKyNkZWZpbmUgUFJJVl9BTElHTl9CWVRFUyAzMgorCitzdGF0aWMgc3RydWN0IHdpbmJvbmRfcHJpdmF0ZQoreworICAgIC8qIERlc2NyaXB0b3IgcmluZ3MgZmlyc3QgZm9yIGFsaWdubWVudC4gKi8KKyAgICBzdHJ1Y3Qgdzg0MF9yeF9kZXNjIHJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKyAgICBzdHJ1Y3Qgdzg0MF90eF9kZXNjIHR4X3JpbmdbVFhfUklOR19TSVpFXTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9tb2R1bGU7ICAgICAgICAvKiBMaW5rIGZvciBkZXZpY2VzIG9mIHRoaXMgdHlwZS4gKi8KKyAgICB2b2lkICpwcml2X2FkZHI7ICAgICAgICAgICAgICAgICAgICAvKiBVbmFsaWduZWQgYWRkcmVzcyBmb3Iga2ZyZWUgKi8KKyAgICBjb25zdCBjaGFyICpwcm9kdWN0X25hbWU7CisgICAgLyogRnJlcXVlbnRseSB1c2VkIHZhbHVlczoga2VlcCBzb21lIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QuICovCisgICAgaW50IGNoaXBfaWQsIGRydl9mbGFnczsKKyAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKyAgICBpbnQgY3NyNjsKKyAgICBzdHJ1Y3Qgdzg0MF9yeF9kZXNjICpyeF9oZWFkX2Rlc2M7CisgICAgdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7ICAgICAgICAvKiBQcm9kdWNlci9jb25zdW1lciByaW5nIGluZGljZXMgKi8KKyAgICB1bnNpZ25lZCBpbnQgcnhfYnVmX3N6OyAgICAgICAgICAgICAgICAvKiBCYXNlZCBvbiBNVFUrc2xhY2suICovCisgICAgdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisgICAgaW50IHR4X3FfYnl0ZXM7CisgICAgdW5zaWduZWQgaW50IHR4X2Z1bGw6MTsgICAgICAgICAgICAgICAgLyogVGhlIFR4IHF1ZXVlIGlzIGZ1bGwuICovCisgICAgLyogVGhlc2UgdmFsdWVzIGFyZSBrZWVwIHRyYWNrIG9mIHRoZSB0cmFuc2NlaXZlci9tZWRpYSBpbiB1c2UuICovCisgICAgdW5zaWduZWQgaW50IGZ1bGxfZHVwbGV4OjE7ICAgICAgICAgICAgLyogRnVsbC1kdXBsZXggb3BlcmF0aW9uIHJlcXVlc3RlZC4gKi8KKyAgICB1bnNpZ25lZCBpbnQgZHVwbGV4X2xvY2s6MTsKKyAgICB1bnNpZ25lZCBpbnQgbWVkaWFsb2NrOjE7ICAgICAgICAgICAgLyogRG8gbm90IHNlbnNlIG1lZGlhLiAqLworICAgIHVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsgICAgICAgIC8qIExhc3QgZGV2LT5pZl9wb3J0IHZhbHVlLiAqLworICAgIC8qIE1JSSB0cmFuc2NlaXZlciBzZWN0aW9uLiAqLworICAgIGludCBtaWlfY250OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworICAgIHUxNiBhZHZlcnRpc2luZzsgICAgICAgICAgICAgICAgICAgIC8qIE5XYXkgbWVkaWEgYWR2ZXJ0aXNlbWVudCAqLworICAgIHVuc2lnbmVkIGNoYXIgcGh5c1syXTsgICAgICAgICAgICAgICAgLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCit9IHc4NDBwcml2YXRlIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChQUklWX0FMSUdOX0JZVEVTKSkpOworCisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCisKK3N0YXRpYyBpbnQgaW9hZGRyOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGVlcHJvbSBbMHg0MF07CitzdHJ1Y3QgeworCWNoYXIgICAgICAgIHJ4X3BhY2tldFtQS1RfQlVGX1NaICogUlhfUklOR19TSVpFXTsKKwljaGFyICAgICAgICB0eF9wYWNrZXRbUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRV07Cit9IHc4OWM4NDBfYnVmIF9fc2hhcmVkOworCitzdGF0aWMgaW50ICBlZXByb21fcmVhZChsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgIG1kaW9fcmVhZChpbnQgYmFzZV9hZGRyZXNzLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworI2lmIDAKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoaW50IGJhc2VfYWRkcmVzcywgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxleCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHZvaWQpOworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHZvaWQpOworCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorc3RhdGljIHZvaWQgZGVjb2RlX2ludGVycnVwdCh1MzIgaW50cl9zdGF0dXMpCit7CisgICAgcHJpbnRmKCJJbnRlcnJ1cHQgc3RhdHVzOiAiKTsKKworI2RlZmluZSBUUkFDRV9JTlRSKF9pbnRyXykgXAorICAgIGlmIChpbnRyX3N0YXR1cyAmIChfaW50cl8pKSB7IHByaW50ZiAoIiAiICNfaW50cl8pOyB9CisKKyAgICBUUkFDRV9JTlRSKE5vcm1hbEludHIpOworICAgIFRSQUNFX0lOVFIoQWJub3JtYWxJbnRyKTsKKyAgICBUUkFDRV9JTlRSKEludHJQQ0lFcnIpOworICAgIFRSQUNFX0lOVFIoVGltZXJJbnQpOworICAgIFRSQUNFX0lOVFIoSW50clJ4RGllZCk7CisgICAgVFJBQ0VfSU5UUihSeE5vQnVmKTsKKyAgICBUUkFDRV9JTlRSKEludHJSeERvbmUpOworICAgIFRSQUNFX0lOVFIoVHhGSUZPVW5kZXJmbG93KTsKKyAgICBUUkFDRV9JTlRSKFJ4RXJySW50cik7CisgICAgVFJBQ0VfSU5UUihUeElkbGUpOworICAgIFRSQUNFX0lOVFIoSW50clR4U3RvcHBlZCk7CisgICAgVFJBQ0VfSU5UUihJbnRyVHhEb25lKTsKKworICAgIHByaW50ZigiXG4iKTsKKyAgICAvKnNsZWVwKDEpOyovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit3ODljODQwX3Jlc2V0IC0gUmVzZXQgYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdzg5Yzg0MF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLgorICAgICAgIE5vIGhvbGQgdGltZSByZXF1aXJlZCEgKi8KKyAgICB3cml0ZWwoMHgwMDAwMDAwMSwgaW9hZGRyICsgUENJQnVzQ2ZnKTsKKworICAgIGluaXRfcmluZygpOworCisgICAgd3JpdGVsKHZpcnRfdG9fYnVzKHc4NDBwcml2YXRlLnJ4X3JpbmcpLCBpb2FkZHIgKyBSeFJpbmdQdHIpOworICAgIHdyaXRlbCh2aXJ0X3RvX2J1cyh3ODQwcHJpdmF0ZS50eF9yaW5nKSwgaW9hZGRyICsgVHhSaW5nUHRyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorICAgICAgICB3cml0ZWIobmljLT5ub2RlX2FkZHJbaV0sIGlvYWRkciArIFN0YXRpb25BZGRyICsgaSk7CisKKyAgICAvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKyAgICAvKiBDb25maWd1cmUgdGhlIFBDSSBidXMgYnVyc3RzIGFuZCBGSUZPIHRocmVzaG9sZHMuCisgICAgICAgNDg2OiBTZXQgOCBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIDggbG9uZ3dvcmQgYnVyc3QuCisgICAgICAgNTg2OiBTZXQgMTYgbG9uZ3dvcmQgY2FjaGUgYWxpZ25tZW50LCBubyBidXJzdCBsaW1pdC4KKyAgICAgICBDYWNoZSBhbGlnbm1lbnQgYml0cyAxNToxNCAgICAgICAgIEJ1cnN0IGxlbmd0aCAxMzo4CisgICAgICAgIDAwMDAgICAgPG5vdCBhbGxvd2VkPiAgICAgICAgIDAwMDAgYWxpZ24gdG8gY2FjaGUgICAgMDgwMCA4IGxvbmd3b3JkcworICAgICAgICA0MDAwICAgIDggIGxvbmd3b3JkcyAgICAgICAgMDEwMCAxIGxvbmd3b3JkICAgICAgICAxMDAwIDE2IGxvbmd3b3JkcworICAgICAgICA4MDAwICAgIDE2IGxvbmd3b3JkcyAgICAgICAgMDIwMCAyIGxvbmd3b3JkcyAgICAyMDAwIDMyIGxvbmd3b3JkcworICAgICAgICBDMDAwICAgIDMyICBsb25nd29yZHMgICAgICAgIDA0MDAgNCBsb25nd29yZHMKKyAgICAgICBXYWl0IHRoZSBzcGVjaWZpZWQgNTAgUENJIGN5Y2xlcyBhZnRlciBhIHJlc2V0IGJ5IGluaXRpYWxpemluZworICAgICAgIFR4IGFuZCBSeCBxdWV1ZXMgYW5kIHRoZSBhZGRyZXNzIGZpbHRlciBsaXN0LiAqLworCisgICAgd3JpdGVsKDB4RTAxMCwgaW9hZGRyICsgUENJQnVzQ2ZnKTsKKworICAgIHdyaXRlbCgwLCBpb2FkZHIgKyBSeFN0YXJ0RGVtYW5kKTsKKyAgICB3ODQwcHJpdmF0ZS5jc3I2ID0gMHgyMDAyMjAwMjsKKyAgICBjaGVja19kdXBsZXgoKTsKKyAgICBzZXRfcnhfbW9kZSgpOworCisgICAgLyogRG8gbm90IGVuYWJsZSB0aGUgaW50ZXJydXB0cyBFdGhlcmJvb3QgZG9lc24ndCBuZWVkIHRoZW0gKi8KKy8qCisgICAgd3JpdGVsKDB4MUEwRjUsIGlvYWRkciArIEludHJTdGF0dXMpOworICAgIHdyaXRlbCgweDFBMEY1LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKyovCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgIHByaW50Zigid2luYm9uZC04NDAgOiBEb25lIHJlc2V0LlxuIik7CisjZW5kaWYKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGhhbmRsZV9pbnRyKHUzMiBpbnRyX3N0YXQpCit7CisgICAgaWYgKChpbnRyX3N0YXQgJiAoTm9ybWFsSW50cnxBYm5vcm1hbEludHIpKSA9PSAwKSB7CisgICAgICAgIC8qIHdlIGFyZSBwb2xsaW5nLCBkbyBub3QgcmV0dXJuIG5vdyAqLworICAgICAgICAvKnJldHVybiAwOyovCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCisgICAgICAgIHdyaXRlbChpbnRyX3N0YXQgJiAweDAwMWZmZmYsIGlvYWRkciArIEludHJTdGF0dXMpOworICAgIH0KKworICAgIGlmIChpbnRyX3N0YXQgJiBBYm5vcm1hbEludHIpIHsKKyAgICAgICAgLyogVGhlcmUgd2FzIGFuIGFibm9ybWFsIGludGVycnVwdCAqLworICAgICAgICBwcmludGYoIlxuLT0tIEFibm9ybWFsIGludGVycnVwdC5cbiIpOworCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgICAgICBkZWNvZGVfaW50ZXJydXB0KGludHJfc3RhdCk7CisjZW5kaWYKKworICAgICAgICBpZiAoaW50cl9zdGF0ICYgUnhOb0J1ZikgeworICAgICAgICAgICAgLyogVGhlcmUgd2FzIGFuIGludGVycnVwdCAqLworICAgICAgICAgICAgcHJpbnRmKCItPS0gPD0+IE5vIHJlY2VpdmUgYnVmZmVycyBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgICAgIHdyaXRlbCgwLCBpb2FkZHIgKyBSeFN0YXJ0RGVtYW5kKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3c4OWM4NDBfcG9sbCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdzg5Yzg0MF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworICAgIC8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KKyAgICAvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLworICAgIC8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCisgICAgaW50IHBhY2tldF9yZWNlaXZlZCA9IDA7CisKKyNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCisgICAgdTMyIGludHJfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgSW50clN0YXR1cyk7CisjZW5kaWYKKworICAgIGRvIHsKKyAgICAgICAgLyogQ29kZSBmcm9tIG5ldGRldl9yeChkZXYpICovCisKKyAgICAgICAgaW50IGVudHJ5ID0gdzg0MHByaXZhdGUuY3VyX3J4ICUgUlhfUklOR19TSVpFOworCisgICAgICAgIHN0cnVjdCB3ODQwX3J4X2Rlc2MgKmRlc2MgPSB3ODQwcHJpdmF0ZS5yeF9oZWFkX2Rlc2M7CisgICAgICAgIHMzMiBzdGF0dXMgPSBkZXNjLT5zdGF0dXM7CisKKyAgICAgICAgaWYgKHN0YXR1cyAmIERlc2NPd24pIHsKKyAgICAgICAgICAgIC8qIERlc2NPd24gYml0IGlzIHN0aWxsIHNldCwgd2Ugc2hvdWxkIHdhaXQgZm9yIFJYIHRvIGNvbXBsZXRlICovCisgICAgICAgICAgICBwYWNrZXRfcmVjZWl2ZWQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFyZXRyaWV2ZSApIHsKKyAgICAgICAgICAgIHBhY2tldF9yZWNlaXZlZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoc3RhdHVzICYgMHgzODAwODMwMCkgIT0gMHgwMzAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXR1cyAmIDB4MzgwMDAzMDApICE9IDB4MDMwMCkgeworICAgICAgICAgICAgICAgIC8qIEluZ29yZSBlYXJsaWVyIGJ1ZmZlcnMuICovCisgICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgJiAweGZmZmYpICE9IDB4N2ZmZikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIndpbmJvbmQtODQwIDogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lIHNwYW5uZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIGJ1ZmZlcnMsIGVudHJ5ICVkIHN0YXR1cyAlWCAhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdzg0MHByaXZhdGUuY3VyX3J4LCAodW5zaWduZWQgaW50KSBzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICYgMHg4MDAwKSB7CisgICAgICAgICAgICAgICAgLyogVGhlcmUgd2FzIGEgZmF0YWwgZXJyb3IuICovCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgICAgICAgICAgICAgIHByaW50Zigid2luYm9uZC04NDAgOiBSZWNlaXZlIGVycm9yLCBSeCBzdGF0dXMgJVggOiIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIDB4MDg5MCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBSWExFTl9FUlJPUiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgMHgwMDRDKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBGUkFNRV9FUlJPUiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgMHgwMDAyKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBDUkNfRVJST1IiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAvKiBTaW1weSBkbyBhIHJlc2V0IG5vdy4uLiAqLworICAgICAgICAgICAgICAgIHc4OWM4NDBfcmVzZXQobmljKTsKKworICAgICAgICAgICAgICAgIHBhY2tldF9yZWNlaXZlZCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBPbWl0IHRoZSBmb3VyIG9jdGV0IENSQyBmcm9tIHRoZSBsZW5ndGguICovCisgICAgICAgICAgICBpbnQgcGt0X2xlbiA9ICgoc3RhdHVzID4+IDE2KSAmIDB4N2ZmKSAtIDQ7CisKKyNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCisgICAgICAgICAgICBwcmludGYoIiBuZXRkZXZfcngoKSBub3JtYWwgUnggcGt0IHJpbmcgJWQgbGVuZ3RoICVkIHN0YXR1cyAlWFxuIiwgZW50cnksIHBrdF9sZW4sIHN0YXR1cyk7CisjZW5kaWYKKworICAgICAgICAgICAgbmljLT5wYWNrZXRsZW4gPSBwa3RfbGVuOworCisgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGFjY2VwdCB3aXRob3V0IGNvcHlpbmcKKyAgICAgICAgICAgICAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKworICAgICAgICAgICAgbWVtY3B5KG5pYy0+cGFja2V0LCBsZTMyZGVzY190b192aXJ0KHc4NDBwcml2YXRlLnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpLCBwa3RfbGVuKTsKKyAgICAgICAgICAgIHBhY2tldF9yZWNlaXZlZCA9IDE7CisKKyAgICAgICAgICAgIC8qIFJlbGVhc2UgYnVmZmVyIHRvIE5JQyAqLworICAgICAgICAgICAgdzg0MHByaXZhdGUucnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gRGVzY093bjsKKworI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKKyAgICAgICAgICAgIC8qIFlvdSB3aWxsIHdhbnQgdGhpcyBpbmZvIGZvciB0aGUgaW5pdGlhbCBkZWJ1Zy4gKi8KKyAgICAgICAgICAgIHByaW50ZigiICBSeCBkYXRhICVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWDoiCisgICAgICAgICAgICAgICAgICAgIiVoaFggJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFggJWhoWCVoaFggIgorICAgICAgICAgICAgICAgICAgICIlaGhYLiVoaFguJWhoWC4laGhYLlxuIiwKKyAgICAgICAgICAgICAgICAgICBuaWMtPnBhY2tldFswXSwgIG5pYy0+cGFja2V0WzFdLCAgbmljLT5wYWNrZXRbMl0sIG5pYy0+cGFja2V0WzNdLAorICAgICAgICAgICAgICAgICAgIG5pYy0+cGFja2V0WzRdLCAgbmljLT5wYWNrZXRbNV0sICBuaWMtPnBhY2tldFs2XSwgbmljLT5wYWNrZXRbN10sCisgICAgICAgICAgICAgICAgICAgbmljLT5wYWNrZXRbOF0sICBuaWMtPnBhY2tldFs5XSwgIG5pYy0+cGFja2V0WzEwXSwKKyAgICAgICAgICAgICAgICAgICBuaWMtPnBhY2tldFsxMV0sIG5pYy0+cGFja2V0WzEyXSwgbmljLT5wYWNrZXRbMTNdLAorICAgICAgICAgICAgICAgICAgIG5pYy0+cGFja2V0WzE0XSwgbmljLT5wYWNrZXRbMTVdLCBuaWMtPnBhY2tldFsxNl0sCisgICAgICAgICAgICAgICAgICAgbmljLT5wYWNrZXRbMTddKTsKKyNlbmRpZgorCisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9ICgrK3c4NDBwcml2YXRlLmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisgICAgICAgIHc4NDBwcml2YXRlLnJ4X2hlYWRfZGVzYyA9ICZ3ODQwcHJpdmF0ZS5yeF9yaW5nW2VudHJ5XTsKKyAgICB9IHdoaWxlICgwKTsKKyAgICAKKyAgICByZXR1cm4gcGFja2V0X3JlY2VpdmVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3c4OWM4NDBfdHJhbnNtaXQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHc4OWM4NDBfdHJhbnNtaXQoCisgICAgc3RydWN0IG5pYyAqbmljLAorICAgIGNvbnN0IGNoYXIgKmQsICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICB1bnNpZ25lZCBpbnQgdCwgICAgICAgICAgICAvKiBUeXBlICovCisgICAgdW5zaWduZWQgaW50IHMsICAgICAgICAgICAgLyogc2l6ZSAqLworICAgIGNvbnN0IGNoYXIgKnApICAgICAgICAgICAgLyogUGFja2V0ICovCit7CisgICAgLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisgICAgdW5zaWduZWQgZW50cnk7CisgICAgaW50IHRyYW5zbWl0X3N0YXR1czsKKyAgICB1bnNpZ25lZCBsb25nIGN0OworCisgICAgLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGZpZWxkCisgICAgICAgd2l0aCB0aGUgIm93bmVyc2hpcCIgYml0cyBsYXN0LiAqLworCisgICAgLyogRmlsbCBpbiBvdXIgdHJhbnNtaXQgYnVmZmVyICovCisgICAgZW50cnkgPSB3ODQwcHJpdmF0ZS5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisKKyAgICBtZW1jcHkgKHc4OWM4NDBfYnVmLnR4X3BhY2tldCwgZCwgRVRIX0FMRU4pOyAgICAvKiBkc3QgKi8KKyAgICBtZW1jcHkgKHc4OWM4NDBfYnVmLnR4X3BhY2tldCArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOy8qc3JjKi8KKworICAgICooKGNoYXIgKikgdzg5Yzg0MF9idWYudHhfcGFja2V0ICsgMTIpID0gdCA+PiA4OyAgICAvKiB0eXBlICovCisgICAgKigoY2hhciAqKSB3ODljODQwX2J1Zi50eF9wYWNrZXQgKyAxMykgPSB0OworCisgICAgbWVtY3B5ICh3ODljODQwX2J1Zi50eF9wYWNrZXQgKyBFVEhfSExFTiwgcCwgcyk7CisgICAgcyArPSBFVEhfSExFTjsKKworICAgIHdoaWxlIChzIDwgRVRIX1pMRU4pCisgICAgKigoY2hhciAqKSB3ODljODQwX2J1Zi50eF9wYWNrZXQgKyBFVEhfSExFTiArIChzKyspKSA9IDA7CisKKyAgICB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5idWZmZXIxCisJICAgID0gdmlydF90b19sZTMyZGVzYyh3ODljODQwX2J1Zi50eF9wYWNrZXQpOworCisgICAgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gKERlc2NXaG9sZVBrdCB8ICh1MzIpIHMpOworICAgIGlmIChlbnRyeSA+PSBUWF9SSU5HX1NJWkUtMSkgICAgICAgICAvKiBXcmFwIHJpbmcgKi8KKyAgICAgICAgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0ubGVuZ3RoIHw9IChEZXNjSW50ciB8IERlc2NFbmRSaW5nKTsKKyAgICB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSAoRGVzY093bik7CisgICAgdzg0MHByaXZhdGUuY3VyX3R4Kys7CisKKyAgICB3ODQwcHJpdmF0ZS50eF9xX2J5dGVzID0gKHUxNikgczsKKyAgICB3cml0ZWwoMCwgaW9hZGRyICsgVHhTdGFydERlbWFuZCk7CisKKyAgICAvKiBXb3JrIGFyb3VuZCBob3JyaWJsZSBidWcgaW4gdGhlIGNoaXAgYnkgbWFya2luZyB0aGUgcXVldWUgYXMgZnVsbAorICAgICAgIHdoZW4gd2UgZG8gbm90IGhhdmUgRklGTyByb29tIGZvciBhIG1heGltdW0gc2l6ZWQgcGFja2V0LiAqLworCisgICAgaWYgKCh3ODQwcHJpdmF0ZS5kcnZfZmxhZ3MgJiBIYXNCcm9rZW5UeCkgJiYgdzg0MHByaXZhdGUudHhfcV9ieXRlcyA+IFRYX0JVR19GSUZPX0xJTUlUKSB7CisgICAgICAgIC8qIEFjdHVhbGx5IHRoaXMgaXMgbGVmdCB0byBoZWxwIGZpbmRpbmcgZXJyb3IgdGFpbHMgbGF0ZXIgaW4gZGVidWdnaW5nLi4uCisgICAgICAgICAqIFNlZSBMaW51eCBrZXJuZWwgZHJpdmVyIGluIHdpbmJvbmQtODQwLmMgZm9yIGRldGFpbHMuCisgICAgICAgICAqLworICAgICAgICB3ODQwcHJpdmF0ZS50eF9mdWxsID0gMTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCisgICAgcHJpbnRmKCJ3aW5ib25kLTg0MCA6IFRyYW5zbWl0IGZyYW1lICMgJWQgc2l6ZSAlZCBxdWV1ZWQgaW4gc2xvdCAlZC5cbiIsIHc4NDBwcml2YXRlLmN1cl90eCwgcywgZW50cnkpOworI2VuZGlmCisKKyAgICAvKiBOb3cgd2FpdCBmb3IgVFggdG8gY29tcGxldGUuICovCisgICAgdHJhbnNtaXRfc3RhdHVzID0gdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0uc3RhdHVzOworCisgICAgY3QgPSBjdXJydGlja3MoKTsKKyAgICB7CisjaWYgZGVmaW5lZCBXODlDODQwX0RFQlVHCisgICAgICAgIHUzMiBpbnRyX3N0YXQgPSAwOworI2VuZGlmCisgICAgICAgIHdoaWxlICgxKSB7CisKKyNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCisJICAgICAgZGVjb2RlX2ludGVycnVwdChpbnRyX3N0YXQpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICB3aGlsZSAoICh0cmFuc21pdF9zdGF0dXMgJiBEZXNjT3duKSAmJiBjdCArIFRYX1RJTUVPVVQgPCBjdXJydGlja3MoKSkgeworCisgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0X3N0YXR1cyA9IHc4NDBwcml2YXRlLnR4X3JpbmdbZW50cnldLnN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgodHJhbnNtaXRfc3RhdHVzICYgRGVzY093bikgPT0gMCkgeworCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgICAgICBwcmludGYoIndpbmJvbmQtODQwIDogdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGFmdGVyIHdhaXQgbG9vcCBpdGVyYXRpb25zLCBzdGF0dXMgJVhcbiIsCisgICAgICAgICAgICAgICAgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKyNlbmRpZgorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBUcmFuc21pdCB0aW1lZCBvdXQuLi4gKi8KKworICAgIHByaW50Zigid2luYm9uZC04NDAgOiB0cmFuc21pc3Npb24gVElNRU9VVCA6IHN0YXR1cyAlWFxuIiwgCisJICAgKHVuc2lnbmVkIGludCkgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit3ODljODQwX2Rpc2FibGUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHc4OWM4NDBfZGlzYWJsZSAoIHN0cnVjdCBuaWMgKm5pYyApIHsKKworICAgIHc4OWM4NDBfcmVzZXQobmljKTsKKworICAgIC8qIERvbid0IGtub3cgd2hhdCB0byBkbyB0byBkaXNhYmxlIHRoZSBib2FyZC4gSXMgdGhpcyBuZWVkZWQgYXQgYWxsPyAqLworICAgIC8qIFllcywgYSBsaXZlIE5JQyBjYW4gY29ycnVwdCB0aGUgbG9hZGVkIG1lbW9yeSBsYXRlciBbS2VuXSAqLworICAgIC8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworICAgIHdyaXRlbCh3ODQwcHJpdmF0ZS5jc3I2ICY9IH4weDIwRkEsIGlvYWRkciArIE5ldHdvcmtDb25maWcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3c4OWM4NDBfaXJxIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3ODljODQwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIHc4OWM4NDBfb3BlcmF0aW9ucyA9IHsKKwkuY29ubmVjdAk9IGR1bW15X2Nvbm5lY3QsCisJLnBvbGwJCT0gdzg5Yzg0MF9wb2xsLAorCS50cmFuc21pdAk9IHc4OWM4NDBfdHJhbnNtaXQsCisJLmlycQkJPSB3ODljODQwX2lycSwKKworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHc4OWM4NDBfbmljc1tdID0geworUENJX1JPTSgweDEwNTAsIDB4MDg0MCwgIndpbmJvbmQ4NDAiLCAgICAgIldpbmJvbmQgVzg5Qzg0MEYiLCAwKSwKK1BDSV9ST00oMHgxMWY2LCAweDIwMTEsICJjb21wZXhybDEwMGF0eCIsICJDb21wZXggUkwxMDBBVFgiLCAwKSwKK307CisKK1BDSV9EUklWRVIgKCB3ODljODQwX2RyaXZlciwgdzg5Yzg0MF9uaWNzLCBQQ0lfTk9fQ0xBU1MgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit3ODljODQwX3Byb2JlIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3ODljODQwX3Byb2JlICggc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcCApIHsKKworCisgICAgdTE2IHN1bSA9IDA7CisgICAgaW50IGksIGo7CisgICAgdW5zaWduZWQgc2hvcnQgdmFsdWU7CisKKyAgICBpZiAocC0+aW9hZGRyID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgbmljLT5pb2FkZHIgPSBwLT5pb2FkZHI7CisgICAgbmljLT5pcnFubyAgPSAwOworCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgIHByaW50Zigid2luYm9uZC04NDA6IFBDSSBidXMgJWhoWCBkZXZpY2UgZnVuY3Rpb24gJWhoWDogSS9PIGFkZHJlc3M6ICVoWFxuIiwgcC0+YnVzLCBwLT5kZXZmbiwgaW9hZGRyKTsKKyNlbmRpZgorCisgICAgaW9hZGRyID0gaW9hZGRyICYgfjM7IC8qIE1hc2sgdGhlIGJpdCB0aGF0IHNheXMgInRoaXMgaXMgYW4gaW8gYWRkciIgKi8KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dJTkJPTkQyXzg5Qzg0MCAgIDB4MDg0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBFWF9STDEwMEFUWCAgIDB4MjAxMQorCisgICAgLyogRnJvbSBNYXR0IEhvcnRtYW4gPG1iaG9ydG1hbkBhY3B0aGluY2xpZW50LmNvbT4gKi8KKyAgICBpZiAocC0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfV0lOQk9ORDIKKyAgICAgICAgJiYgcC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfODlDODQwKSB7CisKKyAgICAgICAgLyogZGV0ZWN0ZWQgIldpbmJvbmQgVzg5Yzg0MCBGYXN0IEV0aGVybmV0IFBDSSBOSUMiICovCisKKyAgICB9IGVsc2UgaWYgKCBwLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9DT01QRVgKKyAgICAgICAgICAgICAgICAmJiBwLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DT01QRVhfUkwxMDBBVFgpIHsKKworICAgICAgICAvKiBkZXRlY3RlZCAiQ29tcGV4IFJMMTAwQVRYIEZhc3QgRXRoZXJuZXQgUENJIE5JQyIgKi8KKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEdlZSwgZ3Vlc3Mgd2hhdD8gVGhleSBtaXNzZWQgYWdhaW4uICovCisgICAgICAgIHByaW50ZigiZGV2aWNlIElEIDogJVggLSBpcyBub3QgYSBDb21wZXggUkwxMDBBVFggTklDLlxuIiwKKwkgICAgICAgcC0+ZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJpbnRmKCIgJXNcbiIsIHc4OWM4NDBfdmVyc2lvbik7CisKKyAgICBhZGp1c3RfcGNpX2RldmljZShwKTsKKworICAgIC8qIE9rLiBHb3Qgb25lLiBSZWFkIHRoZSBlZXByb20uICovCisgICAgZm9yIChqID0gMCwgaSA9IDA7IGkgPCAweDQwOyBpKyspIHsKKyAgICAgICAgdmFsdWUgPSBlZXByb21fcmVhZChpb2FkZHIsIGkpOworICAgICAgICBlZXByb21baV0gPSB2YWx1ZTsKKyAgICAgICAgc3VtICs9IHZhbHVlOworICAgIH0KKworICAgIGZvciAoaT0wO2k8RVRIX0FMRU47aSsrKSB7CisgICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gIChlZXByb21baS8yXSA+PiAoOCooaSYxKSkpICYgMHhmZjsKKyAgICB9CisKKyAgICBEQkcgKCAiRXRoZXJuZXQgYWRkcjogJXNcbiIsIGV0aF9udG9hICggbmljLT5ub2RlX2FkZHIgKSApOworCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgIHByaW50Zigid2luYm9uZC04NDA6IEVFUFJPTSBjaGVja3N1bSAlaFgsIGdvdCBlZXByb20iLCBzdW0pOworI2VuZGlmCisKKyAgICAvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLgorICAgICAgIE5vIGhvbGQgdGltZSByZXF1aXJlZCEgKi8KKyAgICB3cml0ZWwoMHgwMDAwMDAwMSwgaW9hZGRyICsgUENJQnVzQ2ZnKTsKKworICAgIGlmIChkcml2ZXJfZmxhZ3MgJiBDYW5IYXZlTUlJKSB7CisgICAgICAgIGludCBwaHksIHBoeV9pZHggPSAwOworICAgICAgICBmb3IgKHBoeSA9IDE7IHBoeSA8IDMyICYmIHBoeV9pZHggPCA0OyBwaHkrKykgeworICAgICAgICAgICAgaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHksIDEpOworICAgICAgICAgICAgaWYgKG1paV9zdGF0dXMgIT0gMHhmZmZmICAmJiAgbWlpX3N0YXR1cyAhPSAweDAwMDApIHsKKyAgICAgICAgICAgICAgICB3ODQwcHJpdmF0ZS5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisgICAgICAgICAgICAgICAgdzg0MHByaXZhdGUuYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHksIDQpOworCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgICAgICAgICAgICAgIHByaW50Zigid2luYm9uZC04NDAgOiBNSUkgUEhZIGZvdW5kIGF0IGFkZHJlc3MgJWQsIHN0YXR1cyAiCisgICAgICAgICAgICAgICAgICAgICAgICIlWCBhZHZlcnRpc2luZyAlaFguXG4iLCBwaHksIG1paV9zdGF0dXMsIHc4NDBwcml2YXRlLmFkdmVydGlzaW5nKTsKKyNlbmRpZgorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3ODQwcHJpdmF0ZS5taWlfY250ID0gcGh5X2lkeDsKKworICAgICAgICBpZiAocGh5X2lkeCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJ3aW5ib25kLTg0MCA6IE1JSSBQSFkgbm90IGZvdW5kIC0tIHRoaXMgZGV2aWNlIG1heSBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworICAgIG5pYy0+bmljX29wCT0gJnc4OWM4NDBfb3BlcmF0aW9uczsKKworICAgIHc4OWM4NDBfcmVzZXQobmljKTsKKworICAgIHJldHVybiAxOworfQorCisvKiBSZWFkIHRoZSBFRVBST00gYW5kIE1JSSBNYW5hZ2VtZW50IERhdGEgSS9PIChNRElPKSBpbnRlcmZhY2VzLiAgVGhlc2UgYXJlCisgICBvZnRlbiBzZXJpYWwgYml0IHN0cmVhbXMgZ2VuZXJhdGVkIGJ5IHRoZSBob3N0IHByb2Nlc3Nvci4KKyAgIFRoZSBleGFtcGxlIGJlbG93IGlzIGZvciB0aGUgY29tbW9uIDkzYzQ2IEVFUFJPTSwgNjQgMTYgYml0IHdvcmRzLiAqLworCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4KKyAgIE5vIGV4dHJhIGRlbGF5IGlzIG5lZWRlZCB3aXRoIDMzTWh6IFBDSSwgYnV0IGZ1dHVyZSA2Nk1oeiBhY2Nlc3MgbWF5IG5lZWQKKyAgIGEgZGVsYXkuICBOb3RlIHRoYXQgcHJlLTIuMC4zNCBrZXJuZWxzIGhhZCBhIGNhY2hlLWFsaWdubWVudCBidWcgdGhhdAorICAgbWFkZSB1ZGVsYXkoKSB1bnJlbGlhYmxlLgorICAgVGhlIG9sZCBtZXRob2Qgb2YgdXNpbmcgYW4gSVNBIGFjY2VzcyBhcyBhIGRlbGF5LCBfX1NMT1dfRE9XTl9JT19fLCBpcworICAgZGVwcmljYXRlZC4KKyovCisjZGVmaW5lIGVlcHJvbV9kZWxheShlZV9hZGRyKSAgICByZWFkbChlZV9hZGRyKQorCitlbnVtIEVFUFJPTV9DdHJsX0JpdHMgeworICAgIEVFX1NoaWZ0Q2xrPTB4MDIsIEVFX1dyaXRlMD0weDgwMSwgRUVfV3JpdGUxPTB4ODA1LAorICAgIEVFX0NoaXBTZWxlY3Q9MHg4MDEsIEVFX0RhdGFJbj0weDA4LAorfTsKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCitlbnVtIEVFUFJPTV9DbWRzIHsKKyAgICBFRV9Xcml0ZUNtZD0oNSA8PCA2KSwgRUVfUmVhZENtZD0oNiA8PCA2KSwgRUVfRXJhc2VDbWQ9KDcgPDwgNiksCit9OworCitzdGF0aWMgaW50IGVlcHJvbV9yZWFkKGxvbmcgYWRkciwgaW50IGxvY2F0aW9uKQoreworICAgIGludCBpOworICAgIGludCByZXR2YWwgPSAwOworICAgIGludCBlZV9hZGRyID0gYWRkciArIEVFQ3RybDsKKyAgICBpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JlYWRDbWQ7CisgICAgd3JpdGVsKEVFX0NoaXBTZWxlY3QsIGVlX2FkZHIpOworCisgICAgLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKyAgICBmb3IgKGkgPSAxMDsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgc2hvcnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX1dyaXRlMSA6IEVFX1dyaXRlMDsKKyAgICAgICAgd3JpdGVsKGRhdGF2YWwsIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoZWVfYWRkcik7CisgICAgICAgIHdyaXRlbChkYXRhdmFsIHwgRUVfU2hpZnRDbGssIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoZWVfYWRkcik7CisgICAgfQorICAgIHdyaXRlbChFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKKworICAgIGZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisgICAgICAgIHdyaXRlbChFRV9DaGlwU2VsZWN0IHwgRUVfU2hpZnRDbGssIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoZWVfYWRkcik7CisgICAgICAgIHJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKHJlYWRsKGVlX2FkZHIpICYgRUVfRGF0YUluKSA/IDEgOiAwKTsKKyAgICAgICAgd3JpdGVsKEVFX0NoaXBTZWxlY3QsIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoZWVfYWRkcik7CisgICAgfQorCisgICAgLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworICAgIHdyaXRlbCgwLCBlZV9hZGRyKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiAgTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAgICBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQgc2VyaWFsCisgICAgTURJTyBwcm90b2NvbC4gIFNlZSB0aGUgTUlJIHNwZWNpZmljYXRpb25zIG9yIERQODM4NDBBIGRhdGEgc2hlZXQKKyAgICBmb3IgZGV0YWlscy4KKworICAgIFRoZSBtYXhpbXVtIGRhdGEgY2xvY2sgcmF0ZSBpcyAyLjUgTWh6LiAgVGhlIG1pbmltdW0gdGltaW5nIGlzIHVzdWFsbHkKKyAgICBtZXQgYnkgYmFjay10by1iYWNrIDMzTWh6IFBDSSBjeWNsZXMuICovCisjZGVmaW5lIG1kaW9fZGVsYXkobWRpb19hZGRyKSByZWFkbChtZGlvX2FkZHIpCisKKy8qIFNldCBpZmYgYSBNSUkgdHJhbnNjZWl2ZXIgb24gYW55IGludGVyZmFjZSByZXF1aXJlcyBtZGlvIHByZWFtYmxlLgorICAgVGhpcyBvbmx5IHNldCB3aXRoIG9sZGVyIHRyYW5jZWl2ZXJzLCBzbyB0aGUgZXh0cmEKKyAgIGNvZGUgc2l6ZSBvZiBhIHBlci1pbnRlcmZhY2UgZmxhZyBpcyBub3Qgd29ydGh3aGlsZS4gKi8KK3N0YXRpYyBjaGFyIG1paV9wcmVhbWJsZV9yZXF1aXJlZCA9IDE7CisKKyNkZWZpbmUgTURJT19XUklURTAgKE1ESU9fRW5iT3V0cHV0KQorI2RlZmluZSBNRElPX1dSSVRFMSAoTURJT19EYXRhT3V0IHwgTURJT19FbmJPdXRwdXQpCisKKy8qIEdlbmVyYXRlIHRoZSBwcmVhbWJsZSByZXF1aXJlZCBmb3IgaW5pdGlhbCBzeW5jaHJvbml6YXRpb24gYW5kCisgICBhIGZldyBvbGRlciB0cmFuc2NlaXZlcnMuICovCitzdGF0aWMgdm9pZCBtZGlvX3N5bmMobG9uZyBtZGlvX2FkZHIpCit7CisgICAgaW50IGJpdHMgPSAzMjsKKworICAgIC8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KKyAgICB3aGlsZSAoLS1iaXRzID49IDApIHsKKyAgICAgICAgd3JpdGVsKE1ESU9fV1JJVEUxLCBtZGlvX2FkZHIpOworICAgICAgICBtZGlvX2RlbGF5KG1kaW9fYWRkcik7CisgICAgICAgIHdyaXRlbChNRElPX1dSSVRFMSB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisgICAgICAgIG1kaW9fZGVsYXkobWRpb19hZGRyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKGludCBiYXNlX2FkZHJlc3MsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKyAgICBsb25nIG1kaW9fYWRkciA9IGJhc2VfYWRkcmVzcyArIE1JSUN0cmw7CisgICAgaW50IG1paV9jbWQgPSAoMHhmNiA8PCAxMCkgfCAocGh5X2lkIDw8IDUpIHwgbG9jYXRpb247CisgICAgaW50IGksIHJldHZhbCA9IDA7CisKKyAgICBpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorICAgICAgICBtZGlvX3N5bmMobWRpb19hZGRyKTsKKworICAgIC8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisgICAgZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGludCBkYXRhdmFsID0gKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCisgICAgICAgIHdyaXRlbChkYXRhdmFsLCBtZGlvX2FkZHIpOworICAgICAgICBtZGlvX2RlbGF5KG1kaW9fYWRkcik7CisgICAgICAgIHdyaXRlbChkYXRhdmFsIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKyAgICAgICAgbWRpb19kZWxheShtZGlvX2FkZHIpOworICAgIH0KKyAgICAvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLworICAgIGZvciAoaSA9IDIwOyBpID4gMDsgaS0tKSB7CisgICAgICAgIHdyaXRlbChNRElPX0VuYkluLCBtZGlvX2FkZHIpOworICAgICAgICBtZGlvX2RlbGF5KG1kaW9fYWRkcik7CisgICAgICAgIHJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKHJlYWRsKG1kaW9fYWRkcikgJiBNRElPX0RhdGFJbikgPyAxIDogMCk7CisgICAgICAgIHdyaXRlbChNRElPX0VuYkluIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKyAgICAgICAgbWRpb19kZWxheShtZGlvX2FkZHIpOworICAgIH0KKyAgICByZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKGludCBiYXNlX2FkZHJlc3MsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworICAgIGxvbmcgbWRpb19hZGRyID0gYmFzZV9hZGRyZXNzICsgTUlJQ3RybDsKKyAgICBpbnQgbWlpX2NtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb248PDE4KSB8IHZhbHVlOworICAgIGludCBpOworCisgICAgaWYgKGxvY2F0aW9uID09IDQgICYmICBwaHlfaWQgPT0gdzg0MHByaXZhdGUucGh5c1swXSkKKyAgICAgICAgdzg0MHByaXZhdGUuYWR2ZXJ0aXNpbmcgPSB2YWx1ZTsKKworICAgIGlmIChtaWlfcHJlYW1ibGVfcmVxdWlyZWQpCisgICAgICAgIG1kaW9fc3luYyhtZGlvX2FkZHIpOworCisgICAgLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisgICAgZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGludCBkYXRhdmFsID0gKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCisgICAgICAgIHdyaXRlbChkYXRhdmFsLCBtZGlvX2FkZHIpOworICAgICAgICBtZGlvX2RlbGF5KG1kaW9fYWRkcik7CisgICAgICAgIHdyaXRlbChkYXRhdmFsIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKyAgICAgICAgbWRpb19kZWxheShtZGlvX2FkZHIpOworICAgIH0KKyAgICAvKiBDbGVhciBvdXQgZXh0cmEgYml0cy4gKi8KKyAgICBmb3IgKGkgPSAyOyBpID4gMDsgaS0tKSB7CisgICAgICAgIHdyaXRlbChNRElPX0VuYkluLCBtZGlvX2FkZHIpOworICAgICAgICBtZGlvX2RlbGF5KG1kaW9fYWRkcik7CisgICAgICAgIHdyaXRlbChNRElPX0VuYkluIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKyAgICAgICAgbWRpb19kZWxheShtZGlvX2FkZHIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY2hlY2tfZHVwbGV4KHZvaWQpCit7CisgICAgaW50IG1paV9yZWc1ID0gbWRpb19yZWFkKGlvYWRkciwgdzg0MHByaXZhdGUucGh5c1swXSwgNSk7CisgICAgaW50IG5lZ290aWF0ZWQgPSAgbWlpX3JlZzUgJiB3ODQwcHJpdmF0ZS5hZHZlcnRpc2luZzsKKyAgICBpbnQgZHVwbGV4OworCisgICAgaWYgKHc4NDBwcml2YXRlLmR1cGxleF9sb2NrICB8fCAgbWlpX3JlZzUgPT0gMHhmZmZmKQorICAgICAgICByZXR1cm47CisKKyAgICBkdXBsZXggPSAobmVnb3RpYXRlZCAmIDB4MDEwMCkgfHwgKG5lZ290aWF0ZWQgJiAweDAxQzApID09IDB4MDA0MDsKKyAgICBpZiAodzg0MHByaXZhdGUuZnVsbF9kdXBsZXggIT0gZHVwbGV4KSB7CisgICAgICAgIHc4NDBwcml2YXRlLmZ1bGxfZHVwbGV4ID0gZHVwbGV4OyAgICAgICAKKworI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKKyAgICAgICAgcHJpbnRmKCJ3aW5ib25kLTg0MCA6IFNldHRpbmcgJXMtZHVwbGV4IGJhc2VkIG9uIE1JSSAjICVkIG5lZ290aWF0ZWQgY2FwYWJpbGl0eSAlWFxuIiwKKyAgICAgICAgICAgICAgIGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwgdzg0MHByaXZhdGUucGh5c1swXSwgbmVnb3RpYXRlZCk7CisjZW5kaWYKKworICAgICAgICB3ODQwcHJpdmF0ZS5jc3I2ICY9IH4weDIwMDsKKyAgICAgICAgdzg0MHByaXZhdGUuY3NyNiB8PSBkdXBsZXggPyAweDIwMCA6IDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZSh2b2lkKQoreworICAgIHUzMiBtY19maWx0ZXJbMl07ICAgICAgICAgICAgLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisgICAgdTMyIHJ4X21vZGU7CisKKyAgICAvKiBBY2NlcHQgYWxsIG11bHRpY2FzdHMgZnJvbSBub3cgb24uICovCisgICAgbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCisvKgorICogd29ya3MgT0sgd2l0aCBtdWx0aWNhc3QgZW5hYmxlZC4gCisgKi8KKworICAgIHJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNeVBoeXMgfCBBY2NlcHRNdWx0aWNhc3Q7CisKKyAgICB3cml0ZWwobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIwKTsKKyAgICB3cml0ZWwobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKKyAgICB3ODQwcHJpdmF0ZS5jc3I2ICY9IH4weDAwRjg7CisgICAgdzg0MHByaXZhdGUuY3NyNiB8PSByeF9tb2RlOworICAgIHdyaXRlbCh3ODQwcHJpdmF0ZS5jc3I2LCBpb2FkZHIgKyBOZXR3b3JrQ29uZmlnKTsKKworI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKKyAgICBwcmludGYoIndpbmJvbmQtODQwIDogRG9uZSBzZXR0aW5nIFJYIG1vZGUuXG4iKTsKKyNlbmRpZgorfQorCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgY2hhciAqIHA7CisKKyAgICB3ODQwcHJpdmF0ZS50eF9mdWxsID0gMDsKKyAgICB3ODQwcHJpdmF0ZS50eF9xX2J5dGVzID0gdzg0MHByaXZhdGUuY3VyX3J4ID0gdzg0MHByaXZhdGUuY3VyX3R4ID0gMDsKKyAgICB3ODQwcHJpdmF0ZS5kaXJ0eV9yeCA9IHc4NDBwcml2YXRlLmRpcnR5X3R4ID0gMDsKKworICAgIHc4NDBwcml2YXRlLnJ4X2J1Zl9zeiA9IFBLVF9CVUZfU1o7CisgICAgdzg0MHByaXZhdGUucnhfaGVhZF9kZXNjID0gJnc4NDBwcml2YXRlLnJ4X3JpbmdbMF07CisKKyAgICAvKiBJbml0aWFsIGFsbCBSeCBkZXNjcmlwdG9ycy4gRmlsbCBpbiB0aGUgUnggYnVmZmVycy4gKi8KKworICAgIHAgPSAmdzg5Yzg0MF9idWYucnhfcGFja2V0WzBdOworCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisgICAgICAgIHc4NDBwcml2YXRlLnJ4X3JpbmdbaV0ubGVuZ3RoID0gdzg0MHByaXZhdGUucnhfYnVmX3N6OworICAgICAgICB3ODQwcHJpdmF0ZS5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisgICAgICAgIHc4NDBwcml2YXRlLnJ4X3JpbmdbaV0ubmV4dF9kZXNjID0gdmlydF90b19sZTMyZGVzYygmdzg0MHByaXZhdGUucnhfcmluZ1tpKzFdKTsKKworICAgICAgICB3ODQwcHJpdmF0ZS5yeF9yaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2xlMzJkZXNjKHAgKyAoUEtUX0JVRl9TWiAqIGkpKTsKKyAgICAgICAgdzg0MHByaXZhdGUucnhfcmluZ1tpXS5zdGF0dXMgPSBEZXNjT3duIHwgRGVzY0ludHI7CisgICAgfQorCisgICAgLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKyAgICB3ODQwcHJpdmF0ZS5yeF9yaW5nW2ktMV0ubGVuZ3RoIHw9IERlc2NFbmRSaW5nOworICAgIHc4NDBwcml2YXRlLnJ4X3JpbmdbaS0xXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZ3ODQwcHJpdmF0ZS5yeF9yaW5nWzBdKTsKKworICAgIHc4NDBwcml2YXRlLmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKyAgICAgICAgdzg0MHByaXZhdGUudHhfcmluZ1tpXS5zdGF0dXMgPSAwOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworRFJJVkVSICggIlc4OUM4NDBGIiwgbmljX2RyaXZlciwgcGNpX2RyaXZlciwgdzg5Yzg0MF9kcml2ZXIsCisJIHc4OWM4NDBfcHJvYmUsIHc4OWM4NDBfZGlzYWJsZSApOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvd2QuYyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzOWFhMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2RyaXZlcnMvbmV0L3dkLmMKQEAgLTAsMCArMSw2IEBACisvKiBJU0EgbWVtb3J5LW1hcHBlZCBOUzgzOTAtYmFzZWQgY2FyZHMsIGluY2x1ZGluZyBXRDgweDMgKi8KKyNpZiAwIC8qIEN1cnJlbnRseSBicm9rZW4hICovCisjZGVmaW5lIElOQ0xVREVfV0QKKyNkZWZpbmUgV0RfREVGQVVMVF9NRU0gMHhDQzAwMAorI2luY2x1ZGUgIm5zODM5MC5jIgorI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9kcml2ZXJzL25ldC93bGFuX2NvbXBhdC5oIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvd2xhbl9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjc2OTNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9uZXQvd2xhbl9jb21wYXQuaApAQCAtMCwwICsxLDU3NyBAQAorLyogc3JjL2luY2x1ZGUvd2xhbi93bGFuX2NvbXBhdC5oCisqCisqIFR5cGVzIGFuZCBtYWNyb3MgdG8gYWlkIGluIHBvcnRhYmlsaXR5CisqCisqIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqCisqIGxpbnV4LXdsYW4KKyoKKyogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYworKiAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisqICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisqICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisqCisqICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCisqICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorKiAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyogICB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKKyogICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorKiAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCisqICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCisqICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyogICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKKyogICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcworKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKyoKKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoKKyogSW5xdWlyaWVzIHJlZ2FyZGluZyB0aGUgbGludXgtd2xhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNhbiBiZQorKiBtYWRlIGRpcmVjdGx5IHRvOgorKgorKiBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMgSW5jLgorKiBpbmZvQGxpbnV4LXdsYW4uY29tCisqIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KKyoKKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoKKyogUG9ydGlvbnMgb2YgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgc29mdHdhcmUgd2VyZSBmdW5kZWQgYnkgCisqIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgorKgorKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKyNpZm5kZWYgX1dMQU5fQ09NUEFUX0gKKyNkZWZpbmUgX1dMQU5fQ09NUEFUX0gKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tIEVzdGFibGlzaCBQbGF0Zm9ybSBJZGVudGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogS2V5IG1hY3JvczogKi8KKy8qIFdMQU5fQ1BVX0ZBTUlMWSAqLworCSNkZWZpbmUgV0xBTl9JeDg2CQkJMQorCSNkZWZpbmUgV0xBTl9QUEMJCQkyCisJI2RlZmluZSBXTEFOX0l4OTYJCQkzCisJI2RlZmluZSBXTEFOX0FSTQkJCTQKKwkjZGVmaW5lIFdMQU5fQUxQSEEJCQk1CisJI2RlZmluZSBXTEFOX01JUFMJCQk2CisJI2RlZmluZSBXTEFOX0hQUEEJCQk3CisvKiBXTEFOX0NQVV9DT1JFICovCisJI2RlZmluZSBXTEFOX0kzODZDT1JFCQkJMQorCSNkZWZpbmUgV0xBTl9QUENDT1JFCQkJMgorCSNkZWZpbmUgV0xBTl9JMjk2CQkJMworCSNkZWZpbmUgV0xBTl9BUk1DT1JFCQkJNAorCSNkZWZpbmUgV0xBTl9BTFBIQUNPUkUJCQk1CisJI2RlZmluZSBXTEFOX01JUFNDT1JFCQkJNgorCSNkZWZpbmUgV0xBTl9IUFBBQ09SRQkJCTcKKy8qIFdMQU5fQ1BVX1BBUlQgKi8KKwkjZGVmaW5lIFdMQU5fSTM4NlBBUlQJCQkxCisJI2RlZmluZSBXTEFOX01QQzg2MAkJCTIKKwkjZGVmaW5lIFdMQU5fTVBDODIzCQkJMworCSNkZWZpbmUgV0xBTl9JMjk2U0EJCQk0CisJI2RlZmluZSBXTEFOX1BQQ1BBUlQJCQk1CisJI2RlZmluZSBXTEFOX0FSTVBBUlQJCQk2CisJI2RlZmluZSBXTEFOX0FMUEhBUEFSVAkJCTcKKwkjZGVmaW5lIFdMQU5fTUlQU1BBUlQJCQk4CisJI2RlZmluZSBXTEFOX0hQUEFQQVJUCQkJOQorLyogV0xBTl9TWVNBUkNIICovCisJI2RlZmluZSBXTEFOX1BDQVQJCQkxCisJI2RlZmluZSBXTEFOX01CWAkJCTIKKwkjZGVmaW5lIFdMQU5fUlBYCQkJMworCSNkZWZpbmUgV0xBTl9MV0FSQ0gJCQk0CisJI2RlZmluZSBXTEFOX1BNQUMJCQk1CisJI2RlZmluZSBXTEFOX1NLSUZGCQkJNgorCSNkZWZpbmUgV0xBTl9CSVRTWQkJCTcKKwkjZGVmaW5lIFdMQU5fQUxQSEFBUkNICQkJNworCSNkZWZpbmUgV0xBTl9NSVBTQVJDSAkJCTkKKwkjZGVmaW5lIFdMQU5fSFBQQUFSQ0gJCQkxMAorLyogV0xBTl9PUyAqLworCSNkZWZpbmUgV0xBTl9MSU5VWF9LRVJORUwJCTEKKwkjZGVmaW5lIFdMQU5fTElOVVhfVVNFUgkJCTIKKy8qIFdMQU5fSE9TVElGIChnZW5lcmFsbHkgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUsIG5vdCBkZXRlY3RlZCkgKi8KKwkjZGVmaW5lIFdMQU5fUENNQ0lBCQkJMQorCSNkZWZpbmUgV0xBTl9JU0EJCQkyCisJI2RlZmluZSBXTEFOX1BDSQkJCTMKKwkjZGVmaW5lIFdMQU5fVVNCCQkJNAorCSNkZWZpbmUgV0xBTl9QTFgJCQk1CisKKy8qIE5vdGU6IHRoZSBQTFggSE9TVElGIGFib3ZlIHJlZmVycyB0byBzb21lIHZlbmRvcnMgaW1wbGVtZW50YXRpb25zIGZvciAqLworLyogICAgICAgUENJLiAgSXQncyBhIFBMWCBjaGlwIHRoYXQgaXMgYSBQQ0kgdG8gUENNQ0lBIGFkYXB0ZXIsIGJ1dCBpdCAgICovCisvKiAgICAgICBpc24ndCBhIHJlYWwgUENNQ0lBIGhvc3QgaW50ZXJmYWNlIGFkYXB0ZXIgcHJvdmlkaW5nIGFsbCB0aGUgICAgKi8KKy8qICAgICAgIGNhcmQmc29ja2V0IHNlcnZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBMZXRzIHRyeSB0byBmaWd1cmUgb3V0IHdoYXQgd2UndmUgZ290LiAgS2VybmVsIG1vZGUgb3IgVXNlciBtb2RlPyAqLworI2lmIGRlZmluZWQoX19LRVJORUxfXykKKwkjZGVmaW5lIFdMQU5fT1MJCQkJV0xBTl9MSU5VWF9LRVJORUwKKyNlbHNlIAorCSNkZWZpbmUgV0xBTl9PUwkJCQlXTEFOX0xJTlVYX1VTRVIKKyNlbmRpZgorCisjaWZkZWYgX19wb3dlcnBjX18KKyNpZm5kZWYgX19wcGNfXworI2RlZmluZSBfX3BwY19fCisjZW5kaWYKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoQ09ORklHX1BQQykgfHwgZGVmaW5lZChDT05GSUdfOHh4KSkKKyNpZm5kZWYgX19wcGNfXworI2RlZmluZSBfX3BwY19fCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQorI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pNjg2X18pCisJI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fSXg4NgorCSNkZWZpbmUgV0xBTl9DUFVfQ09SRQkJV0xBTl9JMzg2Q09SRQorCSNkZWZpbmUgV0xBTl9DUFVfUEFSVAkJV0xBTl9JMzg2UEFSVAorCSNkZWZpbmUgV0xBTl9TWVNBUkNICQlXTEFOX1BDQVQKKyNlbGlmIGRlZmluZWQoX19wcGNfXykKKwkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl9QUEMKKwkjZGVmaW5lIFdMQU5fQ1BVX0NPUkUJCVdMQU5fUFBDQ09SRQorCSNpZiBkZWZpbmVkKENPTkZJR19NQlgpCisJCSNkZWZpbmUgV0xBTl9DUFVfUEFSVAlXTEFOX01QQzg2MAorCQkjZGVmaW5lIFdMQU5fU1lTQVJDSAlXTEFOX01CWAorCSNlbGlmIGRlZmluZWQoQ09ORklHX1JQWExJVEUpCisJCSNkZWZpbmUgV0xBTl9DUFVfUEFSVAlXTEFOX01QQzgyMworCQkjZGVmaW5lIFdMQU5fU1lTQVJDSAlXTEFOX1JQWAorCSNlbGlmIGRlZmluZWQoQ09ORklHX1JQWENMQVNTSUMpCisJCSNkZWZpbmUgV0xBTl9DUFVfUEFSVAlXTEFOX01QQzg2MAorCQkjZGVmaW5lIFdMQU5fU1lTQVJDSAlXTEFOX1JQWAorCSNlbHNlCisJCSNkZWZpbmUgV0xBTl9DUFVfUEFSVAlXTEFOX1BQQ1BBUlQKKwkJI2RlZmluZSBXTEFOX1NZU0FSQ0gJV0xBTl9QTUFDCisJI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fYXJtX18pCisJI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fQVJNCisJI2RlZmluZSBXTEFOX0NQVV9DT1JFCQlXTEFOX0FSTUNPUkUKKyAgICAgICAgI2RlZmluZSBXTEFOX0NQVV9QQVJUCQlXTEFOX0FSTV9QQVJUCisJI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fU0tJRkYKKyNlbGlmIGRlZmluZWQoX19hbHBoYV9fKQorCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX0FMUEhBCisJI2RlZmluZSBXTEFOX0NQVV9DT1JFCQlXTEFOX0FMUEhBQ09SRQorCSNkZWZpbmUgV0xBTl9DUFVfUEFSVAkJV0xBTl9BTFBIQVBBUlQKKwkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9BTFBIQUFSQ0gKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisJI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fTUlQUworCSNkZWZpbmUgV0xBTl9DUFVfQ09SRQkJV0xBTl9NSVBTQ09SRQorICAgICAgICAjZGVmaW5lIFdMQU5fQ1BVX1BBUlQJCVdMQU5fTUlQU1BBUlQKKwkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9NSVBTQVJDSAorI2VsaWYgZGVmaW5lZChfX2hwcGFfXykKKwkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl9IUFBBCisJI2RlZmluZSBXTEFOX0NQVV9DT1JFCQlXTEFOX0hQUEFDT1JFCisJI2RlZmluZSBXTEFOX0NQVV9QQVJUCQlXTEFOX0hQUEFQQVJUCisJI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fSFBQQUFSQ0gKKyNlbHNlCisJI2Vycm9yICJObyBDUFUgaWRlbnRpZmllZCEiCisjZW5kaWYKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKy8qCisgICBTb21lIGJpZyBlbmRpYW4gbWFjaGluZXMgaW1wbGljaXRseSBkbyBhbGwgSS9PIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KKworICAgSW4gcGFydGljdWxhcjoKKyAgICAgICAgICBMaW51eC9QUEMgb24gUG93ZXJNYWNzIChQQ0kpCisJICBBcm0vSW50ZWwgWHNjYWxlIChQQ0kpCisKKyAgIFRoaXMgbWF5IGFsc28gYWZmZWN0IFBMWCBib2FyZHMgYW5kIG90aGVyIEJFICZ8IFBQQyBwbGF0Zm9ybXM7IAorICAgYXMgbmV3IG9uZXMgYXJlIGRpc2NvdmVyZWQsIGFkZCB0aGVtIGJlbG93LiAKKyovCisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisjaWYgKChXTEFOX1NZU0FSQ0ggPT0gV0xBTl9TS0lGRikgfHwgKFdMQU5fU1lTQVJDSCA9PSBXTEFOX1BNQUMpKQorI2RlZmluZSBSRVZFUlNFX0VORElBTgorI2VuZGlmCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tIEJpdCBzZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIEJJVDAJMHgwMDAwMDAwMQorI2RlZmluZSBCSVQxCTB4MDAwMDAwMDIKKyNkZWZpbmUgQklUMgkweDAwMDAwMDA0CisjZGVmaW5lIEJJVDMJMHgwMDAwMDAwOAorI2RlZmluZSBCSVQ0CTB4MDAwMDAwMTAKKyNkZWZpbmUgQklUNQkweDAwMDAwMDIwCisjZGVmaW5lIEJJVDYJMHgwMDAwMDA0MAorI2RlZmluZSBCSVQ3CTB4MDAwMDAwODAKKyNkZWZpbmUgQklUOAkweDAwMDAwMTAwCisjZGVmaW5lIEJJVDkJMHgwMDAwMDIwMAorI2RlZmluZSBCSVQxMAkweDAwMDAwNDAwCisjZGVmaW5lIEJJVDExCTB4MDAwMDA4MDAKKyNkZWZpbmUgQklUMTIJMHgwMDAwMTAwMAorI2RlZmluZSBCSVQxMwkweDAwMDAyMDAwCisjZGVmaW5lIEJJVDE0CTB4MDAwMDQwMDAKKyNkZWZpbmUgQklUMTUJMHgwMDAwODAwMAorI2RlZmluZSBCSVQxNgkweDAwMDEwMDAwCisjZGVmaW5lIEJJVDE3CTB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTgJMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOQkweDAwMDgwMDAwCisjZGVmaW5lIEJJVDIwCTB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMjEJMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMgkweDAwNDAwMDAwCisjZGVmaW5lIEJJVDIzCTB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjQJMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNQkweDAyMDAwMDAwCisjZGVmaW5lIEJJVDI2CTB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjcJMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOAkweDEwMDAwMDAwCisjZGVmaW5lIEJJVDI5CTB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMzAJMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMQkweDgwMDAwMDAwCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIFVJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgVUlOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUlOVDMyOworCit0eXBlZGVmIHNpZ25lZCBjaGFyICAgICBJTlQ4OwordHlwZWRlZiBzaWduZWQgc2hvcnQgICAgSU5UMTY7Cit0eXBlZGVmIHNpZ25lZCBsb25nICAgICBJTlQzMjsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgVUlOVDsKK3R5cGVkZWYgc2lnbmVkIGludCAgICAgIElOVDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUlOVDY0OwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nCUlOVDY0OworCisjZGVmaW5lIFVJTlQ4X01BWAkoMHhmZlVMKQorI2RlZmluZSBVSU5UMTZfTUFYCSgweGZmZmZVTCkKKyNkZWZpbmUgVUlOVDMyX01BWAkoMHhmZmZmZmZmZlVMKQorCisjZGVmaW5lIElOVDhfTUFYCSgweDdmTCkKKyNkZWZpbmUgSU5UMTZfTUFYCSgweDdmZmZMKQorI2RlZmluZSBJTlQzMl9NQVgJKDB4N2ZmZmZmZmZMKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0gQ29tcGlsZXIgUG9ydGFiaWxpdHkgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIF9fV0xBTl9BVFRSSUJfUEFDS19fCQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKyNkZWZpbmUgX19XTEFOX1BSQUdNQV9QQUNLMV9fCisjZGVmaW5lIF9fV0xBTl9QUkFHTUFfUEFDS0RGTFRfXworI2RlZmluZSBfX1dMQU5fSU5MSU5FX18JCQlpbmxpbmUKKyNkZWZpbmUgV0xBTl9NSU5fQVJSQVkJCQkwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKi0tLS0tLSBPUyBQb3J0YWJpbGl0eSBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBXTEFOX0RCVkFSCisjZGVmaW5lIFdMQU5fREJWQVIJd2xhbl9kZWJ1ZworI2VuZGlmCisKKyNpZiAoV0xBTl9PUyA9PSBXTEFOX0xJTlVYX0tFUk5FTCkKKwkjZGVmaW5lIFdMQU5fTE9HX0VSUk9SMCh4KSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIHggLCBfX0ZVTkNUSU9OX18gKTsKKwkjZGVmaW5lIFdMQU5fTE9HX0VSUk9SMSh4LG4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgeCAsIF9fRlVOQ1RJT05fXyAsIChuKSk7CisJI2RlZmluZSBXTEFOX0xPR19FUlJPUjIoeCxuMSxuMikgcHJpbnRrKEtFUk5fRVJSICIlczogIiB4ICwgX19GVU5DVElPTl9fICwgKG4xKSwgKG4yKSk7CisJI2RlZmluZSBXTEFOX0xPR19FUlJPUjMoeCxuMSxuMixuMykgcHJpbnRrKEtFUk5fRVJSICIlczogIiB4ICwgX19GVU5DVElPTl9fLCAobjEpLCAobjIpLCAobjMpKTsKKwkjZGVmaW5lIFdMQU5fTE9HX0VSUk9SNCh4LG4xLG4yLG4zLG40KSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIHggLCBfX0ZVTkNUSU9OX18sIChuMSksIChuMiksIChuMyksIChuNCkpOworCisJI2RlZmluZSBXTEFOX0xPR19XQVJOSU5HMCh4KSBwcmludGsoS0VSTl9XQVJOSU5HICIlczogIiB4ICwgX19GVU5DVElPTl9fKTsKKwkjZGVmaW5lIFdMQU5fTE9HX1dBUk5JTkcxKHgsbikgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIgeCAsIF9fRlVOQ1RJT05fXywgKG4pKTsKKwkjZGVmaW5lIFdMQU5fTE9HX1dBUk5JTkcyKHgsbjEsbjIpIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiIHggLCBfX0ZVTkNUSU9OX18sIChuMSksIChuMikpOworCSNkZWZpbmUgV0xBTl9MT0dfV0FSTklORzMoeCxuMSxuMixuMykgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIgeCAsIF9fRlVOQ1RJT05fXywgKG4xKSwgKG4yKSwgKG4zKSk7CisJI2RlZmluZSBXTEFOX0xPR19XQVJOSU5HNCh4LG4xLG4yLG4zLG40KSBwcmludGsoS0VSTl9XQVJOSU5HICIlczogIiB4ICwgX19GVU5DVElPTl9fICwgKG4xKSwgKG4yKSwgKG4zKSwgKG40KSk7CisKKwkjZGVmaW5lIFdMQU5fTE9HX05PVElDRTAoeCkgcHJpbnRrKEtFUk5fTk9USUNFICIlczogIiB4ICwgX19GVU5DVElPTl9fKTsKKwkjZGVmaW5lIFdMQU5fTE9HX05PVElDRTEoeCxuKSBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAiIHggLCBfX0ZVTkNUSU9OX18sIChuKSk7CisJI2RlZmluZSBXTEFOX0xPR19OT1RJQ0UyKHgsbjEsbjIpIHByaW50ayhLRVJOX05PVElDRSAiJXM6ICIgeCAsIF9fRlVOQ1RJT05fXywgKG4xKSwgKG4yKSk7CisJI2RlZmluZSBXTEFOX0xPR19OT1RJQ0UzKHgsbjEsbjIsbjMpIHByaW50ayhLRVJOX05PVElDRSAiJXM6ICIgeCAsIF9fRlVOQ1RJT05fXywgKG4xKSwgKG4yKSwgKG4zKSk7CisJI2RlZmluZSBXTEFOX0xPR19OT1RJQ0U0KHgsbjEsbjIsbjMsbjQpIHByaW50ayhLRVJOX05PVElDRSAiJXM6ICIgeCAsIF9fRlVOQ1RJT05fXywgKG4xKSwgKG4yKSwgKG4zKSwgKG40KSk7CisKKwkjZGVmaW5lIFdMQU5fTE9HX0lORk8wKHgpIHByaW50ayhLRVJOX0lORk8geCk7CisJI2RlZmluZSBXTEFOX0xPR19JTkZPMSh4LG4pIHByaW50ayhLRVJOX0lORk8geCwgKG4pKTsKKwkjZGVmaW5lIFdMQU5fTE9HX0lORk8yKHgsbjEsbjIpIHByaW50ayhLRVJOX0lORk8geCwgKG4xKSwgKG4yKSk7CisJI2RlZmluZSBXTEFOX0xPR19JTkZPMyh4LG4xLG4yLG4zKSBwcmludGsoS0VSTl9JTkZPIHgsIChuMSksIChuMiksIChuMykpOworCSNkZWZpbmUgV0xBTl9MT0dfSU5GTzQoeCxuMSxuMixuMyxuNCkgcHJpbnRrKEtFUk5fSU5GTyB4LCAobjEpLCAobjIpLCAobjMpLCAobjQpKTsKKwkjZGVmaW5lIFdMQU5fTE9HX0lORk81KHgsbjEsbjIsbjMsbjQsbjUpIHByaW50ayhLRVJOX0lORk8geCwgKG4xKSwgKG4yKSwgKG4zKSwgKG40KSwgKG41KSk7CisKKwkjaWYgZGVmaW5lZChXTEFOX0lOQ0xVREVfREVCVUcpCisJCSNkZWZpbmUgV0xBTl9BU1NFUlQoYykgaWYgKCghKGMpKSAmJiBXTEFOX0RCVkFSID49IDEpIHsgXAorCQkJV0xBTl9MT0dfREVCVUcwKDEsICJBc3NlcnRpb24gZmFpbHVyZSFcbiIpOyB9CisJCSNkZWZpbmUgV0xBTl9IRVhfRFVNUCggbCwgeCwgcCwgbikJaWYoIFdMQU5fREJWQVIgPj0gKGwpICl7IFwKKwkJCWludCBfX2lfXzsgXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgeCAiOiIpOyBcCisJCQlmb3IoIF9faV9fPTA7IF9faV9fIDwgKG4pOyBfX2lfXysrKSBcCisJCQkJcHJpbnRrKCAiICUwMngiLCAoKFVJTlQ4KikocCkpW19faV9fXSk7IFwKKwkJCXByaW50aygiXG4iKTsgfQorCisJCSNkZWZpbmUgREJGRU5URVIgeyBpZiAoIFdMQU5fREJWQVIgPj0gNCApeyBXTEFOX0xPR19ERUJVRzAoMywiRW50ZXJcbiIpOyB9IH0KKwkJI2RlZmluZSBEQkZFWElUICB7IGlmICggV0xBTl9EQlZBUiA+PSA0ICl7IFdMQU5fTE9HX0RFQlVHMCgzLCJFeGl0XG4iKTsgfSB9CisKKwkJI2RlZmluZSBXTEFOX0xPR19ERUJVRzAobCx4KSBpZiAoIFdMQU5fREJWQVIgPj0gKGwpKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgeCAsICBfX0ZVTkNUSU9OX18gKTsKKwkJI2RlZmluZSBXTEFOX0xPR19ERUJVRzEobCx4LG4pIGlmICggV0xBTl9EQlZBUiA+PSAobCkpIHByaW50ayhLRVJOX0RFQlVHICIlczogIiB4ICwgX19GVU5DVElPTl9fICwgKG4pKTsKKwkJI2RlZmluZSBXTEFOX0xPR19ERUJVRzIobCx4LG4xLG4yKSBpZiAoIFdMQU5fREJWQVIgPj0gKGwpKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgeCAsIF9fRlVOQ1RJT05fXyAsIChuMSksIChuMikpOworCQkjZGVmaW5lIFdMQU5fTE9HX0RFQlVHMyhsLHgsbjEsbjIsbjMpIGlmICggV0xBTl9EQlZBUiA+PSAobCkpIHByaW50ayhLRVJOX0RFQlVHICIlczogIiB4ICwgX19GVU5DVElPTl9fICwgKG4xKSwgKG4yKSwgKG4zKSk7CisJCSNkZWZpbmUgV0xBTl9MT0dfREVCVUc0KGwseCxuMSxuMixuMyxuNCkgaWYgKCBXTEFOX0RCVkFSID49IChsKSkgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIHggLCBfX0ZVTkNUSU9OX18gLCAobjEpLCAobjIpLCAobjMpLCAobjQpKTsKKwkJI2RlZmluZSBXTEFOX0xPR19ERUJVRzUobCx4LG4xLG4yLG4zLG40LG41KSBpZiAoIFdMQU5fREJWQVIgPj0gKGwpKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgeCAsIF9fRlVOQ1RJT05fXyAsIChuMSksIChuMiksIChuMyksIChuNCksIChuNSkpOworCQkjZGVmaW5lIFdMQU5fTE9HX0RFQlVHNihsLHgsbjEsbjIsbjMsbjQsbjUsbjYpIGlmICggV0xBTl9EQlZBUiA+PSAobCkpIHByaW50ayhLRVJOX0RFQlVHICIlczogIiB4ICwgX19GVU5DVElPTl9fICwgKG4xKSwgKG4yKSwgKG4zKSwgKG40KSwgKG41KSwgKG42KSk7CisJI2Vsc2UKKwkJI2RlZmluZSBXTEFOX0FTU0VSVChjKSAKKwkJI2RlZmluZSBXTEFOX0hFWF9EVU1QKCBsLCBzLCBwLCBuKQorCisJCSNkZWZpbmUgREJGRU5URVIgCisJCSNkZWZpbmUgREJGRVhJVCAKKworCQkjZGVmaW5lIFdMQU5fTE9HX0RFQlVHMChsLCBzKQorCQkjZGVmaW5lIFdMQU5fTE9HX0RFQlVHMShsLCBzLG4pCisJCSNkZWZpbmUgV0xBTl9MT0dfREVCVUcyKGwsIHMsbjEsbjIpCisJCSNkZWZpbmUgV0xBTl9MT0dfREVCVUczKGwsIHMsbjEsbjIsbjMpCisJCSNkZWZpbmUgV0xBTl9MT0dfREVCVUc0KGwsIHMsbjEsbjIsbjMsbjQpCisJCSNkZWZpbmUgV0xBTl9MT0dfREVCVUc1KGwsIHMsbjEsbjIsbjMsbjQsbjUpCisJI2VuZGlmCisjZWxzZQorCSNkZWZpbmUgV0xBTl9MT0dfRVJST1IwKHMpCisJI2RlZmluZSBXTEFOX0xPR19FUlJPUjEocyxuKQorCSNkZWZpbmUgV0xBTl9MT0dfRVJST1IyKHMsbjEsbjIpCisJI2RlZmluZSBXTEFOX0xPR19FUlJPUjMocyxuMSxuMixuMykKKwkjZGVmaW5lIFdMQU5fTE9HX0VSUk9SNChzLG4xLG4yLG4zLG40KQorCisJI2RlZmluZSBXTEFOX0xPR19XQVJOSU5HMChzKQorCSNkZWZpbmUgV0xBTl9MT0dfV0FSTklORzEocyxuKQorCSNkZWZpbmUgV0xBTl9MT0dfV0FSTklORzIocyxuMSxuMikKKwkjZGVmaW5lIFdMQU5fTE9HX1dBUk5JTkczKHMsbjEsbjIsbjMpCisJI2RlZmluZSBXTEFOX0xPR19XQVJOSU5HNChzLG4xLG4yLG4zLG40KQorCisJI2RlZmluZSBXTEFOX0xPR19OT1RJQ0UwKHMpCisJI2RlZmluZSBXTEFOX0xPR19OT1RJQ0UxKHMsbikKKwkjZGVmaW5lIFdMQU5fTE9HX05PVElDRTIocyxuMSxuMikKKwkjZGVmaW5lIFdMQU5fTE9HX05PVElDRTMocyxuMSxuMixuMykKKwkjZGVmaW5lIFdMQU5fTE9HX05PVElDRTQocyxuMSxuMixuMyxuNCkKKworCQkjZGVmaW5lIFdMQU5fQVNTRVJUKGMpIAorCQkjZGVmaW5lIFdMQU5fSEVYX0RVTVAoIGwsIHMsIHAsIG4pCisKKwkJI2RlZmluZSBEQkZFTlRFUiAKKwkJI2RlZmluZSBEQkZFWElUIAorCisJCSNkZWZpbmUgV0xBTl9MT0dfSU5GTzAocykKKwkJI2RlZmluZSBXTEFOX0xPR19JTkZPMShzLG4pCisJCSNkZWZpbmUgV0xBTl9MT0dfSU5GTzIocyxuMSxuMikKKwkJI2RlZmluZSBXTEFOX0xPR19JTkZPMyhzLG4xLG4yLG4zKQorCQkjZGVmaW5lIFdMQU5fTE9HX0lORk80KHMsbjEsbjIsbjMsbjQpCisJCSNkZWZpbmUgV0xBTl9MT0dfSU5GTzUocyxuMSxuMixuMyxuNCxuNSkKKworCQkjZGVmaW5lIFdMQU5fTE9HX0RFQlVHMChsLCBzKQorCQkjZGVmaW5lIFdMQU5fTE9HX0RFQlVHMShsLCBzLG4pCisJCSNkZWZpbmUgV0xBTl9MT0dfREVCVUcyKGwsIHMsbjEsbjIpCisJCSNkZWZpbmUgV0xBTl9MT0dfREVCVUczKGwsIHMsbjEsbjIsbjMpCisJCSNkZWZpbmUgV0xBTl9MT0dfREVCVUc0KGwsIHMsbjEsbjIsbjMsbjQpCisJCSNkZWZpbmUgV0xBTl9MT0dfREVCVUc1KGwsIHMsbjEsbjIsbjMsbjQsbjUpCisjZW5kaWYKKworI2RlZmluZSB3bGFuX21zX3Blcl90aWNrCQkoMTAwMFVMIC8gKHdsYW5fdGlja3NfcGVyX3NlYykpCisjZGVmaW5lIHdsYW5fbXNfdG9fdGlja3MobikJCSggKG4pIC8gKHdsYW5fbXNfcGVyX3RpY2spKQorI2RlZmluZSB3bGFuX3R1MnRpY2tzKG4pCQkoIChuKSAvICh3bGFuX21zX3Blcl90aWNrKSkKKyNkZWZpbmUgV0xBTl9JTlRfRElTQUJMRShuKQkJeyBzYXZlX2ZsYWdzKChuKSk7IGNsaSgpOyB9CisjZGVmaW5lIFdMQU5fSU5UX0VOQUJMRShuKQkJeyBzdGkoKTsgcmVzdG9yZV9mbGFncygobikpOyB9CisKKyNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKyNkZWZpbmUgTU9EVkVSU0lPTlMJCTEKKyNpbmNsdWRlIDxsaW51eC9tb2R2ZXJzaW9ucy5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU01QCisjZGVmaW5lIF9fU01QX18JCQkxCisjZW5kaWYJCisKKyNpZm5kZWYgS0VSTkVMX1ZFUlNJT04KKyNkZWZpbmUgS0VSTkVMX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDE3KSkKKyNkZWZpbmUgQ09ORklHX05FVExJTksJCTEKKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkpCisjZGVmaW5lIGtmcmVlX3MoYSwgYikJa2ZyZWUoKGEpKQorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwyLDE4KSkKKyNpZm5kZWYgaW5pdF93YWl0cXVldWVfaGVhZAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDAsMTYpKQorI2RlZmluZSBpbml0X3dhaXRxdWV1ZV9oZWFkKHApICAoKihwKSA9IE5VTEwpCisjZWxzZQorI2RlZmluZSBpbml0X3dhaXRxdWV1ZV9oZWFkKHApICBpbml0X3dhaXRxdWV1ZShwKQorI2VuZGlmCit0eXBlZGVmIHN0cnVjdCB3YWl0X3F1ZXVlICp3YWl0X3F1ZXVlX2hlYWRfdDsKK3R5cGVkZWYgc3RydWN0IHdhaXRfcXVldWUgd2FpdF9xdWV1ZV90OworI2RlZmluZSBzZXRfY3VycmVudF9zdGF0ZShiKSAgeyBjdXJyZW50LT5zdGF0ZSA9IChiKTsgbWIoKTsgfQorI2RlZmluZSBpbml0X3dhaXRxdWV1ZV9lbnRyeShhLCBiKSB7IChhKS0+dGFzayA9IGN1cnJlbnQ7IH0KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKKy8vIHJldHZhbCA9PSAwOyBzaWduYWwgbWV0OyB3ZSdyZSBnb29kLgorLy8gcmV0dmFsIDwgMDsgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLgorLy8gcmV0dmFsID4gMDsgdGltZWQgb3V0LgorI2RlZmluZSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHRpbWVvdXQsIHJldCkgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fcmV0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShjb25kaXRpb24pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgd2FpdF9xdWV1ZV90IF9fd2FpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB1bnNpZ25lZCBsb25nIGV4cGlyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfd2FpdHF1ZXVlX2VudHJ5KCZfX3dhaXQsIGN1cnJlbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGV4cGlyZSA9IHRpbWVvdXQgKyBqaWZmaWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYWRkX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmb3IgKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgaWYgKGppZmZpZXMgPiBleHBpcmUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGppZmZpZXMgLSBleHBpcmU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHJldCA9IC1FUkVTVEFSVFNZUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19yZXQgPSAwOwkJCQkJCQlcCisJaWYgKCEoY29uZGl0aW9uKSkJCQkJCQlcCisJCV9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwJXAorCQkJCQkJdGltZW91dCwgX19yZXQpOwlcCisJX19yZXQ7CQkJCQkJCQlcCit9KQorCisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDEsOTApKQorI2RlZmluZSBzcGluX2xvY2sobCkgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNwaW5fdW5sb2NrKGwpICAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3Bpbl9sb2NrX2lycXNhdmUobCxmKSAgZG8geyBzYXZlX2ZsYWdzKGYpOyBjbGkoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsLGYpIGRvIHsgcmVzdG9yZV9mbGFncyhmKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3Bpbl9sb2NrX2luaXQocykgICAgICAgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzcGluX3RyeWxvY2sobCkgICAgICAgICAoMSkKK3R5cGVkZWYgaW50IHNwaW5sb2NrX3Q7CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KSAgICAgICAoKih2b2xhdGlsZSBjaGFyICopKCYoeCktPmxvY2spIDw9IDApCisjZWxzZQorI2RlZmluZSBzcGluX2lzX2xvY2tlZChsKSAgICAgICAoMCkKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSkKK3R5cGVkZWYgc3RydWN0IGRldmljZSBuZXRkZXZpY2VfdDsKKyNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsNCkpCit0eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlIG5ldGRldmljZV90OworI2Vsc2UKKyN1bmRlZiBuZXRkZXZpY2VfdAordHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZSBuZXRkZXZpY2VfdDsKKyNlbmRpZgorCisjaWZkZWYgV0lSRUxFU1NfRVhUCisjaWYgKFdJUkVMRVNTX0VYVCA8IDEzKQorc3RydWN0IGl3X3JlcXVlc3RfaW5mbworeworICAgICAgICBfX3UxNiAgICAgICAgICAgY21kOyAgICAgICAgICAgIC8qIFdpcmVsZXNzIEV4dGVuc2lvbiBjb21tYW5kICovCisgICAgICAgIF9fdTE2ICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogTW9yZSB0byBjb21lIDstKSAqLworfTsKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDEsMTgpKQorI2RlZmluZSBNT0RVTEVfUEFSTShhLGIpICAgICAgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAorI2RlZmluZSBNT0RVTEVfQVVUSE9SKGEpICAgICAgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAorI2RlZmluZSBNT0RVTEVfREVTQ1JJUFRJT04oYSkgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAorI2RlZmluZSBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRShhKSBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAorI3VuZGVmICBHRVRfVVNFX0NPVU5UCisjZGVmaW5lIEdFVF9VU0VfQ09VTlQobSkgICAgICAgIG1vZF91c2VfY291bnRfCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEVfTElDRU5TRQorI2RlZmluZSBNT0RVTEVfTElDRU5TRShtKSAgICAgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAorI2VuZGlmCisKKy8qIFRPRE86ICBEbyB3ZSBjYXJlIGFib3V0IHRoaXM/ICovCisjaWZuZGVmIE1PRFVMRV9ERVZJQ0VfVEFCTEUKKyNkZWZpbmUgTU9EVUxFX0RFVklDRV9UQUJMRShmb28sYmFyKQorI2VuZGlmCisKKyNkZWZpbmUgd2xhbl9taW51dGVzMnRpY2tzKGEpICgoYSkqKHdsYW5fdGlja3NfcGVyX3NlYyAqICA2MCkpCisjZGVmaW5lIHdsYW5fc2Vjb25kczJ0aWNrcyhhKSAoKGEpKih3bGFuX3RpY2tzX3Blcl9zZWMpKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0tLS0gSGFyZHdhcmUgUG9ydGFiaWxpdHkgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgaWVlZTJob3N0MTYobikJX19sZTE2X3RvX2NwdShuKQorI2RlZmluZSBpZWVlMmhvc3QzMihuKQlfX2xlMzJfdG9fY3B1KG4pCisjZGVmaW5lIGhvc3QyaWVlZTE2KG4pCV9fY3B1X3RvX2xlMTYobikKKyNkZWZpbmUgaG9zdDJpZWVlMzIobikJX19jcHVfdG9fbGUzMihuKQorCisjaWYgKFdMQU5fQ1BVX0ZBTUlMWSA9PSBXTEFOX1BQQykKKyAgICAgICAjZGVmaW5lIHdsYW5faW53KGEpICAgICAgICAgICAgICAgICAgICAgaW5fYmUxNigodW5zaWduZWQgc2hvcnQgKikoKGEpK19JT19CQVNFKSkKKyAgICAgICAjZGVmaW5lIHdsYW5faW53X2xlMTZfdG9fY3B1KGEpICAgICAgICAgaW53KChhKSkKKyAgICAgICAjZGVmaW5lIHdsYW5fb3V0dyh2LGEpICAgICAgICAgICAgICAgICAgb3V0X2JlMTYoKHVuc2lnbmVkIHNob3J0ICopKChhKStfSU9fQkFTRSksICh2KSkKKyAgICAgICAjZGVmaW5lIHdsYW5fb3V0d19jcHVfdG9fbGUxNih2LGEpICAgICAgb3V0dygodiksKGEpKQorI2Vsc2UKKyAgICAgICAjZGVmaW5lIHdsYW5faW53KGEpICAgICAgICAgICAgICAgICAgICAgaW53KChhKSkKKyAgICAgICAjZGVmaW5lIHdsYW5faW53X2xlMTZfdG9fY3B1KGEpICAgICAgICAgX19jcHVfdG9fbGUxNihpbncoKGEpKSkKKyAgICAgICAjZGVmaW5lIHdsYW5fb3V0dyh2LGEpICAgICAgICAgICAgICAgICAgb3V0dygodiksKGEpKQorICAgICAgICNkZWZpbmUgd2xhbl9vdXR3X2NwdV90b19sZTE2KHYsYSkgICAgICBvdXR3KF9fY3B1X3RvX2xlMTYoKHYpKSwoYSkpCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tIEdlbmVyYWwgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIHdsYW5fbWF4KGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgd2xhbl9taW4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIHdsYW5faXNwcmludChjKQkoKChjKSA+ICgweDE5KSkgJiYgKChjKSA8ICgweDdmKSkpCisKKyNkZWZpbmUgd2xhbl9oZXhjaGFyKHgpICgoKHgpIDwgMHgwYSkgPyAoJzAnICsgKHgpKSA6ICgnYScgKyAoKHgpIC0gMHgwYSkpKQorCisvKiBDcmVhdGUgYSBzdHJpbmcgb2YgcHJpbnRhYmxlIGNoYXJzIGZyb20gc29tZXRoaW5nIHRoYXQgbWlnaHQgbm90IGJlICovCisvKiBJdCdzIHJlY29tbWVuZGVkIHRoYXQgdGhlIHN0ciBiZSA0KmxlbiArIDEgYnl0ZXMgbG9uZyAqLworI2RlZmluZSB3bGFuX21rcHJpbnRzdHIoYnVmLCBidWZsZW4sIHN0ciwgc3RybGVuKSBcCit7IFwKKwlpbnQgaSA9IDA7IFwKKwlpbnQgaiA9IDA7IFwKKwltZW1zZXQoc3RyLCAwLCAoc3RybGVuKSk7IFwKKwlmb3IgKGkgPSAwOyBpIDwgKGJ1Zmxlbik7IGkrKykgeyBcCisJCWlmICggd2xhbl9pc3ByaW50KChidWYpW2ldKSApIHsgXAorCQkJKHN0cilbal0gPSAoYnVmKVtpXTsgXAorCQkJaisrOyBcCisJCX0gZWxzZSB7IFwKKwkJCShzdHIpW2pdID0gJ1xcJzsgXAorCQkJKHN0cilbaisxXSA9ICd4JzsgXAorCQkJKHN0cilbaisyXSA9IHdsYW5faGV4Y2hhcigoKGJ1ZilbaV0gJiAweGYwKSA+PiA0KTsgXAorCQkJKHN0cilbaiszXSA9IHdsYW5faGV4Y2hhcigoKGJ1ZilbaV0gJiAweDBmKSk7IFwKKwkJCWogKz0gNDsgXAorCQl9IFwKKwl9IFwKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitleHRlcm4gaW50IHdsYW5fZGVidWc7CitleHRlcm4gaW50IHdsYW5fZXRoY29udjsJCS8qIFdoYXQncyB0aGUgZGVmYXVsdCBldGhjb252PyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyotLS0gRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZW5kaWYgLyogX1dMQU5fQ09NUEFUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9udnMvbnZzLmMgYi9ncHhlL3NyYy9kcml2ZXJzL252cy9udnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjUyODA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9udnMvbnZzLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvbnZzLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE5vbi12b2xhdGlsZSBzdG9yYWdlCisgKgorICovCisKKy8qKgorICogUmVhZCBmcm9tIG5vbi12b2xhdGlsZSBzdG9yYWdlIGRldmljZQorICoKKyAqIEB2IG52cwkJTlZTIGRldmljZQorICogQHYgYWRkcmVzcwkJQWRkcmVzcyBmcm9tIHdoaWNoIHRvIHJlYWQKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBudnNfcmVhZCAoIHN0cnVjdCBudnNfZGV2aWNlICpudnMsIHVuc2lnbmVkIGludCBhZGRyZXNzLAorCSAgICAgICB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXNpemVfdCBmcmFnX2xlbjsKKwlpbnQgcmM7CisKKwkvKiBXZSBkb24ndCBldmVuIGF0dGVtcHQgdG8gaGFuZGxlIGJ1ZmZlciBsZW5ndGhzIHRoYXQgYXJlbid0CisJICogYW4gaW50ZWdyYWwgbnVtYmVyIG9mIHdvcmRzLgorCSAqLworCWFzc2VydCAoICggbGVuICYgKCAoIDEgPDwgbnZzLT53b3JkX2xlbl9sb2cyICkgLSAxICkgKSA9PSAwICk7CisKKwl3aGlsZSAoIGxlbiApIHsKKworCQkvKiBDYWxjdWxhdGUgc3BhY2UgcmVtYWluaW5nIHVwIHRvIG5leHQgYmxvY2sgYm91bmRhcnkgKi8KKwkJZnJhZ19sZW4gPSAoICggbnZzLT5ibG9ja19zaXplIC0KKwkJCSAgICAgICAoIGFkZHJlc3MgJiAoIG52cy0+YmxvY2tfc2l6ZSAtIDEgKSApICkKKwkJCSAgICAgPDwgbnZzLT53b3JkX2xlbl9sb2cyICk7CisKKwkJLyogTGltaXQgdG8gc3BhY2UgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworCQlpZiAoIGZyYWdfbGVuID4gbGVuICkKKwkJCWZyYWdfbGVuID0gbGVuOworCisJCS8qIFJlYWQgdGhpcyBwb3J0aW9uIG9mIHRoZSBidWZmZXIgZnJvbSB0aGUgZGV2aWNlICovCisJCWlmICggKCByYyA9IG52cy0+cmVhZCAoIG52cywgYWRkcmVzcywgZGF0YSwgZnJhZ19sZW4gKSApICE9IDAgKQorCQkJcmV0dXJuIHJjOworCisJCS8qIFVwZGF0ZSBwYXJhbWV0ZXJzICovCisJCWRhdGEgKz0gZnJhZ19sZW47CisJCWFkZHJlc3MgKz0gKCBmcmFnX2xlbiA+PiBudnMtPndvcmRfbGVuX2xvZzIgKTsKKwkJbGVuIC09IGZyYWdfbGVuOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFZlcmlmeSBjb250ZW50IG9mIG5vbi12b2xhdGlsZSBzdG9yYWdlIGRldmljZQorICoKKyAqIEB2IG52cwkJTlZTIGRldmljZQorICogQHYgYWRkcmVzcwkJQWRkcmVzcyBmcm9tIHdoaWNoIHRvIHJlYWQKKyAqIEB2IGRhdGEJCURhdGEgdG8gY29tcGFyZSBhZ2FpbnN0CisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbnZzX3ZlcmlmeSAoIHN0cnVjdCBudnNfZGV2aWNlICpudnMsIHVuc2lnbmVkIGludCBhZGRyZXNzLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwl1aW50OF90IHJlYWRfZGF0YVtsZW5dOworCWludCByYzsKKworCS8qIFJlYWQgZGF0YSBpbnRvIHRlbXBvcmFyeSBidWZmZXIgKi8KKwlpZiAoICggcmMgPSBudnNfcmVhZCAoIG52cywgYWRkcmVzcywgcmVhZF9kYXRhLCBsZW4gKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBDb21wYXJlIGRhdGEgKi8KKwlpZiAoIG1lbWNtcCAoIGRhdGEsIHJlYWRfZGF0YSwgbGVuICkgIT0gMCApIHsKKwkJREJHICggIk5WUyAlcCB2ZXJpZmljYXRpb24gZmFpbGVkIGF0ICUjMDR4KyV6ZFxuIiwKKwkJICAgICAgbnZzLCBhZGRyZXNzLCBsZW4gKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogV3JpdGUgdG8gbm9uLXZvbGF0aWxlIHN0b3JhZ2UgZGV2aWNlCisgKgorICogQHYgbnZzCQlOVlMgZGV2aWNlCisgKiBAdiBhZGRyZXNzCQlBZGRyZXNzIHRvIHdoaWNoIHRvIHdyaXRlCisgKiBAdiBkYXRhCQlEYXRhIGJ1ZmZlcgorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgbnZzX3dyaXRlICggc3RydWN0IG52c19kZXZpY2UgKm52cywgdW5zaWduZWQgaW50IGFkZHJlc3MsCisJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc2l6ZV90IGZyYWdfbGVuOworCWludCByYzsKKworCS8qIFdlIGRvbid0IGV2ZW4gYXR0ZW1wdCB0byBoYW5kbGUgYnVmZmVyIGxlbmd0aHMgdGhhdCBhcmVuJ3QKKwkgKiBhbiBpbnRlZ3JhbCBudW1iZXIgb2Ygd29yZHMuCisJICovCisJYXNzZXJ0ICggKCBsZW4gJiAoICggMSA8PCBudnMtPndvcmRfbGVuX2xvZzIgKSAtIDEgKSApID09IDAgKTsKKworCXdoaWxlICggbGVuICkgeworCisJCS8qIENhbGN1bGF0ZSBzcGFjZSByZW1haW5pbmcgdXAgdG8gbmV4dCBibG9jayBib3VuZGFyeSAqLworCQlmcmFnX2xlbiA9ICggKCBudnMtPmJsb2NrX3NpemUgLQorCQkJICAgICAgICggYWRkcmVzcyAmICggbnZzLT5ibG9ja19zaXplIC0gMSApICkgKQorCQkJICAgICA8PCBudnMtPndvcmRfbGVuX2xvZzIgKTsKKworCQkvKiBMaW1pdCB0byBzcGFjZSByZW1haW5pbmcgaW4gYnVmZmVyICovCisJCWlmICggZnJhZ19sZW4gPiBsZW4gKQorCQkJZnJhZ19sZW4gPSBsZW47CisKKwkJLyogV3JpdGUgdGhpcyBwb3J0aW9uIG9mIHRoZSBidWZmZXIgdG8gdGhlIGRldmljZSAqLworCQlpZiAoICggcmMgPSBudnMtPndyaXRlICggbnZzLCBhZGRyZXNzLCBkYXRhLCBmcmFnX2xlbiApICkgIT0gMCkKKwkJCXJldHVybiByYzsKKworCQkvKiBSZWFkIGJhY2sgYW5kIHZlcmlmeSBkYXRhICovCisJCWlmICggKCByYyA9IG52c192ZXJpZnkgKCBudnMsIGFkZHJlc3MsIGRhdGEsIGZyYWdfbGVuICkgKSAhPSAwKQorCQkJcmV0dXJuIHJjOworCisJCS8qIFVwZGF0ZSBwYXJhbWV0ZXJzICovCisJCWRhdGEgKz0gZnJhZ19sZW47CisJCWFkZHJlc3MgKz0gKCBmcmFnX2xlbiA+PiBudnMtPndvcmRfbGVuX2xvZzIgKTsKKwkJbGVuIC09IGZyYWdfbGVuOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9udnMvc3BpLmMgYi9ncHhlL3NyYy9kcml2ZXJzL252cy9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTMwODBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9udnMvc3BpLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdweGUvc3BpLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFNQSSBkZXZpY2VzCisgKgorICovCisKKy8qKgorICogTXVuZ2UgU1BJIGRldmljZSBhZGRyZXNzIGludG8gY29tbWFuZAorICoKKyAqIEB2IGNvbW1hbmQJCVNQSSBjb21tYW5kCisgKiBAdiBhZGRyZXNzCQlBZGRyZXNzCisgKiBAdiBtdW5nZV9hZGRyZXNzCURldmljZSByZXF1aXJlcyBhZGRyZXNzIG11bmdpbmcKKyAqIEByZXQgY29tbWFuZAkJQWN0dWFsIFNQSSBjb21tYW5kIHRvIHVzZQorICoKKyAqIFNvbWUgZGV2aWNlcyB3aXRoIDktYml0IGFkZHJlc3NlcyAoZS5nLiBBVDI1MDQwQSBFRVBST00pIHVzZSBiaXQgMworICogb2YgdGhlIGNvbW1hbmQgYnl0ZSBhcyBhZGRyZXNzIGJpdCBBOCwgcmF0aGVyIHRoYW4gaGF2aW5nIGEKKyAqIHR3by1ieXRlIGFkZHJlc3MuICBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgZ2VuZXJhdGluZyB0aGUKKyAqIGFwcHJvcHJpYXRlIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNwaV9jb21tYW5kICggdW5zaWduZWQgaW50IGNvbW1hbmQsCisJCQkJCSB1bnNpZ25lZCBpbnQgYWRkcmVzcywKKwkJCQkJIGludCBtdW5nZV9hZGRyZXNzICkgeworCXJldHVybiAoIGNvbW1hbmQgfCAoICggKCBhZGRyZXNzID4+IDggKSAmIG11bmdlX2FkZHJlc3MgKSA8PCAzICkgKTsKK30KKworLyoqCisgKiBXYWl0IGZvciBTUEkgZGV2aWNlIHRvIGNvbXBsZXRlIG9wZXJhdGlvbgorICoKKyAqIEB2IGRldmljZQkJU1BJIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc3BpX3dhaXQgKCBzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2aWNlICkgeworCXN0cnVjdCBzcGlfYnVzICpidXMgPSBkZXZpY2UtPmJ1czsKKwl1aW50OF90IHN0YXR1czsKKwlpbnQgaTsKKwlpbnQgcmM7CisKKwlmb3IgKCBpID0gMCA7IGkgPCA1MCA7IGkrKyApIHsKKwkJdWRlbGF5ICggMjAgKTsKKwkJaWYgKCAoIHJjID0gYnVzLT5ydyAoIGJ1cywgZGV2aWNlLCBTUElfUkRTUiwgLTEsIE5VTEwsCisJCQkJICAgICAgJnN0YXR1cywgc2l6ZW9mICggc3RhdHVzICkgKSApICE9IDAgKQorCQkJcmV0dXJuIHJjOworCQlpZiAoICEgKCBzdGF0dXMgJiBTUElfU1RBVFVTX05SRFkgKSApCisJCQlyZXR1cm4gMDsKKwl9CisJREJHICggIlNQSSAlcCB0aW1lZCBvdXRcbiIsIGRldmljZSApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCisvKioKKyAqIFJlYWQgZGF0YSBmcm9tIFNQSSBkZXZpY2UKKyAqCisgKiBAdiBudnMJCU5WUyBkZXZpY2UKKyAqIEB2IGFkZHJlc3MJCUFkZHJlc3MgZnJvbSB3aGljaCB0byByZWFkCisgKiBAdiBkYXRhCQlEYXRhIGJ1ZmZlcgorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgc3BpX3JlYWQgKCBzdHJ1Y3QgbnZzX2RldmljZSAqbnZzLCB1bnNpZ25lZCBpbnQgYWRkcmVzcywKKwkgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2aWNlID0gbnZzX3RvX3NwaSAoIG52cyApOworCXN0cnVjdCBzcGlfYnVzICpidXMgPSBkZXZpY2UtPmJ1czsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZCA9IHNwaV9jb21tYW5kICggU1BJX1JFQUQsIGFkZHJlc3MsCisJCQkJCSAgICAgZGV2aWNlLT5tdW5nZV9hZGRyZXNzICk7CisJaW50IHJjOworCisJREJHICggIlNQSSAlcCByZWFkaW5nICV6ZCBieXRlcyBmcm9tICUjMDR4XG4iLCBkZXZpY2UsIGxlbiwgYWRkcmVzcyApOworCWlmICggKCByYyA9IGJ1cy0+cncgKCBidXMsIGRldmljZSwgY29tbWFuZCwgYWRkcmVzcywKKwkJCSAgICAgIE5VTEwsIGRhdGEsIGxlbiApICkgIT0gMCApIHsKKwkJREJHICggIlNQSSAlcCBmYWlsZWQgdG8gcmVhZCBkYXRhIGZyb20gZGV2aWNlXG4iLCBkZXZpY2UgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIGRhdGEgdG8gU1BJIGRldmljZQorICoKKyAqIEB2IG52cwkJTlZTIGRldmljZQorICogQHYgYWRkcmVzcwkJQWRkcmVzcyBmcm9tIHdoaWNoIHRvIHJlYWQKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBzcGlfd3JpdGUgKCBzdHJ1Y3QgbnZzX2RldmljZSAqbnZzLCB1bnNpZ25lZCBpbnQgYWRkcmVzcywKKwkJY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2aWNlID0gbnZzX3RvX3NwaSAoIG52cyApOworCXN0cnVjdCBzcGlfYnVzICpidXMgPSBkZXZpY2UtPmJ1czsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZCA9IHNwaV9jb21tYW5kICggU1BJX1dSSVRFLCBhZGRyZXNzLAorCQkJCQkgICAgIGRldmljZS0+bXVuZ2VfYWRkcmVzcyApOworCWludCByYzsKKworCURCRyAoICJTUEkgJXAgd3JpdGluZyAlemQgYnl0ZXMgdG8gJSMwNHhcbiIsIGRldmljZSwgbGVuLCBhZGRyZXNzICk7CisKKwlpZiAoICggcmMgPSBidXMtPnJ3ICggYnVzLCBkZXZpY2UsIFNQSV9XUkVOLCAtMSwKKwkJCSAgICAgIE5VTEwsIE5VTEwsIDAgKSApICE9IDAgKSB7CisJCURCRyAoICJTUEkgJXAgZmFpbGVkIHRvIHdyaXRlLWVuYWJsZSBkZXZpY2VcbiIsIGRldmljZSApOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKCAoIHJjID0gYnVzLT5ydyAoIGJ1cywgZGV2aWNlLCBjb21tYW5kLCBhZGRyZXNzLAorCQkJICAgICAgZGF0YSwgTlVMTCwgbGVuICkgKSAhPSAwICkgeworCQlEQkcgKCAiU1BJICVwIGZhaWxlZCB0byB3cml0ZSBkYXRhIHRvIGRldmljZVxuIiwgZGV2aWNlICk7CisJCXJldHVybiByYzsKKwl9CisJCisJaWYgKCAoIHJjID0gc3BpX3dhaXQgKCBkZXZpY2UgKSApICE9IDAgKSB7CisJCURCRyAoICJTUEkgJXAgZmFpbGVkIHRvIGNvbXBsZXRlIHdyaXRlIG9wZXJhdGlvblxuIiwgZGV2aWNlICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvZHJpdmVycy9udnMvdGhyZWV3aXJlLmMgYi9ncHhlL3NyYy9kcml2ZXJzL252cy90aHJlZXdpcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTUyMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvZHJpdmVycy9udnMvdGhyZWV3aXJlLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxncHhlL3RocmVld2lyZS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBUaHJlZS13aXJlIHNlcmlhbCBkZXZpY2VzCisgKgorICovCisKKy8qKgorICogUmVhZCBkYXRhIGZyb20gdGhyZWUtd2lyZSBkZXZpY2UKKyAqCisgKiBAdiBudnMJCU5WUyBkZXZpY2UKKyAqIEB2IGFkZHJlc3MJCUFkZHJlc3MgZnJvbSB3aGljaCB0byByZWFkCisgKiBAdiBkYXRhCQlEYXRhIGJ1ZmZlcgorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgdGhyZWV3aXJlX3JlYWQgKCBzdHJ1Y3QgbnZzX2RldmljZSAqbnZzLCB1bnNpZ25lZCBpbnQgYWRkcmVzcywKKwkJICAgICB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCBzcGlfZGV2aWNlICpkZXZpY2UgPSBudnNfdG9fc3BpICggbnZzICk7CisJc3RydWN0IHNwaV9idXMgKmJ1cyA9IGRldmljZS0+YnVzOworCWludCByYzsKKworCWFzc2VydCAoIGJ1cy0+bW9kZSA9PSBTUElfTU9ERV9USFJFRVdJUkUgKTsKKworCURCR0MgKCBkZXZpY2UsICIzd2lyZSAlcCByZWFkaW5nICV6ZCBieXRlcyBhdCAlMDR4XG4iLAorCSAgICAgICBkZXZpY2UsIGxlbiwgYWRkcmVzcyApOworCisJaWYgKCAoIHJjID0gYnVzLT5ydyAoIGJ1cywgZGV2aWNlLCBUSFJFRVdJUkVfUkVBRCwgYWRkcmVzcywKKwkJCSAgICAgIE5VTEwsIGRhdGEsIGxlbiApICkgIT0gMCApIHsKKwkJREJHQyAoIGRldmljZSwgIjN3aXJlICVwIGNvdWxkIG5vdCByZWFkOiAlc1xuIiwKKwkJICAgICAgIGRldmljZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBXcml0ZSBkYXRhIHRvIHRocmVlLXdpcmUgZGV2aWNlCisgKgorICogQHYgbnZzCQlOVlMgZGV2aWNlCisgKiBAdiBhZGRyZXNzCQlBZGRyZXNzIGZyb20gd2hpY2ggdG8gcmVhZAorICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHRocmVld2lyZV93cml0ZSAoIHN0cnVjdCBudnNfZGV2aWNlICpudnMsIHVuc2lnbmVkIGludCBhZGRyZXNzLAorCQkgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCBzcGlfZGV2aWNlICpkZXZpY2UgPSBudnNfdG9fc3BpICggbnZzICk7CisJc3RydWN0IHNwaV9idXMgKmJ1cyA9IGRldmljZS0+YnVzOworCWludCByYzsKKworCWFzc2VydCAoIGJ1cy0+bW9kZSA9PSBTUElfTU9ERV9USFJFRVdJUkUgKTsKKworCURCR0MgKCBkZXZpY2UsICIzd2lyZSAlcCB3cml0aW5nICV6ZCBieXRlcyBhdCAlMDR4XG4iLAorCSAgICAgICBkZXZpY2UsIGxlbiwgYWRkcmVzcyApOworCisJLyogRW5hYmxlIGRldmljZSBmb3Igd3JpdGluZyAqLworCWlmICggKCByYyA9IGJ1cy0+cncgKCBidXMsIGRldmljZSwgVEhSRUVXSVJFX0VXRU4sCisJCQkgICAgICBUSFJFRVdJUkVfRVdFTl9BRERSRVNTLCBOVUxMLCBOVUxMLCAwICkgKSAhPSAwICl7CisJCURCR0MgKCBkZXZpY2UsICIzd2lyZSAlcCBjb3VsZCBub3QgZW5hYmxlIHdyaXRpbmc6ICVzXG4iLAorCQkgICAgICAgZGV2aWNlLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFdyaXRlIGRhdGEgKi8KKwlpZiAoICggcmMgPSBidXMtPnJ3ICggYnVzLCBkZXZpY2UsIFRIUkVFV0lSRV9XUklURSwgYWRkcmVzcywKKwkJCSAgICAgIGRhdGEsIE5VTEwsIGxlbiApICkgIT0gMCApIHsKKwkJREJHQyAoIGRldmljZSwgIjN3aXJlICVwIGNvdWxkIG5vdCB3cml0ZTogJXNcbiIsCisJCSAgICAgICBkZXZpY2UsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogT3VyIG1vZGVsIG9mIGFuIFNQSSBidXMgZG9lc24ndCBwcm92aWRlIGEgbWVjaGFuaXNtIGZvcgorCSAqICJhc3NlcnQgQ1MsIHdhaXQgZm9yIE1JU08gdG8gYmVjb21lIGhpZ2gsIHNvIGp1c3Qgd2FpdCBmb3IKKwkgKiBsb25nIGVub3VnaCB0byBlbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGNvbXBsZXRlZC4KKwkgKi8KKwltZGVsYXkgKCBUSFJFRVdJUkVfV1JJVEVfTURFTEFZICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBdXRvZGV0ZWN0IGRldmljZSBhZGRyZXNzIGxlbmd0aAorICoKKyAqIEB2IGRldmljZQkJU1BJIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB0aHJlZXdpcmVfZGV0ZWN0X2FkZHJlc3NfbGVuICggc3RydWN0IHNwaV9kZXZpY2UgKmRldmljZSApIHsKKwlzdHJ1Y3QgbnZzX2RldmljZSAqbnZzID0gJmRldmljZS0+bnZzOworCWludCByYzsKKworCURCR0MgKCBkZXZpY2UsICIzd2lyZSAlcCBhdXRvZGV0ZWN0aW5nIGFkZHJlc3MgbGVuZ3RoXG4iLCBkZXZpY2UgKTsKKworCWRldmljZS0+YWRkcmVzc19sZW4gPSBTUElfQVVUT0RFVEVDVF9BRERSRVNTX0xFTjsKKwlpZiAoICggcmMgPSB0aHJlZXdpcmVfcmVhZCAoIG52cywgMCwgTlVMTCwKKwkJCQkgICAgICggMSA8PCBudnMtPndvcmRfbGVuX2xvZzIgKSApICkgIT0gMCApIHsKKwkJREJHQyAoIGRldmljZSwgIjN3aXJlICVwIGNvdWxkIG5vdCBhdXRvZGV0ZWN0IGFkZHJlc3MgIgorCQkgICAgICAgImxlbmd0aDogJXNcbiIsIGRldmljZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlEQkdDICggZGV2aWNlLCAiM3dpcmUgJXAgYXV0b2RldGVjdGVkIGFkZHJlc3MgbGVuZ3RoICVkXG4iLAorCSAgICAgICBkZXZpY2UsIGRldmljZS0+YWRkcmVzc19sZW4gKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9jb21tYW5kcy9hdXRvYm9vdF9jbWQuYyBiL2dweGUvc3JjL2hjaS9jb21tYW5kcy9hdXRvYm9vdF9jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWIxNzJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL2F1dG9ib290X2NtZC5jCkBAIC0wLDAgKzEsMjcgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdweGUvY29tbWFuZC5oPgorI2luY2x1ZGUgPHVzci9hdXRvYm9vdC5oPgorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0YXRpYyBpbnQgYXV0b2Jvb3RfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKworCWlmICggYXJnYyAhPSAxICkgeworCQlwcmludGYgKCAiVXNhZ2U6XG4iCisJCQkgIiAgJXNcbiIKKwkJCSAiXG4iCisJCQkgIkF0dGVtcHRzIHRvIGJvb3QgdGhlIHN5c3RlbVxuIiwKKwkJCSBhcmd2WzBdICk7CisJCXJldHVybiAxOworCX0KKworCWF1dG9ib290KCk7CisKKwkvKiBDYW4gbmV2ZXIgcmV0dXJuIHN1Y2Nlc3MgYnkgZGVmaW5pdGlvbiAqLworCXJldHVybiAxOworfQorCitzdHJ1Y3QgY29tbWFuZCBhdXRvYm9vdF9jb21tYW5kIF9fY29tbWFuZCA9IHsKKwkubmFtZSA9ICJhdXRvYm9vdCIsCisJLmV4ZWMgPSBhdXRvYm9vdF9leGVjLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9jb21tYW5kcy9jb25maWdfY21kLmMgYi9ncHhlL3NyYy9oY2kvY29tbWFuZHMvY29uZmlnX2NtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTFmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvY29tbWFuZHMvY29uZmlnX2NtZC5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdweGUvY29tbWFuZC5oPgorI2luY2x1ZGUgPGdweGUvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxncHhlL3NldHRpbmdzX3VpLmg+CisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RhdGljIGludCBjb25maWdfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwljaGFyICpzZXR0aW5nc19uYW1lOworCXN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3M7CisJaW50IHJjOworCisJaWYgKCBhcmdjID4gMiApIHsKKwkJcHJpbnRmICggIlVzYWdlOiAlcyBbc2NvcGVdXG4iCisJCQkgIk9wZW5zIHRoZSBvcHRpb24gY29uZmlndXJhdGlvbiBjb25zb2xlXG4iLCBhcmd2WzBdICk7CisJCXJldHVybiAxOworCX0KKworCXNldHRpbmdzX25hbWUgPSAoICggYXJnYyA9PSAyICkgPyBhcmd2WzFdIDogIiIgKTsKKwlzZXR0aW5ncyA9IGZpbmRfc2V0dGluZ3MgKCBzZXR0aW5nc19uYW1lICk7CisJaWYgKCAhIHNldHRpbmdzICkgeworCQlwcmludGYgKCAiTm8gc3VjaCBzY29wZSBcIiVzXCJcbiIsIHNldHRpbmdzX25hbWUgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCAoIHJjID0gc2V0dGluZ3NfdWkgKCBzZXR0aW5ncyApICkgIT0gMCApIHsKKwkJcHJpbnRmICggIkNvdWxkIG5vdCBzYXZlIHNldHRpbmdzOiAlc1xuIiwKKwkJCSBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb21tYW5kIGNvbmZpZ19jb21tYW5kIF9fY29tbWFuZCA9IHsKKwkubmFtZSA9ICJjb25maWciLAorCS5leGVjID0gY29uZmlnX2V4ZWMsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL2RoY3BfY21kLmMgYi9ncHhlL3NyYy9oY2kvY29tbWFuZHMvZGhjcF9jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmFhYzhkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL2RoY3BfY21kLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvaW4uaD4KKyNpbmNsdWRlIDxncHhlL2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx1c3IvZGhjcG1nbXQuaD4KKworLyoqIEBmaWxlCisgKgorICogREhDUCBtYW5hZ2VtZW50IGNvbW1hbmRzCisgKgorICovCisKKy8qKgorICogImRoY3AiIGNvbW1hbmQgc3ludGF4IG1lc3NhZ2UKKyAqCisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGRoY3Bfc3ludGF4ICggY2hhciAqKmFyZ3YgKSB7CisJcHJpbnRmICggIlVzYWdlOlxuIgorCQkgIiAgJXMgPGludGVyZmFjZT5cbiIKKwkJICJcbiIKKwkJICJDb25maWd1cmUgYSBuZXR3b3JrIGludGVyZmFjZSB1c2luZyBESENQXG4iLAorCQkgYXJndlswXSApOworfQorCisvKioKKyAqIFRoZSAiZGhjcCIgY29tbWFuZAorICoKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAcmV0IHJjCQlFeGl0IGNvZGUKKyAqLworc3RhdGljIGludCBkaGNwX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKKwkJeyAiaGVscCIsIDAsIE5VTEwsICdoJyB9LAorCQl7IE5VTEwsIDAsIE5VTEwsIDAgfSwKKwl9OworCWNvbnN0IGNoYXIgKm5ldGRldl90eHQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlpbnQgYzsKKwlpbnQgcmM7CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJd2hpbGUgKCAoIGMgPSBnZXRvcHRfbG9uZyAoIGFyZ2MsIGFyZ3YsICJoIiwgbG9uZ29wdHMsIE5VTEwgKSApID49IDAgKXsKKwkJc3dpdGNoICggYyApIHsKKwkJY2FzZSAnaCc6CisJCQkvKiBEaXNwbGF5IGhlbHAgdGV4dCAqLworCQlkZWZhdWx0OgorCQkJLyogVW5yZWNvZ25pc2VkL2ludmFsaWQgb3B0aW9uICovCisJCQlkaGNwX3N5bnRheCAoIGFyZ3YgKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyogTmVlZCBleGFjdGx5IG9uZSBpbnRlcmZhY2UgbmFtZSByZW1haW5pbmcgYWZ0ZXIgdGhlIG9wdGlvbnMgKi8KKwlpZiAoIG9wdGluZCAhPSAoIGFyZ2MgLSAxICkgKSB7CisJCWRoY3Bfc3ludGF4ICggYXJndiApOworCQlyZXR1cm4gMTsKKwl9CisJbmV0ZGV2X3R4dCA9IGFyZ3Zbb3B0aW5kXTsKKworCS8qIFBhcnNlIGFyZ3VtZW50cyAqLworCW5ldGRldiA9IGZpbmRfbmV0ZGV2ICggbmV0ZGV2X3R4dCApOworCWlmICggISBuZXRkZXYgKSB7CisJCXByaW50ZiAoICJObyBzdWNoIGludGVyZmFjZTogJXNcbiIsIG5ldGRldl90eHQgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogUGVyZm9ybSBESENQICovCisJaWYgKCAoIHJjID0gZGhjcCAoIG5ldGRldiApICkgIT0gMCApIHsKKwkJcHJpbnRmICggIkNvdWxkIG5vdCBjb25maWd1cmUgJXM6ICVzXG4iLCBuZXRkZXYtPm5hbWUsCisJCQkgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqICJweGVicyIgY29tbWFuZCBzeW50YXggbWVzc2FnZQorICoKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqLworc3RhdGljIHZvaWQgcHhlYnNfc3ludGF4ICggY2hhciAqKmFyZ3YgKSB7CisJcHJpbnRmICggIlVzYWdlOlxuIgorCQkgIiAgJXMgPGludGVyZmFjZT4gPHNlcnZlcl90eXBlPlxuIgorCQkgIlxuIgorCQkgIlBlcmZvcm0gUFhFIEJvb3QgU2VydmVyIGRpc2NvdmVyeVxuIiwKKwkJIGFyZ3ZbMF0gKTsKK30KKworLyoqCisgKiBUaGUgInB4ZWJzIiBjb21tYW5kCisgKgorICogQHYgYXJnYwkJQXJndW1lbnQgY291bnQKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqIEByZXQgcmMJCUV4aXQgY29kZQorICovCitzdGF0aWMgaW50IHB4ZWJzX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKKwkJeyAiaGVscCIsIDAsIE5VTEwsICdoJyB9LAorCQl7IE5VTEwsIDAsIE5VTEwsIDAgfSwKKwl9OworCWNvbnN0IGNoYXIgKm5ldGRldl90eHQ7CisJY29uc3QgY2hhciAqcHhlX3R5cGVfdHh0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJdW5zaWduZWQgaW50IHB4ZV90eXBlOworCWNoYXIgKmVuZDsKKwlpbnQgYzsKKwlpbnQgcmM7CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJd2hpbGUgKCAoIGMgPSBnZXRvcHRfbG9uZyAoIGFyZ2MsIGFyZ3YsICJoIiwgbG9uZ29wdHMsIE5VTEwgKSApID49IDAgKXsKKwkJc3dpdGNoICggYyApIHsKKwkJY2FzZSAnaCc6CisJCQkvKiBEaXNwbGF5IGhlbHAgdGV4dCAqLworCQlkZWZhdWx0OgorCQkJLyogVW5yZWNvZ25pc2VkL2ludmFsaWQgb3B0aW9uICovCisJCQlweGVic19zeW50YXggKCBhcmd2ICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlpZiAoIG9wdGluZCAhPSAoIGFyZ2MgLSAyICkgKSB7CisJCXB4ZWJzX3N5bnRheCAoIGFyZ3YgKTsKKwkJcmV0dXJuIDE7CisJfQorCW5ldGRldl90eHQgPSBhcmd2W29wdGluZF07CisJcHhlX3R5cGVfdHh0ID0gYXJndlsgb3B0aW5kICsgMSBdOworCisJLyogUGFyc2UgYXJndW1lbnRzICovCisJbmV0ZGV2ID0gZmluZF9uZXRkZXYgKCBuZXRkZXZfdHh0ICk7CisJaWYgKCAhIG5ldGRldiApIHsKKwkJcHJpbnRmICggIk5vIHN1Y2ggaW50ZXJmYWNlOiAlc1xuIiwgbmV0ZGV2X3R4dCApOworCQlyZXR1cm4gMTsKKwl9CisJcHhlX3R5cGUgPSBzdHJ0b3VsICggcHhlX3R5cGVfdHh0LCAmZW5kLCAwICk7CisJaWYgKCAqZW5kICkgeworCQlwcmludGYgKCAiQmFkIHNlcnZlciB0eXBlOiAlc1xuIiwgcHhlX3R5cGVfdHh0ICk7CisJCXJldHVybiAxOworCX0KKworCS8qIFBlcmZvcm0gQm9vdCBTZXJ2ZXIgRGlzY292ZXJ5ICovCisJaWYgKCAoIHJjID0gcHhlYnMgKCBuZXRkZXYsIHB4ZV90eXBlICkgKSAhPSAwICkgeworCQlwcmludGYgKCAiQ291bGQgbm90IGRpc2NvdmVyIGJvb3Qgc2VydmVyIG9uICVzOiAlc1xuIiwKKwkJCSBuZXRkZXYtPm5hbWUsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqIERIQ1AgbWFuYWdlbWVudCBjb21tYW5kcyAqLworc3RydWN0IGNvbW1hbmQgZGhjcF9jb21tYW5kc1tdIF9fY29tbWFuZCA9IHsKKwl7CisJCS5uYW1lID0gImRoY3AiLAorCQkuZXhlYyA9IGRoY3BfZXhlYywKKwl9LAorCXsKKwkJLm5hbWUgPSAicHhlYnMiLAorCQkuZXhlYyA9IHB4ZWJzX2V4ZWMsCisJfSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvY29tbWFuZHMvZGlnZXN0X2NtZC5jIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL2RpZ2VzdF9jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzZlNTUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL2RpZ2VzdF9jbWQuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBEYW5pZWwgVmVya2FtcCA8ZGFuaWVsQGRydi5udT4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdweGUvY29tbWFuZC5oPgorI2luY2x1ZGUgPGdweGUvaW1hZ2UuaD4KKyNpbmNsdWRlIDxncHhlL2NyeXB0by5oPgorCisjaW5jbHVkZSA8Z3B4ZS9tZDUuaD4KKyNpbmNsdWRlIDxncHhlL3NoYTEuaD4KKworLyoqCisgKiAiZGlnZXN0IiBjb21tYW5kIHN5bnRheCBtZXNzYWdlCisgKgorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICovCitzdGF0aWMgdm9pZCBkaWdlc3Rfc3ludGF4ICggY2hhciAqKmFyZ3YgKSB7CisJcHJpbnRmICggIlVzYWdlOlxuIgorCQkgIiAgJXMgPGltYWdlIG5hbWU+XG4iCisJCSAiXG4iCisJCSAiQ2FsY3VsYXRlIHRoZSAlcyBvZiBhbiBpbWFnZVxuIiwKKwkJIGFyZ3ZbMF0sIGFyZ3ZbMF0gKTsKK30KKworLyoqCisgKiBUaGUgImRpZ2VzdCIgY29tbWFuZAorICoKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAdiBkaWdlc3QJCURpZ2VzdCBhbGdvcml0aG0KKyAqIEByZXQgcmMJCUV4aXQgY29kZQorICovCitzdGF0aWMgaW50IGRpZ2VzdF9leGVjICggaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJIHN0cnVjdCBkaWdlc3RfYWxnb3JpdGhtICpkaWdlc3QgKSB7CisJY29uc3QgY2hhciAqaW1hZ2VfbmFtZTsKKwlzdHJ1Y3QgaW1hZ2UgKmltYWdlOworCXVpbnQ4X3QgZGlnZXN0X2N0eFtkaWdlc3QtPmN0eHNpemVdOworCXVpbnQ4X3QgZGlnZXN0X291dFtkaWdlc3QtPmRpZ2VzdHNpemVdOworCXVpbnQ4X3QgYnVmWzEyOF07CisJc2l6ZV90IG9mZnNldDsKKwlzaXplX3QgbGVuOworCXNpemVfdCBmcmFnX2xlbjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBqOworCisJaWYgKCBhcmdjIDwgMiB8fAorCSAgICAgIXN0cmNtcCAoIGFyZ3ZbMV0sICItLWhlbHAiICkgfHwKKwkgICAgICFzdHJjbXAgKCBhcmd2WzFdLCAiLWgiICkgKSB7CisJCWRpZ2VzdF9zeW50YXggKCBhcmd2ICk7CisJCXJldHVybiAxOworCX0KKworCWZvciAoIGkgPSAxIDsgaSA8IGFyZ2MgOyBpKysgKSB7CisJCWltYWdlX25hbWUgPSBhcmd2W2ldOworCisJCS8qIGZpbmQgaW1hZ2UgKi8KKwkJaW1hZ2UgPSBmaW5kX2ltYWdlICggaW1hZ2VfbmFtZSApOworCQlpZiAoICEgaW1hZ2UgKSB7CisJCQlwcmludGYgKCAiTm8gc3VjaCBpbWFnZTogJXNcbiIsIGltYWdlX25hbWUgKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9mZnNldCA9IDA7CisJCWxlbiA9IGltYWdlLT5sZW47CisKKwkJLyogY2FsY3VsYXRlIGRpZ2VzdCAqLworCQlkaWdlc3RfaW5pdCAoIGRpZ2VzdCwgZGlnZXN0X2N0eCApOworCQl3aGlsZSAoIGxlbiApIHsKKwkJCWZyYWdfbGVuID0gbGVuOworCQkJaWYgKCBmcmFnX2xlbiA+IHNpemVvZiAoIGJ1ZiApICkKKwkJCQlmcmFnX2xlbiA9IHNpemVvZiAoIGJ1ZiApOworCQkJY29weV9mcm9tX3VzZXIgKCBidWYsIGltYWdlLT5kYXRhLCBvZmZzZXQsIGZyYWdfbGVuICk7CisJCQlkaWdlc3RfdXBkYXRlICggZGlnZXN0LCBkaWdlc3RfY3R4LCBidWYsIGZyYWdfbGVuICk7CisJCQlsZW4gLT0gZnJhZ19sZW47CisJCQlvZmZzZXQgKz0gZnJhZ19sZW47CisJCX0KKwkJZGlnZXN0X2ZpbmFsICggZGlnZXN0LCBkaWdlc3RfY3R4LCBkaWdlc3Rfb3V0ICk7CisKKwkJZm9yICggaiA9IDAgOyBqIDwgc2l6ZW9mICggZGlnZXN0X291dCApIDsgaisrICkKKwkJCXByaW50ZiAoICIlMDJ4IiwgZGlnZXN0X291dFtqXSApOworCisJCXByaW50ZiAoICIgICVzXG4iLCBpbWFnZS0+bmFtZSApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1kNXN1bV9leGVjICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCXJldHVybiBkaWdlc3RfZXhlYyAoIGFyZ2MsIGFyZ3YsICZtZDVfYWxnb3JpdGhtICk7Cit9CisKK3N0YXRpYyBpbnQgc2hhMXN1bV9leGVjICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCXJldHVybiBkaWdlc3RfZXhlYyAoIGFyZ2MsIGFyZ3YsICZzaGExX2FsZ29yaXRobSApOworfQorCitzdHJ1Y3QgY29tbWFuZCBtZDVzdW1fY29tbWFuZCBfX2NvbW1hbmQgPSB7CisJLm5hbWUgPSAibWQ1c3VtIiwKKwkuZXhlYyA9IG1kNXN1bV9leGVjLAorfTsKKworc3RydWN0IGNvbW1hbmQgc2hhMXN1bV9jb21tYW5kIF9fY29tbWFuZCA9IHsKKwkubmFtZSA9ICJzaGExc3VtIiwKKwkuZXhlYyA9IHNoYTFzdW1fZXhlYywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvY29tbWFuZHMvZ2Ric3R1Yl9jbWQuYyBiL2dweGUvc3JjL2hjaS9jb21tYW5kcy9nZGJzdHViX2NtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTY3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvY29tbWFuZHMvZ2Ric3R1Yl9jbWQuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTdGVmYW4gSGFqbm9jemkgPHN0ZWZhbmhhQGdtYWlsLmNvbT4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGdweGUvY29tbWFuZC5oPgorI2luY2x1ZGUgPGdweGUvZ2Ric3R1Yi5oPgorCisvKiogQGZpbGUKKyAqCisgKiBHREIgc3R1YiBjb21tYW5kCisgKgorICovCisKKy8qKgorICogImdkYnN0dWIiIGNvbW1hbmQgc3ludGF4IG1lc3NhZ2UKKyAqCisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGdkYnN0dWJfc3ludGF4ICggY2hhciAqKmFyZ3YgKSB7CisJcHJpbnRmICggIlVzYWdlOlxuIgorCQkgIiAgJXMgPHRyYW5zcG9ydD4gWzxvcHRpb25zPi4uLl1cbiIKKwkJICJcbiIKKwkJICJTdGFydCByZW1vdGUgZGVidWdnaW5nIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRyYW5zcG9ydHM6XG4iCisJCSAiICBzZXJpYWwgICAgICAgICAgIHVzZSBzZXJpYWwgcG9ydCAoaWYgY29tcGlsZWQgaW4pXG4iCisJCSAiICB1ZHAgPGludGVyZmFjZT4gIHVzZSBVRFAgb3ZlciBuZXR3b3JrIGludGVyZmFjZSAoaWYgY29tcGlsZWQgaW4pXG4iLAorCQkgYXJndlswXSApOworfQorCisvKioKKyAqIFRoZSAiZ2Ric3R1YiIgY29tbWFuZAorICoKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAcmV0IHJjCQlFeGl0IGNvZGUKKyAqLworc3RhdGljIGludCBnZGJzdHViX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKKwkJeyAiaGVscCIsIDAsIE5VTEwsICdoJyB9LAorCQl7IE5VTEwsIDAsIE5VTEwsIDAgfSwKKwl9OworCWNvbnN0IGNoYXIgKnRyYW5zX25hbWU7CisJc3RydWN0IGdkYl90cmFuc3BvcnQgKnRyYW5zOworCWludCBjOworCisJLyogUGFyc2Ugb3B0aW9ucyAqLworCXdoaWxlICggKCBjID0gZ2V0b3B0X2xvbmcgKCBhcmdjLCBhcmd2LCAiaCIsIGxvbmdvcHRzLCBOVUxMICkgKSA+PSAwICl7CisJCXN3aXRjaCAoIGMgKSB7CisJCWNhc2UgJ2gnOgorCQkJLyogRGlzcGxheSBoZWxwIHRleHQgKi8KKwkJZGVmYXVsdDoKKwkJCS8qIFVucmVjb2duaXNlZC9pbnZhbGlkIG9wdGlvbiAqLworCQkJZ2Ric3R1Yl9zeW50YXggKCBhcmd2ICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIEF0IGxlYXN0IG9uZSBhcmd1bWVudCAqLworCWlmICggb3B0aW5kID09IGFyZ2MgKSB7CisJCWdkYnN0dWJfc3ludGF4ICggYXJndiApOworCQlyZXR1cm4gMTsKKwl9CisKKwl0cmFuc19uYW1lID0gYXJndltvcHRpbmQrK107CisKKwkvKiBJbml0aWFsaXNlIHRyYW5zcG9ydCAqLworCXRyYW5zID0gZmluZF9nZGJfdHJhbnNwb3J0ICggdHJhbnNfbmFtZSApOworCWlmICggIXRyYW5zICkgeworCQlwcmludGYgKCAiJXM6IG5vIHN1Y2ggdHJhbnNwb3J0IChpcyBpdCBjb21waWxlZCBpbj8pXG4iLCB0cmFuc19uYW1lICk7CisJCXJldHVybiAxOworCX0KKworCWlmICggdHJhbnMtPmluaXQgKSB7CisJCWlmICggdHJhbnMtPmluaXQgKCBhcmdjIC0gb3B0aW5kLCAmYXJndltvcHRpbmRdICkgIT0gMCApIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyogRW50ZXIgR0RCIHN0dWIgKi8KKwlnZGJzdHViX3N0YXJ0ICggdHJhbnMgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqIEdEQiBzdHViIGNvbW1hbmRzICovCitzdHJ1Y3QgY29tbWFuZCBnZGJzdHViX2NvbW1hbmRzW10gX19jb21tYW5kID0geworCXsKKwkJLm5hbWUgPSAiZ2Ric3R1YiIsCisJCS5leGVjID0gZ2Ric3R1Yl9leGVjLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL2lmbWdtdF9jbWQuYyBiL2dweGUvc3JjL2hjaS9jb21tYW5kcy9pZm1nbXRfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwNjlmMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9jb21tYW5kcy9pZm1nbXRfY21kLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dXNyL2lmbWdtdC5oPgorI2luY2x1ZGUgPGhjaS9pZm1nbXRfY21kLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE5ldHdvcmsgaW50ZXJmYWNlIG1hbmFnZW1lbnQgY29tbWFuZHMKKyAqCisgKi8KKworLyoqIE9wdGlvbnMgc2hhcmVkIGJ5IGFsbCBpZjx4eHg+IGNvbW1hbmRzICovCitzdGF0aWMgc3RydWN0IG9wdGlvbiBpZmNvbW1vbl9sb25nb3B0c1tdID0geworCXsgImhlbHAiLCAwLCBOVUxMLCAnaCcgfSwKKwl7IE5VTEwsIDAsIE5VTEwsIDAgfSwKK307CisKKy8qKgorICogUHJpbnQgc3ludGF4IG9mIGlmPHh4eD4gY29tbWFuZAorICoKKyAqIEB2IGFyZ3YJCUNvbW1hbmQgYXJndW1lbnRzCisgKiBAdiB2ZXJiCQlWZXJiIGRlc2NyaWJpbmcgdGhlIGFjdGlvbiBvZiB0aGUgY29tbWFuZAorICovCitzdGF0aWMgdm9pZCBpZmNvbW1vbl9zeW50YXggKCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqdmVyYiApIHsKKwlwcmludGYgKCAiVXNhZ2U6XG4iCisJCSAiICAlcyBbPGludGVyZmFjZT5dIFs8aW50ZXJmYWNlPi4uLl1cbiIKKwkJICJcbiIKKwkJICIlcyB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgaW50ZXJmYWNlc1xuIiwKKwkJIGFyZ3ZbMF0sIHZlcmIgKTsKK30KKworLyoqCisgKiBFeGVjdXRlIGlmPHh4eD4gY29tbWFuZCBvdmVyIGFsbCBuZXR3b3JrIGRldmljZXMKKyAqCisgKiBAdiBwYXlsb2FkCQlDb21tYW5kIHRvIGV4ZWN1dGUKKyAqIEByZXQgcmMJCUV4aXQgY29kZQorICovCitzdGF0aWMgaW50IGlmY29tbW9uX2RvX2FsbCAoIGludCAoICogcGF5bG9hZCApICggc3RydWN0IG5ldF9kZXZpY2UgKiApICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJaW50IHJjID0gMDsKKworCS8qIEV4ZWN1dGUgcGF5bG9hZCBmb3IgZWFjaCBuZXR3b3JrIGRldmljZSAqLworCWZvcl9lYWNoX25ldGRldiAoIG5ldGRldiApIHsKKwkJaWYgKCBwYXlsb2FkICggbmV0ZGV2ICkgIT0gMCApCisJCQlyYyA9IDE7CisJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKiBFeGVjdXRlIGlmPHh4eD4gY29tbWFuZCBvdmVyIGxpc3Qgb2YgbmV0d29yayBkZXZpY2VzCisgKgorICogQHYgcGF5bG9hZAkJQ29tbWFuZCB0byBleGVjdXRlCisgKiBAcmV0IHJjCQlFeGl0IGNvZGUKKyAqLworc3RhdGljIGludCBpZmNvbW1vbl9kb19saXN0ICggaW50ICggKiBwYXlsb2FkICkgKCBzdHJ1Y3QgbmV0X2RldmljZSAqICksCisJCQkgICAgICBjaGFyICoqbGlzdCwgdW5zaWduZWQgaW50IGNvdW50ICkgeworCWNvbnN0IGNoYXIgKm5ldGRldl9uYW1lOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJaW50IHJjID0gMDsKKworCXdoaWxlICggY291bnQtLSApIHsKKwkJbmV0ZGV2X25hbWUgPSAqKGxpc3QrKyk7CisJCW5ldGRldiA9IGZpbmRfbmV0ZGV2ICggbmV0ZGV2X25hbWUgKTsKKwkJaWYgKCAhIG5ldGRldiApIHsKKwkJCXByaW50ZiAoICIlczogbm8gc3VjaCBpbnRlcmZhY2VcbiIsIG5ldGRldl9uYW1lICk7CisJCQlyYyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIHBheWxvYWQgKCBuZXRkZXYgKSAhPSAwICkKKwkJCXJjID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEV4ZWN1dGUgaWY8eHh4PiBjb21tYW5kCisgKgorICogQHYgYXJnYwkJQXJndW1lbnQgY291bnQKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqIEB2IHBheWxvYWQJCUNvbW1hbmQgdG8gZXhlY3V0ZQorICogQHYgdmVyYgkJVmVyYiBkZXNjcmliaW5nIHRoZSBhY3Rpb24gb2YgdGhlIGNvbW1hbmQKKyAqIEByZXQgcmMJCUV4aXQgY29kZQorICovCitpbnQgaWZjb21tb25fZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJICAgIGludCAoICogcGF5bG9hZCApICggc3RydWN0IG5ldF9kZXZpY2UgKiApLAorCQkgICAgY29uc3QgY2hhciAqdmVyYiApIHsKKwlpbnQgYzsKKworCS8qIFBhcnNlIG9wdGlvbnMgKi8KKwl3aGlsZSAoICggYyA9IGdldG9wdF9sb25nICggYXJnYywgYXJndiwgImgiLCBpZmNvbW1vbl9sb25nb3B0cywKKwkJCQkgICAgTlVMTCApICkgPj0gMCApIHsKKwkJc3dpdGNoICggYyApIHsKKwkJY2FzZSAnaCc6CisJCQkvKiBEaXNwbGF5IGhlbHAgdGV4dCAqLworCQlkZWZhdWx0OgorCQkJLyogVW5yZWNvZ25pc2VkL2ludmFsaWQgb3B0aW9uICovCisJCQlpZmNvbW1vbl9zeW50YXggKCBhcmd2LCB2ZXJiICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmICggb3B0aW5kID09IGFyZ2MgKSB7CisJCXJldHVybiBpZmNvbW1vbl9kb19hbGwgKCBwYXlsb2FkICk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGlmY29tbW9uX2RvX2xpc3QgKCBwYXlsb2FkLCAmYXJndltvcHRpbmRdLAorCQkJCQkgICggYXJnYyAtIG9wdGluZCApICk7CisJfQorfQorCisvKiAiaWZvcGVuIiBjb21tYW5kICovCisKK3N0YXRpYyBpbnQgaWZvcGVuX3BheWxvYWQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXJldHVybiBpZm9wZW4gKCBuZXRkZXYgKTsKK30KKworc3RhdGljIGludCBpZm9wZW5fZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlyZXR1cm4gaWZjb21tb25fZXhlYyAoIGFyZ2MsIGFyZ3YsIGlmb3Blbl9wYXlsb2FkLCAiT3BlbiIgKTsKK30KKworLyogImlmY2xvc2UiIGNvbW1hbmQgKi8KKworc3RhdGljIGludCBpZmNsb3NlX3BheWxvYWQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCWlmY2xvc2UgKCBuZXRkZXYgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZmNsb3NlX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJcmV0dXJuIGlmY29tbW9uX2V4ZWMgKCBhcmdjLCBhcmd2LCBpZmNsb3NlX3BheWxvYWQsICJDbG9zZSIgKTsKK30KKworLyogImlmc3RhdCIgY29tbWFuZCAqLworCitzdGF0aWMgaW50IGlmc3RhdF9wYXlsb2FkICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlpZnN0YXQgKCBuZXRkZXYgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZnN0YXRfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlyZXR1cm4gaWZjb21tb25fZXhlYyAoIGFyZ2MsIGFyZ3YsCisJCQkgICAgICAgaWZzdGF0X3BheWxvYWQsICJEaXNwbGF5IHN0YXR1cyBvZiIgKTsKK30KKworLyoqIEludGVyZmFjZSBtYW5hZ2VtZW50IGNvbW1hbmRzICovCitzdHJ1Y3QgY29tbWFuZCBpZm1nbXRfY29tbWFuZHNbXSBfX2NvbW1hbmQgPSB7CisJeworCQkubmFtZSA9ICJpZm9wZW4iLAorCQkuZXhlYyA9IGlmb3Blbl9leGVjLAorCX0sCisJeworCQkubmFtZSA9ICJpZmNsb3NlIiwKKwkJLmV4ZWMgPSBpZmNsb3NlX2V4ZWMsCisJfSwKKwl7CisJCS5uYW1lID0gImlmc3RhdCIsCisJCS5leGVjID0gaWZzdGF0X2V4ZWMsCisJfSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvY29tbWFuZHMvaW1hZ2VfY21kLmMgYi9ncHhlL3NyYy9oY2kvY29tbWFuZHMvaW1hZ2VfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5OTRiNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9jb21tYW5kcy9pbWFnZV9jbWQuYwpAQCAtMCwwICsxLDYwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaWJnZW4uaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxncHhlL2ltYWdlLmg+CisjaW5jbHVkZSA8Z3B4ZS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dXNyL2ltZ21nbXQuaD4KKworLyoqIEBmaWxlCisgKgorICogSW1hZ2UgbWFuYWdlbWVudCBjb21tYW5kcworICoKKyAqLworCitlbnVtIGltYWdlX2FjdGlvbiB7CisJSU1HX0ZFVENIID0gMCwKKwlJTUdfTE9BRCwKKwlJTUdfRVhFQywKK307CisKKy8qKgorICogRmlsbCBpbiBpbWFnZSBjb21tYW5kIGxpbmUKKyAqCisgKiBAdiBpbWFnZQkJSW1hZ2UKKyAqIEB2IG5hcmdzCQlBcmd1bWVudCBjb3VudAorICogQHYgYXJncwkJQXJndW1lbnQgbGlzdAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaW1nZmlsbF9jbWRsaW5lICggc3RydWN0IGltYWdlICppbWFnZSwgdW5zaWduZWQgaW50IG5hcmdzLCAKKwkJCSAgICAgY2hhciAqKmFyZ3MgKSB7CisJc2l6ZV90IGxlbjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIERldGVybWluZSB0b3RhbCBsZW5ndGggb2YgY29tbWFuZCBsaW5lICovCisJbGVuID0gMTsgLyogTlVMICovCisJZm9yICggaSA9IDAgOyBpIDwgbmFyZ3MgOyBpKysgKQorCQlsZW4gKz0gKCAxIC8qIHBvc3NpYmxlIHNwYWNlICovICsgc3RybGVuICggYXJnc1tpXSApICk7CisKKwl7CisJCWNoYXIgYnVmW2xlbl07CisJCWNoYXIgKnB0ciA9IGJ1ZjsKKworCQkvKiBBc3NlbWJsZSBjb21tYW5kIGxpbmUgKi8KKwkJYnVmWzBdID0gJ1wwJzsKKwkJZm9yICggaSA9IDAgOyBpIDwgbmFyZ3MgOyBpKysgKSB7CisJCQlwdHIgKz0gc3ByaW50ZiAoIHB0ciwgIiVzJXMiLCAoIGkgPyAiICIgOiAiIiApLAorCQkJCQkgYXJnc1tpXSApOworCQl9CisJCWFzc2VydCAoIHB0ciA8ICggYnVmICsgbGVuICkgKTsKKworCQlyZXR1cm4gaW1hZ2Vfc2V0X2NtZGxpbmUgKCBpbWFnZSwgYnVmICk7CisJfQorfQorCisvKioKKyAqICJpbWdmZXRjaCIvIm1vZHVsZSIvImtlcm5lbCIgY29tbWFuZCBzeW50YXggbWVzc2FnZQorICoKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqLworc3RhdGljIHZvaWQgaW1nZmV0Y2hfY29yZV9zeW50YXggKCBjaGFyICoqYXJndiwgZW51bSBpbWFnZV9hY3Rpb24gYWN0aW9uICkgeworCXN0YXRpYyBjb25zdCBjaGFyICphY3Rpb25zW10gPSB7CisJCVtJTUdfRkVUQ0hdCT0gIkZldGNoIiwKKwkJW0lNR19MT0FEXQk9ICJGZXRjaCBhbmQgbG9hZCIsCisJCVtJTUdfRVhFQ10JPSAiRmV0Y2ggYW5kIGV4ZWN1dGUiLAorCX07CisKKwlwcmludGYgKCAiVXNhZ2U6XG4iCisJCSAiICAlcyBbLW58LS1uYW1lIDxuYW1lPl0gZmlsZW5hbWUgW2FyZ3VtZW50cy4uLl1cbiIKKwkJICJcbiIKKwkJICIlcyBleGVjdXRhYmxlL2xvYWRhYmxlIGltYWdlXG4iLAorCQkgYXJndlswXSwgYWN0aW9uc1thY3Rpb25dICk7Cit9CisKKy8qKgorICogVGhlICJpbWdmZXRjaCIvIm1vZHVsZSIvImtlcm5lbCIgY29tbWFuZCBib2R5CisgKgorICogQHYgaW1hZ2VfdHlwZQlJbWFnZSB0eXBlIHRvIGFzc2lnbiAob3IgTlVMTCkKKyAqIEB2IGxvYWQJCUltYWdlIHdpbGwgYmUgYXV0b21hdGljYWxseSBsb2FkZWQgYWZ0ZXIgZmV0Y2hpbmcKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpbWdmZXRjaF9jb3JlX2V4ZWMgKCBzdHJ1Y3QgaW1hZ2VfdHlwZSAqaW1hZ2VfdHlwZSwKKwkJCQllbnVtIGltYWdlX2FjdGlvbiBhY3Rpb24sCisJCQkJaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7CisJCXsgImhlbHAiLCAwLCBOVUxMLCAnaCcgfSwKKwkJeyAibmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbicgfSwKKwkJeyBOVUxMLCAwLCBOVUxMLCAwIH0sCisJfTsKKwlzdHJ1Y3QgaW1hZ2UgKmltYWdlOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCWNoYXIgKmZpbGVuYW1lOworCWludCAoICogaW1hZ2VfcmVnaXN0ZXIgKSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKTsKKwlpbnQgYzsKKwlpbnQgcmM7CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJd2hpbGUgKCAoIGMgPSBnZXRvcHRfbG9uZyAoIGFyZ2MsIGFyZ3YsICJobjoiLAorCQkJCSAgICBsb25nb3B0cywgTlVMTCApICkgPj0gMCApIHsKKwkJc3dpdGNoICggYyApIHsKKwkJY2FzZSAnbic6CisJCQkvKiBTZXQgaW1hZ2UgbmFtZSAqLworCQkJbmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCS8qIERpc3BsYXkgaGVscCB0ZXh0ICovCisJCWRlZmF1bHQ6CisJCQkvKiBVbnJlY29nbmlzZWQvaW52YWxpZCBvcHRpb24gKi8KKwkJCWltZ2ZldGNoX2NvcmVfc3ludGF4ICggYXJndiwgYWN0aW9uICk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIE5lZWQgYXQgbGVhc3QgYSBmaWxlbmFtZSByZW1haW5pbmcgYWZ0ZXIgdGhlIG9wdGlvbnMgKi8KKwlpZiAoIG9wdGluZCA9PSBhcmdjICkgeworCQlpbWdmZXRjaF9jb3JlX3N5bnRheCAoIGFyZ3YsIGFjdGlvbiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZmlsZW5hbWUgPSBhcmd2W29wdGluZCsrXTsKKwlpZiAoICEgbmFtZSApCisJCW5hbWUgPSBiYXNlbmFtZSAoIGZpbGVuYW1lICk7CisKKwkvKiBBbGxvY2F0ZSBpbWFnZSAqLworCWltYWdlID0gYWxsb2NfaW1hZ2UoKTsKKwlpZiAoICEgaW1hZ2UgKSB7CisJCXByaW50ZiAoICIlc1xuIiwgc3RyZXJyb3IgKCAtRU5PTUVNICkgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogRmlsbCBpbiBpbWFnZSBuYW1lICovCisJaWYgKCBuYW1lICkgeworCQlpZiAoICggcmMgPSBpbWFnZV9zZXRfbmFtZSAoIGltYWdlLCBuYW1lICkgKSAhPSAwICkKKwkJCXJldHVybiByYzsKKwl9CisKKwkvKiBTZXQgaW1hZ2UgdHlwZSAoaWYgc3BlY2lmaWVkKSAqLworCWltYWdlLT50eXBlID0gaW1hZ2VfdHlwZTsKKworCS8qIEZpbGwgaW4gY29tbWFuZCBsaW5lICovCisJaWYgKCAoIHJjID0gaW1nZmlsbF9jbWRsaW5lICggaW1hZ2UsICggYXJnYyAtIG9wdGluZCApLAorCQkJCSAgICAgICZhcmd2W29wdGluZF0gKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBGZXRjaCB0aGUgaW1hZ2UgKi8KKwlzd2l0Y2ggKCBhY3Rpb24gKSB7CisJY2FzZSBJTUdfRkVUQ0g6CisJCWltYWdlX3JlZ2lzdGVyID0gcmVnaXN0ZXJfaW1hZ2U7CisJCWJyZWFrOworCWNhc2UgSU1HX0xPQUQ6CisJCWltYWdlX3JlZ2lzdGVyID0gcmVnaXN0ZXJfYW5kX2F1dG9sb2FkX2ltYWdlOworCQlicmVhazsKKwljYXNlIElNR19FWEVDOgorCQlpbWFnZV9yZWdpc3RlciA9IHJlZ2lzdGVyX2FuZF9hdXRvZXhlY19pbWFnZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXNzZXJ0ICggMCApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCAoIHJjID0gaW1nZmV0Y2ggKCBpbWFnZSwgZmlsZW5hbWUsIGltYWdlX3JlZ2lzdGVyICkgKSAhPSAwICkgeworCQlwcmludGYgKCAiQ291bGQgbm90IGZldGNoICVzOiAlc1xuIiwKKwkJCSBmaWxlbmFtZSwgc3RyZXJyb3IgKCByYyApICk7CisJCWltYWdlX3B1dCAoIGltYWdlICk7CisJCXJldHVybiByYzsKKwl9CisKKwlpbWFnZV9wdXQgKCBpbWFnZSApOworCXJldHVybiAwOworfQorCisvKioKKyAqIFRoZSAiaW1nZmV0Y2giLyJtb2R1bGUiIGNvbW1hbmQKKyAqCisgKiBAdiBhcmdjCQlBcmd1bWVudCBjb3VudAorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICogQHJldCByYwkJRXhpdCBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaW1nZmV0Y2hfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlpbnQgcmM7CisKKwlpZiAoICggcmMgPSBpbWdmZXRjaF9jb3JlX2V4ZWMgKCBOVUxMLCBJTUdfRkVUQ0gsCisJCQkJCSBhcmdjLCBhcmd2ICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGhlICJrZXJuZWwiIGNvbW1hbmQKKyAqCisgKiBAdiBhcmdjCQlBcmd1bWVudCBjb3VudAorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICogQHJldCByYwkJRXhpdCBjb2RlCisgKi8KK3N0YXRpYyBpbnQga2VybmVsX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJaW50IHJjOworCisJaWYgKCAoIHJjID0gaW1nZmV0Y2hfY29yZV9leGVjICggTlVMTCwgSU1HX0xPQUQsIGFyZ2MsIGFyZ3YgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGUgImNoYWluIiBjb21tYW5kCisgKgorICogQHYgYXJnYwkJQXJndW1lbnQgY291bnQKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqIEByZXQgcmMJCUV4aXQgY29kZQorICovCitzdGF0aWMgaW50IGNoYWluX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKwlpbnQgcmM7CisKKwlpZiAoICggcmMgPSBpbWdmZXRjaF9jb3JlX2V4ZWMgKCBOVUxMLCBJTUdfRVhFQywgYXJnYywgYXJndiApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICJpbWdsb2FkIiBjb21tYW5kIHN5bnRheCBtZXNzYWdlCisgKgorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICovCitzdGF0aWMgdm9pZCBpbWdsb2FkX3N5bnRheCAoIGNoYXIgKiphcmd2ICkgeworCXByaW50ZiAoICJVc2FnZTpcbiIKKwkJICIgICVzIDxpbWFnZSBuYW1lPlxuIgorCQkgIlxuIgorCQkgIkxvYWQgZXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZVxuIiwKKwkJIGFyZ3ZbMF0gKTsKK30KKworLyoqCisgKiBUaGUgImltZ2xvYWQiIGNvbW1hbmQKKyAqCisgKiBAdiBhcmdjCQlBcmd1bWVudCBjb3VudAorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICogQHJldCByYwkJRXhpdCBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaW1nbG9hZF9leGVjICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7CisJCXsgImhlbHAiLCAwLCBOVUxMLCAnaCcgfSwKKwkJeyBOVUxMLCAwLCBOVUxMLCAwIH0sCisJfTsKKwlzdHJ1Y3QgaW1hZ2UgKmltYWdlOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGM7CisJaW50IHJjOworCisJLyogUGFyc2Ugb3B0aW9ucyAqLworCXdoaWxlICggKCBjID0gZ2V0b3B0X2xvbmcgKCBhcmdjLCBhcmd2LCAiaCIsIGxvbmdvcHRzLCBOVUxMICkgKSA+PSAwICl7CisJCXN3aXRjaCAoIGMgKSB7CisJCWNhc2UgJ2gnOgorCQkJLyogRGlzcGxheSBoZWxwIHRleHQgKi8KKwkJZGVmYXVsdDoKKwkJCS8qIFVucmVjb2duaXNlZC9pbnZhbGlkIG9wdGlvbiAqLworCQkJaW1nbG9hZF9zeW50YXggKCBhcmd2ICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIE5lZWQgZXhhY3RseSBvbmUgaW1hZ2UgbmFtZSByZW1haW5pbmcgYWZ0ZXIgdGhlIG9wdGlvbnMgKi8KKwlpZiAoIG9wdGluZCAhPSAoIGFyZ2MgLSAxICkgKSB7CisJCWltZ2xvYWRfc3ludGF4ICggYXJndiApOworCQlyZXR1cm4gMTsKKwl9CisJbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKworCS8qIExvYWQgYWxsIHNwZWNpZmllZCBpbWFnZXMgKi8KKwlpbWFnZSA9IGZpbmRfaW1hZ2UgKCBuYW1lICk7CisJaWYgKCAhIGltYWdlICkgeworCQlwcmludGYgKCAiTm8gc3VjaCBpbWFnZTogJXNcbiIsIG5hbWUgKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICggKCByYyA9IGltZ2xvYWQgKCBpbWFnZSApICkgIT0gMCApIHsKKwkJcHJpbnRmICggIkNvdWxkIG5vdCBsb2FkICVzOiAlc1xuIiwgbmFtZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAiaW1nYXJncyIgY29tbWFuZCBzeW50YXggbWVzc2FnZQorICoKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqLworc3RhdGljIHZvaWQgaW1nYXJnc19zeW50YXggKCBjaGFyICoqYXJndiApIHsKKwlwcmludGYgKCAiVXNhZ2U6XG4iCisJCSAiICAlcyA8aW1hZ2UgbmFtZT4gWzxhcmd1bWVudHM+Li4uXVxuIgorCQkgIlxuIgorCQkgIlNldCBhcmd1bWVudHMgZm9yIGV4ZWN1dGFibGUvbG9hZGFibGUgaW1hZ2VcbiIsCisJCSBhcmd2WzBdICk7Cit9CisKKy8qKgorICogVGhlICJpbWdhcmdzIiBjb21tYW5kIGJvZHkKKyAqCisgKiBAdiBhcmdjCQlBcmd1bWVudCBjb3VudAorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICogQHJldCByYwkJRXhpdCBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaW1nYXJnc19leGVjICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7CisJCXsgImhlbHAiLCAwLCBOVUxMLCAnaCcgfSwKKwkJeyBOVUxMLCAwLCBOVUxMLCAwIH0sCisJfTsKKwlzdHJ1Y3QgaW1hZ2UgKmltYWdlOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGM7CisJaW50IHJjOworCisJLyogUGFyc2Ugb3B0aW9ucyAqLworCXdoaWxlICggKCBjID0gZ2V0b3B0X2xvbmcgKCBhcmdjLCBhcmd2LCAiaCIsIGxvbmdvcHRzLCBOVUxMICkgKSA+PSAwICl7CisJCXN3aXRjaCAoIGMgKSB7CisJCWNhc2UgJ2gnOgorCQkJLyogRGlzcGxheSBoZWxwIHRleHQgKi8KKwkJZGVmYXVsdDoKKwkJCS8qIFVucmVjb2duaXNlZC9pbnZhbGlkIG9wdGlvbiAqLworCQkJaW1nYXJnc19zeW50YXggKCBhcmd2ICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIE5lZWQgYXQgbGVhc3QgYW4gaW1hZ2UgbmFtZSByZW1haW5pbmcgYWZ0ZXIgdGhlIG9wdGlvbnMgKi8KKwlpZiAoIG9wdGluZCA9PSBhcmdjICkgeworCQlpbWdhcmdzX3N5bnRheCAoIGFyZ3YgKTsKKwkJcmV0dXJuIDE7CisJfQorCW5hbWUgPSBhcmd2W29wdGluZCsrXTsKKworCS8qIEZpbGwgaW4gY29tbWFuZCBsaW5lICovCisJaW1hZ2UgPSBmaW5kX2ltYWdlICggbmFtZSApOworCWlmICggISBpbWFnZSApIHsKKwkJcHJpbnRmICggIk5vIHN1Y2ggaW1hZ2U6ICVzXG4iLCBuYW1lICk7CisJCXJldHVybiAxOworCX0KKwlpZiAoICggcmMgPSBpbWdmaWxsX2NtZGxpbmUgKCBpbWFnZSwgKCBhcmdjIC0gb3B0aW5kICksCisJCQkJICAgICAgJmFyZ3Zbb3B0aW5kXSApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogImltZ2V4ZWMiIGNvbW1hbmQgc3ludGF4IG1lc3NhZ2UKKyAqCisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGltZ2V4ZWNfc3ludGF4ICggY2hhciAqKmFyZ3YgKSB7CisJcHJpbnRmICggIlVzYWdlOlxuIgorCQkgIiAgJXMgPGltYWdlIG5hbWU+XG4iCisJCSAiXG4iCisJCSAiRXhlY3V0ZSBleGVjdXRhYmxlL2xvYWRhYmxlIGltYWdlXG4iLAorCQkgYXJndlswXSApOworfQorCisvKioKKyAqIFRoZSAiaW1nZXhlYyIgY29tbWFuZAorICoKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAcmV0IHJjCQlFeGl0IGNvZGUKKyAqLworc3RhdGljIGludCBpbWdleGVjX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKKwkJeyAiaGVscCIsIDAsIE5VTEwsICdoJyB9LAorCQl7IE5VTEwsIDAsIE5VTEwsIDAgfSwKKwl9OworCXN0cnVjdCBpbWFnZSAqaW1hZ2U7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJaW50IGM7CisJaW50IHJjOworCisJLyogUGFyc2Ugb3B0aW9ucyAqLworCXdoaWxlICggKCBjID0gZ2V0b3B0X2xvbmcgKCBhcmdjLCBhcmd2LCAiaCIsIGxvbmdvcHRzLCBOVUxMICkgKSA+PSAwICl7CisJCXN3aXRjaCAoIGMgKSB7CisJCWNhc2UgJ2gnOgorCQkJLyogRGlzcGxheSBoZWxwIHRleHQgKi8KKwkJZGVmYXVsdDoKKwkJCS8qIFVucmVjb2duaXNlZC9pbnZhbGlkIG9wdGlvbiAqLworCQkJaW1nZXhlY19zeW50YXggKCBhcmd2ICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIE5lZWQgbm8gbW9yZSB0aGFuIG9uZSBpbWFnZSBuYW1lICovCisJaWYgKCBvcHRpbmQgIT0gYXJnYyApCisJCW5hbWUgPSBhcmd2W29wdGluZCsrXTsKKwlpZiAoIG9wdGluZCAhPSBhcmdjICkgeworCQlpbWdleGVjX3N5bnRheCAoIGFyZ3YgKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCS8qIEV4ZWN1dGUgc3BlY2lmaWVkIGltYWdlICovCisJaWYgKCBuYW1lICkgeworCQlpbWFnZSA9IGZpbmRfaW1hZ2UgKCBuYW1lICk7CisJCWlmICggISBpbWFnZSApIHsKKwkJCXByaW50ZiAoICJObyBzdWNoIGltYWdlOiAlc1xuIiwgbmFtZSApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlpbWFnZSA9IGltZ2F1dG9zZWxlY3QoKTsKKwkJaWYgKCAhIGltYWdlICkgeworCQkJcHJpbnRmICggIk5vICh1bmlxdWUpIGxvYWRlZCBpbWFnZVxuIiApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAoICggcmMgPSBpbWdleGVjICggaW1hZ2UgKSApICE9IDAgKSB7CisJCXByaW50ZiAoICJDb3VsZCBub3QgZXhlY3V0ZSAlczogJXNcbiIsCisJCQkgaW1hZ2UtPm5hbWUsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAiaW1nc3RhdCIgY29tbWFuZCBzeW50YXggbWVzc2FnZQorICoKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqLworc3RhdGljIHZvaWQgaW1nc3RhdF9zeW50YXggKCBjaGFyICoqYXJndiApIHsKKwlwcmludGYgKCAiVXNhZ2U6XG4iCisJCSAiICAlc1xuIgorCQkgIlxuIgorCQkgIkxpc3QgZXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZXNcbiIsCisJCSBhcmd2WzBdICk7Cit9CisKKy8qKgorICogVGhlICJpbWdzdGF0IiBjb21tYW5kCisgKgorICogQHYgYXJnYwkJQXJndW1lbnQgY291bnQKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqIEByZXQgcmMJCUV4aXQgY29kZQorICovCitzdGF0aWMgaW50IGltZ3N0YXRfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0geworCQl7ICJoZWxwIiwgMCwgTlVMTCwgJ2gnIH0sCisJCXsgTlVMTCwgMCwgTlVMTCwgMCB9LAorCX07CisJc3RydWN0IGltYWdlICppbWFnZTsKKwlpbnQgYzsKKworCS8qIFBhcnNlIG9wdGlvbnMgKi8KKwl3aGlsZSAoICggYyA9IGdldG9wdF9sb25nICggYXJnYywgYXJndiwgImgiLCBsb25nb3B0cywgTlVMTCApICkgPj0gMCApeworCQlzd2l0Y2ggKCBjICkgeworCQljYXNlICdoJzoKKwkJCS8qIERpc3BsYXkgaGVscCB0ZXh0ICovCisJCWRlZmF1bHQ6CisJCQkvKiBVbnJlY29nbmlzZWQvaW52YWxpZCBvcHRpb24gKi8KKwkJCWltZ3N0YXRfc3ludGF4ICggYXJndiApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBObyBhcmd1bWVudHMgKi8KKwlpZiAoIG9wdGluZCAhPSBhcmdjICkgeworCQlpbWdzdGF0X3N5bnRheCAoIGFyZ3YgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU2hvdyBzdGF0dXMgb2YgYWxsIGltYWdlcyAqLworCWZvcl9lYWNoX2ltYWdlICggaW1hZ2UgKSB7CisJCWltZ3N0YXQgKCBpbWFnZSApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAiaW1nc3RhdCIgY29tbWFuZCBzeW50YXggbWVzc2FnZQorICoKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqLworc3RhdGljIHZvaWQgaW1nZnJlZV9zeW50YXggKCBjaGFyICoqYXJndiApIHsKKwlwcmludGYgKCAiVXNhZ2U6XG4iCisJCSAiICAlcyBbPGltYWdlIG5hbWU+XVxuIgorCQkgIlxuIgorCQkgIkZyZWUgb25lIG9yIGFsbCBleGVjdXRhYmxlL2xvYWRhYmxlIGltYWdlc1xuIiwKKwkJIGFyZ3ZbMF0gKTsKK30KKworLyoqCisgKiBUaGUgImltZ2ZyZWUiIGNvbW1hbmQKKyAqCisgKiBAdiBhcmdjCQlBcmd1bWVudCBjb3VudAorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICogQHJldCByYwkJRXhpdCBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaW1nZnJlZV9leGVjICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7CisJCXsgImhlbHAiLCAwLCBOVUxMLCAnaCcgfSwKKwkJeyBOVUxMLCAwLCBOVUxMLCAwIH0sCisJfTsKKwlzdHJ1Y3QgaW1hZ2UgKmltYWdlOworCXN0cnVjdCBpbWFnZSAqdG1wOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCWludCBjOworCisJLyogUGFyc2Ugb3B0aW9ucyAqLworCXdoaWxlICggKCBjID0gZ2V0b3B0X2xvbmcgKCBhcmdjLCBhcmd2LCAiaCIsIGxvbmdvcHRzLCBOVUxMICkgKSA+PSAwICl7CisJCXN3aXRjaCAoIGMgKSB7CisJCWNhc2UgJ2gnOgorCQkJLyogRGlzcGxheSBoZWxwIHRleHQgKi8KKwkJZGVmYXVsdDoKKwkJCS8qIFVucmVjb2duaXNlZC9pbnZhbGlkIG9wdGlvbiAqLworCQkJaW1nZnJlZV9zeW50YXggKCBhcmd2ICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIE5lZWQgbm8gbW9yZSB0aGFuIG9uZSBpbWFnZSBuYW1lICovCisJaWYgKCBvcHRpbmQgIT0gYXJnYyApCisJCW5hbWUgPSBhcmd2W29wdGluZCsrXTsKKwlpZiAoIG9wdGluZCAhPSBhcmdjICkgeworCQlpbWdmcmVlX3N5bnRheCAoIGFyZ3YgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCBuYW1lICkgeworCQkvKiBGcmVlIHNwZWNpZmllZCBpbWFnZSAobWF5IGxlYWspICovCisJCWltYWdlID0gZmluZF9pbWFnZSAoIG5hbWUgKTsKKwkJaWYgKCAhIGltYWdlICkgeworCQkJcHJpbnRmICggIk5vIHN1Y2ggaW1hZ2U6ICVzXG4iLCBuYW1lICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpbWdmcmVlICggaW1hZ2UgKTsKKwl9IGVsc2UgeworCQkvKiBGcmVlIGFsbCBpbWFnZXMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlICggaW1hZ2UsIHRtcCwgJmltYWdlcywgbGlzdCApIHsKKwkJCWltZ2ZyZWUgKCBpbWFnZSApOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiogSW1hZ2UgbWFuYWdlbWVudCBjb21tYW5kcyAqLworc3RydWN0IGNvbW1hbmQgaW1hZ2VfY29tbWFuZHNbXSBfX2NvbW1hbmQgPSB7CisJeworCQkubmFtZSA9ICJpbWdmZXRjaCIsCisJCS5leGVjID0gaW1nZmV0Y2hfZXhlYywKKwl9LAorCXsKKwkJLm5hbWUgPSAibW9kdWxlIiwKKwkJLmV4ZWMgPSBpbWdmZXRjaF9leGVjLCAvKiBzeW5vbnltIGZvciAiaW1nZmV0Y2giICovCisJfSwKKwl7CisJCS5uYW1lID0gImluaXRyZCIsCisJCS5leGVjID0gaW1nZmV0Y2hfZXhlYywgLyogc3lub255bSBmb3IgImltZ2ZldGNoIiAqLworCX0sCisJeworCQkubmFtZSA9ICJrZXJuZWwiLAorCQkuZXhlYyA9IGtlcm5lbF9leGVjLAorCX0sCisJeworCQkubmFtZSA9ICJjaGFpbiIsCisJCS5leGVjID0gY2hhaW5fZXhlYywKKwl9LAorCXsKKwkJLm5hbWUgPSAiaW1nbG9hZCIsCisJCS5leGVjID0gaW1nbG9hZF9leGVjLAorCX0sCisJeworCQkubmFtZSA9ICJpbWdhcmdzIiwKKwkJLmV4ZWMgPSBpbWdhcmdzX2V4ZWMsCisJfSwKKwl7CisJCS5uYW1lID0gImltZ2V4ZWMiLAorCQkuZXhlYyA9IGltZ2V4ZWNfZXhlYywKKwl9LAorCXsKKwkJLm5hbWUgPSAiYm9vdCIsIC8qIHN5bm9ueW0gZm9yICJpbWdleGVjIiAqLworCQkuZXhlYyA9IGltZ2V4ZWNfZXhlYywKKwl9LAorCXsKKwkJLm5hbWUgPSAiaW1nc3RhdCIsCisJCS5leGVjID0gaW1nc3RhdF9leGVjLAorCX0sCisJeworCQkubmFtZSA9ICJpbWdmcmVlIiwKKwkJLmV4ZWMgPSBpbWdmcmVlX2V4ZWMsCisJfSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvY29tbWFuZHMvaXdtZ210X2NtZC5jIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL2l3bWdtdF9jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZjOWYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL2l3bWdtdF9jbWQuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvbmV0ODAyMTEuaD4KKyNpbmNsdWRlIDxncHhlL2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx1c3IvaXdtZ210Lmg+CisjaW5jbHVkZSA8aGNpL2lmbWdtdF9jbWQuaD4KKworLyogIml3c3RhdCIgY29tbWFuZCAqLworCitzdGF0aWMgaW50IGl3c3RhdF9wYXlsb2FkICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgPSBuZXQ4MDIxMV9nZXQgKCBuZXRkZXYgKTsKKworCWlmICggZGV2ICkKKwkJaXdzdGF0ICggZGV2ICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd3N0YXRfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlyZXR1cm4gaWZjb21tb25fZXhlYyAoIGFyZ2MsIGFyZ3YsCisJCQkgICAgICAgaXdzdGF0X3BheWxvYWQsICJEaXNwbGF5IHdpcmVsZXNzIHN0YXR1cyBvZiIgKTsKK30KKworLyogIml3bGlzdCIgY29tbWFuZCAqLworCitzdGF0aWMgaW50IGl3bGlzdF9wYXlsb2FkICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgPSBuZXQ4MDIxMV9nZXQgKCBuZXRkZXYgKTsKKworCWlmICggZGV2ICkKKwkJcmV0dXJuIGl3bGlzdCAoIGRldiApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdsaXN0X2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJcmV0dXJuIGlmY29tbW9uX2V4ZWMgKCBhcmdjLCBhcmd2LCBpd2xpc3RfcGF5bG9hZCwKKwkJCSAgICAgICAiTGlzdCB3aXJlbGVzcyBuZXR3b3JrcyBhdmFpbGFibGUgdmlhIiApOworfQorCisvKiogV2lyZWxlc3MgaW50ZXJmYWNlIG1hbmFnZW1lbnQgY29tbWFuZHMgKi8KK3N0cnVjdCBjb21tYW5kIGl3bWdtdF9jb21tYW5kc1tdIF9fY29tbWFuZCA9IHsKKwl7CisJCS5uYW1lID0gIml3c3RhdCIsCisJCS5leGVjID0gaXdzdGF0X2V4ZWMsCisJfSwKKwl7CisJCS5uYW1lID0gIml3bGlzdCIsCisJCS5leGVjID0gaXdsaXN0X2V4ZWMsCisJfSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvY29tbWFuZHMvbG9naW5fY21kLmMgYi9ncHhlL3NyYy9oY2kvY29tbWFuZHMvbG9naW5fY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhMjQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9jb21tYW5kcy9sb2dpbl9jbWQuYwpAQCAtMCwwICsxLDI5IEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxncHhlL2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxncHhlL2xvZ2luX3VpLmg+CisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RhdGljIGludCBsb2dpbl9leGVjICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCWludCByYzsKKworCWlmICggYXJnYyA+IDEgKSB7CisJCXByaW50ZiAoICJVc2FnZTogJXNcbiIKKwkJCSAiUHJvbXB0IGZvciBsb2dpbiBjcmVkZW50aWFsc1xuIiwgYXJndlswXSApOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoICggcmMgPSBsb2dpbl91aSgpICkgIT0gMCApIHsKKwkJcHJpbnRmICggIkNvdWxkIG5vdCBzZXQgY3JlZGVudGlhbHM6ICVzXG4iLAorCQkJIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNvbW1hbmQgbG9naW5fY29tbWFuZCBfX2NvbW1hbmQgPSB7CisJLm5hbWUgPSAibG9naW4iLAorCS5leGVjID0gbG9naW5fZXhlYywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvY29tbWFuZHMvbnZvX2NtZC5jIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL252b19jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWIyZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL252b19jbWQuYwpAQCAtMCwwICsxLDc5IEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGdweGUvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxncHhlL2NvbW1hbmQuaD4KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitzdGF0aWMgaW50IHNob3dfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwljaGFyIGJ1ZlsyNTZdOworCWludCByYzsKKworCWlmICggYXJnYyAhPSAyICkgeworCQlwcmludGYgKCAiU3ludGF4OiAlcyA8aWRlbnRpZmllcj5cbiIsIGFyZ3ZbMF0gKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCAoIHJjID0gZmV0Y2hmX25hbWVkX3NldHRpbmcgKCBhcmd2WzFdLCBidWYsCisJCQkJCSAgIHNpemVvZiAoIGJ1ZiApICkgKSA8IDAgKXsKKwkJcHJpbnRmICggIkNvdWxkIG5vdCBmaW5kIFwiJXNcIjogJXNcbiIsCisJCQkgYXJndlsxXSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiAxOworCX0KKworCXByaW50ZiAoICIlcyA9ICVzXG4iLCBhcmd2WzFdLCBidWYgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlpbnQgcmM7CisKKwlpZiAoIGFyZ2MgIT0gMyApIHsKKwkJcHJpbnRmICggIlN5bnRheDogJXMgPGlkZW50aWZpZXI+IDx2YWx1ZT5cbiIsIGFyZ3ZbMF0gKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCAoIHJjID0gc3RvcmVmX25hbWVkX3NldHRpbmcgKCBhcmd2WzFdLCBhcmd2WzJdICkgKSAhPSAwICkgeworCQlwcmludGYgKCAiQ291bGQgbm90IHNldCBcIiVzXCI9XCIlc1wiOiAlc1xuIiwKKwkJCSBhcmd2WzFdLCBhcmd2WzJdLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xlYXJfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlpbnQgcmM7CisKKwlpZiAoIGFyZ2MgIT0gMiApIHsKKwkJcHJpbnRmICggIlN5bnRheDogJXMgPGlkZW50aWZpZXI+XG4iLCBhcmd2WzBdICk7CisJCXJldHVybiAxOworCX0KKworCWlmICggKCByYyA9IGRlbGV0ZV9uYW1lZF9zZXR0aW5nICggYXJndlsxXSApICkgIT0gMCApIHsKKwkJcHJpbnRmICggIkNvdWxkIG5vdCBjbGVhciBcIiVzXCI6ICVzXG4iLAorCQkJIGFyZ3ZbMV0sIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gMTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb21tYW5kIG52b19jb21tYW5kc1tdIF9fY29tbWFuZCA9IHsKKwl7CisJCS5uYW1lID0gInNob3ciLAorCQkuZXhlYyA9IHNob3dfZXhlYywKKwl9LAorCXsKKwkJLm5hbWUgPSAic2V0IiwKKwkJLmV4ZWMgPSBzZXRfZXhlYywKKwl9LAkKKwl7CisJCS5uYW1lID0gImNsZWFyIiwKKwkJLmV4ZWMgPSBjbGVhcl9leGVjLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL3JvdXRlX2NtZC5jIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL3JvdXRlX2NtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzJlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvY29tbWFuZHMvcm91dGVfY21kLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dXNyL3JvdXRlLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCBjb21tYW5kcworICoKKyAqLworCisvKioKKyAqICJyb3V0ZSIgY29tbWFuZCBzeW50YXggbWVzc2FnZQorICoKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqLworc3RhdGljIHZvaWQgcm91dGVfc3ludGF4ICggY2hhciAqKmFyZ3YgKSB7CisJcHJpbnRmICggIlVzYWdlOlxuIgorCQkgIiAgJXNcbiIKKwkJICJcbiIKKwkJICJEaXNwbGF5cyB0aGUgcm91dGluZyB0YWJsZVxuIiwKKwkJIGFyZ3ZbMF0gKTsKK30KKworLyoqCisgKiBUaGUgInJvdXRlIiBjb21tYW5kCisgKgorICogQHYgYXJnYwkJQXJndW1lbnQgY291bnQKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqIEByZXQgcmMJCUV4aXQgY29kZQorICovCitzdGF0aWMgaW50IHJvdXRlX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKKwkJeyAiaGVscCIsIDAsIE5VTEwsICdoJyB9LAorCQl7IE5VTEwsIDAsIE5VTEwsIDAgfSwKKwl9OworCisJaW50IGM7CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJd2hpbGUgKCAoIGMgPSBnZXRvcHRfbG9uZyAoIGFyZ2MsIGFyZ3YsICJoIiwgbG9uZ29wdHMsIE5VTEwgKSApID49IDAgKXsKKwkJc3dpdGNoICggYyApIHsKKwkJY2FzZSAnaCc6CisJCQkvKiBEaXNwbGF5IGhlbHAgdGV4dCAqLworCQlkZWZhdWx0OgorCQkJLyogVW5yZWNvZ25pc2VkL2ludmFsaWQgb3B0aW9uICovCisJCQlyb3V0ZV9zeW50YXggKCBhcmd2ICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmICggb3B0aW5kICE9IGFyZ2MgKSB7CisJCXJvdXRlX3N5bnRheCAoIGFyZ3YgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcm91dGUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqIFJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCBjb21tYW5kcyAqLworc3RydWN0IGNvbW1hbmQgcm91dGVfY29tbWFuZHNbXSBfX2NvbW1hbmQgPSB7CisJeworCQkubmFtZSA9ICJyb3V0ZSIsCisJCS5leGVjID0gcm91dGVfZXhlYywKKwl9LAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9jb21tYW5kcy9zYW5ib290X2NtZC5jIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL3NhbmJvb3RfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzYjc0NwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9jb21tYW5kcy9zYW5ib290X2NtZC5jCkBAIC0wLDAgKzEsNzAgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGdweGUvY29tbWFuZC5oPgorI2luY2x1ZGUgPHVzci9hdXRvYm9vdC5oPgorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogInNhbmJvb3QiIGNvbW1hbmQgc3ludGF4IG1lc3NhZ2UKKyAqCisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIHNhbmJvb3Rfc3ludGF4ICggY2hhciAqKmFyZ3YgKSB7CisJcHJpbnRmICggIlVzYWdlOlxuIgorCQkgIiAgJXMgPHJvb3QtcGF0aD5cbiIKKwkJICJcbiIKKwkJICJCb290IGZyb20gU0FOIHRhcmdldFxuIiwKKwkJIGFyZ3ZbMF0gKTsKK30KKworLyoqCisgKiBUaGUgInNhbmJvb3QiIGNvbW1hbmQKKyAqCisgKiBAdiBhcmdjCQlBcmd1bWVudCBjb3VudAorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICogQHJldCByYwkJRXhpdCBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc2FuYm9vdF9leGVjICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7CisJCXsgImhlbHAiLCAwLCBOVUxMLCAnaCcgfSwKKwkJeyBOVUxMLCAwLCBOVUxMLCAwIH0sCisJfTsKKwljb25zdCBjaGFyICpyb290X3BhdGggPSBOVUxMOworCWludCBjOworCWludCByYzsKKworCS8qIFBhcnNlIG9wdGlvbnMgKi8KKwl3aGlsZSAoICggYyA9IGdldG9wdF9sb25nICggYXJnYywgYXJndiwgImgiLCBsb25nb3B0cywgTlVMTCApICkgPj0gMCApeworCQlzd2l0Y2ggKCBjICkgeworCQljYXNlICdoJzoKKwkJCS8qIERpc3BsYXkgaGVscCB0ZXh0ICovCisJCWRlZmF1bHQ6CisJCQkvKiBVbnJlY29nbmlzZWQvaW52YWxpZCBvcHRpb24gKi8KKwkJCXNhbmJvb3Rfc3ludGF4ICggYXJndiApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBOZWVkIGV4YWN0bHkgb25lIGltYWdlIG5hbWUgcmVtYWluaW5nIGFmdGVyIHRoZSBvcHRpb25zICovCisJaWYgKCBvcHRpbmQgIT0gKCBhcmdjIC0gMSApICkgeworCQlzYW5ib290X3N5bnRheCAoIGFyZ3YgKTsKKwkJcmV0dXJuIDE7CisJfQorCXJvb3RfcGF0aCA9IGFyZ3Zbb3B0aW5kXTsKKworCS8qIEJvb3QgZnJvbSByb290IHBhdGggKi8KKwlpZiAoICggcmMgPSBib290X3Jvb3RfcGF0aCAoIHJvb3RfcGF0aCApICkgIT0gMCApIHsKKwkJcHJpbnRmICggIkNvdWxkIG5vdCBib290IGZyb20gJXM6ICVzXG4iLAorCQkJIHJvb3RfcGF0aCwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgY29tbWFuZCBzYW5ib290X2NvbW1hbmQgX19jb21tYW5kID0geworCS5uYW1lID0gInNhbmJvb3QiLAorCS5leGVjID0gc2FuYm9vdF9leGVjLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9jb21tYW5kcy90aW1lX2NtZC5jIGIvZ3B4ZS9zcmMvaGNpL2NvbW1hbmRzL3RpbWVfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3NDEwZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9jb21tYW5kcy90aW1lX2NtZC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGFuaWVsIFZlcmthbXAgPGRhbmllbEBkcnYubnU+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBNYXJjaC0xOS0yMDA5IEAgMDI6NDQ6IEFkZGVkIHNsZWVwIGNvbW1hbmQuCisgKiBTaGFvIE1pbGxlciA8c2hhby5taWxsZXJAeXJkc2IuZWR1Lm9uLmNhPi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxncHhlL2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxncHhlL25hcC5oPgorI2luY2x1ZGUgPGdweGUvdGltZXIuaD4KKworc3RhdGljIGludCB0aW1lX2V4ZWMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlpbnQgcmMsIHNlY3M7CisKKwlpZiAoIGFyZ2MgPT0gMSB8fAorCSAgICAgIXN0cmNtcCAoIGFyZ3ZbMV0sICItLWhlbHAiICkgfHwKKwkgICAgICFzdHJjbXAgKCBhcmd2WzFdLCAiLWgiICkgKQorCXsKKwkJcHJpbnRmICggIlVzYWdlOlxuIgorCQkJICIgICVzIDxjb21tYW5kPlxuIgorCQkJICJcbiIKKwkJCSAiVGltZSBhIGNvbW1hbmRcbiIsCisJCQkgYXJndlswXSApOworCQlyZXR1cm4gMTsKKwl9CisKKwlzdGFydCA9IGN1cnJ0aWNrcygpOworCXJjID0gZXhlY3YgKCBhcmd2WzFdLCBhcmd2ICsgMSApOworCXNlY3MgPSAoY3VycnRpY2tzKCkgLSBzdGFydCkgLyB0aWNrc19wZXJfc2VjKCk7CisKKwlwcmludGYgKCAiJXM6ICVkc1xuIiwgYXJndlswXSwgc2VjcyApOworCisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgY29tbWFuZCB0aW1lX2NvbW1hbmQgX19jb21tYW5kID0geworCS5uYW1lID0gInRpbWUiLAorCS5leGVjID0gdGltZV9leGVjLAorfTsKKworc3RhdGljIGludCBzbGVlcF9leGVjICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGRlbGF5OworCisJaWYgKCBhcmdjID09IDEgfHwKKwkgICAgICFzdHJjbXAgKCBhcmd2WzFdLCAiLS1oZWxwIiApIHx8CisJICAgICAhc3RyY21wICggYXJndlsxXSwgIi1oIiApKQorCXsKKwkJcHJpbnRmICggIlVzYWdlOlxuIgorCQkJICIgICVzIDxzZWNvbmRzPlxuIgorCQkJICJcbiIKKwkJCSAiU2xlZXAgZm9yIDxzZWNvbmRzPiBzZWNvbmRzXG4iLAorCQkJIGFyZ3ZbMF0gKTsKKwkJcmV0dXJuIDE7CisJfQorCXN0YXJ0ID0gY3VycnRpY2tzKCk7CisJZGVsYXkgPSBzdHJ0b3VsICggYXJndlsxXSwgTlVMTCwgMCApICogdGlja3NfcGVyX3NlYygpOworCXdoaWxlICggKCBjdXJydGlja3MoKSAtIHN0YXJ0ICkgPD0gZGVsYXkgKQorCQljcHVfbmFwKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb21tYW5kIHNsZWVwX2NvbW1hbmQgX19jb21tYW5kID0geworCS5uYW1lID0gInNsZWVwIiwKKwkuZXhlYyA9IHNsZWVwX2V4ZWMsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL2VkaXRzdHJpbmcuYyBiL2dweGUvc3JjL2hjaS9lZGl0c3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4ZjMzOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9lZGl0c3RyaW5nLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxncHhlL2tleXMuaD4KKyNpbmNsdWRlIDxncHhlL2VkaXRzdHJpbmcuaD4KKworLyoqIEBmaWxlCisgKgorICogRWRpdGFibGUgc3RyaW5ncworICoKKyAqLworCitzdGF0aWMgdm9pZCBpbnNlcnRfZGVsZXRlICggc3RydWN0IGVkaXRfc3RyaW5nICpzdHJpbmcsIHNpemVfdCBkZWxldGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluc2VydF90ZXh0ICkgCisJCQkgICAgX19hdHRyaWJ1dGVfXyAoKCBub25udWxsICgxKSApKTsKK3N0YXRpYyB2b2lkIGluc2VydF9jaGFyYWN0ZXIgKCBzdHJ1Y3QgZWRpdF9zdHJpbmcgKnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhcmFjdGVyICkgX19ub25udWxsOworc3RhdGljIHZvaWQgZGVsZXRlX2NoYXJhY3RlciAoIHN0cnVjdCBlZGl0X3N0cmluZyAqc3RyaW5nICkgX19ub25udWxsOworc3RhdGljIHZvaWQgYmFja3NwYWNlICggc3RydWN0IGVkaXRfc3RyaW5nICpzdHJpbmcgKSBfX25vbm51bGw7CitzdGF0aWMgdm9pZCBraWxsX2VvbCAoIHN0cnVjdCBlZGl0X3N0cmluZyAqc3RyaW5nICkgX19ub25udWxsOworCisvKioKKyAqIEluc2VydCBhbmQvb3IgZGVsZXRlIHRleHQgd2l0aGluIGFuIGVkaXRhYmxlIHN0cmluZworICoKKyAqIEB2IHN0cmluZwkJRWRpdGFibGUgc3RyaW5nCisgKiBAdiBkZWxldGVfbGVuCUxlbmd0aCBvZiB0ZXh0IHRvIGRlbGV0ZSBmcm9tIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCisgKiBAdiBpbnNlcnRfdGV4dAlUZXh0IHRvIGluc2VydCBhdCBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgb3IgTlVMTAorICovCitzdGF0aWMgdm9pZCBpbnNlcnRfZGVsZXRlICggc3RydWN0IGVkaXRfc3RyaW5nICpzdHJpbmcsIHNpemVfdCBkZWxldGVfbGVuLAorCQkJICAgIGNvbnN0IGNoYXIgKmluc2VydF90ZXh0ICkgeworCXNpemVfdCBvbGRfbGVuLCBtYXhfZGVsZXRlX2xlbiwgaW5zZXJ0X2xlbiwgbWF4X2luc2VydF9sZW4sIG5ld19sZW47CisKKwkvKiBDYWxjdWxhdGUgbGVuZ3RocyAqLworCW9sZF9sZW4gPSBzdHJsZW4gKCBzdHJpbmctPmJ1ZiApOworCWFzc2VydCAoIHN0cmluZy0+Y3Vyc29yIDw9IG9sZF9sZW4gKTsKKwltYXhfZGVsZXRlX2xlbiA9ICggb2xkX2xlbiAtIHN0cmluZy0+Y3Vyc29yICk7CisJaWYgKCBkZWxldGVfbGVuID4gbWF4X2RlbGV0ZV9sZW4gKQorCQlkZWxldGVfbGVuID0gbWF4X2RlbGV0ZV9sZW47CisJaW5zZXJ0X2xlbiA9ICggaW5zZXJ0X3RleHQgPyBzdHJsZW4gKCBpbnNlcnRfdGV4dCApIDogMCApOworCW1heF9pbnNlcnRfbGVuID0gKCAoIHN0cmluZy0+bGVuIC0gMSApIC0gKCBvbGRfbGVuIC0gZGVsZXRlX2xlbiApICk7CisJaWYgKCBpbnNlcnRfbGVuID4gbWF4X2luc2VydF9sZW4gKQorCQlpbnNlcnRfbGVuID0gbWF4X2luc2VydF9sZW47CisJbmV3X2xlbiA9ICggb2xkX2xlbiAtIGRlbGV0ZV9sZW4gKyBpbnNlcnRfbGVuICk7CisKKwkvKiBGaWxsIGluIGVkaXQgaGlzdG9yeSAqLworCXN0cmluZy0+bW9kX3N0YXJ0ID0gc3RyaW5nLT5jdXJzb3I7CisJc3RyaW5nLT5tb2RfZW5kID0gKCAoIG5ld19sZW4gPiBvbGRfbGVuICkgPyBuZXdfbGVuIDogb2xkX2xlbiApOworCisJLyogTW92ZSBkYXRhIGZvbGxvd2luZyB0aGUgY3Vyc29yICovCisJbWVtbW92ZSAoICggc3RyaW5nLT5idWYgKyBzdHJpbmctPmN1cnNvciArIGluc2VydF9sZW4gKSwKKwkJICAoIHN0cmluZy0+YnVmICsgc3RyaW5nLT5jdXJzb3IgKyBkZWxldGVfbGVuICksCisJCSAgKCBtYXhfZGVsZXRlX2xlbiArIDEgLSBkZWxldGVfbGVuICkgKTsKKworCS8qIENvcHkgaW5zZXJ0ZWQgdGV4dCB0byBjdXJzb3IgcG9zaXRpb24gKi8KKwltZW1jcHkgKCAoIHN0cmluZy0+YnVmICsgc3RyaW5nLT5jdXJzb3IgKSwgaW5zZXJ0X3RleHQsIGluc2VydF9sZW4gKTsKKwlzdHJpbmctPmN1cnNvciArPSBpbnNlcnRfbGVuOworfQorCisvKioKKyAqIEluc2VydCBjaGFyYWN0ZXIgYXQgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KKyAqCisgKiBAdiBzdHJpbmcJCUVkaXRhYmxlIHN0cmluZworICogQHYgY2hhcmFjdGVyCQlDaGFyYWN0ZXIgdG8gaW5zZXJ0CisgKi8KK3N0YXRpYyB2b2lkIGluc2VydF9jaGFyYWN0ZXIgKCBzdHJ1Y3QgZWRpdF9zdHJpbmcgKnN0cmluZywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjaGFyYWN0ZXIgKSB7CisJY2hhciBpbnNlcnRfdGV4dFsyXSA9IHsgY2hhcmFjdGVyLCAnXDAnIH07CisJaW5zZXJ0X2RlbGV0ZSAoIHN0cmluZywgMCwgaW5zZXJ0X3RleHQgKTsKK30KKworLyoqCisgKiBEZWxldGUgY2hhcmFjdGVyIGF0IGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCisgKgorICogQHYgc3RyaW5nCQlFZGl0YWJsZSBzdHJpbmcKKyAqLworc3RhdGljIHZvaWQgZGVsZXRlX2NoYXJhY3RlciAoIHN0cnVjdCBlZGl0X3N0cmluZyAqc3RyaW5nICkgeworCWluc2VydF9kZWxldGUgKCBzdHJpbmcsIDEsIE5VTEwgKTsKK30KKworLyoqCisgKiBEZWxldGUgY2hhcmFjdGVyIHRvIGxlZnQgb2YgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KKyAqCisgKiBAdiBzdHJpbmcJCUVkaXRhYmxlIHN0cmluZworICovCitzdGF0aWMgdm9pZCBiYWNrc3BhY2UgKCBzdHJ1Y3QgZWRpdF9zdHJpbmcgKnN0cmluZyApIHsKKwlpZiAoIHN0cmluZy0+Y3Vyc29yID4gMCApIHsKKwkJc3RyaW5nLT5jdXJzb3ItLTsKKwkJZGVsZXRlX2NoYXJhY3RlciAoIHN0cmluZyApOworCX0KK30KKworLyoqCisgKiBEZWxldGUgdG8gZW5kIG9mIGxpbmUKKyAqCisgKiBAdiBzdHJpbmcJCUVkaXRhYmxlIHN0cmluZworICovCitzdGF0aWMgdm9pZCBraWxsX2VvbCAoIHN0cnVjdCBlZGl0X3N0cmluZyAqc3RyaW5nICkgeworCWluc2VydF9kZWxldGUgKCBzdHJpbmcsIH4oICggc2l6ZV90ICkgMCApLCBOVUxMICk7Cit9CisKKy8qKgorICogRWRpdCBlZGl0YWJsZSBzdHJpbmcKKyAqCisgKiBAdiBzdHJpbmcJCUVkaXRhYmxlIHN0cmluZworICogQHYga2V5CQlLZXkgcHJlc3NlZCBieSB1c2VyCisgKiBAcmV0IGtleQkJS2V5IHJldHVybmVkIHRvIGFwcGxpY2F0aW9uLCBvciB6ZXJvCisgKgorICogSGFuZGxlcyBrZXlwcmVzc2VzIGFuZCB1cGRhdGVzIHRoZSBjb250ZW50IG9mIHRoZSBlZGl0YWJsZSBzdHJpbmcuCisgKiBCYXNpYyBsaW5lIGVkaXRpbmcgZmFjaWxpdGllcyAoZGVsZXRlL2luc2VydC9jdXJzb3IpIGFyZSBzdXBwb3J0ZWQuCisgKiBJZiBlZGl0X3N0cmluZygpIHVuZGVyc3RhbmRzIGFuZCB1c2VzIHRoZSBrZXlwcmVzcyBpdCB3aWxsIHJldHVybgorICogemVybywgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBrZXkuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB1cGRhdGUgdGhlIGRpc3BsYXkgaW4gYW55IHdheS4KKyAqCisgKiBUaGUgc3RyaW5nJ3MgZWRpdCBoaXN0b3J5IHdpbGwgYmUgdXBkYXRlZCB0byBhbGxvdyB0aGUgY2FsbGVyIHRvCisgKiBlZmZpY2llbnRseSBicmluZyB0aGUgZGlzcGxheSBpbnRvIHN5bmMgd2l0aCB0aGUgc3RyaW5nIGNvbnRlbnQuCisgKi8KK2ludCBlZGl0X3N0cmluZyAoIHN0cnVjdCBlZGl0X3N0cmluZyAqc3RyaW5nLCBpbnQga2V5ICkgeworCWludCByZXR2YWwgPSAwOworCXNpemVfdCBsZW4gPSBzdHJsZW4gKCBzdHJpbmctPmJ1ZiApOworCisJLyogUHJlcGFyZSBlZGl0IGhpc3RvcnkgKi8KKwlzdHJpbmctPmxhc3RfY3Vyc29yID0gc3RyaW5nLT5jdXJzb3I7CisJc3RyaW5nLT5tb2Rfc3RhcnQgPSBzdHJpbmctPmN1cnNvcjsKKwlzdHJpbmctPm1vZF9lbmQgPSBzdHJpbmctPmN1cnNvcjsKKworCS8qIEludGVycHJldCBrZXkgKi8KKwlpZiAoICgga2V5ID49IDB4MjAgKSAmJiAoIGtleSA8PSAweDdlICkgKSB7CisJCS8qIFByaW50YWJsZSBjaGFyYWN0ZXI7IGluc2VydCBhdCBjdXJyZW50IHBvc2l0aW9uICovCisJCWluc2VydF9jaGFyYWN0ZXIgKCBzdHJpbmcsIGtleSApOworCX0gZWxzZSBzd2l0Y2ggKCBrZXkgKSB7CisJY2FzZSBLRVlfQkFDS1NQQUNFOgorCQkvKiBCYWNrc3BhY2UgKi8KKwkJYmFja3NwYWNlICggc3RyaW5nICk7CisJCWJyZWFrOworCWNhc2UgS0VZX0RDOgorCWNhc2UgQ1RSTF9EOgorCQkvKiBEZWxldGUgY2hhcmFjdGVyICovCisJCWRlbGV0ZV9jaGFyYWN0ZXIgKCBzdHJpbmcgKTsKKwkJYnJlYWs7CisJY2FzZSBDVFJMX0s6CisJCS8qIERlbGV0ZSB0byBlbmQgb2YgbGluZSAqLworCQlraWxsX2VvbCAoIHN0cmluZyApOworCQlicmVhazsKKwljYXNlIEtFWV9IT01FOgorCWNhc2UgQ1RSTF9BOgorCQkvKiBTdGFydCBvZiBsaW5lICovCisJCXN0cmluZy0+Y3Vyc29yID0gMDsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRU5EOgorCWNhc2UgQ1RSTF9FOgorCQkvKiBFbmQgb2YgbGluZSAqLworCQlzdHJpbmctPmN1cnNvciA9IGxlbjsKKwkJYnJlYWs7CisJY2FzZSBLRVlfTEVGVDoKKwljYXNlIENUUkxfQjoKKwkJLyogQ3Vyc29yIGxlZnQgKi8KKwkJaWYgKCBzdHJpbmctPmN1cnNvciA+IDAgKQorCQkJc3RyaW5nLT5jdXJzb3ItLTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfUklHSFQ6CisJY2FzZSBDVFJMX0Y6CisJCS8qIEN1cnNvciByaWdodCAqLworCQlpZiAoIHN0cmluZy0+Y3Vyc29yIDwgbGVuICkKKwkJCXN0cmluZy0+Y3Vyc29yKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IGtleTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9hbGVydC5jIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL2FsZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlOTU5YQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9hbGVydC5jCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiogQGZpbGUKKyAqCisgKiBNdUN1cnNlcyBhbGVydCBmdW5jdGlvbnMKKyAqCisgKi8KKworLyoqCisgKiBBdWRpYmxlIHNpZ25hbAorICoKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBiZWVwICggdm9pZCApIHsKKwlwcmludGYoIlxhIik7CisJcmV0dXJuIE9LOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL2Fuc2lfc2NyZWVuLmMgYi9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvYW5zaV9zY3JlZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZjN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL2Fuc2lfc2NyZWVuLmMKQEAgLTAsMCArMSw3NCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0YXRpYyB2b2lkIGFuc2lzY3JfcmVzZXQoc3RydWN0IF9jdXJzZXNfc2NyZWVuICpzY3IpIF9fbm9ubnVsbDsKK3N0YXRpYyB2b2lkIGFuc2lzY3JfbW92ZXRveXgoc3RydWN0IF9jdXJzZXNfc2NyZWVuICpzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHksIHVuc2lnbmVkIGludCB4KSBfX25vbm51bGw7CitzdGF0aWMgdm9pZCBhbnNpc2NyX3B1dGMoc3RydWN0IF9jdXJzZXNfc2NyZWVuICpzY3IsIGNodHlwZSBjKSBfX25vbm51bGw7CisKK3Vuc2lnbmVkIHNob3J0IF9DT0xTID0gODA7Cit1bnNpZ25lZCBzaG9ydCBfTElORVMgPSAyNDsKKworc3RhdGljIHZvaWQgYW5zaXNjcl9yZXNldCAoIHN0cnVjdCBfY3Vyc2VzX3NjcmVlbiAqc2NyICkgeworCS8qIFJlc2V0IHRlcm1pbmFsIGF0dHJpYnV0ZXMgYW5kIGNsZWFyIHNjcmVlbiAqLworCXNjci0+YXR0cnMgPSAwOworCXNjci0+Y3Vyc194ID0gMDsKKwlzY3ItPmN1cnNfeSA9IDA7CisJcHJpbnRmICggIlwwMzNbMG0iICk7Cit9CisKK3N0YXRpYyB2b2lkIGFuc2lzY3JfbW92ZXRveXggKCBzdHJ1Y3QgX2N1cnNlc19zY3JlZW4gKnNjciwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgeSwgdW5zaWduZWQgaW50IHggKSB7CisJaWYgKCAoIHggIT0gc2NyLT5jdXJzX3ggKSB8fCAoIHkgIT0gc2NyLT5jdXJzX3kgKSApIHsKKwkJLyogQU5TSSBlc2NhcGUgc2VxdWVuY2UgdG8gdXBkYXRlIGN1cnNvciBwb3NpdGlvbiAqLworCQlwcmludGYgKCAiXDAzM1slZDslZEgiLCAoIHkgKyAxICksICggeCArIDEgKSApOworCQlzY3ItPmN1cnNfeCA9IHg7CisJCXNjci0+Y3Vyc195ID0geTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFuc2lzY3JfcHV0YyAoIHN0cnVjdCBfY3Vyc2VzX3NjcmVlbiAqc2NyLCBjaHR5cGUgYyApIHsKKwl1bnNpZ25lZCBpbnQgY2hhcmFjdGVyID0gKCBjICYgQV9DSEFSVEVYVCApOworCWF0dHJfdCBhdHRycyA9ICggYyAmICggQV9BVFRSSUJVVEVTIHwgQV9DT0xPUiApICk7CisJaW50IGJvbGQgPSAoIGF0dHJzICYgQV9CT0xEICk7CisJYXR0cl90IGNwYWlyID0gUEFJUl9OVU1CRVIgKCBhdHRycyApOworCXNob3J0IGZjb2w7CisJc2hvcnQgYmNvbDsKKworCS8qIFVwZGF0ZSBhdHRyaWJ1dGVzIGlmIGNoYW5nZWQgKi8KKwlpZiAoIGF0dHJzICE9IHNjci0+YXR0cnMgKSB7CisJCXNjci0+YXR0cnMgPSBhdHRyczsKKwkJcGFpcl9jb250ZW50ICggY3BhaXIsICZmY29sLCAmYmNvbCApOworCQkvKiBBTlNJIGVzY2FwZSBzZXF1ZW5jZSB0byB1cGRhdGUgY2hhcmFjdGVyIGF0dHJpYnV0ZXMgKi8KKwkJcHJpbnRmICggIlwwMzNbMDslZDszJWQ7NCVkbSIsICggYm9sZCA/IDEgOiAyMiApLCBmY29sLCBiY29sICk7CisJfQorCisJLyogUHJpbnQgdGhlIGFjdHVhbCBjaGFyYWN0ZXIgKi8KKwlwdXRjaGFyICggY2hhcmFjdGVyICk7CisKKwkvKiBVcGRhdGUgZXhwZWN0ZWQgY3Vyc29yIHBvc2l0aW9uICovCisJaWYgKCArKyhzY3ItPmN1cnNfeCkgPT0gX0NPTFMgKSB7CisJCXNjci0+Y3Vyc194ID0gMDsKKwkJKytzY3ItPmN1cnNfeTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYW5zaXNjcl9nZXRjICggc3RydWN0IF9jdXJzZXNfc2NyZWVuICpzY3IgX191bnVzZWQgKSB7CisJcmV0dXJuIGdldGNoYXIoKTsKK30KKworc3RhdGljIGJvb2wgYW5zaXNjcl9wZWVrICggc3RydWN0IF9jdXJzZXNfc2NyZWVuICpzY3IgX191bnVzZWQgKSB7CisJcmV0dXJuIGlza2V5KCk7Cit9CisKK1NDUkVFTiBfYW5zaV9zY3JlZW4gPSB7CisJLmluaXQJCT0gYW5zaXNjcl9yZXNldCwKKwkuZXhpdAkJPSBhbnNpc2NyX3Jlc2V0LAorCS5tb3ZldG95eAk9IGFuc2lzY3JfbW92ZXRveXgsCisJLnB1dGMJCT0gYW5zaXNjcl9wdXRjLAorCS5nZXRjCQk9IGFuc2lzY3JfZ2V0YywKKwkucGVlawkJPSBhbnNpc2NyX3BlZWssCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL2NsZWFyLmMgYi9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvY2xlYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWIyOTZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL2NsZWFyLmMKQEAgLTAsMCArMSw5MCBAQAorI2luY2x1ZGUgPGN1cnNlcy5oPgorI2luY2x1ZGUgIm11Y3Vyc2VzLmgiCisjaW5jbHVkZSAiY3Vyc29yLmgiCisKKy8qKiBAZmlsZQorICoKKyAqIE11Q3Vyc2VzIGNsZWFyaW5nIGZ1bmN0aW9ucworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQ2xlYXIgYSB3aW5kb3cgdG8gdGhlIGJvdHRvbSBmcm9tIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCisgKgorICogQHYgKndpbglzdWJqZWN0IHdpbmRvdworICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHdjbHJ0b2JvdCAoIFdJTkRPVyAqd2luICkgeworCXN0cnVjdCBjdXJzb3JfcG9zIHBvczsKKworCV9zdG9yZV9jdXJzX3Bvcyggd2luLCAmcG9zICk7CisJZG8geworCQlfd3B1dGMoIHdpbiwgJyAnLCBXUkFQICk7CisJfSB3aGlsZSAoIHdpbi0+Y3Vyc195ICsgd2luLT5jdXJzX3ggKTsKKwlfcmVzdG9yZV9jdXJzX3Bvcyggd2luLCAmcG9zICk7CisKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogQ2xlYXIgYSB3aW5kb3cgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lCisgKgorICogQHYgKndpbglzdWJqZWN0IHdpbmRvdworICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHdjbHJ0b2VvbCAoIFdJTkRPVyAqd2luICkgeworCXN0cnVjdCBjdXJzb3JfcG9zIHBvczsKKworCV9zdG9yZV9jdXJzX3Bvcyggd2luLCAmcG9zICk7CisJd2hpbGUgKCAoIHdpbi0+Y3Vyc195IC0gcG9zLnkgKSA9PSAwICkgeworCQlfd3B1dGMoIHdpbiwgJyAnLCBXUkFQICk7CisJfQorCV9yZXN0b3JlX2N1cnNfcG9zKCB3aW4sICZwb3MgKTsKKworCXJldHVybiBPSzsKK30KKworLyoqCisgKiBEZWxldGUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3IgaW4gYSB3aW5kb3cKKyAqCisgKiBAdiAqd2luCXN1YmplY3Qgd2luZG93CisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2RlbGNoICggV0lORE9XICp3aW4gKSB7CisJX3dwdXRjKCB3aW4sICcgJywgTk9XUkFQICk7CisJX3djdXJzYmFjayggd2luICk7CisKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogRGVsZXRlIGxpbmUgdW5kZXIgYSB3aW5kb3cncyBjdXJzb3IKKyAqCisgKiBAdiAqd2luCXN1YmplY3Qgd2luZG93CisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2RlbGV0ZWxuICggV0lORE9XICp3aW4gKSB7CisJc3RydWN0IGN1cnNvcl9wb3MgcG9zOworCisJX3N0b3JlX2N1cnNfcG9zKCB3aW4sICZwb3MgKTsKKwkvKiBsZXQncyBqdXN0IHNldCB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgYW5kCisJICAgbGV0IHdjbHJ0b2VvbCBkbyB0aGUgd29yayA6KSAqLworCXdtb3ZlKCB3aW4sIHdpbi0+Y3Vyc195LCAwICk7CisJd2NscnRvZW9sKCB3aW4gKTsKKwlfcmVzdG9yZV9jdXJzX3Bvcyggd2luLCAmcG9zICk7CisJcmV0dXJuIE9LOworfQorCisvKioKKyAqIENvbXBsZXRlbHkgY2xlYXIgYSB3aW5kb3cKKyAqCisgKiBAdiAqd2luCXN1YmplY3Qgd2luZG93CisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2VyYXNlICggV0lORE9XICp3aW4gKSB7CisJd21vdmUoIHdpbiwgMCwgMCApOworCXdjbHJ0b2JvdCggd2luICk7CisJcmV0dXJuIE9LOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL2NvbG91ci5jIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL2NvbG91ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzU5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvY29sb3VyLmMKQEAgLTAsMCArMSw2NiBAQAorI2luY2x1ZGUgPGN1cnNlcy5oPgorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBjb2xvdXJfcGFpciB7CisJc2hvcnQgZmNvbDsKKwlzaG9ydCBiY29sOworfTsKKworc3RhdGljIHN0cnVjdCBjb2xvdXJfcGFpciBjcGFpcnNbQ09MT1VSX1BBSVJTXSA9IHsKKwlbMF0gPSB7IENPTE9VUl9XSElURSwgQ09MT1VSX0JMQUNLIH0sCit9OworCisvKioKKyAqIElkZW50aWZ5IHRoZSBSR0IgY29tcG9uZW50cyBvZiBhIGdpdmVuIGNvbG91ciB2YWx1ZQorICoKKyAqIEB2IGNvbG91cgljb2xvdXIgdmFsdWUKKyAqIEB2ICpyZWQJYWRkcmVzcyB0byBzdG9yZSByZWQgY29tcG9uZW50CisgKiBAdiAqZ3JlZW4JYWRkcmVzcyB0byBzdG9yZSBncmVlbiBjb21wb25lbnQKKyAqIEB2ICpibHVlCWFkZHJlc3MgdG8gc3RvcmUgYmx1ZSBjb21wb25lbnQKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBjb2xvdXJfY29udGVudCAoIHNob3J0IGNvbG91ciwgc2hvcnQgKnJlZCwgc2hvcnQgKmdyZWVuLCBzaG9ydCAqYmx1ZSApIHsKKwkqcmVkID0gKCAoIGNvbG91ciAmIENPTE9VUl9SRUQgKSA/IDEgOiAwICk7CisJKmdyZWVuID0gKCAoIGNvbG91ciAmIENPTE9VUl9HUkVFTiApID8gMSA6IDAgKTsKKwkqYmx1ZSA9ICggKCBjb2xvdXIgJiBDT0xPVVJfQkxVRSApID8gMSA6IDAgKTsKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogSW5pdGlhbGlzZSBjb2xvdXIgcGFpcgorICoKKyAqIEB2IHBhaXIJY29sb3VyIHBhaXIgbnVtYmVyCisgKiBAdiBmY29sCWZvcmVncm91bmQgY29sb3VyCisgKiBAdiBiY29sCWJhY2tncm91bmQgY29sb3VyCisgKi8KK2ludCBpbml0X3BhaXIgKCBzaG9ydCBwYWlyLCBzaG9ydCBmY29sLCBzaG9ydCBiY29sICkgeworCXN0cnVjdCBjb2xvdXJfcGFpciAqY3BhaXI7CisKKwlpZiAoICggcGFpciA8IDEgKSB8fCAoIHBhaXIgPj0gQ09MT1VSX1BBSVJTICkgKQorCQlyZXR1cm4gRVJSOworCQorCWNwYWlyID0gJmNwYWlyc1twYWlyXTsKKwljcGFpci0+ZmNvbCA9IGZjb2w7CisJY3BhaXItPmJjb2wgPSBiY29sOworCXJldHVybiBPSzsKK30KKworLyoqCisgKiBHZXQgY29sb3VycyBvZiBjb2xvdXIgcGFpcgorICoKKyAqIEB2IHBhaXIJY29sb3VyIHBhaXIgbnVtYmVyCisgKiBAcmV0IGZjb2wJZm9yZWdyb3VuZCBjb2xvdXIKKyAqIEByZXQgYmNvbAliYWNrZ3JvdW5kIGNvbG91cgorICovCitpbnQgcGFpcl9jb250ZW50ICggc2hvcnQgcGFpciwgc2hvcnQgKmZjb2wsIHNob3J0ICpiY29sICkgeworCXN0cnVjdCBjb2xvdXJfcGFpciAqY3BhaXI7CisKKwlpZiAoICggcGFpciA8IDAgKSB8fCAoIHBhaXIgPj0gQ09MT1VSX1BBSVJTICkgKQorCQlyZXR1cm4gRVJSOworCQorCWNwYWlyID0gJmNwYWlyc1twYWlyXTsKKwkqZmNvbCA9IGNwYWlyLT5mY29sOworCSpiY29sID0gY3BhaXItPmJjb2w7CisJcmV0dXJuIE9LOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL2N1cnNvci5oIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL2N1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjdkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvY3Vyc29yLmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBDVVJTT1JfSAorI2RlZmluZSBDVVJTT1JfSAorCisvKiogQGZpbGUKKyAqCisgKiBNdUN1cnNlcyBjdXJzb3IgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaGVhZGVyIGZpbGUKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitzdHJ1Y3QgY3Vyc29yX3BvcyB7CisJdW5zaWduZWQgaW50IHksIHg7Cit9OworCisvKioKKyAqIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIGZyb20gZW5jb2RlZCBiYWNrdXAgdmFyaWFibGUKKyAqCisgKiBAdiAqd2luCXdpbmRvdyBvbiB3aGljaCB0byBvcGVyYXRlCisgKiBAdiAqcG9zCXBvaW50ZXIgdG8gc3RydWN0IGluIHdoaWNoIG9yaWdpbmFsIGN1cnNvciBwb3NpdGlvbiBpcyBzdG9yZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9yZXN0b3JlX2N1cnNfcG9zICggV0lORE9XICp3aW4sIHN0cnVjdCBjdXJzb3JfcG9zICpwb3MgKSB7CisJd21vdmUgKCB3aW4sIHBvcy0+eSwgcG9zLT54ICk7Cit9CisKKy8qKgorICogU3RvcmUgY3Vyc29yIHBvc2l0aW9uIGZvciBsYXRlciByZXN0b3JhdGlvbgorICoKKyAqIEB2ICp3aW4Jd2luZG93IG9uIHdoaWNoIHRvIG9wZXJhdGUKKyAqIEB2ICpwb3MJcG9pbnRlciB0byBzdHJ1Y3QgaW4gd2hpY2ggdG8gc3RvcmUgY3Vyc29yIHBvc2l0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3RvcmVfY3Vyc19wb3MgKCBXSU5ET1cgKndpbiwgc3RydWN0IGN1cnNvcl9wb3MgKnBvcyApIHsKKwlwb3MtPnkgPSB3aW4tPmN1cnNfeTsKKwlwb3MtPnggPSB3aW4tPmN1cnNfeDsKK30KKworI2VuZGlmIC8qIENVUlNPUl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvZWRnaW5nLmMgYi9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvZWRnaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjZDMyNAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9lZGdpbmcuYwpAQCAtMCwwICsxLDExMSBAQAorI2luY2x1ZGUgPGN1cnNlcy5oPgorI2luY2x1ZGUgIm11Y3Vyc2VzLmgiCisjaW5jbHVkZSAiY3Vyc29yLmgiCisKKy8qKiBAZmlsZQorICoKKyAqIE11Q3Vyc2VzIGVkZ2luZyBmdW5jdGlvbnMKKyAqCisgKi8KKworLyoqCisgKiBEcmF3IGJvcmRlcnMgZnJvbSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXJzIGFuZCByZW5kaXRpb25zIGFyb3VuZCBhCisgKiB3aW5kb3cKKyAqCisgKiBAdiAqd2luCXdpbmRvdyB0byBiZSBib3JkZXJlZAorICogQHYgdmVyY2gJdmVydGljYWwgY2h0eXBlCisgKiBAdiBob3JjaAlob3Jpem9udGFsIGNodHlwZQorICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IGJveCAoIFdJTkRPVyAqd2luLCBjaHR5cGUgdmVyY2gsIGNodHlwZSBob3JjaCApIHsKKwljaHR5cGUgY29ybmVyID0gJysnIHwgd2luLT5hdHRyczsgLyogZGVmYXVsdCBjb3JuZXIgY2hhcmFjdGVyICovCisJcmV0dXJuIHdib3JkZXIoIHdpbiwgdmVyY2gsIHZlcmNoLCBob3JjaCwgaG9yY2gsCisJCQljb3JuZXIsIGNvcm5lciwgY29ybmVyLCBjb3JuZXIgKTsKK30KKworLyoqCisgKiBEcmF3IGJvcmRlcnMgZnJvbSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXJzIGFuZCByZW5kaXRpb25zIGFyb3VuZCBhCisgKiB3aW5kb3cKKyAqCisgKiBAdiAqd2luCXdpbmRvdyB0byBiZSBib3JkZXJlZAorICogQHYgbHMJbGVmdCBzaWRlCisgKiBAdiBycwlyaWdodCBzaWRlCisgKiBAdiB0cwl0b3AKKyAqIEB2IGJzCWJvdHRvbQorICogQHYgdGwJdG9wIGxlZnQgY29ybmVyCisgKiBAdiB0cgl0b3AgcmlnaHQgY29ybmVyCisgKiBAdiBibAlib3R0b20gbGVmdCBjb3JuZXIKKyAqIEB2IGJyCWJvdHRvbSByaWdodCBjb3JuZXIKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB3Ym9yZGVyICggV0lORE9XICp3aW4sIGNodHlwZSBscywgY2h0eXBlIHJzLAorCSAgICAgIGNodHlwZSB0cywgY2h0eXBlIGJzLCBjaHR5cGUgdGwsCisJICAgICAgY2h0eXBlIHRyLCBjaHR5cGUgYmwsIGNodHlwZSBiciApIHsKKwlzdHJ1Y3QgY3Vyc29yX3BvcyBwb3M7CisKKwlfc3RvcmVfY3Vyc19wb3MoIHdpbiwgJnBvcyApOworCXdtb3ZlKHdpbiwwLDApOworCisJX3dwdXRjaCh3aW4sdGwsV1JBUCk7CisJd2hpbGUgKCAoIHdpbi0+d2lkdGggLSAxICkgLSB3aW4tPmN1cnNfeCApIHsKKwkJX3dwdXRjaCh3aW4sdHMsV1JBUCk7CisJfQorCV93cHV0Y2god2luLHRyLFdSQVApOworCisJd2hpbGUgKCAoIHdpbi0+aGVpZ2h0IC0gMSApIC0gd2luLT5jdXJzX3kgKSB7CisJCV93cHV0Y2god2luLGxzLFdSQVApOworCQl3bW92ZSh3aW4sd2luLT5jdXJzX3ksKHdpbi0+d2lkdGgpLTEpOworCQlfd3B1dGNoKHdpbixycyxXUkFQKTsKKwl9CisKKwlfd3B1dGNoKHdpbixibCxXUkFQKTsKKwl3aGlsZSAoICggd2luLT53aWR0aCAtMSApIC0gd2luLT5jdXJzX3ggKSB7CisJCV93cHV0Y2god2luLGJzLFdSQVApOworCX0KKwlfd3B1dGNoKHdpbixicixOT1dSQVApOyAvKiBkbyBub3Qgd3JhcCBsYXN0IGNoYXIgdG8gbGVhdmUKKwkJCQkgICBjdXJzb3IgaW4gbGFzdCBwb3NpdGlvbiAqLworCV9yZXN0b3JlX2N1cnNfcG9zKCB3aW4sICZwb3MgKTsKKworCXJldHVybiBPSzsKK30KKworLyoqCisgKiBDcmVhdGUgYSBob3Jpem9udGFsIGxpbmUgaW4gYSB3aW5kb3cKKyAqCisgKiBAdiAqd2luCXN1YmplY3Qgd2luZG93CisgKiBAdiBjaAlyZW5kaXRpb24gYW5kIGNoYXJhY3RlcgorICogQHYgbgkJbWF4IG51bWJlciBvZiBjaGFycyAod2lkZSkgdG8gcmVuZGVyCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2hsaW5lICggV0lORE9XICp3aW4sIGNodHlwZSBjaCwgaW50IG4gKSB7CisJc3RydWN0IGN1cnNvcl9wb3MgcG9zOworCisJX3N0b3JlX2N1cnNfcG9zICggd2luLCAmcG9zICk7CisJd2hpbGUgKCAoIHdpbi0+Y3Vyc194IC0gd2luLT53aWR0aCApICYmIG4tLSApIHsKKwkJX3dwdXRjaCAoIHdpbiwgY2gsIE5PV1JBUCApOworCX0KKwlfcmVzdG9yZV9jdXJzX3BvcyAoIHdpbiwgJnBvcyApOworCisJcmV0dXJuIE9LOworfQorCisvKioKKyAqIENyZWF0ZSBhIHZlcnRpY2FsIGxpbmUgaW4gYSB3aW5kb3cKKyAqCisgKiBAdiAqd2luCXN1YmplY3Qgd2luZG93CisgKiBAdiBjaAlyZW5kaXRpb24gYW5kIGNoYXJhY3RlcgorICogQHYgbgkJbWF4IG51bWJlciBvZiBjaGFycyAoaGlnaCkgdG8gcmVuZGVyCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd3ZsaW5lICggV0lORE9XICp3aW4sIGNodHlwZSBjaCwgaW50IG4gKSB7CisJc3RydWN0IGN1cnNvcl9wb3MgcG9zOworCisJX3N0b3JlX2N1cnNfcG9zICggd2luLCAmcG9zICk7CisJd2hpbGUgKCAoIHdpbi0+Y3Vyc195IC0gd2luLT5oZWlnaHQgKSAmJiBuLS0gKSB7CisJCV93cHV0Y2ggKCB3aW4sIGNoLCBOT1dSQVAgKTsKKwkJd21vdmUoIHdpbiwgKysod2luLT5jdXJzX3kpLCBwb3MueCk7CisJfQorCV9yZXN0b3JlX2N1cnNfcG9zICggd2luLCAmcG9zICk7CisKKwlyZXR1cm4gT0s7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvbXVjdXJzZXMva2IuYyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9rYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGE3MjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvbXVjdXJzZXMva2IuYwpAQCAtMCwwICsxLDE0MyBAQAorI2luY2x1ZGUgPGN1cnNlcy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIm11Y3Vyc2VzLmgiCisKKy8qKiBAZmlsZQorICoKKyAqIE11Q3Vyc2VzIGtleWJvYXJkIGlucHV0IGhhbmRsaW5nIGZ1bmN0aW9ucworICovCisKKyNkZWZpbmUgSU5QVVRfREVMQVkgCQkyMDAgLy8gaGFsZi1ibG9ja2luZyBkZWxheSB0aW1lciByZXNvbHV0aW9uIChtcykKKyNkZWZpbmUgSU5QVVRfREVMQVlfVElNRU9VVCAJMTAwMCAvLyBoYWxmLWJsb2NraW5nIGRlbGF5IHRpbWVvdXQKKworaW50IG1fZGVsYXk7IC8qIAorCQk8IDAgOiBibG9ja2luZyByZWFkCisJCTAgICA6IG5vbi1ibG9ja2luZyByZWFkCisJCT4gMCA6IHRpbWVkIGJsb2NraW5nIHJlYWQKKwkgICAgICovCitib29sIG1fZWNobzsKK2Jvb2wgbV9jYnJlYWs7CisKK3N0YXRpYyBpbnQgX3dnZXRjICggV0lORE9XICp3aW4gKSB7CisJaW50IHRpbWVyLCBjOworCisJaWYgKCB3aW4gPT0gTlVMTCApCisJCXJldHVybiBFUlI7CisKKwl0aW1lciA9IElOUFVUX0RFTEFZX1RJTUVPVVQ7CisJd2hpbGUgKCAhIHdpbi0+c2NyLT5wZWVrKCB3aW4tPnNjciApICkgeworCQlpZiAoIG1fZGVsYXkgPT0gMCApIC8vIG5vbi1ibG9ja2luZyByZWFkCisJCQlyZXR1cm4gRVJSOworCQlpZiAoIHRpbWVyID4gMCApIHsgIC8vIHRpbWUtbGltaXRlZCBibG9ja2luZyByZWFkCisJCQlpZiAoIG1fZGVsYXkgPiAwICkKKwkJCQl0aW1lciAtPSBJTlBVVF9ERUxBWTsKKwkJCW1kZWxheSggSU5QVVRfREVMQVkgKTsKKwkJfSBlbHNlIHsgcmV0dXJuIEVSUjsgfSAvLyBub24tYmxvY2tpbmcgcmVhZAorCX0KKworCWMgPSB3aW4tPnNjci0+Z2V0Yyggd2luLT5zY3IgKTsKKworCWlmICggbV9lY2hvICYmICggYyA+PSAzMiAmJiBjIDw9IDEyNiApICkgLy8gcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMKKwkJX3dwdXRjaCggd2luLCAoY2h0eXBlKSAoIGMgfCB3aW4tPmF0dHJzICksIFdSQVAgKTsKKworCXJldHVybiBjOworfQorCisvKioKKyAqIFBvcCBhIGNoYXJhY3RlciBmcm9tIHRoZSBGSUZPIGludG8gYSB3aW5kb3cKKyAqCisgKiBAdiAqd2luCXdpbmRvdyBpbiB3aGljaCB0byBlY2hvIGlucHV0CisgKiBAcmV0IGMJY2hhciBmcm9tIGlucHV0IHN0cmVhbQorICovCitpbnQgd2dldGNoICggV0lORE9XICp3aW4gKSB7CisJaW50IGM7CisKKwljID0gX3dnZXRjKCB3aW4gKTsKKworCWlmICggbV9lY2hvICkgeworCQlpZiAoIGMgPj0gS0VZX01JTiApIHsKKwkJCXN3aXRjaChjKSB7CisJCQljYXNlIEtFWV9MRUZUIDoKKwkJCWNhc2UgS0VZX0JBQ0tTUEFDRSA6CisJCQkJX3djdXJzYmFjayggd2luICk7CisJCQkJd2RlbGNoKCB3aW4gKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCWJlZXAoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCV93cHV0Y2goIHdpbiwgKGNodHlwZSkoIGMgfCB3aW4tPmF0dHJzICksIFdSQVAgKTsKKwkJfQorCX0KKworCXJldHVybiBjOworfQorCisvKioKKyAqIFJlYWQgYXQgbW9zdCBuIGNoYXJhY3RlcnMgZnJvbSB0aGUgRklGTyBpbnRvIGEgd2luZG93CisgKgorICogQHYgKndpbgl3aW5kb3cgaW4gd2hpY2ggdG8gZWNobyBpbnB1dAorICogQHYgKnN0cglwb2ludGVyIHRvIHN0cmluZyBpbiB3aGljaCB0byBzdG9yZSByZXN1bHQKKyAqIEB2IG4JCW1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBpbnRvIHN0cmluZyAoaW5jLiBOVUwpCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2dldG5zdHIgKCBXSU5ET1cgKndpbiwgY2hhciAqc3RyLCBpbnQgbiApIHsKKwljaGFyICpfc3RyOworCWludCBjOworCisJaWYgKCBuID09IDAgKSB7CisJCXN0ciA9ICdcMCc7CisJCXJldHVybiBPSzsKKwl9CisKKwlfc3RyID0gc3RyOworCisJd2hpbGUgKCAoIGMgPSBfd2dldGMoIHdpbiApICkgIT0gRVJSICkgeworCQkvKiB0ZXJtaW5hdGlvbiBlbmZvcmNlbWVudCAtIGRvbid0IGxldCB1cyBnbyBwYXN0IHRoZQorCQkgICBlbmQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuLi4gKi8KKwkJaWYgKCBuID09IDAgJiYgKCBjID49IDMyICYmIGMgPD0gMTI2ICkgKSB7CisJCQlfd2N1cnNiYWNrKCB3aW4gKTsKKwkJCXdkZWxjaCggd2luICk7CisJCX0gZWxzZSB7CisJCQlpZiAoIGMgPj0gS0VZX01JTiApIHsKKwkJCQlzd2l0Y2goYykgeworCQkJCWNhc2UgS0VZX0xFRlQgOgorCQkJCWNhc2UgS0VZX0JBQ0tTUEFDRSA6CisJCQkJCV93Y3Vyc2JhY2soIHdpbiApOworCQkJCQl3ZGVsY2goIHdpbiApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEtFWV9FTlRFUiA6CisJCQkJCSpfc3RyID0gJ1wwJzsKKwkJCQkJcmV0dXJuIE9LOworCQkJCWRlZmF1bHQgOgorCQkJCQliZWVwKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICggYyA+PSAzMiAmJiBjIDw9IDEyNiApIHsKKwkJCQkqKF9zdHIrKykgPSBjOyBuLS07CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gRVJSOworfQorCisKKy8qKgorICoKKyAqLworaW50IGVjaG8gKCB2b2lkICkgeworCW1fZWNobyA9IFRSVUU7CisJcmV0dXJuIE9LOworfQorCisvKioKKyAqCisgKi8KK2ludCBub2VjaG8gKCB2b2lkICkgeworCW1fZWNobyA9IEZBTFNFOworCXJldHVybiBPSzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9tdWN1cnNlcy5jIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL211Y3Vyc2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3ZWJjYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9tdWN1cnNlcy5jCkBAIC0wLDAgKzEsMTQ3IEBACisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGN1cnNlcy5oPgorI2luY2x1ZGUgIm11Y3Vyc2VzLmgiCisKKy8qKiBAZmlsZQorICoKKyAqIE11Q3Vyc2VzIGNvcmUgZnVuY3Rpb25zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RhdGljIHZvaWQgX3d1cGRjdXJzICggV0lORE9XICp3aW4gKSBfX25vbm51bGw7Cit2b2lkIF93cHV0Y2ggKCBXSU5ET1cgKndpbiwgY2h0eXBlIGNoLCBpbnQgd3JhcCApIF9fbm9ubnVsbDsKK3ZvaWQgX3dwdXRjICggV0lORE9XICp3aW4sIGNoYXIgYywgaW50IHdyYXAgKSBfX25vbm51bGw7Cit2b2lkIF93Y3Vyc2JhY2sgKCBXSU5ET1cgKndpbiApIF9fbm9ubnVsbDsKK3ZvaWQgX3dwdXRjaHN0ciAoIFdJTkRPVyAqd2luLCBjb25zdCBjaHR5cGUgKmNoc3RyLCBpbnQgd3JhcCwgaW50IG4gKSBfX25vbm51bGw7Cit2b2lkIF93cHV0c3RyICggV0lORE9XICp3aW4sIGNvbnN0IGNoYXIgKnN0ciwgaW50IHdyYXAsIGludCBuICkgX19ub25udWxsOworaW50IHdtb3ZlICggV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCApIF9fbm9ubnVsbDsKKworV0lORE9XIF9zdGRzY3IgPSB7CisJLmF0dHJzID0gQV9ERUZBVUxULAorCS5vcmlfeSA9IDAsCisJLm9yaV94ID0gMCwKKwkuY3Vyc195ID0gMCwKKwkuY3Vyc194ID0gMCwKKwkuc2NyID0gJl9hbnNpX3NjcmVlbiwKK307CisKKy8qCisgKiAgUHJpbWl0aXZlcworICovCisKKy8qKgorICogVXBkYXRlIGN1cnNvciBwb3NpdGlvbgorICoKKyAqIEB2ICp3aW4Jd2luZG93IGluIHdoaWNoIHRvIHVwZGF0ZSBwb3NpdGlvbgorICovCitzdGF0aWMgdm9pZCBfd3VwZGN1cnMgKCBXSU5ET1cgKndpbiApIHsKKwl3aW4tPnNjci0+bW92ZXRveXggKCB3aW4tPnNjciwgd2luLT5vcmlfeSArIHdpbi0+Y3Vyc195LAorCQkJICAgICB3aW4tPm9yaV94ICsgd2luLT5jdXJzX3ggKTsKK30KKworLyoqCisgKiBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIgcmVuZGl0aW9uIHRvIGEgd2luZG93CisgKgorICogQHYgKndpbgl3aW5kb3cgaW4gd2hpY2ggdG8gd3JpdGUKKyAqIEB2IGNoCWNoYXJhY3RlciByZW5kaXRpb24gdG8gd3JpdGUKKyAqIEB2IHdyYXAJd3JhcCAic3dpdGNoIgorICovCit2b2lkIF93cHV0Y2ggKCBXSU5ET1cgKndpbiwgY2h0eXBlIGNoLCBpbnQgd3JhcCApIHsKKwkvKiBtYWtlIHN1cmUgd2Ugc2V0IHRoZSBzY3JlZW4gY3Vyc29yIHRvIHRoZSByaWdodCBwb3NpdGlvbgorCSAgIGZpcnN0ISAqLworCV93dXBkY3Vycyh3aW4pOworCXdpbi0+c2NyLT5wdXRjKHdpbi0+c2NyLCBjaCk7CisJaWYgKCArKyh3aW4tPmN1cnNfeCkgLSB3aW4tPndpZHRoID09IDAgKSB7CisJCWlmICggd3JhcCA9PSBXUkFQICkgeworCQkJd2luLT5jdXJzX3ggPSAwOworCQkJLyogc3BlY2lmaWNhdGlvbiBzYXlzIHdlIHNob3VsZCByZWFsbHkgc2Nyb2xsLAorCQkJICAgYnV0IHdlIGhhdmUgbm8gYnVmZmVyIHRvIHNjcm9sbCB3aXRoLCBzbyB3ZQorCQkJICAgY2FuIG9ubHkgb3ZlcndyaXRlIGJhY2sgYXQgdGhlIGJlZ2lubmluZyBvZgorCQkJICAgdGhlIHdpbmRvdyAqLworCQkJaWYgKCArKyh3aW4tPmN1cnNfeSkgLSB3aW4tPmhlaWdodCA9PSAwICkKKwkJCQl3aW4tPmN1cnNfeSA9IDA7CisJCX0gZWxzZSB7CisJCQkod2luLT5jdXJzX3gpLS07CisJCX0KKwl9Cit9CisKKy8qKgorICogV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyIHRvIGEgd2luZG93CisgKgorICogQHYgKndpbgl3aW5kb3cgaW4gd2hpY2ggdG8gd3JpdGUKKyAqIEB2IGMJCWNoYXJhY3RlciByZW5kaXRpb24gdG8gd3JpdGUKKyAqIEB2IHdyYXAJd3JhcCAic3dpdGNoIgorICovCit2b2lkIF93cHV0YyAoIFdJTkRPVyAqd2luLCBjaGFyIGMsIGludCB3cmFwICkgeworCV93cHV0Y2ggKCB3aW4sICggYyB8IHdpbi0+YXR0cnMgKSwgd3JhcCApOworfQorCisvKioKKyAqIFJldHJlYXQgdGhlIGN1cnNvciBiYWNrIG9uZSBwb3NpdGlvbiAodXNlZnVsIGZvciBhIHdob2xlIGhvc3Qgb2YKKyAqIG9wcykKKyAqCisgKiBAdiAqd2luCXdpbmRvdyBpbiB3aGljaCB0byByZXRyZWF0CisgKi8KK3ZvaWQgX3djdXJzYmFjayAoIFdJTkRPVyAqd2luICkgeworCWlmICggd2luLT5jdXJzX3ggPT0gMCApIHsKKwkJaWYgKCB3aW4tPmN1cnNfeSA9PSAwICkKKwkJCXdpbi0+Y3Vyc195ID0gd2luLT5oZWlnaHQgLSAxOworCQl3aW4tPmN1cnNfeCA9IHdpbi0+d2lkdGggPSAxOworCX0gZWxzZSB7CisJCXdpbi0+Y3Vyc194LS07CisJfQorCisJX3d1cGRjdXJzKHdpbik7Cit9CisKKy8qKgorICogV3JpdGUgYSBjaHR5cGUgc3RyaW5nIHRvIGEgd2luZG93CisgKgorICogQHYgKndpbgl3aW5kb3cgaW4gd2hpY2ggdG8gd3JpdGUKKyAqIEB2ICpjaHN0cgljaHR5cGUgc3RyaW5nCisgKiBAdiB3cmFwCXdyYXAgInN3aXRjaCIKKyAqIEB2IG4JCXdyaXRlIGF0IG1vc3QgbiBjaHR5cGVzCisgKi8KK3ZvaWQgX3dwdXRjaHN0ciAoIFdJTkRPVyAqd2luLCBjb25zdCBjaHR5cGUgKmNoc3RyLCBpbnQgd3JhcCwgaW50IG4gKSB7CisJZm9yICggOyAqY2hzdHIgJiYgbi0tIDsgY2hzdHIrKyApIHsKKwkJX3dwdXRjaCh3aW4sKmNoc3RyLHdyYXApOworCX0KK30KKworLyoqCisgKiBXcml0ZSBhIHN0YW5kYXJkIGMtc3R5bGUgc3RyaW5nIHRvIGEgd2luZG93CisgKgorICogQHYgKndpbgl3aW5kb3cgaW4gd2hpY2ggdG8gd3JpdGUKKyAqIEB2ICpzdHIJc3RyaW5nCisgKiBAdiB3cmFwCXdyYXAgInN3aXRjaCIKKyAqIEB2IG4JCXdyaXRlIGF0IG1vc3QgbiBjaGFycyBmcm9tICpzdHIKKyAqLwordm9pZCBfd3B1dHN0ciAoIFdJTkRPVyAqd2luLCBjb25zdCBjaGFyICpzdHIsIGludCB3cmFwLCBpbnQgbiApIHsKKwlmb3IgKCA7ICpzdHIgJiYgbi0tIDsgc3RyKysgKSB7CisJCV93cHV0YyAoIHdpbiwgKnN0ciwgd3JhcCApOworCX0KK30KKworLyoqCisgKiBNb3ZlIGEgd2luZG93J3MgY3Vyc29yIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KKyAqCisgKiBAdiAqd2luCXdpbmRvdyB0byBiZSBvcGVyYXRlZCBvbgorICogQHYgeQkJWSBwb3NpdGlvbgorICogQHYgeAkJWCBwb3NpdGlvbgorICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHdtb3ZlICggV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCApIHsKKwkvKiBjaGVjaCBmb3Igb3V0LW9mLWJvdW5kcyBlcnJvcnMgKi8KKwlpZiAoICggKHVuc2lnbmVkKXkgPj0gd2luLT5oZWlnaHQgKSB8fAorCSAgICAgKCAodW5zaWduZWQpeCA+PSB3aW4tPndpZHRoICkgKSB7CisJCXJldHVybiBFUlI7CisJfQorCisJd2luLT5jdXJzX3kgPSB5OworCXdpbi0+Y3Vyc194ID0geDsKKwlfd3VwZGN1cnMod2luKTsKKwlyZXR1cm4gT0s7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvbXVjdXJzZXMuaCBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9tdWN1cnNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzEwODYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvbXVjdXJzZXMuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9NVUNVUlNFU19ICisjZGVmaW5lIF9NVUNVUlNFU19ICisKKy8qKiBAZmlsZQorICoKKyAqIE11Q3Vyc2VzIGNvcmUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaGVhZGVyIGZpbGUKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjZGVmaW5lIFdSQVAgMAorI2RlZmluZSBOT1dSQVAgMQorCitleHRlcm4gU0NSRUVOIF9hbnNpX3NjcmVlbjsKKworZXh0ZXJuIHZvaWQgX3dwdXRjaCAoIFdJTkRPVyAqd2luLCBjaHR5cGUgY2gsIGludCB3cmFwICkgX19ub25udWxsOworZXh0ZXJuIHZvaWQgX3dwdXRjICggV0lORE9XICp3aW4sIGNoYXIgYywgaW50IHdyYXAgKSBfX25vbm51bGw7CitleHRlcm4gdm9pZCBfd3B1dGNoc3RyICggV0lORE9XICp3aW4sIGNvbnN0IGNodHlwZSAqY2hzdHIsIGludCB3cmFwLCBpbnQgbiApIF9fbm9ubnVsbDsKK2V4dGVybiB2b2lkIF93cHV0c3RyICggV0lORE9XICp3aW4sIGNvbnN0IGNoYXIgKnN0ciwgaW50IHdyYXAsIGludCBuICkgX19ub25udWxsOworZXh0ZXJuIHZvaWQgX3djdXJzYmFjayAoIFdJTkRPVyAqd2luICkgX19ub25udWxsOworCisjZW5kaWYgLyogX01VQ1VSU0VTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9wcmludC5jIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL3ByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwOGMwYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9wcmludC5jCkBAIC0wLDAgKzEsODYgQEAKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGdweGUvdnNwcmludGYuaD4KKyNpbmNsdWRlICJtdWN1cnNlcy5oIgorCisvKiogQGZpbGUKKyAqCisgKiBNdUN1cnNlcyBwcmludGluZyBmdW5jdGlvbnMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEFkZCBhIHNpbmdsZS1ieXRlIGNoYXJhY3RlciBhbmQgcmVuZGl0aW9uIHRvIGEgd2luZG93IGFuZCBhZHZhbmNlCisgKiB0aGUgY3Vyc29yCisgKgorICogQHYgKndpbgl3aW5kb3cgdG8gYmUgcmVuZGVyZWQgaW4KKyAqIEB2IGNoCWNoYXJhY3RlciB0byBiZSBhZGRlZCBhdCBjdXJzb3IKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB3YWRkY2ggKCBXSU5ET1cgKndpbiwgY29uc3QgY2h0eXBlIGNoICkgeworCV93cHV0Y2goIHdpbiwgY2gsIFdSQVAgKTsKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogQWRkIHN0cmluZyBvZiBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXJzIHRvIGEgd2luZG93CisgKgorICogQHYgKndpbgl3aW5kb3cgdG8gYmUgcmVuZGVyZWQgaW4KKyAqIEB2ICpzdHIJc3RhbmRhcmQgYy1zdHlsZSBzdHJpbmcKKyAqIEB2IG4JCW1heCBudW1iZXIgb2YgY2hhcnMgZnJvbSBzdHJpbmcgdG8gcmVuZGVyCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2FkZG5zdHIgKCBXSU5ET1cgKndpbiwgY29uc3QgY2hhciAqc3RyLCBpbnQgbiApIHsKKwlfd3B1dHN0ciggd2luLCBzdHIsIFdSQVAsIG4gKTsKKwlyZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBwcmludHdfY29udGV4dCB7CisJc3RydWN0IHByaW50Zl9jb250ZXh0IGN0eDsKKwlXSU5ET1cgKndpbjsKK307CisKK3N0YXRpYyB2b2lkIF9wcmludHdfaGFuZGxlciAoIHN0cnVjdCBwcmludGZfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgYyApIHsKKwlzdHJ1Y3QgcHJpbnR3X2NvbnRleHQgKndjdHggPQorCQljb250YWluZXJfb2YgKCBjdHgsIHN0cnVjdCBwcmludHdfY29udGV4dCwgY3R4ICk7CisKKwlfd3B1dGNoKCB3Y3R4LT53aW4sIGMgfCB3Y3R4LT53aW4tPmF0dHJzLCBXUkFQICk7Cit9CisKKy8qKgorICogUHJpbnQgZm9ybWF0dGVkIG91dHB1dCBpbiBhIHdpbmRvdworICoKKyAqIEB2ICp3aW4Jc3ViamVjdCB3aW5kb3cKKyAqIEB2ICpmbXQJZm9ybWF0dGVkIHN0cmluZworICogQHYgdmFyZ2xpc3QJYXJndW1lbnQgbGlzdAorICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHZ3X3ByaW50dyAoIFdJTkRPVyAqd2luLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmFyZ2xpc3QgKSB7CisJc3RydWN0IHByaW50d19jb250ZXh0IHdjdHg7CisKKwl3Y3R4LndpbiA9IHdpbjsKKwl3Y3R4LmN0eC5oYW5kbGVyID0gX3ByaW50d19oYW5kbGVyOworCXZjcHJpbnRmICggJih3Y3R4LmN0eCksIGZtdCwgdmFyZ2xpc3QgKTsKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogUHJpbnQgZm9ybWF0dGVkIG91dHB1dCB0byBhIHdpbmRvdworICoKKyAqIEB2ICp3aW4Jc3ViamVjdCB3aW5kb3cKKyAqIEB2ICpmbXQJZm9ybWF0dGVkIHN0cmluZworICogQHYgLi4uCXN0cmluZyBhcmd1bWVudHMKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB3cHJpbnR3ICggV0lORE9XICp3aW4sIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkgeworCXZhX2xpc3QgYXJnczsKKwlpbnQgaTsKKworCXZhX3N0YXJ0ICggYXJncywgZm10ICk7CisJaSA9IHZ3X3ByaW50dyAoIHdpbiwgZm10LCBhcmdzICk7CisJdmFfZW5kICggYXJncyApOworCXJldHVybiBpOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL3ByaW50X25hZHYuYyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9wcmludF9uYWR2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0NzJlNgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9wcmludF9uYWR2LmMKQEAgLTAsMCArMSwyNiBAQAorI2luY2x1ZGUgPGN1cnNlcy5oPgorI2luY2x1ZGUgIm11Y3Vyc2VzLmgiCisjaW5jbHVkZSAiY3Vyc29yLmgiCisKKy8qKiBAZmlsZQorICoKKyAqIE11Q3Vyc2VzIHByaW50aW5nIGZ1bmN0aW9ucyAobm8gY3Vyc29yIGFkdmFuY2UpCisgKgorICovCisKKy8qKgorICogQWRkIHN0cmluZyBvZiBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXJzIGFuZCByZW5kaXRpb25zIHRvIGEgd2luZG93CisgKgorICogQHYgKndpbgl3aW5kb3cgdG8gYmUgcmVuZGVyZWQgaW4KKyAqIEB2ICpjaHN0cglwb2ludGVyIHRvIGZpcnN0IGNodHlwZSBpbiAic3RyaW5nIgorICogQHYgbgkJbWF4IG51bWJlciBvZiBjaGFycyBmcm9tIGNoc3RyIHRvIHJlbmRlcgorICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHdhZGRjaG5zdHIgKCBXSU5ET1cgKndpbiwgY29uc3QgY2h0eXBlICpjaHN0ciwgaW50IG4gKSB7CisJc3RydWN0IGN1cnNvcl9wb3MgcG9zOwkKKworCV9zdG9yZV9jdXJzX3Bvcyggd2luLCAmcG9zICk7CisJX3dwdXRjaHN0ciggd2luLCBjaHN0ciwgTk9XUkFQLCBuICk7CisJX3Jlc3RvcmVfY3Vyc19wb3MoIHdpbiwgJnBvcyApOworCXJldHVybiBPSzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9zbGsuYyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy9zbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDA2NThlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL3Nsay5jCkBAIC0wLDAgKzEsMzYzIEBACisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAibXVjdXJzZXMuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKworLyoqIEBmaWxlCisgKgorICogU29mdCBsYWJlbCBrZXkgZnVuY3Rpb25zCisgKi8KKworI2RlZmluZSBNSU5fU1BBQ0VfU0laRSAyCisKKyNkZWZpbmUgU0xLX01BWF9MQUJFTF9MRU4gOAorCisjZGVmaW5lIFNMS19NQVhfTlVNX0xBQkVMUyAxMgorCisjZGVmaW5lIFNMS19NQVhfTlVNX1NQQUNFUyAyCisKK3N0cnVjdCBfc29mdGxhYmVsIHsKKwkvLyBsYWJlbCBzdHJpbmcKKwljaGFyIGxhYmVsW1NMS19NQVhfTEFCRUxfTEVOXTsKKwkvKiBGb3JtYXQgb2Ygc29mdCBsYWJlbCAKKwkgICAwOiBsZWZ0IGp1c3RpZnkKKwkgICAxOiBjZW50cmUganVzdGlmeQorCSAgIDI6IHJpZ2h0IGp1c3RpZnkKKwkgKi8KKwl1bnNpZ25lZCBpbnQgZm10OworfTsKKworc3RydWN0IF9zb2Z0bGFiZWxrZXlzIHsKKwlzdHJ1Y3QgX3NvZnRsYWJlbCBma2V5c1tTTEtfTUFYX05VTV9MQUJFTFNdOworCWF0dHJfdCBhdHRyczsKKwkvKiBTb2Z0IGxhYmVsIGxheW91dCBmb3JtYXQKKwkgICAwOiAzLTItMworCSAgIDE6IDQtNAorCSAgIDI6IDQtNC00CisJICAgMzogNC00LTQgd2l0aCBpbmRleCBsaW5lCisJKi8KKwl1bnNpZ25lZCBpbnQgZm10OworCXVuc2lnbmVkIGludCBtYXhfbGFiZWxfbGVuOworCXVuc2lnbmVkIGludCBtYWpfc3BhY2VfbGVuOworCXVuc2lnbmVkIGludCBudW1fbGFiZWxzOworCXVuc2lnbmVkIGludCBudW1fc3BhY2VzOworCXVuc2lnbmVkIGludCBzcGFjZXNbU0xLX01BWF9OVU1fU1BBQ0VTXTsKKwlzdHJ1Y3QgY3Vyc29yX3BvcyBzYXZlZF9jdXJzb3I7CisJYXR0cl90IHNhdmVkX2F0dHJzOworCXNob3J0IHNhdmVkX3BhaXI7Cit9OworCitzdGF0aWMgc3RydWN0IF9zb2Z0bGFiZWxrZXlzICpzbGtzOworCisvKgorICBJIGVpdGhlciBuZWVkIHRvIGJyZWFrIHRoZSBwcmltaXRpdmVzIGhlcmUsIG9yIHdyaXRlIGEgY29sbGVjdGlvbiBvZgorICBmdW5jdGlvbnMgc3BlY2lmaWNhbGx5IGZvciBTTEtzIHRoYXQgZGlyZWN0bHkgYWNjZXNzIHRoZSBzY3JlZW4KKyAgZnVuY3Rpb25zIC0gc2luY2UgdGhpcyB0ZWNobmljYWxseSBpc24ndCBwYXJ0IG9mIHN0ZHNjciwgSSB0aGluaworICB0aGlzIHNob3VsZCBiZSBvay4uLgorICovCisKK3N0YXRpYyB2b2lkIF9lbnRlcl9zbGsgKCB2b2lkICkgeworCV9zdG9yZV9jdXJzX3BvcyAoIHN0ZHNjciwgJnNsa3MtPnNhdmVkX2N1cnNvciApOworCXdhdHRyX2dldCAoIHN0ZHNjciwgJnNsa3MtPnNhdmVkX2F0dHJzLCAmc2xrcy0+c2F2ZWRfcGFpciwgTlVMTCApOworCUxJTkVTKys7CisJd21vdmUgKCBzdGRzY3IsIExJTkVTLCAwICk7CisJd2F0dHJzZXQgKCBzdGRzY3IsIHNsa3MtPmF0dHJzICk7Cit9CisKK3N0YXRpYyB2b2lkIF9sZWF2ZV9zbGsgKCB2b2lkICkgeworCUxJTkVTLS07CisJd2F0dHJfc2V0ICggc3Rkc2NyLCBzbGtzLT5zYXZlZF9hdHRycywgc2xrcy0+c2F2ZWRfcGFpciwgTlVMTCApOworCV9yZXN0b3JlX2N1cnNfcG9zICggc3Rkc2NyLCAmc2xrcy0+c2F2ZWRfY3Vyc29yICk7Cit9CisKK3N0YXRpYyB2b2lkIF9wcmludF9sYWJlbCAoIHN0cnVjdCBfc29mdGxhYmVsIHNsICkgeworCWludCBzcGFjZV9jaDsKKwljaGFyIHN0cltTTEtfTUFYX0xBQkVMX0xFTiArIDFdOworCisJYXNzZXJ0ICggc2xrcy0+bWF4X2xhYmVsX2xlbiA8PSBTTEtfTUFYX0xBQkVMX0xFTiApOworCXNwYWNlX2NoID0gJyAnOworCisJLy8gcHJvdGVjdCBhZ2FpbnN0IGdhcHMgaW4gdGhlIHNvZnQgbGFiZWwga2V5cyBhcnJheQorCWlmICggc2wubGFiZWwgPT0gTlVMTCApIHsKKwkJbWVtc2V0KCBzdHIsIHNwYWNlX2NoLCAoc2l6ZV90KShzbGtzLT5tYXhfbGFiZWxfbGVuKSApOworCX0gZWxzZSB7CisJCS8qIHdlIG5lZWQgdG8gcGFkIHRoZSBsYWJlbCB3aXRoIHZhcnlpbmcgYW1vdW50cyBvZiBsZWFkaW5nCisJCSAgIHBhZCBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgKi8KKwkJaWYgKCBzbC5mbXQgPT0gMSApIHsKKwkJCW1lbXNldCggc3RyLCBzcGFjZV9jaCwgCisJCQkJKHNpemVfdCkoc2xrcy0+bWF4X2xhYmVsX2xlbiAKKwkJCQkJIC0gc3RybGVuKHNsLmxhYmVsKSkgLyAyICk7CisJCX0KKwkJaWYgKCBzbC5mbXQgPT0gMiApIHsKKwkJCW1lbXNldCggc3RyLCBzcGFjZV9jaCwKKwkJCQkoc2l6ZV90KShzbGtzLT5tYXhfbGFiZWxfbGVuIAorCQkJCQkgLSBzdHJsZW4oc2wubGFiZWwpKSApOworCQl9CisJCXN0cmNhdChzdHIsc2wubGFiZWwpOworCQkKKwkJLy8gcG9zdC1wYWRkaW5nCisJCW1lbXNldChzdHIrc3RybGVuKHN0ciksIHNwYWNlX2NoLAorCQkgICAgICAgKHNpemVfdCkoc2xrcy0+bWF4X2xhYmVsX2xlbiAtIHN0cmxlbihzdHIpKSApOworCX0KKworCS8vIHByaW50IHRoZSBmb3JtYXR0ZWQgbGFiZWwKKwlfd3B1dHN0ciAoIHN0ZHNjciwgc3RyLCBOT1dSQVAsIHNsa3MtPm1heF9sYWJlbF9sZW4gKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSB1c2VkIGZvciB0aGUgc29mdCBmdW5jdGlvbiBrZXlzCisgKgorICogQHJldCBhdHRycwl0aGUgY3VycmVudCBhdHRyaWJ1dGVzIG9mIHRoZSBzb2Z0IGZ1bmN0aW9uIGtleXMKKyAqLworYXR0cl90IHNsa19hdHRyICggdm9pZCApIHsKKwlyZXR1cm4gKCBzbGtzID09IE5VTEwgPyAwIDogc2xrcy0+YXR0cnMgKTsKK30KKworLyoqCisgKiBUdXJuIG9mZiBzb2Z0IGZ1bmN0aW9uIGtleSBhdHRyaWJ1dGVzCisgKgorICogQHYgYXR0cnMJYXR0cmlidXRlIGJpdCBtYXNrCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgc2xrX2F0dHJvZmYgKCBjb25zdCBjaHR5cGUgYXR0cnMgKSB7CisJaWYgKCBzbGtzID09IE5VTEwgKSAKKwkJcmV0dXJuIEVSUjsKKwlzbGtzLT5hdHRycyAmPSB+KCBhdHRycyAmIEFfQVRUUklCVVRFUyApOworCXJldHVybiBPSzsKK30KKworLyoqCisgKiBUdXJuIG9uIHNvZnQgZnVuY3Rpb24ga2V5IGF0dHJpYnV0ZXMKKyAqCisgKiBAdiBhdHRycwlhdHRyaWJ1dGUgYml0IG1hc2sKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBzbGtfYXR0cm9uICggY29uc3QgY2h0eXBlIGF0dHJzICkgeworCWlmICggc2xrcyA9PSBOVUxMICkKKwkJcmV0dXJuIEVSUjsKKwlzbGtzLT5hdHRycyB8PSAoIGF0dHJzICYgQV9BVFRSSUJVVEVTICk7CisJcmV0dXJuIE9LOworfQorCisvKioKKyAqIFNldCBzb2Z0IGZ1bmN0aW9uIGtleSBhdHRyaWJ1dGVzCisgKgorICogQHYgYXR0cnMJYXR0cmlidXRlIGJpdCBtYXNrCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgc2xrX2F0dHJzZXQgKCBjb25zdCBjaHR5cGUgYXR0cnMgKSB7CisJaWYgKCBzbGtzID09IE5VTEwgKSAKKwkJcmV0dXJuIEVSUjsKKwlzbGtzLT5hdHRycyA9ICggYXR0cnMgJiBBX0FUVFJJQlVURVMgKTsKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogVHVybiBvZmYgc29mdCBmdW5jdGlvbiBrZXkgYXR0cmlidXRlcworICoKKyAqIEB2IGF0dHJzCWF0dHJpYnV0ZSBiaXQgbWFzaworICogQHYgKm9wdHMJdW5kZWZpbmVkIChmb3IgZnV0dXJlIGltcGxlbWVudGF0aW9uKQorICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHNsa19hdHRyX29mZiAoIGNvbnN0IGF0dHJfdCBhdHRycywgdm9pZCAqb3B0cyBfX3VudXNlZCApIHsKKwlyZXR1cm4gc2xrX2F0dHJvZmYoIGF0dHJzICk7Cit9CisKKy8qKgorICogVHVybiBvbiBzb2Z0IGZ1bmN0aW9uIGtleSBhdHRyaWJ1dGVzCisgKgorICogQHYgYXR0cnMJYXR0cmlidXRlIGJpdCBtYXNrCisgKiBAdiAqb3B0cwl1bmRlZmluZWQgKGZvciBmdXR1cmUgaW1wbGVtZW50YXRpb24pCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgc2xrX2F0dHJfb24gKCBhdHRyX3QgYXR0cnMsIHZvaWQgKm9wdHMgX191bnVzZWQgKSB7CisJcmV0dXJuIHNsa19hdHRyb24oIGF0dHJzICk7Cit9CisKKy8qKgorICogU2V0IHNvZnQgZnVuY3Rpb24ga2V5IGF0dHJpYnV0ZXMKKyAqCisgKiBAdiBhdHRycwkJCWF0dHJpYnV0ZSBiaXQgbWFzaworICogQHYgY29sb3VyX3BhaXJfbnVtYmVyCWNvbG91ciBwYWlyIGludGVnZXIKKyAqIEB2ICpvcHRzCQkJdW5kZWZpbmVkIChmb3IgZnV0dXJlIGltcGxlbWVudGF0aW9uKQorICogQHJldCByYwkJCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgc2xrX2F0dHJfc2V0ICggY29uc3QgYXR0cl90IGF0dHJzLCBzaG9ydCBjb2xvdXJfcGFpcl9udW1iZXIsCisJCSAgIHZvaWQgKm9wdHMgX191bnVzZWQgKSB7CisJaWYgKCBzbGtzID09IE5VTEwgKSAKKwkJcmV0dXJuIEVSUjsKKworCWlmICggKCB1bnNpZ25lZCBzaG9ydCApY29sb3VyX3BhaXJfbnVtYmVyID4gQ09MT1JTICkKKwkJcmV0dXJuIEVSUjsKKworCXNsa3MtPmF0dHJzID0gKCAodW5zaWduZWQgc2hvcnQpY29sb3VyX3BhaXJfbnVtYmVyIDw8IENQQUlSX1NISUZUICkgfAorCQkoIGF0dHJzICYgQV9BVFRSSUJVVEVTICk7CisJcmV0dXJuIE9LOworfQorCisvKioKKyAqIENsZWFyIHRoZSBzb2Z0IGZ1bmN0aW9uIGtleSBsYWJlbHMgZnJvbSB0aGUgc2NyZWVuCisgKgorICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHNsa19jbGVhciAoIHZvaWQgKSB7CisJaWYgKCBzbGtzID09IE5VTEwgKQorCQlyZXR1cm4gRVJSOworCisJX2VudGVyX3NsaygpOworCXdjbHJ0b2VvbCAoIHN0ZHNjciApOworCV9sZWF2ZV9zbGsoKTsKKworCXJldHVybiBPSzsKK30KKworLyoqCisgKiBTZXQgc29mdCBsYWJlbCBjb2xvdXIgcGFpcgorICovCitpbnQgc2xrX2NvbG91ciAoIHNob3J0IGNvbG91cl9wYWlyX251bWJlciApIHsKKwlpZiAoIHNsa3MgPT0gTlVMTCApIAorCQlyZXR1cm4gRVJSOworCWlmICggKCB1bnNpZ25lZCBzaG9ydCApY29sb3VyX3BhaXJfbnVtYmVyID4gQ09MT1JTICkKKwkJcmV0dXJuIEVSUjsKKworCXNsa3MtPmF0dHJzID0gKCAodW5zaWduZWQgc2hvcnQpY29sb3VyX3BhaXJfbnVtYmVyIDw8IENQQUlSX1NISUZUICkKKwkJfCAoIHNsa3MtPmF0dHJzICYgQV9BVFRSSUJVVEVTICk7CisKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogSW5pdGlhbGlzZSB0aGUgc29mdCBmdW5jdGlvbiBrZXlzCisgKgorICogQHYgZm10CWZvcm1hdCBvZiBrZXlzCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgc2xrX2luaXQgKCBpbnQgZm10ICkgeworCXVuc2lnbmVkIHNob3J0IG5tYWosIG5taW4sIG5ibG9ja3MsIGF2YWlsYWJsZV93aWR0aDsKKworCWlmICggKHVuc2lnbmVkKWZtdCA+IDMgKSB7CisJCXJldHVybiBFUlI7CisJfQorCisJLyogVGhlcmUgc2VlbXMgdG8gYmUgbm8gQVBJIGNhbGwgdG8gZnJlZSB0aGlzIGRhdGEgc3RydWN0dXJlLi4uICovCisJaWYgKCAhIHNsa3MgKQorCQlzbGtzID0gY2FsbG9jKDEsc2l6ZW9mKCpzbGtzKSk7CisJaWYgKCAhIHNsa3MgKQorCQlyZXR1cm4gRVJSOworCisJc2xrcy0+YXR0cnMgPSBBX0RFRkFVTFQ7CisJc2xrcy0+Zm10ID0gZm10OworCXN3aXRjaChmbXQpIHsKKwljYXNlIDA6CisJCW5ibG9ja3MgPSA4OyBubWFqID0gMjsgbm1pbiA9IDU7CisJCXNsa3MtPnNwYWNlc1swXSA9IDI7IHNsa3MtPnNwYWNlc1sxXSA9IDQ7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbmJsb2NrcyA9IDg7IG5tYWogPSAxOyBubWluID0gNjsKKwkJc2xrcy0+c3BhY2VzWzBdID0gMzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvLyBzYW1lIGFsbG9jYXRpb25zIGFzIGZvcm1hdCAzCisJY2FzZSAzOgorCQluYmxvY2tzID0gMTI7IG5tYWogPSAyOyBubWluID0gOTsKKwkJc2xrcy0+c3BhY2VzWzBdID0gMzsgc2xrcy0+c3BhY2VzWzFdID0gNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbmJsb2NrcyA9IDA7IG5tYWogPSAwOyBubWluID0gMDsKKwkJYnJlYWs7CisJfQorCisJLy8gZGV0ZXJtaW5lIG1heGltdW0gbGFiZWwgbGVuZ3RoIGFuZCBtYWpvciBzcGFjZSBzaXplCisJYXZhaWxhYmxlX3dpZHRoID0gQ09MUyAtICggKCBNSU5fU1BBQ0VfU0laRSAqIG5tYWogKSArIG5taW4gKTsKKwlzbGtzLT5tYXhfbGFiZWxfbGVuID0gYXZhaWxhYmxlX3dpZHRoIC8gbmJsb2NrczsKKwlzbGtzLT5tYWpfc3BhY2VfbGVuID0gTUlOX1NQQUNFX1NJWkUgKyAKKwkJKCBhdmFpbGFibGVfd2lkdGggJSBuYmxvY2tzICkgLyBubWFqOworCXNsa3MtPm51bV9zcGFjZXMgPSBubWFqOworCXNsa3MtPm51bV9sYWJlbHMgPSBuYmxvY2tzOworCisJLy8gc3RyaXAgYSBsaW5lIGZyb20gdGhlIHNjcmVlbgorCUxJTkVTIC09IDE7CisKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhlIHNwZWNpZmllZCBzb2Z0IGtleQorICoKKyAqIEB2IGxhYm51bQlzb2Z0IGtleSBpZGVudGlmaWVyCisgKiBAcmV0IGxhYmVsCXJldHVybiBsYWJlbAorICovCitjaGFyKiBzbGtfbGFiZWwgKCBpbnQgbGFibnVtICkgeworCWlmICggc2xrcyA9PSBOVUxMICkgCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHNsa3MtPmZrZXlzW2xhYm51bV0ubGFiZWw7Cit9CisKKy8qKgorICogUmVzdG9yZSBzb2Z0IGZ1bmN0aW9uIGtleSBsYWJlbHMgdG8gdGhlIHNjcmVlbgorICoKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBzbGtfcmVzdG9yZSAoIHZvaWQgKSB7CisJdW5zaWduZWQgaW50IGksIGosIHBvc194LAorCQkqbmV4dF9zcGFjZSwgKmxhc3Rfc3BhY2U7CisJY2h0eXBlIHNwYWNlX2NoOworCisJaWYgKCBzbGtzID09IE5VTEwgKQorCQlyZXR1cm4gRVJSOworCisJcG9zX3ggPSAwOworCisJX2VudGVyX3NsaygpOworCisJc3BhY2VfY2ggPSAoY2h0eXBlKScgJyB8IHNsa3MtPmF0dHJzOworCW5leHRfc3BhY2UgPSAmKHNsa3MtPnNwYWNlc1swXSk7CisJbGFzdF9zcGFjZSA9ICYoc2xrcy0+c3BhY2VzW3Nsa3MtPm51bV9zcGFjZXMtMV0pOworCisJZm9yICggaSA9IDA7IGkgPCBzbGtzLT5udW1fbGFiZWxzIDsgaSsrICkgeworCQlfcHJpbnRfbGFiZWwoIHNsa3MtPmZrZXlzW2ldICk7CisJCXBvc194ICs9IHNsa3MtPm1heF9sYWJlbF9sZW47CisKKwkJaWYgKCBpID09ICpuZXh0X3NwYWNlICkgeworCQkJZm9yICggaiA9IDA7IGogPCBzbGtzLT5tYWpfc3BhY2VfbGVuOyBqKyssIHBvc194KysgKQorCQkJCV93cHV0Y2ggKCBzdGRzY3IsIHNwYWNlX2NoLCBOT1dSQVAgKTsKKwkJCWlmICggbmV4dF9zcGFjZSA8IGxhc3Rfc3BhY2UgKQorCQkJCW5leHRfc3BhY2UrKzsKKwkJfSBlbHNlIHsKKwkJCWlmICggcG9zX3ggPCBDT0xTICkKKwkJCQlfd3B1dGNoICggc3Rkc2NyLCBzcGFjZV9jaCwgTk9XUkFQICk7CisJCQlwb3NfeCsrOworCQl9CisJfQorCisJX2xlYXZlX3NsaygpOworCisJcmV0dXJuIE9LOworfQorCisvKioKKyAqIENvbmZpZ3VyZSBzcGVjaWZpZWQgc29mdCBrZXkKKyAqCisgKiBAdiBsYWJudW0Jc29mdCBsYWJlbCBwb3NpdGlvbiB0byBjb25maWd1cmUKKyAqIEB2ICpsYWJlbAlzdHJpbmcgdG8gdXNlIGFzIHNvZnQga2V5IGxhYmVsCisgKiBAdiBmbXQJanVzdGlmaWNhdGlvbiBmb3JtYXQgb2YgbGFiZWwKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBzbGtfc2V0ICggaW50IGxhYm51bSwgY29uc3QgY2hhciAqbGFiZWwsIGludCBmbXQgKSB7CisJaWYgKCBzbGtzID09IE5VTEwgKSAKKwkJcmV0dXJuIEVSUjsKKwlpZiAoICh1bnNpZ25lZCBzaG9ydClsYWJudW0gPj0gc2xrcy0+bnVtX2xhYmVscyApCisJCXJldHVybiBFUlI7CisJaWYgKCAodW5zaWduZWQgc2hvcnQpZm10ID49IDMgKQorCQlyZXR1cm4gRVJSOworCisJc3RybmNweShzbGtzLT5ma2V5c1tsYWJudW1dLmxhYmVsLCBsYWJlbCwKKwkJc2l6ZW9mKHNsa3MtPmZrZXlzW2xhYm51bV0ubGFiZWwpKTsKKwlzbGtzLT5ma2V5c1tsYWJudW1dLmZtdCA9IGZtdDsKKworCXJldHVybiBPSzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9tdWN1cnNlcy93aWRnZXRzL2VkaXRib3guYyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy93aWRnZXRzL2VkaXRib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTdkNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL3dpZGdldHMvZWRpdGJveC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9lZGl0Ym94Lmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEVkaXRhYmxlIHRleHQgYm94IHdpZGdldAorICoKKyAqLworCisjZGVmaW5lIEVESVRCT1hfTUlOX0NIQVJTIDMKKworLyoqCisgKiBJbml0aWFsaXNlIHRleHQgYm94IHdpZGdldAorICoKKyAqIEB2IGJveAkJRWRpdGFibGUgdGV4dCBib3ggd2lkZ2V0CisgKiBAdiBidWYJCVRleHQgYnVmZmVyCisgKiBAdiBsZW4JCVNpemUgb2YgdGV4dCBidWZmZXIKKyAqIEB2IHdpbgkJQ29udGFpbmluZyB3aW5kb3cKKyAqIEB2IHJvdwkJUm93CisgKiBAdiBjb2wJCVN0YXJ0aW5nIGNvbHVtbgorICogQHYgd2lkdGgJCVdpZHRoCisgKiBAdiBmbGFncwkJRmxhZ3MKKyAqLwordm9pZCBpbml0X2VkaXRib3ggKCBzdHJ1Y3QgZWRpdF9ib3ggKmJveCwgY2hhciAqYnVmLCBzaXplX3QgbGVuLAorCQkgICAgV0lORE9XICp3aW4sIHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsCisJCSAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBmbGFncyApIHsKKwltZW1zZXQgKCBib3gsIDAsIHNpemVvZiAoICpib3ggKSApOworCWJveC0+c3RyaW5nLmJ1ZiA9IGJ1ZjsKKwlib3gtPnN0cmluZy5sZW4gPSBsZW47CisJYm94LT5zdHJpbmcuY3Vyc29yID0gc3RybGVuICggYnVmICk7CisJYm94LT53aW4gPSAoIHdpbiA/IHdpbiA6IHN0ZHNjciApOworCWJveC0+cm93ID0gcm93OworCWJveC0+Y29sID0gY29sOworCWJveC0+d2lkdGggPSB3aWR0aDsKKwlib3gtPmZsYWdzID0gZmxhZ3M7Cit9CisKKy8qKgorICogRHJhdyB0ZXh0IGJveCB3aWRnZXQKKyAqCisgKiBAdiBib3gJCUVkaXRhYmxlIHRleHQgYm94IHdpZGdldAorICoKKyAqLwordm9pZCBkcmF3X2VkaXRib3ggKCBzdHJ1Y3QgZWRpdF9ib3ggKmJveCApIHsKKwlzaXplX3Qgd2lkdGggPSBib3gtPndpZHRoOworCWNoYXIgYnVmWyB3aWR0aCArIDEgXTsKKwlzaWduZWQgaW50IGN1cnNvcl9vZmZzZXQsIHVuZGVyZmxvdywgb3ZlcmZsb3csIGZpcnN0OworCXNpemVfdCBsZW47CisKKwkvKiBBZGp1c3Qgc3RhcnRpbmcgb2Zmc2V0IHNvIHRoYXQgY3Vyc29yIHJlbWFpbnMgd2l0aGluIGJveCAqLworCWN1cnNvcl9vZmZzZXQgPSAoIGJveC0+c3RyaW5nLmN1cnNvciAtIGJveC0+Zmlyc3QgKTsKKwl1bmRlcmZsb3cgPSAoIEVESVRCT1hfTUlOX0NIQVJTIC0gY3Vyc29yX29mZnNldCApOworCW92ZXJmbG93ID0gKCBjdXJzb3Jfb2Zmc2V0IC0gKCB3aWR0aCAtIDEgKSApOworCWZpcnN0ID0gYm94LT5maXJzdDsKKwlpZiAoIHVuZGVyZmxvdyA+IDAgKSB7CisJCWZpcnN0IC09IHVuZGVyZmxvdzsKKwkJaWYgKCBmaXJzdCA8IDAgKQorCQkJZmlyc3QgPSAwOworCX0gZWxzZSBpZiAoIG92ZXJmbG93ID4gMCApIHsKKwkJZmlyc3QgKz0gb3ZlcmZsb3c7CisJfQorCWJveC0+Zmlyc3QgPSBmaXJzdDsKKwljdXJzb3Jfb2Zmc2V0ID0gKCBib3gtPnN0cmluZy5jdXJzb3IgLSBmaXJzdCApOworCisJLyogQ29uc3RydWN0IHVuZGVyc2NvcmUtcGFkZGVkIHN0cmluZyBwb3J0aW9uICovCisJbWVtc2V0ICggYnVmLCAnXycsIHdpZHRoICk7CisJYnVmW3dpZHRoXSA9ICdcMCc7CisJbGVuID0gKCBzdHJsZW4gKCBib3gtPnN0cmluZy5idWYgKSAtIGZpcnN0ICk7CisJaWYgKCBsZW4gPiB3aWR0aCApCisJCWxlbiA9IHdpZHRoOworCWlmICggYm94LT5mbGFncyAmIEVESVRCT1hfU1RBUlMgKSB7CisJCW1lbXNldCAoIGJ1ZiwgJyonLCBsZW4gKTsKKwl9IGVsc2UgeworCQltZW1jcHkgKCBidWYsICggYm94LT5zdHJpbmcuYnVmICsgZmlyc3QgKSwgbGVuICk7CisJfQorCisJLyogUHJpbnQgYm94IGNvbnRlbnQgYW5kIG1vdmUgY3Vyc29yICovCisJaWYgKCAhIGJveC0+d2luICkKKwkJYm94LT53aW4gPSBzdGRzY3I7CisJbXZ3cHJpbnR3ICggYm94LT53aW4sIGJveC0+cm93LCBib3gtPmNvbCwgIiVzIiwgYnVmICk7CisJd21vdmUgKCBib3gtPndpbiwgYm94LT5yb3csICggYm94LT5jb2wgKyBjdXJzb3Jfb2Zmc2V0ICkgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9tdWN1cnNlcy93aW5hdHRycy5jIGIvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL3dpbmF0dHJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0OWQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy93aW5hdHRycy5jCkBAIC0wLDAgKzEsMTMzIEBACisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE11Q3Vyc2VzIHdpbmRvdyBhdHRyaWJ1dGUgZnVuY3Rpb25zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBHZXQgdGhlIGJhY2tncm91bmQgcmVuZGl0aW9uIGF0dHJpYnV0ZXMgZm9yIGEgd2luZG93CisgKgorICogQHYgKndpbglzdWJqZWN0IHdpbmRvdworICogQHJldCBjaAljaHR5cGUgcmVuZGl0aW9uIHJlcHJlc2VudGF0aW9uCisgKi8KK2lubGluZSBjaHR5cGUgZ2V0YmtnZCAoIFdJTkRPVyAqd2luICkgeworCXJldHVybiB3aW4tPmF0dHJzOworfQorCisvKioKKyAqIFR1cm4gb2ZmIGF0dHJpYnV0ZXMgaW4gYSB3aW5kb3cKKyAqCisgKiBAdiB3aW4Jc3ViamVjdCB3aW5kb3cKKyAqIEB2IGF0dHJzCWF0dHJpYnV0ZXMgdG8gZW5hYmxlCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2F0dHJvZmYgKCBXSU5ET1cgKndpbiwgaW50IGF0dHJzICkgeworCXdpbi0+YXR0cnMgJj0gfmF0dHJzOworCXJldHVybiBPSzsKK30KKworLyoqCisgKiBUdXJuIG9uIGF0dHJpYnV0ZXMgaW4gYSB3aW5kb3cKKyAqCisgKiBAdiB3aW4Jc3ViamVjdCB3aW5kb3cKKyAqIEB2IGF0dHJzCWF0dHJpYnV0ZXMgdG8gZW5hYmxlCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2F0dHJvbiAoIFdJTkRPVyAqd2luLCBpbnQgYXR0cnMgKSB7CisJd2luLT5hdHRycyB8PSBhdHRyczsKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogU2V0IGF0dHJpYnV0ZXMgaW4gYSB3aW5kb3cKKyAqCisgKiBAdiB3aW4Jc3ViamVjdCB3aW5kb3cKKyAqIEB2IGF0dHJzCWF0dHJpYnV0ZXMgdG8gZW5hYmxlCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2F0dHJzZXQgKCBXSU5ET1cgKndpbiwgaW50IGF0dHJzICkgeworCXdpbi0+YXR0cnMgPSAoIGF0dHJzIHwgKCB3aW4tPmF0dHJzICYgQV9DT0xPUiApICk7CisJcmV0dXJuIE9LOworfQorCisvKioKKyAqIEdldCBhdHRyaWJ1dGVzIGFuZCBjb2xvdXIgcGFpciBpbmZvcm1hdGlvbgorICoKKyAqIEB2ICp3aW4Jd2luZG93IHRvIG9idGFpbiBpbmZvcm1hdGlvbiBmcm9tCisgKiBAdiAqYXR0cnMJYWRkcmVzcyBpbiB3aGljaCB0byBzdG9yZSBhdHRyaWJ1dGVzCisgKiBAdiAqcGFpcglhZGRyZXNzIGluIHdoaWNoIHRvIHN0b3JlIGNvbG91ciBwYWlyCisgKiBAdiAqb3B0cwl1bmRlZmluZWQgKGZvciBmdXR1cmUgaW1wbGVtZW50YXRpb24pCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY3VkZQorICovCitpbnQgd2F0dHJfZ2V0ICggV0lORE9XICp3aW4sIGF0dHJfdCAqYXR0cnMsIHNob3J0ICpwYWlyLCAKKwkJdm9pZCAqb3B0cyBfX3VudXNlZCApIHsKKwkqYXR0cnMgPSB3aW4tPmF0dHJzICYgQV9BVFRSSUJVVEVTOworCSpwYWlyID0gUEFJUl9OVU1CRVIgKCB3aW4tPmF0dHJzICk7CisJcmV0dXJuIE9LOworfQorCisvKioKKyAqIFR1cm4gb2ZmIGF0dHJpYnV0ZXMgaW4gYSB3aW5kb3cKKyAqCisgKiBAdiAqd2luCXN1YmplY3Qgd2luZG93CisgKiBAdiBhdHRycwlhdHRyaWJ1dGVzIHRvIHRvZ2dsZQorICogQHYgKm9wdHMJdW5kZWZpbmVkIChmb3IgZnV0dXJlIGltcGxlbWVudGF0aW9uKQorICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHdhdHRyX29mZiAoIFdJTkRPVyAqd2luLCBhdHRyX3QgYXR0cnMsIAorCQl2b2lkICpvcHRzIF9fdW51c2VkICkgeworCXdhdHRyb2ZmKCB3aW4sIGF0dHJzICk7CisJcmV0dXJuIE9LOworfQorCisvKioKKyAqIFR1cm4gb24gYXR0cmlidXRlcyBpbiBhIHdpbmRvdworICoKKyAqIEB2ICp3aW4Jc3ViamVjdCB3aW5kb3cKKyAqIEB2IGF0dHJzCWF0dHJpYnV0ZXMgdG8gdG9nZ2xlCisgKiBAdiAqb3B0cwl1bmRlZmluZWQgKGZvciBmdXR1cmUgaW1wbGVtZW50YXRpb24pCisgKiBAcmV0IHJjCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2F0dHJfb24gKCBXSU5ET1cgKndpbiwgYXR0cl90IGF0dHJzLCAKKwkgICAgICAgdm9pZCAqb3B0cyBfX3VudXNlZCApIHsKKwl3YXR0cm9uKCB3aW4sIGF0dHJzICk7CisJcmV0dXJuIE9LOworfQorCisvKioKKyAqIFNldCBhdHRyaWJ1dGVzIGFuZCBjb2xvdXIgcGFpciBpbmZvcm1hdGlvbiBpbiBhIHdpbmRvdworICoKKyAqIEB2ICp3aW4Jc3ViamVjdCB3aW5kb3cKKyAqIEB2IGF0dHJzCWF0dHJpYnV0ZXMgdG8gc2V0CisgKiBAdiBjcGFpcgljb2xvdXIgcGFpciB0byBzZXQKKyAqIEB2ICpvcHRzCXVuZGVmaW5lZCAoZm9yIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbikKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB3YXR0cl9zZXQgKCBXSU5ET1cgKndpbiwgYXR0cl90IGF0dHJzLCBzaG9ydCBjcGFpciwgCisJCXZvaWQgKm9wdHMgX191bnVzZWQgKSB7CisJd2F0dHJzZXQoIHdpbiwgYXR0cnMgfCBDT0xPVVJfUEFJUiAoIGNwYWlyICkgKTsKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogU2V0IGNvbG91ciBwYWlyIGZvciBhIHdpbmRvdworICoKKyAqIEB2ICp3aW4JCQlzdWJqZWN0IHdpbmRvdworICogQHYgY29sb3VyX3BhaXJfbnVtYmVyCWNvbG91ciBwYWlyIGludGVnZXIKKyAqIEB2ICpvcHRzCQkJdW5kZWZpbmVkIChmb3IgZnV0dXJlIGltcGxlbWVudGF0aW9uKQorICogQHJldCByYwkJCXJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgd2NvbG91cl9zZXQgKCBXSU5ET1cgKndpbiwgc2hvcnQgY29sb3VyX3BhaXJfbnVtYmVyLCAKKwkJICB2b2lkICpvcHRzIF9fdW51c2VkICkgeworCWlmICggKCB1bnNpZ25lZCBzaG9ydCApY29sb3VyX3BhaXJfbnVtYmVyID4gQ09MT1VSX1BBSVJTICkKKwkJcmV0dXJuIEVSUjsKKworCXdpbi0+YXR0cnMgPSAoICggd2luLT5hdHRycyAmIEFfQVRUUklCVVRFUyApIHwKKwkJICAgICAgIENPTE9VUl9QQUlSICggY29sb3VyX3BhaXJfbnVtYmVyICkgKTsKKwlyZXR1cm4gT0s7Cit9CisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS9tdWN1cnNlcy93aW5kb3dzLmMgYi9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvd2luZG93cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDBhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvbXVjdXJzZXMvd2luZG93cy5jCkBAIC0wLDAgKzEsMTU4IEBACisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibXVjdXJzZXMuaCIKKworLyoqIEBmaWxlCisgKgorICogTXVDdXJzZXMgd2luZG93cyBpbnN0YW5jZSBmdW5jdGlvbnMKKyAqCisgKi8KKworLyoqCisgKiBEZWxldGUgYSB3aW5kb3cKKyAqCisgKiBAdiAqd2luCXBvaW50ZXIgdG8gd2luZG93IGJlaW5nIGRlbGV0ZWQKKyAqIEByZXQgcmMJcmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBkZWx3aW4gKCBXSU5ET1cgKndpbiApIHsKKwlpZiAoIHdpbiA9PSBOVUxMICkKKwkJcmV0dXJuIEVSUjsKKworCS8qIEkgdGhpbmsgd2Ugc2hvdWxkIGJsYW5rIHRoZSByZWdpb24gY292ZXJlZCBieSB0aGUgd2luZG93IC0KKwkgICBuY3Vyc2VzIGRvZXNuJ3QgZG8gdGhpcywgYnV0IHRoZXkgaGF2ZSBhIGJ1ZmZlciwgc28gdGhleQorCSAgIG1heSBqdXN0IGJlIGRlbGV0aW5nIGZyb20gYW4gb2Zmc2NyZWVuIGNvbnRleHQgd2hlcmVhcyB3ZQorCSAgIGFyZSBndWFyYW50ZWVkIHRvIGJlIGRlbGV0aW5nIHNvbWV0aGluZyBvbnNjcmVlbiAqLworCXdtb3ZlKCB3aW4sIDAsIDAgKTsKKwljaHR5cGUga2lsbGNoID0gKGNodHlwZSknICc7CisJZG8geworCQlfd3B1dGNoKCB3aW4sIGtpbGxjaCwgV1JBUCApOworCX0gd2hpbGUgKCB3aW4tPmN1cnNfeCArIHdpbi0+Y3Vyc195ICk7CisKKwlmcmVlKCB3aW4gKTsKKworCXdtb3ZlICggc3Rkc2NyLCAwLCAwICk7CisKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGRlcml2ZWQgd2luZG93CisgKgorICogQHYgcGFyZW50CXBhcmVudCB3aW5kb3cKKyAqIEB2IG5saW5lcwl3aW5kb3cgaGVpZ2h0CisgKiBAdiBuY29scwl3aW5kb3cgd2lkdGgKKyAqIEB2IGJlZ2luX3kJd2luZG93IHkgb3JpZ2luIChyZWxhdGl2ZSB0byBwYXJlbnQpCisgKiBAdiBiZWdpbl94CXdpbmRvdyB4IG9yaWdpbiAocmVsYXRpdmUgdG8gcGFyZW50KQorICogQHJldCBwdHIJcmV0dXJuIHBvaW50ZXIgdG8gY2hpbGQgd2luZG93CisgKi8KK1dJTkRPVyAqZGVyd2luICggV0lORE9XICpwYXJlbnQsIGludCBubGluZXMsIGludCBuY29scywKKwkgICAgIAkJICAJIGludCBiZWdpbl95LCBpbnQgYmVnaW5feCApIHsKKwlXSU5ET1cgKmNoaWxkOworCWlmICggcGFyZW50ID09IE5VTEwgKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoICggY2hpbGQgPSBtYWxsb2MoIHNpemVvZiggV0lORE9XICkgKSApID09IE5VTEwgKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoICggKHVuc2lnbmVkKW5jb2xzID4gcGFyZW50LT53aWR0aCApIHx8IAorCSAgICAgKCAodW5zaWduZWQpbmxpbmVzID4gcGFyZW50LT5oZWlnaHQgKSApCisJCXJldHVybiBOVUxMOworCWNoaWxkLT5vcmlfeSA9IHBhcmVudC0+b3JpX3kgKyBiZWdpbl95OworCWNoaWxkLT5vcmlfeCA9IHBhcmVudC0+b3JpX3ggKyBiZWdpbl94OworCWNoaWxkLT5oZWlnaHQgPSBubGluZXM7CisJY2hpbGQtPndpZHRoID0gbmNvbHM7CisJY2hpbGQtPnBhcmVudCA9IHBhcmVudDsKKwljaGlsZC0+c2NyID0gcGFyZW50LT5zY3I7CisJcmV0dXJuIGNoaWxkOworfQorCisvKioKKyAqIENyZWF0ZSBhIGR1cGxpY2F0ZSBvZiB0aGUgc3BlY2lmaWVkIHdpbmRvdworICoKKyAqIEB2IG9yaWcJb3JpZ2luYWwgd2luZG93CisgKiBAcmV0IHB0cglwb2ludGVyIHRvIGR1cGxpY2F0ZSB3aW5kb3cKKyAqLworV0lORE9XICpkdXB3aW4gKCBXSU5ET1cgKm9yaWcgKSB7CisJV0lORE9XICpjb3B5OworCWlmICggb3JpZyA9PSBOVUxMICkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCAoIGNvcHkgPSBtYWxsb2MoIHNpemVvZiggV0lORE9XICkgKSApID09IE5VTEwgKQorCQlyZXR1cm4gTlVMTDsKKwljb3B5LT5zY3IgPSBvcmlnLT5zY3I7CisJY29weS0+YXR0cnMgPSBvcmlnLT5hdHRyczsKKwljb3B5LT5vcmlfeSA9IG9yaWctPm9yaV95OworCWNvcHktPm9yaV94ID0gb3JpZy0+b3JpX3g7CisJY29weS0+Y3Vyc195ID0gb3JpZy0+Y3Vyc195OworCWNvcHktPmN1cnNfeCA9IG9yaWctPmN1cnNfeDsKKwljb3B5LT5oZWlnaHQgPSBvcmlnLT5oZWlnaHQ7CisJY29weS0+d2lkdGggPSBvcmlnLT53aWR0aDsKKwlyZXR1cm4gY29weTsKK30KKworLyoqCisgKiBNb3ZlIHdpbmRvdyBvcmlnaW4gdG8gc3BlY2lmaWVkIGNvb3JkaW5hdGVzCisgKgorICogQHYgKndpbgl3aW5kb3cgdG8gbW92ZQorICogQHYgeQkJWSBwb3NpdGlvbgorICogQHYgeAkJWCBwb3NpdGlvbgorICogQHJldCByYwlyZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IG12d2luICggV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCApIHsKKwlpZiAoIHdpbiA9PSBOVUxMICkKKwkJcmV0dXJuIEVSUjsKKwlpZiAoICggKCAodW5zaWduZWQpeSArIHdpbi0+aGVpZ2h0ICkgPiBMSU5FUyApIHx8CisJICAgICAoICggKHVuc2lnbmVkKXggKyB3aW4tPndpZHRoICkgPiBDT0xTICkgKQorCQlyZXR1cm4gRVJSOworCisJd2luLT5vcmlfeSA9IHk7CisJd2luLT5vcmlfeCA9IHg7CisKKwlyZXR1cm4gT0s7Cit9CisKKy8qKgorICogQ3JlYXRlIG5ldyBXSU5ET1cKKyAqCisgKiBAdiBubGluZXMJbnVtYmVyIG9mIGxpbmVzCisgKiBAdiBuY29scwludW1iZXIgb2YgY29sdW1ucworICogQHYgYmVnaW5feQljb2x1bW4gb3JpZ2luCisgKiBAdiBiZWdpbl94CWxpbmUgb3JpZ2luCisgKiBAcmV0ICp3aW4JcmV0dXJuIHBvaW50ZXIgdG8gbmV3IHdpbmRvdworICovCitXSU5ET1cgKm5ld3dpbiAoIGludCBubGluZXMsIGludCBuY29scywgaW50IGJlZ2luX3ksIGludCBiZWdpbl94ICkgeworCVdJTkRPVyAqd2luOworCWlmICggKCB3aW4gPSBtYWxsb2MoIHNpemVvZihXSU5ET1cpICkgKSA9PSBOVUxMICkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCAoICh1bnNpZ25lZCkoIGJlZ2luX3kgKyBubGluZXMgKSA+IHN0ZHNjci0+aGVpZ2h0ICkgJiYKKwkgICAgICggKHVuc2lnbmVkKSggYmVnaW5feCArIG5jb2xzICkgPiBzdGRzY3ItPndpZHRoICkgKQorCQlyZXR1cm4gTlVMTDsKKwl3aW4tPm9yaV95ID0gYmVnaW5feTsKKwl3aW4tPm9yaV94ID0gYmVnaW5feDsKKwl3aW4tPmhlaWdodCA9IG5saW5lczsKKwl3aW4tPndpZHRoID0gbmNvbHM7CisJd2luLT5zY3IgPSBzdGRzY3ItPnNjcjsKKwl3aW4tPnBhcmVudCA9IHN0ZHNjcjsKKwlyZXR1cm4gd2luOworfQorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBzdWItd2luZG93CisgKgorICogQHYgb3JpZwlwYXJlbnQgd2luZG93CisgKiBAdiBubGluZXMJd2luZG93IGhlaWdodAorICogQHYgbmNvbHMJd2luZG93IHdpZHRoCisgKiBAdiBiZWdpbl95CXdpbmRvdyB5IG9yaWdpbiAoYWJzb2x1dGUpCisgKiBAdiBiZWdpbl94CXdpbmRvdyB4IG9yaWdpbiAoYWJzb2x1dGUpCisgKiBAcmV0IHB0cglyZXR1cm4gcG9pbnRlciB0byBjaGlsZCB3aW5kb3cKKyAqLworV0lORE9XICpzdWJ3aW4gKCBXSU5ET1cgKnBhcmVudCwgaW50IG5saW5lcywgaW50IG5jb2xzLAorCQkJICAgICAgICAgaW50IGJlZ2luX3ksIGludCBiZWdpbl94ICkgeworCVdJTkRPVyAqY2hpbGQ7CisJaWYgKCBwYXJlbnQgPT0gTlVMTCApCisJCXJldHVybiBOVUxMOworCWlmICggKCBjaGlsZCA9IG1hbGxvYyggc2l6ZW9mKCBXSU5ET1cgKSApICkgPT0gTlVMTCApCisJCXJldHVybiBOVUxMOworCWNoaWxkID0gbmV3d2luKCBubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94ICk7CisJY2hpbGQtPnBhcmVudCA9IHBhcmVudDsKKwljaGlsZC0+c2NyID0gcGFyZW50LT5zY3I7CisJcmV0dXJuIGNoaWxkOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL211Y3Vyc2VzL3dpbmluaXQuYyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy93aW5pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyZTdiNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS9tdWN1cnNlcy93aW5pbml0LmMKQEAgLTAsMCArMSwzNyBAQAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGN1cnNlcy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBNdUN1cnNlcyBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEluaXRpYWxpc2UgY29uc29sZSBlbnZpcm9ubWVudAorICoKKyAqIEByZXQgKndpbglyZXR1cm4gcG9pbnRlciB0byBzdGRzY3IKKyAqLworV0lORE9XICppbml0c2NyICggdm9pZCApIHsKKwkvKiBkZXRlcm1pbmUgY29uc29sZSBzaXplICovCisJLyogaW5pdGlhbGlzZSBzY3JlZW4gKi8KKwlzdGRzY3ItPnNjci0+aW5pdCggc3Rkc2NyLT5zY3IgKTsKKwlzdGRzY3ItPmhlaWdodCA9IExJTkVTOworCXN0ZHNjci0+d2lkdGggPSBDT0xTOworCW1vdmUgKCAwLCAwICk7CisJcmV0dXJuIHN0ZHNjcjsKK30KKworLyoqCisgKiBGaW5hbGlzZSBjb25zb2xlIGVudmlyb25tZW50CisgKgorICovCitpbnQgZW5kd2luICggdm9pZCApIHsKKwlhdHRyc2V0ICggMCApOworCWNvbG9yX3NldCAoIDAsIE5VTEwgKTsKKwltdnByaW50dyAoICggTElORVMgLSAxICksIDAsICJcbiIgKTsKKwlzdGRzY3ItPnNjci0+ZXhpdCggc3Rkc2NyLT5zY3IgKTsKKwlyZXR1cm4gT0s7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvcmVhZGxpbmUuYyBiL2dweGUvc3JjL2hjaS9yZWFkbGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Njk5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvcmVhZGxpbmUuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGdweGUva2V5cy5oPgorI2luY2x1ZGUgPGdweGUvZWRpdHN0cmluZy5oPgorI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE1pbmltYWwgcmVhZGxpbmUKKyAqCisgKi8KKworI2RlZmluZSBSRUFETElORV9NQVggMjU2CisKK3N0YXRpYyB2b2lkIHN5bmNfY29uc29sZSAoIHN0cnVjdCBlZGl0X3N0cmluZyAqc3RyaW5nICkgX19ub25udWxsOworCisvKioKKyAqIFN5bmNocm9uaXNlIGNvbnNvbGUgd2l0aCBlZGl0ZWQgc3RyaW5nCisgKgorICogQHYgc3RyaW5nCQlFZGl0YWJsZSBzdHJpbmcKKyAqLworc3RhdGljIHZvaWQgc3luY19jb25zb2xlICggc3RydWN0IGVkaXRfc3RyaW5nICpzdHJpbmcgKSB7CisJdW5zaWduZWQgaW50IG1vZF9zdGFydCA9IHN0cmluZy0+bW9kX3N0YXJ0OworCXVuc2lnbmVkIGludCBtb2RfZW5kID0gc3RyaW5nLT5tb2RfZW5kOworCXVuc2lnbmVkIGludCBjdXJzb3IgPSBzdHJpbmctPmxhc3RfY3Vyc29yOworCXNpemVfdCBsZW4gPSBzdHJsZW4gKCBzdHJpbmctPmJ1ZiApOworCisJLyogRXhwYW5kIHJlZ2lvbiBiYWNrIHRvIG9sZCBjdXJzb3IgcG9zaXRpb24gaWYgYXBwbGljYWJsZSAqLworCWlmICggbW9kX3N0YXJ0ID4gc3RyaW5nLT5sYXN0X2N1cnNvciApCisJCW1vZF9zdGFydCA9IHN0cmluZy0+bGFzdF9jdXJzb3I7CisKKwkvKiBFeHBhbmQgcmVnaW9uIGZvcndhcmQgdG8gbmV3IGN1cnNvciBwb3NpdGlvbiBpZiBhcHBsaWNhYmxlICovCisJaWYgKCBtb2RfZW5kIDwgc3RyaW5nLT5jdXJzb3IgKQorCQltb2RfZW5kID0gc3RyaW5nLT5jdXJzb3I7CisKKwkvKiBCYWNrc3BhY2UgdG8gc3RhcnQgb2YgcmVnaW9uICovCisJd2hpbGUgKCBjdXJzb3IgPiBtb2Rfc3RhcnQgKSB7CisJCXB1dGNoYXIgKCAnXGInICk7CisJCWN1cnNvci0tOworCX0KKworCS8qIFByaW50IG1vZGlmaWVkIHJlZ2lvbiAqLworCXdoaWxlICggY3Vyc29yIDwgbW9kX2VuZCApIHsKKwkJcHV0Y2hhciAoICggY3Vyc29yID49IGxlbiApID8gJyAnIDogc3RyaW5nLT5idWZbY3Vyc29yXSApOworCQljdXJzb3IrKzsKKwl9CisKKwkvKiBCYWNrc3BhY2UgdG8gbmV3IGN1cnNvciBwb3NpdGlvbiAqLworCXdoaWxlICggY3Vyc29yID4gc3RyaW5nLT5jdXJzb3IgKSB7CisJCXB1dGNoYXIgKCAnXGInICk7CisJCWN1cnNvci0tOworCX0KK30KKworLyoqCisgKiBSZWFkIGxpbmUgZnJvbSBjb25zb2xlCisgKgorICogQHYgcHJvbXB0CQlQcm9tcHQgc3RyaW5nCisgKiBAcmV0IGxpbmUJCUxpbmUgcmVhZCBmcm9tIGNvbnNvbGUgKGV4Y2x1ZGluZyB0ZXJtaW5hdGluZyBuZXdsaW5lKQorICoKKyAqIFRoZSByZXR1cm5lZCBsaW5lIGlzIGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpOyB0aGUgY2FsbGVyIG11c3QKKyAqIGV2ZW50dWFsbHkgY2FsbCBmcmVlKCkgdG8gcmVsZWFzZSB0aGUgc3RvcmFnZS4KKyAqLworY2hhciAqIHJlYWRsaW5lICggY29uc3QgY2hhciAqcHJvbXB0ICkgeworCWNoYXIgYnVmW1JFQURMSU5FX01BWF07CisJc3RydWN0IGVkaXRfc3RyaW5nIHN0cmluZzsKKwlpbnQga2V5OworCWNoYXIgKmxpbmU7CisKKwlpZiAoIHByb21wdCApCisJCXByaW50ZiAoICIlcyIsIHByb21wdCApOworCisJbWVtc2V0ICggJnN0cmluZywgMCwgc2l6ZW9mICggc3RyaW5nICkgKTsKKwlzdHJpbmcuYnVmID0gYnVmOworCXN0cmluZy5sZW4gPSBzaXplb2YgKCBidWYgKTsKKwlidWZbMF0gPSAnXDAnOworCisJd2hpbGUgKCAxICkgeworCQlrZXkgPSBlZGl0X3N0cmluZyAoICZzdHJpbmcsIGdldGtleSgpICk7CisJCXN5bmNfY29uc29sZSAoICZzdHJpbmcgKTsKKwkJc3dpdGNoICgga2V5ICkgeworCQljYXNlIENSOgorCQljYXNlIExGOgorCQkJcHV0Y2hhciAoICdcbicgKTsKKwkJCWxpbmUgPSBzdHJkdXAgKCBidWYgKTsKKwkJCWlmICggISBsaW5lICkKKwkJCQlwcmludGYgKCAiT3V0IG9mIG1lbW9yeVxuIiApOworCQkJcmV0dXJuIGxpbmU7CisJCWNhc2UgQ1RSTF9DOgorCQkJcHV0Y2hhciAoICdcbicgKTsKKwkJCXJldHVybiBOVUxMOworCQlkZWZhdWx0OgorCQkJLyogRG8gbm90aGluZyAqLworCQkJYnJlYWs7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvc2hlbGwuYyBiL2dweGUvc3JjL2hjaS9zaGVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZWRiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvc2hlbGwuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKyNpbmNsdWRlIDxncHhlL2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxncHhlL3NoZWxsLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE1pbmltYWwgY29tbWFuZCBzaGVsbAorICoKKyAqLworCisvKiogVGhlIHNoZWxsIHByb21wdCBzdHJpbmcgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHNoZWxsX3Byb21wdFtdID0gImdQWEU+ICI7CisKKy8qKiBGbGFnIHNldCBpbiBvcmRlciB0byBleGl0IHNoZWxsICovCitzdGF0aWMgaW50IGV4aXRfZmxhZyA9IDA7CisKKy8qKiAiZXhpdCIgY29tbWFuZCBib2R5ICovCitzdGF0aWMgaW50IGV4aXRfZXhlYyAoIGludCBhcmdjLCBjaGFyICoqYXJndiBfX3VudXNlZCApIHsKKworCWlmICggYXJnYyA9PSAxICkgeworCQlleGl0X2ZsYWcgPSAxOworCX0gZWxzZSB7CisJCXByaW50ZiAoICJVc2FnZTogZXhpdFxuIgorCQkJICJFeGl0cyB0aGUgY29tbWFuZCBzaGVsbFxuIiApOworCX0KKworCXJldHVybiAwOworfQorCisvKiogImV4aXQiIGNvbW1hbmQgZGVmaW5pdGlvbiAqLworc3RydWN0IGNvbW1hbmQgZXhpdF9jb21tYW5kIF9fY29tbWFuZCA9IHsKKwkubmFtZSA9ICJleGl0IiwKKwkuZXhlYyA9IGV4aXRfZXhlYywKK307CisKKy8qKiAiaGVscCIgY29tbWFuZCBib2R5ICovCitzdGF0aWMgaW50IGhlbHBfZXhlYyAoIGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndiBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZDsKKwl1bnNpZ25lZCBpbnQgaHBvcyA9IDA7CisKKwlwcmludGYgKCAiXG5BdmFpbGFibGUgY29tbWFuZHM6XG5cbiIgKTsKKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIGNvbW1hbmQsIENPTU1BTkRTICkgeworCQlocG9zICs9IHByaW50ZiAoICIgICVzIiwgY29tbWFuZC0+bmFtZSApOworCQlpZiAoIGhwb3MgPiAoIDE2ICogNCApICkgeworCQkJcHJpbnRmICggIlxuIiApOworCQkJaHBvcyA9IDA7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoIGhwb3MgJSAxNiApIHsKKwkJCQlwcmludGYgKCAiICIgKTsKKwkJCQlocG9zKys7CisJCQl9CisJCX0KKwl9CisJcHJpbnRmICggIlxuXG5UeXBlIFwiPGNvbW1hbmQ+IC0taGVscFwiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uXG5cbiIgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqICJoZWxwIiBjb21tYW5kIGRlZmluaXRpb24gKi8KK3N0cnVjdCBjb21tYW5kIGhlbHBfY29tbWFuZCBfX2NvbW1hbmQgPSB7CisJLm5hbWUgPSAiaGVscCIsCisJLmV4ZWMgPSBoZWxwX2V4ZWMsCit9OworCisvKioKKyAqIFN0YXJ0IGNvbW1hbmQgc2hlbGwKKyAqCisgKi8KK3ZvaWQgc2hlbGwgKCB2b2lkICkgeworCWNoYXIgKmxpbmU7CisKKwlleGl0X2ZsYWcgPSAwOworCXdoaWxlICggISBleGl0X2ZsYWcgKSB7CisJCWxpbmUgPSByZWFkbGluZSAoIHNoZWxsX3Byb21wdCApOworCQlpZiAoIGxpbmUgKSB7CisJCQlzeXN0ZW0gKCBsaW5lICk7CisJCQlmcmVlICggbGluZSApOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL3NoZWxsX2Jhbm5lci5jIGIvZ3B4ZS9zcmMvaGNpL3NoZWxsX2Jhbm5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MmUwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvc2hlbGxfYmFubmVyLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGNvbmZpZy9nZW5lcmFsLmg+CisjaW5jbHVkZSA8Z3B4ZS9rZXlzLmg+CisjaW5jbHVkZSA8Z3B4ZS9zaGVsbF9iYW5uZXIuaD4KKworLyoqIEBmaWxlCisgKgorICogU2hlbGwgc3RhcnR1cCBiYW5uZXIKKyAqCisgKi8KKworLyoqCisgKiBQcmludCBzaGVsbCBiYW5uZXIgYW5kIHByb21wdCBmb3Igc2hlbGwgZW50cnkKKyAqCisgKiBAcmV0CWVudGVyX3NoZWxsCQlVc2VyIHdhbnRzIHRvIGVudGVyIHNoZWxsCisgKi8KK2ludCBzaGVsbF9iYW5uZXIgKCB2b2lkICkgeworCWludCBlbnRlcl9zaGVsbCA9IDA7CisJaW50IHdhaXRfY291bnQ7CisJaW50IGtleTsKKworCWlmICggQkFOTkVSX1RJTUVPVVQgPD0gMCApCisJCXJldHVybiBlbnRlcl9zaGVsbDsKKworCXByaW50ZiAoICJcblByZXNzIEN0cmwtQiBmb3IgdGhlIGdQWEUgY29tbWFuZCBsaW5lLi4uIiApOworCisJLyogV2FpdCBmb3Iga2V5ICovCisJZm9yICggd2FpdF9jb3VudCA9IDAgOyB3YWl0X2NvdW50IDwgQkFOTkVSX1RJTUVPVVQgOyB3YWl0X2NvdW50KysgKSB7CisJCWlmICggaXNrZXkoKSApIHsKKwkJCWtleSA9IGdldGNoYXIoKTsKKwkJCWlmICgga2V5ID09IENUUkxfQiApCisJCQkJZW50ZXJfc2hlbGwgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJbWRlbGF5KDEwMCk7CisJfQorCisJLyogQ2xlYXIgdGhlICJQcmVzcyBDdHJsLUIiIGxpbmUgKi8KKwlwcmludGYgKCAiXHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyIiApOworCisJcmV0dXJuIGVudGVyX3NoZWxsOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL3N0cmVycm9yLmMgYi9ncHhlL3NyYy9oY2kvc3RyZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU0N2RkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL3N0cmVycm9yLmMKQEAgLTAsMCArMSwxMjIgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z3B4ZS9lcnJvcnRhYi5oPgorCisvKiogQGZpbGUKKyAqCisgKiBFcnJvciBkZXNjcmlwdGlvbnMuCisgKgorICogVGhlIGVycm9yIG51bWJlcnMgdXNlZCBieSBFdGhlcmJvb3QgYXJlIGEgc3VwZXJzZXQgb2YgdGhvc2UgZGVmaW5lZAorICogYnkgdGhlIFBYRSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMi4xLiAgU2VlIGVycm5vLmggZm9yIGEgbGlzdGluZyBvZgorICogdGhlIGVycm9yIHZhbHVlcy4KKyAqCisgKiBUbyBzYXZlIHNwYWNlIGluIFJPTSBpbWFnZXMsIGVycm9yIHN0cmluZyB0YWJsZXMgYXJlIG9wdGlvbmFsLiAgVXNlCisgKiB0aGUgRVJST1JNU0dfWFhYIG9wdGlvbnMgaW4gY29uZmlnLmggdG8gc2VsZWN0IHdoaWNoIGVycm9yIHN0cmluZworICogdGFibGVzIHlvdSB3YW50IHRvIGluY2x1ZGUuICBJZiBhbiBlcnJvciBzdHJpbmcgdGFibGUgaXMgb21pdHRlZCwKKyAqIHN0cmVycm9yKCkgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSB0ZXh0ICJFcnJvciAweDxlcnJubz4iLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogRmluZCBlcnJvciBkZXNjcmlwdGlvbgorICoKKyAqIEB2IGVycm5vCQlFcnJvciBudW1iZXIKKyAqIEByZXQgZXJyb3J0YWIJRXJyb3IgZGVzY3JpcHRpb24sIG9yIE5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBlcnJvcnRhYiAqIGZpbmRfZXJyb3IgKCBpbnQgZXJybm8gKSB7CisJc3RydWN0IGVycm9ydGFiICplcnJvcnRhYjsKKworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggZXJyb3J0YWIsIEVSUk9SVEFCICkgeworCQlpZiAoIGVycm9ydGFiLT5lcnJubyA9PSBlcnJubyApCisJCQlyZXR1cm4gZXJyb3J0YWI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRmluZCBjbG9zZXN0IGVycm9yIGRlc2NyaXB0aW9uCisgKgorICogQHYgZXJybm8JCUVycm9yIG51bWJlcgorICogQHJldCBlcnJvcnRhYglFcnJvciBkZXNjcmlwdGlvbiwgb3IgTlVMTAorICoKKyAqIAorICovCitzdGF0aWMgc3RydWN0IGVycm9ydGFiICogZmluZF9jbG9zZXN0X2Vycm9yICggaW50IGVycm5vICkgeworCXN0cnVjdCBlcnJvcnRhYiAqZXJyb3J0YWI7CisKKwkvKiBGaXJzdCwgbG9vayBmb3IgYW4gZXhhY3QgbWF0Y2ggKi8KKwlpZiAoICggZXJyb3J0YWIgPSBmaW5kX2Vycm9yICggZXJybm8gKSApICE9IE5VTEwgKQorCQlyZXR1cm4gZXJyb3J0YWI7CisKKwkvKiBTZWNvbmQsIHRyeSBtYXNraW5nIG9mZiB0aGUgZ1BYRS1zcGVjaWZpYyBiaXQgYW5kIHNlZWluZyBpZgorCSAqIHdlIGhhdmUgYW4gZW50cnkgZm9yIHRoZSBnZW5lcmljIFBPU0lYIGVycm9yIG1lc3NhZ2UuCisJICovCisJaWYgKCAoIGVycm9ydGFiID0gZmluZF9lcnJvciAoIGVycm5vICYgMHg3ZjAwMDBmZiApICkgIT0gTlVMTCApCisJCXJldHVybiBlcnJvcnRhYjsKKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIFJldHJpZXZlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlcnJvciBudW1iZXIuCisgKgorICogQHYgZXJybm8vcmMJCUVycm9yIG51bWJlciBvciByZXR1cm4gc3RhdHVzIGNvZGUKKyAqIEByZXQgc3RyZXJyb3IJUG9pbnRlciB0byBlcnJvciB0ZXh0CisgKgorICogSWYgdGhlIGVycm9yIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlua2VkLWluIGVycm9yIHRhYmxlcywgZ2VuZXJhdGVzCisgKiBhIGdlbmVyaWMgIkVycm9yIDB4PGVycm5vPiIgbWVzc2FnZS4KKyAqCisgKiBUaGUgcG9pbnRlciByZXR1cm5lZCBieSBzdHJlcnJvcigpIGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIG5leHQKKyAqIGNhbGwgdG8gc3RyZXJyb3IoKS4KKyAqCisgKi8KK2NvbnN0IGNoYXIgKiBzdHJlcnJvciAoIGludCBlcnJubyApIHsKKwlzdGF0aWMgY2hhciBlcnJidWZbNjRdOworCXN0cnVjdCBlcnJvcnRhYiAqZXJyb3J0YWI7CisKKwkvKiBBbGxvdyBmb3Igc3RyZXJyb3IocmMpIGFzIHdlbGwgYXMgc3RyZXJyb3IoZXJybm8pICovCisJaWYgKCBlcnJubyA8IDAgKQorCQllcnJubyA9IC1lcnJubzsKKworCS8qIEZpbmQgdGhlIGVycm9yIGRlc2NyaXB0aW9uLCBpZiBvbmUgZXhpc3RzICovCisJZXJyb3J0YWIgPSBmaW5kX2Nsb3Nlc3RfZXJyb3IgKCBlcnJubyApOworCisJLyogQ29uc3RydWN0IHRoZSBlcnJvciBtZXNzYWdlICovCisJaWYgKCBlcnJvcnRhYiApIHsKKwkJc25wcmludGYgKCBlcnJidWYsIHNpemVvZiAoIGVycmJ1ZiApLCAiJXMgKCUjMDh4KSIsCisJCQkgICBlcnJvcnRhYi0+dGV4dCwgZXJybm8gKTsKKwl9IGVsc2UgeworCQlzbnByaW50ZiAoIGVycmJ1Ziwgc2l6ZW9mICggZXJyYnVmICksICJFcnJvciAlIzA4eCIsIGVycm5vICk7CisJfQorCisJcmV0dXJuIGVycmJ1ZjsKK30KKworLyogRG8gbm90IGluY2x1ZGUgRVJSRklMRSBwb3J0aW9uIGluIHRoZSBudW1iZXJzIGluIHRoZSBlcnJvciB0YWJsZSAqLworI3VuZGVmIEVSUkZJTEUKKyNkZWZpbmUgRVJSRklMRSAwCisKKy8qKiBUaGUgbW9zdCBjb21tb24gZXJyb3JzICovCitzdHJ1Y3QgZXJyb3J0YWIgY29tbW9uX2Vycm9yc1tdIF9fZXJyb3J0YWIgPSB7CisJeyAwLCAiTm8gZXJyb3IiIH0sCisJeyBFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIgfSwKKwl7IEVDQU5DRUxFRCwgIk9wZXJhdGlvbiBjYW5jZWxsZWQiIH0sCisJeyBFQ09OTlJFU0VULCAiQ29ubmVjdGlvbiByZXNldCIgfSwKKwl7IEVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiIH0sCisJeyBFSU8sICJJbnB1dC9vdXRwdXQgZXJyb3IiIH0sCisJeyBFTkVUVU5SRUFDSCwgIk5ldHdvcmsgdW5yZWFjaGFibGUiIH0sCisJeyBFTk9ERVYsICJObyBzdWNoIGRldmljZSIgfSwKKwl7IEVOT0VOVCwgIkZpbGUgbm90IGZvdW5kIiB9LAorCXsgRU5PRVhFQywgIk5vdCBhbiBleGVjdXRhYmxlIGltYWdlIiB9LAorCXsgRU5PTUVNLCAiT3V0IG9mIG1lbW9yeSIgfSwKKwl7IEVOT1NQQywgIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIiB9LAorCXsgRU5PVENPTk4sICJOb3QgY29ubmVjdGVkIiB9LAorCXsgRU5PVFNVUCwgIk5vdCBzdXBwb3J0ZWQiIH0sCisJeyBFUEVSTSwgIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkIiB9LAorCXsgRVJBTkdFLCAiT3V0IG9mIHJhbmdlIiB9LAorCXsgRVRJTUVET1VULCAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiIH0sCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaGNpL3R1aS9sb2dpbl91aS5jIGIvZ3B4ZS9zcmMvaGNpL3R1aS9sb2dpbl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MGJmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9oY2kvdHVpL2xvZ2luX3VpLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKiBAZmlsZQorICoKKyAqIExvZ2luIFVJCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN1cnNlcy5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxncHhlL3NldHRpbmdzLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZGl0Ym94Lmg+CisjaW5jbHVkZSA8Z3B4ZS9rZXlzLmg+CisjaW5jbHVkZSA8Z3B4ZS9sb2dpbl91aS5oPgorCisvKiBDb2xvdXIgcGFpcnMgKi8KKyNkZWZpbmUgQ1BBSVJfTk9STUFMCQkxCisjZGVmaW5lIENQQUlSX0xBQkVMCQkyCisjZGVmaW5lIENQQUlSX0VESVRCT1gJCTMKKworLyogU2NyZWVuIGxheW91dCAqLworI2RlZmluZSBVU0VSTkFNRV9MQUJFTF9ST1cJOAorI2RlZmluZSBVU0VSTkFNRV9ST1cJCTEwCisjZGVmaW5lIFBBU1NXT1JEX0xBQkVMX1JPVwkxNAorI2RlZmluZSBQQVNTV09SRF9ST1cJCTE2CisjZGVmaW5lIExBQkVMX0NPTAkJMzYKKyNkZWZpbmUgRURJVEJPWF9DT0wJCTMwCisjZGVmaW5lIEVESVRCT1hfV0lEVEgJCTIwCisKK2ludCBsb2dpbl91aSAoIHZvaWQgKSB7CisJY2hhciB1c2VybmFtZVs2NF07CisJY2hhciBwYXNzd29yZFs2NF07CisJc3RydWN0IGVkaXRfYm94IHVzZXJuYW1lX2JveDsKKwlzdHJ1Y3QgZWRpdF9ib3ggcGFzc3dvcmRfYm94OworCXN0cnVjdCBlZGl0X2JveCAqY3VycmVudF9ib3ggPSAmdXNlcm5hbWVfYm94OworCWludCBrZXk7CisJaW50IHJjID0gLUVJTlBST0dSRVNTOworCisJLyogRmV0Y2ggY3VycmVudCBzZXR0aW5nIHZhbHVlcyAqLworCWZldGNoX3N0cmluZ19zZXR0aW5nICggTlVMTCwgJnVzZXJuYW1lX3NldHRpbmcsIHVzZXJuYW1lLAorCQkJICAgICAgIHNpemVvZiAoIHVzZXJuYW1lICkgKTsKKwlmZXRjaF9zdHJpbmdfc2V0dGluZyAoIE5VTEwsICZwYXNzd29yZF9zZXR0aW5nLCBwYXNzd29yZCwKKwkJCSAgICAgICBzaXplb2YgKCBwYXNzd29yZCApICk7CisKKwkvKiBJbml0aWFsaXNlIFVJICovCisJaW5pdHNjcigpOworCXN0YXJ0X2NvbG9yKCk7CisJaW5pdF9wYWlyICggQ1BBSVJfTk9STUFMLCBDT0xPUl9XSElURSwgQ09MT1JfQkxBQ0sgKTsKKwlpbml0X3BhaXIgKCBDUEFJUl9MQUJFTCwgQ09MT1JfV0hJVEUsIENPTE9SX0JMQUNLICk7CisJaW5pdF9wYWlyICggQ1BBSVJfRURJVEJPWCwgQ09MT1JfV0hJVEUsIENPTE9SX0JMVUUgKTsKKwlpbml0X2VkaXRib3ggKCAmdXNlcm5hbWVfYm94LCB1c2VybmFtZSwgc2l6ZW9mICggdXNlcm5hbWUgKSwgTlVMTCwKKwkJICAgICAgIFVTRVJOQU1FX1JPVywgRURJVEJPWF9DT0wsIEVESVRCT1hfV0lEVEgsIDAgKTsKKwlpbml0X2VkaXRib3ggKCAmcGFzc3dvcmRfYm94LCBwYXNzd29yZCwgc2l6ZW9mICggcGFzc3dvcmQgKSwgTlVMTCwKKwkJICAgICAgIFBBU1NXT1JEX1JPVywgRURJVEJPWF9DT0wsIEVESVRCT1hfV0lEVEgsCisJCSAgICAgICBFRElUQk9YX1NUQVJTICk7CisKKwkvKiBEcmF3IGluaXRpYWwgVUkgKi8KKwllcmFzZSgpOworCWNvbG9yX3NldCAoIENQQUlSX0xBQkVMLCBOVUxMICk7CisJbXZwcmludHcgKCBVU0VSTkFNRV9MQUJFTF9ST1csIExBQkVMX0NPTCwgIlVzZXJuYW1lOiIgKTsKKwltdnByaW50dyAoIFBBU1NXT1JEX0xBQkVMX1JPVywgTEFCRUxfQ09MLCAiUGFzc3dvcmQ6IiApOworCWNvbG9yX3NldCAoIENQQUlSX0VESVRCT1gsIE5VTEwgKTsKKwlkcmF3X2VkaXRib3ggKCAmdXNlcm5hbWVfYm94ICk7CisJZHJhd19lZGl0Ym94ICggJnBhc3N3b3JkX2JveCApOworCisJLyogTWFpbiBsb29wICovCisJd2hpbGUgKCByYyA9PSAtRUlOUFJPR1JFU1MgKSB7CisKKwkJZHJhd19lZGl0Ym94ICggY3VycmVudF9ib3ggKTsKKworCQlrZXkgPSBnZXRrZXkoKTsKKwkJc3dpdGNoICgga2V5ICkgeworCQljYXNlIEtFWV9ET1dOOgorCQkJY3VycmVudF9ib3ggPSAmcGFzc3dvcmRfYm94OworCQkJYnJlYWs7CisJCWNhc2UgS0VZX1VQOgorCQkJY3VycmVudF9ib3ggPSAmdXNlcm5hbWVfYm94OworCQkJYnJlYWs7CisJCWNhc2UgVEFCOgorCQkJY3VycmVudF9ib3ggPSAoICggY3VycmVudF9ib3ggPT0gJnVzZXJuYW1lX2JveCApID8KKwkJCQkJJnBhc3N3b3JkX2JveCA6ICZ1c2VybmFtZV9ib3ggKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9FTlRFUjoKKwkJCWlmICggY3VycmVudF9ib3ggPT0gJnVzZXJuYW1lX2JveCApIHsKKwkJCQljdXJyZW50X2JveCA9ICZwYXNzd29yZF9ib3g7CisJCQl9IGVsc2UgeworCQkJCXJjID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENUUkxfQzoKKwkJY2FzZSBFU0M6CisJCQlyYyA9IC1FQ0FOQ0VMRUQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVkaXRfZWRpdGJveCAoIGN1cnJlbnRfYm94LCBrZXkgKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVGVybWluYXRlIFVJICovCisJY29sb3Jfc2V0ICggQ1BBSVJfTk9STUFMLCBOVUxMICk7CisJZXJhc2UoKTsKKwllbmR3aW4oKTsKKworCWlmICggcmMgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIFN0b3JlIHNldHRpbmdzICovCisJaWYgKCAoIHJjID0gc3RvcmVfc2V0dGluZyAoIE5VTEwsICZ1c2VybmFtZV9zZXR0aW5nLCB1c2VybmFtZSwKKwkJCQkgICAgc3RybGVuICggdXNlcm5hbWUgKSApICkgIT0gMCApCisJCXJldHVybiByYzsKKwlpZiAoICggcmMgPSBzdG9yZV9zZXR0aW5nICggTlVMTCwgJnBhc3N3b3JkX3NldHRpbmcsIHBhc3N3b3JkLAorCQkJCSAgICBzdHJsZW4gKCBwYXNzd29yZCApICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9oY2kvdHVpL3NldHRpbmdzX3VpLmMgYi9ncHhlL3NyYy9oY2kvdHVpL3NldHRpbmdzX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjZTZhZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2hjaS90dWkvc2V0dGluZ3NfdWkuYwpAQCAtMCwwICsxLDQyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGdweGUvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxncHhlL2VkaXRib3guaD4KKyNpbmNsdWRlIDxncHhlL2tleXMuaD4KKyNpbmNsdWRlIDxncHhlL3NldHRpbmdzX3VpLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE9wdGlvbiBjb25maWd1cmF0aW9uIGNvbnNvbGUKKyAqCisgKi8KKworLyogQ29sb3VyIHBhaXJzICovCisjZGVmaW5lIENQQUlSX05PUk1BTAkxCisjZGVmaW5lIENQQUlSX1NFTEVDVAkyCisjZGVmaW5lIENQQUlSX0VESVQJMworI2RlZmluZSBDUEFJUl9BTEVSVAk0CisKKy8qIFNjcmVlbiBsYXlvdXQgKi8KKyNkZWZpbmUgVElUTEVfUk9XCQkxCisjZGVmaW5lIFNFVFRJTkdTX0xJU1RfUk9XCTMKKyNkZWZpbmUgU0VUVElOR1NfTElTVF9DT0wJMQorI2RlZmluZSBJTkZPX1JPVwkJMjAKKyNkZWZpbmUgQUxFUlRfUk9XCQkyMAorI2RlZmluZSBJTlNUUlVDVElPTl9ST1cJCTIyCisjZGVmaW5lIElOU1RSVUNUSU9OX1BBRCAiICAgICAiCisKKy8qKiBMYXlvdXQgb2YgdGV4dCB3aXRoaW4gYSBzZXR0aW5nIHdpZGdldCAqLworc3RydWN0IHNldHRpbmdfcm93IHsKKwljaGFyIHN0YXJ0WzBdOworCWNoYXIgcGFkMVsxXTsKKwljaGFyIG5hbWVbMTVdOworCWNoYXIgcGFkMlsxXTsKKwljaGFyIHZhbHVlWzYwXTsKKwljaGFyIHBhZDNbMV07CisJY2hhciBudWw7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBzZXR0aW5nIHdpZGdldCAqLworc3RydWN0IHNldHRpbmdfd2lkZ2V0IHsKKwkvKiogU2V0dGluZ3MgYmxvY2sgKi8KKwlzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzOworCS8qKiBDb25maWd1cmF0aW9uIHNldHRpbmcgKi8KKwlzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZzsKKwkvKiogU2NyZWVuIHJvdyAqLworCXVuc2lnbmVkIGludCByb3c7CisJLyoqIFNjcmVlbiBjb2x1bW4gKi8KKwl1bnNpZ25lZCBpbnQgY29sOworCS8qKiBFZGl0IGJveCB3aWRnZXQgdXNlZCBmb3IgZWRpdGluZyBzZXR0aW5nICovCisJc3RydWN0IGVkaXRfYm94IGVkaXRib3g7CisJLyoqIEVkaXRpbmcgaW4gcHJvZ3Jlc3MgZmxhZyAqLworCWludCBlZGl0aW5nOworCS8qKiBCdWZmZXIgZm9yIHNldHRpbmcncyB2YWx1ZSAqLworCWNoYXIgdmFsdWVbMjU2XTsgLyogZW5vdWdoIHNpemUgZm9yIGEgREhDUCBzdHJpbmcgKi8KK307CisKKy8qKiBOdW1iZXIgb2YgcmVnaXN0ZXJlZCBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisjZGVmaW5lIE5VTV9TRVRUSU5HUyB0YWJsZV9udW1fZW50cmllcyAoIFNFVFRJTkdTICkKKworc3RhdGljIHZvaWQgbG9hZF9zZXR0aW5nICggc3RydWN0IHNldHRpbmdfd2lkZ2V0ICp3aWRnZXQgKSBfX25vbm51bGw7CitzdGF0aWMgaW50IHNhdmVfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5nX3dpZGdldCAqd2lkZ2V0ICkgX19ub25udWxsOworc3RhdGljIHZvaWQgaW5pdF9zZXR0aW5nICggc3RydWN0IHNldHRpbmdfd2lkZ2V0ICp3aWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sICkgX19ub25udWxsOworc3RhdGljIHZvaWQgZHJhd19zZXR0aW5nICggc3RydWN0IHNldHRpbmdfd2lkZ2V0ICp3aWRnZXQgKSBfX25vbm51bGw7CitzdGF0aWMgaW50IGVkaXRfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5nX3dpZGdldCAqd2lkZ2V0LCBpbnQga2V5ICkgX19ub25udWxsOworc3RhdGljIHZvaWQgaW5pdF9zZXR0aW5nX2luZGV4ICggc3RydWN0IHNldHRpbmdfd2lkZ2V0ICp3aWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGV4ICkgX19ub25udWxsOworc3RhdGljIHZvaWQgdm1zZyAoIHVuc2lnbmVkIGludCByb3csIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkgX19ub25udWxsOworc3RhdGljIHZvaWQgbXNnICggdW5zaWduZWQgaW50IHJvdywgY29uc3QgY2hhciAqZm10LCAuLi4gKSBfX25vbm51bGw7CitzdGF0aWMgdm9pZCB2YWxlcnQgKCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyApIF9fbm9ubnVsbDsKK3N0YXRpYyB2b2lkIGFsZXJ0ICggY29uc3QgY2hhciAqZm10LCAuLi4gKSBfX25vbm51bGw7CitzdGF0aWMgdm9pZCBkcmF3X2luZm9fcm93ICggc3RydWN0IHNldHRpbmcgKnNldHRpbmcgKSBfX25vbm51bGw7CitzdGF0aWMgaW50IG1haW5fbG9vcCAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MgKSBfX25vbm51bGw7CisKKy8qKgorICogTG9hZCBzZXR0aW5nIHdpZGdldCB2YWx1ZSBmcm9tIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKKyAqCisgKiBAdiB3aWRnZXQJCVNldHRpbmcgd2lkZ2V0CisgKgorICovCitzdGF0aWMgdm9pZCBsb2FkX3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ193aWRnZXQgKndpZGdldCApIHsKKworCS8qIE1hcmsgYXMgbm90IGVkaXRpbmcgKi8KKwl3aWRnZXQtPmVkaXRpbmcgPSAwOworCisJLyogUmVhZCBjdXJyZW50IHNldHRpbmcgdmFsdWUgKi8KKwlpZiAoIGZldGNoZl9zZXR0aW5nICggd2lkZ2V0LT5zZXR0aW5ncywgd2lkZ2V0LT5zZXR0aW5nLAorCQkJICAgICAgd2lkZ2V0LT52YWx1ZSwgc2l6ZW9mICggd2lkZ2V0LT52YWx1ZSApICkgPCAwICkgeworCQl3aWRnZXQtPnZhbHVlWzBdID0gJ1wwJzsKKwl9CQorCisJLyogSW5pdGlhbGlzZSBlZGl0IGJveCAqLworCWluaXRfZWRpdGJveCAoICZ3aWRnZXQtPmVkaXRib3gsIHdpZGdldC0+dmFsdWUsCisJCSAgICAgICBzaXplb2YgKCB3aWRnZXQtPnZhbHVlICksIE5VTEwsIHdpZGdldC0+cm93LAorCQkgICAgICAgKCB3aWRnZXQtPmNvbCArIG9mZnNldG9mICggc3RydWN0IHNldHRpbmdfcm93LCB2YWx1ZSApKSwKKwkJICAgICAgIHNpemVvZiAoICggKCBzdHJ1Y3Qgc2V0dGluZ19yb3cgKiApIE5VTEwgKS0+dmFsdWUgKSwgMCk7Cit9CisKKy8qKgorICogU2F2ZSBzZXR0aW5nIHdpZGdldCB2YWx1ZSBiYWNrIHRvIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKKyAqCisgKiBAdiB3aWRnZXQJCVNldHRpbmcgd2lkZ2V0CisgKi8KK3N0YXRpYyBpbnQgc2F2ZV9zZXR0aW5nICggc3RydWN0IHNldHRpbmdfd2lkZ2V0ICp3aWRnZXQgKSB7CisJcmV0dXJuIHN0b3JlZl9zZXR0aW5nICggd2lkZ2V0LT5zZXR0aW5ncywgd2lkZ2V0LT5zZXR0aW5nLAorCQkJCXdpZGdldC0+dmFsdWUgKTsKK30KKworLyoqCisgKiBJbml0aWFsaXNlIHNldHRpbmcgd2lkZ2V0CisgKgorICogQHYgd2lkZ2V0CQlTZXR0aW5nIHdpZGdldAorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAdiBzZXR0aW5nCQlDb25maWd1cmF0aW9uIHNldHRpbmcKKyAqIEB2IHJvdwkJU2NyZWVuIHJvdworICogQHYgY29sCQlTY3JlZW4gY29sdW1uCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5nX3dpZGdldCAqd2lkZ2V0LAorCQkJICAgc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCSAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJICAgdW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCApIHsKKworCS8qIEluaXRpYWxpc2Ugd2lkZ2V0IHN0cnVjdHVyZSAqLworCW1lbXNldCAoIHdpZGdldCwgMCwgc2l6ZW9mICggKndpZGdldCApICk7CisJd2lkZ2V0LT5zZXR0aW5ncyA9IHNldHRpbmdzOworCXdpZGdldC0+c2V0dGluZyA9IHNldHRpbmc7CisJd2lkZ2V0LT5yb3cgPSByb3c7CisJd2lkZ2V0LT5jb2wgPSBjb2w7CisKKwkvKiBSZWFkIGN1cnJlbnQgc2V0dGluZyB2YWx1ZSAqLworCWxvYWRfc2V0dGluZyAoIHdpZGdldCApOworfQorCisvKioKKyAqIERyYXcgc2V0dGluZyB3aWRnZXQKKyAqCisgKiBAdiB3aWRnZXQJCVNldHRpbmcgd2lkZ2V0CisgKi8KK3N0YXRpYyB2b2lkIGRyYXdfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5nX3dpZGdldCAqd2lkZ2V0ICkgeworCXN0cnVjdCBzZXR0aW5nX3JvdyByb3c7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgY3Vyc19jb2w7CisJY2hhciAqdmFsdWU7CisKKwkvKiBGaWxsIHJvdyB3aXRoIHNwYWNlcyAqLworCW1lbXNldCAoICZyb3csICcgJywgc2l6ZW9mICggcm93ICkgKTsKKwlyb3cubnVsID0gJ1wwJzsKKworCS8qIENvbnN0cnVjdCBkb3QtcGFkZGVkIG5hbWUgKi8KKwltZW1zZXQgKCByb3cubmFtZSwgJy4nLCBzaXplb2YgKCByb3cubmFtZSApICk7CisJbGVuID0gc3RybGVuICggd2lkZ2V0LT5zZXR0aW5nLT5uYW1lICk7CisJaWYgKCBsZW4gPiBzaXplb2YgKCByb3cubmFtZSApICkKKwkJbGVuID0gc2l6ZW9mICggcm93Lm5hbWUgKTsKKwltZW1jcHkgKCByb3cubmFtZSwgd2lkZ2V0LT5zZXR0aW5nLT5uYW1lLCBsZW4gKTsKKworCS8qIENvbnN0cnVjdCBzcGFjZS1wYWRkZWQgdmFsdWUgKi8KKwl2YWx1ZSA9IHdpZGdldC0+dmFsdWU7CisJaWYgKCAhICp2YWx1ZSApCisJCXZhbHVlID0gIjxub3Qgc3BlY2lmaWVkPiI7CisJbGVuID0gc3RybGVuICggdmFsdWUgKTsKKwlpZiAoIGxlbiA+IHNpemVvZiAoIHJvdy52YWx1ZSApICkKKwkJbGVuID0gc2l6ZW9mICggcm93LnZhbHVlICk7CisJbWVtY3B5ICggcm93LnZhbHVlLCB2YWx1ZSwgbGVuICk7CisJY3Vyc19jb2wgPSAoIHdpZGdldC0+Y29sICsgb2Zmc2V0b2YgKCB0eXBlb2YgKCByb3cgKSwgdmFsdWUgKQorCQkgICAgICsgbGVuICk7CisKKwkvKiBQcmludCByb3cgKi8KKwltdnByaW50dyAoIHdpZGdldC0+cm93LCB3aWRnZXQtPmNvbCwgIiVzIiwgcm93LnN0YXJ0ICk7CisJbW92ZSAoIHdpZGdldC0+cm93LCBjdXJzX2NvbCApOworCWlmICggd2lkZ2V0LT5lZGl0aW5nICkKKwkJZHJhd19lZGl0Ym94ICggJndpZGdldC0+ZWRpdGJveCApOworfQorCisvKioKKyAqIEVkaXQgc2V0dGluZyB3aWRnZXQKKyAqCisgKiBAdiB3aWRnZXQJCVNldHRpbmcgd2lkZ2V0CisgKiBAdiBrZXkJCUtleSBwcmVzc2VkIGJ5IHVzZXIKKyAqIEByZXQga2V5CQlLZXkgcmV0dXJuZWQgdG8gYXBwbGljYXRpb24sIG9yIHplcm8KKyAqLworc3RhdGljIGludCBlZGl0X3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ193aWRnZXQgKndpZGdldCwgaW50IGtleSApIHsKKwl3aWRnZXQtPmVkaXRpbmcgPSAxOworCXJldHVybiBlZGl0X2VkaXRib3ggKCAmd2lkZ2V0LT5lZGl0Ym94LCBrZXkgKTsKK30KKworLyoqCisgKiBJbml0aWFsaXNlIHNldHRpbmcgd2lkZ2V0IGJ5IGluZGV4CisgKgorICogQHYgd2lkZ2V0CQlTZXR0aW5nIHdpZGdldAorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAdiBpbmRleAkJSW5kZXggb2Ygc2V0dGluZyB3aXRoIHNldHRpbmdzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgaW5pdF9zZXR0aW5nX2luZGV4ICggc3RydWN0IHNldHRpbmdfd2lkZ2V0ICp3aWRnZXQsCisJCQkJIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJIHVuc2lnbmVkIGludCBpbmRleCApIHsKKwlzdHJ1Y3Qgc2V0dGluZyAqYWxsX3NldHRpbmdzID0gdGFibGVfc3RhcnQgKCBTRVRUSU5HUyApOworCisJaW5pdF9zZXR0aW5nICggd2lkZ2V0LCBzZXR0aW5ncywgJmFsbF9zZXR0aW5nc1tpbmRleF0sCisJCSAgICAgICAoIFNFVFRJTkdTX0xJU1RfUk9XICsgaW5kZXggKSwgU0VUVElOR1NfTElTVF9DT0wgKTsKK30KKworLyoqCisgKiBQcmludCBtZXNzYWdlIGNlbnRyZWQgb24gc3BlY2lmaWVkIHJvdworICoKKyAqIEB2IHJvdwkJUm93CisgKiBAdiBmbXQJCXByaW50ZigpIGZvcm1hdCBzdHJpbmcKKyAqIEB2IGFyZ3MJCXByaW50ZigpIGFyZ3VtZW50IGxpc3QKKyAqLworc3RhdGljIHZvaWQgdm1zZyAoIHVuc2lnbmVkIGludCByb3csIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkgeworCWNoYXIgYnVmW0NPTFNdOworCXNpemVfdCBsZW47CisKKwlsZW4gPSB2c25wcmludGYgKCBidWYsIHNpemVvZiAoIGJ1ZiApLCBmbXQsIGFyZ3MgKTsKKwltdnByaW50dyAoIHJvdywgKCAoIENPTFMgLSBsZW4gKSAvIDIgKSwgIiVzIiwgYnVmICk7Cit9CisKKy8qKgorICogUHJpbnQgbWVzc2FnZSBjZW50cmVkIG9uIHNwZWNpZmllZCByb3cKKyAqCisgKiBAdiByb3cJCVJvdworICogQHYgZm10CQlwcmludGYoKSBmb3JtYXQgc3RyaW5nCisgKiBAdiAuLgkJcHJpbnRmKCkgYXJndW1lbnRzCisgKi8KK3N0YXRpYyB2b2lkIG1zZyAoIHVuc2lnbmVkIGludCByb3csIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkgeworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0ICggYXJncywgZm10ICk7CisJdm1zZyAoIHJvdywgZm10LCBhcmdzICk7CisJdmFfZW5kICggYXJncyApOworfQorCisvKioKKyAqIENsZWFyIG1lc3NhZ2Ugb24gc3BlY2lmaWVkIHJvdworICoKKyAqIEB2IHJvdwkJUm93CisgKi8KK3N0YXRpYyB2b2lkIGNsZWFybXNnICggdW5zaWduZWQgaW50IHJvdyApIHsKKwltb3ZlICggcm93LCAwICk7CisJY2xydG9lb2woKTsKK30KKworLyoqCisgKiBQcmludCBhbGVydCBtZXNzYWdlCisgKgorICogQHYgZm10CQlwcmludGYoKSBmb3JtYXQgc3RyaW5nCisgKiBAdiBhcmdzCQlwcmludGYoKSBhcmd1bWVudCBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIHZhbGVydCAoIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkgeworCWNsZWFybXNnICggQUxFUlRfUk9XICk7CisJY29sb3Jfc2V0ICggQ1BBSVJfQUxFUlQsIE5VTEwgKTsKKwl2bXNnICggQUxFUlRfUk9XLCBmbXQsIGFyZ3MgKTsKKwlzbGVlcCAoIDIgKTsKKwljb2xvcl9zZXQgKCBDUEFJUl9OT1JNQUwsIE5VTEwgKTsKKwljbGVhcm1zZyAoIEFMRVJUX1JPVyApOworfQorCisvKioKKyAqIFByaW50IGFsZXJ0IG1lc3NhZ2UKKyAqCisgKiBAdiBmbXQJCXByaW50ZigpIGZvcm1hdCBzdHJpbmcKKyAqIEB2IC4uLgkJcHJpbnRmKCkgYXJndW1lbnRzCisgKi8KK3N0YXRpYyB2b2lkIGFsZXJ0ICggY29uc3QgY2hhciAqZm10LCAuLi4gKSB7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQgKCBhcmdzLCBmbXQgKTsKKwl2YWxlcnQgKCBmbXQsIGFyZ3MgKTsKKwl2YV9lbmQgKCBhcmdzICk7Cit9CisKKy8qKgorICogRHJhdyB0aXRsZSByb3cKKyAqLworc3RhdGljIHZvaWQgZHJhd190aXRsZV9yb3cgKCB2b2lkICkgeworCWF0dHJvbiAoIEFfQk9MRCApOworCW1zZyAoIFRJVExFX1JPVywgImdQWEUgb3B0aW9uIGNvbmZpZ3VyYXRpb24gY29uc29sZSIgKTsKKwlhdHRyb2ZmICggQV9CT0xEICk7Cit9CisKKy8qKgorICogRHJhdyBpbmZvcm1hdGlvbiByb3cKKyAqCisgKiBAdiBzZXR0aW5nCQlDdXJyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZworICovCitzdGF0aWMgdm9pZCBkcmF3X2luZm9fcm93ICggc3RydWN0IHNldHRpbmcgKnNldHRpbmcgKSB7CisJY2xlYXJtc2cgKCBJTkZPX1JPVyApOworCWF0dHJvbiAoIEFfQk9MRCApOworCW1zZyAoIElORk9fUk9XLCAiJXMgLSAlcyIsIHNldHRpbmctPm5hbWUsIHNldHRpbmctPmRlc2NyaXB0aW9uICk7CisJYXR0cm9mZiAoIEFfQk9MRCApOworfQorCisvKioKKyAqIERyYXcgaW5zdHJ1Y3Rpb24gcm93CisgKgorICogQHYgZWRpdGluZwkJRWRpdGluZyBpbiBwcm9ncmVzcyBmbGFnCisgKi8KK3N0YXRpYyB2b2lkIGRyYXdfaW5zdHJ1Y3Rpb25fcm93ICggaW50IGVkaXRpbmcgKSB7CisJY2xlYXJtc2cgKCBJTlNUUlVDVElPTl9ST1cgKTsKKwlpZiAoIGVkaXRpbmcgKSB7CisJCW1zZyAoIElOU1RSVUNUSU9OX1JPVywKKwkJICAgICAgIkVudGVyIC0gYWNjZXB0IGNoYW5nZXMiIElOU1RSVUNUSU9OX1BBRAorCQkgICAgICAiQ3RybC1DIC0gZGlzY2FyZCBjaGFuZ2VzIiApOworCX0gZWxzZSB7CisJCW1zZyAoIElOU1RSVUNUSU9OX1JPVywKKwkJICAgICAgIkN0cmwtWCAtIGV4aXQgY29uZmlndXJhdGlvbiB1dGlsaXR5IiApOworCX0KK30KKworc3RhdGljIGludCBtYWluX2xvb3AgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzICkgeworCXN0cnVjdCBzZXR0aW5nX3dpZGdldCB3aWRnZXQ7CisJdW5zaWduZWQgaW50IGN1cnJlbnQgPSAwOworCXVuc2lnbmVkIGludCBuZXh0OworCWludCBpOworCWludCBrZXk7CisJaW50IHJjOworCisJLyogUHJpbnQgaW5pdGlhbCBzY3JlZW4gY29udGVudCAqLworCWRyYXdfdGl0bGVfcm93KCk7CisJY29sb3Jfc2V0ICggQ1BBSVJfTk9STUFMLCBOVUxMICk7CisJZm9yICggaSA9ICggTlVNX1NFVFRJTkdTIC0gMSApIDsgaSA+PSAwIDsgaS0tICkgeworCQlpbml0X3NldHRpbmdfaW5kZXggKCAmd2lkZ2V0LCBzZXR0aW5ncywgaSApOworCQlkcmF3X3NldHRpbmcgKCAmd2lkZ2V0ICk7CisJfQorCisJd2hpbGUgKCAxICkgeworCQkvKiBSZWRyYXcgaW5mb3JtYXRpb24gYW5kIGluc3RydWN0aW9uIHJvd3MgKi8KKwkJZHJhd19pbmZvX3JvdyAoIHdpZGdldC5zZXR0aW5nICk7CisJCWRyYXdfaW5zdHJ1Y3Rpb25fcm93ICggd2lkZ2V0LmVkaXRpbmcgKTsKKworCQkvKiBSZWRyYXcgY3VycmVudCBzZXR0aW5nICovCisJCWNvbG9yX3NldCAoICggd2lkZ2V0LmVkaXRpbmcgPyBDUEFJUl9FRElUIDogQ1BBSVJfU0VMRUNUICksCisJCQkgICAgTlVMTCApOworCQlkcmF3X3NldHRpbmcgKCAmd2lkZ2V0ICk7CisJCWNvbG9yX3NldCAoIENQQUlSX05PUk1BTCwgTlVMTCApOworCisJCWtleSA9IGdldGtleSgpOworCQlpZiAoIHdpZGdldC5lZGl0aW5nICkgeworCQkJa2V5ID0gZWRpdF9zZXR0aW5nICggJndpZGdldCwga2V5ICk7CisJCQlzd2l0Y2ggKCBrZXkgKSB7CisJCQljYXNlIENSOgorCQkJY2FzZSBMRjoKKwkJCQlpZiAoICggcmMgPSBzYXZlX3NldHRpbmcgKCAmd2lkZ2V0ICkgKSAhPSAwICkgeworCQkJCQlhbGVydCAoICIgQ291bGQgbm90IHNldCAlczogJXMgIiwKKwkJCQkJCXdpZGdldC5zZXR0aW5nLT5uYW1lLAorCQkJCQkJc3RyZXJyb3IgKCByYyApICk7CisJCQkJfQorCQkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQkJY2FzZSBDVFJMX0M6CisJCQkJbG9hZF9zZXR0aW5nICggJndpZGdldCApOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBEbyBub3RoaW5nICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQluZXh0ID0gY3VycmVudDsKKwkJCXN3aXRjaCAoIGtleSApIHsKKwkJCWNhc2UgS0VZX0RPV046CisJCQkJaWYgKCBuZXh0IDwgKCBOVU1fU0VUVElOR1MgLSAxICkgKQorCQkJCQluZXh0Kys7CisJCQkJYnJlYWs7CisJCQljYXNlIEtFWV9VUDoKKwkJCQlpZiAoIG5leHQgPiAwICkKKwkJCQkJbmV4dC0tOworCQkJCWJyZWFrOworCQkJY2FzZSBDVFJMX1g6CisJCQkJcmV0dXJuIDA7CisJCQlkZWZhdWx0OgorCQkJCWVkaXRfc2V0dGluZyAoICZ3aWRnZXQsIGtleSApOworCQkJCWJyZWFrOworCQkJfQkKKwkJCWlmICggbmV4dCAhPSBjdXJyZW50ICkgeworCQkJCWRyYXdfc2V0dGluZyAoICZ3aWRnZXQgKTsKKwkJCQlpbml0X3NldHRpbmdfaW5kZXggKCAmd2lkZ2V0LCBzZXR0aW5ncywgbmV4dCApOworCQkJCWN1cnJlbnQgPSBuZXh0OworCQkJfQorCQl9CisJfQorCQorfQorCitpbnQgc2V0dGluZ3NfdWkgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzICkgeworCWludCByYzsKKworCWluaXRzY3IoKTsKKwlzdGFydF9jb2xvcigpOworCWluaXRfcGFpciAoIENQQUlSX05PUk1BTCwgQ09MT1JfV0hJVEUsIENPTE9SX0JMVUUgKTsKKwlpbml0X3BhaXIgKCBDUEFJUl9TRUxFQ1QsIENPTE9SX1dISVRFLCBDT0xPUl9SRUQgKTsKKwlpbml0X3BhaXIgKCBDUEFJUl9FRElULCBDT0xPUl9CTEFDSywgQ09MT1JfQ1lBTiApOworCWluaXRfcGFpciAoIENQQUlSX0FMRVJULCBDT0xPUl9XSElURSwgQ09MT1JfUkVEICk7CisJY29sb3Jfc2V0ICggQ1BBSVJfTk9STUFMLCBOVUxMICk7CisJZXJhc2UoKTsKKwkKKwlyYyA9IG1haW5fbG9vcCAoIHNldHRpbmdzICk7CisKKwllbmR3aW4oKTsKKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2hjaS93aXJlbGVzc19lcnJvcnMuYyBiL2dweGUvc3JjL2hjaS93aXJlbGVzc19lcnJvcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAwNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaGNpL3dpcmVsZXNzX2Vycm9ycy5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvZXJyb3J0YWIuaD4KKworLyogUmVjb3JkIGVycm9ycyBhcyB0aG91Z2ggdGhleSBjb21lIGZyb20gdGhlIDgwMi4xMSBzdGFjayAqLworI3VuZGVmIEVSUkZJTEUKKyNkZWZpbmUgRVJSRklMRSBFUlJGSUxFX25ldDgwMjExCisKKy8qKiBBbGwgODAyLjExIGVycm9ycworICoKKyAqIFRoZXNlIGZvbGxvdyB0aGUgODAyLjExIHN0YW5kYXJkIGFzIG11Y2ggYXMgaXMgZmVhc2libGUsIGJ1dCBtb3N0CisgKiBoYXZlIGJlZW4gYWJicmV2aWF0ZWQgdG8gZml0IHRoZSA1MC1jaGFyYWN0ZXIgbGltaXQgaW1wb3NlZCBieQorICogc3RyZXJyb3IuCisgKi8KK3N0cnVjdCBlcnJvcnRhYiB3aXJlbGVzc19lcnJvcnNbXSBfX2Vycm9ydGFiID0geworCS8qIGdQWEUgODAyLjExIHN0YWNrIGVycm9ycyAqLworCXsgRUlOVkFMIHwgRVVOSVFfMDEsICJQYWNrZXQgdG9vIHNob3J0IiB9LAorCXsgRUlOVkFMIHwgRVVOSVFfMDIsICJQYWNrZXQgODAyLjExIHZlcnNpb24gbm90IHN1cHBvcnRlZCIgfSwKKwl7IEVJTlZBTCB8IEVVTklRXzAzLCAiUGFja2V0IG5vdCBhIGRhdGEgcGFja2V0IiB9LAorCXsgRUlOVkFMIHwgRVVOSVFfMDQsICJQYWNrZXQgbm90IGZyb20gYW4gQWNjZXNzIFBvaW50IiB9LAorCXsgRUlOVkFMIHwgRVVOSVFfMDUsICJQYWNrZXQgaGFzIGludmFsaWQgTExDIGhlYWRlciIgfSwKKwl7IEVJTlZBTCB8IEVVTklRXzA2LCAiUGFja2V0IGRlY3J5cHRpb24gZXJyb3IiLCB9LAorCXsgRUlOVkFMIHwgRVVOSVFfMDcsICJJbnZhbGlkIGFjdGl2ZSBzY2FuIHJlcXVlc3RlZCIgfSwKKworCS8qIDgwMi4xMSBzdGF0dXMgY29kZXMgKElFRUUgU3RkIDgwMi4xMS0yMDA3LCBUYWJsZSA3LTIzKSAqLworCS8qIE1heGltdW0gZXJyb3IgbGVuZ3RoOiA1MCBjaGFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqLworCXsgRUNPTk5SRUZVU0VEIHwgRVVOSVFfMDEsICJVbnNwZWNpZmllZCBmYWlsdXJlIiB9LAorCXsgRUNPTk5SRUZVU0VEIHwgRVVOSVFfMEEsICJDYW5ub3Qgc3VwcG9ydCBhbGwgcmVxdWVzdGVkIGNhcGFiaWxpdGllcyIgfSwKKwl7IEVDT05OUkVGVVNFRCB8IEVVTklRXzBCLCAiUmVhc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIGxhY2sgb2YgYXNzb2NpYXRpb24iIH0sCisJeyBFQ09OTlJFRlVTRUQgfCBFVU5JUV8wQywgIkFzc29jaWF0aW9uIGRlbmllZCBmb3IgYW5vdGhlciByZWFzb24iIH0sCisJeyBFQ09OTlJFRlVTRUQgfCBFVU5JUV8wRCwgIkF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSB1bnN1cHBvcnRlZCIgfSwKKwl7IEVDT05OUkVGVVNFRCB8IEVVTklRXzBFLCAiQXV0aGVudGljYXRpb24gc2VxdWVuY2UgbnVtYmVyIHVuZXhwZWN0ZWQiIH0sCisJeyBFQ09OTlJFRlVTRUQgfCBFVU5JUV8wRiwgIkF1dGhlbnRpY2F0aW9uIHJlamVjdGVkIGR1ZSB0byBjaGFsbGVuZ2UgZmFpbHVyZSIgfSwKKwl7IEVDT05OUkVGVVNFRCB8IEVVTklRXzEwLCAiQXV0aGVudGljYXRpb24gcmVqZWN0ZWQgZHVlIHRvIHRpbWVvdXQiIH0sCisJeyBFQ09OTlJFRlVTRUQgfCBFVU5JUV8xMSwgIkFzc29jaWF0aW9uIGRlbmllZCBiZWNhdXNlIEFQIGlzIG91dCBvZiByZXNvdXJjZXMiIH0sCisJeyBFQ09OTlJFRlVTRUQgfCBFVU5JUV8xMiwgIkFzc29jaWF0aW9uIGRlbmllZDsgYmFzaWMgcmF0ZSBzdXBwb3J0IHJlcXVpcmVkIiB9LAorCXsgRUNPTk5SRUZVU0VEIHwgRVVOSVFfMTMsICJBc3NvY2lhdGlvbiBkZW5pZWQ7IHNob3J0IHByZWFtYmxlIHN1cHBvcnQgcmVxJ2QiIH0sCisJeyBFQ09OTlJFRlVTRUQgfCBFVU5JUV8xNCwgIkFzc29jaWF0aW9uIGRlbmllZDsgUEJDQyBtb2R1bGF0aW9uIHN1cHBvcnQgcmVxJ2QiIH0sCisJeyBFQ09OTlJFRlVTRUQgfCBFVU5JUV8xNSwgIkFzc29jaWF0aW9uIGRlbmllZDsgQ2hhbm5lbCBBZ2lsaXR5IHN1cHBvcnQgcmVxJ2QiIH0sCisJeyBFQ09OTlJFRlVTRUQgfCBFVU5JUV8xNiwgIkFzc29jaWF0aW9uIGRlbmllZDsgU3BlY3RydW0gTWFuYWdlbWVudCByZXF1aXJlZCIgfSwKKwl7IEVDT05OUkVGVVNFRCB8IEVVTklRXzE3LCAiQXNzb2NpYXRpb24gZGVuaWVkOyBQb3dlciBDYXBhYmlsaXR5IHVuYWNjZXB0YWJsZSIgfSwKKwl7IEVDT05OUkVGVVNFRCB8IEVVTklRXzE4LCAiQXNzb2NpYXRpb24gZGVuaWVkOyBTdXBwb3J0ZWQgQ2hhbm5lbHMgdW5hY2NlcHRhYmxlIiB9LAorCXsgRUNPTk5SRUZVU0VEIHwgRVVOSVFfMTksICJBc3NvY2lhdGlvbiBkZW5pZWQ7IFNob3J0IFNsb3QgVHVtZSBzdXBwb3J0IHJlcSdkIiB9LAorCXsgRUNPTk5SRUZVU0VEIHwgRVVOSVFfMUEsICJBc3NvY2lhdGlvbiBkZW5pZWQ7IERTU1MtT0ZETSBzdXBwb3J0IHJlcXVpcmVkIiB9LAorCXsgRUhPU1RVTlJFQUNILCAgICAgICAgICAgICJVbnNwZWNpZmllZCwgUW9TLXJlbGF0ZWQgZmFpbHVyZSIgfSwKKwl7IEVIT1NUVU5SRUFDSCB8IEVVTklRXzAxLCAiQXNzb2NpYXRpb24gZGVuaWVkOyBRb1MgQVAgb3V0IG9mIFFvUyByZXNvdXJjZXMiIH0sCisJeyBFSE9TVFVOUkVBQ0ggfCBFVU5JUV8wMiwgIkFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gZXhjZXNzaXZlbHkgcG9vciBsaW5rIiB9LAorCXsgRUhPU1RVTlJFQUNIIHwgRVVOSVFfMDMsICJBc3NvY2lhdGlvbiBkZW5pZWQ7IFFvUyBzdXBwb3J0IHJlcXVpcmVkIiB9LAorCXsgRUhPU1RVTlJFQUNIIHwgRVVOSVFfMDUsICJUaGUgcmVxdWVzdCBoYXMgYmVlbiBkZWNsaW5lZCIgfSwKKwl7IEVIT1NUVU5SRUFDSCB8IEVVTklRXzA2LCAiUmVxdWVzdCB1bnN1Y2Nlc3NmdWwgZHVlIHRvIGludmFsaWQgcGFyYW1ldGVycyIgfSwKKwl7IEVIT1NUVU5SRUFDSCB8IEVVTklRXzA3LCAiVFMgbm90IGNyZWF0ZWQgZHVlIHRvIGJhZCBzcGVjaWZpY2F0aW9uIiB9LAorCXsgRUhPU1RVTlJFQUNIIHwgRVVOSVFfMDgsICJJbnZhbGlkIGluZm9ybWF0aW9uIGVsZW1lbnQiIH0sCisJeyBFSE9TVFVOUkVBQ0ggfCBFVU5JUV8wOSwgIkludmFsaWQgZ3JvdXAgY2lwaGVyIiB9LAorCXsgRUhPU1RVTlJFQUNIIHwgRVVOSVFfMEEsICJJbnZhbGlkIHBhaXJ3aXNlIGNpcGhlciIgfSwKKwl7IEVIT1NUVU5SRUFDSCB8IEVVTklRXzBCLCAiSW52YWxpZCBBS01QIiB9LAorCXsgRUhPU1RVTlJFQUNIIHwgRVVOSVFfMEMsICJVbnN1cHBvcnRlZCBSU04gaW5mb3JtYXRpb24gZWxlbWVudCB2ZXJzaW9uIiB9LAorCXsgRUhPU1RVTlJFQUNIIHwgRVVOSVFfMEQsICJJbnZhbGlkIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50IGNhcGFiaWxpdGllcyIgfSwKKwl7IEVIT1NUVU5SRUFDSCB8IEVVTklRXzBFLCAiQ2lwaGVyIHN1aXRlIHJlamVjdGVkIGJlY2F1c2Ugb2Ygc2VjdXJpdHkgcG9saWN5IiB9LAorCXsgRUhPU1RVTlJFQUNIIHwgRVVOSVFfMEYsICJUUyBub3QgY3JlYXRlZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRlbGF5IiB9LAorCXsgRUhPU1RVTlJFQUNIIHwgRVVOSVFfMTAsICJEaXJlY3QgbGluayBpcyBub3QgYWxsb3dlZCBpbiB0aGUgQlNTIGJ5IHBvbGljeSIgfSwKKwl7IEVIT1NUVU5SRUFDSCB8IEVVTklRXzExLCAiVGhlIERlc3RpbmF0aW9uIFNUQSBpcyBub3QgcHJlc2VudCB3aXRoaW4gdGhlIEJTUyIgfSwKKwl7IEVIT1NUVU5SRUFDSCB8IEVVTklRXzEyLCAiVGhlIERlc3RpbmF0aW9uIFNUQSBpcyBub3QgYSBRb1MgU1RBIiB9LAorCXsgRUhPU1RVTlJFQUNIIHwgRVVOSVFfMTMsICJBc3NvY2lhdGlvbiBkZW5pZWQ7IExpc3RlbiBJbnRlcnZhbCBpcyB0b28gbGFyZ2UiIH0sCisKKwkvKiA4MDIuMTEgcmVhc29uIGNvZGVzIChJRUVFIFN0ZCA4MDIuMTEtMjAwNywgVGFibGUgNy0yMikgKi8KKwkvKiBNYXhpbXVtIGVycm9yIGxlbmd0aDogNTAgY2hhcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICovCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMDEsICJVbnNwZWNpZmllZCByZWFzb24iIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMDIsICJQcmV2aW91cyBhdXRoZW50aWNhdGlvbiBubyBsb25nZXIgdmFsaWQiIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMDMsICJEZWF1dGhlbnRpY2F0ZWQgZHVlIHRvIGxlYXZpbmcgbmV0d29yayIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8wNCwgIkRpc2Fzc29jaWF0ZWQgZHVlIHRvIGluYWN0aXZpdHkiIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMDUsICJEaXNhc3NvY2lhdGVkIGJlY2F1c2UgQVAgaXMgb3V0IG9mIHJlc291cmNlcyIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8wNiwgIkNsYXNzIDIgZnJhbWUgcmVjZWl2ZWQgZnJvbSBub25hdXRoZW50aWNhdGVkIFNUQSIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8wNywgIkNsYXNzIDMgZnJhbWUgcmVjZWl2ZWQgZnJvbSBub25hc3NvY2lhdGVkIFNUQSIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8wOCwgIkRpc2Fzc29jaWF0ZWQgZHVlIHRvIHJvYW1pbmciIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMDksICJTVEEgcmVxdWVzdGluZyAocmUpYXNzb2NpYXRpb24gbm90IGF1dGhlbnRpY2F0ZWQiIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMEEsICJEaXNhc3NvY2lhdGVkOyBQb3dlciBDYXBhYmlsaXR5IHVuYWNjZXB0YWJsZSIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8wQiwgIkRpc2Fzc29jaWF0ZWQ7IFN1cHBvcnRlZCBDaGFubmVscyB1bmFjY2VwdGFibGUiIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMEQsICJJbnZhbGlkIGluZm9ybWF0aW9uIGVsZW1lbnQiIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMEUsICJNZXNzYWdlIGludGVncml0eSBjb2RlIChNSUMpIGZhaWx1cmUiIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMEYsICI0LVdheSBIYW5kc2hha2UgdGltZW91dCIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8xMCwgIkdyb3VwIEtleSBIYW5kc2hha2UgdGltZW91dCIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8xMSwgIjQtV2F5IEhhbmRzaGFrZSBpbmZvcm1hdGlvbiBlbGVtZW50IGNoYW5nZWQgdW5kdWx5IiB9LAorCXsgRUNPTk5SRVNFVCB8IEVVTklRXzEyLCAiSW52YWxpZCBncm91cCBjaXBoZXIiIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMTMsICJJbnZhbGlkIHBhaXJ3aXNlIGNpcGhlciIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8xNCwgIkludmFsaWQgQUtNUCIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8xNSwgIlVuc3VwcG9ydGVkIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50IHZlcnNpb24iIH0sCisJeyBFQ09OTlJFU0VUIHwgRVVOSVFfMTYsICJJbnZhbGlkIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50IGNhcGFiaWxpdGllcyIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8xNywgIklFRUUgODAyLjFYIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8xOCwgIkNpcGhlciBzdWl0ZSByZWplY3RlZCBiZWNhdXNlIG9mIHNlY3VyaXR5IHBvbGljeSIgfSwKKwl7IEVORVRSRVNFVCwgICAgICAgICAgICAiRGlzYXNzb2NpYXRlZCBmb3IgdW5zcGVjaWZpZWQsIFFvUy1yZWxhdGVkIHJlYXNvbiIgfSwKKwl7IEVORVRSRVNFVCB8IEVVTklRXzAxLCAiRGlzYXNzb2NpYXRlZDsgUW9TIEFQIGlzIG91dCBvZiBRb1MgcmVzb3VyY2VzIiB9LAorCXsgRU5FVFJFU0VUIHwgRVVOSVFfMDIsICJEaXNhc3NvY2lhdGVkIGR1ZSB0byBleGNlc3NpdmVseSBwb29yIGxpbmsiIH0sCisJeyBFTkVUUkVTRVQgfCBFVU5JUV8wMywgIkRpc2Fzc29jaWF0ZWQgZHVlIHRvIFRYT1AgbGltaXQgdmlvbGF0aW9uIiB9LAorCXsgRU5FVFJFU0VUIHwgRVVOSVFfMDQsICJSZXF1ZXN0ZWQ7IFNUQSBpcyBsZWF2aW5nIHRoZSBCU1MgKG9yIHJlc2V0dGluZykiIH0sCisJeyBFTkVUUkVTRVQgfCBFVU5JUV8wNSwgIlJlcXVlc3RlZDsgZG9lcyBub3Qgd2FudCB0byB1c2UgdGhlIG1lY2hhbmlzbSIgfSwKKwl7IEVORVRSRVNFVCB8IEVVTklRXzA2LCAiUmVxdWVzdGVkOyBzZXR1cCBpcyByZXF1aXJlZCIgfSwKKwl7IEVORVRSRVNFVCB8IEVVTklRXzA3LCAiUmVxdWVzdGVkIGZyb20gcGVlciBTVEEgZHVlIHRvIHRpbWVvdXQiIH0sCisJeyBFTkVUUkVTRVQgfCBFVU5JUV8wRCwgIlBlZXIgU1RBIGRvZXMgbm90IHN1cHBvcnQgcmVxdWVzdGVkIGNpcGhlciBzdWl0ZSIgfSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbWFnZS9lZmlfaW1hZ2UuYyBiL2dweGUvc3JjL2ltYWdlL2VmaV9pbWFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZDE1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbWFnZS9lZmlfaW1hZ2UuYwpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvZWZpLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbWFnZS5oPgorI2luY2x1ZGUgPGdweGUvZmVhdHVyZXMuaD4KKworRkVBVFVSRSAoIEZFQVRVUkVfSU1BR0UsICJFRkkiLCBESENQX0VCX0ZFQVRVUkVfRUZJLCAxICk7CisKK3N0cnVjdCBpbWFnZV90eXBlIGVmaV9pbWFnZV90eXBlIF9faW1hZ2VfdHlwZSAoIFBST0JFX05PUk1BTCApOworCisvKioKKyAqIEV4ZWN1dGUgRUZJIGltYWdlCisgKgorICogQHYgaW1hZ2UJCUVGSSBpbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZWZpX2ltYWdlX2V4ZWMgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCUVGSV9CT09UX1NFUlZJQ0VTICpicyA9IGVmaV9zeXN0YWItPkJvb3RTZXJ2aWNlczsKKwlFRklfSEFORExFIGhhbmRsZTsKKwlVSU5UTiBleGl0X2RhdGFfc2l6ZTsKKwlDSEFSMTYgKmV4aXRfZGF0YTsKKwlFRklfU1RBVFVTIGVmaXJjOworCisJLyogQXR0ZW1wdCBsb2FkaW5nIGltYWdlICovCisJaWYgKCAoIGVmaXJjID0gYnMtPkxvYWRJbWFnZSAoIEZBTFNFLCBlZmlfaW1hZ2VfaGFuZGxlLCBOVUxMLAorCQkJCSAgICAgICB1c2VyX3RvX3ZpcnQgKCBpbWFnZS0+ZGF0YSwgMCApLAorCQkJCSAgICAgICBpbWFnZS0+bGVuLCAmaGFuZGxlICkgKSAhPSAwICkgeworCQkvKiBOb3QgYW4gRUZJIGltYWdlICovCisJCURCR0MgKCBpbWFnZSwgIkVGSUlNQUdFICVwIGNvdWxkIG5vdCBsb2FkOiAlc1xuIiwKKwkJICAgICAgIGltYWdlLCBlZmlfc3RyZXJyb3IgKCBlZmlyYyApICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkvKiBTdGFydCB0aGUgaW1hZ2UgKi8KKwlpZiAoICggZWZpcmMgPSBicy0+U3RhcnRJbWFnZSAoIGhhbmRsZSwgJmV4aXRfZGF0YV9zaXplLAorCQkJCQkmZXhpdF9kYXRhICkgKSAhPSAwICkgeworCQlEQkdDICggaW1hZ2UsICJFRklJTUFHRSAlcCByZXR1cm5lZCB3aXRoIHN0YXR1cyAlc1xuIiwKKwkJICAgICAgIGltYWdlLCBlZmlfc3RyZXJyb3IgKCBlZmlyYyApICk7CisJCWdvdG8gZG9uZTsKKwl9CisKKyBkb25lOgorCS8qIFVubG9hZCB0aGUgaW1hZ2UuICBXZSBjYW4ndCBsZWF2ZSBpdCBsb2FkZWQsIGJlY2F1c2Ugd2UKKwkgKiBoYXZlIG5vICJ1bmxvYWQiIG9wZXJhdGlvbi4KKwkgKi8KKwlicy0+VW5sb2FkSW1hZ2UgKCBoYW5kbGUgKTsKKworCXJldHVybiBFRklSQ19UT19SQyAoIGVmaXJjICk7Cit9CisKKy8qKgorICogTG9hZCBFRkkgaW1hZ2UgaW50byBtZW1vcnkKKyAqCisgKiBAdiBpbWFnZQkJRUZJIGZpbGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGVmaV9pbWFnZV9sb2FkICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwlFRklfQk9PVF9TRVJWSUNFUyAqYnMgPSBlZmlfc3lzdGFiLT5Cb290U2VydmljZXM7CisJRUZJX0hBTkRMRSBoYW5kbGU7CisJRUZJX1NUQVRVUyBlZmlyYzsKKworCS8qIEF0dGVtcHQgbG9hZGluZyBpbWFnZSAqLworCWlmICggKCBlZmlyYyA9IGJzLT5Mb2FkSW1hZ2UgKCBGQUxTRSwgZWZpX2ltYWdlX2hhbmRsZSwgTlVMTCwKKwkJCQkgICAgICAgdXNlcl90b192aXJ0ICggaW1hZ2UtPmRhdGEsIDAgKSwKKwkJCQkgICAgICAgaW1hZ2UtPmxlbiwgJmhhbmRsZSApICkgIT0gMCApIHsKKwkJLyogTm90IGFuIEVGSSBpbWFnZSAqLworCQlEQkdDICggaW1hZ2UsICJFRklJTUFHRSAlcCBjb3VsZCBub3QgbG9hZDogJXNcbiIsCisJCSAgICAgICBpbWFnZSwgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQlyZXR1cm4gLUVOT0VYRUM7CisJfQorCisJLyogVGhpcyBpcyBhbiBFRkkgaW1hZ2UgKi8KKwlpZiAoICEgaW1hZ2UtPnR5cGUgKQorCQlpbWFnZS0+dHlwZSA9ICZlZmlfaW1hZ2VfdHlwZTsKKworCS8qIFVubG9hZCB0aGUgaW1hZ2UuICBXZSBjYW4ndCBsZWF2ZSBpdCBsb2FkZWQsIGJlY2F1c2Ugd2UKKwkgKiBoYXZlIG5vICJ1bmxvYWQiIG9wZXJhdGlvbi4KKwkgKi8KKwlicy0+VW5sb2FkSW1hZ2UgKCBoYW5kbGUgKTsKKworCXJldHVybiAwOworfQorCisvKiogRUZJIGltYWdlIHR5cGUgKi8KK3N0cnVjdCBpbWFnZV90eXBlIGVmaV9pbWFnZV90eXBlIF9faW1hZ2VfdHlwZSAoIFBST0JFX05PUk1BTCApID0geworCS5uYW1lID0gIkVGSSIsCisJLmxvYWQgPSBlZmlfaW1hZ2VfbG9hZCwKKwkuZXhlYyA9IGVmaV9pbWFnZV9leGVjLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2ltYWdlL2VsZi5jIGIvZ3B4ZS9zcmMvaW1hZ2UvZWxmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlYzA2NQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2ltYWdlL2VsZi5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEBmaWxlCisgKgorICogRUxGIGltYWdlIGZvcm1hdAorICoKKyAqIEEgInB1cmUiIEVMRiBpbWFnZSBpcyBub3QgYSBib290YWJsZSBpbWFnZS4gIFRoZXJlIGFyZSB2YXJpb3VzCisgKiBib290YWJsZSBmb3JtYXRzIGJhc2VkIHVwb24gRUxGIChlLmcuIE11bHRpYm9vdCksIHdoaWNoIHNoYXJlCisgKiBjb21tb24gRUxGLXJlbGF0ZWQgZnVuY3Rpb25hbGl0eS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxncHhlL2ltYWdlLmg+CisjaW5jbHVkZSA8Z3B4ZS9lbGYuaD4KKwordHlwZWRlZiBFbGYzMl9FaGRyCUVsZl9FaGRyOwordHlwZWRlZiBFbGYzMl9QaGRyCUVsZl9QaGRyOwordHlwZWRlZiBFbGYzMl9PZmYJRWxmX09mZjsKKworLyoqCisgKiBMb2FkIEVMRiBzZWdtZW50IGludG8gbWVtb3J5CisgKgorICogQHYgaW1hZ2UJCUVMRiBmaWxlCisgKiBAdiBwaGRyCQlFTEYgcHJvZ3JhbSBoZWFkZXIKKyAqIEB2IGVoZHIJCUVMRiBleGVjdXRhYmxlIGhlYWRlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZWxmX2xvYWRfc2VnbWVudCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsIEVsZl9QaGRyICpwaGRyLAorCQkJICAgICAgRWxmX0VoZHIgKmVoZHIgKSB7CisJcGh5c2FkZHJfdCBkZXN0OworCXVzZXJwdHJfdCBidWZmZXI7CisJdW5zaWduZWQgbG9uZyBlX29mZnNldDsKKwlpbnQgcmM7CisKKwkvKiBEbyBub3RoaW5nIGZvciBub24tUFRfTE9BRCBzZWdtZW50cyAqLworCWlmICggcGhkci0+cF90eXBlICE9IFBUX0xPQUQgKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIHNlZ21lbnQgbGllcyB3aXRoaW4gaW1hZ2UgKi8KKwlpZiAoICggcGhkci0+cF9vZmZzZXQgKyBwaGRyLT5wX2ZpbGVzeiApID4gaW1hZ2UtPmxlbiApIHsKKwkJREJHQyAoIGltYWdlLCAiRUxGICVwIHNlZ21lbnQgb3V0c2lkZSBpbWFnZVxuIiwgaW1hZ2UgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCS8qIEZpbmQgc3RhcnQgYWRkcmVzczogdXNlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHByZWZlcmVuY2UsCisJICogZmFsbCBiYWNrIHRvIHZpcnR1YWwgYWRkcmVzcyBpZiBubyBwaHlzaWNhbCBhZGRyZXNzCisJICogc3VwcGxpZWQuCisJICovCisJZGVzdCA9IHBoZHItPnBfcGFkZHI7CisJaWYgKCAhIGRlc3QgKQorCQlkZXN0ID0gcGhkci0+cF92YWRkcjsKKwlpZiAoICEgZGVzdCApIHsKKwkJREJHQyAoIGltYWdlLCAiRUxGICVwIHNlZ21lbnQgbG9hZHMgdG8gcGh5c2ljYWwgYWRkcmVzcyAwXG4iLAorCQkgICAgICAgaW1hZ2UgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKwlidWZmZXIgPSBwaHlzX3RvX3VzZXIgKCBkZXN0ICk7CisKKwlEQkdDICggaW1hZ2UsICJFTEYgJXAgbG9hZGluZyBzZWdtZW50IFsleCwleCkgdG8gWyV4LCV4LCV4KVxuIiwgaW1hZ2UsCisJICAgICAgIHBoZHItPnBfb2Zmc2V0LCAoIHBoZHItPnBfb2Zmc2V0ICsgcGhkci0+cF9maWxlc3ogKSwKKwkgICAgICAgcGhkci0+cF9wYWRkciwgKCBwaGRyLT5wX3BhZGRyICsgcGhkci0+cF9maWxlc3ogKSwKKwkgICAgICAgKCBwaGRyLT5wX3BhZGRyICsgcGhkci0+cF9tZW1zeiApICk7CisKKwkvKiBWZXJpZnkgYW5kIHByZXBhcmUgc2VnbWVudCAqLworCWlmICggKCByYyA9IHByZXBfc2VnbWVudCAoIGJ1ZmZlciwgcGhkci0+cF9maWxlc3osCisJCQkJICAgcGhkci0+cF9tZW1zeiApICkgIT0gMCApIHsKKwkJREJHQyAoIGltYWdlLCAiRUxGICVwIGNvdWxkIG5vdCBwcmVwYXJlIHNlZ21lbnQ6ICVzXG4iLAorCQkgICAgICAgaW1hZ2UsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogQ29weSBpbWFnZSB0byBzZWdtZW50ICovCisJbWVtY3B5X3VzZXIgKCBidWZmZXIsIDAsIGltYWdlLT5kYXRhLCBwaGRyLT5wX29mZnNldCwgcGhkci0+cF9maWxlc3ogKTsKKworCS8qIFNldCBleGVjdXRpb24gYWRkcmVzcywgaWYgaXQgbGllcyB3aXRoaW4gdGhpcyBzZWdtZW50ICovCisJaWYgKCAoIGVfb2Zmc2V0ID0gKCBlaGRyLT5lX2VudHJ5IC0gZGVzdCApICkgPCBwaGRyLT5wX2ZpbGVzeiApIHsKKwkJaW1hZ2UtPnByaXYucGh5cyA9IGVoZHItPmVfZW50cnk7CisJCURCR0MgKCBpbWFnZSwgIkVMRiAlcCBmb3VuZCBwaHlzaWNhbCBlbnRyeSBwb2ludCBhdCAlbHhcbiIsCisJCSAgICAgICBpbWFnZSwgaW1hZ2UtPnByaXYucGh5cyApOworCX0gZWxzZSBpZiAoICggZV9vZmZzZXQgPSAoIGVoZHItPmVfZW50cnkgLSBwaGRyLT5wX3ZhZGRyICkgKQorCQkgICAgPCBwaGRyLT5wX2ZpbGVzeiApIHsKKwkJaWYgKCAhIGltYWdlLT5wcml2LnBoeXMgKSB7CisJCQlpbWFnZS0+cHJpdi5waHlzID0gKCBkZXN0ICsgZV9vZmZzZXQgKTsKKwkJCURCR0MgKCBpbWFnZSwgIkVMRiAlcCBmb3VuZCB2aXJ0dWFsIGVudHJ5IHBvaW50IGF0ICVseCIKKwkJCSAgICAgICAiICh2aXJ0ICVseClcbiIsIGltYWdlLCBpbWFnZS0+cHJpdi5waHlzLAorCQkJICAgICAgICggKCB1bnNpZ25lZCBsb25nICkgZWhkci0+ZV9lbnRyeSApICk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBMb2FkIEVMRiBpbWFnZSBpbnRvIG1lbW9yeQorICoKKyAqIEB2IGltYWdlCQlFTEYgZmlsZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBlbGZfbG9hZCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJRWxmX0VoZHIgZWhkcjsKKwlFbGZfUGhkciBwaGRyOworCUVsZl9PZmYgcGhvZmY7CisJdW5zaWduZWQgaW50IHBobnVtOworCWludCByYzsKKworCS8qIEltYWdlIHR5cGUgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBzZXQgYnkgY2FsbGVyICovCisJYXNzZXJ0ICggaW1hZ2UtPnR5cGUgIT0gTlVMTCApOworCisJLyogUmVhZCBFTEYgaGVhZGVyICovCisJY29weV9mcm9tX3VzZXIgKCAmZWhkciwgaW1hZ2UtPmRhdGEsIDAsIHNpemVvZiAoIGVoZHIgKSApOworCWlmICggbWVtY21wICggJmVoZHIuZV9pZGVudFtFSV9NQUcwXSwgRUxGTUFHLCBTRUxGTUFHICkgIT0gMCApIHsKKwkJREJHQyAoIGltYWdlLCAiRUxGICVwIGhhcyBpbnZhbGlkIHNpZ25hdHVyZVxuIiwgaW1hZ2UgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCS8qIEludmFsaWRhdGUgZXhlY3V0aW9uIGFkZHJlc3MgKi8KKwlpbWFnZS0+cHJpdi5waHlzID0gMDsKKworCS8qIFJlYWQgRUxGIHByb2dyYW0gaGVhZGVycyAqLworCWZvciAoIHBob2ZmID0gZWhkci5lX3Bob2ZmICwgcGhudW0gPSBlaGRyLmVfcGhudW0gOyBwaG51bSA7CisJICAgICAgcGhvZmYgKz0gZWhkci5lX3BoZW50c2l6ZSwgcGhudW0tLSApIHsKKwkJaWYgKCBwaG9mZiA+IGltYWdlLT5sZW4gKSB7CisJCQlEQkdDICggaW1hZ2UsICJFTEYgJXAgcHJvZ3JhbSBoZWFkZXIgJWQgb3V0c2lkZSAiCisJCQkgICAgICAgImltYWdlXG4iLCBpbWFnZSwgcGhudW0gKTsKKwkJCXJldHVybiAtRU5PRVhFQzsKKwkJfQorCQljb3B5X2Zyb21fdXNlciAoICZwaGRyLCBpbWFnZS0+ZGF0YSwgcGhvZmYsIHNpemVvZiAoIHBoZHIgKSApOworCQlpZiAoICggcmMgPSBlbGZfbG9hZF9zZWdtZW50ICggaW1hZ2UsICZwaGRyLCAmZWhkciApICkgIT0gMCApCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyogQ2hlY2sgZm9yIGEgdmFsaWQgZXhlY3V0aW9uIGFkZHJlc3MgKi8KKwlpZiAoICEgaW1hZ2UtPnByaXYucGh5cyApIHsKKwkJREJHQyAoIGltYWdlLCAiRUxGICVwIGVudHJ5IHBvaW50ICVseCBvdXRzaWRlIGltYWdlXG4iLAorCQkgICAgICAgaW1hZ2UsICggKCB1bnNpZ25lZCBsb25nICkgZWhkci5lX2VudHJ5ICkgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW1hZ2UvZW1iZWRkZWQuYyBiL2dweGUvc3JjL2ltYWdlL2VtYmVkZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhMTRlYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2ltYWdlL2VtYmVkZGVkLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qKiBAZmlsZQorICoKKyAqIEVtYmVkZGVkIGltYWdlIHN1cHBvcnQKKyAqCisgKiBFbWJlZGRlZCBpbWFnZXMgYXJlIGltYWdlcyBidWlsdCBpbnRvIHRoZSBnUFhFIGJpbmFyeSBhbmQgZG8gbm90IHJlcXVpcmUKKyAqIGZldGNoaW5nIG92ZXIgdGhlIG5ldHdvcmsuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbWFnZS5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorCisvKioKKyAqIEZyZWUgZW1iZWRkZWQgaW1hZ2UKKyAqCisgKiBAdiByZWZjbnQJCVJlZmVyZW5jZSBjb3VudGVyCisgKi8KK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCggdW51c2VkICkpCitlbWJlZGRlZF9pbWFnZV9mcmVlICggc3RydWN0IHJlZmNudCAqcmVmY250IF9fdW51c2VkICkgeworCS8qIERvIG5vdGhpbmcgKi8KK30KKworLyogUmF3IGltYWdlIGRhdGEgZm9yIGFsbCBlbWJlZGRlZCBpbWFnZXMgKi8KKyN1bmRlZiBFTUJFRAorI2RlZmluZSBFTUJFRCggX2luZGV4LCBfcGF0aCwgX25hbWUgKQkJCQkJXAorCWV4dGVybiBjaGFyIGVtYmVkZGVkX2ltYWdlXyAjIyBfaW5kZXggIyMgX2RhdGFbXTsJCVwKKwlleHRlcm4gY2hhciBlbWJlZGRlZF9pbWFnZV8gIyMgX2luZGV4ICMjIF9sZW5bXTsJCVwKKwlfX2FzbV9fICggIi5zZWN0aW9uIFwiLnJvZGF0YVwiLCBcImFcIiwgQHByb2diaXRzXG5cdCIJCVwKKwkJICAiXG5lbWJlZGRlZF9pbWFnZV8iICNfaW5kZXggIl9kYXRhOlxuXHQiCQlcCisJCSAgIi5pbmNiaW4gXCIiIF9wYXRoICJcIlxuXHQiCQkJCVwKKwkJICAiXG5lbWJlZGRlZF9pbWFnZV8iICNfaW5kZXggIl9lbmQ6XG5cdCIJCVwKKwkJICAiLmVxdSBlbWJlZGRlZF9pbWFnZV8iICNfaW5kZXggIl9sZW4sICIJCVwKKwkJCSIoIGVtYmVkZGVkX2ltYWdlXyIgI19pbmRleCAiX2VuZCAtICIJCVwKKwkJCSIgIGVtYmVkZGVkX2ltYWdlXyIgI19pbmRleCAiX2RhdGEgKVxuXHQiCVwKKwkJICAiLnByZXZpb3VzXG5cdCIgKTsKK0VNQkVEX0FMTAorCisvKiBJbWFnZSBzdHJ1Y3R1cmVzIGZvciBhbGwgZW1iZWRkZWQgaW1hZ2VzICovCisjdW5kZWYgRU1CRUQKKyNkZWZpbmUgRU1CRUQoIF9pbmRleCwgX3BhdGgsIF9uYW1lICkgewkJCQkJXAorCS5yZWZjbnQgPSB7IC5mcmVlID0gZW1iZWRkZWRfaW1hZ2VfZnJlZSwgfSwJCQlcCisJLm5hbWUgPSBfbmFtZSwJCQkJCQkJXAorCS5kYXRhID0gKCB1c2VycHRyX3QgKSAoIGVtYmVkZGVkX2ltYWdlXyAjIyBfaW5kZXggIyMgX2RhdGEgKSwJXAorCS5sZW4gPSAoIHNpemVfdCApIGVtYmVkZGVkX2ltYWdlXyAjIyBfaW5kZXggIyMgX2xlbiwJCVwKK30sCitzdGF0aWMgc3RydWN0IGltYWdlIGVtYmVkZGVkX2ltYWdlc1tdID0geworCUVNQkVEX0FMTAorfTsKKworLyoqCisgKiBSZWdpc3RlciBhbGwgZW1iZWRkZWQgaW1hZ2VzCisgKi8KK3N0YXRpYyB2b2lkIGVtYmVkZGVkX2luaXQgKCB2b2lkICkgeworCWludCBpOworCXN0cnVjdCBpbWFnZSAqaW1hZ2U7CisJdm9pZCAqZGF0YTsKKwlpbnQgcmM7CisKKwkvKiBTa2lwIGlmIHdlIGhhdmUgbm8gZW1iZWRkZWQgaW1hZ2VzICovCisJaWYgKCAhIHNpemVvZiAoIGVtYmVkZGVkX2ltYWdlcyApICkKKwkJcmV0dXJuOworCisJLyogRml4IHVwIGRhdGEgcG9pbnRlcnMgYW5kIHJlZ2lzdGVyIGltYWdlcyAqLworCWZvciAoIGkgPSAwIDsgaSA8ICggaW50ICkgKCBzaXplb2YgKCBlbWJlZGRlZF9pbWFnZXMgKSAvCisJCQkJICAgIHNpemVvZiAoIGVtYmVkZGVkX2ltYWdlc1swXSApICkgOyBpKysgKSB7CisJCWltYWdlID0gJmVtYmVkZGVkX2ltYWdlc1tpXTsKKworCQkvKiB2aXJ0X3RvX3VzZXIoKSBjYW5ub3QgYmUgdXNlZCBpbiBhIHN0YXRpYworCQkgKiBpbml0aWFsaXNlciwgc28gd2UgY2FzdCB0aGUgcG9pbnRlciB0byBhIHVzZXJwdHJfdAorCQkgKiBpbiB0aGUgaW5pdGlhbGlzZXIgYW5kIGZpeCBpdCB1cCBoZXJlLiAgKFRoaXMgd2lsbAorCQkgKiBhY3R1YWxseSBiZSBhIG5vLW9wIG9uIG1vc3QgcGxhdGZvcm1zLikKKwkJICovCisJCWRhdGEgPSAoICggdm9pZCAqICkgaW1hZ2UtPmRhdGEgKTsKKwkJaW1hZ2UtPmRhdGEgPSB2aXJ0X3RvX3VzZXIgKCBkYXRhICk7CisKKwkJREJHICggIkVtYmVkZGVkIGltYWdlIFwiJXNcIjogJXpkIGJ5dGVzIGF0ICVwXG4iLAorCQkgICAgICBpbWFnZS0+bmFtZSwgaW1hZ2UtPmxlbiwgZGF0YSApOworCisJCWlmICggKCByYyA9IHJlZ2lzdGVyX2ltYWdlICggaW1hZ2UgKSApICE9IDAgKSB7CisJCQlEQkcgKCAiQ291bGQgbm90IHJlZ2lzdGVyIGVtYmVkZGVkIGltYWdlIFwiJXNcIjogIgorCQkJICAgICAgIiVzXG4iLCBpbWFnZS0+bmFtZSwgc3RyZXJyb3IgKCByYyApICk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBMb2FkIHRoZSBmaXJzdCBpbWFnZSAqLworCWltYWdlID0gJmVtYmVkZGVkX2ltYWdlc1swXTsKKwlpZiAoICggcmMgPSBpbWFnZV9hdXRvbG9hZCAoIGltYWdlICkgKSAhPSAwICkgeworCQlEQkcgKCAiQ291bGQgbm90IGxvYWQgZW1iZWRkZWQgaW1hZ2UgXCIlc1wiOiAlc1xuIiwKKwkJICAgICAgaW1hZ2UtPm5hbWUsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm47CisJfQorfQorCisvKiogRW1iZWRkZWQgaW1hZ2UgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gKi8KK3N0cnVjdCBpbml0X2ZuIGVtYmVkZGVkX2luaXRfZm4gX19pbml0X2ZuICggSU5JVF9OT1JNQUwgKSA9IHsKKwkuaW5pdGlhbGlzZSA9IGVtYmVkZGVkX2luaXQsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW1hZ2Uvc2NyaXB0LmMgYi9ncHhlL3NyYy9pbWFnZS9zY3JpcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODM1ZWNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW1hZ2Uvc2NyaXB0LmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBnUFhFIHNjcmlwdHMKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2ltYWdlLmg+CisKK3N0cnVjdCBpbWFnZV90eXBlIHNjcmlwdF9pbWFnZV90eXBlIF9faW1hZ2VfdHlwZSAoIFBST0JFX05PUk1BTCApOworCisvKioKKyAqIEV4ZWN1dGUgc2NyaXB0CisgKgorICogQHYgaW1hZ2UJCVNjcmlwdAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc2NyaXB0X2V4ZWMgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgeworCXNpemVfdCBvZmZzZXQgPSAwOworCW9mZl90IGVvbDsKKwlzaXplX3QgbGVuOworCWludCByYzsKKworCS8qIFRlbXBvcmFyaWx5IGRlLXJlZ2lzdGVyIGltYWdlLCBzbyB0aGF0IGEgImJvb3QiIGNvbW1hbmQKKwkgKiBkb2Vzbid0IHRocm93IHVzIGludG8gYW4gZXhlY3V0aW9uIGxvb3AuCisJICovCisJdW5yZWdpc3Rlcl9pbWFnZSAoIGltYWdlICk7CisKKwl3aGlsZSAoIG9mZnNldCA8IGltYWdlLT5sZW4gKSB7CisJCisJCS8qIEZpbmQgbGVuZ3RoIG9mIG5leHQgbGluZSwgZXhjbHVkaW5nIGFueSB0ZXJtaW5hdGluZyAnXG4nICovCisJCWVvbCA9IG1lbWNocl91c2VyICggaW1hZ2UtPmRhdGEsIG9mZnNldCwgJ1xuJywKKwkJCQkgICAgKCBpbWFnZS0+bGVuIC0gb2Zmc2V0ICkgKTsKKwkJaWYgKCBlb2wgPCAwICkKKwkJCWVvbCA9IGltYWdlLT5sZW47CisJCWxlbiA9ICggZW9sIC0gb2Zmc2V0ICk7CisKKwkJLyogQ29weSBsaW5lLCB0ZXJtaW5hdGUgd2l0aCBOVUwsIGFuZCBleGVjdXRlIGNvbW1hbmQgKi8KKwkJeworCQkJY2hhciBjbWRidWZbIGxlbiArIDEgXTsKKworCQkJY29weV9mcm9tX3VzZXIgKCBjbWRidWYsIGltYWdlLT5kYXRhLCBvZmZzZXQsIGxlbiApOworCQkJY21kYnVmW2xlbl0gPSAnXDAnOworCQkJREJHICggIiQgJXNcbiIsIGNtZGJ1ZiApOworCQkJaWYgKCAoIHJjID0gc3lzdGVtICggY21kYnVmICkgKSAhPSAwICkgeworCQkJCURCRyAoICJDb21tYW5kIFwiJXNcIiBmYWlsZWQ6ICVzXG4iLAorCQkJCSAgICAgIGNtZGJ1Ziwgc3RyZXJyb3IgKCByYyApICk7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJCQorCQkvKiBNb3ZlIHRvIG5leHQgbGluZSAqLworCQlvZmZzZXQgKz0gKCBsZW4gKyAxICk7CisJfQorCisJcmMgPSAwOworIGRvbmU6CisJLyogUmUtcmVnaXN0ZXIgaW1hZ2UgYW5kIHJldHVybiAqLworCXJlZ2lzdGVyX2ltYWdlICggaW1hZ2UgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogTG9hZCBzY3JpcHQgaW50byBtZW1vcnkKKyAqCisgKiBAdiBpbWFnZQkJU2NyaXB0CisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBzY3JpcHRfbG9hZCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJc3RhdGljIGNvbnN0IGNoYXIgbWFnaWNbXSA9ICIjIWdweGUiOworCWNoYXIgdGVzdFsgc2l6ZW9mICggbWFnaWMgKSAtIDEgLyogTlVMICovICsgMSAvKiB0ZXJtaW5hdGluZyBzcGFjZSAqL107CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIGltYWdlLT5sZW4gPCBzaXplb2YgKCB0ZXN0ICkgKSB7CisJCURCRyAoICJUb28gc2hvcnQgdG8gYmUgYSBzY3JpcHRcbiIgKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCS8qIENoZWNrIGZvciBtYWdpYyBzaWduYXR1cmUgKi8KKwljb3B5X2Zyb21fdXNlciAoIHRlc3QsIGltYWdlLT5kYXRhLCAwLCBzaXplb2YgKCB0ZXN0ICkgKTsKKwlpZiAoICggbWVtY21wICggdGVzdCwgbWFnaWMsICggc2l6ZW9mICggdGVzdCApIC0gMSApICkgIT0gMCApIHx8CisJICAgICAhIGlzc3BhY2UgKCB0ZXN0WyBzaXplb2YgKCB0ZXN0ICkgLSAxIF0gKSApIHsKKwkJREJHICggIkludmFsaWQgbWFnaWMgc2lnbmF0dXJlXG4iICk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkvKiBUaGlzIGlzIGEgc2NyaXB0ICovCisJaW1hZ2UtPnR5cGUgPSAmc2NyaXB0X2ltYWdlX3R5cGU7CisKKwkvKiBXZSBkb24ndCBhY3R1YWxseSBsb2FkIGl0IGFueXdoZXJlOyB3ZSB3aWxsIHBpY2sgdGhlIGxpbmVzCisJICogb3V0IG9mIHRoZSBpbWFnZSBhcyB3ZSBuZWVkIHRoZW0uCisJICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqIFNjcmlwdCBpbWFnZSB0eXBlICovCitzdHJ1Y3QgaW1hZ2VfdHlwZSBzY3JpcHRfaW1hZ2VfdHlwZSBfX2ltYWdlX3R5cGUgKCBQUk9CRV9OT1JNQUwgKSA9IHsKKwkubmFtZSA9ICJzY3JpcHQiLAorCS5sb2FkID0gc2NyaXB0X2xvYWQsCisJLmV4ZWMgPSBzY3JpcHRfZXhlYywKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbWFnZS9zZWdtZW50LmMgYi9ncHhlL3NyYy9pbWFnZS9zZWdtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0NzQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2ltYWdlL3NlZ21lbnQuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEBmaWxlCisgKgorICogRXhlY3V0YWJsZSBpbWFnZSBzZWdtZW50cworICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL21lbW1hcC5oPgorI2luY2x1ZGUgPGdweGUvZXJyb3J0YWIuaD4KKyNpbmNsdWRlIDxncHhlL3NlZ21lbnQuaD4KKworLyoqCisgKiBQcmVwYXJlIHNlZ21lbnQgZm9yIGxvYWRpbmcKKyAqCisgKiBAdiBzZWdtZW50CQlTZWdtZW50IHN0YXJ0CisgKiBAdiBmaWxlc3oJCVNpemUgb2YgdGhlICJhbGxvY2F0ZWQgYnl0ZXMiIHBvcnRpb24gb2YgdGhlIHNlZ21lbnQKKyAqIEB2IG1lbXN6CQlTaXplIG9mIHRoZSBzZWdtZW50CisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHByZXBfc2VnbWVudCAoIHVzZXJwdHJfdCBzZWdtZW50LCBzaXplX3QgZmlsZXN6LCBzaXplX3QgbWVtc3ogKSB7CisJc3RydWN0IG1lbW9yeV9tYXAgbWVtbWFwOworCXBoeXNhZGRyX3Qgc3RhcnQgPSB1c2VyX3RvX3BoeXMgKCBzZWdtZW50LCAwICk7CisJcGh5c2FkZHJfdCBtaWQgPSB1c2VyX3RvX3BoeXMgKCBzZWdtZW50LCBmaWxlc3ogKTsKKwlwaHlzYWRkcl90IGVuZCA9IHVzZXJfdG9fcGh5cyAoIHNlZ21lbnQsIG1lbXN6ICk7CisJdW5zaWduZWQgaW50IGk7CisKKwlEQkcgKCAiUHJlcGFyaW5nIHNlZ21lbnQgWyVseCwlbHgsJWx4KVxuIiwgc3RhcnQsIG1pZCwgZW5kICk7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIGZpbGVzeiA+IG1lbXN6ICkgeworCQlEQkcgKCAiSW5zYW5lIHNlZ21lbnQgWyVseCwlbHgsJWx4KVxuIiwgc3RhcnQsIG1pZCwgZW5kICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEdldCBhIGZyZXNoIG1lbW9yeSBtYXAuICBUaGlzIGFsbG93cyB1cyB0byBhdXRvbWF0aWNhbGx5CisJICogYXZvaWQgdHJlYWRpbmcgb24gYW55IHJlZ2lvbnMgdGhhdCBFdGhlcmJvb3QgaXMgY3VycmVudGx5CisJICogZWRpdGluZyBvdXQgb2YgdGhlIG1lbW9yeSBtYXAuCisJICovCisJZ2V0X21lbW1hcCAoICZtZW1tYXAgKTsKKworCS8qIExvb2sgZm9yIGEgc3VpdGFibGUgbWVtb3J5IHJlZ2lvbiAqLworCWZvciAoIGkgPSAwIDsgaSA8IG1lbW1hcC5jb3VudCA7IGkrKyApIHsKKwkJaWYgKCAoIHN0YXJ0ID49IG1lbW1hcC5yZWdpb25zW2ldLnN0YXJ0ICkgJiYKKwkJICAgICAoIGVuZCA8PSBtZW1tYXAucmVnaW9uc1tpXS5lbmQgKSApIHsKKwkJCS8qIEZvdW5kIHZhbGlkIHJlZ2lvbjogemVybyBic3MgYW5kIHJldHVybiAqLworCQkJbWVtc2V0X3VzZXIgKCBzZWdtZW50LCBmaWxlc3osIDAsICggbWVtc3ogLSBmaWxlc3ogKSApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBObyBzdWl0YWJsZSBtZW1vcnkgcmVnaW9uIGZvdW5kICovCisJREJHICggIlNlZ21lbnQgWyVseCwlbHgsJWx4KSBkb2VzIG5vdCBmaXQgaW50byBhdmFpbGFibGUgbWVtb3J5XG4iLAorCSAgICAgIHN0YXJ0LCBtaWQsIGVuZCApOworCXJldHVybiAtRVJBTkdFOworfQorCisvKioKKyAqIFNlZ21lbnQtc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMKKyAqCisgKiBUaGlzIGVycm9yIGhhcHBlbnMgc3VmZmljaWVudGx5IG9mdGVuIHRvIG1lcml0IGEgdXNlci1mcmllbmRseQorICogZGVzY3JpcHRpb24uCisgKi8KK3N0cnVjdCBlcnJvcnRhYiBzZWdtZW50X2Vycm9yc1tdIF9fZXJyb3J0YWIgPSB7CisJeyBFUkFOR0UsICJSZXF1ZXN0ZWQgbWVtb3J5IG5vdCBhdmFpbGFibGUiIH0sCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9hbGxvY2EuaCBiL2dweGUvc3JjL2luY2x1ZGUvYWxsb2NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzOThmYgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvYWxsb2NhLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfQUxMT0NBX0gKKyNkZWZpbmUgX0FMTE9DQV9ICisKKy8qKgorICogQGZpbGUKKyAqCisgKiBUZW1wb3JhcnkgbWVtb3J5IGFsbG9jYXRpb24KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIEFsbG9jYXRlIHRlbXBvcmFyeSBtZW1vcnkgZnJvbSB0aGUgc3RhY2sKKyAqCisgKiBAdiBzaXplCQlTaXplIHRvIGFsbG9jYXRlCisgKiBAcmV0IHB0cgkJQWxsb2NhdGVkIG1lbW9yeQorICoKKyAqIFRoaXMgbWVtb3J5IHdpbGwgYmUgZnJlZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBjb250YWluaW5nCisgKiBmdW5jdGlvbiByZXR1cm5zLiAgVGhlcmUgYXJlIHNldmVyYWwgY2F2ZWF0cyByZWdhcmRpbmcgdXNlIG9mCisgKiBhbGxvY2EoKTsgdXNlIGl0IG9ubHkgaWYgeW91IGFscmVhZHkga25vdyB3aGF0IHRoZXkgYXJlLgorICovCisjZGVmaW5lIGFsbG9jYShzaXplKSBfX2J1aWx0aW5fYWxsb2NhICggc2l6ZSApCisKKyNlbmRpZiAvKiBfQUxMT0NBX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvYXNzZXJ0LmggYi9ncHhlL3NyYy9pbmNsdWRlL2Fzc2VydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzg0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2Fzc2VydC5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgX0FTU0VSVF9ICisjZGVmaW5lIF9BU1NFUlRfSAorCisvKiogQGZpbGUKKyAqCisgKiBBc3NlcnRpb25zCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIHR3byBhc3NlcnRpb24gbWFjcm9zOiBhc3NlcnQoKSAoZm9yIHJ1bi10aW1lCisgKiBhc3NlcnRpb25zKSBhbmQgbGlua2VyX2Fzc2VydCgpIChmb3IgbGluay10aW1lIGFzc2VydGlvbnMpLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZmRlZiBOREVCVUcKKyNkZWZpbmUgQVNTRVJUSU5HIDAKKyNlbHNlCisjZGVmaW5lIEFTU0VSVElORyAxCisjZW5kaWYKKworLyoqIHByaW50ZigpIGZvciBhc3NlcnRpb25zCisgKgorICogVGhpcyBmdW5jdGlvbiBleGlzdHMgc28gdGhhdCB0aGUgYXNzZXJ0KCkgbWFjcm8gY2FuIGV4cGFuZCB0bworICogcHJpbnRmKCkgY2FsbHMgd2l0aG91dCBkcmFnZ2luZyB0aGUgcHJpbnRmKCkgcHJvdG90eXBlIGludG8gc2NvcGUuCisgKgorICogQXMgZmFyIGFzIHRoZSBjb21waWxlciBpcyBjb25jZXJuZWQsIGFzc2VydF9wcmludGYoKSBhbmQgcHJpbnRmKCkgYXJlCisgKiBjb21wbGV0ZWx5IHVucmVsYXRlZCBjYWxsczsgaXQncyBvbmx5IGF0IHRoZSBhc3NlbWJseSBzdGFnZSB0aGF0CisgKiByZWZlcmVuY2VzIHRvIHRoZSBhc3NlcnRfcHJpbnRmIHN5bWJvbCBhcmUgY29sbGFwc2VkIGludG8gcmVmZXJlbmNlcworICogdG8gdGhlIHByaW50ZiBzeW1ib2wuCisgKi8KK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXyAoKCBmb3JtYXQgKCBwcmludGYsIDEsIDIgKSApKSAKK2Fzc2VydF9wcmludGYgKCBjb25zdCBjaGFyICpmbXQsIC4uLiApIGFzbSAoICJwcmludGYiICk7CisKKy8qKgorICogQXNzZXJ0IGEgY29uZGl0aW9uIGF0IHJ1bi10aW1lLgorICoKKyAqIElmIHRoZSBjb25kaXRpb24gaXMgbm90IHRydWUsIGEgZGVidWcgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQuCisgKiBBc3NlcnRpb25zIG9ubHkgdGFrZSBlZmZlY3QgaW4gZGVidWctZW5hYmxlZCBidWlsZHMgKHNlZSBEQkcoKSkuCisgKgorICogQHRvZG8gTWFrZSBhbiBhc3NlcnRpb24gZmFpbHVyZSBhYm9ydCB0aGUgcHJvZ3JhbQorICoKKyAqLworI2RlZmluZSBhc3NlcnQoIGNvbmRpdGlvbiApIAkJCQkJCSAgICAgXAorCWRvIHsgCQkJCQkJCQkgICAgIFwKKwkJaWYgKCBBU1NFUlRJTkcgJiYgISAoY29uZGl0aW9uKSApIHsgCQkJICAgICBcCisJCQlhc3NlcnRfcHJpbnRmICggImFzc2VydCglcykgZmFpbGVkIGF0ICVzIGxpbmUgJWRcbiIsIFwKKwkJCQkJI2NvbmRpdGlvbiwgX19GSUxFX18sIF9fTElORV9fICk7ICAgIFwKKwkJfSAJCQkJCQkJICAgICBcCisJfSB3aGlsZSAoIDAgKQorCisvKioKKyAqIEFzc2VydCBhIGNvbmRpdGlvbiBhdCBsaW5rLXRpbWUuCisgKgorICogSWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSwgdGhlIGxpbmsgd2lsbCBmYWlsIHdpdGggYW4gdW5yZXNvbHZlZAorICogc3ltYm9sIChlcnJvcl9zeW1ib2wpLgorICoKKyAqIFRoaXMgbWFjcm8gaXMgZ1BYRS1zcGVjaWZpYy4gIERvIG5vdCB1c2UgdGhpcyBtYWNybyBpbiBjb2RlCisgKiBpbnRlbmRlZCB0byBiZSBwb3J0YWJsZS4KKyAqCisgKi8KKyNkZWZpbmUgbGlua2VyX2Fzc2VydCggY29uZGl0aW9uLCBlcnJvcl9zeW1ib2wgKQlcCisgICAgICAgIGlmICggISAoY29uZGl0aW9uKSApIHsJCQkJXAorICAgICAgICAgICAgICAgIGV4dGVybiB2b2lkIGVycm9yX3N5bWJvbCAoIHZvaWQgKTsJXAorICAgICAgICAgICAgICAgIGVycm9yX3N5bWJvbCgpOwkJCQlcCisgICAgICAgIH0KKworI2VuZGlmIC8qIF9BU1NFUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9iaWdfYnN3YXAuaCBiL2dweGUvc3JjL2luY2x1ZGUvYmlnX2Jzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NWZhYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvYmlnX2Jzd2FwLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBFVEhFUkJPT1RfQklHX0JTV0FQX0gKKyNkZWZpbmUgRVRIRVJCT09UX0JJR19CU1dBUF9ICisKKyNkZWZpbmUgbnRvaGwoeCkgCSh4KQorI2RlZmluZSBodG9ubCh4KSAJKHgpCisjZGVmaW5lIG50b2hzKHgpIAkoeCkKKyNkZWZpbmUgaHRvbnMoeCkgCSh4KQorI2RlZmluZSBjcHVfdG9fbGU2NCh4KQlfX2Jzd2FwXzY0KHgpCisjZGVmaW5lIGNwdV90b19sZTMyKHgpCV9fYnN3YXBfMzIoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMTYoeCkJX19ic3dhcF8xNih4KQorI2RlZmluZSBjcHVfdG9fYmU2NCh4KQkoeCkKKyNkZWZpbmUgY3B1X3RvX2JlMzIoeCkJKHgpCisjZGVmaW5lIGNwdV90b19iZTE2KHgpCSh4KQorI2RlZmluZSBsZTY0X3RvX2NwdSh4KQlfX2Jzd2FwXzY0KHgpCisjZGVmaW5lIGxlMzJfdG9fY3B1KHgpCV9fYnN3YXBfMzIoeCkKKyNkZWZpbmUgbGUxNl90b19jcHUoeCkJX19ic3dhcF8xNih4KQorI2RlZmluZSBiZTY0X3RvX2NwdSh4KQkoeCkKKyNkZWZpbmUgYmUzMl90b19jcHUoeCkJKHgpCisjZGVmaW5lIGJlMTZfdG9fY3B1KHgpCSh4KQorI2RlZmluZSBjcHVfdG9fbGU2NHMoeCkgX19ic3dhcF82NHMoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMzJzKHgpIF9fYnN3YXBfMzJzKHgpCisjZGVmaW5lIGNwdV90b19sZTE2cyh4KSBfX2Jzd2FwXzE2cyh4KQorI2RlZmluZSBjcHVfdG9fYmU2NHMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNwdV90b19iZTMycyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY3B1X3RvX2JlMTZzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBsZTY0X3RvX2NwdXMoeCkgX19ic3dhcF82NHMoeCkKKyNkZWZpbmUgbGUzMl90b19jcHVzKHgpIF9fYnN3YXBfMzJzKHgpCisjZGVmaW5lIGxlMTZfdG9fY3B1cyh4KSBfX2Jzd2FwXzE2cyh4KQorI2RlZmluZSBiZTY0X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGJlMzJfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgYmUxNl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYgLyogRVRIRVJCT09UX0JJR19CU1dBUF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2Jvb3RwLmggYi9ncHhlL3NyYy9pbmNsdWRlL2Jvb3RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2NTQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvYm9vdHAuaApAQCAtMCwwICsxLDIzMCBAQAorI2lmbmRlZglfQk9PVFBfSAorI2RlZmluZQlfQk9PVFBfSAorCisjaWZkZWYJQUxURVJOQVRFX0RIQ1BfUE9SVFNfMTA2N18xMDY4CisjdW5kZWYJTk9OX1NUQU5EQVJEX0JPT1RQX1NFUlZFUgorI2RlZmluZQlOT05fU1RBTkRBUkRfQk9PVFBfU0VSVkVSCTEwNjcKKyN1bmRlZglOT05fU1RBTkRBUkRfQk9PVFBfQ0xJRU5UCisjZGVmaW5lCU5PTl9TVEFOREFSRF9CT09UUF9DTElFTlQJMTA2OAorI2VuZGlmCisKKyNpZmRlZglOT05fU1RBTkRBUkRfQk9PVFBfU0VSVkVSCisjZGVmaW5lCUJPT1RQX1NFUlZFUglOT05fU1RBTkRBUkRfQk9PVFBfU0VSVkVSCisjZWxzZQorI2RlZmluZSBCT09UUF9TRVJWRVIJNjcKKyNlbmRpZgorI2lmZGVmCU5PTl9TVEFOREFSRF9CT09UUF9DTElFTlQKKyNkZWZpbmUJQk9PVFBfQ0xJRU5UCU5PTl9TVEFOREFSRF9CT09UUF9DTElFTlQKKyNlbHNlCisjZGVmaW5lIEJPT1RQX0NMSUVOVAk2OAorI2VuZGlmCisjZGVmaW5lIFBST1hZREhDUF9TRVJWRVIJNDAxMSAvKiBGb3IgUFhFICovCisKKyNkZWZpbmUgQk9PVFBfUkVRVUVTVAkxCisjZGVmaW5lIEJPT1RQX1JFUExZCTIKKworI2RlZmluZSBUQUdfTEVOKHApCQkoKigocCkrMSkpCisjZGVmaW5lIFJGQzE1MzNfQ09PS0lFCQk5OSwgMTMwLCA4MywgOTkKKyNkZWZpbmUgUkZDMTUzM19QQUQJCTAKKyNkZWZpbmUgUkZDMTUzM19ORVRNQVNLCQkxCisjZGVmaW5lIFJGQzE1MzNfVElNRU9GRlNFVAkyCisjZGVmaW5lIFJGQzE1MzNfR0FURVdBWQkJMworI2RlZmluZSBSRkMxNTMzX1RJTUVTRVJWRVIJNAorI2RlZmluZSBSRkMxNTMzX0lFTjExNk5TCTUKKyNkZWZpbmUgUkZDMTUzM19ETlMJCTYKKyNkZWZpbmUgUkZDMTUzM19MT0dTRVJWRVIJNworI2RlZmluZSBSRkMxNTMzX0NPT0tJRVNFUlZFUgk4CisjZGVmaW5lIFJGQzE1MzNfTFBSU0VSVkVSCTkKKyNkZWZpbmUgUkZDMTUzM19JTVBSRVNTU0VSVkVSCTEwCisjZGVmaW5lIFJGQzE1MzNfUkVTT1VSQ0VTRVJWRVIJMTEKKyNkZWZpbmUgUkZDMTUzM19IT1NUTkFNRQkxMgorI2RlZmluZSBSRkMxNTMzX0JPT1RGSUxFU0laRQkxMworI2RlZmluZSBSRkMxNTMzX01FUklURFVNUEZJTEUJMTQKKyNkZWZpbmUgUkZDMTUzM19ET01BSU5OQU1FCTE1CisjZGVmaW5lIFJGQzE1MzNfU1dBUFNFUlZFUgkxNgorI2RlZmluZSBSRkMxNTMzX1JPT1RQQVRICTE3CisjZGVmaW5lIFJGQzE1MzNfRVhURU5TSU9OUEFUSAkxOAorI2RlZmluZSBSRkMxNTMzX0lQRk9SV0FSRElORwkxOQorI2RlZmluZSBSRkMxNTMzX0lQU09VUkNFUk9VVElORwkyMAorI2RlZmluZSBSRkMxNTMzX0lQUE9MSUNZRklMVEVSCTIxCisjZGVmaW5lIFJGQzE1MzNfSVBNQVhSRUFTU0VNQkxZCTIyCisjZGVmaW5lIFJGQzE1MzNfSVBUVEwJCTIzCisjZGVmaW5lIFJGQzE1MzNfSVBNVFUJCTI0CisjZGVmaW5lIFJGQzE1MzNfSVBNVFVQTEFURUFVCTI1CisjZGVmaW5lIFJGQzE1MzNfSU5UTVRVCQkyNgorI2RlZmluZSBSRkMxNTMzX0lOVExPQ0FMU1VCTkVUUwkyNworI2RlZmluZSBSRkMxNTMzX0lOVEJST0FEQ0FTVAkyOAorI2RlZmluZSBSRkMxNTMzX0lOVElDTVBESVNDT1ZFUgkyOQorI2RlZmluZSBSRkMxNTMzX0lOVElDTVBSRVNQT05ECTMwCisjZGVmaW5lIFJGQzE1MzNfSU5UUk9VVEVESVNDT1ZFUiAzMQorI2RlZmluZSBSRkMxNTMzX0lOVFJPVVRFU09MSUNJVAkzMgorI2RlZmluZSBSRkMxNTMzX0lOVFNUQVRJQ1JPVVRFUwkzMworI2RlZmluZSBSRkMxNTMzX0xMVFJBSUxFUkVOQ0FQCTM0CisjZGVmaW5lIFJGQzE1MzNfTExBUlBDQUNIRVRNTwkzNQorI2RlZmluZSBSRkMxNTMzX0xMRVRIRVJORVRFTkNBUAkzNgorI2RlZmluZSBSRkMxNTMzX1RDUFRUTAkJMzcKKyNkZWZpbmUgUkZDMTUzM19UQ1BLRUVQQUxJVkVUTU8JMzgKKyNkZWZpbmUgUkZDMTUzM19UQ1BLRUVQQUxJVkVHQgkzOQorI2RlZmluZSBSRkMxNTMzX05JU0RPTUFJTgk0MAorI2RlZmluZSBSRkMxNTMzX05JU1NFUlZFUgk0MQorI2RlZmluZSBSRkMxNTMzX05UUFNFUlZFUgk0MgorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUgkJNDMKKyNkZWZpbmUgUkZDMTUzM19OQk5TCQk0NAorI2RlZmluZSBSRkMxNTMzX05CREQJCTQ1CisjZGVmaW5lIFJGQzE1MzNfTkJOVAkJNDYKKyNkZWZpbmUgUkZDMTUzM19OQlNDT1BFCQk0NworI2RlZmluZSBSRkMxNTMzX1hGUwkJNDgKKyNkZWZpbmUgUkZDMTUzM19YRE0JCTQ5CisjaWZuZGVmCU5PX0RIQ1BfU1VQUE9SVAorI2RlZmluZSBSRkMyMTMyX1JFUV9BRERSCTUwCisjZGVmaW5lIFJGQzIxMzJfTVNHX1RZUEUJNTMKKyNkZWZpbmUgUkZDMjEzMl9TUlZfSUQJCTU0CisjZGVmaW5lIFJGQzIxMzJfUEFSQU1fTElTVAk1NQorI2RlZmluZSBSRkMyMTMyX01BWF9TSVpFCTU3CisjZGVmaW5lCVJGQzIxMzJfVkVORE9SX0NMQVNTX0lECTYwCisjZGVmaW5lIFJGQzIxMzJfQ0xJRU5UX0lEICAgICAgIDYxCisjZGVmaW5lCVJGQzIxMzJfVEZUUF9TRVJWRVJfTkFNRSA2NgorI2RlZmluZQlSRkMyMTMyX0JPT1RGSUxFX05BTUUJNjcKKyNkZWZpbmUgUkZDMzAwNF9VU0VSX0NMQVNTICAgICAgNzcKKworI2lmZGVmIFBYRV9ESENQX1NUUklDVAorLyoKKyAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYWNrbm93bGVkZ2VkIGluIFJGQzM2NzkgYmVjYXVzZSB0aGV5IGFyZQorICogd2lkZWx5IHVzZWQgYnkgUFhFIGltcGxlbWVudGF0aW9ucywgYnV0IGhhdmUgbmV2ZXIgYmVlbiBwcm9wZXJseQorICogYWxsb2NhdGVkLiBEZXNwaXRlIG90aGVyIFBYRSBvcHRpb25zIGJlaW5nIGNvcnJlY3RseSBwYWNrZWQgaW4gYQorICogdmVuZG9yIGVuY2Fwc3VsYXRlZCBmaWVsZCwgdGhlc2UgYXJlIGV4cG9zZWQuIFNpZ2guICBOb3RlIHRoYXQgdGhlCisgKiBjbGllbnQgVVVJRCAob3B0aW9uIDk3KSBpcyBhbHNvIG5vdGVkIGluIHRoZSBQWEUgc3BlYyBhcyB1c2luZworICogb3B0aW9uIDYxLgorICovCisjZGVmaW5lIFJGQzM2NzlfUFhFX0NMSUVOVF9BUkNIIDkzCisjZGVmaW5lIFJGQzM2NzlfUFhFX0NMSUVOVF9OREkgIDk0CisjZGVmaW5lIFJGQzM2NzlfUFhFX0NMSUVOVF9VVUlEIDk3CisKKy8qIFRoZSBsZW5ndGhzIGFyZSBmaXhlZC4gKi8KKyNkZWZpbmUgUkZDMzY3OV9QWEVfQ0xJRU5UX0FSQ0hfTEVOR1RIIDIKKyNkZWZpbmUgUkZDMzY3OV9QWEVfQ0xJRU5UX05ESV9MRU5HVEggMworI2RlZmluZSBSRkMzNjc5X1BYRV9DTElFTlRfVVVJRF9MRU5HVEggMTcKKworLyoKKyAqIFZhbHVlcyBvZiBSRkMzNjc5X1BYRV9DTElFTlRfQVJDSCBjYW4gYXBwYXJlbnRseSBiZSBvbmUgb2YgdGhlCisgKiBmb2xsb3dpbmcsIGFjY29yZGluZyB0byB0aGUgUFhFIHNwZWMuIFRoZSBzcGVjIG9ubHkgYWN0dWFsbHkKKyAqIGRlc2NyaWJlZCB0aGUgMm5kIG9jdGV0LCBub3QgdGhlIGZpcnN0LiBEdWguLi4gYXNzdW1lIDAuCisgKi8KKyNkZWZpbmUgUkZDMzY3OV9QWEVfQ0xJRU5UX0FSQ0hfSUFYODZQQyAgIDAsMAorI2RlZmluZSBSRkMzNjc5X1BYRV9DTElFTlRfQVJDSF9ORUNQQzk4ICAgMCwxCisjZGVmaW5lIFJGQzM2NzlfUFhFX0NMSUVOVF9BUkNIX0lBNjRQQyAgICAwLDIKKyNkZWZpbmUgUkZDMzY3OV9QWEVfQ0xJRU5UX0FSQ0hfREVDQUxQSEEgIDAsMworI2RlZmluZSBSRkMzNjc5X1BYRV9DTElFTlRfQVJDSF9BUkNYODYgICAgMCw0CisjZGVmaW5lIFJGQzM2NzlfUFhFX0NMSUVOVF9BUkNIX0lOVEVMTEVBTiAwLDUKKworLyogCisgKiBPbmx5IG9uZSB2YWxpZCB2YWx1ZSBvZiBOREkgdHlwZSAobXVzdCBiZSAxKSBhbmQgVU5ESSB2ZXJzaW9uIChtdXN0CisgKiBiZSAyLjEpCisgKi8KKyNkZWZpbmUgUkZDMzY3OV9QWEVfQ0xJRU5UX05ESV8yMSAxLDIsMQorCisvKgorICogVVVJRCAtIHR5cGUgbXVzdCBiZSAxIGFuZCB0aGVuIDE2IG9jdGV0cyBvZiBVSUQsIGFzIHdpdGggdGhlIGNsaWVudCBJRC4KKyAqIFRoZSB2YWx1ZSBpcyBhIGRlZmF1bHQgZm9yIHRlc3Rpbmcgb25seQorICovCisjZGVmaW5lIFJGQzM2NzlfUFhFX0NMSUVOVF9VVUlEX1RZUEUgMAorI3dhcm5pbmcgIlVVSUQgaXMgYSBkZWZhdWx0IGZvciB0ZXN0aW5nIE9OTFkhIgorI2RlZmluZSBSRkMzNjc5X1BYRV9DTElFTlRfVVVJRF9ERUZBVUxUIFwKKyAgICAgICAgUkZDMzY3OV9QWEVfQ0xJRU5UX1VVSURfVFlQRSwgXAorICAgICAgICAweERFLDB4QUQsMHhCRSwweEVGLCBcCisgICAgICAgIDB4REUsMHhBRCwweEJFLDB4RUYsIFwKKyAgICAgICAgMHhERSwweEFELDB4QkUsMHhFRiwgXAorICAgICAgICAweERFLDB4QUQsMHhCRSwweEVGCisvKgorICogVGhlIFZlbmRvciBDbGFzcyBJRC4gTm90ZSB0aGF0IHRoZSBBcmNoIGFuZCBVTkRJIHZlcnNpb24gbnVtYmVycworICogYXJlIGZpeGVkIGFuZCBtdXN0IGJlIHNhbWUgYXMgdGhlIEFSQ0ggYW5kIE5ESSBhYm92ZS4KKyAqLworI2RlZmluZSBSRkMyMTMyX1ZFTkRPUl9DTEFTU19JRF9QWEVfTEVOR1RIIDMyCisjZGVmaW5lIFJGQzIxMzJfVkVORE9SX0NMQVNTX0lEX1BYRSBcCisgICAgICAgICdQJywnWCcsJ0UnLCdDJywnbCcsJ2knLCdlJywnbicsJ3QnLCc6JywgXAorICAgICAgICAnQScsJ3InLCdjJywnaCcsJzonLCcwJywnMCcsJzAnLCcwJywnMCcsJzonLCBcCisgICAgICAgICdVJywnTicsJ0QnLCdJJywnOicsJzAnLCcwJywnMicsJzAnLCcwJywnMScKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdmVuZG9yIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGluIHRoZSBQWEUgc3BlYyB0byBwdWxsCisgKiBvcHRpb25zIGZvciB0aGUgKm5leHQqIGltYWdlLiBUaGUgUFhFIHNwZWMgZG9lc24ndCBoZWxwIHVzIHdpdGgKKyAqIHRoaXMgKGxpa2UgZXhwbGFpbmluZyB3aHkpLgorICovCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX1BYRV9PUFQxMjggMTI4CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX1BYRV9PUFQxMjkgMTI5CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX1BYRV9PUFQxMzAgMTMwCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX1BYRV9PUFQxMzEgMTMxCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX1BYRV9PUFQxMzIgMTMyCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX1BYRV9PUFQxMzMgMTMzCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX1BYRV9PUFQxMzQgMTM0CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX1BYRV9PUFQxMzUgMTM1CisKKyNlbmRpZiAvKiBQWEVfREhDUF9TVFJJQ1QgKi8KKworI2RlZmluZSBESENQRElTQ09WRVIJCTEKKyNkZWZpbmUgREhDUE9GRkVSCQkyCisjZGVmaW5lIERIQ1BSRVFVRVNUCQkzCisjZGVmaW5lIERIQ1BBQ0sJCQk1CisjZW5kaWYJLyogTk9fREhDUF9TVVBQT1JUICovCisKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUFKT1IJMAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NSU5PUgkwCisKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUFHSUMJMTI4CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0FERFBBUk0JMTI5CisjZGVmaW5lCVJGQzE1MzNfVkVORE9SX0VUSERFVgkxMzAKKy8qIFdlIHNob3VsZCByZWFsbHkgYXBwbHkgZm9yIGFuIG9mZmljaWFsIEV0aGVyYm9vdCBlbmNhcCBvcHRpb24gKi8KKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfRVRIRVJCT09UX0VOQ0FQIDE1MAorLyogSSdsbCBsZWF2ZSBpdCB0byBGUkVFQlNEIHRvIGRlY2lkZSBpZiB0aGV5IHdhbnQgdG8gcmVudW1iZXIgKi8KKyNpZmRlZglJTUFHRV9GUkVFQlNECisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0hPV1RPICAgIDEzMgorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9LRVJORUxfRU5WICAgIDEzMworI2VuZGlmCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX05JQ19ERVZfSUQgMTc1CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0FSQ0ggICAgIDE3NworCisjZGVmaW5lIFJGQzE1MzNfRU5ECQkyNTUKKworI2RlZmluZSBCT09UUF9WRU5ET1JfTEVOCTY0CisjaWZuZGVmCU5PX0RIQ1BfU1VQUE9SVAorI2RlZmluZSBESENQX09QVF9MRU4JCTMxMgorI2VuZGlmCS8qIE5PX0RIQ1BfU1VQUE9SVCAqLworCisvKiBGb3JtYXQgb2YgYSBib290cCBwYWNrZXQgKi8KK3N0cnVjdCBib290cF90IHsKKwl1aW50OF90ICBicF9vcDsKKwl1aW50OF90ICBicF9odHlwZTsKKwl1aW50OF90ICBicF9obGVuOworCXVpbnQ4X3QgIGJwX2hvcHM7CisJdWludDMyX3QgYnBfeGlkOworCXVpbnQxNl90IGJwX3NlY3M7CisJdWludDE2X3QgdW51c2VkOworCWluX2FkZHIgYnBfY2lhZGRyOworCWluX2FkZHIgYnBfeWlhZGRyOworCWluX2FkZHIgYnBfc2lhZGRyOworCWluX2FkZHIgYnBfZ2lhZGRyOworCXVpbnQ4X3QgIGJwX2h3YWRkclsxNl07CisJdWludDhfdCAgYnBfc25hbWVbNjRdOworCWNoYXIgICAgIGJwX2ZpbGVbMTI4XTsKKyNpZmRlZglOT19ESENQX1NVUFBPUlQKKwl1aW50OF90ICBicF92ZW5kW0JPT1RQX1ZFTkRPUl9MRU5dOworI2Vsc2UKKwl1aW50OF90ICBicF92ZW5kW0RIQ1BfT1BUX0xFTl07CisjZW5kaWYJLyogTk9fREhDUF9TVVBQT1JUICovCit9OworCisvKiBGb3JtYXQgb2YgYSBib290cCBJUCBwYWNrZXQgKi8KK3N0cnVjdCBib290cGlwX3QKK3sKKwlzdHJ1Y3QgaXBoZHIgaXA7CisJc3RydWN0IHVkcGhkciB1ZHA7CisJc3RydWN0IGJvb3RwX3QgYnA7Cit9OworCisvKiBGb3JtYXQgb2YgYm9vdHAgcGFja2V0IHdpdGggZXh0ZW5zaW9ucyAqLworc3RydWN0IGJvb3RwZF90IHsKKwlzdHJ1Y3QgYm9vdHBfdCBib290cF9yZXBseTsKKwl1aW50OF90IGJvb3RwX2V4dGVuc2lvbltNQVhfQk9PVFBfRVhUTEVOXTsKK307CisKKyNlbmRpZgkvKiBfQk9PVFBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9idGV4dC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9idGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkM2Y5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2J0ZXh0LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBwYXNzZWQgZnJvbSB0aGUgQm9vdFggYXBwbGljYXRpb24KKyAqIChmb3IgTWFjT1MpIHdoZW4gaXQgaXMgdXNlZCB0byBib290IExpbnV4LgorICoKKyAqIFdyaXR0ZW4gYnkgQmVuamFtaW4gSGVycmVuc2NobWlkdC4KKyAqICAKKyAqIE1vdmUgdG8gTGludXhCSU9TIGJ5IExZSCAgeWhsdUB0eWFuLmNvbQorICoKKyAqLworCisKKyNpZm5kZWYgX0JURVhUX0hfXworI2RlZmluZSBfQlRFWFRfSF9fCisKKyNpZiAxCisjZGVmaW5lIHUzMiB1bnNpZ25lZCBpbnQKKyNkZWZpbmUgdTE2IHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIHU4IHVuc2lnbmVkIGNoYXIKKyNlbmRpZgorCisvKiBIZXJlIGFyZSB0aGUgYm9vdCBpbmZvcm1hdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBib290c3RyYXAKKyAqIE5vdGUgdGhhdCB0aGUga2VybmVsIGFyZ3VtZW50cyBhbmQgdGhlIGRldmljZSB0cmVlIGFyZSBhcHBlbmRlZAorICogYXQgdGhlIGVuZCBvZiB0aGlzIHN0cnVjdHVyZS4gKi8KK3R5cGVkZWYgc3RydWN0IGJvb3RfaW5mb3MKK3sKKworICAgIC8qIE5FVyAodmVycy4gMikgdGhpcyBob2xkcyB0aGUgY3VycmVudCBfbG9naWNhbF8gYmFzZSBhZGRyIG9mCisgICAgICAgdGhlIGZyYW1lIGJ1ZmZlciAoZm9yIHVzZSBieSBlYXJseSBib290IG1lc3NhZ2UpICovCisgICAgdTgqICAgICAgIGxvZ2ljYWxEaXNwbGF5QmFzZTsKKworCisgICAgLyogU29tZSBpbmZvcyBhYm91dCB0aGUgY3VycmVudCBNYWNPUyBkaXNwbGF5ICovCisgICAgdTMyICAgICAgIGRpc3BEZXZpY2VSZWN0WzRdOyAgICAgICAvKiBsZWZ0LHRvcCxyaWdodCxib3R0b20gKi8KKyAgICB1MzIgICAgICAgZGlzcERldmljZURlcHRoOyAgICAgICAgIC8qICg4LCAxNiBvciAzMikgKi8KKyAgICB1MzIgICAgICAgZGlzcERldmljZUJhc2U7ICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyAocGh5c2ljYWwpICovCisgICAgdTMyICAgICAgIGRpc3BEZXZpY2VSb3dCeXRlczsgICAgICAvKiByb3dieXRlcyAoaW4gYnl0ZXMpICovCisgICAgdTMyICAgICAgIGRpc3BEZXZpY2VDb2xvcnNPZmZzZXQ7ICAvKiBDb2xvcm1hcCAoOCBiaXRzIG9ubHkpIG9yIDAgKCopICovCisKKworICAgIC8qIFRoZSBmcmFtZWJ1ZmZlciBzaXplIChvcHRpb25hbCwgY3VycmVudGx5IDApICovCisgICAgdTMyICAgICAgIGZyYW1lQnVmZmVyU2l6ZTsgICAgICAgICAvKiBSZXByZXNlbnRzIGEgbWF4IHNpemUsIGNhbiBiZSAwLiAqLworCisKK30gYm9vdF9pbmZvc190OworCisvKiAoKikgVGhlIGZvcm1hdCBvZiB0aGUgY29sb3JtYXAgaXMgMjU2ICogMyAqIDIgYnl0ZXMuIEVhY2ggY29sb3IgaW5kZXggaXMgcmVwcmVzZW50ZWQKKyAqIGJ5IDMgc2hvcnQgd29yZHMgY29udGFpbmluZyBhIDE2IGJpdHMgKHVuc2lnbmVkKSBjb2xvciBjb21wb25lbnQuCisgKiBMYXRlciB2ZXJzaW9ucyBtYXkgY29udGFpbiB0aGUgZ2FtbWEgdGFibGUgZm9yIGRpcmVjdC1jb2xvciBkZXZpY2VzIGhlcmUuCisgKi8KKyNkZWZpbmUgQk9PVFhfQ09MT1JUQUJMRV9TSVpFICAgICgyNTZVTCozVUwqMlVMKQorCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdXNpbmcgdGhlIHByb2NlZHVyZXMgaW4gYnRleHQuYy4KKyAqCisgKiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKi8KKworZXh0ZXJuIGJvb3RfaW5mb3NfdCBkaXNwX2JpOworZXh0ZXJuIHUzMiBib290X3RleHRfbWFwcGVkOworCisjZW5kaWYgLyogX0JURVhUX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvYnl0ZXN3YXAuaCBiL2dweGUvc3JjL2luY2x1ZGUvYnl0ZXN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjY3NTljCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ieXRlc3dhcC5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgRVRIRVJCT09UX0JZVEVTV0FQX0gKKyNkZWZpbmUgRVRIRVJCT09UX0JZVEVTV0FQX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSAiZW5kaWFuLmgiCisjaW5jbHVkZSAiYml0cy9ieXRlc3dhcC5oIgorCisjZGVmaW5lIF9fYnN3YXBfY29uc3RhbnRfMTYoeCkgXAorCSgodWludDE2X3QpKCgoKHVpbnQxNl90KSh4KSAmIDB4MDBmZikgPDwgOCkgfCBcCisJCSAgICAoKCh1aW50MTZfdCkoeCkgJiAweGZmMDApID4+IDgpKSkKKworI2RlZmluZSBfX2Jzd2FwX2NvbnN0YW50XzMyKHgpIFwKKwkoKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoeCkgJiAweDAwMDAwMGZmVSkgPDwgMjQpIHwgXAorCQkgICAgKCgodWludDMyX3QpKHgpICYgMHgwMDAwZmYwMFUpIDw8ICA4KSB8IFwKKwkJICAgICgoKHVpbnQzMl90KSh4KSAmIDB4MDBmZjAwMDBVKSA+PiAgOCkgfCBcCisJCSAgICAoKCh1aW50MzJfdCkoeCkgJiAweGZmMDAwMDAwVSkgPj4gMjQpKSkKKworI2RlZmluZSBfX2Jzd2FwX2NvbnN0YW50XzY0KHgpIFwKKwkoKHVpbnQ2NF90KSgoKCh1aW50NjRfdCkoeCkgJiAweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKKwkJICAgICgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwgXAorCQkgICAgKCgodWludDY0X3QpKHgpICYgMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCisJCSAgICAoKCh1aW50NjRfdCkoeCkgJiAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKKwkJICAgICgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgXAorCQkgICAgKCgodWludDY0X3QpKHgpICYgMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSA+PiAyNCkgfCBcCisJCSAgICAoKCh1aW50NjRfdCkoeCkgJiAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKKwkJICAgICgoKHVpbnQ2NF90KSh4KSAmIDB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpKSkKKworI2RlZmluZSBfX2Jzd2FwXzE2KHgpIFwKKwkoKHVpbnQxNl90KShfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSA/IFwKKwlfX2Jzd2FwX2NvbnN0YW50XzE2KHgpIDogXAorCV9fYnN3YXBfdmFyaWFibGVfMTYoeCkpKQorCisjZGVmaW5lIF9fYnN3YXBfMzIoeCkgXAorCSgodWludDMyX3QpKF9fYnVpbHRpbl9jb25zdGFudF9wKHgpID8gXAorCV9fYnN3YXBfY29uc3RhbnRfMzIoeCkgOiBcCisJX19ic3dhcF92YXJpYWJsZV8zMih4KSkpCisKKyNkZWZpbmUgX19ic3dhcF82NCh4KSBcCisJKCh1aW50NjRfdCkoX19idWlsdGluX2NvbnN0YW50X3AoeCkgPyBcCisJX19ic3dhcF9jb25zdGFudF82NCh4KSA6IFwKKwlfX2Jzd2FwX3ZhcmlhYmxlXzY0KHgpKSkKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNpbmNsdWRlICJsaXR0bGVfYnN3YXAuaCIKKyNlbmRpZgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNpbmNsdWRlICJiaWdfYnN3YXAuaCIKKyNlbmRpZgorCisvKiBNYWtlIHJvdXRpbmVzIGF2YWlsYWJsZSB0byBhbGwgKi8KKyNkZWZpbmUgc3dhcDY0KHgpCV9fYnN3YXBfNjQoeCkKKyNkZWZpbmUgc3dhcDMyKHgpCV9fYnN3YXBfMzIoeCkKKyNkZWZpbmUgc3dhcDE2KHgpCV9fYnN3YXBfMTYoeCkKKyNkZWZpbmUgYnN3YXBfNjQoeCkJX19ic3dhcF82NCh4KQorI2RlZmluZSBic3dhcF8zMih4KQlfX2Jzd2FwXzMyKHgpCisjZGVmaW5lIGJzd2FwXzE2KHgpCV9fYnN3YXBfMTYoeCkKKwkKKyNlbmRpZiAvKiBFVEhFUkJPT1RfQllURVNXQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9jbWRsaW5lLmggYi9ncHhlL3NyYy9pbmNsdWRlL2NtZGxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWIyOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9jbWRsaW5lLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIENNRExJTkVfSAorI2RlZmluZSBDTURMSU5FX0gKKworLyogQ29tbWFuZCBsaW5lIGV4dGVybmFsIGZ1bmN0aW9ucyAqLworCit2b2lkIGNtZGxfc3RhcnQoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2NtZGxpbmVsaWIuaCBiL2dweGUvc3JjL2luY2x1ZGUvY21kbGluZWxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjY4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2NtZGxpbmVsaWIuaApAQCAtMCwwICsxLDk5IEBACisvKiBDb21tYW5kIGxpbmUgbGlicmFyeSAqLworI2lmbmRlZiBDTURMSU5FTElCX0gKKyNkZWZpbmUgQ01ETElORUxJQl9ICisKKyNkZWZpbmUgQ01ETF9CVUZGRVJfU0laRSAyNTYKKy8vI2RlZmluZSBDTURMX09VVFBVVF9TSVpFIDI1NgorI2RlZmluZSBDTURMX1BST01QVF9TSVpFIDgKKyNkZWZpbmUgQ01ETF9NQVhfVEFCX0NPTVBMRVRFX1JFU1VMVCAyNTYKKwordHlwZWRlZiBpbnQgKCpjbWRsX3B1dGNoYXJfdCkoaW50KTsKK3R5cGVkZWYgaW50ICgqY21kbF9wcmludGZfdCkoIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uICk7Cit0eXBlZGVmIGludCAoKmNtZGxfZ2V0Y2hhcl90KSgpOworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAgICAoKHZvaWQgKikwKQorI2VuZGlmCisKK2VudW17CisJQ01ETF9MRUZULAorCUNNRExfUklHSFQKK307CisKK2VudW17CisJQ01ETEtfRlc9NiwKKwlDTURMS19CVz0yLAorCUNNRExLX0JTPTgsCisJQ01ETEtfSE9NRT0yLAorCUNNRExLX0VORD01LAorCUNNRExLX0RFTFRPRU5EPTExLAorCUNNRExLX0RFTEFSRz0yMywKKwlDTURMS19FTlRFUj0weDBkLAorCUNNRExLX1JFVFVSTj0weDBhLAorCUNNRExLX1RBQj05Cit9OworCit0eXBlZGVmIHN0cnVjdHsKKwkKKwkvLyBidWZmZXJzCisKKwkvL2NoYXIqIG91dHB1dDsKKwljaGFyKiBidWZmZXI7CisJY2hhciogcHJvbXB0OworCisJLy8gb3B0aW9ucyBhbmQgdmFsdWVzCisKKwlpbnQgY3Vyc29yOworCS8vaW50IGhhc19vdXRwdXQ7CisJaW50IGV4aXQ7CisJaW50IHJlZnJlc2g7CisJaW50IHRhYnN0YXRlOworCWludCBpbnNlcnQ7CisKKwkvLyBjYWxsYmFja3MKKwkKKwljbWRsX3B1dGNoYXJfdCBwdXRjaGFyOworCWNtZGxfZ2V0Y2hhcl90IGdldGNoYXI7CisJY21kbF9wcmludGZfdCBwcmludGY7CisKK31jbWRfbGluZTsKKwordHlwZWRlZiBzdHJ1Y3R7CisJaW50IGFyZ2M7CisJY2hhciAqKmFyZ3Y7Cit9Y21kbF9wYXJhbV9saXN0OworCit2b2lkIGNtZGxfc2V0cHV0Y2hhcihjbWRfbGluZSogY21kLCBjbWRsX3B1dGNoYXJfdCBpbik7Cit2b2lkIGNtZGxfc2V0Z2V0Y2hhcihjbWRfbGluZSogY21kLCBjbWRsX2dldGNoYXJfdCBpbik7Cit2b2lkIGNtZGxfc2V0cHJpbnRmKGNtZF9saW5lKiBjbWQsIGNtZGxfcHJpbnRmX3QgaW4pOworCisvL3ZvaWQgY21kbF9idWlsdGluX2hlbHAoY21kX2xpbmUqIGNtZCwgY2hhciogY29tbWFuZCk7CisKK3ZvaWQgY21kbF9wYXJzZWNoYXIoY21kX2xpbmUqIGNtZCwgY2hhciBpbik7CisKK3ZvaWQgY21kbF9hZGRyZXBsYWNlKGNtZF9saW5lKiBjbWQsIGNoYXIgaW4pOwordm9pZCBjbWRsX2FkZGluc2VydChjbWRfbGluZSogY21kLCBjaGFyIGluKTsKK3ZvaWQgY21kbF9lbnRlcmxvb3AoY21kX2xpbmUqIGNtZCk7Cit2b2lkIGNtZGxfZXhlYyhjbWRfbGluZSogY21kKTsKK3ZvaWQgY21kbF9zZXRleGl0KGNtZF9saW5lKiBjbWQsIGludCBleGl0KTsKK2ludCBjbWRsX2dldGV4aXQoY21kX2xpbmUqIGNtZCk7Cit2b2lkIGNtZGxfY2xlYXJvdXRwdXQoY21kX2xpbmUqIGNtZCk7Cit2b2lkIGNtZGxfY2xlYXJidWZmZXIoY21kX2xpbmUqIGNtZCk7CitpbnQgY21kbF9wcmludGYoY21kX2xpbmUqIGNtZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworY2hhciogY21kbF9nZXRvdXRwdXQoY21kX2xpbmUqIGNtZCk7CisvL3ZvaWQgY21kbF9hZGRvdXRwdXRfc3RyKGNtZF9saW5lKiBjbWQsIGNoYXIgb3V0cHV0W0NNRExfT1VUUFVUX1NJWkVdKTsKK3ZvaWQgY21kbF9hZGRzdHIoY21kX2xpbmUqIGNtZCwgY2hhciogc3RyKTsKK2ludCBjbWRsX21vdmVjdXJzb3IoY21kX2xpbmUqIGNtZCwgaW50IGRpcmVjdGlvbik7CitjaGFyKiBjbWRsX2dldGJ1ZmZlcihjbWRfbGluZSogY21kKTsKK3ZvaWQgY21kbF9hZGRjaGFyKGNtZF9saW5lKiBjbWQsIGNoYXIgaW4pOworaW50IGNtZGxfY2hlY2soY21kX2xpbmUqIGNtZCk7Cit2b2lkIGNtZGxfZGVsKGNtZF9saW5lKiBjbWQpOworY21kX2xpbmUqIGNtZGxfY3JlYXRlKCk7Cit2b2lkIGNtZGxfZnJlZShjbWRfbGluZSogY21kKTsKK2NoYXIgKmNtZGxfZ2V0cHJvbXB0KGNtZF9saW5lKiBjbWQpOwordm9pZCBjbWRsX3NldHByb3BtdChjbWRfbGluZSogY21kLCBjaGFyIHByb21wdFtDTURMX1BST01QVF9TSVpFXSk7CitjbWRsX3BhcmFtX2xpc3QqIGNtZGxfZ2V0cGFyYW1zKGNvbnN0IGNoYXIqIGNvbW1hbmQpOwordm9pZCBjbWRsX3RhYmNvbXBsZXRlKGNtZF9saW5lICpjbWQpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9jbWRsaXN0LmggYi9ncHhlL3NyYy9pbmNsdWRlL2NtZGxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2NkMzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9jbWRsaXN0LmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBDT01NQU5ETElTVF9ICisjZGVmaW5lIENPTU1BTkRMSVNUX0gKKwordm9pZCB0ZXN0X3JlcSgpOwordm9pZCB0ZXN0Ml9yZXEoKTsKK3ZvaWQgaGVscF9yZXEoKTsKK3ZvaWQgbnZvX2NtZF9yZXEoKTsKKwordm9pZCBjb21tYW5kbGlzdCgpCit7CisJLy8JdGVzdF9yZXEoKTsKKwkvLwl0ZXN0Ml9yZXEoKTsKKwloZWxwX3JlcSgpOworCW52b19jbWRfcmVxKCk7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2NvZmYuaCBiL2dweGUvc3JjL2luY2x1ZGUvY29mZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2ZkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2NvZmYuaApAQCAtMCwwICsxLDczIEBACisjaWZuZGVmIENPRkZfSAorI2RlZmluZSBDT0ZGX0gKKy8qIEJhc2VkIG9uIHRoZSBlbGYuaCBmaWxlCisgKiBDaGFuZ2VkIGFjY29yZGluZ2x5IHRvIHN1cHBvcnQgQ09GRiBmaWxlIHN1cHBvcnQKKyAqLworCisKKy8qIFZhbHVlcyBmb3IgZl9mbGFncy4gKi8KKyNkZWZpbmUgRl9SRUxGTEcJMHgwMDAxIAkvKiBJZiBzZXQsIG5vdCByZWxvYy4gaW5mby4gQ2xlYXIgZm9yIGV4ZWN1dGFibGVzICovCisjZGVmaW5lIEZfRVhFQwkJMHgwMDAyCS8qIE5vIHVucmVzb2x2ZWQgc3ltYm9scy4gRXhlY3V0YWJsZSBmaWxlICEgKi8KKyNkZWZpbmUgRl9MTk5PCQkweDAwMDQJLyogSWYgc2V0LCBsaW5lIGluZm9ybWF0aW9uIG51bWJlcnMgcmVtb3ZlZCAgKi8KKyNkZWZpbmUgRl9MU1lNUwkJMHgwMDA4CS8qIElmIHNldCwgbG9jYWwgc3ltYm9scyByZW1vdmVkICAqLworI2RlZmluZSBGX0FSMzJXUgkweDAxMDAJLyogSW5kaWNhdGVzIGxpdHRsZSBlbmRpYW4gZmlsZSAqLworCisvKiBWYWx1ZXMgZm9yIGVfbWFjaGluZSAoYXJjaGl0ZWN1dGUpLiAqLworI2RlZmluZSBFTV9FMQkJMHgxN2EgCS8qIE1hZ2ljIG51bWJlciBmb3IgSHlwZXJzdG9uZS4gQmlnIGVuZGlhbiBmb3JtYXQgKi8KKworLyogVmFsdWVzIGZvciBmX2ZsYWdzLiAqLworI2RlZmluZQlPX01BR0lDCQkweDAxN2MJLyogT3B0aW9uYWwncyBoZWFkZXIgbWFnaWMgbnVtYmVyIGZvciBIeXBlcnN0b25lICovCisKKy8qIFZhbHVlcyBmb3Igc19mbGFncy4gKi8KKyNkZWZpbmUgU19UWVBFX1RFWFQJMHgwMDIwIAkvKiBJZiBzZXQsIHRoZSBzZWN0aW9uIGNvbnRhaW5zIG9ubHkgZXhlY3V0YWJsZSAqLworI2RlZmluZSBTX1RZUEVfREFUQQkweDAwNDAgCS8qIElmIHNldCwgdGhlIHNlY3Rpb24gY29udGFpbnMgb25seSBpbml0aWFsaXplZCBkYXRhICovCisjZGVmaW5lIFNfVFlQRV9CU1MJMHgwMDgwIAkvKiBJZiBzZXQsIHRoZSBzZWN0aW9uIGlzIEJTUyBubyBkYXRhIHN0b3JlZCAqLworCisKK3R5cGVkZWYgc3RydWN0Cit7CisJdW5zaWduZWQgc2hvcnQgCWZfbWFnaWM7CS8qIG1hZ2ljIG51bWJlcgkJCQkqLworCXVuc2lnbmVkIHNob3J0IAlmX25zY25zOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisJdW5zaWduZWQgbG9uZyAJZl90aW1kYXQ7CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCXVuc2lnbmVkIGxvbmcgCWZfc3ltcHRyOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJdW5zaWduZWQgbG9uZyAJZl9uc3ltczsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisJdW5zaWduZWQgc2hvcnQJZl9vcHRoZHI7CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCXVuc2lnbmVkIHNob3J0IAlmX2ZsYWdzOwkvKiBmbGFncwkJCQkJKi8KK30KK0NPRkZfZmlsZWhkcjsKKworLyoKKyAqIE9wdGlvbmFsIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIHVuc2lnbmVkIHNob3J0CW1hZ2ljOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCisgIHVuc2lnbmVkIHNob3J0CXZzdGFtcDsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLworICB1bnNpZ25lZCBsb25nCQl0c2l6ZTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICB1bnNpZ25lZCBsb25nCQlkc2l6ZTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgdW5zaWduZWQgbG9uZwkJYnNpemU7CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCisgIHVuc2lnbmVkIGxvbmcJCWVudHJ5OwkJLyogZW50cnkgcHQuCQkJCSovCisgIHVuc2lnbmVkIGxvbmcJCXRleHRfc3RhcnQ7CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgdW5zaWduZWQgbG9uZyAJZGF0YV9zdGFydDsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworfQkKK0NPRkZfb3B0aGRyOworCisvKgorICogU2VjdGlvbiBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IAoreworCWNoYXIJCQkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworCXVuc2lnbmVkIGxvbmcJCXNfcGFkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisJdW5zaWduZWQgbG9uZwkJc192YWRkcjsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworCXVuc2lnbmVkIGxvbmcJCXNfc2l6ZTsJCS8qIHNlY3Rpb24gc2l6ZQkJCSovCisJdW5zaWduZWQgbG9uZwkJc19zY25wdHI7CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCisJdW5zaWduZWQgbG9uZwkJc19yZWxwdHI7CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KKwl1bnNpZ25lZCBsb25nCQlzX2xubm9wdHI7CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLworCXVuc2lnbmVkIHNob3J0CQlzX25yZWxvYzsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworCXVuc2lnbmVkIHNob3J0CQlzX25sbm5vOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisJdW5zaWduZWQgbG9uZwkJc19mbGFnczsJLyogZmxhZ3MJCQkqLworfQorQ09GRl9zY25oZHI7CisKKyNlbmRpZiAvKiBDT0ZGX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvY29tcGlsZXIuaCBiL2dweGUvc3JjL2luY2x1ZGUvY29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTgxZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9jb21waWxlci5oCkBAIC0wLDAgKzEsNjUwIEBACisjaWZuZGVmIENPTVBJTEVSX0gKKyNkZWZpbmUgQ09NUElMRVJfSAorCisvKgorICogRG94eWdlbiBjYW4ndCBjb3BlIHdpdGggc29tZSBvZiB0aGUgbW9yZSBlc290ZXJpYyBhcmVhcyBvZiBDLCBzbyB3ZQorICogbWFrZSBpdHMgbGlmZSBzaW1wbGVyLgorICoKKyAqLworI2lmZGVmIERPWFlHRU4KKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQorI2VuZGlmCisKKy8qKiBAZmlsZQorICoKKyAqIEdsb2JhbCBjb21waWxlciBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgaW1wbGljaXRseSBpbmNsdWRlZCBieSBldmVyeSBAYyAuYyBmaWxlIGluIEV0aGVyYm9vdC4KKyAqIEl0IGRlZmluZXMgZ2xvYmFsIG1hY3JvcyBzdWNoIGFzIERCRygpLgorICoKKyAqIFdlIGFycmFuZ2UgZm9yIGVhY2ggb2JqZWN0IHRvIGV4cG9ydCB0aGUgc3ltYm9sIEBjIG9ial9PQkpFQ1QKKyAqICh3aGVyZSBAYyBPQkpFQ1QgaXMgdGhlIG9iamVjdCBuYW1lLCBlLmcuIEBjIHJ0bDgxMzkpIGFzIGEgZ2xvYmFsCisgKiBzeW1ib2wsIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4gZHJhZyBpbiBzZWxlY3RlZCBvYmplY3QgZmlsZXMgZnJvbQorICogdGhlIGxpYnJhcnkgdXNpbmcgPHR0PiAtdSBvYmpfT0JKRUNUIDwvdHQ+LgorICoKKyAqLworCisvKiBGb3JjZSB2aXNpYmlsaXR5IG9mIGFsbCBzeW1ib2xzIHRvICJoaWRkZW4iLCBpLmUuIGluZm9ybSBnY2MgdGhhdAorICogYWxsIHN5bWJvbCByZWZlcmVuY2VzIHJlc29sdmUgc3RyaWN0bHkgd2l0aGluIG91ciBmaW5hbCBiaW5hcnkuCisgKiBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyeSBQTFQvR09UIGVudHJpZXMgb24geDg2XzY0LgorICoKKyAqIFRoaXMgaXMgYSBzdHJvbmdlciBjbGFpbSB0aGFuIHNwZWNpZnlpbmcgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICogc2luY2UgaXQgYWxzbyBhZmZlY3RzIHN5bWJvbHMgbWFya2VkIHdpdGggImV4dGVybiIuCisgKi8KKyNpZm5kZWYgQVNTRU1CTFkKKyNpZiBfX0dOVUNfXyA+PSA0CisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goaGlkZGVuKQorI2VuZGlmCisjZW5kaWYgLyogQVNTRU1CTFkgKi8KKworI3VuZGVmIF9TMQorI3VuZGVmIF9TMgorI3VuZGVmIF9DMQorI3VuZGVmIF9DMgorCisvKiogQ29uY2F0ZW5hdGUgbm9uLWV4cGFuZGVkIGFyZ3VtZW50cyAqLworI2RlZmluZSBfQzEoIHgsIHkgKSB4ICMjIHkKKy8qKiBDb25jYXRlbmF0ZSBleHBhbmRlZCBhcmd1bWVudHMgKi8KKyNkZWZpbmUgX0MyKCB4LCB5ICkgX0MxICggeCwgeSApCisKKy8qKiBTdHJpbmdpZnkgbm9uLWV4cGFuZGVkIGFyZ3VtZW50ICovCisjZGVmaW5lIF9TMSggeCApICN4CisvKiogU3RyaW5naWZ5IGV4cGFuZGVkIGFyZ3VtZW50ICovCisjZGVmaW5lIF9TMiggeCApIF9TMSAoIHggKQorCisvKioKKyAqIEBkZWZncm91cCBzeW1tYWNyb3MgTWFjcm9zIHRvIHByb3ZpZGUgb3IgcmVxdWlyZSBleHBsaWNpdCBzeW1ib2xzCisgKiBAeworICovCisKKy8qKiBQcm92aWRlIGEgc3ltYm9sIHdpdGhpbiB0aGlzIG9iamVjdCBmaWxlICovCisjaWZkZWYgQVNTRU1CTFkKKyNkZWZpbmUgUFJPVklERV9TWU1CT0woIF9zeW0gKQkJCQlcCisJLmdsb2JsCV9zeW0gOwkJCQkJXAorCS5jb21tCV9zeW0sIDAKKyNlbHNlIC8qIEFTU0VNQkxZICovCisjZGVmaW5lIFBST1ZJREVfU1lNQk9MKCBfc3ltICkJCQkJXAorCWNoYXIgX3N5bVswXQorI2VuZGlmIC8qIEFTU0VNQkxZICovCisKKy8qKiBSZXF1aXJlIGEgc3ltYm9sIHdpdGhpbiB0aGlzIG9iamVjdCBmaWxlCisgKgorICogVGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgcmVsb2NhdGlvbiBpbiBhIGRpc2NhcmRlZCBzZWN0aW9uLCBzbworICogaWYgaXQgaXMgbm90IGF2YWlsYWJsZSBhdCBsaW5rIHRpbWUgdGhlIGxpbmsgd2lsbCBmYWlsLgorICovCisjaWZkZWYgQVNTRU1CTFkKKyNkZWZpbmUgUkVRVUlSRV9TWU1CT0woIF9zeW0gKQkJCQlcCisJLnNlY3Rpb24gIi5kaXNjYXJkIiwgImEiLCBAcHJvZ2JpdHMgOwkJXAorCS5leHRlcm4JX3N5bSA7CQkJCQlcCisJLmxvbmcJX3N5bSA7CQkJCQlcCisJLnByZXZpb3VzCisjZWxzZSAvKiBBU1NFTUJMWSAqLworI2RlZmluZSBSRVFVSVJFX1NZTUJPTCggX3N5bSApCQkJCVwKKwlleHRlcm4gY2hhciBfc3ltOwkJCQlcCisJc3RhdGljIGNoYXIgKiBfQzIgKCBfQzIgKCBfX3JlcXVpcmVfLCBfc3ltICksIF9DMiAoIF8sIF9fTElORV9fICkgKSBcCisJCV9fYXR0cmlidXRlX18gKCggc2VjdGlvbiAoICIuZGlzY2FyZCIgKSwgdXNlZCApKSBcCisJCT0gJl9zeW0KKyNlbmRpZgorCisvKiogUmVxdWVzdCB0aGF0IGEgc3ltYm9sIGJlIGF2YWlsYWJsZSBhdCBydW50aW1lCisgKgorICogVGhlIHJlcXVlc3RlZCBzeW1ib2wgaXMgZW50ZXJlZCBhcyB1bmRlZmluZWQgaW50byB0aGUgc3ltYm9sIHRhYmxlCisgKiBmb3IgdGhpcyBvYmplY3QsIHNvIHRoZSBsaW5rZXIgd2lsbCBwdWxsIGluIG90aGVyIG9iamVjdCBmaWxlcyBhcworICogbmVjZXNzYXJ5IHRvIHNhdGlzZnkgdGhlIHJlZmVyZW5jZS4gSG93ZXZlciwgdGhlIHVuZGVmaW5lZCBzeW1ib2wKKyAqIGlzIG5vdCByZWZlcmVuY2VkIGluIGFueSByZWxvY2F0aW9ucywgc28gdGhlIGxpbmsgY2FuIHN0aWxsIHN1Y2NlZWQKKyAqIGlmIG5vIGZpbGUgY29udGFpbnMgaXQuCisgKgorICogQSBzeW1ib2wgcGFzc2VkIHRvIHRoaXMgbWFjcm8gbWF5IG5vdCBiZSByZWZlcmVuY2VkIGFueXdoZXJlCisgKiBlbHNlIGluIHRoZSBmaWxlLiBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzZWUgSU1QT1JUX1NZTUJPTCgpLgorICovCisjaWZkZWYgQVNTRU1CTFkKKyNkZWZpbmUgUkVRVUVTVF9TWU1CT0woIF9zeW0gKQkJCQlcCisJLmVxdQlfX25lZWRfICMjIF9zeW0sIF9zeW0KKyNlbHNlIC8qIEFTU0VNQkxZICovCisjZGVmaW5lIFJFUVVFU1RfU1lNQk9MKCBfc3ltICkJCQkJXAorCV9fYXNtX18gKCAiLmVxdVx0X19uZWVkXyIgI19zeW0gIiwgIiAjX3N5bSApCisjZW5kaWYgLyogQVNTRU1CTFkgKi8KKworLyoqIFNldCB1cCBhIHN5bWJvbCB0byBiZSB1c2FibGUgaW4gYW5vdGhlciBmaWxlIGJ5IElNUE9SVF9TWU1CT0woKQorICoKKyAqIFRoZSBzeW1ib2wgbXVzdCBhbHJlYWR5IGJlIG1hcmtlZCBhcyBnbG9iYWwuCisgKi8KKyNkZWZpbmUgRVhQT1JUX1NZTUJPTCggX3N5bSApCVBST1ZJREVfU1lNQk9MICggX19leHBvcnRfICMjIF9zeW0gKQorCisvKiogTWFrZSBhIHN5bWJvbCB1c2FibGUgdG8gdGhpcyBmaWxlIGlmIGF2YWlsYWJsZSBhdCBsaW5rIHRpbWUKKyAqCisgKiBJZiBubyBmaWxlIHBhc3NlZCB0byB0aGUgbGlua2VyIGNvbnRhaW5zIHRoZSBzeW1ib2wsIGl0IHdpbGwgaGF2ZQorICogQGMgTlVMTCB2YWx1ZSB0byBmdXR1cmUgdXNlcy4gS2VlcCBpbiBtaW5kIHRoYXQgdGhlIHN5bWJvbCB2YWx1ZSBpcworICogcmVhbGx5IHRoZSBAZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgb3IgZnVuY3Rpb247IHNlZSB0aGUgY29kZQorICogc25pcHBldCBiZWxvdy4KKyAqCisgKiBJbiBDIHVzaW5nIElNUE9SVF9TWU1CT0wsIHlvdSBtdXN0IHNwZWNpZnkgdGhlIGRlY2xhcmF0aW9uIGFzIHRoZQorICogc2Vjb25kIGFyZ3VtZW50LCBmb3IgaW5zdGFuY2UKKyAqCisgKiBAY29kZQorICogICBJTVBPUlRfU1lNQk9MICggbXlfZnVuYywgaW50IG15X2Z1bmMgKCBpbnQgYXJnICkgKTsKKyAqICAgSU1QT1JUX1NZTUJPTCAoIG15X3ZhciwgaW50IG15X3ZhciApOworICoKKyAqICAgdm9pZCB1c2VfaW1wb3J0cyAoIHZvaWQgKSB7CisgKiAJaWYgKCBteV9mdW5jICYmICZteV92YXIgKQorICogCSAgIG15X3ZhciA9IG15X2Z1bmMgKCBteV92YXIgKTsKKyAqICAgfQorICogQGVuZGNvZGUKKyAqCisgKiBHQ0MgY29uc2lkZXJzIGEgd2VhayBkZWNsYXJhdGlvbiB0byBvdmVycmlkZSBhIHN0cm9uZyBvbmUgbm8gbWF0dGVyCisgKiB3aGljaCBjb21lcyBmaXJzdCwgc28gaXQgaXMgc2FmZSB0byBpbmNsdWRlIGEgaGVhZGVyIGZpbGUgZGVjbGFyaW5nCisgKiB0aGUgaW1wb3J0ZWQgc3ltYm9sIG5vcm1hbGx5LCBidXQgcHJvdmlkaW5nIHRoZSBkZWNsYXJhdGlvbiB0bworICogSU1QT1JUX1NZTUJPTCBpcyBzdGlsbCByZXF1aXJlZC4KKyAqCisgKiBJZiBubyBFWFBPUlRfU1lNQk9MIGRlY2xhcmF0aW9uIGV4aXN0cyBmb3IgdGhlIGltcG9ydGVkIHN5bWJvbCBpbgorICogYW5vdGhlciBmaWxlLCB0aGUgYmVoYXZpb3Igd2lsbCBiZSBtb3N0IGxpa2VseSBiZSBpZGVudGljYWwgdG8gdGhhdAorICogZm9yIGFuIHVuYXZhaWxhYmxlIHN5bWJvbC4KKyAqLworI2lmZGVmIEFTU0VNQkxZCisjZGVmaW5lIElNUE9SVF9TWU1CT0woIF9zeW0gKQkJCQlcCisJUkVRVUVTVF9TWU1CT0wgKCBfX2V4cG9ydF8gIyMgX3N5bSApIDsJCVwKKwkud2Vhawlfc3ltCisjZWxzZSAvKiBBU1NFTUJMWSAqLworI2RlZmluZSBJTVBPUlRfU1lNQk9MKCBfc3ltLCBfZGVjbCApCQkJXAorCVJFUVVFU1RfU1lNQk9MICggX19leHBvcnRfICMjIF9zeW0gKSA7CQlcCisJZXh0ZXJuIF9kZWNsIF9fYXR0cmlidXRlX18gKCggd2VhayApKQorI2VuZGlmCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBvYmptYWNyb3MgTWFjcm9zIHRvIHByb3ZpZGUgb3IgcmVxdWlyZSBleHBsaWNpdCBvYmplY3RzCisgKiBAeworICovCisKKyNkZWZpbmUgUFJFRklYX09CSkVDVCggX3ByZWZpeCApIF9DMiAoIF9wcmVmaXgsIE9CSkVDVCApCisjZGVmaW5lIE9CSkVDVF9TWU1CT0wgUFJFRklYX09CSkVDVCAoIG9ial8gKQorI2RlZmluZSBSRVFVRVNUX0VYUEFOREVEKCBfc3ltICkgUkVRVUVTVF9TWU1CT0wgKCBfc3ltICkKKyNkZWZpbmUgQ09ORklHX1NZTUJPTCBQUkVGSVhfT0JKRUNUICggb2JqX2NvbmZpZ18gKQorCisvKiogQWx3YXlzIHByb3ZpZGUgdGhlIHN5bWJvbCBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0IChkZWZpbmVkIGJ5IC1ET0JKRUNUKSAqLworUFJPVklERV9TWU1CT0wgKCBPQkpFQ1RfU1lNQk9MICk7CisKKy8qKiBQdWxsIGluIGFuIG9iamVjdC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUgaWYgYXZhaWxhYmxlICovCitSRVFVRVNUX0VYUEFOREVEICggQ09ORklHX1NZTUJPTCApOworCisvKiogRXhwbGljaXRseSByZXF1aXJlIGFub3RoZXIgb2JqZWN0ICovCisjZGVmaW5lIFJFUVVJUkVfT0JKRUNUKCBfb2JqICkgUkVRVUlSRV9TWU1CT0wgKCBvYmpfICMjIF9vYmogKQorCisvKiogUHVsbCBpbiBhbm90aGVyIG9iamVjdCBpZiBpdCBleGlzdHMgKi8KKyNkZWZpbmUgUkVRVUVTVF9PQkpFQ1QoIF9vYmogKSBSRVFVRVNUX1NZTUJPTCAoIG9ial8gIyMgX29iaiApCisKKy8qKiBAfSAqLworCisvKiogU2VsZWN0IGZpbGUgaWRlbnRpZmllciBmb3IgZXJybm8uaCAoaWYgdXNlZCkgKi8KKyNkZWZpbmUgRVJSRklMRSBQUkVGSVhfT0JKRUNUICggRVJSRklMRV8gKQorCisvKioKKyAqIEBkZWZncm91cCB3ZWFrbWFjcm9zIE1hY3JvcyB0byBtYW5hZ2Ugd2VhayBzeW1ib2wgZGVmaW5pdGlvbnMKKyAqCisgKiBXZWFrIHN5bWJvbHMgYWxsb3cgb25lIHRvIHJlZmVyZW5jZSBhIGZ1bmN0aW9uIGluIGFub3RoZXIgZmlsZQorICogd2l0aG91dCBuZWNlc3NhcmlseSByZXF1aXJpbmcgdGhhdCBmaWxlIHRvIGJlIGxpbmtlZCBpbi4gSW4gdGhlaXIKKyAqIG5hdGl2ZSBmb3JtLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBAYyBOVUxMIGlmIGl0cyBmaWxlIGlzIG5vdCBsaW5rZWQKKyAqIGluOyB0aGVzZSBtYWNyb3MgcHJvdmlkZSBhbiBpbmxpbmUgd3JhcHBlciB0aGF0IHJldHVybnMgYW4KKyAqIGFwcHJvcHJpYXRlIGVycm9yIGluZGljYXRpb24gb3IgZGVmYXVsdCB2YWx1ZS4KKyAqCisgKiBAeworICovCisjaWZuZGVmIEFTU0VNQkxZCisKKy8qKiBNYW5nbGUgQGEgbmFtZSBpbnRvIGl0cyB3ZWFrbHktcmVmZXJlbmNlZCBpbXBsZW1lbnRhdGlvbiAqLworI2RlZmluZSBfX3dlYWtfaW1wbCggbmFtZSApICAgX3dfICMjIG5hbWUKKworLyoqCisgKiBEZWNsYXJlIGEgd2VhayBmdW5jdGlvbiB3aXRoIGlubGluZSBzYWZldHkgd3JhcHBlcgorICoKKyAqIEB2IHJldAlSZXR1cm4gdHlwZSBvZiB3ZWFrIGZ1bmN0aW9uCisgKiBAdiBuYW1lCU5hbWUgb2YgZnVuY3Rpb24gdG8gZXhwb3NlCisgKiBAdiBwcm90bwlQYXJlbnRoZXNpemVkIGxpc3Qgb2YgYXJndW1lbnRzIHdpdGggdHlwZXMKKyAqIEB2IGFyZ3MJUGFyZW50aGVzaXplZCBsaXN0IG9mIGFyZ3VtZW50IG5hbWVzCisgKiBAdiBkZmwJVmFsdWUgdG8gcmV0dXJuIGlmIHdlYWsgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZQorICovCisjZGVmaW5lIF9fd2Vha19kZWNsKCByZXQsIG5hbWUsIHByb3RvLCBhcmdzLCBkZmwgKQkJXAorICAgICAgICByZXQgX193ZWFrX2ltcGwoIG5hbWUgKSBwcm90byBfX2F0dHJpYnV0ZV9fICgoIHdlYWsgKSk7CVwKKyAgICAgICAgc3RhdGljIGlubGluZSByZXQgbmFtZSBwcm90byB7CQkJCVwKKyAgICAgICAgICAgICAgICBpZiAoIF9fd2Vha19pbXBsKCBuYW1lICkgKQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX3dlYWtfaW1wbCggbmFtZSApIGFyZ3M7CVwKKyAgICAgICAgICAgICAgICByZXR1cm4gZGZsOwkJCQkJXAorICAgICAgICB9CisKKyNlbmRpZgorLyoqIEB9ICovCisKKy8qKiBAZGVmZ3JvdXAgZGJnIERlYnVnZ2luZyBpbmZyYXN0cnVjdHVyZQorICogQHsKKyAqLworI2lmbmRlZiBBU1NFTUJMWQorCisvKiogQGRlZiBEQkcKKyAqCisgKiBQcmludCBhIGRlYnVnZ2luZyBtZXNzYWdlLgorICoKKyAqIFRoZSBkZWJ1ZyBsZXZlbCBpcyBzZXQgYXQgYnVpbGQgdGltZSBieSBzcGVjaWZ5aW5nIHRoZSBAYyBERUJVRz0KKyAqIHBhcmFtZXRlciBvbiB0aGUgQGMgbWFrZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZSwgdG8gZW5hYmxlCisgKiBkZWJ1Z2dpbmcgZm9yIHRoZSBQQ0kgYnVzIGZ1bmN0aW9ucyAoaW4gcGNpLmMpIGluIGEgQGMgLmRzayBpbWFnZQorICogZm9yIHRoZSBAYyBydGw4MTM5IGNhcmQsIHlvdSBjb3VsZCB1c2UgdGhlIGNvbW1hbmQgbGluZQorICoKKyAqIEBjb2RlCisgKgorICogICBtYWtlIGJpbi9ydGw4MTM5LmRzayBERUJVRz1wY2kKKyAqCisgKiBAZW5kY29kZQorICoKKyAqIFRoaXMgd2lsbCBlbmFibGUgdGhlIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIChEQkcoKSkgaW4gcGNpLmMuICBJZgorICogZGVidWdnaW5nIGlzIG5vdCBlbmFibGVkLCBEQkcoKSBzdGF0ZW1lbnRzIHdpbGwgYmUgaWdub3JlZC4KKyAqCisgKiBZb3UgY2FuIGVuYWJsZSBkZWJ1Z2dpbmcgaW4gc2V2ZXJhbCBvYmplY3RzIHNpbXVsdGFuZW91c2x5IGJ5CisgKiBzZXBhcmF0aW5nIHRoZW0gd2l0aCBjb21tYXMsIGFzIGluCisgKgorICogQGNvZGUKKyAqCisgKiAgIG1ha2UgYmluL3J0bDgxMzkuZHNrIERFQlVHPXBjaSxidWZmZXIsaGVhcAorICoKKyAqIEBlbmRjb2RlCisgKgorICogWW91IGNhbiBpbmNyZWFzZSB0aGUgZGVidWdnaW5nIGxldmVsIGZvciBhbiBvYmplY3QgYnkgc3BlY2lmeWluZyBpdAorICogd2l0aCBAYyA6Tiwgd2hlcmUgQGMgTiBpcyB0aGUgbGV2ZWwsIGFzIGluCisgKgorICogQGNvZGUKKyAqCisgKiAgIG1ha2UgYmluL3J0bDgxMzkuZHNrIERFQlVHPXBjaSxidWZmZXI6MixoZWFwCisgKgorICogQGVuZGNvZGUKKyAqCisgKiB3aGljaCB3b3VsZCBlbmFibGUgZGVidWdnaW5nIGZvciB0aGUgUENJLCBidWZmZXItaGFuZGxpbmcgYW5kCisgKiBoZWFwLWFsbG9jYXRpb24gY29kZSwgd2l0aCB0aGUgYnVmZmVyLWhhbmRsaW5nIGNvZGUgYXQgbGV2ZWwgMi4KKyAqCisgKi8KKworLyoKKyAqIElmIGRlYnVnX09CSkVDVCBpcyBzZXQgdG8gYSB0cnVlIHZhbHVlLCB0aGUgbWFjcm8gREJHKC4uLikgd2lsbAorICogZXhwYW5kIHRvIHByaW50ZiguLi4pIHdoZW4gY29tcGlsaW5nIE9CSkVDVCwgYW5kIHRoZSBzeW1ib2wKKyAqIERFQlVHX0xFVkVMIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgb2JqZWN0IGZpbGUuCisgKgorICovCisjZGVmaW5lIERFQlVHX1NZTUJPTCBQUkVGSVhfT0JKRUNUICggZGVidWdfICkKKworLyoqIHByaW50ZigpIGZvciBkZWJ1Z2dpbmcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBzbyB0aGF0IHRoZSBEQkcoKSBtYWNyb3MgY2FuIGV4cGFuZCB0bworICogcHJpbnRmKCkgY2FsbHMgd2l0aG91dCBkcmFnZ2luZyB0aGUgcHJpbnRmKCkgcHJvdG90eXBlIGludG8gc2NvcGUuCisgKgorICogQXMgZmFyIGFzIHRoZSBjb21waWxlciBpcyBjb25jZXJuZWQsIGRiZ19wcmludGYoKSBhbmQgcHJpbnRmKCkgYXJlCisgKiBjb21wbGV0ZWx5IHVucmVsYXRlZCBjYWxsczsgaXQncyBvbmx5IGF0IHRoZSBhc3NlbWJseSBzdGFnZSB0aGF0CisgKiByZWZlcmVuY2VzIHRvIHRoZSBkYmdfcHJpbnRmIHN5bWJvbCBhcmUgY29sbGFwc2VkIGludG8gcmVmZXJlbmNlcworICogdG8gdGhlIHByaW50ZiBzeW1ib2wuCisgKi8KK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXyAoKCBmb3JtYXQgKCBwcmludGYsIDEsIDIgKSApKSAKK2RiZ19wcmludGYgKCBjb25zdCBjaGFyICpmbXQsIC4uLiApIGFzbSAoICJwcmludGYiICk7CisKK2V4dGVybiB2b2lkIGRiZ19hdXRvY29sb3VyaXNlICggdW5zaWduZWQgbG9uZyBpZCApOworZXh0ZXJuIHZvaWQgZGJnX2RlY29sb3VyaXNlICggdm9pZCApOworZXh0ZXJuIHZvaWQgZGJnX2hleF9kdW1wX2RhICggdW5zaWduZWQgbG9uZyBkaXNwYWRkciwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuICk7CisKKyNpZiBERUJVR19TWU1CT0wKKyNkZWZpbmUgREJHTFZMX01BWCBERUJVR19TWU1CT0wKKyNlbHNlCisjZGVmaW5lIERCR0xWTF9NQVggMAorI2VuZGlmCisKKy8qIEFsbG93IGZvciBzZWxlY3RpdmUgZGlzYWJsaW5nIG9mIGVuYWJsZWQgZGVidWcgbGV2ZWxzICovCisjaWYgREJHTFZMX01BWAoraW50IF9fZGVidWdfZGlzYWJsZTsKKyNkZWZpbmUgREJHTFZMICggREJHTFZMX01BWCAmIH5fX2RlYnVnX2Rpc2FibGUgKQorI2RlZmluZSBEQkdfRElTQUJMRSggbGV2ZWwgKSBkbyB7CQkJCVwKKwlfX2RlYnVnX2Rpc2FibGUgfD0gKCAobGV2ZWwpICYgREJHTFZMX01BWCApOwkJXAorCX0gd2hpbGUgKCAwICkKKyNkZWZpbmUgREJHX0VOQUJMRSggbGV2ZWwgKSBkbyB7CQkJCVwKKwlfX2RlYnVnX2Rpc2FibGUgJj0gfiggKGxldmVsKSAmIERCR0xWTF9NQVggKTsJCVwKKwl9IHdoaWxlICggMCApCisjZWxzZQorI2RlZmluZSBEQkdMVkwgMAorI2RlZmluZSBEQkdfRElTQUJMRSggbGV2ZWwgKSBkbyB7IH0gd2hpbGUgKCAwICkKKyNkZWZpbmUgREJHX0VOQUJMRSggbGV2ZWwgKSBkbyB7IH0gd2hpbGUgKCAwICkKKyNlbmRpZgorCisjZGVmaW5lIERCR0xWTF9MT0cJMQorI2RlZmluZSBEQkdfTE9HCQkoIERCR0xWTCAmIERCR0xWTF9MT0cgKQorI2RlZmluZSBEQkdMVkxfRVhUUkEJMgorI2RlZmluZSBEQkdfRVhUUkEJKCBEQkdMVkwgJiBEQkdMVkxfRVhUUkEgKQorI2RlZmluZSBEQkdMVkxfUFJPRklMRQk0CisjZGVmaW5lIERCR19QUk9GSUxFCSggREJHTFZMICYgREJHTFZMX1BST0ZJTEUgKQorI2RlZmluZSBEQkdMVkxfSU8JOAorI2RlZmluZSBEQkdfSU8JCSggREJHTFZMICYgREJHTFZMX0lPICkKKworLyoqCisgKiBQcmludCBkZWJ1Z2dpbmcgbWVzc2FnZSBpZiB3ZSBhcmUgYXQgYSBjZXJ0YWluIGRlYnVnIGxldmVsCisgKgorICogQHYgbGV2ZWwJCURlYnVnIGxldmVsCisgKiBAdiAuLi4JCXByaW50ZigpIGFyZ3VtZW50IGxpc3QKKyAqLworI2RlZmluZSBEQkdfSUYoIGxldmVsLCAuLi4gKSBkbyB7CQkJCVwKKwkJaWYgKCBEQkdfICMjIGxldmVsICkgewkJCQlcCisJCQlkYmdfcHJpbnRmICggX19WQV9BUkdTX18gKTsJCVwKKwkJfQkJCQkJCVwKKwl9IHdoaWxlICggMCApCisKKy8qKgorICogUHJpbnQgYSBoZXggZHVtcCBpZiB3ZSBhcmUgYXQgYSBjZXJ0YWluIGRlYnVnIGxldmVsCisgKgorICogQHYgbGV2ZWwJCURlYnVnIGxldmVsCisgKiBAdiBkaXNwYWRkcgkJRGlzcGxheSBhZGRyZXNzCisgKiBAdiBkYXRhCQlEYXRhIHRvIHByaW50CisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhCisgKi8KKyNkZWZpbmUgREJHX0hEQV9JRiggbGV2ZWwsIGRpc3BhZGRyLCBkYXRhLCBsZW4gKSAgZG8gewkJXAorCQlpZiAoIERCR18gIyMgbGV2ZWwgKSB7CQkJCVwKKwkJCXVuaW9uIHsJCQkJCVwKKwkJCQl1bnNpZ25lZCBsb25nIHVsOwkJXAorCQkJCXR5cGVvZiAoIGRpc3BhZGRyICkgcmF3OwlcCisJCQl9IGRhOwkJCQkJXAorCQkJZGEucmF3ID0gZGlzcGFkZHI7CQkJXAorCQkJZGJnX2hleF9kdW1wX2RhICggZGEudWwsIGRhdGEsIGxlbiApOwlcCisJCX0JCQkJCQlcCisJfSB3aGlsZSAoIDAgKQorCisvKioKKyAqIFByaW50IGEgaGV4IGR1bXAgaWYgd2UgYXJlIGF0IGEgY2VydGFpbiBkZWJ1ZyBsZXZlbAorICoKKyAqIEB2IGxldmVsCQlEZWJ1ZyBsZXZlbAorICogQHYgZGF0YQkJRGF0YSB0byBwcmludAorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YQorICovCisjZGVmaW5lIERCR19IRF9JRiggbGV2ZWwsIGRhdGEsIGxlbiApIGRvIHsJCQlcCisJCWNvbnN0IHZvaWQgKl9kYXRhID0gZGF0YTsJCQlcCisJCURCR19IREFfSUYgKCBsZXZlbCwgX2RhdGEsIF9kYXRhLCBsZW4gKTsJXAorCX0gd2hpbGUgKCAwICkKKworLyoqCisgKiBTZWxlY3QgY29sb3VyIGZvciBkZWJ1ZyBtZXNzYWdlcyBpZiB3ZSBhcmUgYXQgYSBjZXJ0YWluIGRlYnVnIGxldmVsCisgKgorICogQHYgbGV2ZWwJCURlYnVnIGxldmVsCisgKiBAdiBpZAkJTWVzc2FnZSBzdHJlYW0gSUQKKyAqLworI2RlZmluZSBEQkdfQUNfSUYoIGxldmVsLCBpZCApIGRvIHsJCQkJXAorCQlpZiAoIERCR18gIyMgbGV2ZWwgKSB7CQkJCVwKKwkJCXVuaW9uIHsJCQkJCVwKKwkJCQl1bnNpZ25lZCBsb25nIHVsOwkJXAorCQkJCXR5cGVvZiAoIGlkICkgcmF3OwkJXAorCQkJfSBkYmdfc3RyZWFtOwkJCQlcCisJCQlkYmdfc3RyZWFtLnJhdyA9IGlkOwkJCVwKKwkJCWRiZ19hdXRvY29sb3VyaXNlICggZGJnX3N0cmVhbS51bCApOwlcCisJCX0JCQkJCQlcCisJfSB3aGlsZSAoIDAgKQorCisvKioKKyAqIFJldmVydCBjb2xvdXIgZm9yIGRlYnVnIG1lc3NhZ2VzIGlmIHdlIGFyZSBhdCBhIGNlcnRhaW4gZGVidWcgbGV2ZWwKKyAqCisgKiBAdiBsZXZlbAkJRGVidWcgbGV2ZWwKKyAqLworI2RlZmluZSBEQkdfRENfSUYoIGxldmVsICkgZG8gewkJCQkJXAorCQlpZiAoIERCR18gIyMgbGV2ZWwgKSB7CQkJCVwKKwkJCWRiZ19kZWNvbG91cmlzZSgpOwkJCVwKKwkJfQkJCQkJCVwKKwl9IHdoaWxlICggMCApCisKKy8qIEF1dG9jb2xvdXJpc2luZyB2ZXJzaW9ucyBvZiB0aGUgREJHeHh4X0lGKCkgbWFjcm9zICovCisKKyNkZWZpbmUgREJHQ19JRiggbGV2ZWwsIGlkLCAuLi4gKSBkbyB7CQkJCVwKKwkJREJHX0FDX0lGICggbGV2ZWwsIGlkICk7CQkJXAorCQlEQkdfSUYgKCBsZXZlbCwgX19WQV9BUkdTX18gKTsJCQlcCisJCURCR19EQ19JRiAoIGxldmVsICk7CQkJCVwKKwl9IHdoaWxlICggMCApCisKKyNkZWZpbmUgREJHQ19IREFfSUYoIGxldmVsLCBpZCwgLi4uICkgZG8gewkJCVwKKwkJREJHX0FDX0lGICggbGV2ZWwsIGlkICk7CQkJXAorCQlEQkdfSERBX0lGICggbGV2ZWwsIF9fVkFfQVJHU19fICk7CQlcCisJCURCR19EQ19JRiAoIGxldmVsICk7CQkJCVwKKwl9IHdoaWxlICggMCApCisKKyNkZWZpbmUgREJHQ19IRF9JRiggbGV2ZWwsIGlkLCAuLi4gKSBkbyB7CQkJXAorCQlEQkdfQUNfSUYgKCBsZXZlbCwgaWQgKTsJCQlcCisJCURCR19IRF9JRiAoIGxldmVsLCBfX1ZBX0FSR1NfXyApOwkJXAorCQlEQkdfRENfSUYgKCBsZXZlbCApOwkJCQlcCisJfSB3aGlsZSAoIDAgKQorCisvKiBWZXJzaW9ucyBvZiB0aGUgREJHeHh4X0lGKCkgbWFjcm9zIHRoYXQgaW1wbHkgREJHeHh4X0lGKCBMT0csIC4uLiApKi8KKworI2RlZmluZSBEQkcoIC4uLiApCQlEQkdfSUYJCSggTE9HLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIERCR19IREEoIC4uLiApCQlEQkdfSERBX0lGCSggTE9HLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIERCR19IRCggLi4uICkJCURCR19IRF9JRgkoIExPRywgX19WQV9BUkdTX18gKQorI2RlZmluZSBEQkdDKCAuLi4gKQkJREJHQ19JRgkJKCBMT0csIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgREJHQ19IREEoIC4uLiApCQlEQkdDX0hEQV9JRgkoIExPRywgX19WQV9BUkdTX18gKQorI2RlZmluZSBEQkdDX0hEKCAuLi4gKQkJREJHQ19IRF9JRgkoIExPRywgX19WQV9BUkdTX18gKQorCisvKiBWZXJzaW9ucyBvZiB0aGUgREJHeHh4X0lGKCkgbWFjcm9zIHRoYXQgaW1wbHkgREJHeHh4X0lGKCBFWFRSQSwgLi4uICkqLworCisjZGVmaW5lIERCRzIoIC4uLiApCQlEQkdfSUYJCSggRVhUUkEsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgREJHMl9IREEoIC4uLiApCQlEQkdfSERBX0lGCSggRVhUUkEsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgREJHMl9IRCggLi4uICkJCURCR19IRF9JRgkoIEVYVFJBLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIERCR0MyKCAuLi4gKQkJREJHQ19JRgkJKCBFWFRSQSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBEQkdDMl9IREEoIC4uLiApCURCR0NfSERBX0lGCSggRVhUUkEsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgREJHQzJfSEQoIC4uLiApCQlEQkdDX0hEX0lGCSggRVhUUkEsIF9fVkFfQVJHU19fICkKKworLyogVmVyc2lvbnMgb2YgdGhlIERCR3h4eF9JRigpIG1hY3JvcyB0aGF0IGltcGx5IERCR3h4eF9JRiggUFJPRklMRSwgLi4uICkqLworCisjZGVmaW5lIERCR1AoIC4uLiApCQlEQkdfSUYJCSggUFJPRklMRSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBEQkdQX0hEQSggLi4uICkJCURCR19IREFfSUYJKCBQUk9GSUxFLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIERCR1BfSEQoIC4uLiApCQlEQkdfSERfSUYJKCBQUk9GSUxFLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIERCR0NQKCAuLi4gKQkJREJHQ19JRgkJKCBQUk9GSUxFLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIERCR0NQX0hEQSggLi4uICkJREJHQ19IREFfSUYJKCBQUk9GSUxFLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIERCR0NQX0hEKCAuLi4gKQkJREJHQ19IRF9JRgkoIFBST0ZJTEUsIF9fVkFfQVJHU19fICkKKworLyogVmVyc2lvbnMgb2YgdGhlIERCR3h4eF9JRigpIG1hY3JvcyB0aGF0IGltcGx5IERCR3h4eF9JRiggSU8sIC4uLiApKi8KKworI2RlZmluZSBEQkdJTyggLi4uICkJCURCR19JRgkJKCBJTywgX19WQV9BUkdTX18gKQorI2RlZmluZSBEQkdJT19IREEoIC4uLiApCURCR19IREFfSUYJKCBJTywgX19WQV9BUkdTX18gKQorI2RlZmluZSBEQkdJT19IRCggLi4uICkJCURCR19IRF9JRgkoIElPLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIERCR0NJTyggLi4uICkJCURCR0NfSUYJCSggSU8sIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgREJHQ0lPX0hEQSggLi4uICkJREJHQ19IREFfSUYJKCBJTywgX19WQV9BUkdTX18gKQorI2RlZmluZSBEQkdDSU9fSEQoIC4uLiApCURCR0NfSERfSUYJKCBJTywgX19WQV9BUkdTX18gKQorCisKKyNpZiBERUJVR19TWU1CT0wgPT0gMAorI2RlZmluZSBOREVCVUcKKyNlbmRpZgorCisjZW5kaWYgLyogQVNTRU1CTFkgKi8KKy8qKiBAfSAqLworCisvKiogQGRlZmdyb3VwIGF0dHJzIE1pc2NlbGxhbmVvdXMgYXR0cmlidXRlcworICogQHsKKyAqLworI2lmbmRlZiBBU1NFTUJMWQorCisvKiogRGVjbGFyZSBhIGRhdGEgc3RydWN0dXJlIGFzIHBhY2tlZC4gKi8KKyNkZWZpbmUgUEFDS0VEIF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpCisKKy8qKiBEZWNsYXJlIGEgdmFyaWFibGUgb3IgZGF0YSBzdHJ1Y3R1cmUgYXMgdW51c2VkLiAqLworI2RlZmluZSBfX3VudXNlZCBfX2F0dHJpYnV0ZV9fICgoIHVudXNlZCApKQorCisvKioKKyAqIERlY2xhcmUgYSBmdW5jdGlvbiBhcyBwdXJlIC0gaS5lLiB3aXRob3V0IHNpZGUgZWZmZWN0cworICovCisjZGVmaW5lIF9fcHVyZSBfX2F0dHJpYnV0ZV9fICgoIHB1cmUgKSkKKworLyoqCisgKiBEZWNsYXJlIGEgZnVuY3Rpb24gYXMgY29uc3QgLSBpLmUuIGl0IGRvZXMgbm90IGFjY2VzcyBnbG9iYWwgbWVtb3J5CisgKiAoaW5jbHVkaW5nIGRlcmVmZXJlbmNpbmcgcG9pbnRlcnMgcGFzc2VkIHRvIGl0KSBhdCBhbGwuCisgKiBNdXN0IGFsc28gbm90IGNhbGwgYW55IG5vbi1jb25zdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgX19jb25zdCBfX2F0dHJpYnV0ZV9fICgoIGNvbnN0ICkpCisKKy8qKgorICogRGVjbGFyZSBhIGZ1bmN0aW9uJ3MgcG9pbnRlciBwYXJhbWV0ZXJzIGFzIG5vbi1udWxsIC0gaS5lLiBmb3JjZQorICogY29tcGlsZXIgdG8gY2hlY2sgcG9pbnRlcnMgYXQgY29tcGlsZSB0aW1lIGFuZCBlbmFibGUgcG9zc2libGUKKyAqIG9wdGltaXphdGlvbnMgYmFzZWQgb24gdGhhdCBmYWN0CisgKi8KKyNkZWZpbmUgX19ub25udWxsIF9fYXR0cmlidXRlX18gKCggbm9ubnVsbCApKQorCisvKioKKyAqIERlY2xhcmUgYSBwb2ludGVyIHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gYXMgYSB1bmlxdWUgbWVtb3J5IGFkZHJlc3MKKyAqIGFzIHJldHVybmVkIGJ5IG1hbGxvYy10eXBlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBfX21hbGxvYyBfX2F0dHJpYnV0ZV9fICgoIG1hbGxvYyApKQorCisvKioKKyAqIERlY2xhcmUgYSBmdW5jdGlvbiBhcyB1c2VkLgorICoKKyAqIE5lY2Vzc2FyeSBvbmx5IGlmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBmcm9tIGFzc2VtYmxlciBjb2RlLgorICovCisjZGVmaW5lIF9fdXNlZCBfX2F0dHJpYnV0ZV9fICgoIHVzZWQgKSkKKworLyoqIERlY2xhcmUgYSBkYXRhIHN0cnVjdHVyZSB0byBiZSBhbGlnbmVkIHdpdGggMTYtYnl0ZSBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgX19hbGlnbmVkIF9fYXR0cmlidXRlX18gKCggYWxpZ25lZCAoIDE2ICkgKSkKKworLyoqIERlY2xhcmUgYSBmdW5jdGlvbiB0byBiZSBhbHdheXMgaW5saW5lICovCisjZGVmaW5lIF9fYWx3YXlzX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkKKworLyoqCisgKiBTaGFyZWQgZGF0YS4KKyAqCisgKiBUbyBzYXZlIHNwYWNlIGluIHRoZSBiaW5hcnkgd2hlbiBtdWx0aXBsZS1kcml2ZXIgaW1hZ2VzIGFyZQorICogY29tcGlsZWQsIHVuaW5pdGlhbGlzZWQgZGF0YSBhcmVhcyBjYW4gYmUgc2hhcmVkIGJldHdlZW4gZHJpdmVycy4KKyAqIFRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCB0byBzaGFyZSBzdGF0aWNhbGx5LWFsbG9jYXRlZCByZWNlaXZlCisgKiBhbmQgdHJhbnNtaXQgYnVmZmVycyBiZXR3ZWVuIGRyaXZlcnMuCisgKgorICogVXNlIGFzIGUuZy4KKyAqCisgKiBAY29kZQorICoKKyAqICAgc3RydWN0IHsKKyAqCWNoYXIJcnhfYnVmW05VTV9SWF9CVUZdW1JYX0JVRl9TSVpFXTsKKyAqCWNoYXIJdHhfYnVmW1RYX0JVRl9TSVpFXTsKKyAqICAgfSBteV9zdGF0aWNfZGF0YSBfX3NoYXJlZDsKKyAqCisgKiBAZW5kY29kZQorICoKKyAqLworI2RlZmluZSBfX3NoYXJlZCBfX2FzbV9fICggIl9zaGFyZWRfYnNzIiApIF9fYWxpZ25lZAorCisjZW5kaWYgLyogQVNTRU1CTFkgKi8KKy8qKiBAfSAqLworCisvKioKKyAqIE9wdGltaXNhdGlvbiBiYXJyaWVyCisgKi8KKyNpZm5kZWYgQVNTRU1CTFkKKyNkZWZpbmUgYmFycmllcigpIF9fYXNtX18gX192b2xhdGlsZV9fICggIiIgOiA6IDogIm1lbW9yeSIgKQorI2VuZGlmIC8qIEFTU0VNQkxZICovCisKKy8qKgorICogQGRlZmdyb3VwIGxpY2VuY2VzIExpY2VuY2UgZGVjbGFyYXRpb25zCisgKgorICogRm9yIHJlYXNvbnMgdGhhdCBhcmUgcGFydGx5IGhpc3RvcmljYWwsIHZhcmlvdXMgZGlmZmVyZW50IGZpbGVzCisgKiB3aXRoaW4gdGhlIGdQWEUgY29kZWJhc2UgaGF2ZSBkaWZmZXJpbmcgbGljZW5jZXMuCisgKgorICogQHsKKyAqLworCisvKiogRGVjbGFyZSBhIGZpbGUgYXMgYmVpbmcgaW4gdGhlIHB1YmxpYyBkb21haW4KKyAqCisgKiBUaGlzIGxpY2VuY2UgZGVjbGFyYXRpb24gaXMgYXBwbGljYWJsZSB3aGVuIGEgZmlsZSBzdGF0ZXMgaXRzZWxmIHRvCisgKiBiZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyAqLworI2RlZmluZSBGSUxFX0xJQ0VOQ0VfUFVCTElDX0RPTUFJTiBcCisJUFJPVklERV9TWU1CT0wgKCBfX2xpY2VuY2VfcHVibGljX2RvbWFpbiApCisKKy8qKiBEZWNsYXJlIGEgZmlsZSBhcyBiZWluZyB1bmRlciB2ZXJzaW9uIDIgKG9yIGxhdGVyKSBvZiB0aGUgR05VIEdQTAorICoKKyAqIFRoaXMgbGljZW5jZSBkZWNsYXJhdGlvbiBpcyBhcHBsaWNhYmxlIHdoZW4gYSBmaWxlIHN0YXRlcyBpdHNlbGYgdG8KKyAqIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR1BMOyAiZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24iLgorICovCisjZGVmaW5lIEZJTEVfTElDRU5DRV9HUEwyX09SX0xBVEVSIFwKKwlQUk9WSURFX1NZTUJPTCAoIF9fbGljZW5jZV9ncGwyX29yX2xhdGVyICkKKworLyoqIERlY2xhcmUgYSBmaWxlIGFzIGJlaW5nIHVuZGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdQTAorICoKKyAqIFRoaXMgbGljZW5jZSBkZWNsYXJhdGlvbiBpcyBhcHBsaWNhYmxlIHdoZW4gYSBmaWxlIHN0YXRlcyBpdHNlbGYgdG8KKyAqIGJlIGxpY2Vuc2VkIHVuZGVyIHZlcnNpb24gMiBvZiB0aGUgR1BMLCBhbmQgZG9lcyBub3QgaW5jbHVkZSB0aGUKKyAqICJvciwgYXQgeW91ciBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uIiBjbGF1c2UuCisgKi8KKyNkZWZpbmUgRklMRV9MSUNFTkNFX0dQTDJfT05MWSBcCisJUFJPVklERV9TWU1CT0wgKCBfX2xpY2VuY2VfZ3BsMl9vbmx5ICkKKworLyoqIERlY2xhcmUgYSBmaWxlIGFzIGJlaW5nIHVuZGVyIGFueSB2ZXJzaW9uIG9mIHRoZSBHTlUgR1BMCisgKgorICogVGhpcyBsaWNlbmNlIGRlY2xhcmF0aW9uIGlzIGFwcGxpY2FibGUgd2hlbiBhIGZpbGUgc3RhdGVzIGl0c2VsZiB0bworICogYmUgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCwgYnV0IGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uLgorICoKKyAqIEFjY29yZGluZyB0byBzZWN0aW9uIDkgb2YgdGhlIEdQTHYyLCAiSWYgdGhlIFByb2dyYW0gZG9lcyBub3QKKyAqIHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueQorICogdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIi4KKyAqLworI2RlZmluZSBGSUxFX0xJQ0VOQ0VfR1BMX0FOWSBcCisJUFJPVklERV9TWU1CT0wgKCBfX2xpY2VuY2VfZ3BsX2FueSApCisKKy8qKiBEZWNsYXJlIGEgZmlsZSBhcyBiZWluZyB1bmRlciB0aGUgdGhyZWUtY2xhdXNlIEJTRCBsaWNlbmNlCisgKgorICogVGhpcyBsaWNlbmNlIGRlY2xhcmF0aW9uIGlzIGFwcGxpY2FibGUgd2hlbiBhIGZpbGUgc3RhdGVzIGl0c2VsZiB0bworICogYmUgbGljZW5zZWQgdW5kZXIgdGVybXMgYWxsb3dpbmcgcmVkaXN0cmlidXRpb24gaW4gc291cmNlIGFuZAorICogYmluYXJ5IGZvcm1zICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSBwcm92aWRlZCB0aGF0OgorICoKKyAqICAgICByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgcmV0YWluIHRoZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgYW55IGF0dGFjaGVkIGRpc2NsYWltZXJzCisgKgorICogICAgIHJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSByZXByb2R1Y2UgdGhlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCBhbnkgYXR0YWNoZWQgZGlzY2xhaW1lcnMgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uCisgKgorICogICAgIHRoZSBuYW1lIG9mIHRoZSBhdXRob3IgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICAgd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogSXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIGZpbGUgdG8gZXhwbGljaXRseSBzdGF0ZSB0aGF0IGl0IGlzCisgKiB1bmRlciBhICJCU0QiIGxpY2VuY2U7IG9ubHkgdGhhdCB0aGUgbGljZW5zaW5nIHRlcm1zIGJlCisgKiBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byB0aGUgc3RhbmRhcmQgdGhyZWUtY2xhdXNlIEJTRCBsaWNlbmNlLgorICovCisjZGVmaW5lIEZJTEVfTElDRU5DRV9CU0QzIFwKKwlQUk9WSURFX1NZTUJPTCAoIF9fbGljZW5jZV9ic2QzICkKKworLyoqIERlY2xhcmUgYSBmaWxlIGFzIGJlaW5nIHVuZGVyIHRoZSB0d28tY2xhdXNlIEJTRCBsaWNlbmNlCisgKgorICogVGhpcyBsaWNlbmNlIGRlY2xhcmF0aW9uIGlzIGFwcGxpY2FibGUgd2hlbiBhIGZpbGUgc3RhdGVzIGl0c2VsZiB0bworICogYmUgbGljZW5zZWQgdW5kZXIgdGVybXMgYWxsb3dpbmcgcmVkaXN0cmlidXRpb24gaW4gc291cmNlIGFuZAorICogYmluYXJ5IGZvcm1zICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSBwcm92aWRlZCB0aGF0OgorICoKKyAqICAgICByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgcmV0YWluIHRoZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgYW55IGF0dGFjaGVkIGRpc2NsYWltZXJzCisgKgorICogICAgIHJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSByZXByb2R1Y2UgdGhlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCBhbnkgYXR0YWNoZWQgZGlzY2xhaW1lcnMgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uCisgKgorICogSXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIGZpbGUgdG8gZXhwbGljaXRseSBzdGF0ZSB0aGF0IGl0IGlzCisgKiB1bmRlciBhICJCU0QiIGxpY2VuY2U7IG9ubHkgdGhhdCB0aGUgbGljZW5zaW5nIHRlcm1zIGJlCisgKiBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byB0aGUgc3RhbmRhcmQgdHdvLWNsYXVzZSBCU0QgbGljZW5jZS4KKyAqLworI2RlZmluZSBGSUxFX0xJQ0VOQ0VfQlNEMiBcCisJUFJPVklERV9TWU1CT0wgKCBfX2xpY2VuY2VfYnNkMiApCisKKy8qKiBEZWNsYXJlIGEgZmlsZSBhcyBiZWluZyB1bmRlciB0aGUgb25lLWNsYXVzZSBNSVQtc3R5bGUgbGljZW5jZQorICoKKyAqIFRoaXMgbGljZW5jZSBkZWNsYXJhdGlvbiBpcyBhcHBsaWNhYmxlIHdoZW4gYSBmaWxlIHN0YXRlcyBpdHNlbGYgdG8KKyAqIGJlIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIGFsbG93aW5nIHJlZGlzdHJpYnV0aW9uIGZvciBhbnkgcHVycG9zZQorICogd2l0aCBvciB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICovCisjZGVmaW5lIEZJTEVfTElDRU5DRV9NSVQgXAorCVBST1ZJREVfU1lNQk9MICggX19saWNlbmNlX21pdCApCisKKy8qKiBEZWNsYXJlIGEgcGFydGljdWxhciBsaWNlbmNlIGFzIGFwcGx5aW5nIHRvIGEgZmlsZSAqLworI2RlZmluZSBGSUxFX0xJQ0VOQ0UoIF9saWNlbmNlICkgRklMRV9MSUNFTkNFXyAjIyBfbGljZW5jZQorCisvKiogQH0gKi8KKworLyogVGhpcyBmaWxlIGl0c2VsZiBpcyB1bmRlciBHUEx2Mi1vci1sYXRlciAqLworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Yml0cy9jb21waWxlci5oPgorCisjZW5kaWYgLyogQ09NUElMRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9jb25zb2xlLmggYi9ncHhlL3NyYy9pbmNsdWRlL2NvbnNvbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmZlZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9jb25zb2xlLmgKQEAgLTAsMCArMSwxMTkgQEAKKyNpZm5kZWYgQ09OU09MRV9ICisjZGVmaW5lIENPTlNPTEVfSAorCisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKworLyoqIEBmaWxlCisgKgorICogVXNlciBpbnRlcmFjdGlvbi4KKyAqCisgKiBWYXJpb3VzIGNvbnNvbGUgZGV2aWNlcyBjYW4gYmUgc2VsZWN0ZWQgdmlhIHRoZSBidWlsZCBvcHRpb25zCisgKiBDT05TT0xFX0ZJUk1XQVJFLCBDT05TT0xFX1NFUklBTCBldGMuICBUaGUgY29uc29sZSBmdW5jdGlvbnMKKyAqIHB1dGNoYXIoKSwgZ2V0Y2hhcigpIGFuZCBpc2tleSgpIGRlbGVnYXRlIHRvIHRoZSBpbmRpdmlkdWFsIGNvbnNvbGUKKyAqIGRyaXZlcnMuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBBIGNvbnNvbGUgZHJpdmVyCisgKgorICogRGVmaW5lcyB0aGUgZnVuY3Rpb25zIHRoYXQgaW1wbGVtZW50IGEgcGFydGljdWxhciBjb25zb2xlIHR5cGUuCisgKiBNdXN0IGJlIG1hZGUgcGFydCBvZiB0aGUgY29uc29sZSBkcml2ZXJzIHRhYmxlIGJ5IHVzaW5nCisgKiAjX19jb25zb2xlX2RyaXZlci4KKyAqCisgKiBAbm90ZSBDb25zb2xlcyB0aGF0IGNhbm5vdCBiZSB1c2VkIGJlZm9yZSB0aGVpciBpbml0aWFsaXNhdGlvbgorICogZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCBzaG91bGQgc2V0ICNkaXNhYmxlZD0xIGluaXRpYWxseS4gIFRoaXMKKyAqIGFsbG93cyBvdGhlciBjb25zb2xlIGRldmljZXMgdG8gc3RpbGwgYmUgdXNlZCB0byBwcmludCBvdXQgZWFybHkKKyAqIGRlYnVnZ2luZyBtZXNzYWdlcy4KKyAqCisgKi8KK3N0cnVjdCBjb25zb2xlX2RyaXZlciB7CisJLyoqIENvbnNvbGUgaXMgZGlzYWJsZWQuCisJICoKKwkgKiBUaGUgY29uc29sZSdzIHB1dGNoYXIoKSwgcHV0bGluZSgpLCBnZXRjaGFyKCkgYW5kIGlza2V5KCkKKwkgKiBtZXRob2RzIHdpbGwgbm90IGJlIGNhbGxlZCB3aGlsZSAjZGlzYWJsZWQ9PTEuIFR5cGljYWxseQorCSAqIHRoZSBjb25zb2xlJ3MgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zIHdpbGwgc2V0ICNkaXNhYmxlZD0wCisJICogdXBvbiBjb21wbGV0aW9uLgorCSAqCisJICovCisJaW50IGRpc2FibGVkOworCisJLyoqIFdyaXRlIGEgY2hhcmFjdGVyIHRvIHRoZSBjb25zb2xlLgorCSAqCisJICogQHYgY2hhcmFjdGVyCQlDaGFyYWN0ZXIgdG8gYmUgd3JpdHRlbgorCSAqIEByZXQgTm9uZQkJLQorCSAqIEBlcnIgTm9uZQkJLQorCSAqCisJICovCisJdm9pZCAoICpwdXRjaGFyICkgKCBpbnQgY2hhcmFjdGVyICk7CisKKwkvKiogV3JpdGUgYW4gZW50aXJlIGxpbmUgdG8gdGhlIGNvbnNvbGUuCisJICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGxpbmUtb3JpZW50ZWQgb3V0cHV0IG1lZGlhLAorCSAqIGxpa2Ugc3lzdGVtIGxvZ2dpbmcgZmFjaWxpdGllcyBvciBsaW5lIHByaW50ZXJzLgorCSAqIExpbmUgb3V0cHV0IHdpbGwgbm90IGNvbnRhaW4gbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzLgorCSAqCisJICogQHYgbGluZWJ1ZmZlcglQb2ludGVyIHRvIHRoZSBcMC10ZXJtaW5hdGVkIGxpbmUKKwkgKiBAcmV0IE5vbmUJCS0KKwkgKiBAZXJyIE5vbmUJCS0KKwkgKi8KKwl2b2lkICggKiBwdXRsaW5lICkgKCB1bnNpZ25lZCBjaGFyICogbGluZWJ1ZmZlciApOworCisJLyoqIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgY29uc29sZS4KKwkgKgorCSAqIEB2IE5vbmUJCS0KKwkgKiBAcmV0IGNoYXJhY3RlcglDaGFyYWN0ZXIgcmVhZAorCSAqIEBlcnIgTm9uZQkJLQorCSAqCisJICogSWYgbm8gY2hhcmFjdGVyIGlzIGF2YWlsYWJsZSB0byBiZSByZWFkLCB0aGlzIG1ldGhvZCB3aWxsCisJICogYmxvY2suICBUaGUgY2hhcmFjdGVyIHJlYWQgc2hvdWxkIG5vdCBiZSBlY2hvZWQgYmFjayB0byB0aGUKKwkgKiBjb25zb2xlLgorCSAqCisJICovCisJaW50ICggKmdldGNoYXIgKSAoIHZvaWQgKTsKKworCS8qKiBDaGVjayBmb3IgYXZhaWxhYmxlIGlucHV0LgorCSAqCisJICogQHYgTm9uZQkJLQorCSAqIEByZXQgVHJ1ZQkJSW5wdXQgaXMgYXZhaWxhYmxlCisJICogQHJldCBGYWxzZQkJSW5wdXQgaXMgbm90IGF2YWlsYWJsZQorCSAqIEBlcnIgTm9uZQkJLQorCSAqCisJICogVGhpcyBzaG91bGQgcmV0dXJuIFRydWUgaWYgYSBzdWJzZXF1ZW50IGNhbGwgdG8gZ2V0Y2hhcigpCisJICogd2lsbCBub3QgYmxvY2suCisJICoKKwkgKi8KKwlpbnQgKCAqaXNrZXkgKSAoIHZvaWQgKTsKK307CisKKy8qKiBDb25zb2xlIGRyaXZlciB0YWJsZSAqLworI2RlZmluZSBDT05TT0xFUyBfX3RhYmxlICggc3RydWN0IGNvbnNvbGVfZHJpdmVyLCAiY29uc29sZXMiICkKKworLyoqCisgKiBNYXJrIGEgPHR0PiBzdHJ1Y3QgY29uc29sZV9kcml2ZXIgPC90dD4gYXMgYmVpbmcgcGFydCBvZiB0aGUKKyAqIGNvbnNvbGUgZHJpdmVycyB0YWJsZS4KKyAqCisgKiBVc2UgYXMgZS5nLgorICoKKyAqIEBjb2RlCisgKgorICogICBzdHJ1Y3QgY29uc29sZV9kcml2ZXIgbXlfY29uc29sZSBfX2NvbnNvbGVfZHJpdmVyID0geworICogICAgICAucHV0Y2hhciA9IG15X3B1dGNoYXIsCisgKgkuZ2V0Y2hhciA9IG15X2dldGNoYXIsCisgKgkuaXNrZXkgPSBteV9pc2tleSwKKyAqICAgfTsKKyAqCisgKiBAZW5kY29kZQorICoKKyAqLworI2RlZmluZSBfX2NvbnNvbGVfZHJpdmVyIF9fdGFibGVfZW50cnkgKCBDT05TT0xFUywgMDEgKQorCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCisKK2V4dGVybiB2b2lkIHB1dGNoYXIgKCBpbnQgY2hhcmFjdGVyICk7CitleHRlcm4gaW50IGdldGNoYXIgKCB2b2lkICk7CitleHRlcm4gaW50IGlza2V5ICggdm9pZCApOworZXh0ZXJuIGludCBnZXRrZXkgKCB2b2lkICk7CisKKyNlbmRpZiAvKiBDT05TT0xFX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvY3B1LmggYi9ncHhlL3NyYy9pbmNsdWRlL2NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzQyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2NwdS5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBDUFVfSAorI2RlZmluZSBDUFVfSAorCisjaW5jbHVkZSAiYml0cy9jcHUuaCIKKworI2VuZGlmIC8qIENQVV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2N0eXBlLmggYi9ncHhlL3NyYy9pbmNsdWRlL2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0ZDg4NAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvY3R5cGUuaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIF9DVFlQRV9ICisjZGVmaW5lIF9DVFlQRV9ICisKKy8qKiBAZmlsZQorICoKKyAqIENoYXJhY3RlciB0eXBlcworICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2RlZmluZSBpc2RpZ2l0KGMpCSgoYykgPj0gJzAnICYmIChjKSA8PSAnOScpCisjZGVmaW5lIGlzbG93ZXIoYykJKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgaXN1cHBlcihjKQkoKGMpID49ICdBJyAmJiAoYykgPD0gJ1onKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgdG9sb3dlcih1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKGlzdXBwZXIoYykpCisJCWMgLT0gJ0EnLSdhJzsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHRvdXBwZXIodW5zaWduZWQgY2hhciBjKQoreworCWlmIChpc2xvd2VyKGMpKQorCQljIC09ICdhJy0nQSc7CisJcmV0dXJuIGM7Cit9CisKK2V4dGVybiBpbnQgaXNzcGFjZSAoIGludCBjICk7CisKKyNlbmRpZiAvKiBfQ1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9jdXJzZXMuaCBiL2dweGUvc3JjL2luY2x1ZGUvY3Vyc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjNWFmMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvY3Vyc2VzLmgKQEAgLTAsMCArMSw3NTUgQEAKKyNpZm5kZWYgQ1VSU0VTX0gKKyNkZWZpbmUgQ1VSU0VTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBNdUN1cnNlcyBoZWFkZXIgZmlsZQorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyN1bmRlZiAgRVJSCisjZGVmaW5lIEVSUgkoLTEpCisKKyN1bmRlZiAgRkFMU0UKKyNkZWZpbmUgRkFMU0UJKDApCisKKyN1bmRlZiAgT0sKKyNkZWZpbmUgT0sJKDApCisKKyN1bmRlZiAgVFJVRQorI2RlZmluZSBUUlVFCSgxKQorCit0eXBlZGVmIGludCBib29sOwordHlwZWRlZiB1aW50MzJfdCBjaHR5cGU7Cit0eXBlZGVmIHVpbnQzMl90IGF0dHJfdDsKKworLyoqIEN1cnNlcyBTQ1JFRU4gb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBfY3Vyc2VzX3NjcmVlbiB7CisJLyoqIEN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uICovCisJdW5zaWduZWQgaW50IGN1cnNfeCwgY3Vyc195OworCS8qKiBDdXJyZW50IGF0dHJpYnV0ZSAqLworCWF0dHJfdCBhdHRyczsKKworCXZvaWQgKCAqaW5pdCApICggc3RydWN0IF9jdXJzZXNfc2NyZWVuICpzY3IgKTsKKwl2b2lkICggKmV4aXQgKSAoIHN0cnVjdCBfY3Vyc2VzX3NjcmVlbiAqc2NyICk7CisJLyoqCisJICogTW92ZSBjdXJzb3IgdG8gcG9zaXRpb24gc3BlY2lmaWVkIGJ5IHgseSBjb29yZHMKKwkgKgorCSAqIEB2IHNjcglzY3JlZW4gb24gd2hpY2ggdG8gb3BlcmF0ZQorCSAqIEB2IHkJCVkgcG9zaXRpb24KKwkgKiBAdiB4CQlYIHBvc2l0aW9uCisJICovCisJdm9pZCAoICogbW92ZXRveXggKSAoIHN0cnVjdCBfY3Vyc2VzX3NjcmVlbiAqc2NyLAorCQkJICAgICAgdW5zaWduZWQgaW50IHksIHVuc2lnbmVkIGludCB4ICk7CisJLyoqCisJICogV3JpdGUgY2hhcmFjdGVyIHRvIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCisJICoKKwkgKiBAdiBzY3IJc2NyZWVuIG9uIHdoaWNoIHRvIG9wZXJhdGUKKwkgKiBAdiBjCQljaGFyYWN0ZXIgdG8gYmUgd3JpdHRlbgorCSAqLworCXZvaWQgKCAqIHB1dGMgKSAoIHN0cnVjdCBfY3Vyc2VzX3NjcmVlbiAqc2NyLCBjaHR5cGUgYyApOworCS8qKgorCSAqIFBvcCBhIGNoYXJhY3RlciBmcm9tIHRoZSBrZXlib2FyZCBpbnB1dCBzdHJlYW0KKwkgKgorCSAqIEB2IHNjcglzY3JlZW4gb24gd2hpY2ggdG8gb3BlcmF0ZQorCSAqIEByZXQgYwlwb3BwZWQgY2hhcmFjdGVyCisJICovCisJaW50ICggKiBnZXRjICkgKCBzdHJ1Y3QgX2N1cnNlc19zY3JlZW4gKnNjciApOworCS8qKgorCSAqIENoZWNrcyB0byBzZWUgd2hldGhlciBhIGNoYXJhY3RlciBpcyB3YWl0aW5nIGluIHRoZSBpbnB1dCBzdHJlYW0KKwkgKgorCSAqIEB2IHNjcglzY3JlZW4gb24gd2hpY2ggdG8gb3BlcmF0ZQorCSAqIEByZXQgVFJVRQljaGFyYWN0ZXIgd2FpdGluZyBpbiBzdHJlYW0KKwkgKiBAcmV0IEZBTFNFCW5vIGNoYXJhY3RlciB3YWl0aW5nIGluIHN0cmVhbQorCSAqLworCWJvb2wgKCAqcGVlayApICggc3RydWN0IF9jdXJzZXNfc2NyZWVuICpzY3IgKTsKK30gU0NSRUVOOworCisvKiogQ3Vyc2VzIFdpbmRvdyBzdHJ1Y3QgKi8KK3R5cGVkZWYgc3RydWN0IF9jdXJzZXNfd2luZG93IHsKKwkvKiogc2NyZWVuIHdpdGggd2hpY2ggd2luZG93IGFzc29jaWF0ZXMgKi8KKwlTQ1JFRU4gKnNjcjsKKwkvKiogd2luZG93IGF0dHJpYnV0ZXMgKi8KKwlhdHRyX3QgYXR0cnM7CisJLyoqIHdpbmRvdyBvcmlnaW4gY29vcmRpbmF0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgb3JpX3gsIG9yaV95OworCS8qKiB3aW5kb3cgY3Vyc29yIHBvc2l0aW9uICovCisJdW5zaWduZWQgaW50IGN1cnNfeCwgY3Vyc195OworCS8qKiB3aW5kb3cgZGltZW5zaW9ucyAqLworCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworCS8qKiBwYXJlbnQgd2luZG93ICovCisJc3RydWN0IF9jdXJzZXNfd2luZG93ICpwYXJlbnQ7CisJLyoqIHdpbmRvd3MgdGhhdCBzaGFyZSB0aGUgc2FtZSBwYXJlbnQgYXMgdGhpcyBvbmUgKi8KKwkvL3N0cnVjdCBsaXN0X2hlYWQgc2libGluZ3M7CisJLyoqIHdpbmRvd3MgZGVyJ2Qgb3Igc3ViJ2QgZnJvbSB0aGlzIG9uZSAqLworCS8vc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsKK30gV0lORE9XOworCitleHRlcm4gV0lORE9XIF9zdGRzY3I7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgX0NPTFM7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgX0xJTkVTOworCisjZGVmaW5lIHN0ZHNjciAoICZfc3Rkc2NyICkKKyNkZWZpbmUgQ09MUyBfQ09MUworI2RlZmluZSBMSU5FUyBfTElORVMKKworI2RlZmluZSBNVUNVUlNFU19CSVRTKCBtYXNrLCBzaGlmdCApICgoIG1hc2sgKSA8PCAoc2hpZnQpKQorI2RlZmluZSBDUEFJUl9TSElGVAk4CisjZGVmaW5lIEFUVFJTX1NISUZUCTE2CisKKyNkZWZpbmUgV0FfREVGQVVMVAkoIDB4MDAwMCA8PCBBVFRSU19TSElGVCApCisjZGVmaW5lIFdBX0FMVENIQVJTRVQJKCAweDAwMDEgPDwgQVRUUlNfU0hJRlQgKQorI2RlZmluZSBXQV9CTElOSwkoIDB4MDAwMiA8PCBBVFRSU19TSElGVCApCisjZGVmaW5lIFdBX0JPTEQJCSggMHgwMDA0IDw8IEFUVFJTX1NISUZUICkKKyNkZWZpbmUgV0FfRElNCQkoIDB4MDAwOCA8PCBBVFRSU19TSElGVCApCisjZGVmaW5lIFdBX0lOVklTCSggMHgwMDEwIDw8IEFUVFJTX1NISUZUICkKKyNkZWZpbmUgV0FfUFJPVEVDVAkoIDB4MDAyMCA8PCBBVFRSU19TSElGVCApCisjZGVmaW5lIFdBX1JFVkVSU0UJKCAweDAwNDAgPDwgQVRUUlNfU0hJRlQgKQorI2RlZmluZSBXQV9TVEFORE9VVAkoIDB4MDA4MCA8PCBBVFRSU19TSElGVCApCisjZGVmaW5lIFdBX1VOREVSTElORQkoIDB4MDEwMCA8PCBBVFRSU19TSElGVCApCisjZGVmaW5lIFdBX0hPUklaT05UQUwJKCAweDAyMDAgPDwgQVRUUlNfU0hJRlQgKQorI2RlZmluZSBXQV9WRVJUSUNBTAkoIDB4MDQwMCA8PCBBVFRSU19TSElGVCApCisjZGVmaW5lIFdBX0xFRlQJCSggMHgwODAwIDw8IEFUVFJTX1NISUZUICkKKyNkZWZpbmUgV0FfUklHSFQJKCAweDEwMDAgPDwgQVRUUlNfU0hJRlQgKQorI2RlZmluZSBXQV9MT1cJCSggMHgyMDAwIDw8IEFUVFJTX1NISUZUICkKKyNkZWZpbmUgV0FfVE9QCQkoIDB4NDAwMCA8PCBBVFRSU19TSElGVCApCisKKyNkZWZpbmUgQV9ERUZBVUxUCVdBX0RFRkFVTFQKKyNkZWZpbmUgQV9BTFRDSEFSU0VUCVdBX0FMVENIQVJTRVQKKyNkZWZpbmUgQV9CTElOSwkJV0FfQkxJTksKKyNkZWZpbmUgQV9CT0xECQlXQV9CT0xECisjZGVmaW5lIEFfRElNCQlXQV9ESU0KKyNkZWZpbmUgQV9JTlZJUwkJV0FfSU5WSVMKKyNkZWZpbmUgQV9QUk9URUNUCVdBX1BST1RFQ1QKKyNkZWZpbmUgQV9SRVZFUlNFCVdBX1JFVkVSU0UKKyNkZWZpbmUgQV9TVEFORE9VVAlXQV9TVEFORE9VVAorI2RlZmluZSBBX1VOREVSTElORQlXQV9VTkRFUkxJTkUKKworI2RlZmluZSBBX0FUVFJJQlVURVMJKCAweGZmZmYgPDwgQVRUUlNfU0hJRlQgKQorI2RlZmluZSBBX0NIQVJURVhUCSggMHhmZiApCisjZGVmaW5lIEFfQ09MT1VSCSggMHhmZiA8PCBDUEFJUl9TSElGVCApCisjZGVmaW5lIEFfQ09MT1IJCUFfQ09MT1VSCisKKyNkZWZpbmUgQ09MT1VSX1BBSVIobikJKCAobikgPDwgQ1BBSVJfU0hJRlQgKQorI2RlZmluZSBDT0xPUl9QQUlSKG4pCUNPTE9VUl9QQUlSKG4pCisjZGVmaW5lIFBBSVJfTlVNQkVSKGF0dHJzKSAoICggKGF0dHJzKSAmIEFfQ09MT1VSICkgPj4gQ1BBSVJfU0hJRlQgKQorCisjZGVmaW5lIENPTE9VUl9QQUlSUwk4IC8qIEFyYml0cmFyeSBsaW1pdCAqLworI2RlZmluZSBDT0xPUl9QQUlSUwlDT0xPVVJfUEFJUlMKKworI2RlZmluZSBBQ1NfVUxDT1JORVIJJysnCisjZGVmaW5lIEFDU19MTENPUk5FUgknKycKKyNkZWZpbmUgQUNTX1VSQ09STkVSCScrJworI2RlZmluZSBBQ1NfTFJDT1JORVIJJysnCisjZGVmaW5lIEFDU19SVEVFCScrJworI2RlZmluZSBBQ1NfTFRFRQknKycKKyNkZWZpbmUgQUNTX0JURUUJJysnCisjZGVmaW5lIEFDU19UVEVFCScrJworI2RlZmluZSBBQ1NfSExJTkUJJy0nCisjZGVmaW5lIEFDU19WTElORQknfCcKKyNkZWZpbmUgQUNTX1BMVVMJJysnCisjZGVmaW5lIEFDU19TMQkJJy0nCisjZGVmaW5lIEFDU19TOQkJJ18nCisjZGVmaW5lIEFDU19ESUFNT05ECScrJworI2RlZmluZSBBQ1NfQ0tCT0FSRAknOicKKyNkZWZpbmUgQUNTX0RFR1JFRQknXCcnCisjZGVmaW5lIEFDU19QTE1JTlVTCScjJworI2RlZmluZSBBQ1NfQlVMTEVUCSdvJworI2RlZmluZSBBQ1NfTEFSUk9XCSc8JworI2RlZmluZSBBQ1NfUkFSUk9XCSc+JworI2RlZmluZSBBQ1NfREFSUk9XCSd2JworI2RlZmluZSBBQ1NfVUFSUk9XCSdeJworI2RlZmluZSBBQ1NfQk9BUkQJJyMnCisjZGVmaW5lIEFDU19MQU5URVJOCScjJworI2RlZmluZSBBQ1NfQkxPQ0sJJyMnCisKKyNkZWZpbmUgQ09MT1VSX0JMQUNLCTAKKyNkZWZpbmUgQ09MT1VSX1JFRAkxCisjZGVmaW5lIENPTE9VUl9HUkVFTgkyCisjZGVmaW5lIENPTE9VUl9ZRUxMT1cJMworI2RlZmluZSBDT0xPVVJfQkxVRQk0CisjZGVmaW5lIENPTE9VUl9NQUdFTlRBCTUKKyNkZWZpbmUgQ09MT1VSX0NZQU4JNgorI2RlZmluZSBDT0xPVVJfV0hJVEUJNworI2RlZmluZSBDT0xPVVJTCQk3CisKKyNkZWZpbmUgQ09MT1VSX0ZHCTMwCisjZGVmaW5lIENPTE9VUl9CRwk0MAorI2RlZmluZSBDT0xPUl9GRwlDT0xPVVJfRkcKKyNkZWZpbmUgQ09MT1JfQkcJQ09MT1VSX0JHCisKKyNkZWZpbmUgQ09MT1JfQkxBQ0sJQ09MT1VSX0JMQUNLCisjZGVmaW5lIENPTE9SX0JMVUUJQ09MT1VSX0JMVUUKKyNkZWZpbmUgQ09MT1JfR1JFRU4JQ09MT1VSX0dSRUVOCisjZGVmaW5lIENPTE9SX0NZQU4JQ09MT1VSX0NZQU4KKyNkZWZpbmUgQ09MT1JfUkVECUNPTE9VUl9SRUQKKyNkZWZpbmUgQ09MT1JfTUFHRU5UQQlDT0xPVVJfTUFHRU5UQQorI2RlZmluZSBDT0xPUl9ZRUxMT1cJQ09MT1VSX1lFTExPVworI2RlZmluZSBDT0xPUl9XSElURQlDT0xPVVJfV0hJVEUKKyNkZWZpbmUgQ09MT1JTCQlDT0xPVVJTCisKKy8qCisgKiBLRVkgY29kZSBjb25zdGFudHMgYXJlIGRlZmluZSBpbiBncHhlL2tleXMuaAorICovCisjaW5jbHVkZSA8Z3B4ZS9rZXlzLmg+CisKKy8vZXh0ZXJuIGludCBhZGRjaCAoIGNvbnN0IGNodHlwZSAqICk7CisvL2V4dGVybiBpbnQgYWRkY2huc3RyICggY29uc3QgY2h0eXBlICosIGludCApOworLy9leHRlcm4gaW50IGFkZGNoc3RyICggY29uc3QgY2h0eXBlICogKTsKKy8vZXh0ZXJuIGludCBhZGRuc3RyICggY29uc3QgY2hhciAqLCBpbnQgKTsKKy8vZXh0ZXJuIGludCBhZGRzdHIgKCBjb25zdCBjaGFyICogKTsKKy8vZXh0ZXJuIGludCBhdHRyb2ZmICggaW50ICk7CisvL2V4dGVybiBpbnQgYXR0cm9uICggaW50ICk7CisvL2V4dGVybiBpbnQgYXR0cnNldCAoIGludCApOworLy9leHRlcm4gaW50IGF0dHJfZ2V0ICggYXR0cl90ICosIHNob3J0ICosIHZvaWQgKiApOworLy9leHRlcm4gaW50IGF0dHJfb2ZmICggYXR0cl90LCB2b2lkICogKTsKKy8vZXh0ZXJuIGludCBhdHRyX29uICggYXR0cl90LCB2b2lkICogKTsKKy8vZXh0ZXJuIGludCBhdHRyX3NldCAoIGF0dHJfdCwgc2hvcnQsIHZvaWQgKiApOworZXh0ZXJuIGludCBiYXVkcmF0ZSAoIHZvaWQgKTsKK2V4dGVybiBpbnQgYmVlcCAoIHZvaWQgKTsKKy8vZXh0ZXJuIHZvaWQgYmtnZHNldCAoIGNodHlwZSApOworLypleHRlcm4gaW50IGJvcmRlciAoIGNodHlwZSwgY2h0eXBlLCBjaHR5cGUsIGNodHlwZSwgY2h0eXBlLCBjaHR5cGUsIGNodHlwZSwKKyAgY2h0eXBlICk7Ki8KK2V4dGVybiBpbnQgYm94ICggV0lORE9XICosIGNodHlwZSwgY2h0eXBlICkgX19ub25udWxsOworLy9leHRlcm4gYm9vbCBjYW5fY2hhbmdlX2NvbG91ciAoIHZvaWQgKTsKKyNkZWZpbmUgY2FuX2NoYW5nZV9jb2xvcigpIGNhbl9jaGFuZ2VfY29sb3VyKCkKK2V4dGVybiBpbnQgY2JyZWFrICggdm9pZCApOyAKKy8vZXh0ZXJuIGludCBjbHJ0b2JvdCAoIHZvaWQgKTsKKy8vZXh0ZXJuIGludCBjbHJ0b2VvbCAoIHZvaWQgKTsKK2V4dGVybiBpbnQgY29sb3VyX2NvbnRlbnQgKCBzaG9ydCwgc2hvcnQgKiwgc2hvcnQgKiwgc2hvcnQgKiApIF9fbm9ubnVsbDsKKyNkZWZpbmUgY29sb3JfY29udGVudCggYywgciwgZywgYiApIGNvbG91cl9jb250ZW50KCAoYyksIChyKSwgKGcpLCAoYikgKQorLy9leHRlcm4gaW50IGNvbG91cl9zZXQgKCBzaG9ydCwgdm9pZCAqICk7CisjZGVmaW5lIGNvbG9yX3NldCggY3Bubywgb3B0cyApIGNvbG91cl9zZXQoIChjcG5vKSwgKG9wdHMpICkKK2V4dGVybiBpbnQgY29weXdpbiAoIGNvbnN0IFdJTkRPVyAqLCBXSU5ET1cgKiwgaW50LCBpbnQsIGludCwgCisJCSAgICAgaW50LCBpbnQsIGludCwgaW50ICk7CitleHRlcm4gaW50IGN1cnNfc2V0ICggaW50ICk7CitleHRlcm4gaW50IGRlZl9wcm9nX21vZGUgKCB2b2lkICk7CitleHRlcm4gaW50IGRlZl9zaGVsbF9tb2RlICggdm9pZCApOworZXh0ZXJuIGludCBkZWxheV9vdXRwdXQgKCBpbnQgKTsKKy8vZXh0ZXJuIGludCBkZWxjaCAoIHZvaWQgKTsKKy8vZXh0ZXJuIGludCBkZWxldGVsbiAoIHZvaWQgKTsKK2V4dGVybiB2b2lkIGRlbHNjcmVlbiAoIFNDUkVFTiAqICk7CitleHRlcm4gaW50IGRlbHdpbiAoIFdJTkRPVyAqICkgX19ub25udWxsOworZXh0ZXJuIFdJTkRPVyAqZGVyd2luICggV0lORE9XICosIGludCwgaW50LCBpbnQsIGludCApIF9fbm9ubnVsbDsKKy8vZXh0ZXJuIGludCBkb3VwZGF0ZSAoIHZvaWQgKTsKK2V4dGVybiBXSU5ET1cgKmR1cHdpbiAoIFdJTkRPVyAqICkgX19ub25udWxsOworZXh0ZXJuIGludCBlY2hvICggdm9pZCApOworZXh0ZXJuIGludCBlY2hvY2hhciAoIGNvbnN0IGNodHlwZSApOworZXh0ZXJuIGludCBlbmR3aW4gKCB2b2lkICk7CitleHRlcm4gY2hhciBlcmFzZWNoYXIgKCB2b2lkICk7CisvL2V4dGVybiBpbnQgZXJhc2UgKCB2b2lkICk7CitleHRlcm4gdm9pZCBmaWx0ZXIgKCB2b2lkICk7CitleHRlcm4gaW50IGZsYXNoICggdm9pZCApOworZXh0ZXJuIGludCBmbHVzaGlucCAoIHZvaWQgKTsKK2V4dGVybiBfX3B1cmUgY2h0eXBlIGdldGJrZ2QgKCBXSU5ET1cgKiApIF9fbm9ubnVsbDsKKy8vZXh0ZXJuIGludCBnZXRjaCAoIHZvaWQgKTsKKy8vZXh0ZXJuIGludCBnZXRuc3RyICggY2hhciAqLCBpbnQgKTsKKy8vZXh0ZXJuIGludCBnZXRzdHIgKCBjaGFyICogKTsKK2V4dGVybiBpbnQgaGFsZmRlbGF5ICggaW50ICk7CisvL2V4dGVybiBib29sIGhhc19jb2xvcnMgKCB2b2lkICk7CitleHRlcm4gYm9vbCBoYXNfaWMgKCB2b2lkICk7CitleHRlcm4gYm9vbCBoYXNfaWwgKCB2b2lkICk7CisvL2V4dGVybiBpbnQgaGxpbmUgKCBjaHR5cGUsIGludCApOworZXh0ZXJuIHZvaWQgaWRjb2sgKCBXSU5ET1cgKiwgYm9vbCApOworZXh0ZXJuIGludCBpZGxvayAoIFdJTkRPVyAqLCBib29sICk7CisvL2V4dGVybiB2b2lkIGltbWVkb2sgKCBXSU5ET1cgKiwgYm9vbCApOworLy9leHRlcm4gY2h0eXBlIGluY2ggKCB2b2lkICk7CisvL2V4dGVybiBpbnQgaW5jaG5zdHIgKCBjaHR5cGUgKiwgaW50ICk7CisvL2V4dGVybiBpbnQgaW5jaHN0ciAoIGNodHlwZSAqICk7CitleHRlcm4gV0lORE9XICppbml0c2NyICggdm9pZCApOworZXh0ZXJuIGludCBpbml0X2NvbG91ciAoIHNob3J0LCBzaG9ydCwgc2hvcnQsIHNob3J0ICk7CisjZGVmaW5lIGluaXRfY29sb3IgKCBjLCByLCBnLCBiICkgaW5pdF9jb2xvdXIgKCAoYyksIChyKSwgKGcpLCAoYikgKQorZXh0ZXJuIGludCBpbml0X3BhaXIgKCBzaG9ydCwgc2hvcnQsIHNob3J0ICk7CisvL2V4dGVybiBpbnQgaW5uc3RyICggY2hhciAqLCBpbnQgKTsKKy8vZXh0ZXJuIGludCBpbnNjaCAoIGNodHlwZSApOworLy9leHRlcm4gaW50IGluc25zdHIgKCBjb25zdCBjaGFyICosIGludCApOworLy9leHRlcm4gaW50IGluc3N0ciAoIGNvbnN0IGNoYXIgKiApOworLy9leHRlcm4gaW50IGluc3RyICggY2hhciAqICk7CitleHRlcm4gaW50IGludHJmbHVzaCAoIFdJTkRPVyAqLCBib29sICk7CitleHRlcm4gYm9vbCBpc2VuZHdpbiAoIHZvaWQgKTsKKy8vZXh0ZXJuIGJvb2wgaXNfbGluZXRvdWNoZWQgKCBXSU5ET1cgKiwgaW50ICk7CisvL2V4dGVybiBib29sIGlzX3dpbnRvdWNoZWQgKCBXSU5ET1cgKiApOworZXh0ZXJuIGNoYXIgKmtleW5hbWUgKCBpbnQgKTsKK2V4dGVybiBpbnQga2V5cGFkICggV0lORE9XICosIGJvb2wgKTsKK2V4dGVybiBjaGFyIGtpbGxjaGFyICggdm9pZCApOworZXh0ZXJuIGludCBsZWF2ZW9rICggV0lORE9XICosIGJvb2wgKTsKK2V4dGVybiBjaGFyICpsb25nbmFtZSAoIHZvaWQgKTsKK2V4dGVybiBpbnQgbWV0YSAoIFdJTkRPVyAqLCBib29sICk7CisvL2V4dGVybiBpbnQgbW92ZSAoIGludCwgaW50ICk7CisvL2V4dGVybiBpbnQgbXZhZGRjaCAoIGludCwgaW50LCBjb25zdCBjaHR5cGUgKTsKKy8vZXh0ZXJuIGludCBtdmFkZGNobnN0ciAoIGludCwgaW50LCBjb25zdCBjaHR5cGUgKiwgaW50ICk7CisvL2V4dGVybiBpbnQgbXZhZGRjaHN0ciAoIGludCwgaW50LCBjb25zdCBjaHR5cGUgKiApOworLy9leHRlcm4gaW50IG12YWRkbnN0ciAoIGludCwgaW50LCBjb25zdCBjaGFyICosIGludCApOworLy9leHRlcm4gaW50IG12YWRkc3RyICggaW50LCBpbnQsIGNvbnN0IGNoYXIgKiApOworZXh0ZXJuIGludCBtdmN1ciAoIGludCwgaW50LCBpbnQsIGludCApOworLy9leHRlcm4gaW50IG12ZGVsY2ggKCBpbnQsIGludCApOworZXh0ZXJuIGludCBtdmRlcndpbiAoIFdJTkRPVyAqLCBpbnQsIGludCApOworLy9leHRlcm4gaW50IG12Z2V0Y2ggKCBpbnQsIGludCApOworLy9leHRlcm4gaW50IG12Z2V0bnN0ciAoIGludCwgaW50LCBjaGFyICosIGludCApOworLy9leHRlcm4gaW50IG12Z2V0c3RyICggaW50LCBpbnQsIGNoYXIgKiApOworLy9leHRlcm4gaW50IG12aGxpbmUgKCBpbnQsIGludCwgY2h0eXBlLCBpbnQgKTsKKy8vZXh0ZXJuIGNodHlwZSBtdmluY2ggKCBpbnQsIGludCApOworLy9leHRlcm4gaW50IG12aW5jaG5zdHIgKCBpbnQsIGludCwgY2h0eXBlICosIGludCApOworLy9leHRlcm4gaW50IG12aW5jaHN0ciAoIGludCwgaW50LCBjaHR5cGUgKiApOworLy9leHRlcm4gaW50IG12aW5uc3RyICggaW50LCBpbnQsIGNoYXIgKiwgaW50ICk7CisvL2V4dGVybiBpbnQgbXZpbnNjaCAoIGludCwgaW50LCBjaHR5cGUgKTsKKy8vZXh0ZXJuIGludCBtdmluc25zdHIgKCBpbnQsIGludCwgY29uc3QgY2hhciAqLCBpbnQgKTsKKy8vZXh0ZXJuIGludCBtdmluc3N0ciAoIGludCwgaW50LCBjb25zdCBjaGFyICogKTsKKy8vZXh0ZXJuIGludCBtdmluc3RyICggaW50LCBpbnQsIGNoYXIgKiApOworLy9leHRlcm4gaW50IG12cHJpbnR3ICggaW50LCBpbnQsIGNoYXIgKiwgIC4uLiApOworLy9leHRlcm4gaW50IG12c2NhbncgKCBpbnQsIGludCwgY2hhciAqLCAuLi4gKTsKKy8vZXh0ZXJuIGludCBtdnZsaW5lICggaW50LCBpbnQsIGNodHlwZSwgaW50ICk7CisvL2V4dGVybiBpbnQgbXZ3YWRkY2ggKCBXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNodHlwZSApOworLy9leHRlcm4gaW50IG12d2FkZGNobnN0ciAoIFdJTkRPVyAqLCBpbnQsIGludCwgY29uc3QgY2h0eXBlICosIGludCApOworLy9leHRlcm4gaW50IG12d2FkZGNoc3RyICggV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaHR5cGUgKiApOworLy9leHRlcm4gaW50IG12d2FkZG5zdHIgKCBXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50ICk7CisvL2V4dGVybiBpbnQgbXZ3YWRkc3RyICggV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaGFyICogKTsKKy8vZXh0ZXJuIGludCBtdndkZWxjaCAoIFdJTkRPVyAqLCBpbnQsIGludCApOworLy9leHRlcm4gaW50IG12d2dldGNoICggV0lORE9XICosIGludCwgaW50ICk7CisvL2V4dGVybiBpbnQgbXZ3Z2V0bnN0ciAoIFdJTkRPVyAqLCBpbnQsIGludCwgY2hhciAqLCBpbnQgKTsKKy8vZXh0ZXJuIGludCBtdndnZXRzdHIgKCBXSU5ET1cgKiwgaW50LCBpbnQsIGNoYXIgKiApOworLy9leHRlcm4gaW50IG12d2hsaW5lICggV0lORE9XICosIGludCwgaW50LCBjaHR5cGUsIGludCApOworZXh0ZXJuIGludCBtdndpbiAoIFdJTkRPVyAqLCBpbnQsIGludCApIF9fbm9ubnVsbDsKKy8vZXh0ZXJuIGNodHlwZSBtdndpbmNoICggV0lORE9XICosIGludCwgaW50ICk7CisvL2V4dGVybiBpbnQgbXZ3aW5jaG5zdHIgKCBXSU5ET1cgKiwgaW50LCBpbnQsIGNodHlwZSAqLCBpbnQgKTsKKy8vZXh0ZXJuIGludCBtdndpbmNoc3RyICggV0lORE9XICosIGludCwgaW50LCBjaHR5cGUgKiApOworLy9leHRlcm4gaW50IG12d2lubnN0ciAoIFdJTkRPVyAqLCBpbnQsIGludCwgY2hhciAqLCBpbnQgKTsKKy8vZXh0ZXJuIGludCBtdndpbnNjaCAoIFdJTkRPVyAqLCBpbnQsIGludCwgY2h0eXBlICk7CisvL2V4dGVybiBpbnQgbXZ3aW5zbnN0ciAoIFdJTkRPVyAqLCBpbnQsIGludCwgY29uc3QgY2hhciAqLCBpbnQgKTsKKy8vZXh0ZXJuIGludCBtdndpbnNzdHIgKCBXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiApOworLy9leHRlcm4gaW50IG12d2luc3RyICggV0lORE9XICosIGludCwgaW50LCBjaGFyICogKTsKKy8vZXh0ZXJuIGludCBtdndwcmludHcgKCBXSU5ET1cgKiwgaW50LCBpbnQsIGNoYXIgKiwgLi4uICk7CisvL2V4dGVybiBpbnQgbXZ3c2NhbncgKCBXSU5ET1cgKiwgaW50LCBpbnQsIGNoYXIgKiwgLi4uICk7CisvL2V4dGVybiBpbnQgbXZ3dmxpbmUgKCBXSU5ET1cgKiwgaW50LCBpbnQsIGNodHlwZSwgaW50ICk7CitleHRlcm4gaW50IG5hcG1zICggaW50ICk7CisvL2V4dGVybiBXSU5ET1cgKm5ld3BhZCAoIGludCwgaW50ICk7CitleHRlcm4gV0lORE9XICpuZXd3aW4gKCBpbnQsIGludCwgaW50LCBpbnQgKTsKK2V4dGVybiBpbnQgbmwgKCB2b2lkICk7CitleHRlcm4gaW50IG5vY2JyZWFrICggdm9pZCApOworZXh0ZXJuIGludCBub2RlbGF5ICggV0lORE9XICosIGJvb2wgKTsKK2V4dGVybiBpbnQgbm9lY2hvICggdm9pZCApOworZXh0ZXJuIGludCBub25sICggdm9pZCApOworZXh0ZXJuIHZvaWQgbm9xaWZsdXNoICggdm9pZCApOworZXh0ZXJuIGludCBub3JhdyAoIHZvaWQgKTsKK2V4dGVybiBpbnQgbm90aW1lb3V0ICggV0lORE9XICosIGJvb2wgKTsKK2V4dGVybiBpbnQgb3ZlcmxheSAoIGNvbnN0IFdJTkRPVyAqLCBXSU5ET1cgKiApOworZXh0ZXJuIGludCBvdmVyd3JpdGUgKCBjb25zdCBXSU5ET1cgKiwgV0lORE9XICogKTsKK2V4dGVybiBpbnQgcGFpcl9jb250ZW50ICggc2hvcnQsIHNob3J0ICosIHNob3J0ICogKSBfX25vbm51bGw7CisvL2V4dGVybiBpbnQgcGVjaG9jaGFyICggV0lORE9XICosIGNodHlwZSApOworLy9leHRlcm4gaW50IHBub3V0cmVmcmVzaCAoIFdJTkRPVyAqLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50ICk7CisvL2V4dGVybiBpbnQgcHJlZnJlc2ggKCBXSU5ET1cgKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCApOworZXh0ZXJuIGludCBwcmludHcgKCBjaGFyICosIC4uLiApOworZXh0ZXJuIGludCBwdXRwICggY29uc3QgY2hhciAqICk7CitleHRlcm4gdm9pZCBxaWZsdXNoICggdm9pZCApOworZXh0ZXJuIGludCByYXcgKCB2b2lkICk7CisvL2V4dGVybiBpbnQgcmVkcmF3d2luICggV0lORE9XICogKTsKKy8vZXh0ZXJuIGludCByZWZyZXNoICggdm9pZCApOworZXh0ZXJuIGludCByZXNldF9wcm9nX21vZGUgKCB2b2lkICk7CitleHRlcm4gaW50IHJlc2V0X3NoZWxsX21vZGUgKCB2b2lkICk7CitleHRlcm4gaW50IHJlc2V0dHkgKCB2b2lkICk7CitleHRlcm4gaW50IHJpcG9mZmxpbmUgKCBpbnQsIGludCAgKCopICggV0lORE9XICosIGludCkgKTsKK2V4dGVybiBpbnQgc2F2ZXR0eSAoIHZvaWQgKTsKKy8vZXh0ZXJuIGludCBzY2FudyAoIGNoYXIgKiwgLi4uICk7CisvL2V4dGVybiBpbnQgc2NybCAoIGludCApOworLy9leHRlcm4gaW50IHNjcm9sbCAoIFdJTkRPVyAqICk7CisvL2V4dGVybiBpbnQgc2Nyb2xsb2sgKCBXSU5ET1cgKiwgYm9vbCApOworLy9leHRlcm4gaW50IHNldHNjcnJlZyAoIGludCwgaW50ICk7CitleHRlcm4gU0NSRUVOICpzZXRfdGVybSAoIFNDUkVFTiAqICk7CitleHRlcm4gaW50IHNldHVwdGVybSAoIGNoYXIgKiwgaW50LCBpbnQgKiApOworZXh0ZXJuIGludCBzbGtfYXR0cl9vZmYgKCBjb25zdCBhdHRyX3QsIHZvaWQgKiApOworZXh0ZXJuIGludCBzbGtfYXR0cm9mZiAoIGNvbnN0IGNodHlwZSApOworZXh0ZXJuIGludCBzbGtfYXR0cl9vbiAoIGNvbnN0IGF0dHJfdCwgdm9pZCAqICk7CitleHRlcm4gaW50IHNsa19hdHRyb24gKCBjb25zdCBjaHR5cGUgKTsKK2V4dGVybiBpbnQgc2xrX2F0dHJfc2V0ICggY29uc3QgYXR0cl90LCBzaG9ydCwgdm9pZCAqICk7CitleHRlcm4gaW50IHNsa19hdHRyc2V0ICggY29uc3QgY2h0eXBlICk7CitleHRlcm4gaW50IHNsa19jbGVhciAoIHZvaWQgKTsKK2V4dGVybiBpbnQgc2xrX2NvbG91ciAoIHNob3J0ICk7CisjZGVmaW5lIHNsa19jb2xvciggYyApIHNsa19jb2xvdXIoIChjKSApCitleHRlcm4gaW50IHNsa19pbml0ICggaW50ICk7CitleHRlcm4gY2hhciAqc2xrX2xhYmVsICggaW50ICk7CitleHRlcm4gaW50IHNsa19ub3V0cmVmcmVzaCAoIHZvaWQgKTsKKy8vZXh0ZXJuIGludCBzbGtfcmVmcmVzaCAoIHZvaWQgKTsKK2V4dGVybiBpbnQgc2xrX3Jlc3RvcmUgKCB2b2lkICk7CitleHRlcm4gaW50IHNsa19zZXQgKCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50ICkgX19ub25udWxsOworZXh0ZXJuIGludCBzbGtfdG91Y2ggKCB2b2lkICk7CitleHRlcm4gaW50IHN0YW5kZW5kICggdm9pZCApOworZXh0ZXJuIGludCBzdGFuZG91dCAoIHZvaWQgKTsKKy8vZXh0ZXJuIGludCBzdGFydF9jb2xvdXIgKCB2b2lkICk7CisjZGVmaW5lIHN0YXJ0X2NvbG9yKCkgc3RhcnRfY29sb3VyKCkKKy8vZXh0ZXJuIFdJTkRPVyAqc3VicGFkICggV0lORE9XICosIGludCwgaW50LCBpbnQsIGludCApOworZXh0ZXJuIFdJTkRPVyAqc3Vid2luICggV0lORE9XICosIGludCwgaW50LCBpbnQsIGludCApIF9fbm9ubnVsbDsKK2V4dGVybiBpbnQgc3luY29rICggV0lORE9XICosIGJvb2wgKTsKK2V4dGVybiBjaHR5cGUgdGVybWF0dHJzICggdm9pZCApOworZXh0ZXJuIGF0dHJfdCB0ZXJtX2F0dHJzICggdm9pZCApOworZXh0ZXJuIGNoYXIgKnRlcm1uYW1lICggdm9pZCApOworZXh0ZXJuIGludCB0aWdldGZsYWcgKCBjaGFyICogKTsKK2V4dGVybiBpbnQgdGlnZXRudW0gKCBjaGFyICogKTsKK2V4dGVybiBjaGFyICp0aWdldHN0ciAoIGNoYXIgKiApOworZXh0ZXJuIHZvaWQgdGltZW91dCAoIGludCApOworLy9leHRlcm4gaW50IHRvdWNobGluZSAoIFdJTkRPVyAqLCBpbnQsIGludCApOworLy9leHRlcm4gaW50IHRvdWNod2luICggV0lORE9XICogKTsKK2V4dGVybiBjaGFyICp0cGFybSAoIGNoYXIgKiwgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywKKwkJICAgbG9uZyApOworZXh0ZXJuIGludCB0eXBlYWhlYWQgKCBpbnQgKTsKKy8vZXh0ZXJuIGludCB1bmdldGNoICggaW50ICk7CisvL2V4dGVybiBpbnQgdW50b3VjaHdpbiAoIFdJTkRPVyAqICk7CitleHRlcm4gdm9pZCB1c2VfZW52ICggYm9vbCApOworZXh0ZXJuIGludCB2aWRfYXR0ciAoIGF0dHJfdCwgc2hvcnQsIHZvaWQgKiApOworZXh0ZXJuIGludCB2aWRhdHRyICggY2h0eXBlICk7CitleHRlcm4gaW50IHZpZF9wdXRzICggYXR0cl90LCBzaG9ydCwgdm9pZCAqLCBpbnQgICggKikgKCBpbnQpICk7CitleHRlcm4gaW50IHZpZHB1dHMgKCBjaHR5cGUsIGludCAgKCAqKSAoIGludCkgKTsKKy8vZXh0ZXJuIGludCB2bGluZSAoIGNodHlwZSwgaW50ICk7CisvL2V4dGVybiBpbnQgdndwcmludHcgKCBXSU5ET1cgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0ICk7CitleHRlcm4gaW50IHZ3X3ByaW50dyAoIFdJTkRPVyAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QgKSBfX25vbm51bGw7CisvL2V4dGVybiBpbnQgdndzY2FudyAoIFdJTkRPVyAqLCBjaGFyICosIHZhX2xpc3QgKTsKKy8vZXh0ZXJuIGludCB2d19zY2FudyAoIFdJTkRPVyAqLCBjaGFyICosIHZhX2xpc3QgKTsKK2V4dGVybiBpbnQgd2FkZGNoICggV0lORE9XICosIGNvbnN0IGNodHlwZSApIF9fbm9ubnVsbDsKK2V4dGVybiBpbnQgd2FkZGNobnN0ciAoIFdJTkRPVyAqLCBjb25zdCBjaHR5cGUgKiwgaW50ICkgX19ub25udWxsOworLy9leHRlcm4gaW50IHdhZGRjaHN0ciAoIFdJTkRPVyAqLCBjb25zdCBjaHR5cGUgKiApOworZXh0ZXJuIGludCB3YWRkbnN0ciAoIFdJTkRPVyAqLCBjb25zdCBjaGFyICosIGludCApIF9fbm9ubnVsbDsKKy8vZXh0ZXJuIGludCB3YWRkc3RyICggV0lORE9XICosIGNvbnN0IGNoYXIgKiApOworZXh0ZXJuIGludCB3YXR0cm9mZiAoIFdJTkRPVyAqLCBpbnQgKSBfX25vbm51bGw7CitleHRlcm4gaW50IHdhdHRyb24gKCBXSU5ET1cgKiwgaW50ICkgX19ub25udWxsOworZXh0ZXJuIGludCB3YXR0cnNldCAoIFdJTkRPVyAqLCBpbnQgKSBfX25vbm51bGw7CitleHRlcm4gaW50IHdhdHRyX2dldCAoIFdJTkRPVyAqLCBhdHRyX3QgKiwgc2hvcnQgKiwgdm9pZCAqICkKKwlfX2F0dHJpYnV0ZV9fICgoIG5vbm51bGwgKDEsIDIsIDMpKSk7CitleHRlcm4gaW50IHdhdHRyX29mZiAoIFdJTkRPVyAqLCBhdHRyX3QsIHZvaWQgKiApCisJX19hdHRyaWJ1dGVfXyAoKCBub25udWxsICgxKSkpOworZXh0ZXJuIGludCB3YXR0cl9vbiAoIFdJTkRPVyAqLCBhdHRyX3QsIHZvaWQgKiApCisJX19hdHRyaWJ1dGVfXyAoKCBub25udWxsICgxKSkpOworZXh0ZXJuIGludCB3YXR0cl9zZXQgKCBXSU5ET1cgKiwgYXR0cl90LCBzaG9ydCwgdm9pZCAqICkKKwlfX2F0dHJpYnV0ZV9fICgoIG5vbm51bGwgKDEpKSk7CisvL2V4dGVybiB2b2lkIHdia2dkc2V0ICggV0lORE9XICosIGNodHlwZSApOworZXh0ZXJuIGludCB3Ym9yZGVyICggV0lORE9XICosIGNodHlwZSwgY2h0eXBlLCBjaHR5cGUsIGNodHlwZSwgY2h0eXBlLCBjaHR5cGUsCisJCSAgIGNodHlwZSwgY2h0eXBlICkgX19ub25udWxsOworZXh0ZXJuIGludCB3Y2xydG9ib3QgKCBXSU5ET1cgKiApIF9fbm9ubnVsbDsKK2V4dGVybiBpbnQgd2NscnRvZW9sICggV0lORE9XICogKSBfX25vbm51bGw7CitleHRlcm4gdm9pZCB3Y3Vyc3luY3VwICggV0lORE9XICogKTsKK2V4dGVybiBpbnQgd2NvbG91cl9zZXQgKCBXSU5ET1cgKiwgc2hvcnQsIHZvaWQgKiApIF9fbm9ubnVsbDsKKyNkZWZpbmUgd2NvbG9yX3NldCh3LHMsdikgd2NvbG91cl9zZXQoKHcpLChzKSwodikpCitleHRlcm4gaW50IHdkZWxjaCAoIFdJTkRPVyAqICkgX19ub25udWxsOworZXh0ZXJuIGludCB3ZGVsZXRlbG4gKCBXSU5ET1cgKiApIF9fbm9ubnVsbDsKK2V4dGVybiBpbnQgd2VjaG9jaGFyICggV0lORE9XICosIGNvbnN0IGNodHlwZSApOworZXh0ZXJuIGludCB3ZXJhc2UgKCBXSU5ET1cgKiApIF9fbm9ubnVsbDsKK2V4dGVybiBpbnQgd2dldGNoICggV0lORE9XICogKTsKK2V4dGVybiBpbnQgd2dldG5zdHIgKCBXSU5ET1cgKiwgY2hhciAqLCBpbnQgKTsKKy8vZXh0ZXJuIGludCB3Z2V0c3RyICggV0lORE9XICosIGNoYXIgKiApOworZXh0ZXJuIGludCB3aGxpbmUgKCBXSU5ET1cgKiwgY2h0eXBlLCBpbnQgKSBfX25vbm51bGw7CisvL2V4dGVybiBjaHR5cGUgd2luY2ggKCBXSU5ET1cgKiApOworLy9leHRlcm4gaW50IHdpbmNobnN0ciAoIFdJTkRPVyAqLCBjaHR5cGUgKiwgaW50ICk7CisvL2V4dGVybiBpbnQgd2luY2hzdHIgKCBXSU5ET1cgKiwgY2h0eXBlICogKTsKKy8vZXh0ZXJuIGludCB3aW5uc3RyICggV0lORE9XICosIGNoYXIgKiwgaW50ICk7CisvL2V4dGVybiBpbnQgd2luc2NoICggV0lORE9XICosIGNodHlwZSApOworLy9leHRlcm4gaW50IHdpbnNuc3RyICggV0lORE9XICosIGNvbnN0IGNoYXIgKiwgaW50ICk7CisvL2V4dGVybiBpbnQgd2luc3N0ciAoIFdJTkRPVyAqLCBjb25zdCBjaGFyICogKTsKKy8vZXh0ZXJuIGludCB3aW5zdHIgKCBXSU5ET1cgKiwgY2hhciAqICk7CitleHRlcm4gaW50IHdtb3ZlICggV0lORE9XICosIGludCwgaW50ICk7CisvL2V4dGVybiBpbnQgd25vdXRyZWZyZXNoICggV0lORE9XICogKTsKK2V4dGVybiBpbnQgd3ByaW50dyAoIFdJTkRPVyAqLCBjb25zdCBjaGFyICosIC4uLiApIF9fbm9ubnVsbDsKKy8vZXh0ZXJuIGludCB3cmVkcmF3bG4gKCBXSU5ET1cgKiwgaW50LCBpbnQgKTsKKy8vZXh0ZXJuIGludCB3cmVmcmVzaCAoIFdJTkRPVyAqICk7CisvL2V4dGVybiBpbnQgd3NjYW53ICggV0lORE9XICosIGNoYXIgKiwgLi4uICk7CisvL2V4dGVybiBpbnQgd3NjcmwgKCBXSU5ET1cgKiwgaW50ICk7CisvL2V4dGVybiBpbnQgd3NldHNjcnJlZyAoIFdJTkRPVyAqLCBpbnQsIGludCApOworLy9leHRlcm4gaW50IHdzdGFuZGVuZCAoIFdJTkRPVyAqICk7CisvL2V4dGVybiBpbnQgd3N0YW5kb3V0ICggV0lORE9XICogKTsKK2V4dGVybiB2b2lkIHdzeW5jdXAgKCBXSU5ET1cgKiApOworZXh0ZXJuIHZvaWQgd3N5bmNkb3duICggV0lORE9XICogKTsKK2V4dGVybiB2b2lkIHd0aW1lb3V0ICggV0lORE9XICosIGludCApOworLy9leHRlcm4gaW50IHd0b3VjaGxuICggV0lORE9XICosIGludCwgaW50LCBpbnQgKTsKK2V4dGVybiBpbnQgd3ZsaW5lICggV0lORE9XICosIGNodHlwZSwgaW50ICkgX19ub25udWxsOworCisvKgorICogVGhlcmUgaXMgZnJhbmtseSBhIHJpZGljdWxvdXMgYW1vdW50IG9mIHJlZHVuZGFuY3kgd2l0aGluIHRoZQorICogY3Vyc2VzIEFQSSAtIG5jdXJzZXMgZGVjaWRlZCB0byBnZXQgYXJvdW5kIHRoaXMgYnkgdXNpbmcgI2RlZmluZQorICogbWFjcm9zLCBidXQgSSd2ZSBkZWNpZGVkIHRvIGJlIHR5cGUtc2FmZSBhbmQgaW1wbGVtZW50IHRoZW0gYWxsIGFzCisgKiBzdGF0aWMgaW5saW5lcyBpbnN0ZWFkLi4uCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYWRkY2ggKCBjb25zdCBjaHR5cGUgY2ggKSB7CisJcmV0dXJuIHdhZGRjaCggc3Rkc2NyLCBjaCApOworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGRjaG5zdHIgKCBjb25zdCBjaHR5cGUgKmNoc3RyLCBpbnQgbiApIHsKKwlyZXR1cm4gd2FkZGNobnN0ciAoIHN0ZHNjciwgY2hzdHIsIG4gKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRkY2hzdHIgKCBjb25zdCBjaHR5cGUgKmNoc3RyICkgeworCXJldHVybiB3YWRkY2huc3RyICggc3Rkc2NyLCBjaHN0ciwgLTEgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRkbnN0ciAoIGNvbnN0IGNoYXIgKnN0ciwgaW50IG4gKSB7CisJcmV0dXJuIHdhZGRuc3RyICggc3Rkc2NyLCBzdHIsIG4gKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRkc3RyICggY29uc3QgY2hhciAqc3RyICkgeworCXJldHVybiB3YWRkbnN0ciAoIHN0ZHNjciwgc3RyLCAtMSApOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdHRyb2ZmICggaW50IGF0dHJzICkgeworCXJldHVybiB3YXR0cm9mZiAoIHN0ZHNjciwgYXR0cnMgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXR0cm9uICggaW50IGF0dHJzICkgeworCXJldHVybiB3YXR0cm9uICggc3Rkc2NyLCBhdHRycyApOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdHRyc2V0ICggaW50IGF0dHJzICkgeworCXJldHVybiB3YXR0cnNldCAoIHN0ZHNjciwgYXR0cnMgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXR0cl9nZXQgKCBhdHRyX3QgKmF0dHJzLCBzaG9ydCAqcGFpciwgdm9pZCAqb3B0cyApIHsKKwlyZXR1cm4gd2F0dHJfZ2V0ICggc3Rkc2NyLCBhdHRycywgcGFpciwgb3B0cyApOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdHRyX29mZiAoIGF0dHJfdCBhdHRycywgdm9pZCAqb3B0cyApIHsKKwlyZXR1cm4gd2F0dHJfb2ZmICggc3Rkc2NyLCBhdHRycywgb3B0cyApOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdHRyX29uICggYXR0cl90IGF0dHJzLCB2b2lkICpvcHRzICkgeworCXJldHVybiB3YXR0cl9vbiAoIHN0ZHNjciwgYXR0cnMsIG9wdHMgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXR0cl9zZXQgKCBhdHRyX3QgYXR0cnMsIHNob3J0IGNwYWlyLCB2b2lkICpvcHRzICkgeworCXJldHVybiB3YXR0cl9zZXQgKCBzdGRzY3IsIGF0dHJzLCBjcGFpciwgb3B0cyApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmtnZHNldCAoIGNodHlwZSBjaCApIHsKKwl3YXR0cnNldCAoIHN0ZHNjciwgY2ggKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm9yZGVyICggY2h0eXBlIGxzLCBjaHR5cGUgcnMsIGNodHlwZSB0cywgY2h0eXBlIGJzLAorCQkJICAgY2h0eXBlIHRsLCBjaHR5cGUgdHIsIGNodHlwZSBibCwgY2h0eXBlIGJyICkgeworCXJldHVybiB3Ym9yZGVyICggc3Rkc2NyLCBscywgcnMsIHRzLCBicywgdGwsIHRyLCBibCwgYnIgKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGNhbl9jaGFuZ2VfY29sb3VyICggdm9pZCApIHsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNscnRvYm90ICggdm9pZCApIHsKKwlyZXR1cm4gd2NscnRvYm90KCBzdGRzY3IgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2xydG9lb2wgKCB2b2lkICkgeworCXJldHVybiB3Y2xydG9lb2woIHN0ZHNjciApOworfQorCitzdGF0aWMgaW5saW5lIGludCBjb2xvdXJfc2V0ICggc2hvcnQgY29sb3VyX3BhaXJfbnVtYmVyLCB2b2lkICpvcHRzICkgeworCXJldHVybiB3Y29sb3VyX3NldCAoIHN0ZHNjciwgY29sb3VyX3BhaXJfbnVtYmVyLCBvcHRzICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlbGNoICggdm9pZCApIHsKKwlyZXR1cm4gd2RlbGNoICggc3Rkc2NyICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlbGV0ZWxuICggdm9pZCApIHsKKwlyZXR1cm4gd2RlbGV0ZWxuKCBzdGRzY3IgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXJhc2UgKCB2b2lkICkgeworCXJldHVybiB3ZXJhc2UgKCBzdGRzY3IgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0Y2ggKCB2b2lkICkgeworCXJldHVybiB3Z2V0Y2ggKCBzdGRzY3IgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0bnN0ciAoIGNoYXIgKnN0ciwgaW50IG4gKSB7CisJcmV0dXJuIHdnZXRuc3RyICggc3Rkc2NyLCBzdHIsIG4gKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0c3RyICggY2hhciAqc3RyICkgeworCXJldHVybiB3Z2V0bnN0ciAoIHN0ZHNjciwgc3RyLCAtMSApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzX2NvbG9ycyAoIHZvaWQgKSB7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhhc19rZXkgKCBpbnQga2MgX191bnVzZWQgKSB7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhsaW5lICggY2h0eXBlIGNoLCBpbnQgbiApIHsKKwlyZXR1cm4gd2hsaW5lICggc3Rkc2NyLCBjaCwgbiApOworfQorCitzdGF0aWMgaW5saW5lIGludCBtb3ZlICggaW50IHksIGludCB4ICkgeworCXJldHVybiB3bW92ZSAoIHN0ZHNjciwgeSwgeCApOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdmFkZGNoICggaW50IHksIGludCB4LCBjb25zdCBjaHR5cGUgY2ggKSB7CisJcmV0dXJuICggd21vdmUgKCBzdGRzY3IsIHksIHggKSA9PSBPSworCQkgPyB3YWRkY2goIHN0ZHNjciwgY2ggKSA6IEVSUiApOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdmFkZGNobnN0ciAoIGludCB5LCBpbnQgeCwgY29uc3QgY2h0eXBlICpjaHN0ciwgaW50IG4gKSB7CisJcmV0dXJuICggd21vdmUgKCBzdGRzY3IsIHksIHggKSA9PSBPSworCQkgPyB3YWRkY2huc3RyICggc3Rkc2NyLCBjaHN0ciwgbiApIDogRVJSICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12YWRkY2hzdHIgKCBpbnQgeSwgaW50IHgsIGNvbnN0IGNodHlwZSAqY2hzdHIgKSB7CisJcmV0dXJuICggd21vdmUgKCBzdGRzY3IsIHksIHggKSA9PSBPSworCQkgPyB3YWRkY2huc3RyICggc3Rkc2NyLCBjaHN0ciwgLTEgKSA6IEVSUiApOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdmFkZG5zdHIgKCBpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKnN0ciwgaW50IG4gKSB7CisJcmV0dXJuICggd21vdmUgKCBzdGRzY3IsIHksIHggKSA9PSBPSworCQkgPyB3YWRkbnN0ciAoIHN0ZHNjciwgc3RyLCBuICkgOiBFUlIgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXZhZGRzdHIgKCBpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKnN0ciApIHsKKwlyZXR1cm4gKCB3bW92ZSAoIHN0ZHNjciwgeSwgeCApID09IE9LCisJCSA/IHdhZGRuc3RyICggc3Rkc2NyLCBzdHIsIC0xICkgOiBFUlIgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXZkZWxjaCAoIGludCB5LCBpbnQgeCApIHsKKwlyZXR1cm4gKCB3bW92ZSAoIHN0ZHNjciwgeSwgeCApID09IE9LCisJCSA/IHdkZWxjaCAoIHN0ZHNjciApIDogRVJSICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12Z2V0Y2ggKCBpbnQgeSwgaW50IHggKSB7CisJcmV0dXJuICggd21vdmUgKCBzdGRzY3IsIHksIHggKSA9PSBPSworCQkgPyB3Z2V0Y2ggKCBzdGRzY3IgKSA6IEVSUiApOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdmdldG5zdHIgKCBpbnQgeSwgaW50IHgsIGNoYXIgKnN0ciwgaW50IG4gKSB7CisJcmV0dXJuICggd21vdmUgKCBzdGRzY3IsIHksIHggKSA9PSBPSworCQkgPyB3Z2V0bnN0ciAoIHN0ZHNjciwgc3RyLCBuICkgOiBFUlIgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXZnZXRzdHIgKCBpbnQgeSwgaW50IHgsIGNoYXIgKnN0ciApIHsKKwlyZXR1cm4gKCB3bW92ZSAoIHN0ZHNjciwgeSwgeCApID09IE9LCisJCSA/IHdnZXRuc3RyICggc3Rkc2NyLCBzdHIsIC0xICkgOiBFUlIgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXZobGluZSAoIGludCB5LCBpbnQgeCwgY2h0eXBlIGNoLCBpbnQgbiApIHsKKwlyZXR1cm4gKCB3bW92ZSAoIHN0ZHNjciwgeSwgeCApID09IE9LCisJCSA/IHdobGluZSAoIHN0ZHNjciwgY2gsIG4gKSA6IEVSUiApOworfQorCisvLyBPSywgc28gbWF5YmUgYSBmZXcgSSBkaWQgd2l0aCBtYWNyb3MuLi4KKyNkZWZpbmUgbXZwcmludHcoIHksIHgsIGZtdCwgLi4uICkgXAorCSggd21vdmUoc3Rkc2NyLCh5KSwoeCkpID09IE9LIFwKKwkgID8gd3ByaW50dyggc3Rkc2NyLChmbXQpLCAjIyBfX1ZBX0FSR1NfXyApIDogRVJSICkKKworc3RhdGljIGlubGluZSBpbnQgbXZ2bGluZSAoIGludCB5LCBpbnQgeCwgY2h0eXBlIGNoLCBpbnQgbiApIHsKKwlyZXR1cm4gKCB3bW92ZSAoIHN0ZHNjciwgeSwgeCApID09IE9LCisJCSA/IHd2bGluZSAoIHN0ZHNjciwgY2gsIG4gKSA6IEVSUiApOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdndhZGRjaCAoIFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNvbnN0IGNodHlwZSBjaCApIHsKKwlyZXR1cm4gKCB3bW92ZSggd2luLCB5LCB4ICkgPT0gT0sKKwkJID8gd2FkZGNoICggd2luLCBjaCApIDogRVJSICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12d2FkZGNobnN0ciAoIFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNvbnN0IGNodHlwZSAqY2hzdHIsIGludCBuICkgeworCXJldHVybiAoIHdtb3ZlICggd2luLCB5LCB4ICkgPT0gT0sKKwkJID8gd2FkZGNobnN0ciAoIHdpbiwgY2hzdHIsIG4gKSA6IEVSUiApOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdndhZGRjaHN0ciAoIFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNvbnN0IGNodHlwZSAqY2hzdHIgKSB7CisJcmV0dXJuICggd21vdmUgKCB3aW4sIHksIHggKSA9PSBPSworCQkgPyB3YWRkY2huc3RyICggd2luLCBjaHN0ciwgLTEgKSA6IEVSUiApOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdndhZGRuc3RyICggV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqc3RyLCBpbnQgbiApIHsKKwlyZXR1cm4gKCB3bW92ZSAoIHdpbiwgeSwgeCApID09IE9LCisJCSA/IHdhZGRuc3RyICggd2luLCBzdHIsIG4gKSA6IEVSUiApOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdndhZGRzdHIgKCBXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjb25zdCBjaGFyICpzdHIgKSB7CisJcmV0dXJuICggd21vdmUgKCB3aW4sIHksIHggKSA9PSBPSworCQkgPyB3YWRkbnN0ciAoIHdpbiwgc3RyLCAtMSApIDogRVJSICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12d2RlbGNoICggV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCApIHsKKwlyZXR1cm4gKCB3bW92ZSAoIHdpbiwgeSwgeCApID09IE9LCisJCSA/IHdkZWxjaCAoIHdpbiApIDogRVJSICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12d2dldGNoICggV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCApIHsKKwlyZXR1cm4gKCB3bW92ZSAoIHdpbiwgeSwgeCApID09IE9LCisJCSA/IHdnZXRjaCAoIHdpbiApIDogRVJSICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12d2dldG5zdHIgKCBXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaGFyICpzdHIsIGludCBuICkgeworCXJldHVybiAoIHdtb3ZlICggd2luLCB5LCB4ICkgPT0gT0sKKwkJID8gd2dldG5zdHIgKCB3aW4sIHN0ciwgbiApIDogRVJSICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12d2dldHN0ciAoIFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNoYXIgKnN0ciApIHsKKwlyZXR1cm4gKCB3bW92ZSAoIHdpbiwgeSwgeCApID09IE9LCisJCSA/IHdnZXRuc3RyICggd2luLCBzdHIsIC0xICkgOiBFUlIgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXZ3aGxpbmUgKCBXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaHR5cGUgY2gsIGludCBuICkgeworCXJldHVybiAoIHdtb3ZlICggd2luLCB5LCB4ICkgPT0gT0sKKwkJID8gd2hsaW5lICggd2luLCBjaCwgbiApIDogRVJSICk7Cit9CisKKyNkZWZpbmUgbXZ3cHJpbnR3KCB3aW4sIHksIHgsIGZtdCwgLi4uICkgXAorCSggd21vdmUoKHdpbiksKHkpLCh4KSkgPT0gT0sgXAorCSAgPyB3cHJpbnR3KCh3aW4pLChmbXQpLCAjIyBfX1ZBX0FSR1NfXykgOiBFUlIgKQorCitzdGF0aWMgaW5saW5lIGludCBtdnd2bGluZSAoIFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNodHlwZSBjaCwgaW50IG4gKSB7CisJcmV0dXJuICggd21vdmUgKCB3aW4sIHksIHggKSA9PSBPSworCQkgPyB3dmxpbmUgKCB3aW4sIGNoLCBuICkgOiBFUlIgKTsKK30KKworI2RlZmluZSBwcmludHcoIGZtdCwgLi4uICkgd3ByaW50dyhzdGRzY3IsKGZtdCksICMjIF9fVkFfQVJHU19fICkKKworc3RhdGljIGlubGluZSBpbnQgc2xrX3JlZnJlc2ggKCB2b2lkICkgeworCWlmICggc2xrX2NsZWFyKCkgPT0gT0sgKQorCQlyZXR1cm4gc2xrX3Jlc3RvcmUoKTsKKwllbHNlCisJCXJldHVybiBFUlI7Cit9CisKKyNkZWZpbmUgc3RhbmRlbmQoKSB3c3RhbmRlbmQoIHN0ZHNjciApCisjZGVmaW5lIHN0YW5kb3V0KCkgd3N0YW5kb3V0KCBzdGRzY3IgKQorCitzdGF0aWMgaW5saW5lIGludCBzdGFydF9jb2xvdXIgKCB2b2lkICkgeworCXJldHVybiBPSzsKK30KKworc3RhdGljIGlubGluZSBpbnQgdmxpbmUgKCBjaHR5cGUgY2gsIGludCBuICkgeworCXJldHVybiB3dmxpbmUgKCBzdGRzY3IsIGNoLCBuICk7Cit9CisKKy8vIG1hcmtlZCBmb3IgcmVtb3ZhbAorc3RhdGljIGlubGluZSBpbnQgdndwcmludHcgKCBXSU5ET1cgKndpbiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZhcmdsaXN0ICkgeworCXJldHVybiB2d19wcmludHcgKCB3aW4sIGZtdCwgdmFyZ2xpc3QgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2FkZGNoc3RyICggV0lORE9XICp3aW4sIGNvbnN0IGNodHlwZSAqY2hzdHIgKSB7CisJcmV0dXJuIHdhZGRjaG5zdHIgKCB3aW4sIGNoc3RyLCAtMSApOworfQorCitzdGF0aWMgaW5saW5lIGludCB3YWRkc3RyICggV0lORE9XICp3aW4sIGNvbnN0IGNoYXIgKnN0ciApIHsKKwlyZXR1cm4gd2FkZG5zdHIgKCB3aW4sIHN0ciwgLTEgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2JrZ2RzZXQgKCBXSU5ET1cgKndpbiwgY2h0eXBlIGNoICkgeworCXJldHVybiB3YXR0cnNldCggd2luLCBjaCApOworfQorCitzdGF0aWMgaW5saW5lIGludCB3Z2V0c3RyICggV0lORE9XICp3aW4sIGNoYXIgKnN0ciApIHsKKwlyZXR1cm4gd2dldG5zdHIgKCB3aW4sIHN0ciwgLTEgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd3N0YW5kZW5kICggV0lORE9XICp3aW4gKSB7CisJcmV0dXJuIHdhdHRyc2V0ICggd2luLCBBX0RFRkFVTFQgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd3N0YW5kb3V0ICggV0lORE9XICp3aW4gKSB7CisJcmV0dXJuIHdhdHRyc2V0ICggd2luLCBBX1NUQU5ET1VUICk7Cit9CisKKyNlbmRpZiAvKiBDVVJTRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9lbGYuaCBiL2dweGUvc3JjL2luY2x1ZGUvZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwMjJiNgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZWxmLmgKQEAgLTAsMCArMSwyMzQgQEAKKyNpZm5kZWYgRUxGX0gKKyNkZWZpbmUgRUxGX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjZGVmaW5lIEVJX05JREVOVAkxNgkvKiBTaXplIG9mIGVfaWRlbnQgYXJyYXkuICovCisKKy8qIFZhbHVlcyBmb3IgZV90eXBlLiAqLworI2RlZmluZSBFVF9OT05FCQkwCS8qIE5vIGZpbGUgdHlwZSAqLworI2RlZmluZSBFVF9SRUwJCTEJLyogUmVsb2NhdGFibGUgZmlsZSAqLworI2RlZmluZSBFVF9FWEVDCQkyCS8qIEV4ZWN1dGFibGUgZmlsZSAqLworI2RlZmluZSBFVF9EWU4JCTMJLyogU2hhcmVkIG9iamVjdCBmaWxlICovCisjZGVmaW5lIEVUX0NPUkUJCTQJLyogQ29yZSBmaWxlICovCisKKy8qIFZhbHVlcyBmb3IgZV9tYWNoaW5lIChhcmNoaXRlY3V0ZSkuICovCisjZGVmaW5lIEVNX05PTkUJCSAwCQkvKiBObyBtYWNoaW5lICovCisjZGVmaW5lIEVNX00zMgkJIDEJCS8qIEFUJlQgV0UgMzIxMDAgKi8KKyNkZWZpbmUgRU1fU1BBUkMJIDIJCS8qIFNVTiBTUEFSQyAqLworI2RlZmluZSBFTV8zODYJCSAzCQkvKiBJbnRlbCA4MDM4NisgKi8KKyNkZWZpbmUgRU1fNjhLCQkgNAkJLyogTW90b3JvbGEgbTY4ayBmYW1pbHkgKi8KKyNkZWZpbmUgRU1fODhLCQkgNQkJLyogTW90b3JvbGEgbTg4ayBmYW1pbHkgKi8KKyNkZWZpbmUgRU1fNDg2CQkgNgkJLyogUGVyaGFwcyBkaXN1c2VkICovCisjZGVmaW5lIEVNXzg2MAkJIDcJCS8qIEludGVsIDgwODYwICovCisjZGVmaW5lIEVNX01JUFMJCSA4CQkvKiBNSVBTIFIzMDAwIGJpZy1lbmRpYW4gKi8KKyNkZWZpbmUgRU1fUzM3MAkJIDkJCS8qIElCTSBTeXN0ZW0vMzcwICovCisjZGVmaW5lIEVNX01JUFNfUlMzX0xFCTEwCQkvKiBNSVBTIFIzMDAwIGxpdHRsZS1lbmRpYW4gKi8KKworI2RlZmluZSBFTV9QQVJJU0MJMTUJCS8qIEhQUEEgKi8KKyNkZWZpbmUgRU1fVlBQNTAwCTE3CQkvKiBGdWppdHN1IFZQUDUwMCAqLworI2RlZmluZSBFTV9TUEFSQzMyUExVUwkxOAkJLyogU3VuJ3MgInY4cGx1cyIgKi8KKyNkZWZpbmUgRU1fOTYwCQkxOQkJLyogSW50ZWwgODA5NjAgKi8KKyNkZWZpbmUgRU1fUFBDCQkyMAkJLyogUG93ZXJQQyAqLworI2RlZmluZSBFTV9QUEM2NAkyMQkJLyogUG93ZXJQQyA2NC1iaXQgKi8KKyNkZWZpbmUgRU1fUzM5MAkJMjIJCS8qIElCTSBTMzkwICovCisKKyNkZWZpbmUgRU1fVjgwMAkJMzYJCS8qIE5FQyBWODAwIHNlcmllcyAqLworI2RlZmluZSBFTV9GUjIwCQkzNwkJLyogRnVqaXRzdSBGUjIwICovCisjZGVmaW5lIEVNX1JIMzIJCTM4CQkvKiBUUlcgUkgtMzIgKi8KKyNkZWZpbmUgRU1fUkNFCQkzOQkJLyogTW90b3JvbGEgUkNFICovCisjZGVmaW5lIEVNX0FSTQkJNDAJCS8qIEFSTSAqLworI2RlZmluZSBFTV9GQUtFX0FMUEhBCTQxCQkvKiBEaWdpdGFsIEFscGhhICovCisjZGVmaW5lIEVNX1NICQk0MgkJLyogSGl0YWNoaSBTSCAqLworI2RlZmluZSBFTV9TUEFSQ1Y5CTQzCQkvKiBTUEFSQyB2OSA2NC1iaXQgKi8KKyNkZWZpbmUgRU1fVFJJQ09SRQk0NAkJLyogU2llbWVucyBUcmljb3JlICovCisjZGVmaW5lIEVNX0FSQwkJNDUJCS8qIEFyZ29uYXV0IFJJU0MgQ29yZSAqLworI2RlZmluZSBFTV9IOF8zMDAJNDYJCS8qIEhpdGFjaGkgSDgvMzAwICovCisjZGVmaW5lIEVNX0g4XzMwMEgJNDcJCS8qIEhpdGFjaGkgSDgvMzAwSCAqLworI2RlZmluZSBFTV9IOFMJCTQ4CQkvKiBIaXRhY2hpIEg4UyAqLworI2RlZmluZSBFTV9IOF81MDAJNDkJCS8qIEhpdGFjaGkgSDgvNTAwICovCisjZGVmaW5lIEVNX0lBXzY0CTUwCQkvKiBJbnRlbCBNZXJjZWQgKi8KKyNkZWZpbmUgRU1fTUlQU19YCTUxCQkvKiBTdGFuZm9yZCBNSVBTLVggKi8KKyNkZWZpbmUgRU1fQ09MREZJUkUJNTIJCS8qIE1vdG9yb2xhIENvbGRmaXJlICovCisjZGVmaW5lIEVNXzY4SEMxMgk1MwkJLyogTW90b3JvbGEgTTY4SEMxMiAqLworI2RlZmluZSBFTV9NTUEJCTU0CQkvKiBGdWppdHN1IE1NQSBNdWx0aW1lZGlhIEFjY2VsZXJhdG9yKi8KKyNkZWZpbmUgRU1fUENQCQk1NQkJLyogU2llbWVucyBQQ1AgKi8KKyNkZWZpbmUgRU1fTkNQVQkJNTYJCS8qIFNvbnkgbkNQVSBlbWJlZWRlZCBSSVNDICovCisjZGVmaW5lIEVNX05EUjEJCTU3CQkvKiBEZW5zbyBORFIxIG1pY3JvcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1NUQVJDT1JFCTU4CQkvKiBNb3Rvcm9sYSBTdGFydCpDb3JlIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9NRTE2CQk1OQkJLyogVG95b3RhIE1FMTYgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1NUMTAwCTYwCQkvKiBTVE1pY3JvZWxlY3Ryb25pYyBTVDEwMCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fVElOWUoJNjEJCS8qIEFkdmFuY2VkIExvZ2ljIENvcnAuIFRpbnlqIGVtYi5mYW0qLworI2RlZmluZSBFTV9YODZfNjQJNjIJCS8qIEFNRCB4ODYtNjQgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEVNX1BEU1AJCTYzCQkvKiBTb255IERTUCBQcm9jZXNzb3IgKi8KKworI2RlZmluZSBFTV9GWDY2CQk2NgkJLyogU2llbWVucyBGWDY2IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV9TVDlQTFVTCTY3CQkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1Q5KyA4LzE2IG1jICovCisjZGVmaW5lIEVNX1NUNwkJNjgJCS8qIFNUbWljcm9lbGVjdHJvbmljcyBTVDcgOCBiaXQgbWMgKi8KKyNkZWZpbmUgRU1fNjhIQzE2CTY5CQkvKiBNb3Rvcm9sYSBNQzY4SEMxNiBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fNjhIQzExCTcwCQkvKiBNb3Rvcm9sYSBNQzY4SEMxMSBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fNjhIQzA4CTcxCQkvKiBNb3Rvcm9sYSBNQzY4SEMwOCBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fNjhIQzA1CTcyCQkvKiBNb3Rvcm9sYSBNQzY4SEMwNSBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fU1ZYCQk3MwkJLyogU2lsaWNvbiBHcmFwaGljcyBTVnggKi8KKyNkZWZpbmUgRU1fQVQxOQkJNzQJCS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVDE5IDggYml0IG1jICovCisjZGVmaW5lIEVNX1ZBWAkJNzUJCS8qIERpZ2l0YWwgVkFYICovCisjZGVmaW5lIEVNX0NSSVMJCTc2CQkvKiBBeGlzIENvbW11bmljYXRpb25zIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fSkFWRUxJTgk3NwkJLyogSW5maW5lb24gVGVjaG5vbG9naWVzIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fRklSRVBBVEgJNzgJCS8qIEVsZW1lbnQgMTQgNjQtYml0IERTUCBQcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fWlNQCQk3OQkJLyogTFNJIExvZ2ljIDE2LWJpdCBEU1AgUHJvY2Vzc29yICovCisjZGVmaW5lIEVNX01NSVgJCTgwCQkvKiBEb25hbGQgS251dGgncyBlZHVjYXRpb25hbCA2NC1iaXQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0hVQU5ZCTgxCQkvKiBIYXJ2YXJkIFVuaXZlcnNpdHkgbWFjaGluZS1pbmRlcGVuZGVudCBvYmplY3QgZmlsZXMgKi8KKyNkZWZpbmUgRU1fUFJJU00JODIJCS8qIFNpVGVyYSBQcmlzbSAqLworI2RlZmluZSBFTV9BVlIJCTgzCQkvKiBBdG1lbCBBVlIgOC1iaXQgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNX0ZSMzAJCTg0CQkvKiBGdWppdHN1IEZSMzAgKi8KKyNkZWZpbmUgRU1fRDEwVgkJODUJCS8qIE1pdHN1YmlzaGkgRDEwViAqLworI2RlZmluZSBFTV9EMzBWCQk4NgkJLyogTWl0c3ViaXNoaSBEMzBWICovCisjZGVmaW5lIEVNX1Y4NTAJCTg3CQkvKiBORUMgdjg1MCAqLworI2RlZmluZSBFTV9NMzJSCQk4OAkJLyogTWl0c3ViaXNoaSBNMzJSICovCisjZGVmaW5lIEVNX01OMTAzMDAJODkJCS8qIE1hdHN1c2hpdGEgTU4xMDMwMCAqLworI2RlZmluZSBFTV9NTjEwMjAwCTkwCQkvKiBNYXRzdXNoaXRhIE1OMTAyMDAgKi8KKyNkZWZpbmUgRU1fUEoJCTkxCQkvKiBwaWNvSmF2YSAqLworI2RlZmluZSBFTV9PUEVOUklTQwk5MgkJLyogT3BlblJJU0MgMzItYml0IGVtYmVkZGVkIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9BUkNfQTUJOTMJCS8qIEFSQyBDb3JlcyBUYW5nZW50LUE1ICovCisjZGVmaW5lIEVNX1hURU5TQQk5NAkJLyogVGVuc2lsaWNhIFh0ZW5zYSBBcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgRU1fTlVNCQk5NQorCisvKiBWYWx1ZXMgZm9yIHBfdHlwZS4gKi8KKyNkZWZpbmUgUFRfTlVMTAkJMAkvKiBVbnVzZWQgZW50cnkuICovCisjZGVmaW5lIFBUX0xPQUQJCTEJLyogTG9hZGFibGUgc2VnbWVudC4gKi8KKyNkZWZpbmUgUFRfRFlOQU1JQwkyCS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBzZWdtZW50LiAqLworI2RlZmluZSBQVF9JTlRFUlAJMwkvKiBQYXRobmFtZSBvZiBpbnRlcnByZXRlci4gKi8KKyNkZWZpbmUgUFRfTk9URQkJNAkvKiBBdXhpbGlhcnkgaW5mb3JtYXRpb24uICovCisjZGVmaW5lIFBUX1NITElCCTUJLyogUmVzZXJ2ZWQgKG5vdCB1c2VkKS4gKi8KKyNkZWZpbmUgUFRfUEhEUgkJNgkvKiBMb2NhdGlvbiBvZiBwcm9ncmFtIGhlYWRlciBpdHNlbGYuICovCisKKy8qIFZhbHVlcyBmb3IgcF9mbGFncy4gKi8KKyNkZWZpbmUgUEZfWAkJMHgxCS8qIEV4ZWN1dGFibGUuICovCisjZGVmaW5lIFBGX1cJCTB4MgkvKiBXcml0YWJsZS4gKi8KKyNkZWZpbmUgUEZfUgkJMHg0CS8qIFJlYWRhYmxlLiAqLworCisKKyNkZWZpbmUJRUxGX1BST0dSQU1fUkVUVVJOU19CSVQJMHg4MDAwMDAwCS8qIGVfZmxhZ3MgYml0IDMxICovCisKKyNkZWZpbmUgRUlfTUFHMAkJMAorI2RlZmluZSBFTEZNQUcwCQkweDdmCisKKyNkZWZpbmUgRUlfTUFHMQkJMQorI2RlZmluZSBFTEZNQUcxCQknRScKKworI2RlZmluZSBFSV9NQUcyCQkyCisjZGVmaW5lIEVMRk1BRzIJCSdMJworCisjZGVmaW5lIEVJX01BRzMJCTMKKyNkZWZpbmUgRUxGTUFHMwkJJ0YnCisKKyNkZWZpbmUgRUxGTUFHCQkiXDE3N0VMRiIKKyNkZWZpbmUJU0VMRk1BRwkJNAorCisjZGVmaW5lIEVJX0NMQVNTCTQJLyogRmlsZSBjbGFzcyBieXRlIGluZGV4ICovCisjZGVmaW5lIEVMRkNMQVNTTk9ORQkwCS8qIEludmFsaWQgY2xhc3MgKi8KKyNkZWZpbmUgRUxGQ0xBU1MzMgkxCS8qIDMyLWJpdCBvYmplY3RzICovCisjZGVmaW5lIEVMRkNMQVNTNjQJMgkvKiA2NC1iaXQgb2JqZWN0cyAqLworCisjZGVmaW5lIEVJX0RBVEEJCTUJLyogRGF0YSBlbmNvZGVpbmcgYnl0ZSBpbmRleCAqLworI2RlZmluZSBFTEZEQVRBTk9ORQkwCS8qIEludmFsaWQgZGF0YSBlbmNvZGluZyAqLworI2RlZmluZSBFTEZEQVRBMkxTQgkxCS8qIDIncyBjb21wbGVtZW50IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRUxGREFUQTJNU0IJMgkvKiAyJ3MgY29tcGxlbWVudCBiaWcgZW5kaWFuICovCisKKyNkZWZpbmUgRUlfVkVSU0lPTgk2CS8qIEZpbGUgdmVyc2lvbiBieXRlIGluZGV4ICovCisJCQkJLyogVmFsdWUgbXVzdCBiZSBFVl9DVVJSRU5UICovCisKKyNkZWZpbmUgRVZfTk9ORQkJMAkvKiBJbnZhbGlkIEVMRiBWZXJzaW9uICovCisjZGVmaW5lIEVWX0NVUlJFTlQJMQkvKiBDdXJyZW50IHZlcnNpb24gKi8KKworI2RlZmluZSBFTEYzMl9QSERSX1NJWkUgKDgqNCkJLyogU2l6ZSBvZiBhbiBlbGYgcHJvZ3JhbSBoZWFkZXIgKi8KKworI2lmbmRlZiBBU1NFTUJMWQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qCisgKiBFTEYgZGVmaW5pdGlvbnMgY29tbW9uIHRvIGFsbCAzMi1iaXQgYXJjaGl0ZWN0dXJlcy4KKyAqLworCit0eXBlZGVmIHVpbnQzMl90CUVsZjMyX0FkZHI7Cit0eXBlZGVmIHVpbnQxNl90CUVsZjMyX0hhbGY7Cit0eXBlZGVmIHVpbnQzMl90CUVsZjMyX09mZjsKK3R5cGVkZWYgaW50MzJfdAkJRWxmMzJfU3dvcmQ7Cit0eXBlZGVmIHVpbnQzMl90CUVsZjMyX1dvcmQ7Cit0eXBlZGVmIHVpbnQzMl90CUVsZjMyX1NpemU7CisKK3R5cGVkZWYgdWludDY0X3QJRWxmNjRfQWRkcjsKK3R5cGVkZWYgdWludDE2X3QJRWxmNjRfSGFsZjsKK3R5cGVkZWYgdWludDY0X3QJRWxmNjRfT2ZmOwordHlwZWRlZiBpbnQzMl90CQlFbGY2NF9Td29yZDsKK3R5cGVkZWYgdWludDMyX3QJRWxmNjRfV29yZDsKK3R5cGVkZWYgdWludDY0X3QJRWxmNjRfU2l6ZTsKKworLyoKKyAqIEVMRiBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyCWVfaWRlbnRbRUlfTklERU5UXTsJLyogRmlsZSBpZGVudGlmaWNhdGlvbi4gKi8KKwlFbGYzMl9IYWxmCWVfdHlwZTsJCS8qIEZpbGUgdHlwZS4gKi8KKwlFbGYzMl9IYWxmCWVfbWFjaGluZTsJLyogTWFjaGluZSBhcmNoaXRlY3R1cmUuICovCisJRWxmMzJfV29yZAllX3ZlcnNpb247CS8qIEVMRiBmb3JtYXQgdmVyc2lvbi4gKi8KKwlFbGYzMl9BZGRyCWVfZW50cnk7CS8qIEVudHJ5IHBvaW50LiAqLworCUVsZjMyX09mZgllX3Bob2ZmOwkvKiBQcm9ncmFtIGhlYWRlciBmaWxlIG9mZnNldC4gKi8KKwlFbGYzMl9PZmYJZV9zaG9mZjsJLyogU2VjdGlvbiBoZWFkZXIgZmlsZSBvZmZzZXQuICovCisJRWxmMzJfV29yZAllX2ZsYWdzOwkvKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmxhZ3MuICovCisJRWxmMzJfSGFsZgllX2Voc2l6ZTsJLyogU2l6ZSBvZiBFTEYgaGVhZGVyIGluIGJ5dGVzLiAqLworCUVsZjMyX0hhbGYJZV9waGVudHNpemU7CS8qIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkuICovCisJRWxmMzJfSGFsZgllX3BobnVtOwkvKiBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllcy4gKi8KKwlFbGYzMl9IYWxmCWVfc2hlbnRzaXplOwkvKiBTaXplIG9mIHNlY3Rpb24gaGVhZGVyIGVudHJ5LiAqLworCUVsZjMyX0hhbGYJZV9zaG51bTsJLyogTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyIGVudHJpZXMuICovCisJRWxmMzJfSGFsZgllX3Noc3RybmR4OwkvKiBTZWN0aW9uIG5hbWUgc3RyaW5ncyBzZWN0aW9uLiAqLworfSBFbGYzMl9FaGRyOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhcgllX2lkZW50W0VJX05JREVOVF07CS8qIEZpbGUgaWRlbnRpZmljYXRpb24uICovCisJRWxmNjRfSGFsZgllX3R5cGU7CQkvKiBGaWxlIHR5cGUuICovCisJRWxmNjRfSGFsZgllX21hY2hpbmU7CS8qIE1hY2hpbmUgYXJjaGl0ZWN0dXJlLiAqLworCUVsZjY0X1dvcmQJZV92ZXJzaW9uOwkvKiBFTEYgZm9ybWF0IHZlcnNpb24uICovCisJRWxmNjRfQWRkcgllX2VudHJ5OwkvKiBFbnRyeSBwb2ludC4gKi8KKwlFbGY2NF9PZmYJZV9waG9mZjsJLyogUHJvZ3JhbSBoZWFkZXIgZmlsZSBvZmZzZXQuICovCisJRWxmNjRfT2ZmCWVfc2hvZmY7CS8qIFNlY3Rpb24gaGVhZGVyIGZpbGUgb2Zmc2V0LiAqLworCUVsZjY0X1dvcmQJZV9mbGFnczsJLyogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZsYWdzLiAqLworCUVsZjY0X0hhbGYJZV9laHNpemU7CS8qIFNpemUgb2YgRUxGIGhlYWRlciBpbiBieXRlcy4gKi8KKwlFbGY2NF9IYWxmCWVfcGhlbnRzaXplOwkvKiBTaXplIG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5LiAqLworCUVsZjY0X0hhbGYJZV9waG51bTsJLyogTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIGVudHJpZXMuICovCisJRWxmNjRfSGFsZgllX3NoZW50c2l6ZTsJLyogU2l6ZSBvZiBzZWN0aW9uIGhlYWRlciBlbnRyeS4gKi8KKwlFbGY2NF9IYWxmCWVfc2hudW07CS8qIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlciBlbnRyaWVzLiAqLworCUVsZjY0X0hhbGYJZV9zaHN0cm5keDsJLyogU2VjdGlvbiBuYW1lIHN0cmluZ3Mgc2VjdGlvbi4gKi8KK30gRWxmNjRfRWhkcjsKKworLyoKKyAqIFByb2dyYW0gaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJRWxmMzJfV29yZAlwX3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLworCUVsZjMyX09mZglwX29mZnNldDsJLyogRmlsZSBvZmZzZXQgb2YgY29udGVudHMuICovCisJRWxmMzJfQWRkcglwX3ZhZGRyOwkvKiBWaXJ0dWFsIGFkZHJlc3MgKG5vdCB1c2VkKS4gKi8KKwlFbGYzMl9BZGRyCXBfcGFkZHI7CS8qIFBoeXNpY2FsIGFkZHJlc3MuICovCisJRWxmMzJfU2l6ZQlwX2ZpbGVzejsJLyogU2l6ZSBvZiBjb250ZW50cyBpbiBmaWxlLiAqLworCUVsZjMyX1NpemUJcF9tZW1zejsJLyogU2l6ZSBvZiBjb250ZW50cyBpbiBtZW1vcnkuICovCisJRWxmMzJfV29yZAlwX2ZsYWdzOwkvKiBBY2Nlc3MgcGVybWlzc2lvbiBmbGFncy4gKi8KKwlFbGYzMl9TaXplCXBfYWxpZ247CS8qIEFsaWdubWVudCBpbiBtZW1vcnkgYW5kIGZpbGUuICovCit9IEVsZjMyX1BoZHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlFbGY2NF9Xb3JkCXBfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCisJRWxmNjRfV29yZAlwX2ZsYWdzOwkvKiBBY2Nlc3MgcGVybWlzc2lvbiBmbGFncy4gKi8KKwlFbGY2NF9PZmYJcF9vZmZzZXQ7CS8qIEZpbGUgb2Zmc2V0IG9mIGNvbnRlbnRzLiAqLworCUVsZjY0X0FkZHIJcF92YWRkcjsJLyogVmlydHVhbCBhZGRyZXNzIChub3QgdXNlZCkuICovCisJRWxmNjRfQWRkcglwX3BhZGRyOwkvKiBQaHlzaWNhbCBhZGRyZXNzLiAqLworCUVsZjY0X1NpemUJcF9maWxlc3o7CS8qIFNpemUgb2YgY29udGVudHMgaW4gZmlsZS4gKi8KKwlFbGY2NF9TaXplCXBfbWVtc3o7CS8qIFNpemUgb2YgY29udGVudHMgaW4gbWVtb3J5LiAqLworCUVsZjY0X1NpemUJcF9hbGlnbjsJLyogQWxpZ25tZW50IGluIG1lbW9yeSBhbmQgZmlsZS4gKi8KK30gRWxmNjRfUGhkcjsKKworLyogU3RhbmRhcmRpemVkIEVsZiBpbWFnZSBub3RlcyBmb3IgYm9vdGluZy4uLiBUaGUgbmFtZSBmb3IgYWxsIG9mIHRoZXNlIGlzIEVMRkJvb3QgKi8KKworI2VuZGlmIC8qIEFTU0VNQkxZICovCisKKyNlbmRpZiAvKiBFTEZfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9lbmRpYW4uaCBiL2dweGUvc3JjL2luY2x1ZGUvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MmNmOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZW5kaWFuLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBFVEhFUkJPT1RfRU5ESUFOX0gKKyNkZWZpbmUgRVRIRVJCT09UX0VORElBTl9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyogRGVmaW5pdGlvbnMgZm9yIGJ5dGUgb3JkZXIsIGFjY29yZGluZyB0byBzaWduaWZpY2FuY2Ugb2YgYnl0ZXMsCisgICBmcm9tIGxvdyBhZGRyZXNzZXMgdG8gaGlnaCBhZGRyZXNzZXMuICBUaGUgdmFsdWUgaXMgd2hhdCB5b3UgZ2V0IGJ5CisgICBwdXR0aW5nICc0JyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlLCAnMycgaW4gdGhlIHNlY29uZCBtb3N0CisgICBzaWduaWZpY2FudCBieXRlLCAnMicgaW4gdGhlIHNlY29uZCBsZWFzdCBzaWduaWZpY2FudCBieXRlLCBhbmQgJzEnCisgICBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgYW5kIHRoZW4gd3JpdGluZyBkb3duIG9uZSBkaWdpdCBmb3IKKyAgIGVhY2ggYnl0ZSwgc3RhcnRpbmcgd2l0aCB0aGUgYnl0ZSBhdCB0aGUgbG93ZXN0IGFkZHJlc3MgYXQgdGhlIGxlZnQsCisgICBhbmQgcHJvY2VlZGluZyB0byB0aGUgYnl0ZSB3aXRoIHRoZSBoaWdoZXN0IGFkZHJlc3MgYXQgdGhlIHJpZ2h0LiAgKi8KKworI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gMTIzNAorI2RlZmluZSBfX0JJR19FTkRJQU4gICAgNDMyMQorI2RlZmluZSBfX1BEUF9FTkRJQU4gICAgMzQxMgorCisjaW5jbHVkZSAiYml0cy9lbmRpYW4uaCIKKworCisjZW5kaWYgLyogRVRIRVJCT09UX0VORElBTl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2Vycm5vLmggYi9ncHhlL3NyYy9pbmNsdWRlL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwOTVlYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZXJybm8uaApAQCAtMCwwICsxLDUxMCBAQAorI2lmbmRlZiBFUlJOT19ICisjZGVmaW5lIEVSUk5PX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogQGZpbGUKKyAqCisgKiBFcnJvciBjb2RlcworICoKKyAqIFJldHVybiBzdGF0dXMgY29kZXMgYXMgdXNlZCB3aXRoaW4gZ1BYRSBhcmUgZGVzaWduZWQgdG8gYWxsb3cgZm9yCisgKiBtYXhpbXVtIHZpc2liaWxpdHkgaW50byB0aGUgc291cmNlIG9mIGFuIGVycm9yIGV2ZW4gaW4gYW4gZW5kLXVzZXIKKyAqIGJ1aWxkIHdpdGggbm8gZGVidWdnaW5nLiAgVGhleSBhcmUgY29uc3RydWN0ZWQgYXMgZm9sbG93czoKKyAqCisgKiBCaXRzIDctMCA6IFBYRSBlcnJvciBjb2RlCisgKgorICogVGhpcyBpcyB0aGUgY2xvc2VzdCBlcXVpdmFsZW50IFBYRSBlcnJvciBjb2RlCisgKiAoZS5nLiBQWEVOVl9TVEFUVVNfT1VUX09GX1JFU09VUkNFUyksIGFuZCBpcyB0aGUgb25seSBwYXJ0IG9mIHRoZQorICogZXJyb3IgdGhhdCB3aWxsIGJlIHJldHVybmVkIHZpYSB0aGUgUFhFIEFQSSwgc2luY2UgUFhFIGhhcworICogcHJlZGVmaW5lZCBlcnJvciBjb2Rlcy4KKyAqCisgKiBCaXRzIDEyLTggOiBQZXItZmlsZSBkaXNhbWJpZ3VhdG9yCisgKgorICogV2hlbiB0aGUgc2FtZSBlcnJvciBudW1iZXIgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIG11bHRpcGxlIHBvaW50cworICogd2l0aGluIGEgZmlsZSwgdGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgdW5pcXVlCisgKiBpbnN0YW5jZS4KKyAqCisgKiBCaXRzIDIzLTEzIDogRmlsZSBpZGVudGlmaWVyCisgKgorICogVGhpcyBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZmlsZSBnZW5lcmF0aW5nIHRoZSBlcnJvcgorICogKGUuZy4gRVJSRklMRV90Y3AgZm9yIHRjcC5jKS4KKyAqCisgKiBCaXRzIDMwLTI0IDogUE9TSVggZXJyb3IgY29kZQorICoKKyAqIFRoaXMgaXMgdGhlIGNsb3Nlc3QgZXF1aXZhbGVudCBQT1NJWCBlcnJvciBjb2RlIChlLmcuIEVOT01FTSkuCisgKgorICogQml0IDMxIDogUmVzZXJ2ZWQKKyAqCisgKiBFcnJvcnMgYXJlIHVzdWFsbHkgcmV0dXJuIGFzIG5lZ2F0aXZlIGVycm9yIG51bWJlcnMgKGUuZy4gLUVJTlZBTCk7CisgKiBiaXQgMzEgaXMgdGhlcmVmb3JlIHVudXNhYmxlLgorICoKKyAqCisgKiBUaGUgY29udmVudGlvbiB3aXRoaW4gdGhlIGNvZGUgaXMgdGhhdCBlcnJvcnMgYXJlIG5lZ2F0aXZlIGFuZAorICogZXhwcmVzc2VkIHVzaW5nIHRoZSBQT1NJWCBlcnJvciBjb2RlIGFuZCAob3B0aW9uYWxseSkgYSBwZXItZmlsZQorICogZGlzYW1iaWd1YXRvciwgZS5nLgorICoKKyAqICAgICByZXR1cm4gLUVJTlZBTDsKKyAqCisgKiBvcgorICoKKyAqICAgICAjZGVmaW5lIEVUQ1BfQkFEX0NIRUNLU1VNIEVVTklRXzAyCisgKiAgICAgcmV0dXJuIC0oIEVJTlZBTCB8IEVUQ1BfQkFEX0NIRUNLU1VNICkKKyAqCisgKiBCeSB2YXJpb3VzIGJpdHMgb2YgcHJlcHJvY2Vzc29yIG1hZ2ljLCB0aGUgUFhFIGVycm9yIGNvZGUgYW5kIGZpbGUKKyAqIGlkZW50aWZpZXIgYXJlIGFscmVhZHkgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGRlZmluaXRpb24gb2YgdGhlCisgKiBQT1NJWCBlcnJvciBjb2RlLCB3aGljaCBrZWVwcyB0aGUgY29kZSByZWxhdGl2ZWx5IGNsZWFuLgorICoKKyAqCisgKiBGdW5jdGlvbnMgdGhhdCB3aXNoIHRvIHJldHVybiBmYWlsdXJlcyBzaG91bGQgYmUgZGVjbGFyZWQgYXMKKyAqIHJldHVybmluZyBhbiBpbnRlZ2VyIEBjIHJjICJSZXR1cm4gc3RhdHVzIGNvZGUiLiAgQSByZXR1cm4gdmFsdWUgb2YKKyAqIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MsIGEgbm9uLXplcm8gdmFsdWUgaW5kaWNhdGVzIGZhaWx1cmUuICBUaGUKKyAqIHJldHVybiB2YWx1ZSBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHN0cmVycm9yKCkgaW4gb3JkZXIgdG8KKyAqIGdlbmVyYXRlIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZSwgZS5nLgorICoKKyAqICAgICBpZiAoICggcmMgPSBzb21lX2Z1bmN0aW9uICggLi4uICkgKSAhPSAwICkgeworICogICAgICAgICBEQkcgKCAiV2hhdGV2ZXIgSSB3YXMgdHJ5aW5nIHRvIGRvIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yICggcmMgKSApOworICogICAgICAgICByZXR1cm4gcmM7CisgKiAgICAgfQorICoKKyAqIEFzIGlsbHVzdHJhdGVkIGluIHRoZSBhYm92ZSBleGFtcGxlLCBlcnJvciByZXR1cm5zIHNob3VsZCBnZW5lcmFsbHkKKyAqIGJlIGRpcmVjdGx5IHByb3BhZ2F0ZWQgdXB3YXJkIHRvIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLgorICoKKyAqLworCisvKiBHZXQgZGVmaW5pdGlvbnMgZm9yIGZpbGUgaWRlbnRpZmllcnMgKi8KKyNpbmNsdWRlIDxncHhlL2VycmZpbGUuaD4KKworLyogSWYgd2UgZG8gbm90IGhhdmUgYSB2YWxpZCBmaWxlIGlkZW50aWZpZXIsIGdlbmVyYXRlIGEgY29tcGlsZXIKKyAqIHdhcm5pbmcgdXBvbiB1c2FnZSBvZiBhbnkgZXJyb3IgY29kZXMuICAoRG9uJ3QganVzdCB1c2UgYSAjd2FybmluZywKKyAqIGJlY2F1c2Ugc29tZSBmaWxlcyBpbmNsdWRlIGVycm5vLmggYnV0IGRvbid0IGV2ZXIgYWN0dWFsbHkgdXNlIGFueQorICogZXJyb3IgY29kZXMuKQorICovCisjaWYgISBFUlJGSUxFCitleHRlcm4gY2hhciBtaXNzaW5nX2VycmZpbGVfZGVjbGFyYXRpb25bXSBfX2F0dHJpYnV0ZV9fICgoIGRlcHJlY2F0ZWQgKSk7CisjdW5kZWYgRVJSRklMRQorI2RlZmluZSBFUlJGSUxFICggMCAqICggKCBpbnQgKSBtaXNzaW5nX2VycmZpbGVfZGVjbGFyYXRpb24gKSApCisjZW5kaWYKKworLyoqIERlcml2ZSBQWEVOVl9TVEFUVVMgY29kZSBmcm9tIGdQWEUgZXJyb3IgbnVtYmVyICovCisjZGVmaW5lIFBYRU5WX1NUQVRVUyggcmMgKSAoICgtKHJjKSkgJiAweDAwZmYgKQorCisvKioKKyAqIEBkZWZncm91cCBweGVlcnJvcnMgUFhFIGVycm9yIGNvZGVzCisgKgorICogVGhlIG5hbWVzLCBtZWFuaW5ncyBhbmQgdmFsdWVzIG9mIHRoZXNlIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkIGJ5CisgKiB0aGUgUFhFIHNwZWNpZmljYXRpb24uCisgKgorICogQHsKKyAqLworCisvKiBHZW5lcmljIGVycm9ycyAqLworI2RlZmluZQlQWEVOVl9TVEFUVVNfU1VDQ0VTUwkJCQkJICAgICAgIDB4MDAwMAorI2RlZmluZQlQWEVOVl9TVEFUVVNfRkFJTFVSRQkJCQkJICAgICAgIDB4MDAwMQorI2RlZmluZQlQWEVOVl9TVEFUVVNfQkFEX0ZVTkMJCQkJCSAgICAgICAweDAwMDIKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1VOU1VQUE9SVEVECQkJCSAgICAgICAweDAwMDMKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0tFRVBfVU5ESQkJCQkJICAgICAgIDB4MDAwNAorI2RlZmluZQlQWEVOVl9TVEFUVVNfS0VFUF9BTEwJCQkJCSAgICAgICAweDAwMDUKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX09VVF9PRl9SRVNPVVJDRVMJCQkJICAgICAgIDB4MDAwNgorCisvKiBBUlAgZXJyb3JzICgweDAwMTAgdG8gMHgwMDFmKSAqLworI2RlZmluZQlQWEVOVl9TVEFUVVNfQVJQX1RJTUVPVVQJCQkJICAgICAgIDB4MDAxMQorCisvKiBCYXNlLUNvZGUgc3RhdGUgZXJyb3JzICovCisjZGVmaW5lCVBYRU5WX1NUQVRVU19VRFBfQ0xPU0VECQkJCQkgICAgICAgMHgwMDE4CisjZGVmaW5lCVBYRU5WX1NUQVRVU19VRFBfT1BFTgkJCQkJICAgICAgIDB4MDAxOQorI2RlZmluZQlQWEVOVl9TVEFUVVNfVEZUUF9DTE9TRUQJCQkJICAgICAgIDB4MDAxYQorI2RlZmluZQlQWEVOVl9TVEFUVVNfVEZUUF9PUEVOCQkJCQkgICAgICAgMHgwMDFiCisKKy8qIEJJT1Mvc3lzdGVtIGVycm9ycyAoMHgwMDIwIHRvIDB4MDAyZikgKi8KKyNkZWZpbmUJUFhFTlZfU1RBVFVTX01DT1BZX1BST0JMRU0JCQkJICAgICAgIDB4MDAyMAorI2RlZmluZQlQWEVOVl9TVEFUVVNfQklTX0lOVEVHUklUWV9GQUlMVVJFCQkJICAgICAgIDB4MDAyMQorI2RlZmluZQlQWEVOVl9TVEFUVVNfQklTX1ZBTElEQVRFX0ZBSUxVUkUJCQkgICAgICAgMHgwMDIyCisjZGVmaW5lCVBYRU5WX1NUQVRVU19CSVNfSU5JVF9GQUlMVVJFCQkJCSAgICAgICAweDAwMjMKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0JJU19TSFVURE9XTl9GQUlMVVJFCQkJICAgICAgIDB4MDAyNAorI2RlZmluZQlQWEVOVl9TVEFUVVNfQklTX0dCT0FfRkFJTFVSRQkJCQkgICAgICAgMHgwMDI1CisjZGVmaW5lCVBYRU5WX1NUQVRVU19CSVNfRlJFRV9GQUlMVVJFCQkJCSAgICAgICAweDAwMjYKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0JJU19HU0lfRkFJTFVSRQkJCQkgICAgICAgMHgwMDI3CisjZGVmaW5lCVBYRU5WX1NUQVRVU19CSVNfQkFEX0NLU1VNCQkJCSAgICAgICAweDAwMjgKKworLyogVEZUUC9NVEZUUCBlcnJvcnMgKDB4MDAzMCB0byAweDAwM2YpICovCisjZGVmaW5lCVBYRU5WX1NUQVRVU19URlRQX0NBTk5PVF9BUlBfQUREUkVTUwkJCSAgICAgICAweDAwMzAKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1RGVFBfT1BFTl9USU1FT1VUCQkJCSAgICAgICAweDAwMzIKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1RGVFBfVU5LTk9XTl9PUENPREUJCQkgICAgICAgMHgwMDMzCisjZGVmaW5lCVBYRU5WX1NUQVRVU19URlRQX1JFQURfVElNRU9VVAkJCQkgICAgICAgMHgwMDM1CisjZGVmaW5lCVBYRU5WX1NUQVRVU19URlRQX0VSUk9SX09QQ09ERQkJCQkgICAgICAgMHgwMDM2CisjZGVmaW5lCVBYRU5WX1NUQVRVU19URlRQX0NBTk5PVF9PUEVOX0NPTk5FQ1RJT04JCSAgICAgICAweDAwMzgKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1RGVFBfQ0FOTk9UX1JFQURfRlJPTV9DT05ORUNUSU9OCQkgICAgICAgMHgwMDM5CisjZGVmaW5lCVBYRU5WX1NUQVRVU19URlRQX1RPT19NQU5ZX1BBQ0tBR0VTCQkJICAgICAgIDB4MDAzYQorI2RlZmluZQlQWEVOVl9TVEFUVVNfVEZUUF9GSUxFX05PVF9GT1VORAkJCSAgICAgICAweDAwM2IKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1RGVFBfQUNDRVNTX1ZJT0xBVElPTgkJCSAgICAgICAweDAwM2MKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1RGVFBfTk9fTUNBU1RfQUREUkVTUwkJCSAgICAgICAweDAwM2QKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1RGVFBfTk9fRklMRVNJWkUJCQkJICAgICAgIDB4MDAzZQorI2RlZmluZQlQWEVOVl9TVEFUVVNfVEZUUF9JTlZBTElEX1BBQ0tFVF9TSVpFCQkJICAgICAgIDB4MDAzZgorCisvKiBSZXNlcnZlZCBlcnJvcnMgMHgwMDQwIHRvIDB4MDA0ZikgKi8KKworLyogREhDUC9CT09UUCBlcnJvcnMgKDB4MDA1MCB0byAweDAwNWYpICovCisjZGVmaW5lCVBYRU5WX1NUQVRVU19ESENQX1RJTUVPVVQJCQkJICAgICAgIDB4MDA1MQorI2RlZmluZQlQWEVOVl9TVEFUVVNfREhDUF9OT19JUF9BRERSRVNTCQkJCSAgICAgICAweDAwNTIKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0RIQ1BfTk9fQk9PVEZJTEVfTkFNRQkJCSAgICAgICAweDAwNTMKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0RIQ1BfQkFEX0lQX0FERFJFU1MJCQkgICAgICAgMHgwMDU0CisKKy8qIERyaXZlciBlcnJvcnMgKDB4MDA2MCB0byAweDAwNmYpICovCisjZGVmaW5lCVBYRU5WX1NUQVRVU19VTkRJX0lOVkFMSURfRlVOQ1RJT04JCQkgICAgICAgMHgwMDYwCisjZGVmaW5lCVBYRU5WX1NUQVRVU19VTkRJX01FRElBVEVTVF9GQUlMRUQJCQkgICAgICAgMHgwMDYxCisjZGVmaW5lCVBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9JTklUX05JQ19GT1JfTUNBU1QJCSAgICAgICAweDAwNjIKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1VORElfQ0FOTk9UX0lOSVRJQUxJWkVfTklDCQkJICAgICAgIDB4MDA2MworI2RlZmluZQlQWEVOVl9TVEFUVVNfVU5ESV9DQU5OT1RfSU5JVElBTElaRV9QSFkJCQkgICAgICAgMHgwMDY0CisjZGVmaW5lCVBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9SRUFEX0NPTkZJR19EQVRBCQkgICAgICAgMHgwMDY1CisjZGVmaW5lCVBYRU5WX1NUQVRVU19VTkRJX0NBTk5PVF9SRUFEX0lOSVRfREFUQQkJCSAgICAgICAweDAwNjYKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1VORElfQkFEX01BQ19BRERSRVNTCQkJICAgICAgIDB4MDA2NworI2RlZmluZQlQWEVOVl9TVEFUVVNfVU5ESV9CQURfRUVQUk9NX0NIRUNLU1VNCQkJICAgICAgIDB4MDA2OAorI2RlZmluZQlQWEVOVl9TVEFUVVNfVU5ESV9FUlJPUl9TRVRUSU5HX0lTUgkJCSAgICAgICAweDAwNjkKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX1VORElfSU5WQUxJRF9TVEFURQkJCQkgICAgICAgMHgwMDZhCisjZGVmaW5lCVBYRU5WX1NUQVRVU19VTkRJX1RSQU5TTUlUX0VSUk9SCQkJICAgICAgIDB4MDA2YgorI2RlZmluZQlQWEVOVl9TVEFUVVNfVU5ESV9JTlZBTElEX1BBUkFNRVRFUgkJCSAgICAgICAweDAwNmMKKworLyogUk9NIGFuZCBOQlAgYm9vdHN0cmFwIGVycm9ycyAoMHgwMDcwIHRvIDB4MDA3ZikgKi8KKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0JTVFJBUF9QUk9NUFRfTUVOVQkJCQkgICAgICAgMHgwMDc0CisjZGVmaW5lCVBYRU5WX1NUQVRVU19CU1RSQVBfTUNBU1RfQUREUgkJCQkgICAgICAgMHgwMDc2CisjZGVmaW5lCVBYRU5WX1NUQVRVU19CU1RSQVBfTUlTU0lOR19MSVNUCQkJICAgICAgIDB4MDA3NworI2RlZmluZQlQWEVOVl9TVEFUVVNfQlNUUkFQX05PX1JFU1BPTlNFCQkJCSAgICAgICAweDAwNzgKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0JTVFJBUF9GSUxFX1RPT19CSUcJCQkgICAgICAgMHgwMDc5CisKKy8qIEVudmlyb25tZW50IE5CUCBlcnJvcnMgKDB4MDA4MCB0byAweDAwOGYpICovCisKKy8qIFJlc2VydmVkIGVycm9ycyAoMHgwMDkwIHRvIDB4MDA5ZikgKi8KKworLyogTWlzY2VsbGFuZW91cyBlcnJvcnMgKDB4MDBhMCB0byAweDAwYWYpICovCisjZGVmaW5lCVBYRU5WX1NUQVRVU19CSU5MX0NBTkNFTEVEX0JZX0tFWVNUUk9LRQkJCSAgICAgICAweDAwYTAKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0JJTkxfTk9fUFhFX1NFUlZFUgkJCQkgICAgICAgMHgwMGExCisjZGVmaW5lCVBYRU5WX1NUQVRVU19OT1RfQVZBSUxBQkxFX0lOX1BNT0RFCQkJICAgICAgIDB4MDBhMgorI2RlZmluZQlQWEVOVl9TVEFUVVNfTk9UX0FWQUlMQUJMRV9JTl9STU9ERQkJCSAgICAgICAweDAwYTMKKworLyogQlVTRCBlcnJvcnMgKDB4MDBiMCB0byAweDAwYmYpICovCisjZGVmaW5lCVBYRU5WX1NUQVRVU19CVVNEX0RFVklDRV9OT1RfU1VQUE9SVEVECQkJICAgICAgIDB4MDBiMAorCisvKiBMb2FkZXIgZXJyb3JzICgweDAwYzAgdG8gMHgwMGNmKSAqLworI2RlZmluZQlQWEVOVl9TVEFUVVNfTE9BREVSX05PX0ZSRUVfQkFTRV9NRU1PUlkJCQkgICAgICAgMHgwMGMwCisjZGVmaW5lCVBYRU5WX1NUQVRVU19MT0FERVJfTk9fQkNfUk9NSUQJCQkJICAgICAgIDB4MDBjMQorI2RlZmluZQlQWEVOVl9TVEFUVVNfTE9BREVSX0JBRF9CQ19ST01JRAkJCSAgICAgICAweDAwYzIKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0xPQURFUl9CQURfQkNfUlVOVElNRV9JTUFHRQkJICAgICAgIDB4MDBjMworI2RlZmluZQlQWEVOVl9TVEFUVVNfTE9BREVSX05PX1VORElfUk9NSUQJCQkgICAgICAgMHgwMGM0CisjZGVmaW5lCVBYRU5WX1NUQVRVU19MT0FERVJfQkFEX1VORElfUk9NSUQJCQkgICAgICAgMHgwMGM1CisjZGVmaW5lCVBYRU5WX1NUQVRVU19MT0FERVJfQkFEX1VORElfRFJJVkVSX0lNQUdFCQkgICAgICAgMHgwMGM2CisjZGVmaW5lCVBYRU5WX1NUQVRVU19MT0FERVJfTk9fUFhFX1NUUlVDVAkJCSAgICAgICAweDAwYzgKKyNkZWZpbmUJUFhFTlZfU1RBVFVTX0xPQURFUl9OT19QWEVOVl9TVFJVQ1QJCQkgICAgICAgMHgwMGM5CisjZGVmaW5lCVBYRU5WX1NUQVRVU19MT0FERVJfVU5ESV9TVEFSVAkJCQkgICAgICAgMHgwMGNhCisjZGVmaW5lCVBYRU5WX1NUQVRVU19MT0FERVJfQkNfU1RBUlQJCQkJICAgICAgIDB4MDBjYgorCisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcG9zaXhlcnJvcnMgUE9TSVggZXJyb3IgY29kZXMKKyAqCisgKiBUaGUgbmFtZXMgYW5kIG1lYW5pbmdzIChidXQgbm90IHRoZSB2YWx1ZXMpIG9mIHRoZXNlIGVycm9yIGNvZGVzCisgKiBhcmUgZGVmaW5lZCBieSBQT1NJWC4gIFdlIGNob29zZSB0byBhc3NpZ24gdW5pcXVlIHZhbHVlcyB3aGljaAorICogaW5jb3Jwb3JhdGUgdGhlIGNsb3Nlc3QgZXF1aXZhbGVudCBQWEUgZXJyb3IgY29kZSwgc28gdGhhdCBjb2RlIG1heQorICogc2ltcGx5IHVzZSBFTk9NRU0sIHJhdGhlciB0aGFuIGhhdmluZyB0byB1c2UgdGhlIGN1bWJlcnNvbWUKKyAqIChFTk9NRU18UFhFTlZfU1RBVFVTX09VVF9PRl9SRVNPVVJDRVMpLgorICoKKyAqIEB7CisgKi8KKworLyoqIE9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisjZGVmaW5lIEVOT0VSUgkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19TVUNDRVNTIHwgMHgwMDAwMDAwMCApCisKKy8qKiBBcmcgbGlzdCB0b28gbG9uZyAqLworI2RlZmluZSBFMkJJRwkJICAgICAgICggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19CQURfRlVOQyB8IDB4MDEwMDAwMDAgKQorCisvKiogUGVybWlzc2lvbiBkZW5pZWQgKi8KKyNkZWZpbmUgRUFDQ0VTCSAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1RGVFBfQUNDRVNTX1ZJT0xBVElPTiB8IDB4MDIwMDAwMDAgKQorCisvKiogQWRkcmVzcyBpbiB1c2UgKi8KKyNkZWZpbmUgRUFERFJJTlVTRQkgICAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1VEUF9PUEVOIHwgMHgwMzAwMDAwMCApCisKKy8qKiBBZGRyZXNzIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgRUFERFJOT1RBVkFJTAkgICAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1VEUF9PUEVOIHwgMHgwNDAwMDAwMCApCisKKy8qKiBBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEVBRk5PU1VQUE9SVAkgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1VOU1VQUE9SVEVEIHwgMHgwNTAwMDAwMCApCisKKy8qKiBSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSAqLworI2RlZmluZSBFQUdBSU4JCQkoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfRkFJTFVSRSB8IDB4MDYwMDAwMDAgKQorCisvKiogQ29ubmVjdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzICovCisjZGVmaW5lIEVBTFJFQURZCSAgICAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfVURQX09QRU4gfCAweDA3MDAwMDAwICkKKworLyoqIEJhZCBmaWxlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRUJBREYJCSAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfVEZUUF9DTE9TRUQgfCAweDA4MDAwMDAwICkKKworLyoqIEJhZCBtZXNzYWdlICovCisjZGVmaW5lIEVCQURNU0cJCQkoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfRkFJTFVSRSB8IDB4MDkwMDAwMDAgKQorCisvKiogUmVzb3VyY2UgYnVzeSAqLworI2RlZmluZSBFQlVTWQkgICAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX09VVF9PRl9SRVNPVVJDRVMgfCAweDBhMDAwMDAwICkKKworLyoqIE9wZXJhdGlvbiBjYW5jZWxlZCAqLworI2RlZmluZSBFQ0FOQ0VMRUQgXAorCSAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0JJTkxfQ0FOQ0VMRURfQllfS0VZU1RST0tFIHwgMHgwYjAwMDAwMCApCisKKy8qKiBObyBjaGlsZCBwcm9jZXNzZXMgKi8KKyNkZWZpbmUgRUNISUxECSAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfVEZUUF9GSUxFX05PVF9GT1VORCB8IDB4MGMwMDAwMDAgKQorCisvKiogQ29ubmVjdGlvbiBhYm9ydGVkICovCisjZGVmaW5lIEVDT05OQUJPUlRFRCBcCisgICAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1RGVFBfQ0FOTk9UX1JFQURfRlJPTV9DT05ORUNUSU9OIHwgMHgwZDAwMDAwMCApCisKKy8qKiBDb25uZWN0aW9uIHJlZnVzZWQgKi8KKyNkZWZpbmUgRUNPTk5SRUZVU0VEIFwKKwkgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1RGVFBfQ0FOTk9UX09QRU5fQ09OTkVDVElPTiB8IDB4MGUwMDAwMDAgKQorCisvKiogQ29ubmVjdGlvbiByZXNldCAqLworI2RlZmluZSBFQ09OTlJFU0VUIFwKKyAgICAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfVEZUUF9DQU5OT1RfUkVBRF9GUk9NX0NPTk5FQ1RJT04gfCAweDBmMDAwMDAwICkKKworLyoqIFJlc291cmNlIGRlYWRsb2NrIGF2b2lkZWQgKi8KKyNkZWZpbmUgRURFQURMSwkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHgxMDAwMDAwMCApCisKKy8qKiBEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkICovCisjZGVmaW5lIEVERVNUQUREUlJFUQkgICAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0JBRF9GVU5DIHwgMHgxMTAwMDAwMCApCisKKy8qKiBEb21haW4gZXJyb3IgKi8KKyNkZWZpbmUgRURPTQkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHgxMjAwMDAwMCApCisKKy8qKiBSZXNlcnZlZCAqLworI2RlZmluZSBFRFFVT1QJCQkoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfRkFJTFVSRSB8IDB4MTMwMDAwMDAgKQorCisvKiogRmlsZSBleGlzdHMgKi8KKyNkZWZpbmUgRUVYSVNUCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDE0MDAwMDAwICkKKworLyoqIEJhZCBhZGRyZXNzICovCisjZGVmaW5lIEVGQVVMVAkJICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfTUNPUFlfUFJPQkxFTSB8IDB4MTUwMDAwMDAgKQorCisvKiogRmlsZSB0b28gbGFyZ2UgKi8KKyNkZWZpbmUgRUZCSUcJCSAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX01DT1BZX1BST0JMRU0gfCAweDE2MDAwMDAwICkKKworLyoqIEhvc3QgaXMgdW5yZWFjaGFibGUgKi8KKyNkZWZpbmUgRUhPU1RVTlJFQUNICSAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfQVJQX1RJTUVPVVQgfCAweDE3MDAwMDAwICkKKworLyoqIElkZW50aWZpZXIgcmVtb3ZlZCAqLworI2RlZmluZSBFSURSTQkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHgxODAwMDAwMCApCisKKy8qKiBJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgRUlMU0VRCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDE5MDAwMDAwICkKKworLyoqIE9wZXJhdGlvbiBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBFSU5QUk9HUkVTUwkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDFhMDAwMDAwICkKKworLyoqIEludGVycnVwdGVkIGZ1bmN0aW9uIGNhbGwgKi8KKyNkZWZpbmUgRUlOVFIJCQkoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfRkFJTFVSRSB8IDB4MWIwMDAwMDAgKQorCisvKiogSW52YWxpZCBhcmd1bWVudCAqLworI2RlZmluZSBFSU5WQUwJCSAgICAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfQkFEX0ZVTkMgfCAweDFjMDAwMDAwICkKKworLyoqIElucHV0L291dHB1dCBlcnJvciAqLworI2RlZmluZSBFSU8gXAorICAgICAgICggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19URlRQX0NBTk5PVF9SRUFEX0ZST01fQ09OTkVDVElPTiB8IDB4MWQwMDAwMDAgKQorCisvKiogU29ja2V0IGlzIGNvbm5lY3RlZCAqLworI2RlZmluZSBFSVNDT05OCQkgICAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1VEUF9PUEVOIHwgMHgxZTAwMDAwMCApCisKKy8qKiBJcyBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBFSVNESVIJCQkoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfRkFJTFVSRSB8IDB4MWYwMDAwMDAgKQorCisvKiogVG9vIG1hbnkgbGV2ZWxzIG9mIHN5bWJvbGljIGxpbmtzICovCisjZGVmaW5lIEVMT09QCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDIwMDAwMDAwICkKKworLyoqIFRvbyBtYW55IG9wZW4gZmlsZXMgKi8KKyNkZWZpbmUgRU1GSUxFCSAgICAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfT1VUX09GX1JFU09VUkNFUyB8IDB4MjEwMDAwMDAgKQorCisvKiogVG9vIG1hbnkgbGlua3MgKi8KKyNkZWZpbmUgRU1MSU5LCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDIyMDAwMDAwICkKKworLyoqIEluYXBwcm9wcmlhdGUgbWVzc2FnZSBidWZmZXIgbGVuZ3RoICovCisjZGVmaW5lIEVNU0dTSVpFCSAgICAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfQkFEX0ZVTkMgfCAweDIzMDAwMDAwICkKKworLyoqIFJlc2VydmVkICovCisjZGVmaW5lIEVNVUxUSUhPUAkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDI0MDAwMDAwICkKKworLyoqIEZpbGVuYW1lIHRvbyBsb25nICovCisjZGVmaW5lIEVOQU1FVE9PTE9ORwkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDI1MDAwMDAwICkKKworLyoqIE5ldHdvcmsgaXMgZG93biAqLworI2RlZmluZSBFTkVURE9XTgkgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0FSUF9USU1FT1VUIHwgMHgyNjAwMDAwMCApCisKKy8qKiBDb25uZWN0aW9uIGFib3J0ZWQgYnkgbmV0d29yayAqLworI2RlZmluZSBFTkVUUkVTRVQJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHgyNzAwMDAwMCApCisKKy8qKiBOZXR3b3JrIHVucmVhY2hhYmxlICovCisjZGVmaW5lIEVORVRVTlJFQUNICSAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfQVJQX1RJTUVPVVQgfCAweDI4MDAwMDAwICkKKworLyoqIFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtICovCisjZGVmaW5lIEVORklMRQkgICAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX09VVF9PRl9SRVNPVVJDRVMgfCAweDI5MDAwMDAwICkKKworLyoqIE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgRU5PQlVGUwkgICAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX09VVF9PRl9SRVNPVVJDRVMgfCAweDJhMDAwMDAwICkKKworLyoqIE5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIG9uIHRoZSBTVFJFQU0gaGVhZCByZWFkIHF1ZXVlICovCisjZGVmaW5lIEVOT0RBVEEJCQkoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfRkFJTFVSRSB8IDB4MmIwMDAwMDAgKQorCisvKiogTm8gc3VjaCBkZXZpY2UgKi8KKyNkZWZpbmUgRU5PREVWCSAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfVEZUUF9GSUxFX05PVF9GT1VORCB8IDB4MmMwMDAwMDAgKQorCisvKiogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAqLworI2RlZmluZSBFTk9FTlQJICAgICggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19URlRQX0ZJTEVfTk9UX0ZPVU5EIHwgMHgyZDAwMDAwMCApCisKKy8qKiBFeGVjIGZvcm1hdCBlcnJvciAqLworI2RlZmluZSBFTk9FWEVDCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDJlMDAwMDAwICkKKworLyoqIE5vIGxvY2tzIGF2YWlsYWJsZSAqLworI2RlZmluZSBFTk9MQ0sJCQkoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfRkFJTFVSRSB8IDB4MmYwMDAwMDAgKQorCisvKiogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRU5PTElOSwkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHgzMDAwMDAwMCApCisKKy8qKiBOb3QgZW5vdWdoIHNwYWNlICovCisjZGVmaW5lIEVOT01FTQkgICAgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX09VVF9PRl9SRVNPVVJDRVMgfCAweDMxMDAwMDAwICkKKworLyoqIE5vIG1lc3NhZ2Ugb2YgdGhlIGRlc2lyZWQgdHlwZSAqLworI2RlZmluZSBFTk9NU0cJCQkoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfRkFJTFVSRSB8IDB4MzIwMDAwMDAgKQorCisvKiogUHJvdG9jb2wgbm90IGF2YWlsYWJsZSAqLworI2RlZmluZSBFTk9QUk9UT09QVAkgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1VOU1VQUE9SVEVEIHwgMHgzMzAwMDAwMCApCisKKy8qKiBObyBzcGFjZSBsZWZ0IG9uIGRldmljZSAqLworI2RlZmluZSBFTk9TUEMJICAgICAgICggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19PVVRfT0ZfUkVTT1VSQ0VTIHwgMHgzNDAwMDAwMCApCisKKy8qKiBObyBTVFJFQU0gcmVzb3VyY2VzICovCisjZGVmaW5lIEVOT1NSCSAgICAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfT1VUX09GX1JFU09VUkNFUyB8IDB4MzUwMDAwMDAgKQorCisvKiogTm90IGEgU1RSRUFNICovCisjZGVmaW5lIEVOT1NUUgkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHgzNjAwMDAwMCApCisKKy8qKiBGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgRU5PU1lTCQkgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1VOU1VQUE9SVEVEIHwgMHgzNzAwMDAwMCApCisKKy8qKiBUaGUgc29ja2V0IGlzIG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgRU5PVENPTk4JCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHgzODAwMDAwMCApCisKKy8qKiBOb3QgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRU5PVERJUgkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHgzOTAwMDAwMCApCisKKy8qKiBEaXJlY3Rvcnkgbm90IGVtcHR5ICovCisjZGVmaW5lIEVOT1RFTVBUWQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDNhMDAwMDAwICkKKworLyoqIE5vdCBhIHNvY2tldCAqLworI2RlZmluZSBFTk9UU09DSwkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDNiMDAwMDAwICkKKworLyoqIE5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRU5PVFNVUAkJICAgICggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19VTlNVUFBPUlRFRCB8IDB4M2MwMDAwMDAgKQorCisvKiogSW5hcHByb3ByaWF0ZSBJL08gY29udHJvbCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRU5PVFRZCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDNkMDAwMDAwICkKKworLyoqIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MgKi8KKyNkZWZpbmUgRU5YSU8JICAgICggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19URlRQX0ZJTEVfTk9UX0ZPVU5EIHwgMHgzZTAwMDAwMCApCisKKy8qKiBPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiBzb2NrZXQgKi8KKyNkZWZpbmUgRU9QTk9UU1VQUAkgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1VOU1VQUE9SVEVEIHwgMHgzZjAwMDAwMCApCisKKy8qKiBWYWx1ZSB0b28gbGFyZ2UgdG8gYmUgc3RvcmVkIGluIGRhdGEgdHlwZSAqLworI2RlZmluZSBFT1ZFUkZMT1cJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHg0MDAwMDAwMCApCisKKy8qKiBPcGVyYXRpb24gbm90IHBlcm1pdHRlZCAqLworI2RlZmluZSBFUEVSTQkgICggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19URlRQX0FDQ0VTU19WSU9MQVRJT04gfCAweDQxMDAwMDAwICkKKworLyoqIEJyb2tlbiBwaXBlICovCisjZGVmaW5lIEVQSVBFCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDQyMDAwMDAwICkKKworLyoqIFByb3RvY29sIGVycm9yICovCisjZGVmaW5lIEVQUk9UTwkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHg0MzAwMDAwMCApCisKKy8qKiBQcm90b2NvbCBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEVQUk9UT05PU1VQUE9SVAkgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1VOU1VQUE9SVEVEIHwgMHg0NDAwMDAwMCApCisKKy8qKiBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQgKi8KKyNkZWZpbmUgRVBST1RPVFlQRQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDQ1MDAwMDAwICkKKworLyoqIFJlc3VsdCB0b28gbGFyZ2UgKi8KKyNkZWZpbmUgRVJBTkdFCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDQ2MDAwMDAwICkKKworLyoqIFJlYWQtb25seSBmaWxlIHN5c3RlbSAqLworI2RlZmluZSBFUk9GUwkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHg0NzAwMDAwMCApCisKKy8qKiBJbnZhbGlkIHNlZWsgKi8KKyNkZWZpbmUgRVNQSVBFCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDQ4MDAwMDAwICkKKworLyoqIE5vIHN1Y2ggcHJvY2VzcyAqLworI2RlZmluZSBFU1JDSAkgICAgKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX1RGVFBfRklMRV9OT1RfRk9VTkQgfCAweDQ5MDAwMDAwICkKKworLyoqIFN0YWxlIGZpbGUgaGFuZGxlICovCisjZGVmaW5lIEVTVEFMRQkJCSggRVJSRklMRSB8IFBYRU5WX1NUQVRVU19GQUlMVVJFIHwgMHg0YTAwMDAwMCApCisKKy8qKiBTVFJFQU0gaW9jdGwoKSB0aW1lb3V0ICovCisjZGVmaW5lIEVUSU1FCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDRiMDAwMDAwICkKKworLyoqIE9wZXJhdGlvbiB0aW1lZCBvdXQgKi8KKyNkZWZpbmUgRVRJTUVET1VUICAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfVEZUUF9SRUFEX1RJTUVPVVQgfCAweDRjMDAwMDAwICkKKworLyoqIFRleHQgZmlsZSBidXN5ICovCisjZGVmaW5lIEVUWFRCU1kJCQkoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfRkFJTFVSRSB8IDB4NGQwMDAwMDAgKQorCisvKiogT3BlcmF0aW9uIHdvdWxkIGJsb2NrIChkaWZmZXJlbnQgZnJvbSBFQUdBSU4hKSAqLworI2RlZmluZSBFV09VTERCTE9DSwkgICAgICAoIEVSUkZJTEUgfCBQWEVOVl9TVEFUVVNfVEZUUF9PUEVOIHwgMHg0ZTAwMDAwMCApCisKKy8qKiBJbXByb3BlciBsaW5rICovCisjZGVmaW5lIEVYREVWCQkJKCBFUlJGSUxFIHwgUFhFTlZfU1RBVFVTX0ZBSUxVUkUgfCAweDRmMDAwMDAwICkKKworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIGV1bmlxIFBlci1maWxlIGVycm9yIGRpc2FtYmlndWF0b3JzCisgKgorICogRmlsZXMgd2hpY2ggdXNlIHRoZSBzYW1lIGVycm9yIG51bWJlciBtdWx0aXBsZSB0aW1lcyBzaG91bGQKKyAqIHByb2JhYmx5IGRlZmluZSB0aGVpciBvd24gZXJyb3Igc3Vic3BhY2UgdXNpbmcgdGhlc2UKKyAqIGRpc2FtYmlndWF0b3JzLiAgRm9yIGV4YW1wbGU6CisgKgorICogICAgICNkZWZpbmUgRVRDUF9IRUFERVJfVE9PX1NIT1JUCUVVTklRXzAxCisgKiAgICAgI2RlZmluZSBFVENQX0JBRF9DSEVDS1NVTQlFVU5JUV8wMgorICoKKyAqIEB7CisgKi8KKworI2RlZmluZSBFVU5JUV8wMQkweDAwMDAwMTAwCisjZGVmaW5lIEVVTklRXzAyCTB4MDAwMDAyMDAKKyNkZWZpbmUgRVVOSVFfMDMJMHgwMDAwMDMwMAorI2RlZmluZSBFVU5JUV8wNAkweDAwMDAwNDAwCisjZGVmaW5lIEVVTklRXzA1CTB4MDAwMDA1MDAKKyNkZWZpbmUgRVVOSVFfMDYJMHgwMDAwMDYwMAorI2RlZmluZSBFVU5JUV8wNwkweDAwMDAwNzAwCisjZGVmaW5lIEVVTklRXzA4CTB4MDAwMDA4MDAKKyNkZWZpbmUgRVVOSVFfMDkJMHgwMDAwMDkwMAorI2RlZmluZSBFVU5JUV8wQQkweDAwMDAwYTAwCisjZGVmaW5lIEVVTklRXzBCCTB4MDAwMDBiMDAKKyNkZWZpbmUgRVVOSVFfMEMJMHgwMDAwMGMwMAorI2RlZmluZSBFVU5JUV8wRAkweDAwMDAwZDAwCisjZGVmaW5lIEVVTklRXzBFCTB4MDAwMDBlMDAKKyNkZWZpbmUgRVVOSVFfMEYJMHgwMDAwMGYwMAorI2RlZmluZSBFVU5JUV8xMAkweDAwMDAxMDAwCisjZGVmaW5lIEVVTklRXzExCTB4MDAwMDExMDAKKyNkZWZpbmUgRVVOSVFfMTIJMHgwMDAwMTIwMAorI2RlZmluZSBFVU5JUV8xMwkweDAwMDAxMzAwCisjZGVmaW5lIEVVTklRXzE0CTB4MDAwMDE0MDAKKyNkZWZpbmUgRVVOSVFfMTUJMHgwMDAwMTUwMAorI2RlZmluZSBFVU5JUV8xNgkweDAwMDAxNjAwCisjZGVmaW5lIEVVTklRXzE3CTB4MDAwMDE3MDAKKyNkZWZpbmUgRVVOSVFfMTgJMHgwMDAwMTgwMAorI2RlZmluZSBFVU5JUV8xOQkweDAwMDAxOTAwCisjZGVmaW5lIEVVTklRXzFBCTB4MDAwMDFhMDAKKyNkZWZpbmUgRVVOSVFfMUIJMHgwMDAwMWIwMAorI2RlZmluZSBFVU5JUV8xQwkweDAwMDAxYzAwCisjZGVmaW5lIEVVTklRXzFECTB4MDAwMDFkMDAKKyNkZWZpbmUgRVVOSVFfMUUJMHgwMDAwMWUwMAorI2RlZmluZSBFVU5JUV8xRgkweDAwMDAxZjAwCisKKy8qKiBAfSAqLworCitleHRlcm4gaW50IGVycm5vOworCisjZW5kaWYgLyogRVJSTk9fSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ldGhlcmJvb3QuaCBiL2dweGUvc3JjL2luY2x1ZGUvZXRoZXJib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0NGU4YQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZXRoZXJib290LmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBFVEhFUkJPT1RfSAorI2RlZmluZSBFVEhFUkJPT1RfSAorCisvKgorICogU3RhbmRhcmQgaW5jbHVkZXMgdGhhdCB3ZSBhbHdheXMgd2FudAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorI2luY2x1ZGUgPGdweGUvaWZfYXJwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQWRkcmVzczsKKworLyoKKyAqIElNUE9SVEFOVCEhISEhISEhISEhISEhCisgKgorICogRXZlcnl0aGluZyBiZWxvdyB0aGlzIHBvaW50IGlzIGNydWZ0IGxlZnQgb3ZlciBmcm9tIG9sZGVyIHZlcnNpb25zCisgKiBvZiBFdGhlcmJvb3QuICBEbyBub3QgYWRkICphbnl0aGluZyogYmVsb3cgdGhpcyBwb2ludC4gIFRoaW5ncyBhcmUKKyAqIGdyYWR1YWxseSBiZWluZyBtb3ZlZCB0byBpbmRpdmlkdWFsIGhlYWRlciBmaWxlcy4KKyAqCisgKi8KKworLyogTGluayBjb25maWd1cmF0aW9uIHRpbWUgaW4gdGVudGhzIG9mIGEgc2Vjb25kICovCisjaWZuZGVmIFZBTElEX0xJTktfVElNRU9VVAorI2RlZmluZSBWQUxJRF9MSU5LX1RJTUVPVVQJMTAwIC8qIDEwLjAgc2Vjb25kcyAqLworI2VuZGlmCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLworCisjZW5kaWYgLyogRVRIRVJCT09UX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZnMuaCBiL2dweGUvc3JjL2luY2x1ZGUvZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGZlOGZkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9mcy5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgRlNfSAorI2RlZmluZSBGU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy90eXBlZGVmIHVpbnQ2NF90IHNlY3Rvcl90OworCisjaWZkZWYgSURFX0RJU0sKK2ludCBpZGVfcHJvYmUoaW50IGRyaXZlKTsKK2ludCBpZGVfcmVhZChpbnQgZHJpdmUsIHNlY3Rvcl90IHNlY3Rvciwgdm9pZCAqYnVmZmVyKTsKKyNlbmRpZgorCisjaWZkZWYgVVNCX0RJU0sKK2ludCB1c2JfcHJvYmUoaW50IGRyaXZlKTsKK2ludCB1c2JfcmVhZChpbnQgZHJpdmUsIHNlY3Rvcl90IHNlY3Rvciwgdm9pZCAqYnVmZmVyKTsKKyNlbmRpZgorCisjZGVmaW5lIERJU0tfSURFIDEKKyNkZWZpbmUgRElTS19NRU0gMgorI2RlZmluZSBESVNLX1VTQiAzCisKK2ludCBkZXZvcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqcmVvcGVuKTsKK2ludCBkZXZyZWFkKHVuc2lnbmVkIGxvbmcgc2VjdG9yLCB1bnNpZ25lZCBsb25nIGJ5dGVfb2Zmc2V0LAorCXVuc2lnbmVkIGxvbmcgYnl0ZV9sZW4sIHZvaWQgKmJ1Zik7CisKK2ludCBmaWxlX29wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpOworaW50IGZpbGVfcmVhZCh2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK2ludCBmaWxlX3NlZWsodW5zaWduZWQgbG9uZyBvZmZzZXQpOwordW5zaWduZWQgbG9uZyBmaWxlX3NpemUodm9pZCk7CisKKyNkZWZpbmUgUEFSVElUSU9OX1VOS05PV04gMHhiYWQ2YTcKKworI2lmZGVmIEVMVE9SSVRPCitpbnQgb3Blbl9lbHRvcml0b19pbWFnZShpbnQgcGFydCwgdW5zaWduZWQgbG9uZyAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgKmxlbmd0aCk7CisjZWxzZQorIyBkZWZpbmUgb3Blbl9lbHRvcml0b19pbWFnZSh4LHkseikgUEFSVElUSU9OX1VOS05PV04KKyNlbmRpZgorCitleHRlcm4gaW50IHVzaW5nX2RldnNpemU7CisKKyNlbmRpZiAvKiBGU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dldG9wdC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9nZXRvcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmU0MzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9nZXRvcHQuaApAQCAtMCwwICsxLDk0IEBACisjaWZuZGVmIF9HRVRPUFRfSAorI2RlZmluZSBfR0VUT1BUX0gKKworLyoqIEBmaWxlCisgKgorICogUGFyc2UgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2VudW0gZ2V0b3B0X2FyZ3VtZW50X3JlcXVpcmVtZW50IHsKKwkvKiogT3B0aW9uIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnQgKi8KKwlub19hcmd1bWVudCA9IDAsCisJLyoqIE9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAqLworCXJlcXVpcmVkX2FyZ3VtZW50ID0gMSwKKwkvKiogT3B0aW9uIG1heSBoYXZlIGFuIGFyZ3VtZW50ICovCisJb3B0aW9uYWxfYXJndW1lbnQgPSAyLAorfTsKKworLyoqIEEgbG9uZyBvcHRpb24sIGFzIHVzZWQgZm9yIGdldG9wdF9sb25nKCkgKi8KK3N0cnVjdCBvcHRpb24geworCS8qKiBMb25nIG5hbWUgb2YgdGhpcyBvcHRpb24gKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKiBPcHRpb24gdGFrZXMgYW4gYXJndW1lbnQKKwkgKgorCSAqIE11c3QgYmUgb25lIG9mIEBjIG5vX2FyZ3VtZW50LCBAYyByZXF1aXJlZF9hcmd1bWVudCwgb3IgQGMKKwkgKiBvcHRpb25hbF9hcmd1bWVudC4KKwkgKi8KKwlpbnQgaGFzX2FyZzsKKwkvKiogTG9jYXRpb24gaW50byB3aGljaCB0byBzdG9yZSBAYyB2YWwsIG9yIE5VTEwuCisJICoKKwkgKiBTZWUgdGhlIGRlc2NyaXB0aW9uIGZvciBAYyB2YWwgZm9yIG1vcmUgZGV0YWlscy4KKwkgKi8KKwlpbnQgKmZsYWc7CisJLyoqIFZhbHVlIHRvIHJldHVybgorCSAqCisJICogSWYgQGMgZmxhZyBpcyBOVUxMLCB0aGVuIHRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZQorCSAqIHJldHVybmVkIGJ5IGdldG9wdF9sb25nKCkgd2hlbiB0aGlzIG9wdGlvbiBpcyBmb3VuZCwgYW5kCisJICogc2hvdWxkIHRoZXJlZm9yZSBiZSBzZXQgdG8gdGhlIGVxdWl2YWxlbnQgc2hvcnQgb3B0aW9uCisJICogY2hhcmFjdGVyLgorCSAqCisJICogSWYgQGMgZmxhZyBpcyBub24tTlVMTCwgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgd3JpdHRlbiB0bworCSAqIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IEBmbGFnLCBhbmQgZ2V0b3B0X2xvbmcoKSB3aWxsCisJICogcmV0dXJuIDAuCisJICovCisJaW50IHZhbDsKK307CisKK2V4dGVybiBjaGFyICpvcHRhcmc7CitleHRlcm4gaW50IG9wdGluZDsKK2V4dGVybiBpbnQgbmV4dGNoYXI7CitleHRlcm4gaW50IG9wdG9wdDsKKworZXh0ZXJuIGludCBnZXRvcHRfbG9uZyAoIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBjb25zdCBjaGFyICpvcHRzdHJpbmcsCisJCQkgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZGV4ICk7CisKKy8qKgorICogUGFyc2UgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAqCisgKiBAdiBhcmd2CQlBcmd1bWVudCBjb3VudAorICogQHYgYXJndgkJQXJndW1lbnQgbGlzdAorICogQHYgb3B0c3RyaW5nCQlPcHRpb24gc3BlY2lmaWNhdGlvbiBzdHJpbmcKKyAqIEByZXQgb3B0aW9uCQlPcHRpb24gZm91bmQsIG9yIC0xIGZvciBubyBtb3JlIG9wdGlvbnMKKyAqCisgKiBTZWUgZ2V0b3B0X2xvbmcoKSBmb3IgZnVsbCBkZXRhaWxzLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRvcHQgKCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwKKwkJCSAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZyApIHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBub19vcHRpb25zW10gPSB7CisJCXsgTlVMTCwgMCwgTlVMTCwgMCB9CisJfTsKKwlyZXR1cm4gZ2V0b3B0X2xvbmcgKCBhcmdjLCBhcmd2LCBvcHRzdHJpbmcsIG5vX29wdGlvbnMsIE5VTEwgKTsKK30KKworLyoqCisgKiBSZXNldCBnZXRvcHQoKSBpbnRlcm5hbCBzdGF0ZQorICoKKyAqIER1ZSB0byBhIGxpbWl0YXRpb24gb2YgdGhlIFBPU0lYIGdldG9wdCgpIEFQSSwgaXQgaXMgbmVjZXNzYXJ5IHRvCisgKiBhZGQgYSBjYWxsIHRvIHJlc2V0X2dldG9wdCgpIGJlZm9yZSBlYWNoIHNldCBvZiBjYWxscyB0byBnZXRvcHQoKQorICogb3IgZ2V0b3B0X2xvbmcoKS4gIFRoaXMgYXJpc2VzIGJlY2F1c2UgUE9TSVggYXNzdW1lcyB0aGF0IGVhY2gKKyAqIHByb2Nlc3Mgd2lsbCBwYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIG5vIG1vcmUgdGhhbiBvbmNlOyB0aGlzCisgKiBhc3N1bXB0aW9uIGlzIG5vdCB2YWxpZCB3aXRoaW4gRXRoZXJib290LiAgV2Ugd29yayBhcm91bmQgdGhlCisgKiBsaW1pdGF0aW9uIGJ5IGFycmFuZ2luZyBmb3IgZXhlY3YoKSB0byBjYWxsIHJlc2V0X2dldG9wdCgpIGJlZm9yZQorICogZXhlY3V0aW5nIHRoZSBjb21tYW5kLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfZ2V0b3B0ICggdm9pZCApIHsKKwlvcHRpbmQgPSAxOworCW5leHRjaGFyID0gMDsKK30KKworI2VuZGlmIC8qIF9HRVRPUFRfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2FjcGkuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hY3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlZGRhOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hY3BpLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBfR1BYRV9BQ1BJX0gKKyNkZWZpbmUgX0dQWEVfQUNQSV9ICisKKy8qKiBAZmlsZQorICoKKyAqIEFDUEkgZGF0YSBzdHJ1Y3R1cmVzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIEFuIEFDUEkgZGVzY3JpcHRpb24gaGVhZGVyCisgKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGNvbW1vbiB0byB0aGUgc3RhcnQgb2YgYWxsIEFDUEkgc3lzdGVtCisgKiBkZXNjcmlwdGlvbiB0YWJsZXMuCisgKi8KK3N0cnVjdCBhY3BpX2Rlc2NyaXB0aW9uX2hlYWRlciB7CisJLyoqIEFDUEkgc2lnbmF0dXJlICg0IEFTQ0lJIGNoYXJhY3RlcnMpICovCisJY2hhciBzaWduYXR1cmVbNF07CisJLyoqIExlbmd0aCBvZiB0YWJsZSwgaW4gYnl0ZXMsIGluY2x1ZGluZyBoZWFkZXIgKi8KKwl1aW50MzJfdCBsZW5ndGg7CisJLyoqIEFDUEkgU3BlY2lmaWNhdGlvbiBtaW5vciB2ZXJzaW9uIG51bWJlciAqLworCXVpbnQ4X3QgcmV2aXNpb247CisJLyoqIFRvIG1ha2Ugc3VtIG9mIGVudGlyZSB0YWJsZSA9PSAwICovCisJdWludDhfdCBjaGVja3N1bTsKKwkvKiogT0VNIGlkZW50aWZpY2F0aW9uICovCisJY2hhciBvZW1faWRbNl07CisJLyoqIE9FTSB0YWJsZSBpZGVudGlmaWNhdGlvbiAqLworCWNoYXIgb2VtX3RhYmxlX2lkWzhdOworCS8qKiBPRU0gcmV2aXNpb24gbnVtYmVyICovCisJdWludDMyX3Qgb2VtX3JldmlzaW9uOworCS8qKiBBU0wgY29tcGlsZXIgdmVuZG9yIElEICovCisJY2hhciBhc2xfY29tcGlsZXJfaWRbNF07CisJLyoqIEFTTCBjb21waWxlciByZXZpc2lvbiBudW1iZXIgKi8KKwl1aW50MzJfdCBhc2xfY29tcGlsZXJfcmV2aXNpb247Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCitleHRlcm4gdm9pZCBhY3BpX2ZpeF9jaGVja3N1bSAoIHN0cnVjdCBhY3BpX2Rlc2NyaXB0aW9uX2hlYWRlciAqYWNwaSApOworCisjZW5kaWYgLyogX0dQWEVfQUNQSV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYWVzLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxNjk0YgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hZXMuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9HUFhFX0FFU19ICisjZGVmaW5lIF9HUFhFX0FFU19ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RydWN0IGNpcGhlcl9hbGdvcml0aG07CisKKy8qKiBCYXNpYyBBRVMgYmxvY2tzaXplICovCisjZGVmaW5lIEFFU19CTE9DS1NJWkUgMTYKKworI2luY2x1ZGUgImNyeXB0by9heHRscy9jcnlwdG8uaCIKKworLyoqIEFFUyBjb250ZXh0ICovCitzdHJ1Y3QgYWVzX2NvbnRleHQgeworCS8qKiBBRVMgY29udGV4dCBmb3IgQVhUTFMgKi8KKwlBRVNfQ1RYIGF4dGxzX2N0eDsKKwkvKiogQ2lwaGVyIGlzIGJlaW5nIHVzZWQgZm9yIGRlY3J5cHRpbmcgKi8KKwlpbnQgZGVjcnlwdGluZzsKK307CisKKy8qKiBBRVMgY29udGV4dCBzaXplICovCisjZGVmaW5lIEFFU19DVFhfU0laRSBzaXplb2YgKCBzdHJ1Y3QgYWVzX2NvbnRleHQgKQorCitleHRlcm4gc3RydWN0IGNpcGhlcl9hbGdvcml0aG0gYWVzX2FsZ29yaXRobTsKK2V4dGVybiBzdHJ1Y3QgY2lwaGVyX2FsZ29yaXRobSBhZXNfY2JjX2FsZ29yaXRobTsKKworaW50IGFlc193cmFwICggY29uc3Qgdm9pZCAqa2VrLCBjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRlc3QsIGludCBuYmxrICk7CitpbnQgYWVzX3Vud3JhcCAoIGNvbnN0IHZvaWQgKmtlaywgY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkZXN0LCBpbnQgbmJsayApOworCisjZW5kaWYgLyogX0dQWEVfQUVTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hbnNpZXNjLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYW5zaWVzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjdhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYW5zaWVzYy5oCkBAIC0wLDAgKzEsMTIwIEBACisjaWZuZGVmIF9HUFhFX0FOU0lFU0NfSAorI2RlZmluZSBfR1BYRV9BTlNJRVNDX0gKKworLyoqIEBmaWxlCisgKgorICogQU5TSSBlc2NhcGUgc2VxdWVuY2VzCisgKgorICogQU5TSSBYMy42NCAoYWthIEVDTUEtNDggb3IgSVNPL0lFQyA2NDI5LCBhdmFpbGFibGUgZnJvbQorICogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VjbWEtMDQ4LnBkZikKKyAqIGRlZmluZXMgZXNjYXBlIHNlcXVlbmNlcyBjb25zaXN0aW5nIG9mOgorICoKKyAqICAgICBBIENvbnRyb2wgU2VxdWVuY2UgSW50cm9kdWNlciAoQ1NJKQorICoKKyAqICAgICBaZXJvIG9yIG1vcmUgUGFyYW1ldGVyIEJ5dGVzIChQKQorICoKKyAqICAgICBaZXJvIG9yIG1vcmUgSW50ZXJtZWRpYXRlIEJ5dGVzIChJKQorICoKKyAqICAgICBBIEZpbmFsIEJ5dGUgKEYpCisgKgorICogVGhlIENTSSBjb25zaXN0cyBvZiBFU0MgKDB4MWIpIGZvbGxvd2VkIGJ5ICJbIiAoMHg1YikuICBUaGUKKyAqIFBhcmFtZXRlciBCeXRlcywgZm9yIGEgc3RhbmRhcmRpc2VkIChpLmUuIG5vdCBwcml2YXRlIG9yCisgKiBleHBlcmltZW50YWwpIHNlcXVlbmNlLCBjb25zaXN0IG9mIGEgbGlzdCBvZiBBU0NJSSBkZWNpbWFsIGludGVnZXJzCisgKiBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucy4gIFRoZSBJbnRlcm1lZGlhdGUgQnl0ZXMgKGluIHRoZSByYW5nZSAweDIwCisgKiB0byAweDJmKSBhbmQgdGhlIEZpbmFsIEJ5dGUgKGluIHRoZSByYW5nZSAweDQwIHRvIDB4NGYpIGRldGVybWluZQorICogdGhlIGNvbnRyb2wgZnVuY3Rpb24uCisgKiAKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKiBBIGhhbmRsZXIgZm9yIGFuIGVzY2FwZSBzZXF1ZW5jZSAqLworc3RydWN0IGFuc2llc2NfaGFuZGxlciB7CisJLyoqIFRoZSBjb250cm9sIGZ1bmN0aW9uIGlkZW50aWZpZXIKKwkgKgorCSAqIFRoZSBjb250cm9sIGZ1bmN0aW9uIGlkZW50aWZpZXIgY29uc2lzdHMgb2YgdGhlCisJICogSW50ZXJtZWRpYXRlIEJ5dGVzIChpZiBhbnkpIGFuZCB0aGUgRmluYWwgQnl0ZS4gIEluCisJICogcHJhY3RpY2UsIG5vIG1vcmUgdGhhbiBvbmUgaW1tZWRpYXRlIGJ5dGUgaXMgZXZlciB1c2VkLCBzbworCSAqIHRoZSBieXRlIGNvbWJpbmF0aW9uIGNhbiBiZSBlZmZpY2llbnRseSBleHByZXNzZWQgYXMgYQorCSAqIHNpbmdsZSBpbnRlZ2VyLCBpbiB0aGUgb2J2aW91cyB3YXkgKHdpdGggdGhlIEZpbmFsIEJ5dGUKKwkgKiBiZWluZyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSkuCisJICovCisJdW5zaWduZWQgaW50IGZ1bmN0aW9uOworCS8qKiBIYW5kbGUgZXNjYXBlIHNlcXVlbmNlCisJICoKKwkgKiBAdiBjb3VudAkJUGFyYW1ldGVyIGNvdW50CisJICogQHYgcGFyYW1zCQlQYXJhbWV0ZXIgbGlzdAorCSAqCisJICogQSBuZWdhdGl2ZSBwYXJhbWV0ZXIgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcmFtZXRlciB3YXMKKwkgKiBvbWl0dGVkIGFuZCB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGNvbnRyb2wKKwkgKiBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4KKwkgKgorCSAqIFNpbmNlIGFsbCBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCwgdGhlcmUgaXMgbm8gd2F5IHRvCisJICogZGlzdGluZ3Vpc2ggYmV0d2VlbiAiemVybyBwYXJhbWV0ZXJzIiBhbmQgInNpbmdsZSBwYXJhbWV0ZXIKKwkgKiBvbWl0dGVkIi4gIENvbnNlcXVlbnRseSwgdGhlIHBhcmFtZXRlciBsaXN0IHdpbGwgYWx3YXlzCisJICogY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbS4KKwkgKi8KKwl2b2lkICggKiBoYW5kbGUgKSAoIHVuc2lnbmVkIGludCBjb3VudCwgaW50IHBhcmFtc1tdICk7Cit9OworCisvKiogTWF4aW11bSBudW1iZXIgb2YgcGFyYW1ldGVycyB3aXRoaW4gYSBzaW5nbGUgZXNjYXBlIHNlcXVlbmNlICovCisjZGVmaW5lIEFOU0lFU0NfTUFYX1BBUkFNUyA0CisKKy8qKgorICogQU5TSSBlc2NhcGUgc2VxdWVuY2UgY29udGV4dAorICoKKyAqIFRoaXMgcHJvdmlkZXMgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHByb2Nlc3NpbmcgZXNjYXBlIHNlcXVlbmNlcywKKyAqIGFuZCBwb2ludHMgdG8gdGhlIGxpc3Qgb2YgZXNjYXBlIHNlcXVlbmNlIGhhbmRsZXJzLgorICovCitzdHJ1Y3QgYW5zaWVzY19jb250ZXh0IHsKKwkvKiogQXJyYXkgb2YgaGFuZGxlcnMKKwkgKgorCSAqIE11c3QgYmUgdGVybWluYXRlZCBieSBhIGhhbmRsZXIgd2l0aCBAYyBmdW5jdGlvbiBzZXQgdG8KKwkgKiB6ZXJvLgorCSAqLworCXN0cnVjdCBhbnNpZXNjX2hhbmRsZXIgKmhhbmRsZXJzOworCS8qKiBQYXJhbWV0ZXIgY291bnQKKwkgKgorCSAqIFdpbGwgYmUgemVybyB3aGVuIG5vdCBjdXJyZW50bHkgaW4gYW4gZXNjYXBlIHNlcXVlbmNlLgorCSAqLworCXVuc2lnbmVkIGludCBjb3VudDsKKwkvKiogUGFyYW1ldGVyIGxpc3QgKi8gCisJaW50IHBhcmFtc1tBTlNJRVNDX01BWF9QQVJBTVNdOworCS8qKiBDb250cm9sIGZ1bmN0aW9uIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb247Cit9OworCisvKiogRXNjYXBlIGNoYXJhY3RlciAqLworI2RlZmluZSBFU0MgMHgxYgorCisvKiogQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyICovCisjZGVmaW5lIENTSSAiXDAzM1siCisKKy8qKgorICogQGRlZmdyb3VwIGFuc2lmdW5jcyBBTlNJIGVzY2FwZSBzZXF1ZW5jZSBmdW5jdGlvbiBpZGVudGlmaWVycworICogQHsKKyAqLworCisvKiogQ3Vyc29yIHBvc2l0aW9uICovCisjZGVmaW5lIEFOU0lFU0NfQ1VQICdIJworCisvKiogRXJhc2UgaW4gcGFnZSAqLworI2RlZmluZSBBTlNJRVNDX0VEICdKJworCisvKiogRXJhc2UgZnJvbSBjdXJzb3IgdG8gZW5kIG9mIHBhZ2UgKi8KKyNkZWZpbmUgQU5TSUVTQ19FRF9UT19FTkQgMAorCisvKiogRXJhc2UgZnJvbSBzdGFydCBvZiBwYWdlIHRvIGN1cnNvciAqLworI2RlZmluZSBBTlNJRVNDX0VEX0ZST01fU1RBUlQgMQorCisvKiogRXJhc2Ugd2hvbGUgcGFnZSAqLworI2RlZmluZSBBTlNJRVNDX0VEX0FMTCAyCisKKy8qKiBTZWxlY3QgZ3JhcGhpYyByZW5kaXRpb24gKi8KKyNkZWZpbmUgQU5TSUVTQ19TR1IgJ20nCisKKy8qKiBAfSAqLworCitleHRlcm4gaW50IGFuc2llc2NfcHJvY2VzcyAoIHN0cnVjdCBhbnNpZXNjX2NvbnRleHQgKmN0eCwgaW50IGMgKTsKKworI2VuZGlmIC8qIF9HUFhFX0FOU0lFU0NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2FvZS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2FvZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDJmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYW9lLmgKQEAgLTAsMCArMSwxNTAgQEAKKyNpZm5kZWYgX0dQWEVfQU9FX0gKKyNkZWZpbmUgX0dQWEVfQU9FX0gKKworLyoqIEBmaWxlCisgKgorICogQW9FIHByb3RvY29sCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL3JldHJ5Lmg+CisjaW5jbHVkZSA8Z3B4ZS9hdGEuaD4KKworLyoqIEFuIEFvRSBjb25maWcgY29tbWFuZCAqLworc3RydWN0IGFvZWNmZyB7CisJLyoqIEFvRSBRdWV1ZSBkZXB0aCAqLworCXVpbnQxNl90IGJ1ZmNudDsKKwkvKiogQVRBIHRhcmdldCBmaXJtd2FyZSB2ZXJzaW9uICovCisJdWludDE2X3QgZnd2ZXI7CisJLyoqIEFUQSB0YXJnZXQgc2VjdG9yIGNvdW50ICovCisJdWludDhfdCBzY250OworCS8qKiBBb0UgY29uZmlnIHN0cmluZyBzdWJjb21tYW5kICovCisJdWludDhfdCBhb2VjY21kOworCS8qKiBBb0UgY29uZmlnIHN0cmluZyBsZW5ndGggKi8KKwl1aW50MTZfdCBjZmdsZW47CisJLyoqIEFvRSBjb25maWcgc3RyaW5nICovCisJdWludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEFuIEFvRSBBVEEgY29tbWFuZCAqLworc3RydWN0IGFvZWF0YSB7CisJLyoqIEFvRSBjb21tYW5kIGZsYWdzICovCisJdWludDhfdCBhZmxhZ3M7CisJLyoqIEFUQSBlcnJvci9mZWF0dXJlIHJlZ2lzdGVyICovCisJdWludDhfdCBlcnJfZmVhdDsKKwkvKiogQVRBIHNlY3RvciBjb3VudCByZWdpc3RlciAqLworCXVpbnQ4X3QgY291bnQ7CisJLyoqIEFUQSBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLworCXVpbnQ4X3QgY21kX3N0YXQ7CisJLyoqIExvZ2ljYWwgYmxvY2sgYWRkcmVzcywgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciAqLworCXVuaW9uIHsKKwkJdWludDY0X3QgdTY0OworCQl1aW50OF90IGJ5dGVzWzZdOworCX0gbGJhOworCS8qKiBEYXRhIHBheWxvYWQgKi8KKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisjZGVmaW5lIEFPRV9GTF9FWFRFTkRFRAkweDQwCS8qKjwgTEJBNDggZXh0ZW5kZWQgYWRkcmVzc2luZyAqLworI2RlZmluZSBBT0VfRkxfREVWX0hFQUQJMHgxMAkvKio8IERldmljZS9oZWFkIGZsYWcgKi8KKyNkZWZpbmUgQU9FX0ZMX0FTWU5DCTB4MDIJLyoqPCBBc3luY2hyb25vdXMgd3JpdGUgKi8KKyNkZWZpbmUgQU9FX0ZMX1dSSVRFCTB4MDEJLyoqPCBXcml0ZSBjb21tYW5kICovCisKKy8qKiBBbiBBb0UgY29tbWFuZCAqLwordW5pb24gYW9lY21kIHsKKwkvKiogQ29uZmlnIGNvbW1hbmQgKi8KKwlzdHJ1Y3QgYW9lY2ZnIGNmZzsKKwkvKiogQVRBIGNvbW1hbmQgKi8KKwlzdHJ1Y3QgYW9lYXRhIGF0YTsKK307CisKKy8qKiBBbiBBb0UgaGVhZGVyICovCitzdHJ1Y3QgYW9laGRyIHsKKwkvKiogUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgYW5kIGZsYWdzICovCisJdWludDhfdCB2ZXJfZmxhZ3M7CisJLyoqIEVycm9yIGNvZGUgKi8KKwl1aW50OF90IGVycm9yOworCS8qKiBNYWpvciBkZXZpY2UgbnVtYmVyLCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwl1aW50MTZfdCBtYWpvcjsKKwkvKiogTWlub3IgZGV2aWNlIG51bWJlciAqLworCXVpbnQ4X3QgbWlub3I7CisJLyoqIENvbW1hbmQgbnVtYmVyICovCisJdWludDhfdCBjb21tYW5kOworCS8qKiBUYWcsIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCXVpbnQzMl90IHRhZzsKKwkvKiogUGF5bG9hZCAqLworCXVuaW9uIGFvZWNtZCBjbWRbMF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisjZGVmaW5lIEFPRV9WRVJTSU9OCTB4MTAJLyoqPCBWZXJzaW9uIDEgKi8KKyNkZWZpbmUgQU9FX1ZFUlNJT05fTUFTSyAweGYwCS8qKjwgVmVyc2lvbiBwYXJ0IG9mIHZlcl9mbGFncyBmaWVsZCAqLworCisjZGVmaW5lIEFPRV9GTF9SRVNQT05TRQkweDA4CS8qKjwgTWVzc2FnZSBpcyBhIHJlc3BvbnNlICovCisjZGVmaW5lIEFPRV9GTF9FUlJPUgkweDA0CS8qKjwgQ29tbWFuZCBnZW5lcmF0ZWQgYW4gZXJyb3IgKi8KKworI2RlZmluZSBBT0VfTUFKT1JfQlJPQURDQVNUIDB4ZmZmZgorI2RlZmluZSBBT0VfTUlOT1JfQlJPQURDQVNUIDB4ZmYKKworI2RlZmluZSBBT0VfQ01EX0FUQQkweDAwCS8qKjwgSXNzdWUgQVRBIGNvbW1hbmQgKi8KKyNkZWZpbmUgQU9FX0NNRF9DT05GSUcJMHgwMQkvKio8IFF1ZXJ5IENvbmZpZyBJbmZvcm1hdGlvbiAqLworCisjZGVmaW5lIEFPRV9UQUdfTUFHSUMJMHhlYmViMDAwMAorCisjZGVmaW5lIEFPRV9FUlJfQkFEX0NPTU1BTkQJMSAvKio8IFVucmVjb2duaXNlZCBjb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUgQU9FX0VSUl9CQURfUEFSQU1FVEVSCTIgLyoqPCBCYWQgYXJndW1lbnQgcGFyYW1ldGVyICovCisjZGVmaW5lIEFPRV9FUlJfVU5BVkFJTEFCTEUJMyAvKio8IERldmljZSB1bmF2YWlsYWJsZSAqLworI2RlZmluZSBBT0VfRVJSX0NPTkZJR19FWElTVFMJNCAvKio8IENvbmZpZyBzdHJpbmcgcHJlc2VudCAqLworI2RlZmluZSBBT0VfRVJSX0JBRF9WRVJTSU9OCTUgLyoqPCBVbnN1cHBvcnRlZCB2ZXJzaW9uICovCisKKy8qKiBBbiBBb0Ugc2Vzc2lvbiAqLworc3RydWN0IGFvZV9zZXNzaW9uIHsKKwkvKiogUmVmZXJlbmNlIGNvdW50ZXIgKi8KKwlzdHJ1Y3QgcmVmY250IHJlZmNudDsKKworCS8qKiBMaXN0IG9mIGFsbCBBb0Ugc2Vzc2lvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiogTmV0d29yayBkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJLyoqIE1ham9yIG51bWJlciAqLworCXVpbnQxNl90IG1ham9yOworCS8qKiBNaW5vciBudW1iZXIgKi8KKwl1aW50OF90IG1pbm9yOworCS8qKiBUYXJnZXQgTUFDIGFkZHJlc3MgKi8KKwl1aW50OF90IHRhcmdldFtFVEhfQUxFTl07CisKKwkvKiogVGFnIGZvciBjdXJyZW50IEFvRSBjb21tYW5kICovCisJdWludDMyX3QgdGFnOworCisJLyoqIEN1cnJlbnQgQU9FIGNvbW1hbmQgKi8KKwl1aW50OF90IGFvZV9jbWRfdHlwZTsKKwkvKiogQ3VycmVudCBBVEEgY29tbWFuZCAqLworCXN0cnVjdCBhdGFfY29tbWFuZCAqY29tbWFuZDsKKwkvKiogT3ZlcmFsbCBzdGF0dXMgb2YgY3VycmVudCBBVEEgY29tbWFuZCAqLworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJLyoqIEJ5dGUgb2Zmc2V0IHdpdGhpbiBjb21tYW5kJ3MgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgY29tbWFuZF9vZmZzZXQ7CisJLyoqIFJldHVybiBzdGF0dXMgY29kZSBmb3IgY29tbWFuZCAqLworCWludCByYzsKKworCS8qKiBSZXRyYW5zbWlzc2lvbiB0aW1lciAqLworCXN0cnVjdCByZXRyeV90aW1lciB0aW1lcjsKK307CisKKyNkZWZpbmUgQU9FX1NUQVRVU19FUlJfTUFTSwkweDBmIC8qKjwgRXJyb3IgcG9ydGlvbiBvZiBzdGF0dXMgY29kZSAqLyAKKyNkZWZpbmUgQU9FX1NUQVRVU19QRU5ESU5HCTB4ODAgLyoqPCBDb21tYW5kIHBlbmRpbmcgKi8KKworLyoqIE1heGltdW0gbnVtYmVyIG9mIHNlY3RvcnMgcGVyIHBhY2tldCAqLworI2RlZmluZSBBT0VfTUFYX0NPVU5UIDIKKworZXh0ZXJuIHZvaWQgYW9lX2RldGFjaCAoIHN0cnVjdCBhdGFfZGV2aWNlICphdGEgKTsKK2V4dGVybiBpbnQgYW9lX2F0dGFjaCAoIHN0cnVjdCBhdGFfZGV2aWNlICphdGEsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQljb25zdCBjaGFyICpyb290X3BhdGggKTsKKworI2VuZGlmIC8qIF9HUFhFX0FPRV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYXBpLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyYmE1OQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hcGkuaApAQCAtMCwwICsxLDg0IEBACisjaWZuZGVmIF9HUFhFX0FQSV9ICisjZGVmaW5lIF9HUFhFX0FQSV9ICisKKy8qKiBAZmlsZQorICoKKyAqIGdQWEUgaW50ZXJuYWwgQVBJcworICoKKyAqIFRoZXJlIGFyZSB2YXJpb3VzIGZvcm1hbGx5LWRlZmluZWQgQVBJcyBpbnRlcm5hbCB0byBnUFhFLCB3aXRoCisgKiBzZXZlcmFsIGRpZmZlcmluZyBpbXBsZW1lbnRhdGlvbnMgc3BlY2lmaWMgdG8gcGFydGljdWxhciBleGVjdXRpb24KKyAqIGVudmlyb25tZW50cyAoZS5nLiBQQyBCSU9TLCBFRkksIExpbnV4QklPUykuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqIEBkZWZncm91cCBTaW5nbGUtaW1wbGVtZW50YXRpb24gQVBJcworICoKKyAqIFRoZXNlIGFyZSBBUElzIGZvciB3aGljaCBvbmx5IGEgc2luZ2xlIGltcGxlbWVudGF0aW9uIG1heSBiZQorICogY29tcGlsZWQgaW4gYXQgYW55IGdpdmVuIHRpbWUuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIENhbGN1bGF0ZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBuYW1lCisgKgorICogQHYgX3ByZWZpeAkJU3Vic3lzdGVtIHByZWZpeAorICogQHYgX2FwaV9mdW5jCQlBUEkgZnVuY3Rpb24KKyAqIEByZXQgX3N1YnN5c19mdW5jCVN1YnN5c3RlbSBBUEkgZnVuY3Rpb24KKyAqCisgKiBUaGUgc3Vic3lzdGVtIHByZWZpeCBzaG91bGQgYmUgYW4gZW1wdHkgc3RyaW5nIGZvciB0aGUgY3VycmVudGx5CisgKiBzZWxlY3RlZCBzdWJzeXN0ZW0sIGFuZCBzaG91bGQgYmUgYSBzdWJzeXN0ZW0tdW5pcXVlIHN0cmluZyBmb3IgYWxsCisgKiBvdGhlciBzdWJzeXN0ZW1zLgorICovCisjZGVmaW5lIFNJTkdMRV9BUElfTkFNRSggX3ByZWZpeCwgX2FwaV9mdW5jICkgX3ByZWZpeCAjIyBfYXBpX2Z1bmMKKworLyoqCisgKiBDYWxjdWxhdGUgc3RhdGljIGlubGluZSBmdW5jdGlvbiBuYW1lCisgKgorICogQHYgX3ByZWZpeAkJU3Vic3lzdGVtIHByZWZpeAorICogQHYgX2FwaV9mdW5jCQlBUEkgZnVuY3Rpb24KKyAqIEByZXQgX3N1YnN5c19mdW5jCVN1YnN5c3RlbSBBUEkgZnVuY3Rpb24KKyAqLworI2RlZmluZSBTSU5HTEVfQVBJX0lOTElORSggX3ByZWZpeCwgX2FwaV9mdW5jICkJXAorCVNJTkdMRV9BUElfTkFNRSAoIF9wcmVmaXgsIF9hcGlfZnVuYyApCisKKy8qKgorICogUHJvdmlkZSBhbiBBUEkgaW1wbGVtZW50YXRpb24KKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICogQHYgX2Z1bmMJCUltcGxlbWVudGluZyBmdW5jdGlvbgorICovCisjZGVmaW5lIFBST1ZJREVfU0lOR0xFX0FQSSggX3ByZWZpeCwgX2FwaV9mdW5jLCBfZnVuYyApCQkJICAgICAgXAorCS8qIEVuc3VyZSB0aGF0IF9hcGlfZnVuYyBleGlzdHMgKi8JCQkJICAgICAgXAorCXR5cGVvZiAoIF9hcGlfZnVuYyApIF9hcGlfZnVuYzsJCQkJCSAgICAgIFwKKwkvKiBFbnN1cmUgdGhhdCBfZnVuYyBleGlzdHMgKi8JCQkJCSAgICAgIFwKKwl0eXBlb2YgKCBfZnVuYyApIF9mdW5jOwkJCQkJCSAgICAgIFwKKwkvKiBFbnN1cmUgdGhhdCBfZnVuYyBpcyB0eXBlLWNvbXBhdGlibGUgd2l0aCBfYXBpX2Z1bmMgKi8JICAgICAgXAorCXR5cGVvZiAoIF9hcGlfZnVuYyApIF9mdW5jOwkJCQkJICAgICAgXAorCS8qIEVuc3VyZSB0aGF0IF9zdWJzeXNfZnVuYyBpcyBub24tc3RhdGljICovCQkJICAgICAgXAorCWV4dGVybiB0eXBlb2YgKCBfYXBpX2Z1bmMgKSBTSU5HTEVfQVBJX05BTUUgKCBfcHJlZml4LCBfYXBpX2Z1bmMgKTsgICBcCisJLyogUHJvdmlkZSBzeW1ib2wgYWxpYXMgZnJvbSBfc3Vic3lzX2Z1bmMgdG8gX2Z1bmMgKi8JCSAgICAgIFwKKwl0eXBlb2YgKCBfYXBpX2Z1bmMgKSBTSU5HTEVfQVBJX05BTUUgKCBfcHJlZml4LCBfYXBpX2Z1bmMgKQkgICAgICBcCisJCV9fYXR0cmlidXRlX18gKCggYWxpYXMgKCAjX2Z1bmMgKSApKTsKKworLyoqCisgKiBQcm92aWRlIGEgc3RhdGljIGlubGluZSBBUEkgaW1wbGVtZW50YXRpb24KKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICovCisjZGVmaW5lIFBST1ZJREVfU0lOR0xFX0FQSV9JTkxJTkUoIF9wcmVmaXgsIF9hcGlfZnVuYyApCQkJICAgICAgXAorCS8qIEVuc3VyZSB0aGF0IF9hcGlfZnVuYyBleGlzdHMgKi8JCQkJICAgICAgXAorCXR5cGVvZiAoIF9hcGlfZnVuYyApIF9hcGlfZnVuYzsJCQkJCSAgICAgIFwKKwkvKiBFbnN1cmUgdGhhdCBfc3Vic3lzX2Z1bmMgZXhpc3RzIGFuZCBpcyBzdGF0aWMgKi8JCSAgICAgIFwKKwlzdGF0aWMgdHlwZW9mICggU0lOR0xFX0FQSV9JTkxJTkUgKCBfcHJlZml4LCBfYXBpX2Z1bmMgKSApCSAgICAgIFwKKwkJU0lOR0xFX0FQSV9JTkxJTkUgKCBfcHJlZml4LCBfYXBpX2Z1bmMgKTsJCSAgICAgIFwKKwkvKiBFbnN1cmUgdGhhdCBfc3Vic3lzX2Z1bmMgaXMgdHlwZS1jb21wYXRpYmxlIHdpdGggX2FwaV9mdW5jICovICAgICAgXAorCXR5cGVvZiAoIF9hcGlfZnVuYyApIFNJTkdMRV9BUElfSU5MSU5FICggX3ByZWZpeCwgX2FwaV9mdW5jICk7CisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogX0dQWEVfQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hcmM0LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYXJjNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTc2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYXJjNC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0dQWEVfQVJDNF9ICisjZGVmaW5lIF9HUFhFX0FSQzRfSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBjaXBoZXJfYWxnb3JpdGhtOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0cnVjdCBhcmM0X2N0eCB7CisJaW50IGksIGo7CisJdTggc3RhdGVbMjU2XTsKK307CisKKyNkZWZpbmUgQVJDNF9DVFhfU0laRSBzaXplb2YgKCBzdHJ1Y3QgYXJjNF9jdHggKQorCitleHRlcm4gc3RydWN0IGNpcGhlcl9hbGdvcml0aG0gYXJjNF9hbGdvcml0aG07CisKK3ZvaWQgYXJjNF9za2lwICggY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuLCBzaXplX3Qgc2tpcCwKKwkJIGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBzaXplX3QgbXNnbGVuICk7CisKKyNlbmRpZiAvKiBfR1BYRV9BUkM0X0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hcnAuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjIzZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2FycC5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX0dQWEVfQVJQX0gKKyNkZWZpbmUgX0dQWEVfQVJQX0gKKworLyoqIEBmaWxlCisgKgorICogQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisKK3N0cnVjdCBuZXRfZGV2aWNlOworc3RydWN0IG5ldF9wcm90b2NvbDsKKworLyoqIEEgbmV0d29yay1sYXllciBwcm90b2NvbCB0aGF0IHJlbGllcyB1cG9uIEFSUCAqLworc3RydWN0IGFycF9uZXRfcHJvdG9jb2wgeworCS8qKiBOZXR3b3JrLWxheWVyIHByb3RvY29sICovCisJc3RydWN0IG5ldF9wcm90b2NvbCAqbmV0X3Byb3RvY29sOworCS8qKiBDaGVjayBleGlzdGVuY2Ugb2YgYWRkcmVzcworCSAqCisJICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisJICogQHYgbmV0X2FkZHIJTmV0d29yay1sYXllciBhZGRyZXNzCisJICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIGNoZWNrICkgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICBjb25zdCB2b2lkICpuZXRfYWRkciApOworfTsKKworLyoqIEFSUCBwcm90b2NvbCB0YWJsZSAqLworI2RlZmluZSBBUlBfTkVUX1BST1RPQ09MUyBcCisJX190YWJsZSAoIHN0cnVjdCBhcnBfbmV0X3Byb3RvY29sLCAiYXJwX25ldF9wcm90b2NvbHMiICkKKworLyoqIERlY2xhcmUgYW4gQVJQIHByb3RvY29sICovCisjZGVmaW5lIF9fYXJwX25ldF9wcm90b2NvbCBfX3RhYmxlX2VudHJ5ICggQVJQX05FVF9QUk9UT0NPTFMsIDAxICkKKworZXh0ZXJuIHN0cnVjdCBuZXRfcHJvdG9jb2wgYXJwX3Byb3RvY29sOworCitleHRlcm4gaW50IGFycF9yZXNvbHZlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSBzdHJ1Y3QgbmV0X3Byb3RvY29sICpuZXRfcHJvdG9jb2wsCisJCQkgY29uc3Qgdm9pZCAqZGVzdF9uZXRfYWRkciwKKwkJCSBjb25zdCB2b2lkICpzb3VyY2VfbmV0X2FkZHIsCisJCQkgdm9pZCAqZGVzdF9sbF9hZGRyICk7CisKKyNlbmRpZiAvKiBfR1BYRV9BUlBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2FzbjEuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hc24xLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3YzIwOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9hc24xLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfR1BYRV9BU04xX0gKKyNkZWZpbmUgX0dQWEVfQVNOMV9ICisKKy8qKiBAZmlsZQorICoKKyAqIEFTTi4xIGVuY29kaW5nCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2RlZmluZSBBU04xX0lOVEVHRVIgMHgwMgorI2RlZmluZSBBU04xX0JJVF9TVFJJTkcgMHgwMworI2RlZmluZSBBU04xX09DVEVUX1NUUklORyAweDA0CisjZGVmaW5lIEFTTjFfTlVMTCAweDA1CisjZGVmaW5lIEFTTjFfT0lEIDB4MDYKKyNkZWZpbmUgQVNOMV9TRVFVRU5DRSAweDMwCisjZGVmaW5lIEFTTjFfSVBfQUREUkVTUyAweDQwCisjZGVmaW5lIEFTTjFfRVhQTElDSVRfVEFHIDB4YTAKKworLyoqCisgKiBBIERFUi1lbmNvZGVkIEFTTi4xIG9iamVjdCBjdXJzb3IKKyAqLworc3RydWN0IGFzbjFfY3Vyc29yIHsKKwkvKiogU3RhcnQgb2YgZGF0YSAqLworCXZvaWQgKmRhdGE7CisJLyoqIExlbmd0aCBvZiBkYXRhICovCisJc2l6ZV90IGxlbjsKK307CisKK2V4dGVybiBpbnQgYXNuMV9lbnRlciAoIHN0cnVjdCBhc24xX2N1cnNvciAqY3Vyc29yLCB1bnNpZ25lZCBpbnQgdHlwZSApOworZXh0ZXJuIGludCBhc24xX3NraXAgKCBzdHJ1Y3QgYXNuMV9jdXJzb3IgKmN1cnNvciwgdW5zaWduZWQgaW50IHR5cGUgKTsKKworI2VuZGlmIC8qIF9HUFhFX0FTTjFfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2F0YS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2F0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTY1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYXRhLmgKQEAgLTAsMCArMSwyMDkgQEAKKyNpZm5kZWYgX0dQWEVfQVRBX0gKKyNkZWZpbmUgX0dQWEVfQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvYmxvY2tkZXYuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3JlZmNudC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBBVEEgZGV2aWNlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQW4gQVRBIExvZ2ljYWwgQmxvY2sgQWRkcmVzcworICoKKyAqIEFUQSBjb250cm9sbGVycyBoYXZlIHRocmVlIGJ5dGUtd2lkZSByZWdpc3RlcnMgZm9yIHNwZWNpZnlpbmcgdGhlCisgKiBibG9jayBhZGRyZXNzOiBMQkEgTG93LCBMQkEgTWlkIGFuZCBMQkEgSGlnaC4gIFRoaXMgYWxsb3dzIGZvciBhCisgKiAyNC1iaXQgYWRkcmVzcy4gIFNvbWUgZGV2aWNlcyBzdXBwb3J0IHRoZSAiNDgtYml0IGFkZHJlc3MgZmVhdHVyZQorICogc2V0IiAoTEJBNDgpLCBpbiB3aGljaCBjYXNlIGVhY2ggb2YgdGhlc2UgYnl0ZS13aWRlIHJlZ2lzdGVycyBpcworICogYWN0dWFsbHkgYSB0d28tZW50cnkgRklGTywgYW5kIHRoZSAicHJldmlvdXMiIGJ5dGUgcHVzaGVkIGludG8gdGhlCisgKiBGSUZPIGlzIHVzZWQgYXMgdGhlIGNvcnJlc3BvbmRpbmcgaGlnaC1vcmRlciBieXRlLiAgU28sIHRvIHNldCB1cAorICogdGhlIDQ4LWJpdCBhZGRyZXNzIDB4MTIzNDU2YWJjZGVmLCB5b3Ugd291bGQgaXNzdWUKKyAqCisgKiAgICAgMHg1NiAtPiBMQkEgTG93IHJlZ2lzdGVyCisgKiAgICAgMHhlZiAtPiBMQkEgTG93IHJlZ2lzdGVyCisgKiAgICAgMHgzNCAtPiBMQkEgTWlkIHJlZ2lzdGVyCisgKiAgICAgMHhjZCAtPiBMQkEgTWlkIHJlZ2lzdGVyCisgKiAgICAgMHgxMiAtPiBMQkEgSGlnaCByZWdpc3RlcgorICogICAgIDB4YWIgLT4gTEJBIEhpZ2ggcmVnaXN0ZXIKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBlbmNhcHN1bGF0ZXMgdGhpcyBpbmZvcm1hdGlvbiBieSBwcm92aWRpbmcgYSBzaW5nbGUKKyAqIDY0LWJpdCBpbnRlZ2VyIGluIG5hdGl2ZSBieXRlIG9yZGVyLCB1bmlvbmVkIHdpdGggYnl0ZXMgbmFtZWQgc28KKyAqIHRoYXQgdGhlIHNlcXVlbmNlIGJlY29tZXMKKyAqCisgKiAgICAgbG93X3ByZXYgIC0+IExCQSBMb3cgcmVnaXN0ZXIKKyAqICAgICBsb3dfY3VyICAgLT4gTEJBIExvdyByZWdpc3RlcgorICogICAgIG1pZF9wcmV2ICAtPiBMQkEgTWlkIHJlZ2lzdGVyCisgKiAgICAgbWlkX2N1ciAgIC0+IExCQSBNaWQgcmVnaXN0ZXIKKyAqICAgICBoaWdoX3ByZXYgLT4gTEJBIEhpZ2ggcmVnaXN0ZXIKKyAqICAgICBoaWdoX2N1ciAgLT4gTEJBIEhpZ2ggcmVnaXN0ZXIKKyAqCisgKiBKdXN0IHRvIGNvbXBsaWNhdGUgbWF0dGVycyBmdXJ0aGVyLCBpbiBub24tTEJBNDggbW9kZSBpdCBpcworICogcG9zc2libGUgdG8gaGF2ZSBhIDI4LWJpdCBhZGRyZXNzLCBpbiB3aGljaCBjYXNlIGJpdHMgMjc6MjQgbXVzdCBiZQorICogd3JpdHRlbiBpbnRvIHRoZSBsb3cgZm91ciBiaXRzIG9mIHRoZSBEZXZpY2UgcmVnaXN0ZXIuCisgKi8KK3VuaW9uIGF0YV9sYmEgeworCS8qKiBMQkEgYXMgYSA2NC1iaXQgaW50ZWdlciBpbiBuYXRpdmUtZW5kaWFuIG9yZGVyICovCisJdWludDY0X3QgbmF0aXZlOworCS8qKiBBVEEgcmVnaXN0ZXJzICovCisJc3RydWN0IHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJCXVpbnQ4X3QgbG93X2N1cjsKKwkJdWludDhfdCBtaWRfY3VyOworCQl1aW50OF90IGhpZ2hfY3VyOworCQl1aW50OF90IGxvd19wcmV2OworCQl1aW50OF90IG1pZF9wcmV2OworCQl1aW50OF90IGhpZ2hfcHJldjsKKwkJdWludDE2X3QgcGFkOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCQl1aW50MTZfdCBwYWQ7CisJCXVpbnQ4X3QgaGlnaF9wcmV2OworCQl1aW50OF90IG1pZF9wcmV2OworCQl1aW50OF90IGxvd19wcmV2OworCQl1aW50OF90IGhpZ2hfY3VyOworCQl1aW50OF90IG1pZF9jdXI7CisJCXVpbnQ4X3QgbG93X2N1cjsKKyNlbHNlCisjZXJyb3IgIkkgbmVlZCBhIGJ5dGUgb3JkZXIiCisjZW5kaWYKKwl9IGJ5dGVzOworfTsKKworLyoqIEFuIEFUQSAyLWJ5dGUgRklGTyByZWdpc3RlciAqLwordW5pb24gYXRhX2ZpZm8geworCS8qKiBWYWx1ZSBpbiBuYXRpdmUtZW5kaWFuIG9yZGVyICovCisJdWludDE2X3QgbmF0aXZlOworCS8qKiBBVEEgcmVnaXN0ZXJzICovCisJc3RydWN0IHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJCXVpbnQ4X3QgY3VyOworCQl1aW50OF90IHByZXY7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJCXVpbnQ4X3QgcHJldjsKKwkJdWludDhfdCBjdXI7CisjZWxzZQorI2Vycm9yICJJIG5lZWQgYSBieXRlIG9yZGVyIgorI2VuZGlmCisJfSBieXRlczsKK307CisKKy8qKiBBVEEgY29tbWFuZCBibG9jayAqLworc3RydWN0IGF0YV9jYiB7CisJLyoqIExvZ2ljYWwgYmxvY2sgYWRkcmVzcyAqLworCXVuaW9uIGF0YV9sYmEgbGJhOworCS8qKiBTZWN0b3IgY291bnQgKi8KKwl1bmlvbiBhdGFfZmlmbyBjb3VudDsKKwkvKiogRXJyb3IvZmVhdHVyZSByZWdpc3RlciAqLworCXVuaW9uIGF0YV9maWZvIGVycl9mZWF0OworCS8qKiBEZXZpY2UgcmVnaXN0ZXIgKi8KKwl1aW50OF90IGRldmljZTsKKwkvKiogQ29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIgKi8KKwl1aW50OF90IGNtZF9zdGF0OworCS8qKiBMQkE0OCBhZGRyZXNzaW5nIGZsYWcgKi8KKwlpbnQgbGJhNDg7Cit9OworCisvKiogT2Jzb2xldGUgYml0cyBpbiB0aGUgQVRBIGRldmljZSByZWdpc3RlciAqLworI2RlZmluZSBBVEFfREVWX09CU09MRVRFIDB4YTAKKworLyoqIExCQSBmbGFnIGluIHRoZSBBVEEgZGV2aWNlIHJlZ2lzdGVyICovCisjZGVmaW5lIEFUQV9ERVZfTEJBIDB4NDAKKworLyoqIFNsYXZlICgiZGV2aWNlIDEiKSBmbGFnIGluIHRoZSBBVEEgZGV2aWNlIHJlZ2lzdGVyICovCisjZGVmaW5lIEFUQV9ERVZfU0xBVkUgMHgxMAorCisvKiogTWFzdGVyICgiZGV2aWNlIDAiKSBmbGFnIGluIHRoZSBBVEEgZGV2aWNlIHJlZ2lzdGVyICovCisjZGVmaW5lIEFUQV9ERVZfTUFTVEVSIDB4MDAKKworLyoqIE1hc2sgb2Ygbm9uLUxCQSBwb3J0aW9uIG9mIGRldmljZSByZWdpc3RlciAqLworI2RlZmluZSBBVEFfREVWX01BU0sgMHhmMAorCisvKiogIlJlYWQgc2VjdG9ycyIgY29tbWFuZCAqLworI2RlZmluZSBBVEFfQ01EX1JFQUQgMHgyMAorCisvKiogIlJlYWQgc2VjdG9ycyAoZXh0KSIgY29tbWFuZCAqLworI2RlZmluZSBBVEFfQ01EX1JFQURfRVhUIDB4MjQKKworLyoqICJXcml0ZSBzZWN0b3JzIiBjb21tYW5kICovCisjZGVmaW5lIEFUQV9DTURfV1JJVEUgMHgzMAorCisvKiogIldyaXRlIHNlY3RvcnMgKGV4dCkiIGNvbW1hbmQgKi8KKyNkZWZpbmUgQVRBX0NNRF9XUklURV9FWFQgMHgzNAorCisvKiogIklkZW50aWZ5IiBjb21tYW5kICovCisjZGVmaW5lIEFUQV9DTURfSURFTlRJRlkgMHhlYworCisvKiogQW4gQVRBIGNvbW1hbmQgKi8KK3N0cnVjdCBhdGFfY29tbWFuZCB7CisJLyoqIEFUQSBjb21tYW5kIGJsb2NrICovCisJc3RydWN0IGF0YV9jYiBjYjsKKwkvKiogRGF0YS1vdXQgYnVmZmVyIChtYXkgYmUgTlVMTCkKKwkgKgorCSAqIElmIG5vbi1OVUxMLCB0aGlzIGJ1ZmZlciBtdXN0IGJlIGF0YV9jb21tYW5kOjpjYjo6Y291bnQKKwkgKiBzZWN0b3JzIGluIHNpemUuCisJICovCisJdXNlcnB0cl90IGRhdGFfb3V0OworCS8qKiBEYXRhLWluIGJ1ZmZlciAobWF5IGJlIE5VTEwpCisJICoKKwkgKiBJZiBub24tTlVMTCwgdGhpcyBidWZmZXIgbXVzdCBiZSBhdGFfY29tbWFuZDo6Y2I6OmNvdW50CisJICogc2VjdG9ycyBpbiBzaXplLgorCSAqLworCXVzZXJwdHJfdCBkYXRhX2luOworCS8qKiBDb21tYW5kIHN0YXR1cyBjb2RlICovCisJaW50IHJjOworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgQVRBIElERU5USUZZIGNvbW1hbmQKKyAqCisgKiBUaGlzIGlzIGEgaHVnZSBzdHJ1Y3R1cmUgd2l0aCBtYW55IGZpZWxkcyB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQsCisgKiBzbyB3ZSBpbXBsZW1lbnQgb25seSBhIGZldyBmaWVsZHMuCisgKi8KK3N0cnVjdCBhdGFfaWRlbnRpdHkgeworCXVpbnQxNl90IGlnbm9yZV9hWzYwXTsgLyogd29yZHMgMC01OSAqLworCXVpbnQzMl90IGxiYV9zZWN0b3JzOyAvKiB3b3JkcyA2MC02MSAqLworCXVpbnQxNl90IGlnbm9yZV9iWzIxXTsgLyogd29yZHMgNjItODIgKi8KKwl1aW50MTZfdCBzdXBwb3J0c19sYmE0ODsgLyogd29yZCA4MyAqLworCXVpbnQxNl90IGlnbm9yZV9jWzE2XTsgLyogd29yZHMgODQtOTkgKi8KKwl1aW50NjRfdCBsYmE0OF9zZWN0b3JzOyAvKiB3b3JkcyAxMDAtMTAzICovCisJdWludDE2X3QgaWdub3JlX2RbMTUyXTsgLyogd29yZHMgMTA0LTI1NSAqLworfTsKKworLyoqIFN1cHBvcnRzIExCQTQ4IGZsYWcgKi8KKyNkZWZpbmUgQVRBX1NVUFBPUlRTX0xCQTQ4ICggMSA8PCAxMCApCisKKy8qKiBBVEEgc2VjdG9yIHNpemUgKi8KKyNkZWZpbmUgQVRBX1NFQ1RPUl9TSVpFIDUxMgorCisvKiogQW4gQVRBIGRldmljZSAqLworc3RydWN0IGF0YV9kZXZpY2UgeworCS8qKiBCbG9jayBkZXZpY2UgaW50ZXJmYWNlICovCisJc3RydWN0IGJsb2NrX2RldmljZSBibG9ja2RldjsKKwkvKiogRGV2aWNlIG51bWJlcgorCSAqCisJICogTXVzdCBiZSBBVEFfREVWX01BU1RFUiBvciBBVEFfREVWX1NMQVZFLgorCSAqLworCWludCBkZXZpY2U7CisJLyoqIExCQTQ4IGV4dGVuZGVkIGFkZHJlc3NpbmcgKi8KKwlpbnQgbGJhNDg7CisJLyoqCisJICogSXNzdWUgQVRBIGNvbW1hbmQKKwkgKgorCSAqIEB2IGF0YQkJQVRBIGRldmljZQorCSAqIEB2IGNvbW1hbmQJCUFUQSBjb21tYW5kCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBjb21tYW5kICkgKCBzdHJ1Y3QgYXRhX2RldmljZSAqYXRhLAorCQkJICAgIHN0cnVjdCBhdGFfY29tbWFuZCAqY29tbWFuZCApOworCS8qKiBCYWNraW5nIGRldmljZSAqLworCXN0cnVjdCByZWZjbnQgKmJhY2tlbmQ7Cit9OworCitleHRlcm4gaW50IGluaXRfYXRhZGV2ICggc3RydWN0IGF0YV9kZXZpY2UgKmF0YSApOworCisjZW5kaWYgLyogX0dQWEVfQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9iYXNlNjQuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9iYXNlNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzhiZWYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2Jhc2U2NC5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgX0dQWEVfQkFTRTY0X0gKKyNkZWZpbmUgX0dQWEVfQkFTRTY0X0gKKworLyoqIEBmaWxlCisgKgorICogQmFzZTY0IGVuY29kaW5nCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIENhbGN1bGF0ZSBsZW5ndGggb2YgYmFzZTY0LWVuY29kZWQgc3RyaW5nCisgKgorICogQHYgcmF3X2xlbgkJUmF3IHN0cmluZyBsZW5ndGggKGV4Y2x1ZGluZyBOVUwpCisgKiBAcmV0IGVuY29kZWRfbGVuCUVuY29kZWQgc3RyaW5nIGxlbmd0aCAoZXhjbHVkaW5nIE5VTCkKKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgYmFzZTY0X2VuY29kZWRfbGVuICggc2l6ZV90IHJhd19sZW4gKSB7CisJcmV0dXJuICggKCAoIHJhd19sZW4gKyAzIC0gMSApIC8gMyApICogNCApOworfQorCitleHRlcm4gdm9pZCBiYXNlNjRfZW5jb2RlICggY29uc3QgY2hhciAqcmF3LCBjaGFyICplbmNvZGVkICk7CisKKyNlbmRpZiAvKiBfR1BYRV9CQVNFNjRfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2JpdGJhc2guaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9iaXRiYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiYTlmNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9iaXRiYXNoLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfR1BYRV9CSVRCQVNIX0gKKyNkZWZpbmUgX0dQWEVfQklUQkFTSF9ICisKKy8qKiBAZmlsZQorICoKKyAqIEJpdC1iYXNoaW5nIGludGVyZmFjZXMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitzdHJ1Y3QgYml0X2Jhc2hlcjsKKworLyoqIEJpdC1iYXNoaW5nIG9wZXJhdGlvbnMgKi8KK3N0cnVjdCBiaXRfYmFzaGVyX29wZXJhdGlvbnMgeworCS8qKgorCSAqIFNldC9jbGVhciBvdXRwdXQgYml0CisJICoKKwkgKiBAdiBiYXNoZXIJCUJpdC1iYXNoaW5nIGludGVyZmFjZQorCSAqIEB2IGJpdF9pZAkJQml0IG51bWJlcgorCSAqIEB2IGRhdGEJCVZhbHVlIHRvIHdyaXRlCisJICogCisJICogQGMgZGF0YSB3aWxsIGJlIDAgaWYgYSBsb2dpYyAwIHNob3VsZCBiZSB3cml0dGVuIChpLmUuIHRoZQorCSAqIGJpdCBzaG91bGQgYmUgY2xlYXJlZCksIG9yIC0xVUwgaWYgYSBsb2dpYyAxIHNob3VsZCBiZQorCSAqIHdyaXR0ZW4gKGkuZS4gdGhlIGJpdCBzaG91bGQgYmUgc2V0KS4gIFRoaXMgaXMgZG9uZSBzbyB0aGF0CisJICogdGhlIG1ldGhvZCBtYXkgc2ltcGx5IGJpbmFyeS1BTkQgQGMgZGF0YSB3aXRoIHRoZQorCSAqIGFwcHJvcHJpYXRlIGJpdCBtYXNrLgorCSAqLworCXZvaWQgKCAqIHdyaXRlICkgKCBzdHJ1Y3QgYml0X2Jhc2hlciAqYmFzaGVyLCB1bnNpZ25lZCBpbnQgYml0X2lkLAorCQkJICAgdW5zaWduZWQgbG9uZyBkYXRhICk7CisJLyoqCisJICogUmVhZCBpbnB1dCBiaXQKKwkgKgorCSAqIEB2IGJhc2hlcgkJQml0LWJhc2hpbmcgaW50ZXJmYWNlCisJICogQHYgYml0X2lkCQlCaXQgbnVtYmVyCisJICogQHJldCB6ZXJvCQlJbnB1dCBpcyBhIGxvZ2ljIDAKKwkgKiBAcmV0IG5vbi16ZXJvCUlucHV0IGlzIGEgbG9naWMgMQorCSAqLworCWludCAoICogcmVhZCApICggc3RydWN0IGJpdF9iYXNoZXIgKmJhc2hlciwgdW5zaWduZWQgaW50IGJpdF9pZCApOworfTsKKworLyoqIEEgYml0LWJhc2hpbmcgaW50ZXJmYWNlICovCitzdHJ1Y3QgYml0X2Jhc2hlciB7CisJLyoqIEJpdC1iYXNoaW5nIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgYml0X2Jhc2hlcl9vcGVyYXRpb25zICpvcDsKK307CisKK2V4dGVybiB2b2lkIHdyaXRlX2JpdCAoIHN0cnVjdCBiaXRfYmFzaGVyICpiYXNoZXIsIHVuc2lnbmVkIGludCBiaXRfaWQsCisJCQl1bnNpZ25lZCBsb25nIGRhdGEgKTsKK2V4dGVybiBpbnQgcmVhZF9iaXQgKCBzdHJ1Y3QgYml0X2Jhc2hlciAqYmFzaGVyLCB1bnNpZ25lZCBpbnQgYml0X2lkICk7CisKKyNlbmRpZiAvKiBfR1BYRV9CSVRCQVNIX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9iaXRtYXAuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9iaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkxMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2JpdG1hcC5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX0dQWEVfQklUTUFQX0gKKyNkZWZpbmUgX0dQWEVfQklUTUFQX0gKKworLyoqIEBmaWxlCisgKgorICogQml0bWFwcyBmb3IgbXVsdGljYXN0IGRvd25sb2FkcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoqIEEgc2luZ2xlIGJsb2NrIG9mIGJpdHMgd2l0aGluIGEgYml0bWFwICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgYml0bWFwX2Jsb2NrX3Q7CisKKy8qKiBTaXplIG9mIGEgYmxvY2sgb2YgYml0cyAoaW4gYml0cykgKi8KKyNkZWZpbmUgQklUTUFQX0JMS1NJWkUgKCBzaXplb2YgKCBiaXRtYXBfYmxvY2tfdCApICogOCApCisKKy8qKgorICogQmxvY2sgaW5kZXggd2l0aGluIGJpdG1hcAorICoKKyAqIEB2IGJpdAkJQml0IGluZGV4CisgKiBAcmV0IGluZGV4CQlCbG9jayBpbmRleAorICovCisjZGVmaW5lIEJJVE1BUF9JTkRFWCggYml0ICkgKCAoYml0KSAvIEJJVE1BUF9CTEtTSVpFICkKKworLyoqCisgKiBCbG9jayBtYXNrIHdpdGhpbiBiaXRtYXAKKyAqCisgKiBAdiBiaXQJCUJpdCBpbmRleAorICogQHJldCBtYXNrCQlCbG9jayBtYXNrCisgKi8KKyNkZWZpbmUgQklUTUFQX01BU0soIGJpdCApICggMSA8PCAoIChiaXQpICUgQklUTUFQX0JMS1NJWkUgKSApCisKKy8qKiBBIGJpdG1hcCAqLworc3RydWN0IGJpdG1hcCB7CisJLyoqIEJpdG1hcCBkYXRhICovCisJYml0bWFwX2Jsb2NrX3QgKmJsb2NrczsKKwkvKiogTGVuZ3RoIG9mIHRoZSBiaXRtYXAsIGluIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCS8qKiBJbmRleCBvZiBmaXJzdCBnYXAgaW4gdGhlIGJpdG1hcCAqLworCXVuc2lnbmVkIGludCBmaXJzdF9nYXA7Cit9OworCitleHRlcm4gaW50IGJpdG1hcF9yZXNpemUgKCBzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGludCBuZXdfbGVuZ3RoICk7CitleHRlcm4gaW50IGJpdG1hcF90ZXN0ICggc3RydWN0IGJpdG1hcCAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYml0ICk7CitleHRlcm4gdm9pZCBiaXRtYXBfc2V0ICggc3RydWN0IGJpdG1hcCAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYml0ICk7CisKKy8qKgorICogRnJlZSBiaXRtYXAgcmVzb3VyY2VzCisgKgorICogQHYgYml0bWFwCQlCaXRtYXAKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJpdG1hcF9mcmVlICggc3RydWN0IGJpdG1hcCAqYml0bWFwICkgeworCWZyZWUgKCBiaXRtYXAtPmJsb2NrcyApOworfQorCisvKioKKyAqIEdldCBmaXJzdCBnYXAgd2l0aGluIGJpdG1hcAorICoKKyAqIEB2IGJpdG1hcAkJQml0bWFwCisgKiBAcmV0IGZpcnN0X2dhcAlGaXJzdCBnYXAKKyAqCisgKiBUaGUgZmlyc3QgZ2FwIGlzIHRoZSBmaXJzdCB1bnNldCBiaXQgd2l0aGluIHRoZSBiaXRtYXAuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJpdG1hcF9maXJzdF9nYXAgKCBzdHJ1Y3QgYml0bWFwICpiaXRtYXAgKSB7CisJcmV0dXJuIGJpdG1hcC0+Zmlyc3RfZ2FwOworfQorCisvKioKKyAqIENoZWNrIHRvIHNlZSBpZiBiaXRtYXAgaXMgZnVsbAorICoKKyAqIEB2IGJpdG1hcAkJQml0bWFwCisgKiBAcmV0IGlzX2Z1bGwJCUJpdG1hcCBpcyBmdWxsCisgKgorICogVGhlIGJpdG1hcCBpcyBmdWxsIGlmIGl0IGhhcyBubyBnYXBzIChpLmUuIG5vIHVuc2V0IGJpdHMpLgorICovCitzdGF0aWMgaW5saW5lIGludCBiaXRtYXBfZnVsbCAoIHN0cnVjdCBiaXRtYXAgKmJpdG1hcCApIHsKKwlyZXR1cm4gKCBiaXRtYXAtPmZpcnN0X2dhcCA9PSBiaXRtYXAtPmxlbmd0aCApOworfQorCisjZW5kaWYgLyogX0dQWEVfQklUTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9iaXRvcHMuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGIzNDMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2JpdG9wcy5oCkBAIC0wLDAgKzEsMjMwIEBACisjaWZuZGVmIF9HUFhFX0JJVE9QU19ICisjZGVmaW5lIF9HUFhFX0JJVE9QU19ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBCaXQgb3BlcmF0aW9ucworICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKworLyogRW5kaWFubmVzcyBzZWxlY3Rpb24uCisgKgorICogVGhpcyBpcyBhIHByb3BlcnR5IG9mIHRoZSBOSUMsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBob3N0IENQVS4KKyAqLworI2lmZGVmIEJJVE9QU19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIGNwdV90b19CSVQ2NAljcHVfdG9fbGU2NAorI2RlZmluZSBjcHVfdG9fQklUMzIJY3B1X3RvX2xlMzIKKyNkZWZpbmUgQklUNjRfdG9fY3B1CWxlNjRfdG9fY3B1CisjZGVmaW5lIEJJVDMyX3RvX2NwdQlsZTMyX3RvX2NwdQorI2VuZGlmCisjaWZkZWYgQklUT1BTX0JJR19FTkRJQU4KKyNkZWZpbmUgY3B1X3RvX0JJVDY0CWNwdV90b19iZTY0CisjZGVmaW5lIGNwdV90b19CSVQzMgljcHVfdG9fYmUzMgorI2RlZmluZSBCSVQ2NF90b19jcHUJYmU2NF90b19jcHUKKyNkZWZpbmUgQklUMzJfdG9fY3B1CWJlMzJfdG9fY3B1CisjZW5kaWYKKworLyoqIERhdGF0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGEgYml0IGluIHRoZSBwc2V1ZG8tc3RydWN0dXJlcyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHBzZXVkb19iaXRfdDsKKworLyoqCisgKiBXcmFwcGVyIHN0cnVjdHVyZSBmb3IgcHNldWRvX2JpdF90IHN0cnVjdHVyZXMKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIHBzZXVkb19iaXRfdCBzdHJ1Y3R1cmVzLgorICogSXQgaGFzIHRoZSBjb3JyZWN0IHNpemUsIGFuZCBhbHNvIGVuY2Fwc3VsYXRlcyB0eXBlIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUgdW5kZXJseWluZyBwc2V1ZG9fYml0X3QtYmFzZWQgc3RydWN0dXJlLCB3aGljaCBhbGxvd3MgdGhlCisgKiBCSVRfRklMTCgpIGV0Yy4gbWFjcm9zIHRvIHdvcmsgd2l0aG91dCByZXF1aXJpbmcgZXhwbGljaXQgdHlwZQorICogaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgUFNFVURPX0JJVF9TVFJVQ1QoIF9zdHJ1Y3R1cmUgKQkJCQkJICAgICAgXAorCXVuaW9uIHsJCQkJCQkJCSAgICAgIFwKKwkJdWludDhfdCBieXRlc1sgc2l6ZW9mICggX3N0cnVjdHVyZSApIC8gOCBdOwkJICAgICAgXAorCQl1aW50MzJfdCBkd29yZHNbIHNpemVvZiAoIF9zdHJ1Y3R1cmUgKSAvIDMyIF07CQkgICAgICBcCisJCXVpbnQ2NF90IHF3b3Jkc1sgc2l6ZW9mICggX3N0cnVjdHVyZSApIC8gNjQgXTsJCSAgICAgIFwKKwkJX3N0cnVjdHVyZSAqZHVtbXlbMF07CQkJCQkgICAgICBcCisJfSB1CisKKy8qKiBHZXQgcHNldWRvX2JpdF90IHN0cnVjdHVyZSB0eXBlIGZyb20gd3JhcHBlciBzdHJ1Y3R1cmUgcG9pbnRlciAqLworI2RlZmluZSBQU0VVRE9fQklUX1NUUlVDVF9UWVBFKCBfcHRyICkJCQkJCSAgICAgIFwKKwl0eXBlb2YgKCAqKChfcHRyKS0+dS5kdW1teVswXSkgKQorCisvKiogQml0IG9mZnNldCBvZiBhIGZpZWxkIHdpdGhpbiBhIHBzZXVkb19iaXRfdCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgQklUX09GRlNFVCggX3B0ciwgX2ZpZWxkICkJCQkJCSAgICAgIFwKKwlvZmZzZXRvZiAoIFBTRVVET19CSVRfU1RSVUNUX1RZUEUgKCBfcHRyICksIF9maWVsZCApCisKKy8qKiBCaXQgd2lkdGggb2YgYSBmaWVsZCB3aXRoaW4gYSBwc2V1ZG9fYml0X3Qgc3RydWN0dXJlICovCisjZGVmaW5lIEJJVF9XSURUSCggX3B0ciwgX2ZpZWxkICkJCQkJCSAgICAgIFwKKwlzaXplb2YgKCAoICggUFNFVURPX0JJVF9TVFJVQ1RfVFlQRSAoIF9wdHIgKSAqICkgTlVMTCApLT5fZmllbGQgKQorCisvKiogUXdvcmQgb2Zmc2V0IG9mIGEgZmllbGQgd2l0aGluIGEgcHNldWRvX2JpdF90IHN0cnVjdHVyZSAqLworI2RlZmluZSBRV09SRF9PRkZTRVQoIF9wdHIsIF9maWVsZCApCQkJCQkgICAgICBcCisJKCBCSVRfT0ZGU0VUICggX3B0ciwgX2ZpZWxkICkgLyA2NCApCisKKy8qKiBRd29yZCBiaXQgb2Zmc2V0IG9mIGEgZmllbGQgd2l0aGluIGEgcHNldWRvX2JpdF90IHN0cnVjdHVyZSAqLworI2RlZmluZSBRV09SRF9CSVRfT0ZGU0VUKCBfcHRyLCBfaW5kZXgsIF9maWVsZCApCQkJICAgICAgXAorCSggQklUX09GRlNFVCAoIF9wdHIsIF9maWVsZCApIC0gKCA2NCAqIChfaW5kZXgpICkgKQorCisvKiogQml0IG1hc2sgZm9yIGEgZmllbGQgd2l0aGluIGEgcHNldWRvX2JpdF90IHN0cnVjdHVyZSAqLworI2RlZmluZSBCSVRfTUFTSyggX3B0ciwgX2ZpZWxkICkJCQkJCSAgICAgIFwKKwkoICggfiggKCB1aW50NjRfdCApIDAgKSApID4+CQkJCQkgICAgICBcCisJICAoIDY0IC0gQklUX1dJRFRIICggX3B0ciwgX2ZpZWxkICkgKSApCisKKy8qCisgKiBBc3NlbWJsZSBuYXRpdmUtZW5kaWFuIHF3b3JkIGZyb20gbmFtZWQgZmllbGRzIGFuZCB2YWx1ZXMKKyAqCisgKi8KKworI2RlZmluZSBCSVRfQVNTRU1CTEVfMSggX3B0ciwgX2luZGV4LCBfZmllbGQsIF92YWx1ZSApCQkJICAgICAgXAorCSggKCAoIHVpbnQ2NF90KSAoX3ZhbHVlKSApIDw8CQkJCQkgICAgICBcCisJICBRV09SRF9CSVRfT0ZGU0VUICggX3B0ciwgX2luZGV4LCBfZmllbGQgKSApCisKKyNkZWZpbmUgQklUX0FTU0VNQkxFXzIoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCQkgICAgICBcCisJKCBCSVRfQVNTRU1CTEVfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CQkgICAgICBcCisJICBCSVRfQVNTRU1CTEVfMSAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgQklUX0FTU0VNQkxFXzMoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCQkgICAgICBcCisJKCBCSVRfQVNTRU1CTEVfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CQkgICAgICBcCisJICBCSVRfQVNTRU1CTEVfMiAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgQklUX0FTU0VNQkxFXzQoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCQkgICAgICBcCisJKCBCSVRfQVNTRU1CTEVfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CQkgICAgICBcCisJICBCSVRfQVNTRU1CTEVfMyAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgQklUX0FTU0VNQkxFXzUoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCQkgICAgICBcCisJKCBCSVRfQVNTRU1CTEVfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CQkgICAgICBcCisJICBCSVRfQVNTRU1CTEVfNCAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgQklUX0FTU0VNQkxFXzYoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCQkgICAgICBcCisJKCBCSVRfQVNTRU1CTEVfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CQkgICAgICBcCisJICBCSVRfQVNTRU1CTEVfNSAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKyNkZWZpbmUgQklUX0FTU0VNQkxFXzcoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUsIC4uLiApCQkgICAgICBcCisJKCBCSVRfQVNTRU1CTEVfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkLCBfdmFsdWUgKSB8CQkgICAgICBcCisJICBCSVRfQVNTRU1CTEVfNiAoIF9wdHIsIF9pbmRleCwgX19WQV9BUkdTX18gKSApCisKKy8qCisgKiBCdWlsZCBuYXRpdmUtZW5kaWFuIChwb3NpdGl2ZSkgcXdvcmQgYml0bWFza3MgZnJvbSBuYW1lZCBmaWVsZHMKKyAqCisgKi8KKworI2RlZmluZSBCSVRfTUFTS18xKCBfcHRyLCBfaW5kZXgsIF9maWVsZCApCQkJCSAgICAgIFwKKwkoIEJJVF9NQVNLICggX3B0ciwgX2ZpZWxkICkgPDwJCQkJCSAgICAgIFwKKwkgIFFXT1JEX0JJVF9PRkZTRVQgKCBfcHRyLCBfaW5kZXgsIF9maWVsZCApICkKKworI2RlZmluZSBCSVRfTUFTS18yKCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgLi4uICkJCQkJICAgICAgXAorCSggQklUX01BU0tfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkICkgfAkJCQkgICAgICBcCisJICBCSVRfTUFTS18xICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfTUFTS18zKCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgLi4uICkJCQkJICAgICAgXAorCSggQklUX01BU0tfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkICkgfAkJCQkgICAgICBcCisJICBCSVRfTUFTS18yICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfTUFTS180KCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgLi4uICkJCQkJICAgICAgXAorCSggQklUX01BU0tfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkICkgfAkJCQkgICAgICBcCisJICBCSVRfTUFTS18zICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfTUFTS181KCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgLi4uICkJCQkJICAgICAgXAorCSggQklUX01BU0tfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkICkgfAkJCQkgICAgICBcCisJICBCSVRfTUFTS180ICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfTUFTS182KCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgLi4uICkJCQkJICAgICAgXAorCSggQklUX01BU0tfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkICkgfAkJCQkgICAgICBcCisJICBCSVRfTUFTS181ICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfTUFTS183KCBfcHRyLCBfaW5kZXgsIF9maWVsZCwgLi4uICkJCQkJICAgICAgXAorCSggQklUX01BU0tfMSAoIF9wdHIsIF9pbmRleCwgX2ZpZWxkICkgfAkJCQkgICAgICBcCisJICBCSVRfTUFTS182ICggX3B0ciwgX2luZGV4LCBfX1ZBX0FSR1NfXyApICkKKworLyoKKyAqIFBvcHVsYXRlIGxpdHRsZS1lbmRpYW4gcXdvcmRzIGZyb20gbmFtZWQgZmllbGRzIGFuZCB2YWx1ZXMKKyAqCisgKi8KKworI2RlZmluZSBCSVRfRklMTCggX3B0ciwgX2luZGV4LCBfYXNzZW1ibGVkICkgZG8gewkJCSAgICAgIFwKKwkJdWludDY0X3QgKl9fcHRyID0gJihfcHRyKS0+dS5xd29yZHNbKF9pbmRleCldOwkJICAgICAgXAorCQl1aW50NjRfdCBfX2Fzc2VtYmxlZCA9IChfYXNzZW1ibGVkKTsJCQkgICAgICBcCisJCSpfX3B0ciA9IGNwdV90b19CSVQ2NCAoIF9fYXNzZW1ibGVkICk7CQkJICAgICAgXAorCX0gd2hpbGUgKCAwICkKKworI2RlZmluZSBCSVRfRklMTF8xKCBfcHRyLCBfZmllbGQxLCAuLi4gKQkJCQkgICAgICBcCisJQklUX0ZJTEwgKCBfcHRyLCBRV09SRF9PRkZTRVQgKCBfcHRyLCBfZmllbGQxICksCQkgICAgICBcCisJCSAgIEJJVF9BU1NFTUJMRV8xICggX3B0ciwgUVdPUkRfT0ZGU0VUICggX3B0ciwgX2ZpZWxkMSApLCAgICAgXAorCQkJCSAgICBfZmllbGQxLCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfRklMTF8yKCBfcHRyLCBfZmllbGQxLCAuLi4gKQkJCQkgICAgICBcCisJQklUX0ZJTEwgKCBfcHRyLCBRV09SRF9PRkZTRVQgKCBfcHRyLCBfZmllbGQxICksCQkgICAgICBcCisJCSAgIEJJVF9BU1NFTUJMRV8yICggX3B0ciwgUVdPUkRfT0ZGU0VUICggX3B0ciwgX2ZpZWxkMSApLCAgICAgXAorCQkJCSAgICBfZmllbGQxLCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfRklMTF8zKCBfcHRyLCBfZmllbGQxLCAuLi4gKQkJCQkgICAgICBcCisJQklUX0ZJTEwgKCBfcHRyLCBRV09SRF9PRkZTRVQgKCBfcHRyLCBfZmllbGQxICksCQkgICAgICBcCisJCSAgIEJJVF9BU1NFTUJMRV8zICggX3B0ciwgUVdPUkRfT0ZGU0VUICggX3B0ciwgX2ZpZWxkMSApLCAgICAgXAorCQkJCSAgICBfZmllbGQxLCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfRklMTF80KCBfcHRyLCBfZmllbGQxLCAuLi4gKQkJCQkgICAgICBcCisJQklUX0ZJTEwgKCBfcHRyLCBRV09SRF9PRkZTRVQgKCBfcHRyLCBfZmllbGQxICksCQkgICAgICBcCisJCSAgIEJJVF9BU1NFTUJMRV80ICggX3B0ciwgUVdPUkRfT0ZGU0VUICggX3B0ciwgX2ZpZWxkMSApLCAgICAgXAorCQkJCSAgICBfZmllbGQxLCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfRklMTF81KCBfcHRyLCBfZmllbGQxLCAuLi4gKQkJCQkgICAgICBcCisJQklUX0ZJTEwgKCBfcHRyLCBRV09SRF9PRkZTRVQgKCBfcHRyLCBfZmllbGQxICksCQkgICAgICBcCisJCSAgIEJJVF9BU1NFTUJMRV81ICggX3B0ciwgUVdPUkRfT0ZGU0VUICggX3B0ciwgX2ZpZWxkMSApLCAgICAgXAorCQkJCSAgICBfZmllbGQxLCBfX1ZBX0FSR1NfXyApICkKKworI2RlZmluZSBCSVRfRklMTF82KCBfcHRyLCBfZmllbGQxLCAuLi4gKQkJCQkgICAgICBcCisJQklUX0ZJTEwgKCBfcHRyLCBRV09SRF9PRkZTRVQgKCBfcHRyLCBfZmllbGQxICksCQkgICAgICBcCisJCSAgIEJJVF9BU1NFTUJMRV82ICggX3B0ciwgUVdPUkRfT0ZGU0VUICggX3B0ciwgX2ZpZWxkMSApLCAgICAgXAorCQkJCSAgICBfZmllbGQxLCBfX1ZBX0FSR1NfXyApICkKKworLyoqIEV4dHJhY3QgdmFsdWUgb2YgbmFtZWQgZmllbGQgKi8KKyNkZWZpbmUgQklUX0dFVDY0KCBfcHRyLCBfZmllbGQgKQkJCQkJICAgICAgXAorCSggewkJCQkJCQkJICAgICAgXAorCQl1bnNpZ25lZCBpbnQgX19pbmRleCA9IFFXT1JEX09GRlNFVCAoIF9wdHIsIF9maWVsZCApOwkgICAgICBcCisJCXVpbnQ2NF90ICpfX3B0ciA9ICYoX3B0ciktPnUucXdvcmRzW19faW5kZXhdOwkJICAgICAgXAorCQl1aW50NjRfdCBfX3ZhbHVlID0gQklUNjRfdG9fY3B1ICggKl9fcHRyICk7CQkgICAgICBcCisJCV9fdmFsdWUgPj49CQkJCQkJICAgICAgXAorCQkgICAgUVdPUkRfQklUX09GRlNFVCAoIF9wdHIsIF9faW5kZXgsIF9maWVsZCApOwkJICAgICAgXAorCQlfX3ZhbHVlICY9IEJJVF9NQVNLICggX3B0ciwgX2ZpZWxkICk7CQkJICAgICAgXAorCQlfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKwl9ICkKKworLyoqIEV4dHJhY3QgdmFsdWUgb2YgbmFtZWQgZmllbGQgKGZvciBmaWVsZHMgdXAgdG8gdGhlIHNpemUgb2YgYSBsb25nKSAqLworI2RlZmluZSBCSVRfR0VUKCBfcHRyLCBfZmllbGQgKQkJCQkJCSAgICAgIFwKKwkoICggdW5zaWduZWQgbG9uZyApIEJJVF9HRVQ2NCAoIF9wdHIsIF9maWVsZCApICkKKworI2RlZmluZSBCSVRfU0VUKCBfcHRyLCBfZmllbGQsIF92YWx1ZSApIGRvIHsJCQkJICAgICAgXAorCQl1bnNpZ25lZCBpbnQgX19pbmRleCA9IFFXT1JEX09GRlNFVCAoIF9wdHIsIF9maWVsZCApOwkgICAgICBcCisJCXVpbnQ2NF90ICpfX3B0ciA9ICYoX3B0ciktPnUucXdvcmRzW19faW5kZXhdOwkJICAgICAgXAorCQl1bnNpZ25lZCBpbnQgX19zaGlmdCA9CQkJCQkgICAgICBcCisJCQlRV09SRF9CSVRfT0ZGU0VUICggX3B0ciwgX19pbmRleCwgX2ZpZWxkICk7CSAgICAgIFwKKwkJdWludDY0X3QgX192YWx1ZSA9IChfdmFsdWUpOwkJCQkgICAgICBcCisJCSpfX3B0ciAmPSBjcHVfdG9fQklUNjQgKCB+KCBCSVRfTUFTSyAoIF9wdHIsIF9maWVsZCApIDw8ICAgICAgXAorCQkJCQkgICAgX19zaGlmdCApICk7CQkgICAgICBcCisJCSpfX3B0ciB8PSBjcHVfdG9fQklUNjQgKCBfX3ZhbHVlIDw8IF9fc2hpZnQgKTsJCSAgICAgIFwKKwl9IHdoaWxlICggMCApCisKKyNlbmRpZiAvKiBfR1BYRV9CSVRPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2Jsb2NrZGV2LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvYmxvY2tkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI4NTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2Jsb2NrZGV2LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfR1BYRV9CTE9DS0RFVl9ICisjZGVmaW5lIF9HUFhFX0JMT0NLREVWX0gKKworLyoqCisgKiBAZmlsZQorICoKKyAqIEJsb2NrIGRldmljZXMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS91YWNjZXNzLmg+CisKK3N0cnVjdCBibG9ja19kZXZpY2U7CisKKy8qKiBCbG9jayBkZXZpY2Ugb3BlcmF0aW9ucyAqLworc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHsKKwkvKioKKwkgKiBSZWFkIGJsb2NrCisJICoKKwkgKiBAdiBibG9ja2RldglCbG9jayBkZXZpY2UKKwkgKiBAdiBibG9jawlCbG9jayBudW1iZXIKKwkgKiBAdiBjb3VudAlCbG9jayBjb3VudAorCSAqIEB2IGJ1ZmZlcglEYXRhIGJ1ZmZlcgorCSAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiByZWFkICkgKCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja2RldiwgdWludDY0X3QgYmxvY2ssCisJCQkgdW5zaWduZWQgbG9uZyBjb3VudCwgdXNlcnB0cl90IGJ1ZmZlciApOworCS8qKgorCSAqIFdyaXRlIGJsb2NrCisJICoKKwkgKiBAdiBibG9ja2RldglCbG9jayBkZXZpY2UKKwkgKiBAdiBibG9jawlCbG9jayBudW1iZXIKKwkgKiBAdiBjb3VudAlCbG9jayBjb3VudAorCSAqIEB2IGJ1ZmZlcglEYXRhIGJ1ZmZlcgorCSAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiB3cml0ZSApICggc3RydWN0IGJsb2NrX2RldmljZSAqYmxvY2tkZXYsIHVpbnQ2NF90IGJsb2NrLAorCQkJICB1bnNpZ25lZCBsb25nIGNvdW50LCB1c2VycHRyX3QgYnVmZmVyICk7Cit9OworCisvKiogQSBibG9jayBkZXZpY2UgKi8KK3N0cnVjdCBibG9ja19kZXZpY2UgeworCS8qKiBCbG9jayBkZXZpY2Ugb3BlcmF0aW9ucyAqLworCXN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyAqb3A7CisJLyoqIEJsb2NrIHNpemUgKi8KKwlzaXplX3QgYmxrc2l6ZTsKKwkvKiogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworCXVpbnQ2NF90IGJsb2NrczsKK307CisKKyNlbmRpZiAvKiBfR1BYRV9CTE9DS0RFVl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvY2JjLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvY2JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MmYxZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9jYmMuaApAQCAtMCwwICsxLDEwMCBAQAorI2lmbmRlZiBfR1BYRV9DQkNfSAorI2RlZmluZSBfR1BYRV9DQkNfSAorCisvKiogQGZpbGUKKyAqCisgKiBDaXBoZXItYmxvY2sgY2hhaW5pbmcKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9jcnlwdG8uaD4KKworLyoqCisgKiBTZXQga2V5CisgKgorICogQHYgY3R4CQlDb250ZXh0CisgKiBAdiBrZXkJCUtleQorICogQHYga2V5bGVuCQlLZXkgbGVuZ3RoCisgKiBAdiByYXdfY2lwaGVyCVVuZGVybHlpbmcgY2lwaGVyIGFsZ29yaXRobQorICogQHYgY2JjX2N0eAkJQ0JDIGNvbnRleHQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW5saW5lIGludCBjYmNfc2V0a2V5ICggdm9pZCAqY3R4LCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4sCisJCQkgICAgICAgc3RydWN0IGNpcGhlcl9hbGdvcml0aG0gKnJhd19jaXBoZXIsCisJCQkgICAgICAgdm9pZCAqY2JjX2N0eCBfX3VudXNlZCApIHsKKworCXJldHVybiBjaXBoZXJfc2V0a2V5ICggcmF3X2NpcGhlciwgY3R4LCBrZXksIGtleWxlbiApOworfQorCisvKioKKyAqIFNldCBpbml0aWFsaXNhdGlvbiB2ZWN0b3IKKyAqCisgKiBAdiBjdHgJCUNvbnRleHQKKyAqIEB2IGl2CQlJbml0aWFsaXNhdGlvbiB2ZWN0b3IKKyAqIEB2IHJhd19jaXBoZXIJVW5kZXJseWluZyBjaXBoZXIgYWxnb3JpdGhtCisgKiBAdiBjYmNfY3R4CQlDQkMgY29udGV4dAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2JjX3NldGl2ICggdm9pZCAqY3R4IF9fdW51c2VkLCBjb25zdCB2b2lkICppdiwKKwkJCSAgICAgICBzdHJ1Y3QgY2lwaGVyX2FsZ29yaXRobSAqcmF3X2NpcGhlciwKKwkJCSAgICAgICB2b2lkICpjYmNfY3R4ICkgeworCW1lbWNweSAoIGNiY19jdHgsIGl2LCByYXdfY2lwaGVyLT5ibG9ja3NpemUgKTsKK30KKworZXh0ZXJuIHZvaWQgY2JjX2VuY3J5cHQgKCB2b2lkICpjdHgsIGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJICBzaXplX3QgbGVuLCBzdHJ1Y3QgY2lwaGVyX2FsZ29yaXRobSAqcmF3X2NpcGhlciwKKwkJCSAgdm9pZCAqY2JjX2N0eCApOworZXh0ZXJuIHZvaWQgY2JjX2RlY3J5cHQgKCB2b2lkICpjdHgsIGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJICBzaXplX3QgbGVuLCBzdHJ1Y3QgY2lwaGVyX2FsZ29yaXRobSAqcmF3X2NpcGhlciwKKwkJCSAgdm9pZCAqY2JjX2N0eCApOworCisvKioKKyAqIENyZWF0ZSBhIGNpcGhlci1ibG9jayBjaGFpbmluZyBtb2RlIG9mIGJlaGF2aW91ciBvZiBhbiBleGlzdGluZyBjaXBoZXIKKyAqCisgKiBAdiBfY2JjX25hbWUJCU5hbWUgZm9yIHRoZSBuZXcgQ0JDIGNpcGhlcgorICogQHYgX2NiY19jaXBoZXIJTmV3IGNpcGhlciBhbGdvcml0aG0KKyAqIEB2IF9yYXdfY2lwaGVyCVVuZGVybHlpbmcgY2lwaGVyIGFsZ29yaXRobQorICogQHYgX3Jhd19jb250ZXh0CUNvbnRleHQgc3RydWN0dXJlIGZvciB0aGUgdW5kZXJseWluZyBjaXBoZXIKKyAqIEB2IF9ibG9ja3NpemUJQ2lwaGVyIGJsb2NrIHNpemUKKyAqLworI2RlZmluZSBDQkNfQ0lQSEVSKCBfY2JjX25hbWUsIF9jYmNfY2lwaGVyLCBfcmF3X2NpcGhlciwgX3Jhd19jb250ZXh0LAlcCisJCSAgICBfYmxvY2tzaXplICkJCQkJCVwKK3N0cnVjdCBfY2JjX25hbWUgIyMgX2NvbnRleHQgewkJCQkJCVwKKwlfcmF3X2NvbnRleHQgcmF3X2N0eDsJCQkJCQlcCisJdWludDhfdCBjYmNfY3R4W19ibG9ja3NpemVdOwkJCQkJXAorfTsJCQkJCQkJCQlcCitzdGF0aWMgaW50IF9jYmNfbmFtZSAjIyBfc2V0a2V5ICggdm9pZCAqY3R4LCBjb25zdCB2b2lkICprZXksCQlcCisJCQkJICBzaXplX3Qga2V5bGVuICkgewkJCVwKKwlzdHJ1Y3QgX2NiY19uYW1lICMjIF9jb250ZXh0ICogX2NiY19uYW1lICMjIF9jdHggPSBjdHg7CQlcCisJcmV0dXJuIGNiY19zZXRrZXkgKCAmX2NiY19uYW1lICMjIF9jdHgtPnJhd19jdHgsIGtleSwga2V5bGVuLAlcCisJCQkgICAgJl9yYXdfY2lwaGVyLCAmX2NiY19uYW1lICMjIF9jdHgtPmNiY19jdHggKTtcCit9CQkJCQkJCQkJXAorc3RhdGljIHZvaWQgX2NiY19uYW1lICMjIF9zZXRpdiAoIHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqaXYgKSB7CQlcCisJc3RydWN0IF9jYmNfbmFtZSAjIyBfY29udGV4dCAqIF9jYmNfbmFtZSAjIyBfY3R4ID0gY3R4OwkJXAorCWNiY19zZXRpdiAoICZfY2JjX25hbWUgIyMgX2N0eC0+cmF3X2N0eCwgaXYsCQkJXAorCQkgICAgJl9yYXdfY2lwaGVyLCAmYWVzX2NiY19jdHgtPmNiY19jdHggKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgdm9pZCBfY2JjX25hbWUgIyMgX2VuY3J5cHQgKCB2b2lkICpjdHgsIGNvbnN0IHZvaWQgKnNyYywJCVwKKwkJCQkgICAgdm9pZCAqZHN0LCBzaXplX3QgbGVuICkgewkJXAorCXN0cnVjdCBfY2JjX25hbWUgIyMgX2NvbnRleHQgKiBfY2JjX25hbWUgIyMgX2N0eCA9IGN0eDsJCVwKKwljYmNfZW5jcnlwdCAoICZfY2JjX25hbWUgIyMgX2N0eC0+cmF3X2N0eCwgc3JjLCBkc3QsIGxlbiwJXAorCQkgICAgICAmX3Jhd19jaXBoZXIsICZhZXNfY2JjX2N0eC0+Y2JjX2N0eCApOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyB2b2lkIF9jYmNfbmFtZSAjIyBfZGVjcnlwdCAoIHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqc3JjLAkJXAorCQkJCSAgICB2b2lkICpkc3QsIHNpemVfdCBsZW4gKSB7CQlcCisJc3RydWN0IF9jYmNfbmFtZSAjIyBfY29udGV4dCAqIF9jYmNfbmFtZSAjIyBfY3R4ID0gY3R4OwkJXAorCWNiY19kZWNyeXB0ICggJl9jYmNfbmFtZSAjIyBfY3R4LT5yYXdfY3R4LCBzcmMsIGRzdCwgbGVuLAlcCisJCSAgICAgICZfcmF3X2NpcGhlciwgJmFlc19jYmNfY3R4LT5jYmNfY3R4ICk7CQlcCit9CQkJCQkJCQkJXAorc3RydWN0IGNpcGhlcl9hbGdvcml0aG0gX2NiY19jaXBoZXIgPSB7CQkJCQlcCisJLm5hbWUJCT0gI19jYmNfbmFtZSwJCQkJCVwKKwkuY3R4c2l6ZQk9IHNpemVvZiAoIHN0cnVjdCBfY2JjX25hbWUgIyMgX2NvbnRleHQgKSwJXAorCS5ibG9ja3NpemUJPSBfYmxvY2tzaXplLAkJCQkJXAorCS5zZXRrZXkJCT0gX2NiY19uYW1lICMjIF9zZXRrZXksCQkJCVwKKwkuc2V0aXYJCT0gX2NiY19uYW1lICMjIF9zZXRpdiwJCQkJXAorCS5lbmNyeXB0CT0gX2NiY19uYW1lICMjIF9lbmNyeXB0LAkJCVwKKwkuZGVjcnlwdAk9IF9jYmNfbmFtZSAjIyBfZGVjcnlwdCwJCQlcCit9OworCisjZW5kaWYgLyogX0dQWEVfQ0JDX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9jaGFwLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvY2hhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmVkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvY2hhcC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0dQWEVfQ0hBUF9ICisjZGVmaW5lIF9HUFhFX0NIQVBfSAorCisvKiogQGZpbGUKKyAqCisgKiBDSEFQIHByb3RvY29sCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvbWQ1Lmg+CisKK3N0cnVjdCBkaWdlc3RfYWxnb3JpdGhtOworCisvKiogQSBDSEFQIHJlc3BvbnNlICovCitzdHJ1Y3QgY2hhcF9yZXNwb25zZSB7CisJLyoqIERpZ2VzdCBhbGdvcml0aG0gdXNlZCBmb3IgdGhlIHJlc3BvbnNlICovCisJc3RydWN0IGRpZ2VzdF9hbGdvcml0aG0gKmRpZ2VzdDsKKwkvKiogQ29udGV4dCB1c2VkIGJ5IHRoZSBkaWdlc3QgYWxnb3JpdGhtICovCisJdWludDhfdCAqZGlnZXN0X2NvbnRleHQ7CisJLyoqIENIQVAgcmVzcG9uc2UgKi8KKwl1aW50OF90ICpyZXNwb25zZTsKKwkvKiogTGVuZ3RoIG9mIENIQVAgcmVzcG9uc2UgKi8KKwlzaXplX3QgcmVzcG9uc2VfbGVuOworfTsKKworZXh0ZXJuIGludCBjaGFwX2luaXQgKCBzdHJ1Y3QgY2hhcF9yZXNwb25zZSAqY2hhcCwKKwkJICAgICAgIHN0cnVjdCBkaWdlc3RfYWxnb3JpdGhtICpkaWdlc3QgKTsKK2V4dGVybiB2b2lkIGNoYXBfdXBkYXRlICggc3RydWN0IGNoYXBfcmVzcG9uc2UgKmNoYXAsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgIHNpemVfdCBsZW4gKTsKK2V4dGVybiB2b2lkIGNoYXBfcmVzcG9uZCAoIHN0cnVjdCBjaGFwX3Jlc3BvbnNlICpjaGFwICk7CitleHRlcm4gdm9pZCBjaGFwX2ZpbmlzaCAoIHN0cnVjdCBjaGFwX3Jlc3BvbnNlICpjaGFwICk7CisKKy8qKgorICogQWRkIGlkZW50aWZpZXIgZGF0YSB0byB0aGUgQ0hBUCBjaGFsbGVuZ2UKKyAqCisgKiBAdiBjaGFwCQlDSEFQIHJlc3BvbnNlCisgKiBAdiBpZGVudGlmaWVyCUNIQVAgaWRlbnRpZmllcgorICoKKyAqIFRoZSBDSEFQIGlkZW50aWZpZXIgaXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIENIQVAgY2hhbGxlbmdlLiAgVGhpcworICogZnVuY3Rpb24gaXMgYSBub3RhdGlvbmFsIGNvbnZlbmllbmNlIGZvciBjYWxsaW5nIGNoYXBfdXBkYXRlKCkgZm9yCisgKiB0aGUgaWRlbnRpZmllciBieXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2hhcF9zZXRfaWRlbnRpZmllciAoIHN0cnVjdCBjaGFwX3Jlc3BvbnNlICpjaGFwLAorCQkJCQkgdW5zaWduZWQgaW50IGlkZW50aWZpZXIgKSB7CisJdWludDhfdCBpZGVudF9ieXRlID0gaWRlbnRpZmllcjsKKworCWNoYXBfdXBkYXRlICggY2hhcCwgJmlkZW50X2J5dGUsIHNpemVvZiAoIGlkZW50X2J5dGUgKSApOworfQorCisjZW5kaWYgLyogX0dQWEVfQ0hBUF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvY29tbWFuZC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWNhNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2NvbW1hbmQuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIF9HUFhFX0NPTU1BTkRfSAorI2RlZmluZSBfR1BYRV9DT01NQU5EX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKworLyoqIEEgY29tbWFuZC1saW5lIGNvbW1hbmQgKi8KK3N0cnVjdCBjb21tYW5kIHsKKwkvKiogTmFtZSBvZiB0aGUgY29tbWFuZCAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJLyoqCisJICogRnVuY3Rpb24gaW1wbGVtZW50aW5nIHRoZSBjb21tYW5kCisJICoKKwkgKiBAdiBhcmdjCQlBcmd1bWVudCBjb3VudAorCSAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIGV4ZWMgKSAoIGludCBhcmdjLCBjaGFyICoqYXJndiApOworfTsKKworI2RlZmluZSBDT01NQU5EUyBfX3RhYmxlICggc3RydWN0IGNvbW1hbmQsICJjb21tYW5kcyIgKQorCisjZGVmaW5lIF9fY29tbWFuZCBfX3RhYmxlX2VudHJ5ICggQ09NTUFORFMsIDAxICkKKworI2VuZGlmIC8qIF9HUFhFX0NPTU1BTkRfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2NwaW8uaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9jcGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2MmNlYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9jcGlvLmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfR1BYRV9DUElPX0gKKyNkZWZpbmUgX0dQWEVfQ1BJT19ICisKKy8qKiBAZmlsZQorICoKKyAqIENQSU8gYXJjaGl2ZXMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogQSBDUElPIGFyY2hpdmUgaGVhZGVyCisgKgorICogQWxsIGZpZWxkIGFyZSBoZXhhZGVjaW1hbCBBU0NJSSBudW1iZXJzIHBhZGRlZCB3aXRoICcwJyBvbiB0aGUKKyAqIGxlZnQgdG8gdGhlIGZ1bGwgd2lkdGggb2YgdGhlIGZpZWxkLgorICovCitzdHJ1Y3QgY3Bpb19oZWFkZXIgeworCS8qKiBUaGUgc3RyaW5nICIwNzA3MDEiIG9yICIwNzA3MDIiICovCisJY2hhciBjX21hZ2ljWzZdOworCS8qKiBGaWxlIGlub2RlIG51bWJlciAqLworCWNoYXIgY19pbm9bOF07CisJLyoqIEZpbGUgbW9kZSBhbmQgcGVybWlzc2lvbnMgKi8KKwljaGFyIGNfbW9kZVs4XTsKKwkvKiogRmlsZSB1aWQgKi8KKwljaGFyIGNfdWlkWzhdOworCS8qKiBGaWxlIGdpZCAqLworCWNoYXIgY19naWRbOF07CisJLyoqIE51bWJlciBvZiBsaW5rcyAqLworCWNoYXIgY19ubGlua1s4XTsKKwkvKiogTW9kaWZpY2F0aW9uIHRpbWUgKi8KKwljaGFyIGNfbXRpbWVbOF07CisJLyoqIFNpemUgb2YgZGF0YSBmaWVsZCAqLworCWNoYXIgY19maWxlc2l6ZVs4XTsKKwkvKiogTWFqb3IgcGFydCBvZiBmaWxlIGRldmljZSBudW1iZXIgKi8KKwljaGFyIGNfbWFqWzhdOworCS8qKiBNaW5vciBwYXJ0IG9mIGZpbGUgZGV2aWNlIG51bWJlciAqLworCWNoYXIgY19taW5bOF07CisJLyoqIE1ham9yIHBhcnQgb2YgZGV2aWNlIG5vZGUgcmVmZXJlbmNlICovCisJY2hhciBjX3JtYWpbOF07CisJLyoqIE1pbm9yIHBhcnQgb2YgZGV2aWNlIG5vZGUgcmVmZXJlbmNlICovCisJY2hhciBjX3JtaW5bOF07CisJLyoqIExlbmd0aCBvZiBmaWxlbmFtZSwgaW5jbHVkaW5nIGZpbmFsIE5VTCAqLworCWNoYXIgY19uYW1lc2l6ZVs4XTsKKwkvKiogQ2hlY2tzdW0gb2YgZGF0YSBmaWVsZCBpZiBjX21hZ2ljIGlzIDA3MDcwMiwgb3RoZXJzaXplIHplcm8gKi8KKwljaGFyIGNfY2hrc3VtWzhdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIENQSU8gbWFnaWMgKi8KKyNkZWZpbmUgQ1BJT19NQUdJQyAiMDcwNzAxIgorCitleHRlcm4gdm9pZCBjcGlvX3NldF9maWVsZCAoIGNoYXIgKmZpZWxkLCB1bnNpZ25lZCBsb25nIHZhbHVlICk7CisKKyNlbmRpZiAvKiBfR1BYRV9DUElPX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9jcmMzMi5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2NyYzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNzQzNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9jcmMzMi5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0dQWEVfQ1JDMzJfSAorI2RlZmluZSBfR1BYRV9DUkMzMl9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit1MzIgY3JjMzJfbGUgKCB1MzIgc2VlZCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9jcnlwdG8uaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2RhNWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2NyeXB0by5oCkBAIC0wLDAgKzEsMTU2IEBACisjaWZuZGVmIF9HUFhFX0NSWVBUT19ICisjZGVmaW5lIF9HUFhFX0NSWVBUT19ICisKKy8qKiBAZmlsZQorICoKKyAqIENyeXB0b2dyYXBoaWMgQVBJCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiogQSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gKi8KK3N0cnVjdCBkaWdlc3RfYWxnb3JpdGhtIHsKKwkvKiogQWxnb3JpdGhtIG5hbWUgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKiBDb250ZXh0IHNpemUgKi8KKwlzaXplX3QgY3R4c2l6ZTsKKwkvKiogQmxvY2sgc2l6ZSAqLworCXNpemVfdCBibG9ja3NpemU7CisJLyoqIERpZ2VzdCBzaXplICovCisJc2l6ZV90IGRpZ2VzdHNpemU7CisJLyoqIEluaXRpYWxpc2UgZGlnZXN0CisJICoKKwkgKiBAdiBjdHgJCUNvbnRleHQKKwkgKi8KKwl2b2lkICggKiBpbml0ICkgKCB2b2lkICpjdHggKTsKKwkvKiogVXBkYXRlIGRpZ2VzdCB3aXRoIG5ldyBkYXRhCisJICoKKwkgKiBAdiBjdHgJCUNvbnRleHQKKwkgKiBAdiBzcmMJCURhdGEgdG8gZGlnZXN0CisJICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YQorCSAqCisJICogQHYgbGVuIGlzIG5vdCBuZWNlc3NhcmlseSBhIG11bHRpcGxlIG9mIEBjIGJsb2Nrc2l6ZS4KKwkgKi8KKwl2b2lkICggKiB1cGRhdGUgKSAoIHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuICk7CisJLyoqIEZpbmFsaXNlIGRpZ2VzdAorCSAqCisJICogQHYgY3R4CQlDb250ZXh0CisJICogQHYgb3V0CQlCdWZmZXIgZm9yIGRpZ2VzdCBvdXRwdXQKKwkgKi8KKwl2b2lkICggKiBmaW5hbCApICggdm9pZCAqY3R4LCB2b2lkICpvdXQgKTsKK307CisKKy8qKiBBIGNpcGhlciBhbGdvcml0aG0gKi8KK3N0cnVjdCBjaXBoZXJfYWxnb3JpdGhtIHsKKwkvKiogQWxnb3JpdGhtIG5hbWUgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKiBDb250ZXh0IHNpemUgKi8KKwlzaXplX3QgY3R4c2l6ZTsKKwkvKiogQmxvY2sgc2l6ZSAqLworCXNpemVfdCBibG9ja3NpemU7CisJLyoqIFNldCBrZXkKKwkgKgorCSAqIEB2IGN0eAkJQ29udGV4dAorCSAqIEB2IGtleQkJS2V5CisJICogQHYga2V5bGVuCQlLZXkgbGVuZ3RoCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBzZXRrZXkgKSAoIHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuICk7CisJLyoqIFNldCBpbml0aWFsaXNhdGlvbiB2ZWN0b3IKKwkgKgorCSAqIEB2IGN0eAkJQ29udGV4dAorCSAqIEB2IGl2CQlJbml0aWFsaXNhdGlvbiB2ZWN0b3IKKwkgKi8KKwl2b2lkICggKiBzZXRpdiApICggdm9pZCAqY3R4LCBjb25zdCB2b2lkICppdiApOworCS8qKiBFbmNyeXB0IGRhdGEKKwkgKgorCSAqIEB2IGN0eAkJQ29udGV4dAorCSAqIEB2IHNyYwkJRGF0YSB0byBlbmNyeXB0CisJICogQHYgZHN0CQlCdWZmZXIgZm9yIGVuY3J5cHRlZCBkYXRhCisJICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YQorCSAqCisJICogQHYgbGVuIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiBAYyBibG9ja3NpemUuCisJICovCisJdm9pZCAoICogZW5jcnlwdCApICggdm9pZCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCSAgICAgc2l6ZV90IGxlbiApOworCS8qKiBEZWNyeXB0IGRhdGEKKwkgKgorCSAqIEB2IGN0eAkJQ29udGV4dAorCSAqIEB2IHNyYwkJRGF0YSB0byBkZWNyeXB0CisJICogQHYgZHN0CQlCdWZmZXIgZm9yIGRlY3J5cHRlZCBkYXRhCisJICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YQorCSAqCisJICogQHYgbGVuIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiBAYyBibG9ja3NpemUuCisJICovCisJdm9pZCAoICogZGVjcnlwdCApICggdm9pZCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCSAgICAgc2l6ZV90IGxlbiApOworfTsKKworLyoqIEEgcHVibGljIGtleSBhbGdvcml0aG0gKi8KK3N0cnVjdCBwdWJrZXlfYWxnb3JpdGhtIHsKKwkvKiogQWxnb3JpdGhtIG5hbWUgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKiBDb250ZXh0IHNpemUgKi8KKwlzaXplX3QgY3R4c2l6ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaWdlc3RfaW5pdCAoIHN0cnVjdCBkaWdlc3RfYWxnb3JpdGhtICpkaWdlc3QsCisJCQkJIHZvaWQgKmN0eCApIHsKKwlkaWdlc3QtPmluaXQgKCBjdHggKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRpZ2VzdF91cGRhdGUgKCBzdHJ1Y3QgZGlnZXN0X2FsZ29yaXRobSAqZGlnZXN0LAorCQkJCSAgIHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlkaWdlc3QtPnVwZGF0ZSAoIGN0eCwgZGF0YSwgbGVuICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaWdlc3RfZmluYWwgKCBzdHJ1Y3QgZGlnZXN0X2FsZ29yaXRobSAqZGlnZXN0LAorCQkJCSAgdm9pZCAqY3R4LCB2b2lkICpvdXQgKSB7CisJZGlnZXN0LT5maW5hbCAoIGN0eCwgb3V0ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNpcGhlcl9zZXRrZXkgKCBzdHJ1Y3QgY2lwaGVyX2FsZ29yaXRobSAqY2lwaGVyLAorCQkJCSAgdm9pZCAqY3R4LCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4gKSB7CisJcmV0dXJuIGNpcGhlci0+c2V0a2V5ICggY3R4LCBrZXksIGtleWxlbiApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2lwaGVyX3NldGl2ICggc3RydWN0IGNpcGhlcl9hbGdvcml0aG0gKmNpcGhlciwKKwkJCQkgIHZvaWQgKmN0eCwgY29uc3Qgdm9pZCAqaXYgKSB7CisJY2lwaGVyLT5zZXRpdiAoIGN0eCwgaXYgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNpcGhlcl9lbmNyeXB0ICggc3RydWN0IGNpcGhlcl9hbGdvcml0aG0gKmNpcGhlciwKKwkJCQkgICAgdm9pZCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkgICAgc2l6ZV90IGxlbiApIHsKKwljaXBoZXItPmVuY3J5cHQgKCBjdHgsIHNyYywgZHN0LCBsZW4gKTsKK30KKyNkZWZpbmUgY2lwaGVyX2VuY3J5cHQoIGNpcGhlciwgY3R4LCBzcmMsIGRzdCwgbGVuICkgZG8gewkJXAorCWFzc2VydCAoICggKGxlbikgJiAoIChjaXBoZXIpLT5ibG9ja3NpemUgLSAxICkgKSA9PSAwICk7CVwKKwljaXBoZXJfZW5jcnlwdCAoIChjaXBoZXIpLCAoY3R4KSwgKHNyYyksIChkc3QpLCAobGVuKSApOwlcCisJfSB3aGlsZSAoIDAgKQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2lwaGVyX2RlY3J5cHQgKCBzdHJ1Y3QgY2lwaGVyX2FsZ29yaXRobSAqY2lwaGVyLAorCQkJCSAgICB2b2lkICpjdHgsIGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgICBzaXplX3QgbGVuICkgeworCWNpcGhlci0+ZGVjcnlwdCAoIGN0eCwgc3JjLCBkc3QsIGxlbiApOworfQorI2RlZmluZSBjaXBoZXJfZGVjcnlwdCggY2lwaGVyLCBjdHgsIHNyYywgZHN0LCBsZW4gKSBkbyB7CQlcCisJYXNzZXJ0ICggKCAobGVuKSAmICggKGNpcGhlciktPmJsb2Nrc2l6ZSAtIDEgKSApID09IDAgKTsJXAorCWNpcGhlcl9kZWNyeXB0ICggKGNpcGhlciksIChjdHgpLCAoc3JjKSwgKGRzdCksIChsZW4pICk7CVwKKwl9IHdoaWxlICggMCApCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3N0cmVhbV9jaXBoZXIgKCBzdHJ1Y3QgY2lwaGVyX2FsZ29yaXRobSAqY2lwaGVyICkgeworCXJldHVybiAoIGNpcGhlci0+YmxvY2tzaXplID09IDEgKTsKK30KKworZXh0ZXJuIHN0cnVjdCBkaWdlc3RfYWxnb3JpdGhtIGRpZ2VzdF9udWxsOworZXh0ZXJuIHN0cnVjdCBjaXBoZXJfYWxnb3JpdGhtIGNpcGhlcl9udWxsOworZXh0ZXJuIHN0cnVjdCBwdWJrZXlfYWxnb3JpdGhtIHB1YmtleV9udWxsOworCit2b2lkIGdldF9yYW5kb21fYnl0ZXMgKCB2b2lkICpidWYsIHNpemVfdCBsZW4gKTsKKworI2VuZGlmIC8qIF9HUFhFX0NSWVBUT19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZGV2aWNlLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiM2ZmOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9kZXZpY2UuaApAQCAtMCwwICsxLDExMyBAQAorI2lmbmRlZiBfR1BYRV9ERVZJQ0VfSAorI2RlZmluZSBfR1BYRV9ERVZJQ0VfSAorCisvKioKKyAqIEBmaWxlCisgKgorICogRGV2aWNlIG1vZGVsCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisKKy8qKiBBIGhhcmR3YXJlIGRldmljZSBkZXNjcmlwdGlvbiAqLworc3RydWN0IGRldmljZV9kZXNjcmlwdGlvbiB7CisJLyoqIEJ1cyB0eXBlCisJICoKKwkgKiBUaGlzIG11c3QgYmUgYSBCVVNfVFlQRV9YWFggY29uc3RhbnQuCisJICovCisJdW5zaWduZWQgaW50IGJ1c190eXBlOworCS8qKiBMb2NhdGlvbgorCSAqCisJICogVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgZmllbGQgaXMgYnVzLXR5cGUtc3BlY2lmaWMuCisJICovCisJdW5zaWduZWQgaW50IGxvY2F0aW9uOworCS8qKiBWZW5kb3IgSUQgKi8KKwl1bnNpZ25lZCBpbnQgdmVuZG9yOworCS8qKiBEZXZpY2UgSUQgKi8KKwl1bnNpZ25lZCBpbnQgZGV2aWNlOworCS8qKiBEZXZpY2UgY2xhc3MgKi8KKwl1bnNpZ25lZCBsb25nIGNsYXNzOworCS8qKiBJL08gYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCS8qKiBJUlEgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOworfTsKKworLyoqIFBDSSBidXMgdHlwZSAqLworI2RlZmluZSBCVVNfVFlQRV9QQ0kgMQorCisvKiogSVNBUG5QIGJ1cyB0eXBlICovCisjZGVmaW5lIEJVU19UWVBFX0lTQVBOUCAyCisKKy8qKiBFSVNBIGJ1cyB0eXBlICovCisjZGVmaW5lIEJVU19UWVBFX0VJU0EgMworCisvKiogTUNBIGJ1cyB0eXBlICovCisjZGVmaW5lIEJVU19UWVBFX01DQSA0CisKKy8qKiBJU0EgYnVzIHR5cGUgKi8KKyNkZWZpbmUgQlVTX1RZUEVfSVNBIDUKKworLyoqIEEgaGFyZHdhcmUgZGV2aWNlICovCitzdHJ1Y3QgZGV2aWNlIHsKKwkvKiogTmFtZSAqLworCWNoYXIgbmFtZVsxNl07CisJLyoqIERldmljZSBkZXNjcmlwdGlvbiAqLworCXN0cnVjdCBkZXZpY2VfZGVzY3JpcHRpb24gZGVzYzsKKwkvKiogRGV2aWNlcyBvbiB0aGUgc2FtZSBidXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNpYmxpbmdzOworCS8qKiBEZXZpY2VzIGF0dGFjaGVkIHRvIHRoaXMgZGV2aWNlICovCisJc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsKKwkvKiogQnVzIGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKK307CisKKy8qKgorICogQSByb290IGRldmljZQorICoKKyAqIFJvb3QgZGV2aWNlcyBhcmUgc3lzdGVtIGJ1c2VzIHN1Y2ggYXMgUENJLCBFSVNBLCBldGMuCisgKgorICovCitzdHJ1Y3Qgcm9vdF9kZXZpY2UgeworCS8qKiBEZXZpY2UgY2hhaW4KKwkgKgorCSAqIEEgcm9vdCBkZXZpY2UgaGFzIGEgTlVMTCBwYXJlbnQgZmllbGQuCisJICovCisJc3RydWN0IGRldmljZSBkZXY7CisJLyoqIFJvb3QgZGV2aWNlIGRyaXZlciAqLworCXN0cnVjdCByb290X2RyaXZlciAqZHJpdmVyOworfTsKKworLyoqIEEgcm9vdCBkZXZpY2UgZHJpdmVyICovCitzdHJ1Y3Qgcm9vdF9kcml2ZXIgeworCS8qKgorCSAqIEFkZCByb290IGRldmljZQorCSAqCisJICogQHYgcm9vdGRldglSb290IGRldmljZQorCSAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisJICoKKwkgKiBDYWxsZWQgZnJvbSBwcm9iZV9kZXZpY2VzKCkgZm9yIGFsbCByb290IGRldmljZXMgaW4gdGhlIGJ1aWxkLgorCSAqLworCWludCAoICogcHJvYmUgKSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApOworCS8qKgorCSAqIFJlbW92ZSByb290IGRldmljZQorCSAqCisJICogQHYgcm9vdGRldglSb290IGRldmljZQorCSAqCisJICogQ2FsbGVkIGZyb20gcmVtb3ZlX2RldmljZSgpIGZvciBhbGwgc3VjY2Vzc2Z1bGx5LXByb2JlZAorCSAqIHJvb3QgZGV2aWNlcy4KKwkgKi8KKwl2b2lkICggKiByZW1vdmUgKSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApOworfTsKKworLyoqIFJvb3QgZGV2aWNlIHRhYmxlICovCisjZGVmaW5lIFJPT1RfREVWSUNFUyBfX3RhYmxlICggc3RydWN0IHJvb3RfZGV2aWNlLCAicm9vdF9kZXZpY2VzIiApCisKKy8qKiBEZWNsYXJlIGEgcm9vdCBkZXZpY2UgKi8KKyNkZWZpbmUgX19yb290X2RldmljZSBfX3RhYmxlX2VudHJ5ICggUk9PVF9ERVZJQ0VTLCAwMSApCisKKyNlbmRpZiAvKiBfR1BYRV9ERVZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2RoY3AuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9kaGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmZThlZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9kaGNwLmgKQEAgLTAsMCArMSw2MzcgQEAKKyNpZm5kZWYgX0dQWEVfREhDUF9ICisjZGVmaW5lIF9HUFhFX0RIQ1BfSAorCisvKiogQGZpbGUKKyAqCisgKiBEeW5hbWljIEhvc3QgQ29uZmlndXJhdGlvbiBQcm90b2NvbAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisjaW5jbHVkZSA8Z3B4ZS9saXN0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9yZWZjbnQuaD4KKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorI2luY2x1ZGUgPGdweGUvdXVpZC5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS91YWNjZXNzLmg+CisKK3N0cnVjdCBqb2JfaW50ZXJmYWNlOworc3RydWN0IGRoY3Bfb3B0aW9uczsKK3N0cnVjdCBkaGNwX3BhY2tldDsKKworLyoqIEJPT1RQL0RIQ1Agc2VydmVyIHBvcnQgKi8KKyNkZWZpbmUgQk9PVFBTX1BPUlQgNjcKKworLyoqIEJPT1RQL0RIQ1AgY2xpZW50IHBvcnQgKi8KKyNkZWZpbmUgQk9PVFBDX1BPUlQgNjgKKworLyoqIFBYRSBzZXJ2ZXIgcG9ydCAqLworI2RlZmluZSBQWEVfUE9SVCA0MDExCisKKy8qKiBDb25zdHJ1Y3QgYSB0YWcgdmFsdWUgZm9yIGFuIGVuY2Fwc3VsYXRlZCBvcHRpb24KKyAqCisgKiBUaGlzIHRhZyB2YWx1ZSBjYW4gYmUgcGFzc2VkIHRvIEV0aGVyYm9vdCBmdW5jdGlvbnMgd2hlbiBzZWFyY2hpbmcKKyAqIGZvciBESENQIG9wdGlvbnMgaW4gb3JkZXIgdG8gc2VhcmNoIGZvciBhIHRhZyB3aXRoaW4gYW4KKyAqIGVuY2Fwc3VsYXRlZCBvcHRpb25zIGJsb2NrLgorICovCisjZGVmaW5lIERIQ1BfRU5DQVBfT1BUKCBlbmNhcHN1bGF0b3IsIGVuY2Fwc3VsYXRlZCApIFwKKwkoICggKGVuY2Fwc3VsYXRvcikgPDwgOCApIHwgKGVuY2Fwc3VsYXRlZCkgKQorLyoqIEV4dHJhY3QgZW5jYXBzdWxhdGluZyBvcHRpb24gYmxvY2sgdGFnIGZyb20gZW5jYXBzdWxhdGVkIHRhZyB2YWx1ZSAqLworI2RlZmluZSBESENQX0VOQ0FQU1VMQVRPUiggZW5jYXBfb3B0ICkgKCAoZW5jYXBfb3B0KSA+PiA4ICkKKy8qKiBFeHRyYWN0IGVuY2Fwc3VsYXRlZCBvcHRpb24gdGFnIGZyb20gZW5jYXBzdWxhdGVkIHRhZyB2YWx1ZSAqLworI2RlZmluZSBESENQX0VOQ0FQU1VMQVRFRCggZW5jYXBfb3B0ICkgKCAoZW5jYXBfb3B0KSAmIDB4ZmYgKQorLyoqIE9wdGlvbiBpcyBlbmNhcHN1bGF0ZWQgKi8KKyNkZWZpbmUgREhDUF9JU19FTkNBUF9PUFQoIG9wdCApIERIQ1BfRU5DQVBTVUxBVE9SKCBvcHQgKQorCisvKioKKyAqIEBkZWZncm91cCBkaGNwb3B0cyBESENQIG9wdGlvbiB0YWdzCisgKiBAeworICovCisKKy8qKiBQYWRkaW5nCisgKgorICogVGhpcyB0YWcgZG9lcyBub3QgaGF2ZSBhIGxlbmd0aCBmaWVsZDsgaXQgaXMgYWx3YXlzIG9ubHkgYSBzaW5nbGUKKyAqIGJ5dGUgaW4gbGVuZ3RoLgorICovCisjZGVmaW5lIERIQ1BfUEFEIDAKKworLyoqIE1pbmltdW0gbm9ybWFsIERIQ1Agb3B0aW9uICovCisjZGVmaW5lIERIQ1BfTUlOX09QVElPTiAxCisKKy8qKiBTdWJuZXQgbWFzayAqLworI2RlZmluZSBESENQX1NVQk5FVF9NQVNLIDEKKworLyoqIFJvdXRlcnMgKi8KKyNkZWZpbmUgREhDUF9ST1VURVJTIDMKKworLyoqIEROUyBzZXJ2ZXJzICovCisjZGVmaW5lIERIQ1BfRE5TX1NFUlZFUlMgNgorCisvKiogU3lzbG9nIHNlcnZlcnMgKi8KKyNkZWZpbmUgREhDUF9MT0dfU0VSVkVSUyA3CisKKy8qKiBIb3N0IG5hbWUgKi8KKyNkZWZpbmUgREhDUF9IT1NUX05BTUUgMTIKKworLyoqIERvbWFpbiBuYW1lICovCisjZGVmaW5lIERIQ1BfRE9NQUlOX05BTUUgMTUKKworLyoqIFJvb3QgcGF0aCAqLworI2RlZmluZSBESENQX1JPT1RfUEFUSCAxNworCisvKiogVmVuZG9yIGVuY2Fwc3VsYXRlZCBvcHRpb25zICovCisjZGVmaW5lIERIQ1BfVkVORE9SX0VOQ0FQIDQzCisKKy8qKiBQWEUgYm9vdCBzZXJ2ZXIgZGlzY292ZXJ5IGNvbnRyb2wgKi8KKyNkZWZpbmUgREhDUF9QWEVfRElTQ09WRVJZX0NPTlRST0wgREhDUF9FTkNBUF9PUFQgKCBESENQX1ZFTkRPUl9FTkNBUCwgNiApCisKKy8qKiBQWEUgYm9vdCBzZXJ2ZXIgZGlzY292ZXJ5IGNvbnRyb2wgYml0cyAqLworZW51bSBkaGNwX3B4ZV9kaXNjb3ZlcnlfY29udHJvbCB7CisJLyoqIEluaGliaXQgYnJvYWRjYXN0IGRpc2NvdmVyeSAqLworCVBYRUJTX05PX0JST0FEQ0FTVCA9IDEsCisJLyoqIEluaGliaXQgbXVsdGljYXN0IGRpc2NvdmVyeSAqLworCVBYRUJTX05PX01VTFRJQ0FTVCA9IDIsCisJLyoqIEFjY2VwdCBvbmx5IHNlcnZlcnMgaW4gREhDUF9QWEVfQk9PVF9TRVJWRVJTIGxpc3QgKi8KKwlQWEVCU19OT19VTktOT1dOX1NFUlZFUlMgPSA0LAorCS8qKiBTa2lwIGRpc2NvdmVyeSBpZiBmaWxlbmFtZSBwcmVzZW50ICovCisJUFhFQlNfU0tJUCA9IDgsCit9OworCisvKiogUFhFIGJvb3Qgc2VydmVyIG11bHRpY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIERIQ1BfUFhFX0JPT1RfU0VSVkVSX01DQVNUIERIQ1BfRU5DQVBfT1BUICggREhDUF9WRU5ET1JfRU5DQVAsIDcgKQorCisvKiogUFhFIGJvb3Qgc2VydmVycyAqLworI2RlZmluZSBESENQX1BYRV9CT09UX1NFUlZFUlMgREhDUF9FTkNBUF9PUFQgKCBESENQX1ZFTkRPUl9FTkNBUCwgOCApCisKKy8qKiBQWEUgYm9vdCBzZXJ2ZXIgKi8KK3N0cnVjdCBkaGNwX3B4ZV9ib290X3NlcnZlciB7CisJLyoqICJUeXBlIiAqLworCXVpbnQxNl90IHR5cGU7CisJLyoqIE51bWJlciBvZiBJUHY0IGFkZHJlc3NlcyAqLworCXVpbnQ4X3QgbnVtX2lwOworCS8qKiBJUHY0IGFkZHJlc3NlcyAqLworCXN0cnVjdCBpbl9hZGRyIGlwWzBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFBYRSBib290IG1lbnUgKi8KKyNkZWZpbmUgREhDUF9QWEVfQk9PVF9NRU5VIERIQ1BfRU5DQVBfT1BUICggREhDUF9WRU5ET1JfRU5DQVAsIDkgKQorCisvKiogUFhFIGJvb3QgbWVudSAqLworc3RydWN0IGRoY3BfcHhlX2Jvb3RfbWVudSB7CisJLyoqICJUeXBlIiAqLworCXVpbnQxNl90IHR5cGU7CisJLyoqIERlc2NyaXB0aW9uIGxlbmd0aCAqLworCXVpbnQ4X3QgZGVzY19sZW47CisJLyoqIERlc2NyaXB0aW9uICovCisJY2hhciBkZXNjWzBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFBYRSBib290IG1lbnUgcHJvbXB0ICovCisjZGVmaW5lIERIQ1BfUFhFX0JPT1RfTUVOVV9QUk9NUFQgREhDUF9FTkNBUF9PUFQgKCBESENQX1ZFTkRPUl9FTkNBUCwgMTAgKQorCisvKiogUFhFIGJvb3QgbWVudSBwcm9tcHQgKi8KK3N0cnVjdCBkaGNwX3B4ZV9ib290X21lbnVfcHJvbXB0IHsKKwkvKiogVGltZW91dAorCSAqCisJICogQSB2YWx1ZSBvZiAwIG1lYW5zICJ0aW1lIG91dCBpbW1lZGlhdGVseSBhbmQgc2VsZWN0IGZpcnN0CisJICogYm9vdCBpdGVtLCB3aXRob3V0IGRpc3BsYXlpbmcgdGhlIHByb21wdCIuICBBIHZhbHVlIG9mIDI1NQorCSAqIG1lYW5zICJkaXNwbGF5IG1lbnUgaW1tZWRpYXRlbHkgd2l0aCBubyB0aW1lb3V0Ii4gIEFueQorCSAqIG90aGVyIHZhbHVlIG1lYW5zICJkaXNwbGF5IHByb21wdCwgd2FpdCB0aGlzIG1hbnkgc2Vjb25kcworCSAqIGZvciBrZXlwcmVzcywgaWYga2V5IGlzIEY4LCBkaXNwbGF5IG1lbnUsIG90aGVyd2lzZSBzZWxlY3QKKwkgKiBmaXJzdCBib290IGl0ZW0iLgorCSAqLworCXVpbnQ4X3QgdGltZW91dDsKKwkvKiogUHJvbXB0IHRvIHByZXNzIEY4ICovCisJY2hhciBwcm9tcHRbMF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogUFhFIGJvb3QgbWVudSBpdGVtICovCisjZGVmaW5lIERIQ1BfUFhFX0JPT1RfTUVOVV9JVEVNIERIQ1BfRU5DQVBfT1BUICggREhDUF9WRU5ET1JfRU5DQVAsIDcxICkKKworLyoqIFBYRSBib290IG1lbnUgaXRlbSAqLworc3RydWN0IGRoY3BfcHhlX2Jvb3RfbWVudV9pdGVtIHsKKwkvKiogIlR5cGUiCisJICoKKwkgKiBUaGlzIGZpZWxkIGFjdHVhbGx5IGlkZW50aWZpZXMgdGhlIHNwZWNpZmljIGJvb3Qgc2VydmVyIChvcgorCSAqIGNsdXN0ZXIgb2YgYm9vdCBzZXJ2ZXJzIG9mZmVyaW5nIGlkZW50aWNhbCBib290IGZpbGVzKS4KKwkgKi8KKwl1aW50MTZfdCB0eXBlOworCS8qKiAiTGF5ZXIiCisJICoKKwkgKiBKdXN0IGRvbid0IGFzay4KKwkgKi8KKwl1aW50MTZfdCBsYXllcjsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBSZXF1ZXN0ZWQgSVAgYWRkcmVzcyAqLworI2RlZmluZSBESENQX1JFUVVFU1RFRF9BRERSRVNTIDUwCisKKy8qKiBMZWFzZSB0aW1lICovCisjZGVmaW5lIERIQ1BfTEVBU0VfVElNRSA1MQorCisvKiogT3B0aW9uIG92ZXJsb2FkaW5nCisgKgorICogVGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uIGlzIHRoZSBiaXR3aXNlLU9SIG9mIHplcm8gb3IgbW9yZQorICogREhDUF9PUFRJT05fT1ZFUkxPQURfWFhYIGNvbnN0YW50cy4KKyAqLworI2RlZmluZSBESENQX09QVElPTl9PVkVSTE9BRCA1MgorCisvKiogVGhlICJmaWxlIiBmaWVsZCBpcyBvdmVybG9hZGVkIHRvIGNvbnRhaW4gZXh0cmEgREhDUCBvcHRpb25zICovCisjZGVmaW5lIERIQ1BfT1BUSU9OX09WRVJMT0FEX0ZJTEUgMQorCisvKiogVGhlICJzbmFtZSIgZmllbGQgaXMgb3ZlcmxvYWRlZCB0byBjb250YWluIGV4dHJhIERIQ1Agb3B0aW9ucyAqLworI2RlZmluZSBESENQX09QVElPTl9PVkVSTE9BRF9TTkFNRSAyCisKKy8qKiBESENQIG1lc3NhZ2UgdHlwZSAqLworI2RlZmluZSBESENQX01FU1NBR0VfVFlQRSA1MworI2RlZmluZSBESENQTk9ORSAwCisjZGVmaW5lIERIQ1BESVNDT1ZFUiAxCisjZGVmaW5lIERIQ1BPRkZFUiAyCisjZGVmaW5lIERIQ1BSRVFVRVNUIDMKKyNkZWZpbmUgREhDUERFQ0xJTkUgNAorI2RlZmluZSBESENQQUNLIDUKKyNkZWZpbmUgREhDUE5BSyA2CisjZGVmaW5lIERIQ1BSRUxFQVNFIDcKKyNkZWZpbmUgREhDUElORk9STSA4CisKKy8qKiBESENQIHNlcnZlciBpZGVudGlmaWVyICovCisjZGVmaW5lIERIQ1BfU0VSVkVSX0lERU5USUZJRVIgNTQKKworLyoqIFBhcmFtZXRlciByZXF1ZXN0IGxpc3QgKi8KKyNkZWZpbmUgREhDUF9QQVJBTUVURVJfUkVRVUVTVF9MSVNUIDU1CisKKy8qKiBNYXhpbXVtIERIQ1AgbWVzc2FnZSBzaXplICovCisjZGVmaW5lIERIQ1BfTUFYX01FU1NBR0VfU0laRSA1NworCisvKiogVmVuZG9yIGNsYXNzIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgREhDUF9WRU5ET1JfQ0xBU1NfSUQgNjAKKworLyoqIENsaWVudCBpZGVudGlmaWVyICovCisjZGVmaW5lIERIQ1BfQ0xJRU5UX0lEIDYxCisKKy8qKiBDbGllbnQgaWRlbnRpZmllciAqLworc3RydWN0IGRoY3BfY2xpZW50X2lkIHsKKwkvKiogTGluay1sYXllciBwcm90b2NvbCAqLworCXVpbnQ4X3QgbGxfcHJvdG87CisJLyoqIExpbmstbGF5ZXIgYWRkcmVzcyAqLworCXVpbnQ4X3QgbGxfYWRkcltNQVhfTExfQUREUl9MRU5dOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFRGVFAgc2VydmVyIG5hbWUKKyAqCisgKiBUaGlzIG9wdGlvbiByZXBsYWNlcyB0aGUgZml4ZWQgInNuYW1lIiBmaWVsZCwgd2hlbiB0aGF0IGZpZWxkIGlzCisgKiB1c2VkIHRvIGNvbnRhaW4gb3ZlcmxvYWRlZCBvcHRpb25zLgorICovCisjZGVmaW5lIERIQ1BfVEZUUF9TRVJWRVJfTkFNRSA2NgorCisvKiogQm9vdGZpbGUgbmFtZQorICoKKyAqIFRoaXMgb3B0aW9uIHJlcGxhY2VzIHRoZSBmaXhlZCAiZmlsZSIgZmllbGQsIHdoZW4gdGhhdCBmaWVsZCBpcworICogdXNlZCB0byBjb250YWluIG92ZXJsb2FkZWQgb3B0aW9ucy4KKyAqLworI2RlZmluZSBESENQX0JPT1RGSUxFX05BTUUgNjcKKworLyoqIFVzZXIgY2xhc3MgaWRlbnRpZmllciAqLworI2RlZmluZSBESENQX1VTRVJfQ0xBU1NfSUQgNzcKKworLyoqIENsaWVudCBzeXN0ZW0gYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIERIQ1BfQ0xJRU5UX0FSQ0hJVEVDVFVSRSA5MworCisvKiogQ2xpZW50IG5ldHdvcmsgZGV2aWNlIGludGVyZmFjZSAqLworI2RlZmluZSBESENQX0NMSUVOVF9OREkgOTQKKworLyoqIFVVSUQgY2xpZW50IGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgREhDUF9DTElFTlRfVVVJRCA5NworCisvKiogVVVJRCBjbGllbnQgaWRlbnRpZmllciAqLworc3RydWN0IGRoY3BfY2xpZW50X3V1aWQgeworCS8qKiBJZGVudGlmaWVyIHR5cGUgKi8KKwl1aW50OF90IHR5cGU7CisJLyoqIFVVSUQgKi8KKwl1bmlvbiB1dWlkIHV1aWQ7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisjZGVmaW5lIERIQ1BfQ0xJRU5UX1VVSURfVFlQRSAwCisKKy8qKiBFdGhlcmJvb3Qtc3BlY2lmaWMgZW5jYXBzdWxhdGVkIG9wdGlvbnMKKyAqCisgKiBUaGlzIGVuY2Fwc3VsYXRlZCBvcHRpb25zIGZpZWxkIGlzIHVzZWQgdG8gY29udGFpbiBhbGwgb3B0aW9ucworICogc3BlY2lmaWMgdG8gRXRoZXJib290IChpLmUuIG5vdCBhc3NpZ25lZCBieSBJQU5BIG9yIG90aGVyIHN0YW5kYXJkcworICogYm9kaWVzKS4KKyAqLworI2RlZmluZSBESENQX0VCX0VOQ0FQIDE3NQorCisvKiogUHJpb3JpdHkgb2YgdGhpcyBvcHRpb25zIGJsb2NrCisgKgorICogVGhpcyBpcyBhIHNpZ25lZCA4LWJpdCBpbnRlZ2VyIGZpZWxkIGluZGljYXRpbmcgdGhlIHByaW9yaXR5IG9mCisgKiB0aGlzIGJsb2NrIG9mIG9wdGlvbnMuICBJdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWxhdGl2ZQorICogcHJpb3JpdHkgb2YgbXVsdGlwbGUgb3B0aW9uIGJsb2NrcyAoZS5nLiBvcHRpb25zIGZyb20gbm9uLXZvbGF0aWxlCisgKiBzdG9yYWdlIHZlcnN1cyBvcHRpb25zIGZyb20gYSBESENQIHNlcnZlcikuCisgKi8KKyNkZWZpbmUgREhDUF9FQl9QUklPUklUWSBESENQX0VOQ0FQX09QVCAoIERIQ1BfRUJfRU5DQVAsIDB4MDEgKQorCisvKiogIllvdXIiIElQIGFkZHJlc3MKKyAqCisgKiBUaGlzIG9wdGlvbiBpcyB1c2VkIGludGVybmFsbHkgdG8gY29udGFpbiB0aGUgdmFsdWUgb2YgdGhlICJ5aWFkZHIiCisgKiBmaWVsZCwgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgYXBwcm9hY2ggdG8gc3RvcmluZyBhbmQKKyAqIHByb2Nlc3Npbmcgb3B0aW9ucy4gIEl0IHNob3VsZCBuZXZlciBiZSBwcmVzZW50IGluIGEgREhDUCBwYWNrZXQuCisgKi8KKyNkZWZpbmUgREhDUF9FQl9ZSUFERFIgREhDUF9FTkNBUF9PUFQgKCBESENQX0VCX0VOQ0FQLCAweDAyICkKKworLyoqICJTZXJ2ZXIiIElQIGFkZHJlc3MKKyAqCisgKiBUaGlzIG9wdGlvbiBpcyB1c2VkIGludGVybmFsbHkgdG8gY29udGFpbiB0aGUgdmFsdWUgb2YgdGhlICJzaWFkZHIiCisgKiBmaWVsZCwgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgYXBwcm9hY2ggdG8gc3RvcmluZyBhbmQKKyAqIHByb2Nlc3Npbmcgb3B0aW9ucy4gIEl0IHNob3VsZCBuZXZlciBiZSBwcmVzZW50IGluIGEgREhDUCBwYWNrZXQuCisgKi8KKyNkZWZpbmUgREhDUF9FQl9TSUFERFIgREhDUF9FTkNBUF9PUFQgKCBESENQX0VCX0VOQ0FQLCAweDAzICkKKworLyoqIEtlZXAgU0FOIGRyaXZlIHJlZ2lzdGVyZWQKKyAqCisgKiBJZiBzZXQgdG8gYSBub24temVybyB2YWx1ZSwgZ1BYRSB3aWxsIG5vdCBkZXRhY2ggYW55IFNBTiBkcml2ZQorICogYWZ0ZXIgZmFpbGluZyB0byBib290IGZyb20gaXQuICAoVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgaW4gb3JkZXIKKyAqIHRvIHBlcmZvcm0gYSBXaW5kb3dzIFNlcnZlciAyMDA4IGluc3RhbGxhdGlvbiBkaXJlY3QgdG8gYW4gaVNDU0kKKyAqIHRhcmdldC4pCisgKi8KKyNkZWZpbmUgREhDUF9FQl9LRUVQX1NBTiBESENQX0VOQ0FQX09QVCAoIERIQ1BfRUJfRU5DQVAsIDB4MDggKQorCisvKgorICogVGFncyBpbiB0aGUgcmFuZ2UgMHgxMC0weDdmIGFyZSByZXNlcnZlZCBmb3IgZmVhdHVyZSBtYXJrZXJzCisgKgorICovCisKKy8qKiBTa2lwIFBYRSBESENQIHByb3RvY29sIGV4dGVuc2lvbnMgc3VjaCBhcyBQcm94eURIQ1AKKyAqCisgKiBJZiBzZXQgdG8gYSBub24temVybyB2YWx1ZSwgZ1BYRSB3aWxsIG5vdCB3YWl0IGZvciBQcm94eURIQ1Agb2ZmZXJzCisgKiBhbmQgd2lsbCBpZ25vcmUgYW55IFBYRS1zcGVjaWZpYyBESENQIG9wdGlvbnMgdGhhdCBpdCByZWNlaXZlcy4KKyAqLworI2RlZmluZSBESENQX0VCX05PX1BYRURIQ1AgREhDUF9FTkNBUF9PUFQgKCBESENQX0VCX0VOQ0FQLCAweGIwICkKKworLyoqIE5ldHdvcmsgZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBCeXRlIDAgaXMgdGhlIGJ1cyB0eXBlIElEOyByZW1haW5pbmcgYnl0ZXMgZGVwZW5kIG9uIHRoZSBidXMgdHlwZS4KKyAqCisgKiBQQ0kgZGV2aWNlczoKKyAqIEJ5dGUgMCA6IDEgKFBDSSkKKyAqIEJ5dGUgMSA6IFBDSSB2ZW5kb3IgSUQgTVNCCisgKiBCeXRlIDIgOiBQQ0kgdmVuZG9yIElEIExTQgorICogQnl0ZSAzIDogUENJIGRldmljZSBJRCBNU0IKKyAqIEJ5dGUgNCA6IFBDSSBkZXZpY2UgSUQgTFNCCisgKi8KKyNkZWZpbmUgREhDUF9FQl9CVVNfSUQgREhDUF9FTkNBUF9PUFQgKCBESENQX0VCX0VOQ0FQLCAweGIxICkKKworLyoqIE5ldHdvcmsgZGV2aWNlIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBkaGNwX25ldGRldl9kZXNjIHsKKwkvKiogQnVzIHR5cGUgSUQgKi8KKwl1aW50OF90IHR5cGU7CisJLyoqIFZlbmRvciBJRCAqLworCXVpbnQxNl90IHZlbmRvcjsKKwkvKiogRGV2aWNlIElEICovCisJdWludDE2X3QgZGV2aWNlOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFVzZSBjYWNoZWQgbmV0d29yayBzZXR0aW5ncworICoKKyAqIENhY2hlZCBuZXR3b3JrIHNldHRpbmdzIG1heSBiZSBhdmFpbGFibGUgZnJvbSBhIHByaW9yIERIQ1AgcmVxdWVzdAorICogKGlmIHJ1bm5pbmcgYXMgYSBQWEUgTkJQKSwgbm9uLXZvbGF0aWxlIHN0b3JhZ2Ugb24gdGhlIE5JQywgb3IKKyAqIHNldHRpbmdzIHNldCB2aWEgdGhlIGNvbW1hbmQgbGluZSBvciBhbiBlbWJlZGRlZCBpbWFnZS4gSWYgdGhpcworICogZmxhZyBpcyBub3Qgc2V0LCBpdCB3aWxsIGJlIGFzc3VtZWQgdGhhdCB0aG9zZSBzb3VyY2VzIGFyZQorICogaW5zdWZmaWNpZW50IGFuZCB0aGF0IERIQ1Agc2hvdWxkIHN0aWxsIGJlIHJ1biB3aGVuIGF1dG9ib290aW5nLgorICovCisjZGVmaW5lIERIQ1BfRUJfVVNFX0NBQ0hFRCBESENQX0VOQ0FQX09QVCAoIERIQ1BfRUJfRU5DQVAsIDB4YjIgKQorCisvKiogQklPUyBkcml2ZSBudW1iZXIKKyAqCisgKiBUaGlzIGlzIHRoZSBkcml2ZSBudW1iZXIgZm9yIGEgZHJpdmUgZW11bGF0ZWQgdmlhIElOVCAxMy4gIDB4ODAgaXMKKyAqIHRoZSBmaXJzdCBoYXJkIGRpc2ssIDB4ODEgaXMgdGhlIHNlY29uZCBoYXJkIGRpc2ssIGV0Yy4KKyAqLworI2RlZmluZSBESENQX0VCX0JJT1NfRFJJVkUgREhDUF9FTkNBUF9PUFQgKCBESENQX0VCX0VOQ0FQLCAweGJkICkKKworLyoqIFVzZXJuYW1lCisgKgorICogVGhpcyB3aWxsIGJlIHVzZWQgYXMgdGhlIHVzZXJuYW1lIGZvciBhbnkgcmVxdWlyZWQgYXV0aGVudGljYXRpb24uCisgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoaXMgb3B0aW9uJ3MgdmFsdWUgd2lsbCBiZSBoZWxkIGluCisgKiBub24tdm9sYXRpbGUgc3RvcmFnZSwgcmF0aGVyIHRoYW4gdHJhbnNtaXR0ZWQgYXMgcGFydCBvZiBhIERIQ1AKKyAqIHBhY2tldC4KKyAqLworI2RlZmluZSBESENQX0VCX1VTRVJOQU1FIERIQ1BfRU5DQVBfT1BUICggREhDUF9FQl9FTkNBUCwgMHhiZSApCisKKy8qKiBQYXNzd29yZAorICoKKyAqIFRoaXMgd2lsbCBiZSB1c2VkIGFzIHRoZSBwYXNzd29yZCBmb3IgYW55IHJlcXVpcmVkIGF1dGhlbnRpY2F0aW9uLgorICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGlzIG9wdGlvbidzIHZhbHVlIHdpbGwgYmUgaGVsZCBpbgorICogbm9uLXZvbGF0aWxlIHN0b3JhZ2UsIHJhdGhlciB0aGFuIHRyYW5zbWl0dGVkIGFzIHBhcnQgb2YgYSBESENQCisgKiBwYWNrZXQuCisgKi8KKyNkZWZpbmUgREhDUF9FQl9QQVNTV09SRCBESENQX0VOQ0FQX09QVCAoIERIQ1BfRUJfRU5DQVAsIDB4YmYgKQorCisvKiogUmV2ZXJzZSB1c2VybmFtZQorICoKKyAqIFRoaXMgd2lsbCBiZSB1c2VkIGFzIHRoZSByZXZlcnNlIHVzZXJuYW1lIChpLmUuIHRoZSB1c2VybmFtZQorICogcHJvdmlkZWQgYnkgdGhlIHNlcnZlcikgZm9yIGFueSByZXF1aXJlZCBhdXRoZW50aWNhdGlvbi4gIEl0IGlzCisgKiBleHBlY3RlZCB0aGF0IHRoaXMgb3B0aW9uJ3MgdmFsdWUgd2lsbCBiZSBoZWxkIGluIG5vbi12b2xhdGlsZQorICogc3RvcmFnZSwgcmF0aGVyIHRoYW4gdHJhbnNtaXR0ZWQgYXMgcGFydCBvZiBhIERIQ1AgcGFja2V0LgorICovCisjZGVmaW5lIERIQ1BfRUJfUkVWRVJTRV9VU0VSTkFNRSBESENQX0VOQ0FQX09QVCAoIERIQ1BfRUJfRU5DQVAsIDB4YzAgKQorCisvKiogUmV2ZXJzZSBwYXNzd29yZAorICoKKyAqIFRoaXMgd2lsbCBiZSB1c2VkIGFzIHRoZSByZXZlcnNlIHBhc3N3b3JkIChpLmUuIHRoZSBwYXNzd29yZAorICogcHJvdmlkZWQgYnkgdGhlIHNlcnZlcikgZm9yIGFueSByZXF1aXJlZCBhdXRoZW50aWNhdGlvbi4gIEl0IGlzCisgKiBleHBlY3RlZCB0aGF0IHRoaXMgb3B0aW9uJ3MgdmFsdWUgd2lsbCBiZSBoZWxkIGluIG5vbi12b2xhdGlsZQorICogc3RvcmFnZSwgcmF0aGVyIHRoYW4gdHJhbnNtaXR0ZWQgYXMgcGFydCBvZiBhIERIQ1AgcGFja2V0LgorICovCisjZGVmaW5lIERIQ1BfRUJfUkVWRVJTRV9QQVNTV09SRCBESENQX0VOQ0FQX09QVCAoIERIQ1BfRUJfRU5DQVAsIDB4YzEgKQorCisvKiogZ1BYRSB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBESENQX0VCX1ZFUlNJT04gREhDUF9FTkNBUF9PUFQgKCBESENQX0VCX0VOQ0FQLCAweGViICkKKworLyoqIGlTQ1NJIHByaW1hcnkgdGFyZ2V0IElRTiAqLworI2RlZmluZSBESENQX0lTQ1NJX1BSSU1BUllfVEFSR0VUX0lRTiAyMDEKKworLyoqIGlTQ1NJIHNlY29uZGFyeSB0YXJnZXQgSVFOICovCisjZGVmaW5lIERIQ1BfSVNDU0lfU0VDT05EQVJZX1RBUkdFVF9JUU4gMjAyCisKKy8qKiBpU0NTSSBpbml0aWF0b3IgSVFOICovCisjZGVmaW5lIERIQ1BfSVNDU0lfSU5JVElBVE9SX0lRTiAyMDMKKworLyoqIE1heGltdW0gbm9ybWFsIERIQ1Agb3B0aW9uICovCisjZGVmaW5lIERIQ1BfTUFYX09QVElPTiAyNTQKKworLyoqIEVuZCBvZiBvcHRpb25zCisgKgorICogVGhpcyB0YWcgZG9lcyBub3QgaGF2ZSBhIGxlbmd0aCBmaWVsZDsgaXQgaXMgYWx3YXlzIG9ubHkgYSBzaW5nbGUKKyAqIGJ5dGUgaW4gbGVuZ3RoLgorICovCisjZGVmaW5lIERIQ1BfRU5EIDI1NQorCisvKiogQH0gKi8KKworLyoqCisgKiBDb3VudCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGEgdmFyaWFkaWMgbWFjcm8KKyAqCisgKiBUaGlzIHJhdGhlciBuZWF0LCBub24taXRlcmF0aXZlIHNvbHV0aW9uIGlzIGNvdXJ0ZXN5IG9mIExhdXJlbnQKKyAqIERlbmlhdS4KKyAqCisgKi8KKyNkZWZpbmUgX1ZBX0FSR19DT1VOVCggIF8xLCAgXzIsICBfMywgIF80LCAgXzUsICBfNiwgIF83LCAgXzgsCQlcCisJCSAgICAgICAgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNiwJCVwKKwkJICAgICAgIF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LAkJXAorCQkgICAgICAgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIsCQlcCisJCSAgICAgICBfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwJCVwKKwkJICAgICAgIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4LAkJXAorCQkgICAgICAgXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsCQlcCisJCSAgICAgICBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsICAgTiwgLi4uICkgTgorI2RlZmluZSBWQV9BUkdfQ09VTlQoIC4uLiApCQkJCQkJXAorCV9WQV9BUkdfQ09VTlQgKCBfX1ZBX0FSR1NfXywgCQkJCQlcCisJCQk2MywgNjIsIDYxLCA2MCwgNTksIDU4LCA1NywgNTYsCQkJXAorCQkJNTUsIDU0LCA1MywgNTIsIDUxLCA1MCwgNDksIDQ4LAkJCVwKKwkJCTQ3LCA0NiwgNDUsIDQ0LCA0MywgNDIsIDQxLCA0MCwJCQlcCisJCQkzOSwgMzgsIDM3LCAzNiwgMzUsIDM0LCAzMywgMzIsCQkJXAorCQkJMzEsIDMwLCAyOSwgMjgsIDI3LCAyNiwgMjUsIDI0LAkJCVwKKwkJCTIzLCAyMiwgMjEsIDIwLCAxOSwgMTgsIDE3LCAxNiwJCQlcCisJCQkxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCAgOSwgIDgsCQkJXAorCQkJIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsICAwICkKKworLyoqIENvbnN0cnVjdCBhIERIQ1Agb3B0aW9uIGZyb20gYSBsaXN0IG9mIGJ5dGVzICovCisjZGVmaW5lIERIQ1BfT1BUSU9OKCAuLi4gKSBWQV9BUkdfQ09VTlQgKCBfX1ZBX0FSR1NfXyApLCBfX1ZBX0FSR1NfXworCisvKiogQ29uc3RydWN0IGEgREhDUCBvcHRpb24gZnJvbSBhIGxpc3Qgb2YgY2hhcmFjdGVycyAqLworI2RlZmluZSBESENQX1NUUklORyggLi4uICkgREhDUF9PUFRJT04gKCBfX1ZBX0FSR1NfXyApCisKKy8qKiBDb25zdHJ1Y3QgYSBieXRlLXZhbHVlZCBESENQIG9wdGlvbiAqLworI2RlZmluZSBESENQX0JZVEUoIHZhbHVlICkgREhDUF9PUFRJT04gKCB2YWx1ZSApCisKKy8qKiBDb25zdHJ1Y3QgYSB3b3JkLXZhbHVlZCBESENQIG9wdGlvbiAqLworI2RlZmluZSBESENQX1dPUkQoIHZhbHVlICkgREhDUF9PUFRJT04gKCAoICggKHZhbHVlKSA+PiA4ICkgJiAweGZmICksICAgXAorCQkJCQkgKCAoICh2YWx1ZSkgPj4gMCApICYgMHhmZiApICkKKworLyoqIENvbnN0cnVjdCBhIGR3b3JkLXZhbHVlZCBESENQIG9wdGlvbiAqLworI2RlZmluZSBESENQX0RXT1JEKCB2YWx1ZSApIERIQ1BfT1BUSU9OICggKCAoICh2YWx1ZSkgPj4gMjQgKSAmIDB4ZmYgKSwgXAorCQkJCQkgICggKCAodmFsdWUpID4+IDE2ICkgJiAweGZmICksIFwKKwkJCQkJICAoICggKHZhbHVlKSA+PiA4ICApICYgMHhmZiApLCBcCisJCQkJCSAgKCAoICh2YWx1ZSkgPj4gMCAgKSAmIDB4ZmYgKSApCisKKy8qKiBDb25zdHJ1Y3QgYSBESENQIGVuY2Fwc3VsYXRlZCBvcHRpb25zIGZpZWxkICovCisjZGVmaW5lIERIQ1BfRU5DQVAoIC4uLiApIERIQ1BfT1BUSU9OICggX19WQV9BUkdTX18sIERIQ1BfRU5EICkKKworLyoqCisgKiBBIERIQ1Agb3B0aW9uCisgKgorICogREhDUCBvcHRpb25zIGNvbnNpc3Qgb2YgYSBtYW5kYXRvcnkgdGFnLCBhIGxlbmd0aCBmaWVsZCB0aGF0IGlzCisgKiBtYW5kYXRvcnkgZm9yIGFsbCBvcHRpb25zIGV4Y2VwdCBAYyBESENQX1BBRCBhbmQgQGMgREhDUF9FTkQsIGFuZCBhCisgKiBwYXlsb2FkLiAgCisgKi8KK3N0cnVjdCBkaGNwX29wdGlvbiB7CisJLyoqIFRhZworCSAqCisJICogTXVzdCBiZSBhIEBjIERIQ1BfWFhYIHZhbHVlLgorCSAqLworCXVpbnQ4X3QgdGFnOworCS8qKiBMZW5ndGgKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBmaWVsZCAoaS5lLiBleGNsdWRpbmcgdGhlCisJICogdGFnIGFuZCBsZW5ndGggZmllbGRzKS4gIEZvciB0aGUgdHdvIHRhZ3MgQGMgREhDUF9QQUQgYW5kCisJICogQGMgREhDUF9FTkQsIHRoZSBsZW5ndGggZmllbGQgaXMgaW1wbGljaXRseSB6ZXJvIGFuZCBpcworCSAqIGFsc28gbWlzc2luZywgaS5lLiB0aGVzZSBESENQIG9wdGlvbnMgYXJlIG9ubHkgYSBzaW5nbGUKKwkgKiBieXRlIGluIGxlbmd0aC4KKwkgKi8KKwl1aW50OF90IGxlbjsKKwkvKiogT3B0aW9uIGRhdGEgKi8KKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKioKKyAqIExlbmd0aCBvZiBhIERIQ1Agb3B0aW9uIGhlYWRlcgorICoKKyAqIFRoZSBoZWFkZXIgaXMgdGhlIHBvcnRpb24gZXhjbHVkaW5nIHRoZSBkYXRhLCBpLmUuIHRoZSB0YWcgYW5kIHRoZQorICogbGVuZ3RoLgorICovCisjZGVmaW5lIERIQ1BfT1BUSU9OX0hFQURFUl9MRU4gKCBvZmZzZXRvZiAoIHN0cnVjdCBkaGNwX29wdGlvbiwgZGF0YSApICkKKworLyoqIE1heGltdW0gbGVuZ3RoIGZvciBhIHNpbmdsZSBESENQIG9wdGlvbiAqLworI2RlZmluZSBESENQX01BWF9MRU4gMHhmZgorCisvKioKKyAqIEEgREhDUCBoZWFkZXIKKyAqCisgKi8KK3N0cnVjdCBkaGNwaGRyIHsKKwkvKiogT3BlcmF0aW9uCisJICoKKwkgKiBUaGlzIG11c3QgYmUgZWl0aGVyIEBjIEJPT1RQX1JFUVVFU1Qgb3IgQGMgQk9PVFBfUkVQTFkuCisJICovCisJdWludDhfdCBvcDsKKwkvKiogSGFyZHdhcmUgYWRkcmVzcyB0eXBlCisJICoKKwkgKiBUaGlzIGlzIGFuIEFSUEhSRF9YWFggY29uc3RhbnQuICBOb3RlIHRoYXQgQVJQSFJEX1hYWAorCSAqIGNvbnN0YW50cyBhcmUgbm9taW5hbGx5IDE2IGJpdHMgd2lkZTsgdGhpcyBjb3VsZCBiZQorCSAqIGNvbnNpZGVyZWQgdG8gYmUgYSBidWcgaW4gdGhlIEJPT1RQL0RIQ1Agc3BlY2lmaWNhdGlvbi4KKwkgKi8KKwl1aW50OF90IGh0eXBlOworCS8qKiBIYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCXVpbnQ4X3QgaGxlbjsKKwkvKiogTnVtYmVyIG9mIGhvcHMgZnJvbSBzZXJ2ZXIgKi8KKwl1aW50OF90IGhvcHM7CisJLyoqIFRyYW5zYWN0aW9uIElEICovCisJdWludDMyX3QgeGlkOworCS8qKiBTZWNvbmRzIHNpbmNlIHN0YXJ0IG9mIGFjcXVpc2l0aW9uICovCisJdWludDE2X3Qgc2VjczsKKwkvKiogRmxhZ3MgKi8KKwl1aW50MTZfdCBmbGFnczsKKwkvKiogIkNsaWVudCIgSVAgYWRkcmVzcworCSAqCisJICogVGhpcyBpcyBmaWxsZWQgaW4gaWYgdGhlIGNsaWVudCBhbHJlYWR5IGhhcyBhbiBJUCBhZGRyZXNzCisJICogYXNzaWduZWQgYW5kIGNhbiByZXNwb25kIHRvIEFSUCByZXF1ZXN0cy4KKwkgKi8KKwlzdHJ1Y3QgaW5fYWRkciBjaWFkZHI7CisJLyoqICJZb3VyIiBJUCBhZGRyZXNzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBJUCBhZGRyZXNzIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudC4KKwkgKi8KKwlzdHJ1Y3QgaW5fYWRkciB5aWFkZHI7CisJLyoqICJTZXJ2ZXIiIElQIGFkZHJlc3MKKwkgKgorCSAqIFRoaXMgaXMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIG5leHQgc2VydmVyIHRvIGJlIHVzZWQgaW4gdGhlCisJICogYm9vdCBwcm9jZXNzLgorCSAqLworCXN0cnVjdCBpbl9hZGRyIHNpYWRkcjsKKwkvKiogIkdhdGV3YXkiIElQIGFkZHJlc3MKKwkgKgorCSAqIFRoaXMgaXMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIERIQ1AgcmVsYXkgYWdlbnQsIGlmIGFueS4KKwkgKi8KKwlzdHJ1Y3QgaW5fYWRkciBnaWFkZHI7CisJLyoqIENsaWVudCBoYXJkd2FyZSBhZGRyZXNzICovCisJdWludDhfdCBjaGFkZHJbMTZdOworCS8qKiBTZXJ2ZXIgaG9zdCBuYW1lIChudWxsIHRlcm1pbmF0ZWQpCisJICoKKwkgKiBUaGlzIGZpZWxkIG1heSBiZSBvdmVycmlkZGVuIGFuZCBjb250YWluIERIQ1Agb3B0aW9ucworCSAqLworCWNoYXIgc25hbWVbNjRdOworCS8qKiBCb290IGZpbGUgbmFtZSAobnVsbCB0ZXJtaW5hdGVkKQorCSAqCisJICogVGhpcyBmaWVsZCBtYXkgYmUgb3ZlcnJpZGRlbiBhbmQgY29udGFpbiBESENQIG9wdGlvbnMKKwkgKi8KKwljaGFyIGZpbGVbMTI4XTsKKwkvKiogREhDUCBtYWdpYyBjb29raWUKKwkgKgorCSAqIE11c3QgaGF2ZSB0aGUgdmFsdWUgQGMgREhDUF9NQUdJQ19DT09LSUUuCisJICovCisJdWludDMyX3QgbWFnaWM7CisJLyoqIERIQ1Agb3B0aW9ucworCSAqCisJICogVmFyaWFibGUgbGVuZ3RoOyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIHBhY2tldC4gIE1pbmltdW0KKwkgKiBsZW5ndGggKGZvciB0aGUgc2FrZSBvZiBzYW5pdHkpIGlzIDEsIHRvIGFsbG93IGZvciBhIHNpbmdsZQorCSAqIEBjIERIQ1BfRU5EIHRhZy4KKwkgKi8KKwl1aW50OF90IG9wdGlvbnNbMF07Cit9OworCisvKiogT3Bjb2RlIGZvciBhIHJlcXVlc3QgZnJvbSBjbGllbnQgdG8gc2VydmVyICovCisjZGVmaW5lIEJPT1RQX1JFUVVFU1QgMQorCisvKiogT3Bjb2RlIGZvciBhIHJlcGx5IGZyb20gc2VydmVyIHRvIGNsaWVudCAqLworI2RlZmluZSBCT09UUF9SRVBMWSAyCisKKy8qKiBCT09UUCByZXBseSBtdXN0IGJlIGJyb2FkY2FzdAorICoKKyAqIENsaWVudHMgdGhhdCBjYW5ub3QgYWNjZXB0IHVuaWNhc3QgQk9PVFAgcmVwbGllcyBtdXN0IHNldCB0aGlzCisgKiBmbGFnLgorICovCisjZGVmaW5lIEJPT1RQX0ZMX0JST0FEQ0FTVCAweDgwMDAKKworLyoqIERIQ1AgbWFnaWMgY29va2llICovCisjZGVmaW5lIERIQ1BfTUFHSUNfQ09PS0lFIDB4NjM4MjUzNjNVTAorCisvKiogREhDUCBtaW5pbXVtIHBhY2tldCBsZW5ndGgKKyAqCisgKiBUaGlzIGlzIHRoZSBtYW5kYXRlZCBtaW5pbXVtIHBhY2tldCBsZW5ndGggdGhhdCBhIERIQ1AgcGFydGljaXBhbnQKKyAqIG11c3QgYmUgcHJlcGFyZWQgdG8gcmVjZWl2ZS4KKyAqLworI2RlZmluZSBESENQX01JTl9MRU4gNTUyCisKKy8qKiBUaW1lb3V0cyBmb3Igc2VuZGluZyBESENQIHBhY2tldHMgKi8KKyNkZWZpbmUgREhDUF9NSU5fVElNRU9VVCAoIDEgKiBUSUNLU19QRVJfU0VDICkKKyNkZWZpbmUgREhDUF9NQVhfVElNRU9VVCAoIDEwICogVElDS1NfUEVSX1NFQyApCisKKy8qKiBNYXhpbXVtIHRpbWUgdGhhdCB3ZSB3aWxsIHdhaXQgZm9yIFByb3h5REhDUCByZXNwb25zZXMgKi8KKyNkZWZpbmUgUFJPWFlESENQX01BWF9USU1FT1VUICggMiAqIFRJQ0tTX1BFUl9TRUMgKQorCisvKiogTWF4aW11bSB0aW1lIHRoYXQgd2Ugd2lsbCB3YWl0IGZvciBCb290IFNlcnZlciByZXNwb25zZXMgKi8KKyNkZWZpbmUgUFhFQlNfTUFYX1RJTUVPVVQgKCAzICogVElDS1NfUEVSX1NFQyApCisKKy8qKiBTZXR0aW5ncyBibG9jayBuYW1lIHVzZWQgZm9yIERIQ1AgcmVzcG9uc2VzICovCisjZGVmaW5lIERIQ1BfU0VUVElOR1NfTkFNRSAiZGhjcCIKKworLyoqIFNldHRpbmdzIGJsb2NrIG5hbWUgdXNlZCBmb3IgUHJveHlESENQIHJlc3BvbnNlcyAqLworI2RlZmluZSBQUk9YWURIQ1BfU0VUVElOR1NfTkFNRSAicHJveHlkaGNwIgorCisvKiogU2V0dGluZyBibG9jayBuYW1lIHVzZWQgZm9yIEJvb3RTZXJ2ZXJESENQIHJlc3BvbnNlcyAqLworI2RlZmluZSBQWEVCU19TRVRUSU5HU19OQU1FICJweGVicyIKKworZXh0ZXJuIHZvaWQgKiBkaGNwX2NoYWRkciAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQ4X3QgKmhsZW4sCisJCQkgICAgdWludDE2X3QgKmZsYWdzICk7CitleHRlcm4gaW50IGRoY3BfY3JlYXRlX3BhY2tldCAoIHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50OF90IG1zZ3R5cGUsCisJCQkJY29uc3Qgdm9pZCAqb3B0aW9ucywgc2l6ZV90IG9wdGlvbnNfbGVuLAorCQkJCXZvaWQgKmRhdGEsIHNpemVfdCBtYXhfbGVuICk7CitleHRlcm4gaW50IGRoY3BfY3JlYXRlX3JlcXVlc3QgKCBzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3Bwa3QsCisJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJIHVuc2lnbmVkIGludCBtc2d0eXBlLCBzdHJ1Y3QgaW5fYWRkciBjaWFkZHIsCisJCQkJIHZvaWQgKmRhdGEsIHNpemVfdCBtYXhfbGVuICk7CitleHRlcm4gaW50IHN0YXJ0X2RoY3AgKCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSAqam9iLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CitleHRlcm4gaW50IHN0YXJ0X3B4ZWJzICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSB1bnNpZ25lZCBpbnQgcHhlX3R5cGUgKTsKKworLyogSW4gZW52aXJvbm1lbnRzIHRoYXQgY2FuIHByb3ZpZGUgY2FjaGVkIERIQ1AgcGFja2V0cywgdGhpcyBmdW5jdGlvbgorICogc2hvdWxkIGxvb2sgZm9yIHN1Y2ggYSBwYWNrZXQgYW5kIGNhbGwgc3RvcmVfY2FjaGVkX2RoY3BhY2soKSB3aXRoCisgKiBpdCBpZiBpdCBleGlzdHMuCisgKi8KK19fd2Vha19kZWNsICggdm9pZCwgZ2V0X2NhY2hlZF9kaGNwYWNrLCAoIHZvaWQgKSwgKCksICk7CisKK2V4dGVybiB2b2lkIHN0b3JlX2NhY2hlZF9kaGNwYWNrICggdXNlcnB0cl90IGRhdGEsIHNpemVfdCBsZW4gKTsKKworI2VuZGlmIC8qIF9HUFhFX0RIQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2RoY3BvcHRzLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZGhjcG9wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDkwZjQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2RoY3BvcHRzLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfR1BYRV9ESENQT1BUU19ICisjZGVmaW5lIF9HUFhFX0RIQ1BPUFRTX0gKKworLyoqIEBmaWxlCisgKgorICogREhDUCBvcHRpb25zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiogQSBESENQIG9wdGlvbnMgYmxvY2sgKi8KK3N0cnVjdCBkaGNwX29wdGlvbnMgeworCS8qKiBPcHRpb24gYmxvY2sgcmF3IGRhdGEgKi8KKwl2b2lkICpkYXRhOworCS8qKiBPcHRpb24gYmxvY2sgbGVuZ3RoICovCisJc2l6ZV90IGxlbjsKKwkvKiogT3B0aW9uIGJsb2NrIG1heGltdW0gbGVuZ3RoICovCisJc2l6ZV90IG1heF9sZW47Cit9OworCitleHRlcm4gaW50IGRoY3BvcHRfc3RvcmUgKCBzdHJ1Y3QgZGhjcF9vcHRpb25zICpvcHRpb25zLCB1bnNpZ25lZCBpbnQgdGFnLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApOworZXh0ZXJuIGludCBkaGNwb3B0X2V4dGVuc2libGVfc3RvcmUgKCBzdHJ1Y3QgZGhjcF9vcHRpb25zICpvcHRpb25zLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB0YWcsCisJCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApOworZXh0ZXJuIGludCBkaGNwb3B0X2ZldGNoICggc3RydWN0IGRoY3Bfb3B0aW9ucyAqb3B0aW9ucywgdW5zaWduZWQgaW50IHRhZywKKwkJCSAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKK2V4dGVybiB2b2lkIGRoY3BvcHRfaW5pdCAoIHN0cnVjdCBkaGNwX29wdGlvbnMgKm9wdGlvbnMsCisJCQkgICB2b2lkICpkYXRhLCBzaXplX3QgbWF4X2xlbiApOworCisjZW5kaWYgLyogX0dQWEVfREhDUE9QVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2RoY3Bwa3QuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9kaGNwcGt0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwN2NjYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9kaGNwcGt0LmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBfR1BYRV9ESENQUEtUX0gKKyNkZWZpbmUgX0dQWEVfREhDUFBLVF9ICisKKy8qKiBAZmlsZQorICoKKyAqIERIQ1AgcGFja2V0cworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL2RoY3AuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3BvcHRzLmg+CisjaW5jbHVkZSA8Z3B4ZS9yZWZjbnQuaD4KKworLyoqCisgKiBBIERIQ1AgcGFja2V0CisgKgorICovCitzdHJ1Y3QgZGhjcF9wYWNrZXQgeworCS8qKiBSZWZlcmVuY2UgY291bnRlciAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCS8qKiBUaGUgREhDUCBwYWNrZXQgY29udGVudHMgKi8KKwlzdHJ1Y3QgZGhjcGhkciAqZGhjcGhkcjsKKwkvKiogTWF4aW11bSBsZW5ndGggb2YgdGhlIERIQ1AgcGFja2V0IGJ1ZmZlciAqLworCXNpemVfdCBtYXhfbGVuOworCS8qKiBVc2VkIGxlbmd0aCBvZiB0aGUgREhDUCBwYWNrZXQgYnVmZmVyICovCisJc2l6ZV90IGxlbjsKKwkvKiogREhDUCBvcHRpb25zICovCisJc3RydWN0IGRoY3Bfb3B0aW9ucyBvcHRpb25zOworCS8qKiBTZXR0aW5ncyBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3Qgc2V0dGluZ3Mgc2V0dGluZ3M7Cit9OworCisvKioKKyAqIEluY3JlbWVudCByZWZlcmVuY2UgY291bnQgb24gREhDUCBwYWNrZXQKKyAqCisgKiBAdiBkaGNwcGt0CQlESENQIHBhY2tldAorICogQHJldCBkaGNwcGt0CQlESENQIHBhY2tldAorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBzdHJ1Y3QgZGhjcF9wYWNrZXQgKgorZGhjcHBrdF9nZXQgKCBzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3Bwa3QgKSB7CisJcmVmX2dldCAoICZkaGNwcGt0LT5yZWZjbnQgKTsKKwlyZXR1cm4gZGhjcHBrdDsKK30KKworLyoqCisgKiBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9uIERIQ1AgcGFja2V0CisgKgorICogQHYgZGhjcHBrdAkJREhDUCBwYWNrZXQKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZAorZGhjcHBrdF9wdXQgKCBzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3Bwa3QgKSB7CisJcmVmX3B1dCAoICZkaGNwcGt0LT5yZWZjbnQgKTsKK30KKworZXh0ZXJuIGludCBkaGNwcGt0X3N0b3JlICggc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwcGt0LCB1bnNpZ25lZCBpbnQgdGFnLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApOworZXh0ZXJuIGludCBkaGNwcGt0X2ZldGNoICggc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwcGt0LCB1bnNpZ25lZCBpbnQgdGFnLAorCQkJICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApOworZXh0ZXJuIHZvaWQgZGhjcHBrdF9pbml0ICggc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwcGt0LCAKKwkJCSAgIHN0cnVjdCBkaGNwaGRyICpkYXRhLCBzaXplX3QgbGVuICk7CisKKyNlbmRpZiAvKiBfR1BYRV9ESENQUEtUX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9kbnMuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9kbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTVlODc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2Rucy5oCkBAIC0wLDAgKzEsOTIgQEAKKyNpZm5kZWYgX0dQWEVfRE5TX0gKKyNkZWZpbmUgX0dQWEVfRE5TX0gKKworLyoqIEBmaWxlCisgKgorICogRE5TIHByb3RvY29sCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvaW4uaD4KKworLyoKKyAqIENvbnN0YW50cworICoKKyAqLworCisjZGVmaW5lIEROU19UWVBFX0EJCTEKKyNkZWZpbmUgRE5TX1RZUEVfQ05BTUUJCTUKKyNkZWZpbmUgRE5TX1RZUEVfQU5ZCQkyNTUKKworI2RlZmluZSBETlNfQ0xBU1NfSU4JCTEKKyNkZWZpbmUgRE5TX0NMQVNTX0NTCQkyCisjZGVmaW5lIEROU19DTEFTU19DSAkJMworI2RlZmluZSBETlNfQ0xBU1NfSFMJCTQKKworI2RlZmluZSBETlNfRkxBR19RVUVSWQkJKCAweDAwIDw8IDE1ICkKKyNkZWZpbmUgRE5TX0ZMQUdfUkVTUE9OU0UJKCAweDAxIDw8IDE1ICkKKyNkZWZpbmUgRE5TX0ZMQUdfUVIoZmxhZ3MpCSggKGZsYWdzKSAmICggMHgwMSA8PCAxNSApICkKKyNkZWZpbmUgRE5TX0ZMQUdfT1BDT0RFX1FVRVJZCSggMHgwMCA8PCAxMSApCisjZGVmaW5lIEROU19GTEFHX09QQ09ERV9JUVVFUlkJKCAweDAxIDw8IDExICkKKyNkZWZpbmUgRE5TX0ZMQUdfT1BDT0RFX1NUQVRVUwkoIDB4MDIgPDwgMTEgKQorI2RlZmluZSBETlNfRkxBR19PUENPREUoZmxhZ3MpCSggKGZsYWdzKSAmICggMHgwZiA8PCAxMSApICkKKyNkZWZpbmUgRE5TX0ZMQUdfUkQJCSggMHgwMSA8PCA4ICkKKyNkZWZpbmUgRE5TX0ZMQUdfUkEJCSggMHgwMSA8PCA3ICkKKyNkZWZpbmUgRE5TX0ZMQUdfUkNPREVfT0sJKCAweDAwIDw8IDAgKQorI2RlZmluZSBETlNfRkxBR19SQ09ERV9OWAkoIDB4MDMgPDwgMCApCisjZGVmaW5lIEROU19GTEFHX1JDT0RFKGZsYWdzKQkoIChmbGFncykgJiAoIDB4MGYgPDwgMCApICkKKworI2RlZmluZQlETlNfUE9SVAkJNTMKKyNkZWZpbmUJRE5TX01BWF9SRVRSSUVTCQkzCisjZGVmaW5lCUROU19NQVhfQ05BTUVfUkVDVVJTSU9OCTB4MzAKKworLyoKKyAqIEROUyBwcm90b2NvbCBzdHJ1Y3R1cmVzCisgKgorICovCitzdHJ1Y3QgZG5zX2hlYWRlciB7CisJdWludDE2X3QJaWQ7CisJdWludDE2X3QJZmxhZ3M7CisJdWludDE2X3QJcWRjb3VudDsKKwl1aW50MTZfdAlhbmNvdW50OworCXVpbnQxNl90CW5zY291bnQ7CisJdWludDE2X3QJYXJjb3VudDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3N0cnVjdCBkbnNfcXVlcnlfaW5mbyB7CisJdWludDE2X3QJcXR5cGU7CisJdWludDE2X3QJcWNsYXNzOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworc3RydWN0IGRuc19xdWVyeSB7CisJc3RydWN0IGRuc19oZWFkZXIgZG5zOworCWNoYXIJCXBheWxvYWRbIDI1NiArIHNpemVvZiAoIHN0cnVjdCBkbnNfcXVlcnlfaW5mbyApIF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCitzdHJ1Y3QgZG5zX3JyX2luZm9fY29tbW9uIHsKKwl1aW50MTZfdAl0eXBlOworCXVpbnQxNl90CWNsYXNzOworCXVpbnQzMl90CXR0bDsKKwl1aW50MTZfdAlyZGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKK3N0cnVjdCBkbnNfcnJfaW5mb19hIHsKKwlzdHJ1Y3QgZG5zX3JyX2luZm9fY29tbW9uIGNvbW1vbjsKKwlzdHJ1Y3QgaW5fYWRkciBpbl9hZGRyOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworc3RydWN0IGRuc19ycl9pbmZvX2NuYW1lIHsKKwlzdHJ1Y3QgZG5zX3JyX2luZm9fY29tbW9uIGNvbW1vbjsKKwljaGFyIGNuYW1lWzBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKwordW5pb24gZG5zX3JyX2luZm8geworCXN0cnVjdCBkbnNfcnJfaW5mb19jb21tb24gY29tbW9uOworCXN0cnVjdCBkbnNfcnJfaW5mb19hIGE7CisJc3RydWN0IGRuc19ycl9pbmZvX2NuYW1lIGNuYW1lOworfTsKKworI2VuZGlmIC8qIF9HUFhFX0ROU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZG93bmxvYWRlci5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2Rvd25sb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjIxZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2Rvd25sb2FkZXIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9HUFhFX0RPV05MT0FERVJfSAorI2RlZmluZSBfR1BYRV9ET1dOTE9BREVSX0gKKworLyoqIEBmaWxlCisgKgorICogSW1hZ2UgZG93bmxvYWRlcgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBqb2JfaW50ZXJmYWNlOworc3RydWN0IGltYWdlOworCitleHRlcm4gaW50IGNyZWF0ZV9kb3dubG9hZGVyICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiwgc3RydWN0IGltYWdlICppbWFnZSwKKwkJCSAgICAgICBpbnQgKCAqIHJlZ2lzdGVyX2ltYWdlICkgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICksCisJCQkgICAgICAgaW50IHR5cGUsIC4uLiApOworCisjZW5kaWYgLyogX0dQWEVfRE9XTkxPQURFUl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWFwb2wuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lYXBvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODU1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWFwb2wuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0Pi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfR1BYRV9FQVBPTF9ICisjZGVmaW5lIF9HUFhFX0VBUE9MX0gKKworLyoqIEBmaWxlCisgKgorICogRGVmaW5pdGlvbnMgZm9yIEVBUE9MIChFeHRlbnNpYmxlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIG92ZXIKKyAqIExBTnMpIGZyYW1lcy4gRGVmaW5pdGlvbnMgZm9yIHRoZSBwYWNrZXRzIHVzdWFsbHkgZW5jYXBzdWxhdGVkIGluCisgKiB0aGVtIGFyZSBlbHNld2hlcmUuCisgKi8KKworI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworCisvKioKKyAqIEBkZWZncm91cCBlYXBvbF90eXBlIEVBUE9MIGFyY2hldHlwZSBpZGVudGlmaWVycworICogQHsKKyAqLworI2RlZmluZSBFQVBPTF9UWVBFX0VBUAkJMCAvKio8IEVBUCBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UgcGFja2V0ICovCisjZGVmaW5lIEVBUE9MX1RZUEVfU1RBUlQJMSAvKio8IFJlcXVlc3QgYnkgUGVlciB0byBiZWdpbiAobm8gZGF0YSkgKi8KKyNkZWZpbmUgRUFQT0xfVFlQRV9MT0dPRkYJMiAvKio8IFJlcXVlc3QgYnkgUGVlciB0byB0ZXJtaW5hdGUgKG5vIGRhdGEpICovCisjZGVmaW5lIEVBUE9MX1RZUEVfS0VZCQkzIC8qKjwgRUFQT0wtS2V5IHBhY2tldCAqLworLyoqIEB9ICovCisKKy8qKiBFeHBlY3RlZCBFQVBPTCB2ZXJzaW9uIGZpZWxkIHZhbHVlCisgKgorICogVmVyc2lvbiAyIGlzIG9mdGVuIHNlZW4gYW5kIGhhcyBubyBmb3JtYXQgZGlmZmVyZW5jZXMgZnJvbSB2ZXJzaW9uIDE7CisgKiBob3dldmVyLCBtYW55IG9sZGVyIEFQcyB3aWxsIGNvbXBsZXRlbHkgZHJvcCB2ZXJzaW9uLTIgcGFja2V0cywgc28KKyAqIHdlIGFkdmVydGlzZSBvdXJzZWx2ZXMgYXMgdmVyc2lvbiAxLgorICovCisjZGVmaW5lIEVBUE9MX1RISVNfVkVSU0lPTgkxCisKKy8qKiBMZW5ndGggb2YgYW4gRUFQT0wgZnJhbWUgaGVhZGVyICovCisjZGVmaW5lIEVBUE9MX0hEUl9MRU4JCTQKKworLyoqIEFuIEVBUE9MIGZyYW1lCisgKgorICogVGhpcyBtYXkgZW5jYXBzdWxhdGUgYW4gZWFwX3BrdCwgYW4gZWFwb2xfa2V5X3BrdCwgb3IgYSBTdGFydCBvcgorICogTG9nb2ZmIHJlcXVlc3Qgd2l0aCBubyBkYXRhIGF0dGFjaGVkLiBJdCBpcyB0cmFuc21pdHRlZCBkaXJlY3RseSBpbgorICogYW4gRXRoZXJuZXQgZnJhbWUsIHdpdGggbm8gSVAgcGFja2V0IGhlYWRlci4KKyAqLworc3RydWN0IGVhcG9sX2ZyYW1lCit7CisJLyoqIEVBUE9MIHZlcnNpb24gaWRlbnRpZmllciwgYWx3YXlzIDEgKi8KKwl1OCB2ZXJzaW9uOworCisJLyoqIEVBUE9MIGFyY2hldHlwZSBpZGVudGlmaWVyIGluZGljYXRpbmcgZm9ybWF0IG9mIHBheWxvYWQgKi8KKwl1OCB0eXBlOworCisJLyoqIExlbmd0aCBvZiBwYXlsb2FkLCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwl1MTYgbGVuZ3RoOworCisJLyoqIFBheWxvYWQsIGlmIEBhIHR5cGUgaXMgRUFQIG9yIEVBUE9MLUtleSAqLworCXU4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisKKy8qKiBBbiBFQVBPTCBmcmFtZSB0eXBlIGhhbmRsZXIKKyAqCisgKiBOb3JtYWxseSB0aGVyZSB3aWxsIGJlIGF0IG1vc3QgdHdvIG9mIHRoZXNlLCBvbmUgZm9yIEVBUCBhbmQgb25lCisgKiBmb3IgRUFQT0wtS2V5IGZyYW1lcy4gVGhlIEVBUE9MIGludGVyZmFjZSBjb2RlIGhhbmRsZXMgU3RhcnQgYW5kCisgKiBMb2dvZmYgZGlyZWN0bHkuCisgKi8KK3N0cnVjdCBlYXBvbF9oYW5kbGVyCit7CisJLyoqIEVBUE9MIGFyY2hldHlwZSBpZGVudGlmaWVyIGZvciBwYXlsb2FkIHRoaXMgaGFuZGxlciB3aWxsIGhhbmRsZSAqLworCXU4IHR5cGU7CisKKwkvKiogUmVjZWl2ZSBFQVBPTC1lbmNhcHN1bGF0ZWQgcGFja2V0IG9mIHNwZWNpZmllZCB0eXBlCisJICoKKwkgKiBAdiBpb2IJSS9PIGJ1ZmZlciBjb250YWluaW5nIHBhY2tldCBwYXlsb2FkCisJICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlIGZyb20gd2hpY2ggcGFja2V0IHdhcyByZWNlaXZlZAorCSAqIEB2IGxsX3NvdXJjZQlTb3VyY2UgbGluay1sYXllciBhZGRyZXNzIGZyb20gd2hpY2ggcGFja2V0IHdhcyByZWNlaXZlZAorCSAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisJICoKKwkgKiBUaGUgSS9PIGJ1ZmZlciB3aWxsIGhhdmUgdGhlIEVBUE9MIGhlYWRlciBwdWxsZWQgb2ZmIGl0LCBzbworCSAqIEBjIGlvYi0+ZGF0YSBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHBheWxvYWQuCisJICoKKwkgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgSS9PIGJ1ZmZlciBwYXNzZWQgdG8gaXQuCisJICovCisJaW50ICggKiByeCApICggc3RydWN0IGlvX2J1ZmZlciAqaW9iLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgICAgY29uc3Qgdm9pZCAqbGxfc291cmNlICk7Cit9OworCisjZGVmaW5lIEVBUE9MX0hBTkRMRVJTCV9fdGFibGUgKCBzdHJ1Y3QgZWFwb2xfaGFuZGxlciwgImVhcG9sX2hhbmRsZXJzIiApCisjZGVmaW5lIF9fZWFwb2xfaGFuZGxlcglfX3RhYmxlX2VudHJ5ICggRUFQT0xfSEFORExFUlMsIDAxICkKKworCitleHRlcm4gc3RydWN0IG5ldF9wcm90b2NvbCBlYXBvbF9wcm90b2NvbCBfX25ldF9wcm90b2NvbDsKKworCisjZW5kaWYgLyogX0dQWEVfRUFQT0xfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VkaXRib3guaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZGl0Ym94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjYzQxMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZGl0Ym94LmgKQEAgLTAsMCArMSw2MSBAQAorI2lmbmRlZiBfR1BYRV9FRElUQk9YX0gKKyNkZWZpbmUgX0dQWEVfRURJVEJPWF9ICisKKy8qKiBAZmlsZQorICoKKyAqIEVkaXRhYmxlIHRleHQgYm94IHdpZGdldAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNpbmNsdWRlIDxncHhlL2VkaXRzdHJpbmcuaD4KKworLyoqIEFuIGVkaXRhYmxlIHRleHQgYm94IHdpZGdldCAqLworc3RydWN0IGVkaXRfYm94IHsKKwkvKiogRWRpdGFibGUgc3RyaW5nICovCisJc3RydWN0IGVkaXRfc3RyaW5nIHN0cmluZzsKKwkvKiogQ29udGFpbmluZyB3aW5kb3cgKi8KKwlXSU5ET1cgKndpbjsKKwkvKiogUm93ICovCisJdW5zaWduZWQgaW50IHJvdzsKKwkvKiogU3RhcnRpbmcgY29sdW1uICovCisJdW5zaWduZWQgaW50IGNvbDsKKwkvKiogV2lkdGggKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJLyoqIEZpcnN0IGRpc3BsYXllZCBjaGFyYWN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgZmlyc3Q7CisJLyoqIEZsYWdzICovCisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworLyoqIEVkaXRhYmxlIHRleHQgYm94IHdpZGdldCBmbGFncyAqLworZW51bSBlZGl0X2JveF9mbGFncyB7CisJLyoqIFNob3cgc3RhcnMgaW5zdGVhZCBvZiBjb250ZW50cyAoZm9yIHBhc3N3b3JkIHdpZGdldHMpICovCisJRURJVEJPWF9TVEFSUyA9IDB4MDAwMSwKK307CisKK2V4dGVybiB2b2lkIGluaXRfZWRpdGJveCAoIHN0cnVjdCBlZGl0X2JveCAqYm94LCBjaGFyICpidWYsIHNpemVfdCBsZW4sCisJCQkgICBXSU5ET1cgKndpbiwgdW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwKKwkJCSAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGZsYWdzICkKKwkJCSAgIF9fYXR0cmlidXRlX18gKCggbm9ubnVsbCAoMSwgMikgKSk7CitleHRlcm4gdm9pZCBkcmF3X2VkaXRib3ggKCBzdHJ1Y3QgZWRpdF9ib3ggKmJveCApIF9fbm9ubnVsbDsKK3N0YXRpYyBpbmxpbmUgaW50IGVkaXRfZWRpdGJveCAoIHN0cnVjdCBlZGl0X2JveCAqYm94LCBpbnQga2V5ICkgX19ub25udWxsOworCisvKioKKyAqIEVkaXQgdGV4dCBib3ggd2lkZ2V0CisgKgorICogQHYgYm94CQlFZGl0YWJsZSB0ZXh0IGJveCB3aWRnZXQKKyAqIEB2IGtleQkJS2V5IHByZXNzZWQgYnkgdXNlcgorICogQHJldCBrZXkJCUtleSByZXR1cm5lZCB0byBhcHBsaWNhdGlvbiwgb3IgemVybworICoKKyAqIFlvdSBtdXN0IGNhbGwgZHJhd19lZGl0Ym94KCkgdG8gdXBkYXRlIHRoZSBkaXNwbGF5IGFmdGVyIGNhbGxpbmcKKyAqIGVkaXRfZWRpdGJveCgpLgorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgZWRpdF9lZGl0Ym94ICggc3RydWN0IGVkaXRfYm94ICpib3gsIGludCBrZXkgKSB7CisJcmV0dXJuIGVkaXRfc3RyaW5nICggJmJveC0+c3RyaW5nLCBrZXkgKTsKK30KKworI2VuZGlmIC8qIF9HUFhFX0VESVRCT1hfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VkaXRzdHJpbmcuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZGl0c3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjMWJhYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZGl0c3RyaW5nLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfR1BYRV9FRElUU1RSSU5HX0gKKyNkZWZpbmUgX0dQWEVfRURJVFNUUklOR19ICisKKy8qKiBAZmlsZQorICoKKyAqIEVkaXRhYmxlIHN0cmluZ3MKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogQW4gZWRpdGFibGUgc3RyaW5nICovCitzdHJ1Y3QgZWRpdF9zdHJpbmcgeworCS8qKiBCdWZmZXIgZm9yIHN0cmluZyAqLworCWNoYXIgKmJ1ZjsKKwkvKiogU2l6ZSBvZiBidWZmZXIgKGluY2x1ZGluZyB0ZXJtaW5hdGluZyBOVUwpICovCisJc2l6ZV90IGxlbjsKKwkvKiogQ3Vyc29yIHBvc2l0aW9uICovCisJdW5zaWduZWQgaW50IGN1cnNvcjsKKworCS8qIFRoZSBmb2xsb3dpbmcgaXRlbXMgYXJlIHRoZSBlZGl0IGhpc3RvcnkgKi8KKworCS8qKiBMYXN0IGN1cnNvciBwb3NpdGlvbiAqLworCXVuc2lnbmVkIGludCBsYXN0X2N1cnNvcjsKKwkvKiogU3RhcnQgb2YgbW9kaWZpZWQgcG9ydGlvbiBvZiBzdHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgbW9kX3N0YXJ0OworCS8qKiBFbmQgb2YgbW9kaWZpZWQgcG9ydGlvbiBvZiBzdHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgbW9kX2VuZDsKK307CisKK2V4dGVybiBpbnQgZWRpdF9zdHJpbmcgKCBzdHJ1Y3QgZWRpdF9zdHJpbmcgKnN0cmluZywgaW50IGtleSApIF9fbm9ubnVsbDsKKworI2VuZGlmIC8qIF9HUFhFX0VESVRTVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9CYXNlLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL0Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU1MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9CYXNlLmgKQEAgLTAsMCArMSwzMjkgQEAKKy8qKiBAZmlsZQorICBSb290IGluY2x1ZGUgZmlsZSBmb3IgTWRlIFBhY2thZ2UgQmFzZSB0eXBlIG1vZHVsZXMKKworICBUaGlzIGlzIHRoZSBpbmNsdWRlIGZpbGUgZm9yIGFueSBtb2R1bGUgb2YgdHlwZSBiYXNlLiBCYXNlIG1vZHVsZXMgb25seSB1c2UKKyAgdHlwZXMgZGVmaW5lZCB2aWEgdGhpcyBpbmNsdWRlIGZpbGUgYW5kIGNhbiBiZSBwb3J0ZWQgZWFzaWx5IHRvIGFueQorICBlbnZpcm9ubWVudC4gVGhlcmUgYXJlIGEgc2V0IG9mIGJhc2UgbGlicmFyaWVzIGluIHRoZSBNZGUgUGFja2FnZSB0aGF0IGNhbgorICBiZSB1c2VkIHRvIGltcGxlbWVudCBiYXNlIG1vZHVsZXMuCisKK0NvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKK2h0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisqKi8KKworCisjaWZuZGVmIF9fQkFTRV9IX18KKyNkZWZpbmUgX19CQVNFX0hfXworCisvLworLy8gSW5jbHVkZSBwcm9jZXNzb3Igc3BlY2lmaWMgYmluZGluZworLy8KKyNpbmNsdWRlIDxncHhlL2VmaS9Qcm9jZXNzb3JCaW5kLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICBEYXRhMTsKKyAgVUlOVDE2ICBEYXRhMjsKKyAgVUlOVDE2ICBEYXRhMzsKKyAgVUlOVDggICBEYXRhNFs4XTsKK30gR1VJRDsKKwordHlwZWRlZiBVSU5UNjQgUEhZU0lDQUxfQUREUkVTUzsKKworLy8vCisvLy8gTElTVF9FTlRSWSBkZWZpbml0aW9uCisvLy8KK3R5cGVkZWYgc3RydWN0IF9MSVNUX0VOVFJZIExJU1RfRU5UUlk7CisKK3N0cnVjdCBfTElTVF9FTlRSWSB7CisgIExJU1RfRU5UUlkgICpGb3J3YXJkTGluazsKKyAgTElTVF9FTlRSWSAgKkJhY2tMaW5rOworfTsKKworLy8KKy8vIE1vZGlmaWVycyB0byBhYnNyYWN0IHN0YW5kYXJkIHR5cGVzIHRvIGFpZCBpbiBkZWJ1ZyBvZiBwcm9ibGVtcworLy8KKyNkZWZpbmUgQ09OU1QgICAgIGNvbnN0CisjZGVmaW5lIFNUQVRJQyAgICBzdGF0aWMKKyNkZWZpbmUgVk9JRCAgICAgIHZvaWQKKworLy8KKy8vIE1vZGlmaWVycyBmb3IgRGF0YSBUeXBlcyB1c2VkIHRvIHNlbGYgZG9jdW1lbnQgY29kZS4KKy8vIFRoaXMgY29uY2VwdCBpcyBib3Jyb3dlZCBmb3IgVUVGSSBzcGVjaWZpY2F0aW9uLgorLy8KKyNkZWZpbmUgSU4KKyNkZWZpbmUgT1VUCisjZGVmaW5lIE9QVElPTkFMCisKKy8vCisvLyAgVUVGSSBzcGVjaWZpY2F0aW9uIGNsYWltcyAxIGFuZCAwLiBXZSBhcmUgY29uY2VybmVkIGFib3V0IHRoZQorLy8gIGNvbXBsaWVyIHBvcnRhYmlsaXR5IHNvIHdlIGRpZCBpdCB0aGlzIHdheS4KKy8vCisjZGVmaW5lIFRSVUUgICgoQk9PTEVBTikoMT09MSkpCisjZGVmaW5lIEZBTFNFICgoQk9PTEVBTikoMD09MSkpCisKKyNkZWZpbmUgTlVMTCAgKChWT0lEICopIDApCisKKyNkZWZpbmUgIEJJVDAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEJJVDEgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEJJVDIgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgIEJJVDMgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgIEJJVDQgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgIEJJVDUgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgIEJJVDYgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgIEJJVDcgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgIEJJVDggICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgIEJJVDkgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgIEJJVDEwICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgIEJJVDExICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgIEJJVDEyICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgIEJJVDEzICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgIEJJVDE0ICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgIEJJVDE1ICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgIEJJVDE2ICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgIEJJVDE3ICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgIEJJVDE4ICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgIEJJVDE5ICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgIEJJVDIwICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgIEJJVDIxICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgIEJJVDIyICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgIEJJVDIzICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgIEJJVDI0ICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgIEJJVDI1ICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgIEJJVDI2ICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgIEJJVDI3ICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgIEJJVDI4ICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgIEJJVDI5ICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgIEJJVDMwICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgIEJJVDMxICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgIEJJVDMyICAgIDB4MDAwMDAwMDEwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQzMyAgICAweDAwMDAwMDAyMDAwMDAwMDBVTAorI2RlZmluZSAgQklUMzQgICAgMHgwMDAwMDAwNDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDM1ICAgIDB4MDAwMDAwMDgwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQzNiAgICAweDAwMDAwMDEwMDAwMDAwMDBVTAorI2RlZmluZSAgQklUMzcgICAgMHgwMDAwMDAyMDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDM4ICAgIDB4MDAwMDAwNDAwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQzOSAgICAweDAwMDAwMDgwMDAwMDAwMDBVTAorI2RlZmluZSAgQklUNDAgICAgMHgwMDAwMDEwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDQxICAgIDB4MDAwMDAyMDAwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQ0MiAgICAweDAwMDAwNDAwMDAwMDAwMDBVTAorI2RlZmluZSAgQklUNDMgICAgMHgwMDAwMDgwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDQ0ICAgIDB4MDAwMDEwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQ0NSAgICAweDAwMDAyMDAwMDAwMDAwMDBVTAorI2RlZmluZSAgQklUNDYgICAgMHgwMDAwNDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDQ3ICAgIDB4MDAwMDgwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQ0OCAgICAweDAwMDEwMDAwMDAwMDAwMDBVTAorI2RlZmluZSAgQklUNDkgICAgMHgwMDAyMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDUwICAgIDB4MDAwNDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQ1MSAgICAweDAwMDgwMDAwMDAwMDAwMDBVTAorI2RlZmluZSAgQklUNTIgICAgMHgwMDEwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDUzICAgIDB4MDAyMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQ1NCAgICAweDAwNDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSAgQklUNTUgICAgMHgwMDgwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDU2ICAgIDB4MDEwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQ1NyAgICAweDAyMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSAgQklUNTggICAgMHgwNDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDU5ICAgIDB4MDgwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQ2MCAgICAweDEwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSAgQklUNjEgICAgMHgyMDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIEJJVDYyICAgIDB4NDAwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBCSVQ2MyAgICAweDgwMDAwMDAwMDAwMDAwMDBVTAorCisvLworLy8gIFN1cHBvcnQgZm9yIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudCBsaXN0cyB1c2luZyB0aGUgQU5TSSBzdGFuZGFyZC4KKy8vCisvLyAgU2luY2Ugd2UgYXJlIHVzaW5nIHRoZSBBTlNJIHN0YW5kYXJkIHdlIHVzZWQgdGhlIHN0YW5kYXJkIG5hbWVpbmcgYW5kCisvLyAgZGlkIG5vdCBmb2xvdyB0aGUgY29kaW5nIGNvbnZlbnRpb24KKy8vCisvLyAgVkFfTElTVCAgLSB0eXBlZGVmIGZvciBhcmd1bWVudCBsaXN0LgorLy8gIFZBX1NUQVJUIChWQV9MSVNUIE1hcmtlciwgYXJndW1lbnQgYmVmb3JlIHRoZSAuLi4pIC0gSW5pdCBNYXJrZXIgZm9yIHVzZS4KKy8vICBWQV9FTkQgKFZBX0xJU1QgTWFya2VyKSAtIENsZWFyIE1hcmtlcgorLy8gIFZBX0FSRyAoVkFfTElTVCBNYXJrZXIsIHZhciBhcmcgc2l6ZSkgLSBVc2UgTWFya2VyIHRvIGdldCBhbiBhcmd1bW5ldCBmcm9tCisvLyAgICB0aGUgLi4uIGxpc3QuIFlvdSBtdXN0IGtub3cgdGhlIHNpemUgYW5kIHBhc3MgaXQgaW4gdGhpcyBtYWNyby4KKy8vCisvLyAgZXhhbXBsZToKKy8vCisvLyAgVUlOVE4KKy8vICBFeGFtcGxlVmFyQXJnICgKKy8vICAgIElOIFVJTlROICBOdW1iZXJPZkFyZ3MsCisvLyAgICAuLi4KKy8vICAgICkKKy8vICB7CisvLyAgICBWQV9MSVNUIE1hcmtlcjsKKy8vICAgIFVJTlROICAgSW5kZXg7CisvLyAgICBVSU5UTiAgIFJlc3VsdDsKKy8vCisvLyAgICAvLworLy8gICAgLy8gSW5pdGlhbGl6ZSB0aGUgTWFya2VyCisvLyAgICAvLworLy8gICAgVkFfU1RBUlQgKE1hcmtlciwgTnVtYmVyT2ZBcmdzKTsKKy8vICAgIGZvciAoSW5kZXggPSAwLCBSZXN1bHQgPSAwOyBJbmRleCA8IE51bWJlck9mQXJnczsgSW5kZXgrKykgeworLy8gICAgICAvLworLy8gICAgICAvLyBUaGUgLi4uIGxpc3QgaXMgYSBzZXJpZXMgb2YgVUlOVE4gdmFsdWVzLCBzbyBhdmVyYWdlIHRoZW0gdXAuCisvLyAgICAgIC8vCisvLyAgICAgIFJlc3VsdCArPSBWQV9BUkcgKE1hcmtlciwgVUlOVE4pOworLy8gICAgfQorLy8KKy8vICAgIFZBX0VORCAoTWFya2VyKTsKKy8vICAgIHJldHVybiBSZXN1bHQKKy8vICB9CisvLworCisjZGVmaW5lIF9JTlRfU0laRV9PRihuKSAoKHNpemVvZiAobikgKyBzaXplb2YgKFVJTlROKSAtIDEpICZ+KHNpemVvZiAoVUlOVE4pIC0gMSkpCisKKy8vCisvLyBBbHNvIHN1cHBvcnQgY29kaW5nIGNvbnZlbnRpb24gcnVsZXMgZm9yIHZhciBhcmcgbWFjcm9zCisvLwordHlwZWRlZiBDSEFSOCAqVkFfTElTVDsKKyNkZWZpbmUgVkFfU1RBUlQoYXAsIHYpIChhcCA9IChWQV9MSVNUKSAmICh2KSArIF9JTlRfU0laRV9PRiAodikpCisjZGVmaW5lIFZBX0FSRyhhcCwgdCkgICAoKih0ICopICgoYXAgKz0gX0lOVF9TSVpFX09GICh0KSkgLSBfSU5UX1NJWkVfT0YgKHQpKSkKKyNkZWZpbmUgVkFfRU5EKGFwKSAgICAgIChhcCA9IChWQV9MSVNUKSAwKQorCisvLworLy8gTWFjcm8gdGhhdCByZXR1cm5zIHRoZSBieXRlIG9mZnNldCBvZiBhIGZpZWxkIGluIGEgZGF0YSBzdHJ1Y3R1cmUuCisvLworI2RlZmluZSBPRkZTRVRfT0YoVFlQRSwgRmllbGQpICgoVUlOVE4pICYoKChUWVBFICopMCktPkZpZWxkKSkKKworLy8vCisvLy8gIENPTlRBSU5JTkdfUkVDT1JEIC0gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZQorLy8vICAgICAgZnJvbSBvbmUgb2YgaXQncyBlbGVtZW50cy4KKy8vLworI2RlZmluZSBfQ1IoUmVjb3JkLCBUWVBFLCBGaWVsZCkgICgoVFlQRSAqKSAoKENIQVI4ICopIChSZWNvcmQpIC0gKENIQVI4ICopICYoKChUWVBFICopIDApLT5GaWVsZCkpKQorCisvLy8KKy8vLyAgQUxJR05fVkFMVUUgLSBhbGlnbnMgYSB2YWx1ZSB1cCB0byB0aGUgbmV4dCBib3VuZGFyeSBvZiB0aGUgZ2l2ZW4gYWxpZ25tZW50LgorLy8vCisjZGVmaW5lIEFMSUdOX1ZBTFVFKFZhbHVlLCBBbGlnbm1lbnQpICgoVmFsdWUpICsgKCgoQWxpZ25tZW50KSAtIChWYWx1ZSkpICYgKChBbGlnbm1lbnQpIC0gMSkpKQorCisvLy8KKy8vLyAgQUxJR05fUE9JTlRFUiAtIGFsaWducyBhIHBvaW50ZXIgdG8gdGhlIGxvd2VzdCBib3VuZHJ5CisvLy8KKyNkZWZpbmUgQUxJR05fUE9JTlRFUihQb2ludGVyLCBBbGlnbm1lbnQpICgoVk9JRCAqKSAoQUxJR05fVkFMVUUgKChVSU5UTikoUG9pbnRlciksIChBbGlnbm1lbnQpKSkpCisKKy8vLworLy8vICBBTElHTl9WQVJJQUJMRSAtIGFsaWducyBhIHZhcmlhYmxlIHVwIHRvIHRoZSBuZXh0IG5hdHVyYWwgYm91bmRyeSBmb3IgaW50IHNpemUgb2YgYSBwcm9jZXNzb3IKKy8vLworI2RlZmluZSBBTElHTl9WQVJJQUJMRShWYWx1ZSkgIEFMSUdOX1ZBTFVFICgoVmFsdWUpLCBzaXplb2YgKFVJTlROKSkKKworCisvLworLy8gUmV0dXJuIHRoZSBtYXhpbXVtIG9mIHR3byBvcGVyYW5kcy4KKy8vIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gb3BlcmFuZCBzcGVjaWZpZWQgYnkgYSBhbmQgYi4KKy8vIEJvdGggYSBhbmQgYiBtdXN0IGJlIHRoZSBzYW1lIG51bWVyaWNhbCB0eXBlcywgc2lnbmVkIG9yIHVuc2lnbmVkLgorLy8KKyNkZWZpbmUgTUFYKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworCisvLworLy8gUmV0dXJuIHRoZSBtaW5pbXVtIG9mIHR3byBvcGVyYW5kcy4KKy8vIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgbWluaW1hbCBvZiB0d28gb3BlcmFuZCBzcGVjaWZpZWQgYnkgYSBhbmQgYi4KKy8vIEJvdGggYSBhbmQgYiBtdXN0IGJlIHRoZSBzYW1lIG51bWVyaWNhbCB0eXBlcywgc2lnbmVkIG9yIHVuc2lnbmVkLgorLy8KKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworCisvLworLy8gRUZJIEVycm9yIENvZGVzIGNvbW1vbiB0byBhbGwgZXhlY3V0aW9uIHBoYXNlcworLy8KKwordHlwZWRlZiBJTlROIFJFVFVSTl9TVEFUVVM7CisKKy8vLworLy8vIFNldCB0aGUgdXBwZXIgYml0IHRvIGluZGljYXRlIEVGSSBFcnJvci4KKy8vLworI2RlZmluZSBFTkNPREVfRVJST1IoYSkgICAgICAgICAgICAgIChNQVhfQklUIHwgKGEpKQorCisjZGVmaW5lIEVOQ09ERV9XQVJOSU5HKGEpICAgICAgICAgICAgKGEpCisjZGVmaW5lIFJFVFVSTl9FUlJPUihhKSAgICAgICAgICAgICAgKChJTlROKSAoYSkgPCAwKQorCisjZGVmaW5lIFJFVFVSTl9TVUNDRVNTICAgICAgICAgICAgICAgMAorI2RlZmluZSBSRVRVUk5fTE9BRF9FUlJPUiAgICAgICAgICAgIEVOQ09ERV9FUlJPUiAoMSkKKyNkZWZpbmUgUkVUVVJOX0lOVkFMSURfUEFSQU1FVEVSICAgICBFTkNPREVfRVJST1IgKDIpCisjZGVmaW5lIFJFVFVSTl9VTlNVUFBPUlRFRCAgICAgICAgICAgRU5DT0RFX0VSUk9SICgzKQorI2RlZmluZSBSRVRVUk5fQkFEX0JVRkZFUl9TSVpFICAgICAgIEVOQ09ERV9FUlJPUiAoNCkKKyNkZWZpbmUgUkVUVVJOX0JVRkZFUl9UT09fU01BTEwgICAgICBFTkNPREVfRVJST1IgKDUpCisjZGVmaW5lIFJFVFVSTl9OT1RfUkVBRFkgICAgICAgICAgICAgRU5DT0RFX0VSUk9SICg2KQorI2RlZmluZSBSRVRVUk5fREVWSUNFX0VSUk9SICAgICAgICAgIEVOQ09ERV9FUlJPUiAoNykKKyNkZWZpbmUgUkVUVVJOX1dSSVRFX1BST1RFQ1RFRCAgICAgICBFTkNPREVfRVJST1IgKDgpCisjZGVmaW5lIFJFVFVSTl9PVVRfT0ZfUkVTT1VSQ0VTICAgICAgRU5DT0RFX0VSUk9SICg5KQorI2RlZmluZSBSRVRVUk5fVk9MVU1FX0NPUlJVUFRFRCAgICAgIEVOQ09ERV9FUlJPUiAoMTApCisjZGVmaW5lIFJFVFVSTl9WT0xVTUVfRlVMTCAgICAgICAgICAgRU5DT0RFX0VSUk9SICgxMSkKKyNkZWZpbmUgUkVUVVJOX05PX01FRElBICAgICAgICAgICAgICBFTkNPREVfRVJST1IgKDEyKQorI2RlZmluZSBSRVRVUk5fTUVESUFfQ0hBTkdFRCAgICAgICAgIEVOQ09ERV9FUlJPUiAoMTMpCisjZGVmaW5lIFJFVFVSTl9OT1RfRk9VTkQgICAgICAgICAgICAgRU5DT0RFX0VSUk9SICgxNCkKKyNkZWZpbmUgUkVUVVJOX0FDQ0VTU19ERU5JRUQgICAgICAgICBFTkNPREVfRVJST1IgKDE1KQorI2RlZmluZSBSRVRVUk5fTk9fUkVTUE9OU0UgICAgICAgICAgIEVOQ09ERV9FUlJPUiAoMTYpCisjZGVmaW5lIFJFVFVSTl9OT19NQVBQSU5HICAgICAgICAgICAgRU5DT0RFX0VSUk9SICgxNykKKyNkZWZpbmUgUkVUVVJOX1RJTUVPVVQgICAgICAgICAgICAgICBFTkNPREVfRVJST1IgKDE4KQorI2RlZmluZSBSRVRVUk5fTk9UX1NUQVJURUQgICAgICAgICAgIEVOQ09ERV9FUlJPUiAoMTkpCisjZGVmaW5lIFJFVFVSTl9BTFJFQURZX1NUQVJURUQgICAgICAgRU5DT0RFX0VSUk9SICgyMCkKKyNkZWZpbmUgUkVUVVJOX0FCT1JURUQgICAgICAgICAgICAgICBFTkNPREVfRVJST1IgKDIxKQorI2RlZmluZSBSRVRVUk5fSUNNUF9FUlJPUiAgICAgICAgICAgIEVOQ09ERV9FUlJPUiAoMjIpCisjZGVmaW5lIFJFVFVSTl9URlRQX0VSUk9SICAgICAgICAgICAgRU5DT0RFX0VSUk9SICgyMykKKyNkZWZpbmUgUkVUVVJOX1BST1RPQ09MX0VSUk9SICAgICAgICBFTkNPREVfRVJST1IgKDI0KQorI2RlZmluZSBSRVRVUk5fSU5DT01QQVRJQkxFX1ZFUlNJT04gIEVOQ09ERV9FUlJPUiAoMjUpCisjZGVmaW5lIFJFVFVSTl9TRUNVUklUWV9WSU9MQVRJT04gICAgRU5DT0RFX0VSUk9SICgyNikKKyNkZWZpbmUgUkVUVVJOX0NSQ19FUlJPUiAgICAgICAgICAgICBFTkNPREVfRVJST1IgKDI3KQorI2RlZmluZSBSRVRVUk5fRU5EX09GX01FRElBICAgICAgICAgIEVOQ09ERV9FUlJPUiAoMjgpCisjZGVmaW5lIFJFVFVSTl9FTkRfT0ZfRklMRSAgICAgICAgICAgRU5DT0RFX0VSUk9SICgzMSkKKyNkZWZpbmUgUkVUVVJOX0lOVkFMSURfTEFOR1VBR0UgICAgICBFTkNPREVfRVJST1IgKDMyKQorCisKKyNkZWZpbmUgUkVUVVJOX1dBUk5fVU5LTk9XTl9HTFlQSCAgICBFTkNPREVfV0FSTklORyAoMSkKKyNkZWZpbmUgUkVUVVJOX1dBUk5fREVMRVRFX0ZBSUxVUkUgICBFTkNPREVfV0FSTklORyAoMikKKyNkZWZpbmUgUkVUVVJOX1dBUk5fV1JJVEVfRkFJTFVSRSAgICBFTkNPREVfV0FSTklORyAoMykKKyNkZWZpbmUgUkVUVVJOX1dBUk5fQlVGRkVSX1RPT19TTUFMTCBFTkNPREVfV0FSTklORyAoNCkKKworLyoqCisgIFJldHVybnMgYSAxNi1iaXQgc2lnbmF0dXJlIGJ1aWx0IGZyb20gMiBBU0NJSSBjaGFyYWN0ZXJzLgorCisgIEBwYXJhbSAgQQkgICBUaGUgZmlyc3QgQVNDSUkgY2hhcmFjdGVyLgorICBAcGFyYW0gIEIJICAgVGhlIHNlY29uZCBBU0NJSSBjaGFyYWN0ZXIuCisKKyAgQHJldHVybiBBIDE2LWJpdCB2YWx1ZSBidWlsdCBmcm9tIHRoZSB0d28gQVNDSUkgY2hhcmFjdGVycyBzcGVjaWZpZWQgYnkgQSBhbmQgQi4KKworKiovCisjZGVmaW5lIFNJR05BVFVSRV8xNihBLCBCKSAgICAgICAgKChBKSB8IChCIDw8IDgpKQorCisvKioKKyAgUmV0dXJucyBhIDMyLWJpdCBzaWduYXR1cmUgYnVpbHQgZnJvbSA0IEFTQ0lJIGNoYXJhY3RlcnMuCisKKyAgQHBhcmFtICBBCSAgIFRoZSBmaXJzdCBBU0NJSSBjaGFyYWN0ZXIuCisgIEBwYXJhbSAgQgkgICBUaGUgc2Vjb25kIEFTQ0lJIGNoYXJhY3Rlci4KKyAgQHBhcmFtICBDCSAgIFRoZSB0aGlyZCBBU0NJSSBjaGFyYWN0ZXIuCisgIEBwYXJhbSAgRAkgICBUaGUgZm91cnRoIEFTQ0lJIGNoYXJhY3Rlci4KKworICBAcmV0dXJuIEEgMzItYml0IHZhbHVlIGJ1aWx0IGZyb20gdGhlIHR3byBBU0NJSSBjaGFyYWN0ZXJzIHNwZWNpZmllZCBieSBBLCBCLAorICAgICAgICAgIEMgYW5kIEQuCisKKyoqLworI2RlZmluZSBTSUdOQVRVUkVfMzIoQSwgQiwgQywgRCkgIChTSUdOQVRVUkVfMTYgKEEsIEIpIHwgKFNJR05BVFVSRV8xNiAoQywgRCkgPDwgMTYpKQorCisvKioKKyAgUmV0dXJucyBhIDY0LWJpdCBzaWduYXR1cmUgYnVpbHQgZnJvbSA4IEFTQ0lJIGNoYXJhY3RlcnMuCisKKyAgQHBhcmFtICBBCSAgIFRoZSBmaXJzdCBBU0NJSSBjaGFyYWN0ZXIuCisgIEBwYXJhbSAgQgkgICBUaGUgc2Vjb25kIEFTQ0lJIGNoYXJhY3Rlci4KKyAgQHBhcmFtICBDCSAgIFRoZSB0aGlyZCBBU0NJSSBjaGFyYWN0ZXIuCisgIEBwYXJhbSAgRAkgICBUaGUgZm91cnRoIEFTQ0lJIGNoYXJhY3Rlci4KKyAgQHBhcmFtICBFCSAgIFRoZSBmaWZ0aCBBU0NJSSBjaGFyYWN0ZXIuCisgIEBwYXJhbSAgRgkgICBUaGUgc2l4dGggQVNDSUkgY2hhcmFjdGVyLgorICBAcGFyYW0gIEcJICAgVGhlIHNldmVudGggQVNDSUkgY2hhcmFjdGVyLgorICBAcGFyYW0gIEgJICAgVGhlIGVpZ2h0aCBBU0NJSSBjaGFyYWN0ZXIuCisKKyAgQHJldHVybiBBIDY0LWJpdCB2YWx1ZSBidWlsdCBmcm9tIHRoZSB0d28gQVNDSUkgY2hhcmFjdGVycyBzcGVjaWZpZWQgYnkgQSwgQiwKKyAgICAgICAgICBDLCBELCBFLCBGLCBHIGFuZCBILgorCisqKi8KKyNkZWZpbmUgU0lHTkFUVVJFXzY0KEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgpIFwKKyAgICAoU0lHTkFUVVJFXzMyIChBLCBCLCBDLCBEKSB8ICgoVUlOVDY0KSAoU0lHTkFUVVJFXzMyIChFLCBGLCBHLCBIKSkgPDwgMzIpKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9HdWlkL1BjQW5zaS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9HdWlkL1BjQW5zaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWIzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL0d1aWQvUGNBbnNpLmgKQEAgLTAsMCArMSw1OCBAQAorLyoqIEBmaWxlCisgIFRlcm1pbmFsIERldmljZSBQYXRoIFZlbmRvciBHdWlkLgorCisgIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyAgQHBhciBSZXZpc2lvbiBSZWZlcmVuY2U6CisgIEdVSURzIGRlZmluZWQgaW4gVUVGSSAyLjAgc3BlYy4KKworKiovCisKKyNpZm5kZWYgX19QQ19BTlNJX0hfXworI2RlZmluZSBfX1BDX0FOU0lfSF9fCisKKyNkZWZpbmUgRUZJX1BDX0FOU0lfR1VJRCBcCisgIHsgXAorICAgIDB4ZTBjMTQ3NTMsIDB4ZjliZSwgMHgxMWQyLCB7MHg5YSwgMHgwYywgMHgwMCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZCB9IFwKKyAgfQorCisjZGVmaW5lIEVGSV9WVF8xMDBfR1VJRCBcCisgIHsgXAorICAgIDB4ZGZhNjYwNjUsIDB4YjQxOSwgMHgxMWQzLCB7MHg5YSwgMHgyZCwgMHgwMCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZCB9IFwKKyAgfQorCisjZGVmaW5lIEVGSV9WVF8xMDBfUExVU19HVUlEIFwKKyAgeyBcCisgICAgMHg3YmFlYzcwYiwgMHg1N2UwLCAweDRjNzYsIHsweDhlLCAweDg3LCAweDJmLCAweDllLCAweDI4LCAweDA4LCAweDgzLCAweDQzIH0gXAorICB9CisKKyNkZWZpbmUgRUZJX1ZUX1VURjhfR1VJRCBcCisgIHsgXAorICAgIDB4YWQxNWEwZDYsIDB4OGJlYywgMHg0YWNmLCB7MHhhMCwgMHg3MywgMHhkMCwgMHgxZCwgMHhlNywgMHg3ZSwgMHgyZCwgMHg4OCB9IFwKKyAgfQorCisjZGVmaW5lIEVGSV9VQVJUX0RFVklDRV9QQVRIX0dVSUQgXAorICB7IFwKKyAgICAweDM3NDk5YTlkLCAweDU0MmYsIDB4NGM4OSwgezB4YTAsIDB4MjYsIDB4MzUsIDB4ZGEsIDB4MTQsIDB4MjAsIDB4OTQsIDB4ZTQgfSBcCisgIH0KKworI2RlZmluZSBFRklfU0FTX0RFVklDRV9QQVRIX0dVSUQgXAorICB7IFwKKyAgICAweGQ0ODdkZGI0LCAweDAwOGIsIDB4MTFkOSwgezB4YWYsIDB4ZGMsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZmYsIDB4Y2EsIDB4NGQgfSBcCisgIH0KKworZXh0ZXJuIEVGSV9HVUlEIGdFZmlQY0Fuc2lHdWlkOworZXh0ZXJuIEVGSV9HVUlEIGdFZmlWVDEwMEd1aWQ7CitleHRlcm4gRUZJX0dVSUQgZ0VmaVZUMTAwUGx1c0d1aWQ7CitleHRlcm4gRUZJX0dVSUQgZ0VmaVZUVVRGOEd1aWQ7CitleHRlcm4gRUZJX0dVSUQgZ0VmaVVhcnREZXZpY2VQYXRoR3VpZDsKK2V4dGVybiBFRklfR1VJRCBnRWZpU2FzRGV2aWNlUGF0aEd1aWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9HdWlkL1NtQmlvcy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9HdWlkL1NtQmlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzdmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL0d1aWQvU21CaW9zLmgKQEAgLTAsMCArMSwzNCBAQAorLyoqIEBmaWxlCisgIEdVSURzIHVzZWQgdG8gbG9jYXRlIHRoZSBTTUJJT1MgdGFibGVzIGluIHRoZSBVRUZJIDIuMCBzeXN0ZW0gdGFibGUuCisKKyAgVGhpcyBHVUlEIGluIHRoZSBzeXN0ZW0gdGFibGUgaXMgdGhlIG9ubHkgbGVnYWwgd2F5IHRvIHNlYXJjaCBmb3IgYW5kCisgIGxvY2F0ZSB0aGUgU01CSU9TIHRhYmxlcy4gRG8gbm90IHNlYXJjaCB0aGUgMHhGMDAwMCBzZWdtZW50IHRvIGZpbmQgU01CSU9TCisgIHRhYmxlcy4KKworICBDb3B5cmlnaHQgKGMpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisgIEBwYXIgUmV2aXNpb24gUmVmZXJlbmNlOgorICBHVUlEcyBkZWZpbmVkIGluIFVFRkkgMi4wIHNwZWMuCisKKyoqLworCisjaWZuZGVmIF9fU01CSU9TX0dVSURfSF9fCisjZGVmaW5lIF9fU01CSU9TX0dVSURfSF9fCisKKyNkZWZpbmUgRUZJX1NNQklPU19UQUJMRV9HVUlEIFwKKyAgeyBcCisgICAgMHhlYjlkMmQzMSwgMHgyZDg4LCAweDExZDMsIHsweDlhLCAweDE2LCAweDAsIDB4OTAsIDB4MjcsIDB4M2YsIDB4YzEsIDB4NGQgfSBcCisgIH0KKworI2RlZmluZSBTTUJJT1NfVEFCTEVfR1VJRCBFRklfU01CSU9TX1RBQkxFX0dVSUQKKworZXh0ZXJuIEVGSV9HVUlEICAgICAgIGdFZmlTbWJpb3NUYWJsZUd1aWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9JYTMyL1Byb2Nlc3NvckJpbmQuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvSWEzMi9Qcm9jZXNzb3JCaW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzYTkxOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvSWEzMi9Qcm9jZXNzb3JCaW5kLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qKiBAZmlsZQorICBQcm9jZXNzb3Igb3IgQ29tcGlsZXIgc3BlY2lmaWMgZGVmaW5lcyBhbmQgdHlwZXMgZm9yIElhMzIgYXJjaGl0ZWN0dXJlLgorCisgIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyoqLworCisjaWZuZGVmIF9fUFJPQ0VTU09SX0JJTkRfSF9fCisjZGVmaW5lIF9fUFJPQ0VTU09SX0JJTkRfSF9fCisKKy8vLworLy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHR5cGUgc28gb3RoZXIgY29kZSBjYW4gbWFrZSBwcm9jZXNzb3IgYmFzZWQgY2hvaWNlcworLy8vCisjZGVmaW5lIE1ERV9DUFVfSUEzMgorCisvLworLy8gTWFrZSBzdXJlIHdlIGFyZSB1c2VpbmcgdGhlIGNvcnJlY3QgcGFja2luZyBydWxlcyBwZXIgRUZJIHNwZWNpZmljYXRpb24KKy8vCisjaWZuZGVmIF9fR05VQ19fCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCisKKyNpZiBfX0lOVEVMX0NPTVBJTEVSCisvLworLy8gRGlzYWJsZSBJQ0MncyByZW1hcmsgIzg2OTogIlBhcmFtZXRlciIgd2FzIG5ldmVyIHJlZmVyZW5jZWQgd2FybmluZy4KKy8vIFRoaXMgaXMgbGVnYWwgQU5TSSBDIGNvZGUgc28gd2UgZGlzYWJsZSB0aGUgcmVtYXJrIHRoYXQgaXMgdHVybmVkIG9uIHdpdGggLVdhbGwKKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogODY5ICkKKworLy8KKy8vIERpc2FibGUgSUNDJ3MgcmVtYXJrICMxNDE4OiBleHRlcm5hbCBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGggbm8gcHJpb3IgZGVjbGFyYXRpb24uCisvLyBUaGlzIGlzIGxlZ2FsIEFOU0kgQyBjb2RlIHNvIHdlIGRpc2FibGUgdGhlIHJlbWFyayB0aGF0IGlzIHR1cm5lZCBvbiB3aXRoIC9XNAorLy8KKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiAxNDE4ICkKKworLy8KKy8vIERpc2FibGUgSUNDJ3MgcmVtYXJrICMxNDE5OiBleHRlcm5hbCBkZWNsYXJhdGlvbiBpbiBwcmltYXJ5IHNvdXJjZSBmaWxlCisvLyBUaGlzIGlzIGxlZ2FsIEFOU0kgQyBjb2RlIHNvIHdlIGRpc2FibGUgdGhlIHJlbWFyayB0aGF0IGlzIHR1cm5lZCBvbiB3aXRoIC9XNAorLy8KKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiAxNDE5ICkKKworI2VuZGlmCisKKworI2lmIF9NU0NfRVhURU5TSU9OUworCisvLworLy8gRGlzYWJsZSB3YXJuaW5nIHRoYXQgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIGNvbXBpbGUgYXQgL1c0CisvLyBUaGlzIG9ubHkgd29ya3MgZm9yIE1pY3Jvc29mdCogdG9vbHMKKy8vCisKKy8vCisvLyBEaXNhYmxpbmcgYml0ZmllbGQgdHlwZSBjaGVja2luZyB3YXJuaW5ncy4KKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDIxNCApCisKKy8vCisvLyBEaXNhYmxpbmcgdGhlIHVucmVmZXJlbmNlZCBmb3JtYWwgcGFyYW1ldGVyIHdhcm5pbmdzLgorLy8KKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiA0MTAwICkKKworLy8KKy8vIERpc2FibGUgc2xpZ2h0bHkgZGlmZmVyZW50IGJhc2UgdHlwZXMgd2FybmluZyBhcyBDSEFSOCAqIGNhbiBub3QgYmUgc2V0CisvLyB0byBhIGNvbnN0YW50IHN0cmluZy4KKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDA1NyApCisKKy8vCisvLyBBU1NFUlQoRkFMU0UpIG9yIHdoaWxlIChUUlVFKSBhcmUgbGVnYWwgY29uc3RydWN0ZXMgc28gc3VwcmVzcyB0aGlzIHdhcm5pbmcKKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDEyNyApCisKKy8vCisvLyBUaGlzIHdhcm5pbmcgaXMgY2F1c2VkIGJ5IGZ1bmN0aW9ucyBkZWZpbmVkIGJ1dCBub3QgdXNlZC4gRm9yIHByZWNvbXBpbGVkIGhlYWRlciBvbmx5LgorLy8KKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiA0NTA1ICkKKworLy8KKy8vIFRoaXMgd2FybmluZyBpcyBjYXVzZWQgYnkgZW1wdHkgKGFmdGVyIHByZXByb2Nlc3NpbmcpIHNvdWNlIGZpbGUuIEZvciBwcmVjb21waWxlZCBoZWFkZXIgb25seS4KKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDIwNiApCisKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPCAxOTk5MDFMKQorICAvLworICAvLyBObyBBTlNJIEMgMjAwMCBzdGRpbnQuaCBpbnRlZ2VyIHdpZHRoIGRlY2xhcmF0aW9ucywgc28gZGVmaW5lIGVxdWl2YWxlbnRzCisgIC8vCisKKyAgI2lmIF9NU0NfRVhURU5TSU9OUworCisgICAgLy8KKyAgICAvLyB1c2UgTWljcm9zb2Z0KiBDIGNvbXBsaWVyIGRlcGVuZGVudCBpbnRlcmdlciB3aWR0aCB0eXBlcworICAgIC8vCisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgIFVJTlQ2NDsKKyAgICB0eXBlZGVmIF9faW50NjQgICAgICAgICAgICAgSU5UNjQ7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyICAgIFVJTlQzMjsKKyAgICB0eXBlZGVmIF9faW50MzIgICAgICAgICAgICAgSU5UMzI7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIFVJTlQxNjsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgQ0hBUjE2OworICAgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBJTlQxNjsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgQk9PTEVBTjsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgVUlOVDg7CisgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIENIQVI4OworICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBJTlQ4OworICAjZWxzZQorCisgICAgLy8KKyAgICAvLyBBc3N1bWUgc3RhbmRhcmQgSUEtMzIgYWxpZ25tZW50LgorICAgIC8vIE5lZWQgdG8gY2hlY2sgcG9ydGFiaWxpdHkgb2YgbG9uZyBsb25nCisgICAgLy8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgVUlOVDY0OworICAgIHR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICBJTlQ2NDsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgVUlOVDMyOworICAgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBJTlQzMjsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgVUlOVDE2OworICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICBDSEFSMTY7CisgICAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICAgIElOVDE2OworICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICBCT09MRUFOOworICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICBVSU5UODsKKyAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgQ0hBUjg7CisgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIElOVDg7CisgICNlbmRpZgorCisgICNkZWZpbmUgVUlOVDhfTUFYIDB4ZmYKKworI2Vsc2UKKyAgLy8KKyAgLy8gVXNlIEFOU0kgQyAyMDAwIHN0ZGludC5oIGludGVnZXIgd2lkdGggZGVjbGFyYXRpb25zCisgIC8vCisgICNpbmNsdWRlICJzdGRpbnQuaCIKKyAgdHlwZWRlZiB1aW50OF90ICAgQk9PTEVBTjsKKyAgdHlwZWRlZiBpbnQ4X3QgICAgSU5UODsKKyAgdHlwZWRlZiB1aW50OF90ICAgVUlOVDg7CisgIHR5cGVkZWYgaW50MTZfdCAgIElOVDE2OworICB0eXBlZGVmIHVpbnQxNl90ICBVSU5UMTY7CisgIHR5cGVkZWYgaW50MzJfdCAgIElOVDMyOworICB0eXBlZGVmIHVpbnQzMl90ICBVSU5UMzI7CisgIHR5cGVkZWYgaW50NjRfdCAgIElOVDY0OworICB0eXBlZGVmIHVpbnQ2NF90ICBVSU5UNjQ7CisgIHR5cGVkZWYgY2hhciAgICAgIENIQVI4OworICB0eXBlZGVmIHVpbnQxNl90ICBDSEFSMTY7CisKKyNlbmRpZgorCit0eXBlZGVmIFVJTlQzMiAgVUlOVE47Cit0eXBlZGVmIElOVDMyICAgSU5UTjsKKworCisvLy8KKy8vLyBQcm9jZXNzb3Igc3BlY2lmaWMgZGVmaW5lcworLy8vCisjZGVmaW5lIE1BWF9CSVQgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTUFYXzJfQklUUyAgMHhDMDAwMDAwMAorCisvLy8KKy8vLyBNYXhpbXVtIGxlZ2FsIElBLTMyIGFkZHJlc3MKKy8vLworI2RlZmluZSBNQVhfQUREUkVTUyAgIDB4RkZGRkZGRkYKKworLy8vCisvLy8gVGhlIHN0YWNrIGFsaWdubWVudCByZXF1aXJlZCBmb3IgSUEtMzIKKy8vLworI2RlZmluZSBDUFVfU1RBQ0tfQUxJR05NRU5UICAgc2l6ZW9mKFVJTlROKQorCisvLworLy8gTW9kaWZpZXIgdG8gZW5zdXJlIHRoYXQgYWxsIHByb3RvY29sIG1lbWJlciBmdW5jdGlvbnMgYW5kIEVGSSBpbnRyaW5zaWNzCisvLyB1c2UgdGhlIGNvcnJlY3QgQyBjYWxsaW5nIGNvbnZlbnRpb24uIEFsbCBwcm90b2NvbCBtZW1iZXIgZnVuY3Rpb25zIGFuZAorLy8gRUZJIGludHJpbnNpY3MgYXJlIHJlcXVpcmVkIHRvIG1vZGlmeSB0aGllciBtZW1iZXIgZnVuY3Rpb25zIHdpdGggRUZJQVBJLgorLy8KKyNpZiBfTVNDX0VYVEVOU0lPTlMKKyAgLy8vCisgIC8vLyBNaWNyb3NvZnQqIGNvbXBpbGVyIHJlcXVpcmVzIF9FRklBUEkgdXNlYWdlLCBfX2NkZWNsIGlzIE1pY3Jvc29mdCogc3BlY2lmaWMgQy4KKyAgLy8vCisgICNkZWZpbmUgRUZJQVBJIF9fY2RlY2wKKyNlbHNlCisgICNpZiBfX0dOVUNfXworICAgICNkZWZpbmUgRUZJQVBJIF9fYXR0cmlidXRlX18oKGNkZWNsLHJlZ3Bhcm0oMCkpKQorICAjZW5kaWYKKyNlbmRpZgorCisvLworLy8gVGhlIE1pY3Jvc29mdCogQyBjb21waWxlciBjYW4gcmVtb3ZlZCByZWZlcmVuY2VzIHRvIHVucmVmZXJlbmNlZCBkYXRhIGl0ZW1zCisvLyAgaWYgdGhlIC9PUFQ6UkVGIGxpbmtlciBvcHRpb24gaXMgdXNlZC4gV2UgZGVmaW5lZCBhIG1hY3JvIGFzIHRoaXMgaXMgYQorLy8gIGEgbm9uIHN0YW5kYXJkIGV4dGVuc2lvbgorLy8KKyNpZiBfTVNDX0VYVEVOU0lPTlMKKyAgI2RlZmluZSBHTE9CQUxfUkVNT1ZFX0lGX1VOUkVGRVJFTkNFRCBfX2RlY2xzcGVjKHNlbGVjdGFueSkKKyNlbHNlCisgICNkZWZpbmUgR0xPQkFMX1JFTU9WRV9JRl9VTlJFRkVSRU5DRUQKKyNlbmRpZgorCisvLworLy8gRm9yIHN5bWJvbCBuYW1lIGluIEdOVSBhc3NlbWJseSBjb2RlLCBhbiBleHRyYSAiXyIgaXMgbmVjZXNzYXJ5CisvLworI2lmIF9fR05VQ19fCisgICNpZiBkZWZpbmVkKGxpbnV4KQorICAgICNkZWZpbmUgQVNNX1BGWChuYW1lKSBuYW1lCisgICNlbHNlCisgICAgI2RlZmluZSBBU01fUEZYKG5hbWUpIF8jI25hbWUKKyAgI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBGVU5DVElPTl9FTlRSWV9QT0lOVChwKSAocCkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvSW5kdXN0cnlTdGFuZGFyZC9QY2kyMi5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9JbmR1c3RyeVN0YW5kYXJkL1BjaTIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5NmE1NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvSW5kdXN0cnlTdGFuZGFyZC9QY2kyMi5oCkBAIC0wLDAgKzEsNjAxIEBACisvKiogQGZpbGUKKyAgU3VwcG9ydCBmb3IgUENJIDIuMiBzdGFuZGFyZC4KKworICBUaGlzIGZpbGUgaW5jbHVkZXMgdGhlIGRlZmluaXRpb25zIGluIHRoZSBmb2xsb3dpbmcgc3BlY2lmaWNhdGlvbnMsCisgICAgUENJIExvY2FsIEJ1cyBTcGVjaWZpY2F0aW9uLCAyLjAKKyAgICBQQ0ktdG8tUENJIEJyaWRnZSBBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbiwKKyAgICBQQyBDYXJkIFN0YW5kYXJkLCA4LjAKKworICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CisgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworKiovCisKKyNpZm5kZWYgX1BDSTIyX0hfCisjZGVmaW5lIF9QQ0kyMl9IXworCisjZGVmaW5lIFBDSV9NQVhfU0VHTUVOVCAwCisjZGVmaW5lIFBDSV9NQVhfQlVTICAgICAyNTUKKyNkZWZpbmUgUENJX01BWF9ERVZJQ0UgIDMxCisjZGVmaW5lIFBDSV9NQVhfRlVOQyAgICA3CisKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQxNiAgVmVuZG9ySWQ7CisgIFVJTlQxNiAgRGV2aWNlSWQ7CisgIFVJTlQxNiAgQ29tbWFuZDsKKyAgVUlOVDE2ICBTdGF0dXM7CisgIFVJTlQ4ICAgUmV2aXNpb25JRDsKKyAgVUlOVDggICBDbGFzc0NvZGVbM107CisgIFVJTlQ4ICAgQ2FjaGVMaW5lU2l6ZTsKKyAgVUlOVDggICBMYXRlbmN5VGltZXI7CisgIFVJTlQ4ICAgSGVhZGVyVHlwZTsKKyAgVUlOVDggICBCSVNUOworfSBQQ0lfREVWSUNFX0lOREVQRU5ERU5UX1JFR0lPTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgIEJhcls2XTsKKyAgVUlOVDMyICBDSVNQdHI7CisgIFVJTlQxNiAgU3Vic3lzdGVtVmVuZG9ySUQ7CisgIFVJTlQxNiAgU3Vic3lzdGVtSUQ7CisgIFVJTlQzMiAgRXhwYW5zaW9uUm9tQmFyOworICBVSU5UOCAgIENhcGFiaWxpdHlQdHI7CisgIFVJTlQ4ICAgUmVzZXJ2ZWQxWzNdOworICBVSU5UMzIgIFJlc2VydmVkMjsKKyAgVUlOVDggICBJbnRlcnJ1cHRMaW5lOworICBVSU5UOCAgIEludGVycnVwdFBpbjsKKyAgVUlOVDggICBNaW5HbnQ7CisgIFVJTlQ4ICAgTWF4TGF0OworfSBQQ0lfREVWSUNFX0hFQURFUl9UWVBFX1JFR0lPTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBQQ0lfREVWSUNFX0lOREVQRU5ERU5UX1JFR0lPTiBIZHI7CisgIFBDSV9ERVZJQ0VfSEVBREVSX1RZUEVfUkVHSU9OIERldmljZTsKK30gUENJX1RZUEUwMDsKKworLy8vCisvLy8gZGVmaW5lZCBpbiBQQ0ktdG8tUENJIEJyaWRnZSBBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgQmFyWzJdOworICBVSU5UOCAgIFByaW1hcnlCdXM7CisgIFVJTlQ4ICAgU2Vjb25kYXJ5QnVzOworICBVSU5UOCAgIFN1Ym9yZGluYXRlQnVzOworICBVSU5UOCAgIFNlY29uZGFyeUxhdGVuY3lUaW1lcjsKKyAgVUlOVDggICBJb0Jhc2U7CisgIFVJTlQ4ICAgSW9MaW1pdDsKKyAgVUlOVDE2ICBTZWNvbmRhcnlTdGF0dXM7CisgIFVJTlQxNiAgTWVtb3J5QmFzZTsKKyAgVUlOVDE2ICBNZW1vcnlMaW1pdDsKKyAgVUlOVDE2ICBQcmVmZXRjaGFibGVNZW1vcnlCYXNlOworICBVSU5UMTYgIFByZWZldGNoYWJsZU1lbW9yeUxpbWl0OworICBVSU5UMzIgIFByZWZldGNoYWJsZUJhc2VVcHBlcjMyOworICBVSU5UMzIgIFByZWZldGNoYWJsZUxpbWl0VXBwZXIzMjsKKyAgVUlOVDE2ICBJb0Jhc2VVcHBlcjE2OworICBVSU5UMTYgIElvTGltaXRVcHBlcjE2OworICBVSU5UOCAgIENhcGFiaWxpdHlQdHI7CisgIFVJTlQ4ICAgUmVzZXJ2ZWRbM107CisgIFVJTlQzMiAgRXhwYW5zaW9uUm9tQkFSOworICBVSU5UOCAgIEludGVycnVwdExpbmU7CisgIFVJTlQ4ICAgSW50ZXJydXB0UGluOworICBVSU5UMTYgIEJyaWRnZUNvbnRyb2w7Cit9IFBDSV9CUklER0VfQ09OVFJPTF9SRUdJU1RFUjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBQQ0lfREVWSUNFX0lOREVQRU5ERU5UX1JFR0lPTiBIZHI7CisgIFBDSV9CUklER0VfQ09OVFJPTF9SRUdJU1RFUiAgIEJyaWRnZTsKK30gUENJX1RZUEUwMTsKKwordHlwZWRlZiB1bmlvbiB7CisgIFBDSV9UWVBFMDAgIERldmljZTsKKyAgUENJX1RZUEUwMSAgQnJpZGdlOworfSBQQ0lfVFlQRV9HRU5FUklDOworCisvLy8KKy8vLyBDYXJkQnVzIENvbnJvbGxlciBDb25maWd1cmF0aW9uIFNwYWNlLCBkZWZpbmVkIGluIFBDIENhcmQgU3RhbmRhcmQuIDguMAorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgQ2FyZEJ1c1NvY2tldFJlZzsgICAgIC8vLzwgQ2FyZHVzIFNvY2tldC9FeENBIEJhc2UKKyAgVUlOVDggICBDYXBfUHRyOworICBVSU5UOCAgIFJlc2VydmVkOworICBVSU5UMTYgIFNlY29uZGFyeVN0YXR1czsgICAgICAvLy88IFNlY29uZGFyeSBTdGF0dXMKKyAgVUlOVDggICBQY2lCdXNOdW1iZXI7ICAgICAgICAgLy8vPCBQQ0kgQnVzIE51bWJlcgorICBVSU5UOCAgIENhcmRCdXNCdXNOdW1iZXI7ICAgICAvLy88IENhcmRCdXMgQnVzIE51bWJlcgorICBVSU5UOCAgIFN1Ym9yZGluYXRlQnVzTnVtYmVyOyAvLy88IFN1Ym9yZGluYXRlIEJ1cyBOdW1iZXIKKyAgVUlOVDggICBDYXJkQnVzTGF0ZW5jeVRpbWVyOyAgLy8vPCBDYXJkQnVzIExhdGVuY3kgVGltZXIKKyAgVUlOVDMyICBNZW1vcnlCYXNlMDsgICAgICAgICAgLy8vPCBNZW1vcnkgQmFzZSBSZWdpc3RlciAwCisgIFVJTlQzMiAgTWVtb3J5TGltaXQwOyAgICAgICAgIC8vLzwgTWVtb3J5IExpbWl0IFJlZ2lzdGVyIDAKKyAgVUlOVDMyICBNZW1vcnlCYXNlMTsKKyAgVUlOVDMyICBNZW1vcnlMaW1pdDE7CisgIFVJTlQzMiAgSW9CYXNlMDsKKyAgVUlOVDMyICBJb0xpbWl0MDsgICAgICAgICAgICAgLy8vPCBJL08gQmFzZSBSZWdpc3RlciAwCisgIFVJTlQzMiAgSW9CYXNlMTsgICAgICAgICAgICAgIC8vLzwgSS9PIExpbWl0IFJlZ2lzdGVyIDAKKyAgVUlOVDMyICBJb0xpbWl0MTsKKyAgVUlOVDggICBJbnRlcnJ1cHRMaW5lOyAgICAgICAgLy8vPCBJbnRlcnJ1cHQgTGluZQorICBVSU5UOCAgIEludGVycnVwdFBpbjsgICAgICAgICAvLy88IEludGVycnVwdCBQaW4KKyAgVUlOVDE2ICBCcmlkZ2VDb250cm9sOyAgICAgICAgLy8vPCBCcmlkZ2UgQ29udHJvbAorfSBQQ0lfQ0FSREJVU19DT05UUk9MX1JFR0lTVEVSOworCisvLy8KKy8vLyBEZWZpbml0aW9ucyBvZiBQQ0kgY2xhc3MgYnl0ZXMgYW5kIG1hbmlwdWxhdGlvbiBtYWNyb3MuCisvLy8KKyNkZWZpbmUgUENJX0NMQVNTX09MRCAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgIFBDSV9DTEFTU19PTERfT1RIRVIgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfT0xEX1ZHQSAgICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgUENJX0NMQVNTX01BU1NfU1RPUkFHRSAgICAgICAgMHgwMQorI2RlZmluZSAgIFBDSV9DTEFTU19NQVNTX1NUT1JBR0VfU0NTSSAgIDB4MDAKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfTUFTU19TVE9SQUdFX0lERSAgICAweDAxCisjZGVmaW5lICAgUENJX0NMQVNTX01BU1NfU1RPUkFHRV9GTE9QUFkgMHgwMgorI2RlZmluZSAgIFBDSV9DTEFTU19NQVNTX1NUT1JBR0VfSVBJICAgIDB4MDMKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfTUFTU19TVE9SQUdFX1JBSUQgICAweDA0CisjZGVmaW5lICAgUENJX0NMQVNTX01BU1NfU1RPUkFHRV9PVEhFUiAgMHg4MAorCisjZGVmaW5lIFBDSV9DTEFTU19ORVRXT1JLICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCAgICAweDAwCisjZGVmaW5lICAgUENJX0NMQVNTX05FVFdPUktfVE9LRU5SSU5HICAgMHgwMQorI2RlZmluZSAgIFBDSV9DTEFTU19ORVRXT1JLX0ZEREkgICAgICAgIDB4MDIKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfTkVUV09SS19BVE0gICAgICAgICAweDAzCisjZGVmaW5lICAgUENJX0NMQVNTX05FVFdPUktfSVNETiAgICAgICAgMHgwNAorI2RlZmluZSAgIFBDSV9DTEFTU19ORVRXT1JLX09USEVSICAgICAgIDB4ODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWSAgICAgICAgICAgICAweDAzCisjZGVmaW5lICAgUENJX0NMQVNTX0RJU1BMQVlfVkdBICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgUENJX0lGX1ZHQV9WR0EgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgUENJX0lGX1ZHQV84NTE0ICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgIFBDSV9DTEFTU19ESVNQTEFZX1hHQSAgICAgICAgIDB4MDEKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfRElTUExBWV8zRCAgICAgICAgICAweDAyCisjZGVmaW5lICAgUENJX0NMQVNTX0RJU1BMQVlfT1RIRVIgICAgICAgMHg4MAorI2RlZmluZSAgIFBDSV9DTEFTU19ESVNQTEFZX0dGWCAgICAgICAgIDB4ODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfTUVESUEgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lICAgUENJX0NMQVNTX01FRElBX1ZJREVPICAgICAgICAgMHgwMAorI2RlZmluZSAgIFBDSV9DTEFTU19NRURJQV9BVURJTyAgICAgICAgIDB4MDEKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfTUVESUFfVEVMRVBIT05FICAgICAweDAyCisjZGVmaW5lICAgUENJX0NMQVNTX01FRElBX09USEVSICAgICAgICAgMHg4MAorCisjZGVmaW5lIFBDSV9DTEFTU19NRU1PUllfQ09OVFJPTExFUiAgIDB4MDUKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfTUVNT1JZX1JBTSAgICAgICAgICAweDAwCisjZGVmaW5lICAgUENJX0NMQVNTX01FTU9SWV9GTEFTSCAgICAgICAgMHgwMQorI2RlZmluZSAgIFBDSV9DTEFTU19NRU1PUllfT1RIRVIgICAgICAgIDB4ODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFICAgICAgICAgICAgICAweDA2CisjZGVmaW5lICAgUENJX0NMQVNTX0JSSURHRV9IT1NUICAgICAgICAgMHgwMAorI2RlZmluZSAgIFBDSV9DTEFTU19CUklER0VfSVNBICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfQlJJREdFX0VJU0EgICAgICAgICAweDAyCisjZGVmaW5lICAgUENJX0NMQVNTX0JSSURHRV9NQ0EgICAgICAgICAgMHgwMworI2RlZmluZSAgIFBDSV9DTEFTU19CUklER0VfUDJQICAgICAgICAgIDB4MDQKKyNkZWZpbmUgICAgIFBDSV9JRl9CUklER0VfUDJQICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgIFBDSV9JRl9CUklER0VfUDJQX1NVQlRSQUNUSVZFIDB4MDEKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfQlJJREdFX1BDTUNJQSAgICAgICAweDA1CisjZGVmaW5lICAgUENJX0NMQVNTX0JSSURHRV9OVUJVUyAgICAgICAgMHgwNgorI2RlZmluZSAgIFBDSV9DTEFTU19CUklER0VfQ0FSREJVUyAgICAgIDB4MDcKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfQlJJREdFX1JBQ0VXQVkgICAgICAweDA4CisjZGVmaW5lICAgUENJX0NMQVNTX0JSSURHRV9PVEhFUiAgICAgICAgMHg4MAorI2RlZmluZSAgIFBDSV9DTEFTU19CUklER0VfSVNBX1BERUNPREUgIDB4ODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfU0NDICAgICAgICAgICAgICAgICAweDA3ICAvLy88IFNpbXBsZSBjb21tdW5pY2F0aW9ucyBjb250cm9sbGVycworI2RlZmluZSAgIFBDSV9TVUJDTEFTU19TRVJJQUwgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgIFBDSV9JRl9HRU5FUklDX1hUICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjQ1MCAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjU1MCAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjY1MCAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjc1MCAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjg1MCAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjk1MCAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfUEFSQUxMRUwgICAgICAgICAweDAxCisjZGVmaW5lICAgICBQQ0lfSUZfUEFSQUxMRUxfUE9SVCAgICAgICAgICAweDAwCisjZGVmaW5lICAgICBQQ0lfSUZfQklfRElSX1BBUkFMTEVMX1BPUlQgICAweDAxCisjZGVmaW5lICAgICBQQ0lfSUZfRUNQX1BBUkFMTEVMX1BPUlQgICAgICAweDAyCisjZGVmaW5lICAgICBQQ0lfSUZfMTI4NF9DT05UUk9MTEVSICAgICAgICAweDAzCisjZGVmaW5lICAgICBQQ0lfSUZfMTI4NF9ERVZJQ0UgICAgICAgICAgICAweEZFCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX01VTFRJUE9SVF9TRVJJQUwgMHgwMgorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19NT0RFTSAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgICAgIFBDSV9JRl9HRU5FUklDX01PREVNICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjQ1MF9NT0RFTSAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjU1MF9NT0RFTSAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjY1MF9NT0RFTSAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgICAgIFBDSV9JRl8xNjc1MF9NT0RFTSAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfU0NDX09USEVSICAgICAgICAgIDB4ODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1BFUklQSEVSQUwgICAweDA4CisjZGVmaW5lICAgUENJX1NVQkNMQVNTX1BJQyAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgUENJX0lGXzgyNTlfUElDICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgUENJX0lGX0lTQV9QSUMgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgICAgUENJX0lGX0VJU0FfUElDICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgICAgUENJX0lGX0FQSUNfQ09OVFJPTExFUiAgICAgICAgMHgxMCAgLy8vPCBJL08gQVBJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAsIDMyIGJ5ZSBub25lLXByZWZlY3RhYmxlIG1lbW9yeS4KKyNkZWZpbmUgICAgIFBDSV9JRl9BUElDX0NPTlRST0xMRVIyICAgICAgIDB4MjAKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfRE1BICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICAgICBQQ0lfSUZfODIzN19ETUEgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lICAgICBQQ0lfSUZfSVNBX0RNQSAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICAgICBQQ0lfSUZfRUlTQV9ETUEgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX1RJTUVSICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgICAgUENJX0lGXzgyNTRfVElNRVIgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgUENJX0lGX0lTQV9USU1FUiAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgICAgUENJX0lGX0VJU0FfVElNRVIgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19SVEMgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgICAgIFBDSV9JRl9HRU5FUklDX1JUQyAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgIFBDSV9JRl9JU0FfUlRDICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfUE5QX0NPTlRST0xMRVIgICAweDA0ICAgIC8vLzwgSG90UGx1ZyBDb250cm9sbGVyCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX1BFUklQSEVSQUxfT1RIRVIgMHg4MAorCisjZGVmaW5lIFBDSV9DTEFTU19JTlBVVF9ERVZJQ0UgICAgICAgIDB4MDkKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfS0VZQk9BUkQgICAgICAgICAweDAwCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX1BFTiAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19NT1VTRV9DT05UUk9MTEVSIDB4MDIKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfU0NBTl9DT05UUk9MTEVSICAweDAzCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX0dBTUVQT1JUICAgICAgICAgMHgwNAorI2RlZmluZSAgICAgUENJX0lGX0dBTUVQT1JUICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgUENJX0lGX0dBTUVQT1JUMSAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19JTlBVVF9PVEhFUiAgICAgIDB4ODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfRE9DS0lOR19TVEFUSU9OICAgICAweDBBCisKKyNkZWZpbmUgUENJX0NMQVNTX1BST0NFU1NPUiAgICAgICAgICAgMHgwQgorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19QUk9DXzM4NiAgICAgICAgIDB4MDAKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfUFJPQ180ODYgICAgICAgICAweDAxCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX1BST0NfUEVOVElVTSAgICAgMHgwMgorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19QUk9DX0FMUEhBICAgICAgIDB4MTAKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfUFJPQ19QT1dFUlBDICAgICAweDIwCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX1BST0NfTUlQUyAgICAgICAgMHgzMAorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19QUk9DX0NPX1BPUkMgICAgIDB4NDAgLy8vPCBDby1Qcm9jZXNzb3IKKworI2RlZmluZSBQQ0lfQ0xBU1NfU0VSSUFMICAgICAgICAgICAgICAweDBDCisjZGVmaW5lICAgUENJX0NMQVNTX1NFUklBTF9GSVJFV0lSRSAgICAgMHgwMAorI2RlZmluZSAgICAgUENJX0lGXzEzOTQgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgUENJX0lGXzEzOTRfT1BFTl9IQ0kgICAgICAgICAgMHgxMAorI2RlZmluZSAgIFBDSV9DTEFTU19TRVJJQUxfQUNDRVNTX0JVUyAgIDB4MDEKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfU0VSSUFMX1NTQSAgICAgICAgICAweDAyCisjZGVmaW5lICAgUENJX0NMQVNTX1NFUklBTF9VU0IgICAgICAgICAgMHgwMworI2RlZmluZSAgICAgUENJX0lGX1VIQ0kgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgUENJX0lGX09IQ0kgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSAgICAgUENJX0lGX1VTQl9PVEhFUiAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSAgICAgUENJX0lGX1VTQl9ERVZJQ0UgICAgICAgICAgICAgMHhGRQorI2RlZmluZSAgIFBDSV9DTEFTU19TRVJJQUxfRklCUkVDSEFOTkVMIDB4MDQKKyNkZWZpbmUgICBQQ0lfQ0xBU1NfU0VSSUFMX1NNQiAgICAgICAgICAweDA1CisKKyNkZWZpbmUgUENJX0NMQVNTX1dJUkVMRVNTICAgICAgICAgICAgMHgwRAorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19JUkRBICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfSVIgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX1JGICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19XSVJFTEVTU19PVEhFUiAgIDB4ODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfSU5URUxMSUdFTlRfSU8gICAgICAweDBFCisKKyNkZWZpbmUgUENJX0NMQVNTX1NBVEVMTElURSAgICAgICAgICAgMHgwRgorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19UViAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfQVVESU8gICAgICAgICAgICAweDAyCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX1ZPSUNFICAgICAgICAgICAgMHgwMworI2RlZmluZSAgIFBDSV9TVUJDTEFTU19EQVRBICAgICAgICAgICAgIDB4MDQKKworI2RlZmluZSBQQ0lfU0VDVVJJVFlfQ09OVFJPTExFUiAgICAgICAweDEwICAgLy8vPCBFbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIGNvbnRyb2xsZXIKKyNkZWZpbmUgICBQQ0lfU1VCQ0xBU1NfTkVUX0NPTVBVVCAgICAgICAweDAwCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX0VOVEVSVEFJTk1FTlQgICAgMHgxMAorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19TRUNVUklUWV9PVEhFUiAgIDB4ODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfRFBJTyAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lICAgUENJX1NVQkNMQVNTX0RQSU8gICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgIFBDSV9TVUJDTEFTU19EUElPX09USEVSICAgICAgIDB4ODAKKworI2RlZmluZSBJU19DTEFTUzEoX3AsIGMpICAgICAgICAgICAgICAoKF9wKS0+SGRyLkNsYXNzQ29kZVsyXSA9PSAoYykpCisjZGVmaW5lIElTX0NMQVNTMihfcCwgYywgcykgICAgICAgICAgIChJU19DTEFTUzEgKF9wLCBjKSAmJiAoKF9wKS0+SGRyLkNsYXNzQ29kZVsxXSA9PSAocykpKQorI2RlZmluZSBJU19DTEFTUzMoX3AsIGMsIHMsIHApICAgICAgICAoSVNfQ0xBU1MyIChfcCwgYywgcykgJiYgKChfcCktPkhkci5DbGFzc0NvZGVbMF0gPT0gKHApKSkKKworI2RlZmluZSBJU19QQ0lfRElTUExBWShfcCkgICAgICAgICAgICBJU19DTEFTUzEgKF9wLCBQQ0lfQ0xBU1NfRElTUExBWSkKKyNkZWZpbmUgSVNfUENJX1ZHQShfcCkgICAgICAgICAgICAgICAgSVNfQ0xBU1MzIChfcCwgUENJX0NMQVNTX0RJU1BMQVksIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSwgMCkKKyNkZWZpbmUgSVNfUENJXzg1MTQoX3ApICAgICAgICAgICAgICAgSVNfQ0xBU1MzIChfcCwgUENJX0NMQVNTX0RJU1BMQVksIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSwgMSkKKyNkZWZpbmUgSVNfUENJX0dGWChfcCkgICAgICAgICAgICAgICAgSVNfQ0xBU1MzIChfcCwgUENJX0NMQVNTX0RJU1BMQVksIFBDSV9DTEFTU19ESVNQTEFZX0dGWCwgMCkKKyNkZWZpbmUgSVNfUENJX09MRChfcCkgICAgICAgICAgICAgICAgSVNfQ0xBU1MxIChfcCwgUENJX0NMQVNTX09MRCkKKyNkZWZpbmUgSVNfUENJX09MRF9WR0EoX3ApICAgICAgICAgICAgSVNfQ0xBU1MyIChfcCwgUENJX0NMQVNTX09MRCwgUENJX0NMQVNTX09MRF9WR0EpCisjZGVmaW5lIElTX1BDSV9JREUoX3ApICAgICAgICAgICAgICAgIElTX0NMQVNTMiAoX3AsIFBDSV9DTEFTU19NQVNTX1NUT1JBR0UsIFBDSV9DTEFTU19NQVNTX1NUT1JBR0VfSURFKQorI2RlZmluZSBJU19QQ0lfU0NTSShfcCkgICAgICAgICAgICAgICBJU19DTEFTUzMgKF9wLCBQQ0lfQ0xBU1NfTUFTU19TVE9SQUdFLCBQQ0lfQ0xBU1NfTUFTU19TVE9SQUdFX1NDU0ksIDApCisjZGVmaW5lIElTX1BDSV9SQUlEKF9wKSAgICAgICAgICAgICAgIElTX0NMQVNTMyAoX3AsIFBDSV9DTEFTU19NQVNTX1NUT1JBR0UsIFBDSV9DTEFTU19NQVNTX1NUT1JBR0VfUkFJRCwgMCkKKyNkZWZpbmUgSVNfUENJX0xQQyhfcCkgICAgICAgICAgICAgICAgSVNfQ0xBU1MzIChfcCwgUENJX0NMQVNTX0JSSURHRSwgUENJX0NMQVNTX0JSSURHRV9JU0EsIDApCisjZGVmaW5lIElTX1BDSV9QMlAoX3ApICAgICAgICAgICAgICAgIElTX0NMQVNTMyAoX3AsIFBDSV9DTEFTU19CUklER0UsIFBDSV9DTEFTU19CUklER0VfUDJQLCAwKQorI2RlZmluZSBJU19QQ0lfUDJQX1NVQihfcCkgICAgICAgICAgICBJU19DTEFTUzMgKF9wLCBQQ0lfQ0xBU1NfQlJJREdFLCBQQ0lfQ0xBU1NfQlJJREdFX1AyUCwgMSkKKyNkZWZpbmUgSVNfUENJXzE2NTUwX1NFUklBTChfcCkgICAgICAgSVNfQ0xBU1MzIChfcCwgUENJX0NMQVNTX1NDQywgUENJX1NVQkNMQVNTX1NFUklBTCwgUENJX0lGXzE2NTUwKQorI2RlZmluZSBJU19QQ0lfVVNCKF9wKSAgICAgICAgICAgICAgICBJU19DTEFTUzIgKF9wLCBQQ0lfQ0xBU1NfU0VSSUFMLCBQQ0lfQ0xBU1NfU0VSSUFMX1VTQikKKworLy8KKy8vIHRoZSBkZWZpbml0aW9uIG9mIEhlYWRlciBUeXBlCisvLworI2RlZmluZSBIRUFERVJfVFlQRV9ERVZJQ0UgICAgICAgICAgICAweDAwCisjZGVmaW5lIEhFQURFUl9UWVBFX1BDSV9UT19QQ0lfQlJJREdFIDB4MDEKKyNkZWZpbmUgSEVBREVSX1RZUEVfQ0FSREJVU19CUklER0UgICAgMHgwMgorI2RlZmluZSBIRUFERVJfVFlQRV9NVUxUSV9GVU5DVElPTiAgICAweDgwCisvLworLy8gTWFzayBvZiBIZWFkZXIgdHlwZQorLy8KKyNkZWZpbmUgSEVBREVSX0xBWU9VVF9DT0RFICAgICAgICAgICAgMHg3ZgorCisjZGVmaW5lIElTX1BDSV9CUklER0UoX3ApICAgICAgICAgICAgICgoKF9wKS0+SGRyLkhlYWRlclR5cGUgJiBIRUFERVJfTEFZT1VUX0NPREUpID09IChIRUFERVJfVFlQRV9QQ0lfVE9fUENJX0JSSURHRSkpCisjZGVmaW5lIElTX0NBUkRCVVNfQlJJREdFKF9wKSAgICAgICAgICgoKF9wKS0+SGRyLkhlYWRlclR5cGUgJiBIRUFERVJfTEFZT1VUX0NPREUpID09IChIRUFERVJfVFlQRV9DQVJEQlVTX0JSSURHRSkpCisjZGVmaW5lIElTX1BDSV9NVUxUSV9GVU5DKF9wKSAgICAgICAgICgoX3ApLT5IZHIuSGVhZGVyVHlwZSAmIEhFQURFUl9UWVBFX01VTFRJX0ZVTkNUSU9OKQorCisvLy8KKy8vLyBSb20gQmFzZSBBZGRyZXNzIGluIEJyaWRnZSwgZGVmaW5lZCBpbiBQQ0ktdG8tUENJIEJyaWRnZSBBcmNoaXRlY3VyZSBTcGVjaWZpY2F0aW9uLAorLy8vCisjZGVmaW5lIFBDSV9CUklER0VfUk9NQkFSICAgICAgICAgICAgIDB4MzgKKworI2RlZmluZSBQQ0lfTUFYX0JBUiAgICAgICAgICAgICAgICAgICAweDAwMDYKKyNkZWZpbmUgUENJX01BWF9DT05GSUdfT0ZGU0VUICAgICAgICAgMHgwMTAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBQQ0lfQ09NTUFORF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUENJX1BSSU1BUllfU1RBVFVTX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIFBDSV9SRVZJU0lPTl9JRF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBQQ0lfQ0xBU1NDT0RFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgUENJX0NBQ0hFTElORV9TSVpFX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIFBDSV9MQVRFTkNZX1RJTUVSX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwRAorI2RlZmluZSBQQ0lfSEVBREVSX1RZUEVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MEUKKyNkZWZpbmUgUENJX0JJU1RfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NSRUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBQQ0lfQ0FSREJVU19DSVNfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MjgKKyNkZWZpbmUgUENJX1NWSURfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJDIC8vLzwgU3ViU3lzdGVtIFZlbmRvciBpZAorI2RlZmluZSBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRF9PRkZTRVQgICAgICAgICAgICAgIDB4MkMKKyNkZWZpbmUgUENJX1NJRF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJFIC8vLzwgU3ViU3lzdGVtIElECisjZGVmaW5lIFBDSV9TVUJTWVNURU1fSURfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgyRQorI2RlZmluZSBQQ0lfRVhQQU5TSU9OX1JPTV9CQVNFICAgICAgICAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgUENJX0NBUEJJTElUWV9QT0lOVEVSX09GRlNFVCAgICAgICAgICAgICAgICAweDM0CisjZGVmaW5lIFBDSV9JTlRfTElORV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQyAvLy88IEludGVycnVwdCBMaW5lIFJlZ2lzdGVyCisjZGVmaW5lIFBDSV9JTlRfUElOX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRCAvLy88IEludGVycnVwdCBQaW4gUmVnaXN0ZXIKKyNkZWZpbmUgUENJX01BWEdOVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNFIC8vLzwgTWF4IEdyYW50IFJlZ2lzdGVyCisjZGVmaW5lIFBDSV9NQVhMQVRfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRiAvLy88IE1heCBMYXRlbmN5IFJlZ2lzdGVyCisKKy8vLworLy8vIGRlZmluZWQgaW4gUENJLXRvLVBDSSBCcmlkZ2UgQXJjaGl0ZWN0dXJlIFNwZWNpZmljYXRpb24KKy8vLworI2RlZmluZSBQQ0lfQlJJREdFX1BSSU1BUllfQlVTX1JFR0lTVEVSX09GRlNFVCAgICAgIDB4MTgKKyNkZWZpbmUgUENJX0JSSURHRV9TRUNPTkRBUllfQlVTX1JFR0lTVEVSX09GRlNFVCAgICAweDE5CisjZGVmaW5lIFBDSV9CUklER0VfU1VCT1JESU5BVEVfQlVTX1JFR0lTVEVSX09GRlNFVCAgMHgxYQorI2RlZmluZSBQQ0lfQlJJREdFX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQgICAgICAgICAgIDB4MUUKKyNkZWZpbmUgUENJX0JSSURHRV9DT05UUk9MX1JFR0lTVEVSX09GRlNFVCAgICAgICAgICAweDNFCisKKy8vLworLy8vIEludGVycnVwdCBMaW5lICJVbmtub3duIiBvciAiTm8gY29ubmVjdGlvbiIgdmFsdWUgZGVmaW5lZCBmb3IgeDg2IGJhc2VkIHN5c3RlbQorLy8vCisjZGVmaW5lIFBDSV9JTlRfTElORV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgMHhGRgorCit0eXBlZGVmIHVuaW9uIHsKKyAgc3RydWN0IHsKKyAgICBVSU5UMzIgIFJlZyA6IDg7CisgICAgVUlOVDMyICBGdW5jIDogMzsKKyAgICBVSU5UMzIgIERldiA6IDU7CisgICAgVUlOVDMyICBCdXMgOiA4OworICAgIFVJTlQzMiAgUmVzZXJ2ZWQgOiA3OworICAgIFVJTlQzMiAgRW5hYmxlIDogMTsKKyAgfSBCaXRzOworICBVSU5UMzIgIFVpbnQzMjsKK30gUENJX0NPTkZJR19BQ0NFU1NfQ0Y4OworCisjcHJhZ21hIHBhY2soKQorCisjZGVmaW5lIEVGSV9QQ0lfQ09NTUFORF9JT19TUEFDRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVDAgICAvLy88IDB4MDAwMQorI2RlZmluZSBFRklfUENJX0NPTU1BTkRfTUVNT1JZX1NQQUNFICAgICAgICAgICAgICAgICAgICBCSVQxICAgLy8vPCAweDAwMDIKKyNkZWZpbmUgRUZJX1BDSV9DT01NQU5EX0JVU19NQVNURVIgICAgICAgICAgICAgICAgICAgICAgQklUMiAgIC8vLzwgMHgwMDA0CisjZGVmaW5lIEVGSV9QQ0lfQ09NTUFORF9TUEVDSUFMX0NZQ0xFICAgICAgICAgICAgICAgICAgIEJJVDMgICAvLy88IDB4MDAwOAorI2RlZmluZSBFRklfUENJX0NPTU1BTkRfTUVNT1JZX1dSSVRFX0FORF9JTlZBTElEQVRFICAgICBCSVQ0ICAgLy8vPCAweDAwMTAKKyNkZWZpbmUgRUZJX1BDSV9DT01NQU5EX1ZHQV9QQUxFVFRFX1NOT09QICAgICAgICAgICAgICAgQklUNSAgIC8vLzwgMHgwMDIwCisjZGVmaW5lIEVGSV9QQ0lfQ09NTUFORF9QQVJJVFlfRVJST1JfUkVTUE9ORCAgICAgICAgICAgIEJJVDYgICAvLy88IDB4MDA0MAorI2RlZmluZSBFRklfUENJX0NPTU1BTkRfU1RFUFBJTkdfQ09OVFJPTCAgICAgICAgICAgICAgICBCSVQ3ICAgLy8vPCAweDAwODAKKyNkZWZpbmUgRUZJX1BDSV9DT01NQU5EX1NFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUOCAgIC8vLzwgMHgwMTAwCisjZGVmaW5lIEVGSV9QQ0lfQ09NTUFORF9GQVNUX0JBQ0tfVE9fQkFDSyAgICAgICAgICAgICAgIEJJVDkgICAvLy88IDB4MDIwMAorCisvLy8KKy8vLyBkZWZpbmVkIGluIFBDSS10by1QQ0kgQnJpZGdlIEFyY2hpdGVjdHVyZSBTcGVjaWZpY2F0aW9uCisvLy8KKyNkZWZpbmUgRUZJX1BDSV9CUklER0VfQ09OVFJPTF9QQVJJVFlfRVJST1JfUkVTUE9OU0UgICAgQklUMCAgIC8vLzwgMHgwMDAxCisjZGVmaW5lIEVGSV9QQ0lfQlJJREdFX0NPTlRST0xfU0VSUiAgICAgICAgICAgICAgICAgICAgIEJJVDEgICAvLy88IDB4MDAwMgorI2RlZmluZSBFRklfUENJX0JSSURHRV9DT05UUk9MX0lTQSAgICAgICAgICAgICAgICAgICAgICBCSVQyICAgLy8vPCAweDAwMDQKKyNkZWZpbmUgRUZJX1BDSV9CUklER0VfQ09OVFJPTF9WR0EgICAgICAgICAgICAgICAgICAgICAgQklUMyAgIC8vLzwgMHgwMDA4CisjZGVmaW5lIEVGSV9QQ0lfQlJJREdFX0NPTlRST0xfVkdBXzE2ICAgICAgICAgICAgICAgICAgIEJJVDQgICAvLy88IDB4MDAxMAorI2RlZmluZSBFRklfUENJX0JSSURHRV9DT05UUk9MX01BU1RFUl9BQk9SVCAgICAgICAgICAgICBCSVQ1ICAgLy8vPCAweDAwMjAKKyNkZWZpbmUgRUZJX1BDSV9CUklER0VfQ09OVFJPTF9SRVNFVF9TRUNPTkRBUllfQlVTICAgICAgQklUNiAgIC8vLzwgMHgwMDQwCisjZGVmaW5lIEVGSV9QQ0lfQlJJREdFX0NPTlRST0xfRkFTVF9CQUNLX1RPX0JBQ0sgICAgICAgIEJJVDcgICAvLy88IDB4MDA4MAorI2RlZmluZSBFRklfUENJX0JSSURHRV9DT05UUk9MX1BSSU1BUllfRElTQ0FSRF9USU1FUiAgICBCSVQ4ICAgLy8vPCAweDAxMDAKKyNkZWZpbmUgRUZJX1BDSV9CUklER0VfQ09OVFJPTF9TRUNPTkRBUllfRElTQ0FSRF9USU1FUiAgQklUOSAgIC8vLzwgMHgwMjAwCisjZGVmaW5lIEVGSV9QQ0lfQlJJREdFX0NPTlRST0xfVElNRVJfU1RBVFVTICAgICAgICAgICAgIEJJVDEwICAvLy88IDB4MDQwMAorI2RlZmluZSBFRklfUENJX0JSSURHRV9DT05UUk9MX0RJU0NBUkRfVElNRVJfU0VSUiAgICAgICBCSVQxMSAgLy8vPCAweDA4MDAKKworLy8vCisvLy8gRm9sbG93aW5nIGFyZSB0aGUgUENJLUNBUkRCVVMgYnJpZGdlIGNvbnRyb2wgYml0LCBkZWZpbmVkIGluIFBDIENhcmQgU3RhbmRhcmQKKy8vLworI2RlZmluZSBFRklfUENJX0JSSURHRV9DT05UUk9MX0lSRVFJTlRfRU5BQkxFICAgICAgICAgICBCSVQ3ICAgLy8vPCAweDAwODAKKyNkZWZpbmUgRUZJX1BDSV9CUklER0VfQ09OVFJPTF9SQU5HRTBfTUVNT1JZX1RZUEUgICAgICAgQklUOCAgIC8vLzwgMHgwMTAwCisjZGVmaW5lIEVGSV9QQ0lfQlJJREdFX0NPTlRST0xfUkFOR0UxX01FTU9SWV9UWVBFICAgICAgIEJJVDkgICAvLy88IDB4MDIwMAorI2RlZmluZSBFRklfUENJX0JSSURHRV9DT05UUk9MX1dSSVRFX1BPU1RJTkdfRU5BQkxFICAgICBCSVQxMCAgLy8vPCAweDA0MDAKKworLy8KKy8vIEZvbGxvd2luZyBhcmUgdGhlIFBDSSBzdGF0dXMgY29udHJvbCBiaXQKKy8vCisjZGVmaW5lIEVGSV9QQ0lfU1RBVFVTX0NBUEFCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgIEJJVDQgICAvLy88IDB4MDAxMAorI2RlZmluZSBFRklfUENJX1NUQVRVU182Nk1aX0NBUEFCTEUgICAgICAgICAgICAgICAgICAgICBCSVQ1ICAgLy8vPCAweDAwMjAKKyNkZWZpbmUgRUZJX1BDSV9GQVNUX0JBQ0tfVE9fQkFDS19DQVBBQkxFICAgICAgICAgICAgICAgQklUNyAgIC8vLzwgMHgwMDgwCisjZGVmaW5lIEVGSV9QQ0lfTUFTVEVSX0RBVEFfUEFSSVRZX0VSUk9SICAgICAgICAgICAgICAgIEJJVDggICAvLy88IDB4MDEwMAorCisvLy8KKy8vLyBkZWZpbmVkIGluIFBDIENhcmQgU3RhbmRhcmQKKy8vLworI2RlZmluZSBFRklfUENJX0NBUkRCVVNfQlJJREdFX0NBUEFCSUxJVFlfUFRSIDB4MTQKKworI3ByYWdtYSBwYWNrKDEpCisvLworLy8gUENJIENhcGFiaWxpdHkgTGlzdCBJRHMgYW5kIHJlY29yZHMKKy8vCisjZGVmaW5lIEVGSV9QQ0lfQ0FQQUJJTElUWV9JRF9QTUkgICAgIDB4MDEKKyNkZWZpbmUgRUZJX1BDSV9DQVBBQklMSVRZX0lEX0FHUCAgICAgMHgwMgorI2RlZmluZSBFRklfUENJX0NBUEFCSUxJVFlfSURfVlBEICAgICAweDAzCisjZGVmaW5lIEVGSV9QQ0lfQ0FQQUJJTElUWV9JRF9TTE9USUQgIDB4MDQKKyNkZWZpbmUgRUZJX1BDSV9DQVBBQklMSVRZX0lEX01TSSAgICAgMHgwNQorI2RlZmluZSBFRklfUENJX0NBUEFCSUxJVFlfSURfSE9UUExVRyAweDA2Cit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQ4IENhcGFiaWxpdHlJRDsKKyAgVUlOVDggTmV4dEl0ZW1QdHI7Cit9IEVGSV9QQ0lfQ0FQQUJJTElUWV9IRFI7CisKKy8vLworLy8vIENhcGFiaWxpdHkgRUZJX1BDSV9DQVBBQklMSVRZX0lEX1BNSSwgZGVmaW5lZCBpbiBQQ0kgUG93ZXIgTWFuYWdlbWVudCBJbnRlcmZhY2UgU3BlY2lmaWN0aW9uCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX1BDSV9DQVBBQklMSVRZX0hEUiAgSGRyOworICBVSU5UMTYgICAgICAgICAgICAgICAgICBQTUM7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgIFBNQ1NSOworICBVSU5UOCAgICAgICAgICAgICAgICAgICBCcmlkZ2VFeHRlbnRpb247CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIERhdGE7Cit9IEVGSV9QQ0lfQ0FQQUJJTElUWV9QTUk7CisKKy8vLworLy8vIENhcGFiaWxpdHkgRUZJX1BDSV9DQVBBQklMSVRZX0lEX0FHUCwgZGVmaW5lZCBpbiBBY2NlbGVyYXRlZCBHcmFwaGljcyBQb3J0IEludGVyZmFjZSBTcGVjaWZpY2F0aW9uCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX1BDSV9DQVBBQklMSVRZX0hEUiAgSGRyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICBSZXY7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOworICBVSU5UMzIgICAgICAgICAgICAgICAgICBTdGF0dXM7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgIENvbW1hbmQ7Cit9IEVGSV9QQ0lfQ0FQQUJJTElUWV9BR1A7CisKKy8vLworLy8vIENhcGFiaWxpdHkgRUZJX1BDSV9DQVBBQklMSVRZX0lEX1ZQRCwgaW4gUENJMi4yIFNwZWMuCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX1BDSV9DQVBBQklMSVRZX0hEUiAgSGRyOworICBVSU5UMTYgICAgICAgICAgICAgICAgICBBZGRyUmVnOworICBVSU5UMzIgICAgICAgICAgICAgICAgICBEYXRhUmVnOworfSBFRklfUENJX0NBUEFCSUxJVFlfVlBEOworCisvLy8KKy8vLyBDYXBhYmlsaXR5IEVGSV9QQ0lfQ0FQQUJJTElUWV9JRF9TTE9USUQsIGRlZmluZWQgaW4gUENJLXRvLVBDSSBCcmlkZ2UgQXJjaGl0ZXR1cmUgU3BlY2lmaWNhdGlvbgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9QQ0lfQ0FQQUJJTElUWV9IRFIgIEhkcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgRXhwbnNTbG90UmVnOworICBVSU5UOCAgICAgICAgICAgICAgICAgICBDaGFzc2lzTm87Cit9IEVGSV9QQ0lfQ0FQQUJJTElUWV9TTE9USUQ7CisKKy8vLworLy8vIENhcGFiaWxpdHkgRUZJX1BDSV9DQVBBQklMSVRZX0lEX01TSSwgZGVmaW5lZCBpbiBQQ0kyLjIKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfUENJX0NBUEFCSUxJVFlfSERSICBIZHI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgIE1zZ0N0cmxSZWc7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgIE1zZ0FkZHJSZWc7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgIE1zZ0RhdGFSZWc7Cit9IEVGSV9QQ0lfQ0FQQUJJTElUWV9NU0kzMjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfUENJX0NBUEFCSUxJVFlfSERSICBIZHI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgIE1zZ0N0cmxSZWc7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgIE1zZ0FkZHJSZWdMc2R3OworICBVSU5UMzIgICAgICAgICAgICAgICAgICBNc2dBZGRyUmVnTXNkdzsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgTXNnRGF0YVJlZzsKK30gRUZJX1BDSV9DQVBBQklMSVRZX01TSTY0OworCisvLy8KKy8vLyBDYXBhYmlsaXR5IEVGSV9QQ0lfQ0FQQUJJTElUWV9JRF9IT1RQTFVHLCBkZWZpbmVkIGluIENvbXBhY3RQQ0kgSG90IFN3YXAgU3BlY2lmaWNhdGlvbiBQSUNNRyAyLjEsIFIxLjAKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfUENJX0NBUEFCSUxJVFlfSERSICBIZHI7CisgIC8vLworICAvLy8gbm90IGZpbmlzaGVkIC0gZmllbGRzIG5lZWQgdG8gZ28gaGVyZQorICAvLy8KK30gRUZJX1BDSV9DQVBBQklMSVRZX0hPVFBMVUc7CisKKyNkZWZpbmUgREVWSUNFX0lEX05PQ0FSRSAgICAweEZGRkYKKworI2RlZmluZSBQQ0lfQUNQSV9VTlVTRUQgICAgIDAKKyNkZWZpbmUgUENJX0JBUl9OT0NIQU5HRSAgICAwCisjZGVmaW5lIFBDSV9CQVJfT0xEX0FMSUdOICAgMHhGRkZGRkZGRkZGRkZGRkZGVUxMCisjZGVmaW5lIFBDSV9CQVJfRVZFTl9BTElHTiAgMHhGRkZGRkZGRkZGRkZGRkZFVUxMCisjZGVmaW5lIFBDSV9CQVJfU1FVQURfQUxJR04gMHhGRkZGRkZGRkZGRkZGRkZEVUxMCisjZGVmaW5lIFBDSV9CQVJfRFFVQURfQUxJR04gMHhGRkZGRkZGRkZGRkZGRkZDVUxMCisKKyNkZWZpbmUgUENJX0JBUl9JRFgwICAgICAgICAweDAwCisjZGVmaW5lIFBDSV9CQVJfSURYMSAgICAgICAgMHgwMQorI2RlZmluZSBQQ0lfQkFSX0lEWDIgICAgICAgIDB4MDIKKyNkZWZpbmUgUENJX0JBUl9JRFgzICAgICAgICAweDAzCisjZGVmaW5lIFBDSV9CQVJfSURYNCAgICAgICAgMHgwNAorI2RlZmluZSBQQ0lfQkFSX0lEWDUgICAgICAgIDB4MDUKKyNkZWZpbmUgUENJX0JBUl9BTEwgICAgICAgICAweEZGCisKKy8vLworLy8vIEVGSSBQQ0kgT3B0aW9uIFJPTSBkZWZpbml0aW9ucworLy8vCisjZGVmaW5lIEVGSV9ST09UX0JSSURHRV9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcHJiJworI2RlZmluZSBFRklfUENJX0VYUEFOU0lPTl9ST01fSEVBREVSX0VGSVNJR05BVFVSRSAgICAgICAweDBFRjEgIC8vLzwgZGVmaW5lZCBpbiBVRUZJIFNwZWMuCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDggUmVnaXN0ZXI7CisgIFVJTlQ4IEZ1bmN0aW9uOworICBVSU5UOCBEZXZpY2U7CisgIFVJTlQ4IEJ1czsKKyAgVUlOVDggUmVzZXJ2ZWRbNF07Cit9IERFRklPX1BDSV9BRERSOworCisjZGVmaW5lIFBDSV9FWFBBTlNJT05fUk9NX0hFQURFUl9TSUdOQVRVUkUgICAgICAgICAgICAgIDB4YWE1NQorI2RlZmluZSBQQ0lfREFUQV9TVFJVQ1RVUkVfU0lHTkFUVVJFICAgICAgICAgICAgICAgICAgICBTSUdOQVRVUkVfMzIgKCdQJywgJ0MnLCAnSScsICdSJykKKyNkZWZpbmUgUENJX0NPREVfVFlQRV9QQ0FUX0lNQUdFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBFRklfUENJX0VYUEFOU0lPTl9ST01fSEVBREVSX0NPTVBSRVNTRUQgICAgICAgICAweDAwMDEgIC8vLzxkZWZpbmVkIGluIFVFRkkgc3BlYy4KKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMTYgIFNpZ25hdHVyZTsgICAgLy8vPCAweGFhNTUKKyAgVUlOVDggICBSZXNlcnZlZFsweDE2XTsKKyAgVUlOVDE2ICBQY2lyT2Zmc2V0OworfSBQQ0lfRVhQQU5TSU9OX1JPTV9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDE2ICBTaWduYXR1cmU7ICAgIC8vLzwgMHhhYTU1CisgIFVJTlQ4ICAgU2l6ZTUxMjsKKyAgVUlOVDggICBJbml0RW50cnlQb2ludFszXTsKKyAgVUlOVDggICBSZXNlcnZlZFsweDEyXTsKKyAgVUlOVDE2ICBQY2lyT2Zmc2V0OworfSBFRklfTEVHQUNZX0VYUEFOU0lPTl9ST01fSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgU2lnbmF0dXJlOyAgICAvLy88ICJQQ0lSIgorICBVSU5UMTYgIFZlbmRvcklkOworICBVSU5UMTYgIERldmljZUlkOworICBVSU5UMTYgIFJlc2VydmVkMDsKKyAgVUlOVDE2ICBMZW5ndGg7CisgIFVJTlQ4ICAgUmV2aXNpb247CisgIFVJTlQ4ICAgQ2xhc3NDb2RlWzNdOworICBVSU5UMTYgIEltYWdlTGVuZ3RoOworICBVSU5UMTYgIENvZGVSZXZpc2lvbjsKKyAgVUlOVDggICBDb2RlVHlwZTsKKyAgVUlOVDggICBJbmRpY2F0b3I7CisgIFVJTlQxNiAgUmVzZXJ2ZWQxOworfSBQQ0lfREFUQV9TVFJVQ1RVUkU7CisKKy8vLworLy8vIGRlZmluZWQgaW4gRUZJL1VFRkkgU3BlYworLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQxNiAgU2lnbmF0dXJlOyAgICAvLy88IDB4YWE1NQorICBVSU5UMTYgIEluaXRpYWxpemF0aW9uU2l6ZTsKKyAgVUlOVDMyICBFZmlTaWduYXR1cmU7IC8vLzwgMHgwRUYxCisgIFVJTlQxNiAgRWZpU3Vic3lzdGVtOworICBVSU5UMTYgIEVmaU1hY2hpbmVUeXBlOworICBVSU5UMTYgIENvbXByZXNzaW9uVHlwZTsKKyAgVUlOVDggICBSZXNlcnZlZFs4XTsKKyAgVUlOVDE2ICBFZmlJbWFnZUhlYWRlck9mZnNldDsKKyAgVUlOVDE2ICBQY2lyT2Zmc2V0OworfSBFRklfUENJX0VYUEFOU0lPTl9ST01fSEVBREVSOworCit0eXBlZGVmIHVuaW9uIHsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAqUmF3OworICBQQ0lfRVhQQU5TSU9OX1JPTV9IRUFERVIgICAgICAgICpHZW5lcmljOworICBFRklfUENJX0VYUEFOU0lPTl9ST01fSEVBREVSICAgICpFZmk7CisgIEVGSV9MRUdBQ1lfRVhQQU5TSU9OX1JPTV9IRUFERVIgKlBjQXQ7Cit9IEVGSV9QQ0lfUk9NX0hFQURFUjsKKworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL0luZHVzdHJ5U3RhbmRhcmQvUGVJbWFnZS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9JbmR1c3RyeVN0YW5kYXJkL1BlSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2IzYTVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9JbmR1c3RyeVN0YW5kYXJkL1BlSW1hZ2UuaApAQCAtMCwwICsxLDc1MiBAQAorLyoqIEBmaWxlCisgIEVGSSBpbWFnZSBmb3JtYXQgZm9yIFBFMzIsIFBFMzIrIGFuZCBURS4gUGxlYXNlIG5vdGUgc29tZSBkYXRhIHN0cnVjdHVyZXMgYXJlCisgIGRpZmZlcmVudCBmb3IgUEUzMiBhbmQgUEUzMisuIEVGSV9JTUFHRV9OVF9IRUFERVJTMzIgaXMgZm9yIFBFMzIgYW5kCisgIEVGSV9JTUFHRV9OVF9IRUFERVJTNjQgaXMgZm9yIFBFMzIrLgorCisgIFRoaXMgZmlsZSBpcyBjb2RlZCB0byB0aGUgVmlzdWFsIFN0dWRpbywgTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgYW5kCisgIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiwgUmV2aXNpb24gOC4wIC0gTWF5IDE2LCAyMDA2LgorICBUaGlzIGZpbGUgYWxzbyBpbmNsdWRlcyBzb21lIGRlZmluaXRpb25zIGluIFBJIFNwZWNpZmljYXRpb24sIFJldmlzaW9uIDEuMC4KKworICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CisgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworKiovCisKKyNpZm5kZWYgX19QRV9JTUFHRV9IX18KKyNkZWZpbmUgX19QRV9JTUFHRV9IX18KKworLy8vCisvLy8gUEUzMisgU3Vic3lzdGVtIHR5cGUgZm9yIEVGSSBpbWFnZXMKKy8vLworI2RlZmluZSBFRklfSU1BR0VfU1VCU1lTVEVNX0VGSV9BUFBMSUNBVElPTiAgICAgICAgIDEwCisjZGVmaW5lIEVGSV9JTUFHRV9TVUJTWVNURU1fRUZJX0JPT1RfU0VSVklDRV9EUklWRVIgMTEKKyNkZWZpbmUgRUZJX0lNQUdFX1NVQlNZU1RFTV9FRklfUlVOVElNRV9EUklWRVIgICAgICAxMgorI2RlZmluZSBFRklfSU1BR0VfU1VCU1lTVEVNX0VGSV9FRklfUk9NICAgICAgICAgICAgIDEzCisKKyNkZWZpbmUgRUZJX0lNQUdFX1NVQlNZU1RFTV9TQUxfUlVOVElNRV9EUklWRVIgICAgICAxMyAvLy88IGRlZmluZWQgUEkgU3BlY2lmaWNhdGlvbiwgMS4wCisKKworLy8vCisvLy8gUEUzMisgTWFjaGluZSB0eXBlIGZvciBFRkkgaW1hZ2VzCisvLy8KKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0kzODYgICAgIDB4MDE0YworI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfSUE2NCAgICAgMHgwMjAwCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9FQkMgICAgICAweDBFQkMKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1g2NCAgICAgIDB4ODY2NAorLy8KKy8vIFN1cHBvcnQgb2xkIG5hbWVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlCisvLworI2RlZmluZSBFRklfSU1BR0VfTUFDSElORV9JQTMyICAgICAgSU1BR0VfRklMRV9NQUNISU5FX0kzODYKKyNkZWZpbmUgRUZJX0lNQUdFX01BQ0hJTkVfSUE2NCAgICAgIElNQUdFX0ZJTEVfTUFDSElORV9JQTY0CisjZGVmaW5lIEVGSV9JTUFHRV9NQUNISU5FX0lQRiAgICAgICBJTUFHRV9GSUxFX01BQ0hJTkVfSUE2NAorI2RlZmluZSBFRklfSU1BR0VfTUFDSElORV9FQkMgICAgICAgSU1BR0VfRklMRV9NQUNISU5FX0VCQworI2RlZmluZSBFRklfSU1BR0VfTUFDSElORV9YNjQgICAgICAgSU1BR0VfRklMRV9NQUNISU5FX1g2NAorCisvLy8KKy8vLyBFWEUgZmlsZSBmb3JtYXRzCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX0RPU19TSUdOQVRVUkUgICAgIFNJR05BVFVSRV8xNignTScsICdaJykKKyNkZWZpbmUgRUZJX0lNQUdFX09TMl9TSUdOQVRVUkUgICAgIFNJR05BVFVSRV8xNignTicsICdFJykKKyNkZWZpbmUgRUZJX0lNQUdFX09TMl9TSUdOQVRVUkVfTEUgIFNJR05BVFVSRV8xNignTCcsICdFJykKKyNkZWZpbmUgRUZJX0lNQUdFX05UX1NJR05BVFVSRSAgICAgIFNJR05BVFVSRV8zMignUCcsICdFJywgJ1wwJywgJ1wwJykKKworLy8vCisvLy8gUEUgaW1hZ2VzIGNhbiBzdGFydCB3aXRoIGFuIG9wdGlvbmFsIERPUyBoZWFkZXIsIHNvIGlmIGFuIGltYWdlIGlzIHJ1bgorLy8vIHVuZGVyIERPUyBpdCBjYW4gcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMTYgIGVfbWFnaWM7ICAgIC8vLzwgTWFnaWMgbnVtYmVyCisgIFVJTlQxNiAgZV9jYmxwOyAgICAgLy8vPCBCeXRlcyBvbiBsYXN0IHBhZ2Ugb2YgZmlsZQorICBVSU5UMTYgIGVfY3A7ICAgICAgIC8vLzwgUGFnZXMgaW4gZmlsZQorICBVSU5UMTYgIGVfY3JsYzsgICAgIC8vLzwgUmVsb2NhdGlvbnMKKyAgVUlOVDE2ICBlX2NwYXJoZHI7ICAvLy88IFNpemUgb2YgaGVhZGVyIGluIHBhcmFncmFwaHMKKyAgVUlOVDE2ICBlX21pbmFsbG9jOyAvLy88IE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQKKyAgVUlOVDE2ICBlX21heGFsbG9jOyAvLy88IE1heGltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQKKyAgVUlOVDE2ICBlX3NzOyAgICAgICAvLy88IEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZQorICBVSU5UMTYgIGVfc3A7ICAgICAgIC8vLzwgSW5pdGlhbCBTUCB2YWx1ZQorICBVSU5UMTYgIGVfY3N1bTsgICAgIC8vLzwgQ2hlY2tzdW0KKyAgVUlOVDE2ICBlX2lwOyAgICAgICAvLy88IEluaXRpYWwgSVAgdmFsdWUKKyAgVUlOVDE2ICBlX2NzOyAgICAgICAvLy88IEluaXRpYWwgKHJlbGF0aXZlKSBDUyB2YWx1ZQorICBVSU5UMTYgIGVfbGZhcmxjOyAgIC8vLzwgRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUKKyAgVUlOVDE2ICBlX292bm87ICAgICAvLy88IE92ZXJsYXkgbnVtYmVyCisgIFVJTlQxNiAgZV9yZXNbNF07ICAgLy8vPCBSZXNlcnZlZCB3b3JkcworICBVSU5UMTYgIGVfb2VtaWQ7ICAgIC8vLzwgT0VNIGlkZW50aWZpZXIgKGZvciBlX29lbWluZm8pCisgIFVJTlQxNiAgZV9vZW1pbmZvOyAgLy8vPCBPRU0gaW5mb3JtYXRpb247IGVfb2VtaWQgc3BlY2lmaWMKKyAgVUlOVDE2ICBlX3JlczJbMTBdOyAvLy88IFJlc2VydmVkIHdvcmRzCisgIFVJTlQzMiAgZV9sZmFuZXc7ICAgLy8vPCBGaWxlIGFkZHJlc3Mgb2YgbmV3IGV4ZSBoZWFkZXIKK30gRUZJX0lNQUdFX0RPU19IRUFERVI7CisKKy8vLworLy8vIENPRkYgRmlsZSBIZWFkZXIgKE9iamVjdCBhbmQgSW1hZ2UpCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDE2ICBNYWNoaW5lOworICBVSU5UMTYgIE51bWJlck9mU2VjdGlvbnM7CisgIFVJTlQzMiAgVGltZURhdGVTdGFtcDsKKyAgVUlOVDMyICBQb2ludGVyVG9TeW1ib2xUYWJsZTsKKyAgVUlOVDMyICBOdW1iZXJPZlN5bWJvbHM7CisgIFVJTlQxNiAgU2l6ZU9mT3B0aW9uYWxIZWFkZXI7CisgIFVJTlQxNiAgQ2hhcmFjdGVyaXN0aWNzOworfSBFRklfSU1BR0VfRklMRV9IRUFERVI7CisKKy8vLworLy8vIFNpemUgb2YgRUZJX0lNQUdFX0ZJTEVfSEVBREVSCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX1NJWkVPRl9GSUxFX0hFQURFUiAgICAgICAgMjAKKworLy8vCisvLy8gQ2hhcmFjdGVyaXN0aWNzCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX0ZJTEVfUkVMT0NTX1NUUklQUEVEICAgICAgQklUMCAgICAgLy8vPCAweDAwMDEgIFJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUuCisjZGVmaW5lIEVGSV9JTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UgICAgIEJJVDEgICAgIC8vLzwgMHgwMDAyICBGaWxlIGlzIGV4ZWN1dGFibGUgIChpLmUuIG5vIHVucmVzb2x2ZWQgZXh0ZXJuZWwgcmVmZXJlbmNlcykuCisjZGVmaW5lIEVGSV9JTUFHRV9GSUxFX0xJTkVfTlVNU19TVFJJUFBFRCAgIEJJVDIgICAgIC8vLzwgMHgwMDA0ICBMaW5lIG51bmJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlLgorI2RlZmluZSBFRklfSU1BR0VfRklMRV9MT0NBTF9TWU1TX1NUUklQUEVEICBCSVQzICAgICAvLy88IDB4MDAwOCAgTG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUuCisjZGVmaW5lIEVGSV9JTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0xPICAgIEJJVDcgICAgIC8vLzwgMHgwMDgwICBCeXRlcyBvZiBtYWNoaW5lIHdvcmQgYXJlIHJldmVyc2VkLgorI2RlZmluZSBFRklfSU1BR0VfRklMRV8zMkJJVF9NQUNISU5FICAgICAgICBCSVQ4ICAgICAvLy88IDB4MDEwMCAgMzIgYml0IHdvcmQgbWFjaGluZS4KKyNkZWZpbmUgRUZJX0lNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQgICAgICAgQklUOSAgICAgLy8vPCAweDAyMDAgIERlYnVnZ2luZyBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZSBpbiAuREJHIGZpbGUKKyNkZWZpbmUgRUZJX0lNQUdFX0ZJTEVfU1lTVEVNICAgICAgICAgICAgICAgQklUMTIgICAgLy8vPCAweDEwMDAgIFN5c3RlbSBGaWxlLgorI2RlZmluZSBFRklfSU1BR0VfRklMRV9ETEwgICAgICAgICAgICAgICAgICBCSVQxMyAgICAvLy88IDB4MjAwMCAgRmlsZSBpcyBhIERMTC4KKyNkZWZpbmUgRUZJX0lNQUdFX0ZJTEVfQllURVNfUkVWRVJTRURfSEkgICAgQklUMTUgICAgLy8vPCAweDgwMDAgIEJ5dGVzIG9mIG1hY2hpbmUgd29yZCBhcmUgcmV2ZXJzZWQuCisKKy8vLworLy8vIE90aGVyIE1hY2hpbmUgVHlwZXMKKy8vLworI2RlZmluZSBFRklfSU1BR0VfRklMRV9NQUNISU5FX1VOS05PV04gICAgICAwICAgICAgIC8vLzwgQW55IG1hY2hpbmUgdHlwZQorI2RlZmluZSBFRklfSU1BR0VfRklMRV9NQUNISU5FX0kzODYgICAgICAgICAweDE0YyAgIC8vLzwgSW50ZWwgMzg2LgorI2RlZmluZSBFRklfSU1BR0VfRklMRV9NQUNISU5FX1IzMDAwICAgICAgICAweDE2MiAgIC8vLzwgTUlQUyogbGl0dGxlLWVuZGlhbiwgMDU0MCBiaWctZW5kaWFuCisjZGVmaW5lIEVGSV9JTUFHRV9GSUxFX01BQ0hJTkVfUjQwMDAgICAgICAgIDB4MTY2ICAgLy8vPCBNSVBTKiBsaXR0bGUtZW5kaWFuCisjZGVmaW5lIEVGSV9JTUFHRV9GSUxFX01BQ0hJTkVfUE9XRVJQQyAgICAgIDB4MUYwICAgLy8vPCBJQk0qIFBvd2VyUEMgTGl0dGxlLUVuZGlhbgorLy8KKy8vICogT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgorLy8KKworLy8vCisvLy8gSGVhZGVyIERhdGEgRGlyZWN0b3JpZXMKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgIFZpcnR1YWxBZGRyZXNzOworICBVSU5UMzIgIFNpemU7Cit9IEVGSV9JTUFHRV9EQVRBX0RJUkVDVE9SWTsKKworI2RlZmluZSBFRklfSU1BR0VfUk9NX09QVElPTkFMX0hEUl9NQUdJQyAgICAgIDB4MTA3CisKKy8vLworLy8vIERpcmVjdG9yeSBFbnRyaWVzCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9FWFBPUlQgICAgICAwCisjZGVmaW5lIEVGSV9JTUFHRV9ESVJFQ1RPUllfRU5UUllfSU1QT1JUICAgICAgMQorI2RlZmluZSBFRklfSU1BR0VfRElSRUNUT1JZX0VOVFJZX1JFU09VUkNFICAgIDIKKyNkZWZpbmUgRUZJX0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9FWENFUFRJT04gICAzCisjZGVmaW5lIEVGSV9JTUFHRV9ESVJFQ1RPUllfRU5UUllfU0VDVVJJVFkgICAgNAorI2RlZmluZSBFRklfSU1BR0VfRElSRUNUT1JZX0VOVFJZX0JBU0VSRUxPQyAgIDUKKyNkZWZpbmUgRUZJX0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9ERUJVRyAgICAgICA2CisjZGVmaW5lIEVGSV9JTUFHRV9ESVJFQ1RPUllfRU5UUllfQ09QWVJJR0hUICAgNworI2RlZmluZSBFRklfSU1BR0VfRElSRUNUT1JZX0VOVFJZX0dMT0JBTFBUUiAgIDgKKyNkZWZpbmUgRUZJX0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9UTFMgICAgICAgICA5CisjZGVmaW5lIEVGSV9JTUFHRV9ESVJFQ1RPUllfRU5UUllfTE9BRF9DT05GSUcgMTAKKworI2RlZmluZSBFRklfSU1BR0VfTlVNQkVSX09GX0RJUkVDVE9SWV9FTlRSSUVTIDE2CisKKy8vLworLy8vIEBhdHRlbnRpb24KKy8vLyBFRklfSU1BR0VfTlRfT1BUSU9OQUxfSERSMzJfTUFHSUMgbWVhbnMgUEUzMiBhbmQKKy8vLyBFRklfSU1BR0VfT1BUSU9OQUxfSEVBREVSMzIgbXVzdCBiZSB1c2VkLiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIG9ubHkgdmFyeQorLy8vIGFmdGVyIE5UIGFkZGl0aW9uYWwgZmllbGRzLgorLy8vCisjZGVmaW5lIEVGSV9JTUFHRV9OVF9PUFRJT05BTF9IRFIzMl9NQUdJQyAweDEwYgorCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vLworICAvLy8gU3RhbmRhcmQgZmllbGRzLgorICAvLy8KKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBNYWdpYzsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICBNYWpvckxpbmtlclZlcnNpb247CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgTWlub3JMaW5rZXJWZXJzaW9uOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFNpemVPZkNvZGU7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgU2l6ZU9mSW5pdGlhbGl6ZWREYXRhOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NPZkVudHJ5UG9pbnQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgQmFzZU9mQ29kZTsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBCYXNlT2ZEYXRhOyAgLy8vPCBQRTMyIGNvbnRhaW5zIHRoaXMgYWRkaXRpb25hbCBmaWVsZCwgd2hpY2ggaXMgYWJzZW50IGluIFBFMzIrCisgIC8vLworICAvLy8gTlQgYWRkaXRpb25hbCBmaWVsZHMuCisgIC8vLworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIEltYWdlQmFzZTsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBTZWN0aW9uQWxpZ25tZW50OworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIEZpbGVBbGlnbm1lbnQ7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgIE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBNYWpvckltYWdlVmVyc2lvbjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBNaW5vckltYWdlVmVyc2lvbjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBNYWpvclN1YnN5c3RlbVZlcnNpb247CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgTWlub3JTdWJzeXN0ZW1WZXJzaW9uOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFdpbjMyVmVyc2lvblZhbHVlOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFNpemVPZkltYWdlOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFNpemVPZkhlYWRlcnM7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgQ2hlY2tTdW07CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgU3Vic3lzdGVtOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgIERsbENoYXJhY3RlcmlzdGljczsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBTaXplT2ZTdGFja1Jlc2VydmU7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgU2l6ZU9mU3RhY2tDb21taXQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgU2l6ZU9mSGVhcFJlc2VydmU7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgU2l6ZU9mSGVhcENvbW1pdDsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBMb2FkZXJGbGFnczsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlJ2YUFuZFNpemVzOworICBFRklfSU1BR0VfREFUQV9ESVJFQ1RPUlkgIERhdGFEaXJlY3RvcnlbRUZJX0lNQUdFX05VTUJFUl9PRl9ESVJFQ1RPUllfRU5UUklFU107Cit9IEVGSV9JTUFHRV9PUFRJT05BTF9IRUFERVIzMjsKKworLy8vCisvLy8gQGF0dGVudGlvbgorLy8vIEVGSV9JTUFHRV9OVF9PUFRJT05BTF9IRFI2NF9NQUdJQyBtZWFucyBQRTMyKyBhbmQKKy8vLyBFRklfSU1BR0VfT1BUSU9OQUxfSEVBREVSNjQgbXVzdCBiZSB1c2VkLiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIG9ubHkgdmFyeQorLy8vIGFmdGVyIE5UIGFkZGl0aW9uYWwgZmllbGRzLgorLy8vCisjZGVmaW5lIEVGSV9JTUFHRV9OVF9PUFRJT05BTF9IRFI2NF9NQUdJQyAweDIwYgorCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vCisgIC8vIFN0YW5kYXJkIGZpZWxkcy4KKyAgLy8KKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBNYWdpYzsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICBNYWpvckxpbmtlclZlcnNpb247CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgTWlub3JMaW5rZXJWZXJzaW9uOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFNpemVPZkNvZGU7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgU2l6ZU9mSW5pdGlhbGl6ZWREYXRhOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NPZkVudHJ5UG9pbnQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgQmFzZU9mQ29kZTsKKyAgLy8KKyAgLy8gTlQgYWRkaXRpb25hbCBmaWVsZHMuCisgIC8vCisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgSW1hZ2VCYXNlOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25BbGlnbm1lbnQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgRmlsZUFsaWdubWVudDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgIE1ham9ySW1hZ2VWZXJzaW9uOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgIE1pbm9ySW1hZ2VWZXJzaW9uOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgIE1ham9yU3Vic3lzdGVtVmVyc2lvbjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBNaW5vclN1YnN5c3RlbVZlcnNpb247CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgV2luMzJWZXJzaW9uVmFsdWU7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgU2l6ZU9mSW1hZ2U7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgU2l6ZU9mSGVhZGVyczsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBDaGVja1N1bTsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBTdWJzeXN0ZW07CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgRGxsQ2hhcmFjdGVyaXN0aWNzOworICBVSU5UNjQgICAgICAgICAgICAgICAgICAgIFNpemVPZlN0YWNrUmVzZXJ2ZTsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICBTaXplT2ZTdGFja0NvbW1pdDsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICBTaXplT2ZIZWFwUmVzZXJ2ZTsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICBTaXplT2ZIZWFwQ29tbWl0OworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIExvYWRlckZsYWdzOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIE51bWJlck9mUnZhQW5kU2l6ZXM7CisgIEVGSV9JTUFHRV9EQVRBX0RJUkVDVE9SWSAgRGF0YURpcmVjdG9yeVtFRklfSU1BR0VfTlVNQkVSX09GX0RJUkVDVE9SWV9FTlRSSUVTXTsKK30gRUZJX0lNQUdFX09QVElPTkFMX0hFQURFUjY0OworCisKKy8vLworLy8vIEBhdHRlbnRpb24KKy8vLyBFRklfSU1BR0VfTlRfSEVBREVSUzMyIGFuZCBFRklfSU1BR0VfSEVBREVSUzY0IGFyZSBmb3IgdXNlIE9OTFkKKy8vLyBieSB0b29scy4gIEFsbCBwcm9wZXIgRUZJIGNvZGUgTVVTVCB1c2UgRUZJX0lNQUdFX05UX0hFQURFUlMgT05MWSEhIQorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmU7CisgIEVGSV9JTUFHRV9GSUxFX0hFQURFUiAgICAgICBGaWxlSGVhZGVyOworICBFRklfSU1BR0VfT1BUSU9OQUxfSEVBREVSMzIgT3B0aW9uYWxIZWFkZXI7Cit9IEVGSV9JTUFHRV9OVF9IRUFERVJTMzI7CisKKyNkZWZpbmUgRUZJX0lNQUdFX1NJWkVPRl9OVF9PUFRJT05BTDMyX0hFQURFUiBzaXplb2YgKEVGSV9JTUFHRV9OVF9IRUFERVJTMzIpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZTsKKyAgRUZJX0lNQUdFX0ZJTEVfSEVBREVSICAgICAgIEZpbGVIZWFkZXI7CisgIEVGSV9JTUFHRV9PUFRJT05BTF9IRUFERVI2NCBPcHRpb25hbEhlYWRlcjsKK30gRUZJX0lNQUdFX05UX0hFQURFUlM2NDsKKworI2RlZmluZSBFRklfSU1BR0VfU0laRU9GX05UX09QVElPTkFMNjRfSEVBREVSIHNpemVvZiAoRUZJX0lNQUdFX05UX0hFQURFUlM2NCkKKworCisvLy8KKy8vLyBQcm9jZXNzb3Igc3BlY2lmaWMgZGVmaW5pdGlvbiBvZiBFRklfSU1BR0VfT1BUSU9OQUxfSEVBREVSIHNvIHRoZQorLy8vIHR5cGUgbmFtZSBFRklfSU1BR0VfT1BUSU9OQUxfSEVBREVSIGlzIGFwcHJvcHJpYXRlIHRvIHRoZSBidWlsZC4gIFNhbWUgZm9yCisvLy8gRUZJX0lNQUdFX05UX0hFQURFUlMuICBUaGVzZSBkZWZpbml0aW9ucyBNVVNUIGJlIHVzZWQgYnkgQUxMIEVGSSBjb2RlLgorLy8vCisjaWYgICBkZWZpbmVkIChNREVfQ1BVX0lBMzIpCisKKyNkZWZpbmUgRUZJX0lNQUdFX01BQ0hJTkVfVFlQRV9TVVBQT1JURUQoTWFjaGluZSkgXAorICAoKChNYWNoaW5lKSA9PSBFRklfSU1BR0VfTUFDSElORV9JQTMyKSB8fCAoKE1hY2hpbmUpID09IEVGSV9JTUFHRV9NQUNISU5FX0VCQykpCisKKyNkZWZpbmUgRUZJX0lNQUdFX01BQ0hJTkVfQ1JPU1NfVFlQRV9TVVBQT1JURUQoTWFjaGluZSkgKChNYWNoaW5lKSA9PSBFRklfSU1BR0VfTUFDSElORV9YNjQpCisKK3R5cGVkZWYgRUZJX0lNQUdFX05UX0hFQURFUlMzMiAgICBFRklfSU1BR0VfTlRfSEVBREVSUzsKKworI2VsaWYgZGVmaW5lZCAoTURFX0NQVV9JUEYpCisKKyNkZWZpbmUgRUZJX0lNQUdFX01BQ0hJTkVfVFlQRV9TVVBQT1JURUQoTWFjaGluZSkgXAorICAoKChNYWNoaW5lKSA9PSBFRklfSU1BR0VfTUFDSElORV9JUEYpIHx8ICgoTWFjaGluZSkgPT0gRUZJX0lNQUdFX01BQ0hJTkVfRUJDKSkKKworI2RlZmluZSBFRklfSU1BR0VfTUFDSElORV9DUk9TU19UWVBFX1NVUFBPUlRFRChNYWNoaW5lKSAoRkFMU0UpCisKK3R5cGVkZWYgRUZJX0lNQUdFX05UX0hFQURFUlM2NCAgICBFRklfSU1BR0VfTlRfSEVBREVSUzsKKworI2VsaWYgZGVmaW5lZCAoTURFX0NQVV9YNjQpCisKKyNkZWZpbmUgRUZJX0lNQUdFX01BQ0hJTkVfVFlQRV9TVVBQT1JURUQoTWFjaGluZSkgXAorICAoKChNYWNoaW5lKSA9PSBFRklfSU1BR0VfTUFDSElORV9YNjQpIHx8ICgoTWFjaGluZSkgPT0gRUZJX0lNQUdFX01BQ0hJTkVfRUJDKSkKKworI2RlZmluZSBFRklfSU1BR0VfTUFDSElORV9DUk9TU19UWVBFX1NVUFBPUlRFRChNYWNoaW5lKSAoKE1hY2hpbmUpID09IEVGSV9JTUFHRV9NQUNISU5FX0lBMzIpCisKK3R5cGVkZWYgRUZJX0lNQUdFX05UX0hFQURFUlM2NCAgICBFRklfSU1BR0VfTlRfSEVBREVSUzsKKworI2VsaWYgZGVmaW5lZCAoTURFX0NQVV9FQkMpCisKKy8vLworLy8vIFRoaXMgaXMganVzdCB0byBtYWtlIHN1cmUgeW91IGNhbiBjcm9zcyBjb21waWxlIHdpdGggdGhlIEVCQyBjb21waWlsZXIuCisvLy8gSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIGEgUEUgbG9hZGVyIGNvZGVkIGluIEVCQy4gWW91IG5lZWQgdG8KKy8vLyB1bmRlcnN0YW5kIHRoZSBiYXNpYworLy8vCisjZGVmaW5lIEVGSV9JTUFHRV9NQUNISU5FX1RZUEVfU1VQUE9SVEVEKE1hY2hpbmUpICgoTWFjaGluZSkgPT0gRUZJX0lNQUdFX01BQ0hJTkVfRUJDKQorCisjZGVmaW5lIEVGSV9JTUFHRV9NQUNISU5FX0NST1NTX1RZUEVfU1VQUE9SVEVEKE1hY2hpbmUpIChGQUxTRSkKKwordHlwZWRlZiBFRklfSU1BR0VfTlRfSEVBREVSUzY0ICAgIEVGSV9JTUFHRV9OVF9IRUFERVJTOworCisjZWxzZQorI2Vycm9yIFVua25vd24gUHJvY2Vzc29yIFR5cGUKKyNlbmRpZgorCisKKyNkZWZpbmUgRUZJX0lNQUdFX0ZJUlNUX1NFQ1RJT04obnRoZWFkZXIpIFwKKyAgICAoIFwKKyAgICAgIChFRklfSU1BR0VfU0VDVElPTl9IRUFERVIgKikgXAorICAgICAgICAoIFwKKyAgICAgICAgICAoVUlOVDMyKSBudGhlYWRlciArIFwKKyAgICAgICAgICBGSUVMRF9PRkZTRVQgKEVGSV9JTUFHRV9OVF9IRUFERVJTLCBPcHRpb25hbEhlYWRlcikgKyBcCisgICAgICAgICAgKChFRklfSU1BR0VfTlRfSEVBREVSUyAqKSAobnRoZWFkZXIpKS0+RmlsZUhlYWRlci5TaXplT2ZPcHRpb25hbEhlYWRlciBcCisgICAgICAgICkgXAorICAgICkKKworLy8vCisvLy8gT3RoZXIgV2luZG93cyBTdWJzeXN0ZW0gVmFsdWVzCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX1NVQlNZU1RFTV9VTktOT1dOICAgICAwCisjZGVmaW5lIEVGSV9JTUFHRV9TVUJTWVNURU1fTkFUSVZFICAgICAgMQorI2RlZmluZSBFRklfSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfR1VJIDIKKyNkZWZpbmUgRUZJX0lNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0NVSSAzCisjZGVmaW5lIEVGSV9JTUFHRV9TVUJTWVNURU1fT1MyX0NVSSAgICAgNQorI2RlZmluZSBFRklfSU1BR0VfU1VCU1lTVEVNX1BPU0lYX0NVSSAgIDcKKworLy8vCisvLy8gU2VjdGlvbiBoZWFkZXIgZm9ybWF0LgorLy8vCisjZGVmaW5lIEVGSV9JTUFHRV9TSVpFT0ZfU0hPUlRfTkFNRSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDggTmFtZVtFRklfSU1BR0VfU0laRU9GX1NIT1JUX05BTUVdOworICB1bmlvbiB7CisgICAgVUlOVDMyICBQaHlzaWNhbEFkZHJlc3M7CisgICAgVUlOVDMyICBWaXJ0dWFsU2l6ZTsKKyAgfSBNaXNjOworICBVSU5UMzIgIFZpcnR1YWxBZGRyZXNzOworICBVSU5UMzIgIFNpemVPZlJhd0RhdGE7CisgIFVJTlQzMiAgUG9pbnRlclRvUmF3RGF0YTsKKyAgVUlOVDMyICBQb2ludGVyVG9SZWxvY2F0aW9uczsKKyAgVUlOVDMyICBQb2ludGVyVG9MaW5lbnVtYmVyczsKKyAgVUlOVDE2ICBOdW1iZXJPZlJlbG9jYXRpb25zOworICBVSU5UMTYgIE51bWJlck9mTGluZW51bWJlcnM7CisgIFVJTlQzMiAgQ2hhcmFjdGVyaXN0aWNzOworfSBFRklfSU1BR0VfU0VDVElPTl9IRUFERVI7CisKKy8vLworLy8vIFNpemUgb2YgRUZJX0lNQUdFX1NFQ1RJT05fSEVBREVSCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX1NJWkVPRl9TRUNUSU9OX0hFQURFUiAgICAgICA0MAorCisvLy8KKy8vLyBTZWN0aW9uIEZsYWdzIFZhbHVlcworLy8vCisjZGVmaW5lIEVGSV9JTUFHRV9TQ05fVFlQRV9OT19QQUQgICAgICAgICAgICAgICAgICBCSVQzICAgLy8vPCAweDAwMDAwMDA4ICAvLy88IFJlc2VydmVkLgorI2RlZmluZSBFRklfSU1BR0VfU0NOX0NOVF9DT0RFICAgICAgICAgICAgICAgICAgICAgQklUNSAgIC8vLzwgMHgwMDAwMDAyMAorI2RlZmluZSBFRklfSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBICAgICAgICAgQklUNiAgIC8vLzwgMHgwMDAwMDA0MAorI2RlZmluZSBFRklfSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEgICAgICAgQklUNyAgIC8vLzwgMHgwMDAwMDA4MAorCisjZGVmaW5lIEVGSV9JTUFHRV9TQ05fTE5LX09USEVSICAgICAgICAgICAgICAgICAgICBCSVQ4ICAgLy8vPCAweDAwMDAwMTAwICAvLy88IFJlc2VydmVkLgorI2RlZmluZSBFRklfSU1BR0VfU0NOX0xOS19JTkZPICAgICAgICAgICAgICAgICAgICAgQklUOSAgIC8vLzwgMHgwMDAwMDIwMCAgLy8vPCBTZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIG9yIHNvbWUgb3RoZXIgdHlwZSBvZiBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgRUZJX0lNQUdFX1NDTl9MTktfUkVNT1ZFICAgICAgICAgICAgICAgICAgIEJJVDEwICAvLy88IDB4MDAwMDA4MDAgIC8vLzwgU2VjdGlvbiBjb250ZW50cyB3aWxsIG5vdCBiZWNvbWUgcGFydCBvZiBpbWFnZS4KKyNkZWZpbmUgRUZJX0lNQUdFX1NDTl9MTktfQ09NREFUICAgICAgICAgICAgICAgICAgIEJJVDEyICAvLy88IDB4MDAwMDEwMDAKKworI2RlZmluZSBFRklfSU1BR0VfU0NOX0FMSUdOXzFCWVRFUyAgICAgICAgICAgICAgICAgQklUMjAgIC8vLzwgMHgwMDEwMDAwMAorI2RlZmluZSBFRklfSU1BR0VfU0NOX0FMSUdOXzJCWVRFUyAgICAgICAgICAgICAgICAgQklUMjEgIC8vLzwgMHgwMDIwMDAwMAorI2RlZmluZSBFRklfSU1BR0VfU0NOX0FMSUdOXzRCWVRFUyAgICAgICAgICAoQklUMjB8QklUMjEpIC8vLzwgMHgwMDMwMDAwMAorI2RlZmluZSBFRklfSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyAgICAgICAgICAgICAgICAgQklUMjIgIC8vLzwgMHgwMDQwMDAwMAorI2RlZmluZSBFRklfSU1BR0VfU0NOX0FMSUdOXzE2QllURVMgICAgICAgICAoQklUMjB8QklUMjIpIC8vLzwgMHgwMDUwMDAwMAorI2RlZmluZSBFRklfSU1BR0VfU0NOX0FMSUdOXzMyQllURVMgICAgICAgICAoQklUMjF8QklUMjIpIC8vLzwgMHgwMDYwMDAwMAorI2RlZmluZSBFRklfSU1BR0VfU0NOX0FMSUdOXzY0QllURVMgICAoQklUMjB8QklUMjF8QklUMjIpIC8vLzwgMHgwMDcwMDAwMAorCisjZGVmaW5lIEVGSV9JTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFICAgICAgICAgICAgICBCSVQyNSAgLy8vPCAweDAyMDAwMDAwCisjZGVmaW5lIEVGSV9JTUFHRV9TQ05fTUVNX05PVF9DQUNIRUQgICAgICAgICAgICAgICBCSVQyNiAgLy8vPCAweDA0MDAwMDAwCisjZGVmaW5lIEVGSV9JTUFHRV9TQ05fTUVNX05PVF9QQUdFRCAgICAgICAgICAgICAgICBCSVQyNyAgLy8vPCAweDA4MDAwMDAwCisjZGVmaW5lIEVGSV9JTUFHRV9TQ05fTUVNX1NIQVJFRCAgICAgICAgICAgICAgICAgICBCSVQyOCAgLy8vPCAweDEwMDAwMDAwCisjZGVmaW5lIEVGSV9JTUFHRV9TQ05fTUVNX0VYRUNVVEUgICAgICAgICAgICAgICAgICBCSVQyOSAgLy8vPCAweDIwMDAwMDAwCisjZGVmaW5lIEVGSV9JTUFHRV9TQ05fTUVNX1JFQUQgICAgICAgICAgICAgICAgICAgICBCSVQzMCAgLy8vPCAweDQwMDAwMDAwCisjZGVmaW5lIEVGSV9JTUFHRV9TQ05fTUVNX1dSSVRFICAgICAgICAgICAgICAgICAgICBCSVQzMSAgLy8vPCAweDgwMDAwMDAwCisKKy8vLworLy8vIFNpemUgb2YgYSBTeW1ib2wgVGFibGUgUmVjb3JkCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX1NJWkVPRl9TWU1CT0wgMTgKKworLy8vCisvLy8gU3ltYm9scyBoYXZlIGEgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhleSBhcmUKKy8vLyBkZWZpbmVkLiBPdGhlcndpc2UsIHNlY3Rpb24gbnVtYmVycyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9VTkRFRklORUQgKFVJTlQxNikgMCAgLy8vPCBTeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGlzIGNvbW1vbi4KKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9BQlNPTFVURSAgKFVJTlQxNikgLTEgLy8vPCBTeW1ib2wgaXMgYW4gYWJzb2x1dGUgdmFsdWUuCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fREVCVUcgICAgIChVSU5UMTYpIC0yIC8vLzwgU3ltYm9sIGlzIGEgc3BlY2lhbCBkZWJ1ZyBpdGVtLgorCisvLy8KKy8vLyBTeW1ib2wgVHlwZSAoZnVuZGFtZW50YWwpIHZhbHVlcy4KKy8vLworI2RlZmluZSBFRklfSU1BR0VfU1lNX1RZUEVfTlVMTCAgIDAgICAvLy88IG5vIHR5cGUuCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fVFlQRV9WT0lEICAgMSAgIC8vLzwgbm8gdmFsaWQgdHlwZS4KKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9UWVBFX0NIQVIgICAyICAgLy8vPCB0eXBlIGNoYXJhY3Rlci4KKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9UWVBFX1NIT1JUICAzICAgLy8vPCB0eXBlIHNob3J0IGludGVnZXIuCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fVFlQRV9JTlQgICAgNAorI2RlZmluZSBFRklfSU1BR0VfU1lNX1RZUEVfTE9ORyAgIDUKKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9UWVBFX0ZMT0FUICA2CisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fVFlQRV9ET1VCTEUgNworI2RlZmluZSBFRklfSU1BR0VfU1lNX1RZUEVfU1RSVUNUIDgKKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9UWVBFX1VOSU9OICA5CisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fVFlQRV9FTlVNICAgMTAgIC8vLzwgZW51bWVyYXRpb24uCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fVFlQRV9NT0UgICAgMTEgIC8vLzwgbWVtYmVyIG9mIGVudW1lcmF0aW9uLgorI2RlZmluZSBFRklfSU1BR0VfU1lNX1RZUEVfQllURSAgIDEyCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fVFlQRV9XT1JEICAgMTMKKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9UWVBFX1VJTlQgICAxNAorI2RlZmluZSBFRklfSU1BR0VfU1lNX1RZUEVfRFdPUkQgIDE1CisKKy8vLworLy8vIFN5bWJvbCBUeXBlIChkZXJpdmVkKSB2YWx1ZXMuCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9EVFlQRV9OVUxMICAgICAgMCAvLy88IG5vIGRlcml2ZWQgdHlwZS4KKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9EVFlQRV9QT0lOVEVSICAgMQorI2RlZmluZSBFRklfSU1BR0VfU1lNX0RUWVBFX0ZVTkNUSU9OICAyCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fRFRZUEVfQVJSQVkgICAgIDMKKworLy8vCisvLy8gU3RvcmFnZSBjbGFzc2VzLgorLy8vCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fQ0xBU1NfRU5EX09GX0ZVTkNUSU9OICAgKChVSU5UOCkgLTEpCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fQ0xBU1NfTlVMTCAgICAgICAgICAgICAgMAorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX0FVVE9NQVRJQyAgICAgICAgIDEKKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9DTEFTU19FWFRFUk5BTCAgICAgICAgICAyCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fQ0xBU1NfU1RBVElDICAgICAgICAgICAgMworI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX1JFR0lTVEVSICAgICAgICAgIDQKKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9DTEFTU19FWFRFUk5BTF9ERUYgICAgICA1CisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fQ0xBU1NfTEFCRUwgICAgICAgICAgICAgNgorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX1VOREVGSU5FRF9MQUJFTCAgIDcKKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9DTEFTU19NRU1CRVJfT0ZfU1RSVUNUICA4CisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fQ0xBU1NfQVJHVU1FTlQgICAgICAgICAgOQorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX1NUUlVDVF9UQUcgICAgICAgIDEwCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX1VOSU9OICAgMTEKKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9DTEFTU19VTklPTl9UQUcgICAgICAgICAxMgorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX1RZUEVfREVGSU5JVElPTiAgIDEzCisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fQ0xBU1NfVU5ERUZJTkVEX1NUQVRJQyAgMTQKKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9DTEFTU19FTlVNX1RBRyAgICAgICAgICAxNQorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX01FTUJFUl9PRl9FTlVNICAgIDE2CisjZGVmaW5lIEVGSV9JTUFHRV9TWU1fQ0xBU1NfUkVHSVNURVJfUEFSQU0gICAgMTcKKyNkZWZpbmUgRUZJX0lNQUdFX1NZTV9DTEFTU19CSVRfRklFTEQgICAgICAgICAxOAorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX0JMT0NLICAgICAgICAgICAgIDEwMAorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX0ZVTkNUSU9OICAgICAgICAgIDEwMQorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX0VORF9PRl9TVFJVQ1QgICAgIDEwMgorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX0ZJTEUgICAgICAgICAgICAgIDEwMworI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX1NFQ1RJT04gICAgICAgICAgIDEwNAorI2RlZmluZSBFRklfSU1BR0VfU1lNX0NMQVNTX1dFQUtfRVhURVJOQUwgICAgIDEwNQorCisvLworLy8gdHlwZSBwYWNraW5nIGNvbnN0YW50cworLy8KKyNkZWZpbmUgRUZJX0lNQUdFX05fQlRNQVNLICAwMTcKKyNkZWZpbmUgRUZJX0lNQUdFX05fVE1BU0sgICAwNjAKKyNkZWZpbmUgRUZJX0lNQUdFX05fVE1BU0sxICAwMzAwCisjZGVmaW5lIEVGSV9JTUFHRV9OX1RNQVNLMiAgMDM2MAorI2RlZmluZSBFRklfSU1BR0VfTl9CVFNIRlQgIDQKKyNkZWZpbmUgRUZJX0lNQUdFX05fVFNISUZUICAyCisKKy8vLworLy8vIENvbW11bmFsIHNlbGVjdGlvbiB0eXBlcy4KKy8vLworI2RlZmluZSBFRklfSU1BR0VfQ09NREFUX1NFTEVDVF9OT0RVUExJQ0FURVMgICAgMQorI2RlZmluZSBFRklfSU1BR0VfQ09NREFUX1NFTEVDVF9BTlkgICAgICAgICAgICAgMgorI2RlZmluZSBFRklfSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkUgICAgICAgMworI2RlZmluZSBFRklfSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSCAgICAgNAorI2RlZmluZSBFRklfSU1BR0VfQ09NREFUX1NFTEVDVF9BU1NPQ0lBVElWRSAgICAgNQorCisvLy8KKy8vLyB0aGUgZm9sbG93aW5nIHZhbHVlcyBvbmx5IGJlIHJlZmVycmVkIGluIFBlQ29mZiwgbm90IGRlZmluZWQgaW4gUEVDT0ZGLgorLy8vCisjZGVmaW5lIEVGSV9JTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfTk9MSUJSQVJZICAxCisjZGVmaW5lIEVGSV9JTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfTElCUkFSWSAgICAyCisjZGVmaW5lIEVGSV9JTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfQUxJQVMgICAgICAzCisKKy8vLworLy8vIFJlbG9jYXRpb24gZm9ybWF0LgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgVmlydHVhbEFkZHJlc3M7CisgIFVJTlQzMiAgU3ltYm9sVGFibGVJbmRleDsKKyAgVUlOVDE2ICBUeXBlOworfSBFRklfSU1BR0VfUkVMT0NBVElPTjsKKworLy8vCisvLy8gU2l6ZSBvZiBFRklfSU1BR0VfUkVMT0NBVElPTgorLy8vCisjZGVmaW5lIEVGSV9JTUFHRV9TSVpFT0ZfUkVMT0NBVElPTiAxMAorCisvLy8KKy8vLyBJMzg2IHJlbG9jYXRpb24gdHlwZXMuCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX1JFTF9JMzg2X0FCU09MVVRFIDB4MDAwMCAgLy8vPCBSZWZlcmVuY2UgaXMgYWJzb2x1dGUsIG5vIHJlbG9jYXRpb24gaXMgbmVjZXNzYXJ5CisjZGVmaW5lIEVGSV9JTUFHRV9SRUxfSTM4Nl9ESVIxNiAgICAweDAwMDEgIC8vLzwgRGlyZWN0IDE2LWJpdCByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbHMgdmlydHVhbCBhZGRyZXNzCisjZGVmaW5lIEVGSV9JTUFHRV9SRUxfSTM4Nl9SRUwxNiAgICAweDAwMDIgIC8vLzwgUEMtcmVsYXRpdmUgMTYtYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKyNkZWZpbmUgRUZJX0lNQUdFX1JFTF9JMzg2X0RJUjMyICAgIDB4MDAwNiAgLy8vPCBEaXJlY3QgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKyNkZWZpbmUgRUZJX0lNQUdFX1JFTF9JMzg2X0RJUjMyTkIgIDB4MDAwNyAgLy8vPCBEaXJlY3QgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MsIGJhc2Ugbm90IGluY2x1ZGVkCisjZGVmaW5lIEVGSV9JTUFHRV9SRUxfSTM4Nl9TRUcxMiAgICAweDAwMDkgIC8vLzwgRGlyZWN0IDE2LWJpdCByZWZlcmVuY2UgdG8gdGhlIHNlZ21lbnQtc2VsZWN0b3IgYml0cyBvZiBhIDMyLWJpdCB2aXJ0dWFsIGFkZHJlc3MKKyNkZWZpbmUgRUZJX0lNQUdFX1JFTF9JMzg2X1NFQ1RJT04gIDB4MDAwQQorI2RlZmluZSBFRklfSU1BR0VfUkVMX0kzODZfU0VDUkVMICAgMHgwMDBCCisjZGVmaW5lIEVGSV9JTUFHRV9SRUxfSTM4Nl9SRUwzMiAgICAweDAwMTQgIC8vLzwgUEMtcmVsYXRpdmUgMzItYml0IHJlZmVyZW5jZSB0byB0aGUgc3ltYm9scyB2aXJ0dWFsIGFkZHJlc3MKKworLy8vCisvLy8geDY0IHByb2Nlc3NvciByZWxvY2F0aW9uIHR5cGVzLgorLy8vCisjZGVmaW5lIElNQUdFX1JFTF9BTUQ2NF9BQlNPTFVURQkweDAwMDAKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X0FERFI2NAkgIDB4MDAwMQorI2RlZmluZSBJTUFHRV9SRUxfQU1ENjRfQUREUjMyCSAgMHgwMDAyCisjZGVmaW5lIElNQUdFX1JFTF9BTUQ2NF9BRERSMzJOQgkweDAwMDMKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X1JFTDMyCSAgICAweDAwMDQKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X1JFTDMyXzEJICAweDAwMDUKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X1JFTDMyXzIJICAweDAwMDYKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X1JFTDMyXzMJICAweDAwMDcKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X1JFTDMyXzQJICAweDAwMDgKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X1JFTDMyXzUJICAweDAwMDkKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X1NFQ1RJT04JICAweDAwMEEKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X1NFQ1JFTAkgIDB4MDAwQgorI2RlZmluZSBJTUFHRV9SRUxfQU1ENjRfU0VDUkVMNwkgIDB4MDAwQworI2RlZmluZSBJTUFHRV9SRUxfQU1ENjRfVE9LRU4JICAgIDB4MDAwRAorI2RlZmluZSBJTUFHRV9SRUxfQU1ENjRfU1JFTDMyCSAgMHgwMDBFCisjZGVmaW5lIElNQUdFX1JFTF9BTUQ2NF9QQUlSCSAgICAweDAwMEYKKyNkZWZpbmUgSU1BR0VfUkVMX0FNRDY0X1NTUEFOMzIJICAweDAwMTAKKworLy8vCisvLy8gQmFzZWQgcmVsb2NhdGlvbiBmb3JtYXQuCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICBWaXJ0dWFsQWRkcmVzczsKKyAgVUlOVDMyICBTaXplT2ZCbG9jazsKK30gRUZJX0lNQUdFX0JBU0VfUkVMT0NBVElPTjsKKworLy8vCisvLy8gU2l6ZSBvZiBFRklfSU1BR0VfQkFTRV9SRUxPQ0FUSU9OCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX1NJWkVPRl9CQVNFX1JFTE9DQVRJT04gIDgKKworLy8vCisvLy8gQmFzZWQgcmVsb2NhdGlvbiB0eXBlcy4KKy8vLworI2RlZmluZSBFRklfSU1BR0VfUkVMX0JBU0VEX0FCU09MVVRFICAgICAgMAorI2RlZmluZSBFRklfSU1BR0VfUkVMX0JBU0VEX0hJR0ggICAgICAgICAgMQorI2RlZmluZSBFRklfSU1BR0VfUkVMX0JBU0VEX0xPVyAgICAgICAgICAgMgorI2RlZmluZSBFRklfSU1BR0VfUkVMX0JBU0VEX0hJR0hMT1cgICAgICAgMworI2RlZmluZSBFRklfSU1BR0VfUkVMX0JBU0VEX0hJR0hBREogICAgICAgNAorI2RlZmluZSBFRklfSU1BR0VfUkVMX0JBU0VEX01JUFNfSk1QQUREUiAgNQorI2RlZmluZSBFRklfSU1BR0VfUkVMX0JBU0VEX0lBNjRfSU1NNjQgICAgOQorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfTUlQU19KTVBBRERSMTYgICAgOQorI2RlZmluZSBFRklfSU1BR0VfUkVMX0JBU0VEX0RJUjY0ICAgICAgICAgMTAKKworLy8vCisvLy8gTGluZSBudW1iZXIgZm9ybWF0LgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuaW9uIHsKKyAgICBVSU5UMzIgIFN5bWJvbFRhYmxlSW5kZXg7IC8vIFN5bWJvbCB0YWJsZSBpbmRleCBvZiBmdW5jdGlvbiBuYW1lIGlmIExpbmVudW1iZXIgaXMgMC4KKyAgICBVSU5UMzIgIFZpcnR1YWxBZGRyZXNzOyAgIC8vIFZpcnR1YWwgYWRkcmVzcyBvZiBsaW5lIG51bWJlci4KKyAgfSBUeXBlOworICBVSU5UMTYgIExpbmVudW1iZXI7ICAgICAgICAgLy8gTGluZSBudW1iZXIuCit9IEVGSV9JTUFHRV9MSU5FTlVNQkVSOworCisvLy8KKy8vLyBTaXplIG9mIEVGSV9JTUFHRV9MSU5FTlVNQkVSCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX1NJWkVPRl9MSU5FTlVNQkVSIDYKKworLy8vCisvLy8gQXJjaGl2ZSBmb3JtYXQuCisvLy8KKyNkZWZpbmUgRUZJX0lNQUdFX0FSQ0hJVkVfU1RBUlRfU0laRSAgICAgICAgOAorI2RlZmluZSBFRklfSU1BR0VfQVJDSElWRV9TVEFSVCAgICAgICAgICAgICAiITxhcmNoPlxuIgorI2RlZmluZSBFRklfSU1BR0VfQVJDSElWRV9FTkQgICAgICAgICAgICAgICAiYFxuIgorI2RlZmluZSBFRklfSU1BR0VfQVJDSElWRV9QQUQgICAgICAgICAgICAgICAiXG4iCisjZGVmaW5lIEVGSV9JTUFHRV9BUkNISVZFX0xJTktFUl9NRU1CRVIgICAgICIvICAgICAgICAgICAgICAgIgorI2RlZmluZSBFRklfSU1BR0VfQVJDSElWRV9MT05HTkFNRVNfTUVNQkVSICAiLy8gICAgICAgICAgICAgICIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UOCBOYW1lWzE2XTsgICAgIC8vLzwgRmlsZSBtZW1iZXIgbmFtZSAtIGAvJyB0ZXJtaW5hdGVkLgorICBVSU5UOCBEYXRlWzEyXTsgICAgIC8vLzwgRmlsZSBtZW1iZXIgZGF0ZSAtIGRlY2ltYWwuCisgIFVJTlQ4IFVzZXJJRFs2XTsgICAgLy8vPCBGaWxlIG1lbWJlciB1c2VyIGlkIC0gZGVjaW1hbC4KKyAgVUlOVDggR3JvdXBJRFs2XTsgICAvLy88IEZpbGUgbWVtYmVyIGdyb3VwIGlkIC0gZGVjaW1hbC4KKyAgVUlOVDggTW9kZVs4XTsgICAgICAvLy88IEZpbGUgbWVtYmVyIG1vZGUgLSBvY3RhbC4KKyAgVUlOVDggU2l6ZVsxMF07ICAgICAvLy88IEZpbGUgbWVtYmVyIHNpemUgLSBkZWNpbWFsLgorICBVSU5UOCBFbmRIZWFkZXJbMl07IC8vLzwgU3RyaW5nIHRvIGVuZCBoZWFkZXIuICgweDYwIDB4MEEpCit9IEVGSV9JTUFHRV9BUkNISVZFX01FTUJFUl9IRUFERVI7CisKKy8vLworLy8vIFNpemUgb2YgRUZJX0lNQUdFX0FSQ0hJVkVfTUVNQkVSX0hFQURFUgorLy8vCisjZGVmaW5lIEVGSV9JTUFHRV9TSVpFT0ZfQVJDSElWRV9NRU1CRVJfSERSIDYwCisKKworLy8vCisvLy8gRExMIFN1cHBvcnQKKy8vLworCisvLy8KKy8vLyBFeHBvcnQgRGlyZWN0b3J5IFRhYmxlCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICBDaGFyYWN0ZXJpc3RpY3M7CisgIFVJTlQzMiAgVGltZURhdGVTdGFtcDsKKyAgVUlOVDE2ICBNYWpvclZlcnNpb247CisgIFVJTlQxNiAgTWlub3JWZXJzaW9uOworICBVSU5UMzIgIE5hbWU7CisgIFVJTlQzMiAgQmFzZTsKKyAgVUlOVDMyICBOdW1iZXJPZkZ1bmN0aW9uczsKKyAgVUlOVDMyICBOdW1iZXJPZk5hbWVzOworICBVSU5UMzIgIEFkZHJlc3NPZkZ1bmN0aW9uczsKKyAgVUlOVDMyICBBZGRyZXNzT2ZOYW1lczsKKyAgVUlOVDMyICBBZGRyZXNzT2ZOYW1lT3JkaW5hbHM7Cit9IEVGSV9JTUFHRV9FWFBPUlRfRElSRUNUT1JZOworCisvLy8KKy8vLyBIaW50L05hbWUgVGFibGUKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMTYgIEhpbnQ7CisgIFVJTlQ4ICAgTmFtZVsxXTsKK30gRUZJX0lNQUdFX0lNUE9SVF9CWV9OQU1FOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuaW9uIHsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgT3JkaW5hbDsKKyAgICBFRklfSU1BR0VfSU1QT1JUX0JZX05BTUUgICpBZGRyZXNzT2ZEYXRhOworICB9IHUxOworfSBFRklfSU1BR0VfVEhVTktfREFUQTsKKworI2RlZmluZSBFRklfSU1BR0VfT1JESU5BTF9GTEFHICAgICAgICAgICAgICBCSVQzMSAgICAvLy88IEZsYWcgZm9yIFBFMzIKKyNkZWZpbmUgRUZJX0lNQUdFX1NOQVBfQllfT1JESU5BTChPcmRpbmFsKSAgKChPcmRpbmFsICYgRUZJX0lNQUdFX09SRElOQUxfRkxBRykgIT0gMCkKKyNkZWZpbmUgRUZJX0lNQUdFX09SRElOQUwoT3JkaW5hbCkgICAgICAgICAgKE9yZGluYWwgJiAweGZmZmYpCisKKy8vLworLy8vIEltcG9ydCBEaXJlY3RvcnkgVGFibGUKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgICAgICAgICAgICAgICAgQ2hhcmFjdGVyaXN0aWNzOworICBVSU5UMzIgICAgICAgICAgICAgICAgVGltZURhdGVTdGFtcDsKKyAgVUlOVDMyICAgICAgICAgICAgICAgIEZvcndhcmRlckNoYWluOworICBVSU5UMzIgICAgICAgICAgICAgICAgTmFtZTsKKyAgRUZJX0lNQUdFX1RIVU5LX0RBVEEgICpGaXJzdFRodW5rOworfSBFRklfSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1I7CisKKworLy8vCisvLy8gRGVidWcgRGlyZWNvdHJ5IEZvcm1hdAorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgQ2hhcmFjdGVyaXN0aWNzOworICBVSU5UMzIgIFRpbWVEYXRlU3RhbXA7CisgIFVJTlQxNiAgTWFqb3JWZXJzaW9uOworICBVSU5UMTYgIE1pbm9yVmVyc2lvbjsKKyAgVUlOVDMyICBUeXBlOworICBVSU5UMzIgIFNpemVPZkRhdGE7CisgIFVJTlQzMiAgUlZBOyAgICAgICAgICAgLy8vPCBUaGUgYWRkcmVzcyBvZiB0aGUgZGVidWcgZGF0YSB3aGVuIGxvYWRlZCwgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGJhc2UKKyAgVUlOVDMyICBGaWxlT2Zmc2V0OyAgICAvLy88IFRoZSBmaWxlIHBvaW50ZXIgdG8gdGhlIGRlYnVnIGRhdGEKK30gRUZJX0lNQUdFX0RFQlVHX0RJUkVDVE9SWV9FTlRSWTsKKworI2RlZmluZSBFRklfSU1BR0VfREVCVUdfVFlQRV9DT0RFVklFVyAyICAgICAvLy88IFRoZSBWaXN1YWwgQysrIGRlYnVnIGluZm9ybWF0aW9uCisKKy8vLworLy8vIERlYnVnIERhdGEgU3RydWN0dXJlIGRlZmluZWQgaW4gTWljcm9zb2Z0IEMrKworLy8vCisjZGVmaW5lIENPREVWSUVXX1NJR05BVFVSRV9OQjEwICBTSUdOQVRVUkVfMzIoJ04nLCAnQicsICcxJywgJzAnKQordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgIFNpZ25hdHVyZTsgICAgICAgICAgICAgICAgICAgICAgICAvLy88ICJOQjEwIgorICBVSU5UMzIgIFVua25vd247CisgIFVJTlQzMiAgVW5rbm93bjI7CisgIFVJTlQzMiAgVW5rbm93bjM7CisgIC8vCisgIC8vIEZpbGVuYW1lIG9mIC5QREIgZ29lcyBoZXJlCisgIC8vCit9IEVGSV9JTUFHRV9ERUJVR19DT0RFVklFV19OQjEwX0VOVFJZOworCisvLy8KKy8vLyBEZWJ1ZyBEYXRhIFN0cnVjdHVyZSBkZWZpbmVkIGluIE1pY3Jvc29mdCBDKysKKy8vLworI2RlZmluZSBDT0RFVklFV19TSUdOQVRVUkVfUlNEUyAgU0lHTkFUVVJFXzMyKCdSJywgJ1MnLCAnRCcsICdTJykKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICBTaWduYXR1cmU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAiUlNEUyIKKyAgVUlOVDMyICBVbmtub3duOworICBVSU5UMzIgIFVua25vd24yOworICBVSU5UMzIgIFVua25vd24zOworICBVSU5UMzIgIFVua25vd240OworICBVSU5UMzIgIFVua25vd241OworICAvLworICAvLyBGaWxlbmFtZSBvZiAuUERCIGdvZXMgaGVyZQorICAvLworfSBFRklfSU1BR0VfREVCVUdfQ09ERVZJRVdfUlNEU19FTlRSWTsKKworLy8vCisvLy8gSGVhZGVyIGZvcm1hdCBmb3IgVEUgaW1hZ2VzLCBkZWZpbmVkIGluIFBJIFNwZWNpZmljYXRpb24sIDEuMAorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlOyAgICAgICAgICAgIC8vLzwgc2lnbmF0dXJlIGZvciBURSBmb3JtYXQgPSAiVloiCisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgTWFjaGluZTsgICAgICAgICAgICAgIC8vLzwgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSBoZWFkZXIKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlNlY3Rpb25zOyAgICAgLy8vPCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlIGhlYWRlcgorICBVSU5UOCAgICAgICAgICAgICAgICAgICAgIFN1YnN5c3RlbTsgICAgICAgICAgICAvLy88IGZyb20gb3JpZ2luYWwgb3B0aW9uYWwgaGVhZGVyCisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgU3RyaXBwZWRTaXplOyAgICAgICAgIC8vLzwgaG93IG1hbnkgYnl0ZXMgd2UgcmVtb3ZlZCBmcm9tIHRoZSBoZWFkZXIKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBBZGRyZXNzT2ZFbnRyeVBvaW50OyAgLy8vPCBvZmZzZXQgdG8gZW50cnkgcG9pbnQgLS0gZnJvbSBvcmlnaW5hbCBvcHRpb25hbCBoZWFkZXIKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBCYXNlT2ZDb2RlOyAgICAgICAgICAgLy8vPCBmcm9tIG9yaWdpbmFsIGltYWdlIC0tIHJlcXVpcmVkIGZvciBJVFAgZGVidWcKKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICBJbWFnZUJhc2U7ICAgICAgICAgICAgLy8vPCBmcm9tIG9yaWdpbmFsIGZpbGUgaGVhZGVyCisgIEVGSV9JTUFHRV9EQVRBX0RJUkVDVE9SWSAgRGF0YURpcmVjdG9yeVsyXTsgICAgIC8vLzwgb25seSBiYXNlIHJlbG9jYXRpb24gYW5kIGRlYnVnIGRpcmVjdG9yeQorfSBFRklfVEVfSU1BR0VfSEVBREVSOworCisKKyNkZWZpbmUgRUZJX1RFX0lNQUdFX0hFQURFUl9TSUdOQVRVUkUgIFNJR05BVFVSRV8xNignVicsICdaJykKKworLy8KKy8vIERhdGEgZGlyZWN0b3J5IGluZGV4ZXMgaW4gb3VyIFRFIGltYWdlIGhlYWRlcgorLy8KKyNkZWZpbmUgRUZJX1RFX0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9CQVNFUkVMT0MgIDAKKyNkZWZpbmUgRUZJX1RFX0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9ERUJVRyAgICAgIDEKKworCisvLy8KKy8vLyBVbmlvbiBvZiBQRTMyLCBQRTMyKywgYW5kIFRFIGhlYWRlcnMKKy8vLwordHlwZWRlZiB1bmlvbiB7CisgIEVGSV9JTUFHRV9OVF9IRUFERVJTMzIgICBQZTMyOworICBFRklfSU1BR0VfTlRfSEVBREVSUzY0ICAgUGUzMlBsdXM7CisgIEVGSV9URV9JTUFHRV9IRUFERVIgICAgICBUZTsKK30gRUZJX0lNQUdFX09QVElPTkFMX0hFQURFUl9VTklPTjsKKwordHlwZWRlZiB1bmlvbiB7CisgIEVGSV9JTUFHRV9OVF9IRUFERVJTMzIgICAgICAgICAgICAqUGUzMjsKKyAgRUZJX0lNQUdFX05UX0hFQURFUlM2NCAgICAgICAgICAgICpQZTMyUGx1czsKKyAgRUZJX1RFX0lNQUdFX0hFQURFUiAgICAgICAgICAgICAgICpUZTsKKyAgRUZJX0lNQUdFX09QVElPTkFMX0hFQURFUl9VTklPTiAgICpVbmlvbjsKK30gRUZJX0lNQUdFX09QVElPTkFMX0hFQURFUl9QVFJfVU5JT047CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9MSUNFTkNFIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9MSUNFTkNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTJiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL0xJQ0VOQ0UKQEAgLTAsMCArMSw0MCBAQAorVGhlIEVGSSBoZWFkZXJzIGNvbnRhaW5lZCBoZXJlaW4gYXJlIGNvcGllZCBmcm9tIHRoZSBFRkkgRGV2ZWxvcG1lbnQKK0tpdCwgYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy50aWFub2NvcmUub3JnIGFuZCBwdWJsaXNoZWQgdW5kZXIgdGhlCitmb2xsb3dpbmcgbGljZW5jZToKKworICBCU0QgTGljZW5zZSBmcm9tIEludGVsCisgIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisKKyAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCitUaGlzIGxpY2VuY2UgYXBwbGllcyBvbmx5IHRvIGZpbGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIEVGSQorRGV2ZWxvcG1lbnQgS2l0LiAgT3RoZXIgZmlsZXMgbWF5IGNvbnRhaW4gdGhlaXIgb3duIGxpY2VuY2UgdGVybXMsIG9yCittYXkgZmFsbCB1bmRlciB0aGUgc3RhbmRhcmQgZ1BYRSBHUEwgbGljZW5jZS4KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlCb290TW9kZS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9QaS9QaUJvb3RNb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViY2EyMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlCb290TW9kZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qKiBAZmlsZQorICBQcmVzZW50IHRoZSBib290IG1vZGUgdmFsdWVzIGluIFBJLgorCisgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisgIEBwYXIgUmV2aXNpb24gUmVmZXJlbmNlOgorICBQSSBWZXJzaW9uIDEuMAorCisqKi8KKworI2lmbmRlZiBfX1BJX0JPT1RfTU9ERV9IX18KKyNkZWZpbmUgX19QSV9CT09UX01PREVfSF9fCisKKyNpbmNsdWRlIDxncHhlL2VmaS9Qcm9jZXNzb3JCaW5kLmg+CisKKy8vLworLy8vIEVGSSBib290IG1vZGUKKy8vLwordHlwZWRlZiBVSU5UMzIgIEVGSV9CT09UX01PREU7CisKKy8vCisvLyAweDIxIC0gMHhmLi5mIGFyZSByZXNlcnZlZC4KKy8vCisjZGVmaW5lIEJPT1RfV0lUSF9GVUxMX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEJPT1RfV0lUSF9NSU5JTUFMX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEJPT1RfQVNTVU1JTkdfTk9fQ09ORklHVVJBVElPTl9DSEFOR0VTICAgICAgICAweDAyCisjZGVmaW5lIEJPT1RfV0lUSF9GVUxMX0NPTkZJR1VSQVRJT05fUExVU19ESUFHTk9TVElDUyAweDAzCisjZGVmaW5lIEJPT1RfV0lUSF9ERUZBVUxUX1NFVFRJTkdTICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEJPT1RfT05fUzRfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEJPT1RfT05fUzVfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIEJPT1RfT05fUzJfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJPT1RfT05fUzNfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIEJPT1RfT05fRkxBU0hfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIEJPT1RfSU5fUkVDT1ZFUllfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDIwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9QaS9QaURlcGVuZGVuY3kuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlEZXBlbmRlbmN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmNjAyNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlEZXBlbmRlbmN5LmgKQEAgLTAsMCArMSw0NyBAQAorLyoqIEBmaWxlCisgIFByZXNlbnQgdGhlIGRlcGVuZGVuY3kgZXhwcmVzc2lvbiB2YWx1ZXMgaW4gUEkuCisKKyAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyAgQHBhciBSZXZpc2lvbiBSZWZlcmVuY2U6CisgIFBJIFZlcnNpb24gMS4wCisKKyoqLworI2lmbmRlZiBfX1BJX0RFUEVOREVOQ1lfSF9fCisjZGVmaW5lIF9fUElfREVQRU5ERU5DWV9IX18KKworLy8vCisvLy8gSWYgcHJlc2VudCwgdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBhbmQgb25seSBvcGNvZGUsCisvLy8gRUZJX0RFUF9CRUZPUkUgaXMgb25seSB1c2VkIGJ5IERYRSBkcml2ZXIuCisvLy8KKyNkZWZpbmUgRUZJX0RFUF9CRUZPUkUgICAgICAgIDB4MDAKKworLy8vCisvLy8gSWYgcHJlc2VudCwgdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBhbmQgb25seSBvcGNvZGUsCisvLy8gRUZJX0RFUF9BRlRFUiBpcyBvbmx5IHVzZWQgYnkgRFhFIGRyaXZlci4KKy8vLworI2RlZmluZSBFRklfREVQX0FGVEVSICAgICAgICAgMHgwMQorCisjZGVmaW5lIEVGSV9ERVBfUFVTSCAgICAgICAgICAweDAyCisjZGVmaW5lIEVGSV9ERVBfQU5EICAgICAgICAgICAweDAzCisjZGVmaW5lIEVGSV9ERVBfT1IgICAgICAgICAgICAweDA0CisjZGVmaW5lIEVGSV9ERVBfTk9UICAgICAgICAgICAweDA1CisjZGVmaW5lIEVGSV9ERVBfVFJVRSAgICAgICAgICAweDA2CisjZGVmaW5lIEVGSV9ERVBfRkFMU0UgICAgICAgICAweDA3CisjZGVmaW5lIEVGSV9ERVBfRU5EICAgICAgICAgICAweDA4CisKKworLy8vCisvLy8gSWYgcHJlc2VudCwgdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBvcGNvZGUsCisvLy8gRUZJX0RFUF9TT1IgaXMgb25seSB1c2VkIGJ5IERYRSBkcml2ZXIuCisvLy8KKyNkZWZpbmUgRUZJX0RFUF9TT1IgICAgICAgICAgIDB4MDkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1BpL1BpRHhlQ2lzLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1BpL1BpRHhlQ2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyNDg4OAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlEeGVDaXMuaApAQCAtMCwwICsxLDY0MiBAQAorLyoqIEBmaWxlCisgIEluY2x1ZGUgZmlsZSBtYXRjaGVzIHRoaW5ncyBpbiBQSS4KKworICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CisgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworICBAcGFyIFJldmlzaW9uIFJlZmVyZW5jZToKKyAgUEkgVmVyc2lvbiAxLjAKKworKiovCisKKyNpZm5kZWYgX19QSV9EWEVDSVNfSF9fCisjZGVmaW5lIF9fUElfRFhFQ0lTX0hfXworCisjaW5jbHVkZSA8Z3B4ZS9lZmkvUGkvUGlNdWx0aVBoYXNlLmg+CisKKy8vLworLy8vIEdsb2JhbCBDb2hlcmVuY2V5IERvbWFpbiB0eXBlcyAtIE1lbW9yeSB0eXBlCisvLy8KK3R5cGVkZWYgZW51bSB7CisgIEVmaUdjZE1lbW9yeVR5cGVOb25FeGlzdGVudCwKKyAgRWZpR2NkTWVtb3J5VHlwZVJlc2VydmVkLAorICBFZmlHY2RNZW1vcnlUeXBlU3lzdGVtTWVtb3J5LAorICBFZmlHY2RNZW1vcnlUeXBlTWVtb3J5TWFwcGVkSW8sCisgIEVmaUdjZE1lbW9yeVR5cGVNYXhpbXVtCit9IEVGSV9HQ0RfTUVNT1JZX1RZUEU7CisKKy8vLworLy8vIEdsb2JhbCBDb2hlcmVuY2V5IERvbWFpbiB0eXBlcyAtIElPIHR5cGUKKy8vLwordHlwZWRlZiBlbnVtIHsKKyAgRWZpR2NkSW9UeXBlTm9uRXhpc3RlbnQsCisgIEVmaUdjZElvVHlwZVJlc2VydmVkLAorICBFZmlHY2RJb1R5cGVJbywKKyAgRWZpR2NkSW9UeXBlTWF4aW11bQorfSBFRklfR0NEX0lPX1RZUEU7CisKKy8vLworLy8vIFRoZSB0eXBlIG9mIGFsbG9jYXRpb24gdG8gcGVyZm9ybS4KKy8vLwordHlwZWRlZiBlbnVtIHsKKyAgRWZpR2NkQWxsb2NhdGVBbnlTZWFyY2hCb3R0b21VcCwKKyAgRWZpR2NkQWxsb2NhdGVNYXhBZGRyZXNzU2VhcmNoQm90dG9tVXAsCisgIEVmaUdjZEFsbG9jYXRlQWRkcmVzcywKKyAgRWZpR2NkQWxsb2NhdGVBbnlTZWFyY2hUb3BEb3duLAorICBFZmlHY2RBbGxvY2F0ZU1heEFkZHJlc3NTZWFyY2hUb3BEb3duLAorICBFZmlHY2RNYXhBbGxvY2F0ZVR5cGUKK30gRUZJX0dDRF9BTExPQ0FURV9UWVBFOworCisvLy8KKy8vLyBFRklfR0NEX01FTU9SWV9TUEFDRV9ERVNDUklQVE9SCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8vCisgIC8vLyBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgbWVtb3J5IHJlZ2lvbi4gVHlwZQorICAvLy8gRUZJX1BIWVNJQ0FMX0FERFJFU1MgaXMgZGVmaW5lZCBpbiB0aGUgQWxsb2NhdGVQYWdlcygpIGZ1bmN0aW9uCisgIC8vLyBkZXNjcmlwdGlvbiBpbiB0aGUgVUVGSSAyLjAgc3BlY2lmaWNhdGlvbgorICAvLy8KKyAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgIEJhc2VBZGRyZXNzOworCisgIC8vLworICAvLy8gVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgbWVtb3J5IHJlZ2lvbi4KKyAgLy8vCisgIFVJTlQ2NCAgICAgICAgICAgICAgICBMZW5ndGg7CisKKyAgLy8vCisgIC8vLyBUaGUgYml0IG1hc2sgb2YgYXR0cmlidXRlcyB0aGF0IHRoZSBtZW1vcnkgcmVnaW9uIGlzIGNhcGFibGUgb2Ygc3VwcG9ydGluZy4gVGhlIGJpdAorICAvLy8gbWFzayBvZiBhdmFpbGFibGUgYXR0cmlidXRlcyBpcyBkZWZpbmVkIGluIHRoZSBHZXRNZW1vcnlNYXAoKSBmdW5jdGlvbiBkZXNjcmlwdGlvbgorICAvLy8gaW4gdGhlIFVFRkkgMi4wIHNwZWNpZmljYXRpb24uCisgIC8vLworICBVSU5UNjQgICAgICAgICAgICAgICAgQ2FwYWJpbGl0aWVzOworICAvLy8KKyAgLy8vIFRoZSBiaXQgbWFzayBvZiBhdHRyaWJ1dGVzIHRoYXQgdGhlIG1lbW9yeSByZWdpb24gaXMgY3VycmVudGx5IHVzaW5nLiBUaGUgYml0IG1hc2sgb2YKKyAgLy8vIGF2YWlsYWJsZSBhdHRyaWJ1dGVzIGlzIGRlZmluZWQgaW4gR2V0TWVtb3J5TWFwKCkuCisgIC8vLworICBVSU5UNjQgICAgICAgICAgICAgICAgQXR0cmlidXRlczsKKyAgLy8vCisgIC8vLyBUeXBlIG9mIHRoZSBtZW1vcnkgcmVnaW9uLiBUeXBlIEVGSV9HQ0RfTUVNT1JZX1RZUEUgaXMgZGVmaW5lZCBpbiB0aGUKKyAgLy8vIEFkZE1lbW9yeVNwYWNlKCkgZnVuY3Rpb24gZGVzY3JpcHRpb24KKyAgLy8vCisgIEVGSV9HQ0RfTUVNT1JZX1RZUEUgICBHY2RNZW1vcnlUeXBlOworCisgIC8vLworICAvLy8gVGhlIGltYWdlIGhhbmRsZSBvZiB0aGUgYWdlbnQgdGhhdCBhbGxvY2F0ZWQgdGhlIG1lbW9yeSByZXNvdXJjZSBkZXNjcmliZWQgYnkKKyAgLy8vIFBoeXNpY2FsU3RhcnQgYW5kIE51bWJlck9mQnl0ZXMuIElmIHRoaXMgZmllbGQgaXMgTlVMTCwgdGhlbiB0aGUgbWVtb3J5CisgIC8vLyByZXNvdXJjZSBpcyBub3QgY3VycmVudGx5IGFsbG9jYXRlZC4gVHlwZSBFRklfSEFORExFIGlzIGRlZmluZWQgaW4KKyAgLy8vIEluc3RhbGxQcm90b2NvbEludGVyZmFjZSgpIGluIHRoZSBVRUZJIDIuMCBzcGVjaWZpY2F0aW9uLgorICAvLy8KKyAgRUZJX0hBTkRMRSAgICAgICAgICAgIEltYWdlSGFuZGxlOworCisgIC8vLworICAvLy8gVGhlIGRldmljZSBoYW5kbGUgZm9yIHdoaWNoIHRoZSBtZW1vcnkgcmVzb3VyY2UgaGFzIGJlZW4gYWxsb2NhdGVkLiBJZgorICAvLy8gSW1hZ2VIYW5kbGUgaXMgTlVMTCwgdGhlbiB0aGUgbWVtb3J5IHJlc291cmNlIGlzIG5vdCBjdXJyZW50bHkgYWxsb2NhdGVkLiBJZiB0aGlzCisgIC8vLyBmaWVsZCBpcyBOVUxMLCB0aGVuIHRoZSBtZW1vcnkgcmVzb3VyY2UgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIGRldmljZSB0aGF0IGlzCisgIC8vLyBkZXNjcmliZWQgYnkgYSBkZXZpY2UgaGFuZGxlLiBUeXBlIEVGSV9IQU5ETEUgaXMgZGVmaW5lZCBpbgorICAvLy8gSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlKCkgaW4gdGhlIFVFRkkgMi4wIHNwZWNpZmljYXRpb24uCisgIC8vLworICBFRklfSEFORExFICAgICAgICAgICAgRGV2aWNlSGFuZGxlOworfSBFRklfR0NEX01FTU9SWV9TUEFDRV9ERVNDUklQVE9SOworCisvLy8KKy8vLyBFRklfR0NEX0lPX1NQQUNFX0RFU0NSSVBUT1IKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICAvLy8KKyAgLy8vIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIEkvTyByZWdpb24uIFR5cGUKKyAgLy8vIEVGSV9QSFlTSUNBTF9BRERSRVNTIGlzIGRlZmluZWQgaW4gdGhlIEFsbG9jYXRlUGFnZXMoKSBmdW5jdGlvbgorICAvLy8gZGVzY3JpcHRpb24gaW4gdGhlIFVFRkkgMi4wIHNwZWNpZmljYXRpb24uCisgIC8vLworICBFRklfUEhZU0lDQUxfQUREUkVTUyAgQmFzZUFkZHJlc3M7CisKKyAgLy8vCisgIC8vLyBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIEkvTyByZWdpb24uCisgIC8vLworICBVSU5UNjQgICAgICAgICAgICAgICAgTGVuZ3RoOworCisgIC8vLworICAvLy8gVHlwZSBvZiB0aGUgSS9PIHJlZ2lvbi4gVHlwZSBFRklfR0NEX0lPX1RZUEUgaXMgZGVmaW5lZCBpbiB0aGUKKyAgLy8vIEFkZElvU3BhY2UoKSBmdW5jdGlvbiBkZXNjcmlwdGlvbi4KKyAgLy8vCisgIEVGSV9HQ0RfSU9fVFlQRSAgICAgICBHY2RJb1R5cGU7CisKKyAgLy8vCisgIC8vLyBUaGUgaW1hZ2UgaGFuZGxlIG9mIHRoZSBhZ2VudCB0aGF0IGFsbG9jYXRlZCB0aGUgSS9PIHJlc291cmNlIGRlc2NyaWJlZCBieQorICAvLy8gUGh5c2ljYWxTdGFydCBhbmQgTnVtYmVyT2ZCeXRlcy4gSWYgdGhpcyBmaWVsZCBpcyBOVUxMLCB0aGVuIHRoZSBJL08KKyAgLy8vIHJlc291cmNlIGlzIG5vdCBjdXJyZW50bHkgYWxsb2NhdGVkLiBUeXBlIEVGSV9IQU5ETEUgaXMgZGVmaW5lZCBpbgorICAvLy8gSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlKCkgaW4gdGhlIFVFRkkgMi4wIHNwZWNpZmljYXRpb24uCisgIC8vLworICBFRklfSEFORExFICAgICAgICAgICAgSW1hZ2VIYW5kbGU7CisKKyAgLy8vCisgIC8vLyBUaGUgZGV2aWNlIGhhbmRsZSBmb3Igd2hpY2ggdGhlIEkvTyByZXNvdXJjZSBoYXMgYmVlbiBhbGxvY2F0ZWQuIElmIEltYWdlSGFuZGxlCisgIC8vLyBpcyBOVUxMLCB0aGVuIHRoZSBJL08gcmVzb3VyY2UgaXMgbm90IGN1cnJlbnRseSBhbGxvY2F0ZWQuIElmIHRoaXMgZmllbGQgaXMgTlVMTCwgdGhlbgorICAvLy8gdGhlIEkvTyByZXNvdXJjZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgZGV2aWNlIHRoYXQgaXMgZGVzY3JpYmVkIGJ5IGEgZGV2aWNlIGhhbmRsZS4KKyAgLy8vIFR5cGUgRUZJX0hBTkRMRSBpcyBkZWZpbmVkIGluIEluc3RhbGxQcm90b2NvbEludGVyZmFjZSgpIGluIHRoZSBVRUZJCisgIC8vLyAyLjAgc3BlY2lmaWNhdGlvbi4KKyAgLy8vCisgIEVGSV9IQU5ETEUgICAgICAgICAgICBEZXZpY2VIYW5kbGU7Cit9IEVGSV9HQ0RfSU9fU1BBQ0VfREVTQ1JJUFRPUjsKKworCisvKioKKyAgQWRkcyByZXNlcnZlZCBtZW1vcnksIHN5c3RlbSBtZW1vcnksIG9yIG1lbW9yeS1tYXBwZWQgSS9PIHJlc291cmNlcyB0byB0aGUKKyAgZ2xvYmFsIGNvaGVyZW5jeSBkb21haW4gb2YgdGhlIHByb2Nlc3Nvci4KKworICBAcGFyYW0gIEdjZE1lbW9yeVR5cGUgICAgVGhlIHR5cGUgb2YgbWVtb3J5IHJlc291cmNlIGJlaW5nIGFkZGVkLgorICBAcGFyYW0gIEJhc2VBZGRyZXNzICAgICAgVGhlIHBoeXNpY2FsIGFkZHJlc3MgdGhhdCBpcyB0aGUgc3RhcnQgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG1lbW9yeSByZXNvdXJjZSBiZWluZyBhZGRlZC4KKyAgQHBhcmFtICBMZW5ndGggICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIG1lbW9yeSByZXNvdXJjZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBhZGRlZC4KKyAgQHBhcmFtICBDYXBhYmlsaXRpZXMgICAgIFRoZSBiaXQgbWFzayBvZiBhdHRyaWJ1dGVzIHRoYXQgdGhlIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgcmVnaW9uIHN1cHBvcnRzLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgICBUaGUgbWVtb3J5IHJlc291cmNlIHdhcyBhZGRlZCB0byB0aGUgZ2xvYmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZSBwcm9jZXNzb3IuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSICBHY2RNZW1vcnlUeXBlIGlzIGludmFsaWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSICBMZW5ndGggaXMgemVyby4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHN5c3RlbSByZXNvdXJjZXMgdG8gYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVtb3J5IHJlc291cmNlIHRvIHRoZSBnbG9iYWwgY29oZXJlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4gb2YgdGhlIHByb2Nlc3Nvci4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgIFRoZSBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBvbmUgb3IgbW9yZSBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG1lbW9yeSByZXNvdXJjZSByYW5nZSBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzIGFuZCBMZW5ndGguCisgIEByZXR2YWwgRUZJX0FDQ0VTU19ERU5JRUQgICAgICBPbmUgb3IgbW9yZSBieXRlcyBvZiB0aGUgbWVtb3J5IHJlc291cmNlIHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgQmFzZUFkZHJlc3MgYW5kIExlbmd0aCBjb25mbGljdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBtZW1vcnkgcmVzb3VyY2UgcmFuZ2UgdGhhdCB3YXMgcHJldmlvdXNseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZSBwcm9jZXNzb3IuCisgIEByZXR2YWwgRUZJX0FDQ0VTU19ERU5JRUQgICAgICBPbmUgb3IgbW9yZSBieXRlcyBvZiB0aGUgbWVtb3J5IHJlc291cmNlIHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgQmFzZUFkZHJlc3MgYW5kIExlbmd0aCB3YXMgYWxsb2NhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHByaW9yIGNhbGwgdG8gQWxsb2NhdGVNZW1vcnlTcGFjZSgpLi4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQUREX01FTU9SWV9TUEFDRSkoCisgIElOIEVGSV9HQ0RfTUVNT1JZX1RZUEUgICBHY2RNZW1vcnlUeXBlLAorICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgQmFzZUFkZHJlc3MsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICBMZW5ndGgsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICBDYXBhYmlsaXRpZXMKKyAgKTsKKworLyoqCisgIEFsbG9jYXRlcyBub25leGlzdGVudCBtZW1vcnksIHJlc2VydmVkIG1lbW9yeSwgc3lzdGVtIG1lbW9yeSwgb3IgbWVtb3J5bWFwcGVkCisgIEkvTyByZXNvdXJjZXMgZnJvbSB0aGUgZ2xvYmFsIGNvaGVyZW5jeSBkb21haW4gb2YgdGhlIHByb2Nlc3Nvci4KKworICBAcGFyYW0gIEdjZEFsbG9jYXRlVHlwZSAgVGhlIHR5cGUgb2YgYWxsb2NhdGlvbiB0byBwZXJmb3JtLgorICBAcGFyYW0gIEdjZE1lbW9yeVR5cGUgICAgVGhlIHR5cGUgb2YgbWVtb3J5IHJlc291cmNlIGJlaW5nIGFsbG9jYXRlZC4KKyAgQHBhcmFtICBBbGlnbm1lbnQgICAgICAgIFRoZSBsb2cgYmFzZSAyIG9mIHRoZSBib3VuZGFyeSB0aGF0IEJhc2VBZGRyZXNzIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFsaWduZWQgb24gb3V0cHV0LiBBbGlnbiB3aXRoIDJeQWxpZ25tZW50LgorICBAcGFyYW0gIExlbmd0aCAgICAgICAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG1lbW9yeSByZXNvdXJjZSByYW5nZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBhbGxvY2F0ZWQuCisgIEBwYXJhbSAgQmFzZUFkZHJlc3MgICAgICBBIHBvaW50ZXIgdG8gYSBwaHlzaWNhbCBhZGRyZXNzIHRvIGFsbG9jYXRlLgorICBAcGFyYW0gIEltYWdlaGFuZGxlICAgICAgVGhlIGltYWdlIGhhbmRsZSBvZiB0aGUgYWdlbnQgdGhhdCBpcyBhbGxvY2F0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVtb3J5IHJlc291cmNlLgorICBAcGFyYW0gIERldmljZUhhbmRsZSAgICAgVGhlIGRldmljZSBoYW5kbGUgZm9yIHdoaWNoIHRoZSBtZW1vcnkgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGJlaW5nIGFsbG9jYXRlZC4KKworICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBHY2RBbGxvY2F0ZVR5cGUgaXMgaW52YWxpZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgR2NkTWVtb3J5VHlwZSBpcyBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBMZW5ndGggaXMgemVyby4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQmFzZUFkZHJlc3MgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgSW1hZ2VIYW5kbGUgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgVGhlIG1lbW9yeSByZXNvdXJjZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBzYXRpc2ZpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIGRlc2lyZWQgc3BhY2UuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHN5c3RlbSByZXNvdXJjZXMgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSBmcm9tIHRoZSBnbG9iYWwgY29oZXJlbmN5IGRvbWFpbiBvZiB0aGUgcHJvY2Vzc29yLgorICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbWVtb3J5IHJlc291cmNlIHdhcyBhbGxvY2F0ZWQgZnJvbSB0aGUgZ2xvYmFsIGNvaGVyZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4gb2YgdGhlIHByb2Nlc3Nvci4KKworCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9BTExPQ0FURV9NRU1PUllfU1BBQ0UpKAorICBJTiAgICAgRUZJX0dDRF9BTExPQ0FURV9UWVBFICAgICAgICAgICAgICAgR2NkQWxsb2NhdGVUeXBlLAorICBJTiAgICAgRUZJX0dDRF9NRU1PUllfVFlQRSAgICAgICAgICAgICAgICAgR2NkTWVtb3J5VHlwZSwKKyAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCwKKyAgSU4gICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCwKKyAgSU4gT1VUIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgICAgICpCYXNlQWRkcmVzcywKKyAgSU4gICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLAorICBJTiAgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSGFuZGxlIE9QVElPTkFMCisgICk7CisKKy8qKgorICBGcmVlcyBub25leGlzdGVudCBtZW1vcnksIHJlc2VydmVkIG1lbW9yeSwgc3lzdGVtIG1lbW9yeSwgb3IgbWVtb3J5LW1hcHBlZAorICBJL08gcmVzb3VyY2VzIGZyb20gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZSBwcm9jZXNzb3IuCisKKyAgQHBhcmFtICBCYXNlQWRkcmVzcyAgICAgIFRoZSBwaHlzaWNhbCBhZGRyZXNzIHRoYXQgaXMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSByZXNvdXJjZSBiZWluZyBmcmVlZC4KKyAgQHBhcmFtICBMZW5ndGggICAgICAgICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgcmVzb3VyY2UgcmFuZ2UgdGhhdCBpcyBiZWluZyBmcmVlZC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbWVtb3J5IHJlc291cmNlIHdhcyBmcmVlZCBmcm9tIHRoZSBnbG9iYWwgY29oZXJlbmN5IGRvbWFpbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvY2Vzc29yLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBMZW5ndGggaXMgemVyby4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5IEJhc2VBZGRyZXNzIGFuZCBMZW5ndGguCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIFRoZSBtZW1vcnkgcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5IEJhc2VBZGRyZXNzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGggd2FzIG5vdCBhbGxvY2F0ZWQgd2l0aCBwcmV2aW91cyBjYWxscyB0byBBbGxvY2F0ZU1lbW9yeVNwYWNlKCkuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHN5c3RlbSByZXNvdXJjZXMgdG8gZnJlZSB0aGUgbWVtb3J5IHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZSBwcm9jZXNzb3IuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0ZSRUVfTUVNT1JZX1NQQUNFKSgKKyAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgIEJhc2VBZGRyZXNzLAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgTGVuZ3RoCisgICk7CisKKy8qKgorICBSZW1vdmVzIHJlc2VydmVkIG1lbW9yeSwgc3lzdGVtIG1lbW9yeSwgb3IgbWVtb3J5LW1hcHBlZCBJL08gcmVzb3VyY2VzIGZyb20KKyAgdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZSBwcm9jZXNzb3IuCisKKyAgQHBhcmFtICBCYXNlQWRkcmVzcyAgICAgIFRoZSBwaHlzaWNhbCBhZGRyZXNzIHRoYXQgaXMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSByZXNvdXJjZSBiZWluZyByZW1vdmVkLgorICBAcGFyYW0gIExlbmd0aCAgICAgICAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG1lbW9yeSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHJlbW92ZWQuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG1lbW9yeSByZXNvdXJjZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBnbG9iYWwgY29oZXJlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiBvZiB0aGUgcHJvY2Vzc29yLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBMZW5ndGggaXMgemVyby4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5IEJhc2VBZGRyZXNzIGFuZCBMZW5ndGguCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIE9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBtZW1vcnkgcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzIGFuZCBMZW5ndGggd2FzIG5vdCBhZGRlZCB3aXRoIHByZXZpb3VzIGNhbGxzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZE1lbW9yeVNwYWNlKCkuCisgIEByZXR2YWwgRUZJX0FDQ0VTU19ERUZJTkVEICAgIE9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBtZW1vcnkgcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzIGFuZCBMZW5ndGggaGFzIGJlZW4gYWxsb2NhdGVkIHdpdGggQWxsb2NhdGVNZW1vcnlTcGFjZSgpLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGVyZSBhcmUgbm90IGVub3VnaCBzeXN0ZW0gcmVzb3VyY2VzIHRvIHJlbW92ZSB0aGUgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGZyb20gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZSBwcm9jZXNzb3IuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1JFTU9WRV9NRU1PUllfU1BBQ0UpKAorICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgQmFzZUFkZHJlc3MsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICBMZW5ndGgKKyAgKTsKKworLyoqCisgIFJldHJpZXZlcyB0aGUgZGVzY3JpcHRvciBmb3IgYSBtZW1vcnkgcmVnaW9uIGNvbnRhaW5pbmcgYSBzcGVjaWZpZWQgYWRkcmVzcy4KKworICBAcGFyYW0gIEJhc2VBZGRyZXNzICAgICAgVGhlIHBoeXNpY2FsIGFkZHJlc3MgdGhhdCBpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiBhIG1lbW9yeSByZWdpb24uCisgIEBwYXJhbSAgRGVzY3JpcHRvciAgICAgICBBIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIGRlc2NyaXB0b3IuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgcmVzb3VyY2UgcmVnaW9uIGNvbnRhaW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUFkZHJlc3Mgd2FzIHJldHVybmVkIGluIERlc2NyaXB0b3IuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIERlc2NyaXB0b3IgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgQSBtZW1vcnkgcmVzb3VyY2UgcmFuZ2UgY29udGFpbmluZyBCYXNlQWRkcmVzcyB3YXMgbm90IGZvdW5kLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfTUVNT1JZX1NQQUNFX0RFU0NSSVBUT1IpKAorICBJTiAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICAgQmFzZUFkZHJlc3MsCisgIE9VVCBFRklfR0NEX01FTU9SWV9TUEFDRV9ERVNDUklQVE9SICAqRGVzY3JpcHRvcgorICApOworCisvKioKKyAgTW9kaWZpZXMgdGhlIGF0dHJpYnV0ZXMgZm9yIGEgbWVtb3J5IHJlZ2lvbiBpbiB0aGUgZ2xvYmFsIGNvaGVyZW5jeSBkb21haW4gb2YgdGhlCisgIHByb2Nlc3Nvci4KKworICBAcGFyYW0gIEJhc2VBZGRyZXNzICAgICAgVGhlIHBoeXNpY2FsIGFkZHJlc3MgdGhhdCBpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiBhIG1lbW9yeSByZWdpb24uCisgIEBwYXJhbSAgTGVuZ3RoICAgICAgICAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbWVtb3J5IHJlZ2lvbi4KKyAgQHBhcmFtICBBdHRyaWJ1dGVzICAgICAgIFRoZSBiaXQgbWFzayBvZiBhdHRyaWJ1dGVzIHRvIHNldCBmb3IgdGhlIG1lbW9yeSByZWdpb24uCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgd2VyZSBzZXQgZm9yIHRoZSBtZW1vcnkgcmVnaW9uLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBMZW5ndGggaXMgemVyby4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5IEJhc2VBZGRyZXNzIGFuZCBMZW5ndGguCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoZSBiaXQgbWFzayBvZiBhdHRyaWJ1dGVzIGlzIG5vdCBzdXBwb3J0IGZvciB0aGUgbWVtb3J5IHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIHNwZWNpZmllZCBieSBCYXNlQWRkcmVzcyBhbmQgTGVuZ3RoLgorICBAcmV0dmFsIEVGSV9BQ0NFU1NfREVGSU5FRCAgICBUaGUgYXR0cmlidXRlcyBmb3IgdGhlIG1lbW9yeSByZXNvdXJjZSByYW5nZSBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUFkZHJlc3MgYW5kIExlbmd0aCBjYW5ub3QgYmUgbW9kaWZpZWQuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHN5c3RlbSByZXNvdXJjZXMgdG8gbW9kaWZ5IHRoZSBhdHRyaWJ1dGVzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZW1vcnkgcmVzb3VyY2UgcmFuZ2UuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9NRU1PUllfU1BBQ0VfQVRUUklCVVRFUykoCisgIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgQmFzZUFkZHJlc3MsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoLAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMKKyAgKTsKKworLyoqCisgIFJldHVybnMgYSBtYXAgb2YgdGhlIG1lbW9yeSByZXNvdXJjZXMgaW4gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZQorICBwcm9jZXNzb3IuCisKKyAgQHBhcmFtICBOdW1iZXJPZkRlc2NyaXB0b3JzIEEgcG9pbnRlciB0byBudW1iZXIgb2YgZGVzY3JpcHRvcnMgcmV0dXJuZWQgaW4gdGhlIE1lbW9yeVNwYWNlTWFwIGJ1ZmZlci4KKyAgQHBhcmFtICBNZW1vcnlTcGFjZU1hcCAgICAgIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgRUZJX0dDRF9NRU1PUllfU1BBQ0VfREVTQ1JJUFRPUnMuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG1lbW9yeSBzcGFjZSBtYXAgd2FzIHJldHVybmVkIGluIHRoZSBNZW1vcnlTcGFjZU1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGFuZCB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIE1lbW9yeVNwYWNlTWFwIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBpbiBOdW1iZXJPZkRlc2NyaXB0b3JzLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBOdW1iZXJPZkRlc2NyaXB0b3JzIGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE1lbW9yeVNwYWNlTWFwIGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyB0byBhbGxvY2F0ZSBNZW1vcnlTcGFjZU1hcC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX01FTU9SWV9TUEFDRV9NQVApKAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKk51bWJlck9mRGVzY3JpcHRvcnMsCisgIE9VVCBFRklfR0NEX01FTU9SWV9TUEFDRV9ERVNDUklQVE9SICAqKk1lbW9yeVNwYWNlTWFwCisgICk7CisKKy8qKgorICBBZGRzIHJlc2VydmVkIEkvTyBvciBJL08gcmVzb3VyY2VzIHRvIHRoZSBnbG9iYWwgY29oZXJlbmN5IGRvbWFpbiBvZiB0aGUgcHJvY2Vzc29yLgorCisgIEBwYXJhbSAgR2NkSW9UeXBlICAgICAgICBUaGUgdHlwZSBvZiBJL08gcmVzb3VyY2UgYmVpbmcgYWRkZWQuCisgIEBwYXJhbSAgQmFzZUFkZHJlc3MgICAgICBUaGUgcGh5c2ljYWwgYWRkcmVzcyB0aGF0IGlzIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBJL08gcmVzb3VyY2UgYmVpbmcgYWRkZWQuCisgIEBwYXJhbSAgTGVuZ3RoICAgICAgICAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgSS9PIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgYWRkZWQuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIEkvTyByZXNvdXJjZSB3YXMgYWRkZWQgdG8gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9jZXNzb3IuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEdjZElvVHlwZSBpcyBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBMZW5ndGggaXMgemVyby4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgYXJlIG5vdCBlbm91Z2ggc3lzdGVtIHJlc291cmNlcyB0byBhZGQgdGhlIEkvTyByZXNvdXJjZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2xvYmFsIGNvaGVyZW5jeSBkb21haW4gb2YgdGhlIHByb2Nlc3Nvci4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBJL08KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5IEJhc2VBZGRyZXNzIGFuZCBMZW5ndGguCisgIEByZXR2YWwgRUZJX0FDQ0VTU19ERU5JRUQgICAgIE9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBJL08gcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzIGFuZCBMZW5ndGggY29uZmxpY3RzIHdpdGggYW4gSS9PIHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIHRoYXQgd2FzIHByZXZpb3VzbHkgYWRkZWQgdG8gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwcm9jZXNzb3IuCisgIEByZXR2YWwgRUZJX0FDQ0VTU19ERU5JRUQgICAgIE9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBJL08gcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzIGFuZCBMZW5ndGggd2FzIGFsbG9jYXRlZCBpbiBhIHByaW9yIGNhbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGVJb1NwYWNlKCkuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0FERF9JT19TUEFDRSkoCisgIElOIEVGSV9HQ0RfSU9fVFlQRSAgICAgICBHY2RJb1R5cGUsCisgIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICBCYXNlQWRkcmVzcywKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgIExlbmd0aAorICApOworCisvKioKKyAgQWxsb2NhdGVzIG5vbmV4aXN0ZW50IEkvTywgcmVzZXJ2ZWQgSS9PLCBvciBJL08gcmVzb3VyY2VzIGZyb20gdGhlIGdsb2JhbCBjb2hlcmVuY3kKKyAgZG9tYWluIG9mIHRoZSBwcm9jZXNzb3IuCisKKyAgQHBhcmFtICBHY2RBbGxvY2F0ZVR5cGUgIFRoZSB0eXBlIG9mIGFsbG9jYXRpb24gdG8gcGVyZm9ybS4KKyAgQHBhcmFtICBHY2RJb1R5cGUgICAgICAgIFRoZSB0eXBlIG9mIEkvTyByZXNvdXJjZSBiZWluZyBhbGxvY2F0ZWQuCisgIEBwYXJhbSAgQWxpZ25tZW50ICAgICAgICBUaGUgbG9nIGJhc2UgMiBvZiB0aGUgYm91bmRhcnkgdGhhdCBCYXNlQWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgb24gb3V0cHV0LgorICBAcGFyYW0gIExlbmd0aCAgICAgICAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIEkvTyByZXNvdXJjZSByYW5nZSB0aGF0IGlzIGJlaW5nIGFsbG9jYXRlZC4KKyAgQHBhcmFtICBCYXNlQWRkcmVzcyAgICAgIEEgcG9pbnRlciB0byBhIHBoeXNpY2FsIGFkZHJlc3MuCisgIEBwYXJhbSAgSW1hZ2VoYW5kbGUgICAgICBUaGUgaW1hZ2UgaGFuZGxlIG9mIHRoZSBhZ2VudCB0aGF0IGlzIGFsbG9jYXRpbmcgdGhlIEkvTyByZXNvdXJjZS4KKyAgQHBhcmFtICBEZXZpY2VIYW5kbGUgICAgIFRoZSBkZXZpY2UgaGFuZGxlIGZvciB3aGljaCB0aGUgSS9PIHJlc291cmNlIGlzIGJlaW5nIGFsbG9jYXRlZC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgSS9PIHJlc291cmNlIHdhcyBhbGxvY2F0ZWQgZnJvbSB0aGUgZ2xvYmFsIGNvaGVyZW5jeSBkb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByb2Nlc3Nvci4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgR2NkQWxsb2NhdGVUeXBlIGlzIGludmFsaWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEdjZElvVHlwZSBpcyBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBMZW5ndGggaXMgemVyby4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQmFzZUFkZHJlc3MgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgSW1hZ2VIYW5kbGUgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgYXJlIG5vdCBlbm91Z2ggc3lzdGVtIHJlc291cmNlcyB0byBhbGxvY2F0ZSB0aGUgSS9PCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGZyb20gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZSBwcm9jZXNzb3IuCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIFRoZSBJL08gcmVzb3VyY2UgcmVxdWVzdCBjb3VsZCBub3QgYmUgc2F0aXNmaWVkLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9BTExPQ0FURV9JT19TUEFDRSkoCisgIElOICAgICBFRklfR0NEX0FMTE9DQVRFX1RZUEUgICAgICAgICAgICAgICBHY2RBbGxvY2F0ZVR5cGUsCisgIElOICAgICBFRklfR0NEX0lPX1RZUEUgICAgICAgICAgICAgICAgICAgICBHY2RJb1R5cGUsCisgIElOICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQsCisgIElOICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGgsCisgIElOIE9VVCBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgICAgICAqQmFzZUFkZHJlc3MsCisgIElOICAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgSU4gICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUhhbmRsZSBPUFRJT05BTAorICApOworCisvKioKKyAgRnJlZXMgbm9uZXhpc3RlbnQgSS9PLCByZXNlcnZlZCBJL08sIG9yIEkvTyByZXNvdXJjZXMgZnJvbSB0aGUgZ2xvYmFsIGNvaGVyZW5jeQorICBkb21haW4gb2YgdGhlIHByb2Nlc3Nvci4KKworICBAcGFyYW0gIEJhc2VBZGRyZXNzICAgICAgVGhlIHBoeXNpY2FsIGFkZHJlc3MgdGhhdCBpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgSS9PIHJlc291cmNlIGJlaW5nIGZyZWVkLgorICBAcGFyYW0gIExlbmd0aCAgICAgICAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIEkvTyByZXNvdXJjZSByYW5nZSB0aGF0IGlzIGJlaW5nIGZyZWVkLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBJL08gcmVzb3VyY2Ugd2FzIGZyZWVkIGZyb20gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIExlbmd0aCBpcyB6ZXJvLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgb25lIG9yIG1vcmUgYnl0ZXMgb2YgdGhlIEkvTyByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSBzcGVjaWZpZWQgYnkgQmFzZUFkZHJlc3MgYW5kIExlbmd0aC4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgVGhlIEkvTyByZXNvdXJjZSByYW5nZSBzcGVjaWZpZWQgYnkgQmFzZUFkZHJlc3MgYW5kIExlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgbm90IGFsbG9jYXRlZCB3aXRoIHByZXZpb3VzIGNhbGxzIHRvIEFsbG9jYXRlSW9TcGFjZSgpLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGVyZSBhcmUgbm90IGVub3VnaCBzeXN0ZW0gcmVzb3VyY2VzIHRvIGZyZWUgdGhlIEkvTyByZXNvdXJjZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnbG9iYWwgY29oZXJlbmN5IGRvbWFpbiBvZiB0aGUgcHJvY2Vzc29yLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GUkVFX0lPX1NQQUNFKSgKKyAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgIEJhc2VBZGRyZXNzLAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgTGVuZ3RoCisgICk7CisKKy8qKgorICBSZW1vdmVzIHJlc2VydmVkIEkvTyBvciBJL08gcmVzb3VyY2VzIGZyb20gdGhlIGdsb2JhbCBjb2hlcmVuY3kgZG9tYWluIG9mIHRoZQorICBwcm9jZXNzb3IuCisKKyAgQHBhcmFtICBCYXNlQWRkcmVzcyAgICAgIEEgcG9pbnRlciB0byBhIHBoeXNpY2FsIGFkZHJlc3MgdGhhdCBpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgSS9PIHJlc291cmNlIGJlaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkLgorICBAcGFyYW0gTGVuZ3RoICAgICAgICAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIEkvTyByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHJlbW92ZWQuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIEkvTyByZXNvdXJjZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBnbG9iYWwgY29oZXJlbmN5IGRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJvY2Vzc29yLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBMZW5ndGggaXMgemVyby4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBJL08KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5IEJhc2VBZGRyZXNzIGFuZCBMZW5ndGguCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIE9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBJL08gcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzIGFuZCBMZW5ndGggd2FzIG5vdCBhZGRlZCB3aXRoIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxzIHRvIEFkZElvU3BhY2UoKS4KKyAgQHJldHZhbCBFRklfQUNDRVNTX0RFTklFRCAgICAgT25lIG9yIG1vcmUgYnl0ZXMgb2YgdGhlIEkvTyByZXNvdXJjZSByYW5nZSBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUFkZHJlc3MgYW5kIExlbmd0aCBoYXMgYmVlbiBhbGxvY2F0ZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0ZUlvU3BhY2UoKS4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgYXJlIG5vdCBlbm91Z2ggc3lzdGVtIHJlc291cmNlcyB0byByZW1vdmUgdGhlIEkvTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSBmcm9tIHRoZSBnbG9iYWwgY29oZXJlbmN5IGRvbWFpbiBvZiB0aGUgcHJvY2Vzc29yLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRU1PVkVfSU9fU1BBQ0UpKAorICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgQmFzZUFkZHJlc3MsCisgIElOIFVJTlQ2NCAgICAgICAgICAgICAgICBMZW5ndGgKKyAgKTsKKworLyoqCisgIFJldHJpZXZlcyB0aGUgZGVzY3JpcHRvciBmb3IgYW4gSS9PIHJlZ2lvbiBjb250YWluaW5nIGEgc3BlY2lmaWVkIGFkZHJlc3MuCisKKyAgQHBhcmFtICBCYXNlQWRkcmVzcyAgICAgIFRoZSBwaHlzaWNhbCBhZGRyZXNzIHRoYXQgaXMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgYW4gSS9PIHJlZ2lvbi4KKyAgQHBhcmFtICBEZXNjcmlwdG9yICAgICAgIEEgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgZGVzY3JpcHRvci4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZGVzY3JpcHRvciBmb3IgdGhlIEkvTyByZXNvdXJjZSByZWdpb24gY29udGFpbmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQWRkcmVzcyB3YXMgcmV0dXJuZWQgaW4gRGVzY3JpcHRvci4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgRGVzY3JpcHRvciBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICBBbiBJL08gcmVzb3VyY2UgcmFuZ2UgY29udGFpbmluZyBCYXNlQWRkcmVzcyB3YXMgbm90IGZvdW5kLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfSU9fU1BBQ0VfREVTQ1JJUFRPUikoCisgIElOICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgIEJhc2VBZGRyZXNzLAorICBPVVQgRUZJX0dDRF9JT19TUEFDRV9ERVNDUklQVE9SICAqRGVzY3JpcHRvcgorICApOworCisvKioKKyAgUmV0dXJucyBhIG1hcCBvZiB0aGUgSS9PIHJlc291cmNlcyBpbiB0aGUgZ2xvYmFsIGNvaGVyZW5jeSBkb21haW4gb2YgdGhlIHByb2Nlc3Nvci4KKworICBAcGFyYW0gIE51bWJlck9mRGVzY3JpcHRvcnMgQSBwb2ludGVyIHRvIG51bWJlciBvZiBkZXNjcmlwdG9ycyByZXR1cm5lZCBpbiB0aGUgSW9TcGFjZU1hcCBidWZmZXIuCisgIEBwYXJhbSAgTWVtb3J5U3BhY2VNYXAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIEVGSV9HQ0RfSU9fU1BBQ0VfREVTQ1JJUFRPUnMuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIEkvTyBzcGFjZSBtYXAgd2FzIHJldHVybmVkIGluIHRoZSBJb1NwYWNlTWFwIGJ1ZmZlciwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gSW9TcGFjZU1hcCB3YXMgcmV0dXJuZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZEZXNjcmlwdG9ycy4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgTnVtYmVyT2ZEZXNjcmlwdG9ycyBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBJb1NwYWNlTWFwIGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyB0byBhbGxvY2F0ZSBJb1NwYWNlTWFwLgorCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0dFVF9JT19TUEFDRV9NQVApKAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAqTnVtYmVyT2ZEZXNjcmlwdG9ycywKKyAgT1VUIEVGSV9HQ0RfSU9fU1BBQ0VfREVTQ1JJUFRPUiAgKipJb1NwYWNlTWFwCisgICk7CisKKworCisvKioKKyAgTG9hZHMgYW5kIGV4ZWN1dGVkIERYRSBkcml2ZXJzIGZyb20gZmlybXdhcmUgdm9sdW1lcy4KKworICBUaGUgRGlzcGF0Y2goKSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgRFhFIGRyaXZlcnMgaW4gZmlybXdhcmUgdm9sdW1lcyB0aGF0IGhhdmUgYmVlbgorICBpbnN0YWxsZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgRGlzcGF0Y2goKSBzZXJ2aWNlIHdhcyBjYWxsZWQuIEl0IHRoZW4gZXZhbHVhdGVzCisgIHRoZSBkZXBlbmRlbmN5IGV4cHJlc3Npb25zIG9mIGFsbCB0aGUgRFhFIGRyaXZlcnMgYW5kIGxvYWRzIGFuZCBleGVjdXRlcyB0aG9zZSBEWEUKKyAgZHJpdmVycyB3aG9zZSBkZXBlbmRlbmN5IGV4cHJlc3Npb24gZXZhbHVhdGUgdG8gVFJVRS4gVGhpcyBzZXJ2aWNlIG11c3QgaW50ZXJhY3Qgd2l0aAorICB0aGUgU2VjdXJpdHkgQXJjaGl0ZWN0dXJhbCBQcm90b2NvbCB0byBhdXRoZW50aWNhdGUgRFhFIGRyaXZlcnMgYmVmb3JlIHRoZXkgYXJlIGV4ZWN1dGVkLgorICBUaGlzIHByb2Nlc3MgaXMgY29udGludWVkIHVudGlsIG5vIG1vcmUgRFhFIGRyaXZlcnMgY2FuIGJlIGV4ZWN1dGVkLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICBPbmUgb3IgbW9yZSBEWEUgZHJpdmVyIHdlcmUgZGlzcGF0Y2hlZC4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgIE5vIERYRSBkcml2ZXJzIHdlcmUgZGlzcGF0Y2hlZC4KKyAgQHJldHZhbCBFRklfQUxSRUFEWV9TVEFSVEVEIEFuIGF0dGVtcHQgaXMgYmVpbmcgbWFkZSB0byBzdGFydCB0aGUgRFhFIERpc3BhdGNoZXIgcmVjdXJzaXZlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHVzIG5vIGFjdGlvbiB3YXMgdGFrZW4uCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RJU1BBVENIKSgKKyAgVk9JRAorICApOworCisvKioKKyAgQ2xlYXJzIHRoZSBTY2hlZHVsZSBvbiBSZXF1ZXN0IChTT1IpIGZsYWcgZm9yIGEgY29tcG9uZW50IHRoYXQgaXMgc3RvcmVkIGluIGEgZmlybXdhcmUgdm9sdW1lLgorCisgIEBwYXJhbSAgRmlybXdhcmVWb2x1bWVIYW5kbGUgVGhlIGhhbmRsZSBvZiB0aGUgZmlybXdhcmUgdm9sdW1lIHRoYXQgY29udGFpbnMgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IEZpbGVOYW1lLgorICBAcGFyYW0gIEZpbGVOYW1lICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbiBhIGZpcm13YXJlIHZvbHVtZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgVGhlIERYRSBkcml2ZXIgd2FzIGZvdW5kIGFuZCBpdHMgU09SIGJpdCB3YXMgY2xlYXJlZC4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgIFRoZSBEWEUgZHJpdmVyIGRvZXMgbm90IGV4aXN0LCBvciB0aGUgRFhFIGRyaXZlciBleGlzdHMgYW5kIGl0cyBTT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBpcyBub3Qgc2V0LgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TQ0hFRFVMRSkoCisgIElOIEVGSV9IQU5ETEUgIEZpcm13YXJlVm9sdW1lSGFuZGxlLAorICBJTiBDT05TVCBFRklfR1VJRCAgICAqRmlsZU5hbWUKKyAgKTsKKworLyoqCisgIFByb21vdGVzIGEgZmlsZSBzdG9yZWQgaW4gYSBmaXJtd2FyZSB2b2x1bWUgZnJvbSB0aGUgdW50cnVzdGVkIHRvIHRoZSB0cnVzdGVkIHN0YXRlLgorCisgIEBwYXJhbSAgRmlybXdhcmVWb2x1bWVIYW5kbGUgVGhlIGhhbmRsZSBvZiB0aGUgZmlybXdhcmUgdm9sdW1lIHRoYXQgY29udGFpbnMgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IEZpbGVOYW1lLgorICBAcGFyYW0gIERyaXZlck5hbWUgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbiBhIGZpcm13YXJlIHZvbHVtZS4KKworICBAcmV0dXJuIFN0YXR1cyBvZiBwcm9tb3RpbmcgRkZTIGZyb20gdW50cnVzdGVkIHRvIHRydXN0ZWQKKyAgICAgICAgICBzdGF0ZS4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgIFRoZSBmaWxlIHdhcyBub3QgZm91bmQgaW4gdGhlIHVudHJ1c3RlZCBzdGF0ZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVFJVU1QpKAorICBJTiBFRklfSEFORExFICBGaXJtd2FyZVZvbHVtZUhhbmRsZSwKKyAgSU4gQ09OU1QgRUZJX0dVSUQgICAgKkZpbGVOYW1lCisgICk7CisKKy8qKgorICBDcmVhdGVzIGEgZmlybXdhcmUgdm9sdW1lIGhhbmRsZSBmb3IgYSBmaXJtd2FyZSB2b2x1bWUgdGhhdCBpcyBwcmVzZW50IGluIHN5c3RlbSBtZW1vcnkuCisKKyAgQHBhcmFtICBGaXJtd2FyZVZvbHVtZUhlYWRlciBBIHBvaW50ZXIgdG8gdGhlIGhlYWRlciBvZiB0aGUgZmlybXdhcmUgdm9sdW1lLgorICBAcGFyYW0gIFNpemUgICAgICAgICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGZpcm13YXJlIHZvbHVtZS4KKyAgQHBhcmFtICBGaXJtd2FyZVZvbHVtZUhhbmRsZSBPbiBvdXRwdXQsIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBoYW5kbGUuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICBUaGUgRUZJX0ZJUk1XQVJFX1ZPTFVNRV9QUk9UT0NPTCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgd2VyZSBpbnN0YWxsZWQgb250bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcm13YXJlVm9sdW1lSGFuZGxlIGZvciB0aGUgZmlybXdhcmUgdm9sdW1lIGRlc2NyaWJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IEZpcm13YXJlVm9sdW1lSGVhZGVyIGFuZCBTaXplLgorICBAcmV0dmFsIEVGSV9WT0xVTUVfQ09SUlVQVEVEIFRoZSBmaXJtd2FyZSB2b2x1bWUgZGVzY3JpYmVkIGJ5IEZpcm13YXJlVm9sdW1lSGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFNpemUgaXMgY29ycnVwdGVkLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTIFRoZXJlIGFyZSBub3QgZW5vdWdoIHN5c3RlbSByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIHByb2R1Y2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJX0ZJUk1XQVJFX1ZPTFVNRV9QUk9UT0NPTCBhbmQgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBmaXJtd2FyZSB2b2x1bWUgZGVzY3JpYmVkIGJ5IEZpcm13YXJlVm9sdW1lSGVhZGVyIGFuZCBTaXplLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QUk9DRVNTX0ZJUk1XQVJFX1ZPTFVNRSkoCisgIElOIENPTlNUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICpGaXJtd2FyZVZvbHVtZUhlYWRlciwKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSwKKyAgT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgKkZpcm13YXJlVm9sdW1lSGFuZGxlCisgICk7CisKKy8vCisvLyBEWEUgU2VydmljZXMgVGFibGUKKy8vCisjZGVmaW5lIERYRV9TRVJWSUNFU19TSUdOQVRVUkUgIDB4NTY1MjQ1NTM1ZjQ1NTg0NFVMTAorI2RlZmluZSBEWEVfU0VSVklDRVNfUkVWSVNJT04gICAoKDE8PDE2KSB8ICgwMCkpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX1RBQkxFX0hFQURFUiAgICAgICAgICAgICAgICBIZHI7CisKKyAgLy8KKyAgLy8gR2xvYmFsIENvaGVyZW5jeSBEb21haW4gU2VydmljZXMKKyAgLy8KKyAgRUZJX0FERF9NRU1PUllfU1BBQ0UgICAgICAgICAgICBBZGRNZW1vcnlTcGFjZTsKKyAgRUZJX0FMTE9DQVRFX01FTU9SWV9TUEFDRSAgICAgICBBbGxvY2F0ZU1lbW9yeVNwYWNlOworICBFRklfRlJFRV9NRU1PUllfU1BBQ0UgICAgICAgICAgIEZyZWVNZW1vcnlTcGFjZTsKKyAgRUZJX1JFTU9WRV9NRU1PUllfU1BBQ0UgICAgICAgICBSZW1vdmVNZW1vcnlTcGFjZTsKKyAgRUZJX0dFVF9NRU1PUllfU1BBQ0VfREVTQ1JJUFRPUiBHZXRNZW1vcnlTcGFjZURlc2NyaXB0b3I7CisgIEVGSV9TRVRfTUVNT1JZX1NQQUNFX0FUVFJJQlVURVMgU2V0TWVtb3J5U3BhY2VBdHRyaWJ1dGVzOworICBFRklfR0VUX01FTU9SWV9TUEFDRV9NQVAgICAgICAgIEdldE1lbW9yeVNwYWNlTWFwOworICBFRklfQUREX0lPX1NQQUNFICAgICAgICAgICAgICAgIEFkZElvU3BhY2U7CisgIEVGSV9BTExPQ0FURV9JT19TUEFDRSAgICAgICAgICAgQWxsb2NhdGVJb1NwYWNlOworICBFRklfRlJFRV9JT19TUEFDRSAgICAgICAgICAgICAgIEZyZWVJb1NwYWNlOworICBFRklfUkVNT1ZFX0lPX1NQQUNFICAgICAgICAgICAgIFJlbW92ZUlvU3BhY2U7CisgIEVGSV9HRVRfSU9fU1BBQ0VfREVTQ1JJUFRPUiAgICAgR2V0SW9TcGFjZURlc2NyaXB0b3I7CisgIEVGSV9HRVRfSU9fU1BBQ0VfTUFQICAgICAgICAgICAgR2V0SW9TcGFjZU1hcDsKKworICAvLworICAvLyBEaXNwYXRjaGVyIFNlcnZpY2VzCisgIC8vCisgIEVGSV9ESVNQQVRDSCAgICAgICAgICAgICAgICAgICAgRGlzcGF0Y2g7CisgIEVGSV9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgU2NoZWR1bGU7CisgIEVGSV9UUlVTVCAgICAgICAgICAgICAgICAgICAgICAgVHJ1c3Q7CisgIC8vCisgIC8vIFNlcnZpY2UgdG8gcHJvY2VzcyBhIHNpbmdsZSBmaXJtd2FyZSB2b2x1bWUgZm91bmQgaW4gYSBjYXBzdWxlCisgIC8vCisgIEVGSV9QUk9DRVNTX0ZJUk1XQVJFX1ZPTFVNRSAgICAgUHJvY2Vzc0Zpcm13YXJlVm9sdW1lOworfSBEWEVfU0VSVklDRVM7CisKK3R5cGVkZWYgRFhFX1NFUlZJQ0VTIEVGSV9EWEVfU0VSVklDRVM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9QaS9QaUZpcm13YXJlRmlsZS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9QaS9QaUZpcm13YXJlRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNmY4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1BpL1BpRmlybXdhcmVGaWxlLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qKiBAZmlsZQorICBUaGUgZmlybXdhcmUgZmlsZSByZWxhdGVkIGRlZmluaXRpb25zIGluIFBJLgorCisgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisgIEBwYXIgUmV2aXNpb24gUmVmZXJlbmNlOgorICBQSSBWZXJzaW9uIDEuMAorCisqKi8KKworCisjaWZuZGVmIF9fUElfRklSTVdBUkVfRklMRV9IX18KKyNkZWZpbmUgX19QSV9GSVJNV0FSRV9GSUxFX0hfXworCisjaW5jbHVkZSA8Z3B4ZS9lZmkvUHJvY2Vzc29yQmluZC5oPgorCisjcHJhZ21hIHBhY2soMSkKKy8vLworLy8vIFVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZpbGUuCisvLy8KK3R5cGVkZWYgdW5pb24geworICBzdHJ1Y3QgeworICAgIFVJTlQ4ICAgSGVhZGVyOworICAgIFVJTlQ4ICAgRmlsZTsKKyAgfSBDaGVja3N1bTsKKyAgVUlOVDE2ICAgIENoZWNrc3VtMTY7Cit9IEVGSV9GRlNfSU5URUdSSVRZX0NIRUNLOworCit0eXBlZGVmIFVJTlQ4IEVGSV9GVl9GSUxFVFlQRTsKK3R5cGVkZWYgVUlOVDggRUZJX0ZGU19GSUxFX0FUVFJJQlVURVM7Cit0eXBlZGVmIFVJTlQ4IEVGSV9GRlNfRklMRV9TVEFURTsKKworLy8vCisvLy8gRmlsZSBUeXBlcyBEZWZpbml0aW9ucworLy8vCisjZGVmaW5lIEVGSV9GVl9GSUxFVFlQRV9BTEwgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBFRklfRlZfRklMRVRZUEVfUkFXICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUZJX0ZWX0ZJTEVUWVBFX0ZSRUVGT1JNICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEVGSV9GVl9GSUxFVFlQRV9TRUNVUklUWV9DT1JFICAgICAgICAgMHgwMworI2RlZmluZSBFRklfRlZfRklMRVRZUEVfUEVJX0NPUkUgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUZJX0ZWX0ZJTEVUWVBFX0RYRV9DT1JFICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEVGSV9GVl9GSUxFVFlQRV9QRUlNICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBFRklfRlZfRklMRVRZUEVfRFJJVkVSICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgRUZJX0ZWX0ZJTEVUWVBFX0NPTUJJTkVEX1BFSU1fRFJJVkVSICAweDA4CisjZGVmaW5lIEVGSV9GVl9GSUxFVFlQRV9BUFBMSUNBVElPTiAgICAgICAgICAgMHgwOQorI2RlZmluZSBFRklfRlZfRklMRVRZUEVfRklSTVdBUkVfVk9MVU1FX0lNQUdFIDB4MEIKKyNkZWZpbmUgRUZJX0ZWX0ZJTEVUWVBFX09FTV9NSU4gICAgICAgICAgICAgICAweGMwCisjZGVmaW5lIEVGSV9GVl9GSUxFVFlQRV9PRU1fTUFYICAgICAgICAgICAgICAgMHhkZgorI2RlZmluZSBFRklfRlZfRklMRVRZUEVfREVCVUdfTUlOICAgICAgICAgICAgIDB4ZTAKKyNkZWZpbmUgRUZJX0ZWX0ZJTEVUWVBFX0RFQlVHX01BWCAgICAgICAgICAgICAweGVmCisjZGVmaW5lIEVGSV9GVl9GSUxFVFlQRV9GRlNfTUlOICAgICAgICAgICAgICAgMHhmMAorI2RlZmluZSBFRklfRlZfRklMRVRZUEVfRkZTX01BWCAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgRUZJX0ZWX0ZJTEVUWVBFX0ZGU19QQUQgICAgICAgICAgICAgICAweGYwCisvLy8KKy8vLyBGRlMgRmlsZSBBdHRyaWJ1dGVzLgorLy8vCisjZGVmaW5lIEZGU19BVFRSSUJfRklYRUQgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRkZTX0FUVFJJQl9EQVRBX0FMSUdOTUVOVCAgICAgMHgzOAorI2RlZmluZSBGRlNfQVRUUklCX0NIRUNLU1VNICAgICAgICAgICAweDQwCisKKy8vLworLy8vIEZGUyBGaWxlIFN0YXRlIEJpdHMuCisvLy8KKyNkZWZpbmUgRUZJX0ZJTEVfSEVBREVSX0NPTlNUUlVDVElPTiAgMHgwMQorI2RlZmluZSBFRklfRklMRV9IRUFERVJfVkFMSUQgICAgICAgICAweDAyCisjZGVmaW5lIEVGSV9GSUxFX0RBVEFfVkFMSUQgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUZJX0ZJTEVfTUFSS0VEX0ZPUl9VUERBVEUgICAgMHgwOAorI2RlZmluZSBFRklfRklMRV9ERUxFVEVEICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEVGSV9GSUxFX0hFQURFUl9JTlZBTElEICAgICAgIDB4MjAKKworCisvLy8KKy8vLyBFYWNoIGZpbGUgYmVnaW5zIHdpdGggdGhlIGhlYWRlciB0aGF0IGRlc2NyaWJlIHRoZQorLy8vIGNvbnRlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgZmlsZXMuCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgTmFtZTsKKyAgRUZJX0ZGU19JTlRFR1JJVFlfQ0hFQ0sgSW50ZWdyaXR5Q2hlY2s7CisgIEVGSV9GVl9GSUxFVFlQRSAgICAgICAgIFR5cGU7CisgIEVGSV9GRlNfRklMRV9BVFRSSUJVVEVTIEF0dHJpYnV0ZXM7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIFNpemVbM107CisgIEVGSV9GRlNfRklMRV9TVEFURSAgICAgIFN0YXRlOworfSBFRklfRkZTX0ZJTEVfSEVBREVSOworCisKK3R5cGVkZWYgVUlOVDggRUZJX1NFQ1RJT05fVFlQRTsKKworLy8vCisvLy8gUHNldWRvIHR5cGUuIEl0IGlzCisvLy8gdXNlZCBhcyBhIHdpbGQgY2FyZCB3aGVuIHJldHJpZXZpbmcgc2VjdGlvbnMuIFRoZSBzZWN0aW9uCisvLy8gdHlwZSBFRklfU0VDVElPTl9BTEwgbWF0Y2hlcyBhbGwgc2VjdGlvbiB0eXBlcy4KKy8vLworI2RlZmluZSBFRklfU0VDVElPTl9BTEwgICAgICAgICAgICAgICAgICAgMHgwMAorCisvLy8KKy8vLyBFbmNhcHN1bGF0aW9uIHNlY3Rpb24gVHlwZSB2YWx1ZXMKKy8vLworI2RlZmluZSBFRklfU0VDVElPTl9DT01QUkVTU0lPTiAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIEVGSV9TRUNUSU9OX0dVSURfREVGSU5FRCAgICAgICAgICAweDAyCisKKy8vLworLy8vIExlYWYgc2VjdGlvbiBUeXBlIHZhbHVlcworLy8vCisjZGVmaW5lIEVGSV9TRUNUSU9OX1BFMzIgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEVGSV9TRUNUSU9OX1BJQyAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIEVGSV9TRUNUSU9OX1RFICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIEVGSV9TRUNUSU9OX0RYRV9ERVBFWCAgICAgICAgICAgICAweDEzCisjZGVmaW5lIEVGSV9TRUNUSU9OX1ZFUlNJT04gICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIEVGSV9TRUNUSU9OX1VTRVJfSU5URVJGQUNFICAgICAgICAweDE1CisjZGVmaW5lIEVGSV9TRUNUSU9OX0NPTVBBVElCSUxJVFkxNiAgICAgICAweDE2CisjZGVmaW5lIEVGSV9TRUNUSU9OX0ZJUk1XQVJFX1ZPTFVNRV9JTUFHRSAweDE3CisjZGVmaW5lIEVGSV9TRUNUSU9OX0ZSRUVGT1JNX1NVQlRZUEVfR1VJRCAweDE4CisjZGVmaW5lIEVGSV9TRUNUSU9OX1JBVyAgICAgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lIEVGSV9TRUNUSU9OX1BFSV9ERVBFWCAgICAgICAgICAgICAweDFCCisKKy8vLworLy8vIENvbW1vbiBzZWN0aW9uIGhlYWRlcgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQ4ICAgICAgICAgICAgIFNpemVbM107CisgIEVGSV9TRUNUSU9OX1RZUEUgIFR5cGU7Cit9IEVGSV9DT01NT05fU0VDVElPTl9IRUFERVI7CisKKy8vLworLy8vIExlYWYgc2VjdGlvbiB0eXBlIHRoYXQgY29udGFpbnMgYW4KKy8vLyBJQS0zMiAxNi1iaXQgZXhlY3V0YWJsZSBpbWFnZS4KKy8vLwordHlwZWRlZiBFRklfQ09NTU9OX1NFQ1RJT05fSEVBREVSIEVGSV9DT01QQVRJQklMSVRZMTZfU0VDVElPTjsKKworLy8vCisvLy8gQ29tcHJlc3Npb25UeXBlIG9mIEVGSV9DT01QUkVTU0lPTl9TRUNUSU9OLgorLy8vCisjZGVmaW5lIEVGSV9OT1RfQ09NUFJFU1NFRCAgICAgICAgMHgwMAorI2RlZmluZSBFRklfU1RBTkRBUkRfQ09NUFJFU1NJT04gIDB4MDEKKy8vLworLy8vIEFuIGVuY2Fwc3VsYXRpb24gc2VjdGlvbiB0eXBlIGluIHdoaWNoIHRoZQorLy8vIHNlY3Rpb24gZGF0YSBpcyBjb21wcmVzc2VkLgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9DT01NT05fU0VDVElPTl9IRUFERVIgICBDb21tb25IZWFkZXI7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBVbmNvbXByZXNzZWRMZW5ndGg7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvblR5cGU7Cit9IEVGSV9DT01QUkVTU0lPTl9TRUNUSU9OOworCisvLy8KKy8vLyBMZWFmIHNlY3Rpb24gd2hpY2ggY291bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRpc3BhdGNoIG9yZGVyIG9mIERYRXMuCisvLy8KK3R5cGVkZWYgRUZJX0NPTU1PTl9TRUNUSU9OX0hFQURFUiBFRklfRFhFX0RFUEVYX1NFQ1RJT047CisKKy8vLworLy8vIExlYWYgc2VjdGlvbiB3aGljaCBjb250YWlucyBhIFBJIEZWLgorLy8vCit0eXBlZGVmIEVGSV9DT01NT05fU0VDVElPTl9IRUFERVIgRUZJX0ZJUk1XQVJFX1ZPTFVNRV9JTUFHRV9TRUNUSU9OOworCisvLy8KKy8vLyBMZWFmIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgYSBzaW5nbGUgR1VJRC4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfQ09NTU9OX1NFQ1RJT05fSEVBREVSICAgQ29tbW9uSGVhZGVyOworICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgU3ViVHlwZUd1aWQ7Cit9IEVGSV9GUkVFRk9STV9TVUJUWVBFX0dVSURfU0VDVElPTjsKKworLy8vCisvLy8gQXR0cmlidXRlcyBvZiBFRklfR1VJRF9ERUZJTkVEX1NFQ1RJT04KKy8vLworI2RlZmluZSBFRklfR1VJREVEX1NFQ1RJT05fUFJPQ0VTU0lOR19SRVFVSVJFRCAgMHgwMQorI2RlZmluZSBFRklfR1VJREVEX1NFQ1RJT05fQVVUSF9TVEFUVVNfVkFMSUQgICAgMHgwMgorLy8vCisvLy8gTGVhZiBzZWN0aW9uIHdoaWNoIGlzIGVuY2Fwc3VsYXRpb24gZGVmaW5lZCBieSBzcGVjaWZpYyBHVUlECisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0NPTU1PTl9TRUNUSU9OX0hFQURFUiAgIENvbW1vbkhlYWRlcjsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25EZWZpbml0aW9uR3VpZDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIERhdGFPZmZzZXQ7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzOworfSBFRklfR1VJRF9ERUZJTkVEX1NFQ1RJT047CisKKy8vLworLy8vIExlYWYgc2VjdGlvbiB3aGljaCBjb250YWlucyBQRTMyKyBpbWFnZS4KKy8vLwordHlwZWRlZiBFRklfQ09NTU9OX1NFQ1RJT05fSEVBREVSIEVGSV9QRTMyX1NFQ1RJT047CisKKworLy8vCisvLy8gTGVhZiBzZWN0aW9uIHdoaWNoIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkaXNwYXRjaCBvcmRlciBvZiBQRUlNcy4KKy8vLwordHlwZWRlZiBFRklfQ09NTU9OX1NFQ1RJT05fSEVBREVSIEVGSV9QRUlfREVQRVhfU0VDVElPTjsKKworLy8vCisvLy8gTGVhZiBzZWN0aW9uIHdoaWNoIGNvbnN0YWlucyB0aGUgcG9zaXRpb24taW5kZXBlbmRlbnQtY29kZSBpbWFnZS4KKy8vLwordHlwZWRlZiBFRklfQ09NTU9OX1NFQ1RJT05fSEVBREVSIEVGSV9URV9TRUNUSU9OOworCisvLy8KKy8vLyBMZWFmIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgemVybyBvciBtb3JlIGJ5dGVzLgorLy8vCit0eXBlZGVmIEVGSV9DT01NT05fU0VDVElPTl9IRUFERVIgRUZJX1JBV19TRUNUSU9OOworCisvLy8KKy8vLyBMZWFmIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgYSB1bmljb2RlIHN0cmluZyB0aGF0CisvLy8gaXMgaHVtYW4gcmVhZGFibGUgZmlsZSBuYW1lLgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9DT01NT05fU0VDVElPTl9IRUFERVIgICBDb21tb25IZWFkZXI7CisKKyAgLy8vCisgIC8vLyBBcnJheSBvZiB1bmljb2RlIHN0cmluZy4KKyAgLy8vCisgIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICBGaWxlTmFtZVN0cmluZ1sxXTsKK30gRUZJX1VTRVJfSU5URVJGQUNFX1NFQ1RJT047CisKKworLy8vCisvLy8gTGVhZiBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIGEgbnVtZXJpYyBidWlsZCBudW1iZXIgYW5kCisvLy8gYW4gb3B0aW9uYWwgdW5pY29kZSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBmaWxlIHJldmlzaW9uLgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9DT01NT05fU0VDVElPTl9IRUFERVIgICBDb21tb25IZWFkZXI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBCdWlsZE51bWJlcjsKKworICAvLy8KKyAgLy8vIEFycmF5IG9mIHVuaWNvZGUgc3RyaW5nLgorICAvLy8KKyAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25TdHJpbmdbMV07Cit9IEVGSV9WRVJTSU9OX1NFQ1RJT047CisKKworI2RlZmluZSBTRUNUSU9OX1NJWkUoU2VjdGlvbkhlYWRlclB0cikgXAorICAgICgoVUlOVDMyKSAoKigoVUlOVDMyICopICgoRUZJX0NPTU1PTl9TRUNUSU9OX0hFQURFUiAqKSBTZWN0aW9uSGVhZGVyUHRyKS0+U2l6ZSkgJiAweDAwZmZmZmZmKSkKKworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlGaXJtd2FyZVZvbHVtZS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9QaS9QaUZpcm13YXJlVm9sdW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3YjcwNAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlGaXJtd2FyZVZvbHVtZS5oCkBAIC0wLDAgKzEsMTU0IEBACisvKiogQGZpbGUKKyAgVGhlIGZpcm13YXJlIHZvbHVtZSByZWxhdGVkIGRlZmluaXRpb25zIGluIFBJLgorCisgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisgIEBwYXIgUmV2aXNpb24gUmVmZXJlbmNlOgorICBQSSBWZXJzaW9uIDEuMAorCisqKi8KKworI2lmbmRlZiBfX1BJX0ZJUk1XQVJFVk9MVU1FX0hfXworI2RlZmluZSBfX1BJX0ZJUk1XQVJFVk9MVU1FX0hfXworCisjaW5jbHVkZSA8Z3B4ZS9lZmkvUHJvY2Vzc29yQmluZC5oPgorCisvLy8KKy8vLyBFRklfRlZfRklMRV9BVFRSSUJVVEVTCisvLy8KK3R5cGVkZWYgVUlOVDMyICBFRklfRlZfRklMRV9BVFRSSUJVVEVTOworCisvLworLy8gVmFsdWUgb2YgRUZJX0ZWX0ZJTEVfQVRUUklCVVRFUy4KKy8vCisjZGVmaW5lIEVGSV9GVl9GSUxFX0FUVFJJQl9BTElHTk1FTlQgICAgICAweDAwMDAwMDFGCisjZGVmaW5lIEVGSV9GVl9GSUxFX0FUVFJJQl9GSVhFRCAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEVGSV9GVl9GSUxFX0FUVFJJQl9NRU1PUllfTUFQUEVEICAweDAwMDAwMjAwCisKKy8vLworLy8vIHR5cGUgb2YgRUZJIEZWQiBhdHRyaWJ1dGUKKy8vLwordHlwZWRlZiBVSU5UMzIgIEVGSV9GVkJfQVRUUklCVVRFU18yOworCisvLworLy8gQXR0cmlidXRlcyBiaXQgZGVmaW5pdGlvbnMKKy8vCisjZGVmaW5lIEVGSV9GVkIyX1JFQURfRElTQUJMRURfQ0FQICAweDAwMDAwMDAxCisjZGVmaW5lIEVGSV9GVkIyX1JFQURfRU5BQkxFRF9DQVAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVGSV9GVkIyX1JFQURfU1RBVFVTICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVGSV9GVkIyX1dSSVRFX0RJU0FCTEVEX0NBUCAweDAwMDAwMDA4CisjZGVmaW5lIEVGSV9GVkIyX1dSSVRFX0VOQUJMRURfQ0FQICAweDAwMDAwMDEwCisjZGVmaW5lIEVGSV9GVkIyX1dSSVRFX1NUQVRVUyAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVGSV9GVkIyX0xPQ0tfQ0FQICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEVGSV9GVkIyX0xPQ0tfU1RBVFVTICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEVGSV9GVkIyX1NUSUNLWV9XUklURSAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEVGSV9GVkIyX01FTU9SWV9NQVBQRUQgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEVGSV9GVkIyX0VSQVNFX1BPTEFSSVRZICAgICAweDAwMDAwODAwCisjZGVmaW5lIEVGSV9GVkIyX1JFQURfTE9DS19DQVAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEVGSV9GVkIyX1JFQURfTE9DS19TVEFUVVMgICAweDAwMDAyMDAwCisjZGVmaW5lIEVGSV9GVkIyX1dSSVRFX0xPQ0tfQ0FQICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEVGSV9GVkIyX1dSSVRFX0xPQ0tfU1RBVFVTICAweDAwMDA4MDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVCAgICAgICAgICAweDAwMUYwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8yICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF80ICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF84ICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xNiAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8zMiAgICAgICAweDAwMDUwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF82NCAgICAgICAweDAwMDYwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xMjggICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8yNTYgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF81MTIgICAgICAweDAwMDkwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xSyAgICAgICAweDAwMEEwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8ySyAgICAgICAweDAwMEIwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF80SyAgICAgICAweDAwMEMwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF84SyAgICAgICAweDAwMEQwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xNksgICAgICAweDAwMEUwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8zMksgICAgICAweDAwMEYwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF82NEsgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xMjhLICAgICAweDAwMTEwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8yNTZLICAgICAweDAwMTIwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTU5FVF81MTJLICAgICAweDAwMTMwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xTSAgICAgICAweDAwMTQwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8yTSAgICAgICAweDAwMTUwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF80TSAgICAgICAweDAwMTYwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF84TSAgICAgICAweDAwMTcwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xNk0gICAgICAweDAwMTgwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8zMk0gICAgICAweDAwMTkwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF82NE0gICAgICAweDAwMUEwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xMjhNICAgICAweDAwMUIwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8yNTZNICAgICAweDAwMUMwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF81MTJNICAgICAweDAwMUQwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8xRyAgICAgICAweDAwMUUwMDAwCisjZGVmaW5lIEVGSV9GVkIyX0FMSUdOTUVOVF8yRyAgICAgICAweDAwMUYwMDAwCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgTnVtQmxvY2tzOworICBVSU5UMzIgTGVuZ3RoOworfSBFRklfRlZfQkxPQ0tfTUFQX0VOVFJZOworCisvLy8KKy8vLyBEZXNjcmliZXMgdGhlIGZlYXR1cmVzIGFuZCBsYXlvdXQgb2YgdGhlIGZpcm13YXJlIHZvbHVtZS4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgIFplcm9WZWN0b3JbMTZdOworICBFRklfR1VJRCAgICAgICAgICAgICAgICAgIEZpbGVTeXN0ZW1HdWlkOworICBVSU5UNjQgICAgICAgICAgICAgICAgICAgIEZ2TGVuZ3RoOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZTsKKyAgRUZJX0ZWQl9BVFRSSUJVVEVTXzIgICAgICBBdHRyaWJ1dGVzOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgIEhlYWRlckxlbmd0aDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBDaGVja3N1bTsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBFeHRIZWFkZXJPZmZzZXQ7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMV07CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgUmV2aXNpb247CisgIEVGSV9GVl9CTE9DS19NQVBfRU5UUlkgICAgQmxvY2tNYXBbMV07Cit9IEVGSV9GSVJNV0FSRV9WT0xVTUVfSEVBREVSOworCisjZGVmaW5lIEVGSV9GVkhfU0lHTkFUVVJFIEVGSV9TSUdOQVRVUkVfMzIgKCdfJywgJ0YnLCAnVicsICdIJykKKworLy8vCisvLy8gRmlybXdhcmUgVm9sdW1lIEhlYWRlciBSZXZpc2lvbiBkZWZpbml0aW9uCisvLy8KKyNkZWZpbmUgRUZJX0ZWSF9SRVZJU0lPTiAgMHgwMgorCisvLy8KKy8vLyBFeHRlbnNpb24gaGVhZGVyIHBvaW50ZWQgYnkgRXh0SGVhZGVyT2Zmc2V0IG9mIHZvbHVtZSBoZWFkZXIuCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0dVSUQgIEZ2TmFtZTsKKyAgVUlOVDMyICAgIEV4dEhlYWRlclNpemU7Cit9IEVGSV9GSVJNV0FSRV9WT0xVTUVfRVhUX0hFQURFUjsKKworLy8vCisvLy8gRW50cnkgc3RydXR1cmUgZm9yIGRlc2NyaWJpbmcgRlYgZXh0ZW5zaW9uIGhlYWRlcgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQxNiAgICBFeHRFbnRyeVNpemU7CisgIFVJTlQxNiAgICBFeHRFbnRyeVR5cGU7Cit9IEVGSV9GSVJNV0FSRV9WT0xVTUVfRVhUX0VOVFJZOworCisjZGVmaW5lIEVGSV9GVl9FWFRfVFlQRV9PRU1fVFlQRSAgMHgwMQorLy8vCisvLy8gVGhpcyBleHRlbnNpb24gaGVhZGVyIHByb3ZpZGVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgR1VJRCBhbmQgYW4gT0VNIGZpbGUgdHlwZS4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfRklSTVdBUkVfVk9MVU1FX0VYVF9FTlRSWSBIZHI7CisgIFVJTlQzMiAgICBUeXBlTWFzazsKKworICAvLworICAvLyBBcnJheSBvZiBHVUlEcy4KKyAgLy8gRWFjaCBHVUlEIHJlcHJlc2VudHMgYW4gT0VNIGZpbGUgdHlwZS4KKyAgLy8KKyAgRUZJX0dVSUQgIFR5cGVzWzFdOworfSBFRklfRklSTVdBUkVfVk9MVU1FX0VYVF9FTlRSWV9PRU1fVFlQRTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlIb2IuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlIb2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzhkZjFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9QaS9QaUhvYi5oCkBAIC0wLDAgKzEsMjk1IEBACisvKiogQGZpbGUKKyAgSE9CIHJlbGF0ZWQgZGVmaW5pdGlvbnMgaW4gUEkuCisKKyAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyAgQHBhciBSZXZpc2lvbiBSZWZlcmVuY2U6CisgIFBJIFZlcnNpb24gMS4wCisKKyoqLworCisjaWZuZGVmIF9fUElfSE9CX0hfXworI2RlZmluZSBfX1BJX0hPQl9IX18KKworI2luY2x1ZGUgPGdweGUvZWZpL1Byb2Nlc3NvckJpbmQuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9QaS9QaUJvb3RNb2RlLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvVWVmaS9VZWZpQmFzZVR5cGUuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9VZWZpL1VlZmlNdWx0aVBoYXNlLmg+CisKKy8vCisvLyBIb2JUeXBlIG9mIEVGSV9IT0JfR0VORVJJQ19IRUFERVIuCisvLworI2RlZmluZSBFRklfSE9CX1RZUEVfSEFORE9GRiAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEVGSV9IT0JfVFlQRV9NRU1PUllfQUxMT0NBVElPTiAgICAweDAwMDIKKyNkZWZpbmUgRUZJX0hPQl9UWVBFX1JFU09VUkNFX0RFU0NSSVBUT1IgIDB4MDAwMworI2RlZmluZSBFRklfSE9CX1RZUEVfR1VJRF9FWFRFTlNJT04gICAgICAgMHgwMDA0CisjZGVmaW5lIEVGSV9IT0JfVFlQRV9GViAgICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgRUZJX0hPQl9UWVBFX0NQVSAgICAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBFRklfSE9CX1RZUEVfTUVNT1JZX1BPT0wgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIEVGSV9IT0JfVFlQRV9GVjIgICAgICAgICAgICAgICAgICAweDAwMDkKKyNkZWZpbmUgRUZJX0hPQl9UWVBFX0xPQURfUEVJTSAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBFRklfSE9CX1RZUEVfVU5VU0VEICAgICAgICAgICAgICAgMHhGRkZFCisjZGVmaW5lIEVGSV9IT0JfVFlQRV9FTkRfT0ZfSE9CX0xJU1QgICAgICAweEZGRkYKKworLy8vCisvLy8gRGVzY3JpYmVzIHRoZSBmb3JtYXQgYW5kIHNpemUgb2YgdGhlIGRhdGEgaW5zaWRlIHRoZSBIT0IuCisvLy8gQWxsIEhPQnMgbXVzdCBjb250YWluIHRoaXMgZ2VuZXJpYyBIT0IgaGVhZGVyLgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQxNiAgICBIb2JUeXBlOworICBVSU5UMTYgICAgSG9iTGVuZ3RoOworICBVSU5UMzIgICAgUmVzZXJ2ZWQ7Cit9IEVGSV9IT0JfR0VORVJJQ19IRUFERVI7CisKKworLy8vCisvLy8gVmFsdWUgb2YgdmVyc2lvbiBvZmluRUZJX0hPQl9IQU5ET0ZGX0lORk9fVEFCTEUuCisvLy8KKyNkZWZpbmUgRUZJX0hPQl9IQU5ET0ZGX1RBQkxFX1ZFUlNJT04gMHgwMDA5CisKKy8vLworLy8vIENvbnRhaW5zIGdlbmVyYWwgc3RhdGUgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgSE9CIHByb2R1Y2VyIHBoYXNlLgorLy8vIFRoaXMgSE9CIG11c3QgYmUgdGhlIGZpcnN0IG9uZSBpbiB0aGUgSE9CIGxpc3QuCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0hPQl9HRU5FUklDX0hFQURFUiAgSGVhZGVyOworICBVSU5UMzIgICAgICAgICAgICAgICAgICBWZXJzaW9uOworICBFRklfQk9PVF9NT0RFICAgICAgICAgICBCb290TW9kZTsKKyAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgRWZpTWVtb3J5VG9wOworICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICBFZmlNZW1vcnlCb3R0b207CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgIEVmaUZyZWVNZW1vcnlUb3A7CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgIEVmaUZyZWVNZW1vcnlCb3R0b207CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgIEVmaUVuZE9mSG9iTGlzdDsKK30gRUZJX0hPQl9IQU5ET0ZGX0lORk9fVEFCTEU7CisKKy8vLworLy8vIEVGSV9IT0JfTUVNT1JZX0FMTE9DQVRJT05fSEVBREVSIGRlc2NyaWJlcyB0aGUKKy8vLyB2YXJpb3VzIGF0dHJpYnV0ZXMgb2YgdGhlIGxvZ2ljYWwgbWVtb3J5IGFsbG9jYXRpb24uIFRoZSB0eXBlIGZpZWxkIHdpbGwgYmUgdXNlZCBmb3IKKy8vLyBzdWJzZXF1ZW50IGluY2x1c2lvbiBpbiB0aGUgVUVGSSBtZW1vcnkgbWFwLgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vLworICAvLy8gQSBHVUlEIHRoYXQgZGVmaW5lcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gcmVnaW9uJ3MgdHlwZSBhbmQgcHVycG9zZSwgYXMgd2VsbCBhcworICAvLy8gb3RoZXIgZmllbGRzIHdpdGhpbiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gSE9CLiBUaGlzIEdVSUQgaXMgdXNlZCB0byBkZWZpbmUgdGhlCisgIC8vLyBhZGRpdGlvbmFsIGRhdGEgd2l0aGluIHRoZSBIT0IgdGhhdCBtYXkgYmUgcHJlc2VudCBmb3IgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIEhPQi4KKyAgLy8vIFR5cGUgRUZJX0dVSUQgaXMgZGVmaW5lZCBpbiBJbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2UoKSBpbiB0aGUgVUVGSSAyLjAKKyAgLy8vIHNwZWNpZmljYXRpb24uCisgIC8vLworICBFRklfR1VJRCAgICAgICAgICAgICAgTmFtZTsKKworICAvLy8KKyAgLy8vIFRoZSBiYXNlIGFkZHJlc3Mgb2YgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIEhPQi4gVHlwZQorICAvLy8gRUZJX1BIWVNJQ0FMX0FERFJFU1MgaXMgZGVmaW5lZCBpbiBBbGxvY2F0ZVBhZ2VzKCkgaW4gdGhlIFVFRkkgMi4wCisgIC8vLyBzcGVjaWZpY2F0aW9uLgorICAvLy8KKyAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgIE1lbW9yeUJhc2VBZGRyZXNzOworCisgIC8vLworICAvLy8gVGhlIGxlbmd0aCBpbiBieXRlcyBvZiBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgSE9CLgorICAvLy8KKyAgVUlOVDY0ICAgICAgICAgICAgICAgIE1lbW9yeUxlbmd0aDsKKworICAvLy8KKyAgLy8vIERlZmluZXMgdGhlIHR5cGUgb2YgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIEhPQi4gVGhlIG1lbW9yeSB0eXBlIGRlZmluaXRpb24KKyAgLy8vIGZvbGxvd3MgdGhlIEVGSV9NRU1PUllfVFlQRSBkZWZpbml0aW9uLiBUeXBlIEVGSV9NRU1PUllfVFlQRSBpcyBkZWZpbmVkCisgIC8vLyBpbiBBbGxvY2F0ZVBhZ2VzKCkgaW4gdGhlIFVFRkkgMi4wIHNwZWNpZmljYXRpb24uCisgIC8vLworICBFRklfTUVNT1JZX1RZUEUgICAgICAgTWVtb3J5VHlwZTsKKworICAvLy8KKyAgLy8vIFBhZGRpbmcgZm9yIEl0YW5pdW0gcHJvY2Vzc29yIGZhbWlseQorICAvLy8KKyAgVUlOVDggICAgICAgICAgICAgICAgIFJlc2VydmVkWzRdOworfSBFRklfSE9CX01FTU9SWV9BTExPQ0FUSU9OX0hFQURFUjsKKworLy8vCisvLy8gRGVzY3JpYmVzIGFsbCBtZW1vcnkgcmFuZ2VzIHVzZWQgZHVyaW5nIHRoZSBIT0IgcHJvZHVjZXIKKy8vLyBwaGFzZSB0aGF0IGV4aXN0IG91dHNpZGUgdGhlIEhPQiBsaXN0LiBUaGlzIEhPQiB0eXBlCisvLy8gZGVzY3JpYmVzIGhvdyBtZW1vcnkgaXMgdXNlZCwKKy8vLyBub3QgdGhlIHBoeXNpY2FsIGF0dHJpYnV0ZXMgb2YgbWVtb3J5LgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9IT0JfR0VORVJJQ19IRUFERVIgICAgICAgICAgICBIZWFkZXI7CisgIEVGSV9IT0JfTUVNT1JZX0FMTE9DQVRJT05fSEVBREVSICBBbGxvY0Rlc2NyaXB0b3I7CisgIC8vCisgIC8vIEFkZGl0aW9uYWwgZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSAiTmFtZSIgR3VpZCBtZW1vcnkKKyAgLy8gbWF5IGdvIGhlcmUuCisgIC8vCit9IEVGSV9IT0JfTUVNT1JZX0FMTE9DQVRJT047CisKKworLy8vCisvLy8gRGVzY3JpYmVzIHRoZSBtZW1vcnkgc3RhY2sgdGhhdCBpcyBwcm9kdWNlZCBieSB0aGUgSE9CIHByb2R1Y2VyCisvLy8gcGhhc2UgYW5kIHVwb24gd2hpY2ggYWxsIHBvc3RtZW1vcnktaW5zdGFsbGVkIGV4ZWN1dGFibGUKKy8vLyBjb250ZW50IGluIHRoZSBIT0IgcHJvZHVjZXIgcGhhc2UgaXMgZXhlY3V0aW5nLgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9IT0JfR0VORVJJQ19IRUFERVIgICAgICAgICAgICBIZWFkZXI7CisgIEVGSV9IT0JfTUVNT1JZX0FMTE9DQVRJT05fSEVBREVSICBBbGxvY0Rlc2NyaXB0b3I7Cit9IEVGSV9IT0JfTUVNT1JZX0FMTE9DQVRJT05fU1RBQ0s7CisKKy8vLworLy8vIERlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBib290LXN0cmFwCisvLy8gcHJvY2Vzc29yIChCU1ApIEJTUFN0b3JlICgiQmFja2luZyBTdG9yZSBQb2ludGVyIFN0b3JlIikuCisvLy8gVGhpcyBIT0IgaXMgdmFsaWQgZm9yIHRoZSBJdGFuaXVtIHByb2Nlc3NvciBmYW1pbHkgb25seQorLy8vIHJlZ2lzdGVyIG92ZXJmbG93IHN0b3JlLgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9IT0JfR0VORVJJQ19IRUFERVIgICAgICAgICAgICBIZWFkZXI7CisgIEVGSV9IT0JfTUVNT1JZX0FMTE9DQVRJT05fSEVBREVSICBBbGxvY0Rlc2NyaXB0b3I7Cit9IEVGSV9IT0JfTUVNT1JZX0FMTE9DQVRJT05fQlNQX1NUT1JFOworCisvLy8KKy8vLyBEZWZpbmVzIHRoZSBsb2NhdGlvbiBhbmQgZW50cnkgcG9pbnQgb2YgdGhlIEhPQiBjb25zdW1lciBwaGFzZS4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfSE9CX0dFTkVSSUNfSEVBREVSICAgICAgICAgICAgSGVhZGVyOworICBFRklfSE9CX01FTU9SWV9BTExPQ0FUSU9OX0hFQURFUiAgTWVtb3J5QWxsb2NhdGlvbkhlYWRlcjsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZU5hbWU7CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgICBFbnRyeVBvaW50OworfSBFRklfSE9CX01FTU9SWV9BTExPQ0FUSU9OX01PRFVMRTsKKworLy8vCisvLy8gUmVzb3VyY2UgdHlwZQorLy8vCit0eXBlZGVmIFVJTlQzMiBFRklfUkVTT1VSQ0VfVFlQRTsKKworLy8KKy8vIFZhbHVlIG9mIFJlc291cmNlVHlwZSBpbiBFRklfSE9CX1JFU09VUkNFX0RFU0NSSVBUT1IuCisvLworI2RlZmluZSBFRklfUkVTT1VSQ0VfU1lTVEVNX01FTU9SWSAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEVGSV9SRVNPVVJDRV9NRU1PUllfTUFQUEVEX0lPICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUZJX1JFU09VUkNFX0lPICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFRklfUkVTT1VSQ0VfRklSTVdBUkVfREVWSUNFICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEVGSV9SRVNPVVJDRV9NRU1PUllfTUFQUEVEX0lPX1BPUlQgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRUZJX1JFU09VUkNFX01FTU9SWV9SRVNFUlZFRCAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSBFRklfUkVTT1VSQ0VfSU9fUkVTRVJWRUQgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIEVGSV9SRVNPVVJDRV9NQVhfTUVNT1JZX1RZUEUgICAgICAgIDB4MDAwMDAwMDcKKworLy8vCisvLy8gdHlwZSBvZiByZWNvdW50IGF0dHJpYnV0ZSB0eXBlCisvLy8KK3R5cGVkZWYgVUlOVDMyIEVGSV9SRVNPVVJDRV9BVFRSSUJVVEVfVFlQRTsKKworLy8KKy8vIFRoZXNlIHR5cGVzIGNhbiBiZSBPUmVkIHRvZ2V0aGVyIGFzIG5lZWRlZC4KKy8vCisvLyBUaGUgZmlyc3QgdGhyZWUgZW51bWVyYXRpb25zIGRlc2NyaWJlIHNldHRpbmdzCisvLworI2RlZmluZSBFRklfUkVTT1VSQ0VfQVRUUklCVVRFX1BSRVNFTlQgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUZJX1JFU09VUkNFX0FUVFJJQlVURV9JTklUSUFMSVpFRCAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVGSV9SRVNPVVJDRV9BVFRSSUJVVEVfVEVTVEVEICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorLy8KKy8vIFRoZSByZXN0IG9mIHRoZSBzZXR0aW5ncyBkZXNjcmliZSBjYXBhYmlsaXRpZXMKKy8vCisjZGVmaW5lIEVGSV9SRVNPVVJDRV9BVFRSSUJVVEVfU0lOR0xFX0JJVF9FQ0MgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUZJX1JFU09VUkNFX0FUVFJJQlVURV9NVUxUSVBMRV9CSVRfRUNDICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFRklfUkVTT1VSQ0VfQVRUUklCVVRFX0VDQ19SRVNFUlZFRF8xICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVGSV9SRVNPVVJDRV9BVFRSSUJVVEVfRUNDX1JFU0VSVkVEXzIgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRUZJX1JFU09VUkNFX0FUVFJJQlVURV9SRUFEX1BST1RFQ1RFRCAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFRklfUkVTT1VSQ0VfQVRUUklCVVRFX1dSSVRFX1BST1RFQ1RFRCAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEVGSV9SRVNPVVJDRV9BVFRSSUJVVEVfRVhFQ1VUSU9OX1BST1RFQ1RFRCAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRUZJX1JFU09VUkNFX0FUVFJJQlVURV9VTkNBQ0hFQUJMRSAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBFRklfUkVTT1VSQ0VfQVRUUklCVVRFX1dSSVRFX0NPTUJJTkVBQkxFICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEVGSV9SRVNPVVJDRV9BVFRSSUJVVEVfV1JJVEVfVEhST1VHSF9DQUNIRUFCTEUgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRUZJX1JFU09VUkNFX0FUVFJJQlVURV9XUklURV9CQUNLX0NBQ0hFQUJMRSAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBFRklfUkVTT1VSQ0VfQVRUUklCVVRFXzE2X0JJVF9JTyAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEVGSV9SRVNPVVJDRV9BVFRSSUJVVEVfMzJfQklUX0lPICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRUZJX1JFU09VUkNFX0FUVFJJQlVURV82NF9CSVRfSU8gICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBFRklfUkVTT1VSQ0VfQVRUUklCVVRFX1VOQ0FDSEVEX0VYUE9SVEVEICAgICAgICAweDAwMDIwMDAwCisKKy8vLworLy8vIERlc2NyaWJlcyB0aGUgcmVzb3VyY2UgcHJvcGVydGllcyBvZiBhbGwgZml4ZWQsCisvLy8gbm9ucmVsb2NhdGFibGUgcmVzb3VyY2UgcmFuZ2VzIGZvdW5kIG9uIHRoZSBwcm9jZXNzb3IKKy8vLyBob3N0IGJ1cyBkdXJpbmcgdGhlIEhPQiBwcm9kdWNlciBwaGFzZS4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfSE9CX0dFTkVSSUNfSEVBREVSICAgICAgSGVhZGVyOworICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgT3duZXI7CisgIEVGSV9SRVNPVVJDRV9UWVBFICAgICAgICAgICBSZXNvdXJjZVR5cGU7CisgIEVGSV9SRVNPVVJDRV9BVFRSSUJVVEVfVFlQRSBSZXNvdXJjZUF0dHJpYnV0ZTsKKyAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgIFBoeXNpY2FsU3RhcnQ7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUxlbmd0aDsKK30gRUZJX0hPQl9SRVNPVVJDRV9ERVNDUklQVE9SOworCisvLy8KKy8vLyBBbGxvd3Mgd3JpdGVycyBvZiBleGVjdXRhYmxlIGNvbnRlbnQgaW4gdGhlIEhPQiBwcm9kdWNlciBwaGFzZSB0bworLy8vIG1haW50YWluIGFuZCBtYW5hZ2UgSE9CcyB3aXRoIHNwZWNpZmljIEdVSUQuCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0hPQl9HRU5FUklDX0hFQURFUiAgICAgIEhlYWRlcjsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgIE5hbWU7CisKKyAgLy8vCisgIC8vLyBHdWlkIHNwZWNpZmljIGRhdGEgZ29lcyBoZXJlCisgIC8vLworfSBFRklfSE9CX0dVSURfVFlQRTsKKworLy8vCisvLy8gRGV0YWlscyB0aGUgbG9jYXRpb24gb2YgZmlybXdhcmUgdm9sdW1lcyB0aGF0IGNvbnRhaW4gZmlybXdhcmUgZmlsZXMuCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0hPQl9HRU5FUklDX0hFQURFUiBIZWFkZXI7CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgQmFzZUFkZHJlc3M7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgTGVuZ3RoOworfSBFRklfSE9CX0ZJUk1XQVJFX1ZPTFVNRTsKKworLy8vCisvLy8gRGV0YWlscyB0aGUgbG9jYXRpb24gb2YgYSBmaXJtd2FyZSB2b2x1bWUgd2hpY2ggd2FzIGV4dHJhY3RlZAorLy8vIGZyb20gYSBmaWxlIHdpdGhpbiBhbm90aGVyIGZpcm13YXJlIHZvbHVtZS4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfSE9CX0dFTkVSSUNfSEVBREVSICBIZWFkZXI7CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgIEJhc2VBZGRyZXNzOworICBVSU5UNjQgICAgICAgICAgICAgICAgICBMZW5ndGg7CisgIEVGSV9HVUlEICAgICAgICAgICAgICAgIEZ2TmFtZTsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgRmlsZU5hbWU7Cit9IEVGSV9IT0JfRklSTVdBUkVfVk9MVU1FMjsKKworCisvLy8KKy8vLyBEZXNjcmliZXMgcHJvY2Vzc29yIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFkZHJlc3Mgc3BhY2UgYW5kIEkvTyBzcGFjZSBjYXBhYmlsaXRpZXMuCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0hPQl9HRU5FUklDX0hFQURFUiAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICBTaXplT2ZNZW1vcnlTcGFjZTsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgU2l6ZU9mSW9TcGFjZTsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbNl07Cit9IEVGSV9IT0JfQ1BVOworCisKKy8vLworLy8vIERlc2NyaWJlcyBwb29sIG1lbW9yeSBhbGxvY2F0aW9ucy4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfSE9CX0dFTkVSSUNfSEVBREVSICBIZWFkZXI7Cit9IEVGSV9IT0JfTUVNT1JZX1BPT0w7CisKKy8vLworLy8vIFVuaW9uIG9mIGFsbCB0aGUgcG9zc2libGUgSE9CIFR5cGVzCisvLy8KK3R5cGVkZWYgdW5pb24geworICBFRklfSE9CX0dFTkVSSUNfSEVBREVSICAgICAgICAgICAgICAqSGVhZGVyOworICBFRklfSE9CX0hBTkRPRkZfSU5GT19UQUJMRSAgICAgICAgICAqSGFuZG9mZkluZm9ybWF0aW9uVGFibGU7CisgIEVGSV9IT0JfTUVNT1JZX0FMTE9DQVRJT04gICAgICAgICAgICpNZW1vcnlBbGxvY2F0aW9uOworICBFRklfSE9CX01FTU9SWV9BTExPQ0FUSU9OX0JTUF9TVE9SRSAqTWVtb3J5QWxsb2NhdGlvbkJzcFN0b3JlOworICBFRklfSE9CX01FTU9SWV9BTExPQ0FUSU9OX1NUQUNLICAgICAqTWVtb3J5QWxsb2NhdGlvblN0YWNrOworICBFRklfSE9CX01FTU9SWV9BTExPQ0FUSU9OX01PRFVMRSAgICAqTWVtb3J5QWxsb2NhdGlvbk1vZHVsZTsKKyAgRUZJX0hPQl9SRVNPVVJDRV9ERVNDUklQVE9SICAgICAgICAgKlJlc291cmNlRGVzY3JpcHRvcjsKKyAgRUZJX0hPQl9HVUlEX1RZUEUgICAgICAgICAgICAgICAgICAgKkd1aWQ7CisgIEVGSV9IT0JfRklSTVdBUkVfVk9MVU1FICAgICAgICAgICAgICpGaXJtd2FyZVZvbHVtZTsKKyAgRUZJX0hPQl9GSVJNV0FSRV9WT0xVTUUyICAgICAgICAgICAgKkZpcm13YXJlVm9sdW1lMjsKKyAgRUZJX0hPQl9DUFUgICAgICAgICAgICAgICAgICAgICAgICAgKkNwdTsKKyAgRUZJX0hPQl9NRU1PUllfUE9PTCAgICAgICAgICAgICAgICAgKlBvb2w7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSYXc7Cit9IEVGSV9QRUlfSE9CX1BPSU5URVJTOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9QaS9QaU11bHRpUGhhc2UuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlNdWx0aVBoYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiNjQyMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUGkvUGlNdWx0aVBoYXNlLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qKiBAZmlsZQorICBJbmNsdWRlIGZpbGUgbWF0Y2hlcyB0aGluZ3MgaW4gUEkgZm9yIG11bHRpcGxlIG1vZHVsZSB0eXBlcy4KKworICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CisgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworICBAcGFyIFJldmlzaW9uIFJlZmVyZW5jZToKKyAgUEkgVmVyc2lvbiAxLjAKKworKiovCisKKyNpZm5kZWYgX19QSV9NVUxUSVBIQVNFX0hfXworI2RlZmluZSBfX1BJX01VTFRJUEhBU0VfSF9fCisKKyNpbmNsdWRlIDxncHhlL2VmaS9VZWZpL1VlZmlNdWx0aVBoYXNlLmg+CisKKyNpbmNsdWRlIDxncHhlL2VmaS9QaS9QaUZpcm13YXJlVm9sdW1lLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvUGkvUGlGaXJtd2FyZUZpbGUuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9QaS9QaUJvb3RNb2RlLmg+CisKKyNpbmNsdWRlIDxncHhlL2VmaS9QaS9QaUhvYi5oPgorI2luY2x1ZGUgPGdweGUvZWZpL1BpL1BpRGVwZW5kZW5jeS5oPgorCisKKyNkZWZpbmUgRUZJX05PVF9BVkFJTEFCTEVfWUVUICAgRUZJRVJSICgzMikKKworLy8vCisvLy8gU3RhdHVzIENvZGUgVHlwZSBEZWZpbml0aW9uCisvLy8KK3R5cGVkZWYgVUlOVDMyICBFRklfU1RBVFVTX0NPREVfVFlQRTsKKworLy8KKy8vIEEgU3RhdHVzIENvZGUgVHlwZSBpcyBtYWRlIHVwIG9mIHRoZSBjb2RlIHR5cGUgYW5kIHNldmVyaXR5CisvLyBBbGwgdmFsdWVzIG1hc2tlZCBieSBFRklfU1RBVFVTX0NPREVfUkVTRVJWRURfTUFTSyBhcmUKKy8vIHJlc2VydmVkIGZvciB1c2UgYnkgdGhpcyBzcGVjaWZpY2F0aW9uLgorLy8KKyNkZWZpbmUgRUZJX1NUQVRVU19DT0RFX1RZUEVfTUFTSyAgICAgMHgwMDAwMDBGRgorI2RlZmluZSBFRklfU1RBVFVTX0NPREVfU0VWRVJJVFlfTUFTSyAweEZGMDAwMDAwCisjZGVmaW5lIEVGSV9TVEFUVVNfQ09ERV9SRVNFUlZFRF9NQVNLIDB4MDBGRkZGMDAKKworLy8KKy8vIERlZmluaXRpb24gb2YgY29kZSB0eXBlcywgYWxsIG90aGVyIHZhbHVlcyBtYXNrZWQgYnkKKy8vIEVGSV9TVEFUVVNfQ09ERV9UWVBFX01BU0sgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkKKy8vIHRoaXMgc3BlY2lmaWNhdGlvbi4KKy8vCisjZGVmaW5lIEVGSV9QUk9HUkVTU19DT0RFICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUZJX0VSUk9SX0NPREUgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFRklfREVCVUdfQ09ERSAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisKKy8vCisvLyBEZWZpbml0aW9ucyBvZiBzZXZlcml0aWVzLCBhbGwgb3RoZXIgdmFsdWVzIG1hc2tlZCBieQorLy8gRUZJX1NUQVRVU19DT0RFX1NFVkVSSVRZX01BU0sgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkKKy8vIHRoaXMgc3BlY2lmaWNhdGlvbi4KKy8vIFVuY29udGFpbmVkIGVycm9ycyBhcmUgbWFqb3IgZXJyb3JzIHRoYXQgY291bGQgbm90IGNvbnRhaW5lZAorLy8gdG8gdGhlIHNwZWNpZmljIGNvbXBvbmVudCB0aGF0IGlzIHJlcG9ydGluZyB0aGUgZXJyb3IKKy8vIEZvciBleGFtcGxlLCBpZiBhIG1lbW9yeSBlcnJvciB3YXMgbm90IGRldGVjdGVkIGVhcmx5IGVub3VnaCwKKy8vIHRoZSBiYWQgZGF0YSBjb3VsZCBiZSBjb25zdW1lZCBieSBvdGhlciBkcml2ZXJzLgorLy8KKyNkZWZpbmUgRUZJX0VSUk9SX01JTk9SICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBFRklfRVJST1JfTUFKT1IgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEVGSV9FUlJPUl9VTlJFQ09WRVJFRCAgICAgICAgIDB4OTAwMDAwMDAKKyNkZWZpbmUgRUZJX0VSUk9SX1VOQ09OVEFJTkVEICAgICAgICAgMHhhMDAwMDAwMAorCisvLy8KKy8vLyBTdGF0dXMgQ29kZSBWYWx1ZSBEZWZpbml0aW9uCisvLy8KK3R5cGVkZWYgVUlOVDMyIEVGSV9TVEFUVVNfQ09ERV9WQUxVRTsKKworLy8KKy8vIEEgU3RhdHVzIENvZGUgVmFsdWUgaXMgbWFkZSB1cCBvZiB0aGUgY2xhc3MsIHN1YmNsYXNzLCBhbmQKKy8vIGFuIG9wZXJhdGlvbi4KKy8vCisjZGVmaW5lIEVGSV9TVEFUVVNfQ09ERV9DTEFTU19NQVNLICAgICAgMHhGRjAwMDAwMAorI2RlZmluZSBFRklfU1RBVFVTX0NPREVfU1VCQ0xBU1NfTUFTSyAgIDB4MDBGRjAwMDAKKyNkZWZpbmUgRUZJX1NUQVRVU19DT0RFX09QRVJBVElPTl9NQVNLICAweDAwMDBGRkZGCisKKy8vLworLy8vIERlZmluaXRpb24gb2YgU3RhdHVzIENvZGUgZXh0ZW5kZWQgZGF0YSBoZWFkZXIuCisvLy8gVGhlIGRhdGEgd2lsbCBmb2xsb3cgSGVhZGVyU2l6ZSBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKKy8vLyB0aGUgc3RydWN0dXJlIGFuZCBpcyBTaXplIGJ5dGVzIGxvbmcuCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDE2ICAgIEhlYWRlclNpemU7CisgIFVJTlQxNiAgICBTaXplOworICBFRklfR1VJRCAgVHlwZTsKK30gRUZJX1NUQVRVU19DT0RFX0RBVEE7CisKKworLy8KKy8vIEJpdCB2YWx1ZXMgZm9yIEF1dGhlbnRpY2F0aW9uIFN0YXR1cworLy8KKyNkZWZpbmUgRUZJX0FVVEhfU1RBVFVTX1BMQVRGT1JNX09WRVJSSURFICAgMHgwMQorI2RlZmluZSBFRklfQVVUSF9TVEFUVVNfSU1BR0VfU0lHTkVEICAgICAgICAweDAyCisjZGVmaW5lIEVGSV9BVVRIX1NUQVRVU19OT1RfVEVTVEVEICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUZJX0FVVEhfU1RBVFVTX1RFU1RfRkFJTEVEICAgICAgICAgMHgwOAorI2RlZmluZSBFRklfQVVUSF9TVEFUVVNfQUxMICAgICAgICAgICAgICAgICAweDBmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9QaUR4ZS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9QaUR4ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjYzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1BpRHhlLmgKQEAgLTAsMCArMSwyNSBAQAorLyoqIEBmaWxlCisKKyAgUm9vdCBpbmNsdWRlIGZpbGUgZm9yIE1kZSBQYWNrYWdlIERYRV9DT1JFLCBEWEUsIFNNTSwgU0FMIHR5cGUgbW9kdWxlcy4KKworQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwNywgSW50ZWwgQ29ycG9yYXRpb24KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAoraHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCitUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyoqLworCisjaWZuZGVmIF9fUElfRFhFX0hfXworI2RlZmluZSBfX1BJX0RYRV9IX18KKworI2luY2x1ZGUgPGdweGUvZWZpL1VlZmkvVWVmaUJhc2VUeXBlLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvVWVmaS9VZWZpU3BlYy5oPgorCisjaW5jbHVkZSA8Z3B4ZS9lZmkvUGkvUGlEeGVDaXMuaD4KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvY2Vzc29yQmluZC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm9jZXNzb3JCaW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiYWYxYgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvY2Vzc29yQmluZC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBFRkkgaGVhZGVyIGZpbGVzIHJlbHkgb24gaGF2aW5nIHRoZSBDUFUgYXJjaGl0ZWN0dXJlIGRpcmVjdG9yeQorICogcHJlc2VudCBpbiB0aGUgc2VhcmNoIHBhdGggaW4gb3JkZXIgdG8gcGljayB1cCBQcm9jZXNzb3JCaW5kLmguICBXZQorICogdXNlIHRoaXMgaGVhZGVyIGZpbGUgYXMgYSBxdWljayBpbmRpcmVjdGlvbiBsYXllci4KKyAqICAtIG1jYjMwCisgKi8KKworI2lmIF9faTM4Nl9fCisjaW5jbHVkZSA8Z3B4ZS9lZmkvSWEzMi9Qcm9jZXNzb3JCaW5kLmg+CisjZW5kaWYKKworI2lmIF9feDg2XzY0X18KKyNpbmNsdWRlIDxncHhlL2VmaS9YNjQvUHJvY2Vzc29yQmluZC5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL0NvbXBvbmVudE5hbWUyLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL0NvbXBvbmVudE5hbWUyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMTAxNAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvQ29tcG9uZW50TmFtZTIuaApAQCAtMCwwICsxLDE3NCBAQAorLyoqIEBmaWxlCisgIFVFRkkgQ29tcG9uZW50IE5hbWUgMiBQcm90b2NvbCBhcyBkZWZpbmVkIGluIHRoZSBVRUZJIDIuMSBzcGVjaWZpY2F0aW9uLgorICBUaGlzIHByb3RvY29sIGlzIHVzZWQgdG8gcmV0cmlldmUgdXNlciByZWFkYWJsZSBuYW1lcyBvZiBkcml2ZXJzCisgIGFuZCBjb250cm9sbGVycyBtYW5hZ2VkIGJ5IFVFRkkgRHJpdmVycy4KKworICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CisgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworKiovCisKKyNpZm5kZWYgX19FRklfQ09NUE9ORU5UX05BTUUyX0hfXworI2RlZmluZSBfX0VGSV9DT01QT05FTlRfTkFNRTJfSF9fCisKKy8vLworLy8vIEdsb2JhbCBJRCBmb3IgdGhlIENvbXBvbmVudCBOYW1lIFByb3RvY29sCisvLy8KKyNkZWZpbmUgRUZJX0NPTVBPTkVOVF9OQU1FMl9QUk9UT0NPTF9HVUlEIFwKKyAgezB4NmE3YTVjZmYsIDB4ZThkOSwgMHg0ZjcwLCB7IDB4YmEsIDB4ZGEsIDB4NzUsIDB4YWIsIDB4MzAsIDB4MjUsIDB4Y2UsIDB4MTQgfSB9CisKK3R5cGVkZWYgc3RydWN0IF9FRklfQ09NUE9ORU5UX05BTUUyX1BST1RPQ09MICBFRklfQ09NUE9ORU5UX05BTUUyX1BST1RPQ09MOworCisKKy8qKgorICBSZXRyaWV2ZXMgYSBVbmljb2RlIHN0cmluZyB0aGF0IGlzIHRoZSB1c2VyIHJlYWRhYmxlIG5hbWUgb2YKKyAgdGhlIEVGSSBEcml2ZXIuCisKKyAgQHBhcmFtICBUaGlzICAgICAgIEEgcG9pbnRlciB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgIEVGSV9DT01QT05FTlRfTkFNRTJfUFJPVE9DT0wgaW5zdGFuY2UuCisKKyAgQHBhcmFtICBMYW5ndWFnZSAgIEEgcG9pbnRlciB0byBhIE51bGwtdGVybWluYXRlZCBBU0NJSSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgIGFycmF5IGluZGljYXRpbmcgdGhlIGxhbmd1YWdlLiBUaGlzIGlzIHRoZQorICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2Ugb2YgdGhlIGRyaXZlciBuYW1lIHRoYXQgdGhlIGNhbGxlcgorICAgICAgICAgICAgICAgICAgICAgaXMgcmVxdWVzdGluZywgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VzIHNwZWNpZmllZCBpbiBTdXBwb3J0ZWRMYW5ndWFnZXMuCisgICAgICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGxhbmd1YWdlcyBzdXBwb3J0ZWQgYnkgYQorICAgICAgICAgICAgICAgICAgICAgZHJpdmVyIGlzIHVwIHRvIHRoZSBkcml2ZXIgd3JpdGVyLiBMYW5ndWFnZQorICAgICAgICAgICAgICAgICAgICAgaXMgc3BlY2lmaWVkIGluIFJGQyAzMDY2IGxhbmd1YWdlIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC4KKworICBAcGFyYW0gIERyaXZlck5hbWUgQSBwb2ludGVyIHRvIHRoZSBVbmljb2RlIHN0cmluZyB0byByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICBUaGlzIFVuaWNvZGUgc3RyaW5nIGlzIHRoZSBuYW1lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgZHJpdmVyIHNwZWNpZmllZCBieSBUaGlzIGluIHRoZSBsYW5ndWFnZQorICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IExhbmd1YWdlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBVbmljb2RlIHN0cmluZyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBzcGVjaWZpZWQgYnkgVGhpcyBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlIHNwZWNpZmllZCBieSBMYW5ndWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgcmV0dXJuZWQgaW4gRHJpdmVyTmFtZS4KKworICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBMYW5ndWFnZSBpcyBOVUxMLgorCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIERyaXZlck5hbWUgaXMgTlVMTC4KKworICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgZHJpdmVyIHNwZWNpZmllZCBieSBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHN1cHBvcnQgdGhlIGxhbmd1YWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSBMYW5ndWFnZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ09NUE9ORU5UX05BTUUyX0dFVF9EUklWRVJfTkFNRSkoCisgIElOIEVGSV9DT01QT05FTlRfTkFNRTJfUFJPVE9DT0wgICAgICAgICAgKlRoaXMsCisgIElOICBDSEFSOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxhbmd1YWdlLAorICBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqRHJpdmVyTmFtZQorICApOworCisKKy8qKgorICBSZXRyaWV2ZXMgYSBVbmljb2RlIHN0cmluZyB0aGF0IGlzIHRoZSB1c2VyIHJlYWRhYmxlIG5hbWUgb2YKKyAgdGhlIGNvbnRyb2xsZXIgdGhhdCBpcyBiZWluZyBtYW5hZ2VkIGJ5IGFuIEVGSSBEcml2ZXIuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9DT01QT05FTlRfTkFNRTJfUFJPVE9DT0wgaW5zdGFuY2UuCisKKyAgQHBhcmFtICBDb250cm9sbGVySGFuZGxlIFRoZSBoYW5kbGUgb2YgYSBjb250cm9sbGVyIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgc3BlY2lmaWVkIGJ5IFRoaXMgaXMgbWFuYWdpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGhhbmRsZSBzcGVjaWZpZXMgdGhlIGNvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIG5hbWUgaXMgdG8gYmUgcmV0dXJuZWQuCisKKyAgQHBhcmFtIENoaWxkSGFuZGxlICAgICAgVGhlIGhhbmRsZSBvZiB0aGUgY2hpbGQgY29udHJvbGxlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmUgdGhlIG5hbWUgb2YuICBUaGlzIGlzIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBtYXkgYmUgTlVMTC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgTlVMTCBmb3IgZGV2aWNlIGRyaXZlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCB3aWxsIGFsc28gYmUgTlVMTCBmb3IgYSBidXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcnMgdGhhdCB3aXNoIHRvIHJldHJpZXZlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBvZiB0aGUgYnVzIGNvbnRyb2xsZXIuICBJdCB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgTlVMTCBmb3IgYSBidXMgZHJpdmVyIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpc2hlcyB0byByZXRyaWV2ZSB0aGUgbmFtZSBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCBjb250cm9sbGVyLgorCisgIEBwYXJhbSAgTGFuZ3VhZ2UgICAgICAgICBBIHBvaW50ZXIgdG8gYSBOdWxsLXRlcm1pbmF0ZWQgQVNDSUkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcnJheSBpbmRpY2F0aW5nIHRoZSBsYW5ndWFnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGxhbmd1YWdlIG9mIHRoZSBkcml2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgdGhhdCB0aGUgY2FsbGVyIGlzIHJlcXVlc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZXMgc3BlY2lmaWVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwb3J0ZWRMYW5ndWFnZXMuIFRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlcyBzdXBwb3J0ZWQgYnkgYSBkcml2ZXIgaXMgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBkcml2ZXIgd3JpdGVyLiBMYW5ndWFnZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGluIFJGQyAzMDY2IGxhbmd1YWdlIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC4KKworICBAcGFyYW0gIENvbnRyb2xsZXJOYW1lICAgQSBwb2ludGVyIHRvIHRoZSBVbmljb2RlIHN0cmluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLiAgVGhpcyBVbmljb2RlIHN0cmluZyBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbnRyb2xsZXIgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlIGFuZCBDaGlsZEhhbmRsZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxhbmd1YWdlIHNwZWNpZmllZCBieSBMYW5ndWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgZHJpdmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgVGhpcy4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgVW5pY29kZSBzdHJpbmcgZm9yIHRoZSB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRhYmxlIG5hbWUgaW4gdGhlIGxhbmd1YWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSBMYW5ndWFnZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciBzcGVjaWZpZWQgYnkgVGhpcyB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgaW4gRHJpdmVyTmFtZS4KKworICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBDb250cm9sbGVySGFuZGxlIGlzIG5vdCBhIHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9IQU5ETEUuCisKKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQ2hpbGRIYW5kbGUgaXMgbm90IE5VTEwgYW5kIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhIHZhbGlkIEVGSV9IQU5ETEUuCisKKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgTGFuZ3VhZ2UgaXMgTlVMTC4KKworICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBDb250cm9sbGVyTmFtZSBpcyBOVUxMLgorCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoZSBkcml2ZXIgc3BlY2lmaWVkIGJ5IFRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGN1cnJlbnRseSBtYW5hZ2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hpbGRIYW5kbGUuCisKKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIGRyaXZlciBzcGVjaWZpZWQgYnkgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IHRoZSBsYW5ndWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgTGFuZ3VhZ2UuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0NPTVBPTkVOVF9OQU1FMl9HRVRfQ09OVFJPTExFUl9OQU1FKSgKKyAgSU4gRUZJX0NPTVBPTkVOVF9OQU1FMl9QUk9UT0NPTCAqVGhpcywKKyAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlLAorICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgIENoaWxkSGFuZGxlICAgICAgICBPUFRJT05BTCwKKyAgSU4gIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAqTGFuZ3VhZ2UsCisgIE9VVCBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgKipDb250cm9sbGVyTmFtZQorICApOworCisvLy8KKy8vLyBUaGlzIHByb3RvY29sIGlzIHVzZWQgdG8gcmV0cmlldmUgdXNlciByZWFkYWJsZSBuYW1lcyBvZiBkcml2ZXJzCisvLy8gYW5kIGNvbnRyb2xsZXJzIG1hbmFnZWQgYnkgVUVGSSBEcml2ZXJzLgorLy8vCitzdHJ1Y3QgX0VGSV9DT01QT05FTlRfTkFNRTJfUFJPVE9DT0wgeworICBFRklfQ09NUE9ORU5UX05BTUUyX0dFVF9EUklWRVJfTkFNRSAgICAgIEdldERyaXZlck5hbWU7CisgIEVGSV9DT01QT05FTlRfTkFNRTJfR0VUX0NPTlRST0xMRVJfTkFNRSAgR2V0Q29udHJvbGxlck5hbWU7CisKKyAgLy8vCisgIC8vLyBBIE51bGwtdGVybWluYXRlZCBBU0NJSSBzdHJpbmcgYXJyYXkgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZQorICAvLy8gc3VwcG9ydGVkIGxhbmd1YWdlIGNvZGVzLiBUaGlzIGlzIHRoZSBsaXN0IG9mIGxhbmd1YWdlIGNvZGVzIHRoYXQKKyAgLy8vIHRoaXMgcHJvdG9jb2wgc3VwcG9ydHMuIFRoZSBudW1iZXIgb2YgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSBhCisgIC8vLyBkcml2ZXIgaXMgdXAgdG8gdGhlIGRyaXZlciB3cml0ZXIuIFN1cHBvcnRlZExhbmd1YWdlcyBpcworICAvLy8gc3BlY2lmaWVkIGluIFJGQyAzMDY2IGZvcm1hdC4KKyAgLy8vCisgIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlN1cHBvcnRlZExhbmd1YWdlczsKK307CisKK2V4dGVybiBFRklfR1VJRCBnRWZpQ29tcG9uZW50TmFtZTJQcm90b2NvbEd1aWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9DcHUuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvQ3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzZDBmZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvQ3B1LmgKQEAgLTAsMCArMSwyOTEgQEAKKy8qKiBAZmlsZQorICBDUFUgQXJjaGl0ZWN0dXJhbCBQcm90b2NvbCBhcyBkZWZpbmVkIGluIFBJIHNwZWMgVm9sdW1lIDIgRFhFCisKKyAgVGhpcyBjb2RlIGFic3RyYWN0cyB0aGUgRFhFIGNvcmUgZnJvbSBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KKworICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CisgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworKiovCisKKyNpZm5kZWYgX19BUkNIX1BST1RPQ09MX0NQVV9IX18KKyNkZWZpbmUgX19BUkNIX1BST1RPQ09MX0NQVV9IX18KKworI2luY2x1ZGUgPGdweGUvZWZpL1Byb3RvY29sL0RlYnVnU3VwcG9ydC5oPgorCisjZGVmaW5lIEVGSV9DUFVfQVJDSF9QUk9UT0NPTF9HVUlEIFwKKyAgeyAweDI2YmFjY2IxLCAweDZmNDIsIDB4MTFkNCwgezB4YmMsIDB4ZTcsIDB4MCwgMHg4MCwgMHhjNywgMHgzYywgMHg4OCwgMHg4MSB9IH0KKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9DUFVfQVJDSF9QUk9UT0NPTCAgIEVGSV9DUFVfQVJDSF9QUk9UT0NPTDsKKwordHlwZWRlZiBlbnVtIHsKKyAgRWZpQ3B1Rmx1c2hUeXBlV3JpdGVCYWNrSW52YWxpZGF0ZSwKKyAgRWZpQ3B1Rmx1c2hUeXBlV3JpdGVCYWNrLAorICBFZmlDcHVGbHVzaFR5cGVJbnZhbGlkYXRlLAorICBFZmlDcHVNYXhGbHVzaFR5cGUKK30gRUZJX0NQVV9GTFVTSF9UWVBFOworCit0eXBlZGVmIGVudW0geworICBFZmlDcHVJbml0LAorICBFZmlDcHVNYXhJbml0VHlwZQorfSBFRklfQ1BVX0lOSVRfVFlQRTsKKworLyoqCisgIEVGSV9DUFVfSU5URVJSVVBUX0hBTkRMRVIgdGhhdCBpcyBjYWxsZWQgd2hlbiBhIHByb2Nlc3NvciBpbnRlcnJ1cHQgb2NjdXJzLgorCisgIEBwYXJhbSAgSW50ZXJydXB0VHlwZSAgICBEZWZpbmVzIHRoZSB0eXBlIG9mIGludGVycnVwdCBvciBleGNlcHRpb24gdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWQgb24gdGhlIHByb2Nlc3Nvci5UaGlzIHBhcmFtZXRlciBpcyBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljLgorICBAcGFyYW0gIFN5c3RlbUNvbnRleHQgICAgQSBwb2ludGVyIHRvIHRoZSBwcm9jZXNzb3IgY29udGV4dCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJydXB0IG9jY3VycmVkIG9uIHRoZSBwcm9jZXNzb3IuCisKKyAgQHJldHVybiBOb25lCisKKyoqLwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX0NQVV9JTlRFUlJVUFRfSEFORExFUikoCisgIElOIENPTlNUICBFRklfRVhDRVBUSU9OX1RZUEUgIEludGVycnVwdFR5cGUsCisgIElOIENPTlNUICBFRklfU1lTVEVNX0NPTlRFWFQgIFN5c3RlbUNvbnRleHQKKyAgKTsKKworLyoqCisgIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyB0aGUgcmFuZ2Ugb2YgYWRkcmVzc2VzIGZyb20gU3RhcnQgdG8gU3RhcnQrTGVuZ3RoCisgIGZyb20gdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGUuIElmIFN0YXJ0IGlzIG5vdCBhbGlnbmVkIHRvIGEgY2FjaGUgbGluZQorICBib3VuZGFyeSwgdGhlbiB0aGUgYnl0ZXMgYmVmb3JlIFN0YXJ0IHRvIHRoZSBwcmVjZWRpbmcgY2FjaGUgbGluZSBib3VuZGFyeQorICBhcmUgYWxzbyBmbHVzaGVkLiBJZiBTdGFydCtMZW5ndGggaXMgbm90IGFsaWduZWQgdG8gYSBjYWNoZSBsaW5lIGJvdW5kYXJ5LAorICB0aGVuIHRoZSBieXRlcyBwYXN0IFN0YXJ0K0xlbmd0aCB0byB0aGUgZW5kIG9mIHRoZSBuZXh0IGNhY2hlIGxpbmUgYm91bmRhcnkKKyAgYXJlIGFsc28gZmx1c2hlZC4gVGhlIEZsdXNoVHlwZSBvZiBFZmlDcHVGbHVzaFR5cGVXcml0ZUJhY2tJbnZhbGlkYXRlIG11c3QgYmUKKyAgc3VwcG9ydGVkLiBJZiB0aGUgZGF0YSBjYWNoZSBpcyBmdWxseSBjb2hlcmVudCB3aXRoIGFsbCBETUEgb3BlcmF0aW9ucywgdGhlbgorICB0aGlzIGZ1bmN0aW9uIGNhbiBqdXN0IHJldHVybiBFRklfU1VDQ0VTUy4gSWYgdGhlIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0CisgIGZsdXNoaW5nIGEgcmFuZ2Ugb2YgdGhlIGRhdGEgY2FjaGUsIHRoZW4gdGhlIGVudGlyZSBkYXRhIGNhY2hlIGNhbiBiZSBmbHVzaGVkLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICBUaGUgRUZJX0NQVV9BUkNIX1BST1RPQ09MIGluc3RhbmNlLgorICBAcGFyYW0gIFN0YXJ0ICAgICAgICAgICAgVGhlIGJlZ2lubmluZyBwaHlzaWNhbCBhZGRyZXNzIHRvIGZsdXNoIGZyb20gdGhlIHByb2Nlc3NvcidzIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLgorICBAcGFyYW0gIExlbmd0aCAgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0byBmbHVzaCBmcm9tIHRoZSBwcm9jZXNzb3IncyBkYXRhIGNhY2hlLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtYXkgZmx1c2ggbW9yZSBieXRlcyB0aGFuIExlbmd0aCBzcGVjaWZpZXMgZGVwZW5kaW5nIHVwb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBncmFudWxhcml0eSBvZiB0aGUgZmx1c2ggb3BlcmF0aW9uIHRoYXQgdGhlIHByb2Nlc3NvciBzdXBwb3J0cy4KKyAgQHBhcmFtICBGbHVzaFR5cGUgICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBmbHVzaCBvcGVyYXRpb24gdG8gcGVyZm9ybS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgYWRkcmVzcyByYW5nZSBmcm9tIFN0YXJ0IHRvIFN0YXJ0K0xlbmd0aCB3YXMgZmx1c2hlZCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9jZXNzb3IncyBkYXRhIGNhY2hlLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRFQgICAgICBUaGUgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhY2hlIGZsdXNoIHR5cGUgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IEZsdXNoVHlwZS4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGFkZHJlc3MgcmFuZ2UgZnJvbSBTdGFydCB0byBTdGFydCtMZW5ndGggY291bGQgbm90IGJlIGZsdXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ1BVX0ZMVVNIX0RBVEFfQ0FDSEUpKAorICBJTiBFRklfQ1BVX0FSQ0hfUFJPVE9DT0wgICAgICAgICAgICAgICpUaGlzLAorICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgICAgIFN0YXJ0LAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCwKKyAgSU4gRUZJX0NQVV9GTFVTSF9UWVBFICAgICAgICAgICAgICAgICBGbHVzaFR5cGUKKyAgKTsKKworCisvKioKKyAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIGludGVycnVwdCBwcm9jZXNzaW5nIGJ5IHRoZSBwcm9jZXNzb3IuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgIFRoZSBFRklfQ1BVX0FSQ0hfUFJPVE9DT0wgaW5zdGFuY2UuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgSW50ZXJydXB0cyBhcmUgZW5hYmxlZCBvbiB0aGUgcHJvY2Vzc29yLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBJbnRlcnJ1cHRzIGNvdWxkIG5vdCBiZSBlbmFibGVkIG9uIHRoZSBwcm9jZXNzb3IuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0NQVV9FTkFCTEVfSU5URVJSVVBUKSgKKyAgSU4gRUZJX0NQVV9BUkNIX1BST1RPQ09MICAgICAgICAgICAgICAqVGhpcworICApOworCisKKy8qKgorICBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIGludGVycnVwdCBwcm9jZXNzaW5nIGJ5IHRoZSBwcm9jZXNzb3IuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgIFRoZSBFRklfQ1BVX0FSQ0hfUFJPVE9DT0wgaW5zdGFuY2UuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgb24gdGhlIHByb2Nlc3Nvci4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgSW50ZXJydXB0cyBjb3VsZCBub3QgYmUgZGlzYWJsZWQgb24gdGhlIHByb2Nlc3Nvci4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ1BVX0RJU0FCTEVfSU5URVJSVVBUKSgKKyAgSU4gRUZJX0NQVV9BUkNIX1BST1RPQ09MICAgICAgICAgICAgICAqVGhpcworICApOworCisKKy8qKgorICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgcHJvY2Vzc29yJ3MgY3VycmVudCBpbnRlcnJ1cHQgc3RhdGUgYSByZXR1cm5zIGl0IGluCisgIFN0YXRlLiBJZiBpbnRlcnJ1cHRzIGFyZSBjdXJyZW50bHkgZW5hYmxlZCwgdGhlbiBUUlVFIGlzIHJldHVybmVkLiBJZiBpbnRlcnJ1cHRzCisgIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQsIHRoZW4gRkFMU0UgaXMgcmV0dXJuZWQuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgIFRoZSBFRklfQ1BVX0FSQ0hfUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgU3RhdGUgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIHByb2Nlc3NvcidzIGN1cnJlbnQgaW50ZXJydXB0IHN0YXRlLiBTZXQgdG8gVFJVRSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBhbmQgRkFMU0UgaWYgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHByb2Nlc3NvcidzIGN1cnJlbnQgaW50ZXJydXB0IHN0YXRlIHdhcyByZXR1cm5lZCBpbiBTdGF0ZS4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgU3RhdGUgaXMgTlVMTC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ1BVX0dFVF9JTlRFUlJVUFRfU1RBVEUpKAorICBJTiBFRklfQ1BVX0FSQ0hfUFJPVE9DT0wgICAgICAgICAgICAgICpUaGlzLAorICBPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdGF0ZQorICApOworCisKKy8qKgorICBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhbiBJTklUIG9uIHRoZSBwcm9jZXNzb3IuIElmIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMsIHRoZW4gdGhlCisgIHByb2Nlc3NvciB3aWxsIGJlIHJlc2V0LCBhbmQgY29udHJvbCB3aWxsIG5vdCBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiBJZiBJbml0VHlwZSBpcworICBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcHJvY2Vzc29yLCBvciB0aGUgcHJvY2Vzc29yIGNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlIGFuCisgIElOSVQgd2l0aG91dCBoZWxwIGZyb20gZXh0ZXJuYWwgaGFyZHdhcmUsIHRoZW4gRUZJX1VOU1VQUE9SVEVEIGlzIHJldHVybmVkLiBJZiBhbiBlcnJvcgorICBvY2N1cnMgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBhbiBJTklULCB0aGVuIEVGSV9ERVZJQ0VfRVJST1IgaXMgcmV0dXJuZWQuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgIFRoZSBFRklfQ1BVX0FSQ0hfUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgSW5pdFR5cGUgICAgICAgICBUaGUgdHlwZSBvZiBwcm9jZXNzb3IgSU5JVCB0byBwZXJmb3JtLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBwcm9jZXNzb3IgSU5JVCB3YXMgcGVyZm9ybWVkLiBUaGlzIHJldHVybiBjb2RlIHNob3VsZCBuZXZlciBiZSBzZWVuLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgcHJvY2Vzc29yIElOSVQgb3BlcmF0aW9uIHNwZWNpZmllZCBieSBJbml0VHlwZSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgcHJvY2Vzc29yLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgcHJvY2Vzc29yIElOSVQgZmFpbGVkLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DUFVfSU5JVCkoCisgIElOIEVGSV9DUFVfQVJDSF9QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsCisgIElOIEVGSV9DUFVfSU5JVF9UWVBFICAgICAgICAgICAgICAgICAgSW5pdFR5cGUKKyAgKTsKKworCisvKioKKyAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgYW5kIGVuYWJsZXMgdGhlIGhhbmRsZXIgc3BlY2lmaWVkIGJ5IEludGVycnVwdEhhbmRsZXIgZm9yIGEgcHJvY2Vzc29yCisgIGludGVycnVwdCBvciBleGNlcHRpb24gdHlwZSBzcGVjaWZpZWQgYnkgSW50ZXJydXB0VHlwZS4gSWYgSW50ZXJydXB0SGFuZGxlciBpcyBOVUxMLCB0aGVuIHRoZQorICBoYW5kbGVyIGZvciB0aGUgcHJvY2Vzc29yIGludGVycnVwdCBvciBleGNlcHRpb24gdHlwZSBzcGVjaWZpZWQgYnkgSW50ZXJydXB0VHlwZSBpcyB1bmluc3RhbGxlZC4KKyAgVGhlIGluc3RhbGxlZCBoYW5kbGVyIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHByb2Nlc3NvciBpbnRlcnJ1cHQgb3IgZXhjZXB0aW9uLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICBUaGUgRUZJX0NQVV9BUkNIX1BST1RPQ09MIGluc3RhbmNlLgorICBAcGFyYW0gIEludGVycnVwdFR5cGUgICAgQSBwb2ludGVyIHRvIHRoZSBwcm9jZXNzb3IncyBjdXJyZW50IGludGVycnVwdCBzdGF0ZS4gU2V0IHRvIFRSVUUgaWYgaW50ZXJydXB0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGVuYWJsZWQgYW5kIEZBTFNFIGlmIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgorICBAcGFyYW0gIEludGVycnVwdEhhbmRsZXIgQSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gb2YgdHlwZSBFRklfQ1BVX0lOVEVSUlVQVF9IQU5ETEVSIHRoYXQgaXMgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGEgcHJvY2Vzc29yIGludGVycnVwdCBvY2N1cnMuIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZW4gdGhlIGhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdW5pbnN0YWxsZWQuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGhhbmRsZXIgZm9yIHRoZSBwcm9jZXNzb3IgaW50ZXJydXB0IHdhcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIG9yIHVuaW5zdGFsbGVkLgorICBAcmV0dmFsIEVGSV9BTFJFQURZX1NUQVJURUQgICBJbnRlcnJ1cHRIYW5kbGVyIGlzIG5vdCBOVUxMLCBhbmQgYSBoYW5kbGVyIGZvciBJbnRlcnJ1cHRUeXBlIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5IGluc3RhbGxlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgSW50ZXJydXB0SGFuZGxlciBpcyBOVUxMLCBhbmQgYSBoYW5kbGVyIGZvciBJbnRlcnJ1cHRUeXBlIHdhcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNseSBpbnN0YWxsZWQuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoZSBpbnRlcnJ1cHQgc3BlY2lmaWVkIGJ5IEludGVycnVwdFR5cGUgaXMgbm90IHN1cHBvcnRlZC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ1BVX1JFR0lTVEVSX0lOVEVSUlVQVF9IQU5ETEVSKSgKKyAgSU4gRUZJX0NQVV9BUkNIX1BST1RPQ09MICAgICAgICAgICAgICAqVGhpcywKKyAgSU4gRUZJX0VYQ0VQVElPTl9UWVBFICAgICAgICAgICAgICAgICBJbnRlcnJ1cHRUeXBlLAorICBJTiBFRklfQ1BVX0lOVEVSUlVQVF9IQU5ETEVSICAgICAgICAgIEludGVycnVwdEhhbmRsZXIKKyAgKTsKKworCisvKioKKyAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgcHJvY2Vzc29yIHRpbWVyIHNwZWNpZmllZCBieSBUaW1lckluZGV4IGFuZCByZXR1cm5zIGl0IGluIFRpbWVyVmFsdWUuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgIFRoZSBFRklfQ1BVX0FSQ0hfUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgVGltZXJJbmRleCAgICAgICBTcGVjaWZpZXMgd2hpY2ggcHJvY2Vzc29yIHRpbWVyIGlzIHRvIGJlIHJldHVybmVkIGluIFRpbWVyVmFsdWUuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGJldHdlZW4gMCBhbmQgTnVtYmVyT2ZUaW1lcnMtMS4KKyAgQHBhcmFtICBUaW1lclZhbHVlICAgICAgIFBvaW50ZXIgdG8gdGhlIHJldHVybmVkIHRpbWVyIHZhbHVlLgorICBAcGFyYW0gIFRpbWVyUGVyaW9kICAgICAgQSBwb2ludGVyIHRvIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHBhc3NlcyBpbiBmZW10b3NlY29uZHMgZm9yIGVhY2ggaW5jcmVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBUaW1lclZhbHVlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBwcm9jZXNzb3IgdGltZXIgdmFsdWUgc3BlY2lmaWVkIGJ5IFRpbWVySW5kZXggd2FzIHJldHVybmVkIGluIFRpbWVyVmFsdWUuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIEFuIGVycm9yIG9jY3VycmVkIGF0dGVtcHRpbmcgdG8gcmVhZCBvbmUgb2YgdGhlIHByb2Nlc3NvcidzIHRpbWVycy4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgVGltZXJWYWx1ZSBpcyBOVUxMIG9yIFRpbWVySW5kZXggaXMgbm90IHZhbGlkLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgcHJvY2Vzc29yIGRvZXMgbm90IGhhdmUgYW55IHJlYWRhYmxlIHRpbWVycy4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ1BVX0dFVF9USU1FUl9WQUxVRSkoCisgIElOIEVGSV9DUFVfQVJDSF9QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsCisgIElOIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJJbmRleCwKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGltZXJWYWx1ZSwKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGltZXJQZXJpb2QgT1BUSU9OQUwKKyAgKTsKKworCisvKioKKyAgVGhpcyBmdW5jdGlvbiBtb2RpZmllcyB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIG1lbW9yeSByZWdpb24gc3BlY2lmaWVkIGJ5IEJhc2VBZGRyZXNzIGFuZAorICBMZW5ndGggZnJvbSB0aGVpciBjdXJyZW50IGF0dHJpYnV0ZXMgdG8gdGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGJ5IEF0dHJpYnV0ZXMuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgIFRoZSBFRklfQ1BVX0FSQ0hfUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgQmFzZUFkZHJlc3MgICAgICBUaGUgcGh5c2ljYWwgYWRkcmVzcyB0aGF0IGlzIHRoZSBzdGFydCBhZGRyZXNzIG9mIGEgbWVtb3J5IHJlZ2lvbi4KKyAgQHBhcmFtICBMZW5ndGggICAgICAgICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgcmVnaW9uLgorICBAcGFyYW0gIEF0dHJpYnV0ZXMgICAgICAgVGhlIGJpdCBtYXNrIG9mIGF0dHJpYnV0ZXMgdG8gc2V0IGZvciB0aGUgbWVtb3J5IHJlZ2lvbi4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgYXR0cmlidXRlcyB3ZXJlIHNldCBmb3IgdGhlIG1lbW9yeSByZWdpb24uCisgIEByZXR2YWwgRUZJX0FDQ0VTU19ERU5JRUQgICAgIFRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgbWVtb3J5IHJlc291cmNlIHJhbmdlIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQWRkcmVzcyBhbmQgTGVuZ3RoIGNhbm5vdCBiZSBtb2RpZmllZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgTGVuZ3RoIGlzIHplcm8uCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHN5c3RlbSByZXNvdXJjZXMgdG8gbW9kaWZ5IHRoZSBhdHRyaWJ1dGVzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZW1vcnkgcmVzb3VyY2UgcmFuZ2UuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoZSBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBvbmUgb3IgbW9yZSBieXRlcyBvZiB0aGUgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIHJhbmdlIHNwZWNpZmllZCBieSBCYXNlQWRkcmVzcyBhbmQgTGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYml0IG1hc2sgb2YgYXR0cmlidXRlcyBpcyBub3Qgc3VwcG9ydCBmb3IgdGhlIG1lbW9yeSByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSBzcGVjaWZpZWQgYnkgQmFzZUFkZHJlc3MgYW5kIExlbmd0aC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ1BVX1NFVF9NRU1PUllfQVRUUklCVVRFUykoCisgIElOIEVGSV9DUFVfQVJDSF9QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsCisgIElOICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgICAgQmFzZUFkZHJlc3MsCisgIElOICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoLAorICBJTiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMKKyAgKTsKKworCisvLy8KKy8vLyBUaGUgRUZJX0NQVV9BUkNIX1BST1RPQ09MIGlzIHVzZWQgdG8gYWJzdHJhY3QgcHJvY2Vzc29yLXNwZWNpZmljIGZ1bmN0aW9ucyBmcm9tIHRoZSBEWEUKKy8vLyBGb3VuZGF0aW9uLiBUaGlzIGluY2x1ZGVzIGZsdXNoaW5nIGNhY2hlcywgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBpbnRlcnJ1cHRzLCBob29raW5nIGludGVycnVwdAorLy8vIHZlY3RvcnMgYW5kIGV4Y2VwdGlvbiB2ZWN0b3JzLCByZWFkaW5nIGludGVybmFsIHByb2Nlc3NvciB0aW1lcnMsIHJlc2V0dGluZyB0aGUgcHJvY2Vzc29yLCBhbmQKKy8vLyBkZXRlcm1pbmluZyB0aGUgcHJvY2Vzc29yIGZyZXF1ZW5jeS4KKy8vLworc3RydWN0IF9FRklfQ1BVX0FSQ0hfUFJPVE9DT0wgeworICBFRklfQ1BVX0ZMVVNIX0RBVEFfQ0FDSEUgICAgICAgICAgICBGbHVzaERhdGFDYWNoZTsKKyAgRUZJX0NQVV9FTkFCTEVfSU5URVJSVVBUICAgICAgICAgICAgRW5hYmxlSW50ZXJydXB0OworICBFRklfQ1BVX0RJU0FCTEVfSU5URVJSVVBUICAgICAgICAgICBEaXNhYmxlSW50ZXJydXB0OworICBFRklfQ1BVX0dFVF9JTlRFUlJVUFRfU1RBVEUgICAgICAgICBHZXRJbnRlcnJ1cHRTdGF0ZTsKKyAgRUZJX0NQVV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgSW5pdDsKKyAgRUZJX0NQVV9SRUdJU1RFUl9JTlRFUlJVUFRfSEFORExFUiAgUmVnaXN0ZXJJbnRlcnJ1cHRIYW5kbGVyOworICBFRklfQ1BVX0dFVF9USU1FUl9WQUxVRSAgICAgICAgICAgICBHZXRUaW1lclZhbHVlOworICBFRklfQ1BVX1NFVF9NRU1PUllfQVRUUklCVVRFUyAgICAgICBTZXRNZW1vcnlBdHRyaWJ1dGVzOworICAvLy8KKyAgLy8vIFRoZSBudW1iZXIgb2YgdGltZXJzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiBhIHByb2Nlc3Nvci4gVGhlIHZhbHVlIGluIHRoaXMKKyAgLy8vIGZpZWxkIGlzIGEgY29uc3RhbnQgdGhhdCBtdXN0IG5vdCBiZSBtb2RpZmllZCBhZnRlciB0aGUgQ1BVIEFyY2hpdGVjdHVyYWwKKyAgLy8vIFByb3RvY29sIGlzIGluc3RhbGxlZC4gQWxsIGNvbnN1bWVycyBtdXN0IHRyZWF0IHRoaXMgYXMgYSByZWFkLW9ubHkgZmllbGQuCisgIC8vLworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlRpbWVyczsKKyAgLy8vCisgIC8vLyBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIERNQSBidWZmZXIgYWxsb2NhdGlvbnMuCisgIC8vLyBUaGlzIGlzIHR5cGljYWxseSB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBkYXRhIGNhY2hlIGxpbmUgaW4gdGhlIHBsYXRmb3JtLgorICAvLy8gVGhlIHZhbHVlIGluIHRoaXMgZmllbGQgaXMgYSBjb25zdGFudCB0aGF0IG11c3Qgbm90IGJlIG1vZGlmaWVkIGFmdGVyIHRoZQorICAvLy8gQ1BVIEFyY2hpdGVjdHVyYWwgUHJvdG9jb2wgaXMgaW5zdGFsbGVkLiBBbGwgY29uc3VtZXJzIG11c3QgdHJlYXQgdGhpcyBhcworICAvLy8gYSByZWFkLW9ubHkgZmllbGQuCisgIC8vLworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEbWFCdWZmZXJBbGlnbm1lbnQ7Cit9OworCitleHRlcm4gRUZJX0dVSUQgZ0VmaUNwdUFyY2hQcm90b2NvbEd1aWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9DcHVJby5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9DcHVJby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzVjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL0NwdUlvLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qKiBAZmlsZQorICBUaGlzIGNvZGUgYWJzdHJhY3RzIHRoZSBDUFUgSU8gUHJvdG9jb2wgd2hpY2ggaW5zdGFsbGVkIGJ5IHNvbWUgcGxhdGZvcm0gb3IgY2hpcHNldC1zcGVjaWZpYworICBQRUlNIHRoYXQgYWJzdHJhY3RzIHRoZSBwcm9jZXNzb3ItdmlzaWJsZSBJL08gb3BlcmF0aW9ucy4KKworICBDb3B5cmlnaHQgKGMpIDIwMDcsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisgIE1vZHVsZSBOYW1lOiAgQ3B1SU8uaAorCisgIEBwYXIgUmV2aXNpb24gUmVmZXJlbmNlOgorICBDUFUgSU8gUHJvdG9jb2wgaXMgZGVmaW5lZCBpbiBGcmFtZXdvcmsgb2YgRUZJIENQVSBJTyBQcm90b2NvbCBTcGVjCisgIFZlcnNpb24gMC45CisKKyoqLworCisjaWZuZGVmIF9DUFVJT19IXworI2RlZmluZSBfQ1BVSU9fSF8KKworI2luY2x1ZGUgPGdweGUvZWZpL1BpRHhlLmg+CisKKyNkZWZpbmUgRUZJX0NQVV9JT19QUk9UT0NPTF9HVUlEIFwKKyAgeyBcCisgICAgMHhCMDczMjUyNiwgMHgzOEM4LCAweDRiNDAsIHsweDg4LCAweDc3LCAweDYxLCAweEM3LCAweEIwLCAweDZBLCAweEFDLCAweDQ1IH0gXAorICB9CisKK3R5cGVkZWYgc3RydWN0IF9FRklfQ1BVX0lPX1BST1RPQ09MIEVGSV9DUFVfSU9fUFJPVE9DT0w7CisKKy8vCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBFRklfQ1BVX0lPX1BST1RPQ09MX1dJRFRICisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLwordHlwZWRlZiBlbnVtIHsKKyAgRWZpQ3B1SW9XaWR0aFVpbnQ4LAorICBFZmlDcHVJb1dpZHRoVWludDE2LAorICBFZmlDcHVJb1dpZHRoVWludDMyLAorICBFZmlDcHVJb1dpZHRoVWludDY0LAorICBFZmlDcHVJb1dpZHRoRmlmb1VpbnQ4LAorICBFZmlDcHVJb1dpZHRoRmlmb1VpbnQxNiwKKyAgRWZpQ3B1SW9XaWR0aEZpZm9VaW50MzIsCisgIEVmaUNwdUlvV2lkdGhGaWZvVWludDY0LAorICBFZmlDcHVJb1dpZHRoRmlsbFVpbnQ4LAorICBFZmlDcHVJb1dpZHRoRmlsbFVpbnQxNiwKKyAgRWZpQ3B1SW9XaWR0aEZpbGxVaW50MzIsCisgIEVmaUNwdUlvV2lkdGhGaWxsVWludDY0LAorICBFZmlDcHVJb1dpZHRoTWF4aW11bQorfSBFRklfQ1BVX0lPX1BST1RPQ09MX1dJRFRIOworCisvLworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRUZJX0NQVV9JT19QUk9UT0NPTF9JT19NRU0KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvKioKKyAgRW5hYmxlcyBhIGRyaXZlciB0byBhY2Nlc3MgbWVtb3J5LW1hcHBlZCByZWdpc3RlcnMgaW4gdGhlIEVGSSBzeXN0ZW0gbWVtb3J5IHNwYWNlLgorICBPciwgRW5hYmxlcyBhIGRyaXZlciB0byBhY2Nlc3MgcmVnaXN0ZXJzIGluIHRoZSBFRkkgQ1BVIEkvTyBzcGFjZS4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9DUFVfSU9fUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgV2lkdGggICAgICAgICAgICAgICAgIFNpZ25pZmllcyB0aGUgd2lkdGggb2YgdGhlIEkvTyBvciBNZW1vcnkgb3BlcmF0aW9uLgorICBAcGFyYW0gIEFkZHJlc3MgICAgICAgICAgICAgICBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBJL08gb3IgTWVtb3J5b3BlcmF0aW9uLgorICBAcGFyYW0gIENvdW50ICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIEkvTyBvciBNZW1vcnkgb3BlcmF0aW9ucyB0byBwZXJmb3JtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIG1vdmVkIGlzIFdpZHRoIHNpemUgKiBDb3VudCwgc3RhcnRpbmcgYXQgQWRkcmVzcy4KKyAgQHBhcmFtICBCdWZmZXIgICAgICAgICAgICAgICAgRm9yIHJlYWQgb3BlcmF0aW9ucywgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVzdWx0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHdyaXRlIG9wZXJhdGlvbnMsIHRoZSBzb3VyY2UgYnVmZmVyIGZyb20gd2hpY2ggdG8gd3JpdGUgZGF0YS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZGF0YSB3YXMgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gdGhlIEVGSSBzeXN0ZW0uCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFdpZHRoIGlzIGludmFsaWQgZm9yIHRoaXMgRUZJIHN5c3RlbS5PciBCdWZmZXIgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIEJ1ZmZlciBpcyBub3QgYWxpZ25lZCBmb3IgdGhlIGdpdmVuIFdpZHRoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcixUaGUgYWRkcmVzcyByYW5nZSBzcGVjaWZpZWQgYnkgQWRkcmVzcywgV2lkdGgsIGFuZCBDb3VudCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgRUZJIHN5c3RlbS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ1BVX0lPX1BST1RPQ09MX0lPX01FTSkoCisgIElOIEVGSV9DUFVfSU9fUFJPVE9DT0wgICAgICAgICAgICAgICAgKlRoaXMsCisgIElOICBFRklfQ1BVX0lPX1BST1RPQ09MX1dJRFRIICAgICAgICAgV2lkdGgsCisgIElOICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcywKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCwKKyAgSU4gIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICk7CisKKy8vCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBFRklfQ1BVX0lPX1BST1RPQ09MX0FDQ0VTUworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0NQVV9JT19QUk9UT0NPTF9JT19NRU0gIFJlYWQ7CisgIEVGSV9DUFVfSU9fUFJPVE9DT0xfSU9fTUVNICBXcml0ZTsKK30gRUZJX0NQVV9JT19QUk9UT0NPTF9BQ0NFU1M7CisKKy8vCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBFRklfQ1BVX0lPX1BST1RPQ09MCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLyoqCisgIEBwYXIgUHJvdG9jb2wgRGVzY3JpcHRpb246CisgIFByb3ZpZGVzIHRoZSBiYXNpYyBtZW1vcnkgYW5kIEkvTyBpbnRlcmZhY2VzIHRoYXQgYXJlIHVzZWQgdG8gYWJzdHJhY3QKKyAgYWNjZXNzZXMgdG8gZGV2aWNlcyBpbiBhIHN5c3RlbS4KKworICBAcGFyYW0gTWVtLlJlYWQKKyAgQWxsb3dzIHJlYWRzIGZyb20gbWVtb3J5LW1hcHBlZCBJL08gc3BhY2UuCisKKyAgQHBhcmFtIE1lbS5Xcml0ZQorICBBbGxvd3Mgd3JpdGVzIHRvIG1lbW9yeS1tYXBwZWQgSS9PIHNwYWNlLgorCisgIEBwYXJhbSBJby5SZWFkCisgIEFsbG93cyByZWFkcyBmcm9tIEkvTyBzcGFjZS4KKworICBAcGFyYW0gSW8uV3JpdGUKKyAgQWxsb3dzIHdyaXRlcyB0byBJL08gc3BhY2UuCisKKyoqLworc3RydWN0IF9FRklfQ1BVX0lPX1BST1RPQ09MIHsKKyAgRUZJX0NQVV9JT19QUk9UT0NPTF9BQ0NFU1MgIE1lbTsKKyAgRUZJX0NQVV9JT19QUk9UT0NPTF9BQ0NFU1MgIElvOworfTsKKworZXh0ZXJuIEVGSV9HVUlEIGdFZmlDcHVJb1Byb3RvY29sR3VpZDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL0RlYnVnU3VwcG9ydC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9EZWJ1Z1N1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGRiMjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9EZWJ1Z1N1cHBvcnQuaApAQCAtMCwwICsxLDYzNCBAQAorLyoqIEBmaWxlCisgIERlYnVnU3VwcG9ydCBwcm90b2NvbCBhbmQgc3VwcG9ydGluZyBkZWZpbml0aW9ucyBhcyBkZWZpbmVkIGluIHRoZSBVRUZJMi4wCisgIHNwZWNpZmljYXRpb24uCisKKyAgVGhlIERlYnVnU3VwcG9ydCBwcm90b2NvbCBpcyB1c2VkIGJ5IHNvdXJjZSBsZXZlbCBkZWJ1Z2dlcnMgdG8gYWJzdHJhY3QgdGhlCisgIHByb2Nlc3NvciBhbmQgaGFuZGxlIGNvbnRleHQgc2F2ZSBhbmQgcmVzdG9yZSBvcGVyYXRpb25zLgorCisgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisqKi8KKworI2lmbmRlZiBfX0RFQlVHX1NVUFBPUlRfSF9fCisjZGVmaW5lIF9fREVCVUdfU1VQUE9SVF9IX18KKworI2luY2x1ZGUgPGdweGUvZWZpL1Byb2Nlc3NvckJpbmQuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9JbmR1c3RyeVN0YW5kYXJkL1BlSW1hZ2UuaD4KKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ERUJVR19TVVBQT1JUX1BST1RPQ09MIEVGSV9ERUJVR19TVVBQT1JUX1BST1RPQ09MOworCisvLy8KKy8vLyBEZWJ1ZyBTdXBwb3J0IHByb3RvY29sIHsyNzU1NTkwQy02RjNDLTQyRkEtOUVBNC1BM0JBNTQzQ0RBMjV9CisvLy8KKyNkZWZpbmUgRUZJX0RFQlVHX1NVUFBPUlRfUFJPVE9DT0xfR1VJRCBcCisgIHsgXAorICAgIDB4Mjc1NTU5MEMsIDB4NkYzQywgMHg0MkZBLCB7MHg5RSwgMHhBNCwgMHhBMywgMHhCQSwgMHg1NCwgMHgzQywgMHhEQSwgMHgyNSB9IFwKKyAgfQorCisvLy8KKy8vLyBEZWJ1ZyBTdXBwb3J0IGRlZmluaXRpb25zCisvLy8KK3R5cGVkZWYgSU5UTiAgRUZJX0VYQ0VQVElPTl9UWVBFOworCisvLworLy8gIElBLTMyIHByb2Nlc3NvciBleGNlcHRpb24gdHlwZXMKKy8vCisjZGVmaW5lIEVYQ0VQVF9JQTMyX0RJVklERV9FUlJPUiAgICAwCisjZGVmaW5lIEVYQ0VQVF9JQTMyX0RFQlVHICAgICAgICAgICAxCisjZGVmaW5lIEVYQ0VQVF9JQTMyX05NSSAgICAgICAgICAgICAyCisjZGVmaW5lIEVYQ0VQVF9JQTMyX0JSRUFLUE9JTlQgICAgICAzCisjZGVmaW5lIEVYQ0VQVF9JQTMyX09WRVJGTE9XICAgICAgICA0CisjZGVmaW5lIEVYQ0VQVF9JQTMyX0JPVU5EICAgICAgICAgICA1CisjZGVmaW5lIEVYQ0VQVF9JQTMyX0lOVkFMSURfT1BDT0RFICA2CisjZGVmaW5lIEVYQ0VQVF9JQTMyX0RPVUJMRV9GQVVMVCAgICA4CisjZGVmaW5lIEVYQ0VQVF9JQTMyX0lOVkFMSURfVFNTICAgICAxMAorI2RlZmluZSBFWENFUFRfSUEzMl9TRUdfTk9UX1BSRVNFTlQgMTEKKyNkZWZpbmUgRVhDRVBUX0lBMzJfU1RBQ0tfRkFVTFQgICAgIDEyCisjZGVmaW5lIEVYQ0VQVF9JQTMyX0dQX0ZBVUxUICAgICAgICAxMworI2RlZmluZSBFWENFUFRfSUEzMl9QQUdFX0ZBVUxUICAgICAgMTQKKyNkZWZpbmUgRVhDRVBUX0lBMzJfRlBfRVJST1IgICAgICAgIDE2CisjZGVmaW5lIEVYQ0VQVF9JQTMyX0FMSUdOTUVOVF9DSEVDSyAxNworI2RlZmluZSBFWENFUFRfSUEzMl9NQUNISU5FX0NIRUNLICAgMTgKKyNkZWZpbmUgRVhDRVBUX0lBMzJfU0lNRCAgICAgICAgICAgIDE5CisKKy8vLworLy8vICBJQS0zMiBwcm9jZXNzb3IgY29udGV4dCBkZWZpbml0aW9uCisvLy8KKy8vLworLy8vIEZYU0FWRV9TVEFURQorLy8vIEZQIC8gTU1YIC8gWE1NIHJlZ2lzdGVycyAoc2VlIGZ4cnN0b3IgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbikKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMTYgIEZjdzsKKyAgVUlOVDE2ICBGc3c7CisgIFVJTlQxNiAgRnR3OworICBVSU5UMTYgIE9wY29kZTsKKyAgVUlOVDMyICBFaXA7CisgIFVJTlQxNiAgQ3M7CisgIFVJTlQxNiAgUmVzZXJ2ZWQxOworICBVSU5UMzIgIERhdGFPZmZzZXQ7CisgIFVJTlQxNiAgRHM7CisgIFVJTlQ4ICAgUmVzZXJ2ZWQyWzEwXTsKKyAgVUlOVDggICBTdDBNbTBbMTBdLCBSZXNlcnZlZDNbNl07CisgIFVJTlQ4ICAgU3QxTW0xWzEwXSwgUmVzZXJ2ZWQ0WzZdOworICBVSU5UOCAgIFN0Mk1tMlsxMF0sIFJlc2VydmVkNVs2XTsKKyAgVUlOVDggICBTdDNNbTNbMTBdLCBSZXNlcnZlZDZbNl07CisgIFVJTlQ4ICAgU3Q0TW00WzEwXSwgUmVzZXJ2ZWQ3WzZdOworICBVSU5UOCAgIFN0NU1tNVsxMF0sIFJlc2VydmVkOFs2XTsKKyAgVUlOVDggICBTdDZNbTZbMTBdLCBSZXNlcnZlZDlbNl07CisgIFVJTlQ4ICAgU3Q3TW03WzEwXSwgUmVzZXJ2ZWQxMFs2XTsKKyAgVUlOVDggICBYbW0wWzE2XTsKKyAgVUlOVDggICBYbW0xWzE2XTsKKyAgVUlOVDggICBYbW0yWzE2XTsKKyAgVUlOVDggICBYbW0zWzE2XTsKKyAgVUlOVDggICBYbW00WzE2XTsKKyAgVUlOVDggICBYbW01WzE2XTsKKyAgVUlOVDggICBYbW02WzE2XTsKKyAgVUlOVDggICBYbW03WzE2XTsKKyAgVUlOVDggICBSZXNlcnZlZDExWzE0ICogMTZdOworfSBFRklfRlhfU0FWRV9TVEFURV9JQTMyOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgRXhjZXB0aW9uRGF0YTsKKyAgRUZJX0ZYX1NBVkVfU1RBVEVfSUEzMiBGeFNhdmVTdGF0ZTsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBEcjA7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgRHIxOworICBVSU5UMzIgICAgICAgICAgICAgICAgIERyMjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBEcjM7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgRHI2OworICBVSU5UMzIgICAgICAgICAgICAgICAgIERyNzsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBDcjA7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgQ3IxOyAgLyogUmVzZXJ2ZWQgKi8KKyAgVUlOVDMyICAgICAgICAgICAgICAgICBDcjI7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgQ3IzOworICBVSU5UMzIgICAgICAgICAgICAgICAgIENyNDsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBFZmxhZ3M7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgTGR0cjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBUcjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBHZHRyWzJdOworICBVSU5UMzIgICAgICAgICAgICAgICAgIElkdHJbMl07CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgRWlwOworICBVSU5UMzIgICAgICAgICAgICAgICAgIEdzOworICBVSU5UMzIgICAgICAgICAgICAgICAgIEZzOworICBVSU5UMzIgICAgICAgICAgICAgICAgIEVzOworICBVSU5UMzIgICAgICAgICAgICAgICAgIERzOworICBVSU5UMzIgICAgICAgICAgICAgICAgIENzOworICBVSU5UMzIgICAgICAgICAgICAgICAgIFNzOworICBVSU5UMzIgICAgICAgICAgICAgICAgIEVkaTsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBFc2k7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgRWJwOworICBVSU5UMzIgICAgICAgICAgICAgICAgIEVzcDsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBFYng7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgRWR4OworICBVSU5UMzIgICAgICAgICAgICAgICAgIEVjeDsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBFYXg7Cit9IEVGSV9TWVNURU1fQ09OVEVYVF9JQTMyOworCisvLworLy8gIFg2NCBwcm9jZXNzb3IgZXhjZXB0aW9uIHR5cGVzCisvLworI2RlZmluZSBFWENFUFRfWDY0X0RJVklERV9FUlJPUiAgICAwCisjZGVmaW5lIEVYQ0VQVF9YNjRfREVCVUcgICAgICAgICAgIDEKKyNkZWZpbmUgRVhDRVBUX1g2NF9OTUkgICAgICAgICAgICAgMgorI2RlZmluZSBFWENFUFRfWDY0X0JSRUFLUE9JTlQgICAgICAzCisjZGVmaW5lIEVYQ0VQVF9YNjRfT1ZFUkZMT1cgICAgICAgIDQKKyNkZWZpbmUgRVhDRVBUX1g2NF9CT1VORCAgICAgICAgICAgNQorI2RlZmluZSBFWENFUFRfWDY0X0lOVkFMSURfT1BDT0RFICA2CisjZGVmaW5lIEVYQ0VQVF9YNjRfRE9VQkxFX0ZBVUxUICAgIDgKKyNkZWZpbmUgRVhDRVBUX1g2NF9JTlZBTElEX1RTUyAgICAgMTAKKyNkZWZpbmUgRVhDRVBUX1g2NF9TRUdfTk9UX1BSRVNFTlQgMTEKKyNkZWZpbmUgRVhDRVBUX1g2NF9TVEFDS19GQVVMVCAgICAgMTIKKyNkZWZpbmUgRVhDRVBUX1g2NF9HUF9GQVVMVCAgICAgICAgMTMKKyNkZWZpbmUgRVhDRVBUX1g2NF9QQUdFX0ZBVUxUICAgICAgMTQKKyNkZWZpbmUgRVhDRVBUX1g2NF9GUF9FUlJPUiAgICAgICAgMTYKKyNkZWZpbmUgRVhDRVBUX1g2NF9BTElHTk1FTlRfQ0hFQ0sgMTcKKyNkZWZpbmUgRVhDRVBUX1g2NF9NQUNISU5FX0NIRUNLICAgMTgKKyNkZWZpbmUgRVhDRVBUX1g2NF9TSU1EICAgICAgICAgICAgMTkKKworLy8vCisvLy8gIFg2NCBwcm9jZXNzb3IgY29udGV4dCBkZWZpbml0aW9uCisvLy8KKy8vLyBGWFNBVkVfU1RBVEUKKy8vLyBGUCAvIE1NWCAvIFhNTSByZWdpc3RlcnMgKHNlZSBmeHJzdG9yIGluc3RydWN0aW9uIGRlZmluaXRpb24pCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDE2ICBGY3c7CisgIFVJTlQxNiAgRnN3OworICBVSU5UMTYgIEZ0dzsKKyAgVUlOVDE2ICBPcGNvZGU7CisgIFVJTlQ2NCAgUmlwOworICBVSU5UNjQgIERhdGFPZmZzZXQ7CisgIFVJTlQ4ICAgUmVzZXJ2ZWQxWzhdOworICBVSU5UOCAgIFN0ME1tMFsxMF0sIFJlc2VydmVkMls2XTsKKyAgVUlOVDggICBTdDFNbTFbMTBdLCBSZXNlcnZlZDNbNl07CisgIFVJTlQ4ICAgU3QyTW0yWzEwXSwgUmVzZXJ2ZWQ0WzZdOworICBVSU5UOCAgIFN0M01tM1sxMF0sIFJlc2VydmVkNVs2XTsKKyAgVUlOVDggICBTdDRNbTRbMTBdLCBSZXNlcnZlZDZbNl07CisgIFVJTlQ4ICAgU3Q1TW01WzEwXSwgUmVzZXJ2ZWQ3WzZdOworICBVSU5UOCAgIFN0Nk1tNlsxMF0sIFJlc2VydmVkOFs2XTsKKyAgVUlOVDggICBTdDdNbTdbMTBdLCBSZXNlcnZlZDlbNl07CisgIFVJTlQ4ICAgWG1tMFsxNl07CisgIFVJTlQ4ICAgWG1tMVsxNl07CisgIFVJTlQ4ICAgWG1tMlsxNl07CisgIFVJTlQ4ICAgWG1tM1sxNl07CisgIFVJTlQ4ICAgWG1tNFsxNl07CisgIFVJTlQ4ICAgWG1tNVsxNl07CisgIFVJTlQ4ICAgWG1tNlsxNl07CisgIFVJTlQ4ICAgWG1tN1sxNl07CisgIC8vCisgIC8vIE5PVEU6IFVFRkkgMi4wIHNwZWMgZGVmaW5pdGlvbiBhcyBmb2xsb3dzLgorICAvLworICBVSU5UOCAgIFJlc2VydmVkMTFbMTQgKiAxNl07Cit9IEVGSV9GWF9TQVZFX1NUQVRFX1g2NDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UNjQgICAgICAgICAgICAgICAgRXhjZXB0aW9uRGF0YTsKKyAgRUZJX0ZYX1NBVkVfU1RBVEVfWDY0IEZ4U2F2ZVN0YXRlOworICBVSU5UNjQgICAgICAgICAgICAgICAgRHIwOworICBVSU5UNjQgICAgICAgICAgICAgICAgRHIxOworICBVSU5UNjQgICAgICAgICAgICAgICAgRHIyOworICBVSU5UNjQgICAgICAgICAgICAgICAgRHIzOworICBVSU5UNjQgICAgICAgICAgICAgICAgRHI2OworICBVSU5UNjQgICAgICAgICAgICAgICAgRHI3OworICBVSU5UNjQgICAgICAgICAgICAgICAgQ3IwOworICBVSU5UNjQgICAgICAgICAgICAgICAgQ3IxOyAgLyogUmVzZXJ2ZWQgKi8KKyAgVUlOVDY0ICAgICAgICAgICAgICAgIENyMjsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIENyMzsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIENyNDsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIENyODsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIFJmbGFnczsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIExkdHI7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICBUcjsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIEdkdHJbMl07CisgIFVJTlQ2NCAgICAgICAgICAgICAgICBJZHRyWzJdOworICBVSU5UNjQgICAgICAgICAgICAgICAgUmlwOworICBVSU5UNjQgICAgICAgICAgICAgICAgR3M7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICBGczsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIEVzOworICBVSU5UNjQgICAgICAgICAgICAgICAgRHM7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICBDczsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIFNzOworICBVSU5UNjQgICAgICAgICAgICAgICAgUmRpOworICBVSU5UNjQgICAgICAgICAgICAgICAgUnNpOworICBVSU5UNjQgICAgICAgICAgICAgICAgUmJwOworICBVSU5UNjQgICAgICAgICAgICAgICAgUnNwOworICBVSU5UNjQgICAgICAgICAgICAgICAgUmJ4OworICBVSU5UNjQgICAgICAgICAgICAgICAgUmR4OworICBVSU5UNjQgICAgICAgICAgICAgICAgUmN4OworICBVSU5UNjQgICAgICAgICAgICAgICAgUmF4OworICBVSU5UNjQgICAgICAgICAgICAgICAgUjg7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICBSOTsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIFIxMDsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIFIxMTsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIFIxMjsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIFIxMzsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIFIxNDsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIFIxNTsKK30gRUZJX1NZU1RFTV9DT05URVhUX1g2NDsKKworLy8KKy8vICBJUEYgcHJvY2Vzc29yIGV4Y2VwdGlvbiB0eXBlcworLy8KKyNkZWZpbmUgRVhDRVBUX0lQRl9WSFRQX1RSQU5TTEFUSU9OICAgICAgIDAKKyNkZWZpbmUgRVhDRVBUX0lQRl9JTlNUUlVDVElPTl9UTEIgICAgICAgIDEKKyNkZWZpbmUgRVhDRVBUX0lQRl9EQVRBX1RMQiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRVhDRVBUX0lQRl9BTFRfSU5TVFJVQ1RJT05fVExCICAgIDMKKyNkZWZpbmUgRVhDRVBUX0lQRl9BTFRfREFUQV9UTEIgICAgICAgICAgIDQKKyNkZWZpbmUgRVhDRVBUX0lQRl9EQVRBX05FU1RFRF9UTEIgICAgICAgIDUKKyNkZWZpbmUgRVhDRVBUX0lQRl9JTlNUUlVDVElPTl9LRVlfTUlTU0VEIDYKKyNkZWZpbmUgRVhDRVBUX0lQRl9EQVRBX0tFWV9NSVNTRUQgICAgICAgIDcKKyNkZWZpbmUgRVhDRVBUX0lQRl9ESVJUWV9CSVQgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRVhDRVBUX0lQRl9JTlNUUlVDVElPTl9BQ0NFU1NfQklUIDkKKyNkZWZpbmUgRVhDRVBUX0lQRl9EQVRBX0FDQ0VTU19CSVQgICAgICAgIDEwCisjZGVmaW5lIEVYQ0VQVF9JUEZfQlJFQUtQT0lOVCAgICAgICAgICAgICAxMQorI2RlZmluZSBFWENFUFRfSVBGX0VYVEVSTkFMX0lOVEVSUlVQVCAgICAgMTIKKy8vCisvLyAxMyAtIDE5IHJlc2VydmVkCisvLworI2RlZmluZSBFWENFUFRfSVBGX1BBR0VfTk9UX1BSRVNFTlQgICAgICAgICAgIDIwCisjZGVmaW5lIEVYQ0VQVF9JUEZfS0VZX1BFUk1JU1NJT04gICAgICAgICAgICAgMjEKKyNkZWZpbmUgRVhDRVBUX0lQRl9JTlNUUlVDVElPTl9BQ0NFU1NfUklHSFRTICAyMgorI2RlZmluZSBFWENFUFRfSVBGX0RBVEFfQUNDRVNTX1JJR0hUUyAgICAgICAgIDIzCisjZGVmaW5lIEVYQ0VQVF9JUEZfR0VORVJBTF9FWENFUFRJT04gICAgICAgICAgMjQKKyNkZWZpbmUgRVhDRVBUX0lQRl9ESVNBQkxFRF9GUF9SRUdJU1RFUiAgICAgICAyNQorI2RlZmluZSBFWENFUFRfSVBGX05BVF9DT05TVU1QVElPTiAgICAgICAgICAgIDI2CisjZGVmaW5lIEVYQ0VQVF9JUEZfU1BFQ1VMQVRJT04gICAgICAgICAgICAgICAgMjcKKy8vCisvLyAyOCByZXNlcnZlZAorLy8KKyNkZWZpbmUgRVhDRVBUX0lQRl9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgMjkKKyNkZWZpbmUgRVhDRVBUX0lQRl9VTkFMSUdORURfUkVGRVJFTkNFICAgICAgICAgICAgMzAKKyNkZWZpbmUgRVhDRVBUX0lQRl9VTlNVUFBPUlRFRF9EQVRBX1JFRkVSRU5DRSAgICAgMzEKKyNkZWZpbmUgRVhDRVBUX0lQRl9GUF9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgRVhDRVBUX0lQRl9GUF9UUkFQICAgICAgICAgICAgICAgICAgICAgICAgMzMKKyNkZWZpbmUgRVhDRVBUX0lQRl9MT1dFUl9QUklWSUxFR0VfVFJBTlNGRVJfVFJBUCAgMzQKKyNkZWZpbmUgRVhDRVBUX0lQRl9UQUtFTl9CUkFOQ0ggICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgRVhDRVBUX0lQRl9TSU5HTEVfU1RFUCAgICAgICAgICAgICAgICAgICAgMzYKKy8vCisvLyAzNyAtIDQ0IHJlc2VydmVkCisvLworI2RlZmluZSBFWENFUFRfSVBGX0lBMzJfRVhDRVBUSU9OIDQ1CisjZGVmaW5lIEVYQ0VQVF9JUEZfSUEzMl9JTlRFUkNFUFQgNDYKKyNkZWZpbmUgRVhDRVBUX0lQRl9JQTMyX0lOVEVSUlVQVCA0NworCisvLy8KKy8vLyAgSVBGIHByb2Nlc3NvciBjb250ZXh0IGRlZmluaXRpb24KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICAvLworICAvLyBUaGUgZmlyc3QgcmVzZXJ2ZWQgZmllbGQgaXMgbmVjZXNzYXJ5IHRvIHByZXNlcnZlIGFsaWdubWVudCBmb3IgdGhlIGNvcnJlY3QKKyAgLy8gYml0cyBpbiBVTkFUIGFuZCB0byBpbnN1cmUgRjIgaXMgMTYgYnl0ZSBhbGlnbmVkLi4KKyAgLy8KKyAgVUlOVDY0ICBSZXNlcnZlZDsKKyAgVUlOVDY0ICBSMTsKKyAgVUlOVDY0ICBSMjsKKyAgVUlOVDY0ICBSMzsKKyAgVUlOVDY0ICBSNDsKKyAgVUlOVDY0ICBSNTsKKyAgVUlOVDY0ICBSNjsKKyAgVUlOVDY0ICBSNzsKKyAgVUlOVDY0ICBSODsKKyAgVUlOVDY0ICBSOTsKKyAgVUlOVDY0ICBSMTA7CisgIFVJTlQ2NCAgUjExOworICBVSU5UNjQgIFIxMjsKKyAgVUlOVDY0ICBSMTM7CisgIFVJTlQ2NCAgUjE0OworICBVSU5UNjQgIFIxNTsKKyAgVUlOVDY0ICBSMTY7CisgIFVJTlQ2NCAgUjE3OworICBVSU5UNjQgIFIxODsKKyAgVUlOVDY0ICBSMTk7CisgIFVJTlQ2NCAgUjIwOworICBVSU5UNjQgIFIyMTsKKyAgVUlOVDY0ICBSMjI7CisgIFVJTlQ2NCAgUjIzOworICBVSU5UNjQgIFIyNDsKKyAgVUlOVDY0ICBSMjU7CisgIFVJTlQ2NCAgUjI2OworICBVSU5UNjQgIFIyNzsKKyAgVUlOVDY0ICBSMjg7CisgIFVJTlQ2NCAgUjI5OworICBVSU5UNjQgIFIzMDsKKyAgVUlOVDY0ICBSMzE7CisKKyAgVUlOVDY0ICBGMlsyXTsKKyAgVUlOVDY0ICBGM1syXTsKKyAgVUlOVDY0ICBGNFsyXTsKKyAgVUlOVDY0ICBGNVsyXTsKKyAgVUlOVDY0ICBGNlsyXTsKKyAgVUlOVDY0ICBGN1syXTsKKyAgVUlOVDY0ICBGOFsyXTsKKyAgVUlOVDY0ICBGOVsyXTsKKyAgVUlOVDY0ICBGMTBbMl07CisgIFVJTlQ2NCAgRjExWzJdOworICBVSU5UNjQgIEYxMlsyXTsKKyAgVUlOVDY0ICBGMTNbMl07CisgIFVJTlQ2NCAgRjE0WzJdOworICBVSU5UNjQgIEYxNVsyXTsKKyAgVUlOVDY0ICBGMTZbMl07CisgIFVJTlQ2NCAgRjE3WzJdOworICBVSU5UNjQgIEYxOFsyXTsKKyAgVUlOVDY0ICBGMTlbMl07CisgIFVJTlQ2NCAgRjIwWzJdOworICBVSU5UNjQgIEYyMVsyXTsKKyAgVUlOVDY0ICBGMjJbMl07CisgIFVJTlQ2NCAgRjIzWzJdOworICBVSU5UNjQgIEYyNFsyXTsKKyAgVUlOVDY0ICBGMjVbMl07CisgIFVJTlQ2NCAgRjI2WzJdOworICBVSU5UNjQgIEYyN1syXTsKKyAgVUlOVDY0ICBGMjhbMl07CisgIFVJTlQ2NCAgRjI5WzJdOworICBVSU5UNjQgIEYzMFsyXTsKKyAgVUlOVDY0ICBGMzFbMl07CisKKyAgVUlOVDY0ICBQcjsKKworICBVSU5UNjQgIEIwOworICBVSU5UNjQgIEIxOworICBVSU5UNjQgIEIyOworICBVSU5UNjQgIEIzOworICBVSU5UNjQgIEI0OworICBVSU5UNjQgIEI1OworICBVSU5UNjQgIEI2OworICBVSU5UNjQgIEI3OworCisgIC8vCisgIC8vIGFwcGxpY2F0aW9uIHJlZ2lzdGVycworICAvLworICBVSU5UNjQgIEFyUnNjOworICBVSU5UNjQgIEFyQnNwOworICBVSU5UNjQgIEFyQnNwc3RvcmU7CisgIFVJTlQ2NCAgQXJSbmF0OworCisgIFVJTlQ2NCAgQXJGY3I7CisKKyAgVUlOVDY0ICBBckVmbGFnOworICBVSU5UNjQgIEFyQ3NkOworICBVSU5UNjQgIEFyU3NkOworICBVSU5UNjQgIEFyQ2ZsZzsKKyAgVUlOVDY0ICBBckZzcjsKKyAgVUlOVDY0ICBBckZpcjsKKyAgVUlOVDY0ICBBckZkcjsKKworICBVSU5UNjQgIEFyQ2N2OworCisgIFVJTlQ2NCAgQXJVbmF0OworCisgIFVJTlQ2NCAgQXJGcHNyOworCisgIFVJTlQ2NCAgQXJQZnM7CisgIFVJTlQ2NCAgQXJMYzsKKyAgVUlOVDY0ICBBckVjOworCisgIC8vCisgIC8vIGNvbnRyb2wgcmVnaXN0ZXJzCisgIC8vCisgIFVJTlQ2NCAgQ3JEY3I7CisgIFVJTlQ2NCAgQ3JJdG07CisgIFVJTlQ2NCAgQ3JJdmE7CisgIFVJTlQ2NCAgQ3JQdGE7CisgIFVJTlQ2NCAgQ3JJcHNyOworICBVSU5UNjQgIENySXNyOworICBVSU5UNjQgIENySWlwOworICBVSU5UNjQgIENySWZhOworICBVSU5UNjQgIENySXRpcjsKKyAgVUlOVDY0ICBDcklpcGE7CisgIFVJTlQ2NCAgQ3JJZnM7CisgIFVJTlQ2NCAgQ3JJaW07CisgIFVJTlQ2NCAgQ3JJaGE7CisKKyAgLy8KKyAgLy8gZGVidWcgcmVnaXN0ZXJzCisgIC8vCisgIFVJTlQ2NCAgRGJyMDsKKyAgVUlOVDY0ICBEYnIxOworICBVSU5UNjQgIERicjI7CisgIFVJTlQ2NCAgRGJyMzsKKyAgVUlOVDY0ICBEYnI0OworICBVSU5UNjQgIERicjU7CisgIFVJTlQ2NCAgRGJyNjsKKyAgVUlOVDY0ICBEYnI3OworCisgIFVJTlQ2NCAgSWJyMDsKKyAgVUlOVDY0ICBJYnIxOworICBVSU5UNjQgIElicjI7CisgIFVJTlQ2NCAgSWJyMzsKKyAgVUlOVDY0ICBJYnI0OworICBVSU5UNjQgIElicjU7CisgIFVJTlQ2NCAgSWJyNjsKKyAgVUlOVDY0ICBJYnI3OworCisgIC8vCisgIC8vIHZpcnR1YWwgcmVnaXN0ZXJzIC0gbmF0IGJpdHMgZm9yIFIxLVIzMQorICAvLworICBVSU5UNjQgIEludE5hdDsKKworfSBFRklfU1lTVEVNX0NPTlRFWFRfSVBGOworCisvLworLy8gIEVCQyBwcm9jZXNzb3IgZXhjZXB0aW9uIHR5cGVzCisvLworI2RlZmluZSBFWENFUFRfRUJDX1VOREVGSU5FRCAgICAgICAgICAgIDAKKyNkZWZpbmUgRVhDRVBUX0VCQ19ESVZJREVfRVJST1IgICAgICAgICAxCisjZGVmaW5lIEVYQ0VQVF9FQkNfREVCVUcgICAgICAgICAgICAgICAgMgorI2RlZmluZSBFWENFUFRfRUJDX0JSRUFLUE9JTlQgICAgICAgICAgIDMKKyNkZWZpbmUgRVhDRVBUX0VCQ19PVkVSRkxPVyAgICAgICAgICAgICA0CisjZGVmaW5lIEVYQ0VQVF9FQkNfSU5WQUxJRF9PUENPREUgICAgICAgNSAgIC8vIG9wY29kZSBvdXQgb2YgcmFuZ2UKKyNkZWZpbmUgRVhDRVBUX0VCQ19TVEFDS19GQVVMVCAgICAgICAgICA2CisjZGVmaW5lIEVYQ0VQVF9FQkNfQUxJR05NRU5UX0NIRUNLICAgICAgNworI2RlZmluZSBFWENFUFRfRUJDX0lOU1RSVUNUSU9OX0VOQ09ESU5HIDggICAvLyBtYWxmb3JtZWQgaW5zdHJ1Y3Rpb24KKyNkZWZpbmUgRVhDRVBUX0VCQ19CQURfQlJFQUsgICAgICAgICAgICA5ICAgLy8gQlJFQUsgMCBvciB1bmRlZmluZWQgQlJFQUsKKyNkZWZpbmUgRVhDRVBUX0VCQ19TVEVQICAgICAgICAgICAgICAgICAxMCAgLy8gdG8gc3VwcG9ydCBkZWJ1ZyBzdGVwcGluZworLy8vCisvLy8gRm9yIGNvZGluZyBjb252ZW5pZW5jZSwgZGVmaW5lIHRoZSBtYXhpbXVtIHZhbGlkIEVCQyBleGNlcHRpb24uCisvLy8KKyNkZWZpbmUgTUFYX0VCQ19FWENFUFRJT04gRVhDRVBUX0VCQ19TVEVQCisKKy8vLworLy8vICBFQkMgcHJvY2Vzc29yIGNvbnRleHQgZGVmaW5pdGlvbgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQ2NCAgUjA7CisgIFVJTlQ2NCAgUjE7CisgIFVJTlQ2NCAgUjI7CisgIFVJTlQ2NCAgUjM7CisgIFVJTlQ2NCAgUjQ7CisgIFVJTlQ2NCAgUjU7CisgIFVJTlQ2NCAgUjY7CisgIFVJTlQ2NCAgUjc7CisgIFVJTlQ2NCAgRmxhZ3M7CisgIFVJTlQ2NCAgQ29udHJvbEZsYWdzOworICBVSU5UNjQgIElwOworfSBFRklfU1lTVEVNX0NPTlRFWFRfRUJDOworCisvLy8KKy8vLyBVbml2ZXJzYWwgRUZJX1NZU1RFTV9DT05URVhUIGRlZmluaXRpb24KKy8vLwordHlwZWRlZiB1bmlvbiB7CisgIEVGSV9TWVNURU1fQ09OVEVYVF9FQkMgICpTeXN0ZW1Db250ZXh0RWJjOworICBFRklfU1lTVEVNX0NPTlRFWFRfSUEzMiAqU3lzdGVtQ29udGV4dElhMzI7CisgIEVGSV9TWVNURU1fQ09OVEVYVF9YNjQgICpTeXN0ZW1Db250ZXh0WDY0OworICBFRklfU1lTVEVNX0NPTlRFWFRfSVBGICAqU3lzdGVtQ29udGV4dElwZjsKK30gRUZJX1NZU1RFTV9DT05URVhUOworCisvLworLy8gRGVidWdTdXBwb3J0IGNhbGxiYWNrIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vCisKKy8qKgorICBSZWdpc3RlcnMgYW5kIGVuYWJsZXMgYW4gZXhjZXB0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbi4KKworICBAcGFyYW0gIEV4Y2VwdGlvblR5cGUgICAgICAgICBFeGNlcHRpb24gdHlwZXMgaW4gRUJDLCBJQS0zMiwgWDY0LCBvciBJUEYKKyAgQHBhcmFtICBTeXN0ZW1Db250ZXh0ICAgICAgICAgRXhjZXB0aW9uIGNvbnRlbnQuCisKKyoqLwordHlwZWRlZgorVk9JRAorKCpFRklfRVhDRVBUSU9OX0NBTExCQUNLKSgKKyAgSU4gICAgIEVGSV9FWENFUFRJT05fVFlQRSAgICAgICAgICAgICAgIEV4Y2VwdGlvblR5cGUsCisgIElOIE9VVCBFRklfU1lTVEVNX0NPTlRFWFQgICAgICAgICAgICAgICBTeXN0ZW1Db250ZXh0CisgICk7CisKKy8qKgorICBSZWdpc3RlcnMgYW5kIGVuYWJsZXMgdGhlIG9uLXRhcmdldCBkZWJ1ZyBhZ2VudCdzIHBlcmlvZGljIGVudHJ5IHBvaW50LgorCisgIEBwYXJhbSAgU3lzdGVtQ29udGV4dCAgICAgICAgIEV4Y2VwdGlvbiBjb250ZW50LgorCisqKi8KK3R5cGVkZWYKK1ZPSUQKKygqRUZJX1BFUklPRElDX0NBTExCQUNLKSgKKyAgSU4gT1VUIEVGSV9TWVNURU1fQ09OVEVYVCAgICAgICAgICAgICAgIFN5c3RlbUNvbnRleHQKKyAgKTsKKworLy8vCisvLy8gTWFjaGluZSB0eXBlIGRlZmluaXRpb24KKy8vLwordHlwZWRlZiBlbnVtIHsKKyAgSXNhSWEzMiA9IElNQUdFX0ZJTEVfTUFDSElORV9JMzg2LCAgLy8vPCAweDAxNEMKKyAgSXNhWDY0ICA9IElNQUdFX0ZJTEVfTUFDSElORV9YNjQsICAgLy8vPCAweDg2NjQKKyAgSXNhSXBmICA9IElNQUdFX0ZJTEVfTUFDSElORV9JQTY0LCAgLy8vPCAweDAyMDAKKyAgSXNhRWJjICA9IElNQUdFX0ZJTEVfTUFDSElORV9FQkMgICAgLy8vPCAweDBFQkMKK30gRUZJX0lOU1RSVUNUSU9OX1NFVF9BUkNISVRFQ1RVUkU7CisKKworLy8KKy8vIERlYnVnU3VwcG9ydCBtZW1iZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKy8vCisKKy8qKgorICBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgbWF5IGJlIHVzZWQgZm9yIHRoZSBQcm9jZXNzb3JJbmRleCBwYXJhbWV0ZXIgaW4KKyAgUmVnaXN0ZXJQZXJpb2RpY0NhbGxiYWNrKCkgYW5kIFJlZ2lzdGVyRXhjZXB0aW9uQ2FsbGJhY2soKS4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9ERUJVR19TVVBQT1JUX1BST1RPQ09MIGluc3RhbmNlLgorICBAcGFyYW0gIE1heFByb2Nlc3NvckluZGV4ICAgICBQb2ludGVyIHRvIGEgY2FsbGVyLWFsbG9jYXRlZCBVSU5UTiBpbiB3aGljaCB0aGUgbWF4aW11bSBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yIGluZGV4IGlzIHJldHVybmVkLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfTUFYSU1VTV9QUk9DRVNTT1JfSU5ERVgpKAorICBJTiBFRklfREVCVUdfU1VQUE9SVF9QUk9UT0NPTCAgICAgICAgICAqVGhpcywKKyAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKk1heFByb2Nlc3NvckluZGV4CisgICk7CisKKy8qKgorICBSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmFjayBwZXJpb2RpY2FsbHkgaW4gaW50ZXJydXB0IGNvbnRleHQuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfREVCVUdfU1VQUE9SVF9QUk9UT0NPTCBpbnN0YW5jZS4KKyAgQHBhcmFtICBQcm9jZXNzb3JJbmRleCAgICAgICAgU3BlY2lmaWVzIHdoaWNoIHByb2Nlc3NvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gYXBwbGllcyB0by4KKyAgQHBhcmFtICBQZXJpb2RpY0NhbGxiYWNrICAgICAgQSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gb2YgdHlwZSBQRVJJT0RJQ19DQUxMQkFDSyB0aGF0IGlzIHRoZSBtYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljIGVudHJ5IHBvaW50IG9mIHRoZSBkZWJ1ZyBhZ2VudC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgQHJldHZhbCBFRklfQUxSRUFEWV9TVEFSVEVEICAgTm9uLU5VTEwgUGVyaW9kaWNDYWxsYmFjayBwYXJhbWV0ZXIgd2hlbiBhIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFN5c3RlbSBoYXMgaW5zdWZmaWNpZW50IG1lbW9yeSByZXNvdXJjZXMgdG8gcmVnaXN0ZXIgbmV3IGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRUdJU1RFUl9QRVJJT0RJQ19DQUxMQkFDSykoCisgIElOIEVGSV9ERUJVR19TVVBQT1JUX1BST1RPQ09MICAgICAgICAgICpUaGlzLAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzb3JJbmRleCwKKyAgSU4gRUZJX1BFUklPRElDX0NBTExCQUNLICAgICAgICAgICAgICAgUGVyaW9kaWNDYWxsYmFjaworICApOworCisvKioKKyAgUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBnaXZlbiBwcm9jZXNzb3IgZXhjZXB0aW9uIG9jY3Vycy4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9ERUJVR19TVVBQT1JUX1BST1RPQ09MIGluc3RhbmNlLgorICBAcGFyYW0gIFByb2Nlc3NvckluZGV4ICAgICAgICBTcGVjaWZpZXMgd2hpY2ggcHJvY2Vzc29yIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBhcHBsaWVzIHRvLgorICBAcGFyYW0gIFBlcmlvZGljQ2FsbGJhY2sgICAgICBBIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiBvZiB0eXBlIEVYQ0VQVElPTl9DQUxMQkFDSyB0aGF0IGlzIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBwcm9jZXNzb3IgZXhjZXB0aW9uIHNwZWNpZmllZCBieSBFeGNlcHRpb25UeXBlIG9jY3Vycy4KKyAgQHBhcmFtICBFeGNlcHRpb25UeXBlICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIHByb2Nlc3NvciBleGNlcHRpb24gdG8gaG9vay4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgQHJldHZhbCBFRklfQUxSRUFEWV9TVEFSVEVEICAgTm9uLU5VTEwgUGVyaW9kaWNDYWxsYmFjayBwYXJhbWV0ZXIgd2hlbiBhIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFN5c3RlbSBoYXMgaW5zdWZmaWNpZW50IG1lbW9yeSByZXNvdXJjZXMgdG8gcmVnaXN0ZXIgbmV3IGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9SRUdJU1RFUl9FWENFUFRJT05fQ0FMTEJBQ0spKAorICBJTiBFRklfREVCVUdfU1VQUE9SVF9QUk9UT0NPTCAgICAgICAgICAqVGhpcywKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc29ySW5kZXgsCisgIElOIEVGSV9FWENFUFRJT05fQ0FMTEJBQ0sgICAgICAgICAgICAgIEV4Y2VwdGlvbkNhbGxiYWNrLAorICBJTiBFRklfRVhDRVBUSU9OX1RZUEUgICAgICAgICAgICAgICAgICBFeGNlcHRpb25UeXBlCisgICk7CisKKy8qKgorICBJbnZhbGlkYXRlcyBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gY2FjaGUgZm9yIGEgbWVtb3J5IHJhbmdlLiBTdWJzZXF1ZW50IGV4ZWN1dGlvbiBpbiB0aGlzIHJhbmdlCisgIGNhdXNlcyBhIGZyZXNoIG1lbW9yeSBmZXRjaCB0byByZXRyaWV2ZSBjb2RlIHRvIGJlIGV4ZWN1dGVkLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX0RFQlVHX1NVUFBPUlRfUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgUHJvY2Vzc29ySW5kZXggICAgICAgIFNwZWNpZmllcyB3aGljaCBwcm9jZXNzb3IncyBpbnN0cnVjdGlvbiBjYWNoZSBpcyB0byBiZSBpbnZhbGlkYXRlZC4KKyAgQHBhcmFtICBTdGFydCAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwaHlzaWNhbCBiYXNlIG9mIHRoZSBtZW1vcnkgcmFuZ2UgdG8gYmUgaW52YWxpZGF0ZWQuCisgIEBwYXJhbSAgTGVuZ3RoICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHByb2Nlc3NvcidzIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIHRvIGludmFsaWRhdGUuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lOVkFMSURBVEVfSU5TVFJVQ1RJT05fQ0FDSEUpKAorICBJTiBFRklfREVCVUdfU1VQUE9SVF9QUk9UT0NPTCAgICAgICAgICAqVGhpcywKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc29ySW5kZXgsCisgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdGFydCwKKyAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoCisgICk7CisKKy8vLworLy8vIFRoaXMgcHJvdG9jb2wgcHJvdmlkZXMgdGhlIHNlcnZpY2VzIHRvIGFsbG93IHRoZSBkZWJ1ZyBhZ2VudCB0byByZWdpc3RlcgorLy8vIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgZWl0aGVyIHBlcmlvZGljYWxseSBvciB3aGVuIHNwZWNpZmljCisvLy8gcHJvY2Vzc29yIGV4Y2VwdGlvbnMgb2NjdXIuCisvLy8KK3N0cnVjdCBfRUZJX0RFQlVHX1NVUFBPUlRfUFJPVE9DT0wgeworICAvLy8KKyAgLy8vIERlY2xhcmVzIHRoZSBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlIGZvciB0aGlzIGluc3RhbmNlIG9mIHRoZSBFRkkgRGVidWcgU3VwcG9ydCBwcm90b2NvbC4KKyAgLy8vCisgIEVGSV9JTlNUUlVDVElPTl9TRVRfQVJDSElURUNUVVJFICBJc2E7CisgIEVGSV9HRVRfTUFYSU1VTV9QUk9DRVNTT1JfSU5ERVggICBHZXRNYXhpbXVtUHJvY2Vzc29ySW5kZXg7CisgIEVGSV9SRUdJU1RFUl9QRVJJT0RJQ19DQUxMQkFDSyAgICBSZWdpc3RlclBlcmlvZGljQ2FsbGJhY2s7CisgIEVGSV9SRUdJU1RFUl9FWENFUFRJT05fQ0FMTEJBQ0sgICBSZWdpc3RlckV4Y2VwdGlvbkNhbGxiYWNrOworICBFRklfSU5WQUxJREFURV9JTlNUUlVDVElPTl9DQUNIRSAgSW52YWxpZGF0ZUluc3RydWN0aW9uQ2FjaGU7Cit9OworCitleHRlcm4gRUZJX0dVSUQgZ0VmaURlYnVnU3VwcG9ydFByb3RvY29sR3VpZDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL0RldmljZVBhdGguaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvRGV2aWNlUGF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDc2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL0RldmljZVBhdGguaApAQCAtMCwwICsxLDUzNSBAQAorLyoqIEBmaWxlCisgIFRoZSBkZXZpY2UgcGF0aCBwcm90b2NvbCBhcyBkZWZpbmVkIGluIFVFRkkgMi4wLgorCisgIFRoZSBkZXZpY2UgcGF0aCByZXByZXNlbnRzIGEgcHJvZ3JhbWF0aWMgcGF0aCB0byBhIGRldmljZS4gSXQncyB0aGUgdmlldworICBmcm9tIGEgc29mdHdhcmUgcG9pbnQgb2Ygdmlldy4gSXQgYWxzbyBtdXN0IHBlcnNpc3QgZnJvbSBib290IHRvIGJvb3QsIHNvCisgIGl0IGNhbiBub3QgY29udGFpbiB0aGluZ3MgbGlrZSBQQ0kgYnVzIG51bWJlcnMgdGhhdCBjaGFuZ2UgZnJvbSBib290IHRvIGJvb3QuCisKKyAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyoqLworCisjaWZuZGVmIF9fRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MX0hfXworI2RlZmluZSBfX0VGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTF9IX18KKworI2luY2x1ZGUgPGdweGUvZWZpL0d1aWQvUGNBbnNpLmg+CisKKy8vLworLy8vIERldmljZSBQYXRoIHByb3RvY29sCisvLy8KKyNkZWZpbmUgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MX0dVSUQgXAorICB7IFwKKyAgICAweDk1NzZlOTEsIDB4NmQzZiwgMHgxMWQyLCB7MHg4ZSwgMHgzOSwgMHgwLCAweGEwLCAweGM5LCAweDY5LCAweDcyLCAweDNiIH0gXAorICB9CisKKy8vCisvLyBQcm90b2NvbCBHVUlEIGRlZmluZWQgaW4gRUZJMS4xLgorLy8KKworLy8vCisvLy8gRGV2aWNlIFBhdGggaW5mb3JtYXRpb24KKy8vLworI2RlZmluZSBERVZJQ0VfUEFUSF9QUk9UT0NPTCAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MX0dVSUQKKworI3ByYWdtYSBwYWNrKDEpCisKKy8qKgorICBUaGlzIHByb3RvY29sIGNhbiBiZSB1c2VkIG9uIGFueSBkZXZpY2UgaGFuZGxlIHRvIG9idGFpbiBnZW5lcmljIHBhdGgvbG9jYXRpb24KKyAgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgcGh5c2ljYWwgZGV2aWNlIG9yIGxvZ2ljYWwgZGV2aWNlLiBJZiB0aGUgaGFuZGxlIGRvZXMKKyAgbm90IGxvZ2ljYWxseSBtYXAgdG8gYSBwaHlzaWNhbCBkZXZpY2UsIHRoZSBoYW5kbGUgbWF5IG5vdCBuZWNlc3NhcmlseSBzdXBwb3J0CisgIHRoZSBkZXZpY2UgcGF0aCBwcm90b2NvbC4gVGhlIGRldmljZSBwYXRoIGRlc2NyaWJlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGRldmljZQorICB0aGUgaGFuZGxlIGlzIGZvci4gVGhlIHNpemUgb2YgdGhlIERldmljZSBQYXRoIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIHN0cnVjdHVyZXMKKyAgdGhhdCBtYWtlIHVwIHRoZSBEZXZpY2UgUGF0aC4KKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UOCBUeXBlOyAgICAgICAvLy88IDB4MDEgSGFyZHdhcmUgRGV2aWNlIFBhdGgKKyAgICAgICAgICAgICAgICAgICAgLy8vPCAweDAyIEFDUEkgRGV2aWNlIFBhdGgKKyAgICAgICAgICAgICAgICAgICAgLy8vPCAweDAzIE1lc3NhZ2luZyBEZXZpY2UgUGF0aAorICAgICAgICAgICAgICAgICAgICAvLy88IDB4MDQgTWVkaWEgRGV2aWNlIFBhdGgKKyAgICAgICAgICAgICAgICAgICAgLy8vPCAweDA1IEJJT1MgQm9vdCBTcGVjaWZpY2F0aW9uIERldmljZSBQYXRoCisgICAgICAgICAgICAgICAgICAgIC8vLzwgMHg3RiBFbmQgb2YgSGFyZHdhcmUgRGV2aWNlIFBhdGgKKworICBVSU5UOCBTdWJUeXBlOyAgICAvLy88IFZhcmllcyBieSBUeXBlCisgICAgICAgICAgICAgICAgICAgIC8vLzwgMHhGRiBFbmQgRW50aXJlIERldmljZSBQYXRoLCBvcgorICAgICAgICAgICAgICAgICAgICAvLy88IDB4MDEgRW5kIFRoaXMgSW5zdGFuY2Ugb2YgYSBEZXZpY2UgUGF0aCBhbmQgc3RhcnQgYSBuZXcKKyAgICAgICAgICAgICAgICAgICAgLy8vPCBEZXZpY2UgUGF0aAorCisgIFVJTlQ4IExlbmd0aFsyXTsgIC8vLzwgU3BlY2lmaWMgRGV2aWNlIFBhdGggZGF0YS4gVHlwZSBhbmQgU3ViLVR5cGUgZGVmaW5lCisgICAgICAgICAgICAgICAgICAgIC8vLzwgdHlwZSBvZiBkYXRhLiBTaXplIG9mIGRhdGEgaXMgaW5jbHVkZWQgaW4gTGVuZ3RoLgorCit9IEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTDsKKworLy8vCisvLy8gRm9yIGJhY2t3YXJkLWNvbXBhdGlibGUgd2l0aCBFRkkxLjEuCisvLy8KK3R5cGVkZWYgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICBFRklfREVWSUNFX1BBVEg7CisKKy8vLworLy8vIEhhcmR3YXJlIERldmljZSBQYXRocworLy8vCisjZGVmaW5lIEhBUkRXQVJFX0RFVklDRV9QQVRIICAgICAgMHgwMQorCisjZGVmaW5lIEhXX1BDSV9EUCAgICAgICAgICAgICAgICAgMHgwMQordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2U7Cit9IFBDSV9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBIV19QQ0NBUkRfRFAgICAgICAgICAgICAgIDB4MDIKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OdW1iZXI7Cit9IFBDQ0FSRF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBIV19NRU1NQVBfRFAgICAgICAgICAgICAgIDB4MDMKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5VHlwZTsKKyAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICBTdGFydGluZ0FkZHJlc3M7CisgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgRW5kaW5nQWRkcmVzczsKK30gTUVNTUFQX0RFVklDRV9QQVRIOworCisjZGVmaW5lIEhXX1ZFTkRPUl9EUCAgICAgICAgICAgICAgMHgwNAordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICBHdWlkOworfSBWRU5ET1JfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgSFdfQ09OVFJPTExFUl9EUCAgICAgICAgICAweDA1Cit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXJOdW1iZXI7Cit9IENPTlRST0xMRVJfREVWSUNFX1BBVEg7CisKKy8vLworLy8vIEFDUEkgRGV2aWNlIFBhdGhzCisvLy8KKyNkZWZpbmUgQUNQSV9ERVZJQ0VfUEFUSCAgICAgICAgICAweDAyCisKKyNkZWZpbmUgQUNQSV9EUCAgICAgICAgICAgICAgICAgICAweDAxCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRDsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBVSUQ7Cit9IEFDUElfSElEX0RFVklDRV9QQVRIOworCisjZGVmaW5lIEFDUElfRVhURU5ERURfRFAgICAgICAgICAgMHgwMgordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBISUQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIENJRDsKKyAgLy8vCisgIC8vLyBPcHRpb25hbCB2YXJpYWJsZSBsZW5ndGggX0hJRFNUUgorICAvLy8gT3B0aW9uYWwgdmFyaWFibGUgbGVuZ3RoIF9VSURTVFIKKyAgLy8vIE9wdGlvbmFsIHZhcmlhYmxlIGxlbmd0aCBfQ0lEU1RSCisgIC8vLworfSBBQ1BJX0VYVEVOREVEX0hJRF9ERVZJQ0VfUEFUSDsKKworLy8KKy8vICBFSVNBIElEIE1hY3JvCisvLyAgRUlTQSBJRCBEZWZpbml0aW9uIDMyLWJpdHMKKy8vICAgYml0c1sxNTowXSAtIHRocmVlIGNoYXJhY3RlciBjb21wcmVzc2VkIEFTQ0lJIEVJU0EgSUQuCisvLyAgIGJpdHNbMzE6MTZdIC0gYmluYXJ5IG51bWJlcgorLy8gICAgQ29tcHJlc3NlZCBBU0NJSSBpcyA1IGJpdHMgcGVyIGNoYXJhY3RlciAwYjAwMDAxID0gJ0EnIDBiMTEwMTAgPSAnWicKKy8vCisjZGVmaW5lIFBOUF9FSVNBX0lEX0NPTlNUICAgICAgICAgMHg0MWQwCisjZGVmaW5lIEVJU0FfSUQoX05hbWUsIF9OdW0pICAgICAgKChVSU5UMzIpKChfTmFtZSkgfCAoX051bSkgPDwgMTYpKQorI2RlZmluZSBFSVNBX1BOUF9JRChfUE5QSWQpICAgICAgIChFSVNBX0lEKFBOUF9FSVNBX0lEX0NPTlNULCAoX1BOUElkKSkpCisjZGVmaW5lIEVGSV9QTlBfSUQoX1BOUElkKSAgICAgICAgKEVJU0FfSUQoUE5QX0VJU0FfSURfQ09OU1QsIChfUE5QSWQpKSkKKworI2RlZmluZSBQTlBfRUlTQV9JRF9NQVNLICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBFSVNBX0lEX1RPX05VTShfSWQpICAgICAgICgoX0lkKSA+PiAxNikKKworCisjZGVmaW5lIEFDUElfQURSX0RQICAgICAgICAgICAgICAgMHgwMwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBBRFI7Cit9IEFDUElfQURSX0RFVklDRV9QQVRIOworCisjZGVmaW5lIEFDUElfQURSX0RJU1BMQVlfVFlQRV9PVEhFUiAgICAgICAgICAgICAwCisjZGVmaW5lIEFDUElfQURSX0RJU1BMQVlfVFlQRV9WR0EgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFDUElfQURSX0RJU1BMQVlfVFlQRV9UViAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFDUElfQURSX0RJU1BMQVlfVFlQRV9FWFRFUk5BTF9ESUdJVEFMICAzCisjZGVmaW5lIEFDUElfQURSX0RJU1BMQVlfVFlQRV9JTlRFUk5BTF9ESUdJVEFMICA0CisKKyNkZWZpbmUgQUNQSV9ESVNQTEFZX0FEUihfRGV2aWNlSWRTY2hlbWUsIF9IZWFkSWQsIF9Ob25WZ2FPdXRwdXQsIF9CaW9zQ2FuRGV0ZWN0LCBfVmVuZG9ySW5mbywgX1R5cGUsIF9Qb3J0LCBfSW5kZXgpIFwKKyAgICAgICAgICAoKFVJTlQzMikoICgoKF9EZXZpY2VJZFNjaGVtZSkgJiAweDEpIDw8IDMxKSB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgKCgoX0hlYWRJZCkgICAgICAgICAmIDB4NykgPDwgMTgpIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAoKChfTm9uVmdhT3V0cHV0KSAgICYgMHgxKSA8PCAxNykgfCAgXAorICAgICAgICAgICAgICAgICAgICAgICgoKF9CaW9zQ2FuRGV0ZWN0KSAgJiAweDEpIDw8IDE2KSB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgKCgoX1ZlbmRvckluZm8pICAgICAmIDB4ZikgPDwgMTIpIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAoKChfVHlwZSkgICAgICAgICAgICYgMHhmKSA8PCA4KSAgfCAgXAorICAgICAgICAgICAgICAgICAgICAgICgoKF9Qb3J0KSAgICAgICAgICAgJiAweGYpIDw8IDQpICB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICgoX0luZGV4KSAgICAgICAgICAmIDB4ZikgKSkKKworLy8vCisvLy8gTWVzc2FnaW5nIERldmljZSBQYXRocworLy8vCisjZGVmaW5lIE1FU1NBR0lOR19ERVZJQ0VfUEFUSCAgICAgMHgwMworCisjZGVmaW5lIE1TR19BVEFQSV9EUCAgICAgICAgICAgICAgMHgwMQordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5U2Vjb25kYXJ5OworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsYXZlTWFzdGVyOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIEx1bjsKK30gQVRBUElfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX1NDU0lfRFAgICAgICAgICAgICAgICAweDAyCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFB1bjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBMdW47Cit9IFNDU0lfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0ZJQlJFQ0hBTk5FTF9EUCAgICAgICAweDAzCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOworICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIFdXTjsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBMdW47Cit9IEZJQlJFQ0hBTk5FTF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfMTM5NF9EUCAgICAgICAgICAgICAgIDB4MDQKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgR3VpZDsKK30gRjEzOTRfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX1VTQl9EUCAgICAgICAgICAgICAgICAweDA1Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgSGVhZGVyOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudFBvcnROdW1iZXI7CisgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlTnVtYmVyOworfSBVU0JfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX1VTQl9DTEFTU19EUCAgICAgICAgICAweDBmCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgSGVhZGVyOworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgIFZlbmRvcklkOworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3RJZDsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VDbGFzczsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VTdWJDbGFzczsKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQcm90b2NvbDsKK30gVVNCX0NMQVNTX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19VU0JfV1dJRF9EUCAgICAgICAgICAgMHgxMAordHlwZWRlZiBzdHJ1Y3QgeworICAgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgIEhlYWRlcjsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VOdW1iZXI7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgVmVuZG9ySWQ7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdElkOworICAgIC8vIENIQVIxNiAgICAgICAgICAgICAgICAgICAgIFNlcmlhbE51bWJlclsuLi5dOworfSBVU0JfV1dJRF9ERVZJQ0VfUEFUSDsKKworCisjZGVmaW5lIE1TR19ERVZJQ0VfTE9HSUNBTF9VTklUX0RQICAweDExCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgSGVhZGVyOworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIEx1bjsKK30gREVWSUNFX0xPR0lDQUxfVU5JVF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfU0FUQV9EUCAgICAgICAgICAgICAgIDB4MTIKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgSEJBUG9ydE51bWJlcjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0TXVsdGlwbGllclBvcnROdW1iZXI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTHVuOworfSBTQVRBX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19JMk9fRFAgICAgICAgICAgICAgICAgMHgwNgordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBUaWQ7Cit9IEkyT19ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBNU0dfTUFDX0FERFJfRFAgICAgICAgICAgIDB4MGIKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7CisgIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgTWFjQWRkcmVzczsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBJZlR5cGU7Cit9IE1BQ19BRERSX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19JUHY0X0RQICAgICAgICAgICAgICAgMHgwYwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgRUZJX0lQdjRfQUREUkVTUyAgICAgICAgICAgICAgICBMb2NhbElwQWRkcmVzczsKKyAgRUZJX0lQdjRfQUREUkVTUyAgICAgICAgICAgICAgICBSZW1vdGVJcEFkZHJlc3M7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0OworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZVBvcnQ7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2w7CisgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljSXBBZGRyZXNzOworfSBJUHY0X0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19JUHY2X0RQICAgICAgICAgICAgICAgMHgwZAordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgRUZJX0lQdjZfQUREUkVTUyAgICAgICAgICAgICAgICBMb2NhbElwQWRkcmVzczsKKyAgRUZJX0lQdjZfQUREUkVTUyAgICAgICAgICAgICAgICBSZW1vdGVJcEFkZHJlc3M7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0OworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZVBvcnQ7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2w7CisgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljSXBBZGRyZXNzOworfSBJUHY2X0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1TR19JTkZJTklCQU5EX0RQICAgICAgICAgMHgwOQordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUZsYWdzOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRHaWRbMTZdOworICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJZDsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRQb3J0SWQ7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSWQ7Cit9IElORklOSUJBTkRfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgSU5GSU5JQkFORF9SRVNPVVJDRV9GTEFHX0lPQ19TRVJWSUNFICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSU5GSU5JQkFORF9SRVNPVVJDRV9GTEFHX0VYVEVOREVEX0JPT1RfRU5WSVJPTk1FTlQgIDB4MDIKKyNkZWZpbmUgSU5GSU5JQkFORF9SRVNPVVJDRV9GTEFHX0NPTlNPTEVfUFJPVE9DT0wgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSU5GSU5JQkFORF9SRVNPVVJDRV9GTEFHX1NUT1JBR0VfUFJPVE9DT0wgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgSU5GSU5JQkFORF9SRVNPVVJDRV9GTEFHX05FVFdPUktfUFJPVE9DT0wgICAgICAgICAgIDB4MTAKKworI2RlZmluZSBNU0dfVUFSVF9EUCAgICAgICAgICAgICAgIDB4MGUKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZFJhdGU7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJpdHM7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyaXR5OworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3BCaXRzOworfSBVQVJUX0RFVklDRV9QQVRIOworCisvLworLy8gVXNlIFZFTkRPUl9ERVZJQ0VfUEFUSCBzdHJ1Y3QKKy8vCisjZGVmaW5lIE1TR19WRU5ET1JfRFAgICAgICAgICAgICAgMHgwYQordHlwZWRlZiBWRU5ET1JfREVWSUNFX1BBVEggICAgICAgIFZFTkRPUl9ERUZJTkVEX0RFVklDRV9QQVRIOworCisjZGVmaW5lIERFVklDRV9QQVRIX01FU1NBR0lOR19QQ19BTlNJICAgICBFRklfUENfQU5TSV9HVUlECisjZGVmaW5lIERFVklDRV9QQVRIX01FU1NBR0lOR19WVF8xMDAgICAgICBFRklfVlRfMTAwX0dVSUQKKyNkZWZpbmUgREVWSUNFX1BBVEhfTUVTU0FHSU5HX1ZUXzEwMF9QTFVTIEVGSV9WVF8xMDBfUExVU19HVUlECisjZGVmaW5lIERFVklDRV9QQVRIX01FU1NBR0lOR19WVF9VVEY4ICAgICBFRklfVlRfVVRGOF9HVUlECisKKyNkZWZpbmUgREVWSUNFX1BBVEhfTUVTU0FHSU5HX1VBUlRfRkxPV19DT05UUk9MICAgRUZJX1VBUlRfREVWSUNFX1BBVEhfR1VJRAorCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOworICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgIEd1aWQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvd0NvbnRyb2xNYXA7Cit9IFVBUlRfRkxPV19DT05UUk9MX0RFVklDRV9QQVRIOworCisjZGVmaW5lIERFVklDRV9QQVRIX01FU1NBR0lOR19TQVMgICAgICAgICAgICAgICAgIEVGSV9TQVNfREVWSUNFX1BBVEhfR1VJRAorCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOworICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgIEd1aWQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgU2FzQWRkcmVzczsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBMdW47CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVG9wb2xvZ3k7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpdmVUYXJnZXRQb3J0OworfSBTQVNfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgTVNHX0lTQ1NJX0RQICAgICAgICAgICAgICAweDEzCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtQcm90b2NvbDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dpbk9wdGlvbjsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBMdW47CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0UG9ydGFsR3JvdXBUYWc7CisgIC8vIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAgaVNDU0kgVGFyZ2V0IE5hbWUKK30gSVNDU0lfREVWSUNFX1BBVEg7CisKKyNkZWZpbmUgSVNDU0lfTE9HSU5fT1BUSU9OX05PX0hFQURFUl9ESUdFU1QgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIElTQ1NJX0xPR0lOX09QVElPTl9IRUFERVJfRElHRVNUX1VTSU5HX0NSQzMyQyAgIDB4MDAwMgorI2RlZmluZSBJU0NTSV9MT0dJTl9PUFRJT05fTk9fREFUQV9ESUdFU1QgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgSVNDU0lfTE9HSU5fT1BUSU9OX0RBVEFfRElHRVNUX1VTSU5HX0NSQzMyQyAgICAgMHgwMDA4CisjZGVmaW5lIElTQ1NJX0xPR0lOX09QVElPTl9BVVRITUVUSE9EX0NIQVAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBJU0NTSV9MT0dJTl9PUFRJT05fQVVUSE1FVEhPRF9OT04gICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgSVNDU0lfTE9HSU5fT1BUSU9OX0NIQVBfQkkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIElTQ1NJX0xPR0lOX09QVElPTl9DSEFQX1VOSSAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorCisvLworLy8gTWVkaWEgRGV2aWNlIFBhdGgKKy8vCisjZGVmaW5lIE1FRElBX0RFVklDRV9QQVRIICAgICAgICAgMHgwNAorCisjZGVmaW5lIE1FRElBX0hBUkREUklWRV9EUCAgICAgICAgMHgwMQordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25OdW1iZXI7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RhcnQ7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU2l6ZTsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVbMTZdOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CUlR5cGU7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlVHlwZTsKK30gSEFSRERSSVZFX0RFVklDRV9QQVRIOworCisjZGVmaW5lIE1CUl9UWVBFX1BDQVQgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBNQlJfVFlQRV9FRklfUEFSVElUSU9OX1RBQkxFX0hFQURFUiAweDAyCisKKyNkZWZpbmUgU0lHTkFUVVJFX1RZUEVfTUJSICAgICAgICAweDAxCisjZGVmaW5lIFNJR05BVFVSRV9UWVBFX0dVSUQgICAgICAgMHgwMgorCisjZGVmaW5lIE1FRElBX0NEUk9NX0RQICAgICAgICAgICAgMHgwMgordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBCb290RW50cnk7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RhcnQ7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU2l6ZTsKK30gQ0RST01fREVWSUNFX1BBVEg7CisKKy8vCisvLyBVc2UgVkVORE9SX0RFVklDRV9QQVRIIHN0cnVjdAorLy8KKyNkZWZpbmUgTUVESUFfVkVORE9SX0RQICAgICAgICAgICAweDAzCisKKyNkZWZpbmUgTUVESUFfRklMRVBBVEhfRFAgICAgICAgICAweDA0Cit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOworICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhOYW1lWzFdOworfSBGSUxFUEFUSF9ERVZJQ0VfUEFUSDsKKworI2RlZmluZSBTSVpFX09GX0ZJTEVQQVRIX0RFVklDRV9QQVRIICBFRklfRklFTERfT0ZGU0VUKEZJTEVQQVRIX0RFVklDRV9QQVRILFBhdGhOYW1lKQorCisjZGVmaW5lIE1FRElBX1BST1RPQ09MX0RQICAgICAgICAgMHgwNQordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbDsKK30gTUVESUFfUFJPVE9DT0xfREVWSUNFX1BBVEg7CisKKworI2RlZmluZSBNRURJQV9QSVdHX0ZXX1ZPTF9EUCAgICAgIDB4NwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICBGdk5hbWU7Cit9IE1FRElBX0ZXX1ZPTF9ERVZJQ0VfUEFUSDsKKworCisjZGVmaW5lIE1FRElBX1BJV0dfRldfRklMRV9EUCAgICAgMHg2Cit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOworICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgIEZ2RmlsZU5hbWU7Cit9IE1FRElBX0ZXX1ZPTF9GSUxFUEFUSF9ERVZJQ0VfUEFUSDsKKworLy8KKy8vIEJCUyBEZXZpY2UgUGF0aAorLy8KKyNkZWZpbmUgQkJTX0RFVklDRV9QQVRIICAgICAgICAgICAweDA1CisjZGVmaW5lIEJCU19CQlNfRFAgICAgICAgICAgICAgICAgMHgwMQordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VUeXBlOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0ZsYWc7CisgIENIQVI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nWzFdOworfSBCQlNfQkJTX0RFVklDRV9QQVRIOworCisvLworLy8gRGV2aWNlVHlwZSBkZWZpbml0aW9ucyAtIGZyb20gQkJTIHNwZWNpZmljYXRpb24KKy8vCisjZGVmaW5lIEJCU19UWVBFX0ZMT1BQWSAgICAgICAgICAgMHgwMQorI2RlZmluZSBCQlNfVFlQRV9IQVJERFJJVkUgICAgICAgIDB4MDIKKyNkZWZpbmUgQkJTX1RZUEVfQ0RST00gICAgICAgICAgICAweDAzCisjZGVmaW5lIEJCU19UWVBFX1BDTUNJQSAgICAgICAgICAgMHgwNAorI2RlZmluZSBCQlNfVFlQRV9VU0IgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQkJTX1RZUEVfRU1CRURERURfTkVUV09SSyAweDA2CisjZGVmaW5lIEJCU19UWVBFX0JFViAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBCQlNfVFlQRV9VTktOT1dOICAgICAgICAgIDB4RkYKKworCisvLy8KKy8vLyBVbmlvbiBvZiBhbGwgcG9zc2libGUgRGV2aWNlIFBhdGhzIGFuZCBwb2ludGVycyB0byBEZXZpY2UgUGF0aHMKKy8vLworCit0eXBlZGVmIHVuaW9uIHsKKyAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICAgICAgIERldlBhdGg7CisgIFBDSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICBQY2k7CisgIFBDQ0FSRF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICBQY0NhcmQ7CisgIE1FTU1BUF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICBNZW1NYXA7CisgIFZFTkRPUl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICBWZW5kb3I7CisKKyAgQ09OVFJPTExFUl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgIENvbnRyb2xsZXI7CisgIEFDUElfSElEX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBBY3BpOworCisgIEFUQVBJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICBBdGFwaTsKKyAgU0NTSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgIFNjc2k7CisgIElTQ1NJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICBJc2NzaTsKKyAgRklCUkVDSEFOTkVMX0RFVklDRV9QQVRIICAgICAgICAgICAgIEZpYnJlQ2hhbm5lbDsKKworICBGMTM5NF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgRjEzOTQ7CisgIFVTQl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICBVc2I7CisgIFNBVEFfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICBTYXRhOworICBVU0JfQ0xBU1NfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgVXNiQ2xhc3M7CisgIEkyT19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICBJMk87CisgIE1BQ19BRERSX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICBNYWNBZGRyOworICBJUHY0X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgSXB2NDsKKyAgSVB2Nl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgIElwdjY7CisgIElORklOSUJBTkRfREVWSUNFX1BBVEggICAgICAgICAgICAgICBJbmZpbmlCYW5kOworICBVQVJUX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgVWFydDsKKworICBIQVJERFJJVkVfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgSGFyZERyaXZlOworICBDRFJPTV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgQ0Q7CisKKyAgRklMRVBBVEhfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEZpbGVQYXRoOworICBNRURJQV9QUk9UT0NPTF9ERVZJQ0VfUEFUSCAgICAgICAgICAgTWVkaWFQcm90b2NvbDsKKworICBCQlNfQkJTX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgQmJzOworfSBFRklfREVWX1BBVEg7CisKKworCit0eXBlZGVmIHVuaW9uIHsKKyAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICAgICAgICpEZXZQYXRoOworICBQQ0lfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKlBjaTsKKyAgUENDQVJEX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICpQY0NhcmQ7CisgIE1FTU1BUF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAqTWVtTWFwOworICBWRU5ET1JfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgKlZlbmRvcjsKKworICBDT05UUk9MTEVSX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgKkNvbnRyb2xsZXI7CisgIEFDUElfSElEX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAqQWNwaTsKKyAgQUNQSV9FWFRFTkRFRF9ISURfREVWSUNFX1BBVEggICAgICAgICpFeHRlbmRlZEFjcGk7CisKKyAgQVRBUElfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICpBdGFwaTsKKyAgU0NTSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICpTY3NpOworICBGSUJSRUNIQU5ORUxfREVWSUNFX1BBVEggICAgICAgICAgICAgKkZpYnJlQ2hhbm5lbDsKKworICBGMTM5NF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgKkYxMzk0OworICBVU0JfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKlVzYjsKKyAgU0FUQV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICpTYXRhOworICBVU0JfQ0xBU1NfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgKlVzYkNsYXNzOworICBJMk9fREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKkkyTzsKKyAgTUFDX0FERFJfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICpNYWNBZGRyOworICBJUHY0X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgKklwdjQ7CisgIElQdjZfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAqSXB2NjsKKyAgSU5GSU5JQkFORF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICpJbmZpbmlCYW5kOworICBVQVJUX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgKlVhcnQ7CisKKyAgSEFSRERSSVZFX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICpIYXJkRHJpdmU7CisgIENEUk9NX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAqQ0Q7CisKKyAgRklMRVBBVEhfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICpGaWxlUGF0aDsKKyAgTUVESUFfUFJPVE9DT0xfREVWSUNFX1BBVEggICAgICAgICAgICpNZWRpYVByb3RvY29sOworCisgIEJCU19CQlNfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAqQmJzOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlJhdzsKK30gRUZJX0RFVl9QQVRIX1BUUjsKKworI3ByYWdtYSBwYWNrKCkKKworI2RlZmluZSBFTkRfREVWSUNFX1BBVEhfVFlQRSAgICAgICAgICAgICAgICAgMHg3ZgorI2RlZmluZSBFTkRfRU5USVJFX0RFVklDRV9QQVRIX1NVQlRZUEUgICAgICAgMHhGRgorI2RlZmluZSBFTkRfSU5TVEFOQ0VfREVWSUNFX1BBVEhfU1VCVFlQRSAgICAgMHgwMQorCitleHRlcm4gRUZJX0dVSUQgZ0VmaURldmljZVBhdGhQcm90b2NvbEd1aWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9Ecml2ZXJCaW5kaW5nLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL0RyaXZlckJpbmRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTBjYjdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9Ecml2ZXJCaW5kaW5nLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qKiBAZmlsZQorICBVRUZJIERyaXZlckJpbmRpbmcgUHJvdG9jb2wgaXMgZGVmaW5lZCBpbiBVRUZJIHNwZWNpZmljYXRpb24uCisKKyAgVGhpcyBwcm90b2NvbCBpcyBwcm9kdWNlZCBieSBldmVyeSBkcml2ZXIgdGhhdCBmb2xsb3dzIHRoZSBVRUZJIERyaXZlciBNb2RlbCwKKyAgYW5kIGl0IGlzIHRoZSBjZW50cmFsIGNvbXBvbmVudCB0aGF0IGFsbG93cyBkcml2ZXJzIGFuZCBjb250cm9sbGVycyB0byBiZSBtYW5hZ2VkLgorCisgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisqKi8KKworI2lmbmRlZiBfX0VGSV9EUklWRVJfQklORElOR19IX18KKyNkZWZpbmUgX19FRklfRFJJVkVSX0JJTkRJTkdfSF9fCisKKyNpbmNsdWRlIDxncHhlL2VmaS9Qcm90b2NvbC9EZXZpY2VQYXRoLmg+CisvLy8KKy8vLyBHbG9iYWwgSUQgZm9yIHRoZSBDb250cm9sbGVySGFuZGxlIERyaXZlciBQcm90b2NvbAorLy8vCisjZGVmaW5lIEVGSV9EUklWRVJfQklORElOR19QUk9UT0NPTF9HVUlEIFwKKyAgeyBcCisgICAgMHgxOGEwMzFhYiwgMHhiNDQzLCAweDRkMWEsIHsweGE1LCAweGMwLCAweGMsIDB4OSwgMHgyNiwgMHgxZSwgMHg5ZiwgMHg3MSB9IFwKKyAgfQorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MICBFRklfRFJJVkVSX0JJTkRJTkdfUFJPVE9DT0w7CisKKy8qKgorICBUZXN0IHRvIHNlZSBpZiB0aGlzIGRyaXZlciBzdXBwb3J0cyBDb250cm9sbGVySGFuZGxlLiBUaGlzIHNlcnZpY2UKKyAgaXMgY2FsbGVkIGJ5IHRoZSBFRkkgYm9vdCBzZXJ2aWNlIENvbm5lY3RDb250cm9sbGVyKCkuIEluCisgIG9yZGVyIHRvIG1ha2UgZHJpdmVycyBhcyBzbWFsbCBhcyBwb3NzaWJsZSwgdGhlcmUgYXJlIGEgZmV3IGNhbGxpbmcKKyAgcmVzdHJpY3Rpb25zIGZvciB0aGlzIHNlcnZpY2UuIENvbm5lY3RDb250cm9sbGVyKCkgbXVzdAorICBmb2xsb3cgdGhlc2UgY2FsbGluZyByZXN0cmljdGlvbnMuIElmIGFueSBvdGhlciBhZ2VudCB3aXNoZXMgdG8gY2FsbAorICBTdXBwb3J0ZWQoKSBpdCBtdXN0IGFsc28gZm9sbG93IHRoZXNlIGNhbGxpbmcgcmVzdHJpY3Rpb25zLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIENvbnRyb2xsZXJIYW5kbGUgICAgSGFuZGxlIG9mIGRldmljZSB0byB0ZXN0CisgIEBwYXJhbSAgUmVtYWluaW5nRGV2aWNlUGF0aCBPcHRpb25hbCBwYXJhbWV0ZXIgdXNlIHRvIHBpY2sgYSBzcGVjaWZpYyBjaGlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHRvIHN0YXJ0LgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGlzIGRldmljZQorICBAcmV0dmFsIEVGSV9BTFJFQURZX1NUQVJURUQgVGhpcyBkcml2ZXIgaXMgYWxyZWFkeSBydW5uaW5nIG9uIHRoaXMgZGV2aWNlCisgIEByZXR2YWwgb3RoZXIgICAgICAgICAgICAgICBUaGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZGV2aWNlCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RSSVZFUl9CSU5ESU5HX1NVUFBPUlRFRCkoCisgIElOIEVGSV9EUklWRVJfQklORElOR19QUk9UT0NPTCAgICAgICAgICAgICpUaGlzLAorICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlLAorICBJTiBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgICAgICAgICAqUmVtYWluaW5nRGV2aWNlUGF0aCBPUFRJT05BTAorICApOworCisvKioKKyAgU3RhcnQgdGhpcyBkcml2ZXIgb24gQ29udHJvbGxlckhhbmRsZS4gVGhpcyBzZXJ2aWNlIGlzIGNhbGxlZCBieSB0aGUKKyAgRUZJIGJvb3Qgc2VydmljZSBDb25uZWN0Q29udHJvbGxlcigpLiBJbiBvcmRlciB0byBtYWtlCisgIGRyaXZlcnMgYXMgc21hbGwgYXMgcG9zc2libGUsIHRoZXJlIGFyZSBhIGZldyBjYWxsaW5nIHJlc3RyaWN0aW9ucyBmb3IKKyAgdGhpcyBzZXJ2aWNlLiBDb25uZWN0Q29udHJvbGxlcigpIG11c3QgZm9sbG93IHRoZXNlCisgIGNhbGxpbmcgcmVzdHJpY3Rpb25zLiBJZiBhbnkgb3RoZXIgYWdlbnQgd2lzaGVzIHRvIGNhbGwgU3RhcnQoKSBpdAorICBtdXN0IGFsc28gZm9sbG93IHRoZXNlIGNhbGxpbmcgcmVzdHJpY3Rpb25zLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBDb250cm9sbGVySGFuZGxlICAgICBIYW5kbGUgb2YgZGV2aWNlIHRvIGJpbmQgZHJpdmVyIHRvCisgIEBwYXJhbSAgUmVtYWluaW5nRGV2aWNlUGF0aCAgT3B0aW9uYWwgcGFyYW1ldGVyIHVzZSB0byBwaWNrIGEgc3BlY2lmaWMgY2hpbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgdG8gc3RhcnQuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICBUaGlzIGRyaXZlciBpcyBhZGRlZCB0byBDb250cm9sbGVySGFuZGxlCisgIEByZXR2YWwgRUZJX0FMUkVBRFlfU1RBUlRFRCAgVGhpcyBkcml2ZXIgaXMgYWxyZWFkeSBydW5uaW5nIG9uIENvbnRyb2xsZXJIYW5kbGUKKyAgQHJldHZhbCBvdGhlciAgICAgICAgICAgICAgICBUaGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZGV2aWNlCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RSSVZFUl9CSU5ESU5HX1NUQVJUKSgKKyAgSU4gRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MICAgICAgICAgICAgKlRoaXMsCisgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUsCisgIElOIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgICAgICAgICpSZW1haW5pbmdEZXZpY2VQYXRoIE9QVElPTkFMCisgICk7CisKKy8qKgorICBTdG9wIHRoaXMgZHJpdmVyIG9uIENvbnRyb2xsZXJIYW5kbGUuIFRoaXMgc2VydmljZSBpcyBjYWxsZWQgYnkgdGhlCisgIEVGSSBib290IHNlcnZpY2UgRGlzY29ubmVjdENvbnRyb2xsZXIoKS4gSW4gb3JkZXIgdG8KKyAgbWFrZSBkcml2ZXJzIGFzIHNtYWxsIGFzIHBvc3NpYmxlLCB0aGVyZSBhcmUgYSBmZXcgY2FsbGluZworICByZXN0cmljdGlvbnMgZm9yIHRoaXMgc2VydmljZS4gRGlzY29ubmVjdENvbnRyb2xsZXIoKQorICBtdXN0IGZvbGxvdyB0aGVzZSBjYWxsaW5nIHJlc3RyaWN0aW9ucy4gSWYgYW55IG90aGVyIGFnZW50IHdpc2hlcworICB0byBjYWxsIFN0b3AoKSBpdCBtdXN0IGFsc28gZm9sbG93IHRoZXNlIGNhbGxpbmcgcmVzdHJpY3Rpb25zLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBDb250cm9sbGVySGFuZGxlICBIYW5kbGUgb2YgZGV2aWNlIHRvIHN0b3AgZHJpdmVyIG9uCisgIEBwYXJhbSAgTnVtYmVyT2ZDaGlsZHJlbiAgTnVtYmVyIG9mIEhhbmRsZXMgaW4gQ2hpbGRIYW5kbGVCdWZmZXIuIElmIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuIGlzIHplcm8gc3RvcCB0aGUgZW50aXJlIGJ1cyBkcml2ZXIuCisgIEBwYXJhbSAgQ2hpbGRIYW5kbGVCdWZmZXIgTGlzdCBvZiBDaGlsZCBIYW5kbGVzIHRvIFN0b3AuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICBUaGlzIGRyaXZlciBpcyByZW1vdmVkIENvbnRyb2xsZXJIYW5kbGUKKyAgQHJldHZhbCBvdGhlciAgICAgICAgICAgICBUaGlzIGRyaXZlciB3YXMgbm90IHJlbW92ZWQgZnJvbSB0aGlzIGRldmljZQorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9EUklWRVJfQklORElOR19TVE9QKSgKKyAgSU4gRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MICAgICAgICAgICAgKlRoaXMsCisgIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUsCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mQ2hpbGRyZW4sCisgIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICpDaGlsZEhhbmRsZUJ1ZmZlciBPUFRJT05BTAorICApOworCisvLy8KKy8vLyBUaGlzIHByb3RvY29sIHByb3ZpZGVzIHRoZSBzZXJ2aWNlcyByZXF1aXJlZCB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZXIgc3VwcG9ydHMgYSBnaXZlbiBjb250cm9sbGVyLgorLy8vIElmIGEgY29udHJvbGxlciBpcyBzdXBwb3J0ZWQsIHRoZW4gaXQgYWxzbyBwcm92aWRlcyByb3V0aW5lcyB0byBzdGFydCBhbmQgc3RvcCB0aGUgY29udHJvbGxlci4KKy8vLworc3RydWN0IF9FRklfRFJJVkVSX0JJTkRJTkdfUFJPVE9DT0wgeworICBFRklfRFJJVkVSX0JJTkRJTkdfU1VQUE9SVEVEICBTdXBwb3J0ZWQ7CisgIEVGSV9EUklWRVJfQklORElOR19TVEFSVCAgICAgIFN0YXJ0OworICBFRklfRFJJVkVSX0JJTkRJTkdfU1RPUCAgICAgICBTdG9wOworCisgIC8vLworICAvLy8gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBVRUZJIGRyaXZlciB0aGF0IHByb2R1Y2VkIHRoZQorICAvLy8gRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MLiBUaGlzIGZpZWxkIGlzIHVzZWQgYnkKKyAgLy8vIHRoZSBFRkkgYm9vdCBzZXJ2aWNlIENvbm5lY3RDb250cm9sbGVyKCkgdG8gZGV0ZXJtaW5lCisgIC8vLyB0aGUgb3JkZXIgdGhhdCBkcml2ZXIncyBTdXBwb3J0ZWQoKSBzZXJ2aWNlIHdpbGwgYmUgdXNlZCB3aGVuCisgIC8vLyBhIGNvbnRyb2xsZXIgbmVlZHMgdG8gYmUgc3RhcnRlZC4gRUZJIERyaXZlciBCaW5kaW5nIFByb3RvY29sCisgIC8vLyBpbnN0YW5jZXMgd2l0aCBoaWdoZXIgVmVyc2lvbiB2YWx1ZXMgd2lsbCBiZSB1c2VkIGJlZm9yZSBvbmVzCisgIC8vLyB3aXRoIGxvd2VyIFZlcnNpb24gdmFsdWVzLiBUaGUgVmVyc2lvbiB2YWx1ZXMgb2YgMHgwLQorICAvLy8gMHgwZiBhbmQgMHhmZmZmZmZmMC0weGZmZmZmZmZmIGFyZSByZXNlcnZlZCBmb3IKKyAgLy8vIHBsYXRmb3JtL09FTSBzcGVjaWZpYyBkcml2ZXJzLiBUaGUgVmVyc2lvbiB2YWx1ZXMgb2YgMHgxMC0KKyAgLy8vIDB4ZmZmZmZmZWYgYXJlIHJlc2VydmVkIGZvciBJSFYtZGV2ZWxvcGVkIGRyaXZlcnMuCisgIC8vLworICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uOworCisgIC8vLworICAvLy8gVGhlIGltYWdlIGhhbmRsZSBvZiB0aGUgVUVGSSBkcml2ZXIgdGhhdCBwcm9kdWNlZCB0aGlzIGluc3RhbmNlCisgIC8vLyBvZiB0aGUgRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MLgorICAvLy8KKyAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGU7CisKKyAgLy8vCisgIC8vLyBUaGUgaGFuZGxlIG9uIHdoaWNoIHRoaXMgaW5zdGFuY2Ugb2YgdGhlCisgIC8vLyBFRklfRFJJVkVSX0JJTkRJTkdfUFJPVE9DT0wgaXMgaW5zdGFsbGVkLiBJbiBtb3N0CisgIC8vLyBjYXNlcywgdGhpcyBpcyB0aGUgc2FtZSBoYW5kbGUgYXMgSW1hZ2VIYW5kbGUuIEhvd2V2ZXIsIGZvcgorICAvLy8gVUVGSSBkcml2ZXJzIHRoYXQgcHJvZHVjZSBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mIHRoZQorICAvLy8gRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MLCB0aGlzIHZhbHVlIG1heSBub3QgYmUKKyAgLy8vIHRoZSBzYW1lIGFzIEltYWdlSGFuZGxlLgorICAvLy8KKyAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgRHJpdmVyQmluZGluZ0hhbmRsZTsKK307CisKK2V4dGVybiBFRklfR1VJRCBnRWZpRHJpdmVyQmluZGluZ1Byb3RvY29sR3VpZDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL05ldHdvcmtJbnRlcmZhY2VJZGVudGlmaWVyLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL05ldHdvcmtJbnRlcmZhY2VJZGVudGlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5ZWMzOAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvTmV0d29ya0ludGVyZmFjZUlkZW50aWZpZXIuaApAQCAtMCwwICsxLDc0IEBACisvKiogQGZpbGUKKyAgRUZJIE5ldHdvcmsgSW50ZXJmYWNlIElkZW50aWZpZXIgUHJvdG9jb2wKKworICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CisgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworCisqKi8KKworI2lmbmRlZiBfX0VGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGRVJfSF9fCisjZGVmaW5lIF9fRUZJX05FVFdPUktfSU5URVJGQUNFX0lERU5USUZFUl9IX18KKworCisjZGVmaW5lIEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX1BST1RPQ09MX0dVSUQgXAorICB7IFwKKyAgICAweEUxODU0MUNELCAweEY3NTUsIDB4NGY3MywgezB4OTIsIDB4OEQsIDB4NjQsIDB4M0MsIDB4OEEsIDB4NzksIDB4QjIsIDB4MjkgfSBcCisgIH0KKworI2RlZmluZSBFRklfTkVUV09SS19JTlRFUkZBQ0VfSURFTlRJRklFUl9QUk9UT0NPTF9SRVZJU0lPTiAgICAweDAwMDEwMDAwCisKKy8vLworLy8vIFJldmlzaW9uIGRlZmluZWQgaW4gRUZJMS4xLgorLy8vCisjZGVmaW5lIEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX0lOVEVSRkFDRV9SRVZJU0lPTiAgIEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX1BST1RPQ09MX1JFVklTSU9OCisKKy8vLworLy8vIEZvcndhcmQgcmVmZXJlbmNlIGZvciBwdXJlIEFOU0kgY29tcGF0YWJpbGl0eQorLy8vCit0eXBlZGVmIHN0cnVjdCBfRUZJX05FVFdPUktfSU5URVJGQUNFX0lERU5USUZJRVJfUFJPVE9DT0wgIEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX1BST1RPQ09MOworCisvLy8KKy8vLyBQcm90b2NvbCBkZWZpbmVkIGluIEVGSTEuMS4KKy8vLwordHlwZWRlZiBFRklfTkVUV09SS19JTlRFUkZBQ0VfSURFTlRJRklFUl9QUk9UT0NPTCAgIEVGSV9ORVRXT1JLX0lOVEVSRkFDRV9JREVOVElGSUVSX0lOVEVSRkFDRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgRWZpTmV0d29ya0ludGVyZmFjZVVuZGkgPSAxCit9IEVGSV9ORVRXT1JLX1BST1RPQ09MX1RZUEU7CisKKy8vLworLy8vIEFuIG9wdGlvbmFsIHByb3RvY29sIHRoYXQgaXMgdXNlZCB0byBkZXNjcmliZSBkZXRhaWxzIGFib3V0IHRoZSBzb2Z0d2FyZQorLy8vIGxheWVyIHRoYXQgaXMgdXNlZCB0byBwcm9kdWNlIHRoZSBTaW1wbGUgTmV0d29yayBQcm90b2NvbC4KKy8vLworc3RydWN0IF9FRklfTkVUV09SS19JTlRFUkZBQ0VfSURFTlRJRklFUl9QUk9UT0NPTCB7CisgIFVJTlQ2NCAgICBSZXZpc2lvbjsgICAvLy88IFRoZSByZXZpc2lvbiBvZiB0aGUgRUZJX05FVFdPUktfSU5URVJGQUNFX0lERU5USUZJRVIgcHJvdG9jb2wuCisgIFVJTlQ2NCAgICBJRDsgICAgICAgICAvLy88IEFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGlkZW50aWZ5aW5nIHN0cnVjdHVyZSBmb3IgdGhpcyBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGludGVyZmFjZS4gVGhpcyBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlzIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgKHNlZSBTdGFydCgpKS4gV2hlbiB0aGUgbmV0d29yayBpbnRlcmZhY2UgaXMgbm90IHN0YXJ0ZWQsIHRoaXMgZmllbGQgaXMgc2V0IHRvIHplcm8uCisgIFVJTlQ2NCAgICBJbWFnZUFkZHI7ICAvLy88IEFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGlkZW50aWZ5aW5nIHN0cnVjdHVyZSBmb3IgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBuZXR3b3JrIGludGVyZmFjZS4gIFRoaXMgaXMgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gc3RydWN0dXJlLgorICBVSU5UMzIgICAgSW1hZ2VTaXplOyAgLy8vPCBTaXplIG9mIHVucmVsb2NhdGVkIG5ldHdvcmsgaW50ZXJmYWNlIGltYWdlLgorICBDSEFSOCAgICAgU3RyaW5nSWRbNF07Ly8vPCBBIGZvdXItY2hhcmFjdGVyIEFTQ0lJIHN0cmluZyB0aGF0IGlzIHNlbnQgaW4gdGhlIGNsYXNzIGlkZW50aWZpZXIgZmllbGQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgb3B0aW9uIDYwIGluIERIQ1AuIEZvciBhIFR5cGUgb2YgRWZpTmV0d29ya0ludGVyZmFjZVVuZGksIHRoaXMgZmllbGQgaXMgVU5ESS4KKyAgVUlOVDggICAgIFR5cGU7ICAgICAgIC8vLzwgTmV0d29yayBpbnRlcmZhY2UgdHlwZS4gVGhpcyB3aWxsIGJlIHNldCB0byBvbmUgb2YgdGhlIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbiBFRklfTkVUV09SS19JTlRFUkZBQ0VfVFlQRS4KKyAgVUlOVDggICAgIE1ham9yVmVyOyAgIC8vLzwgTWFqb3IgdmVyc2lvbiBudW1iZXIuCisgIFVJTlQ4ICAgICBNaW5vclZlcjsgICAvLy88IE1pbm9yIHZlcnNpb24gbnVtYmVyLgorICBCT09MRUFOICAgSXB2NlN1cHBvcnRlZDsgLy8vPCBUUlVFIGlmIHRoZSBuZXR3b3JrIGludGVyZmFjZSBzdXBwb3J0cyBJUHY2OyBvdGhlcndpc2UgRkFMU0UuCisgIFVJTlQ4ICAgICBJZk51bTsgICAgICAvLy88IFRoZSBuZXR3b3JrIGludGVyZmFjZSBudW1iZXIgdGhhdCBpcyBiZWluZyBpZGVudGlmaWVkIGJ5IHRoaXMgTmV0d29yaworICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBJbnRlcmZhY2UgSWRlbnRpZmllciBQcm90b2NvbC4gVGhpcyBmaWVsZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbAorICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0byB0aGUgSUZjbnQgZmllbGQgaW4gdGhlICFQWEUgc3RydWN0dXJlLgorCit9OworCitleHRlcm4gRUZJX0dVSUQgZ0VmaU5ldHdvcmtJbnRlcmZhY2VJZGVudGlmaWVyUHJvdG9jb2xHdWlkOworZXh0ZXJuIEVGSV9HVUlEIGdFZmlOZXR3b3JrSW50ZXJmYWNlSWRlbnRpZmllclByb3RvY29sR3VpZF8zMTsKKworI2VuZGlmIC8vIF9FRklfTklJX0gKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvUGNpSW8uaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvUGNpSW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWVhNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9QY2lJby5oCkBAIC0wLDAgKzEsNTE5IEBACisvKiogQGZpbGUKKyAgRUZJIFBDSSBJL08gUHJvdG9jb2wgcHJvdmlkZXMgdGhlIGJhc2ljIE1lbW9yeSwgSS9PLCBQQ0kgY29uZmlndXJhdGlvbiwKKyAgYW5kIERNQSBpbnRlcmZhY2VzIHRoYXQgYSBkcml2ZXIgdXNlcyB0byBhY2Nlc3MgaXRzIFBDSSBjb250cm9sbGVyLgorCisgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisqKi8KKworI2lmbmRlZiBfX1BDSV9JT19IX18KKyNkZWZpbmUgX19QQ0lfSU9fSF9fCisKKy8vLworLy8vIEdsb2JhbCBJRCBmb3IgdGhlIFBDSSBJL08gUHJvdG9jb2wKKy8vLworI2RlZmluZSBFRklfUENJX0lPX1BST1RPQ09MX0dVSUQgXAorICB7IFwKKyAgICAweDRjZjViMjAwLCAweDY4YjgsIDB4NGNhNSwgezB4OWUsIDB4ZWMsIDB4YjIsIDB4M2UsIDB4M2YsIDB4NTAsIDB4MiwgMHg5YSB9IFwKKyAgfQorCit0eXBlZGVmIHN0cnVjdCBfRUZJX1BDSV9JT19QUk9UT0NPTCAgRUZJX1BDSV9JT19QUk9UT0NPTDsKKworLy8vCisvLy8gUHJvdG90eXBlcyBmb3IgdGhlIFBDSSBJL08gUHJvdG9jb2wKKy8vLwordHlwZWRlZiBlbnVtIHsKKyAgRWZpUGNpSW9XaWR0aFVpbnQ4ICAgICAgPSAwLAorICBFZmlQY2lJb1dpZHRoVWludDE2LAorICBFZmlQY2lJb1dpZHRoVWludDMyLAorICBFZmlQY2lJb1dpZHRoVWludDY0LAorICBFZmlQY2lJb1dpZHRoRmlmb1VpbnQ4LAorICBFZmlQY2lJb1dpZHRoRmlmb1VpbnQxNiwKKyAgRWZpUGNpSW9XaWR0aEZpZm9VaW50MzIsCisgIEVmaVBjaUlvV2lkdGhGaWZvVWludDY0LAorICBFZmlQY2lJb1dpZHRoRmlsbFVpbnQ4LAorICBFZmlQY2lJb1dpZHRoRmlsbFVpbnQxNiwKKyAgRWZpUGNpSW9XaWR0aEZpbGxVaW50MzIsCisgIEVmaVBjaUlvV2lkdGhGaWxsVWludDY0LAorICBFZmlQY2lJb1dpZHRoTWF4aW11bQorfSBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIOworCisvLworLy8gQ29tcGxldGUgUENJIGFkZHJlc3MgZ2VuZXJhdGVyCisvLworI2RlZmluZSBFRklfUENJX0lPX1BBU1NfVEhST1VHSF9CQVIgICAgICAgICAgICAgICAweGZmICAgIC8vLzwgU3BlY2lhbCBCQVIgdGhhdCBwYXNzZXMgYSBtZW1vcnkgb3IgSS9PIGN5Y2xlIHRocm91Z2ggdW5jaGFuZ2VkCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX01BU0sgICAgICAgICAgICAgICAgIDB4MDc3ZiAgLy8vPCBBbGwgdGhlIGZvbGxvd2luZyBJL08gYW5kIE1lbW9yeSBjeWNsZXMKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSVNBX01PVEhFUkJPQVJEX0lPICAgMHgwMDAxICAvLy88IEkvTyBjeWNsZXMgMHgwMDAwLTB4MDBGRiAoMTAgYml0IGRlY29kZSkKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSVNBX0lPICAgICAgICAgICAgICAgMHgwMDAyICAvLy88IEkvTyBjeWNsZXMgMHgwMTAwLTB4MDNGRiBvciBncmVhdGVyICgxMCBiaXQgZGVjb2RlKQorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfUEFMRVRURV9JTyAgICAgICAweDAwMDQgIC8vLzwgSS9PIGN5Y2xlcyAweDNDNiwgMHgzQzgsIDB4M0M5ICgxMCBiaXQgZGVjb2RlKQorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfTUVNT1JZICAgICAgICAgICAweDAwMDggIC8vLzwgTUVNIGN5Y2xlcyAweEEwMDAwLTB4QkZGRkYgKDI0IGJpdCBkZWNvZGUpCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX1ZHQV9JTyAgICAgICAgICAgICAgIDB4MDAxMCAgLy8vPCBJL08gY3ljbGVzIDB4M0IwLTB4M0JCIGFuZCAweDNDMC0weDNERiAoMTAgYml0IGRlY29kZSkKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSURFX1BSSU1BUllfSU8gICAgICAgMHgwMDIwICAvLy88IEkvTyBjeWNsZXMgMHgxRjAtMHgxRjcsIDB4M0Y2LCAweDNGNyAoMTAgYml0IGRlY29kZSkKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSURFX1NFQ09OREFSWV9JTyAgICAgMHgwMDQwICAvLy88IEkvTyBjeWNsZXMgMHgxNzAtMHgxNzcsIDB4Mzc2LCAweDM3NyAoMTAgYml0IGRlY29kZSkKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfTUVNT1JZX1dSSVRFX0NPTUJJTkUgMHgwMDgwICAvLy88IE1hcCBhIG1lbW9yeSByYW5nZSBzbyB3cml0ZSBhcmUgY29tYmluZWQKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSU8gICAgICAgICAgICAgICAgICAgMHgwMTAwICAvLy88IEVuYWJsZSB0aGUgSS9PIGRlY29kZSBiaXQgaW4gdGhlIFBDSSBDb25maWcgSGVhZGVyCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX01FTU9SWSAgICAgICAgICAgICAgIDB4MDIwMCAgLy8vPCBFbmFibGUgdGhlIE1lbW9yeSBkZWNvZGUgYml0IGluIHRoZSBQQ0kgQ29uZmlnIEhlYWRlcgorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9CVVNfTUFTVEVSICAgICAgICAgICAweDA0MDAgIC8vLzwgRW5hYmxlIHRoZSBETUEgYml0IGluIHRoZSBQQ0kgQ29uZmlnIEhlYWRlcgorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUllfQ0FDSEVEICAgICAgICAweDA4MDAgIC8vLzwgTWFwIGEgbWVtb3J5IHJhbmdlIHNvIGFsbCByL3cgYWNjZXNzZXMgYXJlIGNhY2hlZAorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUllfRElTQUJMRSAgICAgICAweDEwMDAgIC8vLzwgRGlzYWJsZSBhIG1lbW9yeSByYW5nZQorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9FTUJFRERFRF9ERVZJQ0UgICAgICAweDIwMDAgIC8vLzwgQ2xlYXIgZm9yIGFuIGFkZC1pbiBQQ0kgRGV2aWNlCisjZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0VNQkVEREVEX1JPTSAgICAgICAgIDB4NDAwMCAgLy8vPCBDbGVhciBmb3IgYSBwaHlzaWNhbCBQQ0kgT3B0aW9uIFJPTSBhY2Nlc3NlZCB0aHJvdWdoIFJPTSBCQVIKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfRFVBTF9BRERSRVNTX0NZQ0xFICAgMHg4MDAwICAvLy88IENsZWFyIGZvciBQQ0kgY29udHJvbGxlcnMgdGhhdCBjYW4gbm90IGdlbnJhdGUgYSBEQUMKKyNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSVNBX0lPXzE2ICAgICAgICAgICAgMHgxMDAwMCAvLy88IEkvTyBjeWNsZXMgMHgwMTAwLTB4MDNGRiBvciBncmVhdGVyICgxNiBiaXQgZGVjb2RlKQorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfUEFMRVRURV9JT18xNiAgICAweDIwMDAwIC8vLzwgSS9PIGN5Y2xlcyAweDNDNiwgMHgzQzgsIDB4M0M5ICgxNiBiaXQgZGVjb2RlKQorI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfSU9fMTYgICAgICAgICAgICAweDMwMDAwIC8vLzwgSS9PIGN5Y2xlcyAweDNCMC0weDNCQiBhbmQgMHgzQzAtMHgzREYgKDE2IGJpdCBkZWNvZGUpCisKKyNkZWZpbmUgRUZJX1BDSV9ERVZJQ0VfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgKEVGSV9QQ0lfSU9fQVRUUklCVVRFX0lPIHwgRUZJX1BDSV9JT19BVFRSSUJVVEVfTUVNT1JZIHwgRUZJX1BDSV9JT19BVFRSSUJVVEVfQlVTX01BU1RFUikKKyNkZWZpbmUgRUZJX1ZHQV9ERVZJQ0VfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgKEVGSV9QQ0lfSU9fQVRUUklCVVRFX1ZHQV9QQUxFVFRFX0lPIHwgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX01FTU9SWSB8IEVGSV9QQ0lfSU9fQVRUUklCVVRFX1ZHQV9JTyB8IEVGSV9QQ0lfSU9fQVRUUklCVVRFX0lPKQorCisvLy8KKy8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gRUZJX1BDSV9JT19QUk9UT0NPTF9PUEVSQVRJT04KKy8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8KK3R5cGVkZWYgZW51bSB7CisgIEVmaVBjaUlvT3BlcmF0aW9uQnVzTWFzdGVyUmVhZCwKKyAgRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJXcml0ZSwKKyAgRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJDb21tb25CdWZmZXIsCisgIEVmaVBjaUlvT3BlcmF0aW9uTWF4aW11bQorfSBFRklfUENJX0lPX1BST1RPQ09MX09QRVJBVElPTjsKKworLy8vCisvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQVRUUklCVVRFX09QRVJBVElPTgorLy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLwordHlwZWRlZiBlbnVtIHsKKyAgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25HZXQsCisgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uU2V0LAorICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvbkVuYWJsZSwKKyAgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25EaXNhYmxlLAorICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvblN1cHBvcnRlZCwKKyAgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25NYXhpbXVtCit9IEVGSV9QQ0lfSU9fUFJPVE9DT0xfQVRUUklCVVRFX09QRVJBVElPTjsKKworLyoqCisgIFJlYWRzIGZyb20gdGhlIG1lbW9yeSBzcGFjZSBvZiBhIFBDSSBjb250cm9sbGVyLiBSZXR1cm5zIHdoZW4gZWl0aGVyIHRoZSBwb2xsaW5nIGV4aXQgY3JpdGVyaWEgaXMKKyAgc2F0aXNmaWVkIG9yIGFmdGVyIGEgZGVmaW5lZCBkdXJhdGlvbi4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgV2lkdGggICAgICAgICAgICAgICAgIFNpZ25pZmllcyB0aGUgd2lkdGggb2YgdGhlIG1lbW9yeSBvciBJL08gb3BlcmF0aW9ucy4KKyAgQHBhcmFtICBCYXJJbmRleCAgICAgICAgICAgICAgVGhlIEJBUiBpbmRleCBvZiB0aGUgc3RhbmRhcmQgUENJIENvbmZpZ3VyYXRpb24gaGVhZGVyIHRvIHVzZSBhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSBhZGRyZXNzIGZvciB0aGUgbWVtb3J5IG9wZXJhdGlvbiB0byBwZXJmb3JtLgorICBAcGFyYW0gIE9mZnNldCAgICAgICAgICAgICAgICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgc2VsZWN0ZWQgQkFSIHRvIHN0YXJ0IHRoZSBtZW1vcnkgb3BlcmF0aW9uLgorICBAcGFyYW0gIE1hc2sgICAgICAgICAgICAgICAgICBNYXNrIHVzZWQgZm9yIHRoZSBwb2xsaW5nIGNyaXRlcmlhLgorICBAcGFyYW0gIFZhbHVlICAgICAgICAgICAgICAgICBUaGUgY29tcGFyaXNvbiB2YWx1ZSB1c2VkIGZvciB0aGUgcG9sbGluZyBleGl0IGNyaXRlcmlhLgorICBAcGFyYW0gIERlbGF5ICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIDEwMCBucyB1bml0cyB0byBwb2xsLgorICBAcGFyYW0gIFJlc3VsdCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBsYXN0IHZhbHVlIHJlYWQgZnJvbSB0aGUgbWVtb3J5IGxvY2F0aW9uLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBsYXN0IGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgYWNjZXNzIG1hdGNoZWQgdGhlIHBvbGwgZXhpdCBjcml0ZXJpYS4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgQmFySW5kZXggbm90IHZhbGlkIGZvciB0aGlzIFBDSSBjb250cm9sbGVyLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBPZmZzZXQgaXMgbm90IHZhbGlkIGZvciB0aGUgQmFySW5kZXggb2YgdGhpcyBQQ0kgY29udHJvbGxlci4KKyAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgRGVsYXkgZXhwaXJlZCBiZWZvcmUgYSBtYXRjaCBvY2N1cnJlZC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gYSBsYWNrIG9mIHJlc291cmNlcy4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX1BPTExfSU9fTUVNKSgKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgICAgICAgICAgKlRoaXMsCisgIElOICBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIICAgIFdpZHRoLAorICBJTiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBCYXJJbmRleCwKKyAgSU4gIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LAorICBJTiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBNYXNrLAorICBJTiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSwKKyAgSU4gIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgRGVsYXksCisgIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICpSZXN1bHQKKyAgKTsKKworLyoqCisgIEVuYWJsZSBhIFBDSSBkcml2ZXIgdG8gYWNjZXNzIFBDSSBjb250cm9sbGVyIHJlZ2lzdGVycyBpbiB0aGUgUENJIG1lbW9yeSBvciBJL08gc3BhY2UuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLgorICBAcGFyYW0gIFdpZHRoICAgICAgICAgICAgICAgICBTaWduaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBtZW1vcnkgb3IgSS9PIG9wZXJhdGlvbnMuCisgIEBwYXJhbSAgQmFySW5kZXggICAgICAgICAgICAgIFRoZSBCQVIgaW5kZXggb2YgdGhlIHN0YW5kYXJkIFBDSSBDb25maWd1cmF0aW9uIGhlYWRlciB0byB1c2UgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzcyBmb3IgdGhlIG1lbW9yeSBvciBJL08gb3BlcmF0aW9uIHRvIHBlcmZvcm0uCisgIEBwYXJhbSAgT2Zmc2V0ICAgICAgICAgICAgICAgIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBzZWxlY3RlZCBCQVIgdG8gc3RhcnQgdGhlIG1lbW9yeSBvciBJL08gb3BlcmF0aW9uLgorICBAcGFyYW0gIENvdW50ICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIG1lbW9yeSBvciBJL08gb3BlcmF0aW9ucyB0byBwZXJmb3JtLgorICBAcGFyYW0gIEJ1ZmZlciAgICAgICAgICAgICAgICBGb3IgcmVhZCBvcGVyYXRpb25zLCB0aGUgZGVzdGluYXRpb24gYnVmZmVyIHRvIHN0b3JlIHRoZSByZXN1bHRzLiBGb3Igd3JpdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucywgdGhlIHNvdXJjZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBkYXRhIHdhcyByZWFkIGZyb20gb3Igd3JpdHRlbiB0byB0aGUgUENJIGNvbnRyb2xsZXIuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIEJhckluZGV4IG5vdCB2YWxpZCBmb3IgdGhpcyBQQ0kgY29udHJvbGxlci4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWVkIGJ5IE9mZnNldCwgV2lkdGgsIGFuZCBDb3VudCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgZm9yIHRoZSBQQ0kgQkFSIHNwZWNpZmllZCBieSBCYXJJbmRleC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gYSBsYWNrIG9mIHJlc291cmNlcy4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0lPX01FTSkoCisgIElOIEVGSV9QQ0lfSU9fUFJPVE9DT0wgICAgICAgICAgICAgICpUaGlzLAorICBJTiAgICAgRUZJX1BDSV9JT19QUk9UT0NPTF9XSURUSCAgICBXaWR0aCwKKyAgSU4gICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgQmFySW5kZXgsCisgIElOICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQsCisgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfUENJX0lPX1BST1RPQ09MX0lPX01FTSAgUmVhZDsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9JT19NRU0gIFdyaXRlOworfSBFRklfUENJX0lPX1BST1RPQ09MX0FDQ0VTUzsKKworLyoqCisgIEVuYWJsZSBhIFBDSSBkcml2ZXIgdG8gYWNjZXNzIFBDSSBjb250cm9sbGVyIHJlZ2lzdGVycyBpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZS4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgV2lkdGggICAgICAgICAgICAgICAgIFNpZ25pZmllcyB0aGUgd2lkdGggb2YgdGhlIG1lbW9yeSBvcGVyYXRpb25zLgorICBAcGFyYW0gIE9mZnNldCAgICAgICAgICAgICAgICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgZm9yIHRoZSBQQ0kgY29udHJvbGxlci4KKyAgQHBhcmFtICBDb3VudCAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBQQ0kgY29uZmlndXJhdGlvbiBvcGVyYXRpb25zIHRvIHBlcmZvcm0uCisgIEBwYXJhbSAgQnVmZmVyICAgICAgICAgICAgICAgIEZvciByZWFkIG9wZXJhdGlvbnMsIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgdG8gc3RvcmUgdGhlIHJlc3VsdHMuIEZvciB3cml0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLCB0aGUgc291cmNlIGJ1ZmZlciB0byB3cml0ZSBkYXRhIGZyb20uCisKKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZGF0YSB3YXMgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gdGhlIFBDSSBjb250cm9sbGVyLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgYWRkcmVzcyByYW5nZSBzcGVjaWZpZWQgYnkgT2Zmc2V0LCBXaWR0aCwgYW5kIENvdW50IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBmb3IgdGhlIFBDSSBjb25maWd1cmF0aW9uIGhlYWRlciBvZiB0aGUgUENJIGNvbnRyb2xsZXIuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEJ1ZmZlciBpcyBOVUxMIG9yIFdpZHRoIGlzIGludmFsaWQuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUcpKAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICAgICAqVGhpcywKKyAgSU4gICAgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfV0lEVEggICAgV2lkdGgsCisgIElOICAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwKKyAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQsCisgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfUENJX0lPX1BST1RPQ09MX0NPTkZJRyAgUmVhZDsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUcgIFdyaXRlOworfSBFRklfUENJX0lPX1BST1RPQ09MX0NPTkZJR19BQ0NFU1M7CisKKy8qKgorICBFbmFibGVzIGEgUENJIGRyaXZlciB0byBjb3B5IG9uZSByZWdpb24gb2YgUENJIG1lbW9yeSBzcGFjZSB0byBhbm90aGVyIHJlZ2lvbiBvZiBQQ0kKKyAgbWVtb3J5IHNwYWNlLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9JT19QUk9UT0NPTCBpbnN0YW5jZS4KKyAgQHBhcmFtICBXaWR0aCAgICAgICAgICAgICAgICAgU2lnbmlmaWVzIHRoZSB3aWR0aCBvZiB0aGUgbWVtb3J5IG9wZXJhdGlvbnMuCisgIEBwYXJhbSAgRGVzdEJhckluZGV4ICAgICAgICAgIFRoZSBCQVIgaW5kZXggaW4gdGhlIHN0YW5kYXJkIFBDSSBDb25maWd1cmF0aW9uIGhlYWRlciB0byB1c2UgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzcyBmb3IgdGhlIG1lbW9yeSBvcGVyYXRpb24gdG8gcGVyZm9ybS4KKyAgQHBhcmFtICBEZXN0T2Zmc2V0ICAgICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIG9mZnNldCB3aXRoaW4gdGhlIEJBUiBzcGVjaWZpZWQgYnkgRGVzdEJhckluZGV4IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRoZSBtZW1vcnkgd3JpdGVzIGZvciB0aGUgY29weSBvcGVyYXRpb24uCisgIEBwYXJhbSAgU3JjQmFySW5kZXggICAgICAgICAgIFRoZSBCQVIgaW5kZXggaW4gdGhlIHN0YW5kYXJkIFBDSSBDb25maWd1cmF0aW9uIGhlYWRlciB0byB1c2UgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzcyBmb3IgdGhlIG1lbW9yeSBvcGVyYXRpb24gdG8gcGVyZm9ybS4KKyAgQHBhcmFtICBTcmNPZmZzZXQgICAgICAgICAgICAgVGhlIHNvdXJjZSBvZmZzZXQgd2l0aGluIHRoZSBCQVIgc3BlY2lmaWVkIGJ5IFNyY0JhckluZGV4IHRvIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZW1vcnkgcmVhZHMgZm9yIHRoZSBjb3B5IG9wZXJhdGlvbi4KKyAgQHBhcmFtICBDb3VudCAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBtZW1vcnkgb3BlcmF0aW9ucyB0byBwZXJmb3JtLiBCeXRlcyBtb3ZlZCBpcyBXaWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICogQ291bnQsIHN0YXJ0aW5nIGF0IERlc3RPZmZzZXQgYW5kIFNyY09mZnNldC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZGF0YSB3YXMgY29waWVkIGZyb20gb25lIG1lbW9yeSByZWdpb24gdG8gYW5vdGhlciBtZW1vcnkgcmVnaW9uLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBEZXN0QmFySW5kZXggbm90IHZhbGlkIGZvciB0aGlzIFBDSSBjb250cm9sbGVyLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBTcmNCYXJJbmRleCBub3QgdmFsaWQgZm9yIHRoaXMgUENJIGNvbnRyb2xsZXIuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoZSBhZGRyZXNzIHJhbmdlIHNwZWNpZmllZCBieSBEZXN0T2Zmc2V0LCBXaWR0aCwgYW5kIENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB2YWxpZCBmb3IgdGhlIFBDSSBCQVIgc3BlY2lmaWVkIGJ5IERlc3RCYXJJbmRleC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWVkIGJ5IFNyY09mZnNldCwgV2lkdGgsIGFuZCBDb3VudCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdmFsaWQgZm9yIHRoZSBQQ0kgQkFSIHNwZWNpZmllZCBieSBTcmNCYXJJbmRleC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgV2lkdGggaXMgaW52YWxpZC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gYSBsYWNrIG9mIHJlc291cmNlcy4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0NPUFlfTUVNKSgKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsCisgIElOICAgICBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIICAgIFdpZHRoLAorICBJTiAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBEZXN0QmFySW5kZXgsCisgIElOICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgIERlc3RPZmZzZXQsCisgIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIFNyY0JhckluZGV4LAorICBJTiAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBTcmNPZmZzZXQsCisgIElOICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50CisgICk7CisKKy8qKgorICBQcm92aWRlcyB0aGUgUENJIGNvbnRyb2xsZXItQ3NwZWNpZmljIGFkZHJlc3NlcyBuZWVkZWQgdG8gYWNjZXNzIHN5c3RlbSBtZW1vcnkuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLgorICBAcGFyYW0gIE9wZXJhdGlvbiAgICAgICAgICAgICBJbmRpY2F0ZXMgaWYgdGhlIGJ1cyBtYXN0ZXIgaXMgZ29pbmcgdG8gcmVhZCBvciB3cml0ZSB0byBzeXN0ZW0gbWVtb3J5LgorICBAcGFyYW0gIEhvc3RBZGRyZXNzICAgICAgICAgICBUaGUgc3lzdGVtIG1lbW9yeSBhZGRyZXNzIHRvIG1hcCB0byB0aGUgUENJIGNvbnRyb2xsZXIuCisgIEBwYXJhbSAgTnVtYmVyT2ZCeXRlcyAgICAgICAgIE9uIGlucHV0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbWFwLiBPbiBvdXRwdXQgdGhlIG51bWJlciBvZiBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdlcmUgbWFwcGVkLgorICBAcGFyYW0gIERldmljZUFkZHJlc3MgICAgICAgICBUaGUgcmVzdWx0aW5nIG1hcCBhZGRyZXNzIGZvciB0aGUgYnVzIG1hc3RlciBQQ0kgY29udHJvbGxlciB0byB1c2UgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHRoZSBob3N0cyBIb3N0QWRkcmVzcy4KKyAgQHBhcmFtICBNYXBwaW5nICAgICAgICAgICAgICAgQSByZXN1bHRpbmcgdmFsdWUgdG8gcGFzcyB0byBVbm1hcCgpLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSByYW5nZSB3YXMgbWFwcGVkIGZvciB0aGUgcmV0dXJuZWQgTnVtYmVyT2ZCeXRlcy4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIEhvc3RBZGRyZXNzIGNhbm5vdCBiZSBtYXBwZWQgYXMgYSBjb21tb24gYnVmZmVyLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBhIGxhY2sgb2YgcmVzb3VyY2VzLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgc3lzdGVtIGhhcmR3YXJlIGNvdWxkIG5vdCBtYXAgdGhlIHJlcXVlc3RlZCBhZGRyZXNzLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfTUFQKSgKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgICAgICAgICAgICAgICAqVGhpcywKKyAgSU4gICAgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfT1BFUkFUSU9OICBPcGVyYXRpb24sCisgIElOICAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgKkhvc3RBZGRyZXNzLAorICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICpOdW1iZXJPZkJ5dGVzLAorICBPVVQgICAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICpEZXZpY2VBZGRyZXNzLAorICBPVVQgICAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqTWFwcGluZworICApOworCisvKioKKyAgQ29tcGxldGVzIHRoZSBNYXAoKSBvcGVyYXRpb24gYW5kIHJlbGVhc2VzIGFueSBjb3JyZXNwb25kaW5nIHJlc291cmNlcy4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgTWFwcGluZyAgICAgICAgICAgICAgIFRoZSBtYXBwaW5nIHZhbHVlIHJldHVybmVkIGZyb20gTWFwKCkuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHJhbmdlIHdhcyB1bm1hcHBlZC4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGRhdGEgd2FzIG5vdCBjb21taXR0ZWQgdG8gdGhlIHRhcmdldCBzeXN0ZW0gbWVtb3J5LgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfVU5NQVApKAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICAqVGhpcywKKyAgSU4gIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKk1hcHBpbmcKKyAgKTsKKworLyoqCisgIEFsbG9jYXRlcyBwYWdlcyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgYW4gRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJDb21tb25CdWZmZXIKKyAgbWFwcGluZy4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgVHlwZSAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIGlnbm9yZWQuCisgIEBwYXJhbSAgTWVtb3J5VHlwZSAgICAgICAgICAgIFRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSwgRWZpQm9vdFNlcnZpY2VzRGF0YSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmlSdW50aW1lU2VydmljZXNEYXRhLgorICBAcGFyYW0gIFBhZ2VzICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGFsbG9jYXRlLgorICBAcGFyYW0gIEhvc3RBZGRyZXNzICAgICAgICAgICBBIHBvaW50ZXIgdG8gc3RvcmUgdGhlIGJhc2Ugc3lzdGVtIG1lbW9yeSBhZGRyZXNzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgcmFuZ2UuCisgIEBwYXJhbSAgQXR0cmlidXRlcyAgICAgICAgICAgIFRoZSByZXF1ZXN0ZWQgYml0IG1hc2sgb2YgYXR0cmlidXRlcyBmb3IgdGhlIGFsbG9jYXRlZCByYW5nZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgcmVxdWVzdGVkIG1lbW9yeSBwYWdlcyB3ZXJlIGFsbG9jYXRlZC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgQXR0cmlidXRlcyBpcyB1bnN1cHBvcnRlZC4gVGhlIG9ubHkgbGVnYWwgYXR0cmlidXRlIGJpdHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWV9XUklURV9DT01CSU5FIGFuZCBNRU1PUllfQ0FDSEVELgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgbWVtb3J5IHBhZ2VzIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9BTExPQ0FURV9CVUZGRVIpKAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICAqVGhpcywKKyAgSU4gIEVGSV9BTExPQ0FURV9UWVBFICAgICAgICAgICAgVHlwZSwKKyAgSU4gIEVGSV9NRU1PUllfVFlQRSAgICAgICAgICAgICAgTWVtb3J5VHlwZSwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgUGFnZXMsCisgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICoqSG9zdEFkZHJlc3MsCisgIElOICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMKKyAgKTsKKworLyoqCisgIEZyZWVzIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgd2l0aCBBbGxvY2F0ZUJ1ZmZlcigpLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9JT19QUk9UT0NPTCBpbnN0YW5jZS4KKyAgQHBhcmFtICBQYWdlcyAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBwYWdlcyB0byBmcmVlLgorICBAcGFyYW0gIEhvc3RBZGRyZXNzICAgICAgICAgICBUaGUgYmFzZSBzeXN0ZW0gbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCByYW5nZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgcmVxdWVzdGVkIG1lbW9yeSBwYWdlcyB3ZXJlIGZyZWVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBUaGUgbWVtb3J5IHJhbmdlIHNwZWNpZmllZCBieSBIb3N0QWRkcmVzcyBhbmQgUGFnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIG5vdCBhbGxvY2F0ZWQgd2l0aCBBbGxvY2F0ZUJ1ZmZlcigpLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfRlJFRV9CVUZGRVIpKAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICAqVGhpcywKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgUGFnZXMsCisgIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpIb3N0QWRkcmVzcworICApOworCisvKioKKyAgRmx1c2hlcyBhbGwgUENJIHBvc3RlZCB3cml0ZSB0cmFuc2FjdGlvbnMgZnJvbSBhIFBDSSBob3N0IGJyaWRnZSB0byBzeXN0ZW0gbWVtb3J5LgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9JT19QUk9UT0NPTCBpbnN0YW5jZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgUENJIHBvc3RlZCB3cml0ZSB0cmFuc2FjdGlvbnMgd2VyZSBmbHVzaGVkIGZyb20gdGhlIFBDSSBob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZSB0byBzeXN0ZW0gbWVtb3J5LgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgUENJIHBvc3RlZCB3cml0ZSB0cmFuc2FjdGlvbnMgd2VyZSBub3QgZmx1c2hlZCBmcm9tIHRoZSBQQ0kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCBicmlkZ2UgZHVlIHRvIGEgaGFyZHdhcmUgZXJyb3IuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9GTFVTSCkoCisgIElOIEVGSV9QQ0lfSU9fUFJPVE9DT0wgICpUaGlzCisgICk7CisKKy8qKgorICBSZXRyaWV2ZXMgdGhpcyBQQ0kgY29udHJvbGxlcidzIGN1cnJlbnQgUENJIGJ1cyBudW1iZXIsIGRldmljZSBudW1iZXIsIGFuZCBmdW5jdGlvbiBudW1iZXIuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLgorICBAcGFyYW0gIFNlZ21lbnROdW1iZXIgICAgICAgICBUaGUgUENJIGNvbnRyb2xsZXIncyBjdXJyZW50IFBDSSBzZWdtZW50IG51bWJlci4KKyAgQHBhcmFtICBCdXNOdW1iZXIgICAgICAgICAgICAgVGhlIFBDSSBjb250cm9sbGVyJ3MgY3VycmVudCBQQ0kgYnVzIG51bWJlci4KKyAgQHBhcmFtICBEZXZpY2VOdW1iZXIgICAgICAgICAgVGhlIFBDSSBjb250cm9sbGVyJ3MgY3VycmVudCBQQ0kgZGV2aWNlIG51bWJlci4KKyAgQHBhcmFtICBGdW5jdGlvbk51bWJlciAgICAgICAgVGhlIFBDSSBjb250cm9sbGVyJ3MgY3VycmVudCBQQ0kgZnVuY3Rpb24gbnVtYmVyLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBQQ0kgY29udHJvbGxlciBsb2NhdGlvbiB3YXMgcmV0dXJuZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9HRVRfTE9DQVRJT04pKAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICpUaGlzLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpTZWdtZW50TnVtYmVyLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpCdXNOdW1iZXIsCisgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKkRldmljZU51bWJlciwKKyAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqRnVuY3Rpb25OdW1iZXIKKyAgKTsKKworLyoqCisgIFBlcmZvcm1zIGFuIG9wZXJhdGlvbiBvbiB0aGUgYXR0cmlidXRlcyB0aGF0IHRoaXMgUENJIGNvbnRyb2xsZXIgc3VwcG9ydHMuIFRoZSBvcGVyYXRpb25zIGluY2x1ZGUKKyAgZ2V0dGluZyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzLCByZXRyaWV2aW5nIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMsIHNldHRpbmcgdGhlIGN1cnJlbnQKKyAgYXR0cmlidXRlcywgZW5hYmxpbmcgYXR0cmlidXRlcywgYW5kIGRpc2FibGluZyBhdHRyaWJ1dGVzLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9JT19QUk9UT0NPTCBpbnN0YW5jZS4KKyAgQHBhcmFtICBPcGVyYXRpb24gICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIG9uIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIFBDSSBjb250cm9sbGVyLgorICBAcGFyYW0gIEF0dHJpYnV0ZXMgICAgICAgICAgICBUaGUgbWFzayBvZiBhdHRyaWJ1dGVzIHRoYXQgYXJlIHVzZWQgZm9yIFNldCwgRW5hYmxlLCBhbmQgRGlzYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLgorICBAcGFyYW0gIFJlc3VsdCAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBtYXNrIG9mIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmV0dXJuZWQgZm9yIHRoZSBHZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFN1cHBvcnRlZCBvcGVyYXRpb25zLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBvcGVyYXRpb24gb24gdGhlIFBDSSBjb250cm9sbGVyJ3MgYXR0cmlidXRlcyB3YXMgY29tcGxldGVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgYml0cyBzZXQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIFBDSSBjb250cm9sbGVyIG9yIG9uZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgcGFyZW50IGJyaWRnZXMgd2hlbiBPcGVyYXRpb24gaXMgU2V0LCBFbmFibGUgb3IgRGlzYWJsZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0FUVFJJQlVURVMpKAorICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAqVGhpcywKKyAgSU4gIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQVRUUklCVVRFX09QRVJBVElPTiAgT3BlcmF0aW9uLAorICBJTiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzLAorICBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUmVzdWx0IE9QVElPTkFMCisgICk7CisKKy8qKgorICBHZXRzIHRoZSBhdHRyaWJ1dGVzIHRoYXQgdGhpcyBQQ0kgY29udHJvbGxlciBzdXBwb3J0cyBzZXR0aW5nIG9uIGEgQkFSIHVzaW5nCisgIFNldEJhckF0dHJpYnV0ZXMoKSwgYW5kIHJldHJpZXZlcyB0aGUgbGlzdCBvZiByZXNvdXJjZSBkZXNjcmlwdG9ycyBmb3IgYSBCQVIuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLgorICBAcGFyYW0gIEJhckluZGV4ICAgICAgICAgICAgICBUaGUgQkFSIGluZGV4IG9mIHRoZSBzdGFuZGFyZCBQQ0kgQ29uZmlndXJhdGlvbiBoZWFkZXIgdG8gdXNlIGFzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIGFkZHJlc3MgZm9yIHJlc291cmNlIHJhbmdlLiBUaGUgbGVnYWwgcmFuZ2UgZm9yIHRoaXMgZmllbGQgaXMgMC4uNS4KKyAgQHBhcmFtICBTdXBwb3J0cyAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBtYXNrIG9mIGF0dHJpYnV0ZXMgdGhhdCB0aGlzIFBDSSBjb250cm9sbGVyIHN1cHBvcnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgZm9yIHRoaXMgQkFSIHdpdGggU2V0QmFyQXR0cmlidXRlcygpLgorICBAcGFyYW0gIFJlc291cmNlcyAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEFDUEkgMi4wIHJlc291cmNlIGRlc2NyaXB0b3JzIHRoYXQgZGVzY3JpYmUgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvZiB0aGlzIEJBUiBvZiB0aGUgUENJIGNvbnRyb2xsZXIuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgSWYgU3VwcG9ydHMgaXMgbm90IE5VTEwsIHRoZW4gdGhlIGF0dHJpYnV0ZXMgdGhhdCB0aGUgUENJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgc3VwcG9ydHMgYXJlIHJldHVybmVkIGluIFN1cHBvcnRzLiBJZiBSZXNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IE5VTEwsIHRoZW4gdGhlIEFDUEkgMi4wIHJlc291cmNlIGRlc2NyaXB0b3JzIHRoYXQgdGhlIFBDSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyIGlzIGN1cnJlbnRseSB1c2luZyBhcmUgcmV0dXJuZWQgaW4gUmVzb3VyY2VzLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBCb3RoIFN1cHBvcnRzIGFuZCBBdHRyaWJ1dGVzIGFyZSBOVUxMLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBCYXJJbmRleCBub3QgdmFsaWQgZm9yIHRoaXMgUENJIGNvbnRyb2xsZXIuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyBhdmFpbGFibGUgdG8gYWxsb2NhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfR0VUX0JBUl9BVFRSSUJVVEVTKSgKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgICAgICAgICAgICAqVGhpcywKKyAgSU4gIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICBCYXJJbmRleCwKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAqU3VwcG9ydHMsIE9QVElPTkFMCisgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgKipSZXNvdXJjZXMgT1BUSU9OQUwKKyAgKTsKKworLyoqCisgIFNldHMgdGhlIGF0dHJpYnV0ZXMgZm9yIGEgcmFuZ2Ugb2YgYSBCQVIgb24gYSBQQ0kgY29udHJvbGxlci4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UuCisgIEBwYXJhbSAgQXR0cmlidXRlcyAgICAgICAgICAgIFRoZSBtYXNrIG9mIGF0dHJpYnV0ZXMgdG8gc2V0IGZvciB0aGUgcmVzb3VyY2UgcmFuZ2Ugc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhckluZGV4LCBPZmZzZXQsIGFuZCBMZW5ndGguCisgIEBwYXJhbSAgQmFySW5kZXggICAgICAgICAgICAgIFRoZSBCQVIgaW5kZXggb2YgdGhlIHN0YW5kYXJkIFBDSSBDb25maWd1cmF0aW9uIGhlYWRlciB0byB1c2UgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzcyBmb3IgcmVzb3VyY2UgcmFuZ2UuIFRoZSBsZWdhbCByYW5nZSBmb3IgdGhpcyBmaWVsZCBpcyAwLi41LgorICBAcGFyYW0gIE9mZnNldCAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEJBUiByZWxhdGl2ZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlIHJhbmdlIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIGJ5IHRoZSBhdHRyaWJ1dGVzIHNwZWNpZmllZCBieSBBdHRyaWJ1dGVzLgorICBAcGFyYW0gIExlbmd0aCAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcmFuZ2UgdG8gYmUgbW9kaWZpZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGJ5IEF0dHJpYnV0ZXMuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHNldCBvZiBhdHRyaWJ1dGVzIHNwZWNpZmllZCBieSBBdHRyaWJ1dGVzIGZvciB0aGUgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Ugc3BlY2lmaWVkIGJ5IEJhckluZGV4LCBPZmZzZXQsIGFuZCBMZW5ndGggd2VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgb24gdGhlIFBDSSBjb250cm9sbGVyLCBhbmQgdGhlIGFjdHVhbCByZXNvdXJjZSByYW5nZSBpcyByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBPZmZzZXQgYW5kIExlbmd0aC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT2Zmc2V0IG9yIExlbmd0aCBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBCYXJJbmRleCBub3QgdmFsaWQgZm9yIHRoaXMgUENJIGNvbnRyb2xsZXIuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyB0byBzZXQgdGhlIGF0dHJpYnV0ZXMgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIHJhbmdlIHNwZWNpZmllZCBieSBCYXJJbmRleCwgT2Zmc2V0LCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfU0VUX0JBUl9BVFRSSUJVVEVTKSgKKyAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsCisgIElOICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMsCisgIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIEJhckluZGV4LAorICBJTiBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAqT2Zmc2V0LAorICBJTiBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoCisgICk7CisKKy8vLworLy8vIFRoZSBFRklfUENJX0lPX1BST1RPQ09MIHByb3ZpZGVzIHRoZSBiYXNpYyBNZW1vcnksIEkvTywgUENJIGNvbmZpZ3VyYXRpb24sCisvLy8gYW5kIERNQSBpbnRlcmZhY2VzIHRoYXQgYXJlIHVzZWQgdG8gYWJzdHJhY3QgYWNjZXNzZXMgdG8gUENJIGNvbnRyb2xsZXJzLgorLy8vIFRoZXJlIGlzIG9uZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlIGZvciBlYWNoIFBDSSBjb250cm9sbGVyIG9uIGEgUENJIGJ1cy4KKy8vLyBBIGRldmljZSBkcml2ZXIgdGhhdCB3aXNoZXMgdG8gbWFuYWdlIGEgUENJIGNvbnRyb2xsZXIgaW4gYSBzeXN0ZW0gd2lsbCBoYXZlIHRvCisvLy8gcmV0cmlldmUgdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIFBDSSBjb250cm9sbGVyLgorLy8vCitzdHJ1Y3QgX0VGSV9QQ0lfSU9fUFJPVE9DT0wgeworICBFRklfUENJX0lPX1BST1RPQ09MX1BPTExfSU9fTUVNICAgICAgICAgUG9sbE1lbTsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9QT0xMX0lPX01FTSAgICAgICAgIFBvbGxJbzsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9BQ0NFU1MgICAgICAgICAgICAgIE1lbTsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9BQ0NFU1MgICAgICAgICAgICAgIElvOworICBFRklfUENJX0lPX1BST1RPQ09MX0NPTkZJR19BQ0NFU1MgICAgICAgUGNpOworICBFRklfUENJX0lPX1BST1RPQ09MX0NPUFlfTUVNICAgICAgICAgICAgQ29weU1lbTsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9NQVAgICAgICAgICAgICAgICAgIE1hcDsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9VTk1BUCAgICAgICAgICAgICAgIFVubWFwOworICBFRklfUENJX0lPX1BST1RPQ09MX0FMTE9DQVRFX0JVRkZFUiAgICAgQWxsb2NhdGVCdWZmZXI7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfRlJFRV9CVUZGRVIgICAgICAgICBGcmVlQnVmZmVyOworICBFRklfUENJX0lPX1BST1RPQ09MX0ZMVVNIICAgICAgICAgICAgICAgRmx1c2g7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfR0VUX0xPQ0FUSU9OICAgICAgICBHZXRMb2NhdGlvbjsKKyAgRUZJX1BDSV9JT19QUk9UT0NPTF9BVFRSSUJVVEVTICAgICAgICAgIEF0dHJpYnV0ZXM7CisgIEVGSV9QQ0lfSU9fUFJPVE9DT0xfR0VUX0JBUl9BVFRSSUJVVEVTICBHZXRCYXJBdHRyaWJ1dGVzOworICBFRklfUENJX0lPX1BST1RPQ09MX1NFVF9CQVJfQVRUUklCVVRFUyAgU2V0QmFyQXR0cmlidXRlczsKKworICAvLy8KKyAgLy8vIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIFJPTSBpbWFnZS4KKyAgLy8vCisgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb21TaXplOworCisgIC8vLworICAvLy8gQSBwb2ludGVyIHRvIHRoZSBpbiBtZW1vcnkgY29weSBvZiB0aGUgUk9NIGltYWdlLiBUaGUgUENJIEJ1cyBEcml2ZXIgaXMgcmVzcG9uc2libGUKKyAgLy8vIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgdGhlIFJPTSBpbWFnZSwgYW5kIGNvcHlpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBST00gdG8gbWVtb3J5LgorICAvLy8gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSBlaXRoZXIgZnJvbSB0aGUgUENJIG9wdGlvbiBST00gdGhhdCBjYW4gYmUgYWNjZXNzZWQKKyAgLy8vIHRocm91Z2ggdGhlIFJPTSBCQVIgb2YgdGhlIFBDSSBjb250cm9sbGVyLCBvciBpdCBpcyBmcm9tIGEgcGxhdGZvcm0tc3BlY2lmaWMgbG9jYXRpb24uCisgIC8vLyBUaGUgQXR0cmlidXRlcygpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBmcm9tIHdoaWNoIG9mIHRoZXNlIHR3byBzb3VyY2VzCisgIC8vLyB0aGUgUm9tSW1hZ2UgYnVmZmVyIHdhcyBpbml0aWFsaXplZC4KKyAgLy8vCisgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUm9tSW1hZ2U7Cit9OworCitleHRlcm4gRUZJX0dVSUQgZ0VmaVBjaUlvUHJvdG9jb2xHdWlkOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvUGNpUm9vdEJyaWRnZUlvLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL1BjaVJvb3RCcmlkZ2VJby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTUwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL1BjaVJvb3RCcmlkZ2VJby5oCkBAIC0wLDAgKzEsMzkzIEBACisvKiogQGZpbGUKKyAgUENJIFJvb3QgQnJpZGdlIEkvTyBwcm90b2NvbCBhcyBkZWZpbmVkIGluIHRoZSBVRUZJIDIuMCBzcGVjaWZpY2F0aW9uLgorCisgIFBDSSBSb290IEJyaWRnZSBJL08gcHJvdG9jb2wgaXMgdXNlZCBieSBQQ0kgQnVzIERyaXZlciB0byBwZXJmb3JtIFBDSSBNZW1vcnksIFBDSSBJL08sCisgIGFuZCBQQ0kgQ29uZmlndXJhdGlvbiBjeWNsZXMgb24gYSBQQ0kgUm9vdCBCcmlkZ2UuIEl0IGFsc28gcHJvdmlkZXMgc2VydmljZXMgdG8gcGVyZm9ybQorICBkZWZmZXJlbnQgdHlwZXMgb2YgYnVzIG1hc3RlcmluZyBETUEKKworICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CisgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworKiovCisKKyNpZm5kZWYgX19QQ0lfUk9PVF9CUklER0VfSU9fSF9fCisjZGVmaW5lIF9fUENJX1JPT1RfQlJJREdFX0lPX0hfXworCisjZGVmaW5lIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfR1VJRCBcCisgIHsgXAorICAgIDB4MmY3MDdlYmIsIDB4NGExYSwgMHgxMWQ0LCB7MHg5YSwgMHgzOCwgMHgwMCwgMHg5MCwgMHgyNywgMHgzZiwgMHhjMSwgMHg0ZCB9IFwKKyAgfQorCit0eXBlZGVmIHN0cnVjdCBfRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTCAgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTDsKKwordHlwZWRlZiBlbnVtIHsKKyAgRWZpUGNpV2lkdGhVaW50OCwKKyAgRWZpUGNpV2lkdGhVaW50MTYsCisgIEVmaVBjaVdpZHRoVWludDMyLAorICBFZmlQY2lXaWR0aFVpbnQ2NCwKKyAgRWZpUGNpV2lkdGhGaWZvVWludDgsCisgIEVmaVBjaVdpZHRoRmlmb1VpbnQxNiwKKyAgRWZpUGNpV2lkdGhGaWZvVWludDMyLAorICBFZmlQY2lXaWR0aEZpZm9VaW50NjQsCisgIEVmaVBjaVdpZHRoRmlsbFVpbnQ4LAorICBFZmlQY2lXaWR0aEZpbGxVaW50MTYsCisgIEVmaVBjaVdpZHRoRmlsbFVpbnQzMiwKKyAgRWZpUGNpV2lkdGhGaWxsVWludDY0LAorICBFZmlQY2lXaWR0aE1heGltdW0KK30gRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9XSURUSDsKKwordHlwZWRlZiBlbnVtIHsKKyAgRWZpUGNpT3BlcmF0aW9uQnVzTWFzdGVyUmVhZCwKKyAgRWZpUGNpT3BlcmF0aW9uQnVzTWFzdGVyV3JpdGUsCisgIEVmaVBjaU9wZXJhdGlvbkJ1c01hc3RlckNvbW1vbkJ1ZmZlciwKKyAgRWZpUGNpT3BlcmF0aW9uQnVzTWFzdGVyUmVhZDY0LAorICBFZmlQY2lPcGVyYXRpb25CdXNNYXN0ZXJXcml0ZTY0LAorICBFZmlQY2lPcGVyYXRpb25CdXNNYXN0ZXJDb21tb25CdWZmZXI2NCwKKyAgRWZpUGNpT3BlcmF0aW9uTWF4aW11bQorfSBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MX09QRVJBVElPTjsKKworI2RlZmluZSBFRklfUENJX0FUVFJJQlVURV9JU0FfTU9USEVSQk9BUkRfSU8gICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEVGSV9QQ0lfQVRUUklCVVRFX0lTQV9JTyAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRUZJX1BDSV9BVFRSSUJVVEVfVkdBX1BBTEVUVEVfSU8gICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBFRklfUENJX0FUVFJJQlVURV9WR0FfTUVNT1JZICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEVGSV9QQ0lfQVRUUklCVVRFX1ZHQV9JTyAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRUZJX1BDSV9BVFRSSUJVVEVfSURFX1BSSU1BUllfSU8gICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBFRklfUENJX0FUVFJJQlVURV9JREVfU0VDT05EQVJZX0lPICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEVGSV9QQ0lfQVRUUklCVVRFX01FTU9SWV9XUklURV9DT01CSU5FICAgICAgICAweDAwODAKKyNkZWZpbmUgRUZJX1BDSV9BVFRSSUJVVEVfTUVNT1JZX0NBQ0hFRCAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBFRklfUENJX0FUVFJJQlVURV9NRU1PUllfRElTQUJMRSAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEVGSV9QQ0lfQVRUUklCVVRFX0RVQUxfQUREUkVTU19DWUNMRSAgICAgICAgICAweDgwMDAKKworI2RlZmluZSBFRklfUENJX0FUVFJJQlVURV9WQUxJRF9GT1JfQUxMT0NBVEVfQlVGRkVSICAgKEVGSV9QQ0lfQVRUUklCVVRFX01FTU9SWV9XUklURV9DT01CSU5FIHwgRUZJX1BDSV9BVFRSSUJVVEVfTUVNT1JZX0NBQ0hFRCB8IEVGSV9QQ0lfQVRUUklCVVRFX0RVQUxfQUREUkVTU19DWUNMRSkKKworI2RlZmluZSBFRklfUENJX0FUVFJJQlVURV9JTlZBTElEX0ZPUl9BTExPQ0FURV9CVUZGRVIgKH5FRklfUENJX0FUVFJJQlVURV9WQUxJRF9GT1JfQUxMT0NBVEVfQlVGRkVSKQorCisjZGVmaW5lIEVGSV9QQ0lfQUREUkVTUyhidXMsIGRldiwgZnVuYywgcmVnKSBcCisgICAgKChVSU5UNjQpICgoKChVSU5UTikgYnVzKSA8PCAyNCkgKyAoKChVSU5UTikgZGV2KSA8PCAxNikgKyAoKChVSU5UTikgZnVuYykgPDwgOCkgKyAoKFVJTlROKSByZWcpKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UOCAgIFJlZ2lzdGVyOworICBVSU5UOCAgIEZ1bmN0aW9uOworICBVSU5UOCAgIERldmljZTsKKyAgVUlOVDggICBCdXM7CisgIFVJTlQzMiAgRXh0ZW5kZWRSZWdpc3RlcjsKK30gRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9QQ0lfQUREUkVTUzsKKworLyoqCisgIFJlYWRzIGZyb20gdGhlIEkvTyBzcGFjZSBvZiBhIFBDSSBSb290IEJyaWRnZS4gUmV0dXJucyB3aGVuIGVpdGhlciB0aGUgcG9sbGluZyBleGl0IGNyaXRlcmlhIGlzCisgIHNhdGlzZmllZCBvciBhZnRlciBhIGRlZmluZWQgZHVyYXRpb24uCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MLgorICBAcGFyYW0gIFdpZHRoICAgICAgICAgICAgICAgICBTaWduaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBtZW1vcnkgb3IgSS9PIG9wZXJhdGlvbnMuCisgIEBwYXJhbSAgQWRkcmVzcyAgICAgICAgICAgICAgIFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBvciBJL08gb3BlcmF0aW9ucy4KKyAgQHBhcmFtICBNYXNrICAgICAgICAgICAgICAgICAgTWFzayB1c2VkIGZvciB0aGUgcG9sbGluZyBjcml0ZXJpYS4KKyAgQHBhcmFtICBWYWx1ZSAgICAgICAgICAgICAgICAgVGhlIGNvbXBhcmlzb24gdmFsdWUgdXNlZCBmb3IgdGhlIHBvbGxpbmcgZXhpdCBjcml0ZXJpYS4KKyAgQHBhcmFtICBEZWxheSAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiAxMDAgbnMgdW5pdHMgdG8gcG9sbC4KKyAgQHBhcmFtICBSZXN1bHQgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbGFzdCB2YWx1ZSByZWFkIGZyb20gdGhlIG1lbW9yeSBsb2NhdGlvbi4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbGFzdCBkYXRhIHJldHVybmVkIGZyb20gdGhlIGFjY2VzcyBtYXRjaGVkIHRoZSBwb2xsIGV4aXQgY3JpdGVyaWEuCisgIEByZXR2YWwgRUZJX1RJTUVPVVQgICAgICAgICAgIERlbGF5IGV4cGlyZWQgYmVmb3JlIGEgbWF0Y2ggb2NjdXJyZWQuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9QT0xMX0lPX01FTSkoCisgIElOIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0wgICAgICAgICAgICpUaGlzLAorICBJTiAgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9XSURUSCAgICBXaWR0aCwKKyAgSU4gIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcywKKyAgSU4gIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFzaywKKyAgSU4gIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUsCisgIElOICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5LAorICBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUmVzdWx0CisgICk7CisKKy8qKgorICBFbmFibGVzIGEgUENJIGRyaXZlciB0byBhY2Nlc3MgUENJIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGluIHRoZSBQQ0kgcm9vdCBicmlkZ2UgbWVtb3J5IHNwYWNlLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTC4KKyAgQHBhcmFtICBXaWR0aCAgICAgICAgICAgICAgICAgU2lnbmlmaWVzIHRoZSB3aWR0aCBvZiB0aGUgbWVtb3J5IG9wZXJhdGlvbnMuCisgIEBwYXJhbSAgQWRkcmVzcyAgICAgICAgICAgICAgIFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBvcGVyYXRpb25zLgorICBAcGFyYW0gIENvdW50ICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIG1lbW9yeSBvcGVyYXRpb25zIHRvIHBlcmZvcm0uCisgIEBwYXJhbSAgQnVmZmVyICAgICAgICAgICAgICAgIEZvciByZWFkIG9wZXJhdGlvbnMsIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgdG8gc3RvcmUgdGhlIHJlc3VsdHMuIEZvciB3cml0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLCB0aGUgc291cmNlIGJ1ZmZlciB0byB3cml0ZSBkYXRhIGZyb20uCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGRhdGEgd2FzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIHRoZSBQQ0kgcm9vdCBicmlkZ2UuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9JT19NRU0pKAorICBJTiBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MICAgICAgICAgICAgICAqVGhpcywKKyAgSU4gICAgIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfV0lEVEggICAgV2lkdGgsCisgIElOICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MsCisgIElOICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50LAorICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9JT19NRU0gIFJlYWQ7CisgIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfSU9fTUVNICBXcml0ZTsKK30gRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9BQ0NFU1M7CisKKy8qKgorICBFbmFibGVzIGEgUENJIGRyaXZlciB0byBjb3B5IG9uZSByZWdpb24gb2YgUENJIHJvb3QgYnJpZGdlIG1lbW9yeSBzcGFjZSB0byBhbm90aGVyIHJlZ2lvbiBvZiBQQ0kKKyAgcm9vdCBicmlkZ2UgbWVtb3J5IHNwYWNlLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTCBpbnN0YW5jZS4KKyAgQHBhcmFtICBXaWR0aCAgICAgICAgICAgICAgICAgU2lnbmlmaWVzIHRoZSB3aWR0aCBvZiB0aGUgbWVtb3J5IG9wZXJhdGlvbnMuCisgIEBwYXJhbSAgRGVzdEFkZHJlc3MgICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgb3BlcmF0aW9uLgorICBAcGFyYW0gIFNyY0FkZHJlc3MgICAgICAgICAgICBUaGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBvcGVyYXRpb24uCisgIEBwYXJhbSAgQ291bnQgICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgbWVtb3J5IG9wZXJhdGlvbnMgdG8gcGVyZm9ybS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZGF0YSB3YXMgY29waWVkIGZyb20gb25lIG1lbW9yeSByZWdpb24gdG8gYW5vdGhlciBtZW1vcnkgcmVnaW9uLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBXaWR0aCBpcyBpbnZhbGlkIGZvciB0aGlzIFBDSSByb290IGJyaWRnZS4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gYSBsYWNrIG9mIHJlc291cmNlcy4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MX0NPUFlfTUVNKSgKKyAgSU4gRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsCisgIElOICAgICBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MX1dJRFRIICAgIFdpZHRoLAorICBJTiAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0QWRkcmVzcywKKyAgSU4gICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjQWRkcmVzcywKKyAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQKKyAgKTsKKworLyoqCisgIFByb3ZpZGVzIHRoZSBQQ0kgY29udHJvbGxlci1Dc3BlY2lmaWMgYWRkcmVzc2VzIHJlcXVpcmVkIHRvIGFjY2VzcyBzeXN0ZW0gbWVtb3J5IGZyb20gYQorICBETUEgYnVzIG1hc3Rlci4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0wuCisgIEBwYXJhbSAgT3BlcmF0aW9uICAgICAgICAgICAgIEluZGljYXRlcyBpZiB0aGUgYnVzIG1hc3RlciBpcyBnb2luZyB0byByZWFkIG9yIHdyaXRlIHRvIHN5c3RlbSBtZW1vcnkuCisgIEBwYXJhbSAgSG9zdEFkZHJlc3MgICAgICAgICAgIFRoZSBzeXN0ZW0gbWVtb3J5IGFkZHJlc3MgdG8gbWFwIHRvIHRoZSBQQ0kgY29udHJvbGxlci4KKyAgQHBhcmFtICBOdW1iZXJPZkJ5dGVzICAgICAgICAgT24gaW5wdXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBtYXAuIE9uIG91dHB1dCB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2VyZSBtYXBwZWQuCisgIEBwYXJhbSAgRGV2aWNlQWRkcmVzcyAgICAgICAgIFRoZSByZXN1bHRpbmcgbWFwIGFkZHJlc3MgZm9yIHRoZSBidXMgbWFzdGVyIFBDSSBjb250cm9sbGVyIHRvIHVzZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgdGhlIGhvc3RzIEhvc3RBZGRyZXNzLgorICBAcGFyYW0gIE1hcHBpbmcgICAgICAgICAgICAgICBBIHJlc3VsdGluZyB2YWx1ZSB0byBwYXNzIHRvIFVubWFwKCkuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHJhbmdlIHdhcyBtYXBwZWQgZm9yIHRoZSByZXR1cm5lZCBOdW1iZXJPZkJ5dGVzLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgSG9zdEFkZHJlc3MgY2Fubm90IGJlIG1hcHBlZCBhcyBhIGNvbW1vbiBidWZmZXIuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBzeXN0ZW0gaGFyZHdhcmUgY291bGQgbm90IG1hcCB0aGUgcmVxdWVzdGVkIGFkZHJlc3MuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9NQVApKAorICBJTiBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MICAgICAgICAgICAgICAgICpUaGlzLAorICBJTiAgICAgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9PUEVSQVRJT04gIE9wZXJhdGlvbiwKKyAgSU4gICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSG9zdEFkZHJlc3MsCisgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKk51bWJlck9mQnl0ZXMsCisgIE9VVCAgICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgKkRldmljZUFkZHJlc3MsCisgIE9VVCAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipNYXBwaW5nCisgICk7CisKKy8qKgorICBDb21wbGV0ZXMgdGhlIE1hcCgpIG9wZXJhdGlvbiBhbmQgcmVsZWFzZXMgYW55IGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTC4KKyAgQHBhcmFtICBNYXBwaW5nICAgICAgICAgICAgICAgVGhlIG1hcHBpbmcgdmFsdWUgcmV0dXJuZWQgZnJvbSBNYXAoKS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgcmFuZ2Ugd2FzIHVubWFwcGVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBNYXBwaW5nIGlzIG5vdCBhIHZhbHVlIHRoYXQgd2FzIHJldHVybmVkIGJ5IE1hcCgpLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgZGF0YSB3YXMgbm90IGNvbW1pdHRlZCB0byB0aGUgdGFyZ2V0IHN5c3RlbSBtZW1vcnkuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9VTk1BUCkoCisgIElOIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0wgICAgICAgICAgICpUaGlzLAorICBJTiAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTWFwcGluZworICApOworCisvKioKKyAgQWxsb2NhdGVzIHBhZ2VzIHRoYXQgYXJlIHN1aXRhYmxlIGZvciBhbiBFZmlQY2lPcGVyYXRpb25CdXNNYXN0ZXJDb21tb25CdWZmZXIgb3IKKyAgRWZpUGNpT3BlcmF0aW9uQnVzTWFzdGVyQ29tbW9uQnVmZmVyNjQgbWFwcGluZy4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0wuCisgIEBwYXJhbSAgVHlwZSAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIGlnbm9yZWQuCisgIEBwYXJhbSAgTWVtb3J5VHlwZSAgICAgICAgICAgIFRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSwgRWZpQm9vdFNlcnZpY2VzRGF0YSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmlSdW50aW1lU2VydmljZXNEYXRhLgorICBAcGFyYW0gIFBhZ2VzICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGFsbG9jYXRlLgorICBAcGFyYW0gIEhvc3RBZGRyZXNzICAgICAgICAgICBBIHBvaW50ZXIgdG8gc3RvcmUgdGhlIGJhc2Ugc3lzdGVtIG1lbW9yeSBhZGRyZXNzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgcmFuZ2UuCisgIEBwYXJhbSAgQXR0cmlidXRlcyAgICAgICAgICAgIFRoZSByZXF1ZXN0ZWQgYml0IG1hc2sgb2YgYXR0cmlidXRlcyBmb3IgdGhlIGFsbG9jYXRlZCByYW5nZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgcmVxdWVzdGVkIG1lbW9yeSBwYWdlcyB3ZXJlIGFsbG9jYXRlZC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgQXR0cmlidXRlcyBpcyB1bnN1cHBvcnRlZC4gVGhlIG9ubHkgbGVnYWwgYXR0cmlidXRlIGJpdHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWV9XUklURV9DT01CSU5FIGFuZCBNRU1PUllfQ0FDSEVELgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgbWVtb3J5IHBhZ2VzIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9BTExPQ0FURV9CVUZGRVIpKAorICBJTiBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MICAgICAgICAgICAgICAqVGhpcywKKyAgSU4gICAgIEVGSV9BTExPQ0FURV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSwKKyAgSU4gICAgIEVGSV9NRU1PUllfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5VHlwZSwKKyAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZXMsCisgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqSG9zdEFkZHJlc3MsCisgIElOICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMKKyAgKTsKKworLyoqCisgIEZyZWVzIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgd2l0aCBBbGxvY2F0ZUJ1ZmZlcigpLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTC4KKyAgQHBhcmFtICBQYWdlcyAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBwYWdlcyB0byBmcmVlLgorICBAcGFyYW0gIEhvc3RBZGRyZXNzICAgICAgICAgICBUaGUgYmFzZSBzeXN0ZW0gbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCByYW5nZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgcmVxdWVzdGVkIG1lbW9yeSBwYWdlcyB3ZXJlIGZyZWVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBUaGUgbWVtb3J5IHJhbmdlIHNwZWNpZmllZCBieSBIb3N0QWRkcmVzcyBhbmQgUGFnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIG5vdCBhbGxvY2F0ZWQgd2l0aCBBbGxvY2F0ZUJ1ZmZlcigpLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfRlJFRV9CVUZGRVIpKAorICBJTiBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MICAgICAgICAgICAqVGhpcywKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZXMsCisgIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpIb3N0QWRkcmVzcworICApOworCisvKioKKyAgRmx1c2hlcyBhbGwgUENJIHBvc3RlZCB3cml0ZSB0cmFuc2FjdGlvbnMgZnJvbSBhIFBDSSBob3N0IGJyaWRnZSB0byBzeXN0ZW0gbWVtb3J5LgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgUENJIHBvc3RlZCB3cml0ZSB0cmFuc2FjdGlvbnMgd2VyZSBmbHVzaGVkIGZyb20gdGhlIFBDSSBob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZSB0byBzeXN0ZW0gbWVtb3J5LgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgUENJIHBvc3RlZCB3cml0ZSB0cmFuc2FjdGlvbnMgd2VyZSBub3QgZmx1c2hlZCBmcm9tIHRoZSBQQ0kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCBicmlkZ2UgZHVlIHRvIGEgaGFyZHdhcmUgZXJyb3IuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9GTFVTSCkoCisgIElOIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0wgICpUaGlzCisgICk7CisKKy8qKgorICBHZXRzIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYSBQQ0kgcm9vdCBicmlkZ2Ugc3VwcG9ydHMgc2V0dGluZyB3aXRoIFNldEF0dHJpYnV0ZXMoKSwgYW5kIHRoZQorICBhdHRyaWJ1dGVzIHRoYXQgYSBQQ0kgcm9vdCBicmlkZ2UgaXMgY3VycmVudGx5IHVzaW5nLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTC4KKyAgQHBhcmFtICBTdXBwb3J0cyAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBtYXNrIG9mIGF0dHJpYnV0ZXMgdGhhdCB0aGlzIFBDSSByb290IGJyaWRnZSBzdXBwb3J0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIHdpdGggU2V0QXR0cmlidXRlcygpLgorICBAcGFyYW0gIEF0dHJpYnV0ZXMgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIG1hc2sgb2YgYXR0cmlidXRlcyB0aGF0IHRoaXMgUENJIHJvb3QgYnJpZGdlIGlzIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZy4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBJZiBTdXBwb3J0cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgYXR0cmlidXRlcyB0aGF0IHRoZSBQQ0kgcm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlkZ2Ugc3VwcG9ydHMgaXMgcmV0dXJuZWQgaW4gU3VwcG9ydHMuIElmIEF0dHJpYnV0ZXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IE5VTEwsIHRoZW4gdGhlIGF0dHJpYnV0ZXMgdGhhdCB0aGUgUENJIHJvb3QgYnJpZGdlIGlzIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBpcyByZXR1cm5lZCBpbiBBdHRyaWJ1dGVzLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBCb3RoIFN1cHBvcnRzIGFuZCBBdHRyaWJ1dGVzIGFyZSBOVUxMLgorCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9HRVRfQVRUUklCVVRFUykoCisgIElOIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0wgICAgICAgICAgICpUaGlzLAorICBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3VwcG9ydHMsCisgIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpBdHRyaWJ1dGVzCisgICk7CisKKy8qKgorICBTZXRzIGF0dHJpYnV0ZXMgZm9yIGEgcmVzb3VyY2UgcmFuZ2Ugb24gYSBQQ0kgcm9vdCBicmlkZ2UuCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MLgorICBAcGFyYW0gIEF0dHJpYnV0ZXMgICAgICAgICAgICBUaGUgbWFzayBvZiBhdHRyaWJ1dGVzIHRvIHNldC4KKyAgQHBhcmFtICBSZXNvdXJjZUJhc2UgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlIHJhbmdlIHRvIGJlIG1vZGlmaWVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIHNwZWNpZmllZCBieSBBdHRyaWJ1dGVzLgorICBAcGFyYW0gIFJlc291cmNlTGVuZ3RoICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcmFuZ2UgdG8gYmUgbW9kaWZpZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGJ5IEF0dHJpYnV0ZXMuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHNldCBvZiBhdHRyaWJ1dGVzIHNwZWNpZmllZCBieSBBdHRyaWJ1dGVzIGZvciB0aGUgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Ugc3BlY2lmaWVkIGJ5IFJlc291cmNlQmFzZSBhbmQgUmVzb3VyY2VMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VyZSBzZXQgb24gdGhlIFBDSSByb290IGJyaWRnZSwgYW5kIHRoZSBhY3R1YWwgcmVzb3VyY2UgcmFuZ2UgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgaW4gUmVzdW91cmNlQmFzZSBhbmQgUmVzb3VyY2VMZW5ndGguCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIEEgYml0IGlzIHNldCBpbiBBdHRyaWJ1dGVzIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgUENJIFJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJpZGdlLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGVyZSBhcmUgbm90IGVub3VnaCByZXNvdXJjZXMgdG8gc2V0IHRoZSBhdHRyaWJ1dGVzIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSByYW5nZSBzcGVjaWZpZWQgYnkgQmFzZUFkZHJlc3MgYW5kIExlbmd0aC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MX1NFVF9BVFRSSUJVVEVTKSgKKyAgSU4gRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsCisgIElOICAgICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMsCisgIElOIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSZXNvdXJjZUJhc2UsCisgIElOIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSZXNvdXJjZUxlbmd0aAorICApOworCisvKioKKyAgUmV0cmlldmVzIHRoZSBjdXJyZW50IHJlc291cmNlIHNldHRpbmdzIG9mIHRoaXMgUENJIHJvb3QgYnJpZGdlIGluIHRoZSBmb3JtIG9mIGEgc2V0IG9mIEFDUEkgMi4wCisgIHJlc291cmNlIGRlc2NyaXB0b3JzLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTC4KKyAgQHBhcmFtICBSZXNvdXJjZXMgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBBQ1BJIDIuMCByZXNvdXJjZSBkZXNjcmlwdG9ycyB0aGF0IGRlc2NyaWJlIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBQQ0kgcm9vdCBicmlkZ2UuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGlzIFBDSSByb290IGJyaWRnZSB3YXMgcmV0dXJuZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoaXMgUENJIHJvb3QgYnJpZGdlIGNvdWxkIG5vdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWV2ZWQuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9DT05GSUdVUkFUSU9OKSgKKyAgSU4gIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0wgICAgICAgICAgKlRoaXMsCisgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqUmVzb3VyY2VzCisgICk7CisKKy8vLworLy8vIFByb3ZpZGVzIHRoZSBiYXNpYyBNZW1vcnksIEkvTywgUENJIGNvbmZpZ3VyYXRpb24sIGFuZCBETUEgaW50ZXJmYWNlcyB0aGF0IGFyZQorLy8vIHVzZWQgdG8gYWJzdHJhY3QgYWNjZXNzZXMgdG8gUENJIGNvbnRyb2xsZXJzIGJlaGluZCBhIFBDSSBSb290IEJyaWRnZSBDb250cm9sbGVyLgorLy8vCitzdHJ1Y3QgX0VGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0wgeworICAvLy8KKyAgLy8vIFRoZSBFRklfSEFORExFIG9mIHRoZSBQQ0kgSG9zdCBCcmlkZ2Ugb2Ygd2hpY2ggdGhpcyBQQ0kgUm9vdCBCcmlkZ2UgaXMgYSBtZW1iZXIuCisgIC8vLworICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJlbnRIYW5kbGU7CisgIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfUE9MTF9JT19NRU0gICAgIFBvbGxNZW07CisgIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfUE9MTF9JT19NRU0gICAgIFBvbGxJbzsKKyAgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9BQ0NFU1MgICAgICAgICAgTWVtOworICBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MX0FDQ0VTUyAgICAgICAgICBJbzsKKyAgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9BQ0NFU1MgICAgICAgICAgUGNpOworICBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MX0NPUFlfTUVNICAgICAgICBDb3B5TWVtOworICBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MX01BUCAgICAgICAgICAgICBNYXA7CisgIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfVU5NQVAgICAgICAgICAgIFVubWFwOworICBFRklfUENJX1JPT1RfQlJJREdFX0lPX1BST1RPQ09MX0FMTE9DQVRFX0JVRkZFUiBBbGxvY2F0ZUJ1ZmZlcjsKKyAgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9GUkVFX0JVRkZFUiAgICAgRnJlZUJ1ZmZlcjsKKyAgRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTF9GTFVTSCAgICAgICAgICAgRmx1c2g7CisgIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfR0VUX0FUVFJJQlVURVMgIEdldEF0dHJpYnV0ZXM7CisgIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfU0VUX0FUVFJJQlVURVMgIFNldEF0dHJpYnV0ZXM7CisgIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0xfQ09ORklHVVJBVElPTiAgIENvbmZpZ3VyYXRpb247CisKKyAgLy8vCisgIC8vLyBUaGUgc2VnbWVudCBudW1iZXIgdGhhdCB0aGlzIFBDSSByb290IGJyaWRnZSByZXNpZGVzLgorICAvLy8KKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudE51bWJlcjsKK307CisKK2V4dGVybiBFRklfR1VJRCBnRWZpUGNpUm9vdEJyaWRnZUlvUHJvdG9jb2xHdWlkOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvU2ltcGxlTmV0d29yay5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9TaW1wbGVOZXR3b3JrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkMmFmYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvU2ltcGxlTmV0d29yay5oCkBAIC0wLDAgKzEsNTkzIEBACisvKiogQGZpbGUKKyAgU2ltcGxlIE5ldHdvcmsgcHJvdG9jb2wgYXMgZGVmaW5lZCBpbiB0aGUgVUVGSSAyLjAgc3BlY2lmaWNhdGlvbi4KKworICBCYXNpYyBuZXR3b3JrIGRldmljZSBhYnN0cmFjdGlvbi4KKworICBSeCAgICAtIFJlY2VpdmVkCisgIFR4ICAgIC0gVHJhbnNtaXQKKyAgTUNhc3QgLSBNdWx0aUNhc3QKKyAgLi4uCisKKyAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyoqLworCisjaWZuZGVmIF9fU0lNUExFX05FVFdPUktfSF9fCisjZGVmaW5lIF9fU0lNUExFX05FVFdPUktfSF9fCisKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MX0dVSUQgXAorICB7IFwKKyAgICAweEExOTgzMkI5LCAweEFDMjUsIDB4MTFEMywgezB4OUEsIDB4MkQsIDB4MDAsIDB4OTAsIDB4MjcsIDB4M0YsIDB4QzEsIDB4NEQgfSBcCisgIH0KKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAgRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MOworCisKKy8vLworLy8vIFByb3RvY29sIGRlZmluZWQgaW4gRUZJMS4xLgorLy8vCit0eXBlZGVmIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAgIEVGSV9TSU1QTEVfTkVUV09SSzsKKworLy8vCisvLy8gU2ltcGxlIE5ldHdvcmsgUHJvdG9jb2wgZGF0YSBzdHJ1Y3R1cmVzCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8vCisgIC8vLyBUb3RhbCBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkLiAgSW5jbHVkZXMgZnJhbWVzIHdpdGggZXJyb3JzIGFuZAorICAvLy8gZHJvcHBlZCBmcmFtZXMuCisgIC8vLworICBVSU5UNjQgIFJ4VG90YWxGcmFtZXM7CisKKyAgLy8vCisgIC8vLyBOdW1iZXIgb2YgdmFsaWQgZnJhbWVzIHJlY2VpdmVkIGFuZCBjb3BpZWQgaW50byByZWNlaXZlIGJ1ZmZlcnMuCisgIC8vLworICBVSU5UNjQgIFJ4R29vZEZyYW1lczsKKworICAvLy8KKyAgLy8vIE51bWJlciBvZiBmcmFtZXMgYmVsb3cgdGhlIG1pbmltdW0gbGVuZ3RoIGZvciB0aGUgbWVkaWEuCisgIC8vLyBUaGlzIHdvdWxkIGJlIDw2NCBmb3IgZXRoZXJuZXQuCisgIC8vLworICBVSU5UNjQgIFJ4VW5kZXJzaXplRnJhbWVzOworCisgIC8vLworICAvLy8gTnVtYmVyIG9mIGZyYW1lcyBsb25nZXIgdGhhbiB0aGUgbWF4bWludW0gbGVuZ3RoIGZvciB0aGUKKyAgLy8vIG1lZGlhLiAgVGhpcyB3b3VsZCBiZSA+MTUwMCBmb3IgZXRoZXJuZXQuCisgIC8vLworICBVSU5UNjQgIFJ4T3ZlcnNpemVGcmFtZXM7CisKKyAgLy8vCisgIC8vLyBWYWxpZCBmcmFtZXMgdGhhdCB3ZXJlIGRyb3BwZWQgYmVjYXVzZSByZWNlaXZlIGJ1ZmZlcnMgd2VyZSBmdWxsLgorICAvLy8KKyAgVUlOVDY0ICBSeERyb3BwZWRGcmFtZXM7CisKKyAgLy8vCisgIC8vLyBOdW1iZXIgb2YgdmFsaWQgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgYW5kIG5vdCBkcm9wcGVkLgorICAvLy8KKyAgVUlOVDY0ICBSeFVuaWNhc3RGcmFtZXM7CisKKyAgLy8vCisgIC8vLyBOdW1iZXIgb2YgdmFsaWQgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBhbmQgbm90IGRyb3BwZWQuCisgIC8vLworICBVSU5UNjQgIFJ4QnJvYWRjYXN0RnJhbWVzOworCisgIC8vLworICAvLy8gTnVtYmVyIG9mIHZhbGlkIG11dGxpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgYW5kIG5vdCBkcm9wcGVkLgorICAvLy8KKyAgVUlOVDY0ICBSeE11bHRpY2FzdEZyYW1lczsKKworICAvLy8KKyAgLy8vIE51bWJlciBvZiBmcmFtZXMgdy8gQ1JDIG9yIGFsaWdubWVudCBlcnJvcnMuCisgIC8vLworICBVSU5UNjQgIFJ4Q3JjRXJyb3JGcmFtZXM7CisKKyAgLy8vCisgIC8vLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuICBJbmNsdWRlcyBmcmFtZXMgd2l0aCBlcnJvcnMKKyAgLy8vIGFuZCBkcm9wcGVkIGZyYW1lcy4KKyAgLy8KKyAgVUlOVDY0ICBSeFRvdGFsQnl0ZXM7CisKKyAgLy8vCisgIC8vLyBUcmFuc21pdCBzdGF0aXN0aWNzLgorICAvLy8KKyAgVUlOVDY0ICBUeFRvdGFsRnJhbWVzOworICBVSU5UNjQgIFR4R29vZEZyYW1lczsKKyAgVUlOVDY0ICBUeFVuZGVyc2l6ZUZyYW1lczsKKyAgVUlOVDY0ICBUeE92ZXJzaXplRnJhbWVzOworICBVSU5UNjQgIFR4RHJvcHBlZEZyYW1lczsKKyAgVUlOVDY0ICBUeFVuaWNhc3RGcmFtZXM7CisgIFVJTlQ2NCAgVHhCcm9hZGNhc3RGcmFtZXM7CisgIFVJTlQ2NCAgVHhNdWx0aWNhc3RGcmFtZXM7CisgIFVJTlQ2NCAgVHhDcmNFcnJvckZyYW1lczsKKyAgVUlOVDY0ICBUeFRvdGFsQnl0ZXM7CisKKyAgLy8vCisgIC8vLyBOdW1iZXIgb2YgY29sbGlzaW9ucyBkZXRlY3Rpb24gb24gdGhpcyBzdWJuZXQuCisgIC8vLworICBVSU5UNjQgIENvbGxpc2lvbnM7CisKKyAgLy8vCisgIC8vLyBOdW1iZXIgb2YgZnJhbWVzIGRlc3RpbmVkIGZvciB1bnN1cHBvcnRlZCBwcm90b2NvbC4KKyAgLy8vCisgIFVJTlQ2NCAgVW5zdXBwb3J0ZWRQcm90b2NvbDsKKworfSBFRklfTkVUV09SS19TVEFUSVNUSUNTOworCit0eXBlZGVmIGVudW0geworICBFZmlTaW1wbGVOZXR3b3JrU3RvcHBlZCwKKyAgRWZpU2ltcGxlTmV0d29ya1N0YXJ0ZWQsCisgIEVmaVNpbXBsZU5ldHdvcmtJbml0aWFsaXplZCwKKyAgRWZpU2ltcGxlTmV0d29ya01heFN0YXRlCit9IEVGSV9TSU1QTEVfTkVUV09SS19TVEFURTsKKworI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9VTklDQVNUICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfTVVMVElDQVNUICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFX0JST0FEQ0FTVCAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9QUk9NSVNDVU9VUyAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfUFJPTUlTQ1VPVVNfTVVMVElDQVNUICAweDEwCisKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfSU5URVJSVVBUICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVGSV9TSU1QTEVfTkVUV09SS19UUkFOU01JVF9JTlRFUlJVUFQgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfQ09NTUFORF9JTlRFUlJVUFQgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUZJX1NJTVBMRV9ORVRXT1JLX1NPRlRXQVJFX0lOVEVSUlVQVCAgICAgICAgICAgICAweDA4CisKKyNkZWZpbmUgTUFYX01DQVNUX0ZJTFRFUl9DTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgICAgICAgICAgU3RhdGU7CisgIFVJTlQzMiAgICAgICAgICBId0FkZHJlc3NTaXplOworICBVSU5UMzIgICAgICAgICAgTWVkaWFIZWFkZXJTaXplOworICBVSU5UMzIgICAgICAgICAgTWF4UGFja2V0U2l6ZTsKKyAgVUlOVDMyICAgICAgICAgIE52UmFtU2l6ZTsKKyAgVUlOVDMyICAgICAgICAgIE52UmFtQWNjZXNzU2l6ZTsKKyAgVUlOVDMyICAgICAgICAgIFJlY2VpdmVGaWx0ZXJNYXNrOworICBVSU5UMzIgICAgICAgICAgUmVjZWl2ZUZpbHRlclNldHRpbmc7CisgIFVJTlQzMiAgICAgICAgICBNYXhNQ2FzdEZpbHRlckNvdW50OworICBVSU5UMzIgICAgICAgICAgTUNhc3RGaWx0ZXJDb3VudDsKKyAgRUZJX01BQ19BRERSRVNTIE1DYXN0RmlsdGVyW01BWF9NQ0FTVF9GSUxURVJfQ05UXTsKKyAgRUZJX01BQ19BRERSRVNTIEN1cnJlbnRBZGRyZXNzOworICBFRklfTUFDX0FERFJFU1MgQnJvYWRjYXN0QWRkcmVzczsKKyAgRUZJX01BQ19BRERSRVNTIFBlcm1hbmVudEFkZHJlc3M7CisgIFVJTlQ4ICAgICAgICAgICBJZlR5cGU7CisgIEJPT0xFQU4gICAgICAgICBNYWNBZGRyZXNzQ2hhbmdlYWJsZTsKKyAgQk9PTEVBTiAgICAgICAgIE11bHRpcGxlVHhTdXBwb3J0ZWQ7CisgIEJPT0xFQU4gICAgICAgICBNZWRpYVByZXNlbnRTdXBwb3J0ZWQ7CisgIEJPT0xFQU4gICAgICAgICBNZWRpYVByZXNlbnQ7Cit9IEVGSV9TSU1QTEVfTkVUV09SS19NT0RFOworCisvLworLy8gUHJvdG9jb2wgTWVtYmVyIEZ1bmN0aW9ucworLy8KKy8qKgorICBDaGFuZ2VzIHRoZSBzdGF0ZSBvZiBhIG5ldHdvcmsgaW50ZXJmYWNlIGZyb20gInN0b3BwZWQiIHRvICJzdGFydGVkIi4KKworICBAcGFyYW0gIFRoaXMgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2Ugd2FzIHN0YXJ0ZWQuCisgIEByZXR2YWwgRUZJX0FMUkVBRFlfU1RBUlRFRCAgIFRoZSBuZXR3b3JrIGludGVyZmFjZSBpcyBhbHJlYWR5IGluIHRoZSBzdGFydGVkIHN0YXRlLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBjb21tYW5kIGNvdWxkIG5vdCBiZSBzZW50IHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfU1RBUlQpKAorICBJTiBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgICpUaGlzCisgICk7CisKKy8qKgorICBDaGFuZ2VzIHRoZSBzdGF0ZSBvZiBhIG5ldHdvcmsgaW50ZXJmYWNlIGZyb20gInN0YXJ0ZWQiIHRvICJzdG9wcGVkIi4KKworICBAcGFyYW0gIFRoaXMgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2Ugd2FzIHN0b3BwZWQuCisgIEByZXR2YWwgRUZJX0FMUkVBRFlfU1RBUlRFRCAgIFRoZSBuZXR3b3JrIGludGVyZmFjZSBpcyBhbHJlYWR5IGluIHRoZSBzdG9wcGVkIHN0YXRlLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBjb21tYW5kIGNvdWxkIG5vdCBiZSBzZW50IHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfU1RPUCkoCisgIElOIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAgKlRoaXMKKyAgKTsKKworLyoqCisgIFJlc2V0cyBhIG5ldHdvcmsgYWRhcHRlciBhbmQgYWxsb2NhdGVzIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXJzCisgIHJlcXVpcmVkIGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZTsgb3B0aW9uYWxseSwgYWxzbyByZXF1ZXN0cyBhbGxvY2F0aW9uCisgIG9mIGFkZGl0aW9uYWwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycy4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgRXh0cmFSeEJ1ZmZlclNpemUgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgZXh0cmEgcmVjZWl2ZSBidWZmZXIgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBkcml2ZXIgc2hvdWxkIGFsbG9jYXRlIGZvciB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZSBuZXR3b3JrIGludGVyZmFjZXMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UgdGhlIGV4dHJhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBhbmQgdGhlIGNhbGxlciB3aWxsIG5vdCBrbm93IGlmIGl0IGlzIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgdXNlZC4KKyAgQHBhcmFtICBFeHRyYVR4QnVmZmVyU2l6ZSBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBleHRyYSB0cmFuc21pdCBidWZmZXIgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBkcml2ZXIgc2hvdWxkIGFsbG9jYXRlIGZvciB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZSBuZXR3b3JrIGludGVyZmFjZXMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UgdGhlIGV4dHJhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBhbmQgdGhlIGNhbGxlciB3aWxsIG5vdCBrbm93IGlmIGl0IGlzIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgdXNlZC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2Ugd2FzIGluaXRpYWxpemVkLgorICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgdHJhbnNtaXQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgYnVmZmVycy4gICAuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIG9mIHRoZSBwYXJhbWV0ZXJzIGhhcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZS4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGNvbW1hbmQgY291bGQgbm90IGJlIHNlbnQgdG8gdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19JTklUSUFMSVpFKSgKKyAgSU4gRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICAgICAgICAgICAgICAgICAgICAqVGhpcywKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYVJ4QnVmZmVyU2l6ZSAgT1BUSU9OQUwsCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFUeEJ1ZmZlclNpemUgIE9QVElPTkFMCisgICk7CisKKy8qKgorICBSZXNldHMgYSBuZXR3b3JrIGFkYXB0ZXIgYW5kIHJlLWluaXRpYWxpemVzIGl0IHdpdGggdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZXJlCisgIHByb3ZpZGVkIGluIHRoZSBwcmV2aW91cyBjYWxsIHRvIEluaXRpYWxpemUoKS4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgRXh0ZW5kZWRWZXJpZmljYXRpb24gSW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBtYXkgcGVyZm9ybSBhIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGhhdXN0aXZlIHZlcmlmaWNhdGlvbiBvcGVyYXRpb24gb2YgdGhlIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyByZXNldC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2Ugd2FzIHJlc2V0LgorICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGFuIHVuc3VwcG9ydGVkIHZhbHVlLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgY29tbWFuZCBjb3VsZCBub3QgYmUgc2VudCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1JFU0VUKSgKKyAgSU4gRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICAgKlRoaXMsCisgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVmVyaWZpY2F0aW9uCisgICk7CisKKy8qKgorICBSZXNldHMgYSBuZXR3b3JrIGFkYXB0ZXIgYW5kIGxlYXZlcyBpdCBpbiBhIHN0YXRlIHRoYXQgaXMgc2FmZSBmb3IKKyAgYW5vdGhlciBkcml2ZXIgdG8gaW5pdGlhbGl6ZS4KKworICBAcGFyYW0gIFRoaXMgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2Ugd2FzIHNodXRkb3duLgorICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGFuIHVuc3VwcG9ydGVkIHZhbHVlLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgY29tbWFuZCBjb3VsZCBub3QgYmUgc2VudCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1NIVVRET1dOKSgKKyAgSU4gRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICAqVGhpcworICApOworCisvKioKKyAgTWFuYWdlcyB0aGUgbXVsdGljYXN0IHJlY2VpdmUgZmlsdGVycyBvZiBhIG5ldHdvcmsgaW50ZXJmYWNlLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIEVuYWJsZSAgICAgICAgICAgQSBiaXQgbWFzayBvZiByZWNlaXZlIGZpbHRlcnMgdG8gZW5hYmxlIG9uIHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKyAgQHBhcmFtICBEaXNhYmxlICAgICAgICAgIEEgYml0IG1hc2sgb2YgcmVjZWl2ZSBmaWx0ZXJzIHRvIGRpc2FibGUgb24gdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorICBAcGFyYW0gIFJlc2V0TUNhc3RGaWx0ZXIgU2V0IHRvIFRSVUUgdG8gcmVzZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtdWx0aWNhc3QgcmVjZWl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVycyBvbiB0aGUgbmV0d29yayBpbnRlcmZhY2UgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgIEBwYXJhbSAgTWNhc3RGaWx0ZXJDbnQgICBOdW1iZXIgb2YgbXVsdGljYXN0IEhXIE1BQyBhZGRyZXNzZXMgaW4gdGhlIG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNhc3RGaWx0ZXIgbGlzdC4gVGhpcyB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1DYXN0RmlsdGVyQ250IGZpZWxkIG9mIEVGSV9TSU1QTEVfTkVUV09SS19NT0RFLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpcyBvcHRpb25hbCBpZiBSZXNldE1DYXN0RmlsdGVyIGlzIFRSVUUuCisgIEBwYXJhbSAgTUNhc3RGaWx0ZXIgICAgICBBIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG5ldyBtdWx0aWNhc3QgcmVjZWl2ZSBmaWx0ZXIgSFcgTUFDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZXMuIFRoaXMgbGlzdCB3aWxsIHJlcGxhY2UgYW55IGV4aXN0aW5nIG11bHRpY2FzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSFcgTUFDIGFkZHJlc3MgbGlzdC4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXRNQ2FzdEZpbHRlciBpcyBUUlVFLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBtdWx0aWNhc3QgcmVjZWl2ZSBmaWx0ZXIgbGlzdCB3YXMgdXBkYXRlZC4KKyAgQHJldHZhbCBFRklfTk9UX1NUQVJURUQgICAgICAgVGhlIG5ldHdvcmsgaW50ZXJmYWNlIGhhcyBub3QgYmVlbiBzdGFydGVkCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIG9mIHRoZSBwYXJhbWV0ZXJzIGhhcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZS4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGNvbW1hbmQgY291bGQgbm90IGJlIHNlbnQgdG8gdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFX0ZJTFRFUlMpKAorICBJTiBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpUaGlzLAorICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSwKKyAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlLAorICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2V0TUNhc3RGaWx0ZXIsCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNhc3RGaWx0ZXJDbnQgICAgIE9QVElPTkFMLAorICBJTiBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpNQ2FzdEZpbHRlciBPUFRJT05BTAorICApOworCisvKioKKyAgTW9kaWZpZXMgb3IgcmVzZXRzIHRoZSBjdXJyZW50IHN0YXRpb24gYWRkcmVzcywgaWYgc3VwcG9ydGVkLgorCisgIEBwYXJhbSAgVGhpcyAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBSZXNldCBGbGFnIHVzZWQgdG8gcmVzZXQgdGhlIHN0YXRpb24gYWRkcmVzcyB0byB0aGUgbmV0d29yayBpbnRlcmZhY2VzCisgICAgICAgICAgICAgICAgcGVybWFuZW50IGFkZHJlc3MuCisgIEBwYXJhbSAgTmV3ICAgTmV3IHN0YXRpb24gYWRkcmVzcyB0byBiZSB1c2VkIGZvciB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG5ldHdvcmsgaW50ZXJmYWNlcyBzdGF0aW9uIGFkZHJlc3Mgd2FzIHVwZGF0ZWQuCisgIEByZXR2YWwgRUZJX05PVF9TVEFSVEVEICAgICAgIFRoZSBuZXR3b3JrIGludGVyZmFjZSBoYXMgbm90IGJlZW4gc3RhcnRlZAorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBjb21tYW5kIGNvdWxkIG5vdCBiZSBzZW50IHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfU1RBVElPTl9BRERSRVNTKSgKKyAgSU4gRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICAgICAgICAgICAgKlRoaXMsCisgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2V0LAorICBJTiBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAqTmV3IE9QVElPTkFMCisgICk7CisKKy8qKgorICBSZXNldHMgb3IgY29sbGVjdHMgdGhlIHN0YXRpc3RpY3Mgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKworICBAcGFyYW0gIFRoaXMgICAgICAgICAgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIFJlc2V0ICAgICAgICAgICBTZXQgdG8gVFJVRSB0byByZXNldCB0aGUgc3RhdGlzdGljcyBmb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorICBAcGFyYW0gIFN0YXRpc3RpY3NTaXplICBPbiBpbnB1dCB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIFN0YXRpc3RpY3NUYWJsZS4gT24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHJlc3VsdGluZyB0YWJsZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNzLgorICBAcGFyYW0gIFN0YXRpc3RpY3NUYWJsZSBBIHBvaW50ZXIgdG8gdGhlIEVGSV9ORVRXT1JLX1NUQVRJU1RJQ1Mgc3RydWN0dXJlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIHN0YXRpc3RpY3MuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHN0YXRpc3RpY3Mgd2VyZSBjb2xsZWN0ZWQgZnJvbSB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgIEByZXR2YWwgRUZJX05PVF9TVEFSVEVEICAgICAgIFRoZSBuZXR3b3JrIGludGVyZmFjZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4KKyAgQHJldHZhbCBFRklfQlVGRkVSX1RPT19TTUFMTCAgVGhlIFN0YXRpc3RpY3MgYnVmZmVyIHdhcyB0b28gc21hbGwuIFRoZSBjdXJyZW50IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIG5lZWRlZCB0byBob2xkIHRoZSBzdGF0aXN0aWNzIGlzIHJldHVybmVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpc3RpY3NTaXplLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBjb21tYW5kIGNvdWxkIG5vdCBiZSBzZW50IHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfU1RBVElTVElDUykoCisgIElOIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAgICAgICAgICAqVGhpcywKKyAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2V0LAorICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKlN0YXRpc3RpY3NTaXplICAgT1BUSU9OQUwsCisgIE9VVCBFRklfTkVUV09SS19TVEFUSVNUSUNTICAgICAgICAgICAgICAqU3RhdGlzdGljc1RhYmxlICBPUFRJT05BTAorICApOworCisvKioKKyAgQ29udmVydHMgYSBtdWx0aWNhc3QgSVAgYWRkcmVzcyB0byBhIG11bHRpY2FzdCBIVyBNQUMgYWRkcmVzcy4KKworICBAcGFyYW0gIFRoaXMgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBJUHY2IFNldCB0byBUUlVFIGlmIHRoZSBtdWx0aWNhc3QgSVAgYWRkcmVzcyBpcyBJUHY2IFtSRkMgMjQ2MF0uIFNldAorICAgICAgICAgICAgICAgdG8gRkFMU0UgaWYgdGhlIG11bHRpY2FzdCBJUCBhZGRyZXNzIGlzIElQdjQgW1JGQyA3OTFdLgorICBAcGFyYW0gIElQICAgVGhlIG11bHRpY2FzdCBJUCBhZGRyZXNzIHRoYXQgaXMgdG8gYmUgY29udmVydGVkIHRvIGEgbXVsdGljYXN0CisgICAgICAgICAgICAgICBIVyBNQUMgYWRkcmVzcy4KKyAgQHBhcmFtICBNQUMgIFRoZSBtdWx0aWNhc3QgSFcgTUFDIGFkZHJlc3MgdGhhdCBpcyB0byBiZSBnZW5lcmF0ZWQgZnJvbSBJUC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbXVsdGljYXN0IElQIGFkZHJlc3Mgd2FzIG1hcHBlZCB0byB0aGUgbXVsdGljYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXIE1BQyBhZGRyZXNzLgorICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuCisgIEByZXR2YWwgRUZJX0JVRkZFUl9UT09fU01BTEwgIFRoZSBTdGF0aXN0aWNzIGJ1ZmZlciB3YXMgdG9vIHNtYWxsLiBUaGUgY3VycmVudCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBuZWVkZWQgdG8gaG9sZCB0aGUgc3RhdGlzdGljcyBpcyByZXR1cm5lZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aXN0aWNzU2l6ZS4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGFuIHVuc3VwcG9ydGVkIHZhbHVlLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgY29tbWFuZCBjb3VsZCBub3QgYmUgc2VudCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX01DQVNUX0lQX1RPX01BQykoCisgIElOIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAgICAgICAgICAqVGhpcywKKyAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQdjYsCisgIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAqSVAsCisgIE9VVCBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAqTUFDCisgICk7CisKKy8qKgorICBQZXJmb3JtcyByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIG9uIHRoZSBOVlJBTSBkZXZpY2UgYXR0YWNoZWQgdG8gYQorICBuZXR3b3JrIGludGVyZmFjZS4KKworICBAcGFyYW0gIFRoaXMgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBSZWFkV3JpdGUgIFRSVUUgZm9yIHJlYWQgb3BlcmF0aW9ucywgRkFMU0UgZm9yIHdyaXRlIG9wZXJhdGlvbnMuCisgIEBwYXJhbSAgT2Zmc2V0ICAgICBCeXRlIG9mZnNldCBpbiB0aGUgTlZSQU0gZGV2aWNlIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSByZWFkIG9yCisgICAgICAgICAgICAgICAgICAgICB3cml0ZSBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIE52UmFtQWNjZXNzU2l6ZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiBOdlJhbVNpemUuCisgIEBwYXJhbSAgQnVmZmVyU2l6ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgb3Igd3JpdGUgZnJvbSB0aGUgTlZSQU0gZGV2aWNlLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IGFsc28gYmUgYSBtdWx0aXBsZSBvZiBOdnJhbUFjY2Vzc1NpemUuCisgIEBwYXJhbSAgQnVmZmVyICAgICBBIHBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBOVlJBTSBhY2Nlc3Mgd2FzIHBlcmZvcm1lZC4KKyAgQHJldHZhbCBFRklfTk9UX1NUQVJURUQgICAgICAgVGhlIG5ldHdvcmsgaW50ZXJmYWNlIGhhcyBub3QgYmVlbiBzdGFydGVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBjb21tYW5kIGNvdWxkIG5vdCBiZSBzZW50IHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0lNUExFX05FVFdPUktfTlZEQVRBKSgKKyAgSU4gRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICAgICAgICAgICpUaGlzLAorICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZFdyaXRlLAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZSwKKyAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIKKyAgKTsKKworLyoqCisgIFJlYWRzIHRoZSBjdXJyZW50IGludGVycnVwdCBzdGF0dXMgYW5kIHJlY3ljbGVkIHRyYW5zbWl0IGJ1ZmZlciBzdGF0dXMgZnJvbQorICBhIG5ldHdvcmsgaW50ZXJmYWNlLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgSW50ZXJydXB0U3RhdHVzIEEgcG9pbnRlciB0byB0aGUgYml0IG1hc2sgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW50ZXJydXB0cworICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHdpbGwgbm90IGJlIHJlYWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGV2aWNlLiBJZiB0aGlzIGlzIG5vdCBOVUxMLCB0aGUgaW50ZXJydXB0IHN0YXR1cyB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlYWQgZnJvbSB0aGUgZGV2aWNlLiBXaGVuIHRoZSAgaW50ZXJydXB0IHN0YXR1cyBpcyByZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIGFsc28gYmUgY2xlYXJlZC4gQ2xlYXJpbmcgdGhlIHRyYW5zbWl0ICBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgZW1wdHkgdGhlIHJlY3ljbGVkIHRyYW5zbWl0IGJ1ZmZlciBhcnJheS4KKyAgQHBhcmFtICBUeEJ1ZiAgICAgICAgICAgUmVjeWNsZWQgdHJhbnNtaXQgYnVmZmVyIGFkZHJlc3MuIFRoZSBuZXR3b3JrIGludGVyZmFjZSB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCB0cmFuc21pdCBpZiBpdHMgaW50ZXJuYWwgcmVjeWNsZWQgdHJhbnNtaXQgYnVmZmVyIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGZ1bGwuIFJlYWRpbmcgdGhlIHRyYW5zbWl0IGJ1ZmZlciBkb2VzIG5vdCBjbGVhciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXQgaW50ZXJydXB0LiBJZiB0aGlzIGlzIE5VTEwsIHRoZW4gdGhlIHRyYW5zbWl0IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgd2lsbCBub3QgYmUgcmVhZC4gSWYgdGhlcmUgYXJlIG5vIHRyYW5zbWl0IGJ1ZmZlcnMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjeWNsZSBhbmQgVHhCdWYgaXMgbm90IE5VTEwsICogVHhCdWYgd2lsbCBiZSBzZXQgdG8gTlVMTC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgc3RhdHVzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSB3YXMgcmV0cmlldmVkLgorICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIG9mIHRoZSBwYXJhbWV0ZXJzIGhhcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZS4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGNvbW1hbmQgY291bGQgbm90IGJlIHNlbnQgdG8gdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19HRVRfU1RBVFVTKSgKKyAgSU4gRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICAgICAgICAgICpUaGlzLAorICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkludGVycnVwdFN0YXR1cyBPUFRJT05BTCwKKyAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqVHhCdWYgT1BUSU9OQUwKKyAgKTsKKworLyoqCisgIFBsYWNlcyBhIHBhY2tldCBpbiB0aGUgdHJhbnNtaXQgcXVldWUgb2YgYSBuZXR3b3JrIGludGVyZmFjZS4KKworICBAcGFyYW0gIFRoaXMgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBIZWFkZXJTaXplIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIG1lZGlhIGhlYWRlciB0byBiZSBmaWxsZWQgaW4gYnkKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBUcmFuc21pdCgpIGZ1bmN0aW9uLiBJZiBIZWFkZXJTaXplIGlzIG5vbi16ZXJvLCB0aGVuIGl0CisgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGVxdWFsIHRvIFRoaXMtPk1vZGUtPk1lZGlhSGVhZGVyU2l6ZSBhbmQgdGhlIERlc3RBZGRyCisgICAgICAgICAgICAgICAgICAgICBhbmQgUHJvdG9jb2wgcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBOVUxMLgorICBAcGFyYW0gIEJ1ZmZlclNpemUgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgZW50aXJlIHBhY2tldCAobWVkaWEgaGVhZGVyIGFuZAorICAgICAgICAgICAgICAgICAgICAgZGF0YSkgdG8gYmUgdHJhbnNtaXR0ZWQgdGhyb3VnaCB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgIEBwYXJhbSAgQnVmZmVyICAgICBBIHBvaW50ZXIgdG8gdGhlIHBhY2tldCAobWVkaWEgaGVhZGVyIGZvbGxvd2VkIGJ5IGRhdGEpIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlZC4gVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIE5VTEwuIElmIEhlYWRlclNpemUgaXMgemVybywKKyAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIG1lZGlhIGhlYWRlciBpbiBCdWZmZXIgbXVzdCBhbHJlYWR5IGJlIGZpbGxlZCBpbiBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGNhbGxlci4gSWYgSGVhZGVyU2l6ZSBpcyBub24temVybywgdGhlbiB0aGUgbWVkaWEgaGVhZGVyIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCBpbiBieSB0aGUgVHJhbnNtaXQoKSBmdW5jdGlvbi4KKyAgQHBhcmFtICBTcmNBZGRyICAgIFRoZSBzb3VyY2UgSFcgTUFDIGFkZHJlc3MuIElmIEhlYWRlclNpemUgaXMgemVybywgdGhlbiB0aGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgaXMgaWdub3JlZC4gSWYgSGVhZGVyU2l6ZSBpcyBub24temVybyBhbmQgU3JjQWRkciBpcyBOVUxMLCB0aGVuCisgICAgICAgICAgICAgICAgICAgICBUaGlzLT5Nb2RlLT5DdXJyZW50QWRkcmVzcyBpcyB1c2VkIGZvciB0aGUgc291cmNlIEhXIE1BQyBhZGRyZXNzLgorICBAcGFyYW0gIERzZXRBZGRyICAgVGhlIGRlc3RpbmF0aW9uIEhXIE1BQyBhZGRyZXNzLiBJZiBIZWFkZXJTaXplIGlzIHplcm8sIHRoZW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgIEBwYXJhbSAgUHJvdG9jb2wgICBUaGUgdHlwZSBvZiBoZWFkZXIgdG8gYnVpbGQuIElmIEhlYWRlclNpemUgaXMgemVybywgdGhlbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gU2VlIFJGQyAxNzAwLCBzZWN0aW9uICJFdGhlciBUeXBlcyIsIGZvcgorICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZXMuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHBhY2tldCB3YXMgcGxhY2VkIG9uIHRoZSB0cmFuc21pdCBxdWV1ZS4KKyAgQHJldHZhbCBFRklfTk9UX1NUQVJURUQgICAgICAgVGhlIG5ldHdvcmsgaW50ZXJmYWNlIGhhcyBub3QgYmVlbiBzdGFydGVkLgorICBAcmV0dmFsIEVGSV9OT1RfUkVBRFkgICAgICAgICBUaGUgbmV0d29yayBpbnRlcmZhY2UgaXMgdG9vIGJ1c3kgdG8gYWNjZXB0IHRoaXMgdHJhbnNtaXQgcmVxdWVzdC4KKyAgQHJldHZhbCBFRklfQlVGRkVSX1RPT19TTUFMTCAgVGhlIEJ1ZmZlclNpemUgcGFyYW1ldGVyIGlzIHRvbyBzbWFsbC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGFuIHVuc3VwcG9ydGVkIHZhbHVlLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgY29tbWFuZCBjb3VsZCBub3QgYmUgc2VudCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NJTVBMRV9ORVRXT1JLX1RSQU5TTUlUKSgKKyAgSU4gRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICAgICAgICAgICpUaGlzLAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyU2l6ZSwKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemUsCisgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyLAorICBJTiBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgKlNyY0FkZHIgIE9QVElPTkFMLAorICBJTiBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgKkRlc3RBZGRyIE9QVElPTkFMLAorICBJTiBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlByb3RvY29sIE9QVElPTkFMCisgICk7CisKKy8qKgorICBSZWNlaXZlcyBhIHBhY2tldCBmcm9tIGEgbmV0d29yayBpbnRlcmZhY2UuCisKKyAgQHBhcmFtICBUaGlzICAgICAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgSGVhZGVyU2l6ZSBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBtZWRpYSBoZWFkZXIgcmVjZWl2ZWQgb24gdGhlIG5ldHdvcmsKKyAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZS4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgTlVMTCwgdGhlbiB0aGUgbWVkaWEgaGVhZGVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgIHdpbGwgbm90IGJlIHJldHVybmVkLgorICBAcGFyYW0gIEJ1ZmZlclNpemUgT24gZW50cnksIHRoZSBzaXplLCBpbiBieXRlcywgb2YgQnVmZmVyLiBPbiBleGl0LCB0aGUgc2l6ZSwgaW4KKyAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLCBvZiB0aGUgcGFja2V0IHRoYXQgd2FzIHJlY2VpdmVkIG9uIHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKyAgQHBhcmFtICBCdWZmZXIgICAgIEEgcG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSBib3RoIHRoZSBtZWRpYSBoZWFkZXIgYW5kCisgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YS4KKyAgQHBhcmFtICBTcmNBZGRyICAgIFRoZSBzb3VyY2UgSFcgTUFDIGFkZHJlc3MuIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZQorICAgICAgICAgICAgICAgICAgICAgSFcgTUFDIHNvdXJjZSBhZGRyZXNzIHdpbGwgbm90IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBtZWRpYQorICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLgorICBAcGFyYW0gIERzZXRBZGRyICAgVGhlIGRlc3RpbmF0aW9uIEhXIE1BQyBhZGRyZXNzLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgdGhlIEhXIE1BQyBkZXN0aW5hdGlvbiBhZGRyZXNzIHdpbGwgbm90IGJlIGV4dHJhY3RlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgbWVkaWEgaGVhZGVyLgorICBAcGFyYW0gIFByb3RvY29sICAgVGhlIG1lZGlhIGhlYWRlciB0eXBlLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgd2lsbCBub3QgYmUgZXh0cmFjdGVkIGZyb20gdGhlIG1lZGlhIGhlYWRlci4gU2VlCisgICAgICAgICAgICAgICAgICAgICBSRkMgMTcwMCBzZWN0aW9uICJFdGhlciBUeXBlcyIgZm9yIGV4YW1wbGVzLgorCisgIEByZXR2YWwgIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgcmVjZWl2ZWQgZGF0YSB3YXMgc3RvcmVkIGluIEJ1ZmZlciwgYW5kIEJ1ZmZlclNpemUgaGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIHVwZGF0ZWQgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KKyAgQHJldHZhbCAgRUZJX05PVF9TVEFSVEVEICAgICAgIFRoZSBuZXR3b3JrIGludGVyZmFjZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4KKyAgQHJldHZhbCAgRUZJX05PVF9SRUFEWSAgICAgICAgIFRoZSBuZXR3b3JrIGludGVyZmFjZSBpcyB0b28gYnVzeSB0byBhY2NlcHQgdGhpcyB0cmFuc21pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC4KKyAgQHJldHZhbCAgRUZJX0JVRkZFUl9UT09fU01BTEwgIFRoZSBCdWZmZXJTaXplIHBhcmFtZXRlciBpcyB0b28gc21hbGwuCisgIEByZXR2YWwgIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUuCisgIEByZXR2YWwgIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgY29tbWFuZCBjb3VsZCBub3QgYmUgc2VudCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgIEByZXR2YWwgIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFKSgKKyAgSU4gRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICAgICAgICAgICpUaGlzLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkhlYWRlclNpemUgT1BUSU9OQUwsCisgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwKKyAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXIsCisgIE9VVCBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAqU3JjQWRkciAgICBPUFRJT05BTCwKKyAgT1VUIEVGSV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICpEZXN0QWRkciAgIE9QVElPTkFMLAorICBPVVQgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlByb3RvY29sICAgT1BUSU9OQUwKKyAgKTsKKworI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0xfUkVWSVNJT04gIDB4MDAwMTAwMDAKKworLy8KKy8vIFJldmlzaW9uIGRlZmluZWQgaW4gRUZJMS4xCisvLworI2RlZmluZSBFRklfU0lNUExFX05FVFdPUktfSU5URVJGQUNFX1JFVklTSU9OICAgRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MX1JFVklTSU9OCisKKy8vLworLy8vIFRoZSBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgcHJvdG9jb2wgaXMgdXNlZCB0byBpbml0aWFsaXplIGFjY2VzcworLy8vIHRvIGEgbmV0d29yayBhZGFwdGVyLiBPbmNlIHRoZSBuZXR3b3JrIGFkYXB0ZXIgaW5pdGlhbGl6ZXMsCisvLy8gdGhlIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCBwcm90b2NvbCBwcm92aWRlcyBzZXJ2aWNlcyB0aGF0CisvLy8gYWxsb3cgcGFja2V0cyB0byBiZSB0cmFuc21pdHRlZCBhbmQgcmVjZWl2ZWQuCisvLy8KK3N0cnVjdCBfRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MIHsKKyAgLy8vCisgIC8vLyBSZXZpc2lvbiBvZiB0aGUgRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MLiBBbGwgZnV0dXJlIHJldmlzaW9ucyBtdXN0CisgIC8vLyBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZS4gSWYgYSBmdXR1cmUgdmVyc2lvbiBpcyBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUKKyAgLy8vIGl0IGlzIG5vdCB0aGUgc2FtZSBHVUlELgorICAvLy8KKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2aXNpb247CisgIEVGSV9TSU1QTEVfTkVUV09SS19TVEFSVCAgICAgICAgICAgIFN0YXJ0OworICBFRklfU0lNUExFX05FVFdPUktfU1RPUCAgICAgICAgICAgICBTdG9wOworICBFRklfU0lNUExFX05FVFdPUktfSU5JVElBTElaRSAgICAgICBJbml0aWFsaXplOworICBFRklfU0lNUExFX05FVFdPUktfUkVTRVQgICAgICAgICAgICBSZXNldDsKKyAgRUZJX1NJTVBMRV9ORVRXT1JLX1NIVVRET1dOICAgICAgICAgU2h1dGRvd247CisgIEVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFX0ZJTFRFUlMgIFJlY2VpdmVGaWx0ZXJzOworICBFRklfU0lNUExFX05FVFdPUktfU1RBVElPTl9BRERSRVNTICBTdGF0aW9uQWRkcmVzczsKKyAgRUZJX1NJTVBMRV9ORVRXT1JLX1NUQVRJU1RJQ1MgICAgICAgU3RhdGlzdGljczsKKyAgRUZJX1NJTVBMRV9ORVRXT1JLX01DQVNUX0lQX1RPX01BQyAgTUNhc3RJcFRvTWFjOworICBFRklfU0lNUExFX05FVFdPUktfTlZEQVRBICAgICAgICAgICBOdkRhdGE7CisgIEVGSV9TSU1QTEVfTkVUV09SS19HRVRfU1RBVFVTICAgICAgIEdldFN0YXR1czsKKyAgRUZJX1NJTVBMRV9ORVRXT1JLX1RSQU5TTUlUICAgICAgICAgVHJhbnNtaXQ7CisgIEVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFICAgICAgICAgIFJlY2VpdmU7CisgIC8vLworICAvLy8gRXZlbnQgdXNlZCB3aXRoIFdhaXRGb3JFdmVudCgpIHRvIHdhaXQgZm9yIGEgcGFja2V0IHRvIGJlIHJlY2VpdmVkLgorICAvLy8KKyAgRUZJX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FpdEZvclBhY2tldDsKKyAgLy8vCisgIC8vLyBQb2ludGVyIHRvIHRoZSBFRklfU0lNUExFX05FVFdPUktfTU9ERSBkYXRhIGZvciB0aGUgZGV2aWNlLgorICAvLy8KKyAgRUZJX1NJTVBMRV9ORVRXT1JLX01PREUgICAgICAgICAgICAgKk1vZGU7Cit9OworCitleHRlcm4gRUZJX0dVSUQgZ0VmaVNpbXBsZU5ldHdvcmtQcm90b2NvbEd1aWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9Qcm90b2NvbC9TaW1wbGVUZXh0SW4uaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvU2ltcGxlVGV4dEluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0ZjYyZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvU2ltcGxlVGV4dEluLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qKiBAZmlsZQorICBTaW1wbGUgVGV4dCBJbiBwcm90b2NvbCBmcm9tIHRoZSBVRUZJIDIuMCBzcGVjaWZpY2F0aW9uLgorCisgIEFic3RyYWN0aW9uIG9mIGEgdmVyeSBzaW1wbGUgaW5wdXQgZGV2aWNlIGxpa2UgYSBrZXlib2FyZCBvciBzZXJpYWwKKyAgdGVybWluYWwuCisKKyAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyoqLworCisjaWZuZGVmIF9fU0lNUExFX1RFWFRfSU5fUFJPVE9DT0xfSF9fCisjZGVmaW5lIF9fU0lNUExFX1RFWFRfSU5fUFJPVE9DT0xfSF9fCisKKyNpbmNsdWRlIDxncHhlL2VmaS9Qcm9jZXNzb3JCaW5kLmg+CisKKyNkZWZpbmUgRUZJX1NJTVBMRV9URVhUX0lOUFVUX1BST1RPQ09MX0dVSUQgXAorICB7IFwKKyAgICAweDM4NzQ3N2MxLCAweDY5YzcsIDB4MTFkMiwgezB4OGUsIDB4MzksIDB4MCwgMHhhMCwgMHhjOSwgMHg2OSwgMHg3MiwgMHgzYiB9IFwKKyAgfQorCisvLy8KKy8vLyBQcm90b2NvbCBHVUlEIGRlZmluZWQgaW4gRUZJMS4xLgorLy8vCisjZGVmaW5lIFNJTVBMRV9JTlBVVF9QUk9UT0NPTCAgIEVGSV9TSU1QTEVfVEVYVF9JTlBVVF9QUk9UT0NPTF9HVUlECisKK3R5cGVkZWYgc3RydWN0IF9FRklfU0lNUExFX1RFWFRfSU5QVVRfUFJPVE9DT0wgIEVGSV9TSU1QTEVfVEVYVF9JTlBVVF9QUk9UT0NPTDsKKworLy8vCisvLy8gQmFja3dhcmQtY29tcGF0aWJsZSB3aXRoIEVGSTEuMS4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9TSU1QTEVfVEVYVF9JTlBVVF9QUk9UT0NPTCAgU0lNUExFX0lOUFVUX0lOVEVSRkFDRTsKKy8vCisvLyBEYXRhIHN0cnVjdHVyZXMKKy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQxNiAgU2NhbkNvZGU7CisgIENIQVIxNiAgVW5pY29kZUNoYXI7Cit9IEVGSV9JTlBVVF9LRVk7CisKKy8vCisvLyBSZXF1aXJlZCB1bmljb2RlIGNvbnRyb2wgY2hhcnMKKy8vCisjZGVmaW5lIENIQVJfTlVMTCAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQ0hBUl9CQUNLU1BBQ0UgICAgICAgIDB4MDAwOAorI2RlZmluZSBDSEFSX1RBQiAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIENIQVJfTElORUZFRUQgICAgICAgICAweDAwMEEKKyNkZWZpbmUgQ0hBUl9DQVJSSUFHRV9SRVRVUk4gIDB4MDAwRAorCisvLworLy8gRUZJIFNjYW4gY29kZXMKKy8vCisjZGVmaW5lIFNDQU5fTlVMTCAgICAgICAweDAwMDAKKyNkZWZpbmUgU0NBTl9VUCAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTQ0FOX0RPV04gICAgICAgMHgwMDAyCisjZGVmaW5lIFNDQU5fUklHSFQgICAgICAweDAwMDMKKyNkZWZpbmUgU0NBTl9MRUZUICAgICAgIDB4MDAwNAorI2RlZmluZSBTQ0FOX0hPTUUgICAgICAgMHgwMDA1CisjZGVmaW5lIFNDQU5fRU5EICAgICAgICAweDAwMDYKKyNkZWZpbmUgU0NBTl9JTlNFUlQgICAgIDB4MDAwNworI2RlZmluZSBTQ0FOX0RFTEVURSAgICAgMHgwMDA4CisjZGVmaW5lIFNDQU5fUEFHRV9VUCAgICAweDAwMDkKKyNkZWZpbmUgU0NBTl9QQUdFX0RPV04gIDB4MDAwQQorI2RlZmluZSBTQ0FOX0YxICAgICAgICAgMHgwMDBCCisjZGVmaW5lIFNDQU5fRjIgICAgICAgICAweDAwMEMKKyNkZWZpbmUgU0NBTl9GMyAgICAgICAgIDB4MDAwRAorI2RlZmluZSBTQ0FOX0Y0ICAgICAgICAgMHgwMDBFCisjZGVmaW5lIFNDQU5fRjUgICAgICAgICAweDAwMEYKKyNkZWZpbmUgU0NBTl9GNiAgICAgICAgIDB4MDAxMAorI2RlZmluZSBTQ0FOX0Y3ICAgICAgICAgMHgwMDExCisjZGVmaW5lIFNDQU5fRjggICAgICAgICAweDAwMTIKKyNkZWZpbmUgU0NBTl9GOSAgICAgICAgIDB4MDAxMworI2RlZmluZSBTQ0FOX0YxMCAgICAgICAgMHgwMDE0CisjZGVmaW5lIFNDQU5fRjExICAgICAgICAweDAwMTUKKyNkZWZpbmUgU0NBTl9GMTIgICAgICAgIDB4MDAxNgorI2RlZmluZSBTQ0FOX0VTQyAgICAgICAgMHgwMDE3CisKKy8qKgorICBSZXNldCB0aGUgaW5wdXQgZGV2aWNlIGFuZCBvcHRpb25hbHkgcnVuIGRpYWdub3N0aWNzCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIEV4dGVuZGVkVmVyaWZpY2F0aW9uIERyaXZlciBtYXkgcGVyZm9ybSBkaWFnbm9zdGljcyBvbiByZXNldC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgIFRoZSBkZXZpY2Ugd2FzIHJlc2V0LgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgIFRoZSBkZXZpY2UgaXMgbm90IGZ1bmN0aW9uaW5nIHByb3Blcmx5IGFuZCBjb3VsZCBub3QgYmUgcmVzZXQuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lOUFVUX1JFU0VUKSgKKyAgSU4gRUZJX1NJTVBMRV9URVhUX0lOUFVUX1BST1RPQ09MICAgICAgICpUaGlzLAorICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRWZXJpZmljYXRpb24KKyAgKTsKKworLyoqCisgIFJlYWRzIHRoZSBuZXh0IGtleXN0cm9rZSBmcm9tIHRoZSBpbnB1dCBkZXZpY2UuIFRoZSBXYWl0Rm9yS2V5IEV2ZW50IGNhbgorICBiZSB1c2VkIHRvIHRlc3QgZm9yIGV4aXN0YW5jZSBvZiBhIGtleXN0cm9rZSB2aWEgV2FpdEZvckV2ZW50ICgpIGNhbGwuCisKKyAgQHBhcmFtICBUaGlzIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgS2V5ICBEcml2ZXIgbWF5IHBlcmZvcm0gZGlhZ25vc3RpY3Mgb24gcmVzZXQuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgIFRoZSBrZXlzdHJva2UgaW5mb3JtYXRpb24gd2FzIHJldHVybmVkLgorICBAcmV0dmFsIEVGSV9OT1RfUkVBRFkgICAgVGhlcmUgd2FzIG5vIGtleXN0cm9rZSBkYXRhIGF2YWlsaWFibGUuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiBUaGUga2V5ZHRyb2tlIGluZm9ybWF0aW9uIHdhcyBub3QgcmV0dXJuZWQgZHVlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBlcnJvcnMuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lOUFVUX1JFQURfS0VZKSgKKyAgSU4gRUZJX1NJTVBMRV9URVhUX0lOUFVUX1BST1RPQ09MICAgICAgICpUaGlzLAorICBPVVQgRUZJX0lOUFVUX0tFWSAgICAgICAgICAgICAgICAgICAgICAgKktleQorICApOworCisvLy8KKy8vLyBUaGUgRUZJX1NJTVBMRV9URVhUX0lOUFVUX1BST1RPQ09MIGlzIHVzZWQgb24gdGhlIENvbnNvbGVJbiBkZXZpY2UuCisvLy8gSXQgaXMgdGhlIG1pbmltdW0gcmVxdWlyZWQgcHJvdG9jb2wgZm9yIENvbnNvbGVJbi4KKy8vLworc3RydWN0IF9FRklfU0lNUExFX1RFWFRfSU5QVVRfUFJPVE9DT0wgeworICBFRklfSU5QVVRfUkVTRVQgICAgIFJlc2V0OworICBFRklfSU5QVVRfUkVBRF9LRVkgIFJlYWRLZXlTdHJva2U7CisgIC8vLworICAvLy8gRXZlbnQgdG8gdXNlIHdpdGggV2FpdEZvckV2ZW50KCkgdG8gd2FpdCBmb3IgYSBrZXkgdG8gYmUgYXZhaWxhYmxlCisgIC8vLworICBFRklfRVZFTlQgICAgICAgICAgIFdhaXRGb3JLZXk7Cit9OworCitleHRlcm4gRUZJX0dVSUQgZ0VmaVNpbXBsZVRleHRJblByb3RvY29sR3VpZDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL1NpbXBsZVRleHRPdXQuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvUHJvdG9jb2wvU2ltcGxlVGV4dE91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNmNlODEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1Byb3RvY29sL1NpbXBsZVRleHRPdXQuaApAQCAtMCwwICsxLDQwNCBAQAorLyoqIEBmaWxlCisgIFNpbXBsZSBUZXh0IE91dCBwcm90b2NvbCBmcm9tIHRoZSBVRUZJIDIuMCBzcGVjaWZpY2F0aW9uLgorCisgIEFic3RyYWN0aW9uIG9mIGEgdmVyeSBzaW1wbGUgdGV4dCBiYXNlZCBvdXRwdXQgZGV2aWNlIGxpa2UgVkdBIHRleHQgbW9kZSBvcgorICBhIHNlcmlhbCB0ZXJtaW5hbC4gVGhlIFNpbXBsZSBUZXh0IE91dCBwcm90b2NvbCBpbnN0YW5jZSBjYW4gcmVwcmVzZW50CisgIGEgc2luZ2xlIGhhcmR3YXJlIGRldmljZSBvciBhIHZpcnR1YWwgZGV2aWNlIHRoYXQgaXMgYW4gYWdyZWdhdGlvbgorICBvZiBtdWx0aXBsZSBwaHlzaWNhbCBkZXZpY2VzLgorCisgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisqKi8KKworI2lmbmRlZiBfX1NJTVBMRV9URVhUX09VVF9IX18KKyNkZWZpbmUgX19TSU1QTEVfVEVYVF9PVVRfSF9fCisKKyNkZWZpbmUgRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTF9HVUlEIFwKKyAgeyBcCisgICAgMHgzODc0NzdjMiwgMHg2OWM3LCAweDExZDIsIHsweDhlLCAweDM5LCAweDAsIDB4YTAsIDB4YzksIDB4NjksIDB4NzIsIDB4M2IgfSBcCisgIH0KKworLy8vCisvLy8gUHJvdG9jb2wgR1VJRCBkZWZpbmVkIGluIEVGSTEuMS4KKy8vLworI2RlZmluZSBTSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0wgICBFRklfU0lNUExFX1RFWFRfT1VUUFVUX1BST1RPQ09MX0dVSUQKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9TSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0wgRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTDsKKworLy8vCisvLy8gQmFja3dhcmQtY29tcGF0aWJsZSB3aXRoIEVGSTEuMS4KKy8vLwordHlwZWRlZiBFRklfU0lNUExFX1RFWFRfT1VUUFVUX1BST1RPQ09MICAgU0lNUExFX1RFWFRfT1VUUFVUX0lOVEVSRkFDRTsKKworLy8KKy8vIERlZmluZSdzIGZvciByZXF1aXJlZCBFRkkgVW5pY29kZSBCb3ggRHJhdyBjaGFyYWN0ZXJzCisvLworI2RlZmluZSBCT1hEUkFXX0hPUklaT05UQUwgICAgICAgICAgICAgICAgICAweDI1MDAKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTCAgICAgICAgICAgICAgICAgICAgMHgyNTAyCisjZGVmaW5lIEJPWERSQVdfRE9XTl9SSUdIVCAgICAgICAgICAgICAgICAgIDB4MjUwYworI2RlZmluZSBCT1hEUkFXX0RPV05fTEVGVCAgICAgICAgICAgICAgICAgICAweDI1MTAKKyNkZWZpbmUgQk9YRFJBV19VUF9SSUdIVCAgICAgICAgICAgICAgICAgICAgMHgyNTE0CisjZGVmaW5lIEJPWERSQVdfVVBfTEVGVCAgICAgICAgICAgICAgICAgICAgIDB4MjUxOAorI2RlZmluZSBCT1hEUkFXX1ZFUlRJQ0FMX1JJR0hUICAgICAgICAgICAgICAweDI1MWMKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9MRUZUICAgICAgICAgICAgICAgMHgyNTI0CisjZGVmaW5lIEJPWERSQVdfRE9XTl9IT1JJWk9OVEFMICAgICAgICAgICAgIDB4MjUyYworI2RlZmluZSBCT1hEUkFXX1VQX0hPUklaT05UQUwgICAgICAgICAgICAgICAweDI1MzQKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9IT1JJWk9OVEFMICAgICAgICAgMHgyNTNjCisjZGVmaW5lIEJPWERSQVdfRE9VQkxFX0hPUklaT05UQUwgICAgICAgICAgIDB4MjU1MAorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9WRVJUSUNBTCAgICAgICAgICAgICAweDI1NTEKKyNkZWZpbmUgQk9YRFJBV19ET1dOX1JJR0hUX0RPVUJMRSAgICAgICAgICAgMHgyNTUyCisjZGVmaW5lIEJPWERSQVdfRE9XTl9ET1VCTEVfUklHSFQgICAgICAgICAgIDB4MjU1MworI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9ET1dOX1JJR0hUICAgICAgICAgICAweDI1NTQKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0xFRlRfRE9VQkxFICAgICAgICAgICAgMHgyNTU1CisjZGVmaW5lIEJPWERSQVdfRE9XTl9ET1VCTEVfTEVGVCAgICAgICAgICAgIDB4MjU1NgorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9ET1dOX0xFRlQgICAgICAgICAgICAweDI1NTcKKyNkZWZpbmUgQk9YRFJBV19VUF9SSUdIVF9ET1VCTEUgICAgICAgICAgICAgMHgyNTU4CisjZGVmaW5lIEJPWERSQVdfVVBfRE9VQkxFX1JJR0hUICAgICAgICAgICAgIDB4MjU1OQorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9VUF9SSUdIVCAgICAgICAgICAgICAweDI1NWEKKyNkZWZpbmUgQk9YRFJBV19VUF9MRUZUX0RPVUJMRSAgICAgICAgICAgICAgMHgyNTViCisjZGVmaW5lIEJPWERSQVdfVVBfRE9VQkxFX0xFRlQgICAgICAgICAgICAgIDB4MjU1YworI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9VUF9MRUZUICAgICAgICAgICAgICAweDI1NWQKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9SSUdIVF9ET1VCTEUgICAgICAgMHgyNTVlCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfRE9VQkxFX1JJR0hUICAgICAgIDB4MjU1ZgorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9WRVJUSUNBTF9SSUdIVCAgICAgICAweDI1NjAKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9MRUZUX0RPVUJMRSAgICAgICAgMHgyNTYxCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfRE9VQkxFX0xFRlQgICAgICAgIDB4MjU2MgorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9WRVJUSUNBTF9MRUZUICAgICAgICAweDI1NjMKKyNkZWZpbmUgQk9YRFJBV19ET1dOX0hPUklaT05UQUxfRE9VQkxFICAgICAgMHgyNTY0CisjZGVmaW5lIEJPWERSQVdfRE9XTl9ET1VCTEVfSE9SSVpPTlRBTCAgICAgIDB4MjU2NQorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9ET1dOX0hPUklaT05UQUwgICAgICAweDI1NjYKKyNkZWZpbmUgQk9YRFJBV19VUF9IT1JJWk9OVEFMX0RPVUJMRSAgICAgICAgMHgyNTY3CisjZGVmaW5lIEJPWERSQVdfVVBfRE9VQkxFX0hPUklaT05UQUwgICAgICAgIDB4MjU2OAorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9VUF9IT1JJWk9OVEFMICAgICAgICAweDI1NjkKKyNkZWZpbmUgQk9YRFJBV19WRVJUSUNBTF9IT1JJWk9OVEFMX0RPVUJMRSAgMHgyNTZhCisjZGVmaW5lIEJPWERSQVdfVkVSVElDQUxfRE9VQkxFX0hPUklaT05UQUwgIDB4MjU2YgorI2RlZmluZSBCT1hEUkFXX0RPVUJMRV9WRVJUSUNBTF9IT1JJWk9OVEFMICAweDI1NmMKKworLy8KKy8vIEVGSSBSZXF1aXJlZCBCbG9jayBFbGVtZW50cyBDb2RlIENoYXJ0CisvLworI2RlZmluZSBCTE9DS0VMRU1FTlRfRlVMTF9CTE9DSyAgIDB4MjU4OAorI2RlZmluZSBCTE9DS0VMRU1FTlRfTElHSFRfU0hBREUgIDB4MjU5MQorCisvLworLy8gRUZJIFJlcXVpcmVkIEdlb21ldHJpYyBTaGFwZXMgQ29kZSBDaGFydAorLy8KKyNkZWZpbmUgR0VPTUVUUklDU0hBUEVfVVBfVFJJQU5HTEUgICAgMHgyNWIyCisjZGVmaW5lIEdFT01FVFJJQ1NIQVBFX1JJR0hUX1RSSUFOR0xFIDB4MjViYQorI2RlZmluZSBHRU9NRVRSSUNTSEFQRV9ET1dOX1RSSUFOR0xFICAweDI1YmMKKyNkZWZpbmUgR0VPTUVUUklDU0hBUEVfTEVGVF9UUklBTkdMRSAgMHgyNWM0CisKKy8vCisvLyBFRkkgUmVxdWlyZWQgQXJyb3cgc2hhcGVzCisvLworI2RlZmluZSBBUlJPV19MRUZUICAweDIxOTAKKyNkZWZpbmUgQVJST1dfVVAgICAgMHgyMTkxCisjZGVmaW5lIEFSUk9XX1JJR0hUIDB4MjE5MgorI2RlZmluZSBBUlJPV19ET1dOICAweDIxOTMKKworLy8KKy8vIEVGSSBDb25zb2xlIENvbG91cnMKKy8vCisjZGVmaW5lIEVGSV9CTEFDSyAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBFRklfQkxVRSAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUZJX0dSRUVOICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEVGSV9DWUFOICAgICAgICAgICAgICAgICAgKEVGSV9CTFVFIHwgRUZJX0dSRUVOKQorI2RlZmluZSBFRklfUkVEICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUZJX01BR0VOVEEgICAgICAgICAgICAgICAoRUZJX0JMVUUgfCBFRklfUkVEKQorI2RlZmluZSBFRklfQlJPV04gICAgICAgICAgICAgICAgIChFRklfR1JFRU4gfCBFRklfUkVEKQorI2RlZmluZSBFRklfTElHSFRHUkFZICAgICAgICAgICAgIChFRklfQkxVRSB8IEVGSV9HUkVFTiB8IEVGSV9SRUQpCisjZGVmaW5lIEVGSV9CUklHSFQgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBFRklfREFSS0dSQVkgICAgICAgICAgICAgIChFRklfQlJJR0hUKQorI2RlZmluZSBFRklfTElHSFRCTFVFICAgICAgICAgICAgIChFRklfQkxVRSB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVEdSRUVOICAgICAgICAgICAgKEVGSV9HUkVFTiB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVENZQU4gICAgICAgICAgICAgKEVGSV9DWUFOIHwgRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX0xJR0hUUkVEICAgICAgICAgICAgICAoRUZJX1JFRCB8IEVGSV9CUklHSFQpCisjZGVmaW5lIEVGSV9MSUdIVE1BR0VOVEEgICAgICAgICAgKEVGSV9NQUdFTlRBIHwgRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX1lFTExPVyAgICAgICAgICAgICAgICAoRUZJX0JST1dOIHwgRUZJX0JSSUdIVCkKKyNkZWZpbmUgRUZJX1dISVRFICAgICAgICAgICAgICAgICAoRUZJX0JMVUUgfCBFRklfR1JFRU4gfCBFRklfUkVEIHwgRUZJX0JSSUdIVCkKKworI2RlZmluZSBFRklfVEVYVF9BVFRSKGYsIGIpICAgICAgICgoZikgfCAoKGIpIDw8IDQpKQorCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0JMQUNLICAgICAgMHgwMAorI2RlZmluZSBFRklfQkFDS0dST1VORF9CTFVFICAgICAgIDB4MTAKKyNkZWZpbmUgRUZJX0JBQ0tHUk9VTkRfR1JFRU4gICAgICAweDIwCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0NZQU4gICAgICAgKEVGSV9CQUNLR1JPVU5EX0JMVUUgfCBFRklfQkFDS0dST1VORF9HUkVFTikKKyNkZWZpbmUgRUZJX0JBQ0tHUk9VTkRfUkVEICAgICAgICAweDQwCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX01BR0VOVEEgICAgKEVGSV9CQUNLR1JPVU5EX0JMVUUgfCBFRklfQkFDS0dST1VORF9SRUQpCisjZGVmaW5lIEVGSV9CQUNLR1JPVU5EX0JST1dOICAgICAgKEVGSV9CQUNLR1JPVU5EX0dSRUVOIHwgRUZJX0JBQ0tHUk9VTkRfUkVEKQorI2RlZmluZSBFRklfQkFDS0dST1VORF9MSUdIVEdSQVkgIChFRklfQkFDS0dST1VORF9CTFVFIHwgRUZJX0JBQ0tHUk9VTkRfR1JFRU4gfCBFRklfQkFDS0dST1VORF9SRUQpCisKKy8vCisvLyBXZSBjdXJyZW50bHkgZGVmaW5lIGF0dHJpYnV0ZXMgZnJvbSAwIC0gN0YgZm9yIGNvbG9yIG1hbmlwdWxhdGlvbnMKKy8vIFRvIGludGVybmFsbHkgaGFuZGxlIHRoZSBsb2NhbCBkaXNwbGF5IGNoYXJhY3RlcmlzdGljcyBmb3IgYSBwYXJ0aWN1bGFyIGNoYXJhY3Rlciwgd2UgYXJlIGRlZmluaW5nCisvLyBCaXQgNyB0byBzaWduaWZ5IHRoZSBsb2NhbCBnbHlwaCByZXByZXNlbnRhdGlvbiBmb3IgYSBjaGFyYWN0ZXIuICBJZiB0dXJuZWQgb24sIGdseXBocyB3aWxsIGJlCisvLyBwdWxsZWQgZnJvbSB0aGUgd2lkZSBnbHlwaCBkYXRhYmFzZSBhbmQgd2lsbCBkaXNwbGF5IGxvY2FsbHkgYXMgYSB3aWRlIGNoYXJhY3RlciAoMTYgWCAxOSB2ZXJzdXMgOCBYIDE5KQorLy8gSWYgYml0IDcgaXMgb2ZmLCB0aGUgbmFycm93IGdseXBoIGRhdGFiYXNlIHdpbGwgYmUgdXNlZC4gIFRoaXMgZG9lcyBOT1QgYWZmZWN0IGluZm9ybWF0aW9uIHRoYXQgaXMgc2VudCB0bworLy8gbm9uLWxvY2FsIGRpc3BsYXlzIChlLmcuIHNlcmlhbCBvciBMQU4gY29uc29sZXMpLgorLy8KKyNkZWZpbmUgRUZJX1dJREVfQVRUUklCVVRFICAweDgwCisKKy8qKgorICBSZXNldCB0aGUgdGV4dCBvdXRwdXQgZGV2aWNlIGhhcmR3YXJlIGFuZCBvcHRpb25hbHkgcnVuIGRpYWdub3N0aWNzCisKKyAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIEV4dGVuZGVkVmVyaWZpY2F0aW9uIERyaXZlciBtYXkgcGVyZm9ybSBtb3JlIGV4aGF1c3RpdmUgdmVyZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gb2YgdGhlIGRldmljZSBkdXJpbmcgcmVzZXQuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICBUaGUgdGV4dCBvdXRwdXQgZGV2aWNlIHdhcyByZXNldC4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICBUaGUgdGV4dCBvdXRwdXQgZGV2aWNlIGlzIG5vdCBmdW5jdGlvbmluZyBjb3JyZWN0bHkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bGQgbm90IGJlIHJlc2V0LgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX1JFU0VUKSgKKyAgSU4gRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTCAgICAgICAgKlRoaXMsCisgIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVmVyaWZpY2F0aW9uCisgICk7CisKKy8qKgorICBXcml0ZSBhIFVuaWNvZGUgc3RyaW5nIHRvIHRoZSBvdXRwdXQgZGV2aWNlLgorCisgIEBwYXJhbSAgVGhpcyAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgU3RyaW5nIFRoZSBOVUxMLXRlcm1pbmF0ZWQgVW5pY29kZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgZGV2aWNlKHMpLiBBbGwgb3V0cHV0IGRldmljZXMgbXVzdCBhbHNvIHN1cHBvcnQgdGhlIFVuaWNvZGUKKyAgICAgICAgICAgICAgICAgZHJhd2luZyBkZWZpbmVkIGluIHRoaXMgZmlsZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICAgIFRoZSBzdHJpbmcgd2FzIG91dHB1dCB0byB0aGUgZGV2aWNlLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICAgIFRoZSBkZXZpY2UgcmVwb3J0ZWQgYW4gZXJyb3Igd2hpbGUgYXR0ZW1wdGluZyB0byBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGV4dC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgICBUaGUgb3V0cHV0IGRldmljZSdzIG1vZGUgaXMgbm90IGN1cnJlbnRseSBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCB0ZXh0IG1vZGUuCisgIEByZXR2YWwgRUZJX1dBUk5fVU5LTk9XTl9HTFlQSCAgVGhpcyB3YXJuaW5nIGNvZGUgaW5kaWNhdGVzIHRoYXQgc29tZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzIGluIHRoZSBVbmljb2RlIHN0cmluZyBjb3VsZCBub3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZCBhbmQgd2VyZSBza2lwcGVkLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX1NUUklORykoCisgIElOIEVGSV9TSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0wgICAgICAgICpUaGlzLAorICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RyaW5nCisgICk7CisKKy8qKgorICBWZXJpZmllcyB0aGF0IGFsbCBjaGFyYWN0ZXJzIGluIGEgVW5pY29kZSBzdHJpbmcgY2FuIGJlIG91dHB1dCB0byB0aGUKKyAgdGFyZ2V0IGRldmljZS4KKworICBAcGFyYW0gIFRoaXMgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIFN0cmluZyBUaGUgTlVMTC10ZXJtaW5hdGVkIFVuaWNvZGUgc3RyaW5nIHRvIGJlIGV4YW1pbmVkIGZvciB0aGUgb3V0cHV0CisgICAgICAgICAgICAgICAgIGRldmljZShzKS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgVGhlIGRldmljZShzKSBhcmUgY2FwYWJsZSBvZiByZW5kZXJpbmcgdGhlIG91dHB1dCBzdHJpbmcuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICBTb21lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBVbmljb2RlIHN0cmluZyBjYW5ub3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkIGJ5IG9uZSBvciBtb3JlIG9mIHRoZSBvdXRwdXQgZGV2aWNlcyBtYXBwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBFRkkgaGFuZGxlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX1RFU1RfU1RSSU5HKSgKKyAgSU4gRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTCAgICAgICAgKlRoaXMsCisgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdHJpbmcKKyAgKTsKKworLyoqCisgIFJldHVybnMgaW5mb3JtYXRpb24gZm9yIGFuIGF2YWlsYWJsZSB0ZXh0IG1vZGUgdGhhdCB0aGUgb3V0cHV0IGRldmljZShzKQorICBzdXBwb3J0cy4KKworICBAcGFyYW0gIFRoaXMgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBNb2RlTnVtYmVyIFRoZSBtb2RlIG51bWJlciB0byByZXR1cm4gaW5mb3JtYXRpb24gb24uCisgIEBwYXJhbSAgQ29sdW1ucyAgICBSZXR1cm5zIHRoZSBnZW9tZXRyeSBvZiB0aGUgdGV4dCBvdXRwdXQgZGV2aWNlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBNb2RlTnVtYmVyLgorICBAcGFyYW0gIFJvd3MgICAgICAgUmV0dXJucyB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRleHQgb3V0cHV0IGRldmljZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgTW9kZU51bWJlci4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgVGhlIHJlcXVlc3RlZCBtb2RlIGluZm9ybWF0aW9uIHdhcyByZXR1cm5lZC4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SIFRoZSBkZXZpY2UgaGFkIGFuIGVycm9yIGFuZCBjb3VsZCBub3QgY29tcGxldGUgdGhlIHJlcXVlc3QuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICBUaGUgbW9kZSBudW1iZXIgd2FzIG5vdCB2YWxpZC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9RVUVSWV9NT0RFKSgKKyAgSU4gRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTCAgICAgICAgKlRoaXMsCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVOdW1iZXIsCisgIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpDb2x1bW5zLAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUm93cworICApOworCisvKioKKyAgU2V0cyB0aGUgb3V0cHV0IGRldmljZShzKSB0byBhIHNwZWNpZmllZCBtb2RlLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLgorICBAcGFyYW0gIE1vZGVOdW1iZXIgVGhlIG1vZGUgbnVtYmVyIHRvIHNldC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgVGhlIHJlcXVlc3RlZCB0ZXh0IG1vZGUgd2FzIHNldC4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SIFRoZSBkZXZpY2UgaGFkIGFuIGVycm9yIGFuZCBjb3VsZCBub3QgY29tcGxldGUgdGhlIHJlcXVlc3QuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICBUaGUgbW9kZSBudW1iZXIgd2FzIG5vdCB2YWxpZC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9TRVRfTU9ERSkoCisgIElOIEVGSV9TSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0wgICAgICAgICpUaGlzLAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlTnVtYmVyCisgICk7CisKKy8qKgorICBTZXRzIHRoZSBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kIGNvbG9ycyBmb3IgdGhlIE91dHB1dFN0cmluZyAoKSBhbmQKKyAgQ2xlYXJTY3JlZW4gKCkgZnVuY3Rpb25zLgorCisgIEBwYXJhbSAgVGhpcyAgICAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgdG8gc2V0LiBCaXRzIDAuLjMgYXJlIHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCBhbmQKKyAgICAgICAgICAgICAgICAgICAgYml0cyA0Li42IGFyZSB0aGUgYmFja2dyb3VuZCBjb2xvci4gQWxsIG90aGVyIGJpdHMgYXJlIHVuZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICBhbmQgbXVzdCBiZSB6ZXJvLiBUaGUgdmFsaWQgQXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiB0aGlzIGZpbGUuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgVGhlIGF0dHJpYnV0ZSB3YXMgc2V0LgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfICAgICBFUlJPUiBUaGUgZGV2aWNlIGhhZCBhbiBlcnJvciBhbmQgY291bGQgbm90IGNvbXBsZXRlIHRoZSByZXF1ZXN0LgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCBUaGUgYXR0cmlidXRlIHJlcXVlc3RlZCBpcyBub3QgZGVmaW5lZC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9TRVRfQVRUUklCVVRFKSgKKyAgSU4gRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTCAgICAgICAgKlRoaXMsCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZQorICApOworCisvKioKKyAgQ2xlYXJzIHRoZSBvdXRwdXQgZGV2aWNlKHMpIGRpc3BsYXkgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBiYWNrZ3JvdW5kCisgIGNvbG9yLgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKworICBAcmV0dmFsICBFRklfU1VDQ0VTUyAgICAgIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgQHJldHZhbCAgRUZJX0RFVklDRV9FUlJPUiBUaGUgZGV2aWNlIGhhZCBhbiBlcnJvciBhbmQgY291bGQgbm90IGNvbXBsZXRlIHRoZSByZXF1ZXN0LgorICBAcmV0dmFsICBFRklfVU5TVVBQT1JURUQgIFRoZSBvdXRwdXQgZGV2aWNlIGlzIG5vdCBpbiBhIHZhbGlkIHRleHQgbW9kZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9DTEVBUl9TQ1JFRU4pKAorICBJTiBFRklfU0lNUExFX1RFWFRfT1VUUFVUX1BST1RPQ09MICAgKlRoaXMKKyAgKTsKKworLyoqCisgIFNldHMgdGhlIGN1cnJlbnQgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvciBwb3NpdGlvbgorCisgIEBwYXJhbSAgVGhpcyAgICAgICAgUHJvdG9jb2wgaW5zdGFuY2UgcG9pbnRlci4KKyAgQHBhcmFtICBDb2x1bW4gICAgICBUaGUgcG9zaXRpb24gdG8gc2V0IHRoZSBjdXJzb3IgdG8uIE11c3QgYmUgZ3JlYXRlciB0aGFuIG9yCisgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gemVybyBhbmQgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgcm93cworICAgICAgICAgICAgICAgICAgICAgIGJ5IFF1ZXJ5TW9kZSAoKS4KKyAgQHBhcmFtICBSb3cgICAgICAgICBUaGUgcG9zaXRpb24gdG8gc2V0IHRoZSBjdXJzb3IgdG8uIE11c3QgYmUgZ3JlYXRlciB0aGFuIG9yCisgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gemVybyBhbmQgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgcm93cworICAgICAgICAgICAgICAgICAgICAgIGJ5IFF1ZXJ5TW9kZSAoKS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgVGhlIGRldmljZSBoYWQgYW4gZXJyb3IgYW5kIGNvdWxkIG5vdCBjb21wbGV0ZSB0aGUgcmVxdWVzdC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgIFRoZSBvdXRwdXQgZGV2aWNlIGlzIG5vdCBpbiBhIHZhbGlkIHRleHQgbW9kZSwgb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgcG9zaXRpb24gaXMgaW52YWxpZCBmb3IgdGhlIGN1cnJlbnQgbW9kZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfVEVYVF9TRVRfQ1VSU09SX1BPU0lUSU9OKSgKKyAgSU4gRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTCAgICAgICAgKlRoaXMsCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbiwKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93CisgICk7CisKKy8qKgorICBNYWtlcyB0aGUgY3Vyc29yIHZpc2libGUgb3IgaW52aXNpYmxlCisKKyAgQHBhcmFtICBUaGlzICAgIFByb3RvY29sIGluc3RhbmNlIHBvaW50ZXIuCisgIEBwYXJhbSAgVmlzaWJsZSBJZiBUUlVFLCB0aGUgY3Vyc29yIGlzIHNldCB0byBiZSB2aXNpYmxlLiBJZiBGQUxTRSwgdGhlIGN1cnNvciBpcworICAgICAgICAgICAgICAgICAgc2V0IHRvIGJlIGludmlzaWJsZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgVGhlIGRldmljZSBoYWQgYW4gZXJyb3IgYW5kIGNvdWxkIG5vdCBjb21wbGV0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIG9yIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnNvciBtb2RlLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgVGhlIG91dHB1dCBkZXZpY2UgaXMgbm90IGluIGEgdmFsaWQgdGV4dCBtb2RlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9URVhUX0VOQUJMRV9DVVJTT1IpKAorICBJTiBFRklfU0lNUExFX1RFWFRfT1VUUFVUX1BST1RPQ09MICAgICAgICAqVGhpcywKKyAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaWJsZQorICApOworCisvKioKKyAgQHBhciBEYXRhIFN0cnVjdHVyZSBEZXNjcmlwdGlvbjoKKyAgTW9kZSBTdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSBTaW1wbGUgVGV4dCBPdXQgcHJvdG9jb2wuCisKKyAgQHBhcmFtIE1heE1vZGUKKyAgVGhlIG51bWJlciBvZiBtb2RlcyBzdXBwb3J0ZWQgYnkgUXVlcnlNb2RlICgpIGFuZCBTZXRNb2RlICgpLgorCisgIEBwYXJhbSBNb2RlCisgIFRoZSB0ZXh0IG1vZGUgb2YgdGhlIG91dHB1dCBkZXZpY2UocykuCisKKyAgQHBhcmFtIEF0dHJpYnV0ZQorICBUaGUgY3VycmVudCBjaGFyYWN0ZXIgb3V0cHV0IGF0dHJpYnV0ZQorCisgIEBwYXJhbSBDdXJzb3JDb2x1bW4KKyAgVGhlIGN1cnNvcidzIGNvbHVtbi4KKworICBAcGFyYW0gQ3Vyc29yUm93CisgIFRoZSBjdXJzb3IncyByb3cuCisKKyAgQHBhcmFtIEN1cnNvclZpc2libGUKKyAgVGhlIGN1cnNvciBpcyBjdXJyZW50bHkgdmlzYmlsZSBvciBub3QuCisKKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQzMiAgIE1heE1vZGU7CisKKyAgLy8KKyAgLy8gY3VycmVudCBzZXR0aW5ncworICAvLworICBJTlQzMiAgIE1vZGU7CisgIElOVDMyICAgQXR0cmlidXRlOworICBJTlQzMiAgIEN1cnNvckNvbHVtbjsKKyAgSU5UMzIgICBDdXJzb3JSb3c7CisgIEJPT0xFQU4gQ3Vyc29yVmlzaWJsZTsKK30gRUZJX1NJTVBMRV9URVhUX09VVFBVVF9NT0RFOworCisvLy8KKy8vLyBUaGUgU0lNUExFX1RFWFRfT1VUUFVUIHByb3RvY29sIGlzIHVzZWQgdG8gY29udHJvbCB0ZXh0LWJhc2VkIG91dHB1dCBkZXZpY2VzLgorLy8vIEl0IGlzIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHByb3RvY29sIGZvciBhbnkgaGFuZGxlIHN1cHBsaWVkIGFzIHRoZSBDb25zb2xlT3V0CisvLy8gb3IgU3RhbmRhcmRFcnJvciBkZXZpY2UuIEluIGFkZGl0aW9uLCB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdGV4dCBtb2RlIG9mIHN1Y2gKKy8vLyBkZXZpY2VzIGlzIGF0IGxlYXN0IDgwIHggMjUgY2hhcmFjdGVycy4KKy8vLworc3RydWN0IF9FRklfU0lNUExFX1RFWFRfT1VUUFVUX1BST1RPQ09MIHsKKyAgRUZJX1RFWFRfUkVTRVQgICAgICAgICAgICAgICAgUmVzZXQ7CisKKyAgRUZJX1RFWFRfU1RSSU5HICAgICAgICAgICAgICAgT3V0cHV0U3RyaW5nOworICBFRklfVEVYVF9URVNUX1NUUklORyAgICAgICAgICBUZXN0U3RyaW5nOworCisgIEVGSV9URVhUX1FVRVJZX01PREUgICAgICAgICAgIFF1ZXJ5TW9kZTsKKyAgRUZJX1RFWFRfU0VUX01PREUgICAgICAgICAgICAgU2V0TW9kZTsKKyAgRUZJX1RFWFRfU0VUX0FUVFJJQlVURSAgICAgICAgU2V0QXR0cmlidXRlOworCisgIEVGSV9URVhUX0NMRUFSX1NDUkVFTiAgICAgICAgIENsZWFyU2NyZWVuOworICBFRklfVEVYVF9TRVRfQ1VSU09SX1BPU0lUSU9OICBTZXRDdXJzb3JQb3NpdGlvbjsKKyAgRUZJX1RFWFRfRU5BQkxFX0NVUlNPUiAgICAgICAgRW5hYmxlQ3Vyc29yOworCisgIC8vLworICAvLy8gUG9pbnRlciB0byBTSU1QTEVfVEVYVF9PVVRQVVRfTU9ERSBkYXRhLgorICAvLy8KKyAgRUZJX1NJTVBMRV9URVhUX09VVFBVVF9NT0RFICAgKk1vZGU7Cit9OworCitleHRlcm4gRUZJX0dVSUQgZ0VmaVNpbXBsZVRleHRPdXRQcm90b2NvbEd1aWQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1VlZmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGRkYjExCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqIEBmaWxlCisKKyAgUm9vdCBpbmNsdWRlIGZpbGUgZm9yIE1kZSBQYWNrYWdlIFVFRkksIFVFRklfQVBQTElDQVRJT04gdHlwZSBtb2R1bGVzLgorCisgIFRoaXMgaXMgdGhlIGluY2x1ZGUgZmlsZSBmb3IgYW55IG1vZHVsZSBvZiB0eXBlIFVFRkkgYW5kIFVFRklfQVBQTElDQVRJT04uIFVlZmkgbW9kdWxlcyBvbmx5IHVzZQorICB0eXBlcyBkZWZpbmVkIHZpYSB0aGlzIGluY2x1ZGUgZmlsZSBhbmQgY2FuIGJlIHBvcnRlZCBlYXNpbHkgdG8gYW55CisgIGVudmlyb25tZW50LgorCitDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA3LCBJbnRlbCBDb3Jwb3JhdGlvbgorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CitodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKK1RIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworKiovCisKKyNpZm5kZWYgX19QSV9VRUZJX0hfXworI2RlZmluZSBfX1BJX1VFRklfSF9fCisKKyNpbmNsdWRlIDxncHhlL2VmaS9VZWZpL1VlZmlCYXNlVHlwZS5oPgorI2luY2x1ZGUgPGdweGUvZWZpL1VlZmkvVWVmaVNwZWMuaD4KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvVWVmaS9VZWZpQmFzZVR5cGUuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvVWVmaS9VZWZpQmFzZVR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzVhYzAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpL1VlZmlCYXNlVHlwZS5oCkBAIC0wLDAgKzEsMjAwIEBACisvKiogQGZpbGUKKyAgRGVmaW5lcyBkYXRhIHR5cGVzIGFuZCBjb25zdGFudHMgaW50cm9kdWNlZCBpbiBVRUZJLgorCisgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisqKi8KKworI2lmbmRlZiBfX1VFRklfQkFTRVRZUEVfSF9fCisjZGVmaW5lIF9fVUVGSV9CQVNFVFlQRV9IX18KKworI2luY2x1ZGUgPGdweGUvZWZpL0Jhc2UuaD4KKworLy8KKy8vIEJhc2ljYWwgZGF0YSB0eXBlIGRlZmluaXRpb25zIGludHJvZHVjZWQgaW4gVUVGSS4KKy8vCisKKy8vLworLy8vIDEyOC1iaXQgYnVmZmVyIGNvbnRhaW5pbmcgYSB1bmlxdWUgaWRlbnRpZmllciB2YWx1ZS4KKy8vLwordHlwZWRlZiBHVUlEICAgICAgICAgICAgICAgICAgICAgIEVGSV9HVUlEOworLy8vCisvLy8gRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBmb3IgRUZJIEFQSQorLy8vCit0eXBlZGVmIFJFVFVSTl9TVEFUVVMgICAgICAgICAgICAgRUZJX1NUQVRVUzsKKy8vLworLy8vIEEgY29sbGVjdGlvbiBvZiByZWxhdGVkIGludGVyZmFjZXMuCisvLy8KK3R5cGVkZWYgVk9JRCAgICAgICAgICAgICAgICAgICAgICAqRUZJX0hBTkRMRTsKKy8vLworLy8vIEhhbmRsZSB0byBhbiBldmVudCBzdHJ1Y3R1cmUuCisvLy8KK3R5cGVkZWYgVk9JRCAgICAgICAgICAgICAgICAgICAgICAqRUZJX0VWRU5UOworLy8vCisvLy8gVGFzayBwcmlvcml0eSBsZXZlbC4KKy8vLwordHlwZWRlZiBVSU5UTiAgICAgICAgICAgICAgICAgICAgIEVGSV9UUEw7CisvLy8KKy8vLyBMb2dpY2FsIGJsb2NrIGFkZHJlc3MuCisvLy8KK3R5cGVkZWYgVUlOVDY0ICAgICAgICAgICAgICAgICAgICBFRklfTEJBOwordHlwZWRlZiBVSU5UNjQgICAgICAgICAgICAgICAgICAgIEVGSV9QSFlTSUNBTF9BRERSRVNTOwordHlwZWRlZiBVSU5UNjQgICAgICAgICAgICAgICAgICAgIEVGSV9WSVJUVUFMX0FERFJFU1M7CisKKy8vLworLy8vIEVGSSBUaW1lIEFic3RyYWN0aW9uOgorLy8vICBZZWFyOiAgICAgICAxOTk4IC0gMjBYWAorLy8vICBNb250aDogICAgICAxIC0gMTIKKy8vLyAgRGF5OiAgICAgICAgMSAtIDMxCisvLy8gIEhvdXI6ICAgICAgIDAgLSAyMworLy8vICBNaW51dGU6ICAgICAwIC0gNTkKKy8vLyAgU2Vjb25kOiAgICAgMCAtIDU5CisvLy8gIE5hbm9zZWNvbmQ6IDAgLSA5OTksOTk5LDk5OQorLy8vICBUaW1lWm9uZTogICAtMTQ0MCB0byAxNDQwIG9yIDIwNDcKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMTYgIFllYXI7CisgIFVJTlQ4ICAgTW9udGg7CisgIFVJTlQ4ICAgRGF5OworICBVSU5UOCAgIEhvdXI7CisgIFVJTlQ4ICAgTWludXRlOworICBVSU5UOCAgIFNlY29uZDsKKyAgVUlOVDggICBQYWQxOworICBVSU5UMzIgIE5hbm9zZWNvbmQ7CisgIElOVDE2ICAgVGltZVpvbmU7CisgIFVJTlQ4ICAgRGF5bGlnaHQ7CisgIFVJTlQ4ICAgUGFkMjsKK30gRUZJX1RJTUU7CisKKworLy8vCisvLy8gNC1ieXRlIGJ1ZmZlci4gQW4gSVB2NCBpbnRlcm5ldCBwcm90b2NvbCBhZGRyZXNzLgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQ4IEFkZHJbNF07Cit9IEVGSV9JUHY0X0FERFJFU1M7CisKKy8vLworLy8vIDE2LWJ5dGUgYnVmZmVyLiBBbiBJUHY2IGludGVybmV0IHByb3RvY29sIGFkZHJlc3MKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UOCBBZGRyWzE2XTsKK30gRUZJX0lQdjZfQUREUkVTUzsKKworLy8vCisvLy8gMzItYnl0ZSBidWZmZXIgY29udGFpbmluZyBhIG5ldHdvcmsgTWVkaWEgQWNjZXNzIENvbnRyb2wgYWRkcmVzcy4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UOCBBZGRyWzMyXTsKK30gRUZJX01BQ19BRERSRVNTOworCisvLy8KKy8vLyAxNi1ieXRlIGJ1ZmZlciBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorLy8vIEFuIElQdjQgb3IgSVB2NiBpbnRlcm5ldCBwcm90b2NvbCBhZGRyZXNzLgorLy8vCit0eXBlZGVmIHVuaW9uIHsKKyAgVUlOVDMyICAgICAgICAgICAgQWRkcls0XTsKKyAgRUZJX0lQdjRfQUREUkVTUyAgdjQ7CisgIEVGSV9JUHY2X0FERFJFU1MgIHY2OworfSBFRklfSVBfQUREUkVTUzsKKworCisvLworLy8gRW51bWVyYXRpb24gb2YgRUZJX1NUQVRVUy4KKy8vCisjZGVmaW5lIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgUkVUVVJOX1NVQ0NFU1MKKyNkZWZpbmUgRUZJX0xPQURfRVJST1IgICAgICAgICAgICBSRVRVUk5fTE9BRF9FUlJPUgorI2RlZmluZSBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgIFJFVFVSTl9JTlZBTElEX1BBUkFNRVRFUgorI2RlZmluZSBFRklfVU5TVVBQT1JURUQgICAgICAgICAgIFJFVFVSTl9VTlNVUFBPUlRFRAorI2RlZmluZSBFRklfQkFEX0JVRkZFUl9TSVpFICAgICAgIFJFVFVSTl9CQURfQlVGRkVSX1NJWkUKKyNkZWZpbmUgRUZJX0JVRkZFUl9UT09fU01BTEwgICAgICBSRVRVUk5fQlVGRkVSX1RPT19TTUFMTAorI2RlZmluZSBFRklfTk9UX1JFQURZICAgICAgICAgICAgIFJFVFVSTl9OT1RfUkVBRFkKKyNkZWZpbmUgRUZJX0RFVklDRV9FUlJPUiAgICAgICAgICBSRVRVUk5fREVWSUNFX0VSUk9SCisjZGVmaW5lIEVGSV9XUklURV9QUk9URUNURUQgICAgICAgUkVUVVJOX1dSSVRFX1BST1RFQ1RFRAorI2RlZmluZSBFRklfT1VUX09GX1JFU09VUkNFUyAgICAgIFJFVFVSTl9PVVRfT0ZfUkVTT1VSQ0VTCisjZGVmaW5lIEVGSV9WT0xVTUVfQ09SUlVQVEVEICAgICAgUkVUVVJOX1ZPTFVNRV9DT1JSVVBURUQKKyNkZWZpbmUgRUZJX1ZPTFVNRV9GVUxMICAgICAgICAgICBSRVRVUk5fVk9MVU1FX0ZVTEwKKyNkZWZpbmUgRUZJX05PX01FRElBICAgICAgICAgICAgICBSRVRVUk5fTk9fTUVESUEKKyNkZWZpbmUgRUZJX01FRElBX0NIQU5HRUQgICAgICAgICBSRVRVUk5fTUVESUFfQ0hBTkdFRAorI2RlZmluZSBFRklfTk9UX0ZPVU5EICAgICAgICAgICAgIFJFVFVSTl9OT1RfRk9VTkQKKyNkZWZpbmUgRUZJX0FDQ0VTU19ERU5JRUQgICAgICAgICBSRVRVUk5fQUNDRVNTX0RFTklFRAorI2RlZmluZSBFRklfTk9fUkVTUE9OU0UgICAgICAgICAgIFJFVFVSTl9OT19SRVNQT05TRQorI2RlZmluZSBFRklfTk9fTUFQUElORyAgICAgICAgICAgIFJFVFVSTl9OT19NQVBQSU5HCisjZGVmaW5lIEVGSV9USU1FT1VUICAgICAgICAgICAgICAgUkVUVVJOX1RJTUVPVVQKKyNkZWZpbmUgRUZJX05PVF9TVEFSVEVEICAgICAgICAgICBSRVRVUk5fTk9UX1NUQVJURUQKKyNkZWZpbmUgRUZJX0FMUkVBRFlfU1RBUlRFRCAgICAgICBSRVRVUk5fQUxSRUFEWV9TVEFSVEVECisjZGVmaW5lIEVGSV9BQk9SVEVEICAgICAgICAgICAgICAgUkVUVVJOX0FCT1JURUQKKyNkZWZpbmUgRUZJX0lDTVBfRVJST1IgICAgICAgICAgICBSRVRVUk5fSUNNUF9FUlJPUgorI2RlZmluZSBFRklfVEZUUF9FUlJPUiAgICAgICAgICAgIFJFVFVSTl9URlRQX0VSUk9SCisjZGVmaW5lIEVGSV9QUk9UT0NPTF9FUlJPUiAgICAgICAgUkVUVVJOX1BST1RPQ09MX0VSUk9SCisjZGVmaW5lIEVGSV9JTkNPTVBBVElCTEVfVkVSU0lPTiAgUkVUVVJOX0lOQ09NUEFUSUJMRV9WRVJTSU9OCisjZGVmaW5lIEVGSV9TRUNVUklUWV9WSU9MQVRJT04gICAgUkVUVVJOX1NFQ1VSSVRZX1ZJT0xBVElPTgorI2RlZmluZSBFRklfQ1JDX0VSUk9SICAgICAgICAgICAgIFJFVFVSTl9DUkNfRVJST1IKKyNkZWZpbmUgRUZJX0VORF9PRl9NRURJQSAgICAgICAgICBSRVRVUk5fRU5EX09GX01FRElBCisjZGVmaW5lIEVGSV9FTkRfT0ZfRklMRSAgICAgICAgICAgUkVUVVJOX0VORF9PRl9GSUxFCisjZGVmaW5lIEVGSV9JTlZBTElEX0xBTkdVQUdFICAgICAgUkVUVVJOX0lOVkFMSURfTEFOR1VBR0UKKworI2RlZmluZSBFRklfV0FSTl9VTktOT1dOX0dMWVBIICAgIFJFVFVSTl9XQVJOX1VOS05PV05fR0xZUEgKKyNkZWZpbmUgRUZJX1dBUk5fREVMRVRFX0ZBSUxVUkUgICBSRVRVUk5fV0FSTl9ERUxFVEVfRkFJTFVSRQorI2RlZmluZSBFRklfV0FSTl9XUklURV9GQUlMVVJFICAgIFJFVFVSTl9XQVJOX1dSSVRFX0ZBSUxVUkUKKyNkZWZpbmUgRUZJX1dBUk5fQlVGRkVSX1RPT19TTUFMTCBSRVRVUk5fV0FSTl9CVUZGRVJfVE9PX1NNQUxMCisKKworLy8KKy8vIERlZmluZSBtYWNybyB0byBlbmNvZGUgdGhlIHN0YXR1cyBjb2RlLgorLy8KKyNkZWZpbmUgRUZJRVJSKF9hKSAgICAgICAgICAgICAgICBFTkNPREVfRVJST1IoX2EpCisKKyNkZWZpbmUgRUZJX0VSUk9SKEEpICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoQSkKKworLy8KKy8vIERlZmluZSBtYWNyb3MgdG8gYnVpbGQgZGF0YSBzdHJ1Y3R1cmUgc2lnbmF0dXJlcyBmcm9tIGNoYXJhY3RlcnMuCisvLworI2RlZmluZSBFRklfU0lHTkFUVVJFXzE2KEEsIEIpICAgICAgICAgICAgICAgICAgICBTSUdOQVRVUkVfMTYgKEEsIEIpCisjZGVmaW5lIEVGSV9TSUdOQVRVUkVfMzIoQSwgQiwgQywgRCkgICAgICAgICAgICAgIFNJR05BVFVSRV8zMiAoQSwgQiwgQywgRCkKKyNkZWZpbmUgRUZJX1NJR05BVFVSRV82NChBLCBCLCBDLCBELCBFLCBGLCBHLCBIKSAgU0lHTkFUVVJFXzY0IChBLCBCLCBDLCBELCBFLCBGLCBHLCBIKQorCisKKy8vLworLy8vICBSZXR1cm5zIHRoZSBieXRlIG9mZnNldCB0byBhIGZpZWxkIHdpdGhpbiBhIHN0cnVjdHVyZQorLy8vCisjZGVmaW5lIEVGSV9GSUVMRF9PRkZTRVQoVFlQRSxGaWVsZCkgKChVSU5UTikoJigoKFRZUEUgKikgMCktPkZpZWxkKSkpCisKKy8vCisvLyBUaGUgRUZJIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyB3b3JrIGluIHVuaXRzIG9mIEVGSV9QQUdFcyB0aGF0IGFyZQorLy8gNEsuIFRoaXMgc2hvdWxkIGluIG5vIHdheSBiZSBjb25mdXNlZCB3aXRoIHRoZSBwYWdlIHNpemUgb2YgdGhlIHByb2Nlc3Nvci4KKy8vIEFuIEVGSV9QQUdFIGlzIGp1c3QgdGhlIHF1YW50YSBvZiBtZW1vcnkgaW4gRUZJLgorLy8KKyNkZWZpbmUgRUZJX1BBR0VfU0laRSAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRUZJX1BBR0VfTUFTSyAgICAgICAgICAgICAweEZGRgorI2RlZmluZSBFRklfUEFHRV9TSElGVCAgICAgICAgICAgIDEyCisKKyNkZWZpbmUgRUZJX1NJWkVfVE9fUEFHRVMoYSkgICgoKGEpID4+IEVGSV9QQUdFX1NISUZUKSArICgoKGEpICYgRUZJX1BBR0VfTUFTSykgPyAxIDogMCkpCisKKyNkZWZpbmUgRUZJX1BBR0VTX1RPX1NJWkUoYSkgICAoIChhKSA8PCBFRklfUEFHRV9TSElGVCkKKworCisjZGVmaW5lIEVGSV9NQVhfQklUICAgICAgICAgICAgICAgTUFYX0JJVAorI2RlZmluZSBFRklfTUFYX0FERFJFU1MgICAgICAgICAgIE1BWF9BRERSRVNTCisKKworLy8vCisvLy8gTGltaXRlZCBidWZmZXIgc2l6ZSBmb3IgYSBsYW5ndWFnZSBjb2RlIHJlY29tbWVuZGVkIGJ5IFJGQzMwNjYKKy8vLyAoNDIgY2hhcmFjdGVycyBwbHVzIGEgTlVMTCB0ZXJtaW5hdG9yKQorLy8vCisjZGVmaW5lIFJGQ18zMDY2X0VOVFJZX1NJWkUgICAgICAgICAgICAgKDQyICsgMSkKKworLy8vCisvLy8gVGhlIHNpemUgb2YgYSAzIGNoYXJhY3RlciBJU082MzkgbGFuZ3VhZ2UgY29kZS4KKy8vLworI2RlZmluZSBJU09fNjM5XzJfRU5UUllfU0laRSAgICAgICAgICAgIDMKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvVWVmaS9VZWZpR3B0LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1VlZmkvVWVmaUdwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzMwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1VlZmkvVWVmaUdwdC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qKiBAZmlsZQorICBFRkkgR3VpZCBQYXJ0aXRpb24gVGFibGUgRm9ybWF0IERlZmluaXRpb24uCisKKyAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyoqLworCisjaWZuZGVmIF9fVUVGSV9HUFRfSF9fCisjZGVmaW5lIF9fVUVGSV9HUFRfSF9fCisKKy8vLworLy8vIFRoZSBwcmltYXJ5IEdVSUQgUGFydGl0aW9uIFRhYmxlIEhlYWRlciBtdXN0IGJlCisvLy8gbG9jYXRlZCBpbiBMQkEgMSAoaS5lLiwgdGhlIHNlY29uZCBsb2dpY2FsIGJsb2NrKS4KKy8vLworI2RlZmluZSBQUklNQVJZX1BBUlRfSEVBREVSX0xCQSAxCisKKy8vLworLy8vIEVGSSBQYXJ0aXRpb24gVGFibGUgU2lnbmF0dXJlOiAiRUZJIFBBUlQiCisvLy8KKyNkZWZpbmUgRUZJX1BUQUJfSEVBREVSX0lEICAgICAgMHg1NDUyNDE1MDIwNDk0NjQ1VUxMCisKKyNwcmFnbWEgcGFjaygxKQorCisvLy8KKy8vLyBHUFQgUGFydGl0aW9uIFRhYmxlIEhlYWRlcgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9UQUJMRV9IRUFERVIgIEhlYWRlcjsKKyAgRUZJX0xCQSAgICAgICAgICAgTXlMQkE7CisgIEVGSV9MQkEgICAgICAgICAgIEFsdGVybmF0ZUxCQTsKKyAgRUZJX0xCQSAgICAgICAgICAgRmlyc3RVc2FibGVMQkE7CisgIEVGSV9MQkEgICAgICAgICAgIExhc3RVc2FibGVMQkE7CisgIEVGSV9HVUlEICAgICAgICAgIERpc2tHVUlEOworICBFRklfTEJBICAgICAgICAgICBQYXJ0aXRpb25FbnRyeUxCQTsKKyAgVUlOVDMyICAgICAgICAgICAgTnVtYmVyT2ZQYXJ0aXRpb25FbnRyaWVzOworICBVSU5UMzIgICAgICAgICAgICBTaXplT2ZQYXJ0aXRpb25FbnRyeTsKKyAgVUlOVDMyICAgICAgICAgICAgUGFydGl0aW9uRW50cnlBcnJheUNSQzMyOworfSBFRklfUEFSVElUSU9OX1RBQkxFX0hFQURFUjsKKworLy8vCisvLy8gR1BUIFBhcnRpdGlvbiBFbnRyeQorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9HVUlEICBQYXJ0aXRpb25UeXBlR1VJRDsKKyAgRUZJX0dVSUQgIFVuaXF1ZVBhcnRpdGlvbkdVSUQ7CisgIEVGSV9MQkEgICBTdGFydGluZ0xCQTsKKyAgRUZJX0xCQSAgIEVuZGluZ0xCQTsKKyAgVUlOVDY0ICAgIEF0dHJpYnV0ZXM7CisgIENIQVIxNiAgICBQYXJ0aXRpb25OYW1lWzM2XTsKK30gRUZJX1BBUlRJVElPTl9FTlRSWTsKKworI3ByYWdtYSBwYWNrKCkKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvVWVmaS9VZWZpSW50ZXJuYWxGb3JtUmVwcmVzZW50YXRpb24uaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvVWVmaS9VZWZpSW50ZXJuYWxGb3JtUmVwcmVzZW50YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjc1NTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpL1VlZmlJbnRlcm5hbEZvcm1SZXByZXNlbnRhdGlvbi5oCkBAIC0wLDAgKzEsMTU5MCBAQAorLyoqIEBmaWxlCisgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBlbmNvZGluZyBmb3IgdGhlIFZGUiAoVmlzdWFsIEZvcm0gUmVwcmVzZW50YXRpb24pIGxhbmd1YWdlLgorICBJRlIgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IHRoZSBFRkkgcHJlc2VudGF0aW9uIGVuZ2luZSwgYW5kIHByb2R1Y2VkIGJ5IEVGSQorICBpbnRlcm5hbCBhcHBsaWNhdGlvbiBhbmQgZHJpdmVycyBhcyB3ZWxsIGFzIGFsbCBhZGQtaW4gY2FyZCBvcHRpb24tUk9NIGRyaXZlcnMKKworICBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0CisgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKKworICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4KKworICBAcGFyIFJldmlzaW9uIFJlZmVyZW5jZToKKyAgVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGZyb20gVUVGSTIuMS4KKworKiovCisKKyNpZm5kZWYgX19VRUZJX0lOVEVSTkFMX0ZPUk1SRVBSRVNFTlRBVElPTl9IX18KKyNkZWZpbmUgX19VRUZJX0lOVEVSTkFMX0ZPUk1SRVBSRVNFTlRBVElPTl9IX18KKworLy8vCisvLy8gVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgY3VycmVudGx5IGRlZmluZWQ6CisvLy8KK3R5cGVkZWYgVk9JRCogICBFRklfSElJX0hBTkRMRTsKK3R5cGVkZWYgQ0hBUjE2KiBFRklfU1RSSU5HOwordHlwZWRlZiBVSU5UMTYgIEVGSV9JTUFHRV9JRDsKK3R5cGVkZWYgVUlOVDE2ICBFRklfUVVFU1RJT05fSUQ7Cit0eXBlZGVmIFVJTlQxNiAgRUZJX1NUUklOR19JRDsKK3R5cGVkZWYgVUlOVDE2ICBFRklfRk9STV9JRDsKK3R5cGVkZWYgVUlOVDE2ICBFRklfVkFSU1RPUkVfSUQ7CisKK3R5cGVkZWYgVUlOVDE2ICBFRklfREVGQVVMVF9JRDsKKwordHlwZWRlZiBVSU5UMzIgIEVGSV9ISUlfRk9OVF9TVFlMRTsKKworCisKKyNwcmFnbWEgcGFjaygxKQorCisvLworLy8gRGVmaW5pdGlvbnMgZm9yIFBhY2thZ2UgTGlzdHMgYW5kIFBhY2thZ2UgSGVhZGVycworLy8gU2VjdGlvbiAyNy4zLjEKKy8vCisKKy8vLworLy8vIFRoZSBoZWFkZXIgZm91bmQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggcGFja2FnZSBsaXN0LgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9HVUlEICAgICAgICAgICAgICAgUGFja2FnZUxpc3RHdWlkOworICBVSU5UMzIgICAgICAgICAgICAgICAgIFBhY2thZ2VMZW5ndGg7Cit9IEVGSV9ISUlfUEFDS0FHRV9MSVNUX0hFQURFUjsKKworLy8vCisvLy8gVGhlIGhlYWRlciBmb3VuZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBwYWNrYWdlLgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgTGVuZ3RoOjI0OworICBVSU5UMzIgIFR5cGU6ODsKKyAgLy8gVUlOVDggIERhdGFbLi4uXTsKK30gRUZJX0hJSV9QQUNLQUdFX0hFQURFUjsKKworLy8KKy8vIFZhbHVlIG9mIEhJSSBwYWNrYWdlIHR5cGUKKy8vCisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9UWVBFX0FMTCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9UWVBFX0dVSUQgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9GT1JNUyAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9TVFJJTkdTICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9GT05UUyAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9JTUFHRVMgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9TSU1QTEVfRk9OVFMgICAgICAgICAweDA3CisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9ERVZJQ0VfUEFUSCAgICAgICAgICAweDA4CisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9LRVlCT0FSRF9MQVlPVVQgICAgICAweDA5CisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9FTkQgICAgICAgICAgICAgICAgICAweERGCisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9UWVBFX1NZU1RFTV9CRUdJTiAgICAweEUwCisjZGVmaW5lIEVGSV9ISUlfUEFDS0FHRV9UWVBFX1NZU1RFTV9FTkQgICAgICAweEZGCisKKy8vCisvLyBEZWZpbml0aW9ucyBmb3IgU2ltcGxpZmllZCBGb250IFBhY2thZ2UKKy8vIFNlY3Rpb24gMjcuMy4yCisvLworCisvLworLy8gQ29udGVudHMgb2YgRUZJX05BUlJPV19HTFlQSC5BdHRyaWJ1dGVzCisvLworI2RlZmluZSBFRklfR0xZUEhfTk9OX1NQQUNJTkcgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBFRklfR0xZUEhfV0lERSAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFRklfR0xZUEhfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgRUZJX0dMWVBIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDSEFSMTYgICAgICAgICAgICAgICAgIFVuaWNvZGVXZWlnaHQ7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgQXR0cmlidXRlczsKKyAgVUlOVDggICAgICAgICAgICAgICAgICBHbHlwaENvbDFbRUZJX0dMWVBIX0hFSUdIVF07Cit9IEVGSV9OQVJST1dfR0xZUEg7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0hBUjE2ICAgICAgICAgICAgICAgICBVbmljb2RlV2VpZ2h0OworICBVSU5UOCAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXM7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgR2x5cGhDb2wxW0VGSV9HTFlQSF9IRUlHSFRdOworICBVSU5UOCAgICAgICAgICAgICAgICAgIEdseXBoQ29sMltFRklfR0xZUEhfSEVJR0hUXTsKKyAgVUlOVDggICAgICAgICAgICAgICAgICBQYWRbM107Cit9IEVGSV9XSURFX0dMWVBIOworCisvLy8KKy8vLyBBIHNpbXBsaWZpZWQgZm9udCBwYWNrYWdlIGNvbnNpc3RzIG9mIGEgZm9udCBoZWFkZXIKKy8vLyBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBnbHlwaCBzdHJ1Y3R1cmVzLgorLy8vCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9TSU1QTEVfRk9OVF9QQUNLQUdFX0hEUiB7CisgIEVGSV9ISUlfUEFDS0FHRV9IRUFERVIgSGVhZGVyOworICBVSU5UMTYgICAgICAgICAgICAgICAgIE51bWJlck9mTmFycm93R2x5cGhzOworICBVSU5UMTYgICAgICAgICAgICAgICAgIE51bWJlck9mV2lkZUdseXBoczsKKyAgLy8gRUZJX05BUlJPV19HTFlQSCAgICAgICBOYXJyb3dHbHlwaHNbXTsKKyAgLy8gRUZJX1dJREVfR0xZUEggICAgICAgICBXaWRlR2x5cGhzW107Cit9IEVGSV9ISUlfU0lNUExFX0ZPTlRfUEFDS0FHRV9IRFI7CisKKy8vCisvLyBEZWZpbml0aW9ucyBmb3IgRm9udCBQYWNrYWdlCisvLyBTZWN0aW9uIDI3LjMuMworLy8KKworLy8KKy8vIFZhbHVlIGZvciBmb250IHN0eWxlCisvLworI2RlZmluZSBFRklfSElJX0ZPTlRfU1RZTEVfTk9STUFMICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBFRklfSElJX0ZPTlRfU1RZTEVfQk9MRCAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFRklfSElJX0ZPTlRfU1RZTEVfSVRBTElDICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFRklfSElJX0ZPTlRfU1RZTEVfRU1CT1NTICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBFRklfSElJX0ZPTlRfU1RZTEVfT1VUTElORSAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBFRklfSElJX0ZPTlRfU1RZTEVfU0hBRE9XICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBFRklfSElJX0ZPTlRfU1RZTEVfVU5ERVJMSU5FICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBFRklfSElJX0ZPTlRfU1RZTEVfREJMX1VOREVSICAgICAgICAgMHgwMDEwMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9HTFlQSF9JTkZPIHsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICBXaWR0aDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICBIZWlnaHQ7CisgIElOVDE2ICAgICAgICAgICAgICAgICAgT2Zmc2V0WDsKKyAgSU5UMTYgICAgICAgICAgICAgICAgICBPZmZzZXRZOworICBJTlQxNiAgICAgICAgICAgICAgICAgIEFkdmFuY2VYOworfSBFRklfSElJX0dMWVBIX0lORk87CisKKy8vLworLy8vIFRoZSBmaXhlZCBoZWFkZXIgY29uc2lzdHMgb2YgYSBzdGFuZGFyZCByZWNvcmQgaGVhZGVyIGFuZAorLy8vIHRoZW4gdGhlIGNoYXJhY3RlciB2YWx1ZXMgaW4gdGhpcyBzZWN0aW9uLCB0aGUgZmxhZ3MKKy8vLyAoaW5jbHVkaW5nIHRoZSBlbmNvZGluZyBtZXRob2QpIGFuZCB0aGUgb2Zmc2V0cyBvZiB0aGUgZ2x5cGgKKy8vLyBpbmZvcm1hdGlvbiwgdGhlIGdseXBoIGJpdG1hcHMgYW5kIHRoZSBjaGFyYWN0ZXIgbWFwLgorLy8vCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9GT05UX1BBQ0tBR0VfSERSIHsKKyAgRUZJX0hJSV9QQUNLQUdFX0hFQURFUiBIZWFkZXI7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgSGRyU2l6ZTsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBHbHlwaEJsb2NrT2Zmc2V0OworICBFRklfSElJX0dMWVBIX0lORk8gICAgIENlbGw7CisgIEVGSV9ISUlfRk9OVF9TVFlMRSAgICAgRm9udFN0eWxlOworICBDSEFSMTYgICAgICAgICAgICAgICAgIEZvbnRGYW1pbHlbMV07Cit9IEVGSV9ISUlfRk9OVF9QQUNLQUdFX0hEUjsKKworLy8KKy8vIFZhbHVlIG9mIGRpZmZlcmVudCBnbHlwaCBpbmZvIGJsb2NrIHR5cGVzCisvLworI2RlZmluZSBFRklfSElJX0dJQlRfRU5EICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBFRklfSElJX0dJQlRfR0xZUEggICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBFRklfSElJX0dJQlRfR0xZUEhTICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBFRklfSElJX0dJQlRfR0xZUEhfREVGQVVMVCAgICAgICAgMHgxMgorI2RlZmluZSBFRklfSElJX0dJQlRfR0xZUEhTX0RFRkFVTFQgICAgICAgMHgxMworI2RlZmluZSBFRklfSElJX0dJQlRfRFVQTElDQVRFICAgICAgICAgICAgMHgyMAorI2RlZmluZSBFRklfSElJX0dJQlRfU0tJUDIgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBFRklfSElJX0dJQlRfU0tJUDEgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBFRklfSElJX0dJQlRfREVGQVVMVFMgICAgICAgICAgICAgMHgyMworI2RlZmluZSBFRklfSElJX0dJQlRfRVhUMSAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBFRklfSElJX0dJQlRfRVhUMiAgICAgICAgICAgICAgICAgMHgzMQorI2RlZmluZSBFRklfSElJX0dJQlRfRVhUNCAgICAgICAgICAgICAgICAgMHgzMgorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9HTFlQSF9CTE9DSyB7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgQmxvY2tUeXBlOworfSBFRklfSElJX0dMWVBIX0JMT0NLOworCisvLworLy8gRGVmaW5pdGlvbiBvZiBkaWZmZXJlbnQgZ2x5cGggaW5mbyBibG9jayB0eXBlcworLy8KKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfR0lCVF9ERUZBVUxUU19CTE9DSyB7CisgIEVGSV9ISUlfR0xZUEhfQkxPQ0sgICAgSGVhZGVyOworICBFRklfSElJX0dMWVBIX0lORk8gICAgIENlbGw7Cit9IEVGSV9ISUlfR0lCVF9ERUZBVUxUU19CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfR0lCVF9EVVBMSUNBVEVfQkxPQ0sgeworICBFRklfSElJX0dMWVBIX0JMT0NLICAgIEhlYWRlcjsKKyAgQ0hBUjE2ICAgICAgICAgICAgICAgICBDaGFyVmFsdWU7Cit9IEVGSV9ISUlfR0lCVF9EVVBMSUNBVEVfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfR0xZUEhfR0lCVF9FTkRfQkxPQ0sgeworICBFRklfSElJX0dMWVBIX0JMT0NLICAgIEhlYWRlcjsKK30gRUZJX0dMWVBIX0dJQlRfRU5EX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9HSUJUX0VYVDFfQkxPQ0sgeworICBFRklfSElJX0dMWVBIX0JMT0NLICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICBCbG9ja1R5cGUyOworICBVSU5UOCAgICAgICAgICAgICAgICAgIExlbmd0aDsKK30gRUZJX0hJSV9HSUJUX0VYVDFfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0dJQlRfRVhUMl9CTE9DSyB7CisgIEVGSV9ISUlfR0xZUEhfQkxPQ0sgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgIEJsb2NrVHlwZTI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgTGVuZ3RoOworfSBFRklfSElJX0dJQlRfRVhUMl9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfR0lCVF9FWFQ0X0JMT0NLIHsKKyAgRUZJX0hJSV9HTFlQSF9CTE9DSyAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgQmxvY2tUeXBlMjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICBMZW5ndGg7Cit9IEVGSV9ISUlfR0lCVF9FWFQ0X0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9HSUJUX0dMWVBIX0JMT0NLIHsKKyAgRUZJX0hJSV9HTFlQSF9CTE9DSyAgICBIZWFkZXI7CisgIEVGSV9ISUlfR0xZUEhfSU5GTyAgICAgQ2VsbDsKKyAgVUlOVDggICAgICAgICAgICAgICAgICBCaXRtYXBEYXRhWzFdOworfSBFRklfSElJX0dJQlRfR0xZUEhfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0dJQlRfR0xZUEhTX0JMT0NLIHsKKyAgRUZJX0hJSV9HTFlQSF9CTE9DSyAgICBIZWFkZXI7CisgIEVGSV9ISUlfR0xZUEhfSU5GTyAgICAgQ2VsbDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICBDb3VudDsKKyAgVUlOVDggICAgICAgICAgICAgICAgICBCaXRtYXBEYXRhWzFdOworfSBFRklfSElJX0dJQlRfR0xZUEhTX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9HSUJUX0dMWVBIX0RFRkFVTFRfQkxPQ0sgeworICBFRklfSElJX0dMWVBIX0JMT0NLICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICBCaXRtYXBEYXRhWzFdOworfSBFRklfSElJX0dJQlRfR0xZUEhfREVGQVVMVF9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfR0lCVF9HTFlQSFNfREVGQVVMVF9CTE9DSyB7CisgIEVGSV9ISUlfR0xZUEhfQkxPQ0sgICAgSGVhZGVyOworICBVSU5UMTYgICAgICAgICAgICAgICAgIENvdW50OworICBVSU5UOCAgICAgICAgICAgICAgICAgIEJpdG1hcERhdGFbMV07Cit9IEVGSV9ISUlfR0lCVF9HTFlQSFNfREVGQVVMVF9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfR0lCVF9TS0lQMV9CTE9DSyB7CisgIEVGSV9ISUlfR0xZUEhfQkxPQ0sgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgIFNraXBDb3VudDsKK30gRUZJX0hJSV9HSUJUX1NLSVAxX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9HSUJUX1NLSVAyX0JMT0NLIHsKKyAgRUZJX0hJSV9HTFlQSF9CTE9DSyAgICBIZWFkZXI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgU2tpcENvdW50OworfSBFRklfSElJX0dJQlRfU0tJUDJfQkxPQ0s7CisKKy8vCisvLyBEZWZpbml0aW9ucyBmb3IgRGV2aWNlIFBhdGggUGFja2FnZQorLy8gU2VjdGlvbiAyNy4zLjQKKy8vCisKKy8vLworLy8vIFRoZSBkZXZpY2UgcGF0aCBwYWNrYWdlIGlzIHVzZWQgdG8gY2FycnkgYSBkZXZpY2UgcGF0aAorLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZSBsaXN0LgorLy8vCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9ERVZJQ0VfUEFUSF9QQUNLQUdFIHsKKyAgRUZJX0hJSV9QQUNLQUdFX0hFQURFUiAgIEhlYWRlcjsKKyAgLy8gRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MIERldmljZVBhdGhbXTsKK30gRUZJX0hJSV9ERVZJQ0VfUEFUSF9QQUNLQUdFOworCisvLworLy8gRGVmaW5pdGlvbnMgZm9yIEdVSUQgUGFja2FnZQorLy8gU2VjdGlvbiAyNy4zLjUKKy8vCisKKy8vLworLy8vIFRoZSBHVUlEIHBhY2thZ2UgaXMgdXNlZCB0byBjYXJyeSBkYXRhIHdoZXJlIHRoZSBmb3JtYXQgaXMgZGVmaW5lZCBieSBhIEdVSUQuCisvLy8KK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0dVSURfUEFDS0FHRV9IRFIgeworICBFRklfSElJX1BBQ0tBR0VfSEVBREVSICBIZWFkZXI7CisgIEVGSV9HVUlEICAgICAgICAgICAgICAgIEd1aWQ7CisgIC8vIERhdGEgcGVyIEdVSUQgZGVmaW5pdGlvbiBtYXkgZm9sbG93Cit9IEVGSV9ISUlfR1VJRF9QQUNLQUdFX0hEUjsKKworLy8KKy8vIERlZmluaXRpb25zIGZvciBTdHJpbmcgUGFja2FnZQorLy8gU2VjdGlvbiAyNy4zLjYKKy8vCisKKyNkZWZpbmUgVUVGSV9DT05GSUdfTEFORyAgTCJ4LVVFRkkiCisjZGVmaW5lIFVFRklfQ09ORklHX0xBTkcyIEwieC1pLVVFRkkiCisKKy8vLworLy8vIFRoZSBmaXhlZCBoZWFkZXIgY29uc2lzdHMgb2YgYSBzdGFuZGFyZCByZWNvcmQgaGVhZGVyIGFuZCB0aGVuIHRoZSBzdHJpbmcgaWRlbnRpZmllcnMKKy8vLyBjb250YWluZWQgaW4gdGhpcyBzZWN0aW9uIGFuZCB0aGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIGFuZCBsYW5ndWFnZSBpbmZvcm1hdGlvbi4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfU1RSSU5HX1BBQ0tBR0VfSERSIHsKKyAgRUZJX0hJSV9QQUNLQUdFX0hFQURFUiAgSGVhZGVyOworICBVSU5UMzIgICAgICAgICAgICAgICAgICBIZHJTaXplOworICBVSU5UMzIgICAgICAgICAgICAgICAgICBTdHJpbmdJbmZvT2Zmc2V0OworICBDSEFSMTYgICAgICAgICAgICAgICAgICBMYW5ndWFnZVdpbmRvd1sxNl07CisgIEVGSV9TVFJJTkdfSUQgICAgICAgICAgIExhbmd1YWdlTmFtZTsKKyAgQ0hBUjggICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2VbMV07Cit9IEVGSV9ISUlfU1RSSU5HX1BBQ0tBR0VfSERSOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEJsb2NrVHlwZTsKK30gRUZJX0hJSV9TVFJJTkdfQkxPQ0s7CisKKy8vCisvLyBWYWx1ZSBvZiBkaWZmZXJlbnQgc3RyaW5nIGluZm9ybWF0aW9uIGJsb2NrIHR5cGVzCisvLworI2RlZmluZSBFRklfSElJX1NJQlRfRU5EICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBFRklfSElJX1NJQlRfU1RSSU5HX1NDU1UgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBFRklfSElJX1NJQlRfU1RSSU5HX1NDU1VfRk9OVCAgICAgICAgMHgxMQorI2RlZmluZSBFRklfSElJX1NJQlRfU1RSSU5HU19TQ1NVICAgICAgICAgICAgMHgxMgorI2RlZmluZSBFRklfSElJX1NJQlRfU1RSSU5HU19TQ1NVX0ZPTlQgICAgICAgMHgxMworI2RlZmluZSBFRklfSElJX1NJQlRfU1RSSU5HX1VDUzIgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBFRklfSElJX1NJQlRfU1RSSU5HX1VDUzJfRk9OVCAgICAgICAgMHgxNQorI2RlZmluZSBFRklfSElJX1NJQlRfU1RSSU5HU19VQ1MyICAgICAgICAgICAgMHgxNgorI2RlZmluZSBFRklfSElJX1NJQlRfU1RSSU5HU19VQ1MyX0ZPTlQgICAgICAgMHgxNworI2RlZmluZSBFRklfSElJX1NJQlRfRFVQTElDQVRFICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBFRklfSElJX1NJQlRfU0tJUDIgICAgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBFRklfSElJX1NJQlRfU0tJUDEgICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBFRklfSElJX1NJQlRfRVhUMSAgICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBFRklfSElJX1NJQlRfRVhUMiAgICAgICAgICAgICAgICAgICAgMHgzMQorI2RlZmluZSBFRklfSElJX1NJQlRfRVhUNCAgICAgICAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBFRklfSElJX1NJQlRfRk9OVCAgICAgICAgICAgICAgICAgICAgMHg0MAorCisvLworLy8gRGVmaW5pdGlvbiBvZiBkaWZmZXJlbnQgc3RyaW5nIGluZm9ybWF0aW9uIGJsb2NrIHR5cGVzCisvLworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9TSUJUX0RVUExJQ0FURV9CTE9DSyB7CisgIEVGSV9ISUlfU1RSSU5HX0JMT0NLICAgIEhlYWRlcjsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgU3RyaW5nSWQ7Cit9IEVGSV9ISUlfU0lCVF9EVVBMSUNBVEVfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX1NJQlRfRU5EX0JMT0NLIHsKKyAgRUZJX0hJSV9TVFJJTkdfQkxPQ0sgICAgSGVhZGVyOworfSBFRklfSElJX1NJQlRfRU5EX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9TSUJUX0VYVDFfQkxPQ0sgeworICBFRklfSElJX1NUUklOR19CTE9DSyAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEJsb2NrVHlwZTI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIExlbmd0aDsKK30gRUZJX0hJSV9TSUJUX0VYVDFfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX1NJQlRfRVhUMl9CTE9DSyB7CisgIEVGSV9ISUlfU1RSSU5HX0JMT0NLICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgQmxvY2tUeXBlMjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgTGVuZ3RoOworfSBFRklfSElJX1NJQlRfRVhUMl9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfU0lCVF9FWFQ0X0JMT0NLIHsKKyAgRUZJX0hJSV9TVFJJTkdfQkxPQ0sgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICBCbG9ja1R5cGUyOworICBVSU5UMzIgICAgICAgICAgICAgICAgICBMZW5ndGg7Cit9IEVGSV9ISUlfU0lCVF9FWFQ0X0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9TSUJUX0ZPTlRfQkxPQ0sgeworICBFRklfSElJX1NJQlRfRVhUMl9CTE9DSyBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEZvbnRJZDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgRm9udFNpemU7CisgIEVGSV9ISUlfRk9OVF9TVFlMRSAgICAgIEZvbnRTdHlsZTsKKyAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgRm9udE5hbWVbMV07Cit9IEVGSV9ISUlfU0lCVF9GT05UX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9TSUJUX1NLSVAxX0JMT0NLIHsKKyAgRUZJX0hJSV9TVFJJTkdfQkxPQ0sgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICBTa2lwQ291bnQ7Cit9IEVGSV9ISUlfU0lCVF9TS0lQMV9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfU0lCVF9TS0lQMl9CTE9DSyB7CisgIEVGSV9ISUlfU1RSSU5HX0JMT0NLICAgIEhlYWRlcjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgU2tpcENvdW50OworfSBFRklfSElJX1NJQlRfU0tJUDJfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX1NJQlRfU1RSSU5HX1NDU1VfQkxPQ0sgeworICBFRklfSElJX1NUUklOR19CTE9DSyAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIFN0cmluZ1RleHRbMV07Cit9IEVGSV9ISUlfU0lCVF9TVFJJTkdfU0NTVV9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfU0lCVF9TVFJJTkdfU0NTVV9GT05UX0JMT0NLIHsKKyAgRUZJX0hJSV9TVFJJTkdfQkxPQ0sgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICBGb250SWRlbnRpZmllcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgU3RyaW5nVGV4dFsxXTsKK30gRUZJX0hJSV9TSUJUX1NUUklOR19TQ1NVX0ZPTlRfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX1NJQlRfU1RSSU5HU19TQ1NVX0JMT0NLIHsKKyAgRUZJX0hJSV9TVFJJTkdfQkxPQ0sgICAgSGVhZGVyOworICBVSU5UMTYgICAgICAgICAgICAgICAgICBTdHJpbmdDb3VudDsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgU3RyaW5nVGV4dFsxXTsKK30gRUZJX0hJSV9TSUJUX1NUUklOR1NfU0NTVV9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfU0lCVF9TVFJJTkdTX1NDU1VfRk9OVF9CTE9DSyB7CisgIEVGSV9ISUlfU1RSSU5HX0JMT0NLICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgRm9udElkZW50aWZpZXI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgIFN0cmluZ0NvdW50OworICBVSU5UOCAgICAgICAgICAgICAgICAgICBTdHJpbmdUZXh0WzFdOworfSBFRklfSElJX1NJQlRfU1RSSU5HU19TQ1NVX0ZPTlRfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX1NJQlRfU1RSSU5HX1VDUzJfQkxPQ0sgeworICBFRklfSElJX1NUUklOR19CTE9DSyAgICBIZWFkZXI7CisgIENIQVIxNiAgICAgICAgICAgICAgICAgIFN0cmluZ1RleHRbMV07Cit9IEVGSV9ISUlfU0lCVF9TVFJJTkdfVUNTMl9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfU0lCVF9TVFJJTkdfVUNTMl9GT05UX0JMT0NLIHsKKyAgRUZJX0hJSV9TVFJJTkdfQkxPQ0sgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICBGb250SWRlbnRpZmllcjsKKyAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgU3RyaW5nVGV4dFsxXTsKK30gRUZJX0hJSV9TSUJUX1NUUklOR19VQ1MyX0ZPTlRfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX1NJQlRfU1RSSU5HU19VQ1MyX0JMT0NLIHsKKyAgRUZJX0hJSV9TVFJJTkdfQkxPQ0sgICAgSGVhZGVyOworICBVSU5UMTYgICAgICAgICAgICAgICAgICBTdHJpbmdDb3VudDsKKyAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgU3RyaW5nVGV4dFsxXTsKK30gRUZJX0hJSV9TSUJUX1NUUklOR1NfVUNTMl9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfU0lCVF9TVFJJTkdTX1VDUzJfRk9OVF9CTE9DSyB7CisgIEVGSV9ISUlfU1RSSU5HX0JMT0NLICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgRm9udElkZW50aWZpZXI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgIFN0cmluZ0NvdW50OworICBDSEFSMTYgICAgICAgICAgICAgICAgICBTdHJpbmdUZXh0WzFdOworfSBFRklfSElJX1NJQlRfU1RSSU5HU19VQ1MyX0ZPTlRfQkxPQ0s7CisKKy8vCisvLyBEZWZpbml0aW9ucyBmb3IgSW1hZ2UgUGFja2FnZQorLy8gU2VjdGlvbiAyNy4zLjcKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0lNQUdFX1BBQ0tBR0VfSERSIHsKKyAgRUZJX0hJSV9QQUNLQUdFX0hFQURFUiAgSGVhZGVyOworICBVSU5UMzIgICAgICAgICAgICAgICAgICBJbWFnZUluZm9PZmZzZXQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgIFBhbGV0dGVJbmZvT2Zmc2V0OworfSBFRklfSElJX0lNQUdFX1BBQ0tBR0VfSERSOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JTUFHRV9CTE9DSyB7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIEJsb2NrVHlwZTsKK30gRUZJX0hJSV9JTUFHRV9CTE9DSzsKKworLy8KKy8vIFZhbHVlIG9mIGRpZmZlcmVudCBpbWFnZSBpbmZvcm1hdGlvbiBibG9jayB0eXBlcworLy8KKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0VORCAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0lNQUdFXzFCSVQgICAgICAgIDB4MTAKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0lNQUdFXzFCSVRfVFJBTlMgIDB4MTEKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0lNQUdFXzRCSVQgICAgICAgIDB4MTIKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0lNQUdFXzRCSVRfVFJBTlMgIDB4MTMKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0lNQUdFXzhCSVQgICAgICAgIDB4MTQKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0lNQUdFXzhCSVRfVFJBTlMgIDB4MTUKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0lNQUdFXzI0QklUICAgICAgIDB4MTYKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0lNQUdFXzI0QklUX1RSQU5TIDB4MTcKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0lNQUdFX0pQRUcgICAgICAgIDB4MTgKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0RVUExJQ0FURSAgICAgICAgIDB4MjAKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX1NLSVAyICAgICAgICAgICAgIDB4MjEKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX1NLSVAxICAgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0VYVDEgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0VYVDIgICAgICAgICAgICAgIDB4MzEKKyNkZWZpbmUgRUZJX0hJSV9JSUJUX0VYVDQgICAgICAgICAgICAgIDB4MzIKKworLy8KKy8vIERlZmluaXRpb24gb2YgZGlmZmVyZW50IGltYWdlIGluZm9ybWF0aW9uIGJsb2NrIHR5cGVzCisvLworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JSUJUX0VORF9CTE9DSyB7CisgIEVGSV9ISUlfSU1BR0VfQkxPQ0sgICAgICAgICAgSGVhZGVyOworfSBFRklfSElJX0lJQlRfRU5EX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JSUJUX0VYVDFfQkxPQ0sgeworICBFRklfSElJX0lNQUdFX0JMT0NLICAgICAgICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBCbG9ja1R5cGUyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsKK30gRUZJX0hJSV9JSUJUX0VYVDFfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0lJQlRfRVhUMl9CTE9DSyB7CisgIEVGSV9ISUlfSU1BR0VfQkxPQ0sgICAgICAgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrVHlwZTI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOworfSBFRklfSElJX0lJQlRfRVhUMl9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfSUlCVF9FWFQ0X0JMT0NLIHsKKyAgRUZJX0hJSV9JTUFHRV9CTE9DSyAgICAgICAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tUeXBlMjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7Cit9IEVGSV9ISUlfSUlCVF9FWFQ0X0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JSUJUX0lNQUdFXzFCSVRfQkFTRSB7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgV2lkdGg7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgSGVpZ2h0OworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIERhdGFbMV07Cit9IEVGSV9ISUlfSUlCVF9JTUFHRV8xQklUX0JBU0U7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0lJQlRfSU1BR0VfMUJJVF9CTE9DSyB7CisgIEVGSV9ISUlfSU1BR0VfQkxPQ0sgICAgICAgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIFBhbGV0dGVJbmRleDsKKyAgRUZJX0hJSV9JSUJUX0lNQUdFXzFCSVRfQkFTRSBCaXRtYXA7Cit9IEVGSV9ISUlfSUlCVF9JTUFHRV8xQklUX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JSUJUX0lNQUdFXzFCSVRfVFJBTlNfQkxPQ0sgeworICBFRklfSElJX0lNQUdFX0JMT0NLICAgICAgICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBQYWxldHRlSW5kZXg7CisgIEVGSV9ISUlfSUlCVF9JTUFHRV8xQklUX0JBU0UgQml0bWFwOworfSBFRklfSElJX0lJQlRfSU1BR0VfMUJJVF9UUkFOU19CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfUkdCX1BJWEVMIHsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBiOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIGc7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgcjsKK30gRUZJX0hJSV9SR0JfUElYRUw7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0lJQlRfSU1BR0VfMjRCSVRfQkFTRSB7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgV2lkdGg7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgSGVpZ2h0OworICBFRklfSElJX1JHQl9QSVhFTCAgICAgICAgICAgIEJpdG1hcFsxXTsKK30gRUZJX0hJSV9JSUJUX0lNQUdFXzI0QklUX0JBU0U7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0lJQlRfSU1BR0VfMjRCSVRfQkxPQ0sgeworICBFRklfSElJX0lNQUdFX0JMT0NLICAgICAgICAgICBIZWFkZXI7CisgIEVGSV9ISUlfSUlCVF9JTUFHRV8yNEJJVF9CQVNFIEJpdG1hcDsKK30gRUZJX0hJSV9JSUJUX0lNQUdFXzI0QklUX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JSUJUX0lNQUdFXzI0QklUX1RSQU5TX0JMT0NLIHsKKyAgRUZJX0hJSV9JTUFHRV9CTE9DSyAgICAgICAgICAgSGVhZGVyOworICBFRklfSElJX0lJQlRfSU1BR0VfMjRCSVRfQkFTRSBCaXRtYXA7Cit9IEVGSV9ISUlfSUlCVF9JTUFHRV8yNEJJVF9UUkFOU19CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfSUlCVF9JTUFHRV80QklUX0JBU0UgeworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgIFdpZHRoOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgIEhlaWdodDsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBEYXRhWzFdOworfSBFRklfSElJX0lJQlRfSU1BR0VfNEJJVF9CQVNFOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JSUJUX0lNQUdFXzRCSVRfQkxPQ0sgeworICBFRklfSElJX0lNQUdFX0JMT0NLICAgICAgICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBQYWxldHRlSW5kZXg7CisgIEVGSV9ISUlfSUlCVF9JTUFHRV80QklUX0JBU0UgQml0bWFwOworfSBFRklfSElJX0lJQlRfSU1BR0VfNEJJVF9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfSUlCVF9JTUFHRV80QklUX1RSQU5TX0JMT0NLIHsKKyAgRUZJX0hJSV9JTUFHRV9CTE9DSyAgICAgICAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgUGFsZXR0ZUluZGV4OworICBFRklfSElJX0lJQlRfSU1BR0VfNEJJVF9CQVNFIEJpdG1hcDsKK30gRUZJX0hJSV9JSUJUX0lNQUdFXzRCSVRfVFJBTlNfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0lJQlRfSU1BR0VfOEJJVF9CQVNFIHsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICBXaWR0aDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICBIZWlnaHQ7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVsxXTsKK30gRUZJX0hJSV9JSUJUX0lNQUdFXzhCSVRfQkFTRTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfSUlCVF9JTUFHRV84QklUX1BBTEVUVEVfQkxPQ0sgeworICBFRklfSElJX0lNQUdFX0JMT0NLICAgICAgICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBQYWxldHRlSW5kZXg7CisgIEVGSV9ISUlfSUlCVF9JTUFHRV84QklUX0JBU0UgQml0bWFwOworfSBFRklfSElJX0lJQlRfSU1BR0VfOEJJVF9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfSUlCVF9JTUFHRV84QklUX1RSQU5TX0JMT0NLIHsKKyAgRUZJX0hJSV9JTUFHRV9CTE9DSyAgICAgICAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgUGFsZXR0ZUluZGV4OworICBFRklfSElJX0lJQlRfSU1BR0VfOEJJVF9CQVNFIEJpdG1hcDsKK30gRUZJX0hJSV9JSUJUX0lNQUdFXzhCSVRfVFJBTl9CTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfSUlCVF9EVVBMSUNBVEVfQkxPQ0sgeworICBFRklfSElJX0lNQUdFX0JMT0NLICAgICAgICAgIEhlYWRlcjsKKyAgRUZJX0lNQUdFX0lEICAgICAgICAgICAgICAgICBJbWFnZUlkOworfSBFRklfSElJX0lJQlRfRFVQTElDQVRFX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JSUJUX0pQRUdfQkxPQ0sgeworICBFRklfSElJX0lNQUdFX0JMT0NLICAgICAgICAgIEhlYWRlcjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBTaXplOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIERhdGFbMV07Cit9IEVGSV9ISUlfSUlCVF9KUEVHX0JMT0NLOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JSUJUX1NLSVAxX0JMT0NLIHsKKyAgRUZJX0hJSV9JTUFHRV9CTE9DSyAgICAgICAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgU2tpcENvdW50OworfSBFRklfSElJX0lJQlRfU0tJUDFfQkxPQ0s7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0lJQlRfU0tJUDJfQkxPQ0sgeworICBFRklfSElJX0lNQUdFX0JMT0NLICAgICAgICAgIEhlYWRlcjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICBTa2lwQ291bnQ7Cit9IEVGSV9ISUlfSUlCVF9TS0lQMl9CTE9DSzsKKworLy8KKy8vIERlZmluaXRpb25zIGZvciBQYWxldHRlIEluZm9ybWF0aW9uCisvLworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0hJSV9JTUFHRV9QQUxFVFRFX0lORk9fSEVBREVSIHsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICBQYWxldHRlQ291bnQ7Cit9IEVGSV9ISUlfSU1BR0VfUEFMRVRURV9JTkZPX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9ISUlfSU1BR0VfUEFMRVRURV9JTkZPIHsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICBQYWxldHRlU2l6ZTsKKyAgRUZJX0hJSV9SR0JfUElYRUwgICAgICAgICAgICBQYWxldHRlVmFsdWVbMV07Cit9IEVGSV9ISUlfSU1BR0VfUEFMRVRURV9JTkZPOworCisvLworLy8gRGVmaW5pdGlvbnMgZm9yIEZvcm1zIFBhY2thZ2UKKy8vIFNlY3Rpb24gMjcuMy44CisvLworCisvLy8KKy8vLyBUaGUgRm9ybXMgcGFja2FnZSBpcyB1c2VkIHRvIGNhcnJ5IGZvcm1zLWJhc2VkIGVuY29kaW5nIGRhdGEuCisvLy8KK3R5cGVkZWYgc3RydWN0IF9FRklfSElJX0ZPUk1fUEFDS0FHRSB7CisgIEVGSV9ISUlfUEFDS0FHRV9IRUFERVIgICAgICAgSGVhZGVyOworICAvLyBFRklfSUZSX09QX0hFQURFUiAgICAgICAgIE9wQ29kZUhlYWRlcjsKKyAgLy8gTW9yZSBvcC1jb2RlcyBmb2xsb3cKK30gRUZJX0hJSV9GT1JNX1BBQ0tBR0U7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDggSG91cjsKKyAgVUlOVDggTWludXRlOworICBVSU5UOCBTZWNvbmQ7Cit9IEVGSV9ISUlfVElNRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMTYgWWVhcjsKKyAgVUlOVDggIE1vbnRoOworICBVSU5UOCAgRGF5OworfSBFRklfSElJX0RBVEU7CisKK3R5cGVkZWYgdW5pb24geworICBVSU5UOCAgICAgICAgICAgdTg7CisgIFVJTlQxNiAgICAgICAgICB1MTY7CisgIFVJTlQzMiAgICAgICAgICB1MzI7CisgIFVJTlQ2NCAgICAgICAgICB1NjQ7CisgIEJPT0xFQU4gICAgICAgICBiOworICBFRklfSElJX1RJTUUgICAgdGltZTsKKyAgRUZJX0hJSV9EQVRFICAgIGRhdGU7CisgIEVGSV9TVFJJTkdfSUQgICBzdHJpbmc7Cit9IEVGSV9JRlJfVFlQRV9WQUxVRTsKKworLy8KKy8vIElGUiBPcGNvZGVzCisvLworI2RlZmluZSBFRklfSUZSX0ZPUk1fT1AgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBFRklfSUZSX1NVQlRJVExFX09QICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFRklfSUZSX1RFWFRfT1AgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBFRklfSUZSX0lNQUdFX09QICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFRklfSUZSX09ORV9PRl9PUCAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBFRklfSUZSX0NIRUNLQk9YX09QICAgICAgICAgICAgMHgwNgorI2RlZmluZSBFRklfSUZSX05VTUVSSUNfT1AgICAgICAgICAgICAgMHgwNworI2RlZmluZSBFRklfSUZSX1BBU1NXT1JEX09QICAgICAgICAgICAgMHgwOAorI2RlZmluZSBFRklfSUZSX09ORV9PRl9PUFRJT05fT1AgICAgICAgMHgwOQorI2RlZmluZSBFRklfSUZSX1NVUFBSRVNTX0lGX09QICAgICAgICAgMHgwQQorI2RlZmluZSBFRklfSUZSX0xPQ0tFRF9PUCAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBFRklfSUZSX0FDVElPTl9PUCAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBFRklfSUZSX1JFU0VUX0JVVFRPTl9PUCAgICAgICAgMHgwRAorI2RlZmluZSBFRklfSUZSX0ZPUk1fU0VUX09QICAgICAgICAgICAgMHgwRQorI2RlZmluZSBFRklfSUZSX1JFRl9PUCAgICAgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBFRklfSUZSX05PX1NVQk1JVF9JRl9PUCAgICAgICAgMHgxMAorI2RlZmluZSBFRklfSUZSX0lOQ09OU0lTVEVOVF9JRl9PUCAgICAgMHgxMQorI2RlZmluZSBFRklfSUZSX0VRX0lEX1ZBTF9PUCAgICAgICAgICAgMHgxMgorI2RlZmluZSBFRklfSUZSX0VRX0lEX0lEX09QICAgICAgICAgICAgMHgxMworI2RlZmluZSBFRklfSUZSX0VRX0lEX0xJU1RfT1AgICAgICAgICAgMHgxNAorI2RlZmluZSBFRklfSUZSX0FORF9PUCAgICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBFRklfSUZSX09SX09QICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBFRklfSUZSX05PVF9PUCAgICAgICAgICAgICAgICAgMHgxNworI2RlZmluZSBFRklfSUZSX1JVTEVfT1AgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBFRklfSUZSX0dSQVlfT1VUX0lGX09QICAgICAgICAgMHgxOQorI2RlZmluZSBFRklfSUZSX0RBVEVfT1AgICAgICAgICAgICAgICAgMHgxQQorI2RlZmluZSBFRklfSUZSX1RJTUVfT1AgICAgICAgICAgICAgICAgMHgxQgorI2RlZmluZSBFRklfSUZSX1NUUklOR19PUCAgICAgICAgICAgICAgMHgxQworI2RlZmluZSBFRklfSUZSX1JFRlJFU0hfT1AgICAgICAgICAgICAgMHgxRAorI2RlZmluZSBFRklfSUZSX0RJU0FCTEVfSUZfT1AgICAgICAgICAgMHgxRQorI2RlZmluZSBFRklfSUZSX1RPX0xPV0VSX09QICAgICAgICAgICAgMHgyMAorI2RlZmluZSBFRklfSUZSX1RPX1VQUEVSX09QICAgICAgICAgICAgMHgyMQorI2RlZmluZSBFRklfSUZSX09SREVSRURfTElTVF9PUCAgICAgICAgMHgyMworI2RlZmluZSBFRklfSUZSX1ZBUlNUT1JFX09QICAgICAgICAgICAgMHgyNAorI2RlZmluZSBFRklfSUZSX1ZBUlNUT1JFX05BTUVfVkFMVUVfT1AgMHgyNQorI2RlZmluZSBFRklfSUZSX1ZBUlNUT1JFX0VGSV9PUCAgICAgICAgMHgyNgorI2RlZmluZSBFRklfSUZSX1ZBUlNUT1JFX0RFVklDRV9PUCAgICAgMHgyNworI2RlZmluZSBFRklfSUZSX1ZFUlNJT05fT1AgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBFRklfSUZSX0VORF9PUCAgICAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBFRklfSUZSX01BVENIX09QICAgICAgICAgICAgICAgMHgyQQorI2RlZmluZSBFRklfSUZSX0VRVUFMX09QICAgICAgICAgICAgICAgMHgyRgorI2RlZmluZSBFRklfSUZSX05PVF9FUVVBTF9PUCAgICAgICAgICAgMHgzMAorI2RlZmluZSBFRklfSUZSX0dSRUFURVJfVEhBTl9PUCAgICAgICAgMHgzMQorI2RlZmluZSBFRklfSUZSX0dSRUFURVJfRVFVQUxfT1AgICAgICAgMHgzMgorI2RlZmluZSBFRklfSUZSX0xFU1NfVEhBTl9PUCAgICAgICAgICAgMHgzMworI2RlZmluZSBFRklfSUZSX0xFU1NfRVFVQUxfT1AgICAgICAgICAgMHgzNAorI2RlZmluZSBFRklfSUZSX0JJVFdJU0VfQU5EX09QICAgICAgICAgMHgzNQorI2RlZmluZSBFRklfSUZSX0JJVFdJU0VfT1JfT1AgICAgICAgICAgMHgzNgorI2RlZmluZSBFRklfSUZSX0JJVFdJU0VfTk9UX09QICAgICAgICAgMHgzNworI2RlZmluZSBFRklfSUZSX1NISUZUX0xFRlRfT1AgICAgICAgICAgMHgzOAorI2RlZmluZSBFRklfSUZSX1NISUZUX1JJR0hUX09QICAgICAgICAgMHgzOQorI2RlZmluZSBFRklfSUZSX0FERF9PUCAgICAgICAgICAgICAgICAgMHgzQQorI2RlZmluZSBFRklfSUZSX1NVQlRSQUNUX09QICAgICAgICAgICAgMHgzQgorI2RlZmluZSBFRklfSUZSX01VTFRJUExZX09QICAgICAgICAgICAgMHgzQworI2RlZmluZSBFRklfSUZSX0RJVklERV9PUCAgICAgICAgICAgICAgMHgzRAorI2RlZmluZSBFRklfSUZSX01PRFVMT19PUCAgICAgICAgICAgICAgMHgzRQorI2RlZmluZSBFRklfSUZSX1JVTEVfUkVGX09QICAgICAgICAgICAgMHgzRgorI2RlZmluZSBFRklfSUZSX1FVRVNUSU9OX1JFRjFfT1AgICAgICAgMHg0MAorI2RlZmluZSBFRklfSUZSX1FVRVNUSU9OX1JFRjJfT1AgICAgICAgMHg0MQorI2RlZmluZSBFRklfSUZSX1VJTlQ4X09QICAgICAgICAgICAgICAgMHg0MgorI2RlZmluZSBFRklfSUZSX1VJTlQxNl9PUCAgICAgICAgICAgICAgMHg0MworI2RlZmluZSBFRklfSUZSX1VJTlQzMl9PUCAgICAgICAgICAgICAgMHg0NAorI2RlZmluZSBFRklfSUZSX1VJTlQ2NF9PUCAgICAgICAgICAgICAgMHg0NQorI2RlZmluZSBFRklfSUZSX1RSVUVfT1AgICAgICAgICAgICAgICAgMHg0NgorI2RlZmluZSBFRklfSUZSX0ZBTFNFX09QICAgICAgICAgICAgICAgMHg0NworI2RlZmluZSBFRklfSUZSX1RPX1VJTlRfT1AgICAgICAgICAgICAgMHg0OAorI2RlZmluZSBFRklfSUZSX1RPX1NUUklOR19PUCAgICAgICAgICAgMHg0OQorI2RlZmluZSBFRklfSUZSX1RPX0JPT0xFQU5fT1AgICAgICAgICAgMHg0QQorI2RlZmluZSBFRklfSUZSX01JRF9PUCAgICAgICAgICAgICAgICAgMHg0QgorI2RlZmluZSBFRklfSUZSX0ZJTkRfT1AgICAgICAgICAgICAgICAgMHg0QworI2RlZmluZSBFRklfSUZSX1RPS0VOX09QICAgICAgICAgICAgICAgMHg0RAorI2RlZmluZSBFRklfSUZSX1NUUklOR19SRUYxX09QICAgICAgICAgMHg0RQorI2RlZmluZSBFRklfSUZSX1NUUklOR19SRUYyX09QICAgICAgICAgMHg0RgorI2RlZmluZSBFRklfSUZSX0NPTkRJVElPTkFMX09QICAgICAgICAgMHg1MAorI2RlZmluZSBFRklfSUZSX1FVRVNUSU9OX1JFRjNfT1AgICAgICAgMHg1MQorI2RlZmluZSBFRklfSUZSX1pFUk9fT1AgICAgICAgICAgICAgICAgMHg1MgorI2RlZmluZSBFRklfSUZSX09ORV9PUCAgICAgICAgICAgICAgICAgMHg1MworI2RlZmluZSBFRklfSUZSX09ORVNfT1AgICAgICAgICAgICAgICAgMHg1NAorI2RlZmluZSBFRklfSUZSX1VOREVGSU5FRF9PUCAgICAgICAgICAgMHg1NQorI2RlZmluZSBFRklfSUZSX0xFTkdUSF9PUCAgICAgICAgICAgICAgMHg1NgorI2RlZmluZSBFRklfSUZSX0RVUF9PUCAgICAgICAgICAgICAgICAgMHg1NworI2RlZmluZSBFRklfSUZSX1RISVNfT1AgICAgICAgICAgICAgICAgMHg1OAorI2RlZmluZSBFRklfSUZSX1NQQU5fT1AgICAgICAgICAgICAgICAgMHg1OQorI2RlZmluZSBFRklfSUZSX1ZBTFVFX09QICAgICAgICAgICAgICAgMHg1QQorI2RlZmluZSBFRklfSUZSX0RFRkFVTFRfT1AgICAgICAgICAgICAgMHg1QgorI2RlZmluZSBFRklfSUZSX0RFRkFVTFRTVE9SRV9PUCAgICAgICAgMHg1QworI2RlZmluZSBFRklfSUZSX0NBVEVOQVRFX09QICAgICAgICAgICAgMHg1RQorI2RlZmluZSBFRklfSUZSX0dVSURfT1AgICAgICAgICAgICAgICAgMHg1RgorCisvLworLy8gRGVmaW5pdGlvbnMgb2YgSUZSIFN0YW5kYXJkIEhlYWRlcnMKKy8vIFNlY3Rpb24gMjcuMy44LjIKKy8vCisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX09QX0hFQURFUiB7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBPcENvZGU7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBMZW5ndGg6NzsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgIFNjb3BlOjE7Cit9IEVGSV9JRlJfT1BfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9TVEFURU1FTlRfSEVBREVSIHsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgIFByb21wdDsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgIEhlbHA7Cit9IEVGSV9JRlJfU1RBVEVNRU5UX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfUVVFU1RJT05fSEVBREVSIHsKKyAgRUZJX0lGUl9TVEFURU1FTlRfSEVBREVSIEhlYWRlcjsKKyAgRUZJX1FVRVNUSU9OX0lEICAgICAgICAgIFF1ZXN0aW9uSWQ7CisgIEVGSV9WQVJTVE9SRV9JRCAgICAgICAgICBWYXJTdG9yZUlkOworICB1bmlvbiB7CisgICAgRUZJX1NUUklOR19JRCAgICAgICAgICBWYXJOYW1lOworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgVmFyT2Zmc2V0OworICB9ICAgICAgICAgICAgICAgICAgICAgICAgVmFyU3RvcmVJbmZvOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgRmxhZ3M7Cit9IEVGSV9JRlJfUVVFU1RJT05fSEVBREVSOworCisvLworLy8gRmxhZyB2YWx1ZXMgb2YgRUZJX0lGUl9RVUVTVElPTl9IRUFERVIKKy8vCisjZGVmaW5lIEVGSV9JRlJfRkxBR19SRUFEX09OTFkgICAgICAgICAweDAxCisjZGVmaW5lIEVGSV9JRlJfRkxBR19DQUxMQkFDSyAgICAgICAgICAweDA0CisjZGVmaW5lIEVGSV9JRlJfRkxBR19SRVNFVF9SRVFVSVJFRCAgICAweDEwCisjZGVmaW5lIEVGSV9JRlJfRkxBR19PUFRJT05TX09OTFkgICAgICAweDgwCisKKy8vCisvLyBEZWZpbml0aW9uIGZvciBPcGNvZGUgUmVmZXJlbmNlCisvLyBTZWN0aW9uIDI3LjMuOC4zCisvLwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfREVGQVVMVFNUT1JFIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgIERlZmF1bHROYW1lOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgRGVmYXVsdElkOworfSBFRklfSUZSX0RFRkFVTFRTVE9SRTsKKworLy8KKy8vIERlZmF1bHQgSWRlbnRpZmllciBvZiBkZWZhdWx0IHN0b3JlCisvLworI2RlZmluZSBFRklfSElJX0RFRkFVTFRfQ0xBU1NfU1RBTkRBUkQgICAgICAgMHgwMDAwCisjZGVmaW5lIEVGSV9ISUlfREVGQVVMVF9DTEFTU19NQU5VRkFDVFVSSU5HICAweDAwMDEKKyNkZWZpbmUgRUZJX0hJSV9ERUZBVUxUX0NMQVNTX1NBRkUgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBFRklfSElJX0RFRkFVTFRfQ0xBU1NfUExBVEZPUk1fQkVHSU4gMHg0MDAwCisjZGVmaW5lIEVGSV9ISUlfREVGQVVMVF9DTEFTU19QTEFURk9STV9FTkQgICAweDdmZmYKKyNkZWZpbmUgRUZJX0hJSV9ERUZBVUxUX0NMQVNTX0hBUkRXQVJFX0JFR0lOIDB4ODAwMAorI2RlZmluZSBFRklfSElJX0RFRkFVTFRfQ0xBU1NfSEFSRFdBUkVfRU5EICAgMHhiZmZmCisjZGVmaW5lIEVGSV9ISUlfREVGQVVMVF9DTEFTU19GSVJNV0FSRV9CRUdJTiAweGMwMDAKKyNkZWZpbmUgRUZJX0hJSV9ERUZBVUxUX0NMQVNTX0ZJUk1XQVJFX0VORCAgIDB4ZmZmZgorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9WQVJTVE9SRSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9HVUlEICAgICAgICAgICAgICAgICBHdWlkOworICBFRklfVkFSU1RPUkVfSUQgICAgICAgICAgVmFyU3RvcmVJZDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgIFNpemU7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBOYW1lWzFdOworfSBFRklfSUZSX1ZBUlNUT1JFOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9WQVJTVE9SRV9FRkkgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfVkFSU1RPUkVfSUQgICAgICAgICAgVmFyU3RvcmVJZDsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgIEd1aWQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzOworfSBFRklfSUZSX1ZBUlNUT1JFX0VGSTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVkFSU1RPUkVfTkFNRV9WQUxVRSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9WQVJTVE9SRV9JRCAgICAgICAgICBWYXJTdG9yZUlkOworICBFRklfR1VJRCAgICAgICAgICAgICAgICAgR3VpZDsKK30gRUZJX0lGUl9WQVJTVE9SRV9OQU1FX1ZBTFVFOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9GT1JNX1NFVCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9HVUlEICAgICAgICAgICAgICAgICBHdWlkOworICBFRklfU1RSSU5HX0lEICAgICAgICAgICAgRm9ybVNldFRpdGxlOworICBFRklfU1RSSU5HX0lEICAgICAgICAgICAgSGVscDsKK30gRUZJX0lGUl9GT1JNX1NFVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfRU5EIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9FTkQ7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX0ZPUk0geworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBVSU5UMTYgICAgICAgICAgICAgICAgICAgRm9ybUlkOworICBFRklfU1RSSU5HX0lEICAgICAgICAgICAgRm9ybVRpdGxlOworfSBFRklfSUZSX0ZPUk07CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX0lNQUdFIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX0lNQUdFX0lEICAgICAgICAgICAgIElkOworfSBFRklfSUZSX0lNQUdFOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9MT0NLRUQgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX0xPQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfUlVMRSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBSdWxlSWQ7Cit9IEVGSV9JRlJfUlVMRTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfREVGQVVMVCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICBEZWZhdWx0SWQ7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBUeXBlOworICBFRklfSUZSX1RZUEVfVkFMVUUgICAgICAgVmFsdWU7Cit9IEVGSV9JRlJfREVGQVVMVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVkFMVUUgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX1ZBTFVFOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9TVUJUSVRMRSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9JRlJfU1RBVEVNRU5UX0hFQURFUiBTdGF0ZW1lbnQ7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBGbGFnczsKK30gRUZJX0lGUl9TVUJUSVRMRTsKKworI2RlZmluZSBFRklfSUZSX0ZMQUdTX0hPUklaT05UQUwgICAgICAgMHgwMQorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9DSEVDS0JPWCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9JRlJfUVVFU1RJT05fSEVBREVSICBRdWVzdGlvbjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgIEZsYWdzOworfSBFRklfSUZSX0NIRUNLQk9YOworCisjZGVmaW5lIEVGSV9JRlJfQ0hFQ0tCT1hfREVGQVVMVCAgICAgICAweDAxCisjZGVmaW5lIEVGSV9JRlJfQ0hFQ0tCT1hfREVGQVVMVF9NRkcgICAweDAyCisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX1RFWFQgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfSUZSX1NUQVRFTUVOVF9IRUFERVIgU3RhdGVtZW50OworICBFRklfU1RSSU5HX0lEICAgICAgICAgICAgVGV4dFR3bzsKK30gRUZJX0lGUl9URVhUOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9SRUYgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfSUZSX1FVRVNUSU9OX0hFQURFUiAgUXVlc3Rpb247CisgIEVGSV9GT1JNX0lEICAgICAgICAgICAgICBGb3JtSWQ7Cit9IEVGSV9JRlJfUkVGOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9SRUYyIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX0lGUl9RVUVTVElPTl9IRUFERVIgIFF1ZXN0aW9uOworICBFRklfRk9STV9JRCAgICAgICAgICAgICAgRm9ybUlkOworICBFRklfUVVFU1RJT05fSUQgICAgICAgICAgUXVlc3Rpb25JZDsKK30gRUZJX0lGUl9SRUYyOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9SRUYzIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX0lGUl9RVUVTVElPTl9IRUFERVIgIFF1ZXN0aW9uOworICBFRklfRk9STV9JRCAgICAgICAgICAgICAgRm9ybUlkOworICBFRklfUVVFU1RJT05fSUQgICAgICAgICAgUXVlc3Rpb25JZDsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgIEZvcm1TZXRJZDsKK30gRUZJX0lGUl9SRUYzOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9SRUY0IHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX0lGUl9RVUVTVElPTl9IRUFERVIgIFF1ZXN0aW9uOworICBFRklfRk9STV9JRCAgICAgICAgICAgICAgRm9ybUlkOworICBFRklfUVVFU1RJT05fSUQgICAgICAgICAgUXVlc3Rpb25JZDsKKyAgRUZJX0dVSUQgICAgICAgICAgICAgICAgIEZvcm1TZXRJZDsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgIERldmljZVBhdGg7Cit9IEVGSV9JRlJfUkVGNDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfUkVTRVRfQlVUVE9OIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX0lGUl9RVUVTVElPTl9IRUFERVIgIFF1ZXN0aW9uOworICBFRklfREVGQVVMVF9JRCAgICAgICAgICAgRGVmYXVsdElkOworfSBFRklfSUZSX1JFU0VUX0JVVFRPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfQUNUSU9OIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX0lGUl9RVUVTVElPTl9IRUFERVIgIFF1ZXN0aW9uOworICBFRklfU1RSSU5HX0lEICAgICAgICAgICAgUXVlc3Rpb25Db25maWc7Cit9IEVGSV9JRlJfQUNUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9BQ1RJT05fMSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9JRlJfUVVFU1RJT05fSEVBREVSICBRdWVzdGlvbjsKK30gRUZJX0lGUl9BQ1RJT05fMTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfREFURSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9JRlJfUVVFU1RJT05fSEVBREVSICBRdWVzdGlvbjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgIEZsYWdzOworfSBFRklfSUZSX0RBVEU7CisKKy8vCisvLyBGbGFncyB0aGF0IGRlc2NyaWJlIHRoZSBiZWhhdmlvciBvZiB0aGUgcXVlc3Rpb24uCisvLworI2RlZmluZSBFRklfUUZfREFURV9ZRUFSX1NVUFBSRVNTICAgICAgMHgwMQorI2RlZmluZSBFRklfUUZfREFURV9NT05USF9TVVBQUkVTUyAgICAgMHgwMgorI2RlZmluZSBFRklfUUZfREFURV9EQVlfU1VQUFJFU1MgICAgICAgMHgwNAorCisjZGVmaW5lIEVGSV9RRl9EQVRFX1NUT1JBR0UgICAgICAgICAgICAweDMwCisjZGVmaW5lICAgICBRRl9EQVRFX1NUT1JBR0VfTk9STUFMICAgICAweDAwCisjZGVmaW5lICAgICBRRl9EQVRFX1NUT1JBR0VfVElNRSAgICAgICAweDEwCisjZGVmaW5lICAgICBRRl9EQVRFX1NUT1JBR0VfV0FLRVVQICAgICAweDIwCisKK3R5cGVkZWYgdW5pb24geworICBzdHJ1Y3QgeworICAgIFVJTlQ4IE1pblZhbHVlOworICAgIFVJTlQ4IE1heFZhbHVlOworICAgIFVJTlQ4IFN0ZXA7CisgIH0gdTg7CisgIHN0cnVjdCB7CisgICAgVUlOVDE2IE1pblZhbHVlOworICAgIFVJTlQxNiBNYXhWYWx1ZTsKKyAgICBVSU5UMTYgU3RlcDsKKyAgfSB1MTY7CisgIHN0cnVjdCB7CisgICAgVUlOVDMyIE1pblZhbHVlOworICAgIFVJTlQzMiBNYXhWYWx1ZTsKKyAgICBVSU5UMzIgU3RlcDsKKyAgfSB1MzI7CisgIHN0cnVjdCB7CisgICAgVUlOVDY0IE1pblZhbHVlOworICAgIFVJTlQ2NCBNYXhWYWx1ZTsKKyAgICBVSU5UNjQgU3RlcDsKKyAgfSB1NjQ7Cit9IE1JTk1BWFNURVBfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfTlVNRVJJQyB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9JRlJfUVVFU1RJT05fSEVBREVSICBRdWVzdGlvbjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgIEZsYWdzOworICBNSU5NQVhTVEVQX0RBVEEgICAgICAgICAgZGF0YTsKK30gRUZJX0lGUl9OVU1FUklDOworCisvLworLy8gRmxhZ3MgcmVsYXRlZCB0byB0aGUgbnVtZXJpYyBxdWVzdGlvbgorLy8KKyNkZWZpbmUgRUZJX0lGUl9OVU1FUklDX1NJWkUgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgICBFRklfSUZSX05VTUVSSUNfU0laRV8xICAgICAgIDB4MDAKKyNkZWZpbmUgICBFRklfSUZSX05VTUVSSUNfU0laRV8yICAgICAgIDB4MDEKKyNkZWZpbmUgICBFRklfSUZSX05VTUVSSUNfU0laRV80ICAgICAgIDB4MDIKKyNkZWZpbmUgICBFRklfSUZSX05VTUVSSUNfU0laRV84ICAgICAgIDB4MDMKKworI2RlZmluZSBFRklfSUZSX0RJU1BMQVkgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSAgIEVGSV9JRlJfRElTUExBWV9JTlRfREVDICAgICAgMHgwMAorI2RlZmluZSAgIEVGSV9JRlJfRElTUExBWV9VSU5UX0RFQyAgICAgMHgxMAorI2RlZmluZSAgIEVGSV9JRlJfRElTUExBWV9VSU5UX0hFWCAgICAgMHgyMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9PTkVfT0YgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfSUZSX1FVRVNUSU9OX0hFQURFUiAgUXVlc3Rpb247CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBGbGFnczsKKyAgTUlOTUFYU1RFUF9EQVRBICAgICAgICAgIGRhdGE7Cit9IEVGSV9JRlJfT05FX09GOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9TVFJJTkcgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfSUZSX1FVRVNUSU9OX0hFQURFUiAgUXVlc3Rpb247CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBNaW5TaXplOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgTWF4U2l6ZTsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgIEZsYWdzOworfSBFRklfSUZSX1NUUklORzsKKworI2RlZmluZSBFRklfSUZSX1NUUklOR19NVUxUSV9MSU5FICAgICAgMHgwMQorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9QQVNTV09SRCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9JRlJfUVVFU1RJT05fSEVBREVSICBRdWVzdGlvbjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgIE1pblNpemU7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICBNYXhTaXplOworfSBFRklfSUZSX1BBU1NXT1JEOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9PUkRFUkVEX0xJU1QgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfSUZSX1FVRVNUSU9OX0hFQURFUiAgUXVlc3Rpb247CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBNYXhDb250YWluZXJzOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgRmxhZ3M7Cit9IEVGSV9JRlJfT1JERVJFRF9MSVNUOworCisjZGVmaW5lIEVGSV9JRlJfVU5JUVVFX1NFVCAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVGSV9JRlJfTk9fRU1QVFlfU0VUICAgICAgICAgICAweDAyCisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX1RJTUUgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfSUZSX1FVRVNUSU9OX0hFQURFUiAgUXVlc3Rpb247CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBGbGFnczsKK30gRUZJX0lGUl9USU1FOworCisvLworLy8gQSBiaXQtbWFzayB0aGF0IGRldGVybWluZXMgd2hpY2ggdW5pcXVlIHNldHRpbmdzIGFyZSBhY3RpdmUgZm9yIHRoaXMgb3Bjb2RlLgorLy8KKyNkZWZpbmUgUUZfVElNRV9IT1VSX1NVUFBSRVNTICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUUZfVElNRV9NSU5VVEVfU1VQUFJFU1MgICAgICAgIDB4MDIKKyNkZWZpbmUgUUZfVElNRV9TRUNPTkRfU1VQUFJFU1MgICAgICAgIDB4MDQKKworI2RlZmluZSBRRl9USU1FX1NUT1JBR0UgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSAgIFFGX1RJTUVfU1RPUkFHRV9OT1JNQUwgICAgICAgMHgwMAorI2RlZmluZSAgIFFGX1RJTUVfU1RPUkFHRV9USU1FICAgICAgICAgMHgxMAorI2RlZmluZSAgIFFGX1RJTUVfU1RPUkFHRV9XQUtFVVAgICAgICAgMHgyMAorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9ESVNBQkxFX0lGIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9ESVNBQkxFX0lGOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9TVVBQUkVTU19JRiB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfU1VQUFJFU1NfSUY7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX0dSQVlfT1VUX0lGIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9HUkFZX09VVF9JRjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfSU5DT05TSVNURU5UX0lGIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgIEVycm9yOworfSBFRklfSUZSX0lOQ09OU0lTVEVOVF9JRjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfTk9fU1VCTUlUX0lGIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgIEVycm9yOworfSBFRklfSUZSX05PX1NVQk1JVF9JRjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfUkVGUkVTSCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICBSZWZyZXNoSW50ZXJ2YWw7Cit9IEVGSV9JRlJfUkVGUkVTSDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVkFSU1RPUkVfREVWSUNFIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgIERldmljZVBhdGg7Cit9IEVGSV9JRlJfVkFSU1RPUkVfREVWSUNFOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9PTkVfT0ZfT1BUSU9OIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgIE9wdGlvbjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgIEZsYWdzOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgVHlwZTsKKyAgRUZJX0lGUl9UWVBFX1ZBTFVFICAgICAgIFZhbHVlOworfSBFRklfSUZSX09ORV9PRl9PUFRJT047CisKKy8vCisvLyBUeXBlcyBvZiB0aGUgb3B0aW9uJ3MgdmFsdWUuCisvLworI2RlZmluZSBFRklfSUZSX1RZUEVfTlVNX1NJWkVfOCAgICAgICAgMHgwMAorI2RlZmluZSBFRklfSUZSX1RZUEVfTlVNX1NJWkVfMTYgICAgICAgMHgwMQorI2RlZmluZSBFRklfSUZSX1RZUEVfTlVNX1NJWkVfMzIgICAgICAgMHgwMgorI2RlZmluZSBFRklfSUZSX1RZUEVfTlVNX1NJWkVfNjQgICAgICAgMHgwMworI2RlZmluZSBFRklfSUZSX1RZUEVfQk9PTEVBTiAgICAgICAgICAgMHgwNAorI2RlZmluZSBFRklfSUZSX1RZUEVfVElNRSAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBFRklfSUZSX1RZUEVfREFURSAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBFRklfSUZSX1RZUEVfU1RSSU5HICAgICAgICAgICAgMHgwNworI2RlZmluZSBFRklfSUZSX1RZUEVfT1RIRVIgICAgICAgICAgICAgMHgwOAorCisjZGVmaW5lIEVGSV9JRlJfT1BUSU9OX0RFRkFVTFQgICAgICAgICAweDEwCisjZGVmaW5lIEVGSV9JRlJfT1BUSU9OX0RFRkFVTFRfTUZHICAgICAweDIwCisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX0dVSUQgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfR1VJRCAgICAgICAgICAgICAgICAgR3VpZDsKKyAgLy9PcHRpb25hbCBEYXRhIEZvbGxvd3MKK30gRUZJX0lGUl9HVUlEOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9EVVAgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX0RVUDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfRVFfSURfSUQgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfUVVFU1RJT05fSUQgICAgICAgICAgUXVlc3Rpb25JZDE7CisgIEVGSV9RVUVTVElPTl9JRCAgICAgICAgICBRdWVzdGlvbklkMjsKK30gRUZJX0lGUl9FUV9JRF9JRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfRVFfSURfVkFMIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX1FVRVNUSU9OX0lEICAgICAgICAgIFF1ZXN0aW9uSWQ7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICBWYWx1ZTsKK30gRUZJX0lGUl9FUV9JRF9WQUw7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX0VRX0lEX0xJU1QgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBFRklfUVVFU1RJT05fSUQgICAgICAgICAgUXVlc3Rpb25JZDsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgIExpc3RMZW5ndGg7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgICBWYWx1ZUxpc3RbMV07Cit9IEVGSV9JRlJfRVFfSURfTElTVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVUlOVDggeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBVSU5UOCBWYWx1ZTsKK30gRUZJX0lGUl9VSU5UODsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVUlOVDE2IHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgIFZhbHVlOworfSBFRklfSUZSX1VJTlQxNjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVUlOVDMyIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgIFZhbHVlOworfSBFRklfSUZSX1VJTlQzMjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVUlOVDY0IHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgVUlOVDY0IFZhbHVlOworfSBFRklfSUZSX1VJTlQ2NDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfUVVFU1RJT05fUkVGMSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9RVUVTVElPTl9JRCAgICAgICAgICBRdWVzdGlvbklkOworfSBFRklfSUZSX1FVRVNUSU9OX1JFRjE7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX1FVRVNUSU9OX1JFRjIgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX1FVRVNUSU9OX1JFRjI7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX1FVRVNUSU9OX1JFRjMgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX1FVRVNUSU9OX1JFRjM7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX1FVRVNUSU9OX1JFRjNfMiB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9TVFJJTkdfSUQgICAgICAgICAgICBEZXZpY2VQYXRoOworfSBFRklfSUZSX1FVRVNUSU9OX1JFRjNfMjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfUVVFU1RJT05fUkVGM18zIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgRUZJX1NUUklOR19JRCAgICAgICAgICAgIERldmljZVBhdGg7CisgIEVGSV9HVUlEICAgICAgICAgICAgICAgICBHdWlkOworfSBFRklfSUZSX1FVRVNUSU9OX1JFRjNfMzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfUlVMRV9SRUYgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgUnVsZUlkOworfSBFRklfSUZSX1JVTEVfUkVGOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9TVFJJTkdfUkVGMSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7CisgIEVGSV9TVFJJTkdfSUQgICAgICAgICAgICBTdHJpbmdJZDsKK30gRUZJX0lGUl9TVFJJTkdfUkVGMTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfU1RSSU5HX1JFRjIgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX1NUUklOR19SRUYyOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9USElTIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9USElTOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9UUlVFIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9UUlVFOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9GQUxTRSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfRkFMU0U7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX09ORSB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfT05FOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9PTkVTIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9PTkVTOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9aRVJPIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9aRVJPOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9VTkRFRklORUQgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX1VOREVGSU5FRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVkVSU0lPTiB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfVkVSU0lPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfTEVOR1RIIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9MRU5HVEg7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX05PVCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfTk9UOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9CSVRXSVNFX05PVCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfQklUV0lTRV9OT1Q7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX1RPX0JPT0xFQU4geworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX1RPX0JPT0xFQU47CisKKy8vCisvLyBGb3IgRUZJX0lGUl9UT19TVFJJTkcsIHdoZW4gY29udmVydGluZyBmcm9tCisvLyB1bnNpZ25lZCBpbnRlZ2VycywgdGhlc2UgZmxhZ3MgY29udHJvbCB0aGUgZm9ybWF0OgorLy8gMCA9IHVuc2lnbmVkIGRlY2ltYWwKKy8vIDEgPSBzaWduZWQgZGVjaW1hbAorLy8gMiA9IGhleGFkZWNpbWFsIChsb3dlci1jYXNlIGFscGhhKQorLy8gMyA9IGhleGFkZWNpbWFsICh1cHBlci1jYXNlIGFscGhhKQorLy8KKyNkZWZpbmUgRUZJX0lGUl9TVFJJTkdfVU5TSUdORURfREVDICAgICAgMAorI2RlZmluZSBFRklfSUZSX1NUUklOR19TSUdORURfREVDICAgICAgICAxCisjZGVmaW5lIEVGSV9JRlJfU1RSSU5HX0xPV0VSQ0FTRV9IRVggICAgIDIKKyNkZWZpbmUgRUZJX0lGUl9TVFJJTkdfVVBQRVJDQVNFX0hFWCAgICAgMworLy8KKy8vIFdoZW4gY29udmVydGluZyBmcm9tIGEgYnVmZmVyLCB0aGVzZSBmbGFncyBjb250cm9sIHRoZSBmb3JtYXQ6CisvLyAwID0gQVNDSUkKKy8vIDggPSBVbmljb2RlCisvLworI2RlZmluZSBFRklfSUZSX1NUUklOR19BU0NJSSAgICAgICAgICAgICAwCisjZGVmaW5lIEVGSV9JRlJfU1RSSU5HX1VOSUNPREUgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVE9fU1RSSU5HIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgIEZvcm1hdDsKK30gRUZJX0lGUl9UT19TVFJJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX1RPX1VJTlQgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX1RPX1VJTlQ7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX1RPX1VQUEVSIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9UT19VUFBFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfVE9fTE9XRVIgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX1RPX0xPV0VSOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9BREQgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX0FERDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfQU5EIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9BTkQ7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX0JJVFdJU0VfQU5EIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9CSVRXSVNFX0FORDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfQklUV0lTRV9PUiB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfQklUV0lTRV9PUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfQ0FURU5BVEUgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX0NBVEVOQVRFOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9ESVZJREUgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX0RJVklERTsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfRVFVQUwgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX0VRVUFMOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9HUkVBVEVSX0VRVUFMIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9HUkVBVEVSX0VRVUFMOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9HUkVBVEVSX1RIQU4geworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX0dSRUFURVJfVEhBTjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfTEVTU19FUVVBTCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfTEVTU19FUVVBTDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfTEVTU19USEFOIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9MRVNTX1RIQU47CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX01BVENIIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9NQVRDSDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfTVVMVElQTFkgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX01VTFRJUExZOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9NT0RVTE8geworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX01PRFVMTzsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfTk9UX0VRVUFMIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9OT1RfRVFVQUw7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX09SIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9PUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfU0hJRlRfTEVGVCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfU0hJRlRfTEVGVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VGSV9JRlJfU0hJRlRfUklHSFQgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworfSBFRklfSUZSX1NISUZUX1JJR0hUOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9TVUJUUkFDVCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfU1VCVFJBQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX0NPTkRJVElPTkFMIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKK30gRUZJX0lGUl9DT05ESVRJT05BTDsKKworLy8KKy8vIEZsYWdzIGdvdmVybmluZyB0aGUgbWF0Y2hpbmcgY3JpdGVyaWEgb2YgRUZJX0lGUl9GSU5ECisvLworI2RlZmluZSBFRklfSUZSX0ZGX0NBU0VfU0VOU0lUSVZFICAgIDB4MDAKKyNkZWZpbmUgRUZJX0lGUl9GRl9DQVNFX0lOU0VOU0lUSVZFICAweDAxCisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX0ZJTkQgeworICBFRklfSUZSX09QX0hFQURFUiAgICAgICAgSGVhZGVyOworICBVSU5UOCAgICAgICAgICAgICAgICAgICAgRm9ybWF0OworfSBFRklfSUZSX0ZJTkQ7CisKK3R5cGVkZWYgc3RydWN0IF9FRklfSUZSX01JRCB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfTUlEOworCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9UT0tFTiB7CisgIEVGSV9JRlJfT1BfSEVBREVSICAgICAgICBIZWFkZXI7Cit9IEVGSV9JRlJfVE9LRU47CisKKy8vCisvLyBGbGFncyBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gZmluZCB0aGUgZmlyc3QgbWF0Y2hpbmcgc3RyaW5nCisvLyBvciB0aGUgZmlyc3Qgbm9uLW1hdGNoaW5nIHN0cmluZy4KKy8vCisjZGVmaW5lIEVGSV9JRlJfRkxBR1NfRklSU1RfTUFUQ0hJTkcgICAgIDB4MDAKKyNkZWZpbmUgRUZJX0lGUl9GTEFHU19GSVJTVF9OT05fTUFUQ0hJTkcgMHgwMQorCit0eXBlZGVmIHN0cnVjdCBfRUZJX0lGUl9TUEFOIHsKKyAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgIEhlYWRlcjsKKyAgVUlOVDggICAgICAgICAgICAgICAgICAgIEZsYWdzOworfSBFRklfSUZSX1NQQU47CisKKy8vCisvLyBEZWZpbml0aW9ucyBmb3IgS2V5Ym9hcmQgUGFja2FnZQorLy8gU2VjdGlvbiAyNy4zLjkKKy8vIFJlbGVhdGVkIGRlZmluaXRpb25zIGFyZSBpbiBTZWN0aW9uIG9mIEVGSV9ISUlfREFUQUJBU0VfUFJPVE9DT0wKKy8vCisKK3R5cGVkZWYgZW51bSB7CisgIEVmaUtleUxDdHJsLAorICBFZmlLZXlBMCwKKyAgRWZpS2V5TEFsdCwKKyAgRWZpS2V5U3BhY2VCYXIsCisgIEVmaUtleUEyLAorICBFZmlLZXlBMywKKyAgRWZpS2V5QTQsCisgIEVmaUtleVJDdHJsLAorICBFZmlLZXlMZWZ0QXJyb3csCisgIEVmaUtleURvd25BcnJvdywKKyAgRWZpS2V5UmlnaHRBcnJvdywKKyAgRWZpS2V5WmVybywKKyAgRWZpS2V5UGVyaW9kLAorICBFZmlLZXlFbnRlciwKKyAgRWZpS2V5TFNoaWZ0LAorICBFZmlLZXlCMCwKKyAgRWZpS2V5QjEsCisgIEVmaUtleUIyLAorICBFZmlLZXlCMywKKyAgRWZpS2V5QjQsCisgIEVmaUtleUI1LAorICBFZmlLZXlCNiwKKyAgRWZpS2V5QjcsCisgIEVmaUtleUI4LAorICBFZmlLZXlCOSwKKyAgRWZpS2V5QjEwLAorICBFZmlLZXlSU2hpZnQsCisgIEVmaUtleVVwQXJyb3csCisgIEVmaUtleU9uZSwKKyAgRWZpS2V5VHdvLAorICBFZmlLZXlUaHJlZSwKKyAgRWZpS2V5Q2Fwc0xvY2ssCisgIEVmaUtleUMxLAorICBFZmlLZXlDMiwKKyAgRWZpS2V5QzMsCisgIEVmaUtleUM0LAorICBFZmlLZXlDNSwKKyAgRWZpS2V5QzYsCisgIEVmaUtleUM3LAorICBFZmlLZXlDOCwKKyAgRWZpS2V5QzksCisgIEVmaUtleUMxMCwKKyAgRWZpS2V5QzExLAorICBFZmlLZXlDMTIsCisgIEVmaUtleUZvdXIsCisgIEVmaUtleUZpdmUsCisgIEVmaUtleVNpeCwKKyAgRWZpS2V5UGx1cywKKyAgRWZpS2V5VGFiLAorICBFZmlLZXlEMSwKKyAgRWZpS2V5RDIsCisgIEVmaUtleUQzLAorICBFZmlLZXlENCwKKyAgRWZpS2V5RDUsCisgIEVmaUtleUQ2LAorICBFZmlLZXlENywKKyAgRWZpS2V5RDgsCisgIEVmaUtleUQ5LAorICBFZmlLZXlEMTAsCisgIEVmaUtleUQxMSwKKyAgRWZpS2V5RDEyLAorICBFZmlLZXlEMTMsCisgIEVmaUtleURlbCwKKyAgRWZpS2V5RW5kLAorICBFZmlLZXlQZ0RuLAorICBFZmlLZXlTZXZlbiwKKyAgRWZpS2V5RWlnaHQsCisgIEVmaUtleU5pbmUsCisgIEVmaUtleUUwLAorICBFZmlLZXlFMSwKKyAgRWZpS2V5RTIsCisgIEVmaUtleUUzLAorICBFZmlLZXlFNCwKKyAgRWZpS2V5RTUsCisgIEVmaUtleUU2LAorICBFZmlLZXlFNywKKyAgRWZpS2V5RTgsCisgIEVmaUtleUU5LAorICBFZmlLZXlFMTAsCisgIEVmaUtleUUxMSwKKyAgRWZpS2V5RTEyLAorICBFZmlLZXlCYWNrU3BhY2UsCisgIEVmaUtleUlucywKKyAgRWZpS2V5SG9tZSwKKyAgRWZpS2V5UGdVcCwKKyAgRWZpS2V5TkxjaywKKyAgRWZpS2V5U2xhc2gsCisgIEVmaUtleUFzdGVyaXNrLAorICBFZmlLZXlNaW51cywKKyAgRWZpS2V5RXNjLAorICBFZmlLZXlGMSwKKyAgRWZpS2V5RjIsCisgIEVmaUtleUYzLAorICBFZmlLZXlGNCwKKyAgRWZpS2V5RjUsCisgIEVmaUtleUY2LAorICBFZmlLZXlGNywKKyAgRWZpS2V5RjgsCisgIEVmaUtleUY5LAorICBFZmlLZXlGMTAsCisgIEVmaUtleUYxMSwKKyAgRWZpS2V5RjEyLAorICBFZmlLZXlQcmludCwKKyAgRWZpS2V5U0xjaywKKyAgRWZpS2V5UGF1c2UKK30gRUZJX0tFWTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBFRklfS0VZICAgICAgICAgICAgICAgICBLZXk7CisgIENIQVIxNiAgICAgICAgICAgICAgICAgIFVuaWNvZGU7CisgIENIQVIxNiAgICAgICAgICAgICAgICAgIFNoaWZ0ZWRVbmljb2RlOworICBDSEFSMTYgICAgICAgICAgICAgICAgICBBbHRHclVuaWNvZGU7CisgIENIQVIxNiAgICAgICAgICAgICAgICAgIFNoaWZ0ZWRBbHRHclVuaWNvZGU7CisgIFVJTlQxNiAgICAgICAgICAgICAgICAgIE1vZGlmaWVyOworICBVSU5UMTYgICAgICAgICAgICAgICAgICBBZmZlY3RlZEF0dHJpYnV0ZTsKK30gRUZJX0tFWV9ERVNDUklQVE9SOworCisvLy8KKy8vLyBBIGtleSB3aGljaCBpcyBhZmZlY3RlZCBieSBhbGwgdGhlIHN0YW5kYXJkIHNoaWZ0IG1vZGlmaWVycy4KKy8vLyBNb3N0IGtleXMgd291bGQgYmUgZXhwZWN0ZWQgdG8gaGF2ZSB0aGlzIGJpdCBhY3RpdmUuCisvLy8KKyNkZWZpbmUgRUZJX0FGRkVDVEVEX0JZX1NUQU5EQVJEX1NISUZUICAgICAgIDB4MDAwMQorCisvLy8KKy8vLyBUaGlzIGtleSBpcyBhZmZlY3RlZCBieSB0aGUgY2FwcyBsb2NrIHNvIHRoYXQgaWYgYSBrZXlib2FyZCBkcml2ZXIKKy8vLyB3b3VsZCBuZWVkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGEga2V5IHdoaWNoIGhhZCBhICIxIiBkZWZpbmVkCisvLy8gdmVyc3VzIGEgImEiIGNoYXJhY3Rlci4gIEhhdmluZyB0aGlzIGJpdCB0dXJuZWQgb24gd291bGQgdGVsbAorLy8vIHRoZSBrZXlib2FyZCBkcml2ZXIgdG8gdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGlmdGVkIHN0YXRlIG9yIG5vdC4KKy8vLworI2RlZmluZSBFRklfQUZGRUNURURfQllfQ0FQU19MT0NLICAgICAgICAgICAgMHgwMDAyCisKKy8vLworLy8vIFNpbWlsYXIgdG8gdGhlIGNhc2Ugb2YgQ0FQUyBsb2NrLCBpZiB0aGlzIGJpdCBpcyBhY3RpdmUsIHRoZSBrZXkKKy8vLyBpcyBhZmZlY3RlZCBieSB0aGUgbnVtIGxvY2sgYmVpbmcgdHVybmVkIG9uLgorLy8vCisjZGVmaW5lIEVGSV9BRkZFQ1RFRF9CWV9OVU1fTE9DSyAgICAgICAgICAgICAweDAwMDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMTYgICAgICAgICAgICAgICAgICBMYXlvdXRMZW5ndGg7CisgIEVGSV9HVUlEICAgICAgICAgICAgICAgIEd1aWQ7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgIExheW91dERlc2NyaXB0b3JTdHJpbmdPZmZzZXQ7CisgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JDb3VudDsKKyAgLy8gRUZJX0tFWV9ERVNDUklQVE9SICAgIERlc2NyaXB0b3JzW107Cit9IEVGSV9ISUlfS0VZQk9BUkRfTEFZT1VUOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEVGSV9ISUlfUEFDS0FHRV9IRUFERVIgIEhlYWRlcjsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgICAgTGF5b3V0Q291bnQ7CisgIC8vIEVGSV9ISUlfS0VZQk9BUkRfTEFZT1VUIExheW91dFtdOworfSBFRklfSElJX0tFWUJPQVJEX1BBQ0tBR0VfSERSOworCisvLworLy8gTW9kaWZpZXIgdmFsdWVzCisvLworI2RlZmluZSBFRklfTlVMTF9NT0RJRklFUiAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgRUZJX0xFRlRfQ09OVFJPTF9NT0RJRklFUiAgICAgICAgMHgwMDAxCisjZGVmaW5lIEVGSV9SSUdIVF9DT05UUk9MX01PRElGSUVSICAgICAgIDB4MDAwMgorI2RlZmluZSBFRklfTEVGVF9BTFRfTU9ESUZJRVIgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgRUZJX1JJR0hUX0FMVF9NT0RJRklFUiAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEVGSV9BTFRfR1JfTU9ESUZJRVIgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBFRklfSU5TRVJUX01PRElGSUVSICAgICAgICAgICAgICAweDAwMDYKKyNkZWZpbmUgRUZJX0RFTEVURV9NT0RJRklFUiAgICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIEVGSV9QQUdFX0RPV05fTU9ESUZJRVIgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBFRklfUEFHRV9VUF9NT0RJRklFUiAgICAgICAgICAgICAweDAwMDkKKyNkZWZpbmUgRUZJX0hPTUVfTU9ESUZJRVIgICAgICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIEVGSV9FTkRfTU9ESUZJRVIgICAgICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBFRklfTEVGVF9TSElGVF9NT0RJRklFUiAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgRUZJX1JJR0hUX1NISUZUX01PRElGSUVSICAgICAgICAgMHgwMDBECisjZGVmaW5lIEVGSV9DQVBTX0xPQ0tfTU9ESUZJRVIgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBFRklfTlVNX0xPQ0tfTU9ESUZJRVIgICAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgRUZJX0xFRlRfQVJST1dfTU9ESUZJRVIgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEVGSV9SSUdIVF9BUlJPV19NT0RJRklFUiAgICAgICAgIDB4MDAxMQorI2RlZmluZSBFRklfRE9XTl9BUlJPV19NT0RJRklFUiAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgRUZJX1VQX0FSUk9XX01PRElGSUVSICAgICAgICAgICAgMHgwMDEzCisjZGVmaW5lIEVGSV9OU19LRVlfTU9ESUZJRVIgICAgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBFRklfTlNfS0VZX0RFUEVOREVOQ1lfTU9ESUZJRVIgICAweDAwMTUKKyNkZWZpbmUgRUZJX0ZVTkNUSU9OX0tFWV9PTkVfTU9ESUZJRVIgICAgMHgwMDE2CisjZGVmaW5lIEVGSV9GVU5DVElPTl9LRVlfVFdPX01PRElGSUVSICAgIDB4MDAxNworI2RlZmluZSBFRklfRlVOQ1RJT05fS0VZX1RIUkVFX01PRElGSUVSICAweDAwMTgKKyNkZWZpbmUgRUZJX0ZVTkNUSU9OX0tFWV9GT1VSX01PRElGSUVSICAgMHgwMDE5CisjZGVmaW5lIEVGSV9GVU5DVElPTl9LRVlfRklWRV9NT0RJRklFUiAgIDB4MDAxQQorI2RlZmluZSBFRklfRlVOQ1RJT05fS0VZX1NJWF9NT0RJRklFUiAgICAweDAwMUIKKyNkZWZpbmUgRUZJX0ZVTkNUSU9OX0tFWV9TRVZFTl9NT0RJRklFUiAgMHgwMDFDCisjZGVmaW5lIEVGSV9GVU5DVElPTl9LRVlfRUlHSFRfTU9ESUZJRVIgIDB4MDAxRAorI2RlZmluZSBFRklfRlVOQ1RJT05fS0VZX05JTkVfTU9ESUZJRVIgICAweDAwMUUKKyNkZWZpbmUgRUZJX0ZVTkNUSU9OX0tFWV9URU5fTU9ESUZJRVIgICAgMHgwMDFGCisjZGVmaW5lIEVGSV9GVU5DVElPTl9LRVlfRUxFVkVOX01PRElGSUVSIDB4MDAyMAorI2RlZmluZSBFRklfRlVOQ1RJT05fS0VZX1RXRUxWRV9NT0RJRklFUiAweDAwMjEKKworLy8KKy8vIEtleXMgdGhhdCBoYXZlIG11bHRpcGxlIGNvbnRyb2wgZnVuY3Rpb25zIGJhc2VkIG9uIG1vZGlmaWVyCisvLyBzZXR0aW5ncyBhcmUgaGFuZGxlZCBpbiB0aGUga2V5Ym9hcmQgZHJpdmVyIGltcGxlbWVudGF0aW9uLgorLy8gRm9yIGluc3RhbmNlIFBSSU5UX0tFWSBtaWdodCBoYXZlIGEgbW9kaWZpZXIgaGVsZCBkb3duIGFuZAorLy8gaXMgc3RpbGwgYSBub25wcmludGluZyBjaGFyYWN0ZXIsIGJ1dCBtaWdodCBoYXZlIGFuIGFsdGVybmF0ZQorLy8gY29udHJvbCBmdW5jdGlvbiBsaWtlIFNZU1JFUVVFU1QKKy8vCisjZGVmaW5lIEVGSV9QUklOVF9NT0RJRklFUiAgICAgICAgICAgICAgIDB4MDAyMgorI2RlZmluZSBFRklfU1lTX1JFUVVFU1RfTU9ESUZJRVIgICAgICAgICAweDAwMjMKKyNkZWZpbmUgRUZJX1NDUk9MTF9MT0NLX01PRElGSUVSICAgICAgICAgMHgwMDI0CisjZGVmaW5lIEVGSV9QQVVTRV9NT0RJRklFUiAgICAgICAgICAgICAgIDB4MDAyNQorI2RlZmluZSBFRklfQlJFQUtfTU9ESUZJRVIgICAgICAgICAgICAgICAweDAwMjYKKworI2RlZmluZSBFRklfTEVGVF9MT0dPX01PRElGSUVSICAgICAgICAgICAweDAwMjcKKyNkZWZpbmUgRUZJX1JJR0hUX0xPR09fTU9ESUZJRVIgICAgICAgICAgMHgwMDI4CisjZGVmaW5lIEVGSV9NRU5VX01PRElGSUVSICAgICAgICAgICAgICAgIDB4MDAyOQorCisjcHJhZ21hIHBhY2soKQorCisKKworLy8vCisvLy8gUmVmZXJlbmNlcyB0byBzdHJpbmcgdG9rZW5zIG11c3QgdXNlIHRoaXMgbWFjcm8gdG8gZW5hYmxlIHNjYW5uaW5nIGZvcgorLy8vIHRva2VuIHVzYWdlcy4KKy8vLworLy8vCisvLy8gU1RSSU5HX1RPS0VOIGlzIG5vdCBkZWZpbmVkIGluIFVFRkkgc3BlY2lmaWNhdGlvbi4gQnV0IGl0IGlzIHBsYWNlZAorLy8vIGhlcmUgZm9yIHRoZSBlYXN5IGFjY2VzcyBieSBDIGZpbGVzIGFuZCBWRlIgc291cmNlIGZpbGVzLgorLy8vCisjZGVmaW5lIFNUUklOR19UT0tFTih0KSB0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpL1VlZmlNdWx0aVBoYXNlLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1VlZmkvVWVmaU11bHRpUGhhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDFhZjVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpL1VlZmlNdWx0aVBoYXNlLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qKiBAZmlsZQorICBUaGlzIGluY2x1ZGVzIHNvbWUgZGVmaW5pdGlvbnMgaW50cm9kdWNlZCBpbiBVRUZJIHRoYXQgd2lsbCBiZSB1c2VkIGluIGJvdGggUEVJIGFuZCBEWEUgcGhhc2VzLgorCisgIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQKKyAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCisgIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELgorCisqKi8KKworI2lmbmRlZiBfX1VFRklfTVVMVElQSEFTRV9IX18KKyNkZWZpbmUgX19VRUZJX01VTFRJUEhBU0VfSF9fCisKKyNpbmNsdWRlIDxncHhlL2VmaS9Qcm9jZXNzb3JCaW5kLmg+CisKKy8vLworLy8vIEVudW1lcmF0aW9uIG9mIG1lbW9yeSB0eXBlcyBpbnRyb2R1Y2VkIGluIFVFRkkuCisvLy8KK3R5cGVkZWYgZW51bSB7CisgIEVmaVJlc2VydmVkTWVtb3J5VHlwZSwKKyAgRWZpTG9hZGVyQ29kZSwKKyAgRWZpTG9hZGVyRGF0YSwKKyAgRWZpQm9vdFNlcnZpY2VzQ29kZSwKKyAgRWZpQm9vdFNlcnZpY2VzRGF0YSwKKyAgRWZpUnVudGltZVNlcnZpY2VzQ29kZSwKKyAgRWZpUnVudGltZVNlcnZpY2VzRGF0YSwKKyAgRWZpQ29udmVudGlvbmFsTWVtb3J5LAorICBFZmlVbnVzYWJsZU1lbW9yeSwKKyAgRWZpQUNQSVJlY2xhaW1NZW1vcnksCisgIEVmaUFDUElNZW1vcnlOVlMsCisgIEVmaU1lbW9yeU1hcHBlZElPLAorICBFZmlNZW1vcnlNYXBwZWRJT1BvcnRTcGFjZSwKKyAgRWZpUGFsQ29kZSwKKyAgRWZpTWF4TWVtb3J5VHlwZQorfSBFRklfTUVNT1JZX1RZUEU7CisKKworLy8vCisvLy8gRGF0YSBzdHJ1Y3R1cmUgdGhhdCBwcmVjZWRlcyBhbGwgb2YgdGhlIHN0YW5kYXJkIEVGSSB0YWJsZSB0eXBlcy4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UNjQgIFNpZ25hdHVyZTsKKyAgVUlOVDMyICBSZXZpc2lvbjsKKyAgVUlOVDMyICBIZWFkZXJTaXplOworICBVSU5UMzIgIENSQzMyOworICBVSU5UMzIgIFJlc2VydmVkOworfSBFRklfVEFCTEVfSEVBREVSOworCisvLy8KKy8vLyBBdHRyaWJ1dGVzIG9mIHZhcmlhYmxlLgorLy8vCisjZGVmaW5lIEVGSV9WQVJJQUJMRV9OT05fVk9MQVRJTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUZJX1ZBUklBQkxFX0JPT1RTRVJWSUNFX0FDQ0VTUyAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFRklfVkFSSUFCTEVfUlVOVElNRV9BQ0NFU1MgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVGSV9WQVJJQUJMRV9IQVJEV0FSRV9FUlJPUl9SRUNPUkQgICAgICAgIDB4MDAwMDAwMDgKKworLy8vCisvLy8gVGhpcyBhdHRyaWJ1dGUgaXMgaWRlbnRpZmllZCBieSB0aGUgbW5lbW9uaWMgJ0hSJworLy8vIGVsc2V3aGVyZSBpbiB0aGlzIHNwZWNpZmljYXRpb24uCisvLy8KKyNkZWZpbmUgRUZJX1ZBUklBQkxFX0FVVEhFTlRJQ0FURURfV1JJVEVfQUNDRVNTICAgMHgwMDAwMDAxMAorCisvLworLy8gX1dJTl9DRVJUSUZJQ0FURS53Q2VydGlmaWNhdGVUeXBlCisvLworI2RlZmluZSBXSU5fQ0VSVF9UWVBFX0VGSV9QS0NTMTE1ICAgMHgwRUYwCisjZGVmaW5lIFdJTl9DRVJUX1RZUEVfRUZJX0dVSUQgICAgICAweDBFRjEKKworLy8vCisvLy8gVGhlIFdJTl9DRVJUSUZJQ0FURSBzdHJ1Y3R1cmUgaXMgcGFydCBvZiB0aGUgUEUvQ09GRiBzcGVjaWZpY2F0aW9uLgorLy8vCit0eXBlZGVmIHN0cnVjdCBfV0lOX0NFUlRJRklDQVRFIHsKKyAgLy8vCisgIC8vLyBUaGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgY2VydGlmaWNhdGUsCisgIC8vLyBpbmNsdWRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgaGVhZGVyLCBpbiBieXRlcy4KKyAgLy8vCisgIFVJTlQzMiAgZHdMZW5ndGg7CisgIC8vLworICAvLy8gVGhlIHJldmlzaW9uIGxldmVsIG9mIHRoZSBXSU5fQ0VSVElGSUNBVEUKKyAgLy8vIHN0cnVjdHVyZS4gVGhlIGN1cnJlbnQgcmV2aXNpb24gbGV2ZWwgaXMgMHgwMjAwLgorICAvLy8KKyAgVUlOVDE2ICB3UmV2aXNpb247CisgIC8vLworICAvLy8gVGhlIGNlcnRpZmljYXRlIHR5cGUuIFNlZSBXSU5fQ0VSVF9UWVBFX3h4eCBmb3IgdGhlIFVFRkkKKyAgLy8vIGNlcnRpZmljYXRlIHR5cGVzLiBUaGUgVUVGSSBzcGVjaWZpY2F0aW9uIHJlc2VydmVzIHRoZSByYW5nZSBvZgorICAvLy8gY2VydGlmaWNhdGUgdHlwZSB2YWx1ZXMgZnJvbSAweDBFRjAgdG8gMHgwRUZGLgorICAvLy8KKyAgVUlOVDE2ICB3Q2VydGlmaWNhdGVUeXBlOworICAvLy8KKyAgLy8vIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGFjdHVhbCBjZXJ0aWZpY2F0ZS4gVGhlIGZvcm1hdCBvZgorICAvLy8gdGhlIGNlcnRpZmljYXRlIGRlcGVuZHMgb24gd0NlcnRpZmljYXRlVHlwZS4KKyAgLy8vCisgIC8vLyBVSU5UOCBiQ2VydGlmaWNhdGVbQU5ZU0laRV9BUlJBWV07CisgIC8vLworfSBXSU5fQ0VSVElGSUNBVEU7CisKKy8vLworLy8vIFdJTl9DRVJUSUZJQ0FURV9VRUZJX0dVSUQuQ2VydFR5cGUKKy8vLworI2RlZmluZSBFRklfQ0VSVF9UWVBFX1JTQTIwNDhfU0hBMjU2X0dVSUQgXAorICB7MHhhNzcxNzQxNCwgMHhjNjE2LCAweDQ5NzcsIHsweDk0LCAweDIwLCAweDg0LCAweDQ3LCAweDEyLCAweGE3LCAweDM1LCAweGJmIH0gfQorCisvLworLy8gV0lOX0NFUlRJRklDQVRFX1VFRklfR1VJRC5DZXJ0RGF0YQorLy8KK3R5cGVkZWYgc3RydWN0IF9FRklfQ0VSVF9CTE9DS19SU0FfMjA0OF9TSEEyNTYgeworICBVSU5UMzIgIEhhc2hUeXBlOworICBVSU5UOCAgIFB1YmxpY0tleVsyNTZdOworICBVSU5UOCAgIFNpZ25hdHVyZVsyNTZdOworfSBFRklfQ0VSVF9CTE9DS19SU0FfMjA0OF9TSEEyNTY7CisKKworLy8vCisvLy8gQ2VydGlmaWNhdGUgd2hpY2ggZW5jYXBzdWxhdGVzIGEgR1VJRC1zcGVjaWZpYyBkaWdpdGFsIHNpZ25hdHVyZQorLy8vCit0eXBlZGVmIHN0cnVjdCBfV0lOX0NFUlRJRklDQVRFX1VFRklfR1VJRCB7CisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgc3RhbmRhcmQgV0lOX0NFUlRJRklDQVRFIGhlYWRlciwgd2hlcmUKKyAgLy8vIHdDZXJ0aWZpY2F0ZVR5cGUgaXMgc2V0IHRvIFdJTl9DRVJUX1RZUEVfVUVGSV9HVUlELgorICAvLy8KKyAgV0lOX0NFUlRJRklDQVRFICAgSGRyOworICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIHVuaXF1ZSBpZCB3aGljaCBkZXRlcm1pbmVzIHRoZQorICAvLy8gZm9ybWF0IG9mIHRoZSBDZXJ0RGF0YS4gSW4gdGhpcyBjYXNlLCB0aGUKKyAgLy8vIHZhbHVlIGlzIEVGSV9DRVJUX1RZUEVfUlNBMjA0OF9TSEEyNTZfR1VJRC4KKyAgLy8vCisgIEVGSV9HVUlEICAgICAgICAgIENlcnRUeXBlOworICAvLy8KKyAgLy8vIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGNlcnRpZmljYXRlIGRhdGEuIFRoZSBmb3JtYXQgb2YKKyAgLy8vIHRoZSBkYXRhIGlzIGRldGVybWluZWQgYnkgdGhlIENlcnRUeXBlLiBJbiB0aGlzIGNhc2UgdGhlIHZhbHVlIGlzCisgIC8vLyBFRklfQ0VSVF9CTE9DS19SU0FfMjA0OF9TSEEyNTYuCisgIC8vLworICAvLy8gVUlOVDggICAgICAgICAgICBDZXJ0RGF0YVtBTllTSVpFX0FSUkFZXTsKKyAgLy8vCit9IFdJTl9DRVJUSUZJQ0FURV9VRUZJX0dVSUQ7CisKKworLy8vCisvLy8gQ2VydGlmaWNhdGUgd2hpY2ggZW5jYXBzdWxhdGVzIHRoZSBSU0FTU0FfUEtDUzEtdjFfNSBkaWdpdGFsIHNpZ25hdHVyZS4KKy8vLworLy8vIFRoZSBXSU5fQ0VSVElGSUNBVEVfVUVGSV9QS0NTMV8xNSBzdHJ1Y3R1cmUgaXMgZGVyaXZlZCBmcm9tCisvLy8gV0lOX0NFUlRJRklDQVRFIGFuZCBlbmNhcHN1bGF0ZSB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvCisvLy8gaW1wbGVtZW50IHRoZSBSU0FTU0EtUEtDUzEtdjFfNSBkaWdpdGFsIHNpZ25hdHVyZSBhbGdvcml0aG0gYXMKKy8vLyBzcGVjaWZpZWQgaW4gUkZDMjQzNy4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgX1dJTl9DRVJUSUZJQ0FURV9FRklfUEtDUzFfMTUgeworICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIHN0YW5kYXJkIFdJTl9DRVJUSUZJQ0FURSBoZWFkZXIsIHdoZXJlCisgIC8vLyB3Q2VydGlmaWNhdGVUeXBlIGlzIHNldCB0byBXSU5fQ0VSVF9UWVBFX1VFRklfUEtDUzFfMTUuCisgIC8vLworICBXSU5fQ0VSVElGSUNBVEUgSGRyOworICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHdoaWNoIHdhcyBwZXJmb3JtZWQgb24gdGhlCisgIC8vLyBVRUZJIGV4ZWN1dGFibGUgd2hlbiBjcmVhdGluZyB0aGUgZGlnaXRhbCBzaWduYXR1cmUuCisgIC8vLworICBFRklfR1VJRCAgICAgICAgSGFzaEFsZ29yaXRobTsKKyAgLy8vCisgIC8vLyBUaGUgZm9sbG93aW5nIGlzIHRoZSBhY3R1YWwgZGlnaXRhbCBzaWduYXR1cmUuIFRoZQorICAvLy8gc2l6ZSBvZiB0aGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGtleQorICAvLy8gKDEwMjQtYml0IGtleSBpcyAxMjggYnl0ZXMpIGFuZCBjYW4gYmUgZGV0ZXJtaW5lZCBieQorICAvLy8gc3VidHJhY3RpbmcgdGhlIGxlbmd0aCBvZiB0aGUgb3RoZXIgcGFydHMgb2YgdGhpcyBoZWFkZXIKKyAgLy8vIGZyb20gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgY2VydGlmaWNhdGUgYXMgZm91bmQgaW4KKyAgLy8vIEhkci5kd0xlbmd0aC4KKyAgLy8vCisgIC8vLyBVSU5UOCBTaWduYXR1cmVbQU5ZU0laRV9BUlJBWV07CisgIC8vLworfSBXSU5fQ0VSVElGSUNBVEVfRUZJX1BLQ1MxXzE1OworCisKKworLy8vCisvLy8gQXV0aEluZm8gaXMgYSBXSU5fQ0VSVElGSUNBVEUgdXNpbmcgdGhlIHdDZXJ0aWZpY2F0ZVR5cGUKKy8vLyBXSU5fQ0VSVElGSUNBVEVfVUVGSV9HVUlEIGFuZCB0aGUgQ2VydFR5cGUKKy8vLyBFRklfQ0VSVF9UWVBFX1JTQTIwNDhfU0hBMjU2LiBJZiB0aGUgYXR0cmlidXRlIHNwZWNpZmllcworLy8vIGF1dGhlbnRpY2F0ZWQgYWNjZXNzLCB0aGVuIHRoZSBEYXRhIGJ1ZmZlciBzaG91bGQgYmVnaW4gd2l0aCBhbgorLy8vIGF1dGhlbnRpY2F0aW9uIGRlc2NyaXB0b3IgcHJpb3IgdG8gdGhlIGRhdGEgcGF5bG9hZCBhbmQgRGF0YVNpemUKKy8vLyBzaG91bGQgcmVmbGVjdCB0aGUgdGhlIGRhdGEuYW5kIGRlc2NyaXB0b3Igc2l6ZS4gVGhlIGNhbGxlcgorLy8vIHNoYWxsIGRpZ2VzdCB0aGUgTW9ub3RvbmljIENvdW50IHZhbHVlIGFuZCB0aGUgYXNzb2NpYXRlZCBkYXRhCisvLy8gZm9yIHRoZSB2YXJpYWJsZSB1cGRhdGUgdXNpbmcgdGhlIFNIQS0yNTYgMS13YXkgaGFzaCBhbGdvcml0aG0uCisvLy8gVGhlIGVuc3VpbmcgdGhlIDMyLWJ5dGUgZGlnZXN0IHdpbGwgYmUgc2lnbmVkIHVzaW5nIHRoZSBwcml2YXRlCisvLy8ga2V5IGFzc29jaWF0ZWQgdy8gdGhlIHB1YmxpYy9wcml2YXRlIDIwNDgtYml0IFJTQSBrZXktcGFpci4gVGhlCisvLy8gV0lOX0NFUlRJRklDQVRFIHNoYWxsIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiB0aGUKKy8vLyBWYXJpYWJsZSBkYXRhICpEYXRhLiBJbiBhZGRpdGlvbiwgdGhlIHNpZ25hdHVyZSB3aWxsIGFsc28KKy8vLyBpbmNsdWRlIHRoZSBNb25vdG9uaWNDb3VudCB2YWx1ZSB0byBndWFyZCBhZ2FpbnN0IHJlcGxheSBhdHRhY2tzCisvLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8vCisgIC8vLyBJbmNsdWRlZCBpbiB0aGUgc2lnbmF0dXJlIG9mCisgIC8vLyBBdXRoSW5mby5Vc2VkIHRvIGVuc3VyZSBmcmVzaG5lc3Mvbm8KKyAgLy8vIHJlcGxheS4gSW5jcmVtZW50ZWQgZHVyaW5nIGVhY2gKKyAgLy8vICJXcml0ZSIgYWNjZXNzLgorICAvLy8KKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgIE1vbm90b25pY0NvdW50OworICAvLy8KKyAgLy8vIFByb3ZpZGVzIHRoZSBhdXRob3JpemF0aW9uIGZvciB0aGUgdmFyaWFibGUKKyAgLy8vIGFjY2Vzcy4gSXQgaXMgYSBzaWduYXR1cmUgYWNyb3NzIHRoZQorICAvLy8gdmFyaWFibGUgZGF0YSBhbmQgdGhlICBNb25vdG9uaWMgQ291bnQKKyAgLy8vIHZhbHVlLiBDYWxsZXIgdXNlcyBQcml2YXRlIGtleSB0aGF0IGlzCisgIC8vLyBhc3NvY2lhdGVkIHdpdGggYSBwdWJsaWMga2V5IHRoYXQgaGFzIGJlZW4KKyAgLy8vIHByb3Zpc2lvbmVkIHZpYSB0aGUga2V5IGV4Y2hhbmdlLgorICAvLy8KKyAgV0lOX0NFUlRJRklDQVRFX1VFRklfR1VJRCAgIEF1dGhJbmZvOworfSBFRklfVkFSSUFCTEVfQVVUSEVOVElDQVRJT047CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1VlZmkvVWVmaVB4ZS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpL1VlZmlQeGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhhYjQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpL1VlZmlQeGUuaApAQCAtMCwwICsxLDE3NTYgQEAKKy8qKiBAZmlsZQorICBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgUFhFIHR5cGUgZGVmaW5pdGlvbnMsCisgIHN0cnVjdHVyZSBwcm90b3R5cGVzLCBnbG9iYWwgdmFyaWFibGVzIGFuZCBjb25zdGFudHMgdGhhdAorICBhcmUgbmVlZGVkIGZvciBwb3J0aW5nIFBYRSB0byBFRkkuCisKKyAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyAgQHBhciBSZXZpc2lvbiBSZWZlcmVuY2U6CisgIDMyLzY0LWJpdCBQWEUgc3BlY2lmaWNhdGlvbjoKKyAgYWxwaGEtNCwgOTktRGVjLTE3CisKKyoqLworCisjaWZuZGVmIF9fRUZJX1BYRV9IX18KKyNkZWZpbmUgX19FRklfUFhFX0hfXworCisjcHJhZ21hIHBhY2soMSkKKworI2RlZmluZSBQWEVfQlVTVFlQRShhLCBiLCBjLCBkKSBcCisgICAgKCBcCisgICAgICAoKChQWEVfVUlOVDMyKSAoZCkgJiAweEZGKSA8PCAyNCkgfCAoKChQWEVfVUlOVDMyKSAoYykgJiAweEZGKSA8PCAxNikgfCAoKChQWEVfVUlOVDMyKSAoYikgJiAweEZGKSA8PCA4KSB8IFwKKyAgICAgICAgKChQWEVfVUlOVDMyKSAoYSkgJiAweEZGKSBcCisgICAgKQorCisvLy8KKy8vLyBVTkRJIFJPTSBJRCBhbmQgZGV2aXZlIElEIHNpZ25hdHVyZQorLy8vCisjZGVmaW5lIFBYRV9CVVNUWVBFX1BYRSBQWEVfQlVTVFlQRSAoJyEnLCAnUCcsICdYJywgJ0UnKQorCisvLy8KKy8vLyBCVVMgUk9NIElEIHNpZ25hdHVyZXMKKy8vLworI2RlZmluZSBQWEVfQlVTVFlQRV9QQ0kgICAgIFBYRV9CVVNUWVBFICgnUCcsICdDJywgJ0knLCAnUicpCisjZGVmaW5lIFBYRV9CVVNUWVBFX1BDX0NBUkQgUFhFX0JVU1RZUEUgKCdQJywgJ0MnLCAnQycsICdSJykKKyNkZWZpbmUgUFhFX0JVU1RZUEVfVVNCICAgICBQWEVfQlVTVFlQRSAoJ1UnLCAnUycsICdCJywgJ1InKQorI2RlZmluZSBQWEVfQlVTVFlQRV8xMzk0ICAgIFBYRV9CVVNUWVBFICgnMScsICczJywgJzknLCAnNCcpCisKKyNkZWZpbmUgUFhFX1NXQVBfVUlOVDE2KG4pICAoKCgoUFhFX1VJTlQxNikgKG4pICYgMHgwMEZGKSA8PCA4KSB8ICgoKFBYRV9VSU5UMTYpIChuKSAmIDB4RkYwMCkgPj4gOCkpCisKKyNkZWZpbmUgUFhFX1NXQVBfVUlOVDMyKG4pIFwKKyAgKCgoKFBYRV9VSU5UMzIpKG4pICYgMHgwMDAwMDBGRikgPDwgMjQpIHwgXAorICAgKCgoUFhFX1VJTlQzMikobikgJiAweDAwMDBGRjAwKSA8PCA4KSAgfCBcCisgICAoKChQWEVfVUlOVDMyKShuKSAmIDB4MDBGRjAwMDApID4+IDgpICB8IFwKKyAgICgoKFBYRV9VSU5UMzIpKG4pICYgMHhGRjAwMDAwMCkgPj4gMjQpKQorCisjZGVmaW5lIFBYRV9TV0FQX1VJTlQ2NChuKSBcCisgICgoKChQWEVfVUlOVDY0KShuKSAmIDB4MDAwMDAwMDAwMDAwMDBGRlVMTCkgPDwgNTYpIHwgXAorICAgKCgoUFhFX1VJTlQ2NCkobikgJiAweDAwMDAwMDAwMDAwMEZGMDBVTEwpIDw8IDQwKSB8IFwKKyAgICgoKFBYRV9VSU5UNjQpKG4pICYgMHgwMDAwMDAwMDAwRkYwMDAwVUxMKSA8PCAyNCkgfCBcCisgICAoKChQWEVfVUlOVDY0KShuKSAmIDB4MDAwMDAwMDBGRjAwMDAwMFVMTCkgPDwgOCkgIHwgXAorICAgKCgoUFhFX1VJTlQ2NCkobikgJiAweDAwMDAwMEZGMDAwMDAwMDBVTEwpID4+IDgpICB8IFwKKyAgICgoKFBYRV9VSU5UNjQpKG4pICYgMHgwMDAwRkYwMDAwMDAwMDAwVUxMKSA+PiAyNCkgfCBcCisgICAoKChQWEVfVUlOVDY0KShuKSAmIDB4MDBGRjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwgXAorICAgKCgoUFhFX1VJTlQ2NCkobikgJiAweEZGMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSkKKworCisjZGVmaW5lIFBYRV9DUEJTSVpFX05PVF9VU0VEICAwICAgICAgICAgICAgICAgLy8vPCB6ZXJvCisjZGVmaW5lIFBYRV9EQlNJWkVfTk9UX1VTRUQgICAwICAgICAgICAgICAgICAgLy8vPCB6ZXJvCisjZGVmaW5lIFBYRV9DUEJBRERSX05PVF9VU0VEICAoUFhFX1VJTlQ2NCkgMCAgLy8vPCB6ZXJvCisjZGVmaW5lIFBYRV9EQkFERFJfTk9UX1VTRUQgICAoUFhFX1VJTlQ2NCkgMCAgLy8vPCB6ZXJvCisjZGVmaW5lIFBYRV9DT05TVCAgICAgICAgICAgICBDT05TVAorCisjZGVmaW5lIFBYRV9WT0xBVElMRSAgICAgICAgICB2b2xhdGlsZQorCit0eXBlZGVmIFZPSUQgICAgICAgICAgIFBYRV9WT0lEOwordHlwZWRlZiBVSU5UOCAgICAgICAgICBQWEVfVUlOVDg7Cit0eXBlZGVmIFVJTlQxNiAgICAgICAgIFBYRV9VSU5UMTY7Cit0eXBlZGVmIFVJTlQzMiAgICAgICAgIFBYRV9VSU5UMzI7Cit0eXBlZGVmIFVJTlROICAgICAgICAgIFBYRV9VSU5UTjsKKworLy8vCisvLy8gdHlwZWRlZiB1bnNpZ25lZCBsb25nIFBYRV9VSU5UNjQ7CisvLy8KK3R5cGVkZWYgVUlOVDY0ICAgICAgUFhFX1VJTlQ2NDsKKwordHlwZWRlZiBQWEVfVUlOVDggUFhFX0JPT0w7CisjZGVmaW5lIFBYRV9GQUxTRSAwICAgICAgICAgICAgLy8vPCB6ZXJvCisjZGVmaW5lIFBYRV9UUlVFICAoIVBYRV9GQUxTRSkKKwordHlwZWRlZiBQWEVfVUlOVDE2ICAgICAgUFhFX09QQ09ERTsKKworLy8vCisvLy8gUmV0dXJuIFVOREkgb3BlcmF0aW9uYWwgc3RhdGUuCisvLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9HRVRfU1RBVEUgIDB4MDAwMAorCisvLy8KKy8vLyBDaGFuZ2UgVU5ESSBvcGVyYXRpb25hbCBzdGF0ZSBmcm9tIFN0b3BwZWQgdG8gU3RhcnRlZC4KKy8vLworI2RlZmluZSBQWEVfT1BDT0RFX1NUQVJUICAweDAwMDEKKworLy8vCisvLy8gQ2hhbmdlIFVOREkgb3BlcmF0aW9uYWwgc3RhdGUgZnJvbSBTdGFydGVkIHRvIFN0b3BwZWQuCisvLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9TVE9QIDB4MDAwMgorCisvLy8KKy8vLyBHZXQgVU5ESSBpbml0aWFsaXphdGlvbiBpbmZvcm1hdGlvbi4KKy8vLworI2RlZmluZSBQWEVfT1BDT0RFX0dFVF9JTklUX0lORk8gIDB4MDAwMworCisvLy8KKy8vLyBHZXQgTklDIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisvLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9HRVRfQ09ORklHX0lORk8gIDB4MDAwNAorCisvLy8KKy8vLyBDaGFuZ2VkIFVOREkgb3BlcmF0aW9uYWwgc3RhdGUgZnJvbSBTdGFydGVkIHRvIEluaXRpYWxpemVkLgorLy8vCisjZGVmaW5lIFBYRV9PUENPREVfSU5JVElBTElaRSAweDAwMDUKKworLy8vCisvLy8gUmUtaW5pdGlhbGl6ZSB0aGUgTklDIEgvVy4KKy8vLworI2RlZmluZSBQWEVfT1BDT0RFX1JFU0VUICAweDAwMDYKKworLy8vCisvLy8gQ2hhbmdlIHRoZSBVTkRJIG9wZXJhdGlvbmFsIHN0YXRlIGZyb20gSW5pdGlhbGl6ZWQgdG8gU3RhcnRlZC4KKy8vLworI2RlZmluZSBQWEVfT1BDT0RFX1NIVVRET1dOIDB4MDAwNworCisvLy8KKy8vLyBSZWFkICYgY2hhbmdlIHN0YXRlIG9mIGV4dGVybmFsIGludGVycnVwdCBlbmFibGVzLgorLy8vCisjZGVmaW5lIFBYRV9PUENPREVfSU5URVJSVVBUX0VOQUJMRVMgIDB4MDAwOAorCisvLy8KKy8vLyBSZWFkICYgY2hhbmdlIHN0YXRlIG9mIHBhY2tldCByZWNlaXZlIGZpbHRlcnMuCisvLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9SRUNFSVZFX0ZJTFRFUlMgIDB4MDAwOQorCisvLy8KKy8vLyBSZWFkICYgY2hhbmdlIHN0YXRpb24gTUFDIGFkZHJlc3MuCisvLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9TVEFUSU9OX0FERFJFU1MgIDB4MDAwQQorCisvLy8KKy8vLyBSZWFkIHRyYWZmaWMgc3RhdGlzdGljcy4KKy8vLworI2RlZmluZSBQWEVfT1BDT0RFX1NUQVRJU1RJQ1MgMHgwMDBCCisKKy8vLworLy8vIENvbnZlcnQgbXVsdGljYXN0IElQIGFkZHJlc3MgdG8gbXVsdGljYXN0IE1BQyBhZGRyZXNzLgorLy8vCisjZGVmaW5lIFBYRV9PUENPREVfTUNBU1RfSVBfVE9fTUFDICAweDAwMEMKKworLy8vCisvLy8gUmVhZCBvciBjaGFuZ2Ugbm9uLXZvbGF0aWxlIHN0b3JhZ2Ugb24gdGhlIE5JQy4KKy8vLworI2RlZmluZSBQWEVfT1BDT0RFX05WREFUQSAweDAwMEQKKworLy8vCisvLy8gR2V0ICYgY2xlYXIgaW50ZXJydXB0IHN0YXR1cy4KKy8vLworI2RlZmluZSBQWEVfT1BDT0RFX0dFVF9TVEFUVVMgMHgwMDBFCisKKy8vLworLy8vIEZpbGwgbWVkaWEgaGVhZGVyIGluIHBhY2tldCBmb3IgdHJhbnNtaXQuCisvLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9GSUxMX0hFQURFUiAgMHgwMDBGCisKKy8vLworLy8vIFRyYW5zbWl0IHBhY2tldChzKS4KKy8vLworI2RlZmluZSBQWEVfT1BDT0RFX1RSQU5TTUlUIDB4MDAxMAorCisvLy8KKy8vLyBSZWNlaXZlIHBhY2tldC4KKy8vLworI2RlZmluZSBQWEVfT1BDT0RFX1JFQ0VJVkUgIDB4MDAxMQorCisvLy8KKy8vLyBMYXN0IHZhbGlkIFBYRSBVTkRJIE9wQ29kZSBudW1iZXIuCisvLy8KKyNkZWZpbmUgUFhFX09QQ09ERV9MQVNUX1ZBTElEIDB4MDAxMQorCit0eXBlZGVmIFBYRV9VSU5UMTYgIFBYRV9PUEZMQUdTOworCisjZGVmaW5lIFBYRV9PUEZMQUdTX05PVF9VU0VEICAweDAwMDAKKworLy8KKy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEdldCBTdGF0ZQorLy8KKy8vIE5vIE9wRmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBTdGFydAorLy8KKy8vIE5vIE9wRmxhZ3MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5ESSBTdG9wCisvLworLy8gTm8gT3BGbGFncworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkRJIEdldCBJbml0IEluZm8KKy8vCisvLyBObyBPcGZsYWdzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOREkgR2V0IENvbmZpZyBJbmZvCisvLworLy8gTm8gT3BmbGFncworCisvLy8KKy8vLyBVTkRJIEluaXRpYWxpemUKKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19JTklUSUFMSVpFX0NBQkxFX0RFVEVDVF9NQVNLICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19JTklUSUFMSVpFX0RFVEVDVF9DQUJMRSAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19JTklUSUFMSVpFX0RPX05PVF9ERVRFQ1RfQ0FCTEUgIDB4MDAwMQorCisvLy8KKy8vLworLy8vIFVOREkgUmVzZXQKKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19SRVNFVF9ESVNBQkxFX0lOVEVSUlVQVFMgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19SRVNFVF9ESVNBQkxFX0ZJTFRFUlMgICAgIDB4MDAwMgorCisvLy8KKy8vLyBVTkRJIFNodXRkb3duCisvLy8KKy8vLyBObyBPcEZsYWdzCisKKy8vLworLy8vIFVOREkgSW50ZXJydXB0IEVuYWJsZXMKKy8vLworLy8vCisvLy8gU2VsZWN0IHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgZXh0ZXJuYWwgaW50ZXJydXB0IHNpZ25hbHMuCisvLy8gU2V0dGluZyBib3RoIGVuYWJsZSBhbmQgZGlzYWJsZSB3aWxsIHJldHVybiBQWEVfU1RBVENPREVfSU5WQUxJRF9PUEZMQUdTLgorLy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX0lOVEVSUlVQVF9PUE1BU0sgIDB4QzAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfRU5BQkxFICAweDgwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX0RJU0FCTEUgMHg0MDAwCisjZGVmaW5lIFBYRV9PUEZMQUdTX0lOVEVSUlVQVF9SRUFEICAgIDB4MDAwMAorCisvLy8KKy8vLyBFbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzLiAgQW4gZXh0ZXJuYWwgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkCisvLy8gYWZ0ZXIgYSBjb21wbGV0ZSBub24tZXJyb3IgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkLgorLy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX0lOVEVSUlVQVF9SRUNFSVZFIDB4MDAwMQorCisvLy8KKy8vLyBFbmFibGUgdHJhbnNtaXQgaW50ZXJydXB0cy4gIEFuIGV4dGVybmFsIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZAorLy8vIGFmdGVyIGEgY29tcGxldGUgbm9uLWVycm9yIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZC4KKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfVFJBTlNNSVQgIDB4MDAwMgorCisvLy8KKy8vLyBFbmFibGUgY29tbWFuZCBpbnRlcnJ1cHRzLiAgQW4gZXh0ZXJuYWwgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkCisvLy8gd2hlbiBjb21tYW5kIGV4ZWN1dGlvbiBzdG9wcy4KKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19JTlRFUlJVUFRfQ09NTUFORCAweDAwMDQKKworLy8vCisvLy8gR2VuZXJhdGUgc29mdHdhcmUgaW50ZXJydXB0LiAgU2V0dGluZyB0aGlzIGJpdCBnZW5lcmF0ZXMgYW4gZXh0ZXJuYWwKKy8vLyBpbnRlcnJ1cHQsIGlmIGl0IGlzIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUuCisvLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfSU5URVJSVVBUX1NPRlRXQVJFICAweDAwMDgKKworLy8vCisvLy8gVU5ESSBSZWNlaXZlIEZpbHRlcnMKKy8vLworLy8vCisvLy8gU2VsZWN0IHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgcmVjZWl2ZSBmaWx0ZXJzLgorLy8vIFNldHRpbmcgYm90aCBlbmFibGUgYW5kIGRpc2FibGUgd2lsbCByZXR1cm4gUFhFX1NUQVRDT0RFX0lOVkFMSURfT1BDT0RFLgorLy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX09QTUFTSyAgIDB4QzAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9FTkFCTEUgICAweDgwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfRElTQUJMRSAgMHg0MDAwCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX1JFQUQgICAgIDB4MDAwMAorCisvLy8KKy8vLyBUbyByZXNldCB0aGUgY29udGVudHMgb2YgdGhlIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmaWx0ZXIgbGlzdCwKKy8vLyBzZXQgdGhpcyBPcEZsYWc6CisvLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfUkVDRUlWRV9GSUxURVJfUkVTRVRfTUNBU1RfTElTVCAweDIwMDAKKworLy8vCisvLy8gRW5hYmxlIHVuaWNhc3QgcGFja2V0IHJlY2VpdmluZy4gIFBhY2tldHMgc2VudCB0byB0aGUgY3VycmVudCBzdGF0aW9uCisvLy8gTUFDIGFkZHJlc3Mgd2lsbCBiZSByZWNlaXZlZC4KKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9VTklDQVNUICAweDAwMDEKKworLy8vCisvLy8gRW5hYmxlIGJyb2FkY2FzdCBwYWNrZXQgcmVjZWl2aW5nLiAgUGFja2V0cyBzZW50IHRvIHRoZSBicm9hZGNhc3QKKy8vLyBNQUMgYWRkcmVzcyB3aWxsIGJlIHJlY2VpdmVkLgorLy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX0JST0FEQ0FTVCAgMHgwMDAyCisKKy8vLworLy8vIEVuYWJsZSBmaWx0ZXJlZCBtdWx0aWNhc3QgcGFja2V0IHJlY2VpdmluZy4gIFBhY2tldHMgc2VudCB0byBhbnkKKy8vLyBvZiB0aGUgbXVsdGljYXN0IE1BQyBhZGRyZXNzZXMgaW4gdGhlIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmaWx0ZXIKKy8vLyBsaXN0IHdpbGwgYmUgcmVjZWl2ZWQuICBJZiB0aGUgZmlsdGVyIGxpc3QgaXMgZW1wdHksIG5vIG11bHRpY2FzdAorLy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX0ZJTFRFUkVEX01VTFRJQ0FTVCAweDAwMDQKKworLy8vCisvLy8gRW5hYmxlIHByb21pc2N1b3VzIHBhY2tldCByZWNlaXZpbmcuICBBbGwgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX1JFQ0VJVkVfRklMVEVSX1BST01JU0NVT1VTICAweDAwMDgKKworLy8vCisvLy8gRW5hYmxlIHByb21pc2N1b3VzIG11bHRpY2FzdCBwYWNrZXQgcmVjZWl2aW5nLiAgQWxsIG11bHRpY2FzdAorLy8vIHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4KKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19SRUNFSVZFX0ZJTFRFUl9BTExfTVVMVElDQVNUICAweDAwMTAKKworLy8vCisvLy8gVU5ESSBTdGF0aW9uIEFkZHJlc3MKKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSU9OX0FERFJFU1NfUkVBRCAgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSU9OX0FERFJFU1NfV1JJVEUgIDB4MDAwMAorI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSU9OX0FERFJFU1NfUkVTRVQgIDB4MDAwMQorCisvLy8KKy8vLyBVTkRJIFN0YXRpc3RpY3MKKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19TVEFUSVNUSUNTX1JFQUQgICAweDAwMDAKKyNkZWZpbmUgUFhFX09QRkxBR1NfU1RBVElTVElDU19SRVNFVCAgMHgwMDAxCisKKy8vLworLy8vIFVOREkgTUNhc3QgSVAgdG8gTUFDCisvLy8KKy8vLworLy8vIElkZW50aWZ5IHRoZSB0eXBlIG9mIElQIGFkZHJlc3MgaW4gdGhlIENQQi4KKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19NQ0FTVF9JUF9UT19NQUNfT1BNQVNLICAweDAwMDMKKyNkZWZpbmUgUFhFX09QRkxBR1NfTUNBU1RfSVBWNF9UT19NQUMgICAgICAgMHgwMDAwCisjZGVmaW5lIFBYRV9PUEZMQUdTX01DQVNUX0lQVjZfVE9fTUFDICAgICAgIDB4MDAwMQorCisvLy8KKy8vLyBVTkRJIE52RGF0YQorLy8vCisvLy8KKy8vLyBTZWxlY3QgdGhlIHR5cGUgb2Ygbm9uLXZvbGF0aWxlIGRhdGEgb3BlcmF0aW9uLgorLy8vCisjZGVmaW5lIFBYRV9PUEZMQUdTX05WREFUQV9PUE1BU0sgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX05WREFUQV9SRUFEICAgMHgwMDAwCisjZGVmaW5lIFBYRV9PUEZMQUdTX05WREFUQV9XUklURSAgMHgwMDAxCisKKy8vLworLy8vIFVOREkgR2V0IFN0YXR1cworLy8vCisvLy8KKy8vLyBSZXR1cm4gY3VycmVudCBpbnRlcnJ1cHQgc3RhdHVzLiAgVGhpcyB3aWxsIGFsc28gY2xlYXIgYW55IGludGVycnVwdHMKKy8vLyB0aGF0IGFyZSBjdXJyZW50bHkgc2V0LiAgVGhpcyBjYW4gYmUgdXNlZCBpbiBhIHBvbGxpbmcgcm91dGluZS4gIFRoZQorLy8vIGludGVycnVwdCBmbGFncyBhcmUgc3RpbGwgc2V0IGFuZCBjbGVhcmVkIGV2ZW4gd2hlbiB0aGUgaW50ZXJydXB0cworLy8vIGFyZSBkaXNhYmxlZC4KKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19HRVRfSU5URVJSVVBUX1NUQVRVUyAgMHgwMDAxCisKKy8vLworLy8vIFJldHVybiBsaXN0IG9mIHRyYW5zbWl0dGVkIGJ1ZmZlcnMgZm9yIHJlY3ljbGluZy4gIFRyYW5zbWl0IGJ1ZmZlcnMKKy8vLyBtdXN0IG5vdCBiZSBjaGFuZ2VkIG9yIHVuYWxsb2NhdGVkIHVudGlsIHRoZXkgaGF2ZSByZWN5Y2xlZC4gIEFmdGVyCisvLy8gaXNzdWluZyBhIHRyYW5zbWl0IGNvbW1hbmQsIHdhaXQgZm9yIGEgdHJhbnNtaXQgY29tcGxldGUgaW50ZXJydXB0LgorLy8vIFdoZW4gYSB0cmFuc21pdCBjb21wbGV0ZSBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQsIHJlYWQgdGhlIHRyYW5zbWl0dGVkCisvLy8gYnVmZmVycy4gIERvIG5vdCBwbGFuIG9uIGdldHRpbmcgb25lIGJ1ZmZlciBwZXIgaW50ZXJydXB0LiAgU29tZQorLy8vIE5JQ3MgYW5kIFVORElzIG1heSB0cmFuc21pdCBtdWx0aXBsZSBidWZmZXJzIHBlciBpbnRlcnJ1cHQuCisvLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfR0VUX1RSQU5TTUlUVEVEX0JVRkZFUlMgMHgwMDAyCisKKy8vLworLy8vIFVOREkgRmlsbCBIZWFkZXIKKy8vLworI2RlZmluZSBQWEVfT1BGTEFHU19GSUxMX0hFQURFUl9PUE1BU0sgICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX09QRkxBR1NfRklMTF9IRUFERVJfRlJBR01FTlRFRCAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX0ZJTExfSEVBREVSX1dIT0xFICAgICAgIDB4MDAwMAorCisvLy8KKy8vLyBVTkRJIFRyYW5zbWl0CisvLy8KKy8vLworLy8vIFMvVyBVTkRJIG9ubHkuICBSZXR1cm4gYWZ0ZXIgdGhlIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZC4gIEEKKy8vLyB0cmFuc21pdCBjb21wbGV0ZSBpbnRlcnJ1cHQgd2lsbCBzdGlsbCBiZSBnZW5lcmF0ZWQgYW5kIHRoZSB0cmFuc21pdAorLy8vIGJ1ZmZlciB3aWxsIGhhdmUgdG8gYmUgcmVjeWNsZWQuCisvLy8KKyNkZWZpbmUgUFhFX09QRkxBR1NfU1dVTkRJX1RSQU5TTUlUX09QTUFTSyAgMHgwMDAxCisjZGVmaW5lIFBYRV9PUEZMQUdTX1RSQU5TTUlUX0JMT0NLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfT1BGTEFHU19UUkFOU01JVF9ET05UX0JMT0NLICAgICAweDAwMDAKKworI2RlZmluZSBQWEVfT1BGTEFHU19UUkFOU01JVF9PUE1BU0sgICAgIDB4MDAwMgorI2RlZmluZSBQWEVfT1BGTEFHU19UUkFOU01JVF9GUkFHTUVOVEVEIDB4MDAwMgorI2RlZmluZSBQWEVfT1BGTEFHU19UUkFOU01JVF9XSE9MRSAgICAgIDB4MDAwMAorCisvLy8KKy8vLyBVTkRJIFJlY2VpdmUKKy8vLworLy8vIE5vIE9wRmxhZ3MKKy8vLworCisvLy8KKy8vLyBQWEUgU1RBVEZMQUdTCisvLy8KK3R5cGVkZWYgUFhFX1VJTlQxNiAgUFhFX1NUQVRGTEFHUzsKKworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOSVRJQUxJWkUgIDB4MDAwMAorCisvLy8KKy8vLyBDb21tb24gU3RhdEZsYWdzIHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IGFsbCBjb21tYW5kcy4KKy8vLworLy8vCisvLy8gVGhlIENPTU1BTkRfQ09NUExFVEUgYW5kIENPTU1BTkRfRkFJTEVEIHN0YXR1cyBmbGFncyBtdXN0IGJlCisvLy8gaW1wbGVtZW50ZWQgYnkgYWxsIFVORElzLiAgQ09NTUFORF9RVUVVRUQgaXMgb25seSBuZWVkZWQgYnkgVU5ESXMKKy8vLyB0aGF0IHN1cHBvcnQgY29tbWFuZCBxdWV1aW5nLgorLy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfU1RBVFVTX01BU0sgICAgICAgMHhDMDAwCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfQ09NTUFORF9DT01QTEVURSAgMHhDMDAwCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfQ09NTUFORF9GQUlMRUQgICAgMHg4MDAwCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfQ09NTUFORF9RVUVVRUQgICAgMHg0MDAwCisKKy8vLworLy8vIFVOREkgR2V0IFN0YXRlCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVEVfTUFTSyAgICAgICAgMHgwMDAzCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRFX0lOSVRJQUxJWkVEIDB4MDAwMgorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFURV9TVEFSVEVEICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVEVfU1RPUFBFRCAgICAgMHgwMDAwCisKKy8vLworLy8vIFVOREkgU3RhcnQKKy8vLworLy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisvLy8KKworLy8vCisvLy8gVU5ESSBHZXQgSW5pdCBJbmZvCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19DQUJMRV9ERVRFQ1RfTUFTSyAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfQ0FCTEVfREVURUNUX05PVF9TVVBQT1JURUQgIDB4MDAwMAorI2RlZmluZSBQWEVfU1RBVEZMQUdTX0NBQkxFX0RFVEVDVF9TVVBQT1JURUQgICAgICAweDAwMDEKKworLy8vCisvLy8gVU5ESSBJbml0aWFsaXplCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19JTklUSUFMSVpFRF9OT19NRURJQSAgMHgwMDAxCisKKy8vLworLy8vIFVOREkgUmVzZXQKKy8vLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX1JFU0VUX05PX01FRElBICAweDAwMDEKKworLy8vCisvLy8gVU5ESSBTaHV0ZG93bgorLy8vCisvLy8gTm8gYWRkaXRpb25hbCBTdGF0RmxhZ3MKKworLy8vCisvLy8gVU5ESSBJbnRlcnJ1cHQgRW5hYmxlcworLy8vCisvLy8KKy8vLyBJZiBzZXQsIHJlY2VpdmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKy8vLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOVEVSUlVQVF9SRUNFSVZFIDB4MDAwMQorCisvLy8KKy8vLyBJZiBzZXQsIHRyYW5zbWl0IGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19JTlRFUlJVUFRfVFJBTlNNSVQgIDB4MDAwMgorCisvLy8KKy8vLyBJZiBzZXQsIGNvbW1hbmQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKy8vLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0lOVEVSUlVQVF9DT01NQU5EIDB4MDAwNAorCisvLy8KKy8vLyBVTkRJIFJlY2VpdmUgRmlsdGVycworLy8vCisKKy8vLworLy8vIElmIHNldCwgdW5pY2FzdCBwYWNrZXRzIHdpbGwgYmUgcmVjZWl2ZWQuCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19SRUNFSVZFX0ZJTFRFUl9VTklDQVNUICAweDAwMDEKKworLy8vCisvLy8gSWYgc2V0LCBicm9hZGNhc3QgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVDRUlWRV9GSUxURVJfQlJPQURDQVNUICAweDAwMDIKKworLy8vCisvLy8gSWYgc2V0LCBtdWx0aWNhc3QgcGFja2V0cyB0aGF0IG1hdGNoIHVwIHdpdGggdGhlIG11bHRpY2FzdCBhZGRyZXNzCisvLy8gZmlsdGVyIGxpc3Qgd2lsbCBiZSByZWNlaXZlZC4KKy8vLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX1JFQ0VJVkVfRklMVEVSX0ZJTFRFUkVEX01VTFRJQ0FTVCAweDAwMDQKKworLy8vCisvLy8gSWYgc2V0LCBhbGwgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVDRUlWRV9GSUxURVJfUFJPTUlTQ1VPVVMgIDB4MDAwOAorCisvLy8KKy8vLyBJZiBzZXQsIGFsbCBtdWx0aWNhc3QgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgorLy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfUkVDRUlWRV9GSUxURVJfQUxMX01VTFRJQ0FTVCAgMHgwMDEwCisKKy8vLworLy8vIFVOREkgU3RhdGlvbiBBZGRyZXNzCisvLy8KKy8vLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncworLy8vCisKKy8vLworLy8vIFVOREkgU3RhdGlzdGljcworLy8vCisvLy8gTm8gYWRkaXRpb25hbCBTdGF0RmxhZ3MKKy8vLworCisvLy8KKy8vLy8gVU5ESSBNQ2FzdCBJUCB0byBNQUMKKy8vLy8KKy8vLy8gTm8gYWRkaXRpb25hbCBTdGF0RmxhZ3MKKworLy8vCisvLy8gVU5ESSBOdkRhdGEKKy8vLworLy8vIE5vIGFkZGl0aW9uYWwgU3RhdEZsYWdzCisvLy8KKworLy8vCisvLy8gVU5ESSBHZXQgU3RhdHVzCisvLy8KKworLy8vCisvLy8gVXNlIHRvIGRldGVybWluZSBpZiBhbiBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkLgorLy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19JTlRFUlJVUFRfTUFTSyAweDAwMEYKKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVFVTX05PX0lOVEVSUlVQVFMgIDB4MDAwMAorCisvLy8KKy8vLyBJZiBzZXQsIGF0IGxlYXN0IG9uZSByZWNlaXZlIGludGVycnVwdCBvY2N1cnJlZC4KKy8vLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfUkVDRUlWRSAgMHgwMDAxCisKKy8vLworLy8vIElmIHNldCwgYXQgbGVhc3Qgb25lIHRyYW5zbWl0IGludGVycnVwdCBvY2N1cnJlZC4KKy8vLworI2RlZmluZSBQWEVfU1RBVEZMQUdTX0dFVF9TVEFUVVNfVFJBTlNNSVQgMHgwMDAyCisKKy8vLworLy8vIElmIHNldCwgYXQgbGVhc3Qgb25lIGNvbW1hbmQgaW50ZXJydXB0IG9jY3VycmVkLgorLy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19DT01NQU5EICAweDAwMDQKKworLy8vCisvLy8gSWYgc2V0LCBhdCBsZWFzdCBvbmUgc29mdHdhcmUgaW50ZXJydXB0IG9jY3VycmVkLgorLy8vCisjZGVmaW5lIFBYRV9TVEFURkxBR1NfR0VUX1NUQVRVU19TT0ZUV0FSRSAweDAwMDgKKworLy8vCisvLy8gVGhpcyBmbGFnIGlzIHNldCBpZiB0aGUgdHJhbnNtaXR0ZWQgYnVmZmVyIHF1ZXVlIGlzIGVtcHR5LiAgVGhpcyBmbGFnCisvLy8gd2lsbCBiZSBzZXQgaWYgYWxsIHRyYW5zbWl0dGVkIGJ1ZmZlciBhZGRyZXNzZXMgZ2V0IHdyaXR0ZW4gaW50byB0aGUgREIuCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVFVTX1RYQlVGX1FVRVVFX0VNUFRZICAweDAwMTAKKworLy8vCisvLy8gVGhpcyBmbGFnIGlzIHNldCBpZiBubyB0cmFuc21pdHRlZCBidWZmZXIgYWRkcmVzc2VzIHdlcmUgd3JpdHRlbgorLy8vIGludG8gdGhlIERCLiAgKFRoaXMgY291bGQgYmUgYmVjYXVzZSBEQnNpemUgd2FzIHRvbyBzbWFsbC4pCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRGTEFHU19HRVRfU1RBVFVTX05PX1RYQlVGU19XUklUVEVOICAweDAwMjAKKworLy8vCisvLy8gVU5ESSBGaWxsIEhlYWRlcgorLy8vCisvLy8gTm8gYWRkaXRpb25hbCBTdGF0RmxhZ3MKKy8vLworCisvLy8KKy8vLyBVTkRJIFRyYW5zbWl0CisvLy8KKy8vLyBObyBhZGRpdGlvbmFsIFN0YXRGbGFncy4KKworLy8vCisvLy8gVU5ESSBSZWNlaXZlCisvLy8KKworLy8vCisvLy8gTm8gYWRkaXRpb25hbCBTdGF0RmxhZ3MuCisvLy8KK3R5cGVkZWYgUFhFX1VJTlQxNiAgUFhFX1NUQVRDT0RFOworCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JTklUSUFMSVpFIDB4MDAwMAorCisvLy8KKy8vLyBDb21tb24gU3RhdENvZGVzIHJldHVybmVkIGJ5IGFsbCBVTkRJIGNvbW1hbmRzLCBVTkRJIHByb3RvY29sIGZ1bmN0aW9ucworLy8vIGFuZCBCQyBwcm90b2NvbCBmdW5jdGlvbnMuCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRDT0RFX1NVQ0NFU1MgICAgICAgICAgICAgIDB4MDAwMAorCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JTlZBTElEX0NEQiAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lOVkFMSURfQ1BCICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQWEVfU1RBVENPREVfQlVTWSAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9RVUVVRV9GVUxMICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0FMUkVBRFlfU1RBUlRFRCAgICAgIDB4MDAwNQorI2RlZmluZSBQWEVfU1RBVENPREVfTk9UX1NUQVJURUQgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIFBYRV9TVEFUQ09ERV9OT1RfU0hVVERPV04gICAgICAgICAweDAwMDcKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0FMUkVBRFlfSU5JVElBTElaRUQgIDB4MDAwOAorI2RlZmluZSBQWEVfU1RBVENPREVfTk9UX0lOSVRJQUxJWkVEICAgICAgMHgwMDA5CisjZGVmaW5lIFBYRV9TVEFUQ09ERV9ERVZJQ0VfRkFJTFVSRSAgICAgICAweDAwMEEKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX05WREFUQV9GQUlMVVJFICAgICAgIDB4MDAwQgorI2RlZmluZSBQWEVfU1RBVENPREVfVU5TVVBQT1JURUQgICAgICAgICAgMHgwMDBDCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9CVUZGRVJfRlVMTCAgICAgICAgICAweDAwMEQKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lOVkFMSURfUEFSQU1FVEVSICAgIDB4MDAwRQorI2RlZmluZSBQWEVfU1RBVENPREVfSU5WQUxJRF9VTkRJICAgICAgICAgMHgwMDBGCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9JUFY0X05PVF9TVVBQT1JURUQgICAweDAwMTAKKyNkZWZpbmUgUFhFX1NUQVRDT0RFX0lQVjZfTk9UX1NVUFBPUlRFRCAgIDB4MDAxMQorI2RlZmluZSBQWEVfU1RBVENPREVfTk9UX0VOT1VHSF9NRU1PUlkgICAgMHgwMDEyCisjZGVmaW5lIFBYRV9TVEFUQ09ERV9OT19EQVRBICAgICAgICAgICAgICAweDAwMTMKKwordHlwZWRlZiBQWEVfVUlOVDE2ICBQWEVfSUZOVU07CisKKy8vLworLy8vIFRoaXMgaW50ZXJmYWNlIG51bWJlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgUy9XIFVOREkgU3RhcnQgY29tbWFuZC4KKy8vLworI2RlZmluZSBQWEVfSUZOVU1fU1RBUlQgMHgwMDAwCisKKy8vLworLy8vIFRoaXMgaW50ZXJmYWNlIG51bWJlciBpcyByZXR1cm5lZCBieSB0aGUgUy9XIFVOREkgR2V0IFN0YXRlIGFuZAorLy8vIFN0YXJ0IGNvbW1hbmRzIGlmIGluZm9ybWF0aW9uIGluIHRoZSBDREIsIENQQiBvciBEQiBpcyBpbnZhbGlkLgorLy8vCisjZGVmaW5lIFBYRV9JRk5VTV9JTlZBTElEIDB4MDAwMAorCit0eXBlZGVmIFBYRV9VSU5UMTYgIFBYRV9DT05UUk9MOworCisvLy8KKy8vLyBTZXR0aW5nIHRoaXMgZmxhZyBkaXJlY3RzIHRoZSBVTkRJIHRvIHF1ZXVlIHRoaXMgY29tbWFuZCBmb3IgbGF0ZXIKKy8vLyBleGVjdXRpb24gaWYgdGhlIFVOREkgaXMgYnVzeSBhbmQgaXQgc3VwcG9ydHMgY29tbWFuZCBxdWV1aW5nLgorLy8vIElmIHF1ZXVpbmcgaXMgbm90IHN1cHBvcnRlZCwgYSBQWEVfU1RBVENPREVfSU5WQUxJRF9DT05UUk9MIGVycm9yCisvLy8gaXMgcmV0dXJuZWQuICBJZiB0aGUgcXVldWUgaXMgZnVsbCwgYSBQWEVfU1RBVENPREVfQ0RCX1FVRVVFX0ZVTEwKKy8vLyBlcnJvciBpcyByZXR1cm5lZC4KKy8vLworI2RlZmluZSBQWEVfQ09OVFJPTF9RVUVVRV9JRl9CVVNZIDB4MDAwMgorCisvLy8KKy8vLyBUaGVzZSB0d28gYml0IHZhbHVlcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIG1vcmUgVU5ESQorLy8vIENEQiBzdHJ1Y3R1cmVzIGZvbGxvd2luZyB0aGlzIG9uZS4gIElmIHRoZSBsaW5rIGJpdCBpcyBzZXQsIHRoZXJlCisvLy8gbXVzdCBiZSBhIENEQiBzdHJ1Y3R1cmUgZm9sbG93aW5nIHRoaXMgb25lLiAgRXhlY3V0aW9uIHdpbGwgc3RhcnQKKy8vLyBvbiB0aGUgbmV4dCBDREIgc3RydWN0dXJlIGFzIHNvb24gYXMgdGhpcyBvbmUgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KKy8vLyBJZiBhbiBlcnJvciBpcyBnZW5lcmF0ZWQgYnkgdGhpcyBjb21tYW5kLCBleGVjdXRpb24gd2lsbCBzdG9wLgorLy8vCisjZGVmaW5lIFBYRV9DT05UUk9MX0xJTksgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQWEVfQ09OVFJPTF9MQVNUX0NEQl9JTl9MSVNUICAweDAwMDAKKwordHlwZWRlZiBQWEVfVUlOVDggICBQWEVfRlJBTUVfVFlQRTsKKworI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9OT05FICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9VTklDQVNUICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9CUk9BRENBU1QgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9GSUxURVJFRF9NVUxUSUNBU1QgICAgICAgMHgwMworI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9QUk9NSVNDVU9VUyAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBQWEVfRlJBTUVfVFlQRV9QUk9NSVNDVU9VU19NVUxUSUNBU1QgICAgMHgwNQorCisjZGVmaW5lIFBYRV9GUkFNRV9UWVBFX01VTFRJQ0FTVCAgICAgICAgICAgICAgICBQWEVfRlJBTUVfVFlQRV9GSUxURVJFRF9NVUxUSUNBU1QKKwordHlwZWRlZiBQWEVfVUlOVDMyICBQWEVfSVBWNDsKKwordHlwZWRlZiBQWEVfVUlOVDMyICBQWEVfSVBWNls0XTsKKyNkZWZpbmUgUFhFX01BQ19MRU5HVEggIDMyCisKK3R5cGVkZWYgUFhFX1VJTlQ4ICAgUFhFX01BQ19BRERSW1BYRV9NQUNfTEVOR1RIXTsKKwordHlwZWRlZiBQWEVfVUlOVDggICBQWEVfSUZUWVBFOwordHlwZWRlZiBVSU5UMTYgICAgICBQWEVfTUVESUFfUFJPVE9DT0w7CisKKy8vLworLy8vIFRoaXMgaW5mb3JtYXRpb24gaXMgZnJvbSB0aGUgQVJQIHNlY3Rpb24gb2YgUkZDIDE3MDAuCisvLy8KKy8vLyAgICAgMSBFdGhlcm5ldCAoMTBNYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSkJQXQorLy8vICAgICAyIEV4cGVyaW1lbnRhbCBFdGhlcm5ldCAoM01iKSAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLy8gICAgIDMgQW1hdGV1ciBSYWRpbyBBWC4yNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1BYS10KKy8vLyAgICAgNCBQcm90ZW9uIFByb05FVCBUb2tlbiBSaW5nICAgICAgICAgICAgICAgICAgICAgICAgICBbSkJQXQorLy8vICAgICA1IENoYW9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHWFBdCisvLy8gICAgIDYgSUVFRSA4MDIgTmV0d29ya3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0pCUF0KKy8vLyAgICAgNyBBUkNORVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSkJQXQorLy8vICAgICA4IEh5cGVyY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLy8gICAgIDkgTGFuc3RhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUVV0KKy8vLyAgICAxMCBBdXRvbmV0IFNob3J0IEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtNWEIxXQorLy8vICAgIDExIExvY2FsVGFsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0pLUjFdCisvLy8gICAgMTIgTG9jYWxOZXQgKElCTSogUENOZXQgb3IgU1lURUsqIExvY2FsTkVUKSAgICAgICAgICAgW0pYTV0KKy8vLyAgICAxMyBVbHRyYSBsaW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSWEQyXQorLy8vICAgIDE0IFNNRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0dYQzFdCisvLy8gICAgMTUgRnJhbWUgUmVsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FHTV0KKy8vLyAgICAxNiBBc3luY2hyb25vdXMgVHJhbnNtaXNzaW9uIE1vZGUgKEFUTSkgICAgICAgICAgICAgIFtKWEIyXQorLy8vICAgIDE3IEhETEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLy8gICAgMTggRmlicmUgQ2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWWFrb3YgUmVraHRlcl0KKy8vLyAgICAxOSBBc3luY2hyb25vdXMgVHJhbnNtaXNzaW9uIE1vZGUgKEFUTSkgICAgICBbTWFyayBMYXViYWNoXQorLy8vICAgIDIwIFNlcmlhbCBMaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKQlBdCisvLy8gICAgMjEgQXN5bmNocm9ub3VzIFRyYW5zbWlzc2lvbiBNb2RlIChBVE0pICAgICAgICAgICAgICBbTVhCMV0KKy8vLworLy8vICogT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgorLy8vCisjZGVmaW5lIFBYRV9JRlRZUEVfRVRIRVJORVQgICAgICAgMHgwMQorI2RlZmluZSBQWEVfSUZUWVBFX1RPS0VOUklORyAgICAgIDB4MDQKKyNkZWZpbmUgUFhFX0lGVFlQRV9GSUJSRV9DSEFOTkVMICAweDEyCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2h3X3VuZGkgeworICBQWEVfVUlOVDMyICBTaWduYXR1cmU7ICAgICAgLy8vPCBQWEVfUk9NSURfU0lHTkFUVVJFCisgIFBYRV9VSU5UOCAgIExlbjsgICAgICAgICAgICAvLy88IHNpemVvZihQWEVfSFdfVU5ESSkKKyAgUFhFX1VJTlQ4ICAgRnVkZ2U7ICAgICAgICAgIC8vLzwgbWFrZXMgOC1iaXQgY2tzdW0gZXF1YWwgemVybworICBQWEVfVUlOVDggICBSZXY7ICAgICAgICAgICAgLy8vPCBQWEVfUk9NSURfUkVWCisgIFBYRV9VSU5UOCAgIElGY250OyAgICAgICAgICAvLy88IHBoeXNpY2FsIGNvbm5lY3RvciBjb3VudAorICBQWEVfVUlOVDggICBNYWpvclZlcjsgICAgICAgLy8vPCBQWEVfUk9NSURfTUFKT1JWRVIKKyAgUFhFX1VJTlQ4ICAgTWlub3JWZXI7ICAgICAgIC8vLzwgUFhFX1JPTUlEX01JTk9SVkVSCisgIFBYRV9VSU5UMTYgIHJlc2VydmVkOyAgICAgICAvLy88IHplcm8sIG5vdCB1c2VkCisgIFBYRV9VSU5UMzIgIEltcGxlbWVudGF0aW9uOyAvLy88IGltcGxlbWVudGF0aW9uIGZsYWdzCisgIC8vLzwgcmVzZXJ2ZWQgICAgICAgICAgICAgLy8vPCB2ZW5kb3IgdXNlCisgIC8vLzwgVUlOVDMyIFN0YXR1czsgICAgICAgLy8vPCBzdGF0dXMgcG9ydAorICAvLy88IFVJTlQzMiBDb21tYW5kOyAgICAgIC8vLzwgY29tbWFuZCBwb3J0CisgIC8vLzwgVUlOVDY0IENEQmFkZHI7ICAgICAgLy8vPCBDREIgYWRkcmVzcyBwb3J0CisgIC8vLzwKK30gUFhFX0hXX1VOREk7CisKKy8vLworLy8vIFN0YXR1cyBwb3J0IGJpdCBkZWZpbml0aW9ucworLy8vCisKKy8vLworLy8vIFVOREkgb3BlcmF0aW9uIHN0YXRlCisvLy8KKyNkZWZpbmUgUFhFX0hXU1RBVF9TVEFURV9NQVNLICAgMHhDMDAwMDAwMAorI2RlZmluZSBQWEVfSFdTVEFUX0JVU1kgICAgICAgICAweEMwMDAwMDAwCisjZGVmaW5lIFBYRV9IV1NUQVRfSU5JVElBTElaRUQgIDB4ODAwMDAwMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9TVEFSVEVEICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBQWEVfSFdTVEFUX1NUT1BQRUQgICAgICAweDAwMDAwMDAwCisKKy8vLworLy8vIElmIHNldCwgbGFzdCBjb21tYW5kIGZhaWxlZAorLy8vCisjZGVmaW5lIFBYRV9IV1NUQVRfQ09NTUFORF9GQUlMRUQgMHgyMDAwMDAwMAorCisvLy8KKy8vLyBJZiBzZXQsIGlkZW50aWZpZXMgZW5hYmxlZCByZWNlaXZlIGZpbHRlcnMKKy8vLworI2RlZmluZSBQWEVfSFdTVEFUX1BST01JU0NVT1VTX01VTFRJQ0FTVF9SWF9FTkFCTEVEIDB4MDAwMDEwMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9QUk9NSVNDVU9VU19SWF9FTkFCTEVEICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBYRV9IV1NUQVRfQlJPQURDQVNUX1JYX0VOQUJMRUQgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBQWEVfSFdTVEFUX01VTFRJQ0FTVF9SWF9FTkFCTEVEICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9VTklDQVNUX1JYX0VOQUJMRUQgICAgICAgICAgICAgICAweDAwMDAwMTAwCisKKy8vLworLy8vIElmIHNldCwgaWRlbnRpZmllcyBlbmFibGVkIGV4dGVybmFsIGludGVycnVwdHMKKy8vLworI2RlZmluZSBQWEVfSFdTVEFUX1NPRlRXQVJFX0lOVF9FTkFCTEVEICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFBYRV9IV1NUQVRfVFhfQ09NUExFVEVfSU5UX0VOQUJMRUQgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUFhFX0hXU1RBVF9QQUNLRVRfUlhfSU5UX0VOQUJMRUQgICAgMHgwMDAwMDAyMAorI2RlZmluZSBQWEVfSFdTVEFUX0NNRF9DT01QTEVURV9JTlRfRU5BQkxFRCAweDAwMDAwMDEwCisKKy8vLworLy8vIElmIHNldCwgaWRlbnRpZmllcyBwZW5kaW5nIGludGVycnVwdHMKKy8vLworI2RlZmluZSBQWEVfSFdTVEFUX1NPRlRXQVJFX0lOVF9QRU5ESU5HICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBYRV9IV1NUQVRfVFhfQ09NUExFVEVfSU5UX1BFTkRJTkcgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUFhFX0hXU1RBVF9QQUNLRVRfUlhfSU5UX1BFTkRJTkcgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQWEVfSFdTVEFUX0NNRF9DT01QTEVURV9JTlRfUEVORElORyAweDAwMDAwMDAxCisKKy8vLworLy8vIENvbW1hbmQgcG9ydCBkZWZpbml0aW9ucworLy8vCisKKy8vLworLy8vIElmIHNldCwgQ0RCIGlkZW50aWZpZWQgaW4gQ0RCYWRkciBwb3J0IGlzIGdpdmVuIHRvIFVOREkuCisvLy8gSWYgbm90IHNldCwgb3RoZXIgYml0cyBpbiB0aGlzIHdvcmQgd2lsbCBiZSBwcm9jZXNzZWQuCisvLy8KKyNkZWZpbmUgUFhFX0hXQ01EX0lTU1VFX0NPTU1BTkQgICAweDgwMDAwMDAwCisjZGVmaW5lIFBYRV9IV0NNRF9JTlRTX0FORF9GSUxUUyAgMHgwMDAwMDAwMAorCisvLy8KKy8vLyBVc2UgdGhlc2UgdG8gZW5hYmxlL2Rpc2FibGUgcmVjZWl2ZSBmaWx0ZXJzLgorLy8vCisjZGVmaW5lIFBYRV9IV0NNRF9QUk9NSVNDVU9VU19NVUxUSUNBU1RfUlhfRU5BQkxFIDB4MDAwMDEwMDAKKyNkZWZpbmUgUFhFX0hXQ01EX1BST01JU0NVT1VTX1JYX0VOQUJMRSAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBQWEVfSFdDTURfQlJPQURDQVNUX1JYX0VOQUJMRSAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBYRV9IV0NNRF9NVUxUSUNBU1RfUlhfRU5BQkxFICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgUFhFX0hXQ01EX1VOSUNBU1RfUlhfRU5BQkxFICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorCisvLy8KKy8vLyBVc2UgdGhlc2UgdG8gZW5hYmxlL2Rpc2FibGUgZXh0ZXJuYWwgaW50ZXJydXB0cworLy8vCisjZGVmaW5lIFBYRV9IV0NNRF9TT0ZUV0FSRV9JTlRfRU5BQkxFICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFBYRV9IV0NNRF9UWF9DT01QTEVURV9JTlRfRU5BQkxFICAweDAwMDAwMDQwCisjZGVmaW5lIFBYRV9IV0NNRF9QQUNLRVRfUlhfSU5UX0VOQUJMRSAgICAweDAwMDAwMDIwCisjZGVmaW5lIFBYRV9IV0NNRF9DTURfQ09NUExFVEVfSU5UX0VOQUJMRSAweDAwMDAwMDEwCisKKy8vLworLy8vIFVzZSB0aGVzZSB0byBjbGVhciBwZW5kaW5nIGV4dGVybmFsIGludGVycnVwdHMKKy8vLworI2RlZmluZSBQWEVfSFdDTURfQ0xFQVJfU09GVFdBUkVfSU5UICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBQWEVfSFdDTURfQ0xFQVJfVFhfQ09NUExFVEVfSU5UICAgMHgwMDAwMDAwNAorI2RlZmluZSBQWEVfSFdDTURfQ0xFQVJfUEFDS0VUX1JYX0lOVCAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQWEVfSFdDTURfQ0xFQVJfQ01EX0NPTVBMRVRFX0lOVCAgMHgwMDAwMDAwMQorCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9zd191bmRpIHsKKyAgUFhFX1VJTlQzMiAgU2lnbmF0dXJlOyAgICAgIC8vLzwgUFhFX1JPTUlEX1NJR05BVFVSRQorICBQWEVfVUlOVDggICBMZW47ICAgICAgICAgICAgLy8vPCBzaXplb2YoUFhFX1NXX1VOREkpCisgIFBYRV9VSU5UOCAgIEZ1ZGdlOyAgICAgICAgICAvLy88IG1ha2VzIDgtYml0IGNrc3VtIHplcm8KKyAgUFhFX1VJTlQ4ICAgUmV2OyAgICAgICAgICAgIC8vLzwgUFhFX1JPTUlEX1JFVgorICBQWEVfVUlOVDggICBJRmNudDsgICAgICAgICAgLy8vPCBwaHlzaWNhbCBjb25uZWN0b3IgY291bnQKKyAgUFhFX1VJTlQ4ICAgTWFqb3JWZXI7ICAgICAgIC8vLzwgUFhFX1JPTUlEX01BSk9SVkVSCisgIFBYRV9VSU5UOCAgIE1pbm9yVmVyOyAgICAgICAvLy88IFBYRV9ST01JRF9NSU5PUlZFUgorICBQWEVfVUlOVDE2ICByZXNlcnZlZDE7ICAgICAgLy8vPCB6ZXJvLCBub3QgdXNlZAorICBQWEVfVUlOVDMyICBJbXBsZW1lbnRhdGlvbjsgLy8vPCBJbXBsZW1lbnRhdGlvbiBmbGFncworICBQWEVfVUlOVDY0ICBFbnRyeVBvaW50OyAgICAgLy8vPCBBUEkgZW50cnkgcG9pbnQKKyAgUFhFX1VJTlQ4ICAgcmVzZXJ2ZWQyWzNdOyAgIC8vLzwgemVybywgbm90IHVzZWQKKyAgUFhFX1VJTlQ4ICAgQnVzQ250OyAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJ1c3R5cGVzIHN1cHBvcnRlZAorICBQWEVfVUlOVDMyICBCdXNUeXBlWzFdOyAgICAgLy8vPCBsaXN0IG9mIHN1cHBvcnRlZCBidXN0eXBlcworfSBQWEVfU1dfVU5ESTsKKwordHlwZWRlZiB1bmlvbiB1X3B4ZV91bmRpIHsKKyAgUFhFX0hXX1VOREkgaHc7CisgIFBYRV9TV19VTkRJIHN3OworfSBQWEVfVU5ESTsKKworLy8vCisvLy8gU2lnbmF0dXJlIG9mICFQWEUgc3RydWN0dXJlCisvLy8KKyNkZWZpbmUgUFhFX1JPTUlEX1NJR05BVFVSRSBQWEVfQlVTVFlQRSAoJyEnLCAnUCcsICdYJywgJ0UnKQorCisvLy8KKy8vLyAhUFhFIHN0cnVjdHVyZSBmb3JtYXQgcmV2aXNpb24KKy8vLworI2RlZmluZSBQWEVfUk9NSURfUkVWIDB4MDIKKworLy8vCisvLy8gVU5ESSBjb21tYW5kIGludGVyZmFjZSByZXZpc2lvbi4gIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHRoYXQgZ2V0IHNlbnQKKy8vLyBpbiBvcHRpb24gOTQgKENsaWVudCBOZXR3b3JrIEludGVyZmFjZSBJZGVudGlmaWVyKSBpbiB0aGUgREhDUCBEaXNjb3ZlcgorLy8vIGFuZCBQWEUgQm9vdCBTZXJ2ZXIgUmVxdWVzdCBwYWNrZXRzLgorLy8vCisjZGVmaW5lIFBYRV9ST01JRF9NQUpPUlZFUiAgICAweDAzCisjZGVmaW5lIFBYRV9ST01JRF9NSU5PUlZFUiAgICAweDAxCisKKy8vLworLy8vIEltcGxlbWVudGF0aW9uIGZsYWdzCisvLy8KKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9IV19VTkRJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfU1dfVklSVF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QXzY0QklUX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9GUkFHX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfQ01EX0xJTktfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX0NNRF9RVUVVRV9TVVBQT1JURUQgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9NVUxUSV9GUkFNRV9TVVBQT1JURUQgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTlZEQVRBX1NVUFBPUlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMEMwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX05WREFUQV9CVUxLX1dSSVRBQkxFICAgICAgICAgICAgICAgIDB4MDAwMDBDMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9OVkRBVEFfU1BBUlNFX1dSSVRBQkxFICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfTlZEQVRBX1JFQURfT05MWSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX05WREFUQV9OT1RfQVZBSUxBQkxFICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9TVEFUSVNUSUNTX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfU1RBVElPTl9BRERSX1NFVFRBQkxFICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX1BST01JU0NVT1VTX01VTFRJQ0FTVF9SWF9TVVBQT1JURUQgIDB4MDAwMDAwODAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9QUk9NSVNDVU9VU19SWF9TVVBQT1JURUQgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFBYRV9ST01JRF9JTVBfQlJPQURDQVNUX1JYX1NVUFBPUlRFRCAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBQWEVfUk9NSURfSU1QX0ZJTFRFUkVEX01VTFRJQ0FTVF9SWF9TVVBQT1JURUQgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9TT0ZUV0FSRV9JTlRfU1VQUE9SVEVEICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBYRV9ST01JRF9JTVBfVFhfQ09NUExFVEVfSU5UX1NVUFBPUlRFRCAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBQWEVfUk9NSURfSU1QX1BBQ0tFVF9SWF9JTlRfU1VQUE9SVEVEICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUFhFX1JPTUlEX0lNUF9DTURfQ09NUExFVEVfSU5UX1NVUFBPUlRFRCAgICAgICAgICAweDAwMDAwMDAxCisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NkYiB7CisgIFBYRV9PUENPREUgICAgT3BDb2RlOworICBQWEVfT1BGTEFHUyAgIE9wRmxhZ3M7CisgIFBYRV9VSU5UMTYgICAgQ1BCc2l6ZTsKKyAgUFhFX1VJTlQxNiAgICBEQnNpemU7CisgIFBYRV9VSU5UNjQgICAgQ1BCYWRkcjsKKyAgUFhFX1VJTlQ2NCAgICBEQmFkZHI7CisgIFBYRV9TVEFUQ09ERSAgU3RhdENvZGU7CisgIFBYRV9TVEFURkxBR1MgU3RhdEZsYWdzOworICBQWEVfVUlOVDE2ICAgIElGbnVtOworICBQWEVfQ09OVFJPTCAgIENvbnRyb2w7Cit9IFBYRV9DREI7CisKK3R5cGVkZWYgdW5pb24gdV9weGVfaXBfYWRkciB7CisgIFBYRV9JUFY2ICBJUHY2OworICBQWEVfSVBWNCAgSVB2NDsKK30gUFhFX0lQX0FERFI7CisKK3R5cGVkZWYgdW5pb24gcHhlX2RldmljZSB7CisgIC8vLworICAvLy8gUENJIGFuZCBQQyBDYXJkIE5JQ3MgYXJlIGJvdGggaWRlbnRpZmllZCB1c2luZyBidXMsIGRldmljZQorICAvLy8gYW5kIGZ1bmN0aW9uIG51bWJlcnMuICBGb3IgUEMgQ2FyZCwgdGhpcyBtYXkgcmVxdWlyZSBQQworICAvLy8gQ2FyZCBzZXJ2aWNlcyB0byBiZSBsb2FkZWQgaW4gdGhlIEJJT1Mgb3IgcHJlYm9vdAorICAvLy8gZW52aXJvbm1lbnQuCisgIC8vLworICBzdHJ1Y3QgeworICAgIC8vLworICAgIC8vLyBTZWUgUy9XIFVOREkgUk9NSUQgc3RydWN0dXJlIGRlZmluaXRpb24gZm9yIFBDSSBhbmQKKyAgICAvLy8gUENDIEJ1c1R5cGUgZGVmaW5pdGlvbnMuCisgICAgLy8vCisgICAgUFhFX1VJTlQzMiAgQnVzVHlwZTsKKworICAgIC8vLworICAgIC8vLyBCdXMsIGRldmljZSAmIGZ1bmN0aW9uIG51bWJlcnMgdGhhdCBsb2NhdGUgdGhpcyBkZXZpY2UuCisgICAgLy8vCisgICAgUFhFX1VJTlQxNiAgQnVzOworICAgIFBYRV9VSU5UOCAgIERldmljZTsKKyAgICBQWEVfVUlOVDggICBGdW5jdGlvbjsKKyAgfQorICBQQ0ksIFBDQzsKKworfSBQWEVfREVWSUNFOworCisvLy8KKy8vLyBjcGIgYW5kIGRiIGRlZmluaXRpb25zCisvLy8KKyNkZWZpbmUgTUFYX1BDSV9DT05GSUdfTEVOICAgIDY0ICAvLy88ICMgb2YgZHdvcmRzCisjZGVmaW5lIE1BWF9FRVBST01fTEVOICAgICAgICAxMjggLy8vPCAjIG9mIGR3b3JkcworI2RlZmluZSBNQVhfWE1JVF9CVUZGRVJTICAgICAgMzIgIC8vLzwgcmVjeWNsaW5nIFEgbGVuZ3RoIGZvciB4bWl0X2RvbmUKKyNkZWZpbmUgTUFYX01DQVNUX0FERFJFU1NfQ05UIDgKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3N0YXJ0XzMwIHsKKyAgLy8vCisgIC8vLyBQWEVfVk9JRCBEZWxheShVSU5UTiBtaWNyb3NlY29uZHMpOworICAvLy8KKyAgLy8vIFVOREkgd2lsbCBuZXZlciByZXF1ZXN0IGEgZGVsYXkgc21hbGxlciB0aGFuIDEwIG1pY3Jvc2Vjb25kcworICAvLy8gYW5kIHdpbGwgYWx3YXlzIHJlcXVlc3QgZGVsYXlzIGluIGluY3JlbWVudHMgb2YgMTAgbWljcm9zZWNvbmRzLgorICAvLy8gVGhlIERlbGF5KCkgQ2FsbEJhY2sgcm91dGluZSBtdXN0IGRlbGF5IGJldHdlZW4gbiBhbmQgbiArIDEwCisgIC8vLyBtaWNyb3NlY29uZHMgYmVmb3JlIHJldHVybmluZyBjb250cm9sIHRvIHRoZSBVTkRJLgorICAvLy8KKyAgLy8vIFRoaXMgZmllbGQgY2Fubm90IGJlIHNldCB0byB6ZXJvLgorICAvLy8KKyAgVUlOVDY0ICBEZWxheTsKKworICAvLy8KKyAgLy8vIFBYRV9WT0lEIEJsb2NrKFVJTlQzMiBlbmFibGUpOworICAvLy8KKyAgLy8vIFVOREkgbWF5IG5lZWQgdG8gYmxvY2sgbXVsdGktdGhyZWFkZWQvbXVsdGktcHJvY2Vzc29yIGFjY2VzcyB0bworICAvLy8gY3JpdGljYWwgY29kZSBzZWN0aW9ucyB3aGVuIHByb2dyYW1taW5nIG9yIGFjY2Vzc2luZyB0aGUgbmV0d29yaworICAvLy8gZGV2aWNlLiAgVG8gdGhpcyBlbmQsIGEgYmxvY2tpbmcgc2VydmljZSBpcyBuZWVkZWQgYnkgdGhlIFVOREkuCisgIC8vLyBXaGVuIFVOREkgbmVlZHMgYSBibG9jaywgaXQgd2lsbCBjYWxsIEJsb2NrKCkgcGFzc2luZyBhIG5vbi16ZXJvCisgIC8vLyB2YWx1ZS4gIFdoZW4gVU5ESSBubyBsb25nZXIgbmVlZHMgYSBibG9jaywgaXQgd2lsbCBjYWxsIEJsb2NrKCkKKyAgLy8vIHdpdGggYSB6ZXJvIHZhbHVlLiAgV2hlbiBjYWxsZWQsIGlmIHRoZSBCbG9jaygpIGlzIGFscmVhZHkgZW5hYmxlZCwKKyAgLy8vIGRvIG5vdCByZXR1cm4gY29udHJvbCB0byB0aGUgVU5ESSB1bnRpbCB0aGUgcHJldmlvdXMgQmxvY2soKSBpcworICAvLy8gZGlzYWJsZWQuCisgIC8vLworICAvLy8gVGhpcyBmaWVsZCBjYW5ub3QgYmUgc2V0IHRvIHplcm8uCisgIC8vLworICBVSU5UNjQgIEJsb2NrOworCisgIC8vLworICAvLy8gUFhFX1ZPSUQgVmlydDJQaHlzKFVJTlQ2NCB2aXJ0dWFsLCBVSU5UNjQgcGh5c2ljYWxfcHRyKTsKKyAgLy8vCisgIC8vLyBVTkRJIHdpbGwgcGFzcyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIGEgYnVmZmVyIGFuZCB0aGUgdmlydHVhbAorICAvLy8gYWRkcmVzcyBvZiBhIDY0LWJpdCBwaHlzaWNhbCBidWZmZXIuICBDb252ZXJ0IHRoZSB2aXJ0dWFsIGFkZHJlc3MKKyAgLy8vIHRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgcGh5c2ljYWwgYWRkcmVzcworICAvLy8gYnVmZmVyLiAgSWYgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzIGFyZSB0aGUgc2FtZSwganVzdAorICAvLy8gY29weSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBUaGlzIGZpZWxkIGNhbiBiZSBzZXQgdG8gemVybyBpZiB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBhZGRyZXNzZXMKKyAgLy8vIGFyZSBlcXVhbC4KKyAgLy8vCisgIFVJTlQ2NCAgVmlydDJQaHlzOworICAvLy8KKyAgLy8vIFBYRV9WT0lEIE1lbV9JTyhVSU5UOCByZWFkX3dyaXRlLCBVSU5UOCBsZW4sIFVJTlQ2NCBwb3J0LAorICAvLy8gICAgICAgICAgICAgIFVJTlQ2NCBidWZfYWRkcik7CisgIC8vLworICAvLy8gVU5ESSB3aWxsIHJlYWQgb3Igd3JpdGUgdGhlIGRldmljZSBpbyBzcGFjZSB1c2luZyB0aGlzIGNhbGwgYmFjaworICAvLy8gZnVuY3Rpb24uIEl0IHBhc3NlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFzIHRoZSBsZW4gcGFyYW1ldGVyIGFuZCBpdAorICAvLy8gd2lsbCBiZSBlaXRoZXIgMSwyLDQgb3IgOC4KKyAgLy8vCisgIC8vLyBUaGlzIGZpZWxkIGNhbiBub3QgYmUgc2V0IHRvIHplcm8uCisgIC8vLworICBVSU5UNjQgIE1lbV9JTzsKK30gUFhFX0NQQl9TVEFSVF8zMDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3N0YXJ0XzMxIHsKKyAgLy8vCisgIC8vLyBQWEVfVk9JRCBEZWxheShVSU5UNjQgVW5xSWQsIFVJTlROIG1pY3Jvc2Vjb25kcyk7CisgIC8vLworICAvLy8gVU5ESSB3aWxsIG5ldmVyIHJlcXVlc3QgYSBkZWxheSBzbWFsbGVyIHRoYW4gMTAgbWljcm9zZWNvbmRzCisgIC8vLyBhbmQgd2lsbCBhbHdheXMgcmVxdWVzdCBkZWxheXMgaW4gaW5jcmVtZW50cyBvZiAxMCBtaWNyb3NlY29uZHMuCisgIC8vLyBUaGUgRGVsYXkoKSBDYWxsQmFjayByb3V0aW5lIG11c3QgZGVsYXkgYmV0d2VlbiBuIGFuZCBuICsgMTAKKyAgLy8vIG1pY3Jvc2Vjb25kcyBiZWZvcmUgcmV0dXJuaW5nIGNvbnRyb2wgdG8gdGhlIFVOREkuCisgIC8vLworICAvLy8gVGhpcyBmaWVsZCBjYW5ub3QgYmUgc2V0IHRvIHplcm8uCisgIC8vLworICBVSU5UNjQgIERlbGF5OworCisgIC8vLworICAvLy8gUFhFX1ZPSUQgQmxvY2soVUlOVDY0IHVucV9pZCwgVUlOVDMyIGVuYWJsZSk7CisgIC8vLworICAvLy8gVU5ESSBtYXkgbmVlZCB0byBibG9jayBtdWx0aS10aHJlYWRlZC9tdWx0aS1wcm9jZXNzb3IgYWNjZXNzIHRvCisgIC8vLyBjcml0aWNhbCBjb2RlIHNlY3Rpb25zIHdoZW4gcHJvZ3JhbW1pbmcgb3IgYWNjZXNzaW5nIHRoZSBuZXR3b3JrCisgIC8vLyBkZXZpY2UuICBUbyB0aGlzIGVuZCwgYSBibG9ja2luZyBzZXJ2aWNlIGlzIG5lZWRlZCBieSB0aGUgVU5ESS4KKyAgLy8vIFdoZW4gVU5ESSBuZWVkcyBhIGJsb2NrLCBpdCB3aWxsIGNhbGwgQmxvY2soKSBwYXNzaW5nIGEgbm9uLXplcm8KKyAgLy8vIHZhbHVlLiAgV2hlbiBVTkRJIG5vIGxvbmdlciBuZWVkcyBhIGJsb2NrLCBpdCB3aWxsIGNhbGwgQmxvY2soKQorICAvLy8gd2l0aCBhIHplcm8gdmFsdWUuICBXaGVuIGNhbGxlZCwgaWYgdGhlIEJsb2NrKCkgaXMgYWxyZWFkeSBlbmFibGVkLAorICAvLy8gZG8gbm90IHJldHVybiBjb250cm9sIHRvIHRoZSBVTkRJIHVudGlsIHRoZSBwcmV2aW91cyBCbG9jaygpIGlzCisgIC8vLyBkaXNhYmxlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGZpZWxkIGNhbm5vdCBiZSBzZXQgdG8gemVyby4KKyAgLy8vCisgIFVJTlQ2NCAgQmxvY2s7CisKKyAgLy8vCisgIC8vLyBQWEVfVk9JRCBWaXJ0MlBoeXMoVUlOVDY0IFVucUlkLCBVSU5UNjQgdmlydHVhbCwgVUlOVDY0IHBoeXNpY2FsX3B0cik7CisgIC8vLworICAvLy8gVU5ESSB3aWxsIHBhc3MgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiBhIGJ1ZmZlciBhbmQgdGhlIHZpcnR1YWwKKyAgLy8vIGFkZHJlc3Mgb2YgYSA2NC1iaXQgcGh5c2ljYWwgYnVmZmVyLiAgQ29udmVydCB0aGUgdmlydHVhbCBhZGRyZXNzCisgIC8vLyB0byBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHBoeXNpY2FsIGFkZHJlc3MKKyAgLy8vIGJ1ZmZlci4gIElmIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBhcmUgdGhlIHNhbWUsIGp1c3QKKyAgLy8vIGNvcHkgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byB0aGUgcGh5c2ljYWwgYWRkcmVzcyBidWZmZXIuCisgIC8vLworICAvLy8gVGhpcyBmaWVsZCBjYW4gYmUgc2V0IHRvIHplcm8gaWYgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzCisgIC8vLyBhcmUgZXF1YWwuCisgIC8vLworICBVSU5UNjQgIFZpcnQyUGh5czsKKyAgLy8vCisgIC8vLyBQWEVfVk9JRCBNZW1fSU8oVUlOVDY0IFVucUlkLCBVSU5UOCByZWFkX3dyaXRlLCBVSU5UOCBsZW4sIFVJTlQ2NCBwb3J0LAorICAvLy8gICAgICAgICAgICAgIFVJTlQ2NCBidWZfYWRkcik7CisgIC8vLworICAvLy8gVU5ESSB3aWxsIHJlYWQgb3Igd3JpdGUgdGhlIGRldmljZSBpbyBzcGFjZSB1c2luZyB0aGlzIGNhbGwgYmFjaworICAvLy8gZnVuY3Rpb24uIEl0IHBhc3NlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFzIHRoZSBsZW4gcGFyYW1ldGVyIGFuZCBpdAorICAvLy8gd2lsbCBiZSBlaXRoZXIgMSwyLDQgb3IgOC4KKyAgLy8vCisgIC8vLyBUaGlzIGZpZWxkIGNhbiBub3QgYmUgc2V0IHRvIHplcm8uCisgIC8vLworICBVSU5UNjQgIE1lbV9JTzsKKyAgLy8vCisgIC8vLyBQWEVfVk9JRCBNYXBfTWVtKFVJTlQ2NCB1bnFfaWQsIFVJTlQ2NCB2aXJ0dWFsX2FkZHIsIFVJTlQzMiBzaXplLAorICAvLy8gICAgICAgICAgICAgICAgIFVJTlQzMiBEaXJlY3Rpb24sIFVJTlQ2NCBtYXBwZWRfYWRkcik7CisgIC8vLworICAvLy8gVU5ESSB3aWxsIHBhc3MgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiBhIGJ1ZmZlciwgZGlyZWN0aW9uIG9mIHRoZSBkYXRhCisgIC8vLyBmbG93IGZyb20vdG8gdGhlIG1hcHBlZCBidWZmZXIgKHRoZSBjb25zdGFudHMgYXJlIGRlZmluZWQgYmVsb3cpCisgIC8vLyBhbmQgYSBwbGFjZSBob2xkZXIgKHBvaW50ZXIpIGZvciB0aGUgbWFwcGVkIGFkZHJlc3MuCisgIC8vLyBUaGlzIGNhbGwgd2lsbCBNYXAgdGhlIGdpdmVuIGFkZHJlc3MgdG8gYSBwaHlzaWNhbCBETUEgYWRkcmVzcyBhbmQgd3JpdGUKKyAgLy8vIHRoZSByZXN1bHQgdG8gdGhlIG1hcHBlZF9hZGRyIHBvaW50ZXIuICBJZiB0aGVyZSBpcyBubyBuZWVkIHRvCisgIC8vLyBtYXAgdGhlIGdpdmVuIGFkZHJlc3MgdG8gYSBsb3dlciBhZGRyZXNzIChpLmUuIHRoZSBnaXZlbiBhZGRyZXNzIGlzCisgIC8vLyBhc3NvY2lhdGVkIHdpdGggYSBwaHlzaWNhbCBhZGRyZXNzIHRoYXQgaXMgYWxyZWFkeSBjb21wYXRpYmxlIHRvIGJlCisgIC8vLyB1c2VkIHdpdGggdGhlIERNQSwgaXQgY29udmVydHMgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcyB0byBpdCdzCisgIC8vLyBwaHlzaWNhbCBhZGRyZXNzIGFuZCB3cml0ZSB0aGF0IGluIHRoZSBtYXBwZWQgYWRkcmVzcyBwb2ludGVyLgorICAvLy8KKyAgLy8vIFRoaXMgZmllbGQgY2FuIGJlIHNldCB0byB6ZXJvIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcgc2VydmljZSBhdmFpbGFibGUKKyAgLy8vCisgIFVJTlQ2NCAgTWFwX01lbTsKKworICAvLy8KKyAgLy8vIFBYRV9WT0lEIFVuTWFwX01lbShVSU5UNjQgdW5xX2lkLCBVSU5UNjQgdmlydHVhbF9hZGRyLCBVSU5UMzIgc2l6ZSwKKyAgLy8vICAgICAgICAgICAgVUlOVDMyIERpcmVjdGlvbiwgVUlOVDY0IG1hcHBlZF9hZGRyKTsKKyAgLy8vCisgIC8vLyBVTkRJIHdpbGwgcGFzcyB0aGUgdmlydHVhbCBhbmQgbWFwcGVkIGFkZHJlc3NlcyBvZiBhIGJ1ZmZlcgorICAvLy8gVGhpcyBjYWxsIHdpbGwgdW4gbWFwIHRoZSBnaXZlbiBhZGRyZXNzCisgIC8vLworICAvLy8gVGhpcyBmaWVsZCBjYW4gYmUgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gdW5tYXBwaW5nIHNlcnZpY2UgYXZhaWxhYmxlCisgIC8vLworICBVSU5UNjQgIFVuTWFwX01lbTsKKworICAvLy8KKyAgLy8vIFBYRV9WT0lEIFN5bmNfTWVtKFVJTlQ2NCB1bnFfaWQsIFVJTlQ2NCB2aXJ0dWFsLAorICAvLy8gICAgICAgICAgICBVSU5UMzIgc2l6ZSwgVUlOVDMyIERpcmVjdGlvbiwgVUlOVDY0IG1hcHBlZF9hZGRyKTsKKyAgLy8vCisgIC8vLyBVTkRJIHdpbGwgcGFzcyB0aGUgdmlydHVhbCBhbmQgbWFwcGVkIGFkZHJlc3NlcyBvZiBhIGJ1ZmZlcgorICAvLy8gVGhpcyBjYWxsIHdpbGwgc3luY2hyb25pemUgdGhlIGNvbnRlbnRzIG9mIGJvdGggdGhlIHZpcnR1YWwgYW5kIG1hcHBlZAorICAvLy8gYnVmZmVycyBmb3IgdGhlIGdpdmVuIERpcmVjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGZpZWxkIGNhbiBiZSBzZXQgdG8gemVybyBpZiB0aGVyZSBpcyBubyBzZXJ2aWNlIGF2YWlsYWJsZQorICAvLy8KKyAgVUlOVDY0ICBTeW5jX01lbTsKKworICAvLy8KKyAgLy8vIHByb3RvY29sIGRyaXZlciBjYW4gcHJvdmlkZSBhbnl0aGluZyBmb3IgdGhpcyBVbmlxdWVfSUQsIFVOREkgcmVtZW1iZXJzCisgIC8vLyB0aGF0IGFzIGp1c3QgYSA2NGJpdCB2YWx1ZSBhc3NvY2FpdGVkIHRvIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWVkIGJ5CisgIC8vLyB0aGUgaWZudW0gYW5kIGdpdmVzIGl0IGJhY2sgYXMgYSBwYXJhbWV0ZXIgdG8gYWxsIHRoZSBjYWxsLWJhY2sgcm91dGluZXMKKyAgLy8vIHdoZW4gY2FsbGluZyBmb3IgdGhhdCBpbnRlcmZhY2UhCisgIC8vLworICBVSU5UNjQgIFVuaXF1ZV9JRDsKK30gUFhFX0NQQl9TVEFSVF8zMTsKKworI2RlZmluZSBUT19BTkRfRlJPTV9ERVZJQ0UgICAgMAorI2RlZmluZSBGUk9NX0RFVklDRSAgICAgICAgICAgMQorI2RlZmluZSBUT19ERVZJQ0UgICAgICAgICAgICAgMgorCisjZGVmaW5lIFBYRV9ERUxBWV9NSUxMSVNFQ09ORCAxMDAwCisjZGVmaW5lIFBYRV9ERUxBWV9TRUNPTkQgICAgICAxMDAwMDAwCisjZGVmaW5lIFBYRV9JT19SRUFEICAgICAgICAgICAwCisjZGVmaW5lIFBYRV9JT19XUklURSAgICAgICAgICAxCisjZGVmaW5lIFBYRV9NRU1fUkVBRCAgICAgICAgICAyCisjZGVmaW5lIFBYRV9NRU1fV1JJVEUgICAgICAgICA0CisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2RiX2dldF9pbml0X2luZm8geworICAvLy8KKyAgLy8vIE1pbmltdW0gbGVuZ3RoIG9mIGxvY2tlZCBtZW1vcnkgYnVmZmVyIHRoYXQgbXVzdCBiZSBnaXZlbiB0bworICAvLy8gdGhlIEluaXRpYWxpemUgY29tbWFuZC4gR2l2aW5nIFVOREkgbW9yZSBtZW1vcnkgd2lsbCBnZW5lcmFsbHkKKyAgLy8vIGdpdmUgYmV0dGVyIHBlcmZvcm1hbmNlLgorICAvLy8KKyAgLy8vIElmIE1lbW9yeVJlcXVpcmVkIGlzIHplcm8sIHRoZSBVTkRJIGRvZXMgbm90IG5lZWQgYW5kIHdpbGwgbm90CisgIC8vLyB1c2Ugc3lzdGVtIG1lbW9yeSB0byByZWNlaXZlIGFuZCB0cmFuc21pdCBwYWNrZXRzLgorICAvLy8KKyAgUFhFX1VJTlQzMiAgTWVtb3J5UmVxdWlyZWQ7CisKKyAgLy8vCisgIC8vLyBNYXhpbXVtIGZyYW1lIGRhdGEgbGVuZ3RoIGZvciBUeC9SeCBleGNsdWRpbmcgdGhlIG1lZGlhIGhlYWRlci4KKyAgLy8vCisgIFBYRV9VSU5UMzIgIEZyYW1lRGF0YUxlbjsKKworICAvLy8KKyAgLy8vIFN1cHBvcnRlZCBsaW5rIHNwZWVkcyBhcmUgaW4gdW5pdHMgb2YgbWVnYSBiaXRzLiAgQ29tbW9uIGV0aGVybmV0CisgIC8vLyB2YWx1ZXMgYXJlIDEwLCAxMDAgYW5kIDEwMDAuICBVbnVzZWQgTGlua1NwZWVkc1tdIGVudHJpZXMgYXJlIHplcm8KKyAgLy8vIGZpbGxlZC4KKyAgLy8vCisgIFBYRV9VSU5UMzIgIExpbmtTcGVlZHNbNF07CisKKyAgLy8vCisgIC8vLyBOdW1iZXIgb2Ygbm9uLXZvbGF0aWxlIHN0b3JhZ2UgaXRlbXMuCisgIC8vLworICBQWEVfVUlOVDMyICBOdkNvdW50OworCisgIC8vLworICAvLy8gV2lkdGggb2Ygbm9uLXZvbGF0aWxlIHN0b3JhZ2UgaXRlbSBpbiBieXRlcy4gIDAsIDEsIDIgb3IgNAorICAvLy8KKyAgUFhFX1VJTlQxNiAgTnZXaWR0aDsKKworICAvLy8KKyAgLy8vIE1lZGlhIGhlYWRlciBsZW5ndGguICBUaGlzIGlzIHRoZSB0eXBpY2FsIG1lZGlhIGhlYWRlciBsZW5ndGggZm9yCisgIC8vLyB0aGlzIFVOREkuICBUaGlzIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB3aGVuIGFsbG9jYXRpbmcgcmVjZWl2ZQorICAvLy8gYW5kIHRyYW5zbWl0IGJ1ZmZlcnMuCisgIC8vLworICBQWEVfVUlOVDE2ICBNZWRpYUhlYWRlckxlbjsKKworICAvLy8KKyAgLy8vIE51bWJlciBvZiBieXRlcyBpbiB0aGUgTklDIGhhcmR3YXJlIChNQUMpIGFkZHJlc3MuCisgIC8vLworICBQWEVfVUlOVDE2ICBIV2FkZHJMZW47CisKKyAgLy8vCisgIC8vLyBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgTUFDIGFkZHJlc3NlcyBpbiB0aGUgbXVsdGljYXN0CisgIC8vLyBNQUMgYWRkcmVzcyBmaWx0ZXIgbGlzdC4KKyAgLy8vCisgIFBYRV9VSU5UMTYgIE1DYXN0RmlsdGVyQ250OworCisgIC8vLworICAvLy8gRGVmYXVsdCBudW1iZXIgYW5kIHNpemUgb2YgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyB0aGF0IHdpbGwKKyAgLy8vIGJlIGFsbG9jYXRlZCBieSB0aGUgVU5ESS4gIElmIE1lbW9yeVJlcXVpcmVkIGlzIG5vbi16ZXJvLCB0aGlzCisgIC8vLyBhbGxvY2F0aW9uIHdpbGwgY29tZSBvdXQgb2YgdGhlIG1lbW9yeSBidWZmZXIgZ2l2ZW4gdG8gdGhlIEluaXRpYWxpemUKKyAgLy8vIGNvbW1hbmQuICBJZiBNZW1vcnlSZXF1aXJlZCBpcyB6ZXJvLCB0aGlzIGFsbG9jYXRpb24gd2lsbCBjb21lIG91dCBvZgorICAvLy8gbWVtb3J5IG9uIHRoZSBOSUMuCisgIC8vLworICBQWEVfVUlOVDE2ICBUeEJ1ZkNudDsKKyAgUFhFX1VJTlQxNiAgVHhCdWZTaXplOworICBQWEVfVUlOVDE2ICBSeEJ1ZkNudDsKKyAgUFhFX1VJTlQxNiAgUnhCdWZTaXplOworCisgIC8vLworICAvLy8gSGFyZHdhcmUgaW50ZXJmYWNlIHR5cGVzIGRlZmluZWQgaW4gdGhlIEFzc2lnbmVkIE51bWJlcnMgUkZDCisgIC8vLyBhbmQgdXNlZCBpbiBESENQIGFuZCBBUlAgcGFja2V0cy4KKyAgLy8vIFNlZSB0aGUgUFhFX0lGVFlQRSB0eXBlZGVmIGFuZCBQWEVfSUZUWVBFX3h4eCBtYWNyb3MuCisgIC8vLworICBQWEVfVUlOVDggICBJRnR5cGU7CisKKyAgLy8vCisgIC8vLyBTdXBwb3J0ZWQgZHVwbGV4LiAgU2VlIFBYRV9EVVBMRVhfeHh4eHggI2RlZmluZXMgYmVsb3cuCisgIC8vLworICBQWEVfVUlOVDggICBTdXBwb3J0ZWREdXBsZXhNb2RlczsKKworICAvLy8KKyAgLy8vIFN1cHBvcnRlZCBsb29wYmFjayBvcHRpb25zLiAgU2VlIFBYRV9MT09QQkFDS194eHh4eCAjZGVmaW5lcyBiZWxvdy4KKyAgLy8vCisgIFBYRV9VSU5UOCAgIFN1cHBvcnRlZExvb3BCYWNrTW9kZXM7Cit9IFBYRV9EQl9HRVRfSU5JVF9JTkZPOworCisjZGVmaW5lIFBYRV9NQVhfVFhSWF9VTklUX0VUSEVSICAgICAgICAgICAxNTAwCisKKyNkZWZpbmUgUFhFX0hXQUREUl9MRU5fRVRIRVIgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBQWEVfTUFDX0hFQURFUl9MRU5fRVRIRVIgICAgICAgICAgMHgwMDBFCisKKyNkZWZpbmUgUFhFX0RVUExFWF9FTkFCTEVfRlVMTF9TVVBQT1JURUQgIDEKKyNkZWZpbmUgUFhFX0RVUExFWF9GT1JDRV9GVUxMX1NVUFBPUlRFRCAgIDIKKworI2RlZmluZSBQWEVfTE9PUEJBQ0tfSU5URVJOQUxfU1VQUE9SVEVEICAgMQorI2RlZmluZSBQWEVfTE9PUEJBQ0tfRVhURVJOQUxfU1VQUE9SVEVEICAgMgorCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9wY2lfY29uZmlnX2luZm8geworICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIGZsYWcgZmllbGQgZm9yIHRoZSBQWEVfREJfR0VUX0NPTkZJR19JTkZPIHVuaW9uLgorICAvLy8gRm9yIFBDSSBidXMgZGV2aWNlcywgdGhpcyBmaWVsZCBpcyBzZXQgdG8gUFhFX0JVU1RZUEVfUENJLgorICAvLy8KKyAgVUlOVDMyICBCdXNUeXBlOworCisgIC8vLworICAvLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBQQ0kgbmV0d29yayBkZXZpY2UgdGhhdCB0aGlzIFVOREkgaW50ZXJmYWNlCisgIC8vLyBpcyBib3VuZCB0by4KKyAgLy8vCisgIFVJTlQxNiAgQnVzOworICBVSU5UOCAgIERldmljZTsKKyAgVUlOVDggICBGdW5jdGlvbjsKKworICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBmb3IgdGhpcworICAvLy8gbmV0d29yayBkZXZpY2UuCisgIC8vLworICB1bmlvbiB7CisgICAgVUlOVDggICBCeXRlWzI1Nl07CisgICAgVUlOVDE2ICBXb3JkWzEyOF07CisgICAgVUlOVDMyICBEd29yZFs2NF07CisgIH0gQ29uZmlnOworfSBQWEVfUENJX0NPTkZJR19JTkZPOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9wY2NfY29uZmlnX2luZm8geworICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIGZsYWcgZmllbGQgZm9yIHRoZSBQWEVfREJfR0VUX0NPTkZJR19JTkZPIHVuaW9uLgorICAvLy8gRm9yIFBDQyBidXMgZGV2aWNlcywgdGhpcyBmaWVsZCBpcyBzZXQgdG8gUFhFX0JVU1RZUEVfUENDLgorICAvLy8KKyAgUFhFX1VJTlQzMiAgQnVzVHlwZTsKKworICAvLy8KKyAgLy8vIFRoaXMgaWRlbnRpZmllcyB0aGUgUENDIG5ldHdvcmsgZGV2aWNlIHRoYXQgdGhpcyBVTkRJIGludGVyZmFjZQorICAvLy8gaXMgYm91bmQgdG8uCisgIC8vLworICBQWEVfVUlOVDE2ICBCdXM7CisgIFBYRV9VSU5UOCAgIERldmljZTsKKyAgUFhFX1VJTlQ4ICAgRnVuY3Rpb247CisKKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgY29weSBvZiB0aGUgUENDIGNvbmZpZ3VyYXRpb24gc3BhY2UgZm9yIHRoaXMKKyAgLy8vIG5ldHdvcmsgZGV2aWNlLgorICAvLy8KKyAgdW5pb24geworICAgIFBYRV9VSU5UOCAgIEJ5dGVbMjU2XTsKKyAgICBQWEVfVUlOVDE2ICBXb3JkWzEyOF07CisgICAgUFhFX1VJTlQzMiAgRHdvcmRbNjRdOworICB9IENvbmZpZzsKK30gUFhFX1BDQ19DT05GSUdfSU5GTzsKKwordHlwZWRlZiB1bmlvbiB1X3B4ZV9kYl9nZXRfY29uZmlnX2luZm8geworICBQWEVfUENJX0NPTkZJR19JTkZPICAgcGNpOworICBQWEVfUENDX0NPTkZJR19JTkZPICAgcGNjOworfSBQWEVfREJfR0VUX0NPTkZJR19JTkZPOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfaW5pdGlhbGl6ZSB7CisgIC8vLworICAvLy8gQWRkcmVzcyBvZiBmaXJzdCAobG93ZXN0KSBieXRlIG9mIHRoZSBtZW1vcnkgYnVmZmVyLiAgVGhpcyBidWZmZXIgbXVzdAorICAvLy8gYmUgaW4gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkgYW5kIGNhbm5vdCBiZSBzd2FwcGVkIG91dC4gIFRoZSBVTkRJCisgIC8vLyB3aWxsIGJlIHVzaW5nIHRoaXMgZm9yIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcmluZy4KKyAgLy8vCisgIFBYRV9VSU5UNjQgIE1lbW9yeUFkZHI7CisKKyAgLy8vCisgIC8vLyBNZW1vcnlMZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gTWVtb3J5UmVxdWlyZWQKKyAgLy8vIHJldHVybmVkIGJ5IHRoZSBHZXQgSW5pdCBJbmZvIGNvbW1hbmQuCisgIC8vLworICBQWEVfVUlOVDMyICBNZW1vcnlMZW5ndGg7CisKKyAgLy8vCisgIC8vLyBEZXNpcmVkIGxpbmsgc3BlZWQgaW4gTWJpdC9zZWMuICBDb21tb24gZXRoZXJuZXQgdmFsdWVzIGFyZSAxMCwgMTAwCisgIC8vLyBhbmQgMTAwMC4gIFNldHRpbmcgYSB2YWx1ZSBvZiB6ZXJvIHdpbGwgYXV0by1kZXRlY3QgYW5kL29yIHVzZSB0aGUKKyAgLy8vIGRlZmF1bHQgbGluayBzcGVlZCAob3BlcmF0aW9uIGRlcGVuZHMgb24gVU5ESS9OSUMgZnVuY3Rpb25hbGl0eSkuCisgIC8vLworICBQWEVfVUlOVDMyICBMaW5rU3BlZWQ7CisKKyAgLy8vCisgIC8vLyBTdWdnZXN0ZWQgbnVtYmVyIGFuZCBzaXplIG9mIHJlY2VpdmUgYW5kIHRyYW5zbWl0IGJ1ZmZlcnMgdG8KKyAgLy8vIGFsbG9jYXRlLiAgSWYgTWVtb3J5QWRkciBhbmQgTWVtb3J5TGVuZ3RoIGFyZSBub24temVybywgdGhpcworICAvLy8gYWxsb2NhdGlvbiBjb21lcyBvdXQgb2YgdGhlIHN1cHBsaWVkIG1lbW9yeSBidWZmZXIuICBJZiBNZW1vcnlBZGRyCisgIC8vLyBhbmQgTWVtb3J5TGVuZ3RoIGFyZSB6ZXJvLCB0aGlzIGFsbG9jYXRpb24gY29tZXMgb3V0IG9mIG1lbW9yeQorICAvLy8gb24gdGhlIE5JQy4KKyAgLy8vCisgIC8vLyBJZiB0aGVzZSBmaWVsZHMgYXJlIHNldCB0byB6ZXJvLCB0aGUgVU5ESSB3aWxsIGFsbG9jYXRlIGJ1ZmZlcgorICAvLy8gY291bnRzIGFuZCBzaXplcyBhcyBpdCBzZWVzIGZpdC4KKyAgLy8vCisgIFBYRV9VSU5UMTYgIFR4QnVmQ250OworICBQWEVfVUlOVDE2ICBUeEJ1ZlNpemU7CisgIFBYRV9VSU5UMTYgIFJ4QnVmQ250OworICBQWEVfVUlOVDE2ICBSeEJ1ZlNpemU7CisKKyAgLy8vCisgIC8vLyBUaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwgYW5kIG11c3QgYmUgemVybworICAvLy8gdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlcy4KKyAgLy8vCisgIFBYRV9VSU5UOCAgIER1cGxleE1vZGU7CisKKyAgUFhFX1VJTlQ4ICAgTG9vcEJhY2tNb2RlOworfSBQWEVfQ1BCX0lOSVRJQUxJWkU7CisKKyNkZWZpbmUgUFhFX0RVUExFWF9ERUZBVUxUICAgICAgMHgwMAorI2RlZmluZSBQWEVfRk9SQ0VfRlVMTF9EVVBMRVggICAweDAxCisjZGVmaW5lIFBYRV9FTkFCTEVfRlVMTF9EVVBMRVggIDB4MDIKKyNkZWZpbmUgUFhFX0ZPUkNFX0hBTEZfRFVQTEVYICAgMHgwNAorI2RlZmluZSBQWEVfRElTQUJMRV9GVUxMX0RVUExFWCAweDA4CisKKyNkZWZpbmUgTE9PUEJBQ0tfTk9STUFMICAgICAgICAgMAorI2RlZmluZSBMT09QQkFDS19JTlRFUk5BTCAgICAgICAxCisjZGVmaW5lIExPT1BCQUNLX0VYVEVSTkFMICAgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfaW5pdGlhbGl6ZSB7CisgIC8vLworICAvLy8gQWN0dWFsIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBmcm9tIHRoZSBzdXBwbGllZCBtZW1vcnkgYnVmZmVyLiAgVGhpcworICAvLy8gbWF5IGJlIGxlc3MgdGhhdCB0aGUgYW1vdW50IG9mIG1lbW9yeSBzdXBwbGxpZWQgYW5kIG1heSBiZSB6ZXJvIGlmCisgIC8vLyB0aGUgVU5ESSBhbmQgbmV0d29yayBkZXZpY2UgZG8gbm90IHVzZSBleHRlcm5hbCBtZW1vcnkgYnVmZmVycy4KKyAgLy8vCisgIC8vLyBNZW1vcnkgdXNlZCBieSB0aGUgVU5ESSBhbmQgbmV0d29yayBkZXZpY2UgaXMgYWxsb2NhdGVkIGZyb20gdGhlCisgIC8vLyBsb3dlc3QgbWVtb3J5IGJ1ZmZlciBhZGRyZXNzLgorICAvLy8KKyAgUFhFX1VJTlQzMiAgTWVtb3J5VXNlZDsKKworICAvLy8KKyAgLy8vIEFjdHVhbCBudW1iZXIgYW5kIHNpemUgb2YgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgYnVmZmVycyB0aGF0IHdlcmUKKyAgLy8vIGFsbG9jYXRlZC4KKyAgLy8vCisgIFBYRV9VSU5UMTYgIFR4QnVmQ250OworICBQWEVfVUlOVDE2ICBUeEJ1ZlNpemU7CisgIFBYRV9VSU5UMTYgIFJ4QnVmQ250OworICBQWEVfVUlOVDE2ICBSeEJ1ZlNpemU7Cit9IFBYRV9EQl9JTklUSUFMSVpFOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfcmVjZWl2ZV9maWx0ZXJzIHsKKyAgLy8vCisgIC8vLyBMaXN0IG9mIG11bHRpY2FzdCBNQUMgYWRkcmVzc2VzLiAgVGhpcyBsaXN0LCBpZiBwcmVzZW50LCB3aWxsCisgIC8vLyByZXBsYWNlIHRoZSBleGlzdGluZyBtdWx0aWNhc3QgTUFDIGFkZHJlc3MgZmlsdGVyIGxpc3QuCisgIC8vLworICBQWEVfTUFDX0FERFIgIE1DYXN0TGlzdFtNQVhfTUNBU1RfQUREUkVTU19DTlRdOworfSBQWEVfQ1BCX1JFQ0VJVkVfRklMVEVSUzsKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfcmVjZWl2ZV9maWx0ZXJzIHsKKyAgLy8vCisgIC8vLyBGaWx0ZXJlZCBtdWx0aWNhc3QgTUFDIGFkZHJlc3MgbGlzdC4KKyAgLy8vCisgIFBYRV9NQUNfQUREUiAgTUNhc3RMaXN0W01BWF9NQ0FTVF9BRERSRVNTX0NOVF07Cit9IFBYRV9EQl9SRUNFSVZFX0ZJTFRFUlM7CisKK3R5cGVkZWYgc3RydWN0IHNfcHhlX2NwYl9zdGF0aW9uX2FkZHJlc3MgeworICAvLy8KKyAgLy8vIElmIHN1cHBsaWVkIGFuZCBzdXBwb3J0ZWQsIHRoZSBjdXJyZW50IHN0YXRpb24gTUFDIGFkZHJlc3MKKyAgLy8vIHdpbGwgYmUgY2hhbmdlZC4KKyAgLy8vCisgIFBYRV9NQUNfQUREUiAgU3RhdGlvbkFkZHI7Cit9IFBYRV9DUEJfU1RBVElPTl9BRERSRVNTOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kcGJfc3RhdGlvbl9hZGRyZXNzIHsKKyAgLy8vCisgIC8vLyBDdXJyZW50IHN0YXRpb24gTUFDIGFkZHJlc3MuCisgIC8vLworICBQWEVfTUFDX0FERFIgIFN0YXRpb25BZGRyOworCisgIC8vLworICAvLy8gU3RhdGlvbiBicm9hZGNhc3QgTUFDIGFkZHJlc3MuCisgIC8vLworICBQWEVfTUFDX0FERFIgIEJyb2FkY2FzdEFkZHI7CisKKyAgLy8vCisgIC8vLyBQZXJtYW5lbnQgc3RhdGlvbiBNQUMgYWRkcmVzcy4KKyAgLy8vCisgIFBYRV9NQUNfQUREUiAgUGVybWFuZW50QWRkcjsKK30gUFhFX0RCX1NUQVRJT05fQUREUkVTUzsKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfc3RhdGlzdGljcyB7CisgIC8vLworICAvLy8gQml0IGZpZWxkIGlkZW50aWZ5aW5nIHdoYXQgc3RhdGlzdGljIGRhdGEgaXMgY29sbGVjdGVkIGJ5IHRoZQorICAvLy8gVU5ESS9OSUMuCisgIC8vLyBJZiBiaXQgMHgwMCBpcyBzZXQsIERhdGFbMHgwMF0gaXMgY29sbGVjdGVkLgorICAvLy8gSWYgYml0IDB4MDEgaXMgc2V0LCBEYXRhWzB4MDFdIGlzIGNvbGxlY3RlZC4KKyAgLy8vIElmIGJpdCAweDIwIGlzIHNldCwgRGF0YVsweDIwXSBpcyBjb2xsZWN0ZWQuCisgIC8vLyBJZiBiaXQgMHgyMSBpcyBzZXQsIERhdGFbMHgyMV0gaXMgY29sbGVjdGVkLgorICAvLy8gRXRjLgorICAvLy8KKyAgUFhFX1VJTlQ2NCAgU3VwcG9ydGVkOworCisgIC8vLworICAvLy8gU3RhdGlzdGljIGRhdGEuCisgIC8vLworICBQWEVfVUlOVDY0ICBEYXRhWzY0XTsKK30gUFhFX0RCX1NUQVRJU1RJQ1M7CisKKy8vLworLy8vIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQuICBJbmNsdWRlcyBmcmFtZXMgd2l0aCBlcnJvcnMgYW5kCisvLy8gZHJvcHBlZCBmcmFtZXMuCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfVE9UQUxfRlJBTUVTICAweDAwCisKKy8vLworLy8vIE51bWJlciBvZiB2YWxpZCBmcmFtZXMgcmVjZWl2ZWQgYW5kIGNvcGllZCBpbnRvIHJlY2VpdmUgYnVmZmVycy4KKy8vLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9HT09EX0ZSQU1FUyAweDAxCisKKy8vLworLy8vIE51bWJlciBvZiBmcmFtZXMgYmVsb3cgdGhlIG1pbmltdW0gbGVuZ3RoIGZvciB0aGUgbWVkaWEuCisvLy8gVGhpcyB3b3VsZCBiZSA8NjQgZm9yIGV0aGVybmV0LgorLy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX1VOREVSU0laRV9GUkFNRVMgIDB4MDIKKworLy8vCisvLy8gTnVtYmVyIG9mIGZyYW1lcyBsb25nZXIgdGhhbiB0aGUgbWF4bWludW0gbGVuZ3RoIGZvciB0aGUKKy8vLyBtZWRpYS4gIFRoaXMgd291bGQgYmUgPjE1MDAgZm9yIGV0aGVybmV0LgorLy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX09WRVJTSVpFX0ZSQU1FUyAweDAzCisKKy8vLworLy8vIFZhbGlkIGZyYW1lcyB0aGF0IHdlcmUgZHJvcHBlZCBiZWNhdXNlIHJlY2VpdmUgYnVmZmVycyB3ZXJlIGZ1bGwuCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfRFJPUFBFRF9GUkFNRVMgIDB4MDQKKworLy8vCisvLy8gTnVtYmVyIG9mIHZhbGlkIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIGFuZCBub3QgZHJvcHBlZC4KKy8vLworI2RlZmluZSBQWEVfU1RBVElTVElDU19SWF9VTklDQVNUX0ZSQU1FUyAgMHgwNQorCisvLy8KKy8vLyBOdW1iZXIgb2YgdmFsaWQgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBhbmQgbm90IGRyb3BwZWQuCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfQlJPQURDQVNUX0ZSQU1FUyAgMHgwNgorCisvLy8KKy8vLyBOdW1iZXIgb2YgdmFsaWQgbXV0bGljYXN0IGZyYW1lcyByZWNlaXZlZCBhbmQgbm90IGRyb3BwZWQuCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfUlhfTVVMVElDQVNUX0ZSQU1FUyAgMHgwNworCisvLy8KKy8vLyBOdW1iZXIgb2YgZnJhbWVzIHcvIENSQyBvciBhbGlnbm1lbnQgZXJyb3JzLgorLy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX0NSQ19FUlJPUl9GUkFNRVMgIDB4MDgKKworLy8vCisvLy8gVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLiAgSW5jbHVkZXMgZnJhbWVzIHdpdGggZXJyb3JzCisvLy8gYW5kIGRyb3BwZWQgZnJhbWVzLgorLy8vCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1JYX1RPVEFMX0JZVEVTIDB4MDkKKworLy8vCisvLy8gVHJhbnNtaXQgc3RhdGlzdGljcy4KKy8vLworI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9UT1RBTF9GUkFNRVMgICAgICAweDBBCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX0dPT0RfRlJBTUVTICAgICAgIDB4MEIKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfVU5ERVJTSVpFX0ZSQU1FUyAgMHgwQworI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9PVkVSU0laRV9GUkFNRVMgICAweDBECisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX0RST1BQRURfRlJBTUVTICAgIDB4MEUKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfVU5JQ0FTVF9GUkFNRVMgICAgMHgwRgorI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9CUk9BRENBU1RfRlJBTUVTICAweDEwCisjZGVmaW5lIFBYRV9TVEFUSVNUSUNTX1RYX01VTFRJQ0FTVF9GUkFNRVMgIDB4MTEKKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVFhfQ1JDX0VSUk9SX0ZSQU1FUyAgMHgxMgorI2RlZmluZSBQWEVfU1RBVElTVElDU19UWF9UT1RBTF9CWVRFUyAgICAgICAweDEzCisKKy8vLworLy8vIE51bWJlciBvZiBjb2xsaXNpb25zIGRldGVjdGlvbiBvbiB0aGlzIHN1Ym5ldC4KKy8vLworI2RlZmluZSBQWEVfU1RBVElTVElDU19DT0xMSVNJT05TIDB4MTQKKworLy8vCisvLy8gTnVtYmVyIG9mIGZyYW1lcyBkZXN0aW5lZCBmb3IgdW5zdXBwb3J0ZWQgcHJvdG9jb2wuCisvLy8KKyNkZWZpbmUgUFhFX1NUQVRJU1RJQ1NfVU5TVVBQT1JURURfUFJPVE9DT0wgMHgxNQorCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfbWNhc3RfaXBfdG9fbWFjIHsKKyAgLy8vCisgIC8vLyBNdWx0aWNhc3QgSVAgYWRkcmVzcyB0byBiZSBjb252ZXJ0ZWQgdG8gbXVsdGljYXN0IE1BQyBhZGRyZXNzLgorICAvLy8KKyAgUFhFX0lQX0FERFIgSVA7Cit9IFBYRV9DUEJfTUNBU1RfSVBfVE9fTUFDOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9tY2FzdF9pcF90b19tYWMgeworICAvLy8KKyAgLy8vIE11bHRpY2FzdCBNQUMgYWRkcmVzcy4KKyAgLy8vCisgIFBYRV9NQUNfQUREUiAgTUFDOworfSBQWEVfREJfTUNBU1RfSVBfVE9fTUFDOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfbnZkYXRhX3NwYXJzZSB7CisgIC8vLworICAvLy8gTnZEYXRhIGl0ZW0gbGlzdC4gIE9ubHkgaXRlbXMgaW4gdGhpcyBsaXN0IHdpbGwgYmUgdXBkYXRlZC4KKyAgLy8vCisgIHN0cnVjdCB7CisgICAgLy8vCisgICAgLy8vICBOb24tdm9sYXRpbGUgc3RvcmFnZSBhZGRyZXNzIHRvIGJlIGNoYW5nZWQuCisgICAgLy8vCisgICAgUFhFX1VJTlQzMiAgQWRkcjsKKworICAgIC8vLworICAgIC8vLyBEYXRhIGl0ZW0gdG8gd3JpdGUgaW50byBhYm92ZSBzdG9yYWdlIGFkZHJlc3MuCisgICAgLy8vCisgICAgdW5pb24geworICAgICAgUFhFX1VJTlQ4ICAgQnl0ZTsKKyAgICAgIFBYRV9VSU5UMTYgIFdvcmQ7CisgICAgICBQWEVfVUlOVDMyICBEd29yZDsKKyAgICB9IERhdGE7CisgIH0gSXRlbVtNQVhfRUVQUk9NX0xFTl07Cit9IFBYRV9DUEJfTlZEQVRBX1NQQVJTRTsKKworLy8vCisvLy8gV2hlbiB1c2luZyBidWxrIHVwZGF0ZSwgdGhlIHNpemUgb2YgdGhlIENQQiBzdHJ1Y3R1cmUgbXVzdCBiZQorLy8vIHRoZSBzYW1lIHNpemUgYXMgdGhlIG5vbi12b2xhdGlsZSBOSUMgc3RvcmFnZS4KKy8vLwordHlwZWRlZiB1bmlvbiB1X3B4ZV9jcGJfbnZkYXRhX2J1bGsgeworICAvLy8KKyAgLy8vIEFycmF5IG9mIGJ5dGUtd2lkZSBkYXRhIGl0ZW1zLgorICAvLy8KKyAgUFhFX1VJTlQ4ICAgQnl0ZVtNQVhfRUVQUk9NX0xFTiA8PCAyXTsKKworICAvLy8KKyAgLy8vIEFycmF5IG9mIHdvcmQtd2lkZSBkYXRhIGl0ZW1zLgorICAvLy8KKyAgUFhFX1VJTlQxNiAgV29yZFtNQVhfRUVQUk9NX0xFTiA8PCAxXTsKKworICAvLy8KKyAgLy8vIEFycmF5IG9mIGR3b3JkLXdpZGUgZGF0YSBpdGVtcy4KKyAgLy8vCisgIFBYRV9VSU5UMzIgIER3b3JkW01BWF9FRVBST01fTEVOXTsKK30gUFhFX0NQQl9OVkRBVEFfQlVMSzsKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfZGJfbnZkYXRhIHsKKyAgLy8vCisgIC8vLyBBcnJheXMgb2YgZGF0YSBpdGVtcyBmcm9tIG5vbi12b2xhdGlsZSBzdG9yYWdlLgorICAvLy8KKyAgdW5pb24geworICAgIC8vLworICAgIC8vLyBBcnJheSBvZiBieXRlLXdpZGUgZGF0YSBpdGVtcy4KKyAgICAvLy8KKyAgICBQWEVfVUlOVDggICBCeXRlW01BWF9FRVBST01fTEVOIDw8IDJdOworCisgICAgLy8vCisgICAgLy8vIEFycmF5IG9mIHdvcmQtd2lkZSBkYXRhIGl0ZW1zLgorICAgIC8vLworICAgIFBYRV9VSU5UMTYgIFdvcmRbTUFYX0VFUFJPTV9MRU4gPDwgMV07CisKKyAgICAvLy8KKyAgICAvLy8gQXJyYXkgb2YgZHdvcmQtd2lkZSBkYXRhIGl0ZW1zLgorICAgIC8vLworICAgIFBYRV9VSU5UMzIgIER3b3JkW01BWF9FRVBST01fTEVOXTsKKyAgfSBEYXRhOworfSBQWEVfREJfTlZEQVRBOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9nZXRfc3RhdHVzIHsKKyAgLy8vCisgIC8vLyBMZW5ndGggb2YgbmV4dCByZWNlaXZlIGZyYW1lIChoZWFkZXIgKyBkYXRhKS4gIElmIHRoaXMgaXMgemVybywKKyAgLy8vIHRoZXJlIGlzIG5vIG5leHQgcmVjZWl2ZSBmcmFtZSBhdmFpbGFibGUuCisgIC8vLworICBQWEVfVUlOVDMyICBSeEZyYW1lTGVuOworCisgIC8vLworICAvLy8gUmVzZXJ2ZWQsIHNldCB0byB6ZXJvLgorICAvLy8KKyAgUFhFX1VJTlQzMiAgcmVzZXJ2ZWQ7CisKKyAgLy8vCisgIC8vLyAgQWRkcmVzc2VzIG9mIHRyYW5zbWl0dGVkIGJ1ZmZlcnMgdGhhdCBuZWVkIHRvIGJlIHJlY3ljbGVkLgorICAvLy8KKyAgUFhFX1VJTlQ2NCAgVHhCdWZmZXJbTUFYX1hNSVRfQlVGRkVSU107Cit9IFBYRV9EQl9HRVRfU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfZmlsbF9oZWFkZXIgeworICAvLy8KKyAgLy8vIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gTUFDIGFkZHJlc3Nlcy4gIFRoZXNlIHdpbGwgYmUgY29waWVkIGludG8KKyAgLy8vIHRoZSBtZWRpYSBoZWFkZXIgd2l0aG91dCBkb2luZyBieXRlIHN3YXBwaW5nLgorICAvLy8KKyAgUFhFX01BQ19BRERSICBTcmNBZGRyOworICBQWEVfTUFDX0FERFIgIERlc3RBZGRyOworCisgIC8vLworICAvLy8gQWRkcmVzcyBvZiBmaXJzdCBieXRlIG9mIG1lZGlhIGhlYWRlci4gIFRoZSBmaXJzdCBieXRlIG9mIHBhY2tldCBkYXRhCisgIC8vLyBmb2xsb3dzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIG1lZGlhIGhlYWRlci4KKyAgLy8vCisgIFBYRV9VSU5UNjQgICAgICAgIE1lZGlhSGVhZGVyOworCisgIC8vLworICAvLy8gTGVuZ3RoIG9mIHBhY2tldCBkYXRhIGluIGJ5dGVzIChub3QgaW5jbHVkaW5nIHRoZSBtZWRpYSBoZWFkZXIpLgorICAvLy8KKyAgUFhFX1VJTlQzMiAgICAgICAgUGFja2V0TGVuOworCisgIC8vLworICAvLy8gUHJvdG9jb2wgdHlwZS4gIFRoaXMgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgbWVkaWEgaGVhZGVyIHdpdGhvdXQKKyAgLy8vIGRvaW5nIGJ5dGUgc3dhcHBpbmcuICBQcm90b2NvbCB0eXBlIG51bWJlcnMgY2FuIGJlIG9idGFpbmVkIGZyb20KKyAgLy8vIHRoZSBBc3NpZ25lZCBOdW1iZXJzIFJGQyAxNzAwLgorICAvLy8KKyAgUFhFX1VJTlQxNiAgICAgICAgUHJvdG9jb2w7CisKKyAgLy8vCisgIC8vLyBMZW5ndGggb2YgdGhlIG1lZGlhIGhlYWRlciBpbiBieXRlcy4KKyAgLy8vCisgIFBYRV9VSU5UMTYgICAgICAgIE1lZGlhSGVhZGVyTGVuOworfSBQWEVfQ1BCX0ZJTExfSEVBREVSOworCisjZGVmaW5lIFBYRV9QUk9UT0NPTF9FVEhFUk5FVF9JUCAgMHgwODAwCisjZGVmaW5lIFBYRV9QUk9UT0NPTF9FVEhFUk5FVF9BUlAgMHgwODA2CisjZGVmaW5lIE1BWF9YTUlUX0ZSQUdNRU5UUyAgICAgICAgMTYKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX2ZpbGxfaGVhZGVyX2ZyYWdtZW50ZWQgeworICAvLy8KKyAgLy8vIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gTUFDIGFkZHJlc3Nlcy4gIFRoZXNlIHdpbGwgYmUgY29waWVkIGludG8KKyAgLy8vIHRoZSBtZWRpYSBoZWFkZXIgd2l0aG91dCBkb2luZyBieXRlIHN3YXBwaW5nLgorICAvLy8KKyAgUFhFX01BQ19BRERSICAgICAgICBTcmNBZGRyOworICBQWEVfTUFDX0FERFIgICAgICAgIERlc3RBZGRyOworCisgIC8vLworICAvLy8gTGVuZ3RoIG9mIHBhY2tldCBkYXRhIGluIGJ5dGVzIChub3QgaW5jbHVkaW5nIHRoZSBtZWRpYSBoZWFkZXIpLgorICAvLy8KKyAgUFhFX1VJTlQzMiAgICAgICAgICBQYWNrZXRMZW47CisKKyAgLy8vCisgIC8vLyBQcm90b2NvbCB0eXBlLiAgVGhpcyB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBtZWRpYSBoZWFkZXIgd2l0aG91dAorICAvLy8gZG9pbmcgYnl0ZSBzd2FwcGluZy4gIFByb3RvY29sIHR5cGUgbnVtYmVycyBjYW4gYmUgb2J0YWluZWQgZnJvbQorICAvLy8gdGhlIEFzc2lnbmVkIE51bWJlcnMgUkZDIDE3MDAuCisgIC8vLworICBQWEVfTUVESUFfUFJPVE9DT0wgIFByb3RvY29sOworCisgIC8vLworICAvLy8gTGVuZ3RoIG9mIHRoZSBtZWRpYSBoZWFkZXIgaW4gYnl0ZXMuCisgIC8vLworICBQWEVfVUlOVDE2ICAgICAgICAgIE1lZGlhSGVhZGVyTGVuOworCisgIC8vLworICAvLy8gTnVtYmVyIG9mIHBhY2tldCBmcmFnbWVudCBkZXNjcmlwdG9ycy4KKyAgLy8vCisgIFBYRV9VSU5UMTYgICAgICAgICAgRnJhZ0NudDsKKworICAvLy8KKyAgLy8vIFJlc2VydmVkLCBtdXN0IGJlIHNldCB0byB6ZXJvLgorICAvLy8KKyAgUFhFX1VJTlQxNiAgICAgICAgICByZXNlcnZlZDsKKworICAvLy8KKyAgLy8vIEFycmF5IG9mIHBhY2tldCBmcmFnbWVudCBkZXNjcmlwdG9ycy4gIFRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZWRpYQorICAvLy8gaGVhZGVyIGlzIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaXJzdCBmcmFnbWVudC4KKyAgLy8vCisgIHN0cnVjdCB7CisgICAgLy8vCisgICAgLy8vIEFkZHJlc3Mgb2YgdGhpcyBwYWNrZXQgZnJhZ21lbnQuCisgICAgLy8vCisgICAgUFhFX1VJTlQ2NCAgRnJhZ0FkZHI7CisKKyAgICAvLy8KKyAgICAvLy8gTGVuZ3RoIG9mIHRoaXMgcGFja2V0IGZyYWdtZW50LgorICAgIC8vLworICAgIFBYRV9VSU5UMzIgIEZyYWdMZW47CisKKyAgICAvLy8KKyAgICAvLy8gUmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIHplcm8uCisgICAgLy8vCisgICAgUFhFX1VJTlQzMiAgcmVzZXJ2ZWQ7CisgIH0gRnJhZ0Rlc2NbTUFYX1hNSVRfRlJBR01FTlRTXTsKK30KK1BYRV9DUEJfRklMTF9IRUFERVJfRlJBR01FTlRFRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3RyYW5zbWl0IHsKKyAgLy8vCisgIC8vLyBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgZnJhbWUgYnVmZmVyLiAgVGhpcyBpcyBhbHNvIHRoZSBmaXJzdCBieXRlCisgIC8vLyBvZiB0aGUgbWVkaWEgaGVhZGVyLgorICAvLy8KKyAgUFhFX1VJTlQ2NCAgRnJhbWVBZGRyOworCisgIC8vLworICAvLy8gTGVuZ3RoIG9mIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIGZyYW1lIGJ1ZmZlciBpbiBieXRlcy4gIERvIG5vdAorICAvLy8gaW5jbHVkZSB0aGUgbGVuZ3RoIG9mIHRoZSBtZWRpYSBoZWFkZXIuCisgIC8vLworICBQWEVfVUlOVDMyICBEYXRhTGVuOworCisgIC8vLworICAvLy8gTGVuZ3RoIG9mIHRoZSBtZWRpYSBoZWFkZXIgaW4gYnl0ZXMuCisgIC8vLworICBQWEVfVUlOVDE2ICBNZWRpYWhlYWRlckxlbjsKKworICAvLy8KKyAgLy8vIFJlc2VydmVkLCBtdXN0IGJlIHplcm8uCisgIC8vLworICBQWEVfVUlOVDE2ICByZXNlcnZlZDsKK30gUFhFX0NQQl9UUkFOU01JVDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19weGVfY3BiX3RyYW5zbWl0X2ZyYWdtZW50cyB7CisgIC8vLworICAvLy8gTGVuZ3RoIG9mIHBhY2tldCBkYXRhIGluIGJ5dGVzIChub3QgaW5jbHVkaW5nIHRoZSBtZWRpYSBoZWFkZXIpLgorICAvLy8KKyAgUFhFX1VJTlQzMiAgRnJhbWVMZW47CisKKyAgLy8vCisgIC8vLyBMZW5ndGggb2YgdGhlIG1lZGlhIGhlYWRlciBpbiBieXRlcy4KKyAgLy8vCisgIFBYRV9VSU5UMTYgIE1lZGlhaGVhZGVyTGVuOworCisgIC8vLworICAvLy8gTnVtYmVyIG9mIHBhY2tldCBmcmFnbWVudCBkZXNjcmlwdG9ycy4KKyAgLy8vCisgIFBYRV9VSU5UMTYgIEZyYWdDbnQ7CisKKyAgLy8vCisgIC8vLyBBcnJheSBvZiBmcmFtZSBmcmFnbWVudCBkZXNjcmlwdG9ycy4gIFRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaXJzdAorICAvLy8gZnJhZ21lbnQgaXMgYWxzbyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVkaWEgaGVhZGVyLgorICAvLy8KKyAgc3RydWN0IHsKKyAgICAvLy8KKyAgICAvLy8gQWRkcmVzcyBvZiB0aGlzIGZyYW1lIGZyYWdtZW50LgorICAgIC8vLworICAgIFBYRV9VSU5UNjQgIEZyYWdBZGRyOworCisgICAgLy8vCisgICAgLy8vIExlbmd0aCBvZiB0aGlzIGZyYW1lIGZyYWdtZW50LgorICAgIC8vLworICAgIFBYRV9VSU5UMzIgIEZyYWdMZW47CisKKyAgICAvLy8KKyAgICAvLy8gUmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIHplcm8uCisgICAgLy8vCisgICAgUFhFX1VJTlQzMiAgcmVzZXJ2ZWQ7CisgIH0gRnJhZ0Rlc2NbTUFYX1hNSVRfRlJBR01FTlRTXTsKK30KK1BYRV9DUEJfVFJBTlNNSVRfRlJBR01FTlRTOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9jcGJfcmVjZWl2ZSB7CisgIC8vLworICAvLy8gQWRkcmVzcyBvZiBmaXJzdCBieXRlIG9mIHJlY2VpdmUgYnVmZmVyLiAgVGhpcyBpcyBhbHNvIHRoZSBmaXJzdCBieXRlCisgIC8vLyBvZiB0aGUgZnJhbWUgaGVhZGVyLgorICAvLy8KKyAgUFhFX1VJTlQ2NCAgQnVmZmVyQWRkcjsKKworICAvLy8KKyAgLy8vIExlbmd0aCBvZiByZWNlaXZlIGJ1ZmZlci4gIFRoaXMgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgLy8vIHJlY2VpdmVkIGZyYW1lIChtZWRpYSBoZWFkZXIgKyBkYXRhKS4gIElmIHRoZSBsZW5ndGggb2Ygc21hbGxlciB0aGFuCisgIC8vLyB0aGUgcmVjZWl2ZWQgZnJhbWUsIGRhdGEgd2lsbCBiZSBsb3N0LgorICAvLy8KKyAgUFhFX1VJTlQzMiAgQnVmZmVyTGVuOworCisgIC8vLworICAvLy8gUmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIHplcm8uCisgIC8vLworICBQWEVfVUlOVDMyICByZXNlcnZlZDsKK30gUFhFX0NQQl9SRUNFSVZFOworCit0eXBlZGVmIHN0cnVjdCBzX3B4ZV9kYl9yZWNlaXZlIHsKKyAgLy8vCisgIC8vLyBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzZXMgZnJvbSBtZWRpYSBoZWFkZXIuCisgIC8vLworICBQWEVfTUFDX0FERFIgICAgICAgIFNyY0FkZHI7CisgIFBYRV9NQUNfQUREUiAgICAgICAgRGVzdEFkZHI7CisKKyAgLy8vCisgIC8vLyBMZW5ndGggb2YgcmVjZWl2ZWQgZnJhbWUuICBNYXkgYmUgbGFyZ2VyIHRoYW4gcmVjZWl2ZSBidWZmZXIgc2l6ZS4KKyAgLy8vIFRoZSByZWNlaXZlIGJ1ZmZlciB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbi4gIFRoaXMgaXMgaG93IHRvIHRlbGwKKyAgLy8vIGlmIGRhdGEgd2FzIGxvc3QgYmVjYXVzZSB0aGUgcmVjZWl2ZSBidWZmZXIgd2FzIHRvbyBzbWFsbC4KKyAgLy8vCisgIFBYRV9VSU5UMzIgICAgICAgICAgRnJhbWVMZW47CisKKyAgLy8vCisgIC8vLyBQcm90b2NvbCB0eXBlIGZyb20gbWVkaWEgaGVhZGVyLgorICAvLy8KKyAgUFhFX01FRElBX1BST1RPQ09MICBQcm90b2NvbDsKKworICAvLy8KKyAgLy8vIExlbmd0aCBvZiBtZWRpYSBoZWFkZXIgaW4gcmVjZWl2ZWQgZnJhbWUuCisgIC8vLworICBQWEVfVUlOVDE2ICAgICAgICAgIE1lZGlhSGVhZGVyTGVuOworCisgIC8vLworICAvLy8gVHlwZSBvZiByZWNlaXZlIGZyYW1lLgorICAvLy8KKyAgUFhFX0ZSQU1FX1RZUEUgICAgICBUeXBlOworCisgIC8vLworICAvLy8gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KKyAgLy8vCisgIFBYRV9VSU5UOCAgICAgICAgICAgcmVzZXJ2ZWRbN107CisKK30gUFhFX0RCX1JFQ0VJVkU7CisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpL1VlZmlTcGVjLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1VlZmkvVWVmaVNwZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2U3YjZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9VZWZpL1VlZmlTcGVjLmgKQEAgLTAsMCArMSwxOTE2IEBACisvKiogQGZpbGUKKyAgSW5jbHVkZSBmaWxlIHRoYXQgc3VwcG9ydHMgVUVGSS4KKworICBUaGlzIGluY2x1ZGUgZmlsZSBtdXN0IG9ubHkgY29udGFpbiB0aGluZ3MgZGVmaW5lZCBpbiB0aGUgVUVGSSAyLjEgc3BlY2lmaWNhdGlvbi4KKyAgSWYgYSBjb2RlIGNvbnN0cnVjdCBpcyBkZWZpbmVkIGluIHRoZSBVRUZJIDIuMSBzcGVjaWZpY2F0aW9uIGl0IG11c3QgYmUgaW5jbHVkZWQKKyAgYnkgdGhpcyBpbmNsdWRlIGZpbGUuCisKKyAgQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyoqLworCisjaWZuZGVmIF9fVUVGSV9TUEVDX0hfXworI2RlZmluZSBfX1VFRklfU1BFQ19IX18KKworI2luY2x1ZGUgPGdweGUvZWZpL1VlZmkvVWVmaU11bHRpUGhhc2UuaD4KKworI2luY2x1ZGUgPGdweGUvZWZpL1Byb3RvY29sL0RldmljZVBhdGguaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9Qcm90b2NvbC9TaW1wbGVUZXh0SW4uaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9Qcm90b2NvbC9TaW1wbGVUZXh0T3V0Lmg+CisKKy8vLworLy8vIEVudW1lcmF0aW9uIG9mIG1lbW9yeSBhbGxvY2F0aW9uLgorLy8vCit0eXBlZGVmIGVudW0geworICBBbGxvY2F0ZUFueVBhZ2VzLAorICBBbGxvY2F0ZU1heEFkZHJlc3MsCisgIEFsbG9jYXRlQWRkcmVzcywKKyAgTWF4QWxsb2NhdGVUeXBlCit9IEVGSV9BTExPQ0FURV9UWVBFOworCisvLworLy8gQml0IGRlZmluaXRpb25zIGZvciBFRklfVElNRS5EYXlsaWdodAorLy8KKyNkZWZpbmUgRUZJX1RJTUVfQURKVVNUX0RBWUxJR0hUICAweDAxCisjZGVmaW5lIEVGSV9USU1FX0lOX0RBWUxJR0hUICAgICAgMHgwMgorCisvLy8KKy8vLyBWYWx1ZSBkZWZpbml0aW9uIGZvciBFRklfVElNRS5UaW1lWm9uZQorLy8vCisjZGVmaW5lIEVGSV9VTlNQRUNJRklFRF9USU1FWk9ORSAgMHgwN0ZGCisKKy8vCisvLyBNZW1vcnkgY2FjaGVhYmlsaXR5IGF0dHJpYnV0ZXMKKy8vCisjZGVmaW5lIEVGSV9NRU1PUllfVUMgICAweDAwMDAwMDAwMDAwMDAwMDFVTEwKKyNkZWZpbmUgRUZJX01FTU9SWV9XQyAgIDB4MDAwMDAwMDAwMDAwMDAwMlVMTAorI2RlZmluZSBFRklfTUVNT1JZX1dUICAgMHgwMDAwMDAwMDAwMDAwMDA0VUxMCisjZGVmaW5lIEVGSV9NRU1PUllfV0IgICAweDAwMDAwMDAwMDAwMDAwMDhVTEwKKyNkZWZpbmUgRUZJX01FTU9SWV9VQ0UgIDB4MDAwMDAwMDAwMDAwMDAxMFVMTAorLy8KKy8vIFBoeXNpY2FsIG1lbW9yeSBwcm90ZWN0aW9uIGF0dHJpYnV0ZXMKKy8vCisjZGVmaW5lIEVGSV9NRU1PUllfV1AgICAweDAwMDAwMDAwMDAwMDEwMDBVTEwKKyNkZWZpbmUgRUZJX01FTU9SWV9SUCAgIDB4MDAwMDAwMDAwMDAwMjAwMFVMTAorI2RlZmluZSBFRklfTUVNT1JZX1hQICAgMHgwMDAwMDAwMDAwMDA0MDAwVUxMCisvLworLy8gUnVudGltZSBtZW1vcnkgYXR0cmlidXRlCisvLworI2RlZmluZSBFRklfTUVNT1JZX1JVTlRJTUUgIDB4ODAwMDAwMDAwMDAwMDAwMFVMTAorCisvLy8KKy8vLyBNZW1vcnkgZGVzY3JpcHRvciB2ZXJzaW9uIG51bWJlcgorLy8vCisjZGVmaW5lIEVGSV9NRU1PUllfREVTQ1JJUFRPUl9WRVJTSU9OIDEKKworLy8vCisvLy8gRGVmaW5pdGlvbiBvZiBtZW1vcnkgZGVzY3JpcHRvcgorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQzMiAgICAgICAgICAgICAgICBUeXBlOworICBFRklfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxTdGFydDsKKyAgRUZJX1ZJUlRVQUxfQUREUkVTUyAgIFZpcnR1YWxTdGFydDsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgIE51bWJlck9mUGFnZXM7CisgIFVJTlQ2NCAgICAgICAgICAgICAgICBBdHRyaWJ1dGU7Cit9IEVGSV9NRU1PUllfREVTQ1JJUFRPUjsKKworLy8vCisvLy8gQnVpbGQgbWFjcm9zIHRvIGZpbmQgbmV4dCBFRklfTUVNT1JZX0RFU0NSSVBUT1IuCisvLy8KKyNkZWZpbmUgTkVYVF9NRU1PUllfREVTQ1JJUFRPUihfUHRyLCBfU2l6ZSkgICAoKEVGSV9NRU1PUllfREVTQ1JJUFRPUiAqKSAoKChVSU5UOCAqKSAoX1B0cikpICsgKF9TaXplKSkpCisKKy8vLworLy8vIERlY2xhcmUgZm9yd2FyZCByZWZlcmVuY2VkIGRhdGEgc3RydWN0dXJlcworLy8vCit0eXBlZGVmIHN0cnVjdCBfRUZJX1NZU1RFTV9UQUJMRSAgIEVGSV9TWVNURU1fVEFCTEU7CisKKy8qKgorICBBbGxvY2F0ZXMgbWVtb3J5IHBhZ2VzIGZyb20gdGhlIHN5c3RlbS4KKworICBAcGFyYW0gIFR5cGUgICAgICAgIFRoZSB0eXBlIG9mIGFsbG9jYXRpb24gdG8gcGVyZm9ybS4KKyAgQHBhcmFtICBNZW1vcnlUeXBlICBUaGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCisgIEBwYXJhbSAgUGFnZXMgICAgICAgVGhlIG51bWJlciBvZiBjb250aWd1b3VzIDQgS0IgcGFnZXMgdG8gYWxsb2NhdGUuCisgIEBwYXJhbSAgTWVtb3J5ICAgICAgUG9pbnRlciB0byBhIHBoeXNpY2FsIGFkZHJlc3MuIE9uIGlucHV0LCB0aGUgd2F5IGluIHdoaWNoIHRoZSBhZGRyZXNzIGlzCisgICAgICAgICAgICAgICAgICAgICAgdXNlZCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiBUeXBlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSByZXF1ZXN0ZWQgcGFnZXMgd2VyZSBhbGxvY2F0ZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIDEpIFR5cGUgaXMgbm90IEFsbG9jYXRlQW55UGFnZXMgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGVNYXhBZGRyZXNzIG9yIEFsbG9jYXRlQWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgTWVtb3J5VHlwZSBpcyBpbiB0aGUgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWZpTWF4TWVtb3J5VHlwZS4uMHg3RkZGRkZGRi4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIHBhZ2VzIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIFRoZSByZXF1ZXN0ZWQgcGFnZXMgY291bGQgbm90IGJlIGZvdW5kLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9BTExPQ0FURV9QQUdFUykoCisgIElOICAgICBFRklfQUxMT0NBVEVfVFlQRSAgICAgICAgICAgIFR5cGUsCisgIElOICAgICBFRklfTUVNT1JZX1RZUEUgICAgICAgICAgICAgIE1lbW9yeVR5cGUsCisgIElOICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VzLAorICBJTiBPVVQgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAqTWVtb3J5CisgICk7CisKKy8qKgorICBGcmVlcyBtZW1vcnkgcGFnZXMuCisKKyAgQHBhcmFtICBNZW1vcnkgICAgICBUaGUgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlcyB0byBiZSBmcmVlZC4KKyAgQHBhcmFtICBQYWdlcyAgICAgICBUaGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgNCBLQiBwYWdlcyB0byBmcmVlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSByZXF1ZXN0ZWQgcGFnZXMgd2VyZSBmcmVlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgTWVtb3J5IGlzIG5vdCBhIHBhZ2UtYWxpZ25lZCBhZGRyZXNzIG9yIFBhZ2VzIGlzIGludmFsaWQuCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIFRoZSByZXF1ZXN0ZWQgbWVtb3J5IHBhZ2VzIHdlcmUgbm90IGFsbG9jYXRlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRlUGFnZXMoKS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfRlJFRV9QQUdFUykoCisgIElOICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgIE1lbW9yeSwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgUGFnZXMKKyAgKTsKKworLyoqCisgIFJldHVybnMgdGhlIGN1cnJlbnQgbWVtb3J5IG1hcC4KKworICBAcGFyYW0gIE1lbW9yeU1hcFNpemUgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgTWVtb3J5TWFwIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gaW5wdXQsIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gb3V0cHV0LCBpdCBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJldHVybmVkIGJ5IHRoZSBmaXJtd2FyZSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnVmZmVyIHdhcyBsYXJnZSBlbm91Z2gsIG9yIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgbmVlZGVkIHRvIGNvbnRhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcCBpZiB0aGUgYnVmZmVyIHdhcyB0b28gc21hbGwuCisgIEBwYXJhbSAgTWVtb3J5TWFwICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgYnVmZmVyIGluIHdoaWNoIGZpcm13YXJlIHBsYWNlcyB0aGUgY3VycmVudCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLgorICBAcGFyYW0gIE1hcEtleSAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIGluIHdoaWNoIGZpcm13YXJlIHJldHVybnMgdGhlIGtleSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgbWVtb3J5IG1hcC4KKyAgQHBhcmFtICBEZXNjcmlwdG9yU2l6ZSAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiBpbiB3aGljaCBmaXJtd2FyZSByZXR1cm5zIHRoZSBzaXplLCBpbiBieXRlcywgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gaW5kaXZpZHVhbCBFRklfTUVNT1JZX0RFU0NSSVBUT1IuCisgIEBwYXJhbSAgRGVzY3JpcHRvclZlcnNpb24gICAgIEEgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gaW4gd2hpY2ggZmlybXdhcmUgcmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBFRklfTUVNT1JZX0RFU0NSSVBUT1IuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG1lbW9yeSBtYXAgd2FzIHJldHVybmVkIGluIHRoZSBNZW1vcnlNYXAgYnVmZmVyLgorICBAcmV0dmFsIEVGSV9CVUZGRVJfVE9PX1NNQUxMICBUaGUgTWVtb3J5TWFwIGJ1ZmZlciB3YXMgdG9vIHNtYWxsLiBUaGUgY3VycmVudCBidWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gaG9sZCB0aGUgbWVtb3J5IG1hcCBpcyByZXR1cm5lZCBpbiBNZW1vcnlNYXBTaXplLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAxKSBNZW1vcnlNYXBTaXplIGlzIE5VTEwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpIFRoZSBNZW1vcnlNYXAgYnVmZmVyIGlzIG5vdCB0b28gc21hbGwgYW5kIE1lbW9yeU1hcCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfTUVNT1JZX01BUCkoCisgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKk1lbW9yeU1hcFNpemUsCisgIElOIE9VVCBFRklfTUVNT1JZX0RFU0NSSVBUT1IgICAgICAgKk1lbW9yeU1hcCwKKyAgT1VUICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqTWFwS2V5LAorICBPVVQgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpEZXNjcmlwdG9yU2l6ZSwKKyAgT1VUICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAqRGVzY3JpcHRvclZlcnNpb24KKyAgKTsKKworLyoqCisgIEFsbG9jYXRlcyBwb29sIG1lbW9yeS4KKworICBAcGFyYW0gIFBvb2xUeXBlICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBwb29sIHRvIGFsbG9jYXRlLgorICBAcGFyYW0gIFNpemUgICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGZyb20gdGhlIHBvb2wuCisgIEBwYXJhbSAgQnVmZmVyICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIgaWYgdGhlIGNhbGwgc3VjY2VlZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCBvdGhlcndpc2UuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgd2FzIGFsbG9jYXRlZC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIHBvb2wgcmVxdWVzdGVkIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFBvb2xUeXBlIHdhcyBpbnZhbGlkLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9BTExPQ0FURV9QT09MKSgKKyAgSU4gIEVGSV9NRU1PUllfVFlQRSAgICAgICAgICAgICAgUG9vbFR5cGUsCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUsCisgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICoqQnVmZmVyCisgICk7CisKKy8qKgorICBSZXR1cm5zIHBvb2wgbWVtb3J5IHRvIHRoZSBzeXN0ZW0uCisKKyAgQHBhcmFtICBCdWZmZXIgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGZyZWUuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG1lbW9yeSB3YXMgcmV0dXJuZWQgdG8gdGhlIHN5c3RlbS4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQnVmZmVyIHdhcyBpbnZhbGlkLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9GUkVFX1BPT0wpKAorICBJTiAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyCisgICk7CisKKy8qKgorICBDaGFuZ2VzIHRoZSBydW50aW1lIGFkZHJlc3NpbmcgbW9kZSBvZiBFRkkgZmlybXdhcmUgZnJvbSBwaHlzaWNhbCB0byB2aXJ0dWFsLgorCisgIEBwYXJhbSAgTWVtb3J5TWFwU2l6ZSAgICAgICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIFZpcnR1YWxNYXAuCisgIEBwYXJhbSAgRGVzY3JpcHRvclNpemUgICAgICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBWaXJ0dWFsTWFwLgorICBAcGFyYW0gIERlc2NyaXB0b3JWZXJzaW9uICAgICBUaGUgdmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlIGVudHJpZXMgaW4gVmlydHVhbE1hcC4KKyAgQHBhcmFtICBWaXJ0dWFsTWFwICAgICAgICAgICAgQW4gYXJyYXkgb2YgbWVtb3J5IGRlc2NyaXB0b3JzIHdoaWNoIGNvbnRhaW4gbmV3IHZpcnR1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhbGwgcnVudGltZSByYW5nZXMuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHZpcnR1YWwgYWRkcmVzcyBtYXAgaGFzIGJlZW4gYXBwbGllZC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgRUZJIGZpcm13YXJlIGlzIG5vdCBhdCBydW50aW1lLCBvciB0aGUgRUZJIGZpcm13YXJlIGlzIGFscmVhZHkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBhZGRyZXNzIG1hcHBlZCBtb2RlLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBEZXNjcmlwdG9yU2l6ZSBvciBEZXNjcmlwdG9yVmVyc2lvbiBpcyBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9OT19NQVBQSU5HICAgICAgICBBIHZpcnR1YWwgYWRkcmVzcyB3YXMgbm90IHN1cHBsaWVkIGZvciBhIHJhbmdlIGluIHRoZSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwIHRoYXQgcmVxdWlyZXMgYSBtYXBwaW5nLgorICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICBBIHZpcnR1YWwgYWRkcmVzcyB3YXMgc3VwcGxpZWQgZm9yIGFuIGFkZHJlc3MgdGhhdCBpcyBub3QgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG1lbW9yeSBtYXAuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9WSVJUVUFMX0FERFJFU1NfTUFQKSgKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5TWFwU2l6ZSwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclNpemUsCisgIElOICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JWZXJzaW9uLAorICBJTiAgRUZJX01FTU9SWV9ERVNDUklQVE9SICAgICAgICAqVmlydHVhbE1hcAorICApOworCisvKioKKyAgQ29ubmVjdHMgb25lIG9yIG1vcmUgZHJpdmVycyB0byBhIGNvbnRyb2xsZXIuCisKKyAgQHBhcmFtICBDb250cm9sbGVySGFuZGxlICAgICAgVGhlIGhhbmRsZSBvZiB0aGUgY29udHJvbGxlciB0byB3aGljaCBkcml2ZXIocykgYXJlIHRvIGJlIGNvbm5lY3RlZC4KKyAgQHBhcmFtICBEcml2ZXJJbWFnZUhhbmRsZSAgICAgQSBwb2ludGVyIHRvIGFuIG9yZGVyZWQgbGlzdCBoYW5kbGVzIHRoYXQgc3VwcG9ydCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MLgorICBAcGFyYW0gIFJlbWFpbmluZ0RldmljZVBhdGggICBBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBwYXRoIHRoYXQgc3BlY2lmaWVzIGEgY2hpbGQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgc3BlY2lmaWVkIGJ5IENvbnRyb2xsZXJIYW5kbGUuCisgIEBwYXJhbSAgUmVjdXJzaXZlICAgICAgICAgICAgIElmIFRSVUUsIHRoZW4gQ29ubmVjdENvbnRyb2xsZXIoKSBpcyBjYWxsZWQgcmVjdXJzaXZlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgdGhlIGVudGlyZSB0cmVlIG9mIGNvbnRyb2xsZXJzIGJlbG93IHRoZSBjb250cm9sbGVyIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBDb250cm9sbGVySGFuZGxlIGhhdmUgYmVlbiBjcmVhdGVkLiBJZiBGQUxTRSwgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJlZSBvZiBjb250cm9sbGVycyBpcyBvbmx5IGV4cGFuZGVkIG9uZSBsZXZlbC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICAxKSBPbmUgb3IgbW9yZSBkcml2ZXJzIHdlcmUgY29ubmVjdGVkIHRvIENvbnRyb2xsZXJIYW5kbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpIE5vIGRyaXZlcnMgd2VyZSBjb25uZWN0ZWQgdG8gQ29udHJvbGxlckhhbmRsZSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFpbmluZ0RldmljZVBhdGggaXMgbm90IE5VTEwsIGFuZCBpdCBpcyBhbiBFbmQgRGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggTm9kZS4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQ29udHJvbGxlckhhbmRsZSBpcyBub3QgYSB2YWxpZCBFRklfSEFORExFLgorICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICAxKSBUaGVyZSBhcmUgbm8gRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MIGluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50IGluIHRoZSBzeXN0ZW0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpIE5vIGRyaXZlcnMgd2VyZSBjb25uZWN0ZWQgdG8gQ29udHJvbGxlckhhbmRsZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ09OTkVDVF9DT05UUk9MTEVSKSgKKyAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUsCisgIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAqRHJpdmVySW1hZ2VIYW5kbGUsICAgT1BUSU9OQUwKKyAgSU4gIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICpSZW1haW5pbmdEZXZpY2VQYXRoLCBPUFRJT05BTAorICBJTiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlCisgICk7CisKKy8qKgorICBEaXNjb25uZWN0cyBvbmUgb3IgbW9yZSBkcml2ZXJzIGZyb20gYSBjb250cm9sbGVyLgorCisgIEBwYXJhbSAgQ29udHJvbGxlckhhbmRsZSAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIGNvbnRyb2xsZXIgZnJvbSB3aGljaCBkcml2ZXIocykgYXJlIHRvIGJlIGRpc2Nvbm5lY3RlZC4KKyAgQHBhcmFtICBEcml2ZXJJbWFnZUhhbmRsZSAgICAgVGhlIGRyaXZlciB0byBkaXNjb25uZWN0IGZyb20gQ29udHJvbGxlckhhbmRsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgRHJpdmVySW1hZ2VIYW5kbGUgaXMgTlVMTCwgdGhlbiBhbGwgdGhlIGRyaXZlcnMgY3VycmVudGx5IG1hbmFnaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUgYXJlIGRpc2Nvbm5lY3RlZCBmcm9tIENvbnRyb2xsZXJIYW5kbGUuCisgIEBwYXJhbSAgQ2hpbGRIYW5kbGUgICAgICAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIGNoaWxkIHRvIGRlc3Ryb3kuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIENoaWxkSGFuZGxlIGlzIE5VTEwsIHRoZW4gYWxsIHRoZSBjaGlsZHJlbiBvZiBDb250cm9sbGVySGFuZGxlIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95ZWQgYmVmb3JlIHRoZSBkcml2ZXJzIGFyZSBkaXNjb25uZWN0ZWQgZnJvbSBDb250cm9sbGVySGFuZGxlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIDEpIE9uZSBvciBtb3JlIGRyaXZlcnMgd2VyZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY29udHJvbGxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgT24gZW50cnksIG5vIGRyaXZlcnMgYXJlIG1hbmFnaW5nIENvbnRyb2xsZXJIYW5kbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpIERyaXZlckltYWdlSGFuZGxlIGlzIG5vdCBOVUxMLCBhbmQgb24gZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVySW1hZ2VIYW5kbGUgaXMgbm90IG1hbmFnaW5nIENvbnRyb2xsZXJIYW5kbGUuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIDEpIENvbnRyb2xsZXJIYW5kbGUgaXMgbm90IGEgdmFsaWQgRUZJX0hBTkRMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgRHJpdmVySW1hZ2VIYW5kbGUgaXMgbm90IE5VTEwsIGFuZCBpdCBpcyBub3QgYSB2YWxpZCBFRklfSEFORExFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKSBDaGlsZEhhbmRsZSBpcyBub3QgTlVMTCwgYW5kIGl0IGlzIG5vdCBhIHZhbGlkIEVGSV9IQU5ETEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpIERyaXZlckltYWdlSGFuZGxlIGRvZXMgbm90IHN1cHBvcnQgdGhlIEVGSV9EUklWRVJfQklORElOR19QUk9UT0NPTC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgYXJlIG5vdCBlbm91Z2ggcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBkaXNjb25uZWN0IGFueSBkcml2ZXJzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZS4KKyAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGNvbnRyb2xsZXIgY291bGQgbm90IGJlIGRpc2Nvbm5lY3RlZCBiZWNhdXNlIG9mIGEgZGV2aWNlIGVycm9yLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9ESVNDT05ORUNUX0NPTlRST0xMRVIpKAorICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUsCisgIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgRHJpdmVySW1hZ2VIYW5kbGUsIE9QVElPTkFMCisgIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgQ2hpbGRIYW5kbGUgICAgICAgIE9QVElPTkFMCisgICk7CisKKworCisvLworLy8gQ29udmVydFBvaW50ZXIgRGVidWdEaXNwb3NpdGlvbiB0eXBlLgorLy8KKyNkZWZpbmUgRUZJX09QVElPTkFMX1BUUiAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFRklfT1BUSU9OQUxfUE9JTlRFUiBFRklfT1BUSU9OQUxfUFRSCisKKy8qKgorICBEZXRlcm1pbmVzIHRoZSBuZXcgdmlydHVhbCBhZGRyZXNzIHRoYXQgaXMgdG8gYmUgdXNlZCBvbiBzdWJzZXF1ZW50IG1lbW9yeSBhY2Nlc3Nlcy4KKworICBAcGFyYW0gIERlYnVnRGlzcG9zaXRpb24gICAgICBTdXBwbGllcyB0eXBlIGluZm9ybWF0aW9uIGZvciB0aGUgcG9pbnRlciBiZWluZyBjb252ZXJ0ZWQuCisgIEBwYXJhbSAgQWRkcmVzcyAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhIHBvaW50ZXIgdGhhdCBpcyB0byBiZSBmaXhlZCB0byBiZSB0aGUgdmFsdWUgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbmV3IHZpcnR1YWwgYWRkcmVzcyBtYXBwaW5ncyBiZWluZyBhcHBsaWVkLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBwb2ludGVyIHBvaW50ZWQgdG8gYnkgQWRkcmVzcyB3YXMgbW9kaWZpZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIDEpIEFkZHJlc3MgaXMgTlVMTC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgKkFkZHJlc3MgaXMgTlVMTCBhbmQgRGVidWdEaXNwb3NpdGlvbiBkb2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZlIHRoZSBFRklfT1BUSU9OQUxfUFRSIGJpdCBzZXQuCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIFRoZSBwb2ludGVyIHBvaW50ZWQgdG8gYnkgQWRkcmVzcyB3YXMgbm90IGZvdW5kIHRvIGJlIHBhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGN1cnJlbnQgbWVtb3J5IG1hcC4gVGhpcyBpcyBub3JtYWxseSBmYXRhbC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ09OVkVSVF9QT0lOVEVSKSgKKyAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgIERlYnVnRGlzcG9zaXRpb24sCisgIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAqKkFkZHJlc3MKKyAgKTsKKworCisvLworLy8gVGhlc2UgdHlwZXMgY2FuIGJlIE9SZWQgdG9nZXRoZXIgYXMgbmVlZGVkIC0gZm9yIGV4YW1wbGUsCisvLyBFVlRfVElNRVIgbWlnaHQgYmUgT3JlZCB3aXRoIEVWVF9OT1RJRllfV0FJVCBvcgorLy8gRVZUX05PVElGWV9TSUdOQUwuCisvLworI2RlZmluZSBFVlRfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBFVlRfUlVOVElNRSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBFVlRfTk9USUZZX1dBSVQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBFVlRfTk9USUZZX1NJR05BTCAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorCisjZGVmaW5lIEVWVF9TSUdOQUxfRVhJVF9CT09UX1NFUlZJQ0VTICAgICAweDAwMDAwMjAxCisjZGVmaW5lIEVWVF9TSUdOQUxfVklSVFVBTF9BRERSRVNTX0NIQU5HRSAweDYwMDAwMjAyCisKKy8vCisvLyBUaGUgZXZlbnQncyBOb3RpZnlDb250ZXh0IHBvaW50ZXIgcG9pbnRzIHRvIGEgcnVudGltZSBtZW1vcnkKKy8vIGFkZHJlc3MuCisvLyBUaGUgZXZlbnQgaXMgZGVwcmVjYXRlZCBpbiBVRUZJMi4wIGFuZCBsYXRlciBzcGVjaWZpY2F0aW9ucy4KKy8vCisjZGVmaW5lIEVWVF9SVU5USU1FX0NPTlRFWFQgICAgICAgICAgICAgICAweDIwMDAwMDAwCisKKworLyoqCisgIEludm9rZSBhIG5vdGlmaWNhdGlvbiBldmVudAorCisgIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIEV2ZW50IHdob3NlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiBpcyBiZWluZyBpbnZva2VkLgorICBAcGFyYW0gIENvbnRleHQgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBub3RpZmljYXRpb24gZnVuY3Rpb24ncyBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuCisKKyoqLwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX0VWRU5UX05PVElGWSkoCisgIElOICBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQsCisgIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgKkNvbnRleHQKKyAgKTsKKworLyoqCisgIENyZWF0ZXMgYW4gZXZlbnQuCisKKyAgQHBhcmFtICBUeXBlICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXZlbnQgdG8gY3JlYXRlIGFuZCBpdHMgbW9kZSBhbmQgYXR0cmlidXRlcy4KKyAgQHBhcmFtICBOb3RpZnlUcGwgICAgICAgICAgICAgVGhlIHRhc2sgcHJpb3JpdHkgbGV2ZWwgb2YgZXZlbnQgbm90aWZpY2F0aW9ucywgaWYgbmVlZGVkLgorICBAcGFyYW0gIE5vdGlmeUZ1bmN0aW9uICAgICAgICBQb2ludGVyIHRvIHRoZSBldmVudCdzIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiwgaWYgYW55LgorICBAcGFyYW0gIE5vdGlmeUNvbnRleHQgICAgICAgICBQb2ludGVyIHRvIHRoZSBub3RpZmljYXRpb24gZnVuY3Rpb24ncyBjb250ZXh0OyBjb3JyZXNwb25kcyB0byBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBpbiB0aGUgbm90aWZpY2F0aW9uIGZ1bmN0aW9uLgorICBAcGFyYW0gIEV2ZW50ICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGV2ZW50IGlmIHRoZSBjYWxsIHN1Y2NlZWRzOyB1bmRlZmluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBldmVudCBzdHJ1Y3R1cmUgd2FzIGNyZWF0ZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSBldmVudCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DUkVBVEVfRVZFTlQpKAorICBJTiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBUeXBlLAorICBJTiAgRUZJX1RQTCAgICAgICAgICAgICAgICAgICAgICBOb3RpZnlUcGwsCisgIElOICBFRklfRVZFTlRfTk9USUZZICAgICAgICAgICAgIE5vdGlmeUZ1bmN0aW9uLAorICBJTiAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqTm90aWZ5Q29udGV4dCwKKyAgT1VUIEVGSV9FVkVOVCAgICAgICAgICAgICAgICAgICAgKkV2ZW50CisgICk7CisKKy8qKgorICBDcmVhdGVzIGFuIGV2ZW50IGluIGEgZ3JvdXAuCisKKyAgQHBhcmFtICBUeXBlICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXZlbnQgdG8gY3JlYXRlIGFuZCBpdHMgbW9kZSBhbmQgYXR0cmlidXRlcy4KKyAgQHBhcmFtICBOb3RpZnlUcGwgICAgICAgICAgICAgVGhlIHRhc2sgcHJpb3JpdHkgbGV2ZWwgb2YgZXZlbnQgbm90aWZpY2F0aW9ucyxpZiBuZWVkZWQuCisgIEBwYXJhbSAgTm90aWZ5RnVuY3Rpb24gICAgICAgIFBvaW50ZXIgdG8gdGhlIGV2ZW50J3Mgbm90aWZpY2F0aW9uIGZ1bmN0aW9uLCBpZiBhbnkuCisgIEBwYXJhbSAgTm90aWZ5Q29udGV4dCAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbidzIGNvbnRleHQ7IGNvcnJlc3BvbmRzIHRvIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGluIHRoZSBub3RpZmljYXRpb24gZnVuY3Rpb24uCisgIEBwYXJhbSAgRXZlbnRHcm91cCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBncm91cCB0byB3aGljaCB0aGlzIGV2ZW50IGJlbG9uZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgdGhlbiB0aGUgZnVuY3Rpb24gYmVoYXZlcyBhcyBpZiB0aGUgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBDcmVhdGVFdmVudC4KKyAgQHBhcmFtICBFdmVudCAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbmV3bHkgY3JlYXRlZCBldmVudCBpZiB0aGUgY2FsbCBzdWNjZWVkczsgdW5kZWZpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZXZlbnQgc3RydWN0dXJlIHdhcyBjcmVhdGVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgZXZlbnQgY291bGQgbm90IGJlIGFsbG9jYXRlZC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ1JFQVRFX0VWRU5UX0VYKSgKKyAgSU4gICAgICAgVUlOVDMyICAgICAgICAgICAgICAgICBUeXBlLAorICBJTiAgICAgICBFRklfVFBMICAgICAgICAgICAgICAgIE5vdGlmeVRwbCwKKyAgSU4gICAgICAgRUZJX0VWRU5UX05PVElGWSAgICAgICBOb3RpZnlGdW5jdGlvbiBPUFRJT05BTCwKKyAgSU4gQ09OU1QgVk9JRCAgICAgICAgICAgICAgICAgICAqTm90aWZ5Q29udGV4dCBPUFRJT05BTCwKKyAgSU4gQ09OU1QgRUZJX0dVSUQgICAgICAgICAgICAgICAqRXZlbnRHcm91cCAgICBPUFRJT05BTCwKKyAgT1VUICAgICAgRUZJX0VWRU5UICAgICAgICAgICAgICAqRXZlbnQKKyAgKTsKKworLy8vCisvLy8gVGltZXIgZGVsYXkgdHlwZXMKKy8vLwordHlwZWRlZiBlbnVtIHsKKyAgVGltZXJDYW5jZWwsCisgIFRpbWVyUGVyaW9kaWMsCisgIFRpbWVyUmVsYXRpdmUKK30gRUZJX1RJTUVSX0RFTEFZOworCisvKioKKyAgU2V0cyB0aGUgdHlwZSBvZiB0aW1lciBhbmQgdGhlIHRyaWdnZXIgdGltZSBmb3IgYSB0aW1lciBldmVudC4KKworICBAcGFyYW0gIEV2ZW50ICAgICAgICAgICAgICAgICBUaGUgdGltZXIgZXZlbnQgdGhhdCBpcyB0byBiZSBzaWduYWxlZCBhdCB0aGUgc3BlY2lmaWVkIHRpbWUuCisgIEBwYXJhbSAgVHlwZSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRpbWUgdGhhdCBpcyBzcGVjaWZpZWQgaW4gVHJpZ2dlclRpbWUuCisgIEBwYXJhbSAgVHJpZ2dlclRpbWUgICAgICAgICAgIFRoZSBudW1iZXIgb2YgMTAwbnMgdW5pdHMgdW50aWwgdGhlIHRpbWVyIGV4cGlyZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgVHJpZ2dlclRpbWUgb2YgMCBpcyBsZWdhbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgVHlwZSBpcyBUaW1lclJlbGF0aXZlIGFuZCBUcmlnZ2VyVGltZSBpcyAwLCB0aGVuIHRoZSB0aW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCB3aWxsIGJlIHNpZ25hbGVkIG9uIHRoZSBuZXh0IHRpbWVyIHRpY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIFR5cGUgaXMgVGltZXJQZXJpb2RpYyBhbmQgVHJpZ2dlclRpbWUgaXMgMCwgdGhlbiB0aGUgdGltZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgd2lsbCBiZSBzaWduYWxlZCBvbiBldmVyeSB0aW1lciB0aWNrLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBldmVudCBoYXMgYmVlbiBzZXQgdG8gYmUgc2lnbmFsZWQgYXQgdGhlIHJlcXVlc3RlZCB0aW1lLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBFdmVudCBvciBUeXBlIGlzIG5vdCB2YWxpZC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfU0VUX1RJTUVSKSgKKyAgSU4gIEVGSV9FVkVOVCAgICAgICAgICAgICAgICBFdmVudCwKKyAgSU4gIEVGSV9USU1FUl9ERUxBWSAgICAgICAgICBUeXBlLAorICBJTiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgIFRyaWdnZXJUaW1lCisgICk7CisKKy8qKgorICBTaWduYWxzIGFuIGV2ZW50LgorCisgIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIFRoZSBldmVudCB0byBzaWduYWwuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGV2ZW50IGhhcyBiZWVuIHNpZ25hbGVkLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TSUdOQUxfRVZFTlQpKAorICBJTiAgRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50CisgICk7CisKKy8qKgorICBTdG9wcyBleGVjdXRpb24gdW50aWwgYW4gZXZlbnQgaXMgc2lnbmFsZWQuCisKKyAgQHBhcmFtICBOdW1iZXJPZkV2ZW50cyAgICAgICAgVGhlIG51bWJlciBvZiBldmVudHMgaW4gdGhlIEV2ZW50IGFycmF5LgorICBAcGFyYW0gIEV2ZW50ICAgICAgICAgICAgICAgICBBbiBhcnJheSBvZiBFRklfRVZFTlQuCisgIEBwYXJhbSAgSW5kZXggICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIHRoZSBldmVudCB3aGljaCBzYXRpc2ZpZWQgdGhlIHdhaXQgY29uZGl0aW9uLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBldmVudCBpbmRpY2F0ZWQgYnkgSW5kZXggd2FzIHNpZ25hbGVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAxKSBOdW1iZXJPZkV2ZW50cyBpcyAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSBUaGUgZXZlbnQgaW5kaWNhdGVkIGJ5IEluZGV4IGlzIG9mIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUX05PVElGWV9TSUdOQUwuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoZSBjdXJyZW50IFRQTCBpcyBub3QgVFBMX0FQUExJQ0FUSU9OLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9XQUlUX0ZPUl9FVkVOVCkoCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZFdmVudHMsCisgIElOICBFRklfRVZFTlQgICAgICAgICAgICAgICAgKkV2ZW50LAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpJbmRleAorICApOworCisvKioKKyAgQ2xvc2VzIGFuIGV2ZW50LgorCisgIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIFRoZSBldmVudCB0byBjbG9zZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZXZlbnQgaGFzIGJlZW4gY2xvc2VkLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DTE9TRV9FVkVOVCkoCisgIElOIEVGSV9FVkVOVCAgICAgICAgICAgICAgICBFdmVudAorICApOworCisvKioKKyAgQ2hlY2tzIHdoZXRoZXIgYW4gZXZlbnQgaXMgaW4gdGhlIHNpZ25hbGVkIHN0YXRlLgorCisgIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIFRoZSBldmVudCB0byBjaGVjay4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZXZlbnQgaXMgaW4gdGhlIHNpZ25hbGVkIHN0YXRlLgorICBAcmV0dmFsIEVGSV9OT1RfUkVBRFkgICAgICAgICBUaGUgZXZlbnQgaXMgbm90IGluIHRoZSBzaWduYWxlZCBzdGF0ZS4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgRXZlbnQgaXMgb2YgdHlwZSBFVlRfTk9USUZZX1NJR05BTC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfQ0hFQ0tfRVZFTlQpKAorICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQKKyAgKTsKKworCisvLworLy8gVGFzayBwcmlvcml0eSBsZXZlbAorLy8KKyNkZWZpbmUgVFBMX0FQUExJQ0FUSU9OICAgICAgIDQKKyNkZWZpbmUgVFBMX0NBTExCQUNLICAgICAgICAgIDgKKyNkZWZpbmUgVFBMX05PVElGWSAgICAgICAgICAgIDE2CisjZGVmaW5lIFRQTF9ISUdIX0xFVkVMICAgICAgICAzMQorCisKKy8qKgorICBSYWlzZXMgYSB0YXNrJ3MgcHJpb3JpdHkgbGV2ZWwgYW5kIHJldHVybnMgaXRzIHByZXZpb3VzIGxldmVsLgorCisgIEBwYXJhbSAgTmV3VHBsICAgICAgICAgICAgICAgIFRoZSBuZXcgdGFzayBwcmlvcml0eSBsZXZlbC4KKworICBAcmV0dXJuIFByZXZpb3VzIHRhc2sgcHJpb3JpdHkgbGV2ZWwKKworKiovCit0eXBlZGVmCitFRklfVFBMCisoRUZJQVBJICpFRklfUkFJU0VfVFBMKSgKKyAgSU4gRUZJX1RQTCAgICAgIE5ld1RwbAorICApOworCisvKioKKyAgUmVzdG9yZXMgYSB0YXNrJ3MgcHJpb3JpdHkgbGV2ZWwgdG8gaXRzIHByZXZpb3VzIHZhbHVlLgorCisgIEBwYXJhbSAgT2xkVHBsICAgICAgICAgICAgICAgIFRoZSBwcmV2aW91cyB0YXNrIHByaW9yaXR5IGxldmVsIHRvIHJlc3RvcmUuCisKKyoqLwordHlwZWRlZgorVk9JRAorKEVGSUFQSSAqRUZJX1JFU1RPUkVfVFBMKSgKKyAgSU4gRUZJX1RQTCAgICAgIE9sZFRwbAorICApOworCisvKioKKyAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4KKworICBAcGFyYW0gIFZhcmlhYmxlTmFtZSAgICAgICAgICBBIE51bGwtdGVybWluYXRlZCBVbmljb2RlIHN0cmluZyB0aGF0IGlzIHRoZSBuYW1lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3IncyB2YXJpYWJsZS4KKyAgQHBhcmFtICBWZW5kb3JHdWlkICAgICAgICAgICAgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHZlbmRvci4KKyAgQHBhcmFtICBBdHRyaWJ1dGVzICAgICAgICAgICAgSWYgbm90IE5VTEwsIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5IGxvY2F0aW9uIHRvIHJldHVybiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyBiaXRtYXNrIGZvciB0aGUgdmFyaWFibGUuCisgIEBwYXJhbSAgRGF0YVNpemUgICAgICAgICAgICAgIE9uIGlucHV0LCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmV0dXJuIERhdGEgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBvdXRwdXQgdGhlIHNpemUgb2YgZGF0YSByZXR1cm5lZCBpbiBEYXRhLgorICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBUaGUgYnVmZmVyIHRvIHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgICBUaGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgIFRoZSB2YXJpYWJsZSB3YXMgbm90IGZvdW5kLgorICBAcmV0dmFsIEVGSV9CVUZGRVJfVE9PX1NNQUxMICAgVGhlIERhdGFTaXplIGlzIHRvbyBzbWFsbCBmb3IgdGhlIHJlc3VsdC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgIFZhcmlhYmxlTmFtZSBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgVmVuZG9yR3VpZCBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgRGF0YVNpemUgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgIFRoZSBEYXRhU2l6ZSBpcyBub3QgdG9vIHNtYWxsIGFuZCBEYXRhIGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgICBUaGUgdmFyaWFibGUgY291bGQgbm90IGJlIHJldHJpZXZlZCBkdWUgdG8gYSBoYXJkd2FyZSBlcnJvci4KKyAgQHJldHZhbCBFRklfU0VDVVJJVFlfVklPTEFUSU9OIFRoZSB2YXJpYWJsZSBjb3VsZCBub3QgYmUgcmV0cmlldmVkIGR1ZSB0byBhbiBhdXRoZW50aWNhdGlvbiBmYWlsdXJlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfVkFSSUFCTEUpKAorICBJTiAgICAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICpWYXJpYWJsZU5hbWUsCisgIElOICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgKlZlbmRvckd1aWQsCisgIE9VVCAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgKkF0dHJpYnV0ZXMsICAgIE9QVElPTkFMCisgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKkRhdGFTaXplLAorICBPVVQgICAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICpEYXRhCisgICk7CisKKy8qKgorICBFbnVtZXJhdGVzIHRoZSBjdXJyZW50IHZhcmlhYmxlIG5hbWVzLgorCisgIEBwYXJhbSAgVmFyaWFibGVOYW1lU2l6ZSAgICAgIFRoZSBzaXplIG9mIHRoZSBWYXJpYWJsZU5hbWUgYnVmZmVyLgorICBAcGFyYW0gIFZhcmlhYmxlTmFtZSAgICAgICAgICBPbiBpbnB1dCwgc3VwcGxpZXMgdGhlIGxhc3QgVmFyaWFibGVOYW1lIHRoYXQgd2FzIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IEdldE5leHRWYXJpYWJsZU5hbWUoKS4gT24gb3V0cHV0LCByZXR1cm5zIHRoZSBOdWxsdGVybWluYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlIHN0cmluZyBvZiB0aGUgY3VycmVudCB2YXJpYWJsZS4KKyAgQHBhcmFtICBWZW5kb3JHdWlkICAgICAgICAgICAgT24gaW5wdXQsIHN1cHBsaWVzIHRoZSBsYXN0IFZlbmRvckd1aWQgdGhhdCB3YXMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmV4dFZhcmlhYmxlTmFtZSgpLiBPbiBvdXRwdXQsIHJldHVybnMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlbmRvckd1aWQgb2YgdGhlIGN1cnJlbnQgdmFyaWFibGUuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIFRoZSBuZXh0IHZhcmlhYmxlIHdhcyBub3QgZm91bmQuCisgIEByZXR2YWwgRUZJX0JVRkZFUl9UT09fU01BTEwgIFRoZSBWYXJpYWJsZU5hbWVTaXplIGlzIHRvbyBzbWFsbCBmb3IgdGhlIHJlc3VsdC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgVmFyaWFibGVOYW1lU2l6ZSBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBWYXJpYWJsZU5hbWUgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgVmVuZG9yR3VpZCBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgdmFyaWFibGUgY291bGQgbm90IGJlIHJldHJpZXZlZCBkdWUgdG8gYSBoYXJkd2FyZSBlcnJvci4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX05FWFRfVkFSSUFCTEVfTkFNRSkoCisgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZVNpemUsCisgIElOIE9VVCBDSEFSMTYgICAgICAgICAgICAgICAgICAgKlZhcmlhYmxlTmFtZSwKKyAgSU4gT1VUIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqVmVuZG9yR3VpZAorICApOworCisvKioKKyAgU2V0cyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4KKworICBAcGFyYW0gIFZhcmlhYmxlTmFtZSAgICAgICAgICBBIE51bGwtdGVybWluYXRlZCBVbmljb2RlIHN0cmluZyB0aGF0IGlzIHRoZSBuYW1lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3IncyB2YXJpYWJsZS4KKyAgQHBhcmFtICBWZW5kb3JHdWlkICAgICAgICAgICAgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHZlbmRvci4KKyAgQHBhcmFtICBBdHRyaWJ1dGVzICAgICAgICAgICAgQXR0cmlidXRlcyBiaXRtYXNrIHRvIHNldCBmb3IgdGhlIHZhcmlhYmxlLgorICBAcGFyYW0gIERhdGFTaXplICAgICAgICAgICAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgRGF0YSBidWZmZXIuCisgIEBwYXJhbSAgRGF0YSAgICAgICAgICAgICAgICAgIFRoZSBjb250ZW50cyBmb3IgdGhlIHZhcmlhYmxlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgICBUaGUgZmlybXdhcmUgaGFzIHN1Y2Nlc3NmdWxseSBzdG9yZWQgdGhlIHZhcmlhYmxlIGFuZCBpdHMgZGF0YSBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBieSB0aGUgQXR0cmlidXRlcy4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgIEFuIGludmFsaWQgY29tYmluYXRpb24gb2YgYXR0cmlidXRlIGJpdHMgd2FzIHN1cHBsaWVkLCBvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTaXplIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgIFZhcmlhYmxlTmFtZSBpcyBhbiBlbXB0eSBVbmljb2RlIHN0cmluZy4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgIE5vdCBlbm91Z2ggc3RvcmFnZSBpcyBhdmFpbGFibGUgdG8gaG9sZCB0aGUgdmFyaWFibGUgYW5kIGl0cyBkYXRhLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICAgVGhlIHZhcmlhYmxlIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQgZHVlIHRvIGEgaGFyZHdhcmUgZXJyb3IuCisgIEByZXR2YWwgRUZJX1dSSVRFX1BST1RFQ1RFRCAgICBUaGUgdmFyaWFibGUgaW4gcXVlc3Rpb24gaXMgcmVhZC1vbmx5LgorICBAcmV0dmFsIEVGSV9XUklURV9QUk9URUNURUQgICAgVGhlIHZhcmlhYmxlIGluIHF1ZXN0aW9uIGNhbm5vdCBiZSBkZWxldGVkLgorICBAcmV0dmFsIEVGSV9TRUNVUklUWV9WSU9MQVRJT04gVGhlIHZhcmlhYmxlIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQgZHVlIHRvIGFuIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUuCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgICBUaGUgdmFyaWFibGUgdHJ5aW5nIHRvIGJlIHVwZGF0ZWQgb3IgZGVsZXRlZCB3YXMgbm90IGZvdW5kLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVRfVkFSSUFCTEUpKAorICBJTiAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAqVmFyaWFibGVOYW1lLAorICBJTiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAqVmVuZG9yR3VpZCwKKyAgSU4gIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcywKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNpemUsCisgIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpEYXRhCisgICk7CisKKworLy8vCisvLy8gVGhpcyBwcm92aWRlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQorLy8vIHJlYWwgdGltZSBjbG9jayBkZXZpY2UgYXMgZXhwb3NlZCB0aHJvdWdoIHRoZSBFRkkgaW50ZXJmYWNlcy4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UMzIgICAgUmVzb2x1dGlvbjsKKyAgVUlOVDMyICAgIEFjY3VyYWN5OworICBCT09MRUFOICAgU2V0c1RvWmVybzsKK30gRUZJX1RJTUVfQ0FQQUJJTElUSUVTOworCisvKioKKyAgUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIGFuZCBkYXRlIGluZm9ybWF0aW9uLCBhbmQgdGhlIHRpbWUta2VlcGluZyBjYXBhYmlsaXRpZXMKKyAgb2YgdGhlIGhhcmR3YXJlIHBsYXRmb3JtLgorCisgIEBwYXJhbSAgVGltZSAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBzdG9yYWdlIHRvIHJlY2VpdmUgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCB0aW1lLgorICBAcGFyYW0gIENhcGFiaWxpdGllcyAgICAgICAgICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHJlYWwgdGltZSBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UncyBjYXBhYmlsaXRpZXMuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBUaW1lIGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSB0aW1lIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQgZHVlIHRvIGhhcmR3YXJlIGVycm9yLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfVElNRSkoCisgIE9VVCAgRUZJX1RJTUUgICAgICAgICAgICAgICAgICAgICpUaW1lLAorICBPVVQgIEVGSV9USU1FX0NBUEFCSUxJVElFUyAgICAgICAqQ2FwYWJpbGl0aWVzIE9QVElPTkFMCisgICk7CisKKy8qKgorICBTZXRzIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgYW5kIGRhdGUgaW5mb3JtYXRpb24uCisKKyAgQHBhcmFtICBUaW1lICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHRpbWUuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBBIHRpbWUgZmllbGQgaXMgb3V0IG9mIHJhbmdlLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgdGltZSBjb3VsZCBub3QgYmUgc2V0IGR1ZSBkdWUgdG8gaGFyZHdhcmUgZXJyb3IuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9USU1FKSgKKyAgSU4gIEVGSV9USU1FICAgICAgICAgICAgICAgICAgICAgKlRpbWUKKyAgKTsKKworLyoqCisgIFJldHVybnMgdGhlIGN1cnJlbnQgd2FrZXVwIGFsYXJtIGNsb2NrIHNldHRpbmcuCisKKyAgQHBhcmFtICBFbmFibGVkICAgICAgICAgICAgICAgSW5kaWNhdGVzIGlmIHRoZSBhbGFybSBpcyBjdXJyZW50bHkgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgQHBhcmFtICBQZW5kaW5nICAgICAgICAgICAgICAgSW5kaWNhdGVzIGlmIHRoZSBhbGFybSBzaWduYWwgaXMgcGVuZGluZyBhbmQgcmVxdWlyZXMgYWNrbm93bGVkZ2VtZW50LgorICBAcGFyYW0gIFRpbWUgICAgICAgICAgICAgICAgICBUaGUgY3VycmVudCBhbGFybSBzZXR0aW5nLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBhbGFybSBzZXR0aW5ncyB3ZXJlIHJldHVybmVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBFbmFibGVkIGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFBlbmRpbmcgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgVGltZSBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgd2FrZXVwIHRpbWUgY291bGQgbm90IGJlIHJldHJpZXZlZCBkdWUgdG8gYSBoYXJkd2FyZSBlcnJvci4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgQSB3YWtldXAgdGltZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9HRVRfV0FLRVVQX1RJTUUpKAorICBPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICpFbmFibGVkLAorICBPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICpQZW5kaW5nLAorICBPVVQgRUZJX1RJTUUgICAgICAgICAgICAgICAgICAgICpUaW1lCisgICk7CisKKy8qKgorICBTZXRzIHRoZSBzeXN0ZW0gd2FrZXVwIGFsYXJtIGNsb2NrIHRpbWUuCisKKyAgQHBhcmFtICBFbmFibGVkICAgICAgICAgICAgICAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIHdha2V1cCBhbGFybS4KKyAgQHBhcmFtICBUaW1lICAgICAgICAgICAgICAgICAgSWYgRW5hYmxlIGlzIFRSVUUsIHRoZSB0aW1lIHRvIHNldCB0aGUgd2FrZXVwIGFsYXJtIGZvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgRW5hYmxlIGlzIEZBTFNFLCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLCBhbmQgbWF5IGJlIE5VTEwuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgSWYgRW5hYmxlIGlzIFRSVUUsIHRoZW4gdGhlIHdha2V1cCBhbGFybSB3YXMgZW5hYmxlZC4gSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIGlzIEZBTFNFLCB0aGVuIHRoZSB3YWtldXAgYWxhcm0gd2FzIGRpc2FibGVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBBIHRpbWUgZmllbGQgaXMgb3V0IG9mIHJhbmdlLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgd2FrZXVwIHRpbWUgY291bGQgbm90IGJlIHNldCBkdWUgdG8gYSBoYXJkd2FyZSBlcnJvci4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgQSB3YWtldXAgdGltZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9TRVRfV0FLRVVQX1RJTUUpKAorICBJTiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBFbmFibGUsCisgIElOICBFRklfVElNRSAgICAgICAgICAgICAgICAgICAgICpUaW1lICAgT1BUSU9OQUwKKyAgKTsKKworLyoqCisgIFRoaXMgaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIEVGSSBpbWFnZSBlbnRyeSBwb2ludC4gVGhpcyBlbnRyeSBwb2ludCBpcworICB0aGUgc2FtZSBmb3IgVUVGSSBBcHBsaWNhdGlvbnMsIFVFRkkgT1MgTG9hZGVycywgYW5kIFVFRkkgRHJpdmVycyBpbmNsdWRpbmcKKyAgYm90aCBkZXZpY2UgZHJpdmVycyBhbmQgYnVzIGRyaXZlcnMuCisKKyAgQHBhcmFtICBJbWFnZUhhbmRsZSAgICAgICAgICAgVGhlIGZpcm13YXJlIGFsbG9jYXRlZCBoYW5kbGUgZm9yIHRoZSBVRUZJIGltYWdlLgorICBAcGFyYW0gIFN5c3RlbVRhYmxlICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSSBTeXN0ZW0gVGFibGUuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBhIGxhY2sgb2YgcmVzb3VyY2VzLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTUFHRV9FTlRSWV9QT0lOVCkoCisgIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLAorICBJTiAgRUZJX1NZU1RFTV9UQUJMRSAgICAgICAgICAgICAqU3lzdGVtVGFibGUKKyAgKTsKKworLyoqCisgIExvYWRzIGFuIEVGSSBpbWFnZSBpbnRvIG1lbW9yeS4KKworICBAcGFyYW0gIEJvb3RQb2xpY3kgICAgICAgICAgICBJZiBUUlVFLCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBvcmlnaW5hdGVzIGZyb20gdGhlIGJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlciwgYW5kIHRoYXQgdGhlIGJvb3QgbWFuYWdlciBpcyBhdHRlbXB0aW5nIHRvIGxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGggYXMgYSBib290IHNlbGVjdGlvbi4gSWdub3JlZCBpZiBTb3VyY2VCdWZmZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IE5VTEwuCisgIEBwYXJhbSAgUGFyZW50SW1hZ2VIYW5kbGUgICAgIFRoZSBjYWxsZXIncyBpbWFnZSBoYW5kbGUuCisgIEBwYXJhbSAgRGV2aWNlUGF0aCAgICAgICAgICAgIFRoZSBEZXZpY2VIYW5kbGUgc3BlY2lmaWMgZmlsZSBwYXRoIGZyb20gd2hpY2ggdGhlIGltYWdlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZC4KKyAgQHBhcmFtICBTb3VyY2VCdWZmZXIgICAgICAgICAgSWYgbm90IE5VTEwsIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5IGxvY2F0aW9uIGNvbnRhaW5pbmcgYSBjb3B5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBpbWFnZSB0byBiZSBsb2FkZWQuCisgIEBwYXJhbSAgU291cmNlU2l6ZSAgICAgICAgICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIFNvdXJjZUJ1ZmZlci4gSWdub3JlZCBpZiBTb3VyY2VCdWZmZXIgaXMgTlVMTC4KKyAgQHBhcmFtICBJbWFnZUhhbmRsZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgcmV0dXJuZWQgaW1hZ2UgaGFuZGxlIHRoYXQgaXMgY3JlYXRlZCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIEltYWdlIHdhcyBsb2FkZWQgaW50byBtZW1vcnkgY29ycmVjdGx5LgorICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICBCb3RoIFNvdXJjZUJ1ZmZlciBhbmQgRGV2aWNlUGF0aCBhcmUgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVzIGFyZSBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgaW1hZ2UgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBJbWFnZSB3YXMgbm90IGxvYWRlZCBkdWUgdG8gaW5zdWZmaWNpZW50IHJlc291cmNlcy4KKyAgQHJldHZhbCBFRklfTE9BRF9FUlJPUiAgICAgICAgSW1hZ2Ugd2FzIG5vdCBsb2FkZWQgYmVjYXVzZSB0aGUgaW1hZ2UgZm9ybWF0IHdhcyBjb3JydXB0IG9yIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnN0b29kLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBJbWFnZSB3YXMgbm90IGxvYWRlZCBiZWNhdXNlIHRoZSBkZXZpY2UgcmV0dXJuZWQgYSByZWFkIGVycm9yLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTUFHRV9MT0FEKSgKKyAgSU4gIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgQm9vdFBvbGljeSwKKyAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgUGFyZW50SW1hZ2VIYW5kbGUsCisgIElOICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICpEZXZpY2VQYXRoLAorICBJTiAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqU291cmNlQnVmZmVyIE9QVElPTkFMLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VTaXplLAorICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAqSW1hZ2VIYW5kbGUKKyAgKTsKKworLyoqCisgIFRyYW5zZmVycyBjb250cm9sIHRvIGEgbG9hZGVkIGltYWdlJ3MgZW50cnkgcG9pbnQuCisKKyAgQHBhcmFtICBJbWFnZUhhbmRsZSAgICAgICAgICAgSGFuZGxlIG9mIGltYWdlIHRvIGJlIHN0YXJ0ZWQuCisgIEBwYXJhbSAgRXhpdERhdGFTaXplICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiBFeGl0RGF0YS4KKyAgQHBhcmFtICBFeGl0RGF0YSAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBvaW50ZXIgdG8gYSBkYXRhIGJ1ZmZlciB0aGF0IGluY2x1ZGVzIGEgTnVsbC10ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGUgc3RyaW5nLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYmluYXJ5IGRhdGEuCisKKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgSW1hZ2VIYW5kbGUgaXMgZWl0aGVyIGFuIGludmFsaWQgaW1hZ2UgaGFuZGxlIG9yIHRoZSBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggU3RhcnRJbWFnZQorICBAcmV0dXJuIEV4aXQgY29kZSBmcm9tIGltYWdlCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lNQUdFX1NUQVJUKSgKKyAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZSwKKyAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqRXhpdERhdGFTaXplLAorICBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICoqRXhpdERhdGEgICAgT1BUSU9OQUwKKyAgKTsKKworLyoqCisgIFRlcm1pbmF0ZXMgYSBsb2FkZWQgRUZJIGltYWdlIGFuZCByZXR1cm5zIGNvbnRyb2wgdG8gYm9vdCBzZXJ2aWNlcy4KKworICBAcGFyYW0gIEltYWdlSGFuZGxlICAgICAgICAgICBIYW5kbGUgdGhhdCBpZGVudGlmaWVzIHRoZSBpbWFnZS4KKyAgQHBhcmFtICBFeGl0U3RhdHVzICAgICAgICAgICAgVGhlIGltYWdlJ3MgZXhpdCBjb2RlLgorICBAcGFyYW0gIEV4aXREYXRhU2l6ZSAgICAgICAgICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIEV4aXREYXRhLgorICBAcGFyYW0gIEV4aXREYXRhICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgZGF0YSBidWZmZXIgdGhhdCBpbmNsdWRlcyBhIE51bGwtdGVybWluYXRlZCBVbmljb2RlIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGJpbmFyeSBkYXRhLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBpbWFnZSBzcGVjaWZpZWQgYnkgSW1hZ2VIYW5kbGUgd2FzIHVubG9hZGVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBUaGUgaW1hZ2Ugc3BlY2lmaWVkIGJ5IEltYWdlSGFuZGxlIGhhcyBiZWVuIGxvYWRlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCB3aXRoIExvYWRJbWFnZSgpIGFuZCBTdGFydEltYWdlKCksIGJ1dCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaXMgbm90IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGltYWdlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9FWElUKSgKKyAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgSW1hZ2VIYW5kbGUsCisgIElOICBFRklfU1RBVFVTICAgICAgICAgICAgICAgICAgIEV4aXRTdGF0dXMsCisgIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEV4aXREYXRhU2l6ZSwKKyAgSU4gIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgKkV4aXREYXRhICAgICBPUFRJT05BTAorICApOworCisvKioKKyAgVW5sb2FkcyBhbiBpbWFnZS4KKworICBAcGFyYW0gIEltYWdlSGFuZGxlICAgICAgICAgICBIYW5kbGUgdGhhdCBpZGVudGlmaWVzIHRoZSBpbWFnZSB0byBiZSB1bmxvYWRlZC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgaW1hZ2UgaGFzIGJlZW4gdW5sb2FkZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEltYWdlSGFuZGxlIGlzIG5vdCBhIHZhbGlkIGltYWdlIGhhbmRsZS4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIGltYWdlIGhhcyBiZWVuIHN0YXJ0ZWQsIGFuZCBkb2VzIG5vdCBzdXBwb3J0IHVubG9hZC4KKyAgQHJldHVybiBFeGl0IGNvZGUgZnJvbSB0aGUgaW1hZ2UncyB1bmxvYWQgaGFuZGxlcgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9JTUFHRV9VTkxPQUQpKAorICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZQorICApOworCisvKioKKyAgVGVybWluYXRlcyBhbGwgYm9vdCBzZXJ2aWNlcy4KKworICBAcGFyYW0gIEltYWdlSGFuZGxlICAgICAgICAgICBIYW5kbGUgdGhhdCBpZGVudGlmaWVzIHRoZSBleGl0aW5nIGltYWdlLgorICBAcGFyYW0gIE1hcEtleSAgICAgICAgICAgICAgICBLZXkgdG8gdGhlIGxhdGVzdCBtZW1vcnkgbWFwLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIEJvb3Qgc2VydmljZXMgaGF2ZSBiZWVuIHRlcm1pbmF0ZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE1hcEtleSBpcyBpbmNvcnJlY3QuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0VYSVRfQk9PVF9TRVJWSUNFUykoCisgIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBNYXBLZXkKKyAgKTsKKworLyoqCisgIEluZHVjZXMgYSBmaW5lLWdyYWluZWQgc3RhbGwuCisKKyAgQHBhcmFtICBNaWNyb3NlY29uZHMgICAgICAgICAgVGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgdG8gc3RhbGwgZXhlY3V0aW9uLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIEV4ZWN1dGlvbiB3YXMgc3RhbGxlZCBhdCBsZWFzdCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNyb3NlY29uZHMuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NUQUxMKSgKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICBNaWNyb3NlY29uZHMKKyAgKTsKKworLyoqCisgIFNldHMgdGhlIHN5c3RlbSdzIHdhdGNoZG9nIHRpbWVyLgorCisgIEBwYXJhbSAgVGltZW91dCAgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBzZXQgdGhlIHdhdGNoZG9nIHRpbWVyIHRvLgorICBAcGFyYW0gIFdhdGNoZG9nQ29kZSAgICAgICAgICBUaGUgbnVtZXJpYyBjb2RlIHRvIGxvZyBvbiBhIHdhdGNoZG9nIHRpbWVyIHRpbWVvdXQgZXZlbnQuCisgIEBwYXJhbSAgRGF0YVNpemUgICAgICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgV2F0Y2hkb2dEYXRhLgorICBAcGFyYW0gIFdhdGNoZG9nRGF0YSAgICAgICAgICBBIGRhdGEgYnVmZmVyIHRoYXQgaW5jbHVkZXMgYSBOdWxsLXRlcm1pbmF0ZWQgVW5pY29kZSBzdHJpbmcsIG9wdGlvbmFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBiaW5hcnkgZGF0YS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgdGltZW91dCBoYXMgYmVlbiBzZXQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFRoZSBzdXBwbGllZCBXYXRjaGRvZ0NvZGUgaXMgaW52YWxpZC4KKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgd2F0Y2hkb2cgdGltZXIuCisgIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSB3YXRjaCBkb2cgdGltZXIgY291bGQgbm90IGJlIHByb2dyYW1tZWQgZHVlIHRvIGEgaGFyZHdhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1NFVF9XQVRDSERPR19USU1FUikoCisgIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAorICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgV2F0Y2hkb2dDb2RlLAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgRGF0YVNpemUsCisgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAqV2F0Y2hkb2dEYXRhIE9QVElPTkFMCisgICk7CisKKy8vLworLy8vIEVudW1lcmF0aW9uIG9mIHJlc2V0IHR5cGVzLgorLy8vCit0eXBlZGVmIGVudW0geworICBFZmlSZXNldENvbGQsCisgIEVmaVJlc2V0V2FybSwKKyAgRWZpUmVzZXRTaHV0ZG93biwKKyAgRWZpUmVzZXRVcGRhdGUKK30gRUZJX1JFU0VUX1RZUEU7CisKKy8qKgorICBSZXNldHMgdGhlIGVudGlyZSBwbGF0Zm9ybS4KKworICBAcGFyYW0gIFJlc2V0VHlwZSAgICAgICAgICAgICBUaGUgdHlwZSBvZiByZXNldCB0byBwZXJmb3JtLgorICBAcGFyYW0gIFJlc2V0U3RhdHVzICAgICAgICAgICBUaGUgc3RhdHVzIGNvZGUgZm9yIHRoZSByZXNldC4KKyAgQHBhcmFtICBEYXRhU2l6ZSAgICAgICAgICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBXYXRjaGRvZ0RhdGEuCisgIEBwYXJhbSAgUmVzZXREYXRhICAgICAgICAgICAgIEZvciBhIFJlc2V0VHlwZSBvZiBFZmlSZXNldENvbGQsIEVmaVJlc2V0V2FybSwgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWZpUmVzZXRTaHV0ZG93biB0aGUgZGF0YSBidWZmZXIgc3RhcnRzIHdpdGggYSBOdWxsLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZSBzdHJpbmcsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBiaW5hcnkgZGF0YS4KKworKiovCit0eXBlZGVmCitWT0lECisoRUZJQVBJICpFRklfUkVTRVRfU1lTVEVNKSgKKyAgSU4gRUZJX1JFU0VUX1RZUEUgICAgICAgICAgIFJlc2V0VHlwZSwKKyAgSU4gRUZJX1NUQVRVUyAgICAgICAgICAgICAgIFJlc2V0U3RhdHVzLAorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgRGF0YVNpemUsCisgIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAqUmVzZXREYXRhIE9QVElPTkFMCisgICk7CisKKy8qKgorICBSZXR1cm5zIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGNvdW50IGZvciB0aGUgcGxhdGZvcm0uCisKKyAgQHBhcmFtICBDb3VudCAgICAgICAgICAgICAgICAgUG9pbnRlciB0byByZXR1cm5lZCB2YWx1ZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV4dCBtb25vdG9uaWMgY291bnQgd2FzIHJldHVybmVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBDb3VudCBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgZGV2aWNlIGlzIG5vdCBmdW5jdGlvbmluZyBwcm9wZXJseS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX05FWFRfTU9OT1RPTklDX0NPVU5UKSgKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgICpDb3VudAorICApOworCisvKioKKyAgUmV0dXJucyB0aGUgbmV4dCBoaWdoIDMyIGJpdHMgb2YgdGhlIHBsYXRmb3JtJ3MgbW9ub3RvbmljIGNvdW50ZXIuCisKKyAgQHBhcmFtICBIaWdoQ291bnQgICAgICAgICAgICAgUG9pbnRlciB0byByZXR1cm5lZCB2YWx1ZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV4dCBoaWdoIG1vbm90b25pYyBjb3VudCB3YXMgcmV0dXJuZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEhpZ2hDb3VudCBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgZGV2aWNlIGlzIG5vdCBmdW5jdGlvbmluZyBwcm9wZXJseS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfR0VUX05FWFRfSElHSF9NT05PX0NPVU5UKSgKKyAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICpIaWdoQ291bnQKKyAgKTsKKworLyoqCisgIENvbXB1dGVzIGFuZCByZXR1cm5zIGEgMzItYml0IENSQyBmb3IgYSBkYXRhIGJ1ZmZlci4KKworICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvbiB3aGljaCB0aGUgMzItYml0IENSQyBpcyB0byBiZSBjb21wdXRlZC4KKyAgQHBhcmFtICBEYXRhU2l6ZSAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIERhdGEuCisgIEBwYXJhbSAgQ3JjMzIgICAgICAgICAgICAgICAgIFRoZSAzMi1iaXQgQ1JDIHRoYXQgd2FzIGNvbXB1dGVkIGZvciB0aGUgZGF0YSBidWZmZXIgc3BlY2lmaWVkIGJ5IERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIERhdGFTaXplLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSAzMi1iaXQgQ1JDIHdhcyBjb21wdXRlZCBmb3IgdGhlIGRhdGEgYnVmZmVyIGFuZCByZXR1cm5lZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmMzMi4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgRGF0YSBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBDcmMzMiBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBEYXRhU2l6ZSBpcyAwLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9DQUxDVUxBVEVfQ1JDMzIpKAorICBJTiAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpEYXRhLAorICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTaXplLAorICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpDcmMzMgorICApOworCisvKioKKyAgQ29waWVzIHRoZSBjb250ZW50cyBvZiBvbmUgYnVmZmVyIHRvIGFub3RoZXIgYnVmZmVyLgorCisgIEBwYXJhbSAgRGVzdGluYXRpb24gICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBvZiB0aGUgbWVtb3J5IGNvcHkuCisgIEBwYXJhbSAgU291cmNlICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSBidWZmZXIgb2YgdGhlIG1lbW9yeSBjb3B5LgorICBAcGFyYW0gIExlbmd0aCAgICAgICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIFNvdXJjZSB0byBEZXN0aW5hdGlvbi4KKworKiovCit0eXBlZGVmCitWT0lECisoRUZJQVBJICpFRklfQ09QWV9NRU0pKAorICBJTiBWT0lEICAgICAqRGVzdGluYXRpb24sCisgIElOIFZPSUQgICAgICpTb3VyY2UsCisgIElOIFVJTlROICAgIExlbmd0aAorICApOworCisvKioKKyAgVGhlIFNldE1lbSgpIGZ1bmN0aW9uIGZpbGxzIGEgYnVmZmVyIHdpdGggYSBzcGVjaWZpZWQgdmFsdWUuCisKKyAgQHBhcmFtICBCdWZmZXIgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGZpbGwuCisgIEBwYXJhbSAgU2l6ZSAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBieXRlcyBpbiBCdWZmZXIgdG8gZmlsbC4KKyAgQHBhcmFtICBWYWx1ZSAgICAgICAgICAgICAgICAgVmFsdWUgdG8gZmlsbCBCdWZmZXIgd2l0aC4KKworKiovCit0eXBlZGVmCitWT0lECisoRUZJQVBJICpFRklfU0VUX01FTSkoCisgIElOIFZPSUQgICAgICpCdWZmZXIsCisgIElOIFVJTlROICAgIFNpemUsCisgIElOIFVJTlQ4ICAgIFZhbHVlCisgICk7CisKKworLy8KKy8vIFByb3RvY29sIGhhbmRsZXIgZnVuY3Rpb25zCisvLwordHlwZWRlZiBlbnVtIHsKKyAgRUZJX05BVElWRV9JTlRFUkZBQ0UKK30gRUZJX0lOVEVSRkFDRV9UWVBFOworCisvKioKKyAgSW5zdGFsbHMgYSBwcm90b2NvbCBpbnRlcmZhY2Ugb24gYSBkZXZpY2UgaGFuZGxlLiBJZiB0aGUgaGFuZGxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIGFuZCBhZGRlZAorICB0byB0aGUgbGlzdCBvZiBoYW5kbGVzIGluIHRoZSBzeXN0ZW0uIEluc3RhbGxNdWx0aXBsZVByb3RvY29sSW50ZXJmYWNlcygpIHBlcmZvcm1zCisgIG1vcmUgZXJyb3IgY2hlY2tpbmcgdGhhbiBJbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2UoKSwgc28gaXQgaXMgcmVjb21tZW5kZWQgdGhhdAorICBJbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVyZmFjZXMoKSBiZSB1c2VkIGluIHBsYWNlIG9mCisgIEluc3RhbGxQcm90b2NvbEludGVyZmFjZSgpCisKKyAgQHBhcmFtICBIYW5kbGUgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfSEFORExFIG9uIHdoaWNoIHRoZSBpbnRlcmZhY2UgaXMgdG8gYmUgaW5zdGFsbGVkLgorICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlLgorICBAcGFyYW0gIEludGVyZmFjZVR5cGUgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBJbnRlcmZhY2UgaXMgc3VwcGxpZWQgaW4gbmF0aXZlIGZvcm0uCisgIEBwYXJhbSAgSW50ZXJmYWNlICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBwcm90b2NvbCBpbnRlcmZhY2Ugd2FzIGluc3RhbGxlZC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgU3BhY2UgZm9yIGEgbmV3IGhhbmRsZSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBIYW5kbGUgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgUHJvdG9jb2wgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgSW50ZXJmYWNlVHlwZSBpcyBub3QgRUZJX05BVElWRV9JTlRFUkZBQ0UuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFByb3RvY29sIGlzIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoZSBoYW5kbGUgc3BlY2lmaWVkIGJ5IEhhbmRsZS4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfSU5TVEFMTF9QUk9UT0NPTF9JTlRFUkZBQ0UpKAorICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICpIYW5kbGUsCisgIElOICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICBJTiAgICAgRUZJX0lOVEVSRkFDRV9UWVBFICAgICAgIEludGVyZmFjZVR5cGUsCisgIElOICAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgKkludGVyZmFjZQorICApOworCisvKioKKyAgSW5zdGFsbHMgb25lIG9yIG1vcmUgcHJvdG9jb2wgaW50ZXJmYWNlcyBpbnRvIHRoZSBib290IHNlcnZpY2VzIGVudmlyb25tZW50LgorCisgIEBwYXJhbSAgSGFuZGxlICAgICAgICAgICAgICAgIFRoZSBoYW5kbGUgdG8gaW5zdGFsbCB0aGUgbmV3IHByb3RvY29sIGludGVyZmFjZXMgb24sIG9yIE5VTEwgaWYgYSBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIGlzIHRvIGJlIGFsbG9jYXRlZC4KKyAgQHBhcmFtICAuLi4gICAgICAgICAgICAgICAgICAgQSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgcGFpcnMgb2YgcHJvdG9jb2wgR1VJRHMgYW5kIHByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZXMuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgQWxsIHRoZSBwcm90b2NvbCBpbnRlcmZhY2Ugd2FzIGluc3RhbGxlZC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IGluIHBvb2wgdG8gaW5zdGFsbCBhbGwgdGhlIHByb3RvY29scy4KKyAgQHJldHZhbCBFRklfQUxSRUFEWV9TVEFSVEVEICAgQSBEZXZpY2UgUGF0aCBQcm90b2NvbCBpbnN0YW5jZSB3YXMgcGFzc2VkIGluIHRoYXQgaXMgYWxyZWFkeSBwcmVzZW50IGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoYW5kbGUgZGF0YWJhc2UuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lOU1RBTExfTVVMVElQTEVfUFJPVE9DT0xfSU5URVJGQUNFUykoCisgIElOIE9VVCBFRklfSEFORExFICAgICAgICAgICAqSGFuZGxlLAorICAuLi4KKyAgKTsKKworLyoqCisgIFJlaW5zdGFsbHMgYSBwcm90b2NvbCBpbnRlcmZhY2Ugb24gYSBkZXZpY2UgaGFuZGxlLgorCisgIEBwYXJhbSAgSGFuZGxlICAgICAgICAgICAgICAgIEhhbmRsZSBvbiB3aGljaCB0aGUgaW50ZXJmYWNlIGlzIHRvIGJlIHJlaW5zdGFsbGVkLgorICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgaW50ZXJmYWNlLgorICBAcGFyYW0gIE9sZEludGVyZmFjZSAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIG9sZCBpbnRlcmZhY2UuIE5VTEwgY2FuIGJlIHVzZWQgaWYgYSBzdHJ1Y3R1cmUgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBQcm90b2NvbC4KKyAgQHBhcmFtICBOZXdJbnRlcmZhY2UgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBuZXcgaW50ZXJmYWNlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBwcm90b2NvbCBpbnRlcmZhY2Ugd2FzIHJlaW5zdGFsbGVkLgorICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICBUaGUgT2xkSW50ZXJmYWNlIG9uIHRoZSBoYW5kbGUgd2FzIG5vdCBmb3VuZC4KKyAgQHJldHZhbCBFRklfQUNDRVNTX0RFTklFRCAgICAgVGhlIHByb3RvY29sIGludGVyZmFjZSBjb3VsZCBub3QgYmUgcmVpbnN0YWxsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgT2xkSW50ZXJmYWNlIGlzIHN0aWxsIGJlaW5nIHVzZWQgYnkgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgdGhhdCB3aWxsIG5vdCByZWxlYXNlIGl0LgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBIYW5kbGUgaXMgbm90IGEgdmFsaWQgRUZJX0hBTkRMRS4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgUHJvdG9jb2wgaXMgTlVMTC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUkVJTlNUQUxMX1BST1RPQ09MX0lOVEVSRkFDRSkoCisgIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBIYW5kbGUsCisgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqT2xkSW50ZXJmYWNlLAorICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKk5ld0ludGVyZmFjZQorICApOworCisvKioKKyAgUmVtb3ZlcyBhIHByb3RvY29sIGludGVyZmFjZSBmcm9tIGEgZGV2aWNlIGhhbmRsZS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdAorICBVbmluc3RhbGxNdWx0aXBsZVByb3RvY29sSW50ZXJmYWNlcygpIGJlIHVzZWQgaW4gcGxhY2Ugb2YKKyAgVW5pbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2UoKS4KKworICBAcGFyYW0gIEhhbmRsZSAgICAgICAgICAgICAgICBUaGUgaGFuZGxlIG9uIHdoaWNoIHRoZSBpbnRlcmZhY2Ugd2FzIGluc3RhbGxlZC4KKyAgQHBhcmFtICBQcm90b2NvbCAgICAgICAgICAgICAgVGhlIG51bWVyaWMgSUQgb2YgdGhlIGludGVyZmFjZS4KKyAgQHBhcmFtICBJbnRlcmZhY2UgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBpbnRlcmZhY2UuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGludGVyZmFjZSB3YXMgcmVtb3ZlZC4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgVGhlIGludGVyZmFjZSB3YXMgbm90IGZvdW5kLgorICBAcmV0dmFsIEVGSV9BQ0NFU1NfREVOSUVEICAgICBUaGUgaW50ZXJmYWNlIHdhcyBub3QgcmVtb3ZlZCBiZWNhdXNlIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3RpbGwgYmVpbmcgdXNlZCBieSBhIGRyaXZlci4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgSGFuZGxlIGlzIG5vdCBhIHZhbGlkIEVGSV9IQU5ETEUuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFByb3RvY29sIGlzIE5VTEwuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VOSU5TVEFMTF9QUk9UT0NPTF9JTlRFUkZBQ0UpKAorICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgSGFuZGxlLAorICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKkludGVyZmFjZQorICApOworCisvKioKKyAgUmVtb3ZlcyBvbmUgb3IgbW9yZSBwcm90b2NvbCBpbnRlcmZhY2VzIGludG8gdGhlIGJvb3Qgc2VydmljZXMgZW52aXJvbm1lbnQuCisKKyAgQHBhcmFtICBIYW5kbGUgICAgICAgICAgICAgICAgVGhlIGhhbmRsZSB0byByZW1vdmUgdGhlIHByb3RvY29sIGludGVyZmFjZXMgZnJvbS4KKyAgQHBhcmFtICAuLi4gICAgICAgICAgICAgICAgICAgQSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgcGFpcnMgb2YgcHJvdG9jb2wgR1VJRHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sIGludGVyZmFjZXMuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgQWxsIHRoZSBwcm90b2NvbCBpbnRlcmZhY2VzIHdlcmUgcmVtb3ZlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9mIHRoZSBwcm90b2NvbCBpbnRlcmZhY2VzIHdhcyBub3QgcHJldmlvdXNseSBpbnN0YWxsZWQgb24gSGFuZGxlLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9VTklOU1RBTExfTVVMVElQTEVfUFJPVE9DT0xfSU5URVJGQUNFUykoCisgIElOIEVGSV9IQU5ETEUgICAgICAgICAgIEhhbmRsZSwKKyAgLi4uCisgICk7CisKKy8qKgorICBRdWVyaWVzIGEgaGFuZGxlIHRvIGRldGVybWluZSBpZiBpdCBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm90b2NvbC4KKworICBAcGFyYW0gIEhhbmRsZSAgICAgICAgICAgICAgICBUaGUgaGFuZGxlIGJlaW5nIHF1ZXJpZWQuCisgIEBwYXJhbSAgUHJvdG9jb2wgICAgICAgICAgICAgIFRoZSBwdWJsaXNoZWQgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByb3RvY29sLgorICBAcGFyYW0gIEludGVyZmFjZSAgICAgICAgICAgICBTdXBwbGllcyB0aGUgYWRkcmVzcyB3aGVyZSBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlIGlzIHJldHVybmVkLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wgd2FzIHJldHVybmVkLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgSGFuZGxlIGlzIG5vdCBhIHZhbGlkIEVGSV9IQU5ETEUuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFByb3RvY29sIGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEludGVyZmFjZSBpcyBOVUxMLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9IQU5ETEVfUFJPVE9DT0wpKAorICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgSU4gIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgKipJbnRlcmZhY2UKKyAgKTsKKworI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9CWV9IQU5ETEVfUFJPVE9DT0wgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfR0VUX1BST1RPQ09MICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX1RFU1RfUFJPVE9DT0wgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9CWV9DSElMRF9DT05UUk9MTEVSIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfQllfRFJJVkVSICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX0VYQ0xVU0lWRSAgICAgICAgICAgMHgwMDAwMDAyMAorCisvKioKKyAgUXVlcmllcyBhIGhhbmRsZSB0byBkZXRlcm1pbmUgaWYgaXQgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvdG9jb2wuIElmIHRoZSBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgYnkgdGhlCisgIGhhbmRsZSwgaXQgb3BlbnMgdGhlIHByb3RvY29sIG9uIGJlaGFsZiBvZiB0aGUgY2FsbGluZyBhZ2VudC4KKworICBAcGFyYW0gIEhhbmRsZSAgICAgICAgICAgICAgICBUaGUgaGFuZGxlIGZvciB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlIHRoYXQgaXMgYmVpbmcgb3BlbmVkLgorICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBUaGUgcHVibGlzaGVkIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm90b2NvbC4KKyAgQHBhcmFtICBJbnRlcmZhY2UgICAgICAgICAgICAgU3VwcGxpZXMgdGhlIGFkZHJlc3Mgd2hlcmUgYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIFByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSBpcyByZXR1cm5lZC4KKyAgQHBhcmFtICBBZ2VudEhhbmRsZSAgICAgICAgICAgVGhlIGhhbmRsZSBvZiB0aGUgYWdlbnQgdGhhdCBpcyBvcGVuaW5nIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IFByb3RvY29sIGFuZCBJbnRlcmZhY2UuCisgIEBwYXJhbSAgQ29udHJvbGxlckhhbmRsZSAgICAgIElmIHRoZSBhZ2VudCB0aGF0IGlzIG9wZW5pbmcgYSBwcm90b2NvbCBpcyBhIGRyaXZlciB0aGF0IGZvbGxvd3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFRkkgRHJpdmVyIE1vZGVsLCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRoZSBjb250cm9sbGVyIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHJlcXVpcmVzIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UuIElmIHRoZSBhZ2VudCBkb2VzIG5vdCBmb2xsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFVFRkkgRHJpdmVyIE1vZGVsLCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsIGFuZCBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgTlVMTC4KKyAgQHBhcmFtICBBdHRyaWJ1dGVzICAgICAgICAgICAgVGhlIG9wZW4gbW9kZSBvZiB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlIHNwZWNpZmllZCBieSBIYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFByb3RvY29sLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIEFuIGl0ZW0gd2FzIGFkZGVkIHRvIHRoZSBvcGVuIGxpc3QgZm9yIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgaW50ZXJmYWNlIHdhcyByZXR1cm5lZCBpbiBJbnRlcmZhY2UuCisgIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIEhhbmRsZSBkb2VzIG5vdCBzdXBwb3J0IFByb3RvY29sLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgorICBAcmV0dmFsIEVGSV9BQ0NFU1NfREVOSUVEICAgICBSZXF1aXJlZCBhdHRyaWJ1dGVzIGNhbid0IGJlIHN1cHBvcnRlZCBpbiBjdXJyZW50IGVudmlyb25tZW50LgorICBAcmV0dmFsIEVGSV9BTFJFQURZX1NUQVJURUQgICBJdGVtIG9uIHRoZSBvcGVuIGxpc3QgYWxyZWFkeSBoYXMgcmVxdWllcmQgYXR0cmlidXRlcyB3aG9zZSBhZ2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgaXMgdGhlIHNhbWUgYXMgQWdlbnRIYW5kbGUuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX09QRU5fUFJPVE9DT0wpKAorICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICBIYW5kbGUsCisgIElOICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgKipJbnRlcmZhY2UsIE9QVElPTkFMCisgIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgIEFnZW50SGFuZGxlLAorICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlLAorICBJTiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzCisgICk7CisKKworLyoqCisgIENsb3NlcyBhIHByb3RvY29sIG9uIGEgaGFuZGxlIHRoYXQgd2FzIG9wZW5lZCB1c2luZyBPcGVuUHJvdG9jb2woKS4KKworICBAcGFyYW0gIEhhbmRsZSAgICAgICAgICAgICAgICBUaGUgaGFuZGxlIGZvciB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlIHRoYXQgd2FzIHByZXZpb3VzbHkgb3BlbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggT3BlblByb3RvY29sKCksIGFuZCBpcyBub3cgYmVpbmcgY2xvc2VkLgorICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBUaGUgcHVibGlzaGVkIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm90b2NvbC4KKyAgQHBhcmFtICBBZ2VudEhhbmRsZSAgICAgICAgICAgVGhlIGhhbmRsZSBvZiB0aGUgYWdlbnQgdGhhdCBpcyBjbG9zaW5nIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UuCisgIEBwYXJhbSAgQ29udHJvbGxlckhhbmRsZSAgICAgIElmIHRoZSBhZ2VudCB0aGF0IG9wZW5lZCBhIHByb3RvY29sIGlzIGEgZHJpdmVyIHRoYXQgZm9sbG93cyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVGSSBEcml2ZXIgTW9kZWwsIHRoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbnRyb2xsZXIgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVxdWlyZWQgdGhlIHByb3RvY29sIGludGVyZmFjZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgcHJvdG9jb2wgaW5zdGFuY2Ugd2FzIGNsb3NlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgMSkgSGFuZGxlIGlzIG5vdCBhIHZhbGlkIEVGSV9IQU5ETEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpIEFnZW50SGFuZGxlIGlzIG5vdCBhIHZhbGlkIEVGSV9IQU5ETEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpIENvbnRyb2xsZXJIYW5kbGUgaXMgbm90IE5VTEwgYW5kIENvbnRyb2xsZXJIYW5kbGUgaXMgbm90IGEgdmFsaWQgRUZJX0hBTkRMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCkgUHJvdG9jb2wgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgMSkgSGFuZGxlIGRvZXMgbm90IHN1cHBvcnQgdGhlIHByb3RvY29sIHNwZWNpZmllZCBieSBQcm90b2NvbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgVGhlIHByb3RvY29sIGludGVyZmFjZSBzcGVjaWZpZWQgYnkgSGFuZGxlIGFuZCBQcm90b2NvbCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IG9wZW4gYnkgQWdlbnRIYW5kbGUgYW5kIENvbnRyb2xsZXJIYW5kbGUuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0NMT1NFX1BST1RPQ09MKSgKKyAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEhhbmRsZSwKKyAgSU4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwKKyAgSU4gRUZJX0hBTkRMRSAgICAgICAgICAgICAgIEFnZW50SGFuZGxlLAorICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZQorICApOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0hBTkRMRSAgQWdlbnRIYW5kbGU7CisgIEVGSV9IQU5ETEUgIENvbnRyb2xsZXJIYW5kbGU7CisgIFVJTlQzMiAgICAgIEF0dHJpYnV0ZXM7CisgIFVJTlQzMiAgICAgIE9wZW5Db3VudDsKK30gRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT05fRU5UUlk7CisKKy8qKgorICBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgYWdlbnRzIHRoYXQgY3VycmVudGx5IGhhdmUgYSBwcm90b2NvbCBpbnRlcmZhY2Ugb3BlbmVkLgorCisgIEBwYXJhbSAgSGFuZGxlICAgICAgICAgICAgICAgIFRoZSBoYW5kbGUgZm9yIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UgdGhhdCBpcyBiZWluZyBxdWVyaWVkLgorICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBUaGUgcHVibGlzaGVkIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm90b2NvbC4KKyAgQHBhcmFtICBFbnRyeUJ1ZmZlciAgICAgICAgICAgQSBwb2ludGVyIHRvIGEgYnVmZmVyIG9mIG9wZW4gcHJvdG9jb2wgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT05fRU5UUlkgc3RydWN0dXJlcy4KKyAgQHBhcmFtICBFbnRyeUNvdW50ICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBFbnRyeUJ1ZmZlci4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgb3BlbiBwcm90b2NvbCBpbmZvcm1hdGlvbiB3YXMgcmV0dXJuZWQgaW4gRW50cnlCdWZmZXIsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgd2FzIHJldHVybmVkIEVudHJ5Q291bnQuCisgIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyBhdmFpbGFibGUgdG8gYWxsb2NhdGUgRW50cnlCdWZmZXIuCisgIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIEhhbmRsZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm90b2NvbCBzcGVjaWZpZWQgYnkgUHJvdG9jb2wuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT04pKAorICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlLAorICBJTiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICBPVVQgRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT05fRU5UUlkgKipFbnRyeUJ1ZmZlciwKKyAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpFbnRyeUNvdW50CisgICk7CisKKy8qKgorICBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcHJvdG9jb2wgaW50ZXJmYWNlIEdVSURzIHRoYXQgYXJlIGluc3RhbGxlZCBvbiBhIGhhbmRsZSBpbiBhIGJ1ZmZlciBhbGxvY2F0ZWQKKyAgZnJvbSBwb29sLgorCisgIEBwYXJhbSAgSGFuZGxlICAgICAgICAgICAgICAgIFRoZSBoYW5kbGUgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBwcm90b2NvbCBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1VJRHMuCisgIEBwYXJhbSAgUHJvdG9jb2xCdWZmZXIgICAgICAgIEEgcG9pbnRlciB0byB0aGUgbGlzdCBvZiBwcm90b2NvbCBpbnRlcmZhY2UgR1VJRCBwb2ludGVycyB0aGF0IGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQgb24gSGFuZGxlLgorICBAcGFyYW0gIFByb3RvY29sQnVmZmVyQ291bnQgICBBIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBHVUlEIHBvaW50ZXJzIHByZXNlbnQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xCdWZmZXIuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGxpc3Qgb2YgcHJvdG9jb2wgaW50ZXJmYWNlIEdVSURzIGluc3RhbGxlZCBvbiBIYW5kbGUgd2FzIHJldHVybmVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sQnVmZmVyLiBUaGUgbnVtYmVyIG9mIHByb3RvY29sIGludGVyZmFjZSBHVUlEcyB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgaW4gUHJvdG9jb2xCdWZmZXJDb3VudC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgaXMgbm90IGVub3VnaCBwb29sIG1lbW9yeSB0byBzdG9yZSB0aGUgcmVzdWx0cy4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgSGFuZGxlIGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEhhbmRsZSBpcyBub3QgYSB2YWxpZCBFRklfSEFORExFLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBQcm90b2NvbEJ1ZmZlciBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBQcm90b2NvbEJ1ZmZlckNvdW50IGlzIE5VTEwuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1BST1RPQ09MU19QRVJfSEFORExFKSgKKyAgSU4gIEVGSV9IQU5ETEUgICAgICBIYW5kbGUsCisgIE9VVCBFRklfR1VJRCAgICAgICAgKioqUHJvdG9jb2xCdWZmZXIsCisgIE9VVCBVSU5UTiAgICAgICAgICAgKlByb3RvY29sQnVmZmVyQ291bnQKKyAgKTsKKworLyoqCisgIENyZWF0ZXMgYW4gZXZlbnQgdGhhdCBpcyB0byBiZSBzaWduYWxlZCB3aGVuZXZlciBhbiBpbnRlcmZhY2UgaXMgaW5zdGFsbGVkIGZvciBhIHNwZWNpZmllZCBwcm90b2NvbC4KKworICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgcHJvdG9jb2wgZm9yIHdoaWNoIHRoZSBldmVudCBpcyB0byBiZSByZWdpc3RlcmVkLgorICBAcGFyYW0gIEV2ZW50ICAgICAgICAgICAgICAgICBFdmVudCB0aGF0IGlzIHRvIGJlIHNpZ25hbGVkIHdoZW5ldmVyIGEgcHJvdG9jb2wgaW50ZXJmYWNlIGlzIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFByb3RvY29sLgorICBAcGFyYW0gIFJlZ2lzdHJhdGlvbiAgICAgICAgICBBIHBvaW50ZXIgdG8gYSBtZW1vcnkgbG9jYXRpb24gdG8gcmVjZWl2ZSB0aGUgcmVnaXN0cmF0aW9uIHZhbHVlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBub3RpZmljYXRpb24gZXZlbnQgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgU3BhY2UgZm9yIHRoZSBub3RpZmljYXRpb24gZXZlbnQgY291bGQgbm90IGJlIGFsbG9jYXRlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgUHJvdG9jb2wgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgRXZlbnQgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgUmVnaXN0cmF0aW9uIGlzIE5VTEwuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1JFR0lTVEVSX1BST1RPQ09MX05PVElGWSkoCisgIElOICBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLAorICBJTiAgRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50LAorICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICoqUmVnaXN0cmF0aW9uCisgICk7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgQWxsSGFuZGxlcywKKyAgQnlSZWdpc3Rlck5vdGlmeSwKKyAgQnlQcm90b2NvbAorfSBFRklfTE9DQVRFX1NFQVJDSF9UWVBFOworCisvKioKKyAgUmV0dXJucyBhbiBhcnJheSBvZiBoYW5kbGVzIHRoYXQgc3VwcG9ydCBhIHNwZWNpZmllZCBwcm90b2NvbC4KKworICBAcGFyYW0gIFNlYXJjaFR5cGUgICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggaGFuZGxlKHMpIGFyZSB0byBiZSByZXR1cm5lZC4KKyAgQHBhcmFtICBQcm90b2NvbCAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwcm90b2NvbCB0byBzZWFyY2ggYnkuCisgIEBwYXJhbSAgU2VhcmNoS2V5ICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgc2VhcmNoIGtleS4KKyAgQHBhcmFtICBCdWZmZXJTaXplICAgICAgICAgICAgT24gaW5wdXQsIHRoZSBzaXplIGluIGJ5dGVzIG9mIEJ1ZmZlci4gT24gb3V0cHV0LCB0aGUgc2l6ZSBpbiBieXRlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXJyYXkgcmV0dXJuZWQgaW4gQnVmZmVyIChpZiB0aGUgYnVmZmVyIHdhcyBsYXJnZSBlbm91Z2gpIG9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBpbiBieXRlcywgb2YgdGhlIGJ1ZmZlciBuZWVkZWQgdG8gb2J0YWluIHRoZSBhcnJheSAoaWYgdGhlIGJ1ZmZlciB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGxhcmdlIGVub3VnaCkuCisgIEBwYXJhbSAgQnVmZmVyICAgICAgICAgICAgICAgIFRoZSBidWZmZXIgaW4gd2hpY2ggdGhlIGFycmF5IGlzIHJldHVybmVkLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBhcnJheSBvZiBoYW5kbGVzIHdhcyByZXR1cm5lZC4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgTm8gaGFuZGxlcyBtYXRjaCB0aGUgc2VhcmNoLgorICBAcmV0dmFsIEVGSV9CVUZGRVJfVE9PX1NNQUxMICBUaGUgQnVmZmVyU2l6ZSBpcyB0b28gc21hbGwgZm9yIHRoZSByZXN1bHQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFNlYXJjaFR5cGUgaXMgbm90IGEgbWVtYmVyIG9mIEVGSV9MT0NBVEVfU0VBUkNIX1RZUEUuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFNlYXJjaFR5cGUgaXMgQnlSZWdpc3Rlck5vdGlmeSBhbmQgU2VhcmNoS2V5IGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFNlYXJjaFR5cGUgaXMgQnlQcm90b2NvbCBhbmQgUHJvdG9jb2wgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgbWF0Y2hlcyBhcmUgZm91bmQgYW5kIEJ1ZmZlclNpemUgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQnVmZmVyU2l6ZSBpcyBsYXJnZSBlbm91Z2ggZm9yIHRoZSByZXN1bHQgYW5kIEJ1ZmZlciBpcyBOVUxMLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9MT0NBVEVfSEFORExFKSgKKyAgSU4gICAgIEVGSV9MT0NBVEVfU0VBUkNIX1RZUEUgICBTZWFyY2hUeXBlLAorICBJTiAgICAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwgICAgT1BUSU9OQUwKKyAgSU4gICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAqU2VhcmNoS2V5LCAgIE9QVElPTkFMCisgIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsCisgIE9VVCAgICBFRklfSEFORExFICAgICAgICAgICAgICAgKkJ1ZmZlcgorICApOworCisvKioKKyAgTG9jYXRlcyB0aGUgaGFuZGxlIHRvIGEgZGV2aWNlIG9uIHRoZSBkZXZpY2UgcGF0aCB0aGF0IHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisKKyAgQHBhcmFtICBQcm90b2NvbCAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwcm90b2NvbCB0byBzZWFyY2ggZm9yLgorICBAcGFyYW0gIERldmljZVBhdGggICAgICAgICAgICBPbiBpbnB1dCwgYSBwb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlIHBhdGguIE9uIG91dHB1dCwgdGhlIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoIHBvaW50ZXIgaXMgbW9kaWZpZWQgdG8gcG9pbnQgdG8gdGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC4KKyAgQHBhcmFtICBEZXZpY2UgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSByZXR1cm5lZCBkZXZpY2UgaGFuZGxlLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSByZXN1bHRpbmcgaGFuZGxlIHdhcyByZXR1cm5lZC4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgTm8gaGFuZGxlcyBtYXRjaCB0aGUgc2VhcmNoLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBQcm90b2NvbCBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBEZXZpY2VQYXRoIGlzIE5VTEwuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEEgaGFuZGxlIG1hdGNoZWQgdGhlIHNlYXJjaCBhbmQgRGV2aWNlIGlzIE5VTEwuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0xPQ0FURV9ERVZJQ0VfUEFUSCkoCisgIElOICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsCisgIElOIE9VVCBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgICAqKkRldmljZVBhdGgsCisgIE9VVCAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAqRGV2aWNlCisgICk7CisKKy8qKgorICBBZGRzLCB1cGRhdGVzLCBvciByZW1vdmVzIGEgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyeSBmcm9tIHRoZSBFRkkgU3lzdGVtIFRhYmxlLgorCisgIEBwYXJhbSAgR3VpZCAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgR1VJRCBmb3IgdGhlIGVudHJ5IHRvIGFkZCwgdXBkYXRlLCBvciByZW1vdmUuCisgIEBwYXJhbSAgVGFibGUgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgY29uZmlndXJhdGlvbiB0YWJsZSBmb3IgdGhlIGVudHJ5IHRvIGFkZCwgdXBkYXRlLCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUuIE1heSBiZSBOVUxMLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSAoR3VpZCwgVGFibGUpIHBhaXIgd2FzIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLgorICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGRlbGV0ZSBhIG5vbmV4aXN0ZW50IGVudHJ5LgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBHdWlkIGlzIG5vdCB2YWxpZC4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgYXZhaWxhYmxlIHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0lOU1RBTExfQ09ORklHVVJBVElPTl9UQUJMRSkoCisgIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqR3VpZCwKKyAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICpUYWJsZQorICApOworCisKKy8qKgorICBSZXR1cm5zIGFuIGFycmF5IG9mIGhhbmRsZXMgdGhhdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgaW4gYSBidWZmZXIgYWxsb2NhdGVkIGZyb20gcG9vbC4KKworICBAcGFyYW0gIFNlYXJjaFR5cGUgICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggaGFuZGxlKHMpIGFyZSB0byBiZSByZXR1cm5lZC4KKyAgQHBhcmFtICBQcm90b2NvbCAgICAgICAgICAgICAgUHJvdmlkZXMgdGhlIHByb3RvY29sIHRvIHNlYXJjaCBieS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB2YWxpZCBmb3IgYSBTZWFyY2hUeXBlIG9mIEJ5UHJvdG9jb2wuCisgIEBwYXJhbSAgU2VhcmNoS2V5ICAgICAgICAgICAgIFN1cHBsaWVzIHRoZSBzZWFyY2gga2V5IGRlcGVuZGluZyBvbiB0aGUgU2VhcmNoVHlwZS4KKyAgQHBhcmFtICBOb0hhbmRsZXMgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBoYW5kbGVzIHJldHVybmVkIGluIEJ1ZmZlci4KKyAgQHBhcmFtICBCdWZmZXIgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmV0dXJuIHRoZSByZXF1ZXN0ZWQgYXJyYXkgb2YgaGFuZGxlcyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgUHJvdG9jb2wuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGFycmF5IG9mIGhhbmRsZXMgd2FzIHJldHVybmVkIGluIEJ1ZmZlciwgYW5kIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcyBpbiBCdWZmZXIgd2FzIHJldHVybmVkIGluIE5vSGFuZGxlcy4KKyAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgTm8gaGFuZGxlcyBtYXRjaCB0aGUgc2VhcmNoLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGVyZSBpcyBub3QgZW5vdWdoIHBvb2wgbWVtb3J5IHRvIHN0b3JlIHRoZSBtYXRjaGluZyByZXN1bHRzLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBOb0hhbmRsZXMgaXMgTlVMTC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQnVmZmVyIGlzIE5VTEwuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0xPQ0FURV9IQU5ETEVfQlVGRkVSKSgKKyAgSU4gICAgIEVGSV9MT0NBVEVfU0VBUkNIX1RZUEUgICAgICAgU2VhcmNoVHlwZSwKKyAgSU4gICAgIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgKlByb3RvY29sLCAgICAgIE9QVElPTkFMCisgIElOICAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpTZWFyY2hLZXksICAgICBPUFRJT05BTAorICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAqTm9IYW5kbGVzLAorICBPVVQgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAqKkJ1ZmZlcgorICApOworCisvKioKKyAgUmV0dXJucyB0aGUgZmlyc3QgcHJvdG9jb2wgaW5zdGFuY2UgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBwcm90b2NvbC4KKworICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBQcm92aWRlcyB0aGUgcHJvdG9jb2wgdG8gc2VhcmNoIGZvci4KKyAgQHBhcmFtICBSZWdpc3RyYXRpb24gICAgICAgICAgT3B0aW9uYWwgcmVnaXN0cmF0aW9uIGtleSByZXR1cm5lZCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyUHJvdG9jb2xOb3RpZnkoKS4KKyAgQHBhcmFtICBJbnRlcmZhY2UgICAgICAgICAgICAgT24gcmV0dXJuLCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGludGVyZmFjZSB0aGF0IG1hdGNoZXMgUHJvdG9jb2wgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdHJhdGlvbi4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBBIHByb3RvY29sIGluc3RhbmNlIG1hdGNoaW5nIFByb3RvY29sIHdhcyBmb3VuZCBhbmQgcmV0dXJuZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlLgorICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICBObyBwcm90b2NvbCBpbnN0YW5jZXMgd2VyZSBmb3VuZCB0aGF0IG1hdGNoIFByb3RvY29sIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RyYXRpb24uCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEludGVyZmFjZSBpcyBOVUxMLgorCisqKi8KK3R5cGVkZWYKK0VGSV9TVEFUVVMKKyhFRklBUEkgKkVGSV9MT0NBVEVfUFJPVE9DT0wpKAorICBJTiAgRUZJX0dVSUQgICpQcm90b2NvbCwKKyAgSU4gIFZPSUQgICAgICAqUmVnaXN0cmF0aW9uLCBPUFRJT05BTAorICBPVVQgVk9JRCAgICAgICoqSW50ZXJmYWNlCisgICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsKKyAgdW5pb24geworICAgIEVGSV9QSFlTSUNBTF9BRERSRVNTICBEYXRhQmxvY2s7CisgICAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgIENvbnRpbnVhdGlvblBvaW50ZXI7CisgIH0gVW5pb247Cit9IEVGSV9DQVBTVUxFX0JMT0NLX0RFU0NSSVBUT1I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUZJX0dVSUQgICAgICAgICAgQ2Fwc3VsZUd1aWQ7CisgIFVJTlQzMiAgICAgICAgICAgIEhlYWRlclNpemU7CisgIFVJTlQzMiAgICAgICAgICAgIEZsYWdzOworICBVSU5UMzIgICAgICAgICAgICBDYXBzdWxlSW1hZ2VTaXplOworfSBFRklfQ0FQU1VMRV9IRUFERVI7CisKKy8vCisvLyBUaGUgRUZJIFN5c3RlbSBUYWJsZSBlbnRyeSBtdXN0IHBvaW50IHRvIGFuIGFycmF5IG9mIGNhcHN1bGVzCisvLyB0aGF0IGNvbnRhaW4gdGhlIHNhbWUgQ2Fwc3VsZUd1aWQgdmFsdWUuIFRoZSBhcnJheSBtdXN0IGJlCisvLyBwcmVmaXhlZCBieSBhIFVJTlQzMiB0aGF0IHJlcHJlc2VudHMgdGhlIHNpemUgb2YgdGhlIGFycmF5IG9mIGNhcHN1bGVzLgorLy8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVDMyICAgQ2Fwc3VsZUFycmF5TnVtYmVyOworICBWT0lEKiAgICBDYXBzdWxlUHRyWzFdOworfSBFRklfQ0FQU1VMRV9UQUJMRTsKKworI2RlZmluZSBDQVBTVUxFX0ZMQUdTX1BFUlNJU1RfQUNST1NTX1JFU0VUICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQ0FQU1VMRV9GTEFHU19QT1BVTEFURV9TWVNURU1fVEFCTEUgICAgICAgICAweDAwMDIwMDAwCisKKy8qKgorICBQYXNzZXMgY2Fwc3VsZXMgdG8gdGhlIGZpcm13YXJlIHdpdGggYm90aCB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBtYXBwaW5nLiBEZXBlbmRpbmcgb24gdGhlIGludGVuZGVkCisgIGNvbnN1bXB0aW9uLCB0aGUgZmlybXdhcmUgbWF5IHByb2Nlc3MgdGhlIGNhcHN1bGUgaW1tZWRpYXRlbHkuIElmIHRoZSBwYXlsb2FkIHNob3VsZCBwZXJzaXN0CisgIGFjcm9zcyBhIHN5c3RlbSByZXNldCwgdGhlIHJlc2V0IHZhbHVlIHJldHVybmVkIGZyb20gRUZJX1F1ZXJ5Q2Fwc3VsZUNhcGFiaWxpdGllcyBtdXN0CisgIGJlIHBhc3NlZCBpbnRvIFJlc2V0U3lzdGVtKCkgYW5kIHdpbGwgY2F1c2UgdGhlIGNhcHN1bGUgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBmaXJtd2FyZSBhcworICBwYXJ0IG9mIHRoZSByZXNldCBwcm9jZXNzLgorCisgIEBwYXJhbSAgQ2Fwc3VsZUhlYWRlckFycmF5ICAgIFZpcnR1YWwgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2aXJ0dWFsIHBvaW50ZXJzIHRvIHRoZSBjYXBzdWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBwYXNzZWQgaW50byB1cGRhdGUgY2Fwc3VsZS4KKyAgQHBhcmFtICBDYXBzdWxlQ291bnQgICAgICAgICAgTnVtYmVyIG9mIHBvaW50ZXJzIHRvIEVGSV9DQVBTVUxFX0hFQURFUiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXNwdWxlSGVhZGVyQXJyYXkuCisgIEBwYXJhbSAgU2NhdHRlckdhdGhlckxpc3QgICAgIFBoeXNpY2FsIHBvaW50ZXIgdG8gYSBzZXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJX0NBUFNVTEVfQkxPQ0tfREVTQ1JJUFRPUiB0aGF0IGRlc2NyaWJlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gaW4gcGh5c2ljYWwgbWVtb3J5IG9mIGEgc2V0IG9mIGNhcHN1bGVzLgorCisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFZhbGlkIGNhcHN1bGUgd2FzIHBhc3NlZC4gSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FQU1VMRV9GTEFHU19QRVJTSVRfQUNST1NTX1JFU0VUIGlzIG5vdCBzZXQsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBzdWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYnkgdGhlIGZpcm13YXJlLgorICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgY2Fwc3VsZSB1cGRhdGUgd2FzIHN0YXJ0ZWQsIGJ1dCBmYWlsZWQgZHVlIHRvIGEgZGV2aWNlIGVycm9yLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBDYXBzdWxlU2l6ZSBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgY2Fwc3VsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4KKyAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgd2VyZSBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIHRvIHByb2Nlc3MgdGhlIGNhcHN1bGUuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1VQREFURV9DQVBTVUxFKSgKKyAgSU4gRUZJX0NBUFNVTEVfSEVBREVSICAgICAqKkNhcHN1bGVIZWFkZXJBcnJheSwKKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICBDYXBzdWxlQ291bnQsCisgIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgU2NhdHRlckdhdGhlckxpc3QgICBPUFRJT05BTAorICApOworCisvKioKKyAgUmV0dXJucyBpZiB0aGUgY2Fwc3VsZSBjYW4gYmUgc3VwcG9ydGVkIHZpYSBVcGRhdGVDYXBzdWxlKCkuCisKKyAgQHBhcmFtICBDYXBzdWxlSGVhZGVyQXJyYXkgICAgVmlydHVhbCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZpcnR1YWwgcG9pbnRlcnMgdG8gdGhlIGNhcHN1bGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHBhc3NlZCBpbnRvIHVwZGF0ZSBjYXBzdWxlLgorICBAcGFyYW0gIENhcHN1bGVDb3VudCAgICAgICAgICBOdW1iZXIgb2YgcG9pbnRlcnMgdG8gRUZJX0NBUFNVTEVfSEVBREVSIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3B1bGVIZWFkZXJBcnJheS4KKyAgQHBhcmFtICBNYXhpdW1DYXBzdWxlU2l6ZSAgICAgT24gb3V0cHV0IHRoZSBtYXhpbXVtIHNpemUgdGhhdCBVcGRhdGVDYXBzdWxlKCkgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgYXMgYW4gYXJndW1lbnQgdG8gVXBkYXRlQ2Fwc3VsZSgpIHZpYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBzdWxlSGVhZGVyQXJyYXkgYW5kIFNjYXR0ZXJHYXRoZXJMaXN0LgorICBAcGFyYW0gIFJlc2V0VHlwZSAgICAgICAgICAgICBSZXR1cm5zIHRoZSB0eXBlIG9mIHJlc2V0IHJlcXVpcmVkIGZvciB0aGUgY2Fwc3VsZSB1cGRhdGUuCisKKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVmFsaWQgYW5zd2VyIHJldHVybmVkLgorICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgY2Fwc3VsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heGltdW1DYXBzdWxlU2l6ZSBhbmQgUmVzZXRUeXBlIGFyZSB1bmRlZmluZWQuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE1heGltdW1DYXBzdWxlU2l6ZSBpcyBOVUxMLgorICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGVyZSB3ZXJlIGluc3VmZmljaWVudCByZXNvdXJjZXMgdG8gcHJvY2VzcyB0aGUgcXVlcnkgcmVxdWVzdC4KKworKiovCit0eXBlZGVmCitFRklfU1RBVFVTCisoRUZJQVBJICpFRklfUVVFUllfQ0FQU1VMRV9DQVBBQklMSVRJRVMpKAorICBJTiAgRUZJX0NBUFNVTEVfSEVBREVSICAgICAqKkNhcHN1bGVIZWFkZXJBcnJheSwKKyAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgQ2Fwc3VsZUNvdW50LAorICBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAqTWF4aW11bUNhcHN1bGVTaXplLAorICBPVVQgRUZJX1JFU0VUX1RZUEUgICAgICAgICAqUmVzZXRUeXBlCisgICk7CisKKy8qKgorICBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBFRkkgdmFyaWFibGVzLgorCisgIEBwYXJhbSAgQXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGJpdG1hc2sgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiB2YXJpYWJsZXMgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRvIHJldHVybiBpbmZvcm1hdGlvbi4KKyAgQHBhcmFtICBNYXhpbXVtVmFyaWFibGVTdG9yYWdlU2l6ZSAgIE9uIG91dHB1dCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBzdG9yYWdlIHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yIHRoZSBFRkkgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgc3BlY2lmaWVkLgorICBAcGFyYW0gIFJlbWFpbmluZ1ZhcmlhYmxlU3RvcmFnZVNpemUgUmV0dXJucyB0aGUgcmVtYWluaW5nIHNpemUgb2YgdGhlIHN0b3JhZ2Ugc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBmb3IgdGhlIEVGSSB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyBzcGVjaWZpZWQuCisgIEBwYXJhbSAgTWF4aW11bVZhcmlhYmxlU2l6ZSAgICAgICAgICBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGluZGl2aWR1YWwgRUZJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGVzIHNwZWNpZmllZC4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICAgVmFsaWQgYW5zd2VyIHJldHVybmVkLgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgQW4gaW52YWxpZCBjb21iaW5hdGlvbiBvZiBhdHRyaWJ1dGUgYml0cyB3YXMgc3VwcGxpZWQKKyAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLCBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtVmFyaWFibGVTdG9yYWdlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFpbmluZ1ZhcmlhYmxlU3RvcmFnZVNpemUsIE1heGltdW1WYXJpYWJsZVNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSB1bmRlZmluZWQuCisKKyoqLwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX1FVRVJZX1ZBUklBQkxFX0lORk8pKAorICBJTiAgVUlOVDMyICAgICAgICAgICAgQXR0cmlidXRlcywKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICpNYXhpbXVtVmFyaWFibGVTdG9yYWdlU2l6ZSwKKyAgT1VUIFVJTlQ2NCAgICAgICAgICAgICpSZW1haW5pbmdWYXJpYWJsZVN0b3JhZ2VTaXplLAorICBPVVQgVUlOVDY0ICAgICAgICAgICAgKk1heGltdW1WYXJpYWJsZVNpemUKKyAgKTsKKworCisvLworLy8gRUZJIFJ1bnRpbWUgU2VydmljZXMgVGFibGUKKy8vCisjZGVmaW5lIEVGSV9TWVNURU1fVEFCTEVfU0lHTkFUVVJFICAgICAgMHg1NDUzNTk1MzIwNDk0MjQ5VUxMCisjZGVmaW5lIEVGSV9TWVNURU1fVEFCTEVfUkVWSVNJT04gICAgICAgKCgyPDwxNikgfCAoMTApKQorI2RlZmluZSBFRklfMl8xMF9TWVNURU1fVEFCTEVfUkVWSVNJT04gICgoMjw8MTYpIHwgKDEwKSkKKyNkZWZpbmUgRUZJXzJfMDBfU1lTVEVNX1RBQkxFX1JFVklTSU9OICAoKDI8PDE2KSB8ICgwMCkpCisjZGVmaW5lIEVGSV8xXzEwX1NZU1RFTV9UQUJMRV9SRVZJU0lPTiAgKCgxPDwxNikgfCAoMTApKQorI2RlZmluZSBFRklfMV8wMl9TWVNURU1fVEFCTEVfUkVWSVNJT04gICgoMTw8MTYpIHwgKDAyKSkKKworI2RlZmluZSBFRklfUlVOVElNRV9TRVJWSUNFU19TSUdOQVRVUkUgIDB4NTY1MjQ1NTM1NDRlNTU1MlVMTAorI2RlZmluZSBFRklfUlVOVElNRV9TRVJWSUNFU19SRVZJU0lPTiAgIEVGSV8yXzEwX1NZU1RFTV9UQUJMRV9SRVZJU0lPTgorCisvLy8KKy8vLyBFRkkgUnVudGltZSBTZXJ2aWNlcyBUYWJsZQorLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vLworICAvLy8gVGhlIHRhYmxlIGhlYWRlciBmb3IgdGhlIEVGSSBSdW50aW1lIFNlcnZpY2VzIFRhYmxlLgorICAvLy8KKyAgRUZJX1RBQkxFX0hFQURFUiAgICAgICAgICAgICAgICBIZHI7CisKKyAgLy8KKyAgLy8gVGltZSBTZXJ2aWNlcworICAvLworICBFRklfR0VUX1RJTUUgICAgICAgICAgICAgICAgICAgIEdldFRpbWU7CisgIEVGSV9TRVRfVElNRSAgICAgICAgICAgICAgICAgICAgU2V0VGltZTsKKyAgRUZJX0dFVF9XQUtFVVBfVElNRSAgICAgICAgICAgICBHZXRXYWtldXBUaW1lOworICBFRklfU0VUX1dBS0VVUF9USU1FICAgICAgICAgICAgIFNldFdha2V1cFRpbWU7CisKKyAgLy8KKyAgLy8gVmlydHVhbCBNZW1vcnkgU2VydmljZXMKKyAgLy8KKyAgRUZJX1NFVF9WSVJUVUFMX0FERFJFU1NfTUFQICAgICBTZXRWaXJ0dWFsQWRkcmVzc01hcDsKKyAgRUZJX0NPTlZFUlRfUE9JTlRFUiAgICAgICAgICAgICBDb252ZXJ0UG9pbnRlcjsKKworICAvLworICAvLyBWYXJpYWJsZSBTZXJ2aWNlcworICAvLworICBFRklfR0VUX1ZBUklBQkxFICAgICAgICAgICAgICAgIEdldFZhcmlhYmxlOworICBFRklfR0VUX05FWFRfVkFSSUFCTEVfTkFNRSAgICAgIEdldE5leHRWYXJpYWJsZU5hbWU7CisgIEVGSV9TRVRfVkFSSUFCTEUgICAgICAgICAgICAgICAgU2V0VmFyaWFibGU7CisKKyAgLy8KKyAgLy8gTWlzY2VsbGFuZW91cyBTZXJ2aWNlcworICAvLworICBFRklfR0VUX05FWFRfSElHSF9NT05PX0NPVU5UICAgIEdldE5leHRIaWdoTW9ub3RvbmljQ291bnQ7CisgIEVGSV9SRVNFVF9TWVNURU0gICAgICAgICAgICAgICAgUmVzZXRTeXN0ZW07CisKKyAgLy8KKyAgLy8gVUVGSSAyLjAgQ2Fwc3VsZSBTZXJ2aWNlcworICAvLworICBFRklfVVBEQVRFX0NBUFNVTEUgICAgICAgICAgICAgIFVwZGF0ZUNhcHN1bGU7CisgIEVGSV9RVUVSWV9DQVBTVUxFX0NBUEFCSUxJVElFUyAgUXVlcnlDYXBzdWxlQ2FwYWJpbGl0aWVzOworCisgIC8vCisgIC8vIE1pc2NlbGxhbmVvdXMgVUVGSSAyLjAgU2VydmljZQorICAvLworICBFRklfUVVFUllfVkFSSUFCTEVfSU5GTyAgICAgICAgIFF1ZXJ5VmFyaWFibGVJbmZvOworfSBFRklfUlVOVElNRV9TRVJWSUNFUzsKKworCisjZGVmaW5lIEVGSV9CT09UX1NFUlZJQ0VTX1NJR05BVFVSRSAgIDB4NTY1MjQ1NTM1NDRmNGY0MlVMTAorI2RlZmluZSBFRklfQk9PVF9TRVJWSUNFU19SRVZJU0lPTiAgICBFRklfMl8xMF9TWVNURU1fVEFCTEVfUkVWSVNJT04KKworLy8vCisvLy8gRUZJIEJvb3QgU2VydmljZXMgVGFibGUKKy8vLwordHlwZWRlZiBzdHJ1Y3QgeworICAvLy8KKyAgLy8vIFRoZSB0YWJsZSBoZWFkZXIgZm9yIHRoZSBFRkkgQm9vdCBTZXJ2aWNlcyBUYWJsZS4KKyAgLy8vCisgIEVGSV9UQUJMRV9IRUFERVIgICAgICAgICAgICAgICAgSGRyOworCisgIC8vCisgIC8vIFRhc2sgUHJpb3JpdHkgU2VydmljZXMKKyAgLy8KKyAgRUZJX1JBSVNFX1RQTCAgICAgICAgICAgICAgICAgICBSYWlzZVRQTDsKKyAgRUZJX1JFU1RPUkVfVFBMICAgICAgICAgICAgICAgICBSZXN0b3JlVFBMOworCisgIC8vCisgIC8vIE1lbW9yeSBTZXJ2aWNlcworICAvLworICBFRklfQUxMT0NBVEVfUEFHRVMgICAgICAgICAgICAgIEFsbG9jYXRlUGFnZXM7CisgIEVGSV9GUkVFX1BBR0VTICAgICAgICAgICAgICAgICAgRnJlZVBhZ2VzOworICBFRklfR0VUX01FTU9SWV9NQVAgICAgICAgICAgICAgIEdldE1lbW9yeU1hcDsKKyAgRUZJX0FMTE9DQVRFX1BPT0wgICAgICAgICAgICAgICBBbGxvY2F0ZVBvb2w7CisgIEVGSV9GUkVFX1BPT0wgICAgICAgICAgICAgICAgICAgRnJlZVBvb2w7CisKKyAgLy8KKyAgLy8gRXZlbnQgJiBUaW1lciBTZXJ2aWNlcworICAvLworICBFRklfQ1JFQVRFX0VWRU5UICAgICAgICAgICAgICAgICAgQ3JlYXRlRXZlbnQ7CisgIEVGSV9TRVRfVElNRVIgICAgICAgICAgICAgICAgICAgICBTZXRUaW1lcjsKKyAgRUZJX1dBSVRfRk9SX0VWRU5UICAgICAgICAgICAgICAgIFdhaXRGb3JFdmVudDsKKyAgRUZJX1NJR05BTF9FVkVOVCAgICAgICAgICAgICAgICAgIFNpZ25hbEV2ZW50OworICBFRklfQ0xPU0VfRVZFTlQgICAgICAgICAgICAgICAgICAgQ2xvc2VFdmVudDsKKyAgRUZJX0NIRUNLX0VWRU5UICAgICAgICAgICAgICAgICAgIENoZWNrRXZlbnQ7CisKKyAgLy8KKyAgLy8gUHJvdG9jb2wgSGFuZGxlciBTZXJ2aWNlcworICAvLworICBFRklfSU5TVEFMTF9QUk9UT0NPTF9JTlRFUkZBQ0UgICAgSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlOworICBFRklfUkVJTlNUQUxMX1BST1RPQ09MX0lOVEVSRkFDRSAgUmVpbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2U7CisgIEVGSV9VTklOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFICBVbmluc3RhbGxQcm90b2NvbEludGVyZmFjZTsKKyAgRUZJX0hBTkRMRV9QUk9UT0NPTCAgICAgICAgICAgICAgIEhhbmRsZVByb3RvY29sOworICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlJlc2VydmVkOworICBFRklfUkVHSVNURVJfUFJPVE9DT0xfTk9USUZZICAgICAgUmVnaXN0ZXJQcm90b2NvbE5vdGlmeTsKKyAgRUZJX0xPQ0FURV9IQU5ETEUgICAgICAgICAgICAgICAgIExvY2F0ZUhhbmRsZTsKKyAgRUZJX0xPQ0FURV9ERVZJQ0VfUEFUSCAgICAgICAgICAgIExvY2F0ZURldmljZVBhdGg7CisgIEVGSV9JTlNUQUxMX0NPTkZJR1VSQVRJT05fVEFCTEUgICBJbnN0YWxsQ29uZmlndXJhdGlvblRhYmxlOworCisgIC8vCisgIC8vIEltYWdlIFNlcnZpY2VzCisgIC8vCisgIEVGSV9JTUFHRV9MT0FEICAgICAgICAgICAgICAgICAgICBMb2FkSW1hZ2U7CisgIEVGSV9JTUFHRV9TVEFSVCAgICAgICAgICAgICAgICAgICBTdGFydEltYWdlOworICBFRklfRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpdDsKKyAgRUZJX0lNQUdFX1VOTE9BRCAgICAgICAgICAgICAgICAgIFVubG9hZEltYWdlOworICBFRklfRVhJVF9CT09UX1NFUlZJQ0VTICAgICAgICAgICAgRXhpdEJvb3RTZXJ2aWNlczsKKworICAvLworICAvLyBNaXNjZWxsYW5lb3VzIFNlcnZpY2VzCisgIC8vCisgIEVGSV9HRVRfTkVYVF9NT05PVE9OSUNfQ09VTlQgICAgICBHZXROZXh0TW9ub3RvbmljQ291bnQ7CisgIEVGSV9TVEFMTCAgICAgICAgICAgICAgICAgICAgICAgICBTdGFsbDsKKyAgRUZJX1NFVF9XQVRDSERPR19USU1FUiAgICAgICAgICAgIFNldFdhdGNoZG9nVGltZXI7CisKKyAgLy8KKyAgLy8gRHJpdmVyU3VwcG9ydCBTZXJ2aWNlcworICAvLworICBFRklfQ09OTkVDVF9DT05UUk9MTEVSICAgICAgICAgICAgQ29ubmVjdENvbnRyb2xsZXI7CisgIEVGSV9ESVNDT05ORUNUX0NPTlRST0xMRVIgICAgICAgICBEaXNjb25uZWN0Q29udHJvbGxlcjsKKworICAvLworICAvLyBPcGVuIGFuZCBDbG9zZSBQcm90b2NvbCBTZXJ2aWNlcworICAvLworICBFRklfT1BFTl9QUk9UT0NPTCAgICAgICAgICAgICAgICAgT3BlblByb3RvY29sOworICBFRklfQ0xPU0VfUFJPVE9DT0wgICAgICAgICAgICAgICAgQ2xvc2VQcm90b2NvbDsKKyAgRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT04gICAgIE9wZW5Qcm90b2NvbEluZm9ybWF0aW9uOworCisgIC8vCisgIC8vIExpYnJhcnkgU2VydmljZXMKKyAgLy8KKyAgRUZJX1BST1RPQ09MU19QRVJfSEFORExFICAgICAgICAgIFByb3RvY29sc1BlckhhbmRsZTsKKyAgRUZJX0xPQ0FURV9IQU5ETEVfQlVGRkVSICAgICAgICAgIExvY2F0ZUhhbmRsZUJ1ZmZlcjsKKyAgRUZJX0xPQ0FURV9QUk9UT0NPTCAgICAgICAgICAgICAgIExvY2F0ZVByb3RvY29sOworICBFRklfSU5TVEFMTF9NVUxUSVBMRV9QUk9UT0NPTF9JTlRFUkZBQ0VTICAgIEluc3RhbGxNdWx0aXBsZVByb3RvY29sSW50ZXJmYWNlczsKKyAgRUZJX1VOSU5TVEFMTF9NVUxUSVBMRV9QUk9UT0NPTF9JTlRFUkZBQ0VTICBVbmluc3RhbGxNdWx0aXBsZVByb3RvY29sSW50ZXJmYWNlczsKKworICAvLworICAvLyAzMi1iaXQgQ1JDIFNlcnZpY2VzCisgIC8vCisgIEVGSV9DQUxDVUxBVEVfQ1JDMzIgICAgICAgICAgICAgICBDYWxjdWxhdGVDcmMzMjsKKworICAvLworICAvLyBNaXNjZWxsYW5lb3VzIFNlcnZpY2VzCisgIC8vCisgIEVGSV9DT1BZX01FTSAgICAgICAgICAgICAgICAgICAgICBDb3B5TWVtOworICBFRklfU0VUX01FTSAgICAgICAgICAgICAgICAgICAgICAgU2V0TWVtOworICBFRklfQ1JFQVRFX0VWRU5UX0VYICAgICAgICAgICAgICAgQ3JlYXRlRXZlbnRFeDsKK30gRUZJX0JPT1RfU0VSVklDRVM7CisKKy8vLworLy8vIENvbnRhaW5zIGEgc2V0IG9mIEdVSUQvcG9pbnRlciBwYWlycyBjb21wcmlzZWQgb2YgdGhlIENvbmZpZ3VyYXRpb25UYWJsZSBmaWVsZCBpbiB0aGUKKy8vLyBFRkkgU3lzdGVtIFRhYmxlLgorLy8vCit0eXBlZGVmIHN0cnVjdHsKKyAgLy8vCisgIC8vLyBUaGUgMTI4LWJpdCBHVUlEIHZhbHVlIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gdGFibGUuCisgIC8vLworICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgVmVuZG9yR3VpZDsKKyAgLy8vCisgIC8vLyBBIHBvaW50ZXIgdG8gdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCBWZW5kb3JHdWlkLgorICAvLy8KKyAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpWZW5kb3JUYWJsZTsKK30gRUZJX0NPTkZJR1VSQVRJT05fVEFCTEU7CisKKy8vLworLy8vIEVGSSBTeXN0ZW0gVGFibGUKKy8vLworc3RydWN0IF9FRklfU1lTVEVNX1RBQkxFIHsKKyAgLy8vCisgIC8vLyBUaGUgdGFibGUgaGVhZGVyIGZvciB0aGUgRUZJIFN5c3RlbSBUYWJsZS4KKyAgLy8vCisgIEVGSV9UQUJMRV9IRUFERVIgICAgICAgICAgICAgICAgICBIZHI7CisgIC8vLworICAvLy8gQSBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIFVuaWNvZGUgc3RyaW5nIHRoYXQgaWRlbnRpZmllcworICAvLy8gdGhlIHZlbmRvciB0aGF0IHByb2R1Y2VzIHRoZSBzeXN0ZW0gZmlybXdhcmUgZm9yIHRoZSBwbGF0Zm9ybS4KKyAgLy8vCisgIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRmlybXdhcmVWZW5kb3I7CisgIC8vLworICAvLy8gQSBmaXJtd2FyZSB2ZW5kb3Igc3BlY2lmaWMgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSByZXZpc2lvbgorICAvLy8gb2YgdGhlIHN5c3RlbSBmaXJtd2FyZSBmb3IgdGhlIHBsYXRmb3JtLgorICAvLy8KKyAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcm13YXJlUmV2aXNpb247CisgIC8vLworICAvLy8gVGhlIGhhbmRsZSBmb3IgdGhlIGFjdGl2ZSBjb25zb2xlIGlucHV0IGRldmljZS4KKyAgLy8vCisgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlSW5IYW5kbGU7CisgIC8vLworICAvLy8gQSBwb2ludGVyIHRvIHRoZSBTSU1QTEVfSU5QVVRfUFJPVE9DT0wgaW50ZXJmYWNlIHRoYXQgaXMKKyAgLy8vIGFzc29jaWF0ZWQgd2l0aCBDb25zb2xlSW5IYW5kbGUuCisgIC8vLworICBFRklfU0lNUExFX1RFWFRfSU5QVVRfUFJPVE9DT0wgICAgKkNvbkluOworICAvLy8KKyAgLy8vIFRoZSBoYW5kbGUgZm9yIHRoZSBhY3RpdmUgY29uc29sZSBvdXRwdXQgZGV2aWNlLgorICAvLy8KKyAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVPdXRIYW5kbGU7CisgIC8vLworICAvLy8gQSBwb2ludGVyIHRvIHRoZSBTSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0wgaW50ZXJmYWNlCisgIC8vLyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBDb25zb2xlT3V0SGFuZGxlLgorICAvLy8KKyAgRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTCAgICpDb25PdXQ7CisgIC8vLworICAvLy8gVGhlIGhhbmRsZSBmb3IgdGhlIGFjdGl2ZSBzdGFuZGFyZCBlcnJvciBjb25zb2xlIGRldmljZS4KKyAgLy8vCisgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZEVycm9ySGFuZGxlOworICAvLy8KKyAgLy8vIEEgcG9pbnRlciB0byB0aGUgU0lNUExFX1RFWFRfT1VUUFVUX1BST1RPQ09MIGludGVyZmFjZQorICAvLy8gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggU3RhbmRhcmRFcnJvckhhbmRsZS4KKyAgLy8vCisgIEVGSV9TSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0wgICAqU3RkRXJyOworICAvLy8KKyAgLy8vIEEgcG9pbnRlciB0byB0aGUgRUZJIFJ1bnRpbWUgU2VydmljZXMgVGFibGUuCisgIC8vLworICBFRklfUlVOVElNRV9TRVJWSUNFUyAgICAgICAgICAgICAgKlJ1bnRpbWVTZXJ2aWNlczsKKyAgLy8vCisgIC8vLyBBIHBvaW50ZXIgdG8gdGhlIEVGSSBCb290IFNlcnZpY2VzIFRhYmxlLgorICAvLy8KKyAgRUZJX0JPT1RfU0VSVklDRVMgICAgICAgICAgICAgICAgICpCb290U2VydmljZXM7CisgIC8vLworICAvLy8gVGhlIG51bWJlciBvZiBzeXN0ZW0gY29uZmlndXJhdGlvbiB0YWJsZXMgaW4gdGhlIGJ1ZmZlciBDb25maWd1cmF0aW9uVGFibGUuCisgIC8vLworICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZUYWJsZUVudHJpZXM7CisgIC8vLworICAvLy8gQSBwb2ludGVyIHRvIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiB0YWJsZXMuCisgIC8vLyBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlIGlzIE51bWJlck9mVGFibGVFbnRyaWVzLgorICAvLy8KKyAgRUZJX0NPTkZJR1VSQVRJT05fVEFCTEUgICAgICAgICAgICpDb25maWd1cmF0aW9uVGFibGU7Cit9OworCisvLworLy8gRUZJIExvYWQgT3B0aW9ucyBBdHRyaWJ1dGVzCisvLworI2RlZmluZSBMT0FEX09QVElPTl9BQ1RJVkUgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIExPQURfT1BUSU9OX0ZPUkNFX1JFQ09OTkVDVCAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTE9BRF9PUFRJT05fSElEREVOICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBMT0FEX09QVElPTl9DQVRFR09SWSAgICAgICAgICAweDAwMDAxRjAwCisKKyNkZWZpbmUgTE9BRF9PUFRJT05fQ0FURUdPUllfQk9PVCAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBMT0FEX09QVElPTl9DQVRFR09SWV9BUFAgICAgICAweDAwMDAwMTAwCisKKyNkZWZpbmUgRUZJX0JPT1RfT1BUSU9OX1NVUFBPUlRfS0VZICAgMHgwMDAwMDAwMQorI2RlZmluZSBFRklfQk9PVF9PUFRJT05fU1VQUE9SVF9BUFAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVGSV9CT09UX09QVElPTl9TVVBQT1JUX0NPVU5UIDB4MDAwMDAzMDAKKwordHlwZWRlZiB1bmlvbiB7CisgIHN0cnVjdCB7CisgICAgVUlOVDMyICBSZXZpc2lvbiAgICAgICAgOiA4OworICAgIFVJTlQzMiAgU2hpZnRQcmVzc2VkICAgIDogMTsKKyAgICBVSU5UMzIgIENvbnRyb2xQcmVzc2VkICA6IDE7CisgICAgVUlOVDMyICBBbHRQcmVzc2VkICAgICAgOiAxOworICAgIFVJTlQzMiAgTG9nb1ByZXNzZWQgICAgIDogMTsKKyAgICBVSU5UMzIgIE1lbnVQcmVzc2VkICAgICA6IDE7CisgICAgVUlOVDMyICBTeXNSZXFQZXNzZWQgICAgOiAxOworICAgIFVJTlQzMiAgUmVzZXJ2ZWQgICAgICAgIDogMTY7CisgICAgVUlOVDMyICBJbnB1dEtleUNvdW50ICAgOiAyOworICB9IE9wdGlvbnM7CisgIFVJTlQzMiAgUGFja2VkVmFsdWU7Cit9IEhPVF9LRVlfRUZJX0tFWV9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhPVF9LRVlfRUZJX0tFWV9EQVRBICBLZXlPcHRpb25zOworICBVSU5UMzIgICAgICAgICAgICAgICAgQm9vdE9wdGlvbkNyYzsKKyAgVUlOVDE2ICAgICAgICAgICAgICAgIEJvb3RPcHRpb247CisvL0VGSV9JTlBVVF9LRVkgICAgICAgICBLZXlzW107Cit9IEVGSV9LRVlfT1BUSU9OOworCisjZGVmaW5lIEVGSV9LRVlfT1BUSU9OX1NISUZUICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVGSV9LRVlfT1BUSU9OX0NPTlRST0wgICAweDAwMDAwMDAyCisjZGVmaW5lIEVGSV9LRVlfT1BUSU9OX0FMVCAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVGSV9LRVlfT1BUSU9OX0xPR08gICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVGSV9LRVlfT1BUSU9OX01FTlUgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEVGSV9LRVlfT1BUSU9OX1NZU1JFUSAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVGSV9LRVlfQ09ERV9DT1VOVCAgICAgICAweDAwMDAwMzAwCisKKworLy8KKy8vIEVGSSBGaWxlIGxvY2F0aW9uIHRvIGJvb3QgZnJvbSBvbiByZW1vdmFibGUgbWVkaWEgZGV2aWNlcworLy8KKyNkZWZpbmUgRUZJX1JFTU9WQUJMRV9NRURJQV9GSUxFX05BTUVfSUEzMiAgICBMIlxcRUZJXFxCT09UXFxCT09USUEzMi5FRkkiCisjZGVmaW5lIEVGSV9SRU1PVkFCTEVfTUVESUFfRklMRV9OQU1FX0lBNjQgICAgTCJcXEVGSVxcQk9PVFxcQk9PVElBNjQuRUZJIgorI2RlZmluZSBFRklfUkVNT1ZBQkxFX01FRElBX0ZJTEVfTkFNRV9YNjQgICAgIEwiXFxFRklcXEJPT1RcXEJPT1RYNjQuRUZJIgorCisjaWYgICBkZWZpbmVkIChNREVfQ1BVX0lBMzIpCisgICNkZWZpbmUgRUZJX1JFTU9WQUJMRV9NRURJQV9GSUxFX05BTUUgICBFRklfUkVNT1ZBQkxFX01FRElBX0ZJTEVfTkFNRV9JQTMyCisjZWxpZiBkZWZpbmVkIChNREVfQ1BVX0lQRikKKyAgI2RlZmluZSBFRklfUkVNT1ZBQkxFX01FRElBX0ZJTEVfTkFNRSAgIEVGSV9SRU1PVkFCTEVfTUVESUFfRklMRV9OQU1FX0lBNjQKKyNlbGlmIGRlZmluZWQgKE1ERV9DUFVfWDY0KQorICAjZGVmaW5lIEVGSV9SRU1PVkFCTEVfTUVESUFfRklMRV9OQU1FICAgRUZJX1JFTU9WQUJMRV9NRURJQV9GSUxFX05BTUVfWDY0CisjZWxpZiBkZWZpbmVkIChNREVfQ1BVX0VCQykKKyNlbHNlCisgICNlcnJvciBVbmtub3duIFByb2Nlc3NvciBUeXBlCisjZW5kaWYKKworI2luY2x1ZGUgPGdweGUvZWZpL1VlZmkvVWVmaVB4ZS5oPgorI2luY2x1ZGUgPGdweGUvZWZpL1VlZmkvVWVmaUdwdC5oPgorI2luY2x1ZGUgPGdweGUvZWZpL1VlZmkvVWVmaUludGVybmFsRm9ybVJlcHJlc2VudGF0aW9uLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9YNjQvUHJvY2Vzc29yQmluZC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9YNjQvUHJvY2Vzc29yQmluZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmM0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL1g2NC9Qcm9jZXNzb3JCaW5kLmgKQEAgLTAsMCArMSwyNDcgQEAKKy8qKiBAZmlsZQorICBQcm9jZXNzb3Igb3IgQ29tcGlsZXIgc3BlY2lmaWMgZGVmaW5lcyBhbmQgdHlwZXMgeDY0IChJbnRlbChyKSBFTTY0VCwgQU1ENjQpLgorCisgIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UKKyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAorICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCisKKyAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyoqLworCisjaWZuZGVmIF9fUFJPQ0VTU09SX0JJTkRfSF9fCisjZGVmaW5lIF9fUFJPQ0VTU09SX0JJTkRfSF9fCisKKy8vLworLy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHR5cGUgc28gb3RoZXIgY29kZSBjYW4gbWFrZSBwcm9jZXNzb3IgYmFzZWQgY2hvaWNlcworLy8vCisjZGVmaW5lIE1ERV9DUFVfWDY0CisKKworLy8KKy8vIE1ha2Ugc3VyZSB3ZSBhcmUgdXNlaW5nIHRoZSBjb3JyZWN0IHBhY2tpbmcgcnVsZXMgcGVyIEVGSSBzcGVjaWZpY2F0aW9uCisvLworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBwYWNrKCkKKyNlbmRpZgorCisKKyNpZiBfX0lOVEVMX0NPTVBJTEVSCisvLworLy8gRGlzYWJsZSBJQ0MncyByZW1hcmsgIzg2OTogIlBhcmFtZXRlciIgd2FzIG5ldmVyIHJlZmVyZW5jZWQgd2FybmluZy4KKy8vIFRoaXMgaXMgbGVnYWwgQU5TSSBDIGNvZGUgc28gd2UgZGlzYWJsZSB0aGUgcmVtYXJrIHRoYXQgaXMgdHVybmVkIG9uIHdpdGggLVdhbGwKKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogODY5ICkKKworLy8KKy8vIERpc2FibGUgSUNDJ3MgcmVtYXJrICMxNDE4OiBleHRlcm5hbCBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGggbm8gcHJpb3IgZGVjbGFyYXRpb24uCisvLyBUaGlzIGlzIGxlZ2FsIEFOU0kgQyBjb2RlIHNvIHdlIGRpc2FibGUgdGhlIHJlbWFyayB0aGF0IGlzIHR1cm5lZCBvbiB3aXRoIC9XNAorLy8KKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiAxNDE4ICkKKworLy8KKy8vIERpc2FibGUgSUNDJ3MgcmVtYXJrICMxNDE5OiBleHRlcm5hbCBkZWNsYXJhdGlvbiBpbiBwcmltYXJ5IHNvdXJjZSBmaWxlCisvLyBUaGlzIGlzIGxlZ2FsIEFOU0kgQyBjb2RlIHNvIHdlIGRpc2FibGUgdGhlIHJlbWFyayB0aGF0IGlzIHR1cm5lZCBvbiB3aXRoIC9XNAorLy8KKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiAxNDE5ICkKKworI2VuZGlmCisKKworI2lmIF9NU0NfRVhURU5TSU9OUworCisvLworLy8gRGlzYWJsZSB3YXJuaW5nIHRoYXQgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIGNvbXBpbGUgYXQgL1c0CisvLyBUaGlzIG9ubHkgd29ya3MgZm9yIE1pY3Jvc29mdCogdG9vbHMKKy8vCisKKy8vCisvLyBEaXNhYmxpbmcgYml0ZmllbGQgdHlwZSBjaGVja2luZyB3YXJuaW5ncy4KKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDIxNCApCisKKy8vCisvLyBEaXNhYmxpbmcgdGhlIHVucmVmZXJlbmNlZCBmb3JtYWwgcGFyYW1ldGVyIHdhcm5pbmdzLgorLy8KKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiA0MTAwICkKKworLy8KKy8vIERpc2FibGUgc2xpZ2h0bHkgZGlmZmVyZW50IGJhc2UgdHlwZXMgd2FybmluZyBhcyBDSEFSOCAqIGNhbiBub3QgYmUgc2V0CisvLyB0byBhIGNvbnN0YW50IHN0cmluZy4KKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDA1NyApCisKKy8vCisvLyBBU1NFUlQoRkFMU0UpIG9yIHdoaWxlIChUUlVFKSBhcmUgbGVnYWwgY29uc3RydWN0ZXMgc28gc3VwcmVzcyB0aGlzIHdhcm5pbmcKKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDEyNyApCisKKy8vCisvLyBUaGlzIHdhcm5pbmcgaXMgY2F1c2VkIGJ5IGZ1bmN0aW9ucyBkZWZpbmVkIGJ1dCBub3QgdXNlZC4gRm9yIHByZWNvbXBpbGVkIGhlYWRlciBvbmx5LgorLy8KKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiA0NTA1ICkKKworLy8KKy8vIFRoaXMgd2FybmluZyBpcyBjYXVzZWQgYnkgZW1wdHkgKGFmdGVyIHByZXByb2Nlc3NpbmcpIHNvdWNlIGZpbGUuIEZvciBwcmVjb21waWxlZCBoZWFkZXIgb25seS4KKy8vCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDIwNiApCisKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPCAxOTk5MDFMKQorICAvLworICAvLyBObyBBTlNJIEMgMjAwMCBzdGRpbnQuaCBpbnRlZ2VyIHdpZHRoIGRlY2xhcmF0aW9ucywgc28gZGVmaW5lIGVxdWl2YWxlbnRzCisgIC8vCisKKyAgI2lmIF9NU0NfRVhURU5TSU9OUworCisKKyAgICAvLworICAgIC8vIHVzZSBNaWNyb3NvZnQgQyBjb21wbGllciBkZXBlbmRlbnQgaW50ZXJnZXIgd2lkdGggdHlwZXMKKyAgICAvLworICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICBVSU5UNjQ7CisgICAgdHlwZWRlZiBfX2ludDY0ICAgICAgICAgICAgIElOVDY0OworICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQzMiAgICBVSU5UMzI7CisgICAgdHlwZWRlZiBfX2ludDMyICAgICAgICAgICAgIElOVDMyOworICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICBVSU5UMTY7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIENIQVIxNjsKKyAgICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgSU5UMTY7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIEJPT0xFQU47CisgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIFVJTlQ4OworICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBDSEFSODsKKyAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgSU5UODsKKyAgI2Vsc2UKKyAgICAjaWZkZWYgX0VGSV9QNjQKKyAgICAgIC8vCisgICAgICAvLyBQNjQgLSBpcyBJbnRlbCBJdGFuaXVtKFRNKSBzcGVhayBmb3IgcG9pbnRlcnMgYmVpbmcgNjQtYml0IGFuZCBsb25ncyBhbmQgaW50cworICAgICAgLy8gIGFyZSAzMi1iaXRzCisgICAgICAvLworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIFVJTlQ2NDsKKyAgICAgIHR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICBJTlQ2NDsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICBVSU5UMzI7CisgICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgSU5UMzI7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgQ0hBUjE2OworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIFVJTlQxNjsKKyAgICAgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBJTlQxNjsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICBCT09MRUFOOworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIFVJTlQ4OworICAgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIENIQVI4OworICAgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIElOVDg7CisgICAgI2Vsc2UKKyAgICAgIC8vCisgICAgICAvLyBBc3N1bWUgTFA2NCAtIGxvbmdzIGFuZCBwb2ludGVycyBhcmUgNjQtYml0LiBJbnRzIGFyZSAzMi1iaXQuCisgICAgICAvLworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUlOVDY0OworICAgICAgdHlwZWRlZiBsb25nICAgICAgICAgICAgSU5UNjQ7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICBVSU5UMzI7CisgICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICBJTlQzMjsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIFVJTlQxNjsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIENIQVIxNjsKKyAgICAgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgIElOVDE2OworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgQk9PTEVBTjsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgIFVJTlQ4OworICAgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgQ0hBUjg7CisgICAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICBJTlQ4OworICAgICNlbmRpZgorICAjZW5kaWYKKworICAjZGVmaW5lIFVJTlQ4X01BWCAweGZmCisKKyNlbHNlCisgIC8vCisgIC8vIFVzZSBBTlNJIEMgMjAwMCBzdGRpbnQuaCBpbnRlZ2VyIHdpZHRoIGRlY2xhcmF0aW9ucworICAvLworICAjaW5jbHVkZSA8c3RkaW50Lmg+CisgIHR5cGVkZWYgdWludDhfdCAgIEJPT0xFQU47CisgIHR5cGVkZWYgaW50OF90ICAgIElOVDg7CisgIHR5cGVkZWYgdWludDhfdCAgIFVJTlQ4OworICB0eXBlZGVmIGludDE2X3QgICBJTlQxNjsKKyAgdHlwZWRlZiB1aW50MTZfdCAgVUlOVDE2OworICB0eXBlZGVmIGludDMyX3QgICBJTlQzMjsKKyAgdHlwZWRlZiB1aW50MzJfdCAgVUlOVDMyOworICB0eXBlZGVmIGludDY0X3QgICBJTlQ2NDsKKyAgdHlwZWRlZiB1aW50NjRfdCAgVUlOVDY0OworICB0eXBlZGVmIGNoYXIgICAgICBDSEFSODsKKyAgdHlwZWRlZiB1aW50MTZfdCAgQ0hBUjE2OworCisjZW5kaWYKKwordHlwZWRlZiBVSU5UNjQgIFVJTlROOwordHlwZWRlZiBJTlQ2NCAgIElOVE47CisKKworLy8KKy8vIFByb2Nlc3NvciBzcGVjaWZpYyBkZWZpbmVzCisvLworI2RlZmluZSBNQVhfQklUICAgICAweDgwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgTUFYXzJfQklUUyAgMHhDMDAwMDAwMDAwMDAwMDAwVUxMCisKKy8vCisvLyBNYXhpbXVtIGxlZ2FsIFg2NCBhZGRyZXNzCisvLworI2RlZmluZSBNQVhfQUREUkVTUyAgIDB4RkZGRkZGRkZGRkZGRkZGRlVMTAorCisvLworLy8gVGhlIHN0YWNrIGFsaWdubWVudCByZXF1aXJlZCBmb3IgWDY0CisvLworI2RlZmluZSBDUFVfU1RBQ0tfQUxJR05NRU5UICAgMTYKKworLy8KKy8vIE1vZGlmaWVyIHRvIGVuc3VyZSB0aGF0IGFsbCBwcm90b2NvbCBtZW1iZXIgZnVuY3Rpb25zIGFuZCBFRkkgaW50cmluc2ljcworLy8gdXNlIHRoZSBjb3JyZWN0IEMgY2FsbGluZyBjb252ZW50aW9uLiBBbGwgcHJvdG9jb2wgbWVtYmVyIGZ1bmN0aW9ucyBhbmQKKy8vIEVGSSBpbnRyaW5zaWNzIGFyZSByZXF1aXJlZCB0byBtb2RpZnkgdGhpZXIgbWVtYmVyIGZ1bmN0aW9ucyB3aXRoIEVGSUFQSS4KKy8vCisjaWYgX01TQ19FWFRFTlNJT05TCisgIC8vLworICAvLy8gRGVmaW5lIHRoZSBzdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb24gcmVndWFyZGxlc3Mgb2Ygb3B0aW1pemF0aW9uIGxldmVsLgorICAvLy8gX19jZGVjbCBpcyBNaWNyb3NvZnQqIHNwZWNpZmljIEMgZXh0ZW5zaW9uLgorICAvLy8KKyAgI2RlZmluZSBFRklBUEkgX19jZGVjbAorI2VsaWYgX19HTlVDX18KKyAgLy8vCisgIC8vLyBEZWZpbmUgdGhlIHN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbiByZWd1YXJkbGVzcyBvZiBvcHRpbWl6YXRpb24gbGV2ZWwuCisgIC8vLyBUaGUgR0NDIHN1cHBvcnQgYXNzdW1lcyBhIEdDQyBjb21waWxlciB0aGF0IHN1cHBvcnRzIHRoZSBFRkkgQUJJLiBUaGUgRUZJCisgIC8vLyBBQkkgaXMgbXVjaCBjbG9zZXIgdG8gdGhlIHg2NCBNaWNyb3NvZnQqIEFCSSB0aGFuIHN0YW5kYXJkIHg2NCAoeDg2LTY0KQorICAvLy8gR0NDIEFCSS4gVGh1cyBhIHN0YW5kYXJkIHg2NCAoeDg2LTY0KSBHQ0MgY29tcGlsZXIgY2FuIG5vdCBiZSB1c2VkIGZvcgorICAvLy8geDY0LiBXYXJuaW5nIHRoZSBhc3NlbWJseSBjb2RlIGluIHRoZSBNREUgeDY0IGRvZXMgbm90IGZvbGxvdyB0aGUgY29ycmVjdAorICAvLy8gQUJJIGZvciB0aGUgc3RhbmRhcmQgeDY0ICh4ODYtNjQpIEdDQy4KKyAgLy8vCisgICNkZWZpbmUgRUZJQVBJIF9fYXR0cmlidXRlX18oKG1zX2FiaSkpCisjZWxzZQorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IGZvciBhIG5vbiBNaWNyb3NvZnQqIG9yIEdDQyBjb21waWxlciBpcyB0byBhc3N1bWUgdGhlIEVGSSBBQkkKKyAgLy8vIGlzIHRoZSBzdGFuZGFyZC4KKyAgLy8vCisgICNkZWZpbmUgRUZJQVBJCisjZW5kaWYKKworLy8KKy8vIFRoZSBNaWNyb3NvZnQqIEMgY29tcGlsZXIgY2FuIHJlbW92ZWQgcmVmZXJlbmNlcyB0byB1bnJlZmVyZW5jZWQgZGF0YSBpdGVtcworLy8gIGlmIHRoZSAvT1BUOlJFRiBsaW5rZXIgb3B0aW9uIGlzIHVzZWQuIFdlIGRlZmluZWQgYSBtYWNybyBhcyB0aGlzIGlzIGEKKy8vICBhIG5vbiBzdGFuZGFyZCBleHRlbnNpb24KKy8vCisjaWYgX01TQ19FWFRFTlNJT05TCisgICNkZWZpbmUgR0xPQkFMX1JFTU9WRV9JRl9VTlJFRkVSRU5DRUQgX19kZWNsc3BlYyhzZWxlY3RhbnkpCisjZWxzZQorICAjZGVmaW5lIEdMT0JBTF9SRU1PVkVfSUZfVU5SRUZFUkVOQ0VECisjZW5kaWYKKworLy8KKy8vIEZvciBzeW1ib2wgbmFtZSBpbiBHTlUgYXNzZW1ibHkgY29kZSwgYW4gZXh0cmEgIl8iIGlzIG5lY2Vzc2FyeQorLy8KKyNpZiBfX0dOVUNfXworICAjaWYgZGVmaW5lZChsaW51eCkKKyAgICAjZGVmaW5lIEFTTV9QRlgobmFtZSkgbmFtZQorICAjZWxzZQorICAgICNkZWZpbmUgQVNNX1BGWChuYW1lKSBfIyNuYW1lCisgICNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgRlVOQ1RJT05fRU5UUllfUE9JTlQocCkgKHApCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL2VmaS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9lZmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ1OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9lZmkuaApAQCAtMCwwICsxLDE0MiBAQAorI2lmbmRlZiBfRUZJX0gKKyNkZWZpbmUgX0VGSV9ICisKKy8qKiBAZmlsZQorICoKKyAqIEVGSSBBUEkKKyAqCisgKiBUaGUgaW50ZW50aW9uIGlzIHRvIGluY2x1ZGUgbmVhci12ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIEVGSSBoZWFkZXJzCisgKiByZXF1aXJlZCBieSBnUFhFLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyB0aGUgaW1wb3J0LnBsIHNjcmlwdCBpbgorICogdGhpcyBkaXJlY3RvcnkuICBSdW4gdGhlIGltcG9ydCBzY3JpcHQgdG8gdXBkYXRlIHRoZSBsb2NhbCBjb3BpZXMKKyAqIG9mIHRoZSBoZWFkZXJzOgorICoKKyAqICAgICAuL2ltcG9ydC5wbCAvcGF0aC90by9lZGsyL2VkazIKKyAqCisgKiB3aGVyZSAvcGF0aC90by9lZGsyL2VkazIgaXMgdGhlIHBhdGggdG8geW91ciBsb2NhbCBjaGVja291dCBvZiB0aGUKKyAqIEVGSSBEZXZlbG9wbWVudCBLaXQuCisgKgorICogTm90ZSB0aGF0IGltcG9ydC5wbCB3aWxsIG1vZGlmeSBhbnkgI2luY2x1ZGUgbGluZXMgaW4gZWFjaCBpbXBvcnRlZAorICogaGVhZGVyIHRvIHJlZmxlY3QgaXRzIG5ldyBsb2NhdGlvbiB3aXRoaW4gdGhlIGdQWEUgdHJlZS4gIEl0IHdpbGwKKyAqIGFsc28gdGlkeSB1cCB0aGUgZmlsZSBieSByZW1vdmluZyBjYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVycyBhbmQKKyAqIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgKgorICoKKyAqIEF0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIHRoZXJlIGFyZSBhIGZldyBvdGhlciBtb2RpZmljYXRpb25zIHRvCisgKiB0aGVzZSBoZWFkZXJzIHRoYXQgYXJlIHByZXNlbnQgaW4gbXkgcGVyc29uYWwgZWRrMiB0cmVlLCB0aGF0IGFyZQorICogbm90IHlldCBjb21taXR0ZWQgYmFjayB0byB0aGUgbWFpbiBlZGsyIHJlcG9zaXRvcnkuICBUaGVzZQorICogbW9kaWZpY2F0aW9ucyBhcmUgZml4ZXMgZm9yIGNvbXBpbGF0aW9uIG9uIGNhc2UtZGVwZW5kZW50CisgKiBmaWxlc3lzdGVtcywgY29tcGlsYXRpb24gdW5kZXIgLW1ydGQgYW5kIC1tcmVncGFybT0zLCBldGMuCisgKi8KKworLyogRUZJIGhlYWRlcnMgcnVkZWx5IHJlZGVmaW5lIE5VTEwgKi8KKyN1bmRlZiBOVUxMCisKKy8qIEVGSSBoZWFkZXJzIGV4cGVjdCBJQ0MgdG8gZGVmaW5lIF9fR05VQ19fICovCisjaWYgZGVmaW5lZCAoIF9fSUNDICkgJiYgISBkZWZpbmVkICggX19HTlVDX18gKQorI2RlZmluZSBfX0dOVUNfXyAxCisjZW5kaWYKKworLyogSW5jbHVkZSB0aGUgdG9wLWxldmVsIEVGSSBoZWFkZXIgZmlsZXMgKi8KKyNpbmNsdWRlIDxncHhlL2VmaS9VZWZpLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvUGlEeGUuaD4KKworLyogUmVzZXQgYW55IHRyYWlsaW5nICNwcmFnbWEgcGFjayBkaXJlY3RpdmVzICovCisjcHJhZ21hIHBhY2soMSkKKyNwcmFnbWEgcGFjaygpCisKKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorI2luY2x1ZGUgPGdweGUvdXVpZC5oPgorCisvKiogQW4gRUZJIHByb3RvY29sIHVzZWQgYnkgZ1BYRSAqLworc3RydWN0IGVmaV9wcm90b2NvbCB7CisJLyoqIEdVSUQgKi8KKwl1bmlvbiB7CisJCS8qKiBFRkkgcHJvdG9jb2wgR1VJRCAqLworCQlFRklfR1VJRCBndWlkOworCQkvKiogVVVJRCBzdHJ1Y3R1cmUgdW5kZXJzdG9vZCBieSBnUFhFICovCisJCXVuaW9uIHV1aWQgdXVpZDsKKwl9IHU7CisJLyoqIFZhcmlhYmxlIGNvbnRhaW5pbmcgcG9pbnRlciB0byBwcm90b2NvbCBzdHJ1Y3R1cmUgKi8KKwl2b2lkICoqcHJvdG9jb2w7Cit9OworCisvKiogRUZJIHByb3RvY29sIHRhYmxlICovCisjZGVmaW5lIEVGSV9QUk9UT0NPTFMgX190YWJsZSAoIHN0cnVjdCBlZmlfcHJvdG9jb2wsICJlZmlfcHJvdG9jb2xzIiApCisKKy8qKiBEZWNsYXJlIGFuIEVGSSBwcm90b2NvbCB1c2VkIGJ5IGdQWEUgKi8KKyNkZWZpbmUgX19lZmlfcHJvdG9jb2wgX190YWJsZV9lbnRyeSAoIEVGSV9QUk9UT0NPTFMsIDAxICkKKworLyoqIERlY2xhcmUgYW4gRUZJIHByb3RvY29sIHRvIGJlIHJlcXVpcmVkIGJ5IGdQWEUKKyAqCisgKiBAdiBfcHJvdG9jb2wJCUVGSSBwcm90b2NvbCBuYW1lCisgKiBAdiBfcHRyCQlQb2ludGVyIHRvIHByb3RvY29sIGluc3RhbmNlCisgKi8KKyNkZWZpbmUgRUZJX1JFUVVJUkVfUFJPVE9DT0woIF9wcm90b2NvbCwgX3B0ciApCQkJCSAgICAgXAorCXN0cnVjdCBlZmlfcHJvdG9jb2wgX18gIyMgX3Byb3RvY29sIF9fZWZpX3Byb3RvY29sID0gewkJICAgICBcCisJCS51Lmd1aWQgPSBfcHJvdG9jb2wgIyMgX0dVSUQsCQkJCSAgICAgXAorCQkucHJvdG9jb2wgPSAoICggdm9pZCAqKiApICggdm9pZCAqICkJCQkgICAgIFwKKwkJCSAgICAgICggKCAoX3B0cikgPT0gKCAoIF9wcm90b2NvbCAqKiApIChfcHRyKSApICkgPyAgXAorCQkJCShfcHRyKSA6IChfcHRyKSApICksCQkJICAgICBcCisJfQorCisvKiogQW4gRUZJIGNvbmZpZ3VyYXRpb24gdGFibGUgdXNlZCBieSBnUFhFICovCitzdHJ1Y3QgZWZpX2NvbmZpZ190YWJsZSB7CisJLyoqIEdVSUQgKi8KKwl1bmlvbiB7CisJCS8qKiBFRkkgY29uZmlndXJhdGlvbiB0YWJsZSBHVUlEICovCisJCUVGSV9HVUlEIGd1aWQ7CisJCS8qKiBVVUlEIHN0cnVjdHVyZSB1bmRlcnN0b29kIGJ5IGdQWEUgKi8KKwkJdW5pb24gdXVpZCB1dWlkOworCX0gdTsKKwkvKiogVmFyaWFibGUgY29udGFpbmluZyBwb2ludGVyIHRvIGNvbmZpZ3VyYXRpb24gdGFibGUgKi8KKwl2b2lkICoqdGFibGU7CisJLyoqIFRhYmxlIGlzIHJlcXVpcmVkIGZvciBvcGVyYXRpb24gKi8KKwlpbnQgcmVxdWlyZWQ7Cit9OworCisvKiogRUZJIGNvbmZpZ3VyYXRpb24gdGFibGUgdGFibGUgKi8KKyNkZWZpbmUgRUZJX0NPTkZJR19UQUJMRVMgXAorCV9fdGFibGUgKCBzdHJ1Y3QgZWZpX2NvbmZpZ190YWJsZSwgImVmaV9jb25maWdfdGFibGVzIiApCisKKy8qKiBEZWNsYXJlIGFuIEVGSSBjb25maWd1cmF0aW9uIHRhYmxlIHVzZWQgYnkgZ1BYRSAqLworI2RlZmluZSBfX2VmaV9jb25maWdfdGFibGUgX190YWJsZV9lbnRyeSAoIEVGSV9DT05GSUdfVEFCTEVTLCAwMSApCisKKy8qKiBEZWNsYXJlIGFuIEVGSSBjb25maWd1cmF0aW9uIHRhYmxlIHRvIGJlIHVzZWQgYnkgZ1BYRQorICoKKyAqIEB2IF90YWJsZQkJRUZJIGNvbmZpZ3VyYXRpb24gdGFibGUgbmFtZQorICogQHYgX3B0cgkJUG9pbnRlciB0byBjb25maWd1cmF0aW9uIHRhYmxlCisgKiBAdiBfcmVxdWlyZWQJCVRhYmxlIGlzIHJlcXVpcmVkIGZvciBvcGVyYXRpb24KKyAqLworI2RlZmluZSBFRklfVVNFX1RBQkxFKCBfdGFibGUsIF9wdHIsIF9yZXF1aXJlZCApCQkJICAgICBcCisJc3RydWN0IGVmaV9jb25maWdfdGFibGUgX18gIyMgX3RhYmxlIF9fZWZpX2NvbmZpZ190YWJsZSA9IHsJICAgICBcCisJCS51Lmd1aWQgPSBfdGFibGUgIyMgX0dVSUQsCQkJCSAgICAgXAorCQkudGFibGUgPSAoICggdm9pZCAqKiApICggdm9pZCAqICkgKF9wdHIpICksCQkgICAgIFwKKwkJLnJlcXVpcmVkID0gKF9yZXF1aXJlZCksCQkJCSAgICAgXAorCX0KKworLyoqIENvbnZlcnQgYSBnUFhFIHN0YXR1cyBjb2RlIHRvIGFuIEVGSSBzdGF0dXMgY29kZQorICoKKyAqIEZJWE1FOiBhY3R1YWxseSBwZXJmb3JtIHNvbWUga2luZCBvZiBjb252ZXJzaW9uLiAgZ1BYRSBlcnJvciBjb2RlcworICogd2lsbCBiZSBkZXRlY3RlZCBhcyBFRkkgZXJyb3IgY29kZXM7IGJvdGggaGF2ZSB0aGUgdG9wIGJpdCBzZXQsIGFuZAorICogdGhlIHN1Y2Nlc3MgcmV0dXJuIGNvZGUgaXMgemVybyBmb3IgYm90aC4gIEFueXRoaW5nIHRoYXQganVzdAorICogcmVwb3J0cyBhIG51bWVyaWNhbCBlcnJvciB3aWxsIGJlIE9LLCBhbnl0aGluZyBhdHRlbXB0aW5nIHRvCisgKiBpbnRlcnByZXQgdGhlIHZhbHVlIG9yIHRvIGRpc3BsYXkgYSB0ZXh0IGVxdWl2YWxlbnQgd2lsbCBiZQorICogc2NyZXdlZC4KKyAqLworI2RlZmluZSBSQ19UT19FRklSQyggcmMgKSAocmMpCisKKy8qKiBDb252ZXJ0IGFuIEVGSSBzdGF0dXMgY29kZSB0byBhIGdQWEUgc3RhdHVzIGNvZGUKKyAqCisgKiBGSVhNRTogYXMgYWJvdmUKKyAqLworI2RlZmluZSBFRklSQ19UT19SQyggZWZpcmMgKSAoZWZpcmMpCisKK2V4dGVybiBFRklfSEFORExFIGVmaV9pbWFnZV9oYW5kbGU7CitleHRlcm4gRUZJX1NZU1RFTV9UQUJMRSAqZWZpX3N5c3RhYjsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKiBlZmlfc3RyZXJyb3IgKCBFRklfU1RBVFVTIGVmaXJjICk7CitleHRlcm4gRUZJX1NUQVRVUyBlZmlfaW5pdCAoIEVGSV9IQU5ETEUgaW1hZ2VfaGFuZGxlLAorCQkJICAgICBFRklfU1lTVEVNX1RBQkxFICpzeXN0YWIgKTsKK2V4dGVybiBpbnQgZWZpX3NucF9pbnN0YWxsICggdm9pZCApOworCisjZW5kaWYgLyogX0VGSV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL2VmaV9pby5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9lZmlfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQ1ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9lZmlfaW8uaApAQCAtMCwwICsxLDE4MCBAQAorI2lmbmRlZiBfR1BYRV9FRklfSU9fSAorI2RlZmluZSBfR1BYRV9FRklfSU9fSAorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIEkvTyBBUEkgZm9yIEVGSQorICoKKyAqIEVGSSBydW5zIHdpdGggZmxhdCBwaHlzaWNhbCBhZGRyZXNzaW5nLCBzbyB0aGUgdmFyaW91cyBtYXBwaW5ncworICogYmV0d2VlbiB2aXJ0dWFsIGFkZHJlc3NlcywgSS9PIGFkZHJlc3NlcyBhbmQgYnVzIGFkZHJlc3NlcyBhcmUgYWxsCisgKiBuby1vcHMuICBJL08gaXMgaGFuZGxlZCB1c2luZyB0aGUgRUZJX0NQVV9JT19QUk9UT0NPTC4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZmRlZiBJT0FQSV9FRkkKKyNkZWZpbmUgSU9BUElfUFJFRklYX2VmaQorI2Vsc2UKKyNkZWZpbmUgSU9BUElfUFJFRklYX2VmaSBfX2VmaV8KKyNlbmRpZgorCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGVmaV9pb3JlYWQgKCB2b2xhdGlsZSB2b2lkICppb19hZGRyLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZSApOworZXh0ZXJuIHZvaWQgZWZpX2lvd3JpdGUgKCB1bnNpZ25lZCBsb25nIGxvbmcgZGF0YSwgdm9sYXRpbGUgdm9pZCAqaW9fYWRkciwKKwkJCSAgc2l6ZV90IHNpemUgKTsKK2V4dGVybiB2b2lkIGVmaV9pb3JlYWRzICggdm9sYXRpbGUgdm9pZCAqaW9fYWRkciwgdm9pZCAqZGF0YSwKKwkJCSAgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBjb3VudCApOworZXh0ZXJuIHZvaWQgZWZpX2lvd3JpdGVzICggdm9sYXRpbGUgdm9pZCAqaW9fYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBjb3VudCApOworCisvKgorICogUGh5c2ljYWw8LT5CdXMgYW5kIEJ1czwtPkkvTyBhZGRyZXNzIG1hcHBpbmdzCisgKgorICogRUZJIHJ1bnMgd2l0aCBmbGF0IHBoeXNpY2FsIGFkZHJlc3NpbmcsIHNvIHRoZXNlIGFyZSBhbGwgbm8tb3BzLgorICoKKyAqLworCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCitJT0FQSV9JTkxJTkUgKCBlZmksIHBoeXNfdG9fYnVzICkgKCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciApIHsKKwlyZXR1cm4gcGh5c19hZGRyOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCitJT0FQSV9JTkxJTkUgKCBlZmksIGJ1c190b19waHlzICkgKCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyICkgeworCXJldHVybiBidXNfYWRkcjsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitJT0FQSV9JTkxJTkUgKCBlZmksIGlvcmVtYXAgKSAoIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIHNpemVfdCBsZW4gX191bnVzZWQgKSB7CisJcmV0dXJuICggKCB2b2lkICogKSBidXNfYWRkciApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitJT0FQSV9JTkxJTkUgKCBlZmksIGlvdW5tYXAgKSAoIHZvbGF0aWxlIGNvbnN0IHZvaWQgKmlvX2FkZHIgX191bnVzZWQgKSB7CisJLyogTm90aGluZyB0byBkbyAqLworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCitJT0FQSV9JTkxJTkUgKCBlZmksIGlvX3RvX2J1cyApICggdm9sYXRpbGUgY29uc3Qgdm9pZCAqaW9fYWRkciApIHsKKwlyZXR1cm4gKCAoIHVuc2lnbmVkIGxvbmcgKSBpb19hZGRyICk7Cit9CisKKy8qCisgKiBJL08gZnVuY3Rpb25zCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHVpbnQ4X3QKK0lPQVBJX0lOTElORSAoIGVmaSwgcmVhZGIgKSAoIHZvbGF0aWxlIHVpbnQ4X3QgKmlvX2FkZHIgKSB7CisJcmV0dXJuIGVmaV9pb3JlYWQgKCBpb19hZGRyLCBzaXplb2YgKCAqaW9fYWRkciApICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHVpbnQxNl90CitJT0FQSV9JTkxJTkUgKCBlZmksIHJlYWR3ICkgKCB2b2xhdGlsZSB1aW50MTZfdCAqaW9fYWRkciApIHsKKwlyZXR1cm4gZWZpX2lvcmVhZCAoIGlvX2FkZHIsIHNpemVvZiAoICppb19hZGRyICkgKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdWludDMyX3QKK0lPQVBJX0lOTElORSAoIGVmaSwgcmVhZGwgKSAoIHZvbGF0aWxlIHVpbnQzMl90ICppb19hZGRyICkgeworCXJldHVybiBlZmlfaW9yZWFkICggaW9fYWRkciwgc2l6ZW9mICggKmlvX2FkZHIgKSApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1aW50NjRfdAorSU9BUElfSU5MSU5FICggZWZpLCByZWFkcSApICggdm9sYXRpbGUgdWludDY0X3QgKmlvX2FkZHIgKSB7CisJcmV0dXJuIGVmaV9pb3JlYWQgKCBpb19hZGRyLCBzaXplb2YgKCAqaW9fYWRkciApICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK0lPQVBJX0lOTElORSAoIGVmaSwgd3JpdGViICkgKCB1aW50OF90IGRhdGEsIHZvbGF0aWxlIHVpbnQ4X3QgKmlvX2FkZHIgKSB7CisJZWZpX2lvd3JpdGUgKCBkYXRhLCBpb19hZGRyLCBzaXplb2YgKCAqaW9fYWRkciApICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK0lPQVBJX0lOTElORSAoIGVmaSwgd3JpdGV3ICkgKCB1aW50MTZfdCBkYXRhLCB2b2xhdGlsZSB1aW50MTZfdCAqaW9fYWRkciApIHsKKwllZmlfaW93cml0ZSAoIGRhdGEsIGlvX2FkZHIsIHNpemVvZiAoICppb19hZGRyICkgKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAorSU9BUElfSU5MSU5FICggZWZpLCB3cml0ZWwgKSAoIHVpbnQzMl90IGRhdGEsIHZvbGF0aWxlIHVpbnQzMl90ICppb19hZGRyICkgeworCWVmaV9pb3dyaXRlICggZGF0YSwgaW9fYWRkciwgc2l6ZW9mICggKmlvX2FkZHIgKSApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitJT0FQSV9JTkxJTkUgKCBlZmksIHdyaXRlcSApICggdWludDY0X3QgZGF0YSwgdm9sYXRpbGUgdWludDY0X3QgKmlvX2FkZHIgKSB7CisJZWZpX2lvd3JpdGUgKCBkYXRhLCBpb19hZGRyLCBzaXplb2YgKCAqaW9fYWRkciApICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHVpbnQ4X3QKK0lPQVBJX0lOTElORSAoIGVmaSwgaW5iICkgKCB2b2xhdGlsZSB1aW50OF90ICppb19hZGRyICkgeworCXJldHVybiBlZmlfaW9yZWFkICggaW9fYWRkciwgc2l6ZW9mICggKmlvX2FkZHIgKSApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1aW50MTZfdAorSU9BUElfSU5MSU5FICggZWZpLCBpbncgKSAoIHZvbGF0aWxlIHVpbnQxNl90ICppb19hZGRyICkgeworCXJldHVybiBlZmlfaW9yZWFkICggaW9fYWRkciwgc2l6ZW9mICggKmlvX2FkZHIgKSApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1aW50MzJfdAorSU9BUElfSU5MSU5FICggZWZpLCBpbmwgKSAoIHZvbGF0aWxlIHVpbnQzMl90ICppb19hZGRyICkgeworCXJldHVybiBlZmlfaW9yZWFkICggaW9fYWRkciwgc2l6ZW9mICggKmlvX2FkZHIgKSApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitJT0FQSV9JTkxJTkUgKCBlZmksIG91dGIgKSAoIHVpbnQ4X3QgZGF0YSwgdm9sYXRpbGUgdWludDhfdCAqaW9fYWRkciApIHsKKwllZmlfaW93cml0ZSAoIGRhdGEsIGlvX2FkZHIsIHNpemVvZiAoICppb19hZGRyICkgKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAorSU9BUElfSU5MSU5FICggZWZpLCBvdXR3ICkgKCB1aW50MTZfdCBkYXRhLCB2b2xhdGlsZSB1aW50MTZfdCAqaW9fYWRkciApIHsKKwllZmlfaW93cml0ZSAoIGRhdGEsIGlvX2FkZHIsIHNpemVvZiAoICppb19hZGRyICkgKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAorSU9BUElfSU5MSU5FICggZWZpLCBvdXRsICkgKCB1aW50MzJfdCBkYXRhLCB2b2xhdGlsZSB1aW50MzJfdCAqaW9fYWRkciApIHsKKwllZmlfaW93cml0ZSAoIGRhdGEsIGlvX2FkZHIsIHNpemVvZiAoICppb19hZGRyICkgKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAorSU9BUElfSU5MSU5FICggZWZpLCBpbnNiICkgKCB2b2xhdGlsZSB1aW50OF90ICppb19hZGRyLCB1aW50OF90ICpkYXRhLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnQgKSB7CisJZWZpX2lvcmVhZHMgKCBpb19hZGRyLCBkYXRhLCBzaXplb2YgKCAqaW9fYWRkciApLCBjb3VudCApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitJT0FQSV9JTkxJTkUgKCBlZmksIGluc3cgKSAoIHZvbGF0aWxlIHVpbnQxNl90ICppb19hZGRyLCB1aW50MTZfdCAqZGF0YSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50ICkgeworCWVmaV9pb3JlYWRzICggaW9fYWRkciwgZGF0YSwgc2l6ZW9mICggKmlvX2FkZHIgKSwgY291bnQgKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAorSU9BUElfSU5MSU5FICggZWZpLCBpbnNsICkgKCB2b2xhdGlsZSB1aW50MzJfdCAqaW9fYWRkciwgdWludDMyX3QgKmRhdGEsCisJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudCApIHsKKwllZmlfaW9yZWFkcyAoIGlvX2FkZHIsIGRhdGEsIHNpemVvZiAoICppb19hZGRyICksIGNvdW50ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK0lPQVBJX0lOTElORSAoIGVmaSwgb3V0c2IgKSAoIHZvbGF0aWxlIHVpbnQ4X3QgKmlvX2FkZHIsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQgKSB7CisJZWZpX2lvd3JpdGVzICggaW9fYWRkciwgZGF0YSwgc2l6ZW9mICggKmlvX2FkZHIgKSwgY291bnQgKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAorSU9BUElfSU5MSU5FICggZWZpLCBvdXRzdyApICggdm9sYXRpbGUgdWludDE2X3QgKmlvX2FkZHIsIGNvbnN0IHVpbnQxNl90ICpkYXRhLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50ICkgeworCWVmaV9pb3dyaXRlcyAoIGlvX2FkZHIsIGRhdGEsIHNpemVvZiAoICppb19hZGRyICksIGNvdW50ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK0lPQVBJX0lOTElORSAoIGVmaSwgb3V0c2wgKSAoIHZvbGF0aWxlIHVpbnQzMl90ICppb19hZGRyLCBjb25zdCB1aW50MzJfdCAqZGF0YSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjb3VudCApIHsKKwllZmlfaW93cml0ZXMgKCBpb19hZGRyLCBkYXRhLCBzaXplb2YgKCAqaW9fYWRkciApLCBjb3VudCApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitJT0FQSV9JTkxJTkUgKCBlZmksIG1iICkgKCB2b2lkICkgeworCS8qIERvIG5vdGhpbmc7IEVGSSByZWFkbCgpL3dyaXRlbCgpIGNhbGxzIGFscmVhZHkgYWN0IGFzCisJICogbWVtb3J5IGJhcnJpZXJzLgorCSAqLworfQorCisjZW5kaWYgLyogX0dQWEVfRUZJX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvZWZpX3BjaS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9lZmlfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljMGViMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvZWZpX3BjaS5oCkBAIC0wLDAgKzEsMTQ4IEBACisjaWZuZGVmIF9HUFhFX0VGSV9QQ0lfSAorI2RlZmluZSBfR1BYRV9FRklfUENJX0gKKworLyoqIEBmaWxlCisgKgorICogZ1BYRSBQQ0kgSS9PIEFQSSBmb3IgRUZJCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2lmZGVmIFBDSUFQSV9FRkkKKyNkZWZpbmUgUENJQVBJX1BSRUZJWF9lZmkKKyNlbHNlCisjZGVmaW5lIFBDSUFQSV9QUkVGSVhfZWZpIF9fZWZpXworI2VuZGlmCisKKy8qIEVGSSBQQ0kgd2lkdGggY29kZXMgZGVmaW5lZCBieSBFRkkgc3BlYyAqLworI2RlZmluZSBFRklQQ0lfV0lEVEhfQllURSAwCisjZGVmaW5lIEVGSVBDSV9XSURUSF9XT1JEIDEKKyNkZWZpbmUgRUZJUENJX1dJRFRIX0RXT1JEIDIKKworI2RlZmluZSBFRklQQ0lfTE9DQVRJT04oIF9vZmZzZXQsIF93aWR0aCApIFwKKwkoIChfb2Zmc2V0KSB8ICggKF93aWR0aCkgPDwgMTYgKSApCisjZGVmaW5lIEVGSVBDSV9PRkZTRVQoIF9sb2NhdGlvbiApICggKF9sb2NhdGlvbikgJiAweGZmZmYgKQorI2RlZmluZSBFRklQQ0lfV0lEVEgoIF9sb2NhdGlvbiApICggKF9sb2NhdGlvbikgPj4gMTYgKQorCitzdHJ1Y3QgcGNpX2RldmljZTsKKworZXh0ZXJuIGludCBlZmlwY2lfcmVhZCAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIHVuc2lnbmVkIGxvbmcgbG9jYXRpb24sCisJCQkgdm9pZCAqdmFsdWUgKTsKK2V4dGVybiBpbnQgZWZpcGNpX3dyaXRlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwgdW5zaWduZWQgbG9uZyBsb2NhdGlvbiwKKwkJCSAgdW5zaWduZWQgbG9uZyB2YWx1ZSApOworCisvKioKKyAqIERldGVybWluZSBtYXhpbXVtIFBDSSBidXMgbnVtYmVyIHdpdGhpbiBzeXN0ZW0KKyAqCisgKiBAcmV0IG1heF9idXMJCU1heGltdW0gYnVzIG51bWJlcgorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBpbnQKK1BDSUFQSV9JTkxJTkUgKCBlZmksIHBjaV9tYXhfYnVzICkgKCB2b2lkICkgeworCS8qIE5vIHdheSB0byB3b3JrIHRoaXMgb3V0IHZpYSBFRkkgKi8KKwlyZXR1cm4gMHhmZjsKK30KKworLyoqCisgKiBSZWFkIGJ5dGUgZnJvbSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB2aWEgRUZJCisgKgorICogQHYgcGNpCVBDSSBkZXZpY2UKKyAqIEB2IHdoZXJlCUxvY2F0aW9uIHdpdGhpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICogQHYgdmFsdWUJVmFsdWUgcmVhZAorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgaW50CitQQ0lBUElfSU5MSU5FICggZWZpLCBwY2lfcmVhZF9jb25maWdfYnl0ZSApICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJCQkgICAgICB1aW50OF90ICp2YWx1ZSApIHsKKwlyZXR1cm4gZWZpcGNpX3JlYWQgKCBwY2ksCisJCQkgICAgIEVGSVBDSV9MT0NBVElPTiAoIHdoZXJlLCBFRklQQ0lfV0lEVEhfQllURSApLAorCQkJICAgICB2YWx1ZSApOworfQorCisvKioKKyAqIFJlYWQgd29yZCBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHZpYSBFRkkKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgd2hlcmUJTG9jYXRpb24gd2l0aGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAdiB2YWx1ZQlWYWx1ZSByZWFkCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBpbnQKK1BDSUFQSV9JTkxJTkUgKCBlZmksIHBjaV9yZWFkX2NvbmZpZ193b3JkICkgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgd2hlcmUsCisJCQkJCSAgICAgIHVpbnQxNl90ICp2YWx1ZSApIHsKKwlyZXR1cm4gZWZpcGNpX3JlYWQgKCBwY2ksCisJCQkgICAgIEVGSVBDSV9MT0NBVElPTiAoIHdoZXJlLCBFRklQQ0lfV0lEVEhfV09SRCApLAorCQkJICAgICB2YWx1ZSApOworfQorCisvKioKKyAqIFJlYWQgZHdvcmQgZnJvbSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB2aWEgRUZJCisgKgorICogQHYgcGNpCVBDSSBkZXZpY2UKKyAqIEB2IHdoZXJlCUxvY2F0aW9uIHdpdGhpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICogQHYgdmFsdWUJVmFsdWUgcmVhZAorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgaW50CitQQ0lBUElfSU5MSU5FICggZWZpLCBwY2lfcmVhZF9jb25maWdfZHdvcmQgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgd2hlcmUsCisJCQkJCSAgICAgICB1aW50MzJfdCAqdmFsdWUgKSB7CisJcmV0dXJuIGVmaXBjaV9yZWFkICggcGNpLAorCQkJICAgICBFRklQQ0lfTE9DQVRJT04gKCB3aGVyZSwgRUZJUENJX1dJRFRIX0RXT1JEICksCisJCQkgICAgIHZhbHVlICk7Cit9CisKKy8qKgorICogV3JpdGUgYnl0ZSB0byBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB2aWEgRUZJCisgKgorICogQHYgcGNpCVBDSSBkZXZpY2UKKyAqIEB2IHdoZXJlCUxvY2F0aW9uIHdpdGhpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICogQHYgdmFsdWUJVmFsdWUgdG8gYmUgd3JpdHRlbgorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgaW50CitQQ0lBUElfSU5MSU5FICggZWZpLCBwY2lfd3JpdGVfY29uZmlnX2J5dGUgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgd2hlcmUsCisJCQkJCSAgICAgICB1aW50OF90IHZhbHVlICkgeworCXJldHVybiBlZmlwY2lfd3JpdGUgKCBwY2ksCisJCQkgICAgICBFRklQQ0lfTE9DQVRJT04gKCB3aGVyZSwgRUZJUENJX1dJRFRIX0JZVEUgKSwKKwkJCSAgICAgIHZhbHVlICk7Cit9CisKKy8qKgorICogV3JpdGUgd29yZCB0byBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB2aWEgRUZJCisgKgorICogQHYgcGNpCVBDSSBkZXZpY2UKKyAqIEB2IHdoZXJlCUxvY2F0aW9uIHdpdGhpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICogQHYgdmFsdWUJVmFsdWUgdG8gYmUgd3JpdHRlbgorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgaW50CitQQ0lBUElfSU5MSU5FICggZWZpLCBwY2lfd3JpdGVfY29uZmlnX3dvcmQgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgd2hlcmUsCisJCQkJCSAgICAgICB1aW50MTZfdCB2YWx1ZSApIHsKKwlyZXR1cm4gZWZpcGNpX3dyaXRlICggcGNpLAorCQkJICAgICAgRUZJUENJX0xPQ0FUSU9OICggd2hlcmUsIEVGSVBDSV9XSURUSF9XT1JEICksCisJCQkgICAgICB2YWx1ZSApOworfQorCisvKioKKyAqIFdyaXRlIGR3b3JkIHRvIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHZpYSBFRkkKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgd2hlcmUJTG9jYXRpb24gd2l0aGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAdiB2YWx1ZQlWYWx1ZSB0byBiZSB3cml0dGVuCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBpbnQKK1BDSUFQSV9JTkxJTkUgKCBlZmksIHBjaV93cml0ZV9jb25maWdfZHdvcmQgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJCQl1bnNpZ25lZCBpbnQgd2hlcmUsCisJCQkJCQl1aW50MzJfdCB2YWx1ZSApIHsKKwlyZXR1cm4gZWZpcGNpX3dyaXRlICggcGNpLAorCQkJICAgICAgRUZJUENJX0xPQ0FUSU9OICggd2hlcmUsIEVGSVBDSV9XSURUSF9EV09SRCApLAorCQkJICAgICAgdmFsdWUgKTsKK30KKworI2VuZGlmIC8qIF9HUFhFX0VGSV9QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9lZmlfc21iaW9zLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL2VmaV9zbWJpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTYzMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9lZmlfc21iaW9zLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfR1BYRV9FRklfU01CSU9TX0gKKyNkZWZpbmUgX0dQWEVfRUZJX1NNQklPU19ICisKKy8qKiBAZmlsZQorICoKKyAqIGdQWEUgU01CSU9TIEFQSSBmb3IgRUZJCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2lmZGVmIFNNQklPU19FRkkKKyNkZWZpbmUgU01CSU9TX1BSRUZJWF9lZmkKKyNlbHNlCisjZGVmaW5lIFNNQklPU19QUkVGSVhfZWZpIF9fZWZpXworI2VuZGlmCisKKyNlbmRpZiAvKiBfR1BYRV9FRklfU01CSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvZWZpX3RpbWVyLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL2VmaV90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTMxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL2VmaV90aW1lci5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX0dQWEVfRUZJX1RJTUVSX0gKKyNkZWZpbmUgX0dQWEVfRUZJX1RJTUVSX0gKKworLyoqIEBmaWxlCisgKgorICogZ1BYRSB0aW1lciBBUEkgZm9yIEVGSQorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZmRlZiBUSU1FUl9FRkkKKyNkZWZpbmUgVElNRVJfUFJFRklYX2VmaQorI2Vsc2UKKyNkZWZpbmUgVElNRVJfUFJFRklYX2VmaSBfX2VmaV8KKyNlbmRpZgorCisjZW5kaWYgLyogX0dQWEVfRUZJX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvZWZpX3VhY2Nlc3MuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvZWZpX3VhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI2MWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9lZmlfdWFjY2Vzcy5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgX0dQWEVfRUZJX1VBQ0NFU1NfSAorI2RlZmluZSBfR1BYRV9FRklfVUFDQ0VTU19ICisKKy8qKiBAZmlsZQorICoKKyAqIGdQWEUgdXNlciBhY2Nlc3MgQVBJIGZvciBFRkkKKyAqCisgKiBFRkkgcnVucyB3aXRoIGZsYXQgcGh5c2ljYWwgYWRkcmVzc2luZywgc28gdGhlIHZhcmlvdXMgbWFwcGluZ3MKKyAqIGJldHdlZW4gdmlydHVhbCBhZGRyZXNzZXMsIEkvTyBhZGRyZXNzZXMgYW5kIGJ1cyBhZGRyZXNzZXMgYXJlIGFsbAorICogbm8tb3BzLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2lmZGVmIFVBQ0NFU1NfRUZJCisjZGVmaW5lIFVBQ0NFU1NfUFJFRklYX2VmaQorI2Vsc2UKKyNkZWZpbmUgVUFDQ0VTU19QUkVGSVhfZWZpIF9fZWZpXworI2VuZGlmCisKKy8qKgorICogQ29udmVydCBwaHlzaWNhbCBhZGRyZXNzIHRvIHVzZXIgcG9pbnRlcgorICoKKyAqIEB2IHBoeXNfYWRkcgkJUGh5c2ljYWwgYWRkcmVzcworICogQHJldCB1c2VycHRyCQlVc2VyIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdXNlcnB0cl90CitVQUNDRVNTX0lOTElORSAoIGVmaSwgcGh5c190b191c2VyICkgKCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciApIHsKKwlyZXR1cm4gcGh5c19hZGRyOworfQorCisvKioKKyAqIENvbnZlcnQgdXNlciBidWZmZXIgdG8gcGh5c2ljYWwgYWRkcmVzcworICoKKyAqIEB2IHVzZXJwdHIJCVVzZXIgcG9pbnRlcgorICogQHYgb2Zmc2V0CQlPZmZzZXQgZnJvbSB1c2VyIHBvaW50ZXIKKyAqIEByZXQgcGh5c19hZGRyCVBoeXNpY2FsIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZworVUFDQ0VTU19JTkxJTkUgKCBlZmksIHVzZXJfdG9fcGh5cyApICggdXNlcnB0cl90IHVzZXJwdHIsIG9mZl90IG9mZnNldCApIHsKKwlyZXR1cm4gKCB1c2VycHRyICsgb2Zmc2V0ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHVzZXJwdHJfdAorVUFDQ0VTU19JTkxJTkUgKCBlZmksIHZpcnRfdG9fdXNlciApICggdm9sYXRpbGUgY29uc3Qgdm9pZCAqYWRkciApIHsKKwlyZXR1cm4gdHJpdmlhbF92aXJ0X3RvX3VzZXIgKCBhZGRyICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQgKgorVUFDQ0VTU19JTkxJTkUgKCBlZmksIHVzZXJfdG9fdmlydCApICggdXNlcnB0cl90IHVzZXJwdHIsIG9mZl90IG9mZnNldCApIHsKKwlyZXR1cm4gdHJpdmlhbF91c2VyX3RvX3ZpcnQgKCB1c2VycHRyLCBvZmZzZXQgKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdXNlcnB0cl90CitVQUNDRVNTX0lOTElORSAoIGVmaSwgdXNlcnB0cl9hZGQgKSAoIHVzZXJwdHJfdCB1c2VycHRyLCBvZmZfdCBvZmZzZXQgKSB7CisJcmV0dXJuIHRyaXZpYWxfdXNlcnB0cl9hZGQgKCB1c2VycHRyLCBvZmZzZXQgKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAorVUFDQ0VTU19JTkxJTkUgKCBlZmksIG1lbWNweV91c2VyICkgKCB1c2VycHRyX3QgZGVzdCwgb2ZmX3QgZGVzdF9vZmYsCisJCQkJCXVzZXJwdHJfdCBzcmMsIG9mZl90IHNyY19vZmYsCisJCQkJCXNpemVfdCBsZW4gKSB7CisJdHJpdmlhbF9tZW1jcHlfdXNlciAoIGRlc3QsIGRlc3Rfb2ZmLCBzcmMsIHNyY19vZmYsIGxlbiApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitVQUNDRVNTX0lOTElORSAoIGVmaSwgbWVtbW92ZV91c2VyICkgKCB1c2VycHRyX3QgZGVzdCwgb2ZmX3QgZGVzdF9vZmYsCisJCQkJCSB1c2VycHRyX3Qgc3JjLCBvZmZfdCBzcmNfb2ZmLAorCQkJCQkgc2l6ZV90IGxlbiApIHsKKwl0cml2aWFsX21lbW1vdmVfdXNlciAoIGRlc3QsIGRlc3Rfb2ZmLCBzcmMsIHNyY19vZmYsIGxlbiApOworfQorCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitVQUNDRVNTX0lOTElORSAoIGVmaSwgbWVtc2V0X3VzZXIgKSAoIHVzZXJwdHJfdCBidWZmZXIsIG9mZl90IG9mZnNldCwKKwkJCQkJaW50IGMsIHNpemVfdCBsZW4gKSB7CisJdHJpdmlhbF9tZW1zZXRfdXNlciAoIGJ1ZmZlciwgb2Zmc2V0LCBjLCBsZW4gKTsKK30KKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitVQUNDRVNTX0lOTElORSAoIGVmaSwgc3RybGVuX3VzZXIgKSAoIHVzZXJwdHJfdCBidWZmZXIsIG9mZl90IG9mZnNldCApIHsKKwlyZXR1cm4gdHJpdmlhbF9zdHJsZW5fdXNlciAoIGJ1ZmZlciwgb2Zmc2V0ICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIG9mZl90CitVQUNDRVNTX0lOTElORSAoIGVmaSwgbWVtY2hyX3VzZXIgKSAoIHVzZXJwdHJfdCBidWZmZXIsIG9mZl90IG9mZnNldCwKKwkJCQkJaW50IGMsIHNpemVfdCBsZW4gKSB7CisJcmV0dXJuIHRyaXZpYWxfbWVtY2hyX3VzZXIgKCBidWZmZXIsIG9mZnNldCwgYywgbGVuICk7Cit9CisKKyNlbmRpZiAvKiBfR1BYRV9FRklfVUFDQ0VTU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL2VmaV91bWFsbG9jLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWZpL2VmaV91bWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4OGRkMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvZWZpX3VtYWxsb2MuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9HUFhFX0VGSV9VTUFMTE9DX0gKKyNkZWZpbmUgX0dQWEVfRUZJX1VNQUxMT0NfSAorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIHVzZXIgbWVtb3J5IGFsbG9jYXRpb24gQVBJIGZvciBFRkkKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaWZkZWYgVU1BTExPQ19FRkkKKyNkZWZpbmUgVU1BTExPQ19QUkVGSVhfZWZpCisjZWxzZQorI2RlZmluZSBVTUFMTE9DX1BSRUZJWF9lZmkgX19lZmlfCisjZW5kaWYKKworI2VuZGlmIC8qIF9HUFhFX0VGSV9VTUFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvaW1wb3J0LnBsIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VmaS9pbXBvcnQucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTY5OTM5NAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lZmkvaW1wb3J0LnBsCkBAIC0wLDAgKzEsNzUgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2UgRmlsZTo6U3BlYzo6RnVuY3Rpb25zIHF3ICggOkFMTCApOwordXNlIEZpbGU6OkZpbmQ7Cit1c2UgRmlsZTo6UGF0aDsKK3VzZSBGaW5kQmluOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworc3ViIHRyeV9pbXBvcnRfZmlsZSB7CisgIG15ICRncHhlZGlyID0gc2hpZnQ7CisgIG15ICRlZGtkaXJzID0gc2hpZnQ7CisgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICMgU2tpcCBldmVyeXRoaW5nIGV4Y2VwdCBoZWFkZXJzCisgIHJldHVybiB1bmxlc3MgJGZpbGVuYW1lID1+IC9cLmgkLzsKKyAgcHJpbnQgIiRmaWxlbmFtZS4uLiI7CisKKyAgbXkgJG91dGZpbGUgPSBjYXRmaWxlICggJGdweGVkaXIsICRmaWxlbmFtZSApOworICBmb3JlYWNoIG15ICRlZGtkaXIgKCBAJGVka2RpcnMgKSB7CisgICAgbXkgJGluZmlsZSA9IGNhdGZpbGUgKCAkZWRrZGlyLCAkZmlsZW5hbWUgKTsKKyAgICBpZiAoIC1lICRpbmZpbGUgKSB7CisgICAgICAjIFdlIGhhdmUgZm91bmQgYSBtYXRjaGluZyBzb3VyY2UgZmlsZSAtIGltcG9ydCBpdAorICAgICAgcHJpbnQgIiRpbmZpbGVcbiI7CisgICAgICBvcGVuIG15ICRpbmZoLCAiPCRpbmZpbGUiIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gJGluZmlsZTogJCFcbiI7CisgICAgICAoIHVuZGVmLCBteSAkb3V0ZGlyLCB1bmRlZiApID0gc3BsaXRwYXRoICggJG91dGZpbGUgKTsKKyAgICAgIG1rcGF0aCAoICRvdXRkaXIgKTsKKyAgICAgIG9wZW4gbXkgJG91dGZoLCAiPiRvdXRmaWxlIiBvciBkaWUgIkNvdWxkIG5vdCBvcGVuICRvdXRmaWxlOiAkIVxuIjsKKyAgICAgIG15IEBkZXBlbmRlbmNpZXMgPSAoKTsKKyAgICAgIHdoaWxlICggPCRpbmZoPiApIHsKKwkjIFN0cmlwIENSIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCisJcy9cci8vZzsKKwlzL1xzKiQvL2c7CisJY2hvbXA7CisJIyBVcGRhdGUgaW5jbHVkZSBsaW5lcywgYW5kIHJlY29yZCBpbmNsdWRlZCBmaWxlcworCWlmICggcy9eXCNpbmNsdWRlXHMrWzxcIl0oXFMrKVs+XCJdL1wjaW5jbHVkZSA8Z3B4ZVwvZWZpXC8kMT4vICkgeworCSAgcHVzaCBAZGVwZW5kZW5jaWVzLCAkMTsKKwl9CisJcHJpbnQgJG91dGZoICIkX1xuIjsKKyAgICAgIH0KKyAgICAgIGNsb3NlICRvdXRmaDsKKyAgICAgIGNsb3NlICRpbmZoOworICAgICAgIyBSZWN1cnNlIHRvIGhhbmRsZSBhbnkgaW5jbHVkZWQgZmlsZXMgdGhhdCB3ZSBkb24ndCBhbHJlYWR5IGhhdmUKKyAgICAgIGZvcmVhY2ggbXkgJGRlcGVuZGVuY3kgKCBAZGVwZW5kZW5jaWVzICkgeworCWlmICggISAtZSBjYXRmaWxlICggJGdweGVkaXIsICRkZXBlbmRlbmN5ICkgKSB7CisJICBwcmludCAiLi4uZm9sbG93aW5nIGRlcGVuZGVuY3kgb24gJGRlcGVuZGVuY3lcbiI7CisJICB0cnlfaW1wb3J0X2ZpbGUgKCAkZ3B4ZWRpciwgJGVka2RpcnMsICRkZXBlbmRlbmN5ICk7CisJfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBwcmludCAibm8gZXF1aXZhbGVudCBmb3VuZFxuIjsKK30KKworIyBJZGVudGlmeSBlZGsgaW1wb3J0IGRpcmVjdG9yaWVzCitkaWUgIlN5bnRheCAkMCAvcGF0aC90by9lZGsyL2VkazJcbiIgdW5sZXNzIEBBUkdWID09IDE7CitteSAkZWRrdG9wID0gc2hpZnQ7CitkaWUgIkRpcmVjdG9yeSBcIiRlZGt0b3BcIiBkb2VzIG5vdCBhcHBlYXIgdG8gY29udGFpbiB0aGUgRUZJIEVESzJcbiIKKyAgICB1bmxlc3MgLWUgY2F0ZmlsZSAoICRlZGt0b3AsICJNZGVQa2ciICk7CitteSAkZWRrZGlycyA9IFsgY2F0ZmlsZSAoICRlZGt0b3AsICJNZGVQa2cvSW5jbHVkZSIgKSwKKwkJY2F0ZmlsZSAoICRlZGt0b3AsICJJbnRlbEZyYW1ld29ya1BrZy9JbmNsdWRlIiApIF07CisKKyMgSWRlbnRpZnkgZ1BYRSBFRkkgaW5jbHVkZXMgZGlyZWN0b3J5CitteSAkZ3B4ZWRpciA9ICRGaW5kQmluOjpCaW47CitkaWUgIkRpcmVjdG9yeSBcIiRncHhlZGlyXCIgZG9lcyBub3QgYXBwZWFyIHRvIGNvbnRhaW4gdGhlIGdQWEUgRUZJIGluY2x1ZGVzXG4iCisgICAgdW5sZXNzIC1lIGNhdGZpbGUgKCAkZ3B4ZWRpciwgIi4uLy4uLy4uL2luY2x1ZGUvZ3B4ZS9lZmkiICk7CisKK3ByaW50ICJJbXBvcnRpbmcgRUZJIGhlYWRlcnMgaW50byAkZ3B4ZWRpclxuZnJvbSAiOworcHJpbnQgam9pbiAoICJcbiBhbmQgIiwgQCRlZGtkaXJzICkuIlxuIjsKKworIyBJbXBvcnQgaGVhZGVycworZmluZCAoIHsgd2FudGVkID0+IHN1YiB7CisgIHRyeV9pbXBvcnRfZmlsZSAoICRncHhlZGlyLCAkZWRrZGlycywgYWJzMnJlbCAoICRfLCAkZ3B4ZWRpciApICk7Cit9LCBub19jaGRpciA9PiAxIH0sICRncHhlZGlyICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZWlzYS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2Vpc2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZlNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2Vpc2EuaApAQCAtMCwwICsxLDEzMCBAQAorI2lmbmRlZiBFSVNBX0gKKyNkZWZpbmUgRUlTQV9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvaXNhX2lkcy5oPgorI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKworLyoKKyAqIEVJU0EgY29uc3RhbnRzCisgKgorICovCisKKyNkZWZpbmUgRUlTQV9NSU5fU0xPVCAoMHgxKQorI2RlZmluZSBFSVNBX01BWF9TTE9UICgweGYpCS8qIE11c3QgYmUgMl5uIC0gMSAqLworI2RlZmluZSBFSVNBX1NMT1RfQkFTRSggbiApICggMHgxMDAwICogKG4pICkKKworI2RlZmluZSBFSVNBX1ZFTkRPUl9JRCAoIDB4YzgwICkKKyNkZWZpbmUgRUlTQV9QUk9EX0lEICggMHhjODIgKQorI2RlZmluZSBFSVNBX0dMT0JBTF9DT05GSUcgKCAweGM4NCApCisKKyNkZWZpbmUgRUlTQV9DTURfUkVTRVQgKCAxIDw8IDIgKQorI2RlZmluZSBFSVNBX0NNRF9FTkFCTEUgKCAxIDw8IDAgKQorCisvKiogQW4gRUlTQSBkZXZpY2UgSUQgbGlzdCBlbnRyeSAqLworc3RydWN0IGVpc2FfZGV2aWNlX2lkIHsKKwkvKiogTmFtZSAqLworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworCS8qKiBNYW51ZmFjdHVyZXIgSUQgKi8KKwl1aW50MTZfdCB2ZW5kb3JfaWQ7CisJLyoqIFByb2R1Y3QgSUQgKi8KKwl1aW50MTZfdCBwcm9kX2lkOworfTsKKworLyoqIEFuIEVJU0EgZGV2aWNlICovCitzdHJ1Y3QgZWlzYV9kZXZpY2UgeworCS8qKiBHZW5lcmljIGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UgZGV2OworCS8qKiBTbG90IG51bWJlciAqLworCXVuc2lnbmVkIGludCBzbG90OworCS8qKiBJL08gYWRkcmVzcyAqLworCXVpbnQxNl90IGlvYWRkcjsKKwkvKiogTWFudWZhY3R1cmVyIElEICovCisJdWludDE2X3QgdmVuZG9yX2lkOworCS8qKiBQcm9kdWN0IElEICovCisJdWludDE2X3QgcHJvZF9pZDsKKwkvKiogRHJpdmVyIGZvciB0aGlzIGRldmljZSAqLworCXN0cnVjdCBlaXNhX2RyaXZlciAqZHJpdmVyOworCS8qKiBEcml2ZXItcHJpdmF0ZSBkYXRhCisJICoKKwkgKiBVc2UgZWlzYV9zZXRfZHJ2ZGF0YSgpIGFuZCBlaXNhX2dldF9kcnZkYXRhKCkgdG8gYWNjZXNzCisJICogdGhpcyBmaWVsZC4KKwkgKi8KKwl2b2lkICpwcml2OworCS8qKiBEcml2ZXIgbmFtZSAqLworCWNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lOworfTsKKworLyoqIEFuIEVJU0EgZHJpdmVyICovCitzdHJ1Y3QgZWlzYV9kcml2ZXIgeworCS8qKiBFSVNBIElEIHRhYmxlICovCisJc3RydWN0IGVpc2FfZGV2aWNlX2lkICppZHM7CisJLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIEVJU0EgSUQgdGFibGUgKi8KKwl1bnNpZ25lZCBpbnQgaWRfY291bnQ7CisJLyoqCisJICogUHJvYmUgZGV2aWNlCisJICoKKwkgKiBAdiBlaXNhCUVJU0EgZGV2aWNlCisJICogQHYgaWQJTWF0Y2hpbmcgZW50cnkgaW4gSUQgdGFibGUKKwkgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorCSAqLworCWludCAoICogcHJvYmUgKSAoIHN0cnVjdCBlaXNhX2RldmljZSAqZWlzYSwKKwkJCSAgY29uc3Qgc3RydWN0IGVpc2FfZGV2aWNlX2lkICppZCApOworCS8qKgorCSAqIFJlbW92ZSBkZXZpY2UKKwkgKgorCSAqIEB2IGVpc2EJRUlTQSBkZXZpY2UKKwkgKi8KKwl2b2lkICggKiByZW1vdmUgKSAoIHN0cnVjdCBlaXNhX2RldmljZSAqZWlzYSApOworfTsKKworLyoqIEVJU0EgZHJpdmVyIHRhYmxlICovCisjZGVmaW5lIEVJU0FfRFJJVkVSUyBfX3RhYmxlICggc3RydWN0IGVpc2FfZHJpdmVyLCAiZWlzYV9kcml2ZXJzIiApCisKKy8qKiBEZWNsYXJlIGFuIEVJU0EgZHJpdmVyICovCisjZGVmaW5lIF9fZWlzYV9kcml2ZXIgX190YWJsZV9lbnRyeSAoIEVJU0FfRFJJVkVSUywgMDEgKQorCitleHRlcm4gdm9pZCBlaXNhX2RldmljZV9lbmFibGVkICggc3RydWN0IGVpc2FfZGV2aWNlICplaXNhLCBpbnQgZW5hYmxlZCApOworCisvKioKKyAqIEVuYWJsZSBFSVNBIGRldmljZQorICoKKyAqIEB2IGVpc2EJCUVJU0EgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfZWlzYV9kZXZpY2UgKCBzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVpc2EgKSB7CisJZWlzYV9kZXZpY2VfZW5hYmxlZCAoIGVpc2EsIDEgKTsKK30KKworLyoqCisgKiBEaXNhYmxlIEVJU0EgZGV2aWNlCisgKgorICogQHYgZWlzYQkJRUlTQSBkZXZpY2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfZWlzYV9kZXZpY2UgKCBzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVpc2EgKSB7CisJZWlzYV9kZXZpY2VfZW5hYmxlZCAoIGVpc2EsIDAgKTsKK30KKworLyoqCisgKiBTZXQgRUlTQSBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgZWlzYQkJRUlTQSBkZXZpY2UKKyAqIEB2IHByaXYJCVByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZWlzYV9zZXRfZHJ2ZGF0YSAoIHN0cnVjdCBlaXNhX2RldmljZSAqZWlzYSwgdm9pZCAqcHJpdiApIHsKKwllaXNhLT5wcml2ID0gcHJpdjsKK30KKworLyoqCisgKiBHZXQgRUlTQSBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgZWlzYQkJRUlTQSBkZXZpY2UKKyAqIEByZXQgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGVpc2FfZ2V0X2RydmRhdGEgKCBzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVpc2EgKSB7CisJcmV0dXJuIGVpc2EtPnByaXY7Cit9CisKKyNlbmRpZiAvKiBFSVNBX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lbGYuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTlkMmZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VsZi5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0dQWEVfRUxGX0gKKyNkZWZpbmUgX0dQWEVfRUxGX0gKKworLyoqCisgKiBAZmlsZQorICoKKyAqIEVMRiBpbWFnZSBmb3JtYXQKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8ZWxmLmg+CisKK2V4dGVybiBpbnQgZWxmX2xvYWQgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICk7CisKKyNlbmRpZiAvKiBfR1BYRV9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2VycmZpbGUuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lcnJmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmOGYzNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lcnJmaWxlLmgKQEAgLTAsMCArMSwyMDcgQEAKKyNpZm5kZWYgX0dQWEVfRVJSRklMRV9ICisjZGVmaW5lIF9HUFhFX0VSUkZJTEVfSAorCisvKiogQGZpbGUKKyAqCisgKiBFcnJvciBmaWxlIGlkZW50aWZpZXJzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGJpdHMvZXJyZmlsZS5oPgorCisvKioKKyAqIEBkZWZncm91cCBlcnJmaWxlY2F0IEVycm9yIGZpbGUgaWRlbnRpZmllciBjYXRlZ29yaWVzCisgKgorICogQHsKKyAqLworCisjZGVmaW5lIEVSUkZJTEVfQ09SRQkJMHgwMDAwMjAwMAkvKio8IENvcmUgY29kZSAqLworI2RlZmluZSBFUlJGSUxFX0RSSVZFUgkJMHgwMDAwNDAwMAkvKio8IERyaXZlciBjb2RlICovCisjZGVmaW5lIEVSUkZJTEVfTkVUCQkweDAwMDA2MDAwCS8qKjwgTmV0d29ya2luZyBjb2RlICovCisjZGVmaW5lIEVSUkZJTEVfSU1BR0UJCTB4MDAwMDgwMDAJLyoqPCBJbWFnZSBjb2RlICovCisjZGVmaW5lIEVSUkZJTEVfT1RIRVIJCTB4MDAwMGUwMDAJLyoqPCBBbnkgb3RoZXIgY29kZSAqLworCisvKiogQH0gKi8KKworLyoqIEZsYWcgZm9yIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZXJyb3IgZmlsZXMgKi8KKyNkZWZpbmUgRVJSRklMRV9BUkNICQkweDAwODAwMDAwCisKKy8qKgorICogQGRlZmdyb3VwIGVycmZpbGUgRXJyb3IgZmlsZSBpZGVudGlmaWVycworICoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgZGVmaW5pdGlvbnMKKyAqIGZvciBlcnJvciBudW1iZXJzIHN1Y2ggYXMgRUlOVkFMLgorICoKKyAqIEB7CisgKi8KKworI2RlZmluZSBFUlJGSUxFX2FzcHJpbnRmCSAgICAgICAoIEVSUkZJTEVfQ09SRSB8IDB4MDAwMDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2Rvd25sb2FkZXIJICAgICAgICggRVJSRklMRV9DT1JFIHwgMHgwMDAxMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZXhlYwkJICAgICAgICggRVJSRklMRV9DT1JFIHwgMHgwMDAyMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaHcJCSAgICAgICAoIEVSUkZJTEVfQ09SRSB8IDB4MDAwMzAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2lvYnVmCQkgICAgICAgKCBFUlJGSUxFX0NPUkUgfCAweDAwMDQwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9qb2IJCSAgICAgICAoIEVSUkZJTEVfQ09SRSB8IDB4MDAwNTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2xpbmVidWYJCSAgICAgICAoIEVSUkZJTEVfQ09SRSB8IDB4MDAwNjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX21vbm9qb2IJCSAgICAgICAoIEVSUkZJTEVfQ09SRSB8IDB4MDAwNzAwMDAgKQorI2RlZmluZSBFUlJGSUxFX252bwkJICAgICAgICggRVJSRklMRV9DT1JFIHwgMHgwMDA4MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfb3BlbgkJICAgICAgICggRVJSRklMRV9DT1JFIHwgMHgwMDA5MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfcG9zaXhfaW8JICAgICAgICggRVJSRklMRV9DT1JFIHwgMHgwMDBhMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfcmVzb2x2CQkgICAgICAgKCBFUlJGSUxFX0NPUkUgfCAweDAwMGIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9zZXR0aW5ncwkgICAgICAgKCBFUlJGSUxFX0NPUkUgfCAweDAwMGMwMDAwICkKKyNkZWZpbmUgRVJSRklMRV92c3ByaW50ZgkgICAgICAgKCBFUlJGSUxFX0NPUkUgfCAweDAwMGQwMDAwICkKKyNkZWZpbmUgRVJSRklMRV94ZmVyCQkgICAgICAgKCBFUlJGSUxFX0NPUkUgfCAweDAwMGUwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9iaXRtYXAJCSAgICAgICAoIEVSUkZJTEVfQ09SRSB8IDB4MDAwZjAwMDAgKQorCisjZGVmaW5lIEVSUkZJTEVfZWlzYQkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDAwMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaXNhCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMDEwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pc2FwbnAJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAwMjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX21jYQkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDAzMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfcGNpCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMDQwMDAwICkKKworI2RlZmluZSBFUlJGSUxFX252cwkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDEwMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfc3BpCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMTEwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pMmNfYml0CQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMTIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9zcGlfYml0CQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMTMwMDAwICkKKworI2RlZmluZSBFUlJGSUxFXzNjNTA5CQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMjAwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9ibngyCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMjEwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9jczg5eDAJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAyMjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2VlcHJvCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMjMwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9ldGhlcmZhYnJpYwkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMjQwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9sZWdhY3kJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAyNTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX25hdHNlbWkJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAyNjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3BuaWMJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAyNzAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3ByaXNtMl9wY2kJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDI4MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfcHJpc20yX3BseAkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMjkwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9ydGw4MTM5CQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMmEwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9zbWM5MDAwCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMmIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV90ZzMJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAyYzAwMDAgKQorI2RlZmluZSBFUlJGSUxFXzNjNTA5X2Vpc2EJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDJkMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfM2M1MTUJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAyZTAwMDAgKQorI2RlZmluZSBFUlJGSUxFXzNjNTI5CQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMmYwMDAwICkKKyNkZWZpbmUgRVJSRklMRV8zYzU5NQkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDMwMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfM2M1eDkJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAzMTAwMDAgKQorI2RlZmluZSBFUlJGSUxFXzNjOTB4CQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMzIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9hbWQ4MTExZQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMzMwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9kYXZpY29tCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwMzQwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9kZXBjYQkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDM1MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZG1mZQkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDM2MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZWVwcm8xMDAJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDM4MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZXBpYzEwMAkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDM5MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZm9yY2VkZXRoCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDAzYTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX210ZDgweAkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDNiMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfbnM4MzgyMAkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDNjMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfbnM4MzkwCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwM2QwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9wY25ldDMyCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwM2UwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9yODE2OQkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDNmMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfc2lzOTAwCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNDAwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9zdW5kYW5jZQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNDEwMDAwICkKKyNkZWZpbmUgRVJSRklMRV90bGFuCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNDIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV90dWxpcAkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDQzMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfdmlhX3JoaW5lCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDA0NDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3ZpYV92ZWxvY2l0eQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNDUwMDAwICkKKyNkZWZpbmUgRVJSRklMRV93ODljODQwCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNDYwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pcG9pYgkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDQ3MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZTEwMDAJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDA0ODAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2UxMDAwX2h3CSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDA0OTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX210bmljCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNGEwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9waGFudG9tCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNGIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9uZTJrX2lzYQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNGMwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9iNDQJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDA0ZDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3J0bDgxOHgJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDA0ZTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3NreTIgICAgICAgICAgICAgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNGYwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9hdGg1awkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDUwMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfYXRsMWUJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDA1MTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3NpczE5MAkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDUyMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfbXlyaTEwZ2UJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDUzMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfc2tnZQkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDU0MDAwMCApCisKKyNkZWZpbmUgRVJSRklMRV9zY3NpCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNzAwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9hcmJlbAkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDcxMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaGVybW9uCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNzIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9saW5kYQkJICAgICAoIEVSUkZJTEVfRFJJVkVSIHwgMHgwMDczMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfYXRhCQkgICAgICggRVJSRklMRV9EUklWRVIgfCAweDAwNzQwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9zcnAJCSAgICAgKCBFUlJGSUxFX0RSSVZFUiB8IDB4MDA3NTAwMDAgKQorCisjZGVmaW5lIEVSUkZJTEVfYW9lCQkJKCBFUlJGSUxFX05FVCB8IDB4MDAwMDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2FycAkJCSggRVJSRklMRV9ORVQgfCAweDAwMDEwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9kaGNwb3B0cwkJKCBFUlJGSUxFX05FVCB8IDB4MDAwMjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2V0aGVybmV0CQkoIEVSUkZJTEVfTkVUIHwgMHgwMDAzMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaWNtcHY2CQkJKCBFUlJGSUxFX05FVCB8IDB4MDAwNDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2lwdjQJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDA1MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaXB2NgkJCSggRVJSRklMRV9ORVQgfCAweDAwMDYwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9uZHAJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDA3MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfbmV0ZGV2aWNlCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDA4MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfbnVsbG5ldAkJCSggRVJSRklMRV9ORVQgfCAweDAwMDkwMDAwICkKKyNkZWZpbmUgRVJSRklMRV90Y3AJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDBhMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZnRwCQkJKCBFUlJGSUxFX05FVCB8IDB4MDAwYjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2h0dHAJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDBjMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaXNjc2kJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDBkMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfdGNwaXAJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDBlMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfdWRwCQkJKCBFUlJGSUxFX05FVCB8IDB4MDAwZjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2RoY3AJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDEwMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZG5zCQkJKCBFUlJGSUxFX05FVCB8IDB4MDAxMTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3RmdHAJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDEyMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaW5maW5pYmFuZAkJKCBFUlJGSUxFX05FVCB8IDB4MDAxMzAwMDAgKQorI2RlZmluZSBFUlJGSUxFX25ldGRldl9zZXR0aW5ncwkJKCBFUlJGSUxFX05FVCB8IDB4MDAxNDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2RoY3Bwa3QJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDE1MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfc2xhbQkJCSggRVJSRklMRV9ORVQgfCAweDAwMTYwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pYl9zbWEJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDE3MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaWJfcGFja2V0CQkoIEVSUkZJTEVfTkVUIHwgMHgwMDE4MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaWNtcAkJCSggRVJSRklMRV9ORVQgfCAweDAwMTkwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pYl9xc2V0CQkJKCBFUlJGSUxFX05FVCB8IDB4MDAxYTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2liX2dtYQkJCSggRVJSRklMRV9ORVQgfCAweDAwMWIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pYl9wYXRocmVjCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDFjMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaWJfbWNhc3QJCSggRVJSRklMRV9ORVQgfCAweDAwMWQwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pYl9jbQkJCSggRVJSRklMRV9ORVQgfCAweDAwMWUwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9uZXQ4MDIxMQkJKCBFUlJGSUxFX05FVCB8IDB4MDAxZjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2liX21pCQkJKCBFUlJGSUxFX05FVCB8IDB4MDAyMDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2liX2NtcmMJCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDIxMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaWJfc3JwCQkJKCBFUlJGSUxFX05FVCB8IDB4MDAyMjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3NlYzgwMjExCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDIzMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfd2VwCQkJKCBFUlJGSUxFX05FVCB8IDB4MDAyNDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2VhcG9sCQkJKCBFUlJGSUxFX05FVCB8IDB4MDAyNTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3dwYQkJCSggRVJSRklMRV9ORVQgfCAweDAwMjYwMDAwICkKKyNkZWZpbmUgRVJSRklMRV93cGFfcHNrCQkJKCBFUlJGSUxFX05FVCB8IDB4MDAyNzAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3dwYV90a2lwCQkoIEVSUkZJTEVfTkVUIHwgMHgwMDI4MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfd3BhX2NjbXAJCSggRVJSRklMRV9ORVQgfCAweDAwMjkwMDAwICkKKworI2RlZmluZSBFUlJGSUxFX2ltYWdlCQkgICAgICAoIEVSUkZJTEVfSU1BR0UgfCAweDAwMDAwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9lbGYJCSAgICAgICggRVJSRklMRV9JTUFHRSB8IDB4MDAwMTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3NjcmlwdAkJICAgICAgKCBFUlJGSUxFX0lNQUdFIHwgMHgwMDAyMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfc2VnbWVudAkJICAgICAgKCBFUlJGSUxFX0lNQUdFIHwgMHgwMDAzMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZWZpX2ltYWdlCSAgICAgICggRVJSRklMRV9JTUFHRSB8IDB4MDAwNDAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2VtYmVkZGVkCSAgICAgICggRVJSRklMRV9JTUFHRSB8IDB4MDAwNTAwMDAgKQorCisjZGVmaW5lIEVSUkZJTEVfYXNuMQkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDAwMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfY2hhcAkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDAxMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfYW9lYm9vdAkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDAyMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfYXV0b2Jvb3QJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDAzMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZGhjcG1nbXQJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDA0MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaW1nbWdtdAkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDA1MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfcHhlX3RmdHAJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDA2MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfcHhlX3VkcAkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDA3MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfYXh0bHNfYWVzCSAgICAgICggRVJSRklMRV9PVEhFUiB8IDB4MDAwODAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2NpcGhlcgkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDA5MDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaW1hZ2VfY21kCSAgICAgICggRVJSRklMRV9PVEhFUiB8IDB4MDAwYTAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3VyaV90ZXN0CSAgICAgICggRVJSRklMRV9PVEhFUiB8IDB4MDAwYjAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2liZnQJCSAgICAgICggRVJSRklMRV9PVEhFUiB8IDB4MDAwYzAwMDAgKQorI2RlZmluZSBFUlJGSUxFX3RscwkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDBkMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfaWZtZ210CQkgICAgICAoIEVSUkZJTEVfT1RIRVIgfCAweDAwMGUwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pc2NzaWJvb3QJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDBmMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZWZpX3BjaQkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDEwMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZWZpX3NucAkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDExMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfc21iaW9zCQkgICAgICAoIEVSUkZJTEVfT1RIRVIgfCAweDAwMTIwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9zbWJpb3Nfc2V0dGluZ3MJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDEzMDAwMCApCisjZGVmaW5lIEVSUkZJTEVfZWZpX3NtYmlvcwkgICAgICAoIEVSUkZJTEVfT1RIRVIgfCAweDAwMTQwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9weGVtZW51CQkgICAgICAoIEVSUkZJTEVfT1RIRVIgfCAweDAwMTUwMDAwICkKKyNkZWZpbmUgRVJSRklMRV94NTA5CQkgICAgICAoIEVSUkZJTEVfT1RIRVIgfCAweDAwMTYwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9sb2dpbl91aQkgICAgICAoIEVSUkZJTEVfT1RIRVIgfCAweDAwMTcwMDAwICkKKyNkZWZpbmUgRVJSRklMRV9pYl9zcnBib290CSAgICAgICggRVJSRklMRV9PVEhFUiB8IDB4MDAxODAwMDAgKQorI2RlZmluZSBFUlJGSUxFX2l3bWdtdAkJICAgICAgKCBFUlJGSUxFX09USEVSIHwgMHgwMDE5MDAwMCApCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogX0dQWEVfRVJSRklMRV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZXJyb3J0YWIuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9lcnJvcnRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NzY1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZXJyb3J0YWIuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9HUFhFX0VSUk9SVEFCX0gKKyNkZWZpbmUgX0dQWEVfRVJST1JUQUJfSAorCisvKiogQGZpbGUKKyAqCisgKiBFcnJvciBtZXNzYWdlIHRhYmxlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorCitzdHJ1Y3QgZXJyb3J0YWIgeworCWludCBlcnJubzsKKwljb25zdCBjaGFyICp0ZXh0OworfTsKKworI2RlZmluZSBFUlJPUlRBQiBfX3RhYmxlICggc3RydWN0IGVycm9ydGFiLCAiZXJyb3J0YWIiICkKKworI2RlZmluZSBfX2Vycm9ydGFiIF9fdGFibGVfZW50cnkgKCBFUlJPUlRBQiwgMDEgKQorCisjZW5kaWYgLyogX0dQWEVfRVJST1JUQUJfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2V0aGVybmV0LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZXRoZXJuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGZjMjRkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2V0aGVybmV0LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfR1BYRV9FVEhFUk5FVF9ICisjZGVmaW5lIF9HUFhFX0VUSEVSTkVUX0gKKworLyoqIEBmaWxlCisgKgorICogRXRoZXJuZXQgcHJvdG9jb2wKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2V4dGVybiB2b2lkIGV0aF9pbml0X2FkZHIgKCBjb25zdCB2b2lkICpod19hZGRyLCB2b2lkICpsbF9hZGRyICk7CitleHRlcm4gY29uc3QgY2hhciAqIGV0aF9udG9hICggY29uc3Qgdm9pZCAqbGxfYWRkciApOworZXh0ZXJuIGludCBldGhfbWNfaGFzaCAoIHVuc2lnbmVkIGludCBhZiwgY29uc3Qgdm9pZCAqbmV0X2FkZHIsCisJCQkgdm9pZCAqbGxfYWRkciApOworZXh0ZXJuIGludCBldGhfZXRoX2FkZHIgKCBjb25zdCB2b2lkICpsbF9hZGRyLCB2b2lkICpldGhfYWRkciApOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICogYWxsb2NfZXRoZXJkZXYgKCBzaXplX3QgcHJpdl9zaXplICk7CisKKyNlbmRpZiAvKiBfR1BYRV9FVEhFUk5FVF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZmFrZWRoY3AuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9mYWtlZGhjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDNiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZmFrZWRoY3AuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9HUFhFX0ZBS0VESENQX0gKKyNkZWZpbmUgX0dQWEVfRkFLRURIQ1BfSAorCisvKiogQGZpbGUKKyAqCisgKiBGYWtlIERIQ1AgcGFja2V0cworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IG5ldF9kZXZpY2U7CisKK2V4dGVybiBpbnQgY3JlYXRlX2Zha2VkaGNwZGlzY292ZXIgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCSAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IG1heF9sZW4gKTsKK2V4dGVybiBpbnQgY3JlYXRlX2Zha2VkaGNwYWNrICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQl2b2lkICpkYXRhLCBzaXplX3QgbWF4X2xlbiApOworZXh0ZXJuIGludCBjcmVhdGVfZmFrZXB4ZWJzYWNrICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IG1heF9sZW4gKTsKKworI2VuZGlmIC8qIF9HUFhFX0ZBS0VESENQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9mZWF0dXJlcy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2ZlYXR1cmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MzE4NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9mZWF0dXJlcy5oCkBAIC0wLDAgKzEsMTAzIEBACisjaWZuZGVmIF9HUFhFX0ZFQVRVUkVTX0gKKyNkZWZpbmUgX0dQWEVfRkVBVFVSRVNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3AuaD4KKworLyoqIEBmaWxlCisgKgorICogRmVhdHVyZSBsaXN0CisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZGVmZ3JvdXAgZmVhdHVyZWNhdCBGZWF0dXJlIGNhdGVnb3JpZXMKKyAqIEB7CisgKi8KKworI2RlZmluZSBGRUFUVVJFX1BST1RPQ09MCQkwMSAvKio8IE5ldHdvcmsgcHJvdG9jb2xzICovCisjZGVmaW5lIEZFQVRVUkVfSU1BR0UJCQkwMiAvKio8IEltYWdlIGZvcm1hdHMgKi8KKyNkZWZpbmUgRkVBVFVSRV9NSVNDCQkJMDMgLyoqPCBNaXNjZWxsYW5lb3VzICovCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBkaGNwZmVhdHVyZXMgREhDUCBmZWF0dXJlIG9wdGlvbiB0YWdzCisgKgorICogREhDUCBmZWF0dXJlIG9wdGlvbiB0YWdzIGFyZSBFdGhlcmJvb3QgZW5jYXBzdWxhdGVkIG9wdGlvbnMgaW4gdGhlCisgKiByYW5nZSAweDEwLTB4N2YuCisgKgorICogQHsKKyAqLworCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9QWEVfRVhUCQkweDEwIC8qKjwgUFhFIEFQSSBleHRlbnNpb25zICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9JU0NTSQkJMHgxMSAvKio8IGlTQ1NJIHByb3RvY29sICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9BT0UJCTB4MTIgLyoqPCBBb0UgcHJvdG9jb2wgKi8KKyNkZWZpbmUgREhDUF9FQl9GRUFUVVJFX0hUVFAJCTB4MTMgLyoqPCBIVFRQIHByb3RvY29sICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9IVFRQUwkJMHgxNCAvKio8IEhUVFBTIHByb3RvY29sICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9URlRQCQkweDE1IC8qKjwgVEZUUCBwcm90b2NvbCAqLworI2RlZmluZSBESENQX0VCX0ZFQVRVUkVfRlRQCQkweDE2IC8qKjwgRlRQIHByb3RvY29sICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9ETlMJCTB4MTcgLyoqPCBETlMgcHJvdG9jb2wgKi8KKyNkZWZpbmUgREhDUF9FQl9GRUFUVVJFX0JaSU1BR0UJCTB4MTggLyoqPCBiekltYWdlIGZvcm1hdCAqLworI2RlZmluZSBESENQX0VCX0ZFQVRVUkVfTVVMVElCT09UCTB4MTkgLyoqPCBNdWx0aWJvb3QgZm9ybWF0ICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9TTEFNCQkweDFhIC8qKjwgU0xBTSBwcm90b2NvbCAqLworI2RlZmluZSBESENQX0VCX0ZFQVRVUkVfU1JQCQkweDFiIC8qKjwgU1JQIHByb3RvY29sICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9OQkkJCTB4MjAgLyoqPCBOQkkgZm9ybWF0ICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9QWEUJCTB4MjEgLyoqPCBQWEUgZm9ybWF0ICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9FTEYJCTB4MjIgLyoqPCBFTEYgZm9ybWF0ICovCisjZGVmaW5lIERIQ1BfRUJfRkVBVFVSRV9DT01CT09UCQkweDIzIC8qKjwgQ09NQk9PVCBmb3JtYXQgKi8KKyNkZWZpbmUgREhDUF9FQl9GRUFUVVJFX0VGSQkJMHgyNCAvKio8IEVGSSBmb3JtYXQgKi8KKworLyoqIEB9ICovCisKKy8qKiBESENQIGZlYXR1cmUgdGFibGUgKi8KKyNkZWZpbmUgREhDUF9GRUFUVVJFUyBfX3RhYmxlICggdWludDhfdCwgImRoY3BfZmVhdHVyZXMiICkKKworLyoqIERlY2xhcmUgYSBmZWF0dXJlIGNvZGUgZm9yIERIQ1AgKi8KKyNkZWZpbmUgX19kaGNwX2ZlYXR1cmUgX190YWJsZV9lbnRyeSAoIERIQ1BfRkVBVFVSRVMsIDAxICkKKworLyoqIENvbnN0cnVjdCBhIERIQ1AgZmVhdHVyZSB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBESENQX0ZFQVRVUkUoIGZlYXR1cmVfb3B0LCAuLi4gKQkJCQkgICAgXAorCV9ESENQX0ZFQVRVUkUgKCBPQkpFQ1QsIGZlYXR1cmVfb3B0LCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIF9ESENQX0ZFQVRVUkUoIF9uYW1lLCBmZWF0dXJlX29wdCwgLi4uICkJCQkgICAgXAorCV9fREhDUF9GRUFUVVJFICggX25hbWUsIGZlYXR1cmVfb3B0LCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIF9fREhDUF9GRUFUVVJFKCBfbmFtZSwgZmVhdHVyZV9vcHQsIC4uLiApCQkJICAgIFwKKwl1aW50OF90IF9fZGhjcF9mZWF0dXJlXyAjIyBfbmFtZSBbXSBfX2RoY3BfZmVhdHVyZSA9IHsJCSAgICBcCisJCWZlYXR1cmVfb3B0LCBESENQX09QVElPTiAoIF9fVkFfQVJHU19fICkJCSAgICBcCisJfTsKKworLyoqIEEgbmFtZWQgZmVhdHVyZSAqLworc3RydWN0IGZlYXR1cmUgeworCS8qKiBGZWF0dXJlIG5hbWUgKi8KKwljaGFyICpuYW1lOworfTsKKworLyoqIE5hbWVkIGZlYXR1cmUgdGFibGUgKi8KKyNkZWZpbmUgRkVBVFVSRVMgX190YWJsZSAoIHN0cnVjdCBmZWF0dXJlLCAiZmVhdHVyZXMiICkKKworLyoqIERlY2xhcmUgYSBuYW1lZCBmZWF0dXJlICovCisjZGVmaW5lIF9fZmVhdHVyZV9uYW1lKCBjYXRlZ29yeSApIF9fdGFibGVfZW50cnkgKCBGRUFUVVJFUywgY2F0ZWdvcnkgKQorCisvKiogQ29uc3RydWN0IGEgbmFtZWQgZmVhdHVyZSAqLworI2RlZmluZSBGRUFUVVJFX05BTUUoIGNhdGVnb3J5LCB0ZXh0ICkJCQkJCSAgICBcCisJX0ZFQVRVUkVfTkFNRSAoIGNhdGVnb3J5LCBPQkpFQ1QsIHRleHQgKQorI2RlZmluZSBfRkVBVFVSRV9OQU1FKCBjYXRlZ29yeSwgX25hbWUsIHRleHQgKQkJCQkgICAgXAorCV9fRkVBVFVSRV9OQU1FICggY2F0ZWdvcnksIF9uYW1lLCB0ZXh0ICkKKyNkZWZpbmUgX19GRUFUVVJFX05BTUUoIGNhdGVnb3J5LCBfbmFtZSwgdGV4dCApCQkJCSAgICBcCisJc3RydWN0IGZlYXR1cmUgX19mZWF0dXJlXyAjIyBfbmFtZSBfX2ZlYXR1cmVfbmFtZSAoIGNhdGVnb3J5ICkgPSB7ICBcCisJCS5uYW1lID0gdGV4dCwJCQkJCQkgICAgXAorCX07CisKKy8qKiBEZWNsYXJlIGEgZmVhdHVyZSAqLworI2RlZmluZSBGRUFUVVJFKCBjYXRlZ29yeSwgdGV4dCwgZmVhdHVyZV9vcHQsIHZlcnNpb24gKQkJCSAgICBcCisJRkVBVFVSRV9OQU1FICggY2F0ZWdvcnksIHRleHQgKTsJCQkJICAgIFwKKwlESENQX0ZFQVRVUkUgKCBmZWF0dXJlX29wdCwgdmVyc2lvbiApOworCisvKiogRGVjbGFyZSB0aGUgdmVyc2lvbiBudW1iZXIgZmVhdHVyZSAqLworI2RlZmluZSBGRUFUVVJFX1ZFUlNJT04oIC4uLiApCQkJCQkJICAgIFwKKwlESENQX0ZFQVRVUkUgKCBESENQX0VOQ0FQU1VMQVRFRCAoIERIQ1BfRUJfVkVSU0lPTiApLCBfX1ZBX0FSR1NfXyApCisKKyNlbmRpZiAvKiBfR1BYRV9GRUFUVVJFU19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZmlsdGVyLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1OWZjYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9maWx0ZXIuaApAQCAtMCwwICsxLDc1IEBACisjaWZuZGVmIF9HUFhFX0ZJTFRFUl9ICisjZGVmaW5lIF9HUFhFX0ZJTFRFUl9ICisKKy8qKiBAZmlsZQorICoKKyAqIERhdGEgdHJhbnNmZXIgZmlsdGVycworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKworLyoqCisgKiBIYWxmIG9mIGEgZGF0YSB0cmFuc2ZlciBmaWx0ZXIKKyAqCisgKiBFbWJlZCB0d28gb2YgdGhlc2Ugc3RydWN0dXJlcyB3aXRoaW4gYSBzdHJ1Y3R1cmUgaW1wbGVtZW50aW5nIGEKKyAqIGRhdGEgdHJhbnNmZXIgZmlsdGVyLCBhbmQgaW50aWFsaXNlIHdpdGggZmlsdGVyX2luaXQoKS4gIFlvdSBjYW4KKyAqIHRoZW4gdXNlIHRoZSBmaWx0ZXJfeHh4KCkgbWV0aG9kcyBhcyB0aGUgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIG1ldGhvZHMgYXMgcmVxdWlyZWQuCisgKi8KK3N0cnVjdCB4ZmVyX2ZpbHRlcl9oYWxmIHsKKwkvKiogRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgeGZlcjsKKwkvKiogT3RoZXIgaGFsZiBvZiB0aGUgZGF0YSB0cmFuc2ZlciBmaWx0ZXIgKi8KKwlzdHJ1Y3QgeGZlcl9maWx0ZXJfaGFsZiAqb3RoZXI7Cit9OworCisvKioKKyAqIEdldCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBmb3IgdGhlIG90aGVyIGhhbGYgb2YgYSBkYXRhIHRyYW5zZmVyIGZpbHRlcgorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAcmV0IG90aGVyCQlPdGhlciBoYWxmJ3MgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgc3RydWN0IHhmZXJfaW50ZXJmYWNlICoKK2ZpbHRlcl9vdGhlcl9oYWxmICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyICkgeworCXN0cnVjdCB4ZmVyX2ZpbHRlcl9oYWxmICpoYWxmID0gCisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCB4ZmVyX2ZpbHRlcl9oYWxmLCB4ZmVyICk7CisJcmV0dXJuICZoYWxmLT5vdGhlci0+eGZlcjsKK30KKworZXh0ZXJuIHZvaWQgZmlsdGVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKTsKK2V4dGVybiBpbnQgZmlsdGVyX3ZyZWRpcmVjdCAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHR5cGUsCisJCQkgICAgICB2YV9saXN0IGFyZ3MgKTsKK2V4dGVybiBzaXplX3QgZmlsdGVyX3dpbmRvdyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciApOworZXh0ZXJuIHN0cnVjdCBpb19idWZmZXIgKiBmaWx0ZXJfYWxsb2NfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCQkgICAgIHNpemVfdCBsZW4gKTsKK2V4dGVybiBpbnQgZmlsdGVyX2RlbGl2ZXJfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJCXN0cnVjdCB4ZmVyX21ldGFkYXRhICptZXRhICk7CitleHRlcm4gaW50IGZpbHRlcl9kZWxpdmVyX3JhdyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQlzaXplX3QgbGVuICk7CisKKy8qKgorICogSW5pdGlhbGlzZSBhIGRhdGEgdHJhbnNmZXIgZmlsdGVyCisgKgorICogQHYgbGVmdAkJIkxlZnQiIGhhbGYgb2YgdGhlIGZpbHRlcgorICogQHYgbGVmdF9vcAkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2Ugb3BlcmF0aW9ucyBmb3IgImxlZnQiIGhhbGYKKyAqIEB2IHJpZ2h0CQkiUmlnaHQiIGhhbGYgb2YgdGhlIGZpbHRlcgorICogQHYgcmlnaHRfb3AJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlIG9wZXJhdGlvbnMgZm9yICJyaWdodCIgaGFsZgorICogQHYgcmVmY250CQlDb250YWluaW5nIG9iamVjdCByZWZlcmVuY2UgY291bnRlciwgb3IgTlVMTAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsdGVyX2luaXQgKCBzdHJ1Y3QgeGZlcl9maWx0ZXJfaGFsZiAqbGVmdCwKKwkJCQkgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgKmxlZnRfb3AsCisJCQkJIHN0cnVjdCB4ZmVyX2ZpbHRlcl9oYWxmICpyaWdodCwKKwkJCQkgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgKnJpZ2h0X29wLAorCQkJCSBzdHJ1Y3QgcmVmY250ICpyZWZjbnQgKSB7CisJeGZlcl9pbml0ICggJmxlZnQtPnhmZXIsIGxlZnRfb3AsIHJlZmNudCApOworCXhmZXJfaW5pdCAoICZyaWdodC0+eGZlciwgcmlnaHRfb3AsIHJlZmNudCApOworCWxlZnQtPm90aGVyID0gcmlnaHQ7CisJcmlnaHQtPm90aGVyID0gbGVmdDsKK30KKworI2VuZGlmIC8qIF9HUFhFX0ZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZnRwLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxOTRmNgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9mdHAuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9HUFhFX0ZUUF9ICisjZGVmaW5lIF9HUFhFX0ZUUF9ICisKKy8qKiBAZmlsZQorICoKKyAqIEZpbGUgdHJhbnNmZXIgcHJvdG9jb2wKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogRlRQIGRlZmF1bHQgcG9ydCAqLworI2RlZmluZSBGVFBfUE9SVCAyMQorCisjZW5kaWYgLyogX0dQWEVfRlRQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9nZGJzZXJpYWwuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9nZGJzZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjEzYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2dkYnNlcmlhbC5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0dQWEVfR0RCU0VSSUFMX0gKKyNkZWZpbmUgX0dQWEVfR0RCU0VSSUFMX0gKKworLyoqIEBmaWxlCisgKgorICogR0RCIHJlbW90ZSBkZWJ1Z2dpbmcgb3ZlciBzZXJpYWwKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitzdHJ1Y3QgZ2RiX3RyYW5zcG9ydDsKKworLyoqCisgKiBTZXQgdXAgdGhlIHNlcmlhbCB0cmFuc3BvcnQKKyAqCisgKiBAcmV0IHRyYW5zcG9ydCBzdWl0YWJsZSBmb3Igc3RhcnRpbmcgdGhlIEdEQiBzdHViIG9yIE5VTEwgb24gZXJyb3IKKyAqLworc3RydWN0IGdkYl90cmFuc3BvcnQgKmdkYnNlcmlhbF9jb25maWd1cmUgKCB2b2lkICk7CisKKyNlbmRpZiAvKiBfR1BYRV9HREJTRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2dkYnN0dWIuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9nZGJzdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5YjdjMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9nZGJzdHViLmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfR1BYRV9HREJTVFVCX0gKKyNkZWZpbmUgX0dQWEVfR0RCU1RVQl9ICisKKy8qKiBAZmlsZQorICoKKyAqIEdEQiByZW1vdGUgZGVidWdnaW5nCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisjaW5jbHVkZSA8Z2RibWFjaC5oPgorCisvKioKKyAqIEEgdHJhbnNwb3J0IG1lY2hhbmlzbSBmb3IgdGhlIEdEQiBwcm90b2NvbAorICoKKyAqLworc3RydWN0IGdkYl90cmFuc3BvcnQgeworCS8qKiBUcmFuc3BvcnQgbmFtZSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJLyoqCisJICogU2V0IHVwIHRoZSB0cmFuc3BvcnQgZ2l2ZW4gYSBsaXN0IG9mIGFyZ3VtZW50cworCSAqCisJICogQHYgYXJnYyBOdW1iZXIgb2YgYXJndW1lbnRzCisJICogQHYgYXJndiBBcmd1bWVudCBsaXN0CisJICogQHJldCBSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKgorCSAqIE5vdGUgdGhhdCBhcmd1bWVudHMgc3RhcnQgYXQgYXJndlswXS4KKwkgKi8KKwlpbnQgKCAqIGluaXQgKSAoIGludCBhcmdjLCBjaGFyICoqYXJndiApOworCS8qKgorCSAqIFBlcmZvcm0gYSBibG9ja2luZyByZWFkCisJICoKKwkgKiBAdiBidWYgQnVmZmVyCisJICogQHYgbGVuIFNpemUgb2YgYnVmZmVyCisJICogQHJldCBOdW1iZXIgb2YgYnl0ZXMgcmVhZCBpbnRvIGJ1ZmZlcgorCSAqLworCXNpemVfdCAoICogcmVjdiApICggY2hhciAqYnVmLCBzaXplX3QgbGVuICk7CisJLyoqCisJICogV3JpdGUsIG1heSBibG9jaworCSAqCisJICogQHYgYnVmIEJ1ZmZlcgorCSAqIEB2IGxlbiBTaXplIG9mIGJ1ZmZlcgorCSAqLworCXZvaWQgKCAqIHNlbmQgKSAoIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiApOworfTsKKworI2RlZmluZSBHREJfVFJBTlNQT1JUUyBfX3RhYmxlICggc3RydWN0IGdkYl90cmFuc3BvcnQsICJnZGJfdHJhbnNwb3J0cyIgKQorCisjZGVmaW5lIF9fZ2RiX3RyYW5zcG9ydCBfX3RhYmxlX2VudHJ5ICggR0RCX1RSQU5TUE9SVFMsIDAxICkKKworLyoqCisgKiBMb29rIHVwIEdEQiB0cmFuc3BvcnQgYnkgbmFtZQorICoKKyAqIEB2IG5hbWUgTmFtZSBvZiB0cmFuc3BvcnQKKyAqIEByZXQgR0RCIHRyYW5zcG9ydCBvciBOVUxMCisgKi8KK2V4dGVybiBzdHJ1Y3QgZ2RiX3RyYW5zcG9ydCAqZmluZF9nZGJfdHJhbnNwb3J0ICggY29uc3QgY2hhciAqbmFtZSApOworCisvKioKKyAqIEJyZWFrIGludG8gdGhlIGRlYnVnZ2VyIHVzaW5nIHRoZSBnaXZlbiB0cmFuc3BvcnQKKyAqCisgKiBAdiB0cmFucyBHREIgdHJhbnNwb3J0CisgKi8KK2V4dGVybiB2b2lkIGdkYnN0dWJfc3RhcnQgKCBzdHJ1Y3QgZ2RiX3RyYW5zcG9ydCAqdHJhbnMgKTsKKworLyoqCisgKiBJbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqIEBzaWdubyBQT1NJWCBzaWduYWwgbnVtYmVyCisgKiBAcmVncyBDUFUgcmVnaXN0ZXIgc25hcHNob3QKKyAqKi8KK2V4dGVybiB2b2lkIGdkYnN0dWJfaGFuZGxlciAoIGludCBzaWdubywgZ2RicmVnX3QgKnJlZ3MgKTsKKworI2VuZGlmIC8qIF9HUFhFX0dEQlNUVUJfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2dkYnVkcC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2dkYnVkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDJmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvZ2RidWRwLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfR1BYRV9HREJVRFBfSAorI2RlZmluZSBfR1BYRV9HREJVRFBfSAorCisvKiogQGZpbGUKKyAqCisgKiBHREIgcmVtb3RlIGRlYnVnZ2luZyBvdmVyIFVEUAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBzb2NrYWRkcl9pbjsKK3N0cnVjdCBnZGJfdHJhbnNwb3J0OworCisvKioKKyAqIFNldCB1cCB0aGUgVURQIHRyYW5zcG9ydCB3aXRoIG5ldHdvcmsgYWRkcmVzcworICoKKyAqIEBuYW1lIG5ldHdvcmsgZGV2aWNlIG5hbWUKKyAqIEBhZGRyIElQIGFkZHJlc3MgYW5kIFVEUCBsaXN0ZW4gcG9ydCwgbWF5IGJlIE5VTEwgYW5kIGZpZWxkcyBtYXkgYmUgemVybworICogQHJldCB0cmFuc3BvcnQgc3VpdGFibGUgZm9yIHN0YXJ0aW5nIHRoZSBHREIgc3R1YiBvciBOVUxMIG9uIGVycm9yCisgKi8KK3N0cnVjdCBnZGJfdHJhbnNwb3J0ICpnZGJ1ZHBfY29uZmlndXJlICggY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyX2luICphZGRyICk7CisKKyNlbmRpZiAvKiBfR1BYRV9HREJVRFBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2hpZGVtZW0uaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9oaWRlbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiM2ZjMgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9oaWRlbWVtLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfR1BYRV9ISURFTUVNX0gKKyNkZWZpbmUgX0dQWEVfSElERU1FTV9ICisKKy8qKgorICogQGZpbGUKKyAqCisgKiBIaWRkZW4gbWVtb3J5IHJlZ2lvbnMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2V4dGVybiB2b2lkIGhpZGVfdW1hbGxvYyAoIHBoeXNhZGRyX3Qgc3RhcnQsIHBoeXNhZGRyX3QgZW5kICk7CisKKyNlbmRpZiAvKiBfR1BYRV9ISURFTUVNX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9obWFjLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaG1hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMDAxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaG1hYy5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX0dQWEVfSE1BQ19ICisjZGVmaW5lIF9HUFhFX0hNQUNfSAorCisvKiogQGZpbGUKKyAqCisgKiBLZXllZC1IYXNoaW5nIGZvciBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9jcnlwdG8uaD4KKworLyoqCisgKiBVcGRhdGUgSE1BQworICoKKyAqIEB2IGRpZ2VzdAkJRGlnZXN0IGFsZ29yaXRobSB0byB1c2UKKyAqIEB2IGRpZ2VzdF9jdHgJRGlnZXN0IGNvbnRleHQKKyAqIEB2IGRhdGEJCURhdGEKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhtYWNfdXBkYXRlICggc3RydWN0IGRpZ2VzdF9hbGdvcml0aG0gKmRpZ2VzdCwKKwkJCQkgdm9pZCAqZGlnZXN0X2N0eCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgc2l6ZV90IGxlbiApIHsKKwlkaWdlc3RfdXBkYXRlICggZGlnZXN0LCBkaWdlc3RfY3R4LCBkYXRhLCBsZW4gKTsKK30KKworZXh0ZXJuIHZvaWQgaG1hY19pbml0ICggc3RydWN0IGRpZ2VzdF9hbGdvcml0aG0gKmRpZ2VzdCwgdm9pZCAqZGlnZXN0X2N0eCwKKwkJCXZvaWQgKmtleSwgc2l6ZV90ICprZXlfbGVuICk7CitleHRlcm4gdm9pZCBobWFjX2ZpbmFsICggc3RydWN0IGRpZ2VzdF9hbGdvcml0aG0gKmRpZ2VzdCwgdm9pZCAqZGlnZXN0X2N0eCwKKwkJCSB2b2lkICprZXksIHNpemVfdCAqa2V5X2xlbiwgdm9pZCAqaG1hYyApOworCisjZW5kaWYgLyogX0dQWEVfSE1BQ19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaHR0cC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2h0dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWE2ZDgzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2h0dHAuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9HUFhFX0hUVFBfSAorI2RlZmluZSBfR1BYRV9IVFRQX0gKKworLyoqIEBmaWxlCisgKgorICogSHlwZXIgVGV4dCBUcmFuc3BvcnQgUHJvdG9jb2wKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogSFRUUCBkZWZhdWx0IHBvcnQgKi8KKyNkZWZpbmUgSFRUUF9QT1JUIDgwCisKKy8qKiBIVFRQUyBkZWZhdWx0IHBvcnQgKi8KKyNkZWZpbmUgSFRUUFNfUE9SVCA0NDMKKworZXh0ZXJuIGludCBodHRwX29wZW5fZmlsdGVyICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBzdHJ1Y3QgdXJpICp1cmksCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9wb3J0LAorCQkJICAgICAgaW50ICggKiBmaWx0ZXIgKSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqLAorCQkJCQkJIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqKiApICk7CisKKyNlbmRpZiAvKiBfR1BYRV9IVFRQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pMmMuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2I4OWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2kyYy5oCkBAIC0wLDAgKzEsMTcxIEBACisjaWZuZGVmIF9HUFhFX0kyQ19ICisjZGVmaW5lIF9HUFhFX0kyQ19ICisKKy8qKiBAZmlsZQorICoKKyAqIEkyQyBpbnRlcmZhY2UKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9iaXRiYXNoLmg+CisKKy8qKiBBbiBJMkMgZGV2aWNlCisgKgorICogQW4gSTJDIGRldmljZSByZXByZXNlbnRzIGEgc3BlY2lmaWMgc2xhdmUgZGV2aWNlIG9uIGFuIEkyQyBidXMuICBJdAorICogaXMgYWNjZXNzZWQgdmlhIGFuIEkyQyBpbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBpMmNfZGV2aWNlIHsKKwkvKiogQWRkcmVzcyBvZiB0aGlzIGRldmljZQorCSAqCisJICogVGhlIGFjdHVhbCBhZGRyZXNzIHNlbnQgb24gdGhlIGJ1cyB3aWxsIGxvb2sgbGlrZQorCSAqCisJICogICAgPHN0YXJ0PiA8ZGV2aWNlIGFkZHJlc3M+IDx3b3JkIGFkZHJlc3Mgb3ZlcmZsb3c+IDxyL3c+CisJICoKKwkgKiBUaGUgIndvcmQgYWRkcmVzcyBvdmVyZmxvdyIgaXMgYW55IGV4Y2VzcyBiaXRzIGZyb20gdGhlCisJICogd29yZCBhZGRyZXNzLCBpLmUuIGFueSBwb3J0aW9uIHRoYXQgZG9lcyBub3QgZml0IHdpdGhpbiB0aGUKKwkgKiBkZWZpbmVkIHdvcmQgYWRkcmVzcyBsZW5ndGguCisJICovCisJdW5zaWduZWQgaW50IGRldl9hZGRyOworCS8qKiBEZXZpY2UgYWRkcmVzcyBsZW5ndGgsIGluIGJ5dGVzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb21wcmlzZSB0aGUgZGV2aWNlCisJICogYWRkcmVzcywgZGVmaW5lZCB0byBiZSB0aGUgcG9ydGlvbiB0aGF0IHRlcm1pbmF0ZXMgd2l0aCB0aGUKKwkgKiByZWFkL3dyaXRlIGJpdC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgZGV2X2FkZHJfbGVuOworCS8qKiBXb3JkIGFkZGRyZXNzIGxlbmd0aCwgaW4gYnl0ZXMKKwkgKgorCSAqIFRoaXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNvbXByaXNlIHRoZSB3b3JkIGFkZHJlc3MsCisJICogZGVmaW5lZCB0byBiZSB0aGUgcG9ydGlvbiB0aGF0IHN0YXJ0cyBhZnRlciB0aGUgcmVhZC93cml0ZQorCSAqIGJpdCBhbmQgZW5kcyBiZWZvcmUgdGhlIGZpcnN0IGRhdGEgYnl0ZS4KKwkgKgorCSAqIEZvciBzb21lIGRldmljZXMsIHRoaXMgbGVuZ3RoIHdpbGwgYmUgemVybyAoaS5lLiB0aGUgd29yZAorCSAqIGFkZHJlc3MgaXMgY29udGFpbmVkIGVudGlyZWx5IHdpdGhpbiB0aGUgIndvcmQgYWRkcmVzcworCSAqIG92ZXJmbG93IikuCisJICovCisJdW5zaWduZWQgaW50IHdvcmRfYWRkcl9sZW47Cit9OworCisvKiogQW4gSTJDIGludGVyZmFjZQorICoKKyAqIEFuIEkyQyBpbnRlcmZhY2UgcHJvdmlkZXMgYWNjZXNzIHRvIGFuIEkyQyBidXMsIHZpYSB3aGljaCBJMkMKKyAqIGRldmljZXMgbWF5IGJlIHJlYWNoZWQuCisgKi8KK3N0cnVjdCBpMmNfaW50ZXJmYWNlIHsKKwkvKioKKwkgKiBSZWFkIGRhdGEgZnJvbSBJMkMgZGV2aWNlCisJICoKKwkgKiBAdiBpMmMJCUkyQyBpbnRlcmZhY2UKKwkgKiBAdiBpMmNkZXYJCUkyQyBkZXZpY2UKKwkgKiBAdiBvZmZzZXQJCVN0YXJ0aW5nIG9mZnNldCB3aXRoaW4gdGhlIGRldmljZQorCSAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisJICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIHJlYWQgKSAoIHN0cnVjdCBpMmNfaW50ZXJmYWNlICppMmMsIHN0cnVjdCBpMmNfZGV2aWNlICppMmNkZXYsCisJCQkgdW5zaWduZWQgaW50IG9mZnNldCwgdWludDhfdCAqZGF0YSwKKwkJCSB1bnNpZ25lZCBpbnQgbGVuICk7CisJLyoqCisJICogV3JpdGUgZGF0YSB0byBJMkMgZGV2aWNlCisJICoKKwkgKiBAdiBpMmMJCUkyQyBpbnRlcmZhY2UKKwkgKiBAdiBpMmNkZXYJCUkyQyBkZXZpY2UKKwkgKiBAdiBvZmZzZXQJCVN0YXJ0aW5nIG9mZnNldCB3aXRoaW4gdGhlIGRldmljZQorCSAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisJICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIHdyaXRlICkgKCBzdHJ1Y3QgaTJjX2ludGVyZmFjZSAqaTJjLCBzdHJ1Y3QgaTJjX2RldmljZSAqaTJjZGV2LAorCQkJICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBjb25zdCB1aW50OF90ICpkYXRhLAorCQkJICB1bnNpZ25lZCBpbnQgbGVuICk7Cit9OworCisvKiogQSBiaXQtYmFzaGluZyBJMkMgaW50ZXJmYWNlCisgKgorICogVGhpcyBwcm92aWRlcyBhIHN0YW5kYXJkaXNlZCB3YXkgdG8gY29uc3RydWN0IEkyQyBidXNlcyB2aWEgYQorICogYml0LWJhc2hpbmcgaW50ZXJmYWNlLgorICovCitzdHJ1Y3QgaTJjX2JpdF9iYXNoZXIgeworCS8qKiBJMkMgaW50ZXJmYWNlICovCisJc3RydWN0IGkyY19pbnRlcmZhY2UgaTJjOworCS8qKiBCaXQtYmFzaGluZyBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgYml0X2Jhc2hlciBiYXNoZXI7Cit9OworCisvKiogVGVuLWJpdCBhZGRyZXNzIG1hcmtlcgorICoKKyAqIFRoaXMgdmFsdWUgaXMgT1JlZCB3aXRoIHRoZSBJMkMgZGV2aWNlIGFkZHJlc3MgdG8gaW5kaWNhdGUgYQorICogdGVuLWJpdCBhZGRyZXNzIGZvcm1hdCBvbiB0aGUgYnVzLgorICovCisjZGVmaW5lIEkyQ19URU5CSVRfQUREUkVTUyAweDc4MDAKKworLyoqIEFuIEkyQyB3cml0ZSBjb21tYW5kICovCisjZGVmaW5lIEkyQ19XUklURSAwCisKKy8qKiBBbiBJMkMgcmVhZCBjb21tYW5kICovCisjZGVmaW5lIEkyQ19SRUFEIDEKKworLyoqIEJpdCBpbmRpY2VzIHVzZWQgZm9yIEkyQyBiaXQtYmFzaGluZyBpbnRlcmZhY2UgKi8KK2VudW0geworCS8qKiBTZXJpYWwgY2xvY2sgKi8KKwlJMkNfQklUX1NDTCA9IDAsCisJLyoqIFNlcmlhbCBkYXRhICovCisJSTJDX0JJVF9TREEsCit9OworCisvKiogRGVsYXkgcmVxdWlyZWQgZm9yIGJpdC1iYXNoaW5nIG9wZXJhdGlvbiAqLworI2RlZmluZSBJMkNfVURFTEFZIDUKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIGN5Y2xlcyB0byB1c2Ugd2hlbiBhdHRlbXB0aW5nIGEgYnVzIHJlc2V0ICovCisjZGVmaW5lIEkyQ19SRVNFVF9NQVhfQ1lDTEVTIDMyCisKKy8qKgorICogQ2hlY2sgcHJlc2VuY2Ugb2YgSTJDIGRldmljZQorICoKKyAqIEB2IGkyYwkJSTJDIGludGVyZmFjZQorICogQHYgaTJjZGV2CQlJMkMgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgZGV2aWNlIG9uIHRoZSBJMkMgYnVzIGJ5IGF0dGVtcHRpbmcKKyAqIGEgemVyby1sZW5ndGggd3JpdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGkyY19jaGVja19wcmVzZW5jZSAoIHN0cnVjdCBpMmNfaW50ZXJmYWNlICppMmMsCisJCQkJICAgICAgIHN0cnVjdCBpMmNfZGV2aWNlICppMmNkZXYgKSB7CisJcmV0dXJuIGkyYy0+d3JpdGUgKCBpMmMsIGkyY2RldiwgMCwgTlVMTCwgMCApOworfQorCitleHRlcm4gaW50IGluaXRfaTJjX2JpdF9iYXNoZXIgKCBzdHJ1Y3QgaTJjX2JpdF9iYXNoZXIgKmkyY2JpdCwKKwkJCQkgc3RydWN0IGJpdF9iYXNoZXJfb3BlcmF0aW9ucyAqYmFzaF9vcCApOworCisvKioKKyAqIEluaXRpYWxpc2UgZ2VuZXJpYyBJMkMgRUVQUk9NIGRldmljZQorICoKKyAqIEB2IGkyY2RldgkJSTJDIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitpbml0X2kyY19lZXByb20gKCBzdHJ1Y3QgaTJjX2RldmljZSAqaTJjZGV2LCB1bnNpZ25lZCBpbnQgZGV2X2FkZHIgKSB7CisJaTJjZGV2LT5kZXZfYWRkciA9IGRldl9hZGRyOworCWkyY2Rldi0+ZGV2X2FkZHJfbGVuID0gMTsKKwlpMmNkZXYtPndvcmRfYWRkcl9sZW4gPSAxOworfQorCisvKioKKyAqIEluaXRpYWxpc2UgQXRtZWwgQVQyNEMxMQorICoKKyAqIEB2IGkyY2RldgkJSTJDIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitpbml0X2F0MjRjMTEgKCBzdHJ1Y3QgaTJjX2RldmljZSAqaTJjZGV2ICkgeworCS8qIFRoaXMgY2hpcCBoYXMgbm8gZGV2aWNlIGFkZHJlc3M7IGl0IG11c3QgYmUgdGhlIG9ubHkgY2hpcAorCSAqIG9uIHRoZSBidXMuICBUaGUgd29yZCBhZGRyZXNzIGlzIGNvbnRhaW5lZCBlbnRpcmVseSB3aXRoaW4KKwkgKiB0aGUgZGV2aWNlIGFkZHJlc3MgZmllbGQuCisJICovCisJaTJjZGV2LT5kZXZfYWRkciA9IDA7CisJaTJjZGV2LT5kZXZfYWRkcl9sZW4gPSAxOworCWkyY2Rldi0+d29yZF9hZGRyX2xlbiA9IDA7Cit9CisKKyNlbmRpZiAvKiBfR1BYRV9JMkNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX2NtLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBmZmZkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX2NtLmgKQEAgLTAsMCArMSw3MiBAQAorI2lmbmRlZiBfR1BYRV9JQl9DTV9ICisjZGVmaW5lIF9HUFhFX0lCX0NNX0gKKworLyoqIEBmaWxlCisgKgorICogSW5maW5pYmFuZCBjb21tdW5pY2F0aW9uIG1hbmFnZW1lbnQKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9pbmZpbmliYW5kLmg+CisjaW5jbHVkZSA8Z3B4ZS9yZXRyeS5oPgorCitzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uOworc3RydWN0IGliX2Nvbm5lY3Rpb247CisKKy8qKiBJbmZpbmliYW5kIGNvbm5lY3Rpb24gb3BlcmF0aW9ucyAqLworc3RydWN0IGliX2Nvbm5lY3Rpb25fb3BlcmF0aW9ucyB7CisJLyoqIEhhbmRsZSBjaGFuZ2Ugb2YgY29ubmVjdGlvbiBzdGF0dXMKKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IHFwCQlRdWV1ZSBwYWlyCisJICogQHYgY29ubgkJQ29ubmVjdGlvbgorCSAqIEB2IHJjCQlDb25uZWN0aW9uIHN0YXR1cyBjb2RlCisJICogQHYgcHJpdmF0ZV9kYXRhCVByaXZhdGUgZGF0YSwgaWYgYXZhaWxhYmxlCisJICogQHYgcHJpdmF0ZV9kYXRhX2xlbglMZW5ndGggb2YgcHJpdmF0ZSBkYXRhCisJICovCisJdm9pZCAoICogY2hhbmdlZCApICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCSAgICAgc3RydWN0IGliX2Nvbm5lY3Rpb24gKmNvbm4sIGludCByYywKKwkJCSAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhLCBzaXplX3QgcHJpdmF0ZV9kYXRhX2xlbiApOworfTsKKworLyoqIEFuIEluZmluaWJhbmQgY29ubmVjdGlvbiAqLworc3RydWN0IGliX2Nvbm5lY3Rpb24geworCS8qKiBJbmZpbmliYW5kIGRldmljZSAqLworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OworCS8qKiBRdWV1ZSBwYWlyICovCisJc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwOworCS8qKiBMb2NhbCBjb21tdW5pY2F0aW9uIElEICovCisJdWludDMyX3QgbG9jYWxfaWQ7CisJLyoqIFJlbW90ZSBjb21tdW5pY2F0aW9uIElEICovCisJdWludDMyX3QgcmVtb3RlX2lkOworCS8qKiBUYXJnZXQgc2VydmljZSBJRCAqLworCXN0cnVjdCBpYl9naWRfaGFsZiBzZXJ2aWNlX2lkOworCS8qKiBDb25uZWN0aW9uIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgaWJfY29ubmVjdGlvbl9vcGVyYXRpb25zICpvcDsKKworCS8qKiBMaXN0IG9mIGNvbm5lY3Rpb25zICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLyoqIFBhdGggdG8gdGFyZ2V0ICovCisJc3RydWN0IGliX3BhdGggKnBhdGg7CisJLyoqIENvbm5lY3Rpb24gcmVxdWVzdCBtYW5hZ2VtZW50IHRyYW5zYWN0aW9uICovCisJc3RydWN0IGliX21hZF90cmFuc2FjdGlvbiAqbWFkeDsKKworCS8qKiBMZW5ndGggb2YgY29ubmVjdGlvbiByZXF1ZXN0IHByaXZhdGUgZGF0YSAqLworCXNpemVfdCBwcml2YXRlX2RhdGFfbGVuOworCS8qKiBDb25uZWN0aW9uIHJlcXVlc3QgcHJpdmF0ZSBkYXRhICovCisJdWludDhfdCBwcml2YXRlX2RhdGFbMF07Cit9OworCitleHRlcm4gc3RydWN0IGliX2Nvbm5lY3Rpb24gKgoraWJfY3JlYXRlX2Nvbm4gKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkgc3RydWN0IGliX2dpZCAqZGdpZCwgc3RydWN0IGliX2dpZF9oYWxmICpzZXJ2aWNlX2lkLAorCQkgdm9pZCAqcmVxX3ByaXZhdGVfZGF0YSwgc2l6ZV90IHJlcV9wcml2YXRlX2RhdGFfbGVuLAorCQkgc3RydWN0IGliX2Nvbm5lY3Rpb25fb3BlcmF0aW9ucyAqb3AgKTsKK2V4dGVybiB2b2lkIGliX2Rlc3Ryb3lfY29ubiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJICAgICAgc3RydWN0IGliX2Nvbm5lY3Rpb24gKmNvbm4gKTsKKworI2VuZGlmIC8qIF9HUFhFX0lCX0NNX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pYl9jbXJjLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfY21yYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYTc0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfY21yYy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0dQWEVfSUJfQ01SQ19ICisjZGVmaW5lIF9HUFhFX0lCX0NNUkNfSAorCisvKiogQGZpbGUKKyAqCisgKiBJbmZpbmliYW5kIENvbW11bmljYXRpb24tbWFuYWdlZCBSZWxpYWJsZSBDb25uZWN0aW9ucworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBCU0QyICk7CisKKyNpbmNsdWRlIDxncHhlL2luZmluaWJhbmQuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKworZXh0ZXJuIGludCBpYl9jbXJjX29wZW4gKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkgIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICBzdHJ1Y3QgaWJfZ2lkICpkZ2lkLAorCQkJICBzdHJ1Y3QgaWJfZ2lkX2hhbGYgKnNlcnZpY2VfaWQgKTsKKworI2VuZGlmIC8qIF9HUFhFX0lCX0NNUkNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX21hZC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX21hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDk3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfbWFkLmgKQEAgLTAsMCArMSw1NjEgQEAKKyNpZm5kZWYgX0dQWEVfSUJfTUFEX0gKKyNkZWZpbmUgX0dQWEVfSUJfTUFEX0gKKworLyoqIEBmaWxlCisgKgorICogSW5maW5pYmFuZCBtYW5hZ2VtZW50IGRhdGFncmFtcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL2liX3BhY2tldC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdWJuZXQgbWFuYWdlbWVudCBNQURzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIEEgc3VibmV0IG1hbmFnZW1lbnQgaGVhZGVyCisgKgorICogRGVmaW5lZCBpbiBzZWN0aW9ucyAxNC4yLjEuMSBhbmQgMTQuMi4xLjIgb2YgdGhlIElCQS4KKyAqLworc3RydWN0IGliX3NtcF9oZHIgeworCXVpbnQ2NF90IG1rZXk7CisJdWludDE2X3Qgc2xpZDsKKwl1aW50MTZfdCBkbGlkOworCXVpbnQ4X3QgcmVzZXJ2ZWRbMjhdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFN1Ym5ldCBtYW5hZ2VtZW50IGNsYXNzIHZlcnNpb24gKi8KKyNkZWZpbmUgSUJfU01QX0NMQVNTX1ZFUlNJT04JCQkxCisKKy8qKiBTdWJuZXQgbWFuYWdlbWVudCBkaXJlY3Rpb24gYml0CisgKgorICogVGhpcyBiaXQgcmVzaWRlcyBpbiB0aGUgInN0YXR1cyIgZmllbGQgaW4gdGhlIE1BRCBoZWFkZXIuCisgKi8KKyNkZWZpbmUgSUJfU01QX1NUQVRVU19EX0lOQk9VTkQJCQkweDgwMDAKKworLyogU3VibmV0IG1hbmFnZW1lbnQgYXR0cmlidXRlcyAqLworI2RlZmluZSBJQl9TTVBfQVRUUl9OT1RJQ0UJCQkweDAwMDIKKyNkZWZpbmUgSUJfU01QX0FUVFJfTk9ERV9ERVNDCQkJMHgwMDEwCisjZGVmaW5lIElCX1NNUF9BVFRSX05PREVfSU5GTwkJCTB4MDAxMQorI2RlZmluZSBJQl9TTVBfQVRUUl9TV0lUQ0hfSU5GTwkJCTB4MDAxMgorI2RlZmluZSBJQl9TTVBfQVRUUl9HVUlEX0lORk8JCQkweDAwMTQKKyNkZWZpbmUgSUJfU01QX0FUVFJfUE9SVF9JTkZPCQkJMHgwMDE1CisjZGVmaW5lIElCX1NNUF9BVFRSX1BLRVlfVEFCTEUJCQkweDAwMTYKKyNkZWZpbmUgSUJfU01QX0FUVFJfU0xfVE9fVkxfVEFCTEUJCTB4MDAxNworI2RlZmluZSBJQl9TTVBfQVRUUl9WTF9BUkJfVEFCTEUJCTB4MDAxOAorI2RlZmluZSBJQl9TTVBfQVRUUl9MSU5FQVJfRk9SV0FSRF9UQUJMRQkweDAwMTkKKyNkZWZpbmUgSUJfU01QX0FUVFJfUkFORE9NX0ZPUldBUkRfVEFCTEUJMHgwMDFBCisjZGVmaW5lIElCX1NNUF9BVFRSX01DQVNUX0ZPUldBUkRfVEFCTEUJCTB4MDAxQgorI2RlZmluZSBJQl9TTVBfQVRUUl9TTV9JTkZPCQkJMHgwMDIwCisjZGVmaW5lIElCX1NNUF9BVFRSX1ZFTkRPUl9ESUFHCQkJMHgwMDMwCisjZGVmaW5lIElCX1NNUF9BVFRSX0xFRF9JTkZPCQkJMHgwMDMxCisjZGVmaW5lIElCX1NNUF9BVFRSX1ZFTkRPUl9NQVNLCQkJMHhGRjAwCisKKy8qKgorICogQSBOb2RlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQorICoKKyAqIERlZmluZWQgaW4gc2VjdGlvbiAxNC4yLjUuMiBvZiB0aGUgSUJBCisgKi8KK3N0cnVjdCBpYl9ub2RlX2Rlc2MgeworCWNoYXIgbm9kZV9zdHJpbmdbNjRdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgTm9kZSBJbmZvcm1hdGlvbiBhdHRyaWJ1dGUKKyAqCisgKiBEZWZpbmVkIGluIHNlY3Rpb24gMTQuMi41LjMgb2YgdGhlIElCQS4KKyAqLworc3RydWN0IGliX25vZGVfaW5mbyB7CisJdWludDhfdCBiYXNlX3ZlcnNpb247CisJdWludDhfdCBjbGFzc192ZXJzaW9uOworCXVpbnQ4X3Qgbm9kZV90eXBlOworCXVpbnQ4X3QgbnVtX3BvcnRzOworCXN0cnVjdCBpYl9naWRfaGFsZiBzeXNfZ3VpZDsKKwlzdHJ1Y3QgaWJfZ2lkX2hhbGYgbm9kZV9ndWlkOworCXN0cnVjdCBpYl9naWRfaGFsZiBwb3J0X2d1aWQ7CisJdWludDE2X3QgcGFydGl0aW9uX2NhcDsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdWludDMyX3QgcmV2aXNpb247CisJdWludDhfdCBsb2NhbF9wb3J0X251bTsKKwl1aW50OF90IHZlbmRvcl9pZFszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIElCX05PREVfVFlQRV9IQ0EJCTB4MDEKKyNkZWZpbmUgSUJfTk9ERV9UWVBFX1NXSVRDSAkJMHgwMgorI2RlZmluZSBJQl9OT0RFX1RZUEVfUk9VVEVSCQkweDAzCisKKy8qKiBBIEdVSUQgSW5mb3JtYXRpb24gYXR0cmlidXRlCisgKgorICogRGVmaW5lZCBpbiBzZWN0aW9uIDE0LjIuNS41IG9mIHRoZSBJQkEuCisgKi8KK3N0cnVjdCBpYl9ndWlkX2luZm8geworCXVpbnQ4X3QgZ3VpZFs4XVs4XTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBIFBvcnQgSW5mb3JtYXRpb24gYXR0cmlidXRlCisgKgorICogRGVmaW5lZCBpbiBzZWN0aW9uIDE0LjIuNS42IG9mIHRoZSBJQkEuCisgKi8KK3N0cnVjdCBpYl9wb3J0X2luZm8geworCXVpbnQ2NF90IG1rZXk7CisJdWludDhfdCBnaWRfcHJlZml4WzhdOworCXVpbnQxNl90IGxpZDsKKwl1aW50MTZfdCBtYXN0ZXJzbV9saWQ7CisJdWludDMyX3QgY2FwX21hc2s7CisJdWludDE2X3QgZGlhZ19jb2RlOworCXVpbnQxNl90IG1rZXlfbGVhc2VfcGVyaW9kOworCXVpbnQ4X3QgbG9jYWxfcG9ydF9udW07CisJdWludDhfdCBsaW5rX3dpZHRoX2VuYWJsZWQ7CisJdWludDhfdCBsaW5rX3dpZHRoX3N1cHBvcnRlZDsKKwl1aW50OF90IGxpbmtfd2lkdGhfYWN0aXZlOworCXVpbnQ4X3QgbGlua19zcGVlZF9zdXBwb3J0ZWRfX3BvcnRfc3RhdGU7CisJdWludDhfdCBwb3J0X3BoeXNfc3RhdGVfX2xpbmtfZG93bl9kZWZfc3RhdGU7CisJdWludDhfdCBta2V5X3Byb3RfYml0c19fbG1jOworCXVpbnQ4X3QgbGlua19zcGVlZF9hY3RpdmVfX2xpbmtfc3BlZWRfZW5hYmxlZDsKKwl1aW50OF90IG5laWdoYm91cl9tdHVfX21hc3RlcnNtX3NsOworCXVpbnQ4X3QgdmxfY2FwX19pbml0X3R5cGU7CisJdWludDhfdCB2bF9oaWdoX2xpbWl0OworCXVpbnQ4X3QgdmxfYXJiaXRyYXRpb25faGlnaF9jYXA7CisJdWludDhfdCB2bF9hcmJpdHJhdGlvbl9sb3dfY2FwOworCXVpbnQ4X3QgaW5pdF90eXBlX3JlcGx5X19tdHVfY2FwOworCXVpbnQ4X3Qgdmxfc3RhbGxfY291bnRfX2hvcV9saWZlOworCXVpbnQ4X3Qgb3BlcmF0aW9uYWxfdmxzX19lbmZvcmNlbWVudDsKKwl1aW50MTZfdCBta2V5X3Zpb2xhdGlvbnM7CisJdWludDE2X3QgcGtleV92aW9sYXRpb25zOworCXVpbnQxNl90IHFrZXlfdmlvbGF0aW9uczsKKwl1aW50OF90IGd1aWRfY2FwOworCXVpbnQ4X3QgY2xpZW50X3JlcmVnaXN0ZXJfX3N1Ym5ldF90aW1lb3V0OworCXVpbnQ4X3QgcmVzcF90aW1lX3ZhbHVlOworCXVpbnQ4X3QgbG9jYWxfcGh5X2Vycm9yc19fb3ZlcnJ1bl9lcnJvcnM7CisJdWludDE2X3QgbWF4X2NyZWRpdF9oaW50OworCXVpbnQzMl90IGxpbmtfcm91bmRfdHJpcF9sYXRlbmN5OworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworI2RlZmluZSBJQl9MSU5LX1dJRFRIXzFYCQkweDAxCisjZGVmaW5lIElCX0xJTktfV0lEVEhfNFgJCTB4MDIKKyNkZWZpbmUgSUJfTElOS19XSURUSF84WAkJMHgwNAorI2RlZmluZSBJQl9MSU5LX1dJRFRIXzEyWAkJMHgwOAorCisjZGVmaW5lIElCX0xJTktfU1BFRURfU0RSCQkweDAxCisjZGVmaW5lIElCX0xJTktfU1BFRURfRERSCQkweDAyCisjZGVmaW5lIElCX0xJTktfU1BFRURfUURSCQkweDA0CisKKyNkZWZpbmUgSUJfUE9SVF9TVEFURV9ET1dOCQkweDAxCisjZGVmaW5lIElCX1BPUlRfU1RBVEVfSU5JVAkJMHgwMgorI2RlZmluZSBJQl9QT1JUX1NUQVRFX0FSTUVECQkweDAzCisjZGVmaW5lIElCX1BPUlRfU1RBVEVfQUNUSVZFCQkweDA0CisKKyNkZWZpbmUgSUJfUE9SVF9QSFlTX1NUQVRFX1NMRUVQCTB4MDEKKyNkZWZpbmUgSUJfUE9SVF9QSFlTX1NUQVRFX1BPTExJTkcJMHgwMgorCisjZGVmaW5lIElCX01UVV8yNTYJCQkweDAxCisjZGVmaW5lIElCX01UVV81MTIJCQkweDAyCisjZGVmaW5lIElCX01UVV8xMDI0CQkJMHgwMworI2RlZmluZSBJQl9NVFVfMjA0OAkJCTB4MDQKKyNkZWZpbmUgSUJfTVRVXzQwOTYJCQkweDA1CisKKyNkZWZpbmUgSUJfVkxfMAkJCQkweDAxCisjZGVmaW5lIElCX1ZMXzBfMQkJCTB4MDIKKyNkZWZpbmUgSUJfVkxfMF8zCQkJMHgwMworI2RlZmluZSBJQl9WTF8wXzcJCQkweDA0CisjZGVmaW5lIElCX1ZMXzBfMTQJCQkweDA1CisKKy8qKiBBIFBhcnRpdGlvbiBLZXkgVGFibGUgYXR0cmlidXRlCisgKgorICogRGVmaW5lZCBpbiBzZWN0aW9uIDE0LjIuNS43IG9mIHRoZSBJQkEuCisgKi8KK3N0cnVjdCBpYl9wa2V5X3RhYmxlIHsKKwl1aW50MTZfdCBwa2V5WzMyXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBIHN1Ym5ldCBtYW5hZ2VtZW50IGF0dHJpYnV0ZSAqLwordW5pb24gaWJfc21wX2RhdGEgeworCXN0cnVjdCBpYl9ub2RlX2Rlc2Mgbm9kZV9kZXNjOworCXN0cnVjdCBpYl9ub2RlX2luZm8gbm9kZV9pbmZvOworCXN0cnVjdCBpYl9ndWlkX2luZm8gZ3VpZF9pbmZvOworCXN0cnVjdCBpYl9wb3J0X2luZm8gcG9ydF9pbmZvOworCXN0cnVjdCBpYl9wa2V5X3RhYmxlIHBrZXlfdGFibGU7CisJdWludDhfdCBieXRlc1s2NF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBzdWJuZXQgbWFuYWdlbWVudCBkaXJlY3RlZCByb3V0ZSBwYXRoICovCitzdHJ1Y3QgaWJfc21wX2RyX3BhdGggeworCXVpbnQ4X3QgaG9wc1s2NF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogU3VibmV0IG1hbmFnZW1lbnQgTUFEIGNsYXNzLXNwZWNpZmljIGRhdGEgKi8KK3N0cnVjdCBpYl9zbXBfY2xhc3Nfc3BlY2lmaWMgeworCXVpbnQ4X3QgaG9wX3BvaW50ZXI7CisJdWludDhfdCBob3BfY291bnQ7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdWJuZXQgYWRtaW5pc3RyYXRpb24gTUFEcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNkZWZpbmUgSUJfU0FfQ0xBU1NfVkVSU0lPTgkJCTIKKworI2RlZmluZSBJQl9TQV9NRVRIT0RfREVMRVRFX1JFU1AJCTB4OTUKKworc3RydWN0IGliX3JtcHBfaGRyIHsKKwl1aW50MzJfdCByYXdbM107Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCitzdHJ1Y3QgaWJfc2FfaGRyIHsKKwl1aW50MzJfdCBzbV9rZXlbMl07CisJdWludDE2X3QgcmVzZXJ2ZWQ7CisJdWludDE2X3QgYXR0cmliX29mZnNldDsKKwl1aW50MzJfdCBjb21wX21hc2tbMl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisjZGVmaW5lIElCX1NBX0FUVFJfTUNfTUVNQkVSX1JFQwkJMHgzOAorI2RlZmluZSBJQl9TQV9BVFRSX1BBVEhfUkVDCQkJMHgzNQorCitzdHJ1Y3QgaWJfcGF0aF9yZWNvcmQgeworCXVpbnQzMl90IHJlc2VydmVkMFsyXTsKKwlzdHJ1Y3QgaWJfZ2lkIGRnaWQ7CisJc3RydWN0IGliX2dpZCBzZ2lkOworCXVpbnQxNl90IGRsaWQ7CisJdWludDE2X3Qgc2xpZDsKKwl1aW50MzJfdCBob3BfbGltaXRfX2Zsb3dfbGFiZWxfX3Jhd190cmFmZmljOworCXVpbnQzMl90IHBrZXlfX251bWJfcGF0aF9fcmV2ZXJzaWJsZV9fdGNsYXNzOworCXVpbnQ4X3QgcmVzZXJ2ZWQxOworCXVpbnQ4X3QgcmVzZXJ2ZWRfX3NsOworCXVpbnQ4X3QgbXR1X3NlbGVjdG9yX19tdHU7CisJdWludDhfdCByYXRlX3NlbGVjdG9yX19yYXRlOworCXVpbnQzMl90IHByZWZlcmVuY2VfX3BhY2tldF9saWZldGltZV9fcGFja2V0X2xpZmV0aW1lX3NlbGVjdG9yOworCXVpbnQzMl90IHJlc2VydmVkMlszNV07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisjZGVmaW5lIElCX1NBX1BBVEhfUkVDX0RHSUQJCQkoMTw8MikKKyNkZWZpbmUgSUJfU0FfUEFUSF9SRUNfU0dJRAkJCSgxPDwzKQorCitzdHJ1Y3QgaWJfbWNfbWVtYmVyX3JlY29yZCB7CisJc3RydWN0IGliX2dpZCBtZ2lkOworCXN0cnVjdCBpYl9naWQgcG9ydF9naWQ7CisJdWludDMyX3QgcWtleTsKKwl1aW50MTZfdCBtbGlkOworCXVpbnQ4X3QgbXR1X3NlbGVjdG9yX19tdHU7CisJdWludDhfdCB0Y2xhc3M7CisJdWludDE2X3QgcGtleTsKKwl1aW50OF90IHJhdGVfc2VsZWN0b3JfX3JhdGU7CisJdWludDhfdCBwYWNrZXRfbGlmZXRpbWVfc2VsZWN0b3JfX3BhY2tldF9saWZldGltZTsKKwl1aW50MzJfdCBzbF9fZmxvd19sYWJlbF9faG9wX2xpbWl0OworCXVpbnQ4X3Qgc2NvcGVfX2pvaW5fc3RhdGU7CisJdWludDhfdCBwcm94eV9qb2luX19yZXNlcnZlZDsKKwl1aW50MTZfdCByZXNlcnZlZDA7CisJdWludDMyX3QgcmVzZXJ2ZWQxWzM3XTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKyNkZWZpbmUgSUJfU0FfTUNNRU1CRVJfUkVDX01HSUQJCQkoMTw8MCkKKyNkZWZpbmUgSUJfU0FfTUNNRU1CRVJfUkVDX1BPUlRfR0lECQkoMTw8MSkKKyNkZWZpbmUgSUJfU0FfTUNNRU1CRVJfUkVDX1FLRVkJCQkoMTw8MikKKyNkZWZpbmUgSUJfU0FfTUNNRU1CRVJfUkVDX01MSUQJCQkoMTw8MykKKyNkZWZpbmUgSUJfU0FfTUNNRU1CRVJfUkVDX01UVV9TRUxFQ1RPUgkJKDE8PDQpCisjZGVmaW5lIElCX1NBX01DTUVNQkVSX1JFQ19NVFUJCQkoMTw8NSkKKyNkZWZpbmUgSUJfU0FfTUNNRU1CRVJfUkVDX1RSQUZGSUNfQ0xBU1MJKDE8PDYpCisjZGVmaW5lIElCX1NBX01DTUVNQkVSX1JFQ19QS0VZCQkJKDE8PDcpCisjZGVmaW5lIElCX1NBX01DTUVNQkVSX1JFQ19SQVRFX1NFTEVDVE9SCSgxPDw4KQorI2RlZmluZSBJQl9TQV9NQ01FTUJFUl9SRUNfUkFURQkJCSgxPDw5KQorI2RlZmluZSBJQl9TQV9NQ01FTUJFUl9SRUNfUEFDS0VUX0xJRkVfVElNRV9TRUxFQ1RPUgkoMTw8MTApCisjZGVmaW5lIElCX1NBX01DTUVNQkVSX1JFQ19QQUNLRVRfTElGRV9USU1FCSgxPDwxMSkKKyNkZWZpbmUgSUJfU0FfTUNNRU1CRVJfUkVDX1NMCQkJKDE8PDEyKQorI2RlZmluZSBJQl9TQV9NQ01FTUJFUl9SRUNfRkxPV19MQUJFTAkJKDE8PDEzKQorI2RlZmluZSBJQl9TQV9NQ01FTUJFUl9SRUNfSE9QX0xJTUlUCQkoMTw8MTQpCisjZGVmaW5lIElCX1NBX01DTUVNQkVSX1JFQ19TQ09QRQkJKDE8PDE1KQorI2RlZmluZSBJQl9TQV9NQ01FTUJFUl9SRUNfSk9JTl9TVEFURQkJKDE8PDE2KQorI2RlZmluZSBJQl9TQV9NQ01FTUJFUl9SRUNfUFJPWFlfSk9JTgkJKDE8PDE3KQorCit1bmlvbiBpYl9zYV9kYXRhIHsKKwlzdHJ1Y3QgaWJfcGF0aF9yZWNvcmQgcGF0aF9yZWNvcmQ7CisJc3RydWN0IGliX21jX21lbWJlcl9yZWNvcmQgbWNfbWVtYmVyX3JlY29yZDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbW11bmljYXRpb24gbWFuYWdlbWVudCBNQURzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIENvbW11bmljYXRpb24gbWFuYWdlbWVudCBjbGFzcyB2ZXJzaW9uICovCisjZGVmaW5lIElCX0NNX0NMQVNTX1ZFUlNJT04JCQkyCisKKy8qIENvbW11bmljYXRpb24gbWFuYWdlbWVudCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIElCX0NNX0FUVFJfQ0xBU1NfUE9SVF9JTkZPCQkweDAwMDEKKyNkZWZpbmUgSUJfQ01fQVRUUl9DT05ORUNUX1JFUVVFU1QJCTB4MDAxMAorI2RlZmluZSBJQl9DTV9BVFRSX01TR19SQ1BUX0FDSwkJCTB4MDAxMQorI2RlZmluZSBJQl9DTV9BVFRSX0NPTk5FQ1RfUkVKRUNUCQkweDAwMTIKKyNkZWZpbmUgSUJfQ01fQVRUUl9DT05ORUNUX1JFUExZCQkweDAwMTMKKyNkZWZpbmUgSUJfQ01fQVRUUl9SRUFEWV9UT19VU0UJCQkweDAwMTQKKyNkZWZpbmUgSUJfQ01fQVRUUl9ESVNDT05ORUNUX1JFUVVFU1QJCTB4MDAxNQorI2RlZmluZSBJQl9DTV9BVFRSX0RJU0NPTk5FQ1RfUkVQTFkJCTB4MDAxNgorI2RlZmluZSBJQl9DTV9BVFRSX1NFUlZJQ0VfSURfUkVTX1JFUQkJMHgwMDE2CisjZGVmaW5lIElCX0NNX0FUVFJfU0VSVklDRV9JRF9SRVNfUkVRX1JFU1AJMHgwMDE4CisjZGVmaW5lIElCX0NNX0FUVFJfTE9BRF9BTFRFUk5BVEVfUEFUSAkJMHgwMDE5CisjZGVmaW5lIElCX0NNX0FUVFJfQUxURVJOQVRFX1BBVEhfUkVTUE9OU0UJMHgwMDFhCisKKy8qKiBDb21tdW5pY2F0aW9uIG1hbmFnZW1lbnQgY29tbW9uIGZpZWxkcyAqLworc3RydWN0IGliX2NtX2NvbW1vbiB7CisJLyoqIExvY2FsIGNvbW11bmljYXRpb24gSUQgKi8KKwl1aW50MzJfdCBsb2NhbF9pZDsKKwkvKiogUmVtb3RlIGNvbW11bmljYXRpb24gSUQgKi8KKwl1aW50MzJfdCByZW1vdGVfaWQ7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZFsyMjRdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgY29tbXVuaWNhdGlvbiBtYW5hZ2VtZW50IHBhdGggKi8KK3N0cnVjdCBpYl9jbV9wYXRoIHsKKwkvKiogTG9jYWwgcG9ydCBMSUQgKi8KKwl1aW50MTZfdCBsb2NhbF9saWQ7CisJLyoqIFJlbW90ZSBwb3J0IExJRCAqLworCXVpbnQxNl90IHJlbW90ZV9saWQ7CisJLyoqIExvY2FsIHBvcnQgR0lEICovCisJc3RydWN0IGliX2dpZCBsb2NhbF9naWQ7CisJLyoqIFJlbW90ZSBwb3J0IEdJRCAqLworCXN0cnVjdCBpYl9naWQgcmVtb3RlX2dpZDsKKwkvKiogRmxvdyBsYWJlbCBhbmQgcmF0ZSAqLworCXVpbnQzMl90IGZsb3dfbGFiZWxfX3JhdGU7CisJLyoqIFRyYWZmaWMgY2xhc3MgKi8KKwl1aW50OF90IHRjOworCS8qKiBIb3AgbGltaXQgKi8KKwl1aW50OF90IGhvcF9saW1pdDsKKwkvKiogU0wgYW5kIHN1Ym5ldCBsb2NhbCovCisJdWludDhfdCBzbF9fc3VibmV0X2xvY2FsOworCS8qKiBMb2NhbCBBQ0sgdGltZW91dCAqLworCXVpbnQ4X3QgbG9jYWxfYWNrX3RpbWVvdXQ7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBjb21tdW5pY2F0aW9uIG1hbmFnZW1lbnQgY29ubmVjdGlvbiByZXF1ZXN0CisgKgorICogRGVmaW5lZCBpbiBzZWN0aW9uIDEyLjYuNSBvZiB0aGUgSUJBLgorICovCitzdHJ1Y3QgaWJfY21fY29ubmVjdF9yZXF1ZXN0IHsKKwkvKiogTG9jYWwgY29tbXVuaWNhdGlvbiBJRCAqLworCXVpbnQzMl90IGxvY2FsX2lkOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQzMl90IHJlc2VydmVkMFsxXTsKKwkvKiogU2VydmljZSBJRCAqLworCXN0cnVjdCBpYl9naWRfaGFsZiBzZXJ2aWNlX2lkOworCS8qKiBMb2NhbCBDQSBHVUlEICovCisJc3RydWN0IGliX2dpZF9oYWxmIGxvY2FsX2NhOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQzMl90IHJlc2VydmVkMVsxXTsKKwkvKiogTG9jYWwgcXVldWUga2V5ICovCisJdWludDMyX3QgbG9jYWxfcWtleTsKKwkvKiogTG9jYWwgUVBOIGFuZCByZXNwb25kZXIgcmVzb3VyY2VzKi8KKwl1aW50MzJfdCBsb2NhbF9xcG5fX3Jlc3BvbmRlcl9yZXNvdXJjZXM7CisJLyoqIExvY2FsIEVFQ04gYW5kIGluaXRpYXRvciBkZXB0aCAqLworCXVpbnQzMl90IGxvY2FsX2VlY25fX2luaXRpYXRvcl9kZXB0aDsKKwkvKiogUmVtb3RlIEVFQ04sIHJlbW90ZSBDTSByZXNwb25zZSB0aW1lb3V0LCB0cmFuc3BvcnQgc2VydmljZQorCSAqIHR5cGUsIEVFIGZsb3cgY29udHJvbAorCSAqLworCXVpbnQzMl90IHJlbW90ZV9lZWNuX19yZW1vdGVfdGltZW91dF9fc2VydmljZV90eXBlX19lZV9mbG93X2N0cmw7CisJLyoqIFN0YXJ0aW5nIFBTTiwgbG9jYWwgQ00gcmVzcG9uc2UgdGltZW91dCBhbmQgcmV0cnkgY291bnQgKi8KKwl1aW50MzJfdCBzdGFydGluZ19wc25fX2xvY2FsX3RpbWVvdXRfX3JldHJ5X2NvdW50OworCS8qKiBQYXJ0aXRpb24ga2V5ICovCisJdWludDE2X3QgcGtleTsKKwkvKiogUGF0aCBwYWNrZXQgcGF5bG9hZCBNVFUsIFJEQyBleGlzdHMsIFJOUiByZXRyeSBjb3VudCAqLworCXVpbnQ4X3QgcGF5bG9hZF9tdHVfX3JkY19leGlzdHNfX3Jucl9yZXRyeTsKKwkvKiogTWF4IENNIHJldHJpZXMgYW5kIFNSUSAqLworCXVpbnQ4X3QgbWF4X2NtX3JldHJpZXNfX3NycTsKKwkvKiogUHJpbWFyeSBwYXRoICovCisJc3RydWN0IGliX2NtX3BhdGggcHJpbWFyeTsKKwkvKiogQWx0ZXJuYXRlIHBhdGggKi8KKwlzdHJ1Y3QgaWJfY21fcGF0aCBhbHRlcm5hdGU7CisJLyoqIFByaXZhdGUgZGF0YSAqLworCXVpbnQ4X3QgcHJpdmF0ZV9kYXRhWzkyXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBDTSB0cmFuc3BvcnQgdHlwZXMgKi8KKyNkZWZpbmUgSUJfQ01fVFJBTlNQT1JUX1JDCQkwCisjZGVmaW5lIElCX0NNX1RSQU5TUE9SVF9VQwkJMQorI2RlZmluZSBJQl9DTV9UUkFOU1BPUlRfUkQJCTIKKworLyoqIEEgY29tbXVuaWNhdGlvbiBtYW5hZ2VtZW50IGNvbm5lY3Rpb24gcmVqZWN0aW9uCisgKgorICogRGVmaW5lZCBpbiBzZWN0aW9uIDEyLjYuNyBvZiB0aGUgSUJBLgorICovCitzdHJ1Y3QgaWJfY21fY29ubmVjdF9yZWplY3QgeworCS8qKiBMb2NhbCBjb21tdW5pY2F0aW9uIElEICovCisJdWludDMyX3QgbG9jYWxfaWQ7CisJLyoqIFJlbW90ZSBjb21tdW5pY2F0aW9uIElEICovCisJdWludDMyX3QgcmVtb3RlX2lkOworCS8qKiBNZXNzYWdlIHJlamVjdGVkICovCisJdWludDhfdCBtZXNzYWdlOworCS8qKiBSZWplY3QgaW5mb3JtYXRpb24gbGVuZ3RoICovCisJdWludDhfdCBpbmZvX2xlbjsKKwkvKiogUmVqZWN0aW9uIHJlYXNvbiAqLworCXVpbnQxNl90IHJlYXNvbjsKKwkvKiogQWRkaXRpb25hbCByZWplY3Rpb24gaW5mb3JtYXRpb24gKi8KKwl1aW50OF90IGluZm9bNzJdOworCS8qKiBQcml2YXRlIGRhdGEgKi8KKwl1aW50OF90IHByaXZhdGVfZGF0YVsxNDhdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIENNIHJlamVjdGlvbiByZWFzb25zICovCisjZGVmaW5lIElCX0NNX1JFSkVDVF9CQURfU0VSVklDRV9JRAk4CisjZGVmaW5lIElCX0NNX1JFSkVDVF9TVEFMRV9DT05OCQkxMAorI2RlZmluZSBJQl9DTV9SRUpFQ1RfQ09OU1VNRVIJCTI4CisKKy8qKiBBIGNvbW11bmljYXRpb24gbWFuYWdlbWVudCBjb25uZWN0aW9uIHJlcGx5CisgKgorICogRGVmaW5lZCBpbiBzZWN0aW9uIDEyLjYuOCBvZiB0aGUgSUJBLgorICovCitzdHJ1Y3QgaWJfY21fY29ubmVjdF9yZXBseSB7CisJLyoqIExvY2FsIGNvbW11bmljYXRpb24gSUQgKi8KKwl1aW50MzJfdCBsb2NhbF9pZDsKKwkvKiogUmVtb3RlIGNvbW11bmljYXRpb24gSUQgKi8KKwl1aW50MzJfdCByZW1vdGVfaWQ7CisJLyoqIExvY2FsIHF1ZXVlIGtleSAqLworCXVpbnQzMl90IGxvY2FsX3FrZXk7CisJLyoqIExvY2FsIFFQTiAqLworCXVpbnQzMl90IGxvY2FsX3FwbjsKKwkvKiogTG9jYWwgRUVDTiAqLworCXVpbnQzMl90IGxvY2FsX2VlY247CisJLyoqIFN0YXJ0aW5nIFBTTiAqLworCXVpbnQzMl90IHN0YXJ0aW5nX3BzbjsKKwkvKiogUmVzcG9uZGVyIHJlc291cmNlcyAqLworCXVpbnQ4X3QgcmVzcG9uZGVyX3Jlc291cmNlczsKKwkvKiogSW5pdGlhdG9yIGRlcHRoICovCisJdWludDhfdCBpbml0aWF0b3JfZGVwdGg7CisJLyoqIFRhcmdldCBBQ0sgZGVsYXksIGZhaWxvdmVyIGFjY2VwdGVkLCBhbmQgZW5kLXRvLWVuZCBmbG93IGNvbnRyb2wgKi8KKwl1aW50OF90IHRhcmdldF9hY2tfZGVsYXlfX2ZhaWxvdmVyX2FjY2VwdGVkX19lZV9mbG93X2N0cmw7CisJLyoqIFJOUiByZXRyeSBjb3VudCwgU1JRICovCisJdWludDhfdCBybnJfcmV0cnlfX3NycTsKKwkvKiogTG9jYWwgQ0EgR1VJRCAqLworCXN0cnVjdCBpYl9naWRfaGFsZiBsb2NhbF9jYTsKKwkvKiogUHJpdmF0ZSBkYXRhICovCisJdWludDhfdCBwcml2YXRlX2RhdGFbMTk2XTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBIGNvbW11bmljYXRpb24gbWFuYWdlbWVudCByZWFkeSB0byB1c2UgcmVwbHkKKyAqCisgKiBEZWZpbmVkIGluIHNlY3Rpb24gMTIuNi45IG9mIHRoZSBJQkEuCisgKi8KK3N0cnVjdCBpYl9jbV9yZWFkeV90b191c2UgeworCS8qKiBMb2NhbCBjb21tdW5pY2F0aW9uIElEICovCisJdWludDMyX3QgbG9jYWxfaWQ7CisJLyoqIFJlbW90ZSBjb21tdW5pY2F0aW9uIElEICovCisJdWludDMyX3QgcmVtb3RlX2lkOworCS8qKiBQcml2YXRlIGRhdGEgKi8KKwl1aW50OF90IHByaXZhdGVfZGF0YVsyMjRdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgY29tbXVuaWNhdGlvbiBtYW5hZ2VtZW50IGF0dHJpYnV0ZSAqLwordW5pb24gaWJfY21fZGF0YSB7CisJc3RydWN0IGliX2NtX2NvbW1vbiBjb21tb247CisJc3RydWN0IGliX2NtX2Nvbm5lY3RfcmVxdWVzdCBjb25uZWN0X3JlcXVlc3Q7CisJc3RydWN0IGliX2NtX2Nvbm5lY3RfcmVqZWN0IGNvbm5lY3RfcmVqZWN0OworCXN0cnVjdCBpYl9jbV9jb25uZWN0X3JlcGx5IGNvbm5lY3RfcmVwbHk7CisJc3RydWN0IGliX2NtX3JlYWR5X3RvX3VzZSByZWFkeV90b191c2U7CisJdWludDhfdCBieXRlc1syMzJdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTUFEcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBNYW5hZ2VtZW50IGRhdGFncmFtIGNsYXNzX3NwZWNpZmljIGRhdGEgKi8KK3VuaW9uIGliX21hZF9jbGFzc19zcGVjaWZpYyB7CisJdWludDE2X3QgcmF3OworCXN0cnVjdCBpYl9zbXBfY2xhc3Nfc3BlY2lmaWMgc21wOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgbWFuYWdlbWVudCBkYXRhZ3JhbSBjb21tb24gaGVhZGVyCisgKgorICogRGVmaW5lZCBpbiBzZWN0aW9uIDEzLjQuMiBvZiB0aGUgSUJBLgorICovCitzdHJ1Y3QgaWJfbWFkX2hkciB7CisJdWludDhfdCBiYXNlX3ZlcnNpb247CisJdWludDhfdCBtZ210X2NsYXNzOworCXVpbnQ4X3QgY2xhc3NfdmVyc2lvbjsKKwl1aW50OF90IG1ldGhvZDsKKwl1aW50MTZfdCBzdGF0dXM7CisJdW5pb24gaWJfbWFkX2NsYXNzX3NwZWNpZmljIGNsYXNzX3NwZWNpZmljOworCXVpbnQzMl90IHRpZFsyXTsKKwl1aW50MTZfdCBhdHRyX2lkOworCXVpbnQ4X3QgcmVzZXJ2ZWRbMl07CisJdWludDMyX3QgYXR0cl9tb2Q7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiBNYW5hZ2VtZW50IGJhc2UgdmVyc2lvbiAqLworI2RlZmluZSBJQl9NR01UX0JBU0VfVkVSU0lPTgkJCTEKKworLyogTWFuYWdlbWVudCBjbGFzc2VzICovCisjZGVmaW5lIElCX01HTVRfQ0xBU1NfU1VCTl9MSURfUk9VVEVECQkweDAxCisjZGVmaW5lIElCX01HTVRfQ0xBU1NfU1VCTl9ESVJFQ1RFRF9ST1VURQkweDgxCisjZGVmaW5lIElCX01HTVRfQ0xBU1NfU1VCTl9BRE0JCQkweDAzCisjZGVmaW5lIElCX01HTVRfQ0xBU1NfUEVSRl9NR01UCQkJMHgwNAorI2RlZmluZSBJQl9NR01UX0NMQVNTX0JNCQkJMHgwNQorI2RlZmluZSBJQl9NR01UX0NMQVNTX0RFVklDRV9NR01UCQkweDA2CisjZGVmaW5lIElCX01HTVRfQ0xBU1NfQ00JCQkweDA3CisjZGVmaW5lIElCX01HTVRfQ0xBU1NfU05NUAkJCTB4MDgKKyNkZWZpbmUgSUJfTUdNVF9DTEFTU19WRU5ET1JfUkFOR0UyX1NUQVJUCTB4MzAKKyNkZWZpbmUgSUJfTUdNVF9DTEFTU19WRU5ET1JfUkFOR0UyX0VORAkJMHg0ZgorCisjZGVmaW5lIElCX01HTVRfQ0xBU1NfTUFTSwkJCTB4N2YKKworLyogTWFuYWdlbWVudCBtZXRob2RzICovCisjZGVmaW5lIElCX01HTVRfTUVUSE9EX0dFVAkJCTB4MDEKKyNkZWZpbmUgSUJfTUdNVF9NRVRIT0RfU0VUCQkJMHgwMgorI2RlZmluZSBJQl9NR01UX01FVEhPRF9HRVRfUkVTUAkJCTB4ODEKKyNkZWZpbmUgSUJfTUdNVF9NRVRIT0RfU0VORAkJCTB4MDMKKyNkZWZpbmUgSUJfTUdNVF9NRVRIT0RfVFJBUAkJCTB4MDUKKyNkZWZpbmUgSUJfTUdNVF9NRVRIT0RfUkVQT1JUCQkJMHgwNgorI2RlZmluZSBJQl9NR01UX01FVEhPRF9SRVBPUlRfUkVTUAkJMHg4NgorI2RlZmluZSBJQl9NR01UX01FVEhPRF9UUkFQX1JFUFJFU1MJCTB4MDcKKyNkZWZpbmUgSUJfTUdNVF9NRVRIT0RfREVMRVRFCQkJMHgxNQorCisvKiBTdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgSUJfTUdNVF9TVEFUVVNfT0sJCQkweDAwMDAKKyNkZWZpbmUgSUJfTUdNVF9TVEFUVVNfQkFEX1ZFUlNJT04JCTB4MDAwMQorI2RlZmluZSBJQl9NR01UX1NUQVRVU19VTlNVUFBPUlRFRF9NRVRIT0QJMHgwMDAyCisjZGVmaW5lIElCX01HTVRfU1RBVFVTX1VOU1VQUE9SVEVEX01FVEhPRF9BVFRSCTB4MDAwMworI2RlZmluZSBJQl9NR01UX1NUQVRVU19JTlZBTElEX1ZBTFVFCQkweDAwMDQKKworLyoqIEEgc3VibmV0IG1hbmFnZW1lbnQgTUFEICovCitzdHJ1Y3QgaWJfbWFkX3NtcCB7CisJc3RydWN0IGliX21hZF9oZHIgbWFkX2hkcjsKKwlzdHJ1Y3QgaWJfc21wX2hkciBzbXBfaGRyOworCXVuaW9uIGliX3NtcF9kYXRhIHNtcF9kYXRhOworCXN0cnVjdCBpYl9zbXBfZHJfcGF0aCBpbml0aWFsX3BhdGg7CisJc3RydWN0IGliX3NtcF9kcl9wYXRoIHJldHVybl9wYXRoOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgc3VibmV0IGFkbWluaXN0cmF0aW9uIE1BRCAqLworc3RydWN0IGliX21hZF9zYSB7CisJc3RydWN0IGliX21hZF9oZHIgbWFkX2hkcjsKKwlzdHJ1Y3QgaWJfcm1wcF9oZHIgcm1wcF9oZHI7CisJc3RydWN0IGliX3NhX2hkciBzYV9oZHI7CisJdW5pb24gaWJfc2FfZGF0YSBzYV9kYXRhOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgY29tbXVuaWNhdGlvbiBtYW5hZ2VtZW50IE1BRCAqLworc3RydWN0IGliX21hZF9jbSB7CisJc3RydWN0IGliX21hZF9oZHIgbWFkX2hkcjsKKwl1bmlvbiBpYl9jbV9kYXRhIGNtX2RhdGE7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBtYW5hZ2VtZW50IGRhdGFncmFtICovCit1bmlvbiBpYl9tYWQgeworCXN0cnVjdCBpYl9tYWRfaGRyIGhkcjsKKwlzdHJ1Y3QgaWJfbWFkX3NtcCBzbXA7CisJc3RydWN0IGliX21hZF9zYSBzYTsKKwlzdHJ1Y3QgaWJfbWFkX2NtIGNtOworCXVpbnQ4X3QgYnl0ZXNbMjU2XTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKyNlbmRpZiAvKiBfR1BYRV9JQl9NQURfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX21jYXN0LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfbWNhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGVjY2QwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX21jYXN0LmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfR1BYRV9JQl9NQ0FTVF9ICisjZGVmaW5lIF9HUFhFX0lCX01DQVNUX0gKKworLyoqIEBmaWxlCisgKgorICogSW5maW5pYmFuZCBtdWx0aWNhc3QgZ3JvdXBzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvaW5maW5pYmFuZC5oPgorCitzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uOworCisvKiogQW4gSW5maW5pYmFuZCBtdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcCAqLworc3RydWN0IGliX21jX21lbWJlcnNoaXAgeworCS8qKiBRdWV1ZSBwYWlyICovCisJc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwOworCS8qKiBNdWx0aWNhc3QgR0lEICovCisJc3RydWN0IGliX2dpZCBnaWQ7CisJLyoqIE11bHRpY2FzdCBncm91cCBqb2luIHRyYW5zYWN0aW9uICovCisJc3RydWN0IGliX21hZF90cmFuc2FjdGlvbiAqbWFkeDsKKwkvKiogSGFuZGxlIGpvaW4gc3VjY2Vzcy9mYWlsdXJlCisJICoKKwkgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKwkgKiBAdiBxcAkJUXVldWUgcGFpcgorCSAqIEB2IG1lbWJlcnNoaXAJTXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAKKwkgKiBAdiByYwkJU3RhdHVzIGNvZGUKKwkgKiBAdiBtYWQJCVJlc3BvbnNlIE1BRCAob3IgTlVMTCBvbiBlcnJvcikKKwkgKi8KKwl2b2lkICggKiBjb21wbGV0ZSApICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCSAgICAgIHN0cnVjdCBpYl9tY19tZW1iZXJzaGlwICptZW1iZXJzaGlwLCBpbnQgcmMsCisJCQkgICAgICB1bmlvbiBpYl9tYWQgKm1hZCApOworfTsKKworZXh0ZXJuIGludCBpYl9tY2FzdF9qb2luICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCSAgIHN0cnVjdCBpYl9tY19tZW1iZXJzaGlwICptZW1iZXJzaGlwLAorCQkJICAgc3RydWN0IGliX2dpZCAqZ2lkLAorCQkJICAgdm9pZCAoICogam9pbmVkICkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCQkJICAgICAgIHN0cnVjdCBpYl9tY19tZW1iZXJzaGlwICptZW1iLAorCQkJCQkgICAgICAgaW50IHJjLCB1bmlvbiBpYl9tYWQgKm1hZCApICk7CisKK2V4dGVybiB2b2lkIGliX21jYXN0X2xlYXZlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCSAgICAgc3RydWN0IGliX21jX21lbWJlcnNoaXAgKm1lbWJlcnNoaXAgKTsKKworI2VuZGlmIC8qIF9HUFhFX0lCX01DQVNUX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pYl9taS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX21pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjZjY4NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pYl9taS5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIF9HUFhFX0lCX01JX0gKKyNkZWZpbmUgX0dQWEVfSUJfTUlfSAorCisvKiogQGZpbGUKKyAqCisgKiBJbmZpbmliYW5kIG1hbmFnZW1lbnQgaW50ZXJmYWNlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL3JldHJ5Lmg+CisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKyNpbmNsdWRlIDxncHhlL2luZmluaWJhbmQuaD4KKworc3RydWN0IGliX21hZF9pbnRlcmZhY2U7CitzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uOworCisvKiogQW4gSW5maW5pYmFuZCBtYW5hZ2VtZW50IGFnZW50ICovCitzdHJ1Y3QgaWJfbWFkX2FnZW50IHsKKwkvKiogTWFuYWdlbWVudCBjbGFzcyAqLworCXVpbnQ4X3QgbWdtdF9jbGFzczsKKwkvKiogQ2xhc3MgdmVyc2lvbiAqLworCXVpbnQ4X3QgY2xhc3NfdmVyc2lvbjsKKwkvKiogQXR0cmlidXRlIChpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpICovCisJdWludDE2X3QgYXR0cl9pZDsKKwkvKiogSGFuZGxlIE1BRAorCSAqCisJICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisJICogQHYgbWkJCU1hbmFnZW1lbnQgaW50ZXJmYWNlCisJICogQHYgbWFkCQlSZWNlaXZlZCBNQUQKKwkgKiBAdiBhdgkJU291cmNlIGFkZHJlc3MgdmVjdG9yCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJdm9pZCAoICogaGFuZGxlICkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWksCisJCQkgICAgdW5pb24gaWJfbWFkICptYWQsCisJCQkgICAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApOworfTsKKworLyoqIEluZmluaWJhbmQgbWFuYWdlbWVudCBhZ2VudHMgKi8KKyNkZWZpbmUgSUJfTUFEX0FHRU5UUyBfX3RhYmxlICggc3RydWN0IGliX21hZF9hZ2VudCwgImliX21hZF9hZ2VudHMiICkKKworLyoqIERlY2xhcmUgYW4gSW5maW5pYmFuZCBtYW5hZ2VtZW50IGFnZW50ICovCisjZGVmaW5lIF9faWJfbWFkX2FnZW50IF9fdGFibGVfZW50cnkgKCBJQl9NQURfQUdFTlRTLCAwMSApCisKKy8qKiBJbmZpbmliYW5kIG1hbmFnZW1lbnQgdHJhbnNhY3Rpb24gb3BlcmF0aW9ucyAqLworc3RydWN0IGliX21hZF90cmFuc2FjdGlvbl9vcGVyYXRpb25zIHsKKwkvKiogSGFuZGxlIHRyYW5zYWN0aW9uIGNvbXBsZXRpb24KKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IG1pCQlNYW5hZ2VtZW50IGludGVyZmFjZQorCSAqIEB2IG1hZHgJCU1hbmFnZW1lbnQgdHJhbnNhY3Rpb24KKwkgKiBAdiByYwkJU3RhdHVzIGNvZGUKKwkgKiBAdiBtYWQJCVJlY2VpdmVkIE1BRCAob3IgTlVMTCBvbiBlcnJvcikKKwkgKiBAdiBhdgkJU291cmNlIGFkZHJlc3MgdmVjdG9yIChvciBOVUxMIG9uIGVycm9yKQorCSAqCisJICogVGhlIGNvbXBsZXRpb24gaGFuZGxlciBzaG91bGQgaW4gbW9zdCBjYXNlcyBjYWxsCisJICogaWJfZGVzdHJveV9tYWR4KCkgdG8gZnJlZSB1cCB0aGUgY29tcGxldGVkIHRyYW5zYWN0aW9uLgorCSAqLworCXZvaWQgKCAqIGNvbXBsZXRlICkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgIHN0cnVjdCBpYl9tYWRfaW50ZXJmYWNlICptaSwKKwkJCSAgICAgIHN0cnVjdCBpYl9tYWRfdHJhbnNhY3Rpb24gKm1hZHgsCisJCQkgICAgICBpbnQgcmMsIHVuaW9uIGliX21hZCAqbWFkLAorCQkJICAgICAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApOworfTsKKworLyoqIEFuIEluZmluaWJhbmQgbWFuYWdlbWVudCB0cmFuc2FjdGlvbiAqLworc3RydWN0IGliX21hZF90cmFuc2FjdGlvbiB7CisJLyoqIEFzc29jaWF0ZWQgbWFuYWdlbWVudCBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWk7CisJLyoqIExpc3Qgb2YgdHJhbnNhY3Rpb25zICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8qKiBSZXRyeSB0aW1lciAqLworCXN0cnVjdCByZXRyeV90aW1lciB0aW1lcjsKKwkvKiogRGVzdGluYXRpb24gYWRkcmVzcyB2ZWN0b3IgKi8KKwlzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgYXY7CisJLyoqIE1BRCBiZWluZyBzZW50ICovCisJdW5pb24gaWJfbWFkIG1hZDsKKwkvKiogVHJhbnNhY3Rpb24gb3BlcmF0aW9ucyAqLworCXN0cnVjdCBpYl9tYWRfdHJhbnNhY3Rpb25fb3BlcmF0aW9ucyAqb3A7CisJLyoqIE93bmVyIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKm93bmVyX3ByaXY7Cit9OworCisvKiogQW4gSW5maW5pYmFuZCBtYW5hZ2VtZW50IGludGVyZmFjZSAqLworc3RydWN0IGliX21hZF9pbnRlcmZhY2UgeworCS8qKiBJbmZpbmliYW5kIGRldmljZSAqLworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OworCS8qKiBDb21wbGV0aW9uIHF1ZXVlICovCisJc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxOworCS8qKiBRdWV1ZSBwYWlyICovCisJc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwOworCS8qKiBMaXN0IG9mIG1hbmFnZW1lbnQgdHJhbnNhY3Rpb25zICovCisJc3RydWN0IGxpc3RfaGVhZCBtYWR4OworfTsKKworLyoqCisgKiBTZXQgSW5maW5pYmFuZCBtYW5hZ2VtZW50IHRyYW5zYWN0aW9uIG93bmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IG1hZHgJCU1hbmFnZW1lbnQgdHJhbnNhY3Rpb24KKyAqIEB2IHByaXYJCVByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitpYl9tYWR4X3NldF9vd25lcmRhdGEgKCBzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uICptYWR4LCB2b2lkICpwcml2ICkgeworCW1hZHgtPm93bmVyX3ByaXYgPSBwcml2OworfQorCisvKioKKyAqIEdldCBJbmZpbmliYW5kIG1hbmFnZW1lbnQgdHJhbnNhY3Rpb24gb3duZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgbWFkeAkJTWFuYWdlbWVudCB0cmFuc2FjdGlvbgorICogQHJldCBwcml2CQlQcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitpYl9tYWR4X2dldF9vd25lcmRhdGEgKCBzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uICptYWR4ICkgeworCXJldHVybiBtYWR4LT5vd25lcl9wcml2OworfQorCitleHRlcm4gaW50IGliX21pX3NlbmQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pLAorCQkJdW5pb24gaWJfbWFkICptYWQsIHN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciAqYXYgKTsKK2V4dGVybiBzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uICoKK2liX2NyZWF0ZV9tYWR4ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9tYWRfaW50ZXJmYWNlICptaSwKKwkJIHVuaW9uIGliX21hZCAqbWFkLCBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2LAorCQkgc3RydWN0IGliX21hZF90cmFuc2FjdGlvbl9vcGVyYXRpb25zICpvcCApOworZXh0ZXJuIHZvaWQgaWJfZGVzdHJveV9tYWR4ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWksCisJCQkgICAgICBzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uICptYWR4ICk7CitleHRlcm4gc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKiBpYl9jcmVhdGVfbWkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkJCWVudW0gaWJfcXVldWVfcGFpcl90eXBlIHR5cGUgKTsKK2V4dGVybiB2b2lkIGliX2Rlc3Ryb3lfbWkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWkgKTsKKworI2VuZGlmIC8qIF9HUFhFX0lCX01JX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pYl9wYWNrZXQuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pYl9wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY4ODU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX3BhY2tldC5oCkBAIC0wLDAgKzEsMTQ3IEBACisjaWZuZGVmIF9HUFhFX0lCX1BBQ0tFVF9ICisjZGVmaW5lIF9HUFhFX0lCX1BBQ0tFVF9ICisKKy8qKiBAZmlsZQorICoKKyAqIEluZmluaWJhbmQgcGFja2V0IGZvcm1hdAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBpYl9kZXZpY2U7CitzdHJ1Y3QgaWJfcXVldWVfcGFpcjsKK3N0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvcjsKK3N0cnVjdCBpb19idWZmZXI7CisKKy8qKiBIYWxmIG9mIGFuIEluZmluaWJhbmQgR2xvYmFsIElkZW50aWZpZXIgKi8KK3N0cnVjdCBpYl9naWRfaGFsZiB7CisJdW5pb24geworCQl1aW50OF90IGJ5dGVzWzhdOworCQl1aW50MTZfdCB3b3Jkc1s0XTsKKwkJdWludDMyX3QgZHdvcmRzWzJdOworCX0gdTsKK307CisKKy8qKiBBbiBJbmZpbmliYW5kIEdsb2JhbCBJZGVudGlmaWVyICovCitzdHJ1Y3QgaWJfZ2lkIHsKKwl1bmlvbiB7CisJCXVpbnQ4X3QgYnl0ZXNbMTZdOworCQl1aW50MTZfdCB3b3Jkc1s4XTsKKwkJdWludDMyX3QgZHdvcmRzWzRdOworCQlzdHJ1Y3QgaWJfZ2lkX2hhbGYgaGFsZlsyXTsKKwl9IHU7Cit9OworCisvKiogQW4gSW5maW5pYmFuZCBMb2NhbCBSb3V0ZSBIZWFkZXIgKi8KK3N0cnVjdCBpYl9sb2NhbF9yb3V0ZV9oZWFkZXIgeworCS8qKiBWaXJ0dWFsIGxhbmUgYW5kIGxpbmsgdmVyc2lvbiAqLworCXVpbnQ4X3QgdmxfX2x2ZXI7CisJLyoqIFNlcnZpY2UgbGV2ZWwgYW5kIG5leHQgbGluayBoZWFkZXIgKi8KKwl1aW50OF90IHNsX19sbmg7CisJLyoqIERlc3RpbmF0aW9uIExJRCAqLworCXVpbnQxNl90IGRsaWQ7CisJLyoqIFBhY2tldCBsZW5ndGggKi8KKwl1aW50MTZfdCBsZW5ndGg7CisJLyoqIFNvdXJjZSBMSUQgKi8KKwl1aW50MTZfdCBzbGlkOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEluZmluaWJhbmQgdmlydHVhbCBsYW5lcyAqLworZW51bSBpYl92bCB7CisJSUJfVkxfREVGQVVMVCA9IDAsCisJSUJfVkxfU01QID0gMTUsCit9OworCisvKiogQW4gSW5maW5pYmFuZCBMaW5rIE5leHQgSGVhZGVyIHZhbHVlICovCitlbnVtIGliX2xuaCB7CisJSUJfTE5IX1JBVyA9IDAsCisJSUJfTE5IX0lQdjYgPSAxLAorCUlCX0xOSF9CVEggPSAyLAorCUlCX0xOSF9HUkggPSAzCit9OworCisvKiogRGVmYXVsdCBJbmZpbmliYW5kIExJRCAqLworI2RlZmluZSBJQl9MSURfTk9ORSAweGZmZmYKKworLyoqIFRlc3QgZm9yIG11bHRpY2FzdCBMSUQgKi8KKyNkZWZpbmUgSUJfTElEX01VTFRJQ0FTVCggbGlkICkgKCAoIChsaWQpID49IDB4YzAwMCApICYmICggKGxpZCkgPD0gMHhmZmZlICkgKQorCisvKiogQW4gSW5maW5pYmFuZCBHbG9iYWwgUm91dGUgSGVhZGVyICovCitzdHJ1Y3QgaWJfZ2xvYmFsX3JvdXRlX2hlYWRlciB7CisJLyoqIElQIHZlcnNpb24sIHRyYWZmaWMgY2xhc3MsIGFuZCBmbG93IGxhYmVsCisJICoKKwkgKiAgNCBiaXRzIDogVmVyc2lvbiBvZiB0aGUgR1JICisJICogIDggYml0cyA6IFRyYWZmaWMgY2xhc3MKKwkgKiAyMCBiaXRzIDogRmxvdyBsYWJlbAorCSAqLworCXVpbnQzMl90IGlwdmVyX190Y2xhc3NfX2Zsb3dsYWJlbDsKKwkvKiogUGF5bG9hZCBsZW5ndGggKi8KKwl1aW50MTZfdCBwYXlsZW47CisJLyoqIE5leHQgaGVhZGVyICovCisJdWludDhfdCBueHRoZHI7CisJLyoqIEhvcCBsaW1pdCAqLworCXVpbnQ4X3QgaG9wbG10OworCS8qKiBTb3VyY2UgR0lEICovCisJc3RydWN0IGliX2dpZCBzZ2lkOworCS8qKiBEZXN0aW5pYXRpb24gR0lEICovCisJc3RydWN0IGliX2dpZCBkZ2lkOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworI2RlZmluZSBJQl9HUkhfSVBWRVJfSVB2NiAweDA2CisjZGVmaW5lIElCX0dSSF9OWFRIRFJfSUJBIDB4MWIKKworLyoqIEFuIEluZmluaWJhbmQgQmFzZSBUcmFuc3BvcnQgSGVhZGVyICovCitzdHJ1Y3QgaWJfYmFzZV90cmFuc3BvcnRfaGVhZGVyIHsKKwkvKiogT3Bjb2RlICovCisJdWludDhfdCBvcGNvZGU7CisJLyoqIFRyYW5zcG9ydCBoZWFkZXIgdmVyc2lvbiwgcGFkIGNvdW50LCBtaWdyYXRpb24gYW5kIHNvbGljaXRhdGlvbiAqLworCXVpbnQ4X3Qgc2VfX21fX3BhZGNudF9fdHZlcjsKKwkvKiogUGFydGl0aW9uIGtleSAqLworCXVpbnQxNl90IHBrZXk7CisJLyoqIERlc3RpbmF0aW9uIHF1ZXVlIHBhaXIgKi8KKwl1aW50MzJfdCBkZXN0X3FwOworCS8qKiBQYWNrZXQgc2VxdWVuY2UgbnVtYmVyIGFuZCBhY2tub3dsZWRnZSByZXF1ZXN0ICovCisJdWludDMyX3QgYWNrX19wc247Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQW4gSW5maW5pYmFuZCBCVEggb3Bjb2RlICovCitlbnVtIGliX2J0aF9vcGNvZGUgeworCUJUSF9PUENPREVfVURfU0VORCA9IDB4NjQsCit9OworCisvKiogQW4gSW5maW5pYmFuZCBEYXRhZ3JhbSBFeHRlbmRlZCBUcmFuc3BvcnQgSGVhZGVyICovCitzdHJ1Y3QgaWJfZGF0YWdyYW1fZXh0ZW5kZWRfdHJhbnNwb3J0X2hlYWRlciB7CisJLyoqIFF1ZXVlIGtleSAqLworCXVpbnQzMl90IHFrZXk7CisJLyoqIFNvdXJjZSBxdWV1ZSBwYWlyICovCisJdWludDMyX3Qgc3JjX3FwOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEFsbCBrbm93biBJQiBoZWFkZXIgZm9ybWF0cyAqLwordW5pb24gaWJfaGVhZGVycyB7CisJc3RydWN0IGliX2xvY2FsX3JvdXRlX2hlYWRlciBscmg7CisJc3RydWN0IHsKKwkJc3RydWN0IGliX2xvY2FsX3JvdXRlX2hlYWRlciBscmg7CisJCXN0cnVjdCBpYl9nbG9iYWxfcm91dGVfaGVhZGVyIGdyaDsKKwkJc3RydWN0IGliX2Jhc2VfdHJhbnNwb3J0X2hlYWRlciBidGg7CisJCXN0cnVjdCBpYl9kYXRhZ3JhbV9leHRlbmRlZF90cmFuc3BvcnRfaGVhZGVyIGRldGg7CisJfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKSBscmhfX2dyaF9fYnRoX19kZXRoOworCXN0cnVjdCB7CisJCXN0cnVjdCBpYl9sb2NhbF9yb3V0ZV9oZWFkZXIgbHJoOworCQlzdHJ1Y3QgaWJfYmFzZV90cmFuc3BvcnRfaGVhZGVyIGJ0aDsKKwkJc3RydWN0IGliX2RhdGFncmFtX2V4dGVuZGVkX3RyYW5zcG9ydF9oZWFkZXIgZGV0aDsKKwl9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpIGxyaF9fYnRoX19kZXRoOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIE1heGltdW0gc2l6ZSByZXF1aXJlZCBmb3IgSUIgaGVhZGVycyAqLworI2RlZmluZSBJQl9NQVhfSEVBREVSX1NJWkUgc2l6ZW9mICggdW5pb24gaWJfaGVhZGVycyApCisKK2V4dGVybiBpbnQgaWJfcHVzaCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJICAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsIHNpemVfdCBwYXlsb2FkX2xlbiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2ICk7CitleHRlcm4gaW50IGliX3B1bGwgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCSAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKipxcCwgc2l6ZV90ICpwYXlsb2FkX2xlbiwKKwkJICAgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2ICk7CisKKyNlbmRpZiAvKiBfR1BYRV9JQl9QQUNLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX3BhdGhyZWMuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pYl9wYXRocmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4NGQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pYl9wYXRocmVjLmgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBfR1BYRV9JQl9QQVRIUkVDX0gKKyNkZWZpbmUgX0dQWEVfSUJfUEFUSFJFQ19ICisKKy8qKiBAZmlsZQorICoKKyAqIEluZmluaWJhbmQgcGF0aCByZWNvcmRzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvaW5maW5pYmFuZC5oPgorCitzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uOworc3RydWN0IGliX3BhdGg7CisKKy8qKiBJbmZpbmliYW5kIHBhdGggb3BlcmF0aW9ucyAqLworc3RydWN0IGliX3BhdGhfb3BlcmF0aW9ucyB7CisJLyoqIEhhbmRsZSBwYXRoIHRyYW5zYWN0aW9uIGNvbXBsZXRpb24KKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IHBhdGgJCVBhdGgKKwkgKiBAdiByYwkJU3RhdHVzIGNvZGUKKwkgKiBAdiBhdgkJQWRkcmVzcyB2ZWN0b3IsIG9yIE5VTEwgb24gZXJyb3IKKwkgKi8KKwl2b2lkICggKiBjb21wbGV0ZSApICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWJfcGF0aCAqcGF0aCwgaW50IHJjLAorCQkJICAgICAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApOworfTsKKworLyoqIEFuIEluZmluaWJhbmQgcGF0aCAqLworc3RydWN0IGliX3BhdGggeworCS8qKiBJbmZpbmliYW5kIGRldmljZSAqLworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OworCS8qKiBBZGRyZXNzIHZlY3RvciAqLworCXN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciBhdjsKKwkvKiogTWFuYWdlbWVudCB0cmFuc2FjdGlvbiAqLworCXN0cnVjdCBpYl9tYWRfdHJhbnNhY3Rpb24gKm1hZHg7CisJLyoqIFBhdGggb3BlcmF0aW9ucyAqLworCXN0cnVjdCBpYl9wYXRoX29wZXJhdGlvbnMgKm9wOworCS8qKiBPd25lciBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICpvd25lcl9wcml2OworfTsKKworLyoqCisgKiBTZXQgSW5maW5pYmFuZCBwYXRoIG93bmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IHBhdGgJCVBhdGgKKyAqIEB2IHByaXYJCVByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitpYl9wYXRoX3NldF9vd25lcmRhdGEgKCBzdHJ1Y3QgaWJfcGF0aCAqcGF0aCwgdm9pZCAqcHJpdiApIHsKKwlwYXRoLT5vd25lcl9wcml2ID0gcHJpdjsKK30KKworLyoqCisgKiBHZXQgSW5maW5pYmFuZCBwYXRoIG93bmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IHBhdGgJCVBhdGgKKyAqIEByZXQgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQgKgoraWJfcGF0aF9nZXRfb3duZXJkYXRhICggc3RydWN0IGliX3BhdGggKnBhdGggKSB7CisJcmV0dXJuIHBhdGgtPm93bmVyX3ByaXY7Cit9CisKK2V4dGVybiBzdHJ1Y3QgaWJfcGF0aCAqCitpYl9jcmVhdGVfcGF0aCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2LAorCQkgc3RydWN0IGliX3BhdGhfb3BlcmF0aW9ucyAqb3AgKTsKK2V4dGVybiB2b2lkIGliX2Rlc3Ryb3lfcGF0aCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgc3RydWN0IGliX3BhdGggKnBhdGggKTsKKworZXh0ZXJuIGludCBpYl9yZXNvbHZlX3BhdGggKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApOworCisjZW5kaWYgLyogX0dQWEVfSUJfUEFUSFJFQ19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfc21hLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfc21hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmYzY3MgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pYl9zbWEuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9HUFhFX0lCX1NNQV9ICisjZGVmaW5lIF9HUFhFX0lCX1NNQV9ICisKKy8qKiBAZmlsZQorICoKKyAqIEluZmluaWJhbmQgc3VibmV0IG1hbmFnZW1lbnQgYWdlbnQKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitzdHJ1Y3QgaWJfZGV2aWNlOworc3RydWN0IGliX21hZF9pbnRlcmZhY2U7CisKK2V4dGVybiBpbnQgaWJfY3JlYXRlX3NtYSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pICk7CitleHRlcm4gdm9pZCBpYl9kZXN0cm95X3NtYSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWkgKTsKKworI2VuZGlmIC8qIF9HUFhFX0lCX1NNQV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfc21jLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfc21jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRkMWM5YwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pYl9zbWMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9HUFhFX0lCX1NNQ19ICisjZGVmaW5lIF9HUFhFX0lCX1NNQ19ICisKKy8qKiBAZmlsZQorICoKKyAqIEluZmluaWJhbmQgU3VibmV0IE1hbmFnZW1lbnQgQ2xpZW50CisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvaW5maW5pYmFuZC5oPgorCit0eXBlZGVmIGludCAoICogaWJfbG9jYWxfbWFkX3QgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSAgIHVuaW9uIGliX21hZCAqbWFkICk7CisKK2V4dGVybiBpbnQgaWJfc21jX3VwZGF0ZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgaWJfbG9jYWxfbWFkX3QgbG9jYWxfbWFkICk7CisKKyNlbmRpZiAvKiBfR1BYRV9JQl9TTUNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX3NycC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2liX3NycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzA1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWJfc3JwLmgKQEAgLTAsMCArMSw3OSBAQAorI2lmbmRlZiBfR1BYRV9JQl9TUlBfSAorI2RlZmluZSBfR1BYRV9JQl9TUlBfSAorCisvKiogQGZpbGUKKyAqCisgKiBTQ1NJIFJETUEgUHJvdG9jb2wgb3ZlciBJbmZpbmliYW5kCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEJTRDIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvaW5maW5pYmFuZC5oPgorI2luY2x1ZGUgPGdweGUvc3JwLmg+CisKKy8qKiBTUlAgaW5pdGlhdG9yIHBvcnQgaWRlbnRpZmllciBmb3IgSW5maW5pYmFuZCAqLworc3RydWN0IGliX3NycF9pbml0aWF0b3JfcG9ydF9pZCB7CisJLyoqIElkZW50aWZpZXIgZXh0ZW5zaW9uICovCisJc3RydWN0IGliX2dpZF9oYWxmIGlkX2V4dDsKKwkvKiogSUIgY2hhbm5lbCBhZGFwdGVyIEdVSUQgKi8KKwlzdHJ1Y3QgaWJfZ2lkX2hhbGYgaGNhX2d1aWQ7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogU1JQIHRhcmdldCBwb3J0IGlkZW50aWZpZXIgZm9yIEluZmluaWJhbmQgKi8KK3N0cnVjdCBpYl9zcnBfdGFyZ2V0X3BvcnRfaWQgeworCS8qKiBJZGVudGlmaWVyIGV4dGVuc2lvbiAqLworCXN0cnVjdCBpYl9naWRfaGFsZiBpZF9leHQ7CisJLyoqIEkvTyBjb250cm9sbGVyIEdVSUQgKi8KKwlzdHJ1Y3QgaWJfZ2lkX2hhbGYgaW9jX2d1aWQ7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKioKKyAqIEdldCBJbmZpbmliYW5kLXNwZWNpZmljIGluaXRpYXRvciBwb3J0IElECisgKgorICogQHYgcG9ydF9pZHMJCVNSUCBwb3J0IElEcworICogQHJldCBpbml0aWF0b3JfcG9ydF9pZCAgSW5maW5pYmFuZC1zcGVjaWZpYyBpbml0aWF0b3IgcG9ydCBJRAorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBzdHJ1Y3QgaWJfc3JwX2luaXRpYXRvcl9wb3J0X2lkICoKK2liX3NycF9pbml0aWF0b3JfcG9ydF9pZCAoIHN0cnVjdCBzcnBfcG9ydF9pZHMgKnBvcnRfaWRzICkgeworCXJldHVybiAoICggc3RydWN0IGliX3NycF9pbml0aWF0b3JfcG9ydF9pZCAqICkgJnBvcnRfaWRzLT5pbml0aWF0b3IgKTsKK30KKworLyoqCisgKiBHZXQgSW5maW5pYmFuZC1zcGVjaWZpYyB0YXJnZXQgcG9ydCBJRAorICoKKyAqIEB2IHBvcnRfaWRzCQlTUlAgcG9ydCBJRHMKKyAqIEByZXQgdGFyZ2V0X3BvcnRfaWQJSW5maW5pYmFuZC1zcGVjaWZpYyB0YXJnZXQgcG9ydCBJRAorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBzdHJ1Y3QgaWJfc3JwX3RhcmdldF9wb3J0X2lkICoKK2liX3NycF90YXJnZXRfcG9ydF9pZCAoIHN0cnVjdCBzcnBfcG9ydF9pZHMgKnBvcnRfaWRzICkgeworCXJldHVybiAoICggc3RydWN0IGliX3NycF90YXJnZXRfcG9ydF9pZCAqICkgJnBvcnRfaWRzLT50YXJnZXQgKTsKK30KKworLyoqIEluZmluaWJhbmQtc3BlY2lmaWMgU1JQIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBpYl9zcnBfcGFyYW1ldGVycyB7CisJLyoqIFNvdXJjZSBHSUQgKi8KKwlzdHJ1Y3QgaWJfZ2lkIHNnaWQ7CisJLyoqIERlc3RpbmF0aW9uIEdJRCAqLworCXN0cnVjdCBpYl9naWQgZGdpZDsKKwkvKiogU2VydmljZSBJRCAqLworCXN0cnVjdCBpYl9naWRfaGFsZiBzZXJ2aWNlX2lkOworCS8qKiBQYXJ0aXRpb24ga2V5ICovCisJdWludDE2X3QgcGtleTsKK307CisKKy8qKgorICogR2V0IEluZmluaWJhbmQtc3BlY2lmaWMgdHJhbnNwb3J0IHBhcmFtZXRlcnMKKyAqCisgKiBAdiBzcnAJCVNSUCBkZXZpY2UKKyAqIEByZXQgaWJfcGFyYW1zCUluZmluaWJhbmQtc3BlY2lmaWMgdHJhbnNwb3J0IHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgc3RydWN0IGliX3NycF9wYXJhbWV0ZXJzICoKK2liX3NycF9wYXJhbXMgKCBzdHJ1Y3Qgc3JwX2RldmljZSAqc3JwICkgeworCXJldHVybiBzcnBfdHJhbnNwb3J0X3ByaXYgKCBzcnAgKTsKK30KKworZXh0ZXJuIHN0cnVjdCBzcnBfdHJhbnNwb3J0X3R5cGUgaWJfc3JwX3RyYW5zcG9ydDsKKworI2VuZGlmIC8qIF9HUFhFX0lCX1NSUF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWNtcC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2ljbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhmY2U4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2ljbXAuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9HUFhFX0lDTVBfSAorI2RlZmluZSBfR1BYRV9JQ01QX0gKKworLyoqIEBmaWxlCisgKgorICogSUNNUCBwcm90b2NvbAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKiBBbiBJQ01QIGhlYWRlciAqLworc3RydWN0IGljbXBfaGVhZGVyIHsKKwkvKiogVHlwZSAqLworCXVpbnQ4X3QgdHlwZTsKKwkvKiogQ29kZSAqLworCXVpbnQ4X3QgY29kZTsKKwkvKiogQ2hlY2tzdW0gKi8KKwl1aW50MTZfdCBjaGtzdW07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisjZGVmaW5lIElDTVBfRUNIT19SRVNQT05TRSAwCisjZGVmaW5lIElDTVBfRUNIT19SRVFVRVNUIDgKKworI2VuZGlmIC8qIF9HUFhFX0lDTVBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2ljbXA2LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWNtcDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZkMWViCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2ljbXA2LmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBfR1BYRV9JQ01QNl9ICisjZGVmaW5lIF9HUFhFX0lDTVA2X0gKKworLyoqIEBmaWxlCisgKgorICogSUNNUDYgcHJvdG9jb2wKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9pcDYuaD4KKyNpbmNsdWRlIDxncHhlL25kcC5oPgorCisjZGVmaW5lIElDTVA2X05TT0xJQ0lUIDEzNQorI2RlZmluZSBJQ01QNl9OQURWRVJUIDEzNgorCitleHRlcm4gc3RydWN0IHRjcGlwX3Byb3RvY29sIGljbXA2X3Byb3RvY29sOworCitzdHJ1Y3QgaWNtcDZfaGVhZGVyIHsKKwl1aW50OF90IHR5cGU7CisJdWludDhfdCBjb2RlOworCXVpbnQxNl90IGNzdW07CisJLyogTWVzc2FnZSBib2R5ICovCit9OworCitzdHJ1Y3QgbmVpZ2hib3VyX3NvbGljaXQgeworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGNvZGU7CisJdWludDE2X3QgY3N1bTsKKwl1aW50MzJfdCByZXNlcnZlZDsKKwlzdHJ1Y3QgaW42X2FkZHIgdGFyZ2V0OworCS8qICJDb21wdWxzb3J5IiBvcHRpb25zICovCisJdWludDhfdCBvcHRfdHlwZTsKKwl1aW50OF90IG9wdF9sZW47CisgIC8qIEZJWE1FOiAgaGFjayBhbGVydCAqLworCXVpbnQ4X3Qgb3B0X2xsX2FkZHJbNl07Cit9OworCitzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydCB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgY29kZTsKKwl1aW50MTZfdCBjc3VtOworCXVpbnQ4X3QgZmxhZ3M7CisJdWludDhfdCByZXNlcnZlZDsKKwlzdHJ1Y3QgaW42X2FkZHIgdGFyZ2V0OworCXVpbnQ4X3Qgb3B0X3R5cGU7CisJdWludDhfdCBvcHRfbGVuOworICAvKiBGSVhNRTogIGhhY2sgYWxlcnQgKi8KKwl1aW50OF90IG9wdF9sbF9hZGRyWzZdOworfTsKKworI2RlZmluZSBJQ01QNl9GTEFHU19ST1VURVIgMHg4MAorI2RlZmluZSBJQ01QNl9GTEFHU19TT0xJQ0lURUQgMHg0MAorI2RlZmluZSBJQ01QNl9GTEFHU19PVkVSUklERSAweDIwCisKK2ludCBpY21wNl9zZW5kX3NvbGljaXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKnNyYywgc3RydWN0IGluNl9hZGRyICpkZXN0ICk7CisKKyNlbmRpZiAvKiBfR1BYRV9JQ01QNl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWVlZTgwMjExLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViMTBjMwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pZWVlODAyMTEuaApAQCAtMCwwICsxLDExNjAgQEAKKyNpZm5kZWYgX0dQWEVfSUVFRTgwMjExX0gKKyNkZWZpbmUgX0dQWEVfSUVFRTgwMjExX0gKKworI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4JLyogZm9yIEVUSF9BTEVOICovCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKy8qKiBAZmlsZQorICogQ29uc3RhbnRzIGFuZCBkYXRhIHN0cnVjdHVyZXMgZGVmaW5lZCBpbiBJRUVFIDgwMi4xMSwgc3Vic2V0dGVkCisgKiBhY2NvcmRpbmcgdG8gd2hhdCBnUFhFIGtub3dzIGhvdyB0byB1c2UuCisgKi8KKworRklMRV9MSUNFTkNFKEdQTDJfT1JfTEFURVIpOworCisvKiAtLS0tLS0tLS0tIE1heGltdW0gbGVuZ3RocyBvZiB0aGluZ3MgLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEBkZWZncm91cCBpZWVlODAyMTFfbWF4bGVuIE1heGltdW0gbGVuZ3RocyBpbiB0aGUgODAyLjExIHByb3RvY29sCisgKiBAeworICovCisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiBmcmFtZSBwYXlsb2FkCisgKgorICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGNyeXB0b2dyYXBoaWMgb3ZlcmhlYWQsIHdoaWNoIGNhbiBiZSB1cCB0byAyMAorICogYnl0ZXMsIGJ1dCBpdCBET0VTIGluY2x1ZGUgdGhlIDgwMi4yIExMQy9TTkFQIGhlYWRlcnMgdGhhdCBhcmUgdXNlZAorICogb24gZGF0YSBmcmFtZXMgKGJ1dCBub3QgbWFuYWdlbWVudCBmcmFtZXMpLgorICovCisjZGVmaW5lIElFRUU4MDIxMV9NQVhfREFUQV9MRU4gICAgICAgICAgMjMwNAorCisvKiogTGVuZ3RoIG9mIExMQy9TTkFQIGhlYWRlcnMgb24gZGF0YSBmcmFtZXMgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0xMQ19IRUFERVJfTEVOCTgKKworLyoqIE1heGltdW0gY3J5cHRvZ3JhcGhpYyBvdmVyaGVhZCBiZWZvcmUgZW5jcnlwdGVkIGRhdGEgKi8KKyNkZWZpbmUgSUVFRTgwMjExX01BWF9DUllQVE9fSEVBREVSCTgKKworLyoqIE1heGltdW0gY3J5cHRvZ3JhcGhpYyBvdmVyaGVhZCBhZnRlciBlbmNyeXB0ZWQgZGF0YQorICoKKyAqIFRoaXMgZG9lcyBub3QgY291bnQgdGhlIE1JQyBpbiBUS0lQIGZyYW1lcywgc2luY2UgdGhhdCBpcworICogY29uc2lkZXJlZCB0byBiZSBwYXJ0IG9mIHRoZSBNU0RVIGFuZCB0aHVzIGNvbnRyaWJ1dGVzIHRvIHRoZSBzaXplCisgKiBvZiB0aGUgZGF0YSBmaWVsZC4KKyAqCisgKiBJdCBAZSBkb2VzIGNvdW50IHRoZSBNSUMgaW4gQ0NNUCBmcmFtZXMsIHdoaWNoIGlzIGNvbnNpZGVyZWQgcGFydAorICogb2YgdGhlIE1QRFUgKG91dHNpZGUgdGhlIGRhdGEgZmllbGQpLgorICovCisjZGVmaW5lIElFRUU4MDIxMV9NQVhfQ1JZUFRPX1RSQUlMRVIgICAgOAorCisvKiogVG90YWwgbWF4aW11bSBjcnlwdG9ncmFwaGljIG92ZXJoZWFkICovCisjZGVmaW5lIElFRUU4MDIxMV9NQVhfQ1JZUFRPX09WRVJIRUFECTE2CisKKy8qKiBCeXRlcyBvZiBuZXR3b3JrLWxheWVyIGRhdGEgdGhhdCBjYW4gZ28gaW50byBhIHJlZ3VsYXIgZGF0YSBmcmFtZSAqLworI2RlZmluZSBJRUVFODAyMTFfTUFYX0ZSQU1FX0RBVEEJMjI5NgorCisvKiogRnJhbWUgaGVhZGVyIGxlbmd0aCBmb3IgZnJhbWVzIHdlIG1pZ2h0IHdvcmsgd2l0aAorICoKKyAqIFFvUyBhZGRzIGEgdHdvLWJ5dGUgZmllbGQgb24gdG9wIG9mIHRoaXMsIGFuZCBBUHMgY29tbXVuaWNhdGluZworICogd2l0aCBlYWNoIG90aGVyIGluIFdpcmVsZXNzIERpc3RyaWJ1dGlvbiBTeXN0ZW0gKFdEUykgbW9kZSBhZGQgYW4KKyAqIGV4dHJhIDYtYnl0ZSBNQUMgYWRkcmVzcyBmaWVsZCwgYnV0IHdlIGRvIG5vdCB3b3JrIHdpdGggc3VjaAorICogZnJhbWVzLgorICovCisjZGVmaW5lIElFRUU4MDIxMV9UWVBfRlJBTUVfSEVBREVSX0xFTgkyNAorCisvKiogVGhlb3JldGljYWwgbWF4aW11bSBmcmFtZSBoZWFkZXIgbGVuZ3RoCisgKgorICogVGhpcyBpbmNsdWRlcyB0aGUgUW9TIGFuZCBXRFMgQWRkcjQgZmllbGRzIHRoYXQgd2Ugc2hvdWxkIG5ldmVyCisgKiBzZWUuCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX01BWF9GUkFNRV9IRUFERVJfTEVOCTMyCisKKy8qKiBNYXhpbXVtIGNvbWJpbmVkIGZyYW1lIGxlbmd0aAorICoKKyAqIFRoZSBiaWdnZXN0IGZyYW1lIHdpbGwgaW5jbHVkZSAzMiBmcmFtZSBoZWFkZXIgYnl0ZXMsIDE2IGJ5dGVzIG9mCisgKiBjcnlwdG8gb3ZlcmhlYWQsIGFuZCAyMzA0IGRhdGEgYnl0ZXMuCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX01BWF9GUkFNRV9MRU4gICAgICAgICAyMzUyCisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBFU1NJRCAqLworI2RlZmluZSBJRUVFODAyMTFfTUFYX1NTSURfTEVOICAgICAgICAgIDMyCisKKy8qKiBAfSAqLworCisKKy8qIC0tLS0tLS0tLS0gRnJhbWUgQ29udHJvbCBkZWZpbmVzIC0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgaWVlZTgwMjExX2ZjIDgwMi4xMSBGcmFtZSBDb250cm9sIGZpZWxkIGJpdHMKKyAqIEB7CisgKi8KKworLyoqIDgwMi4xMSBGcmFtZSBDb250cm9sIGZpZWxkLCBWZXJzaW9uIGJpdG1hc2sgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDX1ZFUlNJT04JMHgwMDAzCisKKy8qKiBFeHBlY3RlZCB2YWx1ZSBvZiBWZXJzaW9uIGJpdHMgaW4gRnJhbWUgQ29udHJvbCAqLworI2RlZmluZSAgSUVFRTgwMjExX1RISVNfVkVSU0lPTiAgMHgwMDAwCisKKworLyoqIDgwMi4xMSBGcmFtZSBDb250cm9sIGZpZWxkLCBGcmFtZSBUeXBlIGJpdG1hc2sgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDX1RZUEUJMHgwMDBDCisKKy8qKiBUeXBlIHZhbHVlIGZvciBtYW5hZ2VtZW50IChsYXllci0yKSBmcmFtZXMgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9UWVBFX01HTVQgICAgIDB4MDAwMAorCisvKiogVHlwZSB2YWx1ZSBmb3IgY29udHJvbCAobGF5ZXItMSwgaGFyZHdhcmUtbWFuYWdlZCkgZnJhbWVzICovCisjZGVmaW5lICBJRUVFODAyMTFfVFlQRV9DVFJMICAgICAweDAwMDQKKworLyoqIFR5cGUgdmFsdWUgZm9yIGRhdGEgZnJhbWVzICovCisjZGVmaW5lICBJRUVFODAyMTFfVFlQRV9EQVRBICAgICAweDAwMDgKKworCisvKiogODAyLjExIEZyYW1lIENvbnRyb2wgZmllbGQsIEZyYW1lIFN1YnR5cGUgYml0bWFzayAqLworI2RlZmluZSBJRUVFODAyMTFfRkNfU1VCVFlQRQkweDAwRjAKKworLyoqIFN1YnR5cGUgdmFsdWUgZm9yIGFzc29jaWF0aW9uLXJlcXVlc3QgbWFuYWdlbWVudCBmcmFtZXMKKyAqCisgKiBBc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcyBhcmUgc2VudCBhZnRlciBhdXRoZW50aWNhdGlvbiBmcm9tIHRoZQorICogY2xpZW50IHRvIHRoZSBBY2Nlc3MgUG9pbnQgdG8gZXN0YWJsaXNoIHRoZSBjbGllbnQgYXMgcGFydCBvZiB0aGUKKyAqIEFjY2VzcyBQb2ludCdzIG5ldHdvcmsuCisgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEgICAgMHgwMDAwCisKKy8qKiBTdWJ0eXBlIHZhbHVlIGZvciBhc3NvY2lhdGlvbi1yZXNwb25zZSBtYW5hZ2VtZW50IGZyYW1lcworICoKKyAqIEFzc29jaWF0aW9uIHJlc3BvbnNlIGZyYW1lcyBhcmUgc2VudCBieSB0aGUgQWNjZXNzIFBvaW50IHRvIGNvbmZpcm0KKyAqIG9yIGRlbnkgdGhlIGFzc29jaWF0aW9uIHJlcXVlc3RlZCBpbiBhbiBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lLgorICovCisjZGVmaW5lICBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCAgIDB4MDAxMAorCisvKiogU3VidHlwZSB2YWx1ZSBmb3IgcmVhc3NvY2lhdGlvbi1yZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWVzCisgKgorICogUmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcyBhcmUgc2VudCBieSBjbGllbnRzIHdpc2hpbmcgdG8gY2hhbmdlCisgKiBmcm9tIG9uZSBBY2Nlc3MgUG9pbnQgdG8gYW5vdGhlciB3aGlsZSByb2FtaW5nIHdpdGhpbiB0aGUgc2FtZQorICogZXh0ZW5kZWQgbmV0d29yayAoc2FtZSBFU1NJRCkuCisgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUSAgMHgwMDIwCisKKy8qKiBTdWJ0eXBlIHZhbHVlIGZvciByZWFzc29jaWF0aW9uLXJlc3BvbnNlIG1hbmFnZW1lbnQgZnJhbWVzCisgKgorICogUmVhc3NvY2lhdGlvbiByZXNwb25zZSBmcmFtZXMgYXJlIHNlbnQgYnkgdGhlIEFjY2VzcyBQb2ludCB0bworICogY29uZmlybSBvciBkZW55IHRoZSBzd2FwIHJlcXVlc3RlZCBpbiBhIHJlYXNzb2NpYXRpb24gcmVxdWVzdAorICogZnJhbWUuCisgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1AgMHgwMDMwCisKKy8qKiBTdWJ0eXBlIHZhbHVlIGZvciBwcm9iZS1yZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWVzCisgKgorICogUHJvYmUgcmVxdWVzdCBmcmFtZXMgYXJlIHNlbnQgYnkgY2xpZW50cyB0byByZXF1ZXN0IHRoYXQgYWxsIEFjY2VzcworICogUG9pbnRzIG9uIHRoZSBzZW5kaW5nIGNoYW5uZWwsIG9yIGFsbCBiZWxvbmdpbmcgdG8gYSBwYXJ0aWN1bGFyCisgKiBFU1NJRCwgaWRlbnRpZnkgdGhlbXNlbHZlcyBieSBCU1NJRCwgc3VwcG9ydGVkIHRyYW5zZmVyIHJhdGVzLCBSRgorICogY29uZmlndXJhdGlvbiwgYW5kIG90aGVyIGNhcGFiaWxpdGllcy4KKyAqLworI2RlZmluZSAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSAgICAweDAwNDAKKworLyoqIFN1YnR5cGUgdmFsdWUgZm9yIHByb2JlLXJlc3BvbnNlIG1hbmFnZW1lbnQgZnJhbWVzCisgKgorICogUHJvYmUgcmVzcG9uc2UgZnJhbWVzIGFyZSBzZW50IGJ5IEFjY2VzcyBQb2ludHMgaW4gcmVzcG9uc2UgdG8KKyAqIHByb2JlIHJlcXVlc3QgZnJhbWVzLCBwcm92aWRpbmcgdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZSAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgICAweDAwNTAKKworLyoqIFN1YnR5cGUgdmFsdWUgZm9yIGJlYWNvbiBtYW5hZ2VtZW50IGZyYW1lcworICoKKyAqIEJlYWNvbiBmcmFtZXMgYXJlIHNlbnQgYnkgQWNjZXNzIFBvaW50cyBhdCByZWd1bGFyIGludGVydmFscywKKyAqIHVzdWFsbHkgdGVuIHBlciBzZWNvbmQsIG9uIHRoZSBjaGFubmVsIG9uIHdoaWNoIHRoZXkgY29tbXVuaWNhdGUuCisgKiBUaGV5IGNhbiBiZSB1c2VkIHRvIHByb2JlIHBhc3NpdmVseSBmb3IgYWNjZXNzIHBvaW50cyBvbiBhIGNoYW5uZWwKKyAqIHdoZXJlIGxvY2FsIHJlZ3VsYXRvcnkgcmVzdHJpY3Rpb25zIHByb2hpYml0IGFjdGl2ZSBzY2FubmluZywgb3IKKyAqIGR1ZSB0byB0aGVpciByZWd1bGFyaXR5IGFzIGEgbWVjaGFuaXNtIHRvIGRldGVybWluZSB0aGUgZnJhY3Rpb24gb2YKKyAqIHBhY2tldHMgdGhhdCBhcmUgYmVpbmcgZHJvcHBlZC4KKyAqLworI2RlZmluZSAgSUVFRTgwMjExX1NUWVBFX0JFQUNPTiAgICAgICAweDAwODAKKworLyoqIFN1YnR5cGUgdmFsdWUgZm9yIGRpc2Fzc29jaWF0aW9uIG1hbmFnZW1lbnQgZnJhbWVzCisgKgorICogRGlzYXNzb2NpYXRpb24gZnJhbWVzIGFyZSBzZW50IGJ5IGVpdGhlciBhIGNsaWVudCBvciBhbiBBY2Nlc3MKKyAqIFBvaW50IHRvIHVuZXF1aXZvY2FsbHkgdGVybWluYXRlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSB0d28uCisgKiBUaGV5IG1heSBiZSBzZW50IGJ5IGNsaWVudHMgdXBvbiBsZWF2aW5nIHRoZSBuZXR3b3JrLCBvciBieSBhbgorICogQWNjZXNzIFBvaW50IHVwb24gcmVjb25maWd1cmF0aW9uLCBhbW9uZyBvdGhlciByZWFzb25zOyB0aGV5IGFyZQorICogdXN1YWxseSBtb3JlICJwb2xpdGUiIHRoYW4gZGVhdXRoZW50aWNhdGlvbiBmcmFtZXMuCisgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyAgICAgMHgwMEEwCisKKy8qKiBTdWJ0eXBlIHZhbHVlIGZvciBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IGZyYW1lcworICoKKyAqIEF1dGhlbnRpY2F0aW9uIGZyYW1lcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gYSBjbGllbnQgYW5kIGFuIEFjY2VzcworICogUG9pbnQgYmVmb3JlIGFzc29jaWF0aW9uIG1heSBiZSBwZXJmb3JtZWQuIENvbmZ1c2luZ2x5LCBpbiB0aGUgbW9zdAorICogY29tbW9uIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCAoT3BlbiBTeXN0ZW0pIG5vIHNlY3VyaXR5IHRva2VucyBhcmUKKyAqIGV4Y2hhbmdlZCBhdCBhbGwuIE1vZGVybiA4MDIuMTEgc2VjdXJpdHkgaGFuZHNoYWtpbmcgdGFrZXMgcGxhY2UKKyAqIGFmdGVyIGFzc29jaWF0aW9uLgorICovCisjZGVmaW5lICBJRUVFODAyMTFfU1RZUEVfQVVUSCAgICAgICAgIDB4MDBCMAorCisvKiogU3VidHlwZSB2YWx1ZSBmb3IgZGVhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IGZyYW1lcworICoKKyAqIERlYXV0aGVudGljYXRpb24gZnJhbWVzIGFyZSBzZW50IGJ5IGVpdGhlciBhIGNsaWVudCBvciBhbiBBY2Nlc3MKKyAqIFBvaW50IHRvIHRlcm1pbmF0ZSB0aGUgYXV0aGVudGljYXRpb24gKGFuZCB0aGVyZWZvcmUgYWxzbyB0aGUKKyAqIGFzc29jaWF0aW9uKSBiZXR3ZWVuIHRoZSB0d28uIFRoZXkgYXJlIGdlbmVyYWxseSBtb3JlIGZvcmNlZnVsIHRoYW4KKyAqIGRpc2Fzc29jaWF0aW9uIGZyYW1lcywgc2VudCBmb3Igc3VjaCByZWFzb25zIGFzIGEgZmFpbHVyZSB0bworICogc2V0IHVwIHNlY3VyaXR5IHByb3Blcmx5IGFmdGVyIGFzc29jaWF0aW5nLgorICovCisjZGVmaW5lICBJRUVFODAyMTFfU1RZUEVfREVBVVRIICAgICAgIDB4MDBDMAorCisvKiogU3VidHlwZSB2YWx1ZSBmb3IgYWN0aW9uIG1hbmFnZW1lbnQgZnJhbWVzCisgKgorICogQWN0aW9uIGZyYW1lcyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgc3BlY3RydW0gbWFuYWdlbWVudCBhbmQgUW9TCisgKiBmZWF0dXJlcyB0aGF0IGdQWEUgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9TVFlQRV9BQ1RJT04JICAgICAgMHgwMEQwCisKKworLyoqIFN1YnR5cGUgdmFsdWUgZm9yIFJUUyAocmVxdWVzdCB0byBzZW5kKSBjb250cm9sIGZyYW1lcyAqLworI2RlZmluZSAgSUVFRTgwMjExX1NUWVBFX1JUUyAgICAgICAgICAweDAwQjAKKworLyoqIFN1YnR5cGUgdmFsdWUgZm9yIENUUyAoY2xlYXIgdG8gc2VuZCkgY29udHJvbCBmcmFtZXMgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9TVFlQRV9DVFMgICAgICAgICAgMHgwMEMwCisKKy8qKiBTdWJ0eXBlIHZhbHVlIGZvciBBQ0sgKGFja25vd2xlZGdlbWVudCkgY29udHJvbCBmcmFtZXMgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9TVFlQRV9BQ0sgICAgICAgICAgMHgwMEQwCisKKworLyoqIFN1YnR5cGUgdmFsdWUgZm9yIG9yZGluYXJ5IGRhdGEgZnJhbWVzLCB3aXRoIG5vIFFvUyBvciBDRiBhZGQtb25zICovCisjZGVmaW5lICBJRUVFODAyMTFfU1RZUEVfREFUQSAgICAgICAgIDB4MDAwMAorCisvKiogU3VidHlwZSB2YWx1ZSBmb3IgZGF0YSBmcmFtZXMgY29udGFpbmluZyBubyBkYXRhICovCisjZGVmaW5lICBJRUVFODAyMTFfU1RZUEVfTk9EQVRBICAgICAgIDB4MDA0MAorCisKKy8qKiA4MDIuMTEgRnJhbWUgQ29udHJvbCBmaWVsZDogVG8gRGF0YSBTeXN0ZW0gZmxhZworICoKKyAqIFRoaXMgaXMgc2V0IG9uIGRhdGEgZnJhbWVzIHNlbnQgdG8gYW4gQWNjZXNzIFBvaW50LgorICovCisjZGVmaW5lIElFRUU4MDIxMV9GQ19UT0RTICAgICAgIDB4MDEwMAorCisvKiogODAyLjExIEZyYW1lIENvbnRyb2wgZmllbGQ6IEZyb20gRGF0YSBTeXN0ZW0gZmxhZworICoKKyAqIFRoaXMgaXMgc2V0IG9uIGRhdGEgZnJhbWVzIHNlbnQgZnJvbSBhbiBBY2Nlc3MgUG9pbnQuIElmIGJvdGggVE9EUworICogYW5kIEZST01EUyBhcmUgc2V0LCB0aGUgZnJhbWUgaGVhZGVyIGlzIGEgNC1hZGRyZXNzIGZvcm1hdCB1c2VkIGZvcgorICogaW50ZXItQWNjZXNzIFBvaW50IGNvbW11bmljYXRpb24uCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDX0ZST01EUyAgICAgMHgwMjAwCisKKy8qKiA4MDIuMTEgRnJhbWUgQ29udHJvbCBmaWVsZDogTW9yZSBGcmFnbWVudHMgZmxhZyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNfTU9SRV9GUkFHICAweDA0MDAKKworLyoqIDgwMi4xMSBGcmFtZSBDb250cm9sIGZpZWxkOiBSZXRyYW5zbWlzc2lvbiBmbGFnICovCisjZGVmaW5lIElFRUU4MDIxMV9GQ19SRVRSWSAgICAgIDB4MDgwMAorCisvKiogODAyLjExIEZyYW1lIENvbnRyb2wgZmllbGQ6IFBvd2VyIE1hbmFnZWQgZmxhZworICoKKyAqIFRoaXMgaXMgc2V0IG9uIGFueSBmcmFtZSBzZW50IGJ5IGEgbG93LXBvd2VyIHN0YXRpb24gdGhhdCB3aWxsIGdvCisgKiBpbnRvIGEgcG93ZXItc2F2aW5nIG1vZGUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBmcmFtZS4gQWNjZXNzCisgKiBQb2ludHMgYXJlIG5vdCBhbGxvd2VkIHRvIGFjdCBhcyBsb3ctcG93ZXIgc3RhdGlvbnMuCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDX1BXUl9NR01UICAgMHgxMDAwCisKKy8qKiA4MDIuMTEgRnJhbWUgQ29udHJvbCBmaWVsZDogTW9yZSBEYXRhIGZsYWcKKyAqCisgKiBUaGlzIGlzIHNldCBvbiBhbnkgZnJhbWUgc2VudCBieSBhIHN0YXRpb24gdGhhdCBoYXMgbW9yZSBkYXRhCisgKiBxdWV1ZWQgdG8gYmUgc2VudCB0aGFuIGlzIGluIHRoZSBmcmFtZS4KKyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNfTU9SRV9EQVRBICAweDIwMDAKKworLyoqIDgwMi4xMSBGcmFtZSBDb250cm9sIGZpZWxkOiBQcm90ZWN0ZWQgZmxhZworICoKKyAqIFRoaXMgaXMgc2V0IG9uIGZyYW1lcyBpbiB3aGljaCBkYXRhIGlzIGVuY3J5cHRlZCAoYnkgYW55IG1ldGhvZCkuCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDX1BST1RFQ1RFRCAgMHg0MDAwCisKKy8qKiA4MDIuMTEgRnJhbWUgQ29udHJvbCBmaWVsZDogT3JkZXJlZCBmbGFnIFs/XSAqLworI2RlZmluZSBJRUVFODAyMTFfRkNfT1JERVIgICAgICAweDgwMDAKKworLyoqIEB9ICovCisKKworLyogLS0tLS0tLS0tLSBTZXF1ZW5jZSBDb250cm9sIGRlZmluZXMgLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEBkZWZncm91cCBpZWVlODAyMTFfc2VxIDgwMi4xMSBTZXF1ZW5jZSBDb250cm9sIGZpZWxkIGhhbmRsaW5nCisgKiBAeworICovCisKKy8qKiBFeHRyYWN0IHNlcXVlbmNlIG51bWJlciBmcm9tIDgwMi4xMSBTZXF1ZW5jZSBDb250cm9sIGZpZWxkICovCisjZGVmaW5lIElFRUU4MDIxMV9TRVFOUiggc2VxICkJCSggKCBzZXEgKSA+PiA0ICkKKworLyoqIEV4dHJhY3QgZnJhZ21lbnQgbnVtYmVyIGZyb20gODAyLjExIFNlcXVlbmNlIENvbnRyb2wgZmllbGQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZSQUcoIHNlcSApCQkoICggc2VxICkgJiAweDAwMEYgKQorCisvKiogTWFrZSA4MDIuMTEgU2VxdWVuY2UgQ29udHJvbCBmaWVsZCBmcm9tIHNlcXVlbmNlIGFuZCBmcmFnbWVudCBudW1iZXJzICovCisjZGVmaW5lIElFRUU4MDIxMV9NQUtFU0VRKCBzZXFuciwgZnJhZyApCVwKKwkoICggKCAoIHNlcW5yICkgJiAweEZGRiApIDw8IDQgKSB8ICggKCBmcmFnICkgJiAweEYgKSApCisKKy8qKiBAfSAqLworCisKKy8qIC0tLS0tLS0tLS0gRnJhbWUgaGVhZGVyIGZvcm1hdHMgLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEBkZWZncm91cCBpZWVlODAyMTFfaGRyIDgwMi4xMSBmcmFtZSBoZWFkZXIgZm9ybWF0cworICogQHsKKyAqLworCisvKiogQW4gODAyLjExIGRhdGEgb3IgbWFuYWdlbWVudCBmcmFtZSB3aXRob3V0IFFvUyBvciBXRFMgaGVhZGVyIGZpZWxkcyAqLworc3RydWN0IGllZWU4MDIxMV9mcmFtZQoreworCXUxNiBmYzsJCQkvKio8IDgwMi4xMSBGcmFtZSBDb250cm9sIGZpZWxkICovCisJdTE2IGR1cmF0aW9uOwkJLyoqPCBNaWNyb3NlY29uZHMgdG8gcmVzZXJ2ZSBsaW5rICovCisJdTggYWRkcjFbRVRIX0FMRU5dOwkvKio8IEFkZHJlc3MgMSAoaW1tZWRpYXRlIHJlY2VpdmVyKSAqLworCXU4IGFkZHIyW0VUSF9BTEVOXTsJLyoqPCBBZGRyZXNzIDIgKGltbWVkaWF0ZSBzZW5kZXIpICovCisJdTggYWRkcjNbRVRIX0FMRU5dOwkvKio8IEFkZHJlc3MgMyAob2Z0ZW4gImZvcndhcmQgdG8iKSAqLworCXUxNiBzZXE7CQkvKio8IDgwMi4xMSBTZXF1ZW5jZSBDb250cm9sIGZpZWxkICovCisJdTggZGF0YVswXTsJCS8qKjwgQmVnaW5uaW5nIG9mIGZyYW1lIGRhdGEgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKiBUaGUgODAyLjIgTExDL1NOQVAgaGVhZGVyIHNlbnQgYmVmb3JlIGFjdHVhbCBkYXRhIGluIGEgZGF0YSBmcmFtZQorICoKKyAqIFRoaXMgaGVhZGVyIGlzIG5vdCBhY2tub3dsZWRnZWQgaW4gdGhlIDgwMi4xMSBzdGFuZGFyZCBhdCBhbGw7IGl0CisgKiBpcyB0cmVhdGVkIGp1c3QgbGlrZSBkYXRhIGZvciBNQUMtbGF5ZXIgcHVycG9zZXMsIGluY2x1ZGluZworICogZnJhZ21lbnRhdGlvbiBhbmQgZW5jcnlwdGlvbi4gSXQgaXMgYWN0dWFsbHkgdHdvIGhlYWRlcnMKKyAqIGNvbmNhdGVuYXRlZDogYSB0aHJlZS1ieXRlIDgwMi4yIExMQyBoZWFkZXIgaW5kaWNhdGluZyBTdWJuZXR3b3JrCisgKiBBY2Nlc3NzIFByb3RvY29sIChTTkFQKSBpbiBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gU2VydmljZQorICogQWNjZXNzIFBvaW50IChTQVApIGZpZWxkcywgYW5kIGEgZml2ZS1ieXRlIFNOQVAgaGVhZGVyIGluZGljYXRpbmcgYQorICogemVybyBPVUkgYW5kIHR3by1ieXRlIEV0aGVybmV0IHByb3RvY29sIHR5cGUgZmllbGQuCisgKgorICogVGh1cywgYW4gZWlnaHQtYnl0ZSBoZWFkZXIgaW4gd2hpY2ggc2l4IG9mIHRoZSBieXRlcyBhcmUgcmVkdW5kYW50LgorICogTG92ZWx5LCBpc24ndCBpdD8KKyAqLworc3RydWN0IGllZWU4MDIxMV9sbGNfc25hcF9oZWFkZXIKK3sKKwkvKiBMTEMgcGFydDogKi8KKwl1OCBkc2FwOwkJLyoqPCBEZXN0aW5hdGlvbiBTQVAgSUQgKi8KKwl1OCBzc2FwOwkJLyoqPCBTb3VyY2UgU0FQIElEICovCisJdTggY3RybDsJCS8qKjwgQ29udHJvbCBpbmZvcm1hdGlvbiAqLworCisJLyogU05BUCBwYXJ0OiAqLworCXU4IG91aVszXTsJCS8qKjwgT3JnYW5pemF0aW9uIGNvZGUsIHVzdWFsbHkgMCAqLworCXUxNiBldGhlcnR5cGU7CQkvKio8IEV0aGVybmV0IFR5cGUgZmllbGQgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKiBWYWx1ZSBmb3IgRFNBUCBmaWVsZCBpbiA4MDIuMiBMTEMgaGVhZGVyIGZvciA4MDIuMTEgZnJhbWVzOiBTTkFQICovCisjZGVmaW5lIElFRUU4MDIxMV9MTENfRFNBUAkweEFBCisKKy8qKiBWYWx1ZSBmb3IgU1NBUCBmaWVsZCBpbiA4MDIuMiBMTEMgaGVhZGVyIGZvciA4MDIuMTEgZnJhbWVzOiBTTkFQICovCisjZGVmaW5lIElFRUU4MDIxMV9MTENfU1NBUAkweEFBCisKKy8qKiBWYWx1ZSBmb3IgY29udHJvbCBmaWVsZCBpbiA4MDIuMiBMTEMgaGVhZGVyIGZvciA4MDIuMTEgZnJhbWVzCisgKgorICogIlVubnVtYmVyZWQgSW5mb3JtYXRpb24iLgorICovCisjZGVmaW5lIElFRUU4MDIxMV9MTENfQ1RSTAkweDAzCisKKworLyoqIDE2LWJ5dGUgUlRTIGZyYW1lIGZvcm1hdCwgd2l0aCBhYmJyZXZpYXRlZCBoZWFkZXIgKi8KK3N0cnVjdCBpZWVlODAyMTFfcnRzCit7CisJdTE2IGZjOwkJCS8qKjwgODAyLjExIEZyYW1lIENvbnRyb2wgZmllbGQgKi8KKwl1MTYgZHVyYXRpb247CQkvKio8IE1pY3Jvc2Vjb25kcyB0byByZXNlcnZlIGxpbmsgKi8KKwl1OCBhZGRyMVtFVEhfQUxFTl07CS8qKjwgQWRkcmVzcyAxIChpbW1lZGlhdGUgcmVjZWl2ZXIpICovCisJdTggYWRkcjJbRVRIX0FMRU5dOwkvKio8IEFkZHJlc3MgMiAoaW1tZWRpYXRlIHNlbmRlcikgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKiBMZW5ndGggb2YgODAyLjExIFJUUyBjb250cm9sIGZyYW1lICovCisjZGVmaW5lIElFRUU4MDIxMV9SVFNfTEVOCTE2CisKKy8qKiAxMC1ieXRlIENUUyBvciBBQ0sgZnJhbWUgZm9ybWF0LCB3aXRoIGFiYnJldmlhdGVkIGhlYWRlciAqLworc3RydWN0IGllZWU4MDIxMV9jdHNfb3JfYWNrCit7CisJdTE2IGZjOwkJCS8qKjwgODAyLjExIEZyYW1lIENvbnRyb2wgZmllbGQgKi8KKwl1MTYgZHVyYXRpb247CQkvKio8IE1pY3Jvc2Vjb25kcyB0byByZXNlcnZlIGxpbmsgKi8KKwl1OCBhZGRyMVtFVEhfQUxFTl07CS8qKjwgQWRkcmVzcyAxIChpbW1lZGlhdGUgcmVjZWl2ZXIpICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIGllZWU4MDIxMV9jdHMgaWVlZTgwMjExX2N0c19vcl9hY2sKKyNkZWZpbmUgaWVlZTgwMjExX2FjayBpZWVlODAyMTFfY3RzX29yX2FjaworCisvKiogTGVuZ3RoIG9mIDgwMi4xMSBDVFMgY29udHJvbCBmcmFtZSAqLworI2RlZmluZSBJRUVFODAyMTFfQ1RTX0xFTgkxMAorCisvKiogTGVuZ3RoIG9mIDgwMi4xMSBBQ0sgY29udHJvbCBmcmFtZSAqLworI2RlZmluZSBJRUVFODAyMTFfQUNLX0xFTgkxMAorCisvKiogQH0gKi8KKworCisvKiAtLS0tLS0tLS0tIENhcGFiaWxpdHkgYml0cywgc3RhdHVzIGFuZCByZWFzb24gY29kZXMgLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEBkZWZncm91cCBpZWVlODAyMTFfY2FwYWIgODAyLjExIG1hbmFnZW1lbnQgZnJhbWUgY2FwYWJpbGl0eSBmaWVsZCBiaXRzCisgKiBAeworICovCisKKy8qKiBTZXQgaWYgdXNpbmcgYW4gQWNjZXNzIFBvaW50IChtYW5hZ2VkIG1vZGUpICovCisjZGVmaW5lIElFRUU4MDIxMV9DQVBBQl9NQU5BR0VEICAgICAgIDB4MDAwMQorCisvKiogU2V0IGlmIG9wZXJhdGluZyBpbiBJQlNTIChuby1BUCwgIkFkLUhvYyIpIG1vZGUgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NBUEFCX0FESE9DICAgICAgICAgMHgwMDAyCisKKy8qKiBTZXQgaWYgd2Ugc3VwcG9ydCBDb250ZW50aW9uLUZyZWUgUGVyaW9kIG9wZXJhdGlvbiAqLworI2RlZmluZSBJRUVFODAyMTFfQ0FQQUJfQ0ZQT0xMICAgICAgICAweDAwMDQKKworLyoqIFNldCBpZiB3ZSB3aXNoIHRvIGJlIHBvbGxlZCBmb3IgQ29udGVudGlvbi1GcmVlIG9wZXJhdGlvbiAqLworI2RlZmluZSBJRUVFODAyMTFfQ0FQQUJfQ0ZQUiAgICAgICAgICAweDAwMDgKKworLyoqIFNldCBpZiB0aGUgbmV0d29yayBpcyBlbmNyeXB0ZWQgKGJ5IGFueSBtZXRob2QpICovCisjZGVmaW5lIElFRUU4MDIxMV9DQVBBQl9QUklWQUNZICAgICAgIDB4MDAxMAorCisvKiogU2V0IGlmIFBIWSBzdXBwb3J0cyBzaG9ydCBwcmVhbWJsZXMgb24gODAyLjExYiAqLworI2RlZmluZSBJRUVFODAyMTFfQ0FQQUJfU0hPUlRfUE1CTCAgICAweDAwMjAKKworLyoqIFNldCBpZiBQSFkgc3VwcG9ydHMgUEJDQyBtb2R1bGF0aW9uICovCisjZGVmaW5lIElFRUU4MDIxMV9DQVBBQl9QQkNDICAgICAgICAgIDB4MDA0MAorCisvKiogU2V0IGlmIHdlIHN1cHBvcnQgQ2hhbm5lbCBBZ2lsaXR5ICovCisjZGVmaW5lIElFRUU4MDIxMV9DQVBBQl9DSEFOX0FHSUxJVFkgIDB4MDA4MAorCisvKiogU2V0IGlmIHdlIHN1cHBvcnQgc3BlY3RydW0gbWFuYWdlbWVudCAoREZTIGFuZCBUUEMpIG9uIHRoZSA1R0h6IGJhbmQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NBUEFCX1NQRUNUUlVNX01HTVQgMHgwMTAwCisKKy8qKiBTZXQgaWYgd2Ugc3VwcG9ydCBRdWFsaXR5IG9mIFNlcnZpY2UgZW5oYW5jZW1lbnRzICovCisjZGVmaW5lIElFRUU4MDIxMV9DQVBBQl9RT1MgICAgICAgICAgIDB4MDIwMAorCisvKiogU2V0IGlmIFBIWSBzdXBwb3J0cyBzaG9ydCBzbG90IHRpbWUgb24gODAyLjExZyAqLworI2RlZmluZSBJRUVFODAyMTFfQ0FQQUJfU0hPUlRfU0xPVCAgICAweDA0MDAKKworLyoqIFNldCBpZiBQSFkgc3VwcG9ydHMgQVBTRCBvcHRpb24gKi8KKyNkZWZpbmUgSUVFRTgwMjExX0NBUEFCX0FQU0QgICAgICAgICAgMHgwODAwCisKKy8qKiBTZXQgaWYgUEhZIHN1cHBvcnRzIERTU1MvT0ZETSBtb2R1bGF0aW9uIChvbmUgd2F5IG9mIDgwMi4xMSBiL2cgbWl4aW5nKSAqLworI2RlZmluZSBJRUVFODAyMTFfQ0FQQUJfRFNTU19PRkRNICAgICAweDIwMDAKKworLyoqIFNldCBpZiB3ZSBzdXBwb3J0IGRlbGF5ZWQgYmxvY2sgQUNLICovCisjZGVmaW5lIElFRUU4MDIxMV9DQVBBQl9ERUxBWUVEX0JBQ0sgIDB4NDAwMAorCisvKiogU2V0IGlmIHdlIHN1cHBvcnQgaW1tZWRpYXRlIGJsb2NrIEFDSyAqLworI2RlZmluZSBJRUVFODAyMTFfQ0FQQUJfSU1NRURfQkFDSyAgICAweDgwMDAKKworLyoqIEB9ICovCisKKworLyoqCisgKiBAZGVmZ3JvdXAgaWVlZTgwMjExX3N0YXR1cyA4MDIuMTEgc3RhdHVzIGNvZGVzCisgKgorICogVGhlc2UgYXJlIHJldHVybmVkIHRvIGluZGljYXRlIGFuIGltbWVkaWF0ZSBkZW5pYWwgb2YKKyAqIGF1dGhlbnRpY2F0aW9uIG9yIGFzc29jaWF0aW9uLiBJbiBnUFhFLCB0aGUgbG93ZXIgNSBiaXRzIG9mIHRoZQorICogc3RhdHVzIGNvZGUgYXJlIGVuY29kZWQgaW50byB0aGUgZmlsZS11bmlxdWUgcG9ydGlvbiBvZiBhbiBlcnJvcgorICogY29kZSwgdGhlIEVSUkZJTEUgcG9ydGlvbiBpcyBhbHdheXMgQGMgRVJSRklMRV9uZXQ4MDIxMSwgYW5kIHRoZQorICogUE9TSVggZXJyb3IgY29kZSBpcyBAYyBFQ09OTlJFRlVTRUQgZm9yIHN0YXR1cyAwLTMxIG9yIEBjCisgKiBFSE9TVFVOUkVBQ0ggZm9yIHN0YXR1cyAzMi02My4KKyAqCisgKiBGb3IgYSBjb21wbGV0ZSB0YWJsZSB3aXRoIG5vbi1hYmJyZXZpYXRlZCBlcnJvciBtZXNzYWdlcywgc2VlIElFRUUKKyAqIFN0ZCA4MDIuMTEtMjAwNywgVGFibGUgNy0yMywgcC45NC4KKyAqCisgKiBAeworICovCisKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19TVUNDRVNTCQkwCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfRkFJTFVSRQkJMQorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0NBUEFCX1VOU1VQUAkJMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19SRUFTU09DX0lOVkFMSUQJMTEKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19BU1NPQ19ERU5JRUQJCTEyCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfQVVUSF9BTEdPX1VOU1VQUAkxMworI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0FVVEhfU0VRX0lOVkFMSUQJMTQKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19BVVRIX0NIQUxMX0lOVkFMSUQJMTUKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19BVVRIX1RJTUVPVVQJCTE2CisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfQVNTT0NfTk9fUk9PTQkJMTcKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19BU1NPQ19ORUVEX1JBVEUJMTgKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19BU1NPQ19ORUVEX1NIT1JUX1BNQkwJMTkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19BU1NPQ19ORUVEX1BCQ0MJMjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19BU1NPQ19ORUVEX0NIQU5fQUdJTElUWSAyMQorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0FTU09DX05FRURfU1BFQ1RSVU1fTUdNVCAyMgorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0FTU09DX0JBRF9QT1dFUgkyMworI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0FTU09DX0JBRF9DSEFOTkVMUwkyNAorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0FTU09DX05FRURfU0hPUlRfU0xPVAkyNQorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0FTU09DX05FRURfRFNTU19PRkRNCTI2CisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfUU9TX0ZBSUxVUkUJCTMyCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfUU9TX05PX1JPT00JCTMzCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfTElOS19JU19IT1JSSUJMRQkzNAorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0FTU09DX05FRURfUU9TCQkzNQorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX1JFUVVFU1RfREVDTElORUQJMzcKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19SRVFVRVNUX0lOVkFMSUQJMzgKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19UU19OT1RfQ1JFQVRFRF9BR0FJTgkzOQorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0lOVkFMSURfSUUJCTQwCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfR1JPVVBfQ0lQSEVSX0lOVkFMSUQJNDEKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19QQUlSX0NJUEhFUl9JTlZBTElECTQyCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfQUtNUF9JTlZBTElECQk0MworI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX1JTTl9WRVJTSU9OX1VOU1VQUAk0NAorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX1JTTl9DQVBBQl9JTlZBTElECTQ1CisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfQ0lQSEVSX1JFSkVDVEVECTQ2CisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfVFNfTk9UX0NSRUFURURfV0FJVAk0NworI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0RJUkVDVF9MSU5LX0ZPUkJJRERFTgk0OAorI2RlZmluZSBJRUVFODAyMTFfU1RBVFVTX0RFU1RfTk9UX1BSRVNFTlQJNDkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRVU19ERVNUX05PVF9RT1MJCTUwCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUVVNfQVNTT0NfTElTVEVOX1RPT19ISUdICTUxCisKKy8qKiBAfSAqLworCisKKworLyoqCisgKiBAZGVmZ3JvdXAgaWVlZTgwMjExX3JlYXNvbiA4MDIuMTEgcmVhc29uIGNvZGVzCisgKgorICogVGhlc2UgYXJlIHJldHVybmVkIHRvIGluZGljYXRlIHRoZSByZWFzb24gZm9yIGEgZGVhdXRoZW50aWNhdGlvbiBvcgorICogZGlzYXNzb2NpYXRpb24gc2VudCAodXN1YWxseSkgYWZ0ZXIgYXV0aGVudGljYXRpb24gb3IgYXNzb2NpYXRpb24KKyAqIGhhZCBzdWNjZWVkZWQuICBJbiBnUFhFLCB0aGUgbG93ZXIgNSBiaXRzIG9mIHRoZSByZWFzb24gY29kZSBhcmUKKyAqIGVuY29kZWQgaW50byB0aGUgZmlsZS11bmlxdWUgcG9ydGlvbiBvZiBhbiBlcnJvciBjb2RlLCB0aGUgRVJSRklMRQorICogcG9ydGlvbiBpcyBhbHdheXMgQGMgRVJSRklMRV9uZXQ4MDIxMSwgYW5kIHRoZSBQT1NJWCBlcnJvciBjb2RlIGlzCisgKiBAYyBFQ09OTlJFU0VUIGZvciByZWFzb24gMC0zMSBvciBAYyBFTkVUUkVTRVQgZm9yIHJlYXNvbiAzMi02My4KKyAqCisgKiBGb3IgYSBjb21wbGV0ZSB0YWJsZSB3aXRoIG5vbi1hYmJyZXZpYXRlZCBlcnJvciBtZXNzYWdlcywgc2VlIElFRUUKKyAqIFN0ZCA4MDIuMTEtMjAwNywgVGFibGUgNy0yMiwgcC45Mi4KKyAqCisgKiBAeworICovCisKKyNkZWZpbmUgSUVFRTgwMjExX1JFQVNPTl9OT05FCQkJMAorI2RlZmluZSBJRUVFODAyMTFfUkVBU09OX1VOU1BFQ0lGSUVECQkxCisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fQVVUSF9OT19MT05HRVJfVkFMSUQJMgorI2RlZmluZSBJRUVFODAyMTFfUkVBU09OX0xFQVZJTkcJCTMKKyNkZWZpbmUgSUVFRTgwMjExX1JFQVNPTl9JTkFDVElWSVRZCQk0CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fT1VUX09GX1JFU09VUkNFUwk1CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fTkVFRF9BVVRICQk2CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fTkVFRF9BU1NPQwkJNworI2RlZmluZSBJRUVFODAyMTFfUkVBU09OX0xFQVZJTkdfVE9fUk9BTQk4CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fUkVBU1NPQ19JTlZBTElECTkKKyNkZWZpbmUgSUVFRTgwMjExX1JFQVNPTl9CQURfUE9XRVIJCTEwCisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fQkFEX0NIQU5ORUxTCQkxMQorI2RlZmluZSBJRUVFODAyMTFfUkVBU09OX0lOVkFMSURfSUUJCTEzCisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fTUlDX0ZBSUxVUkUJCTE0CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fNFdBWV9USU1FT1VUCQkxNQorI2RlZmluZSBJRUVFODAyMTFfUkVBU09OX0dST1VQS0VZX1RJTUVPVVQJMTYKKyNkZWZpbmUgSUVFRTgwMjExX1JFQVNPTl80V0FZX0lOVkFMSUQJCTE3CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fR1JPVVBfQ0lQSEVSX0lOVkFMSUQJMTgKKyNkZWZpbmUgSUVFRTgwMjExX1JFQVNPTl9QQUlSX0NJUEhFUl9JTlZBTElECTE5CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fQUtNUF9JTlZBTElECQkyMAorI2RlZmluZSBJRUVFODAyMTFfUkVBU09OX1JTTl9WRVJTSU9OX0lOVkFMSUQJMjEKKyNkZWZpbmUgSUVFRTgwMjExX1JFQVNPTl9SU05fQ0FQQUJfSU5WQUxJRAkyMgorI2RlZmluZSBJRUVFODAyMTFfUkVBU09OXzgwMjFYX0ZBSUxVUkUJCTIzCisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fQ0lQSEVSX1JFSkVDVEVECTI0CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fUU9TX1VOU1BFQ0lGSUVECTMyCisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fUU9TX09VVF9PRl9SRVNPVVJDRVMJMzMKKyNkZWZpbmUgSUVFRTgwMjExX1JFQVNPTl9MSU5LX0lTX0hPUlJJQkxFCTM0CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fSU5WQUxJRF9UWE9QCQkzNQorI2RlZmluZSBJRUVFODAyMTFfUkVBU09OX1JFUVVFU1RFRF9MRUFWSU5HCTM2CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fUkVRVUVTVEVEX05PX1VTRQkzNworI2RlZmluZSBJRUVFODAyMTFfUkVBU09OX1JFUVVFU1RFRF9ORUVEX1NFVFVQCTM4CisjZGVmaW5lIElFRUU4MDIxMV9SRUFTT05fUkVRVUVTVEVEX1RJTUVPVVQJMzkKKyNkZWZpbmUgSUVFRTgwMjExX1JFQVNPTl9DSVBIRVJfVU5TVVBQT1JURUQJNDUKKworLyoqIEB9ICovCisKKy8qIC0tLS0tLS0tLS0gSW5mb3JtYXRpb24gZWxlbWVudCBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEBkZWZncm91cCBpZWVlODAyMTFfaWUgODAyLjExIGluZm9ybWF0aW9uIGVsZW1lbnRzCisgKgorICogTWFueSBtYW5hZ2VtZW50IGZyYW1lcyBpbmNsdWRlIGEgc2VjdGlvbiB0aGF0IGFtb3VudHMgdG8gYQorICogY29uY2F0ZW5hdGlvbiBvZiB0aGVzZSBpbmZvcm1hdGlvbiBlbGVtZW50cywgc28gdGhhdCB0aGUgc2VuZGVyIGNhbgorICogY2hvb3NlIHdoaWNoIGluZm9ybWF0aW9uIHRvIHNlbmQgYW5kIHRoZSByZWNlaXZlciBjYW4gaWdub3JlIHRoZQorICogcGFydHMgaXQgZG9lc24ndCB1bmRlcnN0YW5kLiBFYWNoIElFIGNvbnRhaW5zIGEgdHdvLWJ5dGUgaGVhZGVyLAorICogb25lIGJ5dGUgSUQgYW5kIG9uZSBieXRlIGxlbmd0aCwgZm9sbG93ZWQgYnkgSUUtc3BlY2lmaWMgZGF0YS4gVGhlCisgKiBsZW5ndGggZG9lcyBub3QgaW5jbHVkZSB0aGUgdHdvLWJ5dGUgaGVhZGVyLiBJbmZvcm1hdGlvbiBlbGVtZW50cworICogYXJlIHJlcXVpcmVkIHRvIGJlIHNvcnRlZCBieSBJRCwgYnV0IGdQWEUgZG9lcyBub3QgcmVxdWlyZSB0aGF0IGluCisgKiB0aG9zZSBpdCByZWNlaXZlcy4KKyAqCisgKiBUaGlzIGdyb3VwIGFsc28gaW5jbHVkZXMgYSBmZXcgaW5saW5lIGZ1bmN0aW9ucyB0byBzaW1wbGlmeSBjb21tb24KKyAqIHRhc2tzIGluIElFIHByb2Nlc3NpbmcuCisgKgorICogQHsKKyAqLworCisvKiogR2VuZXJpYyA4MDIuMTEgaW5mb3JtYXRpb24gZWxlbWVudCBoZWFkZXIgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfaGVhZGVyIHsKKwl1OCBpZDsJCQkvKio8IEluZm9ybWF0aW9uIGVsZW1lbnQgSUQgKi8KKwl1OCBsZW47CQkJLyoqPCBJbmZvcm1hdGlvbiBlbGVtZW50IGxlbmd0aCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoqIDgwMi4xMSBTU0lEIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfc3NpZCB7CisJdTggaWQ7CQkJLyoqPCBTU0lEIElEOiAwICovCisJdTggbGVuOwkJCS8qKjwgU1NJRCBsZW5ndGggKi8KKwljaGFyIHNzaWRbMF07CQkvKio8IFNTSUQgZGF0YSwgbm90IE5VTC10ZXJtaW5hdGVkICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqIEluZm9ybWF0aW9uIGVsZW1lbnQgSUQgZm9yIFNTSUQgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfSUVfU1NJRAkwCisKKworLyoqIDgwMi4xMSByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50CisgKgorICogVGhlIGZpcnN0IDggcmF0ZXMgZ28gaW4gYW4gSUUgb2YgdHlwZSBSQVRFUyAoMSksIGFuZCBhbnkgbW9yZSByYXRlcworICogZ28gaW4gb25lIG9mIHR5cGUgRVhUX1JBVEVTICg1MCkuIEVhY2ggcmF0ZSBpcyBhIGJ5dGUgd2l0aCB0aGUgbG93CisgKiA3IGJpdHMgZXF1YWwgdG8gdGhlIHJhdGUgaW4gdW5pdHMgb2YgNTAwIGticHMsIGFuZCB0aGUgaGlnaCBiaXQgc2V0CisgKiBpZiBhbmQgb25seSBpZiB0aGUgcmF0ZSBpcyAiYmFzaWMiIChtdXN0IGJlIHN1cHBvcnRlZCBieSBhbGwKKyAqIGNvbm5lY3RlZCBzdGF0aW9ucykuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfcmF0ZXMgeworCXU4IGlkOwkJCS8qKjwgUmF0ZXMgSUQ6IDEgb3IgNTAgKi8KKwl1OCBsZW47CQkJLyoqPCBOdW1iZXIgb2YgcmF0ZXMgKi8KKwl1OCByYXRlc1swXTsJCS8qKjwgUmF0ZXMgZGF0YSwgb25lIHJhdGUgcGVyIGJ5dGUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogSW5mb3JtYXRpb24gZWxlbWVudCBJRCBmb3IgcmF0ZXMgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfSUVfUkFURVMJMQorCisvKiogSW5mb3JtYXRpb24gZWxlbWVudCBJRCBmb3IgZXh0ZW5kZWQgcmF0ZXMgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfSUVfRVhUX1JBVEVTCTUwCisKKworLyoqIDgwMi4xMSBEaXJlY3QgU3BlY3RydW0gcGFyYW1ldGVyIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqCisgKiBUaGlzIGp1c3QgY29udGFpbnMgdGhlIGNoYW5uZWwgbnVtYmVyLiBJdCBoYXMgdGhlIGZhbmN5IG5hbWUKKyAqIGJlY2F1c2UgSUVFRSA4MDIuMTEgYWxzbyBkZWZpbmVzIGEgZnJlcXVlbmN5LWhvcHBpbmcgUEhZIHRoYXQKKyAqIGNoYW5nZXMgY2hhbm5lbHMgYXQgcmVndWxhciBpbnRlcnZhbHMgZm9sbG93aW5nIGEgcHJlZGV0ZXJtaW5lZAorICogcGF0dGVybjsgaW4gcHJhY3RpY2Ugbm9ib2R5IHVzZXMgdGhlIEZIIFBIWS4KKyAqLworc3RydWN0IGllZWU4MDIxMV9pZV9kc19wYXJhbSB7CisJdTggaWQ7CQkJLyoqPCBEUyBwYXJhbWV0ZXIgSUQ6IDMgKi8KKwl1OCBsZW47CQkJLyoqPCBEUyBwYXJhbWV0ZXIgbGVuZ3RoOiAxICovCisJdTggY3VycmVudF9jaGFubmVsOwkvKio8IEN1cnJlbnQgY2hhbm5lbCBudW1iZXIsIDEtMTQgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogSW5mb3JtYXRpb24gZWxlbWVudCBJRCBmb3IgRGlyZWN0IFNwZWN0cnVtIHBhcmFtZXRlciBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9JRV9EU19QQVJBTQkzCisKKworLyoqIDgwMi4xMSBDb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQgcmVndWxhdG9yeSBleHRlbnNpb24gdHJpcGxldCAqLworc3RydWN0IGllZWU4MDIxMV9pZV9jb3VudHJ5X2V4dF90cmlwbGV0IHsKKwl1OCByZWdfZXh0X2lkOwkJLyoqPCBSZWd1bGF0b3J5IGV4dGVuc2lvbiBJRCAqLworCXU4IHJlZ19jbGFzc19pZDsJLyoqPCBSZWd1bGF0b3J5IGNsYXNzIElEICovCisJdTggY292ZXJhZ2VfY2xhc3M7CS8qKjwgQ292ZXJhZ2UgY2xhc3MgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogODAyLjExIENvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudCByZWd1bGF0b3J5IGJhbmQgdHJpcGxldCAqLworc3RydWN0IGllZWU4MDIxMV9pZV9jb3VudHJ5X2JhbmRfdHJpcGxldCB7CisJdTggZmlyc3RfY2hhbm5lbDsJLyoqPCBDaGFubmVsIG51bWJlciBmb3IgZmlyc3QgY2hhbm5lbCBpbiBiYW5kICovCisJdTggbnJfY2hhbm5lbHM7CQkvKio8IE51bWJlciBvZiBjb250aWd1b3VzIGNoYW5uZWxzIGluIGJhbmQgKi8KKwl1OCBtYXhfdHhwb3dlcjsJCS8qKjwgTWF4aW11bSBUWCBwb3dlciBpbiBkQm0gKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogODAyLjExIENvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudCByZWd1bGF0b3J5IHRyaXBsZXQKKyAqCisgKiBJdCBpcyBhIGJhbmQgdHJpcGxldCBpZiB0aGUgZmlyc3QgYnl0ZSBpcyAyMDAgb3IgbGVzcywgYW5kIGEKKyAqIHJlZ3VsYXRvcnkgZXh0ZW5zaW9uIHRyaXBsZXQgb3RoZXJ3aXNlLgorICovCit1bmlvbiBpZWVlODAyMTFfaWVfY291bnRyeV90cmlwbGV0IHsKKwkvKiogRGlmZmVyZW50aWF0b3IgYmV0d2VlbiBiYW5kIGFuZCBleHQgdHJpcGxldHMgKi8KKwl1OCBmaXJzdDsKKworCS8qKiBJbmZvcm1hdGlvbiBhYm91dCBhIGJhbmQgb2YgY2hhbm5lbHMgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2llX2NvdW50cnlfYmFuZF90cmlwbGV0IGJhbmQ7CisKKwkvKiogUmVndWxhdG9yeSBleHRlbnNpb24gaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2llX2NvdW50cnlfZXh0X3RyaXBsZXQgZXh0OworfTsKKworLyoqIDgwMi4xMSBDb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqCisgKiBUaGlzIGNvbnRhaW5zIHNvbWUgZGF0YSBhYm91dCBSRiByZWd1bGF0aW9ucy4KKyAqLworc3RydWN0IGllZWU4MDIxMV9pZV9jb3VudHJ5IHsKKwl1OCBpZDsJCQkvKio8IENvdW50cnkgaW5mb3JtYXRpb24gSUQ6IDcgKi8KKwl1OCBsZW47CQkJLyoqPCBDb3VudHJ5IGluZm9ybWF0aW9uIGxlbmd0aDogdmFyaWVzICovCisJY2hhciBuYW1lWzJdOwkJLyoqPCBJU08gQWxwaGEyIGNvdW50cnkgY29kZSAqLworCWNoYXIgaW5fb3V0OwkJLyoqPCAnSScgZm9yIGluZG9vciwgJ08nIGZvciBvdXRkb29yICovCisKKwkvKiogTGlzdCBvZiByZWd1bGF0b3J5IHRyaXBsZXRzICovCisJdW5pb24gaWVlZTgwMjExX2llX2NvdW50cnlfdHJpcGxldCB0cmlwbGV0WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKiBJbmZvcm1hdGlvbiBlbGVtZW50IElEIGZvciBDb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0lFX0NPVU5UUlkJNworCisKKy8qKiA4MDIuMTEgUmVxdWVzdCBpbmZvcm1hdGlvbiBlbGVtZW50CisgKgorICogVGhpcyBjb250YWlucyBhIGxpc3Qgb2YgaW5mb3JtYXRpb24gZWxlbWVudCB0eXBlcyB3ZSB3b3VsZCBsaWtlIHRvCisgKiBiZSBpbmNsdWRlZCBpbiBwcm9iZSByZXNwb25zZSBmcmFtZXMuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfcmVxdWVzdCB7CisJdTggaWQ7CQkJLyoqPCBSZXF1ZXN0IElEOiAxMCAqLworCXU4IGxlbjsJCQkvKio8IE51bWJlciBvZiBJRXMgcmVxdWVzdGVkICovCisJdTggcmVxdWVzdFswXTsJCS8qKjwgTGlzdCBvZiBJRXMgcmVxdWVzdGVkICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqIEluZm9ybWF0aW9uIGVsZW1lbnQgSUQgZm9yIFJlcXVlc3QgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfSUVfUkVRVUVTVAkxMAorCisKKy8qKiA4MDIuMTEgQ2hhbGxlbmdlIFRleHQgaW5mb3JtYXRpb24gZWxlbWVudAorICoKKyAqIFRoaXMgaXMgdXNlZCBpbiBhdXRoZW50aWNhdGlvbiBmcmFtZXMgdW5kZXIgU2hhcmVkIEtleQorICogYXV0aGVudGljYXRpb24uCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfY2hhbGxlbmdlX3RleHQgeworCXU4IGlkOwkJCS8qKjwgQ2hhbGxlbmdlIFRleHQgSUQ6IDE2ICovCisJdTggbGVuOwkJCS8qKjwgQ2hhbGxlbmdlIFRleHQgbGVuZ3RoOiB1c3VhbGx5IDEyOCAqLworCXU4IGNoYWxsZW5nZV90ZXh0WzBdOwkvKio8IENoYWxsZW5nZSBUZXh0IGRhdGEgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogSW5mb3JtYXRpb24gZWxlbWVudCBJRCBmb3IgQ2hhbGxlbmdlIFRleHQgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfSUVfQ0hBTExFTkdFX1RFWFQJMTYKKworCisvKiogODAyLjExIFBvd2VyIENvbnN0cmFpbnQgaW5mb3JtYXRpb24gZWxlbWVudAorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgcG93ZXIgbGltaXRhdGlvbiBvbiB0b3Agb2YKKyAqIHRoZSBDb3VudHJ5IHJlcXVpcmVtZW50cy4KKyAqLworc3RydWN0IGllZWU4MDIxMV9pZV9wb3dlcl9jb25zdHJhaW50IHsKKwl1OCBpZDsJCQkvKio8IFBvd2VyIENvbnN0cmFpbnQgSUQ6IDUyICovCisJdTggbGVuOwkJCS8qKjwgUG93ZXIgQ29uc3RyYWludCBsZW5ndGg6IDEgKi8KKwl1OCBwb3dlcl9jb25zdHJhaW50OwkvKio8IERlY3JlYXNlIGluIGFsbG93ZWQgVFggcG93ZXIsIGRCbSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKiBJbmZvcm1hdGlvbiBlbGVtZW50IElEIGZvciBQb3dlciBDb25zdHJhaW50IGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0lFX1BPV0VSX0NPTlNUUkFJTlQJNTIKKworCisvKiogODAyLjExIFBvd2VyIENhcGFiaWxpdHkgaW5mb3JtYXRpb24gZWxlbWVudAorICoKKyAqIFRoaXMgaXMgdXNlZCBpbiBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcyB0byBpbmRpY2F0ZSB0aGUgZXh0cmVtZXMKKyAqIG9mIG91ciBUWCBwb3dlciBhYmlsaXRpZXMuIEl0IGlzIHJlcXVpcmVkIG9ubHkgaWYgd2UgaW5kaWNhdGUKKyAqIHN1cHBvcnQgZm9yIHNwZWN0cnVtIG1hbmFnZW1lbnQuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfcG93ZXJfY2FwYWIgeworCXU4IGlkOwkJCS8qKjwgUG93ZXIgQ2FwYWJpbGl0eSBJRDogMzMgKi8KKwl1OCBsZW47CQkJLyoqPCBQb3dlciBDYXBhYmlsaXR5IGxlbmd0aDogMiAqLworCXU4IG1pbl90eHBvd2VyOwkJLyoqPCBNaW5pbXVtIHBvc3NpYmxlIFRYIHBvd2VyLCBkQm0gKi8KKwl1OCBtYXhfdHhwb3dlcjsJCS8qKjwgTWF4aW11bSBwb3NzaWJsZSBUWCBwb3dlciwgZEJtICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqIEluZm9ybWF0aW9uIGVsZW1lbnQgSUQgZm9yIFBvd2VyIENhcGFiaWxpdHkgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfSUVfUE9XRVJfQ0FQQUIJMzMKKworCisvKiogODAyLjExIENoYW5uZWxzIGluZm9ybWF0aW9uIGVsZW1lbnQgY2hhbm5lbCBiYW5kIHR1cGxlICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX2NoYW5uZWxzX2NoYW5uZWxfYmFuZCB7CisJdTggZmlyc3RfY2hhbm5lbDsJLyoqPCBDaGFubmVsIG51bWJlciBvZiBmaXJzdCBjaGFubmVsIGluIGJhbmQgKi8KKwl1OCBucl9jaGFubmVsczsJCS8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIGJhbmQgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogODAyLjExIENoYW5uZWxzIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqCisgKiBUaGlzIGlzIHVzZWQgaW4gYXNzb2NpYXRpb24gZnJhbWVzIHRvIGluZGljYXRlIHRoZSBjaGFubmVscyB3ZSBjYW4KKyAqIHVzZS4gSXQgaXMgcmVxdWlyZWQgb25seSBpZiB3ZSBpbmRpY2F0ZSBzdXBwb3J0IGZvciBzcGVjdHJ1bQorICogbWFuYWdlbWVudC4KKyAqLworc3RydWN0IGllZWU4MDIxMV9pZV9jaGFubmVscyB7CisJdTggaWQ7CQkJLyoqPCBDaGFubmVscyBJRDogMzYgKi8KKwl1OCBsZW47CQkJLyoqPCBDaGFubmVscyBsZW5ndGg6IDIgKi8KKworCS8qKiBMaXN0IG9mIChzdGFydCwgbGVuZ3RoKSBjaGFubmVsIGJhbmRzIHdlIGNhbiB1c2UgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2llX2NoYW5uZWxzX2NoYW5uZWxfYmFuZCBjaGFubmVsc1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogSW5mb3JtYXRpb24gZWxlbWVudCBJRCBmb3IgQ2hhbm5lbHMgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfSUVfQ0hBTk5FTFMJMzYKKworCisvKiogODAyLjExIEVSUCBJbmZvcm1hdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50CisgKgorICogVGhpcyBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHNvbWUgUEhZLWxldmVsIGZsYWdzLgorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX2VycF9pbmZvIHsKKwl1OCBpZDsJCQkvKio8IEVSUCBJbmZvcm1hdGlvbiBJRDogNDIgKi8KKwl1OCBsZW47CQkJLyoqPCBFUlAgSW5mb3JtYXRpb24gbGVuZ3RoOiAxICovCisJdTggZXJwX2luZm87CQkvKio8IEVSUCBmbGFncyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKiBJbmZvcm1hdGlvbiBlbGVtZW50IElEIGZvciBFUlAgSW5mb3JtYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfSUVfRVJQX0lORk8JNDIKKworLyoqIEVSUCBpbmZvcm1hdGlvbiBlbGVtZW50OiBGbGFnIHNldCBpZiA4MDIuMTFiIHN0YXRpb25zIGFyZSBwcmVzZW50ICovCisjZGVmaW5lICBJRUVFODAyMTFfRVJQX05PTkVSUF9QUkVTRU5UCTB4MDEKKworLyoqIEVSUCBpbmZvcm1hdGlvbiBlbGVtZW50OiBGbGFnIHNldCBpZiBDVFMgcHJvdGVjdGlvbiBtdXN0IGJlIHVzZWQgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9FUlBfVVNFX1BST1RFQ1RJT04JMHgwMgorCisvKiogRVJQIGluZm9ybWF0aW9uIGVsZW1lbnQ6IEZsYWcgc2V0IGlmIGxvbmcgcHJlYW1ibGVzIG11c3QgYmUgdXNlZCAqLworI2RlZmluZSAgSUVFRTgwMjExX0VSUF9CQVJLRVJfTE9ORwkweDA0CisKKworLyoqIDgwMi4xMSBSb2J1c3QgU2VjdXJpdHkgTmV0d29yayAoIldQQSIpIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqCisgKiBTaG93aW5nIG9uY2UgYWdhaW4gYSBzdHJpa2luZyBjbGFyaXR5IG9mIGRlc2lnbiwgdGhlIElFRUUgZm9sa3MgcHV0CisgKiBkeW5hbWljYWxseS1zaXplZCBkYXRhIGluIHRoZSBtaWRkbGUgb2YgdGhpcyBzdHJ1Y3R1cmUuIEFzIHN1Y2gsCisgKiB0aGUgYmVsb3cgc3RydWN0dXJlIGRlZmluaXRpb24gb25seSB3b3JrcyBmb3IgSUVzIHdlIGNyZWF0ZQorICogb3Vyc2VsdmVzLCB3aGljaCBhbHdheXMgaGF2ZSBvbmUgcGFpcndpc2UgY2lwaGVyIGFuZCBvbmUgQUtNOworICogcmVjZWl2ZWQgSUVzIHNob3VsZCBiZSBwYXJzZWQgcGllY2VtZWFsLgorICoKKyAqIEFsc28gaW5zcGlyZWQgd2FzIElFRUUncyBjaG9pY2Ugb2YgMTYtYml0IGZpZWxkcyB0byBjb3VudCB0aGUKKyAqIG51bWJlciBvZiA0LWJ5dGUgZWxlbWVudHMgaW4gYSBzdHJ1Y3R1cmUgd2l0aCBhIG1heGltdW0gbGVuZ3RoIG9mCisgKiAyNTUgYnl0ZXMuCisgKgorICogTWFueSBmaWVsZHMgcmVmZXJlbmNlIGEgY2lwaGVyIG9yIGF1dGhlbnRpY2F0aW9uLXR5cGUgSUQ7IHRoaXMgaXMgYQorICogdGhyZWUtYnl0ZSBPVUkgZm9sbG93ZWQgYnkgb25lIGJ5dGUgaWRlbnRpZnlpbmcgdGhlIGNpcGhlciB3aXRoCisgKiByZXNwZWN0IHRvIHRoYXQgT1VJLiBGb3IgYWxsIHN0YW5kYXJkIGNpcGhlcnMgdGhlIE9VSSBpcyAwMDowRjpBQywKKyAqIGV4Y2VwdCBpbiBvbGQtc3R5bGUgV1BBIElFcyBlbmNhcHN1bGF0ZWQgaW4gdmVuZG9yLXNwZWNpZmljIElFcywKKyAqIHdoZXJlIGl0J3MgMDA6NTA6RjIuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfaWVfcnNuIHsKKwkvKiogSW5mb3JtYXRpb24gZWxlbWVudCBJRCAqLworCXU4IGlkOworCisJLyoqIEluZm9ybWF0aW9uIGVsZW1lbnQgbGVuZ3RoICovCisJdTggbGVuOworCisJLyoqIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50IHZlcnNpb24gKi8KKwl1MTYgdmVyc2lvbjsKKworCS8qKiBDaXBoZXIgSUQgZm9yIHRoZSBjaXBoZXIgdXNlZCBpbiBtdWx0aWNhc3QvYnJvYWRjYXN0IGZyYW1lcyAqLworCXUzMiBncm91cF9jaXBoZXI7CisKKwkvKiogTnVtYmVyIG9mIHVuaWNhc3QgY2lwaGVycyBzdXBwb3J0ZWQgKi8KKwl1MTYgcGFpcndpc2VfY291bnQ7CisKKwkvKiogTGlzdCBvZiBjaXBoZXIgSURzIGZvciBzdXBwb3J0ZWQgdW5pY2FzdCBmcmFtZSBjaXBoZXJzICovCisJdTMyIHBhaXJ3aXNlX2NpcGhlclsxXTsKKworCS8qKiBOdW1iZXIgb2YgYXV0aGVudGljYXRpb24gdHlwZXMgc3VwcG9ydGVkICovCisJdTE2IGFrbV9jb3VudDsKKworCS8qKiBMaXN0IG9mIGF1dGhlbnRpY2F0aW9uIHR5cGUgSURzIGZvciBzdXBwb3J0ZWQgdHlwZXMgKi8KKwl1MzIgYWttX2xpc3RbMV07CisKKwkvKiogU2VjdXJpdHkgY2FwYWJpbGl0aWVzIGZpZWxkIChSU04gb25seSkgKi8KKwl1MTYgcnNuX2NhcGFiOworCisJLyoqIE51bWJlciBvZiBQTUtJRHMgaW5jbHVkZWQgKHByZXNlbnQgb25seSBpbiBhc3NvY2lhdGlvbiBmcmFtZXMpICovCisJdTE2IHBta2lkX2NvdW50OworCisJLyoqIExpc3Qgb2YgUE1LSURzIGluY2x1ZGVkLCBlYWNoIGEgMTYtYnl0ZSBTSEExIGhhc2ggKi8KKwl1OCBwbWtpZF9saXN0WzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqIEluZm9ybWF0aW9uIGVsZW1lbnQgSUQgZm9yIFJvYnVzdCBTZWN1cml0eSBOZXR3b3JrIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0lFX1JTTgk0OAorCisvKiogQ2FsY3VsYXRlIG5lY2Vzc2FyeSBzaXplIG9mIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50CisgKgorICogQHYgbnBhaXIJTnVtYmVyIG9mIHBhaXJ3aXNlIGNpcGhlcnMgc3VwcG9ydGVkCisgKiBAdiBuYXV0aAlOdW1iZXIgb2YgYXV0aGVudGljYXRpb24gdHlwZXMgc3VwcG9ydGVkCisgKiBAdiBucG1raWQJTnVtYmVyIG9mIFBNS0lEcyB0byBpbmNsdWRlCisgKiBAdiBpc19yc24JSWYgVFJVRSwgY2FsY3VsYXRlIFJTTiBJRSBzaXplOyBpZiBGQUxTRSwgY2FsY3VsYXRlIFdQQSBJRSBzaXplCisgKiBAcmV0IHNpemUJTmVjZXNzYXJ5IHNpemUgb2YgSUUsIGluY2x1ZGluZyBoZWFkZXIgYnl0ZXMKKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgaWVlZTgwMjExX3Jzbl9zaXplICggaW50IG5wYWlyLCBpbnQgbmF1dGgsIGludCBucG1raWQsCisJCQkJCSAgaW50IHJzbl9pZSApIHsKKwlyZXR1cm4gMTYgKyA0ICogKCBucGFpciArIG5hdXRoICkgKyAxNiAqIG5wbWtpZCAtIDQgKiAhIHJzbl9pZTsKK30KKworLyoqIE1ha2UgT1VJIHBsdXMgdHlwZSBieXRlIGludG8gMzItYml0IGludGVnZXIgZm9yIGVhc3kgY29tcGFyaXNvbiAqLworI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgX01LT1VJKCBhLCBiLCBjLCB0ICkJXAorCQkoICggKCBhICkgPDwgMjQgKSB8ICggKCBiICkgPDwgMTYgKSB8ICggKCBjICkgPDwgOCApIHwgKCBkICkgKQorI2RlZmluZSAgT1VJX09SR19NQVNLCQkweEZGRkZGRjAwCisjZGVmaW5lICBPVUlfVFlQRV9NQVNLCQkweDAwMDAwMEZGCisjZWxzZQorI2RlZmluZSBfTUtPVUkoIGEsIGIsIGMsIHQgKQlcCisJCSggKCAoIHQgKSA8PCAyNCApIHwgKCAoIGMgKSA8PCAxNiApIHwgKCAoIGIgKSA8PCA4ICkgfCAoIGEgKSApCisjZGVmaW5lICBPVUlfT1JHX01BU0sJCTB4MDBGRkZGRkYKKyNkZWZpbmUgIE9VSV9UWVBFX01BU0sJCTB4RkYwMDAwMDAKKyNlbmRpZgorCisvKiogT3JnYW5pemF0aW9uIHBhcnQgZm9yIE9VSXMgaW4gc3RhbmRhcmQgUlNOIElFICovCisjZGVmaW5lICBJRUVFODAyMTFfUlNOX09VSQlfTUtPVUkgKCAweDAwLCAweDBGLCAweEFDLCAwICkKKworLyoqIE9yZ2FuaXphdGlvbiBwYXJ0IGZvciBPVUlzIGluIG9sZCBXUEEgSUUgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9XUEFfT1VJCV9NS09VSSAoIDB4MDAsIDB4NTAsIDB4RjIsIDAgKQorCisvKiogT2xkIHZlbmRvci10eXBlIFdQQSBJRSBPVUkgdHlwZSArIHN1YnR5cGUgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9XUEFfT1VJX1ZFTglfTUtPVUkgKCAweDAwLCAweDUwLCAweEYyLCAweDAxICkKKworCisvKiogODAyLjExIFJTTiBJRTogZXhwZWN0ZWQgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9SU05fVkVSU0lPTgkJMQorCisvKiogODAyLjExIFJTTiBJRTogY2lwaGVyIHR5cGUgZm9yIDQwLWJpdCBXRVAgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9SU05fQ1RZUEVfV0VQNDAJX01LT1VJICggMCwgMCwgMCwgMHgwMSApCisKKy8qKiA4MDIuMTEgUlNOIElFOiBjaXBoZXIgdHlwZSBmb3IgMTA0LWJpdCBXRVAgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9SU05fQ1RZUEVfV0VQMTA0CV9NS09VSSAoIDAsIDAsIDAsIDB4MDUgKQorCisvKiogODAyLjExIFJTTiBJRTogY2lwaGVyIHR5cGUgZm9yIFRLSVAgKCJXUEEiKSAqLworI2RlZmluZSAgSUVFRTgwMjExX1JTTl9DVFlQRV9US0lQCV9NS09VSSAoIDAsIDAsIDAsIDB4MDIgKQorCisvKiogODAyLjExIFJTTiBJRTogY2lwaGVyIHR5cGUgZm9yIENDTVAgKCJXUEEyIikgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9SU05fQ1RZUEVfQ0NNUAlfTUtPVUkgKCAwLCAwLCAwLCAweDA0ICkKKworLyoqIDgwMi4xMSBSU04gSUU6IGNpcGhlciB0eXBlIGZvciAidXNlIGdyb3VwIgorICoKKyAqIFRoaXMgY2FuIG9ubHkgYXBwZWFyIGFzIGEgcGFpcndpc2UgY2lwaGVyLCBhbmQgbWVhbnMgdW5pY2FzdCBmcmFtZXMKKyAqIHNob3VsZCBiZSBlbmNyeXB0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWVzLgorICovCisjZGVmaW5lICBJRUVFODAyMTFfUlNOX0NUWVBFX1VTRUdST1VQCV9NS09VSSAoIDAsIDAsIDAsIDB4MDAgKQorCisvKiogODAyLjExIFJTTiBJRTogYXV0aCBtZXRob2QgdHlwZSBmb3IgdXNpbmcgYW4gODAyLjFYIHNlcnZlciAqLworI2RlZmluZSAgSUVFRTgwMjExX1JTTl9BVFlQRV84MDIxWAlfTUtPVUkgKCAwLCAwLCAwLCAweDAxICkKKworLyoqIDgwMi4xMSBSU04gSUU6IGF1dGggbWV0aG9kIHR5cGUgZm9yIHVzaW5nIGEgcHJlLXNoYXJlZCBrZXkgKi8KKyNkZWZpbmUgIElFRUU4MDIxMV9SU05fQVRZUEVfUFNLCV9NS09VSSAoIDAsIDAsIDAsIDB4MDIgKQorCisvKiogODAyLjExIFJTTiBJRSBjYXBhYmlsaXRpZXM6IEFQIHN1cHBvcnRzIHByZS1hdXRoZW50aWNhdGlvbiAqLworI2RlZmluZSAgSUVFRTgwMjExX1JTTl9DQVBBQl9QUkVBVVRICTB4MDAxCisKKy8qKiA4MDIuMTEgUlNOIElFIGNhcGFiaWxpdGllczogTm9kZSBoYXMgY29uZmxpY3QgYmV0d2VlbiBUS0lQIGFuZCBXRVAKKyAqCisgKiBUaGlzIGlzIGEgbGVnYWN5IGlzc3VlOyBBUHMgYWx3YXlzIHNldCBpdCB0byAwLCBhbmQgZ1BYRSBzZXRzIGl0IHRvCisgKiAwLgorICovCisjZGVmaW5lICBJRUVFODAyMTFfUlNOX0NBUEFCX05PX1BBSVJXSVNFIDB4MDAyCisKKy8qKiA4MDIuMTEgUlNOIElFIGNhcGFiaWxpdGllczogTnVtYmVyIG9mIFBUS1NBIHJlcGxheSBjb3VudGVycworICoKKyAqIEEgdmFsdWUgb2YgMCBtZWFucyBvbmUgcmVwbGF5IGNvdW50ZXIsIDEgbWVhbnMgdHdvLCAyIG1lYW5zIGZvdXIsCisgKiBhbmQgMyBtZWFucyBzaXh0ZWVuLgorICovCisjZGVmaW5lICBJRUVFODAyMTFfUlNOX0NBUEFCX1BUS1NBX1JFUExBWSAweDAwQworCisvKiogODAyLjExIFJTTiBJRSBjYXBhYmlsaXRpZXM6IE51bWJlciBvZiBHVEtTQSByZXBsYXkgY291bnRlcnMKKyAqCisgKiBBIHZhbHVlIG9mIDAgbWVhbnMgb25lIHJlcGxheSBjb3VudGVyLCAxIG1lYW5zIHR3bywgMiBtZWFucyBmb3VyLAorICogYW5kIDMgbWVhbnMgc2l4dGVlbi4KKyAqLworI2RlZmluZSAgSUVFRTgwMjExX1JTTl9DQVBBQl9HVEtTQV9SRVBMQVkgMHgwMzAKKworLyoqIDgwMi4xMSBSU04gSUUgY2FwYWJpbGl0aWVzOiBQZWVyS2V5IEhhbmRzaGFraW5nIGlzIHN1cG9ydGVkICovCisjZGVmaW5lICBJRUVFODAyMTFfUlNOX0NBUEFCX1BFRVJLRVkJMHgyMDAKKworCisvKiogODAyLjExIFJTTiBJRSBjYXBhYmlsaXRpZXM6IE9uZSByZXBsYXkgY291bnRlcgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIEFORCdlZCB3aXRoIEBjIElFRUU4MDIxMV9SU05fQ0FQQUJfUFRLU0FfUkVQTEFZIG9yCisgKiBAYyBJRUVFODAyMTFfUlNOX0NBUEFCX0dUS1NBX1JFUExBWSAob3IgYm90aCkgdG8gcHJvZHVjZSBhIHZhbHVlCisgKiB3aGljaCBjYW4gYmUgT1InZWQgaW50byB0aGUgY2FwYWJpbGl0aWVzIGZpZWxkLgorICovCisjZGVmaW5lIElFRUU4MDIxMV9SU05fMV9DVFIJCTB4MDAwCisKKy8qKiA4MDIuMTEgUlNOIElFIGNhcGFiaWxpdGllczogVHdvIHJlcGxheSBjb3VudGVycyAqLworI2RlZmluZSBJRUVFODAyMTFfUlNOXzJfQ1RSCQkweDAxNAorCisvKiogODAyLjExIFJTTiBJRSBjYXBhYmlsaXRpZXM6IEZvdXIgcmVwbGF5IGNvdW50ZXJzICovCisjZGVmaW5lIElFRUU4MDIxMV9SU05fNF9DVFIJCTB4MDI4CisKKy8qKiA4MDIuMTEgUlNOIElFIGNhcGFiaWxpdGllczogMTYgcmVwbGF5IGNvdW50ZXJzICovCisjZGVmaW5lIElFRUU4MDIxMV9SU05fMTZfQ1RSCQkweDAzQworCisKKy8qKiA4MDIuMTEgVmVuZG9yIFNwZWNpZmljIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqCisgKiBPbmUgb2Z0ZW4gc2VlcyB0aGUgUlNOIElFIG1hc3F1ZXJhZGluZyBhcyB2ZW5kb3Itc3BlY2lmaWMgb24KKyAqIGRldmljZXMgdGhhdCB3ZXJlIHByb2R1Y2VkIHByaW9yIHRvIDgwMi4xMWkgKHRoZSBXUEEgYW1lbmRtZW50KQorICogYmVpbmcgZmluYWxpemVkLgorICovCitzdHJ1Y3QgaWVlZTgwMjExX2llX3ZlbmRvciB7CisJdTggaWQ7CQkJLyoqPCBWZW5kb3Itc3BlY2lmaWMgSUQ6IDIyMSAqLworCXU4IGxlbjsJCQkvKio8IFZlbmRvci1zcGVjaWZpYyBsZW5ndGg6IHZhcmlhYmxlICovCisJdTMyIG91aTsJCS8qKjwgT1VJIGFuZCB2ZW5kb3Itc3BlY2lmaWMgdHlwZSBieXRlICovCisJdTggZGF0YVswXTsJCS8qKjwgVmVuZG9yLXNwZWNpZmljIGRhdGEgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogSW5mb3JtYXRpb24gZWxlbWVudCBJRCBmb3IgVmVuZG9yIFNwZWNpZmljIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0lFX1ZFTkRPUgkyMjEKKworCisKKworLyoqIEFueSA4MDIuMTEgaW5mb3JtYXRpb24gZWxlbWVudAorICoKKyAqIFRoaXMgaXMgZm9ybWF0dGVkIGZvciBlYXNlIG9mIHVzZSwgc28gSUVzIHdpdGggY29tcGxleCBzdHJ1Y3R1cmVzCisgKiBnZXQgcmVmZXJlbmNlZCBpbiBmdWxsLCB3aGlsZSB0aG9zZSB3aXRoIG9ubHkgb25lIGJ5dGUgb2YgZGF0YSBvciBhCisgKiBzaW1wbGUgYXJyYXkgYXJlIHB1bGxlZCBpbiB0byBhdm9pZCBhIGxheWVyIG9mIGluZGlyZWN0aW9uIGxpa2UKKyAqIGllLT5jaGFubmVscy5jaGFubmVsc1swXS4KKyAqLwordW5pb24gaWVlZTgwMjExX2llCit7CisJLyoqIEdlbmVyaWMgYW5kIHNpbXBsZSBpbmZvcm1hdGlvbiBlbGVtZW50IGluZm8gKi8KKwlzdHJ1Y3QgeworCQl1OCBpZDsJCS8qKjwgSW5mb3JtYXRpb24gZWxlbWVudCBJRCAqLworCQl1OCBsZW47CQkvKio8IEluZm9ybWF0aW9uIGVsZW1lbnQgZGF0YSBsZW5ndGggKi8KKwkJdW5pb24geworCQkJY2hhciBzc2lkWzBdOwkvKio8IFNTSUQgdGV4dCAqLworCQkJdTggcmF0ZXNbMF07CS8qKjwgUmF0ZXMgZGF0YSAqLworCQkJdTggcmVxdWVzdFswXTsJLyoqPCBSZXF1ZXN0IGxpc3QgKi8KKwkJCXU4IGNoYWxsZW5nZV90ZXh0WzBdOyAvKio8IENoYWxsZW5nZSB0ZXh0IGRhdGEgKi8KKwkJCXU4IHBvd2VyX2NvbnN0cmFpbnQ7IC8qKjwgUG93ZXIgY29uc3RyYWludCwgZEJtICovCisJCQl1OCBlcnBfaW5mbzsJLyoqPCBFUlAgaW5mb3JtYXRpb24gZmxhZ3MgKi8KKwkJCS8qKiBMaXN0IG9mIGNoYW5uZWxzICovCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2llX2NoYW5uZWxzX2NoYW5uZWxfYmFuZCBjaGFubmVsc1swXTsKKwkJfTsKKwl9OworCisJLyoqIERTIHBhcmFtZXRlciBzZXQgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2llX2RzX3BhcmFtIGRzX3BhcmFtOworCisJLyoqIENvdW50cnkgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2llX2NvdW50cnkgY291bnRyeTsKKworCS8qKiBQb3dlciBjYXBhYmlsaXR5ICovCisJc3RydWN0IGllZWU4MDIxMV9pZV9wb3dlcl9jYXBhYiBwb3dlcl9jYXBhYjsKKworCS8qKiBTZWN1cml0eSBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBpZWVlODAyMTFfaWVfcnNuIHJzbjsKKworCS8qKiBWZW5kb3Itc3BlY2lmaWMgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2llX3ZlbmRvciB2ZW5kb3I7Cit9OworCisvKiogQ2hlY2sgdGhhdCA4MDIuMTEgaW5mb3JtYXRpb24gZWxlbWVudCBpcyBib3VuZGVkIGJ5IGJ1ZmZlcgorICoKKyAqIEB2IGllCUluZm9ybWF0aW9uIGVsZW1lbnQKKyAqIEB2IGVuZAlFbmQgb2YgYnVmZmVyIGluIHdoaWNoIGluZm9ybWF0aW9uIGVsZW1lbnQgaXMgc3RvcmVkCisgKiBAcmV0IG9rCVRSVUUgaWYgdGhlIElFIGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9pZV9ib3VuZCAoIHVuaW9uIGllZWU4MDIxMV9pZSAqaWUsIHZvaWQgKmVuZCApCit7CisJdm9pZCAqaWVwID0gaWU7CisJcmV0dXJuICggaWVwICsgMiA8PSBlbmQgJiYgaWVwICsgMiArIGllLT5sZW4gPD0gZW5kICk7Cit9CisKKy8qKiBBZHZhbmNlIHRvIG5leHQgODAyLjExIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqCisgKiBAdiBpZQlDdXJyZW50IGluZm9ybWF0aW9uIGVsZW1lbnQgcG9pbnRlcgorICogQHYgZW5kCVBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBub3QgaW4gaW5mb3JtYXRpb24gZWxlbWVudCBzcGFjZQorICogQHJldCBuZXh0CVBvaW50ZXIgdG8gbmV4dCBpbmZvcm1hdGlvbiBlbGVtZW50LCBvciBOVUxMIGlmIG5vIG1vcmUKKyAqCisgKiBXaGVuIHByb2Nlc3NpbmcgcmVjZWl2ZWQgSUVzLCBAYSBlbmQgc2hvdWxkIGJlIHNldCB0byB0aGUgSS9PCisgKiBidWZmZXIgdGFpbCBwb2ludGVyOyB3aGVuIG1hcnNoYWxsaW5nIElFcyBmb3Igc2VuZGluZywgQGEgZW5kCisgKiBzaG91bGQgYmUgTlVMTC4KKyAqLworc3RhdGljIGlubGluZSB1bmlvbiBpZWVlODAyMTFfaWUgKiBpZWVlODAyMTFfbmV4dF9pZSAoIHVuaW9uIGllZWU4MDIxMV9pZSAqaWUsCisJCQkJCQkgICAgICAgdm9pZCAqZW5kICkKK3sKKwl2b2lkICpuZXh0X2llX2J5dGUgPSAoIHZvaWQgKiApIGllICsgaWUtPmxlbiArIDI7CisJdW5pb24gaWVlZTgwMjExX2llICpuZXh0X2llID0gbmV4dF9pZV9ieXRlOworCisJaWYgKCAhIGVuZCApCisJCXJldHVybiBuZXh0X2llOworCisJaWYgKCBpZWVlODAyMTFfaWVfYm91bmQgKCBuZXh0X2llLCBlbmQgKSApCisJCXJldHVybiBuZXh0X2llOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKiBAfSAqLworCisKKy8qIC0tLS0tLS0tLS0gTWFuYWdlbWVudCBmcmFtZSBkYXRhIGZvcm1hdHMgLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEBkZWZncm91cCBpZWVlODAyMTFfbWdtdF9kYXRhIE1hbmFnZW1lbnQgZnJhbWUgZGF0YSBwYXlsb2FkcworICogQHsKKyAqLworCisvKiogQmVhY29uIG9yIHByb2JlIHJlc3BvbnNlIGZyYW1lIGRhdGEgKi8KK3N0cnVjdCBpZWVlODAyMTFfYmVhY29uX29yX3Byb2JlX3Jlc3AKK3sKKwkvKiogODAyLjExIFRTRlQgdmFsdWUgYXQgZnJhbWUgc2VuZCAqLworCXU2NCB0aW1lc3RhbXA7CisKKwkvKiogSW50ZXJ2YWwgYXQgd2hpY2ggYmVhY29ucyBhcmUgc2VudCwgaW4gdW5pdHMgb2YgMTAyNCB1cyAqLworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisKKwkvKiogQ2FwYWJpbGl0eSBmbGFncyAqLworCXUxNiBjYXBhYmlsaXR5OworCisJLyoqIExpc3Qgb2YgaW5mb3JtYXRpb24gZWxlbWVudHMgKi8KKwl1bmlvbiBpZWVlODAyMTFfaWUgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBpZWVlODAyMTFfYmVhY29uCWllZWU4MDIxMV9iZWFjb25fb3JfcHJvYmVfcmVzcAorI2RlZmluZSBpZWVlODAyMTFfcHJvYmVfcmVzcAlpZWVlODAyMTFfYmVhY29uX29yX3Byb2JlX3Jlc3AKKworLyoqIERpc2Fzc29jaWF0aW9uIG9yIGRlYXV0aGVudGljYXRpb24gZnJhbWUgZGF0YSAqLworc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19vcl9kZWF1dGgKK3sKKwkvKiogUmVhc29uIGNvZGUgKi8KKwl1MTYgcmVhc29uOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBpZWVlODAyMTFfZGlzYXNzb2MJaWVlZTgwMjExX2Rpc2Fzc29jX29yX2RlYXV0aAorI2RlZmluZSBpZWVlODAyMTFfZGVhdXRoCWllZWU4MDIxMV9kaXNhc3NvY19vcl9kZWF1dGgKKworLyoqIEFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgZGF0YSAqLworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXEKK3sKKwkvKiogQ2FwYWJpbGl0eSBmbGFncyAqLworCXUxNiBjYXBhYmlsaXR5OworCisJLyoqIEludGVydmFsIGF0IHdoaWNoIHdlIHdha2UgdXAsIGluIHVuaXRzIG9mIHRoZSBiZWFjb24gaW50ZXJ2YWwgKi8KKwl1MTYgbGlzdGVuX2ludGVydmFsOworCisJLyoqIExpc3Qgb2YgaW5mb3JtYXRpb24gZWxlbWVudHMgKi8KKwl1bmlvbiBpZWVlODAyMTFfaWUgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqIEFzc29jaWF0aW9uIG9yIHJlYXNzb2NpYXRpb24gcmVzcG9uc2UgZnJhbWUgZGF0YSAqLworc3RydWN0IGllZWU4MDIxMV9hc3NvY19vcl9yZWFzc29jX3Jlc3AKK3sKKwkvKiogQ2FwYWJpbGl0eSBmbGFncyAqLworCXUxNiBjYXBhYmlsaXR5OworCisJLyoqIFN0YXR1cyBjb2RlICovCisJdTE2IHN0YXR1czsKKworCS8qKiBBc3NvY2lhdGlvbiBJRCAqLworCXUxNiBhaWQ7CisKKwkvKiogTGlzdCBvZiBpbmZvcm1hdGlvbiBlbGVtZW50cyAqLworCXVuaW9uIGllZWU4MDIxMV9pZSBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIGllZWU4MDIxMV9hc3NvY19yZXNwCWllZWU4MDIxMV9hc3NvY19vcl9yZWFzc29jX3Jlc3AKKyNkZWZpbmUgaWVlZTgwMjExX3JlYXNzb2NfcmVzcAlpZWVlODAyMTFfYXNzb2Nfb3JfcmVhc3NvY19yZXNwCisKKy8qKiBSZWFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgZGF0YSAqLworc3RydWN0IGllZWU4MDIxMV9yZWFzc29jX3JlcQoreworCS8qKiBDYXBhYmlsaXR5IGZsYWdzICovCisJdTE2IGNhcGFiaWxpdHk7CisKKwkvKiogSW50ZXJ2YWwgYXQgd2hpY2ggd2Ugd2FrZSB1cCwgaW4gdW5pdHMgb2YgdGhlIGJlYWNvbiBpbnRlcnZhbCAqLworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisKKwkvKiogTUFDIGFkZHJlc3Mgb2YgY3VycmVudCBBY2Nlc3MgUG9pbnQgKi8KKwl1OCBjdXJyZW50X2FkZHJbRVRIX0FMRU5dOworCisJLyoqIExpc3Qgb2YgaW5mb3JtYXRpb24gZWxlbWVudHMgKi8KKwl1bmlvbiBpZWVlODAyMTFfaWUgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqIFByb2JlIHJlcXVlc3QgZnJhbWUgZGF0YSAqLworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXEKK3sKKwkvKiogTGlzdCBvZiBpbmZvcm1hdGlvbiBlbGVtZW50cyAqLworCXVuaW9uIGllZWU4MDIxMV9pZSBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiogQXV0aGVudGljYXRpb24gZnJhbWUgZGF0YSAqLworc3RydWN0IGllZWU4MDIxMV9hdXRoCit7CisJLyoqIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSAoT3BlbiBTeXN0ZW0gb3IgU2hhcmVkIEtleSkgKi8KKwl1MTYgYWxnb3JpdGhtOworCisJLyoqIFNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGZyYW1lOyBmaXJzdCBmcm9tIGNsaWVudCB0byBBUCBpcyAxICovCisJdTE2IHR4X3NlcTsKKworCS8qKiBTdGF0dXMgY29kZSAqLworCXUxNiBzdGF0dXM7CisKKwkvKiogTGlzdCBvZiBpbmZvcm1hdGlvbiBlbGVtZW50cyAqLworCXVuaW9uIGllZWU4MDIxMV9pZSBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiogT3BlbiBTeXN0ZW0gYXV0aGVudGljYXRpb24gYWxnb3JpdGhtICovCisjZGVmaW5lIElFRUU4MDIxMV9BVVRIX09QRU5fU1lTVEVNICAwCisKKy8qKiBTaGFyZWQgS2V5IGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSAqLworI2RlZmluZSBJRUVFODAyMTFfQVVUSF9TSEFSRURfS0VZICAgMQorCisvKiogQH0gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWZfYXJwLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWZfYXJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyYmIzYgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pZl9hcnAuaApAQCAtMCwwICsxLDEwMiBAQAorI2lmbmRlZglfR1BYRV9JRl9BUlBfSAorI2RlZmluZQlfR1BYRV9JRl9BUlBfSAorCisvKiogQGZpbGUKKyAqCisgKiBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgY29uc3RhbnRzIGFuZCB0eXBlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogQVJQIHByb3RvY29sIEhBUkRXQVJFIGlkZW50aWZpZXJzLiAqLworI2RlZmluZSBBUlBIUkRfTkVUUk9NCTAJCS8qKjwgZnJvbSBLQTlROiBORVQvUk9NIHBzZXVkbwkqLworI2RlZmluZSBBUlBIUkRfRVRIRVIgCTEJCS8qKjwgRXRoZXJuZXQgMTBNYnBzCQkqLworI2RlZmluZQlBUlBIUkRfRUVUSEVSCTIJCS8qKjwgRXhwZXJpbWVudGFsIEV0aGVybmV0CSovCisjZGVmaW5lCUFSUEhSRF9BWDI1CTMJCS8qKjwgQVguMjUgTGV2ZWwgMgkJKi8KKyNkZWZpbmUJQVJQSFJEX1BST05FVAk0CQkvKio8IFBST25ldCB0b2tlbiByaW5nCQkqLworI2RlZmluZQlBUlBIUkRfQ0hBT1MJNQkJLyoqPCBDaGFvc25ldAkJCSovCisjZGVmaW5lCUFSUEhSRF9JRUVFODAyCTYJCS8qKjwgSUVFRSA4MDIuMiBFdGhlcm5ldC9UUi9UQgkqLworI2RlZmluZQlBUlBIUkRfQVJDTkVUCTcJCS8qKjwgQVJDbmV0CQkJKi8KKyNkZWZpbmUJQVJQSFJEX0FQUExFVExLCTgJCS8qKjwgQVBQTEV0YWxrCQkJKi8KKyNkZWZpbmUgQVJQSFJEX0RMQ0kJMTUJCS8qKjwgRnJhbWUgUmVsYXkgRExDSQkJKi8KKyNkZWZpbmUgQVJQSFJEX0FUTQkxOQkJLyoqPCBBVE0gCQkJKi8KKyNkZWZpbmUgQVJQSFJEX01FVFJJQ09NCTIzCQkvKio8IE1ldHJpY29tIFNUUklQIChuZXcgSUFOQSBpZCkgKi8KKyNkZWZpbmUJQVJQSFJEX0lFRUUxMzk0CTI0CQkvKio8IElFRUUgMTM5NCBJUHY0IC0gUkZDIDI3MzQJKi8KKyNkZWZpbmUgQVJQSFJEX0VVSTY0CTI3CQkvKio8IEVVSS02NAkJCSovCisjZGVmaW5lIEFSUEhSRF9JTkZJTklCQU5EIDMyCQkvKio8IEluZmluaUJhbmQJCQkqLworCisvKiBBUlAgcHJvdG9jb2wgb3Bjb2Rlcy4gKi8KKyNkZWZpbmUJQVJQT1BfUkVRVUVTVAkxCQkvKio8IEFSUCByZXF1ZXN0CQkqLworI2RlZmluZQlBUlBPUF9SRVBMWQkyCQkvKio8IEFSUCByZXBseQkJCSovCisjZGVmaW5lCUFSUE9QX1JSRVFVRVNUCTMJCS8qKjwgUkFSUCByZXF1ZXN0CQkqLworI2RlZmluZQlBUlBPUF9SUkVQTFkJNAkJLyoqPCBSQVJQIHJlcGx5CQkJKi8KKyNkZWZpbmUJQVJQT1BfSW5SRVFVRVNUCTgJCS8qKjwgSW5BUlAgcmVxdWVzdAkJKi8KKyNkZWZpbmUJQVJQT1BfSW5SRVBMWQk5CQkvKio8IEluQVJQIHJlcGx5CQkqLworI2RlZmluZQlBUlBPUF9OQUsJMTAJCS8qKjwgKEFUTSlBUlAgTkFLCQkqLworCisvKioKKyAqIEFuIEFSUCBoZWFkZXIKKyAqCisgKiBUaGlzIGNvbnRhaW5zIG9ubHkgdGhlIGZpeGVkLXNpemUgcG9ydGlvbnMgb2YgYW4gQVJQIGhlYWRlcjsgZm9yCisgKiBvdGhlciBmaWVsZHMgdXNlIHRoZSBhcnBfe3NlbmRlcix0YXJnZXR9X3toYSxwYX0gZmFtaWx5IG9mCisgKiBmdW5jdGlvbnMuCisgKi8KK3N0cnVjdCBhcnBoZHIgeworCS8qKiBMaW5rLWxheWVyIHByb3RvY29sCisJICoKKwkgKiBUaGlzIGlzIGFuIEFSUEhSRF9YWFggY29uc3RhbnQKKwkgKi8KKwl1aW50MTZfdCBhcl9ocmQ7CisJLyoqIE5ldHdvcmstbGF5ZXIgcHJvdG9jb2wKKwkgKgorCSAqIFRoaXMgaXMsIGZvciBFdGhlcm5ldCwgYW4gRVRIX1BfWFhYIGNvbnN0YW50LgorCSAqLworCXVpbnQxNl90IGFyX3BybzsKKwkvKiogTGluay1sYXllciBhZGRyZXNzIGxlbmd0aCAqLworCXVpbnQ4X3QgYXJfaGxuOworCS8qKiBOZXR3b3JrLWxheWVyIGFkZHJlc3MgbGVuZ3RoICovCisJdWludDhfdCBhcl9wbG47CisJLyoqIEFSUCBvcGNvZGUgKi8KKwl1aW50MTZfdCBhcl9vcDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBUlAgcGFja2V0IHNlbmRlciBoYXJkd2FyZSBhZGRyZXNzCisgKgorICogQHYgYXJwaGRyCUFSUCBoZWFkZXIKKyAqIEByZXQgYXJfc2hhCVNlbmRlciBoYXJkd2FyZSBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGFycF9zZW5kZXJfaGEgKCBzdHJ1Y3QgYXJwaGRyICphcnBoZHIgKSB7CisJcmV0dXJuICggKCAoIHZvaWQgKiApIGFycGhkciApICsgc2l6ZW9mICggKmFycGhkciApICk7Cit9CisKKy8qKiBBUlAgcGFja2V0IHNlbmRlciBwcm90b2NvbCBhZGRyZXNzCisgKgorICogQHYgYXJwaGRyCUFSUCBoZWFkZXIKKyAqIEByZXQgYXJfc3BhCVNlbmRlciBwcm90b2NvbCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGFycF9zZW5kZXJfcGEgKCBzdHJ1Y3QgYXJwaGRyICphcnBoZHIgKSB7CisJcmV0dXJuICggYXJwX3NlbmRlcl9oYSAoIGFycGhkciApICsgYXJwaGRyLT5hcl9obG4gKTsKK30KKworLyoqIEFSUCBwYWNrZXQgdGFyZ2V0IGhhcmR3YXJlIGFkZHJlc3MKKyAqCisgKiBAdiBhcnBoZHIJQVJQIGhlYWRlcgorICogQHJldCBhcl90aGEJVGFyZ2V0IGhhcmR3YXJlIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSB2b2lkICogYXJwX3RhcmdldF9oYSAoIHN0cnVjdCBhcnBoZHIgKmFycGhkciApIHsKKwlyZXR1cm4gKCBhcnBfc2VuZGVyX3BhICggYXJwaGRyICkgKyBhcnBoZHItPmFyX3BsbiApOworfQorCisvKiogQVJQIHBhY2tldCB0YXJnZXQgcHJvdG9jb2wgYWRkcmVzcworICoKKyAqIEB2IGFycGhkcglBUlAgaGVhZGVyCisgKiBAcmV0IGFyX3RwYQlUYXJnZXQgcHJvdG9jb2wgYWRkcmVzcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgKiBhcnBfdGFyZ2V0X3BhICggc3RydWN0IGFycGhkciAqYXJwaGRyICkgeworCXJldHVybiAoIGFycF90YXJnZXRfaGEgKCBhcnBoZHIgKSArIGFycGhkci0+YXJfaGxuICk7Cit9CisKKyNlbmRpZgkvKiBfR1BYRV9JRl9BUlBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lmX2V0aGVyLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaWZfZXRoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTZiZWUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lmX2V0aGVyLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZglfR1BYRV9JRl9FVEhFUl9ICisjZGVmaW5lCV9HUFhFX0lGX0VUSEVSX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgRVRIX0FMRU4JCTYJLyogU2l6ZSBvZiBFdGhlcm5ldCBhZGRyZXNzICovCisjZGVmaW5lIEVUSF9ITEVOCQkxNAkvKiBTaXplIG9mIGV0aGVybmV0IGhlYWRlciAqLworI2RlZmluZQlFVEhfWkxFTgkJNjAJLyogTWluaW11bSBwYWNrZXQgKi8KKyNkZWZpbmUJRVRIX0ZSQU1FX0xFTgkJMTUxNAkvKiBNYXhpbXVtIHBhY2tldCAqLworI2RlZmluZSBFVEhfREFUQV9BTElHTgkJMgkvKiBBbW91bnQgbmVlZGVkIHRvIGFsaWduIHRoZSBkYXRhIGFmdGVyIGFuIGV0aGVybmV0IGhlYWRlciAqLworI2lmbmRlZglFVEhfTUFYX01UVQorI2RlZmluZQlFVEhfTUFYX01UVQkJKEVUSF9GUkFNRV9MRU4tRVRIX0hMRU4pCisjZW5kaWYKKworI2RlZmluZSBFVEhfUF9SQVcJMHgwMDAwCS8qIFJhdyBwYWNrZXQgKi8KKyNkZWZpbmUgRVRIX1BfSVAJMHgwODAwCS8qIEludGVybmV0IFByb3RvY2wgUGFja2V0ICovCisjZGVmaW5lIEVUSF9QX0FSUAkweDA4MDYJLyogQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sICovCisjZGVmaW5lIEVUSF9QX1JBUlAJMHg4MDM1CS8qIFJldmVyc2UgQWRkcmVzcyByZXNvbHV0aW9uIFByb3RvY29sICovCisjZGVmaW5lIEVUSF9QX0lQVjYJMHg4NkRECS8qIElQdjYgb3ZlciBibHVlYmxvb2sgKi8KKyNkZWZpbmUgRVRIX1BfU0xPVwkweDg4MDkJLyogRXRoZXJuZXQgc2xvdyBwcm90b2NvbHMgKi8KKyNkZWZpbmUgRVRIX1BfRUFQT0wJMHg4ODhFCS8qIDgwMi4xWCBFQVAgb3ZlciBMQU5zICovCisjZGVmaW5lIEVUSF9QX0FPRQkweDg4QTIJLyogQVRBIG92ZXIgRXRoZXJuZXQgKi8KKworLyoqIEFuIEV0aGVybmV0IGxpbmstbGF5ZXIgaGVhZGVyICovCitzdHJ1Y3QgZXRoaGRyIHsKKwkvKiogRGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KKyAgICAgICAgdWludDhfdCBoX2Rlc3RbRVRIX0FMRU5dOworCS8qKiBTb3VyY2UgTUFDIGFkZHJlc3MgKi8KKyAgICAgICAgdWludDhfdCBoX3NvdXJjZVtFVEhfQUxFTl07CisJLyoqIFByb3RvY29sIElEICovCisgICAgICAgIHVpbnQxNl90IGhfcHJvdG9jb2w7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2VuZGlmCS8qIF9HUFhFX0lGX0VUSEVSX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pbWFnZS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkYjhhZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pbWFnZS5oCkBAIC0wLDAgKzEsMTk0IEBACisjaWZuZGVmIF9HUFhFX0lNQUdFX0gKKyNkZWZpbmUgX0dQWEVfSU1BR0VfSAorCisvKioKKyAqIEBmaWxlCisgKgorICogRXhlY3V0YWJsZS9sb2FkYWJsZSBpbWFnZXMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3JlZmNudC5oPgorCitzdHJ1Y3QgdXJpOworc3RydWN0IGltYWdlX3R5cGU7CisKKy8qKiBBbiBleGVjdXRhYmxlIG9yIGxvYWRhYmxlIGltYWdlICovCitzdHJ1Y3QgaW1hZ2UgeworCS8qKiBSZWZlcmVuY2UgY291bnQgKi8KKwlzdHJ1Y3QgcmVmY250IHJlZmNudDsKKworCS8qKiBMaXN0IG9mIHJlZ2lzdGVyZWQgaW1hZ2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLyoqIFVSSSBvZiBpbWFnZSAqLworCXN0cnVjdCB1cmkgKnVyaTsKKwkvKiogTmFtZSAqLworCWNoYXIgbmFtZVsxNl07CisJLyoqIEZsYWdzICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJLyoqIENvbW1hbmQgbGluZSB0byBwYXNzIHRvIGltYWdlICovCisJY2hhciAqY21kbGluZTsKKwkvKiogUmF3IGZpbGUgaW1hZ2UgKi8KKwl1c2VycHRyX3QgZGF0YTsKKwkvKiogTGVuZ3RoIG9mIHJhdyBmaWxlIGltYWdlICovCisJc2l6ZV90IGxlbjsKKworCS8qKiBJbWFnZSB0eXBlLCBpZiBrbm93biAqLworCXN0cnVjdCBpbWFnZV90eXBlICp0eXBlOworCS8qKiBJbWFnZSB0eXBlIHByaXZhdGUgZGF0YSAqLworCXVuaW9uIHsKKwkJcGh5c2FkZHJfdCBwaHlzOworCQl1c2VycHRyX3QgdXNlcjsKKwkJdW5zaWduZWQgbG9uZyB1bDsKKwl9IHByaXY7CisKKwkvKiogUmVwbGFjZW1lbnQgaW1hZ2UKKwkgKgorCSAqIEFuIGltYWdlIHdpc2hpbmcgdG8gcmVwbGFjZSBpdHNlbGYgd2l0aCBhbm90aGVyIGltYWdlIChpbiBhCisJICogc3R5bGUgc2ltaWxhciB0byBhIFVuaXggZXhlYygpIGNhbGwpIHNob3VsZCByZXR1cm4gZnJvbSBpdHMKKwkgKiBleGVjKCkgbWV0aG9kIHdpdGggdGhlIHJlcGxhY2VtZW50IGltYWdlIHNldCB0byBwb2ludCB0bworCSAqIHRoZSBuZXcgaW1hZ2UuICBUaGUgbmV3IGltYWdlIG11c3QgYWxyZWFkeSBiZSBpbiBhIHN1aXRhYmxlCisJICogc3RhdGUgZm9yIGV4ZWN1dGlvbiAoaS5lLiBsb2FkZWQpLgorCSAqCisJICogSWYgYW4gaW1hZ2UgdW5yZWdpc3RlcnMgaXRzZWxmIGFzIGEgcmVzdWx0IG9mIGJlaW5nCisJICogZXhlY3V0ZWQsIGl0IG11c3QgbWFrZSBzdXJlIHRoYXQgaXRzIHJlcGxhY2VtZW50IGltYWdlIChpZgorCSAqIGFueSkgaXMgcmVnaXN0ZXJlZCwgb3RoZXJ3aXNlIHRoZSByZXBsYWNlbWVudCBpcyBsaWtlbHkgdG8KKwkgKiBiZSBmcmVlZCBiZWZvcmUgaXQgY2FuIGJlIGV4ZWN1dGVkLgorCSAqLworCXN0cnVjdCBpbWFnZSAqcmVwbGFjZW1lbnQ7Cit9OworCisvKiogSW1hZ2UgaXMgbG9hZGVkICovCisjZGVmaW5lIElNQUdFX0xPQURFRCAweDAwMDEKKworLyoqIEFuIGV4ZWN1dGFibGUgb3IgbG9hZGFibGUgaW1hZ2UgdHlwZSAqLworc3RydWN0IGltYWdlX3R5cGUgeworCS8qKiBOYW1lIG9mIHRoaXMgaW1hZ2UgdHlwZSAqLworCWNoYXIgKm5hbWU7CisJLyoqCisJICogTG9hZCBpbWFnZSBpbnRvIG1lbW9yeQorCSAqCisJICogQHYgaW1hZ2UJCUV4ZWN1dGFibGUvbG9hZGFibGUgaW1hZ2UKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKgorCSAqIExvYWQgdGhlIGltYWdlIGludG8gbWVtb3J5IGF0IHRoZSBjb3JyZWN0IGxvY2F0aW9uIGFzCisJICogZGV0ZXJtaW5lZCBieSB0aGUgZmlsZSBmb3JtYXQuCisJICoKKwkgKiBJZiB0aGUgZmlsZSBpbWFnZSBpcyBpbiB0aGUgY29ycmVjdCBmb3JtYXQsIHRoZSBtZXRob2QgbXVzdAorCSAqIHVwZGF0ZSBAYyBpbWFnZS0+dHlwZSB0byBwb2ludCB0byBpdHMgb3duIHR5cGUgKHVubGVzcyBAYworCSAqIGltYWdlLT50eXBlIGlzIGFscmVhZHkgc2V0KS4gIFRoaXMgYWxsb3dzIHRoZSBhdXRvbG9hZGluZworCSAqIGNvZGUgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gInRoaXMgaXMgbm90IG15IGltYWdlIGZvcm1hdCIKKwkgKiBhbmQgInRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoaXMgaW1hZ2UiLiAgSW4KKwkgKiBwYXJ0aWN1bGFyLCBzZXR0aW5nIEBjIGltYWdlLT50eXBlIGFuZCB0aGVuIHJldHVybmluZyBhbgorCSAqIGVycm9yIHdpbGwgY2F1c2UgaW1hZ2VfYXV0b2xvYWQoKSB0byBhYm9ydCBhbmQgcmV0dXJuIGFuCisJICogZXJyb3IsIHJhdGhlciB0aGFuIGNvbnRpbnVpbmcgdG8gdGhlIG5leHQgaW1hZ2UgdHlwZS4KKwkgKi8KKwlpbnQgKCAqIGxvYWQgKSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKTsKKwkvKioKKwkgKiBFeGVjdXRlIGxvYWRlZCBpbWFnZQorCSAqCisJICogQHYgaW1hZ2UJCUxvYWRlZCBpbWFnZQorCSAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorCSAqCisJICogTm90ZSB0aGF0IHRoZSBpbWFnZSBtYXkgYmUgaW52YWxpZGF0ZWQgYnkgdGhlIGFjdCBvZgorCSAqIGV4ZWN1dGlvbiwgaS5lLiBhbiBpbWFnZSBpcyBhbGxvd2VkIHRvIGNob29zZSB0byB1bnJlZ2lzdGVyCisJICogKGFuZCBzbyBwb3RlbnRpYWxseSBmcmVlKSBpdHNlbGYuCisJICovCisJaW50ICggKiBleGVjICkgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICk7Cit9OworCisvKioKKyAqIE11bHRpYm9vdCBpbWFnZSBwcm9iZSBwcmlvcml0eQorICoKKyAqIE11bHRpYm9vdCBpbWFnZXMgYXJlIGFsc28gdmFsaWQgZXhlY3V0YWJsZXMgaW4gYW5vdGhlciBmb3JtYXQKKyAqIChlLmcuIEVMRiksIHNvIHdlIG11c3QgcGVyZm9ybSB0aGUgbXVsdGlib290IHByb2JlIGZpcnN0LgorICovCisjZGVmaW5lIFBST0JFX01VTFRJQk9PVAkwMQorCisvKioKKyAqIE5vcm1hbCBpbWFnZSBwcm9iZSBwcmlvcml0eQorICovCisjZGVmaW5lIFBST0JFX05PUk1BTCAwMgorCisvKioKKyAqIFBYRSBpbWFnZSBwcm9iZSBwcmlvcml0eQorICoKKyAqIFBYRSBpbWFnZXMgaGF2ZSBubyBzaWduYXR1cmUgY2hlY2tzLCBzbyB3aWxsIGNsYWltIGFsbCBpbWFnZSBmaWxlcy4KKyAqIFRoZXkgbXVzdCB0aGVyZWZvcmUgYmUgdHJpZWQgbGFzdCBpbiB0aGUgcHJvYmUgb3JkZXIgbGlzdC4KKyAqLworI2RlZmluZSBQUk9CRV9QWEUgMDMKKworLyoqIEV4ZWN1dGFibGUgb3IgbG9hZGFibGUgaW1hZ2UgdHlwZSB0YWJsZSAqLworI2RlZmluZSBJTUFHRV9UWVBFUyBfX3RhYmxlICggc3RydWN0IGltYWdlX3R5cGUsICJpbWFnZV90eXBlcyIgKQorCisvKiogQW4gZXhlY3V0YWJsZSBvciBsb2FkYWJsZSBpbWFnZSB0eXBlICovCisjZGVmaW5lIF9faW1hZ2VfdHlwZSggcHJvYmVfb3JkZXIgKSBfX3RhYmxlX2VudHJ5ICggSU1BR0VfVFlQRVMsIHByb2JlX29yZGVyICkKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaW1hZ2VzOworCisvKiogSXRlcmF0ZSBvdmVyIGFsbCByZWdpc3RlcmVkIGltYWdlcyAqLworI2RlZmluZSBmb3JfZWFjaF9pbWFnZSggaW1hZ2UgKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIChpbWFnZSksICZpbWFnZXMsIGxpc3QgKQorCisvKioKKyAqIFRlc3QgZm9yIGV4aXN0ZW5jZSBvZiBpbWFnZXMKKyAqCisgKiBAcmV0IGV4aXN0ZW5jZQlTb21lIGltYWdlcyBleGlzdAorICovCitzdGF0aWMgaW5saW5lIGludCBoYXZlX2ltYWdlcyAoIHZvaWQgKSB7CisJcmV0dXJuICggISBsaXN0X2VtcHR5ICggJmltYWdlcyApICk7Cit9CisKK2V4dGVybiBzdHJ1Y3QgaW1hZ2UgKiBhbGxvY19pbWFnZSAoIHZvaWQgKTsKK2V4dGVybiBpbnQgaW1hZ2Vfc2V0X3VyaSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsIHN0cnVjdCB1cmkgKnVyaSApOworZXh0ZXJuIGludCBpbWFnZV9zZXRfY21kbGluZSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsIGNvbnN0IGNoYXIgKmNtZGxpbmUgKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfaW1hZ2UgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICk7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2ltYWdlICggc3RydWN0IGltYWdlICppbWFnZSApOworZXh0ZXJuIHZvaWQgcHJvbW90ZV9pbWFnZSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKTsKK3N0cnVjdCBpbWFnZSAqIGZpbmRfaW1hZ2UgKCBjb25zdCBjaGFyICpuYW1lICk7CitleHRlcm4gaW50IGltYWdlX2xvYWQgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICk7CitleHRlcm4gaW50IGltYWdlX2F1dG9sb2FkICggc3RydWN0IGltYWdlICppbWFnZSApOworZXh0ZXJuIGludCBpbWFnZV9leGVjICggc3RydWN0IGltYWdlICppbWFnZSApOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRfYXV0b2xvYWRfaW1hZ2UgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICk7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZF9hdXRvZXhlY19pbWFnZSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKTsKKworLyoqCisgKiBJbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9uIGFuIGltYWdlCisgKgorICogQHYgaW1hZ2UJCUltYWdlCisgKiBAcmV0IGltYWdlCQlJbWFnZQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbWFnZSAqIGltYWdlX2dldCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJcmVmX2dldCAoICZpbWFnZS0+cmVmY250ICk7CisJcmV0dXJuIGltYWdlOworfQorCisvKioKKyAqIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQgb24gYW4gaW1hZ2UKKyAqCisgKiBAdiBpbWFnZQkJSW1hZ2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGltYWdlX3B1dCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJcmVmX3B1dCAoICZpbWFnZS0+cmVmY250ICk7Cit9CisKKy8qKgorICogU2V0IGltYWdlIG5hbWUKKyAqCisgKiBAdiBpbWFnZQkJSW1hZ2UKKyAqIEB2IG5hbWUJCU5ldyBpbWFnZSBuYW1lCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBpbnQgaW1hZ2Vfc2V0X25hbWUgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLCBjb25zdCBjaGFyICpuYW1lICkgeworCXN0cm5jcHkgKCBpbWFnZS0+bmFtZSwgbmFtZSwgKCBzaXplb2YgKCBpbWFnZS0+bmFtZSApIC0gMSApICk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfR1BYRV9JTUFHRV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaW4uaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTM3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaW4uaApAQCAtMCwwICsxLDEwNCBAQAorI2lmbmRlZglfR1BYRV9JTl9ICisjZGVmaW5lCV9HUFhFX0lOX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9zb2NrZXQuaD4KKworLyogUHJvdG9jb2wgbnVtYmVycyAqLworCisjZGVmaW5lIElQX0lDTVAJCTEKKyNkZWZpbmUgSVBfVENQCQk2CisjZGVmaW5lIElQX1VEUAkJMTcKKyNkZWZpbmUgSVBfSUNNUDYJNTgKKworLyogSVAgYWRkcmVzcyBjb25zdGFudHMgKi8KKworI2RlZmluZSBJTkFERFJfTk9ORSAweGZmZmZmZmZmCisKKyNkZWZpbmUgSU5BRERSX0JST0FEQ0FTVCAweGZmZmZmZmZmCisKKyNkZWZpbmUJSU5fQ0xBU1NBKGFkZHIpCQkoICggKGFkZHIpICYgMHg4MDAwMDAwMCApID09IDB4MDAwMDAwMDAgKQorI2RlZmluZQlJTl9DTEFTU0FfTkVUCQkweGZmMDAwMDAwCisjZGVmaW5lCUlOX0NMQVNTQihhZGRyKQkJKCAoIChhZGRyKSAmIDB4YzAwMDAwMDAgKSA9PSAweDgwMDAwMDAwICkKKyNkZWZpbmUJSU5fQ0xBU1NCX05FVAkJMHhmZmZmMDAwMAorI2RlZmluZQlJTl9DTEFTU0MoYWRkcikJCSggKCAoYWRkcikgJiAweGUwMDAwMDAwICkgPT0gMHhjMDAwMDAwMCApCisjZGVmaW5lCUlOX0NMQVNTQ19ORVQJCTB4ZmZmZmZmMDAKKyNkZWZpbmUgSU5fTVVMVElDQVNUKGFkZHIpCSggKCAoYWRkcikgJiAweGYwMDAwMDAwICkgPT0gMHhlMDAwMDAwMCApCisKKy8qKgorICogSVAgYWRkcmVzcyBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGluX2FkZHIgeworCXVpbnQzMl90CXNfYWRkcjsKK307CisKK3R5cGVkZWYgc3RydWN0IGluX2FkZHIgaW5fYWRkcjsKKworLyoqCisgKiBJUDYgYWRkcmVzcyBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGluNl9hZGRyIHsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdTZfYWRkcjhbMTZdOworICAgICAgICAgICAgICAgIHVpbnQxNl90IHU2X2FkZHIxNls4XTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1Nl9hZGRyMzJbNF07CisgICAgICAgIH0gaW42X3U7CisjZGVmaW5lIHM2X2FkZHIgICAgICAgICBpbjZfdS51Nl9hZGRyOAorI2RlZmluZSBzNl9hZGRyMTYgICAgICAgaW42X3UudTZfYWRkcjE2CisjZGVmaW5lIHM2X2FkZHIzMiAgICAgICBpbjZfdS51Nl9hZGRyMzIKK307CisKKy8qKgorICogSVB2NCBzb2NrZXQgYWRkcmVzcworICovCitzdHJ1Y3Qgc29ja2FkZHJfaW4geworCS8qKiBTb2NrZXQgYWRkcmVzcyBmYW1pbHkgKHBhcnQgb2Ygc3RydWN0IEBjIHNvY2thZGRyKQorCSAqCisJICogQWx3YXlzIHNldCB0byBAYyBBRl9JTkVUIGZvciBJUHY0IGFkZHJlc3NlcworCSAqLworCXNhX2ZhbWlseV90IHNpbl9mYW1pbHk7CisJLyoqIFRDUC9JUCBwb3J0IChwYXJ0IG9mIHN0cnVjdCBAYyBzb2NrYWRkcl90Y3BpcCkgKi8KKwl1aW50MTZfdCBzaW5fcG9ydDsKKwkvKiogSVB2NCBhZGRyZXNzICovCisJc3RydWN0IGluX2FkZHIgc2luX2FkZHI7CisJLyoqIFBhZGRpbmcKKwkgKgorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgc3RydWN0IEBjIHNvY2thZGRyX3RjcGlwIGlzIGxhcmdlCisJICogZW5vdWdoIHRvIGhvbGQgYSBzb2NrZXQgYWRkcmVzcyBmb3IgYW55IFRDUC9JUCBhZGRyZXNzCisJICogZmFtaWx5LgorCSAqLworCWNoYXIgcGFkWyBzaXplb2YgKCBzdHJ1Y3Qgc29ja2FkZHIgKSAtIHNpemVvZiAoIHNhX2ZhbWlseV90ICkKKwkJCQkJICAgICAtIHNpemVvZiAoIHVpbnQxNl90ICkKKwkJCQkJICAgICAtIHNpemVvZiAoIHN0cnVjdCBpbl9hZGRyICkgXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBtYXlfYWxpYXMgKSk7CisKKy8qKgorICogSVB2NiBzb2NrZXQgYWRkcmVzcworICovCitzdHJ1Y3Qgc29ja2FkZHJfaW42IHsKKwkvKiogU29ja2V0IGFkZHJlc3MgZmFtaWx5IChwYXJ0IG9mIHN0cnVjdCBAYyBzb2NrYWRkcikKKwkgKgorCSAqIEFsd2F5cyBzZXQgdG8gQGMgQUZfSU5FVDYgZm9yIElQdjYgYWRkcmVzc2VzCisJICovCisJc2FfZmFtaWx5X3Qgc2luX2ZhbWlseTsKKwkvKiogVENQL0lQIHBvcnQgKHBhcnQgb2Ygc3RydWN0IEBjIHNvY2thZGRyX3RjcGlwKSAqLworCXVpbnQxNl90IAlzaW5fcG9ydDsKKyAgICAgICAgdWludDMyX3QgICAgICAgIHNpbjZfZmxvd2luZm87ICAvKiBGbG93IG51bWJlciAqLworICAgICAgICBzdHJ1Y3QgaW42X2FkZHIgc2luNl9hZGRyOyAgICAgIC8qIDEyOC1iaXQgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgICAgICB1aW50MzJfdCAgICAgICAgc2luNl9zY29wZV9pZDsgIC8qIFNjb3BlIElEICovCit9IF9fYXR0cmlidXRlX18gKCggbWF5X2FsaWFzICkpOworCitleHRlcm4gaW50IGluZXRfYXRvbiAoIGNvbnN0IGNoYXIgKmNwLCBzdHJ1Y3QgaW5fYWRkciAqaW5wICk7CitleHRlcm4gY2hhciAqIGluZXRfbnRvYSAoIHN0cnVjdCBpbl9hZGRyIGluICk7CisKKy8qIEFkZGluZyB0aGUgZm9sbG93aW5nIGZvciBJUDYgc3VwcG9ydAorICoKKworZXh0ZXJuIGludCBpbmV0Nl9hdG9uICggY29uc3QgY2hhciAqY3AsIHN0cnVjdCBpbjZfYWRkciAqaW5wICk7CitleHRlcm4gY2hhciAqIGluZXQ2X250b2EgKCBzdHJ1Y3QgaW5fYWRkciBpbiApOworCisgKi8KKworI2VuZGlmCS8qIF9HUFhFX0lOX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pbmZpbmliYW5kLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaW5maW5pYmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MGIxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaW5maW5pYmFuZC5oCkBAIC0wLDAgKzEsNjU5IEBACisjaWZuZGVmIF9HUFhFX0lORklOSUJBTkRfSAorI2RlZmluZSBfR1BYRV9JTkZJTklCQU5EX0gKKworLyoqIEBmaWxlCisgKgorICogSW5maW5pYmFuZCBwcm90b2NvbAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL3JlZmNudC5oPgorI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pYl9wYWNrZXQuaD4KKyNpbmNsdWRlIDxncHhlL2liX21hZC5oPgorCisvKiogU3VibmV0IG1hbmFnZW1lbnQgaW50ZXJmYWNlIFFQTiAqLworI2RlZmluZSBJQl9RUE5fU01JIDAKKworLyoqIFN1Ym5ldCBtYW5hZ2VtZW50IGludGVyZmFjZSBxdWV1ZSBrZXkgKi8KKyNkZWZpbmUgSUJfUUtFWV9TTUkgMAorCisvKiogR2VuZXJhbCBzZXJ2aWNlIGludGVyZmFjZSBRUE4gKi8KKyNkZWZpbmUgSUJfUVBOX0dTSSAxCisKKy8qKiBHZW5lcmFsIHNlcnZpY2UgaW50ZXJmYWNlIHF1ZXVlIGtleSAqLworI2RlZmluZSBJQl9RS0VZX0dTSSAweDgwMDEwMDAwVUwKKworLyoqIEJyb2FkY2FzdCBRUE4gKi8KKyNkZWZpbmUgSUJfUVBOX0JST0FEQ0FTVCAweGZmZmZmZlVMCisKKy8qKiBRUE4gbWFzayAqLworI2RlZmluZSBJQl9RUE5fTUFTSyAweGZmZmZmZlVMCisKKy8qKiBEZWZhdWx0IEluZmluaWJhbmQgcGFydGl0aW9uIGtleSAqLworI2RlZmluZSBJQl9QS0VZX0RFRkFVTFQgMHhmZmZmCisKKy8qKiBJbmZpbmliYW5kIHBhcnRpdGlvbiBrZXkgZnVsbCBtZW1iZXJzaGlwIGZsYWcgKi8KKyNkZWZpbmUgSUJfUEtFWV9GVUxMIDB4ODAwMAorCisvKioKKyAqIE1heGltdW0gcGF5bG9hZCBzaXplCisgKgorICogVGhpcyBpcyBjdXJyZW50bHkgaGFyZC1jb2RlZCBpbiB2YXJpb3VzIHBsYWNlcyAoZHJpdmVycywgc3VibmV0CisgKiBtYW5hZ2VtZW50IGFnZW50LCBldGMuKSB0byAyMDQ4LgorICovCisjZGVmaW5lIElCX01BWF9QQVlMT0FEX1NJWkUgMjA0OAorCitzdHJ1Y3QgaWJfZGV2aWNlOworc3RydWN0IGliX3F1ZXVlX3BhaXI7CitzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3I7CitzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZTsKK3N0cnVjdCBpYl9tYWRfaW50ZXJmYWNlOworCisvKiogSW5maW5pYmFuZCB0cmFuc21pc3Npb24gcmF0ZXMgKi8KK2VudW0gaWJfcmF0ZSB7CisJSUJfUkFURV8yXzUgPSAyLAorCUlCX1JBVEVfMTAgPSAzLAorCUlCX1JBVEVfMzAgPSA0LAorCUlCX1JBVEVfNSA9IDUsCisJSUJfUkFURV8yMCA9IDYsCisJSUJfUkFURV80MCA9IDcsCisJSUJfUkFURV82MCA9IDgsCisJSUJfUkFURV84MCA9IDksCisJSUJfUkFURV8xMjAgPSAxMCwKK307CisKKy8qKiBBbiBJbmZpbmliYW5kIEFkZHJlc3MgVmVjdG9yICovCitzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgeworCS8qKiBRdWV1ZSBQYWlyIE51bWJlciAqLworCXVuc2lnbmVkIGxvbmcgcXBuOworCS8qKiBRdWV1ZSBrZXkKKwkgKgorCSAqIE5vdCBzcGVjaWZpZWQgZm9yIHJlY2VpdmVkIHBhY2tldHMuCisJICovCisJdW5zaWduZWQgbG9uZyBxa2V5OworCS8qKiBMb2NhbCBJRCAqLworCXVuc2lnbmVkIGludCBsaWQ7CisJLyoqIFJhdGUKKwkgKgorCSAqIE5vdCBzcGVjaWZpZWQgZm9yIHJlY2VpdmVkIHBhY2tldHMuCisJICovCisJZW51bSBpYl9yYXRlIHJhdGU7CisJLyoqIFNlcnZpY2UgbGV2ZWwgKi8KKwl1bnNpZ25lZCBpbnQgc2w7CisJLyoqIEdJRCBpcyBwcmVzZW50ICovCisJdW5zaWduZWQgaW50IGdpZF9wcmVzZW50OworCS8qKiBHSUQsIGlmIHByZXNlbnQgKi8KKwlzdHJ1Y3QgaWJfZ2lkIGdpZDsKK307CisKKy8qKiBBbiBJbmZpbmliYW5kIFdvcmsgUXVldWUgKi8KK3N0cnVjdCBpYl93b3JrX3F1ZXVlIHsKKwkvKiogQ29udGFpbmluZyBxdWV1ZSBwYWlyICovCisJc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwOworCS8qKiAiSXMgYSBzZW5kIHF1ZXVlIiBmbGFnICovCisJaW50IGlzX3NlbmQ7CisJLyoqIEFzc29jaWF0ZWQgY29tcGxldGlvbiBxdWV1ZSAqLworCXN0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlICpjcTsKKwkvKiogTGlzdCBvZiB3b3JrIHF1ZXVlcyBvbiB0aGlzIGNvbXBsZXRpb24gcXVldWUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJLyoqIFBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCBwc247CisJLyoqIE51bWJlciBvZiB3b3JrIHF1ZXVlIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX3dxZXM7CisJLyoqIE51bWJlciBvZiBvY2N1cGllZCB3b3JrIHF1ZXVlIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgZmlsbDsKKwkvKiogTmV4dCB3b3JrIHF1ZXVlIGVudHJ5IGluZGV4CisJICoKKwkgKiBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBlbnRyeSB0byBiZSBmaWxsZWQgKGkuZS4gdGhlCisJICogZmlyc3QgZW1wdHkgZW50cnkpLiAgVGhpcyB2YWx1ZSBpcyBub3QgYm91bmRlZCBieSBudW1fd3FlczsKKwkgKiB1c2VycyBtdXN0IGxvZ2ljYWwtQU5EIHdpdGggKG51bV93cWVzLTEpIHRvIGdlbmVyYXRlIGFuCisJICogYXJyYXkgaW5kZXguCisJICovCisJdW5zaWduZWQgbG9uZyBuZXh0X2lkeDsKKwkvKiogSS9PIGJ1ZmZlcnMgYXNzaWduZWQgdG8gd29yayBxdWV1ZSAqLworCXN0cnVjdCBpb19idWZmZXIgKippb2J1ZnM7CisJLyoqIERyaXZlciBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICpkcnZfcHJpdjsKK307CisKKy8qKiBBbiBJbmZpbmliYW5kIG11bHRpY2FzdCBHSUQgKi8KK3N0cnVjdCBpYl9tdWx0aWNhc3RfZ2lkIHsKKwkvKiogTGlzdCBvZiBtdWx0aWNhc3QgR0lEcyBvbiB0aGlzIFFQICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8qKiBNdWx0aWNhc3QgR0lEICovCisJc3RydWN0IGliX2dpZCBnaWQ7Cit9OworCisvKiogQW4gSW5maW5pYmFuZCBxdWV1ZSBwYWlyIHR5cGUgKi8KK2VudW0gaWJfcXVldWVfcGFpcl90eXBlIHsKKwlJQl9RUFRfU01JLAorCUlCX1FQVF9HU0ksCisJSUJfUVBUX1VELAorCUlCX1FQVF9SQywKK307CisKKy8qKiBBbiBJbmZpbmliYW5kIFF1ZXVlIFBhaXIgKi8KK3N0cnVjdCBpYl9xdWV1ZV9wYWlyIHsKKwkvKiogQ29udGFpbmluZyBJbmZpbmliYW5kIGRldmljZSAqLworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OworCS8qKiBMaXN0IG9mIHF1ZXVlIHBhaXJzIG9uIHRoaXMgSW5maW5pYmFuZCBkZXZpY2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJLyoqIFF1ZXVlIHBhaXIgbnVtYmVyICovCisJdW5zaWduZWQgbG9uZyBxcG47CisJLyoqIEV4dGVybmFsbHktdmlzaWJsZSBxdWV1ZSBwYWlyIG51bWJlcgorCSAqCisJICogVGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIHJlYWwgcXVldWUgcGFpciBudW1iZXIgKGUuZy4gd2hlbgorCSAqIHRoZSBIQ0EgY2Fubm90IHVzZSB0aGUgbWFuYWdlbWVudCBRUE5zIDAgYW5kIDEgYXMgaGFyZHdhcmUKKwkgKiBRUE5zIGFuZCBuZWVkcyB0byByZW1hcCB0aGVtKS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGV4dF9xcG47CisJLyoqIFF1ZXVlIHBhaXIgdHlwZSAqLworCWVudW0gaWJfcXVldWVfcGFpcl90eXBlIHR5cGU7CisJLyoqIFF1ZXVlIGtleSAqLworCXVuc2lnbmVkIGxvbmcgcWtleTsKKwkvKiogU2VuZCBxdWV1ZSAqLworCXN0cnVjdCBpYl93b3JrX3F1ZXVlIHNlbmQ7CisJLyoqIFJlY2VpdmUgcXVldWUgKi8KKwlzdHJ1Y3QgaWJfd29ya19xdWV1ZSByZWN2OworCS8qKiBMaXN0IG9mIG11bHRpY2FzdCBHSURzICovCisJc3RydWN0IGxpc3RfaGVhZCBtZ2lkczsKKwkvKiogQWRkcmVzcyB2ZWN0b3IgKi8KKwlzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgYXY7CisJLyoqIERyaXZlciBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICpkcnZfcHJpdjsKKwkvKiogUXVldWUgb3duZXIgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAqb3duZXJfcHJpdjsKK307CisKKy8qKiBJbmZpbmliYW5kIGNvbXBsZXRpb24gcXVldWUgb3BlcmF0aW9ucyAqLworc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWVfb3BlcmF0aW9ucyB7CisJLyoqCisJICogQ29tcGxldGUgU2VuZCBXUUUKKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IHFwCQlRdWV1ZSBwYWlyCisJICogQHYgaW9idWYJCUkvTyBidWZmZXIKKwkgKiBAdiByYwkJQ29tcGxldGlvbiBzdGF0dXMgY29kZQorCSAqLworCXZvaWQgKCAqIGNvbXBsZXRlX3NlbmQgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCQkgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwgaW50IHJjICk7CisJLyoqCisJICogQ29tcGxldGUgUmVjZWl2ZSBXUUUKKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IHFwCQlRdWV1ZSBwYWlyCisJICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yLCBvciBOVUxMCisJICogQHYgaW9idWYJCUkvTyBidWZmZXIKKwkgKiBAdiByYwkJQ29tcGxldGlvbiBzdGF0dXMgY29kZQorCSAqLworCXZvaWQgKCAqIGNvbXBsZXRlX3JlY3YgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCQkgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2LAorCQkJCSAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBpbnQgcmMgKTsKK307CisKKy8qKiBBbiBJbmZpbmliYW5kIENvbXBsZXRpb24gUXVldWUgKi8KK3N0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlIHsKKwkvKiogQ29udGFpbmluZyBJbmZpbmliYW5kIGRldmljZSAqLworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OworCS8qKiBMaXN0IG9mIGNvbXBsZXRpb24gcXVldWVzIG9uIHRoaXMgSW5maW5pYmFuZCBkZXZpY2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJLyoqIENvbXBsZXRpb24gcXVldWUgbnVtYmVyICovCisJdW5zaWduZWQgbG9uZyBjcW47CisJLyoqIE51bWJlciBvZiBjb21wbGV0aW9uIHF1ZXVlIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2NxZXM7CisJLyoqIE5leHQgY29tcGxldGlvbiBxdWV1ZSBlbnRyeSBpbmRleAorCSAqCisJICogVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgZW50cnkgdG8gYmUgZmlsbGVkIChpLmUuIHRoZQorCSAqIGZpcnN0IGVtcHR5IGVudHJ5KS4gIFRoaXMgdmFsdWUgaXMgbm90IGJvdW5kZWQgYnkgbnVtX3dxZXM7CisJICogdXNlcnMgbXVzdCBsb2dpY2FsLUFORCB3aXRoIChudW1fd3Flcy0xKSB0byBnZW5lcmF0ZSBhbgorCSAqIGFycmF5IGluZGV4LgorCSAqLworCXVuc2lnbmVkIGxvbmcgbmV4dF9pZHg7CisJLyoqIExpc3Qgb2Ygd29yayBxdWV1ZXMgY29tcGxldGluZyB0byB0aGlzIHF1ZXVlICovCisJc3RydWN0IGxpc3RfaGVhZCB3b3JrX3F1ZXVlczsKKwkvKiogQ29tcGxldGlvbiBxdWV1ZSBvcGVyYXRpb25zICovCisJc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWVfb3BlcmF0aW9ucyAqb3A7CisJLyoqIERyaXZlciBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICpkcnZfcHJpdjsKK307CisKKy8qKgorICogSW5maW5pYmFuZCBkZXZpY2Ugb3BlcmF0aW9ucworICoKKyAqIFRoZXNlIHJlcHJlc2VudCBhIHN1YnNldCBvZiB0aGUgSW5maW5pYmFuZCBWZXJicy4KKyAqLworc3RydWN0IGliX2RldmljZV9vcGVyYXRpb25zIHsKKwkvKiogQ3JlYXRlIGNvbXBsZXRpb24gcXVldWUKKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IGNxCQlDb21wbGV0aW9uIHF1ZXVlCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBjcmVhdGVfY3EgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxICk7CisJLyoqIERlc3Ryb3kgY29tcGxldGlvbiBxdWV1ZQorCSAqCisJICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisJICogQHYgY3EJCUNvbXBsZXRpb24gcXVldWUKKwkgKi8KKwl2b2lkICggKiBkZXN0cm95X2NxICkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQlzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3EgKTsKKwkvKiogQ3JlYXRlIHF1ZXVlIHBhaXIKKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IHFwCQlRdWV1ZSBwYWlyCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBjcmVhdGVfcXAgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICk7CisJLyoqIE1vZGlmeSBxdWV1ZSBwYWlyCisJICoKKwkgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKwkgKiBAdiBxcAkJUXVldWUgcGFpcgorCSAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorCSAqLworCWludCAoICogbW9kaWZ5X3FwICkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCApOworCS8qKiBEZXN0cm95IHF1ZXVlIHBhaXIKKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IHFwCQlRdWV1ZSBwYWlyCisJICovCisJdm9pZCAoICogZGVzdHJveV9xcCApICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICk7CisJLyoqIFBvc3Qgc2VuZCB3b3JrIHF1ZXVlIGVudHJ5CisJICoKKwkgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKwkgKiBAdiBxcAkJUXVldWUgcGFpcgorCSAqIEB2IGF2CQlBZGRyZXNzIHZlY3RvcgorCSAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICoKKwkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIHN1Y2Nlc3MsIHRoZSBJL08gYnVmZmVyIHJlbWFpbnMKKwkgKiBvd25lZCBieSB0aGUgcXVldWUgcGFpci4gIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFpbHVyZSwKKwkgKiB0aGUgSS9PIGJ1ZmZlciBpcyBpbW1lZGlhdGVseSByZWxlYXNlZDsgdGhlIGZhaWx1cmUgaXMKKwkgKiBpbnRlcnByZXRlZCBhcyAiZmFpbHVyZSB0byBlbnF1ZXVlIGJ1ZmZlciIuCisJICovCisJaW50ICggKiBwb3N0X3NlbmQgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJICAgICAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiwKKwkJCSAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICk7CisJLyoqIFBvc3QgcmVjZWl2ZSB3b3JrIHF1ZXVlIGVudHJ5CisJICoKKwkgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKwkgKiBAdiBxcAkJUXVldWUgcGFpcgorCSAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICoKKwkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIHN1Y2Nlc3MsIHRoZSBJL08gYnVmZmVyIHJlbWFpbnMKKwkgKiBvd25lZCBieSB0aGUgcXVldWUgcGFpci4gIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFpbHVyZSwKKwkgKiB0aGUgSS9PIGJ1ZmZlciBpcyBpbW1lZGlhdGVseSByZWxlYXNlZDsgdGhlIGZhaWx1cmUgaXMKKwkgKiBpbnRlcnByZXRlZCBhcyAiZmFpbHVyZSB0byBlbnF1ZXVlIGJ1ZmZlciIuCisJICovCisJaW50ICggKiBwb3N0X3JlY3YgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKTsKKwkvKiogUG9sbCBjb21wbGV0aW9uIHF1ZXVlCisJICoKKwkgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKwkgKiBAdiBjcQkJQ29tcGxldGlvbiBxdWV1ZQorCSAqCisJICogVGhlIHJlbGV2YW50IGNvbXBsZXRpb24gaGFuZGxlciAoc3BlY2lmaWVkIGF0IGNvbXBsZXRpb24KKwkgKiBxdWV1ZSBjcmVhdGlvbiB0aW1lKSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIEkvTyBidWZmZXIuCisJICovCisJdm9pZCAoICogcG9sbF9jcSApICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgIHN0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlICpjcSApOworCS8qKgorCSAqIFBvbGwgZXZlbnQgcXVldWUKKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqLworCXZvaWQgKCAqIHBvbGxfZXEgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICk7CisJLyoqCisJICogT3BlbiBwb3J0CisJICoKKwkgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIG9wZW4gKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICk7CisJLyoqCisJICogQ2xvc2UgcG9ydAorCSAqCisJICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisJICovCisJdm9pZCAoICogY2xvc2UgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICk7CisJLyoqIEF0dGFjaCB0byBtdWx0aWNhc3QgZ3JvdXAKKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IHFwCQlRdWV1ZSBwYWlyCisJICogQHYgZ2lkCQlNdWx0aWNhc3QgR0lECisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBtY2FzdF9hdHRhY2ggKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkJIHN0cnVjdCBpYl9naWQgKmdpZCApOworCS8qKiBEZXRhY2ggZnJvbSBtdWx0aWNhc3QgZ3JvdXAKKwkgKgorCSAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorCSAqIEB2IHFwCQlRdWV1ZSBwYWlyCisJICogQHYgZ2lkCQlNdWx0aWNhc3QgR0lECisJICovCisJdm9pZCAoICogbWNhc3RfZGV0YWNoICkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCQkgIHN0cnVjdCBpYl9naWQgKmdpZCApOworCS8qKiBTZXQgcG9ydCBpbmZvcm1hdGlvbgorCSAqCisJICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisJICogQHYgbWFkCQlTZXQgcG9ydCBpbmZvcm1hdGlvbiBNQUQKKwkgKgorCSAqIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIG9ubHkgYnkgYWRhcHRlcnMgdGhhdCBkbyBub3QgaGF2ZQorCSAqIGFuIGVtYmVkZGVkIFNNQS4KKwkgKi8KKwlpbnQgKCAqIHNldF9wb3J0X2luZm8gKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1bmlvbiBpYl9tYWQgKm1hZCApOworCS8qKiBTZXQgcGFydGl0aW9uIGtleSB0YWJsZQorCSAqCisJICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisJICogQHYgbWFkCQlTZXQgcGFydGl0aW9uIGtleSB0YWJsZSBNQUQKKwkgKgorCSAqIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIG9ubHkgYnkgYWRhcHRlcnMgdGhhdCBkbyBub3QgaGF2ZQorCSAqIGFuIGVtYmVkZGVkIFNNQS4KKwkgKi8KKwlpbnQgKCAqIHNldF9wa2V5X3RhYmxlICkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkgICB1bmlvbiBpYl9tYWQgKm1hZCApOworfTsKKworLyoqIEFuIEluZmluaWJhbmQgZGV2aWNlICovCitzdHJ1Y3QgaWJfZGV2aWNlIHsKKwkvKiogUmVmZXJlbmNlIGNvdW50ZXIgKi8KKwlzdHJ1Y3QgcmVmY250IHJlZmNudDsKKwkvKiogTGlzdCBvZiBJbmZpbmliYW5kIGRldmljZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJLyoqIExpc3Qgb2Ygb3BlbiBJbmZpbmliYW5kIGRldmljZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG9wZW5fbGlzdDsKKwkvKiogVW5kZXJseWluZyBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJLyoqIExpc3Qgb2YgY29tcGxldGlvbiBxdWV1ZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNxczsKKwkvKiogTGlzdCBvZiBxdWV1ZSBwYWlycyAqLworCXN0cnVjdCBsaXN0X2hlYWQgcXBzOworCS8qKiBJbmZpbmliYW5kIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgaWJfZGV2aWNlX29wZXJhdGlvbnMgKm9wOworCS8qKiBQb3J0IG51bWJlciAqLworCXVuc2lnbmVkIGludCBwb3J0OworCS8qKiBQb3J0IG9wZW4gcmVxdWVzdCBjb3VudGVyICovCisJdW5zaWduZWQgaW50IG9wZW5fY291bnQ7CisKKwkvKiogUG9ydCBzdGF0ZSAqLworCXVpbnQ4X3QgcG9ydF9zdGF0ZTsKKwkvKiogTGluayB3aWR0aCBzdXBwb3J0ZWQgKi8KKwl1aW50OF90IGxpbmtfd2lkdGhfc3VwcG9ydGVkOworCS8qKiBMaW5rIHdpZHRoIGVuYWJsZWQgKi8KKwl1aW50OF90IGxpbmtfd2lkdGhfZW5hYmxlZDsKKwkvKiogTGluayB3aWR0aCBhY3RpdmUgKi8KKwl1aW50OF90IGxpbmtfd2lkdGhfYWN0aXZlOworCS8qKiBMaW5rIHNwZWVkIHN1cHBvcnRlZCAqLworCXVpbnQ4X3QgbGlua19zcGVlZF9zdXBwb3J0ZWQ7CisJLyoqIExpbmsgc3BlZWQgZW5hYmxlZCAqLworCXVpbnQ4X3QgbGlua19zcGVlZF9lbmFibGVkOworCS8qKiBMaW5rIHNwZWVkIGFjdGl2ZSAqLworCXVpbnQ4X3QgbGlua19zcGVlZF9hY3RpdmU7CisJLyoqIFBvcnQgR0lEICovCisJc3RydWN0IGliX2dpZCBnaWQ7CisJLyoqIFBvcnQgTElEICovCisJdWludDE2X3QgbGlkOworCS8qKiBTdWJuZXQgbWFuYWdlciBMSUQgKi8KKwl1aW50MTZfdCBzbV9saWQ7CisJLyoqIFN1Ym5ldCBtYW5hZ2VyIFNMICovCisJdWludDhfdCBzbV9zbDsKKwkvKiogUGFydGl0aW9uIGtleSAqLworCXVpbnQxNl90IHBrZXk7CisKKwkvKiogUkRNQSBrZXkKKwkgKgorCSAqIFRoaXMgaXMgYSBzaW5nbGUga2V5IGFsbG93aW5nIHVucmVzdHJpY3RlZCBhY2Nlc3MgdG8KKwkgKiBtZW1vcnkuCisJICovCisJdWludDMyX3QgcmRtYV9rZXk7CisKKwkvKiogU3VibmV0IG1hbmFnZW1lbnQgaW50ZXJmYWNlICovCisJc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKnNtaTsKKwkvKiogR2VuZXJhbCBzZXJ2aWNlcyBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqZ3NpOworCisJLyoqIERyaXZlciBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICpkcnZfcHJpdjsKKwkvKiogT3duZXIgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAqb3duZXJfcHJpdjsKK307CisKK2V4dGVybiBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqCitpYl9jcmVhdGVfY3EgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgdW5zaWduZWQgaW50IG51bV9jcWVzLAorCSAgICAgICBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZV9vcGVyYXRpb25zICpvcCApOworZXh0ZXJuIHZvaWQgaWJfZGVzdHJveV9jcSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgIHN0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlICpjcSApOworZXh0ZXJuIHZvaWQgaWJfcG9sbF9jcSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJIHN0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlICpjcSApOworZXh0ZXJuIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICoKK2liX2NyZWF0ZV9xcCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBlbnVtIGliX3F1ZXVlX3BhaXJfdHlwZSB0eXBlLAorCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NlbmRfd3Flcywgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKnNlbmRfY3EsCisJICAgICAgIHVuc2lnbmVkIGludCBudW1fcmVjdl93cWVzLAorCSAgICAgICBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqcmVjdl9jcSApOworZXh0ZXJuIGludCBpYl9tb2RpZnlfcXAgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICk7CitleHRlcm4gdm9pZCBpYl9kZXN0cm95X3FwICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICk7CitleHRlcm4gc3RydWN0IGliX3F1ZXVlX3BhaXIgKiBpYl9maW5kX3FwX3FwbiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBxcG4gKTsKK2V4dGVybiBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqIGliX2ZpbmRfcXBfbWdpZCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCQkJc3RydWN0IGliX2dpZCAqZ2lkICk7CitleHRlcm4gc3RydWN0IGliX3dvcmtfcXVldWUgKiBpYl9maW5kX3dxICggc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIHFwbiwgaW50IGlzX3NlbmQgKTsKK2V4dGVybiBpbnQgaWJfcG9zdF9zZW5kICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCSAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiwKKwkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKTsKK2V4dGVybiBpbnQgaWJfcG9zdF9yZWN2ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKTsKK2V4dGVybiB2b2lkIGliX2NvbXBsZXRlX3NlbmQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkgICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGludCByYyApOworZXh0ZXJuIHZvaWQgaWJfY29tcGxldGVfcmVjdiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2LAorCQkJICAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBpbnQgcmMgKTsKK2V4dGVybiB2b2lkIGliX3JlZmlsbF9yZWN2ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCApOworZXh0ZXJuIGludCBpYl9vcGVuICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKTsKK2V4dGVybiB2b2lkIGliX2Nsb3NlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKTsKK2V4dGVybiBpbnQgaWJfbGlua19yYyAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICk7CitleHRlcm4gaW50IGliX21jYXN0X2F0dGFjaCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkgICAgIHN0cnVjdCBpYl9naWQgKmdpZCApOworZXh0ZXJuIHZvaWQgaWJfbWNhc3RfZGV0YWNoICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsIHN0cnVjdCBpYl9naWQgKmdpZCApOworZXh0ZXJuIGludCBpYl9nZXRfaGNhX2luZm8gKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgc3RydWN0IGliX2dpZF9oYWxmICpoY2FfZ3VpZCApOworZXh0ZXJuIGludCBpYl9zZXRfcG9ydF9pbmZvICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHVuaW9uIGliX21hZCAqbWFkICk7CitleHRlcm4gaW50IGliX3NldF9wa2V5X3RhYmxlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHVuaW9uIGliX21hZCAqbWFkICk7CitleHRlcm4gc3RydWN0IGliX2RldmljZSAqIGFsbG9jX2liZGV2ICggc2l6ZV90IHByaXZfc2l6ZSApOworZXh0ZXJuIGludCByZWdpc3Rlcl9pYmRldiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICk7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2liZGV2ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKTsKK2V4dGVybiBzdHJ1Y3QgaWJfZGV2aWNlICogZmluZF9pYmRldiAoIHN0cnVjdCBpYl9naWQgKmdpZCApOworZXh0ZXJuIHN0cnVjdCBpYl9kZXZpY2UgKiBsYXN0X29wZW5lZF9pYmRldiAoIHZvaWQgKTsKK2V4dGVybiB2b2lkIGliX2xpbmtfc3RhdGVfY2hhbmdlZCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICk7CitleHRlcm4gdm9pZCBpYl9wb2xsX2VxICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKTsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGliX2RldmljZXM7CisKKy8qKiBJdGVyYXRlIG92ZXIgYWxsIG5ldHdvcmsgZGV2aWNlcyAqLworI2RlZmluZSBmb3JfZWFjaF9pYmRldiggaWJkZXYgKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIChpYmRldiksICZpYl9kZXZpY2VzLCBsaXN0ICkKKworLyoqCisgKiBDaGVjayBsaW5rIHN0YXRlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAcmV0IGxpbmtfdXAJCUxpbmsgaXMgdXAKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgaW50CitpYl9saW5rX29rICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKSB7CisJcmV0dXJuICggaWJkZXYtPnBvcnRfc3RhdGUgPT0gSUJfUE9SVF9TVEFURV9BQ1RJVkUgKTsKK30KKworLyoqCisgKiBHZXQgcmVmZXJlbmNlIHRvIEluZmluaWJhbmQgZGV2aWNlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAcmV0IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBzdHJ1Y3QgaWJfZGV2aWNlICoKK2liZGV2X2dldCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICkgeworCXJlZl9nZXQgKCAmaWJkZXYtPnJlZmNudCApOworCXJldHVybiBpYmRldjsKK30KKworLyoqCisgKiBEcm9wIHJlZmVyZW5jZSB0byBJbmZpbmliYW5kIGRldmljZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitpYmRldl9wdXQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKwlyZWZfcHV0ICggJmliZGV2LT5yZWZjbnQgKTsKK30KKworLyoqCisgKiBTZXQgSW5maW5pYmFuZCB3b3JrIHF1ZXVlIGRyaXZlci1wcml2YXRlIGRhdGEKKyAqCisgKiBAdiB3cQkJV29yayBxdWV1ZQorICogQHYgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK2liX3dxX3NldF9kcnZkYXRhICggc3RydWN0IGliX3dvcmtfcXVldWUgKndxLCB2b2lkICpwcml2ICkgeworCXdxLT5kcnZfcHJpdiA9IHByaXY7Cit9CisKKy8qKgorICogR2V0IEluZmluaWJhbmQgd29yayBxdWV1ZSBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgd3EJCVdvcmsgcXVldWUKKyAqIEByZXQgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQgKgoraWJfd3FfZ2V0X2RydmRhdGEgKCBzdHJ1Y3QgaWJfd29ya19xdWV1ZSAqd3EgKSB7CisJcmV0dXJuIHdxLT5kcnZfcHJpdjsKK30KKworLyoqCisgKiBTZXQgSW5maW5pYmFuZCBxdWV1ZSBwYWlyIGRyaXZlci1wcml2YXRlIGRhdGEKKyAqCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK2liX3FwX3NldF9kcnZkYXRhICggc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLCB2b2lkICpwcml2ICkgeworCXFwLT5kcnZfcHJpdiA9IHByaXY7Cit9CisKKy8qKgorICogR2V0IEluZmluaWJhbmQgcXVldWUgcGFpciBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEByZXQgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQgKgoraWJfcXBfZ2V0X2RydmRhdGEgKCBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAgKSB7CisJcmV0dXJuIHFwLT5kcnZfcHJpdjsKK30KKworLyoqCisgKiBTZXQgSW5maW5pYmFuZCBxdWV1ZSBwYWlyIG93bmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBwcml2CQlQcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAoraWJfcXBfc2V0X293bmVyZGF0YSAoIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwgdm9pZCAqcHJpdiApIHsKKwlxcC0+b3duZXJfcHJpdiA9IHByaXY7Cit9CisKKy8qKgorICogR2V0IEluZmluaWJhbmQgcXVldWUgcGFpciBvd25lci1wcml2YXRlIGRhdGEKKyAqCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHJldCBwcml2CQlQcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitpYl9xcF9nZXRfb3duZXJkYXRhICggc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwICkgeworCXJldHVybiBxcC0+b3duZXJfcHJpdjsKK30KKworLyoqCisgKiBTZXQgSW5maW5pYmFuZCBjb21wbGV0aW9uIHF1ZXVlIGRyaXZlci1wcml2YXRlIGRhdGEKKyAqCisgKiBAdiBjcQkJQ29tcGxldGlvbiBxdWV1ZQorICogQHYgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK2liX2NxX3NldF9kcnZkYXRhICggc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxLCB2b2lkICpwcml2ICkgeworCWNxLT5kcnZfcHJpdiA9IHByaXY7Cit9CisKKy8qKgorICogR2V0IEluZmluaWJhbmQgY29tcGxldGlvbiBxdWV1ZSBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgY3EJCUNvbXBsZXRpb24gcXVldWUKKyAqIEByZXQgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQgKgoraWJfY3FfZ2V0X2RydmRhdGEgKCBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3EgKSB7CisJcmV0dXJuIGNxLT5kcnZfcHJpdjsKK30KKworLyoqCisgKiBTZXQgSW5maW5pYmFuZCBkZXZpY2UgZHJpdmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK2liX3NldF9kcnZkYXRhICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHZvaWQgKnByaXYgKSB7CisJaWJkZXYtPmRydl9wcml2ID0gcHJpdjsKK30KKworLyoqCisgKiBHZXQgSW5maW5pYmFuZCBkZXZpY2UgZHJpdmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHJldCBwcml2CQlQcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitpYl9nZXRfZHJ2ZGF0YSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICkgeworCXJldHVybiBpYmRldi0+ZHJ2X3ByaXY7Cit9CisKKy8qKgorICogU2V0IEluZmluaWJhbmQgZGV2aWNlIG93bmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK2liX3NldF9vd25lcmRhdGEgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgdm9pZCAqcHJpdiApIHsKKwlpYmRldi0+b3duZXJfcHJpdiA9IHByaXY7Cit9CisKKy8qKgorICogR2V0IEluZmluaWJhbmQgZGV2aWNlIG93bmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHJldCBwcml2CQlQcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitpYl9nZXRfb3duZXJkYXRhICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgKSB7CisJcmV0dXJuIGliZGV2LT5vd25lcl9wcml2OworfQorCisjZW5kaWYgLyogX0dQWEVfSU5GSU5JQkFORF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaW5pdC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2luaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJjYmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2luaXQuaApAQCAtMCwwICsxLDgxIEBACisjaWZuZGVmIF9HUFhFX0lOSVRfSAorI2RlZmluZSBfR1BYRV9JTklUX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKworLyoqCisgKiBBbiBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbgorICoKKyAqIEluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGV4YWN0bHkgb25jZSwgYXMgcGFydCBvZiB0aGUKKyAqIGNhbGwgdG8gaW5pdGlhbGlzZSgpLgorICovCitzdHJ1Y3QgaW5pdF9mbiB7CisJdm9pZCAoICogaW5pdGlhbGlzZSApICggdm9pZCApOworfTsKKworLyoqIEluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIHRhYmxlICovCisjZGVmaW5lIElOSVRfRk5TIF9fdGFibGUgKCBzdHJ1Y3QgaW5pdF9mbiwgImluaXRfZm5zIiApCisKKy8qKiBEZWNsYXJlIGFuIGluaXRpYWxpc2F0aW9uIGZ1bmN0b24gKi8KKyNkZWZpbmUgX19pbml0X2ZuKCBpbml0X29yZGVyICkgX190YWJsZV9lbnRyeSAoIElOSVRfRk5TLCBpbml0X29yZGVyICkKKworLyoqIEBkZWZncm91cCBpbml0Zm5fb3JkZXIgSW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gb3JkZXJpbmcKKyAqIEB7CisgKi8KKworI2RlZmluZSBJTklUX0VBUkxZCTAxCS8qKjwgRWFybHkgaW5pdGlhbGlzYXRpb24gKi8KKyNkZWZpbmUgSU5JVF9TRVJJQUwJMDIJLyoqPCBTZXJpYWwgZHJpdmVyIGluaXRpYWxpc2F0aW9uICovCisjZGVmaW5lCUlOSVRfQ09OU09MRQkwMwkvKio8IENvbnNvbGUgaW5pdGlhbGlzYXRpb24gKi8KKyNkZWZpbmUgSU5JVF9OT1JNQUwJMDQJLyoqPCBOb3JtYWwgaW5pdGlhbGlzYXRpb24gKi8KKworLyoqIEB9ICovCisKKy8qKiBTaHV0ZG93biBmbGFncyAqLworZW51bSBzaHV0ZG93bl9mbGFncyB7CisJLyoqIFNodXRkb3duIGlzIGluIG9yZGVyIHRvIGV4aXQgKHJldHVybiB0byBnUFhFJ3MgY2FsbGVyKSAqLworCVNIVVRET1dOX0VYSVQgPSAweDAwMDEsCisJLyoqIFNodXRkb3duIGlzIGluIG9yZGVyIHRvIGJvb3QgYW4gT1MgKi8KKwlTSFVURE9XTl9CT09UID0gMHgwMDAyLAorCS8qKiBEbyBub3QgcmVtb3ZlIGRldmljZXMgKi8KKwlTSFVURE9XTl9LRUVQX0RFVklDRVMgPSAweDAwMDQsCit9OworCisvKioKKyAqIEEgc3RhcnR1cC9zaHV0ZG93biBmdW5jdGlvbgorICoKKyAqIFN0YXJ0dXAgYW5kIHNodXRkb3duIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBhcworICogcGFydCBvZiB0aGUgY2FsbHMgdG8gc3RhcnR1cCgpIGFuZCBzaHV0ZG93bigpLgorICovCitzdHJ1Y3Qgc3RhcnR1cF9mbiB7CisJdm9pZCAoICogc3RhcnR1cCApICggdm9pZCApOworCXZvaWQgKCAqIHNodXRkb3duICkgKCBpbnQgZmxhZ3MgKTsKK307CisKKy8qKiBTdGFydHVwL3NodXRkb3duIGZ1bmN0aW9uIHRhYmxlICovCisjZGVmaW5lIFNUQVJUVVBfRk5TIF9fdGFibGUgKCBzdHJ1Y3Qgc3RhcnR1cF9mbiwgInN0YXJ0dXBfZm5zIiApCisKKy8qKiBEZWNsYXJlIGEgc3RhcnR1cC9zaHV0ZG93biBmdW5jdGlvbiAqLworI2RlZmluZSBfX3N0YXJ0dXBfZm4oIHN0YXJ0dXBfb3JkZXIgKSBcCisJX190YWJsZV9lbnRyeSAoIFNUQVJUVVBfRk5TLCBzdGFydHVwX29yZGVyICkKKworLyoqIEBkZWZncm91cCBzdGFydGZuX29yZGVyIFN0YXJ0dXAvc2h1dGRvd24gZnVuY3Rpb24gb3JkZXJpbmcKKyAqCisgKiBTaHV0ZG93biBmdW5jdGlvbnMgYXJlIGNhbGxlZCBpbiB0aGUgcmV2ZXJzZSBvcmRlciB0byBzdGFydHVwCisgKiBmdW5jdGlvbnMuCisgKgorICogQHsKKyAqLworCisjZGVmaW5lIFNUQVJUVVBfRUFSTFkJMDEJLyoqPCBFYXJseSBzdGFydHVwICovCisjZGVmaW5lIFNUQVJUVVBfTk9STUFMCTAyCS8qKjwgTm9ybWFsIHN0YXJ0dXAgKi8KKyNkZWZpbmUgU1RBUlRVUF9MQVRFCTAzCS8qKjwgTGF0ZSBzdGFydHVwICovCisKKy8qKiBAfSAqLworCitleHRlcm4gdm9pZCBpbml0aWFsaXNlICggdm9pZCApOworZXh0ZXJuIHZvaWQgc3RhcnR1cCAoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHNodXRkb3duICggaW50IGZsYWdzICk7CisKKyNlbmRpZiAvKiBfR1BYRV9JTklUX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pbnRlcmZhY2UuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRlYmYzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTggQEAKKyNpZm5kZWYgX0dQWEVfSU5URVJGQUNFX0gKKyNkZWZpbmUgX0dQWEVfSU5URVJGQUNFX0gKKworLyoqIEBmaWxlCisgKgorICogT2JqZWN0IGNvbW11bmljYXRpb24gaW50ZXJmYWNlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL3JlZmNudC5oPgorCisvKiogQW4gb2JqZWN0IGNvbW11bmljYXRpb24gaW50ZXJmYWNlICovCitzdHJ1Y3QgaW50ZXJmYWNlIHsKKwkvKiogRGVzdGluYXRpb24gaW50ZXJmYWNlCisJICoKKwkgKiBXaGVuIG1lc3NhZ2VzIGFyZSBzZW50IHZpYSB0aGlzIGludGVyZmFjZSwgdGhleSB3aWxsIGJlCisJICogZGVsaXZlcmVkIHRvIHRoZSBkZXN0aW5hdGlvbiBpbnRlcmZhY2UuCisJICoKKwkgKiBUaGlzIHBvaW50ZXIgbWF5IG5ldmVyIGJlIE5VTEwuICBXaGVuIHRoZSBpbnRlcmZhY2UgaXMKKwkgKiB1bnBsdWdnZWQsIGl0IHNob3VsZCBwb2ludCB0byBhIG51bGwgaW50ZXJmYWNlLgorCSAqLworCXN0cnVjdCBpbnRlcmZhY2UgKmRlc3Q7CisJLyoqIFJlZmVyZW5jZSBjb3VudGVyCisJICoKKwkgKiBJZiB0aGlzIGludGVyZmFjZSBpcyBub3QgcGFydCBvZiBhIHJlZmVyZW5jZS1jb3VudGVkCisJICogb2JqZWN0LCB0aGlzIGZpZWxkIG1heSBiZSBOVUxMLgorCSAqLworCXN0cnVjdCByZWZjbnQgKnJlZmNudDsKK307CisKKy8qKgorICogSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvbiBhbiBpbnRlcmZhY2UKKyAqCisgKiBAdiBpbnRmCQlJbnRlcmZhY2UKKyAqIEByZXQgaW50ZgkJSW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHN0cnVjdCBpbnRlcmZhY2UgKgoraW50Zl9nZXQgKCBzdHJ1Y3QgaW50ZXJmYWNlICppbnRmICkgeworCXJlZl9nZXQgKCBpbnRmLT5yZWZjbnQgKTsKKwlyZXR1cm4gaW50ZjsKK30KKworLyoqCisgKiBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9uIGFuIGludGVyZmFjZQorICoKKyAqIEB2IGludGYJCUludGVyZmFjZQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitpbnRmX3B1dCAoIHN0cnVjdCBpbnRlcmZhY2UgKmludGYgKSB7CisJcmVmX3B1dCAoIGludGYtPnJlZmNudCApOworfQorCitleHRlcm4gdm9pZCBwbHVnICggc3RydWN0IGludGVyZmFjZSAqaW50Ziwgc3RydWN0IGludGVyZmFjZSAqZGVzdCApOworZXh0ZXJuIHZvaWQgcGx1Z19wbHVnICggc3RydWN0IGludGVyZmFjZSAqYSwgc3RydWN0IGludGVyZmFjZSAqYiApOworCisjZW5kaWYgLyogX0dQWEVfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pby5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5ODIzZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pby5oCkBAIC0wLDAgKzEsNTA2IEBACisjaWZuZGVmIF9HUFhFX0lPX0gKKyNkZWZpbmUgX0dQWEVfSU9fSAorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIEkvTyBBUEkKKyAqCisgKiBUaGUgSS9PIEFQSSBwcm92aWRlcyBtZXRob2RzIGZvciByZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcgdG8KKyAqIG1lbW9yeS1tYXBwZWQgYW5kIEkvTy1tYXBwZWQgZGV2aWNlcy4KKyAqCisgKiBUaGUgc3RhbmRhcmQgbWV0aG9kcyAocmVhZGwoKS93cml0ZWwoKSBldGMuKSBkbyBub3Qgc3RyaWN0bHkgY2hlY2sKKyAqIHRoZSB0eXBlIG9mIHRoZSBhZGRyZXNzIHBhcmFtZXRlcjsgdGhpcyBpcyBiZWNhdXNlIHRyYWRpdGlvbmFsCisgKiB1c2FnZSBkb2VzIG5vdCBuZWNlc3NhcmlseSBwcm92aWRlIHRoZSBjb3JyZWN0IHBvaW50ZXIgdHlwZS4gIEZvcgorICogZXhhbXBsZSwgY29kZSB3cml0dGVuIGZvciBJU0EgZGV2aWNlcyBhdCBmaXhlZCBJL08gYWRkcmVzc2VzIChzdWNoCisgKiBhcyB0aGUga2V5Ym9hcmQgY29udHJvbGxlcikgdGVuZCB0byB1c2UgcGxhaW4gaW50ZWdlciBjb25zdGFudHMgZm9yCisgKiB0aGUgYWRkcmVzcyBwYXJhbWV0ZXIuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9hcGkuaD4KKyNpbmNsdWRlIDxjb25maWcvaW9hcGkuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKworLyoqCisgKiBDYWxjdWxhdGUgc3RhdGljIGlubGluZSBJL08gQVBJIGZ1bmN0aW9uIG5hbWUKKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICogQHJldCBfc3Vic3lzX2Z1bmMJU3Vic3lzdGVtIEFQSSBmdW5jdGlvbgorICovCisjZGVmaW5lIElPQVBJX0lOTElORSggX3N1YnN5cywgX2FwaV9mdW5jICkgXAorCVNJTkdMRV9BUElfSU5MSU5FICggSU9BUElfUFJFRklYXyAjIyBfc3Vic3lzLCBfYXBpX2Z1bmMgKQorCisvKioKKyAqIFByb3ZpZGUgYW4gSS9PIEFQSSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEB2IF9wcmVmaXgJCVN1YnN5c3RlbSBwcmVmaXgKKyAqIEB2IF9hcGlfZnVuYwkJQVBJIGZ1bmN0aW9uCisgKiBAdiBfZnVuYwkJSW1wbGVtZW50aW5nIGZ1bmN0aW9uCisgKi8KKyNkZWZpbmUgUFJPVklERV9JT0FQSSggX3N1YnN5cywgX2FwaV9mdW5jLCBfZnVuYyApIFwKKwlQUk9WSURFX1NJTkdMRV9BUEkgKCBJT0FQSV9QUkVGSVhfICMjIF9zdWJzeXMsIF9hcGlfZnVuYywgX2Z1bmMgKQorCisvKioKKyAqIFByb3ZpZGUgYSBzdGF0aWMgaW5saW5lIEkvTyBBUEkgaW1wbGVtZW50YXRpb24KKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICovCisjZGVmaW5lIFBST1ZJREVfSU9BUElfSU5MSU5FKCBfc3Vic3lzLCBfYXBpX2Z1bmMgKSBcCisJUFJPVklERV9TSU5HTEVfQVBJX0lOTElORSAoIElPQVBJX1BSRUZJWF8gIyMgX3N1YnN5cywgX2FwaV9mdW5jICkKKworLyogSW5jbHVkZSBhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IEkvTyBBUEkgaGVhZGVycyAqLworI2luY2x1ZGUgPGdweGUvZWZpL2VmaV9pby5oPgorCisvKiBJbmNsdWRlIGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IEkvTyBBUEkgaGVhZGVycyAqLworI2luY2x1ZGUgPGJpdHMvaW8uaD4KKworLyoqCisgKiBXcmFwIGFuIEkvTyByZWFkCisgKgorICogQHYgX2Z1bmMJCUkvTyBBUEkgZnVuY3Rpb24KKyAqIEB2IF90eXBlCQlEYXRhIHR5cGUKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKiBAdiBfcHJlZml4CQlQcmVmaXggZm9yIGFkZHJlc3MgaW4gZGVidWcgbWVzc2FnZQorICogQHYgX25kaWdpdHMJCU51bWJlciBvZiBoZXggZGlnaXRzIGZvciB0aGlzIGRhdGEgdHlwZQorICovCisjZGVmaW5lIElPQVBJX1JFQUQoIF9mdW5jLCBfdHlwZSwgaW9fYWRkciwgX3ByZWZpeCwgX25kaWdpdHMgKSAoIHsJICAgICAgXAorCXZvbGF0aWxlIF90eXBlICpfaW9fYWRkciA9CQkJCQkgICAgICBcCisJCSggKCB2b2xhdGlsZSBfdHlwZSAqICkgKCBpbnRwdHJfdCApIChpb19hZGRyKSApOwkgICAgICBcCisJX3R5cGUgX2RhdGEgPSBfZnVuYyAoIF9pb19hZGRyICk7CQkJCSAgICAgIFwKKwlEQkdJTyAoICJbIiBfcHJlZml4ICIgJTA4bHhdID0+ICUwIiAjX25kaWdpdHMgImxseFxuIiwJCSAgICAgIFwKKwkJaW9fdG9fYnVzICggX2lvX2FkZHIgKSwgKCB1bnNpZ25lZCBsb25nIGxvbmcgKSBfZGF0YSApOwkgICAgICBcCisJX2RhdGE7IH0gKQorCisvKioKKyAqIFdyYXAgYW4gSS9PIHdyaXRlCisgKgorICogQHYgX2Z1bmMJCUkvTyBBUEkgZnVuY3Rpb24KKyAqIEB2IF90eXBlCQlEYXRhIHR5cGUKKyAqIEB2IGRhdGEJCVZhbHVlIHRvIHdyaXRlCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHYgX3ByZWZpeAkJUHJlZml4IGZvciBhZGRyZXNzIGluIGRlYnVnIG1lc3NhZ2UKKyAqIEB2IF9uZGlnaXRzCQlOdW1iZXIgb2YgaGV4IGRpZ2l0cyBmb3IgdGhpcyBkYXRhIHR5cGUKKyAqLworI2RlZmluZSBJT0FQSV9XUklURSggX2Z1bmMsIF90eXBlLCBkYXRhLCBpb19hZGRyLCBfcHJlZml4LCBfbmRpZ2l0cyApIGRvIHsgICAgXAorCXZvbGF0aWxlIF90eXBlICpfaW9fYWRkciA9CQkJCQkgICAgICBcCisJCSggKCB2b2xhdGlsZSBfdHlwZSAqICkgKCBpbnRwdHJfdCApIChpb19hZGRyKSApOwkgICAgICBcCisJX3R5cGUgX2RhdGEgPSAoZGF0YSk7CQkJCQkJICAgICAgXAorCURCR0lPICggIlsiIF9wcmVmaXggIiAlMDhseF0gPD0gJTAiICNfbmRpZ2l0cyAibGx4XG4iLAkJICAgICAgXAorCQlpb190b19idXMgKCBfaW9fYWRkciApLCAoIHVuc2lnbmVkIGxvbmcgbG9uZyApIF9kYXRhICk7CSAgICAgIFwKKwlfZnVuYyAoIF9kYXRhLCBfaW9fYWRkciApOwkJCQkJICAgICAgXAorCX0gd2hpbGUgKCAwICkKKworLyoqCisgKiBXcmFwIGFuIEkvTyBzdHJpbmcgcmVhZAorICoKKyAqIEB2IF9mdW5jCQlJL08gQVBJIGZ1bmN0aW9uCisgKiBAdiBfdHlwZQkJRGF0YSB0eXBlCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEB2IGNvdW50CQlOdW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZAorICogQHYgX3ByZWZpeAkJUHJlZml4IGZvciBhZGRyZXNzIGluIGRlYnVnIG1lc3NhZ2UKKyAqIEB2IF9uZGlnaXRzCQlOdW1iZXIgb2YgaGV4IGRpZ2l0cyBmb3IgdGhpcyBkYXRhIHR5cGUKKyAqLworI2RlZmluZSBJT0FQSV9SRUFEUyggX2Z1bmMsIF90eXBlLCBpb19hZGRyLCBkYXRhLCBjb3VudCwgX3ByZWZpeCwgX25kaWdpdHMgKSAgXAorCWRvIHsJCQkJCQkJCSAgICAgIFwKKwl2b2xhdGlsZSBfdHlwZSAqX2lvX2FkZHIgPQkJCQkJICAgICAgXAorCQkoICggdm9sYXRpbGUgX3R5cGUgKiApICggaW50cHRyX3QgKSAoaW9fYWRkcikgKTsJICAgICAgXAorCXZvaWQgKl9kYXRhX3ZvaWQgPSAoZGF0YSk7IC8qIENoZWNrIGRhdGEgaXMgYSBwb2ludGVyICovCSAgICAgIFwKKwlfdHlwZSAqIF9kYXRhID0gKCAoIF90eXBlICogKSBfZGF0YV92b2lkICk7CQkJICAgICAgXAorCWNvbnN0IF90eXBlICogX2RiZ19kYXRhID0gX2RhdGE7CQkJCSAgICAgIFwKKwl1bnNpZ25lZCBpbnQgX2NvdW50ID0gKGNvdW50KTsJCQkJCSAgICAgIFwKKwl1bnNpZ25lZCBpbnQgX2RiZ19jb3VudCA9IF9jb3VudDsJCQkJICAgICAgXAorCV9mdW5jICggX2lvX2FkZHIsIF9kYXRhLCBfY291bnQgKTsJCQkJICAgICAgXAorCURCR0lPICggIlsiIF9wcmVmaXggIiAlMDhseF0gPT4iLCBpb190b19idXMgKCBfaW9fYWRkciApICk7CSAgICAgIFwKKwl3aGlsZSAoIF9kYmdfY291bnQtLSApIHsJCQkJCSAgICAgIFwKKwkJREJHSU8gKCAiICUwIiAjX25kaWdpdHMgImxseCIsCQkJCSAgICAgIFwKKwkJCSggKCB1bnNpZ25lZCBsb25nIGxvbmcgKSAqKF9kYmdfZGF0YSsrKSApICk7CSAgICAgIFwKKwl9CQkJCQkJCQkgICAgICBcCisJREJHSU8gKCAiXG4iICk7CQkJCQkJCSAgICAgIFwKKwl9IHdoaWxlICggMCApCisKKy8qKgorICogV3JhcCBhbiBJL08gc3RyaW5nIHdyaXRlCisgKgorICogQHYgX2Z1bmMJCUkvTyBBUEkgZnVuY3Rpb24KKyAqIEB2IF90eXBlCQlEYXRhIHR5cGUKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKiBAdiBkYXRhCQlEYXRhIGJ1ZmZlcgorICogQHYgY291bnQJCU51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQorICogQHYgX3ByZWZpeAkJUHJlZml4IGZvciBhZGRyZXNzIGluIGRlYnVnIG1lc3NhZ2UKKyAqIEB2IF9uZGlnaXRzCQlOdW1iZXIgb2YgaGV4IGRpZ2l0cyBmb3IgdGhpcyBkYXRhIHR5cGUKKyAqLworI2RlZmluZSBJT0FQSV9XUklURVMoIF9mdW5jLCBfdHlwZSwgaW9fYWRkciwgZGF0YSwgY291bnQsIF9wcmVmaXgsIF9uZGlnaXRzICkgXAorCWRvIHsJCQkJCQkJCSAgICAgIFwKKwl2b2xhdGlsZSBfdHlwZSAqX2lvX2FkZHIgPQkJCQkJICAgICAgXAorCQkoICggdm9sYXRpbGUgX3R5cGUgKiApICggaW50cHRyX3QgKSAoaW9fYWRkcikgKTsJICAgICAgXAorCWNvbnN0IHZvaWQgKl9kYXRhX3ZvaWQgPSAoZGF0YSk7IC8qIENoZWNrIGRhdGEgaXMgYSBwb2ludGVyICovCSAgICAgIFwKKwljb25zdCBfdHlwZSAqIF9kYXRhID0gKCAoIGNvbnN0IF90eXBlICogKSBfZGF0YV92b2lkICk7CQkgICAgICBcCisJY29uc3QgX3R5cGUgKiBfZGJnX2RhdGEgPSBfZGF0YTsJCQkJICAgICAgXAorCXVuc2lnbmVkIGludCBfY291bnQgPSAoY291bnQpOwkJCQkJICAgICAgXAorCXVuc2lnbmVkIGludCBfZGJnX2NvdW50ID0gX2NvdW50OwkJCQkgICAgICBcCisJREJHSU8gKCAiWyIgX3ByZWZpeCAiICUwOGx4XSA8PSIsIGlvX3RvX2J1cyAoIF9pb19hZGRyICkgKTsJICAgICAgXAorCXdoaWxlICggX2RiZ19jb3VudC0tICkgewkJCQkJICAgICAgXAorCQlEQkdJTyAoICIgJTAiICNfbmRpZ2l0cyAibGx4IiwJCQkJICAgICAgXAorCQkJKCAoIHVuc2lnbmVkIGxvbmcgbG9uZyApICooX2RiZ19kYXRhKyspICkgKTsJICAgICAgXAorCX0JCQkJCQkJCSAgICAgIFwKKwlEQkdJTyAoICJcbiIgKTsJCQkJCQkJICAgICAgXAorCV9mdW5jICggX2lvX2FkZHIsIF9kYXRhLCBfY291bnQgKTsJCQkJICAgICAgXAorCX0gd2hpbGUgKCAwICkKKworLyoqCisgKiBDb252ZXJ0IHBoeXNpY2FsIGFkZHJlc3MgdG8gYSBidXMgYWRkcmVzcworICoKKyAqIEB2IHBoeXNfYWRkcgkJUGh5c2ljYWwgYWRkcmVzcworICogQHJldCBidXNfYWRkcglCdXMgYWRkcmVzcworICovCit1bnNpZ25lZCBsb25nIHBoeXNfdG9fYnVzICggdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgKTsKKworLyoqCisgKiBDb252ZXJ0IGJ1cyBhZGRyZXNzIHRvIGEgcGh5c2ljYWwgYWRkcmVzcworICoKKyAqIEB2IGJ1c19hZGRyCQlCdXMgYWRkcmVzcworICogQHJldCBwaHlzX2FkZHIJUGh5c2ljYWwgYWRkcmVzcworICovCit1bnNpZ25lZCBsb25nIGJ1c190b19waHlzICggdW5zaWduZWQgbG9uZyBidXNfYWRkciApOworCisvKioKKyAqIENvbnZlcnQgdmlydHVhbCBhZGRyZXNzIHRvIGEgYnVzIGFkZHJlc3MKKyAqCisgKiBAdiBhZGRyCQlWaXJ0dWFsIGFkZHJlc3MKKyAqIEByZXQgYnVzX2FkZHIJQnVzIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZwordmlydF90b19idXMgKCB2b2xhdGlsZSBjb25zdCB2b2lkICphZGRyICkgeworCXJldHVybiBwaHlzX3RvX2J1cyAoIHZpcnRfdG9fcGh5cyAoIGFkZHIgKSApOworfQorCisvKioKKyAqIENvbnZlcnQgYnVzIGFkZHJlc3MgdG8gYSB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBAdiBidXNfYWRkcgkJQnVzIGFkZHJlc3MKKyAqIEByZXQgYWRkcgkJVmlydHVhbCBhZGRyZXNzCisgKgorICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGF2YWlsYWJsZSB1bmRlciBhbGwgbWVtb3J5IG1vZGVscy4KKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqIGJ1c190b192aXJ0ICggdW5zaWduZWQgbG9uZyBidXNfYWRkciApIHsKKwlyZXR1cm4gcGh5c190b192aXJ0ICggYnVzX3RvX3BoeXMgKCBidXNfYWRkciApICk7Cit9CisKKy8qKgorICogTWFwIGJ1cyBhZGRyZXNzIGFzIGFuIEkvTyBhZGRyZXNzCisgKgorICogQHYgYnVzX2FkZHIJCUJ1cyBhZGRyZXNzCisgKiBAdiBsZW4JCUxlbmd0aCBvZiByZWdpb24KKyAqIEByZXQgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqLwordm9pZCAqIGlvcmVtYXAgKCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCBzaXplX3QgbGVuICk7CisKKy8qKgorICogVW5tYXAgSS9PIGFkZHJlc3MKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICovCit2b2lkIGlvdW5tYXAgKCB2b2xhdGlsZSBjb25zdCB2b2lkICppb19hZGRyICk7CisKKy8qKgorICogQ29udmVydCBJL08gYWRkcmVzcyB0byBidXMgYWRkcmVzcyAoZm9yIGRlYnVnIG9ubHkpCisgKgorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqIEByZXQgYnVzX2FkZHIJQnVzIGFkZHJlc3MKKyAqLwordW5zaWduZWQgbG9uZyBpb190b19idXMgKCB2b2xhdGlsZSBjb25zdCB2b2lkICppb19hZGRyICk7CisKKy8qKgorICogUmVhZCBieXRlIGZyb20gbWVtb3J5LW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHJldCBkYXRhCQlWYWx1ZSByZWFkCisgKi8KK3VpbnQ4X3QgcmVhZGIgKCB2b2xhdGlsZSB1aW50OF90ICppb19hZGRyICk7CisjZGVmaW5lIHJlYWRiKCBpb19hZGRyICkgSU9BUElfUkVBRCAoIHJlYWRiLCB1aW50OF90LCBpb19hZGRyLCAiTUVNIiwgMiApCisKKy8qKgorICogUmVhZCAxNi1iaXQgd29yZCBmcm9tIG1lbW9yeS1tYXBwZWQgZGV2aWNlCisgKgorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqIEByZXQgZGF0YQkJVmFsdWUgcmVhZAorICovCit1aW50MTZfdCByZWFkdyAoIHZvbGF0aWxlIHVpbnQxNl90ICppb19hZGRyICk7CisjZGVmaW5lIHJlYWR3KCBpb19hZGRyICkgSU9BUElfUkVBRCAoIHJlYWR3LCB1aW50MTZfdCwgaW9fYWRkciwgIk1FTSIsIDQgKQorCisvKioKKyAqIFJlYWQgMzItYml0IGR3b3JkIGZyb20gbWVtb3J5LW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHJldCBkYXRhCQlWYWx1ZSByZWFkCisgKi8KK3VpbnQzMl90IHJlYWRsICggdm9sYXRpbGUgdWludDMyX3QgKmlvX2FkZHIgKTsKKyNkZWZpbmUgcmVhZGwoIGlvX2FkZHIgKSBJT0FQSV9SRUFEICggcmVhZGwsIHVpbnQzMl90LCBpb19hZGRyLCAiTUVNIiwgOCApCisKKy8qKgorICogUmVhZCA2NC1iaXQgcXdvcmQgZnJvbSBtZW1vcnktbWFwcGVkIGRldmljZQorICoKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKiBAcmV0IGRhdGEJCVZhbHVlIHJlYWQKKyAqLwordWludDY0X3QgcmVhZHEgKCB2b2xhdGlsZSB1aW50NjRfdCAqaW9fYWRkciApOworI2RlZmluZSByZWFkcSggaW9fYWRkciApIElPQVBJX1JFQUQgKCByZWFkcSwgdWludDY0X3QsIGlvX2FkZHIsICJNRU0iLCAxNiApCisKKy8qKgorICogV3JpdGUgYnl0ZSB0byBtZW1vcnktbWFwcGVkIGRldmljZQorICoKKyAqIEB2IGRhdGEJCVZhbHVlIHRvIHdyaXRlCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICovCit2b2lkIHdyaXRlYiAoIHVpbnQ4X3QgZGF0YSwgdm9sYXRpbGUgdWludDhfdCAqaW9fYWRkciApOworI2RlZmluZSB3cml0ZWIoIGRhdGEsIGlvX2FkZHIgKSBcCisJSU9BUElfV1JJVEUgKCB3cml0ZWIsIHVpbnQ4X3QsIGRhdGEsIGlvX2FkZHIsICJNRU0iLCAyICkKKworLyoqCisgKiBXcml0ZSAxNi1iaXQgd29yZCB0byBtZW1vcnktbWFwcGVkIGRldmljZQorICoKKyAqIEB2IGRhdGEJCVZhbHVlIHRvIHdyaXRlCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICovCit2b2lkIHdyaXRldyAoIHVpbnQxNl90IGRhdGEsIHZvbGF0aWxlIHVpbnQxNl90ICppb19hZGRyICk7CisjZGVmaW5lIHdyaXRldyggZGF0YSwgaW9fYWRkciApIFwKKwlJT0FQSV9XUklURSAoIHdyaXRldywgdWludDE2X3QsIGRhdGEsIGlvX2FkZHIsICJNRU0iLCA0ICkKKworLyoqCisgKiBXcml0ZSAzMi1iaXQgZHdvcmQgdG8gbWVtb3J5LW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBkYXRhCQlWYWx1ZSB0byB3cml0ZQorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqLwordm9pZCB3cml0ZWwgKCB1aW50MzJfdCBkYXRhLCB2b2xhdGlsZSB1aW50MzJfdCAqaW9fYWRkciApOworI2RlZmluZSB3cml0ZWwoIGRhdGEsIGlvX2FkZHIgKSBcCisJSU9BUElfV1JJVEUgKCB3cml0ZWwsIHVpbnQzMl90LCBkYXRhLCBpb19hZGRyLCAiTUVNIiwgOCApCisKKy8qKgorICogV3JpdGUgNjQtYml0IHF3b3JkIHRvIG1lbW9yeS1tYXBwZWQgZGV2aWNlCisgKgorICogQHYgZGF0YQkJVmFsdWUgdG8gd3JpdGUKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKi8KK3ZvaWQgd3JpdGVxICggdWludDY0X3QgZGF0YSwgdm9sYXRpbGUgdWludDY0X3QgKmlvX2FkZHIgKTsKKyNkZWZpbmUgd3JpdGVxKCBkYXRhLCBpb19hZGRyICkgXAorCUlPQVBJX1dSSVRFICggd3JpdGVxLCB1aW50NjRfdCwgZGF0YSwgaW9fYWRkciwgIk1FTSIsIDE2ICkKKworLyoqCisgKiBSZWFkIGJ5dGUgZnJvbSBJL08tbWFwcGVkIGRldmljZQorICoKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKiBAcmV0IGRhdGEJCVZhbHVlIHJlYWQKKyAqLwordWludDhfdCBpbmIgKCB2b2xhdGlsZSB1aW50OF90ICppb19hZGRyICk7CisjZGVmaW5lIGluYiggaW9fYWRkciApIElPQVBJX1JFQUQgKCBpbmIsIHVpbnQ4X3QsIGlvX2FkZHIsICJJTyIsIDIgKQorCisvKioKKyAqIFJlYWQgMTYtYml0IHdvcmQgZnJvbSBJL08tbWFwcGVkIGRldmljZQorICoKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKiBAcmV0IGRhdGEJCVZhbHVlIHJlYWQKKyAqLwordWludDE2X3QgaW53ICggdm9sYXRpbGUgdWludDE2X3QgKmlvX2FkZHIgKTsKKyNkZWZpbmUgaW53KCBpb19hZGRyICkgSU9BUElfUkVBRCAoIGludywgdWludDE2X3QsIGlvX2FkZHIsICJJTyIsIDQgKQorCisvKioKKyAqIFJlYWQgMzItYml0IGR3b3JkIGZyb20gSS9PLW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHJldCBkYXRhCQlWYWx1ZSByZWFkCisgKi8KK3VpbnQzMl90IGlubCAoIHZvbGF0aWxlIHVpbnQzMl90ICppb19hZGRyICk7CisjZGVmaW5lIGlubCggaW9fYWRkciApIElPQVBJX1JFQUQgKCBpbmwsIHVpbnQzMl90LCBpb19hZGRyLCAiSU8iLCA4ICkKKworLyoqCisgKiBXcml0ZSBieXRlIHRvIEkvTy1tYXBwZWQgZGV2aWNlCisgKgorICogQHYgZGF0YQkJVmFsdWUgdG8gd3JpdGUKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKi8KK3ZvaWQgb3V0YiAoIHVpbnQ4X3QgZGF0YSwgdm9sYXRpbGUgdWludDhfdCAqaW9fYWRkciApOworI2RlZmluZSBvdXRiKCBkYXRhLCBpb19hZGRyICkgXAorCUlPQVBJX1dSSVRFICggb3V0YiwgdWludDhfdCwgZGF0YSwgaW9fYWRkciwgIklPIiwgMiApCisKKy8qKgorICogV3JpdGUgMTYtYml0IHdvcmQgdG8gSS9PLW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBkYXRhCQlWYWx1ZSB0byB3cml0ZQorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqLwordm9pZCBvdXR3ICggdWludDE2X3QgZGF0YSwgdm9sYXRpbGUgdWludDE2X3QgKmlvX2FkZHIgKTsKKyNkZWZpbmUgb3V0dyggZGF0YSwgaW9fYWRkciApIFwKKwlJT0FQSV9XUklURSAoIG91dHcsIHVpbnQxNl90LCBkYXRhLCBpb19hZGRyLCAiSU8iLCA0ICkKKworLyoqCisgKiBXcml0ZSAzMi1iaXQgZHdvcmQgdG8gSS9PLW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBkYXRhCQlWYWx1ZSB0byB3cml0ZQorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqLwordm9pZCBvdXRsICggdWludDMyX3QgZGF0YSwgdm9sYXRpbGUgdWludDMyX3QgKmlvX2FkZHIgKTsKKyNkZWZpbmUgb3V0bCggZGF0YSwgaW9fYWRkciApIFwKKwlJT0FQSV9XUklURSAoIG91dGwsIHVpbnQzMl90LCBkYXRhLCBpb19hZGRyLCAiSU8iLCA4ICkKKworLyoqCisgKiBSZWFkIGJ5dGVzIGZyb20gSS9PLW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEB2IGNvdW50CQlOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICovCit2b2lkIGluc2IgKCB2b2xhdGlsZSB1aW50OF90ICppb19hZGRyLCB1aW50OF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgY291bnQgKTsKKyNkZWZpbmUgaW5zYiggaW9fYWRkciwgZGF0YSwgY291bnQgKSBcCisJSU9BUElfUkVBRFMgKCBpbnNiLCB1aW50OF90LCBpb19hZGRyLCBkYXRhLCBjb3VudCwgIklPIiwgMiApCisKKy8qKgorICogUmVhZCAxNi1iaXQgd29yZHMgZnJvbSBJL08tbWFwcGVkIGRldmljZQorICoKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKiBAdiBkYXRhCQlEYXRhIGJ1ZmZlcgorICogQHYgY291bnQJCU51bWJlciBvZiB3b3JkcyB0byByZWFkCisgKi8KK3ZvaWQgaW5zdyAoIHZvbGF0aWxlIHVpbnQxNl90ICppb19hZGRyLCB1aW50MTZfdCAqZGF0YSwgdW5zaWduZWQgaW50IGNvdW50ICk7CisjZGVmaW5lIGluc3coIGlvX2FkZHIsIGRhdGEsIGNvdW50ICkgXAorCUlPQVBJX1JFQURTICggaW5zdywgdWludDE2X3QsIGlvX2FkZHIsIGRhdGEsIGNvdW50LCAiSU8iLCA0ICkKKworLyoqCisgKiBSZWFkIDMyLWJpdCB3b3JkcyBmcm9tIEkvTy1tYXBwZWQgZGV2aWNlCisgKgorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBjb3VudAkJTnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQKKyAqLwordm9pZCBpbnNsICggdm9sYXRpbGUgdWludDMyX3QgKmlvX2FkZHIsIHVpbnQzMl90ICpkYXRhLCB1bnNpZ25lZCBpbnQgY291bnQgKTsKKyNkZWZpbmUgaW5zbCggaW9fYWRkciwgZGF0YSwgY291bnQgKSBcCisJSU9BUElfUkVBRFMgKCBpbnNsLCB1aW50MzJfdCwgaW9fYWRkciwgZGF0YSwgY291bnQsICJJTyIsIDggKQorCisvKioKKyAqIFdyaXRlIGJ5dGVzIHRvIEkvTy1tYXBwZWQgZGV2aWNlCisgKgorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBjb3VudAkJTnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKi8KK3ZvaWQgb3V0c2IgKCB2b2xhdGlsZSB1aW50OF90ICppb19hZGRyLCBjb25zdCB1aW50OF90ICpkYXRhLAorCSAgICAgdW5zaWduZWQgaW50IGNvdW50ICk7CisjZGVmaW5lIG91dHNiKCBpb19hZGRyLCBkYXRhLCBjb3VudCApIFwKKwlJT0FQSV9XUklURVMgKCBvdXRzYiwgdWludDhfdCwgaW9fYWRkciwgZGF0YSwgY291bnQsICJJTyIsIDIgKQorCisvKioKKyAqIFdyaXRlIDE2LWJpdCB3b3JkcyB0byBJL08tbWFwcGVkIGRldmljZQorICoKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKiBAdiBkYXRhCQlEYXRhIGJ1ZmZlcgorICogQHYgY291bnQJCU51bWJlciBvZiB3b3JkcyB0byB3cml0ZQorICovCit2b2lkIG91dHN3ICggdm9sYXRpbGUgdWludDE2X3QgKmlvX2FkZHIsIGNvbnN0IHVpbnQxNl90ICpkYXRhLAorCSAgICAgdW5zaWduZWQgaW50IGNvdW50ICk7CisjZGVmaW5lIG91dHN3KCBpb19hZGRyLCBkYXRhLCBjb3VudCApIFwKKwlJT0FQSV9XUklURVMgKCBvdXRzdywgdWludDE2X3QsIGlvX2FkZHIsIGRhdGEsIGNvdW50LCAiSU8iLCA0ICkKKworLyoqCisgKiBXcml0ZSAzMi1iaXQgd29yZHMgdG8gSS9PLW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEB2IGNvdW50CQlOdW1iZXIgb2Ygd29yZHMgdG8gd3JpdGUKKyAqLwordm9pZCBvdXRzbCAoIHZvbGF0aWxlIHVpbnQzMl90ICppb19hZGRyLCBjb25zdCB1aW50MzJfdCAqZGF0YSwKKwkgICAgIHVuc2lnbmVkIGludCBjb3VudCApOworI2RlZmluZSBvdXRzbCggaW9fYWRkciwgZGF0YSwgY291bnQgKSBcCisJSU9BUElfV1JJVEVTICggb3V0c2wsIHVpbnQzMl90LCBpb19hZGRyLCBkYXRhLCBjb3VudCwgIklPIiwgOCApCisKKy8qKgorICogU2xvdyBkb3duIEkvTworICoKKyAqLwordm9pZCBpb2RlbGF5ICggdm9pZCApOworCisvKioKKyAqIFJlYWQgdmFsdWUgZnJvbSBJL08tbWFwcGVkIGRldmljZSwgc2xvd2x5CisgKgorICogQHYgX2Z1bmMJCUZ1bmN0aW9uIHRvIHVzZSB0byByZWFkIHZhbHVlCisgKiBAdiBkYXRhCQlWYWx1ZSB0byB3cml0ZQorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqLworI2RlZmluZSBJTlhfUCggX2Z1bmMsIF90eXBlLCBpb19hZGRyICkgKCB7CQkJCSAgICAgIFwKKwlfdHlwZSBfZGF0YSA9IF9mdW5jICggKGlvX2FkZHIpICk7CQkJCSAgICAgIFwKKwlpb2RlbGF5KCk7CQkJCQkJCSAgICAgIFwKKwlfZGF0YTsgfSApCisKKy8qKgorICogUmVhZCBieXRlIGZyb20gSS9PLW1hcHBlZCBkZXZpY2UKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHJldCBkYXRhCQlWYWx1ZSByZWFkCisgKi8KKyNkZWZpbmUgaW5iX3AoIGlvX2FkZHIgKSBJTlhfUCAoIGluYiwgdWludDhfdCwgaW9fYWRkciApCisKKy8qKgorICogUmVhZCAxNi1iaXQgd29yZCBmcm9tIEkvTy1tYXBwZWQgZGV2aWNlCisgKgorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqIEByZXQgZGF0YQkJVmFsdWUgcmVhZAorICovCisjZGVmaW5lIGlud19wKCBpb19hZGRyICkgSU5YX1AgKCBpbncsIHVpbnQxNl90LCBpb19hZGRyICkKKworLyoqCisgKiBSZWFkIDMyLWJpdCBkd29yZCBmcm9tIEkvTy1tYXBwZWQgZGV2aWNlCisgKgorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqIEByZXQgZGF0YQkJVmFsdWUgcmVhZAorICovCisjZGVmaW5lIGlubF9wKCBpb19hZGRyICkgSU5YX1AgKCBpbmwsIHVpbnQzMl90LCBpb19hZGRyICkKKworLyoqCisgKiBXcml0ZSB2YWx1ZSB0byBJL08tbWFwcGVkIGRldmljZSwgc2xvd2x5CisgKgorICogQHYgX2Z1bmMJCUZ1bmN0aW9uIHRvIHVzZSB0byB3cml0ZSB2YWx1ZQorICogQHYgZGF0YQkJVmFsdWUgdG8gd3JpdGUKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKi8KKyNkZWZpbmUgT1VUWF9QKCBfZnVuYywgZGF0YSwgaW9fYWRkciApIGRvIHsJCQkJICAgICAgXAorCV9mdW5jICggKGRhdGEpLCAoaW9fYWRkcikgKTsJCQkJCSAgICAgIFwKKwlpb2RlbGF5KCk7CQkJCQkJCSAgICAgIFwKKwl9IHdoaWxlICggMCApCisKKy8qKgorICogV3JpdGUgYnl0ZSB0byBJL08tbWFwcGVkIGRldmljZSwgc2xvd2x5CisgKgorICogQHYgZGF0YQkJVmFsdWUgdG8gd3JpdGUKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKi8KKyNkZWZpbmUgb3V0Yl9wKCBkYXRhLCBpb19hZGRyICkgT1VUWF9QICggb3V0YiwgZGF0YSwgaW9fYWRkciApCisKKy8qKgorICogV3JpdGUgMTYtYml0IHdvcmQgdG8gSS9PLW1hcHBlZCBkZXZpY2UsIHNsb3dseQorICoKKyAqIEB2IGRhdGEJCVZhbHVlIHRvIHdyaXRlCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICovCisjZGVmaW5lIG91dHdfcCggZGF0YSwgaW9fYWRkciApIE9VVFhfUCAoIG91dHcsIGRhdGEsIGlvX2FkZHIgKQorCisvKioKKyAqIFdyaXRlIDMyLWJpdCBkd29yZCB0byBJL08tbWFwcGVkIGRldmljZSwgc2xvd2x5CisgKgorICogQHYgZGF0YQkJVmFsdWUgdG8gd3JpdGUKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKi8KKyNkZWZpbmUgb3V0bF9wKCBkYXRhLCBpb19hZGRyICkgT1VUWF9QICggb3V0bCwgZGF0YSwgaW9fYWRkciApCisKKy8qKgorICogTWVtb3J5IGJhcnJpZXIKKyAqCisgKi8KK3ZvaWQgbWIgKCB2b2lkICk7CisjZGVmaW5lIHJtYigpCW1iKCkKKyNkZWZpbmUgd21iKCkJbWIoKQorCisjZW5kaWYgLyogX0dQWEVfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lvYnVmLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaW9idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjA1ZjllCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lvYnVmLmgKQEAgLTAsMCArMSwyMjkgQEAKKyNpZm5kZWYgX0dQWEVfSU9CVUZfSAorI2RlZmluZSBfR1BYRV9JT0JVRl9ICisKKy8qKiBAZmlsZQorICoKKyAqIEkvTyBidWZmZXJzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorCisvKioKKyAqIEkvTyBidWZmZXIgYWxpZ25tZW50CisgKgorICogSS9PIGJ1ZmZlcnMgYWxsb2NhdGVkIHZpYSBhbGxvY19pb2IoKSBhcmUgZ3VhcmFudGVlZCB0byBiZQorICogcGh5c2ljYWxseSBhbGlnbmVkIHRvIHRoaXMgYm91bmRhcnkuICBTb21lIGNhcmRzIGNhbm5vdCBETUEgYWNyb3NzCisgKiBhIDRrQiBib3VuZGFyeS4gIFdpdGggYSBzdGFuZGFyZCBFdGhlcm5ldCBNVFUsIGFsaWduaW5nIHRvIGEgMmtCCisgKiBib3VuZGFyeSBpcyBzdWZmaWNpZW50IHRvIGd1YXJhbnRlZSBubyA0a0IgYm91bmRhcnkgY3Jvc3NpbmdzLiAgRm9yCisgKiBhIGp1bWJvIEV0aGVybmV0IE1UVSwgYSBwYWNrZXQgbWF5IGJlIGxhcmdlciB0aGFuIDRrQiBhbnl3YXkuCisgKi8KKyNkZWZpbmUgSU9CX0FMSUdOIDIwNDgKKworLyoqCisgKiBNaW5pbXVtIEkvTyBidWZmZXIgbGVuZ3RoCisgKgorICogYWxsb2NfaW9iKCkgd2lsbCByb3VuZCB1cCB0aGUgYWxsb2NhdGVkIGxlbmd0aCB0byB0aGlzIHNpemUgaWYKKyAqIG5lY2Vzc2FyeS4gIFRoaXMgaXMgdXNlZCBvbiBiZWhhbGYgb2YgaGFyZHdhcmUgdGhhdCBpcyBub3QgY2FwYWJsZQorICogb2YgYXV0by1wYWRkaW5nLgorICovCisjZGVmaW5lIElPQl9aTEVOIDY0CisKKy8qKgorICogQSBwZXJzaXN0ZW50IEkvTyBidWZmZXIKKyAqCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGVuY2Fwc3VsYXRlcyBhIGxvbmctbGl2ZWQgSS9PIGJ1ZmZlci4gIFRoZQorICogYnVmZmVyIG1heSBiZSBwYXNzZWQgYmV0d2VlbiBtdWx0aXBsZSBvd25lcnMsIHF1ZXVlZCBmb3IgcG9zc2libGUKKyAqIHJldHJhbnNtaXNzaW9uLCBldGMuCisgKi8KK3N0cnVjdCBpb19idWZmZXIgeworCS8qKiBMaXN0IG9mIHdoaWNoIHRoaXMgYnVmZmVyIGlzIGEgbWVtYmVyCisJICoKKwkgKiBUaGUgbGlzdCBtdXN0IGJlbG9uZyB0byB0aGUgY3VycmVudCBvd25lciBvZiB0aGUgYnVmZmVyLgorCSAqIERpZmZlcmVudCBvd25lcnMgbWF5IG1haW50YWluIGRpZmZlcmVudCBsaXN0cyAoZS5nLiBhCisJICogcmV0cmFuc21pc3Npb24gbGlzdCBmb3IgVENQKS4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiogU3RhcnQgb2YgdGhlIGJ1ZmZlciAqLworCXZvaWQgKmhlYWQ7CisJLyoqIFN0YXJ0IG9mIGRhdGEgKi8KKwl2b2lkICpkYXRhOworCS8qKiBFbmQgb2YgZGF0YSAqLworCXZvaWQgKnRhaWw7CisJLyoqIEVuZCBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHZvaWQgKmVuZDsKK307CisKKy8qKgorICogUmVzZXJ2ZSBzcGFjZSBhdCBzdGFydCBvZiBJL08gYnVmZmVyCisgKgorICogQHYgaW9idWYJSS9PIGJ1ZmZlcgorICogQHYgbGVuCUxlbmd0aCB0byByZXNlcnZlCisgKiBAcmV0IGRhdGEJUG9pbnRlciB0byBuZXcgc3RhcnQgb2YgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGlvYl9yZXNlcnZlICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHNpemVfdCBsZW4gKSB7CisJaW9idWYtPmRhdGEgKz0gbGVuOworCWlvYnVmLT50YWlsICs9IGxlbjsKKwlyZXR1cm4gaW9idWYtPmRhdGE7Cit9CisjZGVmaW5lIGlvYl9yZXNlcnZlKCBpb2J1ZiwgbGVuICkgKCB7CQkJXAorCXZvaWQgKl9fcmVzdWx0OwkJCQkJXAorCV9fcmVzdWx0ID0gaW9iX3Jlc2VydmUgKCAoaW9idWYpLCAobGVuKSApOwlcCisJYXNzZXJ0ICggKGlvYnVmKS0+dGFpbCA8PSAoaW9idWYpLT5lbmQgKTsJXAorCV9fcmVzdWx0OyB9ICkKKworLyoqCisgKiBBZGQgZGF0YSB0byBzdGFydCBvZiBJL08gYnVmZmVyCisgKgorICogQHYgaW9idWYJSS9PIGJ1ZmZlcgorICogQHYgbGVuCUxlbmd0aCB0byBhZGQKKyAqIEByZXQgZGF0YQlQb2ludGVyIHRvIG5ldyBzdGFydCBvZiBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkICogaW9iX3B1c2ggKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1Ziwgc2l6ZV90IGxlbiApIHsKKwlpb2J1Zi0+ZGF0YSAtPSBsZW47CisJcmV0dXJuIGlvYnVmLT5kYXRhOworfQorI2RlZmluZSBpb2JfcHVzaCggaW9idWYsIGxlbiApICggewkJCVwKKwl2b2lkICpfX3Jlc3VsdDsJCQkJCVwKKwlfX3Jlc3VsdCA9IGlvYl9wdXNoICggKGlvYnVmKSwgKGxlbikgKTsJCVwKKwlhc3NlcnQgKCAoaW9idWYpLT5kYXRhID49IChpb2J1ZiktPmhlYWQgKTsJXAorCV9fcmVzdWx0OyB9ICkKKworLyoqCisgKiBSZW1vdmUgZGF0YSBmcm9tIHN0YXJ0IG9mIEkvTyBidWZmZXIKKyAqCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKiBAdiBsZW4JTGVuZ3RoIHRvIHJlbW92ZQorICogQHJldCBkYXRhCVBvaW50ZXIgdG8gbmV3IHN0YXJ0IG9mIGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKiBpb2JfcHVsbCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzaXplX3QgbGVuICkgeworCWlvYnVmLT5kYXRhICs9IGxlbjsKKwlhc3NlcnQgKCBpb2J1Zi0+ZGF0YSA8PSBpb2J1Zi0+dGFpbCApOworCXJldHVybiBpb2J1Zi0+ZGF0YTsKK30KKyNkZWZpbmUgaW9iX3B1bGwoIGlvYnVmLCBsZW4gKSAoIHsJCQlcCisJdm9pZCAqX19yZXN1bHQ7CQkJCQlcCisJX19yZXN1bHQgPSBpb2JfcHVsbCAoIChpb2J1ZiksIChsZW4pICk7CQlcCisJYXNzZXJ0ICggKGlvYnVmKS0+ZGF0YSA8PSAoaW9idWYpLT50YWlsICk7CVwKKwlfX3Jlc3VsdDsgfSApCisKKy8qKgorICogQWRkIGRhdGEgdG8gZW5kIG9mIEkvTyBidWZmZXIKKyAqCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKiBAdiBsZW4JTGVuZ3RoIHRvIGFkZAorICogQHJldCBkYXRhCVBvaW50ZXIgdG8gbmV3bHkgYWRkZWQgc3BhY2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkICogaW9iX3B1dCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzaXplX3QgbGVuICkgeworCXZvaWQgKm9sZF90YWlsID0gaW9idWYtPnRhaWw7CisJaW9idWYtPnRhaWwgKz0gbGVuOworCXJldHVybiBvbGRfdGFpbDsKK30KKyNkZWZpbmUgaW9iX3B1dCggaW9idWYsIGxlbiApICggewkJCVwKKwl2b2lkICpfX3Jlc3VsdDsJCQkJCVwKKwlfX3Jlc3VsdCA9IGlvYl9wdXQgKCAoaW9idWYpLCAobGVuKSApOwkJXAorCWFzc2VydCAoIChpb2J1ZiktPnRhaWwgPD0gKGlvYnVmKS0+ZW5kICk7CVwKKwlfX3Jlc3VsdDsgfSApCisKKy8qKgorICogUmVtb3ZlIGRhdGEgZnJvbSBlbmQgb2YgSS9PIGJ1ZmZlcgorICoKKyAqIEB2IGlvYnVmCUkvTyBidWZmZXIKKyAqIEB2IGxlbglMZW5ndGggdG8gcmVtb3ZlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpb2JfdW5wdXQgKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1Ziwgc2l6ZV90IGxlbiApIHsKKwlpb2J1Zi0+dGFpbCAtPSBsZW47Cit9CisjZGVmaW5lIGlvYl91bnB1dCggaW9idWYsIGxlbiApIGRvIHsJCQlcCisJaW9iX3VucHV0ICggKGlvYnVmKSwgKGxlbikgKTsJCQlcCisJYXNzZXJ0ICggKGlvYnVmKS0+dGFpbCA+PSAoaW9idWYpLT5kYXRhICk7CVwKKwl9IHdoaWxlICggMCApCisKKy8qKgorICogRW1wdHkgYW4gSS9PIGJ1ZmZlcgorICoKKyAqIEB2IGlvYnVmCUkvTyBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlvYl9lbXB0eSAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCWlvYnVmLT50YWlsID0gaW9idWYtPmRhdGE7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIGxlbmd0aCBvZiBkYXRhIGluIGFuIEkvTyBidWZmZXIKKyAqCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKiBAcmV0IGxlbglMZW5ndGggb2YgZGF0YSBpbiBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgaW9iX2xlbiAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXJldHVybiAoIGlvYnVmLT50YWlsIC0gaW9idWYtPmRhdGEgKTsKK30KKworLyoqCisgKiBDYWxjdWxhdGUgYXZhaWxhYmxlIHNwYWNlIGF0IHN0YXJ0IG9mIGFuIEkvTyBidWZmZXIKKyAqCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKiBAcmV0IGxlbglMZW5ndGggb2YgZGF0YSBhdmFpbGFibGUgYXQgc3RhcnQgb2YgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGlvYl9oZWFkcm9vbSAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXJldHVybiAoIGlvYnVmLT5kYXRhIC0gaW9idWYtPmhlYWQgKTsKK30KKworLyoqCisgKiBDYWxjdWxhdGUgYXZhaWxhYmxlIHNwYWNlIGF0IGVuZCBvZiBhbiBJL08gYnVmZmVyCisgKgorICogQHYgaW9idWYJSS9PIGJ1ZmZlcgorICogQHJldCBsZW4JTGVuZ3RoIG9mIGRhdGEgYXZhaWxhYmxlIGF0IGVuZCBvZiBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgaW9iX3RhaWxyb29tICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKSB7CisJcmV0dXJuICggaW9idWYtPmVuZCAtIGlvYnVmLT50YWlsICk7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgdGVtcG9yYXJ5IEkvTyBidWZmZXIKKyAqCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKiBAdiBkYXRhCURhdGEgYnVmZmVyCisgKiBAdiBsZW4JTGVuZ3RoIG9mIGRhdGEKKyAqIEB2IG1heF9sZW4JTGVuZ3RoIG9mIGJ1ZmZlcgorICoKKyAqIEl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gdXNlIHRoZSBpb2JfeHh4KCkgbWV0aG9kcyBvbiB0ZW1wb3JhcnkKKyAqIGRhdGEgYnVmZmVycy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlvYl9wb3B1bGF0ZSAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJCSAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgc2l6ZV90IG1heF9sZW4gKSB7CisJaW9idWYtPmhlYWQgPSBpb2J1Zi0+ZGF0YSA9IGRhdGE7CisJaW9idWYtPnRhaWwgPSAoIGRhdGEgKyBsZW4gKTsKKwlpb2J1Zi0+ZW5kID0gKCBkYXRhICsgbWF4X2xlbiApOworfQorCisvKioKKyAqIERpc293biBhbiBJL08gYnVmZmVyCisgKgorICogQHYgaW9idWYJSS9PIGJ1ZmZlcgorICoKKyAqIFRoZXJlIGFyZSBtYW55IGZ1bmN0aW9ucyB0aGF0IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBJL08gYnVmZmVyIHRoZXkKKyAqIGFyZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuICBUaGUgY2FsbGVyIHNob3VsZCBub3QgcmV0YWluIGEgcG9pbnRlcgorICogdG8gdGhlIEkvTyBidWZmZXIuICBVc2UgaW9iX2Rpc293bigpIHRvIGF1dG9tYXRpY2FsbHkgbnVsbGlmeSB0aGUKKyAqIGNhbGxlcidzIHBvaW50ZXIsIGUuZy46CisgKgorICogICAgIHhmZXJfZGVsaXZlcl9pb2IgKCB4ZmVyLCBpb2JfZGlzb3duICggaW9idWYgKSApOworICoKKyAqIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBpb2J1ZiBpcyBzZXQgdG8gTlVMTCBmb3IgYW55IGNvZGUgYWZ0ZXIgdGhlCisgKiBjYWxsIHRvIHhmZXJfZGVsaXZlcl9pb2IoKS4KKyAqLworI2RlZmluZSBpb2JfZGlzb3duKCBpb2J1ZiApICggewkJCQlcCisJc3RydWN0IGlvX2J1ZmZlciAqX19pb2J1ZiA9IChpb2J1Zik7CQlcCisJKGlvYnVmKSA9IE5VTEw7CQkJCQlcCisJX19pb2J1ZjsgfSApCisKK2V4dGVybiBzdHJ1Y3QgaW9fYnVmZmVyICogX19tYWxsb2MgYWxsb2NfaW9iICggc2l6ZV90IGxlbiApOworZXh0ZXJuIHZvaWQgZnJlZV9pb2IgKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApOworZXh0ZXJuIHZvaWQgaW9iX3BhZCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzaXplX3QgbWluX2xlbiApOworZXh0ZXJuIGludCBpb2JfZW5zdXJlX2hlYWRyb29tICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHNpemVfdCBsZW4gKTsKKworI2VuZGlmIC8qIF9HUFhFX0lPQlVGX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pcC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0MmEwYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pcC5oCkBAIC0wLDAgKzEsOTcgQEAKKyNpZm5kZWYgX0dQWEVfSVBfSAorI2RlZmluZSBfR1BYRV9JUF9ICisKKy8qKiBAZmlsZQorICoKKyAqIElQIHByb3RvY29sCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvaW4uaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL3JldHJ5Lmg+CisKK3N0cnVjdCBpb19idWZmZXI7CitzdHJ1Y3QgbmV0X2RldmljZTsKK3N0cnVjdCBuZXRfcHJvdG9jb2w7CisKKy8qIElQIGNvbnN0YW50cyAqLworCisjZGVmaW5lIElQX1ZFUgkJCTB4NDBVCisjZGVmaW5lIElQX01BU0tfVkVSCQkweGYwVQorI2RlZmluZSBJUF9NQVNLX0hMRU4gCQkweDBmVQorI2RlZmluZSBJUF9NQVNLX09GRlNFVAkJMHgxZmZmVQorI2RlZmluZSBJUF9NQVNLX0RPTk9URlJBRwkweDQwMDBVCisjZGVmaW5lIElQX01BU0tfTU9SRUZSQUdTCTB4MjAwMFUKKyNkZWZpbmUgSVBfUFNITEVOIAkxMgorCisvKiBJUCBoZWFkZXIgZGVmYXVsdHMgKi8KKyNkZWZpbmUgSVBfVE9TCQkwCisjZGVmaW5lIElQX1RUTAkJNjQKKworI2RlZmluZSBJUF9GUkFHX0lPQl9TSVpFCTE1MDAKKyNkZWZpbmUgSVBfRlJBR19USU1FT1VUCQk1MAorCisvKiogQW4gSVB2NCBwYWNrZXQgaGVhZGVyICovCitzdHJ1Y3QgaXBoZHIgeworCXVpbnQ4X3QgIHZlcmhkcmxlbjsKKwl1aW50OF90ICBzZXJ2aWNlOworCXVpbnQxNl90IGxlbjsKKwl1aW50MTZfdCBpZGVudDsKKwl1aW50MTZfdCBmcmFnczsKKwl1aW50OF90ICB0dGw7CisJdWludDhfdCAgcHJvdG9jb2w7CisJdWludDE2X3QgY2hrc3VtOworCXN0cnVjdCBpbl9hZGRyIHNyYzsKKwlzdHJ1Y3QgaW5fYWRkciBkZXN0OworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEFuIElQdjQgcHNldWRvIGhlYWRlciAqLworc3RydWN0IGlwdjRfcHNldWRvX2hlYWRlciB7CisJc3RydWN0IGluX2FkZHIgc3JjOworCXN0cnVjdCBpbl9hZGRyIGRlc3Q7CisJdWludDhfdCB6ZXJvX3BhZGRpbmc7CisJdWludDhfdCBwcm90b2NvbDsKKwl1aW50MTZfdCBsZW47Cit9OworCisvKiogQW4gSVB2NCBhZGRyZXNzL3JvdXRpbmcgdGFibGUgZW50cnkgKi8KK3N0cnVjdCBpcHY0X21pbmlyb3V0ZSB7CisJLyoqIExpc3Qgb2YgbWluaXJvdXRlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qKiBOZXR3b3JrIGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwkvKiogSVB2NCBhZGRyZXNzICovCisJc3RydWN0IGluX2FkZHIgYWRkcmVzczsKKwkvKiogU3VibmV0IG1hc2sgKi8KKwlzdHJ1Y3QgaW5fYWRkciBuZXRtYXNrOworCS8qKiBHYXRld2F5IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaW5fYWRkciBnYXRld2F5OworfTsKKworLyogRnJhZ21lbnQgcmVhc3NlbWJseSBidWZmZXIgKi8KK3N0cnVjdCBmcmFnX2J1ZmZlciB7CisJLyogSWRlbnRpZmljYXRpb24gbnVtYmVyICovCisJdWludDE2X3QgaWRlbnQ7CisJLyogU291cmNlIG5ldHdvcmsgYWRkcmVzcyAqLworCXN0cnVjdCBpbl9hZGRyIHNyYzsKKwkvKiBEZXN0aW5hdGlvbiBuZXR3b3JrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaW5fYWRkciBkZXN0OworCS8qIFJlYXNzZW1ibGVkIEkvTyBidWZmZXIgKi8KKwlzdHJ1Y3QgaW9fYnVmZmVyICpmcmFnX2lvYjsKKwkvKiBSZWFzc2VtYmx5IHRpbWVyICovCisJc3RydWN0IHJldHJ5X3RpbWVyIGZyYWdfdGltZXI7CisJLyogTGlzdCBvZiBmcmFnbWVudCByZWFzc2VtYmx5IGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBpcHY0X21pbmlyb3V0ZXM7CisKK2V4dGVybiBzdHJ1Y3QgbmV0X3Byb3RvY29sIGlwdjRfcHJvdG9jb2w7CisKKyNlbmRpZiAvKiBfR1BYRV9JUF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaXA2LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaXA2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiMjg2MwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pcDYuaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9HUFhFX0lQNl9ICisjZGVmaW5lIF9HUFhFX0lQNl9ICisKKy8qKiBAZmlsZQorICoKKyAqIElQNiBwcm90b2NvbAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisKKy8qIElQNiBjb25zdGFudHMgKi8KKworI2RlZmluZSBJUDZfVkVSU0lPTgkweDYKKyNkZWZpbmUgSVA2X0hPUF9MSU1JVAkyNTUKKworLyoqCisgKiBJL08gYnVmZmVyIGNvbnRlbnRzCisgKiBUaGlzIGlzIGR1cGxpY2F0ZWQgaW4gdGNwLmggYW5kIGhlcmUuIElkZWFsbHkgaXQgc2hvdWxkIGdvIGludG8gaW9idWYuaAorICovCisjZGVmaW5lIE1BWF9IRFJfTEVOCTEwMAorI2RlZmluZSBNQVhfSU9CX0xFTgkxNTAwCisjZGVmaW5lIE1JTl9JT0JfTEVOCU1BWF9IRFJfTEVOICsgMTAwIC8qIFRvIGFjY291bnQgZm9yIHBhZGRpbmcgYnkgTEwgKi8KKworI2RlZmluZSBJUDZfRVFVQUwoIGluNl9hZGRyMSwgaW42X2FkZHIyICkgXAorICAgICAgICAoIG1lbWNtcCAoICggY2hhciogKSAmKCBpbjZfYWRkcjEgKSwgKCBjaGFyKiApICYoIGluNl9hZGRyMiApLFwKKwlzaXplb2YgKCBzdHJ1Y3QgaW42X2FkZHIgKSApID09IDAgKQorCisjZGVmaW5lIElTX1VOU1BFQ0lGSUVEKCBhZGRyICkgXAorCSggKCAoYWRkcikuaW42X3UudTZfYWRkcjMyWzBdID09IDB4MDAwMDAwMDAgKSAmJiBcCisJKCAoYWRkcikuaW42X3UudTZfYWRkcjMyWzFdID09IDB4MDAwMDAwMDAgKSAmJiBcCisJKCAoYWRkcikuaW42X3UudTZfYWRkcjMyWzJdID09IDB4MDAwMDAwMDAgKSAmJiBcCisJKCAoYWRkcikuaW42X3UudTZfYWRkcjMyWzNdID09IDB4MDAwMDAwMDAgKSApCisvKiBJUDYgaGVhZGVyICovCitzdHJ1Y3QgaXA2X2hlYWRlciB7CisJdWludDMyX3QgCXZlcl90cmFmZmljX2NsYXNzX2Zsb3dfbGFiZWw7CisJdWludDE2X3QgCXBheWxvYWRfbGVuOworCXVpbnQ4X3QgCW54dF9oZHI7CisJdWludDhfdCAJaG9wX2xpbWl0OworCXN0cnVjdCBpbjZfYWRkciBzcmM7CisJc3RydWN0IGluNl9hZGRyIGRlc3Q7Cit9OworCisvKiBJUDYgcHNldWRvIGhlYWRlciAqLworc3RydWN0IGlwdjZfcHNldWRvX2hlYWRlciB7CisJc3RydWN0IGluNl9hZGRyIHNyYzsKKwlzdHJ1Y3QgaW42X2FkZHIgZGVzdDsKKwl1aW50OF90IHplcm9fcGFkZGluZzsKKwl1aW50OF90IG54dF9oZHI7CisJdWludDE2X3QgbGVuOworfTsKKworLyogTmV4dCBoZWFkZXIgbnVtYmVycyAqLworI2RlZmluZSBJUDZfSE9QQllIT1AgCQkweDAwCisjZGVmaW5lIElQNl9ST1VUSU5HIAkJMHg0MworI2RlZmluZSBJUDZfRlJBR01FTlQJCTB4NDQKKyNkZWZpbmUgSVA2X0FVVEhFTlRJQ0FUSU9OCTB4NTEKKyNkZWZpbmUgSVA2X0RFU1RfT1BUUwkJMHg2MAorI2RlZmluZSBJUDZfRVNQCQkJMHg1MAorI2RlZmluZSBJUDZfSUNNUDYJCTB4NTgKKyNkZWZpbmUgSVA2X05PX0hFQURFUgkJMHg1OQorCitzdHJ1Y3QgaW9fYnVmZmVyOworc3RydWN0IG5ldF9kZXZpY2U7CitzdHJ1Y3QgbmV0X3Byb3RvY29sOworCitleHRlcm4gc3RydWN0IG5ldF9wcm90b2NvbCBpcHY2X3Byb3RvY29sOworZXh0ZXJuIHN0cnVjdCB0Y3BpcF9uZXRfcHJvdG9jb2wgaXB2Nl90Y3BpcF9wcm90b2NvbDsKK2V4dGVybiBjaGFyICogaW5ldDZfbnRvYSAoIHN0cnVjdCBpbjZfYWRkciBpbjYgKTsKKworZXh0ZXJuIGludCBhZGRfaXB2Nl9hZGRyZXNzICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgIHN0cnVjdCBpbjZfYWRkciBwcmVmaXgsIGludCBwcmVmaXhfbGVuLAorCQkJICAgICAgc3RydWN0IGluNl9hZGRyIGFkZHJlc3MsCisJCQkgICAgICBzdHJ1Y3QgaW42X2FkZHIgZ2F0ZXdheSApOworZXh0ZXJuIHZvaWQgZGVsX2lwdjZfYWRkcmVzcyAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKTsKKworI2VuZGlmIC8qIF9HUFhFX0lQNl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaXBvaWIuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pcG9pYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMDJmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaXBvaWIuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9HUFhFX0lQT0lCX0gKKyNkZWZpbmUgX0dQWEVfSVBPSUJfSAorCisvKiogQGZpbGUKKyAqCisgKiBJUCBvdmVyIEluZmluaWJhbmQKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL2luZmluaWJhbmQuaD4KKworLyoqIElQb0lCIE1BQyBhZGRyZXNzIGxlbmd0aCAqLworI2RlZmluZSBJUE9JQl9BTEVOIDIwCisKKy8qKiBBbiBJUG9JQiBNQUMgYWRkcmVzcyAqLworc3RydWN0IGlwb2liX21hYyB7CisJLyoqIFF1ZXVlIHBhaXIgbnVtYmVyCisJICoKKwkgKiBNU0IgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIElQb0lCICJjb25uZWN0ZWQgbW9kZSIuICBMb3dlciAyNAorCSAqIGJpdHMgYXJlIHRoZSBRUE4uCisJICovCisJdWludDMyX3QgZmxhZ3NfX3FwbjsKKwkvKiogUG9ydCBHSUQgKi8KKwlzdHJ1Y3QgaWJfZ2lkIGdpZDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBJUG9JQiBsaW5rLWxheWVyIGhlYWRlciBsZW5ndGggKi8KKyNkZWZpbmUgSVBPSUJfSExFTiA0CisKKy8qKiBJUG9JQiBsaW5rLWxheWVyIGhlYWRlciAqLworc3RydWN0IGlwb2liX2hkciB7CisJLyoqIE5ldHdvcmstbGF5ZXIgcHJvdG9jb2wgKi8KKwl1aW50MTZfdCBwcm90bzsKKwkvKiogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXVuaW9uIHsKKwkJLyoqIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwkJdWludDE2X3QgcmVzZXJ2ZWQ7CisJCS8qKiBQZWVyIGFkZHJlc3NlcworCQkgKgorCQkgKiBXZSB1c2UgdGhlc2UgZmllbGRzIGludGVybmFsbHkgdG8gcmVwcmVzZW50IHRoZQorCQkgKiBwZWVyIGFkZHJlc3NlcyB1c2luZyBhIGxvb2t1cCBrZXkuICBUaGVyZSBzaW1wbHkKKwkJICogaXNuJ3QgZW5vdWdoIHJvb20gaW4gdGhlIElQb0lCIGhlYWRlciB0byBzdG9yZQorCQkgKiBsaXRlcmFsIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzc2VzLgorCQkgKi8KKwkJc3RydWN0IHsKKwkJCS8qKiBEZXN0aW5hdGlvbiBhZGRyZXNzIGtleSAqLworCQkJdWludDhfdCBkZXN0OworCQkJLyoqIFNvdXJjZSBhZGRyZXNzIGtleSAqLworCQkJdWludDhfdCBzcmM7CisJCX0gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSkgcGVlcjsKKwl9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpIHU7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCitleHRlcm4gY29uc3QgY2hhciAqIGlwb2liX250b2EgKCBjb25zdCB2b2lkICpsbF9hZGRyICk7CitleHRlcm4gdm9pZCBpcG9pYl9saW5rX3N0YXRlX2NoYW5nZWQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApOworZXh0ZXJuIGludCBpcG9pYl9wcm9iZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICk7CitleHRlcm4gdm9pZCBpcG9pYl9yZW1vdmUgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICogYWxsb2NfaXBvaWJkZXYgKCBzaXplX3QgcHJpdl9zaXplICk7CisKKyNlbmRpZiAvKiBfR1BYRV9JUE9JQl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaXNhLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaXNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwMjdhNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pc2EuaApAQCAtMCwwICsxLDk3IEBACisjaWZuZGVmCUlTQV9ICisjZGVmaW5lIElTQV9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvaXNhX2lkcy5oPgorI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKworLyoqIEFuIElTQSBkZXZpY2UgKi8KK3N0cnVjdCBpc2FfZGV2aWNlIHsKKwkvKiogR2VuZXJpYyBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwkvKiogSS9PIGFkZHJlc3MgKi8KKwl1aW50MTZfdCBpb2FkZHI7CisJLyoqIERyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3QgaXNhX2RyaXZlciAqZHJpdmVyOworCS8qKiBEcml2ZXItcHJpdmF0ZSBkYXRhCisJICoKKwkgKiBVc2UgaXNhX3NldF9kcnZkYXRhKCkgYW5kIGlzYV9nZXRfZHJ2ZGF0YSgpIHRvIGFjY2VzcworCSAqIHRoaXMgZmllbGQuCisJICovCisJdm9pZCAqcHJpdjsKKwkvKiogRHJpdmVyIG5hbWUgKi8KKwljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKK307CisKKy8qCisgKiBBbiBpbmRpdmlkdWFsIElTQSBkZXZpY2UsIGlkZW50aWZpZWQgYnkgcHJvYmUgYWRkcmVzcworICoKKyAqLwordHlwZWRlZiB1aW50MTZfdCBpc2FfcHJvYmVfYWRkcl90OworCisvKiogQW4gSVNBIGRyaXZlciAqLworc3RydWN0IGlzYV9kcml2ZXIgeworCS8qKiBOYW1lICovCisJY29uc3QgY2hhciAqbmFtZTsKKwkvKiogUHJvYmUgYWRkcmVzcyBsaXN0ICovCisJaXNhX3Byb2JlX2FkZHJfdCAqcHJvYmVfYWRkcnM7CisJLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHByb2JlIGFkZHJlc3MgbGlzdCAqLworCXVuc2lnbmVkIGludCBhZGRyX2NvdW50OworCS8qKiBNYW51ZmFjdHVyZXIgSUQgdG8gYmUgYXNzdW1lZCBmb3IgdGhpcyBkZXZpY2UgKi8KKwl1aW50MTZfdCB2ZW5kb3JfaWQ7CisJLyoqIFByb2R1Y3QgSUQgdG8gYmUgYXNzdW1lZCBmb3IgdGhpcyBkZXZpY2UgKi8KKwl1aW50MTZfdCBwcm9kX2lkOworCS8qKgorCSAqIFByb2JlIGRldmljZQorCSAqCisJICogQHYgaXNhCUlTQSBkZXZpY2UKKwkgKiBAdiBpZAlNYXRjaGluZyBlbnRyeSBpbiBJRCB0YWJsZQorCSAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBwcm9iZSApICggc3RydWN0IGlzYV9kZXZpY2UgKmlzYSApOworCS8qKgorCSAqIFJlbW92ZSBkZXZpY2UKKwkgKgorCSAqIEB2IGlzYQlJU0EgZGV2aWNlCisJICovCisJdm9pZCAoICogcmVtb3ZlICkgKCBzdHJ1Y3QgaXNhX2RldmljZSAqaXNhICk7Cit9OworCisvKiogSVNBIGRyaXZlciB0YWJsZSAqLworI2RlZmluZSBJU0FfRFJJVkVSUyBfX3RhYmxlICggc3RydWN0IGlzYV9kcml2ZXIsICJpc2FfZHJpdmVycyIgKQorCisvKiogRGVjbGFyZSBhbiBJU0EgZHJpdmVyICovCisjZGVmaW5lIF9faXNhX2RyaXZlciBfX3RhYmxlX2VudHJ5ICggSVNBX0RSSVZFUlMsIDAxICkKKworLyoqCisgKiBTZXQgSVNBIGRyaXZlci1wcml2YXRlIGRhdGEKKyAqCisgKiBAdiBpc2EJCUlTQSBkZXZpY2UKKyAqIEB2IHByaXYJCVByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXNhX3NldF9kcnZkYXRhICggc3RydWN0IGlzYV9kZXZpY2UgKmlzYSwgdm9pZCAqcHJpdiApIHsKKwlpc2EtPnByaXYgPSBwcml2OworfQorCisvKioKKyAqIEdldCBJU0EgZHJpdmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IGlzYQkJSVNBIGRldmljZQorICogQHJldCBwcml2CQlQcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGlubGluZSB2b2lkICogaXNhX2dldF9kcnZkYXRhICggc3RydWN0IGlzYV9kZXZpY2UgKmlzYSApIHsKKwlyZXR1cm4gaXNhLT5wcml2OworfQorCisvKgorICogSVNBX1JPTSBpcyBwYXJzZWQgYnkgcGFyc2Vyb20ucGwgdG8gZ2VuZXJhdGUgTWFrZWZpbGUgcnVsZXMgYW5kCisgKiBmaWxlcyBmb3Igcm9tLW8tbWF0aWMuCisgKgorICovCisjZGVmaW5lIElTQV9ST00oIElNQUdFLCBERVNDUklQVElPTiApCisKKyNlbmRpZiAvKiBJU0FfSCAqLworCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaXNhX2lkcy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lzYV9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmFmMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lzYV9pZHMuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIElTQV9JRFNfSAorI2RlZmluZSBJU0FfSURTX0gKKworLyogCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBJRHMgYXMgdXNlZCBieSBJU0FQblAgYW5kIEVJU0EgZGV2aWNlcy4gIFRoZXNlCisgKiBJRHMgaGF2ZSB0aGUgZm9ybWF0OgorICoKKyAqIHZlbmRvciAgYnl0ZSAwIGJpdCAgNyAgICBtdXN0IGJlIHplcm8KKyAqCQkgIGJpdHMgNi0yICBmaXJzdCB2ZW5kb3IgY2hhciBpbiBjb21wcmVzc2VkIEFTQ0lJCisgKgkJICBiaXRzIDEtMCAgc2Vjb25kIHZlbmRvciBjaGFyIGluIGNvbXByZXNzZWQgQVNDSUkgKGJpdHMgNC0zKQorICoJICAgYnl0ZSAxIGJpdHMgNy01ICBzZWNvbmQgdmVuZG9yIGNoYXIgaW4gY29tcHJlc3NlZCBBU0NJSSAoYml0cyAyLTApCisgKiAgICAgICAgICAgICAgICBiaXRzIDQtMCAgdGhpcmQgdmVuZG9yIGNoYXIgaW4gY29tcHJlc3NlZCBBU0NJSQorICogcHJvZHVjdCBieXRlIDAgYml0cyA3LTQgIGZpcnN0IGhleCBkaWdpdCBvZiBwcm9kdWN0IG51bWJlcgorICoJCSAgYml0cyAzLTAgIHNlY29uZCBoZXggZGlnaXQgb2YgcHJvZHVjdCBudW1iZXIKKyAqCSAgIGJ5dGUgMSBiaXRzIDctNCAgdGhpcmQgaGV4IGRpZ2l0IG9mIHByb2R1Y3QgbnVtYmVyCisgKgkJICBiaXRzIDMtMCAgaGV4IGRpZ2l0IG9mIHJldmlzaW9uIGxldmVsCisgKgorICogSVNBIElEcyBhcmUgYWx3YXlzIGV4cHJlc3NlZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLCBldmVuIHRob3VnaAorICogdGhlIHVuZGVybHlpbmcgIm1lYW5pbmciIGlzIGJpZy1lbmRpYW4uCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKworLyoKKyAqIENvbnN0cnVjdCBhIHZlbmRvciBJRCBmcm9tIHRocmVlIEFTQ0lJIGNoYXJhY3RlcnMKKyAqCisgKi8KKyNkZWZpbmUgSVNBX1ZFTkRPUiggYSwgYiwgYyApCQkJCQlcCisJYnN3YXBfMTYgKCAoICggKCAoYSkgLSAnQScgKyAxICkgJiAweDFmICkgPDwgMTAgKSB8CVwKKwkJICAgKCAoICggKGIpIC0gJ0EnICsgMSApICYgMHgxZiApIDw8IDUgKSB8CVwKKwkJICAgKCAoICggKGMpIC0gJ0EnICsgMSApICYgMHgxZiApIDw8IDAgKSApCisKKyNkZWZpbmUgSVNBUE5QX1ZFTkRPUiggYSwgYiwgYyApCUlTQV9WRU5ET1IgKCBhLCBiLCBjICkKKyNkZWZpbmUgRUlTQV9WRU5ET1IoIGEsIGIsIGMgKQkJSVNBX1ZFTkRPUiAoIGEsIGIsIGMgKQorCisjZGVmaW5lCUdFTkVSSUNfSVNBUE5QX1ZFTkRPUgkJSVNBUE5QX1ZFTkRPUiAoICdQJywnTicsJ1AnICkKKworLyoKKyAqIEV4dHJhY3QgcHJvZHVjdCBJRCBhbmQgcmV2aXNpb24gZnJvbSBjb21iaW5lZCBwcm9kdWN0IGZpZWxkCisgKgorICovCisjZGVmaW5lIElTQV9QUk9EX0lEX01BU0sJKCAweGYwZmYgKQorI2RlZmluZSBJU0FfUFJPRF9JRChwcm9kdWN0KQkoIChwcm9kdWN0KSAmIElTQV9QUk9EX0lEX01BU0sgKQorI2RlZmluZSBJU0FfUFJPRF9SRVYocHJvZHVjdCkJKCAoIChwcm9kdWN0KSAmIH5JU0FfUFJPRF9JRF9NQVNLICkgPj4gOCApCisKKy8qIEZ1bmN0aW9ucyBpbiBpc2FfaWRzLmMgKi8KK2V4dGVybiBjaGFyICogaXNhX2lkX3N0cmluZyAoIHVuc2lnbmVkIGludCB2ZW5kb3IsIHVuc2lnbmVkIGludCBwcm9kdWN0ICk7CisKKyNlbmRpZiAvKiBJU0FfSURTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pc2FwbnAuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9pc2FwbnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThhODdlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lzYXBucC5oCkBAIC0wLDAgKzEsMjc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgaXNhcG5wLmggLS0gRXRoZXJib290IGlzYXBucCBzdXBwb3J0IGZvciB0aGUgM0NvbSAzYzUxNQorKiAgICBXcml0dGVuIDIwMDItMjAwMyBieSBUaW1vdGh5IExlZ2dlIDx0bGVnZ2VAcm9nZXJzLmNvbT4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqICAgIFBvcnRpb25zIG9mIHRoaXMgY29kZToKKyoJCUNvcHlyaWdodCAoQykgMjAwMSAgUC5KLkguRm94IChmb3hAcm9lc3RvY2suZGVtb24uY28udWspCisqCisqCisqCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyogICAgICAgIFZlcnNpb24gMC4xIEFwcmlsIDI2LCAyMDAyIAlUSkwKKyoJIFZlcnNpb24gMC4yIDAxLzA4LzIwMDMJCQlUSkwgUmVuYW1lZCBmcm9tIDNjNTE1X2lzYXBucC5oCisqCisqCisqICAgIEdlbmVyYWxpc2VkIGludG8gYW4gSVNBUG5QIGJ1cyB0aGF0IGNhbiBiZSB1c2VkIGJ5IG1vcmUgdGhhbiBqdXN0CisqICAgIHRoZSAzYzUxNSBieSBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaWZuZGVmIElTQVBOUF9ICisjZGVmaW5lIElTQVBOUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL2lzYV9pZHMuaD4KKyNpbmNsdWRlIDxncHhlL2RldmljZS5oPgorI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisKKy8qCisgKiBJU0FQblAgY29uc3RhbnRzCisgKgorICovCisKKy8qIFBvcnQgYWRkcmVzc2VzICovCisjZGVmaW5lIElTQVBOUF9BRERSRVNTCQkweDI3OQorI2RlZmluZSBJU0FQTlBfV1JJVEVfREFUQQkweGE3OQorI2RlZmluZSBJU0FQTlBfUkVBRF9QT1JUX01JTgkweDIwMworI2RlZmluZSBJU0FQTlBfUkVBRF9QT1JUX1NUQVJUCTB4MjEzCS8qIElTQVBuUCBzcGVjIHNheXMgMHgyMDMsIGJ1dAorCQkJCQkgKiBMaW51eCBJU0FQblAgc3RhcnRzIGF0CisJCQkJCSAqIDB4MjEzIHdpdGggbm8gZXhwbGFuYXRvcnkKKwkJCQkJICogY29tbWVudC4gIDB4MjAzIHByb2JhYmx5CisJCQkJCSAqIGNsYXNoZXMgd2l0aCBzb21ldGhpbmcuICovCisjZGVmaW5lIElTQVBOUF9SRUFEX1BPUlRfTUFYCTB4M2ZmCisjZGVmaW5lIElTQVBOUF9SRUFEX1BPUlRfU1RFUAkweDEwCS8qIENhbiBiZSBhbnkgbXVsdGlwbGUgb2YgNAorCQkJCQkgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWMsIGJ1dAorCQkJCQkgKiBzaW5jZSBJU0EgSS9PIGFkZHJlc3NlcyBhcmUKKwkJCQkJICogYWxsb2NhdGVkIGluIGJsb2NrcyBvZiAxNiwKKwkJCQkJICogaXQgbWFrZXMgbm8gc2Vuc2UgdG8gdXNlCisJCQkJCSAqIGFueSB2YWx1ZSBsZXNzIHRoYW4gMTYuCisJCQkJCSAqLworCisvKiBDYXJkIHNlbGVjdCBudW1iZXJzICovCisjZGVmaW5lIElTQVBOUF9DU05fTUlOCQkweDAxCisjZGVmaW5lIElTQVBOUF9DU05fTUFYCQkweDBmCisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBJU0FQTlBfUkVBRFBPUlQJCQkweDAwCisjZGVmaW5lIElTQVBOUF9TRVJJQUxJU09MQVRJT04gCQkweDAxCisjZGVmaW5lIElTQVBOUF9DT05GSUdDT05UUk9MCQkweDAyCisjZGVmaW5lIElTQVBOUF9XQUtFCQkJMHgwMworI2RlZmluZSBJU0FQTlBfUkVTT1VSQ0VEQVRBCQkweDA0CisjZGVmaW5lIElTQVBOUF9TVEFUVVMgICAgICAgICAgCQkweDA1CisjZGVmaW5lIElTQVBOUF9DQVJEU0VMRUNUTlVNQkVSCQkweDA2CisjZGVmaW5lIElTQVBOUF9MT0dJQ0FMREVWSUNFTlVNQkVSCTB4MDcKKyNkZWZpbmUgSVNBUE5QX0FDVElWQVRFCQkJMHgzMAorI2RlZmluZSBJU0FQTlBfSU9SQU5HRUNIRUNLCQkweDMxCisjZGVmaW5lIElTQVBOUF9JT0JBU0UobikJCSggMHg2MCArICggKG4pICogMiApICkKKyNkZWZpbmUgSVNBUE5QX0lSUU5PKG4pCQkJKCAweDcwICsgKCAobikgKiAyICkgKQorI2RlZmluZSBJU0FQTlBfSVJRVFlQRShuKQkJKCAweDcxICsgKCAobikgKiAyICkgKQorCisvKiBCaXRzIGluIHRoZSBDT05GSUdDT05UUk9MIHJlZ2lzdGVyICovCisjZGVmaW5lIElTQVBOUF9DT05GSUdfUkVTRVQJCSggMSA8PCAwICkKKyNkZWZpbmUgSVNBUE5QX0NPTkZJR19XQUlUX0ZPUl9LRVkJKCAxIDw8IDEgKQorI2RlZmluZSBJU0FQTlBfQ09ORklHX1JFU0VUX0NTTgkJKCAxIDw8IDIgKQorI2RlZmluZSBJU0FQTlBfQ09ORklHX1JFU0VUX0RSVgkJKCBJU0FQTlBfQ09ORklHX1JFU0VUIHwgCVwKKwkJCQkJICBJU0FQTlBfQ09ORklHX1dBSVRfRk9SX0tFWSB8CVwKKwkJCQkJICBJU0FQTlBfQ09ORklHX1JFU0VUX0NTTiApCisKKy8qIFRoZSBMRlNSIHVzZWQgZm9yIHRoZSBpbml0aWF0aW9uIGtleSBhbmQgZm9yIGNoZWNrc3VtbWluZyAqLworI2RlZmluZSBJU0FQTlBfTEZTUl9TRUVECQkweDZhCisKKy8qIFNtYWxsIHRhZ3MgKi8KKyNkZWZpbmUgSVNBUE5QX0lTX1NNQUxMX1RBRyh0YWcpCSggISAoICh0YWcpICYgMHg4MCApICkKKyNkZWZpbmUgSVNBUE5QX1NNQUxMX1RBR19OQU1FKHRhZykJKCAoICh0YWcpID4+IDMgKSAmIDB4ZiApCisjZGVmaW5lIElTQVBOUF9TTUFMTF9UQUdfTEVOKHRhZykJKCAoICh0YWcpICYgMHg3ICkgKQorI2RlZmluZSBJU0FQTlBfVEFHX1BOUFZFUk5PCQkweDAxCisjZGVmaW5lIElTQVBOUF9UQUdfTE9HREVWSUQJCTB4MDIKKyNkZWZpbmUgSVNBUE5QX1RBR19DT01QQVRERVZJRAkJMHgwMworI2RlZmluZSBJU0FQTlBfVEFHX0lSUQkJCTB4MDQKKyNkZWZpbmUgSVNBUE5QX1RBR19ETUEJCQkweDA1CisjZGVmaW5lIElTQVBOUF9UQUdfU1RBUlRERVAJCTB4MDYKKyNkZWZpbmUgSVNBUE5QX1RBR19FTkRERVAJCTB4MDcKKyNkZWZpbmUgSVNBUE5QX1RBR19JT1BPUlQJCTB4MDgKKyNkZWZpbmUgSVNBUE5QX1RBR19GSVhFRElPCQkweDA5CisjZGVmaW5lIElTQVBOUF9UQUdfUlNWRFNIT1JUQQkJMHgwQQorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRTSE9SVEIJCTB4MEIKKyNkZWZpbmUgSVNBUE5QX1RBR19SU1ZEU0hPUlRDCQkweDBDCisjZGVmaW5lIElTQVBOUF9UQUdfUlNWRFNIT1JURAkJMHgwRAorI2RlZmluZSBJU0FQTlBfVEFHX1ZFTkRPUlNIT1JUCQkweDBFCisjZGVmaW5lIElTQVBOUF9UQUdfRU5ECQkJMHgwRgorLyogTGFyZ2UgdGFncyAqLworI2RlZmluZSBJU0FQTlBfSVNfTEFSR0VfVEFHKHRhZykJKCAoICh0YWcpICYgMHg4MCApICkKKyNkZWZpbmUgSVNBUE5QX0xBUkdFX1RBR19OQU1FKHRhZykJKHRhZykKKyNkZWZpbmUgSVNBUE5QX1RBR19NRU1SQU5HRQkJMHg4MQorI2RlZmluZSBJU0FQTlBfVEFHX0FOU0lTVFIJCTB4ODIKKyNkZWZpbmUgSVNBUE5QX1RBR19VTklDT0RFU1RSCQkweDgzCisjZGVmaW5lIElTQVBOUF9UQUdfVkVORE9STE9ORwkJMHg4NAorI2RlZmluZSBJU0FQTlBfVEFHX01FTTMyUkFOR0UJCTB4ODUKKyNkZWZpbmUgSVNBUE5QX1RBR19GSVhFRE1FTTMyUkFOR0UJMHg4NgorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HMAkJMHhGMAorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HMQkJMHhGMQorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HMgkJMHhGMgorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HMwkJMHhGMworI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HNAkJMHhGNAorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HNQkJMHhGNQorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HNgkJMHhGNgorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HNwkJMHhGNworI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HOAkJMHhGOAorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HOQkJMHhGOQorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HQQkJMHhGQQorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HQgkJMHhGQgorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HQwkJMHhGQworI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HRAkJMHhGRAorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HRQkJMHhGRQorI2RlZmluZSBJU0FQTlBfVEFHX1JTVkRMT05HRgkJMHhGRgorI2RlZmluZSBJU0FQTlBfVEFHX1BTRVVET19ORVdCT0FSRAkweDEwMAorCisvKiogQW4gSVNBUG5QIHNlcmlhbCBpZGVudGlmaWVyICovCitzdHJ1Y3QgaXNhcG5wX2lkZW50aWZpZXIgeworCS8qKiBWZW5kb3IgSUQgKi8KKwl1aW50MTZfdCB2ZW5kb3JfaWQ7CisJLyoqIFByb2R1Y3QgSUQgKi8KKwl1aW50MTZfdCBwcm9kX2lkOworCS8qKiBTZXJpYWwgbnVtYmVyICovCisJdWludDMyX3Qgc2VyaWFsOworCS8qKiBDaGVja3N1bSAqLworCXVpbnQ4X3QgY2hlY2tzdW07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQW4gSVNBUG5QIGxvZ2ljYWwgZGV2aWNlIElEIHN0cnVjdHVyZSAqLworc3RydWN0IGlzYXBucF9sb2dkZXZpZCB7CisJLyoqIFZlbmRvciBJRCAqLworCXVpbnQxNl90IHZlbmRvcl9pZDsKKwkvKiogUHJvZHVjdCBJRCAqLworCXVpbnQxNl90IHByb2RfaWQ7CisJLyoqIEZsYWdzICovCisJdWludDE2X3QgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQW4gSVNBUG5QIGRldmljZSBJRCBsaXN0IGVudHJ5ICovCitzdHJ1Y3QgaXNhcG5wX2RldmljZV9pZCB7CisJLyoqIE5hbWUgKi8KKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKwkvKiogVmVuZG9yIElEICovCisJdWludDE2X3QgdmVuZG9yX2lkOworCS8qKiBQcm9kdWN0IElEICovCisJdWludDE2X3QgcHJvZF9pZDsKK307CisKKy8qKiBBbiBJU0FQblAgZGV2aWNlICovCitzdHJ1Y3QgaXNhcG5wX2RldmljZSB7CisJLyoqIEdlbmVyaWMgZGV2aWNlICovCisJc3RydWN0IGRldmljZSBkZXY7CisJLyoqIFZlbmRvciBJRCAqLworCXVpbnQxNl90IHZlbmRvcl9pZDsKKwkvKiogUHJvZHVjdCBJRCAqLworCXVpbnQxNl90IHByb2RfaWQ7CisJLyoqIEkvTyBhZGRyZXNzICovCisJdWludDE2X3QgaW9hZGRyOworCS8qKiBJbnRlcnJ1cHQgbnVtYmVyICovCisJdWludDhfdCBpcnFubzsKKwkvKiogQ2FyZCBTZWxlY3QgTnVtYmVyICovCisJdWludDhfdCBjc247CisJLyoqIExvZ2ljYWwgRGV2aWNlIElEICovCisJdWludDhfdCBsb2dkZXY7CisJLyoqIERyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3QgaXNhcG5wX2RyaXZlciAqZHJpdmVyOworCS8qKiBEcml2ZXItcHJpdmF0ZSBkYXRhCisJICoKKwkgKiBVc2UgaXNhcG5wX3NldF9kcnZkYXRhKCkgYW5kIGlzYXBucF9nZXRfZHJ2ZGF0YSgpIHRvIGFjY2VzcworCSAqIHRoaXMgZmllbGQuCisJICovCisJdm9pZCAqcHJpdjsKKwkvKiogRHJpdmVyIG5hbWUgKi8KKwljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKK307CisKKy8qKiBBbiBJU0FQblAgZHJpdmVyICovCitzdHJ1Y3QgaXNhcG5wX2RyaXZlciB7CisJLyoqIElTQVBuUCBJRCB0YWJsZSAqLworCXN0cnVjdCBpc2FwbnBfZGV2aWNlX2lkICppZHM7CisJLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIElTQVBuUCBJRCB0YWJsZSAqLworCXVuc2lnbmVkIGludCBpZF9jb3VudDsKKwkvKioKKwkgKiBQcm9iZSBkZXZpY2UKKwkgKgorCSAqIEB2IGlzYXBucAlJU0FQblAgZGV2aWNlCisJICogQHYgaWQJTWF0Y2hpbmcgZW50cnkgaW4gSUQgdGFibGUKKwkgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorCSAqLworCWludCAoICogcHJvYmUgKSAoIHN0cnVjdCBpc2FwbnBfZGV2aWNlICppc2FwbnAsCisJCQkgIGNvbnN0IHN0cnVjdCBpc2FwbnBfZGV2aWNlX2lkICppZCApOworCS8qKgorCSAqIFJlbW92ZSBkZXZpY2UKKwkgKgorCSAqIEB2IGlzYXBucAlJU0FQblAgZGV2aWNlCisJICovCisJdm9pZCAoICogcmVtb3ZlICkgKCBzdHJ1Y3QgaXNhcG5wX2RldmljZSAqaXNhcG5wICk7Cit9OworCisvKiogSVNBUG5QIGRyaXZlciB0YWJsZSAqLworI2RlZmluZSBJU0FQTlBfRFJJVkVSUyBfX3RhYmxlICggc3RydWN0IGlzYXBucF9kcml2ZXIsICJpc2FwbnBfZHJpdmVycyIgKQorCisvKiogRGVjbGFyZSBhbiBJU0FQblAgZHJpdmVyICovCisjZGVmaW5lIF9faXNhcG5wX2RyaXZlciBfX3RhYmxlX2VudHJ5ICggSVNBUE5QX0RSSVZFUlMsIDAxICkKKworZXh0ZXJuIHVpbnQxNl90IGlzYXBucF9yZWFkX3BvcnQ7CisKK2V4dGVybiB2b2lkIGlzYXBucF9kZXZpY2VfYWN0aXZhdGlvbiAoIHN0cnVjdCBpc2FwbnBfZGV2aWNlICppc2FwbnAsCisJCQkJICAgICAgIGludCBhY3RpdmF0aW9uICk7CisKKy8qKgorICogQWN0aXZhdGUgSVNBUG5QIGRldmljZQorICoKKyAqIEB2IGlzYXBucAkJSVNBUG5QIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfaXNhcG5wX2RldmljZSAoIHN0cnVjdCBpc2FwbnBfZGV2aWNlICppc2FwbnAgKSB7CisJaXNhcG5wX2RldmljZV9hY3RpdmF0aW9uICggaXNhcG5wLCAxICk7Cit9CisKKy8qKgorICogRGVhY3RpdmF0ZSBJU0FQblAgZGV2aWNlCisgKgorICogQHYgaXNhcG5wCQlJU0FQblAgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWFjdGl2YXRlX2lzYXBucF9kZXZpY2UgKCBzdHJ1Y3QgaXNhcG5wX2RldmljZSAqaXNhcG5wICkgeworCWlzYXBucF9kZXZpY2VfYWN0aXZhdGlvbiAoIGlzYXBucCwgMCApOworfQorCisvKioKKyAqIFNldCBJU0FQblAgZHJpdmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IGlzYXBucAkJSVNBUG5QIGRldmljZQorICogQHYgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2FwbnBfc2V0X2RydmRhdGEgKCBzdHJ1Y3QgaXNhcG5wX2RldmljZSAqaXNhcG5wLAorCQkJCQl2b2lkICpwcml2ICkgeworCWlzYXBucC0+cHJpdiA9IHByaXY7Cit9CisKKy8qKgorICogR2V0IElTQVBuUCBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgaXNhcG5wCQlJU0FQblAgZGV2aWNlCisgKiBAcmV0IHByaXYJCVByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKiBpc2FwbnBfZ2V0X2RydmRhdGEgKCBzdHJ1Y3QgaXNhcG5wX2RldmljZSAqaXNhcG5wICkgeworCXJldHVybiBpc2FwbnAtPnByaXY7Cit9CisKKyNlbmRpZiAvKiBJU0FQTlBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lzY3NpLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvaXNjc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDcxN2QyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2lzY3NpLmgKQEAgLTAsMCArMSw2NzggQEAKKyNpZm5kZWYgX0dQWEVfSVNDU0lfSAorI2RlZmluZSBfR1BYRV9JU0NTSV9ICisKKy8qKiBAZmlsZQorICoKKyAqIGlTQ1NJIHByb3RvY29sCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvc29ja2V0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9zY3NpLmg+CisjaW5jbHVkZSA8Z3B4ZS9jaGFwLmg+CisjaW5jbHVkZSA8Z3B4ZS9yZWZjbnQuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKworLyoqIERlZmF1bHQgaVNDU0kgcG9ydCAqLworI2RlZmluZSBJU0NTSV9QT1JUIDMyNjAKKworLyoqCisgKiBpU0NTSSBzZWdtZW50IGxlbmd0aHMKKyAqCisgKiBpU0NTSSB1c2VzIGFuIGlja3kgc3RydWN0dXJlIHdpdGggb25lIG9uZS1ieXRlIGZpZWxkIChhIGR3b3JkCisgKiBjb3VudCkgYW5kIG9uZSB0aHJlZS1ieXRlIGZpZWxkIChhIGJ5dGUgY291bnQpLiAgVGhpcyBzdHJ1Y3R1cmUsCisgKiBhbmQgdGhlIGFjY29tcGFueWluZyBtYWNyb3MsIHJlbGlldmUgc29tZSBvZiB0aGUgcGFpbi4KKyAqLwordW5pb24gaXNjc2lfc2VnbWVudF9sZW5ndGhzIHsKKwlzdHJ1Y3QgeworCQkvKiogVGhlIEFIUyBsZW5ndGggKG1lYXN1cmVkIGluIGR3b3JkcykgKi8KKwkJdWludDhfdCBhaHNfbGVuOworCQkvKiogVGhlIGRhdGEgbGVuZ3RoIChtZWFzdXJlZCBpbiBieXRlcyksIGluIG5ldHdvcmsKKwkJICogYnl0ZSBvcmRlcgorCQkgKi8KKwkJdWludDhfdCBkYXRhX2xlblszXTsKKwl9IGJ5dGVzOworCS8qKiBUaHMgZGF0YSBsZW5ndGggKG1lYXN1cmVkIGluIGJ5dGVzKSwgaW4gbmV0d29yayBieXRlCisJICogb3JkZXIsIHdpdGggYWhzX2xlbiBhcyB0aGUgZmlyc3QgYnl0ZS4KKwkgKi8KKwl1aW50MzJfdCBhaHNfYW5kX2RhdGFfbGVuOworfTsKKworLyoqIFRoZSBsZW5ndGggb2YgdGhlIGFkZGl0aW9uYWwgaGVhZGVyIHNlZ21lbnQsIGluIGR3b3JkcyAqLworI2RlZmluZSBJU0NTSV9BSFNfTEVOKCBzZWdtZW50X2xlbmd0aHMgKSBcCisJKCAoc2VnbWVudF9sZW5ndGhzKS5ieXRlcy5haHNfbGVuICkKKworLyoqIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgc2VnbWVudCwgaW4gYnl0ZXMsIGV4Y2x1ZGluZyBhbnkgcGFkZGluZyAqLworI2RlZmluZSBJU0NTSV9EQVRBX0xFTiggc2VnbWVudF9sZW5ndGhzICkgXAorCSggbnRvaGwgKCAoc2VnbWVudF9sZW5ndGhzKS5haHNfYW5kX2RhdGFfbGVuICkgJiAweGZmZmZmZiApCisKKy8qKiBUaGUgcGFkZGluZyBvZiB0aGUgZGF0YSBzZWdtZW50LCBpbiBieXRlcyAqLworI2RlZmluZSBJU0NTSV9EQVRBX1BBRF9MRU4oIHNlZ21lbnRfbGVuZ3RocyApIFwKKwkoICggMCAtIChzZWdtZW50X2xlbmd0aHMpLmJ5dGVzLmRhdGFfbGVuWzJdICkgJiAweDAzICkKKworLyoqIFNldCBhZGRpdGlvbmFsIGhlYWRlciBhbmQgZGF0YSBzZWdtZW50IGxlbmd0aHMgKi8KKyNkZWZpbmUgSVNDU0lfU0VUX0xFTkdUSFMoIHNlZ21lbnRfbGVuZ3RocywgYWhzX2xlbiwgZGF0YV9sZW4gKSBkbyB7CVwKKwkoc2VnbWVudF9sZW5ndGhzKS5haHNfYW5kX2RhdGFfbGVuID0JCQkJXAorCQlodG9ubCAoIGRhdGFfbGVuIHwgKCBhaHNfbGVuIDw8IDI0ICkgKTsJCQlcCisJfSB3aGlsZSAoIDAgKQorCisvKioKKyAqIGlTQ1NJIGJhc2ljIGhlYWRlciBzZWdtZW50IGNvbW1vbiBmaWVsZHMKKyAqCisgKi8KK3N0cnVjdCBpc2NzaV9iaHNfY29tbW9uIHsKKwkvKiogT3Bjb2RlICovCisJdWludDhfdCBvcGNvZGU7CisJLyoqIEZsYWdzICovCisJdWludDhfdCBmbGFnczsKKwkvKiogRmllbGRzIHNwZWNpZmljIHRvIHRoZSBQRFUgdHlwZSAqLworCXVpbnQ4X3Qgb3RoZXJfYVsyXTsKKwkvKiogU2VnbWVudCBsZW5ndGhzICovCisJdW5pb24gaXNjc2lfc2VnbWVudF9sZW5ndGhzIGxlbmd0aHM7CisJLyoqIEZpZWxkcyBzcGVjaWZpYyB0byB0aGUgUERVIHR5cGUgKi8KKwl1aW50OF90IG90aGVyX2JbOF07CisJLyoqIEluaXRpYXRvciBUYXNrIFRhZyAqLworCXVpbnQzMl90IGl0dDsKKwkvKiogRmllbGRzIHNwZWNpZmljIHRvIHRoZSBQRFUgdHlwZSAqLworCXVpbnQ4X3Qgb3RoZXJfY1syOF07Cit9OworCisvKiogT3Bjb2RlIG1hc2sgKi8KKyNkZWZpbmUgSVNDU0lfT1BDT0RFX01BU0sgMHgzZgorCisvKiogSW1tZWRpYXRlIGRlbGl2ZXJ5ICovCisjZGVmaW5lIElTQ1NJX0ZMQUdfSU1NRURJQVRFIDB4NDAKKworLyoqIEZpbmFsIFBEVSBvZiBhIHNlcXVlbmNlICovCisjZGVmaW5lIElTQ1NJX0ZMQUdfRklOQUwgMHg4MAorCisvKioKKyAqIGlTQ1NJIGJhc2ljIGhlYWRlciBzZWdtZW50IGNvbW1vbiByZXF1ZXN0IGZpZWxkcworICoKKyAqLworc3RydWN0IGlzY3NpX2Joc19jb21tb25fcmVzcG9uc2UgeworCS8qKiBPcGNvZGUgKi8KKwl1aW50OF90IG9wY29kZTsKKwkvKiogRmxhZ3MgKi8KKwl1aW50OF90IGZsYWdzOworCS8qKiBGaWVsZHMgc3BlY2lmaWMgdG8gdGhlIFBEVSB0eXBlICovCisJdWludDhfdCBvdGhlcl9hWzJdOworCS8qKiBTZWdtZW50IGxlbmd0aHMgKi8KKwl1bmlvbiBpc2NzaV9zZWdtZW50X2xlbmd0aHMgbGVuZ3RoczsKKwkvKiogRmllbGRzIHNwZWNpZmljIHRvIHRoZSBQRFUgdHlwZSAqLworCXVpbnQ4X3Qgb3RoZXJfYls4XTsKKwkvKiogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJdWludDMyX3QgaXR0OworCS8qKiBGaWVsZHMgc3BlY2lmaWMgdG8gdGhlIFBEVSB0eXBlICovCisJdWludDhfdCBvdGhlcl9jWzRdOworCS8qKiBTdGF0dXMgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3Qgc3RhdHNuOworCS8qKiBFeHBlY3RlZCBjb21tYW5kIHNlcXVlbmNlIG51bWJlciAqLworCXVpbnQzMl90IGV4cGNtZHNuOworCS8qKiBGaWVsZHMgc3BlY2lmaWMgdG8gdGhlIFBEVSB0eXBlICovCisJdWludDhfdCBvdGhlcl9kWzE2XTsKK307CisKKy8qKgorICogaVNDU0kgbG9naW4gcmVxdWVzdCBiYXNpYyBoZWFkZXIgc2VnbWVudAorICoKKyAqLworc3RydWN0IGlzY3NpX2Joc19sb2dpbl9yZXF1ZXN0IHsKKwkvKiogT3Bjb2RlICovCisJdWludDhfdCBvcGNvZGU7CisJLyoqIEZsYWdzICovCisJdWludDhfdCBmbGFnczsKKwkvKiogTWF4aW11bSBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgKi8KKwl1aW50OF90IHZlcnNpb25fbWF4OworCS8qKiBNaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uIG51bWJlciAqLworCXVpbnQ4X3QgdmVyc2lvbl9taW47CisJLyoqIFNlZ21lbnQgbGVuZ3RocyAqLworCXVuaW9uIGlzY3NpX3NlZ21lbnRfbGVuZ3RocyBsZW5ndGhzOworCS8qKiBJbml0aWF0b3Igc2Vzc2lvbiBJRCAoSUFOQSBmb3JtYXQpIGVudGVycHJpc2UgbnVtYmVyIGFuZCBmbGFncyAqLworCXVpbnQzMl90IGlzaWRfaWFuYV9lbjsKKwkvKiogSW5pdGlhdG9yIHNlc3Npb24gSUQgKElBTkEgZm9ybWF0KSBxdWFsaWZpZXIgKi8KKwl1aW50MTZfdCBpc2lkX2lhbmFfcXVhbDsKKwkvKiogVGFyZ2V0IHNlc3Npb24gaWRlbnRpZnlpbmcgaGFuZGxlICovCisJdWludDE2X3QgdHNpaDsKKwkvKiogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJdWludDMyX3QgaXR0OworCS8qKiBDb25uZWN0aW9uIElEICovCisJdWludDE2X3QgY2lkOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQxNl90IHJlc2VydmVkX2E7CisJLyoqIENvbW1hbmQgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3QgY21kc247CisJLyoqIEV4cGVjdGVkIHN0YXR1cyBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCBleHBzdGF0c247CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZF9iWzE2XTsKK307CisKKy8qKiBMb2dpbiByZXF1ZXN0IG9wY29kZSAqLworI2RlZmluZSBJU0NTSV9PUENPREVfTE9HSU5fUkVRVUVTVCAweDAzCisKKy8qKiBXaWxsaW5nbmVzcyB0byB0cmFuc2l0aW9uIHRvIG5leHQgc3RhZ2UgKi8KKyNkZWZpbmUgSVNDU0lfTE9HSU5fRkxBR19UUkFOU0lUSU9OIDB4ODAKKworLyoqIEtleT12YWx1ZSBwYWlycyBjb250aW51ZWQgaW4gc3Vic2VxdWVudCByZXF1ZXN0ICovCisjZGVmaW5lIElTQ1NJX0xPR0lOX0ZMQUdfQ09OVElOVUUgMHg0MAorCisvKiBDdXJyZW50IHN0YWdlIHZhbHVlcyBhbmQgbWFzayAqLworI2RlZmluZSBJU0NTSV9MT0dJTl9DU0dfTUFTSyAweDBjCisjZGVmaW5lIElTQ1NJX0xPR0lOX0NTR19TRUNVUklUWV9ORUdPVElBVElPTiAweDAwCisjZGVmaW5lIElTQ1NJX0xPR0lOX0NTR19PUEVSQVRJT05BTF9ORUdPVElBVElPTiAweDA0CisjZGVmaW5lIElTQ1NJX0xPR0lOX0NTR19GVUxMX0ZFQVRVUkVfUEhBU0UgMHgwYworCisvKiBOZXh0IHN0YWdlIHZhbHVlcyBhbmQgbWFzayAqLworI2RlZmluZSBJU0NTSV9MT0dJTl9OU0dfTUFTSyAweDAzCisjZGVmaW5lIElTQ1NJX0xPR0lOX05TR19TRUNVUklUWV9ORUdPVElBVElPTiAweDAwCisjZGVmaW5lIElTQ1NJX0xPR0lOX05TR19PUEVSQVRJT05BTF9ORUdPVElBVElPTiAweDAxCisjZGVmaW5lIElTQ1NJX0xPR0lOX05TR19GVUxMX0ZFQVRVUkVfUEhBU0UgMHgwMworCisvKiogSVNJRCBJQU5BIGZvcm1hdCBtYXJrZXIgKi8KKyNkZWZpbmUgSVNDU0lfSVNJRF9JQU5BIDB4NDAwMDAwMDAKKworLyoqIEZlbiBTeXN0ZW1zIEx0ZC4gSUFOQSBlbnRlcnByaXNlIG51bWJlcgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIEZlbiBTeXN0ZW1zIEx0ZC4ncyBJQU5BCisgKiBlbnRlcnByaXNlIG51bWJlciB3aXRoIHRoaXMgaVNDU0kgaW1wbGVtZW50YXRpb24uCisgKi8KKyNkZWZpbmUgSUFOQV9FTl9GRU5fU1lTVEVNUyAxMDAxOQorCisvKioKKyAqIGlTQ1NJIGxvZ2luIHJlc3BvbnNlIGJhc2ljIGhlYWRlciBzZWdtZW50CisgKgorICovCitzdHJ1Y3QgaXNjc2lfYmhzX2xvZ2luX3Jlc3BvbnNlIHsKKwkvKiogT3Bjb2RlICovCisJdWludDhfdCBvcGNvZGU7CisJLyoqIEZsYWdzICovCisJdWludDhfdCBmbGFnczsKKwkvKiogTWF4aW11bSBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgKi8KKwl1aW50OF90IHZlcnNpb25fbWF4OworCS8qKiBNaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uIG51bWJlciAqLworCXVpbnQ4X3QgdmVyc2lvbl9taW47CisJLyoqIFNlZ21lbnQgbGVuZ3RocyAqLworCXVuaW9uIGlzY3NpX3NlZ21lbnRfbGVuZ3RocyBsZW5ndGhzOworCS8qKiBJbml0aWF0b3Igc2Vzc2lvbiBJRCAoSUFOQSBmb3JtYXQpIGVudGVycHJpc2UgbnVtYmVyIGFuZCBmbGFncyAqLworCXVpbnQzMl90IGlzaWRfaWFuYV9lbjsKKwkvKiogSW5pdGlhdG9yIHNlc3Npb24gSUQgKElBTkEgZm9ybWF0KSBxdWFsaWZpZXIgKi8KKwl1aW50MTZfdCBpc2lkX2lhbmFfcXVhbDsKKwkvKiogVGFyZ2V0IHNlc3Npb24gaWRlbnRpZnlpbmcgaGFuZGxlICovCisJdWludDE2X3QgdHNpaDsKKwkvKiogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJdWludDMyX3QgaXR0OworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQzMl90IHJlc2VydmVkX2E7CisJLyoqIFN0YXR1cyBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCBzdGF0c247CisJLyoqIEV4cGVjdGVkIGNvbW1hbmQgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3QgZXhwY21kc247CisJLyoqIE1heGltdW0gY29tbWFuZCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCBtYXhjbWRzbjsKKwkvKiogU3RhdHVzIGNsYXNzICovCisJdWludDhfdCBzdGF0dXNfY2xhc3M7CisJLyoqIFN0YXR1cyBkZXRhaWwgKi8KKwl1aW50OF90IHN0YXR1c19kZXRhaWw7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZF9iWzEwXTsKK307CisKKy8qKiBMb2dpbiByZXNwb25zZSBvcGNvZGUgKi8KKyNkZWZpbmUgSVNDU0lfT1BDT0RFX0xPR0lOX1JFU1BPTlNFIDB4MjMKKworLyogTG9naW4gcmVzcG9uc2Ugc3RhdHVzIGNvZGVzICovCisjZGVmaW5lIElTQ1NJX1NUQVRVU19TVUNDRVNTCQkJMHgwMAorI2RlZmluZSBJU0NTSV9TVEFUVVNfUkVESVJFQ1QJCQkweDAxCisjZGVmaW5lIElTQ1NJX1NUQVRVU19JTklUSUFUT1JfRVJST1IJCTB4MDIKKyNkZWZpbmUgSVNDU0lfU1RBVFVTX0lOSVRJQVRPUl9FUlJPUl9BVVRIRU5USUNBVElPTgkweDAxCisjZGVmaW5lIElTQ1NJX1NUQVRVU19JTklUSUFUT1JfRVJST1JfQVVUSE9SSVNBVElPTgkweDAyCisjZGVmaW5lIElTQ1NJX1NUQVRVU19JTklUSUFUT1JfRVJST1JfTk9UX0ZPVU5ECQkweDAzCisjZGVmaW5lIElTQ1NJX1NUQVRVU19JTklUSUFUT1JfRVJST1JfUkVNT1ZFRAkJMHgwNAorI2RlZmluZSBJU0NTSV9TVEFUVVNfVEFSR0VUX0VSUk9SCQkweDAzCisKKy8qKgorICogaVNDU0kgU0NTSSBjb21tYW5kIGJhc2ljIGhlYWRlciBzZWdtZW50CisgKgorICovCitzdHJ1Y3QgaXNjc2lfYmhzX3Njc2lfY29tbWFuZCB7CisJLyoqIE9wY29kZSAqLworCXVpbnQ4X3Qgb3Bjb2RlOworCS8qKiBGbGFncyAqLworCXVpbnQ4X3QgZmxhZ3M7CisJLyoqIFJlc2VydmVkICovCisJdWludDE2X3QgcmVzZXJ2ZWRfYTsKKwkvKiogU2VnbWVudCBsZW5ndGhzICovCisJdW5pb24gaXNjc2lfc2VnbWVudF9sZW5ndGhzIGxlbmd0aHM7CisJLyoqIFNDU0kgTG9naWNhbCBVbml0IE51bWJlciAqLworCXN0cnVjdCBzY3NpX2x1biBsdW47CisJLyoqIEluaXRpYXRvciBUYXNrIFRhZyAqLworCXVpbnQzMl90IGl0dDsKKwkvKiogRXhwZWN0ZWQgZGF0YSB0cmFuc2ZlciBsZW5ndGggKi8KKwl1aW50MzJfdCBleHBfbGVuOworCS8qKiBDb21tYW5kIHNlcXVlbmNlIG51bWJlciAqLworCXVpbnQzMl90IGNtZHNuOworCS8qKiBFeHBlY3RlZCBzdGF0dXMgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3QgZXhwc3RhdHNuOworCS8qKiBTQ1NJIENvbW1hbmQgRGVzY3JpcHRvciBCbG9jayAoQ0RCKSAqLworCXVuaW9uIHNjc2lfY2RiIGNkYjsKK307CisKKy8qKiBTQ1NJIGNvbW1hbmQgb3Bjb2RlICovCisjZGVmaW5lIElTQ1NJX09QQ09ERV9TQ1NJX0NPTU1BTkQgMHgwMQorCisvKiogQ29tbWFuZCB3aWxsIHJlYWQgZGF0YSAqLworI2RlZmluZSBJU0NTSV9DT01NQU5EX0ZMQUdfUkVBRCAweDQwCisKKy8qKiBDb21tYW5kIHdpbGwgd3JpdGUgZGF0YSAqLworI2RlZmluZSBJU0NTSV9DT01NQU5EX0ZMQUdfV1JJVEUgMHgyMAorCisvKiBUYXNrIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgSVNDU0lfQ09NTUFORF9BVFRSX1VOVEFHR0VEIDB4MDAKKyNkZWZpbmUgSVNDU0lfQ09NTUFORF9BVFRSX1NJTVBMRSAweDAxCisjZGVmaW5lIElTQ1NJX0NPTU1BTkRfQVRUUl9PUkRFUkVEIDB4MDIKKyNkZWZpbmUgSVNDU0lfQ09NTUFORF9BVFRSX0hFQURfT0ZfUVVFVUUgMHgwMworI2RlZmluZSBJU0NTSV9DT01NQU5EX0FUVFJfQUNBIDB4MDQKKworLyoqCisgKiBpU0NTSSBTQ1NJIHJlc3BvbnNlIGJhc2ljIGhlYWRlciBzZWdtZW50CisgKgorICovCitzdHJ1Y3QgaXNjc2lfYmhzX3Njc2lfcmVzcG9uc2UgeworCS8qKiBPcGNvZGUgKi8KKwl1aW50OF90IG9wY29kZTsKKwkvKiogRmxhZ3MgKi8KKwl1aW50OF90IGZsYWdzOworCS8qKiBSZXNwb25zZSBjb2RlICovCisJdWludDhfdCByZXNwb25zZTsKKwkvKiogU0NTSSBzdGF0dXMgY29kZSAqLworCXVpbnQ4X3Qgc3RhdHVzOworCS8qKiBTZWdtZW50IGxlbmd0aHMgKi8KKwl1bmlvbiBpc2NzaV9zZWdtZW50X2xlbmd0aHMgbGVuZ3RoczsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkX2FbOF07CisJLyoqIEluaXRpYXRvciBUYXNrIFRhZyAqLworCXVpbnQzMl90IGl0dDsKKwkvKiogU05BQ0sgdGFnICovCisJdWludDMyX3Qgc25hY2s7CisJLyoqIFN0YXR1cyBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCBzdGF0c247CisJLyoqIEV4cGVjdGVkIGNvbW1hbmQgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3QgZXhwY21kc247CisJLyoqIE1heGltdW0gY29tbWFuZCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCBtYXhjbWRzbjsKKwkvKiogRXhwZWN0ZWQgZGF0YSBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCBleHBkYXRhc247CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZF9iWzhdOworfTsKKworLyoqIFNDU0kgcmVzcG9uc2Ugb3Bjb2RlICovCisjZGVmaW5lIElTQ1NJX09QQ09ERV9TQ1NJX1JFU1BPTlNFIDB4MjEKKworLyoqIFNDU0kgY29tbWFuZCBjb21wbGV0ZWQgYXQgdGFyZ2V0ICovCisjZGVmaW5lIElTQ1NJX1JFU1BPTlNFX0NPTU1BTkRfQ09NUExFVEUgMHgwMAorCisvKiogU0NTSSB0YXJnZXQgZmFpbHVyZSAqLworI2RlZmluZSBJU0NTSV9SRVNQT05TRV9UQVJHRVRfRkFJTFVSRSAweDAxCisKKy8qKiBTQ1NJIHNlbnNlIHJlc3BvbnNlIGNvZGUgb2Zmc2V0CisgKgorICogVGhlIFNDU0kgcmVzcG9uc2UgbWF5IGNvbnRhaW4gdW5zb2xpY2l0ZWQgc2Vuc2UgZGF0YSBpbiB0aGUgZGF0YQorICogc2VnbWVudC4gIElmIGl0IGRvZXMsIHRoaXMgaXMgdGhlIG9mZnNldCB0byB0aGUgc2Vuc2UgcmVzcG9uc2UgY29kZQorICogYnl0ZSwgd2hpY2ggaXMgdGhlIG9ubHkgYnl0ZSB3ZSBjYXJlIGFib3V0LgorICovCisjZGVmaW5lIElTQ1NJX1NFTlNFX1JFU1BPTlNFX0NPREVfT0ZGU0VUIDIKKworLyoqCisgKiBpU0NTSSBkYXRhLWluIGJhc2ljIGhlYWRlciBzZWdtZW50CisgKgorICovCitzdHJ1Y3QgaXNjc2lfYmhzX2RhdGFfaW4geworCS8qKiBPcGNvZGUgKi8KKwl1aW50OF90IG9wY29kZTsKKwkvKiogRmxhZ3MgKi8KKwl1aW50OF90IGZsYWdzOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfYTsKKwkvKiogU0NTSSBzdGF0dXMgY29kZSAqLworCXVpbnQ4X3Qgc3RhdHVzOworCS8qKiBTZWdtZW50IGxlbmd0aHMgKi8KKwl1bmlvbiBpc2NzaV9zZWdtZW50X2xlbmd0aHMgbGVuZ3RoczsKKwkvKiogTG9naWNhbCBVbml0IE51bWJlciAqLworCXN0cnVjdCBzY3NpX2x1biBsdW47CisJLyoqIEluaXRpYXRvciBUYXNrIFRhZyAqLworCXVpbnQzMl90IGl0dDsKKwkvKiogVGFyZ2V0IFRyYW5zZmVyIFRhZyAqLworCXVpbnQzMl90IHR0dDsKKwkvKiogU3RhdHVzIHNlcXVlbmNlIG51bWJlciAqLworCXVpbnQzMl90IHN0YXRzbjsKKwkvKiogRXhwZWN0ZWQgY29tbWFuZCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCBleHBjbWRzbjsKKwkvKiogTWF4aW11bSBjb21tYW5kIHNlcXVlbmNlIG51bWJlciAqLworCXVpbnQzMl90IG1heGNtZHNuOworCS8qKiBEYXRhIHNlcXVlbmNlIG51bWJlciAqLworCXVpbnQzMl90IGRhdGFzbjsKKwkvKiogQnVmZmVyIG9mZnNldCAqLworCXVpbnQzMl90IG9mZnNldDsKKwkvKiogUmVzaWR1YWwgY291bnQgKi8KKwl1aW50MzJfdCByZXNpZHVhbF9jb3VudDsKK307CisKKy8qKiBEYXRhLWluIG9wY29kZSAqLworI2RlZmluZSBJU0NTSV9PUENPREVfREFUQV9JTiAweDI1CisKKy8qKiBEYXRhIHJlcXVpcmVzIGFja25vd2xlZGdlbWVudCAqLworI2RlZmluZSBJU0NTSV9EQVRBX0ZMQUdfQUNLTk9XTEVER0UgMHg0MAorCisvKiogRGF0YSBvdmVyZmxvdyBvY2N1cnJlZCAqLworI2RlZmluZSBJU0NTSV9EQVRBX0ZMQUdfT1ZFUkZMT1cgMHgwNAorCisvKiogRGF0YSB1bmRlcmZsb3cgb2NjdXJyZWQgKi8KKyNkZWZpbmUgSVNDU0lfREFUQV9GTEFHX1VOREVSRkxPVyAweDAyCisKKy8qKiBTQ1NJIHN0YXR1cyBjb2RlIGFuZCBvdmVyZmxvdy91bmRlcmZsb3cgZmxhZ3MgYXJlIHZhbGlkICovCisjZGVmaW5lIElTQ1NJX0RBVEFfRkxBR19TVEFUVVMgMHgwMQorCisvKioKKyAqIGlTQ1NJIGRhdGEtb3V0IGJhc2ljIGhlYWRlciBzZWdtZW50CisgKgorICovCitzdHJ1Y3QgaXNjc2lfYmhzX2RhdGFfb3V0IHsKKwkvKiogT3Bjb2RlICovCisJdWludDhfdCBvcGNvZGU7CisJLyoqIEZsYWdzICovCisJdWludDhfdCBmbGFnczsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50MTZfdCByZXNlcnZlZF9hOworCS8qKiBTZWdtZW50IGxlbmd0aHMgKi8KKwl1bmlvbiBpc2NzaV9zZWdtZW50X2xlbmd0aHMgbGVuZ3RoczsKKwkvKiogTG9naWNhbCBVbml0IE51bWJlciAqLworCXN0cnVjdCBzY3NpX2x1biBsdW47CisJLyoqIEluaXRpYXRvciBUYXNrIFRhZyAqLworCXVpbnQzMl90IGl0dDsKKwkvKiogVGFyZ2V0IFRyYW5zZmVyIFRhZyAqLworCXVpbnQzMl90IHR0dDsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50MzJfdCByZXNlcnZlZF9iOworCS8qKiBFeHBlY3RlZCBzdGF0dXMgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3QgZXhwc3RhdHNuOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQzMl90IHJlc2VydmVkX2M7CisJLyoqIERhdGEgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3QgZGF0YXNuOworCS8qKiBCdWZmZXIgb2Zmc2V0ICovCisJdWludDMyX3Qgb2Zmc2V0OworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQzMl90IHJlc2VydmVkX2Q7Cit9OworCisvKiogRGF0YS1vdXQgb3Bjb2RlICovCisjZGVmaW5lIElTQ1NJX09QQ09ERV9EQVRBX09VVCAweDA1CisKKy8qKgorICogaVNDU0kgcmVxdWVzdCB0byB0cmFuc2ZlciBiYXNpYyBoZWFkZXIgc2VnbWVudAorICoKKyAqLworc3RydWN0IGlzY3NpX2Joc19yMnQgeworCS8qKiBPcGNvZGUgKi8KKwl1aW50OF90IG9wY29kZTsKKwkvKiogRmxhZ3MgKi8KKwl1aW50OF90IGZsYWdzOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQxNl90IHJlc2VydmVkX2E7CisJLyoqIFNlZ21lbnQgbGVuZ3RocyAqLworCXVuaW9uIGlzY3NpX3NlZ21lbnRfbGVuZ3RocyBsZW5ndGhzOworCS8qKiBMb2dpY2FsIFVuaXQgTnVtYmVyICovCisJc3RydWN0IHNjc2lfbHVuIGx1bjsKKwkvKiogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJdWludDMyX3QgaXR0OworCS8qKiBUYXJnZXQgVHJhbnNmZXIgVGFnICovCisJdWludDMyX3QgdHR0OworCS8qKiBTdGF0dXMgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3Qgc3RhdHNuOworCS8qKiBFeHBlY3RlZCBjb21tYW5kIHNlcXVlbmNlIG51bWJlciAqLworCXVpbnQzMl90IGV4cGNtZHNuOworCS8qKiBNYXhpbXVtIGNvbW1hbmQgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3QgbWF4Y21kc247CisJLyoqIFIyVCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCByMnRzbjsKKwkvKiogQnVmZmVyIG9mZnNldCAqLworCXVpbnQzMl90IG9mZnNldDsKKwkvKiogRGVzaXJlZCBkYXRhIHRyYW5zZmVyIGxlbmd0aCAqLworCXVpbnQzMl90IGxlbjsKK307CisKKy8qKiBSMlQgb3Bjb2RlICovCisjZGVmaW5lIElTQ1NJX09QQ09ERV9SMlQgMHgzMQorCisvKioKKyAqIEFuIGlTQ1NJIGJhc2ljIGhlYWRlciBzZWdtZW50CisgKi8KK3VuaW9uIGlzY3NpX2JocyB7CisJc3RydWN0IGlzY3NpX2Joc19jb21tb24gY29tbW9uOworCXN0cnVjdCBpc2NzaV9iaHNfY29tbW9uX3Jlc3BvbnNlIGNvbW1vbl9yZXNwb25zZTsKKwlzdHJ1Y3QgaXNjc2lfYmhzX2xvZ2luX3JlcXVlc3QgbG9naW5fcmVxdWVzdDsKKwlzdHJ1Y3QgaXNjc2lfYmhzX2xvZ2luX3Jlc3BvbnNlIGxvZ2luX3Jlc3BvbnNlOworCXN0cnVjdCBpc2NzaV9iaHNfc2NzaV9jb21tYW5kIHNjc2lfY29tbWFuZDsKKwlzdHJ1Y3QgaXNjc2lfYmhzX3Njc2lfcmVzcG9uc2Ugc2NzaV9yZXNwb25zZTsKKwlzdHJ1Y3QgaXNjc2lfYmhzX2RhdGFfaW4gZGF0YV9pbjsKKwlzdHJ1Y3QgaXNjc2lfYmhzX2RhdGFfb3V0IGRhdGFfb3V0OworCXN0cnVjdCBpc2NzaV9iaHNfcjJ0IHIydDsKKwl1bnNpZ25lZCBjaGFyIGJ5dGVzWyBzaXplb2YgKCBzdHJ1Y3QgaXNjc2lfYmhzX2NvbW1vbiApIF07Cit9OworCisvKiogU3RhdGUgb2YgYW4gaVNDU0kgVFggZW5naW5lICovCitlbnVtIGlzY3NpX3R4X3N0YXRlIHsKKwkvKiogTm90aGluZyB0byBzZW5kICovCisJSVNDU0lfVFhfSURMRSA9IDAsCisJLyoqIFNlbmRpbmcgdGhlIGJhc2ljIGhlYWRlciBzZWdtZW50ICovCisJSVNDU0lfVFhfQkhTLAorCS8qKiBTZW5kaW5nIHRoZSBhZGRpdGlvbmFsIGhlYWRlciBzZWdtZW50ICovCisJSVNDU0lfVFhfQUhTLAorCS8qKiBTZW5kaW5nIHRoZSBkYXRhIHNlZ21lbnQgKi8KKwlJU0NTSV9UWF9EQVRBLAorCS8qKiBTZW5kaW5nIHRoZSBkYXRhIHNlZ21lbnQgcGFkZGluZyAqLworCUlTQ1NJX1RYX0RBVEFfUEFERElORywKK307CisKKy8qKiBTdGF0ZSBvZiBhbiBpU0NTSSBSWCBlbmdpbmUgKi8KK2VudW0gaXNjc2lfcnhfc3RhdGUgeworCS8qKiBSZWNlaXZpbmcgdGhlIGJhc2ljIGhlYWRlciBzZWdtZW50ICovCisJSVNDU0lfUlhfQkhTID0gMCwKKwkvKiogUmVjZWl2aW5nIHRoZSBhZGRpdGlvbmFsIGhlYWRlciBzZWdtZW50ICovCisJSVNDU0lfUlhfQUhTLAorCS8qKiBSZWNlaXZpbmcgdGhlIGRhdGEgc2VnbWVudCAqLworCUlTQ1NJX1JYX0RBVEEsCisJLyoqIFJlY2VpdmluZyB0aGUgZGF0YSBzZWdtZW50IHBhZGRpbmcgKi8KKwlJU0NTSV9SWF9EQVRBX1BBRERJTkcsCit9OworCisvKiogQW4gaVNDU0kgc2Vzc2lvbiAqLworc3RydWN0IGlzY3NpX3Nlc3Npb24geworCS8qKiBSZWZlcmVuY2UgY291bnRlciAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCisJLyoqIFRyYW5zcG9ydC1sYXllciBzb2NrZXQgKi8KKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Ugc29ja2V0OworCisJLyoqIFRhcmdldCBhZGRyZXNzICovCisJY2hhciAqdGFyZ2V0X2FkZHJlc3M7CisJLyoqIFRhcmdldCBwb3J0ICovCisJdW5zaWduZWQgaW50IHRhcmdldF9wb3J0OworCS8qKiBUYXJnZXQgSVFOICovCisJY2hhciAqdGFyZ2V0X2lxbjsKKwkvKiogTG9naWNhbCBVbml0IE51bWJlciAoTFVOKSAqLworCXN0cnVjdCBzY3NpX2x1biBsdW47CisJLyoqIFRhcmdldCBzb2NrZXQgYWRkcmVzcyAocmVjb3JkZWQgb25seSBmb3IgaUJGVCkgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgdGFyZ2V0X3NvY2thZGRyOworCisJLyoqIFNlc3Npb24gc3RhdHVzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBiaXR3aXNlLU9SIG9mIHplcm8gb3IgbW9yZSBJU0NTSV9TVEFUVVNfWFhYCisJICogY29uc3RhbnRzLgorCSAqLworCWludCBzdGF0dXM7CisJLyoqIFJldHJ5IGNvdW50CisJICoKKwkgKiBOdW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiByZXRyaWVkLgorCSAqIFJlc2V0IHVwb24gYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24uCisJICovCisJaW50IHJldHJ5X2NvdW50OworCisJLyoqIEluaXRpYXRvciB1c2VybmFtZSAoaWYgYW55KSAqLworCWNoYXIgKmluaXRpYXRvcl91c2VybmFtZTsKKwkvKiogSW5pdGlhdG9yIHBhc3N3b3JkIChpZiBhbnkpICovCisJY2hhciAqaW5pdGlhdG9yX3Bhc3N3b3JkOworCS8qKiBUYXJnZXQgdXNlcm5hbWUgKGlmIGFueSkgKi8KKwljaGFyICp0YXJnZXRfdXNlcm5hbWU7CisJLyoqIFRhcmdldCBwYXNzd29yZCAoaWYgYW55KSAqLworCWNoYXIgKnRhcmdldF9wYXNzd29yZDsKKwkvKiogQ0hBUCBjaGFsbGVuZ2UgKGZvciB0YXJnZXQgYXV0aCBvbmx5KQorCSAqCisJICogVGhpcyBpcyBhIGJsb2NrIG9mIHJhbmRvbSBkYXRhOyB0aGUgZmlyc3QgYnl0ZSBpcyB1c2VkIGFzCisJICogdGhlIENIQVAgaWRlbnRpZmllciAoQ0hBUF9JKSBhbmQgdGhlIHJlbWFpbmRlciBhcyB0aGUgQ0hBUAorCSAqIGNoYWxsZW5nZSAoQ0hBUF9DKS4KKwkgKi8KKwl1bnNpZ25lZCBjaGFyIGNoYXBfY2hhbGxlbmdlWzE3XTsKKwkvKiogQ0hBUCByZXNwb25zZSAodXNlZCBmb3IgYm90aCBpbml0aWF0b3IgYW5kIHRhcmdldCBhdXRoKSAqLworCXN0cnVjdCBjaGFwX3Jlc3BvbnNlIGNoYXA7CisKKwkvKiogVGFyZ2V0IHNlc3Npb24gaWRlbnRpZnlpbmcgaGFuZGxlCisJICoKKwkgKiBUaGlzIGlzIGFzc2lnbmVkIGJ5IHRoZSB0YXJnZXQgd2hlbiB3ZSBmaXJzdCBsb2cgaW4sIGFuZAorCSAqIG11c3QgYmUgcmV1c2VkIG9uIHN1YnNlcXVlbnQgbG9naW4gYXR0ZW1wdHMuCisJICovCisJdWludDE2X3QgdHNpaDsKKwkvKiogSW5pdGlhdG9yIHRhc2sgdGFnCisJICoKKwkgKiBUaGlzIGlzIHRoZSB0YWcgb2YgdGhlIGN1cnJlbnQgY29tbWFuZC4gIEl0IGlzIGluY3JlbWVudGVkCisJICogd2hlbmV2ZXIgYSBuZXcgY29tbWFuZCBpcyBzdGFydGVkLgorCSAqLworCXVpbnQzMl90IGl0dDsKKwkvKiogVGFyZ2V0IHRyYW5zZmVyIHRhZworCSAqCisJICogVGhpcyBpcyB0aGUgdGFnIGF0dGFjaGVkIHRvIGEgc2VxdWVuY2Ugb2YgZGF0YS1vdXQgUERVcyBpbgorCSAqIHJlc3BvbnNlIHRvIGFuIFIyVC4KKwkgKi8KKwl1aW50MzJfdCB0dHQ7CisJLyoqCisJICogVHJhbnNmZXIgb2Zmc2V0CisJICoKKwkgKiBUaGlzIGlzIHRoZSBvZmZzZXQgZm9yIGFuIGluLXByb2dyZXNzIHNlcXVlbmNlIG9mIGRhdGEtb3V0CisJICogUERVcyBpbiByZXNwb25zZSB0byBhbiBSMlQuCisJICovCisJdWludDMyX3QgdHJhbnNmZXJfb2Zmc2V0OworCS8qKgorCSAqIFRyYW5zZmVyIGxlbmd0aAorCSAqCisJICogVGhpcyBpcyB0aGUgbGVuZ3RoIGZvciBhbiBpbi1wcm9ncmVzcyBzZXF1ZW5jZSBvZiBkYXRhLW91dAorCSAqIFBEVXMgaW4gcmVzcG9uc2UgdG8gYW4gUjJULgorCSAqLworCXVpbnQzMl90IHRyYW5zZmVyX2xlbjsKKwkvKiogQ29tbWFuZCBzZXF1ZW5jZSBudW1iZXIKKwkgKgorCSAqIFRoaXMgaXMgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgY3VycmVudCBjb21tYW5kLCB1c2VkIHRvCisJICogZmlsbCBvdXQgdGhlIENtZFNOIGZpZWxkIGluIGlTQ1NJIHJlcXVlc3QgUERVcy4gIEl0IGlzCisJICogdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgRXhwQ21kU04gZmllbGQgd2hlbmV2ZXIgd2UKKwkgKiByZWNlaXZlIGFuIGlTQ1NJIHJlc3BvbnNlIFBEVSBjb250YWluaW5nIHN1Y2ggYSBmaWVsZC4KKwkgKi8KKwl1aW50MzJfdCBjbWRzbjsKKwkvKiogU3RhdHVzIHNlcXVlbmNlIG51bWJlcgorCSAqCisJICogVGhpcyBpcyB0aGUgbW9zdCByZWNlbnQgc3RhdHVzIHNlcXVlbmNlIG51bWJlciBwcmVzZW50IGluCisJICogdGhlIFN0YXRTTiBmaWVsZCBvZiBhbiBpU0NTSSByZXNwb25zZSBQRFUgY29udGFpbmluZyBzdWNoIGEKKwkgKiBmaWVsZC4gIFdoZW5ldmVyIHdlIHNlbmQgYW4gaVNDU0kgcmVxdWVzdCBQRFUsIHdlIGZpbGwgb3V0CisJICogdGhlIEV4cFN0YXRTTiBmaWVsZCB3aXRoIHRoaXMgdmFsdWUgcGx1cyBvbmUuCisJICovCisJdWludDMyX3Qgc3RhdHNuOworCQorCS8qKiBCYXNpYyBoZWFkZXIgc2VnbWVudCBmb3IgY3VycmVudCBUWCBQRFUgKi8KKwl1bmlvbiBpc2NzaV9iaHMgdHhfYmhzOworCS8qKiBTdGF0ZSBvZiB0aGUgVFggZW5naW5lICovCisJZW51bSBpc2NzaV90eF9zdGF0ZSB0eF9zdGF0ZTsKKwkvKiogVFggcHJvY2VzcyAqLworCXN0cnVjdCBwcm9jZXNzIHByb2Nlc3M7CisKKwkvKiogQmFzaWMgaGVhZGVyIHNlZ21lbnQgZm9yIGN1cnJlbnQgUlggUERVICovCisJdW5pb24gaXNjc2lfYmhzIHJ4X2JoczsKKwkvKiogU3RhdGUgb2YgdGhlIFJYIGVuZ2luZSAqLworCWVudW0gaXNjc2lfcnhfc3RhdGUgcnhfc3RhdGU7CisJLyoqIEJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUgY3VycmVudCBSWCBzdGF0ZSAqLworCXNpemVfdCByeF9vZmZzZXQ7CisJLyoqIExlbmd0aCBvZiB0aGUgY3VycmVudCBSWCBzdGF0ZSAqLworCXNpemVfdCByeF9sZW47CisJLyoqIEJ1ZmZlciBmb3IgcmVjZWl2ZWQgZGF0YSAobm90IGFsd2F5cyB1c2VkKSAqLworCXZvaWQgKnJ4X2J1ZmZlcjsKKworCS8qKiBDdXJyZW50IFNDU0kgY29tbWFuZAorCSAqCisJICogU2V0IHRvIE5VTEwgd2hlbiBjb21tYW5kIGlzIGNvbXBsZXRlLgorCSAqLworCXN0cnVjdCBzY3NpX2NvbW1hbmQgKmNvbW1hbmQ7CisJLyoqIEluc3RhbnQgcmV0dXJuIGNvZGUKKwkgKgorCSAqIFNldCB0byBhIG5vbi16ZXJvIHZhbHVlIGlmIGFsbCByZXF1ZXN0cyBzaG91bGQgcmV0dXJuCisJICogaW1tZWRpYXRlbHkuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGUuZy4gYXZvaWQgcmV0cnlpbmcKKwkgKiBsb2dpbnMgdGhhdCBhcmUgZG9vbWVkIHRvIGZhaWwgYXV0aGVudGljYXRpb24uCisJICovCisJaW50IGluc3RhbnRfcmM7Cit9OworCisvKiogaVNDU0kgc2Vzc2lvbiBpcyBjdXJyZW50bHkgaW4gdGhlIHNlY3VyaXR5IG5lZ290aWF0aW9uIHBoYXNlICovCisjZGVmaW5lIElTQ1NJX1NUQVRVU19TRUNVUklUWV9ORUdPVElBVElPTl9QSEFTRQkJXAorCSggSVNDU0lfTE9HSU5fQ1NHX1NFQ1VSSVRZX05FR09USUFUSU9OIHwJXAorCSAgSVNDU0lfTE9HSU5fTlNHX09QRVJBVElPTkFMX05FR09USUFUSU9OICkKKworLyoqIGlTQ1NJIHNlc3Npb24gaXMgY3VycmVudGx5IGluIHRoZSBvcGVyYXRpb25hbCBwYXJhbWV0ZXIKKyAqIG5lZ290aWF0aW9uIHBoYXNlCisgKi8KKyNkZWZpbmUgSVNDU0lfU1RBVFVTX09QRVJBVElPTkFMX05FR09USUFUSU9OX1BIQVNFCVwKKwkoIElTQ1NJX0xPR0lOX0NTR19PUEVSQVRJT05BTF9ORUdPVElBVElPTiB8CVwKKwkgIElTQ1NJX0xPR0lOX05TR19GVUxMX0ZFQVRVUkVfUEhBU0UgKQorCisvKiogaVNDU0kgc2Vzc2lvbiBpcyBjdXJyZW50bHkgaW4gdGhlIGZ1bGwgZmVhdHVyZSBwaGFzZSAqLworI2RlZmluZSBJU0NTSV9TVEFUVVNfRlVMTF9GRUFUVVJFX1BIQVNFCUlTQ1NJX0xPR0lOX0NTR19GVUxMX0ZFQVRVUkVfUEhBU0UKKworLyoqIE1hc2sgZm9yIGFsbCBpU0NTSSBzZXNzaW9uIHBoYXNlcyAqLworI2RlZmluZSBJU0NTSV9TVEFUVVNfUEhBU0VfTUFTSyAoIElTQ1NJX0xPR0lOX0NTR19NQVNLIHwgSVNDU0lfTE9HSU5fTlNHX01BU0sgKQorCisvKiogaVNDU0kgc2Vzc2lvbiBuZWVkcyB0byBzZW5kIHRoZSBpbml0aWFsIHNlY3VyaXR5IG5lZ290aWF0aW9uIHN0cmluZ3MgKi8KKyNkZWZpbmUgSVNDU0lfU1RBVFVTX1NUUklOR1NfU0VDVVJJVFkgMHgwMTAwCisKKy8qKiBpU0NTSSBzZXNzaW9uIG5lZWRzIHRvIHNlbmQgdGhlIENIQVBfQSBzdHJpbmcgKi8KKyNkZWZpbmUgSVNDU0lfU1RBVFVTX1NUUklOR1NfQ0hBUF9BTEdPUklUSE0gMHgwMjAwCisKKy8qKiBpU0NTSSBzZXNzaW9uIG5lZWRzIHRvIHNlbmQgdGhlIENIQVAgcmVzcG9uc2UgKi8KKyNkZWZpbmUgSVNDU0lfU1RBVFVTX1NUUklOR1NfQ0hBUF9SRVNQT05TRSAweDA0MDAKKworLyoqIGlTQ1NJIHNlc3Npb24gbmVlZHMgdG8gc2VuZCB0aGUgbXV0dWFsIENIQVAgY2hhbGxlbmdlICovCisjZGVmaW5lIElTQ1NJX1NUQVRVU19TVFJJTkdTX0NIQVBfQ0hBTExFTkdFIDB4MDgwMAorCisvKiogaVNDU0kgc2Vzc2lvbiBuZWVkcyB0byBzZW5kIHRoZSBvcGVyYXRpb25hbCBuZWdvdGlhdGlvbiBzdHJpbmdzICovCisjZGVmaW5lIElTQ1NJX1NUQVRVU19TVFJJTkdTX09QRVJBVElPTkFMIDB4MTAwMAorCisvKiogTWFzayBmb3IgYWxsIGlTQ1NJICJuZWVkcyB0byBzZW5kIiBmbGFncyAqLworI2RlZmluZSBJU0NTSV9TVEFUVVNfU1RSSU5HU19NQVNLIDB4ZmYwMAorCisvKiogVGFyZ2V0IGhhcyByZXF1ZXN0ZWQgZm9yd2FyZCAoaW5pdGlhdG9yKSBhdXRoZW50aWNhdGlvbiAqLworI2RlZmluZSBJU0NTSV9TVEFUVVNfQVVUSF9GT1JXQVJEX1JFUVVJUkVEIDB4MDAwMTAwMDAKKworLyoqIEluaXRpYXRvciByZXF1aXJlcyB0YXJnZXQgKHJldmVyc2UpIGF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lIElTQ1NJX1NUQVRVU19BVVRIX1JFVkVSU0VfUkVRVUlSRUQgMHgwMDAyMDAwMAorCisvKiogVGFyZ2V0IGF1dGhlbnRpY2F0ZWQgaXRzZWxmIGNvcnJlY3RseSAqLworI2RlZmluZSBJU0NTSV9TVEFUVVNfQVVUSF9SRVZFUlNFX09LIDB4MDAwNDAwMDAKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgYXQgY29ubmVjdGluZyAqLworI2RlZmluZSBJU0NTSV9NQVhfUkVUUklFUyAyCisKK2V4dGVybiBpbnQgaXNjc2lfYXR0YWNoICggc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpLCBjb25zdCBjaGFyICpyb290X3BhdGggKTsKK2V4dGVybiB2b2lkIGlzY3NpX2RldGFjaCAoIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSApOworZXh0ZXJuIGNvbnN0IGNoYXIgKiBpc2NzaV9pbml0aWF0b3JfaXFuICggdm9pZCApOworCisjZW5kaWYgLyogX0dQWEVfSVNDU0lfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2pvYi5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2pvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYmNhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvam9iLmgKQEAgLTAsMCArMSwxNjkgQEAKKyNpZm5kZWYgX0dQWEVfSk9CX0gKKyNkZWZpbmUgX0dQWEVfSk9CX0gKKworLyoqIEBmaWxlCisgKgorICogSm9iIGNvbnRyb2wgaW50ZXJmYWNlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxncHhlL2ludGVyZmFjZS5oPgorCisvKiogSm9iIHByb2dyZXNzICovCitzdHJ1Y3Qgam9iX3Byb2dyZXNzIHsKKwkvKiogQW1vdW50IG9mIG9wZXJhdGlvbiBjb21wbGV0ZWQgc28gZmFyCisJICoKKwkgKiBUaGUgdW5pdHMgZm9yIHRoaXMgcXVhbnRpdHkgYXJlIGFyYml0cmFyeS4gIEBjIGNvbXBsZXRlZAorCSAqIGRpdmRlZCBieSBAdG90YWwgc2hvdWxkIGdpdmUgc29tZXRoaW5nIHdoaWNoIGFwcHJveGltYXRlbHkKKwkgKiByZXByZXNlbnRzIHRoZSBwcm9ncmVzcyB0aHJvdWdoIHRoZSBvcGVyYXRpb24uICBGb3IgYQorCSAqIGRvd25sb2FkIG9wZXJhdGlvbiwgdXNpbmcgYnl0ZSBjb3VudHMgd291bGQgbWFrZSBzZW5zZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGNvbXBsZXRlZDsKKwkvKiogVG90YWwgb3BlcmF0aW9uIHNpemUKKwkgKgorCSAqIFNlZSBAYyBjb21wbGV0ZWQuICBBIHplcm8gdmFsdWUgbWVhbnMgInRvdGFsIHNpemUgdW5rbm93biIKKwkgKiBhbmQgaXMgZXhwbGNpdGx5IHBlcm1pdHRlZDsgdXNlcnMgc2hvdWxkIHRha2UgdGhpcyBpbnRvCisJICogYWNjb3VudCBiZWZvcmUgY2FsY3VsYXRpbmcgQGMgY29tcGxldGVkL3RvdGFsLgorCSAqLworCXVuc2lnbmVkIGxvbmcgdG90YWw7Cit9OworCitzdHJ1Y3Qgam9iX2ludGVyZmFjZTsKKworLyoqIEpvYiBjb250cm9sIGludGVyZmFjZSBvcGVyYXRpb25zICovCitzdHJ1Y3Qgam9iX2ludGVyZmFjZV9vcGVyYXRpb25zIHsKKwkvKiogSm9iIGNvbXBsZXRlZAorCSAqCisJICogQHYgam9iCQlKb2IgY29udHJvbCBpbnRlcmZhY2UKKwkgKiBAdiByYwkJT3ZlcmFsbCBqb2Igc3RhdHVzIGNvZGUKKwkgKi8KKwl2b2lkICggKiBkb25lICkgKCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSAqam9iLCBpbnQgcmMgKTsKKwkvKiogQWJvcnQgam9iCisJICoKKwkgKiBAdiBqb2IJCUpvYiBjb250cm9sIGludGVyZmFjZQorCSAqLworCXZvaWQgKCAqIGtpbGwgKSAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IgKTsKKwkvKiogR2V0IGpvYiBwcm9ncmVzcworCSAqCisJICogQHYgam9iCQlKb2IgY29udHJvbCBpbnRlcmZhY2UKKwkgKiBAdiBwcm9ncmVzcwkJUHJvZ3Jlc3MgZGF0YSB0byBmaWxsIGluCisJICovCisJdm9pZCAoICogcHJvZ3Jlc3MgKSAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IsCisJCQkgICAgICBzdHJ1Y3Qgam9iX3Byb2dyZXNzICpwcm9ncmVzcyApOworfTsKKworLyoqIEEgam9iIGNvbnRyb2wgaW50ZXJmYWNlICovCitzdHJ1Y3Qgam9iX2ludGVyZmFjZSB7CisJLyoqIEdlbmVyaWMgb2JqZWN0IGNvbW11bmljYXRpb24gaW50ZXJmYWNlICovCisJc3RydWN0IGludGVyZmFjZSBpbnRmOworCS8qKiBPcGVyYXRpb25zIGZvciByZWNlaXZlZCBtZXNzYWdlcyAqLworCXN0cnVjdCBqb2JfaW50ZXJmYWNlX29wZXJhdGlvbnMgKm9wOworfTsKKworZXh0ZXJuIHN0cnVjdCBqb2JfaW50ZXJmYWNlIG51bGxfam9iOworZXh0ZXJuIHN0cnVjdCBqb2JfaW50ZXJmYWNlX29wZXJhdGlvbnMgbnVsbF9qb2Jfb3BzOworCitleHRlcm4gdm9pZCBqb2JfZG9uZSAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IsIGludCByYyApOworZXh0ZXJuIHZvaWQgam9iX2tpbGwgKCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSAqam9iICk7CitleHRlcm4gdm9pZCBqb2JfcHJvZ3Jlc3MgKCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSAqam9iLAorCQkJICAgc3RydWN0IGpvYl9wcm9ncmVzcyAqcHJvZ3Jlc3MgKTsKKworZXh0ZXJuIHZvaWQgaWdub3JlX2pvYl9kb25lICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiwgaW50IHJjICk7CitleHRlcm4gdm9pZCBpZ25vcmVfam9iX2tpbGwgKCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSAqam9iICk7CitleHRlcm4gdm9pZCBpZ25vcmVfam9iX3Byb2dyZXNzICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiwKKwkJCQkgIHN0cnVjdCBqb2JfcHJvZ3Jlc3MgKnByb2dyZXNzICk7CisKKy8qKgorICogSW5pdGlhbGlzZSBhIGpvYiBjb250cm9sIGludGVyZmFjZQorICoKKyAqIEB2IGpvYgkJSm9iIGNvbnRyb2wgaW50ZXJmYWNlCisgKiBAdiBvcAkJSm9iIGNvbnRyb2wgaW50ZXJmYWNlIG9wZXJhdGlvbnMKKyAqIEB2IHJlZmNudAkJQ29udGFpbmluZyBvYmplY3QgcmVmZXJlbmNlIGNvdW50ZXIsIG9yIE5VTEwKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGpvYl9pbml0ICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiwKKwkJCSAgICAgIHN0cnVjdCBqb2JfaW50ZXJmYWNlX29wZXJhdGlvbnMgKm9wLAorCQkJICAgICAgc3RydWN0IHJlZmNudCAqcmVmY250ICkgeworCWpvYi0+aW50Zi5kZXN0ID0gJm51bGxfam9iLmludGY7CisJam9iLT5pbnRmLnJlZmNudCA9IHJlZmNudDsKKwlqb2ItPm9wID0gb3A7Cit9CisKKy8qKgorICogR2V0IGpvYiBjb250cm9sIGludGVyZmFjZSBmcm9tIGdlbmVyaWMgb2JqZWN0IGNvbW11bmljYXRpb24gaW50ZXJmYWNlCisgKgorICogQHYgaW50ZgkJR2VuZXJpYyBvYmplY3QgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UKKyAqIEByZXQgam9iCQlKb2IgY29udHJvbCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgc3RydWN0IGpvYl9pbnRlcmZhY2UgKgoraW50Zl90b19qb2IgKCBzdHJ1Y3QgaW50ZXJmYWNlICppbnRmICkgeworCXJldHVybiBjb250YWluZXJfb2YgKCBpbnRmLCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSwgaW50ZiApOworfQorCisvKioKKyAqIEdldCByZWZlcmVuY2UgdG8gZGVzdGluYXRpb24gam9iIGNvbnRyb2wgaW50ZXJmYWNlCisgKgorICogQHYgam9iCQlKb2IgY29udHJvbCBpbnRlcmZhY2UKKyAqIEByZXQgZGVzdAkJRGVzdGluYXRpb24gaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHN0cnVjdCBqb2JfaW50ZXJmYWNlICoKK2pvYl9nZXRfZGVzdCAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IgKSB7CisJcmV0dXJuIGludGZfdG9fam9iICggaW50Zl9nZXQgKCBqb2ItPmludGYuZGVzdCApICk7Cit9CisKKy8qKgorICogRHJvcCByZWZlcmVuY2UgdG8gam9iIGNvbnRyb2wgaW50ZXJmYWNlCisgKgorICogQHYgam9iCQlKb2IgY29udHJvbCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZAoram9iX3B1dCAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IgKSB7CisJaW50Zl9wdXQgKCAmam9iLT5pbnRmICk7Cit9CisKKy8qKgorICogUGx1ZyBhIGpvYiBjb250cm9sIGludGVyZmFjZSBpbnRvIGEgbmV3IGRlc3RpbmF0aW9uIGludGVyZmFjZQorICoKKyAqIEB2IGpvYgkJSm9iIGNvbnRyb2wgaW50ZXJmYWNlCisgKiBAdiBkZXN0CQlOZXcgZGVzdGluYXRpb24gaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBqb2JfcGx1ZyAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IsCisJCQkgICAgICAgc3RydWN0IGpvYl9pbnRlcmZhY2UgKmRlc3QgKSB7CisJcGx1ZyAoICZqb2ItPmludGYsICZkZXN0LT5pbnRmICk7Cit9CisKKy8qKgorICogUGx1ZyB0d28gam9iIGNvbnRyb2wgaW50ZXJmYWNlcyB0b2dldGhlcgorICoKKyAqIEB2IGEJCQlKb2IgY29udHJvbCBpbnRlcmZhY2UgQQorICogQHYgYgkJCUpvYiBjb250cm9sIGludGVyZmFjZSBCCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBqb2JfcGx1Z19wbHVnICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmEsCisJCQkJICAgIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpiICkgeworCXBsdWdfcGx1ZyAoICZhLT5pbnRmLCAmYi0+aW50ZiApOworfQorCisvKioKKyAqIFVucGx1ZyBhIGpvYiBjb250cm9sIGludGVyZmFjZQorICoKKyAqIEB2IGpvYgkJSm9iIGNvbnRyb2wgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBqb2JfdW5wbHVnICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiApIHsKKwlwbHVnICggJmpvYi0+aW50ZiwgJm51bGxfam9iLmludGYgKTsKK30KKworLyoqCisgKiBTdG9wIHVzaW5nIGEgam9iIGNvbnRyb2wgaW50ZXJmYWNlCisgKgorICogQHYgam9iCQlKb2IgY29udHJvbCBpbnRlcmZhY2UKKyAqCisgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBubyBmdXJ0aGVyIG1lc3NhZ2VzIHdpbGwgYmUgcmVjZWl2ZWQgdmlhCisgKiB0aGUgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgam9iX251bGxpZnkgKCBzdHJ1Y3Qgam9iX2ludGVyZmFjZSAqam9iICkgeworCWpvYi0+b3AgPSAmbnVsbF9qb2Jfb3BzOworfTsKKworI2VuZGlmIC8qIF9HUFhFX0pPQl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUva2V5cy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2tleXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWJjOWJjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2tleXMuaApAQCAtMCwwICsxLDgxIEBACisjaWZuZGVmIF9HUFhFX0tFWVNfSAorI2RlZmluZSBfR1BYRV9LRVlTX0gKKworLyoqIEBmaWxlCisgKgorICogS2V5IGRlZmluaXRpb25zCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoKKyAqIFN5bWJvbGljIG5hbWVzIGZvciBzb21lIHN0YW5kYXJkIEFTQ0lJIGNoYXJhY3RlcnMKKyAqCisgKi8KKworI2RlZmluZSBOVUwJCTB4MDAKKyNkZWZpbmUgQ1RSTF9BCQkweDAxCisjZGVmaW5lIENUUkxfQgkJMHgwMgorI2RlZmluZSBDVFJMX0MJCTB4MDMKKyNkZWZpbmUgQ1RSTF9ECQkweDA0CisjZGVmaW5lIENUUkxfRQkJMHgwNQorI2RlZmluZSBDVFJMX0YJCTB4MDYKKyNkZWZpbmUgQ1RSTF9HCQkweDA3CisjZGVmaW5lIENUUkxfSAkJMHgwOAorI2RlZmluZSBDVFJMX0kJCTB4MDkKKyNkZWZpbmUgQ1RSTF9KCQkweDBhCisjZGVmaW5lIENUUkxfSwkJMHgwYgorI2RlZmluZSBDVFJMX0wJCTB4MGMKKyNkZWZpbmUgQ1RSTF9NCQkweDBkCisjZGVmaW5lIENUUkxfTgkJMHgwZQorI2RlZmluZSBDVFJMX08JCTB4MGYKKyNkZWZpbmUgQ1RSTF9QCQkweDEwCisjZGVmaW5lIENUUkxfUQkJMHgxMQorI2RlZmluZSBDVFJMX1IJCTB4MTIKKyNkZWZpbmUgQ1RSTF9TCQkweDEzCisjZGVmaW5lIENUUkxfVAkJMHgxNAorI2RlZmluZSBDVFJMX1UJCTB4MTUKKyNkZWZpbmUgQ1RSTF9WCQkweDE2CisjZGVmaW5lIENUUkxfVwkJMHgxNworI2RlZmluZSBDVFJMX1gJCTB4MTgKKyNkZWZpbmUgQ1RSTF9ZCQkweDE5CisjZGVmaW5lIENUUkxfWgkJMHgxYQorCisjZGVmaW5lIEJBQ0tTUEFDRQlDVFJMX0gKKyNkZWZpbmUgVEFCCQlDVFJMX0kKKyNkZWZpbmUgTEYJCUNUUkxfSgorI2RlZmluZSBDUgkJQ1RSTF9NCisjZGVmaW5lIEVTQwkJMHgxYgorCisvKgorICogU3BlY2lhbCBrZXlzIG91dHNpZGUgdGhlIG5vcm1hbCBBU0NJSSByYW5nZSAKKyAqCisgKgorICogVGhlIG5hbWVzIGFyZSBjaG9zZW4gdG8gbWF0Y2ggdGhvc2UgdXNlZCBieSBjdXJzZXMuICBUaGUgdmFsdWVzIGFyZQorICogY2hvc2VuIHRvIGZhY2lsaXRhdGUgZWFzeSBjb252ZXJzaW9uIGZyb20gYSByZWNlaXZlZCBBTlNJIGVzY2FwZQorICogc2VxdWVuY2UgdG8gYSBLRVlfWFhYIGNvbnN0YW50LgorICovCisKKyNkZWZpbmUgS0VZX0FOU0koIG4sIHRlcm1pbmF0b3IgKSAoIDB4MTAwICogKCAobikgKyAxICkgKyAodGVybWluYXRvcikgKQorCisjZGVmaW5lIEtFWV9NSU4JCTB4MTAxCisjZGVmaW5lIEtFWV9VUAkJS0VZX0FOU0kgKCAwLCAnQScgKQkvKio8IFVwIGFycm93ICovCisjZGVmaW5lIEtFWV9ET1dOCUtFWV9BTlNJICggMCwgJ0InICkJLyoqPCBEb3duIGFycm93ICovCisjZGVmaW5lIEtFWV9SSUdIVAlLRVlfQU5TSSAoIDAsICdDJyApCS8qKjwgUmlnaHQgYXJyb3cgKi8KKyNkZWZpbmUgS0VZX0xFRlQJS0VZX0FOU0kgKCAwLCAnRCcgKQkvKio8IExlZnQgYXJyb3cgKi8KKyNkZWZpbmUgS0VZX0VORAkJS0VZX0FOU0kgKCAwLCAnRicgKQkvKio8IEVuZCAqLworI2RlZmluZSBLRVlfSE9NRQlLRVlfQU5TSSAoIDAsICdIJyApCS8qKjwgSG9tZSAqLworI2RlZmluZSBLRVlfSUMJCUtFWV9BTlNJICggMiwgJ34nICkJLyoqPCBJbnNlcnQgKi8KKyNkZWZpbmUgS0VZX0RDCQlLRVlfQU5TSSAoIDMsICd+JyApCS8qKjwgRGVsZXRlICovCisjZGVmaW5lIEtFWV9QUEFHRQlLRVlfQU5TSSAoIDUsICd+JyApCS8qKjwgUGFnZSB1cCAqLworI2RlZmluZSBLRVlfTlBBR0UJS0VZX0FOU0kgKCA2LCAnficgKQkvKio8IFBhZ2UgZG93biAqLworI2RlZmluZSBLRVlfRjgJCUtFWV9BTlNJICggMTksICd+JyApCS8qKjwgRjggKGZvciBQWEUpICovCisKKy8qIE5vdCBpbiB0aGUgW0tFWV9NSU4sS0VZX01BWF0gcmFuZ2U7IHRlcm1pbmFscyBzZWVtIHRvIHNlbmQgdGhlc2UgYXMKKyAqIG5vcm1hbCBBU0NJSSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgS0VZX0JBQ0tTUEFDRQlCQUNLU1BBQ0UKKyNkZWZpbmUgS0VZX0VOVEVSCUxGCisKKyNlbmRpZiAvKiBfR1BYRV9LRVlTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9saW5lYnVmLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbGluZWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYTIxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbGluZWJ1Zi5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX0dQWEVfTElORUJVRl9ICisjZGVmaW5lIF9HUFhFX0xJTkVCVUZfSAorCisvKiogQGZpbGUKKyAqCisgKiBMaW5lIGJ1ZmZlcmluZworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyoqIEEgbGluZSBidWZmZXIgKi8KK3N0cnVjdCBsaW5lX2J1ZmZlciB7CisJLyoqIEN1cnJlbnQgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KKwljaGFyICpkYXRhOworCS8qKiBMZW5ndGggb2YgY3VycmVudCBzdHJpbmcsIGV4Y2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMICovCisJc2l6ZV90IGxlbjsKKwkvKiogU3RyaW5nIGlzIHJlYWR5IHRvIHJlYWQgKi8KKwlpbnQgcmVhZHk7Cit9OworCitleHRlcm4gY2hhciAqIGJ1ZmZlcmVkX2xpbmUgKCBzdHJ1Y3QgbGluZV9idWZmZXIgKmxpbmVidWYgKTsKK2V4dGVybiBzc2l6ZV90IGxpbmVfYnVmZmVyICggc3RydWN0IGxpbmVfYnVmZmVyICpsaW5lYnVmLAorCQkJICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuICk7CitleHRlcm4gdm9pZCBlbXB0eV9saW5lX2J1ZmZlciAoIHN0cnVjdCBsaW5lX2J1ZmZlciAqbGluZWJ1ZiApOworCisjZW5kaWYgLyogX0dQWEVfTElORUJVRl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbGludXhfY29tcGF0LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbGludXhfY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3NTEyZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9saW51eF9jb21wYXQuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9HUFhFX0xJTlVYX0NPTVBBVF9ICisjZGVmaW5lIF9HUFhFX0xJTlVYX0NPTVBBVF9ICisKKy8qKiBAZmlsZQorICoKKyAqIExpbnV4IGNvZGUgY29tcGF0aWJpbGl0eQorICoKKyAqIFRoaXMgZmlsZSBleGlzdHMgdG8gZWFzZSB0aGUgYnVpbGRpbmcgb2YgTGludXggc291cmNlIGNvZGUgd2l0aGluCisgKiBnUFhFLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHF1aWNrIHRlc3Rpbmc7IGl0IGlzIG5vdAorICogaW50ZW5kZWQgdG8gYmUgYSBzdWJzdGl0dXRlIGZvciBwcm9wZXIgcG9ydGluZy4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL2JpdG9wcy5oPgorCisjZGVmaW5lIF9faW5pdAorI2RlZmluZSBfX2V4aXQKKyNkZWZpbmUgX19pbml0ZGF0YQorI2RlZmluZSBfX2V4aXRkYXRhCisjZGVmaW5lIHByaW50ayBwcmludGYKKworI2VuZGlmIC8qIF9HUFhFX0xJTlVYX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbGlzdC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJhMjAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL2xpc3QuaApAQCAtMCwwICsxLDE4MCBAQAorI2lmbmRlZiBfR1BYRV9MSVNUX0gKKyNkZWZpbmUgX0dQWEVfTElTVF9ICisKKy8qKiBAZmlsZQorICoKKyAqIExpbmtlZCBsaXN0cworICoKKyAqIFRoaXMgbGlua2VkIGxpc3QgaGFuZGxpbmcgY29kZSBpcyBiYXNlZCBvbiB0aGUgTGludXgga2VybmVsJ3MKKyAqIGxpc3QuaC4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTsKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisvKgorICogU2ltcGxlIGRvdWJseSBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBTb21lIG9mIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKCJfX3h4eCIpIGFyZSB1c2VmdWwgd2hlbgorICogbWFuaXB1bGF0aW5nIHdob2xlIGxpc3RzIHJhdGhlciB0aGFuIHNpbmdsZSBlbnRyaWVzLCBhcworICogc29tZXRpbWVzIHdlIGFscmVhZHkga25vdyB0aGUgbmV4dC9wcmV2IGVudHJpZXMgYW5kIHdlIGNhbgorICogZ2VuZXJhdGUgYmV0dGVyIGNvZGUgYnkgdXNpbmcgdGhlbSBkaXJlY3RseSByYXRoZXIgdGhhbgorICogdXNpbmcgdGhlIGdlbmVyaWMgc2luZ2xlLWVudHJ5IHJvdXRpbmVzLgorICovCisKK3N0cnVjdCBsaXN0X2hlYWQgeworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcHJldjsKK307CisKKyNkZWZpbmUgTElTVF9IRUFEX0lOSVQoIG5hbWUgKSB7ICYobmFtZSksICYobmFtZSkgfQorCisjZGVmaW5lIExJU1RfSEVBRCggbmFtZSApIFwKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWUgPSBMSVNUX0hFQURfSU5JVCAoIG5hbWUgKQorCisjZGVmaW5lIElOSVRfTElTVF9IRUFEKCBwdHIgKSBkbyB7IFwKKwkocHRyKS0+bmV4dCA9IChwdHIpOyAocHRyKS0+cHJldiA9IChwdHIpOyBcCit9IHdoaWxlICggMCApCisKKy8qCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYmV0d2VlbiB0d28ga25vd24gY29uc2VjdXRpdmUgZW50cmllcy4KKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X2FkZCAoIHN0cnVjdCBsaXN0X2hlYWQgKm5ldywKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwcmV2LAorCQkJCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQgKSB7CisJbmV4dC0+cHJldiA9IG5ldzsKKwluZXctPm5leHQgPSBuZXh0OworCW5ldy0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5ldzsKK30KKworLyoqCisgKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGhlYWQgb2YgYSBsaXN0CisgKgorICogQHYgbmV3CU5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQHYgaGVhZAlMaXN0IGhlYWQgdG8gYWRkIGl0IGFmdGVyCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGFmdGVyIHRoZSBzcGVjaWZpZWQgaGVhZC4gIFRoaXMgaXMgZ29vZCBmb3IKKyAqIGltcGxlbWVudGluZyBzdGFja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2FkZCAoIHN0cnVjdCBsaXN0X2hlYWQgKm5ldywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCApIHsKKwlfX2xpc3RfYWRkICggbmV3LCBoZWFkLCBoZWFkLT5uZXh0ICk7Cit9CisjZGVmaW5lIGxpc3RfYWRkKCBuZXcsIGhlYWQgKSBkbyB7CQkJXAorCWFzc2VydCAoIChoZWFkKS0+bmV4dC0+cHJldiA9PSAoaGVhZCkgKTsJXAorCWFzc2VydCAoIChoZWFkKS0+cHJldi0+bmV4dCA9PSAoaGVhZCkgKTsJXAorCWxpc3RfYWRkICggKG5ldyksIChoZWFkKSApOwkJCVwKKwl9IHdoaWxlICggMCApCisKKy8qKgorICogQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSB0YWlsIG9mIGEgbGlzdAorICoKKyAqIEB2IG5ldwlOZXcgZW50cnkgdG8gYmUgYWRkZWQKKyAqIEB2IGhlYWQJTGlzdCBoZWFkIHRvIGFkZCBpdCBiZWZvcmUKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYmVmb3JlIHRoZSBzcGVjaWZpZWQgaGVhZC4gIFRoaXMgaXMgdXNlZnVsIGZvcgorICogaW1wbGVtZW50aW5nIHF1ZXVlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkX3RhaWwgKCBzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsCisJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCApIHsKKwlfX2xpc3RfYWRkICggbmV3LCBoZWFkLT5wcmV2LCBoZWFkICk7Cit9CisjZGVmaW5lIGxpc3RfYWRkX3RhaWwoIG5ldywgaGVhZCApIGRvIHsJCQlcCisJYXNzZXJ0ICggKGhlYWQpLT5uZXh0LT5wcmV2ID09IChoZWFkKSApOwlcCisJYXNzZXJ0ICggKGhlYWQpLT5wcmV2LT5uZXh0ID09IChoZWFkKSApOwlcCisJbGlzdF9hZGRfdGFpbCAoIChuZXcpLCAoaGVhZCkgKTsJCVwKKwl9IHdoaWxlICggMCApCisKKy8qCisgKiBEZWxldGUgYSBsaXN0IGVudHJ5IGJ5IG1ha2luZyB0aGUgcHJldi9uZXh0IGVudHJpZXMKKyAqIHBvaW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9kZWwgKCBzdHJ1Y3QgbGlzdF9oZWFkICogcHJldiwKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICogbmV4dCApIHsKKwluZXh0LT5wcmV2ID0gcHJldjsKKwlwcmV2LT5uZXh0ID0gbmV4dDsKK30KKworLyoqCisgKiBEZWxldGUgYW4gZW50cnkgZnJvbSBhIGxpc3QKKyAqCisgKiBAdiBlbnRyeQlFbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsaXN0CisgKgorICogTm90ZSB0aGF0IGxpc3RfZW1wdHkoKSBvbiBlbnRyeSBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBhZnRlciB0aGlzOworICogdGhlIGVudHJ5IGlzIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfZGVsICggc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgKSB7CisJX19saXN0X2RlbCAoIGVudHJ5LT5wcmV2LCBlbnRyeS0+bmV4dCApOworfQorI2RlZmluZSBsaXN0X2RlbCggZW50cnkgKSBkbyB7CQkJCVwKKwlhc3NlcnQgKCAoZW50cnkpLT5wcmV2ICE9IE5VTEwgKTsJCVwKKwlhc3NlcnQgKCAoZW50cnkpLT5uZXh0ICE9IE5VTEwgKTsJCVwKKwlhc3NlcnQgKCAoZW50cnkpLT5uZXh0LT5wcmV2ID09IChlbnRyeSkgKTsJXAorCWFzc2VydCAoIChlbnRyeSktPnByZXYtPm5leHQgPT0gKGVudHJ5KSApOwlcCisJbGlzdF9kZWwgKCAoZW50cnkpICk7CQkJCVwKKwl9IHdoaWxlICggMCApCisKKy8qKgorICogVGVzdCB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eQorICoKKyAqIEB2IGhlYWQJTGlzdCB0byB0ZXN0LgorICovCitzdGF0aWMgaW5saW5lIGludCBsaXN0X2VtcHR5ICggY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCApIHsKKwlyZXR1cm4gaGVhZC0+bmV4dCA9PSBoZWFkOworfQorCisvKioKKyAqIEdldCB0aGUgY29udGFpbmluZyBzdHJ1Y3QgZm9yIHRoaXMgZW50cnkKKyAqCisgKiBAdiBwdHIJVGhlIHN0cnVjdCBsaXN0X2hlYWQgcG9pbnRlcgorICogQHYgdHlwZQlUaGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4KKyAqIEB2IG1lbWJlcglUaGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QKKyAqLworI2RlZmluZSBsaXN0X2VudHJ5KCBwdHIsIHR5cGUsIG1lbWJlciApIFwKKwljb250YWluZXJfb2YgKCBwdHIsIHR5cGUsIG1lbWJlciApCisKKy8qKgorICogSXRlcmF0ZSBvdmVyIGEgbGlzdAorICoKKyAqIEB2IHBvcwlUaGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyCisgKiBAdiBoZWFkCVRoZSBoZWFkIGZvciB5b3VyIGxpc3QKKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoKCBwb3MsIGhlYWQgKSBcCisJZm9yICggcG9zID0gKGhlYWQpLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBwb3MgPSBwb3MtPm5leHQgKQorCisvKioKKyAqIEl0ZXJhdGUgb3ZlciBlbnRyaWVzIGluIGEgbGlzdAorICoKKyAqIEB2IHBvcwlUaGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlcgorICogQHYgaGVhZAlUaGUgaGVhZCBmb3IgeW91ciBsaXN0CisgKiBAdiBtZW1iZXIJVGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0CisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeSggcG9zLCBoZWFkLCBtZW1iZXIgKQkJCSAgICAgIFwKKwlmb3IgKCBwb3MgPSBsaXN0X2VudHJ5ICggKGhlYWQpLT5uZXh0LCB0eXBlb2YgKCAqcG9zICksIG1lbWJlciApOyAgICAgXAorCSAgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7CQkJCQkgICAgICBcCisJICAgICAgcG9zID0gbGlzdF9lbnRyeSAoIHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZiAoICpwb3MgKSwgbWVtYmVyICkgKQorCisvKioKKyAqIEl0ZXJhdGUgb3ZlciBlbnRyaWVzIGluIGEgbGlzdCwgc2FmZSBhZ2FpbnN0IGRlbGV0aW9uIG9mIGVudHJpZXMKKyAqCisgKiBAdiBwb3MJVGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIKKyAqIEB2IHRtcAlBbm90aGVyIHR5cGUgKiB0byB1c2UgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAdiBoZWFkCVRoZSBoZWFkIGZvciB5b3VyIGxpc3QKKyAqIEB2IG1lbWJlcglUaGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QKKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoIHBvcywgdG1wLCBoZWFkLCBtZW1iZXIgKQkJICAgICAgXAorCWZvciAoIHBvcyA9IGxpc3RfZW50cnkgKCAoaGVhZCktPm5leHQsIHR5cGVvZiAoICpwb3MgKSwgbWVtYmVyICksICAgICBcCisJICAgICAgdG1wID0gbGlzdF9lbnRyeSAoIHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZiAoICp0bXAgKSwgbWVtYmVyICk7IFwKKwkgICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwkJCQkJICAgICAgXAorCSAgICAgIHBvcyA9IHRtcCwJCQkJCQkgICAgICBcCisJICAgICAgdG1wID0gbGlzdF9lbnRyeSAoIHRtcC0+bWVtYmVyLm5leHQsIHR5cGVvZiAoICp0bXAgKSwgbWVtYmVyICkgKQorCisjZW5kaWYgLyogX0dQWEVfTElTVF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbG9naW5fdWkuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9sb2dpbl91aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTZmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbG9naW5fdWkuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9HUFhFX0xPR0lOX1VJX0gKKyNkZWZpbmUgX0dQWEVfTE9HSU5fVUlfSAorCisvKiogQGZpbGUKKyAqCisgKiBMb2dpbiBVSQorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK2V4dGVybiBpbnQgbG9naW5fdWkgKCB2b2lkICk7CisKKyNlbmRpZiAvKiBfR1BYRV9MT0dJTl9VSV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbWFsbG9jLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyYTg2NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9tYWxsb2MuaApAQCAtMCwwICsxLDU5IEBACisjaWZuZGVmIF9HUFhFX01BTExPQ19ICisjZGVmaW5lIF9HUFhFX01BTExPQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqIEBmaWxlCisgKgorICogRHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qCisgKiBQcm90b3R5cGVzIGZvciB0aGUgc3RhbmRhcmQgZnVuY3Rpb25zIChtYWxsb2MoKSBldCBhbCkgYXJlIGluCisgKiBzdGRsaWIuaC4gIEluY2x1ZGUgPGdweGUvbWFsbG9jLmg+IG9ubHkgaWYgeW91IG5lZWQgdGhlCisgKiBub24tc3RhbmRhcmQgZnVuY3Rpb25zLCBzdWNoIGFzIG1hbGxvY19kbWEoKS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworZXh0ZXJuIHNpemVfdCBmcmVlbWVtOworCitleHRlcm4gdm9pZCAqIF9fbWFsbG9jIGFsbG9jX21lbWJsb2NrICggc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiApOworZXh0ZXJuIHZvaWQgZnJlZV9tZW1ibG9jayAoIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgKTsKK2V4dGVybiB2b2lkIG1wb3B1bGF0ZSAoIHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuICk7CitleHRlcm4gdm9pZCBtZHVtcGZyZWUgKCB2b2lkICk7CisKKy8qKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciBETUEKKyAqCisgKiBAdiBzaXplCQlSZXF1ZXN0ZWQgc2l6ZQorICogQHYgYWxpZ24JCVBoeXNpY2FsIGFsaWdubWVudAorICogQHJldCBwdHIJCU1lbW9yeSwgb3IgTlVMTAorICoKKyAqIEFsbG9jYXRlcyBwaHlzaWNhbGx5LWFsaWduZWQgbWVtb3J5IGZvciBETUEuCisgKgorICogQGMgYWxpZ24gbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gIEBjIHNpemUgbWF5IG5vdCBiZSB6ZXJvLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKiBfX21hbGxvYyBtYWxsb2NfZG1hICggc2l6ZV90IHNpemUsIHNpemVfdCBwaHlzX2FsaWduICkgeworCXJldHVybiBhbGxvY19tZW1ibG9jayAoIHNpemUsIHBoeXNfYWxpZ24gKTsKK30KKworLyoqCisgKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2NfZG1hKCkKKyAqCisgKiBAdiBwdHIJCU1lbW9yeSBhbGxvY2F0ZWQgYnkgbWFsbG9jX2RtYSgpLCBvciBOVUxMCisgKiBAdiBzaXplCQlTaXplIG9mIG1lbW9yeSwgYXMgcGFzc2VkIHRvIG1hbGxvY19kbWEoKQorICoKKyAqIE1lbW9yeSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2NfZG1hKCkgY2FuIG9ubHkgYmUgZnJlZWQgd2l0aAorICogZnJlZV9kbWEoKTsgaXQgY2Fubm90IGJlIGZyZWVkIHdpdGggdGhlIHN0YW5kYXJkIGZyZWUoKS4KKyAqCisgKiBJZiBAYyBwdHIgaXMgTlVMTCwgbm8gYWN0aW9uIGlzIHRha2VuLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9kbWEgKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICkgeworCWZyZWVfbWVtYmxvY2sgKCBwdHIsIHNpemUgKTsKK30KKworI2VuZGlmIC8qIF9HUFhFX01BTExPQ19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbWNhLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbWNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5ZDczZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9tY2EuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIE1DQSBidXMgZHJpdmVyIGNvZGUKKyAqCisgKiBBYnN0cmFjdGVkIGZyb20gM2M1MDkuYy4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaWZuZGVmIE1DQV9ICisjZGVmaW5lIE1DQV9ICisKKyNpbmNsdWRlIDxncHhlL2lzYV9pZHMuaD4KKyNpbmNsdWRlIDxncHhlL2RldmljZS5oPgorI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisKKy8qCisgKiBNQ0EgY29uc3RhbnRzCisgKgorICovCisjZGVmaW5lIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcJMHg5NAorI2RlZmluZSBNQ0FfQURBUFRFUl9TRVRVUF9SRUcJCTB4OTYKKyNkZWZpbmUgTUNBX01BWF9TTE9UX05SCQkJMHgwNwkvKiBNdXN0IGJlIDJebiAtIDEgKi8KKyNkZWZpbmUgTUNBX1BPU19SRUcobikJCQkoMHgxMDArKG4pKQorCisvKiBJcyB0aGVyZSBhIHN0YW5kYXJkIHRoYXQgd291bGQgZGVmaW5lIHRoaXM/ICovCisjZGVmaW5lIEdFTkVSSUNfTUNBX1ZFTkRPUiBJU0FfVkVORE9SICggJ00nLCAnQycsICdBJyApCisKKy8qKiBBbiBNQ0EgZGV2aWNlIElEIGxpc3QgZW50cnkgKi8KK3N0cnVjdCBtY2FfZGV2aWNlX2lkIHsKKwkvKiogTmFtZSAqLworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworCS8qKiBEZXZpY2UgSUQgKi8KKwl1aW50MTZfdCBpZDsKK307CisKKy8qKiBBbiBNQ0EgZGV2aWNlICovCitzdHJ1Y3QgbWNhX2RldmljZSB7CisJLyoqIEdlbmVyaWMgZGV2aWNlICovCisJc3RydWN0IGRldmljZSBkZXY7CisJLyoqIFNsb3QgbnVtYmVyICovCisJdW5zaWduZWQgaW50IHNsb3Q7CisJLyoqIFBPUyByZWdpc3RlciB2YWx1ZXMgKi8KKwl1bnNpZ25lZCBjaGFyIHBvc1s4XTsKKwkvKiogRHJpdmVyIGZvciB0aGlzIGRldmljZSAqLworCXN0cnVjdCBtY2FfZHJpdmVyICpkcml2ZXI7CisJLyoqIERyaXZlci1wcml2YXRlIGRhdGEKKwkgKgorCSAqIFVzZSBtY2Ffc2V0X2RydmRhdGEoKSBhbmQgbWNhX2dldF9kcnZkYXRhKCkgdG8gYWNjZXNzCisJICogdGhpcyBmaWVsZC4KKwkgKi8KKwl2b2lkICpwcml2OworCS8qKiBEcml2ZXIgbmFtZSAqLworCWNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lOworfTsKKworI2RlZmluZSBNQ0FfSUQobWNhKSAoICggKG1jYSktPnBvc1sxXSA8PCA4ICkgKyAobWNhKS0+cG9zWzBdICkKKworLyoqIEFuIE1DQSBkcml2ZXIgKi8KK3N0cnVjdCBtY2FfZHJpdmVyIHsKKwkvKiogTUNBIElEIHRhYmxlICovCisJc3RydWN0IG1jYV9kZXZpY2VfaWQgKmlkczsKKwkvKiogTnVtYmVyIG9mIGVudHJpZXMgaW4gTUNBIElEIHRhYmxlICovCisJdW5zaWduZWQgaW50IGlkX2NvdW50OworCS8qKgorCSAqIFByb2JlIGRldmljZQorCSAqCisJICogQHYgbWNhCU1DQSBkZXZpY2UKKwkgKiBAdiBpZAlNYXRjaGluZyBlbnRyeSBpbiBJRCB0YWJsZQorCSAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBwcm9iZSApICggc3RydWN0IG1jYV9kZXZpY2UgKm1jYSwKKwkJCSAgY29uc3Qgc3RydWN0IG1jYV9kZXZpY2VfaWQgKmlkICk7CisJLyoqCisJICogUmVtb3ZlIGRldmljZQorCSAqCisJICogQHYgbWNhCU1DQSBkZXZpY2UKKwkgKi8KKwl2b2lkICggKiByZW1vdmUgKSAoIHN0cnVjdCBtY2FfZGV2aWNlICptY2EgKTsKK307CisKKy8qKiBNQ0EgZHJpdmVyIHRhYmxlICovCisjZGVmaW5lIE1DQV9EUklWRVJTIF9fdGFibGUgKCBzdHJ1Y3QgbWNhX2RyaXZlciwgIm1jYV9kcml2ZXJzIiApCisKKy8qKiBEZWNsYXJlIGFuIE1DQSBkcml2ZXIgKi8KKyNkZWZpbmUgX19tY2FfZHJpdmVyIF9fdGFibGVfZW50cnkgKCBNQ0FfRFJJVkVSUywgMDEgKQorCisvKioKKyAqIFNldCBNQ0EgZHJpdmVyLXByaXZhdGUgZGF0YQorICoKKyAqIEB2IG1jYQkJTUNBIGRldmljZQorICogQHYgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2Ffc2V0X2RydmRhdGEgKCBzdHJ1Y3QgbWNhX2RldmljZSAqbWNhLCB2b2lkICpwcml2ICkgeworCW1jYS0+cHJpdiA9IHByaXY7Cit9CisKKy8qKgorICogR2V0IE1DQSBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgbWNhCQlNQ0EgZGV2aWNlCisgKiBAcmV0IHByaXYJCVByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKiBtY2FfZ2V0X2RydmRhdGEgKCBzdHJ1Y3QgbWNhX2RldmljZSAqbWNhICkgeworCXJldHVybiBtY2EtPnByaXY7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL21kNS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDY1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbWQ1LmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfR1BYRV9NRDVfSAorI2RlZmluZSBfR1BYRV9NRDVfSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBkaWdlc3RfYWxnb3JpdGhtOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgTUQ1X0RJR0VTVF9TSVpFCQkxNgorI2RlZmluZSBNRDVfQkxPQ0tfV09SRFMJCTE2CisjZGVmaW5lIE1ENV9IQVNIX1dPUkRTCQk0CisKK3N0cnVjdCBtZDVfY3R4IHsKKwl1MzIgaGFzaFtNRDVfSEFTSF9XT1JEU107CisJdTMyIGJsb2NrW01ENV9CTE9DS19XT1JEU107CisJdTY0IGJ5dGVfY291bnQ7Cit9OworCisjZGVmaW5lIE1ENV9DVFhfU0laRSBzaXplb2YgKCBzdHJ1Y3QgbWQ1X2N0eCApCisKK2V4dGVybiBzdHJ1Y3QgZGlnZXN0X2FsZ29yaXRobSBtZDVfYWxnb3JpdGhtOworCisjZW5kaWYgLyogX0dQWEVfTUQ1X0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9tZW1tYXAuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9tZW1tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzViZWMzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL21lbW1hcC5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX0dQWEVfTUVNTUFQX0gKKyNkZWZpbmUgX0dQWEVfTUVNTUFQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIEBmaWxlCisgKgorICogTWVtb3J5IG1hcHBpbmcKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogQSB1c2FibGUgbWVtb3J5IHJlZ2lvbiAqLworc3RydWN0IG1lbW9yeV9yZWdpb24geworCS8qKiBQaHlzaWNhbCBzdGFydCBhZGRyZXNzICovCisJdWludDY0X3Qgc3RhcnQ7CisJLyoqIFBoeXNpY2FsIGVuZCBhZGRyZXNzICovCisJdWludDY0X3QgZW5kOworfTsKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIG1lbW9yeSByZWdpb25zIHdlIGV4cGVjdCB0byBlbmNvdW50ZXIgKi8KKyNkZWZpbmUgTUFYX01FTU9SWV9SRUdJT05TIDgKKworLyoqIEEgbWVtb3J5IG1hcCAqLworc3RydWN0IG1lbW9yeV9tYXAgeworCS8qKiBNZW1vcnkgcmVnaW9ucyAqLworCXN0cnVjdCBtZW1vcnlfcmVnaW9uIHJlZ2lvbnNbTUFYX01FTU9SWV9SRUdJT05TXTsKKwkvKiogTnVtYmVyIG9mIHVzZWQgcmVnaW9ucyAqLworCXVuc2lnbmVkIGludCBjb3VudDsKK307CisKK2V4dGVybiB2b2lkIGdldF9tZW1tYXAgKCBzdHJ1Y3QgbWVtb3J5X21hcCAqbWVtbWFwICk7CisKKyNlbmRpZiAvKiBfR1BYRV9NRU1NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL21vbm9qb2IuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9tb25vam9iLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmZjRmZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9tb25vam9iLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfR1BYRV9NT05PSk9CX0gKKyNkZWZpbmUgX0dQWEVfTU9OT0pPQl9ICisKKy8qKiBAZmlsZQorICoKKyAqIFNpbmdsZSBmb3JlZ3JvdW5kIGpvYgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBqb2JfaW50ZXJmYWNlOworCitleHRlcm4gc3RydWN0IGpvYl9pbnRlcmZhY2UgbW9ub2pvYjsKK2V4dGVybiBpbnQgbW9ub2pvYl93YWl0ICggY29uc3QgY2hhciAqc3RyaW5nICk7CisKKyNlbmRpZiAvKiBfR1BYRV9NT05PSk9CX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9uYXAuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9uYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJlNDBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL25hcC5oCkBAIC0wLDAgKzEsNTYgQEAKKyNpZm5kZWYgX0dQWEVfTkFQX0gKKyNkZWZpbmUgX0dQWEVfTkFQX0gKKworLyoqIEBmaWxlCisgKgorICogQ1BVIHNsZWVwaW5nCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvYXBpLmg+CisjaW5jbHVkZSA8Y29uZmlnL25hcC5oPgorCisvKioKKyAqIENhbGN1bGF0ZSBzdGF0aWMgaW5saW5lIENQVSBzbGVlcGluZyBBUEkgZnVuY3Rpb24gbmFtZQorICoKKyAqIEB2IF9wcmVmaXgJCVN1YnN5c3RlbSBwcmVmaXgKKyAqIEB2IF9hcGlfZnVuYwkJQVBJIGZ1bmN0aW9uCisgKiBAcmV0IF9zdWJzeXNfZnVuYwlTdWJzeXN0ZW0gQVBJIGZ1bmN0aW9uCisgKi8KKyNkZWZpbmUgTkFQX0lOTElORSggX3N1YnN5cywgX2FwaV9mdW5jICkgXAorCVNJTkdMRV9BUElfSU5MSU5FICggTkFQX1BSRUZJWF8gIyMgX3N1YnN5cywgX2FwaV9mdW5jICkKKworLyoqCisgKiBQcm92aWRlIGFuIENQVSBzbGVlcGluZyBBUEkgaW1wbGVtZW50YXRpb24KKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICogQHYgX2Z1bmMJCUltcGxlbWVudGluZyBmdW5jdGlvbgorICovCisjZGVmaW5lIFBST1ZJREVfTkFQKCBfc3Vic3lzLCBfYXBpX2Z1bmMsIF9mdW5jICkgXAorCVBST1ZJREVfU0lOR0xFX0FQSSAoIE5BUF9QUkVGSVhfICMjIF9zdWJzeXMsIF9hcGlfZnVuYywgX2Z1bmMgKQorCisvKioKKyAqIFByb3ZpZGUgYSBzdGF0aWMgaW5saW5lIENQVSBzbGVlcGluZyBBUEkgaW1wbGVtZW50YXRpb24KKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICovCisjZGVmaW5lIFBST1ZJREVfTkFQX0lOTElORSggX3N1YnN5cywgX2FwaV9mdW5jICkgXAorCVBST1ZJREVfU0lOR0xFX0FQSV9JTkxJTkUgKCBOQVBfUFJFRklYXyAjIyBfc3Vic3lzLCBfYXBpX2Z1bmMgKQorCisvKiBJbmNsdWRlIGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgSS9PIEFQSSBoZWFkZXJzICovCisjaW5jbHVkZSA8Z3B4ZS9udWxsX25hcC5oPgorCisvKiBJbmNsdWRlIGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IEkvTyBBUEkgaGVhZGVycyAqLworI2luY2x1ZGUgPGJpdHMvbmFwLmg+CisKKy8qKgorICogU2xlZXAgdW50aWwgbmV4dCBDUFUgaW50ZXJydXB0CisgKgorICovCit2b2lkIGNwdV9uYXAgKCB2b2lkICk7CisKKyNlbmRpZiAvKiBfR1BYRV9OQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL25kcC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL25kcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMzJiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbmRwLmgKQEAgLTAsMCArMSwyMSBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3B4ZS9pY21wNi5oPgorI2luY2x1ZGUgPGdweGUvaXA2Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pbi5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvdGNwaXAuaD4KKworI2RlZmluZSBORFBfU1RBVEVfSU5WQUxJRCAwCisjZGVmaW5lIE5EUF9TVEFURV9JTkNPTVBMRVRFIDEKKyNkZWZpbmUgTkRQX1NUQVRFX1JFQUNIQUJMRSAyCisjZGVmaW5lIE5EUF9TVEFURV9ERUxBWSAzCisjZGVmaW5lIE5EUF9TVEFURV9QUk9CRSA0CisjZGVmaW5lIE5EUF9TVEFURV9TVEFMRSA1CisKK2ludCBuZHBfcmVzb2x2ZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpbjZfYWRkciAqc3JjLAorCQkgIHN0cnVjdCBpbjZfYWRkciAqZGVzdCwgdm9pZCAqZGVzdF9sbF9hZGRyICk7CitpbnQgbmRwX3Byb2Nlc3NfYWR2ZXJ0ICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3Rfc3JjLAorCQkJIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3RfZGVzdCApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL25ldDgwMjExLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbmV0ODAyMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjdlMDkxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL25ldDgwMjExLmgKQEAgLTAsMCArMSwxMTg2IEBACisjaWZuZGVmIF9HUFhFX05FVDgwMjExX0gKKyNkZWZpbmUgX0dQWEVfTkVUODAyMTFfSAorCisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL3JjODAyMTEuaD4KKworLyoqIEBmaWxlCisgKgorICogVGhlIGdQWEUgODAyLjExIE1BQyBsYXllci4KKyAqLworCisvKgorICogTWFqb3IgdGhpbmdzIE5PVCBZRVQgc3VwcG9ydGVkOgorICogLSBhbnkgdHlwZSBvZiBzZWN1cml0eQorICogLSA4MDIuMTFuCisgKgorICogTWFqb3IgdGhpbmdzIHRoYXQgcHJvYmFibHkgd2lsbCBORVZFUiBiZSBzdXBwb3J0ZWQsIGJhcnJpbmcgYQorICogY29tcGVsbGluZyB1c2UgY2FzZSBhbmQvb3IgY29ycG9yYXRlIHNwb25zb3JzaGlwOgorICogLSBRb1MKKyAqIC0gODAyLjFYIGF1dGhlbnRpY2F0aW9uICgiV1BBIEVudGVycHJpc2UiKQorICogLSBDb250ZW50aW9uLWZyZWUgcGVyaW9kcworICogLSAiYWQtaG9jIiBuZXR3b3JrcyAoSUJTUyksIG1vbml0b3IgbW9kZSwgaG9zdCBBUCBtb2RlCisgKiAtIGhpZGRlbiBuZXR3b3JrcyBvbiB0aGUgNUdIeiBiYW5kIGR1ZSB0byByZWd1bGF0b3J5IGlzc3VlcworICogLSBzcGVjdHJ1bSBtYW5hZ2VtZW50IG9uIHRoZSA1R0h6IGJhbmQgKFRQQyBhbmQgREZTKSwgYXMgcmVxdWlyZWQKKyAqICAgaW4gc29tZSBub24tVVMgcmVndWxhdG9yeSBkb21haW5zCisgKiAtIENsYXVzZSAxNCBQSFlzIChGcmVxdWVuY3ktSG9wcGluZyBTcHJlYWQgU3BlY3RydW0gb24gMi40R0h6KQorICogICBhbmQgQ2xhdXNlIDE2IFBIWXMgKGluZnJhcmVkKSAtIEknbSBub3QgYXdhcmUgb2YgYW55IHJlYWwtd29ybGQKKyAqICAgdXNlIG9mIHRoZXNlLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyogQWxsIDgwMi4xMSBkZXZpY2VzIGFyZSBoYW5kbGVkIHVzaW5nIGEgZ2VuZXJpYyAiODAyLjExIGRldmljZSIKKyAgIG5ldF9kZXZpY2UsIHdpdGggYSBsaW5rIGluIGl0cyBgcHJpdicgZmllbGQgdG8gYSBuZXQ4MDIxMV9kZXZpY2UKKyAgIHdoaWNoIHdlIHVzZSB0byBoYW5kbGUgODAyLjExLXNwZWNpZmljIGRldGFpbHMuICovCisKKworLyoqIEBkZWZncm91cCBuZXQ4MDIxMV9iYW5kIFJGIGJhbmRzIG9uIHdoaWNoIGFuIDgwMi4xMSBkZXZpY2UgY2FuIHRyYW5zbWl0ICovCisvKiogQHsgKi8KKworLyoqIFRoZSAyLjQgR0h6IElTTSBiYW5kLCB1bmxpY2Vuc2VkIGluIG1vc3QgY291bnRyaWVzICovCisjZGVmaW5lIE5FVDgwMjExX0JBTkRfMkdIWgkwCisvKiogVGhlIGJhbmQgZnJvbSA0LjkgR0h6IHRvIDUuNyBHSHosIHdoaWNoIHRlbmRzIHRvIGJlIG1vcmUgcmVzdHJpY3RlZCAqLworI2RlZmluZSBORVQ4MDIxMV9CQU5EXzVHSFoJMQorLyoqIE51bWJlciBvZiBSRiBiYW5kcyAqLworI2RlZmluZSBORVQ4MDIxMV9OUl9CQU5EUwkyCisKKy8qKiBCaXRtYXNrIGZvciB0aGUgMkdIeiBiYW5kICovCisjZGVmaW5lIE5FVDgwMjExX0JBTkRfQklUXzJHSFoJKDEgPDwgMCkKKy8qKiBCaXRtYXNrIGZvciB0aGUgNUdIeiBiYW5kICovCisjZGVmaW5lIE5FVDgwMjExX0JBTkRfQklUXzVHSFoJKDEgPDwgMSkKKworLyoqIEB9ICovCisKKworLyoqIEBkZWZncm91cCBuZXQ4MDIxMV9tb2RlIDgwMi4xMSBvcGVyYXRpb24gbW9kZXMgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlICovCisvKiogQHsgKi8KKworLyoqIDgwMi4xMWE6IDU0IE1icHMgb3BlcmF0aW9uIHVzaW5nIE9GRE0gc2lnbmFsaW5nIG9uIHRoZSA1R0h6IGJhbmQgKi8KKyNkZWZpbmUgTkVUODAyMTFfTU9ERV9BCQkoMSA8PCAwKQorCisvKiogODAyLjExYjogMS0xMSBNYnBzIG9wZXJhdGlvbiB1c2luZyBEU1NTL0NDSyBzaWduYWxpbmcgb24gdGhlIDIuNEdIeiBiYW5kICovCisjZGVmaW5lIE5FVDgwMjExX01PREVfQgkJKDEgPDwgMSkKKworLyoqIDgwMi4xMWc6IDU0IE1icHMgb3BlcmF0aW9uIHVzaW5nIEVSUC9PRkRNIHNpZ25hbGluZyBvbiB0aGUgMi40R0h6IGJhbmQgKi8KKyNkZWZpbmUgTkVUODAyMTFfTU9ERV9HCQkoMSA8PCAyKQorCisvKiogODAyLjExbjogSGlnaC1yYXRlIG9wZXJhdGlvbiB1c2luZyBNSU1PIHRlY2hub2xvZ3kgb24gMi40R0h6IG9yIDVHSHogKi8KKyNkZWZpbmUgTkVUODAyMTFfTU9ERV9OCQkoMSA8PCAzKQorCisvKiogQH0gKi8KKworCisvKiogQGRlZmdyb3VwIG5ldDgwMjExX2NmZyBDb25zdGFudHMgZm9yIHRoZSBuZXQ4MDIxMSBjb25maWcgY2FsbGJhY2sgKi8KKy8qKiBAeyAqLworCisvKiogQ2hhbm5lbCBjaG9pY2UgKEBjIGRldi0+Y2hhbm5lbCkgb3IgcmVndWxhdG9yeSBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZCAqLworI2RlZmluZSBORVQ4MDIxMV9DRkdfQ0hBTk5FTAkoMSA8PCAwKQorCisvKiogUmVxdWVzdGVkIHRyYW5zbWlzc2lvbiByYXRlIChAYyBkZXYtPnJhdGUpIGhhcyBjaGFuZ2VkICovCisjZGVmaW5lIE5FVDgwMjExX0NGR19SQVRFCSgxIDw8IDEpCisKKy8qKiBBc3NvY2lhdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCB3aXRoIGEgbmV3IEJTUyAoQGMgZGV2LT5ic3NpZCkgKi8KKyNkZWZpbmUgTkVUODAyMTFfQ0ZHX0FTU09DCSgxIDw8IDIpCisKKy8qKiBMb3ctbGV2ZWwgbGluayBwYXJhbWV0ZXJzIChzaG9ydCBwcmVhbWJsZSwgcHJvdGVjdGlvbiwgZXRjKSBoYXZlIGNoYW5nZWQgKi8KKyNkZWZpbmUgTkVUODAyMTFfQ0ZHX1BIWV9QQVJBTVMJKDEgPDwgMykKKworLyoqIEB9ICovCisKKworLyoqIEFuIDgwMi4xMSBzZWN1cml0eSBoYW5kc2hha2luZyBwcm90b2NvbCAqLworZW51bSBuZXQ4MDIxMV9zZWN1cml0eV9wcm90byB7CisJLyoqIE5vIHNlY3VyaXR5IGhhbmRzaGFraW5nCisJICoKKwkgKiBUaGlzIG1pZ2h0IGJlIHVzZWQgd2l0aCBhbiBvcGVuIG5ldHdvcmsgb3Igd2l0aCBXRVAsIGFzCisJICogV0VQIGRvZXMgbm90IGhhdmUgYSBjcnlwdG9ncmFwaGljIGhhbmRzaGFraW5nIHBoYXNlLgorCSAqLworCU5FVDgwMjExX1NFQ1BST1RfTk9ORSA9IDAsCisKKwkvKiogUHJlLXNoYXJlZCBrZXkgaGFuZHNoYWtpbmcKKwkgKgorCSAqIFRoaXMgaW1wbGVtZW50cyB0aGUgIldQQSBQZXJzb25hbCIgaGFuZHNoYWtlLiA4MDIuMVgKKwkgKiBhdXRoZW50aWNhdGlvbiBpcyBub3QgcGVyZm9ybWVkIC0tIHRoZSB1c2VyIHN1cHBsaWVzIGEKKwkgKiBwcmUtc2hhcmVkIGtleSBkaXJlY3RseSAtLSBidXQgdGhlcmUgaXMgYSA0LXdheSBoYW5kc2hha2UKKwkgKiBiZXR3ZWVuIGNsaWVudCBhbmQgQVAgdG8gdmVyaWZ5IHRoYXQgYm90aCBoYXZlIHRoZSBzYW1lIGtleQorCSAqIHdpdGhvdXQgcmV2ZWFsaW5nIHRoZSBjb250ZW50cyBvZiB0aGF0IGtleS4KKwkgKi8KKwlORVQ4MDIxMV9TRUNQUk9UX1BTSyA9IDEsCisKKwkvKiogRnVsbCBFQVAgODAyLjFYIGhhbmRzaGFraW5nCisJICoKKwkgKiBUaGlzIGltcGxlbWVudHMgdGhlICJXUEEgRW50ZXJwcmlzZSIgaGFuZHNoYWtlLCBjb25uZWN0aW5nCisJICogdG8gYW4gODAyLjFYIGF1dGhlbnRpY2F0aW9uIHNlcnZlciB0byBwcm92aWRlIGNyZWRlbnRpYWxzCisJICogYW5kIHJlY2VpdmUgYSBwYWlyd2lzZSBtYXN0ZXIga2V5IChQTUspLCB3aGljaCBpcyB0aGVuIHVzZWQKKwkgKiBpbiB0aGUgc2FtZSA0LXdheSBoYW5kc2hha2UgYXMgdGhlIFBTSyBtZXRob2QuCisJICovCisJTkVUODAyMTFfU0VDUFJPVF9FQVAgPSAyLAorCisJLyoqIER1bW15IHZhbHVlIHVzZWQgd2hlbiB0aGUgaGFuZHNoYWtpbmcgdHlwZSBjYW4ndCBiZSBkZXRlY3RlZCAqLworCU5FVDgwMjExX1NFQ1BST1RfVU5LTk9XTiA9IDMsCit9OworCisKKy8qKiBBbiA4MDIuMTEgZGF0YSBlbmNyeXB0aW9uIGFsZ29yaXRobSAqLworZW51bSBuZXQ4MDIxMV9jcnlwdG9fYWxnIHsKKwkvKiogTm8gc2VjdXJpdHksIGFuICJPcGVuIiBuZXR3b3JrICovCisJTkVUODAyMTFfQ1JZUFRfTk9ORSA9IDAsCisKKwkvKiogTmV0d29yayBwcm90ZWN0ZWQgd2l0aCBXRVAgKGF3ZnVsIFJDNC1iYXNlZCBzeXN0ZW0pCisJICoKKwkgKiBXRVAgdXNlcyBhIG5haXZlIGFwcGxpY2F0aW9uIG9mIFJDNCwgd2l0aCBhIG1vbm90b25pY2FsbHkKKwkgKiBpbmNyZWFzaW5nIGluaXRpYWxpemF0aW9uIHZlY3RvciB0aGF0IGlzIHByZXBlbmRlZCB0byB0aGUKKwkgKiBrZXkgdG8gaW5pdGlhbGl6ZSB0aGUgUkM0IGtleXN0cmVhbS4gSXQgaXMgaGlnaGx5IGluc2VjdXJlCisJICogYW5kIGNhbiBiZSBjb21wbGV0ZWx5IGNyYWNrZWQgb3Igc3VidmVydGVkIHVzaW5nIGF1dG9tYXRlZCwKKwkgKiByb2J1c3QsIGZyZWVseSBhdmFpbGFibGUgdG9vbHMgKGFpcmNyYWNrLW5nKSBpbiBtaW51dGVzLgorCSAqCisJICogNDAtYml0IGFuZCAxMDQtYml0IFdFUCBhcmUgZGlmZmVyZW50aWF0ZWQgb25seSBieSB0aGUgc2l6ZQorCSAqIG9mIHRoZSBrZXkuIFRoZXkgbWF5IGJlIGFkdmVydGlzZWQgYXMgNjQtYml0IGFuZCAxMjgtYml0LAorCSAqIGNvdW50aW5nIHRoZSBub24tcmFuZG9tIElWIGFzIHBhcnQgb2YgdGhlIGtleSBiaXRzLgorCSAqLworCU5FVDgwMjExX0NSWVBUX1dFUCA9IDEsCisKKwkvKiogTmV0d29yayBwcm90ZWN0ZWQgd2l0aCBUS0lQIChiZXR0ZXIgUkM0LWJhc2VkIHN5c3RlbSkKKwkgKgorCSAqIFVzdWFsbHkga25vd24gYnkgaXRzIHRyYWRlIG5hbWUgb2YgV1BBIChXaS1GaSBQcm90ZWN0ZWQKKwkgKiBBY2Nlc3MpLCBUS0lQIGltcGxlbWVudHMgYSBtZXNzYWdlIGludGVncml0eSBjb2RlIChNSUMpCisJICogY2FsbGVkIE1pY2hhZWwsIGEgdGltZXN0YW1wIGNvdW50ZXIgZm9yIHJlcGxheSBwcmV2ZW50aW9uLAorCSAqIGFuZCBhIGtleSBtaXhpbmcgZnVuY3Rpb24gdGhhdCB0b2dldGhlciByZW1vdmUgYWxtb3N0IGFsbAorCSAqIHRoZSBzZWN1cml0eSBwcm9ibGVtcyB3aXRoIFdFUC4gQ291bnRlcm1lYXN1cmVzIGFyZQorCSAqIGltcGxlbWVudGVkIHRvIHByZXZlbnQgaGlnaCBkYXRhLXJhdGUgYXR0YWNrcy4KKwkgKgorCSAqIFRoZXJlIGV4aXN0cyBvbmUga25vd24gYXR0YWNrIG9uIFRLSVAsIHRoYXQgYWxsb3dzIG9uZSB0bworCSAqIHNlbmQgYmV0d2VlbiA3IGFuZCAxNSBhcmJpdHJhcnkgc2hvcnQgZGF0YSBwYWNrZXRzIG9uIGEKKwkgKiBRb1MtZW5hYmxlZCBuZXR3b3JrIGdpdmVuIGFib3V0IGFuIGhvdXIgb2YgZGF0YQorCSAqIGdhdGhlcmluZy4gU2luY2UgZ1BYRSBkb2VzIG5vdCBzdXBwb3J0IFFvUyBmb3IgODAyLjExCisJICogbmV0d29ya3MsIHRoaXMgaXMgbm90IGEgdGhyZWF0IHRvIHVzLiBUaGUgb25seSBvdGhlciBtZXRob2QKKwkgKiBpcyBhIGJydXRlLWZvcmNlIHBhc3NwaHJhc2UgYXR0YWNrLgorCSAqLworCU5FVDgwMjExX0NSWVBUX1RLSVAgPSAyLAorCisJLyoqIE5ldHdvcmsgcHJvdGVjdGVkIHdpdGggQ0NNUCAoQUVTLWJhc2VkIHN5c3RlbSkKKwkgKgorCSAqIE9mdGVuIGNhbGxlZCBXUEEyIGluIGNvbW1lcmNlLCBvciBSU05BIChSb2J1c3QgU2VjdXJpdHkKKwkgKiBOZXR3b3JrIEFyY2hpdGVjdHVyZSkgaW4gdGhlIDgwMi4xMSBzdGFuZGFyZCwgQ0NNUCBpcworCSAqIGhpZ2hseSBzZWN1cmUgYW5kIGRvZXMgbm90IGhhdmUgYW55IGtub3duIGF0dGFjayB2ZWN0b3JzLgorCSAqIFNpbmNlIGl0IGlzIGJhc2VkIG9uIGEgYmxvY2sgY2lwaGVyLCB0aGUgc3RhdGlzdGljYWwKKwkgKiBjb3JyZWxhdGlvbiBhbmQgImNob3BjaG9wIiBhdHRhY2tzIHVzZWQgd2l0aCBncmVhdCBzdWNjZXNzCisJICogYWdhaW5zdCBXRVAgYW5kIG1pbm9yIHN1Y2Nlc3MgYWdhaW5zdCBUS0lQIGZhaWwuCisJICovCisJTkVUODAyMTFfQ1JZUFRfQ0NNUCA9IDMsCisKKwkvKiogRHVtbXkgdmFsdWUgdXNlZCB3aGVuIHRoZSBjcnlwdG9zeXN0ZW0gY2FuJ3QgYmUgZGV0ZWN0ZWQgKi8KKwlORVQ4MDIxMV9DUllQVF9VTktOT1dOID0gNCwKK307CisKKworLyoqIEBkZWZncm91cCBuZXQ4MDIxMV9zdGF0ZSBCaXRzIGZvciB0aGUgODAyLjExIGFzc29jaWF0aW9uIHN0YXRlIGZpZWxkICovCisvKiogQHsgKi8KKworLyoqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgZmFpbHVyZSBtb2RlLCBvciAwIGlmIHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgTkVUODAyMTFfU1RBVFVTX01BU0sgICAgMHg3RgorCisvKiogV2hldGhlciB0aGUgZXJyb3IgY29kZSBwcm92aWRlZCBpcyBhICJyZWFzb24iIGNvZGUsIG5vdCBhICJzdGF0dXMiIGNvZGUgKi8KKyNkZWZpbmUgTkVUODAyMTFfSVNfUkVBU09OCTB4ODAKKworLyoqIFdoZXRoZXIgd2UgaGF2ZSBmb3VuZCB0aGUgbmV0d29yayB3ZSB3aWxsIGJlIGFzc29jaWF0aW5nIHdpdGggKi8KKyNkZWZpbmUgTkVUODAyMTFfUFJPQkVECQkoMSA8PCA4KQorCisvKiogV2hldGhlciB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkIHdpdGggdGhlIG5ldHdvcmsKKyAqCisgKiBUaGlzIHVzdWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBhY3R1YWwgc2VjdXJpdHk7IGl0IGlzIGEKKyAqIGhvbGRvdmVyIGZyb20gb2xkZXIgODAyLjExIGltcGxlbWVudGF0aW9uIGlkZWFzLgorICovCisjZGVmaW5lIE5FVDgwMjExX0FVVEhFTlRJQ0FURUQgICgxIDw8IDkpCisKKy8qKiBXaGV0aGVyIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0d29yayAqLworI2RlZmluZSBORVQ4MDIxMV9BU1NPQ0lBVEVEICAgICAoMSA8PCAxMCkKKworLyoqIFdoZXRoZXIgd2UgaGF2ZSBjb21wbGV0ZWQgc2VjdXJpdHkgaGFuZHNoYWtpbmcgd2l0aCB0aGUgbmV0d29yaworICoKKyAqIE9uY2UgdGhpcyBpcyBzZXQsIHdlIGNhbiBzZW5kIGRhdGEgcGFja2V0cy4gRm9yIHRoYXQgcmVhc29uIHRoaXMKKyAqIGJpdCBpcyBzZXQgZXZlbiBpbiBjYXNlcyB3aGVyZSBubyBzZWN1cml0eSBoYW5kc2hha2luZyBpcworICogcmVxdWlyZWQuCisgKi8KKyNkZWZpbmUgTkVUODAyMTFfQ1JZUFRPX1NZTkNFRCAgKDEgPDwgMTEpCisKKy8qKiBXaGV0aGVyIHRoZSBhdXRvLWFzc29jaWF0aW9uIHRhc2sgaXMgcnVubmluZyAqLworI2RlZmluZSBORVQ4MDIxMV9XT1JLSU5HICAgICAgICAoMSA8PCAxMikKKworLyoqIFdoZXRoZXIgdGhlIGF1dG8tYXNzb2NpYXRpb24gdGFzayBpcyB3YWl0aW5nIGZvciBhIHJlcGx5IGZyb20gdGhlIEFQICovCisjZGVmaW5lIE5FVDgwMjExX1dBSVRJTkcgICAgICAgICgxIDw8IDEzKQorCisvKiogV2hldGhlciB0aGUgYXV0by1hc3NvY2lhdGlvbiB0YXNrIHNob3VsZCBiZSBzdXBwcmVzc2VkCisgKgorICogVGhpcyBpcyBzZXQgYnkgdGhlIGBpd2xpc3QnIGNvbW1hbmQgc28gdGhhdCBpdCBjYW4gb3BlbiB0aGUgZGV2aWNlCisgKiB3aXRob3V0IHN0YXJ0aW5nIGFub3RoZXIgcHJvYmUgcHJvY2VzcyB0aGF0IHdpbGwgaW50ZXJmZXJlIHdpdGggaXRzCisgKiBvd24uCisgKi8KKyNkZWZpbmUgTkVUODAyMTFfTk9fQVNTT0MJKDEgPDwgMTQpCisKKy8qKiBXaGV0aGVyIHRoaXMgYXNzb2NpYXRpb24gd2FzIHBlcmZvcm1lZCB1c2luZyBhIGJyb2FkY2FzdCBTU0lECisgKgorICogSWYgdGhlIHVzZXIgb3BlbmVkIHRoaXMgZGV2aWNlIHdpdGhvdXQgbmV0WC9zc2lkIHNldCwgdGhlIGRldmljZSdzCisgKiBTU0lEIHdpbGwgYmUgc2V0IHRvIHRoYXQgb2YgdGhlIG5ldHdvcmsgaXQgY2hvb3NlcyB0byBhc3NvY2lhdGUKKyAqIHdpdGgsIGJ1dCB0aGUgbmV0WC9zc2lkIHNldHRpbmcgd2lsbCByZW1haW4gYmxhbmsuIElmIHdlIGRvbid0CisgKiByZW1lbWJlciB0aGF0IHdlIHN0YXJ0ZWQgZnJvbSBubyBzcGVjaWZpZWQgU1NJRCwgaXQgd2lsbCBhcHBlYXIKKyAqIGV2ZXJ5IHRpbWUgc2V0dGluZ3MgYXJlIHVwZGF0ZWQgKGUuZy4gYWZ0ZXIgREhDUCkgdGhhdCB3ZSBuZWVkIHRvCisgKiByZWFzc29jaWF0ZSBkdWUgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2V0IFNTSUQgYW5kIG91ciBvd24uCisgKi8KKyNkZWZpbmUgTkVUODAyMTFfQVVUT19TU0lECSgxIDw8IDE1KQorCisKKy8qKiBAfSAqLworCisKKy8qKiBAZGVmZ3JvdXAgbmV0ODAyMTFfcGh5IDgwMi4xMSBwaHlzaWNhbCBsYXllciBmbGFncyAqLworLyoqIEB7ICovCisKKy8qKiBXaGV0aGVyIHRvIHVzZSBSVFMvQ1RTIG9yIENUUy10by1zZWxmIHByb3RlY3Rpb24gZm9yIHRyYW5zbWlzc2lvbnMKKyAqCisgKiBTaW5jZSB0aGUgUlRTIG9yIENUUyBpcyB0cmFuc21pdHRlZCB1c2luZyA4MDIuMTFiIHNpZ25hbGluZywgYW5kCisgKiBpbmNsdWRlcyBhIGZpZWxkIGluZGljYXRpbmcgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2lsbCBiZSB1c2VkIGJ5CisgKiB0cmFuc21pc3Npb24gb2YgdGhlIGZvbGxvd2luZyBwYWNrZXQsIHRoaXMgc2VydmVzIGFzIGFuIGVmZmVjdGl2ZQorICogcHJvdGVjdGlvbiBtZWNoYW5pc20gdG8gYXZvaWQgODAyLjExYiBjbGllbnRzIGludGVyZmVyaW5nIHdpdGgKKyAqIDgwMi4xMWcgY2xpZW50cyBvbiBtaXhlZCBuZXR3b3Jrcy4KKyAqLworI2RlZmluZSBORVQ4MDIxMV9QSFlfVVNFX1BST1RFQ1RJT04gICAgICAoMSA8PCAxKQorCisvKiogV2hldGhlciB0byB1c2UgODAyLjExYiBzaG9ydCBwcmVhbWJsZSBvcGVyYXRpb24KKyAqCisgKiBTaG9ydC1wcmVhbWJsZSBvcGVyYXRpb24gY2FuIG1vZGVyYXRlbHkgaW5jcmVhc2UgdGhyb3VnaHB1dCBvbgorICogODAyLjExYiBuZXR3b3JrcyBvcGVyYXRpbmcgYmV0d2VlbiAyTWJwcyBhbmQgMTFNYnBzLiBJdCBpcworICogaXJyZWxldmFudCBmb3IgODAyLjExZyBkYXRhIHJhdGVzLCBzaW5jZSB0aGV5IHVzZSBhIGRpZmZlcmVudAorICogbW9kdWxhdGlvbiBzY2hlbWUuCisgKi8KKyNkZWZpbmUgTkVUODAyMTFfUEhZX1VTRV9TSE9SVF9QUkVBTUJMRSAgKDEgPDwgMikKKworLyoqIFdoZXRoZXIgdG8gdXNlIDgwMi4xMWcgc2hvcnQgc2xvdCBvcGVyYXRpb24KKyAqCisgKiBUaGlzIGFmZmVjdHMgYSBsb3ctbGV2ZWwgdGltaW5nIHBhcmFtZXRlciBvZiA4MDIuMTFnIHRyYW5zbWlzc2lvbnMuCisgKi8KKyNkZWZpbmUgTkVUODAyMTFfUEhZX1VTRV9TSE9SVF9TTE9UICAgICAgKDEgPDwgMykKKworLyoqIEB9ICovCisKKworLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBUWCByYXRlcyB3ZSBhbGxvdyB0byBiZSBjb25maWd1cmVkIHNpbXVsdGFuZW91c2x5ICovCisjZGVmaW5lIE5FVDgwMjExX01BWF9SQVRFUwkxNgorCisvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHdlIGFsbG93IHRvIGJlIGNvbmZpZ3VyZWQgc2ltdWx0YW5lb3VzbHkgKi8KKyNkZWZpbmUgTkVUODAyMTFfTUFYX0NIQU5ORUxTCTMyCisKKy8qKiBTZWNvbmRzIHdlJ2xsIHdhaXQgdG8gZ2V0IGFsbCBmcmFnbWVudHMgb2YgYSBwYWNrZXQgKi8KKyNkZWZpbmUgTkVUODAyMTFfRlJBR19USU1FT1VUCTIKKworLyoqIFRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIHdlIGNhbiByZWNlaXZlIGF0IG9uY2UKKyAqCisgKiBUaGUgODAyLjExIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgdGhpcyBiZSBhdCBsZWFzdCAzLgorICovCisjZGVmaW5lIE5FVDgwMjExX05SX0NPTkNVUlJFTlRfRlJBR1MgMworCisvKiogTWF4aW11bSBUWCBwb3dlciB0byBhbGxvdyAoZEJtKSwgaWYgd2UgZG9uJ3QgZ2V0IGEgcmVndWxhdG9yeSBoaW50ICovCisjZGVmaW5lIE5FVDgwMjExX1JFR19UWFBPV0VSCTIwCisKKworc3RydWN0IG5ldDgwMjExX2RldmljZTsKKworLyoqIE9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFuIDgwMi4xMSBkcml2ZXIgKi8KK3N0cnVjdCBuZXQ4MDIxMV9kZXZpY2Vfb3BlcmF0aW9ucyB7CisJLyoqIE9wZW4gODAyLjExIGRldmljZQorCSAqCisJICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKwkgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorCSAqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsbG9jYXRlIFJYIEkvTyBidWZmZXJzIGFuZCBlbmFibGUgdGhlCisJICogaGFyZHdhcmUgdG8gc3RhcnQgdHJhbnNtaXR0aW5nIGFuZCByZWNlaXZpbmcgcGFja2V0cyBvbiB0aGUKKwkgKiBjaGFubmVscyBpdHMgbmV0ODAyMTFfcmVnaXN0ZXIoKSBjYWxsIGluZGljYXRlZCBpdCBjb3VsZAorCSAqIGhhbmRsZS4gSXQgZG9lcyBub3QgbmVlZCB0byB0dW5lIHRoZSBhbnRlbm5hIHRvIHJlY2VpdmUKKwkgKiBwYWNrZXRzIG9uIGFueSBwYXJ0aWN1bGFyIGNoYW5uZWwuCisJICovCisJaW50ICggKiBvcGVuICkgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKTsKKworCS8qKiBDbG9zZSA4MDIuMTEgbmV0d29yayBkZXZpY2UKKwkgKgorCSAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisJICoKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgc3RvcCB0aGUgZmxvdyBvZiBwYWNrZXRzLCBhbmQgY2FsbAorCSAqIG5ldDgwMjExX3R4X2NvbXBsZXRlKCkgZm9yIGFueSBwYWNrZXRzIHJlbWFpbmluZyBpbiB0aGUKKwkgKiBkZXZpY2UncyBUWCBxdWV1ZS4KKwkgKi8KKwl2b2lkICggKiBjbG9zZSApICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICk7CisKKwkvKiogVHJhbnNtaXQgcGFja2V0IG9uIDgwMi4xMSBuZXR3b3JrIGRldmljZQorCSAqCisJICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKwkgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisJICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBjYXVzZSB0aGUgaGFyZHdhcmUgdG8gaW5pdGlhdGUKKwkgKiB0cmFuc21pc3Npb24gb2YgdGhlIEkvTyBidWZmZXIsIHVzaW5nIHRoZSBjaGFubmVsIGFuZCByYXRlCisJICogbW9zdCByZWNlbnRseSBpbmRpY2F0ZWQgYnkgYW4gYXBwcm9wcmlhdGUgY2FsbCB0byB0aGUKKwkgKiBAYyBjb25maWcgY2FsbGJhY2suIFRoZSA4MDIuMTEgbGF5ZXIgZ3VhcmFudGVlcyB0aGF0IHNhaWQKKwkgKiBjaGFubmVsIGFuZCByYXRlIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhvc2UgY3VycmVudGx5CisJICogcmVmbGVjdGVkIGluIHRoZSBmaWVsZHMgb2YgQGEgZGV2LgorCSAqCisJICogSWYgdGhpcyBtZXRob2QgcmV0dXJucyBzdWNjZXNzLCB0aGUgSS9PIGJ1ZmZlciByZW1haW5zCisJICogb3duZWQgYnkgdGhlIG5ldHdvcmsgbGF5ZXIncyBUWCBxdWV1ZSwgYW5kIHRoZSBkcml2ZXIgbXVzdAorCSAqIGV2ZW50dWFsbHkgY2FsbCBuZXQ4MDIxMV90eF9jb21wbGV0ZSgpIHRvIGZyZWUgdGhlIGJ1ZmZlcgorCSAqIHdoZXRoZXIgdHJhbnNtaXNzaW9uIHN1Y2NlZWRlZCBvciBub3QuIElmIHRoaXMgbWV0aG9kCisJICogcmV0dXJucyBmYWlsdXJlLCBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzICJmYWlsdXJlIHRvCisJICogZW5xdWV1ZSBidWZmZXIiIGFuZCB0aGUgSS9PIGJ1ZmZlciB3aWxsIGJlIGltbWVkaWF0ZWx5CisJICogcmVsZWFzZWQuCisJICoKKwkgKiBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGRldmljZQorCSAqIGlzIG9wZW4uCisJICovCisJaW50ICggKiB0cmFuc21pdCApICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApOworCisJLyoqIFBvbGwgZm9yIGNvbXBsZXRlZCBhbmQgcmVjZWl2ZWQgcGFja2V0cworCSAqCisJICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKwkgKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBjYXVzZSB0aGUgaGFyZHdhcmUgdG8gY2hlY2sgZm9yCisJICogY29tcGxldGVkIHRyYW5zbWlzc2lvbnMgYW5kIHJlY2VpdmVkIHBhY2tldHMuIEFueSByZWNlaXZlZAorCSAqIHBhY2tldHMgc2hvdWxkIGJlIGRlbGl2ZXJlZCB2aWEgbmV0ODAyMTFfcngoKSwgYW5kCisJICogY29tcGxldGVkIHRyYW5zbWlzc2lvbnMgc2hvdWxkIGJlIGluZGljYXRlZCB1c2luZworCSAqIG5ldDgwMjExX3R4X2NvbXBsZXRlKCkuCisJICoKKwkgKiBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGRldmljZQorCSAqIGlzIG9wZW4uCisJICovCisJdm9pZCAoICogcG9sbCApICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICk7CisKKwkvKiogRW5hYmxlIG9yIGRpc2FibGUgaW50ZXJydXB0cworCSAqCisJICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKwkgKiBAdiBlbmFibGUJSWYgVFJVRSwgaW50ZXJydXB0cyBzaG91bGQgYmUgZW5hYmxlZAorCSAqLworCXZvaWQgKCAqIGlycSApICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgZW5hYmxlICk7CisKKwkvKiogVXBkYXRlIGhhcmR3YXJlIHN0YXRlIHRvIG1hdGNoIDgwMi4xMSBsYXllciBzdGF0ZQorCSAqCisJICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKwkgKiBAdiBjaGFuZ2VkCVNldCBvZiBmbGFncyBpbmRpY2F0aW5nIHdoYXQgbWF5IGhhdmUgY2hhbmdlZAorCSAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisJICoKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgY2F1c2UgdGhlIGhhcmR3YXJlIHN0YXRlIHRvIGJlCisJICogcmVpbml0aWFsaXplZCBmcm9tIHRoZSBzdGF0ZSBpbmRpY2F0ZWQgaW4gZmllbGRzIG9mCisJICogbmV0ODAyMTFfZGV2aWNlLCBpbiB0aGUgYXJlYXMgaW5kaWNhdGVkIGJ5IGJpdHMgc2V0IGluCisJICogQGEgY2hhbmdlZC4gSWYgdGhlIGhhcmR3YXJlIGlzIHVuYWJsZSB0byBkbyBzbywgdGhpcyBtZXRob2QKKwkgKiBtYXkgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGVycm9yIGluZGljYXRpb24uCisJICoKKwkgKiBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGRldmljZQorCSAqIGlzIG9wZW4uCisJICovCisJaW50ICggKiBjb25maWcgKSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IGNoYW5nZWQgKTsKK307CisKKy8qKiBBbiA4MDIuMTEgUkYgY2hhbm5lbC4gKi8KK3N0cnVjdCBuZXQ4MDIxMV9jaGFubmVsCit7CisJLyoqIFRoZSBiYW5kIHdpdGggd2hpY2ggdGhpcyBjaGFubmVsIGlzIGFzc29jaWF0ZWQgKi8KKwl1OCBiYW5kOworCisJLyoqIEEgY2hhbm5lbCBudW1iZXIgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBiYW5kCisJICoKKwkgKiBUaGUgMi40R0h6IGJhbmQgdXNlcyBjaGFubmVsIG51bWJlcnMgZnJvbSAxLTEzIGF0IDVNSHoKKwkgKiBpbnRlcnZhbHMgc3VjaCB0aGF0IGNoYW5uZWwgMSBpcyAyNDA3IE1IejsgY2hhbm5lbCAxNCwKKwkgKiBsZWdhbCBmb3IgdXNlIG9ubHkgaW4gSmFwYW4sIGlzIGRlZmluZWQgc2VwYXJhdGVseSBhcyAyNDg0CisJICogTUh6LiBBZGphY2VudCBjaGFubmVscyB3aWxsIG92ZXJsYXAsIHNpbmNlIDgwMi4xMQorCSAqIHRyYW5zbWlzc2lvbnMgdXNlIGEgMjAgTUh6ICg0LWNoYW5uZWwpIGJhbmR3aWR0aC4gTW9zdAorCSAqIGNvbW1vbmx5LCBjaGFubmVscyAxLCA2LCBhbmQgMTEgYXJlIHVzZWQuCisJICoKKwkgKiBUaGUgNUdIeiBiYW5kIHVzZXMgY2hhbm5lbCBudW1iZXJzIGRlcml2ZWQgZGlyZWN0bHkgZnJvbQorCSAqIHRoZSBmcmVxdWVuY3k7IGNoYW5uZWwgMCBpcyA1MDAwIE1IeiwgYW5kIGNoYW5uZWxzIGFyZQorCSAqIGFsd2F5cyBzcGFjZWQgNSBNSHogYXBhcnQuIENoYW5uZWwgbnVtYmVycyBvdmVyIDE4MCBhcmUKKwkgKiByZWxhdGl2ZSB0byA0R0h6IGluc3RlYWQgb2YgNUdIeiwgYnV0IHRoZXNlIGFyZSByYXJlbHkKKwkgKiBzZWVuLiBNb3N0IGNoYW5uZWxzIGFyZSBub3QgbGVnYWwgZm9yIHVzZS4KKwkgKi8KKwl1OCBjaGFubmVsX25yOworCisJLyoqIFRoZSBjZW50ZXIgZnJlcXVlbmN5IGZvciB0aGlzIGNoYW5uZWwKKwkgKgorCSAqIEN1cnJlbnRseSBhIGJhbmR3aWR0aCBvZiAyMCBNSHogaXMgYXNzdW1lZC4KKwkgKi8KKwl1MTYgY2VudGVyX2ZyZXE7CisKKwkvKiogSGFyZHdhcmUgY2hhbm5lbCB2YWx1ZSAqLworCXUxNiBod192YWx1ZTsKKworCS8qKiBNYXhpbXVtIGFsbG93YWJsZSB0cmFuc21pdCBwb3dlciwgaW4gZEJtCisJICoKKwkgKiBUaGlzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBFSVJQLCB0aGUgcG93ZXIgc3VwcGxpZWQgdG8KKwkgKiBhbiBpZGVhbCBpc290cm9waWMgYW50ZW5uYSBpbiBvcmRlciB0byBhY2hpZXZlIHRoZSBzYW1lCisJICogYXZlcmFnZSBzaWduYWwgaW50ZW5zaXR5IGFzIHRoZSByZWFsIGhhcmR3YXJlIGF0IGEKKwkgKiBwYXJ0aWN1bGFyIGRpc3RhbmNlLgorCSAqCisJICogQ3VycmVudGx5IG5vIHByb3Zpc2lvbiBpcyBtYWRlIGZvciBkaXJlY3Rpb25hbCBhbnRlbm5hcy4KKwkgKi8KKwl1OCBtYXhwb3dlcjsKK307CisKKy8qKiBJbmZvcm1hdGlvbiBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mIGFuIDgwMi4xMSBoYXJkd2FyZSBkZXZpY2UKKyAqCisgKiBJbiBpdHMgcHJvYmUgY2FsbGJhY2ssIGFuIDgwMi4xMSBkcml2ZXIgbXVzdCByZWFkIGhhcmR3YXJlCisgKiByZWdpc3RlcnMgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSwKKyAqIGZpbGwgaXQsIGFuZCBwYXNzIGl0IHRvIG5ldDgwMjExX3JlZ2lzdGVyKCkgc28gdGhhdCB0aGUgODAyLjExCisgKiBsYXllciBrbm93cyBob3cgdG8gdHJlYXQgdGhlIGhhcmR3YXJlIGFuZCB3aGF0IHRvIGFkdmVydGlzZSBhcworICogc3VwcG9ydGVkIHRvIGFjY2VzcyBwb2ludHMuCisgKi8KK3N0cnVjdCBuZXQ4MDIxMV9od19pbmZvCit7CisJLyoqIERlZmF1bHQgaGFyZHdhcmUgTUFDIGFkZHJlc3MuCisJICoKKwkgKiBUaGUgdXNlciBtYXkgY2hhbmdlIHRoaXMgYnkgc2V0dGluZyB0aGUgQGMgbmV0WC9tYWMgc2V0dGluZworCSAqIGJlZm9yZSB0aGUgZHJpdmVyJ3Mgb3BlbiBmdW5jdGlvbiBpcyBjYWxsZWQ7IGluIHRoYXQgY2FzZQorCSAqIHRoZSBkcml2ZXIgbXVzdCBzZXQgdGhlIGhhcmR3YXJlIE1BQyBhZGRyZXNzIHRvIHRoZSBhZGRyZXNzCisJICogY29udGFpbmVkIGluIHRoZSB3cmFwcGluZyBuZXRfZGV2aWNlJ3MgbGxfYWRkciBmaWVsZCwgb3IgaWYKKwkgKiB0aGF0IGlzIGltcG9zc2libGUsIHNldCB0aGF0IGxsX2FkZHIgZmllbGQgYmFjayB0byB0aGUKKwkgKiB1bmNoYW5nZWFibGUgaGFyZHdhcmUgTUFDIGFkZHJlc3MuCisJICovCisJdTggaHdhZGRyW0VUSF9BTEVOXTsKKworCS8qKiBBIGJpdHdpc2UgT1Igb2YgdGhlIDgwMi4xMXggbW9kZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlICovCisJaW50IG1vZGVzOworCisJLyoqIEEgYml0d2lzZSBPUiBvZiB0aGUgYmFuZHMgb24gd2hpY2ggdGhpcyBkZXZpY2UgY2FuIGNvbW11bmljYXRlICovCisJaW50IGJhbmRzOworCisJLyoqIEEgc2V0IG9mIGZsYWdzIGluZGljYXRpbmcgcGVjdWxpYXJpdGllcyBvZiB0aGlzIGRldmljZS4gKi8KKwllbnVtIHsKKwkJLyoqIFJlY2VpdmVkIGZyYW1lcyBpbmNsdWRlIGEgZnJhbWUgY2hlY2sgc2VxdWVuY2UuICovCisJCU5FVDgwMjExX0hXX1JYX0hBU19GQ1MgPSAoMSA8PCAxKSwKKworCQkvKiogSGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IDIuNEdIeiBzaG9ydCBwcmVhbWJsZXMKKwkJICoKKwkJICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciA4MDIuMTFiIG9wZXJhdGlvbiBhYm92ZQorCQkgKiAyTWJwcy4gQWxsIDgwMi4xMWcgZGV2aWNlcyBzdXBwb3J0IHNob3J0IHByZWFtYmxlcy4KKwkJICovCisJCU5FVDgwMjExX0hXX05PX1NIT1JUX1BSRUFNQkxFID0gKDEgPDwgMiksCisKKwkJLyoqIEhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCA4MDIuMTFnIHNob3J0IHNsb3Qgb3BlcmF0aW9uICovCisJCU5FVDgwMjExX0hXX05PX1NIT1JUX1NMT1QgPSAoMSA8PCAzKSwKKwl9IGZsYWdzOworCisJLyoqIFNpZ25hbCBzdHJlbmd0aCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBwcm92aWRlZCBieSB0aGUgZGV2aWNlCisJICoKKwkgKiBTaWduYWwgc3RyZW5ndGggaXMgcGFzc2VkIHRvIG5ldDgwMjExX3J4KCksIHByaW1hcmlseSB0bworCSAqIGFsbG93IGRldGVybWluYXRpb24gb2YgdGhlIGNsb3Nlc3QgYWNjZXNzIHBvaW50IGZvciBhCisJICogbXVsdGktQVAgbmV0d29yay4gVGhlIHVuaXRzIGFyZSBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzCisJICogb2Ygc3RhdHVzIGRpc3BsYXlzLgorCSAqLworCWVudW0geworCQkvKiogTm8gc2lnbmFsIHN0cmVuZ3RoIGluZm9ybWF0aW9uIHN1cHBvcnRlZCAqLworCQlORVQ4MDIxMV9TSUdOQUxfTk9ORSA9IDAsCisJCS8qKiBTaWduYWwgc3RyZW5ndGggaW4gYXJiaXRyYXJ5IHVuaXRzICovCisJCU5FVDgwMjExX1NJR05BTF9BUkJJVFJBUlksCisJCS8qKiBTaWduYWwgc3RyZW5ndGggaW4gZGVjaWJlbHMgcmVsYXRpdmUgdG8gYXJiaXRyYXJ5IGJhc2UgKi8KKwkJTkVUODAyMTFfU0lHTkFMX0RCLAorCQkvKiogU2lnbmFsIHN0cmVuZ3RoIGluIGRlY2liZWxzIHJlbGF0aXZlIHRvIDFtVyAqLworCQlORVQ4MDIxMV9TSUdOQUxfREJNLAorCX0gc2lnbmFsX3R5cGU7CisKKwkvKiogTWF4aW11bSBzaWduYWwgaW4gYXJiaXRyYXJ5IGNhc2VzCisJICoKKwkgKiBJZiBzaWduYWxfdHlwZSBpcyBORVQ4MDIxMV9TSUdOQUxfQVJCSVRSQVJZIG9yCisJICogTkVUODAyMTFfU0lHTkFMX0RCLCB0aGUgZHJpdmVyIHNob3VsZCByZXBvcnQgaXQgb24gYSBzY2FsZQorCSAqIGZyb20gMCB0byBzaWduYWxfbWF4LgorCSAqLworCXVuc2lnbmVkIHNpZ25hbF9tYXg7CisKKwkvKiogTGlzdCBvZiBSRiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQgKi8KKwlzdHJ1Y3QgbmV0ODAyMTFfY2hhbm5lbCBjaGFubmVsc1tORVQ4MDIxMV9NQVhfQ0hBTk5FTFNdOworCisJLyoqIE51bWJlciBvZiBzdXBwb3J0ZWQgY2hhbm5lbHMgKi8KKwlpbnQgbnJfY2hhbm5lbHM7CisKKwkvKiogTGlzdCBvZiB0cmFuc21pc3Npb24gcmF0ZXMgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkLCBpbmRleGVkIGJ5IGJhbmQKKwkgKgorCSAqIFJhdGVzIHNob3VsZCBiZSBpbiAxMDBrYnBzIGluY3JlbWVudHMgKGUuZy4gMTEgTWJwcyB3b3VsZAorCSAqIGJlIHJlcHJlc2VudGVkIGFzIHRoZSBudW1iZXIgMTEwKS4KKwkgKi8KKwl1MTYgcmF0ZXNbTkVUODAyMTFfTlJfQkFORFNdW05FVDgwMjExX01BWF9SQVRFU107CisKKwkvKiogTnVtYmVyIG9mIHN1cHBvcnRlZCByYXRlcywgaW5kZXhlZCBieSBiYW5kICovCisJaW50IG5yX3JhdGVzW05FVDgwMjExX05SX0JBTkRTXTsKKworCS8qKiBFc3RpbWF0ZSBvZiB0aGUgdGltZSByZXF1aXJlZCB0byBjaGFuZ2UgY2hhbm5lbHMsIGluIG1pY3Jvc2Vjb25kcworCSAqCisJICogSWYgdGhpcyBpcyBub3Qga25vd24sIGEgZ3Vlc3Mgb24gdGhlIG9yZGVyIG9mIGEgZmV3CisJICogbWlsbGlzZWNvbmRzICh2YWx1ZSBvZiAxMDAwLTUwMDApIGlzIHJlYXNvbmFibGUuCisJICovCisJdW5zaWduZWQgY2hhbm5lbF9jaGFuZ2VfdGltZTsKK307CisKKy8qKiBTdHJ1Y3R1cmUgdHJhY2tpbmcgcmVjZWl2ZWQgZnJhZ21lbnRzIGZvciBhIHBhY2tldAorICoKKyAqIFdlIHNldCB1cCBhIGZyYWdtZW50IGNhY2hlIGVudHJ5IHdoZW4gd2UgcmVjZWl2ZSBhIHBhY2tldCBtYXJrZWQgYXMKKyAqIGZyYWdtZW50IDAgd2l0aCB0aGUgIm1vcmUgZnJhZ21lbnRzIiBiaXQgc2V0IGluIGl0cyBmcmFtZSBjb250cm9sCisgKiBoZWFkZXIuIFdlIGFyZSByZXF1aXJlZCBieSB0aGUgODAyLjExIHN0YW5kYXJkIHRvIHRyYWNrIDMKKyAqIGZyYWdtZW50ZWQgcGFja2V0cyBhcnJpdmluZyBzaW11bHRhbmVvdXNseTsgaWYgd2UgcmVjZWl2ZSBtb3JlIHdlCisgKiBtYXkgZHJvcCBzb21lLiBVcG9uIHJlY2VpcHQgb2YgYSBuZXcgZnJhZ21lbnQtMCBwYWNrZXQsIGlmIG5vIGVudHJ5CisgKiBpcyBhdmFpbGFibGUgb3IgZXhwaXJlZCwgd2UgdGFrZSBvdmVyIHRoZSBtb3N0IEBlIHJlY2VudCBlbnRyeSBmb3IKKyAqIHRoZSBuZXcgcGFja2V0LCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIHN0YXJ2ZSBvbGQgZW50cmllcyBmcm9tIGV2ZXIKKyAqIGZpbmlzaGluZyBhdCBhbGwuIElmIHdlIGdldCBhIGZyYWdtZW50IGFmdGVyIHRoZSB6ZXJvdGggd2l0aCBubworICogY2FjaGUgZW50cnkgZm9yIGl0cyBwYWNrZXQsIHdlIGRyb3AgaXQuCisgKi8KK3N0cnVjdCBuZXQ4MDIxMV9mcmFnX2NhY2hlCit7CisJLyoqIFdoZXRoZXIgdGhpcyBjYWNoZSBlbnRyeSBpcyBpbiB1c2UgKi8KKwl1OCBpbl91c2U7CisKKwkvKiogU2VxdWVuY2UgbnVtYmVyIG9mIHRoaXMgTVNEVSAocGFja2V0KSAqLworCXUxNiBzZXFucjsKKworCS8qKiBUaW1lc3RhbXAgZnJvbSBwb2ludCBhdCB3aGljaCBmaXJzdCBmcmFnbWVudCB3YXMgY29sbGVjdGVkICovCisJdTMyIHN0YXJ0X3RpY2tzOworCisJLyoqIEJ1ZmZlcnMgZm9yIGVhY2ggZnJhZ21lbnQgKi8KKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2JbMTZdOworfTsKKworCisvKiogSW50ZXJmYWNlIHRvIGFuIDgwMi4xMSBzZWN1cml0eSBoYW5kc2hha2luZyBwcm90b2NvbAorICoKKyAqIFNlY3VyaXR5IGhhbmRzaGFraW5nIHByb3RvY29scyBoYW5kbGUgcGFyc2luZyBhIHVzZXItc3BlY2lmaWVkIGtleQorICogaW50byBhIHN1aXRhYmxlIGlucHV0IHRvIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobSwgYW5kIGZvciBXUEEgYW5kCisgKiBiZXR0ZXIgc3lzdGVtcywgbWFuYWdlIHBlcmZvcm1pbmcgd2hhdGV2ZXIgYXV0aGVudGljYXRpb24gd2l0aCB0aGUKKyAqIG5ldHdvcmsgaXMgbmVjZXNzYXJ5LgorICoKKyAqIEF0IGFsbCB0aW1lcyB3aGVuIGFueSBtZXRob2QgaW4gdGhpcyBzdHJ1Y3R1cmUgaXMgY2FsbGVkIHdpdGggYQorICogbmV0ODAyMTFfZGV2aWNlIGFyZ3VtZW50IEBhIGRldiwgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY29weSBvZgorICogdGhlIGhhbmRzaGFrZXIgc3RydWN0dXJlIGl0c2VsZiB3aXRoIHNwYWNlIGZvciB0aGUgcmVxdWVzdGVkIGFtb3VudAorICogb2YgcHJpdmF0ZSBkYXRhIG1heSBiZSBhY2Nlc3NlZCBhcyBAYyBkZXYtPmhhbmRzaGFrZXIuIFRoZQorICogc3RydWN0dXJlIHdpbGwgbm90IGJlIG1vZGlmaWVkLCBhbmQgd2lsbCBvbmx5IGJlIGZyZWVkIGR1cmluZworICogcmVhc3NvY2lhdGlvbiBhbmQgZGV2aWNlIGNsb3NpbmcgYWZ0ZXIgdGhlIEBhIHN0b3AgbWV0aG9kIGhhcyBiZWVuCisgKiBjYWxsZWQuCisgKi8KK3N0cnVjdCBuZXQ4MDIxMV9oYW5kc2hha2VyCit7CisJLyoqIFRoZSBzZWN1cml0eSBoYW5kc2hha2luZyBwcm90b2NvbCBpbXBsZW1lbnRlZCAqLworCWVudW0gbmV0ODAyMTFfc2VjdXJpdHlfcHJvdG8gcHJvdG9jb2w7CisKKwkvKiogSW5pdGlhbGl6ZSBzZWN1cml0eSBoYW5kc2hha2luZyBwcm90b2NvbAorCSAqCisJICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKwkgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorCSAqCisJICogVGhpcyBtZXRob2QgaXMgZXhwZWN0ZWQgdG8gYWNjZXNzIEBjIG5ldFgva2V5IG9yIG90aGVyCisJICogYXBwbGljYWJsZSBzZXR0aW5ncyB0byBkZXRlcm1pbmUgdGhlIHBhcmFtZXRlcnMgZm9yCisJICogaGFuZHNoYWtpbmcuIElmIG5vIGhhbmRzaGFraW5nIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgY2FsbAorCSAqIHNlYzgwMjExX2luc3RhbGwoKSB3aXRoIHRoZSBjcnlwdG9zeXN0ZW0gYW5kIGtleSB0aGF0IGFyZQorCSAqIHRvIGJlIHVzZWQsIGFuZCBAYyBzdGFydCBhbmQgQGMgc3RlcCBzaG91bGQgYmUgc2V0IHRvIEBjCisJICogTlVMTC4KKwkgKgorCSAqIFRoaXMgaXMgYWx3YXlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhc3NvY2lhdGlvbiBpcyBwZXJmb3JtZWQsCisJICogYnV0IGFmdGVyIGl0cyBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBzZXQ7IGluIHBhcnRpY3VsYXIsIHlvdQorCSAqIG1heSByZWx5IG9uIHRoZSBjb250ZW50cyBvZiB0aGUgQGEgZXNzaWQgZmllbGQgaW4gQGEgZGV2LgorCSAqLworCWludCAoICogaW5pdCApICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICk7CisKKwkvKiogU3RhcnQgaGFuZHNoYWtpbmcKKwkgKgorCSAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisJICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKgorCSAqIFRoaXMgbWV0aG9kIGlzIGV4cGVjdGVkIHRvIHNldCB1cCBpbnRlcm5hbCBzdGF0ZSBzbyB0aGF0CisJICogcGFja2V0cyBzZW50IGltbWVkaWF0ZWx5IGFmdGVyIGFzc29jaWF0aW9uLCBiZWZvcmUgQGEgc3RlcAorCSAqIGNhbiBiZSBjYWxsZWQsIHdpbGwgYmUgaGFuZGxlZCBhcHByb3ByaWF0ZWx5LgorCSAqCisJICogVGhpcyBpcyBhbHdheXMgY2FsbGVkIGp1c3QgYmVmb3JlIGFzc29jaWF0aW9uIGlzIGF0dGVtcHRlZC4KKwkgKi8KKwlpbnQgKCAqIHN0YXJ0ICkgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKTsKKworCS8qKiBQcm9jZXNzIGhhbmRzaGFraW5nIHN0YXRlCisJICoKKwkgKiBAdiBkZXYJODAyLjExIGRldmljZQorCSAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlLCBvciBwb3NpdGl2ZSBpZiBkb25lCisJICoKKwkgKiBUaGlzIG1ldGhvZCBpcyBleHBlY3RlZCB0byBwZXJmb3JtIGFzIG11Y2ggcHJvZ3Jlc3Mgb24gdGhlCisJICogcHJvdG9jb2wgaXQgaW1wbGVtZW50cyBhcyBpcyBwb3NzaWJsZSB3aXRob3V0IGJsb2NraW5nLiBJdAorCSAqIHNob3VsZCByZXR1cm4gMCBpZiBpdCB3aXNoZXMgdG8gYmUgY2FsbGVkIGFnYWluLCBhIG5lZ2F0aXZlCisJICogcmV0dXJuIHN0YXR1cyBjb2RlIG9uIGVycm9yLCBvciBhIHBvc2l0aXZlIHZhbHVlIGlmCisJICogaGFuZHNoYWtpbmcgaXMgY29tcGxldGUuIEluIHRoZSBjYXNlIG9mIGEgcG9zaXRpdmUgcmV0dXJuLAorCSAqIG5ldDgwMjExX2NyeXB0b19pbnN0YWxsKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCSAqCisJICogSWYgaGFuZHNoYWtpbmcgbWF5IHJlcXVpcmUgZnVydGhlciBhY3Rpb24gKGUuZy4gYW4gQVAgdGhhdAorCSAqIG1pZ2h0IGRlY2lkZSB0byByZWtleSksIGhhbmRsZXJzIG11c3QgYmUgaW5zdGFsbGVkIGJ5IHRoaXMKKwkgKiBmdW5jdGlvbiB0aGF0IHdpbGwgYWN0IHdpdGhvdXQgZnVydGhlciBjYWxscyB0byBAYSBzdGVwLgorCSAqLworCWludCAoICogc3RlcCApICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICk7CisKKwkvKiogQ2hhbmdlIGNyeXB0b2dyYXBoaWMga2V5IGJhc2VkIG9uIHNldHRpbmcKKwkgKgorCSAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisJICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgQGMgbmV0WC9rZXkgc2V0dGluZworCSAqIEBlIG1heSBoYXZlIGJlZW4gY2hhbmdlZC4gSXQgaXMgZXhwZWN0ZWQgdG8gZGV0ZXJtaW5lCisJICogd2hldGhlciBpdCBkaWQgaW4gZmFjdCBjaGFuZ2UsIGFuZCBpZiBzbywgdG8gaW5zdGFsbCB0aGUKKwkgKiBuZXcga2V5IHVzaW5nIG5ldDgwMjExX2NyeXB0b19pbnN0YWxsKCkuIElmIGl0IGlzIG5vdAorCSAqIHBvc3NpYmxlIHRvIGRvIHRoaXMgaW1tZWRpYXRlbHksIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4KKwkgKiBhbiBlcnJvcjsgaW4gdGhhdCBjYXNlIHRoZSA4MDIuMTEgc3RhY2sgd2lsbCByZWFzc29jaWF0ZSwKKwkgKiBmb2xsb3dpbmcgdGhlIHVzdWFsIGluaXQvc3RhcnQvc3RlcCBzZXF1ZW5jZS4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBpdCBpcyBwb3NzaWJsZSB0bworCSAqIGFzc29jaWF0ZSBzdWNjZXNzZnVsbHkgd2l0aCBhbiBpbmNvcnJlY3Qga2V5LiBXaGVuIGl0IGlzCisJICogbm90LCBhIGZhaWxlZCBhc3NvY2lhdGlvbiB3aWxsIGJlIHJldHJpZWQgdW50aWwgdGhlIHVzZXIKKwkgKiBjaGFuZ2VzIHRoZSBrZXkgc2V0dGluZywgYW5kIGEgc3VjY2Vzc2Z1bCBhc3NvY2lhdGlvbiB3aWxsCisJICogbm90IGJlIGRyb3BwZWQgZHVlIHRvIHN1Y2ggYSBjaGFuZ2UuIFdoZW4gYXNzb2NpYXRpb24gd2l0aAorCSAqIGFuIGluY29ycmVjdCBrZXkgaXMgaW1wb3NzaWJsZSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuCisJICogMCBhZnRlciBwZXJmb3JtaW5nIG5vIGFjdGlvbi4KKwkgKi8KKwlpbnQgKCAqIGNoYW5nZV9rZXkgKSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApOworCisJLyoqIFN0b3Agc2VjdXJpdHkgaGFuZHNoYWtpbmcgaGFuZGxlcnMKKwkgKgorCSAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisJICoKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBiZWZvcmUgZnJlZWluZyBhIHNlY3VyaXR5CisJICogaGFuZHNoYWtlcjsgaXQgY291bGQsIGZvciBleGFtcGxlLCBkZWxldGUgYSBwcm9jZXNzIHRoYXQgQGEKKwkgKiBzdGFydCBoYWQgY3JlYXRlZCB0byBtYW5hZ2UgdGhlIHNlY3VyaXR5IG9mIHRoZSBjb25uZWN0aW9uLgorCSAqIElmIG5vdCBuZWVkZWQgaXQgbWF5IGJlIHNldCB0byBOVUxMLgorCSAqLworCXZvaWQgKCAqIHN0b3AgKSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApOworCisJLyoqIEFtb3VudCBvZiBwcml2YXRlIGRhdGEgcmVxdWVzdGVkCisJICoKKwkgKiBCZWZvcmUgQGMgaW5pdCBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCB0aGlzIHN0cnVjdHVyZSdzCisJICogQGMgcHJpdiBwb2ludGVyIHdpbGwgcG9pbnQgdG8gdGhpcyBtYW55IGJ5dGVzIG9mIGFsbG9jYXRlZAorCSAqIGRhdGEsIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIHNlcGFyYXRlbHkgZm9yCisJICogZWFjaCBuZXQ4MDIxMV9kZXZpY2UuCisJICovCisJaW50IHByaXZfbGVuOworCisJLyoqIFdoZXRoZXIgQGEgc3RhcnQgaGFzIGJlZW4gY2FsbGVkCisJICoKKwkgKiBSZXNldCB0byAwIGFmdGVyIEBhIHN0b3AgaXMgY2FsbGVkLgorCSAqLworCWludCBzdGFydGVkOworCisJLyoqIFBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhCisJICoKKwkgKiBJbiBpbml0aWFsaXppbmcgdGhpcyBzdHJ1Y3R1cmUgc3RhdGljYWxseSBmb3IgYSBsaW5rZXIKKwkgKiB0YWJsZSwgc2V0IHRoaXMgdG8gTlVMTC4KKwkgKi8KKwl2b2lkICpwcml2OworfTsKKworI2RlZmluZSBORVQ4MDIxMV9IQU5EU0hBS0VSUyBfX3RhYmxlICggc3RydWN0IG5ldDgwMjExX2hhbmRzaGFrZXIsIFwKKwkJCQkgICAgICAgIm5ldDgwMjExX2hhbmRzaGFrZXJzIiApCisjZGVmaW5lIF9fbmV0ODAyMTFfaGFuZHNoYWtlciBfX3RhYmxlX2VudHJ5ICggTkVUODAyMTFfSEFORFNIQUtFUlMsIDAxICkKKworCisvKiogSW50ZXJmYWNlIHRvIGFuIDgwMi4xMSBjcnlwdG9zeXN0ZW0KKyAqCisgKiBDcnlwdG9zeXN0ZW1zIGRlZmluZSBhIG5ldDgwMjExX2NyeXB0byBzdHJ1Y3R1cmUgc3RhdGljYWxseSwgdXNpbmcKKyAqIGEgZ1BYRSBsaW5rZXIgdGFibGUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIDgwMi4xMSBsYXllci4gV2hlbgorICogdGhlIGNyeXB0b3N5c3RlbSBuZWVkcyB0byBiZSB1c2VkLCB0aGUgODAyLjExIGNvZGUgd2lsbCBhbGxvY2F0ZSBhCisgKiBjb3B5IG9mIHRoZSBzdGF0aWMgZGVmaW5pdGlvbiBwbHVzIHdoYXRldmVyIHNwYWNlIHRoZSBhbGdvcml0aG0gaGFzCisgKiByZXF1ZXN0ZWQgZm9yIHByaXZhdGUgc3RhdGUsIGFuZCBwb2ludCBuZXQ4MDIxMV9kZXZpY2U6OmNyeXB0byBvcgorICogbmV0ODAyMTFfZGV2aWNlOjpnY3J5cHRvIGF0IGl0LgorICovCitzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvCit7CisJLyoqIFRoZSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSBpbXBsZW1lbnRlZCAqLworCWVudW0gbmV0ODAyMTFfY3J5cHRvX2FsZyBhbGdvcml0aG07CisKKwkvKiogSW5pdGlhbGl6ZSBjcnlwdG9zeXN0ZW0gdXNpbmcgYSBnaXZlbiBrZXkKKwkgKgorCSAqIEB2IGNyeXB0bwk4MDIuMTEgY3J5cHRvc3lzdGVtCisJICogQHYga2V5CVBvaW50ZXIgdG8ga2V5IGJ5dGVzCisJICogQHYga2V5bGVuCU51bWJlciBvZiBrZXkgYnl0ZXMKKwkgKiBAdiByc2MJSW5pdGlhbCByZWNlaXZlIHNlcXVlbmNlIGNvdW50ZXIsIGlmIGFwcGxpY2FibGUKKwkgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorCSAqCisJICogVGhpcyBtZXRob2QgaXMgcGFzc2VkIHRoZSBjb21tdW5pY2F0aW9uIGtleSBwcm92aWRlZCBieSB0aGUKKwkgKiBzZWN1cml0eSBoYW5kc2hha2UgaGFuZGxlciwgd2hpY2ggd2lsbCBhbHJlYWR5IGJlIGluIHRoZQorCSAqIGxvdy1sZXZlbCBmb3JtIHJlcXVpcmVkLiBJdCBtYXkgbm90IHN0b3JlIGEgcG9pbnRlciB0byB0aGUKKwkgKiBrZXkgYWZ0ZXIgcmV0dXJuaW5nOyBpdCBtdXN0IGNvcHkgaXQgdG8gaXRzIHByaXZhdGUgc3RvcmFnZS4KKwkgKi8KKwlpbnQgKCAqIGluaXQgKSAoIHN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8gKmNyeXB0bywgY29uc3Qgdm9pZCAqa2V5LAorCQkJIGludCBrZXlsZW4sIGNvbnN0IHZvaWQgKnJzYyApOworCisJLyoqIEVuY3J5cHQgYSBmcmFtZSB1c2luZyB0aGUgY3J5cHRvc3lzdGVtCisJICoKKwkgKiBAdiBjcnlwdG8JODAyLjExIGNyeXB0b3N5c3RlbQorCSAqIEB2IGlvYglJL08gYnVmZmVyCisJICogQHJldCBlaW9iCU5ld2x5IGFsbG9jYXRlZCBJL08gYnVmZmVyIHdpdGggZW5jcnlwdGVkIHBhY2tldAorCSAqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGVuY3J5cHQgYSBzaW5nbGUgZnJhbWUuIEl0IGlzCisJICogZ3VhcmFudGVlZCB0aGF0IGluaXRpYWxpemUoKSB3aWxsIGhhdmUgY29tcGxldGVkCisJICogc3VjY2Vzc2Z1bGx5IGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisJICoKKwkgKiBUaGUgZnJhbWUgcGFzc2VkIGFscmVhZHkgaGFzIGFuIDgwMi4xMSBoZWFkZXIgcHJlcGVuZGVkLAorCSAqIGJ1dCB0aGUgUFJPVEVDVEVEIGJpdCBpbiB0aGUgZnJhbWUgY29udHJvbCBmaWVsZCB3aWxsIG5vdAorCSAqIGJlIHNldDsgdGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaXQuIFRoZQorCSAqIHJldHVybmVkIEkvTyBidWZmZXIgc2hvdWxkIGNvbnRhaW4gYSBjb21wbGV0ZSBjb3B5IG9mIEBhCisJICogaW9iLCBpbmNsdWRpbmcgdGhlIDgwMi4xMSBoZWFkZXIsIGJ1dCB3aXRoIHRoZSBQUk9URUNURUQKKwkgKiBiaXQgc2V0LCB0aGUgZGF0YSBlbmNyeXB0ZWQsIGFuZCB3aGF0ZXZlciBlbmNyeXB0aW9uCisJICogaGVhZGVycy90cmFpbGVycyBhcmUgbmVjZXNzYXJ5IGFkZGVkLgorCSAqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGZyZWUgdGhlIHBhc3NlZCBJL08gYnVmZmVyLgorCSAqCisJICogUmV0dXJuIE5VTEwgaWYgdGhlIHBhY2tldCBjb3VsZCBub3QgYmUgZW5jcnlwdGVkLCBkdWUgdG8KKwkgKiBtZW1vcnkgbGltaXRhdGlvbnMgb3Igb3RoZXJ3aXNlLgorCSAqLworCXN0cnVjdCBpb19idWZmZXIgKiAoICogZW5jcnlwdCApICggc3RydWN0IG5ldDgwMjExX2NyeXB0byAqY3J5cHRvLAorCQkJCQkgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2IgKTsKKworCS8qKiBEZWNyeXB0IGEgZnJhbWUgdXNpbmcgdGhlIGNyeXB0b3N5c3RlbQorCSAqCisJICogQHYgY3J5cHRvCTgwMi4xMSBjcnlwdG9zeXN0ZW0KKwkgKiBAdiBlaW9iCUVuY3J5cHRlZCBJL08gYnVmZmVyCisJICogQHJldCBpb2IJTmV3bHkgYWxsb2NhdGVkIEkvTyBidWZmZXIgd2l0aCBkZWNyeXB0ZWQgcGFja2V0CisJICoKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gZGVjcnlwdCBhIHNpbmdsZSBmcmFtZS4gSXQgaXMKKwkgKiBndWFyYW50ZWVkIHRoYXQgaW5pdGlhbGl6ZSgpIHdpbGwgaGF2ZSBjb21wbGV0ZWQKKwkgKiBzdWNjZXNzZnVsbHkgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKwkgKgorCSAqIERlY3J5cHRpb24gZm9sbG93cyB0aGUgcmV2ZXJzZSBvZiB0aGUgcGF0dGVybiB1c2VkIGZvcgorCSAqIGVuY3J5cHRpb246IHRoaXMgbWV0aG9kIG11c3QgY29weSB0aGUgODAyLjExIGhlYWRlciBpbnRvCisJICogdGhlIHJldHVybmVkIHBhY2tldCwgZGVjcnlwdCB0aGUgZGF0YSBzdHJlYW0sIHJlbW92ZSBhbnkKKwkgKiBlbmNyeXB0aW9uIGhlYWRlciBvciB0cmFpbGVyLCBhbmQgY2xlYXIgdGhlIFBST1RFQ1RFRCBiaXQKKwkgKiBpbiB0aGUgZnJhbWUgY29udHJvbCBoZWFkZXIuCisJICoKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgZnJlZSB0aGUgcGFzc2VkIEkvTyBidWZmZXIuCisJICoKKwkgKiBSZXR1cm4gTlVMTCBpZiBtZW1vcnkgd2FzIG5vdCBhdmFpbGFibGUgZm9yIGRlY3J5cHRpb24sIGlmCisJICogYSBjb25zaXN0ZW5jeSBvciBpbnRlZ3JpdHkgY2hlY2sgb24gdGhlIGRlY3J5cHRlZCBmcmFtZQorCSAqIGZhaWxlZCwgb3IgaWYgdGhlIGRlY3J5cHRlZCBmcmFtZSBzaG91bGQgbm90IGJlIHByb2Nlc3NlZAorCSAqIGJ5IHRoZSBuZXR3b3JrIHN0YWNrIGZvciBhbnkgb3RoZXIgcmVhc29uLgorCSAqLworCXN0cnVjdCBpb19idWZmZXIgKiAoICogZGVjcnlwdCApICggc3RydWN0IG5ldDgwMjExX2NyeXB0byAqY3J5cHRvLAorCQkJCQkgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2IgKTsKKworCS8qKiBMZW5ndGggb2YgcHJpdmF0ZSBkYXRhIHJlcXVlc3RlZCB0byBiZSBhbGxvY2F0ZWQgKi8KKwlpbnQgcHJpdl9sZW47CisKKwkvKiogUHJpdmF0ZSBkYXRhIGZvciB0aGUgYWxnb3JpdGhtIHRvIHN0b3JlIGtleSBhbmQgc3RhdGUgaW5mbyAqLworCXZvaWQgKnByaXY7Cit9OworCisjZGVmaW5lIE5FVDgwMjExX0NSWVBUT1MgX190YWJsZSAoIHN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8sICJuZXQ4MDIxMV9jcnlwdG9zIiApCisjZGVmaW5lIF9fbmV0ODAyMTFfY3J5cHRvIF9fdGFibGVfZW50cnkgKCBORVQ4MDIxMV9DUllQVE9TLCAwMSApCisKKworc3RydWN0IG5ldDgwMjExX3Byb2JlX2N0eDsKK3N0cnVjdCBuZXQ4MDIxMV9hc3NvY19jdHg7CisKKworLyoqIFN0cnVjdHVyZSBlbmNhcHN1bGF0aW5nIHRoZSBjb21wbGV0ZSBzdGF0ZSBvZiBhbiA4MDIuMTEgZGV2aWNlCisgKgorICogQW4gODAyLjExIGRldmljZSBpcyBhbHdheXMgd3JhcHBlZCBieSBhIG5ldHdvcmsgZGV2aWNlLCBhbmQgdGhpcworICogbmV0d29yayBkZXZpY2UgaXMgYWx3YXlzIHBvaW50ZWQgdG8gYnkgdGhlIEBhIG5ldGRldiBmaWVsZC4gSW4KKyAqIGdlbmVyYWwsIG9wZXJhdGlvbnMgc2hvdWxkIG5ldmVyIGJlIHBlcmZvcm1lZCBieSA4MDIuMTEgY29kZSB1c2luZworICogbmV0ZGV2IGZ1bmN0aW9ucyBkaXJlY3RseS4gSXQgaXMgdXN1YWxseSB0aGUgY2FzZSB0aGF0IHRoZSA4MDIuMTEKKyAqIGxheWVyIG1pZ2h0IG5lZWQgdG8gZG8gc29tZSBwcm9jZXNzaW5nIG9yIGJvb2trZWVwaW5nIG9uIHRvcCBvZgorICogd2hhdCB0aGUgbmV0ZGV2aWNlIGNvZGUgd2lsbCBkby4KKyAqLworc3RydWN0IG5ldDgwMjExX2RldmljZQoreworCS8qKiBUaGUgbmV0X2RldmljZSB0aGF0IHdyYXBzIHVzLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwkvKiogTGlzdCBvZiA4MDIuMTEgZGV2aWNlcy4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiogODAyLjExIGRldmljZSBvcGVyYXRpb25zICovCisJc3RydWN0IG5ldDgwMjExX2RldmljZV9vcGVyYXRpb25zICpvcDsKKworCS8qKiBEcml2ZXIgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAqcHJpdjsKKworCS8qKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaGFyZHdhcmUsIHByb3ZpZGVkIHRvIG5ldDgwMjExX3JlZ2lzdGVyKCkgKi8KKwlzdHJ1Y3QgbmV0ODAyMTFfaHdfaW5mbyAqaHc7CisKKwkvKiAtLS0tLS0tLS0tIENoYW5uZWwgYW5kIHJhdGUgZmllbGRzIC0tLS0tLS0tLS0gKi8KKworCS8qKiBBIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIGNoYW5uZWxzIHdlIG1pZ2h0IHVzZSAqLworCXN0cnVjdCBuZXQ4MDIxMV9jaGFubmVsIGNoYW5uZWxzW05FVDgwMjExX01BWF9DSEFOTkVMU107CisKKwkvKiogVGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgY2hhbm5lbHMgYXJyYXkgKi8KKwl1OCBucl9jaGFubmVsczsKKworCS8qKiBUaGUgY2hhbm5lbCBjdXJyZW50bHkgaW4gdXNlLCBhcyBhbiBpbmRleCBpbnRvIHRoZSBjaGFubmVscyBhcnJheSAqLworCXU4IGNoYW5uZWw7CisKKwkvKiogQSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBUWCByYXRlcyB3ZSBtaWdodCB1c2UKKwkgKgorCSAqIFJhdGVzIGFyZSBpbiB1bml0cyBvZiAxMDAga2Jwcy4KKwkgKi8KKwl1MTYgcmF0ZXNbTkVUODAyMTFfTUFYX1JBVEVTXTsKKworCS8qKiBUaGUgbnVtYmVyIG9mIHRyYW5zbWlzc2lvbiByYXRlcyBpbiB0aGUgcmF0ZXMgYXJyYXkgKi8KKwl1OCBucl9yYXRlczsKKworCS8qKiBUaGUgcmF0ZSBjdXJyZW50bHkgaW4gdXNlLCBhcyBhbiBpbmRleCBpbnRvIHRoZSByYXRlcyBhcnJheSAqLworCXU4IHJhdGU7CisKKwkvKiogVGhlIHJhdGUgdG8gdXNlIGZvciBSVFMvQ1RTIHRyYW5zbWlzc2lvbnMKKwkgKgorCSAqIFRoaXMgaXMgYWx3YXlzIHRoZSBmYXN0ZXN0IGJhc2ljIHJhdGUgdGhhdCBpcyBub3QgZmFzdGVyCisJICogdGhhbiB0aGUgZGF0YSByYXRlIGluIHVzZS4gQWxzbyBhbiBpbmRleCBpbnRvIHRoZSByYXRlcyBhcnJheS4KKwkgKi8KKwl1OCBydHNjdHNfcmF0ZTsKKworCS8qKiBCaXRtYXNrIG9mIGJhc2ljIHJhdGVzCisJICoKKwkgKiBJZiBiaXQgTiBpcyBzZXQgaW4gdGhpcyB2YWx1ZSwgd2l0aCB0aGUgTFNCIGNvbnNpZGVyZWQgdG8KKwkgKiBiZSBiaXQgMCwgdGhlbiByYXRlIE4gaW4gdGhlIHJhdGVzIGFycmF5IGlzIGEgImJhc2ljIiByYXRlLgorCSAqCisJICogV2UgZG9uJ3QgZGVjaWRlIHdoaWNoIHJhdGVzIGFyZSAiYmFzaWMiOyBvdXIgQVAgZG9lcywgYW5kCisJICogd2UgcmVzcGVjdCBpdHMgd2lzaGVzLiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gaWRlbnRpZnkgYmFzaWMKKwkgKiByYXRlcyBpbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlIGR1cmF0aW9uIG9mIGEgQ1RTIHBhY2tldAorCSAqIHVzZWQgZm9yIDgwMi4xMSBnL2IgaW50ZXJvcGVyYWJpbGl0eS4KKwkgKi8KKwl1MzIgYmFzaWNfcmF0ZXM7CisKKwkvKiAtLS0tLS0tLS0tIEFzc29jaWF0aW9uIGZpZWxkcyAtLS0tLS0tLS0tICovCisKKwkvKiogVGhlIGFzeW5jaHJvbm91cyBhc3NvY2lhdGlvbiBwcm9jZXNzLgorCSAqCisJICogV2hlbiBhbiA4MDIuMTEgbmV0ZGV2IGlzIG9wZW5lZCwgb3Igd2hlbiB0aGUgdXNlciBjaGFuZ2VzCisJICogdGhlIFNTSUQgc2V0dGluZyBvbiBhbiBvcGVuIDgwMi4xMSBkZXZpY2UsIGFuCisJICogYXV0b2Fzc29jaWF0aW9uIHRhc2sgaXMgc3RhcnRlZCBieSBuZXQ4MDIxMV9hdXRvYXNzb2NhdGUoKQorCSAqIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBuZXcgYmVzdCBuZXR3b3JrLiBUaGUgYXNzb2NpYXRpb24gaXMKKwkgKiBhc3luY2hyb25vdXMsIGJ1dCBubyBwYWNrZXRzIGNhbiBiZSB0cmFuc21pdHRlZCB1bnRpbCBpdCBpcworCSAqIGNvbXBsZXRlLiBJZiBpdCBpcyBzdWNjZXNzZnVsLCB0aGUgd3JhcHBpbmcgbmV0X2RldmljZSBpcworCSAqIHNldCBhcyAibGluayB1cCIuIElmIGl0IGZhaWxzLCBAYyBhc3NvY19yYyB3aWxsIGJlIHNldCB3aXRoCisJICogYW4gZXJyb3IgaW5kaWNhdGlvbi4KKwkgKi8KKwlzdHJ1Y3QgcHJvY2VzcyBwcm9jX2Fzc29jOworCisJLyoqIE5ldHdvcmsgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRpbmcKKwkgKgorCSAqIFRoaXMgd2lsbCBiZSBOVUxMIHdoZW4gd2UgYXJlIG5vdCBhY3RpdmVseSBpbiB0aGUgcHJvY2VzcworCSAqIG9mIGFzc29jaWF0aW5nIHdpdGggYSBuZXR3b3JrIHdlIGhhdmUgYWxyZWFkeSBzdWNjZXNzZnVsbHkKKwkgKiBwcm9iZWQgZm9yLgorCSAqLworCXN0cnVjdCBuZXQ4MDIxMV93bGFuICphc3NvY2lhdGluZzsKKworCS8qKiBDb250ZXh0IGZvciB0aGUgYXNzb2NpYXRpb24gcHJvY2VzcworCSAqCisJICogVGhpcyBpcyBhIHByb2JlX2N0eCBpZiB0aGUgQGMgUFJPQkVEIGZsYWcgaXMgbm90IHNldCBpbiBAYworCSAqIHN0YXRlLCBhbmQgYW4gYXNzb2NfY3R4IG90aGVyd2lzZS4KKwkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBuZXQ4MDIxMV9wcm9iZV9jdHggKnByb2JlOworCQlzdHJ1Y3QgbmV0ODAyMTFfYXNzb2NfY3R4ICphc3NvYzsKKwl9IGN0eDsKKworCS8qKiBTZWN1cml0eSBoYW5kc2hha2VyIGJlaW5nIHVzZWQgKi8KKwlzdHJ1Y3QgbmV0ODAyMTFfaGFuZHNoYWtlciAqaGFuZHNoYWtlcjsKKworCS8qKiBTdGF0ZSBvZiBvdXIgYXNzb2NpYXRpb24gdG8gdGhlIG5ldHdvcmsKKwkgKgorCSAqIFNpbmNlIHRoZSBhc3NvY2lhdGlvbiBwcm9jZXNzIGhhcHBlbnMgYXN5bmNocm9ub3VzbHksIGl0J3MKKwkgKiBuZWNlc3NhcnkgdG8gaGF2ZSBzb21lIGNoYW5uZWwgb2YgY29tbXVuaWNhdGlvbiBzbyB0aGUKKwkgKiBkcml2ZXIgY2FuIHNheSAiSSBnb3QgYW4gYXNzb2NpYXRpb24gcmVwbHkgYW5kIHdlJ3JlIE9LIiBvcgorCSAqIHNpbWlsYXIuIFRoaXMgdmFyaWFibGUgcHJvdmlkZXMgdGhhdCBsaW5rLiBJdCBpcyBhIGJpdG1hc2sKKwkgKiBvZiBhbnkgb2YgTkVUODAyMTFfUFJPQkVELCBORVQ4MDIxMV9BVVRIRU5USUNBVEVELAorCSAqIE5FVDgwMjExX0FTU09DSUFURUQsIE5FVDgwMjExX0NSWVBUT19TWU5DRUQgdG8gaW5kaWNhdGUgaG93CisJICogZmFyIGFsb25nIGluIGFzc29jaWF0aW5nIHdlIGFyZTsgTkVUODAyMTFfV09SS0lORyBpZiB0aGUKKwkgKiBhc3NvY2lhdGlvbiB0YXNrIGlzIHJ1bm5pbmc7IGFuZCBORVQ4MDIxMV9XQUlUSU5HIGlmIGEKKwkgKiBwYWNrZXQgaGFzIGJlZW4gc2VudCB0aGF0IHdlJ3JlIHdhaXRpbmcgZm9yIGEgcmVwbHkgdG8uIFdlCisJICogY2FuIG9ubHkgYmUgY3J5cHRvLXN5bmNlZCBpZiB3ZSdyZSBhc3NvY2lhdGVkLCB3ZSBjYW4KKwkgKiBvbmx5IGJlIGFzc29jaWF0ZWQgaWYgd2UncmUgYXV0aGVudGljYXRlZCwgd2UgY2FuIG9ubHkgYmUKKwkgKiBhdXRoZW50aWNhdGVkIGlmIHdlJ3ZlIHByb2JlZC4KKwkgKgorCSAqIElmIGFuIGFzc29jaWF0aW9uIHByb2Nlc3MgZmFpbHMgKHRoYXQgaXMsIHdlIHJlY2VpdmUgYQorCSAqIHBhY2tldCB3aXRoIGFuIGVycm9yIGluZGljYXRpb24pLCB0aGUgZXJyb3IgY29kZSBpcyBjb3BpZWQKKwkgKiBpbnRvIGJpdHMgNi0wIG9mIHRoaXMgdmFyaWFibGUgYW5kIGJpdCA3IGlzIHNldCB0byBzcGVjaWZ5CisJICogd2hhdCB0eXBlIG9mIGVycm9yIGNvZGUgaXQgaXMuIEFuIEFQIGNhbiBwcm92aWRlIGVpdGhlciBhCisJICogInN0YXR1cyBjb2RlIiAoMC01MSBhcmUgZGVmaW5lZCkgZXhwbGFpbmluZyB3aHkgaXQgcmVmdXNlZAorCSAqIGFuIGFzc29jaWF0aW9uIGltbWVkaWF0ZWx5LCBvciBhICJyZWFzb24gY29kZSIgKDAtNDUgYXJlCisJICogZGVmaW5lZCkgZXhwbGFpbmluZyB3aHkgaXQgY2FuY2VsZWQgYW4gYXNzb2NpYXRpb24gYWZ0ZXIgaXQKKwkgKiBoYWQgb3JpZ2luYWxseSBPSydlZCBpdC4gU3RhdHVzIGFuZCByZWFzb24gY29kZXMgc2VydmUKKwkgKiBzaW1pbGFyIGZ1bmN0aW9ucywgYnV0IHRoZXkgdXNlIHNlcGFyYXRlIGVycm9yIG1lc3NhZ2UKKwkgKiB0YWJsZXMuIEEgZ1BYRS1mb3JtYXR0ZWQgcmV0dXJuIHN0YXR1cyBjb2RlIChuZWdhdGl2ZSkgaXMKKwkgKiBwbGFjZWQgaW4gQGMgYXNzb2NfcmMuCisJICoKKwkgKiBJZiB0aGUgZmFpbHVyZSB0byBhc3NvY2lhdGUgaXMgaW5kaWNhdGVkIGJ5IGEgc3RhdHVzIGNvZGUsCisJICogdGhlIE5FVDgwMjExX0lTX1JFQVNPTiBiaXQgd2lsbCBiZSBjbGVhcjsgaWYgaXQgaXMKKwkgKiBpbmRpY2F0ZWQgYnkgYSByZWFzb24gY29kZSwgdGhlIGJpdCB3aWxsIGJlIHNldC4gSWYgd2Ugd2VyZQorCSAqIHN1Y2Nlc3NmdWwsIGJvdGggemVybyBzdGF0dXMgYW5kIHplcm8gcmVhc29uIG1lYW4gc3VjY2VzcywKKwkgKiBzbyB0aGVyZSBpcyBubyBhbWJpZ3VpdHkuCisJICoKKwkgKiBUbyBwcmV2ZW50IGFzc29jaWF0aW9uIHdoZW4gb3BlbmluZyB0aGUgZGV2aWNlLCB1c2VyIGNvZGUKKwkgKiBjYW4gc2V0IHRoZSBORVQ4MDIxMV9OT19BU1NPQyBiaXQuIFRoZSBmaW5hbCBiaXQgaW4gdGhpcworCSAqIHZhcmlhYmxlLCBORVQ4MDIxMV9BVVRPX1NTSUQsIGlzIHVzZWQgdG8gcmVtZW1iZXIgd2hldGhlcgorCSAqIHdlIHBpY2tlZCBvdXIgU1NJRCB0aHJvdWdoIGF1dG9tYXRlZCBwcm9iaW5nIGFzIG9wcG9zZWQgdG8KKwkgKiB1c2VyIHNwZWNpZmljYXRpb247IHRoZSBkaXN0aW5jdGlvbiBiZWNvbWVzIHJlbGV2YW50IGluIHRoZQorCSAqIHNldHRpbmdzIGFwcGxpY2F0b3IuCisJICovCisJdTE2IHN0YXRlOworCisJLyoqIFJldHVybiBzdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggQGMgc3RhdGUgKi8KKwlpbnQgYXNzb2NfcmM7CisKKwkvKiogUlNOIG9yIFdQQSBpbmZvcm1hdGlvbiBlbGVtZW50IHRvIGluY2x1ZGUgd2l0aCBhc3NvY2lhdGlvbgorCSAqCisJICogSWYgc2V0IHRvIEBjIE5VTEwsIG5vbmUgd2lsbCBiZSBpbmNsdWRlZC4gSXQgaXMgZXhwZWN0ZWQKKwkgKiB0aGF0IHRoaXMgd2lsbCBiZSBzZXQgYnkgdGhlIEBhIGluaXQgZnVuY3Rpb24gb2YgYSBzZWN1cml0eQorCSAqIGhhbmRzaGFrZXIgaWYgaXQgaXMgbmVlZGVkLgorCSAqLworCXVuaW9uIGllZWU4MDIxMV9pZSAqcnNuX2llOworCisJLyogLS0tLS0tLS0tLSBQYXJhbWV0ZXJzIG9mIGN1cnJlbnRseSBhc3NvY2lhdGVkIG5ldHdvcmsgLS0tLS0tLS0tLSAqLworCisJLyoqIDgwMi4xMSBjcnlwdG9zeXN0ZW0gZm9yIG91ciBjdXJyZW50IG5ldHdvcmsKKwkgKgorCSAqIEZvciBhbiBvcGVuIG5ldHdvcmssIHRoaXMgd2lsbCBiZSBzZXQgdG8gTlVMTC4KKwkgKi8KKwlzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvICpjcnlwdG87CisKKwkvKiogODAyLjExIGNyeXB0b3N5c3RlbSBmb3IgbXVsdGljYXN0IGFuZCBicm9hZGNhc3QgZnJhbWVzCisJICoKKwkgKiBJZiB0aGlzIGlzIE5VTEwsIHRoZSBjcnlwdG9zeXN0ZW0gdXNlZCBmb3IgcmVjZWl2aW5nCisJICogdW5pY2FzdCBmcmFtZXMgd2lsbCBhbHNvIGJlIHVzZWQgZm9yIHJlY2VpdmluZyBtdWx0aWNhc3QKKwkgKiBhbmQgYnJvYWRjYXN0IGZyYW1lcy4gVHJhbnNtaXR0ZWQgbXVsdGljYXN0IGFuZCBicm9hZGNhc3QKKwkgKiBmcmFtZXMgYXJlIGFsd2F5cyBzZW50IHVuaWNhc3QgdG8gdGhlIEFQLCB3aG8gbXVsdGljYXN0cworCSAqIHRoZW0gb24gb3VyIGJlaGFsZjsgdGh1cyB0aGV5IGFsd2F5cyB1c2UgdGhlIHVuaWNhc3QKKwkgKiBjcnlwdG9zeXN0ZW0uCisJICovCisJc3RydWN0IG5ldDgwMjExX2NyeXB0byAqZ2NyeXB0bzsKKworCS8qKiBNQUMgYWRkcmVzcyBvZiB0aGUgYWNjZXNzIHBvaW50IG1vc3QgcmVjZW50bHkgYXNzb2NpYXRlZCAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCS8qKiBTU0lEIG9mIHRoZSBhY2Nlc3MgcG9pbnQgd2UgYXJlIG9yIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoCisJICoKKwkgKiBBbHRob3VnaCB0aGUgU1NJRCBmaWVsZCBpbiA4MDIuMTEgcGFja2V0cyBpcyBnZW5lcmFsbHkgbm90CisJICogTlVMLXRlcm1pbmF0ZWQsIGhlcmUgYW5kIGluIG5ldDgwMjExX3dsYW4gd2UgYWRkIGEgTlVMIGZvcgorCSAqIGNvbnZlbmllbmNlLgorCSAqLworCWNoYXIgZXNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTisxXTsKKworCS8qKiBBc3NvY2lhdGlvbiBJRCBnaXZlbiB0byB1cyBieSB0aGUgQVAgKi8KKwl1MTYgYWlkOworCisJLyoqIFRTRlQgdmFsdWUgZm9yIGxhc3QgYmVhY29uIHJlY2VpdmVkLCBtaWNyb3NlY29uZHMgKi8KKwl1NjQgbGFzdF9iZWFjb25fdGltZXN0YW1wOworCisJLyoqIFRpbWUgYmV0d2VlbiBBUCBzZW5kaW5nIGJlYWNvbnMsIG1pY3Jvc2Vjb25kcyAqLworCXUzMiB0eF9iZWFjb25faW50ZXJ2YWw7CisKKwkvKiogU21vb3RoZWQgYXZlcmFnZSB0aW1lIGJldHdlZW4gYmVhY29ucywgbWljcm9zZWNvbmRzICovCisJdTMyIHJ4X2JlYWNvbl9pbnRlcnZhbDsKKworCS8qIC0tLS0tLS0tLS0gUGh5c2ljYWwgbGF5ZXIgaW5mb3JtYXRpb24gLS0tLS0tLS0tLSAqLworCisJLyoqIFBoeXNpY2FsIGxheWVyIG9wdGlvbnMKKwkgKgorCSAqIFRoZXNlIGNvbnRyb2wgdGhlIHVzZSBvZiBDVFMgcHJvdGVjdGlvbiwgc2hvcnQgcHJlYW1ibGVzLAorCSAqIGFuZCBzaG9ydC1zbG90IG9wZXJhdGlvbi4KKwkgKi8KKwlpbnQgcGh5X2ZsYWdzOworCisJLyoqIFNpZ25hbCBzdHJlbmd0aCBvZiBsYXN0IHJlY2VpdmVkIHBhY2tldCAqLworCWludCBsYXN0X3NpZ25hbDsKKworCS8qKiBSYXRlIGNvbnRyb2wgc3RhdGUgKi8KKwlzdHJ1Y3QgcmM4MDIxMV9jdHggKnJjdGw7CisKKwkvKiAtLS0tLS0tLS0tIFBhY2tldCBoYW5kbGluZyBzdGF0ZSAtLS0tLS0tLS0tICovCisKKwkvKiogRnJhZ21lbnQgcmVhc3NlbWJseSBzdGF0ZSAqLworCXN0cnVjdCBuZXQ4MDIxMV9mcmFnX2NhY2hlIGZyYWdzW05FVDgwMjExX05SX0NPTkNVUlJFTlRfRlJBR1NdOworCisJLyoqIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgcGFja2V0IHdlIHNlbnQgKi8KKwl1MTYgbGFzdF90eF9zZXFucjsKKworCS8qKiBQYWNrZXQgZHVwbGljYXRpb24gZWxpbWluYXRpb24gc3RhdGUKKwkgKgorCSAqIFdlIGFyZSBvbmx5IHJlcXVpcmVkIHRvIGhhbmRsZSBpbW1lZGlhdGUgZHVwbGljYXRlcyBmb3IKKwkgKiBlYWNoIGRpcmVjdCBzZW5kZXIsIGFuZCBzaW5jZSB3ZSBjYW4gb25seSBoYXZlIG9uZSBkaXJlY3QKKwkgKiBzZW5kZXIgKHRoZSBBUCksIHdlIG5lZWQgb25seSBrZWVwIHRoZSBzZXF1ZW5jZSBjb250cm9sCisJICogZmllbGQgZnJvbSB0aGUgbW9zdCByZWNlbnQgcGFja2V0IHdlJ3ZlIHJlY2VpdmVkLiBUaHVzLAorCSAqIHRoaXMgZmllbGQgc3RvcmVzIHRoZSBsYXN0IHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgd2UndmUKKwkgKiByZWNlaXZlZCBmb3IgYSBwYWNrZXQgZnJvbSB0aGUgQVAuCisJICovCisJdTE2IGxhc3Rfcnhfc2VxOworCisJLyoqIFJYIG1hbmFnZW1lbnQgcGFja2V0IHF1ZXVlCisJICoKKwkgKiBTb21ldGltZXMgd2Ugd2FudCB0byBrZWVwIHByb2JlLCBiZWFjb24sIGFuZCBhY3Rpb24gcGFja2V0cworCSAqIHRoYXQgd2UgcmVjZWl2ZSwgc3VjaCBhcyB3aGVuIHdlJ3JlIHNjYW5uaW5nIGZvciBuZXR3b3Jrcy4KKwkgKiBPcmRpbmFyaWx5IHdlIGRyb3AgdGhlbSBiZWNhdXNlIHRoZXkgYXJlIHNlbnQgYXQgYSBsYXJnZQorCSAqIHZvbHVtZSAodGVuIGJlYWNvbnMgcGVyIHNlY29uZCBwZXIgQVAsIGJyb2FkY2FzdCkgYW5kIHdlCisJICogaGF2ZSBubyBuZWVkIG9mIHRoZW0gZXhjZXB0IHdoZW4gd2UncmUgc2Nhbm5pbmcuCisJICoKKwkgKiBXaGVuIGtlZXBfbWdtdCBpcyBUUlVFLCByZWNlaXZlZCBwcm9iZSwgYmVhY29uLCBhbmQgYWN0aW9uCisJICogbWFuYWdlbWVudCBwYWNrZXRzIHdpbGwgYmUgc3RvcmVkIGluIHRoaXMgcXVldWUuCisJICovCisJc3RydWN0IGxpc3RfaGVhZCBtZ210X3F1ZXVlOworCisJLyoqIFJYIG1hbmFnZW1lbnQgcGFja2V0IGluZm8gcXVldWUKKwkgKgorCSAqIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc2lnbmFsIHN0cmVuZ3RoIGZvciBtYW5hZ2VtZW50CisJICogcGFja2V0cyB3ZSdyZSBrZWVwaW5nLCBiZWNhdXNlIHRoYXQgcHJvdmlkZXMgdGhlIG9ubHkgd2F5CisJICogdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtdWx0aXBsZSBBUHMgZm9yIHRoZSBzYW1lIG5ldHdvcmsuCisJICogU2luY2Ugd2UgY2FuJ3QgZXh0ZW5kIGlvX2J1ZmZlciB0byBzdG9yZSBzaWduYWwsIHRoaXMgZmllbGQKKwkgKiBoZWFkcyBhIGxpbmtlZCBsaXN0IG9mICJSWCBwYWNrZXQgaW5mbyIgc3RydWN0dXJlcyB0aGF0CisJICogY29udGFpbiB0aGF0IHNpZ25hbCBzdHJlbmd0aCBmaWVsZC4gSXRzIGVudHJpZXMgYWx3YXlzCisJICogcGFyYWxsZWwgdGhlIGVudHJpZXMgaW4gbWdtdF9xdWV1ZSwgYmVjYXVzZSB0aGUgdHdvIHF1ZXVlcworCSAqIGFyZSBhbHdheXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIGluIHBhcmFsbGVsLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbWdtdF9pbmZvX3F1ZXVlOworCisJLyoqIFdoZXRoZXIgdG8gc3RvcmUgbWFuYWdlbWVudCBwYWNrZXRzCisJICoKKwkgKiBSZWNlaXZlZCBiZWFjb24sIHByb2JlLCBhbmQgYWN0aW9uIHBhY2tldHMgd2lsbCBiZSBhZGRlZCB0bworCSAqIG1nbXRfcXVldWUgKGFuZCB0aGVpciBzaWduYWwgc3RyZW5ndGhzIGFkZGVkIHRvCisJICogbWdtdF9pbmZvX3F1ZXVlKSBvbmx5IHdoZW4gdGhpcyB2YXJpYWJsZSBpcyBUUlVFLiBJdCBzaG91bGQKKwkgKiBiZSBzZXQgYnkgbmV0ODAyMTFfa2VlcF9tZ210KCkgKHdoaWNoIHJldHVybnMgdGhlIG9sZAorCSAqIHZhbHVlKSBvbmx5IHdoZW4gY2FsbGluZyBjb2RlIGlzIHByZXBhcmVkIHRvIHBvbGwgdGhlCisJICogbWFuYWdlbWVudCBxdWV1ZSBmcmVxdWVudGx5LCBiZWNhdXNlIHBhY2tldHMgd2lsbCBvdGhlcndpc2UKKwkgKiBwaWxlIHVwIGFuZCBleGhhdXN0IG1lbW9yeS4KKwkgKi8KKwlpbnQga2VlcF9tZ210OworfTsKKworLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBwcm9iZWQgbmV0d29yay4KKyAqCisgKiBUaGlzIGlzIHJldHVybmVkIGZyb20gdGhlIG5ldDgwMjExX3Byb2JlX2ZpbmlzaCBmdW5jdGlvbnMgYW5kCisgKiBwYXNzZWQgdG8gdGhlIGxvdy1sZXZlbCBhc3NvY2lhdGlvbiBmdW5jdGlvbnMuIEF0IGxlYXN0IGVzc2lkLAorICogYnNzaWQsIGNoYW5uZWwsIGJlYWNvbiwgYW5kIHNlY3VyaXR5IG11c3QgYmUgZmlsbGVkIGluIGlmIHlvdSB3YW50CisgKiB0byBidWlsZCB0aGlzIHN0cnVjdHVyZSBtYW51YWxseS4KKyAqLworc3RydWN0IG5ldDgwMjExX3dsYW4KK3sKKwkvKiogVGhlIGh1bWFuLXJlYWRhYmxlIEVTU0lEIChuZXR3b3JrIG5hbWUpCisJICoKKwkgKiBBbHRob3VnaCB0aGUgODAyLjExIFNTSUQgZmllbGQgaXMgZ2VuZXJhbGx5IG5vdAorCSAqIE5VTC10ZXJtaW5hdGVkLCB0aGUgZ1BYRSBjb2RlIGFkZHMgYW4gZXh0cmEgTlVMIChhbmQKKwkgKiBleHBlY3RzIG9uZSBpbiB0aGlzIHN0cnVjdHVyZSkgZm9yIGNvbnZlbmllbmNlLgorCSAqLworCWNoYXIgZXNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTisxXTsKKworCS8qKiBNQUMgYWRkcmVzcyBvZiB0aGUgc3Ryb25nZXN0LXNpZ25hbCBhY2Nlc3MgcG9pbnQgZm9yIHRoaXMgRVNTSUQgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisKKwkvKiogU2lnbmFsIHN0cmVuZ3RoIG9mIGJlYWNvbiBmcmFtZSBmcm9tIHRoYXQgYWNjZXNzIHBvaW50ICovCisJaW50IHNpZ25hbDsKKworCS8qKiBUaGUgY2hhbm5lbCBvbiB3aGljaCB0aGF0IGFjY2VzcyBwb2ludCBjb21tdW5pY2F0ZXMKKwkgKgorCSAqIFRoaXMgaXMgYSByYXcgY2hhbm5lbCBudW1iZXIgKG5ldDgwMjExX2NoYW5uZWw6OmNoYW5uZWxfbnIpLAorCSAqIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcmVjb25maWd1cmF0aW9uIG9mIHRoZQorCSAqIGRldmljZSBjaGFubmVscyBhcnJheS4KKwkgKi8KKwlpbnQgY2hhbm5lbDsKKworCS8qKiBUaGUgY29tcGxldGUgYmVhY29uIG9yIHByb2JlLXJlc3BvbnNlIGZyYW1lIHJlY2VpdmVkICovCisJc3RydWN0IGlvX2J1ZmZlciAqYmVhY29uOworCisJLyoqIFNlY3VyaXR5IGhhbmRzaGFraW5nIG1ldGhvZCB1c2VkIG9uIHRoZSBuZXR3b3JrICovCisJZW51bSBuZXQ4MDIxMV9zZWN1cml0eV9wcm90byBoYW5kc2hha2luZzsKKworCS8qKiBDcnlwdG9ncmFwaGljIGFsZ29yaXRobSB1c2VkIG9uIHRoZSBuZXR3b3JrICovCisJZW51bSBuZXQ4MDIxMV9jcnlwdG9fYWxnIGNyeXB0bzsKKworCS8qKiBMaW5rIHRvIGFsbG93IGNoYWluaW5nIG11bHRpcGxlIHN0cnVjdHVyZXMgaW50byBhIGxpc3QgdG8KKwkgICAgYmUgcmV0dXJuZWQgZnJvbSBuZXQ4MDIxMV9wcm9iZV9maW5pc2hfYWxsKCkuICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworCisvKiogODAyLjExIGVuY3J5cHRpb24ga2V5IHNldHRpbmcgKi8KK2V4dGVybiBzdHJ1Y3Qgc2V0dGluZyBuZXQ4MDIxMV9rZXlfc2V0dGluZyBfX3NldHRpbmc7CisKKworLyoqCisgKiBAZGVmZ3JvdXAgbmV0ODAyMTFfcHJvYmUgODAyLjExIG5ldHdvcmsgbG9jYXRpb24gQVBJCisgKiBAeworICovCitpbnQgbmV0ODAyMTFfcHJlcGFyZV9wcm9iZSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IGJhbmQsCisJCQkgICAgIGludCBhY3RpdmUgKTsKK3N0cnVjdCBuZXQ4MDIxMV9wcm9iZV9jdHggKiBuZXQ4MDIxMV9wcm9iZV9zdGFydCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCQkJCSAgIGNvbnN0IGNoYXIgKmVzc2lkLAorCQkJCQkJICAgaW50IGFjdGl2ZSApOworaW50IG5ldDgwMjExX3Byb2JlX3N0ZXAgKCBzdHJ1Y3QgbmV0ODAyMTFfcHJvYmVfY3R4ICpjdHggKTsKK3N0cnVjdCBuZXQ4MDIxMV93bGFuICoKK25ldDgwMjExX3Byb2JlX2ZpbmlzaF9iZXN0ICggc3RydWN0IG5ldDgwMjExX3Byb2JlX2N0eCAqY3R4ICk7CitzdHJ1Y3QgbGlzdF9oZWFkICpuZXQ4MDIxMV9wcm9iZV9maW5pc2hfYWxsICggc3RydWN0IG5ldDgwMjExX3Byb2JlX2N0eCAqY3R4ICk7CisKK3ZvaWQgbmV0ODAyMTFfZnJlZV93bGFuICggc3RydWN0IG5ldDgwMjExX3dsYW4gKndsYW4gKTsKK3ZvaWQgbmV0ODAyMTFfZnJlZV93bGFubGlzdCAoIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgKTsKKy8qKiBAfSAqLworCisKKy8qKgorICogQGRlZmdyb3VwIG5ldDgwMjExX21nbXQgODAyLjExIG5ldHdvcmsgbWFuYWdlbWVudCBBUEkKKyAqIEB7CisgKi8KK3N0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKiBuZXQ4MDIxMV9nZXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7Cit2b2lkIG5ldDgwMjExX2F1dG9hc3NvY2lhdGUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKTsKKworaW50IG5ldDgwMjExX2NoYW5nZV9jaGFubmVsICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCApOwordm9pZCBuZXQ4MDIxMV9zZXRfcmF0ZV9pZHggKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCByYXRlICk7CisKK2ludCBuZXQ4MDIxMV9rZWVwX21nbXQgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCBlbmFibGUgKTsKK3N0cnVjdCBpb19idWZmZXIgKiBuZXQ4MDIxMV9tZ210X2RlcXVldWUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkJCSAgIGludCAqc2lnbmFsICk7CitpbnQgbmV0ODAyMTFfdHhfbWdtdCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgdTE2IGZjLAorCQkgICAgICAgdTggYnNzaWRbRVRIX0FMRU5dLCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IgKTsKKy8qKiBAfSAqLworCisKKy8qKgorICogQGRlZmdyb3VwIG5ldDgwMjExX2Fzc29jIDgwMi4xMSBuZXR3b3JrIGFzc29jaWF0aW9uIEFQSQorICogQHsKKyAqLworaW50IG5ldDgwMjExX3ByZXBhcmVfYXNzb2MgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBuZXQ4MDIxMV93bGFuICp3bGFuICk7CitpbnQgbmV0ODAyMTFfc2VuZF9hdXRoICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBuZXQ4MDIxMV93bGFuICp3bGFuLCBpbnQgbWV0aG9kICk7CitpbnQgbmV0ODAyMTFfc2VuZF9hc3NvYyAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IG5ldDgwMjExX3dsYW4gKndsYW4gKTsKK3ZvaWQgbmV0ODAyMTFfZGVhdXRoZW50aWNhdGUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCByYyApOworLyoqIEB9ICovCisKKworLyoqCisgKiBAZGVmZ3JvdXAgbmV0ODAyMTFfZHJpdmVyIDgwMi4xMSBkcml2ZXIgaW50ZXJmYWNlIEFQSQorICogQHsKKyAqLworc3RydWN0IG5ldDgwMjExX2RldmljZSAqbmV0ODAyMTFfYWxsb2MgKCBzaXplX3QgcHJpdl9zaXplICk7CitpbnQgbmV0ODAyMTFfcmVnaXN0ZXIgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlX29wZXJhdGlvbnMgKm9wcywKKwkJCXN0cnVjdCBuZXQ4MDIxMV9od19pbmZvICpodyApOwordTE2IG5ldDgwMjExX2R1cmF0aW9uICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgYnl0ZXMsIHUxNiByYXRlICk7Cit2b2lkIG5ldDgwMjExX3J4ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IsCisJCSAgIGludCBzaWduYWwsIHUxNiByYXRlICk7Cit2b2lkIG5ldDgwMjExX3J4X2VyciAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYiwgaW50IHJjICk7Cit2b2lkIG5ldDgwMjExX3R4X2NvbXBsZXRlICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYiwgaW50IHJldHJpZXMsIGludCByYyApOwordm9pZCBuZXQ4MDIxMV91bnJlZ2lzdGVyICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICk7Cit2b2lkIG5ldDgwMjExX2ZyZWUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKTsKKy8qKiBAfSAqLworCisvKioKKyAqIENhbGN1bGF0ZSBkdXJhdGlvbiBmaWVsZCBmb3IgYSBDVFMgY29udHJvbCBmcmFtZQorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBzaXplCVNpemUgb2YgdGhlIHBhY2tldCBiZWluZyBjbGVhcmVkIHRvIHNlbmQKKyAqCisgKiBBIENUUyBjb250cm9sIGZyYW1lJ3MgZHVyYXRpb24gZmllbGQgY2FwdHVyZXMgdGhlIGZyYW1lIGJlaW5nCisgKiBwcm90ZWN0ZWQgYW5kIGl0cyAxMC1ieXRlIEFDSy4KKyAqLworc3RhdGljIGlubGluZSB1MTYgbmV0ODAyMTFfY3RzX2R1cmF0aW9uICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCQkgIGludCBzaXplICkKK3sKKwlyZXR1cm4gKCBuZXQ4MDIxMV9kdXJhdGlvbiAoIGRldiwgMTAsCisJCQkJICAgICBkZXYtPnJhdGVzW2Rldi0+cnRzY3RzX3JhdGVdICkgKworCQkgbmV0ODAyMTFfZHVyYXRpb24gKCBkZXYsIHNpemUsIGRldi0+cmF0ZXNbZGV2LT5yYXRlXSApICk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL25ldGRldmljZS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL25ldGRldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OGQ4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbmV0ZGV2aWNlLmgKQEAgLTAsMCArMSw1MzIgQEAKKyNpZm5kZWYgX0dQWEVfTkVUREVWSUNFX0gKKyNkZWZpbmUgX0dQWEVfTkVUREVWSUNFX0gKKworLyoqIEBmaWxlCisgKgorICogTmV0d29yayBkZXZpY2UgbWFuYWdlbWVudAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorI2luY2x1ZGUgPGdweGUvcmVmY250Lmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXR0aW5ncy5oPgorCitzdHJ1Y3QgaW9fYnVmZmVyOworc3RydWN0IG5ldF9kZXZpY2U7CitzdHJ1Y3QgbmV0X3Byb3RvY29sOworc3RydWN0IGxsX3Byb3RvY29sOworc3RydWN0IGRldmljZTsKKworLyoqIE1heGltdW0gbGVuZ3RoIG9mIGEgaGFyZHdhcmUgYWRkcmVzcworICoKKyAqIFRoZSBsb25nZXN0IGN1cnJlbnRseS1zdXBwb3J0ZWQgbGluay1sYXllciBhZGRyZXNzIGlzIGZvciBJUG9JQi4KKyAqLworI2RlZmluZSBNQVhfSFdfQUREUl9MRU4gOAorCisvKiogTWF4aW11bSBsZW5ndGggb2YgYSBsaW5rLWxheWVyIGFkZHJlc3MKKyAqCisgKiBUaGUgbG9uZ2VzdCBjdXJyZW50bHktc3VwcG9ydGVkIGxpbmstbGF5ZXIgYWRkcmVzcyBpcyBmb3IgSVBvSUIuCisgKi8KKyNkZWZpbmUgTUFYX0xMX0FERFJfTEVOIDIwCisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiBhIGxpbmstbGF5ZXIgaGVhZGVyCisgKgorICogVGhlIGxvbmdlc3QgY3VycmVudGx5LXN1cHBvcnRlZCBsaW5rLWxheWVyIGhlYWRlciBpcyBmb3IgODAyLjExOiBhCisgKiAyNC1ieXRlIGZyYW1lIGhlYWRlciBwbHVzIGFuIDgtYnl0ZSA4MDIuMyBMTEMvU05BUCBoZWFkZXIuICAoVGhlCisgKiBJUG9JQiBsaW5rLWxheWVyIHBzZXVkby1oZWFkZXIgZG9lc24ndCBhY3R1YWxseSBpbmNsdWRlIGxpbmstbGF5ZXIKKyAqIGFkZHJlc3Nlczsgc2VlIGlwb2liLmMgZm9yIGRldGFpbHMpLgorICovCisjZGVmaW5lIE1BWF9MTF9IRUFERVJfTEVOIDMyCisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiBhIG5ldHdvcmstbGF5ZXIgYWRkcmVzcyAqLworI2RlZmluZSBNQVhfTkVUX0FERFJfTEVOIDQKKworLyoqCisgKiBBIG5ldHdvcmstbGF5ZXIgcHJvdG9jb2wKKyAqCisgKi8KK3N0cnVjdCBuZXRfcHJvdG9jb2wgeworCS8qKiBQcm90b2NvbCBuYW1lICovCisJY29uc3QgY2hhciAqbmFtZTsKKwkvKioKKwkgKiBQcm9jZXNzIHJlY2VpdmVkIHBhY2tldAorCSAqCisJICogQHYgaW9idWYJSS9PIGJ1ZmZlcgorCSAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorCSAqIEB2IGxsX3NvdXJjZQlMaW5rLWxheWVyIHNvdXJjZSBhZGRyZXNzCisJICoKKwkgKiBUaGlzIG1ldGhvZCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIEkvTyBidWZmZXIuCisJICovCisJaW50ICggKiByeCApICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSAgICAgICBjb25zdCB2b2lkICpsbF9zb3VyY2UgKTsKKwkvKioKKwkgKiBUcmFuc2NyaWJlIG5ldHdvcmstbGF5ZXIgYWRkcmVzcworCSAqCisJICogQHYgbmV0X2FkZHIJTmV0d29yay1sYXllciBhZGRyZXNzCisJICogQHJldCBzdHJpbmcJSHVtYW4tcmVhZGFibGUgdHJhbnNjcmlwdGlvbiBvZiBhZGRyZXNzCisJICoKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgY29udmVydCB0aGUgbmV0d29yay1sYXllciBhZGRyZXNzIGludG8gYQorCSAqIGh1bWFuLXJlYWRhYmxlIGZvcm1hdCAoZS5nLiBkb3R0ZWQgcXVhZCBub3RhdGlvbiBmb3IgSVB2NCkuCisJICoKKwkgKiBUaGUgYnVmZmVyIHVzZWQgdG8gaG9sZCB0aGUgdHJhbnNjcmlwdGlvbiBpcyBzdGF0aWNhbGx5CisJICogYWxsb2NhdGVkLgorCSAqLworCWNvbnN0IGNoYXIgKiAoICpudG9hICkgKCBjb25zdCB2b2lkICogbmV0X2FkZHIgKTsKKwkvKiogTmV0d29yay1sYXllciBwcm90b2NvbAorCSAqCisJICogVGhpcyBpcyBhbiBFVEhfUF9YWFggY29uc3RhbnQsIGluIG5ldHdvcmstYnl0ZSBvcmRlcgorCSAqLworCXVpbnQxNl90IG5ldF9wcm90bzsKKwkvKiogTmV0d29yay1sYXllciBhZGRyZXNzIGxlbmd0aCAqLworCXVpbnQ4X3QgbmV0X2FkZHJfbGVuOworfTsKKworLyoqCisgKiBBIGxpbmstbGF5ZXIgcHJvdG9jb2wKKyAqCisgKi8KK3N0cnVjdCBsbF9wcm90b2NvbCB7CisJLyoqIFByb3RvY29sIG5hbWUgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKgorCSAqIEFkZCBsaW5rLWxheWVyIGhlYWRlcgorCSAqCisJICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorCSAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisJICogQHYgbGxfZGVzdAkJTGluay1sYXllciBkZXN0aW5hdGlvbiBhZGRyZXNzCisJICogQHYgbGxfc291cmNlCQlTb3VyY2UgbGluay1sYXllciBhZGRyZXNzCisJICogQHYgbmV0X3Byb3RvCQlOZXR3b3JrLWxheWVyIHByb3RvY29sLCBpbiBuZXR3b3JrLWJ5dGUgb3JkZXIKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIHB1c2ggKSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJIGNvbnN0IHZvaWQgKmxsX2Rlc3QsIGNvbnN0IHZvaWQgKmxsX3NvdXJjZSwKKwkJCSB1aW50MTZfdCBuZXRfcHJvdG8gKTsKKwkvKioKKwkgKiBSZW1vdmUgbGluay1sYXllciBoZWFkZXIKKwkgKgorCSAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKwkgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorCSAqIEByZXQgbGxfZGVzdAkJTGluay1sYXllciBkZXN0aW5hdGlvbiBhZGRyZXNzCisJICogQHJldCBsbF9zb3VyY2UJU291cmNlIGxpbmstbGF5ZXIgYWRkcmVzcworCSAqIEByZXQgbmV0X3Byb3RvCU5ldHdvcmstbGF5ZXIgcHJvdG9jb2wsIGluIG5ldHdvcmstYnl0ZSBvcmRlcgorCSAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorCSAqLworCWludCAoICogcHVsbCApICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCQkgY29uc3Qgdm9pZCAqKmxsX2Rlc3QsIGNvbnN0IHZvaWQgKipsbF9zb3VyY2UsCisJCQkgdWludDE2X3QgKm5ldF9wcm90byApOworCS8qKgorCSAqIEluaXRpYWxpc2UgbGluay1sYXllciBhZGRyZXNzCisJICoKKwkgKiBAdiBod19hZGRyCQlIYXJkd2FyZSBhZGRyZXNzCisJICogQHYgbGxfYWRkcgkJTGluay1sYXllciBhZGRyZXNzIHRvIGZpbGwgaW4KKwkgKi8KKwl2b2lkICggKiBpbml0X2FkZHIgKSAoIGNvbnN0IHZvaWQgKmh3X2FkZHIsIHZvaWQgKmxsX2FkZHIgKTsKKwkvKioKKwkgKiBUcmFuc2NyaWJlIGxpbmstbGF5ZXIgYWRkcmVzcworCSAqCisJICogQHYgbGxfYWRkcgkJTGluay1sYXllciBhZGRyZXNzCisJICogQHJldCBzdHJpbmcJCUh1bWFuLXJlYWRhYmxlIHRyYW5zY3JpcHRpb24gb2YgYWRkcmVzcworCSAqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGNvbnZlcnQgdGhlIGxpbmstbGF5ZXIgYWRkcmVzcyBpbnRvIGEKKwkgKiBodW1hbi1yZWFkYWJsZSBmb3JtYXQuCisJICoKKwkgKiBUaGUgYnVmZmVyIHVzZWQgdG8gaG9sZCB0aGUgdHJhbnNjcmlwdGlvbiBpcyBzdGF0aWNhbGx5CisJICogYWxsb2NhdGVkLgorCSAqLworCWNvbnN0IGNoYXIgKiAoICogbnRvYSApICggY29uc3Qgdm9pZCAqbGxfYWRkciApOworCS8qKgorCSAqIEhhc2ggbXVsdGljYXN0IGFkZHJlc3MKKwkgKgorCSAqIEB2IGFmCQlBZGRyZXNzIGZhbWlseQorCSAqIEB2IG5ldF9hZGRyCQlOZXR3b3JrLWxheWVyIGFkZHJlc3MKKwkgKiBAdiBsbF9hZGRyCQlMaW5rLWxheWVyIGFkZHJlc3MgdG8gZmlsbCBpbgorCSAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorCSAqLworCWludCAoICogbWNfaGFzaCApICggdW5zaWduZWQgaW50IGFmLCBjb25zdCB2b2lkICpuZXRfYWRkciwKKwkJCSAgICB2b2lkICpsbF9hZGRyICk7CisJLyoqCisJICogR2VuZXJhdGUgRXRoZXJuZXQtY29tcGF0aWJsZSBjb21wcmVzc2VkIGxpbmstbGF5ZXIgYWRkcmVzcworCSAqCisJICogQHYgbGxfYWRkcgkJTGluay1sYXllciBhZGRyZXNzCisJICogQHYgZXRoX2FkZHIJCUV0aGVybmV0LWNvbXBhdGlibGUgYWRkcmVzcyB0byBmaWxsIGluCisJICovCisJaW50ICggKiBldGhfYWRkciApICggY29uc3Qgdm9pZCAqbGxfYWRkciwgdm9pZCAqZXRoX2FkZHIgKTsKKwkvKiogTGluay1sYXllciBwcm90b2NvbAorCSAqCisJICogVGhpcyBpcyBhbiBBUlBIUkRfWFhYIGNvbnN0YW50LCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisJICovCisJdWludDE2X3QgbGxfcHJvdG87CisJLyoqIEhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisJdWludDhfdCBod19hZGRyX2xlbjsKKwkvKiogTGluay1sYXllciBhZGRyZXNzIGxlbmd0aCAqLworCXVpbnQ4X3QgbGxfYWRkcl9sZW47CisJLyoqIExpbmstbGF5ZXIgaGVhZGVyIGxlbmd0aCAqLworCXVpbnQ4X3QgbGxfaGVhZGVyX2xlbjsKK307CisKKy8qKiBOZXR3b3JrIGRldmljZSBvcGVyYXRpb25zICovCitzdHJ1Y3QgbmV0X2RldmljZV9vcGVyYXRpb25zIHsKKwkvKiogT3BlbiBuZXR3b3JrIGRldmljZQorCSAqCisJICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisJICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBhbGxvY2F0ZSBSWCBJL08gYnVmZmVycyBhbmQgZW5hYmxlCisJICogdGhlIGhhcmR3YXJlIHRvIHN0YXJ0IHRyYW5zbWl0dGluZyBhbmQgcmVjZWl2aW5nIHBhY2tldHMuCisJICovCisJaW50ICggKiBvcGVuICkgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CisJLyoqIENsb3NlIG5ldHdvcmsgZGV2aWNlCisJICoKKwkgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UKKwkgKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBzdG9wIHRoZSBmbG93IG9mIHBhY2tldHMsIGFuZCBmcmVlIHVwCisJICogYW55IHBhY2tldHMgdGhhdCBhcmUgY3VycmVudGx5IGluIHRoZSBkZXZpY2UncyBUWCBxdWV1ZS4KKwkgKi8KKwl2b2lkICggKiBjbG9zZSApICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworCS8qKiBUcmFuc21pdCBwYWNrZXQKKwkgKgorCSAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorCSAqIEB2IGlvYnVmCUkvTyBidWZmZXIKKwkgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorCSAqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGNhdXNlIHRoZSBoYXJkd2FyZSB0byBpbml0aWF0ZQorCSAqIHRyYW5zbWlzc2lvbiBvZiB0aGUgSS9PIGJ1ZmZlci4KKwkgKgorCSAqIElmIHRoaXMgbWV0aG9kIHJldHVybnMgc3VjY2VzcywgdGhlIEkvTyBidWZmZXIgcmVtYWlucworCSAqIG93bmVkIGJ5IHRoZSBuZXQgZGV2aWNlJ3MgVFggcXVldWUsIGFuZCB0aGUgbmV0IGRldmljZSBtdXN0CisJICogZXZlbnR1YWxseSBjYWxsIG5ldGRldl90eF9jb21wbGV0ZSgpIHRvIGZyZWUgdGhlIGJ1ZmZlci4KKwkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhaWx1cmUsIHRoZSBJL08gYnVmZmVyIGlzCisJICogaW1tZWRpYXRlbHkgcmVsZWFzZWQ7IHRoZSBmYWlsdXJlIGlzIGludGVycHJldGVkIGFzCisJICogImZhaWx1cmUgdG8gZW5xdWV1ZSBidWZmZXIiLgorCSAqCisJICogVGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQgb25seSB3aGVuIHRoZSBkZXZpY2UKKwkgKiBpcyBvcGVuLgorCSAqLworCWludCAoICogdHJhbnNtaXQgKSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICk7CisJLyoqIFBvbGwgZm9yIGNvbXBsZXRlZCBhbmQgcmVjZWl2ZWQgcGFja2V0cworCSAqCisJICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisJICoKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgY2F1c2UgdGhlIGhhcmR3YXJlIHRvIGNoZWNrIGZvcgorCSAqIGNvbXBsZXRlZCB0cmFuc21pc3Npb25zIGFuZCByZWNlaXZlZCBwYWNrZXRzLiAgQW55IHJlY2VpdmVkCisJICogcGFja2V0cyBzaG91bGQgYmUgZGVsaXZlcmVkIHZpYSBuZXRkZXZfcngoKS4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGUgZGV2aWNlCisJICogaXMgb3Blbi4KKwkgKi8KKwl2b2lkICggKiBwb2xsICkgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CisJLyoqIEVuYWJsZSBvciBkaXNhYmxlIGludGVycnVwdHMKKwkgKgorCSAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorCSAqIEB2IGVuYWJsZQlJbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkCisJICovCisJdm9pZCAoICogaXJxICkgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgZW5hYmxlICk7Cit9OworCisvKiogTmV0d29yayBkZXZpY2UgZXJyb3IgKi8KK3N0cnVjdCBuZXRfZGV2aWNlX2Vycm9yIHsKKwkvKiogRXJyb3Igc3RhdHVzIGNvZGUgKi8KKwlpbnQgcmM7CisJLyoqIEVycm9yIGNvdW50ICovCisJdW5zaWduZWQgaW50IGNvdW50OworfTsKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSBlcnJvcnMgdGhhdCB3ZSB3aWxsIGtlZXAgdHJhY2sgb2YgKi8KKyNkZWZpbmUgTkVUREVWX01BWF9VTklRVUVfRVJST1JTIDQKKworLyoqIE5ldHdvcmsgZGV2aWNlIHN0YXRpc3RpY3MgKi8KK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHsKKwkvKiogQ291bnQgb2Ygc3VjY2Vzc2Z1bCBjb21wbGV0aW9ucyAqLworCXVuc2lnbmVkIGludCBnb29kOworCS8qKiBDb3VudCBvZiBlcnJvciBjb21wbGV0aW9ucyAqLworCXVuc2lnbmVkIGludCBiYWQ7CisJLyoqIEVycm9yIGJyZWFrZG93bnMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9lcnJvciBlcnJvcnNbTkVUREVWX01BWF9VTklRVUVfRVJST1JTXTsKK307CisKKy8qKgorICogQSBuZXR3b3JrIGRldmljZQorICoKKyAqIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBwaWVjZSBvZiBuZXR3b3JraW5nIGhhcmR3YXJlLiAgSXQgaGFzCisgKiBwcm9wZXJ0aWVzIHN1Y2ggYXMgYSBsaW5rLWxheWVyIGFkZHJlc3MgYW5kIG1ldGhvZHMgZm9yCisgKiB0cmFuc21pdHRpbmcgYW5kIHJlY2VpdmluZyByYXcgcGFja2V0cy4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgbXVzdCByZXByZXNlbnQgYSBnZW5lcmljIG5ldHdvcmsgZGV2aWNlLAorICogbm90IGp1c3QgYW4gRXRoZXJuZXQgZGV2aWNlLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSB7CisJLyoqIFJlZmVyZW5jZSBjb3VudGVyICovCisJc3RydWN0IHJlZmNudCByZWZjbnQ7CisJLyoqIExpc3Qgb2YgbmV0d29yayBkZXZpY2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8qKiBMaXN0IG9mIG9wZW4gbmV0d29yayBkZXZpY2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBvcGVuX2xpc3Q7CisJLyoqIE5hbWUgb2YgdGhpcyBuZXR3b3JrIGRldmljZSAqLworCWNoYXIgbmFtZVs4XTsKKwkvKiogVW5kZXJseWluZyBoYXJkd2FyZSBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwkvKiogTmV0d29yayBkZXZpY2Ugb3BlcmF0aW9ucyAqLworCXN0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgKm9wOworCisJLyoqIExpbmstbGF5ZXIgcHJvdG9jb2wgKi8KKwlzdHJ1Y3QgbGxfcHJvdG9jb2wgKmxsX3Byb3RvY29sOworCS8qKiBIYXJkd2FyZSBhZGRyZXNzCisJICoKKwkgKiBUaGlzIGlzIGFuIGFkZHJlc3Mgd2hpY2ggaXMgYW4gaW50cmluc2ljIHByb3BlcnR5IG9mIHRoZQorCSAqIGhhcmR3YXJlLCBlLmcuIGFuIGFkZHJlc3MgaGVsZCBpbiBFRVBST00uCisJICoKKwkgKiBOb3RlIHRoYXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgbWF5IG5vdCBiZSB0aGUgc2FtZSBsZW5ndGgKKwkgKiBhcyB0aGUgbGluay1sYXllciBhZGRyZXNzLgorCSAqLworCXVpbnQ4X3QgaHdfYWRkcltNQVhfSFdfQUREUl9MRU5dOworCS8qKiBMaW5rLWxheWVyIGFkZHJlc3MKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGN1cnJlbnQgbGluay1sYXllciBhZGRyZXNzIGFzc2lnbmVkIHRvIHRoZQorCSAqIGRldmljZS4gIEl0IGNhbiBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUuCisJICovCisJdWludDhfdCBsbF9hZGRyW01BWF9MTF9BRERSX0xFTl07CisJLyoqIExpbmstbGF5ZXIgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwljb25zdCB1aW50OF90ICpsbF9icm9hZGNhc3Q7CisKKwkvKiogQ3VycmVudCBkZXZpY2Ugc3RhdGUKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGJpdHdpc2UtT1Igb2YgemVybyBvciBtb3JlIE5FVERFVl9YWFggY29uc3RhbnRzLgorCSAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsKKwkvKiogTGluayBzdGF0dXMgY29kZQorCSAqCisJICogWmVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgbGluayBpcyB1cDsgYW55IG90aGVyIHZhbHVlCisJICogaW5kaWNhdGVzIHRoZSBlcnJvciBwcmV2ZW50aW5nIGxpbmstdXAuCisJICovCisJaW50IGxpbmtfcmM7CisJLyoqIE1heGltdW0gcGFja2V0IGxlbmd0aAorCSAqCisJICogVGhpcyBsZW5ndGggaW5jbHVkZXMgYW55IGxpbmstbGF5ZXIgaGVhZGVycy4KKwkgKi8KKwlzaXplX3QgbWF4X3BrdF9sZW47CisJLyoqIFRYIHBhY2tldCBxdWV1ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgdHhfcXVldWU7CisJLyoqIFJYIHBhY2tldCBxdWV1ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgcnhfcXVldWU7CisJLyoqIFRYIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyB0eF9zdGF0czsKKwkvKiogUlggc3RhdGlzdGljcyAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHJ4X3N0YXRzOworCisJLyoqIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYXBwbGljYWJsZSB0byB0aGlzIGRldmljZSAqLworCXN0cnVjdCBnZW5lcmljX3NldHRpbmdzIHNldHRpbmdzOworCisJLyoqIERyaXZlciBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICpwcml2OworfTsKKworLyoqIE5ldHdvcmsgZGV2aWNlIGlzIG9wZW4gKi8KKyNkZWZpbmUgTkVUREVWX09QRU4gMHgwMDAxCisKKy8qKiBMaW5rLWxheWVyIHByb3RvY29sIHRhYmxlICovCisjZGVmaW5lIExMX1BST1RPQ09MUyBfX3RhYmxlICggc3RydWN0IGxsX3Byb3RvY29sLCAibGxfcHJvdG9jb2xzIiApCisKKy8qKiBEZWNsYXJlIGEgbGluay1sYXllciBwcm90b2NvbCAqLworI2RlZmluZSBfX2xsX3Byb3RvY29sICBfX3RhYmxlX2VudHJ5ICggTExfUFJPVE9DT0xTLCAwMSApCisKKy8qKiBOZXR3b3JrLWxheWVyIHByb3RvY29sIHRhYmxlICovCisjZGVmaW5lIE5FVF9QUk9UT0NPTFMgX190YWJsZSAoIHN0cnVjdCBuZXRfcHJvdG9jb2wsICJuZXRfcHJvdG9jb2xzIiApCisKKy8qKiBEZWNsYXJlIGEgbmV0d29yay1sYXllciBwcm90b2NvbCAqLworI2RlZmluZSBfX25ldF9wcm90b2NvbCBfX3RhYmxlX2VudHJ5ICggTkVUX1BST1RPQ09MUywgMDEgKQorCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBuZXRfZGV2aWNlczsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZV9vcGVyYXRpb25zIG51bGxfbmV0ZGV2X29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IHNldHRpbmdzX29wZXJhdGlvbnMgbmV0ZGV2X3NldHRpbmdzX29wZXJhdGlvbnM7CisKKy8qKgorICogSW5pdGlhbGlzZSBhIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgb3AJCU5ldHdvcmsgZGV2aWNlIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG5ldGRldl9pbml0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgc3RydWN0IG5ldF9kZXZpY2Vfb3BlcmF0aW9ucyAqb3AgKSB7CisJbmV0ZGV2LT5vcCA9IG9wOworfQorCisvKioKKyAqIFN0b3AgdXNpbmcgYSBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqCisgKiBEcml2ZXJzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZmluYWwgY2FsbAorICogdG8gbmV0ZGV2X3B1dCgpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0ZGV2X251bGxpZnkgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCW5ldGRldi0+b3AgPSAmbnVsbF9uZXRkZXZfb3BlcmF0aW9uczsKK30KKworLyoqCisgKiBHZXQgcHJpbnRhYmxlIG5ldHdvcmsgZGV2aWNlIGxpbmstbGF5ZXIgYWRkcmVzcworICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEByZXQgbmFtZQkJTGluay1sYXllciBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqIG5ldGRldl9hZGRyICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlyZXR1cm4gbmV0ZGV2LT5sbF9wcm90b2NvbC0+bnRvYSAoIG5ldGRldi0+bGxfYWRkciApOworfQorCisvKiogSXRlcmF0ZSBvdmVyIGFsbCBuZXR3b3JrIGRldmljZXMgKi8KKyNkZWZpbmUgZm9yX2VhY2hfbmV0ZGV2KCBuZXRkZXYgKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIChuZXRkZXYpLCAmbmV0X2RldmljZXMsIGxpc3QgKQorCisvKiogVGhlcmUgZXhpc3Qgc29tZSBuZXR3b3JrIGRldmljZXMKKyAqCisgKiBAcmV0IGV4aXN0ZW5jZQlFeGlzdGVuY2Ugb2YgbmV0d29yayBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhhdmVfbmV0ZGV2cyAoIHZvaWQgKSB7CisJcmV0dXJuICggISBsaXN0X2VtcHR5ICggJm5ldF9kZXZpY2VzICkgKTsKK30KKworLyoqCisgKiBHZXQgcmVmZXJlbmNlIHRvIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHJldCBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHN0cnVjdCBuZXRfZGV2aWNlICoKK25ldGRldl9nZXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXJlZl9nZXQgKCAmbmV0ZGV2LT5yZWZjbnQgKTsKKwlyZXR1cm4gbmV0ZGV2OworfQorCisvKioKKyAqIERyb3AgcmVmZXJlbmNlIHRvIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCituZXRkZXZfcHV0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlyZWZfcHV0ICggJm5ldGRldi0+cmVmY250ICk7Cit9CisKKy8qKgorICogR2V0IGRyaXZlciBwcml2YXRlIGFyZWEgZm9yIHRoaXMgbmV0d29yayBkZXZpY2UKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAcmV0IHByaXYJCURyaXZlciBwcml2YXRlIGFyZWEgZm9yIHRoaXMgbmV0d29yayBkZXZpY2UKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZCAqCituZXRkZXZfcHJpdiAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisgICAgICAgIHJldHVybiBuZXRkZXYtPnByaXY7Cit9CisKKy8qKgorICogR2V0IHBlci1uZXRkZXZpY2UgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBibG9jaworICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEByZXQgc2V0dGluZ3MJU2V0dGluZ3MgYmxvY2sKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgc3RydWN0IHNldHRpbmdzICoKK25ldGRldl9zZXR0aW5ncyAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJcmV0dXJuICZuZXRkZXYtPnNldHRpbmdzLnNldHRpbmdzOworfQorCisvKioKKyAqIEluaXRpYWxpc2UgYSBwZXItbmV0ZGV2aWNlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYmxvY2sKKyAqCisgKiBAdiBnZW5lcmljcwkJR2VuZXJpYyBzZXR0aW5ncyBibG9jaworICogQHYgcmVmY250CQlDb250YWluaW5nIG9iamVjdCByZWZlcmVuY2UgY291bnRlciwgb3IgTlVMTAorICogQHYgbmFtZQkJU2V0dGluZ3MgYmxvY2sgbmFtZQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCituZXRkZXZfc2V0dGluZ3NfaW5pdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJZ2VuZXJpY19zZXR0aW5nc19pbml0ICggJm5ldGRldi0+c2V0dGluZ3MsCisJCQkJJm5ldGRldi0+cmVmY250LCBuZXRkZXYtPm5hbWUgKTsKKwluZXRkZXYtPnNldHRpbmdzLnNldHRpbmdzLm9wID0gJm5ldGRldl9zZXR0aW5nc19vcGVyYXRpb25zOworfQorCisvKioKKyAqIE1hcmsgbmV0d29yayBkZXZpY2UgYXMgaGF2aW5nIGxpbmsgdXAKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK25ldGRldl9saW5rX3VwICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwluZXRkZXYtPmxpbmtfcmMgPSAwOworfQorCisvKioKKyAqIE1hcmsgbmV0d29yayBkZXZpY2UgYXMgaGF2aW5nIGxpbmsgZG93biBkdWUgdG8gYSBzcGVjaWZpYyBlcnJvcgorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IHJjCQlMaW5rIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK25ldGRldl9saW5rX2VyciAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCByYyApIHsKKwluZXRkZXYtPmxpbmtfcmMgPSByYzsKK30KKworLyoqCisgKiBDaGVjayBsaW5rIHN0YXRlIG9mIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHJldCBsaW5rX3VwCQlMaW5rIGlzIHVwCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIGludAorbmV0ZGV2X2xpbmtfb2sgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXJldHVybiAoIG5ldGRldi0+bGlua19yYyA9PSAwICk7Cit9CisKK2V4dGVybiB2b2lkIG5ldGRldl9saW5rX2Rvd24gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CitleHRlcm4gaW50IG5ldGRldl90eCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICk7CitleHRlcm4gdm9pZCBuZXRkZXZfdHhfY29tcGxldGVfZXJyICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGludCByYyApOworZXh0ZXJuIHZvaWQgbmV0ZGV2X3R4X2NvbXBsZXRlX25leHRfZXJyICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHJjICk7CitleHRlcm4gdm9pZCBuZXRkZXZfcnggKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApOworZXh0ZXJuIHZvaWQgbmV0ZGV2X3J4X2VyciAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGludCByYyApOworZXh0ZXJuIHZvaWQgbmV0ZGV2X3BvbGwgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CitleHRlcm4gc3RydWN0IGlvX2J1ZmZlciAqIG5ldGRldl9yeF9kZXF1ZXVlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICogYWxsb2NfbmV0ZGV2ICggc2l6ZV90IHByaXZfc2l6ZSApOworZXh0ZXJuIGludCByZWdpc3Rlcl9uZXRkZXYgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CitleHRlcm4gaW50IG5ldGRldl9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworZXh0ZXJuIHZvaWQgbmV0ZGV2X2Nsb3NlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9uZXRkZXYgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CitleHRlcm4gdm9pZCBuZXRkZXZfaXJxICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGVuYWJsZSApOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICogZmluZF9uZXRkZXYgKCBjb25zdCBjaGFyICpuYW1lICk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKiBmaW5kX25ldGRldl9ieV9sb2NhdGlvbiAoIHVuc2lnbmVkIGludCBidXNfdHlwZSwKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50IGxvY2F0aW9uICk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKiBsYXN0X29wZW5lZF9uZXRkZXYgKCB2b2lkICk7CitleHRlcm4gaW50IG5ldF90eCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgc3RydWN0IG5ldF9wcm90b2NvbCAqbmV0X3Byb3RvY29sLCBjb25zdCB2b2lkICpsbF9kZXN0ICk7CitleHRlcm4gaW50IG5ldF9yeCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgdWludDE2X3QgbmV0X3Byb3RvLCBjb25zdCB2b2lkICpsbF9zb3VyY2UgKTsKKworLyoqCisgKiBDb21wbGV0ZSBuZXR3b3JrIHRyYW5zbWlzc2lvbgorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKgorICogVGhlIHBhY2tldCBtdXN0IGN1cnJlbnRseSBiZSBpbiB0aGUgbmV0d29yayBkZXZpY2UncyBUWCBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG5ldGRldl90eF9jb21wbGV0ZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCW5ldGRldl90eF9jb21wbGV0ZV9lcnIgKCBuZXRkZXYsIGlvYnVmLCAwICk7Cit9CisKKy8qKgorICogQ29tcGxldGUgbmV0d29yayB0cmFuc21pc3Npb24KKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKgorICogQ29tcGxldGVzIHRoZSBvbGRlc3Qgb3V0c3RhbmRpbmcgcGFja2V0IGluIHRoZSBUWCBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG5ldGRldl90eF9jb21wbGV0ZV9uZXh0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwluZXRkZXZfdHhfY29tcGxldGVfbmV4dF9lcnIgKCBuZXRkZXYsIDAgKTsKK30KKworI2VuZGlmIC8qIF9HUFhFX05FVERFVklDRV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbnVsbF9uYXAuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9udWxsX25hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDZlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbnVsbF9uYXAuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9HUFhFX05VTExfTkFQX0gKKyNkZWZpbmUgX0dQWEVfTlVMTF9OQVBfSAorCisvKiogQGZpbGUKKyAqCisgKiBOdWxsIENQVSBzbGVlcGluZworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpZmRlZiBOQVBfTlVMTAorI2RlZmluZSBOQVBfUFJFRklYX251bGwKKyNlbHNlCisjZGVmaW5lIE5BUF9QUkVGSVhfbnVsbCBfX251bGxfCisjZW5kaWYKKworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAorTkFQX0lOTElORSAoIG51bGwsIGNwdV9uYXAgKSAoIHZvaWQgKSB7CisJLyogRG8gbm90aGluZyAqLworfQorCisjZW5kaWYgLyogX0dQWEVfTlVMTF9OQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL252by5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL252by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjUwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvbnZvLmgKQEAgLTAsMCArMSw1NSBAQAorI2lmbmRlZiBfR1BYRV9OVk9fSAorI2RlZmluZSBfR1BYRV9OVk9fSAorCisvKiogQGZpbGUKKyAqCisgKiBOb24tdm9sYXRpbGUgc3RvcmVkIG9wdGlvbnMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9kaGNwb3B0cy5oPgorI2luY2x1ZGUgPGdweGUvc2V0dGluZ3MuaD4KKworc3RydWN0IG52c19kZXZpY2U7CitzdHJ1Y3QgcmVmY250OworCisvKioKKyAqIEEgZnJhZ21lbnQgb2YgYSBub24tdm9sYXRpbGUgc3RvcmFnZSBkZXZpY2UgdXNlZCBmb3Igc3RvcmVkIG9wdGlvbnMKKyAqLworc3RydWN0IG52b19mcmFnbWVudCB7CisJLyoqIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgZnJhZ21lbnQgd2l0aGluIE5WUyBkZXZpY2UgKi8KKwl1bnNpZ25lZCBpbnQgYWRkcmVzczsKKwkvKiogTGVuZ3RoIG9mIGZyYWdtZW50ICovCisJc2l6ZV90IGxlbjsKK307CisKKy8qKgorICogQSBibG9jayBvZiBub24tdm9sYXRpbGUgc3RvcmVkIG9wdGlvbnMKKyAqLworc3RydWN0IG52b19ibG9jayB7CisJLyoqIFNldHRpbmdzIGJsb2NrICovCisJc3RydWN0IHNldHRpbmdzIHNldHRpbmdzOworCS8qKiBVbmRlcmx5aW5nIG5vbi12b2xhdGlsZSBzdG9yYWdlIGRldmljZSAqLworCXN0cnVjdCBudnNfZGV2aWNlICpudnM7CisJLyoqIExpc3Qgb2Ygb3B0aW9uLWNvbnRhaW5pbmcgZnJhZ21lbnRzCisJICoKKwkgKiBUaGUgbGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IGEgZnJhZ21lbnQgd2l0aCBhIGxlbmd0aCBvZiB6ZXJvLgorCSAqLworCXN0cnVjdCBudm9fZnJhZ21lbnQgKmZyYWdtZW50czsKKwkvKiogVG90YWwgbGVuZ3RoIG9mIG9wdGlvbi1jb250YWluaW5nIGZyYWdtZW50cyAqLworCXNpemVfdCB0b3RhbF9sZW47CisJLyoqIE9wdGlvbi1jb250YWluaW5nIGRhdGEgKi8KKwl2b2lkICpkYXRhOworCS8qKiBESENQIG9wdGlvbnMgYmxvY2sgKi8KKwlzdHJ1Y3QgZGhjcF9vcHRpb25zIGRoY3BvcHRzOworfTsKKworZXh0ZXJuIHZvaWQgbnZvX2luaXQgKCBzdHJ1Y3QgbnZvX2Jsb2NrICpudm8sIHN0cnVjdCBudnNfZGV2aWNlICpudnMsCisJCSAgICAgICBzdHJ1Y3QgbnZvX2ZyYWdtZW50ICpmcmFnbWVudHMsIHN0cnVjdCByZWZjbnQgKnJlZmNudCApOworZXh0ZXJuIGludCByZWdpc3Rlcl9udm8gKCBzdHJ1Y3QgbnZvX2Jsb2NrICpudm8sIHN0cnVjdCBzZXR0aW5ncyAqcGFyZW50ICk7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX252byAoIHN0cnVjdCBudm9fYmxvY2sgKm52byApOworCisjZW5kaWYgLyogX0dQWEVfTlZPX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9udnMuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9udnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzkwYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL252cy5oCkBAIC0wLDAgKzEsNjggQEAKKyNpZm5kZWYgX0dQWEVfTlZTX0gKKyNkZWZpbmUgX0dQWEVfTlZTX0gKKworLyoqIEBmaWxlCisgKgorICogTm9uLXZvbGF0aWxlIHN0b3JhZ2UKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKiBBIG5vbi12b2xhdGlsZSBzdG9yYWdlIGRldmljZSAqLworc3RydWN0IG52c19kZXZpY2UgeworCS8qKiBXb3JkIGxlbmd0aAorCSAqCisJICogVGhpcyBpcyBleHByZXNzZWQgYXMgdGhlIGJhc2UtMiBsb2dhcml0aG0gb2YgdGhlIHdvcmQKKwkgKiBsZW5ndGggaW4gYnl0ZXMuICBBIHZhbHVlIG9mIDAgdGhlcmVmb3JlIHRyYW5zbGF0ZXMgYXMKKwkgKiA4LWJpdCB3b3JkcywgYW5kIGEgdmFsdWUgb2YgMSB0cmFuc2xhdGVzIGFzIDE2LWJpdCB3b3Jkcy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgd29yZF9sZW5fbG9nMjsKKwkvKiogRGV2aWNlIHNpemUgKGluIHdvcmRzKSAqLworCXVuc2lnbmVkIGludCBzaXplOworCS8qKiBEYXRhIGJsb2NrIHNpemUgKGluIHdvcmRzKQorCSAqCisJICogVGhpcyBpcyB0aGUgYmxvY2sgc2l6ZSB1c2VkIGJ5IHRoZSBkZXZpY2UuICBJdCBtdXN0IGJlIGEKKwkgKiBwb3dlciBvZiB0d28uICBEYXRhIHJlYWRzIGFuZCB3cml0ZXMgbXVzdCBub3QgY3Jvc3MgYSBibG9jaworCSAqIGJvdW5kYXJ5LgorCSAqCisJICogTWFueSBkZXZpY2VzIGFsbG93IHJlYWRzIHRvIGNyb3NzIGEgYmxvY2sgYm91bmRhcnksIGFuZAorCSAqIHJlc3RyaWN0IG9ubHkgd3JpdGVzLiAgRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIHdlCisJICogYXNzdW1lIHRoYXQgdGhlIHNhbWUgcmVzdHJpY3Rpb24gYXBwbGllcyB0byBib3RoIHJlYWRzIGFuZAorCSAqIHdyaXRlcy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZTsKKwkvKiogUmVhZCBkYXRhIGZyb20gZGV2aWNlCisJICoKKwkgKiBAdiBudnMJCU5WUyBkZXZpY2UKKwkgKiBAdiBhZGRyZXNzCQlBZGRyZXNzIGZyb20gd2hpY2ggdG8gcmVhZAorCSAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisJICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKgorCSAqIFJlYWRzIG1heSBub3QgY3Jvc3MgYSBibG9jayBib3VuZGFyeS4KKwkgKi8KKwlpbnQgKCAqIHJlYWQgKSAoIHN0cnVjdCBudnNfZGV2aWNlICpudnMsIHVuc2lnbmVkIGludCBhZGRyZXNzLAorCQkJIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKKwkvKiogV3JpdGUgZGF0YSB0byBkZXZpY2UKKwkgKgorCSAqIEB2IG52cwkJTlZTIGRldmljZQorCSAqIEB2IGFkZHJlc3MJCUFkZHJlc3MgdG8gd2hpY2ggdG8gd3JpdGUKKwkgKiBAdiBkYXRhCQlEYXRhIGJ1ZmZlcgorCSAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICoKKwkgKiBXcml0ZXMgbWF5IG5vdCBjcm9zcyBhIGJsb2NrIGJvdW5kYXJ5LgorCSAqLworCWludCAoICogd3JpdGUgKSAoIHN0cnVjdCBudnNfZGV2aWNlICpudnMsIHVuc2lnbmVkIGludCBhZGRyZXNzLAorCQkJICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7Cit9OworCitleHRlcm4gaW50IG52c19yZWFkICggc3RydWN0IG52c19kZXZpY2UgKm52cywgdW5zaWduZWQgaW50IGFkZHJlc3MsCisJCSAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKK2V4dGVybiBpbnQgbnZzX3dyaXRlICggc3RydWN0IG52c19kZXZpY2UgKm52cywgdW5zaWduZWQgaW50IGFkZHJlc3MsCisJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7CisKKyNlbmRpZiAvKiBfR1BYRV9OVlNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL29wZW4uaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9vcGVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmNzU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9vcGVuLmgKQEAgLTAsMCArMSwxMDUgQEAKKyNpZm5kZWYgX0dQWEVfT1BFTl9ICisjZGVmaW5lIF9HUFhFX09QRU5fSAorCisvKiogQGZpbGUKKyAqCisgKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZSBvcGVuaW5nCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisjaW5jbHVkZSA8Z3B4ZS9zb2NrZXQuaD4KKworc3RydWN0IHhmZXJfaW50ZXJmYWNlOworc3RydWN0IHVyaTsKKworLyoqIExvY2F0aW9uIHR5cGVzICovCitlbnVtIHsKKwkvKiogTG9jYXRpb24gaXMgYSBVUkkKKwkgKgorCSAqIFBhcmFtZXRlciBsaXN0IGZvciBvcGVuKCkgaXM6CisJICoKKwkgKiBzdHJ1Y3QgdXJpICp1cmk7CisJICovCisJTE9DQVRJT05fVVJJID0gMSwKKwkvKiogTG9jYXRpb24gaXMgYSBVUkkgc3RyaW5nCisJICoKKwkgKiBQYXJhbWV0ZXIgbGlzdCBmb3Igb3BlbigpIGlzOgorCSAqCisJICogY29uc3QgY2hhciAqdXJpX3N0cmluZzsKKwkgKi8KKwlMT0NBVElPTl9VUklfU1RSSU5HLAorCS8qKiBMb2NhdGlvbiBpcyBhIHNvY2tldAorCSAqCisJICogUGFyYW1ldGVyIGxpc3QgZm9yIG9wZW4oKSBpczoKKwkgKgorCSAqIGludCBzZW1hbnRpY3M7CisJICogc3RydWN0IHNvY2thZGRyICpwZWVyOworCSAqIHN0cnVjdCBzb2NrYWRkciAqbG9jYWw7CisJICovCisJTE9DQVRJT05fU09DS0VULAorfTsKKworLyoqIEEgVVJJIG9wZW5lciAqLworc3RydWN0IHVyaV9vcGVuZXIgeworCS8qKiBVUkkgcHJvdG9jb2wgbmFtZQorCSAqCisJICogVGhpcyBpcyB0aGUgInNjaGVtZSIgcG9ydGlvbiBvZiB0aGUgVVJJLCBlLmcuICJodHRwIiBvcgorCSAqICJmaWxlIi4KKwkgKi8KKwljb25zdCBjaGFyICpzY2hlbWU7CisJLyoqIE9wZW4gVVJJCisJICoKKwkgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorCSAqIEB2IHVyaQkJVVJJCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBvcGVuICkgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIHN0cnVjdCB1cmkgKnVyaSApOworfTsKKworLyoqIFVSSSBvcGVuZXIgdGFibGUgKi8KKyNkZWZpbmUgVVJJX09QRU5FUlMgX190YWJsZSAoIHN0cnVjdCB1cmlfb3BlbmVyLCAidXJpX29wZW5lcnMiICkKKworLyoqIFJlZ2lzdGVyIGEgVVJJIG9wZW5lciAqLworI2RlZmluZSBfX3VyaV9vcGVuZXIgX190YWJsZV9lbnRyeSAoIFVSSV9PUEVORVJTLCAwMSApCisKKy8qKiBBIHNvY2tldCBvcGVuZXIgKi8KK3N0cnVjdCBzb2NrZXRfb3BlbmVyIHsKKwkvKiogQ29tbXVuaWNhdGlvbiBzZW1hbnRpY3MgKGUuZy4gU09DS19TVFJFQU0pICovCisJaW50IHNlbWFudGljczsKKwkvKiogQWRkcmVzcyBmYW1pbHkgKGUuZy4gQUZfSU5FVCkgKi8KKwlpbnQgZmFtaWx5OworCS8qKiBPcGVuIHNvY2tldAorCSAqCisJICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKwkgKiBAdiBwZWVyCQlQZWVyIHNvY2tldCBhZGRyZXNzCisJICogQHYgbG9jYWwJCUxvY2FsIHNvY2tldCBhZGRyZXNzLCBvciBOVUxMCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBvcGVuICkgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIHN0cnVjdCBzb2NrYWRkciAqcGVlciwKKwkJCSBzdHJ1Y3Qgc29ja2FkZHIgKmxvY2FsICk7Cit9OworCisvKiogU29ja2V0IG9wZW5lciB0YWJsZSAqLworI2RlZmluZSBTT0NLRVRfT1BFTkVSUyBfX3RhYmxlICggc3RydWN0IHNvY2tldF9vcGVuZXIsICJzb2NrZXRfb3BlbmVycyIgKQorCisvKiogUmVnaXN0ZXIgYSBzb2NrZXQgb3BlbmVyICovCisjZGVmaW5lIF9fc29ja2V0X29wZW5lciBfX3RhYmxlX2VudHJ5ICggU09DS0VUX09QRU5FUlMsIDAxICkKKworZXh0ZXJuIGludCB4ZmVyX29wZW5fdXJpICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBzdHJ1Y3QgdXJpICp1cmkgKTsKK2V4dGVybiBpbnQgeGZlcl9vcGVuX3VyaV9zdHJpbmcgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkJICBjb25zdCBjaGFyICp1cmlfc3RyaW5nICk7CitleHRlcm4gaW50IHhmZXJfb3Blbl9uYW1lZF9zb2NrZXQgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkJICAgIGludCBzZW1hbnRpY3MsIHN0cnVjdCBzb2NrYWRkciAqcGVlciwKKwkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyICpsb2NhbCApOworZXh0ZXJuIGludCB4ZmVyX29wZW5fc29ja2V0ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgc2VtYW50aWNzLAorCQkJICAgICAgc3RydWN0IHNvY2thZGRyICpwZWVyLCBzdHJ1Y3Qgc29ja2FkZHIgKmxvY2FsICk7CitleHRlcm4gaW50IHhmZXJfdm9wZW4gKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGludCB0eXBlLCB2YV9saXN0IGFyZ3MgKTsKK2V4dGVybiBpbnQgeGZlcl9vcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgdHlwZSwgLi4uICk7CitleHRlcm4gaW50IHhmZXJfdnJlb3BlbiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHR5cGUsCisJCQkgIHZhX2xpc3QgYXJncyApOworCisjZW5kaWYgLyogX0dQWEVfT1BFTl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcGNpLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjZjFlMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9wY2kuaApAQCAtMCwwICsxLDQwMiBAQAorI2lmbmRlZglfR1BYRV9QQ0lfSAorI2RlZmluZSBfR1BYRV9QQ0lfSAorCisvKgorICogU3VwcG9ydCBmb3IgTkUyMDAwIFBDSSBjbG9uZXMgYWRkZWQgRGF2aWQgTW9ucm8gSnVuZSAxOTk3CisgKiBHZW5lcmFsaXNlZCBmb3Igb3RoZXIgUENJIE5JQ3MgYnkgS2VuIFlhcCBKdWx5IDE5OTcKKyAqIFBDSSBzdXBwb3J0IHJld3JpdHRlbiBieSBNaWNoYWVsIEJyb3duIDIwMDYKKyAqCisgKiBNb3N0IG9mIHRoaXMgaXMgdGFrZW4gZnJvbSAvdXNyL3NyYy9saW51eC9pbmNsdWRlL2xpbnV4L3BjaS5oLgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT05MWSApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9kZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorI2luY2x1ZGUgPGdweGUvcGNpX2lvLmg+CisjaW5jbHVkZSAicGNpX2lkcy5oIgorCisvKgorICogUENJIGNvbnN0YW50cworICoKKyAqLworCisjZGVmaW5lIFBDSV9DT01NQU5EX0lPCQkJMHgxCS8qIEVuYWJsZSByZXNwb25zZSBpbiBJL08gc3BhY2UgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkRfTUVNCQkJMHgyCS8qIEVuYWJsZSByZXNwb25zZSBpbiBtZW0gc3BhY2UgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkRfTUFTVEVSCQkweDQJLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKworI2RlZmluZSBQQ0lfQ0FDSEVfTElORV9TSVpFCQkweDBjCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTEFURU5DWV9USU1FUgkJMHgwZAkvKiA4IGJpdHMgKi8KKworI2RlZmluZSBQQ0lfQ09NTUFORF9TUEVDSUFMCQkweDgJLyogRW5hYmxlIHJlc3BvbnNlIHRvIHNwZWNpYWwgY3ljbGVzICovCisjZGVmaW5lIFBDSV9DT01NQU5EX0lOVkFMSURBVEUJCTB4MTAJLyogVXNlIG1lbW9yeSB3cml0ZSBhbmQgaW52YWxpZGF0ZSAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfVkdBX1BBTEVUVEUgMHgyMAkvKiBFbmFibGUgcGFsZXR0ZSBzbm9vcGluZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfUEFSSVRZCTB4NDAJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfV0FJVCAJMHg4MAkvKiBFbmFibGUgYWRkcmVzcy9kYXRhIHN0ZXBwaW5nICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9TRVJSCTB4MTAwCS8qIEVuYWJsZSBTRVJSICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9GQVNUX0JBQ0sJMHgyMDAJLyogRW5hYmxlIGJhY2stdG8tYmFjayB3cml0ZXMgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSAweDQwMCAvKiBJTlR4IEVtdWxhdGlvbiBEaXNhYmxlICovCisKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEICAgICAgICAgICAweDAwICAgIC8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRCAgICAgICAgICAgMHgwMiAgICAvKiAxNiBiaXRzICovCisjZGVmaW5lIFBDSV9DT01NQU5EICAgICAgICAgICAgIDB4MDQgICAgLyogMTYgYml0cyAqLworCisjZGVmaW5lIFBDSV9TVEFUVVMJCTB4MDYJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX1NUQVRVU19DQVBfTElTVAkweDEwCS8qIFN1cHBvcnQgQ2FwYWJpbGl0eSBMaXN0ICovCisjZGVmaW5lICBQQ0lfU1RBVFVTXzY2TUhaCTB4MjAJLyogU3VwcG9ydCA2NiBNaHogUENJIDIuMSBidXMgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfVURGCQkweDQwCS8qIFN1cHBvcnQgVXNlciBEZWZpbmFibGUgRmVhdHVyZXMgW29ic29sZXRlXSAqLworI2RlZmluZSAgUENJX1NUQVRVU19GQVNUX0JBQ0sJMHg4MAkvKiBBY2NlcHQgZmFzdC1iYWNrIHRvIGJhY2sgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUEFSSVRZCTB4MTAwCS8qIERldGVjdGVkIHBhcml0eSBlcnJvciAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUFTSwkweDYwMAkvKiBERVZTRUwgdGltaW5nICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9GQVNUCTB4MDAwCQorI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUVESVVNIDB4MjAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9TTE9XIDB4NDAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX1NJR19UQVJHRVRfQUJPUlQgMHg4MDAgLyogU2V0IG9uIHRhcmdldCBhYm9ydCAqLworI2RlZmluZSAgUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUIDB4MTAwMCAvKiBNYXN0ZXIgYWNrIG9mICIgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVCAweDIwMDAgLyogU2V0IG9uIG1hc3RlciBhYm9ydCAqLworI2RlZmluZSAgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SIDB4NDAwMCAvKiBTZXQgd2hlbiB3ZSBkcml2ZSBTRVJSICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSAweDgwMDAgLyogU2V0IG9uIHBhcml0eSBlcnJvciAqLworCisjZGVmaW5lIFBDSV9SRVZJU0lPTiAgICAgICAgICAgIDB4MDggICAgLyogOCBiaXRzICAqLworI2RlZmluZSBQQ0lfUkVWSVNJT05fSUQgICAgICAgICAweDA4ICAgIC8qIDggYml0cyAgKi8KKyNkZWZpbmUgUENJX0NMQVNTX1JFVklTSU9OICAgICAgMHgwOCAgICAvKiAzMiBiaXRzICAqLworI2RlZmluZSBQQ0lfQ0xBU1NfQ09ERSAgICAgICAgICAweDBiICAgIC8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfU1VCQ0xBU1NfQ09ERSAgICAgICAweDBhICAgIC8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfSEVBREVSX1RZUEUgICAgICAgICAweDBlICAgIC8qIDggYml0cyAqLworI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX05PUk1BTAkwCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfQlJJREdFIDEKKyNkZWZpbmUgIFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTIDIKKworCisvKiBIZWFkZXIgdHlwZSAwIChub3JtYWwgZGV2aWNlcykgKi8KKyNkZWZpbmUgUENJX0NBUkRCVVNfQ0lTCQkweDI4CisjZGVmaW5lIFBDSV9TVUJTWVNURU1fVkVORE9SX0lECTB4MmMKKyNkZWZpbmUgUENJX1NVQlNZU1RFTV9JRAkweDJlICAKKworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzAgICAgICAweDEwICAgIC8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18xICAgICAgMHgxNCAgICAvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMiAgICAgIDB4MTggICAgLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzMgICAgICAweDFjICAgIC8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU180ICAgICAgMHgyMCAgICAvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNSAgICAgIDB4MjQgICAgLyogMzIgYml0cyAqLworCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UJCTB4MDEgICAgLyogMCA9IG1lbW9yeSwgMSA9IEkvTyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPCTB4MDEKKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkJMHgwMAorCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSwkweDA2CisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMzIJMHgwMAkvKiAzMiBiaXQgYWRkcmVzcyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzFNCTB4MDIJLyogQmVsb3cgMU0gW29ic29sZXRlXSAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0CTB4MDQJLyogNjQgYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUJUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSwkofjB4MGYpCisjZGVmaW5lCVBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSwkofjB4MDMpCisjZGVmaW5lCVBDSV9ST01fQUREUkVTUwkJMHgzMAkvKiAzMiBiaXRzICovCisjZGVmaW5lCVBDSV9ST01fQUREUkVTU19FTkFCTEUJMHgwMQkvKiBXcml0ZSAxIHRvIGVuYWJsZSBST00sCisJCQkJCSAgIGJpdHMgMzEuLjExIGFyZSBhZGRyZXNzLAorCQkJCQkgICAxMC4uMiBhcmUgcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBQQ0lfQ0FQQUJJTElUWV9MSVNUCTB4MzQJLyogT2Zmc2V0IG9mIGZpcnN0IGNhcGFiaWxpdHkgbGlzdCBlbnRyeSAqLworCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfTElORQkweDNjCS8qIElSUSBudW1iZXIgKDAtMTUpICovCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfUElOCTB4M2QJLyogSVJRIHBpbiBvbiBQQ0kgYnVzIChBLUQpICovCisKKy8qIEhlYWRlciB0eXBlIDEgKFBDSS10by1QQ0kgYnJpZGdlcykgKi8KKyNkZWZpbmUgUENJX1BSSU1BUllfQlVTCQkweDE4CS8qIFByaW1hcnkgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfU0VDT05EQVJZX0JVUwkweDE5CS8qIFNlY29uZGFyeSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9TVUJPUkRJTkFURV9CVVMJMHgxYQkvKiBIaWdoZXN0IGJ1cyBudW1iZXIgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX1NFQ19MQVRFTkNZX1RJTUVSCTB4MWIJLyogTGF0ZW5jeSB0aW1lciBmb3Igc2Vjb25kYXJ5IGludGVyZmFjZSAqLworI2RlZmluZSBQQ0lfSU9fQkFTRQkJMHgxYwkvKiBJL08gcmFuZ2UgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX0lPX0xJTUlUCQkweDFkCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV9NQVNLCTB4MGYJLyogSS9PIGJyaWRnaW5nIHR5cGUgKi8KKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFXzE2CTB4MDAKKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFXzMyCTB4MDEKKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9NQVNLCX4weDBmCisjZGVmaW5lIFBDSV9TRUNfU1RBVFVTCQkweDFlCS8qIFNlY29uZGFyeSBzdGF0dXMgcmVnaXN0ZXIsIG9ubHkgYml0IDE0IHVzZWQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9CQVNFCQkweDIwCS8qIE1lbW9yeSByYW5nZSBiZWhpbmQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9MSU1JVAkweDIyCisjZGVmaW5lICBQQ0lfTUVNT1JZX1JBTkdFX1RZUEVfTUFTSyAweDBmCisjZGVmaW5lICBQQ0lfTUVNT1JZX1JBTkdFX01BU0sJfjB4MGYKKyNkZWZpbmUgUENJX1BSRUZfTUVNT1JZX0JBU0UJMHgyNAkvKiBQcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlIGJlaGluZCAqLworI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfTElNSVQJMHgyNgorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV9NQVNLIDB4MGYKKyNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX1RZUEVfMzIJMHgwMAorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV82NAkweDAxCisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9NQVNLCX4weDBmCisjZGVmaW5lIFBDSV9QUkVGX0JBU0VfVVBQRVIzMgkweDI4CS8qIFVwcGVyIGhhbGYgb2YgcHJlZmV0Y2hhYmxlIG1lbW9yeSByYW5nZSAqLworI2RlZmluZSBQQ0lfUFJFRl9MSU1JVF9VUFBFUjMyCTB4MmMKKyNkZWZpbmUgUENJX0lPX0JBU0VfVVBQRVIxNgkweDMwCS8qIFVwcGVyIGhhbGYgb2YgSS9PIGFkZHJlc3NlcyAqLworI2RlZmluZSBQQ0lfSU9fTElNSVRfVVBQRVIxNgkweDMyCisvKiAweDM0IHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKy8qIDB4MzUtMHgzYiBpcyByZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MxCTB4MzgJLyogU2FtZSBhcyBQQ0lfUk9NX0FERFJFU1MsIGJ1dCBmb3IgaHR5cGUgMSAqLworLyogMHgzYy0weDNkIGFyZSBzYW1lIGFzIGZvciBodHlwZSAwICovCisjZGVmaW5lIFBDSV9CUklER0VfQ09OVFJPTAkweDNlCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9QQVJJVFkJMHgwMQkvKiBFbmFibGUgcGFyaXR5IGRldGVjdGlvbiBvbiBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9TRVJSCTB4MDIJLyogVGhlIHNhbWUgZm9yIFNFUlIgZm9yd2FyZGluZyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfTk9fSVNBCTB4MDQJLyogRGlzYWJsZSBicmlkZ2luZyBvZiBJU0EgcG9ydHMgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1ZHQQkweDA4CS8qIEZvcndhcmQgVkdBIGFkZHJlc3NlcyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUIDB4MjAgIC8qIFJlcG9ydCBtYXN0ZXIgYWJvcnRzICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9CVVNfUkVTRVQgMHg0MAkvKiBTZWNvbmRhcnkgYnVzIHJlc2V0ICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9GQVNUX0JBQ0sgMHg4MAkvKiBGYXN0IEJhY2syQmFjayBlbmFibGVkIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KKworI2RlZmluZSBQQ0lfQ0JfQ0FQQUJJTElUWV9MSVNUCTB4MTQKKworLyogQ2FwYWJpbGl0eSBsaXN0cyAqLworCisjZGVmaW5lIFBDSV9DQVBfTElTVF9JRAkJMAkvKiBDYXBhYmlsaXR5IElEICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1BNCQkweDAxCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQUdQCQkweDAyCS8qIEFjY2VsZXJhdGVkIEdyYXBoaWNzIFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfVlBECQkweDAzCS8qIFZpdGFsIFByb2R1Y3QgRGF0YSAqLworI2RlZmluZSAgUENJX0NBUF9JRF9TTE9USUQJMHgwNAkvKiBTbG90IElkZW50aWZpY2F0aW9uICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX01TSQkJMHgwNQkvKiBNZXNzYWdlIFNpZ25hbGxlZCBJbnRlcnJ1cHRzICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0NIU1dQCTB4MDYJLyogQ29tcGFjdFBDSSBIb3RTd2FwICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0VYUAkJMHgxMAkvKiBQQ0kgRXhwcmVzcyAqLworI2RlZmluZSBQQ0lfQ0FQX0xJU1RfTkVYVAkxCS8qIE5leHQgY2FwYWJpbGl0eSBpbiB0aGUgbGlzdCAqLworI2RlZmluZSBQQ0lfQ0FQX0ZMQUdTCQkyCS8qIENhcGFiaWxpdHkgZGVmaW5lZCBmbGFncyAoMTYgYml0cykgKi8KKyNkZWZpbmUgUENJX0NBUF9TSVpFT0YJCTQKKworLyogUG93ZXIgTWFuYWdlbWVudCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfUE1fUE1DICAgICAgICAgICAgICAyICAgICAgIC8qIFBNIENhcGFiaWxpdGllcyBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX1BNX0NBUF9WRVJfTUFTSwkweDAwMDcJLyogVmVyc2lvbiAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfQ0xPQ0sJMHgwMDA4CS8qIFBNRSBjbG9jayByZXF1aXJlZCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9SRVNFUlZFRCAgICAweDAwMTAgIC8qIFJlc2VydmVkIGZpZWxkICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0RTSQkJMHgwMDIwCS8qIERldmljZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSAgUENJX1BNX0NBUF9BVVhfUE9XRVIJMHgwMUMwCS8qIEF1eGlsbGlhcnkgcG93ZXIgc3VwcG9ydCBtYXNrICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0QxCQkweDAyMDAJLyogRDEgcG93ZXIgc3RhdGUgc3VwcG9ydCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9EMgkJMHgwNDAwCS8qIEQyIHBvd2VyIHN0YXRlIHN1cHBvcnQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FCQkweDA4MDAJLyogUE1FIHBpbiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX01BU0sgICAgMHhGODAwICAvKiBQTUUgTWFzayBvZiBhbGwgc3VwcG9ydGVkIHN0YXRlcyAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDAgICAgICAweDA4MDAgIC8qIFBNRSMgZnJvbSBEMCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDEgICAgICAweDEwMDAgIC8qIFBNRSMgZnJvbSBEMSAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDIgICAgICAweDIwMDAgIC8qIFBNRSMgZnJvbSBEMiAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDMgICAgICAweDQwMDAgIC8qIFBNRSMgZnJvbSBEMyAoaG90KSAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDNjb2xkICAweDgwMDAgIC8qIFBNRSMgZnJvbSBEMyAoY29sZCkgKi8KKyNkZWZpbmUgUENJX1BNX0NUUkwJCTQJLyogUE0gY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLCTB4MDAwMwkvKiBDdXJyZW50IHBvd2VyIHN0YXRlIChEMCB0byBEMykgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX1BNRV9FTkFCTEUJMHgwMTAwCS8qIFBNRSBwaW4gZW5hYmxlICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9EQVRBX1NFTF9NQVNLCTB4MWUwMAkvKiBEYXRhIHNlbGVjdCAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9EQVRBX1NDQUxFX01BU0sJMHg2MDAwCS8qIERhdGEgc2NhbGUgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfUE1FX1NUQVRVUwkweDgwMDAJLyogUE1FIHBpbiBzdGF0dXMgKi8KKyNkZWZpbmUgUENJX1BNX1BQQl9FWFRFTlNJT05TCTYJLyogUFBCIHN1cHBvcnQgZXh0ZW5zaW9ucyAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fUFBCX0IyX0IzCTB4NDAJLyogU3RvcCBjbG9jayB3aGVuIGluIEQzaG90ICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9CUENDX0VOQUJMRQkweDgwCS8qIEJ1cyBwb3dlci9jbG9jayBjb250cm9sIGVuYWJsZSAoPz8pICovCisjZGVmaW5lIFBDSV9QTV9EQVRBX1JFR0lTVEVSCTcJLyogKD8/KSAqLworI2RlZmluZSBQQ0lfUE1fU0laRU9GCQk4CisKKy8qIEFHUCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfQUdQX1ZFUlNJT04JCTIJLyogQkNEIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIFBDSV9BR1BfUkZVCQkzCS8qIFJlc3Qgb2YgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBQQ0lfQUdQX1NUQVRVUwkJNAkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JRX01BU0sJMHhmZjAwMDAwMAkvKiBNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyAtIDEgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1NCQQkweDAyMDAJLyogU2lkZWJhbmQgYWRkcmVzc2luZyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTXzY0QklUCTB4MDAyMAkvKiA2NC1iaXQgYWRkcmVzc2luZyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX0ZXCTB4MDAxMAkvKiBGVyB0cmFuc2ZlcnMgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFNAkweDAwMDQJLyogNHggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEUyCTB4MDAwMgkvKiAyeCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTEJMHgwMDAxCS8qIDF4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lIFBDSV9BR1BfQ09NTUFORAkJOAkvKiBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUlFfTUFTSyAweGZmMDAwMDAwICAvKiBNYXN0ZXI6IE1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfU0JBCTB4MDIwMAkvKiBTaWRlYmFuZCBhZGRyZXNzaW5nIGVuYWJsZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9BR1AJMHgwMTAwCS8qIEFsbG93IHByb2Nlc3Npbmcgb2YgQUdQIHRyYW5zYWN0aW9ucyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EXzY0QklUCTB4MDAyMCAJLyogQWxsb3cgcHJvY2Vzc2luZyBvZiA2NC1iaXQgYWRkcmVzc2VzICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfRlcJMHgwMDEwIAkvKiBGb3JjZSBGVyB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9SQVRFNAkweDAwMDQJLyogVXNlIDR4IHJhdGUgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9SQVRFMgkweDAwMDIJLyogVXNlIDJ4IHJhdGUgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9SQVRFMQkweDAwMDEJLyogVXNlIDF4IHJhdGUgKi8KKyNkZWZpbmUgUENJX0FHUF9TSVpFT0YJCTEyCisKKy8qIFNsb3QgSWRlbnRpZmljYXRpb24gKi8KKworI2RlZmluZSBQQ0lfU0lEX0VTUgkJMgkvKiBFeHBhbnNpb24gU2xvdCBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX1NJRF9FU1JfTlNMT1RTCTB4MWYJLyogTnVtYmVyIG9mIGV4cGFuc2lvbiBzbG90cyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgIFBDSV9TSURfRVNSX0ZJQwkweDIwCS8qIEZpcnN0IEluIENoYXNzaXMgRmxhZyAqLworI2RlZmluZSBQQ0lfU0lEX0NIQVNTSVNfTlIJMwkvKiBDaGFzc2lzIE51bWJlciAqLworCisvKiBNZXNzYWdlIFNpZ25hbGxlZCBJbnRlcnJ1cHRzIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9NU0lfRkxBR1MJCTIJLyogVmFyaW91cyBmbGFncyAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU182NEJJVAkweDgwCS8qIDY0LWJpdCBhZGRyZXNzZXMgYWxsb3dlZCAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19RU0laRQkweDcwCS8qIE1lc3NhZ2UgcXVldWUgc2l6ZSBjb25maWd1cmVkICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTX1FNQVNLCTB4MGUJLyogTWF4aW11bSBxdWV1ZSBzaXplIGF2YWlsYWJsZSAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19FTkFCTEUJMHgwMQkvKiBNU0kgZmVhdHVyZSBlbmFibGVkICovCisjZGVmaW5lIFBDSV9NU0lfUkZVCQkzCS8qIFJlc3Qgb2YgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBQQ0lfTVNJX0FERFJFU1NfTE8JNAkvKiBMb3dlciAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9NU0lfQUREUkVTU19ISQk4CS8qIFVwcGVyIDMyIGJpdHMgKGlmIFBDSV9NU0lfRkxBR1NfNjRCSVQgc2V0KSAqLworI2RlZmluZSBQQ0lfTVNJX0RBVEFfMzIJCTgJLyogMTYgYml0cyBvZiBkYXRhIGZvciAzMi1iaXQgZGV2aWNlcyAqLworI2RlZmluZSBQQ0lfTVNJX0RBVEFfNjQJCTEyCS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgNjQtYml0IGRldmljZXMgKi8KKworLyogQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nICovCisKKyNkZWZpbmUgUENJX0VSUl9VTkNPUl9TVEFUVVMJNAkvKiBVbmNvcnJlY3RhYmxlIEVycm9yIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfVFJBSU4JMHgwMDAwMDAwMQkvKiBUcmFpbmluZyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfRExQCTB4MDAwMDAwMTAJLyogRGF0YSBMaW5rIFByb3RvY29sICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19QT0lTT05fVExQCTB4MDAwMDEwMDAJLyogUG9pc29uZWQgVExQICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19GQ1AJMHgwMDAwMjAwMAkvKiBGbG93IENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX0NPTVBfVElNRQkweDAwMDA0MDAwCS8qIENvbXBsZXRpb24gVGltZW91dCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfQ09NUF9BQk9SVAkweDAwMDA4MDAwCS8qIENvbXBsZXRlciBBYm9ydCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfVU5YX0NPTVAJMHgwMDAxMDAwMAkvKiBVbmV4cGVjdGVkIENvbXBsZXRpb24gKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1JYX09WRVIJMHgwMDAyMDAwMAkvKiBSZWNlaXZlciBPdmVyZmxvdyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfTUFMRl9UTFAJMHgwMDA0MDAwMAkvKiBNYWxmb3JtZWQgVExQICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19FQ1JDCTB4MDAwODAwMDAJLyogRUNSQyBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1VOU1VQCTB4MDAxMDAwMDAJLyogVW5zdXBwb3J0ZWQgUmVxdWVzdCAqLworI2RlZmluZSBQQ0lfRVJSX1VOQ09SX01BU0sJOAkvKiBVbmNvcnJlY3RhYmxlIEVycm9yIE1hc2sgKi8KKwkvKiBTYW1lIGJpdHMgYXMgYWJvdmUgKi8KKyNkZWZpbmUgUENJX0VSUl9VTkNPUl9TRVZFUgkxMgkvKiBVbmNvcnJlY3RhYmxlIEVycm9yIFNldmVyaXR5ICovCisJLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCisjZGVmaW5lIFBDSV9FUlJfQ09SX1NUQVRVUwkxNgkvKiBDb3JyZWN0YWJsZSBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX1JDVlIJMHgwMDAwMDAwMQkvKiBSZWNlaXZlciBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX0JBRF9UTFAJMHgwMDAwMDA0MAkvKiBCYWQgVExQIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9DT1JfQkFEX0RMTFAJMHgwMDAwMDA4MAkvKiBCYWQgRExMUCBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX1JFUF9ST0xMCTB4MDAwMDAxMDAJLyogUkVQTEFZX05VTSBSb2xsb3ZlciAqLworI2RlZmluZSAgUENJX0VSUl9DT1JfUkVQX1RJTUVSCTB4MDAwMDEwMDAJLyogUmVwbGF5IFRpbWVyIFRpbWVvdXQgKi8KKyNkZWZpbmUgUENJX0VSUl9DT1JfTUFTSwkyMAkvKiBDb3JyZWN0YWJsZSBFcnJvciBNYXNrICovCisJLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCisKKy8qKiBBIFBDSSBkZXZpY2UgSUQgbGlzdCBlbnRyeSAqLworc3RydWN0IHBjaV9kZXZpY2VfaWQgeworCS8qKiBOYW1lICovCisJY29uc3QgY2hhciAqbmFtZTsKKwkvKiogUENJIHZlbmRvciBJRCAqLworCXVpbnQxNl90IHZlbmRvcjsKKwkvKiogUENJIGRldmljZSBJRCAqLworCXVpbnQxNl90IGRldmljZTsKKwkvKiogQXJiaXRyYXJ5IGRyaXZlciBkYXRhICovCisJdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YTsKK307CisKKy8qKiBNYXRjaC1hbnl0aGluZyBJRCAqLworI2RlZmluZSBQQ0lfQU5ZX0lEIDB4ZmZmZgorCisvKiogQSBQQ0kgZGV2aWNlICovCitzdHJ1Y3QgcGNpX2RldmljZSB7CisJLyoqIEdlbmVyaWMgZGV2aWNlICovCisJc3RydWN0IGRldmljZSBkZXY7CisJLyoqIE1lbW9yeSBiYXNlCisJICoKKwkgKiBUaGlzIGlzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBmaXJzdCB2YWxpZCBtZW1vcnkgQkFSLgorCSAqLworCXVuc2lnbmVkIGxvbmcgbWVtYmFzZTsKKwkvKioKKwkgKiBJL08gYWRkcmVzcworCSAqCisJICogVGhpcyBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZmlyc3QgdmFsaWQgSS9PIEJBUi4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwkvKiogVmVuZG9yIElEICovCisJdWludDE2X3QgdmVuZG9yOworCS8qKiBEZXZpY2UgSUQgKi8KKwl1aW50MTZfdCBkZXZpY2U7CisJLyoqIERldmljZSBjbGFzcyAqLworCXVpbnQzMl90IGNsYXNzOworCS8qKiBJbnRlcnJ1cHQgbnVtYmVyICovCisJdWludDhfdCBpcnE7CisJLyoqIEJ1cyBudW1iZXIgKi8KKwl1aW50OF90IGJ1czsKKwkvKiogRGV2aWNlIGFuZCBmdW5jdGlvbiBudW1iZXIgKi8KKwl1aW50OF90IGRldmZuOworCS8qKiBEcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCisJc3RydWN0IHBjaV9kcml2ZXIgKmRyaXZlcjsKKwkvKiogRHJpdmVyLXByaXZhdGUgZGF0YQorCSAqCisJICogVXNlIHBjaV9zZXRfZHJ2ZGF0YSgpIGFuZCBwY2lfZ2V0X2RydmRhdGEoKSB0byBhY2Nlc3MgdGhpcworCSAqIGZpZWxkLgorCSAqLworCXZvaWQgKnByaXY7CisJLyoqIERyaXZlciBuYW1lICovCisJY29uc3QgY2hhciAqZHJpdmVyX25hbWU7Cit9OworCisvKiogQSBQQ0kgZHJpdmVyICovCitzdHJ1Y3QgcGNpX2RyaXZlciB7CisJLyoqIFBDSSBJRCB0YWJsZSAqLworCXN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHM7CisJLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIFBDSSBJRCB0YWJsZSAqLworCXVuc2lnbmVkIGludCBpZF9jb3VudDsKKwkvKioKKwkgKiBQcm9iZSBkZXZpY2UKKwkgKgorCSAqIEB2IHBjaQlQQ0kgZGV2aWNlCisJICogQHYgaWQJTWF0Y2hpbmcgZW50cnkgaW4gSUQgdGFibGUKKwkgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorCSAqLworCWludCAoICogcHJvYmUgKSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCApOworCS8qKgorCSAqIFJlbW92ZSBkZXZpY2UKKwkgKgorCSAqIEB2IHBjaQlQQ0kgZGV2aWNlCisJICovCisJdm9pZCAoICogcmVtb3ZlICkgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICk7Cit9OworCisvKiogUENJIGRyaXZlciB0YWJsZSAqLworI2RlZmluZSBQQ0lfRFJJVkVSUyBfX3RhYmxlICggc3RydWN0IHBjaV9kcml2ZXIsICJwY2lfZHJpdmVycyIgKQorCisvKiogRGVjbGFyZSBhIFBDSSBkcml2ZXIgKi8KKyNkZWZpbmUgX19wY2lfZHJpdmVyIF9fdGFibGVfZW50cnkgKCBQQ0lfRFJJVkVSUywgMDEgKQorCisjZGVmaW5lIFBDSV9ERVZGTiggc2xvdCwgZnVuYyApCQkoICggKHNsb3QpIDw8IDMgKSB8IChmdW5jKSApCisjZGVmaW5lIFBDSV9TTE9UKCBkZXZmbiApCQkoICggKGRldmZuKSA+PiAzICkgJiAweDFmICkKKyNkZWZpbmUgUENJX0ZVTkMoIGRldmZuICkJCSggKGRldmZuKSAmIDB4MDcgKQorI2RlZmluZSBQQ0lfQlVTKCBidXNkZXZmbiApCQkoIChidXNkZXZmbikgPj4gOCApCisjZGVmaW5lIFBDSV9CVVNERVZGTiggYnVzLCBkZXZmbiApCSggKCAoYnVzKSA8PCA4ICkgfCAoZGV2Zm4pICkKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTUyggY2xhc3MgKQkJKCAoY2xhc3MpID4+IDE2ICkKKyNkZWZpbmUgUENJX1NVQl9DTEFTUyggY2xhc3MgKQkJKCAoIChjbGFzcykgPj4gOCApICYgMHhmZiApCisjZGVmaW5lIFBDSV9QUk9HX0lOVEYoIGNsYXNzICkJCSggKGNsYXNzKSAmIDB4ZmYgKQorCisvKgorICogUENJX1JPTSBpcyB1c2VkIHRvIGJ1aWxkIHVwIGVudHJpZXMgaW4gYSBzdHJ1Y3QgcGNpX2lkIGFycmF5LiAgSXQKKyAqIGlzIGFsc28gcGFyc2VkIGJ5IHBhcnNlcm9tLnBsIHRvIGdlbmVyYXRlIE1ha2VmaWxlIHJ1bGVzIGFuZCBmaWxlcworICogZm9yIHJvbS1vLW1hdGljLgorICoKKyAqIFBDSV9JRCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBlbnRyaWVzIHdpdGhvdXQgY3JlYXRpbmcgYQorICogY29ycmVzcG9uZGluZyBST00gaW4gdGhlIGJ1aWxkIHByb2Nlc3MuCisgKi8KKyNkZWZpbmUgUENJX0lEKCBfdmVuZG9yLCBfZGV2aWNlLCBfbmFtZSwgX2Rlc2NyaXB0aW9uLCBfZGF0YSApIHsJXAorCS52ZW5kb3IgPSBfdmVuZG9yLAkJCQkJCVwKKwkuZGV2aWNlID0gX2RldmljZSwJCQkJCQlcCisJLm5hbWUgPSBfbmFtZSwJCQkJCQkJXAorCS5kcml2ZXJfZGF0YSA9IF9kYXRhCQkJCQkJXAorfQorI2RlZmluZSBQQ0lfUk9NKCBfdmVuZG9yLCBfZGV2aWNlLCBfbmFtZSwgX2Rlc2NyaXB0aW9uLCBfZGF0YSApIFwKKwlQQ0lfSUQoIF92ZW5kb3IsIF9kZXZpY2UsIF9uYW1lLCBfZGVzY3JpcHRpb24sIF9kYXRhICkKKworZXh0ZXJuIHZvaWQgYWRqdXN0X3BjaV9kZXZpY2UgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYmFyX3N0YXJ0ICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByZWcgKTsKK2V4dGVybiBpbnQgcGNpX2ZpbmRfY2FwYWJpbGl0eSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIGludCBjYXBhYmlsaXR5ICk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYmFyX3NpemUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCB1bnNpZ25lZCBpbnQgcmVnICk7CisKKy8qKgorICogU2V0IFBDSSBkcml2ZXItcHJpdmF0ZSBkYXRhCisgKgorICogQHYgcGNpCQlQQ0kgZGV2aWNlCisgKiBAdiBwcml2CQlQcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHBjaV9zZXRfZHJ2ZGF0YSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIHZvaWQgKnByaXYgKSB7CisJcGNpLT5wcml2ID0gcHJpdjsKK30KKworLyoqCisgKiBHZXQgUENJIGRyaXZlci1wcml2YXRlIGRhdGEKKyAqCisgKiBAdiBwY2kJCVBDSSBkZXZpY2UKKyAqIEByZXQgcHJpdgkJUHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqIHBjaV9nZXRfZHJ2ZGF0YSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgKSB7CisJcmV0dXJuIHBjaS0+cHJpdjsKK30KKworI2VuZGlmCS8qIF9HUFhFX1BDSV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcGNpX2lkcy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3BjaV9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA3MDEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3BjaV9pZHMuaApAQCAtMCwwICsxLDM1MSBAQAorI2lmbmRlZiBfR1BYRV9QQ0lfSURTX0gKKyNkZWZpbmUgX0dQWEVfUENJX0lEU19ICisKKy8qCisgKglQQ0kgQ2xhc3MsIFZlbmRvciBhbmQgRGV2aWNlIElEcworICoKKyAqCVBsZWFzZSBrZWVwIHNvcnRlZC4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09OTFkgKTsKKworLyogRGV2aWNlIGNsYXNzZXMgYW5kIHN1YmNsYXNzZXMgKi8KKworI2RlZmluZSBQQ0lfQ0xBU1NfTk9UX0RFRklORUQJCTB4MDAwMAorI2RlZmluZSBQQ0lfQ0xBU1NfTk9UX0RFRklORURfVkdBCTB4MDAwMQorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX1NUT1JBR0UJCTB4MDEKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfU0NTSQkJMHgwMTAwCisjZGVmaW5lIFBDSV9DTEFTU19TVE9SQUdFX0lERQkJMHgwMTAxCisjZGVmaW5lIFBDSV9DTEFTU19TVE9SQUdFX0ZMT1BQWQkweDAxMDIKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfSVBJCQkweDAxMDMKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfUkFJRAkJMHgwMTA0CisjZGVmaW5lIFBDSV9DTEFTU19TVE9SQUdFX09USEVSCQkweDAxODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19ORVRXT1JLCQkweDAyCisjZGVmaW5lIFBDSV9DTEFTU19ORVRXT1JLX0VUSEVSTkVUCTB4MDIwMAorI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19UT0tFTl9SSU5HCTB4MDIwMQorI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19GRERJCQkweDAyMDIKKyNkZWZpbmUgUENJX0NMQVNTX05FVFdPUktfQVRNCQkweDAyMDMKKyNkZWZpbmUgUENJX0NMQVNTX05FVFdPUktfT1RIRVIJCTB4MDI4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkJCTB4MDMKKyNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVlfVkdBCQkweDAzMDAKKyNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVlfWEdBCQkweDAzMDEKKyNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVlfM0QJCTB4MDMwMgorI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWV9PVEhFUgkJMHgwMzgwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfTVVMVElNRURJQQkweDA0CisjZGVmaW5lIFBDSV9DTEFTU19NVUxUSU1FRElBX1ZJREVPCTB4MDQwMAorI2RlZmluZSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTwkweDA0MDEKKyNkZWZpbmUgUENJX0NMQVNTX01VTFRJTUVESUFfUEhPTkUJMHgwNDAyCisjZGVmaW5lIFBDSV9DTEFTU19NVUxUSU1FRElBX09USEVSCTB4MDQ4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX01FTU9SWQkJMHgwNQorI2RlZmluZSBQQ0lfQ0xBU1NfTUVNT1JZX1JBTQkJMHgwNTAwCisjZGVmaW5lIFBDSV9DTEFTU19NRU1PUllfRkxBU0gJCTB4MDUwMQorI2RlZmluZSBQQ0lfQ0xBU1NfTUVNT1JZX09USEVSCQkweDA1ODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19CUklER0UJCTB4MDYKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9IT1NUCQkweDA2MDAKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9JU0EJCTB4MDYwMQorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX0VJU0EJCTB4MDYwMgorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX01DCQkweDA2MDMKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9QQ0kJCTB4MDYwNAorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX1BDTUNJQQkJMHgwNjA1CisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfTlVCVVMJCTB4MDYwNgorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX0NBUkRCVVMJMHgwNjA3CisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfUkFDRVdBWQkweDA2MDgKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9PVEhFUgkJMHgwNjgwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfQ09NTVVOSUNBVElPTgkweDA3CisjZGVmaW5lIFBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX1NFUklBTAkweDA3MDAKKyNkZWZpbmUgUENJX0NMQVNTX0NPTU1VTklDQVRJT05fUEFSQUxMRUwgMHgwNzAxCisjZGVmaW5lIFBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX01VTFRJU0VSSUFMIDB4MDcwMgorI2RlZmluZSBQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9NT0RFTQkweDA3MDMKKyNkZWZpbmUgUENJX0NMQVNTX0NPTU1VTklDQVRJT05fT1RIRVIJMHgwNzgwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfU1lTVEVNCQkweDA4CisjZGVmaW5lIFBDSV9DTEFTU19TWVNURU1fUElDCQkweDA4MDAKKyNkZWZpbmUgUENJX0NMQVNTX1NZU1RFTV9ETUEJCTB4MDgwMQorI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1RJTUVSCQkweDA4MDIKKyNkZWZpbmUgUENJX0NMQVNTX1NZU1RFTV9SVEMJCTB4MDgwMworI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1BDSV9IT1RQTFVHCTB4MDgwNAorI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX09USEVSCQkweDA4ODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19JTlBVVAkJMHgwOQorI2RlZmluZSBQQ0lfQ0xBU1NfSU5QVVRfS0VZQk9BUkQJMHgwOTAwCisjZGVmaW5lIFBDSV9DTEFTU19JTlBVVF9QRU4JCTB4MDkwMQorI2RlZmluZSBQQ0lfQ0xBU1NfSU5QVVRfTU9VU0UJCTB4MDkwMgorI2RlZmluZSBQQ0lfQ0xBU1NfSU5QVVRfU0NBTk5FUgkJMHgwOTAzCisjZGVmaW5lIFBDSV9DTEFTU19JTlBVVF9HQU1FUE9SVAkweDA5MDQKKyNkZWZpbmUgUENJX0NMQVNTX0lOUFVUX09USEVSCQkweDA5ODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19ET0NLSU5HCQkweDBhCisjZGVmaW5lIFBDSV9DTEFTU19ET0NLSU5HX0dFTkVSSUMJMHgwYTAwCisjZGVmaW5lIFBDSV9DTEFTU19ET0NLSU5HX09USEVSCQkweDBhODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19QUk9DRVNTT1IJMHgwYgorI2RlZmluZSBQQ0lfQ0xBU1NfUFJPQ0VTU09SXzM4NgkJMHgwYjAwCisjZGVmaW5lIFBDSV9DTEFTU19QUk9DRVNTT1JfNDg2CQkweDBiMDEKKyNkZWZpbmUgUENJX0NMQVNTX1BST0NFU1NPUl9QRU5USVVNCTB4MGIwMgorI2RlZmluZSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX0FMUEhBCTB4MGIxMAorI2RlZmluZSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX1BPV0VSUEMJMHgwYjIwCisjZGVmaW5lIFBDSV9DTEFTU19QUk9DRVNTT1JfTUlQUwkweDBiMzAKKyNkZWZpbmUgUENJX0NMQVNTX1BST0NFU1NPUl9DTwkJMHgwYjQwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfU0VSSUFMCQkweDBjCisjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfRklSRVdJUkUJMHgwYzAwCisjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfQUNDRVNTCQkweDBjMDEKKyNkZWZpbmUgUENJX0NMQVNTX1NFUklBTF9TU0EJCTB4MGMwMgorI2RlZmluZSBQQ0lfQ0xBU1NfU0VSSUFMX1VTQgkJMHgwYzAzCisjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfRklCRVIJCTB4MGMwNAorI2RlZmluZSBQQ0lfQ0xBU1NfU0VSSUFMX1NNQlVTCQkweDBjMDUKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19JTlRFTExJR0VOVAkweDBlCisjZGVmaW5lIFBDSV9DTEFTU19JTlRFTExJR0VOVF9JMk8JMHgwZTAwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfU0FURUxMSVRFCTB4MGYKKyNkZWZpbmUgUENJX0NMQVNTX1NBVEVMTElURV9UVgkJMHgwZjAwCisjZGVmaW5lIFBDSV9DTEFTU19TQVRFTExJVEVfQVVESU8JMHgwZjAxCisjZGVmaW5lIFBDSV9DTEFTU19TQVRFTExJVEVfVk9JQ0UJMHgwZjAzCisjZGVmaW5lIFBDSV9DTEFTU19TQVRFTExJVEVfREFUQQkweDBmMDQKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19DUllQVAkJMHgxMAorI2RlZmluZSBQQ0lfQ0xBU1NfQ1JZUFRfTkVUV09SSwkJMHgxMDAwCisjZGVmaW5lIFBDSV9DTEFTU19DUllQVF9FTlRFUlRBSU5NRU5UCTB4MTAwMQorI2RlZmluZSBQQ0lfQ0xBU1NfQ1JZUFRfT1RIRVIJCTB4MTA4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX1NJR05BTF9QUk9DRVNTSU5HIDB4MTEKKyNkZWZpbmUgUENJX0NMQVNTX1NQX0RQSU8JCTB4MTEwMAorI2RlZmluZSBQQ0lfQ0xBU1NfU1BfT1RIRVIJCTB4MTE4MAorCisjZGVmaW5lIFBDSV9DTEFTU19PVEhFUlMJCTB4ZmYKKworLyogVmVuZG9ycyAqLworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRFlOQUxJTksJCTB4MDY3NQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0JFUktPTQkJCTB4MDg3MQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NPTVBBUQkJMHgwZTExCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkNSCQkweDEwMDAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMJCTB4MTAwMAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FUSQkJMHgxMDAyCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVkxTSQkJMHgxMDA0CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURMCQkweDEwMDUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9OUwkJMHgxMDBiCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFNFTkcJCTB4MTAwYworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1dFSVRFSwkJMHgxMDBlCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfREVDCQkweDEwMTEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DSVJSVVMJCTB4MTAxMworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lCTQkJMHgxMDE0CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUEVYMgkJMHgxMDFhCisvKiBwY2kuaWRzIHNheXMgIkFUJlQgR0lTIChOQ1IpIiAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1dECQkweDEwMWMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTUkJCTB4MTAxZQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNRAkJMHgxMDIyCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFJJREVOVAkJMHgxMDIzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUkJCTB4MTAyNQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RFTEwgICAgICAgICAgICAgIDB4MTAyOAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX01BVFJPWAkJMHgxMDJCCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ1QJCTB4MTAyYworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01JUk8JCTB4MTAzMQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX05FQwkJMHgxMDMzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRkQJCTB4MTAzNgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJUyAgICAgICAgIAkweDEwMzkKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TSQkJMHgxMDM5CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSFAJCTB4MTAzYworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BDVEVDSAkJMHgxMDQyCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVNVU1RFSwkJMHgxMDQzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRFBUCQkweDEwNDQKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PUFRJCQkweDEwNDUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FTFNBCQkweDEwNDgKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FTFNBCQkweDEwNDgKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TR1MJCTB4MTA0YQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0JVU0xPR0lDCQkgICAgICAweDEwNEIKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9USQkJMHgxMDRjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU09OWQkJMHgxMDRkCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfT0FLCQkweDEwNGUKKy8qIFdpbmJvbmQgaGF2ZSB0d28gdmVuZG9yIElEcyEgU2VlIDB4MTBhZCBhcyB3ZWxsICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfV0lOQk9ORDIJCTB4MTA1MAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FOSUdNQQkJMHgxMDUxCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRUZBUgkJMHgxMDU1CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTU9UT1JPTEEJCTB4MTA1NworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01PVE9ST0xBX09PUFMJMHgxNTA3CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUFJPTUlTRQkJMHgxMDVhCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTjkJCTB4MTA1ZAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1VNQwkJMHgxMDYwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfWAkJCTB4MTA2MQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX01ZTEVYCQkweDEwNjkKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QSUNPUAkJMHgxMDY2CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVBQTEUJCTB4MTA2YgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1lBTUFIQQkJMHgxMDczCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVYR0VOCQkweDEwNzQKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9RTE9HSUMJCTB4MTA3NworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NZUklYCQkweDEwNzgKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MRUFEVEVLCQkweDEwN2QKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTlRFUlBIQVNFCTB4MTA3ZQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NPTlRBUQkJMHgxMDgwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRk9SRVgJCTB4MTA4MworI2RlZmluZSBQQ0lfVkVORE9SX0lEX09MSUNPTQkJMHgxMDhkCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU1VOCQkweDEwOGUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DTUQJCTB4MTA5NQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1ZJU0lPTgkJMHgxMDk4CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQlJPT0tUUkVFCQkweDEwOWUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TSUVSUkEJCTB4MTBhOAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NHSQkJMHgxMGE5CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUNDCQkweDEwYWEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9XSU5CT05ECQkweDEwYWQKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9EQVRBQk9PSwkJMHgxMGIzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUExYCQkweDEwYjUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NQURHRQkJMHgxMGI2CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfM0NPTQkJMHgxMGI3CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU01DCQkweDEwYjgKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TVU5EQU5DRQkJMHgxM0YwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUwJCTB4MTBiOQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX01JVFNVQklTSEkJMHgxMGJhCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU1VSRUNPTQkJMHgxMGJkCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVPTUFHSUMJCTB4MTBjOAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FTUAkJMHgxMGNkCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUFDUk9OSVgJCTB4MTBkOQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RDT05SQUQJCTB4MTBkYQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NFUk4JCTB4MTBkYworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05WSURJQQkJCTB4MTBkZQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lNUwkJMHgxMGUwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVEVLUkFNMgkJMHgxMGUxCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFVORFJBCQkweDEwZTMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTUNDCQkweDEwZTgKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTlRFUkcJCTB4MTBlYQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JFQUxURUsJCTB4MTBlYworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1hJTElOWAkJMHgxMGVlCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFJVRVZJU0lPTgkweDEwZmEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTklUCQkweDExMDEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DUkVBVElWRQkJMHgxMTAyCisvKiBkdXBsaWNhdGU6IEVDVElWQSAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VDVElWQQkJMHgxMTAyCisvKiBkdXBsaWNhdGU6IENSRUFUSVZFICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFRJCQkweDExMDMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WSUEJCTB4MTEwNgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1ZJQVRFQwkJMHgxMTA2CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0lFTUVOUyAgICAgICAgICAgMHgxMTBBCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU01DMgkJMHgxMTEzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVk9SVEVYCQkweDExMTkKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FRgkJMHgxMTFhCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSURUCQkweDExMWQKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9GT1JFCQkweDExMjcKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTUFHSU5HVEVDSAkweDExMmYKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QSElMSVBTCQkweDExMzEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FSUNPTgkJMHgxMTMzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ1lDTE9ORQkJMHgxMTNjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUxMSUFOQ0UJCTB4MTE0MgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QJMHgxMTQ4CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVk1JQwkJMHgxMTRhCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRElHSQkJMHgxMTRmCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTVVURUNICQkweDExNTkKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9YSVJDT00JCTB4MTE1ZAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JFTkRJVElPTgkJMHgxMTYzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MJICAweDExNjYKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TQkUJCTB4MTE3NgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RPU0hJQkEJCTB4MTE3OQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JJQ09ICQkweDExODAKKyNkZWZpbmUJUENJX1ZFTkRPUl9JRF9ETElOSwkJMHgxMTg2CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVJUT1AJCTB4MTE5MQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1pFSVRORVQJCTB4MTE5MworI2RlZmluZSBQQ0lfVkVORE9SX0lEX09NRUdBCQkweDExOWIKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9GVUpJVFNVX01FCTB4MTE5ZQorI2RlZmluZSBQQ0lfU1VCVkVORE9SX0lEX0tFWVNQQU4JMHgxMWE5CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfR0FMSUxFTwkJMHgxMWFiCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTElOS1NZUwkJMHgxMWFkCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTElURU9OCQkweDExYWQKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WMwkJMHgxMWIwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTlAJCTB4MTFiYworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FUVAkJMHgxMWMxCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYCQkweDExY2IKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVVJBVklTSU9OCTB4MTFkMQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FOQUxPR19ERVZJQ0VTCTB4MTFkNAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lLT04JCTB4MTFkNQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1pPUkFOCQkweDExZGUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9LSU5FVElDCQkweDExZjQKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT01QRVgJCTB4MTFmNgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JQCQkweDExZmUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DWUNMQURFUwkJMHgxMjBlCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRVNTRU5USUFMCQkweDEyMGYKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PMgkJMHgxMjE3CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfM0RGWAkJMHgxMjFhCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0lHTUFERVMJCTB4MTIzNgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NDVUJFCQkweDEyM2YKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVk0JCTB4MTI0NAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RJUElYCQkweDEyNDYKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TVEFMTElPTgkJMHgxMjRkCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfT1BUSUJBU0UJCTB4MTI1NQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VTUwkJMHgxMjVkCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSEFSUklTICAgICAgICAJMHgxMjYwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0FUU0FHRU0JCTB4MTI2NworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hVR0hFUwkJMHgxMjczCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRU5TT05JUQkJMHgxMjc0CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUk9DS1dFTEwJCTB4MTI3QQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RBVklDT00JCTB4MTI4MgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lURQkJMHgxMjgzCisvKiBmb3JtZXJseSBQbGF0Zm9ybSBUZWNoICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRVNTX09MRAkJMHgxMjg1CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUxURU9OCQkweDEyYWUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9VU1IJCTB4MTJCOQorI2RlZmluZQlQQ0lfVkVORE9SX0lEX0hPTFRFSwkJMHgxMmMzCisjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNICQkJMHgxMmM0CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUElDVFVSRUwJCTB4MTJjNQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX05WSURJQV9TR1MJMHgxMmQyCisjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfQ0hBU0VfUENJRkFTVAkJMHgxMkUwCisjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfQ0hBU0VfUENJUkFTCQkweDEyNEQKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVVJFQUwJCTB4MTJlYgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NCT0FSRFMJCTB4MTMwNworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJSUcJCTB4MTMxZgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FETVRFSyAgICAgICAgICAgIDB4MTMxNworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RPTUVYCQkweDEzNGEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9RVUFURUNICQkweDEzNUMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TRUFMRVZFTAkJMHgxMzVlCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSFlQRVJDT1BFCQkweDEzNjUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9LQVdBU0FLSQkJMHgxMzZiCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTE1DCQkweDEzNzYKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORVRHRUFSCQkweDEzODUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BUFBMSUNPTQkJMHgxMzg5CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTU9YQQkJMHgxMzkzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0NECQkweDEzOTcKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NSUNST0dBVEUJCTB4MTNjMAorI2RlZmluZSBQQ0lfVkVORE9SX0lEXzNXQVJFCQkweDEzQzEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BQk9DT00JCTB4MTNEMQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NNRURJQQkJMHgxM2Y2CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTEFWQQkJMHgxNDA3CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVElNRURJQQkJMHgxNDA5CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfT1hTRU1JCQkweDE0MTUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BSVJPTkVUCQkweDE0YjkKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NWVJJQ09NCQkweDE0YzEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9USVRBTgkJMHgxNEQyCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUEFOQUNPTQkJMHgxNGQ0CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQlJPQURDT00JCTB4MTRlNAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NZQkEJCTB4MTU5MgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX01PUkVUT04JCTB4MTVhYQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1pPTFRSSVgJCTB4MTViMAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BEQwkJMHgxNWU5CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRlNDCQkweDE3MzQKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TWU1QSE9OWQkJMHgxYzFjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVEVLUkFNCQkweDFkZTEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF8zRExBQlMJCTB4M2QzZAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FWQU5DRQkJMHg0MDA1CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUtTCQkweDQxNmMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORVRWSU4JCTB4NGExNAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1MzCQkweDUzMzMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9EQ0kJCTB4NjY2NgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0dFTlJPQ08JCTB4NTU1NQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lOVEVMCQkweDgwODYKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT01QVVRPTkUJCTB4OGUwZQorI2RlZmluZSBQQ0lfU1VCVkVORE9SX0lEX0NPTVBVVE9ORQkweDhlMGUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9LVEkJCTB4OGUyZQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FEQVBURUMJCTB4OTAwNAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FEQVBURUMyCQkweDkwMDUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVFJPTklDUwkJMHg5MDdmCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSE9MVEVLMgkJMHg5NDEyCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVUTU9TCQkweDk3MTAKKyNkZWZpbmUgUENJX1NVQlZFTkRPUl9JRF9FWFNZUwkJMHhkODRkCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVElHRVJKRVQJCTB4ZTE1OQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FSSwkJMHhlZGQ4CisKKyNlbmRpZiAvKiBfR1BYRV9QQ0lfSURTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9wY2lfaW8uaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9wY2lfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI3MjlhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3BjaV9pby5oCkBAIC0wLDAgKzEsMTI0IEBACisjaWZuZGVmIF9HUFhFX1BDSV9JT19ICisjZGVmaW5lIF9HUFhFX1BDSV9JT19ICisKKy8qKiBAZmlsZQorICoKKyAqIFBDSSBJL08gQVBJCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvYXBpLmg+CisjaW5jbHVkZSA8Y29uZmlnL2lvYXBpLmg+CisKKy8qKgorICogQ2FsY3VsYXRlIHN0YXRpYyBpbmxpbmUgUENJIEkvTyBBUEkgZnVuY3Rpb24gbmFtZQorICoKKyAqIEB2IF9wcmVmaXgJCVN1YnN5c3RlbSBwcmVmaXgKKyAqIEB2IF9hcGlfZnVuYwkJQVBJIGZ1bmN0aW9uCisgKiBAcmV0IF9zdWJzeXNfZnVuYwlTdWJzeXN0ZW0gQVBJIGZ1bmN0aW9uCisgKi8KKyNkZWZpbmUgUENJQVBJX0lOTElORSggX3N1YnN5cywgX2FwaV9mdW5jICkgXAorCVNJTkdMRV9BUElfSU5MSU5FICggUENJQVBJX1BSRUZJWF8gIyMgX3N1YnN5cywgX2FwaV9mdW5jICkKKworLyoqCisgKiBQcm92aWRlIGEgUENJIEkvTyBBUEkgaW1wbGVtZW50YXRpb24KKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICogQHYgX2Z1bmMJCUltcGxlbWVudGluZyBmdW5jdGlvbgorICovCisjZGVmaW5lIFBST1ZJREVfUENJQVBJKCBfc3Vic3lzLCBfYXBpX2Z1bmMsIF9mdW5jICkgXAorCVBST1ZJREVfU0lOR0xFX0FQSSAoIFBDSUFQSV9QUkVGSVhfICMjIF9zdWJzeXMsIF9hcGlfZnVuYywgX2Z1bmMgKQorCisvKioKKyAqIFByb3ZpZGUgYSBzdGF0aWMgaW5saW5lIFBDSSBJL08gQVBJIGltcGxlbWVudGF0aW9uCisgKgorICogQHYgX3ByZWZpeAkJU3Vic3lzdGVtIHByZWZpeAorICogQHYgX2FwaV9mdW5jCQlBUEkgZnVuY3Rpb24KKyAqLworI2RlZmluZSBQUk9WSURFX1BDSUFQSV9JTkxJTkUoIF9zdWJzeXMsIF9hcGlfZnVuYyApIFwKKwlQUk9WSURFX1NJTkdMRV9BUElfSU5MSU5FICggUENJQVBJX1BSRUZJWF8gIyMgX3N1YnN5cywgX2FwaV9mdW5jICkKKworLyogSW5jbHVkZSBhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IEkvTyBBUEkgaGVhZGVycyAqLworI2luY2x1ZGUgPGdweGUvZWZpL2VmaV9wY2kuaD4KKworLyogSW5jbHVkZSBhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBJL08gQVBJIGhlYWRlcnMgKi8KKyNpbmNsdWRlIDxiaXRzL3BjaV9pby5oPgorCisvKioKKyAqIERldGVybWluZSBtYXhpbXVtIFBDSSBidXMgbnVtYmVyIHdpdGhpbiBzeXN0ZW0KKyAqCisgKiBAcmV0IG1heF9idXMJCU1heGltdW0gYnVzIG51bWJlcgorICovCitpbnQgcGNpX21heF9idXMgKCB2b2lkICk7CisKKy8qKgorICogUmVhZCBieXRlIGZyb20gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgd2hlcmUJTG9jYXRpb24gd2l0aGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAdiB2YWx1ZQlWYWx1ZSByZWFkCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgcGNpX3JlYWRfY29uZmlnX2J5dGUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCB1bnNpZ25lZCBpbnQgd2hlcmUsCisJCQkgICB1aW50OF90ICp2YWx1ZSApOworCisvKioKKyAqIFJlYWQgMTYtYml0IHdvcmQgZnJvbSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiB3aGVyZQlMb2NhdGlvbiB3aXRoaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEB2IHZhbHVlCVZhbHVlIHJlYWQKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBwY2lfcmVhZF9jb25maWdfd29yZCAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIHVuc2lnbmVkIGludCB3aGVyZSwKKwkJCSAgIHVpbnQxNl90ICp2YWx1ZSApOworCisvKioKKyAqIFJlYWQgMzItYml0IGR3b3JkIGZyb20gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgd2hlcmUJTG9jYXRpb24gd2l0aGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAdiB2YWx1ZQlWYWx1ZSByZWFkCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgcGNpX3JlYWRfY29uZmlnX2R3b3JkICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJICAgIHVpbnQzMl90ICp2YWx1ZSApOworCisvKioKKyAqIFdyaXRlIGJ5dGUgdG8gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgd2hlcmUJTG9jYXRpb24gd2l0aGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAdiB2YWx1ZQlWYWx1ZSB0byBiZSB3cml0dGVuCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgcGNpX3dyaXRlX2NvbmZpZ19ieXRlICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwgdW5zaWduZWQgaW50IHdoZXJlLAorCQkJICAgIHVpbnQ4X3QgdmFsdWUgKTsKKworLyoqCisgKiBXcml0ZSAxNi1iaXQgd29yZCB0byBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICoKKyAqIEB2IHBjaQlQQ0kgZGV2aWNlCisgKiBAdiB3aGVyZQlMb2NhdGlvbiB3aXRoaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEB2IHZhbHVlCVZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBwY2lfd3JpdGVfY29uZmlnX3dvcmQgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCB1bnNpZ25lZCBpbnQgd2hlcmUsCisJCQkgICAgdWludDE2X3QgdmFsdWUgKTsKKworLyoqCisgKiBXcml0ZSAzMi1iaXQgZHdvcmQgdG8gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqCisgKiBAdiBwY2kJUENJIGRldmljZQorICogQHYgd2hlcmUJTG9jYXRpb24gd2l0aGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAdiB2YWx1ZQlWYWx1ZSB0byBiZSB3cml0dGVuCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksIHVuc2lnbmVkIGludCB3aGVyZSwKKwkJCSAgICAgdWludDMyX3QgdmFsdWUgKTsKKworI2VuZGlmIC8qIF9HUFhFX1BDSV9JT19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcGNpYmFja3VwLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcGNpYmFja3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyOTVjMAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9wY2liYWNrdXAuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9HUFhFX1BDSUJBQ0tVUF9ICisjZGVmaW5lIF9HUFhFX1BDSUJBQ0tVUF9ICisKKy8qKiBAZmlsZQorICoKKyAqIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGJhY2t1cCBhbmQgcmVzdG9yYXRpb24KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKiBBIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGJhY2t1cCAqLworc3RydWN0IHBjaV9jb25maWdfYmFja3VwIHsKKwl1aW50MzJfdCBkd29yZHNbNjRdOworfTsKKworLyoqIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGJhY2t1cCBleGNsdXNpb24gbGlzdCBlbmQgbWFya2VyICovCisjZGVmaW5lIFBDSV9DT05GSUdfQkFDS1VQX0VYQ0xVREVfRU5EIDB4ZmYKKworLyoqIERlZmluZSBhIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGJhY2t1cCBleGNsdXNpb24gbGlzdCAqLworI2RlZmluZSBQQ0lfQ09ORklHX0JBQ0tVUF9FWENMVURFKC4uLikgXAorCXsgX19WQV9BUkdTX18sIFBDSV9DT05GSUdfQkFDS1VQX0VYQ0xVREVfRU5EIH0KKworZXh0ZXJuIHZvaWQgcGNpX2JhY2t1cCAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkgc3RydWN0IHBjaV9jb25maWdfYmFja3VwICpiYWNrdXAsCisJCQkgY29uc3QgdWludDhfdCAqZXhjbHVkZSApOworZXh0ZXJuIHZvaWQgcGNpX3Jlc3RvcmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLAorCQkJICBzdHJ1Y3QgcGNpX2NvbmZpZ19iYWNrdXAgKmJhY2t1cCwKKwkJCSAgY29uc3QgdWludDhfdCAqZXhjbHVkZSApOworCisjZW5kaWYgLyogX0dQWEVfUENJQkFDS1VQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9wb3NpeF9pby5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3Bvc2l4X2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2M2RmZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9wb3NpeF9pby5oCkBAIC0wLDAgKzEsODcgQEAKKyNpZm5kZWYgX0dQWEVfUE9TSVhfSU9fSAorI2RlZmluZSBfR1BYRV9QT1NJWF9JT19ICisKKy8qKiBAZmlsZQorICoKKyAqIFBPU0lYLWxpa2UgSS9PCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorCisvKiogTWluaW11bSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB3aWxsIGV2ZXIgYmUgYWxsb2NhdGVkICovCisjZGVmaW5lIFBPU0lYX0ZEX01JTiAoIDEgKQorCisvKiogTWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB3aWxsIGV2ZXIgYmUgYWxsb2NhdGVkICovCisjZGVmaW5lIFBPU0lYX0ZEX01BWCAoIDMxICkKKworLyoqIEZpbGUgZGVzY3JpcHRvciBzZXQgYXMgdXNlZCBmb3Igc2VsZWN0KCkgKi8KK3R5cGVkZWYgdWludDMyX3QgZmRfc2V0OworCitleHRlcm4gaW50IG9wZW4gKCBjb25zdCBjaGFyICp1cmlfc3RyaW5nICk7CitleHRlcm4gc3NpemVfdCByZWFkX3VzZXIgKCBpbnQgZmQsIHVzZXJwdHJfdCBidWZmZXIsCisJCQkgICBvZmZfdCBvZmZzZXQsIHNpemVfdCBsZW4gKTsKK2V4dGVybiBpbnQgc2VsZWN0ICggZmRfc2V0ICpyZWFkZmRzLCBpbnQgd2FpdCApOworZXh0ZXJuIHNzaXplX3QgZnNpemUgKCBpbnQgZmQgKTsKK2V4dGVybiBpbnQgY2xvc2UgKCBpbnQgZmQgKTsKKworLyoqCisgKiBaZXJvIGEgZmlsZSBkZXNjcmlwdG9yIHNldAorICoKKyAqIEB2IHNldAkJRmlsZSBkZXNjcmlwdG9yIHNldAorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitGRF9aRVJPICggZmRfc2V0ICpzZXQgKSB7CisJKnNldCA9IDA7Cit9CisKKy8qKgorICogU2V0IGEgYml0IHdpdGhpbiBhIGZpbGUgZGVzY3JpcHRvciBzZXQKKyAqCisgKiBAdiBmZAkJRmlsZSBkZXNjcmlwdG9yCisgKiBAdiBzZXQJCUZpbGUgZGVzY3JpcHRvciBzZXQKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZAorRkRfU0VUICggaW50IGZkLCBmZF9zZXQgKnNldCApIHsKKwkqc2V0IHw9ICggMSA8PCBmZCApOworfQorCisvKioKKyAqIENsZWFyIGEgYml0IHdpdGhpbiBhIGZpbGUgZGVzY3JpcHRvciBzZXQKKyAqCisgKiBAdiBmZAkJRmlsZSBkZXNjcmlwdG9yCisgKiBAdiBzZXQJCUZpbGUgZGVzY3JpcHRvciBzZXQKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZAorRkRfQ0xSICggaW50IGZkLCBmZF9zZXQgKnNldCApIHsKKwkqc2V0ICY9IH4oIDEgPDwgZmQgKTsKK30KKworLyoqCisgKiBUZXN0IGEgYml0IHdpdGhpbiBhIGZpbGUgZGVzY3JpcHRvciBzZXQKKyAqCisgKiBAdiBmZAkJRmlsZSBkZXNjcmlwdG9yCisgKiBAdiBzZXQJCUZpbGUgZGVzY3JpcHRvciBzZXQKKyAqIEByZXQgaXNfc2V0CQlDb3JyZXNwb25kaW5nIGJpdCBpcyBzZXQKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgaW50CitGRF9JU1NFVCAoIGludCBmZCwgZmRfc2V0ICpzZXQgKSB7CisJcmV0dXJuICggKnNldCAmICggMSA8PCBmZCApICk7Cit9CisKKy8qKgorICogUmVhZCBkYXRhIGZyb20gZmlsZQorICoKKyAqIEB2IGZkCQlGaWxlIGRlc2NyaXB0b3IKKyAqIEB2IGJ1ZgkJRGF0YSBidWZmZXIKKyAqIEB2IGxlbgkJTWF4aW11bSBsZW5ndGggdG8gcmVhZAorICogQHJldCBsZW4JCUFjdHVhbCBsZW5ndGggcmVhZCwgb3IgbmVnYXRpdmUgZXJyb3IgbnVtYmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgc3NpemVfdCByZWFkICggaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4gKSB7CisJcmV0dXJuIHJlYWRfdXNlciAoIGZkLCB2aXJ0X3RvX3VzZXIgKCBidWYgKSwgMCwgbGVuICk7Cit9CisKKyNlbmRpZiAvKiBfR1BYRV9QT1NJWF9JT19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcHJvY2Vzcy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3Byb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDQ4NThkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3Byb2Nlc3MuaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9HUFhFX1BST0NFU1NfSAorI2RlZmluZSBfR1BYRV9QUk9DRVNTX0gKKworLyoqIEBmaWxlCisgKgorICogUHJvY2Vzc2VzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorI2luY2x1ZGUgPGdweGUvcmVmY250Lmg+CisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKworLyoqIEEgcHJvY2VzcyAqLworc3RydWN0IHByb2Nlc3MgeworCS8qKiBMaXN0IG9mIHByb2Nlc3NlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwkvKioKKwkgKiBTaW5nbGUtc3RlcCB0aGUgcHJvY2VzcworCSAqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGV4ZWN1dGUgYSBzaW5nbGUgc3RlcCBvZiB0aGUgcHJvY2Vzcy4KKwkgKiBSZXR1cm5pbmcgZnJvbSB0aGlzIG1ldGhvZCBpcyBpc29tb3JwaGljIHRvIHlpZWxkaW5nIHRoZQorCSAqIENQVSB0byBhbm90aGVyIHByb2Nlc3MuCisJICovCisJdm9pZCAoICogc3RlcCApICggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MgKTsKKwkvKiogUmVmZXJlbmNlIGNvdW50ZXIKKwkgKgorCSAqIElmIHRoaXMgaW50ZXJmYWNlIGlzIG5vdCBwYXJ0IG9mIGEgcmVmZXJlbmNlLWNvdW50ZWQKKwkgKiBvYmplY3QsIHRoaXMgZmllbGQgbWF5IGJlIE5VTEwuCisJICovCisJc3RydWN0IHJlZmNudCAqcmVmY250OworfTsKKworZXh0ZXJuIHZvaWQgcHJvY2Vzc19hZGQgKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcyApOworZXh0ZXJuIHZvaWQgcHJvY2Vzc19kZWwgKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcyApOworZXh0ZXJuIHZvaWQgc3RlcCAoIHZvaWQgKTsKKworLyoqCisgKiBJbml0aWFsaXNlIHByb2Nlc3Mgd2l0aG91dCBhZGRpbmcgdG8gcHJvY2VzcyBsaXN0CisgKgorICogQHYgcHJvY2VzcwkJUHJvY2VzcworICogQHYgc3RlcAkJUHJvY2Vzcycgc3RlcCgpIG1ldGhvZAorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitwcm9jZXNzX2luaXRfc3RvcHBlZCAoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzLAorCQkgICAgICAgdm9pZCAoICogc3RlcCApICggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MgKSwKKwkJICAgICAgIHN0cnVjdCByZWZjbnQgKnJlZmNudCApIHsKKwlJTklUX0xJU1RfSEVBRCAoICZwcm9jZXNzLT5saXN0ICk7CisJcHJvY2Vzcy0+c3RlcCA9IHN0ZXA7CisJcHJvY2Vzcy0+cmVmY250ID0gcmVmY250OworfQorCisvKioKKyAqIEluaXRpYWxpc2UgcHJvY2VzcyBhbmQgYWRkIHRvIHByb2Nlc3MgbGlzdAorICoKKyAqIEB2IHByb2Nlc3MJCVByb2Nlc3MKKyAqIEB2IHN0ZXAJCVByb2Nlc3MnIHN0ZXAoKSBtZXRob2QKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZAorcHJvY2Vzc19pbml0ICggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsCisJICAgICAgIHZvaWQgKCAqIHN0ZXAgKSAoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzICksCisJICAgICAgIHN0cnVjdCByZWZjbnQgKnJlZmNudCApIHsKKwlwcm9jZXNzX2luaXRfc3RvcHBlZCAoIHByb2Nlc3MsIHN0ZXAsIHJlZmNudCApOworCXByb2Nlc3NfYWRkICggcHJvY2VzcyApOworfQorCisvKiogUGVybWFuZW50IHByb2Nlc3MgdGFibGUgKi8KKyNkZWZpbmUgUEVSTUFORU5UX1BST0NFU1NFUyBfX3RhYmxlICggc3RydWN0IHByb2Nlc3MsICJwcm9jZXNzZXMiICkKKworLyoqCisgKiBEZWNsYXJlIGEgcGVybWFuZW50IHByb2Nlc3MKKyAqCisgKiBQZXJtYW5lbnQgcHJvY2Vzc2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgcHJvY2VzcyBsaXN0CisgKiBhdCBpbml0aWFsaXNhdGlvbiB0aW1lLgorICovCisjZGVmaW5lIF9fcGVybWFuZW50X3Byb2Nlc3MgX190YWJsZV9lbnRyeSAoIFBFUk1BTkVOVF9QUk9DRVNTRVMsIDAxICkKKworI2VuZGlmIC8qIF9HUFhFX1BST0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3Byb2ZpbGUuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9wcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViZGQzYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9wcm9maWxlLmgKQEAgLTAsMCArMSw4MCBAQAorI2lmbmRlZiBfR1BYRV9QUk9GSUxFX0gKKyNkZWZpbmUgX0dQWEVfUFJPRklMRV9ICisKKy8qKiBAZmlsZQorICoKKyAqIFByb2ZpbGluZworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBBIGRhdGEgc3RydWN0dXJlIGZvciBzdG9yaW5nIHByb2ZpbGluZyBpbmZvcm1hdGlvbgorICovCit1bmlvbiBwcm9maWxlciB7CisJLyoqIFRpbWVzdGFtcCAoaW4gQ1BVLXNwZWNpZmljICJ0aWNrcyIpICovCisJdWludDY0X3QgdGltZXN0YW1wOworCS8qKiBSZWdpc3RlcnMgcmV0dXJuZWQgYnkgcmR0c2MuCisJICoKKwkgKiBUaGlzIHBhcnQgc2hvdWxkIHJlYWxseSBiZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZS4KKwkgKi8KKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBlYXg7CisJCXVpbnQzMl90IGVkeDsKKwl9IHJkdHNjOworfTsKKworLyoqCisgKiBTdGF0aWMgcGVyLW9iamVjdCBwcm9maWxlciwgZm9yIHVzZSB3aXRoIHNpbXBsZV9wcm9maWxlKCkKKyAqLworc3RhdGljIHVuaW9uIHByb2ZpbGVyIHNpbXBsZV9wcm9maWxlcjsKKworLyoqCisgKiBQZXJmb3JtIHByb2ZpbGluZworICoKKyAqIEB2IHByb2ZpbGVyCQlQcm9maWxlciBkYXRhIHN0cnVjdHVyZQorICogQHJldCBkZWx0YQkJRWxhcHNlZCB0aWNrcyBzaW5jZSBsYXN0IGNhbGwgdG8gcHJvZmlsZSgpLgorICoKKyAqIENhbGwgcHJvZmlsZSgpIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgY29kZSB5b3Ugd2lzaCB0byBtZWFzdXJlLgorICogVGhlICJhZnRlciIgY2FsbCB3aWxsIHJldHVybiB0aGUgbWVhc3VyZW1lbnQuICBGb3IgZXhhbXBsZToKKyAqCisgKiBAY29kZQorICoKKyAqICAgICBwcm9maWxlICggJnByb2ZpbGVyICk7CisgKiAgICAgLi4uIGRvIHNvbWV0aGluZyBoZXJlIC4uLgorICogICAgIHByaW50ZiAoICJJdCB0b29rICVsZCB0aWNrcyB0byBleGVjdXRlXG4iLCBwcm9maWxlICggJnByb2ZpbGVyICkgKTsKKyAqCisgKiBAZW5kY29kZQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB1bnNpZ25lZCBsb25nCitwcm9maWxlICggdW5pb24gcHJvZmlsZXIgKnByb2ZpbGVyICkgeworCXVpbnQ2NF90IGxhc3RfdGltZXN0YW1wID0gcHJvZmlsZXItPnRpbWVzdGFtcDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICggInJkdHNjIiA6CisJCQkgICAgICAgIj1hIiAoIHByb2ZpbGVyLT5yZHRzYy5lYXggKSwKKwkJCSAgICAgICAiPWQiICggcHJvZmlsZXItPnJkdHNjLmVkeCApICk7CisJcmV0dXJuICggcHJvZmlsZXItPnRpbWVzdGFtcCAtIGxhc3RfdGltZXN0YW1wICk7Cit9CisKKy8qKgorICogUGVyZm9ybSBwcm9maWxpbmcKKyAqCisgKiBAcmV0IGRlbHRhCQlFbGFwc2VkIHRpY2tzIHNpbmNlIGxhc3QgY2FsbCB0byBwcm9maWxlKCkuCisgKgorICogV2hlbiB5b3Ugb25seSBuZWVkIG9uZSBwcm9maWxlciwgeW91IGNhbiBhdm9pZCB0aGUgaGFzc2xlIG9mCisgKiBjcmVhdGluZyB5b3VyIG93biBAYyBwcm9maWxlciBkYXRhIHN0cnVjdHVyZSBieSB1c2luZworICogc2ltcGxlX3Byb2ZpbGUoKSBpbnN0ZWFkLgorICoKKyAqIHNpbXBsZV9wcm9maWxlKCkgaXMgZXF1aXZhbGVudCB0byBwcm9maWxlKCZzaW1wbGVfcHJvZmlsZXIpLCB3aGVyZQorICogQGMgc2ltcGxlX3Byb2ZpbGVyIGlzIGEgQGMgcHJvZmlsZXIgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpcyBzdGF0aWMKKyAqIHRvIGVhY2ggb2JqZWN0IHdoaWNoIGluY2x1ZGVzIEBjIHByb2ZpbGUuaC4KKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdW5zaWduZWQgbG9uZworc2ltcGxlX3Byb2ZpbGUgKCB2b2lkICkgeworCXJldHVybiBwcm9maWxlICggJnNpbXBsZV9wcm9maWxlciApOworfQorCisjZW5kaWYgLyogX0dQWEVfUFJPRklMRV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcmFtZGlzay5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3JhbWRpc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWExZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3JhbWRpc2suaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9HUFhFX1JBTURJU0tfSAorI2RlZmluZSBfR1BYRV9SQU1ESVNLX0gKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFJBTSBkaXNrcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2Jsb2NrZGV2Lmg+CisKK3N0cnVjdCByYW1kaXNrIHsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlIGJsb2NrZGV2OworCXVzZXJwdHJfdCBkYXRhOworfTsKKworZXh0ZXJuIGludCBpbml0X3JhbWRpc2sgKCBzdHJ1Y3QgcmFtZGlzayAqcmFtZGlzaywgdXNlcnB0cl90IGRhdGEsIHNpemVfdCBsZW4sCisJCQkgIHVuc2lnbmVkIGludCBibGtzaXplICk7CisKKyNlbmRpZiAvKiBfR1BYRV9SQU1ESVNLX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9yYXJwLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcmFycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZGU4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcmFycC5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX0dQWEVfUkFSUF9ICisjZGVmaW5lIF9HUFhFX1JBUlBfSAorCisvKiogQGZpbGUKKyAqCisgKiBSZXZlcnNlIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBuZXRfcHJvdG9jb2w7CisKK2V4dGVybiBzdHJ1Y3QgbmV0X3Byb3RvY29sIHJhcnBfcHJvdG9jb2w7CisKKyNlbmRpZiAvKiBfR1BYRV9SQVJQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9yYzgwMjExLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcmM4MDIxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NTY4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcmM4MDIxMS5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0dQWEVfUkM4MDIxMV9ICisjZGVmaW5lIF9HUFhFX1JDODAyMTFfSAorCisvKiogQGZpbGUKKyAqCisgKiBSYXRlLWNvbnRyb2wgYWxnb3JpdGhtIHByb3RvdHlwZSBmb3IgODAyLjExLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RydWN0IG5ldDgwMjExX2RldmljZTsKK3N0cnVjdCByYzgwMjExX2N0eDsKKworc3RydWN0IHJjODAyMTFfY3R4ICogcmM4MDIxMV9pbml0ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICk7Cit2b2lkIHJjODAyMTFfdXBkYXRlX3R4ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgcmV0cmllcywgaW50IHJjICk7Cit2b2lkIHJjODAyMTFfdXBkYXRlX3J4ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgcmV0cnksIHUxNiByYXRlICk7Cit2b2lkIHJjODAyMTFfZnJlZSAoIHN0cnVjdCByYzgwMjExX2N0eCAqY3R4ICk7CisKKyNlbmRpZiAvKiBfR1BYRV9SQzgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9yZWZjbnQuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9yZWZjbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTZmMWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3JlZmNudC5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX0dQWEVfUkVGQ05UX0gKKyNkZWZpbmUgX0dQWEVfUkVGQ05UX0gKKworLyoqIEBmaWxlCisgKgorICogUmVmZXJlbmNlIGNvdW50aW5nCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBBIHJlZmVyZW5jZSBjb3VudGVyCisgKgorICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBkZXNpZ25lZCB0byBiZSBlbWJlZGRlZCB3aXRoaW4gYQorICogcmVmZXJlbmNlLWNvdW50ZWQgb2JqZWN0LgorICoKKyAqIFJlZmVyZW5jZS1jb3VudGVkIG9iamVjdHMgYXJlIGZyZWVkIHdoZW4gdGhlaXIgcmVmZXJlbmNlIGNvdW50CisgKiBkcm9wcyBiZWxvdyB6ZXJvLiAgVGhpcyBtZWFucyB0aGF0IGEgZnJlc2hseSBhbGxvY2F0ZWQtYW5kLXplcm9lZAorICogcmVmZXJlbmNlLWNvdW50ZWQgb2JqZWN0IHdpbGwgYmUgZnJlZWQgb24gdGhlIGZpcnN0IGNhbGwgdG8KKyAqIHJlZl9wdXQoKS4KKyAqLworc3RydWN0IHJlZmNudCB7CisJLyoqIEN1cnJlbnQgcmVmZXJlbmNlIGNvdW50CisJICoKKwkgKiBXaGVuIHRoaXMgY291bnQgaXMgZGVjcmVtZW50ZWQgYmVsb3cgemVybywgdGhlIGZyZWUoKQorCSAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZC4KKwkgKi8KKwlpbnQgcmVmY250OworCS8qKiBGcmVlIGNvbnRhaW5pbmcgb2JqZWN0CisJICoKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IGlzCisJICogZGVjcmVtZW50ZWQgYmVsb3cgemVyby4KKwkgKgorCSAqIElmIHRoaXMgbWV0aG9kIGlzIGxlZnQgTlVMTCwgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnJlZSgpCisJICogZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQuICBUaGUgdXBzaG90IG9mIHRoaXMgaXMgdGhhdCB5b3UKKwkgKiBtYXkgb21pdCB0aGUgZnJlZSgpIG1ldGhvZCBpZiB0aGUgQGMgcmVmY250IG9iamVjdCBpcyB0aGUKKwkgKiBmaXJzdCBlbGVtZW50IG9mIHlvdXIgcmVmZXJlbmNlLWNvdW50ZWQgc3RydWN0LgorCSAqLworCXZvaWQgKCAqIGZyZWUgKSAoIHN0cnVjdCByZWZjbnQgKnJlZmNudCApOworfTsKKworZXh0ZXJuIHN0cnVjdCByZWZjbnQgKiByZWZfZ2V0ICggc3RydWN0IHJlZmNudCAqcmVmY250ICk7CitleHRlcm4gdm9pZCByZWZfcHV0ICggc3RydWN0IHJlZmNudCAqcmVmY250ICk7CisKKyNlbmRpZiAvKiBfR1BYRV9SRUZDTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3Jlc29sdi5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3Jlc29sdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYmIwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcmVzb2x2LmgKQEAgLTAsMCArMSwxNzAgQEAKKyNpZm5kZWYgX0dQWEVfUkVTT0xWX0gKKyNkZWZpbmUgX0dQWEVfUkVTT0xWX0gKKworLyoqIEBmaWxlCisgKgorICogTmFtZSByZXNvbHV0aW9uCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvcmVmY250Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorI2luY2x1ZGUgPGdweGUvc29ja2V0Lmg+CisKK3N0cnVjdCByZXNvbHZfaW50ZXJmYWNlOworCisvKiogTmFtZSByZXNvbHV0aW9uIGludGVyZmFjZSBvcGVyYXRpb25zICovCitzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZV9vcGVyYXRpb25zIHsKKwkvKiogTmFtZSByZXNvbHV0aW9uIGNvbXBsZXRlZAorCSAqCisJICogQHYgcmVzb2x2CQlOYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlCisJICogQHYgc2EJCUNvbXBsZXRlZCBzb2NrZXQgYWRkcmVzcyAoaWYgc3VjY2Vzc2Z1bCkKKwkgKiBAdiByYwkJRmluYWwgc3RhdHVzIGNvZGUKKwkgKi8KKwl2b2lkICggKiBkb25lICkgKCBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSAqcmVzb2x2LAorCQkJICBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBpbnQgcmMgKTsKK307CisKKy8qKiBBIG5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2UgKi8KK3N0cnVjdCByZXNvbHZfaW50ZXJmYWNlIHsKKwkvKiogR2VuZXJpYyBvYmplY3QgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgaW50ZXJmYWNlIGludGY7CisJLyoqIE9wZXJhdGlvbnMgZm9yIHJlY2VpdmVkIG1lc3NhZ2VzICovCisJc3RydWN0IHJlc29sdl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyAqb3A7Cit9OworCitleHRlcm4gc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgbnVsbF9yZXNvbHY7CitleHRlcm4gc3RydWN0IHJlc29sdl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBudWxsX3Jlc29sdl9vcHM7CisKKy8qKgorICogSW5pdGlhbGlzZSBhIG5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2UKKyAqCisgKiBAdiByZXNvbHYJCU5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2UKKyAqIEB2IG9wCQlOYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlIG9wZXJhdGlvbnMKKyAqIEB2IHJlZmNudAkJQ29udGFpbmluZyBvYmplY3QgcmVmZXJlbmNlIGNvdW50ZXIsIG9yIE5VTEwKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlc29sdl9pbml0ICggc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgKnJlc29sdiwKKwkJCQkgc3RydWN0IHJlc29sdl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyAqb3AsCisJCQkJIHN0cnVjdCByZWZjbnQgKnJlZmNudCApIHsKKwlyZXNvbHYtPmludGYuZGVzdCA9ICZudWxsX3Jlc29sdi5pbnRmOworCXJlc29sdi0+aW50Zi5yZWZjbnQgPSByZWZjbnQ7CisJcmVzb2x2LT5vcCA9IG9wOworfQorCisvKioKKyAqIEdldCBuYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlIGZyb20gZ2VuZXJpYyBvYmplY3QgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UKKyAqCisgKiBAdiBpbnRmCQlHZW5lcmljIG9iamVjdCBjb21tdW5pY2F0aW9uIGludGVyZmFjZQorICogQHJldCByZXNvbHYJCU5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2UKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgKgoraW50Zl90b19yZXNvbHYgKCBzdHJ1Y3QgaW50ZXJmYWNlICppbnRmICkgeworCXJldHVybiBjb250YWluZXJfb2YgKCBpbnRmLCBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSwgaW50ZiApOworfQorCisvKioKKyAqIEdldCByZWZlcmVuY2UgdG8gZGVzdGluYXRpb24gbmFtZSByZXNvbHV0aW9uIGludGVyZmFjZQorICoKKyAqIEB2IHJlc29sdgkJTmFtZSByZXNvbHV0aW9uIGludGVyZmFjZQorICogQHJldCBkZXN0CQlEZXN0aW5hdGlvbiBpbnRlcmZhY2UKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgKgorcmVzb2x2X2dldF9kZXN0ICggc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgKnJlc29sdiApIHsKKwlyZXR1cm4gaW50Zl90b19yZXNvbHYgKCBpbnRmX2dldCAoIHJlc29sdi0+aW50Zi5kZXN0ICkgKTsKK30KKworLyoqCisgKiBEcm9wIHJlZmVyZW5jZSB0byBuYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlCisgKgorICogQHYgcmVzb2x2CQluYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK3Jlc29sdl9wdXQgKCBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSAqcmVzb2x2ICkgeworCWludGZfcHV0ICggJnJlc29sdi0+aW50ZiApOworfQorCisvKioKKyAqIFBsdWcgYSBuYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlIGludG8gYSBuZXcgZGVzdGluYXRpb24gaW50ZXJmYWNlCisgKgorICogQHYgcmVzb2x2CQlOYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlCisgKiBAdiBkZXN0CQlOZXcgZGVzdGluYXRpb24gaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK3Jlc29sdl9wbHVnICggc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgKnJlc29sdiwgc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgKmRlc3QgKSB7CisJcGx1ZyAoICZyZXNvbHYtPmludGYsICZkZXN0LT5pbnRmICk7Cit9CisKKy8qKgorICogUGx1ZyB0d28gbmFtZSByZXNvbHV0aW9uIGludGVyZmFjZXMgdG9nZXRoZXIKKyAqCisgKiBAdiBhCQkJTmFtZSByZXNvbHV0aW9uIGludGVyZmFjZSBBCisgKiBAdiBiCQkJTmFtZSByZXNvbHV0aW9uIGludGVyZmFjZSBCCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK3Jlc29sdl9wbHVnX3BsdWcgKCBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSAqYSwgc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgKmIgKSB7CisJcGx1Z19wbHVnICggJmEtPmludGYsICZiLT5pbnRmICk7Cit9CisKKy8qKgorICogVW5wbHVnIGEgbmFtZSByZXNvbHV0aW9uIGludGVyZmFjZQorICoKKyAqIEB2IHJlc29sdgkJTmFtZSByZXNvbHV0aW9uIGludGVyZmFjZQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCityZXNvbHZfdW5wbHVnICggc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgKnJlc29sdiApIHsKKwlwbHVnICggJnJlc29sdi0+aW50ZiwgJm51bGxfcmVzb2x2LmludGYgKTsKK30KKworLyoqCisgKiBTdG9wIHVzaW5nIGEgbmFtZSByZXNvbHV0aW9uIGludGVyZmFjZQorICoKKyAqIEB2IHJlc29sdgkJTmFtZSByZXNvbHV0aW9uIGludGVyZmFjZQorICoKKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIG5vIGZ1cnRoZXIgbWVzc2FnZXMgd2lsbCBiZSByZWNlaXZlZCB2aWEKKyAqIHRoZSBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNvbHZfbnVsbGlmeSAoIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlICpyZXNvbHYgKSB7CisJcmVzb2x2LT5vcCA9ICZudWxsX3Jlc29sdl9vcHM7Cit9OworCisvKiogQSBuYW1lIHJlc29sdmVyICovCitzdHJ1Y3QgcmVzb2x2ZXIgeworCS8qKiBOYW1lIG9mIHRoaXMgcmVzb2x2ZXIgKGUuZy4gIkROUyIpICovCisJY29uc3QgY2hhciAqbmFtZTsKKwkvKiogU3RhcnQgbmFtZSByZXNvbHV0aW9uCisJICoKKwkgKiBAdiByZXNvbHYJCU5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2UKKwkgKiBAdiBuYW1lCQlOYW1lIHRvIHJlc29sdmUKKwkgKiBAdiBzYQkJU29ja2V0IGFkZHJlc3MgdG8gY29tcGxldGUKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIHJlc29sdiApICggc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgKnJlc29sdiwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIHN0cnVjdCBzb2NrYWRkciAqc2EgKTsKK307CisKKy8qKiBOdW1lcmljIHJlc29sdmVyIHByaW9yaXR5ICovCisjZGVmaW5lIFJFU09MVl9OVU1FUklDIDAxCisKKy8qKiBOb3JtYWwgcmVzb2x2ZXIgcHJpb3JpdHkgKi8KKyNkZWZpbmUgUkVTT0xWX05PUk1BTCAwMgorCisvKiogUmVzb2x2ZXJzIHRhYmxlICovCisjZGVmaW5lIFJFU09MVkVSUyBfX3RhYmxlICggc3RydWN0IHJlc29sdmVyLCAicmVzb2x2ZXJzIiApCisKKy8qKiBSZWdpc3RlciBhcyBhIG5hbWUgcmVzb2x2ZXIgKi8KKyNkZWZpbmUgX19yZXNvbHZlciggcmVzb2x2X29yZGVyICkgX190YWJsZV9lbnRyeSAoIFJFU09MVkVSUywgcmVzb2x2X29yZGVyICkKKworZXh0ZXJuIHZvaWQgcmVzb2x2X2RvbmUgKCBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSAqcmVzb2x2LAorCQkJICBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBpbnQgcmMgKTsKK2V4dGVybiB2b2lkIGlnbm9yZV9yZXNvbHZfZG9uZSAoIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlICpyZXNvbHYsCisJCQkgIHN0cnVjdCBzb2NrYWRkciAqc2EsIGludCByYyApOworZXh0ZXJuIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlX29wZXJhdGlvbnMgbnVsbF9yZXNvbHZfb3BzOworZXh0ZXJuIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlIG51bGxfcmVzb2x2OworCitleHRlcm4gaW50IHJlc29sdiAoIHN0cnVjdCByZXNvbHZfaW50ZXJmYWNlICpyZXNvbHYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhICk7CisKKyNlbmRpZiAvKiBfR1BYRV9SRVNPTFZfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3JldHJ5LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcmV0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGEwMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3JldHJ5LmgKQEAgLTAsMCArMSw4MSBAQAorI2lmbmRlZiBfR1BYRV9SRVRSWV9ICisjZGVmaW5lIF9HUFhFX1JFVFJZX0gKKworLyoqIEBmaWxlCisgKgorICogUmV0cnkgdGltZXJzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorCisvKiogRGVmYXVsdCB0aW1lb3V0IHZhbHVlICovCisjZGVmaW5lIERFRkFVTFRfTUlOX1RJTUVPVVQgKCBUSUNLU19QRVJfU0VDIC8gNCApCisKKy8qKiBMaW1pdCBhZnRlciB3aGljaCB0aGUgdGltZW91dCB3aWxsIGJlIGRlZW1lZCBwZXJtYW5lbnQgKi8KKyNkZWZpbmUgREVGQVVMVF9NQVhfVElNRU9VVCAoIDEwICogVElDS1NfUEVSX1NFQyApCisKKy8qKiBBIHJldHJ5IHRpbWVyICovCitzdHJ1Y3QgcmV0cnlfdGltZXIgeworCS8qKiBMaXN0IG9mIGFjdGl2ZSB0aW1lcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJLyoqIFRpbWVyIGlzIGN1cnJlbnRseSBydW5uaW5nICovCisJdW5zaWduZWQgaW50IHJ1bm5pbmc7CisJLyoqIFRpbWVvdXQgdmFsdWUgKGluIHRpY2tzKSAqLworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwkvKiogTWluaW11bSB0aW1lb3V0IHZhbHVlIChpbiB0aWNrcykKKwkgKgorCSAqIEEgdmFsdWUgb2YgemVybyBtZWFucyAidXNlIGRlZmF1bHQgdGltZW91dC4iCisJICovCisJdW5zaWduZWQgbG9uZyBtaW5fdGltZW91dDsKKwkvKiogTWF4aW11bSB0aW1lb3V0IHZhbHVlIGJlZm9yZSBmYWlsdXJlIChpbiB0aWNrcykKKwkgKgorCSAqIEEgdmFsdWUgb2YgemVybyBtZWFucyAidXNlIGRlZmF1bHQgdGltZW91dC4iCisJICovCisJdW5zaWduZWQgbG9uZyBtYXhfdGltZW91dDsKKwkvKiogU3RhcnQgdGltZSAoaW4gdGlja3MpICovCisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwkvKiogUmV0cnkgY291bnQgKi8KKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJLyoqIFRpbWVyIGV4cGlyZWQgY2FsbGJhY2sKKwkgKgorCSAqIEB2IHRpbWVyCVJldHJ5IHRpbWVyCisJICogQHYgZmFpbAlGYWlsdXJlIGluZGljYXRvcgorCSAqCisJICogVGhlIHRpbWVyIHdpbGwgYWxyZWFkeSBiZSBzdG9wcGVkIHdoZW4gdGhpcyBtZXRob2QgaXMKKwkgKiBjYWxsZWQuICBUaGUgZmFpbHVyZSBpbmRpY2F0b3Igd2lsbCBiZSBUcnVlIGlmIHRoZSByZXRyeQorCSAqIHRpbWVvdXQgaGFzIGFscmVhZHkgZXhjZWVkZWQgQGMgTUFYX1RJTUVPVVQuCisJICovCisJdm9pZCAoICogZXhwaXJlZCApICggc3RydWN0IHJldHJ5X3RpbWVyICp0aW1lciwgaW50IG92ZXIgKTsKK307CisKK2V4dGVybiB2b2lkIHN0YXJ0X3RpbWVyICggc3RydWN0IHJldHJ5X3RpbWVyICp0aW1lciApOworZXh0ZXJuIHZvaWQgc3RhcnRfdGltZXJfZml4ZWQgKCBzdHJ1Y3QgcmV0cnlfdGltZXIgKnRpbWVyLAorCQkJCXVuc2lnbmVkIGxvbmcgdGltZW91dCApOworZXh0ZXJuIHZvaWQgc3RvcF90aW1lciAoIHN0cnVjdCByZXRyeV90aW1lciAqdGltZXIgKTsKKworLyoqCisgKiBTdGFydCB0aW1lciB3aXRoIG5vIGRlbGF5CisgKgorICogQHYgdGltZXIJCVJldHJ5IHRpbWVyCisgKgorICogVGhpcyBzdGFydHMgdGhlIHRpbWVyIHJ1bm5pbmcgd2l0aCBhIHplcm8gdGltZW91dCB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X3RpbWVyX25vZGVsYXkgKCBzdHJ1Y3QgcmV0cnlfdGltZXIgKnRpbWVyICkgeworCXN0YXJ0X3RpbWVyX2ZpeGVkICggdGltZXIsIDAgKTsKK30KKworLyoqCisgKiBUZXN0IHRvIHNlZSBpZiB0aW1lciBpcyBjdXJyZW50bHkgcnVubmluZworICoKKyAqIEB2IHRpbWVyCQlSZXRyeSB0aW1lcgorICogQHJldCBydW5uaW5nCQlOb24temVybyBpZiB0aW1lciBpcyBydW5uaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHVuc2lnbmVkIGxvbmcKK3RpbWVyX3J1bm5pbmcgKCBzdHJ1Y3QgcmV0cnlfdGltZXIgKnRpbWVyICkgeworCXJldHVybiAoIHRpbWVyLT5ydW5uaW5nICk7Cit9CisKKyNlbmRpZiAvKiBfR1BYRV9SRVRSWV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcm90YXRlLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcm90YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3MWM1NwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9yb3RhdGUuaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIF9HUFhFX1JPVEFURV9ICisjZGVmaW5lIF9HUFhFX1JPVEFURV9ICisKKy8qKiBAZmlsZQorICoKKyAqIEJpdCBvcGVyYXRpb25zCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgcm9sMzIgKCB1aW50MzJfdCBkYXRhLCB1bnNpZ25lZCBpbnQgcm90YXRpb24gKSB7CisgICAgICAgIHJldHVybiAoICggZGF0YSA8PCByb3RhdGlvbiApIHwgKCBkYXRhID4+ICggMzIgLSByb3RhdGlvbiApICkgKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCByb3IzMiAoIHVpbnQzMl90IGRhdGEsIHVuc2lnbmVkIGludCByb3RhdGlvbiApIHsKKyAgICAgICAgcmV0dXJuICggKCBkYXRhID4+IHJvdGF0aW9uICkgfCAoIGRhdGEgPDwgKCAzMiAtIHJvdGF0aW9uICkgKSApOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHJvbDY0ICggdWludDY0X3QgZGF0YSwgdW5zaWduZWQgaW50IHJvdGF0aW9uICkgeworICAgICAgICByZXR1cm4gKCAoIGRhdGEgPDwgcm90YXRpb24gKSB8ICggZGF0YSA+PiAoIDY0IC0gcm90YXRpb24gKSApICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3Qgcm9yNjQgKCB1aW50NjRfdCBkYXRhLCB1bnNpZ25lZCBpbnQgcm90YXRpb24gKSB7CisgICAgICAgIHJldHVybiAoICggZGF0YSA+PiByb3RhdGlvbiApIHwgKCBkYXRhIDw8ICggNjQgLSByb3RhdGlvbiApICkgKTsKK30KKworI2VuZGlmIC8qIF9HUFhFX1JPVEFURV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcnNhLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvcnNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1MmFkNAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9yc2EuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9HUFhFX1JTQV9ICisjZGVmaW5lIF9HUFhFX1JTQV9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RydWN0IHB1YmtleV9hbGdvcml0aG07CisKK2V4dGVybiBzdHJ1Y3QgcHVia2V5X2FsZ29yaXRobSByc2FfYWxnb3JpdGhtOworCisjaW5jbHVkZSAiY3J5cHRvL2F4dGxzL2NyeXB0by5oIgorCisjZW5kaWYgLyogX0dQWEVfUlNBX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zYW5ib290LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc2FuYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDYzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc2FuYm9vdC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0dQWEVfU0FOQk9PVF9ICisjZGVmaW5lIF9HUFhFX1NBTkJPT1RfSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorCitzdHJ1Y3Qgc2FuYm9vdF9wcm90b2NvbCB7CisJY29uc3QgY2hhciAqcHJlZml4OworCWludCAoICogYm9vdCApICggY29uc3QgY2hhciAqcm9vdF9wYXRoICk7Cit9OworCisjZGVmaW5lIFNBTkJPT1RfUFJPVE9DT0xTIFwKKwlfX3RhYmxlICggc3RydWN0IHNhbmJvb3RfcHJvdG9jb2wsICJzYW5ib290X3Byb3RvY29scyIgKQorCisjZGVmaW5lIF9fc2FuYm9vdF9wcm90b2NvbCBfX3RhYmxlX2VudHJ5ICggU0FOQk9PVF9QUk9UT0NPTFMsIDAxICkKKworZXh0ZXJuIGludCBrZWVwX3NhbiAoIHZvaWQgKTsKKworI2VuZGlmIC8qIF9HUFhFX1NBTkJPT1RfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3Njc2kuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zY3NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0MTY5NwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zY3NpLmgKQEAgLTAsMCArMSwyODEgQEAKKyNpZm5kZWYgX0dQWEVfU0NTSV9ICisjZGVmaW5lIF9HUFhFX1NDU0lfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9ibG9ja2Rldi5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvcmVmY250Lmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFNDU0kgZGV2aWNlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQGRlZmdyb3VwIHNjc2lvcHMgU0NTSSBvcGVyYXRpb24gY29kZXMKKyAqIEB7CisgKi8KKworI2RlZmluZSBTQ1NJX09QQ09ERV9SRUFEXzEwCQkweDI4CS8qKjwgUkVBRCAoMTApICovCisjZGVmaW5lIFNDU0lfT1BDT0RFX1JFQURfMTYJCTB4ODgJLyoqPCBSRUFEICgxNikgKi8KKyNkZWZpbmUgU0NTSV9PUENPREVfV1JJVEVfMTAJCTB4MmEJLyoqPCBXUklURSAoMTApICovCisjZGVmaW5lIFNDU0lfT1BDT0RFX1dSSVRFXzE2CQkweDhhCS8qKjwgV1JJVEUgKDE2KSAqLworI2RlZmluZSBTQ1NJX09QQ09ERV9SRUFEX0NBUEFDSVRZXzEwCTB4MjUJLyoqPCBSRUFEIENBUEFDSVRZICgxMCkgKi8KKyNkZWZpbmUgU0NTSV9PUENPREVfU0VSVklDRV9BQ1RJT05fSU4JMHg5ZQkvKio8IFNFUlZJQ0UgQUNUSU9OIElOICovCisjZGVmaW5lIFNDU0lfU0VSVklDRV9BQ1RJT05fUkVBRF9DQVBBQ0lUWV8xNiAweDEwIC8qKjwgUkVBRCBDQVBBQ0lUWSAoMTYpICovCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBzY3NpZmxhZ3MgU0NTSSBmbGFncworICogQHsKKyAqLworCisjZGVmaW5lIFNDU0lfRkxfRlVBX05WCQkweDAyCS8qKjwgRm9yY2UgdW5pdCBhY2Nlc3MgdG8gTlZTICovCisjZGVmaW5lIFNDU0lfRkxfRlVBCQkweDA4CS8qKjwgRm9yY2UgdW5pdCBhY2Nlc3MgKi8KKyNkZWZpbmUgU0NTSV9GTF9EUE8JCTB4MTAJLyoqPCBEaXNhYmxlIGNhY2hlIHBhZ2Ugb3V0ICovCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBzY3NpY2RicyBTQ1NJIGNvbW1hbmQgZGF0YSBibG9ja3MKKyAqIEB7CisgKi8KKworLyoqIEEgU0NTSSAiUkVBRCAoMTApIiBDREIgKi8KK3N0cnVjdCBzY3NpX2NkYl9yZWFkXzEwIHsKKwkvKiogT3Bjb2RlICgweDI4KSAqLworCXVpbnQ4X3Qgb3Bjb2RlOworCS8qKiBGbGFncyAqLworCXVpbnQ4X3QgZmxhZ3M7CisJLyoqIFN0YXJ0IGFkZHJlc3MKKwkgKgorCSAqIFRoaXMgaXMgYSBsb2dpY2FsIGJsb2NrIG51bWJlciwgaW4gYmlnLWVuZGlhbiBvcmRlci4KKwkgKi8KKwl1aW50MzJfdCBsYmE7CisJLyoqIEdyb3VwIG51bWJlciAqLworCXVpbnQ4X3QgZ3JvdXA7CisJLyoqIFRyYW5zZmVyIGxlbmd0aAorCSAqCisJICogVGhpcyBpcyBhIGxvZ2ljYWwgYmxvY2sgY291bnQsIGluIGJpZy1lbmRpYW4gb3JkZXIuCisJICovCisJdWludDE2X3QgbGVuOworCS8qKiBDb250cm9sIGJ5dGUgKi8KKwl1aW50OF90IGNvbnRyb2w7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBTQ1NJICJSRUFEICgxNikiIENEQiAqLworc3RydWN0IHNjc2lfY2RiX3JlYWRfMTYgeworCS8qKiBPcGNvZGUgKDB4ODgpICovCisJdWludDhfdCBvcGNvZGU7CisJLyoqIEZsYWdzICovCisJdWludDhfdCBmbGFnczsKKwkvKiogU3RhcnQgYWRkcmVzcworCSAqCisJICogVGhpcyBpcyBhIGxvZ2ljYWwgYmxvY2sgbnVtYmVyLCBpbiBiaWctZW5kaWFuIG9yZGVyLgorCSAqLworCXVpbnQ2NF90IGxiYTsKKwkvKiogVHJhbnNmZXIgbGVuZ3RoCisJICoKKwkgKiBUaGlzIGlzIGEgbG9naWNhbCBibG9jayBjb3VudCwgaW4gYmlnLWVuZGlhbiBvcmRlci4KKwkgKi8KKwl1aW50MzJfdCBsZW47CisJLyoqIEdyb3VwIG51bWJlciAqLworCXVpbnQ4X3QgZ3JvdXA7CisJLyoqIENvbnRyb2wgYnl0ZSAqLworCXVpbnQ4X3QgY29udHJvbDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBIFNDU0kgIldSSVRFICgxMCkiIENEQiAqLworc3RydWN0IHNjc2lfY2RiX3dyaXRlXzEwIHsKKwkvKiogT3Bjb2RlICgweDJhKSAqLworCXVpbnQ4X3Qgb3Bjb2RlOworCS8qKiBGbGFncyAqLworCXVpbnQ4X3QgZmxhZ3M7CisJLyoqIFN0YXJ0IGFkZHJlc3MKKwkgKgorCSAqIFRoaXMgaXMgYSBsb2dpY2FsIGJsb2NrIG51bWJlciwgaW4gYmlnLWVuZGlhbiBvcmRlci4KKwkgKi8KKwl1aW50MzJfdCBsYmE7CisJLyoqIEdyb3VwIG51bWJlciAqLworCXVpbnQ4X3QgZ3JvdXA7CisJLyoqIFRyYW5zZmVyIGxlbmd0aAorCSAqCisJICogVGhpcyBpcyBhIGxvZ2ljYWwgYmxvY2sgY291bnQsIGluIGJpZy1lbmRpYW4gb3JkZXIuCisJICovCisJdWludDE2X3QgbGVuOworCS8qKiBDb250cm9sIGJ5dGUgKi8KKwl1aW50OF90IGNvbnRyb2w7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBTQ1NJICJXUklURSAoMTYpIiBDREIgKi8KK3N0cnVjdCBzY3NpX2NkYl93cml0ZV8xNiB7CisJLyoqIE9wY29kZSAoMHg4YSkgKi8KKwl1aW50OF90IG9wY29kZTsKKwkvKiogRmxhZ3MgKi8KKwl1aW50OF90IGZsYWdzOworCS8qKiBTdGFydCBhZGRyZXNzCisJICoKKwkgKiBUaGlzIGlzIGEgbG9naWNhbCBibG9jayBudW1iZXIsIGluIGJpZy1lbmRpYW4gb3JkZXIuCisJICovCisJdWludDY0X3QgbGJhOworCS8qKiBUcmFuc2ZlciBsZW5ndGgKKwkgKgorCSAqIFRoaXMgaXMgYSBsb2dpY2FsIGJsb2NrIGNvdW50LCBpbiBiaWctZW5kaWFuIG9yZGVyLgorCSAqLworCXVpbnQzMl90IGxlbjsKKwkvKiogR3JvdXAgbnVtYmVyICovCisJdWludDhfdCBncm91cDsKKwkvKiogQ29udHJvbCBieXRlICovCisJdWludDhfdCBjb250cm9sOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgU0NTSSAiUkVBRCBDQVBBQ0lUWSAoMTApIiBDREIgKi8KK3N0cnVjdCBzY3NpX2NkYl9yZWFkX2NhcGFjaXR5XzEwIHsKKwkvKiogT3Bjb2RlICgweDI1KSAqLworCXVpbnQ4X3Qgb3Bjb2RlOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfYTsKKwkvKiogTG9naWNhbCBibG9jayBhZGRyZXNzCisJICoKKwkgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIFBNSSBiaXQgaXMgc2V0LgorCSAqLworCXVpbnQzMl90IGxiYTsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkX2JbM107CisJLyoqIENvbnRyb2wgYnl0ZSAqLworCXVpbnQ4X3QgY29udHJvbDsJCit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogU0NTSSAiUkVBRCBDQVBBQ0lUWSAoMTApIiBwYXJhbWV0ZXIgZGF0YSAqLworc3RydWN0IHNjc2lfY2FwYWNpdHlfMTAgeworCS8qKiBNYXhpbXVtIGxvZ2ljYWwgYmxvY2sgbnVtYmVyICovCisJdWludDMyX3QgbGJhOworCS8qKiBCbG9jayBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1aW50MzJfdCBibGtzaXplOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgU0NTSSAiUkVBRCBDQVBBQ0lUWSAoMTYpIiBDREIgKi8KK3N0cnVjdCBzY3NpX2NkYl9yZWFkX2NhcGFjaXR5XzE2IHsKKwkvKiogT3Bjb2RlICgweDllKSAqLworCXVpbnQ4X3Qgb3Bjb2RlOworCS8qKiBTZXJ2aWNlIGFjdGlvbiAqLworCXVpbnQ4X3Qgc2VydmljZV9hY3Rpb247CisJLyoqIExvZ2ljYWwgYmxvY2sgYWRkcmVzcworCSAqCisJICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSBQTUkgYml0IGlzIHNldC4KKwkgKi8KKwl1aW50NjRfdCBsYmE7CisJLyoqIFRyYW5zZmVyIGxlbmd0aAorCSAqCisJICogVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgZGF0YS1pbiBidWZmZXIsIGluIGJ5dGVzLgorCSAqLworCXVpbnQzMl90IGxlbjsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkOworCS8qKiBDb250cm9sIGJ5dGUgKi8KKwl1aW50OF90IGNvbnRyb2w7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogU0NTSSAiUkVBRCBDQVBBQ0lUWSAoMTYpIiBwYXJhbWV0ZXIgZGF0YSAqLworc3RydWN0IHNjc2lfY2FwYWNpdHlfMTYgeworCS8qKiBNYXhpbXVtIGxvZ2ljYWwgYmxvY2sgbnVtYmVyICovCisJdWludDY0X3QgbGJhOworCS8qKiBCbG9jayBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1aW50MzJfdCBibGtzaXplOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRbMjBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgU0NTSSBDb21tYW5kIERhdGEgQmxvY2sgKi8KK3VuaW9uIHNjc2lfY2RiIHsKKwlzdHJ1Y3Qgc2NzaV9jZGJfcmVhZF8xMCByZWFkMTA7CisJc3RydWN0IHNjc2lfY2RiX3JlYWRfMTYgcmVhZDE2OworCXN0cnVjdCBzY3NpX2NkYl93cml0ZV8xMCB3cml0ZTEwOworCXN0cnVjdCBzY3NpX2NkYl93cml0ZV8xNiB3cml0ZTE2OworCXN0cnVjdCBzY3NpX2NkYl9yZWFkX2NhcGFjaXR5XzEwIHJlYWRjYXAxMDsKKwlzdHJ1Y3Qgc2NzaV9jZGJfcmVhZF9jYXBhY2l0eV8xNiByZWFkY2FwMTY7CisJdW5zaWduZWQgY2hhciBieXRlc1sxNl07Cit9OworCisvKiogcHJpbnRmKCkgZm9ybWF0IGZvciBkdW1waW5nIGEgc2NzaV9jZGIgKi8KKyNkZWZpbmUgU0NTSV9DREJfRk9STUFUICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6IiBcCisJCQkiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorCisvKiogcHJpbnRmKCkgcGFyYW1ldGVycyBmb3IgZHVtcGluZyBhIHNjc2lfY2RiICovCisjZGVmaW5lIFNDU0lfQ0RCX0RBVEEoY2RiKQkJCQkJCSAgXAorCShjZGIpLmJ5dGVzWzBdLCAoY2RiKS5ieXRlc1sxXSwgKGNkYikuYnl0ZXNbMl0sIChjZGIpLmJ5dGVzWzNdLAkgIFwKKwkoY2RiKS5ieXRlc1s0XSwgKGNkYikuYnl0ZXNbNV0sIChjZGIpLmJ5dGVzWzZdLCAoY2RiKS5ieXRlc1s3XSwJICBcCisJKGNkYikuYnl0ZXNbOF0sIChjZGIpLmJ5dGVzWzldLCAoY2RiKS5ieXRlc1sxMF0sIChjZGIpLmJ5dGVzWzExXSwgXAorCShjZGIpLmJ5dGVzWzEyXSwgKGNkYikuYnl0ZXNbMTNdLCAoY2RiKS5ieXRlc1sxNF0sIChjZGIpLmJ5dGVzWzE1XQorCisvKiogQH0gKi8KKworLyoqIEEgU0NTSSBjb21tYW5kICovCitzdHJ1Y3Qgc2NzaV9jb21tYW5kIHsKKwkvKiogQ0RCIGZvciB0aGlzIGNvbW1hbmQgKi8KKwl1bmlvbiBzY3NpX2NkYiBjZGI7CisJLyoqIERhdGEtb3V0IGJ1ZmZlciAobWF5IGJlIE5VTEwpICovCisJdXNlcnB0cl90IGRhdGFfb3V0OworCS8qKiBEYXRhLW91dCBidWZmZXIgbGVuZ3RoCisJICoKKwkgKiBNdXN0IGJlIHplcm8gaWYgQGMgZGF0YV9vdXQgaXMgTlVMTAorCSAqLworCXNpemVfdCBkYXRhX291dF9sZW47CisJLyoqIERhdGEtaW4gYnVmZmVyIChtYXkgYmUgTlVMTCkgKi8KKwl1c2VycHRyX3QgZGF0YV9pbjsKKwkvKiogRGF0YS1pbiBidWZmZXIgbGVuZ3RoCisJICoKKwkgKiBNdXN0IGJlIHplcm8gaWYgQGMgZGF0YV9pbiBpcyBOVUxMCisJICovCisJc2l6ZV90IGRhdGFfaW5fbGVuOworCS8qKiBTQ1NJIHN0YXR1cyBjb2RlICovCisJdWludDhfdCBzdGF0dXM7CisJLyoqIFNDU0kgc2Vuc2UgcmVzcG9uc2UgY29kZSAqLworCXVpbnQ4X3Qgc2Vuc2VfcmVzcG9uc2U7CisJLyoqIENvbW1hbmQgc3RhdHVzIGNvZGUgKi8KKwlpbnQgcmM7Cit9OworCisvKiogQSBTQ1NJIExVTgorICoKKyAqIFRoaXMgaXMgYSBmb3VyLWxldmVsIExVTiBhcyBzcGVjaWZpZWQgYnkgU0FNLTIsIGluIGJpZy1lbmRpYW4KKyAqIG9yZGVyLgorICovCitzdHJ1Y3Qgc2NzaV9sdW4geworCXVpbnQxNl90IHUxNls0XTsKK30gIF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBTQ1NJIGRldmljZSAqLworc3RydWN0IHNjc2lfZGV2aWNlIHsKKwkvKiogQmxvY2sgZGV2aWNlIGludGVyZmFjZSAqLworCXN0cnVjdCBibG9ja19kZXZpY2UgYmxvY2tkZXY7CisJLyoqCisJICogSXNzdWUgU0NTSSBjb21tYW5kCisJICoKKwkgKiBAdiBzY3NpCQlTQ1NJIGRldmljZQorCSAqIEB2IGNvbW1hbmQJCVNDU0kgY29tbWFuZAorCSAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorCSAqCisJICogTm90ZSB0aGF0IGEgc3VjY2Vzc2Z1bCByZXR1cm4gc3RhdHVzIGNvZGUgaW5kaWNhdGVzIG9ubHkKKwkgKiB0aGF0IHRoZSBTQ1NJIGNvbW1hbmQgd2FzIGlzc3VlZC4gIFRoZSBjYWxsZXIgbXVzdCBjaGVjaworCSAqIHRoZSBzdGF0dXMgZmllbGQgaW4gdGhlIGNvbW1hbmQgc3RydWN0dXJlIHRvIHNlZSB3aGVuIHRoZQorCSAqIGNvbW1hbmQgY29tcGxldGVzIGFuZCB3aGV0aGVyLCBmb3IgZXhhbXBsZSwgdGhlIGRldmljZQorCSAqIHJldHVybmVkIENIRUNLIENPTkRJVElPTiBvciBzb21lIG90aGVyIG5vbi1zdWNjZXNzIHN0YXR1cworCSAqIGNvZGUuCisJICovCisJaW50ICggKiBjb21tYW5kICkgKCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2ksCisJCQkgICAgc3RydWN0IHNjc2lfY29tbWFuZCAqY29tbWFuZCApOworCS8qKiBCYWNraW5nIGRldmljZSAqLworCXN0cnVjdCByZWZjbnQgKmJhY2tlbmQ7Cit9OworCitleHRlcm4gaW50IHNjc2lfZGV0YWNoZWRfY29tbWFuZCAoIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSwKKwkJCQkgICBzdHJ1Y3Qgc2NzaV9jb21tYW5kICpjb21tYW5kICk7CitleHRlcm4gaW50IGluaXRfc2NzaWRldiAoIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSApOworZXh0ZXJuIGludCBzY3NpX3BhcnNlX2x1biAoIGNvbnN0IGNoYXIgKmx1bl9zdHJpbmcsIHN0cnVjdCBzY3NpX2x1biAqbHVuICk7CisKKyNlbmRpZiAvKiBfR1BYRV9TQ1NJX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zZWM4MDIxMS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NlYzgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyZWJmNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zZWM4MDIxMS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX0dQWEVfU0VDODAyMTFfSAorI2RlZmluZSBfR1BYRV9TRUM4MDIxMV9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvbmV0ODAyMTEuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKiogQGZpbGUKKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgZ2VuZXJhbCBzZWN1cmVkLW5ldHdvcmsgcm91dGluZXMuCisgKgorICogQW55IGZ1bmN0aW9uIGluIHRoaXMgZmlsZSB3aGljaCBtYXkgYmUgcmVmZXJlbmNlZCBieSBjb2RlIHdoaWNoIGlzCisgKiBub3QgZXhjbHVzaXZlIHRvIGVuY3J5cHRpb24tZW5hYmxlZCBidWlsZHMgKGUuZy4gc2VjODAyMTFfZGV0ZWN0KCksCisgKiB3aGljaCBpcyBjYWxsZWQgYnkgbmV0ODAyMTFfcHJvYmVfc3RlcCgpIHRvIGZpbGwgdGhlIG5ldDgwMjExX3dsYW4KKyAqIHN0cnVjdHVyZSdzIHNlY3VyaXR5IGZpZWxkcykgbXVzdCBiZSBkZWNsYXJlZCBhcyBhIHdlYWsgc3ltYm9sLAorICogdXNpbmcgYW4gaW5saW5lIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgdXNlZCBmb3IKKyAqIHNlYzgwMjExX2RldGVjdCgpIGJlbG93LiBUaGlzIHByZXZlbnRzIHNlY3VyZSBuZXR3b3JrIHN1cHBvcnQgZnJvbQorICogYmxvYXRpbmcgZ2VuZXJhbCBidWlsZHMgYnkgYW55IG1vcmUgdGhhbiBhIGZldyB0aW55IGhvb2tzIHRvIGNhbGwKKyAqIGNyeXB0byBmdW5jdGlvbnMgd2hlbiBjcnlwdG8gc3RydWN0dXJlcyBhcmUgbm9uLU5VTEwuCisgKi8KKworaW50IF9zZWM4MDIxMV9kZXRlY3QgKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IsCisJCSAgICAgICBlbnVtIG5ldDgwMjExX3NlY3VyaXR5X3Byb3RvICpzZWNwcm90LAorCQkgICAgICAgZW51bSBuZXQ4MDIxMV9jcnlwdG9fYWxnICpjcnlwdCApCisJX19hdHRyaWJ1dGVfXyAoKCB3ZWFrICkpOworCisKKy8qKgorICogSW5saW5lIHNhZmV0eSB3cmFwcGVyIGZvciBfc2VjODAyMTFfZGV0ZWN0KCkKKyAqCisgKiBAdiBpb2IJSS9PIGJ1ZmZlciBjb250YWluaW5nIGJlYWNvbiBmcmFtZQorICogQHJldCBzZWNwcm90CVNlY3VyaXR5IGhhbmRzaGFraW5nIHByb3RvY29sIHVzZWQgYnkgbmV0d29yaworICogQHJldCBjcnlwdAlDcnlwdG9zeXN0ZW0gdXNlZCBieSBuZXR3b3JrCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNwYXJlbnRseSBjYWxscyBfc2VjODAyMTFfZGV0ZWN0KCkgaWYgdGhlIGZpbGUKKyAqIGNvbnRhaW5pbmcgaXQgd2FzIGNvbXBpbGVkIGluLCBvciByZXR1cm5zIGFuIGVycm9yIGluZGljYXRpb24gb2YKKyAqIEBjIC1FTk9UU1VQIGlmIG5vdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2VjODAyMTFfZGV0ZWN0ICggc3RydWN0IGlvX2J1ZmZlciAqaW9iLAorCQkJCSAgICBlbnVtIG5ldDgwMjExX3NlY3VyaXR5X3Byb3RvICpzZWNwcm90LAorCQkJCSAgICBlbnVtIG5ldDgwMjExX2NyeXB0b19hbGcgKmNyeXB0ICkgeworCWlmICggX3NlYzgwMjExX2RldGVjdCApCisJCXJldHVybiBfc2VjODAyMTFfZGV0ZWN0ICggaW9iLCBzZWNwcm90LCBjcnlwdCApOworCXJldHVybiAtRU5PVFNVUDsKK30KKworaW50IHNlYzgwMjExX2RldGVjdF9pZSAoIGludCBpc19yc24sIHU4ICpzdGFydCwgdTggKmVuZCwKKwkJCSBlbnVtIG5ldDgwMjExX3NlY3VyaXR5X3Byb3RvICpzZWNwcm90LAorCQkJIGVudW0gbmV0ODAyMTFfY3J5cHRvX2FsZyAqY3J5cHQgKTsKK3U4ICogc2VjODAyMTFfZmluZF9yc24gKCB1bmlvbiBpZWVlODAyMTFfaWUgKmllLCB2b2lkICppZV9lbmQsCisJCQkgaW50ICppc19yc24sIHU4ICoqZW5kICk7CisKK2ludCBzZWM4MDIxMV9pbnN0YWxsICggc3RydWN0IG5ldDgwMjExX2NyeXB0byAqKndoaWNoLAorCQkgICAgICAgZW51bSBuZXQ4MDIxMV9jcnlwdG9fYWxnIGNyeXB0LAorCQkgICAgICAgY29uc3Qgdm9pZCAqa2V5LCBpbnQgbGVuLCBjb25zdCB2b2lkICpyc2MgKTsKKwordTMyIHNlYzgwMjExX3Jzbl9nZXRfY3J5cHRvX2Rlc2MgKCBlbnVtIG5ldDgwMjExX2NyeXB0b19hbGcgY3J5cHQsIGludCByc25pZSApOwordTMyIHNlYzgwMjExX3Jzbl9nZXRfYWttX2Rlc2MgKCBlbnVtIG5ldDgwMjExX3NlY3VyaXR5X3Byb3RvIHNlY3Byb3QsCisJCQkJaW50IHJzbmllICk7CitlbnVtIG5ldDgwMjExX2NyeXB0b19hbGcgc2VjODAyMTFfcnNuX2dldF9uZXQ4MDIxMV9jcnlwdCAoIHUzMiBkZXNjICk7CisKKyNlbmRpZiAvKiBfR1BYRV9TRUM4MDIxMV9IICovCisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zZWdtZW50LmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc2VnbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTljNTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc2VnbWVudC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0dQWEVfU0VHTUVOVF9ICisjZGVmaW5lIF9HUFhFX1NFR01FTlRfSAorCisvKioKKyAqIEBmaWxlCisgKgorICogRXhlY3V0YWJsZSBpbWFnZSBzZWdtZW50cworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKworZXh0ZXJuIGludCBwcmVwX3NlZ21lbnQgKCB1c2VycHRyX3Qgc2VnbWVudCwgc2l6ZV90IGZpbGVzeiwgc2l6ZV90IG1lbXN6ICk7CisKKyNlbmRpZiAvKiBfR1BYRV9TRUdNRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zZXJpYWwuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJjYTdlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NlcmlhbC5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX0dQWEVfU0VSSUFMX0gKKyNkZWZpbmUgX0dQWEVfU0VSSUFMX0gKKworLyoqIEBmaWxlCisgKgorICogU2VyaWFsIGRyaXZlciBmdW5jdGlvbnMKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitleHRlcm4gdm9pZCBzZXJpYWxfcHV0YyAoIGludCBjaCApOworZXh0ZXJuIGludCBzZXJpYWxfZ2V0YyAoIHZvaWQgKTsKK2V4dGVybiBpbnQgc2VyaWFsX2lzY2hhciAoIHZvaWQgKTsKKworI2VuZGlmIC8qIF9HUFhFX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc2V0dGluZ3MuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zZXR0aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWZlNzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc2V0dGluZ3MuaApAQCAtMCwwICsxLDMzNSBAQAorI2lmbmRlZiBfR1BYRV9TRVRUSU5HU19ICisjZGVmaW5lIF9HUFhFX1NFVFRJTkdTX0gKKworLyoqIEBmaWxlCisgKgorICogQ29uZmlndXJhdGlvbiBzZXR0aW5ncworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorI2luY2x1ZGUgPGdweGUvcmVmY250Lmg+CisKK3N0cnVjdCBzZXR0aW5nczsKK3N0cnVjdCBpbl9hZGRyOwordW5pb24gdXVpZDsKKworLyoqIEEgc2V0dGluZyAqLworc3RydWN0IHNldHRpbmcgeworCS8qKiBOYW1lCisJICoKKwkgKiBUaGlzIGlzIHRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgc2V0dGluZy4KKwkgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKiBEZXNjcmlwdGlvbiAqLworCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOworCS8qKiBTZXR0aW5nIHR5cGUKKwkgKgorCSAqIFRoaXMgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBzZXR0aW5nIChlLmcuIHN0cmluZywgSVB2NAorCSAqIGFkZHJlc3MsIGV0Yy4pLgorCSAqLworCXN0cnVjdCBzZXR0aW5nX3R5cGUgKnR5cGU7CisJLyoqIERIQ1Agb3B0aW9uIG51bWJlciwgaWYgYXBwbGljYWJsZSAqLworCXVuc2lnbmVkIGludCB0YWc7Cit9OworCisvKiogQ29uZmlndXJhdGlvbiBzZXR0aW5nIHRhYmxlICovCisjZGVmaW5lIFNFVFRJTkdTIF9fdGFibGUgKCBzdHJ1Y3Qgc2V0dGluZywgInNldHRpbmdzIiApCisKKy8qKiBEZWNsYXJlIGEgY29uZmlndXJhdGlvbiBzZXR0aW5nICovCisjZGVmaW5lIF9fc2V0dGluZyBfX3RhYmxlX2VudHJ5ICggU0VUVElOR1MsIDAxICkKKworLyoqIFNldHRpbmdzIGJsb2NrIG9wZXJhdGlvbnMgKi8KK3N0cnVjdCBzZXR0aW5nc19vcGVyYXRpb25zIHsKKwkvKiogU3RvcmUgdmFsdWUgb2Ygc2V0dGluZworCSAqCisJICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisJICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBzdG9yZQorCSAqIEB2IGRhdGEJCVNldHRpbmcgZGF0YSwgb3IgTlVMTCB0byBjbGVhciBzZXR0aW5nCisJICogQHYgbGVuCQlMZW5ndGggb2Ygc2V0dGluZyBkYXRhCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBzdG9yZSApICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKKwkvKiogRmV0Y2ggdmFsdWUgb2Ygc2V0dGluZworCSAqCisJICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisJICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorCSAqIEB2IGRhdGEJCUJ1ZmZlciB0byBmaWxsIHdpdGggc2V0dGluZyBkYXRhCisJICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisJICogQHJldCBsZW4JCUxlbmd0aCBvZiBzZXR0aW5nIGRhdGEsIG9yIG5lZ2F0aXZlIGVycm9yCisJICoKKwkgKiBUaGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgc2V0dGluZyB3aWxsIGJlIHJldHVybmVkIGV2ZW4gaWYKKwkgKiB0aGUgYnVmZmVyIHdhcyB0b28gc21hbGwuCisJICovCisJaW50ICggKiBmZXRjaCApICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKKwkvKiogQ2xlYXIgc2V0dGluZ3MgYmxvY2sKKwkgKgorCSAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworCSAqLworCXZvaWQgKCAqIGNsZWFyICkgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzICk7Cit9OworCisvKiogQSBzZXR0aW5ncyBibG9jayAqLworc3RydWN0IHNldHRpbmdzIHsKKwkvKiogUmVmZXJlbmNlIGNvdW50ZXIgKi8KKwlzdHJ1Y3QgcmVmY250ICpyZWZjbnQ7CisJLyoqIE5hbWUgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKiBUYWcgbWFnaWMKKwkgKgorCSAqIFRoaXMgdmFsdWUgd2lsbCBiZSBPUmVkIGluIHRvIGFueSBudW1lcmljYWwgdGFncworCSAqIGNvbnN0cnVjdGVkIGJ5IHBhcnNlX3NldHRpbmdfbmFtZSgpLCBhbmQgY2FuIGJlIHVzZWQgdG8KKwkgKiBhdm9pZCBlLmcuIGF0dGVtcHRpbmcgdG8gcmV0cmlldmUgdGhlIHN1Ym5ldCBtYXNrIGZyb20KKwkgKiBTTUJJT1MsIG9yIHRoZSBzeXN0ZW0gVVVJRCBmcm9tIERIQ1AuCisJICovCisJdW5zaWduZWQgaW50IHRhZ19tYWdpYzsKKwkvKiogUGFyZW50IHNldHRpbmdzIGJsb2NrICovCisJc3RydWN0IHNldHRpbmdzICpwYXJlbnQ7CisJLyoqIFNpYmxpbmcgc2V0dGluZ3MgYmxvY2tzICovCisJc3RydWN0IGxpc3RfaGVhZCBzaWJsaW5nczsKKwkvKiogQ2hpbGQgc2V0dGluZ3MgYmxvY2tzICovCisJc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsKKwkvKiogU2V0dGluZ3MgYmxvY2sgb3BlcmF0aW9ucyAqLworCXN0cnVjdCBzZXR0aW5nc19vcGVyYXRpb25zICpvcDsKK307CisKKy8qKgorICogQSBzZXR0aW5nIHR5cGUKKyAqCisgKiBUaGlzIHJlcHJlc2VudHMgYSB0eXBlIG9mIHNldHRpbmcgKGUuZy4gc3RyaW5nLCBJUHY0IGFkZHJlc3MsCisgKiBldGMuKS4KKyAqLworc3RydWN0IHNldHRpbmdfdHlwZSB7CisJLyoqIE5hbWUKKwkgKgorCSAqIFRoaXMgaXMgdGhlIG5hbWUgZXhwb3NlZCB0byB0aGUgdXNlciAoZS5nLiAic3RyaW5nIikuCisJICovCisJY29uc3QgY2hhciAqbmFtZTsKKwkvKiogUGFyc2UgYW5kIHNldCB2YWx1ZSBvZiBzZXR0aW5nCisJICoKKwkgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2sKKwkgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIHN0b3JlCisJICogQHYgdmFsdWUJCUZvcm1hdHRlZCBzZXR0aW5nIGRhdGEKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIHN0b3JlZiApICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgICBjb25zdCBjaGFyICp2YWx1ZSApOworCS8qKiBGZXRjaCBhbmQgZm9ybWF0IHZhbHVlIG9mIHNldHRpbmcKKwkgKgorCSAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworCSAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gZmV0Y2gKKwkgKiBAdiBidWYJCUJ1ZmZlciB0byBjb250YWluIGZvcm1hdHRlZCB2YWx1ZQorCSAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorCSAqIEByZXQgbGVuCQlMZW5ndGggb2YgZm9ybWF0dGVkIHZhbHVlLCBvciBuZWdhdGl2ZSBlcnJvcgorCSAqLworCWludCAoICogZmV0Y2hmICkgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCSAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiApOworfTsKKworLyoqIENvbmZpZ3VyYXRpb24gc2V0dGluZyB0eXBlIHRhYmxlICovCisjZGVmaW5lIFNFVFRJTkdfVFlQRVMgX190YWJsZSAoIHN0cnVjdCBzZXR0aW5nX3R5cGUsICJzZXR0aW5nX3R5cGVzIiApCisKKy8qKiBEZWNsYXJlIGEgY29uZmlndXJhdGlvbiBzZXR0aW5nIHR5cGUgKi8KKyNkZWZpbmUgX19zZXR0aW5nX3R5cGUgX190YWJsZV9lbnRyeSAoIFNFVFRJTkdfVFlQRVMsIDAxICkKKworLyoqCisgKiBBIHNldHRpbmdzIGFwcGxpY2F0b3IKKyAqCisgKi8KK3N0cnVjdCBzZXR0aW5nc19hcHBsaWNhdG9yIHsKKwkvKiogQXBwbHkgdXBkYXRlZCBzZXR0aW5ncworCSAqCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBhcHBseSApICggdm9pZCApOworfTsKKworLyoqIFNldHRpbmdzIGFwcGxpY2F0b3IgdGFibGUgKi8KKyNkZWZpbmUgU0VUVElOR1NfQVBQTElDQVRPUlMgXAorCV9fdGFibGUgKCBzdHJ1Y3Qgc2V0dGluZ3NfYXBwbGljYXRvciwgInNldHRpbmdzX2FwcGxpY2F0b3JzIiApCisKKy8qKiBEZWNsYXJlIGEgc2V0dGluZ3MgYXBwbGljYXRvciAqLworI2RlZmluZSBfX3NldHRpbmdzX2FwcGxpY2F0b3IgX190YWJsZV9lbnRyeSAoIFNFVFRJTkdTX0FQUExJQ0FUT1JTLCAwMSApCisKKy8qKgorICogQSBnZW5lcmljIHNldHRpbmdzIGJsb2NrCisgKgorICovCitzdHJ1Y3QgZ2VuZXJpY19zZXR0aW5ncyB7CisJLyoqIFNldHRpbmdzIGJsb2NrICovCisJc3RydWN0IHNldHRpbmdzIHNldHRpbmdzOworCS8qKiBMaXN0IG9mIGdlbmVyaWMgc2V0dGluZ3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitleHRlcm4gc3RydWN0IHNldHRpbmdzX29wZXJhdGlvbnMgZ2VuZXJpY19zZXR0aW5nc19vcGVyYXRpb25zOworZXh0ZXJuIGludCBnZW5lcmljX3NldHRpbmdzX3N0b3JlICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCQkgICAgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKK2V4dGVybiBpbnQgZ2VuZXJpY19zZXR0aW5nc19mZXRjaCAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJICAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJCSAgICB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7CitleHRlcm4gdm9pZCBnZW5lcmljX3NldHRpbmdzX2NsZWFyICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncyApOworCitleHRlcm4gaW50IHJlZ2lzdGVyX3NldHRpbmdzICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCSAgICAgICBzdHJ1Y3Qgc2V0dGluZ3MgKnBhcmVudCApOworZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9zZXR0aW5ncyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MgKTsKKworZXh0ZXJuIGludCBzdG9yZV9zZXR0aW5nICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7CitleHRlcm4gaW50IGZldGNoX3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCSAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKK2V4dGVybiBpbnQgZmV0Y2hfc2V0dGluZ19sZW4gKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJICAgICAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nICk7CitleHRlcm4gaW50IGZldGNoX3N0cmluZ19zZXR0aW5nICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCQkgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJCSAgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiApOworZXh0ZXJuIGludCBmZXRjaF9zdHJpbmdfc2V0dGluZ19jb3B5ICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCQkgICAgICAgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkJICAgICAgIGNoYXIgKipkYXRhICk7CitleHRlcm4gaW50IGZldGNoX2lwdjRfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJc3RydWN0IHNldHRpbmcgKnNldHRpbmcsIHN0cnVjdCBpbl9hZGRyICppbnAgKTsKK2V4dGVybiBpbnQgZmV0Y2hfaW50X3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJICAgICAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLCBsb25nICp2YWx1ZSApOworZXh0ZXJuIGludCBmZXRjaF91aW50X3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJCXN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJCXVuc2lnbmVkIGxvbmcgKnZhbHVlICk7CitleHRlcm4gbG9uZyBmZXRjaF9pbnR6X3NldHRpbmcgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJCSBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZyApOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZmV0Y2hfdWludHpfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJCSAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nICk7CitleHRlcm4gaW50IGZldGNoX3V1aWRfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJc3RydWN0IHNldHRpbmcgKnNldHRpbmcsIHVuaW9uIHV1aWQgKnV1aWQgKTsKK2V4dGVybiB2b2lkIGNsZWFyX3NldHRpbmdzICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncyApOworZXh0ZXJuIGludCBzZXR0aW5nX2NtcCAoIHN0cnVjdCBzZXR0aW5nICphLCBzdHJ1Y3Qgc2V0dGluZyAqYiApOworCitleHRlcm4gc3RydWN0IHNldHRpbmdzICogZmluZF9zZXR0aW5ncyAoIGNvbnN0IGNoYXIgKm5hbWUgKTsKKworZXh0ZXJuIGludCBzdG9yZWZfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkgICAgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgICAgY29uc3QgY2hhciAqdmFsdWUgKTsKK2V4dGVybiBpbnQgc3RvcmVmX25hbWVkX3NldHRpbmcgKCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSApOworZXh0ZXJuIGludCBmZXRjaGZfbmFtZWRfc2V0dGluZyAoIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiApOworCitleHRlcm4gc3RydWN0IHNldHRpbmdfdHlwZSBzZXR0aW5nX3R5cGVfc3RyaW5nIF9fc2V0dGluZ190eXBlOworZXh0ZXJuIHN0cnVjdCBzZXR0aW5nX3R5cGUgc2V0dGluZ190eXBlX2lwdjQgX19zZXR0aW5nX3R5cGU7CitleHRlcm4gc3RydWN0IHNldHRpbmdfdHlwZSBzZXR0aW5nX3R5cGVfaW50OCBfX3NldHRpbmdfdHlwZTsKK2V4dGVybiBzdHJ1Y3Qgc2V0dGluZ190eXBlIHNldHRpbmdfdHlwZV9pbnQxNiBfX3NldHRpbmdfdHlwZTsKK2V4dGVybiBzdHJ1Y3Qgc2V0dGluZ190eXBlIHNldHRpbmdfdHlwZV9pbnQzMiBfX3NldHRpbmdfdHlwZTsKK2V4dGVybiBzdHJ1Y3Qgc2V0dGluZ190eXBlIHNldHRpbmdfdHlwZV91aW50OCBfX3NldHRpbmdfdHlwZTsKK2V4dGVybiBzdHJ1Y3Qgc2V0dGluZ190eXBlIHNldHRpbmdfdHlwZV91aW50MTYgX19zZXR0aW5nX3R5cGU7CitleHRlcm4gc3RydWN0IHNldHRpbmdfdHlwZSBzZXR0aW5nX3R5cGVfdWludDMyIF9fc2V0dGluZ190eXBlOworZXh0ZXJuIHN0cnVjdCBzZXR0aW5nX3R5cGUgc2V0dGluZ190eXBlX2hleCBfX3NldHRpbmdfdHlwZTsKK2V4dGVybiBzdHJ1Y3Qgc2V0dGluZ190eXBlIHNldHRpbmdfdHlwZV91dWlkIF9fc2V0dGluZ190eXBlOworCitleHRlcm4gc3RydWN0IHNldHRpbmcgaXBfc2V0dGluZyBfX3NldHRpbmc7CitleHRlcm4gc3RydWN0IHNldHRpbmcgbmV0bWFza19zZXR0aW5nIF9fc2V0dGluZzsKK2V4dGVybiBzdHJ1Y3Qgc2V0dGluZyBnYXRld2F5X3NldHRpbmcgX19zZXR0aW5nOworZXh0ZXJuIHN0cnVjdCBzZXR0aW5nIGRuc19zZXR0aW5nIF9fc2V0dGluZzsKK2V4dGVybiBzdHJ1Y3Qgc2V0dGluZyBkb21haW5fc2V0dGluZyBfX3NldHRpbmc7CitleHRlcm4gc3RydWN0IHNldHRpbmcgaG9zdG5hbWVfc2V0dGluZyBfX3NldHRpbmc7CitleHRlcm4gc3RydWN0IHNldHRpbmcgZmlsZW5hbWVfc2V0dGluZyBfX3NldHRpbmc7CitleHRlcm4gc3RydWN0IHNldHRpbmcgcm9vdF9wYXRoX3NldHRpbmcgX19zZXR0aW5nOworZXh0ZXJuIHN0cnVjdCBzZXR0aW5nIHVzZXJuYW1lX3NldHRpbmcgX19zZXR0aW5nOworZXh0ZXJuIHN0cnVjdCBzZXR0aW5nIHBhc3N3b3JkX3NldHRpbmcgX19zZXR0aW5nOworZXh0ZXJuIHN0cnVjdCBzZXR0aW5nIHByaW9yaXR5X3NldHRpbmcgX19zZXR0aW5nOworZXh0ZXJuIHN0cnVjdCBzZXR0aW5nIHV1aWRfc2V0dGluZyBfX3NldHRpbmc7CitleHRlcm4gc3RydWN0IHNldHRpbmcgbmV4dF9zZXJ2ZXJfc2V0dGluZyBfX3NldHRpbmc7CitleHRlcm4gc3RydWN0IHNldHRpbmcgbWFjX3NldHRpbmcgX19zZXR0aW5nOworZXh0ZXJuIHN0cnVjdCBzZXR0aW5nIGJ1c2lkX3NldHRpbmcgX19zZXR0aW5nOworZXh0ZXJuIHN0cnVjdCBzZXR0aW5nIHVzZXJfY2xhc3Nfc2V0dGluZyBfX3NldHRpbmc7CisKKy8qKgorICogSW5pdGlhbGlzZSBhIHNldHRpbmdzIGJsb2NrCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKiBAdiBvcAkJU2V0dGluZ3MgYmxvY2sgb3BlcmF0aW9ucworICogQHYgcmVmY250CQlDb250YWluaW5nIG9iamVjdCByZWZlcmVuY2UgY291bnRlciwgb3IgTlVMTAorICogQHYgbmFtZQkJU2V0dGluZ3MgYmxvY2sgbmFtZQorICogQHYgdGFnX21hZ2ljCQlUYWcgbWFnaWMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldHRpbmdzX2luaXQgKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJCSAgIHN0cnVjdCBzZXR0aW5nc19vcGVyYXRpb25zICpvcCwKKwkJCQkgICBzdHJ1Y3QgcmVmY250ICpyZWZjbnQsCisJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdGFnX21hZ2ljICkgeworCUlOSVRfTElTVF9IRUFEICggJnNldHRpbmdzLT5zaWJsaW5ncyApOworCUlOSVRfTElTVF9IRUFEICggJnNldHRpbmdzLT5jaGlsZHJlbiApOworCXNldHRpbmdzLT5vcCA9IG9wOworCXNldHRpbmdzLT5yZWZjbnQgPSByZWZjbnQ7CisJc2V0dGluZ3MtPm5hbWUgPSBuYW1lOworCXNldHRpbmdzLT50YWdfbWFnaWMgPSB0YWdfbWFnaWM7Cit9CisKKy8qKgorICogSW5pdGlhbGlzZSBhIHNldHRpbmdzIGJsb2NrCisgKgorICogQHYgZ2VuZXJpY3MJCUdlbmVyaWMgc2V0dGluZ3MgYmxvY2sKKyAqIEB2IHJlZmNudAkJQ29udGFpbmluZyBvYmplY3QgcmVmZXJlbmNlIGNvdW50ZXIsIG9yIE5VTEwKKyAqIEB2IG5hbWUJCVNldHRpbmdzIGJsb2NrIG5hbWUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGdlbmVyaWNfc2V0dGluZ3NfaW5pdCAoIHN0cnVjdCBnZW5lcmljX3NldHRpbmdzICpnZW5lcmljcywKKwkJCQkJICAgc3RydWN0IHJlZmNudCAqcmVmY250LAorCQkJCQkgICBjb25zdCBjaGFyICpuYW1lICkgeworCXNldHRpbmdzX2luaXQgKCAmZ2VuZXJpY3MtPnNldHRpbmdzLCAmZ2VuZXJpY19zZXR0aW5nc19vcGVyYXRpb25zLAorCQkJcmVmY250LCBuYW1lLCAwICk7CisJSU5JVF9MSVNUX0hFQUQgKCAmZ2VuZXJpY3MtPmxpc3QgKTsKK30KKworLyoqCisgKiBEZWxldGUgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBkZWxldGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW5saW5lIGludCBkZWxldGVfc2V0dGluZyAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJICAgc3RydWN0IHNldHRpbmcgKnNldHRpbmcgKSB7CisJcmV0dXJuIHN0b3JlX3NldHRpbmcgKCBzZXR0aW5ncywgc2V0dGluZywgTlVMTCwgMCApOworfQorCisvKioKKyAqIEZldGNoIGFuZCBmb3JtYXQgdmFsdWUgb2Ygc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHYgdHlwZQkJU2V0dGluZ3MgdHlwZQorICogQHYgYnVmCQlCdWZmZXIgdG8gY29udGFpbiBmb3JtYXR0ZWQgdmFsdWUKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBmb3JtYXR0ZWQgdmFsdWUsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZldGNoZl9zZXR0aW5nICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCQkgICBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCQkgICBjaGFyICpidWYsIHNpemVfdCBsZW4gKSB7CisJcmV0dXJuIHNldHRpbmctPnR5cGUtPmZldGNoZiAoIHNldHRpbmdzLCBzZXR0aW5nLCBidWYsIGxlbiApOworfQorCisvKioKKyAqIERlbGV0ZSBuYW1lZCBzZXR0aW5nCisgKgorICogQHYgbmFtZQkJTmFtZSBvZiBzZXR0aW5nCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBpbnQgZGVsZXRlX25hbWVkX3NldHRpbmcgKCBjb25zdCBjaGFyICpuYW1lICkgeworCXJldHVybiBzdG9yZWZfbmFtZWRfc2V0dGluZyAoIG5hbWUsIE5VTEwgKTsKK30KKworLyoqCisgKiBDaGVjayBleGlzdGVuY2Ugb2Ygc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaywgb3IgTlVMTCB0byBzZWFyY2ggYWxsIGJsb2NrcworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBmZXRjaAorICogQHJldCBleGlzdHMJCVNldHRpbmcgZXhpc3RzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNldHRpbmdfZXhpc3RzICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCQkgICBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZyApIHsKKwlyZXR1cm4gKCBmZXRjaF9zZXR0aW5nX2xlbiAoIHNldHRpbmdzLCBzZXR0aW5nICkgPj0gMCApOworfQorCisjZW5kaWYgLyogX0dQWEVfU0VUVElOR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NldHRpbmdzX3VpLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc2V0dGluZ3NfdWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJkNzMzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NldHRpbmdzX3VpLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfR1BYRV9TRVRUSU5HU19VSV9ICisjZGVmaW5lIF9HUFhFX1NFVFRJTkdTX1VJX0gKKworLyoqIEBmaWxlCisgKgorICogT3B0aW9uIGNvbmZpZ3VyYXRpb24gY29uc29sZQorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBzZXR0aW5nczsKKworZXh0ZXJuIGludCBzZXR0aW5nc191aSAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MgKSBfX25vbm51bGw7CisKKyNlbmRpZiAvKiBfR1BYRV9TRVRUSU5HU19VSV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc2hhMS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NoYTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjAzZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NoYTEuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9HUFhFX1NIQTFfSAorI2RlZmluZSBfR1BYRV9TSEExX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSAiY3J5cHRvL2F4dGxzL2NyeXB0by5oIgorCitzdHJ1Y3QgZGlnZXN0X2FsZ29yaXRobTsKKworI2RlZmluZSBTSEExX0NUWF9TSVpFIHNpemVvZiAoIFNIQTFfQ1RYICkKKyNkZWZpbmUgU0hBMV9ESUdFU1RfU0laRSBTSEExX1NJWkUKKworZXh0ZXJuIHN0cnVjdCBkaWdlc3RfYWxnb3JpdGhtIHNoYTFfYWxnb3JpdGhtOworCisvKiBTSEExLXdyYXBwaW5nIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHNoYTFleHRyYS5jOiAqLworCit2b2lkIHByZl9zaGExICggY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgY29uc3QgY2hhciAqbGFiZWwsCisJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdm9pZCAqcHJmLCBzaXplX3QgcHJmX2xlbiApOworCit2b2lkIHBia2RmMl9zaGExICggY29uc3Qgdm9pZCAqcGFzc3BocmFzZSwgc2l6ZV90IHBhc3NfbGVuLAorCQkgICBjb25zdCB2b2lkICpzYWx0LCBzaXplX3Qgc2FsdF9sZW4sCisJCSAgIGludCBpdGVyYXRpb25zLCB2b2lkICprZXksIHNpemVfdCBrZXlfbGVuICk7CisKKyNlbmRpZiAvKiBfR1BYRV9TSEExX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zaGVsbC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NoZWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1YTM0NAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zaGVsbC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0dQWEVfU0hFTExfSAorI2RlZmluZSBfR1BYRV9TSEVMTF9ICisKKy8qKiBAZmlsZQorICoKKyAqIE1pbmltYWwgY29tbWFuZCBzaGVsbAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK2V4dGVybiB2b2lkIHNoZWxsICggdm9pZCApOworCisjZW5kaWYgLyogX0dQWEVfU0hFTExfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NoZWxsX2Jhbm5lci5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NoZWxsX2Jhbm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDgyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc2hlbGxfYmFubmVyLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfR1BYRV9TSEVMTF9CQU5ORVJfSAorI2RlZmluZSBfR1BYRV9TSEVMTF9CQU5ORVJfSAorCisvKiogQGZpbGUKKyAqCisgKiBTaGVsbCBzdGFydHVwIGJhbm5lcgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK2V4dGVybiBpbnQgc2hlbGxfYmFubmVyICggdm9pZCApOworCisjZW5kaWYgLyogX0dQWEVfU0hFTExfQkFOTkVSX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zbWJpb3MuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zbWJpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGYyNWMzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NtYmlvcy5oCkBAIC0wLDAgKzEsMTYxIEBACisjaWZuZGVmIF9HUFhFX1NNQklPU19ICisjZGVmaW5lIF9HUFhFX1NNQklPU19ICisKKy8qKiBAZmlsZQorICoKKyAqIFN5c3RlbSBNYW5hZ2VtZW50IEJJT1MKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9hcGkuaD4KKyNpbmNsdWRlIDxjb25maWcvZ2VuZXJhbC5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorCisvKioKKyAqIFByb3ZpZGUgYW4gU01CSU9TIEFQSSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEB2IF9wcmVmaXgJCVN1YnN5c3RlbSBwcmVmaXgKKyAqIEB2IF9hcGlfZnVuYwkJQVBJIGZ1bmN0aW9uCisgKiBAdiBfZnVuYwkJSW1wbGVtZW50aW5nIGZ1bmN0aW9uCisgKi8KKyNkZWZpbmUgUFJPVklERV9TTUJJT1MoIF9zdWJzeXMsIF9hcGlfZnVuYywgX2Z1bmMgKSBcCisJUFJPVklERV9TSU5HTEVfQVBJICggU01CSU9TX1BSRUZJWF8gIyMgX3N1YnN5cywgX2FwaV9mdW5jLCBfZnVuYyApCisKKy8qIEluY2x1ZGUgYWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBTTUJJT1MgQVBJIGhlYWRlcnMgKi8KKyNpbmNsdWRlIDxncHhlL2VmaS9lZmlfc21iaW9zLmg+CisKKy8qIEluY2x1ZGUgYWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgU01CSU9TIEFQSSBoZWFkZXJzICovCisjaW5jbHVkZSA8Yml0cy9zbWJpb3MuaD4KKworLyoqIFNpZ25hdHVyZSBmb3IgU01CSU9TIGVudHJ5IHBvaW50ICovCisjZGVmaW5lIFNNQklPU19TSUdOQVRVUkUgXAorICAgICAgICAoICggJ18nIDw8IDAgKSArICggJ1MnIDw8IDggKSArICggJ00nIDw8IDE2ICkgKyAoICdfJyA8PCAyNCApICkKKworLyoqCisgKiBTTUJJT1MgZW50cnkgcG9pbnQKKyAqCisgKiBUaGlzIGlzIHRoZSBzaW5nbGUgdGFibGUgd2hpY2ggZGVzY3JpYmVzIHRoZSBsaXN0IG9mIFNNQklPUworICogc3RydWN0dXJlcy4gIEl0IGlzIGxvY2F0ZWQgYnkgc2Nhbm5pbmcgdGhyb3VnaCB0aGUgQklPUyBzZWdtZW50LgorICovCitzdHJ1Y3Qgc21iaW9zX2VudHJ5IHsKKwkvKiogU2lnbmF0dXJlCisJICoKKwkgKiBNdXN0IGJlIGVxdWFsIHRvIFNNQklPU19TSUdOQVRVUkUKKwkgKi8KKwl1aW50MzJfdCBzaWduYXR1cmU7CisJLyoqIENoZWNrc3VtICovCisJdWludDhfdCBjaGVja3N1bTsKKwkvKiogTGVuZ3RoICovCisJdWludDhfdCBsZW47CisJLyoqIE1ham9yIHZlcnNpb24gKi8KKwl1aW50OF90IG1ham9yOworCS8qKiBNaW5vciB2ZXJzaW9uICovCisJdWludDhfdCBtaW5vcjsKKwkvKiogTWF4aW11bSBzdHJ1Y3R1cmUgc2l6ZSAqLworCXVpbnQxNl90IG1heDsKKwkvKiogRW50cnkgcG9pbnQgcmV2aXNpb24gKi8KKwl1aW50OF90IHJldmlzaW9uOworCS8qKiBGb3JtYXR0ZWQgYXJlYSAqLworCXVpbnQ4X3QgZm9ybWF0dGVkWzVdOworCS8qKiBETUkgU2lnbmF0dXJlICovCisJdWludDhfdCBkbWlfc2lnbmF0dXJlWzVdOworCS8qKiBETUkgY2hlY2tzdW0gKi8KKwl1aW50OF90IGRtaV9jaGVja3N1bTsKKwkvKiogU3RydWN0dXJlIHRhYmxlIGxlbmd0aCAqLworCXVpbnQxNl90IHNtYmlvc19sZW47CisJLyoqIFN0cnVjdHVyZSB0YWJsZSBhZGRyZXNzICovCisJdWludDMyX3Qgc21iaW9zX2FkZHJlc3M7CisJLyoqIE51bWJlciBvZiBTTUJJT1Mgc3RydWN0dXJlcyAqLworCXVpbnQxNl90IHNtYmlvc19jb3VudDsKKwkvKiogQkNEIHJldmlzaW9uICovCisJdWludDhfdCBiY2RfcmV2aXNpb247Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQW4gU01CSU9TIHN0cnVjdHVyZSBoZWFkZXIgKi8KK3N0cnVjdCBzbWJpb3NfaGVhZGVyIHsKKwkvKiogVHlwZSAqLworCXVpbnQ4X3QgdHlwZTsKKwkvKiogTGVuZ3RoICovCisJdWludDhfdCBsZW47CisJLyoqIEhhbmRsZSAqLworCXVpbnQxNl90IGhhbmRsZTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBTTUJJT1Mgc3RydWN0dXJlIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBzbWJpb3Nfc3RydWN0dXJlIHsKKwkvKiogQ29weSBvZiBTTUJJT1Mgc3RydWN0dXJlIGhlYWRlciAqLworCXN0cnVjdCBzbWJpb3NfaGVhZGVyIGhlYWRlcjsKKwkvKiogT2Zmc2V0IG9mIHN0cnVjdHVyZSB3aXRoaW4gU01CSU9TICovCisJc2l6ZV90IG9mZnNldDsKKwkvKiogTGVuZ3RoIG9mIHN0cmluZ3Mgc2VjdGlvbiAqLworCXNpemVfdCBzdHJpbmdzX2xlbjsKK307CisKKy8qKiBTTUJJT1Mgc3lzdGVtIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLworc3RydWN0IHNtYmlvc19zeXN0ZW1faW5mb3JtYXRpb24geworCS8qKiBTTUJJT1Mgc3RydWN0dXJlIGhlYWRlciAqLworCXN0cnVjdCBzbWJpb3NfaGVhZGVyIGhlYWRlcjsKKwkvKiogTWFudWZhY3R1cmVyIHN0cmluZyAqLworCXVpbnQ4X3QgbWFudWZhY3R1cmVyOworCS8qKiBQcm9kdWN0IHN0cmluZyAqLworCXVpbnQ4X3QgcHJvZHVjdDsKKwkvKiogVmVyc2lvbiBzdHJpbmcgKi8KKwl1aW50OF90IHZlcnNpb247CisJLyoqIFNlcmlhbCBudW1iZXIgc3RyaW5nICovCisJdWludDhfdCBzZXJpYWw7CisJLyoqIFVVSUQgKi8KKwl1aW50OF90IHV1aWRbMTZdOworCS8qKiBXYWtlLXVwIHR5cGUgKi8KKwl1aW50OF90IHdha2V1cDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBTTUJJT1Mgc3lzdGVtIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB0eXBlICovCisjZGVmaW5lIFNNQklPU19UWVBFX1NZU1RFTV9JTkZPUk1BVElPTiAxCisKKy8qKiBTTUJJT1MgZW5jbG9zdXJlIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLworc3RydWN0IHNtYmlvc19lbmNsb3N1cmVfaW5mb3JtYXRpb24geworCS8qKiBTTUJJT1Mgc3RydWN0dXJlIGhlYWRlciAqLworCXN0cnVjdCBzbWJpb3NfaGVhZGVyIGhlYWRlcjsKKwkvKiogTWFudWZhY3R1cmVyIHN0cmluZyAqLworCXVpbnQ4X3QgbWFudWZhY3R1cmVyOworCS8qKiBUeXBlIHN0cmluZyAqLworCXVpbnQ4X3QgdHlwZTsKKwkvKiogVmVyc2lvbiBzdHJpbmcgKi8KKwl1aW50OF90IHZlcnNpb247CisJLyoqIFNlcmlhbCBudW1iZXIgc3RyaW5nICovCisJdWludDhfdCBzZXJpYWw7CisJLyoqIEFzc2V0IHRhZyAqLworCXVpbnQ4X3QgYXNzZXRfdGFnOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFNNQklPUyBlbmNsb3N1cmUgaW5mb3JtYXRpb24gc3RydWN0dXJlIHR5cGUgKi8KKyNkZWZpbmUgU01CSU9TX1RZUEVfRU5DTE9TVVJFX0lORk9STUFUSU9OIDMKKworLyoqCisgKiBTTUJJT1MgZW50cnkgcG9pbnQgZGVzY3JpcHRvcgorICoKKyAqIFRoaXMgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIFNNQklPUyBlbnRyeSBwb2ludCB0aGF0IHdlCisgKiBjYXJlIGFib3V0LgorICovCitzdHJ1Y3Qgc21iaW9zIHsKKwkvKiogU3RhcnQgb2YgU01CSU9TIHN0cnVjdHVyZXMgKi8KKwl1c2VycHRyX3QgYWRkcmVzczsKKwkvKiogTGVuZ3RoIG9mIFNNQklPUyBzdHJ1Y3R1cmVzICovCisJc2l6ZV90IGxlbjsKKwkvKiogTnVtYmVyIG9mIFNNQklPUyBzdHJ1Y3R1cmVzICovCisJdW5zaWduZWQgaW50IGNvdW50OworfTsKKworZXh0ZXJuIGludCBmaW5kX3NtYmlvcyAoIHN0cnVjdCBzbWJpb3MgKnNtYmlvcyApOworZXh0ZXJuIGludCBmaW5kX3NtYmlvc19zdHJ1Y3R1cmUgKCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCQkgICBzdHJ1Y3Qgc21iaW9zX3N0cnVjdHVyZSAqc3RydWN0dXJlICk7CitleHRlcm4gaW50IHJlYWRfc21iaW9zX3N0cnVjdHVyZSAoIHN0cnVjdCBzbWJpb3Nfc3RydWN0dXJlICpzdHJ1Y3R1cmUsCisJCQkJICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApOworZXh0ZXJuIGludCByZWFkX3NtYmlvc19zdHJpbmcgKCBzdHJ1Y3Qgc21iaW9zX3N0cnVjdHVyZSAqc3RydWN0dXJlLAorCQkJCXVuc2lnbmVkIGludCBpbmRleCwKKwkJCQl2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7CisKKyNlbmRpZiAvKiBfR1BYRV9TTUJJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NvY2tldC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTBkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvc29ja2V0LmgKQEAgLTAsMCArMSwxMDEgQEAKKyNpZm5kZWYgX0dQWEVfU09DS0VUX0gKKyNkZWZpbmUgX0dQWEVfU09DS0VUX0gKKworLyoqIEBmaWxlCisgKgorICogU29ja2V0IGFkZHJlc3NlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgY29tbXR5cGVzIENvbW11bmljYXRpb24gc2VtYW50aWNzCisgKgorICogQHsKKyAqLworCisvKiogQ29ubmVjdGlvbi1iYXNlZCwgcmVsaWFibGUgc3RyZWFtcyAqLworZXh0ZXJuIGludCB0Y3Bfc29ja19zdHJlYW07CisjZGVmaW5lIFRDUF9TT0NLX1NUUkVBTSAweDEKKyNkZWZpbmUgU09DS19TVFJFQU0gdGNwX3NvY2tfc3RyZWFtCisKKy8qKiBDb25uZWN0aW9ubGVzcywgdW5yZWxpYWJsZSBzdHJlYW1zICovCitleHRlcm4gaW50IHVkcF9zb2NrX2RncmFtOworI2RlZmluZSBVRFBfU09DS19ER1JBTSAweDIKKyNkZWZpbmUgU09DS19ER1JBTSB1ZHBfc29ja19kZ3JhbQorCisvKiogQH0gKi8KKworLyoqCisgKiBOYW1lIGNvbW11bmljYXRpb24gc2VtYW50aWNzCisgKgorICogQHYgc2VtYW50aWNzCQlDb21tdW5pY2F0aW9uIHNlbWFudGljcyAoZS5nLiBTT0NLX1NUUkVBTSkKKyAqIEByZXQgbmFtZQkJTmFtZSBvZiBjb21tdW5pY2F0aW9uIHNlbWFudGljcworICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBjb25zdCBjaGFyICoKK3NvY2tldF9zZW1hbnRpY3NfbmFtZSAoIGludCBzZW1hbnRpY3MgKSB7CisJLyogQ2Fubm90IHVzZSBhIHN3aXRjaCgpIGJlY2F1c2Ugb2YgdGhlIHtUQ1BfVURQfV9TT0NLX1hYWCBoYWNrICovCisJaWYgKCBzZW1hbnRpY3MgPT0gU09DS19TVFJFQU0gKSB7CisJCXJldHVybiAiU09DS19TVFJFQU0iOworCX0gZWxzZSBpZiAoIHNlbWFudGljcyA9PSBTT0NLX0RHUkFNICkgeworCQlyZXR1cm4gIlNPQ0tfREdSQU0iOworCX0gZWxzZSB7CisJCXJldHVybiAiU09DS19VTktOT1dOIjsKKwl9Cit9CisKKy8qKgorICogQGRlZmdyb3VwIGFkZHJmYW0gQWRkcmVzcyBmYW1pbGllcworICoKKyAqIEB7CisgKi8KKyNkZWZpbmUgQUZfSU5FVAkJMQkvKio8IElQdjQgSW50ZXJuZXQgYWRkcmVzc2VzICovCisjZGVmaW5lIEFGX0lORVQ2CTIJLyoqPCBJUHY2IEludGVybmV0IGFkZHJlc3NlcyAqLworLyoqIEB9ICovCisKKy8qKgorICogTmFtZSBhZGRyZXNzIGZhbWlseQorICoKKyAqIEB2IGZhbWlseQkJQWRkcmVzcyBmYW1pbHkgKGUuZy4gQUZfSU5FVCkKKyAqIEByZXQgbmFtZQkJTmFtZSBvZiBhZGRyZXNzIGZhbWlseQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBjb25zdCBjaGFyICoKK3NvY2tldF9mYW1pbHlfbmFtZSAoIGludCBmYW1pbHkgKSB7CisJc3dpdGNoICggZmFtaWx5ICkgeworCWNhc2UgQUZfSU5FVDoJCXJldHVybiAiQUZfSU5FVCI7CisJY2FzZSBBRl9JTkVUNjoJCXJldHVybiAiQUZfSU5FVDYiOworCWRlZmF1bHQ6CQlyZXR1cm4gIkFGX1VOS05PV04iOworCX0KK30KKworLyoqIEEgc29ja2V0IGFkZHJlc3MgZmFtaWx5ICovCit0eXBlZGVmIHVpbnQxNl90IHNhX2ZhbWlseV90OworCisvKiogTGVuZ3RoIG9mIGEgQGMgc3RydWN0IEBjIHNvY2thZGRyICovCisjZGVmaW5lIFNBX0xFTiAzMgorCisvKioKKyAqIEdlbmVyYWxpemVkIHNvY2tldCBhZGRyZXNzIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgY29udGFpbnMgdGhlIGZpZWxkcyBjb21tb24gdG8gc29ja2V0IGFkZHJlc3NlcyBmb3IgYWxsIGFkZHJlc3MKKyAqIGZhbWlsaWVzLgorICovCitzdHJ1Y3Qgc29ja2FkZHIgeworCS8qKiBTb2NrZXQgYWRkcmVzcyBmYW1pbHkKKwkgKgorCSAqIFRoaXMgaXMgYW4gQUZfWFhYIGNvbnN0YW50LgorCSAqLworICAgICAgICBzYV9mYW1pbHlfdCBzYV9mYW1pbHk7CisJLyoqIFBhZGRpbmcKKwkgKgorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgc3RydWN0IEBjIHNvY2thZGRyX3RjcGlwIGlzIGxhcmdlCisJICogZW5vdWdoIHRvIGhvbGQgYSBzb2NrZXQgYWRkcmVzcyBmb3IgYW55IFRDUC9JUCBhZGRyZXNzCisJICogZmFtaWx5LgorCSAqLworCWNoYXIgcGFkWyBTQV9MRU4gLSBzaXplb2YgKCBzYV9mYW1pbHlfdCApIF07Cit9IF9fYXR0cmlidXRlX18gKCggbWF5X2FsaWFzICkpOworCisjZW5kaWYgLyogX0dQWEVfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zcGkuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRhNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NwaS5oCkBAIC0wLDAgKzEsMjU4IEBACisjaWZuZGVmIF9HUFhFX1NQSV9ICisjZGVmaW5lIF9HUFhFX1NQSV9ICisKKy8qKiBAZmlsZQorICoKKyAqIFNQSSBpbnRlcmZhY2UKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9udnMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgc3BpY21kcyBTUEkgY29tbWFuZHMKKyAqIEB7CisgKi8KKworLyoqIFdyaXRlIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBTUElfV1JTUiAweDAxCisKKy8qKiBXcml0ZSBkYXRhIHRvIG1lbW9yeSBhcnJheSAqLworI2RlZmluZSBTUElfV1JJVEUgMHgwMgorCisvKiogUmVhZCBkYXRhIGZyb20gbWVtb3J5IGFycmF5ICovCisjZGVmaW5lIFNQSV9SRUFEIDB4MDMKKworLyoqIFJlc2V0IHdyaXRlIGVuYWJsZSBsYXRjaCAqLworI2RlZmluZSBTUElfV1JESSAweDA0CisKKy8qKiBSZWFkIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBTUElfUkRTUiAweDA1CisKKy8qKiBTZXQgd3JpdGUgZW5hYmxlIGxhdGNoICovCisjZGVmaW5lIFNQSV9XUkVOIDB4MDYKKworLyoqCisgKiBAZGVmZ3JvdXAgYXRtZWxjbWRzIEF0bWVsLXNwZWNpZmljIFNQSSBjb21tYW5kcworICogQHsKKyAqLworCisvKiogRXJhc2Ugb25lIHNlY3RvciBpbiBtZW1vcnkgYXJyYXkgKE5vdCBzdXBwb3J0ZWQgb24gYWxsIGRldmljZXMpICovCisjZGVmaW5lIEFUTUVMX1NFQ1RPUl9FUkFTRSAweDUyCisKKy8qKiBFcmFzZSBhbGwgc2VjdGlvbnMgaW4gbWVtb3J5IGFycmF5IChOb3Qgc3VwcG9ydGVkIG9uIGFsbCBkZXZpY2VzKSAqLworI2RlZmluZSBBVE1FTF9DSElQX0VSQVNFIDB4NjIKKworLyoqIFJlYWQgbWFudWZhY3R1cmVyIGFuZCBwcm9kdWN0IElEIChOb3Qgc3VwcG9ydGVkIG9uIGFsbCBkZXZpY2VzKSAqLworI2RlZmluZSBBVE1FTF9SRElEIDB4MTUKKworLyoqIEB9ICovCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBzcGlzdGF0dXMgU1BJIHN0YXR1cyByZWdpc3RlciBiaXRzIChub3QgcHJlc2VudCBvbiBhbGwgZGV2aWNlcykKKyAqIEB7CisgKi8KKworLyoqIFdyaXRlLXByb3RlY3QgcGluIGVuYWJsZWQgKi8KKyNkZWZpbmUgU1BJX1NUQVRVU19XUEVOIDB4ODAKKworLyoqIEJsb2NrIHByb3RlY3Rpb24gYml0IDIgKi8KKyNkZWZpbmUgU1BJX1NUQVRVU19CUDIgMHgxMAorCisvKiogQmxvY2sgcHJvdGVjdGlvbiBiaXQgMSAqLworI2RlZmluZSBTUElfU1RBVFVTX0JQMSAweDA4CisKKy8qKiBCbG9jayBwcm90ZWN0aW9uIGJpdCAwICovCisjZGVmaW5lIFNQSV9TVEFUVVNfQlAwIDB4MDQKKworLyoqIFN0YXRlIG9mIHRoZSB3cml0ZSBlbmFibGUgbGF0Y2ggKi8KKyNkZWZpbmUgU1BJX1NUQVRVU19XRU4gMHgwMgorCisvKiogRGV2aWNlIGJ1c3kgZmxhZyAqLworI2RlZmluZSBTUElfU1RBVFVTX05SRFkgMHgwMQorCisvKiogQH0gKi8KKworLyoqCisgKiBBbiBTUEkgZGV2aWNlCisgKgorICogVGhpcyBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgcGh5c2ljYWwgU1BJIGRldmljZSBhdHRhY2hlZCB0byBhbgorICogU1BJIGJ1cy4KKyAqLworc3RydWN0IHNwaV9kZXZpY2UgeworCS8qKiBOVlMgZGV2aWNlICovCisJc3RydWN0IG52c19kZXZpY2UgbnZzOworCS8qKiBTUEkgYnVzIHRvIHdoaWNoIGRldmljZSBpcyBhdHRhY2hlZCAqLworCXN0cnVjdCBzcGlfYnVzICpidXM7CisJLyoqIFNsYXZlIG51bWJlciAqLworCXVuc2lnbmVkIGludCBzbGF2ZTsKKwkvKiogQ29tbWFuZCBsZW5ndGgsIGluIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQgY29tbWFuZF9sZW47CisJLyoqIEFkZHJlc3MgbGVuZ3RoLCBpbiBiaXRzICovCisJdW5zaWduZWQgaW50IGFkZHJlc3NfbGVuOworCS8qKiBBZGRyZXNzIGlzIG11bmdlZAorCSAqCisJICogU29tZSBkZXZpY2VzIHdpdGggOS1iaXQgYWRkcmVzc2VzIChlLmcuIEFUMjUwNDBBIEVFUFJPTSkKKwkgKiB1c2UgYml0IDMgb2YgdGhlIGNvbW1hbmQgYnl0ZSBhcyBhZGRyZXNzIGJpdCBBOCwgcmF0aGVyCisJICogdGhhbiBoYXZpbmcgYSB0d28tYnl0ZSBhZGRyZXNzLiAgSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlbgorCSAqIGNvbW1hbmRzIHNob3VsZCBiZSBtdW5nZWQgaW4gdGhpcyB3YXkuCisJICovCisJdW5zaWduZWQgaW50IG11bmdlX2FkZHJlc3MgOiAxOworfTsKKworLyoqCisgKiBTUEkgbWFnaWMgYXV0b2RldGVjdGlvbiBhZGRyZXNzIGxlbmd0aAorICoKKyAqIFNldCBAYyBzcGlfZGV2aWNlOjphZGRyZXNzX2xlbiB0byBAYyBTUElfQVVUT0RFVEVDVF9BRERSRVNTX0xFTiBpZgorICogdGhlIGFkZHJlc3MgbGVuZ3RoIHNob3VsZCBiZSBhdXRvZGV0ZWN0ZWQuCisgKi8KKyNkZWZpbmUgU1BJX0FVVE9ERVRFQ1RfQUREUkVTU19MRU4gMAorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBzdHJ1Y3Qgc3BpX2RldmljZSAqCitudnNfdG9fc3BpICggc3RydWN0IG52c19kZXZpY2UgKm52cyApIHsKKwlyZXR1cm4gY29udGFpbmVyX29mICggbnZzLCBzdHJ1Y3Qgc3BpX2RldmljZSwgbnZzICk7Cit9CisKKy8qKgorICogQW4gU1BJIGJ1cworICoKKyAqIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhbiBTUEkgYnVzIGNvbnRyb2xsZXIgY2FwYWJsZSBvZgorICogaXNzdWluZyBjb21tYW5kcyB0byBhdHRhY2hlZCBTUEkgZGV2aWNlcy4KKyAqLworc3RydWN0IHNwaV9idXMgeworCS8qKiBTUEkgaW50ZXJmYWNlIG1vZGUKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGJpdHdpc2UgT1Igb2YgemVybyBvciBtb3JlIG9mIEBjIFNQSV9NT0RFX0NQSEEKKwkgKiBhbmQgQGMgU1BJX01PREVfQ1BPTC4gIEl0IGlzIGFsc28gdGhlIG51bWJlciBjb252ZW50aW9uYWxseQorCSAqIHVzZWQgdG8gZGVzY3JpYmUgdGhlIFNQSSBpbnRlcmZhY2UgbW9kZS4gIEZvciBleGFtcGxlLCBTUEkKKwkgKiBtb2RlIDEgaXMgdGhlIG1vZGUgaW4gd2hpY2ggQ1BPTD0wIGFuZCBDUEhBPTEsIHdoaWNoCisJICogdGhlcmVmb3JlIGNvcnJlc3BvbmRzIHRvIGEgbW9kZSB2YWx1ZSBvZiAoMHxTUElfTU9ERV9DUEhBKQorCSAqIHdoaWNoLCBoYXBwaWx5LCBlcXVhbHMgMS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwkvKioKKwkgKiBSZWFkL3dyaXRlIGRhdGEgdmlhIFNQSSBidXMKKwkgKgorCSAqIEB2IGJ1cwkJU1BJIGJ1cworCSAqIEB2IGRldmljZQkJU1BJIGRldmljZQorCSAqIEB2IGNvbW1hbmQJCUNvbW1hbmQKKwkgKiBAdiBhZGRyZXNzCQlBZGRyZXNzIHRvIHJlYWQvd3JpdGUgKDwwIGZvciBubyBhZGRyZXNzKQorCSAqIEB2IGRhdGFfb3V0CQlUWCBkYXRhIGJ1ZmZlciAob3IgTlVMTCkKKwkgKiBAdiBkYXRhX2luCQlSWCBkYXRhIGJ1ZmZlciAob3IgTlVMTCkKKwkgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIGJ1ZmZlcihzKQorCSAqCisJICogVGhpcyBpc3N1ZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIGFuZCBvcHRpb25hbCBhZGRyZXNzIHRvCisJICogdGhlIFNQSSBkZXZpY2UsIHRoZW4gcmVhZHMgYW5kL29yIHdyaXRlcyBkYXRhIHRvL2Zyb20gdGhlCisJICogZGF0YSBidWZmZXJzLgorCSAqLworCWludCAoICogcncgKSAoIHN0cnVjdCBzcGlfYnVzICpidXMsIHN0cnVjdCBzcGlfZGV2aWNlICpkZXZpY2UsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZCwgaW50IGFkZHJlc3MsCisJCSAgICAgICBjb25zdCB2b2lkICpkYXRhX291dCwgdm9pZCAqZGF0YV9pbiwgc2l6ZV90IGxlbiApOworfTsKKworLyoqIENsb2NrIHBoYXNlIChDUEhBKSBtb2RlIGJpdAorICoKKyAqIFBoYXNlIDAgaXMgc2FtcGxlIG9uIHJpc2luZyBlZGdlLCBzaGlmdCBkYXRhIG9uIGZhbGxpbmcgZWRnZS4KKyAqCisgKiBQaGFzZSAxIGlzIHNoaWZ0IGRhdGEgb24gcmlzaW5nIGVkZ2UsIHNhbXBsZSBkYXRhIG9uIGZhbGxpbmcgZWRnZS4KKyAqLworI2RlZmluZSBTUElfTU9ERV9DUEhBIDB4MDEKKworLyoqIENsb2NrIHBvbGFyaXR5IChDUE9MKSBtb2RlIGJpdAorICoKKyAqIFRoaXMgYml0IHJlZmxlY3RzIHRoZSBpZGxlIHN0YXRlIG9mIHRoZSBjbG9jayBsaW5lIChTQ0xLKS4KKyAqLworI2RlZmluZSBTUElfTU9ERV9DUE9MIDB4MDIKKworLyoqIFNsYXZlIHNlbGVjdCBwb2xhcml0eSBtb2RlIGJpdAorICoKKyAqIFRoaXMgYml0IHJlZmxlY3RzIHRoYXQgYWN0aXZlIHN0YXRlIG9mIHRoZSBzbGF2ZSBzZWxlY3QgbGluZXMuICBJdAorICogaXMgbm90IHBhcnQgb2YgdGhlIG5vcm1hbCBTUEkgbW9kZSBudW1iZXIgKHdoaWNoIGNvdmVycyBvbmx5IEBjCisgKiBTUElfTU9ERV9DUE9MIGFuZCBAYyBTUElfTU9ERV9DUEhBKSwgYnV0IGlzIGluY2x1ZGVkIGhlcmUgZm9yCisgKiBjb252ZW5pZW5jZS4KKyAqLworI2RlZmluZSBTUElfTU9ERV9TU1BPTCAweDEwCisKKy8qKiBNaWNyb3dpcmUtY29tcGF0aWJsZSBtb2RlCisgKgorICogVGhpcyBpcyBTUEkgbW9kZSAxIChpLmUuIENQT0w9MCwgQ1BIQT0xKSwgYW5kIGlzIGNvbXBhdGlibGUgd2l0aAorICogdGhlIG9yaWdpbmFsIE1pY3Jvd2lyZSBwcm90b2NvbC4KKyAqLworI2RlZmluZSBTUElfTU9ERV9NSUNST1dJUkUgMQorCisvKiogTWljcm93aXJlL1BsdXMtY29tcGF0aWJsZSBtb2RlCisgKgorICogVGhpcyBpcyBTUEkgbW9kZSAwIChpLmUuIENQT0w9MCwgQ1BIQT0wKSwgYW5kIGlzIGNvbXBhdGlibGUgd2l0aAorICogdGhlIE1pY3Jvd2lyZS9QbHVzIHByb3RvY29sCisgKi8KKyNkZWZpbmUgU1BJX01PREVfTUlDUk9XSVJFX1BMVVMgMAorCisvKiogVGhyZWV3aXJlLWNvbXBhdGlibGUgbW9kZQorICoKKyAqIFRoaXMgbW9kZSBpcyBjb21wYXRpYmxlIHdpdGggQXRtZWwncyBzZXJpZXMgb2YgInRocmVlLXdpcmUiCisgKiBpbnRlcmZhY2VzLgorICovCisjZGVmaW5lIFNQSV9NT0RFX1RIUkVFV0lSRSAoIFNQSV9NT0RFX01JQ1JPV0lSRV9QTFVTIHwgU1BJX01PREVfU1NQT0wgKQorCitleHRlcm4gaW50IHNwaV9yZWFkICggc3RydWN0IG52c19kZXZpY2UgKm52cywgdW5zaWduZWQgaW50IGFkZHJlc3MsCisJCSAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKK2V4dGVybiBpbnQgc3BpX3dyaXRlICggc3RydWN0IG52c19kZXZpY2UgKm52cywgdW5zaWduZWQgaW50IGFkZHJlc3MsCisJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7CisKKy8qKgorICogQGRlZmdyb3VwIHNwaWRldnMgU1BJIGRldmljZSB0eXBlcworICogQHsKKyAqLworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitpbml0X3NwaSAoIHN0cnVjdCBzcGlfZGV2aWNlICpkZXZpY2UgKSB7CisJZGV2aWNlLT5udnMud29yZF9sZW5fbG9nMiA9IDA7CisJZGV2aWNlLT5jb21tYW5kX2xlbiA9IDgsCisJZGV2aWNlLT5udnMucmVhZCA9IHNwaV9yZWFkOworCWRldmljZS0+bnZzLndyaXRlID0gc3BpX3dyaXRlOwkKK30KKworLyoqIEF0bWVsIEFUMjVGMTAyNCBzZXJpYWwgZmxhc2ggKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK2luaXRfYXQyNWYxMDI0ICggc3RydWN0IHNwaV9kZXZpY2UgKmRldmljZSApIHsKKwlkZXZpY2UtPmFkZHJlc3NfbGVuID0gMjQ7CisJZGV2aWNlLT5udnMuc2l6ZSA9ICggMTI4ICogMTAyNCApOworCWRldmljZS0+bnZzLmJsb2NrX3NpemUgPSAyNTY7CisJaW5pdF9zcGkgKCBkZXZpY2UgKTsKK30KKworLyoqIEF0bWVsIDI1MDQwIHNlcmlhbCBFRVBST00gKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK2luaXRfYXQyNTA0MCAoIHN0cnVjdCBzcGlfZGV2aWNlICpkZXZpY2UgKSB7CisJZGV2aWNlLT5hZGRyZXNzX2xlbiA9IDg7CisJZGV2aWNlLT5tdW5nZV9hZGRyZXNzID0gMTsKKwlkZXZpY2UtPm52cy5zaXplID0gNTEyOworCWRldmljZS0+bnZzLmJsb2NrX3NpemUgPSA4OworCWluaXRfc3BpICggZGV2aWNlICk7Cit9CisKKy8qKiBTVCBNMjVQMzIgc2VyaWFsIGZsYXNoICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitpbml0X20yNXAzMiAoIHN0cnVjdCBzcGlfZGV2aWNlICpkZXZpY2UgKSB7CisJZGV2aWNlLT5hZGRyZXNzX2xlbiA9IDI0OworCWRldmljZS0+bnZzLnNpemUgPSAoIDQgKiAxMDI0ICogMTAyNCApOworCWRldmljZS0+bnZzLmJsb2NrX3NpemUgPSAyNTY7CisJaW5pdF9zcGkgKCBkZXZpY2UgKTsKK30KKworLyoqIE1pY3JvY2hpcCAyNVhYNjQwIHNlcmlhbCBFRVBST00gKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK2luaXRfbWMyNXh4NjQwICggc3RydWN0IHNwaV9kZXZpY2UgKmRldmljZSApIHsKKwlkZXZpY2UtPmFkZHJlc3NfbGVuID0gMTY7CisJZGV2aWNlLT5udnMuc2l6ZSA9ICggOCAqIDEwMjQgKTsKKwlkZXZpY2UtPm52cy5ibG9ja19zaXplID0gMzI7CisJaW5pdF9zcGkgKCBkZXZpY2UgKTsKK30KKworLyoqIEB9ICovCisKKyNlbmRpZiAvKiBfR1BYRV9TUElfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NwaV9iaXQuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zcGlfYml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkMjUxOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zcGlfYml0LmgKQEAgLTAsMCArMSw2MyBAQAorI2lmbmRlZiBfR1BYRV9TUElfQklUX0gKKyNkZWZpbmUgX0dQWEVfU1BJX0JJVF9ICisKKy8qKiBAZmlsZQorICoKKyAqIFNQSSBiaXQtYmFzaGluZyBpbnRlcmZhY2UKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9zcGkuaD4KKyNpbmNsdWRlIDxncHhlL2JpdGJhc2guaD4KKworLyoqIEEgYml0LWJhc2hpbmcgU1BJIGJ1cyAqLworc3RydWN0IHNwaV9iaXRfYmFzaGVyIHsKKwkvKiogU1BJIGJ1cyAqLworCXN0cnVjdCBzcGlfYnVzIGJ1czsKKwkvKiogQml0LWJhc2hpbmcgaW50ZXJmYWNlICovCisJc3RydWN0IGJpdF9iYXNoZXIgYmFzaGVyOworCS8qKiBFbmRpYW5uZXNzIG9mIGRhdGEKKwkgKgorCSAqIFNQSSBjb21tYW5kcyBhbmQgYWRkcmVzc2VzIGFyZSBhbHdheXMgYmlnLWVuZGlhbiAoaS5lLiBNU0IKKwkgKiB0cmFuc21pdHRlZCBmaXJzdCBvbiB0aGUgd2lyZSksIGJ1dCBzb21lIGNhcmRzCisJICogKGUuZy4gbmF0c2VtaSkgY2hvb3NlIHRvIHJlZ2FyZCB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlCisJICogRUVQUk9NIGFzIGxpdHRsZS1lbmRpYW4gKGkuZS4gTFNCIHRyYW5zbWl0dGVkIGZpcnN0IG9uIHRoZQorCSAqIHdpcmUpLgorCSAqLworCWludCBlbmRpYW5uZXNzOworfTsKKworLyoqIEJpdCBpbmRpY2VzIHVzZWQgZm9yIFNQSSBiaXQtYmFzaGluZyBpbnRlcmZhY2UgKi8KK2VudW0geworCS8qKiBTZXJpYWwgY2xvY2sgKi8KKwlTUElfQklUX1NDTEsgPSAwLAorCS8qKiBNYXN0ZXIgT3V0IFNsYXZlIEluICovCisJU1BJX0JJVF9NT1NJLAorCS8qKiBNYXN0ZXIgSW4gU2xhdmUgT3V0ICovCisJU1BJX0JJVF9NSVNPLAorCS8qKiBTbGF2ZSAwIHNlbGVjdCAqLworCVNQSV9CSVRfU1MwLAorfTsKKworLyoqCisgKiBEZXRlcm1pbmUgYml0IGluZGV4IGZvciBhIHBhcnRpY3VsYXIgc2xhdmUKKyAqCisgKiBAdiBzbGF2ZQkJU2xhdmUgbnVtYmVyCisgKiBAcmV0IGluZGV4CQlCaXQgaW5kZXggKGkuZS4gU1BJX0JJVF9TU04sIHdoZXJlIE49c2xhdmUpIAorICovCisjZGVmaW5lIFNQSV9CSVRfU1MoIHNsYXZlICkgKCBTUElfQklUX1NTMCArIChzbGF2ZSkgKQorCisvKiogRGVsYXkgYmV0d2VlbiBTQ0xLIHRyYW5zaXRpb25zICovCisjZGVmaW5lIFNQSV9CSVRfVURFTEFZIDEKKworLyoqIFNQSSBiaXQgYmFzaGVyIHRyZWF0cyBkYXRhIGFzIGJpZy1lbmRpYW4gKi8KKyNkZWZpbmUgU1BJX0JJVF9CSUdfRU5ESUFOIDAKKworLyoqIFNQSSBiaXQgYmFzaGVyIHRyZWF0cyBkYXRhIGFzIGxpdHRsZS1lbmRpYW4gKi8KKyNkZWZpbmUgU1BJX0JJVF9MSVRUTEVfRU5ESUFOIDEKKworZXh0ZXJuIHZvaWQgaW5pdF9zcGlfYml0X2Jhc2hlciAoIHN0cnVjdCBzcGlfYml0X2Jhc2hlciAqc3BpYml0ICk7CisKKyNlbmRpZiAvKiBfR1BYRV9TUElfQklUX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zcnAuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS9zcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWYzOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3NycC5oCkBAIC0wLDAgKzEsODY4IEBACisjaWZuZGVmIF9HUFhFX1NSUF9ICisjZGVmaW5lIF9HUFhFX1NSUF9ICisKKy8qKiBAZmlsZQorICoKKyAqIFNDU0kgUkRNQSBQcm90b2NvbAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBCU0QyICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKyNpbmNsdWRlIDxncHhlL3Njc2kuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29tbW9uIGZpZWxkcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBBbiBTUlAgaW5mb3JtYXRpb24gdW5pdCB0YWcgKi8KK3N0cnVjdCBzcnBfdGFnIHsKKwl1aW50MzJfdCBkd29yZHNbMl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQW4gU1JQIHBvcnQgSUQgKi8KK3N0cnVjdCBzcnBfcG9ydF9pZCB7CisJdWludDhfdCBieXRlc1sxNl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQW4gU1JQIHBvcnQgSUQgcGFpciAqLworc3RydWN0IHNycF9wb3J0X2lkcyB7CisJLyoqIEluaXRpYXRvciBwb3J0IElEICovCisJc3RydWN0IHNycF9wb3J0X2lkIGluaXRpYXRvcjsKKwkvKiogVGFyZ2V0IHBvcnQgSUQgKi8KKwlzdHJ1Y3Qgc3JwX3BvcnRfaWQgdGFyZ2V0OworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFNSUCBpbmZvcm1hdGlvbiB1bml0IGNvbW1vbiBmaWVsZHMgKi8KK3N0cnVjdCBzcnBfY29tbW9uIHsKKwkvKiogSW5mb3JtYXRpb24gdW5pdCB0eXBlICovCisJdWludDhfdCB0eXBlOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQwWzddOworCS8qKiBUYWcgKi8KKwlzdHJ1Y3Qgc3JwX3RhZyB0YWc7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBMb2dpbiByZXF1ZXN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIEFuIFNSUCBsb2dpbiByZXF1ZXN0IGluZm9ybWF0aW9uIHVuaXQgKi8KK3N0cnVjdCBzcnBfbG9naW5fcmVxIHsKKwkvKiogSW5mb3JtYXRpb24gdW5pdCB0eXBlCisJICoKKwkgKiBUaGlzIG11c3QgYmUgQGMgU1JQX0xPR0lOX1JFUQorCSAqLworCXVpbnQ4X3QgdHlwZTsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMFs3XTsKKwkvKiogVGFnICovCisJc3RydWN0IHNycF90YWcgdGFnOworCS8qKiBSZXF1ZXN0ZWQgbWF4aW11bSBpbml0aWF0b3IgdG8gdGFyZ2V0IElVIGxlbmd0aCAqLworCXVpbnQzMl90IG1heF9pX3RfaXVfbGVuOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQxWzRdOworCS8qKiBSZXF1aXJlZCBidWZmZXIgZm9ybWF0cworCSAqCisJICogVGhpcyBpcyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IgbW9yZSBAYworCSAqIFNSUF9MT0dJTl9SRVFfRk1UX1hYWCBjb25zdGFudHMuCisJICovCisJdWludDE2X3QgcmVxdWlyZWRfYnVmZmVyX2Zvcm1hdHM7CisJLyoqIEZsYWdzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBiaXR3aXNlIE9SIG9mIHplcm8gb3IgbW9yZSBAYworCSAqIFNSUF9MT0dJTl9SRVFfRkxBR19YWFggYW5kIEBjIFNSUF9MT0dJTl9SRVFfTUNBX1hYWAorCSAqIGNvbnN0YW50cy4KKwkgKi8KKwl1aW50OF90IGZsYWdzOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQyWzVdOworCS8qKiBJbml0aWF0b3IgYW5kIHRhcmdldCBwb3J0IGlkZW50aWZpZXJzICovCisJc3RydWN0IHNycF9wb3J0X2lkcyBwb3J0X2lkczsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBUeXBlIG9mIGFuIFNSUCBsb2dpbiByZXF1ZXN0ICovCisjZGVmaW5lIFNSUF9MT0dJTl9SRVEgMHgwMAorCisvKiogUmVxdWlyZSBpbmRpcmVjdCBkYXRhIGJ1ZmZlciBkZXNjcmlwdG9yIGZvcm1hdCAqLworI2RlZmluZSBTUlBfTE9HSU5fUkVRX0ZNVF9JREJEIDB4MDQKKworLyoqIFJlcXVpcmUgZGlyZWN0IGRhdGEgYnVmZmVyIGRlc2NyaXB0b3IgZm9ybWF0ICovCisjZGVmaW5lIFNSUF9MT0dJTl9SRVFfRk1UX0REQkQgMHgwMgorCisvKiogVXNlIHNvbGljaXRlZCBub3RpZmljYXRpb24gZm9yIGFzeW5jaHJvbm91cyBldmVudHMgKi8KKyNkZWZpbmUgU1JQX0xPR0lOX1JFUV9GTEFHX0FFU09MTlQgMHg0MAorCisvKiogVXNlIHNvbGljaXRlZCBub3RpZmljYXRpb24gZm9yIGNyZWRpdCByZXF1ZXN0ICovCisjZGVmaW5lIFNSUF9MT0dJTl9SRVFfRkxBR19DUlNPTE5UIDB4MjAKKworLyoqIFVzZSBzb2xpY2l0ZWQgbm90aWZpY2F0aW9uIGZvciBsb2dvdXRzICovCisjZGVmaW5lIFNSUF9MT0dJTl9SRVFfRkxBR19MT1NPTE5UIDB4MTAKKworLyoqIE11bHRpLWNoYW5uZWwgYWN0aW9uIG1hc2sgKi8KKyNkZWZpbmUgU1JQX0xPR0lOX1JFUV9NQ0FfTUFTSyAweDAzCisKKy8qKiBTaW5nbGUgUkRNQSBjaGFubmVsIG9wZXJhdGlvbiAqLworI2RlZmluZSBTUlBfTE9HSU5fUkVRX01DQV9TSU5HTEVfQ0hBTk5FTCAweDAwCisKKy8qKiBNdWx0aXBsZSBpbmRlcGVuZGVudCBSRE1BIGNoYW5uZWwgb3BlcmF0aW9uICovCisjZGVmaW5lIFNSUF9MT0dJTl9SRVFfTUNBX01VTFRJUExFX0NIQU5ORUxTIDB4MDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTG9naW4gcmVzcG9uc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiogQW4gU1JQIGxvZ2luIHJlc3BvbnNlICovCitzdHJ1Y3Qgc3JwX2xvZ2luX3JzcCB7CisJLyoqIEluZm9ybWF0aW9uIHVuaXQgdHlwZQorCSAqCisJICogVGhpcyBtdXN0IGJlIEBjIFNSUF9MT0dJTl9SU1AKKwkgKi8KKwl1aW50OF90IHR5cGU7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZDBbM107CisJLyoqIFJlcXVlc3QgbGltaXQgZGVsdGEgKi8KKwl1aW50MzJfdCByZXF1ZXN0X2xpbWl0X2RlbHRhOworCS8qKiBUYWcgKi8KKwlzdHJ1Y3Qgc3JwX3RhZyB0YWc7CisJLyoqIE1heGltdW0gaW5pdGlhdG9yIHRvIHRhcmdldCBJVSBsZW5ndGggKi8KKwl1aW50MzJfdCBtYXhfaV90X2l1X2xlbjsKKwkvKiogTWF4aW11bSB0YXJnZXQgdG8gaW5pdGlhdG9yIElVIGxlbmd0aCAqLworCXVpbnQzMl90IG1heF90X2lfaXVfbGVuOworCS8qKiBTdXBwb3J0ZWQgYnVmZmVyIGZvcm1hdHMKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGJpdHdpc2UgT1Igb2Ygb25lIG9yIG1vcmUgQGMKKwkgKiBTUlBfTE9HSU5fUlNQX0ZNVF9YWFggY29uc3RhbnRzLgorCSAqLworCXVpbnQxNl90IHN1cHBvcnRlZF9idWZmZXJfZm9ybWF0czsKKwkvKiogRmxhZ3MKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGJpdHdpc2UgT1Igb2YgemVybyBvciBtb3JlIEBjCisJICogU1JQX0xPR0lOX1JTUF9GTEFHX1hYWCBhbmQgQGMgU1JQX0xPR0lOX1JTUF9NQ1JfWFhYCisJICogY29uc3RhbnRzLgorCSAqLworCXVpbnQ4X3QgZmxhZ3M7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZDFbMjVdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFR5cGUgb2YgYW4gU1JQIGxvZ2luIHJlc3BvbnNlICovCisjZGVmaW5lIFNSUF9MT0dJTl9SU1AgMHhjMAorCisvKiogSW5kaXJlY3QgZGF0YSBidWZmZXIgZGVzY3JpcHRvciBmb3JtYXQgc3VwcG9ydGVkICovCisjZGVmaW5lIFNSUF9MT0dJTl9SU1BfRk1UX0lEQkQgMHgwNAorCisvKiogRGlyZWN0IGRhdGEgYnVmZmVyIGRlc2NyaXB0b3IgZm9ybWF0IHN1cHBvcnRlZCAqLworI2RlZmluZSBTUlBfTE9HSU5fUlNQX0ZNVF9EREJEIDB4MDIKKworLyoqIFNvbGljaXRlZCBub3RpZmljYXRpb24gaXMgc3VwcG9ydGVkICovCisjZGVmaW5lIFNSUF9MT0dJTl9SU1BfRkxBR19TT0xOVFNVUCAweDEwCisKKy8qKiBNdWx0aS1jaGFubmVsIHJlc3VsdCBtYXNrICovCisjZGVmaW5lIFNSUF9MT0dJTl9SU1BfTUNSX01BU0sgMHgwMworCisvKiogTm8gZXhpc3RpbmcgUkRNQSBjaGFubmVscyB3ZXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBJX1QgbmV4dXMgKi8KKyNkZWZpbmUgU1JQX0xPR0lOX1JTUF9NQ1JfTk9fRVhJU1RJTkdfQ0hBTk5FTFMgMHgwMAorCisvKiogT25lIG9yIG1vcmUgZXhpc3RpbmcgUkRNQSBjaGFubmVscyB3ZXJlIHRlcm1pbmF0ZWQgKi8KKyNkZWZpbmUgU1JQX0xPR0lOX1JTUF9NQ1JfRVhJU1RJTkdfQ0hBTk5FTFNfVEVSTUlOQVRFRCAweDAxCisKKy8qKiBPbmUgb3IgbW9yZSBleGlzdGluZyBSRE1BIGNoYW5uZWxzIGNvbnRpbnVlIHRvIG9wZXJhdGUgaW5kZXBlbmRlbnRseSAqLworI2RlZmluZSBTUlBfTE9HSU5fUlNQX01DUl9FWElTVElOR19DSEFOTkVMU19DT05USU5VRSAweDAyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIExvZ2luIHJlamVjdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBBbiBTUlAgbG9naW4gcmVqZWN0aW9uICovCitzdHJ1Y3Qgc3JwX2xvZ2luX3JlaiB7CisJLyoqIEluZm9ybWF0aW9uIHVuaXQgdHlwZQorCSAqCisJICogVGhpcyBtdXN0IGJlIEBjIFNSUF9MT0dJTl9SRUoKKwkgKi8KKwl1aW50OF90IHR5cGU7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZDBbM107CisJLyoqIFJlYXNvbgorCSAqCisJICogVGhpcyBpcyBhIEBjIFNSUF9MT0dJTl9SRUpfUkVBU09OX1hYWCBjb25zdGFudC4KKwkgKi8KKwl1aW50MzJfdCByZWFzb247CisJLyoqIFRhZyAqLworCXN0cnVjdCBzcnBfdGFnIHRhZzsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMVs4XTsKKwkvKiogU3VwcG9ydGVkIGJ1ZmZlciBmb3JtYXRzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvciBtb3JlIEBjCisJICogU1JQX0xPR0lOX1JFSl9GTVRfWFhYIGNvbnN0YW50cy4KKwkgKi8KKwl1aW50MTZfdCBzdXBwb3J0ZWRfYnVmZmVyX2Zvcm1hdHM7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZDJbNl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogVHlwZSBvZiBhbiBTUlAgbG9naW4gcmVqZWN0aW9uICovCisjZGVmaW5lIFNSUF9MT0dJTl9SRUogMHhjMgorCisvKiogVW5hYmxlIHRvIGVzdGFibGlzaCBSRE1BIGNoYW5uZWwsIG5vIHJlYXNvbiBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgU1JQX0xPR0lOX1JFSl9SRUFTT05fVU5LTk9XTiAweDAwMDEwMDAwVUwKKworLyoqIEluc3VmZmljaWVudCBSRE1BIGNoYW5uZWwgcmVzb3VyY2VzICovCisjZGVmaW5lIFNSUF9MT0dJTl9SRUpfUkVBU09OX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgMHgwMDAxMDAwMVVMCisKKy8qKiBSZXF1ZXN0ZWQgbWF4aW11bSBpbml0aWF0b3IgdG8gdGFyZ2V0IElVIGxlbmd0aCB2YWx1ZSB0b28gbGFyZ2UgKi8KKyNkZWZpbmUgU1JQX0xPR0lOX1JFSl9SRUFTT05fQkFEX01BWF9JX1RfSVVfTEVOIDB4MDAwMTAwMDJVTAorCisvKiogVW5hYmxlIHRvIGFzc29jaWF0ZSBSRE1BIGNoYW5uZWwgd2l0aCBzcGVjaWZpZWQgSV9UIG5leHVzICovCisjZGVmaW5lIFNSUF9MT0dJTl9SRUpfUkVBU09OX0NBTk5PVF9BU1NPQ0lBVEUgMHgwMDAxMDAwM1VMCisKKy8qKiBPbmUgb3IgbW9yZSByZXF1ZXN0ZWQgZGF0YSBidWZmZXIgZGVzY3JpcHRvciBmb3JtYXRzIGFyZSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFNSUF9MT0dJTl9SRUpfUkVBU09OX1VOU1VQUE9SVEVEX0JVRkZFUl9GT1JNQVQgMHgwMDAxMDAwNFVMCisKKy8qKiBTUlAgdGFyZ2V0IHBvcnQgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBSRE1BIGNoYW5uZWxzIHBlciBJX1QgbmV4dXMgKi8KKyNkZWZpbmUgU1JQX0xPR0lOX1JFSl9SRUFTT05fTk9fTVVMVElQTEVfQ0hBTk5FTFMgMHgwMDAxMDAwNVVMCisKKy8qKiBSRE1BIGNoYW5uZWwgbGltaXQgcmVhY2hlZCBmb3IgdGhpcyBpbml0aWF0b3IgKi8KKyNkZWZpbmUgU1JQX0xPR0lOX1JFSl9SRUFTT05fTk9fTU9SRV9DSEFOTkVMUyAweDAwMDEwMDA2VUwKKworLyoqIEluZGlyZWN0IGRhdGEgYnVmZmVyIGRlc2NyaXB0b3IgZm9ybWF0IHN1cHBvcnRlZCAqLworI2RlZmluZSBTUlBfTE9HSU5fUkVKX0ZNVF9JREJEIDB4MDQKKworLyoqIERpcmVjdCBkYXRhIGJ1ZmZlciBkZXNjcmlwdG9yIGZvcm1hdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1JQX0xPR0lOX1JFSl9GTVRfRERCRCAweDAyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEluaXRpYXRvciBsb2dvdXQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiogQW4gU1JQIGluaXRpYXRvciBsb2dvdXQgcmVxdWVzdCAqLworc3RydWN0IHNycF9pX2xvZ291dCB7CisJLyoqIEluZm9ybWF0aW9uIHVuaXQgdHlwZQorCSAqCisJICogVGhpcyBtdXN0IGJlIEBjIFNSUF9JX0xPR09VVAorCSAqLworCXVpbnQ4X3QgdHlwZTsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMFs3XTsKKwkvKiogVGFnICovCisJc3RydWN0IHNycF90YWcgdGFnOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFR5cGUgb2YgYW4gU1JQIGluaXRpYXRvciBsb2dvdXQgcmVxdWVzdCAqLworI2RlZmluZSBTUlBfSV9MT0dPVVQgMHgwMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUYXJnZXQgbG9nb3V0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIEFuIFNSUCB0YXJnZXQgbG9nb3V0IHJlcXVlc3QgKi8KK3N0cnVjdCBzcnBfdF9sb2dvdXQgeworCS8qKiBJbmZvcm1hdGlvbiB1bml0IHR5cGUKKwkgKgorCSAqIFRoaXMgbXVzdCBiZSBAYyBTUlBfVF9MT0dPVVQKKwkgKi8KKwl1aW50OF90IHR5cGU7CisJLyoqIEZsYWdzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBiaXR3aXNlIE9SIG9mIHplcm8gb3IgbW9yZSBAYworCSAqIFNSUF9UX0xPR09VVF9GTEFHX1hYWCBjb25zdGFudHMuCisJICovCisJdWludDhfdCBmbGFnczsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMFsyXTsKKwkvKiogUmVhc29uCisJICoKKwkgKiBUaGlzIGlzIGEgQGMgU1JQX1RfTE9HT1VUX1JFQVNPTl9YWFggY29uc3RhbnQuCisJICovCisJdWludDMyX3QgcmVhc29uOworCS8qKiBUYWcgKi8KKwlzdHJ1Y3Qgc3JwX3RhZyB0YWc7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogVHlwZSBvZiBhbiBTUlAgdGFyZ2V0IGxvZ291dCByZXF1ZXN0ICovCisjZGVmaW5lIFNSUF9UX0xPR09VVCAweDgwCisKKy8qKiBUaGUgaW5pdGlhdG9yIHNwZWNpZmllZCBzb2xpY2l0ZWQgbm90aWZpY2F0aW9uIG9mIGxvZ291dHMgKi8KKyNkZWZpbmUgU1JQX1RfTE9HT1VUX0ZMQUdfU09MTlQgMHgwMQorCisvKiogTm8gcmVhc29uIHNwZWNpZmllZCAqLworI2RlZmluZSBTUlBfVF9MT0dPVVRfUkVBU09OX1VOS05PV04gMHgwMDAwMDAwMFVMCisKKy8qKiBJbmFjdGl2ZSBSRE1BIGNoYW5uZWwgKHJlY2xhaW1pbmcgcmVzb3VyY2VzKSAqLworI2RlZmluZSBTUlBfVF9MT0dPVVRfUkVBU09OX0lOQUNUSVZFIDB4MDAwMDAwMDFVTAorCisvKiogSW52YWxpZCBpbmZvcm1hdGlvbiB1bml0IHR5cGUgY29kZSByZWNlaXZlZCBieSBTUlAgdGFyZ2V0IHBvcnQgKi8KKyNkZWZpbmUgU1JQX1RfTE9HT1VUX1JFQVNPTl9JTlZBTElEX1RZUEUgMHgwMDAwMDAwMlVMCisKKy8qKiBTUlAgaW5pdGlhdG9yIHBvcnQgc2VudCByZXNwb25zZSB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCAqLworI2RlZmluZSBTUlBfVF9MT0dPVVRfUkVBU09OX1NQVVJJT1VTX1JFU1BPTlNFIDB4MDAwMDAwMDNVTAorCisvKiogUkRNQSBjaGFubmVsIGRpc2Nvbm5lY3RlZCBkdWUgdG8gbXVsdGktY2hhbm5lbCBhY3Rpb24gY29kZSBpbiBuZXcgbG9naW4gKi8KKyNkZWZpbmUgU1JQX1RfTE9HT1VUX1JFQVNPTl9NQ0EgMHgwMDAwMDAwNFVMCisKKy8qKiBVbnN1cHBwb3J0ZWQgZm9ybWF0IGNvZGUgdmFsdWUgc3BlY2lmaWVkIGluIGRhdGEtb3V0IGJ1ZmZlciBkZXNjcmlwdG9yICovCisjZGVmaW5lIFNSUF9UX0xPR09VVF9VTlNVUFBPUlRFRF9EQVRBX09VVF9GT1JNQVQgMHgwMDAwMDAwNVVMCisKKy8qKiBVbnN1cHBwb3J0ZWQgZm9ybWF0IGNvZGUgdmFsdWUgc3BlY2lmaWVkIGluIGRhdGEtaW4gYnVmZmVyIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgU1JQX1RfTE9HT1VUX1VOU1VQUE9SVEVEX0RBVEFfSU5fRk9STUFUIDB4MDAwMDAwMDZVTAorCisvKiogSW52YWxpZCBsZW5ndGggZm9yIElVIHR5cGUgKi8KKyNkZWZpbmUgU1JQX1RfTE9HT1VUX0lOVkFMSURfSVVfTEVOIDB4MDAwMDAwMDhVTAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUYXNrIG1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiogQW4gU1JQIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0ICovCitzdHJ1Y3Qgc3JwX3Rza19tZ210IHsKKwkvKiogSW5mb3JtYXRpb24gdW5pdCB0eXBlCisJICoKKwkgKiBUaGlzIG11c3QgYmUgQGMgU1JQX1RTS19NR01UCisJICovCisJdWludDhfdCB0eXBlOworCS8qKiBGbGFncworCSAqCisJICogVGhpcyBpcyB0aGUgYml0d2lzZSBPUiBvZiB6ZXJvIG9yIG1vcmUKKwkgKiBAYyBTUlBfVFNLX01HTVRfRkxBR19YWFggY29uc3RhbnRzLgorCSAqLworCXVpbnQ4X3QgZmxhZ3M7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZDBbNl07CisJLyoqIFRhZyAqLworCXN0cnVjdCBzcnBfdGFnIHRhZzsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMVs0XTsKKwkvKiogTG9naWNhbCB1bml0IG51bWJlciAqLworCXN0cnVjdCBzY3NpX2x1biBsdW47CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZDJbMl07CisJLyoqIFRhc2sgbWFuYWdlbWVudCBmdW5jdGlvbgorCSAqCisJICogVGhpcyBpcyBhIEBjIFNSUF9UQVNLX01HTVRfRlVOQ19YWFggY29uc3RhbnQKKwkgKi8KKwl1aW50OF90IGZ1bmN0aW9uOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQzWzFdOworCS8qKiBUYWcgb2YgdGFzayB0byBiZSBtYW5hZ2VkICovCisJc3RydWN0IHNycF90YWcgbWFuYWdlZF90YWc7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZDRbOF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogVHlwZSBvZiBhbiBTUlAgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QgKi8KKyNkZWZpbmUgU1JQX1RTS19NR01UIDB4MDEKKworLyoqIFVzZSBzb2xpY2l0ZWQgbm90aWZpY2F0aW9uIGZvciB1bnN1Y2Nlc3NmdWwgY29tcGxldGlvbnMgKi8KKyNkZWZpbmUgU1JQX1RTS19NR01UX0ZMQUdfVUNTT0xOVCAweDA0CisKKy8qKiBVc2Ugc29saWNpdGVkIG5vdGlmaWNhdGlvbiBmb3Igc3VjY2Vzc2Z1bCBjb21wbGV0aW9ucyAqLworI2RlZmluZSBTUlBfVFNLX01HTVRfRkxBR19TQ1NPTE5UIDB4MDIKKworLyoqIFRoZSB0YXNrIG1hbmFnZXIgc2hhbGwgcGVyZm9ybSBhbiBBQk9SVCBUQVNLIGZ1bmN0aW9uICovCisjZGVmaW5lIFNSUF9UU0tfTUdNVF9GVU5DX0FCT1JUX1RBU0sgMHgwMQorCisvKiogVGhlIHRhc2sgbWFuYWdlciBzaGFsbCBwZXJmb3JtIGFuIEFCT1JUIFRBU0sgU0VUIGZ1bmN0aW9uICovCisjZGVmaW5lIFNSUF9UU0tfTUdNVF9GVU5DX0FCT1JUX1RBU0tfU0VUIDB4MDIKKworLyoqIFRoZSB0YXNrIG1hbmFnZXIgc2hhbGwgcGVyZm9ybSBhIENMRUFSIFRBU0sgU0VUIGZ1bmN0aW9uICovCisjZGVmaW5lIFNSUF9UU0tfTUdNVF9GVU5DX0NMRUFSX1RBU0tfU0VUIDB4MDQKKworLyoqIFRoZSB0YXNrIG1hbmFnZXIgc2hhbGwgcGVyZm9ybSBhIExPR0lDQUwgVU5JVCBSRVNFVCBmdW5jdGlvbiAqLworI2RlZmluZSBTUlBfVFNLX01HTVRfRlVOQ19MT0dJQ0FMX1VOSVRfUkVTRVQgMHgwOAorCisvKiogVGhlIHRhc2sgbWFuYWdlciBzaGFsbCBwZXJmb3JtIGEgQ0xFQVIgQUNBIGZ1bmN0aW9uICovCisjZGVmaW5lIFNSUF9UU0tfTUdNVF9GVU5DX0NMRUFSX0FDQSAweDQwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNDU0kgY29tbWFuZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBBbiBTUlAgU0NTSSBjb21tYW5kICovCitzdHJ1Y3Qgc3JwX2NtZCB7CisJLyoqIEluZm9ybWF0aW9uIHVuaXQgdHlwZQorCSAqCisJICogVGhpcyBtdXN0IGJlIEBjIFNSUF9DTUQKKwkgKi8KKwl1aW50OF90IHR5cGU7CisJLyoqIEZsYWdzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBiaXR3aXNlIE9SIG9mIHplcm8gb3IgbW9yZSBAYyBTUlBfQ01EX0ZMQUdfWFhYCisJICogY29uc3RhbnRzLgorCSAqLworCXVpbnQ4X3QgZmxhZ3M7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZDBbM107CisJLyoqIERhdGEgYnVmZmVyIGRlc2NyaXB0b3IgZm9ybWF0cworCSAqCisJICogVGhpcyBpcyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgQGMgU1JQX0NNRF9ET19GTVRfWFhYIGFuZCBvbmUgQGMKKwkgKiBTUlBfQ01EX0RJX0ZNVF9YWFggY29uc3RhbnQuCisJICovCisJdWludDhfdCBkYXRhX2J1ZmZlcl9mb3JtYXRzOworCS8qKiBEYXRhLW91dCBidWZmZXIgZGVzY3JpcHRvciBjb3VudCAqLworCXVpbnQ4X3QgZGF0YV9vdXRfYnVmZmVyX2NvdW50OworCS8qKiBEYXRhLWluIGJ1ZmZlciBkZXNjcmlwdG9yIGNvdW50ICovCisJdWludDhfdCBkYXRhX2luX2J1ZmZlcl9jb3VudDsKKwkvKiogVGFnICovCisJc3RydWN0IHNycF90YWcgdGFnOworCS8qKiBSZXNlcnZlZCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQxWzRdOworCS8qKiBMb2dpY2FsIHVuaXQgbnVtYmVyICovCisJc3RydWN0IHNjc2lfbHVuIGx1bjsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMlsxXTsKKwkvKiogVGFzayBhdHRyaWJ1dGUKKwkgKgorCSAqIFRoaXMgaXMgYSBAYyBTUlBfQ01EX1RBU0tfQVRUUl9YWFggY29uc3RhbnQuCisJICovCisJdWludDhfdCB0YXNrX2F0dHI7CisJLyoqIFJlc2VydmVkICovCisJdWludDhfdCByZXNlcnZlZDNbMV07CisJLyoqIEFkZGl0aW9uYWwgQ0RCIGxlbmd0aCAqLworCXVpbnQ4X3QgYWRkaXRpb25hbF9jZGJfbGVuOworCS8qKiBDb21tYW5kIGRhdGEgYmxvY2sgKi8KKwl1bmlvbiBzY3NpX2NkYiBjZGI7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogVHlwZSBvZiBhbiBTUlAgU0NTSSBjb21tYW5kICovCisjZGVmaW5lIFNSUF9DTUQgMHgwMgorCisvKiogVXNlIHNvbGljaXRlZCBub3RpZmljYXRpb24gZm9yIHVuc3VjY2Vzc2Z1bCBjb21wbGV0aW9ucyAqLworI2RlZmluZSBTUlBfQ01EX0ZMQUdfVUNTT0xOVCAweDA0CisKKy8qKiBVc2Ugc29saWNpdGVkIG5vdGlmaWNhdGlvbiBmb3Igc3VjY2Vzc2Z1bCBjb21wbGV0aW9ucyAqLworI2RlZmluZSBTUlBfQ01EX0ZMQUdfU0NTT0xOVCAweDAyCisKKy8qKiBEYXRhLW91dCBidWZmZXIgZm9ybWF0IG1hc2sgKi8KKyNkZWZpbmUgU1JQX0NNRF9ET19GTVRfTUFTSyAweGYwCisKKy8qKiBEaXJlY3QgZGF0YS1vdXQgYnVmZmVyIGZvcm1hdCAqLworI2RlZmluZSBTUlBfQ01EX0RPX0ZNVF9ESVJFQ1QgMHgxMAorCisvKiogSW5kaXJlY3QgZGF0YS1vdXQgYnVmZmVyIGZvcm1hdCAqLworI2RlZmluZSBTUlBfQ01EX0RPX0ZNVF9JTkRJUkVDVCAweDIwCisKKy8qKiBEYXRhLWluIGJ1ZmZlciBmb3JtYXQgbWFzayAqLworI2RlZmluZSBTUlBfQ01EX0RJX0ZNVF9NQVNLIDB4MGYKKworLyoqIERpcmVjdCBkYXRhLWluIGJ1ZmZlciBmb3JtYXQgKi8KKyNkZWZpbmUgU1JQX0NNRF9ESV9GTVRfRElSRUNUIDB4MDEKKworLyoqIEluZGlyZWN0IGRhdGEtaW4gYnVmZmVyIGZvcm1hdCAqLworI2RlZmluZSBTUlBfQ01EX0RJX0ZNVF9JTkRJUkVDVCAweDAyCisKKy8qKiBVc2UgdGhlIHJ1bGVzIGZvciBhIHNpbXBsZSB0YXNrIGF0dHJpYnV0ZSAqLworI2RlZmluZSBTUlBfQ01EX1RBU0tfQVRUUl9TSU1QTEUgMHgwMAorCisvKiogVXNlIHRoZSBydWxlcyBmb3IgYSBoZWFkIG9mIHF1ZXVlIHRhc2sgYXR0cmlidXRlICovCisjZGVmaW5lIFNSUF9DTURfVEFTS19BVFRSX1FVRVVFX0hFQUQgMHgwMQorCisvKiogVXNlIHRoZSBydWxlcyBmb3IgYW4gb3JkZXJlZCB0YXNrIGF0dHJpYnV0ZSAqLworI2RlZmluZSBTUlBfQ01EX1RBU0tfQVRUUl9PUkRFUkVEIDB4MDIKKworLyoqIFVzZSB0aGUgcnVsZXMgZm9yIGFuIGF1dG9tYXRpYyBjb250aW5nZW50IGFsbGVnaWFuY2UgdGFzayBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgU1JQX0NNRF9UQVNLX0FUVFJfQVVUT01BVElDX0NPTlRJTkdFTlRfQUxMRUdJQU5DRSAweDA4CisKKy8qKiBBbiBTUlAgbWVtb3J5IGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBzcnBfbWVtb3J5X2Rlc2NyaXB0b3IgeworCS8qKiBWaXJ0dWFsIGFkZHJlc3MgKi8KKwl1aW50NjRfdCBhZGRyZXNzOworCS8qKiBNZW1vcnkgaGFuZGxlICovCisJdWludDMyX3QgaGFuZGxlOworCS8qKiBEYXRhIGxlbmd0aCAqLworCXVpbnQzMl90IGxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNDU0kgcmVzcG9uc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiogQW4gU1JQIFNDU0kgcmVzcG9uc2UgKi8KK3N0cnVjdCBzcnBfcnNwIHsKKwkvKiogSW5mb3JtYXRpb24gdW5pdCB0eXBlCisJICoKKwkgKiBUaGlzIG11c3QgYmUgQGMgU1JQX1JTUAorCSAqLworCXVpbnQ4X3QgdHlwZTsKKwkvKiogRmxhZ3MKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGJpdHdpc2UgT1Igb2YgemVybyBvciBtb3JlIEBjIFNSUF9SU1BfRkxBR19YWFgKKwkgKiBjb25zdGFudHMuCisJICovCisJdWludDhfdCBmbGFnczsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMFsyXTsKKwkvKiogUmVxdWVzdCBsaW1pdCBkZWx0YSAqLworCXVpbnQzMl90IHJlcXVlc3RfbGltaXRfZGVsdGE7CisJLyoqIFRhZyAqLworCXN0cnVjdCBzcnBfdGFnIHRhZzsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMVsyXTsKKwkvKiogVmFsaWQgZmllbGRzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBiaXR3aXNlIE9SIG9mIHplcm8gb3IgbW9yZSBAYyBTUlBfUlNQX1ZBTElEX1hYWAorCSAqIGNvbnN0YW50cy4KKwkgKi8KKwl1aW50OF90IHZhbGlkOworCS8qKiBTdGF0dXMKKwkgKgorCSAqIFRoaXMgaXMgdGhlIFNDU0kgc3RhdHVzIGNvZGUuCisJICovCisJdWludDhfdCBzdGF0dXM7CisJLyoqIERhdGEtb3V0IHJlc2lkdWFsIGNvdW50ICovCisJdWludDMyX3QgZGF0YV9vdXRfcmVzaWR1YWxfY291bnQ7CisJLyoqIERhdGEtaW4gcmVzaWR1YWwgY291bnQgKi8KKwl1aW50MzJfdCBkYXRhX2luX3Jlc2lkdWFsX2NvdW50OworCS8qKiBTZW5zZSBkYXRhIGxpc3QgbGVuZ3RoICovCisJdWludDMyX3Qgc2Vuc2VfZGF0YV9sZW47CisJLyoqIFJlc3BvbnNlIGRhdGEgbGlzdCBsZW5ndGggKi8KKwl1aW50MzJfdCByZXNwb25zZV9kYXRhX2xlbjsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBUeXBlIG9mIGFuIFNSUCBTQ1NJIHJlc3BvbnNlICovCisjZGVmaW5lIFNSUF9SU1AgMHhjMQorCisvKiogVGhlIGluaXRpYXRvciBzcGVjaWZpZWQgc29saWNpdGVkIG5vdGlmaWNhdGlvbiBvZiB0aGlzIHJlc3BvbnNlICovCisjZGVmaW5lIFNSUF9SU1BfRkxBR19TT0xOVCAweDAxCisKKy8qKiBEYXRhLWluIHJlc2lkdWFsIGNvdW50IGZpZWxkIGlzIHZhbGlkIGFuZCByZXByZXNlbnRzIGFuIHVuZGVyZmxvdyAqLworI2RlZmluZSBTUlBfUlNQX1ZBTElEX0RJVU5ERVIgMHgyMAorCisvKiogRGF0YS1pbiByZXNpZHVhbCBjb3VudCBmaWVsZCBpcyB2YWxpZCBhbmQgcmVwcmVzZW50cyBhbiBvdmVyZmxvdyAqLworI2RlZmluZSBTUlBfUlNQX1ZBTElEX0RJT1ZFUiAweDEwCisKKy8qKiBEYXRhLW91dCByZXNpZHVhbCBjb3VudCBmaWVsZCBpcyB2YWxpZCBhbmQgcmVwcmVzZW50cyBhbiB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgU1JQX1JTUF9WQUxJRF9ET1VOREVSIDB4MDgKKworLyoqIERhdGEtb3V0IHJlc2lkdWFsIGNvdW50IGZpZWxkIGlzIHZhbGlkIGFuZCByZXByZXNlbnRzIGFuIG92ZXJmbG93ICovCisjZGVmaW5lIFNSUF9SU1BfVkFMSURfRE9PVkVSIDB4MDQKKworLyoqIFNlbnNlIGRhdGEgbGlzdCBsZW5ndGggZmllbGQgaXMgdmFsaWQgKi8KKyNkZWZpbmUgU1JQX1JTUF9WQUxJRF9TTlNWQUxJRCAweDAyCisKKy8qKiBSZXNwb25zZSBkYXRhIGxpc3QgbGVuZ3RoIGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIFNSUF9SU1BfVkFMSURfUlNQVkFMSUQgMHgwMQorCisvKioKKyAqIEdldCByZXNwb25zZSBkYXRhIHBvcnRpb24gb2YgU0NTSSByZXNwb25zZQorICoKKyAqIEB2IHJzcAkJCVNDU0kgcmVzcG9uc2UKKyAqIEByZXQgcmVzcG9uc2VfZGF0YQkJUmVzcG9uc2UgZGF0YSwgb3IgTlVMTCBpZiBub3QgcHJlc2VudAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKiBzcnBfcnNwX3Jlc3BvbnNlX2RhdGEgKCBzdHJ1Y3Qgc3JwX3JzcCAqcnNwICkgeworCXJldHVybiAoICggcnNwLT52YWxpZCAmIFNSUF9SU1BfVkFMSURfUlNQVkFMSUQgKSA/CisJCSAoICggKCB2b2lkICogKSByc3AgKSArIHNpemVvZiAoICpyc3AgKSApIDogTlVMTCApOworfQorCisvKioKKyAqIEdldCBsZW5ndGggb2YgcmVzcG9uc2UgZGF0YSBwb3J0aW9uIG9mIFNDU0kgcmVzcG9uc2UKKyAqCisgKiBAdiByc3AJCQlTQ1NJIHJlc3BvbnNlCisgKiBAcmV0IHJlc3BvbnNlX2RhdGFfbGVuCVJlc3BvbnNlIGRhdGEgbGVuZ3RoCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHNycF9yc3BfcmVzcG9uc2VfZGF0YV9sZW4gKCBzdHJ1Y3Qgc3JwX3JzcCAqcnNwICkgeworCXJldHVybiAoICggcnNwLT52YWxpZCAmIFNSUF9SU1BfVkFMSURfUlNQVkFMSUQgKSA/CisJCSBudG9obCAoIHJzcC0+cmVzcG9uc2VfZGF0YV9sZW4gKSA6IDAgKTsKK30KKworLyoqCisgKiBHZXQgc2Vuc2UgZGF0YSBwb3J0aW9uIG9mIFNDU0kgcmVzcG9uc2UKKyAqCisgKiBAdiByc3AJCQlTQ1NJIHJlc3BvbnNlCisgKiBAcmV0IHNlbnNlX2RhdGEJCVNlbnNlIGRhdGEsIG9yIE5VTEwgaWYgbm90IHByZXNlbnQKKyAqLworc3RhdGljIGlubGluZSB2b2lkICogc3JwX3JzcF9zZW5zZV9kYXRhICggc3RydWN0IHNycF9yc3AgKnJzcCApIHsKKwlyZXR1cm4gKCAoIHJzcC0+dmFsaWQgJiBTUlBfUlNQX1ZBTElEX1NOU1ZBTElEICkgPworCQkgKCAoICggdm9pZCAqICkgcnNwICkgKyBzaXplb2YgKCAqcnNwICkgKworCQkgICBzcnBfcnNwX3Jlc3BvbnNlX2RhdGFfbGVuICggcnNwICkgKSA6IE5VTEwgKTsKK30KKworLyoqCisgKiBHZXQgbGVuZ3RoIG9mIHNlbnNlIGRhdGEgcG9ydGlvbiBvZiBTQ1NJIHJlc3BvbnNlCisgKgorICogQHYgcnNwCQkJU0NTSSByZXNwb25zZQorICogQHJldCBzZW5zZV9kYXRhX2xlbgkJU2Vuc2UgZGF0YSBsZW5ndGgKKyAqLworc3RhdGljIGlubGluZSBzaXplX3Qgc3JwX3JzcF9zZW5zZV9kYXRhX2xlbiAoIHN0cnVjdCBzcnBfcnNwICpyc3AgKSB7CisJcmV0dXJuICggKCByc3AtPnZhbGlkICYgU1JQX1JTUF9WQUxJRF9TTlNWQUxJRCApID8KKwkJIG50b2hsICggcnNwLT5zZW5zZV9kYXRhX2xlbiApIDogMCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDcmVkaXQgcmVxdWVzdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBBbiBTUlAgY3JlZGl0IHJlcXVlc3QgKi8KK3N0cnVjdCBzcnBfY3JlZF9yZXEgeworCS8qKiBJbmZvcm1hdGlvbiB1bml0IHR5cGUKKwkgKgorCSAqIFRoaXMgbXVzdCBiZSBAYyBTUlBfQ1JFRF9SRVEKKwkgKi8KKwl1aW50OF90IHR5cGU7CisJLyoqIEZsYWdzCisJICoKKwkgKiBUaGlzIGlzIHRoZSBiaXR3aXNlIE9SIG9mIHplcm8gb3IgbW9yZQorCSAqIEBjIFNSUF9DUkVEX1JFUV9GTEFHX1hYWCBjb25zdGFudHMuCisJICovCisJdWludDhfdCBmbGFnczsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMFsyXTsKKwkvKiogUmVxdWVzdCBsaW1pdCBkZWx0YSAqLworCXVpbnQzMl90IHJlcXVlc3RfbGltaXRfZGVsdGE7CisJLyoqIFRhZyAqLworCXN0cnVjdCBzcnBfdGFnIHRhZzsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBUeXBlIG9mIGFuIFNSUCBjcmVkaXQgcmVxdWVzdCAqLworI2RlZmluZSBTUlBfQ1JFRF9SRVEgMHg4MQorCisvKiogVGhlIGluaXRpYXRvciBzcGVjaWZpZWQgc29saWNpdGVkIG5vdGlmaWNhdGlvbiBvZiBjcmVkaXQgcmVxdWVzdHMgKi8KKyNkZWZpbmUgU1JQX0NSRURfUkVRX0ZMQUdfU09MTlQgMHgwMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDcmVkaXQgcmVzcG9uc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiogQW4gU1JQIGNyZWRpdCByZXNwb25zZSAqLworc3RydWN0IHNycF9jcmVkX3JzcCB7CisJLyoqIEluZm9ybWF0aW9uIHVuaXQgdHlwZQorCSAqCisJICogVGhpcyBtdXN0IGJlIEBjIFNSUF9DUkVEX1JTUAorCSAqLworCXVpbnQ4X3QgdHlwZTsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMFs3XTsKKwkvKiogVGFnICovCisJc3RydWN0IHNycF90YWcgdGFnOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFR5cGUgb2YgYW4gU1JQIGNyZWRpdCByZXNwb25zZSAqLworI2RlZmluZSBTUlBfQ1JFRF9SU1AgMHg0MQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBc3luY2hyb25vdXMgZXZlbnQgcmVxdWVzdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBBbiBTUlAgYXN5bmNocm9ub3VzIGV2ZW50IHJlcXVlc3QgKi8KK3N0cnVjdCBzcnBfYWVyX3JlcSB7CisJLyoqIEluZm9ybWF0aW9uIHVuaXQgdHlwZQorCSAqCisJICogVGhpcyBtdXN0IGJlIEBjIFNSUF9BRVJfUkVRCisJICovCisJdWludDhfdCB0eXBlOworCS8qKiBGbGFncworCSAqCisJICogVGhpcyBpcyB0aGUgYml0d2lzZSBPUiBvZiB6ZXJvIG9yIG1vcmUgQGMKKwkgKiBTUlBfQUVSX1JFUV9GTEFHX1hYWCBjb25zdGFudHMuCisJICovCisJdWludDhfdCBmbGFnczsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMFsyXTsKKwkvKiogUmVxdWVzdCBsaW1pdCBkZWx0YSAqLworCXVpbnQzMl90IHJlcXVlc3RfbGltaXRfZGVsdGE7CisJLyoqIFRhZyAqLworCXN0cnVjdCBzcnBfdGFnIHRhZzsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMVs0XTsKKwkvKiogTG9naWNhbCB1bml0IG51bWJlciAqLworCXN0cnVjdCBzY3NpX2x1biBsdW47CisJLyoqIFNlbnNlIGRhdGEgbGlzdCBsZW5ndGggKi8KKwl1aW50MzJfdCBzZW5zZV9kYXRhX2xlbjsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMls0XTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBUeXBlIG9mIGFuIFNSUCBhc3luY2hyb25vdXMgZXZlbnQgcmVxdWVzdCAqLworI2RlZmluZSBTUlBfQUVSX1JFUSAweDgyCisKKy8qKiBUaGUgaW5pdGlhdG9yIHNwZWNpZmllZCBzb2xpY2l0ZWQgbm90aWZpY2F0aW9uIG9mIGFzeW5jaHJvbm91cyBldmVudHMgKi8KKyNkZWZpbmUgU1JQX0FFUl9SRVFfRkxBR19TT0xOVCAweDAxCisKKy8qKgorICogR2V0IHNlbnNlIGRhdGEgcG9ydGlvbiBvZiBhc3luY2hyb25vdXMgZXZlbnQgcmVxdWVzdAorICoKKyAqIEB2IGFlcl9yZXEJCQlTUlAgYXN5bmNocm9ub3VzIGV2ZW50IHJlcXVlc3QKKyAqIEByZXQgc2Vuc2VfZGF0YQkJU2Vuc2UgZGF0YQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkICoKK3NycF9hZXJfcmVxX3NlbnNlX2RhdGEgKCBzdHJ1Y3Qgc3JwX2Flcl9yZXEgKmFlcl9yZXEgKSB7CisJcmV0dXJuICggKCAoIHZvaWQgKiApIGFlcl9yZXEgKSArIHNpemVvZiAoICphZXJfcmVxICkgKTsKK30KKworLyoqCisgKiBHZXQgbGVuZ3RoIG9mIHNlbnNlIGRhdGEgcG9ydGlvbiBvZiBhc3luY2hyb25vdXMgZXZlbnQgcmVxdWVzdAorICoKKyAqIEB2IGFlcl9yZXEJCQlTUlAgYXN5bmNocm9ub3VzIGV2ZW50IHJlcXVlc3QKKyAqIEByZXQgc2Vuc2VfZGF0YV9sZW4JCVNlbnNlIGRhdGEgbGVuZ3RoCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHNpemVfdAorc3JwX2Flcl9yZXFfc2Vuc2VfZGF0YV9sZW4gKCBzdHJ1Y3Qgc3JwX2Flcl9yZXEgKmFlcl9yZXEgKSB7CisJcmV0dXJuICggbnRvaGwgKCBhZXJfcmVxLT5zZW5zZV9kYXRhX2xlbiApICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFzeW5jaHJvbm91cyBldmVudCByZXNwb25zZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBBbiBTUlAgYXN5bmNocm9ub3VzIGV2ZW50IHJlc3BvbnNlICovCitzdHJ1Y3Qgc3JwX2Flcl9yc3AgeworCS8qKiBJbmZvcm1hdGlvbiB1bml0IHR5cGUKKwkgKgorCSAqIFRoaXMgbXVzdCBiZSBAYyBTUlBfQUVSX1JTUAorCSAqLworCXVpbnQ4X3QgdHlwZTsKKwkvKiogUmVzZXJ2ZWQgKi8KKwl1aW50OF90IHJlc2VydmVkMFs3XTsKKwkvKiogVGFnICovCisJc3RydWN0IHNycF90YWcgdGFnOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFR5cGUgb2YgYW4gU1JQIGFzeW5jaHJvbm91cyBldmVudCByZXNwb25zZSAqLworI2RlZmluZSBTUlBfQUVSX1JTUCAweDQyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEluZm9ybWF0aW9uIHVuaXRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIE1heGltdW0gbGVuZ3RoIG9mIGFueSBpbml0aWF0b3ItdG8tdGFyZ2V0IElVIHRoYXQgd2Ugd2lsbCBzZW5kCisgKgorICogVGhlIGxvbmdlc3QgSVUgaXMgYSBTUlBfQ01EIHdpdGggbm8gYWRkaXRpb25hbCBDREIgYW5kIHR3byBkaXJlY3QKKyAqIGRhdGEgYnVmZmVyIGRlc2NyaXB0b3JzLCB3aGljaCBjb21lcyB0byA4MCBieXRlcy4KKyAqLworI2RlZmluZSBTUlBfTUFYX0lfVF9JVV9MRU4gODAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU1JQIGRldmljZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0cnVjdCBzcnBfZGV2aWNlOworCisvKiogQW4gU1JQIHRyYW5zcG9ydCB0eXBlICovCitzdHJ1Y3Qgc3JwX3RyYW5zcG9ydF90eXBlIHsKKwkvKiogTGVuZ3RoIG9mIHRyYW5zcG9ydCBwcml2YXRlIGRhdGEgKi8KKwlzaXplX3QgcHJpdl9sZW47CisJLyoqIFBhcnNlIHJvb3QgcGF0aAorCSAqCisJICogQHYgc3JwCQlTUlAgZGV2aWNlCisJICogQHYgcm9vdF9wYXRoCQlSb290IHBhdGgKKwkgKiBAcmV0IAkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBwYXJzZV9yb290X3BhdGggKSAoIHN0cnVjdCBzcnBfZGV2aWNlICpzcnAsCisJCQkJICAgIGNvbnN0IGNoYXIgKnJvb3RfcGF0aCApOworCS8qKiBDb25uZWN0IFNSUCBzZXNzaW9uCisJICoKKwkgKiBAdiBzcnAJCVNSUCBkZXZpY2UKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBvcGVuIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKwkgKi8KKwlpbnQgKCAqIGNvbm5lY3QgKSAoIHN0cnVjdCBzcnBfZGV2aWNlICpzcnAgKTsKK307CisKKy8qKiBBbiBTUlAgZGV2aWNlICovCitzdHJ1Y3Qgc3JwX2RldmljZSB7CisJLyoqIFJlZmVyZW5jZSBjb3VudCAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCisJLyoqIEluaXRpYXRvciBhbmQgdGFyZ2V0IHBvcnQgSURzICovCisJc3RydWN0IHNycF9wb3J0X2lkcyBwb3J0X2lkczsKKwkvKiogTG9naWNhbCB1bml0IG51bWJlciAqLworCXN0cnVjdCBzY3NpX2x1biBsdW47CisJLyoqIE1lbW9yeSBoYW5kbGUgKi8KKwl1aW50MzJfdCBtZW1vcnlfaGFuZGxlOworCisJLyoqIEN1cnJlbnQgc3RhdGUKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGJpdHdpc2UtT1Igb2YgemVybyBvciBtb3JlIEBjIFNSUF9TVEFURV9YWFgKKwkgKiBmbGFncy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdGU7CisJLyoqIFJldHJ5IGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmV0cnlfY291bnQ7CisJLyoqIEN1cnJlbnQgU0NTSSBjb21tYW5kICovCisJc3RydWN0IHNjc2lfY29tbWFuZCAqY29tbWFuZDsKKworCS8qKiBVbmRlcmx5aW5nIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlICovCisJc3RydWN0IHhmZXJfaW50ZXJmYWNlIHNvY2tldDsKKworCS8qKiBUcmFuc3BvcnQgdHlwZSAqLworCXN0cnVjdCBzcnBfdHJhbnNwb3J0X3R5cGUgKnRyYW5zcG9ydDsKKwkvKiogVHJhbnNwb3J0IHByaXZhdGUgZGF0YSAqLworCWNoYXIgdHJhbnNwb3J0X3ByaXZbMF07Cit9OworCisvKioKKyAqIEdldCBTUlAgdHJhbnNwb3J0IHByaXZhdGUgZGF0YQorICoKKyAqIEB2IHNycAkJU1JQIGRldmljZQorICogQHJldCBwcml2CQlTUlAgdHJhbnNwb3J0IHByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkICoKK3NycF90cmFuc3BvcnRfcHJpdiAoIHN0cnVjdCBzcnBfZGV2aWNlICpzcnAgKSB7CisJcmV0dXJuICggKCB2b2lkICogKSBzcnAtPnRyYW5zcG9ydF9wcml2ICk7Cit9CisKKy8qKiBTUlAgc3RhdGUgZmxhZ3MgKi8KK2VudW0gc3JwX3N0YXRlIHsKKwkvKiogVW5kZXJseWluZyBzb2NrZXQgaXMgb3BlbiAqLworCVNSUF9TVEFURV9TT0NLRVRfT1BFTiA9IDB4MDAwMSwKKwkvKiogU2Vzc2lvbiBpcyBsb2dnZWQgaW4gKi8KKwlTUlBfU1RBVEVfTE9HR0VEX0lOID0gMHgwMDAyLAorfTsKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIFNSUCByZXRyeSBhdHRlbXB0cyAqLworI2RlZmluZSBTUlBfTUFYX1JFVFJJRVMgMworCitleHRlcm4gaW50IHNycF9hdHRhY2ggKCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2ksIGNvbnN0IGNoYXIgKnJvb3RfcGF0aCApOworZXh0ZXJuIHZvaWQgc3JwX2RldGFjaCAoIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSApOworCisjZW5kaWYgLyogX0dQWEVfU1JQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90YWJsZXMuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGZjZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3RhYmxlcy5oCkBAIC0wLDAgKzEsNDM0IEBACisjaWZuZGVmIF9HUFhFX1RBQkxFU19ICisjZGVmaW5lIF9HUFhFX1RBQkxFU19ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqIEBwYWdlIGlmZGVmX2hhcm1mdWwgI2lmZGVmIGNvbnNpZGVyZWQgaGFybWZ1bAorICoKKyAqIE92ZXJ1c2Ugb2YgQGMgI2lmZGVmIGhhcyBsb25nIGJlZW4gYSBwcm9ibGVtIGluIEV0aGVyYm9vdC4KKyAqIEV0aGVyYm9vdCBwcm92aWRlcyBhIHJpY2ggYXJyYXkgb2YgZmVhdHVyZXMsIGJ1dCBhbGwgdGhlc2UgZmVhdHVyZXMKKyAqIHRha2UgdXAgdmFsdWFibGUgc3BhY2UgaW4gYSBST00gaW1hZ2UuICBUaGUgdHJhZGl0aW9uYWwgc29sdXRpb24gdG8KKyAqIHRoaXMgcHJvYmxlbSBoYXMgYmVlbiBmb3IgZWFjaCBmZWF0dXJlIHRvIGhhdmUgaXRzIG93biBAYyAjaWZkZWYKKyAqIG9wdGlvbiwgYWxsb3dpbmcgdGhlIGZlYXR1cmUgdG8gYmUgY29tcGlsZWQgaW4gb25seSBpZiBkZXNpcmVkLgorICoKKyAqIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IGl0IGJlY29tZXMgaW1wb3NzaWJsZSB0byBjb21waWxlLCBsZXQKKyAqIGFsb25lIHRlc3QsIGFsbCBwb3NzaWJsZSB2ZXJzaW9ucyBvZiBFdGhlcmJvb3QuICBDb2RlIHRoYXQgaXMgbm90CisgKiB0eXBpY2FsbHkgdXNlZCB0ZW5kcyB0byBzdWZmZXIgZnJvbSBiaXQtcm90IG92ZXIgdGltZS4gIEl0IGJlY29tZXMKKyAqIGV4dHJlbWVseSBkaWZmaWN1bHQgdG8gcHJlZGljdCB3aGljaCBjb21iaW5hdGlvbnMgb2YgY29tcGlsZS10aW1lCisgKiBvcHRpb25zIHdpbGwgcmVzdWx0IGluIGNvZGUgdGhhdCBjYW4gZXZlbiBjb21waWxlIGFuZCBsaW5rCisgKiBjb3JyZWN0bHkuCisgKgorICogVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB3ZSBoYXZlIGFkb3B0ZWQgYSBuZXcgYXBwcm9hY2ggZnJvbQorICogRXRoZXJib290IDUuNSBvbndhcmRzLiAgQGMgI2lmZGVmIGlzIG5vdyAiY29uc2lkZXJlZCBoYXJtZnVsIiwgYW5kCisgKiBpdHMgdXNlIHNob3VsZCBiZSBtaW5pbWlzZWQuICBTZXBhcmF0ZSBmZWF0dXJlcyBzaG91bGQgYmUKKyAqIGltcGxlbWVudGVkIGluIHNlcGFyYXRlIEBjIC5jIGZpbGVzLCBhbmQgc2hvdWxkIFxiIGFsd2F5cyBiZQorICogY29tcGlsZWQgKGkuZS4gdGhleSBzaG91bGQgXGIgbm90IGJlIGd1YXJkZWQgd2l0aCBhIEBjICNpZmRlZiBAYworICogTVlfUEVUX0ZFQVRVUkUgc3RhdGVtZW50KS4gIEJ5IG1ha2luZyAoYWxtb3N0KSBhbGwgY29kZSBhbHdheXMKKyAqIGNvbXBpbGUsIHdlIGF2b2lkIHRoZSBwcm9ibGVtIG9mIGJpdC1yb3QgaW4gcmFyZWx5LXVzZWQgY29kZS4KKyAqCisgKiBUaGUgZmlsZSBjb25maWcuaCwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgQGMgbWFrZSBjb21tYW5kIGxpbmUsCisgKiBzcGVjaWZpZXMgdGhlIG9iamVjdHMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIGFueSBwYXJ0aWN1bGFyIGJ1aWxkCisgKiBvZiBFdGhlcmJvb3QuICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGF0IGNvbmZpZy5oIGluY2x1ZGVzIHRoZSBsaW5lCisgKgorICogQGNvZGUKKyAqCisgKiAgICNkZWZpbmUgQ09OU09MRV9TRVJJQUwKKyAqICAgI2RlZmluZSBET1dOTE9BRF9QUk9UT19URlRQCisgKgorICogQGVuZGNvZGUKKyAqCisgKiBXaGVuIGEgcGFydGljdWxhciBFdGhlcmJvb3QgaW1hZ2UgKGUuZy4gQGMgYmluL3J0bDgxMzkuemRzaykgaXMKKyAqIGJ1aWx0LCB0aGUgb3B0aW9ucyBzcGVjaWZpZWQgaW4gY29uZmlnLmggYXJlIHVzZWQgdG8gZHJhZyBpbiB0aGUKKyAqIHJlbGV2YW50IG9iamVjdHMgYXQgbGluay10aW1lLiAgRm9yIHRoZSBhYm92ZSBleGFtcGxlLCBzZXJpYWwubyBhbmQKKyAqIHRmdHAubyB3b3VsZCBiZSBsaW5rZWQgaW4uCisgKgorICogVGhlcmUgcmVtYWlucyBvbmUgcHJvYmxlbSB0byBzb2x2ZTogaG93IGRvIHRoZXNlIG9iamVjdHMgZ2V0IHVzZWQ/CisgKiBUcmFkaXRpb25hbGx5LCB3ZSBoYWQgY29kZSBzdWNoIGFzCisgKgorICogQGNvZGUKKyAqCisgKiAgICAjaWZkZWYgQ09OU09MRV9TRVJJQUwKKyAqICAgICAgc2VyaWFsX2luaXQoKTsKKyAqICAgICNlbmRpZgorICoKKyAqIEBlbmRjb2RlCisgKgorICogaW4gbWFpbi5jLCBidXQgdGhpcyByZWludHJvZHVjZXMgQGMgI2lmZGVmIGFuZCBzbyBpcyBhIEJhZCBJZGVhLgorICogV2UgY2Fubm90IHNpbXBseSByZW1vdmUgdGhlIEBjICNpZmRlZiBhbmQgbWFrZSBpdAorICoKKyAqIEBjb2RlCisgKgorICogICBzZXJpYWxfaW5pdCgpOworICoKKyAqIEBlbmRjb2RlCisgKgorICogYmVjYXVzZSB0aGVuIHNlcmlhbC5vIHdvdWxkIGVuZCB1cCBhbHdheXMgYmVpbmcgbGlua2VkIGluLgorICoKKyAqIFRoZSBzb2x1dGlvbiBpcyB0byB1c2UgQGxpbmsgdGFibGVzLmggbGlua2VyIHRhYmxlcyBAZW5kbGluay4KKyAqCisgKi8KKworLyoqIEBmaWxlCisgKgorICogTGlua2VyIHRhYmxlcworICoKKyAqIFJlYWQgQHJlZiBpZmRlZl9oYXJtZnVsIGZpcnN0IGZvciBzb21lIGJhY2tncm91bmQgb24gdGhlIG1vdGl2YXRpb24KKyAqIGZvciB1c2luZyBsaW5rZXIgdGFibGVzLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBtYWNyb3MgZm9yIGRlYWxpbmcgd2l0aCBsaW5rZXItZ2VuZXJhdGVkIHRhYmxlcworICogb2YgZml4ZWQtc2l6ZSBzeW1ib2xzLiAgV2UgbWFrZSBmYWlybHkgZXh0ZW5zaXZlIHVzZSBvZiB0aGVzZSBpbgorICogb3JkZXIgdG8gYXZvaWQgQGMgI2lmZGVmIHNwYWdoZXR0aSBhbmQvb3IgbGlua2VyIHN5bWJvbCBwb2xsdXRpb24uCisgKiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiBoYXZpbmcgY29kZSBzdWNoIGFzCisgKgorICogQGNvZGUKKyAqCisgKiAgICAjaWZkZWYgQ09OU09MRV9TRVJJQUwKKyAqICAgICAgc2VyaWFsX2luaXQoKTsKKyAqICAgICNlbmRpZgorICoKKyAqIEBlbmRjb2RlCisgKgorICogd2UgbWFrZSBzZXJpYWwuYyBnZW5lcmF0ZSBhbiBlbnRyeSBpbiB0aGUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24KKyAqIHRhYmxlLCBhbmQgdGhlbiBoYXZlIGEgZnVuY3Rpb24gY2FsbF9pbml0X2ZucygpIHRoYXQgc2ltcGx5IGNhbGxzCisgKiBhbGwgZnVuY3Rpb25zIHByZXNlbnQgaW4gdGhpcyB0YWJsZS4gIElmIGFuZCBvbmx5IGlmIHNlcmlhbC5vIGdldHMKKyAqIGxpbmtlZCBpbiwgdGhlbiBpdHMgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQuICBXZQorICogYXZvaWQgbGlua2VyIHN5bWJvbCBwb2xsdXRpb24gKGkuZS4gYWx3YXlzIGRyYWdnaW5nIGluIHNlcmlhbC5vCisgKiBqdXN0IGJlY2F1c2Ugb2YgYSBjYWxsIHRvIHNlcmlhbF9pbml0KCkpIGFuZCB3ZSBhbHNvIGF2b2lkIEBjCisgKiAjaWZkZWYgc3BhZ2hldHRpIChoYXZpbmcgdG8gY29uZGl0aW9uYWxpc2UgZXZlcnkgcmVmZXJlbmNlIHRvCisgKiBmdW5jdGlvbnMgaW4gc2VyaWFsLmMpLgorICoKKyAqIFRoZSBsaW5rZXIgc2NyaXB0IHRha2VzIGNhcmUgb2YgYXNzZW1ibGluZyB0aGUgdGFibGVzIGZvciB1cy4gIEFsbAorICogb3VyIHRhYmxlIHNlY3Rpb25zIGhhdmUgbmFtZXMgb2YgdGhlIGZvcm1hdCBAYyAudGJsLk5BTUUuTk4gd2hlcmUKKyAqIEBjIE5BTUUgZGVzaWduYXRlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGluIHRoZSB0YWJsZSAoZS5nLiBAYworICogaW5pdF9mbnMpIGFuZCBAYyBOTiBpcyBhIHR3by1kaWdpdCBkZWNpbWFsIG51bWJlciB1c2VkIHRvIGltcG9zZSBhbgorICogb3JkZXJpbmcgdXBvbiB0aGUgdGFibGVzIGlmIHJlcXVpcmVkLiAgQGMgTk49MDAgaXMgcmVzZXJ2ZWQgZm9yIHRoZQorICogc3ltYm9sIGluZGljYXRpbmcgInRhYmxlIHN0YXJ0IiwgYW5kIEBjIE5OPTk5IGlzIHJlc2VydmVkIGZvciB0aGUKKyAqIHN5bWJvbCBpbmRpY2F0aW5nICJ0YWJsZSBlbmQiLgorICoKKyAqIEFzIGFuIGV4YW1wbGUsIHN1cHBvc2UgdGhhdCB3ZSB3YW50IHRvIGNyZWF0ZSBhICJmcm9ibmljYXRvciIKKyAqIGZlYXR1cmUgZnJhbWV3b3JrLCBhbmQgYWxsb3cgZm9yIHNldmVyYWwgaW5kZXBlbmRlbnQgbW9kdWxlcyB0bworICogcHJvdmlkZSBmcm9ibmljYXRpbmcgc2VydmljZXMuICBUaGVuIHdlIHdvdWxkIGNyZWF0ZSBhIGZyb2IuaAorICogaGVhZGVyIGZpbGUgY29udGFpbmluZyBlLmcuCisgKgorICogQGNvZGUKKyAqCisgKiAgIHN0cnVjdCBmcm9ibmljYXRvciB7CisgKiAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvLyBOYW1lIG9mIHRoZSBmcm9ibmljYXRvcgorICoJdm9pZCAoICpmcm9iICkgKCB2b2lkICk7IAkvLyBUaGUgZnJvYm5pY2F0aW5nIGZ1bmN0aW9uIGl0c2VsZgorICogICB9OworICoKKyAqICAgI2RlZmluZSBGUk9CTklDQVRPUlMgX190YWJsZSAoIHN0cnVjdCBmcm9ibmljYXRvciwgImZyb2JuaWNhdG9ycyIgKQorICoKKyAqICAgI2RlZmluZSBfX2Zyb2JuaWNhdG9yIF9fdGFibGVfZW50cnkgKCBGUk9CTklDQVRPUlMsIDAxICkKKyAqCisgKiBAZW5kY29kZQorICoKKyAqIEFueSBtb2R1bGUgcHJvdmlkaW5nIGZyb2JuaWNhdGluZyBzZXJ2aWNlcyB3b3VsZCBsb29rIHNvbWV0aGluZworICogbGlrZQorICoKKyAqIEBjb2RlCisgKgorICogICAjaW5jbHVkZSAiZnJvYi5oIgorICoKKyAqICAgc3RhdGljIHZvaWQgbXlfZnJvYiAoIHZvaWQgKSB7CisgKgkvLyBEbyBteSBmcm9ibmljYXRpbmcKKyAqCS4uLgorICogICB9CisgKgorICogICBzdHJ1Y3QgZnJvYiBteV9mcm9ibmljYXRvciBfX2Zyb2JuaWNhdG9yID0geworICoJLm5hbWUgPSAibXlfZnJvYiIsCisgKgkuZnJvYiA9IG15X2Zyb2IsCisgKiAgIH07CisgKgorICogQGVuZGNvZGUKKyAqCisgKiBUaGUgY2VudHJhbCBmcm9ibmljYXRvciBjb2RlIChmcm9iLmMpIHdvdWxkIHVzZSB0aGUgZnJvYm5pY2F0aW5nCisgKiBtb2R1bGVzIGFzIGZvbGxvd3MKKyAqCisgKiBAY29kZQorICoKKyAqICAgI2luY2x1ZGUgImZyb2IuaCIKKyAqCisgKiAgIC8vIENhbGwgYWxsIGxpbmtlZC1pbiBmcm9ibmljYXRvcnMKKyAqICAgdm9pZCBmcm9iX2FsbCAoIHZvaWQgKSB7CisgKglzdHJ1Y3QgZnJvYiAqZnJvYjsKKyAqCisgKglmb3JfZWFjaF90YWJsZSAoIGZyb2IsIEZST0JOSUNBVE9SUyApIHsKKyAqICAgICAgICAgcHJpbnRmICggIkNhbGxpbmcgZnJvYm5pY2F0b3IgXCIlc1wiXG4iLCBmcm9iLT5uYW1lICk7CisgKgkgICBmcm9iLT5mcm9iICgpOworICoJfQorICogICB9CisgKgorICogQGVuZGNvZGUKKyAqCisgKiBTZWUgaW5pdC5oIGFuZCBpbml0LmMgZm9yIGEgcmVhbC1saWZlIGV4YW1wbGUuCisgKgorICovCisKKyNpZmRlZiBET1hZR0VOCisjZGVmaW5lIF9fYXR0cmlidXRlX18oIHggKQorI2VuZGlmCisKKy8qKgorICogRGVjbGFyZSBhIGxpbmtlciB0YWJsZQorICoKKyAqIEB2IHR5cGUJCURhdGEgdHlwZQorICogQHYgbmFtZQkJVGFibGUgbmFtZQorICogQHJldCB0YWJsZQkJTGlua2VyIHRhYmxlCisgKi8KKyNkZWZpbmUgX190YWJsZSggdHlwZSwgbmFtZSApICggdHlwZSwgbmFtZSApCisKKy8qKgorICogR2V0IGxpbmtlciB0YWJsZSBkYXRhIHR5cGUKKyAqCisgKiBAdiB0YWJsZQkJTGlua2VyIHRhYmxlCisgKiBAcmV0IHR5cGUJCURhdGEgdHlwZQorICovCisjZGVmaW5lIF9fdGFibGVfdHlwZSggdGFibGUgKSBfX3RhYmxlX2V4dHJhY3RfdHlwZSB0YWJsZQorI2RlZmluZSBfX3RhYmxlX2V4dHJhY3RfdHlwZSggdHlwZSwgbmFtZSApIHR5cGUKKworLyoqCisgKiBHZXQgbGlua2VyIHRhYmxlIG5hbWUKKyAqCisgKiBAdiB0YWJsZQkJTGlua2VyIHRhYmxlCisgKiBAcmV0IG5hbWUJCVRhYmxlIG5hbWUKKyAqLworI2RlZmluZSBfX3RhYmxlX25hbWUoIHRhYmxlICkgX190YWJsZV9leHRyYWN0X25hbWUgdGFibGUKKyNkZWZpbmUgX190YWJsZV9leHRyYWN0X25hbWUoIHR5cGUsIG5hbWUgKSBuYW1lCisKKy8qKgorICogR2V0IGxpbmtlciB0YWJsZSBzZWN0aW9uIG5hbWUKKyAqCisgKiBAdiB0YWJsZQkJTGlua2VyIHRhYmxlCisgKiBAdiBpZHgJCVN1Yi10YWJsZSBpbmRleAorICogQHJldCBzZWN0aW9uCQlTZWN0aW9uIG5hbWUKKyAqLworI2RlZmluZSBfX3RhYmxlX3NlY3Rpb24oIHRhYmxlLCBpZHggKSBcCisJIi50YmwuIiBfX3RhYmxlX25hbWUgKCB0YWJsZSApICIuIiBfX3RhYmxlX3N0ciAoIGlkeCApCisjZGVmaW5lIF9fdGFibGVfc3RyKCB4ICkgI3gKKworLyoqCisgKiBHZXQgbGlua2VyIHRhYmxlIGFsaWdubWVudAorICoKKyAqIEB2IHRhYmxlCQlMaW5rZXIgdGFibGUKKyAqIEByZXQgYWxpZ24JCUFsaWdubWVudAorICovCisjZGVmaW5lIF9fdGFibGVfYWxpZ25tZW50KCB0YWJsZSApIF9fYWxpZ25vZl9fICggX190YWJsZV90eXBlICggdGFibGUgKSApCisKKy8qKgorICogRGVjbGFyZSBhIGxpbmtlciB0YWJsZSBlbnRyeQorICoKKyAqIEB2IHRhYmxlCQlMaW5rZXIgdGFibGUKKyAqIEB2IGlkeAkJU3ViLXRhYmxlIGluZGV4CisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqCisgKiBAY29kZQorICoKKyAqICAgI2RlZmluZSBGUk9CTklDQVRPUlMgX190YWJsZSAoIHN0cnVjdCBmcm9ibmljYXRvciwgImZyb2JuaWNhdG9ycyIgKQorICoKKyAqICAgI2RlZmluZSBfX2Zyb2JuaWNhdG9yIF9fdGFibGVfZW50cnkgKCBGUk9CTklDQVRPUlMsIDAxICkKKyAqCisgKiAgIHN0cnVjdCBmcm9ibmljYXRvciBteV9mcm9iIF9fZnJvYm5pY2F0b3IgPSB7CisgKiAgICAgIC4uLgorICogICB9OworICoKKyAqIEBlbmRjb2RlCisgKi8KKyNkZWZpbmUgX190YWJsZV9lbnRyeSggdGFibGUsIGlkeCApCQkJCQlcCisJX19hdHRyaWJ1dGVfXyAoKCBfX3NlY3Rpb25fXyAoIF9fdGFibGVfc2VjdGlvbiAoIHRhYmxlLCBpZHggKSApLFwKKwkJCSBfX2FsaWduZWRfXyAoIF9fdGFibGVfYWxpZ25tZW50ICggdGFibGUgKSApICkpCisKKy8qKgorICogR2V0IHN0YXJ0IG9mIGxpbmtlciB0YWJsZSBlbnRyaWVzCisgKgorICogQHYgdGFibGUJCUxpbmtlciB0YWJsZQorICogQHYgaWR4CQlTdWItdGFibGUgaW5kZXgKKyAqIEByZXQgZW50cmllcwkJU3RhcnQgb2YgZW50cmllcworICovCisjZGVmaW5lIF9fdGFibGVfZW50cmllcyggdGFibGUsIGlkeCApICggewkJCQlcCisJc3RhdGljIF9fdGFibGVfdHlwZSAoIHRhYmxlICkgX190YWJsZV9lbnRyaWVzWzBdCQlcCisJCV9fdGFibGVfZW50cnkgKCB0YWJsZSwgaWR4ICk7IAkJCQlcCisJX190YWJsZV9lbnRyaWVzOyB9ICkKKworLyoqCisgKiBHZXQgc3RhcnQgb2YgbGlua2VyIHRhYmxlCisgKgorICogQHYgdGFibGUJCUxpbmtlciB0YWJsZQorICogQHJldCBzdGFydAkJU3RhcnQgb2YgbGlua2VyIHRhYmxlCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqCisgKiBAY29kZQorICoKKyAqICAgI2RlZmluZSBGUk9CTklDQVRPUlMgX190YWJsZSAoIHN0cnVjdCBmcm9ibmljYXRvciwgImZyb2JuaWNhdG9ycyIgKQorICoKKyAqICAgc3RydWN0IGZyb2JuaWNhdG9yICpmcm9icyA9IHRhYmxlX3N0YXJ0ICggRlJPQk5JQ0FUT1JTICk7CisgKgorICogQGVuZGNvZGUKKyAqLworI2RlZmluZSB0YWJsZV9zdGFydCggdGFibGUgKSBfX3RhYmxlX2VudHJpZXMgKCB0YWJsZSwgMDAgKQorCisvKioKKyAqIEdldCBlbmQgb2YgbGlua2VyIHRhYmxlCisgKgorICogQHYgdGFibGUJCUxpbmtlciB0YWJsZQorICogQHJldCBlbmQJCUVuZCBvZiBsaW5rZXIgdGFibGUKKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICoKKyAqIEBjb2RlCisgKgorICogICAjZGVmaW5lIEZST0JOSUNBVE9SUyBfX3RhYmxlICggc3RydWN0IGZyb2JuaWNhdG9yLCAiZnJvYm5pY2F0b3JzIiApCisgKgorICogICBzdHJ1Y3QgZnJvYm5pY2F0b3IgKmZyb2JzX2VuZCA9IHRhYmxlX2VuZCAoIEZST0JOSUNBVE9SUyApOworICoKKyAqIEBlbmRjb2RlCisgKi8KKyNkZWZpbmUgdGFibGVfZW5kKCB0YWJsZSApIF9fdGFibGVfZW50cmllcyAoIHRhYmxlLCA5OSApCisKKy8qKgorICogR2V0IG51bWJlciBvZiBlbnRyaWVzIGluIGxpbmtlciB0YWJsZQorICoKKyAqIEB2IHRhYmxlCQlMaW5rZXIgdGFibGUKKyAqIEByZXQgbnVtX2VudHJpZXMJTnVtYmVyIG9mIGVudHJpZXMgaW4gbGlua2VyIHRhYmxlCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqCisgKiBAY29kZQorICoKKyAqICAgI2RlZmluZSBGUk9CTklDQVRPUlMgX190YWJsZSAoIHN0cnVjdCBmcm9ibmljYXRvciwgImZyb2JuaWNhdG9ycyIgKQorICoKKyAqICAgdW5zaWduZWQgaW50IG51bV9mcm9icyA9IHRhYmxlX251bV9lbnRyaWVzICggRlJPQk5JQ0FUT1JTICk7CisgKgorICogQGVuZGNvZGUKKyAqCisgKi8KKyNkZWZpbmUgdGFibGVfbnVtX2VudHJpZXMoIHRhYmxlICkJCQkJCVwKKwkoICggdW5zaWduZWQgaW50ICkgKCB0YWJsZV9lbmQgKCB0YWJsZSApIC0JCQlcCisJCQkgICAgIHRhYmxlX3N0YXJ0ICggdGFibGUgKSApICkKKworLyoqCisgKiBJdGVyYXRlIHRocm91Z2ggYWxsIGVudHJpZXMgd2l0aGluIGEgbGlua2VyIHRhYmxlCisgKgorICogQHYgcG9pbnRlcgkJRW50cnkgcG9pbnRlcgorICogQHYgdGFibGUJCUxpbmtlciB0YWJsZQorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKgorICogQGNvZGUKKyAqCisgKiAgICNkZWZpbmUgRlJPQk5JQ0FUT1JTIF9fdGFibGUgKCBzdHJ1Y3QgZnJvYm5pY2F0b3IsICJmcm9ibmljYXRvcnMiICkKKyAqCisgKiAgIHN0cnVjdCBmcm9ibmljYXRvciAqZnJvYjsKKyAqCisgKiAgIGZvcl9lYWNoX3RhYmxlX2VudHJ5ICggZnJvYiwgRlJPQk5JQ0FUT1JTICkgeworICogICAgIC4uLgorICogICB9CisgKgorICogQGVuZGNvZGUKKyAqCisgKi8KKyNkZWZpbmUgZm9yX2VhY2hfdGFibGVfZW50cnkoIHBvaW50ZXIsIHRhYmxlICkJCQkJXAorCWZvciAoIHBvaW50ZXIgPSB0YWJsZV9zdGFydCAoIHRhYmxlICkgOwkJCQlcCisJICAgICAgcG9pbnRlciA8IHRhYmxlX2VuZCAoIHRhYmxlICkgOwkJCQlcCisJICAgICAgcG9pbnRlcisrICkKKworLyoqCisgKiBJdGVyYXRlIHRocm91Z2ggYWxsIGVudHJpZXMgd2l0aGluIGEgbGlua2VyIHRhYmxlIGluIHJldmVyc2Ugb3JkZXIKKyAqCisgKiBAdiBwb2ludGVyCQlFbnRyeSBwb2ludGVyCisgKiBAdiB0YWJsZQkJTGlua2VyIHRhYmxlCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqCisgKiBAY29kZQorICoKKyAqICAgI2RlZmluZSBGUk9CTklDQVRPUlMgX190YWJsZSAoIHN0cnVjdCBmcm9ibmljYXRvciwgImZyb2JuaWNhdG9ycyIgKQorICoKKyAqICAgc3RydWN0IGZyb2JuaWNhdG9yICpmcm9iOworICoKKyAqICAgZm9yX2VhY2hfdGFibGVfZW50cnlfcmV2ZXJzZSAoIGZyb2IsIEZST0JOSUNBVE9SUyApIHsKKyAqICAgICAuLi4KKyAqICAgfQorICoKKyAqIEBlbmRjb2RlCisgKgorICovCisjZGVmaW5lIGZvcl9lYWNoX3RhYmxlX2VudHJ5X3JldmVyc2UoIHBvaW50ZXIsIHRhYmxlICkJCQlcCisJZm9yICggcG9pbnRlciA9ICggdGFibGVfZW5kICggdGFibGUgKSAtIDEgKSA7CQkJXAorCSAgICAgIHBvaW50ZXIgPj0gdGFibGVfc3RhcnQgKCB0YWJsZSApIDsJCQlcCisJICAgICAgcG9pbnRlci0tICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEludGVsJ3MgQyBjb21waWxlciBjaG9rZXMgb24gc2V2ZXJhbCBvZiB0aGUgY29uc3RydWN0cyB1c2VkIGluIHRoaXMKKyAqIGZpbGUuICBUaGUgd29ya2Fyb3VuZHMgYXJlIHVnbHksIHNvIHdlIHVzZSB0aGVtIG9ubHkgZm9yIGFuIGljYworICogYnVpbGQuCisgKgorICovCisjZGVmaW5lIElDQ19BTElHTl9IQUNLX0ZBQ1RPUiAxMjgKKyNpZmRlZiBfX0lDQworCisvKgorICogaWNjIG1pc2NvbXBpbGVzIHplcm8tbGVuZ3RoIGFycmF5cyBieSBpbnNlcnRpbmcgcGFkZGluZyB0byBhIGxlbmd0aAorICogb2YgdHdvIGFycmF5IGVsZW1lbnRzLiAgV2UgdGhlcmVmb3JlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlCisgKiBfX3RhYmxlX2VudHJpZXMoKSBzeW1ib2xzIGJ5IGhhbmQgaW4gYXNtLgorICoKKyAqLworI3VuZGVmIF9fdGFibGVfZW50cmllcworI2RlZmluZSBfX3RhYmxlX2VudHJpZXMoIHRhYmxlLCBpZHggKSAoIHsJCQkJXAorCWV4dGVybiBfX3RhYmxlX3R5cGUgKCB0YWJsZSApCQkJCQlcCisJCV9fdGFibGVfdGVtcF9zeW0gKCBpZHgsIF9fTElORV9fICkgW10JCQlcCisJCV9fdGFibGVfZW50cnkgKCB0YWJsZSwgaWR4ICkgCQkJCVwKKwkJYXNtICggX190YWJsZV9lbnRyaWVzX3N5bSAoIHRhYmxlLCBpZHggKSApOwkJXAorCV9fYXNtX18gKCAiLmlmbmRlZiAlYzBcblx0IgkJCQkJXAorCQkgICIuc2VjdGlvbiAiIF9fdGFibGVfc2VjdGlvbiAoIHRhYmxlLCBpZHggKSAiXG5cdCIJXAorCQkgICIuYWxpZ24gJWMxXG5cdCIJCQkJCVwKKwkgICAgICAgICAgIlxuJWMwOlxuXHQiCQkJCQkJXAorCQkgICIucHJldmlvdXNcblx0IiAJCQkJCVwKKwkJICAiLmVuZGlmXG5cdCIJCQkJCQlcCisJCSAgOiA6ICJpIiAoIF9fdGFibGVfdGVtcF9zeW0gKCBpZHgsIF9fTElORV9fICkgKSwJXAorCQkgICAgICAiaSIgKCBfX3RhYmxlX2FsaWdubWVudCAoIHRhYmxlICkgKSApOwkJXAorCV9fdGFibGVfdGVtcF9zeW0gKCBpZHgsIF9fTElORV9fICk7IH0gKQorI2RlZmluZSBfX3RhYmxlX2VudHJpZXNfc3ltKCB0YWJsZSwgaWR4ICkJCQkJXAorCSJfX3RibF8iIF9fdGFibGVfbmFtZSAoIHRhYmxlICkgIl8iICNpZHgKKyNkZWZpbmUgX190YWJsZV90ZW1wX3N5bSggYSwgYiApCQkJCQlcCisJX19fdGFibGVfdGVtcF9zeW0oIF9fdGFibGVfLCBhLCBfLCBiICkKKyNkZWZpbmUgX19fdGFibGVfdGVtcF9zeW0oIGEsIGIsIGMsIGQgKSBhICMjIGIgIyMgYyAjIyBkCisKKy8qCisgKiBpY2MgaWdub3JlcyBfX2F0dHJpYnV0ZV9fICgoIGFsaWduZWQgKHgpICkpIHdoZW4gaXQgaXMgdXNlZCB0bworICogZGVjcmVhc2UgdGhlIGNvbXBpbGVyJ3MgZGVmYXVsdCBjaG9pY2Ugb2YgYWxpZ25tZW50ICh3aGljaCBtYXkgYmUKKyAqIGhpZ2hlciB0aGFuIHRoZSBhbGlnbm1lbnQgYWN0dWFsbHkgcmVxdWlyZWQgYnkgdGhlIHN0cnVjdHVyZSkuICBXZQorICogd29yayBhcm91bmQgdGhpcyBieSBmb3JjaW5nIHRoZSBhbGlnbm1lbnQgdG8gYSBsYXJnZSBtdWx0aXBsZSBvZgorICogdGhlIHJlcXVpcmVkIHZhbHVlIChzbyB0aGF0IHdlIGFyZSBuZXZlciBhdHRlbXB0aW5nIHRvIGRlY3JlYXNlIHRoZQorICogZGVmYXVsdCBhbGlnbm1lbnQpIGFuZCB0aGVuIHBvc3Rwcm9jZXNzaW5nIHRoZSBvYmplY3QgZmlsZSB0bworICogcmVkdWNlIHRoZSBhbGlnbm1lbnQgYmFjayBkb3duIHRvIHRoZSAicmVhbCIgdmFsdWUuCisgKgorICovCisjdW5kZWYgX190YWJsZV9hbGlnbm1lbnQKKyNkZWZpbmUgX190YWJsZV9hbGlnbm1lbnQoIHRhYmxlICkgXAorCSggSUNDX0FMSUdOX0hBQ0tfRkFDVE9SICogX19hbGlnbm9mX18gKCBfX3RhYmxlX3R5cGUgKCB0YWJsZSApICkgKQorCisvKgorICogQmVjYXVzZSBvZiB0aGUgYWxpZ25tZW50IGhhY2ssIHdlIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNvbXBpbGVyCisgKiBuZXZlciB0cmllcyB0byBwbGFjZSBtdWx0aXBsZSBvYmplY3RzIHdpdGhpbiB0aGUgc2FtZSBzZWN0aW9uLAorICogb3RoZXJ3aXNlIHRoZSBhc3NlbWJsZXIgd2lsbCBpbnNlcnQgcGFkZGluZyB0byB0aGUgKGluY29ycmVjdCkKKyAqIGFsaWdubWVudCBib3VuZGFyeS4gIERvIHRoaXMgYnkgYXBwZW5kaW5nIHRoZSBsaW5lIG51bWJlciB0byB0YWJsZQorICogc2VjdGlvbiBuYW1lcy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBwYWRkaW5nIGJldHdlZW4gYXJyYXkKKyAqIGVsZW1lbnRzLCBzaW5jZSB0aGUgYWxpZ25tZW50IGlzIGRlY2xhcmVkIG9uIHRoZSB2YXJpYWJsZSAoaS5lLiB0aGUKKyAqIHdob2xlIGFycmF5KSByYXRoZXIgdGhhbiBvbiB0aGUgdHlwZSAoaS5lLiBvbiBhbGwgaW5kaXZpZHVhbCBhcnJheQorICogZWxlbWVudHMpLgorICovCisjdW5kZWYgX190YWJsZV9zZWN0aW9uCisjZGVmaW5lIF9fdGFibGVfc2VjdGlvbiggdGFibGUsIGlkeCApIFwKKwkiLnRibC4iIF9fdGFibGVfbmFtZSAoIHRhYmxlICkgIi4iIF9fdGFibGVfc3RyICggaWR4ICkgXAorCSIuIiBfX3RhYmxlX3hzdHIgKCBfX0xJTkVfXyApCisjZGVmaW5lIF9fdGFibGVfeHN0ciggeCApIF9fdGFibGVfc3RyICggeCApCisKKyNlbmRpZiAvKiBfX0lDQyAqLworCisjZW5kaWYgLyogX0dQWEVfVEFCTEVTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90Y3AuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90Y3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGMzOWZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3RjcC5oCkBAIC0wLDAgKzEsMzE4IEBACisjaWZuZGVmIF9HUFhFX1RDUF9ICisjZGVmaW5lIF9HUFhFX1RDUF9ICisKKy8qKiBAZmlsZQorICoKKyAqIFRDUCBwcm90b2NvbAorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBnUFhFIFRDUCBBUEkuCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvdGNwaXAuaD4KKworLyoqCisgKiBBIFRDUCBoZWFkZXIKKyAqLworc3RydWN0IHRjcF9oZWFkZXIgeworCXVpbnQxNl90IHNyYzsJCS8qIFNvdXJjZSBwb3J0ICovCisJdWludDE2X3QgZGVzdDsJCS8qIERlc3RpbmF0aW9uIHBvcnQgKi8KKwl1aW50MzJfdCBzZXE7CQkvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50MzJfdCBhY2s7CQkvKiBBY2tub3dsZWRnZW1lbnQgbnVtYmVyICovCisJdWludDhfdCBobGVuOwkJLyogSGVhZGVyIGxlbmd0aCAoNCksIFJlc2VydmVkICg0KSAqLworCXVpbnQ4X3QgZmxhZ3M7CQkvKiBSZXNlcnZlZCAoMiksIEZsYWdzICg2KSAqLworCXVpbnQxNl90IHdpbjsJCS8qIEFkdmVydGlzZWQgd2luZG93ICovCisJdWludDE2X3QgY3N1bTsJCS8qIENoZWNrc3VtICovCisJdWludDE2X3QgdXJnOwkJLyogVXJnZW50IHBvaW50ZXIgKi8KK307CisKKy8qKiBAZGVmZ3JvdXAgdGNwb3B0cyBUQ1Agb3B0aW9ucworICogQHsKKyAqLworCisvKiogRW5kIG9mIFRDUCBvcHRpb25zIGxpc3QgKi8KKyNkZWZpbmUgVENQX09QVElPTl9FTkQgMAorCisvKiogVENQIG9wdGlvbiBwYWQgKi8KKyNkZWZpbmUgVENQX09QVElPTl9OT1AgMQorCisvKiogR2VuZXJpYyBUQ1Agb3B0aW9uICovCitzdHJ1Y3QgdGNwX29wdGlvbiB7CisJdWludDhfdCBraW5kOworCXVpbnQ4X3QgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFRDUCBNU1Mgb3B0aW9uICovCitzdHJ1Y3QgdGNwX21zc19vcHRpb24geworCXVpbnQ4X3Qga2luZDsKKwl1aW50OF90IGxlbmd0aDsKKwl1aW50MTZfdCBtc3M7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQ29kZSBmb3IgdGhlIFRDUCBNU1Mgb3B0aW9uICovCisjZGVmaW5lIFRDUF9PUFRJT05fTVNTIDIKKworLyoqIFRDUCB0aW1lc3RhbXAgb3B0aW9uICovCitzdHJ1Y3QgdGNwX3RpbWVzdGFtcF9vcHRpb24geworCXVpbnQ4X3Qga2luZDsKKwl1aW50OF90IGxlbmd0aDsKKwl1aW50MzJfdCB0c3ZhbDsKKwl1aW50MzJfdCB0c2VjcjsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBQYWRkZWQgVENQIHRpbWVzdGFtcCBvcHRpb24gKHVzZWQgZm9yIHNlbmRpbmcpICovCitzdHJ1Y3QgdGNwX3RpbWVzdGFtcF9wYWRkZWRfb3B0aW9uIHsKKwl1aW50OF90IG5vcFsyXTsKKwlzdHJ1Y3QgdGNwX3RpbWVzdGFtcF9vcHRpb24gdHNvcHQ7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQ29kZSBmb3IgdGhlIFRDUCB0aW1lc3RhbXAgb3B0aW9uICovCisjZGVmaW5lIFRDUF9PUFRJT05fVFMgOAorCisvKiogUGFyc2VkIFRDUCBvcHRpb25zICovCitzdHJ1Y3QgdGNwX29wdGlvbnMgeworCS8qKiBNU1Mgb3B0aW9uLCBpZiBwcmVzZW50ICovCisJY29uc3Qgc3RydWN0IHRjcF9tc3Nfb3B0aW9uICptc3NvcHQ7CisJLyoqIFRpbWVzdGFtcGUgb3B0aW9uLCBpZiBwcmVzZW50ICovCisJY29uc3Qgc3RydWN0IHRjcF90aW1lc3RhbXBfb3B0aW9uICp0c29wdDsKK307CisKKy8qKiBAfSAqLworCisvKgorICogVENQIGZsYWdzCisgKi8KKyNkZWZpbmUgVENQX0NXUgkJMHg4MAorI2RlZmluZSBUQ1BfRUNFCQkweDQwCisjZGVmaW5lIFRDUF9VUkcJCTB4MjAKKyNkZWZpbmUgVENQX0FDSwkJMHgxMAorI2RlZmluZSBUQ1BfUFNICQkweDA4CisjZGVmaW5lIFRDUF9SU1QJCTB4MDQKKyNkZWZpbmUgVENQX1NZTgkJMHgwMgorI2RlZmluZSBUQ1BfRklOCQkweDAxCisKKy8qKgorKiBAZGVmZ3JvdXAgdGNwc3RhdGVzIFRDUCBzdGF0ZXMKKyoKKyogVGhlIFRDUCBzdGF0ZSBpcyBkZWZpbmVkIGJ5IGEgY29tYmluYXRpb24gb2YgdGhlIGZsYWdzIHRoYXQgaGF2ZQorKiBiZWVuIHNlbnQgdG8gdGhlIHBlZXIsIHRoZSBmbGFncyB0aGF0IGhhdmUgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlCisqIHBlZXIsIGFuZCB0aGUgZmxhZ3MgdGhhdCBoYXZlIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4KKyoKKyogQHsKKyovCisKKy8qKiBUQ1AgZmxhZ3MgdGhhdCBoYXZlIGJlZW4gc2VudCBpbiBvdXRnb2luZyBwYWNrZXRzICovCisjZGVmaW5lIFRDUF9TVEFURV9TRU5UKGZsYWdzKSAoIChmbGFncykgPDwgMCApCisjZGVmaW5lIFRDUF9GTEFHU19TRU5UKHN0YXRlKSAoICggKHN0YXRlKSA+PiAwICkgJiAweGZmICkKKworLyoqIFRDUCBmbGFncyB0aGF0IGhhdmUgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlIHBlZXIKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBhcHBsaWVzIG9ubHkgdG8gU1lOIGFuZCBGSU4uCisgKi8KKyNkZWZpbmUgVENQX1NUQVRFX0FDS0VEKGZsYWdzKSAoIChmbGFncykgPDwgOCApCisjZGVmaW5lIFRDUF9GTEFHU19BQ0tFRChzdGF0ZSkgKCAoIChzdGF0ZSkgPj4gOCApICYgMHhmZiApCisKKy8qKiBUQ1AgZmxhZ3MgdGhhdCBoYXZlIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgcGVlcgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGFwcGxpZXMgb25seSB0byBTWU4gYW5kIEZJTiwgYW5kIHRoYXQgb25jZSBTWU4gaGFzCisgKiBiZWVuIHJlY2VpdmVkLCB3ZSBzaG91bGQgYWx3YXlzIGJlIHNlbmRpbmcgQUNLLgorICovCisjZGVmaW5lIFRDUF9TVEFURV9SQ1ZEKGZsYWdzKSAoIChmbGFncykgPDwgMTYgKQorI2RlZmluZSBUQ1BfRkxBR1NfUkNWRChzdGF0ZSkgKCAoIChzdGF0ZSkgPj4gMTYgKSAmIDB4ZmYgKQorCisvKiogVENQIGZsYWdzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBzZW50IGluIG91dGdvaW5nIHBhY2tldHMgKi8KKyNkZWZpbmUgVENQX0ZMQUdTX1NFTkRJTkcoc3RhdGUpIFwKKwkoIFRDUF9GTEFHU19TRU5UICggc3RhdGUgKSAmIH5UQ1BfRkxBR1NfQUNLRUQgKCBzdGF0ZSApICkKKworLyoqIENMT1NFRAorICoKKyAqIFRoZSBjb25uZWN0aW9uIGhhcyBub3QgeWV0IGJlZW4gdXNlZCBmb3IgYW55dGhpbmcuCisgKi8KKyNkZWZpbmUgVENQX0NMT1NFRCBUQ1BfUlNUCisKKy8qKiBMSVNURU4KKyAqCisgKiBOb3QgY3VycmVudGx5IHVzZWQgYXMgYSBzdGF0ZTsgd2UgaGF2ZSBubyBzdXBwb3J0IGZvciBsaXN0ZW5pbmcKKyAqIGNvbm5lY3Rpb25zLiAgR2l2ZW4gYSB1bmlxdWUgdmFsdWUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCisgKi8KKyNkZWZpbmUgVENQX0xJU1RFTiAwCisKKy8qKiBTWU5fU0VOVAorICoKKyAqIFNZTiBoYXMgYmVlbiBzZW50LCBub3RoaW5nIGhhcyB5ZXQgYmVlbiByZWNlaXZlZCBvciBhY2tub3dsZWRnZWQuCisgKi8KKyNkZWZpbmUgVENQX1NZTl9TRU5UCSggVENQX1NUQVRFX1NFTlQgKCBUQ1BfU1lOICkgKQorCisvKiogU1lOX1JDVkQKKyAqCisgKiBTWU4gaGFzIGJlZW4gc2VudCBidXQgbm90IGFja25vd2xlZGdlZCwgU1lOIGhhcyBiZWVuIHJlY2VpdmVkLgorICovCisjZGVmaW5lIFRDUF9TWU5fUkNWRAkoIFRDUF9TVEFURV9TRU5UICggVENQX1NZTiB8IFRDUF9BQ0sgKSB8CSAgICBcCisJCQkgIFRDUF9TVEFURV9SQ1ZEICggVENQX1NZTiApICkKKworLyoqIEVTVEFCTElTSEVECisgKgorICogU1lOIGhhcyBiZWVuIHNlbnQgYW5kIGFja25vd2xlZGdlZCwgU1lOIGhhcyBiZWVuIHJlY2VpdmVkLgorICovCisjZGVmaW5lIFRDUF9FU1RBQkxJU0hFRAkoIFRDUF9TVEFURV9TRU5UICggVENQX1NZTiB8IFRDUF9BQ0sgKSB8CSAgICBcCisJCQkgIFRDUF9TVEFURV9BQ0tFRCAoIFRDUF9TWU4gKSB8CQkJICAgIFwKKwkJCSAgVENQX1NUQVRFX1JDVkQgKCBUQ1BfU1lOICkgKQorCisvKiogRklOX1dBSVRfMQorICoKKyAqIFNZTiBoYXMgYmVlbiBzZW50IGFuZCBhY2tub3dsZWRnZWQsIFNZTiBoYXMgYmVlbiByZWNlaXZlZCwgRklOIGhhcworICogYmVlbiBzZW50IGJ1dCBub3QgYWNrbm93bGVkZ2VkLCBGSU4gaGFzIG5vdCBiZWVuIHJlY2VpdmVkLgorICoKKyAqIFJGQyA3OTMgc2hvd3MgdGhhdCB3ZSBjYW4gZW50ZXIgRklOX1dBSVRfMSB3aXRob3V0IGhhdmUgaGFkIFNZTgorICogYWNrbm93bGVkZ2VkLCBpLmUuIGlmIHRoZSBhcHBsaWNhdGlvbiBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIKKyAqIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBTWU4sIGJ1dCBiZWZvcmUgaGF2aW5nIGhhZCBTWU4gYWNrbm93bGVkZ2VkLgorICogSG93ZXZlciwgd2UgaGF2ZSB0byAqcHJldGVuZCogdGhhdCBTWU4gaGFzIGJlZW4gYWNrbm93bGVkZ2VkCisgKiBhbnl3YXksIG90aGVyd2lzZSB3ZSBlbmQgdXAgc2VuZGluZyBTWU4gYW5kIEZJTiBpbiB0aGUgc2FtZQorICogc2VxdWVuY2UgbnVtYmVyIHNsb3QuICBUaGVyZWZvcmUsIHdoZW4gd2UgdHJhbnNpdGlvbiBmcm9tIFNZTl9SQ1ZECisgKiB0byBGSU5fV0FJVF8xLCB3ZSBoYXZlIHRvIHJlbWVtYmVyIHRvIHNldCBUQ1BfU1RBVEVfQUNLRUQoVENQX1NZTikKKyAqIGFuZCBpbmNyZW1lbnQgb3VyIHNlcXVlbmNlIG51bWJlci4KKyAqLworI2RlZmluZSBUQ1BfRklOX1dBSVRfMQkoIFRDUF9TVEFURV9TRU5UICggVENQX1NZTiB8IFRDUF9BQ0sgfCBUQ1BfRklOICkgfCAgXAorCQkJICBUQ1BfU1RBVEVfQUNLRUQgKCBUQ1BfU1lOICkgfAkJCSAgICBcCisJCQkgIFRDUF9TVEFURV9SQ1ZEICggVENQX1NZTiApICkKKworLyoqIEZJTl9XQUlUXzIKKyAqCisgKiBTWU4gaGFzIGJlZW4gc2VudCBhbmQgYWNrbm93bGVkZ2VkLCBTWU4gaGFzIGJlZW4gcmVjZWl2ZWQsIEZJTiBoYXMKKyAqIGJlZW4gc2VudCBhbmQgYWNrbm93bGVkZ2VkLCBGSU4gaGEgbm90IGJlZW4gcmVjZWl2ZWQuCisgKi8KKyNkZWZpbmUgVENQX0ZJTl9XQUlUXzIJKCBUQ1BfU1RBVEVfU0VOVCAoIFRDUF9TWU4gfCBUQ1BfQUNLIHwgVENQX0ZJTiApIHwgIFwKKwkJCSAgVENQX1NUQVRFX0FDS0VEICggVENQX1NZTiB8IFRDUF9GSU4gKSB8CSAgICBcCisJCQkgIFRDUF9TVEFURV9SQ1ZEICggVENQX1NZTiApICkKKworLyoqIENMT1NJTkcgLyBMQVNUX0FDSworICoKKyAqIFNZTiBoYXMgYmVlbiBzZW50IGFuZCBhY2tub3dsZWRnZWQsIFNZTiBoYXMgYmVlbiByZWNlaXZlZCwgRklOIGhhcworICogYmVlbiBzZW50IGJ1dCBub3QgYWNrbm93bGVkZ2VkLCBGSU4gaGFzIGJlZW4gcmVjZWl2ZWQuCisgKgorICogVGhpcyBzdGF0ZSBhY3R1YWxseSBlbmNvbXBhc3NlcyBib3RoIENMT1NJTkcgYW5kIExBU1RfQUNLOyB0aGV5IGFyZQorICogaWRlbnRpY2FsIHdpdGggdGhlIGRlZmluaXRpb24gb2Ygc3RhdGUgdGhhdCB3ZSB1c2UuICBJIGRvbid0CisgKiAqYmVsaWV2ZSogdGhhdCB0aGV5IG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZC4KKyAqLworI2RlZmluZSBUQ1BfQ0xPU0lOR19PUl9MQVNUX0FDSwkJCQkJCSAgICBcCisJCQkoIFRDUF9TVEFURV9TRU5UICggVENQX1NZTiB8IFRDUF9BQ0sgfCBUQ1BfRklOICkgfCAgXAorCQkJICBUQ1BfU1RBVEVfQUNLRUQgKCBUQ1BfU1lOICkgfAkJCSAgICBcCisJCQkgIFRDUF9TVEFURV9SQ1ZEICggVENQX1NZTiB8IFRDUF9GSU4gKSApCisKKy8qKiBUSU1FX1dBSVQKKyAqCisgKiBTWU4gaGFzIGJlZW4gc2VudCBhbmQgYWNrbm93bGVkZ2VkLCBTWU4gaGFzIGJlZW4gcmVjZWl2ZWQsIEZJTiBoYXMKKyAqIGJlZW4gc2VudCBhbmQgYWNrbm93bGVkZ2VkLCBGSU4gaGFzIGJlZW4gcmVjZWl2ZWQuCisgKi8KKyNkZWZpbmUgVENQX1RJTUVfV0FJVAkoIFRDUF9TVEFURV9TRU5UICggVENQX1NZTiB8IFRDUF9BQ0sgfCBUQ1BfRklOICkgfCAgXAorCQkJICBUQ1BfU1RBVEVfQUNLRUQgKCBUQ1BfU1lOIHwgVENQX0ZJTiApIHwJICAgIFwKKwkJCSAgVENQX1NUQVRFX1JDVkQgKCBUQ1BfU1lOIHwgVENQX0ZJTiApICkKKworLyoqIENMT1NFX1dBSVQKKyAqCisgKiBTWU4gaGFzIGJlZW4gc2VudCBhbmQgYWNrbm93bGVkZ2VkLCBTWU4gaGFzIGJlZW4gcmVjZWl2ZWQsIEZJTiBoYXMKKyAqIGJlZW4gcmVjZWl2ZWQuCisgKi8KKyNkZWZpbmUgVENQX0NMT1NFX1dBSVQJKCBUQ1BfU1RBVEVfU0VOVCAoIFRDUF9TWU4gfCBUQ1BfQUNLICkgfAkgICAgXAorCQkJICBUQ1BfU1RBVEVfQUNLRUQgKCBUQ1BfU1lOICkgfAkJCSAgICBcCisJCQkgIFRDUF9TVEFURV9SQ1ZEICggVENQX1NZTiB8IFRDUF9GSU4gKSApCisKKy8qKiBDYW4gc2VuZCBkYXRhIGluIGN1cnJlbnQgc3RhdGUKKyAqCisgKiBXZSBjYW4gc2VuZCBkYXRhIGlmIGFuZCBvbmx5IGlmIHdlIGhhdmUgaGFkIG91ciBTWU4gYWNrZWQgYW5kIHdlCisgKiBoYXZlIG5vdCB5ZXQgc2VudCBvdXIgRklOLgorICovCisjZGVmaW5lIFRDUF9DQU5fU0VORF9EQVRBKHN0YXRlKQkJCQkJICAgIFwKKwkoICggKHN0YXRlKSAmICggVENQX1NUQVRFX0FDS0VEICggVENQX1NZTiApIHwJCQkgICAgXAorCQkJVENQX1NUQVRFX1NFTlQgKCBUQ1BfRklOICkgKSApCQkJICAgIFwKKwkgID09IFRDUF9TVEFURV9BQ0tFRCAoIFRDUF9TWU4gKSApCisKKy8qKiBIYXZlIGV2ZXIgYmVlbiBmdWxseSBlc3RhYmxpc2hlZAorICoKKyAqIFdlIGhhdmUgYmVlbiBmdWxseSBlc3RhYmxpc2hlZCBpZiB3ZSBoYXZlIGJvdGggcmVjZWl2ZWQgYSBTWU4gYW5kCisgKiBoYWQgb3VyIG93biBTWU4gYWNrZWQuCisgKi8KKyNkZWZpbmUgVENQX0hBU19CRUVOX0VTVEFCTElTSEVEKHN0YXRlKQkJCQkJICAgIFwKKwkoICggKHN0YXRlKSAmICggVENQX1NUQVRFX0FDS0VEICggVENQX1NZTiApIHwJCQkgICAgXAorCQkJVENQX1NUQVRFX1JDVkQgKCBUQ1BfU1lOICkgKSApCQkJICAgIFwKKwkgID09ICggVENQX1NUQVRFX0FDS0VEICggVENQX1NZTiApIHwgVENQX1NUQVRFX1JDVkQgKCBUQ1BfU1lOICkgKSApCisKKy8qKiBIYXZlIGNsb3NlZCBncmFjZWZ1bGx5CisgKgorICogV2UgaGF2ZSBjbG9zZWQgZ3JhY2VmdWxseSBpZiB3ZSBoYXZlIGJvdGggcmVjZWl2ZWQgYSBGSU4gYW5kIGhhZAorICogb3VyIG93biBGSU4gYWNrZWQuCisgKi8KKyNkZWZpbmUgVENQX0NMT1NFRF9HUkFDRUZVTExZKHN0YXRlKQkJCQkJICAgIFwKKwkoICggKHN0YXRlKSAmICggVENQX1NUQVRFX0FDS0VEICggVENQX0ZJTiApIHwJCQkgICAgXAorCQkJVENQX1NUQVRFX1JDVkQgKCBUQ1BfRklOICkgKSApCQkJICAgIFwKKwkgID09ICggVENQX1NUQVRFX0FDS0VEICggVENQX0ZJTiApIHwgVENQX1NUQVRFX1JDVkQgKCBUQ1BfRklOICkgKSApCisKKy8qKiBAfSAqLworCisvKiogTWFzayBmb3IgVENQIGhlYWRlciBsZW5ndGggZmllbGQgKi8KKyNkZWZpbmUgVENQX01BU0tfSExFTgkweGYwCisKKy8qKiBTbWFsbGVzdCBwb3J0IG51bWJlciBvbiB3aGljaCBhIFRDUCBjb25uZWN0aW9uIGNhbiBsaXN0ZW4gKi8KKyNkZWZpbmUgVENQX01JTl9QT1JUIDEKKworLyogU29tZSBJT0IgY29uc3RhbnRzICovCisjZGVmaW5lIE1BWF9IRFJfTEVOCTEwMAorI2RlZmluZSBNQVhfSU9CX0xFTgkxNTAwCisjZGVmaW5lIE1JTl9JT0JfTEVOCU1BWF9IRFJfTEVOICsgMTAwIC8qIFRvIGFjY291bnQgZm9yIHBhZGRpbmcgYnkgTEwgKi8KKworLyoqCisgKiBNYXhtaW11bSBhZHZlcnRpc2VkIFRDUCB3aW5kb3cgc2l6ZQorICoKKyAqIFdlIGVzdGltYXRlIHRoZSBUQ1Agd2luZG93IHNpemUgYXMgdGhlIGFtb3VudCBvZiBmcmVlIG1lbW9yeSB3ZQorICogaGF2ZS4gIFRoaXMgaXMgbm90IHN0cmljdGx5IGFjY3VyYXRlIChzaW5jZSBpdCBpZ25vcmVzIGFueSBzcGFjZQorICogYWxyZWFkeSBhbGxvY2F0ZWQgYXMgUlggYnVmZmVycyksIGJ1dCBpdCB3aWxsIGRvIGZvciBub3cuCisgKgorICogU2luY2Ugd2UgZG9uJ3Qgc3RvcmUgb3V0LW9mLW9yZGVyIHJlY2VpdmVkIHBhY2tldHMsIHRoZQorICogcmV0cmFuc21pc3Npb24gcGVuYWx0eSBpcyB0aGF0IHRoZSB3aG9sZSB3aW5kb3cgY29udGVudHMgbXVzdCBiZQorICogcmVzZW50LiAgVGhpcyBzdWdnZXN0cyBrZWVwaW5nIHRoZSB3aW5kb3cgc2l6ZSBzbWFsbCwgYnV0IGJlYXIgaW4KKyAqIG1pbmQgdGhhdCB0aGUgbWF4aW11bSBiYW5kd2lkdGggb24gYW55IGxpbmsgaXMgbGltaXRlZCB0bworICoKKyAqICAgIG1heF9iYW5kd2lkdGggPSAoIHRjcF93aW5kb3cgLyByb3VuZF90cmlwX3RpbWUgKQorICoKKyAqIFdpdGggYSA0OGtCIHdpbmRvdywgd2hpY2ggcHJvYmFibHkgYWNjdXJhdGVseSByZWZsZWN0cyBvdXIgYW1vdW50CisgKiBvZiBmcmVlIG1lbW9yeSwgYW5kIGEgV0FOIFJUVCBvZiBzYXkgMjAwbXMsIHRoaXMgZ2l2ZXMgYSBtYXhpbXVtCisgKiBiYW5kd2lkdGggb2YgMjQwa0Ivcy4gIFRoaXMgaXMgc3VmZmljaWVudGx5IGNsb3NlIHRvIHJlYWxpc3RpYyB0aGF0CisgKiB3ZSB3aWxsIG5lZWQgdG8gYmUgY2FyZWZ1bCB0aGF0IG91ciBhZHZlcnRpc2VkIHdpbmRvdyBkb2Vzbid0IGVuZAorICogdXAgbGltaXRpbmcgV0FOIGRvd25sb2FkIHNwZWVkcy4KKyAqCisgKiBGaW5hbGx5LCBzaW5jZSB0aGUgd2luZG93IGdvZXMgaW50byBhIDE2LWJpdCBmaWVsZCBhbmQgd2UgY2Fubm90CisgKiBhY3R1YWxseSB1c2UgNjU1MzYsIHdlIHVzZSBhIHdpbmRvdyBzaXplIG9mICg2NTUzNi00KSB0byBlbnN1cmUKKyAqIHRoYXQgcGF5bG9hZHMgcmVtYWluIGR3b3JkLWFsaWduZWQuCisgKi8KKyNkZWZpbmUgVENQX01BWF9XSU5ET1dfU0laRQkoIDY1NTM2IC0gNCApCisvLyNkZWZpbmUgVENQX01BWF9XSU5ET1dfU0laRQk0MDk2CisKKy8qKgorICogUGF0aCBNVFUKKyAqCisgKiBXZSByZWFsbHkgb3VnaHQgdG8gaW1wbGVtZW50IFBhdGggTVRVIGRpc2NvdmVyeS4gIFVudGlsIHdlIGRvLAorICogYW55dGhpbmcgd2l0aCBhIHBhdGggTVRVIGdyZWF0ZXIgdGhhbiB0aGlzIG1heSBmYWlsLgorICovCisjZGVmaW5lIFRDUF9QQVRIX01UVSAxNDYwCisKKy8qKgorICogQWR2ZXJ0aXNlZCBUQ1AgTVNTCisgKgorICogV2UgY3VycmVudGx5IGhhcmRjb2RlIHRoaXMgdG8gYSByZWFzb25hYmxlIHZhbHVlIGFuZCBob3BlIHRoYXQgdGhlCisgKiBzZW5kZXIgdXNlcyBwYXRoIE1UVSBkaXNjb3ZlcnkuICBUaGUgYWx0ZXJuYXRpdmUgaXMgYnJlYWtpbmcgdGhlCisgKiBhYnN0cmFjdGlvbiBsYXllciBzbyB0aGF0IHdlIGNhbiBmaW5kIG91dCB0aGUgTVRVIGZyb20gdGhlIElQIGxheWVyCisgKiAod2hpY2ggd291bGQgaGF2ZSB0byBmaW5kIG91dCBmcm9tIHRoZSBuZXQgZGV2aWNlIGxheWVyKS4KKyAqLworI2RlZmluZSBUQ1BfTVNTIDE0NjAKKworLyoqIFRDUCBtYXhpbXVtIHNlZ21lbnQgbGlmZXRpbWUKKyAqCisgKiBDdXJyZW50bHkgc2V0IHRvIDIgbWludXRlcywgYXMgcGVyIFJGQyA3OTMuCisgKi8KKyNkZWZpbmUgVENQX01TTCAoIDIgKiA2MCAqIFRJQ0tTX1BFUl9TRUMgKQorCitleHRlcm4gc3RydWN0IHRjcGlwX3Byb3RvY29sIHRjcF9wcm90b2NvbDsKKworI2VuZGlmIC8qIF9HUFhFX1RDUF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGNwaXAuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90Y3BpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MWQ3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGNwaXAuaApAQCAtMCwwICsxLDEyOCBAQAorI2lmbmRlZiBfR1BYRV9UQ1BJUF9ICisjZGVmaW5lIF9HUFhFX1RDUElQX0gKKworLyoqIEBmaWxlCisgKgorICogVHJhbnNwb3J0LW5ldHdvcmsgbGF5ZXIgaW50ZXJmYWNlCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdweGUvc29ja2V0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pbi5oPgorI2luY2x1ZGUgPGdweGUvdGFibGVzLmg+CisKK3N0cnVjdCBpb19idWZmZXI7CitzdHJ1Y3QgbmV0X2RldmljZTsKKworLyoqIEVtcHR5IGNoZWNrc3VtIHZhbHVlCisgKgorICogVGhpcyBpcyB0aGUgVENQL0lQIGNoZWNrc3VtIG92ZXIgYSB6ZXJvLWxlbmd0aCBibG9jayBvZiBkYXRhLgorICovCisjZGVmaW5lIFRDUElQX0VNUFRZX0NTVU0gMHhmZmZmCisKKy8qKgorICogVENQL0lQIHNvY2tldCBhZGRyZXNzCisgKgorICogVGhpcyBjb250YWlucyB0aGUgZmllbGRzIGNvbW1vbiB0byBzb2NrZXQgYWRkcmVzc2VzIGZvciBhbGwgVENQL0lQCisgKiBhZGRyZXNzIGZhbWlsaWVzLgorICovCitzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgeworCS8qKiBTb2NrZXQgYWRkcmVzcyBmYW1pbHkgKHBhcnQgb2Ygc3RydWN0IEBjIHNvY2thZGRyKSAqLworCXNhX2ZhbWlseV90IHN0X2ZhbWlseTsKKwkvKiogVENQL0lQIHBvcnQgKi8KKwl1aW50MTZfdCBzdF9wb3J0OworCS8qKiBQYWRkaW5nCisJICoKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIHN0cnVjdCBAYyBzb2NrYWRkcl90Y3BpcCBpcyBsYXJnZQorCSAqIGVub3VnaCB0byBob2xkIGEgc29ja2V0IGFkZHJlc3MgZm9yIGFueSBUQ1AvSVAgYWRkcmVzcworCSAqIGZhbWlseS4KKwkgKi8KKwljaGFyIHBhZFsgc2l6ZW9mICggc3RydWN0IHNvY2thZGRyICkgLQorCQkgICggc2l6ZW9mICggc2FfZmFtaWx5X3QgKSArIHNpemVvZiAoIHVpbnQxNl90ICkgKSBdOworfSBfX2F0dHJpYnV0ZV9fICgoIG1heV9hbGlhcyApKTsKKworLyoqIAorICogQSB0cmFuc3BvcnQtbGF5ZXIgcHJvdG9jb2wgb2YgdGhlIFRDUC9JUCBzdGFjayAoZWcuIFVEUCwgVENQLCBldGMpCisgKi8KK3N0cnVjdCB0Y3BpcF9wcm90b2NvbCB7CisJLyoqIFByb3RvY29sIG5hbWUgKi8KKwljb25zdCBjaGFyICpuYW1lOworICAgICAgIAkvKioKKyAgICAgICAgICogUHJvY2VzcyByZWNlaXZlZCBwYWNrZXQKKyAgICAgICAgICoKKyAgICAgICAgICogQHYgaW9idWYJCUkvTyBidWZmZXIKKwkgKiBAdiBzdF9zcmMJCVBhcnRpYWxseS1maWxsZWQgc291cmNlIGFkZHJlc3MKKwkgKiBAdiBzdF9kZXN0CQlQYXJ0aWFsbHktZmlsbGVkIGRlc3RpbmF0aW9uIGFkZHJlc3MKKwkgKiBAdiBwc2hkcl9jc3VtCVBzZXVkby1oZWFkZXIgY2hlY2tzdW0KKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBJL08gYnVmZmVyLgorICAgICAgICAgKi8KKyAgICAgICAgaW50ICggKiByeCApICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3Rfc3JjLAorCQkgICAgICAgc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9kZXN0LCB1aW50MTZfdCBwc2hkcl9jc3VtICk7CisgICAgICAgIC8qKiAKKwkgKiBUcmFuc3BvcnQtbGF5ZXIgcHJvdG9jb2wgbnVtYmVyCisJICoKKwkgKiBUaGlzIGlzIGEgY29uc3RhbnQgb2YgdGhlIHR5cGUgSVBfWFhYCisgICAgICAgICAqLworICAgICAgICB1aW50OF90IHRjcGlwX3Byb3RvOworfTsKKworLyoqCisgKiBBIG5ldHdvcmstbGF5ZXIgcHJvdG9jb2wgb2YgdGhlIFRDUC9JUCBzdGFjayAoZWcuIElQVjQsIElQdjYsIGV0YykKKyAqLworc3RydWN0IHRjcGlwX25ldF9wcm90b2NvbCB7CisJLyoqIFByb3RvY29sIG5hbWUgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKiBOZXR3b3JrIGFkZHJlc3MgZmFtaWx5ICovCisJc2FfZmFtaWx5X3Qgc2FfZmFtaWx5OworCS8qKgorCSAqIFRyYW5zbWl0IHBhY2tldAorCSAqCisJICogQHYgaW9idWYJCUkvTyBidWZmZXIKKwkgKiBAdiB0Y3BpcF9wcm90b2NvbAlUcmFuc3BvcnQtbGF5ZXIgcHJvdG9jb2wKKwkgKiBAdiBzdF9zcmMJCVNvdXJjZSBhZGRyZXNzLCBvciBOVUxMIHRvIHVzZSBkZWZhdWx0CisJICogQHYgc3RfZGVzdAkJRGVzdGluYXRpb24gYWRkcmVzcworCSAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UgKG9yIE5VTEwgdG8gcm91dGUgYXV0b21hdGljYWxseSkKKwkgKiBAdiB0cmFuc19jc3VtCVRyYW5zcG9ydC1sYXllciBjaGVja3N1bSB0byBjb21wbGV0ZSwgb3IgTlVMTAorCSAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorCSAqCisJICogVGhpcyBmdW5jdGlvbiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIEkvTyBidWZmZXIuCisJICovCisJaW50ICggKiB0eCApICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCSAgICAgICBzdHJ1Y3QgdGNwaXBfcHJvdG9jb2wgKnRjcGlwX3Byb3RvY29sLAorCQkgICAgICAgc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9zcmMsCisJCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X2Rlc3QsCisJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgICAgdWludDE2X3QgKnRyYW5zX2NzdW0gKTsKK307CisKKy8qKiBUQ1AvSVAgdHJhbnNwb3J0LWxheWVyIHByb3RvY29sIHRhYmxlICovCisjZGVmaW5lIFRDUElQX1BST1RPQ09MUyBfX3RhYmxlICggc3RydWN0IHRjcGlwX3Byb3RvY29sLCAidGNwaXBfcHJvdG9jb2xzIiApCisKKy8qKiBEZWNsYXJlIGEgVENQL0lQIHRyYW5zcG9ydC1sYXllciBwcm90b2NvbCAqLworI2RlZmluZSBfX3RjcGlwX3Byb3RvY29sIF9fdGFibGVfZW50cnkgKCBUQ1BJUF9QUk9UT0NPTFMsIDAxICkKKworLyoqIFRDUC9JUCBuZXR3b3JrLWxheWVyIHByb3RvY29sIHRhYmxlICovCisjZGVmaW5lIFRDUElQX05FVF9QUk9UT0NPTFMgXAorCV9fdGFibGUgKCBzdHJ1Y3QgdGNwaXBfbmV0X3Byb3RvY29sLCAidGNwaXBfbmV0X3Byb3RvY29scyIgKQorCisvKiogRGVjbGFyZSBhIFRDUC9JUCBuZXR3b3JrLWxheWVyIHByb3RvY29sICovCisjZGVmaW5lIF9fdGNwaXBfbmV0X3Byb3RvY29sIF9fdGFibGVfZW50cnkgKCBUQ1BJUF9ORVRfUFJPVE9DT0xTLCAwMSApCisKK2V4dGVybiBpbnQgdGNwaXBfcnggKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwgdWludDhfdCB0Y3BpcF9wcm90bywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9zcmMsCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3RfZGVzdCwgdWludDE2X3QgcHNoZHJfY3N1bSApOworZXh0ZXJuIGludCB0Y3BpcF90eCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzdHJ1Y3QgdGNwaXBfcHJvdG9jb2wgKnRjcGlwLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X3NyYywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9kZXN0LAorCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgICB1aW50MTZfdCAqdHJhbnNfY3N1bSApOworZXh0ZXJuIHVpbnQxNl90IHRjcGlwX2NvbnRpbnVlX2Noa3N1bSAoIHVpbnQxNl90IHBhcnRpYWwsCisJCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKK2V4dGVybiB1aW50MTZfdCB0Y3BpcF9jaGtzdW0gKCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7CisKKyNlbmRpZiAvKiBfR1BYRV9UQ1BJUF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGZ0cC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3RmdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTdiYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3RmdHAuaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmCV9HUFhFX1RGVFBfSAorI2RlZmluZQlfR1BYRV9URlRQX0gKKworLyoqIEBmaWxlCisgKgorICogVEZUUCBwcm90b2NvbAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBURlRQX1BPUlQJICAgICAgIDY5IC8qKjwgRGVmYXVsdCBURlRQIHNlcnZlciBwb3J0ICovCisjZGVmaW5lCVRGVFBfREVGQVVMVF9CTEtTSVpFICA1MTIgLyoqPCBEZWZhdWx0IFRGVFAgZGF0YSBibG9jayBzaXplICovCisjZGVmaW5lCVRGVFBfTUFYX0JMS1NJWkUgICAgIDE0MzIKKworI2RlZmluZSBURlRQX1JSUQkJMSAvKio8IFJlYWQgcmVxdWVzdCBvcGNvZGUgKi8KKyNkZWZpbmUgVEZUUF9XUlEJCTIgLyoqPCBXcml0ZSByZXF1ZXN0IG9wY29kZSAqLworI2RlZmluZSBURlRQX0RBVEEJCTMgLyoqPCBEYXRhIGJsb2NrIG9wY29kZSAqLworI2RlZmluZSBURlRQX0FDSwkJNCAvKio8IERhdGEgYmxvY2sgYWNrbm93bGVkZ2VtZW50IG9wY29kZSAqLworI2RlZmluZSBURlRQX0VSUk9SCQk1IC8qKjwgRXJyb3Igb3Bjb2RlICovCisjZGVmaW5lIFRGVFBfT0FDSwkJNiAvKio8IE9wdGlvbnMgYWNrbm93bGVkZ2VtZW50IG9wY29kZSAqLworCisjZGVmaW5lIFRGVFBfRVJSX0ZJTEVfTk9UX0ZPVU5ECTEgLyoqPCBGaWxlIG5vdCBmb3VuZCAqLworI2RlZmluZSBURlRQX0VSUl9BQ0NFU1NfREVOSUVECTIgLyoqPCBBY2Nlc3MgdmlvbGF0aW9uICovCisjZGVmaW5lIFRGVFBfRVJSX0RJU0tfRlVMTAkzIC8qKjwgRGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQgKi8KKyNkZWZpbmUgVEZUUF9FUlJfSUxMRUdBTF9PUAk0IC8qKjwgSWxsZWdhbCBURlRQIG9wZXJhdGlvbiAqLworI2RlZmluZSBURlRQX0VSUl9VTktOT1dOX1RJRAk1IC8qKjwgVW5rbm93biB0cmFuc2ZlciBJRCAqLworI2RlZmluZSBURlRQX0VSUl9GSUxFX0VYSVNUUwk2IC8qKjwgRmlsZSBhbHJlYWR5IGV4aXN0cyAqLworI2RlZmluZSBURlRQX0VSUl9VTktOT1dOX1VTRVIJNyAvKio8IE5vIHN1Y2ggdXNlciAqLworI2RlZmluZSBURlRQX0VSUl9CQURfT1BUUwk4IC8qKjwgT3B0aW9uIG5lZ290aWF0aW9uIGZhaWxlZCAqLworCisjZGVmaW5lIE1URlRQX1BPUlQJICAgICAxNzU5IC8qKjwgRGVmYXVsdCBNVEZUUCBzZXJ2ZXIgcG9ydCAqLworCisvKiogQSBURlRQIHJlYWQgcmVxdWVzdCAoUlJRKSBwYWNrZXQgKi8KK3N0cnVjdCB0ZnRwX3JycSB7CisJdWludDE2X3Qgb3Bjb2RlOworCWNoYXIgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBIFRGVFAgZGF0YSAoREFUQSkgcGFja2V0ICovCitzdHJ1Y3QgdGZ0cF9kYXRhIHsKKwl1aW50MTZfdCBvcGNvZGU7CisJdWludDE2X3QgYmxvY2s7CisJdWludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKyAKKy8qKiBBIFRGVFAgYWNrbm93bGVkZ2VtZW50IChBQ0spIHBhY2tldCAqLworc3RydWN0IHRmdHBfYWNrIHsKKwl1aW50MTZfdCBvcGNvZGU7CisJdWludDE2X3QgYmxvY2s7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBURlRQIGVycm9yIChFUlJPUikgcGFja2V0ICovCitzdHJ1Y3QgdGZ0cF9lcnJvciB7CisJdWludDE2X3Qgb3Bjb2RlOworCXVpbnQxNl90IGVycmNvZGU7CisJY2hhciBlcnJtc2dbMF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSBURlRQIG9wdGlvbnMgYWNrbm93bGVkZ2VtZW50IChPQUNLKSBwYWNrZXQgKi8KK3N0cnVjdCB0ZnRwX29hY2sgeworCXVpbnQxNl90IG9wY29kZTsKKwljaGFyIGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogVGhlIGNvbW1vbiBoZWFkZXIgb2YgYWxsIFRGVFAgcGFja2V0cyAqLworc3RydWN0IHRmdHBfY29tbW9uIHsKKwl1aW50MTZfdCBvcGNvZGU7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQSB1bmlvbiBlbmNhcHN1bGF0aW5nIGFsbCBURlRQIHBhY2tldCB0eXBlcyAqLwordW5pb24gdGZ0cF9hbnkgeworCXN0cnVjdCB0ZnRwX2NvbW1vbgljb21tb247CisJc3RydWN0IHRmdHBfcnJxCQlycnE7CisJc3RydWN0IHRmdHBfZGF0YQlkYXRhOworCXN0cnVjdCB0ZnRwX2FjawkJYWNrOworCXN0cnVjdCB0ZnRwX2Vycm9yCWVycm9yOworCXN0cnVjdCB0ZnRwX29hY2sJb2FjazsKK307CisKK2V4dGVybiB2b2lkIHRmdHBfc2V0X3JlcXVlc3RfYmxrc2l6ZSAoIHVuc2lnbmVkIGludCBibGtzaXplICk7CisKKyNlbmRpZiAvKiBfR1BYRV9URlRQX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90aHJlZXdpcmUuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90aHJlZXdpcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjMyODRhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3RocmVld2lyZS5oCkBAIC0wLDAgKzEsMTA1IEBACisjaWZuZGVmIF9HUFhFX1RIUkVFV0lSRV9ICisjZGVmaW5lIF9HUFhFX1RIUkVFV0lSRV9ICisKKy8qKiBAZmlsZQorICoKKyAqIFRocmVlLXdpcmUgc2VyaWFsIGludGVyZmFjZQorICoKKyAqIFRoZSBBdG1lbCB0aHJlZS13aXJlIGludGVyZmFjZSBpcyBhIHN1YnNldCBvZiB0aGUgKG5ld2VyKSBTUEkKKyAqIGludGVyZmFjZSwgYW5kIGlzIGltcGxlbWVudGVkIGhlcmUgYXMgYSBsYXllciBvbiB0b3Agb2YgdGhlIFNQSQorICogc3VwcG9ydC4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL3NwaS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKioKKyAqIEBkZWZncm91cCB0Y21kcyBUaHJlZS13aXJlIGNvbW1hbmRzCisgKiBAeworICovCisKKy8qKiBSZWFkIGRhdGEgZnJvbSBtZW1vcnkgYXJyYXkgKi8KKyNkZWZpbmUgVEhSRUVXSVJFX1JFQUQgMHg2CisKKy8qKiBXcml0ZSBkYXRhIHRvIG1lbW9yeSBhcnJheSAqLworI2RlZmluZSBUSFJFRVdJUkVfV1JJVEUgMHg1CisKKy8qKiBXcml0ZSBlbmFibGUgKi8KKyNkZWZpbmUgVEhSRUVXSVJFX0VXRU4gMHg0CisKKy8qKiBBZGRyZXNzIHRvIGJlIHVzZWQgZm9yIHdyaXRlIGVuYWJsZSBjb21tYW5kICovCisjZGVmaW5lIFRIUkVFV0lSRV9FV0VOX0FERFJFU1MgSU5UX01BWAorCisvKiogVGltZSB0byB3YWl0IGZvciB3cml0ZSBjeWNsZXMgdG8gY29tcGxldGUKKyAqCisgKiBUaGlzIGlzIHN1ZmZpY2llbnQgZm9yIEFUOTNDNDYvQVQ5M0M1NiBkZXZpY2VzLCBidXQgbWF5IG5lZWQgdG8gYmUKKyAqIGluY3JlYXNlZCBpbiBmdXR1cmUgd2hlbiBvdGhlciBkZXZpY2VzIGFyZSBhZGRlZC4KKyAqLworI2RlZmluZSBUSFJFRVdJUkVfV1JJVEVfTURFTEFZIDEwCisKKy8qKiBAfSAqLworCitleHRlcm4gaW50IHRocmVld2lyZV9yZWFkICggc3RydWN0IG52c19kZXZpY2UgKm52cywgdW5zaWduZWQgaW50IGFkZHJlc3MsCisJCQkgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApOworZXh0ZXJuIGludCB0aHJlZXdpcmVfd3JpdGUgKCBzdHJ1Y3QgbnZzX2RldmljZSAqbnZzLCB1bnNpZ25lZCBpbnQgYWRkcmVzcywKKwkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApOworZXh0ZXJuIGludCB0aHJlZXdpcmVfZGV0ZWN0X2FkZHJlc3NfbGVuICggc3RydWN0IHNwaV9kZXZpY2UgKmRldmljZSApOworCisvKioKKyAqIEBkZWZncm91cCB0ZGV2cyBUaHJlZS13aXJlIGRldmljZSB0eXBlcworICogQHsKKyAqLworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitpbml0X2F0OTNjeDYgKCBzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgb3JnYW5pc2F0aW9uICkgeworCWRldmljZS0+bnZzLndvcmRfbGVuX2xvZzIgPSAoICggb3JnYW5pc2F0aW9uID09IDggKSA/IDAgOiAxICk7CisJZGV2aWNlLT5udnMuYmxvY2tfc2l6ZSA9IDE7CisJZGV2aWNlLT5jb21tYW5kX2xlbiA9IDMsCisJZGV2aWNlLT5udnMucmVhZCA9IHRocmVld2lyZV9yZWFkOworCWRldmljZS0+bnZzLndyaXRlID0gdGhyZWV3aXJlX3dyaXRlOworfQorCisvKioKKyAqIEluaXRpYWxpc2UgQXRtZWwgQVQ5M0M0NiBzZXJpYWwgRUVQUk9NCisgKgorICogQHYgZGV2aWNlCQlTUEkgZGV2aWNlCisgKiBAdiBvcmdhbmlzYXRpb24JV29yZCBvcmdhbmlzYXRpb24gKDggb3IgMTYpCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK2luaXRfYXQ5M2M0NiAoIHN0cnVjdCBzcGlfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBvcmdhbmlzYXRpb24gKSB7CisJZGV2aWNlLT5udnMuc2l6ZSA9ICggMTAyNCAvIG9yZ2FuaXNhdGlvbiApOworCWRldmljZS0+YWRkcmVzc19sZW4gPSAoICggb3JnYW5pc2F0aW9uID09IDggKSA/IDcgOiA2ICk7CisJaW5pdF9hdDkzY3g2ICggZGV2aWNlLCBvcmdhbmlzYXRpb24gKTsKK30KKworLyoqCisgKiBJbml0aWFsaXNlIEF0bWVsIEFUOTNDNTYgc2VyaWFsIEVFUFJPTQorICoKKyAqIEB2IGRldmljZQkJU1BJIGRldmljZQorICogQHYgb3JnYW5pc2F0aW9uCVdvcmQgb3JnYW5pc2F0aW9uICg4IG9yIDE2KQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitpbml0X2F0OTNjNTYgKCBzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgb3JnYW5pc2F0aW9uICkgeworCWRldmljZS0+bnZzLnNpemUgPSAoIDIwNDggLyBvcmdhbmlzYXRpb24gKTsKKwlkZXZpY2UtPmFkZHJlc3NfbGVuID0gKCAoIG9yZ2FuaXNhdGlvbiA9PSA4ICkgPyA5IDogOCApOworCWluaXRfYXQ5M2N4NiAoIGRldmljZSwgb3JnYW5pc2F0aW9uICk7Cit9CisKKy8qKgorICogSW5pdGlhbGlzZSBBdG1lbCBBVDkzQzY2IHNlcmlhbCBFRVBST00KKyAqCisgKiBAdiBkZXZpY2UJCVNQSSBkZXZpY2UKKyAqIEB2IG9yZ2FuaXNhdGlvbglXb3JkIG9yZ2FuaXNhdGlvbiAoOCBvciAxNikKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZAoraW5pdF9hdDkzYzY2ICggc3RydWN0IHNwaV9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgaW50IG9yZ2FuaXNhdGlvbiApIHsKKwlkZXZpY2UtPm52cy5zaXplID0gKCA0MDk2IC8gb3JnYW5pc2F0aW9uICk7CisJZGV2aWNlLT5hZGRyZXNzX2xlbiA9ICggKCBvcmdhbmlzYXRpb24gPT0gOCApID8gOSA6IDggKTsKKwlpbml0X2F0OTNjeDYgKCBkZXZpY2UsIG9yZ2FuaXNhdGlvbiApOworfQorCisvKiogQH0gKi8KKworI2VuZGlmIC8qIF9HUFhFX1RIUkVFV0lSRV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGltZXIuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzIyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGltZXIuaApAQCAtMCwwICsxLDc2IEBACisjaWZuZGVmCV9HUFhFX1RJTUVSX0gKKyNkZWZpbmUgX0dQWEVfVElNRVJfSAorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIHRpbWVyIEFQSQorICoKKyAqIFRoZSB0aW1lciBBUEkgcHJvdmlkZXMgdWRlbGF5KCkgZm9yIGZpeGVkIGRlbGF5cywgYW5kIGN1cnJ0aWNrcygpCisgKiBmb3IgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGljayBjb3VudGVyLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvYXBpLmg+CisjaW5jbHVkZSA8Y29uZmlnL3RpbWVyLmg+CisKKy8qKgorICogQ2FsY3VsYXRlIHN0YXRpYyBpbmxpbmUgdGltZXIgQVBJIGZ1bmN0aW9uIG5hbWUKKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICogQHJldCBfc3Vic3lzX2Z1bmMJU3Vic3lzdGVtIEFQSSBmdW5jdGlvbgorICovCisjZGVmaW5lIFRJTUVSX0lOTElORSggX3N1YnN5cywgX2FwaV9mdW5jICkgXAorCVNJTkdMRV9BUElfSU5MSU5FICggVElNRVJfUFJFRklYXyAjIyBfc3Vic3lzLCBfYXBpX2Z1bmMgKQorCisvKioKKyAqIFByb3ZpZGUgYSB0aW1lciBBUEkgaW1wbGVtZW50YXRpb24KKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICogQHYgX2Z1bmMJCUltcGxlbWVudGluZyBmdW5jdGlvbgorICovCisjZGVmaW5lIFBST1ZJREVfVElNRVIoIF9zdWJzeXMsIF9hcGlfZnVuYywgX2Z1bmMgKSBcCisJUFJPVklERV9TSU5HTEVfQVBJICggVElNRVJfUFJFRklYXyAjIyBfc3Vic3lzLCBfYXBpX2Z1bmMsIF9mdW5jICkKKworLyoqCisgKiBQcm92aWRlIGEgc3RhdGljIGlubGluZSB0aW1lciBBUEkgaW1wbGVtZW50YXRpb24KKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICovCisjZGVmaW5lIFBST1ZJREVfVElNRVJfSU5MSU5FKCBfc3Vic3lzLCBfYXBpX2Z1bmMgKSBcCisJUFJPVklERV9TSU5HTEVfQVBJX0lOTElORSAoIFRJTUVSX1BSRUZJWF8gIyMgX3N1YnN5cywgX2FwaV9mdW5jICkKKworLyogSW5jbHVkZSBhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IEkvTyBBUEkgaGVhZGVycyAqLworI2luY2x1ZGUgPGdweGUvZWZpL2VmaV90aW1lci5oPgorCisvKiBJbmNsdWRlIGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IEkvTyBBUEkgaGVhZGVycyAqLworI2luY2x1ZGUgPGJpdHMvdGltZXIuaD4KKworLyoqCisgKiBEZWxheSBmb3IgYSBmaXhlZCBudW1iZXIgb2YgbWljcm9zZWNvbmRzCisgKgorICogQHYgdXNlY3MJCU51bWJlciBvZiBtaWNyb3NlY29uZHMgZm9yIHdoaWNoIHRvIGRlbGF5CisgKi8KK3ZvaWQgdWRlbGF5ICggdW5zaWduZWQgbG9uZyB1c2VjcyApOworCisvKioKKyAqIEdldCBjdXJyZW50IHN5c3RlbSB0aW1lIGluIHRpY2tzCisgKgorICogQHJldCB0aWNrcwkJQ3VycmVudCB0aW1lLCBpbiB0aWNrcworICovCit1bnNpZ25lZCBsb25nIGN1cnJ0aWNrcyAoIHZvaWQgKTsKKworLyoqCisgKiBHZXQgbnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQKKyAqCisgKiBAcmV0IHRpY2tzX3Blcl9zZWMJTnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQKKyAqLwordW5zaWduZWQgbG9uZyB0aWNrc19wZXJfc2VjICggdm9pZCApOworCisvKiogTnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgVElDS1NfUEVSX1NFQyAoIHRpY2tzX3Blcl9zZWMoKSApCisKKyNlbmRpZiAvKiBfR1BYRV9USU1FUl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGxzLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkYTA0NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS90bHMuaApAQCAtMCwwICsxLDE4NyBAQAorI2lmbmRlZiBfR1BYRV9UTFNfSAorI2RlZmluZSBfR1BYRV9UTFNfSAorCisvKioKKyAqIEBmaWxlCisgKgorICogVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IFByb3RvY29sCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Z3B4ZS9yZWZjbnQuaD4KKyNpbmNsdWRlIDxncHhlL2ZpbHRlci5oPgorI2luY2x1ZGUgPGdweGUvcHJvY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvY3J5cHRvLmg+CisjaW5jbHVkZSA8Z3B4ZS9tZDUuaD4KKyNpbmNsdWRlIDxncHhlL3NoYTEuaD4KKyNpbmNsdWRlIDxncHhlL3g1MDkuaD4KKworLyoqIEEgVExTIGhlYWRlciAqLworc3RydWN0IHRsc19oZWFkZXIgeworCS8qKiBDb250ZW50IHR5cGUKKwkgKgorCSAqIFRoaXMgaXMgYSBUTFNfVFlQRV9YWFggY29uc3RhbnQKKwkgKi8KKwl1aW50OF90IHR5cGU7CisJLyoqIFByb3RvY29sIHZlcnNpb24KKwkgKgorCSAqIFRoaXMgaXMgYSBUTFNfVkVSU0lPTl9YWFggY29uc3RhbnQKKwkgKi8KKwl1aW50MTZfdCB2ZXJzaW9uOworCS8qKiBMZW5ndGggb2YgcGF5bG9hZCAqLworCXVpbnQxNl90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBUTFMgdmVyc2lvbiAxLjAgKi8KKyNkZWZpbmUgVExTX1ZFUlNJT05fVExTXzFfMCAweDAzMDEKKworLyoqIFRMUyB2ZXJzaW9uIDEuMSAqLworI2RlZmluZSBUTFNfVkVSU0lPTl9UTFNfMV8xIDB4MDMwMgorCisvKiogQ2hhbmdlIGNpcGhlciBjb250ZW50IHR5cGUgKi8KKyNkZWZpbmUgVExTX1RZUEVfQ0hBTkdFX0NJUEhFUiAyMAorCisvKiogQWxlcnQgY29udGVudCB0eXBlICovCisjZGVmaW5lIFRMU19UWVBFX0FMRVJUIDIxCisKKy8qKiBIYW5kc2hha2UgY29udGVudCB0eXBlICovCisjZGVmaW5lIFRMU19UWVBFX0hBTkRTSEFLRSAyMgorCisvKiogQXBwbGljYXRpb24gZGF0YSBjb250ZW50IHR5cGUgKi8KKyNkZWZpbmUgVExTX1RZUEVfREFUQSAyMworCisvKiBIYW5kc2hha2UgbWVzc2FnZSB0eXBlcyAqLworI2RlZmluZSBUTFNfSEVMTE9fUkVRVUVTVCAwCisjZGVmaW5lIFRMU19DTElFTlRfSEVMTE8gMQorI2RlZmluZSBUTFNfU0VSVkVSX0hFTExPIDIKKyNkZWZpbmUgVExTX0NFUlRJRklDQVRFIDExCisjZGVmaW5lIFRMU19TRVJWRVJfS0VZX0VYQ0hBTkdFIDEyCisjZGVmaW5lIFRMU19DRVJUSUZJQ0FURV9SRVFVRVNUIDEzCisjZGVmaW5lIFRMU19TRVJWRVJfSEVMTE9fRE9ORSAxNAorI2RlZmluZSBUTFNfQ0VSVElGSUNBVEVfVkVSSUZZIDE1CisjZGVmaW5lIFRMU19DTElFTlRfS0VZX0VYQ0hBTkdFIDE2CisjZGVmaW5lIFRMU19GSU5JU0hFRCAyMAorCisvKiBUTFMgYWxlcnQgbGV2ZWxzICovCisjZGVmaW5lIFRMU19BTEVSVF9XQVJOSU5HIDEKKyNkZWZpbmUgVExTX0FMRVJUX0ZBVEFMIDIKKworLyogVExTIGNpcGhlciBzcGVjaWZpY2F0aW9ucyAqLworI2RlZmluZSBUTFNfUlNBX1dJVEhfTlVMTF9NRDUgMHgwMDAxCisjZGVmaW5lIFRMU19SU0FfV0lUSF9OVUxMX1NIQSAweDAwMDIKKyNkZWZpbmUgVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSAweDAwMmYKKyNkZWZpbmUgVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSAweDAwMzUKKworLyoqIFRMUyBSWCBzdGF0ZSBtYWNoaW5lIHN0YXRlICovCitlbnVtIHRsc19yeF9zdGF0ZSB7CisJVExTX1JYX0hFQURFUiA9IDAsCisJVExTX1JYX0RBVEEsCit9OworCisvKiogVExTIFRYIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KK2VudW0gdGxzX3R4X3N0YXRlIHsKKwlUTFNfVFhfTk9ORSA9IDAsCisJVExTX1RYX0NMSUVOVF9IRUxMTywKKwlUTFNfVFhfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwlUTFNfVFhfQ0hBTkdFX0NJUEhFUiwKKwlUTFNfVFhfRklOSVNIRUQsCisJVExTX1RYX0RBVEEKK307CisKKy8qKiBBIFRMUyBjaXBoZXIgc3BlY2lmaWNhdGlvbiAqLworc3RydWN0IHRsc19jaXBoZXJzcGVjIHsKKwkvKiogUHVibGljLWtleSBlbmNyeXB0aW9uIGFsZ29yaXRobSAqLworCXN0cnVjdCBwdWJrZXlfYWxnb3JpdGhtICpwdWJrZXk7CisJLyoqIEJ1bGsgZW5jcnlwdGlvbiBjaXBoZXIgYWxnb3JpdGhtICovCisJc3RydWN0IGNpcGhlcl9hbGdvcml0aG0gKmNpcGhlcjsKKwkvKiogTUFDIGRpZ2VzdCBhbGdvcml0aG0gKi8KKwlzdHJ1Y3QgZGlnZXN0X2FsZ29yaXRobSAqZGlnZXN0OworCS8qKiBLZXkgbGVuZ3RoICovCisJc2l6ZV90IGtleV9sZW47CisJLyoqIER5bmFtaWNhbGx5LWFsbG9jYXRlZCBzdG9yYWdlICovCisJdm9pZCAqZHluYW1pYzsKKwkvKiogUHVibGljIGtleSBlbmNyeXB0aW9uIGNvbnRleHQgKi8KKwl2b2lkICpwdWJrZXlfY3R4OworCS8qKiBCdWxrIGVuY3J5cHRpb24gY2lwaGVyIGNvbnRleHQgKi8KKwl2b2lkICpjaXBoZXJfY3R4OworCS8qKiBOZXh0IGJ1bGsgZW5jcnlwdGlvbiBjaXBoZXIgY29udGV4dCAoVFggb25seSkgKi8KKwl2b2lkICpjaXBoZXJfbmV4dF9jdHg7CisJLyoqIE1BQyBzZWNyZXQgKi8KKwl2b2lkICptYWNfc2VjcmV0OworfTsKKworLyoqIFRMUyBwcmUtbWFzdGVyIHNlY3JldCAqLworc3RydWN0IHRsc19wcmVfbWFzdGVyX3NlY3JldCB7CisJLyoqIFRMUyB2ZXJzaW9uICovCisJdWludDE2X3QgdmVyc2lvbjsKKwkvKiogUmFuZG9tIGRhdGEgKi8KKwl1aW50OF90IHJhbmRvbVs0Nl07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogVExTIGNsaWVudCByYW5kb20gZGF0YSAqLworc3RydWN0IHRsc19jbGllbnRfcmFuZG9tIHsKKwkvKiogR01UIFVuaXggdGltZSAqLworCXVpbnQzMl90IGdtdF91bml4X3RpbWU7CisJLyoqIFJhbmRvbSBkYXRhICovCisJdWludDhfdCByYW5kb21bMjhdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIEEgVExTIHNlc3Npb24gKi8KK3N0cnVjdCB0bHNfc2Vzc2lvbiB7CisJLyoqIFJlZmVyZW5jZSBjb3VudGVyICovCisJc3RydWN0IHJlZmNudCByZWZjbnQ7CisKKwkvKiogUGxhaW50ZXh0IHN0cmVhbSAqLworCXN0cnVjdCB4ZmVyX2ZpbHRlcl9oYWxmIHBsYWluc3RyZWFtOworCS8qKiBDaXBoZXJ0ZXh0IHN0cmVhbSAqLworCXN0cnVjdCB4ZmVyX2ZpbHRlcl9oYWxmIGNpcGhlcnN0cmVhbTsKKworCS8qKiBDdXJyZW50IFRYIGNpcGhlciBzcGVjaWZpY2F0aW9uICovCisJc3RydWN0IHRsc19jaXBoZXJzcGVjIHR4X2NpcGhlcnNwZWM7CisJLyoqIE5leHQgVFggY2lwaGVyIHNwZWNpZmljYXRpb24gKi8KKwlzdHJ1Y3QgdGxzX2NpcGhlcnNwZWMgdHhfY2lwaGVyc3BlY19wZW5kaW5nOworCS8qKiBDdXJyZW50IFJYIGNpcGhlciBzcGVjaWZpY2F0aW9uICovCisJc3RydWN0IHRsc19jaXBoZXJzcGVjIHJ4X2NpcGhlcnNwZWM7CisJLyoqIE5leHQgUlggY2lwaGVyIHNwZWNpZmljYXRpb24gKi8KKwlzdHJ1Y3QgdGxzX2NpcGhlcnNwZWMgcnhfY2lwaGVyc3BlY19wZW5kaW5nOworCS8qKiBQcmVtYXN0ZXIgc2VjcmV0ICovCisJc3RydWN0IHRsc19wcmVfbWFzdGVyX3NlY3JldCBwcmVfbWFzdGVyX3NlY3JldDsKKwkvKiogTWFzdGVyIHNlY3JldCAqLworCXVpbnQ4X3QgbWFzdGVyX3NlY3JldFs0OF07CisJLyoqIFNlcnZlciByYW5kb20gYnl0ZXMgKi8KKwl1aW50OF90IHNlcnZlcl9yYW5kb21bMzJdOworCS8qKiBDbGllbnQgcmFuZG9tIGJ5dGVzICovCisJc3RydWN0IHRsc19jbGllbnRfcmFuZG9tIGNsaWVudF9yYW5kb207CisJLyoqIE1ENSBjb250ZXh0IGZvciBoYW5kc2hha2UgdmVyaWZpY2F0aW9uICovCisJdWludDhfdCBoYW5kc2hha2VfbWQ1X2N0eFtNRDVfQ1RYX1NJWkVdOworCS8qKiBTSEExIGNvbnRleHQgZm9yIGhhbmRzaGFrZSB2ZXJpZmljYXRpb24gKi8KKwl1aW50OF90IGhhbmRzaGFrZV9zaGExX2N0eFtTSEExX0NUWF9TSVpFXTsKKworCS8qKiBIYWNrOiBzZXJ2ZXIgUlNBIHB1YmxpYyBrZXkgKi8KKwlzdHJ1Y3QgeDUwOV9yc2FfcHVibGljX2tleSByc2E7CisKKwkvKiogVFggc2VxdWVuY2UgbnVtYmVyICovCisJdWludDY0X3QgdHhfc2VxOworCS8qKiBUWCBzdGF0ZSAqLworCWVudW0gdGxzX3R4X3N0YXRlIHR4X3N0YXRlOworCS8qKiBUWCBwcm9jZXNzICovCisJc3RydWN0IHByb2Nlc3MgcHJvY2VzczsKKworCS8qKiBSWCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1aW50NjRfdCByeF9zZXE7CisJLyoqIFJYIHN0YXRlICovCisJZW51bSB0bHNfcnhfc3RhdGUgcnhfc3RhdGU7CisJLyoqIE9mZnNldCB3aXRoaW4gY3VycmVudCBSWCBzdGF0ZSAqLworCXNpemVfdCByeF9yY3ZkOworCS8qKiBDdXJyZW50IHJlY2VpdmVkIHJlY29yZCBoZWFkZXIgKi8KKwlzdHJ1Y3QgdGxzX2hlYWRlciByeF9oZWFkZXI7CisJLyoqIEN1cnJlbnQgcmVjZWl2ZWQgcmF3IGRhdGEgYnVmZmVyICovCisJdm9pZCAqcnhfZGF0YTsKK307CisKK2V4dGVybiBpbnQgYWRkX3RscyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJICAgICBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKipuZXh0ICk7CisKKyNlbmRpZiAvKiBfR1BYRV9UTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3VhY2Nlc3MuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS91YWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4ZjI5MgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS91YWNjZXNzLmgKQEAgLTAsMCArMSwzNDQgQEAKKyNpZm5kZWYgX0dQWEVfVUFDQ0VTU19ICisjZGVmaW5lIF9HUFhFX1VBQ0NFU1NfSAorCisvKioKKyAqIEBmaWxlCisgKgorICogQWNjZXNzIHRvIGV4dGVybmFsICgidXNlciIpIG1lbW9yeQorICoKKyAqIGdQWEUgb2Z0ZW4gbmVlZHMgdG8gdHJhbnNmZXIgZGF0YSBiZXR3ZWVuIGludGVybmFsIGFuZCBleHRlcm5hbAorICogYnVmZmVycy4gIE9uIGkzODYsIHRoZSBleHRlcm5hbCBidWZmZXJzIG1heSByZXF1aXJlIGFjY2VzcyB2aWEgYQorICogZGlmZmVyZW50IHNlZ21lbnQsIGFuZCB0aGUgYnVmZmVyIGFkZHJlc3MgY2Fubm90IGJlIGVuY29kZWQgaW50byBhCisgKiBzaW1wbGUgdm9pZCAqIHBvaW50ZXIuICBUaGUgQGMgdXNlcnB0cl90IHR5cGUgZW5jYXBzdWxhdGVzIHRoZQorICogaW5mb3JtYXRpb24gbmVlZGVkIHRvIGlkZW50aWZ5IGFuIGV4dGVybmFsIGJ1ZmZlciwgYW5kIHRoZQorICogY29weV90b191c2VyKCkgYW5kIGNvcHlfZnJvbV91c2VyKCkgZnVuY3Rpb25zIHByb3ZpZGUgbWV0aG9kcyBmb3IKKyAqIHRyYW5zZmVycmluZyBkYXRhIGJldHdlZW4gaW50ZXJuYWwgYW5kIGV4dGVybmFsIGJ1ZmZlcnMuCisgKgorICogTm90ZSB0aGF0IHVzZXJwdHJfdCBpcyBhbiBvcGFxdWUgdHlwZTsgaW4gcGFydGljdWxhciwgcGVyZm9ybWluZworICogYXJpdGhtZXRpYyB1cG9uIGEgdXNlcnB0cl90IGlzIG5vdCBhbGxvd2VkLgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxncHhlL2FwaS5oPgorI2luY2x1ZGUgPGNvbmZpZy9pb2FwaS5oPgorCisvKioKKyAqIEEgcG9pbnRlciB0byBhIHVzZXIgYnVmZmVyCisgKgorICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdXNlcnB0cl90OworCisvKiogRXF1aXZhbGVudCBvZiBOVUxMIGZvciB1c2VyIHBvaW50ZXJzICovCisjZGVmaW5lIFVOVUxMICggKCB1c2VycHRyX3QgKSAwICkKKworLyoqCisgKiBAZGVmZ3JvdXAgdWFjY2Vzc190cml2aWFsIFRyaXZpYWwgdXNlciBhY2Nlc3MgQVBJIGltcGxlbWVudGF0aW9ucworICoKKyAqIFVzZXIgYWNjZXNzIEFQSSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBieSBlbnZpcm9ubWVudHMgaW4KKyAqIHdoaWNoIHZpcnR1YWwgYWRkcmVzc2VzIGFsbG93IGFjY2VzcyB0byBhbGwgb2YgbWVtb3J5LgorICoKKyAqIEB7CisgKgorICovCisKKy8qKgorICogQ29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gdXNlciBwb2ludGVyCisgKgorICogQHYgYWRkcgkJVmlydHVhbCBhZGRyZXNzCisgKiBAcmV0IHVzZXJwdHIJCVVzZXIgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1c2VycHRyX3QKK3RyaXZpYWxfdmlydF90b191c2VyICggdm9sYXRpbGUgY29uc3Qgdm9pZCAqYWRkciApIHsKKwlyZXR1cm4gKCAoIHVzZXJwdHJfdCApIGFkZHIgKTsKK30KKworLyoqCisgKiBDb252ZXJ0IHVzZXIgcG9pbnRlciB0byB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBAdiB1c2VycHRyCQlVc2VyIHBvaW50ZXIKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IGZyb20gdXNlciBwb2ludGVyCisgKiBAcmV0IGFkZHIJCVZpcnR1YWwgYWRkcmVzcworICoKKyAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBhdmFpbGFibGUgdW5kZXIgYWxsIG1lbW9yeSBtb2RlbHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQgKgordHJpdmlhbF91c2VyX3RvX3ZpcnQgKCB1c2VycHRyX3QgdXNlcnB0ciwgb2ZmX3Qgb2Zmc2V0ICkgeworCXJldHVybiAoICggdm9pZCAqICkgdXNlcnB0ciArIG9mZnNldCApOworfQorCisvKioKKyAqIEFkZCBvZmZzZXQgdG8gdXNlciBwb2ludGVyCisgKgorICogQHYgdXNlcnB0cgkJVXNlciBwb2ludGVyCisgKiBAdiBvZmZzZXQJCU9mZnNldAorICogQHJldCB1c2VycHRyCQlOZXcgcG9pbnRlciB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1c2VycHRyX3QKK3RyaXZpYWxfdXNlcnB0cl9hZGQgKCB1c2VycHRyX3QgdXNlcnB0ciwgb2ZmX3Qgb2Zmc2V0ICkgeworCXJldHVybiAoIHVzZXJwdHIgKyBvZmZzZXQgKTsKK30KKworLyoqCisgKiBDb3B5IGRhdGEgYmV0d2VlbiB1c2VyIGJ1ZmZlcnMKKyAqCisgKiBAdiBkZXN0CQlEZXN0aW5hdGlvbgorICogQHYgZGVzdF9vZmYJCURlc3RpbmF0aW9uIG9mZnNldAorICogQHYgc3JjCQlTb3VyY2UKKyAqIEB2IHNyY19vZmYJCVNvdXJjZSBvZmZzZXQKKyAqIEB2IGxlbgkJTGVuZ3RoCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK3RyaXZpYWxfbWVtY3B5X3VzZXIgKCB1c2VycHRyX3QgZGVzdCwgb2ZmX3QgZGVzdF9vZmYsCisJCSAgICAgIHVzZXJwdHJfdCBzcmMsIG9mZl90IHNyY19vZmYsIHNpemVfdCBsZW4gKSB7CisJbWVtY3B5ICggKCAoIHZvaWQgKiApIGRlc3QgKyBkZXN0X29mZiApLAorCQkgKCAoIHZvaWQgKiApIHNyYyArIHNyY19vZmYgKSwgbGVuICk7Cit9CisKKy8qKgorICogQ29weSBkYXRhIGJldHdlZW4gdXNlciBidWZmZXJzLCBhbGxvd2luZyBmb3Igb3ZlcmxhcAorICoKKyAqIEB2IGRlc3QJCURlc3RpbmF0aW9uCisgKiBAdiBkZXN0X29mZgkJRGVzdGluYXRpb24gb2Zmc2V0CisgKiBAdiBzcmMJCVNvdXJjZQorICogQHYgc3JjX29mZgkJU291cmNlIG9mZnNldAorICogQHYgbGVuCQlMZW5ndGgKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAordHJpdmlhbF9tZW1tb3ZlX3VzZXIgKCB1c2VycHRyX3QgZGVzdCwgb2ZmX3QgZGVzdF9vZmYsCisJCSAgICAgICB1c2VycHRyX3Qgc3JjLCBvZmZfdCBzcmNfb2ZmLCBzaXplX3QgbGVuICkgeworCW1lbW1vdmUgKCAoICggdm9pZCAqICkgZGVzdCArIGRlc3Rfb2ZmICksCisJCSAgKCAoIHZvaWQgKiApIHNyYyArIHNyY19vZmYgKSwgbGVuICk7Cit9CisKKy8qKgorICogRmlsbCB1c2VyIGJ1ZmZlciB3aXRoIGEgY29uc3RhbnQgYnl0ZQorICoKKyAqIEB2IGJ1ZmZlcgkJVXNlciBidWZmZXIKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IHdpdGhpbiBidWZmZXIKKyAqIEB2IGMJCQlDb25zdGFudCBieXRlIHdpdGggd2hpY2ggdG8gZmlsbAorICogQHYgbGVuCQlMZW5ndGgKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdm9pZAordHJpdmlhbF9tZW1zZXRfdXNlciAoIHVzZXJwdHJfdCBidWZmZXIsIG9mZl90IG9mZnNldCwgaW50IGMsIHNpemVfdCBsZW4gKSB7CisJbWVtc2V0ICggKCAoIHZvaWQgKiApIGJ1ZmZlciArIG9mZnNldCApLCBjLCBsZW4gKTsKK30KKworLyoqCisgKiBGaW5kIGxlbmd0aCBvZiBOVUwtdGVybWluYXRlZCBzdHJpbmcgaW4gdXNlciBidWZmZXIKKyAqCisgKiBAdiBidWZmZXIJCVVzZXIgYnVmZmVyCisgKiBAdiBvZmZzZXQJCU9mZnNldCB3aXRoaW4gYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHN0cmluZyAoZXhjbHVkaW5nIE5VTCkKKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgc2l6ZV90Cit0cml2aWFsX3N0cmxlbl91c2VyICggdXNlcnB0cl90IGJ1ZmZlciwgb2ZmX3Qgb2Zmc2V0ICkgeworCXJldHVybiBzdHJsZW4gKCAoIHZvaWQgKiApIGJ1ZmZlciArIG9mZnNldCApOworfQorCisvKioKKyAqIEZpbmQgY2hhcmFjdGVyIGluIHVzZXIgYnVmZmVyCisgKgorICogQHYgYnVmZmVyCQlVc2VyIGJ1ZmZlcgorICogQHYgb2Zmc2V0CQlTdGFydGluZyBvZmZzZXQgd2l0aGluIGJ1ZmZlcgorICogQHYgYwkJCUNoYXJhY3RlciB0byBzZWFyY2ggZm9yCisgKiBAdiBsZW4JCUxlbmd0aCBvZiB1c2VyIGJ1ZmZlcgorICogQHJldCBvZmZzZXQJCU9mZnNldCBvZiBjaGFyYWN0ZXIsIG9yIDwwIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSBvZmZfdAordHJpdmlhbF9tZW1jaHJfdXNlciAoIHVzZXJwdHJfdCBidWZmZXIsIG9mZl90IG9mZnNldCwgaW50IGMsIHNpemVfdCBsZW4gKSB7CisJdm9pZCAqZm91bmQ7CisKKwlmb3VuZCA9IG1lbWNociAoICggKCB2b2lkICogKSBidWZmZXIgKyBvZmZzZXQgKSwgYywgbGVuICk7CisJcmV0dXJuICggZm91bmQgPyAoIGZvdW5kIC0gKCB2b2lkICogKSBidWZmZXIgKSA6IC0xICk7Cit9CisKKy8qKiBAfSAqLworCisvKioKKyAqIENhbGN1bGF0ZSBzdGF0aWMgaW5saW5lIHVzZXIgYWNjZXNzIEFQSSBmdW5jdGlvbiBuYW1lCisgKgorICogQHYgX3ByZWZpeAkJU3Vic3lzdGVtIHByZWZpeAorICogQHYgX2FwaV9mdW5jCQlBUEkgZnVuY3Rpb24KKyAqIEByZXQgX3N1YnN5c19mdW5jCVN1YnN5c3RlbSBBUEkgZnVuY3Rpb24KKyAqLworI2RlZmluZSBVQUNDRVNTX0lOTElORSggX3N1YnN5cywgX2FwaV9mdW5jICkgXAorCVNJTkdMRV9BUElfSU5MSU5FICggVUFDQ0VTU19QUkVGSVhfICMjIF9zdWJzeXMsIF9hcGlfZnVuYyApCisKKy8qKgorICogUHJvdmlkZSBhbiB1c2VyIGFjY2VzcyBBUEkgaW1wbGVtZW50YXRpb24KKyAqCisgKiBAdiBfcHJlZml4CQlTdWJzeXN0ZW0gcHJlZml4CisgKiBAdiBfYXBpX2Z1bmMJCUFQSSBmdW5jdGlvbgorICogQHYgX2Z1bmMJCUltcGxlbWVudGluZyBmdW5jdGlvbgorICovCisjZGVmaW5lIFBST1ZJREVfVUFDQ0VTUyggX3N1YnN5cywgX2FwaV9mdW5jLCBfZnVuYyApIFwKKwlQUk9WSURFX1NJTkdMRV9BUEkgKCBVQUNDRVNTX1BSRUZJWF8gIyMgX3N1YnN5cywgX2FwaV9mdW5jLCBfZnVuYyApCisKKy8qKgorICogUHJvdmlkZSBhIHN0YXRpYyBpbmxpbmUgdXNlciBhY2Nlc3MgQVBJIGltcGxlbWVudGF0aW9uCisgKgorICogQHYgX3ByZWZpeAkJU3Vic3lzdGVtIHByZWZpeAorICogQHYgX2FwaV9mdW5jCQlBUEkgZnVuY3Rpb24KKyAqLworI2RlZmluZSBQUk9WSURFX1VBQ0NFU1NfSU5MSU5FKCBfc3Vic3lzLCBfYXBpX2Z1bmMgKSBcCisJUFJPVklERV9TSU5HTEVfQVBJX0lOTElORSAoIFVBQ0NFU1NfUFJFRklYXyAjIyBfc3Vic3lzLCBfYXBpX2Z1bmMgKQorCisvKiBJbmNsdWRlIGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgdXNlciBhY2Nlc3MgQVBJIGhlYWRlcnMgKi8KKyNpbmNsdWRlIDxncHhlL2VmaS9lZmlfdWFjY2Vzcy5oPgorCisvKiBJbmNsdWRlIGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHVzZXIgYWNjZXNzIEFQSSBoZWFkZXJzICovCisjaW5jbHVkZSA8Yml0cy91YWNjZXNzLmg+CisKKy8qKgorICogQ29udmVydCBwaHlzaWNhbCBhZGRyZXNzIHRvIHVzZXIgcG9pbnRlcgorICoKKyAqIEB2IHBoeXNfYWRkcgkJUGh5c2ljYWwgYWRkcmVzcworICogQHJldCB1c2VycHRyCQlVc2VyIHBvaW50ZXIKKyAqLwordXNlcnB0cl90IHBoeXNfdG9fdXNlciAoIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyICk7CisKKy8qKgorICogQ29udmVydCB1c2VyIHBvaW50ZXIgdG8gcGh5c2ljYWwgYWRkcmVzcworICoKKyAqIEB2IHVzZXJwdHIJCVVzZXIgcG9pbnRlcgorICogQHYgb2Zmc2V0CQlPZmZzZXQgZnJvbSB1c2VyIHBvaW50ZXIKKyAqIEByZXQgcGh5c19hZGRyCVBoeXNpY2FsIGFkZHJlc3MKKyAqLwordW5zaWduZWQgbG9uZyB1c2VyX3RvX3BoeXMgKCB1c2VycHRyX3QgdXNlcnB0ciwgb2ZmX3Qgb2Zmc2V0ICk7CisKKy8qKgorICogQ29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gdXNlciBwb2ludGVyCisgKgorICogQHYgYWRkcgkJVmlydHVhbCBhZGRyZXNzCisgKiBAcmV0IHVzZXJwdHIJCVVzZXIgcG9pbnRlcgorICovCit1c2VycHRyX3QgdmlydF90b191c2VyICggdm9sYXRpbGUgY29uc3Qgdm9pZCAqYWRkciApOworCisvKioKKyAqIENvbnZlcnQgdXNlciBwb2ludGVyIHRvIHZpcnR1YWwgYWRkcmVzcworICoKKyAqIEB2IHVzZXJwdHIJCVVzZXIgcG9pbnRlcgorICogQHYgb2Zmc2V0CQlPZmZzZXQgZnJvbSB1c2VyIHBvaW50ZXIKKyAqIEByZXQgYWRkcgkJVmlydHVhbCBhZGRyZXNzCisgKgorICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGF2YWlsYWJsZSB1bmRlciBhbGwgbWVtb3J5IG1vZGVscy4KKyAqLwordm9pZCAqIHVzZXJfdG9fdmlydCAoIHVzZXJwdHJfdCB1c2VycHRyLCBvZmZfdCBvZmZzZXQgKTsKKworLyoqCisgKiBBZGQgb2Zmc2V0IHRvIHVzZXIgcG9pbnRlcgorICoKKyAqIEB2IHVzZXJwdHIJCVVzZXIgcG9pbnRlcgorICogQHYgb2Zmc2V0CQlPZmZzZXQKKyAqIEByZXQgdXNlcnB0cgkJTmV3IHBvaW50ZXIgdmFsdWUKKyAqLwordXNlcnB0cl90IHVzZXJwdHJfYWRkICggdXNlcnB0cl90IHVzZXJwdHIsIG9mZl90IG9mZnNldCApOworCisvKioKKyAqIENvbnZlcnQgdmlydHVhbCBhZGRyZXNzIHRvIGEgcGh5c2ljYWwgYWRkcmVzcworICoKKyAqIEB2IGFkZHIJCVZpcnR1YWwgYWRkcmVzcworICogQHJldCBwaHlzX2FkZHIJUGh5c2ljYWwgYWRkcmVzcworICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCit2aXJ0X3RvX3BoeXMgKCB2b2xhdGlsZSBjb25zdCB2b2lkICphZGRyICkgeworCXJldHVybiB1c2VyX3RvX3BoeXMgKCB2aXJ0X3RvX3VzZXIgKCBhZGRyICksIDAgKTsKK30KKworLyoqCisgKiBDb252ZXJ0IHBoeXNpY2FsIGFkZHJlc3MgdG8gYSB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBAdiBhZGRyCQlWaXJ0dWFsIGFkZHJlc3MKKyAqIEByZXQgcGh5c19hZGRyCVBoeXNpY2FsIGFkZHJlc3MKKyAqCisgKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlIHVuZGVyIGFsbCBtZW1vcnkgbW9kZWxzLgorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkICogcGh5c190b192aXJ0ICggdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgKSB7CisJcmV0dXJuIHVzZXJfdG9fdmlydCAoIHBoeXNfdG9fdXNlciAoIHBoeXNfYWRkciApLCAwICk7Cit9CisKKy8qKgorICogQ29weSBkYXRhIGJldHdlZW4gdXNlciBidWZmZXJzCisgKgorICogQHYgZGVzdAkJRGVzdGluYXRpb24KKyAqIEB2IGRlc3Rfb2ZmCQlEZXN0aW5hdGlvbiBvZmZzZXQKKyAqIEB2IHNyYwkJU291cmNlCisgKiBAdiBzcmNfb2ZmCQlTb3VyY2Ugb2Zmc2V0CisgKiBAdiBsZW4JCUxlbmd0aAorICovCit2b2lkIG1lbWNweV91c2VyICggdXNlcnB0cl90IGRlc3QsIG9mZl90IGRlc3Rfb2ZmLAorCQkgICB1c2VycHRyX3Qgc3JjLCBvZmZfdCBzcmNfb2ZmLCBzaXplX3QgbGVuICk7CisKKy8qKgorICogQ29weSBkYXRhIHRvIHVzZXIgYnVmZmVyCisgKgorICogQHYgZGVzdAkJRGVzdGluYXRpb24KKyAqIEB2IGRlc3Rfb2ZmCQlEZXN0aW5hdGlvbiBvZmZzZXQKKyAqIEB2IHNyYwkJU291cmNlCisgKiBAdiBsZW4JCUxlbmd0aAorICovCitzdGF0aWMgaW5saW5lIF9fYWx3YXlzX2lubGluZSB2b2lkCitjb3B5X3RvX3VzZXIgKCB1c2VycHRyX3QgZGVzdCwgb2ZmX3QgZGVzdF9vZmYsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbiApIHsKKwltZW1jcHlfdXNlciAoIGRlc3QsIGRlc3Rfb2ZmLCB2aXJ0X3RvX3VzZXIgKCBzcmMgKSwgMCwgbGVuICk7Cit9CisKKy8qKgorICogQ29weSBkYXRhIGZyb20gdXNlciBidWZmZXIKKyAqCisgKiBAdiBkZXN0CQlEZXN0aW5hdGlvbgorICogQHYgc3JjCQlTb3VyY2UKKyAqIEB2IHNyY19vZmYJCVNvdXJjZSBvZmZzZXQKKyAqIEB2IGxlbgkJTGVuZ3RoCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQKK2NvcHlfZnJvbV91c2VyICggdm9pZCAqZGVzdCwgdXNlcnB0cl90IHNyYywgb2ZmX3Qgc3JjX29mZiwgc2l6ZV90IGxlbiApIHsKKwltZW1jcHlfdXNlciAoIHZpcnRfdG9fdXNlciAoIGRlc3QgKSwgMCwgc3JjLCBzcmNfb2ZmLCBsZW4gKTsKK30KKworLyoqCisgKiBDb3B5IGRhdGEgYmV0d2VlbiB1c2VyIGJ1ZmZlcnMsIGFsbG93aW5nIGZvciBvdmVybGFwCisgKgorICogQHYgZGVzdAkJRGVzdGluYXRpb24KKyAqIEB2IGRlc3Rfb2ZmCQlEZXN0aW5hdGlvbiBvZmZzZXQKKyAqIEB2IHNyYwkJU291cmNlCisgKiBAdiBzcmNfb2ZmCQlTb3VyY2Ugb2Zmc2V0CisgKiBAdiBsZW4JCUxlbmd0aAorICovCit2b2lkIG1lbW1vdmVfdXNlciAoIHVzZXJwdHJfdCBkZXN0LCBvZmZfdCBkZXN0X29mZiwKKwkJICAgIHVzZXJwdHJfdCBzcmMsIG9mZl90IHNyY19vZmYsIHNpemVfdCBsZW4gKTsKKworLyoqCisgKiBGaWxsIHVzZXIgYnVmZmVyIHdpdGggYSBjb25zdGFudCBieXRlCisgKgorICogQHYgdXNlcnB0cgkJVXNlciBidWZmZXIKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IHdpdGhpbiBidWZmZXIKKyAqIEB2IGMJCQlDb25zdGFudCBieXRlIHdpdGggd2hpY2ggdG8gZmlsbAorICogQHYgbGVuCQlMZW5ndGgKKyAqLwordm9pZCBtZW1zZXRfdXNlciAoIHVzZXJwdHJfdCB1c2VycHRyLCBvZmZfdCBvZmZzZXQsIGludCBjLCBzaXplX3QgbGVuICk7CisKKy8qKgorICogRmluZCBsZW5ndGggb2YgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGluIHVzZXIgYnVmZmVyCisgKgorICogQHYgdXNlcnB0cgkJVXNlciBidWZmZXIKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IHdpdGhpbiBidWZmZXIKKyAqIEByZXQgbGVuCQlMZW5ndGggb2Ygc3RyaW5nIChleGNsdWRpbmcgTlVMKQorICovCitzaXplX3Qgc3RybGVuX3VzZXIgKCB1c2VycHRyX3QgdXNlcnB0ciwgb2ZmX3Qgb2Zmc2V0ICk7CisKKy8qKgorICogRmluZCBjaGFyYWN0ZXIgaW4gdXNlciBidWZmZXIKKyAqCisgKiBAdiB1c2VycHRyCQlVc2VyIGJ1ZmZlcgorICogQHYgb2Zmc2V0CQlTdGFydGluZyBvZmZzZXQgd2l0aGluIGJ1ZmZlcgorICogQHYgYwkJCUNoYXJhY3RlciB0byBzZWFyY2ggZm9yCisgKiBAdiBsZW4JCUxlbmd0aCBvZiB1c2VyIGJ1ZmZlcgorICogQHJldCBvZmZzZXQJCU9mZnNldCBvZiBjaGFyYWN0ZXIsIG9yIDwwIGlmIG5vdCBmb3VuZAorICovCitvZmZfdCBtZW1jaHJfdXNlciAoIHVzZXJwdHJfdCB1c2VycHRyLCBvZmZfdCBvZmZzZXQsIGludCBjLCBzaXplX3QgbGVuICk7CisKKyNlbmRpZiAvKiBfR1BYRV9VQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS91ZHAuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS91ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBjNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3VkcC5oCkBAIC0wLDAgKzEsNDggQEAKKyNpZm5kZWYgX0dQWEVfVURQX0gKKyNkZWZpbmUgX0dQWEVfVURQX0gKKworLyoqIEBmaWxlCisgKgorICogVURQIHByb3RvY29sCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGdQWEUgVURQIEFQSS4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvdGNwaXAuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisKK3N0cnVjdCB4ZmVyX2ludGVyZmFjZTsKKworLyoqCisgKiBVRFAgY29uc3RhbnRzCisgKi8KKworI2RlZmluZSBVRFBfTUFYX0hMRU4JNzIKKyNkZWZpbmUgVURQX01BWF9UWElPQglFVEhfTUFYX01UVQorI2RlZmluZSBVRFBfTUlOX1RYSU9CCUVUSF9aTEVOCisKKy8qKgorICogQSBVRFAgaGVhZGVyCisgKi8KK3N0cnVjdCB1ZHBfaGVhZGVyIHsKKwkvKiogU291cmNlIHBvcnQgKi8KKwl1aW50MTZfdCBzcmM7CisJLyoqIERlc3RpbmF0aW9uIHBvcnQgKi8KKwl1aW50MTZfdCBkZXN0OworCS8qKiBMZW5ndGggKi8KKwl1aW50MTZfdCBsZW47CisJLyoqIENoZWNrc3VtICovCisJdWludDE2X3QgY2hrc3VtOworfTsKKworZXh0ZXJuIGludCB1ZHBfb3Blbl9wcm9taXNjICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyICk7CitleHRlcm4gaW50IHVkcF9vcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIsCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqbG9jYWwgKTsKKworI2VuZGlmIC8qIF9HUFhFX1VEUF9IICovCisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS91bWFsbG9jLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdW1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTU1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdW1hbGxvYy5oCkBAIC0wLDAgKzEsNjggQEAKKyNpZm5kZWYgX0dQWEVfVU1BTExPQ19ICisjZGVmaW5lIF9HUFhFX1VNQUxMT0NfSAorCisvKioKKyAqIEBmaWxlCisgKgorICogVXNlciBtZW1vcnkgYWxsb2NhdGlvbgorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL2FwaS5oPgorI2luY2x1ZGUgPGNvbmZpZy91bWFsbG9jLmg+CisjaW5jbHVkZSA8Z3B4ZS91YWNjZXNzLmg+CisKKy8qKgorICogUHJvdmlkZSBhIHVzZXIgbWVtb3J5IGFsbG9jYXRpb24gQVBJIGltcGxlbWVudGF0aW9uCisgKgorICogQHYgX3ByZWZpeAkJU3Vic3lzdGVtIHByZWZpeAorICogQHYgX2FwaV9mdW5jCQlBUEkgZnVuY3Rpb24KKyAqIEB2IF9mdW5jCQlJbXBsZW1lbnRpbmcgZnVuY3Rpb24KKyAqLworI2RlZmluZSBQUk9WSURFX1VNQUxMT0MoIF9zdWJzeXMsIF9hcGlfZnVuYywgX2Z1bmMgKSBcCisJUFJPVklERV9TSU5HTEVfQVBJICggVU1BTExPQ19QUkVGSVhfICMjIF9zdWJzeXMsIF9hcGlfZnVuYywgX2Z1bmMgKQorCisvKiBJbmNsdWRlIGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgSS9PIEFQSSBoZWFkZXJzICovCisjaW5jbHVkZSA8Z3B4ZS9lZmkvZWZpX3VtYWxsb2MuaD4KKworLyogSW5jbHVkZSBhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBJL08gQVBJIGhlYWRlcnMgKi8KKyNpbmNsdWRlIDxiaXRzL3VtYWxsb2MuaD4KKworLyoqCisgKiBSZWFsbG9jYXRlIGV4dGVybmFsIG1lbW9yeQorICoKKyAqIEB2IHVzZXJwdHIJCU1lbW9yeSBwcmV2aW91c2x5IGFsbG9jYXRlZCBieSB1bWFsbG9jKCksIG9yIFVOVUxMCisgKiBAdiBuZXdfc2l6ZQkJUmVxdWVzdGVkIHNpemUKKyAqIEByZXQgdXNlcnB0cgkJQWxsb2NhdGVkIG1lbW9yeSwgb3IgVU5VTEwKKyAqCisgKiBDYWxsaW5nIHJlYWxsb2MoKSB3aXRoIGEgbmV3IHNpemUgb2YgemVybyBpcyBhIHZhbGlkIHdheSB0byBmcmVlIGEKKyAqIG1lbW9yeSBibG9jay4KKyAqLwordXNlcnB0cl90IHVyZWFsbG9jICggdXNlcnB0cl90IHVzZXJwdHIsIHNpemVfdCBuZXdfc2l6ZSApOworCisvKioKKyAqIEFsbG9jYXRlIGV4dGVybmFsIG1lbW9yeQorICoKKyAqIEB2IHNpemUJCVJlcXVlc3RlZCBzaXplCisgKiBAcmV0IHVzZXJwdHIJCU1lbW9yeSwgb3IgVU5VTEwKKyAqCisgKiBNZW1vcnkgaXMgZ3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHRvIGEgcGFnZSBib3VuZGFyeS4KKyAqLworc3RhdGljIGlubGluZSBfX2Fsd2F5c19pbmxpbmUgdXNlcnB0cl90IHVtYWxsb2MgKCBzaXplX3Qgc2l6ZSApIHsKKwlyZXR1cm4gdXJlYWxsb2MgKCBVTlVMTCwgc2l6ZSApOworfQorCisvKioKKyAqIEZyZWUgZXh0ZXJuYWwgbWVtb3J5CisgKgorICogQHYgdXNlcnB0cgkJTWVtb3J5IGFsbG9jYXRlZCBieSB1bWFsbG9jKCksIG9yIFVOVUxMCisgKgorICogSWYgQGMgcHRyIGlzIFVOVUxMLCBubyBhY3Rpb24gaXMgdGFrZW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQgdWZyZWUgKCB1c2VycHRyX3QgdXNlcnB0ciApIHsKKwl1cmVhbGxvYyAoIHVzZXJwdHIsIDAgKTsKK30KKworI2VuZGlmIC8qIF9HUFhFX1VNQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3VyaS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3VyaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNWQwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdXJpLmgKQEAgLTAsMCArMSwxODIgQEAKKyNpZm5kZWYgX0dQWEVfVVJJX0gKKyNkZWZpbmUgX0dQWEVfVVJJX0gKKworLyoqIEBmaWxlCisgKgorICogVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxncHhlL3JlZmNudC5oPgorCisvKiogQSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIKKyAqCisgKiBUZXJtaW5vbG9neSBmb3IgdGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBhcyBwZXIgdXJpKDcpLCBleGNlcHQgdGhhdAorICogInBhdGgiIGlzIGRlZmluZWQgdG8gaW5jbHVkZSB0aGUgbGVhZGluZyAnLycgZm9yIGFuIGFic29sdXRlIHBhdGguCisgKgorICogTm90ZSB0aGF0IGFsbCBmaWVsZHMgd2l0aGluIGEgVVJJIGFyZSBvcHRpb25hbCBhbmQgbWF5IGJlIE5VTEwuCisgKgorICogVGhlIHBvaW50ZXJzIHRvIHRoZSB2YXJpb3VzIGZpZWxkcyBhcmUgcGFja2VkIHRvZ2V0aGVyIHNvIHRoZXkgY2FuCisgKiBiZSBhY2Nlc3NlZCBpbiBhcnJheSBmYXNoaW9uIGluIHNvbWUgcGxhY2VzIGluIHVyaS5jIHdoZXJlIGRvaW5nIHNvCisgKiBzYXZlcyBzaWduaWZpY2FudCBjb2RlIHNpemUuCisgKgorICogU29tZSBleGFtcGxlcyBhcmUgcHJvYmFibHkgaGVscGZ1bDoKKyAqCisgKiAgIGh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy93aWtpIDoKKyAqCisgKiAgIHNjaGVtZSA9ICJodHRwIiwgaG9zdCA9ICJ3d3cuZXRoZXJib290Lm9yZyIsIHBhdGggPSAiL3dpa2kiCisgKgorICogICAvdmFyL2xpYi90ZnRwYm9vdCA6CisgKgorICogICBwYXRoID0gIi92YXIvbGliL3RmdHBib290IgorICoKKyAqICAgbWFpbHRvOmJvYkBub3doZXJlLmNvbSA6CisgKgorICogICBzY2hlbWUgPSAibWFpbHRvIiwgb3BhcXVlID0gImJvYkBub3doZXJlLmNvbSIKKyAqCisgKiAgIGZ0cDovL2pvZTpzZWNyZXRAaW5zZWN1cmUub3JnOjgwODEvaGlkZGVuL3BhdGgvdG8/d2hhdD1pcyN0aGlzCisgKgorICogICBzY2hlbWUgPSAiZnRwIiwgdXNlciA9ICJqb2UiLCBwYXNzd29yZCA9ICJzZWNyZXQiLAorICogICBob3N0ID0gImluc2VjdXJlLm9yZyIsIHBvcnQgPSAiODA4MSIsIHBhdGggPSAiL2hpZGRlbi9wYXRoL3RvIiwKKyAqICAgcXVlcnkgPSAid2hhdD1pcyIsIGZyYWdtZW50ID0gInRoaXMiCisgKi8KK3N0cnVjdCB1cmkgeworCS8qKiBSZWZlcmVuY2UgY291bnQgKi8KKwlzdHJ1Y3QgcmVmY250IHJlZmNudDsKKwkvKiogU2NoZW1lICovCisJY29uc3QgY2hhciAqc2NoZW1lOworCS8qKiBPcGFxdWUgcGFydCAqLworCWNvbnN0IGNoYXIgKm9wYXF1ZTsKKwkvKiogVXNlciBuYW1lICovCisJY29uc3QgY2hhciAqdXNlcjsKKwkvKiogUGFzc3dvcmQgKi8KKwljb25zdCBjaGFyICpwYXNzd29yZDsKKwkvKiogSG9zdCBuYW1lICovCisJY29uc3QgY2hhciAqaG9zdDsKKwkvKiogUG9ydCBudW1iZXIgKi8KKwljb25zdCBjaGFyICpwb3J0OworCS8qKiBQYXRoICovCisJY29uc3QgY2hhciAqcGF0aDsKKwkvKiogUXVlcnkgKi8KKwljb25zdCBjaGFyICpxdWVyeTsKKwkvKiogRnJhZ21lbnQgKi8KKwljb25zdCBjaGFyICpmcmFnbWVudDsKK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKy8qKiBBIGZpZWxkIGluIGEgVVJJCisgKgorICogVGhlIG9yZGVyIG9mIHRoZSBpbmRpY2VzIGluIHRoaXMgZW51bWVyYXRpb24gbXVzdCBtYXRjaCB0aGUgb3JkZXIKKyAqIG9mIHRoZSBmaWVsZHMgaW4gdGhlIFVSSSBzdHJ1Y3R1cmUuCisgKi8KK2VudW0geworCVVSSV9TQ0hFTUUgPSAwLAkJVVJJX1NDSEVNRV9CSVQgPSAoIDEgPDwgVVJJX1NDSEVNRSApLAorCVVSSV9PUEFRVUUgPSAxLAkJVVJJX09QQVFVRV9CSVQgPSAoIDEgPDwgVVJJX09QQVFVRSApLAorCVVSSV9VU0VSID0gMiwJCVVSSV9VU0VSX0JJVCA9ICggMSA8PCBVUklfVVNFUiApLAorCVVSSV9QQVNTV09SRCA9IDMsCVVSSV9QQVNTV09SRF9CSVQgPSAoIDEgPDwgVVJJX1BBU1NXT1JEICksCisJVVJJX0hPU1QgPSA0LAkJVVJJX0hPU1RfQklUID0gKCAxIDw8IFVSSV9IT1NUICksCisJVVJJX1BPUlQgPSA1LAkJVVJJX1BPUlRfQklUID0gKCAxIDw8IFVSSV9QT1JUICksCisJVVJJX1BBVEggPSA2LAkJVVJJX1BBVEhfQklUID0gKCAxIDw8IFVSSV9QQVRIICksCisJVVJJX1FVRVJZID0gNywJCVVSSV9RVUVSWV9CSVQgPSAoIDEgPDwgVVJJX1FVRVJZICksCisJVVJJX0ZSQUdNRU5UID0gOCwJVVJJX0ZSQUdNRU5UX0JJVCA9ICggMSA8PCBVUklfRlJBR01FTlQgKSwKKworCVVSSV9GSVJTVF9GSUVMRCA9IFVSSV9TQ0hFTUUsCisJVVJJX0xBU1RfRklFTEQgPSBVUklfRlJBR01FTlQsCit9OworCisvKiogRXh0cmFjdCBmaWVsZCBmcm9tIFVSSSAqLworI2RlZmluZSB1cmlfZ2V0X2ZpZWxkKCB1cmksIGZpZWxkICkJKCZ1cmktPnNjaGVtZSlbZmllbGRdCisKKy8qKiBBbGwgVVJJIGZpZWxkcyAqLworI2RlZmluZSBVUklfQUxMCQkoIFVSSV9TQ0hFTUVfQklUIHwgVVJJX09QQVFVRV9CSVQgfCBVUklfVVNFUl9CSVQgfCBcCisJCQkgIFVSSV9QQVNTV09SRF9CSVQgfCBVUklfSE9TVF9CSVQgfCBVUklfUE9SVF9CSVQgfCBcCisJCQkgIFVSSV9QQVRIX0JJVCB8IFVSSV9RVUVSWV9CSVQgfCBVUklfRlJBR01FTlRfQklUICkKKworLyoqIFVSSSBmaWVsZHMgdGhhdCBzaG91bGQgYmUgZGVjb2RlZCBvbiBzdG9yYWdlICovCisjZGVmaW5lIFVSSV9FTkNPREVECSggVVJJX1VTRVJfQklUIHwgVVJJX1BBU1NXT1JEX0JJVCB8IFVSSV9IT1NUX0JJVCB8IFwKKwkJCSAgVVJJX1BBVEhfQklUIHwgVVJJX1FVRVJZX0JJVCB8IFVSSV9GUkFHTUVOVF9CSVQgKQorCisvKioKKyAqIFVSSSBpcyBhbiBhYnNvbHV0ZSBVUkkKKyAqCisgKiBAdiB1cmkJCQlVUkkKKyAqIEByZXQgaXNfYWJzb2x1dGUJCVVSSSBpcyBhYnNvbHV0ZQorICoKKyAqIEFuIGFic29sdXRlIFVSSSBiZWdpbnMgd2l0aCBhIHNjaGVtZSwgZS5nLiAiaHR0cDoiIG9yICJtYWlsdG86Ii4KKyAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgc2VwYXJhdGUgY29uY2VwdCBmcm9tIGEgVVJJIHdpdGggYW4gYWJzb2x1dGUKKyAqIHBhdGguCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVyaV9pc19hYnNvbHV0ZSAoIHN0cnVjdCB1cmkgKnVyaSApIHsKKwlyZXR1cm4gKCB1cmktPnNjaGVtZSAhPSBOVUxMICk7Cit9CisKKy8qKgorICogVVJJIGhhcyBhbiBhYnNvbHV0ZSBwYXRoCisgKgorICogQHYgdXJpCQkJVVJJCisgKiBAcmV0IGhhc19hYnNvbHV0ZV9wYXRoCVVSSSBoYXMgYW4gYWJzb2x1dGUgcGF0aAorICoKKyAqIEFuIGFic29sdXRlIHBhdGggYmVnaW5zIHdpdGggYSAnLycuICBOb3RlIHRoYXQgdGhpcyBpcyBhIHNlcGFyYXRlCisgKiBjb25jZXB0IGZyb20gYW4gYWJzb2x1dGUgVVJJLiAgTm90ZSBhbHNvIHRoYXQgYSBVUkkgbWF5IG5vdCBoYXZlIGEKKyAqIHBhdGggYXQgYWxsLgorICovCitzdGF0aWMgaW5saW5lIGludCB1cmlfaGFzX2Fic29sdXRlX3BhdGggKCBzdHJ1Y3QgdXJpICp1cmkgKSB7CisJcmV0dXJuICggdXJpLT5wYXRoICYmICggdXJpLT5wYXRoWzBdID09ICcvJyApICk7Cit9CisKKy8qKgorICogVVJJIGhhcyBhIHJlbGF0aXZlIHBhdGgKKyAqCisgKiBAdiB1cmkJCQlVUkkKKyAqIEByZXQgaGFzX3JlbGF0aXZlX3BhdGgJVVJJIGhhcyBhIHJlbGF0aXZlIHBhdGgKKyAqCisgKiBBIHJlbGF0aXZlIHBhdGggYmVnaW5zIHdpdGggc29tZXRoaW5nIG90aGVyIHRoYW4gYSAnLycuICBOb3RlIHRoYXQKKyAqIHRoaXMgaXMgYSBzZXBhcmF0ZSBjb25jZXB0IGZyb20gYSByZWxhdGl2ZSBVUkkuICBOb3RlIGFsc28gdGhhdCBhCisgKiBVUkkgbWF5IG5vdCBoYXZlIGEgcGF0aCBhdCBhbGwuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVyaV9oYXNfcmVsYXRpdmVfcGF0aCAoIHN0cnVjdCB1cmkgKnVyaSApIHsKKwlyZXR1cm4gKCB1cmktPnBhdGggJiYgKCB1cmktPnBhdGhbMF0gIT0gJy8nICkgKTsKK30KKworLyoqCisgKiBJbmNyZW1lbnQgVVJJIHJlZmVyZW5jZSBjb3VudAorICoKKyAqIEB2IHVyaQkJVVJJLCBvciBOVUxMCisgKiBAcmV0IHVyaQkJVVJJIGFzIHBhc3NlZCBpbgorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBzdHJ1Y3QgdXJpICoKK3VyaV9nZXQgKCBzdHJ1Y3QgdXJpICp1cmkgKSB7CisJcmVmX2dldCAoICZ1cmktPnJlZmNudCApOworCXJldHVybiB1cmk7Cit9CisKKy8qKgorICogRGVjcmVtZW50IFVSSSByZWZlcmVuY2UgY291bnQKKyAqCisgKiBAdiB1cmkJCVVSSSwgb3IgTlVMTAorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCit1cmlfcHV0ICggc3RydWN0IHVyaSAqdXJpICkgeworCXJlZl9wdXQgKCAmdXJpLT5yZWZjbnQgKTsKK30KKworZXh0ZXJuIHN0cnVjdCB1cmkgKmN3dXJpOworCitleHRlcm4gc3RydWN0IHVyaSAqIHBhcnNlX3VyaSAoIGNvbnN0IGNoYXIgKnVyaV9zdHJpbmcgKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdXJpX3BvcnQgKCBzdHJ1Y3QgdXJpICp1cmksIHVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQgKTsKK2V4dGVybiBpbnQgdW5wYXJzZV91cmkgKCBjaGFyICpidWYsIHNpemVfdCBzaXplLCBzdHJ1Y3QgdXJpICp1cmksCisJCQkgdW5zaWduZWQgaW50IGZpZWxkcyApOworZXh0ZXJuIHN0cnVjdCB1cmkgKiB1cmlfZHVwICggc3RydWN0IHVyaSAqdXJpICk7CitleHRlcm4gY2hhciAqIHJlc29sdmVfcGF0aCAoIGNvbnN0IGNoYXIgKmJhc2VfcGF0aCwKKwkJCSAgICAgY29uc3QgY2hhciAqcmVsYXRpdmVfcGF0aCApOworZXh0ZXJuIHN0cnVjdCB1cmkgKiByZXNvbHZlX3VyaSAoIHN0cnVjdCB1cmkgKmJhc2VfdXJpLAorCQkJCSAgc3RydWN0IHVyaSAqcmVsYXRpdmVfdXJpICk7CitleHRlcm4gdm9pZCBjaHVyaSAoIHN0cnVjdCB1cmkgKnVyaSApOworZXh0ZXJuIHNpemVfdCB1cmlfZW5jb2RlICggY29uc3QgY2hhciAqcmF3X3N0cmluZywgY2hhciAqYnVmLCBzc2l6ZV90IGxlbiwKKwkJCSAgIGludCBmaWVsZCApOworZXh0ZXJuIHNpemVfdCB1cmlfZGVjb2RlICggY29uc3QgY2hhciAqZW5jb2RlZF9zdHJpbmcsIGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4gKTsKKworI2VuZGlmIC8qIF9HUFhFX1VSSV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdXVpZC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3V1aWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTljZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3V1aWQuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9HUFhFX1VVSURfSAorI2RlZmluZSBfR1BYRV9VVUlEX0gKKworLyoqIEBmaWxlCisgKgorICogVW5pdmVyc2FsbHkgdW5pcXVlIElEcworICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiogQSB1bml2ZXJzYWxseSB1bmlxdWUgSUQgKi8KK3VuaW9uIHV1aWQgeworCS8qKiBDYW5vbmljYWwgZm9ybSAoMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSAqLworCXN0cnVjdCB7CisJCS8qKiA4IGhleCBkaWdpdHMsIGJpZy1lbmRpYW4gKi8KKwkJdWludDMyX3QgYTsKKwkJLyoqIDIgaGV4IGRpZ2l0cywgYmlnLWVuZGlhbiAqLworCQl1aW50MTZfdCBiOworCQkvKiogMiBoZXggZGlnaXRzLCBiaWctZW5kaWFuICovCisJCXVpbnQxNl90IGM7CisJCS8qKiAyIGhleCBkaWdpdHMsIGJpZy1lbmRpYW4gKi8KKwkJdWludDE2X3QgZDsKKwkJLyoqIDEyIGhleCBkaWdpdHMsIGJpZy1lbmRpYW4gKi8KKwkJdWludDhfdCBlWzZdOworCX0gY2Fub25pY2FsOworCXVpbnQ4X3QgcmF3WzE2XTsKK307CisKK2V4dGVybiBjaGFyICogdXVpZF9udG9hICggdW5pb24gdXVpZCAqdXVpZCApOworCisjZW5kaWYgLyogX0dQWEVfVVVJRF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdmlydGlvLXBjaS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3ZpcnRpby1wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGMxN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3ZpcnRpby1wY2kuaApAQCAtMCwwICsxLDk3IEBACisjaWZuZGVmIF9WSVJUSU9fUENJX0hfCisjIGRlZmluZSBfVklSVElPX1BDSV9IXworCisvKiBBIDMyLWJpdCByL28gYml0bWFzayBvZiB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBob3N0ICovCisjZGVmaW5lIFZJUlRJT19QQ0lfSE9TVF9GRUFUVVJFUyAgICAgICAgMAorCisvKiBBIDMyLWJpdCByL3cgYml0bWFzayBvZiBmZWF0dXJlcyBhY3RpdmF0ZWQgYnkgdGhlIGd1ZXN0ICovCisjZGVmaW5lIFZJUlRJT19QQ0lfR1VFU1RfRkVBVFVSRVMgICAgICAgNAorCisvKiBBIDMyLWJpdCByL3cgUEZOIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHF1ZXVlICovCisjZGVmaW5lIFZJUlRJT19QQ0lfUVVFVUVfUEZOICAgICAgICAgICAgOAorCisvKiBBIDE2LWJpdCByL28gcXVldWUgc2l6ZSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBxdWV1ZSAqLworI2RlZmluZSBWSVJUSU9fUENJX1FVRVVFX05VTSAgICAgICAgICAgIDEyCisKKy8qIEEgMTYtYml0IHIvdyBxdWV1ZSBzZWxlY3RvciAqLworI2RlZmluZSBWSVJUSU9fUENJX1FVRVVFX1NFTCAgICAgICAgICAgIDE0CisKKy8qIEEgMTYtYml0IHIvdyBxdWV1ZSBub3RpZmllciAqLworI2RlZmluZSBWSVJUSU9fUENJX1FVRVVFX05PVElGWSAgICAgICAgIDE2CisKKy8qIEFuIDgtYml0IGRldmljZSBzdGF0dXMgcmVnaXN0ZXIuICAqLworI2RlZmluZSBWSVJUSU9fUENJX1NUQVRVUyAgICAgICAgICAgICAgIDE4CisKKy8qIEFuIDgtYml0IHIvbyBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLiAgUmVhZGluZyB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlCisgKiBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBJU1IgYW5kIHdpbGwgYWxzbyBjbGVhciBpdC4gIFRoaXMgaXMgZWZmZWN0aXZlbHkKKyAqIGEgcmVhZC1hbmQtYWNrbm93bGVkZ2UuICovCisjZGVmaW5lIFZJUlRJT19QQ0lfSVNSICAgICAgICAgICAgICAgICAgMTkKKworLyogVGhlIGJpdCBvZiB0aGUgSVNSIHdoaWNoIGluZGljYXRlcyBhIGRldmljZSBjb25maWd1cmF0aW9uIGNoYW5nZS4gKi8KKyNkZWZpbmUgVklSVElPX1BDSV9JU1JfQ09ORklHICAgICAgICAgICAweDIKKworLyogVGhlIHJlbWFpbmluZyBzcGFjZSBpcyBkZWZpbmVkIGJ5IGVhY2ggZHJpdmVyIGFzIHRoZSBwZXItZHJpdmVyCisgKiBjb25maWd1cmF0aW9uIHNwYWNlICovCisjZGVmaW5lIFZJUlRJT19QQ0lfQ09ORklHICAgICAgICAgICAgICAgMjAKKworLyogVmlydGlvIEFCSSB2ZXJzaW9uLCB0aGlzIG11c3QgbWF0Y2ggZXhhY3RseSAqLworI2RlZmluZSBWSVJUSU9fUENJX0FCSV9WRVJTSU9OICAgICAgICAgIDAKKworc3RhdGljIGlubGluZSB1MzIgdnBfZ2V0X2ZlYXR1cmVzKHVuc2lnbmVkIGludCBpb2FkZHIpCit7CisgICByZXR1cm4gaW5sKGlvYWRkciArIFZJUlRJT19QQ0lfSE9TVF9GRUFUVVJFUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2cF9zZXRfZmVhdHVyZXModW5zaWduZWQgaW50IGlvYWRkciwgdTMyIGZlYXR1cmVzKQoreworICAgICAgICBvdXRsKGZlYXR1cmVzLCBpb2FkZHIgKyBWSVJUSU9fUENJX0dVRVNUX0ZFQVRVUkVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZwX2dldCh1bnNpZ25lZCBpbnQgaW9hZGRyLCB1bnNpZ25lZCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYsIHVuc2lnbmVkIGxlbikKK3sKKyAgIHU4ICpwdHIgPSBidWY7CisgICB1bnNpZ25lZCBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgIHB0cltpXSA9IGluYihpb2FkZHIgKyBWSVJUSU9fUENJX0NPTkZJRyArIG9mZnNldCArIGkpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHZwX2dldF9zdGF0dXModW5zaWduZWQgaW50IGlvYWRkcikKK3sKKyAgIHJldHVybiBpbmIoaW9hZGRyICsgVklSVElPX1BDSV9TVEFUVVMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdnBfc2V0X3N0YXR1cyh1bnNpZ25lZCBpbnQgaW9hZGRyLCB1OCBzdGF0dXMpCit7CisgICBpZiAoc3RhdHVzID09IDApICAgICAgICAvKiByZXNldCAqLworICAgICAgICAgICByZXR1cm47CisgICBvdXRiKHN0YXR1cywgaW9hZGRyICsgVklSVElPX1BDSV9TVEFUVVMpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2cF9yZXNldCh1bnNpZ25lZCBpbnQgaW9hZGRyKQoreworICAgb3V0YigwLCBpb2FkZHIgKyBWSVJUSU9fUENJX1NUQVRVUyk7CisgICAodm9pZClpbmIoaW9hZGRyICsgVklSVElPX1BDSV9JU1IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdnBfbm90aWZ5KHVuc2lnbmVkIGludCBpb2FkZHIsIGludCBxdWV1ZV9pbmRleCkKK3sKKyAgIG91dHcocXVldWVfaW5kZXgsIGlvYWRkciArIFZJUlRJT19QQ0lfUVVFVUVfTk9USUZZKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZwX2RlbF92cSh1bnNpZ25lZCBpbnQgaW9hZGRyLCBpbnQgcXVldWVfaW5kZXgpCit7CisgICAvKiBzZWxlY3QgdGhlIHF1ZXVlICovCisKKyAgIG91dHcocXVldWVfaW5kZXgsIGlvYWRkciArIFZJUlRJT19QQ0lfUVVFVUVfU0VMKTsKKworICAgLyogZGVhY3RpdmF0ZSB0aGUgcXVldWUgKi8KKworICAgb3V0bCgwLCBpb2FkZHIgKyBWSVJUSU9fUENJX1FVRVVFX1BGTik7Cit9CisKK2ludCB2cF9maW5kX3ZxKHVuc2lnbmVkIGludCBpb2FkZHIsIGludCBxdWV1ZV9pbmRleCwKKyAgICAgICAgICAgICAgIHN0cnVjdCB2cmluZ192aXJ0cXVldWUgKnZxKTsKKyNlbmRpZiAvKiBfVklSVElPX1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3ZpcnRpby1yaW5nLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUvdmlydGlvLXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZkZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3ZpcnRpby1yaW5nLmgKQEAgLTAsMCArMSwxNDIgQEAKKyNpZm5kZWYgX1ZJUlRJT19SSU5HX0hfCisjIGRlZmluZSBfVklSVElPX1JJTkdfSF8KKyNkZWZpbmUgUEFHRV9TSElGVCAoMTIpCisjZGVmaW5lIFBBR0VfU0laRSAgKDE8PFBBR0VfU0hJRlQpCisjZGVmaW5lIFBBR0VfTUFTSyAgKFBBR0VfU0laRS0xKQorCisvKiBTdGF0dXMgYnl0ZSBmb3IgZ3Vlc3QgdG8gcmVwb3J0IHByb2dyZXNzLCBhbmQgc3luY2hyb25pemUgZmVhdHVyZXMuICovCisvKiBXZSBoYXZlIHNlZW4gZGV2aWNlIGFuZCBwcm9jZXNzZWQgZ2VuZXJpYyBmaWVsZHMgKFZJUlRJT19DT05GSUdfRl9WSVJUSU8pICovCisjZGVmaW5lIFZJUlRJT19DT05GSUdfU19BQ0tOT1dMRURHRSAgICAgMQorLyogV2UgaGF2ZSBmb3VuZCBhIGRyaXZlciBmb3IgdGhlIGRldmljZS4gKi8KKyNkZWZpbmUgVklSVElPX0NPTkZJR19TX0RSSVZFUiAgICAgICAgICAyCisvKiBEcml2ZXIgaGFzIHVzZWQgaXRzIHBhcnRzIG9mIHRoZSBjb25maWcsIGFuZCBpcyBoYXBweSAqLworI2RlZmluZSBWSVJUSU9fQ09ORklHX1NfRFJJVkVSX09LICAgICAgIDQKKy8qIFdlJ3ZlIGdpdmVuIHVwIG9uIHRoaXMgZGV2aWNlLiAqLworI2RlZmluZSBWSVJUSU9fQ09ORklHX1NfRkFJTEVEICAgICAgICAgIDB4ODAKKworI2RlZmluZSBNQVhfUVVFVUVfTlVNICAgICAgKDUxMikKKworI2RlZmluZSBWUklOR19ERVNDX0ZfTkVYVCAgMQorI2RlZmluZSBWUklOR19ERVNDX0ZfV1JJVEUgMgorCisjZGVmaW5lIFZSSU5HX0FWQUlMX0ZfTk9fSU5URVJSVVBUIDEKKworI2RlZmluZSBWUklOR19VU0VEX0ZfTk9fTk9USUZZICAgICAxCisKK3N0cnVjdCB2cmluZ19kZXNjCit7CisgICB1NjQgYWRkcjsKKyAgIHUzMiBsZW47CisgICB1MTYgZmxhZ3M7CisgICB1MTYgbmV4dDsKK307CisKK3N0cnVjdCB2cmluZ19hdmFpbAoreworICAgdTE2IGZsYWdzOworICAgdTE2IGlkeDsKKyAgIHUxNiByaW5nWzBdOworfTsKKworc3RydWN0IHZyaW5nX3VzZWRfZWxlbQoreworICAgdTMyIGlkOworICAgdTMyIGxlbjsKK307CisKK3N0cnVjdCB2cmluZ191c2VkCit7CisgICB1MTYgZmxhZ3M7CisgICB1MTYgaWR4OworICAgc3RydWN0IHZyaW5nX3VzZWRfZWxlbSByaW5nW107Cit9OworCitzdHJ1Y3QgdnJpbmcgeworICAgdW5zaWduZWQgaW50IG51bTsKKyAgIHN0cnVjdCB2cmluZ19kZXNjICpkZXNjOworICAgc3RydWN0IHZyaW5nX2F2YWlsICphdmFpbDsKKyAgIHN0cnVjdCB2cmluZ191c2VkICp1c2VkOworfTsKKworI2RlZmluZSB2cmluZ19zaXplKG51bSkgXAorICAgKCgoKChzaXplb2Yoc3RydWN0IHZyaW5nX2Rlc2MpICogbnVtKSArIFwKKyAgICAgIChzaXplb2Yoc3RydWN0IHZyaW5nX2F2YWlsKSArIHNpemVvZih1MTYpICogbnVtKSkgXAorICAgICAgICAgKyBQQUdFX01BU0spICYgflBBR0VfTUFTSykgKyBcCisgICAgICAgICAoc2l6ZW9mKHN0cnVjdCB2cmluZ191c2VkKSArIHNpemVvZihzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtKSAqIG51bSkpCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB2aXJ0aW9fcXVldWVfdFtQQUdFX01BU0sgKyB2cmluZ19zaXplKE1BWF9RVUVVRV9OVU0pXTsKKworc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSB7CisgICB2aXJ0aW9fcXVldWVfdCBxdWV1ZTsKKyAgIHN0cnVjdCB2cmluZyB2cmluZzsKKyAgIHUxNiBmcmVlX2hlYWQ7CisgICB1MTYgbGFzdF91c2VkX2lkeDsKKyAgIHUxNiB2ZGF0YVtNQVhfUVVFVUVfTlVNXTsKKyAgIC8qIFBDSSAqLworICAgaW50IHF1ZXVlX2luZGV4OworfTsKKworc3RydWN0IHZyaW5nX2xpc3QgeworICBjaGFyICphZGRyOworICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHZyaW5nX2luaXQoc3RydWN0IHZyaW5nICp2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtLCB1bnNpZ25lZCBjaGFyICpxdWV1ZSkKK3sKKyAgIHVuc2lnbmVkIGludCBpOworICAgdW5zaWduZWQgbG9uZyBwYTsKKworICAgICAgICB2ci0+bnVtID0gbnVtOworCisgICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRlc2MgbXVzdCBiZSBwYWdlIGFsaWduZWQgKi8KKworICAgcGEgPSB2aXJ0X3RvX3BoeXMocXVldWUpOworICAgcGEgPSAocGEgKyBQQUdFX01BU0spICYgflBBR0VfTUFTSzsKKyAgIHZyLT5kZXNjID0gcGh5c190b192aXJ0KHBhKTsKKworICAgICAgICB2ci0+YXZhaWwgPSAoc3RydWN0IHZyaW5nX2F2YWlsICopJnZyLT5kZXNjW251bV07CisKKyAgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdXNlZCBtdXN0IGJlIHBhZ2UgYWxpZ25lZCAqLworCisgICBwYSA9IHZpcnRfdG9fcGh5cygmdnItPmF2YWlsLT5yaW5nW251bV0pOworICAgcGEgPSAocGEgKyBQQUdFX01BU0spICYgflBBR0VfTUFTSzsKKyAgICAgICAgdnItPnVzZWQgPSBwaHlzX3RvX3ZpcnQocGEpOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtIC0gMTsgaSsrKQorICAgICAgICAgICB2ci0+ZGVzY1tpXS5uZXh0ID0gaSArIDE7CisgICB2ci0+ZGVzY1tpXS5uZXh0ID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZyaW5nX2VuYWJsZV9jYihzdHJ1Y3QgdnJpbmdfdmlydHF1ZXVlICp2cSkKK3sKKyAgIHZxLT52cmluZy5hdmFpbC0+ZmxhZ3MgJj0gflZSSU5HX0FWQUlMX0ZfTk9fSU5URVJSVVBUOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdnJpbmdfZGlzYWJsZV9jYihzdHJ1Y3QgdnJpbmdfdmlydHF1ZXVlICp2cSkKK3sKKyAgIHZxLT52cmluZy5hdmFpbC0+ZmxhZ3MgfD0gVlJJTkdfQVZBSUxfRl9OT19JTlRFUlJVUFQ7Cit9CisKKworLyoKKyAqIHZyaW5nX21vcmVfdXNlZAorICoKKyAqIGlzIHRoZXJlIHNvbWUgdXNlZCBidWZmZXJzID8KKyAqCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdnJpbmdfbW9yZV91c2VkKHN0cnVjdCB2cmluZ192aXJ0cXVldWUgKnZxKQoreworICAgd21iKCk7CisgICByZXR1cm4gdnEtPmxhc3RfdXNlZF9pZHggIT0gdnEtPnZyaW5nLnVzZWQtPmlkeDsKK30KKwordm9pZCB2cmluZ19kZXRhY2goc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSAqdnEsIHVuc2lnbmVkIGludCBoZWFkKTsKK2ludCB2cmluZ19nZXRfYnVmKHN0cnVjdCB2cmluZ192aXJ0cXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKmxlbik7Cit2b2lkIHZyaW5nX2FkZF9idWYoc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSAqdnEsIHN0cnVjdCB2cmluZ19saXN0IGxpc3RbXSwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3V0LCB1bnNpZ25lZCBpbnQgaW4sCisgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgbnVtX2FkZGVkKTsKK3ZvaWQgdnJpbmdfa2ljayh1bnNpZ25lZCBpbnQgaW9hZGRyLCBzdHJ1Y3QgdnJpbmdfdmlydHF1ZXVlICp2cSwgaW50IG51bV9hZGRlZCk7CisKKyNlbmRpZiAvKiBfVklSVElPX1JJTkdfSF8gKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS92c3ByaW50Zi5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3ZzcHJpbnRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4NjBhNQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS92c3ByaW50Zi5oCkBAIC0wLDAgKzEsNzQgQEAKKyNpZm5kZWYgX0dQWEVfVlNQUklOVEZfSAorI2RlZmluZSBfR1BYRV9WU1BSSU5URl9ICisKKy8qKiBAZmlsZQorICoKKyAqIHByaW50ZigpIGFuZCBmcmllbmRzCisgKgorICogRXRoZXJib290J3MgcHJpbnRmKCkgZnVuY3Rpb25zIHVuZGVyc3RhbmQgdGhlIGZvbGxvd2luZyBzdWJzZXQgb2YKKyAqIHRoZSBzdGFuZGFyZCBDIHByaW50ZigpJ3MgZm9ybWF0IHNwZWNpZmllcnM6CisgKgorICoJLSBGbGFnIGNoYXJhY3RlcnMKKyAqCQktICcjJwkJLSBBbHRlcm5hdGUgZm9ybSAoaS5lLiAiMHgiIHByZWZpeCkKKyAqCQktICcwJwkJLSBaZXJvLXBhZAorICoJLSBGaWVsZCB3aWR0aHMKKyAqCS0gTGVuZ3RoIG1vZGlmaWVycworICoJCS0gJ2hoJwkJLSBTaWduZWQgLyB1bnNpZ25lZCBjaGFyCisgKgkJLSAnaCcJCS0gU2lnbmVkIC8gdW5zaWduZWQgc2hvcnQKKyAqCQktICdsJwkJLSBTaWduZWQgLyB1bnNpZ25lZCBsb25nCisgKgkJLSAnbGwnCQktIFNpZ25lZCAvIHVuc2lnbmVkIGxvbmcgbG9uZworICoJCS0gJ3onCQktIFNpZ25lZCAvIHVuc2lnbmVkIHNpemVfdAorICoJLSBDb252ZXJzaW9uIHNwZWNpZmllcnMKKyAqCQktICdkJwkJLSBTaWduZWQgZGVjaW1hbAorICoJCS0gJ3gnLCdYJwktIFVuc2lnbmVkIGhleGFkZWNpbWFsCisgKgkJLSAnYycJCS0gQ2hhcmFjdGVyCisgKgkJLSAncycJCS0gU3RyaW5nCisgKgkJLSAncCcJCS0gUG9pbnRlcgorICoKKyAqIEhleGFkZWNpbWFsIG51bWJlcnMgYXJlIGFsd2F5cyB6ZXJvLXBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIGZpZWxkCisgKiB3aWR0aCAoaWYgYW55KTsgZGVjaW1hbCBudW1iZXJzIGFyZSBhbHdheXMgc3BhY2UtcGFkZGVkLiAgRGVjaW1hbAorICogbG9uZyBsb25ncyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoqCisgKiBBIHByaW50ZiBjb250ZXh0CisgKgorICogQ29udGV4dHMgYXJlIHVzZWQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzaGFyZSBjb2RlIGJldHdlZW4KKyAqIHZwcmludGYoKSBhbmQgdnNucHJpbnRmKCksIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBhbGxvY2F0aW9uIG9mIGEKKyAqIGJ1ZmZlciBmb3IgdnByaW50ZigpLgorICovCitzdHJ1Y3QgcHJpbnRmX2NvbnRleHQgeworCS8qKgorCSAqIENoYXJhY3RlciBoYW5kbGVyCisJICoKKwkgKiBAdiBjdHgJQ29udGV4dAorCSAqIEB2IGMJCUNoYXJhY3RlcgorCSAqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciBlYWNoIGNoYXJhY3RlciB3cml0dGVuIHRvIHRoZQorCSAqIGZvcm1hdHRlZCBzdHJpbmcuCisJICovCisJdm9pZCAoICogaGFuZGxlciApICggc3RydWN0IHByaW50Zl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGludCBjICk7CisJLyoqIExlbmd0aCBvZiBmb3JtYXR0ZWQgc3RyaW5nCisJICoKKwkgKiBXaGVuIGhhbmRsZXIoKSBpcyBjYWxsZWQsIEBsZW4gd2lsbCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZgorCSAqIGNoYXJhY3RlcnMgd3JpdHRlbiBzbyBmYXIgKGkuZS4gemVybyBmb3IgdGhlIGZpcnN0IGNhbGwgdG8KKwkgKiBoYW5kbGVyKCkpLgorCSAqLworCXNpemVfdCBsZW47Cit9OworCitleHRlcm4gc2l6ZV90IHZjcHJpbnRmICggc3RydWN0IHByaW50Zl9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmZtdCwKKwkJCSB2YV9saXN0IGFyZ3MgKTsKK2V4dGVybiBpbnQgdnNzbnByaW50ZiAoIGNoYXIgKmJ1Ziwgc3NpemVfdCBzc2l6ZSwgY29uc3QgY2hhciAqZm10LAorCQkJdmFfbGlzdCBhcmdzICk7CitleHRlcm4gaW50IF9fYXR0cmlidXRlX18gKCggZm9ybWF0ICggcHJpbnRmLCAzLCA0ICkgKSkKK3NzbnByaW50ZiAoIGNoYXIgKmJ1Ziwgc3NpemVfdCBzc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4gKTsKKworI2VuZGlmIC8qIF9HUFhFX1ZTUFJJTlRGX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS93cGEuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS93cGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2YxOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3dwYS5oCkBAIC0wLDAgKzEsNTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9HUFhFX1dQQV9ICisjZGVmaW5lIF9HUFhFX1dQQV9ICisKKyNpbmNsdWRlIDxncHhlL2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKiBAZmlsZQorICoKKyAqIENvbW1vbiBkZWZpbml0aW9ucyBmb3IgYWxsIHR5cGVzIG9mIFdQQS1wcm90ZWN0ZWQgbmV0d29ya3MuCisgKi8KKworCisvKiogRUFQT0wtS2V5IHR5cGUgZmllbGQgZm9yIG1vZGVybiA4MDIuMTFpL1JTTiBXUEEgcGFja2V0cyAqLworI2RlZmluZSBFQVBPTF9LRVlfVFlQRV9SU04JMgorCisvKiogT2xkIEVBUE9MLUtleSB0eXBlIGZpZWxkIHVzZWQgYnkgV1BBMSBoYXJkd2FyZSBiZWZvcmUgODAyLjExaSByYXRpZmllZCAqLworI2RlZmluZSBFQVBPTF9LRVlfVFlQRV9XUEEJMjU0CisKKworLyoqCisgKiBAZGVmZ3JvdXAgZWFwb2xfa2V5X2luZm8gRUFQT0wtS2V5IEluZm8gZmllbGQgYml0cworICogQHsKKyAqLworCisvKiogS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiwgaW5kaWNhdGluZyBXUEEgb3IgV1BBMiAqLworI2RlZmluZSBFQVBPTF9LRVlfSU5GT19WRVJTSU9OCTB4MDAwNworCisvKiogS2V5IHR5cGUgYml0LCBpbmRpY2F0aW5nIHBhaXJ3aXNlIG9yIGdyb3VwICovCisjZGVmaW5lIEVBUE9MX0tFWV9JTkZPX1RZUEUJMHgwMDA4CisKKy8qKiBLZXkgaW5zdGFsbCBiaXQ7IHNldCBvbiBtZXNzYWdlIDMgZXhjZXB0IHdoZW4gbGVnYWN5IGhhY2tzIGFyZSB1c2VkICovCisjZGVmaW5lIEVBUE9MX0tFWV9JTkZPX0lOU1RBTEwJMHgwMDQwCisKKy8qKiBLZXkgQUNLIGJpdDsgc2V0IHdoZW4gYSByZXNwb25zZSBpcyByZXF1aXJlZCwgb24gYWxsIG1lc3NhZ2VzIGV4Y2VwdCAjNCAqLworI2RlZmluZSBFQVBPTF9LRVlfSU5GT19LRVlfQUNLCTB4MDA4MAorCisvKiogS2V5IE1JQyBiaXQ7IHNldCB3aGVuIHRoZSBNSUMgZmllbGQgaXMgdmFsaWQsIG9uIG1lc3NhZ2VzIDMgYW5kIDQgKi8KKyNkZWZpbmUgRUFQT0xfS0VZX0lORk9fS0VZX01JQwkweDAxMDAKKworLyoqIFNlY3VyZSBiaXQ7IHNldCB3aGVuIGJvdGggc2lkZXMgaGF2ZSBib3RoIGtleXMsIG9uIG1lc3NhZ2VzIDMgYW5kIDQgKi8KKyNkZWZpbmUgRUFQT0xfS0VZX0lORk9fU0VDVVJFCTB4MDIwMAorCisvKiogRXJyb3IgYml0OyBzZXQgb24gYSBNSUMgZmFpbHVyZSBmb3IgVEtJUCAqLworI2RlZmluZSBFQVBPTF9LRVlfSU5GT19FUlJPUgkweDA0MDAKKworLyoqIFJlcXVlc3QgYml0OyBzZXQgd2hlbiBhdXRoZW50aWNhdGlvbiBpcyBpbml0aWF0ZWQgYnkgdGhlIFBlZXIgKHVudXN1YWwpICovCisjZGVmaW5lIEVBUE9MX0tFWV9JTkZPX1JFUVVFU1QJMHgwODAwCisKKy8qKiBLZXkgRW5jcnlwdGVkIGJpdDsgc2V0IHdoZW4gdGhlIEtleSBEYXRhIGZpZWxkIGlzIGVuY3J5cHRlZCAqLworI2RlZmluZSBFQVBPTF9LRVlfSU5GT19LRVlfRU5DCTB4MTAwMAorCisvKiogU01DIE1lc3NhZ2UgYml0OyBzZXQgd2hlbiB0aGlzIGZyYW1lIGlzIHBhcnQgb2YgYW4gSUJTUyBTTUsgaGFuZHNoYWtlICovCisjZGVmaW5lIEVBUE9MX0tFWV9JTkZPX1NNQ19NRVNTCTB4MjAwMAorCisKKy8qKiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGZpZWxkIHZhbHVlIGZvciBXUEEgKFRLSVApICovCisjZGVmaW5lIEVBUE9MX0tFWV9WRVJTSU9OX1dQQQkxCisKKy8qKiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGZpZWxkIHZhbHVlIGZvciBXUEEyIChDQ01QKSAqLworI2RlZmluZSBFQVBPTF9LRVlfVkVSU0lPTl9XUEEyCTIKKworLyoqIEtleSB0eXBlIGZpZWxkIHZhbHVlIGZvciBhIFBUSyAocGFpcndpc2UpIGtleSBoYW5kc2hha2UgKi8KKyNkZWZpbmUgRUFQT0xfS0VZX1RZUEVfUFRLCTB4MDAwOAorCisvKiogS2V5IHR5cGUgZmllbGQgdmFsdWUgZm9yIGEgR1RLIChncm91cCkga2V5IGhhbmRzaGFrZSAqLworI2RlZmluZSBFQVBPTF9LRVlfVFlQRV9HVEsJMHgwMDAwCisKKy8qKiBAfSAqLworCisKKworLyoqIEFuIEVBUE9MLUtleSBwYWNrZXQuCisgKgorICogVGhlc2UgYXJlIHVzZWQgZm9yIHRoZSBXUEEgNC1XYXkgSGFuZHNoYWtlLCB3aGV0aGVyIG9yIG5vdCBwcmlvcgorICogYXV0aGVudGljYXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkIHVzaW5nIEVBUC4KKyAqCisgKiBPbiBMQU5zLCBhbiBlYXBvbF9rZXlfcGt0IGlzIGFsd2F5cyBlbmNhcHN1bGF0ZWQgaW4gdGhlIGRhdGEgZmllbGQKKyAqIG9mIGFuIGVhcG9sX2ZyYW1lLCB3aXRoIHRoZSBmcmFtZSdzIHR5cGUgY29kZSBzZXQgdG8gRUFQT0xfVFlQRV9LRVkuCisgKgorICogVW5saWtlIDgwMi4xMSBmcmFtZSBoZWFkZXJzLCB0aGUgZmllbGRzIGluIHRoaXMgc3RydWN0dXJlIGFyZQorICogc3RvcmVkIGluIGJpZy1lbmRpYW4hCisgKi8KK3N0cnVjdCBlYXBvbF9rZXlfcGt0Cit7CisJLyoqIE9uZSBvZiB0aGUgRUFQT0xfS0VZX1RZUEVfKiBkZWZpbmVzLiAqLworCXU4IHR5cGU7CisKKwkvKiogQml0ZmllbGQgb2Yga2V5IGNoYXJhY3RlcmlzdGljcywgbmV0d29yayBieXRlIG9yZGVyICovCisJdTE2IGluZm87CisKKwkvKiogTGVuZ3RoIG9mIGVuY3J5cHRpb24ga2V5IHRvIGJlIHVzZWQsIG5ldHdvcmsgYnl0ZSBvcmRlcgorCSAqCisJICogVGhpcyBpcyAxNiBmb3IgQ0NNUCwgMzIgZm9yIFRLSVAsIGFuZCA1IG9yIDEzIGZvciBXRVAuCisJICovCisJdTE2IGtleXNpemU7CisKKwkvKiogTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHZhbHVlIGZvciBFQVBPTC1LZXkgY29udmVyc2F0aW9ucworCSAqCisJICogSW4gYW5vdGhlciBjbGFzc2ljIGRlbW9uc3RyYXRpb24gb2Ygb3ZlcmVuZ2luZWVyaW5nLCB0aGlzCisJICogOC1ieXRlIHZhbHVlIHdpbGwgcmFyZWx5IGJlIGFueXRoaW5nIGFib3ZlIDEuIEl0J3Mgc3RvcmVkCisJICogaW4gbmV0d29yayBieXRlIG9yZGVyLgorCSAqLworCXU2NCByZXBsYXk7CisKKwkvKiogTm9uY2UgdmFsdWUKKwkgKgorCSAqIFRoaXMgaXMgdGhlIGF1dGhlbnRpY2F0b3IncyBBTm9uY2UgaW4gZnJhbWUgMSwgdGhlIHBlZXIncworCSAqIFNOb25jZSBpbiBmcmFtZSAyLCBhbmQgMCBpbiBmcmFtZXMgMyBhbmQgNC4KKwkgKi8KKwl1OCBub25jZVszMl07CisKKwkvKiogSW5pdGlhbGl6YXRpb24gdmVjdG9yCisJICoKKwkgKiBUaGlzIGNvbnRhaW5zIHRoZSBJViB1c2VkIHdpdGggdGhlIEtleSBFbmNyeXB0aW9uIEtleSwgb3IgMAorCSAqIGlmIHRoZSBrZXkgaXMgdW5lbmNyeXB0ZWQgb3IgZW5jcnlwdGVkIHVzaW5nIGFuIGFsZ29yaXRobQorCSAqIHRoYXQgZG9lcyBub3QgcmVxdWlyZSBhbiBJVi4KKwkgKi8KKwl1OCBpdlsxNl07CisKKwkvKiogUmVjZWl2ZSBzZXF1ZW5jZSBjb3VudGVyIGZvciBHVEsKKwkgKgorCSAqIFRoaXMgaXMgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUgY2xpZW50J3MgcmVwbGF5IGNvdW50ZXIgZm9yCisJICogb3JkaW5hcnkgZGF0YSBwYWNrZXRzLiBUaGUgZmlyc3Qgc2l4IGJ5dGVzIGNvbnRhaW4gUE4wCisJICogdGhyb3VnaCBQTjUgZm9yIENDTVAgbW9kZSwgb3IgVFNDMCB0aHJvdWdoIFRTQzUgZm9yIFRLSVAKKwkgKiBtb2RlLiBUaGUgbGFzdCB0d28gYnl0ZXMgYXJlIHplcm8uCisJICovCisJdTggcnNjWzhdOworCisJLyoqIFJlc2VydmVkIGJ5dGVzICovCisJdTggX3Jlc2VydmVkWzhdOworCisJLyoqIE1lc3NhZ2UgaW50ZWdyaXR5IGNvZGUgb3ZlciB0aGUgZW50aXJlIEVBUE9MIGZyYW1lCisJICoKKwkgKiBUaGlzIGlzIGNhbGN1bGF0ZWQgdXNpbmcgSE1BQy1NRDUgd2hlbiB0aGUga2V5IGRlc2NyaXB0b3IKKwkgKiB2ZXJzaW9uIGZpZWxkIGluIEBhIGluZm8gaXMgMSwgYW5kIEhNQUMtU0hBMSBpZ25vcmluZyB0aGUKKwkgKiBsYXN0IDQgYnl0ZXMgb2YgdGhlIGhhc2ggd2hlbiB0aGUgdmVyc2lvbiBmaWVsZCBpbiBAYSBpbmZvCisJICogaXMgMi4KKwkgKi8KKwl1OCBtaWNbMTZdOworCisJLyoqIExlbmd0aCBvZiB0aGUgQGEgZGF0YSBmaWVsZCBpbiBieXRlcywgbmV0d29yayBieXRlIG9yZGVyICovCisJdTE2IGRhdGFsZW47CisKKwkvKiogS2V5IGRhdGEKKwkgKgorCSAqIFRoaXMgaXMgZm9ybWF0dGVkIGFzIGEgc2VyaWVzIG9mIDgwMi4xMSBpbmZvcm1hdGlvbgorCSAqIGVsZW1lbnRzLCB3aXRoIGNyeXB0b2dyYXBoaWMgZGF0YSBlbmNhcHN1bGF0ZWQgdXNpbmcgYQorCSAqICJ2ZW5kb3Itc3BlY2lmaWMgSUUiIGNvZGUgYW5kIGFuIElFRUUtc3BlY2lmaWVkIE9VSS4KKwkgKi8KKwl1OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworCisvKiogV1BBIGhhbmRzaGFraW5nIHN0YXRlICovCitlbnVtIHdwYV9zdGF0ZSB7CisJLyoqIFdhaXRpbmcgZm9yIFBNSyB0byBiZSBzZXQgKi8KKwlXUEFfV0FJVElORyA9IDAsCisKKwkvKiogUmVhZHkgZm9yIDQtV2F5IEhhbmRzaGFrZSAqLworCVdQQV9SRUFEWSwKKworCS8qKiBQZXJmb3JtaW5nIDQtV2F5IEhhbmRzaGFrZSAqLworCVdQQV9XT1JLSU5HLAorCisJLyoqIDQtV2F5IEhhbmRzaGFrZSBzdWNjZWVkZWQgKi8KKwlXUEFfU1VDQ0VTUywKKworCS8qKiA0LVdheSBIYW5kc2hha2UgZmFpbGVkICovCisJV1BBX0ZBSUxVUkUsCit9OworCisvKiogQml0ZmllbGQgaW5kaWNhdGluZyBhIHNlbGVjdGlvbiBvZiBXUEEgdHJhbnNpZW50IGtleXMgKi8KK2VudW0gd3BhX2tleW1hc2sgeworCS8qKiBQYWlyd2lzZSB0cmFuc2llbnQga2V5ICovCisJV1BBX1BUSyA9IDEsCisKKwkvKiogR3JvdXAgdHJhbnNpZW50IGtleSAqLworCVdQQV9HVEsgPSAyLAorfTsKKworCisvKiogTGVuZ3RoIG9mIGEgbm9uY2UgKi8KKyNkZWZpbmUgV1BBX05PTkNFX0xFTgkJMzIKKworLyoqIExlbmd0aCBvZiBhIFRLSVAgbWFpbiBrZXkgKi8KKyNkZWZpbmUgV1BBX1RLSVBfS0VZX0xFTgkxNgorCisvKiogTGVuZ3RoIG9mIGEgVEtJUCBNSUMga2V5ICovCisjZGVmaW5lIFdQQV9US0lQX01JQ19LRVlfTEVOCTgKKworLyoqIExlbmd0aCBvZiBhIENDTVAga2V5ICovCisjZGVmaW5lIFdQQV9DQ01QX0tFWV9MRU4JMTYKKworLyoqIExlbmd0aCBvZiBhbiBFQVBPTCBLZXkgQ29uZmlybWF0aW9uIEtleSAqLworI2RlZmluZSBXUEFfS0NLX0xFTgkJMTYKKworLyoqIExlbmd0aCBvZiBhbiBFQVBPTCBLZXkgRW5jcnlwdGlvbiBLZXkgKi8KKyNkZWZpbmUgV1BBX0tFS19MRU4JCTE2CisKKy8qKiBVc3VhbCBsZW5ndGggb2YgYSBQYWlyd2lzZSBNYXN0ZXIgS2V5ICovCisjZGVmaW5lIFdQQV9QTUtfTEVOCQkzMgorCisvKiogTGVuZ3RoIG9mIGEgUE1LSUQgKi8KKyNkZWZpbmUgV1BBX1BNS0lEX0xFTgkJMTYKKworCisvKiogU3RydWN0dXJlIG9mIHRoZSBUZW1wb3JhbCBLZXkgZm9yIFRLSVAgZW5jcnlwdGlvbiAqLworc3RydWN0IHRraXBfdGsKK3sKKwkvKiogTWFpbiBrZXk6IGlucHV0IHRvIFRLSVAgUGhhc2UgMSBhbmQgUGhhc2UgMiBrZXkgbWl4aW5nIGZ1bmN0aW9ucyAqLworCXU4IGtleVtXUEFfVEtJUF9LRVlfTEVOXTsKKworCS8qKiBNaWNoYWVsIE1JQyBrZXlzICovCisJc3RydWN0IHsKKwkJLyoqIE1JQyBrZXkgZm9yIHBhY2tldHMgZnJvbSB0aGUgQVAgKi8KKwkJdTggcnhbV1BBX1RLSVBfTUlDX0tFWV9MRU5dOworCisJCS8qKiBNSUMga2V5IGZvciBwYWNrZXRzIHRvIHRoZSBBUCAqLworCQl1OCB0eFtXUEFfVEtJUF9NSUNfS0VZX0xFTl07CisJfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKSBtaWM7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogU3RydWN0dXJlIG9mIGEgZ2VuZXJpYyBUZW1wb3JhbCBLZXkgKi8KK3VuaW9uIHdwYV90aworeworCS8qKiBDQ01QIGtleSAqLworCXU4IGNjbXBbV1BBX0NDTVBfS0VZX0xFTl07CisKKwkvKiogVEtJUCBrZXlzICovCisJc3RydWN0IHRraXBfdGsgdGtpcDsKK307CisKKy8qKiBTdHJ1Y3R1cmUgb2YgdGhlIFBhaXJ3aXNlIFRyYW5zaWVudCBLZXkgKi8KK3N0cnVjdCB3cGFfcHRrCit7CisJLyoqIEVBUE9MLUtleSBLZXkgQ29uZmlybWF0aW9uIEtleSAoS0NLKSAqLworCXU4IGtja1tXUEFfS0NLX0xFTl07CisKKwkvKiogRUFQT0wtS2V5IEtleSBFbmNyeXB0aW9uIEtleSAoS0VLKSAqLworCXU4IGtla1tXUEFfS0VLX0xFTl07CisKKwkvKiogVGVtcG9yYWwga2V5ICovCisJdW5pb24gd3BhX3RrIHRrOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIFN0cnVjdHVyZSBvZiB0aGUgR3JvdXAgVHJhbnNpZW50IEtleSAqLworc3RydWN0IHdwYV9ndGsKK3sKKwkvKiogVGVtcG9yYWwga2V5ICovCisJdW5pb24gd3BhX3RrIHRrOworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworCisvKiogQ29tbW9uIGNvbnRleHQgZm9yIFdQQSBzZWN1cml0eSBoYW5kc2hha2luZworICoKKyAqIEFueSBpbXBsZW1lbnRvciBvZiBhIHBhcnRpY3VsYXIgaGFuZHNoYWtpbmcgdHlwZSAoZS5nLiBQU0sgb3IgRUFQKQorICogbXVzdCBpbmNsdWRlIHRoaXMgc3RydWN0dXJlIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGVpciBwcml2YXRlCisgKiBkYXRhIGNvbnRleHQgc3RydWN0dXJlLCB0byBhbGxvdyB0aGUgRUFQT0wtS2V5IGhhbmRsaW5nIGNvZGUgdG8KKyAqIHdvcmsuIFdoZW4gdGhlIHByZWxpbWluYXJ5IGF1dGhlbnRpY2F0aW9uIGlzIGRvbmUsIGl0IGlzIG5lY2Vzc2FyeQorICogdG8gY2FsbCB3cGFfc3RhcnQoKSwgcGFzc2luZyB0aGUgUE1LIChkZXJpdmVkIGZyb20gUFNLIG9yIEVBUCBNU0spCisgKiBhcyBhbiBhcmd1bWVudC4gVGhlIGhhbmRzaGFrZXIgY2FuIHVzZSBpdHMgQGEgc3RlcCBmdW5jdGlvbiB0bworICogbW9uaXRvciBAYSBzdGF0ZSBpbiB0aGlzIHdwYV9jdHggc3RydWN0dXJlIGZvciBzdWNjZXNzIG9yCisgKiBmYWlsdXJlLiBPbiBzdWNjZXNzLCB0aGUga2V5cyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBAYSBwdGsgYW5kIEBhCisgKiBndGsgYWNjb3JkaW5nIHRvIHRoZSBzdGF0ZSBvZiB0aGUgQGEgdmFsaWQgYml0bWFzay4KKyAqCisgKiBBZnRlciBhbiBpbml0aWFsIHN1Y2Nlc3MsIHRoZSBwYXJlbnQgaGFuZHNoYWtlciBkb2VzIG5vdCBuZWVkIHRvCisgKiBjb25jZXJuIGl0c2VsZiB3aXRoIHJla2V5aW5nOyB0aGUgV1BBIGNvbW1vbiBjb2RlIHRha2VzIGNhcmUgb2YKKyAqIHRoYXQuCisgKi8KK3N0cnVjdCB3cGFfY29tbW9uX2N0eAoreworCS8qKiA4MDIuMTEgZGV2aWNlIHdlIGFyZSBhdXRoZW50aWNhdGluZyBmb3IgKi8KKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXY7CisKKwkvKiogVGhlIFBhaXJ3aXNlIE1hc3RlciBLZXkgdG8gdXNlIGluIGhhbmRzaGFraW5nCisJICoKKwkgKiBUaGlzIGlzIHNldCBlaXRoZXIgYnkgcnVubmluZyB0aGUgUEJLREYyIGFsZ29yaXRobSBvbiBhCisJICogcGFzc3BocmFzZSB3aXRoIHRoZSBTU0lEIGFzIHNhbHQgdG8gZ2VuZXJhdGUgYSBwcmUtc2hhcmVkCisJICoga2V5LCBvciBieSBjb3B5aW5nIHRoZSBmaXJzdCAzMiBieXRlcyBvZiB0aGUgRUFQIE1hc3RlcgorCSAqIFNlc3Npb24gS2V5IGluIDgwMi4xWC1zZXJ2ZWQgYXV0aGVudGljYXRpb24uCisJICovCisJdTggcG1rW1dQQV9QTUtfTEVOXTsKKworCS8qKiBMZW5ndGggb2YgdGhlIFBhaXJ3aXNlIE1hc3RlciBLZXkKKwkgKgorCSAqIFRoaXMgaXMgYWx3YXlzIDMyIGV4Y2VwdCB3aXRoIG9uZSBFQVAgbWV0aG9kIHdoaWNoIG9ubHkKKwkgKiBnaXZlcyAxNiBieXRlcy4KKwkgKi8KKwlpbnQgcG1rX2xlbjsKKworCS8qKiBTdGF0ZSBvZiBFQVBPTC1LZXkgaGFuZHNoYWtpbmcgKi8KKwllbnVtIHdwYV9zdGF0ZSBzdGF0ZTsKKworCS8qKiBSZXBsYXkgY291bnRlciBmb3IgdGhpcyBhc3NvY2lhdGlvbgorCSAqCisJICogVGhpcyBzdG9yZXMgdGhlIHJlcGxheSBjb3VudGVyIHZhbHVlIGZvciB0aGUgbW9zdCByZWNlbnQKKwkgKiBwYWNrZXQgd2UndmUgYWNjZXB0ZWQuIEl0IGlzIGluaXRpYWxseSBpbml0aWFsaXNlZCB0byB+MCB0bworCSAqIHNob3cgd2UnbGwgYWNjZXB0IGFueXRoaW5nLgorCSAqLworCXU2NCByZXBsYXk7CisKKwkvKiogTWFzayBvZiB2YWxpZCBrZXlzIGFmdGVyIGF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3MKKwkgKgorCSAqIElmIHRoZSBQVEsgaXMgbm90IHZhbGlkLCB0aGUgR1RLIHNob3VsZCBiZSB1c2VkIGZvciBib3RoCisJICogdW5pY2FzdCBhbmQgbXVsdGljYXN0IGRlY3J5cHRpb247IGlmIHRoZSBHVEsgaXMgbm90IHZhbGlkLAorCSAqIG11bHRpY2FzdCBwYWNrZXRzIGNhbm5vdCBiZSBkZWNyeXB0ZWQuCisJICovCisJZW51bSB3cGFfa2V5bWFzayB2YWxpZDsKKworCS8qKiBUaGUgY2lwaGVyIHRvIHVzZSBmb3IgdW5pY2FzdCBSWCBhbmQgYWxsIFRYICovCisJZW51bSBuZXQ4MDIxMV9jcnlwdG9fYWxnIGNyeXB0OworCisJLyoqIFRoZSBjaXBoZXIgdG8gdXNlIGZvciBicm9hZGNhc3QgYW5kIG11bHRpY2FzdCBSWCAqLworCWVudW0gbmV0ODAyMTFfY3J5cHRvX2FsZyBnY3J5cHQ7CisKKwkvKiogVGhlIFBhaXJ3aXNlIFRyYW5zaWVudCBLZXkgZGVyaXZlZCBmcm9tIHRoZSBoYW5kc2hha2UgKi8KKwlzdHJ1Y3Qgd3BhX3B0ayBwdGs7CisKKwkvKiogVGhlIEdyb3VwIFRyYW5zaWVudCBLZXkgZGVyaXZlZCBmcm9tIHRoZSBoYW5kc2hha2UgKi8KKwlzdHJ1Y3Qgd3BhX2d0ayBndGs7CisKKwkvKiogQXV0aGVudGljYXRvci1wcm92aWRlZCBub25jZSAqLworCXU4IEFub25jZVtXUEFfTk9OQ0VfTEVOXTsKKworCS8qKiBTdXBwbGljYW50LWdlbmVyYXRlZCBub25jZSAodGhhdCdzIHVzKSAqLworCXU4IFNub25jZVtXUEFfTk9OQ0VfTEVOXTsKKworCS8qKiBXaGV0aGVyIHdlIHNob3VsZCByZWZyYWluIGZyb20gZ2VuZXJhdGluZyBhbm90aGVyIFNOb25jZSAqLworCWludCBoYXZlX1Nub25jZTsKKworCS8qKiBEYXRhIGluIFdQQSBvciBSU04gSUUgZnJvbSBBUCdzIGJlYWNvbiBmcmFtZSAqLworCXZvaWQgKmFwX3Jzbl9pZTsKKworCS8qKiBMZW5ndGggb2YgQGEgYXBfcnNuX2llICovCisJaW50IGFwX3Jzbl9pZV9sZW47CisKKwkvKiogV2hldGhlciBAYSBhcF9yc25faWUgaXMgYW4gUlNOIElFIChhcyBvcHBvc2VkIHRvIG9sZCBXUEEpICovCisJaW50IGFwX3Jzbl9pc19yc247CisKKwkvKiogTGlzdCBlbnRyeSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKworLyoqIFdQQSBoYW5kc2hha2Uga2V5IGludGVncml0eSBhbmQgZW5jcnlwdGlvbiBoYW5kbGVyCisgKgorICogTm90ZSB0aGF0IGR1ZSB0byB0aGUgc3RydWN0dXJlIG9mIHRoZSA0LVdheSBIYW5kc2hha2Ugd2UgbmV2ZXIKKyAqIGFjdHVhbGx5IG5lZWQgdG8gZW5jcnlwdCBrZXkgZGF0YSwgb25seSBkZWNyeXB0IGl0LgorICovCitzdHJ1Y3Qgd3BhX2tpZSB7CisJLyoqIFZhbHVlIG9mIHZlcnNpb24gYml0cyBpbiBFQVBPTC1LZXkgaW5mbyBmaWVsZCBmb3Igd2hpY2ggdG8gdXNlCisJICoKKwkgKiBUaGlzIHNob3VsZCBiZSBvbmUgb2YgdGhlIEBjIEVBUE9MX0tFWV9WRVJTSU9OXyogY29uc3RhbnRzLgorCSAqLworCWludCB2ZXJzaW9uOworCisJLyoqIENhbGN1bGF0ZSBNSUMgb3ZlciBtZXNzYWdlCisJICoKKwkgKiBAdiBrY2sJS2V5IENvbmZpcm1hdGlvbiBLZXksIDE2IGJ5dGVzCisJICogQHYgbXNnCU1lc3NhZ2UgdG8gY2FsY3VsYXRlIE1JQyBvdmVyCisJICogQHYgbGVuCU51bWJlciBvZiBieXRlcyB0byBjYWxjdWxhdGUgTUlDIG92ZXIKKwkgKiBAcmV0IG1pYwlDYWxjdWxhdGVkIE1JQywgMTYgYnl0ZXMgbG9uZworCSAqCisJICogVGhlIEBhIG1pYyByZXR1cm4gbWF5IHBvaW50IHdpdGhpbiBAYSBtc2csIHNvIGl0IG11c3Qgbm90CisJICogYmUgZmlsbGVkIHVudGlsIHRoZSBjYWxjdWxhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuCisJICovCisJdm9pZCAoICogbWljICkgKCBjb25zdCB2b2lkICprY2ssIGNvbnN0IHZvaWQgKm1zZywgc2l6ZV90IGxlbiwKKwkJCSB2b2lkICptaWMgKTsKKworCS8qKiBEZWNyeXB0IGtleSBkYXRhCisJICoKKwkgKiBAdiBrZWsJS2V5IEVuY3J5cHRpb24gS2V5LCAxNiBieXRlcworCSAqIEB2IGl2CUluaXRpYWxpc2F0aW9uIHZlY3RvciBmb3IgZW5jcnlwdGlvbiwgMTYgYnl0ZXMKKwkgKiBAdiBtc2cJTWVzc2FnZSB0byBkZWNyeXB0IChLZXkgRGF0YSBmaWVsZCkKKwkgKiBAdiBsZW4JTGVuZ3RoIG9mIG1lc3NhZ2UKKwkgKiBAcmV0IG1zZwlEZWNyeXB0ZWQgbWVzc2FnZSBpbiBwbGFjZSBvZiBvcmlnaW5hbAorCSAqIEByZXQgbGVuCVVwZGF0ZWQgdG8gcmVmbGVjdCBlbmNyeXB0ZWQgbGVuZ3RoCisJICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKgorCSAqIFRoZSBkZWNyeXB0ZWQgbWVzc2FnZSBpcyB3cml0dGVuIG92ZXIgdGhlIGVuY3J5cHRlZCBvbmUuCisJICovCisJaW50ICggKiBkZWNyeXB0ICkgKCBjb25zdCB2b2lkICprZWssIGNvbnN0IHZvaWQgKml2LCB2b2lkICptc2csCisJCQkgICAgdTE2ICpsZW4gKTsKK307CisKKyNkZWZpbmUgV1BBX0tJRVMJX190YWJsZSAoIHN0cnVjdCB3cGFfa2llLCAid3BhX2tpZXMiICkKKyNkZWZpbmUgX193cGFfa2llCV9fdGFibGVfZW50cnkgKCBXUEFfS0lFUywgMDEgKQorCisKKworLyoqCisgKiBAZGVmZ3JvdXAgd3BhX2tkZSBLZXkgZGVzY3JpcHRvciBlbGVtZW50IHR5cGVzCisgKiBAeworICovCisKKy8qKiBQYXlsb2FkIHN0cnVjdHVyZSBvZiB0aGUgR1RLLWVuY2Fwc3VsYXRpbmcgS0RFCisgKgorICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBJRSB0eXBlLCBsZW5ndGgsIG9yIE9VSSBieXRlcywgd2hpY2ggYXJlCisgKiBnZW5lcmljIHRvIGFsbCBLREVzLgorICovCitzdHJ1Y3Qgd3BhX2tkZV9ndGtfZW5jYXAKK3sKKwkvKiogS2V5IElEIGFuZCBUWCBiaXQgKi8KKwl1OCBpZDsKKworCS8qKiBSZXNlcnZlZCBieXRlICovCisJdTggX3JzdmQ7CisKKwkvKiogRW5jYXBzdWxhdGVkIGdyb3VwIHRyYW5zaWVudCBrZXkgKi8KKwlzdHJ1Y3Qgd3BhX2d0ayBndGs7Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogTWFzayBmb3IgS2V5IElEIGluIHdwYV9rZGVfZ3RrOjppZCBmaWVsZCAqLworI2RlZmluZSBXUEFfR1RLX0tJRAkweDAzCisKKy8qKiBNYXNrIGZvciBUeCBiaXQgaW4gd3BhX2tkZV9ndGs6OmlkIGZpZWxkICovCisjZGVmaW5lIFdQQV9HVEtfVFhCSVQJMHgwNAorCisKKy8qKiBLREUgdHlwZSBmb3IgYW4gZW5jYXBzdWxhdGVkIEdyb3VwIFRyYW5zaWVudCBLZXkgKHJlcXVpcmVzIGVuY3J5cHRpb24pICovCisjZGVmaW5lIFdQQV9LREVfR1RLCV9NS09VSSAoIDB4MDAsIDB4MEYsIDB4QUMsIDB4MDEgKQorCisvKiogS0RFIHR5cGUgZm9yIGEgTUFDIGFkZHJlc3MgKi8KKyNkZWZpbmUgV1BBX0tERV9NQUMJX01LT1VJICggMHgwMCwgMHgwRiwgMHhBQywgMHgwMyApCisKKy8qKiBLREUgdHlwZSBmb3IgYSBQTUtJRCAqLworI2RlZmluZSBXUEFfS0RFX1BNS0lECV9NS09VSSAoIDB4MDAsIDB4MEYsIDB4QUMsIDB4MDQgKQorCisvKiogS0RFIHR5cGUgZm9yIGEgbm9uY2UgKi8KKyNkZWZpbmUgV1BBX0tERV9OT05DRQlfTUtPVUkgKCAweDAwLCAweDBGLCAweEFDLCAweDA2ICkKKworLyoqIEtERSB0eXBlIGZvciBhIGxpZmV0aW1lIHZhbHVlICovCisjZGVmaW5lIFdQQV9LREVfTElGRVRJTUUgX01LT1VJICggMHgwMCwgMHgwRiwgMHhBQywgMHgwNyApCisKKworLyoqIEFueSBrZXkgZGVzY3JpcHRvciBlbGVtZW50IHR5cGUKKyAqCisgKiBLREVzIGZvbGxvdyB0aGUgODAyLjExIGluZm9ybWF0aW9uIGVsZW1lbnQgZm9ybWF0IG9mIGEgdHlwZSBieXRlCisgKiAoaW4gdGhpcyBjYXNlICJ2ZW5kb3Itc3BlY2lmaWMiLCB3aXRoIHRoZSByZXF1aXNpdGUgT1VJK3N1YnR5cGUKKyAqIGFmdGVyIGxlbmd0aCkgYW5kIGEgbGVuZ3RoIGJ5dGUgd2hvc2UgdmFsdWUgZG9lcyBub3QgaW5jbHVkZSB0aGUKKyAqIGxlbmd0aCBvZiB0aGUgdHlwZSBhbmQgbGVuZ3RoIGJ5dGVzLgorICovCitzdHJ1Y3Qgd3BhX2tkZQoreworCS8qKiBJbmZvcm1hdGlvbiBlbGVtZW50IHR5cGU6IGFsd2F5cyAweEREIChJRUVFODAyMTFfSUVfVkVORE9SKSAqLworCXU4IGllX3R5cGU7CisKKwkvKiogTGVuZ3RoLCBub3QgaW5jbHVkaW5nIGllX3R5cGUgYW5kIGxlbmd0aCBmaWVsZHMgKi8KKwl1OCBsZW47CisKKwkvKiogT1VJICsgdHlwZSBieXRlICovCisJdTMyIG91aV90eXBlOworCisJLyoqIFBheWxvYWQgZGF0YSAqLworCXVuaW9uIHsKKwkJLyoqIEZvciBHVEstdHlwZSBLREVzLCBlbmNhcHN1bGF0ZWQgR1RLICovCisJCXN0cnVjdCB3cGFfa2RlX2d0a19lbmNhcCBndGtfZW5jYXA7CisKKwkJLyoqIEZvciBNQUMtdHlwZSBLREVzLCB0aGUgTUFDIGFkZHJlc3MgKi8KKwkJdTggbWFjW0VUSF9BTEVOXTsKKworCQkvKiogRm9yIFBNS0lELXR5cGUgS0RFcywgdGhlIFBNS0lEICovCisJCXU4IHBta2lkW1dQQV9QTUtJRF9MRU5dOworCisJCS8qKiBGb3IgTm9uY2UtdHlwZSBLREVzLCB0aGUgbm9uY2UgKi8KKwkJdTggbm9uY2VbV1BBX05PTkNFX0xFTl07CisKKwkJLyoqIEZvciBMaWZldGltZS10eXBlIEtERXMsIHRoZSBsaWZldGltZSBpbiBzZWNvbmRzCisJCSAqCisJCSAqIFRoaXMgaXMgaW4gbmV0d29yayBieXRlIG9yZGVyIQorCQkgKi8KKwkJdTMyIGxpZmV0aW1lOworCX07Cit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogQH0gKi8KKworaW50IHdwYV9tYWtlX3Jzbl9pZSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgdW5pb24gaWVlZTgwMjExX2llICoqaWUgKTsKK2ludCB3cGFfc3RhcnQgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIHN0cnVjdCB3cGFfY29tbW9uX2N0eCAqY3R4LAorCQljb25zdCB2b2lkICpwbWssIHNpemVfdCBwbWtfbGVuICk7Cit2b2lkIHdwYV9zdG9wICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICk7CisKKyNlbmRpZiAvKiBfR1BYRV9XUEFfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9ncHhlL3g1MDkuaCBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS94NTA5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5ZDlhYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS94NTA5LmgKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBfR1BYRV9YNTA5X0gKKyNkZWZpbmUgX0dQWEVfWDUwOV9ICisKKy8qKiBAZmlsZQorICoKKyAqIFguNTA5IGNlcnRpZmljYXRlcworICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IGFzbjFfY3Vyc29yOworCisvKiogQW4gWC41MDkgUlNBIHB1YmxpYyBrZXkgKi8KK3N0cnVjdCB4NTA5X3JzYV9wdWJsaWNfa2V5IHsKKwkvKiogTW9kdWx1cyAqLworCXVpbnQ4X3QgKm1vZHVsdXM7CisJLyoqIE1vZHVsdXMgbGVuZ3RoICovCisJc2l6ZV90IG1vZHVsdXNfbGVuOworCS8qKiBFeHBvbmVudCAqLworCXVpbnQ4X3QgKmV4cG9uZW50OworCS8qKiBFeHBvbmVudCBsZW5ndGggKi8KKwlzaXplX3QgZXhwb25lbnRfbGVuOworfTsKKworLyoqCisgKiBGcmVlIFguNTA5IFJTQSBwdWJsaWMga2V5CisgKgorICogQHYgcnNhX3B1YmtleQlSU0EgcHVibGljIGtleQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3g1MDlfZnJlZV9yc2FfcHVibGljX2tleSAoIHN0cnVjdCB4NTA5X3JzYV9wdWJsaWNfa2V5ICpyc2FfcHVia2V5ICkgeworCWZyZWUgKCByc2FfcHVia2V5LT5tb2R1bHVzICk7Cit9CisKK2V4dGVybiBpbnQgeDUwOV9yc2FfcHVibGljX2tleSAoIGNvbnN0IHN0cnVjdCBhc24xX2N1cnNvciAqY2VydGlmaWNhdGUsCisJCQkJIHN0cnVjdCB4NTA5X3JzYV9wdWJsaWNfa2V5ICpyc2FfcHVia2V5ICk7CisKKyNlbmRpZiAvKiBfR1BYRV9YNTA5X0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvZ3B4ZS94ZmVyLmggYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUveGZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDM3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2dweGUveGZlci5oCkBAIC0wLDAgKzEsMjc3IEBACisjaWZuZGVmIF9HUFhFX1hGRVJfSAorI2RlZmluZSBfR1BYRV9YRkVSX0gKKworLyoqIEBmaWxlCisgKgorICogRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2VzCisgKgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGdweGUvaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorCitzdHJ1Y3QgeGZlcl9pbnRlcmZhY2U7CitzdHJ1Y3QgeGZlcl9tZXRhZGF0YTsKKworLyoqIERhdGEgdHJhbnNmZXIgaW50ZXJmYWNlIG9wZXJhdGlvbnMgKi8KK3N0cnVjdCB4ZmVyX2ludGVyZmFjZV9vcGVyYXRpb25zIHsKKwkvKiogQ2xvc2UgaW50ZXJmYWNlCisJICoKKwkgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorCSAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisJICovCisJdm9pZCAoICogY2xvc2UgKSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHJjICk7CisJLyoqIFJlZGlyZWN0IHRvIG5ldyBsb2NhdGlvbgorCSAqCisJICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKwkgKiBAdiB0eXBlCQlOZXcgbG9jYXRpb24gdHlwZQorCSAqIEB2IGFyZ3MJCVJlbWFpbmluZyBhcmd1bWVudHMgZGVwZW5kIHVwb24gbG9jYXRpb24gdHlwZQorCSAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorCSAqLworCWludCAoICogdnJlZGlyZWN0ICkgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGludCB0eXBlLAorCQkJICAgICAgdmFfbGlzdCBhcmdzICk7CisJLyoqIENoZWNrIGZsb3cgY29udHJvbCB3aW5kb3cKKwkgKgorCSAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisJICogQHJldCBsZW4JCUxlbmd0aCBvZiB3aW5kb3cKKwkgKgorCSAqIEZsb3cgY29udHJvbCBpcyByZWdhcmRlZCBhcyBhZHZpc29yeSBidXQgbm90IG1hbmRhdG9yeS4KKwkgKiBVc2VycyB3aG8gaGF2ZSBjb250cm9sIG92ZXIgdGhlaXIgb3duIHJhdGUgb2YgZGF0YQorCSAqIGdlbmVyYXRpb24gc2hvdWxkIHBlcmZvcm0gYSBmbG93IGNvbnRyb2wgY2hlY2sgYmVmb3JlCisJICogZ2VuZXJhdGluZyBuZXcgZGF0YS4gIFVzZXJzIHdobyBoYXZlIG5vIGNvbnRyb2wgKHN1Y2ggYXMKKwkgKiBOSUMgZHJpdmVycyBvciBmaWx0ZXIgbGF5ZXJzKSBhcmUgbm90IG9ibGlnZWQgdG8gY2hlY2suCisJICoKKwkgKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZXMgbXVzdCBiZSBwcmVwYXJlZCB0byBhY2NlcHQKKwkgKiBkYXRhZ3JhbXMgZXZlbiBpZiB0aGV5IGFyZSBhZHZlcnRpc2luZyBhIHdpbmRvdyBvZiB6ZXJvCisJICogYnl0ZXMuCisJICovCisJc2l6ZV90ICggKiB3aW5kb3cgKSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciApOworCS8qKiBBbGxvY2F0ZSBJL08gYnVmZmVyCisJICoKKwkgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorCSAqIEB2IGxlbgkJSS9PIGJ1ZmZlciBwYXlsb2FkIGxlbmd0aAorCSAqIEByZXQgaW9idWYJCUkvTyBidWZmZXIKKwkgKi8KKwlzdHJ1Y3QgaW9fYnVmZmVyICogKCAqIGFsbG9jX2lvYiApICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCQkgICAgIHNpemVfdCBsZW4gKTsKKwkvKiogRGVsaXZlciBkYXRhZ3JhbSBhcyBJL08gYnVmZmVyIHdpdGggbWV0YWRhdGEKKwkgKgorCSAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisJICogQHYgaW9idWYJCURhdGFncmFtIEkvTyBidWZmZXIKKwkgKiBAdiBtZXRhCQlEYXRhIHRyYW5zZmVyIG1ldGFkYXRhCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICoKKwkgKiBBIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlIHRoYXQgd2lzaGVzIHRvIHN1cHBvcnQgb25seSByYXcKKwkgKiBkYXRhIGRlbGl2ZXJ5IHNob3VsZCBzZXQgdGhpcyBtZXRob2QgdG8KKwkgKiB4ZmVyX2RlbGl2ZXJfYXNfcmF3KCkuCisJICovCisJaW50ICggKiBkZWxpdmVyX2lvYiApICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJCXN0cnVjdCB4ZmVyX21ldGFkYXRhICptZXRhICk7CisJLyoqIERlbGl2ZXIgZGF0YWdyYW0gYXMgcmF3IGRhdGEKKwkgKgorCSAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisJICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKwkgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorCSAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorCSAqCisJICogQSBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSB0aGF0IHdpc2hlcyB0byBzdXBwb3J0IG9ubHkgSS9PCisJICogYnVmZmVyIGRlbGl2ZXJ5IHNob3VsZCBzZXQgdGhpcyBtZXRob2QgdG8KKwkgKiB4ZmVyX2RlbGl2ZXJfYXNfaW9iKCkuCisJICovCisJaW50ICggKiBkZWxpdmVyX3JhdyApICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKTsKK307CisKKy8qKiBBIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlICovCitzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgeworCS8qKiBHZW5lcmljIG9iamVjdCBjb21tdW5pY2F0aW9uIGludGVyZmFjZSAqLworCXN0cnVjdCBpbnRlcmZhY2UgaW50ZjsKKwkvKiogT3BlcmF0aW9ucyBmb3IgcmVjZWl2ZWQgbWVzc2FnZXMgKi8KKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyAqb3A7Cit9OworCisvKiogQmFzaXMgcG9zaXRpb25zIGZvciBzZWVrKCkgZXZlbnRzICovCitlbnVtIHNlZWtfd2hlbmNlIHsKKwlTRUVLX0NVUiA9IDAsCisJU0VFS19TRVQsCit9OworCisvKiogRGF0YSB0cmFuc2ZlciBtZXRhZGF0YSAqLworc3RydWN0IHhmZXJfbWV0YWRhdGEgeworCS8qKiBQb3NpdGlvbiBvZiBkYXRhIHdpdGhpbiBzdHJlYW0gKi8KKwlvZmZfdCBvZmZzZXQ7CisJLyoqIEJhc2lzIGZvciBkYXRhIHBvc2l0aW9uCisJICoKKwkgKiBNdXN0IGJlIG9uZSBvZiBAYyBTRUVLX0NVUiBvciBAYyBTRUVLX1NFVC4KKwkgKi8KKwlpbnQgd2hlbmNlOworCS8qKiBTb3VyY2Ugc29ja2V0IGFkZHJlc3MsIG9yIE5VTEwgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgKnNyYzsKKwkvKiogRGVzdGluYXRpb24gc29ja2V0IGFkZHJlc3MsIG9yIE5VTEwgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgKmRlc3Q7CisJLyoqIE5ldHdvcmsgZGV2aWNlLCBvciBOVUxMICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKK307CisKKy8qKgorICogRGVzY3JpYmUgc2VlayBiYXNpcworICoKKyAqIEB2IHdoZW5jZQkJQmFzaXMgZm9yIG5ldyBwb3NpdGlvbgorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBjb25zdCBjaGFyICoKK3doZW5jZV90ZXh0ICggaW50IHdoZW5jZSApIHsKKwlzd2l0Y2ggKCB3aGVuY2UgKSB7CisJY2FzZSBTRUVLX0NVUjoJcmV0dXJuICJDVVIiOworCWNhc2UgU0VFS19TRVQ6CXJldHVybiAiU0VUIjsKKwlkZWZhdWx0OglyZXR1cm4gIklOVkFMSUQiOworCX0KK30KKworZXh0ZXJuIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSBudWxsX3hmZXI7CitleHRlcm4gc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgbnVsbF94ZmVyX29wczsKKworZXh0ZXJuIHZvaWQgeGZlcl9jbG9zZSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHJjICk7CitleHRlcm4gaW50IHhmZXJfdnJlZGlyZWN0ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgdHlwZSwKKwkJCSAgICB2YV9saXN0IGFyZ3MgKTsKK2V4dGVybiBpbnQgeGZlcl9yZWRpcmVjdCAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHR5cGUsIC4uLiApOworZXh0ZXJuIHNpemVfdCB4ZmVyX3dpbmRvdyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciApOworZXh0ZXJuIHN0cnVjdCBpb19idWZmZXIgKiB4ZmVyX2FsbG9jX2lvYiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCQkJICAgc2l6ZV90IGxlbiApOworZXh0ZXJuIGludCB4ZmVyX2RlbGl2ZXJfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKTsKK2V4dGVybiBpbnQgeGZlcl9kZWxpdmVyX2lvYl9tZXRhICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCSAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJCSAgIHN0cnVjdCB4ZmVyX21ldGFkYXRhICptZXRhICk7CitleHRlcm4gaW50IHhmZXJfZGVsaXZlcl9yYXcgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7CitleHRlcm4gaW50IHhmZXJfdnByaW50ZiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCSAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MgKTsKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXyAoKCBmb3JtYXQgKCBwcmludGYsIDIsIDMgKSApKQoreGZlcl9wcmludGYgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uICk7CitleHRlcm4gaW50IHhmZXJfc2VlayAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlICk7CisKK2V4dGVybiB2b2lkIGlnbm9yZV94ZmVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKTsKK2V4dGVybiBpbnQgaWdub3JlX3hmZXJfdnJlZGlyZWN0ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCSAgIGludCB0eXBlLCB2YV9saXN0IGFyZ3MgKTsKK2V4dGVybiBzaXplX3QgdW5saW1pdGVkX3hmZXJfd2luZG93ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyICk7CitleHRlcm4gc2l6ZV90IG5vX3hmZXJfd2luZG93ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyICk7CitleHRlcm4gc3RydWN0IGlvX2J1ZmZlciAqIGRlZmF1bHRfeGZlcl9hbGxvY19pb2IgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkJCQkgICBzaXplX3QgbGVuICk7CitleHRlcm4gaW50IHhmZXJfZGVsaXZlcl9hc19yYXcgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkJIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJCSBzdHJ1Y3QgeGZlcl9tZXRhZGF0YSAqbWV0YSApOworZXh0ZXJuIGludCB4ZmVyX2RlbGl2ZXJfYXNfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCSBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7CitleHRlcm4gaW50IGlnbm9yZV94ZmVyX2RlbGl2ZXJfcmF3ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSBfX3VudXNlZCwgc2l6ZV90IGxlbiApOworCisvKioKKyAqIEluaXRpYWxpc2UgYSBkYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiBvcAkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2Ugb3BlcmF0aW9ucworICogQHYgcmVmY250CQlDb250YWluaW5nIG9iamVjdCByZWZlcmVuY2UgY291bnRlciwgb3IgTlVMTAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgeGZlcl9pbml0ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJICAgICAgIHN0cnVjdCB4ZmVyX2ludGVyZmFjZV9vcGVyYXRpb25zICpvcCwKKwkJCSAgICAgICBzdHJ1Y3QgcmVmY250ICpyZWZjbnQgKSB7CisJeGZlci0+aW50Zi5kZXN0ID0gJm51bGxfeGZlci5pbnRmOworCXhmZXItPmludGYucmVmY250ID0gcmVmY250OworCXhmZXItPm9wID0gb3A7Cit9CisKKy8qKgorICogSW5pdGlhbGlzZSBhIHN0YXRpYyBkYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICoKKyAqIEB2IG9wZXJhdGlvbnMJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlIG9wZXJhdGlvbnMKKyAqLworI2RlZmluZSBYRkVSX0lOSVQoIG9wZXJhdGlvbnMgKSB7CQkJXAorCQkuaW50ZiA9IHsJCQkJXAorCQkJLmRlc3QgPSAmbnVsbF94ZmVyLmludGYsCVwKKwkJCS5yZWZjbnQgPSBOVUxMLAkJCVwKKwkJfSwJCQkJCVwKKwkJLm9wID0gb3BlcmF0aW9ucywJCQlcCisJfQorCisvKioKKyAqIEdldCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBmcm9tIGdlbmVyaWMgb2JqZWN0IGNvbW11bmljYXRpb24gaW50ZXJmYWNlCisgKgorICogQHYgaW50ZgkJR2VuZXJpYyBvYmplY3QgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UKKyAqIEByZXQgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgc3RydWN0IHhmZXJfaW50ZXJmYWNlICoKK2ludGZfdG9feGZlciAoIHN0cnVjdCBpbnRlcmZhY2UgKmludGYgKSB7CisJcmV0dXJuIGNvbnRhaW5lcl9vZiAoIGludGYsIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSwgaW50ZiApOworfQorCisvKioKKyAqIEdldCByZWZlcmVuY2UgdG8gZGVzdGluYXRpb24gZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHJldCBkZXN0CQlEZXN0aW5hdGlvbiBpbnRlcmZhY2UKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgc3RydWN0IHhmZXJfaW50ZXJmYWNlICoKK3hmZXJfZ2V0X2Rlc3QgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIgKSB7CisJcmV0dXJuIGludGZfdG9feGZlciAoIGludGZfZ2V0ICggeGZlci0+aW50Zi5kZXN0ICkgKTsKK30KKworLyoqCisgKiBEcm9wIHJlZmVyZW5jZSB0byBkYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK3hmZXJfcHV0ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyICkgeworCWludGZfcHV0ICggJnhmZXItPmludGYgKTsKK30KKworLyoqCisgKiBQbHVnIGEgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UgaW50byBhIG5ldyBkZXN0aW5hdGlvbiBpbnRlcmZhY2UKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgZGVzdAkJTmV3IGRlc3RpbmF0aW9uIGludGVyZmFjZQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCit4ZmVyX3BsdWcgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqZGVzdCApIHsKKwlwbHVnICggJnhmZXItPmludGYsICZkZXN0LT5pbnRmICk7Cit9CisKKy8qKgorICogUGx1ZyB0d28gZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2VzIHRvZ2V0aGVyCisgKgorICogQHYgYQkJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlIEEKKyAqIEB2IGIJCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZSBCCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIHZvaWQKK3hmZXJfcGx1Z19wbHVnICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICphLCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKmIgKSB7CisJcGx1Z19wbHVnICggJmEtPmludGYsICZiLT5pbnRmICk7Cit9CisKKy8qKgorICogVW5wbHVnIGEgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCit4ZmVyX3VucGx1ZyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciApIHsKKwlwbHVnICggJnhmZXItPmludGYsICZudWxsX3hmZXIuaW50ZiApOworfQorCisvKioKKyAqIFN0b3AgdXNpbmcgYSBkYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKgorICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgbm8gZnVydGhlciBtZXNzYWdlcyB3aWxsIGJlIHJlY2VpdmVkIHZpYQorICogdGhlIGludGVyZmFjZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHhmZXJfbnVsbGlmeSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciApIHsKKwl4ZmVyLT5vcCA9ICZudWxsX3hmZXJfb3BzOworfTsKKworI2VuZGlmIC8qIF9HUFhFX1hGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9oY2kvaWZtZ210X2NtZC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9oY2kvaWZtZ210X2NtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzgxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2hjaS9pZm1nbXRfY21kLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX0lGTUdNVF9DTURfSAorI2RlZmluZSBfSUZNR01UX0NNRF9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworc3RydWN0IG5ldF9kZXZpY2U7CisKK2V4dGVybiBpbnQgaWZjb21tb25fZXhlYyAoICBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICAgaW50ICggKiBwYXlsb2FkICkgKCBzdHJ1Y3QgbmV0X2RldmljZSAqICksCisJCQkgICAgY29uc3QgY2hhciAqdmVyYiApOworCisjZW5kaWYgLyogX0lGTUdNVF9DTURfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9pODIzNjUuaCBiL2dweGUvc3JjL2luY2x1ZGUvaTgyMzY1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwZTAwYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvaTgyMzY1LmgKQEAgLTAsMCArMSw0NTAgQEAKKy8qCisgKiBpODIzNjUuaCAxLjE1IDE5OTkvMTAvMjUgMjA6MDM6MzQKKyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKS4KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCisgKiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlCisgKiB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gCisgKgorICogVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBvcmlnaW5hbCBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCisgKiA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LiAgUG9ydGlvbnMgY3JlYXRlZCBieSBEYXZpZCBBLiBIaW5kcworICogYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfTElOVVhfSTgyMzY1X0gKKyNkZWZpbmUgX0xJTlVYX0k4MjM2NV9ICisKKy8qIHJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgSW50ZWwgODIzNjVTTCBQQ01DSUEgY29udHJvbGxlciAqLworCisvKiBPZmZzZXRzIGZvciBQQ0lDIHJlZ2lzdGVycyAqLworI2RlZmluZSBJMzY1X0lERU5UCTB4MDAJLyogSWRlbnRpZmljYXRpb24gYW5kIHJldmlzaW9uICovCisjZGVmaW5lIEkzNjVfU1RBVFVTCTB4MDEJLyogSW50ZXJmYWNlIHN0YXR1cyAqLworI2RlZmluZSBJMzY1X1BPV0VSCTB4MDIJLyogUG93ZXIgYW5kIFJFU0VURFJWIGNvbnRyb2wgKi8KKyNkZWZpbmUgSTM2NV9JTlRDVEwJMHgwMwkvKiBJbnRlcnJ1cHQgYW5kIGdlbmVyYWwgY29udHJvbCAqLworI2RlZmluZSBJMzY1X0NTQwkweDA0CS8qIENhcmQgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBJMzY1X0NTQ0lOVAkweDA1CS8qIENhcmQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgY29udHJvbCAqLworI2RlZmluZSBJMzY1X0FERFJXSU4JMHgwNgkvKiBBZGRyZXNzIHdpbmRvdyBlbmFibGUgKi8KKyNkZWZpbmUgSTM2NV9JT0NUTAkweDA3CS8qIEkvTyBjb250cm9sICovCisjZGVmaW5lIEkzNjVfR0VOQ1RMCTB4MTYJLyogQ2FyZCBkZXRlY3QgYW5kIGdlbmVyYWwgY29udHJvbCAqLworI2RlZmluZSBJMzY1X0dCTENUTAkweDFFCS8qIEdsb2JhbCBjb250cm9sIHJlZ2lzdGVyICovCisKKy8qIE9mZnNldHMgZm9yIEkvTyBhbmQgbWVtb3J5IHdpbmRvdyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSTM2NV9JTyhtYXApCSgweDA4KygobWFwKTw8MikpCisjZGVmaW5lIEkzNjVfTUVNKG1hcCkJKDB4MTArKChtYXApPDwzKSkKKyNkZWZpbmUgSTM2NV9XX1NUQVJUCTAKKyNkZWZpbmUgSTM2NV9XX1NUT1AJMgorI2RlZmluZSBJMzY1X1dfT0ZGCTQKKworLyogRmxhZ3MgZm9yIEkzNjVfU1RBVFVTICovCisjZGVmaW5lIEkzNjVfQ1NfQlZEMQkweDAxCisjZGVmaW5lIEkzNjVfQ1NfU1RTQ0hHCTB4MDEKKyNkZWZpbmUgSTM2NV9DU19CVkQyCTB4MDIKKyNkZWZpbmUgSTM2NV9DU19TUEtSCTB4MDIKKyNkZWZpbmUgSTM2NV9DU19ERVRFQ1QJMHgwQworI2RlZmluZSBJMzY1X0NTX1dSUFJPVAkweDEwCisjZGVmaW5lIEkzNjVfQ1NfUkVBRFkJMHgyMAkvKiBJbnZlcnRlZCAqLworI2RlZmluZSBJMzY1X0NTX1BPV0VST04JMHg0MAorI2RlZmluZSBJMzY1X0NTX0dQSQkweDgwCisKKy8qIEZsYWdzIGZvciBJMzY1X1BPV0VSICovCisjZGVmaW5lIEkzNjVfUFdSX09GRgkweDAwCS8qIFR1cm4gb2ZmIHRoZSBzb2NrZXQgKi8KKyNkZWZpbmUgSTM2NV9QV1JfT1VUCTB4ODAJLyogT3V0cHV0IGVuYWJsZSAqLworI2RlZmluZSBJMzY1X1BXUl9OT1JFU0VUIDB4NDAJLyogRGlzYWJsZSBSRVNFVERSViBvbiByZXN1bWUgKi8KKyNkZWZpbmUgSTM2NV9QV1JfQVVUTwkweDIwCS8qIEF1dG8gcHdyIHN3aXRjaCBlbmFibGUgKi8KKyNkZWZpbmUgSTM2NV9WQ0NfTUFTSwkweDE4CS8qIE1hc2sgZm9yIHR1cm5pbmcgb2ZmIFZjYyAqLworLyogVGhlcmUgYXJlIGRpZmZlcmVudCBsYXlvdXRzIGZvciBCLXN0ZXAgYW5kIERGLXN0ZXAgY2hpcHM6IHRoZSBCCisgICBzdGVwIGhhcyBpbmRlcGVuZGVudCBWcHAxL1ZwcDIgY29udHJvbCwgYW5kIHRoZSBERiBzdGVwIGhhcyBvbmx5CisgICBWcHAxIGNvbnRyb2wsIHBsdXMgM1YgY29udHJvbCAqLworI2RlZmluZSBJMzY1X1ZDQ181VgkweDEwCS8qIFZjYyA9IDUuMHYgKi8KKyNkZWZpbmUgSTM2NV9WQ0NfM1YJMHgxOAkvKiBWY2MgPSAzLjN2ICovCisjZGVmaW5lIEkzNjVfVlBQMl9NQVNLCTB4MGMJLyogTWFzayBmb3IgdHVybmluZyBvZmYgVnBwMiAqLworI2RlZmluZSBJMzY1X1ZQUDJfNVYJMHgwNAkvKiBWcHAyID0gNS4wdiAqLworI2RlZmluZSBJMzY1X1ZQUDJfMTJWCTB4MDgJLyogVnBwMiA9IDEyLjB2ICovCisjZGVmaW5lIEkzNjVfVlBQMV9NQVNLCTB4MDMJLyogTWFzayBmb3IgdHVybmluZyBvZmYgVnBwMSAqLworI2RlZmluZSBJMzY1X1ZQUDFfNVYJMHgwMQkvKiBWcHAyID0gNS4wdiAqLworI2RlZmluZSBJMzY1X1ZQUDFfMTJWCTB4MDIJLyogVnBwMiA9IDEyLjB2ICovCisKKy8qIEZsYWdzIGZvciBJMzY1X0lOVENUTCAqLworI2RlZmluZSBJMzY1X1JJTkdfRU5BCTB4ODAKKyNkZWZpbmUgSTM2NV9QQ19SRVNFVAkweDQwCisjZGVmaW5lIEkzNjVfUENfSU9DQVJECTB4MjAKKyNkZWZpbmUgSTM2NV9JTlRSX0VOQQkweDEwCisjZGVmaW5lIEkzNjVfSVJRX01BU0sJMHgwRgorCisvKiBGbGFncyBmb3IgSTM2NV9DU0MgYW5kIEkzNjVfQ1NDSU5UKi8KKyNkZWZpbmUgSTM2NV9DU0NfQlZEMQkweDAxCisjZGVmaW5lIEkzNjVfQ1NDX1NUU0NIRwkweDAxCisjZGVmaW5lIEkzNjVfQ1NDX0JWRDIJMHgwMgorI2RlZmluZSBJMzY1X0NTQ19SRUFEWQkweDA0CisjZGVmaW5lIEkzNjVfQ1NDX0RFVEVDVAkweDA4CisjZGVmaW5lIEkzNjVfQ1NDX0FOWQkweDBGCisjZGVmaW5lIEkzNjVfQ1NDX0dQSQkweDEwCisKKy8qIEZsYWdzIGZvciBJMzY1X0FERFJXSU4gKi8KKyNkZWZpbmUgSTM2NV9FTkFfSU8obWFwKQkoMHg0MCA8PCAobWFwKSkKKyNkZWZpbmUgSTM2NV9FTkFfTUVNKG1hcCkJKDB4MDEgPDwgKG1hcCkpCisKKy8qIEZsYWdzIGZvciBJMzY1X0lPQ1RMICovCisjZGVmaW5lIEkzNjVfSU9DVExfTUFTSyhtYXApCSgweDBGIDw8IChtYXA8PDIpKQorI2RlZmluZSBJMzY1X0lPQ1RMX1dBSVQobWFwKQkoMHgwOCA8PCAobWFwPDwyKSkKKyNkZWZpbmUgSTM2NV9JT0NUTF8wV1MobWFwKQkoMHgwNCA8PCAobWFwPDwyKSkKKyNkZWZpbmUgSTM2NV9JT0NUTF9JT0NTMTYobWFwKQkoMHgwMiA8PCAobWFwPDwyKSkKKyNkZWZpbmUgSTM2NV9JT0NUTF8xNkJJVChtYXApCSgweDAxIDw8IChtYXA8PDIpKQorCisvKiBGbGFncyBmb3IgSTM2NV9HRU5DVEwgKi8KKyNkZWZpbmUgSTM2NV9DVExfMTZERUxBWQkweDAxCisjZGVmaW5lIEkzNjVfQ1RMX1JFU0VUCQkweDAyCisjZGVmaW5lIEkzNjVfQ1RMX0dQSV9FTkEJMHgwNAorI2RlZmluZSBJMzY1X0NUTF9HUElfQ1RMCTB4MDgKKyNkZWZpbmUgSTM2NV9DVExfUkVTVU1FCQkweDEwCisjZGVmaW5lIEkzNjVfQ1RMX1NXX0lSUQkJMHgyMAorCisvKiBGbGFncyBmb3IgSTM2NV9HQkxDVEwgKi8KKyNkZWZpbmUgSTM2NV9HQkxfUFdSRE9XTgkweDAxCisjZGVmaW5lIEkzNjVfR0JMX0NTQ19MRVYJMHgwMgorI2RlZmluZSBJMzY1X0dCTF9XUkJBQ0sJCTB4MDQKKyNkZWZpbmUgSTM2NV9HQkxfSVJRXzBfTEVWCTB4MDgKKyNkZWZpbmUgSTM2NV9HQkxfSVJRXzFfTEVWCTB4MTAKKworLyogRmxhZ3MgZm9yIG1lbW9yeSB3aW5kb3cgcmVnaXN0ZXJzICovCisjZGVmaW5lIEkzNjVfTUVNXzE2QklUCTB4ODAwMAkvKiBJbiBtZW1vcnkgc3RhcnQgaGlnaCBieXRlICovCisjZGVmaW5lIEkzNjVfTUVNXzBXUwkweDQwMDAKKyNkZWZpbmUgSTM2NV9NRU1fV1MxCTB4ODAwMAkvKiBJbiBtZW1vcnkgc3RvcCBoaWdoIGJ5dGUgKi8KKyNkZWZpbmUgSTM2NV9NRU1fV1MwCTB4NDAwMAorI2RlZmluZSBJMzY1X01FTV9XUlBST1QJMHg4MDAwCS8qIEluIG9mZnNldCBoaWdoIGJ5dGUgKi8KKyNkZWZpbmUgSTM2NV9NRU1fUkVHCTB4NDAwMAorCisjZGVmaW5lIEkzNjVfUkVHKHNsb3QsIHJlZykJKCgoc2xvdCkgPDwgNikgKyByZWcpCisKKyNlbmRpZiAvKiBfTElOVVhfSTgyMzY1X0ggKi8KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gQmVnaW5uaW5nIHZnNDY4LmggKGZvciBWQURFTSBjaGlwc2V0KQorCisjaWZuZGVmIF9MSU5VWF9WRzQ2OF9ICisjZGVmaW5lIF9MSU5VWF9WRzQ2OF9ICisKKy8qIFNwZWNpYWwgYml0IGluIEkzNjVfSURFTlQgdXNlZCBmb3IgVmFkZW0gY2hpcCBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgSTM2NV9JREVOVF9WQURFTSAgICAgICAgMHgwOAorCisvKiBTcGVjaWFsIGRlZmluaXRpb25zIGluIEkzNjVfUE9XRVIgKi8KKyNkZWZpbmUgVkc0NjhfVlBQMl9NQVNLICAgICAgICAgMHgwYworI2RlZmluZSBWRzQ2OF9WUFAyXzVWICAgICAgICAgICAweDA0CisjZGVmaW5lIFZHNDY4X1ZQUDJfMTJWICAgICAgICAgIDB4MDgKKworLyogVW5pcXVlIFZhZGVtIHJlZ2lzdGVycyAqLworI2RlZmluZSBWRzQ2OV9WU0VOU0UgICAgICAgICAgICAweDFmICAgIC8qIENhcmQgdm9sdGFnZSBzZW5zZSAqLworI2RlZmluZSBWRzQ2OV9WU0VMRUNUICAgICAgICAgICAweDJmICAgIC8qIENhcmQgdm9sdGFnZSBzZWxlY3QgKi8KKyNkZWZpbmUgVkc0NjhfQ1RMICAgICAgICAgICAgICAgMHgzOCAgICAvKiBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFZHNDY4X1RJTUVSICAgICAgICAgICAgIDB4MzkgICAgLyogVGltZXIgY29udHJvbCAqLworI2RlZmluZSBWRzQ2OF9NSVNDICAgICAgICAgICAgICAweDNhICAgIC8qIE1pc2NlbGxhbmVvdXMgKi8KKyNkZWZpbmUgVkc0NjhfR1BJT19DRkcgICAgICAgICAgMHgzYiAgICAvKiBHUElPIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgVkc0NjlfRVhUX01PREUgICAgICAgICAgMHgzYyAgICAvKiBFeHRlbmRlZCBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIFZHNDY4X1NFTEVDVCAgICAgICAgICAgIDB4M2QgICAgLyogUHJvZ3JhbW1hYmxlIGNoaXAgc2VsZWN0ICovCisjZGVmaW5lIFZHNDY4X1NFTEVDVF9DRkcgICAgICAgIDB4M2UgICAgLyogQ2hpcCBzZWxlY3QgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBWRzQ2OF9BVEEgICAgICAgICAgICAgICAweDNmICAgIC8qIEFUQSBjb250cm9sICovCisKKy8qIEZsYWdzIGZvciBWRzQ2OV9WU0VOU0UgKi8KKyNkZWZpbmUgVkc0NjlfVlNFTlNFX0FfVlMxICAgICAgMHgwMQorI2RlZmluZSBWRzQ2OV9WU0VOU0VfQV9WUzIgICAgICAweDAyCisjZGVmaW5lIFZHNDY5X1ZTRU5TRV9CX1ZTMSAgICAgIDB4MDQKKyNkZWZpbmUgVkc0NjlfVlNFTlNFX0JfVlMyICAgICAgMHgwOAorCisvKiBGbGFncyBmb3IgVkc0NjlfVlNFTEVDVCAqLworI2RlZmluZSBWRzQ2OV9WU0VMX1ZDQyAgICAgICAgICAweDAzCisjZGVmaW5lIFZHNDY5X1ZTRUxfNVYgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgVkc0NjlfVlNFTF8zViAgICAgICAgICAgMHgwMworI2RlZmluZSBWRzQ2OV9WU0VMX01BWCAgICAgICAgICAweDBjCisjZGVmaW5lIFZHNDY5X1ZTRUxfRVhUX1NUQVQgICAgIDB4MTAKKyNkZWZpbmUgVkc0NjlfVlNFTF9FWFRfQlVTICAgICAgMHgyMAorI2RlZmluZSBWRzQ2OV9WU0VMX01JWEVEICAgICAgICAweDQwCisjZGVmaW5lIFZHNDY5X1ZTRUxfSVNBICAgICAgICAgIDB4ODAKKworLyogRmxhZ3MgZm9yIFZHNDY4X0NUTCAqLworI2RlZmluZSBWRzQ2OF9DVExfU0xPVyAgICAgICAgICAweDAxICAgIC8qIDYwMG5zIG1lbW9yeSB0aW1pbmcgKi8KKyNkZWZpbmUgVkc0NjhfQ1RMX0FTWU5DICAgICAgICAgMHgwMiAgICAvKiBBc3luY2hyb25vdXMgYnVzIGNsb2NraW5nICovCisjZGVmaW5lIFZHNDY4X0NUTF9UU1NJICAgICAgICAgIDB4MDggICAgLyogVHJpLXN0YXRlIHNvbWUgb3V0cHV0cyAqLworI2RlZmluZSBWRzQ2OF9DVExfREVMQVkgICAgICAgICAweDEwICAgIC8qIENhcmQgZGV0ZWN0IGRlYm91bmNlICovCisjZGVmaW5lIFZHNDY4X0NUTF9JTlBBQ0sgICAgICAgIDB4MjAgICAgLyogT2JleSBJTlBBQ0sgc2lnbmFsPyAqLworI2RlZmluZSBWRzQ2OF9DVExfUE9MQVJJVFkgICAgICAweDQwICAgIC8qIFZDQ0VOIHBvbGFyaXR5ICovCisjZGVmaW5lIFZHNDY4X0NUTF9DT01QQVQgICAgICAgIDB4ODAgICAgLyogQ29tcGF0aWJpbGl0eSBzdHVmZiAqLworCisjZGVmaW5lIFZHNDY5X0NUTF9XU19DT01QQVQgICAgIDB4MDQgICAgLyogV2FpdCBzdGF0ZSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFZHNDY5X0NUTF9TVFJFVENIICAgICAgIDB4MTAgICAgLyogTEVEIHN0cmV0Y2ggKi8KKworLyogRmxhZ3MgZm9yIFZHNDY4X1RJTUVSICovCisjZGVmaW5lIFZHNDY4X1RJTUVSX1pFUk9QV1IgICAgIDB4MTAgICAgLyogWmVybyBwb3dlciBjb250cm9sICovCisjZGVmaW5lIFZHNDY4X1RJTUVSX1NJR0VOICAgICAgIDB4MjAgICAgLyogUG93ZXIgdXAgKi8KKyNkZWZpbmUgVkc0NjhfVElNRVJfU1RBVFVTICAgICAgMHg0MCAgICAvKiBBY3Rpdml0eSB0aW1lciBzdGF0dXMgKi8KKyNkZWZpbmUgVkc0NjhfVElNRVJfUkVTICAgICAgICAgMHg4MCAgICAvKiBUaW1lciByZXNvbHV0aW9uICovCisjZGVmaW5lIFZHNDY4X1RJTUVSX01BU0sgICAgICAgIDB4MGYgICAgLyogQWN0aXZpdHkgdGltZXIgdGltZW91dCAqLworCisvKiBGbGFncyBmb3IgVkc0NjhfTUlTQyAqLworI2RlZmluZSBWRzQ2OF9NSVNDX0dQSU8gICAgICAgICAweDA0ICAgIC8qIEdlbmVyYWwtcHVycG9zZSBJTyAqLworI2RlZmluZSBWRzQ2OF9NSVNDX0RNQVdTQiAgICAgICAweDA4ICAgIC8qIERNQSB3YWl0IHN0YXRlIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkc0NjlfTUlTQ19MRURFTkEgICAgICAgMHgxMCAgICAvKiBMRUQgZW5hYmxlICovCisjZGVmaW5lIFZHNDY4X01JU0NfVkFERU1SRVYgICAgIDB4NDAgICAgLyogVmFkZW0gcmV2aXNpb24gY29udHJvbCAqLworI2RlZmluZSBWRzQ2OF9NSVNDX1VOTE9DSyAgICAgICAweDgwICAgIC8qIFVuaXF1ZSByZWdpc3RlciBsb2NrICovCisKKy8qIEZsYWdzIGZvciBWRzQ2OV9FWFRfTU9ERV9BICovCisjZGVmaW5lIFZHNDY5X01PREVfVlBQU1QgICAgICAgIDB4MDMgICAgLyogVnBwIHN0ZWVyaW5nIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkc0NjlfTU9ERV9JTlRfU0VOU0UgICAgMHgwNCAgICAvKiBJbnRlcm5hbCB2b2x0YWdlIHNlbnNlICovCisjZGVmaW5lIFZHNDY5X01PREVfQ0FCTEUgICAgICAgIDB4MDgKKyNkZWZpbmUgVkc0NjlfTU9ERV9DT01QQVQgICAgICAgMHgxMCAgICAvKiBpODIzNjVzbCBCIG9yIERGIHN0ZXAgKi8KKyNkZWZpbmUgVkc0NjlfTU9ERV9URVNUICAgICAgICAgMHgyMAorI2RlZmluZSBWRzQ2OV9NT0RFX1JJTyAgICAgICAgICAweDQwICAgIC8qIFN0ZWVyIFJJTyB0byBJTlRSPyAqLworCisvKiBGbGFncyBmb3IgVkc0NjlfRVhUX01PREVfQiAqLworI2RlZmluZSBWRzQ2OV9NT0RFX0JfM1YgICAgICAgICAweDAxICAgIC8qIDMuM3YgZm9yIHNvY2tldCBCICovCisKKyNlbmRpZiAvKiBfTElOVVhfVkc0NjhfSCAqLworCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEJlZ2lubmluZyByaWNvaC5oIChSSUNPSCBjaGlwc2V0cykKKworI2lmbmRlZiBfTElOVVhfUklDT0hfSAorI2RlZmluZSBfTElOVVhfUklDT0hfSAorCisKKyNkZWZpbmUgUkY1Q19NT0RFX0NUTCAgICAgICAgICAgMHgxZiAgICAvKiBNb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUkY1Q19QV1JfQ1RMICAgICAgICAgICAgMHgyZiAgICAvKiBNaXhlZCB2b2x0YWdlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUkY1Q19DSElQX0lEICAgICAgICAgICAgMHgzYSAgICAvKiBDaGlwIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIFJGNUNfTU9ERV9DVExfMyAgICAgICAgIDB4M2IgICAgLyogTW9kZSBjb250cm9sIDMgKi8KKworLyogSS9PIHdpbmRvdyBhZGRyZXNzIG9mZnNldCAqLworI2RlZmluZSBSRjVDX0lPX09GRih3KSAgICAgICAgICAoMHgzNisoKHcpPDwxKSkKKworLyogRmxhZ3MgZm9yIFJGNUNfTU9ERV9DVEwgKi8KKyNkZWZpbmUgUkY1Q19NT0RFX0FUQSAgICAgICAgICAgMHgwMSAgICAvKiBBVEEgbW9kZSAqLworI2RlZmluZSBSRjVDX01PREVfTEVEX0VOQSAgICAgICAweDAyICAgIC8qIElSUSAxMiBpcyBMRUQgKi8KKyNkZWZpbmUgUkY1Q19NT0RFX0NBMjEgICAgICAgICAgMHgwNAorI2RlZmluZSBSRjVDX01PREVfQ0EyMiAgICAgICAgICAweDA4CisjZGVmaW5lIFJGNUNfTU9ERV9DQTIzICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkY1Q19NT0RFX0NBMjQgICAgICAgICAgMHgyMAorI2RlZmluZSBSRjVDX01PREVfQ0EyNSAgICAgICAgICAweDQwCisjZGVmaW5lIFJGNUNfTU9ERV8zU1RBVEVfQklUNyAgIDB4ODAKKworLyogRmxhZ3MgZm9yIFJGNUNfUFdSX0NUTCAqLworI2RlZmluZSBSRjVDX1BXUl9WQ0NfM1YgICAgICAgICAweDAxCisjZGVmaW5lIFJGNUNfUFdSX0lSRVFfSElHSCAgICAgIDB4MDIKKyNkZWZpbmUgUkY1Q19QV1JfSU5QQUNLX0VOQSAgICAgMHgwNAorI2RlZmluZSBSRjVDX1BXUl81Vl9ERVQgICAgICAgICAweDA4CisjZGVmaW5lIFJGNUNfUFdSX1RDX1NFTCAgICAgICAgIDB4MTAgICAgLyogVGVybWluYWwgQ291bnQ6IGlycSAxMSBvciAxNSAqLworI2RlZmluZSBSRjVDX1BXUl9EUkVRX0xPVyAgICAgICAweDIwCisjZGVmaW5lIFJGNUNfUFdSX0RSRVFfT0ZGICAgICAgIDB4MDAgICAgLyogRFJFUSBzdGVlcmluZyBjb250cm9sICovCisjZGVmaW5lIFJGNUNfUFdSX0RSRVFfSU5QQUNLICAgIDB4NDAKKyNkZWZpbmUgUkY1Q19QV1JfRFJFUV9TUEtSICAgICAgMHg4MAorI2RlZmluZSBSRjVDX1BXUl9EUkVRX0lPSVMxNiAgICAweGMwCisKKy8qIFZhbHVlcyBmb3IgUkY1Q19DSElQX0lEICovCisjZGVmaW5lIFJGNUNfQ0hJUF9SRjVDMjk2ICAgICAgIDB4MzIKKyNkZWZpbmUgUkY1Q19DSElQX1JGNUMzOTYgICAgICAgMHhiMgorCisvKiBGbGFncyBmb3IgUkY1Q19NT0RFX0NUTF8zICovCisjZGVmaW5lIFJGNUNfTUNUTDNfRElTQUJMRSAgICAgIDB4MDEgICAgLyogRGlzYWJsZSBQQ01DSUEgaW50ZXJmYWNlICovCisjZGVmaW5lIFJGNUNfTUNUTDNfRE1BX0VOQSAgICAgIDB4MDIKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIFJpY29oIFBDSS10by1DYXJkQnVzIGJyaWRnZXMgKi8KKworLyogRXh0cmEgYml0cyBpbiBDQl9CUklER0VfQ09OVFJPTCAqLworI2RlZmluZSBSTDVDNDZYX0JDUl8zRTBfRU5BICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBSTDVDNDZYX0JDUl8zRTJfRU5BICAgICAgICAgICAgIDB4MTAwMAorCisvKiBCcmlkZ2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBSTDVDNFhYX0NPTkZJRyAgICAgICAgICAgICAgICAgIDB4ODAgICAgLyogMTYgYml0ICovCisjZGVmaW5lICBSTDVDNFhYX0NPTkZJR19JT18xX01PREUgICAgICAgMHgwMjAwCisjZGVmaW5lICBSTDVDNFhYX0NPTkZJR19JT18wX01PREUgICAgICAgMHgwMTAwCisjZGVmaW5lICBSTDVDNFhYX0NPTkZJR19QUkVGRVRDSCAgICAgICAgMHgwMDAxCisKKworLyogTWlzYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJMNUM0WFhfTUlTQyAgICAgICAgICAgICAgICAgICAgMHgwMDgyICAvKiAxNiBiaXQgKi8KKyNkZWZpbmUgIFJMNUM0WFhfTUlTQ19IV19TVVNQRU5EX0VOQSAgICAweDAwMDIKKyNkZWZpbmUgIFJMNUM0WFhfTUlTQ19WQ0NFTl9QT0wgICAgICAgICAweDAxMDAKKyNkZWZpbmUgIFJMNUM0WFhfTUlTQ19WUFBFTl9QT0wgICAgICAgICAweDAyMDAKKyNkZWZpbmUgIFJMNUM0NlhfTUlTQ19TVVNQRU5EICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgIFJMNUM0NlhfTUlTQ19QV1JfU0FWRV8yICAgICAgICAweDAwMDQKKyNkZWZpbmUgIFJMNUM0NlhfTUlTQ19JRkFDRV9CVVNZICAgICAgICAweDAwMDgKKyNkZWZpbmUgIFJMNUM0NlhfTUlTQ19CX0xPQ0sgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgIFJMNUM0NlhfTUlTQ19BX0xPQ0sgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgIFJMNUM0NlhfTUlTQ19QQ0lfTE9DSyAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgIFJMNUM0N1hfTUlTQ19JRkFDRV9CVVNZICAgICAgICAweDAwMDQKKyNkZWZpbmUgIFJMNUM0N1hfTUlTQ19QQ0lfSU5UX01BU0sgICAgICAweDAwMTgKKyNkZWZpbmUgIFJMNUM0N1hfTUlTQ19QQ0lfSU5UX0RJUyAgICAgICAweDAwMjAKKyNkZWZpbmUgIFJMNUM0N1hfTUlTQ19TVUJTWVNfV1IgICAgICAgICAweDAwNDAKKyNkZWZpbmUgIFJMNUM0N1hfTUlTQ19TUklSUV9FTkEgICAgICAgICAweDAwODAKKyNkZWZpbmUgIFJMNUM0N1hfTUlTQ181Vl9ESVNBQkxFICAgICAgICAweDA0MDAKKyNkZWZpbmUgIFJMNUM0N1hfTUlTQ19MRURfUE9MICAgICAgICAgICAweDA4MDAKKworLyogMTYtYml0IEludGVyZmFjZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJMNUM0WFhfMTZCSVRfQ1RMICAgICAgICAgICAgICAgMHgwMDg0ICAvKiAxNiBiaXQgKi8KKyNkZWZpbmUgIFJMNUM0WFhfMTZDVExfSU9fVElNSU5HICAgICAgICAweDAxMDAKKyNkZWZpbmUgIFJMNUM0WFhfMTZDVExfTUVNX1RJTUlORyAgICAgICAweDAyMDAKKyNkZWZpbmUgIFJMNUM0NlhfMTZDVExfTEVWRUxfMSAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgIFJMNUM0NlhfMTZDVExfTEVWRUxfMiAgICAgICAgICAweDAwMjAKKworLyogMTYtYml0IElPIGFuZCBtZW1vcnkgdGltaW5nIHJlZ2lzdGVycyAqLworI2RlZmluZSBSTDVDNFhYXzE2QklUX0lPXzAgICAgICAgICAgICAgIDB4MDA4OCAgLyogMTYgYml0ICovCisjZGVmaW5lIFJMNUM0WFhfMTZCSVRfTUVNXzAgICAgICAgICAgICAgMHgwMDg4ICAvKiAxNiBiaXQgKi8KKyNkZWZpbmUgIFJMNUM0WFhfU0VUVVBfTUFTSyAgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgIFJMNUM0WFhfU0VUVVBfU0hJRlQgICAgICAgICAgICAwCisjZGVmaW5lICBSTDVDNFhYX0NNRF9NQVNLICAgICAgICAgICAgICAgMHgwMWYwCisjZGVmaW5lICBSTDVDNFhYX0NNRF9TSElGVCAgICAgICAgICAgICAgNAorI2RlZmluZSAgUkw1QzRYWF9IT0xEX01BU0sgICAgICAgICAgICAgIDB4MWMwMAorI2RlZmluZSAgUkw1QzRYWF9IT0xEX1NISUZUICAgICAgICAgICAgIDEwCisjZGVmaW5lICBSTDVDNFhYX01JU0NfQ09OVFJPTCAgICAgICAgICAgMHgyRiAvKiA4IGJpdCAqLworI2RlZmluZSAgUkw1QzRYWF9aVl9FTkFCTEUgICAgICAgICAgICAgIDB4MDgKKworI2VuZGlmIC8qIF9MSU5VWF9SSUNPSF9IICovCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gQmVnaW5uaW5nIGNpcnJ1cy5oIChDSVJSVVMgY2hpcHNldHMpCisKKyNpZm5kZWYgX0xJTlVYX0NJUlJVU19ICisjZGVmaW5lIF9MSU5VWF9DSVJSVVNfSAorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQ0lSUlVTCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0lSUlVTICAgICAgICAgICAgMHgxMDEzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNjcyOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU182NzI5ICAgICAgIDB4MTEwMAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzY4MzIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNjgzMiAgICAgICAweDExMTAKKyNlbmRpZgorCisjZGVmaW5lIFBENjdfTUlTQ19DVExfMSAgICAgICAgIDB4MTYgICAgLyogTWlzYyBjb250cm9sIDEgKi8KKyNkZWZpbmUgUEQ2N19GSUZPX0NUTCAgICAgICAgICAgMHgxNyAgICAvKiBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEQ2N19NSVNDX0NUTF8yICAgICAgICAgMHgxRSAgICAvKiBNaXNjIGNvbnRyb2wgMiAqLworI2RlZmluZSBQRDY3X0NISVBfSU5GTyAgICAgICAgICAweDFmICAgIC8qIENoaXAgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUEQ2N19BVEFfQ1RMICAgICAgICAgICAgMHgwMjYgICAvKiA2NzMwOiBBVEEgY29udHJvbCAqLworI2RlZmluZSBQRDY3X0VYVF9JTkRFWCAgICAgICAgICAweDJlICAgIC8qIEV4dGVuc2lvbiBpbmRleCAqLworI2RlZmluZSBQRDY3X0VYVF9EQVRBICAgICAgICAgICAweDJmICAgIC8qIEV4dGVuc2lvbiBkYXRhICovCisKKy8qIFBENjcyMiBleHRlbnNpb24gcmVnaXN0ZXJzIC0tIGluZGV4ZWQgaW4gUEQ2N19FWFRfSU5ERVggKi8KKyNkZWZpbmUgUEQ2N19EQVRBX01BU0swICAgICAgICAgMHgwMSAgICAvKiBEYXRhIG1hc2sgMCAqLworI2RlZmluZSBQRDY3X0RBVEFfTUFTSzEgICAgICAgICAweDAyICAgIC8qIERhdGEgbWFzayAxICovCisjZGVmaW5lIFBENjdfRE1BX0NUTCAgICAgICAgICAgIDB4MDMgICAgLyogRE1BIGNvbnRyb2wgKi8KKworLyogUEQ2NzMwIGV4dGVuc2lvbiByZWdpc3RlcnMgLS0gaW5kZXhlZCBpbiBQRDY3X0VYVF9JTkRFWCAqLworI2RlZmluZSBQRDY3X0VYVF9DVExfMSAgICAgICAgICAweDAzICAgIC8qIEV4dGVuc2lvbiBjb250cm9sIDEgKi8KKyNkZWZpbmUgUEQ2N19NRU1fUEFHRShuKSAgICAgICAgKChuKSs1KSAvKiBQQ0kgd2luZG93IGJpdHMgMzE6MjQgKi8KKyNkZWZpbmUgUEQ2N19FWFRFUk5fREFUQSAgICAgICAgMHgwYQorI2RlZmluZSBQRDY3X01JU0NfQ1RMXzMgICAgICAgICAweDI1CisjZGVmaW5lIFBENjdfU01CX1BXUl9DVEwgICAgICAgIDB4MjYKKworLyogSS9PIHdpbmRvdyBhZGRyZXNzIG9mZnNldCAqLworI2RlZmluZSBQRDY3X0lPX09GRih3KSAgICAgICAgICAoMHgzNisoKHcpPDwxKSkKKworLyogVGltaW5nIHJlZ2lzdGVyIHNldHMgKi8KKyNkZWZpbmUgUEQ2N19USU1FX1NFVFVQKG4pICAgICAgKDB4M2EgKyAzKihuKSkKKyNkZWZpbmUgUEQ2N19USU1FX0NNRChuKSAgICAgICAgKDB4M2IgKyAzKihuKSkKKyNkZWZpbmUgUEQ2N19USU1FX1JFQ09WKG4pICAgICAgKDB4M2MgKyAzKihuKSkKKworLyogRmxhZ3MgZm9yIFBENjdfTUlTQ19DVExfMSAqLworI2RlZmluZSBQRDY3X01DMV81Vl9ERVQgICAgICAgICAweDAxICAgIC8qIDV2IGRldGVjdCAqLworI2RlZmluZSBQRDY3X01DMV9NRURJQV9FTkEgICAgICAweDAxICAgIC8qIDY3MzA6IE11bHRpbWVkaWEgZW5hYmxlICovCisjZGVmaW5lIFBENjdfTUMxX1ZDQ18zViAgICAgICAgIDB4MDIgICAgLyogMy4zdiBWY2MgKi8KKyNkZWZpbmUgUEQ2N19NQzFfUFVMU0VfTUdNVCAgICAgMHgwNAorI2RlZmluZSBQRDY3X01DMV9QVUxTRV9JUlEgICAgICAweDA4CisjZGVmaW5lIFBENjdfTUMxX1NQS1JfRU5BICAgICAgIDB4MTAKKyNkZWZpbmUgUEQ2N19NQzFfSU5QQUNLX0VOQSAgICAgMHg4MAorCisvKiBGbGFncyBmb3IgUEQ2N19GSUZPX0NUTCAqLworI2RlZmluZSBQRDY3X0ZJRk9fRU1QVFkgICAgICAgICAweDgwCisKKy8qIEZsYWdzIGZvciBQRDY3X01JU0NfQ1RMXzIgKi8KKyNkZWZpbmUgUEQ2N19NQzJfRlJFUV9CWVBBU1MgICAgMHgwMQorI2RlZmluZSBQRDY3X01DMl9EWU5BTUlDX01PREUgICAweDAyCisjZGVmaW5lIFBENjdfTUMyX1NVU1BFTkQgICAgICAgIDB4MDQKKyNkZWZpbmUgUEQ2N19NQzJfNVZfQ09SRSAgICAgICAgMHgwOAorI2RlZmluZSBQRDY3X01DMl9MRURfRU5BICAgICAgICAweDEwICAgIC8qIElSUSAxMiBpcyBMRUQgZW5hYmxlICovCisjZGVmaW5lIFBENjdfTUMyX0ZBU1RfUENJICAgICAgIDB4MTAgICAgLyogNjcyOTogUENJIGJ1cyA+IDI1IE1IeiAqLworI2RlZmluZSBQRDY3X01DMl8zU1RBVEVfQklUNyAgICAweDIwICAgIC8qIEZsb3BweSBjaGFuZ2UgYml0ICovCisjZGVmaW5lIFBENjdfTUMyX0RNQV9NT0RFICAgICAgIDB4NDAKKyNkZWZpbmUgUEQ2N19NQzJfSVJRMTVfUkkgICAgICAgMHg4MCAgICAvKiBJUlEgMTUgaXMgcmluZyBlbmFibGUgKi8KKworLyogRmxhZ3MgZm9yIFBENjdfQ0hJUF9JTkZPICovCisjZGVmaW5lIFBENjdfSU5GT19TTE9UUyAgICAgICAgIDB4MjAgICAgLyogMCA9IDEgc2xvdCwgMSA9IDIgc2xvdHMgKi8KKyNkZWZpbmUgUEQ2N19JTkZPX0NISVBfSUQgICAgICAgMHhjMAorI2RlZmluZSBQRDY3X0lORk9fUkVWICAgICAgICAgICAweDFjCisKKy8qIEZpZWxkcyBpbiBQRDY3X1RJTUVfKiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEQ2N19USU1FX1NDQUxFICAgICAgICAgMHhjMAorI2RlZmluZSBQRDY3X1RJTUVfU0NBTEVfMSAgICAgICAweDAwCisjZGVmaW5lIFBENjdfVElNRV9TQ0FMRV8xNiAgICAgIDB4NDAKKyNkZWZpbmUgUEQ2N19USU1FX1NDQUxFXzI1NiAgICAgMHg4MAorI2RlZmluZSBQRDY3X1RJTUVfU0NBTEVfNDA5NiAgICAweGMwCisjZGVmaW5lIFBENjdfVElNRV9NVUxUICAgICAgICAgIDB4M2YKKworLyogRmllbGRzIGluIFBENjdfRE1BX0NUTCAqLworI2RlZmluZSBQRDY3X0RNQV9NT0RFICAgICAgICAgICAweGMwCisjZGVmaW5lIFBENjdfRE1BX09GRiAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUEQ2N19ETUFfRFJFUV9JTlBBQ0sgICAgMHg0MAorI2RlZmluZSBQRDY3X0RNQV9EUkVRX1dQICAgICAgICAweDgwCisjZGVmaW5lIFBENjdfRE1BX0RSRVFfQlZEMiAgICAgIDB4YzAKKyNkZWZpbmUgUEQ2N19ETUFfUFVMTFVQICAgICAgICAgMHgyMCAgICAvKiBEaXNhYmxlIHNvY2tldCBwdWxsdXBzPyAqLworCisvKiBGaWVsZHMgaW4gUEQ2N19FWFRfQ1RMXzEgKi8KKyNkZWZpbmUgUEQ2N19FQzFfVkNDX1BXUl9MT0NLICAgMHgwMQorI2RlZmluZSBQRDY3X0VDMV9BVVRPX1BXUl9DTEVBUiAweDAyCisjZGVmaW5lIFBENjdfRUMxX0xFRF9FTkEgICAgICAgIDB4MDQKKyNkZWZpbmUgUEQ2N19FQzFfSU5WX0NBUkRfSVJRICAgMHgwOAorI2RlZmluZSBQRDY3X0VDMV9JTlZfTUdNVF9JUlEgICAweDEwCisjZGVmaW5lIFBENjdfRUMxX1BVTExVUF9DVEwgICAgIDB4MjAKKworLyogRmllbGRzIGluIFBENjdfTUlTQ19DVExfMyAqLworI2RlZmluZSBQRDY3X01DM19JUlFfTUFTSyAgICAgICAweDAzCisjZGVmaW5lIFBENjdfTUMzX0lSUV9QQ1BDSSAgICAgIDB4MDAKKyNkZWZpbmUgUEQ2N19NQzNfSVJRX0VYVEVSTiAgICAgMHgwMQorI2RlZmluZSBQRDY3X01DM19JUlFfUENJV0FZICAgICAweDAyCisjZGVmaW5lIFBENjdfTUMzX0lSUV9QQ0kgICAgICAgIDB4MDMKKyNkZWZpbmUgUEQ2N19NQzNfUFdSX01BU0sgICAgICAgMHgwYworI2RlZmluZSBQRDY3X01DM19QV1JfU0VSSUFMICAgICAweDAwCisjZGVmaW5lIFBENjdfTUMzX1BXUl9USTIyMDIgICAgIDB4MDgKKyNkZWZpbmUgUEQ2N19NQzNfUFdSX1NNQiAgICAgICAgMHgwYworCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgQ2lycnVzIFBENjgzMiBQQ0ktdG8tQ2FyZEJ1cyBicmlkZ2UgKi8KKworLyogUEQ2ODMyIGV4dGVuc2lvbiByZWdpc3RlcnMgLS0gaW5kZXhlZCBpbiBQRDY3X0VYVF9JTkRFWCAqLworI2RlZmluZSBQRDY4X0VYVF9DVExfMiAgICAgICAgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgUEQ2OF9QQ0lfU1BBQ0UgICAgICAgICAgICAgICAgICAweDIyCisjZGVmaW5lIFBENjhfUENDQVJEX1NQQUNFICAgICAgICAgICAgICAgMHgyMworI2RlZmluZSBQRDY4X1dJTkRPV19UWVBFICAgICAgICAgICAgICAgIDB4MjQKKyNkZWZpbmUgUEQ2OF9FWFRfQ1NDICAgICAgICAgICAgICAgICAgICAweDJlCisjZGVmaW5lIFBENjhfTUlTQ19DVExfNCAgICAgICAgICAgICAgICAgMHgyZgorI2RlZmluZSBQRDY4X01JU0NfQ1RMXzUgICAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgUEQ2OF9NSVNDX0NUTF82ICAgICAgICAgICAgICAgICAweDMxCisKKy8qIEV4dHJhIGZsYWdzIGluIFBENjdfTUlTQ19DVExfMyAqLworI2RlZmluZSBQRDY4X01DM19IV19TVVNQICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUEQ2OF9NQzNfTU1fRVhQQU5EICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFBENjhfTUMzX01NX0FSTSAgICAgICAgICAgICAgICAgMHg4MAorCisvKiBCcmlkZ2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgUEQ2ODMyX0JDUl9NR01UX0lSUV9FTkEgICAgICAgIDB4MDgwMAorCisvKiBTb2NrZXQgTnVtYmVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFBENjgzMl9TT0NLRVRfTlVNQkVSICAgICAgICAgICAgMHgwMDRjICAvKiA4IGJpdCAqLworCisjZW5kaWYgLyogX0xJTlVYX0NJUlJVU19IICovCisKKworCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL2xpYmdlbi5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9saWJnZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTk0ODgxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9saWJnZW4uaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX0xJQkdFTl9ICisjZGVmaW5lIF9MSUJHRU5fSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK2V4dGVybiBjaGFyICogYmFzZW5hbWUgKCBjaGFyICpwYXRoICk7CitleHRlcm4gY2hhciAqIGRpcm5hbWUgKCBjaGFyICpwYXRoICk7CisKKyNlbmRpZiAvKiBfTElCR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvbGl0dGxlX2Jzd2FwLmggYi9ncHhlL3NyYy9pbmNsdWRlL2xpdHRsZV9ic3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZGM5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL2xpdHRsZV9ic3dhcC5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgRVRIRVJCT09UX0xJVFRMRV9CU1dBUF9ICisjZGVmaW5lIEVUSEVSQk9PVF9MSVRUTEVfQlNXQVBfSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNkZWZpbmUgbnRvaGwoeCkJX19ic3dhcF8zMih4KQorI2RlZmluZSBodG9ubCh4KSAJX19ic3dhcF8zMih4KQorI2RlZmluZSBudG9ocyh4KSAJX19ic3dhcF8xNih4KQorI2RlZmluZSBodG9ucyh4KSAJX19ic3dhcF8xNih4KQorI2RlZmluZSBjcHVfdG9fbGU2NCh4KQkoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMzIoeCkJKHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpCSh4KQorI2RlZmluZSBjcHVfdG9fYmU2NCh4KQlfX2Jzd2FwXzY0KHgpCisjZGVmaW5lIGNwdV90b19iZTMyKHgpCV9fYnN3YXBfMzIoeCkKKyNkZWZpbmUgY3B1X3RvX2JlMTYoeCkJX19ic3dhcF8xNih4KQorI2RlZmluZSBsZTY0X3RvX2NwdSh4KQkoeCkKKyNkZWZpbmUgbGUzMl90b19jcHUoeCkJKHgpCisjZGVmaW5lIGxlMTZfdG9fY3B1KHgpCSh4KQorI2RlZmluZSBiZTY0X3RvX2NwdSh4KQlfX2Jzd2FwXzY0KHgpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHgpCV9fYnN3YXBfMzIoeCkKKyNkZWZpbmUgYmUxNl90b19jcHUoeCkJX19ic3dhcF8xNih4KQorI2RlZmluZSBjcHVfdG9fbGU2NHMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNwdV90b19sZTMycyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY3B1X3RvX2xlMTZzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjcHVfdG9fYmU2NHMoeCkgX19ic3dhcF82NHMoeCkKKyNkZWZpbmUgY3B1X3RvX2JlMzJzKHgpIF9fYnN3YXBfMzJzKHgpCisjZGVmaW5lIGNwdV90b19iZTE2cyh4KSBfX2Jzd2FwXzE2cyh4KQorI2RlZmluZSBsZTY0X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGxlMzJfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbGUxNl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBiZTY0X3RvX2NwdXMoeCkgX19ic3dhcF82NHMoeCkKKyNkZWZpbmUgYmUzMl90b19jcHVzKHgpIF9fYnN3YXBfMzJzKHgpCisjZGVmaW5lIGJlMTZfdG9fY3B1cyh4KSBfX2Jzd2FwXzE2cyh4KQorCisjZW5kaWYgLyogRVRIRVJCT09UX0xJVFRMRV9CU1dBUF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL21paS5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9taWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjczNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9taWkuaApAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIGxpbnV4L21paS5oOiBkZWZpbml0aW9ucyBmb3IgTUlJLWNvbXBhdGlibGUgdHJhbnNjZWl2ZXJzCisgKiBPcmlnaW5hbGx5IGRyaXZlcnMvbmV0L3N1bmhtZS5oLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKgorICogQ29waWVkIEZvcm0gTGludXggMi40LjI1IGFuIHVubmVlZGVkIGl0ZW1zIHJlbW92ZWQgYnk6CisgKiBUaW1vdGh5IExlZ2dlICh0aW1sZWdnZSBhdCBldGhlcmJvb3QgZG90IG9yZykKKyAqCisgKiAwMy8yNi8yMDA0CisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKyNpZm5kZWYgX01JSV9IXworI2RlZmluZSBfTUlJX0hfCisKKy8qIEdlbmVyaWMgTUlJIHJlZ2lzdGVycy4gKi8KKworI2RlZmluZSBNSUlfQk1DUiAgICAgICAgICAgIDB4MDAJLyogQmFzaWMgbW9kZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CTVNSICAgICAgICAgICAgMHgwMQkvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3RlciAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDEgICAgICAgICAweDAyICAgICAgICAvKiBQSFlTIElEIDEgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDIgICAgICAgICAweDAzICAgICAgICAvKiBQSFlTIElEIDIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0FEVkVSVElTRSAgICAgICAweDA0CS8qIEFkdmVydGlzZW1lbnQgY29udHJvbCByZWcgICAqLworI2RlZmluZSBNSUlfTFBBICAgICAgICAgICAgIDB4MDUJLyogTGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnICAgICovCisjZGVmaW5lIE1JSV9FWFBBTlNJT04gICAgICAgMHgwNiAgICAgICAgLyogRXhwYW5zaW9uIHJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIE1JSV9DVFJMMTAwMCAgICAgICAgMHgwOSAgICAgICAgLyogMTAwMEJBU0UtVCBjb250cm9sICAgICAgICAgICovCisjZGVmaW5lIE1JSV9TVEFUMTAwMCAgICAgICAgMHgwYSAgICAgICAgLyogMTAwMEJBU0UtVCBzdGF0dXMgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9FU1RBVFVTICAgICAgICAgMHgwZiAgICAgICAgLyogRXh0ZW5kZWQgU3RhdHVzICovCisjZGVmaW5lIE1JSV9EQ09VTlRFUiAgICAgICAgMHgxMiAgICAgICAgLyogRGlzY29ubmVjdCBjb3VudGVyICAgICAgICAgICovCisjZGVmaW5lIE1JSV9GQ1NDT1VOVEVSICAgICAgMHgxMyAgICAgICAgLyogRmFsc2UgY2FycmllciBjb3VudGVyICAgICAgICovCisjZGVmaW5lIE1JSV9OV0FZVEVTVCAgICAgICAgMHgxNCAgICAgICAgLyogTi13YXkgYXV0by1uZWcgdGVzdCByZWcgICAgICovCisjZGVmaW5lIE1JSV9SRVJSQ09VTlRFUiAgICAgMHgxNSAgICAgICAgLyogUmVjZWl2ZSBlcnJvciBjb3VudGVyICAgICAgICovCisjZGVmaW5lIE1JSV9TUkVWSVNJT04gICAgICAgMHgxNiAgICAgICAgLyogU2lsaWNvbiByZXZpc2lvbiAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRVNWMSAgICAgICAgICAgMHgxNyAgICAgICAgLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9MQlJFUlJPUiAgICAgICAgMHgxOCAgICAgICAgLyogTHBiYWNrLCByeCwgYnlwYXNzIGVycm9yICAgICovCisjZGVmaW5lIE1JSV9QSFlBRERSICAgICAgICAgMHgxOSAgICAgICAgLyogUEhZIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRVNWMiAgICAgICAgICAgMHgxYSAgICAgICAgLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9UUElTVEFUVVMgICAgICAgMHgxYiAgICAgICAgLyogVFBJIHN0YXR1cyBmb3IgMTBtYnBzICAgICAgICovCisjZGVmaW5lIE1JSV9OQ09ORklHICAgICAgICAgMHgxYyAgICAgICAgLyogTmV0d29yayBpbnRlcmZhY2UgY29uZmlnICAgICovCisKKy8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQk1DUl9SRVNWICAgICAgICAgICAgICAgMHgwMDNmICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMDAgICAgICAgICAgMHgwMDQwICAvKiBNU0Igb2YgU3BlZWQgKDEwMDApICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9DVFNUICAgICAgICAgICAgICAgMHgwMDgwICAvKiBDb2xsaXNpb24gdGVzdCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9GVUxMRFBMWCAgICAgICAgICAgMHgwMTAwCS8qIEZ1bGwgZHVwbGV4ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0FOUkVTVEFSVCAgICAgICAgICAweDAyMDAJLyogQXV0byBuZWdvdGlhdGlvbiByZXN0YXJ0ICAgICovCisjZGVmaW5lIEJNQ1JfSVNPTEFURSAgICAgICAgICAgIDB4MDQwMCAgLyogRGlzY29ubmVjdCBEUDgzODQwIGZyb20gTUlJICovCisjZGVmaW5lIEJNQ1JfUERPV04gICAgICAgICAgICAgIDB4MDgwMCAgLyogUG93ZXJkb3duIHRoZSBEUDgzODQwICAgICAgICovCisjZGVmaW5lIEJNQ1JfQU5FTkFCTEUgICAgICAgICAgIDB4MTAwMAkvKiBFbmFibGUgYXV0byBuZWdvdGlhdGlvbiAgICAgKi8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMCAgICAgICAgICAgMHgyMDAwCS8qIFNlbGVjdCAxMDBNYnBzICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0xPT1BCQUNLICAgICAgICAgICAweDQwMDAgIC8qIFRYRCBsb29wYmFjayBiaXRzICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX1JFU0VUICAgICAgICAgICAgICAweDgwMDAJLyogUmVzZXQgdGhlIERQODM4NDAgICAgICAgICAgICovCisKKy8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCTVNSX0VSQ0FQICAgICAgICAgICAgICAweDAwMDEgIC8qIEV4dC1yZWcgY2FwYWJpbGl0eSAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0pDRCAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEphYmJlciBkZXRlY3RlZCAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0xTVEFUVVMgICAgICAgICAgICAweDAwMDQgIC8qIExpbmsgc3RhdHVzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0FORUdDQVBBQkxFICAgICAgICAweDAwMDggIC8qIEFibGUgdG8gZG8gYXV0by1uZWdvdGlhdGlvbiAqLworI2RlZmluZSBCTVNSX1JGQVVMVCAgICAgICAgICAgICAweDAwMTAgIC8qIFJlbW90ZSBmYXVsdCBkZXRlY3RlZCAgICAgICAqLworI2RlZmluZSBCTVNSX0FORUdDT01QTEVURSAgICAgICAweDAwMjAgIC8qIEF1dG8tbmVnb3RpYXRpb24gY29tcGxldGUgICAqLworI2RlZmluZSBCTVNSX1JFU1YgICAgICAgICAgICAgICAweDAwYzAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0VTVEFURU4gICAgICAgICAgICAweDAxMDAgIC8qIEV4dGVuZGVkIFN0YXR1cyBpbiBSMTUgKi8KKyNkZWZpbmUgQk1TUl8xMDBIQUxGMiAgICAgICAgICAgMHgwMjAwICAvKiBDYW4gZG8gMTAwQkFTRS1UMiBIRFggKi8KKyNkZWZpbmUgQk1TUl8xMDBGVUxMMiAgICAgICAgICAgMHgwNDAwICAvKiBDYW4gZG8gMTAwQkFTRS1UMiBGRFggKi8KKyNkZWZpbmUgQk1TUl8xMEhBTEYgICAgICAgICAgICAgMHgwODAwICAvKiBDYW4gZG8gMTBtYnBzLCBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgQk1TUl8xMEZVTEwgICAgICAgICAgICAgMHgxMDAwICAvKiBDYW4gZG8gMTBtYnBzLCBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgQk1TUl8xMDBIQUxGICAgICAgICAgICAgMHgyMDAwICAvKiBDYW4gZG8gMTAwbWJwcywgaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgQk1TUl8xMDBGVUxMICAgICAgICAgICAgMHg0MDAwICAvKiBDYW4gZG8gMTAwbWJwcywgZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQk1TUl8xMDBCQVNFNCAgICAgICAgICAgMHg4MDAwICAvKiBDYW4gZG8gMTAwbWJwcywgNGsgcGFja2V0cyAgKi8KKworLyogQWR2ZXJ0aXNlbWVudCBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBBRFZFUlRJU0VfU0xDVCAgICAgICAgICAweDAwMWYgIC8qIFNlbGVjdG9yIGJpdHMgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfQ1NNQSAgICAgICAgICAweDAwMDEgIC8qIE9ubHkgc2VsZWN0b3Igc3VwcG9ydGVkICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTBIQUxGICAgICAgICAweDAwMjAJLyogVHJ5IGZvciAxMG1icHMgaGFsZi1kdXBsZXggICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwWEZVTEwgICAgIDB4MDAyMCAgLyogVHJ5IGZvciAxMDAwQkFTRS1YIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIEFEVkVSVElTRV8xMEZVTEwgICAgICAgIDB4MDA0MAkvKiBUcnkgZm9yIDEwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBYSEFMRiAgICAgMHgwMDQwICAvKiBUcnkgZm9yIDEwMDBCQVNFLVggaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEhBTEYgICAgICAgMHgwMDgwCS8qIFRyeSBmb3IgMTAwbWJwcyBoYWxmLWR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwMFhQQVVTRSAgICAweDAwODAgIC8qIFRyeSBmb3IgMTAwMEJBU0UtWCBwYXVzZSAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwRlVMTCAgICAgICAweDAxMDAJLyogVHJ5IGZvciAxMDBtYnBzIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwWFBTRV9BU1lNIDB4MDEwMCAgLyogVHJ5IGZvciAxMDAwQkFTRS1YIGFzeW0gcGF1c2UgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEJBU0U0ICAgICAgMHgwMjAwICAvKiBUcnkgZm9yIDEwMG1icHMgNGsgcGFja2V0cyAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1BBVVNFX0NBUCAgICAgMHgwNDAwICAvKiBUcnkgZm9yIHBhdXNlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1BBVVNFX0FTWU0gICAgMHgwODAwICAvKiBUcnkgZm9yIGFzeW1ldHJpYyBwYXVzZSAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1JFU1YgICAgICAgICAgMHgxMDAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1JGQVVMVCAgICAgICAgMHgyMDAwICAvKiBTYXkgd2UgY2FuIGRldGVjdCBmYXVsdHMgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX0xQQUNLICAgICAgICAgMHg0MDAwICAvKiBBY2sgbGluayBwYXJ0bmVycyByZXNwb25zZSAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX05QQUdFICAgICAgICAgMHg4MDAwICAvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBBRFZFUlRJU0VfRlVMTCAoQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXAorCQkJQURWRVJUSVNFX0NTTUEpCisjZGVmaW5lIEFEVkVSVElTRV9BTEwgKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXAorICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwpCisKKy8qIExpbmsgcGFydG5lciBhYmlsaXR5IHJlZ2lzdGVyLiAqLworI2RlZmluZSBMUEFfU0xDVCAgICAgICAgICAgICAgICAweDAwMWYgIC8qIFNhbWUgYXMgYWR2ZXJ0aXNlIHNlbGVjdG9yICAqLworI2RlZmluZSBMUEFfMTBIQUxGICAgICAgICAgICAgICAweDAwMjAgIC8qIENhbiBkbyAxMG1icHMgaGFsZi1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTAwMFhGVUxMICAgICAgICAgICAweDAwMjAgIC8qIENhbiBkbyAxMDAwQkFTRS1YIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIExQQV8xMEZVTEwgICAgICAgICAgICAgIDB4MDA0MCAgLyogQ2FuIGRvIDEwbWJwcyBmdWxsLWR1cGxleCAgICovCisjZGVmaW5lIExQQV8xMDAwWEhBTEYgICAgICAgICAgIDB4MDA0MCAgLyogQ2FuIGRvIDEwMDBCQVNFLVggaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgTFBBXzEwMEhBTEYgICAgICAgICAgICAgMHgwMDgwICAvKiBDYW4gZG8gMTAwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMDBYUEFVU0UgICAgICAgICAgMHgwMDgwICAvKiBDYW4gZG8gMTAwMEJBU0UtWCBwYXVzZSAgICAgKi8KKyNkZWZpbmUgTFBBXzEwMEZVTEwgICAgICAgICAgICAgMHgwMTAwICAvKiBDYW4gZG8gMTAwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMDBYUEFVU0VfQVNZTSAgICAgMHgwMTAwICAvKiBDYW4gZG8gMTAwMEJBU0UtWCBwYXVzZSBhc3ltKi8KKyNkZWZpbmUgTFBBXzEwMEJBU0U0ICAgICAgICAgICAgMHgwMjAwICAvKiBDYW4gZG8gMTAwbWJwcyA0ayBwYWNrZXRzICAgKi8KKyNkZWZpbmUgTFBBX1BBVVNFX0NBUCAgICAgICAgICAgMHgwNDAwICAvKiBDYW4gcGF1c2UgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBBX1BBVVNFX0FTWU0gICAgICAgICAgMHgwODAwICAvKiBDYW4gcGF1c2UgYXN5bWV0cmljYWxseSAgICAgKi8KKyNkZWZpbmUgTFBBX1JFU1YgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBBX1JGQVVMVCAgICAgICAgICAgICAgMHgyMDAwICAvKiBMaW5rIHBhcnRuZXIgZmF1bHRlZCAgICAgICAgKi8KKyNkZWZpbmUgTFBBX0xQQUNLICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMaW5rIHBhcnRuZXIgYWNrZWQgdXMgICAgICAgKi8KKyNkZWZpbmUgTFBBX05QQUdFICAgICAgICAgICAgICAgMHg4MDAwICAvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMUEFfRFVQTEVYICAgICAgICAgICAgKExQQV8xMEZVTEwgfCBMUEFfMTAwRlVMTCkKKyNkZWZpbmUgTFBBXzEwMCAgICAgICAgICAgICAgICAgICAgICAgKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYgfCBMUEFfMTAwQkFTRTQpCisKKy8qIEV4cGFuc2lvbiByZWdpc3RlciBmb3IgYXV0by1uZWdvdGlhdGlvbi4gKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05XQVkgICAgICAgICAgMHgwMDAxICAvKiBDYW4gZG8gTi13YXkgYXV0by1uZWdvICAgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0xDV1AgICAgICAgICAgMHgwMDAyICAvKiBHb3QgbmV3IFJYIHBhZ2UgY29kZSB3b3JkICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0VOQUJMRU5QQUdFICAgMHgwMDA0ICAvKiBUaGlzIGVuYWJsZXMgbnBhZ2Ugd29yZHMgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05QQ0FQQUJMRSAgICAgMHgwMDA4ICAvKiBMaW5rIHBhcnRuZXIgc3VwcG9ydHMgbnBhZ2UgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX01GQVVMVFMgICAgICAgMHgwMDEwICAvKiBNdWx0aXBsZSBmYXVsdHMgZGV0ZWN0ZWQgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX1JFU1YgICAgICAgICAgMHhmZmUwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBFU1RBVFVTXzEwMDBfVEZVTEwgICAgICAweDIwMDAgIC8qIENhbiBkbyAxMDAwQlQgRnVsbCAqLworI2RlZmluZSBFU1RBVFVTXzEwMDBfVEhBTEYgICAgICAweDEwMDAgIC8qIENhbiBkbyAxMDAwQlQgSGFsZiAqLworCisvKiBOLXdheSB0ZXN0IHJlZ2lzdGVyLiAqLworI2RlZmluZSBOV0FZVEVTVF9SRVNWMSAgICAgICAgICAweDAwZmYgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOV0FZVEVTVF9MT09QQkFDSyAgICAgICAweDAxMDAgIC8qIEVuYWJsZSBsb29wYmFjayBmb3IgTi13YXkgICAqLworI2RlZmluZSBOV0FZVEVTVF9SRVNWMiAgICAgICAgICAweGZlMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworCisvKiAxMDAwQkFTRS1UIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBGVUxMICAgICAgMHgwMjAwICAvKiBBZHZlcnRpc2UgMTAwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwMEhBTEYgICAgICAweDAxMDAgIC8qIEFkdmVydGlzZSAxMDAwQkFTRS1UIGhhbGYgZHVwbGV4ICovCisKKy8qIDEwMDBCQVNFLVQgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIExQQV8xMDAwTE9DQUxSWE9LICAgICAgIDB4MjAwMCAgLyogTGluayBwYXJ0bmVyIGxvY2FsIHJlY2VpdmVyIHN0YXR1cyAqLworI2RlZmluZSBMUEFfMTAwMFJFTVJYT0sgICAgICAgICAweDEwMDAgIC8qIExpbmsgcGFydG5lciByZW1vdGUgcmVjZWl2ZXIgc3RhdHVzICovCisjZGVmaW5lIExQQV8xMDAwRlVMTCAgICAgICAgICAgIDB4MDgwMCAgLyogTGluayBwYXJ0bmVyIDEwMDBCQVNFLVQgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgTFBBXzEwMDBIQUxGICAgICAgICAgICAgMHgwNDAwICAvKiBMaW5rIHBhcnRuZXIgMTAwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworCisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKworc3RydWN0IG1paV9pZl9pbmZvIHsKKyAgICAgICAgaW50IHBoeV9pZDsKKyAgICAgICAgaW50IGFkdmVydGlzaW5nOworICAgICAgICBpbnQgcGh5X2lkX21hc2s7CisgICAgICAgIGludCByZWdfbnVtX21hc2s7CisKKyAgICAgICAgdW5zaWduZWQgaW50IGZ1bGxfZHVwbGV4IDogMTsgICAvKiBpcyBmdWxsIGR1cGxleD8gKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGZvcmNlX21lZGlhIDogMTsgICAvKiBpcyBhdXRvbmVnLiBkaXNhYmxlZD8gKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHN1cHBvcnRzX2dtaWkgOiAxOyAvKiBhcmUgR01JSSByZWdpc3RlcnMgc3VwcG9ydGVkPyAqLworCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgICAgIGludCAoKm1kaW9fcmVhZCkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CisgICAgICAgIHZvaWQgKCptZGlvX3dyaXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsKTsKK307CisKKworZXh0ZXJuIGludCBtaWlfbGlua19vayAoc3RydWN0IG1paV9pZl9pbmZvICptaWkpOworZXh0ZXJuIHZvaWQgbWlpX2NoZWNrX2xpbmsgKHN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbWlpX2NoZWNrX21lZGlhIChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBva190b19wcmludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbml0X21lZGlhKTsKKworCisvKioKKyAqIG1paV9ud2F5X3Jlc3VsdAorICogQG5lZ290aWF0ZWQ6IHZhbHVlIG9mIE1JSSBBTkFSIGFuZCdkIHdpdGggQU5MUEFSCisgKgorICogR2l2ZW4gYSBzZXQgb2YgTUlJIGFiaWxpdGllcywgY2hlY2sgZWFjaCBiaXQgYW5kIHJldHVybnMgdGhlCisgKiBjdXJyZW50bHkgc3VwcG9ydGVkIG1lZGlhLCBpbiB0aGUgcHJpb3JpdHkgb3JkZXIgZGVmaW5lZCBieQorICogSUVFRSA4MDIuM3UuICBXZSB1c2UgTFBBX3h4eCBjb25zdGFudHMgYnV0IG5vdGUgdGhpcyBpcyBub3QgdGhlCisgKiB2YWx1ZSBvZiBMUEEgc29sZWx5LCBhcyBkZXNjcmliZWQgYWJvdmUuCisgKgorICogVGhlIG9uZSBleGNlcHRpb24gdG8gSUVFRSA4MDIuM3UgaXMgdGhhdCAxMDBiYXNlVDQgaXMgcGxhY2VkCisgKiBiZXR3ZWVuIDEwMFQtZnVsbCBhbmQgMTAwVC1oYWxmLiAgSWYgeW91ciBwaHkgZG9lcyBub3Qgc3VwcG9ydAorICogMTAwVDQgdGhpcyBpcyBmaW5lLiAgSWYgeW91ciBwaHkgcGxhY2VzIDEwMFQ0IGVsc2V3aGVyZSBpbiB0aGUKKyAqIHByaW9yaXR5IG9yZGVyLCB5b3Ugd2lsbCBuZWVkIHRvIHJvbGwgeW91ciBvd24gZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1paV9ud2F5X3Jlc3VsdCAodW5zaWduZWQgaW50IG5lZ290aWF0ZWQpCit7CisgICAgICAgIHVuc2lnbmVkIGludCByZXQ7CisKKyAgICAgICAgaWYgKG5lZ290aWF0ZWQgJiBMUEFfMTAwRlVMTCkKKyAgICAgICAgICAgICAgICByZXQgPSBMUEFfMTAwRlVMTDsKKyAgICAgICAgZWxzZSBpZiAobmVnb3RpYXRlZCAmIExQQV8xMDBCQVNFNCkKKyAgICAgICAgICAgICAgICByZXQgPSBMUEFfMTAwQkFTRTQ7CisgICAgICAgIGVsc2UgaWYgKG5lZ290aWF0ZWQgJiBMUEFfMTAwSEFMRikKKyAgICAgICAgICAgICAgICByZXQgPSBMUEFfMTAwSEFMRjsKKyAgICAgICAgZWxzZSBpZiAobmVnb3RpYXRlZCAmIExQQV8xMEZVTEwpCisgICAgICAgICAgICAgICAgcmV0ID0gTFBBXzEwRlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IExQQV8xMEhBTEY7CisKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBtaWlfZHVwbGV4CisgKiBAZHVwbGV4X2xvY2s6IE5vbi16ZXJvIGlmIGR1cGxleCBpcyBsb2NrZWQgYXQgZnVsbAorICogQG5lZ290aWF0ZWQ6IHZhbHVlIG9mIE1JSSBBTkFSIGFuZCdkIHdpdGggQU5MUEFSCisgKgorICogQSBzbWFsbCBoZWxwZXIgZnVuY3Rpb24gZm9yIGEgY29tbW9uIGNhc2UuICBSZXR1cm5zIG9uZQorICogaWYgdGhlIG1lZGlhIGlzIG9wZXJhdGluZyBvciBsb2NrZWQgYXQgZnVsbCBkdXBsZXgsIGFuZAorICogcmV0dXJucyB6ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWlpX2R1cGxleCAodW5zaWduZWQgaW50IGR1cGxleF9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5lZ290aWF0ZWQpCit7CisgICAgICAgIGlmIChkdXBsZXhfbG9jaykKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKG1paV9ud2F5X3Jlc3VsdChuZWdvdGlhdGVkKSAmIExQQV9EVVBMRVgpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvbmljLmggYi9ncHhlL3NyYy9pbmNsdWRlL25pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MDg5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL25pYy5oCkBAIC0wLDAgKzEsMjczIEBACisgLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaWZuZGVmCU5JQ19ICisjZGVmaW5lIE5JQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9wY2kuaD4KKyNpbmNsdWRlIDxncHhlL2lzYXBucC5oPgorI2luY2x1ZGUgPGdweGUvaXNhLmg+CisjaW5jbHVkZSA8Z3B4ZS9laXNhLmg+CisjaW5jbHVkZSA8Z3B4ZS9tY2EuaD4KKyNpbmNsdWRlIDxncHhlL2lvLmg+CisKK3R5cGVkZWYgZW51bSB7CisJRElTQUJMRSA9IDAsCisJRU5BQkxFLAorCUZPUkNFCit9IGlycV9hY3Rpb25fdDsKKwordHlwZWRlZiBlbnVtIGR1cGxleCB7CisJSEFMRl9EVVBMRVggPSAxLAorCUZVTExfRFVQTEVYCit9IGR1cGxleF90OworCisvKgorICoJU3RydWN0dXJlIHJldHVybmVkIGZyb20gZXRoX3Byb2JlIGFuZCBwYXNzZWQgdG8gb3RoZXIgZHJpdmVyCisgKglmdW5jdGlvbnMuCisgKi8KK3N0cnVjdCBuaWMgeworCXN0cnVjdCBuaWNfb3BlcmF0aW9ucwkqbmljX29wOworCWludAkJCWZsYWdzOwkvKiBkcml2ZXIgc3BlY2lmaWMgZmxhZ3MgKi8KKwl1bnNpZ25lZCBjaGFyCQkqbm9kZV9hZGRyOworCXVuc2lnbmVkIGNoYXIJCSpwYWNrZXQ7CisJdW5zaWduZWQgaW50CQlwYWNrZXRsZW47CisJdW5zaWduZWQgaW50CQlpb2FkZHI7CisJdW5zaWduZWQgY2hhcgkJaXJxbm87CisJdW5zaWduZWQgaW50CQltYnBzOworCWR1cGxleF90CQlkdXBsZXg7CisJdm9pZAkJCSpwcml2X2RhdGE7CS8qIGRyaXZlciBwcml2YXRlIGRhdGEgKi8KK307CisKK3N0cnVjdCBuaWNfb3BlcmF0aW9ucyB7CisJaW50ICggKmNvbm5lY3QgKSAoIHN0cnVjdCBuaWMgKiApOworCWludCAoICpwb2xsICkgKCBzdHJ1Y3QgbmljICosIGludCByZXRyaWV2ZSApOworCXZvaWQgKCAqdHJhbnNtaXQgKSAoIHN0cnVjdCBuaWMgKiwgY29uc3QgY2hhciAqLAorCQkJICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqICk7CisJdm9pZCAoICppcnEgKSAoIHN0cnVjdCBuaWMgKiwgaXJxX2FjdGlvbl90ICk7Cit9OworCitleHRlcm4gc3RydWN0IG5pYyBuaWM7CisKK3N0YXRpYyBpbmxpbmUgaW50IGV0aF9wb2xsICggaW50IHJldHJpZXZlICkgeworCXJldHVybiBuaWMubmljX29wLT5wb2xsICggJm5pYywgcmV0cmlldmUgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0aF90cmFuc21pdCAoIGNvbnN0IGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCB0eXBlLAorCQkJCSAgdW5zaWduZWQgaW50IHNpemUsIGNvbnN0IHZvaWQgKnBhY2tldCApIHsKKwluaWMubmljX29wLT50cmFuc21pdCAoICZuaWMsIGRlc3QsIHR5cGUsIHNpemUsIHBhY2tldCApOworfQorCisvKgorICogRnVuY3Rpb24gcHJvdG90eXBlcworICoKKyAqLworZXh0ZXJuIGludCBkdW1teV9jb25uZWN0ICggc3RydWN0IG5pYyAqbmljICk7CitleHRlcm4gdm9pZCBkdW1teV9pcnEgKCBzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBpcnFfYWN0aW9uICk7CitleHRlcm4gaW50IGxlZ2FjeV9wcm9iZSAoIHZvaWQgKmh3ZGV2LAorCQkJICB2b2lkICggKiBzZXRfZHJ2ZGF0YSApICggdm9pZCAqaHdkZXYsIHZvaWQgKnByaXYgKSwKKwkJCSAgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBpbnQgKCAqIHByb2JlICkgKCBzdHJ1Y3QgbmljICpuaWMsIHZvaWQgKmh3ZGV2ICksCisJCQkgIHZvaWQgKCAqIGRpc2FibGUgKSAoIHN0cnVjdCBuaWMgKm5pYywgdm9pZCAqaHdkZXYgKSk7Cit2b2lkIGxlZ2FjeV9yZW1vdmUgKCB2b2lkICpod2RldiwKKwkJICAgICB2b2lkICogKCAqIGdldF9kcnZkYXRhICkgKCB2b2lkICpod2RldiApLAorCQkgICAgIHZvaWQgKCAqIGRpc2FibGUgKSAoIHN0cnVjdCBuaWMgKm5pYywgdm9pZCAqaHdkZXYgKSApOworCisjZGVmaW5lIFBDSV9EUklWRVIoX25hbWUsX2lkcyxfY2xhc3MpIAkJCQkJICBcCisJc3RhdGljIGlubGluZSBpbnQJCQkJCQkgIFwKKwlfbmFtZSAjIyBfcGNpX2xlZ2FjeV9wcm9iZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCQkgIFwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCApOwkgIFwKKwlzdGF0aWMgaW5saW5lIHZvaWQJCQkJCQkgIFwKKwlfbmFtZSAjIyBfcGNpX2xlZ2FjeV9yZW1vdmUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpICk7CQkgIFwKKwlzdHJ1Y3QgcGNpX2RyaXZlciBfbmFtZSBfX3BjaV9kcml2ZXIgPSB7CQkJICBcCisJCS5pZHMgPSBfaWRzLAkJCQkJCSAgXAorCQkuaWRfY291bnQgPSBzaXplb2YgKCBfaWRzICkgLyBzaXplb2YgKCBfaWRzWzBdICksCSAgXAorCQkucHJvYmUgPSBfbmFtZSAjIyBfcGNpX2xlZ2FjeV9wcm9iZSwJCQkgIFwKKwkJLnJlbW92ZSA9IF9uYW1lICMjIF9wY2lfbGVnYWN5X3JlbW92ZSwJCQkgIFwKKwl9OwkJCQkJCQkJICBcCisJUkVRVUlSRV9PQkpFQ1QgKCBwY2kgKTsKKworc3RhdGljIGlubGluZSB2b2lkIGxlZ2FjeV9wY2lfc2V0X2RydmRhdGEgKCB2b2lkICpod2Rldiwgdm9pZCAqcHJpdiApIHsKKwlwY2lfc2V0X2RydmRhdGEgKCBod2RldiwgcHJpdiApOworfQorc3RhdGljIGlubGluZSB2b2lkICogbGVnYWN5X3BjaV9nZXRfZHJ2ZGF0YSAoIHZvaWQgKmh3ZGV2ICkgeworCXJldHVybiBwY2lfZ2V0X2RydmRhdGEgKCBod2RldiApOworfQorCisjZGVmaW5lIElTQVBOUF9EUklWRVIoX25hbWUsX2lkcykJCQkJCSAgXAorCXN0YXRpYyBpbmxpbmUgaW50CQkJCQkJICBcCisJX25hbWUgIyMgX2lzYXBucF9sZWdhY3lfcHJvYmUgKCBzdHJ1Y3QgaXNhcG5wX2RldmljZSAqaXNhcG5wLAkgIFwKKwkJCQkJY29uc3Qgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgKmlkICk7IFwKKwlzdGF0aWMgaW5saW5lIHZvaWQJCQkJCQkgIFwKKwlfbmFtZSAjIyBfaXNhcG5wX2xlZ2FjeV9yZW1vdmUgKCBzdHJ1Y3QgaXNhcG5wX2RldmljZSAqaXNhcG5wICk7ICBcCisJc3RydWN0IGlzYXBucF9kcml2ZXIgX25hbWUgX19pc2FwbnBfZHJpdmVyID0gewkJCSAgXAorCQkuaWRzID0gX2lkcywJCQkJCQkgIFwKKwkJLmlkX2NvdW50ID0gc2l6ZW9mICggX2lkcyApIC8gc2l6ZW9mICggX2lkc1swXSApLAkgIFwKKwkJLnByb2JlID0gX25hbWUgIyMgX2lzYXBucF9sZWdhY3lfcHJvYmUsCQkJICBcCisJCS5yZW1vdmUgPSBfbmFtZSAjIyBfaXNhcG5wX2xlZ2FjeV9yZW1vdmUsCQkgIFwKKwl9OwkJCQkJCQkJICBcCisJUkVRVUlSRV9PQkpFQ1QgKCBpc2FwbnAgKTsKKworc3RhdGljIGlubGluZSB2b2lkIGxlZ2FjeV9pc2FwbnBfc2V0X2RydmRhdGEgKCB2b2lkICpod2Rldiwgdm9pZCAqcHJpdiApIHsKKwlpc2FwbnBfc2V0X2RydmRhdGEgKCBod2RldiwgcHJpdiApOworfQorc3RhdGljIGlubGluZSB2b2lkICogbGVnYWN5X2lzYXBucF9nZXRfZHJ2ZGF0YSAoIHZvaWQgKmh3ZGV2ICkgeworCXJldHVybiBpc2FwbnBfZ2V0X2RydmRhdGEgKCBod2RldiApOworfQorCisjZGVmaW5lIEVJU0FfRFJJVkVSKF9uYW1lLF9pZHMpCQkJCQkJICBcCisJc3RhdGljIGlubGluZSBpbnQJCQkJCQkgIFwKKwlfbmFtZSAjIyBfZWlzYV9sZWdhY3lfcHJvYmUgKCBzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVpc2EsCQkgIFwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgKmlkICk7ICBcCisJc3RhdGljIGlubGluZSB2b2lkCQkJCQkJICBcCisJX25hbWUgIyMgX2Vpc2FfbGVnYWN5X3JlbW92ZSAoIHN0cnVjdCBlaXNhX2RldmljZSAqZWlzYSApOwkgIFwKKwlzdHJ1Y3QgZWlzYV9kcml2ZXIgX25hbWUgX19laXNhX2RyaXZlciA9IHsJCQkgIFwKKwkJLmlkcyA9IF9pZHMsCQkJCQkJICBcCisJCS5pZF9jb3VudCA9IHNpemVvZiAoIF9pZHMgKSAvIHNpemVvZiAoIF9pZHNbMF0gKSwJICBcCisJCS5wcm9iZSA9IF9uYW1lICMjIF9laXNhX2xlZ2FjeV9wcm9iZSwJCQkgIFwKKwkJLnJlbW92ZSA9IF9uYW1lICMjIF9laXNhX2xlZ2FjeV9yZW1vdmUsCQkJICBcCisJfTsJCQkJCQkJCSAgXAorCVJFUVVJUkVfT0JKRUNUICggZWlzYSApOworCitzdGF0aWMgaW5saW5lIHZvaWQgbGVnYWN5X2Vpc2Ffc2V0X2RydmRhdGEgKCB2b2lkICpod2Rldiwgdm9pZCAqcHJpdiApIHsKKwllaXNhX3NldF9kcnZkYXRhICggaHdkZXYsIHByaXYgKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGxlZ2FjeV9laXNhX2dldF9kcnZkYXRhICggdm9pZCAqaHdkZXYgKSB7CisJcmV0dXJuIGVpc2FfZ2V0X2RydmRhdGEgKCBod2RldiApOworfQorCisjZGVmaW5lIE1DQV9EUklWRVIoX25hbWUsX2lkcykJCQkJCQkgIFwKKwlzdGF0aWMgaW5saW5lIGludAkJCQkJCSAgXAorCV9uYW1lICMjIF9tY2FfbGVnYWN5X3Byb2JlICggc3RydWN0IG1jYV9kZXZpY2UgKm1jYSwJCSAgXAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG1jYV9kZXZpY2VfaWQgKmlkICk7CSAgXAorCXN0YXRpYyBpbmxpbmUgdm9pZAkJCQkJCSAgXAorCV9uYW1lICMjIF9tY2FfbGVnYWN5X3JlbW92ZSAoIHN0cnVjdCBtY2FfZGV2aWNlICptY2EgKTsJCSAgXAorCXN0cnVjdCBtY2FfZHJpdmVyIF9uYW1lIF9fbWNhX2RyaXZlciA9IHsJCQkgIFwKKwkJLmlkcyA9IF9pZHMsCQkJCQkJICBcCisJCS5pZF9jb3VudCA9IHNpemVvZiAoIF9pZHMgKSAvIHNpemVvZiAoIF9pZHNbMF0gKSwJICBcCisJCS5wcm9iZSA9IF9uYW1lICMjIF9tY2FfbGVnYWN5X3Byb2JlLAkJCSAgXAorCQkucmVtb3ZlID0gX25hbWUgIyMgX21jYV9sZWdhY3lfcmVtb3ZlLAkJCSAgXAorCX07CQkJCQkJCQkgIFwKKwlSRVFVSVJFX09CSkVDVCAoIG1jYSApOworCitzdGF0aWMgaW5saW5lIHZvaWQgbGVnYWN5X21jYV9zZXRfZHJ2ZGF0YSAoIHZvaWQgKmh3ZGV2LCB2b2lkICpwcml2ICkgeworCW1jYV9zZXRfZHJ2ZGF0YSAoIGh3ZGV2LCBwcml2ICk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgKiBsZWdhY3lfbWNhX2dldF9kcnZkYXRhICggdm9pZCAqaHdkZXYgKSB7CisJcmV0dXJuIG1jYV9nZXRfZHJ2ZGF0YSAoIGh3ZGV2ICk7Cit9CisKKyNkZWZpbmUgSVNBX0RSSVZFUihfbmFtZSxfcHJvYmVfYWRkcnMsX3Byb2JlX2FkZHIsX3ZlbmRvcl9pZCxfcHJvZF9pZCkJICBcCisJc3RhdGljIGlubGluZSBpbnQJCQkJCQkgIFwKKwlfbmFtZSAjIyBfaXNhX2xlZ2FjeV9wcm9iZSAoIHN0cnVjdCBpc2FfZGV2aWNlICppc2EgKTsJCSAgXAorCXN0YXRpYyBpbmxpbmUgaW50CQkJCQkJICBcCisJX25hbWUgIyMgX2lzYV9sZWdhY3lfcHJvYmVfYXRfYWRkciAoIHN0cnVjdCBpc2FfZGV2aWNlICppc2EgKSB7CSAgXAorCQlpZiAoICEgX3Byb2JlX2FkZHIgKCBpc2EtPmlvYWRkciApICkJCQkgIFwKKwkJCXJldHVybiAtRU5PREVWOyAJCQkJICBcCisJCXJldHVybiBfbmFtZSAjIyBfaXNhX2xlZ2FjeV9wcm9iZSAoIGlzYSApOwkJICBcCisJfQkJCQkJCQkJICBcCisJc3RhdGljIGlubGluZSB2b2lkCQkJCQkJICBcCisJX25hbWUgIyMgX2lzYV9sZWdhY3lfcmVtb3ZlICggc3RydWN0IGlzYV9kZXZpY2UgKmlzYSApOwkJICBcCisJc3RhdGljIGNvbnN0IGNoYXIgX25hbWUgIyMgX3RleHRbXTsJCQkJICBcCisJc3RydWN0IGlzYV9kcml2ZXIgX25hbWUgX19pc2FfZHJpdmVyID0gewkJCSAgXAorCQkubmFtZSA9IF9uYW1lICMjIF90ZXh0LAkJCQkJICBcCisJCS5wcm9iZV9hZGRycyA9IF9wcm9iZV9hZGRycywJCQkJICBcCisJCS5hZGRyX2NvdW50ID0gKCBzaXplb2YgKCBfcHJvYmVfYWRkcnMgKSAvCQkgIFwKKwkJCQlzaXplb2YgKCBfcHJvYmVfYWRkcnNbMF0gKSApLAkJICBcCisJCS52ZW5kb3JfaWQgPSBfdmVuZG9yX2lkLAkJCQkgIFwKKwkJLnByb2RfaWQgPSBfcHJvZF9pZCwJCQkJCSAgXAorCQkucHJvYmUgPSBfbmFtZSAjIyBfaXNhX2xlZ2FjeV9wcm9iZV9hdF9hZGRyLAkJICBcCisJCS5yZW1vdmUgPSBfbmFtZSAjIyBfaXNhX2xlZ2FjeV9yZW1vdmUsCQkJICBcCisJfTsJCQkJCQkJCSAgXAorCVJFUVVJUkVfT0JKRUNUICggaXNhICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZWdhY3lfaXNhX3NldF9kcnZkYXRhICggdm9pZCAqaHdkZXYsIHZvaWQgKnByaXYgKSB7CisJaXNhX3NldF9kcnZkYXRhICggaHdkZXYsIHByaXYgKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGxlZ2FjeV9pc2FfZ2V0X2RydmRhdGEgKCB2b2lkICpod2RldiApIHsKKwlyZXR1cm4gaXNhX2dldF9kcnZkYXRhICggaHdkZXYgKTsKK30KKworI3VuZGVmIERSSVZFUgorI2RlZmluZSBEUklWRVIoX25hbWVfdGV4dCxfdW51c2VkMixfdW51c2VkMyxfbmFtZSxfcHJvYmUsX2Rpc2FibGUpCSAgXAorCXN0YXRpYyBjb25zdCBjaGFyIF9uYW1lICMjIF90ZXh0W10gPSBfbmFtZV90ZXh0OwkJICBcCisJc3RhdGljIGlubGluZSBpbnQJCQkJCQkgIFwKKwlfbmFtZSAjIyBfcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHZvaWQgKmh3ZGV2ICkgewkJICBcCisJCXJldHVybiBfcHJvYmUgKCBuaWMsIGh3ZGV2ICk7CQkJCSAgXAorCX0JCQkJCQkJCSAgXAorCXN0YXRpYyBpbmxpbmUgdm9pZAkJCQkJCSAgXAorCV9uYW1lICMjIF9kaXNhYmxlICggc3RydWN0IG5pYyAqbmljLCB2b2lkICpod2RldiApIHsJCSAgXAorCQl2b2lkICggKiBfdW5zYWZlX2Rpc2FibGUgKSAoKSA9IF9kaXNhYmxlOwkJICBcCisJCV91bnNhZmVfZGlzYWJsZSAoIG5pYywgaHdkZXYgKTsJCQkJICBcCisJfQkJCQkJCQkJICBcCisJc3RhdGljIGlubGluZSBpbnQJCQkJCQkgIFwKKwlfbmFtZSAjIyBfcGNpX2xlZ2FjeV9wcm9iZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCQkgIFwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQgX191bnVzZWQgKSB7CSAgXAorCQlyZXR1cm4gbGVnYWN5X3Byb2JlICggcGNpLCBsZWdhY3lfcGNpX3NldF9kcnZkYXRhLAkgIFwKKwkJCQkgICAgICAmcGNpLT5kZXYsIF9uYW1lICMjIF9wcm9iZSwJICBcCisJCQkJICAgICAgX25hbWUgIyMgX2Rpc2FibGUgKTsJCSAgXAorCX0JCQkJCQkJCSAgXAorCXN0YXRpYyBpbmxpbmUgdm9pZAkJCQkJCSAgXAorCV9uYW1lICMjIF9wY2lfbGVnYWN5X3JlbW92ZSAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kgKSB7CSAgXAorCQlyZXR1cm4gbGVnYWN5X3JlbW92ZSAoIHBjaSwgbGVnYWN5X3BjaV9nZXRfZHJ2ZGF0YSwJICBcCisJCQkJICAgICAgIF9uYW1lICMjIF9kaXNhYmxlICk7CQkgIFwKKwl9CQkJCQkJCQkgIFwKKwlzdGF0aWMgaW5saW5lIGludAkJCQkJCSAgXAorCV9uYW1lICMjIF9pc2FwbnBfbGVnYWN5X3Byb2JlICggc3RydWN0IGlzYXBucF9kZXZpY2UgKmlzYXBucCwJICBcCisJCQkgY29uc3Qgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgKmlkIF9fdW51c2VkICkgewkgIFwKKwkJcmV0dXJuIGxlZ2FjeV9wcm9iZSAoIGlzYXBucCwgbGVnYWN5X2lzYXBucF9zZXRfZHJ2ZGF0YSwgIFwKKwkJCQkgICAgICAmaXNhcG5wLT5kZXYsIF9uYW1lICMjIF9wcm9iZSwJICBcCisJCQkJICAgICAgX25hbWUgIyMgX2Rpc2FibGUgKTsJCSAgXAorCX0JCQkJCQkJCSAgXAorCXN0YXRpYyBpbmxpbmUgdm9pZAkJCQkJCSAgXAorCV9uYW1lICMjIF9pc2FwbnBfbGVnYWN5X3JlbW92ZSAoIHN0cnVjdCBpc2FwbnBfZGV2aWNlICppc2FwbnAgKSB7IFwKKwkJcmV0dXJuIGxlZ2FjeV9yZW1vdmUgKCBpc2FwbnAsIGxlZ2FjeV9pc2FwbnBfZ2V0X2RydmRhdGEsIFwKKwkJCQkgICAgICAgX25hbWUgIyMgX2Rpc2FibGUgKTsJCSAgXAorCX0JCQkJCQkJCSAgXAorCXN0YXRpYyBpbmxpbmUgaW50CQkJCQkJICBcCisJX25hbWUgIyMgX2Vpc2FfbGVnYWN5X3Byb2JlICggc3RydWN0IGVpc2FfZGV2aWNlICplaXNhLAkJICBcCisJCQkgICAgIGNvbnN0IHN0cnVjdCBlaXNhX2RldmljZV9pZCAqaWQgX191bnVzZWQgKSB7IFwKKwkJcmV0dXJuIGxlZ2FjeV9wcm9iZSAoIGVpc2EsIGxlZ2FjeV9laXNhX3NldF9kcnZkYXRhLAkgIFwKKwkJCQkgICAgICAmZWlzYS0+ZGV2LCBfbmFtZSAjIyBfcHJvYmUsCSAgXAorCQkJCSAgICAgIF9uYW1lICMjIF9kaXNhYmxlICk7CQkgIFwKKwl9CQkJCQkJCQkgIFwKKwlzdGF0aWMgaW5saW5lIHZvaWQJCQkJCQkgIFwKKwlfbmFtZSAjIyBfZWlzYV9sZWdhY3lfcmVtb3ZlICggc3RydWN0IGVpc2FfZGV2aWNlICplaXNhICkgewkgIFwKKwkJcmV0dXJuIGxlZ2FjeV9yZW1vdmUgKCBlaXNhLCBsZWdhY3lfZWlzYV9nZXRfZHJ2ZGF0YSwJICBcCisJCQkJICAgICAgIF9uYW1lICMjIF9kaXNhYmxlICk7CQkgIFwKKwl9CQkJCQkJCQkgIFwKKwlzdGF0aWMgaW5saW5lIGludAkJCQkJCSAgXAorCV9uYW1lICMjIF9tY2FfbGVnYWN5X3Byb2JlICggc3RydWN0IG1jYV9kZXZpY2UgKm1jYSwJCSAgXAorCQkJICAgICAgY29uc3Qgc3RydWN0IG1jYV9kZXZpY2VfaWQgKmlkIF9fdW51c2VkICkgeyBcCisJCXJldHVybiBsZWdhY3lfcHJvYmUgKCBtY2EsIGxlZ2FjeV9tY2Ffc2V0X2RydmRhdGEsCSAgXAorCQkJCSAgICAgICZtY2EtPmRldiwgX25hbWUgIyMgX3Byb2JlLAkgIFwKKwkJCQkgICAgICBfbmFtZSAjIyBfZGlzYWJsZSApOwkJICBcCisJfQkJCQkJCQkJICBcCisJc3RhdGljIGlubGluZSB2b2lkCQkJCQkJICBcCisJX25hbWUgIyMgX21jYV9sZWdhY3lfcmVtb3ZlICggc3RydWN0IG1jYV9kZXZpY2UgKm1jYSApIHsJICBcCisJCXJldHVybiBsZWdhY3lfcmVtb3ZlICggbWNhLCBsZWdhY3lfbWNhX2dldF9kcnZkYXRhLAkgIFwKKwkJCQkgICAgICAgX25hbWUgIyMgX2Rpc2FibGUgKTsJCSAgXAorCX0JCQkJCQkJCSAgXAorCXN0YXRpYyBpbmxpbmUgaW50CQkJCQkJICBcCisJX25hbWUgIyMgX2lzYV9sZWdhY3lfcHJvYmUgKCBzdHJ1Y3QgaXNhX2RldmljZSAqaXNhICkgewkJICBcCisJCXJldHVybiBsZWdhY3lfcHJvYmUgKCBpc2EsIGxlZ2FjeV9pc2Ffc2V0X2RydmRhdGEsCSAgXAorCQkJCSAgICAgICZpc2EtPmRldiwgX25hbWUgIyMgX3Byb2JlLAkgIFwKKwkJCQkgICAgICBfbmFtZSAjIyBfZGlzYWJsZSApOwkJICBcCisJfQkJCQkJCQkJICBcCisJc3RhdGljIGlubGluZSB2b2lkCQkJCQkJICBcCisJX25hbWUgIyMgX2lzYV9sZWdhY3lfcmVtb3ZlICggc3RydWN0IGlzYV9kZXZpY2UgKmlzYSApIHsJICBcCisJCXJldHVybiBsZWdhY3lfcmVtb3ZlICggaXNhLCBsZWdhY3lfaXNhX2dldF9kcnZkYXRhLAkgIFwKKwkJCQkgICAgICAgX25hbWUgIyMgX2Rpc2FibGUgKTsJCSAgXAorCX0KKworI2VuZGlmCS8qIE5JQ19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL29sZF90Y3AuaCBiL2dweGUvc3JjL2luY2x1ZGUvb2xkX3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTE0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL29sZF90Y3AuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmCV9UQ1BfSAorI2RlZmluZQlfVENQX0gKKworI2RlZmluZSBUQ1BfSU5JVElBTF9USU1FT1VUICAgICAoMypUSUNLU19QRVJfU0VDKQorI2RlZmluZSBUQ1BfTUFYX1RJTUVPVVQgICAgICAgICAoNjAqVElDS1NfUEVSX1NFQykKKyNkZWZpbmUgVENQX01JTl9USU1FT1VUICAgICAgICAgKFRJQ0tTX1BFUl9TRUMpCisjZGVmaW5lIFRDUF9NQVhfUkVUUlkgICAgICAgICAgIDEwCisjZGVmaW5lIFRDUF9NQVhfSEVBREVSICAgICAgICAgICgoaW50KXNpemVvZihzdHJ1Y3QgaXBoZHIpKzY0KQorI2RlZmluZSBUQ1BfTUlOX1dJTkRPVyAgICAgICAgICAoMTUwMC1UQ1BfTUFYX0hFQURFUikKKyNkZWZpbmUgVENQX01BWF9XSU5ET1cgICAgICAgICAgKDY1NTM1LVRDUF9NQVhfSEVBREVSKQorCisjZGVmaW5lIEZJTiAgICAgICAgICAgICAxCisjZGVmaW5lIFNZTiAgICAgICAgICAgICAyCisjZGVmaW5lIFJTVCAgICAgICAgICAgICA0CisjZGVmaW5lIFBTSCAgICAgICAgICAgICA4CisjZGVmaW5lIEFDSyAgICAgICAgICAgICAxNgorI2RlZmluZSBVUkcgICAgICAgICAgICAgMzIKKworCitzdHJ1Y3QgdGNwaGRyIHsKKyAgICAgICB1aW50MTZfdCBzcmM7CisgICAgICAgdWludDE2X3QgZHN0OworICAgICAgIGludDMyX3QgIHNlcTsKKyAgICAgICBpbnQzMl90ICBhY2s7CisgICAgICAgdWludDE2X3QgY3RybDsKKyAgICAgICB1aW50MTZfdCB3aW5kb3c7CisgICAgICAgdWludDE2X3QgY2hrc3VtOworICAgICAgIHVpbnQxNl90IHVyZ2VudDsKK307CisKK2V4dGVybiBpbnQgdGNwX3RyYW5zYWN0aW9uICggdW5zaWduZWQgbG9uZyBkZXN0aXAsIHVuc2lnbmVkIGludCBkZXN0c29jaywKKwkJCSAgICAgdm9pZCAqcHRyLAorCQkJICAgICBpbnQgKCpzZW5kKShpbnQgbGVuLCB2b2lkICpidWYsIHZvaWQgKnB0ciksCisJCQkgICAgIGludCAoKnJlY3YpKGludCBsZW4sIGNvbnN0IHZvaWQgKmJ1Ziwgdm9pZCAqcHRyKSk7CisKKworI2VuZGlmCS8qIF9UQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9wY19rYmQuaCBiL2dweGUvc3JjL2luY2x1ZGUvcGNfa2JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyNWVmYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvcGNfa2JkLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9QQ19LQkRfSAorI2RlZmluZSBfUENfS0JEX0gKKworaW50IGtiZF9pc2NoYXIodm9pZCk7CisKK2ludCBrYmRfZ2V0Yyh2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9wY21jaWEtb3B0cy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9wY21jaWEtb3B0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZGMwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL3BjbWNpYS1vcHRzLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gcGNtY2lhLW9wdHMuaAorLy8gc3BlY2lhbCBvcHRpb25zIGZpbGUgZm9yIGRldmVsb3BtZW50IHRpbWUuIExhdGVyIHRoaXMgY291bGQgZW5kIGluIENvbmZpZyg/KQorI2lmbmRlZiBfX3BjbWNpYW9wdHMKKyNkZWZpbmUgX19wY21jaWFvcHRzCisKKwkjZGVmaW5lCV95ZXNfIDEKKwkjZGVmaW5lCV9ub18gIDAKKworCSNkZWZpbmUJU1VQUE9SVF9JODIzNjUJCShfeWVzXykKKy8vCSNkZWZpbmUJU1VQUE9SVF9ZRU5UQQkJKF9ub18pCisvLwkjZGVmaW5lCVNVUFBPUlRfU09NRV9EUklWRVIJKF9ub18pCisKKwkjZGVmaW5lIFBDTUNJQV9TSFVURE9XTgkJKF95ZXNfKQorCSNkZWZpbmUJTUFQX0FUVFJNRU1fVE8JCTB4ZDAwMDAKKwkjZGVmaW5lCU1BUF9BVFRSTUVNX0xFTgkJMHgwMjAwMAorCisJI2RlZmluZQlQREVCVUcJCQkzCisJLy8gVGhlIGhpZ2hlciB0aGUgbW9yZSBvdXRwdXQgeW91IGdldCwgMC4uMworCS8vIE5vdCBmdWxseSBpbXBsZW1lbnRlZCB0aG91Z2gsIGJ1dCBmb3IgdGhlIGZ1dHVyZS4uLgorCisJI3VuZGVmIF95ZXNfCisJI3VuZGVmIF9ub18KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9wY21jaWEuaCBiL2dweGUvc3JjL2luY2x1ZGUvcGNtY2lhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyOGJlYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvcGNtY2lhLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8vCXBjbWNpYS5oIC0gSGVhZGVyIGZpbGUgZm9yIFBDTUNJQSBzdXBwb3J0CisKKyNpZm5kZWYgUENNQ0lBX0gKKyNkZWZpbmUJUENNQ0lBX0gKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCXVfY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJdV9zaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CXVfaW50OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCXVfbG9uZzsKKwordHlwZWRlZiB1X3Nob3J0CQlpb2FkZHJfdDsKK2V4dGVybiBpbnQgc29ja2V0czsKKworI2RlZmluZQlNQVhQQ0NTT0NLUwk4CisjZGVmaW5lCU1BWFBDQ0NPTkZJR1MJOAorCit0eXBlZGVmCWVudW0gZWJwZHJpdmVyX3QJeyBJODIzNjUsIFNPTUVEUklWRVIJCQkJCQl9IGVicGRyaXZlcl90OwordHlwZWRlZiBlbnVtIGludGVyZmFjZV9mdW5jX3QJeyBJTklULCBTSFVURE9XTiwgTUFQQVRUUk1FTSwgVU5NQVBBVFRSTUVNLCBTRUxFQ1RDT05GSUcJfSBpbnRlcmZhY2VfZnVuY190OwordHlwZWRlZiBlbnVtIGVicHN0YXR1c190CXsgRU1QVFksIEhBU0NBUkQsIElOSVRJQUxJWkVELCBTVVNQRU5ERUQsIE9USEVSREVWSUNFLCBVTktOT1dOCX0gZWJwc3RhdHVzX3Q7CisKK3N0cnVjdAlkcml2ZXJfaW50ZXJhY3RfdCB7CisJZWJwZHJpdmVyX3QJaWQ7CisJaW50CQkoKmYpKGludGVyZmFjZV9mdW5jX3QsaW50LGludCxpbnQsaW50KTsKKwljaGFyCQkqbmFtZTsKK307CitzdHJ1Y3QJcGNjc29ja190IHsKKwllYnBkcml2ZXJfdAlkZXZpY2U7CisJaW50CQlkcml2ZXJudW07CisJZWJwc3RhdHVzX3QJc3RhdHVzOworCQkvLyBJbnRlcm5hbCB1c2FnZSBvZiB0aGUgZHJpdmVyczoKKwlpbnQJCWludGVybmFsaWQ7CisJaW50CQlmbGFnczsKKwlpbnQJCWlvYWRkcjsKKwlpbnQJCXR5cGU7CisJaW50CQljb25maWdvZmZzZXQ7CisJaW50CQlwb3NzaWJsZWNvbmZpZ251bTsKKwlpbnQJCXN0cmluZ29mZnNldDsKKwl1X2ludAkJc3RyaW5nbGVuZ3RoOworCWludAkJcm1hc2swOworfTsKKworZXh0ZXJuIHN0cnVjdAlwY2Nzb2NrX3QJcGNjc29ja1tNQVhQQ0NTT0NLU107CitleHRlcm4gdV9pbnQJcGNjc29ja3M7CisKK3N0cnVjdAlwY2NfY29uZmlnX3QgeworCXVfY2hhcglpbmRleDsKKwl1X2NoYXIJaXJxOworCWludAlpb3dpbjsKKwlpbnQJaW9sZW47Cit9OworCisKK2ludAlpODIzNjVfaW50ZXJmYWNlcihpbnRlcmZhY2VfZnVuY190LGludCxpbnQsaW50LHZvaWQgKik7Cit2b2lkCXNsZWVwdGlja3MoaW50KTsKKworI2RlZmluZQlFSU5WQUwJMjIKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNjLmg6CisvKiBEZWZpbml0aW9ucyBmb3IgY2FyZCBzdGF0dXMgZmxhZ3MgZm9yIEdldFN0YXR1cyAqLworI2RlZmluZSBTU19XUlBST1QgICAgICAgMHgwMDAxCisjZGVmaW5lIFNTX0NBUkRMT0NLICAgICAweDAwMDIKKyNkZWZpbmUgU1NfRUpFQ1RJT04gICAgIDB4MDAwNAorI2RlZmluZSBTU19JTlNFUlRJT04gICAgMHgwMDA4CisjZGVmaW5lIFNTX0JBVERFQUQgICAgICAweDAwMTAKKyNkZWZpbmUgU1NfQkFUV0FSTiAgICAgIDB4MDAyMAorI2RlZmluZSBTU19SRUFEWSAgICAgICAgMHgwMDQwCisjZGVmaW5lIFNTX0RFVEVDVCAgICAgICAweDAwODAKKyNkZWZpbmUgU1NfUE9XRVJPTiAgICAgIDB4MDEwMAorI2RlZmluZSBTU19HUEkgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFNTX1NUU0NIRyAgICAgICAweDA0MDAKKyNkZWZpbmUgU1NfQ0FSREJVUyAgICAgIDB4MDgwMAorI2RlZmluZSBTU18zVkNBUkQgICAgICAgMHgxMDAwCisjZGVmaW5lIFNTX1hWQ0FSRCAgICAgICAweDIwMDAKKyNkZWZpbmUgU1NfUEVORElORyAgICAgIDB4NDAwMAorCisvKiBjYy5oOiBmb3IgSW5xdWlyZVNvY2tldCAqLwordHlwZWRlZiBzdHJ1Y3Qgc29ja2V0X2NhcF90IHsKKyAgICB1X2ludCAgICAgICBmZWF0dXJlczsKKyAgICB1X2ludCAgICAgICBpcnFfbWFzazsKKyAgICB1X2ludCAgICAgICBtYXBfc2l6ZTsKKyAgICBpb2FkZHJfdCAgICBpb19vZmZzZXQ7CisgICAgdV9jaGFyICAgICAgcGNpX2lycTsKKyAgICAvL3N0cnVjdCBwY2lfZGV2ICpjYl9kZXY7CisgICAgLy9zdHJ1Y3QgYnVzX29wZXJhdGlvbnMgKmJ1czsKKyAgICB2b2lkICpjYl9kZXY7CisgICAgdm9pZCAqYnVzOworfSBzb2NrZXRfY2FwX3Q7CisvKiBJbnF1aXJlU29ja2V0IGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBTU19DQVBfUEFHRV9SRUdTICAgICAgICAweDAwMDEKKyNkZWZpbmUgU1NfQ0FQX1ZJUlRVQUxfQlVTICAgICAgMHgwMDAyCisjZGVmaW5lIFNTX0NBUF9NRU1fQUxJR04gICAgICAgIDB4MDAwNAorI2RlZmluZSBTU19DQVBfU1RBVElDX01BUCAgICAgICAweDAwMDgKKyNkZWZpbmUgU1NfQ0FQX1BDQ0FSRCAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFNTX0NBUF9DQVJEQlVTICAgICAgICAgIDB4ODAwMAorCisvKiBmb3IgR2V0U29ja2V0LCBTZXRTb2NrZXQgKi8KK3R5cGVkZWYgc3RydWN0IHNvY2tldF9zdGF0ZV90IHsKKyAgICB1X2ludCAgICAgICBmbGFnczsKKyAgICB1X2ludCAgICAgICBjc2NfbWFzazsKKyAgICB1X2NoYXIgICAgICBWY2MsIFZwcDsKKyAgICB1X2NoYXIgICAgICBpb19pcnE7Cit9IHNvY2tldF9zdGF0ZV90OworCitleHRlcm4gc29ja2V0X3N0YXRlX3QgZGVhZF9zb2NrZXQ7CisKKy8qIFNvY2tldCBjb25maWd1cmF0aW9uIGZsYWdzICovCisjZGVmaW5lIFNTX1BXUl9BVVRPICAgICAweDAwMTAKKyNkZWZpbmUgU1NfSU9DQVJEICAgICAgIDB4MDAyMAorI2RlZmluZSBTU19SRVNFVCAgICAgICAgMHgwMDQwCisjZGVmaW5lIFNTX0RNQV9NT0RFICAgICAweDAwODAKKyNkZWZpbmUgU1NfU1BLUl9FTkEgICAgIDB4MDEwMAorI2RlZmluZSBTU19PVVRQVVRfRU5BICAgMHgwMjAwCisjZGVmaW5lIFNTX0RFQk9VTkNFRCAgICAweDA0MDAgIC8qIFRlbGwgZHJpdmVyIHRoYXQgdGhlIGRlYm91bmNlIGRlbGF5IGhhcyBlbmRlZCAqLworI2RlZmluZSBTU19aVkNBUkQgICAgICAgMHgwODAwCisKKy8qIEZsYWdzIGZvciBJL08gcG9ydCBhbmQgbWVtb3J5IHdpbmRvd3MgKi8KKyNkZWZpbmUgTUFQX0FDVElWRSAgICAgIDB4MDEKKyNkZWZpbmUgTUFQXzE2QklUICAgICAgIDB4MDIKKyNkZWZpbmUgTUFQX0FVVE9TWiAgICAgIDB4MDQKKyNkZWZpbmUgTUFQXzBXUyAgICAgICAgIDB4MDgKKyNkZWZpbmUgTUFQX1dSUFJPVCAgICAgIDB4MTAKKyNkZWZpbmUgTUFQX0FUVFJJQiAgICAgIDB4MjAKKyNkZWZpbmUgTUFQX1VTRV9XQUlUICAgIDB4NDAKKyNkZWZpbmUgTUFQX1BSRUZFVENIICAgIDB4ODAKKworLyogVXNlIHRoaXMganVzdCBmb3IgYnJpZGdlIHdpbmRvd3MgKi8KKyNkZWZpbmUgTUFQX0lPU1BBQ0UgICAgIDB4MjAKKwordHlwZWRlZiBzdHJ1Y3QgcGNjYXJkX2lvX21hcCB7CisgICAgdV9jaGFyICAgICAgbWFwOworICAgIHVfY2hhciAgICAgIGZsYWdzOworICAgIHVfc2hvcnQgICAgIHNwZWVkOworICAgIGlvYWRkcl90ICAgIHN0YXJ0LCBzdG9wOworfSBwY2NhcmRfaW9fbWFwOworCisKK3R5cGVkZWYgc3RydWN0IHBjY2FyZF9tZW1fbWFwIHsKKyAgICB1X2NoYXIgICAgICBtYXA7CisgICAgdV9jaGFyICAgICAgZmxhZ3M7CisgICAgdV9zaG9ydCAgICAgc3BlZWQ7CisgICAgdV9sb25nICAgICAgc3lzX3N0YXJ0LCBzeXNfc3RvcDsKKyAgICB1X2ludCAgICAgICBjYXJkX3N0YXJ0OworfSBwY2NhcmRfbWVtX21hcDsKKwordHlwZWRlZiBzdHJ1Y3QgY2JfYnJpZGdlX21hcCB7CisgICAgdV9jaGFyICAgICAgbWFwOworICAgIHVfY2hhciAgICAgIGZsYWdzOworICAgIHVfaW50ICAgICAgIHN0YXJ0LCBzdG9wOworfSBjYl9icmlkZ2VfbWFwOworLy8gbmVlZCB0aGUgZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXIgc3RydWN0PyAqVE9ETyoKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBlbmQgY2MuaAorCisKKworI2VuZGlmIC8qIFBDTUNJQV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL3JlYWRsaW5lL3JlYWRsaW5lLmggYi9ncHhlL3NyYy9pbmNsdWRlL3JlYWRsaW5lL3JlYWRsaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwYjdhYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvcmVhZGxpbmUvcmVhZGxpbmUuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9SRUFETElORV9ICisjZGVmaW5lIF9SRUFETElORV9ICisKKy8qKiBAZmlsZQorICoKKyAqIE1pbm1hbCByZWFkbGluZQorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK2V4dGVybiBjaGFyICogX19tYWxsb2MgcmVhZGxpbmUgKCBjb25zdCBjaGFyICpwcm9tcHQgKTsKKworI2VuZGlmIC8qIF9SRUFETElORV9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL3N0ZGFyZy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zdGRhcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIyNjFhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zdGRhcmcuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9TVERBUkdfSAorI2RlZmluZSBfU1REQVJHX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCit0eXBlZGVmIF9fYnVpbHRpbl92YV9saXN0IHZhX2xpc3Q7CisjZGVmaW5lIHZhX3N0YXJ0KCBhcCwgbGFzdCApIF9fYnVpbHRpbl92YV9zdGFydCAoIGFwLCBsYXN0ICkKKyNkZWZpbmUgdmFfYXJnKCBhcCwgdHlwZSApIF9fYnVpbHRpbl92YV9hcmcgKCBhcCwgdHlwZSApCisjZGVmaW5lIHZhX2VuZCggYXAgKSBfX2J1aWx0aW5fdmFfZW5kICggYXAgKQorI2RlZmluZSB2YV9jb3B5KCBkZXN0LCBzcmMgKSBfX2J1aWx0aW5fdmFfY29weSAoIGRlc3QsIHNyYyApCisKKyNlbmRpZiAvKiBfU1REQVJHX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvc3RkZGVmLmggYi9ncHhlL3NyYy9pbmNsdWRlL3N0ZGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMDJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL3N0ZGRlZi5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgU1REREVGX0gKKyNkZWZpbmUgU1REREVGX0gKKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKy8qIGZvciBzaXplX3QgKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI3VuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorCisjdW5kZWYgb2Zmc2V0b2YKKyNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHNpemVfdCkgJigoVFlQRSAqKTApLT5NRU1CRVIpCisKKyN1bmRlZiBjb250YWluZXJfb2YKKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyAgICAgICAgICAgICAgICAgICAgICBcCisJY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9IChwdHIpOyAgICBcCisJKHR5cGUgKikoIChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpICk7fSkKKworLyogX19XQ0hBUl9UWVBFX18gaXMgZGVmaW5lZCBieSBnY2MgYW5kIHdpbGwgY2hhbmdlIGlmIC1mc2hvcnQtd2NoYXIgaXMgdXNlZCAqLworI2lmbmRlZiBfX1dDSEFSX1RZUEVfXworI2RlZmluZSBfX1dDSEFSX1RZUEVfXyBsb25nIGludAorI2VuZGlmCit0eXBlZGVmIF9fV0NIQVJfVFlQRV9fIHdjaGFyX3Q7CisKKyNlbmRpZiAvKiBTVERERUZfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9zdGRpbnQuaCBiL2dweGUvc3JjL2luY2x1ZGUvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjOWI4NAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvc3RkaW50LmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBfU1RESU5UX0gKKyNkZWZpbmUgX1NURElOVF9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoKKyAqIFRoaXMgaXMgYSBzdGFuZGFyZCBwcmVkZWZpbmVkIG1hY3JvIG9uIGFsbCBnY2MncyBJJ3ZlIHNlZW4uIEl0J3MKKyAqIGltcG9ydGFudCB0aGF0IHdlIGRlZmluZSBzaXplX3QgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBjb21waWxlciwKKyAqIGJlY2F1c2UgdGhhdCdzIHdoYXQgaXQncyBleHBlY3Rpbmcgd2hlbiBpdCBjaGVja3MgJXpkLyV6eCBwcmludGYKKyAqIGZvcm1hdCBzcGVjaWZpZXJzLgorICovCisjaWZuZGVmIF9fU0laRV9UWVBFX18KKyNkZWZpbmUgX19TSVpFX1RZUEVfXyB1bnNpZ25lZCBsb25nIC8qIHNhZmUgY2hvaWNlIG9uIG1vc3Qgc3lzdGVtcyAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3N0ZGludC5oPgorCit0eXBlZGVmIGludDhfdCBzODsKK3R5cGVkZWYgdWludDhfdCB1ODsKK3R5cGVkZWYgaW50MTZfdCBzMTY7Cit0eXBlZGVmIHVpbnQxNl90IHUxNjsKK3R5cGVkZWYgaW50MzJfdCBzMzI7Cit0eXBlZGVmIHVpbnQzMl90IHUzMjsKK3R5cGVkZWYgaW50NjRfdCBzNjQ7Cit0eXBlZGVmIHVpbnQ2NF90IHU2NDsKKwordHlwZWRlZiBpbnQ4X3QgaW50ODsKK3R5cGVkZWYgdWludDhfdCB1aW50ODsKK3R5cGVkZWYgaW50MTZfdCBpbnQxNjsKK3R5cGVkZWYgdWludDE2X3QgdWludDE2OwordHlwZWRlZiBpbnQzMl90IGludDMyOwordHlwZWRlZiB1aW50MzJfdCB1aW50MzI7Cit0eXBlZGVmIGludDY0X3QgaW50NjQ7Cit0eXBlZGVmIHVpbnQ2NF90IHVpbnQ2NDsKKworI2VuZGlmIC8qIF9TVERJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS9zdGRpby5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zdGRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MTgxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL3N0ZGlvLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfU1RESU9fSAorI2RlZmluZSBfU1RESU9fSAorCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fICgoIGZvcm1hdCAoIHByaW50ZiwgMSwgMiApICkpCitwcmludGYgKCBjb25zdCBjaGFyICpmbXQsIC4uLiApOworCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18gKCggZm9ybWF0ICggcHJpbnRmLCAzLCA0ICkgKSkKK3NucHJpbnRmICggY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4gKTsKKworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fICgoIGZvcm1hdCAoIHByaW50ZiwgMiwgMyApICkpCithc3ByaW50ZiAoIGNoYXIgKipzdHJwLCBjb25zdCBjaGFyICpmbXQsIC4uLiApOworCitleHRlcm4gaW50IHZwcmludGYgKCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyApOworCitleHRlcm4gaW50IHZzbnByaW50ZiAoIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICk7CisKK2V4dGVybiBpbnQgdmFzcHJpbnRmICggY2hhciAqKnN0cnAsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICk7CisKKy8qKgorICogV3JpdGUgYSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGEgYnVmZmVyCisgKgorICogQHYgYnVmCQlCdWZmZXIgaW50byB3aGljaCB0byB3cml0ZSB0aGUgc3RyaW5nCisgKiBAdiBmbXQJCUZvcm1hdCBzdHJpbmcKKyAqIEB2IC4uLgkJQXJndW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEByZXQgbGVuCQlMZW5ndGggb2YgZm9ybWF0dGVkIHN0cmluZworICovCisjZGVmaW5lIHNwcmludGYoIGJ1ZiwgZm10LCAuLi4gKSBcCisJc25wcmludGYgKCAoYnVmKSwgfiggKCBzaXplX3QgKSAwICksIChmbXQpLCAjIyBfX1ZBX0FSR1NfXyApCisKKy8qKgorICogV3JpdGUgYSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGEgYnVmZmVyCisgKgorICogQHYgYnVmCQlCdWZmZXIgaW50byB3aGljaCB0byB3cml0ZSB0aGUgc3RyaW5nCisgKiBAdiBmbXQJCUZvcm1hdCBzdHJpbmcKKyAqIEB2IGFyZ3MJCUFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGZvcm1hdHRlZCBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSBpbnQgdnNwcmludGYgKCBjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkgeworCXJldHVybiB2c25wcmludGYgKCBidWYsIH4oICggc2l6ZV90ICkgMCApLCBmbXQsIGFyZ3MgKTsKK30KKworI2VuZGlmIC8qIF9TVERJT19IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL3N0ZGxpYi5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zdGRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTRlMzliCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zdGRsaWIuaApAQCAtMCwwICsxLDc1IEBACisjaWZuZGVmIFNURExJQl9ICisjZGVmaW5lIFNURExJQl9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOdW1lcmljIHBhcnNpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN0cnRvdWwgKCBjb25zdCBjaGFyICpwLCBjaGFyICoqZW5kcCwgaW50IGJhc2UgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWVtb3J5IGFsbG9jYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2V4dGVybiB2b2lkICogX19tYWxsb2MgbWFsbG9jICggc2l6ZV90IHNpemUgKTsKK2V4dGVybiB2b2lkICogcmVhbGxvYyAoIHZvaWQgKm9sZF9wdHIsIHNpemVfdCBuZXdfc2l6ZSApOworZXh0ZXJuIHZvaWQgZnJlZSAoIHZvaWQgKnB0ciApOworZXh0ZXJuIHZvaWQgKiBfX21hbGxvYyB6YWxsb2MgKCBzaXplX3QgbGVuICk7CisKKy8qKgorICogQWxsb2NhdGUgY2xlYXJlZCBtZW1vcnkKKyAqCisgKiBAdiBubWVtYgkJTnVtYmVyIG9mIG1lbWJlcnMKKyAqIEB2IHNpemUJCVNpemUgb2YgZWFjaCBtZW1iZXIKKyAqIEByZXQgcHRyCQlBbGxvY2F0ZWQgbWVtb3J5CisgKgorICogQWxsb2NhdGUgbWVtb3J5IGFzIHBlciBtYWxsb2MoKSwgYW5kIHplcm8gaXQuCisgKgorICogVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHN0YXRpYyBpbmxpbmUsIHdpdGggdGhlIGJvZHkgb2YgdGhlCisgKiBmdW5jdGlvbiBpbiB6YWxsb2MoKSwgc2luY2UgaW4gbW9zdCBjYXNlcyBAYyBubWVtYiB3aWxsIGJlIDEgYW5kCisgKiBkb2luZyB0aGUgbXVsdGlwbHkgaXMganVzdCB3YXN0ZWZ1bC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICogX19tYWxsb2MgY2FsbG9jICggc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSApIHsKKwlyZXR1cm4gemFsbG9jICggbm1lbWIgKiBzaXplICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworZXh0ZXJuIGxvbmcgaW50IHJhbmRvbSAoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHNyYW5kb20gKCB1bnNpZ25lZCBpbnQgc2VlZCApOworCitzdGF0aWMgaW5saW5lIGludCByYW5kICggdm9pZCApIHsKKwlyZXR1cm4gcmFuZG9tKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcmFuZCAoIHVuc2lnbmVkIGludCBzZWVkICkgeworCXNyYW5kb20gKCBzZWVkICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1pc2NlbGxhbmVvdXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2V4dGVybiBpbnQgc3lzdGVtICggY29uc3QgY2hhciAqY29tbWFuZCApOworZXh0ZXJuIF9fYXNtY2FsbCBpbnQgbWFpbiAoIHZvaWQgKTsKKworI2VuZGlmIC8qIFNURExJQl9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL3N0cmluZy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQ2YWNmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zdHJpbmcuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgVG9iaWFzIExvcmVuegorICoKKyAqICBzdHJpbmcgaGFuZGxpbmcgZnVuY3Rpb25zCisgKiAgYmFzZWQgb24gbGludXgvaW5jbHVkZS9saW51eC9jdHlwZS5oCisgKiAgICAgICBhbmQgbGludXgvaW5jbHVkZS9saW51eC9zdHJpbmcuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PTkxZICk7CisKKyNpZm5kZWYgRVRIRVJCT09UX1NUUklOR19ICisjZGVmaW5lIEVUSEVSQk9PVF9TVFJJTkdfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8Yml0cy9zdHJpbmcuaD4KKworaW50IF9fcHVyZSBzdHJuaWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBsZW4pIF9fbm9ubnVsbDsKK2NoYXIgKiBzdHJjcHkoY2hhciAqIGRlc3QsY29uc3QgY2hhciAqc3JjKSBfX25vbm51bGw7CitjaGFyICogc3RybmNweShjaGFyICogZGVzdCxjb25zdCBjaGFyICpzcmMsc2l6ZV90IGNvdW50KSBfX25vbm51bGw7CitjaGFyICogc3RyY2F0KGNoYXIgKiBkZXN0LCBjb25zdCBjaGFyICogc3JjKSBfX25vbm51bGw7CitjaGFyICogc3RybmNhdChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBjb3VudCkgX19ub25udWxsOworaW50IF9fcHVyZSBzdHJjbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCkgX19ub25udWxsOworaW50IF9fcHVyZSBzdHJuY21wKGNvbnN0IGNoYXIgKiBjcyxjb25zdCBjaGFyICogY3QsCisJCQkJICAgICBzaXplX3QgY291bnQpIF9fbm9ubnVsbDsKK2NoYXIgKiBfX3B1cmUgc3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykgX19ub25udWxsOworY2hhciAqIF9fcHVyZSBzdHJyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykgX19ub25udWxsOworc2l6ZV90IF9fcHVyZSBzdHJsZW4oY29uc3QgY2hhciAqIHMpIF9fbm9ubnVsbDsKK3NpemVfdCBfX3B1cmUgc3Rybmxlbihjb25zdCBjaGFyICogcywgc2l6ZV90IGNvdW50KSBfX25vbm51bGw7CitzaXplX3QgX19wdXJlIHN0cnNwbihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICphY2NlcHQpIF9fbm9ubnVsbDsKK3NpemVfdCBfX3B1cmUgc3RyY3Nwbihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpyZWplY3QpIF9fbm9ubnVsbDsKK2NoYXIgKiBfX3B1cmUgc3RycGJyayhjb25zdCBjaGFyICogY3MsY29uc3QgY2hhciAqIGN0KSBfX25vbm51bGw7CitjaGFyICogc3RydG9rKGNoYXIgKiBzLGNvbnN0IGNoYXIgKiBjdCkgX19ub25udWxsOworY2hhciAqIHN0cnNlcChjaGFyICoqcywgY29uc3QgY2hhciAqY3QpIF9fbm9ubnVsbDsKK3ZvaWQgKiBtZW1zZXQodm9pZCAqIHMsaW50IGMsc2l6ZV90IGNvdW50KSBfX25vbm51bGw7Cit2b2lkICogbWVtbW92ZSh2b2lkICogZGVzdCxjb25zdCB2b2lkICpzcmMsc2l6ZV90IGNvdW50KSBfX25vbm51bGw7CitpbnQgX19wdXJlIG1lbWNtcChjb25zdCB2b2lkICogY3MsY29uc3Qgdm9pZCAqIGN0LAorCQkJCSAgICBzaXplX3QgY291bnQpIF9fbm9ubnVsbDsKK3ZvaWQgKiBfX3B1cmUgbWVtc2Nhbihjb25zdCB2b2lkICogYWRkciwgaW50IGMsIHNpemVfdCBzaXplKSBfX25vbm51bGw7CitjaGFyICogX19wdXJlIHN0cnN0cihjb25zdCBjaGFyICogczEsY29uc3QgY2hhciAqIHMyKSBfX25vbm51bGw7Cit2b2lkICogX19wdXJlIG1lbWNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pIF9fbm9ubnVsbDsKK2NoYXIgKiBfX21hbGxvYyBzdHJkdXAoY29uc3QgY2hhciAqcykgX19ub25udWxsOworY2hhciAqIF9fbWFsbG9jIHN0cm5kdXAoY29uc3QgY2hhciAqcywgc2l6ZV90IG4pIF9fbm9ubnVsbDsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKiBfX3B1cmUgc3RyZXJyb3IgKCBpbnQgZXJybm8gKTsKKworI2VuZGlmIC8qIEVUSEVSQk9PVF9TVFJJTkcgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvc3RyaW5ncy5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zdHJpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwNjNkNgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvc3RyaW5ncy5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX1NUUklOR1NfSAorI2RlZmluZSBfU1RSSU5HU19ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBpbnQKK19fY29uc3RhbnRfZmxzbCAoIHVuc2lnbmVkIGxvbmcgeCApIHsKKwlpbnQgciA9IDA7CisKKyNpZiBVTE9OR19NQVggPiAweGZmZmZmZmZmCisJaWYgKCB4ICYgMHhmZmZmZmZmZjAwMDAwMDAwVUwgKSB7CisJCXggPj49IDMyOworCQlyICs9IDMyOworCX0KKyNlbmRpZgorCWlmICggeCAmIDB4ZmZmZjAwMDBVTCApIHsKKwkJeCA+Pj0gMTY7CisJCXIgKz0gMTY7CisJfQorCWlmICggeCAmIDB4ZmYwMCApIHsKKwkJeCA+Pj0gODsKKwkJciArPSA4OworCX0KKwlpZiAoIHggJiAweGYwICkgeworCQl4ID4+PSA0OworCQlyICs9IDQ7CisJfQorCWlmICggeCAmIDB4YyApIHsKKwkJeCA+Pj0gMjsKKwkJciArPSAyOworCX0KKwlpZiAoIHggJiAweDIgKSB7CisJCXggPj49IDE7CisJCXIgKz0gMTsKKwl9CisJaWYgKCB4ICYgMHgxICkgeworCQlyICs9IDE7CisJfQorCXJldHVybiByOworfQorCisvKiBXZSBkb24ndCBhY3R1YWxseSBoYXZlIHRoZXNlIGZ1bmN0aW9ucyB5ZXQgKi8KK2V4dGVybiBpbnQgX19mbHNsICggbG9uZyB4ICk7CisKKyNkZWZpbmUgZmxzbCggeCApIFwKKwkoIF9fYnVpbHRpbl9jb25zdGFudF9wICggeCApID8gX19jb25zdGFudF9mbHNsICggeCApIDogX19mbHNsICggeCApICkKKworI2RlZmluZSBmbHMoIHggKSBmbHNsICggeCApCisKK2V4dGVybiBpbnQgc3RyY2FzZWNtcCAoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiApOworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitiY29weSAoIGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZGVzdCwgc2l6ZV90IG4gKSB7CisJbWVtbW92ZSAoIGRlc3QsIHNyYywgbiApOworfQorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCitiemVybyAoIHZvaWQgKnMsIHNpemVfdCBuICkgeworCW1lbXNldCAoIHMsIDAsIG4gKTsKK30KKworI2VuZGlmIC8qIF9TVFJJTkdTX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvc3lzL3RpbWUuaCBiL2dweGUvc3JjL2luY2x1ZGUvc3lzL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZiN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zeXMvdGltZS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX1NZU19USU1FX0gKKyNkZWZpbmUgX1NZU19USU1FX0gKKworI2luY2x1ZGUgPHRpbWUuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHN1c2Vjb25kc190OworCitzdHJ1Y3QgdGltZXZhbCB7CisJdGltZV90IHR2X3NlYzsJCS8qIHNlY29uZHMgKi8KKwlzdXNlY29uZHNfdCB0dl91c2VjOwkvKiBtaWNyb3NlY29uZHMgKi8KK307CisKK3N0cnVjdCB0aW1lem9uZSB7CisJaW50IHR6X21pbnV0ZXN3ZXN0OwkvKiBtaW51dGVzIFcgb2YgR3JlZW53aWNoICovCisJaW50IHR6X2RzdHRpbWU7CQkvKiB0eXBlIG9mIGRzdCBjb3JyZWN0aW9uICovCit9OworCitleHRlcm4gaW50IGdldHRpbWVvZmRheSAoIHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eiApOworCisjZW5kaWYgLyogX1NZU19USU1FX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvc3lzX2luZm8uaCBiL2dweGUvc3JjL2luY2x1ZGUvc3lzX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTI3YzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS9zeXNfaW5mby5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgU1lTX0lORk9fSAorI2RlZmluZSBTWVNfSU5GT19ICisKKy8qIEluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZpcm13YXJlL2Jvb3Rsb2FkZXIgKi8KKworc3RydWN0IHN5c19pbmZvIHsKKyAgICAvKiBWYWx1ZXMgcGFzc2VkIGJ5IGJvb3Rsb2FkZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIGJvb3RfdHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIGJvb3RfZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGJvb3RfYXJnOworCisgICAgY2hhciAqZmlybXdhcmU7IC8qICJQQ0JJT1MiLCAiTGludXhCSU9TIiwgZXRjLiAqLworICAgIGNoYXIgKmNvbW1hbmRfbGluZTsgLyogY29tbWFuZCBsaW5lIGdpdmVuIHRvIHVzICovCisjaWYgMAorLy9CeSBMWUgKKy8vV2lsbCB1c2UgbWVtaW5mbyBpbiBFdGhlcmJvb3QgCisgICAgLyogbWVtb3J5IG1hcCAqLworICAgIGludCBuX21lbXJhbmdlczsKKyAgICBzdHJ1Y3QgbWVtcmFuZ2UgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBiYXNlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplOworICAgIH0gKm1lbXJhbmdlOworI2VuZGlmCit9OworCit2b2lkIGNvbGxlY3Rfc3lzX2luZm8oc3RydWN0IHN5c19pbmZvICppbmZvKTsKK3ZvaWQgY29sbGVjdF9lbGZib290X2luZm8oc3RydWN0IHN5c19pbmZvICppbmZvKTsKK3ZvaWQgY29sbGVjdF9saW51eGJpb3NfaW5mbyhzdHJ1Y3Qgc3lzX2luZm8gKmluZm8pOworCisvKiBPdXIgbmFtZSBhbmQgdmVyc2lvbi4gSSB3YW50IHRvIHNlZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlc2UgaW4gdGhlIGltYWdlICovCitleHRlcm4gY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lLCAqcHJvZ3JhbV92ZXJzaW9uOworCisjZW5kaWYgLyogU1lTX0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS90aW1lLmggYi9ncHhlL3NyYy9pbmNsdWRlL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWE5MjdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS90aW1lLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfVElNRV9ICisjZGVmaW5lIF9USU1FX0gKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHRpbWVfdDsKKworc3RydWN0IHRtIHsKKwlpbnQgdG1fc2VjOwkvKiBzZWNvbmRzICovCisJaW50IHRtX21pbjsJLyogbWludXRlcyAqLworCWludCB0bV9ob3VyOwkvKiBob3VycyAqLworCWludCB0bV9tZGF5OwkvKiBkYXkgb2YgdGhlIG1vbnRoICovCisJaW50IHRtX21vbjsJLyogbW9udGggKi8KKwlpbnQgdG1feWVhcjsJLyogeWVhciAqLworCWludCB0bV93ZGF5OwkvKiBkYXkgb2YgdGhlIHdlZWsgKi8KKwlpbnQgdG1feWRheTsJLyogZGF5IGluIHRoZSB5ZWFyICovCisJaW50IHRtX2lzZHN0OwkvKiBkYXlsaWdodCBzYXZpbmcgdGltZSAqLworfTsKKworZXh0ZXJuIHRpbWVfdCB0aW1lICggdGltZV90ICp0ICk7CisKK2V4dGVybiB0aW1lX3QgbWt0aW1lICggc3RydWN0IHRtICp0bSApOworCisjZW5kaWYgLyogX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS91bmlzdGQuaCBiL2dweGUvc3JjL2luY2x1ZGUvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5NDY5NAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvdW5pc3RkLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBfVU5JU1REX0gKKyNkZWZpbmUgX1VOSVNURF9ICisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitleHRlcm4gaW50IGV4ZWN2ICggY29uc3QgY2hhciAqY29tbWFuZCwgY2hhciAqIGNvbnN0IGFyZ3ZbXSApOworCisvKioKKyAqIEV4ZWN1dGUgY29tbWFuZAorICoKKyAqIEB2IGNvbW1hbmQJCUNvbW1hbmQgbmFtZQorICogQHYgYXJnIC4uLgkJQXJndW1lbnQgbGlzdCAoc3RhcnRpbmcgd2l0aCBhcmd2WzBdKQorICogQHJldCByYwkJQ29tbWFuZCBleGl0IHN0YXR1cworICoKKyAqIFRoaXMgaXMgYSBmcm9udCBlbmQgdG8gZXhlY3YoKS4KKyAqLworI2RlZmluZSBleGVjbCggY29tbWFuZCwgYXJnLCAuLi4gKSAoIHsJCQkJCVwKKwkJY2hhciAqIGNvbnN0IGFyZ3ZbXSA9IHsgKGFyZyksICMjIF9fVkFfQVJHU19fIH07CVwKKwkJaW50IHJjID0gZXhlY3YgKCAoY29tbWFuZCksIGFyZ3YgKTsJCQlcCisJCXJjOwkJCQkJCQlcCisJfSApCisKKy8qIFBpY2sgdXAgdWRlbGF5KCkgKi8KKyNpbmNsdWRlIDxncHhlL3RpbWVyLmg+CisKKy8qCisgKiBzbGVlcCgpIHByb3RvdHlwZSBpcyBkZWZpbmVkIGJ5IFBPU0lYLjEuICB1c2xlZXAoKSBwcm90b3R5cGUgaXMKKyAqIGRlZmluZWQgYnkgNC4zQlNELiAgdWRlbGF5KCkgYW5kIG1kZWxheSgpIHByb3RvdHlwZXMgYXJlIGNob3NlbiB0bworICogYmUgcmVhc29uYWJseSBzZW5zaWJsZS4KKyAqCisgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGludCBzbGVlcCAoIHVuc2lnbmVkIGludCBzZWNvbmRzICk7CitleHRlcm4gdm9pZCBtZGVsYXkgKCB1bnNpZ25lZCBsb25nIG1zZWNzICk7CisKK3N0YXRpYyBpbmxpbmUgX19hbHdheXNfaW5saW5lIHZvaWQgdXNsZWVwICggdW5zaWduZWQgbG9uZyB1c2VjcyApIHsKKwl1ZGVsYXkgKCB1c2VjcyApOworfQorCisjZW5kaWYgLyogX1VOSVNURF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL3Vzci9hdXRvYm9vdC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS91c3IvYXV0b2Jvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTE4MDIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS91c3IvYXV0b2Jvb3QuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9VU1JfQVVUT0JPT1RfSAorI2RlZmluZSBfVVNSX0FVVE9CT09UX0gKKworLyoqIEBmaWxlCisgKgorICogQXV0b21hdGljIGJvb3RpbmcKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9pbi5oPgorc3RydWN0IG5ldF9kZXZpY2U7CisKK2V4dGVybiBpbnQgc2h1dGRvd25fZXhpdF9mbGFnczsKKworZXh0ZXJuIHZvaWQgYXV0b2Jvb3QgKCB2b2lkICk7CitleHRlcm4gaW50IGJvb3RfbmV4dF9zZXJ2ZXJfYW5kX2ZpbGVuYW1lICggc3RydWN0IGluX2FkZHIgbmV4dF9zZXJ2ZXIsCisJCQkJCSAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lICk7CitleHRlcm4gaW50IGJvb3Rfcm9vdF9wYXRoICggY29uc3QgY2hhciAqcm9vdF9wYXRoICk7CisKK2V4dGVybiBpbnQgcHhlX21lbnVfYm9vdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQorCV9fYXR0cmlidXRlX18gKCggd2VhayApKTsKKworI2VuZGlmIC8qIF9VU1JfQVVUT0JPT1RfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS91c3IvZGhjcG1nbXQuaCBiL2dweGUvc3JjL2luY2x1ZGUvdXNyL2RoY3BtZ210LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5NGRhYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvdXNyL2RoY3BtZ210LmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfVVNSX0RIQ1BNR01UX0gKKyNkZWZpbmUgX1VTUl9ESENQTUdNVF9ICisKKy8qKiBAZmlsZQorICoKKyAqIERIQ1AgbWFuYWdlbWVudAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBuZXRfZGV2aWNlOworCitleHRlcm4gaW50IGRoY3AgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CitleHRlcm4gaW50IHB4ZWJzICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdW5zaWduZWQgaW50IHB4ZV90eXBlICk7CisKKyNlbmRpZiAvKiBfVVNSX0RIQ1BNR01UX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvdXNyL2lmbWdtdC5oIGIvZ3B4ZS9zcmMvaW5jbHVkZS91c3IvaWZtZ210LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2MmM3YgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvdXNyL2lmbWdtdC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX1VTUl9JRk1HTVRfSAorI2RlZmluZSBfVVNSX0lGTUdNVF9ICisKKy8qKiBAZmlsZQorICoKKyAqIE5ldHdvcmsgaW50ZXJmYWNlIG1hbmFnZW1lbnQKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitzdHJ1Y3QgbmV0X2RldmljZTsKKworZXh0ZXJuIGludCBpZm9wZW4gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CitleHRlcm4gdm9pZCBpZmNsb3NlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworZXh0ZXJuIHZvaWQgaWZzdGF0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworZXh0ZXJuIGludCBpZmxpbmt3YWl0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdW5zaWduZWQgaW50IG1heF93YWl0X21zICk7CisKKyNlbmRpZiAvKiBfVVNSX0lGTUdNVF9IICovCmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbmNsdWRlL3Vzci9pbWdtZ210LmggYi9ncHhlL3NyYy9pbmNsdWRlL3Vzci9pbWdtZ210LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4YzhjZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2luY2x1ZGUvdXNyL2ltZ21nbXQuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9VU1JfSU1HTUdNVF9ICisjZGVmaW5lIF9VU1JfSU1HTUdNVF9ICisKKy8qKiBAZmlsZQorICoKKyAqIEltYWdlIG1hbmFnZW1lbnQKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitzdHJ1Y3QgaW1hZ2U7CisKK2V4dGVybiBpbnQgaW1nZmV0Y2ggKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlLCBjb25zdCBjaGFyICp1cmlfc3RyaW5nLAorCQkgICAgICBpbnQgKCAqIGltYWdlX3JlZ2lzdGVyICkgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICkgKTsKK2V4dGVybiBpbnQgaW1nbG9hZCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKTsKK2V4dGVybiBpbnQgaW1nZXhlYyAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKTsKK2V4dGVybiBzdHJ1Y3QgaW1hZ2UgKiBpbWdhdXRvc2VsZWN0ICggdm9pZCApOworZXh0ZXJuIHZvaWQgaW1nc3RhdCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKTsKK2V4dGVybiB2b2lkIGltZ2ZyZWUgKCBzdHJ1Y3QgaW1hZ2UgKmltYWdlICk7CisKKyNlbmRpZiAvKiBfVVNSX0lNR01HTVRfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW5jbHVkZS91c3IvaXdtZ210LmggYi9ncHhlL3NyYy9pbmNsdWRlL3Vzci9pd21nbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWJkYzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW5jbHVkZS91c3IvaXdtZ210LmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfVVNSX0lXTUdNVF9ICisjZGVmaW5lIF9VU1JfSVdNR01UX0gKKworLyoqIEBmaWxlCisgKgorICogV2lyZWxlc3MgbmV0d29yayBpbnRlcmZhY2UgbWFuYWdlbWVudAorICoKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKK3N0cnVjdCBuZXQ4MDIxMV9kZXZpY2U7CisKK2V4dGVybiB2b2lkIGl3c3RhdCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApOworZXh0ZXJuIGludCBpd2xpc3QgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKTsKKworI2VuZGlmIC8qIF9VU1JfSVdNR01UX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2luY2x1ZGUvdXNyL3JvdXRlLmggYi9ncHhlL3NyYy9pbmNsdWRlL3Vzci9yb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NWZhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbmNsdWRlL3Vzci9yb3V0ZS5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX1VTUl9ST1VURV9ICisjZGVmaW5lIF9VU1JfUk9VVEVfSAorCisvKiogQGZpbGUKKyAqCisgKiBSb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCitleHRlcm4gdm9pZCByb3V0ZSAoIHZvaWQgKTsKKworI2VuZGlmIC8qIF9VU1JfUk9VVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfY29uc29sZS5jIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YWYyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV9jb25zb2xlLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9lZmkuaD4KKyNpbmNsdWRlIDxncHhlL2Fuc2llc2MuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisKKyNkZWZpbmUgQVRUUl9CT0xECQkweDA4CisKKyNkZWZpbmUgQVRUUl9GQ09MX01BU0sJCTB4MDcKKyNkZWZpbmUgQVRUUl9GQ09MX0JMQUNLCQkweDAwCisjZGVmaW5lIEFUVFJfRkNPTF9CTFVFCQkweDAxCisjZGVmaW5lIEFUVFJfRkNPTF9HUkVFTgkJMHgwMgorI2RlZmluZSBBVFRSX0ZDT0xfQ1lBTgkJMHgwMworI2RlZmluZSBBVFRSX0ZDT0xfUkVECQkweDA0CisjZGVmaW5lIEFUVFJfRkNPTF9NQUdFTlRBCTB4MDUKKyNkZWZpbmUgQVRUUl9GQ09MX1lFTExPVwkweDA2CisjZGVmaW5lIEFUVFJfRkNPTF9XSElURQkJMHgwNworCisjZGVmaW5lIEFUVFJfQkNPTF9NQVNLCQkweDcwCisjZGVmaW5lIEFUVFJfQkNPTF9CTEFDSwkJMHgwMAorI2RlZmluZSBBVFRSX0JDT0xfQkxVRQkJMHgxMAorI2RlZmluZSBBVFRSX0JDT0xfR1JFRU4JCTB4MjAKKyNkZWZpbmUgQVRUUl9CQ09MX0NZQU4JCTB4MzAKKyNkZWZpbmUgQVRUUl9CQ09MX1JFRAkJMHg0MAorI2RlZmluZSBBVFRSX0JDT0xfTUFHRU5UQQkweDUwCisjZGVmaW5lIEFUVFJfQkNPTF9ZRUxMT1cJMHg2MAorI2RlZmluZSBBVFRSX0JDT0xfV0hJVEUJCTB4NzAKKworI2RlZmluZSBBVFRSX0RFRkFVTFQJCUFUVFJfRkNPTF9XSElURQorCisvKiogQ3VycmVudCBjaGFyYWN0ZXIgYXR0cmlidXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVmaV9hdHRyID0gQVRUUl9ERUZBVUxUOworCisvKioKKyAqIEhhbmRsZSBBTlNJIENVUCAoY3Vyc29yIHBvc2l0aW9uKQorICoKKyAqIEB2IGNvdW50CQlQYXJhbWV0ZXIgY291bnQKKyAqIEB2IHBhcmFtc1swXQkJUm93ICgxIGlzIHRvcCkKKyAqIEB2IHBhcmFtc1sxXQkJQ29sdW1uICgxIGlzIGxlZnQpCisgKi8KK3N0YXRpYyB2b2lkIGVmaV9oYW5kbGVfY3VwICggdW5zaWduZWQgaW50IGNvdW50IF9fdW51c2VkLCBpbnQgcGFyYW1zW10gKSB7CisJRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTCAqY29ub3V0ID0gZWZpX3N5c3RhYi0+Q29uT3V0OworCWludCBjeCA9ICggcGFyYW1zWzFdIC0gMSApOworCWludCBjeSA9ICggcGFyYW1zWzBdIC0gMSApOworCisJaWYgKCBjeCA8IDAgKQorCQljeCA9IDA7CisJaWYgKCBjeSA8IDAgKQorCQljeSA9IDA7CisKKwljb25vdXQtPlNldEN1cnNvclBvc2l0aW9uICggY29ub3V0LCBjeCwgY3kgKTsKK30KKworLyoqCisgKiBIYW5kbGUgQU5TSSBFRCAoZXJhc2UgaW4gcGFnZSkKKyAqCisgKiBAdiBjb3VudAkJUGFyYW1ldGVyIGNvdW50CisgKiBAdiBwYXJhbXNbMF0JCVJlZ2lvbiB0byBlcmFzZQorICovCitzdGF0aWMgdm9pZCBlZmlfaGFuZGxlX2VkICggdW5zaWduZWQgaW50IGNvdW50IF9fdW51c2VkLAorCQkJICAgICBpbnQgcGFyYW1zW10gX191bnVzZWQgKSB7CisJRUZJX1NJTVBMRV9URVhUX09VVFBVVF9QUk9UT0NPTCAqY29ub3V0ID0gZWZpX3N5c3RhYi0+Q29uT3V0OworCisJLyogV2UgYXNzdW1lIHRoYXQgd2UgYWx3YXlzIGNsZWFyIHRoZSB3aG9sZSBzY3JlZW4gKi8KKwlhc3NlcnQgKCBwYXJhbXNbMF0gPT0gQU5TSUVTQ19FRF9BTEwgKTsKKworCWNvbm91dC0+Q2xlYXJTY3JlZW4gKCBjb25vdXQgKTsKK30KKworLyoqCisgKiBIYW5kbGUgQU5TSSBTR1IgKHNldCBncmFwaGljcyByZW5kaXRpb24pCisgKgorICogQHYgY291bnQJCVBhcmFtZXRlciBjb3VudAorICogQHYgcGFyYW1zCQlMaXN0IG9mIGdyYXBoaWMgcmVuZGl0aW9uIGFzcGVjdHMKKyAqLworc3RhdGljIHZvaWQgZWZpX2hhbmRsZV9zZ3IgKCB1bnNpZ25lZCBpbnQgY291bnQsIGludCBwYXJhbXNbXSApIHsKKwlFRklfU0lNUExFX1RFWFRfT1VUUFVUX1BST1RPQ09MICpjb25vdXQgPSBlZmlfc3lzdGFiLT5Db25PdXQ7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgZWZpX2F0dHJfZmNvbHNbMTBdID0geworCQlBVFRSX0ZDT0xfQkxBQ0ssIEFUVFJfRkNPTF9SRUQsIEFUVFJfRkNPTF9HUkVFTiwKKwkJQVRUUl9GQ09MX1lFTExPVywgQVRUUl9GQ09MX0JMVUUsIEFUVFJfRkNPTF9NQUdFTlRBLAorCQlBVFRSX0ZDT0xfQ1lBTiwgQVRUUl9GQ09MX1dISVRFLAorCQlBVFRSX0ZDT0xfV0hJVEUsIEFUVFJfRkNPTF9XSElURSAvKiBkZWZhdWx0cyAqLworCX07CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgZWZpX2F0dHJfYmNvbHNbMTBdID0geworCQlBVFRSX0JDT0xfQkxBQ0ssIEFUVFJfQkNPTF9SRUQsIEFUVFJfQkNPTF9HUkVFTiwKKwkJQVRUUl9CQ09MX1lFTExPVywgQVRUUl9CQ09MX0JMVUUsIEFUVFJfQkNPTF9NQUdFTlRBLAorCQlBVFRSX0JDT0xfQ1lBTiwgQVRUUl9CQ09MX1dISVRFLAorCQlBVFRSX0JDT0xfQkxBQ0ssIEFUVFJfQkNPTF9CTEFDSyAvKiBkZWZhdWx0cyAqLworCX07CisJdW5zaWduZWQgaW50IGk7CisJaW50IGFzcGVjdDsKKworCWZvciAoIGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrICkgeworCQlhc3BlY3QgPSBwYXJhbXNbaV07CisJCWlmICggYXNwZWN0ID09IDAgKSB7CisJCQllZmlfYXR0ciA9IEFUVFJfREVGQVVMVDsKKwkJfSBlbHNlIGlmICggYXNwZWN0ID09IDEgKSB7CisJCQllZmlfYXR0ciB8PSBBVFRSX0JPTEQ7CisJCX0gZWxzZSBpZiAoIGFzcGVjdCA9PSAyMiApIHsKKwkJCWVmaV9hdHRyICY9IH5BVFRSX0JPTEQ7CisJCX0gZWxzZSBpZiAoICggYXNwZWN0ID49IDMwICkgJiYgKCBhc3BlY3QgPD0gMzkgKSApIHsKKwkJCWVmaV9hdHRyICY9IH5BVFRSX0ZDT0xfTUFTSzsKKwkJCWVmaV9hdHRyIHw9IGVmaV9hdHRyX2Zjb2xzWyBhc3BlY3QgLSAzMCBdOworCQl9IGVsc2UgaWYgKCAoIGFzcGVjdCA+PSA0MCApICYmICggYXNwZWN0IDw9IDQ5ICkgKSB7CisJCQllZmlfYXR0ciAmPSB+QVRUUl9CQ09MX01BU0s7CisJCQllZmlfYXR0ciB8PSBlZmlfYXR0cl9iY29sc1sgYXNwZWN0IC0gNDAgXTsKKwkJfQorCX0KKworCWNvbm91dC0+U2V0QXR0cmlidXRlICggY29ub3V0LCBlZmlfYXR0ciApOworfQorCisvKiogRUZJIGNvbnNvbGUgQU5TSSBlc2NhcGUgc2VxdWVuY2UgaGFuZGxlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgYW5zaWVzY19oYW5kbGVyIGVmaV9hbnNpZXNjX2hhbmRsZXJzW10gPSB7CisJeyBBTlNJRVNDX0NVUCwgZWZpX2hhbmRsZV9jdXAgfSwKKwl7IEFOU0lFU0NfRUQsIGVmaV9oYW5kbGVfZWQgfSwKKwl7IEFOU0lFU0NfU0dSLCBlZmlfaGFuZGxlX3NnciB9LAorCXsgMCwgTlVMTCB9Cit9OworCisvKiogRUZJIGNvbnNvbGUgQU5TSSBlc2NhcGUgc2VxdWVuY2UgY29udGV4dCAqLworc3RhdGljIHN0cnVjdCBhbnNpZXNjX2NvbnRleHQgZWZpX2Fuc2llc2NfY3R4ID0geworCS5oYW5kbGVycyA9IGVmaV9hbnNpZXNjX2hhbmRsZXJzLAorfTsKKworLyoqCisgKiBQcmludCBhIGNoYXJhY3RlciB0byBFRkkgY29uc29sZQorICoKKyAqIEB2IGNoYXJhY3RlcgkJQ2hhcmFjdGVyIHRvIGJlIHByaW50ZWQKKyAqLworc3RhdGljIHZvaWQgZWZpX3B1dGNoYXIgKCBpbnQgY2hhcmFjdGVyICkgeworCUVGSV9TSU1QTEVfVEVYVF9PVVRQVVRfUFJPVE9DT0wgKmNvbm91dCA9IGVmaV9zeXN0YWItPkNvbk91dDsKKwl3Y2hhcl90IHdzdHJbXSA9IHsgY2hhcmFjdGVyLCAwIH07CisKKwkvKiBJbnRlcmNlcHQgQU5TSSBlc2NhcGUgc2VxdWVuY2VzICovCisJY2hhcmFjdGVyID0gYW5zaWVzY19wcm9jZXNzICggJmVmaV9hbnNpZXNjX2N0eCwgY2hhcmFjdGVyICk7CisJaWYgKCBjaGFyYWN0ZXIgPCAwICkKKwkJcmV0dXJuOworCisJY29ub3V0LT5PdXRwdXRTdHJpbmcgKCBjb25vdXQsIHdzdHIgKTsKK30KKworLyoqCisgKiBQb2ludGVyIHRvIGN1cnJlbnQgQU5TSSBvdXRwdXQgc2VxdWVuY2UKKyAqCisgKiBXaGlsZSB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiByZXR1cm5pbmcgYW4gQU5TSSBzZXF1ZW5jZSBmb3IgYQorICogc3BlY2lhbCBrZXksIHRoaXMgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gcmV0dXJuLiAgV2hlbgorICogbm90IGluIHRoZSBtaWRkbGUgb2Ygc3VjaCBhIHNlcXVlbmNlLCB0aGlzIHdpbGwgcG9pbnQgdG8gYSBOVUwKKyAqIChub3RlOiBub3QgIndpbGwgYmUgTlVMTCIpLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqYW5zaV9pbnB1dCA9ICIiOworCisvKiogTWFwcGluZyBmcm9tIEVGSSBzY2FuIGNvZGVzIHRvIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFuc2lfc2VxdWVuY2VzW10gPSB7CisJW1NDQU5fVVBdID0gIltBIiwKKwlbU0NBTl9ET1dOXSA9ICJbQiIsCisJW1NDQU5fUklHSFRdID0gIltDIiwKKwlbU0NBTl9MRUZUXSA9ICJbRCIsCisJW1NDQU5fSE9NRV0gPSAiW0giLAorCVtTQ0FOX0VORF0gPSAiW0YiLAorCVtTQ0FOX0lOU0VSVF0gPSAiWzJ+IiwKKwkvKiBFRkkgdHJhbnNsYXRlcyBhbiBpbmNvbWluZyBiYWNrc3BhY2UgdmlhIHRoZSBzZXJpYWwgY29uc29sZQorCSAqIGludG8gYSBTQ0FOX0RFTEVURS4gIFRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGRvIGFib3V0IHRoaXMuCisJICovCisJW1NDQU5fREVMRVRFXSA9ICJbM34iLAorCVtTQ0FOX1BBR0VfVVBdID0gIls1fiIsCisJW1NDQU5fUEFHRV9ET1dOXSA9ICJbNn4iLAorCS8qIEVGSSB0cmFuc2xhdGVzIHNvbWUgKGJ1dCBub3QgYWxsKSBpbmNvbWluZyBlc2NhcGUgc2VxdWVuY2VzCisJICogdmlhIHRoZSBzZXJpYWwgY29uc29sZSBpbnRvIGVxdWl2YWxlbnQgc2NhbmNvZGVzLiAgV2hlbiBpdAorCSAqIGRvZXNuJ3QgcmVjb2duaXNlIGEgc2VxdWVuY2UsIGl0IGhlbHBmdWxseSghKSB0cmFuc2xhdGVzCisJICogdGhlIGluaXRpYWwgRVNDIGFuZCBwYXNzZXMgdGhlIHJlbWFpbmRlciB0aHJvdWdoIHZlcmJhdGltLgorCSAqIFRyZWF0aW5nIFNDQU5fRVNDIGFzIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgZXNjYXBlIHNlcXVlbmNlCisJICogd29ya3MgYXJvdW5kIHRoaXMgYnVnLgorCSAqLworCVtTQ0FOX0VTQ10gPSAiIiwKK307CisKKy8qKgorICogR2V0IEFOU0kgZXNjYXBlIHNlcXVlbmNlIGNvcnJlc3BvbmRpbmcgdG8gRUZJIHNjYW5jb2RlCisgKgorICogQHYgc2NhbmNvZGUJCUVGSSBzY2FuY29kZQorICogQHJldCBhbnNpX3NlcQlBTlNJIGVzY2FwZSBzZXF1ZW5jZSwgaWYgYW55LCBvdGhlcndpc2UgTlVMTAorICovCitzdGF0aWMgY29uc3QgY2hhciAqIHNjYW5jb2RlX3RvX2Fuc2lfc2VxICggdW5zaWduZWQgaW50IHNjYW5jb2RlICkgeworCWlmICggc2NhbmNvZGUgPCAoIHNpemVvZiAoIGFuc2lfc2VxdWVuY2VzICkgLworCQkJICBzaXplb2YgKCBhbnNpX3NlcXVlbmNlc1swXSApICkgKSB7CisJCXJldHVybiBhbnNpX3NlcXVlbmNlc1tzY2FuY29kZV07CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIEdldCBjaGFyYWN0ZXIgZnJvbSBFRkkgY29uc29sZQorICoKKyAqIEByZXQgY2hhcmFjdGVyCUNoYXJhY3RlciByZWFkIGZyb20gY29uc29sZQorICovCitzdGF0aWMgaW50IGVmaV9nZXRjaGFyICggdm9pZCApIHsKKwlFRklfU0lNUExFX1RFWFRfSU5QVVRfUFJPVE9DT0wgKmNvbmluID0gZWZpX3N5c3RhYi0+Q29uSW47CisJY29uc3QgY2hhciAqYW5zaV9zZXE7CisJRUZJX0lOUFVUX0tFWSBrZXk7CisJRUZJX1NUQVRVUyBlZmlyYzsKKworCS8qIElmIHdlIGFyZSBtaWQtc2VxdWVuY2UsIHBhc3Mgb3V0IHRoZSBuZXh0IGJ5dGUgKi8KKwlpZiAoICphbnNpX2lucHV0ICkKKwkJcmV0dXJuICooYW5zaV9pbnB1dCsrKTsKKworCS8qIFJlYWQga2V5IGZyb20gcmVhbCBFRkkgY29uc29sZSAqLworCWlmICggKCBlZmlyYyA9IGNvbmluLT5SZWFkS2V5U3Ryb2tlICggY29uaW4sICZrZXkgKSApICE9IDAgKSB7CisJCURCRyAoICJFRkkgY291bGQgbm90IHJlYWQga2V5c3Ryb2tlOiAlc1xuIiwKKwkJICAgICAgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQlyZXR1cm4gMDsKKwl9CisJREJHMiAoICJFRkkgcmVhZCBrZXkgc3Ryb2tlIHdpdGggdW5pY29kZSAlMDR4IHNjYW5jb2RlICUwNHhcbiIsCisJICAgICAgIGtleS5Vbmljb2RlQ2hhciwga2V5LlNjYW5Db2RlICk7CisKKwkvKiBJZiBrZXkgaGFzIGEgVW5pY29kZSByZXByZXNlbnRhdGlvbiwgcmV0dXJuIGl0ICovCisJaWYgKCBrZXkuVW5pY29kZUNoYXIgKQorCQlyZXR1cm4ga2V5LlVuaWNvZGVDaGFyOworCisJLyogT3RoZXJ3aXNlLCBjaGVjayBmb3IgYSBzcGVjaWFsIGtleSB0aGF0IHdlIGtub3cgYWJvdXQgKi8KKwlpZiAoICggYW5zaV9zZXEgPSBzY2FuY29kZV90b19hbnNpX3NlcSAoIGtleS5TY2FuQ29kZSApICkgKSB7CisJCS8qIFN0YXJ0IG9mIGVzY2FwZSBzZXF1ZW5jZTogcmV0dXJuIEVTQyAoMHgxYikgKi8KKwkJYW5zaV9pbnB1dCA9IGFuc2lfc2VxOworCQlyZXR1cm4gMHgxYjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDaGVjayBmb3IgY2hhcmFjdGVyIHJlYWR5IHRvIHJlYWQgZnJvbSBFRkkgY29uc29sZQorICoKKyAqIEByZXQgVHJ1ZQkJQ2hhcmFjdGVyIGF2YWlsYWJsZSB0byByZWFkCisgKiBAcmV0IEZhbHNlCQlObyBjaGFyYWN0ZXIgYXZhaWxhYmxlIHRvIHJlYWQKKyAqLworc3RhdGljIGludCBlZmlfaXNrZXkgKCB2b2lkICkgeworCUVGSV9CT09UX1NFUlZJQ0VTICpicyA9IGVmaV9zeXN0YWItPkJvb3RTZXJ2aWNlczsKKwlFRklfU0lNUExFX1RFWFRfSU5QVVRfUFJPVE9DT0wgKmNvbmluID0gZWZpX3N5c3RhYi0+Q29uSW47CisJRUZJX1NUQVRVUyBlZmlyYzsKKworCS8qIElmIHdlIGFyZSBtaWQtc2VxdWVuY2UsIHdlIGFyZSBhbHdheXMgcmVhZHkgKi8KKwlpZiAoICphbnNpX2lucHV0ICkKKwkJcmV0dXJuIDE7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIFdhaXRGb3JLZXkgZXZlbnQgaGFzIGZpcmVkICovCisJaWYgKCAoIGVmaXJjID0gYnMtPkNoZWNrRXZlbnQgKCBjb25pbi0+V2FpdEZvcktleSApICkgPT0gMCApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb25zb2xlX2RyaXZlciBlZmlfY29uc29sZSBfX2NvbnNvbGVfZHJpdmVyID0geworCS5wdXRjaGFyID0gZWZpX3B1dGNoYXIsCisJLmdldGNoYXIgPSBlZmlfZ2V0Y2hhciwKKwkuaXNrZXkgPSBlZmlfaXNrZXksCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfaW5pdC5jIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTUwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV9pbml0LmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9lZmkuaD4KKyNpbmNsdWRlIDxncHhlL3V1aWQuaD4KKworLyoqIEltYWdlIGhhbmRsZSBwYXNzZWQgdG8gZW50cnkgcG9pbnQgKi8KK0VGSV9IQU5ETEUgZWZpX2ltYWdlX2hhbmRsZTsKKworLyoqIFN5c3RlbSB0YWJsZSBwYXNzZWQgdG8gZW50cnkgcG9pbnQgKi8KK0VGSV9TWVNURU1fVEFCTEUgKmVmaV9zeXN0YWI7CisKKy8qKgorICogTG9vayB1cCBFRkkgY29uZmlndXJhdGlvbiB0YWJsZQorICoKKyAqIEB2IGd1aWQJCUNvbmZpZ3VyYXRpb24gdGFibGUgR1VJRAorICogQHJldCB0YWJsZQkJQ29uZmlndXJhdGlvbiB0YWJsZSwgb3IgTlVMTAorICovCitzdGF0aWMgdm9pZCAqIGVmaV9maW5kX3RhYmxlICggRUZJX0dVSUQgKmd1aWQgKSB7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBlZmlfc3lzdGFiLT5OdW1iZXJPZlRhYmxlRW50cmllcyA7IGkrKyApIHsKKwkJaWYgKCBtZW1jbXAgKCAmZWZpX3N5c3RhYi0+Q29uZmlndXJhdGlvblRhYmxlW2ldLlZlbmRvckd1aWQsCisJCQkgICAgICBndWlkLCBzaXplb2YgKCAqZ3VpZCApICkgPT0gMCApCisJCQlyZXR1cm4gZWZpX3N5c3RhYi0+Q29uZmlndXJhdGlvblRhYmxlW2ldLlZlbmRvclRhYmxlOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIEluaXRpYWxpc2UgRUZJIGVudmlyb25tZW50CisgKgorICogQHYgaW1hZ2VfaGFuZGxlCUltYWdlIGhhbmRsZQorICogQHYgc3lzdGFiCQlTeXN0ZW0gdGFibGUKKyAqIEByZXQgZWZpcmMJCUVGSSByZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworRUZJX1NUQVRVUyBlZmlfaW5pdCAoIEVGSV9IQU5ETEUgaW1hZ2VfaGFuZGxlLAorCQkgICAgICBFRklfU1lTVEVNX1RBQkxFICpzeXN0YWIgKSB7CisJRUZJX0JPT1RfU0VSVklDRVMgKmJzOworCXN0cnVjdCBlZmlfcHJvdG9jb2wgKnByb3Q7CisJc3RydWN0IGVmaV9jb25maWdfdGFibGUgKnRhYjsKKwlFRklfU1RBVFVTIGVmaXJjOworCisJLyogU3RvcmUgaW1hZ2UgaGFuZGxlIGFuZCBzeXN0ZW0gdGFibGUgcG9pbnRlciBmb3IgZnV0dXJlIHVzZSAqLworCWVmaV9pbWFnZV9oYW5kbGUgPSBpbWFnZV9oYW5kbGU7CisJZWZpX3N5c3RhYiA9IHN5c3RhYjsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoICEgc3lzdGFiICkKKwkJcmV0dXJuIEVGSV9OT1RfQVZBSUxBQkxFX1lFVDsKKwlpZiAoICEgc3lzdGFiLT5Db25PdXQgKQorCQlyZXR1cm4gRUZJX05PVF9BVkFJTEFCTEVfWUVUOworCWlmICggISBzeXN0YWItPkJvb3RTZXJ2aWNlcyApIHsKKwkJREJHQyAoIHN5c3RhYiwgIkVGSSBwcm92aWRlZCBubyBCb290U2VydmljZXMgZW50cnkgcG9pbnRcbiIgKTsKKwkJcmV0dXJuIEVGSV9OT1RfQVZBSUxBQkxFX1lFVDsKKwl9CisJaWYgKCAhIHN5c3RhYi0+UnVudGltZVNlcnZpY2VzICkgeworCQlEQkdDICggc3lzdGFiLCAiRUZJIHByb3ZpZGVkIG5vIFJ1bnRpbWVTZXJ2aWNlcyBlbnRyeSAiCisJCSAgICAgICAicG9pbnRcbiIgKTsKKwkJcmV0dXJuIEVGSV9OT1RfQVZBSUxBQkxFX1lFVDsKKwl9CisJREJHQyAoIHN5c3RhYiwgIkVGSSBoYW5kbGUgJXAgc3lzdGFiICVwXG4iLCBpbWFnZV9oYW5kbGUsIHN5c3RhYiApOworCisJLyogTG9vayB1cCB1c2VkIHByb3RvY29scyAqLworCWJzID0gc3lzdGFiLT5Cb290U2VydmljZXM7CisJZm9yX2VhY2hfdGFibGVfZW50cnkgKCBwcm90LCBFRklfUFJPVE9DT0xTICkgeworCQlpZiAoICggZWZpcmMgPSBicy0+TG9jYXRlUHJvdG9jb2wgKCAmcHJvdC0+dS5ndWlkLCBOVUxMLAorCQkJCQkJICAgIHByb3QtPnByb3RvY29sICkgKSA9PSAwICkgeworCQkJREJHQyAoIHN5c3RhYiwgIkVGSSBwcm90b2NvbCAlcyBpcyBhdCAlcFxuIiwKKwkJCSAgICAgICB1dWlkX250b2EgKCAmcHJvdC0+dS51dWlkICksICoocHJvdC0+cHJvdG9jb2wpKTsKKwkJfSBlbHNlIHsKKwkJCURCR0MgKCBzeXN0YWIsICJFRkkgZG9lcyBub3QgcHJvdmlkZSBwcm90b2NvbCAlc1xuIiwKKwkJCSAgICAgICB1dWlkX250b2EgKCAmcHJvdC0+dS51dWlkICkgKTsKKwkJCS8qIEFsbCBwcm90b2NvbHMgYXJlIHJlcXVpcmVkICovCisJCQlyZXR1cm4gZWZpcmM7CisJCX0KKwl9CisKKwkvKiBMb29rIHVwIHVzZWQgY29uZmlndXJhdGlvbiB0YWJsZXMgKi8KKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIHRhYiwgRUZJX0NPTkZJR19UQUJMRVMgKSB7CisJCWlmICggKCAqKHRhYi0+dGFibGUpID0gZWZpX2ZpbmRfdGFibGUgKCAmdGFiLT51Lmd1aWQgKSApICkgeworCQkJREJHQyAoIHN5c3RhYiwgIkVGSSBjb25maWd1cmF0aW9uIHRhYmxlICVzIGlzIGF0ICVwXG4iLAorCQkJICAgICAgIHV1aWRfbnRvYSAoICZ0YWItPnUudXVpZCApLCAqKHRhYi0+dGFibGUpICk7CisJCX0gZWxzZSB7CisJCQlEQkdDICggc3lzdGFiLCAiRUZJIGRvZXMgbm90IHByb3ZpZGUgY29uZmlndXJhdGlvbiAiCisJCQkgICAgICAgInRhYmxlICVzXG4iLCB1dWlkX250b2EgKCAmdGFiLT51LnV1aWQgKSApOworCQkJaWYgKCB0YWItPnJlcXVpcmVkICkKKwkJCQlyZXR1cm4gRUZJX05PVF9BVkFJTEFCTEVfWUVUOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV9pby5jIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmExNmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfaW8uYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvaW8uaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9lZmkuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9Qcm90b2NvbC9DcHVJby5oPgorI2luY2x1ZGUgPGdweGUvZWZpL2VmaV9pby5oPgorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIEkvTyBBUEkgZm9yIEVGSQorICoKKyAqLworCisvKiogQ1BVIEkvTyBwcm90b2NvbCAqLworc3RhdGljIEVGSV9DUFVfSU9fUFJPVE9DT0wgKmNwdV9pbzsKK0VGSV9SRVFVSVJFX1BST1RPQ09MICggRUZJX0NQVV9JT19QUk9UT0NPTCwgJmNwdV9pbyApOworCisvKiogTWF4aW11bSBhZGRyZXNzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHBvcnQgSS9PICovCisjZGVmaW5lIE1BWF9QT1JUX0FERFJFU1MgMHhmZmZmCisKKy8qKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGFkZHJlc3MgaXMgYSBwb3J0IEkvTyBhZGRyZXNzCisgKgorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqIEB2IGlzX3BvcnQJCUkvTyBhZGRyZXNzIGlzIGEgcG9ydCBJL08gYWRkcmVzcworICovCisjZGVmaW5lIElTX1BPUlRfQUREUkVTUyhpb19hZGRyKSBcCisJKCAoICggaW50cHRyX3QgKSAoaW9fYWRkcikgKSA8PSBNQVhfUE9SVF9BRERSRVNTICkKKworLyoqCisgKiBEZXRlcm1pbmUgRUZJIENQVSBJL08gd2lkdGggY29kZQorICoKKyAqIEB2IHNpemUJCVNpemUgb2YgdmFsdWUKKyAqIEByZXQgd2lkdGgJCUVGSSB3aWR0aCBjb2RlCisgKgorICogU29tZW9uZSBhdCBJbnRlbCBjbGVhcmx5IGdldHMgcGFpZCBieSB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIGNvZGUKKyAqIHRoZXkgd3JpdGUuICBOby1vbmUgc2hvdWxkIGV2ZXIgYmUgYWJsZSB0byBtYWtlIEkvTyB0aGlzCisgKiBjb252b2x1dGVkLiAgVGhlIEVGSV9DUFVfSU9fUFJPVE9DT0xfV0lEVEggZW51bSBpcyBteSBmYXZvdXJpdGUKKyAqIGlkaW9jeS4KKyAqLworc3RhdGljIEVGSV9DUFVfSU9fUFJPVE9DT0xfV0lEVEggZWZpX3dpZHRoICggc2l6ZV90IHNpemUgKSB7CisJc3dpdGNoICggc2l6ZSApIHsKKwljYXNlIDEgOglyZXR1cm4gRWZpQ3B1SW9XaWR0aEZpZm9VaW50ODsKKwljYXNlIDIgOglyZXR1cm4gRWZpQ3B1SW9XaWR0aEZpZm9VaW50MTY7CisJY2FzZSA0IDoJcmV0dXJuIEVmaUNwdUlvV2lkdGhGaWZvVWludDMyOworCWNhc2UgOCA6CXJldHVybiBFZmlDcHVJb1dpZHRoRmlmb1VpbnQ2NDsKKwlkZWZhdWx0IDoKKwkJYXNzZXJ0ICggMCApOworCQkvKiBJIHdvbmRlciB3aGF0IHRoaXMgd2lsbCBhY3R1YWxseSBkby4uLiAqLworCQlyZXR1cm4gRWZpQ3B1SW9XaWR0aE1heGltdW07CisJfQorfQorCisvKioKKyAqIFJlYWQgZnJvbSBkZXZpY2UKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHYgc2l6ZQkJU2l6ZSBvZiB2YWx1ZQorICogQHJldCBkYXRhCQlWYWx1ZSByZWFkCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBlZmlfaW9yZWFkICggdm9sYXRpbGUgdm9pZCAqaW9fYWRkciwgc2l6ZV90IHNpemUgKSB7CisJRUZJX0NQVV9JT19QUk9UT0NPTF9JT19NRU0gcmVhZDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGF0YSA9IDA7CisJRUZJX1NUQVRVUyBlZmlyYzsKKworCXJlYWQgPSAoIElTX1BPUlRfQUREUkVTUyAoIGlvX2FkZHIgKSA/CisJCSBjcHVfaW8tPklvLlJlYWQgOiBjcHVfaW8tPk1lbS5SZWFkICk7CisKKwlpZiAoICggZWZpcmMgPSByZWFkICggY3B1X2lvLCBlZmlfd2lkdGggKCBzaXplICksCisJCQkgICAgICAoIGludHB0cl90ICkgaW9fYWRkciwgMSwKKwkJCSAgICAgICggdm9pZCAqICkgJmRhdGEgKSApICE9IDAgKSB7CisJCURCRyAoICJFRkkgSS9PIHJlYWQgYXQgJXAgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgaW9fYWRkciwgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQlyZXR1cm4gLTFVTEw7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qKgorICogV3JpdGUgdG8gZGV2aWNlCisgKgorICogQHYgZGF0YQkJVmFsdWUgdG8gd3JpdGUKKyAqIEB2IGlvX2FkZHIJCUkvTyBhZGRyZXNzCisgKiBAdiBzaXplCQlTaXplIG9mIHZhbHVlCisgKi8KK3ZvaWQgZWZpX2lvd3JpdGUgKCB1bnNpZ25lZCBsb25nIGxvbmcgZGF0YSwgdm9sYXRpbGUgdm9pZCAqaW9fYWRkciwKKwkJICAgc2l6ZV90IHNpemUgKSB7CisJRUZJX0NQVV9JT19QUk9UT0NPTF9JT19NRU0gd3JpdGU7CisJRUZJX1NUQVRVUyBlZmlyYzsKKworCXdyaXRlID0gKCBJU19QT1JUX0FERFJFU1MgKCBpb19hZGRyICkgPworCQkgIGNwdV9pby0+SW8uV3JpdGUgOiBjcHVfaW8tPk1lbS5Xcml0ZSApOworCisJaWYgKCAoIGVmaXJjID0gd3JpdGUgKCBjcHVfaW8sIGVmaV93aWR0aCAoIHNpemUgKSwKKwkJCSAgICAgICAoIGludHB0cl90ICkgaW9fYWRkciwgMSwKKwkJCSAgICAgICAoIHZvaWQgKiApICZkYXRhICkgKSAhPSAwICkgeworCQlEQkcgKCAiRUZJIEkvTyB3cml0ZSBhdCAlcCBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICBpb19hZGRyLCBlZmlfc3RyZXJyb3IgKCBlZmlyYyApICk7CisJfQorfQorCisvKioKKyAqIFN0cmluZyByZWFkIGZyb20gZGV2aWNlCisgKgorICogQHYgaW9fYWRkcgkJSS9PIGFkZHJlc3MKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBzaXplCQlTaXplIG9mIHZhbHVlcworICogQHYgY291bnQJCU51bWJlciBvZiB2YWx1ZXMgdG8gcmVhZAorICovCit2b2lkIGVmaV9pb3JlYWRzICggdm9sYXRpbGUgdm9pZCAqaW9fYWRkciwgdm9pZCAqZGF0YSwKKwkJICAgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBjb3VudCApIHsKKwlFRklfQ1BVX0lPX1BST1RPQ09MX0lPX01FTSByZWFkOworCUVGSV9TVEFUVVMgZWZpcmM7CisKKwlyZWFkID0gKCBJU19QT1JUX0FERFJFU1MgKCBpb19hZGRyICkgPworCQkgY3B1X2lvLT5Jby5SZWFkIDogY3B1X2lvLT5NZW0uUmVhZCApOworCisJaWYgKCAoIGVmaXJjID0gcmVhZCAoIGNwdV9pbywgZWZpX3dpZHRoICggc2l6ZSApLAorCQkJICAgICAgKCBpbnRwdHJfdCApIGlvX2FkZHIsIGNvdW50LAorCQkJICAgICAgKCB2b2lkICogKSBkYXRhICkgKSAhPSAwICkgeworCQlEQkcgKCAiRUZJIEkvTyBzdHJpbmcgcmVhZCBhdCAlcCBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICBpb19hZGRyLCBlZmlfc3RyZXJyb3IgKCBlZmlyYyApICk7CisJfQorfQorCisvKioKKyAqIFN0cmluZyB3cml0ZSB0byBkZXZpY2UKKyAqCisgKiBAdiBpb19hZGRyCQlJL08gYWRkcmVzcworICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEB2IHNpemUJCVNpemUgb2YgdmFsdWVzCisgKiBAdiBjb3VudAkJTnVtYmVyIG9mIHZhbHVlcyB0byB3cml0ZQorICovCit2b2lkIGVmaV9pb3dyaXRlcyAoIHZvbGF0aWxlIHZvaWQgKmlvX2FkZHIsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IGNvdW50ICkgeworCUVGSV9DUFVfSU9fUFJPVE9DT0xfSU9fTUVNIHdyaXRlOworCUVGSV9TVEFUVVMgZWZpcmM7CisKKwl3cml0ZSA9ICggSVNfUE9SVF9BRERSRVNTICggaW9fYWRkciApID8KKwkJIGNwdV9pby0+SW8uV3JpdGUgOiBjcHVfaW8tPk1lbS5Xcml0ZSApOworCisJaWYgKCAoIGVmaXJjID0gd3JpdGUgKCBjcHVfaW8sIGVmaV93aWR0aCAoIHNpemUgKSwKKwkJCSAgICAgICAoIGludHB0cl90ICkgaW9fYWRkciwgY291bnQsCisJCQkgICAgICAgKCB2b2lkICogKSBkYXRhICkgKSAhPSAwICkgeworCQlEQkcgKCAiRUZJIEkvTyB3cml0ZSBhdCAlcCBmYWlsZWQ6ICVzXG4iLAorCQkgICAgICBpb19hZGRyLCBlZmlfc3RyZXJyb3IgKCBlZmlyYyApICk7CisJfQorfQorCisvKioKKyAqIFdhaXQgZm9yIEkvTy1tYXBwZWQgb3BlcmF0aW9uIHRvIGNvbXBsZXRlCisgKgorICovCitzdGF0aWMgdm9pZCBlZmlfaW9kZWxheSAoIHZvaWQgKSB7CisJLyogV3JpdGUgdG8gbm9uLWV4aXN0ZW50IHBvcnQuICBQcm9iYWJseSB4ODYtb25seS4gKi8KKwlvdXRiICggMCwgMHg4MCApOworfQorCitQUk9WSURFX0lPQVBJX0lOTElORSAoIGVmaSwgcGh5c190b19idXMgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCBidXNfdG9fcGh5cyApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCBlZmksIGlvcmVtYXAgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCBpb3VubWFwICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIGVmaSwgaW9fdG9fYnVzICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIGVmaSwgcmVhZGIgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCByZWFkdyApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCBlZmksIHJlYWRsICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIGVmaSwgcmVhZHEgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCB3cml0ZWIgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCB3cml0ZXcgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCB3cml0ZWwgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCB3cml0ZXEgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCBpbmIgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCBpbncgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCBpbmwgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCBvdXRiICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIGVmaSwgb3V0dyApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCBlZmksIG91dGwgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCBpbnNiICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIGVmaSwgaW5zdyApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCBlZmksIGluc2wgKTsKK1BST1ZJREVfSU9BUElfSU5MSU5FICggZWZpLCBvdXRzYiApOworUFJPVklERV9JT0FQSV9JTkxJTkUgKCBlZmksIG91dHN3ICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIGVmaSwgb3V0c2wgKTsKK1BST1ZJREVfSU9BUEkgKCBlZmksIGlvZGVsYXksIGVmaV9pb2RlbGF5ICk7CitQUk9WSURFX0lPQVBJX0lOTElORSAoIGVmaSwgbWIgKTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2ludGVyZmFjZS9lZmkvZWZpX3BjaS5jIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0MzM5MQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2ludGVyZmFjZS9lZmkvZWZpX3BjaS5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvZWZpLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvUHJvdG9jb2wvUGNpUm9vdEJyaWRnZUlvLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIGdQWEUgUENJIEkvTyBBUEkgZm9yIEVGSQorICoKKyAqLworCisvKiogUENJIHJvb3QgYnJpZGdlIEkvTyBwcm90b2NvbCAqLworc3RhdGljIEVGSV9QQ0lfUk9PVF9CUklER0VfSU9fUFJPVE9DT0wgKmVmaXBjaTsKK0VGSV9SRVFVSVJFX1BST1RPQ09MICggRUZJX1BDSV9ST09UX0JSSURHRV9JT19QUk9UT0NPTCwgJmVmaXBjaSApOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlZmlwY2lfYWRkcmVzcyAoIHN0cnVjdCBwY2lfZGV2aWNlICpwY2ksCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb2NhdGlvbiApIHsKKwlyZXR1cm4gRUZJX1BDSV9BRERSRVNTICggcGNpLT5idXMsIFBDSV9TTE9UICggcGNpLT5kZXZmbiApLAorCQkJCSBQQ0lfRlVOQyAoIHBjaS0+ZGV2Zm4gKSwKKwkJCQkgRUZJUENJX09GRlNFVCAoIGxvY2F0aW9uICkgKTsKK30KKworaW50IGVmaXBjaV9yZWFkICggc3RydWN0IHBjaV9kZXZpY2UgKnBjaSwgdW5zaWduZWQgbG9uZyBsb2NhdGlvbiwKKwkJICB2b2lkICp2YWx1ZSApIHsKKwlFRklfU1RBVFVTIGVmaXJjOworCisJaWYgKCAoIGVmaXJjID0gZWZpcGNpLT5QY2kuUmVhZCAoIGVmaXBjaSwgRUZJUENJX1dJRFRIICggbG9jYXRpb24gKSwKKwkJCQkJICBlZmlwY2lfYWRkcmVzcyAoIHBjaSwgbG9jYXRpb24gKSwgMSwKKwkJCQkJICB2YWx1ZSApICkgIT0gMCApIHsKKwkJREJHICggIkVGSVBDSSBjb25maWcgcmVhZCBmcm9tICUwMng6JTAyeC4leCBvZmZzZXQgJTAybHggIgorCQkgICAgICAiZmFpbGVkOiAlc1xuIiwgcGNpLT5idXMsIFBDSV9TTE9UICggcGNpLT5kZXZmbiApLAorCQkgICAgICBQQ0lfRlVOQyAoIHBjaS0+ZGV2Zm4gKSwgRUZJUENJX09GRlNFVCAoIGxvY2F0aW9uICksCisJCSAgICAgIGVmaV9zdHJlcnJvciAoIGVmaXJjICkgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBlZmlwY2lfd3JpdGUgKCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpLCB1bnNpZ25lZCBsb25nIGxvY2F0aW9uLAorCQkgICB1bnNpZ25lZCBsb25nIHZhbHVlICkgeworCUVGSV9TVEFUVVMgZWZpcmM7CisKKwlpZiAoICggZWZpcmMgPSBlZmlwY2ktPlBjaS5Xcml0ZSAoIGVmaXBjaSwgRUZJUENJX1dJRFRIICggbG9jYXRpb24gKSwKKwkJCQkJICAgZWZpcGNpX2FkZHJlc3MgKCBwY2ksIGxvY2F0aW9uICksIDEsCisJCQkJCSAgICZ2YWx1ZSApICkgIT0gMCApIHsKKwkJREJHICggIkVGSVBDSSBjb25maWcgd3JpdGUgdG8gJTAyeDolMDJ4LiV4IG9mZnNldCAlMDJseCAiCisJCSAgICAgICJmYWlsZWQ6ICVzXG4iLCBwY2ktPmJ1cywgUENJX1NMT1QgKCBwY2ktPmRldmZuICksCisJCSAgICAgIFBDSV9GVU5DICggcGNpLT5kZXZmbiApLCBFRklQQ0lfT0ZGU0VUICggbG9jYXRpb24gKSwKKwkJICAgICAgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworUFJPVklERV9QQ0lBUElfSU5MSU5FICggZWZpLCBwY2lfbWF4X2J1cyApOworUFJPVklERV9QQ0lBUElfSU5MSU5FICggZWZpLCBwY2lfcmVhZF9jb25maWdfYnl0ZSApOworUFJPVklERV9QQ0lBUElfSU5MSU5FICggZWZpLCBwY2lfcmVhZF9jb25maWdfd29yZCApOworUFJPVklERV9QQ0lBUElfSU5MSU5FICggZWZpLCBwY2lfcmVhZF9jb25maWdfZHdvcmQgKTsKK1BST1ZJREVfUENJQVBJX0lOTElORSAoIGVmaSwgcGNpX3dyaXRlX2NvbmZpZ19ieXRlICk7CitQUk9WSURFX1BDSUFQSV9JTkxJTkUgKCBlZmksIHBjaV93cml0ZV9jb25maWdfd29yZCApOworUFJPVklERV9QQ0lBUElfSU5MSU5FICggZWZpLCBwY2lfd3JpdGVfY29uZmlnX2R3b3JkICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV9zbWJpb3MuYyBiL2dweGUvc3JjL2ludGVyZmFjZS9lZmkvZWZpX3NtYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYWY2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV9zbWJpb3MuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL3NtYmlvcy5oPgorI2luY2x1ZGUgPGdweGUvZWZpL2VmaS5oPgorI2luY2x1ZGUgPGdweGUvZWZpL0d1aWQvU21CaW9zLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIGdQWEUgU01CSU9TIEFQSSBmb3IgRUZJCisgKgorICovCisKKy8qKiBTTUJJT1MgY29uZmlndXJhdGlvbiB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBzbWJpb3NfZW50cnkgKnNtYmlvc19lbnRyeTsKK0VGSV9VU0VfVEFCTEUgKCBFRklfU01CSU9TX1RBQkxFLCAmc21iaW9zX2VudHJ5LCAwICk7CisKKy8qKgorICogRmluZCBTTUJJT1MKKyAqCisgKiBAdiBzbWJpb3MJCVNNQklPUyBlbnRyeSBwb2ludCBkZXNjcmlwdG9yIHN0cnVjdHVyZSB0byBmaWxsIGluCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBlZmlfZmluZF9zbWJpb3MgKCBzdHJ1Y3Qgc21iaW9zICpzbWJpb3MgKSB7CisKKwlpZiAoICEgc21iaW9zX2VudHJ5ICkgeworCQlEQkcgKCAiTm8gU01CSU9TIHRhYmxlIHByb3ZpZGVkXG4iICk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICggc21iaW9zX2VudHJ5LT5zaWduYXR1cmUgIT0gU01CSU9TX1NJR05BVFVSRSApIHsKKwkJREJHICggIkludmFsaWQgU01CSU9TIHNpZ25hdHVyZVxuIiApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzbWJpb3MtPmFkZHJlc3MgPSBwaHlzX3RvX3VzZXIgKCBzbWJpb3NfZW50cnktPnNtYmlvc19hZGRyZXNzICk7CisJc21iaW9zLT5sZW4gPSBzbWJpb3NfZW50cnktPnNtYmlvc19sZW47CisJc21iaW9zLT5jb3VudCA9IHNtYmlvc19lbnRyeS0+c21iaW9zX2NvdW50OworCURCRyAoICJGb3VuZCBTTUJJT1MgdiVkLiVkIGVudHJ5IHBvaW50IGF0ICVwICgleCslengpXG4iLAorCSAgICAgIHNtYmlvc19lbnRyeS0+bWFqb3IsIHNtYmlvc19lbnRyeS0+bWlub3IsIHNtYmlvc19lbnRyeSwKKwkgICAgICBzbWJpb3NfZW50cnktPnNtYmlvc19hZGRyZXNzLCBzbWJpb3MtPmxlbiApOworCisJcmV0dXJuIDA7Cit9CisKK1BST1ZJREVfU01CSU9TICggZWZpLCBmaW5kX3NtYmlvcywgZWZpX2ZpbmRfc21iaW9zICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV9zbnAuYyBiL2dweGUvc3JjL2ludGVyZmFjZS9lZmkvZWZpX3NucC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjQxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV9zbnAuYwpAQCAtMCwwICsxLDExNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbi5oPgorI2luY2x1ZGUgPGdweGUvcGNpLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvZWZpLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvUHJvdG9jb2wvRHJpdmVyQmluZGluZy5oPgorI2luY2x1ZGUgPGdweGUvZWZpL1Byb3RvY29sL1BjaUlvLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvUHJvdG9jb2wvU2ltcGxlTmV0d29yay5oPgorI2luY2x1ZGUgPGdweGUvZWZpL1Byb3RvY29sL0NvbXBvbmVudE5hbWUyLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvUHJvdG9jb2wvTmV0d29ya0ludGVyZmFjZUlkZW50aWZpZXIuaD4KKyNpbmNsdWRlIDxjb25maWcvZ2VuZXJhbC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIEVGSSBTTlAgaW50ZXJmYWNlCisgKgorICovCisKKy8qKiBBbiBTTlAgZGV2aWNlICovCitzdHJ1Y3QgZWZpX3NucF9kZXZpY2UgeworCS8qKiBUaGUgdW5kZXJseWluZyBnUFhFIG5ldHdvcmsgZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwkvKiogRUZJIGRldmljZSBoYW5kbGUgKi8KKwlFRklfSEFORExFIGhhbmRsZTsKKwkvKiogVGhlIFNOUCBzdHJ1Y3R1cmUgaXRzZWxmICovCisJRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MIHNucDsKKwkvKiogVGhlIFNOUCAibW9kZSIgKHBhcmFtZXRlcnMpICovCisJRUZJX1NJTVBMRV9ORVRXT1JLX01PREUgbW9kZTsKKwkvKiogT3V0c3RhbmRpbmcgVFggcGFja2V0IGNvdW50ICh2aWEgImludGVycnVwdCBzdGF0dXMiKQorCSAqCisJICogVXNlZCBpbiBvcmRlciB0byBnZW5lcmF0ZSBUWCBjb21wbGV0aW9ucy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgdHhfY291bnRfaW50ZXJydXB0czsKKwkvKiogT3V0c3RhbmRpbmcgVFggcGFja2V0IGNvdW50ICh2aWEgInJlY3ljbGVkIHR4IGJ1ZmZlcnMiKQorCSAqCisJICogVXNlZCBpbiBvcmRlciB0byBnZW5lcmF0ZSBUWCBjb21wbGV0aW9ucy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgdHhfY291bnRfdHhidWZzOworCS8qKiBPdXRzdGFuZGluZyBSWCBwYWNrZXQgY291bnQgKHZpYSAiaW50ZXJydXB0IHN0YXR1cyIpICovCisJdW5zaWduZWQgaW50IHJ4X2NvdW50X2ludGVycnVwdHM7CisJLyoqIE91dHN0YW5kaW5nIFJYIHBhY2tldCBjb3VudCAodmlhIFdhaXRGb3JQYWNrZXQgZXZlbnQpICovCisJdW5zaWduZWQgaW50IHJ4X2NvdW50X2V2ZW50czsKKwkvKiogVGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlkZW50aWZpZXIgKi8KKwlFRklfTkVUV09SS19JTlRFUkZBQ0VfSURFTlRJRklFUl9QUk9UT0NPTCBuaWk7CisJLyoqIERldmljZSBuYW1lICovCisJd2NoYXJfdCBuYW1lWyBzaXplb2YgKCAoICggc3RydWN0IG5ldF9kZXZpY2UgKiApIE5VTEwgKS0+bmFtZSApIF07CisJLyoqIFRoZSBkZXZpY2UgcGF0aAorCSAqCisJICogVGhpcyBmaWVsZCBpcyB2YXJpYWJsZSBpbiBzaXplIGFuZCBtdXN0IGFwcGVhciBhdCB0aGUgZW5kCisJICogb2YgdGhlIHN0cnVjdHVyZS4KKwkgKi8KKwlFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgcGF0aDsKK307CisKKy8qKiBFRkkgc2ltcGxlIG5ldHdvcmsgcHJvdG9jb2wgR1VJRCAqLworc3RhdGljIEVGSV9HVUlEIGVmaV9zaW1wbGVfbmV0d29ya19wcm90b2NvbF9ndWlkCisJPSBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0xfR1VJRDsKKworLyoqIEVGSSBkcml2ZXIgYmluZGluZyBwcm90b2NvbCBHVUlEICovCitzdGF0aWMgRUZJX0dVSUQgZWZpX2RyaXZlcl9iaW5kaW5nX3Byb3RvY29sX2d1aWQKKwk9IEVGSV9EUklWRVJfQklORElOR19QUk9UT0NPTF9HVUlEOworCisvKiogRUZJIGNvbXBvbmVudCBuYW1lIHByb3RvY29sIEdVSUQgKi8KK3N0YXRpYyBFRklfR1VJRCBlZmlfY29tcG9uZW50X25hbWUyX3Byb3RvY29sX2d1aWQKKwk9IEVGSV9DT01QT05FTlRfTkFNRTJfUFJPVE9DT0xfR1VJRDsKKworLyoqIEVGSSBkZXZpY2UgcGF0aCBwcm90b2NvbCBHVUlEICovCitzdGF0aWMgRUZJX0dVSUQgZWZpX2RldmljZV9wYXRoX3Byb3RvY29sX2d1aWQKKwk9IEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTF9HVUlEOworCisvKiogRUZJIG5ldHdvcmsgaW50ZXJmYWNlIGlkZW50aWZpZXIgR1VJRCAqLworc3RhdGljIEVGSV9HVUlEIGVmaV9uaWlfcHJvdG9jb2xfZ3VpZAorCT0gRUZJX05FVFdPUktfSU5URVJGQUNFX0lERU5USUZJRVJfUFJPVE9DT0xfR1VJRDsKKworLyoqIEVGSSBuZXR3b3JrIGludGVyZmFjZSBpZGVudGlmaWVyIEdVSUQgKGV4dHJhIHNwZWNpYWwgdmVyc2lvbikgKi8KK3N0YXRpYyBFRklfR1VJRCBlZmlfbmlpMzFfcHJvdG9jb2xfZ3VpZCA9IHsKKwkvKiBBdCBzb21lIHBvaW50LCBpdCBzZWVtcyB0aGF0IHNvbWVvbmUgZGVjaWRlZCB0byBjaGFuZ2UgdGhlCisJICogR1VJRC4gIEN1cnJlbnQgRUZJIGJ1aWxkcyBpZ25vcmUgdGhlIG9sZGVyIEdVSUQsIG9sZGVyIEVGSQorCSAqIGJ1aWxkcyBpZ25vcmUgdGhlIG5ld2VyIEdVSUQsIHNvIHdlIGhhdmUgdG8gZXhwb3NlIGJvdGguCisJICovCisJMHgxQUNFRDU2NiwgMHg3NkVELCAweDQyMTgsCisJeyAweEJDLCAweDgxLCAweDc2LCAweDdGLCAweDFGLCAweDk3LCAweDdBLCAweDg5IH0KK307CisKKy8qKiBFRkkgUENJIEkvTyBwcm90b2NvbCBHVUlEICovCitzdGF0aWMgRUZJX0dVSUQgZWZpX3BjaV9pb19wcm90b2NvbF9ndWlkCisJPSBFRklfUENJX0lPX1BST1RPQ09MX0dVSUQ7CisKKy8qKgorICogU2V0IEVGSSBTTlAgbW9kZSBiYXNlZCBvbiBnUFhFIG5ldCBkZXZpY2UgcGFyYW1ldGVycworICoKKyAqIEB2IHNucAkJU05QIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZCBlZmlfc25wX3NldF9tb2RlICggc3RydWN0IGVmaV9zbnBfZGV2aWNlICpzbnBkZXYgKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHNucGRldi0+bmV0ZGV2OworCUVGSV9TSU1QTEVfTkVUV09SS19NT0RFICptb2RlID0gJnNucGRldi0+bW9kZTsKKwlzdHJ1Y3QgbGxfcHJvdG9jb2wgKmxsX3Byb3RvY29sID0gbmV0ZGV2LT5sbF9wcm90b2NvbDsKKwl1bnNpZ25lZCBpbnQgbGxfYWRkcl9sZW4gPSBsbF9wcm90b2NvbC0+bGxfYWRkcl9sZW47CisKKwltb2RlLT5Id0FkZHJlc3NTaXplID0gbGxfYWRkcl9sZW47CisJbW9kZS0+TWVkaWFIZWFkZXJTaXplID0gbGxfcHJvdG9jb2wtPmxsX2hlYWRlcl9sZW47CisJbW9kZS0+TWF4UGFja2V0U2l6ZSA9IG5ldGRldi0+bWF4X3BrdF9sZW47CisJbW9kZS0+UmVjZWl2ZUZpbHRlck1hc2sgPSAoIEVGSV9TSU1QTEVfTkVUV09SS19SRUNFSVZFX1VOSUNBU1QgfAorCQkJCSAgICBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9NVUxUSUNBU1QgfAorCQkJCSAgICBFRklfU0lNUExFX05FVFdPUktfUkVDRUlWRV9CUk9BRENBU1QgKTsKKwlhc3NlcnQgKCBsbF9hZGRyX2xlbiA8PSBzaXplb2YgKCBtb2RlLT5DdXJyZW50QWRkcmVzcyApICk7CisJbWVtY3B5ICggJm1vZGUtPkN1cnJlbnRBZGRyZXNzLCBuZXRkZXYtPmxsX2FkZHIsIGxsX2FkZHJfbGVuICk7CisJbWVtY3B5ICggJm1vZGUtPkJyb2FkY2FzdEFkZHJlc3MsIG5ldGRldi0+bGxfYnJvYWRjYXN0LCBsbF9hZGRyX2xlbiApOworCWxsX3Byb3RvY29sLT5pbml0X2FkZHIgKCBuZXRkZXYtPmh3X2FkZHIsICZtb2RlLT5QZXJtYW5lbnRBZGRyZXNzICk7CisJbW9kZS0+SWZUeXBlID0gbnRvaHMgKCBsbF9wcm90b2NvbC0+bGxfcHJvdG8gKTsKKwltb2RlLT5NYWNBZGRyZXNzQ2hhbmdlYWJsZSA9IFRSVUU7CisJbW9kZS0+TWVkaWFQcmVzZW50U3VwcG9ydGVkID0gVFJVRTsKKwltb2RlLT5NZWRpYVByZXNlbnQgPSAoIG5ldGRldl9saW5rX29rICggbmV0ZGV2ICkgPyBUUlVFIDogRkFMU0UgKTsKK30KKworLyoqCisgKiBQb2xsIG5ldCBkZXZpY2UgYW5kIGNvdW50IHJlY2VpdmVkIHBhY2tldHMKKyAqCisgKiBAdiBzbnBkZXYJCVNOUCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgZWZpX3NucF9wb2xsICggc3RydWN0IGVmaV9zbnBfZGV2aWNlICpzbnBkZXYgKSB7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisJdW5zaWduZWQgaW50IGJlZm9yZSA9IDA7CisJdW5zaWduZWQgaW50IGFmdGVyID0gMDsKKwl1bnNpZ25lZCBpbnQgYXJyaXZlZDsKKworCS8qIFdlIGhhdmUgdG8gcmVwb3J0IHBhY2tldCBhcnJpdmFscywgYW5kIHRoaXMgaXMgdGhlIGVhc2llc3QKKwkgKiB3YXkgdG8gZmFrZSBpdC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggaW9idWYsICZzbnBkZXYtPm5ldGRldi0+cnhfcXVldWUsIGxpc3QgKQorCQliZWZvcmUrKzsKKwluZXRkZXZfcG9sbCAoIHNucGRldi0+bmV0ZGV2ICk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIGlvYnVmLCAmc25wZGV2LT5uZXRkZXYtPnJ4X3F1ZXVlLCBsaXN0ICkKKwkJYWZ0ZXIrKzsKKwlhcnJpdmVkID0gKCBhZnRlciAtIGJlZm9yZSApOworCisJc25wZGV2LT5yeF9jb3VudF9pbnRlcnJ1cHRzICs9IGFycml2ZWQ7CisJc25wZGV2LT5yeF9jb3VudF9ldmVudHMgKz0gYXJyaXZlZDsKK30KKworLyoqCisgKiBDaGFuZ2UgU05QIHN0YXRlIGZyb20gInN0b3BwZWQiIHRvICJzdGFydGVkIgorICoKKyAqIEB2IHNucAkJU05QIGludGVyZmFjZQorICogQHJldCBlZmlyYwkJRUZJIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBFRklfU1RBVFVTIEVGSUFQSQorZWZpX3NucF9zdGFydCAoIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAqc25wICkgeworCXN0cnVjdCBlZmlfc25wX2RldmljZSAqc25wZGV2ID0KKwkJY29udGFpbmVyX29mICggc25wLCBzdHJ1Y3QgZWZpX3NucF9kZXZpY2UsIHNucCApOworCisJREJHQzIgKCBzbnBkZXYsICJTTlBERVYgJXAgU1RBUlRcbiIsIHNucGRldiApOworCisJc25wZGV2LT5tb2RlLlN0YXRlID0gRWZpU2ltcGxlTmV0d29ya1N0YXJ0ZWQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2hhbmdlIFNOUCBzdGF0ZSBmcm9tICJzdGFydGVkIiB0byAic3RvcHBlZCIKKyAqCisgKiBAdiBzbnAJCVNOUCBpbnRlcmZhY2UKKyAqIEByZXQgZWZpcmMJCUVGSSBzdGF0dXMgY29kZQorICovCitzdGF0aWMgRUZJX1NUQVRVUyBFRklBUEkKK2VmaV9zbnBfc3RvcCAoIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAqc25wICkgeworCXN0cnVjdCBlZmlfc25wX2RldmljZSAqc25wZGV2ID0KKwkJY29udGFpbmVyX29mICggc25wLCBzdHJ1Y3QgZWZpX3NucF9kZXZpY2UsIHNucCApOworCisJREJHQzIgKCBzbnBkZXYsICJTTlBERVYgJXAgU1RPUFxuIiwgc25wZGV2ICk7CisKKwlzbnBkZXYtPm1vZGUuU3RhdGUgPSBFZmlTaW1wbGVOZXR3b3JrU3RvcHBlZDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBPcGVuIHRoZSBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IHNucAkJU05QIGludGVyZmFjZQorICogQHYgZXh0cmFfcnhfYnVmc2l6ZQlFeHRyYSBSWCBidWZmZXIgc2l6ZSwgaW4gYnl0ZXMKKyAqIEB2IGV4dHJhX3R4X2J1ZnNpemUJRXh0cmEgVFggYnVmZmVyIHNpemUsIGluIGJ5dGVzCisgKiBAcmV0IGVmaXJjCQlFRkkgc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIEVGSV9TVEFUVVMgRUZJQVBJCitlZmlfc25wX2luaXRpYWxpemUgKCBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgKnNucCwKKwkJICAgICBVSU5UTiBleHRyYV9yeF9idWZzaXplLCBVSU5UTiBleHRyYV90eF9idWZzaXplICkgeworCXN0cnVjdCBlZmlfc25wX2RldmljZSAqc25wZGV2ID0KKwkJY29udGFpbmVyX29mICggc25wLCBzdHJ1Y3QgZWZpX3NucF9kZXZpY2UsIHNucCApOworCWludCByYzsKKworCURCR0MyICggc25wZGV2LCAiU05QREVWICVwIElOSVRJQUxJWkUgKCVsZCBleHRyYSBSWCwgJWxkIGV4dHJhIFRYKVxuIiwKKwkJc25wZGV2LCAoICggdW5zaWduZWQgbG9uZyApIGV4dHJhX3J4X2J1ZnNpemUgKSwKKwkJKCAoIHVuc2lnbmVkIGxvbmcgKSBleHRyYV90eF9idWZzaXplICkgKTsKKworCWlmICggKCByYyA9IG5ldGRldl9vcGVuICggc25wZGV2LT5uZXRkZXYgKSApICE9IDAgKSB7CisJCURCR0MgKCBzbnBkZXYsICJTTlBERVYgJXAgY291bGQgbm90IG9wZW4gJXM6ICVzXG4iLAorCQkgICAgICAgc25wZGV2LCBzbnBkZXYtPm5ldGRldi0+bmFtZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiBSQ19UT19FRklSQyAoIHJjICk7CisJfQorCisJc25wZGV2LT5tb2RlLlN0YXRlID0gRWZpU2ltcGxlTmV0d29ya0luaXRpYWxpemVkOworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlc2V0IHRoZSBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IHNucAkJU05QIGludGVyZmFjZQorICogQHYgZXh0X3ZlcmlmeQlFeHRlbmRlZCB2ZXJpZmljYXRpb24gcmVxdWlyZWQKKyAqIEByZXQgZWZpcmMJCUVGSSBzdGF0dXMgY29kZQorICovCitzdGF0aWMgRUZJX1NUQVRVUyBFRklBUEkKK2VmaV9zbnBfcmVzZXQgKCBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgKnNucCwgQk9PTEVBTiBleHRfdmVyaWZ5ICkgeworCXN0cnVjdCBlZmlfc25wX2RldmljZSAqc25wZGV2ID0KKwkJY29udGFpbmVyX29mICggc25wLCBzdHJ1Y3QgZWZpX3NucF9kZXZpY2UsIHNucCApOworCWludCByYzsKKworCURCR0MyICggc25wZGV2LCAiU05QREVWICVwIFJFU0VUICglcyBleHRlbmRlZCB2ZXJpZmljYXRpb24pXG4iLAorCQlzbnBkZXYsICggZXh0X3ZlcmlmeSA/ICJ3aXRoIiA6ICJ3aXRob3V0IiApICk7CisKKwluZXRkZXZfY2xvc2UgKCBzbnBkZXYtPm5ldGRldiApOworCXNucGRldi0+bW9kZS5TdGF0ZSA9IEVmaVNpbXBsZU5ldHdvcmtTdGFydGVkOworCisJaWYgKCAoIHJjID0gbmV0ZGV2X29wZW4gKCBzbnBkZXYtPm5ldGRldiApICkgIT0gMCApIHsKKwkJREJHQyAoIHNucGRldiwgIlNOUERFViAlcCBjb3VsZCBub3QgcmVvcGVuICVzOiAlc1xuIiwKKwkJICAgICAgIHNucGRldiwgc25wZGV2LT5uZXRkZXYtPm5hbWUsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gUkNfVE9fRUZJUkMgKCByYyApOworCX0KKworCXNucGRldi0+bW9kZS5TdGF0ZSA9IEVmaVNpbXBsZU5ldHdvcmtJbml0aWFsaXplZDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTaHV0IGRvd24gdGhlIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgc25wCQlTTlAgaW50ZXJmYWNlCisgKiBAcmV0IGVmaXJjCQlFRkkgc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIEVGSV9TVEFUVVMgRUZJQVBJCitlZmlfc25wX3NodXRkb3duICggRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICpzbnAgKSB7CisJc3RydWN0IGVmaV9zbnBfZGV2aWNlICpzbnBkZXYgPQorCQljb250YWluZXJfb2YgKCBzbnAsIHN0cnVjdCBlZmlfc25wX2RldmljZSwgc25wICk7CisKKwlEQkdDMiAoIHNucGRldiwgIlNOUERFViAlcCBTSFVURE9XTlxuIiwgc25wZGV2ICk7CisKKwluZXRkZXZfY2xvc2UgKCBzbnBkZXYtPm5ldGRldiApOworCXNucGRldi0+bW9kZS5TdGF0ZSA9IEVmaVNpbXBsZU5ldHdvcmtTdGFydGVkOworCXJldHVybiAwOworfQorCisvKioKKyAqIE1hbmFnZSByZWNlaXZlIGZpbHRlcnMKKyAqCisgKiBAdiBzbnAJCVNOUCBpbnRlcmZhY2UKKyAqIEB2IGVuYWJsZQkJUmVjZWl2ZSBmaWx0ZXJzIHRvIGVuYWJsZQorICogQHYgZGlzYWJsZQkJUmVjZWl2ZSBmaWx0ZXJzIHRvIGRpc2FibGUKKyAqIEB2IG1jYXN0X3Jlc2V0CVJlc2V0IG11bHRpY2FzdCBmaWx0ZXJzCisgKiBAdiBtY2FzdF9jb3VudAlOdW1iZXIgb2YgbXVsdGljYXN0IGZpbHRlcnMKKyAqIEB2IG1jYXN0CQlNdWx0aWNhc3QgZmlsdGVycworICogQHJldCBlZmlyYwkJRUZJIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBFRklfU1RBVFVTIEVGSUFQSQorZWZpX3NucF9yZWNlaXZlX2ZpbHRlcnMgKCBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgKnNucCwgVUlOVDMyIGVuYWJsZSwKKwkJCSAgVUlOVDMyIGRpc2FibGUsIEJPT0xFQU4gbWNhc3RfcmVzZXQsCisJCQkgIFVJTlROIG1jYXN0X2NvdW50LCBFRklfTUFDX0FERFJFU1MgKm1jYXN0ICkgeworCXN0cnVjdCBlZmlfc25wX2RldmljZSAqc25wZGV2ID0KKwkJY29udGFpbmVyX29mICggc25wLCBzdHJ1Y3QgZWZpX3NucF9kZXZpY2UsIHNucCApOworCXVuc2lnbmVkIGludCBpOworCisJREJHQzIgKCBzbnBkZXYsICJTTlBERVYgJXAgUkVDRUlWRV9GSUxURVJTICUwOHgmfiUwOHglcyAlbGQgbWNhc3RcbiIsCisJCXNucGRldiwgZW5hYmxlLCBkaXNhYmxlLCAoIG1jYXN0X3Jlc2V0ID8gIiByZXNldCIgOiAiIiApLAorCQkoICggdW5zaWduZWQgbG9uZyApIG1jYXN0X2NvdW50ICkgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBtY2FzdF9jb3VudCA7IGkrKyApIHsKKwkJREJHQzJfSERBICggc25wZGV2LCBpLCAmbWNhc3RbaV0sCisJCQkgICAgc25wZGV2LT5uZXRkZXYtPmxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApOworCX0KKworCS8qIExpZSB0aHJvdWdoIG91ciB0ZWV0aCwgb3RoZXJ3aXNlIE1OUCByZWZ1c2VzIHRvIGFjY2VwdCB1cyAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIFNldCBzdGF0aW9uIGFkZHJlc3MKKyAqCisgKiBAdiBzbnAJCVNOUCBpbnRlcmZhY2UKKyAqIEB2IHJlc2V0CQlSZXNldCB0byBwZXJtYW5lbnQgYWRkcmVzcworICogQHYgbmV3CQlOZXcgc3RhdGlvbiBhZGRyZXNzCisgKiBAcmV0IGVmaXJjCQlFRkkgc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIEVGSV9TVEFUVVMgRUZJQVBJCitlZmlfc25wX3N0YXRpb25fYWRkcmVzcyAoIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAqc25wLCBCT09MRUFOIHJlc2V0LAorCQkJICBFRklfTUFDX0FERFJFU1MgKm5ldyApIHsKKwlzdHJ1Y3QgZWZpX3NucF9kZXZpY2UgKnNucGRldiA9CisJCWNvbnRhaW5lcl9vZiAoIHNucCwgc3RydWN0IGVmaV9zbnBfZGV2aWNlLCBzbnAgKTsKKwlzdHJ1Y3QgbGxfcHJvdG9jb2wgKmxsX3Byb3RvY29sID0gc25wZGV2LT5uZXRkZXYtPmxsX3Byb3RvY29sOworCisJREJHQzIgKCBzbnBkZXYsICJTTlBERVYgJXAgU1RBVElPTl9BRERSRVNTICVzXG4iLCBzbnBkZXYsCisJCSggcmVzZXQgPyAicmVzZXQiIDogbGxfcHJvdG9jb2wtPm50b2EgKCBuZXcgKSApICk7CisKKwkvKiBTZXQgdGhlIE1BQyBhZGRyZXNzICovCisJaWYgKCByZXNldCApCisJCW5ldyA9ICZzbnBkZXYtPm1vZGUuUGVybWFuZW50QWRkcmVzczsKKwltZW1jcHkgKCBzbnBkZXYtPm5ldGRldi0+bGxfYWRkciwgbmV3LCBsbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4gKTsKKworCS8qIE1BQyBhZGRyZXNzIGNoYW5nZXMgdGFrZSBlZmZlY3Qgb25seSBvbiBuZXRkZXZfb3BlbigpICovCisJaWYgKCBzbnBkZXYtPm5ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApIHsKKwkJREJHQyAoIHNucGRldiwgIlNOUERFViAlcCBNQUMgYWRkcmVzcyBjaGFuZ2VkIHdoaWxlIG5ldCAiCisJCSAgICAgICAiZGV2aXZlIG9wZW5cbiIsIHNucGRldiApOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCAob3IgcmVzZXQpIHN0YXRpc3RpY3MKKyAqCisgKiBAdiBzbnAJCVNOUCBpbnRlcmZhY2UKKyAqIEB2IHJlc2V0CQlSZXNldCBzdGF0aXN0aWNzCisgKiBAdiBzdGF0c19sZW4JCVNpemUgb2Ygc3RhdGlzdGljcyB0YWJsZQorICogQHYgc3RhdHMJCVN0YXRpc3RpY3MgdGFibGUKKyAqIEByZXQgZWZpcmMJCUVGSSBzdGF0dXMgY29kZQorICovCitzdGF0aWMgRUZJX1NUQVRVUyBFRklBUEkKK2VmaV9zbnBfc3RhdGlzdGljcyAoIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAqc25wLCBCT09MRUFOIHJlc2V0LAorCQkgICAgIFVJTlROICpzdGF0c19sZW4sIEVGSV9ORVRXT1JLX1NUQVRJU1RJQ1MgKnN0YXRzICkgeworCXN0cnVjdCBlZmlfc25wX2RldmljZSAqc25wZGV2ID0KKwkJY29udGFpbmVyX29mICggc25wLCBzdHJ1Y3QgZWZpX3NucF9kZXZpY2UsIHNucCApOworCUVGSV9ORVRXT1JLX1NUQVRJU1RJQ1Mgc3RhdHNfYnVmOworCisJREJHQzIgKCBzbnBkZXYsICJTTlBERVYgJXAgU1RBVElTVElDUyVzIiwgc25wZGV2LAorCQkoIHJlc2V0ID8gIiByZXNldCIgOiAiIiApICk7CisKKwkvKiBHYXRoZXIgc3RhdGlzdGljcyAqLworCW1lbXNldCAoICZzdGF0c19idWYsIDAsIHNpemVvZiAoIHN0YXRzX2J1ZiApICk7CisJc3RhdHNfYnVmLlR4R29vZEZyYW1lcyA9IHNucGRldi0+bmV0ZGV2LT50eF9zdGF0cy5nb29kOworCXN0YXRzX2J1Zi5UeERyb3BwZWRGcmFtZXMgPSBzbnBkZXYtPm5ldGRldi0+dHhfc3RhdHMuYmFkOworCXN0YXRzX2J1Zi5UeFRvdGFsRnJhbWVzID0gKCBzbnBkZXYtPm5ldGRldi0+dHhfc3RhdHMuZ29vZCArCisJCQkJICAgIHNucGRldi0+bmV0ZGV2LT50eF9zdGF0cy5iYWQgKTsKKwlzdGF0c19idWYuUnhHb29kRnJhbWVzID0gc25wZGV2LT5uZXRkZXYtPnJ4X3N0YXRzLmdvb2Q7CisJc3RhdHNfYnVmLlJ4RHJvcHBlZEZyYW1lcyA9IHNucGRldi0+bmV0ZGV2LT5yeF9zdGF0cy5iYWQ7CisJc3RhdHNfYnVmLlJ4VG90YWxGcmFtZXMgPSAoIHNucGRldi0+bmV0ZGV2LT5yeF9zdGF0cy5nb29kICsKKwkJCQkgICAgc25wZGV2LT5uZXRkZXYtPnJ4X3N0YXRzLmJhZCApOworCWlmICggKnN0YXRzX2xlbiA+IHNpemVvZiAoIHN0YXRzX2J1ZiApICkKKwkJKnN0YXRzX2xlbiA9IHNpemVvZiAoIHN0YXRzX2J1ZiApOworCWlmICggc3RhdHMgKQorCQltZW1jcHkgKCBzdGF0cywgJnN0YXRzX2J1ZiwgKnN0YXRzX2xlbiApOworCisJLyogUmVzZXQgc3RhdGlzdGljcyBpZiByZXF1ZXN0ZWQgdG8gZG8gc28gKi8KKwlpZiAoIHJlc2V0ICkgeworCQltZW1zZXQgKCAmc25wZGV2LT5uZXRkZXYtPnR4X3N0YXRzLCAwLAorCQkJIHNpemVvZiAoIHNucGRldi0+bmV0ZGV2LT50eF9zdGF0cyApICk7CisJCW1lbXNldCAoICZzbnBkZXYtPm5ldGRldi0+cnhfc3RhdHMsIDAsCisJCQkgc2l6ZW9mICggc25wZGV2LT5uZXRkZXYtPnJ4X3N0YXRzICkgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDb252ZXJ0IG11bHRpY2FzdCBJUCBhZGRyZXNzIHRvIE1BQyBhZGRyZXNzCisgKgorICogQHYgc25wCQlTTlAgaW50ZXJmYWNlCisgKiBAdiBpcHY2CQlBZGRyZXNzIGlzIElQdjYKKyAqIEB2IGlwCQlJUCBhZGRyZXNzCisgKiBAdiBtYWMJCU1BQyBhZGRyZXNzCisgKiBAcmV0IGVmaXJjCQlFRkkgc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIEVGSV9TVEFUVVMgRUZJQVBJCitlZmlfc25wX21jYXN0X2lwX3RvX21hYyAoIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAqc25wLCBCT09MRUFOIGlwdjYsCisJCQkgIEVGSV9JUF9BRERSRVNTICppcCwgRUZJX01BQ19BRERSRVNTICptYWMgKSB7CisJc3RydWN0IGVmaV9zbnBfZGV2aWNlICpzbnBkZXYgPQorCQljb250YWluZXJfb2YgKCBzbnAsIHN0cnVjdCBlZmlfc25wX2RldmljZSwgc25wICk7CisJc3RydWN0IGxsX3Byb3RvY29sICpsbF9wcm90b2NvbCA9IHNucGRldi0+bmV0ZGV2LT5sbF9wcm90b2NvbDsKKwljb25zdCBjaGFyICppcF9zdHI7CisJaW50IHJjOworCisJaXBfc3RyID0gKCBpcHY2ID8gIihJUHY2KSIgLyogRklYTUUgd2hlbiB3ZSBoYXZlIGluZXQ2X250b2EoKSAqLyA6CisJCSAgIGluZXRfbnRvYSAoICooICggc3RydWN0IGluX2FkZHIgKiApIGlwICkgKSApOworCURCR0MyICggc25wZGV2LCAiU05QREVWICVwIE1DQVNUX0lQX1RPX01BQyAlc1xuIiwgc25wZGV2LCBpcF9zdHIgKTsKKworCS8qIFRyeSB0byBoYXNoIHRoZSBhZGRyZXNzICovCisJaWYgKCAoIHJjID0gbGxfcHJvdG9jb2wtPm1jX2hhc2ggKCAoIGlwdjYgPyBBRl9JTkVUNiA6IEFGX0lORVQgKSwKKwkJCQkJICAgaXAsIG1hYyApICkgIT0gMCApIHsKKwkJREJHQyAoIHNucGRldiwgIlNOUERFViAlcCBjb3VsZCBub3QgaGFzaCAlczogJXNcbiIsCisJCSAgICAgICBzbnBkZXYsIGlwX3N0ciwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiBSQ19UT19FRklSQyAoIHJjICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBvciB3cml0ZSBub24tdm9sYXRpbGUgc3RvcmFnZQorICoKKyAqIEB2IHNucAkJU05QIGludGVyZmFjZQorICogQHYgcmVhZAkJT3BlcmF0aW9uIGlzIGEgcmVhZAorICogQHYgb2Zmc2V0CQlTdGFydGluZyBvZmZzZXQgd2l0aGluIE5WUkFNCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEByZXQgZWZpcmMJCUVGSSBzdGF0dXMgY29kZQorICovCitzdGF0aWMgRUZJX1NUQVRVUyBFRklBUEkKK2VmaV9zbnBfbnZkYXRhICggRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MICpzbnAsIEJPT0xFQU4gcmVhZCwKKwkJIFVJTlROIG9mZnNldCwgVUlOVE4gbGVuLCBWT0lEICpkYXRhICkgeworCXN0cnVjdCBlZmlfc25wX2RldmljZSAqc25wZGV2ID0KKwkJY29udGFpbmVyX29mICggc25wLCBzdHJ1Y3QgZWZpX3NucF9kZXZpY2UsIHNucCApOworCisJREJHQzIgKCBzbnBkZXYsICJTTlBERVYgJXAgTlZEQVRBICVzICVseCslbHhcbiIsIHNucGRldiwKKwkJKCByZWFkID8gInJlYWQiIDogIndyaXRlIiApLCAoICggdW5zaWduZWQgbG9uZyApIG9mZnNldCApLAorCQkoICggdW5zaWduZWQgbG9uZyApIGxlbiApICk7CisJaWYgKCAhIHJlYWQgKQorCQlEQkdDMl9IREEgKCBzbnBkZXYsIG9mZnNldCwgZGF0YSwgbGVuICk7CisKKwlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOworfQorCisvKioKKyAqIFJlYWQgaW50ZXJydXB0IHN0YXR1cyBhbmQgVFggcmVjeWNsZWQgYnVmZmVyIHN0YXR1cworICoKKyAqIEB2IHNucAkJU05QIGludGVyZmFjZQorICogQHYgaW50ZXJydXB0cwlJbnRlcnJ1cHQgc3RhdHVzLCBvciBOVUxMCisgKiBAdiB0eGJ1ZnMJCVJlY3ljbGVkIHRyYW5zbWl0IGJ1ZmZlciBhZGRyZXNzLCBvciBOVUxMCisgKiBAcmV0IGVmaXJjCQlFRkkgc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIEVGSV9TVEFUVVMgRUZJQVBJCitlZmlfc25wX2dldF9zdGF0dXMgKCBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgKnNucCwKKwkJICAgICBVSU5UMzIgKmludGVycnVwdHMsIFZPSUQgKip0eGJ1ZnMgKSB7CisJc3RydWN0IGVmaV9zbnBfZGV2aWNlICpzbnBkZXYgPQorCQljb250YWluZXJfb2YgKCBzbnAsIHN0cnVjdCBlZmlfc25wX2RldmljZSwgc25wICk7CisKKwlEQkdDMiAoIHNucGRldiwgIlNOUERFViAlcCBHRVRfU1RBVFVTIiwgc25wZGV2ICk7CisKKwkvKiBQb2xsIHRoZSBuZXR3b3JrIGRldmljZSAqLworCWVmaV9zbnBfcG9sbCAoIHNucGRldiApOworCisJLyogSW50ZXJydXB0IHN0YXR1cy4gIEluIHByYWN0aWNlLCB0aGlzIHNlZW1zIHRvIGJlIHVzZWQgb25seQorCSAqIHRvIGRldGVjdCBUWCBjb21wbGV0aW9ucy4KKwkgKi8KKwlpZiAoIGludGVycnVwdHMgKSB7CisJCSppbnRlcnJ1cHRzID0gMDsKKwkJLyogUmVwb3J0IFRYIGNvbXBsZXRpb25zIG9uY2UgcXVldWUgaXMgZW1wdHk7IHRoaXMKKwkJICogYXZvaWRzIGhhdmluZyB0byBhZGQgaG9va3MgaW4gdGhlIG5ldCBkZXZpY2UgbGF5ZXIuCisJCSAqLworCQlpZiAoIHNucGRldi0+dHhfY291bnRfaW50ZXJydXB0cyAmJgorCQkgICAgIGxpc3RfZW1wdHkgKCAmc25wZGV2LT5uZXRkZXYtPnR4X3F1ZXVlICkgKSB7CisJCQkqaW50ZXJydXB0cyB8PSBFRklfU0lNUExFX05FVFdPUktfVFJBTlNNSVRfSU5URVJSVVBUOworCQkJc25wZGV2LT50eF9jb3VudF9pbnRlcnJ1cHRzLS07CisJCX0KKwkJLyogUmVwb3J0IFJYICovCisJCWlmICggc25wZGV2LT5yeF9jb3VudF9pbnRlcnJ1cHRzICkgeworCQkJKmludGVycnVwdHMgfD0gRUZJX1NJTVBMRV9ORVRXT1JLX1JFQ0VJVkVfSU5URVJSVVBUOworCQkJc25wZGV2LT5yeF9jb3VudF9pbnRlcnJ1cHRzLS07CisJCX0KKwkJREJHQzIgKCBzbnBkZXYsICIgSU5UUzolMDJ4IiwgKmludGVycnVwdHMgKTsKKwl9CisKKwkvKiBUWCBjb21wbGV0aW9ucy4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGRlc2lnbiBhIG1vcmUKKwkgKiBpZGlvdGljIHNjaGVtZSBmb3IgdGhpcywgYnV0IGl0IHdvdWxkIGJlIGEgY2hhbGxlbmdlLgorCSAqIEFjY29yZGluZyB0byB0aGUgVUVGSSBoZWFkZXIgZmlsZSwgdHhidWZzIHdpbGwgYmUgZmlsbGVkIGluCisJICogd2l0aCBhIGxpc3Qgb2YgInJlY3ljbGVkIHRyYW5zbWl0IGJ1ZmZlcnMiIChpLmUuIGNvbXBsZXRlZAorCSAqIFRYIGJ1ZmZlcnMpLiAgT2JzZXJ2YW50IHJlYWRlcnMgbWF5IGNhcmUgdG8gbm90ZSB0aGF0CisJICogKnR4YnVmcyBpcyBhIHZvaWQgcG9pbnRlci4gIFByZWNpc2VseSBob3cgYSBsaXN0IG9mCisJICogY29tcGxldGVkIHRyYW5zbWl0IGJ1ZmZlcnMgaXMgbWVhbnQgdG8gYmUgcmVwcmVzZW50ZWQgYXMgYW4KKwkgKiBhcnJheSBvZiB2b2lkcyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLgorCSAqCisJICogVGhlIG9ubHkgdXNlcnMgb2YgdGhpcyBpbnRlcmZhY2UgKE1ucER4ZS9NbnBJby5jIGFuZAorCSAqIFB4ZUJjRHhlL0JjLmMgd2l0aGluIHRoZSBFRkkgZGV2IGtpdCkgYm90aCBqdXN0IHBvbGwgdW50aWwKKwkgKiBzZWVpbmcgYSBub24tTlVMTCByZXN1bHQgcmV0dXJuIGluIHR4YnVmcy4gIFRoaXMgaXMgdmFsaWQKKwkgKiBwcm92aWRlZCB0aGF0IHRoZXkgZG8gbm90IGV2ZXIgYXR0ZW1wdCB0byB0cmFuc21pdCBtb3JlCisJICogdGhhbiBvbmUgcGFja2V0IGNvbmN1cnJlbnRseSAoYW5kIHRoYXQgVFggbmV2ZXIgdGltZXMgb3V0KS4KKwkgKi8KKwlpZiAoIHR4YnVmcyApIHsKKwkJaWYgKCBzbnBkZXYtPnR4X2NvdW50X3R4YnVmcyAmJgorCQkgICAgIGxpc3RfZW1wdHkgKCAmc25wZGV2LT5uZXRkZXYtPnR4X3F1ZXVlICkgKSB7CisJCQkqdHhidWZzID0gIldoaWNoIGlkaW90IGRlc2lnbmVkIHRoaXMgQVBJPyI7CisJCQlzbnBkZXYtPnR4X2NvdW50X3R4YnVmcy0tOworCQl9IGVsc2UgeworCQkJKnR4YnVmcyA9IE5VTEw7CisJCX0KKwkJREJHQzIgKCBzbnBkZXYsICIgVFg6JXMiLCAoICp0eGJ1ZnMgPyAic29tZSIgOiAibm9uZSIgKSApOworCX0KKworCURCR0MyICggc25wZGV2LCAiXG4iICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU3RhcnQgcGFja2V0IHRyYW5zbWlzc2lvbgorICoKKyAqIEB2IHNucAkJU05QIGludGVyZmFjZQorICogQHYgbGxfaGVhZGVyX2xlbglMaW5rLWxheWVyIGhlYWRlciBsZW5ndGgsIGlmIHRvIGJlIGZpbGxlZCBpbgorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBsbF9zcmMJCUxpbmstbGF5ZXIgc291cmNlIGFkZHJlc3MsIGlmIHNwZWNpZmllZAorICogQHYgbGxfZGVzdAkJTGluay1sYXllciBkZXN0aW5hdGlvbiBhZGRyZXNzLCBpZiBzcGVjaWZpZWQKKyAqIEB2IG5ldF9wcm90bwkJTmV0d29yay1sYXllciBwcm90b2NvbCAoaW4gaG9zdCBvcmRlcikKKyAqIEByZXQgZWZpcmMJCUVGSSBzdGF0dXMgY29kZQorICovCitzdGF0aWMgRUZJX1NUQVRVUyBFRklBUEkKK2VmaV9zbnBfdHJhbnNtaXQgKCBFRklfU0lNUExFX05FVFdPUktfUFJPVE9DT0wgKnNucCwKKwkJICAgVUlOVE4gbGxfaGVhZGVyX2xlbiwgVUlOVE4gbGVuLCBWT0lEICpkYXRhLAorCQkgICBFRklfTUFDX0FERFJFU1MgKmxsX3NyYywgRUZJX01BQ19BRERSRVNTICpsbF9kZXN0LAorCQkgICBVSU5UMTYgKm5ldF9wcm90byApIHsKKwlzdHJ1Y3QgZWZpX3NucF9kZXZpY2UgKnNucGRldiA9CisJCWNvbnRhaW5lcl9vZiAoIHNucCwgc3RydWN0IGVmaV9zbnBfZGV2aWNlLCBzbnAgKTsKKwlzdHJ1Y3QgbGxfcHJvdG9jb2wgKmxsX3Byb3RvY29sID0gc25wZGV2LT5uZXRkZXYtPmxsX3Byb3RvY29sOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCWludCByYzsKKwlFRklfU1RBVFVTIGVmaXJjOworCisJREJHQzIgKCBzbnBkZXYsICJTTlBERVYgJXAgVFJBTlNNSVQgJXArJWx4Iiwgc25wZGV2LCBkYXRhLAorCQkoICggdW5zaWduZWQgbG9uZyApIGxlbiApICk7CisJaWYgKCBsbF9oZWFkZXJfbGVuICkgeworCQlpZiAoIGxsX3NyYyApIHsKKwkJCURCR0MyICggc25wZGV2LCAiIHNyYyAlcyIsCisJCQkJbGxfcHJvdG9jb2wtPm50b2EgKCBsbF9zcmMgKSApOworCQl9CisJCWlmICggbGxfZGVzdCApIHsKKwkJCURCR0MyICggc25wZGV2LCAiIGRlc3QgJXMiLAorCQkJCWxsX3Byb3RvY29sLT5udG9hICggbGxfZGVzdCApICk7CisJCX0KKwkJaWYgKCBuZXRfcHJvdG8gKSB7CisJCQlEQkdDMiAoIHNucGRldiwgIiBwcm90byAlMDR4IiwgKm5ldF9wcm90byApOworCQl9CisJfQorCURCR0MyICggc25wZGV2LCAiXG4iICk7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCBsbF9oZWFkZXJfbGVuICkgeworCQlpZiAoIGxsX2hlYWRlcl9sZW4gIT0gbGxfcHJvdG9jb2wtPmxsX2hlYWRlcl9sZW4gKSB7CisJCQlEQkdDICggc25wZGV2LCAiU05QREVWICVwIFRYIGludmFsaWQgaGVhZGVyIGxlbmd0aCAiCisJCQkgICAgICAgIiVsZFxuIiwgc25wZGV2LAorCQkJICAgICAgICggKCB1bnNpZ25lZCBsb25nICkgbGxfaGVhZGVyX2xlbiApICk7CisJCQllZmlyYyA9IEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKwkJCWdvdG8gZXJyX3Nhbml0eTsKKwkJfQorCQlpZiAoIGxlbiA8IGxsX2hlYWRlcl9sZW4gKSB7CisJCQlEQkdDICggc25wZGV2LCAiU05QREVWICVwIGludmFsaWQgcGFja2V0IGxlbmd0aCAlbGRcbiIsCisJCQkgICAgICAgc25wZGV2LCAoICggdW5zaWduZWQgbG9uZyApIGxlbiApICk7CisJCQllZmlyYyA9IEVGSV9CVUZGRVJfVE9PX1NNQUxMOworCQkJZ290byBlcnJfc2FuaXR5OworCQl9CisJCWlmICggISBsbF9kZXN0ICkgeworCQkJREJHQyAoIHNucGRldiwgIlNOUERFViAlcCBUWCBtaXNzaW5nIGRlc3RpbmF0aW9uICIKKwkJCSAgICAgICAiYWRkcmVzc1xuIiwgc25wZGV2ICk7CisJCQllZmlyYyA9IEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKwkJCWdvdG8gZXJyX3Nhbml0eTsKKwkJfQorCQlpZiAoICEgbmV0X3Byb3RvICkgeworCQkJREJHQyAoIHNucGRldiwgIlNOUERFViAlcCBUWCBtaXNzaW5nIG5ldHdvcmsgIgorCQkJICAgICAgICJwcm90b2NvbFxuIiwgc25wZGV2ICk7CisJCQllZmlyYyA9IEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKwkJCWdvdG8gZXJyX3Nhbml0eTsKKwkJfQorCQlpZiAoICEgbGxfc3JjICkKKwkJCWxsX3NyYyA9ICZzbnBkZXYtPm1vZGUuQ3VycmVudEFkZHJlc3M7CisJfQorCisJLyogQWxsb2NhdGUgYnVmZmVyICovCisJaW9idWYgPSBhbGxvY19pb2IgKCBsZW4gKTsKKwlpZiAoICEgaW9idWYgKSB7CisJCURCR0MgKCBzbnBkZXYsICJTTlBERVYgJXAgVFggY291bGQgbm90IGFsbG9jYXRlICVsZC1ieXRlICIKKwkJICAgICAgICJidWZmZXJcbiIsIHNucGRldiwgKCAoIHVuc2lnbmVkIGxvbmcgKSBsZW4gKSApOworCQllZmlyYyA9IEVGSV9ERVZJQ0VfRVJST1I7CisJCWdvdG8gZXJyX2FsbG9jX2lvYjsKKwl9CisJbWVtY3B5ICggaW9iX3B1dCAoIGlvYnVmLCBsZW4gKSwgZGF0YSwgbGVuICk7CisKKwkvKiBDcmVhdGUgbGluay1sYXllciBoZWFkZXIsIGlmIHNwZWNpZmllZCAqLworCWlmICggbGxfaGVhZGVyX2xlbiApIHsKKwkJaW9iX3B1bGwgKCBpb2J1ZiwgbGxfaGVhZGVyX2xlbiApOworCQlpZiAoICggcmMgPSBsbF9wcm90b2NvbC0+cHVzaCAoIHNucGRldi0+bmV0ZGV2LAorCQkJCQkJaW9idWYsIGxsX2Rlc3QsIGxsX3NyYywKKwkJCQkJCWh0b25zICggKm5ldF9wcm90byApICkpICE9IDAgKXsKKwkJCURCR0MgKCBzbnBkZXYsICJTTlBERVYgJXAgVFggY291bGQgbm90IGNvbnN0cnVjdCAiCisJCQkgICAgICAgImhlYWRlcjogJXNcbiIsIHNucGRldiwgc3RyZXJyb3IgKCByYyApICk7CisJCQllZmlyYyA9IFJDX1RPX0VGSVJDICggcmMgKTsKKwkJCWdvdG8gZXJyX2xsX3B1c2g7CisJCX0KKwl9CisKKwkvKiBUcmFuc21pdCBwYWNrZXQgKi8KKwlpZiAoICggcmMgPSBuZXRkZXZfdHggKCBzbnBkZXYtPm5ldGRldiwgaW9iX2Rpc293biAoIGlvYnVmICkgKSApICE9IDApeworCQlEQkdDICggc25wZGV2LCAiU05QREVWICVwIFRYIGNvdWxkIG5vdCB0cmFuc21pdDogJXNcbiIsCisJCSAgICAgICBzbnBkZXYsIHN0cmVycm9yICggcmMgKSApOworCQllZmlyYyA9IFJDX1RPX0VGSVJDICggcmMgKTsKKwkJZ290byBlcnJfdHg7CisJfQorCisJLyogUmVjb3JkIHRyYW5zbWlzc2lvbiBhcyBvdXRzdGFuZGluZyAqLworCXNucGRldi0+dHhfY291bnRfaW50ZXJydXB0cysrOworCXNucGRldi0+dHhfY291bnRfdHhidWZzKys7CisKKwlyZXR1cm4gMDsKKworIGVycl90eDoKKyBlcnJfbGxfcHVzaDoKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisgZXJyX2FsbG9jX2lvYjoKKyBlcnJfc2FuaXR5OgorCXJldHVybiBlZmlyYzsKK30KKworLyoqCisgKiBSZWNlaXZlIHBhY2tldAorICoKKyAqIEB2IHNucAkJU05QIGludGVyZmFjZQorICogQHYgbGxfaGVhZGVyX2xlbglMaW5rLWxheWVyIGhlYWRlciBsZW5ndGgsIGlmIHRvIGJlIGZpbGxlZCBpbgorICogQHYgbGVuCQlMZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBsbF9zcmMJCUxpbmstbGF5ZXIgc291cmNlIGFkZHJlc3MsIGlmIHNwZWNpZmllZAorICogQHYgbGxfZGVzdAkJTGluay1sYXllciBkZXN0aW5hdGlvbiBhZGRyZXNzLCBpZiBzcGVjaWZpZWQKKyAqIEB2IG5ldF9wcm90bwkJTmV0d29yay1sYXllciBwcm90b2NvbCAoaW4gaG9zdCBvcmRlcikKKyAqIEByZXQgZWZpcmMJCUVGSSBzdGF0dXMgY29kZQorICovCitzdGF0aWMgRUZJX1NUQVRVUyBFRklBUEkKK2VmaV9zbnBfcmVjZWl2ZSAoIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAqc25wLAorCQkgIFVJTlROICpsbF9oZWFkZXJfbGVuLCBVSU5UTiAqbGVuLCBWT0lEICpkYXRhLAorCQkgIEVGSV9NQUNfQUREUkVTUyAqbGxfc3JjLCBFRklfTUFDX0FERFJFU1MgKmxsX2Rlc3QsCisJCSAgVUlOVDE2ICpuZXRfcHJvdG8gKSB7CisJc3RydWN0IGVmaV9zbnBfZGV2aWNlICpzbnBkZXYgPQorCQljb250YWluZXJfb2YgKCBzbnAsIHN0cnVjdCBlZmlfc25wX2RldmljZSwgc25wICk7CisJc3RydWN0IGxsX3Byb3RvY29sICpsbF9wcm90b2NvbCA9IHNucGRldi0+bmV0ZGV2LT5sbF9wcm90b2NvbDsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwljb25zdCB2b2lkICppb2JfbGxfZGVzdDsKKwljb25zdCB2b2lkICppb2JfbGxfc3JjOworCXVpbnQxNl90IGlvYl9uZXRfcHJvdG87CisJaW50IHJjOworCUVGSV9TVEFUVVMgZWZpcmM7CisKKwlEQkdDMiAoIHNucGRldiwgIlNOUERFViAlcCBSRUNFSVZFICVwKCslbHgpIiwgc25wZGV2LCBkYXRhLAorCQkoICggdW5zaWduZWQgbG9uZyApICpsZW4gKSApOworCisJLyogUG9sbCB0aGUgbmV0d29yayBkZXZpY2UgKi8KKwllZmlfc25wX3BvbGwgKCBzbnBkZXYgKTsKKworCS8qIERlcXVldWUgYSBwYWNrZXQsIGlmIG9uZSBpcyBhdmFpbGFibGUgKi8KKwlpb2J1ZiA9IG5ldGRldl9yeF9kZXF1ZXVlICggc25wZGV2LT5uZXRkZXYgKTsKKwlpZiAoICEgaW9idWYgKSB7CisJCURCR0MyICggc25wZGV2LCAiXG4iICk7CisJCWVmaXJjID0gRUZJX05PVF9SRUFEWTsKKwkJZ290byBvdXRfbm9fcGFja2V0OworCX0KKwlEQkdDMiAoIHNucGRldiwgIislenhcbiIsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisKKwkvKiBSZXR1cm4gcGFja2V0IHRvIGNhbGxlciAqLworCW1lbWNweSAoIGRhdGEsIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSApOworCSpsZW4gPSBpb2JfbGVuICggaW9idWYgKTsKKworCS8qIEF0dGVtcHQgdG8gZGVjb2RlIGxpbmstbGF5ZXIgaGVhZGVyICovCisJaWYgKCAoIHJjID0gbGxfcHJvdG9jb2wtPnB1bGwgKCBzbnBkZXYtPm5ldGRldiwgaW9idWYsICZpb2JfbGxfZGVzdCwKKwkJCQkJJmlvYl9sbF9zcmMsICZpb2JfbmV0X3Byb3RvICkgKSAhPSAwICl7CisJCURCR0MgKCBzbnBkZXYsICJTTlBERVYgJXAgY291bGQgbm90IHBhcnNlIGhlYWRlcjogJXNcbiIsCisJCSAgICAgICBzbnBkZXYsIHN0cmVycm9yICggcmMgKSApOworCQllZmlyYyA9IFJDX1RPX0VGSVJDICggcmMgKTsKKwkJZ290byBvdXRfYmFkX2xsX2hlYWRlcjsKKwl9CisKKwkvKiBSZXR1cm4gbGluay1sYXllciBoZWFkZXIgcGFyYW1ldGVycyB0byBjYWxsZXIsIGlmIHJlcXVpcmVkICovCisJaWYgKCBsbF9oZWFkZXJfbGVuICkKKwkJKmxsX2hlYWRlcl9sZW4gPSBsbF9wcm90b2NvbC0+bGxfaGVhZGVyX2xlbjsKKwlpZiAoIGxsX3NyYyApCisJCW1lbWNweSAoIGxsX3NyYywgaW9iX2xsX3NyYywgbGxfcHJvdG9jb2wtPmxsX2FkZHJfbGVuICk7CisJaWYgKCBsbF9kZXN0ICkKKwkJbWVtY3B5ICggbGxfZGVzdCwgaW9iX2xsX2Rlc3QsIGxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApOworCWlmICggbmV0X3Byb3RvICkKKwkJKm5ldF9wcm90byA9IG50b2hzICggaW9iX25ldF9wcm90byApOworCisJZWZpcmMgPSAwOworCisgb3V0X2JhZF9sbF9oZWFkZXI6CisJZnJlZV9pb2IgKCBpb2J1ZiApOworb3V0X25vX3BhY2tldDoKKwlyZXR1cm4gZWZpcmM7Cit9CisKKy8qKgorICogUG9sbCBldmVudAorICoKKyAqIEB2IGV2ZW50CQlFdmVudAorICogQHYgY29udGV4dAkJRXZlbnQgY29udGV4dAorICovCitzdGF0aWMgVk9JRCBFRklBUEkgZWZpX3NucF93YWl0X2Zvcl9wYWNrZXQgKCBFRklfRVZFTlQgZXZlbnQsCisJCQkJCSAgICAgVk9JRCAqY29udGV4dCApIHsKKwlFRklfQk9PVF9TRVJWSUNFUyAqYnMgPSBlZmlfc3lzdGFiLT5Cb290U2VydmljZXM7CisJc3RydWN0IGVmaV9zbnBfZGV2aWNlICpzbnBkZXYgPSBjb250ZXh0OworCisJREJHQ1AgKCBzbnBkZXYsICJTTlBERVYgJXAgV0FJVF9GT1JfUEFDS0VUXG4iLCBzbnBkZXYgKTsKKworCS8qIERvIG5vdGhpbmcgdW5sZXNzIHRoZSBuZXQgZGV2aWNlIGlzIG9wZW4gKi8KKwlpZiAoICEgKCBzbnBkZXYtPm5ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApICkKKwkJcmV0dXJuOworCisJLyogUG9sbCB0aGUgbmV0d29yayBkZXZpY2UgKi8KKwllZmlfc25wX3BvbGwgKCBzbnBkZXYgKTsKKworCS8qIEZpcmUgZXZlbnQgaWYgcGFja2V0cyBoYXZlIGJlZW4gcmVjZWl2ZWQgKi8KKwlpZiAoIHNucGRldi0+cnhfY291bnRfZXZlbnRzICE9IDAgKSB7CisJCURCR0MyICggc25wZGV2LCAiU05QREVWICVwIGZpcmluZyBXYWl0Rm9yUGFja2V0IGV2ZW50XG4iLAorCQkJc25wZGV2ICk7CisJCWJzLT5TaWduYWxFdmVudCAoIGV2ZW50ICk7CisJCXNucGRldi0+cnhfY291bnRfZXZlbnRzLS07CisJfQorfQorCisvKiogU05QIGludGVyZmFjZSAqLworc3RhdGljIEVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCBlZmlfc25wX2RldmljZV9zbnAgPSB7CisJLlJldmlzaW9uCT0gRUZJX1NJTVBMRV9ORVRXT1JLX1BST1RPQ09MX1JFVklTSU9OLAorCS5TdGFydAkJPSBlZmlfc25wX3N0YXJ0LAorCS5TdG9wCQk9IGVmaV9zbnBfc3RvcCwKKwkuSW5pdGlhbGl6ZQk9IGVmaV9zbnBfaW5pdGlhbGl6ZSwKKwkuUmVzZXQJCT0gZWZpX3NucF9yZXNldCwKKwkuU2h1dGRvd24JPSBlZmlfc25wX3NodXRkb3duLAorCS5SZWNlaXZlRmlsdGVycwk9IGVmaV9zbnBfcmVjZWl2ZV9maWx0ZXJzLAorCS5TdGF0aW9uQWRkcmVzcwk9IGVmaV9zbnBfc3RhdGlvbl9hZGRyZXNzLAorCS5TdGF0aXN0aWNzCT0gZWZpX3NucF9zdGF0aXN0aWNzLAorCS5NQ2FzdElwVG9NYWMJPSBlZmlfc25wX21jYXN0X2lwX3RvX21hYywKKwkuTnZEYXRhCQk9IGVmaV9zbnBfbnZkYXRhLAorCS5HZXRTdGF0dXMJPSBlZmlfc25wX2dldF9zdGF0dXMsCisJLlRyYW5zbWl0CT0gZWZpX3NucF90cmFuc21pdCwKKwkuUmVjZWl2ZQk9IGVmaV9zbnBfcmVjZWl2ZSwKK307CisKKy8qKgorICogTG9jYXRlIG5ldCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byBFRkkgZGV2aWNlCisgKgorICogQHYgZHJpdmVyCQlFRkkgZHJpdmVyCisgKiBAdiBkZXZpY2UJCUVGSSBkZXZpY2UKKyAqIEByZXQgbmV0ZGV2CQlOZXQgZGV2aWNlLCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKgorZWZpX3NucF9uZXRkZXYgKCBFRklfRFJJVkVSX0JJTkRJTkdfUFJPVE9DT0wgKmRyaXZlciwgRUZJX0hBTkRMRSBkZXZpY2UgKSB7CisJRUZJX0JPT1RfU0VSVklDRVMgKmJzID0gZWZpX3N5c3RhYi0+Qm9vdFNlcnZpY2VzOworCXVuaW9uIHsKKwkJRUZJX1BDSV9JT19QUk9UT0NPTCAqcGNpOworCQl2b2lkICppbnRlcmZhY2U7CisJfSB1OworCVVJTlROIHBjaV9zZWdtZW50LCBwY2lfYnVzLCBwY2lfZGV2LCBwY2lfZm47CisJdW5zaWduZWQgaW50IHBjaV9idXNkZXZmbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKKwlFRklfU1RBVFVTIGVmaXJjOworCisJLyogU2VlIGlmIGRldmljZSBpcyBhIFBDSSBkZXZpY2UgKi8KKwlpZiAoICggZWZpcmMgPSBicy0+T3BlblByb3RvY29sICggZGV2aWNlLAorCQkJCQkgICZlZmlfcGNpX2lvX3Byb3RvY29sX2d1aWQsCisJCQkJCSAgJnUuaW50ZXJmYWNlLAorCQkJCQkgIGRyaXZlci0+RHJpdmVyQmluZGluZ0hhbmRsZSwKKwkJCQkJICBkZXZpY2UsCisJCQkJCSAgRUZJX09QRU5fUFJPVE9DT0xfQllfRFJJVkVSICkpICE9MCApeworCQlEQkdDUCAoIGRyaXZlciwgIlNOUERSViAlcCBkZXZpY2UgJXAgaXMgbm90IGEgUENJIGRldmljZVxuIiwKKwkJCWRyaXZlciwgZGV2aWNlICk7CisJCWdvdG8gb3V0X25vX3BjaV9pbzsKKwl9CisKKwkvKiBHZXQgUENJIGJ1czpkZXYuZm4gYWRkcmVzcyAqLworCWlmICggKCBlZmlyYyA9IHUucGNpLT5HZXRMb2NhdGlvbiAoIHUucGNpLCAmcGNpX3NlZ21lbnQsICZwY2lfYnVzLAorCQkJCQkgICAgJnBjaV9kZXYsICZwY2lfZm4gKSApICE9IDAgKSB7CisJCURCR0MgKCBkcml2ZXIsICJTTlBEUlYgJXAgZGV2aWNlICVwIGNvdWxkIG5vdCBnZXQgUENJICIKKwkJICAgICAgICJsb2NhdGlvbjogJXNcbiIsCisJCSAgICAgICBkcml2ZXIsIGRldmljZSwgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQlnb3RvIG91dF9ub19wY2lfbG9jYXRpb247CisJfQorCURCR0NQICggZHJpdmVyLCAiU05QRFJWICVwIGRldmljZSAlcCBpcyBQQ0kgJTA0bHg6JTAybHg6JTAybHguJWx4XG4iLAorCQlkcml2ZXIsIGRldmljZSwgKCAoIHVuc2lnbmVkIGxvbmcgKSBwY2lfc2VnbWVudCApLAorCQkoICggdW5zaWduZWQgbG9uZyApIHBjaV9idXMgKSwgKCAoIHVuc2lnbmVkIGxvbmcgKSBwY2lfZGV2ICksCisJCSggKCB1bnNpZ25lZCBsb25nICkgcGNpX2ZuICkgKTsKKworCS8qIExvb2sgdXAgY29ycmVzcG9uZGluZyBuZXR3b3JrIGRldmljZSAqLworCXBjaV9idXNkZXZmbiA9IFBDSV9CVVNERVZGTiAoIHBjaV9idXMsIFBDSV9ERVZGTiAoIHBjaV9kZXYsIHBjaV9mbiApICk7CisJaWYgKCAoIG5ldGRldiA9IGZpbmRfbmV0ZGV2X2J5X2xvY2F0aW9uICggQlVTX1RZUEVfUENJLAorCQkJCQkJICBwY2lfYnVzZGV2Zm4gKSApID09IE5VTEwgKSB7CisJCURCR0NQICggZHJpdmVyLCAiU05QRFJWICVwIGRldmljZSAlcCBpcyBub3QgYSBnUFhFIG5ldHdvcmsgIgorCQkJImRldmljZVxuIiwgZHJpdmVyLCBkZXZpY2UgKTsKKwkJZ290byBvdXRfbm9fbmV0ZGV2OworCX0KKwlEQkdDICggZHJpdmVyLCAiU05QRFJWICVwIGRldmljZSAlcCBpcyAlc1xuIiwKKwkgICAgICAgZHJpdmVyLCBkZXZpY2UsIG5ldGRldi0+bmFtZSApOworCisgb3V0X25vX25ldGRldjoKKyBvdXRfbm9fcGNpX2xvY2F0aW9uOgorCWJzLT5DbG9zZVByb3RvY29sICggZGV2aWNlLCAmZWZpX3BjaV9pb19wcm90b2NvbF9ndWlkLAorCQkJICAgIGRyaXZlci0+RHJpdmVyQmluZGluZ0hhbmRsZSwgZGV2aWNlICk7Cisgb3V0X25vX3BjaV9pbzoKKwlyZXR1cm4gbmV0ZGV2OworfQorCisvKioKKyAqIExvY2F0ZSBTTlAgY29ycmVzcG9uZGluZyB0byBFRkkgZGV2aWNlCisgKgorICogQHYgZHJpdmVyCQlFRkkgZHJpdmVyCisgKiBAdiBkZXZpY2UJCUVGSSBkZXZpY2UKKyAqIEByZXQgc25wCQlFRkkgU05QLCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgc3RydWN0IGVmaV9zbnBfZGV2aWNlICoKK2VmaV9zbnBfc25wZGV2ICggRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MICpkcml2ZXIsIEVGSV9IQU5ETEUgZGV2aWNlICkgeworCUVGSV9CT09UX1NFUlZJQ0VTICpicyA9IGVmaV9zeXN0YWItPkJvb3RTZXJ2aWNlczsKKwl1bmlvbiB7CisJCUVGSV9TSU1QTEVfTkVUV09SS19QUk9UT0NPTCAqc25wOworCQl2b2lkICppbnRlcmZhY2U7CisJfSB1OworCXN0cnVjdCBlZmlfc25wX2RldmljZSAqc25wZGV2ID0gTlVMTDsKKwlFRklfU1RBVFVTIGVmaXJjOworCisJaWYgKCAoIGVmaXJjID0gYnMtPk9wZW5Qcm90b2NvbCAoIGRldmljZSwKKwkJCQkJICAmZWZpX3NpbXBsZV9uZXR3b3JrX3Byb3RvY29sX2d1aWQsCisJCQkJCSAgJnUuaW50ZXJmYWNlLAorCQkJCQkgIGRyaXZlci0+RHJpdmVyQmluZGluZ0hhbmRsZSwKKwkJCQkJICBkZXZpY2UsCisJCQkJCSAgRUZJX09QRU5fUFJPVE9DT0xfR0VUX1BST1RPQ09MKSkhPTApeworCQlEQkdDICggZHJpdmVyLCAiU05QRFJWICVwIGRldmljZSAlcCBjb3VsZCBub3QgbG9jYXRlIFNOUDogIgorCQkgICAgICAgIiVzXG4iLCBkcml2ZXIsIGRldmljZSwgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQlnb3RvIGVycl9ub19zbnA7CisJfQorCisJc25wZGV2ID0gIGNvbnRhaW5lcl9vZiAoIHUuc25wLCBzdHJ1Y3QgZWZpX3NucF9kZXZpY2UsIHNucCApOworCURCR0NQICggZHJpdmVyLCAiU05QRFJWICVwIGRldmljZSAlcCBpcyBTTlBERVYgJXBcbiIsCisJCWRyaXZlciwgZGV2aWNlLCBzbnBkZXYgKTsKKworCWJzLT5DbG9zZVByb3RvY29sICggZGV2aWNlLCAmZWZpX3NpbXBsZV9uZXR3b3JrX3Byb3RvY29sX2d1aWQsCisJCQkgICAgZHJpdmVyLT5Ecml2ZXJCaW5kaW5nSGFuZGxlLCBkZXZpY2UgKTsKKyBlcnJfbm9fc25wOgorCXJldHVybiBzbnBkZXY7Cit9CisKKy8qKgorICogQ2hlY2sgdG8gc2VlIGlmIGRyaXZlciBzdXBwb3J0cyBhIGRldmljZQorICoKKyAqIEB2IGRyaXZlcgkJRUZJIGRyaXZlcgorICogQHYgZGV2aWNlCQlFRkkgZGV2aWNlCisgKiBAdiBjaGlsZAkJUGF0aCB0byBjaGlsZCBkZXZpY2UsIGlmIGFueQorICogQHJldCBlZmlyYwkJRUZJIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBFRklfU1RBVFVTIEVGSUFQSQorZWZpX3NucF9kcml2ZXJfc3VwcG9ydGVkICggRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MICpkcml2ZXIsCisJCQkgICBFRklfSEFORExFIGRldmljZSwKKwkJCSAgIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAqY2hpbGQgKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCURCR0NQICggZHJpdmVyLCAiU05QRFJWICVwIERSSVZFUl9TVVBQT1JURUQgJXAgKCVwKVxuIiwKKwkJZHJpdmVyLCBkZXZpY2UsIGNoaWxkICk7CisKKwluZXRkZXYgPSBlZmlfc25wX25ldGRldiAoIGRyaXZlciwgZGV2aWNlICk7CisJcmV0dXJuICggbmV0ZGV2ID8gMCA6IEVGSV9VTlNVUFBPUlRFRCApOworfQorCisvKioKKyAqIEF0dGFjaCBkcml2ZXIgdG8gZGV2aWNlCisgKgorICogQHYgZHJpdmVyCQlFRkkgZHJpdmVyCisgKiBAdiBkZXZpY2UJCUVGSSBkZXZpY2UKKyAqIEB2IGNoaWxkCQlQYXRoIHRvIGNoaWxkIGRldmljZSwgaWYgYW55CisgKiBAcmV0IGVmaXJjCQlFRkkgc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIEVGSV9TVEFUVVMgRUZJQVBJCitlZmlfc25wX2RyaXZlcl9zdGFydCAoIEVGSV9EUklWRVJfQklORElOR19QUk9UT0NPTCAqZHJpdmVyLAorCQkgICAgICAgRUZJX0hBTkRMRSBkZXZpY2UsCisJCSAgICAgICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgKmNoaWxkICkgeworCUVGSV9CT09UX1NFUlZJQ0VTICpicyA9IGVmaV9zeXN0YWItPkJvb3RTZXJ2aWNlczsKKwlFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgKnBhdGg7CisJRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICpzdWJwYXRoOworCU1BQ19BRERSX0RFVklDRV9QQVRIICptYWNwYXRoOworCXN0cnVjdCBlZmlfc25wX2RldmljZSAqc25wZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc2l6ZV90IHN1YnBhdGhfbGVuOworCXNpemVfdCBwYXRoX3ByZWZpeF9sZW4gPSAwOworCXVuc2lnbmVkIGludCBpOworCUVGSV9TVEFUVVMgZWZpcmM7CisKKwlEQkdDUCAoIGRyaXZlciwgIlNOUERSViAlcCBEUklWRVJfU1RBUlQgJXAgKCVwKVxuIiwKKwkJZHJpdmVyLCBkZXZpY2UsIGNoaWxkICk7CisKKwkvKiBEZXRlcm1pbmUgZGV2aWNlIHBhdGggcHJlZml4IGxlbmd0aCAqLworCWlmICggKCBlZmlyYyA9IGJzLT5PcGVuUHJvdG9jb2wgKCBkZXZpY2UsCisJCQkJCSAgJmVmaV9kZXZpY2VfcGF0aF9wcm90b2NvbF9ndWlkLAorCQkJCQkgICggdm9pZCAqICkgJnBhdGgsCisJCQkJCSAgZHJpdmVyLT5Ecml2ZXJCaW5kaW5nSGFuZGxlLAorCQkJCQkgIGRldmljZSwKKwkJCQkJICBFRklfT1BFTl9QUk9UT0NPTF9CWV9EUklWRVIgKSkgIT0wICl7CisJCURCR0NQICggZHJpdmVyLCAiU05QRFJWICVwIGRldmljZSAlcCBoYXMgbm8gZGV2aWNlIHBhdGhcbiIsCisJCQlkcml2ZXIsIGRldmljZSApOworCQlnb3RvIGVycl9ub19kZXZpY2VfcGF0aDsKKwl9CisJc3VicGF0aCA9IHBhdGg7CisJd2hpbGUgKCBzdWJwYXRoLT5UeXBlICE9IEVORF9ERVZJQ0VfUEFUSF9UWVBFICkgeworCQlzdWJwYXRoX2xlbiA9ICggKCBzdWJwYXRoLT5MZW5ndGhbMV0gPDwgOCApIHwKKwkJCQlzdWJwYXRoLT5MZW5ndGhbMF0gKTsKKwkJcGF0aF9wcmVmaXhfbGVuICs9IHN1YnBhdGhfbGVuOworCQlzdWJwYXRoID0gKCAoICggdm9pZCAqICkgc3VicGF0aCApICsgc3VicGF0aF9sZW4gKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgU05QIGRldmljZSAqLworCXNucGRldiA9IHphbGxvYyAoIHNpemVvZiAoICpzbnBkZXYgKSArIHBhdGhfcHJlZml4X2xlbiArCisJCQkgIHNpemVvZiAoICptYWNwYXRoICkgKTsKKwlpZiAoICEgc25wZGV2ICkgeworCQllZmlyYyA9IEVGSV9PVVRfT0ZfUkVTT1VSQ0VTOworCQlnb3RvIGVycl9hbGxvY19zbnA7CisJfQorCisJLyogSWRlbnRpZnkgdGhlIG5ldCBkZXZpY2UgKi8KKwluZXRkZXYgPSBlZmlfc25wX25ldGRldiAoIGRyaXZlciwgZGV2aWNlICk7CisJaWYgKCAhIG5ldGRldiApIHsKKwkJREJHQyAoIHNucGRldiwgIlNOUERFViAlcCBjYW5ub3QgZmluZCBuZXRkZXYgZm9yIGRldmljZSAlcFxuIiwKKwkJICAgICAgIHNucGRldiwgZGV2aWNlICk7CisJCWVmaXJjID0gRUZJX1VOU1VQUE9SVEVEOworCQlnb3RvIGVycl9ub19uZXRkZXY7CisJfQorCXNucGRldi0+bmV0ZGV2ID0gbmV0ZGV2X2dldCAoIG5ldGRldiApOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCBuZXRkZXYtPmxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiA+IHNpemVvZiAoIEVGSV9NQUNfQUREUkVTUyApICkgeworCQlEQkdDICggc25wZGV2LCAiU05QREVWICVwIGNhbm5vdCBzdXBwb3J0IGxpbmstbGF5ZXIgYWRkcmVzcyAiCisJCSAgICAgICAibGVuZ3RoICVkIGZvciAlc1xuIiwgc25wZGV2LAorCQkgICAgICAgbmV0ZGV2LT5sbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4sIG5ldGRldi0+bmFtZSApOworCQllZmlyYyA9IEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKwkJZ290byBlcnJfbGxfYWRkcl9sZW47CisJfQorCisJLyogUG9wdWxhdGUgdGhlIFNOUCBzdHJ1Y3R1cmUgKi8KKwltZW1jcHkgKCAmc25wZGV2LT5zbnAsICZlZmlfc25wX2RldmljZV9zbnAsIHNpemVvZiAoIHNucGRldi0+c25wICkgKTsKKwlzbnBkZXYtPnNucC5Nb2RlID0gJnNucGRldi0+bW9kZTsKKwlpZiAoICggZWZpcmMgPSBicy0+Q3JlYXRlRXZlbnQgKCBFVlRfTk9USUZZX1dBSVQsIFRQTF9OT1RJRlksCisJCQkJCSBlZmlfc25wX3dhaXRfZm9yX3BhY2tldCwgc25wZGV2LAorCQkJCQkgJnNucGRldi0+c25wLldhaXRGb3JQYWNrZXQgKSApICE9IDAgKXsKKwkJREJHQyAoIHNucGRldiwgIlNOUERFViAlcCBjb3VsZCBub3QgY3JlYXRlIGV2ZW50OiAlc1xuIiwKKwkJICAgICAgIHNucGRldiwgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQlnb3RvIGVycl9jcmVhdGVfZXZlbnQ7CisJfQorCisJLyogUG9wdWxhdGUgdGhlIFNOUCBtb2RlIHN0cnVjdHVyZSAqLworCXNucGRldi0+bW9kZS5TdGF0ZSA9IEVmaVNpbXBsZU5ldHdvcmtTdG9wcGVkOworCWVmaV9zbnBfc2V0X21vZGUgKCBzbnBkZXYgKTsKKworCS8qIFBvcHVsYXRlIHRoZSBOSUkgc3RydWN0dXJlICovCisJc25wZGV2LT5uaWkuUmV2aXNpb24gPQorCQlFRklfTkVUV09SS19JTlRFUkZBQ0VfSURFTlRJRklFUl9QUk9UT0NPTF9SRVZJU0lPTjsKKwlzdHJuY3B5ICggc25wZGV2LT5uaWkuU3RyaW5nSWQsICJnUFhFIiwKKwkJICBzaXplb2YgKCBzbnBkZXYtPm5paS5TdHJpbmdJZCApICk7CisKKwkvKiBQb3B1bGF0ZSB0aGUgZGV2aWNlIG5hbWUgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBzaXplb2YgKCBuZXRkZXYtPm5hbWUgKSA7IGkrKyApIHsKKwkJLyogRGFtbiBVbmljb2RlIG5hbWVzICovCisJCWFzc2VydCAoIGkgPCAoIHNpemVvZiAoIHNucGRldi0+bmFtZSApIC8KKwkJCSAgICAgICBzaXplb2YgKCBzbnBkZXYtPm5hbWVbMF0gKSApICk7CisJCXNucGRldi0+bmFtZVtpXSA9IG5ldGRldi0+bmFtZVtpXTsKKwl9CisKKwkvKiBQb3B1bGF0ZSB0aGUgZGV2aWNlIHBhdGggKi8KKwltZW1jcHkgKCAmc25wZGV2LT5wYXRoLCBwYXRoLCBwYXRoX3ByZWZpeF9sZW4gKTsKKwltYWNwYXRoID0gKCAoICggdm9pZCAqICkgJnNucGRldi0+cGF0aCApICsgcGF0aF9wcmVmaXhfbGVuICk7CisJc3VicGF0aCA9ICggKCB2b2lkICogKSAoIG1hY3BhdGggKyAxICkgKTsKKwltZW1zZXQgKCBtYWNwYXRoLCAwLCBzaXplb2YgKCAqbWFjcGF0aCApICk7CisJbWFjcGF0aC0+SGVhZGVyLlR5cGUgPSBNRVNTQUdJTkdfREVWSUNFX1BBVEg7CisJbWFjcGF0aC0+SGVhZGVyLlN1YlR5cGUgPSBNU0dfTUFDX0FERFJfRFA7CisJbWFjcGF0aC0+SGVhZGVyLkxlbmd0aFswXSA9IHNpemVvZiAoICptYWNwYXRoICk7CisJbWVtY3B5ICggJm1hY3BhdGgtPk1hY0FkZHJlc3MsIG5ldGRldi0+bGxfYWRkciwKKwkJIHNpemVvZiAoIG1hY3BhdGgtPk1hY0FkZHJlc3MgKSApOworCW1hY3BhdGgtPklmVHlwZSA9IG50b2hzICggbmV0ZGV2LT5sbF9wcm90b2NvbC0+bGxfcHJvdG8gKTsKKwltZW1zZXQgKCBzdWJwYXRoLCAwLCBzaXplb2YgKCAqc3VicGF0aCApICk7CisJc3VicGF0aC0+VHlwZSA9IEVORF9ERVZJQ0VfUEFUSF9UWVBFOworCXN1YnBhdGgtPlN1YlR5cGUgPSBFTkRfRU5USVJFX0RFVklDRV9QQVRIX1NVQlRZUEU7CisJc3VicGF0aC0+TGVuZ3RoWzBdID0gc2l6ZW9mICggKnN1YnBhdGggKTsKKworCS8qIEluc3RhbGwgdGhlIFNOUCAqLworCWlmICggKCBlZmlyYyA9IGJzLT5JbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVyZmFjZXMgKAorCQkJJnNucGRldi0+aGFuZGxlLAorCQkJJmVmaV9zaW1wbGVfbmV0d29ya19wcm90b2NvbF9ndWlkLCAmc25wZGV2LT5zbnAsCisJCQkmZWZpX2RldmljZV9wYXRoX3Byb3RvY29sX2d1aWQsICZzbnBkZXYtPnBhdGgsCisJCQkmZWZpX25paV9wcm90b2NvbF9ndWlkLCAmc25wZGV2LT5uaWksCisJCQkmZWZpX25paTMxX3Byb3RvY29sX2d1aWQsICZzbnBkZXYtPm5paSwKKwkJCU5VTEwgKSApICE9IDAgKSB7CisJCURCR0MgKCBzbnBkZXYsICJTTlBERVYgJXAgY291bGQgbm90IGluc3RhbGwgcHJvdG9jb2xzOiAiCisJCSAgICAgICAiJXNcbiIsIHNucGRldiwgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQlnb3RvIGVycl9pbnN0YWxsX3Byb3RvY29sX2ludGVyZmFjZTsKKwl9CisKKwlEQkdDICggc25wZGV2LCAiU05QREVWICVwIGluc3RhbGxlZCBmb3IgJXMgYXMgZGV2aWNlICVwXG4iLAorCSAgICAgICBzbnBkZXYsIG5ldGRldi0+bmFtZSwgc25wZGV2LT5oYW5kbGUgKTsKKwlyZXR1cm4gMDsKKworCWJzLT5Vbmluc3RhbGxNdWx0aXBsZVByb3RvY29sSW50ZXJmYWNlcyAoCisJCQlzbnBkZXYtPmhhbmRsZSwKKwkJCSZlZmlfc2ltcGxlX25ldHdvcmtfcHJvdG9jb2xfZ3VpZCwgJnNucGRldi0+c25wLAorCQkJJmVmaV9kZXZpY2VfcGF0aF9wcm90b2NvbF9ndWlkLCAmc25wZGV2LT5wYXRoLAorCQkJJmVmaV9uaWlfcHJvdG9jb2xfZ3VpZCwgJnNucGRldi0+bmlpLAorCQkJJmVmaV9uaWkzMV9wcm90b2NvbF9ndWlkLCAmc25wZGV2LT5uaWksCisJCQlOVUxMICk7CisgZXJyX2luc3RhbGxfcHJvdG9jb2xfaW50ZXJmYWNlOgorCWJzLT5DbG9zZUV2ZW50ICggc25wZGV2LT5zbnAuV2FpdEZvclBhY2tldCApOworIGVycl9jcmVhdGVfZXZlbnQ6CisgZXJyX2xsX2FkZHJfbGVuOgorCW5ldGRldl9wdXQgKCBuZXRkZXYgKTsKKyBlcnJfbm9fbmV0ZGV2OgorCWZyZWUgKCBzbnBkZXYgKTsKKyBlcnJfYWxsb2Nfc25wOgorCWJzLT5DbG9zZVByb3RvY29sICggZGV2aWNlLCAmZWZpX2RldmljZV9wYXRoX3Byb3RvY29sX2d1aWQsCisJCQkgICAgZHJpdmVyLT5Ecml2ZXJCaW5kaW5nSGFuZGxlLCBkZXZpY2UgKTsKKyBlcnJfbm9fZGV2aWNlX3BhdGg6CisJcmV0dXJuIGVmaXJjOworfQorCisvKioKKyAqIERldGFjaCBkcml2ZXIgZnJvbSBkZXZpY2UKKyAqCisgKiBAdiBkcml2ZXIJCUVGSSBkcml2ZXIKKyAqIEB2IGRldmljZQkJRUZJIGRldmljZQorICogQHYgbnVtX2NoaWxkcmVuCU51bWJlciBvZiBjaGlsZCBkZXZpY2VzCisgKiBAdiBjaGlsZHJlbgkJTGlzdCBvZiBjaGlsZCBkZXZpY2VzCisgKiBAcmV0IGVmaXJjCQlFRkkgc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIEVGSV9TVEFUVVMgRUZJQVBJCitlZmlfc25wX2RyaXZlcl9zdG9wICggRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MICpkcml2ZXIsCisJCSAgICAgIEVGSV9IQU5ETEUgZGV2aWNlLAorCQkgICAgICBVSU5UTiBudW1fY2hpbGRyZW4sCisJCSAgICAgIEVGSV9IQU5ETEUgKmNoaWxkcmVuICkgeworCUVGSV9CT09UX1NFUlZJQ0VTICpicyA9IGVmaV9zeXN0YWItPkJvb3RTZXJ2aWNlczsKKwlzdHJ1Y3QgZWZpX3NucF9kZXZpY2UgKnNucGRldjsKKworCURCR0NQICggZHJpdmVyLCAiU05QRFJWICVwIERSSVZFUl9TVE9QICVwICglbGQgJXApXG4iLAorCQlkcml2ZXIsIGRldmljZSwgKCAoIHVuc2lnbmVkIGxvbmcgKSBudW1fY2hpbGRyZW4gKSwgY2hpbGRyZW4gKTsKKworCS8qIExvY2F0ZSBTTlAgZGV2aWNlICovCisJc25wZGV2ID0gZWZpX3NucF9zbnBkZXYgKCBkcml2ZXIsIGRldmljZSApOworCWlmICggISBzbnBkZXYgKSB7CisJCURCR0MgKCBkcml2ZXIsICJTTlBEUlYgJXAgZGV2aWNlICVwIGNvdWxkIG5vdCBmaW5kIFNOUERFVlxuIiwKKwkJICAgICAgIGRyaXZlciwgZGV2aWNlICk7CisJCXJldHVybiBFRklfREVWSUNFX0VSUk9SOworCX0KKworCS8qIFVuaW5zdGFsbCB0aGUgU05QICovCisJYnMtPlVuaW5zdGFsbE11bHRpcGxlUHJvdG9jb2xJbnRlcmZhY2VzICgKKwkJCXNucGRldi0+aGFuZGxlLAorCQkJJmVmaV9zaW1wbGVfbmV0d29ya19wcm90b2NvbF9ndWlkLCAmc25wZGV2LT5zbnAsCisJCQkmZWZpX2RldmljZV9wYXRoX3Byb3RvY29sX2d1aWQsICZzbnBkZXYtPnBhdGgsCisJCQkmZWZpX25paV9wcm90b2NvbF9ndWlkLCAmc25wZGV2LT5uaWksCisJCQkmZWZpX25paTMxX3Byb3RvY29sX2d1aWQsICZzbnBkZXYtPm5paSwKKwkJCU5VTEwgKTsKKwlicy0+Q2xvc2VFdmVudCAoIHNucGRldi0+c25wLldhaXRGb3JQYWNrZXQgKTsKKwluZXRkZXZfcHV0ICggc25wZGV2LT5uZXRkZXYgKTsKKwlmcmVlICggc25wZGV2ICk7CisJYnMtPkNsb3NlUHJvdG9jb2wgKCBkZXZpY2UsICZlZmlfZGV2aWNlX3BhdGhfcHJvdG9jb2xfZ3VpZCwKKwkJCSAgICBkcml2ZXItPkRyaXZlckJpbmRpbmdIYW5kbGUsIGRldmljZSApOworCXJldHVybiAwOworfQorCisvKiogRUZJIFNOUCBkcml2ZXIgYmluZGluZyAqLworc3RhdGljIEVGSV9EUklWRVJfQklORElOR19QUk9UT0NPTCBlZmlfc25wX2JpbmRpbmcgPSB7CisJZWZpX3NucF9kcml2ZXJfc3VwcG9ydGVkLAorCWVmaV9zbnBfZHJpdmVyX3N0YXJ0LAorCWVmaV9zbnBfZHJpdmVyX3N0b3AsCisJMHgxMCwKKwlOVUxMLAorCU5VTEwKK307CisKKy8qKgorICogTG9vayB1cCBkcml2ZXIgbmFtZQorICoKKyAqIEB2IHd0ZgkJQ29tcG9uZW50IG5hbWUgcHJvdG9jb2wKKyAqIEB2IGxhbmd1YWdlCQlMYW5ndWFnZSB0byB1c2UKKyAqIEB2IGRyaXZlcl9uYW1lCURyaXZlciBuYW1lIHRvIGZpbGwgaW4KKyAqIEByZXQgZWZpcmMJCUVGSSBzdGF0dXMgY29kZQorICovCitzdGF0aWMgRUZJX1NUQVRVUyBFRklBUEkKK2VmaV9zbnBfZ2V0X2RyaXZlcl9uYW1lICggRUZJX0NPTVBPTkVOVF9OQU1FMl9QUk9UT0NPTCAqd3RmIF9fdW51c2VkLAorCQkJICBDSEFSOCAqbGFuZ3VhZ2UgX191bnVzZWQsIENIQVIxNiAqKmRyaXZlcl9uYW1lICkgeworCisJKmRyaXZlcl9uYW1lID0gTCIiIFBST0RVQ1RfU0hPUlRfTkFNRSAiIERyaXZlciI7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogTG9vayB1cCBjb250cm9sbGVyIG5hbWUKKyAqCisgKiBAdiB3dGYJCUNvbXBvbmVudCBuYW1lIHByb3RvY29sCisgKiBAdiBkZXZpY2UJCURldmljZQorICogQHYgY2hpbGQJCUNoaWxkIGRldmljZSwgb3IgTlVMTAorICogQHYgbGFuZ3VhZ2UJCUxhbmd1YWdlIHRvIHVzZQorICogQHYgZHJpdmVyX25hbWUJRGV2aWNlIG5hbWUgdG8gZmlsbCBpbgorICogQHJldCBlZmlyYwkJRUZJIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBFRklfU1RBVFVTIEVGSUFQSQorZWZpX3NucF9nZXRfY29udHJvbGxlcl9uYW1lICggRUZJX0NPTVBPTkVOVF9OQU1FMl9QUk9UT0NPTCAqd3RmIF9fdW51c2VkLAorCQkJICAgICAgRUZJX0hBTkRMRSBkZXZpY2UgX191bnVzZWQsCisJCQkgICAgICBFRklfSEFORExFIGNoaWxkIF9fdW51c2VkLAorCQkJICAgICAgQ0hBUjggKmxhbmd1YWdlIF9fdW51c2VkLAorCQkJICAgICAgQ0hBUjE2ICoqY29udHJvbGxlcl9uYW1lIF9fdW51c2VkICkgeworCisJLyogSnVzdCBsZXQgRUZJIHVzZSB0aGUgZGVmYXVsdCBEZXZpY2UgUGF0aCBOYW1lICovCisJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKK30KKworLyoqIEVGSSBTTlAgY29tcG9uZW50IG5hbWUgcHJvdG9jb2wgKi8KK3N0YXRpYyBFRklfQ09NUE9ORU5UX05BTUUyX1BST1RPQ09MIGVmaV9zbnBfbmFtZSA9IHsKKwllZmlfc25wX2dldF9kcml2ZXJfbmFtZSwKKwllZmlfc25wX2dldF9jb250cm9sbGVyX25hbWUsCisJImVuIgorfTsKKworLyoqCisgKiBJbnN0YWxsIEVGSSBTTlAgZHJpdmVyCisgKgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBlZmlfc25wX2luc3RhbGwgKCB2b2lkICkgeworCUVGSV9CT09UX1NFUlZJQ0VTICpicyA9IGVmaV9zeXN0YWItPkJvb3RTZXJ2aWNlczsKKwlFRklfRFJJVkVSX0JJTkRJTkdfUFJPVE9DT0wgKmRyaXZlciA9ICZlZmlfc25wX2JpbmRpbmc7CisJRUZJX1NUQVRVUyBlZmlyYzsKKworCWRyaXZlci0+SW1hZ2VIYW5kbGUgPSBlZmlfaW1hZ2VfaGFuZGxlOworCWlmICggKCBlZmlyYyA9IGJzLT5JbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVyZmFjZXMgKAorCQkJJmRyaXZlci0+RHJpdmVyQmluZGluZ0hhbmRsZSwKKwkJCSZlZmlfZHJpdmVyX2JpbmRpbmdfcHJvdG9jb2xfZ3VpZCwgZHJpdmVyLAorCQkJJmVmaV9jb21wb25lbnRfbmFtZTJfcHJvdG9jb2xfZ3VpZCwgJmVmaV9zbnBfbmFtZSwKKwkJCU5VTEwgKSApICE9IDAgKSB7CisJCURCR0MgKCBkcml2ZXIsICJTTlBEUlYgJXAgY291bGQgbm90IGluc3RhbGwgcHJvdG9jb2xzOiAiCisJCSAgICAgICAiJXNcbiIsIGRyaXZlciwgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQlyZXR1cm4gRUZJUkNfVE9fUkMgKCBlZmlyYyApOworCX0KKworCURCR0MgKCBkcml2ZXIsICJTTlBEUlYgJXAgZHJpdmVyIGJpbmRpbmcgaW5zdGFsbGVkIGFzICVwXG4iLAorCSAgICAgICBkcml2ZXIsIGRyaXZlci0+RHJpdmVyQmluZGluZ0hhbmRsZSApOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfc3RyZXJyb3IuYyBiL2dweGUvc3JjL2ludGVyZmFjZS9lZmkvZWZpX3N0cmVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmNDU4MQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2ludGVyZmFjZS9lZmkvZWZpX3N0cmVycm9yLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvZWZpLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIGdQWEUgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nIGZvciBFRkkKKyAqCisgKi8KKworLyoqCisgKiBGb3JtYXQgRUZJIHN0YXR1cyBjb2RlCisgKgorICogQHYgZWZpcmMJCUVGSSBzdGF0dXMgY29kZQorICogQHYgZWZpX3N0cmVycm9yCUVGSSBzdGF0dXMgY29kZSBzdHJpbmcKKyAqLworY29uc3QgY2hhciAqIGVmaV9zdHJlcnJvciAoIEVGSV9TVEFUVVMgZWZpcmMgKSB7CisJc3RhdGljIGNoYXIgZXJyYnVmWzMyXTsKKworCWlmICggISBlZmlyYyApCisJCXJldHVybiAiTm8gZXJyb3IiOworCisJc25wcmludGYgKCBlcnJidWYsIHNpemVvZiAoIGVycmJ1ZiApLCAiRXJyb3IgJWxsZCIsCisJCSAgICggdW5zaWduZWQgbG9uZyBsb25nICkgKCBlZmlyYyBeIE1BWF9CSVQgKSApOworCXJldHVybiBlcnJidWY7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV90aW1lci5jIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGNiNzYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfdGltZXIuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdweGUvdGltZXIuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9lZmkuaD4KKyNpbmNsdWRlIDxncHhlL2VmaS9Qcm90b2NvbC9DcHUuaD4KKworLyoqIEBmaWxlCisgKgorICogZ1BYRSB0aW1lciBBUEkgZm9yIEVGSQorICoKKyAqLworCisvKiogU2NhbGUgZmFjdG9yIHRvIGFwcGx5IHRvIENQVSB0aW1lciAwCisgKgorICogVGhlIHRpbWVyIGlzIHNjYWxlZCBkb3duIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHJlYXNvbmFibGUgdmFsdWVzCisgKiBmb3IgIm51bWJlciBvZiB0aWNrcyIgZG9uJ3QgZXhjZWVkIHRoZSBzaXplIG9mIGFuIHVuc2lnbmVkIGxvbmcuCisgKi8KKyNkZWZpbmUgRUZJX1RJTUVSMF9TSElGVCAxMgorCisvKiogQ2FsaWJyYXRpb24gdGltZSAqLworI2RlZmluZSBFRklfQ0FMSUJSQVRFX0RFTEFZX01TIDEKKworLyoqIENQVSBwcm90b2NvbCAqLworc3RhdGljIEVGSV9DUFVfQVJDSF9QUk9UT0NPTCAqY3B1X2FyY2g7CitFRklfUkVRVUlSRV9QUk9UT0NPTCAoIEVGSV9DUFVfQVJDSF9QUk9UT0NPTCwgJmNwdV9hcmNoICk7CisKKy8qKgorICogRGVsYXkgZm9yIGEgZml4ZWQgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcworICoKKyAqIEB2IHVzZWNzCQlOdW1iZXIgb2YgbWljcm9zZWNvbmRzIGZvciB3aGljaCB0byBkZWxheQorICovCitzdGF0aWMgdm9pZCBlZmlfdWRlbGF5ICggdW5zaWduZWQgbG9uZyB1c2VjcyApIHsKKwlFRklfQk9PVF9TRVJWSUNFUyAqYnMgPSBlZmlfc3lzdGFiLT5Cb290U2VydmljZXM7CisJRUZJX1NUQVRVUyBlZmlyYzsKKworCWlmICggKCBlZmlyYyA9IGJzLT5TdGFsbCAoIHVzZWNzICkgKSAhPSAwICkgeworCQlEQkcgKCAiRUZJIGNvdWxkIG5vdCBkZWxheSBmb3IgJWxkdXM6ICVzXG4iLAorCQkgICAgICB1c2VjcywgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQkvKiBQcm9iYWJseSBzY3Jld2VkICovCisJfQorfQorCisvKioKKyAqIEdldCBjdXJyZW50IHN5c3RlbSB0aW1lIGluIHRpY2tzCisgKgorICogQHJldCB0aWNrcwkJQ3VycmVudCB0aW1lLCBpbiB0aWNrcworICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlZmlfY3VycnRpY2tzICggdm9pZCApIHsKKwlVSU5UNjQgdGltZTsKKwlFRklfU1RBVFVTIGVmaXJjOworCisJLyogUmVhZCBDUFUgdGltZXIgMCAoVFNDKSAqLworCWlmICggKCBlZmlyYyA9IGNwdV9hcmNoLT5HZXRUaW1lclZhbHVlICggY3B1X2FyY2gsIDAsICZ0aW1lLAorCQkJCQkJIE5VTEwgKSApICE9IDAgKSB7CisJCURCRyAoICJFRkkgY291bGQgbm90IHJlYWQgQ1BVIHRpbWVyOiAlc1xuIiwKKwkJICAgICAgZWZpX3N0cmVycm9yICggZWZpcmMgKSApOworCQkvKiBQcm9iYWJseSBzY3Jld2VkICovCisJCXJldHVybiAtMVVMOworCX0KKworCXJldHVybiAoIHRpbWUgPj4gRUZJX1RJTUVSMF9TSElGVCApOworfQorCisvKioKKyAqIEdldCBudW1iZXIgb2YgdGlja3MgcGVyIHNlY29uZAorICoKKyAqIEByZXQgdGlja3NfcGVyX3NlYwlOdW1iZXIgb2YgdGlja3MgcGVyIHNlY29uZAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlZmlfdGlja3NfcGVyX3NlYyAoIHZvaWQgKSB7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgdGlja3NfcGVyX3NlYyA9IDA7CisKKwkvKiBDYWxpYnJhdGUgdGltZXIsIGlmIG5lY2Vzc2FyeS4gIEVGSSBkb2VzIG5vbWluYWxseSBwcm92aWRlCisJICogdGhlIHRpbWVyIHNwZWVkIHZpYSB0aGUgKG9wdGlvbmFsKSBUaW1lclBlcmlvZCBwYXJhbWV0ZXIgdG8KKwkgKiB0aGUgR2V0VGltZXJWYWx1ZSgpIGNhbGwsIGJ1dCBpdCBnZXRzIHRoZSBzcGVlZCBzbGlnaHRseQorCSAqIHdyb25nLiAgQnkgdXAgdG8gdGhyZWUgb3JkZXJzIG9mIG1hZ25pdHVkZS4gIE5vdCBoZWxwZnVsLgorCSAqLworCWlmICggISB0aWNrc19wZXJfc2VjICkgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0OworCQl1bnNpZ25lZCBsb25nIGVsYXBzZWQ7CisKKwkJREJHICggIkNhbGlicmF0aW5nIEVGSSB0aW1lciB3aXRoIGEgJWQgbXMgZGVsYXlcbiIsCisJCSAgICAgIEVGSV9DQUxJQlJBVEVfREVMQVlfTVMgKTsKKwkJc3RhcnQgPSBjdXJydGlja3MoKTsKKwkJbWRlbGF5ICggRUZJX0NBTElCUkFURV9ERUxBWV9NUyApOworCQllbGFwc2VkID0gKCBjdXJydGlja3MoKSAtIHN0YXJ0ICk7CisJCXRpY2tzX3Blcl9zZWMgPSAoIGVsYXBzZWQgKiAoIDEwMDAgLyBFRklfQ0FMSUJSQVRFX0RFTEFZX01TICkpOworCQlEQkcgKCAiRUZJIENQVSB0aW1lciBjYWxpYnJhdGVkIGF0ICVsZCB0aWNrcyBpbiAlZCBtcyAoJWxkICIKKwkJICAgICAgInRpY2tzL3NlYylcbiIsIGVsYXBzZWQsIEVGSV9DQUxJQlJBVEVfREVMQVlfTVMsCisJCSAgICAgIHRpY2tzX3Blcl9zZWMgKTsKKwl9CisKKwlyZXR1cm4gdGlja3NfcGVyX3NlYzsKK30KKworUFJPVklERV9USU1FUiAoIGVmaSwgdWRlbGF5LCBlZmlfdWRlbGF5ICk7CitQUk9WSURFX1RJTUVSICggZWZpLCBjdXJydGlja3MsIGVmaV9jdXJydGlja3MgKTsKK1BST1ZJREVfVElNRVIgKCBlZmksIHRpY2tzX3Blcl9zZWMsIGVmaV90aWNrc19wZXJfc2VjICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV91YWNjZXNzLmMgYi9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV91YWNjZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlOTUyMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2ludGVyZmFjZS9lZmkvZWZpX3VhY2Nlc3MuYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS91YWNjZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS9lZmkvZWZpLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIGdQWEUgdXNlciBhY2Nlc3MgQVBJIGZvciBFRkkKKyAqCisgKi8KKworUFJPVklERV9VQUNDRVNTX0lOTElORSAoIGVmaSwgcGh5c190b191c2VyICk7CitQUk9WSURFX1VBQ0NFU1NfSU5MSU5FICggZWZpLCB1c2VyX3RvX3BoeXMgKTsKK1BST1ZJREVfVUFDQ0VTU19JTkxJTkUgKCBlZmksIHZpcnRfdG9fdXNlciApOworUFJPVklERV9VQUNDRVNTX0lOTElORSAoIGVmaSwgdXNlcl90b192aXJ0ICk7CitQUk9WSURFX1VBQ0NFU1NfSU5MSU5FICggZWZpLCB1c2VycHRyX2FkZCApOworUFJPVklERV9VQUNDRVNTX0lOTElORSAoIGVmaSwgbWVtY3B5X3VzZXIgKTsKK1BST1ZJREVfVUFDQ0VTU19JTkxJTkUgKCBlZmksIG1lbW1vdmVfdXNlciApOworUFJPVklERV9VQUNDRVNTX0lOTElORSAoIGVmaSwgbWVtc2V0X3VzZXIgKTsKK1BST1ZJREVfVUFDQ0VTU19JTkxJTkUgKCBlZmksIHN0cmxlbl91c2VyICk7CitQUk9WSURFX1VBQ0NFU1NfSU5MSU5FICggZWZpLCBtZW1jaHJfdXNlciApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfdW1hbGxvYy5jIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL2VmaS9lZmlfdW1hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTNjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbnRlcmZhY2UvZWZpL2VmaV91bWFsbG9jLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvdW1hbGxvYy5oPgorI2luY2x1ZGUgPGdweGUvZWZpL2VmaS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBnUFhFIHVzZXIgbWVtb3J5IGFsbG9jYXRpb24gQVBJIGZvciBFRkkKKyAqCisgKi8KKworLyoqIEVxdWl2YWxlbnQgb2YgTk9XSEVSRSBmb3IgdXNlciBwb2ludGVycyAqLworI2RlZmluZSBVTk9XSEVSRSAoIH5VTlVMTCApCisKKy8qKgorICogUmVhbGxvY2F0ZSBleHRlcm5hbCBtZW1vcnkKKyAqCisgKiBAdiBvbGRfcHRyCQlNZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgdW1hbGxvYygpLCBvciBVTlVMTAorICogQHYgbmV3X3NpemUJCVJlcXVlc3RlZCBzaXplCisgKiBAcmV0IG5ld19wdHIJCUFsbG9jYXRlZCBtZW1vcnksIG9yIFVOVUxMCisgKgorICogQ2FsbGluZyByZWFsbG9jKCkgd2l0aCBhIG5ldyBzaXplIG9mIHplcm8gaXMgYSB2YWxpZCB3YXkgdG8gZnJlZSBhCisgKiBtZW1vcnkgYmxvY2suCisgKi8KK3N0YXRpYyB1c2VycHRyX3QgZWZpX3VyZWFsbG9jICggdXNlcnB0cl90IG9sZF9wdHIsIHNpemVfdCBuZXdfc2l6ZSApIHsKKwlFRklfQk9PVF9TRVJWSUNFUyAqYnMgPSBlZmlfc3lzdGFiLT5Cb290U2VydmljZXM7CisJRUZJX1BIWVNJQ0FMX0FERFJFU1MgcGh5c19hZGRyOworCXVuc2lnbmVkIGludCBuZXdfcGFnZXMsIG9sZF9wYWdlczsKKwl1c2VycHRyX3QgbmV3X3B0ciA9IFVOT1dIRVJFOworCXNpemVfdCBvbGRfc2l6ZTsKKwlFRklfU1RBVFVTIGVmaXJjOworCisJLyogQWxsb2NhdGUgbmV3IG1lbW9yeSBpZiBuZWNlc3NhcnkuICBJZiBhbGxvY2F0aW9uIGZhaWxzLAorCSAqIHJldHVybiB3aXRob3V0IHRvdWNoaW5nIHRoZSBvbGQgYmxvY2suCisJICovCisJaWYgKCBuZXdfc2l6ZSApIHsKKwkJbmV3X3BhZ2VzID0gKCBFRklfU0laRV9UT19QQUdFUyAoIG5ld19zaXplICkgKyAxICk7CisJCWlmICggKCBlZmlyYyA9IGJzLT5BbGxvY2F0ZVBhZ2VzICggQWxsb2NhdGVBbnlQYWdlcywKKwkJCQkJCSAgIEVmaUJvb3RTZXJ2aWNlc0RhdGEsCisJCQkJCQkgICBuZXdfcGFnZXMsCisJCQkJCQkgICAmcGh5c19hZGRyICkgKSAhPSAwICkgeworCQkJREJHICggIkVGSSBjb3VsZCBub3QgYWxsb2NhdGUgJWQgcGFnZXM6ICVzXG4iLAorCQkJICAgICAgbmV3X3BhZ2VzLCBlZmlfc3RyZXJyb3IgKCBlZmlyYyApICk7CisJCQlyZXR1cm4gVU5VTEw7CisJCX0KKwkJYXNzZXJ0ICggcGh5c19hZGRyICE9IDAgKTsKKwkJbmV3X3B0ciA9IHBoeXNfdG9fdXNlciAoIHBoeXNfYWRkciArIEVGSV9QQUdFX1NJWkUgKTsKKwkJY29weV90b191c2VyICggbmV3X3B0ciwgLUVGSV9QQUdFX1NJWkUsCisJCQkgICAgICAgJm5ld19zaXplLCBzaXplb2YgKCBuZXdfc2l6ZSApICk7CisJCURCRyAoICJFRkkgYWxsb2NhdGVkICVkIHBhZ2VzIGF0ICVsbHhcbiIsCisJCSAgICAgIG5ld19wYWdlcywgcGh5c19hZGRyICk7CisJfQorCisJLyogQ29weSBhY3Jvc3MgcmVsZXZhbnQgcGFydCBvZiB0aGUgb2xkIGRhdGEgcmVnaW9uIChpZiBhbnkpLAorCSAqIHRoZW4gZnJlZSBpdC4gIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IGVpdGhlciAoYSkgbmV3X3B0cgorCSAqIGlzIHZhbGlkLCBvciAoYikgbmV3X3NpemUgaXMgMDsgZWl0aGVyIHdheSwgdGhlIG1lbWNweSgpIGlzCisJICogdmFsaWQuCisJICovCisJaWYgKCBvbGRfcHRyICYmICggb2xkX3B0ciAhPSBVTk9XSEVSRSApICkgeworCQljb3B5X2Zyb21fdXNlciAoICZvbGRfc2l6ZSwgb2xkX3B0ciwgLUVGSV9QQUdFX1NJWkUsCisJCQkJIHNpemVvZiAoIG9sZF9zaXplICkgKTsKKwkJbWVtY3B5X3VzZXIgKCBuZXdfcHRyLCAwLCBvbGRfcHRyLCAwLAorCQkJICAgICAgKCAob2xkX3NpemUgPCBuZXdfc2l6ZSkgPyBvbGRfc2l6ZSA6IG5ld19zaXplICkpOworCQlvbGRfcGFnZXMgPSAoIEVGSV9TSVpFX1RPX1BBR0VTICggb2xkX3NpemUgKSArIDEgKTsKKwkJcGh5c19hZGRyID0gdXNlcl90b19waHlzICggb2xkX3B0ciwgLUVGSV9QQUdFX1NJWkUgKTsKKwkJaWYgKCAoIGVmaXJjID0gYnMtPkZyZWVQYWdlcyAoIHBoeXNfYWRkciwgb2xkX3BhZ2VzICkgKSAhPSAwICl7CisJCQlEQkcgKCAiRUZJIGNvdWxkIG5vdCBmcmVlICVkIHBhZ2VzIGF0ICVsbHg6ICVzXG4iLAorCQkJICAgICAgb2xkX3BhZ2VzLCBwaHlzX2FkZHIsIGVmaV9zdHJlcnJvciAoIGVmaXJjICkgKTsKKwkJCS8qIE5vdCBmYXRhbDsgd2UgaGF2ZSBsZWFrZWQgbWVtb3J5IGJ1dCBzdWNjZXNzZnVsbHkKKwkJCSAqIGFsbG9jYXRlZCAoaWYgYXNrZWQgdG8gZG8gc28pLgorCQkJICovCisJCX0KKwkJREJHICggIkVGSSBmcmVlZCAlZCBwYWdlcyBhdCAlbGx4XG4iLCBvbGRfcGFnZXMsIHBoeXNfYWRkciApOworCX0KKworCXJldHVybiBuZXdfcHRyOworfQorCitQUk9WSURFX1VNQUxMT0MgKCBlZmksIHVyZWFsbG9jLCBlZmlfdXJlYWxsb2MgKTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL2ludGVyZmFjZS9zbWJpb3Mvc21iaW9zLmMgYi9ncHhlL3NyYy9pbnRlcmZhY2Uvc21iaW9zL3NtYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2RmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9pbnRlcmZhY2Uvc21iaW9zL3NtYmlvcy5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxncHhlL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL3NtYmlvcy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBTeXN0ZW0gTWFuYWdlbWVudCBCSU9TCisgKgorICovCisKKy8qKiBTTUJJT1MgZW50cnkgcG9pbnQgZGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCBzbWJpb3Mgc21iaW9zID0geworCS5hZGRyZXNzID0gVU5VTEwsCit9OworCisvKioKKyAqIEZpbmQgU01CSU9TIHN0cmluZ3MgdGVybWluYXRvcgorICoKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IHRvIHN0YXJ0IG9mIHN0cmluZ3MKKyAqIEByZXQgb2Zmc2V0CQlPZmZzZXQgdG8gc3RyaW5ncyB0ZXJtaW5hdG9yLCBvciAwIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgc2l6ZV90IGZpbmRfc3RyaW5nc190ZXJtaW5hdG9yICggc2l6ZV90IG9mZnNldCApIHsKKwlzaXplX3QgbWF4X29mZnNldCA9ICggc21iaW9zLmxlbiAtIDIgKTsKKwl1aW50MTZfdCBudWxudWw7CisKKwlmb3IgKCA7IG9mZnNldCA8PSBtYXhfb2Zmc2V0IDsgb2Zmc2V0KysgKSB7CisJCWNvcHlfZnJvbV91c2VyICggJm51bG51bCwgc21iaW9zLmFkZHJlc3MsIG9mZnNldCwgMiApOworCQlpZiAoIG51bG51bCA9PSAwICkKKwkJCXJldHVybiAoIG9mZnNldCArIDEgKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmluZCBzcGVjaWZpYyBzdHJ1Y3R1cmUgdHlwZSB3aXRoaW4gU01CSU9TCisgKgorICogQHYgdHlwZQkJU3RydWN0dXJlIHR5cGUgdG8gc2VhcmNoIGZvcgorICogQHYgc3RydWN0dXJlCQlTTUJJT1Mgc3RydWN0dXJlIGRlc2NyaXB0b3IgdG8gZmlsbCBpbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBmaW5kX3NtYmlvc19zdHJ1Y3R1cmUgKCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCSAgICBzdHJ1Y3Qgc21iaW9zX3N0cnVjdHVyZSAqc3RydWN0dXJlICkgeworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJc2l6ZV90IG9mZnNldCA9IDA7CisJc2l6ZV90IHN0cmluZ3Nfb2Zmc2V0OworCXNpemVfdCB0ZXJtaW5hdG9yX29mZnNldDsKKwlpbnQgcmM7CisKKwkvKiBGaW5kIFNNQklPUyAqLworCWlmICggKCBzbWJpb3MuYWRkcmVzcyA9PSBVTlVMTCApICYmCisJICAgICAoICggcmMgPSBmaW5kX3NtYmlvcyAoICZzbWJpb3MgKSApICE9IDAgKSApCisJCXJldHVybiByYzsKKwlhc3NlcnQgKCBzbWJpb3MuYWRkcmVzcyAhPSBVTlVMTCApOworCisJLyogU2NhbiB0aHJvdWdoIGxpc3Qgb2Ygc3RydWN0dXJlcyAqLworCXdoaWxlICggKCAoIG9mZnNldCArIHNpemVvZiAoIHN0cnVjdHVyZS0+aGVhZGVyICkgKSA8IHNtYmlvcy5sZW4gKQorCQkmJiAoIGNvdW50IDwgc21iaW9zLmNvdW50ICkgKSB7CisKKwkJLyogUmVhZCBuZXh0IFNNQklPUyBzdHJ1Y3R1cmUgaGVhZGVyICovCisJCWNvcHlfZnJvbV91c2VyICggJnN0cnVjdHVyZS0+aGVhZGVyLCBzbWJpb3MuYWRkcmVzcywgb2Zmc2V0LAorCQkJCSBzaXplb2YgKCBzdHJ1Y3R1cmUtPmhlYWRlciApICk7CisKKwkJLyogRGV0ZXJtaW5lIHN0YXJ0IGFuZCBleHRlbnQgb2Ygc3RyaW5ncyBibG9jayAqLworCQlzdHJpbmdzX29mZnNldCA9ICggb2Zmc2V0ICsgc3RydWN0dXJlLT5oZWFkZXIubGVuICk7CisJCWlmICggc3RyaW5nc19vZmZzZXQgPiBzbWJpb3MubGVuICkgeworCQkJREJHICggIlNNQklPUyBzdHJ1Y3R1cmUgYXQgb2Zmc2V0ICV6eCB3aXRoIGxlbmd0aCAiCisJCQkgICAgICAiJXggZXh0ZW5kcyBiZXlvbmQgU01CSU9TXG4iLCBvZmZzZXQsCisJCQkgICAgICBzdHJ1Y3R1cmUtPmhlYWRlci5sZW4gKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJCXRlcm1pbmF0b3Jfb2Zmc2V0ID0gZmluZF9zdHJpbmdzX3Rlcm1pbmF0b3IgKCBzdHJpbmdzX29mZnNldCApOworCQlpZiAoICEgdGVybWluYXRvcl9vZmZzZXQgKSB7CisJCQlEQkcgKCAiU01CSU9TIHN0cnVjdHVyZSBhdCBvZmZzZXQgJXp4IGhhcyAiCisJCQkgICAgICAidW50ZXJtaW5hdGVkIHN0cmluZ3Mgc2VjdGlvblxuIiwgb2Zmc2V0ICk7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCQlzdHJ1Y3R1cmUtPnN0cmluZ3NfbGVuID0gKCB0ZXJtaW5hdG9yX29mZnNldCAtIHN0cmluZ3Nfb2Zmc2V0KTsKKworCQlEQkcgKCAiU01CSU9TIHN0cnVjdHVyZSBhdCBvZmZzZXQgJXp4IGhhcyB0eXBlICVkLCBsZW5ndGggJXgsICIKKwkJICAgICAgInN0cmluZ3MgbGVuZ3RoICV6eFxuIiwgb2Zmc2V0LCBzdHJ1Y3R1cmUtPmhlYWRlci50eXBlLAorCQkgICAgICBzdHJ1Y3R1cmUtPmhlYWRlci5sZW4sIHN0cnVjdHVyZS0+c3RyaW5nc19sZW4gKTsKKworCQkvKiBJZiB0aGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2Ugd2FudCwgcmV0dXJuICovCisJCWlmICggc3RydWN0dXJlLT5oZWFkZXIudHlwZSA9PSB0eXBlICkgeworCQkJc3RydWN0dXJlLT5vZmZzZXQgPSBvZmZzZXQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIE1vdmUgdG8gbmV4dCBTTUJJT1Mgc3RydWN0dXJlICovCisJCW9mZnNldCA9ICggdGVybWluYXRvcl9vZmZzZXQgKyAxICk7CisJCWNvdW50Kys7CisJfQorCisJREJHICggIlNNQklPUyBzdHJ1Y3R1cmUgdHlwZSAlZCBub3QgZm91bmRcbiIsIHR5cGUgKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoqCisgKiBDb3B5IFNNQklPUyBzdHJ1Y3R1cmUKKyAqCisgKiBAdiBzdHJ1Y3R1cmUJCVNNQklPUyBzdHJ1Y3R1cmUgZGVzY3JpcHRvcgorICogQHYgZGF0YQkJQnVmZmVyIHRvIGhvbGQgU01CSU9TIHN0cnVjdHVyZQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IHJlYWRfc21iaW9zX3N0cnVjdHVyZSAoIHN0cnVjdCBzbWJpb3Nfc3RydWN0dXJlICpzdHJ1Y3R1cmUsCisJCQkgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKworCWFzc2VydCAoIHNtYmlvcy5hZGRyZXNzICE9IFVOVUxMICk7CisKKwlpZiAoIGxlbiA+IHN0cnVjdHVyZS0+aGVhZGVyLmxlbiApCisJCWxlbiA9IHN0cnVjdHVyZS0+aGVhZGVyLmxlbjsKKwljb3B5X2Zyb21fdXNlciAoIGRhdGEsIHNtYmlvcy5hZGRyZXNzLCBzdHJ1Y3R1cmUtPm9mZnNldCwgbGVuICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmluZCBpbmRleGVkIHN0cmluZyB3aXRoaW4gU01CSU9TIHN0cnVjdHVyZQorICoKKyAqIEB2IHN0cnVjdHVyZQkJU01CSU9TIHN0cnVjdHVyZSBkZXNjcmlwdG9yCisgKiBAdiBpbmRleAkJU3RyaW5nIGluZGV4CisgKiBAdiBkYXRhCQlCdWZmZXIgZm9yIHN0cmluZworICogQHYgbGVuCQlMZW5ndGggb2Ygc3RyaW5nIGJ1ZmZlcgorICogQHJldCByYwkJTGVuZ3RoIG9mIHN0cmluZywgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworaW50IHJlYWRfc21iaW9zX3N0cmluZyAoIHN0cnVjdCBzbWJpb3Nfc3RydWN0dXJlICpzdHJ1Y3R1cmUsCisJCQkgdW5zaWduZWQgaW50IGluZGV4LCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXNpemVfdCBzdHJpbmdzX3N0YXJ0ID0gKCBzdHJ1Y3R1cmUtPm9mZnNldCArIHN0cnVjdHVyZS0+aGVhZGVyLmxlbiApOworCXNpemVfdCBzdHJpbmdzX2VuZCA9ICggc3RyaW5nc19zdGFydCArIHN0cnVjdHVyZS0+c3RyaW5nc19sZW4gKTsKKwlzaXplX3Qgb2Zmc2V0OworCXNpemVfdCBzdHJpbmdfbGVuOworCisJYXNzZXJ0ICggc21iaW9zLmFkZHJlc3MgIT0gVU5VTEwgKTsKKworCS8qIFN0cmluZyBudW1iZXJzIHN0YXJ0IGF0IDEgKDAgaXMgdXNlZCB0byBpbmRpY2F0ZSAibm8gc3RyaW5nIikgKi8KKwlpZiAoICEgaW5kZXggKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWZvciAoIG9mZnNldCA9IHN0cmluZ3Nfc3RhcnQgOyBvZmZzZXQgPCBzdHJpbmdzX2VuZCA7CisJICAgICAgb2Zmc2V0ICs9ICggc3RyaW5nX2xlbiArIDEgKSApIHsKKwkJLyogR2V0IHN0cmluZyBsZW5ndGguICBUaGlzIGlzIGtub3duIHNhZmUsIHNpbmNlIHRoZQorCQkgKiBzbWJpb3Nfc3RyaW5ncyBzdHJ1Y3QgaXMgY29uc3RydWN0ZWQgc28gYXMgdG8KKwkJICogYWx3YXlzIGVuZCBvbiBhIHN0cmluZyBib3VuZGFyeS4KKwkJICovCisJCXN0cmluZ19sZW4gPSBzdHJsZW5fdXNlciAoIHNtYmlvcy5hZGRyZXNzLCBvZmZzZXQgKTsKKwkJaWYgKCAtLWluZGV4ID09IDAgKSB7CisJCQkvKiBDb3B5IHN0cmluZywgdHJ1bmNhdGluZyBhcyBuZWNlc3NhcnkuICovCisJCQlpZiAoIGxlbiA+IHN0cmluZ19sZW4gKQorCQkJCWxlbiA9IHN0cmluZ19sZW47CisJCQljb3B5X2Zyb21fdXNlciAoIGRhdGEsIHNtYmlvcy5hZGRyZXNzLCBvZmZzZXQsIGxlbiApOworCQkJcmV0dXJuIHN0cmluZ19sZW47CisJCX0KKwl9CisKKwlEQkcgKCAiU01CSU9TIHN0cmluZyBpbmRleCAlZCBub3QgZm91bmRcbiIsIGluZGV4ICk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9pbnRlcmZhY2Uvc21iaW9zL3NtYmlvc19zZXR0aW5ncy5jIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL3NtYmlvcy9zbWJpb3Nfc2V0dGluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzk2NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvaW50ZXJmYWNlL3NtYmlvcy9zbWJpb3Nfc2V0dGluZ3MuYwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorI2luY2x1ZGUgPGdweGUvdXVpZC5oPgorI2luY2x1ZGUgPGdweGUvc21iaW9zLmg+CisKKy8qKiBTTUJJT1Mgc2V0dGluZ3MgdGFnIG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBTTUJJT1NfVEFHX01BR0lDIDB4NUIgLyogIlNtQmlvcyIgKi8KKworLyoqCisgKiBDb25zdHJ1Y3QgU01CSU9TIGVtcHR5IHRhZworICoKKyAqIEByZXQgdGFnCQlTTUJJT1Mgc2V0dGluZyB0YWcKKyAqLworI2RlZmluZSBTTUJJT1NfRU1QVFlfVEFHICggU01CSU9TX1RBR19NQUdJQyA8PCAyNCApCisKKy8qKgorICogQ29uc3RydWN0IFNNQklPUyByYXctZGF0YSB0YWcKKyAqCisgKiBAdiBfdHlwZQkJU01CSU9TIHN0cnVjdHVyZSB0eXBlIG51bWJlcgorICogQHYgX3N0cnVjdHVyZQlTTUJJT1Mgc3RydWN0dXJlIGRhdGEgdHlwZQorICogQHYgX2ZpZWxkCQlGaWVsZCB3aXRoaW4gU01CSU9TIHN0cnVjdHVyZSBkYXRhIHR5cGUKKyAqIEByZXQgdGFnCQlTTUJJT1Mgc2V0dGluZyB0YWcKKyAqLworI2RlZmluZSBTTUJJT1NfUkFXX1RBRyggX3R5cGUsIF9zdHJ1Y3R1cmUsIF9maWVsZCApCQlcCisJKCAoIFNNQklPU19UQUdfTUFHSUMgPDwgMjQgKSB8CQkJCVwKKwkgICggKF90eXBlKSA8PCAxNiApIHwJCQkJCVwKKwkgICggb2Zmc2V0b2YgKCBfc3RydWN0dXJlLCBfZmllbGQgKSA8PCA4ICkgfAkJXAorCSAgKCBzaXplb2YgKCAoICggX3N0cnVjdHVyZSAqICkgMCApLT5fZmllbGQgKSApICkKKworLyoqCisgKiBDb25zdHJ1Y3QgU01CSU9TIHN0cmluZyB0YWcKKyAqCisgKiBAdiBfdHlwZQkJU01CSU9TIHN0cnVjdHVyZSB0eXBlIG51bWJlcgorICogQHYgX3N0cnVjdHVyZQlTTUJJT1Mgc3RydWN0dXJlIGRhdGEgdHlwZQorICogQHYgX2ZpZWxkCQlGaWVsZCB3aXRoaW4gU01CSU9TIHN0cnVjdHVyZSBkYXRhIHR5cGUKKyAqIEByZXQgdGFnCQlTTUJJT1Mgc2V0dGluZyB0YWcKKyAqLworI2RlZmluZSBTTUJJT1NfU1RSSU5HX1RBRyggX3R5cGUsIF9zdHJ1Y3R1cmUsIF9maWVsZCApCQlcCisJKCAoIFNNQklPU19UQUdfTUFHSUMgPDwgMjQgKSB8CQkJCVwKKwkgICggKF90eXBlKSA8PCAxNiApIHwJCQkJCVwKKwkgICggb2Zmc2V0b2YgKCBfc3RydWN0dXJlLCBfZmllbGQgKSA8PCA4ICkgKQorCisvKioKKyAqIEZldGNoIHZhbHVlIG9mIFNNQklPUyBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrLCBvciBOVUxMIHRvIHNlYXJjaCBhbGwgYmxvY2tzCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZldGNoCisgKiBAdiBkYXRhCQlCdWZmZXIgdG8gZmlsbCB3aXRoIHNldHRpbmcgZGF0YQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YSwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworc3RhdGljIGludCBzbWJpb3NfZmV0Y2ggKCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzIF9fdW51c2VkLAorCQkJICBzdHJ1Y3Qgc2V0dGluZyAqc2V0dGluZywKKwkJCSAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3Qgc21iaW9zX3N0cnVjdHVyZSBzdHJ1Y3R1cmU7CisJdW5zaWduZWQgaW50IHRhZ19tYWdpYzsKKwl1bnNpZ25lZCBpbnQgdGFnX3R5cGU7CisJdW5zaWduZWQgaW50IHRhZ19vZmZzZXQ7CisJdW5zaWduZWQgaW50IHRhZ19sZW47CisJaW50IHJjOworCisJLyogU3BsaXQgdGFnIGludG8gdHlwZSwgb2Zmc2V0IGFuZCBsZW5ndGggKi8KKwl0YWdfbWFnaWMgPSAoIHNldHRpbmctPnRhZyA+PiAyNCApOworCXRhZ190eXBlID0gKCAoIHNldHRpbmctPnRhZyA+PiAxNiApICYgMHhmZiApOworCXRhZ19vZmZzZXQgPSAoICggc2V0dGluZy0+dGFnID4+IDggKSAmIDB4ZmYgKTsKKwl0YWdfbGVuID0gKCBzZXR0aW5nLT50YWcgJiAweGZmICk7CisJaWYgKCB0YWdfbWFnaWMgIT0gU01CSU9TX1RBR19NQUdJQyApCisJCXJldHVybiAtRU5PRU5UOworCisJLyogRmluZCBTTUJJT1Mgc3RydWN0dXJlICovCisJaWYgKCAoIHJjID0gZmluZF9zbWJpb3Nfc3RydWN0dXJlICggdGFnX3R5cGUsICZzdHJ1Y3R1cmUgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwl7CisJCXVpbnQ4X3QgYnVmW3N0cnVjdHVyZS5oZWFkZXIubGVuXTsKKworCQkvKiBSZWFkIFNNQklPUyBzdHJ1Y3R1cmUgKi8KKwkJaWYgKCAoIHJjID0gcmVhZF9zbWJpb3Nfc3RydWN0dXJlICggJnN0cnVjdHVyZSwgYnVmLAorCQkJCQkJICAgIHNpemVvZiAoIGJ1ZiApICkgKSAhPSAwICkKKwkJCXJldHVybiByYzsKKworCQlpZiAoIHRhZ19sZW4gPT0gMCApIHsKKwkJCS8qIFN0cmluZyAqLworCQkJcmV0dXJuIHJlYWRfc21iaW9zX3N0cmluZyAoICZzdHJ1Y3R1cmUsCisJCQkJCQkgICAgYnVmW3RhZ19vZmZzZXRdLAorCQkJCQkJICAgIGRhdGEsIGxlbiApOworCQl9IGVsc2UgeworCQkJLyogUmF3IGRhdGEgKi8KKwkJCWlmICggbGVuID4gdGFnX2xlbiApCisJCQkJbGVuID0gdGFnX2xlbjsKKwkJCW1lbWNweSAoIGRhdGEsICZidWZbdGFnX29mZnNldF0sIGxlbiApOworCQkJcmV0dXJuIHRhZ19sZW47CisJCX0KKwl9Cit9CisKKy8qKiBTTUJJT1Mgc2V0dGluZ3Mgb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBzZXR0aW5nc19vcGVyYXRpb25zIHNtYmlvc19zZXR0aW5nc19vcGVyYXRpb25zID0geworCS5mZXRjaCA9IHNtYmlvc19mZXRjaCwKK307CisKKy8qKiBTTUJJT1Mgc2V0dGluZ3MgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2V0dGluZ3Mgc21iaW9zX3NldHRpbmdzID0geworCS5yZWZjbnQgPSBOVUxMLAorCS5uYW1lID0gInNtYmlvcyIsCisJLnRhZ19tYWdpYyA9IFNNQklPU19FTVBUWV9UQUcsCisJLnNpYmxpbmdzID0gTElTVF9IRUFEX0lOSVQgKCBzbWJpb3Nfc2V0dGluZ3Muc2libGluZ3MgKSwKKwkuY2hpbGRyZW4gPSBMSVNUX0hFQURfSU5JVCAoIHNtYmlvc19zZXR0aW5ncy5jaGlsZHJlbiApLAorCS5vcCA9ICZzbWJpb3Nfc2V0dGluZ3Nfb3BlcmF0aW9ucywKK307CisKKy8qKiBJbml0aWFsaXNlIFNNQklPUyBzZXR0aW5ncyAqLworc3RhdGljIHZvaWQgc21iaW9zX2luaXQgKCB2b2lkICkgeworCWludCByYzsKKworCWlmICggKCByYyA9IHJlZ2lzdGVyX3NldHRpbmdzICggJnNtYmlvc19zZXR0aW5ncywgTlVMTCApICkgIT0gMCApIHsKKwkJREJHICggIlNNQklPUyBjb3VsZCBub3QgcmVnaXN0ZXIgc2V0dGluZ3M6ICVzXG4iLAorCQkgICAgICBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoqIFNNQklPUyBzZXR0aW5ncyBpbml0aWFsaXNlciAqLworc3RydWN0IGluaXRfZm4gc21iaW9zX2luaXRfZm4gX19pbml0X2ZuICggSU5JVF9OT1JNQUwgKSA9IHsKKwkuaW5pdGlhbGlzZSA9IHNtYmlvc19pbml0LAorfTsKKworLyoqIFVVSUQgc2V0dGluZyBvYnRhaW5lZCB2aWEgU01CSU9TICovCitzdHJ1Y3Qgc2V0dGluZyB1dWlkX3NldHRpbmcgX19zZXR0aW5nID0geworCS5uYW1lID0gInV1aWQiLAorCS5kZXNjcmlwdGlvbiA9ICJVVUlEIiwKKwkudGFnID0gU01CSU9TX1JBV19UQUcgKCBTTUJJT1NfVFlQRV9TWVNURU1fSU5GT1JNQVRJT04sCisJCQkJc3RydWN0IHNtYmlvc19zeXN0ZW1faW5mb3JtYXRpb24sIHV1aWQgKSwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfdXVpZCwKK307CisKKy8qKiBPdGhlciBTTUJJT1MgbmFtZWQgc2V0dGluZ3MgKi8KK3N0cnVjdCBzZXR0aW5nIHNtYmlvc19uYW1lZF9zZXR0aW5nc1tdIF9fc2V0dGluZyA9IHsKKwl7CisJCS5uYW1lID0gIm1hbnVmYWN0dXJlciIsCisJCS5kZXNjcmlwdGlvbiA9ICJNYW51ZmFjdHVyZXIiLAorCQkudGFnID0gU01CSU9TX1NUUklOR19UQUcgKCBTTUJJT1NfVFlQRV9TWVNURU1fSU5GT1JNQVRJT04sCisJCQkJCSAgIHN0cnVjdCBzbWJpb3Nfc3lzdGVtX2luZm9ybWF0aW9uLAorCQkJCQkgICBtYW51ZmFjdHVyZXIgKSwKKwkJLnR5cGUgPSAmc2V0dGluZ190eXBlX3N0cmluZywKKwl9LAorCXsKKwkJLm5hbWUgPSAicHJvZHVjdCIsCisJCS5kZXNjcmlwdGlvbiA9ICJQcm9kdWN0IG5hbWUiLAorCQkudGFnID0gU01CSU9TX1NUUklOR19UQUcgKCBTTUJJT1NfVFlQRV9TWVNURU1fSU5GT1JNQVRJT04sCisJCQkJCSAgIHN0cnVjdCBzbWJpb3Nfc3lzdGVtX2luZm9ybWF0aW9uLAorCQkJCQkgICBwcm9kdWN0ICksCisJCS50eXBlID0gJnNldHRpbmdfdHlwZV9zdHJpbmcsCisJfSwKKwl7CisJCS5uYW1lID0gInNlcmlhbCIsCisJCS5kZXNjcmlwdGlvbiA9ICJTZXJpYWwgbnVtYmVyIiwKKwkJLnRhZyA9IFNNQklPU19TVFJJTkdfVEFHICggU01CSU9TX1RZUEVfU1lTVEVNX0lORk9STUFUSU9OLAorCQkJCQkgICBzdHJ1Y3Qgc21iaW9zX3N5c3RlbV9pbmZvcm1hdGlvbiwKKwkJCQkJICAgc2VyaWFsICksCisJCS50eXBlID0gJnNldHRpbmdfdHlwZV9zdHJpbmcsCisJfSwKKwl7CisJCS5uYW1lID0gImFzc2V0IiwKKwkJLmRlc2NyaXB0aW9uID0gIkFzc2V0IHRhZyIsCisJCS50YWcgPSBTTUJJT1NfU1RSSU5HX1RBRyAoIFNNQklPU19UWVBFX0VOQ0xPU1VSRV9JTkZPUk1BVElPTiwKKwkJCQkJICAgc3RydWN0IHNtYmlvc19lbmNsb3N1cmVfaW5mb3JtYXRpb24sCisJCQkJCSAgIGFzc2V0X3RhZyApLAorCQkudHlwZSA9ICZzZXR0aW5nX3R5cGVfc3RyaW5nLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbGliZ2NjL19fZGl2ZGkzLmMgYi9ncHhlL3NyYy9saWJnY2MvX19kaXZkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDk3YjExCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbGliZ2NjL19fZGl2ZGkzLmMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX19kaXZkaTMuYworICovCisKKyNpbmNsdWRlICJsaWJnY2MuaCIKKworX19saWJnY2MgaW50NjRfdCBfX2RpdmRpMyhpbnQ2NF90IG51bSwgaW50NjRfdCBkZW4pCit7CisgIGludCBtaW51cyA9IDA7CisgIGludDY0X3QgdjsKKworICBpZiAoIG51bSA8IDAgKSB7CisgICAgbnVtID0gLW51bTsKKyAgICBtaW51cyA9IDE7CisgIH0KKyAgaWYgKCBkZW4gPCAwICkgeworICAgIGRlbiA9IC1kZW47CisgICAgbWludXMgXj0gMTsKKyAgfQorCisgIHYgPSBfX3VkaXZtb2RkaTQobnVtLCBkZW4sIE5VTEwpOworICBpZiAoIG1pbnVzICkKKyAgICB2ID0gLXY7CisKKyAgcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9saWJnY2MvX19tb2RkaTMuYyBiL2dweGUvc3JjL2xpYmdjYy9fX21vZGRpMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NzFiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9saWJnY2MvX19tb2RkaTMuYwpAQCAtMCwwICsxLDI2IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX21vZGRpMy5jCisgKi8KKworI2luY2x1ZGUgImxpYmdjYy5oIgorCitfX2xpYmdjYyBpbnQ2NF90IF9fbW9kZGkzKGludDY0X3QgbnVtLCBpbnQ2NF90IGRlbikKK3sKKyAgaW50IG1pbnVzID0gMDsKKyAgaW50NjRfdCB2OworCisgIGlmICggbnVtIDwgMCApIHsKKyAgICBudW0gPSAtbnVtOworICAgIG1pbnVzID0gMTsKKyAgfQorICBpZiAoIGRlbiA8IDAgKSB7CisgICAgZGVuID0gLWRlbjsKKyAgICBtaW51cyBePSAxOworICB9CisKKyAgKHZvaWQpIF9fdWRpdm1vZGRpNChudW0sIGRlbiwgKHVpbnQ2NF90ICopJnYpOworICBpZiAoIG1pbnVzICkKKyAgICB2ID0gLXY7CisKKyAgcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9saWJnY2MvX191ZGl2ZGkzLmMgYi9ncHhlL3NyYy9saWJnY2MvX191ZGl2ZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhMTRkZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL2xpYmdjYy9fX3VkaXZkaTMuYwpAQCAtMCwwICsxLDEwIEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX2RpdmRpMy5jCisgKi8KKworI2luY2x1ZGUgImxpYmdjYy5oIgorCitfX2xpYmdjYyB1aW50NjRfdCBfX3VkaXZkaTModWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4pCit7CisgIHJldHVybiBfX3VkaXZtb2RkaTQobnVtLCBkZW4sIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbGliZ2NjL19fdWRpdm1vZGRpNC5jIGIvZ3B4ZS9zcmMvbGliZ2NjL19fdWRpdm1vZGRpNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTBkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9saWJnY2MvX191ZGl2bW9kZGk0LmMKQEAgLTAsMCArMSwzMiBAQAorI2luY2x1ZGUgImxpYmdjYy5oIgorCitfX2xpYmdjYyB1aW50NjRfdCBfX3VkaXZtb2RkaTQodWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4sIHVpbnQ2NF90ICpyZW1fcCkKK3sKKyAgdWludDY0X3QgcXVvdCA9IDAsIHFiaXQgPSAxOworCisgIGlmICggZGVuID09IDAgKSB7CisgICAgcmV0dXJuIDEvKCh1bnNpZ25lZClkZW4pOyAvKiBJbnRlbnRpb25hbCBkaXZpZGUgYnkgemVybywgd2l0aG91dAorCQkJCSB0cmlnZ2VyaW5nIGEgY29tcGlsZXIgd2FybmluZyB3aGljaAorCQkJCSB3b3VsZCBhYm9ydCB0aGUgYnVpbGQgKi8KKyAgfQorCisgIC8qIExlZnQtanVzdGlmeSBkZW5vbWluYXRvciBhbmQgY291bnQgc2hpZnQgKi8KKyAgd2hpbGUgKCAoaW50NjRfdClkZW4gPj0gMCApIHsKKyAgICBkZW4gPDw9IDE7CisgICAgcWJpdCA8PD0gMTsKKyAgfQorCisgIHdoaWxlICggcWJpdCApIHsKKyAgICBpZiAoIGRlbiA8PSBudW0gKSB7CisgICAgICBudW0gLT0gZGVuOworICAgICAgcXVvdCArPSBxYml0OworICAgIH0KKyAgICBkZW4gPj49IDE7CisgICAgcWJpdCA+Pj0gMTsKKyAgfQorCisgIGlmICggcmVtX3AgKQorICAgICpyZW1fcCA9IG51bTsKKworICByZXR1cm4gcXVvdDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2xpYmdjYy9fX3Vtb2RkaTMuYyBiL2dweGUvc3JjL2xpYmdjYy9fX3Vtb2RkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjRkYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbGliZ2NjL19fdW1vZGRpMy5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBhcmNoL2kzODYvbGliZ2NjL19fdW1vZGRpMy5jCisgKi8KKworI2luY2x1ZGUgImxpYmdjYy5oIgorCitfX2xpYmdjYyB1aW50NjRfdCBfX3Vtb2RkaTModWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4pCit7CisgIHVpbnQ2NF90IHY7CisKKyAgKHZvaWQpIF9fdWRpdm1vZGRpNChudW0sIGRlbiwgJnYpOworICByZXR1cm4gdjsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2xpYmdjYy9pY2MuYyBiL2dweGUvc3JjL2xpYmdjYy9pY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjdmNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbGliZ2NjL2ljYy5jCkBAIC0wLDAgKzEsOCBAQAorLyoKKyAqIEludGVsJ3MgY29tcGlsZXIgY3JlYXRlcyBhbiBpbXBsaWNpdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gYXQgdGhlCisgKiBzdGFydCBvZiBtYWluKCkuCisgKgorICovCit2b2lkIF9fbGliZ2NjIF9faW50ZWxfbmV3X3Byb2NfaW5pdCAoIHZvaWQgKSB7CisJLyogRG8gbm90aGluZyAqLworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbGliZ2NjL2xpYmdjYy5oIGIvZ3B4ZS9zcmMvbGliZ2NjL2xpYmdjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTliZGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9saWJnY2MvbGliZ2NjLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfTElCR0NDX0gKKyNkZWZpbmUgX0xJQkdDQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworZXh0ZXJuIF9fbGliZ2NjIHVpbnQ2NF90IF9fdWRpdm1vZGRpNCAoIHVpbnQ2NF90IG51bSwgdWludDY0X3QgZGVuLAorCQkJCQl1aW50NjRfdCAqcmVtICk7CitleHRlcm4gX19saWJnY2MgdWludDY0X3QgX191ZGl2ZGkzICAodWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4gKTsKK2V4dGVybiBfX2xpYmdjYyB1aW50NjRfdCBfX3Vtb2RkaTMgKCB1aW50NjRfdCBudW0sIHVpbnQ2NF90IGRlbiApOworZXh0ZXJuIF9fbGliZ2NjIGludDY0X3QgX19kaXZkaTMgKCBpbnQ2NF90IG51bSwgaW50NjRfdCBkZW4gKTsKK2V4dGVybiBfX2xpYmdjYyBpbnQ2NF90IF9fbW9kZGkzICggaW50NjRfdCBudW0sIGludDY0X3QgZGVuICk7CisKKyNlbmRpZiAvKiBfTElCR0NDX0ggKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL2xpYmdjYy9tZW1jcHkuYyBiL2dweGUvc3JjL2xpYmdjYy9tZW1jcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOThiNzgzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbGliZ2NjL21lbWNweS5jCkBAIC0wLDAgKzEsMTggQEAKKy8qKiBAZmlsZQorICoKKyAqIGdjYyBzb21ldGltZXMgbGlrZXMgdG8gaW5zZXJ0IGltcGxpY2l0IGNhbGxzIHRvIG1lbWNweSgpLgorICogVW5mb3J0dW5hdGVseSwgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSB3YXkgdG8gcHJldmVudCBpdCBmcm9tCisgKiBkb2luZyB0aGlzLCBvciB0byBmb3JjZSBpdCB0byB1c2UgdGhlIG9wdGltaXNlZCBtZW1jcHkoKSBhcyBzZWVuIGJ5CisgKiBDIGNvZGU7IGl0IGluc2lzdHMgb24gaW5zZXJ0aW5nIGEgc3ltYm9sIHJlZmVyZW5jZSB0byAibWVtY3B5Ii4gIFdlCisgKiB0aGVyZWZvcmUgaW5jbHVkZSB3cmFwcGVyIGZ1bmN0aW9ucyBqdXN0IHRvIGtlZXAgZ2NjIGhhcHB5LgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgKiBnY2NfaW1wbGljaXRfbWVtY3B5ICggdm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLAorCQkJICAgICBzaXplX3QgbGVuICkgYXNtICggIm1lbWNweSIgKTsKKwordm9pZCAqIGdjY19pbXBsaWNpdF9tZW1jcHkgKCB2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4gKSB7CisJcmV0dXJuIG1lbWNweSAoIGRlc3QsIHNyYywgbGVuICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvODAyMTEvbmV0ODAyMTEuYyBiL2dweGUvc3JjL25ldC84MDIxMS9uZXQ4MDIxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTQ1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvODAyMTEvbmV0ODAyMTEuYwpAQCAtMCwwICsxLDI4MjkgQEAKKy8qCisgKiBUaGUgZ1BYRSA4MDIuMTEgTUFDIGxheWVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0Pi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxncHhlL3NldHRpbmdzLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9hcnAuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvbmV0ODAyMTEuaD4KKyNpbmNsdWRlIDxncHhlL3NlYzgwMjExLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorI2luY2x1ZGUgPGdweGUvbmFwLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyoqIEBmaWxlCisgKgorICogODAyLjExIGRldmljZSBtYW5hZ2VtZW50CisgKi8KKworLyogRGlzYW1iaWd1YXRlIHRoZSBFSU5WQUwncyBhIGJpdCAqLworI2RlZmluZSBFSU5WQUxfUEtUX1RPT19TSE9SVAkoIEVJTlZBTCB8IEVVTklRXzAxICkKKyNkZWZpbmUgRUlOVkFMX1BLVF9WRVJTSU9OCSggRUlOVkFMIHwgRVVOSVFfMDIgKQorI2RlZmluZSBFSU5WQUxfUEtUX05PVF9EQVRBCSggRUlOVkFMIHwgRVVOSVFfMDMgKQorI2RlZmluZSBFSU5WQUxfUEtUX05PVF9GUk9NRFMJKCBFSU5WQUwgfCBFVU5JUV8wNCApCisjZGVmaW5lIEVJTlZBTF9QS1RfTExDX0hFQURFUgkoIEVJTlZBTCB8IEVVTklRXzA1ICkKKyNkZWZpbmUgRUlOVkFMX0NSWVBUT19SRVFVRVNUCSggRUlOVkFMIHwgRVVOSVFfMDYgKQorI2RlZmluZSBFSU5WQUxfQUNUSVZFX1NDQU4JKCBFSU5WQUwgfCBFVU5JUV8wNyApCisKKy8qCisgKiA4MDIuMTEgZXJyb3IgY29kZXM6IFRoZSBBUCBjYW4gZ2l2ZSB1cyBhIHN0YXR1cyBjb2RlIGV4cGxhaW5pbmcgd2h5CisgKiBhdXRoZW50aWNhdGlvbiBmYWlsZWQsIG9yIGEgcmVhc29uIGNvZGUgZXhwbGFpbmluZyB3aHkgd2Ugd2VyZQorICogZGVhdXRoZW50aWNhdGVkL2Rpc2Fzc29jaWF0ZWQuIFRoZXNlIGNvZGVzIHJhbmdlIGZyb20gMC02MyAodGhlCisgKiBmaWVsZCBpcyAxNiBiaXRzIHdpZGUsIGJ1dCBvbmx5IHVwIHRvIDQ1IG9yIHNvIGFyZSBkZWZpbmVkIHlldDsgd2UKKyAqIGFsbG93IHVwIHRvIDYzIGZvciBleHRlbnNpYmlsaXR5KS4gVGhpcyBpcyBlbmNvZGVkIGludG8gYW4gZXJyb3IKKyAqIGNvZGUgYXMgc3VjaDoKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzICYgMHgxZiBnb2VzIGhlcmUgLS12di0tCisgKiAgIFN0YXR1cyBjb2RlIDAtMzE6ICBFQ09OTlJFRlVTRUQgfCBFVU5JUV8oc3RhdHVzICYgMHgxZikgKDBlMWE2MDM4KQorICogICBTdGF0dXMgY29kZSAzMi02MzogRUhPU1RVTlJFQUNIIHwgRVVOSVFfKHN0YXR1cyAmIDB4MWYpICgxNzFhNjAxMSkKKyAqICAgUmVhc29uIGNvZGUgMC0zMTogIEVDT05OUkVTRVQgfCBFVU5JUV8ocmVhc29uICYgMHgxZikgICAoMGYxYTYwMzkpCisgKiAgIFJlYXNvbiBjb2RlIDMyLTYzOiBFTkVUUkVTRVQgfCBFVU5JUV8ocmVhc29uICYgMHgxZikgICAgKDI3MWE2MDAxKQorICoKKyAqIFRoZSBQT1NJWCBlcnJvciBjb2RlcyBtb3JlIG9yIGxlc3MgY29udmV5IHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlCisgKiAoc3RhdHVzIGNvZGVzIG9jY3VyIHdoZW4gd2UgY2FuJ3QgYXNzb2NpYXRlIGF0IGFsbCwgcmVhc29uIGNvZGVzCisgKiB3aGVuIHdlIGxvc2UgYXNzb2NpYXRpb24gdW5leHBlY3RlZGx5KSBhbmQgbGV0IHVzIGV4dHJhY3QgdGhlCisgKiBjb21wbGV0ZSA4MDIuMTEgZXJyb3IgY29kZSBmcm9tIHRoZSByYyB2YWx1ZS4KKyAqLworCisvKiogTWFrZSByZXR1cm4gc3RhdHVzIGNvZGUgZnJvbSA4MDIuMTEgc3RhdHVzIGNvZGUgKi8KKyNkZWZpbmUgRTgwMjExX1NUQVRVUyggc3RhdCApICAoICgoc3RhdCAmIDB4MjApPyBFSE9TVFVOUkVBQ0ggOiBFQ09OTlJFRlVTRUQpIFwKKwkJCQkJfCAoKHN0YXQgJiAweDFmKSA8PCA4KSApCisKKy8qKiBNYWtlIHJldHVybiBzdGF0dXMgY29kZSBmcm9tIDgwMi4xMSByZWFzb24gY29kZSAqLworI2RlZmluZSBFODAyMTFfUkVBU09OKCByZWFzICkgICggKChyZWFzICYgMHgyMCk/IEVORVRSRVNFVCA6IEVDT05OUkVTRVQpIFwKKwkJCQkJfCAoKHJlYXMgJiAweDFmKSA8PCA4KSApCisKKworLyoqIExpc3Qgb2YgODAyLjExIGRldmljZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIG5ldDgwMjExX2RldmljZXMgPSBMSVNUX0hFQURfSU5JVCAoIG5ldDgwMjExX2RldmljZXMgKTsKKworLyoqIFNldCBvZiBkZXZpY2Ugb3BlcmF0aW9ucyB0aGF0IGRvZXMgbm90aGluZyAqLworc3RhdGljIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2Vfb3BlcmF0aW9ucyBuZXQ4MDIxMV9udWxsX29wczsKKworLyoqIEluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHJlY2VpdmVkIG1hbmFnZW1lbnQgcGFja2V0CisgKgorICogVGhpcyBpcyB1c2VkIHRvIGtlZXAgYmVhY29uIHNpZ25hbCBzdHJlbmd0aHMgaW4gYSBwYXJhbGxlbCBxdWV1ZSB0bworICogdGhlIGJlYWNvbnMgdGhlbXNlbHZlcy4KKyAqLworc3RydWN0IG5ldDgwMjExX3J4X2luZm8geworCWludCBzaWduYWw7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworLyoqIENvbnRleHQgZm9yIGEgcHJvYmUgb3BlcmF0aW9uICovCitzdHJ1Y3QgbmV0ODAyMTFfcHJvYmVfY3R4IHsKKwkvKiogODAyLjExIGRldmljZSB0byBwcm9iZSBvbiAqLworCXN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldjsKKworCS8qKiBWYWx1ZSBvZiBrZWVwX21nbXQgYmVmb3JlIHByb2JlIHdhcyBzdGFydGVkICovCisJaW50IG9sZF9rZWVwX21nbXQ7CisKKwkvKiogSWYgc2Nhbm5pbmcgYWN0aXZlbHksIHBvaW50ZXIgdG8gcHJvYmUgcGFja2V0IHRvIHNlbmQgKi8KKwlzdHJ1Y3QgaW9fYnVmZmVyICpwcm9iZTsKKworCS8qKiBJZiBub24tIiIsIHRoZSBFU1NJRCB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gKi8KKwljb25zdCBjaGFyICplc3NpZDsKKworCS8qKiBUaW1lIHByb2JlIHdhcyBzdGFydGVkICovCisJdTMyIHRpY2tzX3N0YXJ0OworCisJLyoqIFRpbWUgbGFzdCB1c2VmdWwgYmVhY29uIHdhcyByZWNlaXZlZCAqLworCXUzMiB0aWNrc19iZWFjb247CisKKwkvKiogVGltZSBjaGFubmVsIHdhcyBsYXN0IGNoYW5nZWQgKi8KKwl1MzIgdGlja3NfY2hhbm5lbDsKKworCS8qKiBUaW1lIHRvIHN0YXkgb24gZWFjaCBjaGFubmVsICovCisJdTMyIGhvcF90aW1lOworCisJLyoqIENoYW5uZWxzIHRvIGhvcCBieSB3aGVuIGNoYW5naW5nIGNoYW5uZWwgKi8KKwlpbnQgaG9wX3N0ZXA7CisKKwkvKiogTGlzdCBvZiBiZXN0IGJlYWNvbnMgZm9yIGVhY2ggbmV0d29yayBmb3VuZCBzbyBmYXIgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICpiZWFjb25zOworfTsKKworLyoqIENvbnRleHQgZm9yIHRoZSBhc3NvY2lhdGlvbiB0YXNrICovCitzdHJ1Y3QgbmV0ODAyMTFfYXNzb2NfY3R4IHsKKwkvKiogTmV4dCBhdXRoZW50aWNhdGlvbiBtZXRob2QgdG8gdHJ5IHVzaW5nICovCisJaW50IG1ldGhvZDsKKworCS8qKiBUaW1lIChpbiB0aWNrcykgb2YgdGhlIGxhc3Qgc2VudCBhc3NvY2lhdGlvbi1yZWxhdGVkIHBhY2tldCAqLworCWludCBsYXN0X3BhY2tldDsKKworCS8qKiBOdW1iZXIgb2YgdGltZXMgd2UgaGF2ZSB0cmllZCBzZW5kaW5nIGl0ICovCisJaW50IHRpbWVzX3RyaWVkOworfTsKKworLyoqCisgKiBAZGVmZ3JvdXAgbmV0ODAyMTFfbmV0ZGV2IE5ldHdvcmsgZGV2aWNlIGludGVyZmFjZSBmdW5jdGlvbnMKKyAqIEB7CisgKi8KK3N0YXRpYyBpbnQgbmV0ODAyMTFfbmV0ZGV2X29wZW4gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9uZXRkZXZfY2xvc2UgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CitzdGF0aWMgaW50IG5ldDgwMjExX25ldGRldl90cmFuc21pdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKTsKK3N0YXRpYyB2b2lkIG5ldDgwMjExX25ldGRldl9wb2xsICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOworc3RhdGljIHZvaWQgbmV0ODAyMTFfbmV0ZGV2X2lycSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBlbmFibGUgKTsKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBuZXQ4MDIxMV9saW5rbGF5ZXIgODAyLjExIGxpbmstbGF5ZXIgcHJvdG9jb2wgZnVuY3Rpb25zCisgKiBAeworICovCitzdGF0aWMgaW50IG5ldDgwMjExX2xsX3B1c2ggKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGNvbnN0IHZvaWQgKmxsX2Rlc3QsCisJCQkgICAgICBjb25zdCB2b2lkICpsbF9zb3VyY2UsIHVpbnQxNl90IG5ldF9wcm90byApOworc3RhdGljIGludCBuZXQ4MDIxMV9sbF9wdWxsICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBjb25zdCB2b2lkICoqbGxfZGVzdCwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKipsbF9zb3VyY2UsIHVpbnQxNl90ICogbmV0X3Byb3RvICk7CisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbmV0ODAyMTFfaGVscCA4MDIuMTEgaGVscGVyIGZ1bmN0aW9ucworICogQHsKKyAqLworc3RhdGljIHZvaWQgbmV0ODAyMTFfYWRkX2NoYW5uZWxzICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgc3RhcnQsCisJCQkJICAgIGludCBsZW4sIGludCB0eHBvd2VyICk7CitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9maWx0ZXJfaHdfY2hhbm5lbHMgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyB2b2lkIG5ldDgwMjExX3NldF9ydHNjdHNfcmF0ZSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApOworc3RhdGljIGludCBuZXQ4MDIxMV9wcm9jZXNzX2NhcGFiICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCSAgICB1MTYgY2FwYWIgKTsKK3N0YXRpYyBpbnQgbmV0ODAyMTFfcHJvY2Vzc19pZSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCQkgdW5pb24gaWVlZTgwMjExX2llICppZSwgdm9pZCAqaWVfZW5kICk7CitzdGF0aWMgdW5pb24gaWVlZTgwMjExX2llICoKK25ldDgwMjExX21hcnNoYWxfcmVxdWVzdF9pbmZvICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCXVuaW9uIGllZWU4MDIxMV9pZSAqaWUgKTsKKy8qKiBAfSAqLworCisvKioKKyAqIEBkZWZncm91cCBuZXQ4MDIxMV9hc3NvY19sbCA4MDIuMTEgYXNzb2NpYXRpb24gaGFuZGxpbmcgZnVuY3Rpb25zCisgKiBAeworICovCitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9zdGVwX2Fzc29jaWF0ZSAoIHN0cnVjdCBwcm9jZXNzICpwcm9jICk7CitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9oYW5kbGVfYXV0aCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2IgKTsKK3N0YXRpYyB2b2lkIG5ldDgwMjExX2hhbmRsZV9hc3NvY19yZXBseSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgaW9fYnVmZmVyICppb2IgKTsKK3N0YXRpYyBpbnQgbmV0ODAyMTFfc2VuZF9kaXNhc3NvYyAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IHJlYXNvbiwKKwkJCQkgICAgaW50IGRlYXV0aCApOworc3RhdGljIHZvaWQgbmV0ODAyMTFfaGFuZGxlX21nbXQgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGlvX2J1ZmZlciAqaW9iLCBpbnQgc2lnbmFsICk7CisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbmV0ODAyMTFfZnJhZyA4MDIuMTEgZnJhZ21lbnQgaGFuZGxpbmcgZnVuY3Rpb25zCisgKiBAeworICovCitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9mcmVlX2ZyYWdzICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgZmNpZCApOworc3RhdGljIHN0cnVjdCBpb19idWZmZXIgKm5ldDgwMjExX2FjY3VtX2ZyYWdzICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCQkJaW50IGZjaWQsIGludCBuZnJhZ3MsIGludCBzaXplICk7CitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9yeF9mcmFnICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYiwgaW50IHNpZ25hbCApOworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIG5ldDgwMjExX3NldHRpbmdzIDgwMi4xMSBzZXR0aW5ncyBoYW5kbGVycworICogQHsKKyAqLworc3RhdGljIGludCBuZXQ4MDIxMV9jaGVja19zZXR0aW5nc191cGRhdGUgKCB2b2lkICk7CisKKy8qKiA4MDIuMTEgc2V0dGluZ3MgYXBwbGljYXRvcgorICoKKyAqIFdoZW4gdGhlIFNTSUQgaXMgY2hhbmdlZCwgdGhpcyB3aWxsIGNhdXNlIGFueSBvcGVuIGRldmljZXMgdG8KKyAqIHJlLWFzc29jaWF0ZTsgd2hlbiB0aGUgZW5jcnlwdGlvbiBrZXkgaXMgY2hhbmdlZCwgd2Ugc2ltaWxhcmx5CisgKiB1cGRhdGUgdGhlaXIgc3RhdGUuCisgKi8KK3N0cnVjdCBzZXR0aW5nc19hcHBsaWNhdG9yIG5ldDgwMjExX2FwcGxpY2F0b3IgX19zZXR0aW5nc19hcHBsaWNhdG9yID0geworCS5hcHBseSA9IG5ldDgwMjExX2NoZWNrX3NldHRpbmdzX3VwZGF0ZSwKK307CisKKy8qKiBUaGUgbmV0d29yayBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoCisgKgorICogSWYgdGhpcyBpcyBibGFuaywgd2Ugc2NhbiBmb3IgYWxsIG5ldHdvcmtzIGFuZCB1c2UgdGhlIG9uZSB3aXRoIHRoZQorICogZ3JlYXRlc3Qgc2lnbmFsIHN0cmVuZ3RoLgorICovCitzdHJ1Y3Qgc2V0dGluZyBuZXQ4MDIxMV9zc2lkX3NldHRpbmcgX19zZXR0aW5nID0geworCS5uYW1lID0gInNzaWQiLAorCS5kZXNjcmlwdGlvbiA9ICI4MDIuMTEgU1NJRCAobmV0d29yayBuYW1lKSIsCisJLnR5cGUgPSAmc2V0dGluZ190eXBlX3N0cmluZywKK307CisKKy8qKiBXaGV0aGVyIHRvIHVzZSBhY3RpdmUgc2Nhbm5pbmcKKyAqCisgKiBJbiBvcmRlciB0byBhc3NvY2lhdGUgd2l0aCBhIGhpZGRlbiBTU0lELCBpdCdzIG5lY2Vzc2FyeSB0byB1c2UgYW4KKyAqIGFjdGl2ZSBzY2FuIChzZW5kIHByb2JlIHBhY2tldHMpLiBJZiB0aGlzIHNldHRpbmcgaXMgbm9uemVybywgYW4KKyAqIGFjdGl2ZSBzY2FuIG9uIHRoZSAyLjRHSHogYmFuZCB3aWxsIGJlIHVzZWQgdG8gYXNzb2NpYXRlLgorICovCitzdHJ1Y3Qgc2V0dGluZyBuZXQ4MDIxMV9hY3RpdmVfc2V0dGluZyBfX3NldHRpbmcgPSB7CisJLm5hbWUgPSAiYWN0aXZlLXNjYW4iLAorCS5kZXNjcmlwdGlvbiA9ICJVc2UgYW4gYWN0aXZlIHNjYW4gZHVyaW5nIDgwMi4xMSBhc3NvY2lhdGlvbiIsCisJLnR5cGUgPSAmc2V0dGluZ190eXBlX2ludDgsCit9OworCisvKiogVGhlIGNyeXB0b2dyYXBoaWMga2V5IHRvIHVzZQorICoKKyAqIEZvciBoZXggV0VQIGtleXMsIGFzIGlzIGNvbW1vbiwgdGhpcyBtdXN0IGJlIGVudGVyZWQgdXNpbmcgdGhlCisgKiBub3JtYWwgZ1BYRSBtZXRob2QgZm9yIGVudGVyaW5nIGhleCBzZXR0aW5nczsgYW4gQVNDSUkgc3RyaW5nIG9mCisgKiBoZXggY2hhcmFjdGVycyB3aWxsIG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQuCisgKi8KK3N0cnVjdCBzZXR0aW5nIG5ldDgwMjExX2tleV9zZXR0aW5nIF9fc2V0dGluZyA9IHsKKwkubmFtZSA9ICJrZXkiLAorCS5kZXNjcmlwdGlvbiA9ICJFbmNyeXB0aW9uIGtleSBmb3IgcHJvdGVjdGVkIDgwMi4xMSBuZXR3b3JrcyIsCisJLnR5cGUgPSAmc2V0dGluZ190eXBlX3N0cmluZywKK307CisKKy8qKiBAfSAqLworCisKKy8qIC0tLS0tLS0tLS0gbmV0X2RldmljZSB3cmFwcGVyIC0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBPcGVuIDgwMi4xMSBkZXZpY2UgYW5kIHN0YXJ0IGFzc29jaWF0aW9uCisgKgorICogQHYgbmV0ZGV2CVdyYXBwaW5nIG5ldHdvcmsgZGV2aWNlCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgc2V0cyB1cCBhIGRlZmF1bHQgY29uc2VydmF0aXZlIHNldCBvZiBjaGFubmVscyBmb3IgcHJvYmluZywKKyAqIGFuZCBzdGFydHMgdGhlIGF1dG8tYXNzb2NpYXRpb24gdGFzayB1bmxlc3MgdGhlIEBjCisgKiBORVQ4MDIxMV9OT19BU1NPQyBmbGFnIGlzIHNldCBpbiB0aGUgd3JhcHBlZCA4MDIuMTEgZGV2aWNlJ3MgQGMKKyAqIHN0YXRlIGZpZWxkLgorICovCitzdGF0aWMgaW50IG5ldDgwMjExX25ldGRldl9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApCit7CisJc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ID0gbmV0ZGV2LT5wcml2OworCWludCByYyA9IDA7CisKKwlpZiAoIGRldi0+b3AgPT0gJm5ldDgwMjExX251bGxfb3BzICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIGRldi0+b3AtPm9wZW4gKQorCQlyYyA9IGRldi0+b3AtPm9wZW4gKCBkZXYgKTsKKworCWlmICggcmMgPCAwICkKKwkJcmV0dXJuIHJjOworCisJaWYgKCAhICggZGV2LT5zdGF0ZSAmIE5FVDgwMjExX05PX0FTU09DICkgKQorCQluZXQ4MDIxMV9hdXRvYXNzb2NpYXRlICggZGV2ICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDbG9zZSA4MDIuMTEgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CVdyYXBwaW5nIG5ldHdvcmsgZGV2aWNlLgorICoKKyAqIElmIHRoZSBhc3NvY2lhdGlvbiB0YXNrIGlzIHJ1bm5pbmcsIHRoaXMgd2lsbCBzdG9wIGl0LgorICovCitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9uZXRkZXZfY2xvc2UgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgPSBuZXRkZXYtPnByaXY7CisKKwlpZiAoIGRldi0+c3RhdGUgJiBORVQ4MDIxMV9XT1JLSU5HICkKKwkJcHJvY2Vzc19kZWwgKCAmZGV2LT5wcm9jX2Fzc29jICk7CisKKwkvKiBTZW5kIGRpc2Fzc29jaWF0aW9uIGZyYW1lIHRvIEFQLCB0byBiZSBwb2xpdGUgKi8KKwlpZiAoIGRldi0+c3RhdGUgJiBORVQ4MDIxMV9BU1NPQ0lBVEVEICkKKwkJbmV0ODAyMTFfc2VuZF9kaXNhc3NvYyAoIGRldiwgSUVFRTgwMjExX1JFQVNPTl9MRUFWSU5HLCAwICk7CisKKwlpZiAoIGRldi0+aGFuZHNoYWtlciAmJiBkZXYtPmhhbmRzaGFrZXItPnN0b3AgJiYKKwkgICAgIGRldi0+aGFuZHNoYWtlci0+c3RhcnRlZCApCisJCWRldi0+aGFuZHNoYWtlci0+c3RvcCAoIGRldiApOworCisJZnJlZSAoIGRldi0+Y3J5cHRvICk7CisJZnJlZSAoIGRldi0+aGFuZHNoYWtlciApOworCWRldi0+Y3J5cHRvID0gTlVMTDsKKwlkZXYtPmhhbmRzaGFrZXIgPSBOVUxMOworCisJbmV0ZGV2X2xpbmtfZG93biAoIG5ldGRldiApOworCWRldi0+c3RhdGUgPSAwOworCisJaWYgKCBkZXYtPm9wLT5jbG9zZSApCisJCWRldi0+b3AtPmNsb3NlICggZGV2ICk7Cit9CisKKy8qKgorICogVHJhbnNtaXQgcGFja2V0IG9uIDgwMi4xMSBkZXZpY2UKKyAqCisgKiBAdiBuZXRkZXYJV3JhcHBpbmcgbmV0d29yayBkZXZpY2UKKyAqIEB2IGlvYnVmCUkvTyBidWZmZXIKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogSWYgZW5jcnlwdGlvbiBpcyBlbmFibGVkIGZvciB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgbmV0d29yaywgdGhlCisgKiBwYWNrZXQgd2lsbCBiZSBlbmNyeXB0ZWQgcHJpb3IgdG8gdHJhbnNtaXNzaW9uLgorICovCitzdGF0aWMgaW50IG5ldDgwMjExX25ldGRldl90cmFuc21pdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKQoreworCXN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICpoZHIgPSBpb2J1Zi0+ZGF0YTsKKwlpbnQgcmMgPSAtRU5PU1lTOworCisJaWYgKCBkZXYtPmNyeXB0byAmJiAhICggaGRyLT5mYyAmIElFRUU4MDIxMV9GQ19QUk9URUNURUQgKSAmJgorCSAgICAgKCAoIGhkci0+ZmMgJiBJRUVFODAyMTFfRkNfVFlQRSApID09IElFRUU4MDIxMV9UWVBFX0RBVEEgKSApIHsKKwkJc3RydWN0IGlvX2J1ZmZlciAqbmlvYiA9IGRldi0+Y3J5cHRvLT5lbmNyeXB0ICggZGV2LT5jcnlwdG8sCisJCQkJCQkJCWlvYnVmICk7CisJCWlmICggISBuaW9iICkKKwkJCXJldHVybiAtRU5PTUVNOwkvKiBvbmx5IHJlYXNvbiBlbmNyeXB0aW9uIGNvdWxkIGZhaWwgKi8KKworCQkvKiBGcmVlIHRoZSBub24tZW5jcnlwdGVkIGlvYiAqLworCQluZXRkZXZfdHhfY29tcGxldGUgKCBuZXRkZXYsIGlvYnVmICk7CisKKwkJLyogVHJhbnNtaXQgdGhlIGVuY3J5cHRlZCBpb2I7IHRoZSBQcm90ZWN0ZWQgZmxhZyBpcworCQkgICBzZXQsIHNvIHdlIHdvbid0IHJlY3Vyc2UgaW50byBoZXJlIGFnYWluICovCisJCW5ldGRldl90eCAoIG5ldGRldiwgbmlvYiApOworCisJCS8qIERvbid0IHRyYW5zbWl0IHRoZSBmcmVlZCBwYWNrZXQgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCBkZXYtPm9wLT50cmFuc21pdCApCisJCXJjID0gZGV2LT5vcC0+dHJhbnNtaXQgKCBkZXYsIGlvYnVmICk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUG9sbCA4MDIuMTEgZGV2aWNlIGZvciByZWNlaXZlZCBwYWNrZXRzIGFuZCBjb21wbGV0ZWQgdHJhbnNtaXNzaW9ucworICoKKyAqIEB2IG5ldGRldglXcmFwcGluZyBuZXR3b3JrIGRldmljZQorICovCitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9uZXRkZXZfcG9sbCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKQoreworCXN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiA9IG5ldGRldi0+cHJpdjsKKworCWlmICggZGV2LT5vcC0+cG9sbCApCisJCWRldi0+b3AtPnBvbGwgKCBkZXYgKTsKK30KKworLyoqCisgKiBFbmFibGUgb3IgZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciA4MDIuMTEgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CVdyYXBwaW5nIG5ldHdvcmsgZGV2aWNlCisgKiBAdiBlbmFibGUJV2hldGhlciB0byBlbmFibGUgaW50ZXJydXB0cworICovCitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9uZXRkZXZfaXJxICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGVuYWJsZSApCit7CisJc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ID0gbmV0ZGV2LT5wcml2OworCisJaWYgKCBkZXYtPm9wLT5pcnEgKQorCQlkZXYtPm9wLT5pcnEgKCBkZXYsIGVuYWJsZSApOworfQorCisvKiogTmV0d29yayBkZXZpY2Ugb3BlcmF0aW9ucyBmb3IgYSB3cmFwcGVkIDgwMi4xMSBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcGVyYXRpb25zIG5ldDgwMjExX25ldGRldl9vcHMgPSB7CisJLm9wZW4gPSBuZXQ4MDIxMV9uZXRkZXZfb3BlbiwKKwkuY2xvc2UgPSBuZXQ4MDIxMV9uZXRkZXZfY2xvc2UsCisJLnRyYW5zbWl0ID0gbmV0ODAyMTFfbmV0ZGV2X3RyYW5zbWl0LAorCS5wb2xsID0gbmV0ODAyMTFfbmV0ZGV2X3BvbGwsCisJLmlycSA9IG5ldDgwMjExX25ldGRldl9pcnEsCit9OworCisKKy8qIC0tLS0tLS0tLS0gODAyLjExIGxpbmstbGF5ZXIgcHJvdG9jb2wgLS0tLS0tLS0tLSAqLworCisvKiogODAyLjExIGJyb2FkY2FzdCBNQUMgYWRkcmVzcyAqLworc3RhdGljIHU4IG5ldDgwMjExX2xsX2Jyb2FkY2FzdFtdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisKKy8qKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYSB0cmFuc21pc3Npb24gcmF0ZSB1c2VzIEVSUC9PRkRNCisgKgorICogQHYgcmF0ZQlSYXRlIGluIDEwMCBrYnBzIHVuaXRzCisgKiBAcmV0IGlzX2VycAlUUlVFIGlmIHRoZSByYXRlIGlzIGFuIEVSUC9PRkRNIHJhdGUKKyAqCisgKiA4MDIuMTFiIHN1cHBvcnRzIHJhdGVzIG9mIDEuMCwgMi4wLCA1LjUsIGFuZCAxMS4wIE1icHM7IGFueSBvdGhlcgorICogcmF0ZSB0aGFuIHRoZXNlIG9uIHRoZSAyLjRHSHogc3BlY3RydW0gaXMgYW4gRVJQICg4MDIuMTFnKSByYXRlLgorICovCitzdGF0aWMgaW5saW5lIGludCBuZXQ4MDIxMV9yYXRlX2lzX2VycCAoIHUxNiByYXRlICkKK3sKKwlpZiAoIHJhdGUgPT0gMTAgfHwgcmF0ZSA9PSAyMCB8fCByYXRlID09IDU1IHx8IHJhdGUgPT0gMTEwICkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKworLyoqCisgKiBDYWxjdWxhdGUgb25lIGZyYW1lJ3MgY29udHJpYnV0aW9uIHRvIDgwMi4xMSBkdXJhdGlvbiBmaWVsZAorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBieXRlcwlBbW91bnQgb2YgZGF0YSB0byBjYWxjdWxhdGUgZHVyYXRpb24gZm9yCisgKiBAcmV0IGR1cglEdXJhdGlvbiBmaWVsZCBpbiBtaWNyb3NlY29uZHMKKyAqCisgKiBUbyBhdm9pZCBtdWx0aXBsZSBzdGF0aW9ucyBhdHRlbXB0aW5nIHRvIHRyYW5zbWl0IGF0IG9uY2UsIDgwMi4xMQorICogcHJvdmlkZXMgdGhhdCBldmVyeSBwYWNrZXQgc2hhbGwgaW5jbHVkZSBhIGR1cmF0aW9uIGZpZWxkCisgKiBzcGVjaWZ5aW5nIGEgbGVuZ3RoIG9mIHRpbWUgZm9yIHdoaWNoIHRoZSB3aXJlbGVzcyBtZWRpdW0gd2lsbCBiZQorICogcmVzZXJ2ZWQgYWZ0ZXIgaXQgaXMgdHJhbnNtaXR0ZWQuIFRoZSBkdXJhdGlvbiBpcyBtZWFzdXJlZCBpbgorICogbWljcm9zZWNvbmRzIGFuZCBpcyBjYWxjdWxhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudAorICogcGh5c2ljYWwtbGF5ZXIgcGFyYW1ldGVycyBvZiB0aGUgODAyLjExIGRldmljZS4KKyAqCisgKiBGb3IgYW4gdW5mcmFnbWVudGVkIGRhdGEgb3IgbWFuYWdlbWVudCBmcmFtZSwgb3IgdGhlIGxhc3QgZnJhZ21lbnQKKyAqIG9mIGEgZnJhZ21lbnRlZCBmcmFtZSwgdGhlIGR1cmF0aW9uIGNhcHR1cmVzIG9ubHkgdGhlIDEwIGRhdGEgYnl0ZXMKKyAqIG9mIG9uZSBBQ0s7IGNhbGwgb25jZSB3aXRoIGJ5dGVzID0gMTAuCisgKgorICogRm9yIGEgZnJhZ21lbnQgb2YgYSBkYXRhIG9yIG1hbmFnZW1lbnQgcmFtZSB0aGF0IHdpbGwgYmUgZm9sbG93ZWQKKyAqIGJ5IG1vcmUgZnJhZ21lbnRzLCB0aGUgZHVyYXRpb24gY2FwdHVyZXMgYW4gQUNLLCB0aGUgZm9sbG93aW5nCisgKiBmcmFnbWVudCwgYW5kIGl0cyBBQ0s7IGFkZCB0aGUgcmVzdWx0cyBvZiB0aHJlZSBjYWxscywgdHdvIHdpdGgKKyAqIGJ5dGVzID0gMTAgYW5kIG9uZSB3aXRoIGJ5dGVzIHNldCB0byB0aGUgbmV4dCBmcmFnbWVudCdzIHNpemUuCisgKgorICogRm9yIGFuIFJUUyBjb250cm9sIGZyYW1lLCB0aGUgZHVyYXRpb24gY2FwdHVyZXMgdGhlIHJlc3BvbmRpbmcgQ1RTLAorICogdGhlIGZyYW1lIGJlaW5nIHNlbnQsIGFuZCBpdHMgQUNLOyBhZGQgdGhlIHJlc3VsdHMgb2YgdGhyZWUgY2FsbHMsCisgKiB0d28gd2l0aCBieXRlcyA9IDEwIGFuZCBvbmUgd2l0aCBieXRlcyBzZXQgdG8gdGhlIG5leHQgZnJhbWUncyBzaXplCisgKiAoYXNzdW1pbmcgdW5mcmFnbWVudGVkKS4KKyAqCisgKiBGb3IgYSBDVFMtdG8tc2VsZiBjb250cm9sIGZyYW1lLCB0aGUgZHVyYXRpb24gY2FwdHVyZXMgdGhlIGZyYW1lCisgKiBiZWluZyBwcm90ZWN0ZWQgYW5kIGl0cyBBQ0s7IGFkZCB0aGUgcmVzdWx0cyBvZiB0d28gY2FsbHMsIG9uZSB3aXRoCisgKiBieXRlcyA9IDEwIGFuZCBvbmUgd2l0aCBieXRlcyBzZXQgdG8gdGhlIG5leHQgZnJhbWUncyBzaXplLgorICoKKyAqIE5vIG90aGVyIGZyYW1lIHR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IGdQWEUuCisgKi8KK3UxNiBuZXQ4MDIxMV9kdXJhdGlvbiAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IGJ5dGVzLCB1MTYgcmF0ZSApCit7CisJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW4gPSAmZGV2LT5jaGFubmVsc1tkZXYtPmNoYW5uZWxdOworCXUzMiBrYnBzID0gcmF0ZSAqIDEwMDsKKworCWlmICggY2hhbi0+YmFuZCA9PSBORVQ4MDIxMV9CQU5EXzVHSFogfHwgbmV0ODAyMTFfcmF0ZV9pc19lcnAgKCByYXRlICkgKSB7CisJCS8qIE9GRE0gZW5jb2RpbmcgKDgwMi4xMWEvZykgKi8KKwkJaW50IGJpdHNfcGVyX3N5bWJvbCA9ICgga2JwcyAqIDQgKSAvIDEwMDA7CS8qIDR1cy9zeW1ib2wgKi8KKwkJaW50IGJpdHMgPSAyMiArICggYnl0ZXMgPDwgMyApOwkvKiAyMi1iaXQgUExDUCAqLworCQlpbnQgc3ltYm9scyA9ICggYml0cyArIGJpdHNfcGVyX3N5bWJvbCAtIDEgKSAvIGJpdHNfcGVyX3N5bWJvbDsKKworCQlyZXR1cm4gMTYgKyAyMCArICggc3ltYm9scyAqIDQgKTsgLyogMTZ1cyBTSUZTLCAyMHVzIHByZWFtYmxlICovCisJfSBlbHNlIHsKKwkJLyogQ0NLIGVuY29kaW5nICg4MDIuMTFiKSAqLworCQlpbnQgcGh5X3RpbWUgPSAxNDQgKyA0ODsJLyogcHJlYW1ibGUgKyBQTENQICovCisJCWludCBiaXRzID0gYnl0ZXMgPDwgMzsKKwkJaW50IGRhdGFfdGltZSA9ICggYml0cyAqIDEwMDAgKyBrYnBzIC0gMSApIC8ga2JwczsKKworCQlpZiAoIGRldi0+cGh5X2ZsYWdzICYgTkVUODAyMTFfUEhZX1VTRV9TSE9SVF9QUkVBTUJMRSApCisJCQlwaHlfdGltZSA+Pj0gMTsKKworCQlyZXR1cm4gMTAgKyBwaHlfdGltZSArIGRhdGFfdGltZTsgLyogMTB1cyBTSUZTICovCisJfQorfQorCisvKioKKyAqIEFkZCA4MDIuMTEgbGluay1sYXllciBoZWFkZXIKKyAqCisgKiBAdiBuZXRkZXYJCVdyYXBwaW5nIG5ldHdvcmsgZGV2aWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbGxfZGVzdAkJTGluay1sYXllciBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiBAdiBsbF9zb3VyY2UJCUxpbmstbGF5ZXIgc291cmNlIGFkZHJlc3MKKyAqIEB2IG5ldF9wcm90bwkJTmV0d29yay1sYXllciBwcm90b2NvbCwgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGlzIGFkZHMgYm90aCB0aGUgODAyLjExIGZyYW1lIGhlYWRlciBhbmQgdGhlIDgwMi4yIExMQy9TTkFQCisgKiBoZWFkZXIgdXNlZCBvbiBkYXRhIHBhY2tldHMuCisgKgorICogV2UgYWxzbyBjaGVjayBoZXJlIGZvciBzdGF0ZSBvZiB0aGUgbGluayB0aGF0IHdvdWxkIG1ha2UgaXQgaW52YWxpZAorICogdG8gc2VuZCBhIGRhdGEgcGFja2V0OyBldmVyeSBkYXRhIHBhY2tldCBtdXN0IHBhc3MgdGhyb3VnaCBoZXJlLAorICogYW5kIG5vIG5vbi1kYXRhIHBhY2tldCAoZS5nLiBtYW5hZ2VtZW50IGZyYW1lKSBzaG91bGQuCisgKi8KK3N0YXRpYyBpbnQgbmV0ODAyMTFfbGxfcHVzaCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwgY29uc3Qgdm9pZCAqbGxfZGVzdCwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmxsX3NvdXJjZSwgdWludDE2X3QgbmV0X3Byb3RvICkKK3sKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqaGRyID0gaW9iX3B1c2ggKCBpb2J1ZiwKKwkJCQkJCSBJRUVFODAyMTFfTExDX0hFQURFUl9MRU4gKworCQkJCQkJIElFRUU4MDIxMV9UWVBfRlJBTUVfSEVBREVSX0xFTiApOworCXN0cnVjdCBpZWVlODAyMTFfbGxjX3NuYXBfaGVhZGVyICpsaGRyID0KKwkJKCB2b2lkICogKSBoZHIgKyBJRUVFODAyMTFfVFlQX0ZSQU1FX0hFQURFUl9MRU47CisKKwkvKiBXZSBjYW4ndCBzZW5kIGRhdGEgcGFja2V0cyBpZiB3ZSdyZSBub3QgYXNzb2NpYXRlZC4gKi8KKwlpZiAoICEgKCBkZXYtPnN0YXRlICYgTkVUODAyMTFfQVNTT0NJQVRFRCApICkgeworCQlpZiAoIGRldi0+YXNzb2NfcmMgKQorCQkJcmV0dXJuIGRldi0+YXNzb2NfcmM7CisJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisJfQorCisJaGRyLT5mYyA9IElFRUU4MDIxMV9USElTX1ZFUlNJT04gfCBJRUVFODAyMTFfVFlQRV9EQVRBIHwKKwkgICAgSUVFRTgwMjExX1NUWVBFX0RBVEEgfCBJRUVFODAyMTFfRkNfVE9EUzsKKworCS8qIFdlIGRvbid0IHNlbmQgZnJhZ21lbnRlZCBmcmFtZXMsIHNvIGR1cmF0aW9uIGlzIHRoZSB0aW1lCisJICAgZm9yIGFuIFNJRlMgKyAxMC1ieXRlIEFDSy4gKi8KKwloZHItPmR1cmF0aW9uID0gbmV0ODAyMTFfZHVyYXRpb24gKCBkZXYsIDEwLCBkZXYtPnJhdGVzW2Rldi0+cmF0ZV0gKTsKKworCW1lbWNweSAoIGhkci0+YWRkcjEsIGRldi0+YnNzaWQsIEVUSF9BTEVOICk7CisJbWVtY3B5ICggaGRyLT5hZGRyMiwgbGxfc291cmNlLCBFVEhfQUxFTiApOworCW1lbWNweSAoIGhkci0+YWRkcjMsIGxsX2Rlc3QsIEVUSF9BTEVOICk7CisKKwloZHItPnNlcSA9IElFRUU4MDIxMV9NQUtFU0VRICggKytkZXYtPmxhc3RfdHhfc2VxbnIsIDAgKTsKKworCWxoZHItPmRzYXAgPSBJRUVFODAyMTFfTExDX0RTQVA7CisJbGhkci0+c3NhcCA9IElFRUU4MDIxMV9MTENfU1NBUDsKKwlsaGRyLT5jdHJsID0gSUVFRTgwMjExX0xMQ19DVFJMOworCW1lbXNldCAoIGxoZHItPm91aSwgMHgwMCwgMyApOworCWxoZHItPmV0aGVydHlwZSA9IG5ldF9wcm90bzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlbW92ZSA4MDIuMTEgbGluay1sYXllciBoZWFkZXIKKyAqCisgKiBAdiBuZXRkZXYJCVdyYXBwaW5nIG5ldHdvcmsgZGV2aWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCBsbF9kZXN0CQlMaW5rLWxheWVyIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEByZXQgbGxfc291cmNlCUxpbmstbGF5ZXIgc291cmNlCisgKiBAcmV0IG5ldF9wcm90bwlOZXR3b3JrLWxheWVyIHByb3RvY29sLCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgZXhwZWN0cyBhbmQgcmVtb3ZlcyBib3RoIHRoZSA4MDIuMTEgZnJhbWUgaGVhZGVyIGFuZCB0aGUgODAyLjIKKyAqIExMQy9TTkFQIGhlYWRlciB0aGF0IGFyZSB1c2VkIG9uIGRhdGEgcGFja2V0cy4KKyAqLworc3RhdGljIGludCBuZXQ4MDIxMV9sbF9wdWxsICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiBfX3VudXNlZCwKKwkJCSAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJICAgICAgY29uc3Qgdm9pZCAqKmxsX2Rlc3QsIGNvbnN0IHZvaWQgKipsbF9zb3VyY2UsCisJCQkgICAgICB1aW50MTZfdCAqIG5ldF9wcm90byApCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqaGRyID0gaW9idWYtPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9sbGNfc25hcF9oZWFkZXIgKmxoZHIgPQorCQkoIHZvaWQgKiApIGhkciArIElFRUU4MDIxMV9UWVBfRlJBTUVfSEVBREVSX0xFTjsKKworCS8qIEJ1bmNoIG9mIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoIGlvYl9sZW4gKCBpb2J1ZiApIDwgSUVFRTgwMjExX1RZUF9GUkFNRV9IRUFERVJfTEVOICsKKwkgICAgIElFRUU4MDIxMV9MTENfSEVBREVSX0xFTiApIHsKKwkJREJHQyAoIG5ldGRldi0+cHJpdiwgIjgwMi4xMSAlcCBwYWNrZXQgdG9vIHNob3J0ICglemQgYnl0ZXMpXG4iLAorCQkgICAgICAgbmV0ZGV2LT5wcml2LCBpb2JfbGVuICggaW9idWYgKSApOworCQlyZXR1cm4gLUVJTlZBTF9QS1RfVE9PX1NIT1JUOworCX0KKworCWlmICggKCBoZHItPmZjICYgSUVFRTgwMjExX0ZDX1ZFUlNJT04gKSAhPSBJRUVFODAyMTFfVEhJU19WRVJTSU9OICkgeworCQlEQkdDICggbmV0ZGV2LT5wcml2LCAiODAyLjExICVwIHBhY2tldCBpbnZhbGlkIHZlcnNpb24gJTA0eFxuIiwKKwkJICAgICAgIG5ldGRldi0+cHJpdiwgaGRyLT5mYyAmIElFRUU4MDIxMV9GQ19WRVJTSU9OICk7CisJCXJldHVybiAtRUlOVkFMX1BLVF9WRVJTSU9OOworCX0KKworCWlmICggKCBoZHItPmZjICYgSUVFRTgwMjExX0ZDX1RZUEUgKSAhPSBJRUVFODAyMTFfVFlQRV9EQVRBIHx8CisJICAgICAoIGhkci0+ZmMgJiBJRUVFODAyMTFfRkNfU1VCVFlQRSApICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBICkgeworCQlEQkdDICggbmV0ZGV2LT5wcml2LCAiODAyLjExICVwIHBhY2tldCBub3QgZGF0YS9kYXRhIChmYz0lMDR4KVxuIiwKKwkJICAgICAgIG5ldGRldi0+cHJpdiwgaGRyLT5mYyApOworCQlyZXR1cm4gLUVJTlZBTF9QS1RfTk9UX0RBVEE7CisJfQorCisJaWYgKCAoIGhkci0+ZmMgJiAoIElFRUU4MDIxMV9GQ19UT0RTIHwgSUVFRTgwMjExX0ZDX0ZST01EUyApICkgIT0KKwkgICAgIElFRUU4MDIxMV9GQ19GUk9NRFMgKSB7CisJCURCR0MgKCBuZXRkZXYtPnByaXYsICI4MDIuMTEgJXAgcGFja2V0IG5vdCBmcm9tIERTIChmYz0lMDR4KVxuIiwKKwkJICAgICAgIG5ldGRldi0+cHJpdiwgaGRyLT5mYyApOworCQlyZXR1cm4gLUVJTlZBTF9QS1RfTk9UX0ZST01EUzsKKwl9CisKKwlpZiAoIGxoZHItPmRzYXAgIT0gSUVFRTgwMjExX0xMQ19EU0FQIHx8IGxoZHItPnNzYXAgIT0gSUVFRTgwMjExX0xMQ19TU0FQIHx8CisJICAgICBsaGRyLT5jdHJsICE9IElFRUU4MDIxMV9MTENfQ1RSTCB8fCBsaGRyLT5vdWlbMF0gfHwgbGhkci0+b3VpWzFdIHx8CisJICAgICBsaGRyLT5vdWlbMl0gKSB7CisJCURCR0MgKCBuZXRkZXYtPnByaXYsICI4MDIuMTEgJXAgTExDIGhlYWRlciBpcyBub3QgcGxhaW4gRXRoZXJUeXBlICIKKwkJICAgICAgICJlbmNhcHN1bGF0b3I6ICUwMngtPiUwMnggWyUwMnhdICUwMng6JTAyeDolMDJ4ICUwNHhcbiIsCisJCSAgICAgICBuZXRkZXYtPnByaXYsIGxoZHItPmRzYXAsIGxoZHItPnNzYXAsIGxoZHItPmN0cmwsCisJCSAgICAgICBsaGRyLT5vdWlbMF0sIGxoZHItPm91aVsxXSwgbGhkci0+b3VpWzJdLCBsaGRyLT5ldGhlcnR5cGUgKTsKKwkJcmV0dXJuIC1FSU5WQUxfUEtUX0xMQ19IRUFERVI7CisJfQorCisJaW9iX3B1bGwgKCBpb2J1Ziwgc2l6ZW9mICggKmhkciApICsgc2l6ZW9mICggKmxoZHIgKSApOworCisJKmxsX2Rlc3QgPSBoZHItPmFkZHIxOworCSpsbF9zb3VyY2UgPSBoZHItPmFkZHIzOworCSpuZXRfcHJvdG8gPSBsaGRyLT5ldGhlcnR5cGU7CisJcmV0dXJuIDA7Cit9CisKKy8qKiA4MDIuMTEgbGluay1sYXllciBwcm90b2NvbCAqLworc3RhdGljIHN0cnVjdCBsbF9wcm90b2NvbCBuZXQ4MDIxMV9sbF9wcm90b2NvbCBfX2xsX3Byb3RvY29sID0geworCS5uYW1lID0gIjgwMi4xMSIsCisJLnB1c2ggPSBuZXQ4MDIxMV9sbF9wdXNoLAorCS5wdWxsID0gbmV0ODAyMTFfbGxfcHVsbCwKKwkuaW5pdF9hZGRyID0gZXRoX2luaXRfYWRkciwKKwkubnRvYSA9IGV0aF9udG9hLAorCS5tY19oYXNoID0gZXRoX21jX2hhc2gsCisJLmV0aF9hZGRyID0gZXRoX2V0aF9hZGRyLAorCS5sbF9wcm90byA9IGh0b25zICggQVJQSFJEX0VUSEVSICksCS8qICJlbmNhcHN1bGF0ZWQgRXRoZXJuZXQiICovCisJLmh3X2FkZHJfbGVuID0gRVRIX0FMRU4sCisJLmxsX2FkZHJfbGVuID0gRVRIX0FMRU4sCisJLmxsX2hlYWRlcl9sZW4gPSBJRUVFODAyMTFfVFlQX0ZSQU1FX0hFQURFUl9MRU4gKworCQkJCUlFRUU4MDIxMV9MTENfSEVBREVSX0xFTiwKK307CisKKworLyogLS0tLS0tLS0tLSA4MDIuMTEgbmV0d29yayBtYW5hZ2VtZW50IEFQSSAtLS0tLS0tLS0tICovCisKKy8qKgorICogR2V0IDgwMi4xMSBkZXZpY2UgZnJvbSB3cmFwcGluZyBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldglXcmFwcGluZyBuZXR3b3JrIGRldmljZQorICogQHJldCBkZXYJODAyLjExIGRldmljZSB3cmFwcGVkIGJ5IG5ldHdvcmsgZGV2aWNlLCBvciBOVUxMCisgKgorICogUmV0dXJucyBOVUxMIGlmIHRoZSBuZXR3b3JrIGRldmljZSBkb2VzIG5vdCB3cmFwIGFuIDgwMi4xMSBkZXZpY2UuCisgKi8KK3N0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKiBuZXQ4MDIxMV9nZXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggZGV2LCAmbmV0ODAyMTFfZGV2aWNlcywgbGlzdCApIHsKKwkJaWYgKCBuZXRkZXYtPnByaXYgPT0gZGV2ICkKKwkJCXJldHVybiBuZXRkZXYtPnByaXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogU2V0IHN0YXRlIG9mIDgwMi4xMSBkZXZpY2Uga2VlcGluZyBtYW5hZ2VtZW50IGZyYW1lcworICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBlbmFibGUJV2hldGhlciB0byBrZWVwIG1hbmFnZW1lbnQgZnJhbWVzCisgKiBAcmV0IG9sZGVuYWIJV2hldGhlciBtYW5hZ2VtZW50IGZyYW1lcyB3ZXJlIGVuYWJsZWQgYmVmb3JlIHRoaXMgY2FsbAorICoKKyAqIElmIGVuYWJsZSBpcyBUUlVFLCBiZWFjb24sIHByb2JlLCBhbmQgYWN0aW9uIGZyYW1lcyB3aWxsIGJlIGtlcHQKKyAqIGFuZCBtYXkgYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgbmV0ODAyMTFfbWdtdF9kZXF1ZXVlKCkuCisgKi8KK2ludCBuZXQ4MDIxMV9rZWVwX21nbXQgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCBlbmFibGUgKQoreworCWludCBvbGRlbmFiID0gZGV2LT5rZWVwX21nbXQ7CisKKwlkZXYtPmtlZXBfbWdtdCA9IGVuYWJsZTsKKwlyZXR1cm4gb2xkZW5hYjsKK30KKworLyoqCisgKiBHZXQgODAyLjExIG1hbmFnZW1lbnQgZnJhbWUKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHJldCBzaWduYWwJU2lnbmFsIHN0cmVuZ3RoIG9mIHJldHVybmVkIG1hbmFnZW1lbnQgZnJhbWUKKyAqIEByZXQgaW9iCUkvTyBidWZmZXIsIG9yIE5VTEwgaWYgbm8gbWFuYWdlbWVudCBmcmFtZSBpcyBxdWV1ZWQKKyAqCisgKiBGcmFtZXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaWYKKyAqIG5ldDgwMjExX2tlZXBfbWdtdCgpIGhhcyBiZWVuIHByZXZpb3VzbHkgY2FsbGVkIHdpdGggZW5hYmxlIHNldCB0bworICogVFJVRS4KKyAqCisgKiBUaGUgY2FsbGluZyBmdW5jdGlvbiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIEkvTyBidWZmZXIuCisgKi8KK3N0cnVjdCBpb19idWZmZXIgKiBuZXQ4MDIxMV9tZ210X2RlcXVldWUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkJCSAgIGludCAqc2lnbmFsICkKK3sKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwlzdHJ1Y3QgbmV0ODAyMTFfcnhfaW5mbyAqcnhpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIHJ4aSwgJmRldi0+bWdtdF9pbmZvX3F1ZXVlLCBsaXN0ICkgeworCQlsaXN0X2RlbCAoICZyeGktPmxpc3QgKTsKKwkJaWYgKCBzaWduYWwgKQorCQkJKnNpZ25hbCA9IHJ4aS0+c2lnbmFsOworCQlmcmVlICggcnhpICk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIGlvYnVmLCAmZGV2LT5tZ210X3F1ZXVlLCBsaXN0ICkgeworCQkJbGlzdF9kZWwgKCAmaW9idWYtPmxpc3QgKTsKKwkJCXJldHVybiBpb2J1ZjsKKwkJfQorCQlhc3NlcnQgKCAwICk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogVHJhbnNtaXQgODAyLjExIG1hbmFnZW1lbnQgZnJhbWUKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgZmMJRnJhbWUgQ29udHJvbCBmbGFncyBmb3IgbWFuYWdlbWVudCBmcmFtZQorICogQHYgZGVzdAlEZXN0aW5hdGlvbiBhY2Nlc3MgcG9pbnQKKyAqIEB2IGlvYglJL08gYnVmZmVyCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoZSBAYSBmYyBhcmd1bWVudCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgYW4gSUVFRSA4MDIuMTEgbWFuYWdlbWVudAorICogc3VidHlwZSBudW1iZXIgKGUuZy4gSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSkuIElmIGl0IGNvbnRhaW5zCisgKiBJRUVFODAyMTFfRkNfUFJPVEVDVEVELCB0aGUgZnJhbWUgd2lsbCBiZSBlbmNyeXB0ZWQgcHJpb3IgdG8KKyAqIHRyYW5zbWlzc2lvbi4KKyAqCisgKiBJdCBpcyByZXF1aXJlZCB0aGF0IEBhIGlvYiBoYXZlIGF0IGxlYXN0IDI0IGJ5dGVzIG9mIGhlYWRyb29tCisgKiByZXNlcnZlZCBiZWZvcmUgaXRzIGRhdGEgc3RhcnQuCisgKi8KK2ludCBuZXQ4MDIxMV90eF9tZ210ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCB1MTYgZmMsIHU4IGRlc3RbNl0sCisJCSAgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2IgKQoreworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKmhkciA9IGlvYl9wdXNoICggaW9iLAorCQkJCQkJIElFRUU4MDIxMV9UWVBfRlJBTUVfSEVBREVSX0xFTiApOworCisJaGRyLT5mYyA9IElFRUU4MDIxMV9USElTX1ZFUlNJT04gfCBJRUVFODAyMTFfVFlQRV9NR01UIHwKKwkgICAgKCBmYyAmIH5JRUVFODAyMTFfRkNfUFJPVEVDVEVEICk7CisJaGRyLT5kdXJhdGlvbiA9IG5ldDgwMjExX2R1cmF0aW9uICggZGV2LCAxMCwgZGV2LT5yYXRlc1tkZXYtPnJhdGVdICk7CisJaGRyLT5zZXEgPSBJRUVFODAyMTFfTUFLRVNFUSAoICsrZGV2LT5sYXN0X3R4X3NlcW5yLCAwICk7CisKKwltZW1jcHkgKCBoZHItPmFkZHIxLCBkZXN0LCBFVEhfQUxFTiApOwkvKiBEQSA9IFJBICovCisJbWVtY3B5ICggaGRyLT5hZGRyMiwgZGV2LT5uZXRkZXYtPmxsX2FkZHIsIEVUSF9BTEVOICk7CS8qIFNBID0gVEEgKi8KKwltZW1jcHkgKCBoZHItPmFkZHIzLCBkZXN0LCBFVEhfQUxFTiApOwkvKiBCU1NJRCAqLworCisJaWYgKCBmYyAmIElFRUU4MDIxMV9GQ19QUk9URUNURUQgKSB7CisJCWlmICggISBkZXYtPmNyeXB0byApCisJCQlyZXR1cm4gLUVJTlZBTF9DUllQVE9fUkVRVUVTVDsKKworCQlzdHJ1Y3QgaW9fYnVmZmVyICplaW9iID0gZGV2LT5jcnlwdG8tPmVuY3J5cHQgKCBkZXYtPmNyeXB0bywKKwkJCQkJCQkJaW9iICk7CisJCWZyZWVfaW9iICggaW9iICk7CisJCWlvYiA9IGVpb2I7CisJfQorCisJcmV0dXJuIG5ldGRldl90eCAoIGRldi0+bmV0ZGV2LCBpb2IgKTsKK30KKworCisvKiAtLS0tLS0tLS0tIERyaXZlciBBUEkgLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEFsbG9jYXRlIDgwMi4xMSBkZXZpY2UKKyAqCisgKiBAdiBwcml2X3NpemUJCVNpemUgb2YgZHJpdmVyLXByaXZhdGUgYWxsb2NhdGlvbiBhcmVhCisgKiBAcmV0IGRldgkJTmV3bHkgYWxsb2NhdGVkIDgwMi4xMSBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG5ldF9kZXZpY2Ugd2l0aCBzcGFjZSBpbiBpdHMgcHJpdmF0ZSBhcmVhCisgKiBmb3IgYm90aCB0aGUgbmV0ODAyMTFfZGV2aWNlIGl0IHdpbGwgd3JhcCBhbmQgdGhlIGRyaXZlci1wcml2YXRlCisgKiBkYXRhIHNwYWNlIHJlcXVlc3RlZC4gSXQgaW5pdGlhbGl6ZXMgdGhlIGxpbmstbGF5ZXItc3BlY2lmaWMgcGFydHMKKyAqIG9mIHRoZSBuZXRfZGV2aWNlLCBhbmQgbGlua3MgdGhlIG5ldDgwMjExX2RldmljZSB0byB0aGUgbmV0X2RldmljZQorICogYXBwcm9wcmlhdGVseS4KKyAqLworc3RydWN0IG5ldDgwMjExX2RldmljZSAqIG5ldDgwMjExX2FsbG9jICggc2l6ZV90IHByaXZfc2l6ZSApCit7CisJc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPQorCQlhbGxvY19uZXRkZXYgKCBzaXplb2YgKCAqZGV2ICkgKyBwcml2X3NpemUgKTsKKworCWlmICggISBuZXRkZXYgKQorCQlyZXR1cm4gTlVMTDsKKworCW5ldGRldi0+bGxfcHJvdG9jb2wgPSAmbmV0ODAyMTFfbGxfcHJvdG9jb2w7CisJbmV0ZGV2LT5sbF9icm9hZGNhc3QgPSBuZXQ4MDIxMV9sbF9icm9hZGNhc3Q7CisJbmV0ZGV2LT5tYXhfcGt0X2xlbiA9IElFRUU4MDIxMV9NQVhfREFUQV9MRU47CisJbmV0ZGV2X2luaXQgKCBuZXRkZXYsICZuZXQ4MDIxMV9uZXRkZXZfb3BzICk7CisKKwlkZXYgPSBuZXRkZXYtPnByaXY7CisJZGV2LT5uZXRkZXYgPSBuZXRkZXY7CisJZGV2LT5wcml2ID0gKCB1OCAqICkgZGV2ICsgc2l6ZW9mICggKmRldiApOworCWRldi0+b3AgPSAmbmV0ODAyMTFfbnVsbF9vcHM7CisKKwlwcm9jZXNzX2luaXRfc3RvcHBlZCAoICZkZXYtPnByb2NfYXNzb2MsIG5ldDgwMjExX3N0ZXBfYXNzb2NpYXRlLAorCQkJICAgICAgICZuZXRkZXYtPnJlZmNudCApOworCUlOSVRfTElTVF9IRUFEICggJmRldi0+bWdtdF9xdWV1ZSApOworCUlOSVRfTElTVF9IRUFEICggJmRldi0+bWdtdF9pbmZvX3F1ZXVlICk7CisKKwlyZXR1cm4gZGV2OworfQorCisvKioKKyAqIFJlZ2lzdGVyIDgwMi4xMSBkZXZpY2Ugd2l0aCBuZXR3b3JrIHN0YWNrCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IG9wcwk4MDIuMTEgZGV2aWNlIG9wZXJhdGlvbnMKKyAqIEB2IGh3CTgwMi4xMSBoYXJkd2FyZSBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgYWxzbyByZWdpc3RlcnMgdGhlIHdyYXBwaW5nIG5ldF9kZXZpY2Ugd2l0aCB0aGUgaGlnaGVyIG5ldHdvcmsKKyAqIGxheWVycy4KKyAqLworaW50IG5ldDgwMjExX3JlZ2lzdGVyICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJc3RydWN0IG5ldDgwMjExX2RldmljZV9vcGVyYXRpb25zICpvcHMsCisJCQlzdHJ1Y3QgbmV0ODAyMTFfaHdfaW5mbyAqaHcgKQoreworCWRldi0+b3AgPSBvcHM7CisJZGV2LT5odyA9IG1hbGxvYyAoIHNpemVvZiAoICpodyApICk7CisJaWYgKCAhIGRldi0+aHcgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweSAoIGRldi0+aHcsIGh3LCBzaXplb2YgKCAqaHcgKSApOworCW1lbWNweSAoIGRldi0+bmV0ZGV2LT5od19hZGRyLCBody0+aHdhZGRyLCBFVEhfQUxFTiApOworCisJLyogU2V0IHNvbWUgc2Vuc2libGUgY2hhbm5lbCBkZWZhdWx0cyBmb3IgZHJpdmVyJ3Mgb3BlbigpIGZ1bmN0aW9uICovCisJbWVtY3B5ICggZGV2LT5jaGFubmVscywgZGV2LT5ody0+Y2hhbm5lbHMsCisJCSBORVQ4MDIxMV9NQVhfQ0hBTk5FTFMgKiBzaXplb2YgKCBkZXYtPmNoYW5uZWxzWzBdICkgKTsKKwlkZXYtPmNoYW5uZWwgPSAwOworCisJbGlzdF9hZGRfdGFpbCAoICZkZXYtPmxpc3QsICZuZXQ4MDIxMV9kZXZpY2VzICk7CisJcmV0dXJuIHJlZ2lzdGVyX25ldGRldiAoIGRldi0+bmV0ZGV2ICk7Cit9CisKKy8qKgorICogVW5yZWdpc3RlciA4MDIuMTEgZGV2aWNlIGZyb20gbmV0d29yayBzdGFjaworICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKgorICogQWZ0ZXIgdGhpcyBjYWxsLCB0aGUgZGV2aWNlIG9wZXJhdGlvbnMgYXJlIGNsZWFyZWQgc28gdGhhdCB0aGV5CisgKiB3aWxsIG5vdCBiZSBjYWxsZWQuCisgKi8KK3ZvaWQgbmV0ODAyMTFfdW5yZWdpc3RlciAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYgKCBkZXYtPm5ldGRldiApOworCWxpc3RfZGVsICggJmRldi0+bGlzdCApOworCWRldi0+b3AgPSAmbmV0ODAyMTFfbnVsbF9vcHM7Cit9CisKKy8qKgorICogRnJlZSA4MDIuMTEgZGV2aWNlCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqCisgKiBUaGUgZGV2aWNlIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCit2b2lkIG5ldDgwMjExX2ZyZWUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKQoreworCWZyZWUgKCBkZXYtPmh3ICk7CisJcmM4MDIxMV9mcmVlICggZGV2LT5yY3RsICk7CisJbmV0ZGV2X251bGxpZnkgKCBkZXYtPm5ldGRldiApOworCW5ldGRldl9wdXQgKCBkZXYtPm5ldGRldiApOworfQorCisKKy8qIC0tLS0tLS0tLS0gODAyLjExIG5ldHdvcmsgbWFuYWdlbWVudCB3b3JraG9yc2UgY29kZSAtLS0tLS0tLS0tICovCisKKy8qKgorICogU2V0IHN0YXRlIG9mIDgwMi4xMSBkZXZpY2UKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgY2xlYXIJQml0bWFzayBvZiBmbGFncyB0byBjbGVhcgorICogQHYgc2V0CUJpdG1hc2sgb2YgZmxhZ3MgdG8gc2V0CisgKiBAdiBzdGF0dXMJU3RhdHVzIG9yIHJlYXNvbiBjb2RlIGZvciBtb3N0IHJlY2VudCBvcGVyYXRpb24KKyAqCisgKiBJZiBAYSBzdGF0dXMgcmVwcmVzZW50cyBhIHJlYXNvbiBjb2RlLCBpdCBzaG91bGQgYmUgT1InZWQgd2l0aAorICogTkVUODAyMTFfSVNfUkVBU09OLgorICoKKyAqIENsZWFyaW5nIGF1dGhlbnRpY2F0aW9uIGFsc28gY2xlYXJzIGFzc29jaWF0aW9uOyBjbGVhcmluZworICogYXNzb2NpYXRpb24gYWxzbyBjbGVhcnMgc2VjdXJpdHkgaGFuZHNoYWtpbmcgc3RhdGUuIENsZWFyaW5nCisgKiBhc3NvY2lhdGlvbiByZW1vdmVzIHRoZSBsaW5rLXVwIGZsYWcgZnJvbSB0aGUgd3JhcHBpbmcgbmV0X2RldmljZSwKKyAqIGJ1dCBzZXR0aW5nIGl0IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBmbGFnOyB0aGF0IGlzIGxlZnQgdG8KKyAqIHRoZSBqdWRnbWVudCBvZiBoaWdoZXItbGV2ZWwgY29kZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG5ldDgwMjExX3NldF9zdGF0ZSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCQkJc2hvcnQgY2xlYXIsIHNob3J0IHNldCwKKwkJCQkJdTE2IHN0YXR1cyApCit7CisJLyogVGhlIGNvbmRpdGlvbnMgaW4gdGhpcyBmdW5jdGlvbiBhcmUgZGVsaWJlcmF0ZWx5IGZvcm11bGF0ZWQKKwkgICB0byBiZSBkZWNpZGFibGUgYXQgY29tcGlsZS10aW1lIGluIG1vc3QgY2FzZXMuIFNpbmNlIGNsZWFyCisJICAgYW5kIHNldCBhcmUgZ2VuZXJhbGx5IHBhc3NlZCBhcyBjb25zdGFudHMsIHRoZSBib2R5IG9mIHRoaXMKKwkgICBmdW5jdGlvbiBjYW4gYmUgcmVkdWNlZCBkb3duIHRvIGEgZmV3IHN0YXRlbWVudHMgYnkgdGhlCisJICAgY29tcGlsZXIuICovCisKKwljb25zdCBpbnQgc3RhdG1zayA9IE5FVDgwMjExX1NUQVRVU19NQVNLIHwgTkVUODAyMTFfSVNfUkVBU09OOworCisJaWYgKCBjbGVhciAmIE5FVDgwMjExX1BST0JFRCApCisJCWNsZWFyIHw9IE5FVDgwMjExX0FVVEhFTlRJQ0FURUQ7CisKKwlpZiAoIGNsZWFyICYgTkVUODAyMTFfQVVUSEVOVElDQVRFRCApCisJCWNsZWFyIHw9IE5FVDgwMjExX0FTU09DSUFURUQ7CisKKwlpZiAoIGNsZWFyICYgTkVUODAyMTFfQVNTT0NJQVRFRCApCisJCWNsZWFyIHw9IE5FVDgwMjExX0NSWVBUT19TWU5DRUQ7CisKKwlkZXYtPnN0YXRlID0gKCBkZXYtPnN0YXRlICYgfmNsZWFyICkgfCBzZXQ7CisJZGV2LT5zdGF0ZSA9ICggZGV2LT5zdGF0ZSAmIH5zdGF0bXNrICkgfCAoIHN0YXR1cyAmIHN0YXRtc2sgKTsKKworCWlmICggY2xlYXIgJiBORVQ4MDIxMV9BU1NPQ0lBVEVEICkKKwkJbmV0ZGV2X2xpbmtfZG93biAoIGRldi0+bmV0ZGV2ICk7CisKKwlpZiAoICggY2xlYXIgfCBzZXQgKSAmIE5FVDgwMjExX0FTU09DSUFURUQgKQorCQlkZXYtPm9wLT5jb25maWcgKCBkZXYsIE5FVDgwMjExX0NGR19BU1NPQyApOworCisJaWYgKCBzdGF0dXMgIT0gMCApIHsKKwkJaWYgKCBzdGF0dXMgJiBORVQ4MDIxMV9JU19SRUFTT04gKQorCQkJZGV2LT5hc3NvY19yYyA9IC1FODAyMTFfUkVBU09OICggc3RhdHVzICk7CisJCWVsc2UKKwkJCWRldi0+YXNzb2NfcmMgPSAtRTgwMjExX1NUQVRVUyAoIHN0YXR1cyApOworCQluZXRkZXZfbGlua19lcnIgKCBkZXYtPm5ldGRldiwgZGV2LT5hc3NvY19yYyApOworCX0KK30KKworLyoqCisgKiBBZGQgY2hhbm5lbHMgdG8gODAyLjExIGRldmljZQorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBzdGFydAlGaXJzdCBjaGFubmVsIG51bWJlciB0byBhZGQKKyAqIEB2IGxlbglOdW1iZXIgb2YgY2hhbm5lbHMgdG8gYWRkCisgKiBAdiB0eHBvd2VyCVRYIHBvd2VyIChkQm0pIHRvIGFsbG93IG9uIGFkZGVkIGNoYW5uZWxzCisgKgorICogVG8gcmVwbGFjZSB0aGUgY3VycmVudCBsaXN0IG9mIGNoYW5uZWxzIGluc3RlYWQgb2YgYWRkaW5nIHRvIGl0LAorICogc2V0IHRoZSBucl9jaGFubmVscyBmaWVsZCBvZiB0aGUgODAyLjExIGRldmljZSB0byAwIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9hZGRfY2hhbm5lbHMgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCBzdGFydCwKKwkJCQkgICAgaW50IGxlbiwgaW50IHR4cG93ZXIgKQoreworCWludCBpLCBjaGFuID0gc3RhcnQ7CisKKwlmb3IgKCBpID0gZGV2LT5ucl9jaGFubmVsczsgbGVuLS0gJiYgaSA8IE5FVDgwMjExX01BWF9DSEFOTkVMUzsgaSsrICkgeworCQlkZXYtPmNoYW5uZWxzW2ldLmNoYW5uZWxfbnIgPSBjaGFuOworCQlkZXYtPmNoYW5uZWxzW2ldLm1heHBvd2VyID0gdHhwb3dlcjsKKwkJZGV2LT5jaGFubmVsc1tpXS5od192YWx1ZSA9IDA7CisKKwkJaWYgKCBjaGFuID49IDEgJiYgY2hhbiA8PSAxNCApIHsKKwkJCWRldi0+Y2hhbm5lbHNbaV0uYmFuZCA9IE5FVDgwMjExX0JBTkRfMkdIWjsKKwkJCWlmICggY2hhbiA9PSAxNCApCisJCQkJZGV2LT5jaGFubmVsc1tpXS5jZW50ZXJfZnJlcSA9IDI0ODQ7CisJCQllbHNlCisJCQkJZGV2LT5jaGFubmVsc1tpXS5jZW50ZXJfZnJlcSA9IDI0MDcgKyA1ICogY2hhbjsKKwkJCWNoYW4rKzsKKwkJfSBlbHNlIHsKKwkJCWRldi0+Y2hhbm5lbHNbaV0uYmFuZCA9IE5FVDgwMjExX0JBTkRfNUdIWjsKKwkJCWRldi0+Y2hhbm5lbHNbaV0uY2VudGVyX2ZyZXEgPSA1MDAwICsgNSAqIGNoYW47CisJCQljaGFuICs9IDQ7CisJCX0KKwl9CisKKwlkZXYtPm5yX2NoYW5uZWxzID0gaTsKK30KKworLyoqCisgKiBGaWx0ZXIgODAyLjExIGRldmljZSBjaGFubmVscyBmb3IgaGFyZHdhcmUgY2FwYWJpbGl0aWVzCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqCisgKiBIYXJkd2FyZSBtYXkgc3VwcG9ydCBmZXdlciBjaGFubmVscyB0aGFuIHJlZ3VsYXRvcnkgcmVzdHJpY3Rpb25zCisgKiBhbGxvdzsgdGhpcyBmdW5jdGlvbiBmaWx0ZXJzIG91dCBjaGFubmVscyBpbiBkZXYtPmNoYW5uZWxzIHRoYXQgYXJlCisgKiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSBsaXN0IGluIGRldi0+aHdpbmZvLiBJdCBhbHNvIGNvcGllcworICogb3ZlciB0aGUgbmV0ODAyMTFfY2hhbm5lbDo6aHdfdmFsdWUgYW5kIGxpbWl0cyBtYXhpbXVtIFRYIHBvd2VyCisgKiBhcHByb3ByaWF0ZWx5LgorICoKKyAqIENoYW5uZWxzIGFyZSBtYXRjaGVkIGJhc2VkIG9uIGNlbnRlciBmcmVxdWVuY3ksIGlnbm9yaW5nIGJhbmQgYW5kCisgKiBjaGFubmVsIG51bWJlci4KKyAqCisgKiBJZiB0aGUgZHJpdmVyIHNwZWNpZmllcyBubyBzdXBwb3J0ZWQgY2hhbm5lbHMsIHRoZSBlZmZlY3Qgd2lsbCBiZQorICogYXMgdGhvdWdoIGFsbCB3ZXJlIHN1cHBvcnRlZC4KKyAqLworc3RhdGljIHZvaWQgbmV0ODAyMTFfZmlsdGVyX2h3X2NoYW5uZWxzICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICkKK3sKKwlpbnQgZGVsdGEgPSAwLCBpID0gMDsKKwlpbnQgb2xkX2ZyZXEgPSBkZXYtPmNoYW5uZWxzW2Rldi0+Y2hhbm5lbF0uY2VudGVyX2ZyZXE7CisJc3RydWN0IG5ldDgwMjExX2NoYW5uZWwgKmNoYW4sICpod2NoYW47CisKKwlpZiAoICEgZGV2LT5ody0+bnJfY2hhbm5lbHMgKQorCQlyZXR1cm47CisKKwlkZXYtPmNoYW5uZWwgPSAwOworCWZvciAoIGNoYW4gPSBkZXYtPmNoYW5uZWxzOyBjaGFuIDwgZGV2LT5jaGFubmVscyArIGRldi0+bnJfY2hhbm5lbHM7CisJICAgICAgY2hhbisrLCBpKysgKSB7CisJCWludCBvayA9IDA7CisJCWZvciAoIGh3Y2hhbiA9IGRldi0+aHctPmNoYW5uZWxzOworCQkgICAgICBod2NoYW4gPCBkZXYtPmh3LT5jaGFubmVscyArIGRldi0+aHctPm5yX2NoYW5uZWxzOworCQkgICAgICBod2NoYW4rKyApIHsKKwkJCWlmICggaHdjaGFuLT5jZW50ZXJfZnJlcSA9PSBjaGFuLT5jZW50ZXJfZnJlcSApIHsKKwkJCQlvayA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoICEgb2sgKQorCQkJZGVsdGErKzsKKwkJZWxzZSB7CisJCQljaGFuLT5od192YWx1ZSA9IGh3Y2hhbi0+aHdfdmFsdWU7CisJCQlpZiAoIGh3Y2hhbi0+bWF4cG93ZXIgIT0gMCAmJgorCQkJICAgICBjaGFuLT5tYXhwb3dlciA+IGh3Y2hhbi0+bWF4cG93ZXIgKQorCQkJCWNoYW4tPm1heHBvd2VyID0gaHdjaGFuLT5tYXhwb3dlcjsKKwkJCWlmICggb2xkX2ZyZXEgPT0gY2hhbi0+Y2VudGVyX2ZyZXEgKQorCQkJCWRldi0+Y2hhbm5lbCA9IGkgLSBkZWx0YTsKKwkJCWlmICggZGVsdGEgKQorCQkJCWNoYW5bLWRlbHRhXSA9ICpjaGFuOworCQl9CisJfQorCisJZGV2LT5ucl9jaGFubmVscyAtPSBkZWx0YTsKKworCWlmICggZGV2LT5jaGFubmVsc1tkZXYtPmNoYW5uZWxdLmNlbnRlcl9mcmVxICE9IG9sZF9mcmVxICkKKwkJZGV2LT5vcC0+Y29uZmlnICggZGV2LCBORVQ4MDIxMV9DRkdfQ0hBTk5FTCApOworfQorCisvKioKKyAqIFVwZGF0ZSA4MDIuMTEgZGV2aWNlIHN0YXRlIHRvIHJlZmxlY3QgcmVjZWl2ZWQgY2FwYWJpbGl0aWVzIGZpZWxkCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IGNhcGFiCUNhcGFiaWxpdGllcyBmaWVsZCBpbiBiZWFjb24sIHByb2JlLCBvciBhc3NvY2lhdGlvbiBmcmFtZQorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBuZXQ4MDIxMV9wcm9jZXNzX2NhcGFiICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCSAgICB1MTYgY2FwYWIgKQoreworCXUxNiBvbGRfcGh5ID0gZGV2LT5waHlfZmxhZ3M7CisKKwlpZiAoICggY2FwYWIgJiAoIElFRUU4MDIxMV9DQVBBQl9NQU5BR0VEIHwgSUVFRTgwMjExX0NBUEFCX0FESE9DICkgKSAhPQorCSAgICAgSUVFRTgwMjExX0NBUEFCX01BTkFHRUQgKSB7CisJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgY2Fubm90IGhhbmRsZSBJQlNTIG5ldHdvcmtcbiIsIGRldiApOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlkZXYtPnBoeV9mbGFncyAmPSB+KCBORVQ4MDIxMV9QSFlfVVNFX1NIT1JUX1BSRUFNQkxFIHwKKwkJCSAgICAgTkVUODAyMTFfUEhZX1VTRV9TSE9SVF9TTE9UICk7CisKKwlpZiAoIGNhcGFiICYgSUVFRTgwMjExX0NBUEFCX1NIT1JUX1BNQkwgKQorCQlkZXYtPnBoeV9mbGFncyB8PSBORVQ4MDIxMV9QSFlfVVNFX1NIT1JUX1BSRUFNQkxFOworCisJaWYgKCBjYXBhYiAmIElFRUU4MDIxMV9DQVBBQl9TSE9SVF9TTE9UICkKKwkJZGV2LT5waHlfZmxhZ3MgfD0gTkVUODAyMTFfUEhZX1VTRV9TSE9SVF9TTE9UOworCisJaWYgKCBvbGRfcGh5ICE9IGRldi0+cGh5X2ZsYWdzICkKKwkJZGV2LT5vcC0+Y29uZmlnICggZGV2LCBORVQ4MDIxMV9DRkdfUEhZX1BBUkFNUyApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVXBkYXRlIDgwMi4xMSBkZXZpY2Ugc3RhdGUgdG8gcmVmbGVjdCByZWNlaXZlZCBpbmZvcm1hdGlvbiBlbGVtZW50cworICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBpZQlQb2ludGVyIHRvIGZpcnN0IGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqIEB2IGllX2VuZAlQb2ludGVyIHRvIHRhaWwgb2YgcGFja2V0IEkvTyBidWZmZXIKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbmV0ODAyMTFfcHJvY2Vzc19pZSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCQkgdW5pb24gaWVlZTgwMjExX2llICppZSwgdm9pZCAqaWVfZW5kICkKK3sKKwl1MTYgb2xkX3JhdGUgPSBkZXYtPnJhdGVzW2Rldi0+cmF0ZV07CisJdTE2IG9sZF9waHkgPSBkZXYtPnBoeV9mbGFnczsKKwlpbnQgaGF2ZV9yYXRlcyA9IDAsIGk7CisJaW50IGRzX2NoYW5uZWwgPSAwOworCWludCBjaGFuZ2VkID0gMDsKKwlpbnQgYmFuZCA9IGRldi0+Y2hhbm5lbHNbZGV2LT5jaGFubmVsXS5iYW5kOworCisJaWYgKCAhIGllZWU4MDIxMV9pZV9ib3VuZCAoIGllLCBpZV9lbmQgKSApCisJCXJldHVybiAwOworCisJZm9yICggOyBpZTsgaWUgPSBpZWVlODAyMTFfbmV4dF9pZSAoIGllLCBpZV9lbmQgKSApIHsKKwkJc3dpdGNoICggaWUtPmlkICkgeworCQljYXNlIElFRUU4MDIxMV9JRV9TU0lEOgorCQkJaWYgKCBpZS0+bGVuIDw9IDMyICkgeworCQkJCW1lbWNweSAoIGRldi0+ZXNzaWQsIGllLT5zc2lkLCBpZS0+bGVuICk7CisJCQkJZGV2LT5lc3NpZFtpZS0+bGVuXSA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9JRV9SQVRFUzoKKwkJY2FzZSBJRUVFODAyMTFfSUVfRVhUX1JBVEVTOgorCQkJaWYgKCAhIGhhdmVfcmF0ZXMgKSB7CisJCQkJZGV2LT5ucl9yYXRlcyA9IDA7CisJCQkJZGV2LT5iYXNpY19yYXRlcyA9IDA7CisJCQkJaGF2ZV9yYXRlcyA9IDE7CisJCQl9CisJCQlmb3IgKCBpID0gMDsgaSA8IGllLT5sZW4gJiYKKwkJCSAgICAgIGRldi0+bnJfcmF0ZXMgPCBORVQ4MDIxMV9NQVhfUkFURVM7IGkrKyApIHsKKwkJCQl1OCByaWQgPSBpZS0+cmF0ZXNbaV07CisJCQkJdTE2IHJhdGUgPSAoIHJpZCAmIDB4N2YgKSAqIDU7CisKKwkJCQlpZiAoIHJpZCAmIDB4ODAgKQorCQkJCQlkZXYtPmJhc2ljX3JhdGVzIHw9CisJCQkJCQkoIDEgPDwgZGV2LT5ucl9yYXRlcyApOworCisJCQkJZGV2LT5yYXRlc1tkZXYtPm5yX3JhdGVzKytdID0gcmF0ZTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfSUVfRFNfUEFSQU06CisJCQlpZiAoIGRldi0+Y2hhbm5lbCA8IGRldi0+bnJfY2hhbm5lbHMgJiYgZHNfY2hhbm5lbCA9PQorCQkJICAgICBkZXYtPmNoYW5uZWxzW2Rldi0+Y2hhbm5lbF0uY2hhbm5lbF9uciApCisJCQkJYnJlYWs7CisJCQlkc19jaGFubmVsID0gaWUtPmRzX3BhcmFtLmN1cnJlbnRfY2hhbm5lbDsKKwkJCW5ldDgwMjExX2NoYW5nZV9jaGFubmVsICggZGV2LCBkc19jaGFubmVsICk7CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9JRV9DT1VOVFJZOgorCQkJZGV2LT5ucl9jaGFubmVscyA9IDA7CisKKwkJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgc2V0dGluZyBjb3VudHJ5IHJlZ3VsYXRpb25zICIKKwkJCSAgICAgICAiZm9yICVjJWNcbiIsIGRldiwgaWUtPmNvdW50cnkubmFtZVswXSwKKwkJCSAgICAgICBpZS0+Y291bnRyeS5uYW1lWzFdICk7CisJCQlmb3IgKCBpID0gMDsgaSA8ICggaWUtPmxlbiAtIDMgKSAvIDM7IGkrKyApIHsKKwkJCQl1bmlvbiBpZWVlODAyMTFfaWVfY291bnRyeV90cmlwbGV0ICp0ID0KKwkJCQkJJmllLT5jb3VudHJ5LnRyaXBsZXRbaV07CisJCQkJaWYgKCB0LT5maXJzdCA+IDIwMCApIHsKKwkJCQkJREJHQyAoIGRldiwgIjgwMi4xMSAlcCBpZ25vcmluZyByZWd1bGF0b3J5ICIKKwkJCQkJICAgICAgICJleHRlbnNpb24gaW5mb3JtYXRpb25cbiIsIGRldiApOworCQkJCX0gZWxzZSB7CisJCQkJCW5ldDgwMjExX2FkZF9jaGFubmVscyAoIGRldiwKKwkJCQkJCQl0LT5iYW5kLmZpcnN0X2NoYW5uZWwsCisJCQkJCQkJdC0+YmFuZC5ucl9jaGFubmVscywKKwkJCQkJCQl0LT5iYW5kLm1heF90eHBvd2VyICk7CisJCQkJfQorCQkJfQorCQkJbmV0ODAyMTFfZmlsdGVyX2h3X2NoYW5uZWxzICggZGV2ICk7CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9JRV9FUlBfSU5GTzoKKwkJCWRldi0+cGh5X2ZsYWdzICY9IH4oIE5FVDgwMjExX1BIWV9VU0VfUFJPVEVDVElPTiB8CisJCQkJCSAgICAgTkVUODAyMTFfUEhZX1VTRV9TSE9SVF9QUkVBTUJMRSApOworCQkJaWYgKCBpZS0+ZXJwX2luZm8gJiBJRUVFODAyMTFfRVJQX1VTRV9QUk9URUNUSU9OICkKKwkJCQlkZXYtPnBoeV9mbGFncyB8PSBORVQ4MDIxMV9QSFlfVVNFX1BST1RFQ1RJT047CisJCQlpZiAoICEgKCBpZS0+ZXJwX2luZm8gJiBJRUVFODAyMTFfRVJQX0JBUktFUl9MT05HICkgKQorCQkJCWRldi0+cGh5X2ZsYWdzIHw9IE5FVDgwMjExX1BIWV9VU0VfU0hPUlRfUFJFQU1CTEU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggaGF2ZV9yYXRlcyApIHsKKwkJLyogQWxsb3cgb25seSB0aG9zZSByYXRlcyB0aGF0IGFyZSBhbHNvIHN1cHBvcnRlZCBieQorCQkgICB0aGUgaGFyZHdhcmUuICovCisJCWludCBkZWx0YSA9IDAsIGo7CisKKwkJZGV2LT5yYXRlID0gMDsKKwkJZm9yICggaSA9IDA7IGkgPCBkZXYtPm5yX3JhdGVzOyBpKysgKSB7CisJCQlpbnQgb2sgPSAwOworCQkJZm9yICggaiA9IDA7IGogPCBkZXYtPmh3LT5ucl9yYXRlc1tiYW5kXTsgaisrICkgeworCQkJCWlmICggZGV2LT5ody0+cmF0ZXNbYmFuZF1bal0gPT0gZGV2LT5yYXRlc1tpXSApeworCQkJCQlvayA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCAhIG9rICkKKwkJCQlkZWx0YSsrOworCQkJZWxzZSB7CisJCQkJZGV2LT5yYXRlc1tpIC0gZGVsdGFdID0gZGV2LT5yYXRlc1tpXTsKKwkJCQlpZiAoIG9sZF9yYXRlID09IGRldi0+cmF0ZXNbaV0gKQorCQkJCQlkZXYtPnJhdGUgPSBpIC0gZGVsdGE7CisJCQl9CisJCX0KKworCQlkZXYtPm5yX3JhdGVzIC09IGRlbHRhOworCisJCS8qIFNvcnQgYXZhaWxhYmxlIHJhdGVzIC0gc29ydGVkIHN1YmNsdW1wcyB0ZW5kIHRvIGFscmVhZHkKKwkJICAgZXhpc3QsIHNvIGluc2VydGlvbiBzb3J0IHdvcmtzIHdlbGwuICovCisJCWZvciAoIGkgPSAxOyBpIDwgZGV2LT5ucl9yYXRlczsgaSsrICkgeworCQkJdTE2IHJhdGUgPSBkZXYtPnJhdGVzW2ldOworCQkJdTMyIHRtcCwgYnIsIG1hc2s7CisKKwkJCWZvciAoIGogPSBpIC0gMTsgaiA+PSAwICYmIGRldi0+cmF0ZXNbal0gPj0gcmF0ZTsgai0tICkKKwkJCQlkZXYtPnJhdGVzW2ogKyAxXSA9IGRldi0+cmF0ZXNbal07CisJCQlkZXYtPnJhdGVzW2ogKyAxXSA9IHJhdGU7CisKKwkJCS8qIEFkanVzdCBiYXNpY19yYXRlcyB0byBtYXRjaCBieSByb3RhdGluZyB0aGUKKwkJCSAgIGJpdHMgZnJvbSBiaXQgaisxIHRvIGJpdCBpIGxlZnQgb25lIHBvc2l0aW9uLiAqLworCQkJbWFzayA9ICggKCAxIDw8IGkgKSAtIDEgKSAmIH4oICggMSA8PCAoIGogKyAxICkgKSAtIDEgKTsKKwkJCWJyID0gZGV2LT5iYXNpY19yYXRlczsKKwkJCXRtcCA9IGJyICYgKCAxIDw8IGkgKTsKKwkJCWJyID0gKCBiciAmIH4oIG1hc2sgfCB0bXAgKSApIHwgKCAoIGJyICYgbWFzayApIDw8IDEgKTsKKwkJCWJyIHw9ICggdG1wID4+ICggaSAtIGogLSAxICkgKTsKKwkJCWRldi0+YmFzaWNfcmF0ZXMgPSBicjsKKwkJfQorCisJCW5ldDgwMjExX3NldF9ydHNjdHNfcmF0ZSAoIGRldiApOworCisJCWlmICggZGV2LT5yYXRlc1tkZXYtPnJhdGVdICE9IG9sZF9yYXRlICkKKwkJCWNoYW5nZWQgfD0gTkVUODAyMTFfQ0ZHX1JBVEU7CisJfQorCisJaWYgKCBkZXYtPmh3LT5mbGFncyAmIE5FVDgwMjExX0hXX05PX1NIT1JUX1BSRUFNQkxFICkKKwkJZGV2LT5waHlfZmxhZ3MgJj0gfk5FVDgwMjExX1BIWV9VU0VfU0hPUlRfUFJFQU1CTEU7CisJaWYgKCBkZXYtPmh3LT5mbGFncyAmIE5FVDgwMjExX0hXX05PX1NIT1JUX1NMT1QgKQorCQlkZXYtPnBoeV9mbGFncyAmPSB+TkVUODAyMTFfUEhZX1VTRV9TSE9SVF9TTE9UOworCisJaWYgKCBvbGRfcGh5ICE9IGRldi0+cGh5X2ZsYWdzICkKKwkJY2hhbmdlZCB8PSBORVQ4MDIxMV9DRkdfUEhZX1BBUkFNUzsKKworCWlmICggY2hhbmdlZCApCisJCWRldi0+b3AtPmNvbmZpZyAoIGRldiwgY2hhbmdlZCApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ3JlYXRlIGluZm9ybWF0aW9uIGVsZW1lbnRzIGZvciBvdXRnb2luZyBwcm9iZSBvciBhc3NvY2lhdGlvbiBwYWNrZXQKKyAqCisgKiBAdiBkZXYJCTgwMi4xMSBkZXZpY2UKKyAqIEB2IGllCQlQb2ludGVyIHRvIHN0YXJ0IG9mIGluZm9ybWF0aW9uIGVsZW1lbnQgYXJlYQorICogQHJldCBuZXh0X2llCQlQb2ludGVyIHRvIGZpcnN0IGJ5dGUgYWZ0ZXIgYWRkZWQgaW5mb3JtYXRpb24gZWxlbWVudHMKKyAqLworc3RhdGljIHVuaW9uIGllZWU4MDIxMV9pZSAqCituZXQ4MDIxMV9tYXJzaGFsX3JlcXVlc3RfaW5mbyAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCQl1bmlvbiBpZWVlODAyMTFfaWUgKmllICkKK3sKKwlpbnQgaTsKKworCWllLT5pZCA9IElFRUU4MDIxMV9JRV9TU0lEOworCWllLT5sZW4gPSBzdHJsZW4gKCBkZXYtPmVzc2lkICk7CisJbWVtY3B5ICggaWUtPnNzaWQsIGRldi0+ZXNzaWQsIGllLT5sZW4gKTsKKworCWllID0gaWVlZTgwMjExX25leHRfaWUgKCBpZSwgTlVMTCApOworCisJaWUtPmlkID0gSUVFRTgwMjExX0lFX1JBVEVTOworCWllLT5sZW4gPSBkZXYtPm5yX3JhdGVzOworCWlmICggaWUtPmxlbiA+IDggKQorCQlpZS0+bGVuID0gODsKKworCWZvciAoIGkgPSAwOyBpIDwgaWUtPmxlbjsgaSsrICkgeworCQlpZS0+cmF0ZXNbaV0gPSBkZXYtPnJhdGVzW2ldIC8gNTsKKwkJaWYgKCBkZXYtPmJhc2ljX3JhdGVzICYgKCAxIDw8IGkgKSApCisJCQlpZS0+cmF0ZXNbaV0gfD0gMHg4MDsKKwl9CisKKwlpZSA9IGllZWU4MDIxMV9uZXh0X2llICggaWUsIE5VTEwgKTsKKworCWlmICggZGV2LT5yc25faWUgJiYgZGV2LT5yc25faWUtPmlkID09IElFRUU4MDIxMV9JRV9SU04gKSB7CisJCW1lbWNweSAoIGllLCBkZXYtPnJzbl9pZSwgZGV2LT5yc25faWUtPmxlbiArIDIgKTsKKwkJaWUgPSBpZWVlODAyMTFfbmV4dF9pZSAoIGllLCBOVUxMICk7CisJfQorCisJaWYgKCBkZXYtPm5yX3JhdGVzID4gOCApIHsKKwkJLyogODAyLjExIHJlcXVpcmVzIHdlIHVzZSBhbiBFeHRlbmRlZCBCYXNpYyBSYXRlcyBJRQorCQkgICBmb3IgdGhlIHJhdGVzIGJleW9uZCB0aGUgZWlnaHRoLiAqLworCisJCWllLT5pZCA9IElFRUU4MDIxMV9JRV9FWFRfUkFURVM7CisJCWllLT5sZW4gPSBkZXYtPm5yX3JhdGVzIC0gODsKKworCQlmb3IgKCA7IGkgPCBkZXYtPm5yX3JhdGVzOyBpKysgKSB7CisJCQlpZS0+cmF0ZXNbaSAtIDhdID0gZGV2LT5yYXRlc1tpXSAvIDU7CisJCQlpZiAoIGRldi0+YmFzaWNfcmF0ZXMgJiAoIDEgPDwgaSApICkKKwkJCQlpZS0+cmF0ZXNbaSAtIDhdIHw9IDB4ODA7CisJCX0KKworCQlpZSA9IGllZWU4MDIxMV9uZXh0X2llICggaWUsIE5VTEwgKTsKKwl9CisKKwlpZiAoIGRldi0+cnNuX2llICYmIGRldi0+cnNuX2llLT5pZCA9PSBJRUVFODAyMTFfSUVfVkVORE9SICkgeworCQltZW1jcHkgKCBpZSwgZGV2LT5yc25faWUsIGRldi0+cnNuX2llLT5sZW4gKyAyICk7CisJCWllID0gaWVlZTgwMjExX25leHRfaWUgKCBpZSwgTlVMTCApOworCX0KKworCXJldHVybiBpZTsKK30KKworLyoqIFNlY29uZHMgdG8gd2FpdCBhZnRlciBmaW5kaW5nIGEgbmV0d29yaywgdG8gcG9zc2libHkgZmluZCBiZXR0ZXIgQVBzIGZvciBpdAorICoKKyAqIFRoaXMgaXMgdXNlZCB3aGVuIGEgc3BlY2lmaWMgU1NJRCB0byBzY2FuIGZvciBpcyBzcGVjaWZpZWQuCisgKi8KKyNkZWZpbmUgTkVUODAyMTFfUFJPQkVfR0FUSEVSICAgIDEKKworLyoqIFNlY29uZHMgdG8gd2FpdCBhZnRlciBmaW5kaW5nIGEgbmV0d29yaywgdG8gcG9zc2libHkgZmluZCBvdGhlciBuZXR3b3JrcworICoKKyAqIFRoaXMgaXMgdXNlZCB3aGVuIGFuIGVtcHR5IFNTSUQgaXMgc3BlY2lmaWVkLCB0byBzY2FuIGZvciBhbGwKKyAqIG5ldHdvcmtzLgorICovCisjZGVmaW5lIE5FVDgwMjExX1BST0JFX0dBVEhFUl9BTEwgMgorCisvKiogU2Vjb25kcyB0byBhbGxvdyBhIHByb2JlIHRvIHRha2UgaWYgbm8gbmV0d29yayBoYXMgYmVlbiBmb3VuZCAqLworI2RlZmluZSBORVQ4MDIxMV9QUk9CRV9USU1FT1VUICAgNgorCisvKioKKyAqIEJlZ2luIHByb2JlIG9mIDgwMi4xMSBuZXR3b3JrcworICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBlc3NpZAlTU0lEIHRvIHByb2JlIGZvciwgb3IgIiIgdG8gYWNjZXB0IGFueSAobWF5IG5vdCBiZSBOVUxMKQorICogQHYgYWN0aXZlCVdoZXRoZXIgdG8gdXNlIGFjdGl2ZSBzY2FubmluZworICogQHJldCBjdHgJUHJvYmUgY29udGV4dAorICoKKyAqIEFjdGl2ZSBzY2FubmluZyBtYXkgb25seSBiZSB1c2VkIG9uIGNoYW5uZWxzIDEtMTEgaW4gdGhlIDIuNEdIegorICogYmFuZCwgZHVlIHRvIGdQWEUncyBsYWNrIG9mIGEgY29tcGxldGUgcmVndWxhdG9yeSBkYXRhYmFzZS4gSWYKKyAqIGFjdGl2ZSBzY2FubmluZyBpcyB1c2VkLCBwcm9iZSBwYWNrZXRzIHdpbGwgYmUgc2VudCBvbiBlYWNoCisgKiBjaGFubmVsOyB0aGlzIGNhbiBhbGxvdyBhc3NvY2lhdGlvbiB3aXRoIGhpZGRlbi1TU0lEIG5ldHdvcmtzIGlmCisgKiB0aGUgU1NJRCBpcyBwcm9wZXJseSBzcGVjaWZpZWQuCisgKgorICogQSBAYyBOVUxMIHJldHVybiBpbmRpY2F0ZXMgYW4gb3V0LW9mLW1lbW9yeSBjb25kaXRpb24uCisgKgorICogVGhlIHJldHVybmVkIGNvbnRleHQgbXVzdCBiZSBwZXJpb2RpY2FsbHkgcGFzc2VkIHRvCisgKiBuZXQ4MDIxMV9wcm9iZV9zdGVwKCkgdW50aWwgdGhhdCBmdW5jdGlvbiByZXR1cm5zIHplcm8uCisgKi8KK3N0cnVjdCBuZXQ4MDIxMV9wcm9iZV9jdHggKiBuZXQ4MDIxMV9wcm9iZV9zdGFydCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCQkJCSAgIGNvbnN0IGNoYXIgKmVzc2lkLAorCQkJCQkJICAgaW50IGFjdGl2ZSApCit7CisJc3RydWN0IG5ldDgwMjExX3Byb2JlX2N0eCAqY3R4ID0gemFsbG9jICggc2l6ZW9mICggKmN0eCApICk7CisKKwlpZiAoICEgY3R4ICkKKwkJcmV0dXJuIE5VTEw7CisKKwlhc3NlcnQgKCBkZXYtPm5ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApOworCisJY3R4LT5kZXYgPSBkZXY7CisJY3R4LT5vbGRfa2VlcF9tZ210ID0gbmV0ODAyMTFfa2VlcF9tZ210ICggZGV2LCAxICk7CisJY3R4LT5lc3NpZCA9IGVzc2lkOworCWlmICggZGV2LT5lc3NpZCAhPSBjdHgtPmVzc2lkICkKKwkJc3RyY3B5ICggZGV2LT5lc3NpZCwgY3R4LT5lc3NpZCApOworCisJaWYgKCBhY3RpdmUgKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxICpwcm9iZV9yZXE7CisJCXVuaW9uIGllZWU4MDIxMV9pZSAqaWU7CisKKwkJY3R4LT5wcm9iZSA9IGFsbG9jX2lvYiAoIDEyOCApOworCQlpb2JfcmVzZXJ2ZSAoIGN0eC0+cHJvYmUsIElFRUU4MDIxMV9UWVBfRlJBTUVfSEVBREVSX0xFTiApOworCQlwcm9iZV9yZXEgPSBjdHgtPnByb2JlLT5kYXRhOworCisJCWllID0gbmV0ODAyMTFfbWFyc2hhbF9yZXF1ZXN0X2luZm8gKCBkZXYsCisJCQkJCQkgICAgIHByb2JlX3JlcS0+aW5mb19lbGVtZW50ICk7CisKKwkJaW9iX3B1dCAoIGN0eC0+cHJvYmUsICggdm9pZCAqICkgaWUgLSBjdHgtPnByb2JlLT5kYXRhICk7CisJfQorCisJY3R4LT50aWNrc19zdGFydCA9IGN1cnJ0aWNrcygpOworCWN0eC0+dGlja3NfYmVhY29uID0gMDsKKwljdHgtPnRpY2tzX2NoYW5uZWwgPSBjdXJydGlja3MoKTsKKwljdHgtPmhvcF90aW1lID0gdGlja3NfcGVyX3NlYygpIC8gKCBhY3RpdmUgPyAyIDogNiApOworCisJLyoKKwkgKiBDaGFubmVscyBvbiAyLjRHSHogb3ZlcmxhcCwgYW5kIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQKKwkgKiBhcmUgMSwgNiwgYW5kIDExLiBXZSdsbCBnZXQgYSByZXN1bHQgZmFzdGVyIGlmIHdlIGNoZWNrCisJICogZXZlcnkgNSBjaGFubmVscywgYnV0IGluIG9yZGVyIHRvIGhpdCBhbGwgb2YgdGhlbSB0aGUKKwkgKiBudW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBiZSByZWxhdGl2ZWx5IHByaW1lIHRvIDUuIElmIGl0J3MKKwkgKiBub3QsIHR3ZWFrIHRoZSBob3AuCisJICovCisJY3R4LT5ob3Bfc3RlcCA9IDU7CisJd2hpbGUgKCBkZXYtPm5yX2NoYW5uZWxzICUgY3R4LT5ob3Bfc3RlcCA9PSAwICYmIGN0eC0+aG9wX3N0ZXAgPiAxICkKKwkJY3R4LT5ob3Bfc3RlcC0tOworCisJY3R4LT5iZWFjb25zID0gbWFsbG9jICggc2l6ZW9mICggKmN0eC0+YmVhY29ucyApICk7CisJSU5JVF9MSVNUX0hFQUQgKCBjdHgtPmJlYWNvbnMgKTsKKworCWRldi0+Y2hhbm5lbCA9IDA7CisJZGV2LT5vcC0+Y29uZmlnICggZGV2LCBORVQ4MDIxMV9DRkdfQ0hBTk5FTCApOworCisJcmV0dXJuIGN0eDsKK30KKworLyoqCisgKiBDb250aW51ZSBwcm9iZSBvZiA4MDIuMTEgbmV0d29ya3MKKyAqCisgKiBAdiBjdHgJUHJvYmUgY29udGV4dCByZXR1cm5lZCBieSBuZXQ4MDIxMV9wcm9iZV9zdGFydCgpCisgKiBAcmV0IHJjCVByb2JlIHN0YXR1cworICoKKyAqIFRoZSByZXR1cm4gY29kZSB3aWxsIGJlIDAgaWYgdGhlIHByb2JlIGlzIHN0aWxsIGdvaW5nIG9uIChhbmQgdGhpcworICogZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbiksIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHRoZSBwcm9iZQorICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwcm9iZQorICogZmFpbGVkIGZvciB0aGF0IHJlYXNvbi4KKyAqCisgKiBXaGV0aGVyIHRoZSBwcm9iZSBzdWNjZWVkZWQgb3IgZmFpbGVkLCB5b3UgbXVzdCBjYWxsCisgKiBuZXQ4MDIxMV9wcm9iZV9maW5pc2hfYWxsKCkgb3IgbmV0ODAyMTFfcHJvYmVfZmluaXNoX2Jlc3QoKQorICogKGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSB3YW50IGluZm9ybWF0aW9uIG9uIGFsbCBuZXR3b3JrcyBvciBqdXN0CisgKiB0aGUgYmVzdC1zaWduYWwgb25lKSBpbiBvcmRlciB0byByZWxlYXNlIHRoZSBwcm9iZSBjb250ZXh0LiBBCisgKiBmYWlsZWQgcHJvYmUgbWF5IHN0aWxsIGhhdmUgYWNxdWlyZWQgc29tZSB2YWxpZCBkYXRhLgorICovCitpbnQgbmV0ODAyMTFfcHJvYmVfc3RlcCAoIHN0cnVjdCBuZXQ4MDIxMV9wcm9iZV9jdHggKmN0eCApCit7CisJc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ID0gY3R4LT5kZXY7CisJdTMyIHN0YXJ0X3RpbWVvdXQgPSBORVQ4MDIxMV9QUk9CRV9USU1FT1VUICogdGlja3NfcGVyX3NlYygpOworCXUzMiBnYXRoZXJfdGltZW91dCA9IHRpY2tzX3Blcl9zZWMoKTsKKwl1MzIgbm93ID0gY3VycnRpY2tzKCk7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iOworCWludCBzaWduYWw7CisJaW50IHJjOworCWNoYXIgc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOICsgMV07CisKKwlnYXRoZXJfdGltZW91dCAqPSAoIGN0eC0+ZXNzaWRbMF0gPyBORVQ4MDIxMV9QUk9CRV9HQVRIRVIgOgorCQkJICAgIE5FVDgwMjExX1BST0JFX0dBVEhFUl9BTEwgKTsKKworCS8qIFRpbWUgb3V0IGlmIG5lY2Vzc2FyeSAqLworCWlmICggbm93ID49IGN0eC0+dGlja3Nfc3RhcnQgKyBzdGFydF90aW1lb3V0ICkKKwkJcmV0dXJuIGxpc3RfZW1wdHkgKCBjdHgtPmJlYWNvbnMgKSA/IC1FVElNRURPVVQgOiArMTsKKworCWlmICggY3R4LT50aWNrc19iZWFjb24gPiAwICYmIG5vdyA+PSBjdHgtPnRpY2tzX3N0YXJ0ICsgZ2F0aGVyX3RpbWVvdXQgKQorCQlyZXR1cm4gKzE7CisKKwkvKiBDaGFuZ2UgY2hhbm5lbHMgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCBub3cgPj0gY3R4LT50aWNrc19jaGFubmVsICsgY3R4LT5ob3BfdGltZSApIHsKKwkJZGV2LT5jaGFubmVsID0gKCBkZXYtPmNoYW5uZWwgKyBjdHgtPmhvcF9zdGVwICkKKwkJCSUgZGV2LT5ucl9jaGFubmVsczsKKwkJZGV2LT5vcC0+Y29uZmlnICggZGV2LCBORVQ4MDIxMV9DRkdfQ0hBTk5FTCApOworCQl1ZGVsYXkgKCBkZXYtPmh3LT5jaGFubmVsX2NoYW5nZV90aW1lICk7CisKKwkJY3R4LT50aWNrc19jaGFubmVsID0gbm93OworCisJCWlmICggY3R4LT5wcm9iZSApIHsKKwkJCXN0cnVjdCBpb19idWZmZXIgKnNpb2IgPSBjdHgtPnByb2JlOyAvKiB0byBzZW5kICovCisKKwkJCS8qIG1ha2UgYSBjb3B5IGZvciBmdXR1cmUgdXNlICovCisJCQlpb2IgPSBhbGxvY19pb2IgKCBzaW9iLT50YWlsIC0gc2lvYi0+aGVhZCApOworCQkJaW9iX3Jlc2VydmUgKCBpb2IsIGlvYl9oZWFkcm9vbSAoIHNpb2IgKSApOworCQkJbWVtY3B5ICggaW9iX3B1dCAoIGlvYiwgaW9iX2xlbiAoIHNpb2IgKSApLAorCQkJCSBzaW9iLT5kYXRhLCBpb2JfbGVuICggc2lvYiApICk7CisKKwkJCWN0eC0+cHJvYmUgPSBpb2I7CisJCQlyYyA9IG5ldDgwMjExX3R4X21nbXQgKCBkZXYsIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEsCisJCQkJCQluZXQ4MDIxMV9sbF9icm9hZGNhc3QsCisJCQkJCQlpb2JfZGlzb3duICggc2lvYiApICk7CisJCQlpZiAoIHJjICkgeworCQkJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgc2VuZCBwcm9iZSBmYWlsZWQ6ICIKKwkJCQkgICAgICAgIiVzXG4iLCBkZXYsIHN0cmVycm9yICggcmMgKSApOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfQorCX0KKworCS8qIENoZWNrIGZvciBuZXcgbWFuYWdlbWVudCBwYWNrZXRzICovCisJd2hpbGUgKCAoIGlvYiA9IG5ldDgwMjExX21nbXRfZGVxdWV1ZSAoIGRldiwgJnNpZ25hbCApICkgIT0gTlVMTCApIHsKKwkJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqaGRyOworCQlzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqYmVhY29uOworCQl1bmlvbiBpZWVlODAyMTFfaWUgKmllOworCQlzdHJ1Y3QgbmV0ODAyMTFfd2xhbiAqd2xhbjsKKwkJdTE2IHR5cGU7CisKKwkJaGRyID0gaW9iLT5kYXRhOworCQl0eXBlID0gaGRyLT5mYyAmIElFRUU4MDIxMV9GQ19TVUJUWVBFOworCQliZWFjb24gPSAoIHN0cnVjdCBpZWVlODAyMTFfYmVhY29uICogKSBoZHItPmRhdGE7CisKKwkJaWYgKCB0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9CRUFDT04gJiYKKwkJICAgICB0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQICkgeworCQkJREJHQzIgKCBkZXYsICI4MDIuMTEgJXAgcHJvYmU6IG5vbi1iZWFjb25cbiIsIGRldiApOworCQkJZ290byBkcm9wOworCQl9CisKKwkJaWYgKCAoIHZvaWQgKiApIGJlYWNvbi0+aW5mb19lbGVtZW50ID49IGlvYi0+dGFpbCApIHsKKwkJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgcHJvYmU6IGJlYWNvbiB3aXRoIG5vIElFc1xuIiwKKwkJCSAgICAgICBkZXYgKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCWllID0gYmVhY29uLT5pbmZvX2VsZW1lbnQ7CisKKwkJaWYgKCAhIGllZWU4MDIxMV9pZV9ib3VuZCAoIGllLCBpb2ItPnRhaWwgKSApCisJCQlpZSA9IE5VTEw7CisKKwkJd2hpbGUgKCBpZSAmJiBpZS0+aWQgIT0gSUVFRTgwMjExX0lFX1NTSUQgKQorCQkJaWUgPSBpZWVlODAyMTFfbmV4dF9pZSAoIGllLCBpb2ItPnRhaWwgKTsKKworCQlpZiAoICEgaWUgKSB7CisJCQlEQkdDICggZGV2LCAiODAyLjExICVwIHByb2JlOiBiZWFjb24gd2l0aCBubyBTU0lEXG4iLAorCQkJICAgICAgIGRldiApOworCQkJZ290byBkcm9wOworCQl9CisKKwkJbWVtY3B5ICggc3NpZCwgaWUtPnNzaWQsIGllLT5sZW4gKTsKKwkJc3NpZFtpZS0+bGVuXSA9IDA7CisKKwkJaWYgKCBjdHgtPmVzc2lkWzBdICYmIHN0cmNtcCAoIGN0eC0+ZXNzaWQsIHNzaWQgKSAhPSAwICkgeworCQkJREJHQzIgKCBkZXYsICI4MDIuMTEgJXAgcHJvYmU6IGJlYWNvbiB3aXRoIHdyb25nIFNTSUQgIgorCQkJCSIoJXMpXG4iLCBkZXYsIHNzaWQgKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCS8qIFNlZSBpZiB3ZSd2ZSBnb3QgYW4gZW50cnkgZm9yIHRoaXMgbmV0d29yayAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggd2xhbiwgY3R4LT5iZWFjb25zLCBsaXN0ICkgeworCQkJaWYgKCBzdHJjbXAgKCB3bGFuLT5lc3NpZCwgc3NpZCApICE9IDAgKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIHNpZ25hbCA8IHdsYW4tPnNpZ25hbCApIHsKKwkJCQlEQkdDMiAoIGRldiwgIjgwMi4xMSAlcCBwcm9iZTogYmVhY29uIGZvciAlcyAiCisJCQkJCSIoJXMpIHdpdGggd2Vha2VyIHNpZ25hbCAlZFxuIiwgZGV2LAorCQkJCQlzc2lkLCBldGhfbnRvYSAoIGhkci0+YWRkcjMgKSwgc2lnbmFsICk7CisJCQkJZ290byBkcm9wOworCQkJfQorCisJCQlnb3RvIGZpbGw7CisJCX0KKworCQkvKiBObyBlbnRyeSB5ZXQgLSBtYWtlIG9uZSAqLworCQl3bGFuID0gemFsbG9jICggc2l6ZW9mICggKndsYW4gKSApOworCQlzdHJjcHkgKCB3bGFuLT5lc3NpZCwgc3NpZCApOworCQlsaXN0X2FkZF90YWlsICggJndsYW4tPmxpc3QsIGN0eC0+YmVhY29ucyApOworCisJCS8qIFdoZXRoZXIgd2UncmUgdXNpbmcgYW4gb2xkIGVudHJ5IG9yIGEgbmV3IG9uZSwgZmlsbAorCQkgICBpdCB3aXRoIG5ldyBkYXRhLiAqLworCWZpbGw6CisJCW1lbWNweSAoIHdsYW4tPmJzc2lkLCBoZHItPmFkZHIzLCBFVEhfQUxFTiApOworCQl3bGFuLT5zaWduYWwgPSBzaWduYWw7CisJCXdsYW4tPmNoYW5uZWwgPSBkZXYtPmNoYW5uZWxzW2Rldi0+Y2hhbm5lbF0uY2hhbm5lbF9ucjsKKworCQkvKiBDb3B5IHRoaXMgSS9PIGJ1ZmZlciBpbnRvIGEgbmV3IHdsYW4tPmJlYWNvbjsgdGhlCisJCSAqIGlvYiB3ZSd2ZSBnb3QgcHJvYmFibHkgY2FtZSBmcm9tIHRoZSBkZXZpY2UgZHJpdmVyCisJCSAqIGFuZCBtYXkgaGF2ZSB0aGUgZnVsbCAyLjRrIGFsbG9jYXRpb24sIHdoaWNoIHdlCisJCSAqIGRvbid0IHdhbnQgdG8ga2VlcCBhcm91bmQgd2FzdGluZyBtZW1vcnkuCisJCSAqLworCQlmcmVlX2lvYiAoIHdsYW4tPmJlYWNvbiApOworCQl3bGFuLT5iZWFjb24gPSBhbGxvY19pb2IgKCBpb2JfbGVuICggaW9iICkgKTsKKwkJbWVtY3B5ICggaW9iX3B1dCAoIHdsYW4tPmJlYWNvbiwgaW9iX2xlbiAoIGlvYiApICksCisJCQkgaW9iLT5kYXRhLCBpb2JfbGVuICggaW9iICkgKTsKKworCQlpZiAoICggcmMgPSBzZWM4MDIxMV9kZXRlY3QgKCB3bGFuLT5iZWFjb24sICZ3bGFuLT5oYW5kc2hha2luZywKKwkJCQkJICAgICAgJndsYW4tPmNyeXB0byApICkgPT0gLUVOT1RTVVAgKSB7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqYmVhY29uID0KKwkJCQkoIHN0cnVjdCBpZWVlODAyMTFfYmVhY29uICogKSBoZHItPmRhdGE7CisKKwkJCWlmICggYmVhY29uLT5jYXBhYmlsaXR5ICYgSUVFRTgwMjExX0NBUEFCX1BSSVZBQ1kgKSB7CisJCQkJREJHICggIjgwMi4xMSAlcCBwcm9iZTogc2VjdXJlZCBuZXR3b3JrICVzIGJ1dCAiCisJCQkJICAgICAgImVuY3J5cHRpb24gc3VwcG9ydCBub3QgY29tcGlsZWQgaW5cbiIsCisJCQkJICAgICAgZGV2LCB3bGFuLT5lc3NpZCApOworCQkJCXdsYW4tPmhhbmRzaGFraW5nID0gTkVUODAyMTFfU0VDUFJPVF9VTktOT1dOOworCQkJCXdsYW4tPmNyeXB0byA9IE5FVDgwMjExX0NSWVBUX1VOS05PV047CisJCQl9IGVsc2UgeworCQkJCXdsYW4tPmhhbmRzaGFraW5nID0gTkVUODAyMTFfU0VDUFJPVF9OT05FOworCQkJCXdsYW4tPmNyeXB0byA9IE5FVDgwMjExX0NSWVBUX05PTkU7CisJCQl9CisJCX0gZWxzZSBpZiAoIHJjICE9IDAgKSB7CisJCQlEQkdDICggZGV2LCAiODAyLjExICVwIHByb2JlIHdhcm5pbmc6IG5ldHdvcmsgIgorCQkJICAgICAgICIlcyB3aXRoIHVuaWRlbnRpZmlhYmxlIHNlY3VyaXR5ICIKKwkJCSAgICAgICAic2V0dGluZ3M6ICVzXG4iLCBkZXYsIHdsYW4tPmVzc2lkLAorCQkJICAgICAgIHN0cmVycm9yICggcmMgKSApOworCQl9CisKKwkJY3R4LT50aWNrc19iZWFjb24gPSBub3c7CisKKwkJREJHQzIgKCBkZXYsICI4MDIuMTEgJXAgcHJvYmU6IGdvb2QgYmVhY29uIGZvciAlcyAoJXMpXG4iLAorCQkJZGV2LCB3bGFuLT5lc3NpZCwgZXRoX250b2EgKCB3bGFuLT5ic3NpZCApICk7CisKKwlkcm9wOgorCQlmcmVlX2lvYiAoIGlvYiApOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogRmluaXNoIHByb2JlIG9mIDgwMi4xMSBuZXR3b3JrcywgcmV0dXJuaW5nIGJlc3Qtc2lnbmFsIG5ldHdvcmsgZm91bmQKKyAqCisgKiBAdiBjdHgJUHJvYmUgY29udGV4dAorICogQHJldCB3bGFuCUJlc3Qtc2lnbmFsIG5ldHdvcmsgZm91bmQsIG9yIEBjIE5VTEwgaWYgbm9uZSB3ZXJlIGZvdW5kCisgKgorICogSWYgbmV0ODAyMTFfcHJvYmVfc3RhcnQoKSB3YXMgY2FsbGVkIHdpdGggYSBwYXJ0aWN1bGFyIFNTSUQKKyAqIHBhcmFtZXRlciBhcyBmaWx0ZXIsIG9ubHkgYSBuZXR3b3JrIHdpdGggdGhhdCBTU0lEIChtYXRjaGluZworICogY2FzZS1zZW5zaXRpdmVseSkgY2FuIGJlIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAqLworc3RydWN0IG5ldDgwMjExX3dsYW4gKgorbmV0ODAyMTFfcHJvYmVfZmluaXNoX2Jlc3QgKCBzdHJ1Y3QgbmV0ODAyMTFfcHJvYmVfY3R4ICpjdHggKQoreworCXN0cnVjdCBuZXQ4MDIxMV93bGFuICpiZXN0ID0gTlVMTCwgKndsYW47CisKKwlpZiAoICEgY3R4ICkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggd2xhbiwgY3R4LT5iZWFjb25zLCBsaXN0ICkgeworCQlpZiAoICEgYmVzdCB8fCBiZXN0LT5zaWduYWwgPCB3bGFuLT5zaWduYWwgKQorCQkJYmVzdCA9IHdsYW47CisJfQorCisJaWYgKCBiZXN0ICkKKwkJbGlzdF9kZWwgKCAmYmVzdC0+bGlzdCApOworCWVsc2UKKwkJREJHQyAoIGN0eC0+ZGV2LCAiODAyLjExICVwIHByb2JlOiBmb3VuZCBub3RoaW5nIGZvciAnJXMnXG4iLAorCQkgICAgICAgY3R4LT5kZXYsIGN0eC0+ZXNzaWQgKTsKKworCW5ldDgwMjExX2ZyZWVfd2xhbmxpc3QgKCBjdHgtPmJlYWNvbnMgKTsKKworCW5ldDgwMjExX2tlZXBfbWdtdCAoIGN0eC0+ZGV2LCBjdHgtPm9sZF9rZWVwX21nbXQgKTsKKworCWlmICggY3R4LT5wcm9iZSApCisJCWZyZWVfaW9iICggY3R4LT5wcm9iZSApOworCisJZnJlZSAoIGN0eCApOworCisJcmV0dXJuIGJlc3Q7Cit9CisKKworLyoqCisgKiBGaW5pc2ggcHJvYmUgb2YgODAyLjExIG5ldHdvcmtzLCByZXR1cm5pbmcgYWxsIG5ldHdvcmtzIGZvdW5kCisgKgorICogQHYgY3R4CVByb2JlIGNvbnRleHQKKyAqIEByZXQgbGlzdAlMaXN0IG9mIG5ldDgwMjExX3dsYW4gZGV0YWlsaW5nIG5ldHdvcmtzIGZvdW5kCisgKgorICogSWYgbmV0ODAyMTFfcHJvYmVfc3RhcnQoKSB3YXMgY2FsbGVkIHdpdGggYSBwYXJ0aWN1bGFyIFNTSUQKKyAqIHBhcmFtZXRlciBhcyBmaWx0ZXIsIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIGVpdGhlciBhbiBlbXB0eSBvciBhCisgKiBvbmUtZWxlbWVudCBsaXN0LgorICovCitzdHJ1Y3QgbGlzdF9oZWFkICpuZXQ4MDIxMV9wcm9iZV9maW5pc2hfYWxsICggc3RydWN0IG5ldDgwMjExX3Byb2JlX2N0eCAqY3R4ICkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpiZWFjb25zID0gY3R4LT5iZWFjb25zOworCisJaWYgKCAhIGN0eCApCisJCXJldHVybiBOVUxMOworCisJbmV0ODAyMTFfa2VlcF9tZ210ICggY3R4LT5kZXYsIGN0eC0+b2xkX2tlZXBfbWdtdCApOworCisJaWYgKCBjdHgtPnByb2JlICkKKwkJZnJlZV9pb2IgKCBjdHgtPnByb2JlICk7CisKKwlmcmVlICggY3R4ICk7CisKKwlyZXR1cm4gYmVhY29uczsKK30KKworCisvKioKKyAqIEZyZWUgV0xBTiBzdHJ1Y3R1cmUKKyAqCisgKiBAdiB3bGFuCVdMQU4gc3RydWN0dXJlIHRvIGZyZWUKKyAqLwordm9pZCBuZXQ4MDIxMV9mcmVlX3dsYW4gKCBzdHJ1Y3QgbmV0ODAyMTFfd2xhbiAqd2xhbiApCit7CisJaWYgKCB3bGFuICkgeworCQlmcmVlX2lvYiAoIHdsYW4tPmJlYWNvbiApOworCQlmcmVlICggd2xhbiApOworCX0KK30KKworCisvKioKKyAqIEZyZWUgbGlzdCBvZiBXTEFOIHN0cnVjdHVyZXMKKyAqCisgKiBAdiBsaXN0CUxpc3Qgb2YgV0xBTiBzdHJ1Y3R1cmVzIHRvIGZyZWUKKyAqLwordm9pZCBuZXQ4MDIxMV9mcmVlX3dsYW5saXN0ICggc3RydWN0IGxpc3RfaGVhZCAqbGlzdCApCit7CisJc3RydWN0IG5ldDgwMjExX3dsYW4gKndsYW4sICp0bXA7CisKKwlpZiAoICEgbGlzdCApCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAoIHdsYW4sIHRtcCwgbGlzdCwgbGlzdCApIHsKKwkJbGlzdF9kZWwgKCAmd2xhbi0+bGlzdCApOworCQluZXQ4MDIxMV9mcmVlX3dsYW4gKCB3bGFuICk7CisJfQorCisJZnJlZSAoIGxpc3QgKTsKK30KKworCisvKiogTnVtYmVyIG9mIHRpY2tzIHRvIHdhaXQgZm9yIHJlcGxpZXMgdG8gYXNzb2NpYXRpb24gbWFuYWdlbWVudCBmcmFtZXMgKi8KKyNkZWZpbmUgQVNTT0NfVElNRU9VVAlUSUNLU19QRVJfU0VDCisKKy8qKiBOdW1iZXIgb2YgdGltZXMgdG8gdHJ5IHNlbmRpbmcgYSBwYXJ0aWN1bGFyIGFzc29jaWF0aW9uIG1hbmFnZW1lbnQgZnJhbWUgKi8KKyNkZWZpbmUgQVNTT0NfUkVUUklFUwkyCisKKy8qKgorICogU3RlcCA4MDIuMTEgYXNzb2NpYXRpb24gcHJvY2VzcworICoKKyAqIEB2IHByb2MJQXNzb2NpYXRpb24gcHJvY2VzcworICovCitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9zdGVwX2Fzc29jaWF0ZSAoIHN0cnVjdCBwcm9jZXNzICpwcm9jICkKK3sKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgPQorCSAgICBjb250YWluZXJfb2YgKCBwcm9jLCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlLCBwcm9jX2Fzc29jICk7CisJaW50IHJjID0gMDsKKwlpbnQgc3RhdHVzID0gZGV2LT5zdGF0ZSAmIE5FVDgwMjExX1NUQVRVU19NQVNLOworCisJLyoKKwkgKiBXZSB1c2UgYSBzb3J0IG9mIHN0YXRlIG1hY2hpbmUgaW1wbGVtZW50ZWQgdXNpbmcgYml0cyBpbgorCSAqIHRoZSBkZXYtPnN0YXRlIHZhcmlhYmxlLiBBdCBlYWNoIGNhbGwsIHdlIHRha2UgdGhlCisJICogbG9naWNhbGx5IGZpcnN0IHN0ZXAgdGhhdCBoYXMgbm90IHlldCBzdWNjZWVkZWQ7IGVpdGhlciBpdAorCSAqIGhhcyBub3QgYmVlbiB0cmllZCB5ZXQsIGl0J3MgYmVpbmcgcmV0cmllZCwgb3IgaXQgZmFpbGVkLgorCSAqIElmIGl0IGZhaWxlZCwgd2UgcmV0dXJuIGFuIGVycm9yIGluZGljYXRpb247IG90aGVyd2lzZSB3ZQorCSAqIHBlcmZvcm0gdGhlIHN0ZXAuIElmIGl0IHN1Y2NlZWRzLCBSWCBoYW5kbGluZyBjb2RlIHdpbGwgc2V0CisJICogdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyBiaXQgZm9yIHVzLgorCSAqCisJICogUHJvYmUgd29ya3MgYSBiaXQgZGlmZmVyZW50bHksIHNpbmNlIHdlIGhhdmUgdG8gc3RlcCBpdAorCSAqIG9uIGV2ZXJ5IGNhbGwgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBhIHBhY2tldCB0byBhcnJpdmUKKwkgKiB0aGF0IHdpbGwgc2V0IHRoZSBjb21wbGV0aW9uIGJpdCBmb3IgdXMuCisJICovCisKKwkvKiBJZiB3ZSdyZSB3YWl0aW5nIGZvciBhIHJlcGx5LCBjaGVjayBmb3IgdGltZW91dCBjb25kaXRpb24gKi8KKwlpZiAoIGRldi0+c3RhdGUgJiBORVQ4MDIxMV9XQUlUSU5HICkgeworCQkvKiBTYW5pdHkgY2hlY2sgKi8KKwkJaWYgKCAhIGRldi0+YXNzb2NpYXRpbmcgKQorCQkJcmV0dXJuOworCisJCWlmICggY3VycnRpY2tzKCkgLSBkZXYtPmN0eC5hc3NvYy0+bGFzdF9wYWNrZXQgPiBBU1NPQ19USU1FT1VUICkgeworCQkJLyogVGltZWQgb3V0IC0gZmFpbCBpZiB0b28gbWFueSByZXRyaWVzLCBvciByZXRyeSAqLworCQkJZGV2LT5jdHguYXNzb2MtPnRpbWVzX3RyaWVkKys7CisJCQlpZiAoICsrZGV2LT5jdHguYXNzb2MtPnRpbWVzX3RyaWVkID4gQVNTT0NfUkVUUklFUyApIHsKKwkJCQlyYyA9IC1FVElNRURPVVQ7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRGlkbid0IHRpbWUgb3V0IC0gbGV0IGl0IGtlZXAgZ29pbmcgKi8KKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICggZGV2LT5zdGF0ZSAmIE5FVDgwMjExX1BST0JFRCApCisJCQlkZXYtPmN0eC5hc3NvYy0+dGltZXNfdHJpZWQgPSAwOworCX0KKworCWlmICggISAoIGRldi0+c3RhdGUgJiBORVQ4MDIxMV9QUk9CRUQgKSApIHsKKwkJLyogc3RhdGU6IHByb2JlICovCisKKwkJaWYgKCAhIGRldi0+Y3R4LnByb2JlICkgeworCQkJLyogc3RhcnQgcHJvYmUgKi8KKwkJCWludCBhY3RpdmUgPSBmZXRjaF9pbnR6X3NldHRpbmcgKCBOVUxMLAorCQkJCQkJJm5ldDgwMjExX2FjdGl2ZV9zZXR0aW5nICk7CisJCQlpbnQgYmFuZCA9IGRldi0+aHctPmJhbmRzOworCisJCQlpZiAoIGFjdGl2ZSApCisJCQkJYmFuZCAmPSB+TkVUODAyMTFfQkFORF9CSVRfNUdIWjsKKworCQkJcmMgPSBuZXQ4MDIxMV9wcmVwYXJlX3Byb2JlICggZGV2LCBiYW5kLCBhY3RpdmUgKTsKKwkJCWlmICggcmMgKQorCQkJCWdvdG8gZmFpbDsKKworCQkJZGV2LT5jdHgucHJvYmUgPSBuZXQ4MDIxMV9wcm9iZV9zdGFydCAoIGRldiwgZGV2LT5lc3NpZCwKKwkJCQkJCQkJYWN0aXZlICk7CisJCQlpZiAoICEgZGV2LT5jdHgucHJvYmUgKSB7CisJCQkJZGV2LT5hc3NvY19yYyA9IC1FTk9NRU07CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9CisKKwkJcmMgPSBuZXQ4MDIxMV9wcm9iZV9zdGVwICggZGV2LT5jdHgucHJvYmUgKTsKKwkJaWYgKCAhIHJjICkgeworCQkJcmV0dXJuOwkvKiBzdGlsbCBnb2luZyAqLworCQl9CisKKwkJZGV2LT5hc3NvY2lhdGluZyA9IG5ldDgwMjExX3Byb2JlX2ZpbmlzaF9iZXN0ICggZGV2LT5jdHgucHJvYmUgKTsKKwkJZGV2LT5jdHgucHJvYmUgPSBOVUxMOworCQlpZiAoICEgZGV2LT5hc3NvY2lhdGluZyApIHsKKwkJCWlmICggcmMgPiAwICkgLyogInN1Y2Nlc3NmdWwiIHByb2JlIGZvdW5kIG5vdGhpbmcgKi8KKwkJCQlyYyA9IC1FVElNRURPVVQ7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQkvKiBJZiB3ZSBwcm9iZWQgdXNpbmcgYSBicm9hZGNhc3QgU1NJRCwgcmVjb3JkIHRoYXQKKwkJICAgZmFjdCBmb3IgdGhlIHNldHRpbmdzIGFwcGxpY2F0b3IgYmVmb3JlIHdlIGNsb2JiZXIKKwkJICAgaXQgd2l0aCB0aGUgc3BlY2lmaWMgU1NJRCB3ZSd2ZSBjaG9zZW4uICovCisJCWlmICggISBkZXYtPmVzc2lkWzBdICkKKwkJCWRldi0+c3RhdGUgfD0gTkVUODAyMTFfQVVUT19TU0lEOworCisJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgZm91bmQgbmV0d29yayAlcyAoJXMpXG4iLCBkZXYsCisJCSAgICAgICBkZXYtPmFzc29jaWF0aW5nLT5lc3NpZCwKKwkJICAgICAgIGV0aF9udG9hICggZGV2LT5hc3NvY2lhdGluZy0+YnNzaWQgKSApOworCisJCWRldi0+Y3R4LmFzc29jID0gemFsbG9jICggc2l6ZW9mICggKmRldi0+Y3R4LmFzc29jICkgKTsKKwkJaWYgKCAhIGRldi0+Y3R4LmFzc29jICkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBmYWlsOworCQl9CisKKwkJZGV2LT5zdGF0ZSB8PSBORVQ4MDIxMV9QUk9CRUQ7CisJCWRldi0+Y3R4LmFzc29jLT5tZXRob2QgPSBJRUVFODAyMTFfQVVUSF9PUEVOX1NZU1RFTTsKKworCQlyZXR1cm47CisJfQorCisJLyogUmVjb3JkIHRpbWUgb2Ygc2VuZGluZyB0aGUgcGFja2V0IHdlJ3JlIGFib3V0IHRvIHNlbmQsIGZvciB0aW1lb3V0ICovCisJZGV2LT5jdHguYXNzb2MtPmxhc3RfcGFja2V0ID0gY3VycnRpY2tzKCk7CisKKwlpZiAoICEgKCBkZXYtPnN0YXRlICYgTkVUODAyMTFfQVVUSEVOVElDQVRFRCApICkgeworCQkvKiBzdGF0ZTogcHJlcGFyZSBhbmQgYXV0aGVudGljYXRlICovCisKKwkJaWYgKCBzdGF0dXMgIT0gSUVFRTgwMjExX1NUQVRVU19TVUNDRVNTICkgeworCQkJLyogd2UgdHJpZWQgYXV0aGVudGljYXRpbmcgYWxyZWFkeSwgYnV0IGZhaWxlZCAqLworCQkJaW50IG1ldGhvZCA9IGRldi0+Y3R4LmFzc29jLT5tZXRob2Q7CisKKwkJCWlmICggbWV0aG9kID09IElFRUU4MDIxMV9BVVRIX09QRU5fU1lTVEVNICYmCisJCQkgICAgICggc3RhdHVzID09IElFRUU4MDIxMV9TVEFUVVNfQVVUSF9DSEFMTF9JTlZBTElEIHx8CisJCQkgICAgICAgc3RhdHVzID09IElFRUU4MDIxMV9TVEFUVVNfQVVUSF9BTEdPX1VOU1VQUCApICkgeworCQkJCS8qIE1heWJlIHRoaXMgbmV0d29yayB1c2VzIFNoYXJlZCBLZXk/ICovCisJCQkJZGV2LT5jdHguYXNzb2MtPm1ldGhvZCA9CisJCQkJCUlFRUU4MDIxMV9BVVRIX1NIQVJFRF9LRVk7CisJCQl9IGVsc2UgeworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCisJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgYXV0aGVudGljYXRpbmcgd2l0aCBtZXRob2QgJWRcbiIsIGRldiwKKwkJICAgICAgIGRldi0+Y3R4LmFzc29jLT5tZXRob2QgKTsKKworCQlyYyA9IG5ldDgwMjExX3ByZXBhcmVfYXNzb2MgKCBkZXYsIGRldi0+YXNzb2NpYXRpbmcgKTsKKwkJaWYgKCByYyApCisJCQlnb3RvIGZhaWw7CisKKwkJcmMgPSBuZXQ4MDIxMV9zZW5kX2F1dGggKCBkZXYsIGRldi0+YXNzb2NpYXRpbmcsCisJCQkJCSAgZGV2LT5jdHguYXNzb2MtPm1ldGhvZCApOworCQlpZiAoIHJjICkKKwkJCWdvdG8gZmFpbDsKKworCQlyZXR1cm47CisJfQorCisJaWYgKCAhICggZGV2LT5zdGF0ZSAmIE5FVDgwMjExX0FTU09DSUFURUQgKSApIHsKKwkJLyogc3RhdGU6IGFzc29jaWF0ZSAqLworCisJCWlmICggc3RhdHVzICE9IElFRUU4MDIxMV9TVEFUVVNfU1VDQ0VTUyApCisJCQlnb3RvIGZhaWw7CisKKwkJREJHQyAoIGRldiwgIjgwMi4xMSAlcCBhc3NvY2lhdGluZ1xuIiwgZGV2ICk7CisKKwkJaWYgKCBkZXYtPmhhbmRzaGFrZXIgJiYgZGV2LT5oYW5kc2hha2VyLT5zdGFydCAmJgorCQkgICAgICEgZGV2LT5oYW5kc2hha2VyLT5zdGFydGVkICkgeworCQkJcmMgPSBkZXYtPmhhbmRzaGFrZXItPnN0YXJ0ICggZGV2ICk7CisJCQlpZiAoIHJjIDwgMCApCisJCQkJZ290byBmYWlsOworCQkJZGV2LT5oYW5kc2hha2VyLT5zdGFydGVkID0gMTsKKwkJfQorCisJCXJjID0gbmV0ODAyMTFfc2VuZF9hc3NvYyAoIGRldiwgZGV2LT5hc3NvY2lhdGluZyApOworCQlpZiAoIHJjICkKKwkJCWdvdG8gZmFpbDsKKworCQlyZXR1cm47CisJfQorCisJaWYgKCAhICggZGV2LT5zdGF0ZSAmIE5FVDgwMjExX0NSWVBUT19TWU5DRUQgKSApIHsKKwkJLyogc3RhdGU6IGNyeXB0byBzeW5jICovCisJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgc2VjdXJpdHkgaGFuZHNoYWtpbmdcbiIsIGRldiApOworCisJCWlmICggISBkZXYtPmhhbmRzaGFrZXIgfHwgISBkZXYtPmhhbmRzaGFrZXItPnN0ZXAgKSB7CisJCQlkZXYtPnN0YXRlIHw9IE5FVDgwMjExX0NSWVBUT19TWU5DRUQ7CisJCQlyZXR1cm47CisJCX0KKworCQlyYyA9IGRldi0+aGFuZHNoYWtlci0+c3RlcCAoIGRldiApOworCisJCWlmICggcmMgPCAwICkgeworCQkJLyogT25seSByZWNvcmQgdGhlIHJldHVybmVkIGVycm9yIGlmIHdlJ3JlCisJCQkgICBzdGlsbCBtYXJrZWQgYXMgYXNzb2NpYXRlZCwgYmVjYXVzZSBhbgorCQkJICAgYXN5bmNocm9ub3VzIGVycm9yIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4KKwkJCSAgIHJlcG9ydGVkIHRvIG5ldDgwMjExX2RlYXV0aGVudGljYXRlKCkgYW5kCisJCQkgICBhc3NvY19yYyB0aGVyZWJ5IHNldC4gKi8KKwkJCWlmICggZGV2LT5zdGF0ZSAmIE5FVDgwMjExX0FTU09DSUFURUQgKQorCQkJCWRldi0+YXNzb2NfcmMgPSByYzsKKwkJCXJjID0gMDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmICggcmMgPiAwICkgeworCQkJZGV2LT5hc3NvY19yYyA9IDA7CisJCQlkZXYtPnN0YXRlIHw9IE5FVDgwMjExX0NSWVBUT19TWU5DRUQ7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIHN0YXRlOiBkb25lISAqLworCW5ldGRldl9saW5rX3VwICggZGV2LT5uZXRkZXYgKTsKKwlkZXYtPmFzc29jX3JjID0gMDsKKwlkZXYtPnN0YXRlICY9IH5ORVQ4MDIxMV9XT1JLSU5HOworCisJZnJlZSAoIGRldi0+Y3R4LmFzc29jICk7CisJZGV2LT5jdHguYXNzb2MgPSBOVUxMOworCisJbmV0ODAyMTFfZnJlZV93bGFuICggZGV2LT5hc3NvY2lhdGluZyApOworCWRldi0+YXNzb2NpYXRpbmcgPSBOVUxMOworCisJZGV2LT5yY3RsID0gcmM4MDIxMV9pbml0ICggZGV2ICk7CisKKwlwcm9jZXNzX2RlbCAoIHByb2MgKTsKKworCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgYXNzb2NpYXRlZCB3aXRoICVzICglcylcbiIsIGRldiwKKwkgICAgICAgZGV2LT5lc3NpZCwgZXRoX250b2EgKCBkZXYtPmJzc2lkICkgKTsKKworCXJldHVybjsKKworIGZhaWw6CisJZGV2LT5zdGF0ZSAmPSB+KCBORVQ4MDIxMV9XT1JLSU5HIHwgTkVUODAyMTFfV0FJVElORyApOworCWlmICggcmMgKQorCQlkZXYtPmFzc29jX3JjID0gcmM7CisKKwluZXRkZXZfbGlua19lcnIgKCBkZXYtPm5ldGRldiwgZGV2LT5hc3NvY19yYyApOworCisJLyogV2UgbmV2ZXIgcmVhY2ggaGVyZSBmcm9tIHRoZSBtaWRkbGUgb2YgYSBwcm9iZSwgc28gd2UgZG9uJ3QKKwkgICBuZWVkIHRvIHdvcnJ5IGFib3V0IGZyZWVpbmcgZGV2LT5jdHgucHJvYmUuICovCisKKwlpZiAoIGRldi0+c3RhdGUgJiBORVQ4MDIxMV9QUk9CRUQgKSB7CisJCWZyZWUgKCBkZXYtPmN0eC5hc3NvYyApOworCQlkZXYtPmN0eC5hc3NvYyA9IE5VTEw7CisJfQorCisJbmV0ODAyMTFfZnJlZV93bGFuICggZGV2LT5hc3NvY2lhdGluZyApOworCWRldi0+YXNzb2NpYXRpbmcgPSBOVUxMOworCisJcHJvY2Vzc19kZWwgKCBwcm9jICk7CisKKwlEQkdDICggZGV2LCAiODAyLjExICVwIGFzc29jaWF0aW9uIGZhaWxlZCAoc3RhdGU9JTA0eCk6ICIKKwkgICAgICAgIiVzXG4iLCBkZXYsIGRldi0+c3RhdGUsIHN0cmVycm9yICggZGV2LT5hc3NvY19yYyApICk7CisKKwkvKiBUcnkgaXQgYWdhaW46ICovCisJbmV0ODAyMTFfYXV0b2Fzc29jaWF0ZSAoIGRldiApOworfQorCisvKioKKyAqIENoZWNrIGZvciA4MDIuMTEgU1NJRCBvciBrZXkgdXBkYXRlcworICoKKyAqIFRoaXMgYWN0cyBhcyBhIHNldHRpbmdzIGFwcGxpY2F0b3I7IGlmIHRoZSB1c2VyIGNoYW5nZXMgbmV0WC9zc2lkLAorICogYW5kIG5ldFggaXMgY3VycmVudGx5IG9wZW4sIHRoZSBhc3NvY2lhdGlvbiB0YXNrIHdpbGwgYmUgaW52b2tlZAorICogYWdhaW4uIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIGVuY3J5cHRpb24ga2V5LCB0aGUgY3VycmVudCBzZWN1cml0eQorICogaGFuZHNoYWtlciB3aWxsIGJlIGFza2VkIHRvIHVwZGF0ZSBpdHMgc3RhdGUgdG8gbWF0Y2g7IGlmIHRoYXQgaXMKKyAqIGltcG9zc2libGUgd2l0aG91dCByZWFzc29jaWF0aW9uLCB3ZSByZWFzc29jaWF0ZS4KKyAqLworc3RhdGljIGludCBuZXQ4MDIxMV9jaGVja19zZXR0aW5nc191cGRhdGUgKCB2b2lkICkKK3sKKwlzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXY7CisJY2hhciBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU4gKyAxXTsKKwlpbnQga2V5X3JlYXNzb2M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggZGV2LCAmbmV0ODAyMTFfZGV2aWNlcywgbGlzdCApIHsKKwkJaWYgKCAhICggZGV2LT5uZXRkZXYtPnN0YXRlICYgTkVUREVWX09QRU4gKSApCisJCQljb250aW51ZTsKKworCQlrZXlfcmVhc3NvYyA9IDA7CisJCWlmICggZGV2LT5oYW5kc2hha2VyICYmIGRldi0+aGFuZHNoYWtlci0+Y2hhbmdlX2tleSAmJgorCQkgICAgIGRldi0+aGFuZHNoYWtlci0+Y2hhbmdlX2tleSAoIGRldiApIDwgMCApCisJCQlrZXlfcmVhc3NvYyA9IDE7CisKKwkJZmV0Y2hfc3RyaW5nX3NldHRpbmcgKCBuZXRkZXZfc2V0dGluZ3MgKCBkZXYtPm5ldGRldiApLAorCQkJCSAgICAgICAmbmV0ODAyMTFfc3NpZF9zZXR0aW5nLCBzc2lkLAorCQkJCSAgICAgICBJRUVFODAyMTFfTUFYX1NTSURfTEVOICsgMSApOworCisJCWlmICgga2V5X3JlYXNzb2MgfHwKKwkJICAgICAoICEgKCAhIHNzaWRbMF0gJiYgKCBkZXYtPnN0YXRlICYgTkVUODAyMTFfQVVUT19TU0lEICkgKSAmJgorCQkgICAgICAgc3RyY21wICggc3NpZCwgZGV2LT5lc3NpZCApICE9IDAgKSApIHsKKwkJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgdXBkYXRpbmcgYXNzb2NpYXRpb246ICIKKwkJCSAgICAgICAiJXMgLT4gJXNcbiIsIGRldiwgZGV2LT5lc3NpZCwgc3NpZCApOworCQkJbmV0ODAyMTFfYXV0b2Fzc29jaWF0ZSAoIGRldiApOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU3RhcnQgODAyLjExIGFzc29jaWF0aW9uIHByb2Nlc3MKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICoKKyAqIElmIHRoZSBhc3NvY2lhdGlvbiBwcm9jZXNzIGlzIHJ1bm5pbmcsIGl0IHdpbGwgYmUgcmVzdGFydGVkLgorICovCit2b2lkIG5ldDgwMjExX2F1dG9hc3NvY2lhdGUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKQoreworCWlmICggISAoIGRldi0+c3RhdGUgJiBORVQ4MDIxMV9XT1JLSU5HICkgKSB7CisJCURCR0MyICggZGV2LCAiODAyLjExICVwIHNwYXduaW5nIGFzc29jaWF0aW9uIHByb2Nlc3NcbiIsIGRldiApOworCQlwcm9jZXNzX2FkZCAoICZkZXYtPnByb2NfYXNzb2MgKTsKKwl9IGVsc2UgeworCQlEQkdDMiAoIGRldiwgIjgwMi4xMSAlcCByZXN0YXJ0aW5nIGFzc29jaWF0aW9uXG4iLCBkZXYgKTsKKwl9CisKKwkvKiBDbGVhbiB1cCBldmVyeXRoaW5nIGFuIGVhcmxpZXIgYXNzb2NpYXRpb24gcHJvY2VzcyBtaWdodAorCSAgIGhhdmUgYmVlbiBpbiB0aGUgbWlkZGxlIG9mIHVzaW5nICovCisJaWYgKCBkZXYtPmFzc29jaWF0aW5nICkKKwkJbmV0ODAyMTFfZnJlZV93bGFuICggZGV2LT5hc3NvY2lhdGluZyApOworCisJaWYgKCAhICggZGV2LT5zdGF0ZSAmIE5FVDgwMjExX1BST0JFRCApICkKKwkJbmV0ODAyMTFfZnJlZV93bGFuICgKKwkJCW5ldDgwMjExX3Byb2JlX2ZpbmlzaF9iZXN0ICggZGV2LT5jdHgucHJvYmUgKSApOworCWVsc2UKKwkJZnJlZSAoIGRldi0+Y3R4LmFzc29jICk7CisKKwkvKiBSZXNldCB0byBhIGNsZWFuIHN0YXRlICovCisJZmV0Y2hfc3RyaW5nX3NldHRpbmcgKCBuZXRkZXZfc2V0dGluZ3MgKCBkZXYtPm5ldGRldiApLAorCQkJICAgICAgICZuZXQ4MDIxMV9zc2lkX3NldHRpbmcsIGRldi0+ZXNzaWQsCisJCQkgICAgICAgSUVFRTgwMjExX01BWF9TU0lEX0xFTiArIDEgKTsKKwlkZXYtPmN0eC5wcm9iZSA9IE5VTEw7CisJZGV2LT5hc3NvY2lhdGluZyA9IE5VTEw7CisJZGV2LT5hc3NvY19yYyA9IDA7CisJbmV0ODAyMTFfc2V0X3N0YXRlICggZGV2LCBORVQ4MDIxMV9QUk9CRUQsIE5FVDgwMjExX1dPUktJTkcsIDAgKTsKK30KKworLyoqCisgKiBQaWNrIFRYIHJhdGUgZm9yIFJUUy9DVFMgcGFja2V0cyBiYXNlZCBvbiBkYXRhIHJhdGUKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICoKKyAqIFRoZSBSVFMvQ1RTIHJhdGUgaXMgdGhlIGZhc3Rlc3QgVFggcmF0ZSBtYXJrZWQgYXMgImJhc2ljIiB0aGF0IGlzCisgKiBub3QgZmFzdGVyIHRoYW4gdGhlIGRhdGEgcmF0ZS4KKyAqLworc3RhdGljIHZvaWQgbmV0ODAyMTFfc2V0X3J0c2N0c19yYXRlICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICkKK3sKKwl1MTYgZGF0YXJhdGUgPSBkZXYtPnJhdGVzW2Rldi0+cmF0ZV07CisJdTE2IHJ0c3JhdGUgPSAwOworCWludCBydHNfaWR4ID0gLTE7CisJaW50IGk7CisKKwlmb3IgKCBpID0gMDsgaSA8IGRldi0+bnJfcmF0ZXM7IGkrKyApIHsKKwkJdTE2IHJhdGUgPSBkZXYtPnJhdGVzW2ldOworCisJCWlmICggISAoIGRldi0+YmFzaWNfcmF0ZXMgJiAoIDEgPDwgaSApICkgfHwgcmF0ZSA+IGRhdGFyYXRlICkKKwkJCWNvbnRpbnVlOworCisJCWlmICggcmF0ZSA+IHJ0c3JhdGUgKSB7CisJCQlydHNyYXRlID0gcmF0ZTsKKwkJCXJ0c19pZHggPSBpOworCQl9CisJfQorCisJLyogSWYgdGhpcyBpcyBpbiBpbml0aWFsaXphdGlvbiwgd2UgbWlnaHQgbm90IGhhdmUgYW55IGJhc2ljCisJICAgcmF0ZXM7IGp1c3QgdXNlIHRoZSBmaXJzdCBkYXRhIHJhdGUgaW4gdGhhdCBjYXNlLiAqLworCWlmICggcnRzX2lkeCA8IDAgKQorCQlydHNfaWR4ID0gMDsKKworCWRldi0+cnRzY3RzX3JhdGUgPSBydHNfaWR4OworfQorCisvKioKKyAqIFNldCBkYXRhIHRyYW5zbWlzc2lvbiByYXRlIGZvciA4MDIuMTEgZGV2aWNlCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IHJhdGUJUmF0ZSB0byBzZXQsIGFzIGluZGV4IGludG8gQGMgZGV2LT5yYXRlcyBhcnJheQorICovCit2b2lkIG5ldDgwMjExX3NldF9yYXRlX2lkeCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IHJhdGUgKQoreworCWFzc2VydCAoIGRldi0+bmV0ZGV2LT5zdGF0ZSAmIE5FVERFVl9PUEVOICk7CisKKwlpZiAoIHJhdGUgPj0gMCAmJiByYXRlIDwgZGV2LT5ucl9yYXRlcyAmJiByYXRlICE9IGRldi0+cmF0ZSApIHsKKwkJREJHQzIgKCBkZXYsICI4MDIuMTEgJXAgY2hhbmdpbmcgcmF0ZSBmcm9tICVkLT4lZCBNYnBzXG4iLAorCQkJZGV2LCBkZXYtPnJhdGVzW2Rldi0+cmF0ZV0gLyAxMCwKKwkJCWRldi0+cmF0ZXNbcmF0ZV0gLyAxMCApOworCisJCWRldi0+cmF0ZSA9IHJhdGU7CisJCW5ldDgwMjExX3NldF9ydHNjdHNfcmF0ZSAoIGRldiApOworCQlkZXYtPm9wLT5jb25maWcgKCBkZXYsIE5FVDgwMjExX0NGR19SQVRFICk7CisJfQorfQorCisvKioKKyAqIENvbmZpZ3VyZSA4MDIuMTEgZGV2aWNlIHRvIHRyYW5zbWl0IG9uIGEgY2VydGFpbiBjaGFubmVsCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IGNoYW5uZWwJQ2hhbm5lbCBudW1iZXIgKDEtMTEgZm9yIDIuNEdIeikgdG8gdHJhbnNtaXQgb24KKyAqLworaW50IG5ldDgwMjExX2NoYW5nZV9jaGFubmVsICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCApCit7CisJaW50IGksIG9sZGNoYW4gPSBkZXYtPmNoYW5uZWw7CisKKwlhc3NlcnQgKCBkZXYtPm5ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApOworCisJZm9yICggaSA9IDA7IGkgPCBkZXYtPm5yX2NoYW5uZWxzOyBpKysgKSB7CisJCWlmICggZGV2LT5jaGFubmVsc1tpXS5jaGFubmVsX25yID09IGNoYW5uZWwgKSB7CisJCQlkZXYtPmNoYW5uZWwgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIGkgPT0gZGV2LT5ucl9jaGFubmVscyApCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKCBpICE9IG9sZGNoYW4gKQorCQlyZXR1cm4gZGV2LT5vcC0+Y29uZmlnICggZGV2LCBORVQ4MDIxMV9DRkdfQ0hBTk5FTCApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUHJlcGFyZSA4MDIuMTEgZGV2aWNlIGNoYW5uZWwgYW5kIHJhdGUgc2V0IGZvciBzY2FubmluZworICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBiYW5kCVJGIGJhbmQocykgb24gd2hpY2ggdG8gcHJlcGFyZSBmb3Igc2Nhbm5pbmcKKyAqIEB2IGFjdGl2ZQlXaGV0aGVyIHRoZSBzY2FubmluZyB3aWxsIGJlIGFjdGl2ZQorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IG5ldDgwMjExX3ByZXBhcmVfcHJvYmUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCBiYW5kLAorCQkJICAgICBpbnQgYWN0aXZlICkKK3sKKwlhc3NlcnQgKCBkZXYtPm5ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApOworCisJaWYgKCBhY3RpdmUgJiYgKCBiYW5kICYgTkVUODAyMTFfQkFORF9CSVRfNUdIWiApICkgeworCQlEQkdDICggZGV2LCAiODAyLjExICVwIGNhbm5vdCBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZyBvbiAiCisJCSAgICAgICAiNUdIeiBiYW5kXG4iLCBkZXYgKTsKKwkJcmV0dXJuIC1FSU5WQUxfQUNUSVZFX1NDQU47CisJfQorCisJaWYgKCBiYW5kID09IDAgKSB7CisJCS8qIFRoaXMgY2FuIGhhcHBlbiBmb3IgYSA1R0h6LW9ubHkgY2FyZCB3aXRoIDVHSHoKKwkJICAgc2Nhbm5pbmcgbWFza2VkIG91dCBieSBhbiBhY3RpdmUgcmVxdWVzdC4gKi8KKwkJREJHQyAoIGRldiwgIjgwMi4xMSAlcCBhc2tlZCB0byBwcmVwYXJlIGZvciBzY2FubmluZyBub3RoaW5nXG4iLAorCQkgICAgICAgZGV2ICk7CisJCXJldHVybiAtRUlOVkFMX0FDVElWRV9TQ0FOOworCX0KKworCWRldi0+bnJfY2hhbm5lbHMgPSAwOworCisJaWYgKCBhY3RpdmUgKQorCQluZXQ4MDIxMV9hZGRfY2hhbm5lbHMgKCBkZXYsIDEsIDExLCBORVQ4MDIxMV9SRUdfVFhQT1dFUiApOworCWVsc2UgeworCQlpZiAoIGJhbmQgJiBORVQ4MDIxMV9CQU5EX0JJVF8yR0haICkKKwkJCW5ldDgwMjExX2FkZF9jaGFubmVscyAoIGRldiwgMSwgMTQsCisJCQkJCQlORVQ4MDIxMV9SRUdfVFhQT1dFUiApOworCQlpZiAoIGJhbmQgJiBORVQ4MDIxMV9CQU5EX0JJVF81R0haICkKKwkJCW5ldDgwMjExX2FkZF9jaGFubmVscyAoIGRldiwgMzYsIDgsCisJCQkJCQlORVQ4MDIxMV9SRUdfVFhQT1dFUiApOworCX0KKworCW5ldDgwMjExX2ZpbHRlcl9od19jaGFubmVscyAoIGRldiApOworCisJLyogVXNlIGNoYW5uZWwgMSBmb3Igbm93ICovCisJZGV2LT5jaGFubmVsID0gMDsKKwlkZXYtPm9wLT5jb25maWcgKCBkZXYsIE5FVDgwMjExX0NGR19DSEFOTkVMICk7CisKKwkvKiBBbHdheXMgZG8gYWN0aXZlIHByb2JlcyBhdCBsb3dlc3QgKHByZXN1bWFibHkgZmlyc3QpIHNwZWVkICovCisJZGV2LT5yYXRlID0gMDsKKwlkZXYtPm5yX3JhdGVzID0gMTsKKwlkZXYtPnJhdGVzWzBdID0gZGV2LT5ody0+cmF0ZXNbZGV2LT5jaGFubmVsc1swXS5iYW5kXVswXTsKKwlkZXYtPm9wLT5jb25maWcgKCBkZXYsIE5FVDgwMjExX0NGR19SQVRFICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQcmVwYXJlIDgwMi4xMSBkZXZpY2UgY2hhbm5lbCBhbmQgcmF0ZSBzZXQgZm9yIGNvbW11bmljYXRpb24KKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgd2xhbglXTEFOIHRvIHByZXBhcmUgZm9yIGNvbW11bmljYXRpb24gd2l0aAorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IG5ldDgwMjExX3ByZXBhcmVfYXNzb2MgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBuZXQ4MDIxMV93bGFuICp3bGFuICkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICpoZHIgPSB3bGFuLT5iZWFjb24tPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9iZWFjb24gKmJlYWNvbiA9CisJCSggc3RydWN0IGllZWU4MDIxMV9iZWFjb24gKiApIGhkci0+ZGF0YTsKKwlzdHJ1Y3QgbmV0ODAyMTFfaGFuZHNoYWtlciAqaGFuZHNoYWtlcjsKKwlpbnQgcmM7CisKKwlhc3NlcnQgKCBkZXYtPm5ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApOworCisJbmV0ODAyMTFfc2V0X3N0YXRlICggZGV2LCBORVQ4MDIxMV9BU1NPQ0lBVEVELCAwLCAwICk7CisJbWVtY3B5ICggZGV2LT5ic3NpZCwgd2xhbi0+YnNzaWQsIEVUSF9BTEVOICk7CisJc3RyY3B5ICggZGV2LT5lc3NpZCwgd2xhbi0+ZXNzaWQgKTsKKworCWZyZWUgKCBkZXYtPnJzbl9pZSApOworCWRldi0+cnNuX2llID0gTlVMTDsKKworCWRldi0+bGFzdF9iZWFjb25fdGltZXN0YW1wID0gYmVhY29uLT50aW1lc3RhbXA7CisJZGV2LT50eF9iZWFjb25faW50ZXJ2YWwgPSAxMDI0ICogYmVhY29uLT5iZWFjb25faW50ZXJ2YWw7CisKKwkvKiBCYXJyaW5nIGFuIElFIHRoYXQgdGVsbHMgdXMgdGhlIGNoYW5uZWwgb3V0cmlnaHQsIGFzc3VtZQorCSAgIHRoZSBjaGFubmVsIHdlIGhlYXJkIHRoaXMgQVAgYmVzdCBvbiBpcyB0aGUgY2hhbm5lbCBpdCdzCisJICAgY29tbXVuaWNhdGluZyBvbi4gKi8KKwluZXQ4MDIxMV9jaGFuZ2VfY2hhbm5lbCAoIGRldiwgd2xhbi0+Y2hhbm5lbCApOworCisJcmMgPSBuZXQ4MDIxMV9wcm9jZXNzX2NhcGFiICggZGV2LCBiZWFjb24tPmNhcGFiaWxpdHkgKTsKKwlpZiAoIHJjICkKKwkJcmV0dXJuIHJjOworCisJcmMgPSBuZXQ4MDIxMV9wcm9jZXNzX2llICggZGV2LCBiZWFjb24tPmluZm9fZWxlbWVudCwKKwkJCQkgICB3bGFuLT5iZWFjb24tPnRhaWwgKTsKKwlpZiAoIHJjICkKKwkJcmV0dXJuIHJjOworCisJLyogQXNzb2NpYXRlIGF0IHRoZSBsb3dlc3QgcmF0ZSBzbyB3ZSBrbm93IGl0J2xsIGdldCB0aHJvdWdoICovCisJZGV2LT5yYXRlID0gMDsKKwlkZXYtPm9wLT5jb25maWcgKCBkZXYsIE5FVDgwMjExX0NGR19SQVRFICk7CisKKwkvKiBGcmVlIG9sZCBoYW5kc2hha2VyIGFuZCBjcnlwdG8sIGlmIHRoZXkgZXhpc3QgKi8KKwlpZiAoIGRldi0+aGFuZHNoYWtlciAmJiBkZXYtPmhhbmRzaGFrZXItPnN0b3AgJiYKKwkgICAgIGRldi0+aGFuZHNoYWtlci0+c3RhcnRlZCApCisJCWRldi0+aGFuZHNoYWtlci0+c3RvcCAoIGRldiApOworCWZyZWUgKCBkZXYtPmhhbmRzaGFrZXIgKTsKKwlkZXYtPmhhbmRzaGFrZXIgPSBOVUxMOworCWZyZWUgKCBkZXYtPmNyeXB0byApOworCWZyZWUgKCBkZXYtPmdjcnlwdG8gKTsKKwlkZXYtPmNyeXB0byA9IGRldi0+Z2NyeXB0byA9IE5VTEw7CisKKwkvKiBGaW5kIG5ldyBzZWN1cml0eSBoYW5kc2hha2VyIHRvIHVzZSAqLworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggaGFuZHNoYWtlciwgTkVUODAyMTFfSEFORFNIQUtFUlMgKSB7CisJCWlmICggaGFuZHNoYWtlci0+cHJvdG9jb2wgPT0gd2xhbi0+aGFuZHNoYWtpbmcgKSB7CisJCQlkZXYtPmhhbmRzaGFrZXIgPSB6YWxsb2MgKCBzaXplb2YgKCAqaGFuZHNoYWtlciApICsKKwkJCQkJCSAgIGhhbmRzaGFrZXItPnByaXZfbGVuICk7CisJCQlpZiAoICEgZGV2LT5oYW5kc2hha2VyICkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJbWVtY3B5ICggZGV2LT5oYW5kc2hha2VyLCBoYW5kc2hha2VyLAorCQkJCSBzaXplb2YgKCAqaGFuZHNoYWtlciApICk7CisJCQlkZXYtPmhhbmRzaGFrZXItPnByaXYgPSAoICggdm9pZCAqICkgZGV2LT5oYW5kc2hha2VyICsKKwkJCQkJCSAgc2l6ZW9mICggKmhhbmRzaGFrZXIgKSApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoICggd2xhbi0+aGFuZHNoYWtpbmcgIT0gTkVUODAyMTFfU0VDUFJPVF9OT05FICkgJiYKKwkgICAgICEgZGV2LT5oYW5kc2hha2VyICkgeworCQlEQkdDICggZGV2LCAiODAyLjExICVwIG5vIHN1cHBvcnQgZm9yIGhhbmRzaGFraW5nIHNjaGVtZSAlZFxuIiwKKwkJICAgICAgIGRldiwgd2xhbi0+aGFuZHNoYWtpbmcgKTsKKwkJcmV0dXJuIC0oIEVOT1RTVVAgfCAoIHdsYW4tPmhhbmRzaGFraW5nIDw8IDggKSApOworCX0KKworCS8qIEluaXRpYWxpemUgc2VjdXJpdHkgaGFuZHNoYWtlciAqLworCWlmICggZGV2LT5oYW5kc2hha2VyICkgeworCQlyYyA9IGRldi0+aGFuZHNoYWtlci0+aW5pdCAoIGRldiApOworCQlpZiAoIHJjIDwgMCApCisJCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2VuZCA4MDIuMTEgaW5pdGlhbCBhdXRoZW50aWNhdGlvbiBmcmFtZQorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiB3bGFuCVdMQU4gdG8gYXV0aGVudGljYXRlIHdpdGgKKyAqIEB2IG1ldGhvZAlBdXRoZW50aWNhdGlvbiBtZXRob2QKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogQGEgbWV0aG9kIG1heSBiZSAwIGZvciBPcGVuIFN5c3RlbSBhdXRoZW50aWNhdGlvbiBvciAxIGZvciBTaGFyZWQKKyAqIEtleSBhdXRoZW50aWNhdGlvbi4gT3BlbiBTeXN0ZW0gcHJvdmlkZXMgbm8gc2VjdXJpdHkgaW4gYXNzb2NpYXRpb24KKyAqIHdoYXRzb2V2ZXIsIHJlbHlpbmcgb24gZW5jcnlwdGlvbiBmb3IgY29uZmlkZW50aWFsaXR5LCBidXQgU2hhcmVkCisgKiBLZXkgYWN0aXZlbHkgaW50cm9kdWNlcyBzZWN1cml0eSBwcm9ibGVtcyBhbmQgaXMgdmVyeSByYXJlbHkgdXNlZC4KKyAqLworaW50IG5ldDgwMjExX3NlbmRfYXV0aCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgbmV0ODAyMTFfd2xhbiAqd2xhbiwgaW50IG1ldGhvZCApCit7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gYWxsb2NfaW9iICggNjQgKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2F1dGggKmF1dGg7CisKKwluZXQ4MDIxMV9zZXRfc3RhdGUgKCBkZXYsIDAsIE5FVDgwMjExX1dBSVRJTkcsIDAgKTsKKwlpb2JfcmVzZXJ2ZSAoIGlvYiwgSUVFRTgwMjExX1RZUF9GUkFNRV9IRUFERVJfTEVOICk7CisJYXV0aCA9IGlvYl9wdXQgKCBpb2IsIHNpemVvZiAoICphdXRoICkgKTsKKwlhdXRoLT5hbGdvcml0aG0gPSBtZXRob2Q7CisJYXV0aC0+dHhfc2VxID0gMTsKKwlhdXRoLT5zdGF0dXMgPSAwOworCisJcmV0dXJuIG5ldDgwMjExX3R4X21nbXQgKCBkZXYsIElFRUU4MDIxMV9TVFlQRV9BVVRILCB3bGFuLT5ic3NpZCwgaW9iICk7Cit9CisKKy8qKgorICogSGFuZGxlIHJlY2VpcHQgb2YgODAyLjExIGF1dGhlbnRpY2F0aW9uIGZyYW1lCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IGlvYglJL08gYnVmZmVyCisgKgorICogSWYgdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBiZWluZyB1c2VkIGlzIFNoYXJlZCBLZXksIGFuZCB0aGUKKyAqIGZyYW1lIHRoYXQgd2FzIHJlY2VpdmVkIGluY2x1ZGVkIGNoYWxsZW5nZSB0ZXh0LCB0aGUgZnJhbWUgaXMKKyAqIGVuY3J5cHRlZCB1c2luZyB0aGUgY3J5cHRvc3lzdGVtIGN1cnJlbnRseSBpbiBlZmZlY3QgYW5kIHNlbnQgYmFjaworICogdG8gdGhlIEFQIHRvIGNvbXBsZXRlIHRoZSBhdXRoZW50aWNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgbmV0ODAyMTFfaGFuZGxlX2F1dGggKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGlvX2J1ZmZlciAqaW9iICkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICpoZHIgPSBpb2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoICphdXRoID0KKwkgICAgKCBzdHJ1Y3QgaWVlZTgwMjExX2F1dGggKiApIGhkci0+ZGF0YTsKKworCWlmICggYXV0aC0+dHhfc2VxICYgMSApIHsKKwkJREJHQyAoIGRldiwgIjgwMi4xMSAlcCBhdXRoZW50aWNhdGlvbiByZWNlaXZlZCBpbXByb3Blcmx5ICIKKwkJICAgICAgICJkaXJlY3RlZCBmcmFtZSAoc2VxLiAlZClcbiIsIGRldiwgYXV0aC0+dHhfc2VxICk7CisJCW5ldDgwMjExX3NldF9zdGF0ZSAoIGRldiwgTkVUODAyMTFfV0FJVElORywgMCwKKwkJCQkgICAgIElFRUU4MDIxMV9TVEFUVVNfRkFJTFVSRSApOworCQlyZXR1cm47CisJfQorCisJaWYgKCBhdXRoLT5zdGF0dXMgIT0gSUVFRTgwMjExX1NUQVRVU19TVUNDRVNTICkgeworCQlEQkdDICggZGV2LCAiODAyLjExICVwIGF1dGhlbnRpY2F0aW9uIGZhaWxlZDogc3RhdHVzICVkXG4iLAorCQkgICAgICAgZGV2LCBhdXRoLT5zdGF0dXMgKTsKKwkJbmV0ODAyMTFfc2V0X3N0YXRlICggZGV2LCBORVQ4MDIxMV9XQUlUSU5HLCAwLAorCQkJCSAgICAgYXV0aC0+c3RhdHVzICk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIGF1dGgtPmFsZ29yaXRobSA9PSBJRUVFODAyMTFfQVVUSF9TSEFSRURfS0VZICYmICEgZGV2LT5jcnlwdG8gKSB7CisJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgY2FuJ3QgcGVyZm9ybSBzaGFyZWQta2V5IGF1dGhlbnRpY2F0aW9uICIKKwkJICAgICAgICJ3aXRob3V0IGEgY3J5cHRvc3lzdGVtXG4iLCBkZXYgKTsKKwkJbmV0ODAyMTFfc2V0X3N0YXRlICggZGV2LCBORVQ4MDIxMV9XQUlUSU5HLCAwLAorCQkJCSAgICAgSUVFRTgwMjExX1NUQVRVU19GQUlMVVJFICk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIGF1dGgtPmFsZ29yaXRobSA9PSBJRUVFODAyMTFfQVVUSF9TSEFSRURfS0VZICYmCisJICAgICBhdXRoLT50eF9zZXEgPT0gMiApIHsKKwkJLyogU2luY2UgdGhlIGlvYiB3ZSBnb3QgaXMgZ29pbmcgdG8gYmUgZnJlZWQgYXMgc29vbgorCQkgICBhcyB3ZSByZXR1cm4sIHdlIGNhbiBkbyBzb21lIGluLXBsYWNlCisJCSAgIG1vZGlmaWNhdGlvbi4gKi8KKwkJYXV0aC0+dHhfc2VxID0gMzsKKwkJYXV0aC0+c3RhdHVzID0gMDsKKworCQltZW1jcHkgKCBoZHItPmFkZHIyLCBoZHItPmFkZHIxLCBFVEhfQUxFTiApOworCQltZW1jcHkgKCBoZHItPmFkZHIxLCBoZHItPmFkZHIzLCBFVEhfQUxFTiApOworCisJCW5ldGRldl90eCAoIGRldi0+bmV0ZGV2LAorCQkJICAgIGRldi0+Y3J5cHRvLT5lbmNyeXB0ICggZGV2LT5jcnlwdG8sIGlvYiApICk7CisJCXJldHVybjsKKwl9CisKKwluZXQ4MDIxMV9zZXRfc3RhdGUgKCBkZXYsIE5FVDgwMjExX1dBSVRJTkcsIE5FVDgwMjExX0FVVEhFTlRJQ0FURUQsCisJCQkgICAgIElFRUU4MDIxMV9TVEFUVVNfU1VDQ0VTUyApOworCisJcmV0dXJuOworfQorCisvKioKKyAqIFNlbmQgODAyLjExIGFzc29jaWF0aW9uIGZyYW1lCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IHdsYW4JV0xBTiB0byBhc3NvY2lhdGUgd2l0aAorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IG5ldDgwMjExX3NlbmRfYXNzb2MgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBuZXQ4MDIxMV93bGFuICp3bGFuICkKK3sKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2IgPSBhbGxvY19pb2IgKCAxMjggKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcSAqYXNzb2M7CisJdW5pb24gaWVlZTgwMjExX2llICppZTsKKworCW5ldDgwMjExX3NldF9zdGF0ZSAoIGRldiwgMCwgTkVUODAyMTFfV0FJVElORywgMCApOworCisJaW9iX3Jlc2VydmUgKCBpb2IsIElFRUU4MDIxMV9UWVBfRlJBTUVfSEVBREVSX0xFTiApOworCWFzc29jID0gaW9iLT5kYXRhOworCisJYXNzb2MtPmNhcGFiaWxpdHkgPSBJRUVFODAyMTFfQ0FQQUJfTUFOQUdFRDsKKwlpZiAoICEgKCBkZXYtPmh3LT5mbGFncyAmIE5FVDgwMjExX0hXX05PX1NIT1JUX1BSRUFNQkxFICkgKQorCQlhc3NvYy0+Y2FwYWJpbGl0eSB8PSBJRUVFODAyMTFfQ0FQQUJfU0hPUlRfUE1CTDsKKwlpZiAoICEgKCBkZXYtPmh3LT5mbGFncyAmIE5FVDgwMjExX0hXX05PX1NIT1JUX1NMT1QgKSApCisJCWFzc29jLT5jYXBhYmlsaXR5IHw9IElFRUU4MDIxMV9DQVBBQl9TSE9SVF9TTE9UOworCWlmICggd2xhbi0+Y3J5cHRvICkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gSUVFRTgwMjExX0NBUEFCX1BSSVZBQ1k7CisKKwlhc3NvYy0+bGlzdGVuX2ludGVydmFsID0gMTsKKworCWllID0gbmV0ODAyMTFfbWFyc2hhbF9yZXF1ZXN0X2luZm8gKCBkZXYsIGFzc29jLT5pbmZvX2VsZW1lbnQgKTsKKworCURCR1AgKCAiODAyLjExICVwIGFib3V0IHRvIHNlbmQgYXNzb2NpYXRpb24gcmVxdWVzdDpcbiIsIGRldiApOworCURCR1BfSEQgKCBpb2ItPmRhdGEsICggdm9pZCAqICkgaWUgLSBpb2ItPmRhdGEgKTsKKworCWlvYl9wdXQgKCBpb2IsICggdm9pZCAqICkgaWUgLSBpb2ItPmRhdGEgKTsKKworCXJldHVybiBuZXQ4MDIxMV90eF9tZ210ICggZGV2LCBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRLAorCQkJCSAgd2xhbi0+YnNzaWQsIGlvYiApOworfQorCisvKioKKyAqIEhhbmRsZSByZWNlaXB0IG9mIDgwMi4xMSBhc3NvY2lhdGlvbiByZXBseSBmcmFtZQorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBpb2IJSS9PIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBuZXQ4MDIxMV9oYW5kbGVfYXNzb2NfcmVwbHkgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9iICkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICpoZHIgPSBpb2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwICphc3NvYyA9CisJCSggc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwICogKSBoZHItPmRhdGE7CisKKwluZXQ4MDIxMV9wcm9jZXNzX2NhcGFiICggZGV2LCBhc3NvYy0+Y2FwYWJpbGl0eSApOworCW5ldDgwMjExX3Byb2Nlc3NfaWUgKCBkZXYsIGFzc29jLT5pbmZvX2VsZW1lbnQsIGlvYi0+dGFpbCApOworCisJaWYgKCBhc3NvYy0+c3RhdHVzICE9IElFRUU4MDIxMV9TVEFUVVNfU1VDQ0VTUyApIHsKKwkJREJHQyAoIGRldiwgIjgwMi4xMSAlcCBhc3NvY2lhdGlvbiBmYWlsZWQ6IHN0YXR1cyAlZFxuIiwKKwkJICAgICAgIGRldiwgYXNzb2MtPnN0YXR1cyApOworCQluZXQ4MDIxMV9zZXRfc3RhdGUgKCBkZXYsIE5FVDgwMjExX1dBSVRJTkcsIDAsCisJCQkJICAgICBhc3NvYy0+c3RhdHVzICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBFU1NJRCB3YXMgZmlsbGVkIGJlZm9yZSB0aGUgYXNzb2NpYXRpb24gcmVxdWVzdCB3YXMgc2VudCAqLworCW1lbWNweSAoIGRldi0+YnNzaWQsIGhkci0+YWRkcjMsIEVUSF9BTEVOICk7CisJZGV2LT5haWQgPSBhc3NvYy0+YWlkOworCisJbmV0ODAyMTFfc2V0X3N0YXRlICggZGV2LCBORVQ4MDIxMV9XQUlUSU5HLCBORVQ4MDIxMV9BU1NPQ0lBVEVELAorCQkJICAgICBJRUVFODAyMTFfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworCisvKioKKyAqIFNlbmQgODAyLjExIGRpc2Fzc29jaWF0aW9uIGZyYW1lCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IHJlYXNvbglSZWFzb24gZm9yIGRpc2Fzc29jaWF0aW9uCisgKiBAdiBkZWF1dGgJSWYgVFJVRSwgc2VuZCBkZWF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZGlzYXNzb2NpYXRpb24KKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbmV0ODAyMTFfc2VuZF9kaXNhc3NvYyAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IHJlYXNvbiwKKwkJCQkgICAgaW50IGRlYXV0aCApCit7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gYWxsb2NfaW9iICggNjQgKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICpkaXNhc3NvYzsKKworCWlmICggISAoIGRldi0+c3RhdGUgJiBORVQ4MDIxMV9BU1NPQ0lBVEVEICkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5ldDgwMjExX3NldF9zdGF0ZSAoIGRldiwgTkVUODAyMTFfQVNTT0NJQVRFRCwgMCwgMCApOworCWlvYl9yZXNlcnZlICggaW9iLCBJRUVFODAyMTFfVFlQX0ZSQU1FX0hFQURFUl9MRU4gKTsKKwlkaXNhc3NvYyA9IGlvYl9wdXQgKCBpb2IsIHNpemVvZiAoICpkaXNhc3NvYyApICk7CisJZGlzYXNzb2MtPnJlYXNvbiA9IHJlYXNvbjsKKworCXJldHVybiBuZXQ4MDIxMV90eF9tZ210ICggZGV2LCBkZWF1dGggPyBJRUVFODAyMTFfU1RZUEVfREVBVVRIIDoKKwkJCQkgIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQywgZGV2LT5ic3NpZCwgaW9iICk7Cit9CisKKworLyoqCisgKiBEZWF1dGhlbnRpY2F0ZSBmcm9tIGN1cnJlbnQgbmV0d29yayBhbmQgdHJ5IGFnYWluCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IHJjCVJldHVybiBzdGF0dXMgY29kZSBpbmRpY2F0aW5nIHJlYXNvbgorICoKKyAqIFRoZSBkZWF1dGhlbnRpY2F0aW9uIHdpbGwgYmUgc2VudCB1c2luZyBhbiA4MDIuMTEgInVuc3BlY2lmaWVkCisgKiByZWFzb24iLCBhcyBpcyBjb21tb24sIGJ1dCBAYSByYyB3aWxsIGJlIHNldCBhcyBhIGxpbmstdXAKKyAqIGVycm9yIHRvIGFpZCB0aGUgdXNlciBpbiBkZWJ1Z2dpbmcuCisgKi8KK3ZvaWQgbmV0ODAyMTFfZGVhdXRoZW50aWNhdGUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCByYyApCit7CisJbmV0ODAyMTFfc2VuZF9kaXNhc3NvYyAoIGRldiwgSUVFRTgwMjExX1JFQVNPTl9VTlNQRUNJRklFRCwgMSApOworCWRldi0+YXNzb2NfcmMgPSByYzsKKwluZXRkZXZfbGlua19lcnIgKCBkZXYtPm5ldGRldiwgcmMgKTsKKworCW5ldDgwMjExX2F1dG9hc3NvY2lhdGUgKCBkZXYgKTsKK30KKworCisvKiogU21vb3RoaW5nIGZhY3RvciAoMS03KSBmb3IgbGluayBxdWFsaXR5IGNhbGN1bGF0aW9uICovCisjZGVmaW5lIExRX1NNT09USAk3CisKKy8qKgorICogVXBkYXRlIGxpbmsgcXVhbGl0eSBpbmZvcm1hdGlvbiBiYXNlZCBvbiByZWNlaXZlZCBiZWFjb24KKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgaW9iCUkvTyBidWZmZXIgY29udGFpbmluZyBiZWFjb24KKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIG5ldDgwMjExX3VwZGF0ZV9saW5rX3F1YWxpdHkgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBpb19idWZmZXIgKmlvYiApCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqaGRyID0gaW9iLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfYmVhY29uICpiZWFjb247CisJdTMyIGR0LCByeGk7CisKKwlpZiAoICEgKCBkZXYtPnN0YXRlICYgTkVUODAyMTFfQVNTT0NJQVRFRCApICkKKwkJcmV0dXJuOworCisJYmVhY29uID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqICkgaGRyLT5kYXRhOworCWR0ID0gKCB1MzIgKSAoIGJlYWNvbi0+dGltZXN0YW1wIC0gZGV2LT5sYXN0X2JlYWNvbl90aW1lc3RhbXAgKTsKKwlyeGkgPSBkZXYtPnJ4X2JlYWNvbl9pbnRlcnZhbDsKKworCXJ4aSA9ICggTFFfU01PT1RIICogcnhpICkgKyAoICggOCAtIExRX1NNT09USCApICogZHQgKTsKKwlkZXYtPnJ4X2JlYWNvbl9pbnRlcnZhbCA9IHJ4aSA+PiAzOworCisJZGV2LT5sYXN0X2JlYWNvbl90aW1lc3RhbXAgPSBiZWFjb24tPnRpbWVzdGFtcDsKK30KKworCisvKioKKyAqIEhhbmRsZSByZWNlaXB0IG9mIDgwMi4xMSBtYW5hZ2VtZW50IGZyYW1lCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IGlvYglJL08gYnVmZmVyCisgKiBAdiBzaWduYWwJU2lnbmFsIHN0cmVuZ3RoIG9mIHJlY2VpdmVkIGZyYW1lCisgKi8KK3N0YXRpYyB2b2lkIG5ldDgwMjExX2hhbmRsZV9tZ210ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBpb19idWZmZXIgKmlvYiwgaW50IHNpZ25hbCApCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqaGRyID0gaW9iLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgKmRpc2Fzc29jOworCXUxNiBzdHlwZSA9IGhkci0+ZmMgJiBJRUVFODAyMTFfRkNfU1VCVFlQRTsKKwlpbnQga2VlcCA9IDA7CisJaW50IGlzX2RlYXV0aCA9ICggc3R5cGUgPT0gSUVFRTgwMjExX1NUWVBFX0RFQVVUSCApOworCisJaWYgKCAoIGhkci0+ZmMgJiBJRUVFODAyMTFfRkNfVFlQRSApICE9IElFRUU4MDIxMV9UWVBFX01HTVQgKSB7CisJCWZyZWVfaW9iICggaW9iICk7CisJCXJldHVybjsJCS8qIG9ubHkgaGFuZGxlIG1hbmFnZW1lbnQgZnJhbWVzICovCisJfQorCisJc3dpdGNoICggc3R5cGUgKSB7CisJCS8qIFdlIHJlY29ubmVjdCBvbiBkZWF1dGhlbnRpY2F0aW9uIGFuZCBkaXNhc3NvY2lhdGlvbi4gKi8KKwljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6CisJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6CisJCWRpc2Fzc29jID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICogKSBoZHItPmRhdGE7CisJCW5ldDgwMjExX3NldF9zdGF0ZSAoIGRldiwgaXNfZGVhdXRoID8gTkVUODAyMTFfQVVUSEVOVElDQVRFRCA6CisJCQkJICAgICBORVQ4MDIxMV9BU1NPQ0lBVEVELCAwLAorCQkJCSAgICAgTkVUODAyMTFfSVNfUkVBU09OIHwgZGlzYXNzb2MtPnJlYXNvbiApOworCQlEQkdDICggZGV2LCAiODAyLjExICVwICVzOiByZWFzb24gJWRcbiIsCisJCSAgICAgICBkZXYsIGlzX2RlYXV0aCA/ICJkZWF1dGhlbnRpY2F0ZWQiIDogImRpc2Fzc29jaWF0ZWQiLAorCQkgICAgICAgZGlzYXNzb2MtPnJlYXNvbiApOworCisJCS8qIFRyeSB0byByZWFzc29jaWF0ZSwgaW4gY2FzZSBpdCdzIHRyYW5zaWVudC4gKi8KKwkJbmV0ODAyMTFfYXV0b2Fzc29jaWF0ZSAoIGRldiApOworCisJCWJyZWFrOworCisJCS8qIFdlIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRpb24uICovCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKKwkJaWYgKCAhICggZGV2LT5zdGF0ZSAmIE5FVDgwMjExX0FVVEhFTlRJQ0FURUQgKSApCisJCQluZXQ4MDIxMV9oYW5kbGVfYXV0aCAoIGRldiwgaW9iICk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUDoKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1A6CisJCWlmICggISAoIGRldi0+c3RhdGUgJiBORVQ4MDIxMV9BU1NPQ0lBVEVEICkgKQorCQkJbmV0ODAyMTFfaGFuZGxlX2Fzc29jX3JlcGx5ICggZGV2LCBpb2IgKTsKKwkJYnJlYWs7CisKKwkJLyogV2UgcGFzcyBwcm9iZXMgYW5kIGJlYWNvbnMgb250byBuZXR3b3JrIHNjYW5uaW5nCisJCSAgIGNvZGUuIFBhc3MgYWN0aW9ucyBmb3IgZnV0dXJlIGV4dGVuc2liaWxpdHkuICovCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgorCQluZXQ4MDIxMV91cGRhdGVfbGlua19xdWFsaXR5ICggZGV2LCBpb2IgKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUDoKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ1RJT046CisJCWlmICggZGV2LT5rZWVwX21nbXQgKSB7CisJCQlzdHJ1Y3QgbmV0ODAyMTFfcnhfaW5mbyAqcnhpbmY7CisJCQlyeGluZiA9IHphbGxvYyAoIHNpemVvZiAoICpyeGluZiApICk7CisJCQlpZiAoICEgcnhpbmYgKSB7CisJCQkJREJHQyAoIGRldiwgIjgwMi4xMSAlcCBvdXQgb2YgbWVtb3J5XG4iLCBkZXYgKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJ4aW5mLT5zaWduYWwgPSBzaWduYWw7CisJCQlsaXN0X2FkZF90YWlsICggJmlvYi0+bGlzdCwgJmRldi0+bWdtdF9xdWV1ZSApOworCQkJbGlzdF9hZGRfdGFpbCAoICZyeGluZi0+bGlzdCwgJmRldi0+bWdtdF9pbmZvX3F1ZXVlICk7CisJCQlrZWVwID0gMTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKKwkJLyogU29tZSBub2RlcyBzZW5kIHRoZXNlIGJyb2FkY2FzdC4gSWdub3JlIHRoZW0uICovCisJCWJyZWFrOworCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVROgorCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVROgorCQkvKiBXZSBzaG91bGQgbmV2ZXIgcmVjZWl2ZSB0aGVzZSwgb25seSBzZW5kIHRoZW0uICovCisJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgcmVjZWl2ZWQgc3RyYW5nZSBtYW5hZ2VtZW50IHJlcXVlc3QgIgorCQkgICAgICAgIiglMDR4KVxuIiwgZGV2LCBzdHlwZSApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURCR0MgKCBkZXYsICI4MDIuMTEgJXAgcmVjZWl2ZWQgdW5pbXBsZW1lbnRlZCBtYW5hZ2VtZW50ICIKKwkJICAgICAgICJwYWNrZXQgKCUwNHgpXG4iLCBkZXYsIHN0eXBlICk7CisJCWJyZWFrOworCX0KKworCWlmICggISBrZWVwICkKKwkJZnJlZV9pb2IgKCBpb2IgKTsKK30KKworLyogLS0tLS0tLS0tLSBQYWNrZXQgaGFuZGxpbmcgZnVuY3Rpb25zIC0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBGcmVlIGJ1ZmZlcnMgdXNlZCBieSA4MDIuMTEgZnJhZ21lbnQgY2FjaGUgZW50cnkKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgZmNpZAlGcmFnbWVudCBjYWNoZSBlbnRyeSBpbmRleAorICoKKyAqIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSByZWZlcmVuY2VkIGVudHJ5IHdpbGwgYmUgbWFya2VkIHVudXNlZC4KKyAqLworc3RhdGljIHZvaWQgbmV0ODAyMTFfZnJlZV9mcmFncyAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgaW50IGZjaWQgKQoreworCWludCBqOworCXN0cnVjdCBuZXQ4MDIxMV9mcmFnX2NhY2hlICpmcmFnID0gJmRldi0+ZnJhZ3NbZmNpZF07CisKKwlmb3IgKCBqID0gMDsgaiA8IDE2OyBqKysgKSB7CisJCWlmICggZnJhZy0+aW9iW2pdICkgeworCQkJZnJlZV9pb2IgKCBmcmFnLT5pb2Jbal0gKTsKKwkJCWZyYWctPmlvYltqXSA9IE5VTEw7CisJCX0KKwl9CisKKwlmcmFnLT5zZXFuciA9IDA7CisJZnJhZy0+c3RhcnRfdGlja3MgPSAwOworCWZyYWctPmluX3VzZSA9IDA7Cit9CisKKy8qKgorICogQWNjdW11bGF0ZSA4MDIuMTEgZnJhZ21lbnRzIGludG8gb25lIEkvTyBidWZmZXIKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgZmNpZAlGcmFnbWVudCBjYWNoZSBlbnRyeSBpbmRleAorICogQHYgbmZyYWdzCU51bWJlciBvZiBmcmFnbWVudHMgcmVjZWl2ZWQKKyAqIEB2IHNpemUJU3VtIG9mIHNpemVzIG9mIGFsbCBmcmFnbWVudHMsIGluY2x1ZGluZyBoZWFkZXJzCisgKiBAcmV0IGlvYglJL08gYnVmZmVyIGNvbnRhaW5pbmcgcmVhc3NlbWJsZWQgcGFja2V0CisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBmcmVlIHRoZSBmcmFnbWVudCBidWZmZXJzLgorICovCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqbmV0ODAyMTFfYWNjdW1fZnJhZ3MgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsCisJCQkJCQlpbnQgZmNpZCwgaW50IG5mcmFncywgaW50IHNpemUgKQoreworCXN0cnVjdCBuZXQ4MDIxMV9mcmFnX2NhY2hlICpmcmFnID0gJmRldi0+ZnJhZ3NbZmNpZF07CisJaW50IGhkcnNpemUgPSBJRUVFODAyMTFfVFlQX0ZSQU1FX0hFQURFUl9MRU47CisJaW50IG5zaXplID0gc2l6ZSAtIGhkcnNpemUgKiAoIG5mcmFncyAtIDEgKTsKKwlpbnQgaTsKKworCXN0cnVjdCBpb19idWZmZXIgKm5pb2IgPSBhbGxvY19pb2IgKCBuc2l6ZSApOworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKmhkcjsKKworCS8qIEFkZCB0aGUgaGVhZGVyIGZyb20gdGhlIGZpcnN0IG9uZS4uLiAqLworCW1lbWNweSAoIGlvYl9wdXQgKCBuaW9iLCBoZHJzaXplICksIGZyYWctPmlvYlswXS0+ZGF0YSwgaGRyc2l6ZSApOworCisJLyogLi4uIGFuZCBhbGwgdGhlIGRhdGEgZnJvbSBhbGwgb2YgdGhlbS4gKi8KKwlmb3IgKCBpID0gMDsgaSA8IG5mcmFnczsgaSsrICkgeworCQlpbnQgbGVuID0gaW9iX2xlbiAoIGZyYWctPmlvYltpXSApIC0gaGRyc2l6ZTsKKwkJbWVtY3B5ICggaW9iX3B1dCAoIG5pb2IsIGxlbiApLAorCQkJIGZyYWctPmlvYltpXS0+ZGF0YSArIGhkcnNpemUsIGxlbiApOworCX0KKworCS8qIFR1cm4gb2ZmIHRoZSBmcmFnbWVudCBiaXQuICovCisJaGRyID0gbmlvYi0+ZGF0YTsKKwloZHItPmZjICY9IH5JRUVFODAyMTFfRkNfTU9SRV9GUkFHOworCisJcmV0dXJuIG5pb2I7Cit9CisKKy8qKgorICogSGFuZGxlIHJlY2VpcHQgb2YgODAyLjExIGZyYWdtZW50CisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IGlvYglJL08gYnVmZmVyIGNvbnRhaW5pbmcgZnJhZ21lbnQKKyAqIEB2IHNpZ25hbAlTaWduYWwgc3RyZW5ndGggd2l0aCB3aGljaCBmcmFnbWVudCB3YXMgcmVjZWl2ZWQKKyAqLworc3RhdGljIHZvaWQgbmV0ODAyMTFfcnhfZnJhZyAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2IsIGludCBzaWduYWwgKQoreworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKmhkciA9IGlvYi0+ZGF0YTsKKwlpbnQgZnJhZ25yID0gSUVFRTgwMjExX0ZSQUcgKCBoZHItPnNlcSApOworCisJaWYgKCBmcmFnbnIgPT0gMCAmJiAoIGhkci0+ZmMgJiBJRUVFODAyMTFfRkNfTU9SRV9GUkFHICkgKSB7CisJCS8qIHN0YXJ0IGEgZnJhZyBjYWNoZSBlbnRyeSAqLworCQlpbnQgaSwgbmV3ZXN0ID0gLTE7CisJCXUzMiBjdXJyX3RpY2tzID0gY3VycnRpY2tzKCksIG5ld2VzdF90aWNrcyA9IDA7CisJCXUzMiB0aW1lb3V0ID0gdGlja3NfcGVyX3NlYygpICogTkVUODAyMTFfRlJBR19USU1FT1VUOworCisJCWZvciAoIGkgPSAwOyBpIDwgTkVUODAyMTFfTlJfQ09OQ1VSUkVOVF9GUkFHUzsgaSsrICkgeworCQkJaWYgKCBkZXYtPmZyYWdzW2ldLmluX3VzZSA9PSAwICkKKwkJCQlicmVhazsKKworCQkJaWYgKCBkZXYtPmZyYWdzW2ldLnN0YXJ0X3RpY2tzICsgdGltZW91dCA+PQorCQkJICAgICBjdXJyX3RpY2tzICkgeworCQkJCW5ldDgwMjExX2ZyZWVfZnJhZ3MgKCBkZXYsIGkgKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCBkZXYtPmZyYWdzW2ldLnN0YXJ0X3RpY2tzID4gbmV3ZXN0X3RpY2tzICkgeworCQkJCW5ld2VzdCA9IGk7CisJCQkJbmV3ZXN0X3RpY2tzID0gZGV2LT5mcmFnc1tpXS5zdGFydF90aWNrczsKKwkJCX0KKwkJfQorCisJCS8qIElmIHdlJ3JlIGJlaW5nIHNlbnQgbW9yZSBjb25jdXJyZW50IGZyYWdtZW50ZWQKKwkJICAgcGFja2V0cyB0aGFuIHdlIGNhbiBoYW5kbGUsIGRyb3AgdGhlIG5ld2VzdCBzbyB0aGUKKwkJICAgb2xkZXIgb25lcyBoYXZlIHRpbWUgdG8gY29tcGxldGUuICovCisJCWlmICggaSA9PSBORVQ4MDIxMV9OUl9DT05DVVJSRU5UX0ZSQUdTICkgeworCQkJaSA9IG5ld2VzdDsKKwkJCW5ldDgwMjExX2ZyZWVfZnJhZ3MgKCBkZXYsIGkgKTsKKwkJfQorCisJCWRldi0+ZnJhZ3NbaV0uaW5fdXNlID0gMTsKKwkJZGV2LT5mcmFnc1tpXS5zZXFuciA9IElFRUU4MDIxMV9TRVFOUiAoIGhkci0+c2VxICk7CisJCWRldi0+ZnJhZ3NbaV0uc3RhcnRfdGlja3MgPSBjdXJydGlja3MoKTsKKwkJZGV2LT5mcmFnc1tpXS5pb2JbMF0gPSBpb2I7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlpbnQgaTsKKwkJZm9yICggaSA9IDA7IGkgPCBORVQ4MDIxMV9OUl9DT05DVVJSRU5UX0ZSQUdTOyBpKysgKSB7CisJCQlpZiAoIGRldi0+ZnJhZ3NbaV0uaW5fdXNlICYmIGRldi0+ZnJhZ3NbaV0uc2VxbnIgPT0KKwkJCSAgICAgSUVFRTgwMjExX1NFUU5SICggaGRyLT5zZXEgKSApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCBpID09IE5FVDgwMjExX05SX0NPTkNVUlJFTlRfRlJBR1MgKSB7CisJCQkvKiBEcm9wIG5vbi1maXJzdCBub3QtaW4tY2FjaGUgZnJhZ21lbnRzICovCisJCQlEQkdDICggZGV2LCAiODAyLjExICVwIGRyb3BwZWQgZnJhZ21lbnQgZmM9JTA0eCAiCisJCQkgICAgICAgInNlcT0lMDR4XG4iLCBkZXYsIGhkci0+ZmMsIGhkci0+c2VxICk7CisJCQlmcmVlX2lvYiAoIGlvYiApOworCQkJcmV0dXJuOworCQl9CisKKwkJZGV2LT5mcmFnc1tpXS5pb2JbZnJhZ25yXSA9IGlvYjsKKworCQlpZiAoICEgKCBoZHItPmZjICYgSUVFRTgwMjExX0ZDX01PUkVfRlJBRyApICkgeworCQkJaW50IGosIHNpemUgPSAwOworCQkJZm9yICggaiA9IDA7IGogPCBmcmFnbnI7IGorKyApIHsKKwkJCQlzaXplICs9IGlvYl9sZW4gKCBkZXYtPmZyYWdzW2ldLmlvYltqXSApOworCQkJCWlmICggZGV2LT5mcmFnc1tpXS5pb2Jbal0gPT0gTlVMTCApCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCBqID09IGZyYWduciApIHsKKwkJCQkvKiBXZSd2ZSBnb3QgZXZlcnl0aGluZyAqLworCQkJCXN0cnVjdCBpb19idWZmZXIgKm5pb2IgPQorCQkJCSAgICBuZXQ4MDIxMV9hY2N1bV9mcmFncyAoIGRldiwgaSwgZnJhZ25yLAorCQkJCQkJCSAgIHNpemUgKTsKKwkJCQluZXQ4MDIxMV9mcmVlX2ZyYWdzICggZGV2LCBpICk7CisJCQkJbmV0ODAyMTFfcnggKCBkZXYsIG5pb2IsIHNpZ25hbCwgMCApOworCQkJfSBlbHNlIHsKKwkJCQlEQkdDICggZGV2LCAiODAyLjExICVwIGRyb3BwaW5nIGZyYWdtZW50ZWQgIgorCQkJCSAgICAgICAicGFja2V0IGR1ZSB0byBvdXQtb2Ytb3JkZXIgYXJyaXZhbCwgIgorCQkJCSAgICAgICAiZmM9JTA0eCBzZXE9JTA0eFxuIiwgZGV2LCBoZHItPmZjLAorCQkJCSAgICAgICBoZHItPnNlcSApOworCQkJCW5ldDgwMjExX2ZyZWVfZnJhZ3MgKCBkZXYsIGkgKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBIYW5kbGUgcmVjZWlwdCBvZiA4MDIuMTEgZnJhbWUKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgaW9iCUkvTyBidWZmZXIKKyAqIEB2IHNpZ25hbAlSZWNlaXZlZCBzaWduYWwgc3RyZW5ndGgKKyAqIEB2IHJhdGUJQml0cmF0ZSBhdCB3aGljaCBmcmFtZSB3YXMgcmVjZWl2ZWQsIGluIDEwMCBrYnBzIHVuaXRzCisgKgorICogSWYgdGhlIHJhdGUgb3Igc2lnbmFsIGlzIHVua25vd24sIDAgc2hvdWxkIGJlIHBhc3NlZC4KKyAqLwordm9pZCBuZXQ4MDIxMV9yeCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiwgc3RydWN0IGlvX2J1ZmZlciAqaW9iLAorCQkgICBpbnQgc2lnbmFsLCB1MTYgcmF0ZSApCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqaGRyID0gaW9iLT5kYXRhOworCXUxNiB0eXBlID0gaGRyLT5mYyAmIElFRUU4MDIxMV9GQ19UWVBFOworCWlmICggKCBoZHItPmZjICYgSUVFRTgwMjExX0ZDX1ZFUlNJT04gKSAhPSBJRUVFODAyMTFfVEhJU19WRVJTSU9OICkKKwkJZ290byBkcm9wOwkvKiBkcm9wIGludmFsaWQtdmVyc2lvbiBwYWNrZXRzICovCisKKwlpZiAoIHR5cGUgPT0gSUVFRTgwMjExX1RZUEVfQ1RSTCApCisJCWdvdG8gZHJvcDsJLyogd2UgZG9uJ3QgaGFuZGxlIGNvbnRyb2wgcGFja2V0cywKKwkJCQkgICB0aGUgaGFyZHdhcmUgZG9lcyAqLworCisJaWYgKCBkZXYtPmxhc3Rfcnhfc2VxID09IGhkci0+c2VxICkKKwkJZ290byBkcm9wOwkvKiBhdm9pZCBkdXBsaWNhdGUgcGFja2V0ICovCisJZGV2LT5sYXN0X3J4X3NlcSA9IGhkci0+c2VxOworCisJaWYgKCBkZXYtPmh3LT5mbGFncyAmIE5FVDgwMjExX0hXX1JYX0hBU19GQ1MgKSB7CisJCS8qIGRpc2NhcmQgdGhlIEZDUyAqLworCQlpb2JfdW5wdXQgKCBpb2IsIDQgKTsKKwl9CisKKwkvKiBPbmx5IGRlY3J5cHQgcGFja2V0cyBmcm9tIG91ciBCU1NJRCwgdG8gYXZvaWQgc3B1cmlvdXMgZXJyb3JzICovCisJaWYgKCAoIGhkci0+ZmMgJiBJRUVFODAyMTFfRkNfUFJPVEVDVEVEICkgJiYKKwkgICAgICEgbWVtY21wICggaGRyLT5hZGRyMiwgZGV2LT5ic3NpZCwgRVRIX0FMRU4gKSApIHsKKwkJLyogRGVjcnlwdCBwYWNrZXQ7IHJlY29yZCBhbmQgZHJvcCBpZiBpdCBmYWlscyAqLworCQlzdHJ1Y3QgaW9fYnVmZmVyICpuaW9iOworCQlzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvICpjcnlwdG8gPSBkZXYtPmNyeXB0bzsKKworCQlpZiAoICEgZGV2LT5jcnlwdG8gKSB7CisJCQlEQkdDICggZGV2LCAiODAyLjExICVwIGNhbm5vdCBkZWNyeXB0IHBhY2tldCAiCisJCQkgICAgICAgIndpdGhvdXQgYSBjcnlwdG9zeXN0ZW1cbiIsIGRldiApOworCQkJZ290byBkcm9wX2NyeXB0OworCQl9CisKKwkJaWYgKCAoIGhkci0+YWRkcjFbMF0gJiAxICkgJiYgZGV2LT5nY3J5cHRvICkgeworCQkJLyogVXNlIGdyb3VwIGRlY3J5cHRpb24gaWYgbmVlZGVkICovCisJCQljcnlwdG8gPSBkZXYtPmdjcnlwdG87CisJCX0KKworCQluaW9iID0gY3J5cHRvLT5kZWNyeXB0ICggY3J5cHRvLCBpb2IgKTsKKwkJaWYgKCAhIG5pb2IgKSB7CisJCQlEQkdDICggZGV2LCAiODAyLjExICVwIGRlY3J5cHRpb24gZXJyb3JcbiIsIGRldiApOworCQkJZ290byBkcm9wX2NyeXB0OworCQl9CisJCWZyZWVfaW9iICggaW9iICk7CisJCWlvYiA9IG5pb2I7CisJfQorCisJZGV2LT5sYXN0X3NpZ25hbCA9IHNpZ25hbDsKKworCS8qIEZyYWdtZW50cyBnbyBpbnRvIHRoZSBmcmFnIGNhY2hlIG9yIGdldCBkcm9wcGVkLiAqLworCWlmICggSUVFRTgwMjExX0ZSQUcgKCBoZHItPnNlcSApICE9IDAKKwkgICAgIHx8ICggaGRyLT5mYyAmIElFRUU4MDIxMV9GQ19NT1JFX0ZSQUcgKSApIHsKKwkJbmV0ODAyMTFfcnhfZnJhZyAoIGRldiwgaW9iLCBzaWduYWwgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1hbmFnZW1lbnQgZnJhbWVzIGdldCBoYW5kbGVkLCBlbnF1ZXVlZCwgb3IgZHJvcHBlZC4gKi8KKwlpZiAoIHR5cGUgPT0gSUVFRTgwMjExX1RZUEVfTUdNVCApIHsKKwkJbmV0ODAyMTFfaGFuZGxlX21nbXQgKCBkZXYsIGlvYiwgc2lnbmFsICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBEYXRhIGZyYW1lcyBnZXQgZHJvcHBlZCBvciBzZW50IHRvIHRoZSBuZXRfZGV2aWNlLiAqLworCWlmICggKCBoZHItPmZjICYgSUVFRTgwMjExX0ZDX1NVQlRZUEUgKSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQSApCisJCWdvdG8gZHJvcDsJLyogZHJvcCBRb1MsIENGUCwgb3IgbnVsbCBkYXRhIHBhY2tldHMgKi8KKworCS8qIFVwZGF0ZSByYXRlLWNvbnRyb2wgYWxnb3JpdGhtICovCisJaWYgKCBkZXYtPnJjdGwgKQorCQlyYzgwMjExX3VwZGF0ZV9yeCAoIGRldiwgaGRyLT5mYyAmIElFRUU4MDIxMV9GQ19SRVRSWSwgcmF0ZSApOworCisJLyogUGFzcyBwYWNrZXQgb253YXJkICovCisJaWYgKCBkZXYtPnN0YXRlICYgTkVUODAyMTFfQVNTT0NJQVRFRCApIHsKKwkJbmV0ZGV2X3J4ICggZGV2LT5uZXRkZXYsIGlvYiApOworCQlyZXR1cm47CisJfQorCisJLyogTm8gYXNzb2NpYXRpb24/IERyb3AgaXQuICovCisJZ290byBkcm9wOworCisgZHJvcF9jcnlwdDoKKwluZXRkZXZfcnhfZXJyICggZGV2LT5uZXRkZXYsIE5VTEwsIEVJTlZBTF9DUllQVE9fUkVRVUVTVCApOworIGRyb3A6CisJREJHQzIgKCBkZXYsICI4MDIuMTEgJXAgZHJvcHBlZCBwYWNrZXQgZmM9JTA0eCBzZXE9JTA0eFxuIiwgZGV2LAorCQloZHItPmZjLCBoZHItPnNlcSApOworCWZyZWVfaW9iICggaW9iICk7CisJcmV0dXJuOworfQorCisvKiogSW5kaWNhdGUgYW4gZXJyb3IgaW4gcmVjZWl2aW5nIGEgcGFja2V0CisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IGlvYglJL08gYnVmZmVyIHdpdGggcmVjZWl2ZWQgcGFja2V0LCBvciBOVUxMCisgKiBAdiByYwlFcnJvciBjb2RlCisgKgorICogVGhpcyBsb2dzIHRoZSBlcnJvciB3aXRoIHRoZSB3cmFwcGluZyBuZXRfZGV2aWNlLCBhbmQgZnJlZXMgaW9iIGlmCisgKiBpdCBpcyBwYXNzZWQuCisgKi8KK3ZvaWQgbmV0ODAyMTFfcnhfZXJyICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9iLCBpbnQgcmMgKQoreworCW5ldGRldl9yeF9lcnIgKCBkZXYtPm5ldGRldiwgaW9iLCByYyApOworfQorCisvKiogSW5kaWNhdGUgdGhlIGNvbXBsZXRlZCB0cmFuc21pc3Npb24gb2YgYSBwYWNrZXQKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgaW9iCUkvTyBidWZmZXIgb2YgdHJhbnNtaXR0ZWQgcGFja2V0CisgKiBAdiByZXRyaWVzCU51bWJlciBvZiB0aW1lcyB0aGlzIHBhY2tldCB3YXMgcmV0cmFuc21pdHRlZAorICogQHYgcmMJRXJyb3IgY29kZSwgb3IgMCBmb3Igc3VjY2VzcworICoKKyAqIFRoaXMgbG9ncyBhbiBlcnJvciB3aXRoIHRoZSB3cmFwcGluZyBuZXRfZGV2aWNlIGlmIG9uZSBvY2N1cnJlZCwKKyAqIGFuZCByZW1vdmVzIGFuZCBmcmVlcyB0aGUgSS9PIGJ1ZmZlciBmcm9tIGl0cyBUWCBxdWV1ZS4gVGhlCisgKiBwcm92aWRlZCByZXRyeSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHR1bmUgb3VyIHRyYW5zbWlzc2lvbiByYXRlLgorICoKKyAqIElmIHRoZSBwYWNrZXQgZGlkIG5vdCBuZWVkIHRvIGJlIHJldHJhbnNtaXR0ZWQgYmVjYXVzZSBpdCB3YXMKKyAqIHByb3Blcmx5IEFDS2VkIHRoZSBmaXJzdCB0aW1lLCBAYSByZXRyaWVzIHNob3VsZCBiZSAwLgorICovCit2b2lkIG5ldDgwMjExX3R4X2NvbXBsZXRlICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYiwgaW50IHJldHJpZXMsIGludCByYyApCit7CisJLyogVXBkYXRlIHJhdGUtY29udHJvbCBhbGdvcml0aG0gKi8KKwlpZiAoIGRldi0+cmN0bCApCisJCXJjODAyMTFfdXBkYXRlX3R4ICggZGV2LCByZXRyaWVzLCByYyApOworCisJLyogUGFzcyBjb21wbGV0aW9uIG9ud2FyZCAqLworCW5ldGRldl90eF9jb21wbGV0ZV9lcnIgKCBkZXYtPm5ldGRldiwgaW9iLCByYyApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0LzgwMjExL3JjODAyMTEuYyBiL2dweGUvc3JjL25ldC84MDIxMS9yYzgwMjExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkMTkxNAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC84MDIxMS9yYzgwMjExLmMKQEAgLTAsMCArMSwzNzEgQEAKKy8qCisgKiBTaW1wbGUgODAyLjExIHJhdGUtY29udHJvbCBhbGdvcml0aG0gZm9yIGdQWEUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxncHhlL25ldDgwMjExLmg+CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBTaW1wbGUgODAyLjExIHJhdGUtY29udHJvbCBhbGdvcml0aG0KKyAqLworCisvKiogQHBhZ2UgcmM4MDIxMSBSYXRlIGNvbnRyb2wgcGhpbG9zb3BoeQorICoKKyAqIFdlIHdhbnQgdG8gbWF4aW1pemUgb3VyIHRyYW5zbWlzc2lvbiBzcGVlZCwgdG8gdGhlIGV4dGVudCB0aGF0IHdlCisgKiBjYW4gZG8gdGhhdCB3aXRob3V0IGRyb3BwaW5nIHVuZHVlIG51bWJlcnMgb2YgcGFja2V0cy4gV2UgYWxzbworICogZG9uJ3Qgd2FudCB0byB0YWtlIHVwIHZlcnkgbXVjaCBjb2RlIHNwYWNlLCBzbyBvdXIgYWxnb3JpdGhtIGhhcyB0bworICogYmUgcHJldHR5IHNpbXBsZQorICoKKyAqIFdoZW4gd2UgcmVjZWl2ZSBhIHBhY2tldCwgd2Uga25vdyB3aGF0IHJhdGUgaXQgd2FzIHRyYW5zbWl0dGVkIGF0LAorICogYW5kIHdoZXRoZXIgaXQgaGFkIHRvIGJlIHJldHJhbnNtaXR0ZWQgdG8gZ2V0IHRvIHVzLgorICoKKyAqIFdoZW4gd2Ugc2VuZCBhIHBhY2tldCwgd2UgaGVhciBiYWNrIGhvdyBtYW55IHRpbWVzIGl0IGhhZCB0byBiZQorICogcmV0cmllZCB0byBnZXQgdGhyb3VnaCwgYW5kIHdoZXRoZXIgaXQgZ290IHRocm91Z2ggYXQgYWxsLgorICoKKyAqIEluZGljYXRpb25zIG9mIFRYIHN1Y2Nlc3MgYXJlIG1vcmUgcmVsaWFibGUgdGhhbiBSWCBzdWNjZXNzLCBidXQgUlgKKyAqIGluZm9ybWF0aW9uIGhlbHBzIHVzIGtub3cgd2hlcmUgdG8gc3RhcnQuCisgKgorICogVG8gaGFuZGxlIGFsbCBvZiB0aGlzLCB3ZSBrZWVwIGZvciBlYWNoIHJhdGUgYW5kIGVhY2ggZGlyZWN0aW9uIChUWAorICogYW5kIFJYIHNlcGFyYXRlbHkpIHNvbWUgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSBtb3N0IHJlY2VudAorICogcGFja2V0cyBvbiB0aGF0IHJhdGUgYW5kIHRoZSBudW1iZXIgb2YgcGFja2V0cyBmb3Igd2hpY2ggd2UgaGF2ZQorICogaW5mb3JtYXRpb24uIFRoZSBzdGF0ZSBpcyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIHdoaWNoIHR3bworICogYml0cyByZXByZXNlbnQgYSBwYWNrZXQ6IDExIGlmIGl0IHdlbnQgdGhyb3VnaCB3ZWxsLCAxMCBpZiBpdCB3ZW50CisgKiB0aHJvdWdoIHdpdGggb25lIHJldHJ5LCAwMSBpZiBpdCB3ZW50IHRocm91Z2ggd2l0aCBtb3JlIHRoYW4gb25lCisgKiByZXRyeSwgb3IgMDAgaWYgaXQgZGlkbid0IGdvIHRocm91Z2ggYXQgYWxsLiBXZSBkZWZpbmUgdGhlCisgKiAiZ29vZG5lc3MiIGZvciBhIHBhcnRpY3VsYXIgKHJhdGUsIGRpcmVjdGlvbikgY29tYmluYXRpb24gYXMgdGhlCisgKiBzdW0gb2YgYWxsIHRoZSAyLWJpdCBmaWVsZHMsIHRpbWVzIDMzLCBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YKKyAqIDItYml0IGZpZWxkcyBjb250YWluaW5nIHZhbGlkIGluZm9ybWF0aW9uICgxNiBleGNlcHQgd2hlbiB3ZSdyZQorICogc3RhcnRpbmcgb3V0KS4gVGhlIG51bWJlciBwcm9kdWNlZCBpcyBiZXR3ZWVuIDAgYW5kIDk5OyB3ZSB1c2UgLTEKKyAqIGZvciByYXRlcyB3aXRoIGxlc3MgdGhhbiA0IFJYIHBhY2tldHMgb3IgMSBUWCwgYXMgYW4gaW5kaWNhdG9yIHRoYXQKKyAqIHdlIGRvIG5vdCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byByZWx5IG9uIHRoZW0uCisgKgorICogSW4gZGVjaWRpbmcgd2hpY2ggcmF0ZXMgYXJlIGJlc3QsIHdlIGZpbmQgdGhlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YKKyAqIFRYIGFuZCBSWCBnb29kbmVzcywgd2hlcmUgdGhlIHdlaWdodGluZyBpcyBieSBudW1iZXIgb2YgcGFja2V0cworICogd2l0aCBkYXRhIGFuZCBUWCBwYWNrZXRzIGFyZSB3b3J0aCA0IHRpbWVzIGFzIG11Y2ggYXMgUlggcGFja2V0cy4KKyAqIFRoZSB3ZWlnaHRlZCBhdmVyYWdlIGlzIGNhbGxlZCAibmV0IGdvb2RuZXNzIiBhbmQgaXMgYWxzbyBhIG51bWJlcgorICogYmV0d2VlbiAwIGFuZCA5OS4gIElmIDMgY29uc2VjdXRpdmUgcGFja2V0cyBmYWlsIHRyYW5zbWlzc2lvbgorICogb3V0cmlnaHQsIHdlIGF1dG9tYXRpY2FsbHkgcmF0Y2hldCBkb3duIHRoZSByYXRlOyBvdGhlcndpc2UsIHdlCisgKiBzd2l0Y2ggdG8gdGhlIGJlc3QgcmF0ZSB3aGVuZXZlciB0aGUgY3VycmVudCByYXRlJ3MgZ29vZG5lc3MgZmFsbHMKKyAqIGJlbG93IHNvbWUgdGhyZXNob2xkLCBhbmQgdHJ5IGluY3JlYXNpbmcgb3VyIHJhdGUgd2hlbiB0aGUgZ29vZG5lc3MKKyAqIGlzIHZlcnkgaGlnaC4KKyAqCisgKiBUaGlzIHN5c3RlbSBpcyBvcHRpbWl6ZWQgZm9yIGdQWEUncyBzdHlsZSBvZiB1c2FnZS4gQmVjYXVzZSBub3JtYWwKKyAqIG9wZXJhdGlvbiBhbHdheXMgaW52b2x2ZXMgcmVjZWl2aW5nIHNvbWV0aGluZywgd2UnbGwgbWFrZSBvdXIgd2F5CisgKiB0byB0aGUgYmVzdCByYXRlIHByZXR0eSBxdWlja2x5LiBXZSB0ZW5kIHRvIGZvbGxvdyB0aGUgbGVhZCBvZiB0aGUKKyAqIHNlbmRpbmcgQVAgaW4gY2hvb3NpbmcgcmF0ZXMsIGJ1dCB3ZSB3b24ndCB1c2UgcmF0ZXMgZm9yIGxvbmcgdGhhdAorICogZG9uJ3Qgd29yayB3ZWxsIGZvciB1cyBpbiB0cmFuc21pc3Npb24uIFdlIGFzc3VtZSBnUFhFIHdvbid0IGJlCisgKiBydW5uaW5nIGZvciBsb25nIGVub3VnaCB0aGF0IHJhdGUgcGF0dGVybnMgd2lsbCBjaGFuZ2UgbXVjaCwgc28gd2UKKyAqIGRvbid0IGhhdmUgdG8ga2VlcCB0aW1lIGNvdW50ZXJzIG9yIHRoZSBsaWtlLiAgQW5kIGlmIHRoaXMgZG9lc24ndAorICogd29yayB3ZWxsIGluIHByYWN0aWNlIHRoZXJlIGFyZSBtYW55IHdheXMgaXQgY291bGQgYmUgdHdlYWtlZC4KKyAqCisgKiBUbyBhdm9pZCBzdGF5aW5nIGF0IDFNYnBzIGZvciBhIGxvbmcgdGltZSwgd2UgZG9uJ3QgdHJhY2sgYW55CisgKiB0cmFuc21pdHRlZCBwYWNrZXRzIHVudGlsIHdlJ3ZlIHNldCBvdXIgcmF0ZSBiYXNlZCBvbiByZWNlaXZlZAorICogcGFja2V0cy4KKyAqLworCisvKiogVHdvLWJpdCBwYWNrZXQgc3RhdHVzIGluZGljYXRvciBmb3IgYSBwYWNrZXQgd2l0aCBubyByZXRyaWVzICovCisjZGVmaW5lIFJDX1BLVF9PSwkJMHgzCisKKy8qKiBUd28tYml0IHBhY2tldCBzdGF0dXMgaW5kaWNhdG9yIGZvciBhIHBhY2tldCB3aXRoIG9uZSByZXRyeSAqLworI2RlZmluZSBSQ19QS1RfUkVUUklFRF9PTkNFCTB4MgorCisvKiogVHdvLWJpdCBwYWNrZXQgc3RhdHVzIGluZGljYXRvciBmb3IgYSBUWCBwYWNrZXQgd2l0aCBtdWx0aXBsZSByZXRyaWVzCisgKgorICogSXQgaXMgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciBhbiBSWCBwYWNrZXQgaGFkIG9uZSBvciBtdWx0aXBsZQorICogcmV0cmllczsgd2UgcmVseSBpbnN0ZWFkIG9uIHRoZSBmYWN0IHRoYXQgZmFpbGVkIFJYIHBhY2tldHMgd29uJ3QKKyAqIGdldCB0byB1cyBhdCBhbGwsIHNvIGlmIHdlIHJlY2VpdmUgYSBsb3Qgb2YgUlggcGFja2V0cyBvbiBhIGNlcnRhaW4KKyAqIHJhdGUgaXQgbXVzdCBiZSBwcmV0dHkgZ29vZC4KKyAqLworI2RlZmluZSBSQ19QS1RfUkVUUklFRF9NVUxUSQkweDEKKworLyoqIFR3by1iaXQgcGFja2V0IHN0YXR1cyBpbmRpY2F0b3IgZm9yIGEgVFggcGFja2V0IHRoYXQgd2FzIG5ldmVyIEFDS2VkCisgKgorICogSXQgaXMgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciBhbiBSWCBwYWNrZXQgd2FzIHNldG4gaWYgaXQKKyAqIGRpZG4ndCBnZXQgdGhyb3VnaCB0byB1cywgYnV0IGlmIHdlIGRvbid0IHNlZSBvbmUgd2Ugd29uJ3QgaW5jcmVhc2UKKyAqIHRoZSBnb29kbmVzcyBmb3IgaXRzIHJhdGUuIFRoaXMgYXN5bW1ldHJ5IGlzIHBhcnQgb2Ygd2h5IFRYIHBhY2tldHMKKyAqIGFyZSB3ZWlnaHRlZCBtdWNoIG1vcmUgaGVhdmlseSB0aGFuIFJYLgorICovCisjZGVmaW5lIFJDX1BLVF9GQUlMRUQJCTB4MAorCisvKiogTnVtYmVyIG9mIHRpbWVzIHRvIHdlaWdodCBUWCBwYWNrZXRzIG1vcmUgaGVhdmlseSB0aGFuIFJYIHBhY2tldHMgKi8KKyNkZWZpbmUgUkNfVFhfRkFDVE9SCQk0CisKKy8qKiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZmFpbGVkIFRYIHBhY2tldHMgdGhhdCBjYXVzZSBhbiBhdXRvbWF0aWMgcmF0ZSBkcm9wICovCisjZGVmaW5lIFJDX1RYX0VNRVJHX0ZBSUwJMworCisvKiogTWluaW11bSBuZXQgZ29vZG5lc3MgYmVsb3cgd2hpY2ggd2Ugd2lsbCBzZWFyY2ggZm9yIGEgYmV0dGVyIHJhdGUgKi8KKyNkZWZpbmUgUkNfR09PRE5FU1NfTUlOCQk4NQorCisvKiogTWF4aW11bSBuZXQgZ29vZG5lc3MgYWJvdmUgd2hpY2ggd2Ugd2lsbCB0cnkgdG8gaW5jcmVhc2Ugb3VyIHJhdGUgKi8KKyNkZWZpbmUgUkNfR09PRE5FU1NfTUFYCQk5NQorCisvKiogTWluaW11bSAobnVtIFJYICsgQGMgUkNfVFhfRkFDVE9SICogbnVtIFRYKSB0byB1c2UgYSBjZXJ0YWluIHJhdGUgKi8KKyNkZWZpbmUgUkNfVU5DRVJUQUlOVFlfVEhSRVNICTQKKworLyoqIFRYIGRpcmVjdGlvbiAqLworI2RlZmluZSBUWAkwCisKKy8qKiBSWCBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgUlgJMQorCisvKiogQSByYXRlIGNvbnRyb2wgY29udGV4dCAqLworc3RydWN0IHJjODAyMTFfY3R4Cit7CisJLyoqIEdvb2RuZXNzIHN0YXRlIGZvciBlYWNoIHJhdGUsIFRYIGFuZCBSWCAqLworCXUzMiBnb29kbmVzc1syXVtORVQ4MDIxMV9NQVhfUkFURVNdOworCisJLyoqIE51bWJlciBvZiBwYWNrZXRzIHJlY29yZGVkIGZvciBlYWNoIHJhdGUgKi8KKwl1OCBjb3VudFsyXVtORVQ4MDIxMV9NQVhfUkFURVNdOworCisJLyoqIEluZGljYXRpb24gb2Ygd2hldGhlciB3ZSd2ZSBzZXQgdGhlIGRldmljZSByYXRlIHlldCAqLworCWludCBzdGFydGVkOworCisJLyoqIENvdW50ZXIgb2YgYWxsIHBhY2tldHMgc2VudCBhbmQgcmVjZWl2ZWQgKi8KKwlpbnQgcGFja2V0czsKK307CisKKy8qKgorICogSW5pdGlhbGl6ZSByYXRlLWNvbnRyb2wgYWxnb3JpdGhtCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEByZXQgY3R4CVJhdGUtY29udHJvbCBjb250ZXh0LCB0byBiZSBzdG9yZWQgaW4gQGMgZGV2LT5yY3RsCisgKi8KK3N0cnVjdCByYzgwMjExX2N0eCAqIHJjODAyMTFfaW5pdCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiBfX3VudXNlZCApCit7CisJc3RydWN0IHJjODAyMTFfY3R4ICpyZXQgPSB6YWxsb2MgKCBzaXplb2YgKCAqcmV0ICkgKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIENhbGN1bGF0ZSBuZXQgZ29vZG5lc3MgZm9yIGEgY2VydGFpbiByYXRlCisgKgorICogQHYgY3R4CVJhdGUtY29udHJvbCBjb250ZXh0CisgKiBAdiByYXRlX2lkeAlJbmRleCBvZiByYXRlIHRvIGNhbGN1bGF0ZSBuZXQgZ29vZG5lc3MgZm9yCisgKi8KK3N0YXRpYyBpbnQgcmM4MDIxMV9jYWxjX25ldF9nb29kbmVzcyAoIHN0cnVjdCByYzgwMjExX2N0eCAqY3R4LAorCQkJCSAgICAgICBpbnQgcmF0ZV9pZHggKQoreworCWludCBzdW1bMl0sIG51bVsyXSwgZGlyLCBwa3Q7CisKKwlmb3IgKCBkaXIgPSAwOyBkaXIgPCAyOyBkaXIrKyApIHsKKwkJdTMyIGdvb2QgPSBjdHgtPmdvb2RuZXNzW2Rpcl1bcmF0ZV9pZHhdOworCisJCW51bVtkaXJdID0gY3R4LT5jb3VudFtkaXJdW3JhdGVfaWR4XTsKKwkJc3VtW2Rpcl0gPSAwOworCisJCWZvciAoIHBrdCA9IDA7IHBrdCA8IG51bVtkaXJdOyBwa3QrKyApCisJCQlzdW1bZGlyXSArPSAoIGdvb2QgPj4gKCAyICogcGt0ICkgKSAmIDB4MzsKKwl9CisKKwlpZiAoICggbnVtW1RYXSAqIFJDX1RYX0ZBQ1RPUiArIG51bVtSWF0gKSA8IFJDX1VOQ0VSVEFJTlRZX1RIUkVTSCApCisJCXJldHVybiAtMTsKKworCXJldHVybiAoIDMzICogKCBzdW1bVFhdICogUkNfVFhfRkFDVE9SICsgc3VtW1JYXSApIC8KKwkJICAgICAgKCBudW1bVFhdICogUkNfVFhfRkFDVE9SICsgbnVtW1JYXSApICk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIHRoZSBiZXN0IHJhdGUgdG8gc3dpdGNoIHRvIGFuZCByZXR1cm4gaXQKKyAqCisgKiBAdiBkZXYJCTgwMi4xMSBkZXZpY2UKKyAqIEByZXQgcmF0ZV9pZHgJSW5kZXggb2YgdGhlIGJlc3QgcmF0ZSB0byBzd2l0Y2ggdG8KKyAqLworc3RhdGljIGludCByYzgwMjExX3BpY2tfYmVzdCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApCit7CisJc3RydWN0IHJjODAyMTFfY3R4ICpjdHggPSBkZXYtPnJjdGw7CisJaW50IGJlc3RfbmV0X2dvb2QgPSAwLCBiZXN0X3JhdGUgPSAtMSwgaTsKKworCWZvciAoIGkgPSAwOyBpIDwgZGV2LT5ucl9yYXRlczsgaSsrICkgeworCQlpbnQgbmV0X2dvb2QgPSByYzgwMjExX2NhbGNfbmV0X2dvb2RuZXNzICggY3R4LCBpICk7CisKKwkJaWYgKCBuZXRfZ29vZCA+IGJlc3RfbmV0X2dvb2QgfHwKKwkJICAgICAoIGJlc3RfbmV0X2dvb2QgPiBSQ19HT09ETkVTU19NSU4gJiYKKwkJICAgICAgIG5ldF9nb29kID4gUkNfR09PRE5FU1NfTUlOICkgKSB7CisJCQliZXN0X25ldF9nb29kID0gbmV0X2dvb2Q7CisJCQliZXN0X3JhdGUgPSBpOworCQl9CisJfQorCisJaWYgKCBiZXN0X3JhdGUgPj0gMCApIHsKKwkJaW50IG9sZF9nb29kID0gcmM4MDIxMV9jYWxjX25ldF9nb29kbmVzcyAoIGN0eCwgZGV2LT5yYXRlICk7CisJCWlmICggb2xkX2dvb2QgIT0gYmVzdF9uZXRfZ29vZCApCisJCQlEQkdDICggY3R4LCAiODAyLjExIFJDICVwIHN3aXRjaGluZyBmcm9tIGdvb2RuZXNzICIKKwkJCSAgICAgICAiJWQgdG8gJWRcbiIsIGN0eCwgb2xkX2dvb2QsIGJlc3RfbmV0X2dvb2QgKTsKKworCQljdHgtPnN0YXJ0ZWQgPSAxOworCQlyZXR1cm4gYmVzdF9yYXRlOworCX0KKworCXJldHVybiBkZXYtPnJhdGU7Cit9CisKKy8qKgorICogU2V0IDgwMi4xMSBkZXZpY2UgcmF0ZQorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiByYXRlX2lkeAlJbmRleCBvZiByYXRlIHRvIHN3aXRjaCB0bworICoKKyAqIFRoaXMgaXMgYSB0aGluIHdyYXBwZXIgYXJvdW5kIG5ldDgwMjExX3NldF9yYXRlX2lkeCB0byBpbnNlcnQgYQorICogZGVidWdnaW5nIG1lc3NhZ2Ugd2hlcmUgYXBwcm9wcmlhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByYzgwMjExX3NldF9yYXRlICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LAorCQkJCSAgICAgIGludCByYXRlX2lkeCApCit7CisJREJHQyAoIGRldi0+cmN0bCwgIjgwMi4xMSBSQyAlcCBjaGFuZ2luZyByYXRlICVkLT4lZCBNYnBzXG4iLCBkZXYtPnJjdGwsCisJICAgICAgIGRldi0+cmF0ZXNbZGV2LT5yYXRlXSAvIDEwLCBkZXYtPnJhdGVzW3JhdGVfaWR4XSAvIDEwICk7CisKKwluZXQ4MDIxMV9zZXRfcmF0ZV9pZHggKCBkZXYsIHJhdGVfaWR4ICk7Cit9CisKKy8qKgorICogQ2hlY2sgcmF0ZS1jb250cm9sIHN0YXRlIGFuZCBjaGFuZ2UgcmF0ZSBpZiBuZWNlc3NhcnkKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICovCitzdGF0aWMgdm9pZCByYzgwMjExX21heWJlX3NldF9uZXcgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCByYzgwMjExX2N0eCAqY3R4ID0gZGV2LT5yY3RsOworCWludCBuZXRfZ29vZDsKKworCW5ldF9nb29kID0gcmM4MDIxMV9jYWxjX25ldF9nb29kbmVzcyAoIGN0eCwgZGV2LT5yYXRlICk7CisKKwlpZiAoICEgY3R4LT5zdGFydGVkICkgeworCQlyYzgwMjExX3NldF9yYXRlICggZGV2LCByYzgwMjExX3BpY2tfYmVzdCAoIGRldiApICk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIG5ldF9nb29kIDwgMCApCS8qIGluc3VmZmljaWVudCBkYXRhICovCisJCXJldHVybjsKKworCWlmICggbmV0X2dvb2QgPiBSQ19HT09ETkVTU19NQVggJiYgZGV2LT5yYXRlICsgMSA8IGRldi0+bnJfcmF0ZXMgKSB7CisJCWludCBoaWdoZXIgPSByYzgwMjExX2NhbGNfbmV0X2dvb2RuZXNzICggY3R4LCBkZXYtPnJhdGUgKyAxICk7CisJCWlmICggaGlnaGVyID4gbmV0X2dvb2QgfHwgaGlnaGVyIDwgMCApCisJCQlyYzgwMjExX3NldF9yYXRlICggZGV2LCBkZXYtPnJhdGUgKyAxICk7CisJCWVsc2UKKwkJCXJjODAyMTFfc2V0X3JhdGUgKCBkZXYsIHJjODAyMTFfcGlja19iZXN0ICggZGV2ICkgKTsKKwl9CisKKwlpZiAoIG5ldF9nb29kIDwgUkNfR09PRE5FU1NfTUlOICkgeworCQlyYzgwMjExX3NldF9yYXRlICggZGV2LCByYzgwMjExX3BpY2tfYmVzdCAoIGRldiApICk7CisJfQorfQorCisvKioKKyAqIFVwZGF0ZSByYXRlLWNvbnRyb2wgc3RhdGUKKyAqCisgKiBAdiBkZXYJCTgwMi4xMSBkZXZpY2UKKyAqIEB2IGRpcmVjdGlvbgkJT25lIG9mIHRoZSBkaXJlY3Rpb24gY29uc3RhbnRzIFRYIG9yIFJYCisgKiBAdiByYXRlX2lkeAkJSW5kZXggb2YgcmF0ZSBhdCB3aGljaCBwYWNrZXQgd2FzIHNlbnQgb3IgcmVjZWl2ZWQKKyAqIEB2IHJldHJpZXMJCU51bWJlciBvZiB0aW1lcyBwYWNrZXQgd2FzIHJldHJpZWQgYmVmb3JlIHN1Y2Nlc3MKKyAqIEB2IGZhaWxlZAkJSWYgbm9uemVybywgdGhlIHBhY2tldCBmYWlsZWQgdG8gZ2V0IHRocm91Z2gKKyAqLworc3RhdGljIHZvaWQgcmM4MDIxMV91cGRhdGUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIGludCBkaXJlY3Rpb24sCisJCQkgICAgIGludCByYXRlX2lkeCwgaW50IHJldHJpZXMsIGludCBmYWlsZWQgKQoreworCXN0cnVjdCByYzgwMjExX2N0eCAqY3R4ID0gZGV2LT5yY3RsOworCXUzMiBnb29kbmVzcyA9IGN0eC0+Z29vZG5lc3NbZGlyZWN0aW9uXVtyYXRlX2lkeF07CisKKwlpZiAoIGN0eC0+Y291bnRbZGlyZWN0aW9uXVtyYXRlX2lkeF0gPCAxNiApCisJCWN0eC0+Y291bnRbZGlyZWN0aW9uXVtyYXRlX2lkeF0rKzsKKworCWdvb2RuZXNzIDw8PSAyOworCWlmICggZmFpbGVkICkKKwkJZ29vZG5lc3MgfD0gUkNfUEtUX0ZBSUxFRDsKKwllbHNlIGlmICggcmV0cmllcyA+IDEgKQorCQlnb29kbmVzcyB8PSBSQ19QS1RfUkVUUklFRF9NVUxUSTsKKwllbHNlIGlmICggcmV0cmllcyApCisJCWdvb2RuZXNzIHw9IFJDX1BLVF9SRVRSSUVEX09OQ0U7CisJZWxzZQorCQlnb29kbmVzcyB8PSBSQ19QS1RfT0s7CisKKwljdHgtPmdvb2RuZXNzW2RpcmVjdGlvbl1bcmF0ZV9pZHhdID0gZ29vZG5lc3M7CisKKwljdHgtPnBhY2tldHMrKzsKKworCXJjODAyMTFfbWF5YmVfc2V0X25ldyAoIGRldiApOworfQorCisvKioKKyAqIFVwZGF0ZSByYXRlLWNvbnRyb2wgc3RhdGUgZm9yIHRyYW5zbWl0dGVkIHBhY2tldAorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiByZXRyaWVzCU51bWJlciBvZiB0aW1lcyBwYWNrZXQgd2FzIHRyYW5zbWl0dGVkIGJlZm9yZSBzdWNjZXNzCisgKiBAdiByYwlSZXR1cm4gc3RhdHVzIGNvZGUgZm9yIHRyYW5zbWlzc2lvbgorICovCit2b2lkIHJjODAyMTFfdXBkYXRlX3R4ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgcmV0cmllcywgaW50IHJjICkKK3sKKwlzdHJ1Y3QgcmM4MDIxMV9jdHggKmN0eCA9IGRldi0+cmN0bDsKKworCWlmICggISBjdHgtPnN0YXJ0ZWQgKQorCQlyZXR1cm47CisKKwlyYzgwMjExX3VwZGF0ZSAoIGRldiwgVFgsIGRldi0+cmF0ZSwgcmV0cmllcywgcmMgKTsKKworCS8qIENoZWNrIGlmIHRoZSBsYXN0IFJDX1RYX0VNRVJHX0ZBSUwgcGFja2V0cyBoYXZlIGFsbCBmYWlsZWQgKi8KKwlpZiAoICEgKCBjdHgtPmdvb2RuZXNzW1RYXVtkZXYtPnJhdGVdICYKKwkJICggKCAxIDw8ICggMiAqIFJDX1RYX0VNRVJHX0ZBSUwgKSApIC0gMSApICkgKSB7CisJCWlmICggZGV2LT5yYXRlID09IDAgKQorCQkJREJHQyAoIGRldi0+cmN0bCwgIjgwMi4xMSBSQyAlcCBzYXcgJWQgY29uc2VjdXRpdmUgIgorCQkJICAgICAgICJmYWlsZWQgVFgsIGJ1dCBjYW5ub3QgbG93ZXIgcmF0ZSBhbnkgZnVydGhlclxuIiwKKwkJCSAgICAgICBkZXYtPnJjdGwsIFJDX1RYX0VNRVJHX0ZBSUwgKTsKKwkJZWxzZSB7CisJCQlEQkdDICggZGV2LT5yY3RsLCAiODAyLjExIFJDICVwIGxvd2VyaW5nIHJhdGUgKCVkLT4lZCAiCisJCQkgICAgICAgIk1icHMpIGR1ZSB0byAlZCBjb25zZWN1dGl2ZSBUWCBmYWlsdXJlc1xuIiwKKwkJCSAgICAgICBkZXYtPnJjdGwsIGRldi0+cmF0ZXNbZGV2LT5yYXRlXSAvIDEwLAorCQkJICAgICAgIGRldi0+cmF0ZXNbZGV2LT5yYXRlIC0gMV0gLyAxMCwKKwkJCSAgICAgICBSQ19UWF9FTUVSR19GQUlMICk7CisKKwkJCXJjODAyMTFfc2V0X3JhdGUgKCBkZXYsIGRldi0+cmF0ZSAtIDEgKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBVcGRhdGUgcmF0ZS1jb250cm9sIHN0YXRlIGZvciByZWNlaXZlZCBwYWNrZXQKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgcmV0cnkJV2hldGhlciB0aGUgcmVjZWl2ZWQgcGFja2V0IGhhZCBiZWVuIHJldHJhbnNtaXR0ZWQKKyAqIEB2IHJhdGUJUmF0ZSBhdCB3aGljaCBwYWNrZXQgd2FzIHJlY2VpdmVkLCBpbiAxMDAga2JwcyB1bml0cworICovCit2b2lkIHJjODAyMTFfdXBkYXRlX3J4ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2LCBpbnQgcmV0cnksIHUxNiByYXRlICkKK3sKKwlpbnQgcmlkeDsKKworCWZvciAoIHJpZHggPSAwOyByaWR4IDwgZGV2LT5ucl9yYXRlcyAmJiBkZXYtPnJhdGVzW3JpZHhdICE9IHJhdGU7CisJICAgICAgcmlkeCsrICkKKwkJOworCWlmICggcmlkeCA+PSBkZXYtPm5yX3JhdGVzICkKKwkJcmV0dXJuOwkJLyogY291bGRuJ3QgZmluZCB0aGUgcmF0ZSAqLworCisJcmM4MDIxMV91cGRhdGUgKCBkZXYsIFJYLCByaWR4LCByZXRyeSwgMCApOworfQorCisvKioKKyAqIEZyZWUgcmF0ZS1jb250cm9sIGNvbnRleHQKKyAqCisgKiBAdiBjdHgJUmF0ZS1jb250cm9sIGNvbnRleHQKKyAqLwordm9pZCByYzgwMjExX2ZyZWUgKCBzdHJ1Y3QgcmM4MDIxMV9jdHggKmN0eCApCit7CisJZnJlZSAoIGN0eCApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0LzgwMjExL3NlYzgwMjExLmMgYi9ncHhlL3NyYy9uZXQvODAyMTEvc2VjODAyMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFhMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0LzgwMjExL3NlYzgwMjExLmMKQEAgLTAsMCArMSw1MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxncHhlL25ldDgwMjExLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZWM4MDIxMS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBHZW5lcmFsIHNlY3VyZWQtbmV0d29yayByb3V0aW5lcyByZXF1aXJlZCB3aGVuZXZlciBhbnkgc2VjdXJlCisgKiBuZXR3b3JrIHN1cHBvcnQgYXQgYWxsIGlzIGNvbXBpbGVkIGluLiBUaGlzIGludm9sdmVzIHRoaW5ncyBsaWtlCisgKiBpbnN0YWxsaW5nIGtleXMsIGRldGVybWluaW5nIHRoZSB0eXBlIG9mIHNlY3VyaXR5IHVzZWQgYnkgYSBwcm9iZWQKKyAqIG5ldHdvcmssIGFuZCBzb21lIHNtYWxsIGhlbHBlciBmdW5jdGlvbnMgdGhhdCB0YWtlIGFkdmFudGFnZSBvZgorICogc3RhdGljIGRhdGEgaW4gdGhpcyBmaWxlLgorICovCisKKy8qKiBNYXBwaW5nIGZyb20gbmV0ODAyMTEgY3J5cHRvL3NlY3Byb3QgdHlwZXMgdG8gUlNOIE9VSSBkZXNjcmlwdG9ycyAqLworc3RydWN0IGRlc2NyaXB0b3JfbWFwIHsKKwkvKiogVmFsdWUgb2YgbmV0ODAyMTFfY3J5cHRvX2FsZyBvciBuZXQ4MDIxMV9zZWN1cml0eV9wcm90byAqLworCXUzMiBuZXQ4MDIxMV90eXBlOworCisJLyoqIE9VSSt0eXBlIGluIGFwcHJvcHJpYXRlIGJ5dGUgb3JkZXIsIG1hc2tlZCB0byBleGNsdWRlIHZlbmRvciAqLworCXUzMiBvdWlfdHlwZTsKK307CisKKy8qKiBNYWdpYyBudW1iZXIgaW4gQGEgb3VpX3R5cGUgc2hvd2luZyBlbmQgb2YgbGlzdCAqLworI2RlZmluZSBFTkRfTUFHSUMJMHhGRkZGRkZGRgorCisvKiogTWFwcGluZyBiZXR3ZWVuIG5ldDgwMjExIGNyeXB0b3N5c3RlbXMgYW5kIDgwMi4xMWkgY2lwaGVyIElEcyAqLworc3RhdGljIHN0cnVjdCBkZXNjcmlwdG9yX21hcCByc25fY2lwaGVyX21hcFtdID0geworCXsgLm5ldDgwMjExX3R5cGUgPSBORVQ4MDIxMV9DUllQVF9XRVAsCisJICAub3VpX3R5cGUgPSBJRUVFODAyMTFfUlNOX0NUWVBFX1dFUDQwIH0sCisKKwl7IC5uZXQ4MDIxMV90eXBlID0gTkVUODAyMTFfQ1JZUFRfV0VQLAorCSAgLm91aV90eXBlID0gSUVFRTgwMjExX1JTTl9DVFlQRV9XRVAxMDQgfSwKKworCXsgLm5ldDgwMjExX3R5cGUgPSBORVQ4MDIxMV9DUllQVF9US0lQLAorCSAgLm91aV90eXBlID0gSUVFRTgwMjExX1JTTl9DVFlQRV9US0lQIH0sCisKKwl7IC5uZXQ4MDIxMV90eXBlID0gTkVUODAyMTFfQ1JZUFRfQ0NNUCwKKwkgIC5vdWlfdHlwZSA9IElFRUU4MDIxMV9SU05fQ1RZUEVfQ0NNUCB9LAorCisJeyAubmV0ODAyMTFfdHlwZSA9IE5FVDgwMjExX0NSWVBUX1VOS05PV04sCisJICAub3VpX3R5cGUgPSBFTkRfTUFHSUMgfSwKK307CisKKy8qKiBNYXBwaW5nIGJldHdlZW4gbmV0ODAyMTEgaGFuZHNoYWtlcnMgYW5kIDgwMi4xMWkgQUtNIElEcyAqLworc3RhdGljIHN0cnVjdCBkZXNjcmlwdG9yX21hcCByc25fYWttX21hcFtdID0geworCXsgLm5ldDgwMjExX3R5cGUgPSBORVQ4MDIxMV9TRUNQUk9UX0VBUCwKKwkgIC5vdWlfdHlwZSA9IElFRUU4MDIxMV9SU05fQVRZUEVfODAyMVggfSwKKworCXsgLm5ldDgwMjExX3R5cGUgPSBORVQ4MDIxMV9TRUNQUk9UX1BTSywKKwkgIC5vdWlfdHlwZSA9IElFRUU4MDIxMV9SU05fQVRZUEVfUFNLIH0sCisKKwl7IC5uZXQ4MDIxMV90eXBlID0gTkVUODAyMTFfU0VDUFJPVF9VTktOT1dOLAorCSAgLm91aV90eXBlID0gRU5EX01BR0lDIH0sCit9OworCisKKy8qKgorICogSW5zdGFsbCA4MDIuMTEgY3J5cHRvc3lzdGVtCisgKgorICogQHYgd2hpY2gJUG9pbnRlciB0byB0aGUgY3J5cHRvc3lzdGVtIHN0cnVjdHVyZSB0byBpbnN0YWxsIGluCisgKiBAdiBjcnlwdAlDcnlwdG9zeXN0ZW0gSUQgbnVtYmVyCisgKiBAdiBrZXkJRW5jcnlwdGlvbiBrZXkgdG8gdXNlCisgKiBAdiBsZW4JTGVuZ3RoIG9mIGVuY3J5cHRpb24ga2V5CisgKiBAdiByc2MJSW5pdGlhbCByZWNlaXZlIHNlcXVlbmNlIGNvdW50ZXIsIGlmIGFwcGxpY2FibGUKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogVGhlIGVuY3J5cHRpb24ga2V5IHdpbGwgbm90IGJlIGFjY2Vzc2VkIHZpYSB0aGUgcHJvdmlkZWQgcG9pbnRlcgorICogYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLCBzbyB5b3UgbWF5IGtlZXAgaXQgb24gdGhlIHN0YWNrLgorICoKKyAqIEBhIHdoaWNoIG11c3QgcG9pbnQgdG8gZWl0aGVyIEBjIGRldi0+Y3J5cHRvIChmb3IgdGhlIG5vcm1hbCBjYXNlCisgKiBvZiBpbnN0YWxsaW5nIGEgdW5pY2FzdCBjcnlwdG9zeXN0ZW0pIG9yIEBjIGRldi0+Z2NyeXB0byAodG8KKyAqIGluc3RhbGwgYSBjcnlwdG9zeXN0ZW0gdGhhdCB3aWxsIGJlIHVzZWQgb25seSBmb3IgZGVjcnlwdGluZworICogZ3JvdXAtc291cmNlIGZyYW1lcykuCisgKi8KK2ludCBzZWM4MDIxMV9pbnN0YWxsICggc3RydWN0IG5ldDgwMjExX2NyeXB0byAqKndoaWNoLAorCQkgICAgICAgZW51bSBuZXQ4MDIxMV9jcnlwdG9fYWxnIGNyeXB0LAorCQkgICAgICAgY29uc3Qgdm9pZCAqa2V5LCBpbnQgbGVuLCBjb25zdCB2b2lkICpyc2MgKQoreworCXN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8gKmNyeXB0byA9ICp3aGljaDsKKwlzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvICp0YmxfY3J5cHRvOworCisJLyogUmVtb3ZlIG9sZCBjcnlwdG8gaWYgaXQgZXhpc3RzICovCisJZnJlZSAoICp3aGljaCApOworCSp3aGljaCA9IE5VTEw7CisKKwlpZiAoIGNyeXB0ID09IE5FVDgwMjExX0NSWVBUX05PTkUgKSB7CisJCURCRyAoICI4MDIuMTEtU2VjIG5vdCBpbnN0YWxsaW5nIG51bGwgY3J5cHRvZ3JhcGh5XG4iICk7CisJCXJldHVybiAwOworCX0KKworCS8qIEZpbmQgY3J5cHRvc3lzdGVtIHRvIHVzZSAqLworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggdGJsX2NyeXB0bywgTkVUODAyMTFfQ1JZUFRPUyApIHsKKwkJaWYgKCB0YmxfY3J5cHRvLT5hbGdvcml0aG0gPT0gY3J5cHQgKSB7CisJCQljcnlwdG8gPSB6YWxsb2MgKCBzaXplb2YgKCAqY3J5cHRvICkgKworCQkJCQkgIHRibF9jcnlwdG8tPnByaXZfbGVuICk7CisJCQlpZiAoICEgY3J5cHRvICkgeworCQkJCURCRyAoICI4MDIuMTEtU2VjIG91dCBvZiBtZW1vcnlcbiIgKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJbWVtY3B5ICggY3J5cHRvLCB0YmxfY3J5cHRvLCBzaXplb2YgKCAqY3J5cHRvICkgKTsKKwkJCWNyeXB0by0+cHJpdiA9ICggKCB2b2lkICogKSBjcnlwdG8gKworCQkJCQkgc2l6ZW9mICggKmNyeXB0byApICk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggISBjcnlwdG8gKSB7CisJCURCRyAoICI4MDIuMTEtU2VjIG5vIHN1cHBvcnQgZm9yIGNyeXB0b3N5c3RlbSAlZFxuIiwgY3J5cHQgKTsKKwkJcmV0dXJuIC0oIEVOT1RTVVAgfCBFVU5JUV8xMCB8ICggY3J5cHQgPDwgOCApICk7CisJfQorCisJKndoaWNoID0gY3J5cHRvOworCisJREJHICggIjgwMi4xMS1TZWMgaW5zdGFsbGluZyBjcnlwdG9zeXN0ZW0gJWQgYXMgJXAgd2l0aCBrZXkgb2YgIgorCSAgICAgICJsZW5ndGggJWRcbiIsIGNyeXB0LCBjcnlwdG8sIGxlbiApOworCisJcmV0dXJuIGNyeXB0by0+aW5pdCAoIGNyeXB0bywga2V5LCBsZW4sIHJzYyApOworfQorCisKKy8qKgorICogRGV0ZXJtaW5lIG5ldDgwMjExIGNyeXB0byBvciBoYW5kc2hha2luZyB0eXBlIHZhbHVlIHRvIHJldHVybiBmb3IgUlNOIGluZm8KKyAqCisgKiBAdiByc25wCQlQb2ludGVyIHRvIG5leHQgZGVzY3JpcHRvciBjb3VudCBmaWVsZCBpbiBSU04gSUUKKyAqIEB2IHJzbl9lbmQJCVBvaW50ZXIgdG8gZW5kIG9mIFJTTiBJRQorICogQHYgbWFwCQlEZXNjcmlwdG9yIG1hcCB0byB1c2UKKyAqIEB2IHRibF9zdGFydAkJU3RhcnQgb2YgbGlua2VyIHRhYmxlIHRvIGV4YW1pbmUgZm9yIGdQWEUgc3VwcG9ydAorICogQHYgdGJsX2VuZAkJRW5kIG9mIGxpbmtlciB0YWJsZSB0byBleGFtaW5lIGZvciBnUFhFIHN1cHBvcnQKKyAqIEByZXQgcnNucAkJVXBkYXRlZCB0byBwb2ludCB0byBmaXJzdCBieXRlIGFmdGVyIGRlc2NyaXB0b3JzCisgKiBAcmV0IG1hcF9lbnQJCURlc2NyaXB0b3IgbWFwIGVudHJ5IG9mIHRyYW5zbGF0aW9uIHRvIHVzZQorICoKKyAqIFRoZSBlbnRyaWVzIGluIHRoZSBsaW5rZXIgdGFibGUgbXVzdCBiZSBlaXRoZXIgbmV0ODAyMTFfY3J5cHRvIG9yCisgKiBuZXQ4MDIxMV9oYW5kc2hha2VyIHN0cnVjdHVyZXMsIGFuZCBAYSB0Ymxfc3RyaWRlIG11c3QgYmUgc2V0IHRvCisgKiBzaXplb2YoKSB0aGUgYXBwcm9wcmlhdGUgb25lLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyBAYSByc25wIHRvIHBvaW50IGF0IGEgdHdvLWJ5dGUgZGVzY3JpcHRvcgorICogY291bnQgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIGZvdXItYnl0ZSBjaXBoZXIgb3IgQUtNIGRlc2NyaXB0b3JzOyBpdAorICogd2lsbCByZXR1cm4gQGMgTlVMTCBpZiB0aGUgaW5wdXQgcGFja2V0IGlzIG1hbGZvcm1lZCwgYW5kIG90aGVyd2lzZQorICogc2V0IEBhIHJzbnAgdG8gdGhlIGZpcnN0IGJ5dGUgaXQgaGFzIG5vdCBsb29rZWQgYXQuIEl0IHdpbGwgcmV0dXJuCisgKiB0aGUgZmlyc3QgY2lwaGVyIGluIHRoZSBsaXN0IHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGJ1aWxkCisgKiBvZiBnUFhFLCBvciB0aGUgZmlyc3Qgb2YgYWxsIGlmIG5vbmUgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiBXZSBwbGF5IHJhdGhlciBmYXN0IGFuZCBsb29zZSB3aXRoIHR5cGUgY2hlY2tpbmcsIGJlY2F1c2UgdGhpcworICogZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZnJvbSB0d28gd2VsbC1kZWZpbmVkIHBsYWNlcyBpbiB0aGUKKyAqIFJTTi1jaGVja2luZyBjb2RlLiBEb24ndCB0cnkgdG8gdXNlIGl0IGZvciBhbnl0aGluZyBlbHNlLgorICovCitzdGF0aWMgc3RydWN0IGRlc2NyaXB0b3JfbWFwICogcnNuX3BpY2tfZGVzYyAoIHU4ICoqcnNucCwgdTggKnJzbl9lbmQsCisJCQkJCSAgICAgICBzdHJ1Y3QgZGVzY3JpcHRvcl9tYXAgKm1hcCwKKwkJCQkJICAgICAgIHZvaWQgKnRibF9zdGFydCwgdm9pZCAqdGJsX2VuZCApCit7CisJaW50IG5kZXNjOworCWludCBvayA9IDA7CisJc3RydWN0IGRlc2NyaXB0b3JfbWFwICptYXBfZW50LCAqbWFwX3JldCA9IE5VTEw7CisJdTggKnJzbiA9ICpyc25wOworCXZvaWQgKnRibHA7CisJc2l6ZV90IHRibF9zdHJpZGUgPSAoIG1hcCA9PSByc25fY2lwaGVyX21hcCA/CisJCQkgICAgICBzaXplb2YgKCBzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvICkgOgorCQkJICAgICAgc2l6ZW9mICggc3RydWN0IG5ldDgwMjExX2hhbmRzaGFrZXIgKSApOworCisJaWYgKCBtYXAgIT0gcnNuX2NpcGhlcl9tYXAgJiYgbWFwICE9IHJzbl9ha21fbWFwICkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBEZXRlcm1pbmUgd2hpY2ggdHlwZXMgd2Ugc3VwcG9ydCAqLworCWZvciAoIHRibHAgPSB0Ymxfc3RhcnQ7IHRibHAgPCB0YmxfZW5kOyB0YmxwICs9IHRibF9zdHJpZGUgKSB7CisJCXN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8gKmNyeXB0byA9IHRibHA7CisJCXN0cnVjdCBuZXQ4MDIxMV9oYW5kc2hha2VyICpocyA9IHRibHA7CisKKwkJaWYgKCBtYXAgPT0gcnNuX2NpcGhlcl9tYXAgKQorCQkJb2sgfD0gKCAxIDw8IGNyeXB0by0+YWxnb3JpdGhtICk7CisJCWVsc2UKKwkJCW9rIHw9ICggMSA8PCBocy0+cHJvdG9jb2wgKTsKKwl9CisKKwkvKiBSU04gc2FuaXR5IGNoZWNrcyAqLworCWlmICggcnNuICsgMiA+IHJzbl9lbmQgKSB7CisJCURCRyAoICJSU04gZGV0ZWN0OiBtYWxmb3JtZWQgZGVzY3JpcHRvciBjb3VudFxuIiApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwluZGVzYyA9ICooIHUxNiAqICkgcnNuOworCXJzbiArPSAyOworCisJaWYgKCAhIG5kZXNjICkgeworCQlEQkcgKCAiUlNOIGRldGVjdDogbm8gZGVzY3JpcHRvcnNcbiIgKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogRGV0ZXJtaW5lIHdoaWNoIG5ldDgwMjExIGNyeXB0byB0eXBlcyBhcmUgbGlzdGVkICovCisJd2hpbGUgKCBuZGVzYy0tICkgeworCQl1MzIgZGVzYzsKKworCQlpZiAoIHJzbiArIDQgPiByc25fZW5kICkgeworCQkJREJHICggIlJTTiBkZXRlY3Q6IG1hbGZvcm1lZCBkZXNjcmlwdG9yICglZCBsZWZ0KVxuIiwKKwkJCSAgICAgIG5kZXNjICk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWRlc2MgPSAqKCB1MzIgKiApIHJzbjsKKwkJcnNuICs9IDQ7CisKKwkJZm9yICggbWFwX2VudCA9IG1hcDsgbWFwX2VudC0+b3VpX3R5cGUgIT0gRU5EX01BR0lDOyBtYXBfZW50KysgKQorCQkJaWYgKCBtYXBfZW50LT5vdWlfdHlwZSA9PSAoIGRlc2MgJiBPVUlfVFlQRV9NQVNLICkgKQorCQkJCWJyZWFrOworCisJCS8qIFVzZSBmaXJzdCBjaXBoZXIgYXMgYSBmYWxsYmFjayAqLworCQlpZiAoICEgbWFwX3JldCApCisJCQltYXBfcmV0ID0gbWFwX2VudDsKKworCQkvKiBPbmNlIHdlIGZpbmQgb25lIHdlIHN1cHBvcnQsIHVzZSBpdCAqLworCQlpZiAoIG9rICYgKCAxIDw8IG1hcF9lbnQtPm5ldDgwMjExX3R5cGUgKSApIHsKKwkJCW1hcF9yZXQgPSBtYXBfZW50OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIG5kZXNjID4gMCApCisJCXJzbiArPSA0ICogbmRlc2M7CisKKwkqcnNucCA9IHJzbjsKKwlyZXR1cm4gbWFwX3JldDsKK30KKworCisvKioKKyAqIEZpbmQgdGhlIFJTTiBvciBXUEEgaW5mb3JtYXRpb24gZWxlbWVudCBpbiB0aGUgcHJvdmlkZWQgYmVhY29uIGZyYW1lCisgKgorICogQHYgaWUJUG9pbnRlciB0byBmaXJzdCBpbmZvcm1hdGlvbiBlbGVtZW50IHRvIGNoZWNrCisgKiBAdiBpZV9lbmQJUG9pbnRlciB0byBlbmQgb2YgaW5mb3JtYXRpb24gZWxlbWVudCBzcGFjZQorICogQHJldCBpc19yc24JVFJVRSBpZiByZXR1cm5lZCBJRSBpcyBSU04sIEZBTFNFIGlmIGl0J3MgV1BBCisgKiBAcmV0IGVuZAlQb2ludGVyIHRvIGJ5dGUgaW1tZWRpYXRlbHkgYWZ0ZXIgbGFzdCBieXRlIG9mIGRhdGEKKyAqIEByZXQgZGF0YQlQb2ludGVyIHRvIGZpcnN0IGJ5dGUgb2YgZGF0YSAodGhlIGB2ZXJzaW9uJyBmaWVsZCkKKyAqCisgKiBJZiBib3RoIGFuIFJTTiBhbmQgYSBXUEEgaW5mb3JtYXRpb24gZWxlbWVudCBhcmUgZm91bmQsIHRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBvbmUgc2Vlbiwgd2hpY2ggYnkgb3JkZXJpbmcgcnVsZXMKKyAqIHNob3VsZCBhbHdheXMgcHJlZmVyIHRoZSBuZXdlciBSU04gSUUuCisgKgorICogSWYgbm8gUlNOIG9yIFdQQSBpbmZvbXJhdGlvbiBlbGVtZW50IGlzIGZvdW5kLCByZXR1cm5zIEBjIE5VTEwgYW5kCisgKiBsZWF2ZXMgQGEgaXNfcnNuIGFuZCBAYSBlbmQgaW4gYW4gdW5kZWZpbmVkIHN0YXRlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgcmV0dXJuIGEgcG9pbnRlciB0byBhbiBpbmZvcm1hdGlvbiBlbGVtZW50CisgKiB0aGF0IHN0YXRlcyBpdCBleHRlbmRzIHBhc3QgdGhlIHRhaWwgb2YgdGhlIGlvX2J1ZmZlciwgb3Igd2hvc2UgQGEKKyAqIHZlcnNpb24gZmllbGQgaXMgaW5jb3JyZWN0LgorICovCit1OCAqIHNlYzgwMjExX2ZpbmRfcnNuICggdW5pb24gaWVlZTgwMjExX2llICppZSwgdm9pZCAqaWVfZW5kLAorCQkJIGludCAqaXNfcnNuLCB1OCAqKmVuZCApCit7CisJdTggKnJzbiA9IE5VTEw7CisKKwlpZiAoICEgaWVlZTgwMjExX2llX2JvdW5kICggaWUsIGllX2VuZCApICkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoIGllICkgeworCQlpZiAoIGllLT5pZCA9PSBJRUVFODAyMTFfSUVfVkVORE9SICYmCisJCSAgICAgaWUtPnZlbmRvci5vdWkgPT0gSUVFRTgwMjExX1dQQV9PVUlfVkVOICkgeworCQkJREJHICggIlJTTiBkZXRlY3Q6IG9sZC1zdHlsZSBXUEEgSUUgZm91bmRcbiIgKTsKKwkJCXJzbiA9ICZpZS0+dmVuZG9yLmRhdGFbMF07CisJCQkqZW5kID0gcnNuICsgaWUtPmxlbiAtIDQ7CisJCQkqaXNfcnNuID0gMDsKKwkJfSBlbHNlIGlmICggaWUtPmlkID09IElFRUU4MDIxMV9JRV9SU04gKSB7CisJCQlEQkcgKCAiUlNOIGRldGVjdDogODAyLjExaSBSU04gSUUgZm91bmRcbiIgKTsKKwkJCXJzbiA9ICggdTggKiApICZpZS0+cnNuLnZlcnNpb247CisJCQkqZW5kID0gcnNuICsgaWUtPmxlbjsKKwkJCSppc19yc24gPSAxOworCQl9CisKKwkJaWYgKCByc24gJiYgKCAqZW5kID4gKCB1OCAqICkgaWVfZW5kIHx8IHJzbiA+PSAqZW5kIHx8CisJCQkgICAgICAqKCB1MTYgKiApIHJzbiAhPSBJRUVFODAyMTFfUlNOX1ZFUlNJT04gKSApIHsKKwkJCURCRyAoICJSU04gZGV0ZWN0OiBtYWxmb3JtZWQgUlNOIElFIG9yIHVua25vd24gIgorCQkJICAgICAgInZlcnNpb24sIGtlZXAgdHJ5aW5nXG4iICk7CisJCQlyc24gPSBOVUxMOworCQl9CisKKwkJaWYgKCByc24gKQorCQkJYnJlYWs7CisKKwkJaWUgPSBpZWVlODAyMTFfbmV4dF9pZSAoIGllLCBpZV9lbmQgKTsKKwl9CisKKwlpZiAoICEgaWUgKSB7CisJCURCRyAoICJSU04gZGV0ZWN0OiBubyBSU04gSUUgZm91bmRcbiIgKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHJzbjsKK30KKworCisvKioKKyAqIERldGVjdCBjcnlwdG8gYW5kIEFLTSB0eXBlcyBmcm9tIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50CisgKgorICogQHYgaXNfcnNuCUlmIFRSVUUsIElFIGlzIGEgbmV3LXN0eWxlIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50CisgKiBAdiBzdGFydAlQb2ludGVyIHRvIGZpcnN0IGJ5dGUgb2YgQGEgdmVyc2lvbiBmaWVsZAorICogQHYgZW5kCVBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBub3QgaW4gdGhlIFJTTiBJRQorICogQHJldCBzZWNwcm90CVNlY3VyaXR5IGhhbmRzaGFraW5nIHByb3RvY29sIHVzZWQgYnkgbmV0d29yaworICogQHJldCBjcnlwdAlDcnlwdG9zeXN0ZW0gdXNlZCBieSBuZXR3b3JrCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIElmIHRoZSBJRSBjYW5ub3QgYmUgcGFyc2VkLCByZXR1cm5zIGFuIGVycm9yIGluZGljYXRpb24gYW5kIGxlYXZlcworICogQGEgc2VjcHJvdCBhbmQgQGEgY3J5cHQgdW5jaGFuZ2VkLgorICovCitpbnQgc2VjODAyMTFfZGV0ZWN0X2llICggaW50IGlzX3JzbiwgdTggKnN0YXJ0LCB1OCAqZW5kLAorCQkJIGVudW0gbmV0ODAyMTFfc2VjdXJpdHlfcHJvdG8gKnNlY3Byb3QsCisJCQkgZW51bSBuZXQ4MDIxMV9jcnlwdG9fYWxnICpjcnlwdCApCit7CisJZW51bSBuZXQ4MDIxMV9zZWN1cml0eV9wcm90byBzcDsKKwllbnVtIG5ldDgwMjExX2NyeXB0b19hbGcgY3I7CisJc3RydWN0IGRlc2NyaXB0b3JfbWFwICptYXA7CisJdTggKnJzbiA9IHN0YXJ0OworCisJLyogU2V0IHNvbWUgZGVmYXVsdHMgKi8KKwljciA9ICggaXNfcnNuID8gTkVUODAyMTFfQ1JZUFRfQ0NNUCA6IE5FVDgwMjExX0NSWVBUX1RLSVAgKTsKKwlzcCA9IE5FVDgwMjExX1NFQ1BST1RfRUFQOworCisJcnNuICs9IDI7CQkvKiB2ZXJzaW9uIC0gYWxyZWFkeSBjaGVja2VkICovCisJcnNuICs9IDQ7CQkvKiBncm91cCBjaXBoZXIgLSB3ZSBkb24ndCB1c2UgaXQgaGVyZSAqLworCisJaWYgKCByc24gPj0gZW5kICkKKwkJZ290byBkb25lOworCisJLyogUGljayBjcnlwdG8gYWxnb3JpdGhtICovCisJbWFwID0gcnNuX3BpY2tfZGVzYyAoICZyc24sIGVuZCwgcnNuX2NpcGhlcl9tYXAsCisJCQkgICAgICB0YWJsZV9zdGFydCAoIE5FVDgwMjExX0NSWVBUT1MgKSwKKwkJCSAgICAgIHRhYmxlX2VuZCAoIE5FVDgwMjExX0NSWVBUT1MgKSApOworCWlmICggISBtYXAgKQorCQlnb3RvIGludmFsaWRfcnNuOworCisJY3IgPSBtYXAtPm5ldDgwMjExX3R5cGU7CisKKwlpZiAoIHJzbiA+PSBlbmQgKQorCQlnb3RvIGRvbmU7CisKKwkvKiBQaWNrIGhhbmRzaGFraW5nIGFsZ29yaXRobSAqLworCW1hcCA9IHJzbl9waWNrX2Rlc2MgKCAmcnNuLCBlbmQsIHJzbl9ha21fbWFwLAorCQkJICAgICAgdGFibGVfc3RhcnQgKCBORVQ4MDIxMV9IQU5EU0hBS0VSUyApLAorCQkJICAgICAgdGFibGVfZW5kICggTkVUODAyMTFfSEFORFNIQUtFUlMgKSApOworCWlmICggISBtYXAgKQorCQlnb3RvIGludmFsaWRfcnNuOworCisJc3AgPSBtYXAtPm5ldDgwMjExX3R5cGU7CisKKyBkb25lOgorCURCRyAoICJSU04gZGV0ZWN0OiBPSywgY3J5cHRvIHR5cGUgJWQsIHNlY3Byb3QgdHlwZSAlZFxuIiwgY3IsIHNwICk7CisJKnNlY3Byb3QgPSBzcDsKKwkqY3J5cHQgPSBjcjsKKwlyZXR1cm4gMDsKKworIGludmFsaWRfcnNuOgorCURCRyAoICJSU04gZGV0ZWN0OiBpbnZhbGlkIFJTTiBJRVxuIiApOworCXJldHVybiAtRUlOVkFMOworfQorCisKKy8qKgorICogRGV0ZWN0IHRoZSBjcnlwdG9zeXN0ZW0gYW5kIGhhbmRzaGFraW5nIHByb3RvY29sIHVzZWQgYnkgYW4gODAyLjExIG5ldHdvcmsKKyAqCisgKiBAdiBpb2IJSS9PIGJ1ZmZlciBjb250YWluaW5nIGJlYWNvbiBmcmFtZQorICogQHJldCBzZWNwcm90CVNlY3VyaXR5IGhhbmRzaGFraW5nIHByb3RvY29sIHVzZWQgYnkgbmV0d29yaworICogQHJldCBjcnlwdAlDcnlwdG9zeXN0ZW0gdXNlZCBieSBuZXR3b3JrCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gdXNlcyB3ZWFrIGxpbmthZ2UsIGFzIGl0IG11c3QgYmUgY2FsbGVkIGZyb20gZ2VuZXJpYworICogY29udGV4dHMgYnV0IHNob3VsZCBvbmx5IGJlIGxpbmtlZCBpbiBpZiBzb21lIGVuY3J5cHRpb24gaXMKKyAqIHN1cHBvcnRlZDsgeW91IG11c3QgdGVzdCBpdHMgYWRkcmVzcyBhZ2FpbnN0IEBjIE5VTEwgYmVmb3JlIGNhbGxpbmcKKyAqIGl0LiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgYW55IG5ldHdvcmsgd2l0aCB0aGUgUFJJVkFDWSBiaXQgc2V0IGluCisgKiBiZWFjb24tPmNhcGFiIHNob3VsZCBiZSBjb25zaWRlcmVkIHVua25vd24uCisgKi8KK2ludCBfc2VjODAyMTFfZGV0ZWN0ICggc3RydWN0IGlvX2J1ZmZlciAqaW9iLAorCQkgICAgICAgZW51bSBuZXQ4MDIxMV9zZWN1cml0eV9wcm90byAqc2VjcHJvdCwKKwkJICAgICAgIGVudW0gbmV0ODAyMTFfY3J5cHRvX2FsZyAqY3J5cHQgKQoreworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKmhkciA9IGlvYi0+ZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqYmVhY29uID0KKwkJKCBzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqICkgaGRyLT5kYXRhOworCXU4ICpyc24sICpyc25fZW5kOworCWludCBpc19yc24sIHJjOworCisJKmNyeXB0ID0gTkVUODAyMTFfQ1JZUFRfVU5LTk9XTjsKKwkqc2VjcHJvdCA9IE5FVDgwMjExX1NFQ1BST1RfVU5LTk9XTjsKKworCS8qIEZpbmQgUlNOIG9yIFdQQSBJRSAqLworCWlmICggISAoIHJzbiA9IHNlYzgwMjExX2ZpbmRfcnNuICggYmVhY29uLT5pbmZvX2VsZW1lbnQsIGlvYi0+dGFpbCwKKwkJCQkJICAgJmlzX3JzbiwgJnJzbl9lbmQgKSApICkgeworCQkvKiBObyBzZWN1cml0eSBJRSBhdCBhbGw7IGVpdGhlciBXRVAgb3Igbm8gc2VjdXJpdHkuICovCisJCSpzZWNwcm90ID0gTkVUODAyMTFfU0VDUFJPVF9OT05FOworCisJCWlmICggYmVhY29uLT5jYXBhYmlsaXR5ICYgSUVFRTgwMjExX0NBUEFCX1BSSVZBQ1kgKQorCQkJKmNyeXB0ID0gTkVUODAyMTFfQ1JZUFRfV0VQOworCQllbHNlCisJCQkqY3J5cHQgPSBORVQ4MDIxMV9DUllQVF9OT05FOworCisJCXJldHVybiAwOworCX0KKworCS8qIERldGVybWluZSB0eXBlIG9mIHNlY3VyaXR5ICovCisJaWYgKCAoIHJjID0gc2VjODAyMTFfZGV0ZWN0X2llICggaXNfcnNuLCByc24sIHJzbl9lbmQsIHNlY3Byb3QsCisJCQkJCSBjcnlwdCApICkgPT0gMCApCisJCXJldHVybiAwOworCisJLyogSWYgd2UgZ2V0IGhlcmUsIHRoZSBSU04gSUUgd2FzIGludmFsaWQgKi8KKworCSpjcnlwdCA9IE5FVDgwMjExX0NSWVBUX1VOS05PV047CisJKnNlY3Byb3QgPSBORVQ4MDIxMV9TRUNQUk9UX1VOS05PV047CisJREJHICggIkZhaWxlZCB0byBoYW5kbGUgUlNOIElFOlxuIiApOworCURCR19IRCAoIHJzbiwgcnNuX2VuZCAtIHJzbiApOworCXJldHVybiByYzsKK30KKworCisvKioKKyAqIERldGVybWluZSBSU04gZGVzY3JpcHRvciBmb3Igc3BlY2lmaWVkIG5ldDgwMjExIElECisgKgorICogQHYgaWQJbmV0ODAyMTEgSUQgdmFsdWUKKyAqIEB2IHJzbmllCVdoZXRoZXIgdG8gcmV0dXJuIGEgbmV3LWZvcm1hdCAoUlNOIElFKSBkZXNjcmlwdG9yCisgKiBAdiBtYXAJTWFwIHRvIHVzZSBpbiB0cmFuc2xhdGlvbgorICogQHJldCBkZXNjCVJTTiBkZXNjcmlwdG9yLCBvciAwIG9uIGVycm9yCisgKgorICogSWYgQGEgcnNuaWUgaXMgZmFsc2UsIHJldHVybnMgYW4gb2xkLWZvcm1hdCAoV1BBIHZlbmRvciBJRSkKKyAqIGRlc2NyaXB0b3IuCisgKi8KK3N0YXRpYyB1MzIgcnNuX2dldF9kZXNjICggdW5zaWduZWQgaWQsIGludCByc25pZSwgc3RydWN0IGRlc2NyaXB0b3JfbWFwICptYXAgKQoreworCXUzMiB2ZW5kb3IgPSAoIHJzbmllID8gSUVFRTgwMjExX1JTTl9PVUkgOiBJRUVFODAyMTFfV1BBX09VSSApOworCisJZm9yICggOyBtYXAtPm91aV90eXBlICE9IEVORF9NQUdJQzsgbWFwKysgKSB7CisJCWlmICggbWFwLT5uZXQ4MDIxMV90eXBlID09IGlkICkKKwkJCXJldHVybiBtYXAtPm91aV90eXBlIHwgdmVuZG9yOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIERldGVybWluZSBSU04gZGVzY3JpcHRvciBmb3Igc3BlY2lmaWVkIG5ldDgwMjExIGNyeXB0b3N5c3RlbSBudW1iZXIKKyAqCisgKiBAdiBjcnlwdAlDcnlwdG9zeXN0ZW0gbnVtYmVyCisgKiBAdiByc25pZQlXaGV0aGVyIHRvIHJldHVybiBhIG5ldy1mb3JtYXQgKFJTTiBJRSkgZGVzY3JpcHRvcgorICogQHJldCBkZXNjCVJTTiBkZXNjcmlwdG9yCisgKgorICogSWYgQGEgcnNuaWUgaXMgZmFsc2UsIHJldHVybnMgYW4gb2xkLWZvcm1hdCAoV1BBIHZlbmRvciBJRSkKKyAqIGRlc2NyaXB0b3IuCisgKi8KK3UzMiBzZWM4MDIxMV9yc25fZ2V0X2NyeXB0b19kZXNjICggZW51bSBuZXQ4MDIxMV9jcnlwdG9fYWxnIGNyeXB0LCBpbnQgcnNuaWUgKQoreworCXJldHVybiByc25fZ2V0X2Rlc2MgKCBjcnlwdCwgcnNuaWUsIHJzbl9jaXBoZXJfbWFwICk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIFJTTiBkZXNjcmlwdG9yIGZvciBzcGVjaWZpZWQgbmV0ODAyMTEgaGFuZHNoYWtlciBudW1iZXIKKyAqCisgKiBAdiBzZWNwcm90CUhhbmRzaGFrZXIgbnVtYmVyCisgKiBAdiByc25pZQlXaGV0aGVyIHRvIHJldHVybiBhIG5ldy1mb3JtYXQgKFJTTiBJRSkgZGVzY3JpcHRvcgorICogQHJldCBkZXNjCVJTTiBkZXNjcmlwdG9yCisgKgorICogSWYgQGEgcnNuaWUgaXMgZmFsc2UsIHJldHVybnMgYW4gb2xkLWZvcm1hdCAoV1BBIHZlbmRvciBJRSkKKyAqIGRlc2NyaXB0b3IuCisgKi8KK3UzMiBzZWM4MDIxMV9yc25fZ2V0X2FrbV9kZXNjICggZW51bSBuZXQ4MDIxMV9zZWN1cml0eV9wcm90byBzZWNwcm90LAorCQkJCWludCByc25pZSApCit7CisJcmV0dXJuIHJzbl9nZXRfZGVzYyAoIHNlY3Byb3QsIHJzbmllLCByc25fYWttX21hcCApOworfQorCisvKioKKyAqIERldGVybWluZSBuZXQ4MDIxMSBjcnlwdG9zeXN0ZW0gbnVtYmVyIGZyb20gUlNOIGRlc2NyaXB0b3IKKyAqCisgKiBAdiBkZXNjCVJTTiBkZXNjcmlwdG9yCisgKiBAcmV0IGNyeXB0CW5ldDgwMjExIGNyeXB0b3N5c3RlbSBlbnVtZXJhdGlvbiB2YWx1ZQorICovCitlbnVtIG5ldDgwMjExX2NyeXB0b19hbGcgc2VjODAyMTFfcnNuX2dldF9uZXQ4MDIxMV9jcnlwdCAoIHUzMiBkZXNjICkKK3sKKwlzdHJ1Y3QgZGVzY3JpcHRvcl9tYXAgKm1hcCA9IHJzbl9jaXBoZXJfbWFwOworCisJZm9yICggOyBtYXAtPm91aV90eXBlICE9IEVORF9NQUdJQzsgbWFwKysgKSB7CisJCWlmICggbWFwLT5vdWlfdHlwZSA9PSAoIGRlc2MgJiBPVUlfVFlQRV9NQVNLICkgKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIG1hcC0+bmV0ODAyMTFfdHlwZTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC84MDIxMS93ZXAuYyBiL2dweGUvc3JjL25ldC84MDIxMS93ZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzM3ZTBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0LzgwMjExL3dlcC5jCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL25ldDgwMjExLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZWM4MDIxMS5oPgorI2luY2x1ZGUgPGdweGUvY3J5cHRvLmg+CisjaW5jbHVkZSA8Z3B4ZS9hcmM0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9jcmMzMi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFRoZSBXRVAgd2lyZWxlc3MgZW5jcnlwdGlvbiBtZXRob2QgKGluc2VjdXJlISkKKyAqCisgKiBUaGUgZGF0YSBmaWVsZCBpbiBhIFdFUC1lbmNyeXB0ZWQgcGFja2V0IGNvbnRhaW5zIGEgMy1ieXRlCisgKiBpbml0aWFsaXNhdGlvbiB2ZWN0b3IsIG9uZS1ieXRlIEtleSBJRCBmaWVsZCAob25seSB0aGUgYm90dG9tIHR3bworICogYml0cyBhcmUgZXZlciB1c2VkKSwgZW5jcnlwdGVkIGRhdGEsIGFuZCBhIDQtYnl0ZSBlbmNyeXB0ZWQgQ1JDIG9mCisgKiB0aGUgcGxhaW50ZXh0IGRhdGEsIGNhbGxlZCB0aGUgSUNWLiBUbyBkZWNyeXB0IGl0LCB0aGUgSVYgaXMKKyAqIHByZXBlbmRlZCB0byB0aGUgc2hhcmVkIGtleSBhbmQgdGhlIGRhdGEgc3RyZWFtIChpbmNsdWRpbmcgSUNWKSBpcworICogcnVuIHRocm91Z2ggdGhlIEFSQzQgc3RyZWFtIGNpcGhlcjsgaWYgdGhlIElDViBtYXRjaGVzIGEgQ1JDMzIKKyAqIGNhbGN1bGF0ZWQgb24gdGhlIHBsYWludGV4dCwgdGhlIHBhY2tldCBpcyB2YWxpZC4KKyAqCisgKiBGb3IgZWZmaWNpZW5jeSBhbmQgY29kZS1zaXplIHJlYXNvbnMsIHRoaXMgZmlsZSBhc3N1bWVzIGl0IGlzCisgKiBydW5uaW5nIG9uIGEgbGl0dGxlLWVuZGlhbiBtYWNoaW5lLgorICovCisKKy8qKiBMZW5ndGggb2YgV0VQIGluaXRpYWxpc2F0aW9uIHZlY3RvciAqLworI2RlZmluZSBXRVBfSVZfTEVOCTMKKworLyoqIExlbmd0aCBvZiBXRVAga2V5IElEIGJ5dGUgKi8KKyNkZWZpbmUgV0VQX0tJRF9MRU4JMQorCisvKiogTGVuZ3RoIG9mIFdFUCBJQ1YgY2hlY2tzdW0gKi8KKyNkZWZpbmUgV0VQX0lDVl9MRU4JNAorCisvKiogTWF4aW11bSBsZW5ndGggb2YgV0VQIGtleSAqLworI2RlZmluZSBXRVBfTUFYX0tFWQkxNgorCisvKiogQW1vdW50IG9mIGRhdGEgcGxhY2VkIGJlZm9yZSB0aGUgZW5jcnlwdGVkIGJ5dGVzICovCisjZGVmaW5lIFdFUF9IRUFERVJfTEVOCTQKKworLyoqIEFtb3VudCBvZiBkYXRhIHBsYWNlZCBhZnRlciB0aGUgZW5jcnlwdGVkIGJ5dGVzICovCisjZGVmaW5lIFdFUF9UUkFJTEVSX0xFTgk0CisKKy8qKiBUb3RhbCBXRVAgb3ZlcmhlYWQgYnl0ZXMgKi8KKyNkZWZpbmUgV0VQX09WRVJIRUFECTgKKworLyoqIENvbnRleHQgZm9yIFdFUCBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uICovCitzdHJ1Y3Qgd2VwX2N0eAoreworCS8qKiBFbmNvZGVkIFdFUCBrZXkKKwkgKgorCSAqIFRoZSBhY3R1YWwga2V5IGJ5dGVzIGFyZSBzdG9yZWQgYmVnaW5uaW5nIGF0IG9mZnNldCAzLCB0bworCSAqIGxlYXZlIHJvb20gZm9yIGVhc2lseSBpbnNlcnRpbmcgdGhlIElWIGJlZm9yZSBhIHBhcnRpY3VsYXIKKwkgKiBvcGVyYXRpb24uCisJICovCisJdTgga2V5W1dFUF9JVl9MRU4gKyBXRVBfTUFYX0tFWV07CisKKwkvKiogTGVuZ3RoIG9mIFdFUCBrZXkgKG5vdCBpbmNsdWRpbmcgSVYgYnl0ZXMpICovCisJaW50IGtleWxlbjsKKworCS8qKiBBUkM0IGNvbnRleHQgKi8KKwlzdHJ1Y3QgYXJjNF9jdHggYXJjNDsKK307CisKKy8qKgorICogSW5pdGlhbGl6ZSBXRVAgYWxnb3JpdGhtCisgKgorICogQHYgY3J5cHRvCTgwMi4xMSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobQorICogQHYga2V5CVdFUCBrZXkgdG8gdXNlCisgKiBAdiBrZXlsZW4JTGVuZ3RoIG9mIFdFUCBrZXkKKyAqIEB2IHJzYwlJbml0aWFsIHJlY2VpdmUgc2VxdWVuY2UgY291bnRlciAodW51c2VkKQorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBTdGFuZGFyZCBrZXkgbGVuZ3RocyBhcmUgNSBhbmQgMTMgYnl0ZXM7IDE2LWJ5dGUga2V5cyBhcmUKKyAqIG9jY2FzaW9uYWxseSBzdXBwb3J0ZWQgYXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBzdGFuZGFyZC4KKyAqLworc3RhdGljIGludCB3ZXBfaW5pdCAoIHN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8gKmNyeXB0bywgY29uc3Qgdm9pZCAqa2V5LAorCQkgICAgICBpbnQga2V5bGVuLCBjb25zdCB2b2lkICpyc2MgX191bnVzZWQgKQoreworCXN0cnVjdCB3ZXBfY3R4ICpjdHggPSBjcnlwdG8tPnByaXY7CisKKwljdHgtPmtleWxlbiA9ICgga2V5bGVuID4gV0VQX01BWF9LRVkgPyBXRVBfTUFYX0tFWSA6IGtleWxlbiApOworCW1lbWNweSAoIGN0eC0+a2V5ICsgV0VQX0lWX0xFTiwga2V5LCBjdHgtPmtleWxlbiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRW5jcnlwdCBwYWNrZXQgdXNpbmcgV0VQCisgKgorICogQHYgY3J5cHRvCTgwMi4xMSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobQorICogQHYgaW9iCUkvTyBidWZmZXIgb2YgcGxhaW50ZXh0IHBhY2tldAorICogQHJldCBlaW9iCU5ld2x5IGFsbG9jYXRlZCBJL08gYnVmZmVyIGZvciBlbmNyeXB0ZWQgcGFja2V0LCBvciBOVUxMCisgKgorICogSWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMsIEBjIE5VTEwgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW9fYnVmZmVyICogd2VwX2VuY3J5cHQgKCBzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvICpjcnlwdG8sCisJCQkJCXN0cnVjdCBpb19idWZmZXIgKmlvYiApCit7CisJc3RydWN0IHdlcF9jdHggKmN0eCA9IGNyeXB0by0+cHJpdjsKKwlzdHJ1Y3QgaW9fYnVmZmVyICplaW9iOworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKmhkcjsKKwljb25zdCBpbnQgaGRybGVuID0gSUVFRTgwMjExX1RZUF9GUkFNRV9IRUFERVJfTEVOOworCWludCBkYXRhbGVuID0gaW9iX2xlbiAoIGlvYiApIC0gaGRybGVuOworCWludCBuZXdsZW4gPSBoZHJsZW4gKyBkYXRhbGVuICsgV0VQX09WRVJIRUFEOworCXUzMiBpdiwgaWN2OworCisJZWlvYiA9IGFsbG9jX2lvYiAoIG5ld2xlbiApOworCWlmICggISBlaW9iICkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkgKCBpb2JfcHV0ICggZWlvYiwgaGRybGVuICksIGlvYi0+ZGF0YSwgaGRybGVuICk7CisJaGRyID0gZWlvYi0+ZGF0YTsKKwloZHItPmZjIHw9IElFRUU4MDIxMV9GQ19QUk9URUNURUQ7CisKKwkvKiBDYWxjdWxhdGUgSVYsIHB1dCBpdCBpbiB0aGUgaGVhZGVyICh3aXRoIGtleSBJRCBieXRlID0gMCksIGFuZAorCSAgIHNldCBpdCB1cCBhdCB0aGUgc3RhcnQgb2YgdGhlIGVuY3J5cHRpb24ga2V5LiAqLworCWl2ID0gcmFuZG9tKCkgJiAweGZmZmZmZjsgLyogSVYgaW4gYm90dG9tIDMgYnl0ZXMsIHRvcCBieXRlID0gS0lEID0gMCAqLworCW1lbWNweSAoIGlvYl9wdXQgKCBlaW9iLCBXRVBfSEVBREVSX0xFTiApLCAmaXYsIFdFUF9IRUFERVJfTEVOICk7CisJbWVtY3B5ICggY3R4LT5rZXksICZpdiwgV0VQX0lWX0xFTiApOworCisJLyogRW5jcnlwdCB0aGUgZGF0YSB1c2luZyBSQzQgKi8KKwljaXBoZXJfc2V0a2V5ICggJmFyYzRfYWxnb3JpdGhtLCAmY3R4LT5hcmM0LCBjdHgtPmtleSwKKwkJCWN0eC0+a2V5bGVuICsgV0VQX0lWX0xFTiApOworCWNpcGhlcl9lbmNyeXB0ICggJmFyYzRfYWxnb3JpdGhtLCAmY3R4LT5hcmM0LCBpb2ItPmRhdGEgKyBoZHJsZW4sCisJCQkgaW9iX3B1dCAoIGVpb2IsIGRhdGFsZW4gKSwgZGF0YWxlbiApOworCisJLyogQWRkIElDViAqLworCWljdiA9IH5jcmMzMl9sZSAoIH4wLCBpb2ItPmRhdGEgKyBoZHJsZW4sIGRhdGFsZW4gKTsKKwljaXBoZXJfZW5jcnlwdCAoICZhcmM0X2FsZ29yaXRobSwgJmN0eC0+YXJjNCwgJmljdiwKKwkJCSBpb2JfcHV0ICggZWlvYiwgV0VQX0lDVl9MRU4gKSwgV0VQX0lDVl9MRU4gKTsKKworCXJldHVybiBlaW9iOworfQorCisvKioKKyAqIERlY3J5cHQgcGFja2V0IHVzaW5nIFdFUAorICoKKyAqIEB2IGNyeXB0bwk4MDIuMTEgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0KKyAqIEB2IGVpb2IJSS9PIGJ1ZmZlciBvZiBlbmNyeXB0ZWQgcGFja2V0CisgKiBAcmV0IGlvYglOZXdseSBhbGxvY2F0ZWQgSS9PIGJ1ZmZlciBmb3IgcGxhaW50ZXh0IHBhY2tldCwgb3IgTlVMTAorICoKKyAqIElmIGEgY29uc2lzdGVuY3kgY2hlY2sgZm9yIHRoZSBkZWNyeXB0aW9uIGZhaWxzICh1c3VhbGx5IGluZGljYXRpbmcKKyAqIGFuIGludmFsaWQga2V5KSwgQGMgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIHN0cnVjdCBpb19idWZmZXIgKiB3ZXBfZGVjcnlwdCAoIHN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8gKmNyeXB0bywKKwkJCQkJc3RydWN0IGlvX2J1ZmZlciAqZWlvYiApCit7CisJc3RydWN0IHdlcF9jdHggKmN0eCA9IGNyeXB0by0+cHJpdjsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2I7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqaGRyOworCWNvbnN0IGludCBoZHJsZW4gPSBJRUVFODAyMTFfVFlQX0ZSQU1FX0hFQURFUl9MRU47CisJaW50IGRhdGFsZW4gPSBpb2JfbGVuICggZWlvYiApIC0gaGRybGVuIC0gV0VQX09WRVJIRUFEOworCWludCBuZXdsZW4gPSBoZHJsZW4gKyBkYXRhbGVuOworCXUzMiBpdiwgaWN2LCBjcmM7CisKKwlpb2IgPSBhbGxvY19pb2IgKCBuZXdsZW4gKTsKKwlpZiAoICEgaW9iICkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkgKCBpb2JfcHV0ICggaW9iLCBoZHJsZW4gKSwgZWlvYi0+ZGF0YSwgaGRybGVuICk7CisJaGRyID0gaW9iLT5kYXRhOworCWhkci0+ZmMgJj0gfklFRUU4MDIxMV9GQ19QUk9URUNURUQ7CisKKwkvKiBTdHJpcCBvZmYgSVYgYW5kIHVzZSBpdCB0byBpbml0aWFsaXplIGNyeXB0b3N5c3RlbSAqLworCW1lbWNweSAoICZpdiwgZWlvYi0+ZGF0YSArIGhkcmxlbiwgNCApOworCWl2ICY9IDB4ZmZmZmZmOwkJLyogaWdub3JlIGtleSBJRCBieXRlICovCisJbWVtY3B5ICggY3R4LT5rZXksICZpdiwgV0VQX0lWX0xFTiApOworCisJLyogRGVjcnlwdCB0aGUgZGF0YSB1c2luZyBSQzQgKi8KKwljaXBoZXJfc2V0a2V5ICggJmFyYzRfYWxnb3JpdGhtLCAmY3R4LT5hcmM0LCBjdHgtPmtleSwKKwkJCWN0eC0+a2V5bGVuICsgV0VQX0lWX0xFTiApOworCWNpcGhlcl9kZWNyeXB0ICggJmFyYzRfYWxnb3JpdGhtLCAmY3R4LT5hcmM0LCBlaW9iLT5kYXRhICsgaGRybGVuICsKKwkJCSBXRVBfSEVBREVSX0xFTiwgaW9iX3B1dCAoIGlvYiwgZGF0YWxlbiApLCBkYXRhbGVuICk7CisKKwkvKiBTdHJpcCBvZmYgSUNWIGFuZCB2ZXJpZnkgaXQgKi8KKwljaXBoZXJfZGVjcnlwdCAoICZhcmM0X2FsZ29yaXRobSwgJmN0eC0+YXJjNCwgZWlvYi0+ZGF0YSArIGhkcmxlbiArCisJCQkgV0VQX0hFQURFUl9MRU4gKyBkYXRhbGVuLCAmaWN2LCBXRVBfSUNWX0xFTiApOworCWNyYyA9IH5jcmMzMl9sZSAoIH4wLCBpb2ItPmRhdGEgKyBoZHJsZW4sIGRhdGFsZW4gKTsKKwlpZiAoIGNyYyAhPSBpY3YgKSB7CisJCURCR0MgKCBjcnlwdG8sICJXRVAgJXAgQ1JDIG1pc21hdGNoOiBleHBlY3QgJTA4eCwgZ2V0ICUwOHhcbiIsCisJCSAgICAgICBjcnlwdG8sIGljdiwgY3JjICk7CisJCWZyZWVfaW9iICggaW9iICk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gaW9iOworfQorCisvKiogV0VQIGNyeXB0b3N5c3RlbSBmb3IgODAyLjExICovCitzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvIHdlcF9jcnlwdG8gX19uZXQ4MDIxMV9jcnlwdG8gPSB7CisJLmFsZ29yaXRobSA9IE5FVDgwMjExX0NSWVBUX1dFUCwKKwkuaW5pdCA9IHdlcF9pbml0LAorCS5lbmNyeXB0ID0gd2VwX2VuY3J5cHQsCisJLmRlY3J5cHQgPSB3ZXBfZGVjcnlwdCwKKwkucHJpdl9sZW4gPSBzaXplb2YgKCBzdHJ1Y3Qgd2VwX2N0eCApLAorfTsKKworLyoqCisgKiBJbml0aWFsaXplIHRyaXZpYWwgODAyLjExIHNlY3VyaXR5IGhhbmRzaGFrZXIKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgY3R4CVNlY3VyaXR5IGhhbmRzaGFrZXIKKyAqCisgKiBUaGlzIHNpbXBseSBmZXRjaGVzIGEgV0VQIGtleSBmcm9tIG5ldFgva2V5LCBhbmQgaWYgaXQgZXhpc3RzLAorICogaW5zdGFsbHMgV0VQIGNyeXB0b2dyYXBoeSBvbiB0aGUgODAyLjExIGRldmljZS4gTm8gcmVhbCBoYW5kc2hha2luZworICogaXMgcGVyZm9ybWVkLgorICovCitzdGF0aWMgaW50IHRyaXZpYWxfaW5pdCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApCit7CisJdTgga2V5W1dFUF9NQVhfS0VZXTsJLyogc3VwcG9ydCB1cCB0byAxMjgtYml0IGtleXMgKi8KKwlpbnQgbGVuOworCWludCByYzsKKworCWlmICggZGV2LT5hc3NvY2lhdGluZyAmJgorCSAgICAgZGV2LT5hc3NvY2lhdGluZy0+Y3J5cHRvID09IE5FVDgwMjExX0NSWVBUX05PTkUgKQorCQlyZXR1cm4gMDsJLyogbm8gY3J5cHRvPyBPSy4gKi8KKworCWxlbiA9IGZldGNoX3NldHRpbmcgKCBuZXRkZXZfc2V0dGluZ3MgKCBkZXYtPm5ldGRldiApLAorCQkJICAgICAgJm5ldDgwMjExX2tleV9zZXR0aW5nLCBrZXksIFdFUF9NQVhfS0VZICk7CisKKwlpZiAoIGxlbiA8PSAwICkgeworCQlEQkdDICggZGV2LCAiODAyLjExICVwIGNhbm5vdCBkbyBXRVAgd2l0aG91dCBhIGtleVxuIiwgZGV2ICk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIEZ1bGwgMTI4LWJpdCBrZXlzIGFyZSBhIG5vbnN0YW5kYXJkIGV4dGVuc2lvbiwgYnV0IHRoZXkncmUKKwkgICB1dHRlcmx5IHRyaXZpYWwgdG8gc3VwcG9ydCwgc28gd2UgZG8uICovCisJaWYgKCBsZW4gIT0gNSAmJiBsZW4gIT0gMTMgJiYgbGVuICE9IDE2ICkgeworCQlEQkdDICggZGV2LCAiODAyLjExICVwIGludmFsaWQgV0VQIGtleSBsZW5ndGggJWRcbiIsCisJCSAgICAgICBkZXYsIGxlbiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEQkdDICggZGV2LCAiODAyLjExICVwIGluc3RhbGxpbmcgJWQtYml0IFdFUFxuIiwgZGV2LCBsZW4gKiA4ICk7CisKKwlyYyA9IHNlYzgwMjExX2luc3RhbGwgKCAmZGV2LT5jcnlwdG8sIE5FVDgwMjExX0NSWVBUX1dFUCwga2V5LCBsZW4sCisJCQkJTlVMTCApOworCWlmICggcmMgPCAwICkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2hlY2sgZm9yIGtleSBjaGFuZ2Ugb24gdHJpdmlhbCA4MDIuMTEgc2VjdXJpdHkgaGFuZHNoYWtlcgorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBjdHgJU2VjdXJpdHkgaGFuZHNoYWtlcgorICovCitzdGF0aWMgaW50IHRyaXZpYWxfY2hhbmdlX2tleSAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApCit7CisJdTgga2V5W1dFUF9NQVhfS0VZXTsKKwlpbnQgbGVuOworCWludCBjaGFuZ2UgPSAwOworCisJLyogSWYgZ29pbmcgZnJvbSBXRVAgdG8gY2xlYXIsIG9yIHNvbWV0aGluZyBlbHNlIHRvIFdFUCwgcmVhc3NvY2lhdGUuICovCisJaWYgKCAhIGRldi0+Y3J5cHRvIHx8ICggZGV2LT5jcnlwdG8tPmluaXQgIT0gd2VwX2luaXQgKSApCisJCWNoYW5nZSBePSAxOworCisJbGVuID0gZmV0Y2hfc2V0dGluZyAoIG5ldGRldl9zZXR0aW5ncyAoIGRldi0+bmV0ZGV2ICksCisJCQkgICAgICAmbmV0ODAyMTFfa2V5X3NldHRpbmcsIGtleSwgV0VQX01BWF9LRVkgKTsKKwlpZiAoIGxlbiA8PSAwICkKKwkJY2hhbmdlIF49IDE7CisKKwkvKiBDaGFuZ2luZyBjcnlwdG8gdHlwZSA9PiByZXR1cm4gbm9uemVybyB0byByZWFzc29jaWF0ZS4gKi8KKwlpZiAoIGNoYW5nZSApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogR29pbmcgZnJvbSBubyBjcnlwdG8gdG8gc3RpbGwgbm8gY3J5cHRvID0+IG5vdGhpbmcgdG8gZG8uICovCisJaWYgKCBsZW4gPD0gMCApCisJCXJldHVybiAwOworCisJLyogT3RoZXJ3aXNlLCByZWluaXRpYWxpc2UgV0VQIHdpdGggbmV3IGtleS4gKi8KKwlyZXR1cm4gd2VwX2luaXQgKCBkZXYtPmNyeXB0bywga2V5LCBsZW4sIE5VTEwgKTsKK30KKworLyoqIFRyaXZpYWwgODAyLjExIHNlY3VyaXR5IGhhbmRzaGFrZXIgKi8KK3N0cnVjdCBuZXQ4MDIxMV9oYW5kc2hha2VyIHRyaXZpYWxfaGFuZHNoYWtlciBfX25ldDgwMjExX2hhbmRzaGFrZXIgPSB7CisJLnByb3RvY29sID0gTkVUODAyMTFfU0VDUFJPVF9OT05FLAorCS5pbml0ID0gdHJpdmlhbF9pbml0LAorCS5jaGFuZ2Vfa2V5ID0gdHJpdmlhbF9jaGFuZ2Vfa2V5LAorCS5wcml2X2xlbiA9IDAsCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0LzgwMjExL3dwYS5jIGIvZ3B4ZS9zcmMvbmV0LzgwMjExL3dwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYWM4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvODAyMTEvd3BhLmMKQEAgLTAsMCArMSw5NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPGdweGUvbmV0ODAyMTEuaD4KKyNpbmNsdWRlIDxncHhlL3NlYzgwMjExLmg+CisjaW5jbHVkZSA8Z3B4ZS93cGEuaD4KKyNpbmNsdWRlIDxncHhlL2VhcG9sLmg+CisjaW5jbHVkZSA8Z3B4ZS9jcnlwdG8uaD4KKyNpbmNsdWRlIDxncHhlL2FyYzQuaD4KKyNpbmNsdWRlIDxncHhlL2NyYzMyLmg+CisjaW5jbHVkZSA8Z3B4ZS9zaGExLmg+CisjaW5jbHVkZSA8Z3B4ZS9obWFjLmg+CisjaW5jbHVkZSA8Z3B4ZS9saXN0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIEhhbmRsZXIgZm9yIHRoZSBhc3BlY3RzIG9mIFdQQSBoYW5kc2hha2luZyB0aGF0IGFyZSBpbmRlcGVuZGVudCBvZgorICogODAyLjFYL1BTSyBvciBUS0lQL0NDTVA7IHRoaXMgbW9zdGx5IGludm9sdmVzIHRoZSA0LVdheSBIYW5kc2hha2UuCisgKi8KKworLyoqIExpc3Qgb2YgV1BBIGNvbnRleHRzIGluIGFjdGl2ZSB1c2UuICovCitzdHJ1Y3QgbGlzdF9oZWFkIHdwYV9jb250ZXh0cyA9IExJU1RfSEVBRF9JTklUICggd3BhX2NvbnRleHRzICk7CisKKworLyoqCisgKiBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgZGVhdXRoZW50aWNhdGUKKyAqCisgKiBAdiBjdHgJV1BBIGNvbW1vbiBjb250ZXh0CisgKiBAdiByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqIEByZXQgcmMJVGhlIHBhc3NlZCByZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB3cGFfZmFpbCAoIHN0cnVjdCB3cGFfY29tbW9uX2N0eCAqY3R4LCBpbnQgcmMgKQoreworCW5ldDgwMjExX2RlYXV0aGVudGljYXRlICggY3R4LT5kZXYsIHJjICk7CisJcmV0dXJuIHJjOworfQorCisKKy8qKgorICogRmluZCBhIGNyeXB0b3N5c3RlbSBoYW5kbGVyIHN0cnVjdHVyZSBmcm9tIGEgY3J5cHRvIElECisgKgorICogQHYgY3J5cHQJQ3J5cHRvc3lzdGVtIElECisgKiBAcmV0IGNyeXB0bwlDcnlwdG9zeXN0ZW0gaGFuZGxlciBzdHJ1Y3R1cmUKKyAqCisgKiBJZiBzdXBwb3J0IGZvciBAYSBjcnlwdCBpcyBub3QgY29tcGlsZWQgaW4gdG8gZ1BYRSwgb3IgaWYgQGEgY3J5cHQKKyAqIGlzIE5FVDgwMjExX0NSWVBUX1VOS05PV04sIHJldHVybnMgQGMgTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8gKgord3BhX2ZpbmRfY3J5cHRvc3lzdGVtICggZW51bSBuZXQ4MDIxMV9jcnlwdG9fYWxnIGNyeXB0ICkKK3sKKwlzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvICpjcnlwdG87CisKKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIGNyeXB0bywgTkVUODAyMTFfQ1JZUFRPUyApIHsKKwkJaWYgKCBjcnlwdG8tPmFsZ29yaXRobSA9PSBjcnlwdCApCisJCQlyZXR1cm4gY3J5cHRvOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKKy8qKgorICogRmluZCBXUEEga2V5IGludGVncml0eSBhbmQgZW5jcnlwdGlvbiBoYW5kbGVyIGZyb20ga2V5IHZlcnNpb24gZmllbGQKKyAqCisgKiBAdiB2ZXIJVmVyc2lvbiBiaXRzIG9mIEVBUE9MLUtleSBpbmZvIGZpZWxkCisgKiBAcmV0IGtpZQlLZXkgaW50ZWdyaXR5IGFuZCBlbmNyeXB0aW9uIGhhbmRsZXIKKyAqLworc3RydWN0IHdwYV9raWUgKiB3cGFfZmluZF9raWUgKCBpbnQgdmVyc2lvbiApCit7CisJc3RydWN0IHdwYV9raWUgKmtpZTsKKworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICgga2llLCBXUEFfS0lFUyApIHsKKwkJaWYgKCBraWUtPnZlcnNpb24gPT0gdmVyc2lvbiApCisJCQlyZXR1cm4ga2llOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKKy8qKgorICogQ29uc3RydWN0IFJTTiBvciBXUEEgaW5mb3JtYXRpb24gZWxlbWVudAorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAcmV0IGllX3JldAlSU04gb3IgV1BBIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMsIGZpbGxzLCBhbmQgcmV0dXJucyBhIFJTTiBvciBXUEEKKyAqIGluZm9ybWF0aW9uIGVsZW1lbnQgc3VpdGFibGUgZm9yIGluY2x1ZGluZyBpbiBhbiBhc3NvY2lhdGlvbgorICogcmVxdWVzdCBmcmFtZSB0byB0aGUgbmV0d29yayBpZGVudGlmaWVkIGJ5IEBjIGRldi0+YXNzb2NpYXRpbmcuCisgKiBJZiBpdCBpcyBpbXBvc3NpYmxlIHRvIGNvbnN0cnVjdCBhbiBpbmZvcm1hdGlvbiBlbGVtZW50IGNvbnNpc3RlbnQKKyAqIHdpdGggZ1BYRSdzIGNhcGFiaWxpdGllcyB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGF0IG5ldHdvcmssIG9yCisgKiBpZiBub25lIHNob3VsZCBiZSBzZW50IGJlY2F1c2UgdGhhdCBuZXR3b3JrJ3MgYmVhY29uIGluY2x1ZGVkIG5vCisgKiBzZWN1cml0eSBpbmZvcm1hdGlvbiwgcmV0dXJucyBhbiBlcnJvciBpbmRpY2F0aW9uIGFuZCBsZWF2ZXMKKyAqIEBhIGllX3JldCB1bmNoYW5nZWQuCisgKgorICogVGhlIHJldHVybmVkIElFIHdpbGwgYmUgb2YgdGhlIHNhbWUgdHlwZSAoUlNOIG9yIFdQQSkgYXMgd2FzCisgKiBpbmNsdWRlZCBpbiB0aGUgYmVhY29uIGZvciB0aGUgbmV0d29yayBpdCBpcyBkZXN0aW5lZCBmb3IuCisgKi8KK2ludCB3cGFfbWFrZV9yc25faWUgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIHVuaW9uIGllZWU4MDIxMV9pZSAqKmllX3JldCApCit7CisJdTggKnJzbiwgKnJzbl9lbmQ7CisJaW50IGlzX3JzbjsKKwl1MzIgZ3JvdXBfY2lwaGVyOworCWVudW0gbmV0ODAyMTFfY3J5cHRvX2FsZyBnY3J5cHQ7CisJaW50IGllX2xlbjsKKwl1OCAqaWVwOworCXN0cnVjdCBpZWVlODAyMTFfaWVfcnNuICppZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICpoZHI7CisJc3RydWN0IGllZWU4MDIxMV9iZWFjb24gKmJlYWNvbjsKKworCWlmICggISBkZXYtPmFzc29jaWF0aW5nICkgeworCQlEQkcgKCAiV1BBOiBDYW4ndCBtYWtlIFJTTiBJRSBmb3IgYSBub24tYXNzb2NpYXRpbmcgZGV2aWNlXG4iICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhkciA9IGRldi0+YXNzb2NpYXRpbmctPmJlYWNvbi0+ZGF0YTsKKwliZWFjb24gPSAoIHN0cnVjdCBpZWVlODAyMTFfYmVhY29uICogKSBoZHItPmRhdGE7CisJcnNuID0gc2VjODAyMTFfZmluZF9yc24gKCBiZWFjb24tPmluZm9fZWxlbWVudCwKKwkJCQkgIGRldi0+YXNzb2NpYXRpbmctPmJlYWNvbi0+dGFpbCwgJmlzX3JzbiwKKwkJCQkgICZyc25fZW5kICk7CisJaWYgKCAhIHJzbiApIHsKKwkJREJHICggIldQQTogQ2FuJ3QgbWFrZSBSU04gSUUgd2hlbiB3ZSBkaWRuJ3QgZ2V0IG9uZVxuIiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyc24gKz0gMjsJCS8qIHNraXAgdmVyc2lvbiAqLworCWdyb3VwX2NpcGhlciA9ICooIHUzMiAqICkgcnNuOworCWdjcnlwdCA9IHNlYzgwMjExX3Jzbl9nZXRfbmV0ODAyMTFfY3J5cHQgKCBncm91cF9jaXBoZXIgKTsKKworCWlmICggISB3cGFfZmluZF9jcnlwdG9zeXN0ZW0gKCBnY3J5cHQgKSB8fAorCSAgICAgISB3cGFfZmluZF9jcnlwdG9zeXN0ZW0gKCBkZXYtPmFzc29jaWF0aW5nLT5jcnlwdG8gKSApIHsKKwkJREJHICggIldQQTogTm8gc3VwcG9ydCBmb3IgKEdDOiVkLCBQQzolZClcbiIsCisJCSAgICAgIGdjcnlwdCwgZGV2LT5hc3NvY2lhdGluZy0+Y3J5cHRvICk7CisJCXJldHVybiAtRU5PVFNVUDsKKwl9CisKKwkvKiBFdmVyeXRoaW5nIGxvb2tzIGdvb2QgLSBtYWtlIG91ciBJRS4gKi8KKworCS8qIFdQQSBJRXMgbmVlZCA0IG1vcmUgYnl0ZXMgZm9yIHRoZSBPVUkrdHlwZSAqLworCWllX2xlbiA9IGllZWU4MDIxMV9yc25fc2l6ZSAoIDEsIDEsIDAsIGlzX3JzbiApICsgKCA0ICogISBpc19yc24gKTsKKwlpZXAgPSBtYWxsb2MgKCBpZV9sZW4gKTsKKwlpZiAoICEgaWVwICkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkqaWVfcmV0ID0gKCB1bmlvbiBpZWVlODAyMTFfaWUgKiApIGllcDsKKworCS8qIFN0b3JlIElEIGFuZCBsZW5ndGggYnl0ZXMuICovCisJKmllcCsrID0gKCBpc19yc24gPyBJRUVFODAyMTFfSUVfUlNOIDogSUVFRTgwMjExX0lFX1ZFTkRPUiApOworCSppZXArKyA9IGllX2xlbiAtIDI7CisKKwkvKiBTdG9yZSBPVUkrdHlwZSBmb3IgV1BBIElFcy4gKi8KKwlpZiAoICEgaXNfcnNuICkgeworCQkqKCB1MzIgKiApIGllcCA9IElFRUU4MDIxMV9XUEFfT1VJX1ZFTjsKKwkJaWVwICs9IDQ7CisJfQorCisJLyogSWYgdGhpcyBpcyBhIFdQQSBJRSwgdGhlIGlkIGFuZCBsZW4gYnl0ZXMgaW4gdGhlCisJICAgaWVlZTgwMjExX2llX3JzbiBzdHJ1Y3R1cmUgd2lsbCBub3QgYmUgdmFsaWQsIGJ1dCBieSBkb2luZworCSAgIHRoZSBjYXN0IHdlIGNhbiBmaWxsIGFsbCB0aGUgb3RoZXIgZmllbGRzIG11Y2ggbW9yZQorCSAgIHJlYWRpbHkuICovCisKKwlpZSA9ICggc3RydWN0IGllZWU4MDIxMV9pZV9yc24gKiApICggaWVwIC0gMiApOworCWllLT52ZXJzaW9uID0gSUVFRTgwMjExX1JTTl9WRVJTSU9OOworCWllLT5ncm91cF9jaXBoZXIgPSBncm91cF9jaXBoZXI7CisJaWUtPnBhaXJ3aXNlX2NvdW50ID0gMTsKKwlpZS0+cGFpcndpc2VfY2lwaGVyWzBdID0KKwkJc2VjODAyMTFfcnNuX2dldF9jcnlwdG9fZGVzYyAoIGRldi0+YXNzb2NpYXRpbmctPmNyeXB0bywKKwkJCQkJICAgICAgIGlzX3JzbiApOworCWllLT5ha21fY291bnQgPSAxOworCWllLT5ha21fbGlzdFswXSA9CisJCXNlYzgwMjExX3Jzbl9nZXRfYWttX2Rlc2MgKCBkZXYtPmFzc29jaWF0aW5nLT5oYW5kc2hha2luZywKKwkJCQkJICAgIGlzX3JzbiApOworCWlmICggaXNfcnNuICkgeworCQlpZS0+cnNuX2NhcGFiID0gMDsKKwkJaWUtPnBta2lkX2NvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIFNldCB1cCBnZW5lcmljIFdQQSBzdXBwb3J0IHRvIGhhbmRsZSA0LVdheSBIYW5kc2hha2UKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHYgY3R4CVdQQSBjb21tb24gY29udGV4dAorICogQHYgcG1rCVBhaXJ3aXNlIE1hc3RlciBLZXkgdG8gdXNlIGZvciBzZXNzaW9uCisgKiBAdiBwbWtfbGVuCUxlbmd0aCBvZiBQTUssIGFsbW9zdCBhbHdheXMgMzIKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB3cGFfc3RhcnQgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYsIHN0cnVjdCB3cGFfY29tbW9uX2N0eCAqY3R4LAorCQljb25zdCB2b2lkICpwbWssIHNpemVfdCBwbWtfbGVuICkKK3sKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2I7CisJc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqaGRyOworCXN0cnVjdCBpZWVlODAyMTFfYmVhY29uICpiZWFjb247CisJdTggKmFwX3Jzbl9pZSA9IE5VTEwsICphcF9yc25faWVfZW5kOworCisJaWYgKCAhIGRldi0+cnNuX2llIHx8ICEgZGV2LT5hc3NvY2lhdGluZyApCisJCXJldHVybiAtRUlOVkFMOworCisJY3R4LT5kZXYgPSBkZXY7CisJbWVtY3B5ICggY3R4LT5wbWssIHBtaywgY3R4LT5wbWtfbGVuID0gcG1rX2xlbiApOworCWN0eC0+c3RhdGUgPSBXUEFfUkVBRFk7CisJY3R4LT5yZXBsYXkgPSB+MFVMTDsKKworCWlvYiA9IGRldi0+YXNzb2NpYXRpbmctPmJlYWNvbjsKKwloZHIgPSBpb2ItPmRhdGE7CisJYmVhY29uID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqICkgaGRyLT5kYXRhOworCWFwX3Jzbl9pZSA9IHNlYzgwMjExX2ZpbmRfcnNuICggYmVhY29uLT5pbmZvX2VsZW1lbnQsIGlvYi0+dGFpbCwKKwkJCQkJJmN0eC0+YXBfcnNuX2lzX3JzbiwgJmFwX3Jzbl9pZV9lbmQgKTsKKwlpZiAoIGFwX3Jzbl9pZSApIHsKKwkJY3R4LT5hcF9yc25faWUgPSBtYWxsb2MgKCBhcF9yc25faWVfZW5kIC0gYXBfcnNuX2llICk7CisJCWlmICggISBjdHgtPmFwX3Jzbl9pZSApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtY3B5ICggY3R4LT5hcF9yc25faWUsIGFwX3Jzbl9pZSwgYXBfcnNuX2llX2VuZCAtIGFwX3Jzbl9pZSApOworCQljdHgtPmFwX3Jzbl9pZV9sZW4gPSBhcF9yc25faWVfZW5kIC0gYXBfcnNuX2llOworCX0gZWxzZSB7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWN0eC0+Y3J5cHQgPSBkZXYtPmFzc29jaWF0aW5nLT5jcnlwdG87CisJY3R4LT5nY3J5cHQgPSBORVQ4MDIxMV9DUllQVF9VTktOT1dOOworCisJbGlzdF9hZGRfdGFpbCAoICZjdHgtPmxpc3QsICZ3cGFfY29udGV4dHMgKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIERpc2FibGUgaGFuZGxpbmcgb2YgcmVjZWl2ZWQgV1BBIGhhbmRzaGFrZSBmcmFtZXMKKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICovCit2b2lkIHdwYV9zdG9wICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3Qgd3BhX2NvbW1vbl9jdHggKmN0eCwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAoIGN0eCwgdG1wLCAmd3BhX2NvbnRleHRzLCBsaXN0ICkgeworCQlpZiAoIGN0eC0+ZGV2ID09IGRldiApIHsKKwkJCWZyZWUgKCBjdHgtPmFwX3Jzbl9pZSApOworCQkJY3R4LT5hcF9yc25faWUgPSBOVUxMOworCQkJbGlzdF9kZWwgKCAmY3R4LT5saXN0ICk7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBDaGVjayBQTUtJRCBjb25zaXN0ZW5jeQorICoKKyAqIEB2IGN0eAlXUEEgY29tbW9uIGNvbnRleHQKKyAqIEB2IHBta2lkCVBNS0lEIHRvIGNoZWNrIGFnYWluc3QgKDE2IGJ5dGVzIGxvbmcpCisgKiBAcmV0IHJjCVplcm8gaWYgdGhleSBtYXRjaCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIG5vdAorICovCitpbnQgd3BhX2NoZWNrX3Bta2lkICggc3RydWN0IHdwYV9jb21tb25fY3R4ICpjdHgsIGNvbnN0IHU4ICpwbWtpZCApCit7CisJdTggc2hhMV9jdHhbU0hBMV9DVFhfU0laRV07CisJdTggbXlfcG1raWRbU0hBMV9TSVpFXTsKKwl1OCBwbWtbY3R4LT5wbWtfbGVuXTsKKwlzaXplX3QgcG1rX2xlbjsKKwlzdHJ1Y3QgeworCQljaGFyIG5hbWVbOF07CisJCXU4IGFhW0VUSF9BTEVOXTsKKwkJdTggc3BhW0VUSF9BTEVOXTsKKwl9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpIHBta2lkX2RhdGE7CisKKwltZW1jcHkgKCBwbWssIGN0eC0+cG1rLCBjdHgtPnBta19sZW4gKTsKKwlwbWtfbGVuID0gY3R4LT5wbWtfbGVuOworCisJbWVtY3B5ICggcG1raWRfZGF0YS5uYW1lLCAiUE1LIE5hbWUiLCA4ICk7CisJbWVtY3B5ICggcG1raWRfZGF0YS5hYSwgY3R4LT5kZXYtPmJzc2lkLCBFVEhfQUxFTiApOworCW1lbWNweSAoIHBta2lkX2RhdGEuc3BhLCBjdHgtPmRldi0+bmV0ZGV2LT5sbF9hZGRyLCBFVEhfQUxFTiApOworCisJaG1hY19pbml0ICggJnNoYTFfYWxnb3JpdGhtLCBzaGExX2N0eCwgcG1rLCAmcG1rX2xlbiApOworCWhtYWNfdXBkYXRlICggJnNoYTFfYWxnb3JpdGhtLCBzaGExX2N0eCwgJnBta2lkX2RhdGEsCisJCSAgICAgIHNpemVvZiAoIHBta2lkX2RhdGEgKSApOworCWhtYWNfZmluYWwgKCAmc2hhMV9hbGdvcml0aG0sIHNoYTFfY3R4LCBwbWssICZwbWtfbGVuLCBteV9wbWtpZCApOworCisJaWYgKCBtZW1jbXAgKCBteV9wbWtpZCwgcG1raWQsIFdQQV9QTUtJRF9MRU4gKSAhPSAwICkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIERlcml2ZSBwYWlyd2lzZSB0cmFuc2llbnQga2V5CisgKgorICogQHYgY3R4CVdQQSBjb21tb24gY29udGV4dAorICovCitzdGF0aWMgdm9pZCB3cGFfZGVyaXZlX3B0ayAoIHN0cnVjdCB3cGFfY29tbW9uX2N0eCAqY3R4ICkKK3sKKwlzdHJ1Y3QgeworCQl1OCBtYWMxW0VUSF9BTEVOXTsKKwkJdTggbWFjMltFVEhfQUxFTl07CisJCXU4IG5vbmNlMVtXUEFfTk9OQ0VfTEVOXTsKKwkJdTggbm9uY2UyW1dQQV9OT05DRV9MRU5dOworCX0gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSkgcHRrX2RhdGE7CisKKwkvKiBUaGUgYWRkcmVzc2VzIGFuZCBub25jZXMgYXJlIHN0b3JlZCBpbiBudW1lcmljYWwgb3JkZXIgKCEpICovCisKKwlpZiAoIG1lbWNtcCAoIGN0eC0+ZGV2LT5uZXRkZXYtPmxsX2FkZHIsIGN0eC0+ZGV2LT5ic3NpZCwKKwkJICAgICAgRVRIX0FMRU4gKSA8IDAgKSB7CisJCW1lbWNweSAoIHB0a19kYXRhLm1hYzEsIGN0eC0+ZGV2LT5uZXRkZXYtPmxsX2FkZHIsIEVUSF9BTEVOICk7CisJCW1lbWNweSAoIHB0a19kYXRhLm1hYzIsIGN0eC0+ZGV2LT5ic3NpZCwgRVRIX0FMRU4gKTsKKwl9IGVsc2UgeworCQltZW1jcHkgKCBwdGtfZGF0YS5tYWMxLCBjdHgtPmRldi0+YnNzaWQsIEVUSF9BTEVOICk7CisJCW1lbWNweSAoIHB0a19kYXRhLm1hYzIsIGN0eC0+ZGV2LT5uZXRkZXYtPmxsX2FkZHIsIEVUSF9BTEVOICk7CisJfQorCisJaWYgKCBtZW1jbXAgKCBjdHgtPkFub25jZSwgY3R4LT5Tbm9uY2UsIFdQQV9OT05DRV9MRU4gKSA8IDAgKSB7CisJCW1lbWNweSAoIHB0a19kYXRhLm5vbmNlMSwgY3R4LT5Bbm9uY2UsIFdQQV9OT05DRV9MRU4gKTsKKwkJbWVtY3B5ICggcHRrX2RhdGEubm9uY2UyLCBjdHgtPlNub25jZSwgV1BBX05PTkNFX0xFTiApOworCX0gZWxzZSB7CisJCW1lbWNweSAoIHB0a19kYXRhLm5vbmNlMSwgY3R4LT5Tbm9uY2UsIFdQQV9OT05DRV9MRU4gKTsKKwkJbWVtY3B5ICggcHRrX2RhdGEubm9uY2UyLCBjdHgtPkFub25jZSwgV1BBX05PTkNFX0xFTiApOworCX0KKworCURCR0MyICggY3R4LCAiV1BBICVwIEExICVzLCBBMiAlc1xuIiwgY3R4LCBldGhfbnRvYSAoIHB0a19kYXRhLm1hYzEgKSwKKwkgICAgICAgZXRoX250b2EgKCBwdGtfZGF0YS5tYWMyICkgKTsKKwlEQkdDMiAoIGN0eCwgIldQQSAlcCBOb25jZTEsIE5vbmNlMjpcbiIsIGN0eCApOworCURCR0MyX0hEICggY3R4LCBwdGtfZGF0YS5ub25jZTEsIFdQQV9OT05DRV9MRU4gKTsKKwlEQkdDMl9IRCAoIGN0eCwgcHRrX2RhdGEubm9uY2UyLCBXUEFfTk9OQ0VfTEVOICk7CisKKwlwcmZfc2hhMSAoIGN0eC0+cG1rLCBjdHgtPnBta19sZW4sCisJCSAgICJQYWlyd2lzZSBrZXkgZXhwYW5zaW9uIiwKKwkJICAgJnB0a19kYXRhLCBzaXplb2YgKCBwdGtfZGF0YSApLAorCQkgICAmY3R4LT5wdGssIHNpemVvZiAoIGN0eC0+cHRrICkgKTsKKworCURCR0MyICggY3R4LCAiV1BBICVwIFBUSzpcbiIsIGN0eCApOworCURCR0MyX0hEICggY3R4LCAmY3R4LT5wdGssIHNpemVvZiAoIGN0eC0+cHRrICkgKTsKK30KKworCisvKioKKyAqIEluc3RhbGwgcGFpcndpc2UgdHJhbnNpZW50IGtleQorICoKKyAqIEB2IGN0eAlXUEEgY29tbW9uIGNvbnRleHQKKyAqIEB2IGxlbglLZXkgbGVuZ3RoICgxNiBmb3IgQ0NNUCwgMzIgZm9yIFRLSVApCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW5saW5lIGludCB3cGFfaW5zdGFsbF9wdGsgKCBzdHJ1Y3Qgd3BhX2NvbW1vbl9jdHggKmN0eCwgaW50IGxlbiApCit7CisJREJHQyAoIGN0eCwgIldQQSAlcDogaW5zdGFsbGluZyAlZC1ieXRlIHBhaXJ3aXNlIHRyYW5zaWVudCBrZXlcbiIsCisJICAgICAgIGN0eCwgbGVuICk7CisJREJHQzJfSEQgKCBjdHgsICZjdHgtPnB0ay50aywgbGVuICk7CisKKwlyZXR1cm4gc2VjODAyMTFfaW5zdGFsbCAoICZjdHgtPmRldi0+Y3J5cHRvLCBjdHgtPmNyeXB0LAorCQkJCSAgJmN0eC0+cHRrLnRrLCBsZW4sIE5VTEwgKTsKK30KKworLyoqCisgKiBJbnN0YWxsIGdyb3VwIHRyYW5zaWVudCBrZXkKKyAqCisgKiBAdiBjdHgJV1BBIGNvbW1vbiBjb250ZXh0CisgKiBAdiBsZW4JS2V5IGxlbmd0aCAoMTYgZm9yIENDTVAsIDMyIGZvciBUS0lQKQorICogQHYgcnNjCVJlY2VpdmUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiBFQVBPTC1LZXkgcGFja2V0CisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW5saW5lIGludCB3cGFfaW5zdGFsbF9ndGsgKCBzdHJ1Y3Qgd3BhX2NvbW1vbl9jdHggKmN0eCwgaW50IGxlbiwKKwkJCQkgICAgY29uc3Qgdm9pZCAqcnNjICkKK3sKKwlEQkdDICggY3R4LCAiV1BBICVwOiBpbnN0YWxsaW5nICVkLWJ5dGUgZ3JvdXAgdHJhbnNpZW50IGtleVxuIiwKKwkgICAgICAgY3R4LCBsZW4gKTsKKwlEQkdDMl9IRCAoIGN0eCwgJmN0eC0+Z3RrLnRrLCBsZW4gKTsKKworCXJldHVybiBzZWM4MDIxMV9pbnN0YWxsICggJmN0eC0+ZGV2LT5nY3J5cHRvLCBjdHgtPmdjcnlwdCwKKwkJCQkgICZjdHgtPmd0ay50aywgbGVuLCByc2MgKTsKK30KKworLyoqCisgKiBTZWFyY2ggZm9yIGdyb3VwIHRyYW5zaWVudCBrZXksIGFuZCBpbnN0YWxsIGl0IGlmIGZvdW5kCisgKgorICogQHYgY3R4CVdQQSBjb21tb24gY29udGV4dAorICogQHYgaWUJUG9pbnRlciB0byBmaXJzdCBJRSBpbiBrZXkgZGF0YSBmaWVsZAorICogQHYgaWVfZW5kCVBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBub3QgaW4ga2V5IGRhdGEgZmllbGQKKyAqIEB2IHJzYwlSZWNlaXZlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gRUFQT0wtS2V5IHBhY2tldAorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB3cGFfbWF5YmVfaW5zdGFsbF9ndGsgKCBzdHJ1Y3Qgd3BhX2NvbW1vbl9jdHggKmN0eCwKKwkJCQkgICB1bmlvbiBpZWVlODAyMTFfaWUgKmllLCB2b2lkICppZV9lbmQsCisJCQkJICAgY29uc3Qgdm9pZCAqcnNjICkKK3sKKwlzdHJ1Y3Qgd3BhX2tkZSAqa2RlOworCisJaWYgKCAhIGllZWU4MDIxMV9pZV9ib3VuZCAoIGllLCBpZV9lbmQgKSApCisJCXJldHVybiAtRU5PRU5UOworCisJd2hpbGUgKCBpZSApIHsKKwkJaWYgKCBpZS0+aWQgPT0gSUVFRTgwMjExX0lFX1ZFTkRPUiAmJgorCQkgICAgIGllLT52ZW5kb3Iub3VpID09IFdQQV9LREVfR1RLICkKKwkJCWJyZWFrOworCisJCWllID0gaWVlZTgwMjExX25leHRfaWUgKCBpZSwgaWVfZW5kICk7CisJfQorCisJaWYgKCAhIGllICkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoIGllLT5sZW4gLSA2dSA+IHNpemVvZiAoIGN0eC0+Z3RrLnRrICkgKSB7CisJCURCR0MgKCBjdHgsICJXUEEgJXA6IEdUSyBLREUgaXMgdG9vIGxvbmcgKCVkIGJ5dGVzLCBtYXggJWQpXG4iLAorCQkgICAgICAgY3R4LCBpZS0+bGVuIC0gNCwgc2l6ZW9mICggY3R4LT5ndGsudGsgKSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBYWFggV2UgaWdub3JlIGtleSBJRCBmb3Igbm93LiAqLworCWtkZSA9ICggc3RydWN0IHdwYV9rZGUgKiApIGllOworCW1lbWNweSAoICZjdHgtPmd0ay50aywgJmtkZS0+Z3RrX2VuY2FwLmd0aywga2RlLT5sZW4gLSA2ICk7CisKKwlyZXR1cm4gd3BhX2luc3RhbGxfZ3RrICggY3R4LCBrZGUtPmxlbiAtIDYsIHJzYyApOworfQorCisKKy8qKgorICogQWxsb2NhdGUgSS9PIGJ1ZmZlciBmb3IgY29uc3RydWN0aW9uIG9mIG91dGdvaW5nIEVBUE9MLUtleSBmcmFtZQorICoKKyAqIEB2IGtkbGVuCU1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBLZXkgRGF0YSBmaWVsZAorICogQHJldCBpb2IJTmV3bHkgYWxsb2NhdGVkIEkvTyBidWZmZXIKKyAqCisgKiBUaGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgaGF2ZSBzcGFjZSByZXNlcnZlZCBmb3IgdGhlIGxpbmstbGF5ZXIgYW5kCisgKiBFQVBPTCBoZWFkZXJzLCBhbmQgd2lsbCBoYXZlIEBjIGlvYi0+dGFpbCBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YKKyAqIHRoZSBLZXkgRGF0YSBmaWVsZC4gVGh1cywgaXQgaXMgbmVjZXNzYXJ5IHRvIHVzZSBpb2JfcHV0KCkgaW4KKyAqIGZpbGxpbmcgdGhlIEtleSBEYXRhLgorICovCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqIHdwYV9hbGxvY19mcmFtZSAoIGludCBrZGxlbiApCit7CisJc3RydWN0IGlvX2J1ZmZlciAqcmV0ID0gYWxsb2NfaW9iICggc2l6ZW9mICggc3RydWN0IGVhcG9sX2tleV9wa3QgKSArCisJCQkJCSAgICBrZGxlbiArIEVBUE9MX0hEUl9MRU4gKworCQkJCQkgICAgTUFYX0xMX0hFQURFUl9MRU4gKTsKKwlpZiAoICEgcmV0ICkKKwkJcmV0dXJuIE5VTEw7CisKKwlpb2JfcmVzZXJ2ZSAoIHJldCwgTUFYX0xMX0hFQURFUl9MRU4gKyBFQVBPTF9IRFJfTEVOICk7CisJbWVtc2V0ICggaW9iX3B1dCAoIHJldCwgc2l6ZW9mICggc3RydWN0IGVhcG9sX2tleV9wa3QgKSApLCAwLAorCQkgc2l6ZW9mICggc3RydWN0IGVhcG9sX2tleV9wa3QgKSApOworCisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIFNlbmQgRUFQT0wtS2V5IHBhY2tldAorICoKKyAqIEB2IGlvYglJL08gYnVmZmVyLCB3aXRoIHN1ZmZpY2llbnQgaGVhZHJvb20gZm9yIGhlYWRlcnMKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKiBAdiBraWUJS2V5IGludGVncml0eSBhbmQgZW5jcnlwdGlvbiBoYW5kbGVyCisgKiBAdiBpc19yc24JSWYgVFJVRSwgaGFuZHNoYWtlIHVzZXMgbmV3IFJTTiBmb3JtYXQKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogSWYgYSBLSUUgaXMgc3BlY2lmaWVkLCB0aGUgTUlDIHdpbGwgYmUgZmlsbGVkIGluIGJlZm9yZSB0cmFuc21pc3Npb24uCisgKi8KK3N0YXRpYyBpbnQgd3BhX3NlbmRfZWFwb2wgKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IsIHN0cnVjdCB3cGFfY29tbW9uX2N0eCAqY3R4LAorCQkJICAgIHN0cnVjdCB3cGFfa2llICpraWUgKQoreworCXN0cnVjdCBlYXBvbF9rZXlfcGt0ICpwa3QgPSBpb2ItPmRhdGE7CisJc3RydWN0IGVhcG9sX2ZyYW1lICplYXBvbCA9IGlvYl9wdXNoICggaW9iLCBFQVBPTF9IRFJfTEVOICk7CisKKwlwa3QtPmluZm8gPSBodG9ucyAoIHBrdC0+aW5mbyApOworCXBrdC0+a2V5c2l6ZSA9IGh0b25zICggcGt0LT5rZXlzaXplICk7CisJcGt0LT5kYXRhbGVuID0gaHRvbnMgKCBwa3QtPmRhdGFsZW4gKTsKKwlwa3QtPnJlcGxheSA9IGNwdV90b19iZTY0ICggcGt0LT5yZXBsYXkgKTsKKwllYXBvbC0+dmVyc2lvbiA9IEVBUE9MX1RISVNfVkVSU0lPTjsKKwllYXBvbC0+dHlwZSA9IEVBUE9MX1RZUEVfS0VZOworCWVhcG9sLT5sZW5ndGggPSBodG9ucyAoIGlvYi0+dGFpbCAtIGlvYi0+ZGF0YSAtIHNpemVvZiAoICplYXBvbCApICk7CisKKwltZW1zZXQgKCBwa3QtPm1pYywgMCwgc2l6ZW9mICggcGt0LT5taWMgKSApOworCWlmICgga2llICkKKwkJa2llLT5taWMgKCAmY3R4LT5wdGsua2NrLCBlYXBvbCwgRUFQT0xfSERSX0xFTiArCisJCQkgICBzaXplb2YgKCAqcGt0ICkgKyBudG9ocyAoIHBrdC0+ZGF0YWxlbiApLAorCQkJICAgcGt0LT5taWMgKTsKKworCXJldHVybiBuZXRfdHggKCBpb2IsIGN0eC0+ZGV2LT5uZXRkZXYsICZlYXBvbF9wcm90b2NvbCwKKwkJCWN0eC0+ZGV2LT5ic3NpZCApOworfQorCisKKy8qKgorICogU2VuZCBzZWNvbmQgZnJhbWUgaW4gNC1XYXkgSGFuZHNoYWtlCisgKgorICogQHYgY3R4CVdQQSBjb21tb24gY29udGV4dAorICogQHYgcGt0CUZpcnN0IGZyYW1lLCB0byB3aGljaCB0aGlzIGlzIGEgcmVwbHkKKyAqIEB2IGlzX3JzbglJZiBUUlVFLCBoYW5kc2hha2UgdXNlcyBuZXcgUlNOIGZvcm1hdAorICogQHYga2llCUtleSBpbnRlZ3JpdHkgYW5kIGVuY3J5cHRpb24gaGFuZGxlcgorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB3cGFfc2VuZF8yX29mXzQgKCBzdHJ1Y3Qgd3BhX2NvbW1vbl9jdHggKmN0eCwKKwkJCSAgICAgc3RydWN0IGVhcG9sX2tleV9wa3QgKnBrdCwgaW50IGlzX3JzbiwKKwkJCSAgICAgc3RydWN0IHdwYV9raWUgKmtpZSApCit7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9iID0gd3BhX2FsbG9jX2ZyYW1lICggY3R4LT5kZXYtPnJzbl9pZS0+bGVuICsgMiApOworCXN0cnVjdCBlYXBvbF9rZXlfcGt0ICpucGt0OworCisJaWYgKCAhIGlvYiApCisJCXJldHVybiAtRU5PTUVNOworCisJbnBrdCA9IGlvYi0+ZGF0YTsKKwltZW1jcHkgKCBucGt0LCBwa3QsIHNpemVvZiAoICpwa3QgKSApOworCW5wa3QtPmluZm8gJj0gfkVBUE9MX0tFWV9JTkZPX0tFWV9BQ0s7CisJbnBrdC0+aW5mbyB8PSBFQVBPTF9LRVlfSU5GT19LRVlfTUlDOworCWlmICggaXNfcnNuICkKKwkJbnBrdC0+a2V5c2l6ZSA9IDA7CisJbWVtY3B5ICggbnBrdC0+bm9uY2UsIGN0eC0+U25vbmNlLCBzaXplb2YgKCBucGt0LT5ub25jZSApICk7CisJbnBrdC0+ZGF0YWxlbiA9IGN0eC0+ZGV2LT5yc25faWUtPmxlbiArIDI7CisJbWVtY3B5ICggaW9iX3B1dCAoIGlvYiwgbnBrdC0+ZGF0YWxlbiApLCBjdHgtPmRldi0+cnNuX2llLAorCQkgbnBrdC0+ZGF0YWxlbiApOworCisJREJHQyAoIGN0eCwgIldQQSAlcDogc2VuZGluZyAyLzRcbiIsIGN0eCApOworCisJcmV0dXJuIHdwYV9zZW5kX2VhcG9sICggaW9iLCBjdHgsIGtpZSApOworfQorCisKKy8qKgorICogSGFuZGxlIHJlY2VpcHQgb2YgZmlyc3QgZnJhbWUgaW4gNC1XYXkgSGFuZHNoYWtlCisgKgorICogQHYgY3R4CVdQQSBjb21tb24gY29udGV4dAorICogQHYgcGt0CUVBUE9MLUtleSBwYWNrZXQKKyAqIEB2IGlzX3JzbglJZiBUUlVFLCBmcmFtZSB1c2VzIG5ldyBSU04gZm9ybWF0CisgKiBAdiBraWUJS2V5IGludGVncml0eSBhbmQgZW5jcnlwdGlvbiBoYW5kbGVyCisgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHdwYV9oYW5kbGVfMV9vZl80ICggc3RydWN0IHdwYV9jb21tb25fY3R4ICpjdHgsCisJCQkgICAgICAgc3RydWN0IGVhcG9sX2tleV9wa3QgKnBrdCwgaW50IGlzX3JzbiwKKwkJCSAgICAgICBzdHJ1Y3Qgd3BhX2tpZSAqa2llICkKK3sKKwlpbnQgcmM7CisKKwlpZiAoIGN0eC0+c3RhdGUgPT0gV1BBX1dBSVRJTkcgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN0eC0+c3RhdGUgPSBXUEFfV09SS0lORzsKKwltZW1jcHkgKCBjdHgtPkFub25jZSwgcGt0LT5ub25jZSwgc2l6ZW9mICggY3R4LT5Bbm9uY2UgKSApOworCWlmICggISBjdHgtPmhhdmVfU25vbmNlICkgeworCQlnZXRfcmFuZG9tX2J5dGVzICggY3R4LT5Tbm9uY2UsIHNpemVvZiAoIGN0eC0+U25vbmNlICkgKTsKKwkJY3R4LT5oYXZlX1Nub25jZSA9IDE7CisJfQorCisJaWYgKCBpc19yc24gJiYgcGt0LT5kYXRhbGVuICkgeworCQl1bmlvbiBpZWVlODAyMTFfaWUgKmllID0gKCB1bmlvbiBpZWVlODAyMTFfaWUgKiApIHBrdC0+ZGF0YTsKKwkJdm9pZCAqaWVfZW5kID0gcGt0LT5kYXRhICsgcGt0LT5kYXRhbGVuOworCisJCWlmICggISBpZWVlODAyMTFfaWVfYm91bmQgKCBpZSwgaWVfZW5kICkgKSB7CisJCQlEQkdDICggY3R4LCAiV1BBICVwOiBtYWxmb3JtZWQgUE1LSUQgS0RFXG4iLCBjdHggKTsKKwkJCXJldHVybiB3cGFfZmFpbCAoIGN0eCwgLUVJTlZBTCApOworCQl9CisKKwkJd2hpbGUgKCBpZSApIHsKKwkJCWlmICggaWUtPmlkID09IElFRUU4MDIxMV9JRV9WRU5ET1IgJiYKKwkJCSAgICAgaWUtPnZlbmRvci5vdWkgPT0gV1BBX0tERV9QTUtJRCApIHsKKwkJCQlyYyA9IHdwYV9jaGVja19wbWtpZCAoIGN0eCwgaWUtPnZlbmRvci5kYXRhICk7CisJCQkJaWYgKCByYyA8IDAgKSB7CisJCQkJCURCR0MgKCBjdHgsICJXUEEgJXAgQUxFUlQ6IFBNS0lEICIKKwkJCQkJICAgICAgICJtaXNtYXRjaCBpbiAxLzRcbiIsIGN0eCApOworCQkJCQlyZXR1cm4gd3BhX2ZhaWwgKCBjdHgsIHJjICk7CisJCQkJfQorCQkJfQorCisJCQlpZSA9IGllZWU4MDIxMV9uZXh0X2llICggaWUsIGllX2VuZCApOworCQl9CisJfQorCisJREJHQyAoIGN0eCwgIldQQSAlcDogcmVjZWl2ZWQgMS80LCBsb29rcyBPS1xuIiwgY3R4ICk7CisKKwl3cGFfZGVyaXZlX3B0ayAoIGN0eCApOworCisJcmV0dXJuIHdwYV9zZW5kXzJfb2ZfNCAoIGN0eCwgcGt0LCBpc19yc24sIGtpZSApOworfQorCisKKy8qKgorICogU2VuZCBmb3VydGggZnJhbWUgaW4gNC1XYXkgSGFuZHNoYWtlLCBvciBzZWNvbmQgaW4gR3JvdXAgS2V5IEhhbmRzaGFrZQorICoKKyAqIEB2IGN0eAlXUEEgY29tbW9uIGNvbnRleHQKKyAqIEB2IHBrdAlFQVBPTC1LZXkgcGFja2V0IGZvciBmcmFtZSB0byB3aGljaCB3ZSdyZSByZXBseWluZworICogQHYgaXNfcnNuCUlmIFRSVUUsIGZyYW1lIHVzZXMgbmV3IFJTTiBmb3JtYXQKKyAqIEB2IGtpZQlLZXkgaW50ZWdyaXR5IGFuZCBlbmNyeXB0aW9uIGhhbmRsZXIKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd3BhX3NlbmRfZmluYWwgKCBzdHJ1Y3Qgd3BhX2NvbW1vbl9jdHggKmN0eCwKKwkJCSAgICBzdHJ1Y3QgZWFwb2xfa2V5X3BrdCAqcGt0LCBpbnQgaXNfcnNuLAorCQkJICAgIHN0cnVjdCB3cGFfa2llICpraWUgKQoreworCXN0cnVjdCBpb19idWZmZXIgKmlvYiA9IHdwYV9hbGxvY19mcmFtZSAoIDAgKTsKKwlzdHJ1Y3QgZWFwb2xfa2V5X3BrdCAqbnBrdDsKKworCWlmICggISBpb2IgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5wa3QgPSBpb2ItPmRhdGE7CisJbWVtY3B5ICggbnBrdCwgcGt0LCBzaXplb2YgKCAqcGt0ICkgKTsKKwlucGt0LT5pbmZvICY9IH4oIEVBUE9MX0tFWV9JTkZPX0tFWV9BQ0sgfCBFQVBPTF9LRVlfSU5GT19JTlNUQUxMIHwKKwkJCSBFQVBPTF9LRVlfSU5GT19LRVlfRU5DICk7CisJaWYgKCBpc19yc24gKQorCQlucGt0LT5rZXlzaXplID0gMDsKKwltZW1zZXQgKCBucGt0LT5ub25jZSwgMCwgc2l6ZW9mICggbnBrdC0+bm9uY2UgKSApOworCW1lbXNldCAoIG5wa3QtPml2LCAwLCBzaXplb2YgKCBucGt0LT5pdiApICk7CisJbnBrdC0+ZGF0YWxlbiA9IDA7CisKKwlpZiAoIG5wa3QtPmluZm8gJiBFQVBPTF9LRVlfSU5GT19UWVBFICkKKwkJREJHQyAoIGN0eCwgIldQQSAlcDogc2VuZGluZyA0LzRcbiIsIGN0eCApOworCWVsc2UKKwkJREJHQyAoIGN0eCwgIldQQSAlcDogc2VuZGluZyAyLzJcbiIsIGN0eCApOworCisJcmV0dXJuIHdwYV9zZW5kX2VhcG9sICggaW9iLCBjdHgsIGtpZSApOworCit9CisKKworLyoqCisgKiBIYW5kbGUgcmVjZWlwdCBvZiB0aGlyZCBmcmFtZSBpbiA0LVdheSBIYW5kc2hha2UKKyAqCisgKiBAdiBjdHgJV1BBIGNvbW1vbiBjb250ZXh0CisgKiBAdiBwa3QJRUFQT0wtS2V5IHBhY2tldAorICogQHYgaXNfcnNuCUlmIFRSVUUsIGZyYW1lIHVzZXMgbmV3IFJTTiBmb3JtYXQKKyAqIEB2IGtpZQlLZXkgaW50ZWdyaXR5IGFuZCBlbmNyeXB0aW9uIGhhbmRsZXIKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd3BhX2hhbmRsZV8zX29mXzQgKCBzdHJ1Y3Qgd3BhX2NvbW1vbl9jdHggKmN0eCwKKwkJCSAgICAgICBzdHJ1Y3QgZWFwb2xfa2V5X3BrdCAqcGt0LCBpbnQgaXNfcnNuLAorCQkJICAgICAgIHN0cnVjdCB3cGFfa2llICpraWUgKQoreworCWludCByYzsKKwl1OCAqdGhpc19yc24sICp0aGlzX3Jzbl9lbmQ7CisJdTggKm5ld19yc24sICpuZXdfcnNuX2VuZDsKKwlpbnQgdGhpc19pc19yc24sIG5ld19pc19yc247CisKKwlpZiAoIGN0eC0+c3RhdGUgPT0gV1BBX1dBSVRJTkcgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN0eC0+c3RhdGUgPSBXUEFfV09SS0lORzsKKworCS8qIENoZWNrIG5vbmNlICovCisJaWYgKCBtZW1jbXAgKCBjdHgtPkFub25jZSwgcGt0LT5ub25jZSwgV1BBX05PTkNFX0xFTiApICE9IDAgKSB7CisJCURCR0MgKCBjdHgsICJXUEEgJXAgQUxFUlQ6IG5vbmNlIG1pc21hdGNoIGluIDMvNFxuIiwgY3R4ICk7CisJCXJldHVybiB3cGFfZmFpbCAoIGN0eCwgLUVBQ0NFUyApOworCX0KKworCS8qIENoZWNrIFJTTiBJRSAqLworCXRoaXNfcnNuID0gc2VjODAyMTFfZmluZF9yc24gKCAoIHVuaW9uIGllZWU4MDIxMV9pZSAqICkgcGt0LT5kYXRhLAorCQkJCSAgICAgICBwa3QtPmRhdGEgKyBwa3QtPmRhdGFsZW4sCisJCQkJICAgICAgICZ0aGlzX2lzX3JzbiwgJnRoaXNfcnNuX2VuZCApOworCWlmICggdGhpc19yc24gKQorCQluZXdfcnNuID0gc2VjODAyMTFfZmluZF9yc24gKCAoIHVuaW9uIGllZWU4MDIxMV9pZSAqICkKKwkJCQkJICAgICAgICAgICAgICB0aGlzX3Jzbl9lbmQsCisJCQkJCSAgICAgIHBrdC0+ZGF0YSArIHBrdC0+ZGF0YWxlbiwKKwkJCQkJICAgICAgJm5ld19pc19yc24sICZuZXdfcnNuX2VuZCApOworCWVsc2UKKwkJbmV3X3JzbiA9IE5VTEw7CisKKwlpZiAoICEgY3R4LT5hcF9yc25faWUgfHwgISB0aGlzX3JzbiB8fAorCSAgICAgY3R4LT5hcF9yc25faWVfbGVuICE9ICggdGhpc19yc25fZW5kIC0gdGhpc19yc24gKSB8fAorCSAgICAgY3R4LT5hcF9yc25faXNfcnNuICE9IHRoaXNfaXNfcnNuIHx8CisJICAgICBtZW1jbXAgKCBjdHgtPmFwX3Jzbl9pZSwgdGhpc19yc24sIGN0eC0+YXBfcnNuX2llX2xlbiApICE9IDAgKSB7CisJCURCR0MgKCBjdHgsICJXUEEgJXAgQUxFUlQ6IFJTTiBtaXNtYXRjaCBpbiAzLzRcbiIsIGN0eCApOworCQlEQkdDMiAoIGN0eCwgIldQQSAlcCBSU05zIChpbiAzLzQsIGluIGJlYWNvbik6XG4iLCBjdHggKTsKKwkJREJHQzJfSEQgKCBjdHgsIHRoaXNfcnNuLCB0aGlzX3Jzbl9lbmQgLSB0aGlzX3JzbiApOworCQlEQkdDMl9IRCAoIGN0eCwgY3R4LT5hcF9yc25faWUsIGN0eC0+YXBfcnNuX2llX2xlbiApOworCQlyZXR1cm4gd3BhX2ZhaWwgKCBjdHgsIC1FQUNDRVMgKTsKKwl9CisKKwkvKiBEb24ndCBzd2l0Y2ggaWYgdGhleSBqdXN0IHN1cHBsaWVkIGJvdGggc3R5bGVzIG9mIElFCisJICAgc2ltdWx0YW5lb3VzbHk7IHdlIG5lZWQgdHdvIFJTTiBJRXMgb3IgdHdvIFdQQSBJRXMgdG8KKwkgICBzd2l0Y2ggY2lwaGVycy4gVGhleSdsbCBiZSBpbW1lZGlhdGVseSBjb25zZWN1dGl2ZSBiZWNhdXNlCisJICAgb2Ygb3JkZXJpbmcgZ3VhcmFudGVlcy4gKi8KKwlpZiAoIG5ld19yc24gJiYgdGhpc19pc19yc24gPT0gbmV3X2lzX3JzbiApIHsKKwkJc3RydWN0IG5ldDgwMjExX3dsYW4gKmFzc29jID0gY3R4LT5kZXYtPmFzc29jaWF0aW5nOworCQlEQkdDICggY3R4LCAiV1BBICVwOiBhY2NvbW1vZGF0aW5nIGJhaXQtYW5kLXN3aXRjaCB0YWN0aWNzXG4iLAorCQkgICAgICAgY3R4ICk7CisJCURCR0MyICggY3R4LCAiV1BBICVwIFJTTnMgKGluIDMvNCtiZWFjb24sIG5ldyBpbiAzLzQpOlxuIiwKKwkJCWN0eCApOworCQlEQkdDMl9IRCAoIGN0eCwgdGhpc19yc24sIHRoaXNfcnNuX2VuZCAtIHRoaXNfcnNuICk7CisJCURCR0MyX0hEICggY3R4LCBuZXdfcnNuLCBuZXdfcnNuX2VuZCAtIG5ld19yc24gKTsKKworCQlpZiAoICggcmMgPSBzZWM4MDIxMV9kZXRlY3RfaWUgKCBuZXdfaXNfcnNuLCBuZXdfcnNuLAorCQkJCQkJIG5ld19yc25fZW5kLAorCQkJCQkJICZhc3NvYy0+aGFuZHNoYWtpbmcsCisJCQkJCQkgJmFzc29jLT5jcnlwdG8gKSApICE9IDAgKQorCQkJREJHQyAoIGN0eCwgIldQQSAlcDogYmFpdC1hbmQtc3dpdGNoIGludmFsaWQsIHN0YXlpbmcgIgorCQkJICAgICAgICJ3aXRoIG9yaWdpbmFsIHJlcXVlc3RcbiIsIGN0eCApOworCX0gZWxzZSB7CisJCW5ld19yc24gPSB0aGlzX3JzbjsKKwkJbmV3X2lzX3JzbiA9IHRoaXNfaXNfcnNuOworCQluZXdfcnNuX2VuZCA9IHRoaXNfcnNuX2VuZDsKKwl9CisKKwkvKiBHcmFiIGdyb3VwIGNyeXB0b3N5c3RlbSBJRCAqLworCWN0eC0+Z2NyeXB0ID0gc2VjODAyMTFfcnNuX2dldF9uZXQ4MDIxMV9jcnlwdCAoICooIHUzMiAqICkKKwkJCQkJCQkoIG5ld19yc24gKyAyICkgKTsKKworCS8qIENoZWNrIGZvciBhIEdUSywgaWYgaW5mbyBmaWVsZCBpcyBlbmNyeXB0ZWQgKi8KKwlpZiAoIHBrdC0+aW5mbyAmIEVBUE9MX0tFWV9JTkZPX0tFWV9FTkMgKSB7CisJCXJjID0gd3BhX21heWJlX2luc3RhbGxfZ3RrICggY3R4LAorCQkJCQkgICAgICggdW5pb24gaWVlZTgwMjExX2llICogKSBwa3QtPmRhdGEsCisJCQkJCSAgICAgcGt0LT5kYXRhICsgcGt0LT5kYXRhbGVuLAorCQkJCQkgICAgIHBrdC0+cnNjICk7CisJCWlmICggcmMgPCAwICkgeworCQkJREJHQyAoIGN0eCwgIldQQSAlcCBkaWQgbm90IGluc3RhbGwgR1RLIGluIDMvNDogJXNcbiIsCisJCQkgICAgICAgY3R4LCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCWlmICggcmMgIT0gLUVOT0VOVCApCisJCQkJcmV0dXJuIHdwYV9mYWlsICggY3R4LCByYyApOworCQl9CisJfQorCisJREJHQyAoIGN0eCwgIldQQSAlcDogcmVjZWl2ZWQgMy80LCBsb29rcyBPS1xuIiwgY3R4ICk7CisKKwkvKiBTZW5kIGZpbmFsIG1lc3NhZ2UgKi8KKwlyYyA9IHdwYV9zZW5kX2ZpbmFsICggY3R4LCBwa3QsIGlzX3Jzbiwga2llICk7CisJaWYgKCByYyA8IDAgKQorCQlyZXR1cm4gd3BhX2ZhaWwgKCBjdHgsIHJjICk7CisKKwkvKiBJbnN0YWxsIFBUSyAqLworCXJjID0gd3BhX2luc3RhbGxfcHRrICggY3R4LCBwa3QtPmtleXNpemUgKTsKKwlpZiAoIHJjIDwgMCApIHsKKwkJREJHQyAoIGN0eCwgIldQQSAlcCBmYWlsZWQgdG8gaW5zdGFsbCBQVEs6ICVzXG4iLCBjdHgsCisJCSAgICAgICBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHdwYV9mYWlsICggY3R4LCByYyApOworCX0KKworCS8qIE1hcmsgdXMgYXMgbmVlZGluZyBhIG5ldyBTbm9uY2UgaWYgd2UgcmVrZXkgKi8KKwljdHgtPmhhdmVfU25vbmNlID0gMDsKKworCS8qIERvbmUhICovCisJY3R4LT5zdGF0ZSA9IFdQQV9TVUNDRVNTOworCXJldHVybiAwOworfQorCisKKy8qKgorICogSGFuZGxlIHJlY2VpcHQgb2YgZmlyc3QgZnJhbWUgaW4gR3JvdXAgS2V5IEhhbmRzaGFrZQorICoKKyAqIEB2IGN0eAlXUEEgY29tbW9uIGNvbnRleHQKKyAqIEB2IHBrdAlFQVBPTC1LZXkgcGFja2V0CisgKiBAdiBpc19yc24JSWYgVFJVRSwgZnJhbWUgdXNlcyBuZXcgUlNOIGZvcm1hdAorICogQHYga2llCUtleSBpbnRlZ3JpdHkgYW5kIGVuY3J5cHRpb24gaGFuZGxlcgorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB3cGFfaGFuZGxlXzFfb2ZfMiAoIHN0cnVjdCB3cGFfY29tbW9uX2N0eCAqY3R4LAorCQkJICAgICAgIHN0cnVjdCBlYXBvbF9rZXlfcGt0ICpwa3QsIGludCBpc19yc24sCisJCQkgICAgICAgc3RydWN0IHdwYV9raWUgKmtpZSApCit7CisJaW50IHJjOworCisJLyoKKwkgKiBXUEEgYW5kIFJTTiBkbyB0aGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50bHkuCisJICoKKwkgKiBUaGUgaWRlYSBvZiBlbmNvZGluZyB0aGUgR1RLIChvciBQTUtJRCwgb3IgdmFyaW91cyBvdGhlcgorCSAqIHRoaW5ncykgaW50byBhIEtERSB0aGF0IGxvb2tzIGxpa2UgYW4gaW5mb3JtYXRpb24gZWxlbWVudAorCSAqIGlzIGFuIFJTTiBpbm5vdmF0aW9uOyBvbGQgV1BBIGNvZGUgbmV2ZXIgZW5jYXBzdWxhdGVzCisJICogdGhpbmdzIGxpa2UgdGhhdC4gSWYgaXQgbG9va3MgbGlrZSBhbiBpbmZvIGVsZW1lbnQsIGl0CisJICogcmVhbGx5IGlzIChmb3IgdGhlIFdQQSBJRSBjaGVjayBpbiBmcmFtZXMgMi80IGFuZCAzLzQpLiBUaGUKKwkgKiAia2V5IGRhdGEgZW5jcnlwdGVkIiBiaXQgaW4gdGhlIGluZm8gZmllbGQgaXMgYWxzbyBzcGVjaWZpYworCSAqIHRvIFJTTi4KKwkgKgorCSAqIFNvIGZyb20gYW4gb2xkIFdQQSBob3N0LCAzLzQgZG9lcyBub3QgY29udGFpbiBhbgorCSAqIGVuY2Fwc3VsYXRlZCBHVEsuIFRoZSBmaXJzdCBmcmFtZSBvZiB0aGUgR0sgaGFuZHNoYWtlCisJICogY29udGFpbnMgaXQsIGVuY3J5cHRlZCwgYnV0IHdpdGhvdXQgYSBLREUgd3JhcHBlciwgYW5kIHdpdGgKKwkgKiB0aGUga2V5IElEIGZpZWxkICh3aGljaCBnUFhFIGRvZXNuJ3QgdXNlKSBzaG92ZWQgYXdheSBpbgorCSAqIHRoZSByZXNlcnZlZCBiaXRzIGluIHRoZSBpbmZvIGZpZWxkLCBhbmQgdGhlIFR4UnggYml0CisJICogc3RlYWxpbmcgdGhlIEluc3RhbGwgYml0J3Mgc3BvdC4KKwkgKi8KKworCWlmICggaXNfcnNuICYmICggcGt0LT5pbmZvICYgRUFQT0xfS0VZX0lORk9fS0VZX0VOQyApICkgeworCQlyYyA9IHdwYV9tYXliZV9pbnN0YWxsX2d0ayAoIGN0eCwKKwkJCQkJICAgICAoIHVuaW9uIGllZWU4MDIxMV9pZSAqICkgcGt0LT5kYXRhLAorCQkJCQkgICAgIHBrdC0+ZGF0YSArIHBrdC0+ZGF0YWxlbiwKKwkJCQkJICAgICBwa3QtPnJzYyApOworCQlpZiAoIHJjIDwgMCApIHsKKwkJCURCR0MgKCBjdHgsICJXUEEgJXA6IGZhaWxlZCB0byBpbnN0YWxsIEdUSyBpbiAxLzI6ICIKKwkJCSAgICAgICAiJXNcbiIsIGN0eCwgc3RyZXJyb3IgKCByYyApICk7CisJCQlyZXR1cm4gd3BhX2ZhaWwgKCBjdHgsIHJjICk7CisJCX0KKwl9IGVsc2UgeworCQlyYyA9IGtpZS0+ZGVjcnlwdCAoICZjdHgtPnB0ay5rZWssIHBrdC0+aXYsIHBrdC0+ZGF0YSwKKwkJCQkgICAgJnBrdC0+ZGF0YWxlbiApOworCQlpZiAoIHJjIDwgMCApIHsKKwkJCURCR0MgKCBjdHgsICJXUEEgJXA6IGZhaWxlZCB0byBkZWNyeXB0IEdUSzogJXNcbiIsCisJCQkgICAgICAgY3R4LCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCXJldHVybiByYzsgLyogbm9uLWZhdGFsICovCisJCX0KKwkJaWYgKCBwa3QtPmRhdGFsZW4gPiBzaXplb2YgKCBjdHgtPmd0ay50ayApICkgeworCQkJREJHQyAoIGN0eCwgIldQQSAlcDogdG9vIG11Y2ggR1RLIGRhdGEgKCVkID4gJWQpXG4iLAorCQkJICAgICAgIGN0eCwgcGt0LT5kYXRhbGVuLCBzaXplb2YgKCBjdHgtPmd0ay50ayApICk7CisJCQlyZXR1cm4gd3BhX2ZhaWwgKCBjdHgsIC1FSU5WQUwgKTsKKwkJfQorCisJCW1lbWNweSAoICZjdHgtPmd0ay50aywgcGt0LT5kYXRhLCBwa3QtPmRhdGFsZW4gKTsKKwkJd3BhX2luc3RhbGxfZ3RrICggY3R4LCBwa3QtPmRhdGFsZW4sIHBrdC0+cnNjICk7CisJfQorCisJREJHQyAoIGN0eCwgIldQQSAlcDogcmVjZWl2ZWQgMS8yLCBsb29rcyBPS1xuIiwgY3R4ICk7CisKKwlyZXR1cm4gd3BhX3NlbmRfZmluYWwgKCBjdHgsIHBrdCwgaXNfcnNuLCBraWUgKTsKK30KKworCisvKioKKyAqIEhhbmRsZSByZWNlaXB0IG9mIEVBUE9MLUtleSBmcmFtZSBmb3IgV1BBCisgKgorICogQHYgaW9iCUkvTyBidWZmZXIKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorICogQHYgbGxfc291cmNlCVNvdXJjZSBsaW5rLWxheWVyIGFkZHJlc3MKKyAqLworc3RhdGljIGludCBlYXBvbF9rZXlfcnggKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgIGNvbnN0IHZvaWQgKmxsX3NvdXJjZSApCit7CisJc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ID0gbmV0ODAyMTFfZ2V0ICggbmV0ZGV2ICk7CisJc3RydWN0IGVhcG9sX2tleV9wa3QgKnBrdCA9IGlvYi0+ZGF0YTsKKwlpbnQgaXNfcnNuLCBmb3VuZF9jdHg7CisJc3RydWN0IHdwYV9jb21tb25fY3R4ICpjdHg7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qgd3BhX2tpZSAqa2llOworCXU4IHRoZWlyX21pY1sxNl0sIG91cl9taWNbMTZdOworCisJaWYgKCBwa3QtPnR5cGUgIT0gRUFQT0xfS0VZX1RZUEVfV1BBICYmCisJICAgICBwa3QtPnR5cGUgIT0gRUFQT0xfS0VZX1RZUEVfUlNOICkgeworCQlEQkcgKCAiRUFQT0wtS2V5OiBwYWNrZXQgbm90IG9mIDgwMi4xMSB0eXBlXG4iICk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkcm9wOworCX0KKworCWlzX3JzbiA9ICggcGt0LT50eXBlID09IEVBUE9MX0tFWV9UWVBFX1JTTiApOworCisJaWYgKCAhIGRldiApIHsKKwkJREJHICggIkVBUE9MLUtleTogcGFja2V0IG5vdCBmcm9tIDgwMi4xMVxuIiApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlpZiAoIG1lbWNtcCAoIGRldi0+YnNzaWQsIGxsX3NvdXJjZSwgRVRIX0FMRU4gKSAhPSAwICkgeworCQlEQkcgKCAiRUFQT0wtS2V5OiBwYWNrZXQgbm90IGZyb20gYXNzb2NpYXRlZCBBUFxuIiApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlpZiAoICEgKCBudG9ocyAoIHBrdC0+aW5mbyApICYgRUFQT0xfS0VZX0lORk9fS0VZX0FDSyApICkgeworCQlEQkcgKCAiRUFQT0wtS2V5OiBwYWNrZXQgc2VudCBpbiB3cm9uZyBkaXJlY3Rpb25cbiIgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRyb3A7CisJfQorCisJZm91bmRfY3R4ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggY3R4LCAmd3BhX2NvbnRleHRzLCBsaXN0ICkgeworCQlpZiAoIGN0eC0+ZGV2ID09IGRldiApIHsKKwkJCWZvdW5kX2N0eCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggISBmb3VuZF9jdHggKSB7CisJCURCRyAoICJFQVBPTC1LZXk6IG5vIFdQQSBjb250ZXh0IHRvIGhhbmRsZSBwYWNrZXQgZm9yICVwXG4iLAorCQkgICAgICBkZXYgKTsKKwkJcmMgPSAtRU5PRU5UOworCQlnb3RvIGRyb3A7CisJfQorCisJaWYgKCAoIHZvaWQgKiApICggcGt0ICsgMSApICsgbnRvaHMgKCBwa3QtPmRhdGFsZW4gKSA+IGlvYi0+dGFpbCApIHsKKwkJREJHQyAoIGN0eCwgIldQQSAlcDogcGFja2V0IHRydW5jYXRlZCAoaGFzICVkIGV4dHJhIGJ5dGVzLCAiCisJCSAgICAgICAic3RhdGVzICVkKVxuIiwgY3R4LCBpb2ItPnRhaWwgLSAoIHZvaWQgKiApICggcGt0ICsgMSApLAorCQkgICAgICAgbnRvaHMgKCBwa3QtPmRhdGFsZW4gKSApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBHZXQgYSBoYW5kbGUgb24ga2V5IGludGVncml0eS9lbmNyeXB0aW9uIGhhbmRsZXIgKi8KKwlraWUgPSB3cGFfZmluZF9raWUgKCBudG9ocyAoIHBrdC0+aW5mbyApICYgRUFQT0xfS0VZX0lORk9fVkVSU0lPTiApOworCWlmICggISBraWUgKSB7CisJCURCR0MgKCBjdHgsICJXUEEgJXA6IG5vIHN1cHBvcnQgZm9yIHBhY2tldCB2ZXJzaW9uICVkXG4iLCBjdHgsCisJCSAgICAgICBudG9ocyAoIHBrdC0+aW5mbyApICYgRUFQT0xfS0VZX0lORk9fVkVSU0lPTiApOworCQlyYyA9IHdwYV9mYWlsICggY3R4LCAtRU5PVFNVUCApOworCQlnb3RvIGRyb3A7CisJfQorCisJLyogQ2hlY2sgTUlDICovCisJaWYgKCBudG9ocyAoIHBrdC0+aW5mbyApICYgRUFQT0xfS0VZX0lORk9fS0VZX01JQyApIHsKKwkJbWVtY3B5ICggdGhlaXJfbWljLCBwa3QtPm1pYywgc2l6ZW9mICggcGt0LT5taWMgKSApOworCQltZW1zZXQgKCBwa3QtPm1pYywgMCwgc2l6ZW9mICggcGt0LT5taWMgKSApOworCQlraWUtPm1pYyAoICZjdHgtPnB0ay5rY2ssICggdm9pZCAqICkgcGt0IC0gRUFQT0xfSERSX0xFTiwKKwkJCSAgIEVBUE9MX0hEUl9MRU4gKyBzaXplb2YgKCAqcGt0ICkgKworCQkJICAgbnRvaHMgKCBwa3QtPmRhdGFsZW4gKSwgb3VyX21pYyApOworCQlEQkdDMiAoIGN0eCwgIldQQSAlcCBNSUMgY29tcGFyaXNvbiAodGhlaXJzLCBvdXJzKTpcbiIsIGN0eCApOworCQlEQkdDMl9IRCAoIGN0eCwgdGhlaXJfbWljLCAxNiApOworCQlEQkdDMl9IRCAoIGN0eCwgb3VyX21pYywgMTYgKTsKKwkJaWYgKCBtZW1jbXAgKCB0aGVpcl9taWMsIG91cl9taWMsIHNpemVvZiAoIHBrdC0+bWljICkgKSAhPSAwICkgeworCQkJREJHQyAoIGN0eCwgIldQQSAlcDogRUFQT0wgTUlDIGZhaWx1cmVcbiIsIGN0eCApOworCQkJZ290byBkcm9wOworCQl9CisJfQorCisJLyogRml4IGJ5dGUgb3JkZXIgdG8gbG9jYWwgKi8KKwlwa3QtPmluZm8gPSBudG9ocyAoIHBrdC0+aW5mbyApOworCXBrdC0+a2V5c2l6ZSA9IG50b2hzICggcGt0LT5rZXlzaXplICk7CisJcGt0LT5kYXRhbGVuID0gbnRvaHMgKCBwa3QtPmRhdGFsZW4gKTsKKwlwa3QtPnJlcGxheSA9IGJlNjRfdG9fY3B1ICggcGt0LT5yZXBsYXkgKTsKKworCS8qIENoZWNrIHJlcGxheSBjb3VudGVyICovCisJaWYgKCBjdHgtPnJlcGxheSAhPSB+MFVMTCAmJiBjdHgtPnJlcGxheSA+PSBwa3QtPnJlcGxheSApIHsKKwkJREJHQyAoIGN0eCwgIldQQSAlcCBBTEVSVDogUmVwbGF5IGRldGVjdGVkISAiCisJCSAgICAgICAiKCUwOHg6JTA4eCA+PSAlMDh4OiUwOHgpXG4iLCBjdHgsCisJCSAgICAgICAoIHUzMiApICggY3R4LT5yZXBsYXkgPj4gMzIgKSwgKCB1MzIgKSBjdHgtPnJlcGxheSwKKwkJICAgICAgICggdTMyICkgKCBwa3QtPnJlcGxheSA+PiAzMiApLCAoIHUzMiApIHBrdC0+cmVwbGF5ICk7CisJCXJjID0gMDsJCS8qIGlnbm9yZSB3aXRob3V0IGVycm9yICovCisJCWdvdG8gZHJvcDsKKwl9CisJY3R4LT5yZXBsYXkgPSBwa3QtPnJlcGxheTsKKworCS8qIERlY3J5cHQga2V5IGRhdGEgKi8KKwlpZiAoIHBrdC0+aW5mbyAmIEVBUE9MX0tFWV9JTkZPX0tFWV9FTkMgKSB7CisJCXJjID0ga2llLT5kZWNyeXB0ICggJmN0eC0+cHRrLmtlaywgcGt0LT5pdiwgcGt0LT5kYXRhLAorCQkJCSAgICAmcGt0LT5kYXRhbGVuICk7CisJCWlmICggcmMgPCAwICkgeworCQkJREJHQyAoIGN0eCwgIldQQSAlcDogZmFpbGVkIHRvIGRlY3J5cHQgcGFja2V0OiAlc1xuIiwKKwkJCSAgICAgICBjdHgsIHN0cmVycm9yICggcmMgKSApOworCQkJZ290byBkcm9wOworCQl9CisJfQorCisJLyogSGFuZCBpdCBvZmYgdG8gYXBwcm9wcmlhdGUgaGFuZGxlciAqLworCXN3aXRjaCAoIHBrdC0+aW5mbyAmICggRUFQT0xfS0VZX0lORk9fVFlQRSB8CisJCQkgICAgICAgRUFQT0xfS0VZX0lORk9fS0VZX01JQyApICkgeworCWNhc2UgRUFQT0xfS0VZX1RZUEVfUFRLOgorCQlyYyA9IHdwYV9oYW5kbGVfMV9vZl80ICggY3R4LCBwa3QsIGlzX3Jzbiwga2llICk7CisJCWJyZWFrOworCisJY2FzZSBFQVBPTF9LRVlfVFlQRV9QVEsgfCBFQVBPTF9LRVlfSU5GT19LRVlfTUlDOgorCQlyYyA9IHdwYV9oYW5kbGVfM19vZl80ICggY3R4LCBwa3QsIGlzX3Jzbiwga2llICk7CisJCWJyZWFrOworCisJY2FzZSBFQVBPTF9LRVlfVFlQRV9HVEsgfCBFQVBPTF9LRVlfSU5GT19LRVlfTUlDOgorCQlyYyA9IHdwYV9oYW5kbGVfMV9vZl8yICggY3R4LCBwa3QsIGlzX3Jzbiwga2llICk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREJHQyAoIGN0eCwgIldQQSAlcDogSW52YWxpZCBjb21iaW5hdGlvbiBvZiBrZXkgZmxhZ3MgJTA0eFxuIiwKKwkJICAgICAgIGN0eCwgcGt0LT5pbmZvICk7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisgZHJvcDoKKwlmcmVlX2lvYiAoIGlvYiApOworCXJldHVybiByYzsKK30KKworc3RydWN0IGVhcG9sX2hhbmRsZXIgZWFwb2xfa2V5X2hhbmRsZXIgX19lYXBvbF9oYW5kbGVyID0geworCS50eXBlID0gRUFQT0xfVFlQRV9LRVksCisJLnJ4ID0gZWFwb2xfa2V5X3J4LAorfTsKKworLyogV1BBIGFsd2F5cyBuZWVkcyBFQVBPTCBpbiBvcmRlciB0byBiZSB1c2VmdWwgKi8KK1JFUVVJUkVfT0JKRUNUICggZWFwb2wgKTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC84MDIxMS93cGFfY2NtcC5jIGIvZ3B4ZS9zcmMvbmV0LzgwMjExL3dwYV9jY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiMWUxNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC84MDIxMS93cGFfY2NtcC5jCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL25ldDgwMjExLmg+CisjaW5jbHVkZSA8Z3B4ZS9jcnlwdG8uaD4KKyNpbmNsdWRlIDxncHhlL2htYWMuaD4KKyNpbmNsdWRlIDxncHhlL3NoYTEuaD4KKyNpbmNsdWRlIDxncHhlL2Flcy5oPgorI2luY2x1ZGUgPGdweGUvd3BhLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKiogQGZpbGUKKyAqCisgKiBCYWNrZW5kIGZvciBXUEEgdXNpbmcgdGhlIENDTVAgZW5jcnlwdGlvbiBtZXRob2QKKyAqLworCisvKiogQ29udGV4dCBmb3IgQ0NNUCBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uICovCitzdHJ1Y3QgY2NtcF9jdHgKK3sKKwkvKiogQUVTIGNvbnRleHQgLSBvbmx5IGV2ZXIgdXNlZCBmb3IgZW5jcnlwdGlvbiAqLworCXU4IGFlc19jdHhbQUVTX0NUWF9TSVpFXTsKKworCS8qKiBNb3N0IHJlY2VudGx5IHNlbnQgcGFja2V0IG51bWJlciAqLworCXU2NCB0eF9zZXE7CisKKwkvKiogTW9zdCByZWNlbnRseSByZWNlaXZlZCBwYWNrZXQgbnVtYmVyICovCisJdTY0IHJ4X3NlcTsKK307CisKKy8qKiBIZWFkZXIgc3RydWN0dXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgQ0NNUCBmcmFtZSBkYXRhICovCitzdHJ1Y3QgY2NtcF9oZWFkCit7CisJdTggcG5fbG9bMl07CQkvKio8IEJ5dGVzIDAgYW5kIDEgb2YgcGFja2V0IG51bWJlciAqLworCXU4IF9yc3ZkOwkJLyoqPCBSZXNlcnZlZCBieXRlICovCisJdTgga2lkOwkJCS8qKjwgS2V5IElEIGFuZCBFeHRJViBieXRlICovCisJdTggcG5faGlbNF07CQkvKio8IEJ5dGVzIDItNSAoMiBmaXJzdCkgb2YgcGFja2V0IG51bWJlciAqLworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworCisvKiogQ0NNUCBoZWFkZXIgb3ZlcmhlYWQgKi8KKyNkZWZpbmUgQ0NNUF9IRUFEX0xFTgk4CisKKy8qKiBDQ01QIE1JQyB0cmFpbGVyIG92ZXJoZWFkICovCisjZGVmaW5lIENDTVBfTUlDX0xFTgk4CisKKy8qKiBDQ01QIG5vbmNlIGxlbmd0aCAqLworI2RlZmluZSBDQ01QX05PTkNFX0xFTgkxMworCisvKiogQ0NNUCBub25jZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBjY21wX25vbmNlCit7CisJdTggcHJpbzsJCS8qKjwgUGFja2V0IHByaW9yaXR5LCAwIGZvciBub24tUW9TICovCisJdTggYTJbRVRIX0FMRU5dOwkvKio8IEFkZHJlc3MgMiBmcm9tIHBhY2tldCBoZWFkZXIgKHNlbmRlcikgKi8KKwl1OCBwbls2XTsJCS8qKjwgUGFja2V0IG51bWJlciAqLworfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKTsKKworLyoqIENDTVAgYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBkYXRhIGxlbmd0aCAoZm9yIG5vbi1Rb1MsIG5vbi1XRFMgZnJhbWVzKSAqLworI2RlZmluZSBDQ01QX0FBRF9MRU4JMjIKKworLyoqIENDTVAgYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGNjbXBfYWFkCit7CisJdTE2IGZjOwkJCS8qKjwgRnJhbWUgQ29udHJvbCBmaWVsZCAqLworCXU4IGExWzZdOwkJLyoqPCBBZGRyZXNzIDEgKi8KKwl1OCBhMls2XTsJCS8qKjwgQWRkcmVzcyAyICovCisJdTggYTNbNl07CQkvKio8IEFkZHJlc3MgMyAqLworCXUxNiBzZXE7CQkvKio8IFNlcXVlbmNlIENvbnRyb2wgZmllbGQgKi8KKwkvKiBBZGRyZXNzIDQgYW5kIFFvUyBDb250cm9sIGFyZSBpbmNsdWRlZCBpZiBwcmVzZW50ICovCit9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpOworCisvKiogTWFzayBmb3IgRnJhbWUgQ29udHJvbCBmaWVsZCBpbiBBQUQgKi8KKyNkZWZpbmUgQ0NNUF9BQURfRkNfTUFTSwkweEMzOEYKKworLyoqIE1hc2sgZm9yIFNlcXVlbmNlIENvbnRyb2wgZmllbGQgaW4gQUFEICovCisjZGVmaW5lIENDTVBfQUFEX1NFUV9NQVNLCTB4MDAwRgorCisKKy8qKgorICogQ29udmVydCA2LWJ5dGUgTFNCIHBhY2tldCBudW1iZXIgdG8gNjQtYml0IGludGVnZXIKKyAqCisgKiBAdiBwbglQb2ludGVyIHRvIDYtYnl0ZSBwYWNrZXQgbnVtYmVyCisgKiBAcmV0IHYJNjQtYml0IGludGVnZXIgdmFsdWUgb2YgQGEgcG4KKyAqLworc3RhdGljIHU2NCBwbl90b191NjQgKCBjb25zdCB1OCAqcG4gKQoreworCWludCBpOworCXU2NCByZXQgPSAwOworCisJZm9yICggaSA9IDU7IGkgPj0gMDsgaS0tICkgeworCQlyZXQgPDw9IDg7CisJCXJldCB8PSBwbltpXTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIENvbnZlcnQgNjQtYml0IGludGVnZXIgdG8gNi1ieXRlIHBhY2tldCBudW1iZXIKKyAqCisgKiBAdiB2CQk2NC1iaXQgaW50ZWdlcgorICogQHYgbXNiCUlmIFRSVUUsIHJldmVyc2UgdGhlIG91dHB1dCBQTiB0byBiZSBpbiBNU0Igb3JkZXIKKyAqIEByZXQgcG4JNi1ieXRlIHBhY2tldCBudW1iZXIKKyAqCisgKiBUaGUgUE4gaXMgc3RvcmVkIGluIExTQiBvcmRlciBpbiB0aGUgcGFja2V0IGhlYWRlciBhbmQgaW4gTVNCIG9yZGVyCisgKiBpbiB0aGUgbm9uY2UuIFdIWVlZWVk/CisgKi8KK3N0YXRpYyB2b2lkIHU2NF90b19wbiAoIHU2NCB2LCB1OCAqcG4sIGludCBtc2IgKQoreworCWludCBpOworCXU4ICpwbnAgPSBwbiArICggbXNiID8gNSA6IDAgKTsKKwlpbnQgZGVsdGEgPSAoIG1zYiA/IC0xIDogKzEgKTsKKworCWZvciAoIGkgPSAwOyBpIDwgNjsgaSsrICkgeworCQkqcG5wID0gdiAmIDB4RkY7CisJCXBucCArPSBkZWx0YTsKKwkJdiA+Pj0gODsKKwl9Cit9CisKKy8qKiBWYWx1ZSBmb3IgQGEgbXNiIGFyZ3VtZW50IG9mIHU2NF90b19wbigpIGZvciBNU0Igb3V0cHV0ICovCisjZGVmaW5lIFBOX01TQgkxCisKKy8qKiBWYWx1ZSBmb3IgQGEgbXNiIGFyZ3VtZW50IG9mIHU2NF90b19wbigpIGZvciBMU0Igb3V0cHV0ICovCisjZGVmaW5lIFBOX0xTQgkwCisKKworCisvKioKKyAqIEluaXRpYWxpc2UgQ0NNUCBzdGF0ZSBhbmQgaW5zdGFsbCBrZXkKKyAqCisgKiBAdiBjcnlwdG8JQ0NNUCBjcnlwdG9zeXN0ZW0gc3RydWN0dXJlCisgKiBAdiBrZXkJUG9pbnRlciB0byAxNi1ieXRlIHRlbXBvcmFsIGtleSB0byBpbnN0YWxsCisgKiBAdiBrZXlsZW4JTGVuZ3RoIG9mIGtleSAoMTYgYnl0ZXMpCisgKiBAdiByc2MJSW5pdGlhbCByZWNlaXZlIHNlcXVlbmNlIGNvdW50ZXIKKyAqLworc3RhdGljIGludCBjY21wX2luaXQgKCBzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvICpjcnlwdG8sIGNvbnN0IHZvaWQgKmtleSwKKwkJICAgICAgIGludCBrZXlsZW4sIGNvbnN0IHZvaWQgKnJzYyApCit7CisJc3RydWN0IGNjbXBfY3R4ICpjdHggPSBjcnlwdG8tPnByaXY7CisKKwlpZiAoIGtleWxlbiAhPSAxNiApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCByc2MgKQorCQljdHgtPnJ4X3NlcSA9IHBuX3RvX3U2NCAoIHJzYyApOworCisJY2lwaGVyX3NldGtleSAoICZhZXNfYWxnb3JpdGhtLCBjdHgtPmFlc19jdHgsIGtleSwga2V5bGVuICk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIEVuY3J5cHQgb3IgZGVjcnlwdCBkYXRhIHN0cmVhbSB1c2luZyBBRVMgaW4gQ291bnRlciBtb2RlCisgKgorICogQHYgY3R4CUNDTVAgY3J5cHRvc3lzdGVtIGNvbnRleHQKKyAqIEB2IG5vbmNlCU5vbmNlIHZhbHVlLCAxMyBieXRlcworICogQHYgc3JjdglEYXRhIHRvIGVuY3J5cHQgb3IgZGVjcnlwdAorICogQHYgbGVuCU51bWJlciBvZiBieXRlcyBwb2ludGVkIHRvIGJ5IEBhIHNyYworICogQHYgbXNyY3YJTUlDIHZhbHVlIHRvIGVuY3J5cHQgb3IgZGVjcnlwdCAobWF5IGJlIE5VTEwpCisgKiBAcmV0IGRlc3R2CUVuY3J5cHRlZCBvciBkZWNyeXB0ZWQgZGF0YQorICogQHJldCBtZGVzdHYJRW5jcnlwdGVkIG9yIGRlY3J5cHRlZCBNSUMgdmFsdWUKKyAqCisgKiBUaGlzIGFzc3VtZXMgQ0NNUCBwYXJhbWV0ZXJzIG9mIEw9MiBhbmQgTT04LiBUaGUgYWxnb3JpdGhtIGlzCisgKiBkZWZpbmVkIGluIFJGQyAzNjEwLgorICovCitzdGF0aWMgdm9pZCBjY21wX2N0cl94b3IgKCBzdHJ1Y3QgY2NtcF9jdHggKmN0eCwgY29uc3Qgdm9pZCAqbm9uY2UsCisJCQkgICBjb25zdCB2b2lkICpzcmN2LCB2b2lkICpkZXN0diwgaW50IGxlbiwKKwkJCSAgIGNvbnN0IHZvaWQgKm1zcmN2LCB2b2lkICptZGVzdHYgKQoreworCXU4IEFbMTZdLCBTWzE2XTsKKwl1MTYgY3RyOworCWludCBpOworCWNvbnN0IHU4ICpzcmMgPSBzcmN2LCAqbXNyYyA9IG1zcmN2OworCXU4ICpkZXN0ID0gZGVzdHYsICptZGVzdCA9IG1kZXN0djsKKworCUFbMF0gPSAweDAxOwkJLyogZmxhZ3MsIEwnID0gTCAtIDEgPSAxLCBvdGhlciBiaXRzIHJzdmQgKi8KKwltZW1jcHkgKCBBICsgMSwgbm9uY2UsIENDTVBfTk9OQ0VfTEVOICk7CisKKwlpZiAoIG1zcmN2ICkgeworCQlBWzE0XSA9IEFbMTVdID0gMDsKKworCQljaXBoZXJfZW5jcnlwdCAoICZhZXNfYWxnb3JpdGhtLCBjdHgtPmFlc19jdHgsIEEsIFMsIDE2ICk7CisKKwkJZm9yICggaSA9IDA7IGkgPCA4OyBpKysgKSB7CisJCQkqbWRlc3QrKyA9ICptc3JjKysgXiBTW2ldOworCQl9CisJfQorCisJZm9yICggY3RyID0gMSA7OyBjdHIrKyApIHsKKwkJQVsxNF0gPSBjdHIgPj4gODsKKwkJQVsxNV0gPSBjdHIgJiAweEZGOworCisJCWNpcGhlcl9lbmNyeXB0ICggJmFlc19hbGdvcml0aG0sIGN0eC0+YWVzX2N0eCwgQSwgUywgMTYgKTsKKworCQlmb3IgKCBpID0gMDsgaSA8IGxlbiAmJiBpIDwgMTY7IGkrKyApCisJCQkqZGVzdCsrID0gKnNyYysrIF4gU1tpXTsKKworCQlpZiAoIGxlbiA8PSAxNiApCisJCQlicmVhazsJLyogd2UncmUgZG9uZSAqLworCisJCWxlbiAtPSAxNjsKKwl9Cit9CisKKworLyoqCisgKiBBZHZhbmNlIG9uZSBibG9jayBpbiBDQkMtTUFDIGNhbGN1bGF0aW9uCisgKgorICogQHYgYWVzX2N0eAlBRVMgZW5jcnlwdGlvbiBjb250ZXh0IHdpdGgga2V5IHNldAorICogQHYgQgkJQ2xlYXJ0ZXh0IGJsb2NrIHRvIGluY29ycG9yYXRlICgxNiBieXRlcykKKyAqIEB2IFgJCVByZXZpb3VzIGNpcGhlcnRleHQgYmxvY2sgKDE2IGJ5dGVzKQorICogQHJldCBCCUNsb2JiZXJlZAorICogQHJldCBYCU5ldyBjaXBoZXJ0ZXh0IGJsb2NrICgxNiBieXRlcykKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgWCA6PSBFW2tleV0gKCBYIF4gQiApLgorICovCitzdGF0aWMgdm9pZCBjY21wX2ZlZWRfY2JjX21hYyAoIHZvaWQgKmFlc19jdHgsIHU4ICpCLCB1OCAqWCApCit7CisJaW50IGk7CisJZm9yICggaSA9IDA7IGkgPCAxNjsgaSsrICkKKwkJQltpXSBePSBYW2ldOworCWNpcGhlcl9lbmNyeXB0ICggJmFlc19hbGdvcml0aG0sIGFlc19jdHgsIEIsIFgsIDE2ICk7Cit9CisKKworLyoqCisgKiBDYWxjdWxhdGUgTUlDIG9uIHBsYWludGV4dCBkYXRhIHVzaW5nIENCQy1NQUMKKyAqCisgKiBAdiBjdHgJQ0NNUCBjcnlwdG9zeXN0ZW0gY29udGV4dAorICogQHYgbm9uY2UJTm9uY2UgdmFsdWUsIDEzIGJ5dGVzCisgKiBAdiBkYXRhCURhdGEgdG8gY2FsY3VsYXRlIE1JQyBvdmVyCisgKiBAdiBkYXRhbGVuCUxlbmd0aCBvZiBAYSBkYXRhCisgKiBAdiBhYWQJQWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBkYXRhLCBmb3IgTUlDIGJ1dCBub3QgZW5jcnlwdGlvbgorICogQHJldCBtaWMJTUlDIHZhbHVlICh1bmVuY3J5cHRlZCksIDggYnl0ZXMKKyAqCisgKiBAYSBhYWRsZW4gaXMgYXNzdW1lZCB0byBiZSAyMiBieXRlcyBsb25nLCBhcyBpdCBhbHdheXMgaXMgZm9yCisgKiA4MDIuMTEgdXNlIHdoZW4gdHJhbnNtaXR0aW5nIG5vbi1Rb1MsIG5vdC1iZXR3ZWVuLUFQcyBmcmFtZXMgKHRoZQorICogb25seSB0eXBlIHdlIGRlYWwgd2l0aCkuCisgKi8KK3N0YXRpYyB2b2lkIGNjbXBfY2JjX21hYyAoIHN0cnVjdCBjY21wX2N0eCAqY3R4LCBjb25zdCB2b2lkICpub25jZSwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHUxNiBkYXRhbGVuLAorCQkJICAgY29uc3Qgdm9pZCAqYWFkLCB2b2lkICptaWMgKQoreworCXU4IFhbMTZdLCBCWzE2XTsKKworCS8qIFplcm90aCBibG9jazogZmxhZ3MsIG5vbmNlLCBsZW5ndGggKi8KKworCS8qIFJzdiBBQUQgLSBNJy0gIC0gTCctCisJICogIDAgICAxICAwIDEgMSAgMCAwIDEgICBmb3IgYW4gOC1ieXRlIE1BQyBhbmQgMi1ieXRlIG1lc3NhZ2UgbGVuZ3RoCisJICovCisJQlswXSA9IDB4NTk7CisJbWVtY3B5ICggQiArIDEsIG5vbmNlLCBDQ01QX05PTkNFX0xFTiApOworCUJbMTRdID0gZGF0YWxlbiA+PiA4OworCUJbMTVdID0gZGF0YWxlbiAmIDB4RkY7CisKKwljaXBoZXJfZW5jcnlwdCAoICZhZXNfYWxnb3JpdGhtLCBjdHgtPmFlc19jdHgsIEIsIFgsIDE2ICk7CisKKwkvKiBGaXJzdCBibG9jazogQUFEIGxlbmd0aCBmaWVsZCBhbmQgMTQgYnl0ZXMgb2YgQUFEICovCisJQlswXSA9IDA7CisJQlsxXSA9IENDTVBfQUFEX0xFTjsKKwltZW1jcHkgKCBCICsgMiwgYWFkLCAxNCApOworCisJY2NtcF9mZWVkX2NiY19tYWMgKCBjdHgtPmFlc19jdHgsIEIsIFggKTsKKworCS8qIFNlY29uZCBibG9jazogUmVtYWluaW5nIDggYnl0ZXMgb2YgQUFELCA4IGJ5dGVzIHplcm8gcGFkICovCisJbWVtY3B5ICggQiwgYWFkICsgMTQsIDggKTsKKwltZW1zZXQgKCBCICsgOCwgMCwgOCApOworCisJY2NtcF9mZWVkX2NiY19tYWMgKCBjdHgtPmFlc19jdHgsIEIsIFggKTsKKworCS8qIE1lc3NhZ2UgYmxvY2tzICovCisJd2hpbGUgKCBkYXRhbGVuICkgeworCQlpZiAoIGRhdGFsZW4gPj0gMTYgKSB7CisJCQltZW1jcHkgKCBCLCBkYXRhLCAxNiApOworCQkJZGF0YWxlbiAtPSAxNjsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSAoIEIsIGRhdGEsIGRhdGFsZW4gKTsKKwkJCW1lbXNldCAoIEIgKyBkYXRhbGVuLCAwLCAxNiAtIGRhdGFsZW4gKTsKKwkJCWRhdGFsZW4gPSAwOworCQl9CisKKwkJY2NtcF9mZWVkX2NiY19tYWMgKCBjdHgtPmFlc19jdHgsIEIsIFggKTsKKworCQlkYXRhICs9IDE2OworCX0KKworCS8qIEdldCBNSUMgZnJvbSBmaW5hbCB2YWx1ZSBvZiBYICovCisJbWVtY3B5ICggbWljLCBYLCA4ICk7Cit9CisKKworLyoqCisgKiBFbmNhcHN1bGF0ZSBhbmQgZW5jcnlwdCBhIHBhY2tldCB1c2luZyBDQ01QCisgKgorICogQHYgY3J5cHRvCUNDTVAgY3J5cHRvc3lzdGVtCisgKiBAdiBpb2IJSS9PIGJ1ZmZlciBjb250YWluaW5nIGNsZWFydGV4dCBwYWNrZXQKKyAqIEByZXQgZWlvYglJL08gYnVmZmVyIGNvbnRhaW5pbmcgZW5jcnlwdGVkIHBhY2tldAorICovCitzdHJ1Y3QgaW9fYnVmZmVyICogY2NtcF9lbmNyeXB0ICggc3RydWN0IG5ldDgwMjExX2NyeXB0byAqY3J5cHRvLAorCQkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9iICkKK3sKKwlzdHJ1Y3QgY2NtcF9jdHggKmN0eCA9IGNyeXB0by0+cHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICpoZHIgPSBpb2ItPmRhdGE7CisJc3RydWN0IGlvX2J1ZmZlciAqZWlvYjsKKwljb25zdCBpbnQgaGRybGVuID0gSUVFRTgwMjExX1RZUF9GUkFNRV9IRUFERVJfTEVOOworCWludCBkYXRhbGVuID0gaW9iX2xlbiAoIGlvYiApIC0gaGRybGVuOworCXN0cnVjdCBjY21wX2hlYWQgaGVhZDsKKwlzdHJ1Y3QgY2NtcF9ub25jZSBub25jZTsKKwlzdHJ1Y3QgY2NtcF9hYWQgYWFkOworCXU4IG1pY1s4XSwgdHhfcG5bNl07CisJdm9pZCAqZWRhdGEsICplbWljOworCisJY3R4LT50eF9zZXErKzsKKwl1NjRfdG9fcG4gKCBjdHgtPnR4X3NlcSwgdHhfcG4sIFBOX0xTQiApOworCisJLyogQWxsb2NhdGUgbWVtb3J5ICovCisJZWlvYiA9IGFsbG9jX2lvYiAoIGlvYl9sZW4gKCBpb2IgKSArIENDTVBfSEVBRF9MRU4gKyBDQ01QX01JQ19MRU4gKTsKKwlpZiAoICEgZWlvYiApCisJCXJldHVybiBOVUxMOworCisJLyogQ29weSBmcmFtZSBoZWFkZXIgKi8KKwltZW1jcHkgKCBpb2JfcHV0ICggZWlvYiwgaGRybGVuICksIGlvYi0+ZGF0YSwgaGRybGVuICk7CisJaGRyID0gZWlvYi0+ZGF0YTsKKwloZHItPmZjIHw9IElFRUU4MDIxMV9GQ19QUk9URUNURUQ7CisKKwkvKiBGaWxsIGluIHBhY2tldCBudW1iZXIgYW5kIGV4dGVuZGVkIElWICovCisJbWVtY3B5ICggaGVhZC5wbl9sbywgdHhfcG4sIDIgKTsKKwltZW1jcHkgKCBoZWFkLnBuX2hpLCB0eF9wbiArIDIsIDQgKTsKKwloZWFkLmtpZCA9IDB4MjA7CS8qIGhhdmUgRXh0ZW5kZWQgSVYsIGtleSBJRCAwICovCisJaGVhZC5fcnN2ZCA9IDA7CisJbWVtY3B5ICggaW9iX3B1dCAoIGVpb2IsIHNpemVvZiAoIGhlYWQgKSApLCAmaGVhZCwgc2l6ZW9mICggaGVhZCApICk7CisKKwkvKiBGb3JtIG5vbmNlICovCisJbm9uY2UucHJpbyA9IDA7CisJbWVtY3B5ICggbm9uY2UuYTIsIGhkci0+YWRkcjIsIEVUSF9BTEVOICk7CisJdTY0X3RvX3BuICggY3R4LT50eF9zZXEsIG5vbmNlLnBuLCBQTl9NU0IgKTsKKworCS8qIEZvcm0gYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBkYXRhICovCisJYWFkLmZjID0gaGRyLT5mYyAmIENDTVBfQUFEX0ZDX01BU0s7CisJbWVtY3B5ICggYWFkLmExLCBoZHItPmFkZHIxLCAzICogRVRIX0FMRU4gKTsgLyogYWxsIDMgYXQgb25jZSAqLworCWFhZC5zZXEgPSBoZHItPnNlcSAmIENDTVBfQUFEX1NFUV9NQVNLOworCisJLyogQ2FsY3VsYXRlIE1JQyBvdmVyIHRoZSBkYXRhICovCisJY2NtcF9jYmNfbWFjICggY3R4LCAmbm9uY2UsIGlvYi0+ZGF0YSArIGhkcmxlbiwgZGF0YWxlbiwgJmFhZCwgbWljICk7CisKKwkvKiBDb3B5IGFuZCBlbmNyeXB0IGRhdGEgYW5kIE1JQyAqLworCWVkYXRhID0gaW9iX3B1dCAoIGVpb2IsIGRhdGFsZW4gKTsKKwllbWljID0gaW9iX3B1dCAoIGVpb2IsIENDTVBfTUlDX0xFTiApOworCWNjbXBfY3RyX3hvciAoIGN0eCwgJm5vbmNlLAorCQkgICAgICAgaW9iLT5kYXRhICsgaGRybGVuLCBlZGF0YSwgZGF0YWxlbiwKKwkJICAgICAgIG1pYywgZW1pYyApOworCisJLyogRG9uZSEgKi8KKwlEQkdDMiAoIGN0eCwgIldQQS1DQ01QICVwOiBlbmNyeXB0ZWQgcGFja2V0ICVwIC0+ICVwXG4iLCBjdHgsCisJCWlvYiwgZWlvYiApOworCisJcmV0dXJuIGVpb2I7Cit9CisKKy8qKgorICogRGVjcnlwdCBhIHBhY2tldCB1c2luZyBDQ01QCisgKgorICogQHYgY3J5cHRvCUNDTVAgY3J5cHRvc3lzdGVtCisgKiBAdiBlaW9iCUkvTyBidWZmZXIgY29udGFpbmluZyBlbmNyeXB0ZWQgcGFja2V0CisgKiBAcmV0IGlvYglJL08gYnVmZmVyIGNvbnRhaW5pbmcgY2xlYXJ0ZXh0IHBhY2tldAorICovCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqIGNjbXBfZGVjcnlwdCAoIHN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8gKmNyeXB0bywKKwkJCQkJIHN0cnVjdCBpb19idWZmZXIgKmVpb2IgKQoreworCXN0cnVjdCBjY21wX2N0eCAqY3R4ID0gY3J5cHRvLT5wcml2OworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKmhkcjsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2I7CisJY29uc3QgaW50IGhkcmxlbiA9IElFRUU4MDIxMV9UWVBfRlJBTUVfSEVBREVSX0xFTjsKKwlpbnQgZGF0YWxlbiA9IGlvYl9sZW4gKCBlaW9iICkgLSBoZHJsZW4gLSBDQ01QX0hFQURfTEVOIC0gQ0NNUF9NSUNfTEVOOworCXN0cnVjdCBjY21wX2hlYWQgKmhlYWQ7CisJc3RydWN0IGNjbXBfbm9uY2Ugbm9uY2U7CisJc3RydWN0IGNjbXBfYWFkIGFhZDsKKwl1OCByeF9wbls2XSwgdGhlaXJfbWljWzhdLCBvdXJfbWljWzhdOworCisJaW9iID0gYWxsb2NfaW9iICggaGRybGVuICsgZGF0YWxlbiApOworCWlmICggISBpb2IgKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIENvcHkgZnJhbWUgaGVhZGVyICovCisJbWVtY3B5ICggaW9iX3B1dCAoIGlvYiwgaGRybGVuICksIGVpb2ItPmRhdGEsIGhkcmxlbiApOworCWhkciA9IGlvYi0+ZGF0YTsKKwloZHItPmZjICY9IH5JRUVFODAyMTFfRkNfUFJPVEVDVEVEOworCisJLyogQ2hlY2sgYW5kIHVwZGF0ZSBSWCBwYWNrZXQgbnVtYmVyICovCisJaGVhZCA9IGVpb2ItPmRhdGEgKyBoZHJsZW47CisJbWVtY3B5ICggcnhfcG4sIGhlYWQtPnBuX2xvLCAyICk7CisJbWVtY3B5ICggcnhfcG4gKyAyLCBoZWFkLT5wbl9oaSwgNCApOworCisJaWYgKCBwbl90b191NjQgKCByeF9wbiApIDw9IGN0eC0+cnhfc2VxICkgeworCQlEQkdDICggY3R4LCAiV1BBLUNDTVAgJXA6IHBhY2tldCByZWNlaXZlZCBvdXQgb2Ygb3JkZXIgIgorCQkgICAgICAgIiglMDEybGx4IDw9ICUwMTJsbHgpXG4iLCBjdHgsIHBuX3RvX3U2NCAoIHJ4X3BuICksCisJCSAgICAgICBjdHgtPnJ4X3NlcSApOworCQlmcmVlX2lvYiAoIGlvYiApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljdHgtPnJ4X3NlcSA9IHBuX3RvX3U2NCAoIHJ4X3BuICk7CisJREJHQzIgKCBjdHgsICJXUEEtQ0NNUCAlcDogUlggcGFja2V0IG51bWJlciAlMDEybGx4XG4iLCBjdHgsIGN0eC0+cnhfc2VxICk7CisKKwkvKiBGb3JtIG5vbmNlICovCisJbm9uY2UucHJpbyA9IDA7CisJbWVtY3B5ICggbm9uY2UuYTIsIGhkci0+YWRkcjIsIEVUSF9BTEVOICk7CisJdTY0X3RvX3BuICggY3R4LT5yeF9zZXEsIG5vbmNlLnBuLCBQTl9NU0IgKTsKKworCS8qIEZvcm0gYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBkYXRhICovCisJYWFkLmZjID0gKCBoZHItPmZjICYgQ0NNUF9BQURfRkNfTUFTSyApIHwgSUVFRTgwMjExX0ZDX1BST1RFQ1RFRDsKKwltZW1jcHkgKCBhYWQuYTEsIGhkci0+YWRkcjEsIDMgKiBFVEhfQUxFTiApOyAvKiBhbGwgMyBhdCBvbmNlICovCisJYWFkLnNlcSA9IGhkci0+c2VxICYgQ0NNUF9BQURfU0VRX01BU0s7CisKKwkvKiBDb3B5LWRlY3J5cHQgZGF0YSBhbmQgTUlDICovCisJY2NtcF9jdHJfeG9yICggY3R4LCAmbm9uY2UsIGVpb2ItPmRhdGEgKyBoZHJsZW4gKyBzaXplb2YgKCAqaGVhZCApLAorCQkgICAgICAgaW9iX3B1dCAoIGlvYiwgZGF0YWxlbiApLCBkYXRhbGVuLAorCQkgICAgICAgZWlvYi0+dGFpbCAtIENDTVBfTUlDX0xFTiwgdGhlaXJfbWljICk7CisKKwkvKiBDaGVjayBNSUMgKi8KKwljY21wX2NiY19tYWMgKCBjdHgsICZub25jZSwgaW9iLT5kYXRhICsgaGRybGVuLCBkYXRhbGVuLCAmYWFkLAorCQkgICAgICAgb3VyX21pYyApOworCisJaWYgKCBtZW1jbXAgKCB0aGVpcl9taWMsIG91cl9taWMsIENDTVBfTUlDX0xFTiApICE9IDAgKSB7CisJCURCR0MyICggY3R4LCAiV1BBLUNDTVAgJXA6IE1JQyBmYWlsdXJlXG4iLCBjdHggKTsKKwkJZnJlZV9pb2IgKCBpb2IgKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJREJHQzIgKCBjdHgsICJXUEEtQ0NNUCAlcDogZGVjcnlwdGVkIHBhY2tldCAlcCAtPiAlcFxuIiwgY3R4LAorCQllaW9iLCBpb2IgKTsKKworCXJldHVybiBpb2I7Cit9CisKKworLyoqIENDTVAgY3J5cHRvc3lzdGVtICovCitzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvIGNjbXBfY3J5cHRvIF9fbmV0ODAyMTFfY3J5cHRvID0geworCS5hbGdvcml0aG0gPSBORVQ4MDIxMV9DUllQVF9DQ01QLAorCS5pbml0ID0gY2NtcF9pbml0LAorCS5lbmNyeXB0ID0gY2NtcF9lbmNyeXB0LAorCS5kZWNyeXB0ID0gY2NtcF9kZWNyeXB0LAorCS5wcml2X2xlbiA9IHNpemVvZiAoIHN0cnVjdCBjY21wX2N0eCApLAorfTsKKworCisKKworLyoqCisgKiBDYWxjdWxhdGUgSE1BQy1TSEExIE1JQyBmb3IgRUFQT0wtS2V5IGZyYW1lCisgKgorICogQHYga2NrCUtleSBDb25maXJtYXRpb24gS2V5LCAxNiBieXRlcworICogQHYgbXNnCU1lc3NhZ2UgdG8gY2FsY3VsYXRlIE1JQyBvdmVyCisgKiBAdiBsZW4JTnVtYmVyIG9mIGJ5dGVzIHRvIGNhbGN1bGF0ZSBNSUMgb3ZlcgorICogQHJldCBtaWMJQ2FsY3VsYXRlZCBNSUMsIDE2IGJ5dGVzIGxvbmcKKyAqLworc3RhdGljIHZvaWQgY2NtcF9raWVfbWljICggY29uc3Qgdm9pZCAqa2NrLCBjb25zdCB2b2lkICptc2csIHNpemVfdCBsZW4sCisJCQkgICB2b2lkICptaWMgKQoreworCXU4IHNoYTFfY3R4W1NIQTFfQ1RYX1NJWkVdOworCXU4IGtja2JbMTZdOworCXU4IGhhc2hbU0hBMV9TSVpFXTsKKwlzaXplX3Qga2NrX2xlbiA9IDE2OworCisJbWVtY3B5ICgga2NrYiwga2NrLCBrY2tfbGVuICk7CisKKwlobWFjX2luaXQgKCAmc2hhMV9hbGdvcml0aG0sIHNoYTFfY3R4LCBrY2tiLCAma2NrX2xlbiApOworCWhtYWNfdXBkYXRlICggJnNoYTFfYWxnb3JpdGhtLCBzaGExX2N0eCwgbXNnLCBsZW4gKTsKKwlobWFjX2ZpbmFsICggJnNoYTFfYWxnb3JpdGhtLCBzaGExX2N0eCwga2NrYiwgJmtja19sZW4sIGhhc2ggKTsKKworCW1lbWNweSAoIG1pYywgaGFzaCwgMTYgKTsKK30KKworLyoqCisgKiBEZWNyeXB0IGtleSBkYXRhIGluIEVBUE9MLUtleSBmcmFtZQorICoKKyAqIEB2IGtlawlLZXkgRW5jcnlwdGlvbiBLZXksIDE2IGJ5dGVzCisgKiBAdiBpdglJbml0aWFsaXNhdGlvbiB2ZWN0b3IsIDE2IGJ5dGVzICh1bnVzZWQpCisgKiBAdiBtc2cJTWVzc2FnZSB0byBkZWNyeXB0CisgKiBAdiBsZW4JTGVuZ3RoIG9mIG1lc3NhZ2UKKyAqIEByZXQgbXNnCURlY3J5cHRlZCBtZXNzYWdlIGluIHBsYWNlIG9mIG9yaWdpbmFsCisgKiBAcmV0IGxlbglBZGp1c3RlZCBkb3dud2FyZCBmb3IgOCBieXRlcyBvZiBvdmVyaGVhZAorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGUgcmV0dXJuZWQgbWVzc2FnZSBtYXkgc3RpbGwgY29udGFpbiBwYWRkaW5nIG9mIDB4REQgZm9sbG93ZWQgYnkKKyAqIHplcm8gb3IgbW9yZSAweDAwIG9jdGV0cy4gSXQgaXMgaW1wb3NzaWJsZSB0byByZW1vdmUgdGhlIHBhZGRpbmcKKyAqIHdpdGhvdXQgcGFyc2luZyB0aGUgSUVzIGluIHRoZSBwYWNrZXQgKGFub3RoZXIgZGVzaWduIGRlY2lzaW9uIHRoYXQKKyAqIHRlbmRzIHRvIG1ha2Ugb25lIHF1ZXN0aW9uIHRoZSA4MDIuMTFpIGNvbW1pdHRlZSdzIGludGVsbGlnZW5jZS4uLikKKyAqLworc3RhdGljIGludCBjY21wX2tpZV9kZWNyeXB0ICggY29uc3Qgdm9pZCAqa2VrLCBjb25zdCB2b2lkICppdiBfX3VudXNlZCwKKwkJCSAgICAgIHZvaWQgKm1zZywgdTE2ICpsZW4gKQoreworCWlmICggKmxlbiAlIDggIT0gMCApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCBhZXNfdW53cmFwICgga2VrLCBtc2csIG1zZywgKmxlbiAvIDggLSAxICkgIT0gMCApCisJCXJldHVybiAtRUlOVkFMOworCisJKmxlbiAtPSA4OworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBDQ01QLXN0eWxlIGtleSBpbnRlZ3JpdHkgYW5kIGVuY3J5cHRpb24gaGFuZGxlciAqLworc3RydWN0IHdwYV9raWUgY2NtcF9raWUgX193cGFfa2llID0geworCS52ZXJzaW9uID0gRUFQT0xfS0VZX1ZFUlNJT05fV1BBMiwKKwkubWljID0gY2NtcF9raWVfbWljLAorCS5kZWNyeXB0ID0gY2NtcF9raWVfZGVjcnlwdCwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvODAyMTEvd3BhX3Bzay5jIGIvZ3B4ZS9zcmMvbmV0LzgwMjExL3dwYV9wc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzUyMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0LzgwMjExL3dwYV9wc2suYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBKb3NodWEgT3JlbWFuIDxvcmVtYW5qQHJ3Y3IubmV0Pi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8Z3B4ZS9uZXQ4MDIxMS5oPgorI2luY2x1ZGUgPGdweGUvc2hhMS5oPgorI2luY2x1ZGUgPGdweGUvd3BhLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyoqIEBmaWxlCisgKgorICogRnJvbnRlbmQgZm9yIFdQQSB1c2luZyBhIHByZS1zaGFyZWQga2V5LgorICovCisKKy8qKgorICogSW5pdGlhbGlzZSBXUEEtUFNLIHN0YXRlCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd3BhX3Bza19pbml0ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICkKK3sKKwlyZXR1cm4gd3BhX21ha2VfcnNuX2llICggZGV2LCAmZGV2LT5yc25faWUgKTsKK30KKworLyoqCisgKiBTdGFydCBXUEEtUFNLIGF1dGhlbnRpY2F0aW9uCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd3BhX3Bza19zdGFydCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApCit7CisJY2hhciBwYXNzcGhyYXNlWzY0KzFdOworCXU4IHBta1tXUEFfUE1LX0xFTl07CisJaW50IGxlbjsKKwlzdHJ1Y3Qgd3BhX2NvbW1vbl9jdHggKmN0eCA9IGRldi0+aGFuZHNoYWtlci0+cHJpdjsKKworCWxlbiA9IGZldGNoX3N0cmluZ19zZXR0aW5nICggbmV0ZGV2X3NldHRpbmdzICggZGV2LT5uZXRkZXYgKSwKKwkJCQkgICAgICZuZXQ4MDIxMV9rZXlfc2V0dGluZywgcGFzc3BocmFzZSwKKwkJCQkgICAgIDY0ICsgMSApOworCisJaWYgKCBsZW4gPD0gMCApIHsKKwkJREJHQyAoIGN0eCwgIldQQS1QU0sgJXA6IG5vIHBhc3NwaHJhc2UgcHJvdmlkZWQhXG4iLCBjdHggKTsKKwkJbmV0ODAyMTFfZGVhdXRoZW50aWNhdGUgKCBkZXYsIC1FQUNDRVMgKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJcGJrZGYyX3NoYTEgKCBwYXNzcGhyYXNlLCBsZW4sIGRldi0+ZXNzaWQsIHN0cmxlbiAoIGRldi0+ZXNzaWQgKSwKKwkJICAgICAgNDA5NiwgcG1rLCBXUEFfUE1LX0xFTiApOworCisJREJHQyAoIGN0eCwgIldQQS1QU0sgJXA6IGRlcml2ZWQgUE1LIGZyb20gcGFzc3BocmFzZSBgJXMnOlxuIiwgY3R4LAorCSAgICAgICBwYXNzcGhyYXNlICk7CisJREJHQ19IRCAoIGN0eCwgcG1rLCBXUEFfUE1LX0xFTiApOworCisJcmV0dXJuIHdwYV9zdGFydCAoIGRldiwgY3R4LCBwbWssIFdQQV9QTUtfTEVOICk7Cit9CisKKy8qKgorICogU3RlcCBXUEEtUFNLIGF1dGhlbnRpY2F0aW9uCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd3BhX3Bza19zdGVwICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3Qgd3BhX2NvbW1vbl9jdHggKmN0eCA9IGRldi0+aGFuZHNoYWtlci0+cHJpdjsKKworCXN3aXRjaCAoIGN0eC0+c3RhdGUgKSB7CisJY2FzZSBXUEFfU1VDQ0VTUzoKKwkJcmV0dXJuIDE7CisJY2FzZSBXUEFfRkFJTFVSRToKKwkJcmV0dXJuIC1FQUNDRVM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKioKKyAqIERvLW5vdGhpbmcgZnVuY3Rpb247IHlvdSBjYW4ndCBjaGFuZ2UgYSBXUEEga2V5IHBvc3QtYXV0aGVudGljYXRpb24KKyAqCisgKiBAdiBkZXYJODAyLjExIGRldmljZQorICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB3cGFfcHNrX25vX2NoYW5nZV9rZXkgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgX191bnVzZWQgKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIERpc2FibGUgaGFuZGxpbmcgb2YgcmVjZWl2ZWQgV1BBIGF1dGhlbnRpY2F0aW9uIGZyYW1lcworICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHdwYV9wc2tfc3RvcCAoIHN0cnVjdCBuZXQ4MDIxMV9kZXZpY2UgKmRldiApCit7CisJd3BhX3N0b3AgKCBkZXYgKTsKK30KKworLyoqIFdQQS1QU0sgc2VjdXJpdHkgaGFuZHNoYWtlciAqLworc3RydWN0IG5ldDgwMjExX2hhbmRzaGFrZXIgd3BhX3Bza19oYW5kc2hha2VyIF9fbmV0ODAyMTFfaGFuZHNoYWtlciA9IHsKKwkucHJvdG9jb2wgPSBORVQ4MDIxMV9TRUNQUk9UX1BTSywKKwkuaW5pdCA9IHdwYV9wc2tfaW5pdCwKKwkuc3RhcnQgPSB3cGFfcHNrX3N0YXJ0LAorCS5zdGVwID0gd3BhX3Bza19zdGVwLAorCS5jaGFuZ2Vfa2V5ID0gd3BhX3Bza19ub19jaGFuZ2Vfa2V5LAorCS5zdG9wID0gd3BhX3Bza19zdG9wLAorCS5wcml2X2xlbiA9IHNpemVvZiAoIHN0cnVjdCB3cGFfY29tbW9uX2N0eCApLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC84MDIxMS93cGFfdGtpcC5jIGIvZ3B4ZS9zcmMvbmV0LzgwMjExL3dwYV90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiNjk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC84MDIxMS93cGFfdGtpcC5jCkBAIC0wLDAgKzEsNTg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxncHhlL25ldDgwMjExLmg+CisjaW5jbHVkZSA8Z3B4ZS9jcnlwdG8uaD4KKyNpbmNsdWRlIDxncHhlL2htYWMuaD4KKyNpbmNsdWRlIDxncHhlL3NoYTEuaD4KKyNpbmNsdWRlIDxncHhlL21kNS5oPgorI2luY2x1ZGUgPGdweGUvY3JjMzIuaD4KKyNpbmNsdWRlIDxncHhlL2FyYzQuaD4KKyNpbmNsdWRlIDxncHhlL3dwYS5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyoqIEBmaWxlCisgKgorICogQmFja2VuZCBmb3IgV1BBIHVzaW5nIHRoZSBUS0lQIGVuY3J5cHRpb24gc3RhbmRhcmQuCisgKi8KKworLyoqIENvbnRleHQgZm9yIG9uZSBkaXJlY3Rpb24gb2YgVEtJUCwgZWl0aGVyIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiAqLworc3RydWN0IHRraXBfZGlyX2N0eAoreworCS8qKiBIaWdoIDMyIGJpdHMgb2YgbGFzdCBzZXF1ZW5jZSBjb3VudGVyIHZhbHVlIHVzZWQgKi8KKwl1MzIgdHNjX2hpOworCisJLyoqIExvdyAzMiBiaXRzIG9mIGxhc3Qgc2VxdWVuY2UgY291bnRlciB2YWx1ZSB1c2VkICovCisJdTE2IHRzY19sbzsKKworCS8qKiBNQUMgYWRkcmVzcyB1c2VkIHRvIGRlcml2ZSBUVEFLICovCisJdTggbWFjW0VUSF9BTEVOXTsKKworCS8qKiBJZiBUUlVFLCBUVEFLIGlzIHZhbGlkICovCisJdTE2IHR0YWtfb2s7CisKKwkvKiogVEtJUC1taXhlZCB0cmFuc21pdCBhZGRyZXNzIGFuZCBrZXksIGRlcGVuZHMgb24gdHNjX2hpIGFuZCBNQUMgKi8KKwl1MTYgdHRha1s1XTsKK307CisKKy8qKiBDb250ZXh0IGZvciBUS0lQIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gKi8KK3N0cnVjdCB0a2lwX2N0eAoreworCS8qKiBUZW1wb3JhbCBrZXkgdG8gdXNlICovCisJc3RydWN0IHRraXBfdGsgdGs7CisKKwkvKiogU3RhdGUgZm9yIGVuY3J5cHRpb24gKi8KKwlzdHJ1Y3QgdGtpcF9kaXJfY3R4IGVuYzsKKworCS8qKiBTdGF0ZSBmb3IgZGVjcnlwdGlvbiAqLworCXN0cnVjdCB0a2lwX2Rpcl9jdHggZGVjOworfTsKKworLyoqIEhlYWRlciBzdHJ1Y3R1cmUgYXQgdGhlIGJlZ2lubmluZyBvZiBUS0lQIGZyYW1lIGRhdGEgKi8KK3N0cnVjdCB0a2lwX2hlYWQKK3sKKwl1OCB0c2MxOwkJLyoqPCBIaWdoIGJ5dGUgb2YgbG93IDE2IGJpdHMgb2YgVFNDICovCisJdTggc2VlZDE7CQkvKio8IFNlY29uZCBieXRlIG9mIFdFUCBzZWVkICovCisJdTggdHNjMDsJCS8qKjwgTG93IGJ5dGUgb2YgVFNDICovCisJdTgga2lkOwkJCS8qKjwgS2V5IElEIGFuZCBFeHRJViBieXRlICovCisJdTMyIHRzY19oaTsJCS8qKjwgSGlnaCAzMiBiaXRzIG9mIFRTQywgYXMgYW4gRXh0SVYgKi8KK30gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSk7CisKKworLyoqIFRLSVAgaGVhZGVyIG92ZXJoZWFkIChJViArIEtJRCArIEV4dElWKSAqLworI2RlZmluZSBUS0lQX0hFQURfTEVOCTgKKworLyoqIFRLSVAgdHJhaWxlciBvdmVyaGVhZCAoTUlDICsgSUNWKSBbYXNzdW1lcyB1bmZyYWdtZW50ZWRdICovCisjZGVmaW5lIFRLSVBfRk9PVF9MRU4JMTIKKworLyoqIFRLSVAgTUlDIGxlbmd0aCAqLworI2RlZmluZSBUS0lQX01JQ19MRU4JOAorCisvKiogVEtJUCBJQ1YgbGVuZ3RoICovCisjZGVmaW5lIFRLSVBfSUNWX0xFTgk0CisKKworLyoqIFRLSVAgUy1ib3ggKi8KK3N0YXRpYyBjb25zdCB1MTYgU2JveFsyNTZdID0geworCTB4QzZBNSwgMHhGODg0LCAweEVFOTksIDB4RjY4RCwgMHhGRjBELCAweEQ2QkQsIDB4REVCMSwgMHg5MTU0LAorCTB4NjA1MCwgMHgwMjAzLCAweENFQTksIDB4NTY3RCwgMHhFNzE5LCAweEI1NjIsIDB4NERFNiwgMHhFQzlBLAorCTB4OEY0NSwgMHgxRjlELCAweDg5NDAsIDB4RkE4NywgMHhFRjE1LCAweEIyRUIsIDB4OEVDOSwgMHhGQjBCLAorCTB4NDFFQywgMHhCMzY3LCAweDVGRkQsIDB4NDVFQSwgMHgyM0JGLCAweDUzRjcsIDB4RTQ5NiwgMHg5QjVCLAorCTB4NzVDMiwgMHhFMTFDLCAweDNEQUUsIDB4NEM2QSwgMHg2QzVBLCAweDdFNDEsIDB4RjUwMiwgMHg4MzRGLAorCTB4Njg1QywgMHg1MUY0LCAweEQxMzQsIDB4RjkwOCwgMHhFMjkzLCAweEFCNzMsIDB4NjI1MywgMHgyQTNGLAorCTB4MDgwQywgMHg5NTUyLCAweDQ2NjUsIDB4OUQ1RSwgMHgzMDI4LCAweDM3QTEsIDB4MEEwRiwgMHgyRkI1LAorCTB4MEUwOSwgMHgyNDM2LCAweDFCOUIsIDB4REYzRCwgMHhDRDI2LCAweDRFNjksIDB4N0ZDRCwgMHhFQTlGLAorCTB4MTIxQiwgMHgxRDlFLCAweDU4NzQsIDB4MzQyRSwgMHgzNjJELCAweERDQjIsIDB4QjRFRSwgMHg1QkZCLAorCTB4QTRGNiwgMHg3NjRELCAweEI3NjEsIDB4N0RDRSwgMHg1MjdCLCAweEREM0UsIDB4NUU3MSwgMHgxMzk3LAorCTB4QTZGNSwgMHhCOTY4LCAweDAwMDAsIDB4QzEyQywgMHg0MDYwLCAweEUzMUYsIDB4NzlDOCwgMHhCNkVELAorCTB4RDRCRSwgMHg4RDQ2LCAweDY3RDksIDB4NzI0QiwgMHg5NERFLCAweDk4RDQsIDB4QjBFOCwgMHg4NTRBLAorCTB4QkI2QiwgMHhDNTJBLCAweDRGRTUsIDB4RUQxNiwgMHg4NkM1LCAweDlBRDcsIDB4NjY1NSwgMHgxMTk0LAorCTB4OEFDRiwgMHhFOTEwLCAweDA0MDYsIDB4RkU4MSwgMHhBMEYwLCAweDc4NDQsIDB4MjVCQSwgMHg0QkUzLAorCTB4QTJGMywgMHg1REZFLCAweDgwQzAsIDB4MDU4QSwgMHgzRkFELCAweDIxQkMsIDB4NzA0OCwgMHhGMTA0LAorCTB4NjNERiwgMHg3N0MxLCAweEFGNzUsIDB4NDI2MywgMHgyMDMwLCAweEU1MUEsIDB4RkQwRSwgMHhCRjZELAorCTB4ODE0QywgMHgxODE0LCAweDI2MzUsIDB4QzMyRiwgMHhCRUUxLCAweDM1QTIsIDB4ODhDQywgMHgyRTM5LAorCTB4OTM1NywgMHg1NUYyLCAweEZDODIsIDB4N0E0NywgMHhDOEFDLCAweEJBRTcsIDB4MzIyQiwgMHhFNjk1LAorCTB4QzBBMCwgMHgxOTk4LCAweDlFRDEsIDB4QTM3RiwgMHg0NDY2LCAweDU0N0UsIDB4M0JBQiwgMHgwQjgzLAorCTB4OENDQSwgMHhDNzI5LCAweDZCRDMsIDB4MjgzQywgMHhBNzc5LCAweEJDRTIsIDB4MTYxRCwgMHhBRDc2LAorCTB4REIzQiwgMHg2NDU2LCAweDc0NEUsIDB4MTQxRSwgMHg5MkRCLCAweDBDMEEsIDB4NDg2QywgMHhCOEU0LAorCTB4OUY1RCwgMHhCRDZFLCAweDQzRUYsIDB4QzRBNiwgMHgzOUE4LCAweDMxQTQsIDB4RDMzNywgMHhGMjhCLAorCTB4RDUzMiwgMHg4QjQzLCAweDZFNTksIDB4REFCNywgMHgwMThDLCAweEIxNjQsIDB4OUNEMiwgMHg0OUUwLAorCTB4RDhCNCwgMHhBQ0ZBLCAweEYzMDcsIDB4Q0YyNSwgMHhDQUFGLCAweEY0OEUsIDB4NDdFOSwgMHgxMDE4LAorCTB4NkZENSwgMHhGMDg4LCAweDRBNkYsIDB4NUM3MiwgMHgzODI0LCAweDU3RjEsIDB4NzNDNywgMHg5NzUxLAorCTB4Q0IyMywgMHhBMTdDLCAweEU4OUMsIDB4M0UyMSwgMHg5NkRELCAweDYxREMsIDB4MEQ4NiwgMHgwRjg1LAorCTB4RTA5MCwgMHg3QzQyLCAweDcxQzQsIDB4Q0NBQSwgMHg5MEQ4LCAweDA2MDUsIDB4RjcwMSwgMHgxQzEyLAorCTB4QzJBMywgMHg2QTVGLCAweEFFRjksIDB4NjlEMCwgMHgxNzkxLCAweDk5NTgsIDB4M0EyNywgMHgyN0I5LAorCTB4RDkzOCwgMHhFQjEzLCAweDJCQjMsIDB4MjIzMywgMHhEMkJCLCAweEE5NzAsIDB4MDc4OSwgMHgzM0E3LAorCTB4MkRCNiwgMHgzQzIyLCAweDE1OTIsIDB4QzkyMCwgMHg4NzQ5LCAweEFBRkYsIDB4NTA3OCwgMHhBNTdBLAorCTB4MDM4RiwgMHg1OUY4LCAweDA5ODAsIDB4MUExNywgMHg2NURBLCAweEQ3MzEsIDB4ODRDNiwgMHhEMEI4LAorCTB4ODJDMywgMHgyOUIwLCAweDVBNzcsIDB4MUUxMSwgMHg3QkNCLCAweEE4RkMsIDB4NkRENiwgMHgyQzNBLAorfTsKKworLyoqCisgKiBQZXJmb3JtIFMtYm94IG1hcHBpbmcgb24gYSAxNi1iaXQgdmFsdWUKKyAqCisgKiBAdiB2CQlWYWx1ZSB0byBwZXJmb3JtIFMtYm94IG1hcHBpbmcgb24KKyAqIEByZXQgU3YJUy1ib3ggbWFwcGVkIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdTE2IFMgKCB1MTYgdiApCit7CisJcmV0dXJuIFNib3hbdiAmIDB4RkZdIF4gc3dhcDE2ICggU2JveFt2ID4+IDhdICk7Cit9CisKKy8qKgorICogUm90YXRlIDE2LWJpdCB2YWx1ZSByaWdodAorICoKKyAqIEB2IHYJCVZhbHVlIHRvIHJvdGF0ZQorICogQHYgYml0cwlOdW1iZXIgb2YgYml0cyB0byByb3RhdGUgYnkKKyAqIEByZXQgcm90dglSb3RhdGVkIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdTE2IHJvcjE2ICggdTE2IHYsIGludCBiaXRzICkKK3sKKwlyZXR1cm4gKCB2ID4+IGJpdHMgKSB8ICggdiA8PCAoIDE2IC0gYml0cyApICk7Cit9CisKKy8qKgorICogUm90YXRlIDMyLWJpdCB2YWx1ZSByaWdodAorICoKKyAqIEB2IHYJCVZhbHVlIHRvIHJvdGF0ZQorICogQHYgYml0cwlOdW1iZXIgb2YgYml0cyB0byByb3RhdGUgYnkKKyAqIEByZXQgcm90dglSb3RhdGVkIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJvcjMyICggdTMyIHYsIGludCBiaXRzICkKK3sKKwlyZXR1cm4gKCB2ID4+IGJpdHMgKSB8ICggdiA8PCAoIDMyIC0gYml0cyApICk7Cit9CisKKy8qKgorICogUm90YXRlIDMyLWJpdCB2YWx1ZSBsZWZ0CisgKgorICogQHYgdgkJVmFsdWUgdG8gcm90YXRlCisgKiBAdiBiaXRzCU51bWJlciBvZiBiaXRzIHRvIHJvdGF0ZSBieQorICogQHJldCByb3R2CVJvdGF0ZWQgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSB1MzIgcm9sMzIgKCB1MzIgdiwgaW50IGJpdHMgKQoreworCXJldHVybiAoIHYgPDwgYml0cyApIHwgKCB2ID4+ICggMzIgLSBiaXRzICkgKTsKK30KKworCisvKioKKyAqIEluaXRpYWxpc2UgVEtJUCBzdGF0ZSBhbmQgaW5zdGFsbCBrZXkKKyAqCisgKiBAdiBjcnlwdG8JVEtJUCBjcnlwdG9zeXN0ZW0gc3RydWN0dXJlCisgKiBAdiBrZXkJUG9pbnRlciB0byB0a2lwX3RrIHRvIGluc3RhbGwKKyAqIEB2IGtleWxlbglMZW5ndGggb2Yga2V5ICgzMiBieXRlcykKKyAqIEB2IHJzYwlJbml0aWFsIHJlY2VpdmUgc2VxdWVuY2UgY291bnRlcgorICovCitzdGF0aWMgaW50IHRraXBfaW5pdCAoIHN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8gKmNyeXB0bywgY29uc3Qgdm9pZCAqa2V5LAorCQkgICAgICAgaW50IGtleWxlbiwgY29uc3Qgdm9pZCAqcnNjICkKK3sKKwlzdHJ1Y3QgdGtpcF9jdHggKmN0eCA9IGNyeXB0by0+cHJpdjsKKwljb25zdCB1OCAqcnNjYiA9IHJzYzsKKworCWlmICgga2V5bGVuICE9IHNpemVvZiAoIGN0eC0+dGsgKSApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCByc2NiICkgeworCQljdHgtPmRlYy50c2NfbG8gPSAgICggcnNjYlsxXSA8PCAgOCApIHwgICByc2NiWzBdOworCQljdHgtPmRlYy50c2NfaGkgPSAoICggcnNjYls1XSA8PCAyNCApIHwgKCByc2NiWzRdIDw8IDE2ICkgfAorCQkJCSAgICAoIHJzY2JbM10gPDwgIDggKSB8ICAgcnNjYlsyXSApOworCX0KKworCW1lbWNweSAoICZjdHgtPnRrLCBrZXksIHNpemVvZiAoIGN0eC0+dGsgKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGVyZm9ybSBUS0lQIGtleSBtaXhpbmcsIHBoYXNlIDEKKyAqCisgKiBAdiBkY3R4CVRLSVAgZGlyZWN0aW9uYWwgY29udGV4dAorICogQHYgdGsJVEtJUCB0ZW1wb3JhbCBrZXkKKyAqIEB2IG1hYwlNQUMgYWRkcmVzcyBvZiB0cmFuc21pdHRlcgorICoKKyAqIFRoaXMgcmVjb21wdXRlcyB0aGUgVFRBSyBpbiBAYSBkY3R4IGlmIG5lY2Vzc2FyeSwgYW5kIHNldHMKKyAqIEBjIGRjdHgtPnR0YWtfb2suCisgKi8KK3N0YXRpYyB2b2lkIHRraXBfbWl4XzEgKCBzdHJ1Y3QgdGtpcF9kaXJfY3R4ICpkY3R4LCBzdHJ1Y3QgdGtpcF90ayAqdGssIHU4ICptYWMgKQoreworCWludCBpLCBqOworCisJaWYgKCBkY3R4LT50dGFrX29rICYmICEgbWVtY21wICggbWFjLCBkY3R4LT5tYWMsIEVUSF9BTEVOICkgKQorCQlyZXR1cm47CisKKwltZW1jcHkgKCBkY3R4LT5tYWMsIG1hYywgRVRIX0FMRU4gKTsKKworCWRjdHgtPnR0YWtbMF0gPSBkY3R4LT50c2NfaGkgJiAweEZGRkY7CisJZGN0eC0+dHRha1sxXSA9IGRjdHgtPnRzY19oaSA+PiAxNjsKKwlkY3R4LT50dGFrWzJdID0gKCBtYWNbMV0gPDwgOCApIHwgbWFjWzBdOworCWRjdHgtPnR0YWtbM10gPSAoIG1hY1szXSA8PCA4ICkgfCBtYWNbMl07CisJZGN0eC0+dHRha1s0XSA9ICggbWFjWzVdIDw8IDggKSB8IG1hY1s0XTsKKworCWZvciAoIGkgPSAwOyBpIDwgODsgaSsrICkgeworCQlqID0gMiAqICggaSAmIDEgKTsKKworCQlkY3R4LT50dGFrWzBdICs9IFMgKCBkY3R4LT50dGFrWzRdIF4gKCAoIHRrLT5rZXlbMSArIGpdIDw8IDggKSB8CisJCQkJCQkgICAgICAgICB0ay0+a2V5WzAgKyBqXSApICk7CisJCWRjdHgtPnR0YWtbMV0gKz0gUyAoIGRjdHgtPnR0YWtbMF0gXiAoICggdGstPmtleVs1ICsgal0gPDwgOCApIHwKKwkJCQkJCSAgICAgICAgIHRrLT5rZXlbNCArIGpdICkgKTsKKwkJZGN0eC0+dHRha1syXSArPSBTICggZGN0eC0+dHRha1sxXSBeICggKCB0ay0+a2V5WzkgKyBqXSA8PCA4ICkgfAorCQkJCQkJICAgICAgICAgdGstPmtleVs4ICsgal0gKSApOworCQlkY3R4LT50dGFrWzNdICs9IFMgKCBkY3R4LT50dGFrWzJdIF4gKCAoIHRrLT5rZXlbMTMrIGpdIDw8IDggKSB8CisJCQkJCQkgICAgICAgICB0ay0+a2V5WzEyKyBqXSApICk7CisJCWRjdHgtPnR0YWtbNF0gKz0gUyAoIGRjdHgtPnR0YWtbM10gXiAoICggdGstPmtleVsxICsgal0gPDwgOCApIHwKKwkJCQkJCSAgICAgICAgIHRrLT5rZXlbMCArIGpdICkgKSArIGk7CisJfQorCisJZGN0eC0+dHRha19vayA9IDE7Cit9CisKKy8qKgorICogUGVyZm9ybSBUS0lQIGtleSBtaXhpbmcsIHBoYXNlIDIKKyAqCisgKiBAdiBkY3R4CVRLSVAgZGlyZWN0aW9uYWwgY29udGV4dAorICogQHYgdGsJVEtJUCB0ZW1wb3JhbCBrZXkKKyAqIEByZXQga2V5CUFSQzQga2V5LCAxNiBieXRlcyBsb25nCisgKi8KK3N0YXRpYyB2b2lkIHRraXBfbWl4XzIgKCBzdHJ1Y3QgdGtpcF9kaXJfY3R4ICpkY3R4LCBzdHJ1Y3QgdGtpcF90ayAqdGssCisJCQkgdm9pZCAqa2V5ICkKK3sKKwl1OCAqa2IgPSBrZXk7CisJdTE2IHBwa1s2XTsKKwlpbnQgaTsKKworCW1lbWNweSAoIHBwaywgZGN0eC0+dHRhaywgc2l6ZW9mICggZGN0eC0+dHRhayApICk7CisJcHBrWzVdID0gZGN0eC0+dHRha1s0XSArIGRjdHgtPnRzY19sbzsKKworCXBwa1swXSArPSBTICggcHBrWzVdIF4gKCAoIHRrLT5rZXlbMV0gPDwgOCApIHwgdGstPmtleVswXSApICk7CisJcHBrWzFdICs9IFMgKCBwcGtbMF0gXiAoICggdGstPmtleVszXSA8PCA4ICkgfCB0ay0+a2V5WzJdICkgKTsKKwlwcGtbMl0gKz0gUyAoIHBwa1sxXSBeICggKCB0ay0+a2V5WzVdIDw8IDggKSB8IHRrLT5rZXlbNF0gKSApOworCXBwa1szXSArPSBTICggcHBrWzJdIF4gKCAoIHRrLT5rZXlbN10gPDwgOCApIHwgdGstPmtleVs2XSApICk7CisJcHBrWzRdICs9IFMgKCBwcGtbM10gXiAoICggdGstPmtleVs5XSA8PCA4ICkgfCB0ay0+a2V5WzhdICkgKTsKKwlwcGtbNV0gKz0gUyAoIHBwa1s0XSBeICggKCB0ay0+a2V5WzExXSA8PCA4ICkgfCB0ay0+a2V5WzEwXSApICk7CisKKwlwcGtbMF0gKz0gcm9yMTYgKCBwcGtbNV0gXiAoICggdGstPmtleVsxM10gPDwgOCApIHwgdGstPmtleVsxMl0gKSwgMSApOworCXBwa1sxXSArPSByb3IxNiAoIHBwa1swXSBeICggKCB0ay0+a2V5WzE1XSA8PCA4ICkgfCB0ay0+a2V5WzE0XSApLCAxICk7CisJcHBrWzJdICs9IHJvcjE2ICggcHBrWzFdLCAxICk7CisJcHBrWzNdICs9IHJvcjE2ICggcHBrWzJdLCAxICk7CisJcHBrWzRdICs9IHJvcjE2ICggcHBrWzNdLCAxICk7CisJcHBrWzVdICs9IHJvcjE2ICggcHBrWzRdLCAxICk7CisKKwlrYlswXSA9IGRjdHgtPnRzY19sbyA+PiA4OworCWtiWzFdID0gKCAoIGRjdHgtPnRzY19sbyA+PiA4ICkgfCAweDIwICkgJiAweDdGOworCWtiWzJdID0gZGN0eC0+dHNjX2xvICYgMHhGRjsKKwlrYlszXSA9ICggKCBwcGtbNV0gXiAoICggdGstPmtleVsxXSA8PCA4ICkgfCB0ay0+a2V5WzBdICkgKSA+PiAxICkKKwkJJiAweEZGOworCisJZm9yICggaSA9IDA7IGkgPCA2OyBpKysgKSB7CisJCWtiWzQgKyAyKmldID0gcHBrW2ldICYgMHhGRjsKKwkJa2JbNSArIDIqaV0gPSBwcGtbaV0gPj4gODsKKwl9Cit9CisKKy8qKgorICogVXBkYXRlIE1pY2hhZWwgbWVzc2FnZSBpbnRlZ3JpdHkgY29kZSBiYXNlZCBvbiBuZXh0IDMyLWJpdCB3b3JkIG9mIGRhdGEKKyAqCisgKiBAdiBWCQlNaWNoYWVsIGNvZGUgc3RhdGUgKHR3byAzMi1iaXQgd29yZHMpCisgKiBAdiB3b3JkCU5leHQgMzItYml0IHdvcmQgb2YgZGF0YQorICovCitzdGF0aWMgdm9pZCB0a2lwX2ZlZWRfbWljaGFlbCAoIHUzMiAqViwgdTMyIHdvcmQgKQoreworCVZbMF0gXj0gd29yZDsKKwlWWzFdIF49IHJvbDMyICggVlswXSwgMTcgKTsKKwlWWzBdICs9IFZbMV07CisJVlsxXSBePSAoICggVlswXSAmIDB4RkYwMEZGMDAgKSA+PiA4ICkgfCAoICggVlswXSAmIDB4MDBGRjAwRkYgKSA8PCA4ICk7CisJVlswXSArPSBWWzFdOworCVZbMV0gXj0gcm9sMzIgKCBWWzBdLCAzICk7CisJVlswXSArPSBWWzFdOworCVZbMV0gXj0gcm9yMzIgKCBWWzBdLCAyICk7CisJVlswXSArPSBWWzFdOworfQorCisvKioKKyAqIENhbGN1bGF0ZSBNaWNoYWVsIG1lc3NhZ2UgaW50ZWdyaXR5IGNvZGUKKyAqCisgKiBAdiBrZXkJTUlDIGtleSB0byB1c2UgKDggYnl0ZXMpCisgKiBAdiBkYQlEZXN0aW5hdGlvbiBsaW5rLWxheWVyIGFkZHJlc3MKKyAqIEB2IHNhCVNvdXJjZSBsaW5rLWxheWVyIGFkZHJlc3MKKyAqIEB2IGRhdGEJU3RhcnQgb2YgZGF0YSB0byBjYWxjdWxhdGUgb3ZlcgorICogQHYgbGVuCUxlbmd0aCBvZiBoZWFkZXIgKyBkYXRhCisgKiBAcmV0IG1pYwlDYWxjdWxhdGVkIE1pY2hhZWwgTUlDICg4IGJ5dGVzKQorICovCitzdGF0aWMgdm9pZCB0a2lwX21pY2hhZWwgKCBjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmRhLCBjb25zdCB2b2lkICpzYSwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sIHZvaWQgKm1pYyApCit7CisJdTMyIFZbMl07CQkvKiBWWzBdID0gImwiLCBWWzFdID0gInIiIGluIDgwMi4xMSAqLworCXVuaW9uIHsKKwkJdTggYnl0ZVsxMl07CisJCXUzMiB3b3JkWzNdOworCX0gY2FwOworCWNvbnN0IHU4ICpwdHIgPSBkYXRhOworCWNvbnN0IHU4ICplbmQgPSBwdHIgKyBsZW47CisJaW50IGk7CisKKwltZW1jcHkgKCBWLCBrZXksIHNpemVvZiAoIFYgKSApOworCVZbMF0gPSBsZTMyX3RvX2NwdSAoIFZbMF0gKTsKKwlWWzFdID0gbGUzMl90b19jcHUgKCBWWzFdICk7CisKKwkvKiBGZWVkIGluIGhlYWRlciAod2UgYXNzdW1lIG5vbi1Rb1MsIHNvIFByaW9yaXR5ID0gMCkgKi8KKwltZW1jcHkgKCAmY2FwLmJ5dGVbMF0sIGRhLCBFVEhfQUxFTiApOworCW1lbWNweSAoICZjYXAuYnl0ZVs2XSwgc2EsIEVUSF9BTEVOICk7CisJdGtpcF9mZWVkX21pY2hhZWwgKCBWLCBsZTMyX3RvX2NwdSAoIGNhcC53b3JkWzBdICkgKTsKKwl0a2lwX2ZlZWRfbWljaGFlbCAoIFYsIGxlMzJfdG9fY3B1ICggY2FwLndvcmRbMV0gKSApOworCXRraXBfZmVlZF9taWNoYWVsICggViwgbGUzMl90b19jcHUgKCBjYXAud29yZFsyXSApICk7CisJdGtpcF9mZWVkX21pY2hhZWwgKCBWLCAwICk7CisKKwkvKiBGZWVkIGluIGRhdGEgKi8KKwl3aGlsZSAoIHB0ciArIDQgPD0gZW5kICkgeworCQl0a2lwX2ZlZWRfbWljaGFlbCAoIFYsIGxlMzJfdG9fY3B1ICggKiggdTMyICogKSBwdHIgKSApOworCQlwdHIgKz0gNDsKKwl9CisKKwkvKiBBZGQgdW5hbGlnbmVkIHBhcnQgYW5kIHBhZGRpbmcgKi8KKwlmb3IgKCBpID0gMDsgcHRyIDwgZW5kOyBpKysgKQorCQljYXAuYnl0ZVtpXSA9ICpwdHIrKzsKKwljYXAuYnl0ZVtpKytdID0gMHg1YTsKKwlmb3IgKCA7IGkgPCA4OyBpKysgKQorCQljYXAuYnl0ZVtpXSA9IDA7CisKKwkvKiBGZWVkIGluIHBhZGRpbmcgKi8KKwl0a2lwX2ZlZWRfbWljaGFlbCAoIFYsIGxlMzJfdG9fY3B1ICggY2FwLndvcmRbMF0gKSApOworCXRraXBfZmVlZF9taWNoYWVsICggViwgbGUzMl90b19jcHUgKCBjYXAud29yZFsxXSApICk7CisKKwkvKiBPdXRwdXQgTUlDICovCisJVlswXSA9IGNwdV90b19sZTMyICggVlswXSApOworCVZbMV0gPSBjcHVfdG9fbGUzMiAoIFZbMV0gKTsKKwltZW1jcHkgKCBtaWMsIFYsIHNpemVvZiAoIFYgKSApOworfQorCisvKioKKyAqIEVuY3J5cHQgYSBwYWNrZXQgdXNpbmcgVEtJUAorICoKKyAqIEB2IGNyeXB0bwlUS0lQIGNyeXB0b3N5c3RlbQorICogQHYgaW9iCUkvTyBidWZmZXIgY29udGFpbmluZyBjbGVhcnRleHQgcGFja2V0CisgKiBAcmV0IGVpb2IJSS9PIGJ1ZmZlciBjb250YWluaW5nIGVuY3J5cHRlZCBwYWNrZXQKKyAqLworc3RhdGljIHN0cnVjdCBpb19idWZmZXIgKiB0a2lwX2VuY3J5cHQgKCBzdHJ1Y3QgbmV0ODAyMTFfY3J5cHRvICpjcnlwdG8sCisJCQkJCSBzdHJ1Y3QgaW9fYnVmZmVyICppb2IgKQoreworCXN0cnVjdCB0a2lwX2N0eCAqY3R4ID0gY3J5cHRvLT5wcml2OworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKmhkciA9IGlvYi0+ZGF0YTsKKwlzdHJ1Y3QgaW9fYnVmZmVyICplaW9iOworCXN0cnVjdCBhcmM0X2N0eCBhcmM0OworCXU4IGtleVsxNl07CisJc3RydWN0IHRraXBfaGVhZCBoZWFkOworCXU4IG1pY1s4XTsKKwl1MzIgaWN2OworCWNvbnN0IGludCBoZHJsZW4gPSBJRUVFODAyMTFfVFlQX0ZSQU1FX0hFQURFUl9MRU47CisJaW50IGRhdGFsZW4gPSBpb2JfbGVuICggaW9iICkgLSBoZHJsZW47CisKKwljdHgtPmVuYy50c2NfbG8rKzsKKwlpZiAoIGN0eC0+ZW5jLnRzY19sbyA9PSAwICkgeworCQljdHgtPmVuYy50c2NfaGkrKzsKKwkJY3R4LT5lbmMudHRha19vayA9IDA7CisJfQorCisJdGtpcF9taXhfMSAoICZjdHgtPmVuYywgJmN0eC0+dGssIGhkci0+YWRkcjIgKTsKKwl0a2lwX21peF8yICggJmN0eC0+ZW5jLCAmY3R4LT50aywga2V5ICk7CisKKwllaW9iID0gYWxsb2NfaW9iICggaW9iX2xlbiAoIGlvYiApICsgVEtJUF9IRUFEX0xFTiArIFRLSVBfRk9PVF9MRU4gKTsKKwlpZiAoICEgZWlvYiApCisJCXJldHVybiBOVUxMOworCisJLyogQ29weSBmcmFtZSBoZWFkZXIgKi8KKwltZW1jcHkgKCBpb2JfcHV0ICggZWlvYiwgaGRybGVuICksIGlvYi0+ZGF0YSwgaGRybGVuICk7CisJaGRyID0gZWlvYi0+ZGF0YTsKKwloZHItPmZjIHw9IElFRUU4MDIxMV9GQ19QUk9URUNURUQ7CisKKwkvKiBGaWxsIGluIElWIGFuZCBrZXkgSUQgYnl0ZSwgYW5kIGV4dGVuZGVkIElWICovCisJbWVtY3B5ICggJmhlYWQsIGtleSwgMyApOworCWhlYWQua2lkID0gMHgyMDsJCS8qIGhhdmUgRXh0ZW5kZWQgSVYsIGtleSBJRCAwICovCisJaGVhZC50c2NfaGkgPSBjcHVfdG9fbGUzMiAoIGN0eC0+ZW5jLnRzY19oaSApOworCW1lbWNweSAoIGlvYl9wdXQgKCBlaW9iLCBzaXplb2YgKCBoZWFkICkgKSwgJmhlYWQsIHNpemVvZiAoIGhlYWQgKSApOworCisJLyogQ29weSBhbmQgZW5jcnlwdCB0aGUgZGF0YSAqLworCWNpcGhlcl9zZXRrZXkgKCAmYXJjNF9hbGdvcml0aG0sICZhcmM0LCBrZXksIDE2ICk7CisJY2lwaGVyX2VuY3J5cHQgKCAmYXJjNF9hbGdvcml0aG0sICZhcmM0LCBpb2ItPmRhdGEgKyBoZHJsZW4sCisJCQkgaW9iX3B1dCAoIGVpb2IsIGRhdGFsZW4gKSwgZGF0YWxlbiApOworCisJLyogQWRkIE1JQyAqLworCWhkciA9IGlvYi0+ZGF0YTsKKwl0a2lwX21pY2hhZWwgKCAmY3R4LT50ay5taWMudHgsIGhkci0+YWRkcjMsIGhkci0+YWRkcjIsCisJCSAgICAgICBpb2ItPmRhdGEgKyBoZHJsZW4sIGRhdGFsZW4sIG1pYyApOworCWNpcGhlcl9lbmNyeXB0ICggJmFyYzRfYWxnb3JpdGhtLCAmYXJjNCwgbWljLAorCQkJIGlvYl9wdXQgKCBlaW9iLCBzaXplb2YgKCBtaWMgKSApLCBzaXplb2YgKCBtaWMgKSApOworCisJLyogQWRkIElDViAqLworCWljdiA9IGNyYzMyX2xlICggfjAsIGlvYi0+ZGF0YSArIGhkcmxlbiwgZGF0YWxlbiApOworCWljdiA9IGNyYzMyX2xlICggaWN2LCBtaWMsIHNpemVvZiAoIG1pYyApICk7CisJaWN2ID0gY3B1X3RvX2xlMzIgKCB+aWN2ICk7CisJY2lwaGVyX2VuY3J5cHQgKCAmYXJjNF9hbGdvcml0aG0sICZhcmM0LCAmaWN2LAorCQkJIGlvYl9wdXQgKCBlaW9iLCBUS0lQX0lDVl9MRU4gKSwgVEtJUF9JQ1ZfTEVOICk7CisKKwlEQkdDMiAoIGN0eCwgIldQQS1US0lQICVwOiBlbmNyeXB0ZWQgcGFja2V0ICVwIC0+ICVwXG4iLCBjdHgsCisJCWlvYiwgZWlvYiApOworCisJcmV0dXJuIGVpb2I7Cit9CisKKy8qKgorICogRGVjcnlwdCBhIHBhY2tldCB1c2luZyBUS0lQCisgKgorICogQHYgY3J5cHRvCVRLSVAgY3J5cHRvc3lzdGVtCisgKiBAdiBlaW9iCUkvTyBidWZmZXIgY29udGFpbmluZyBlbmNyeXB0ZWQgcGFja2V0CisgKiBAcmV0IGlvYglJL08gYnVmZmVyIGNvbnRhaW5pbmcgY2xlYXJ0ZXh0IHBhY2tldAorICovCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqIHRraXBfZGVjcnlwdCAoIHN0cnVjdCBuZXQ4MDIxMV9jcnlwdG8gKmNyeXB0bywKKwkJCQkJIHN0cnVjdCBpb19idWZmZXIgKmVpb2IgKQoreworCXN0cnVjdCB0a2lwX2N0eCAqY3R4ID0gY3J5cHRvLT5wcml2OworCXN0cnVjdCBpZWVlODAyMTFfZnJhbWUgKmhkcjsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2I7CisJY29uc3QgaW50IGhkcmxlbiA9IElFRUU4MDIxMV9UWVBfRlJBTUVfSEVBREVSX0xFTjsKKwlpbnQgZGF0YWxlbiA9IGlvYl9sZW4gKCBlaW9iICkgLSBoZHJsZW4gLSBUS0lQX0hFQURfTEVOIC0gVEtJUF9GT09UX0xFTjsKKwlzdHJ1Y3QgdGtpcF9oZWFkICpoZWFkOworCXN0cnVjdCBhcmM0X2N0eCBhcmM0OworCXUxNiByeF90c2NfbG87CisJdTgga2V5WzE2XTsKKwl1OCBtaWNbOF07CisJdTMyIGljdiwgY3JjOworCisJaW9iID0gYWxsb2NfaW9iICggaGRybGVuICsgZGF0YWxlbiArIFRLSVBfRk9PVF9MRU4gKTsKKwlpZiAoICEgaW9iICkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBDb3B5IGZyYW1lIGhlYWRlciAqLworCW1lbWNweSAoIGlvYl9wdXQgKCBpb2IsIGhkcmxlbiApLCBlaW9iLT5kYXRhLCBoZHJsZW4gKTsKKwloZHIgPSBpb2ItPmRhdGE7CisJaGRyLT5mYyAmPSB+SUVFRTgwMjExX0ZDX1BST1RFQ1RFRDsKKworCS8qIENoZWNrIGFuZCB1cGRhdGUgVFNDICovCisJaGVhZCA9IGVpb2ItPmRhdGEgKyBoZHJsZW47CisJcnhfdHNjX2xvID0gKCBoZWFkLT50c2MxIDw8IDggKSB8IGhlYWQtPnRzYzA7CisKKwlpZiAoIGhlYWQtPnRzY19oaSA8IGN0eC0+ZGVjLnRzY19oaSB8fAorCSAgICAgKCBoZWFkLT50c2NfaGkgPT0gY3R4LT5kZWMudHNjX2hpICYmCisJICAgICAgIHJ4X3RzY19sbyA8PSBjdHgtPmRlYy50c2NfbG8gKSApIHsKKwkJREJHQyAoIGN0eCwgIldQQS1US0lQICVwOiBwYWNrZXQgcmVjZWl2ZWQgb3V0IG9mIG9yZGVyICIKKwkJICAgICAgICIoJTA4eDolMDR4IDw9ICUwOHg6JTA0eClcbiIsIGN0eCwgaGVhZC0+dHNjX2hpLAorCQkgICAgICAgcnhfdHNjX2xvLCBjdHgtPmRlYy50c2NfaGksIGN0eC0+ZGVjLnRzY19sbyApOworCQlmcmVlX2lvYiAoIGlvYiApOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY3R4LT5kZWMudHNjX2xvID0gcnhfdHNjX2xvOworCWlmICggY3R4LT5kZWMudHNjX2hpICE9IGhlYWQtPnRzY19oaSApIHsKKwkJY3R4LT5kZWMudHRha19vayA9IDA7CisJCWN0eC0+ZGVjLnRzY19oaSA9IGhlYWQtPnRzY19oaTsKKwl9CisKKwkvKiBDYWxjdWxhdGUga2V5ICovCisJdGtpcF9taXhfMSAoICZjdHgtPmRlYywgJmN0eC0+dGssIGhkci0+YWRkcjIgKTsKKwl0a2lwX21peF8yICggJmN0eC0+ZGVjLCAmY3R4LT50aywga2V5ICk7CisKKwkvKiBDb3B5LWRlY3J5cHQgZGF0YSwgTUlDLCBJQ1YgKi8KKwljaXBoZXJfc2V0a2V5ICggJmFyYzRfYWxnb3JpdGhtLCAmYXJjNCwga2V5LCAxNiApOworCWNpcGhlcl9kZWNyeXB0ICggJmFyYzRfYWxnb3JpdGhtLCAmYXJjNCwKKwkJCSBlaW9iLT5kYXRhICsgaGRybGVuICsgVEtJUF9IRUFEX0xFTiwKKwkJCSBpb2JfcHV0ICggaW9iLCBkYXRhbGVuICksIGRhdGFsZW4gKyBUS0lQX0ZPT1RfTEVOICk7CisKKwkvKiBDaGVjayBJQ1YgKi8KKwlpY3YgPSBsZTMyX3RvX2NwdSAoICooIHUzMiAqICkgKCBpb2ItPnRhaWwgKyBUS0lQX01JQ19MRU4gKSApOworCWNyYyA9IH5jcmMzMl9sZSAoIH4wLCBpb2ItPmRhdGEgKyBoZHJsZW4sIGRhdGFsZW4gKyBUS0lQX01JQ19MRU4gKTsKKwlpZiAoIGNyYyAhPSBpY3YgKSB7CisJCURCR0MgKCBjdHgsICJXUEEtVEtJUCAlcCBDUkMgbWlzbWF0Y2g6IGV4cGVjdCAlMDh4LCBnZXQgJTA4eFxuIiwKKwkJICAgICAgIGN0eCwgaWN2LCBjcmMgKTsKKwkJZnJlZV9pb2IgKCBpb2IgKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQ2hlY2sgTUlDICovCisJdGtpcF9taWNoYWVsICggJmN0eC0+dGsubWljLnJ4LCBoZHItPmFkZHIxLCBoZHItPmFkZHIzLAorCQkgICAgICAgaW9iLT5kYXRhICsgaGRybGVuLCBkYXRhbGVuLCBtaWMgKTsKKwlpZiAoIG1lbWNtcCAoIG1pYywgaW9iLT50YWlsLCBUS0lQX01JQ19MRU4gKSAhPSAwICkgeworCQlEQkdDICggY3R4LCAiV1BBLVRLSVAgJXAgQUxFUlQhIE1JQyBmYWlsdXJlXG4iLCBjdHggKTsKKwkJLyogWFhYIHdlIHNob3VsZCBkbyB0aGUgY291bnRlcm1lYXN1cmVzIGhlcmUgKi8KKwkJZnJlZV9pb2IgKCBpb2IgKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJREJHQzIgKCBjdHgsICJXUEEtVEtJUCAlcDogZGVjcnlwdGVkIHBhY2tldCAlcCAtPiAlcFxuIiwgY3R4LAorCQllaW9iLCBpb2IgKTsKKworCXJldHVybiBpb2I7Cit9CisKKy8qKiBUS0lQIGNyeXB0b3N5c3RlbSAqLworc3RydWN0IG5ldDgwMjExX2NyeXB0byB0a2lwX2NyeXB0byBfX25ldDgwMjExX2NyeXB0byA9IHsKKwkuYWxnb3JpdGhtID0gTkVUODAyMTFfQ1JZUFRfVEtJUCwKKwkuaW5pdCA9IHRraXBfaW5pdCwKKwkuZW5jcnlwdCA9IHRraXBfZW5jcnlwdCwKKwkuZGVjcnlwdCA9IHRraXBfZGVjcnlwdCwKKwkucHJpdl9sZW4gPSBzaXplb2YgKCBzdHJ1Y3QgdGtpcF9jdHggKSwKK307CisKKworCisKKy8qKgorICogQ2FsY3VsYXRlIEhNQUMtTUQ1IE1JQyBmb3IgRUFQT0wtS2V5IGZyYW1lCisgKgorICogQHYga2NrCUtleSBDb25maXJtYXRpb24gS2V5LCAxNiBieXRlcworICogQHYgbXNnCU1lc3NhZ2UgdG8gY2FsY3VsYXRlIE1JQyBvdmVyCisgKiBAdiBsZW4JTnVtYmVyIG9mIGJ5dGVzIHRvIGNhbGN1bGF0ZSBNSUMgb3ZlcgorICogQHJldCBtaWMJQ2FsY3VsYXRlZCBNSUMsIDE2IGJ5dGVzIGxvbmcKKyAqLworc3RhdGljIHZvaWQgdGtpcF9raWVfbWljICggY29uc3Qgdm9pZCAqa2NrLCBjb25zdCB2b2lkICptc2csIHNpemVfdCBsZW4sCisJCQkgICB2b2lkICptaWMgKQoreworCXN0cnVjdCBtZDVfY3R4IG1kNTsKKwl1OCBrY2tiWzE2XTsKKwlzaXplX3Qga2NrX2xlbiA9IDE2OworCisJbWVtY3B5ICgga2NrYiwga2NrLCBrY2tfbGVuICk7CisKKwlobWFjX2luaXQgKCAmbWQ1X2FsZ29yaXRobSwgJm1kNSwga2NrYiwgJmtja19sZW4gKTsKKwlobWFjX3VwZGF0ZSAoICZtZDVfYWxnb3JpdGhtLCAmbWQ1LCBtc2csIGxlbiApOworCWhtYWNfZmluYWwgKCAmbWQ1X2FsZ29yaXRobSwgJm1kNSwga2NrYiwgJmtja19sZW4sIG1pYyApOworfQorCisvKioKKyAqIERlY3J5cHQga2V5IGRhdGEgaW4gRUFQT0wtS2V5IGZyYW1lCisgKgorICogQHYga2VrCUtleSBFbmNyeXB0aW9uIEtleSwgMTYgYnl0ZXMKKyAqIEB2IGl2CUluaXRpYWxpc2F0aW9uIHZlY3RvciwgMTYgYnl0ZXMKKyAqIEB2IG1zZwlNZXNzYWdlIHRvIGRlY3J5cHQKKyAqIEB2IGxlbglMZW5ndGggb2YgbWVzc2FnZQorICogQHJldCBtc2cJRGVjcnlwdGVkIG1lc3NhZ2UgaW4gcGxhY2Ugb2Ygb3JpZ2luYWwKKyAqIEByZXQgbGVuCVVuY2hhbmdlZAorICogQHJldCByYwlBbHdheXMgMCBmb3Igc3VjY2VzcworICovCitzdGF0aWMgaW50IHRraXBfa2llX2RlY3J5cHQgKCBjb25zdCB2b2lkICprZWssIGNvbnN0IHZvaWQgKml2LAorCQkJICAgICAgdm9pZCAqbXNnLCB1MTYgKmxlbiApCit7CisJdTgga2V5WzMyXTsKKwltZW1jcHkgKCBrZXksIGl2LCAxNiApOworCW1lbWNweSAoIGtleSArIDE2LCBrZWssIDE2ICk7CisKKwlhcmM0X3NraXAgKCBrZXksIDMyLCAyNTYsIG1zZywgbXNnLCAqbGVuICk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiogVEtJUC1zdHlsZSBrZXkgaW50ZWdyaXR5IGFuZCBlbmNyeXB0aW9uIGhhbmRsZXIgKi8KK3N0cnVjdCB3cGFfa2llIHRraXBfa2llIF9fd3BhX2tpZSA9IHsKKwkudmVyc2lvbiA9IEVBUE9MX0tFWV9WRVJTSU9OX1dQQSwKKwkubWljID0gdGtpcF9raWVfbWljLAorCS5kZWNyeXB0ID0gdGtpcF9raWVfZGVjcnlwdCwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvYW9lLmMgYi9ncHhlL3NyYy9uZXQvYW9lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5YTg3NQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9hb2UuYwpAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvYXRhLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Z3B4ZS9hb2UuaD4KKworLyoqIEBmaWxlCisgKgorICogQW9FIHByb3RvY29sCisgKgorICovCisKK0ZFQVRVUkUgKCBGRUFUVVJFX1BST1RPQ09MLCAiQW9FIiwgREhDUF9FQl9GRUFUVVJFX0FPRSwgMSApOworCitzdHJ1Y3QgbmV0X3Byb3RvY29sIGFvZV9wcm90b2NvbDsKKworLyoqIExpc3Qgb2YgYWxsIEFvRSBzZXNzaW9ucyAqLworc3RhdGljIExJU1RfSEVBRCAoIGFvZV9zZXNzaW9ucyApOworCitzdGF0aWMgdm9pZCBhb2VfZnJlZSAoIHN0cnVjdCByZWZjbnQgKnJlZmNudCApIHsKKwlzdHJ1Y3QgYW9lX3Nlc3Npb24gKmFvZSA9CisJCWNvbnRhaW5lcl9vZiAoIHJlZmNudCwgc3RydWN0IGFvZV9zZXNzaW9uLCByZWZjbnQgKTsKKworCW5ldGRldl9wdXQgKCBhb2UtPm5ldGRldiApOworCWZyZWUgKCBhb2UgKTsKK30KKworLyoqCisgKiBNYXJrIGN1cnJlbnQgQW9FIGNvbW1hbmQgY29tcGxldGUKKyAqCisgKiBAdiBhb2UJCUFvRSBzZXNzaW9uCisgKiBAdiByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIGFvZV9kb25lICggc3RydWN0IGFvZV9zZXNzaW9uICphb2UsIGludCByYyApIHsKKworCS8qIFJlY29yZCBvdmVyYWxsIGNvbW1hbmQgc3RhdHVzICovCisJaWYgKCBhb2UtPmNvbW1hbmQgKSB7CisJCWFvZS0+Y29tbWFuZC0+Y2IuY21kX3N0YXQgPSBhb2UtPnN0YXR1czsKKwkJYW9lLT5jb21tYW5kLT5yYyA9IHJjOworCQlhb2UtPmNvbW1hbmQgPSBOVUxMOworCX0KKworCS8qIFN0b3AgcmV0cmFuc21pc3Npb24gdGltZXIgKi8KKwlzdG9wX3RpbWVyICggJmFvZS0+dGltZXIgKTsKKworCS8qIE1hcmsgb3BlcmF0aW9uIGFzIGNvbXBsZXRlICovCisJYW9lLT5yYyA9IHJjOworfQorCisvKioKKyAqIFNlbmQgQW9FIGNvbW1hbmQKKyAqCisgKiBAdiBhb2UJCUFvRSBzZXNzaW9uCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGlzIHRyYW5zbWl0cyBhbiBBb0UgY29tbWFuZCBwYWNrZXQuICBJdCBkb2VzIG5vdCB3YWl0IGZvciBhCisgKiByZXNwb25zZS4KKyAqLworc3RhdGljIGludCBhb2Vfc2VuZF9jb21tYW5kICggc3RydWN0IGFvZV9zZXNzaW9uICphb2UgKSB7CisJc3RydWN0IGF0YV9jb21tYW5kICpjb21tYW5kID0gYW9lLT5jb21tYW5kOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXN0cnVjdCBhb2VoZHIgKmFvZWhkcjsKKwl1bmlvbiBhb2VjbWQgKmFvZWNtZDsKKwlzdHJ1Y3QgYW9lYXRhICphb2VhdGE7CisJdW5zaWduZWQgaW50IGNvdW50OworCXVuc2lnbmVkIGludCBkYXRhX291dF9sZW47CisJdW5zaWduZWQgaW50IGFvZWNtZGxlbjsKKworCS8qIEZhaWwgaW1tZWRpYXRlbHkgaWYgd2UgaGF2ZSBubyBuZXRkZXYgdG8gc2VuZCBvbiAqLworCWlmICggISBhb2UtPm5ldGRldiApIHsKKwkJYW9lX2RvbmUgKCBhb2UsIC1FTkVUVU5SRUFDSCApOworCQlyZXR1cm4gLUVORVRVTlJFQUNIOworCX0KKworCS8qIElmIHdlIGFyZSB0cmFuc21pdHRpbmcgYW55dGhpbmcgdGhhdCByZXF1aXJlcyBhIHJlc3BvbnNlLAorICAgICAgICAgKiBzdGFydCB0aGUgcmV0cmFuc21pc3Npb24gdGltZXIuICBEbyB0aGlzIGJlZm9yZSBhdHRlbXB0aW5nCisgICAgICAgICAqIHRvIGFsbG9jYXRlIHRoZSBJL08gYnVmZmVyLCBpbiBjYXNlIGFsbG9jYXRpb24gaXRzZWxmCisgICAgICAgICAqIGZhaWxzLgorICAgICAgICAgKi8KKwlzdGFydF90aW1lciAoICZhb2UtPnRpbWVyICk7CisKKwkvKiBDYWxjdWxhdGUgY291bnQgYW5kIGRhdGFfb3V0X2xlbiBmb3IgdGhpcyBzdWJjb21tYW5kICovCisJc3dpdGNoICggYW9lLT5hb2VfY21kX3R5cGUgKSB7CisJY2FzZSBBT0VfQ01EX0FUQToKKwkJY291bnQgPSBjb21tYW5kLT5jYi5jb3VudC5uYXRpdmU7CisJCWlmICggY291bnQgPiBBT0VfTUFYX0NPVU5UICkKKwkJCWNvdW50ID0gQU9FX01BWF9DT1VOVDsKKwkJZGF0YV9vdXRfbGVuID0gKCBjb21tYW5kLT5kYXRhX291dCA/CisJCQkJICggY291bnQgKiBBVEFfU0VDVE9SX1NJWkUgKSA6IDAgKTsKKwkJYW9lY21kbGVuID0gc2l6ZW9mICggYW9lY21kLT5hdGEgKTsKKwkJYnJlYWs7CisJY2FzZSBBT0VfQ01EX0NPTkZJRzoKKwkJY291bnQgPSAwOworCQlkYXRhX291dF9sZW4gPSAwOworCQlhb2VjbWRsZW4gPSBzaXplb2YgKCBhb2VjbWQtPmNmZyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RTVVA7CisJfQorCisJLyogQ3JlYXRlIG91dGdvaW5nIEkvTyBidWZmZXIgKi8KKwlpb2J1ZiA9IGFsbG9jX2lvYiAoIEVUSF9ITEVOICsgc2l6ZW9mICggKmFvZWhkciApICsKKwkJCSAgICBhb2VjbWRsZW4gKyBkYXRhX291dF9sZW4gKTsKKworCWlmICggISBpb2J1ZiApCisJCXJldHVybiAtRU5PTUVNOworCWlvYl9yZXNlcnZlICggaW9idWYsIEVUSF9ITEVOICk7CisJYW9laGRyID0gaW9iX3B1dCAoIGlvYnVmLCBzaXplb2YgKCAqYW9laGRyICkgKTsKKwlhb2VjbWQgPSBpb2JfcHV0ICggaW9idWYsIGFvZWNtZGxlbiApOworCW1lbXNldCAoIGFvZWhkciwgMCwgKCBzaXplb2YgKCAqYW9laGRyICkgKyBhb2VjbWRsZW4gKSApOworCisJLyogRmlsbCBBb0UgaGVhZGVyICovCisJYW9laGRyLT52ZXJfZmxhZ3MgPSBBT0VfVkVSU0lPTjsKKwlhb2VoZHItPm1ham9yID0gaHRvbnMgKCBhb2UtPm1ham9yICk7CisJYW9laGRyLT5taW5vciA9IGFvZS0+bWlub3I7CisJYW9laGRyLT5jb21tYW5kID0gYW9lLT5hb2VfY21kX3R5cGU7CisJYW9laGRyLT50YWcgPSBodG9ubCAoICsrYW9lLT50YWcgKTsKKworCS8qIEZpbGwgQW9FIHBheWxvYWQgKi8KKwlzd2l0Y2ggKCBhb2UtPmFvZV9jbWRfdHlwZSApIHsKKwljYXNlIEFPRV9DTURfQVRBOgorCQkvKiBGaWxsIEFvRSBjb21tYW5kICovCisJCWFvZWF0YSA9ICZhb2VjbWQtPmF0YTsKKwkJbGlua2VyX2Fzc2VydCAoIEFPRV9GTF9ERVZfSEVBRAk9PSBBVEFfREVWX1NMQVZFLAorCQkJCV9fZml4X2F0YV9oX18gKTsKKwkJYW9lYXRhLT5hZmxhZ3MgPSAoICggY29tbWFuZC0+Y2IubGJhNDggPyBBT0VfRkxfRVhURU5ERUQgOiAwICl8CisJCQkJICAgKCBjb21tYW5kLT5jYi5kZXZpY2UgJiBBVEFfREVWX1NMQVZFICkgfAorCQkJCSAgICggZGF0YV9vdXRfbGVuID8gQU9FX0ZMX1dSSVRFIDogMCApICk7CisJCWFvZWF0YS0+ZXJyX2ZlYXQgPSBjb21tYW5kLT5jYi5lcnJfZmVhdC5ieXRlcy5jdXI7CisJCWFvZWF0YS0+Y291bnQgPSBjb3VudDsKKwkJYW9lYXRhLT5jbWRfc3RhdCA9IGNvbW1hbmQtPmNiLmNtZF9zdGF0OworCQlhb2VhdGEtPmxiYS51NjQgPSBjcHVfdG9fbGU2NCAoIGNvbW1hbmQtPmNiLmxiYS5uYXRpdmUgKTsKKwkJaWYgKCAhIGNvbW1hbmQtPmNiLmxiYTQ4ICkKKwkJCWFvZWF0YS0+bGJhLmJ5dGVzWzNdIHw9CisJCQkJKCBjb21tYW5kLT5jYi5kZXZpY2UgJiBBVEFfREVWX01BU0sgKTsKKworCQkvKiBGaWxsIGRhdGEgcGF5bG9hZCAqLworCQljb3B5X2Zyb21fdXNlciAoIGlvYl9wdXQgKCBpb2J1ZiwgZGF0YV9vdXRfbGVuICksCisJCQkJIGNvbW1hbmQtPmRhdGFfb3V0LCBhb2UtPmNvbW1hbmRfb2Zmc2V0LAorCQkJCSBkYXRhX291dF9sZW4gKTsKKwkJYnJlYWs7CisJY2FzZSBBT0VfQ01EX0NPTkZJRzoKKwkJLyogTm90aGluZyB0byBkbyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhc3NlcnQgKCAwICk7CisJfQorCisJLyogU2VuZCBwYWNrZXQgKi8KKwlyZXR1cm4gbmV0X3R4ICggaW9idWYsIGFvZS0+bmV0ZGV2LCAmYW9lX3Byb3RvY29sLCBhb2UtPnRhcmdldCApOworfQorCisvKioKKyAqIEhhbmRsZSBBb0UgcmV0cnkgdGltZXIgZXhwaXJ5CisgKgorICogQHYgdGltZXIJCUFvRSByZXRyeSB0aW1lcgorICogQHYgZmFpbAkJRmFpbHVyZSBpbmRpY2F0b3IKKyAqLworc3RhdGljIHZvaWQgYW9lX3RpbWVyX2V4cGlyZWQgKCBzdHJ1Y3QgcmV0cnlfdGltZXIgKnRpbWVyLCBpbnQgZmFpbCApIHsKKwlzdHJ1Y3QgYW9lX3Nlc3Npb24gKmFvZSA9CisJCWNvbnRhaW5lcl9vZiAoIHRpbWVyLCBzdHJ1Y3QgYW9lX3Nlc3Npb24sIHRpbWVyICk7CisKKwlpZiAoIGZhaWwgKSB7CisJCWFvZV9kb25lICggYW9lLCAtRVRJTUVET1VUICk7CisJfSBlbHNlIHsKKwkJYW9lX3NlbmRfY29tbWFuZCAoIGFvZSApOworCX0KK30KKworLyoqCisgKiBIYW5kbGUgQW9FIGNvbmZpZ3VyYXRpb24gY29tbWFuZCByZXNwb25zZQorICoKKyAqIEB2IGFvZQkJQW9FIHNlc3Npb24KKyAqIEB2IGxsX3NvdXJjZQkJTGluay1sYXllciBzb3VyY2UgYWRkcmVzcworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYW9lX3J4X2NmZyAoIHN0cnVjdCBhb2Vfc2Vzc2lvbiAqYW9lLCBjb25zdCB2b2lkICpsbF9zb3VyY2UgKSB7CisKKwkvKiBSZWNvcmQgdGFyZ2V0IE1BQyBhZGRyZXNzICovCisJbWVtY3B5ICggYW9lLT50YXJnZXQsIGxsX3NvdXJjZSwgc2l6ZW9mICggYW9lLT50YXJnZXQgKSApOworCURCR0MgKCBhb2UsICJBb0UgJXAgdGFyZ2V0IE1BQyBhZGRyZXNzICVzXG4iLAorCSAgICAgICBhb2UsIGV0aF9udG9hICggYW9lLT50YXJnZXQgKSApOworCisJLyogTWFyayBjb25maWcgcmVxdWVzdCBhcyBjb21wbGV0ZSAqLworCWFvZV9kb25lICggYW9lLCAwICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgQW9FIEFUQSBjb21tYW5kIHJlc3BvbnNlCisgKgorICogQHYgYW9lCQlBb0Ugc2Vzc2lvbgorICogQHYgYW9lYXRhCQlBb0UgQVRBIGNvbW1hbmQKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIEFvRSBBVEEgY29tbWFuZAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYW9lX3J4X2F0YSAoIHN0cnVjdCBhb2Vfc2Vzc2lvbiAqYW9lLCBzdHJ1Y3QgYW9lYXRhICphb2VhdGEsCisJCQlzaXplX3QgbGVuICkgeworCXN0cnVjdCBhdGFfY29tbWFuZCAqY29tbWFuZCA9IGFvZS0+Y29tbWFuZDsKKwl1bnNpZ25lZCBpbnQgcnhfZGF0YV9sZW47CisJdW5zaWduZWQgaW50IGNvdW50OworCXVuc2lnbmVkIGludCBkYXRhX2xlbjsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggbGVuIDwgc2l6ZW9mICggKmFvZWF0YSApICkgeworCQkvKiBJZ25vcmUgcGFja2V0OyBhbGxvdyB0aW1lciB0byB0cmlnZ2VyIHJldHJhbnNtaXQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJ4X2RhdGFfbGVuID0gKCBsZW4gLSBzaXplb2YgKCAqYW9lYXRhICkgKTsKKworCS8qIENhbGN1bGF0ZSBjb3VudCBhbmQgZGF0YV9sZW4gZm9yIHRoaXMgc3ViY29tbWFuZCAqLworCWNvdW50ID0gY29tbWFuZC0+Y2IuY291bnQubmF0aXZlOworCWlmICggY291bnQgPiBBT0VfTUFYX0NPVU5UICkKKwkJY291bnQgPSBBT0VfTUFYX0NPVU5UOworCWRhdGFfbGVuID0gY291bnQgKiBBVEFfU0VDVE9SX1NJWkU7CisKKwkvKiBNZXJnZSBpbnRvIG92ZXJhbGwgQVRBIHN0YXR1cyAqLworCWFvZS0+c3RhdHVzIHw9IGFvZWF0YS0+Y21kX3N0YXQ7CisKKwkvKiBDb3B5IGRhdGEgcGF5bG9hZCAqLworCWlmICggY29tbWFuZC0+ZGF0YV9pbiApIHsKKwkJaWYgKCByeF9kYXRhX2xlbiA+IGRhdGFfbGVuICkKKwkJCXJ4X2RhdGFfbGVuID0gZGF0YV9sZW47CisJCWNvcHlfdG9fdXNlciAoIGNvbW1hbmQtPmRhdGFfaW4sIGFvZS0+Y29tbWFuZF9vZmZzZXQsCisJCQkgICAgICAgYW9lYXRhLT5kYXRhLCByeF9kYXRhX2xlbiApOworCX0KKworCS8qIFVwZGF0ZSBBVEEgY29tbWFuZCBhbmQgb2Zmc2V0ICovCisJYW9lLT5jb21tYW5kX29mZnNldCArPSBkYXRhX2xlbjsKKwljb21tYW5kLT5jYi5sYmEubmF0aXZlICs9IGNvdW50OworCWNvbW1hbmQtPmNiLmNvdW50Lm5hdGl2ZSAtPSBjb3VudDsKKworCS8qIENoZWNrIGZvciBvcGVyYXRpb24gY29tcGxldGUgKi8KKwlpZiAoICEgY29tbWFuZC0+Y2IuY291bnQubmF0aXZlICkgeworCQlhb2VfZG9uZSAoIGFvZSwgMCApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcmFuc21pdCBuZXh0IHBvcnRpb24gb2YgcmVxdWVzdCAqLworCXN0b3BfdGltZXIgKCAmYW9lLT50aW1lciApOworCWFvZV9zZW5kX2NvbW1hbmQgKCBhb2UgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFByb2Nlc3MgaW5jb21pbmcgQW9FIHBhY2tldHMKKyAqCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgbGxfc291cmNlCQlMaW5rLWxheWVyIHNvdXJjZSBhZGRyZXNzCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKi8KK3N0YXRpYyBpbnQgYW9lX3J4ICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2IF9fdW51c2VkLAorCQkgICAgY29uc3Qgdm9pZCAqbGxfc291cmNlICkgeworCXN0cnVjdCBhb2VoZHIgKmFvZWhkciA9IGlvYnVmLT5kYXRhOworCXN0cnVjdCBhb2Vfc2Vzc2lvbiAqYW9lOworCWludCByYyA9IDA7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCBpb2JfbGVuICggaW9idWYgKSA8IHNpemVvZiAoICphb2VoZHIgKSApIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmICggKCBhb2VoZHItPnZlcl9mbGFncyAmIEFPRV9WRVJTSU9OX01BU0sgKSAhPSBBT0VfVkVSU0lPTiApIHsKKwkJcmMgPSAtRVBST1RPTk9TVVBQT1JUOworCQlnb3RvIGRvbmU7CisJfQorCWlmICggISAoIGFvZWhkci0+dmVyX2ZsYWdzICYgQU9FX0ZMX1JFU1BPTlNFICkgKSB7CisJCS8qIElnbm9yZSBBb0UgcmVxdWVzdHMgdGhhdCB3ZSBoYXBwZW4gdG8gc2VlICovCisJCWdvdG8gZG9uZTsKKwl9CisJaW9iX3B1bGwgKCBpb2J1Ziwgc2l6ZW9mICggKmFvZWhkciApICk7CisKKwkvKiBEZW11bHRpcGxleCBhbW9uZ3N0IGFjdGl2ZSBBb0Ugc2Vzc2lvbnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggYW9lLCAmYW9lX3Nlc3Npb25zLCBsaXN0ICkgeworCQlpZiAoIG50b2hzICggYW9laGRyLT5tYWpvciApICE9IGFvZS0+bWFqb3IgKQorCQkJY29udGludWU7CisJCWlmICggYW9laGRyLT5taW5vciAhPSBhb2UtPm1pbm9yICkKKwkJCWNvbnRpbnVlOworCQlpZiAoIG50b2hsICggYW9laGRyLT50YWcgKSAhPSBhb2UtPnRhZyApCisJCQljb250aW51ZTsKKwkJaWYgKCBhb2VoZHItPnZlcl9mbGFncyAmIEFPRV9GTF9FUlJPUiApIHsKKwkJCWFvZV9kb25lICggYW9lLCAtRUlPICk7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKCBhb2VoZHItPmNvbW1hbmQgKSB7CisJCWNhc2UgQU9FX0NNRF9BVEE6CisJCQlyYyA9IGFvZV9yeF9hdGEgKCBhb2UsIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSk7CisJCQlicmVhazsKKwkJY2FzZSBBT0VfQ01EX0NPTkZJRzoKKwkJCXJjID0gYW9lX3J4X2NmZyAoIGFvZSwgbGxfc291cmNlICk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR0MgKCBhb2UsICJBb0UgJXAgaWdub3JpbmcgY29tbWFuZCAlMDJ4XG4iLAorCQkJICAgICAgIGFvZSwgYW9laGRyLT5jb21tYW5kICk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKyBkb25lOgorCWZyZWVfaW9iICggaW9idWYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKiBBb0UgcHJvdG9jb2wgKi8KK3N0cnVjdCBuZXRfcHJvdG9jb2wgYW9lX3Byb3RvY29sIF9fbmV0X3Byb3RvY29sID0geworCS5uYW1lID0gIkFvRSIsCisJLm5ldF9wcm90byA9IGh0b25zICggRVRIX1BfQU9FICksCisJLnJ4ID0gYW9lX3J4LAorfTsKKworLyoqCisgKiBJc3N1ZSBBVEEgY29tbWFuZCB2aWEgYW4gb3BlbiBBb0Ugc2Vzc2lvbgorICoKKyAqIEB2IGF0YQkJQVRBIGRldmljZQorICogQHYgY29tbWFuZAkJQVRBIGNvbW1hbmQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGFvZV9jb21tYW5kICggc3RydWN0IGF0YV9kZXZpY2UgKmF0YSwKKwkJCSBzdHJ1Y3QgYXRhX2NvbW1hbmQgKmNvbW1hbmQgKSB7CisJc3RydWN0IGFvZV9zZXNzaW9uICphb2UgPQorCQljb250YWluZXJfb2YgKCBhdGEtPmJhY2tlbmQsIHN0cnVjdCBhb2Vfc2Vzc2lvbiwgcmVmY250ICk7CisKKwlhb2UtPmNvbW1hbmQgPSBjb21tYW5kOworCWFvZS0+c3RhdHVzID0gMDsKKwlhb2UtPmNvbW1hbmRfb2Zmc2V0ID0gMDsKKwlhb2UtPmFvZV9jbWRfdHlwZSA9IEFPRV9DTURfQVRBOworCisJYW9lX3NlbmRfY29tbWFuZCAoIGFvZSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSXNzdWUgQW9FIGNvbmZpZyBxdWVyeSBmb3IgQW9FIHRhcmdldCBkaXNjb3ZlcnkKKyAqCisgKiBAdiBhb2UJCUFvRSBzZXNzaW9uCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhb2VfZGlzY292ZXIgKCBzdHJ1Y3QgYW9lX3Nlc3Npb24gKmFvZSApIHsKKwlpbnQgcmM7CisKKwlhb2UtPnN0YXR1cyA9IDA7CisJYW9lLT5hb2VfY21kX3R5cGUgPSBBT0VfQ01EX0NPTkZJRzsKKwlhb2UtPmNvbW1hbmQgPSBOVUxMOworCisJYW9lX3NlbmRfY29tbWFuZCAoIGFvZSApOworCisJYW9lLT5yYyA9IC1FSU5QUk9HUkVTUzsKKwl3aGlsZSAoIGFvZS0+cmMgPT0gLUVJTlBST0dSRVNTICkKKwkJc3RlcCgpOworCXJjID0gYW9lLT5yYzsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhb2VfZGV0YWNoZWRfY29tbWFuZCAoIHN0cnVjdCBhdGFfZGV2aWNlICphdGEgX191bnVzZWQsCisJCQkJICBzdHJ1Y3QgYXRhX2NvbW1hbmQgKmNvbW1hbmQgX191bnVzZWQgKSB7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3ZvaWQgYW9lX2RldGFjaCAoIHN0cnVjdCBhdGFfZGV2aWNlICphdGEgKSB7CisJc3RydWN0IGFvZV9zZXNzaW9uICphb2UgPQorCQljb250YWluZXJfb2YgKCBhdGEtPmJhY2tlbmQsIHN0cnVjdCBhb2Vfc2Vzc2lvbiwgcmVmY250ICk7CisKKwlzdG9wX3RpbWVyICggJmFvZS0+dGltZXIgKTsKKwlhdGEtPmNvbW1hbmQgPSBhb2VfZGV0YWNoZWRfY29tbWFuZDsKKwlsaXN0X2RlbCAoICZhb2UtPmxpc3QgKTsKKwlyZWZfcHV0ICggYXRhLT5iYWNrZW5kICk7CisJYXRhLT5iYWNrZW5kID0gTlVMTDsKK30KKworc3RhdGljIGludCBhb2VfcGFyc2Vfcm9vdF9wYXRoICggc3RydWN0IGFvZV9zZXNzaW9uICphb2UsCisJCQkJIGNvbnN0IGNoYXIgKnJvb3RfcGF0aCApIHsKKwljaGFyICpwdHI7CisKKwlpZiAoIHN0cm5jbXAgKCByb290X3BhdGgsICJhb2U6IiwgNCApICE9IDAgKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwdHIgPSAoICggY2hhciAqICkgcm9vdF9wYXRoICsgNCApOworCisJaWYgKCAqcHRyKysgIT0gJ2UnICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhb2UtPm1ham9yID0gc3RydG91bCAoIHB0ciwgJnB0ciwgMTAgKTsKKwlpZiAoICpwdHIrKyAhPSAnLicgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFvZS0+bWlub3IgPSBzdHJ0b3VsICggcHRyLCAmcHRyLCAxMCApOworCWlmICggKnB0ciApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBhb2VfYXR0YWNoICggc3RydWN0IGF0YV9kZXZpY2UgKmF0YSwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJIGNvbnN0IGNoYXIgKnJvb3RfcGF0aCApIHsKKwlzdHJ1Y3QgYW9lX3Nlc3Npb24gKmFvZTsKKwlpbnQgcmM7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBzdHJ1Y3R1cmUgKi8KKwlhb2UgPSB6YWxsb2MgKCBzaXplb2YgKCAqYW9lICkgKTsKKwlpZiAoICEgYW9lICkKKwkJcmV0dXJuIC1FTk9NRU07CisJYW9lLT5yZWZjbnQuZnJlZSA9IGFvZV9mcmVlOworCWFvZS0+bmV0ZGV2ID0gbmV0ZGV2X2dldCAoIG5ldGRldiApOworCW1lbWNweSAoIGFvZS0+dGFyZ2V0LCBuZXRkZXYtPmxsX2Jyb2FkY2FzdCwgc2l6ZW9mICggYW9lLT50YXJnZXQgKSApOworCWFvZS0+dGFnID0gQU9FX1RBR19NQUdJQzsKKwlhb2UtPnRpbWVyLmV4cGlyZWQgPSBhb2VfdGltZXJfZXhwaXJlZDsKKworCS8qIFBhcnNlIHJvb3QgcGF0aCAqLworCWlmICggKCByYyA9IGFvZV9wYXJzZV9yb290X3BhdGggKCBhb2UsIHJvb3RfcGF0aCApICkgIT0gMCApCisJCWdvdG8gZXJyOworCisJLyogQXR0YWNoIHBhcmVudCBpbnRlcmZhY2UsIHRyYW5zZmVyIHJlZmVyZW5jZSB0byBjb25uZWN0aW9uCisJICogbGlzdCwgYW5kIHJldHVybgorCSAqLworCWF0YS0+YmFja2VuZCA9IHJlZl9nZXQgKCAmYW9lLT5yZWZjbnQgKTsKKwlhdGEtPmNvbW1hbmQgPSBhb2VfY29tbWFuZDsKKwlsaXN0X2FkZCAoICZhb2UtPmxpc3QsICZhb2Vfc2Vzc2lvbnMgKTsKKworCS8qIFNlbmQgZGlzY292ZXJ5IHBhY2tldCB0byBmaW5kIHRoZSB0YXJnZXQgTUFDIGFkZHJlc3MuCisJICogSWRlYWxseSwgdGhpcyBvdWdodCB0byBiZSBkb25lIGFzeW5jaHJvbm91c2x5LCBidXQgdGhlCisJICogYmxvY2sgZGV2aWNlIGludGVyZmFjZSBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBhc3luY2hyb25vdXMKKwkgKiBvcGVyYXRpb24uCisJICovCisJaWYgKCAoIHJjID0gYW9lX2Rpc2NvdmVyKCBhb2UgKSApICE9IDAgKQorCSAgICAgICBnb3RvIGVycjsKKworCXJldHVybiAwOworCisgZXJyOgorCXJlZl9wdXQgKCAmYW9lLT5yZWZjbnQgKTsKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvYXJwLmMgYi9ncHhlL3NyYy9uZXQvYXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0YTg1NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9hcnAuYwpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9hcnAuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2FycC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wKKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgYWRkcmVzcyByZXNvbHV0aW9uIHByb3RvY29sIGFzIGRlZmluZWQgaW4KKyAqIFJGQzgyNi4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBtZWRpYS1pbmRlcGVuZGVudCBhbmQKKyAqIHByb3RvY29sLWluZGVwZW5kZW50OyBpdCBpcyBub3QgbGltaXRlZCB0byBFdGhlcm5ldCBvciB0byBJUHY0LgorICoKKyAqLworCisvKiogQW4gQVJQIGNhY2hlIGVudHJ5ICovCitzdHJ1Y3QgYXJwX2VudHJ5IHsKKwkvKiogTmV0d29yay1sYXllciBwcm90b2NvbCAqLworCXN0cnVjdCBuZXRfcHJvdG9jb2wgKm5ldF9wcm90b2NvbDsKKwkvKiogTGluay1sYXllciBwcm90b2NvbCAqLworCXN0cnVjdCBsbF9wcm90b2NvbCAqbGxfcHJvdG9jb2w7CisJLyoqIE5ldHdvcmstbGF5ZXIgYWRkcmVzcyAqLworCXVpbnQ4X3QgbmV0X2FkZHJbTUFYX05FVF9BRERSX0xFTl07CisJLyoqIExpbmstbGF5ZXIgYWRkcmVzcyAqLworCXVpbnQ4X3QgbGxfYWRkcltNQVhfTExfQUREUl9MRU5dOworfTsKKworLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBBUlAgY2FjaGUKKyAqCisgKiBUaGlzIGlzIGEgZ2xvYmFsIGNhY2hlLCBjb3ZlcmluZyBhbGwgbmV0d29yayBpbnRlcmZhY2VzLAorICogbmV0d29yay1sYXllciBwcm90b2NvbHMgYW5kIGxpbmstbGF5ZXIgcHJvdG9jb2xzLgorICovCisjZGVmaW5lIE5VTV9BUlBfRU5UUklFUyA0CisKKy8qKiBUaGUgQVJQIGNhY2hlICovCitzdGF0aWMgc3RydWN0IGFycF9lbnRyeSBhcnBfdGFibGVbTlVNX0FSUF9FTlRSSUVTXTsKKyNkZWZpbmUgYXJwX3RhYmxlX2VuZCAmYXJwX3RhYmxlW05VTV9BUlBfRU5UUklFU10KKworc3RhdGljIHVuc2lnbmVkIGludCBuZXh0X25ld19hcnBfZW50cnkgPSAwOworCitzdHJ1Y3QgbmV0X3Byb3RvY29sIGFycF9wcm90b2NvbDsKKworLyoqCisgKiBGaW5kIGVudHJ5IGluIHRoZSBBUlAgY2FjaGUKKyAqCisgKiBAdiBsbF9wcm90b2NvbAlMaW5rLWxheWVyIHByb3RvY29sCisgKiBAdiBuZXRfcHJvdG9jb2wJTmV0d29yay1sYXllciBwcm90b2NvbAorICogQHYgbmV0X2FkZHIJCU5ldHdvcmstbGF5ZXIgYWRkcmVzcworICogQHJldCBhcnAJCUFSUCBjYWNoZSBlbnRyeSwgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXJwX2VudHJ5ICoKK2FycF9maW5kX2VudHJ5ICggc3RydWN0IGxsX3Byb3RvY29sICpsbF9wcm90b2NvbCwKKwkJIHN0cnVjdCBuZXRfcHJvdG9jb2wgKm5ldF9wcm90b2NvbCwKKwkJIGNvbnN0IHZvaWQgKm5ldF9hZGRyICkgeworCXN0cnVjdCBhcnBfZW50cnkgKmFycDsKKworCWZvciAoIGFycCA9IGFycF90YWJsZSA7IGFycCA8IGFycF90YWJsZV9lbmQgOyBhcnArKyApIHsKKwkJaWYgKCAoIGFycC0+bGxfcHJvdG9jb2wgPT0gbGxfcHJvdG9jb2wgKSAmJgorCQkgICAgICggYXJwLT5uZXRfcHJvdG9jb2wgPT0gbmV0X3Byb3RvY29sICkgJiYKKwkJICAgICAoIG1lbWNtcCAoIGFycC0+bmV0X2FkZHIsIG5ldF9hZGRyLAorCQkJCW5ldF9wcm90b2NvbC0+bmV0X2FkZHJfbGVuICkgPT0gMCApICkKKwkJCXJldHVybiBhcnA7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIExvb2sgdXAgbWVkaWEtc3BlY2lmaWMgbGluay1sYXllciBhZGRyZXNzIGluIHRoZSBBUlAgY2FjaGUKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBuZXRfcHJvdG9jb2wJTmV0d29yay1sYXllciBwcm90b2NvbAorICogQHYgZGVzdF9uZXRfYWRkcglEZXN0aW5hdGlvbiBuZXR3b3JrLWxheWVyIGFkZHJlc3MKKyAqIEB2IHNvdXJjZV9uZXRfYWRkcglTb3VyY2UgbmV0d29yay1sYXllciBhZGRyZXNzCisgKiBAcmV0IGRlc3RfbGxfYWRkcglEZXN0aW5hdGlvbiBsaW5rIGxheWVyIGFkZHJlc3MKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB1c2UgdGhlIEFSUCBjYWNoZSB0byBsb29rIHVwIHRoZSBsaW5rLWxheWVyCisgKiBhZGRyZXNzIGZvciB0aGUgbGluay1sYXllciBwcm90b2NvbCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldHdvcmsKKyAqIGRldmljZSBhbmQgdGhlIGdpdmVuIG5ldHdvcmstbGF5ZXIgcHJvdG9jb2wgYW5kIGFkZHJlc3Nlcy4gIElmCisgKiBmb3VuZCwgdGhlIGRlc3RpbmF0aW9uIGxpbmstbGF5ZXIgYWRkcmVzcyB3aWxsIGJlIGZpbGxlZCBpbiBpbiBAYworICogZGVzdF9sbF9hZGRyLgorICoKKyAqIElmIG5vIGFkZHJlc3MgaXMgZm91bmQgaW4gdGhlIEFSUCBjYWNoZSwgYW4gQVJQIHJlcXVlc3Qgd2lsbCBiZQorICogdHJhbnNtaXR0ZWQgb24gdGhlIHNwZWNpZmllZCBuZXR3b3JrIGRldmljZSBhbmQgLUVOT0VOVCB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqLworaW50IGFycF9yZXNvbHZlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IG5ldF9wcm90b2NvbCAqbmV0X3Byb3RvY29sLAorCQkgIGNvbnN0IHZvaWQgKmRlc3RfbmV0X2FkZHIsIGNvbnN0IHZvaWQgKnNvdXJjZV9uZXRfYWRkciwKKwkJICB2b2lkICpkZXN0X2xsX2FkZHIgKSB7CisJc3RydWN0IGxsX3Byb3RvY29sICpsbF9wcm90b2NvbCA9IG5ldGRldi0+bGxfcHJvdG9jb2w7CisJY29uc3Qgc3RydWN0IGFycF9lbnRyeSAqYXJwOworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXN0cnVjdCBhcnBoZHIgKmFycGhkcjsKKwlpbnQgcmM7CisKKwkvKiBMb29rIGZvciBleGlzdGluZyBlbnRyeSBpbiBBUlAgdGFibGUgKi8KKwlhcnAgPSBhcnBfZmluZF9lbnRyeSAoIGxsX3Byb3RvY29sLCBuZXRfcHJvdG9jb2wsIGRlc3RfbmV0X2FkZHIgKTsKKwlpZiAoIGFycCApIHsKKwkJREJHICggIkFSUCBjYWNoZSBoaXQ6ICVzICVzID0+ICVzICVzXG4iLAorCQkgICAgICBuZXRfcHJvdG9jb2wtPm5hbWUsIG5ldF9wcm90b2NvbC0+bnRvYSAoIGFycC0+bmV0X2FkZHIgKSwKKwkJICAgICAgbGxfcHJvdG9jb2wtPm5hbWUsIGxsX3Byb3RvY29sLT5udG9hICggYXJwLT5sbF9hZGRyICkgKTsKKwkJbWVtY3B5ICggZGVzdF9sbF9hZGRyLCBhcnAtPmxsX2FkZHIsIGxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbik7CisJCXJldHVybiAwOworCX0KKwlEQkcgKCAiQVJQIGNhY2hlIG1pc3M6ICVzICVzXG4iLCBuZXRfcHJvdG9jb2wtPm5hbWUsCisJICAgICAgbmV0X3Byb3RvY29sLT5udG9hICggZGVzdF9uZXRfYWRkciApICk7CisKKwkvKiBBbGxvY2F0ZSBBUlAgcGFja2V0ICovCisJaW9idWYgPSBhbGxvY19pb2IgKCBNQVhfTExfSEVBREVSX0xFTiArIHNpemVvZiAoICphcnBoZHIgKSArCisJCQkgIDIgKiAoIE1BWF9MTF9BRERSX0xFTiArIE1BWF9ORVRfQUREUl9MRU4gKSApOworCWlmICggISBpb2J1ZiApCisJCXJldHVybiAtRU5PTUVNOworCWlvYl9yZXNlcnZlICggaW9idWYsIE1BWF9MTF9IRUFERVJfTEVOICk7CisKKwkvKiBCdWlsZCB1cCBBUlAgcmVxdWVzdCAqLworCWFycGhkciA9IGlvYl9wdXQgKCBpb2J1Ziwgc2l6ZW9mICggKmFycGhkciApICk7CisJYXJwaGRyLT5hcl9ocmQgPSBsbF9wcm90b2NvbC0+bGxfcHJvdG87CisJYXJwaGRyLT5hcl9obG4gPSBsbF9wcm90b2NvbC0+bGxfYWRkcl9sZW47CisJYXJwaGRyLT5hcl9wcm8gPSBuZXRfcHJvdG9jb2wtPm5ldF9wcm90bzsKKwlhcnBoZHItPmFyX3BsbiA9IG5ldF9wcm90b2NvbC0+bmV0X2FkZHJfbGVuOworCWFycGhkci0+YXJfb3AgPSBodG9ucyAoIEFSUE9QX1JFUVVFU1QgKTsKKwltZW1jcHkgKCBpb2JfcHV0ICggaW9idWYsIGxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApLAorCQkgbmV0ZGV2LT5sbF9hZGRyLCBsbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4gKTsKKwltZW1jcHkgKCBpb2JfcHV0ICggaW9idWYsIG5ldF9wcm90b2NvbC0+bmV0X2FkZHJfbGVuICksCisJCSBzb3VyY2VfbmV0X2FkZHIsIG5ldF9wcm90b2NvbC0+bmV0X2FkZHJfbGVuICk7CisJbWVtc2V0ICggaW9iX3B1dCAoIGlvYnVmLCBsbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4gKSwKKwkJIDAsIGxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApOworCW1lbWNweSAoIGlvYl9wdXQgKCBpb2J1ZiwgbmV0X3Byb3RvY29sLT5uZXRfYWRkcl9sZW4gKSwKKwkJIGRlc3RfbmV0X2FkZHIsIG5ldF9wcm90b2NvbC0+bmV0X2FkZHJfbGVuICk7CisKKwkvKiBUcmFuc21pdCBBUlAgcmVxdWVzdCAqLworCWlmICggKCByYyA9IG5ldF90eCAoIGlvYnVmLCBuZXRkZXYsICZhcnBfcHJvdG9jb2wsIAorCQkJICAgICBuZXRkZXYtPmxsX2Jyb2FkY2FzdCApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqIElkZW50aWZ5IEFSUCBwcm90b2NvbAorICoKKyAqIEB2IG5ldF9wcm90bwkJCU5ldHdvcmstbGF5ZXIgcHJvdG9jb2wsIGluIG5ldHdvcmstZW5kaWFuIG9yZGVyCisgKiBAcmV0IGFycF9uZXRfcHJvdG9jb2wJQVJQIHByb3RvY29sLCBvciBOVUxMCisgKgorICovCitzdGF0aWMgc3RydWN0IGFycF9uZXRfcHJvdG9jb2wgKiBhcnBfZmluZF9wcm90b2NvbCAoIHVpbnQxNl90IG5ldF9wcm90byApIHsKKwlzdHJ1Y3QgYXJwX25ldF9wcm90b2NvbCAqYXJwX25ldF9wcm90b2NvbDsKKworCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggYXJwX25ldF9wcm90b2NvbCwgQVJQX05FVF9QUk9UT0NPTFMgKSB7CisJCWlmICggYXJwX25ldF9wcm90b2NvbC0+bmV0X3Byb3RvY29sLT5uZXRfcHJvdG8gPT0gbmV0X3Byb3RvICkgeworCQkJcmV0dXJuIGFycF9uZXRfcHJvdG9jb2w7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUHJvY2VzcyBpbmNvbWluZyBBUlAgcGFja2V0cworICoKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBsbF9zb3VyY2UJCUxpbmstbGF5ZXIgc291cmNlIGFkZHJlc3MKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgaGFuZGxlcyBBUlAgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyBhcyBkZXRhaWxlZCBpbiBSRkM4MjYuICBUaGUKKyAqIG1ldGhvZCBkZXRhaWxlZCB3aXRoaW4gdGhlIFJGQyBpcyBwcmV0dHkgb3B0aW1pc2VkLCBoYW5kbGluZworICogcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyB3aXRoIGJhc2ljYWxseSBhIHNpbmdsZSBjb2RlIHBhdGggYW5kCisgKiBhdm9pZGluZyB0aGUgbmVlZCBmb3IgZXh0cmFuZW91cyBBUlAgcmVxdWVzdHM7IHJlYWQgdGhlIFJGQyBmb3IKKyAqIGRldGFpbHMuCisgKi8KK3N0YXRpYyBpbnQgYXJwX3J4ICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSAgICBjb25zdCB2b2lkICpsbF9zb3VyY2UgX191bnVzZWQgKSB7CisJc3RydWN0IGFycGhkciAqYXJwaGRyID0gaW9idWYtPmRhdGE7CisJc3RydWN0IGFycF9uZXRfcHJvdG9jb2wgKmFycF9uZXRfcHJvdG9jb2w7CisJc3RydWN0IG5ldF9wcm90b2NvbCAqbmV0X3Byb3RvY29sOworCXN0cnVjdCBsbF9wcm90b2NvbCAqbGxfcHJvdG9jb2w7CisJc3RydWN0IGFycF9lbnRyeSAqYXJwOworCWludCBtZXJnZSA9IDA7CisKKwkvKiBJZGVudGlmeSBuZXR3b3JrLWxheWVyIGFuZCBsaW5rLWxheWVyIHByb3RvY29scyAqLworCWFycF9uZXRfcHJvdG9jb2wgPSBhcnBfZmluZF9wcm90b2NvbCAoIGFycGhkci0+YXJfcHJvICk7CisJaWYgKCAhIGFycF9uZXRfcHJvdG9jb2wgKQorCQlnb3RvIGRvbmU7CisJbmV0X3Byb3RvY29sID0gYXJwX25ldF9wcm90b2NvbC0+bmV0X3Byb3RvY29sOworCWxsX3Byb3RvY29sID0gbmV0ZGV2LT5sbF9wcm90b2NvbDsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoICggYXJwaGRyLT5hcl9ocmQgIT0gbGxfcHJvdG9jb2wtPmxsX3Byb3RvICkgfHwKKwkgICAgICggYXJwaGRyLT5hcl9obG4gIT0gbGxfcHJvdG9jb2wtPmxsX2FkZHJfbGVuICkgfHwKKwkgICAgICggYXJwaGRyLT5hcl9wbG4gIT0gbmV0X3Byb3RvY29sLT5uZXRfYWRkcl9sZW4gKSApCisJCWdvdG8gZG9uZTsKKworCS8qIFNlZSBpZiB3ZSBoYXZlIGFuIGVudHJ5IGZvciB0aGlzIHNlbmRlciwgYW5kIHVwZGF0ZSBpdCBpZiBzbyAqLworCWFycCA9IGFycF9maW5kX2VudHJ5ICggbGxfcHJvdG9jb2wsIG5ldF9wcm90b2NvbCwKKwkJCSAgICAgICBhcnBfc2VuZGVyX3BhICggYXJwaGRyICkgKTsKKwlpZiAoIGFycCApIHsKKwkJbWVtY3B5ICggYXJwLT5sbF9hZGRyLCBhcnBfc2VuZGVyX2hhICggYXJwaGRyICksCisJCQkgYXJwaGRyLT5hcl9obG4gKTsKKwkJbWVyZ2UgPSAxOworCQlEQkcgKCAiQVJQIGNhY2hlIHVwZGF0ZTogJXMgJXMgPT4gJXMgJXNcbiIsCisJCSAgICAgIG5ldF9wcm90b2NvbC0+bmFtZSwgbmV0X3Byb3RvY29sLT5udG9hICggYXJwLT5uZXRfYWRkciApLAorCQkgICAgICBsbF9wcm90b2NvbC0+bmFtZSwgbGxfcHJvdG9jb2wtPm50b2EgKCBhcnAtPmxsX2FkZHIgKSApOworCX0KKworCS8qIFNlZSBpZiB3ZSBvd24gdGhlIHRhcmdldCBwcm90b2NvbCBhZGRyZXNzICovCisJaWYgKCBhcnBfbmV0X3Byb3RvY29sLT5jaGVjayAoIG5ldGRldiwgYXJwX3RhcmdldF9wYSAoIGFycGhkciApICkgIT0gMCkKKwkJZ290byBkb25lOworCQorCS8qIENyZWF0ZSBuZXcgQVJQIHRhYmxlIGVudHJ5IGlmIG5lY2Vzc2FyeSAqLworCWlmICggISBtZXJnZSApIHsKKwkJYXJwID0gJmFycF90YWJsZVtuZXh0X25ld19hcnBfZW50cnkrKyAlIE5VTV9BUlBfRU5UUklFU107CisJCWFycC0+bGxfcHJvdG9jb2wgPSBsbF9wcm90b2NvbDsKKwkJYXJwLT5uZXRfcHJvdG9jb2wgPSBuZXRfcHJvdG9jb2w7CisJCW1lbWNweSAoIGFycC0+bGxfYWRkciwgYXJwX3NlbmRlcl9oYSAoIGFycGhkciApLAorCQkJIGFycGhkci0+YXJfaGxuICk7CisJCW1lbWNweSAoIGFycC0+bmV0X2FkZHIsIGFycF9zZW5kZXJfcGEgKCBhcnBoZHIgKSwKKwkJCSBhcnBoZHItPmFyX3Bsbik7CisJCURCRyAoICJBUlAgY2FjaGUgYWRkOiAlcyAlcyA9PiAlcyAlc1xuIiwKKwkJICAgICAgbmV0X3Byb3RvY29sLT5uYW1lLCBuZXRfcHJvdG9jb2wtPm50b2EgKCBhcnAtPm5ldF9hZGRyICksCisJCSAgICAgIGxsX3Byb3RvY29sLT5uYW1lLCBsbF9wcm90b2NvbC0+bnRvYSAoIGFycC0+bGxfYWRkciApICk7CisJfQorCisJLyogSWYgaXQncyBub3QgYSByZXF1ZXN0LCB0aGVyZSdzIG5vdGhpbmcgbW9yZSB0byBkbyAqLworCWlmICggYXJwaGRyLT5hcl9vcCAhPSBodG9ucyAoIEFSUE9QX1JFUVVFU1QgKSApCisJCWdvdG8gZG9uZTsKKworCS8qIENoYW5nZSByZXF1ZXN0IHRvIGEgcmVwbHkgKi8KKwlEQkcgKCAiQVJQIHJlcGx5OiAlcyAlcyA9PiAlcyAlc1xuIiwgbmV0X3Byb3RvY29sLT5uYW1lLAorCSAgICAgIG5ldF9wcm90b2NvbC0+bnRvYSAoIGFycF90YXJnZXRfcGEgKCBhcnBoZHIgKSApLAorCSAgICAgIGxsX3Byb3RvY29sLT5uYW1lLCBsbF9wcm90b2NvbC0+bnRvYSAoIG5ldGRldi0+bGxfYWRkciApICk7CisJYXJwaGRyLT5hcl9vcCA9IGh0b25zICggQVJQT1BfUkVQTFkgKTsKKwltZW1zd2FwICggYXJwX3NlbmRlcl9oYSAoIGFycGhkciApLCBhcnBfdGFyZ2V0X2hhICggYXJwaGRyICksCisJCSBhcnBoZHItPmFyX2hsbiArIGFycGhkci0+YXJfcGxuICk7CisJbWVtY3B5ICggYXJwX3NlbmRlcl9oYSAoIGFycGhkciApLCBuZXRkZXYtPmxsX2FkZHIsIGFycGhkci0+YXJfaGxuICk7CisKKwkvKiBTZW5kIHJlcGx5ICovCisJbmV0X3R4ICggaW9iX2Rpc293biAoIGlvYnVmICksIG5ldGRldiwgJmFycF9wcm90b2NvbCwKKwkJIGFycF90YXJnZXRfaGEgKCBhcnBoZHIgKSApOworCisgZG9uZToKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVHJhbnNjcmliZSBBUlAgYWRkcmVzcworICoKKyAqIEB2IG5ldF9hZGRyCUFSUCBhZGRyZXNzCisgKiBAcmV0IHN0cmluZwkiPEFSUD4iCisgKgorICogVGhpcyBvcGVyYXRpb24gaXMgbWVhbmluZ2xlc3MgZm9yIHRoZSBBUlAgcHJvdG9jb2wuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogYXJwX250b2EgKCBjb25zdCB2b2lkICpuZXRfYWRkciBfX3VudXNlZCApIHsKKwlyZXR1cm4gIjxBUlA+IjsKK30KKworLyoqIEFSUCBwcm90b2NvbCAqLworc3RydWN0IG5ldF9wcm90b2NvbCBhcnBfcHJvdG9jb2wgX19uZXRfcHJvdG9jb2wgPSB7CisJLm5hbWUgPSAiQVJQIiwKKwkubmV0X3Byb3RvID0gaHRvbnMgKCBFVEhfUF9BUlAgKSwKKwkucnggPSBhcnBfcngsCisJLm50b2EgPSBhcnBfbnRvYSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvY2FjaGVkaGNwLmMgYi9ncHhlL3NyYy9uZXQvY2FjaGVkaGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmMzQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9jYWNoZWRoY3AuYwpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdweGUvZGhjcC5oPgorI2luY2x1ZGUgPGdweGUvZGhjcHBrdC5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvdWFjY2Vzcy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBDYWNoZWQgREhDUCBwYWNrZXQgaGFuZGxpbmcKKyAqCisgKi8KKworLyoqCisgKiBTdG9yZSBjYWNoZWQgREhDUEFDSyBwYWNrZXQKKyAqCisgKiBAdiBkYXRhCQlVc2VyIHBvaW50ZXIgdG8gY2FjaGVkIERIQ1AgcGFja2V0IGRhdGEKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGNhY2hlZCBESENQIHBhY2tldCBkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYworICogZ2V0X2NhY2hlZF9kaGNwYWNrKCkgaGFuZGxlci4KKyAqLwordm9pZCBzdG9yZV9jYWNoZWRfZGhjcGFjayAoIHVzZXJwdHJfdCBkYXRhLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdDsKKwlzdHJ1Y3QgZGhjcGhkciAqZGhjcGhkcjsKKwlzdHJ1Y3Qgc2V0dGluZ3MgKnBhcmVudDsKKwlpbnQgcmM7CisKKwkvKiBDcmVhdGUgREhDUCBwYWNrZXQgKi8KKwlkaGNwcGt0ID0gemFsbG9jICggc2l6ZW9mICggKmRoY3Bwa3QgKSArIGxlbiApOworCWlmICggISBkaGNwcGt0ICkKKwkJcmV0dXJuOworCisJLyogRmlsbCBpbiBkYXRhIGZvciBESENQIHBhY2tldCAqLworCWRoY3BoZHIgPSAoICggKCB2b2lkICogKSBkaGNwcGt0ICkgKyBzaXplb2YgKCAqIGRoY3Bwa3QgKSApOworCWNvcHlfZnJvbV91c2VyICggZGhjcGhkciwgZGF0YSwgMCwgbGVuICk7CisJZGhjcHBrdF9pbml0ICggZGhjcHBrdCwgZGhjcGhkciwgbGVuICk7CisJREJHX0hEICggZGhjcHBrdC0+b3B0aW9ucy5kYXRhLCBkaGNwcGt0LT5vcHRpb25zLmxlbiApOworCisJLyogUmVnaXN0ZXIgc2V0dGluZ3Mgb24gdGhlIGxhc3Qgb3BlbmVkIG5ldHdvcmsgZGV2aWNlLgorCSAqIFRoaXMgd2lsbCBoYXZlIHRoZSBlZmZlY3Qgb2YgcmVnaXN0ZXJpbmcgY2FjaGVkIHNldHRpbmdzCisJICogd2l0aCBhIG5ldHdvcmsgZGV2aWNlIHdoZW4gImRoY3AgbmV0WCIgaXMgcGVyZm9ybWVkIGZvciB0aGF0CisJICogZGV2aWNlLCB3aGljaCBpcyB1c3VhbGx5IHdoYXQgd2Ugd2FudC4KKwkgKi8KKwlwYXJlbnQgPSBuZXRkZXZfc2V0dGluZ3MgKCBsYXN0X29wZW5lZF9uZXRkZXYoKSApOworCWlmICggKCByYyA9IHJlZ2lzdGVyX3NldHRpbmdzICggJmRoY3Bwa3QtPnNldHRpbmdzLCBwYXJlbnQgKSApICE9IDAgKQorCQlEQkcgKCAiREhDUCBjb3VsZCBub3QgcmVnaXN0ZXIgY2FjaGVkIHNldHRpbmdzOiAlc1xuIiwKKwkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisKKwlkaGNwcGt0X3B1dCAoIGRoY3Bwa3QgKTsKKworCURCRyAoICJESENQIHJlZ2lzdGVyZWQgY2FjaGVkIHNldHRpbmdzXG4iICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvZGhjcG9wdHMuYyBiL2dweGUvc3JjL25ldC9kaGNwb3B0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODJjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvZGhjcG9wdHMuYwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3AuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3BvcHRzLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIERIQ1Agb3B0aW9ucworICoKKyAqLworCisvKioKKyAqIE9idGFpbiBwcmludGFibGUgdmVyc2lvbiBvZiBhIERIQ1Agb3B0aW9uIHRhZworICoKKyAqIEB2IHRhZwkJREhDUCBvcHRpb24gdGFnCisgKiBAcmV0IG5hbWUJCVN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGFnCisgKgorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKiBkaGNwX3RhZ19uYW1lICggdW5zaWduZWQgaW50IHRhZyApIHsKKwlzdGF0aWMgY2hhciBuYW1lWzhdOworCisJaWYgKCBESENQX0lTX0VOQ0FQX09QVCAoIHRhZyApICkgeworCQlzbnByaW50ZiAoIG5hbWUsIHNpemVvZiAoIG5hbWUgKSwgIiVkLiVkIiwKKwkJCSAgIERIQ1BfRU5DQVBTVUxBVE9SICggdGFnICksCisJCQkgICBESENQX0VOQ0FQU1VMQVRFRCAoIHRhZyApICk7CisJfSBlbHNlIHsKKwkJc25wcmludGYgKCBuYW1lLCBzaXplb2YgKCBuYW1lICksICIlZCIsIHRhZyApOworCX0KKwlyZXR1cm4gbmFtZTsKK30KKworLyoqCisgKiBHZXQgcG9pbnRlciB0byBESENQIG9wdGlvbgorICoKKyAqIEB2IG9wdGlvbnMJCURIQ1Agb3B0aW9ucyBibG9jaworICogQHYgb2Zmc2V0CQlPZmZzZXQgd2l0aGluIG9wdGlvbnMgYmxvY2sKKyAqIEByZXQgb3B0aW9uCQlESENQIG9wdGlvbgorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBzdHJ1Y3QgZGhjcF9vcHRpb24gKgorZGhjcF9vcHRpb24gKCBzdHJ1Y3QgZGhjcF9vcHRpb25zICpvcHRpb25zLCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICkgeworCXJldHVybiAoICggc3RydWN0IGRoY3Bfb3B0aW9uICogKSAoIG9wdGlvbnMtPmRhdGEgKyBvZmZzZXQgKSApOworfQorCisvKioKKyAqIEdldCBvZmZzZXQgb2YgYSBESENQIG9wdGlvbgorICoKKyAqIEB2IG9wdGlvbnMJCURIQ1Agb3B0aW9ucyBibG9jaworICogQHYgb3B0aW9uCQlESENQIG9wdGlvbgorICogQHJldCBvZmZzZXQJCU9mZnNldCB3aXRoaW4gb3B0aW9ucyBibG9jaworICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSBpbnQKK2RoY3Bfb3B0aW9uX29mZnNldCAoIHN0cnVjdCBkaGNwX29wdGlvbnMgKm9wdGlvbnMsCisJCSAgICAgc3RydWN0IGRoY3Bfb3B0aW9uICpvcHRpb24gKSB7CisJcmV0dXJuICggKCAoIHZvaWQgKiApIG9wdGlvbiApIC0gb3B0aW9ucy0+ZGF0YSApOworfQorCisvKioKKyAqIENhbGN1bGF0ZSBsZW5ndGggb2YgYW55IERIQ1Agb3B0aW9uCisgKgorICogQHYgb3B0aW9uCQlESENQIG9wdGlvbgorICogQHJldCBsZW4JCUxlbmd0aCAoaW5jbHVkaW5nIHRhZyBhbmQgbGVuZ3RoIGZpZWxkKQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGRoY3Bfb3B0aW9uX2xlbiAoIHN0cnVjdCBkaGNwX29wdGlvbiAqb3B0aW9uICkgeworCWlmICggKCBvcHRpb24tPnRhZyA9PSBESENQX0VORCApIHx8ICggb3B0aW9uLT50YWcgPT0gREhDUF9QQUQgKSApIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuICggb3B0aW9uLT5sZW4gKyBESENQX09QVElPTl9IRUFERVJfTEVOICk7CisJfQorfQorCisvKioKKyAqIEZpbmQgREhDUCBvcHRpb24gd2l0aGluIERIQ1Agb3B0aW9ucyBibG9jaywgYW5kIGl0cyBlbmNhcHN1bGF0b3IgKGlmIGFueSkKKyAqCisgKiBAdiBvcHRpb25zCQlESENQIG9wdGlvbnMgYmxvY2sKKyAqIEB2IHRhZwkJREhDUCBvcHRpb24gdGFnIHRvIHNlYXJjaCBmb3IKKyAqIEByZXQgZW5jYXBfb2Zmc2V0CU9mZnNldCBvZiBlbmNhcHN1bGF0aW5nIERIQ1Agb3B0aW9uCisgKiBAcmV0IG9mZnNldAkJT2Zmc2V0IG9mIERIQ1Agb3B0aW9uLCBvciBuZWdhdGl2ZSBlcnJvcgorICoKKyAqIFNlYXJjaGVzIGZvciB0aGUgREhDUCBvcHRpb24gbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB0YWcgd2l0aGluIHRoZQorICogREhDUCBvcHRpb24gYmxvY2suICBFbmNhcHN1bGF0ZWQgb3B0aW9ucyBtYXkgYmUgc2VhcmNoZWQgZm9yIGJ5CisgKiB1c2luZyBESENQX0VOQ0FQX09QVCgpIHRvIGNvbnN0cnVjdCB0aGUgdGFnIHZhbHVlLgorICoKKyAqIElmIHRoZSBvcHRpb24gaXMgZW5jYXBzdWxhdGVkLCBhbmQgQGMgZW5jYXBfb2Zmc2V0IGlzIG5vbi1OVUxMLCBpdAorICogd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgb2Zmc2V0IG9mIHRoZSBlbmNhcHN1bGF0aW5nIG9wdGlvbi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgZGVzaWduZWQgdG8gYmUgcGFyYW5vaWQuICBJdCBkb2VzIG5vdCBhc3N1bWUgdGhhdAorICogdGhlIG9wdGlvbiBkYXRhIGlzIHdlbGwtZm9ybWF0dGVkLCBhbmQgc28gbXVzdCBndWFyZCBhZ2FpbnN0IGZsYXdzCisgKiBzdWNoIGFzIG9wdGlvbnMgbWlzc2luZyBhIEBjIERIQ1BfRU5EIHRlcm1pbmF0b3IsIG9yIG9wdGlvbnMgd2hvc2UKKyAqIGxlbmd0aCB3b3VsZCB0YWtlIHRoZW0gYmV5b25kIHRoZSBlbmQgb2YgdGhlIGRhdGEgYmxvY2suCisgKi8KK3N0YXRpYyBpbnQgZmluZF9kaGNwX29wdGlvbl93aXRoX2VuY2FwICggc3RydWN0IGRoY3Bfb3B0aW9ucyAqb3B0aW9ucywKKwkJCQkJIHVuc2lnbmVkIGludCB0YWcsCisJCQkJCSBpbnQgKmVuY2FwX29mZnNldCApIHsKKwl1bnNpZ25lZCBpbnQgb3JpZ2luYWxfdGFnIF9fYXR0cmlidXRlX18gKCggdW51c2VkICkpID0gdGFnOworCXN0cnVjdCBkaGNwX29wdGlvbiAqb3B0aW9uOworCWludCBvZmZzZXQgPSAwOworCXNzaXplX3QgcmVtYWluaW5nID0gb3B0aW9ucy0+bGVuOworCXVuc2lnbmVkIGludCBvcHRpb25fbGVuOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCB0YWcgPT0gREhDUF9QQUQgKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qIFNlYXJjaCBmb3Igb3B0aW9uICovCisJd2hpbGUgKCByZW1haW5pbmcgKSB7CisJCS8qIENhbGN1bGF0ZSBsZW5ndGggb2YgdGhpcyBvcHRpb24uICBBYm9ydCBwcm9jZXNzaW5nCisJCSAqIGlmIHRoZSBsZW5ndGggaXMgbWFsZm9ybWVkIChpLmUuIHRha2VzIHVzIGJleW9uZAorCQkgKiB0aGUgZW5kIG9mIHRoZSBkYXRhIGJsb2NrKS4KKwkJICovCisJCW9wdGlvbiA9IGRoY3Bfb3B0aW9uICggb3B0aW9ucywgb2Zmc2V0ICk7CisJCW9wdGlvbl9sZW4gPSBkaGNwX29wdGlvbl9sZW4gKCBvcHRpb24gKTsKKwkJcmVtYWluaW5nIC09IG9wdGlvbl9sZW47CisJCWlmICggcmVtYWluaW5nIDwgMCApCisJCQlicmVhazsKKwkJLyogQ2hlY2sgZm9yIGV4cGxpY2l0IGVuZCBtYXJrZXIgKi8KKwkJaWYgKCBvcHRpb24tPnRhZyA9PSBESENQX0VORCApIHsKKwkJCWlmICggdGFnID09IERIQ1BfRU5EICkKKwkJCQkvKiBTcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIGNhbGxlciBpcyBpbnRlcmVzdGVkCisJCQkJICogaW4gd2hldGhlciB3ZSBoYXZlIHRoaXMgbWFya2VyIG9yIG5vdC4KKwkJCQkgKi8KKwkJCQlyZXR1cm4gb2Zmc2V0OworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJCS8qIENoZWNrIGZvciBtYXRjaGluZyB0YWcgKi8KKwkJaWYgKCBvcHRpb24tPnRhZyA9PSB0YWcgKSB7CisJCQlEQkdDICggb3B0aW9ucywgIkRIQ1BPUFQgJXAgZm91bmQgJXMgKGxlbmd0aCAlZClcbiIsCisJCQkgICAgICAgb3B0aW9ucywgZGhjcF90YWdfbmFtZSAoIG9yaWdpbmFsX3RhZyApLAorCQkJICAgICAgIG9wdGlvbl9sZW4gKTsKKwkJCXJldHVybiBvZmZzZXQ7CisJCX0KKwkJLyogQ2hlY2sgZm9yIHN0YXJ0IG9mIG1hdGNoaW5nIGVuY2Fwc3VsYXRpb24gYmxvY2sgKi8KKwkJaWYgKCBESENQX0lTX0VOQ0FQX09QVCAoIHRhZyApICYmCisJCSAgICAgKCBvcHRpb24tPnRhZyA9PSBESENQX0VOQ0FQU1VMQVRPUiAoIHRhZyApICkgKSB7CisJCQlpZiAoIGVuY2FwX29mZnNldCApCisJCQkJKmVuY2FwX29mZnNldCA9IG9mZnNldDsKKwkJCS8qIENvbnRpbnVlIHNlYXJjaCB3aXRoaW4gZW5jYXBzdWxhdGVkIG9wdGlvbiBibG9jayAqLworCQkJdGFnID0gREhDUF9FTkNBUFNVTEFURUQgKCB0YWcgKTsKKwkJCXJlbWFpbmluZyA9IG9wdGlvbl9sZW47CisJCQlvZmZzZXQgKz0gREhDUF9PUFRJT05fSEVBREVSX0xFTjsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9mZnNldCArPSBvcHRpb25fbGVuOworCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqIFJlc2l6ZSBhIERIQ1Agb3B0aW9uCisgKgorICogQHYgb3B0aW9ucwkJREhDUCBvcHRpb24gYmxvY2sKKyAqIEB2IG9mZnNldAkJT2Zmc2V0IG9mIG9wdGlvbiB0byByZXNpemUKKyAqIEB2IGVuY2FwX29mZnNldAlPZmZzZXQgb2YgZW5jYXBzdWxhdGluZyBvZmZzZXQgKG9yIC12ZSBmb3Igbm9uZSkKKyAqIEB2IG9sZF9sZW4JCU9sZCBsZW5ndGggKGluY2x1ZGluZyBoZWFkZXIpCisgKiBAdiBuZXdfbGVuCQlOZXcgbGVuZ3RoIChpbmNsdWRpbmcgaGVhZGVyKQorICogQHYgY2FuX3JlYWxsb2MJQ2FuIHJlYWxsb2NhdGUgb3B0aW9ucyBkYXRhIGlmIG5lY2Vzc2FyeQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgcmVzaXplX2RoY3Bfb3B0aW9uICggc3RydWN0IGRoY3Bfb3B0aW9ucyAqb3B0aW9ucywKKwkJCQlpbnQgb2Zmc2V0LCBpbnQgZW5jYXBfb2Zmc2V0LAorCQkJCXNpemVfdCBvbGRfbGVuLCBzaXplX3QgbmV3X2xlbiwKKwkJCQlpbnQgY2FuX3JlYWxsb2MgKSB7CisJc3RydWN0IGRoY3Bfb3B0aW9uICplbmNhcHN1bGF0b3I7CisJc3RydWN0IGRoY3Bfb3B0aW9uICpvcHRpb247CisJc3NpemVfdCBkZWx0YSA9ICggbmV3X2xlbiAtIG9sZF9sZW4gKTsKKwlzaXplX3QgbmV3X29wdGlvbnNfbGVuOworCXNpemVfdCBuZXdfZW5jYXBzdWxhdG9yX2xlbjsKKwl2b2lkICpuZXdfZGF0YTsKKwl2b2lkICpzb3VyY2U7CisJdm9pZCAqZGVzdDsKKwl2b2lkICplbmQ7CisKKwkvKiBDaGVjayBmb3Igc3VmZmljaWVudCBzcGFjZSwgYW5kIHVwZGF0ZSBsZW5ndGggZmllbGRzICovCisJaWYgKCBuZXdfbGVuID4gREhDUF9NQVhfTEVOICkgeworCQlEQkdDICggb3B0aW9ucywgIkRIQ1BPUFQgJXAgb3Zlcmxlbmd0aCBvcHRpb25cbiIsIG9wdGlvbnMgKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCW5ld19vcHRpb25zX2xlbiA9ICggb3B0aW9ucy0+bGVuICsgZGVsdGEgKTsKKwlpZiAoIG5ld19vcHRpb25zX2xlbiA+IG9wdGlvbnMtPm1heF9sZW4gKSB7CisJCS8qIFJlYWxsb2NhdGUgb3B0aW9ucyBibG9jayBpZiBhbGxvd2VkIHRvIGRvIHNvLiAqLworCQlpZiAoIGNhbl9yZWFsbG9jICkgeworCQkJbmV3X2RhdGEgPSByZWFsbG9jICggb3B0aW9ucy0+ZGF0YSwgbmV3X29wdGlvbnNfbGVuICk7CisJCQlpZiAoICEgbmV3X2RhdGEgKSB7CisJCQkJREJHQyAoIG9wdGlvbnMsICJESENQT1BUICVwIGNvdWxkIG5vdCAiCisJCQkJICAgICAgICJyZWFsbG9jYXRlIHRvICV6ZCBieXRlc1xuIiwgb3B0aW9ucywKKwkJCQkgICAgICAgbmV3X29wdGlvbnNfbGVuICk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlvcHRpb25zLT5kYXRhID0gbmV3X2RhdGE7CisJCQlvcHRpb25zLT5tYXhfbGVuID0gbmV3X29wdGlvbnNfbGVuOworCQl9IGVsc2UgeworCQkJREJHQyAoIG9wdGlvbnMsICJESENQT1BUICVwIG91dCBvZiBzcGFjZVxuIiwgb3B0aW9ucyApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJaWYgKCBlbmNhcF9vZmZzZXQgPj0gMCApIHsKKwkJZW5jYXBzdWxhdG9yID0gZGhjcF9vcHRpb24gKCBvcHRpb25zLCBlbmNhcF9vZmZzZXQgKTsKKwkJbmV3X2VuY2Fwc3VsYXRvcl9sZW4gPSAoIGVuY2Fwc3VsYXRvci0+bGVuICsgZGVsdGEgKTsKKwkJaWYgKCBuZXdfZW5jYXBzdWxhdG9yX2xlbiA+IERIQ1BfTUFYX0xFTiApIHsKKwkJCURCR0MgKCBvcHRpb25zLCAiREhDUE9QVCAlcCBvdmVybGVuZ3RoIGVuY2Fwc3VsYXRvclxuIiwKKwkJCSAgICAgICBvcHRpb25zICk7CisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfQorCQllbmNhcHN1bGF0b3ItPmxlbiA9IG5ld19lbmNhcHN1bGF0b3JfbGVuOworCX0KKwlvcHRpb25zLT5sZW4gPSBuZXdfb3B0aW9uc19sZW47CisKKwkvKiBNb3ZlIHJlbWFpbmRlciBvZiBvcHRpb24gZGF0YSAqLworCW9wdGlvbiA9IGRoY3Bfb3B0aW9uICggb3B0aW9ucywgb2Zmc2V0ICk7CisJc291cmNlID0gKCAoICggdm9pZCAqICkgb3B0aW9uICkgKyBvbGRfbGVuICk7CisJZGVzdCA9ICggKCAoIHZvaWQgKiApIG9wdGlvbiApICsgbmV3X2xlbiApOworCWVuZCA9ICggb3B0aW9ucy0+ZGF0YSArIG9wdGlvbnMtPm1heF9sZW4gKTsKKwltZW1tb3ZlICggZGVzdCwgc291cmNlLCAoIGVuZCAtIGRlc3QgKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2V0IHZhbHVlIG9mIERIQ1Agb3B0aW9uCisgKgorICogQHYgb3B0aW9ucwkJREhDUCBvcHRpb24gYmxvY2sKKyAqIEB2IHRhZwkJREhDUCBvcHRpb24gdGFnCisgKiBAdiBkYXRhCQlOZXcgdmFsdWUgZm9yIERIQ1Agb3B0aW9uCisgKiBAdiBsZW4JCUxlbmd0aCBvZiB2YWx1ZSwgaW4gYnl0ZXMKKyAqIEB2IGNhbl9yZWFsbG9jCUNhbiByZWFsbG9jYXRlIG9wdGlvbnMgZGF0YSBpZiBuZWNlc3NhcnkKKyAqIEByZXQgb2Zmc2V0CQlPZmZzZXQgb2YgREhDUCBvcHRpb24sIG9yIG5lZ2F0aXZlIGVycm9yCisgKgorICogU2V0cyB0aGUgdmFsdWUgb2YgYSBESENQIG9wdGlvbiB3aXRoaW4gdGhlIG9wdGlvbnMgYmxvY2suICBUaGUKKyAqIG9wdGlvbiBtYXkgb3IgbWF5IG5vdCBhbHJlYWR5IGV4aXN0LiAgRW5jYXBzdWxhdG9ycyB3aWxsIGJlIGNyZWF0ZWQKKyAqIChhbmQgZGVsZXRlZCkgYXMgbmVjZXNzYXJ5LgorICoKKyAqIFRoaXMgY2FsbCBtYXkgZmFpbCBkdWUgdG8gaW5zdWZmaWNpZW50IHNwYWNlIGluIHRoZSBvcHRpb25zIGJsb2NrLgorICogSWYgaXQgZG9lcyBmYWlsLCBhbmQgdGhlIG9wdGlvbiBleGlzdGVkIHByZXZpb3VzbHksIHRoZSBvcHRpb24gd2lsbAorICogYmUgbGVmdCB3aXRoIGl0cyBvcmlnaW5hbCB2YWx1ZS4KKyAqLworc3RhdGljIGludCBzZXRfZGhjcF9vcHRpb24gKCBzdHJ1Y3QgZGhjcF9vcHRpb25zICpvcHRpb25zLCB1bnNpZ25lZCBpbnQgdGFnLAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLAorCQkJICAgICBpbnQgY2FuX3JlYWxsb2MgKSB7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgZW1wdHlfZW5jYXBzdWxhdG9yW10gPSB7IERIQ1BfRU5EIH07CisJaW50IG9mZnNldDsKKwlpbnQgZW5jYXBfb2Zmc2V0ID0gLTE7CisJaW50IGNyZWF0aW9uX29mZnNldDsKKwlzdHJ1Y3QgZGhjcF9vcHRpb24gKm9wdGlvbjsKKwl1bnNpZ25lZCBpbnQgZW5jYXBfdGFnID0gREhDUF9FTkNBUFNVTEFUT1IgKCB0YWcgKTsKKwlzaXplX3Qgb2xkX2xlbiA9IDA7CisJc2l6ZV90IG5ld19sZW4gPSAoIGxlbiA/ICggbGVuICsgREhDUF9PUFRJT05fSEVBREVSX0xFTiApIDogMCApOworCWludCByYzsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggdGFnID09IERIQ1BfUEFEICkKKwkJcmV0dXJuIC1FTk9UVFk7CisKKwljcmVhdGlvbl9vZmZzZXQgPSBmaW5kX2RoY3Bfb3B0aW9uX3dpdGhfZW5jYXAgKCBvcHRpb25zLCBESENQX0VORCwKKwkJCQkJCQlOVUxMICk7CisJaWYgKCBjcmVhdGlvbl9vZmZzZXQgPCAwICkKKwkJY3JlYXRpb25fb2Zmc2V0ID0gb3B0aW9ucy0+bGVuOworCS8qIEZpbmQgb2xkIGluc3RhbmNlIG9mIHRoaXMgb3B0aW9uLCBpZiBhbnkgKi8KKwlvZmZzZXQgPSBmaW5kX2RoY3Bfb3B0aW9uX3dpdGhfZW5jYXAgKCBvcHRpb25zLCB0YWcsICZlbmNhcF9vZmZzZXQgKTsKKwlpZiAoIG9mZnNldCA+PSAwICkgeworCQlvbGRfbGVuID0gZGhjcF9vcHRpb25fbGVuICggZGhjcF9vcHRpb24gKCBvcHRpb25zLCBvZmZzZXQgKSApOworCQlEQkdDICggb3B0aW9ucywgIkRIQ1BPUFQgJXAgcmVzaXppbmcgJXMgZnJvbSAlemQgdG8gJXpkXG4iLAorCQkgICAgICAgb3B0aW9ucywgZGhjcF90YWdfbmFtZSAoIHRhZyApLCBvbGRfbGVuLCBuZXdfbGVuICk7CisJfSBlbHNlIHsKKwkJREJHQyAoIG9wdGlvbnMsICJESENQT1BUICVwIGNyZWF0aW5nICVzIChsZW5ndGggJXpkKVxuIiwKKwkJICAgICAgIG9wdGlvbnMsIGRoY3BfdGFnX25hbWUgKCB0YWcgKSwgbmV3X2xlbiApOworCX0KKworCS8qIEVuc3VyZSB0aGF0IGVuY2Fwc3VsYXRvciBleGlzdHMsIGlmIHJlcXVpcmVkICovCisJaWYgKCBlbmNhcF90YWcgKSB7CisJCWlmICggZW5jYXBfb2Zmc2V0IDwgMCApCisJCQllbmNhcF9vZmZzZXQgPSBzZXRfZGhjcF9vcHRpb24gKCBvcHRpb25zLCBlbmNhcF90YWcsCisJCQkJCQkJIGVtcHR5X2VuY2Fwc3VsYXRvciwgMSwKKwkJCQkJCQkgY2FuX3JlYWxsb2MgKTsKKwkJaWYgKCBlbmNhcF9vZmZzZXQgPCAwICkKKwkJCXJldHVybiBlbmNhcF9vZmZzZXQ7CisJCWNyZWF0aW9uX29mZnNldCA9ICggZW5jYXBfb2Zmc2V0ICsgREhDUF9PUFRJT05fSEVBREVSX0xFTiApOworCX0KKworCS8qIENyZWF0ZSBuZXcgb3B0aW9uIGlmIG5lY2Vzc2FyeSAqLworCWlmICggb2Zmc2V0IDwgMCApCisJCW9mZnNldCA9IGNyZWF0aW9uX29mZnNldDsKKworCS8qIFJlc2l6ZSBvcHRpb24gdG8gZml0IG5ldyBkYXRhICovCisJaWYgKCAoIHJjID0gcmVzaXplX2RoY3Bfb3B0aW9uICggb3B0aW9ucywgb2Zmc2V0LCBlbmNhcF9vZmZzZXQsCisJCQkJCSBvbGRfbGVuLCBuZXdfbGVuLAorCQkJCQkgY2FuX3JlYWxsb2MgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBDb3B5IG5ldyBkYXRhIGludG8gb3B0aW9uLCBpZiBhcHBsaWNhYmxlICovCisJaWYgKCBsZW4gKSB7CisJCW9wdGlvbiA9IGRoY3Bfb3B0aW9uICggb3B0aW9ucywgb2Zmc2V0ICk7CisJCW9wdGlvbi0+dGFnID0gdGFnOworCQlvcHRpb24tPmxlbiA9IGxlbjsKKwkJbWVtY3B5ICggJm9wdGlvbi0+ZGF0YSwgZGF0YSwgbGVuICk7CisJfQorCisJLyogRGVsZXRlIGVuY2Fwc3VsYXRvciBpZiB0aGVyZSdzIG5vdGhpbmcgZWxzZSBsZWZ0IGluIGl0ICovCisJaWYgKCBlbmNhcF9vZmZzZXQgPj0gMCApIHsKKwkJb3B0aW9uID0gZGhjcF9vcHRpb24gKCBvcHRpb25zLCBlbmNhcF9vZmZzZXQgKTsKKwkJaWYgKCBvcHRpb24tPmxlbiA8PSAxICkKKwkJCXNldF9kaGNwX29wdGlvbiAoIG9wdGlvbnMsIGVuY2FwX3RhZywgTlVMTCwgMCwgMCApOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qKgorICogU3RvcmUgdmFsdWUgb2YgREhDUCBvcHRpb24gc2V0dGluZworICoKKyAqIEB2IG9wdGlvbnMJCURIQ1Agb3B0aW9uIGJsb2NrCisgKiBAdiB0YWcJCVNldHRpbmcgdGFnIG51bWJlcgorICogQHYgZGF0YQkJU2V0dGluZyBkYXRhLCBvciBOVUxMIHRvIGNsZWFyIHNldHRpbmcKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBkaGNwb3B0X3N0b3JlICggc3RydWN0IGRoY3Bfb3B0aW9ucyAqb3B0aW9ucywgdW5zaWduZWQgaW50IHRhZywKKwkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJaW50IG9mZnNldDsKKworCW9mZnNldCA9IHNldF9kaGNwX29wdGlvbiAoIG9wdGlvbnMsIHRhZywgZGF0YSwgbGVuLCAwICk7CisJaWYgKCBvZmZzZXQgPCAwICkKKwkJcmV0dXJuIG9mZnNldDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTdG9yZSB2YWx1ZSBvZiBESENQIG9wdGlvbiBzZXR0aW5nLCBleHRlbmRpbmcgb3B0aW9ucyBibG9jayBpZiBuZWNlc3NhcnkKKyAqCisgKiBAdiBvcHRpb25zCQlESENQIG9wdGlvbiBibG9jaworICogQHYgdGFnCQlTZXR0aW5nIHRhZyBudW1iZXIKKyAqIEB2IGRhdGEJCVNldHRpbmcgZGF0YSwgb3IgTlVMTCB0byBjbGVhciBzZXR0aW5nCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBzZXR0aW5nIGRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgZGhjcG9wdF9leHRlbnNpYmxlX3N0b3JlICggc3RydWN0IGRoY3Bfb3B0aW9ucyAqb3B0aW9ucywgdW5zaWduZWQgaW50IHRhZywKKwkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCWludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBzZXRfZGhjcF9vcHRpb24gKCBvcHRpb25zLCB0YWcsIGRhdGEsIGxlbiwgMSApOworCWlmICggb2Zmc2V0IDwgMCApCisJCXJldHVybiBvZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmV0Y2ggdmFsdWUgb2YgREhDUCBvcHRpb24gc2V0dGluZworICoKKyAqIEB2IG9wdGlvbnMJCURIQ1Agb3B0aW9uIGJsb2NrCisgKiBAdiB0YWcJCVNldHRpbmcgdGFnIG51bWJlcgorICogQHYgZGF0YQkJQnVmZmVyIHRvIGZpbGwgd2l0aCBzZXR0aW5nIGRhdGEKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBzZXR0aW5nIGRhdGEsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK2ludCBkaGNwb3B0X2ZldGNoICggc3RydWN0IGRoY3Bfb3B0aW9ucyAqb3B0aW9ucywgdW5zaWduZWQgaW50IHRhZywKKwkJICAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJaW50IG9mZnNldDsKKwlzdHJ1Y3QgZGhjcF9vcHRpb24gKm9wdGlvbjsKKwlzaXplX3Qgb3B0aW9uX2xlbjsKKworCW9mZnNldCA9IGZpbmRfZGhjcF9vcHRpb25fd2l0aF9lbmNhcCAoIG9wdGlvbnMsIHRhZywgTlVMTCApOworCWlmICggb2Zmc2V0IDwgMCApCisJCXJldHVybiBvZmZzZXQ7CisKKwlvcHRpb24gPSBkaGNwX29wdGlvbiAoIG9wdGlvbnMsIG9mZnNldCApOworCW9wdGlvbl9sZW4gPSBvcHRpb24tPmxlbjsKKwlpZiAoIGxlbiA+IG9wdGlvbl9sZW4gKQorCQlsZW4gPSBvcHRpb25fbGVuOworCW1lbWNweSAoIGRhdGEsIG9wdGlvbi0+ZGF0YSwgbGVuICk7CisKKwlyZXR1cm4gb3B0aW9uX2xlbjsKK30KKworLyoqCisgKiBSZWNhbGN1bGF0ZSBsZW5ndGggb2YgREhDUCBvcHRpb25zIGJsb2NrCisgKgorICogQHYgb3B0aW9ucwkJVW5pbml0aWFsaXNlZCBESENQIG9wdGlvbiBibG9jaworICoKKyAqIFRoZSAidXNlZCBsZW5ndGgiIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBiYXNlZCBvbiBzY2FubmluZyB0aHJvdWdoCisgKiB0aGUgYmxvY2sgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSBvcHRpb25zLgorICovCitzdGF0aWMgdm9pZCBkaGNwb3B0X3VwZGF0ZV9sZW4gKCBzdHJ1Y3QgZGhjcF9vcHRpb25zICpvcHRpb25zICkgeworCXN0cnVjdCBkaGNwX29wdGlvbiAqb3B0aW9uOworCWludCBvZmZzZXQgPSAwOworCXNzaXplX3QgcmVtYWluaW5nID0gb3B0aW9ucy0+bWF4X2xlbjsKKwl1bnNpZ25lZCBpbnQgb3B0aW9uX2xlbjsKKworCS8qIEZpbmQgbGFzdCBub24tcGFkIG9wdGlvbiAqLworCW9wdGlvbnMtPmxlbiA9IDA7CisJd2hpbGUgKCByZW1haW5pbmcgKSB7CisJCW9wdGlvbiA9IGRoY3Bfb3B0aW9uICggb3B0aW9ucywgb2Zmc2V0ICk7CisJCW9wdGlvbl9sZW4gPSBkaGNwX29wdGlvbl9sZW4gKCBvcHRpb24gKTsKKwkJcmVtYWluaW5nIC09IG9wdGlvbl9sZW47CisJCWlmICggcmVtYWluaW5nIDwgMCApCisJCQlicmVhazsKKwkJb2Zmc2V0ICs9IG9wdGlvbl9sZW47CisJCWlmICggb3B0aW9uLT50YWcgIT0gREhDUF9QQUQgKQorCQkJb3B0aW9ucy0+bGVuID0gb2Zmc2V0OworCX0KK30KKworLyoqCisgKiBJbml0aWFsaXNlIHByZXBvcHVsYXRlZCBibG9jayBvZiBESENQIG9wdGlvbnMKKyAqCisgKiBAdiBvcHRpb25zCQlVbmluaXRpYWxpc2VkIERIQ1Agb3B0aW9uIGJsb2NrCisgKiBAdiBkYXRhCQlNZW1vcnkgZm9yIERIQ1Agb3B0aW9uIGRhdGEKKyAqIEB2IG1heF9sZW4JCUxlbmd0aCBvZiBtZW1vcnkgZm9yIERIQ1Agb3B0aW9uIGRhdGEKKyAqCisgKiBUaGUgbWVtb3J5IGNvbnRlbnQgbXVzdCBhbHJlYWR5IGJlIGZpbGxlZCB3aXRoIHZhbGlkIERIQ1Agb3B0aW9ucy4KKyAqIEEgemVyb2VkIGJsb2NrIGNvdW50cyBhcyBhIGJsb2NrIG9mIHZhbGlkIERIQ1Agb3B0aW9ucy4KKyAqLwordm9pZCBkaGNwb3B0X2luaXQgKCBzdHJ1Y3QgZGhjcF9vcHRpb25zICpvcHRpb25zLCB2b2lkICpkYXRhLAorCQkgICAgc2l6ZV90IG1heF9sZW4gKSB7CisKKwkvKiBGaWxsIGluIGZpZWxkcyAqLworCW9wdGlvbnMtPmRhdGEgPSBkYXRhOworCW9wdGlvbnMtPm1heF9sZW4gPSBtYXhfbGVuOworCisJLyogVXBkYXRlIGxlbmd0aCAqLworCWRoY3BvcHRfdXBkYXRlX2xlbiAoIG9wdGlvbnMgKTsKKworCURCR0MgKCBvcHRpb25zLCAiREhDUE9QVCAlcCBjcmVhdGVkIChkYXRhICVwIGxlbiAlI3p4IG1heF9sZW4gJSN6eClcbiIsCisJICAgICAgIG9wdGlvbnMsIG9wdGlvbnMtPmRhdGEsIG9wdGlvbnMtPmxlbiwgb3B0aW9ucy0+bWF4X2xlbiApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L2RoY3Bwa3QuYyBiL2dweGUvc3JjL25ldC9kaGNwcGt0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhMGU2NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9kaGNwcGt0LmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3AuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3BvcHRzLmg+CisjaW5jbHVkZSA8Z3B4ZS9kaGNwcGt0Lmg+CisKKy8qKiBAZmlsZQorICoKKyAqIERIQ1AgcGFja2V0cworICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERIQ1AgcGFja2V0IHJhdyBpbnRlcmZhY2UKKyAqCisgKi8KKworLyoqCisgKiBDYWxjdWxhdGUgdXNlZCBsZW5ndGggb2YgYW4gSVB2NCBmaWVsZCB3aXRoaW4gYSBESENQIHBhY2tldAorICoKKyAqIEB2IGRhdGEJCUZpZWxkIGRhdGEKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGZpZWxkCisgKiBAcmV0IHVzZWQJCVVzZWQgbGVuZ3RoIG9mIGZpZWxkCisgKi8KK3N0YXRpYyBzaXplX3QgdXNlZF9sZW5faXB2NCAoIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gX191bnVzZWQgKSB7CisJY29uc3Qgc3RydWN0IGluX2FkZHIgKmluID0gZGF0YTsKKworCXJldHVybiAoIGluLT5zX2FkZHIgPyBzaXplb2YgKCAqaW4gKSA6IDAgKTsKK30KKworLyoqCisgKiBDYWxjdWxhdGUgdXNlZCBsZW5ndGggb2YgYSBzdHJpbmcgZmllbGQgd2l0aGluIGEgREhDUCBwYWNrZXQKKyAqCisgKiBAdiBkYXRhCQlGaWVsZCBkYXRhCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBmaWVsZAorICogQHJldCB1c2VkCQlVc2VkIGxlbmd0aCBvZiBmaWVsZAorICovCitzdGF0aWMgc2l6ZV90IHVzZWRfbGVuX3N0cmluZyAoIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJcmV0dXJuIHN0cm5sZW4gKCBkYXRhLCBsZW4gKTsKK30KKworLyoqIEEgZGVkaWNhdGVkIGZpZWxkIHdpdGhpbiBhIERIQ1AgcGFja2V0ICovCitzdHJ1Y3QgZGhjcF9wYWNrZXRfZmllbGQgeworCS8qKiBTZXR0aW5ncyB0YWcgbnVtYmVyICovCisJdW5zaWduZWQgaW50IHRhZzsKKwkvKiogT2Zmc2V0IHdpdGhpbiBESENQIHBhY2tldCAqLworCXVpbnQxNl90IG9mZnNldDsKKwkvKiogTGVuZ3RoIG9mIGZpZWxkICovCisJdWludDE2X3QgbGVuOworCS8qKiBDYWxjdWxhdGUgdXNlZCBsZW5ndGggb2YgZmllbGQKKwkgKgorCSAqIEB2IGRhdGEJRmllbGQgZGF0YQorCSAqIEB2IGxlbglMZW5ndGggb2YgZmllbGQKKwkgKiBAcmV0IHVzZWQJVXNlZCBsZW5ndGggb2YgZmllbGQKKwkgKi8KKwlzaXplX3QgKCAqIHVzZWRfbGVuICkgKCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7Cit9OworCisvKiogRGVjbGFyZSBhIGRlZGljYXRlZCBmaWVsZCB3aXRoaW4gYSBESENQIHBhY2tldAorICoKKyAqIEB2IF90YWcJCVNldHRpbmdzIHRhZyBudW1iZXIKKyAqIEB2IF9maWVsZAkJRmllbGQgbmFtZQorICogQHYgX3VzZWRfbGVuCQlGdW5jdGlvbiB0byBjYWxjdWxhdGUgdXNlZCBsZW5ndGggb2YgZmllbGQKKyAqLworI2RlZmluZSBESENQX1BBQ0tFVF9GSUVMRCggX3RhZywgX2ZpZWxkLCBfdXNlZF9sZW4gKSB7CQkJXAorCQkudGFnID0gKF90YWcpLAkJCQkJCVwKKwkJLm9mZnNldCA9IG9mZnNldG9mICggc3RydWN0IGRoY3BoZHIsIF9maWVsZCApLAkJXAorCQkubGVuID0gc2l6ZW9mICggKCAoIHN0cnVjdCBkaGNwaGRyICogKSAwICktPl9maWVsZCApLAlcCisJCS51c2VkX2xlbiA9IF91c2VkX2xlbiwJCQkJCVwKKwl9CisKKy8qKiBEZWRpY2F0ZWQgZmllbGRzIHdpdGhpbiBhIERIQ1AgcGFja2V0ICovCitzdGF0aWMgc3RydWN0IGRoY3BfcGFja2V0X2ZpZWxkIGRoY3BfcGFja2V0X2ZpZWxkc1tdID0geworCURIQ1BfUEFDS0VUX0ZJRUxEICggREhDUF9FQl9ZSUFERFIsIHlpYWRkciwgdXNlZF9sZW5faXB2NCApLAorCURIQ1BfUEFDS0VUX0ZJRUxEICggREhDUF9FQl9TSUFERFIsIHNpYWRkciwgdXNlZF9sZW5faXB2NCApLAorCURIQ1BfUEFDS0VUX0ZJRUxEICggREhDUF9URlRQX1NFUlZFUl9OQU1FLCBzbmFtZSwgdXNlZF9sZW5fc3RyaW5nICksCisJREhDUF9QQUNLRVRfRklFTEQgKCBESENQX0JPT1RGSUxFX05BTUUsIGZpbGUsIHVzZWRfbGVuX3N0cmluZyApLAorfTsKKworLyoqCisgKiBHZXQgYWRkcmVzcyBvZiBhIERIQ1AgcGFja2V0IGZpZWxkCisgKgorICogQHYgZGhjcGhkcgkJREhDUCBwYWNrZXQgaGVhZGVyCisgKiBAdiBmaWVsZAkJREhDUCBwYWNrZXQgZmllbGQKKyAqIEByZXQgZGF0YQkJUGFja2V0IGZpZWxkIGRhdGEKKyAqLworc3RhdGljIGlubGluZSB2b2lkICogZGhjcF9wYWNrZXRfZmllbGQgKCBzdHJ1Y3QgZGhjcGhkciAqZGhjcGhkciwKKwkJCQkJIHN0cnVjdCBkaGNwX3BhY2tldF9maWVsZCAqZmllbGQgKSB7CisJcmV0dXJuICggKCAoIHZvaWQgKiApIGRoY3BoZHIgKSArIGZpZWxkLT5vZmZzZXQgKTsKK30KKworLyoqCisgKiBGaW5kIERIQ1AgcGFja2V0IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gc2V0dGluZ3MgdGFnIG51bWJlcgorICoKKyAqIEB2IHRhZwkJU2V0dGluZ3MgdGFnIG51bWJlcgorICogQHJldCBmaWVsZAkJREhDUCBwYWNrZXQgZmllbGQsIG9yIE5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBkaGNwX3BhY2tldF9maWVsZCAqCitmaW5kX2RoY3BfcGFja2V0X2ZpZWxkICggdW5zaWduZWQgaW50IHRhZyApIHsKKwlzdHJ1Y3QgZGhjcF9wYWNrZXRfZmllbGQgKmZpZWxkOworCXVuc2lnbmVkIGludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgKCBzaXplb2YgKCBkaGNwX3BhY2tldF9maWVsZHMgKSAvCisJCQkgICAgc2l6ZW9mICggZGhjcF9wYWNrZXRfZmllbGRzWzBdICkgKSA7IGkrKyApIHsKKwkJZmllbGQgPSAmZGhjcF9wYWNrZXRfZmllbGRzW2ldOworCQlpZiAoIGZpZWxkLT50YWcgPT0gdGFnICkKKwkJCXJldHVybiBmaWVsZDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogU3RvcmUgdmFsdWUgb2YgREhDUCBwYWNrZXQgc2V0dGluZworICoKKyAqIEB2IGRoY3Bwa3QJCURIQ1AgcGFja2V0CisgKiBAdiB0YWcJCVNldHRpbmcgdGFnIG51bWJlcgorICogQHYgZGF0YQkJU2V0dGluZyBkYXRhLCBvciBOVUxMIHRvIGNsZWFyIHNldHRpbmcKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBkaGNwcGt0X3N0b3JlICggc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwcGt0LCB1bnNpZ25lZCBpbnQgdGFnLAorCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgZGhjcF9wYWNrZXRfZmllbGQgKmZpZWxkOworCXZvaWQgKmZpZWxkX2RhdGE7CisJaW50IHJjOworCisJLyogSWYgdGhpcyBpcyBhIHNwZWNpYWwgZmllbGQsIGZpbGwgaXQgaW4gKi8KKwlpZiAoICggZmllbGQgPSBmaW5kX2RoY3BfcGFja2V0X2ZpZWxkICggdGFnICkgKSAhPSBOVUxMICkgeworCQlpZiAoIGxlbiA+IGZpZWxkLT5sZW4gKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWZpZWxkX2RhdGEgPSBkaGNwX3BhY2tldF9maWVsZCAoIGRoY3Bwa3QtPmRoY3BoZHIsIGZpZWxkICk7CisJCW1lbXNldCAoIGZpZWxkX2RhdGEsIDAsIGZpZWxkLT5sZW4gKTsKKwkJbWVtY3B5ICggZGhjcF9wYWNrZXRfZmllbGQgKCBkaGNwcGt0LT5kaGNwaGRyLCBmaWVsZCApLAorCQkJIGRhdGEsIGxlbiApOworCQkvKiBFcmFzZSBhbnkgZXF1aXZhbGVudCBvcHRpb24gZnJvbSB0aGUgb3B0aW9ucyBibG9jayAqLworCQlkaGNwb3B0X3N0b3JlICggJmRoY3Bwa3QtPm9wdGlvbnMsIHRhZywgTlVMTCwgMCApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBPdGhlcndpc2UsIHVzZSB0aGUgZ2VuZXJpYyBvcHRpb25zIGJsb2NrICovCisJcmMgPSBkaGNwb3B0X3N0b3JlICggJmRoY3Bwa3QtPm9wdGlvbnMsIHRhZywgZGF0YSwgbGVuICk7CisKKwkvKiBVcGRhdGUgb3VyIHVzZWQtbGVuZ3RoIGZpZWxkICovCisJZGhjcHBrdC0+bGVuID0gKCBvZmZzZXRvZiAoIHN0cnVjdCBkaGNwaGRyLCBvcHRpb25zICkgKworCQkJIGRoY3Bwa3QtPm9wdGlvbnMubGVuICk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogRmV0Y2ggdmFsdWUgb2YgREhDUCBwYWNrZXQgc2V0dGluZworICoKKyAqIEB2IGRoY3Bwa3QJCURIQ1AgcGFja2V0CisgKiBAdiB0YWcJCVNldHRpbmcgdGFnIG51bWJlcgorICogQHYgZGF0YQkJQnVmZmVyIHRvIGZpbGwgd2l0aCBzZXR0aW5nIGRhdGEKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGJ1ZmZlcgorICogQHJldCBsZW4JCUxlbmd0aCBvZiBzZXR0aW5nIGRhdGEsIG9yIG5lZ2F0aXZlIGVycm9yCisgKi8KK2ludCBkaGNwcGt0X2ZldGNoICggc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwcGt0LCB1bnNpZ25lZCBpbnQgdGFnLAorCQkgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgZGhjcF9wYWNrZXRfZmllbGQgKmZpZWxkOworCXZvaWQgKmZpZWxkX2RhdGE7CisJc2l6ZV90IGZpZWxkX2xlbiA9IDA7CisJCisJLyogSWRlbnRpZnkgc3BlY2lhbCBmaWVsZCwgaWYgYW55ICovCisJaWYgKCAoIGZpZWxkID0gZmluZF9kaGNwX3BhY2tldF9maWVsZCAoIHRhZyApICkgIT0gTlVMTCApIHsKKwkJZmllbGRfZGF0YSA9IGRoY3BfcGFja2V0X2ZpZWxkICggZGhjcHBrdC0+ZGhjcGhkciwgZmllbGQgKTsKKwkJZmllbGRfbGVuID0gZmllbGQtPnVzZWRfbGVuICggZmllbGRfZGF0YSwgZmllbGQtPmxlbiApOworCX0KKworCS8qIFJldHVybiBzcGVjaWFsIGZpZWxkLCBpZiBpdCBleGlzdHMgYW5kIGlzIHBvcHVsYXRlZCAqLworCWlmICggZmllbGRfbGVuICkgeworCQlpZiAoIGxlbiA+IGZpZWxkX2xlbiApCisJCQlsZW4gPSBmaWVsZF9sZW47CisJCW1lbWNweSAoIGRhdGEsIGZpZWxkX2RhdGEsIGxlbiApOworCQlyZXR1cm4gZmllbGRfbGVuOworCX0KKworCS8qIE90aGVyd2lzZSwgdXNlIHRoZSBnZW5lcmljIG9wdGlvbnMgYmxvY2sgKi8KKwlyZXR1cm4gZGhjcG9wdF9mZXRjaCAoICZkaGNwcGt0LT5vcHRpb25zLCB0YWcsIGRhdGEsIGxlbiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERIQ1AgcGFja2V0IHNldHRpbmdzIGludGVyZmFjZQorICoKKyAqLworCisvKioKKyAqIFN0b3JlIHZhbHVlIG9mIERIQ1Agc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBzdG9yZQorICogQHYgZGF0YQkJU2V0dGluZyBkYXRhLCBvciBOVUxMIHRvIGNsZWFyIHNldHRpbmcKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZGhjcHBrdF9zZXR0aW5nc19zdG9yZSAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJICAgIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJCSAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCA9CisJCWNvbnRhaW5lcl9vZiAoIHNldHRpbmdzLCBzdHJ1Y3QgZGhjcF9wYWNrZXQsIHNldHRpbmdzICk7CisKKwlyZXR1cm4gZGhjcHBrdF9zdG9yZSAoIGRoY3Bwa3QsIHNldHRpbmctPnRhZywgZGF0YSwgbGVuICk7Cit9CisKKy8qKgorICogRmV0Y2ggdmFsdWUgb2YgREhDUCBzZXR0aW5nCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrLCBvciBOVUxMIHRvIHNlYXJjaCBhbGwgYmxvY2tzCisgKiBAdiBzZXR0aW5nCQlTZXR0aW5nIHRvIGZldGNoCisgKiBAdiBkYXRhCQlCdWZmZXIgdG8gZmlsbCB3aXRoIHNldHRpbmcgZGF0YQorICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YSwgb3IgbmVnYXRpdmUgZXJyb3IKKyAqLworc3RhdGljIGludCBkaGNwcGt0X3NldHRpbmdzX2ZldGNoICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCQkgICAgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkJICAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwcGt0ID0KKwkJY29udGFpbmVyX29mICggc2V0dGluZ3MsIHN0cnVjdCBkaGNwX3BhY2tldCwgc2V0dGluZ3MgKTsKKworCXJldHVybiBkaGNwcGt0X2ZldGNoICggZGhjcHBrdCwgc2V0dGluZy0+dGFnLCBkYXRhLCBsZW4gKTsKK30KKworLyoqIERIQ1Agc2V0dGluZ3Mgb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBzZXR0aW5nc19vcGVyYXRpb25zIGRoY3Bwa3Rfc2V0dGluZ3Nfb3BlcmF0aW9ucyA9IHsKKwkuc3RvcmUgPSBkaGNwcGt0X3NldHRpbmdzX3N0b3JlLAorCS5mZXRjaCA9IGRoY3Bwa3Rfc2V0dGluZ3NfZmV0Y2gsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbnN0cnVjdG9yCisgKgorICovCisKKy8qKgorICogSW5pdGlhbGlzZSBESENQIHBhY2tldAorICoKKyAqIEB2IGRoY3Bwa3QJCURIQ1AgcGFja2V0IHN0cnVjdHVyZSB0byBmaWxsIGluCisgKiBAdiBkYXRhCQlESENQIHBhY2tldCByYXcgZGF0YQorICogQHYgbWF4X2xlbgkJTGVuZ3RoIG9mIHJhdyBkYXRhIGJ1ZmZlcgorICoKKyAqIEluaXRpYWxpc2UgYSBESENQIHBhY2tldCBzdHJ1Y3R1cmUgZnJvbSBhIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgYQorICogREhDUCBwYWNrZXQuCisgKi8KK3ZvaWQgZGhjcHBrdF9pbml0ICggc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwcGt0LCBzdHJ1Y3QgZGhjcGhkciAqZGF0YSwKKwkJICAgIHNpemVfdCBsZW4gKSB7CisJZGhjcHBrdC0+ZGhjcGhkciA9IGRhdGE7CisJZGhjcHBrdC0+bWF4X2xlbiA9IGxlbjsKKwlkaGNwb3B0X2luaXQgKCAmZGhjcHBrdC0+b3B0aW9ucywgJmRoY3Bwa3QtPmRoY3BoZHItPm9wdGlvbnMsCisJCSAgICAgICAoIGxlbiAtIG9mZnNldG9mICggc3RydWN0IGRoY3BoZHIsIG9wdGlvbnMgKSApICk7CisJZGhjcHBrdC0+bGVuID0gKCBvZmZzZXRvZiAoIHN0cnVjdCBkaGNwaGRyLCBvcHRpb25zICkgKworCQkJIGRoY3Bwa3QtPm9wdGlvbnMubGVuICk7CisJc2V0dGluZ3NfaW5pdCAoICZkaGNwcGt0LT5zZXR0aW5ncywKKwkJCSZkaGNwcGt0X3NldHRpbmdzX29wZXJhdGlvbnMsICZkaGNwcGt0LT5yZWZjbnQsCisJCQlESENQX1NFVFRJTkdTX05BTUUsIDAgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC9lYXBvbC5jIGIvZ3B4ZS9zcmMvbmV0L2VhcG9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3YzhjZQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9lYXBvbC5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9zaHVhIE9yZW1hbiA8b3JlbWFuakByd2NyLm5ldD4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqIEBmaWxlCisgKgorICogODAyLjFYIEV4dGVuc2libGUgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgb3ZlciBMQU5zIGRlbXVsdGlwbGV4ZXIKKyAqCisgKi8KKworI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL2VhcG9sLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorCisvKioKKyAqIFJlY2VpdmUgRUFQT0wgbmV0d29yay1sYXllciBwYWNrZXQKKyAqCisgKiBAdiBpb2IJSS9PIGJ1ZmZlcgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKiBAdiBsbF9zb3VyY2UJTGluay1sYXllciBzb3VyY2UgYWRkcmVzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBJL08gYnVmZmVyIHBhc3NlZCB0byBpdC4KKyAqLworc3RhdGljIGludCBlYXBvbF9yeCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgICAgY29uc3Qgdm9pZCAqbGxfc291cmNlICkKK3sKKwlzdHJ1Y3QgZWFwb2xfZnJhbWUgKmVhcG9sID0gaW9iLT5kYXRhOworCXN0cnVjdCBlYXBvbF9oYW5kbGVyICpoYW5kbGVyOworCisJaWYgKCBpb2JfbGVuICggaW9iICkgPCBFQVBPTF9IRFJfTEVOICkgeworCQlmcmVlX2lvYiAoIGlvYiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIGhhbmRsZXIsIEVBUE9MX0hBTkRMRVJTICkgeworCQlpZiAoIGhhbmRsZXItPnR5cGUgPT0gZWFwb2wtPnR5cGUgKSB7CisJCQlpb2JfcHVsbCAoIGlvYiwgRUFQT0xfSERSX0xFTiApOworCQkJcmV0dXJuIGhhbmRsZXItPnJ4ICggaW9iLCBuZXRkZXYsIGxsX3NvdXJjZSApOworCQl9CisJfQorCisJZnJlZV9pb2IgKCBpb2IgKTsKKwlyZXR1cm4gLSggRU5PVFNVUCB8ICggKCBlYXBvbC0+dHlwZSAmIDB4MWYgKSA8PCA4ICkgKTsKK30KKworLyoqCisgKiBUcmFuc2NyaWJlIEVBUE9MIG5ldHdvcmstbGF5ZXIgYWRkcmVzcworICoKKyAqIEB2IG5ldF9hZGRyCU5ldHdvcmstbGF5ZXIgYWRkcmVzcworICogQHJldCBzdHIJU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG5ldHdvcmstbGF5ZXIgYWRkcmVzcworICoKKyAqIEVBUE9MIGRvZXNuJ3QgaGF2ZSBuZXR3b3JrLWxheWVyIGFkZHJlc3Nlcywgc28gd2UganVzdCByZXR1cm4gdGhlCisgKiBzdHJpbmcgQGMgIjxFQVBPTD4iLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGVhcG9sX250b2EgKCBjb25zdCB2b2lkICpuZXRfYWRkciBfX3VudXNlZCApCit7CisJcmV0dXJuICI8RUFQT0w+IjsKK30KKworLyoqIEVBUE9MIG5ldHdvcmsgcHJvdG9jb2wgKi8KK3N0cnVjdCBuZXRfcHJvdG9jb2wgZWFwb2xfcHJvdG9jb2wgX19uZXRfcHJvdG9jb2wgPSB7CisJLm5hbWUgPSAiRUFQT0wiLAorCS5yeCA9IGVhcG9sX3J4LAorCS5udG9hID0gZWFwb2xfbnRvYSwKKwkubmV0X3Byb3RvID0gaHRvbnMgKCBFVEhfUF9FQVBPTCApLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC9ldGhlcm5ldC5jIGIvZ3B4ZS9zcmMvbmV0L2V0aGVybmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllZDFkYwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9ldGhlcm5ldC5jCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9hcnAuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbi5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvZXRoZXJuZXQuaD4KKworLyoqIEBmaWxlCisgKgorICogRXRoZXJuZXQgcHJvdG9jb2wKKyAqCisgKi8KKworLyoqIEV0aGVybmV0IGJyb2FkY2FzdCBNQUMgYWRkcmVzcyAqLworc3RhdGljIHVpbnQ4X3QgZXRoX2Jyb2FkY2FzdFtFVEhfQUxFTl0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCisvKioKKyAqIEFkZCBFdGhlcm5ldCBsaW5rLWxheWVyIGhlYWRlcgorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiBsbF9kZXN0CQlMaW5rLWxheWVyIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEB2IGxsX3NvdXJjZQkJU291cmNlIGxpbmstbGF5ZXIgYWRkcmVzcworICogQHYgbmV0X3Byb3RvCQlOZXR3b3JrLWxheWVyIHByb3RvY29sLCBpbiBuZXR3b3JrLWJ5dGUgb3JkZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGV0aF9wdXNoICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiBfX3VudXNlZCwKKwkJICAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGNvbnN0IHZvaWQgKmxsX2Rlc3QsCisJCSAgICAgIGNvbnN0IHZvaWQgKmxsX3NvdXJjZSwgdWludDE2X3QgbmV0X3Byb3RvICkgeworCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IGlvYl9wdXNoICggaW9idWYsIHNpemVvZiAoICpldGhoZHIgKSApOworCisJLyogQnVpbGQgRXRoZXJuZXQgaGVhZGVyICovCisJbWVtY3B5ICggZXRoaGRyLT5oX2Rlc3QsIGxsX2Rlc3QsIEVUSF9BTEVOICk7CisJbWVtY3B5ICggZXRoaGRyLT5oX3NvdXJjZSwgbGxfc291cmNlLCBFVEhfQUxFTiApOworCWV0aGhkci0+aF9wcm90b2NvbCA9IG5ldF9wcm90bzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlbW92ZSBFdGhlcm5ldCBsaW5rLWxheWVyIGhlYWRlcgorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAcmV0IGxsX2Rlc3QJCUxpbmstbGF5ZXIgZGVzdGluYXRpb24gYWRkcmVzcworICogQHJldCBsbF9zb3VyY2UJU291cmNlIGxpbmstbGF5ZXIgYWRkcmVzcworICogQHJldCBuZXRfcHJvdG8JTmV0d29yay1sYXllciBwcm90b2NvbCwgaW4gbmV0d29yay1ieXRlIG9yZGVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBldGhfcHVsbCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgX191bnVzZWQsIAorCQkgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwgY29uc3Qgdm9pZCAqKmxsX2Rlc3QsCisJCSAgICAgIGNvbnN0IHZvaWQgKipsbF9zb3VyY2UsIHVpbnQxNl90ICpuZXRfcHJvdG8gKSB7CisJc3RydWN0IGV0aGhkciAqZXRoaGRyID0gaW9idWYtPmRhdGE7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIGlvYl9sZW4gKCBpb2J1ZiApIDwgc2l6ZW9mICggKmV0aGhkciApICkgeworCQlEQkcgKCAiRXRoZXJuZXQgcGFja2V0IHRvbyBzaG9ydCAoJXpkIGJ5dGVzKVxuIiwKKwkJICAgICAgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU3RyaXAgb2ZmIEV0aGVybmV0IGhlYWRlciAqLworCWlvYl9wdWxsICggaW9idWYsIHNpemVvZiAoICpldGhoZHIgKSApOworCisJLyogRmlsbCBpbiByZXF1aXJlZCBmaWVsZHMgKi8KKwkqbGxfZGVzdCA9IGV0aGhkci0+aF9kZXN0OworCSpsbF9zb3VyY2UgPSBldGhoZHItPmhfc291cmNlOworCSpuZXRfcHJvdG8gPSBldGhoZHItPmhfcHJvdG9jb2w7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBJbml0aWFsaXNlIEV0aGVybmV0IGFkZHJlc3MKKyAqCisgKiBAdiBod19hZGRyCQlIYXJkd2FyZSBhZGRyZXNzCisgKiBAdiBsbF9hZGRyCQlMaW5rLWxheWVyIGFkZHJlc3MKKyAqLwordm9pZCBldGhfaW5pdF9hZGRyICggY29uc3Qgdm9pZCAqaHdfYWRkciwgdm9pZCAqbGxfYWRkciApIHsKKwltZW1jcHkgKCBsbF9hZGRyLCBod19hZGRyLCBFVEhfQUxFTiApOworfQorCisvKioKKyAqIFRyYW5zY3JpYmUgRXRoZXJuZXQgYWRkcmVzcworICoKKyAqIEB2IGxsX2FkZHIJCUxpbmstbGF5ZXIgYWRkcmVzcworICogQHJldCBzdHJpbmcJCUxpbmstbGF5ZXIgYWRkcmVzcyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtYXQKKyAqLworY29uc3QgY2hhciAqIGV0aF9udG9hICggY29uc3Qgdm9pZCAqbGxfYWRkciApIHsKKwlzdGF0aWMgY2hhciBidWZbMThdOyAvKiAiMDA6MDA6MDA6MDA6MDA6MDAiICovCisJY29uc3QgdWludDhfdCAqZXRoX2FkZHIgPSBsbF9hZGRyOworCisJc3ByaW50ZiAoIGJ1ZiwgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJICBldGhfYWRkclswXSwgZXRoX2FkZHJbMV0sIGV0aF9hZGRyWzJdLAorCQkgIGV0aF9hZGRyWzNdLCBldGhfYWRkcls0XSwgZXRoX2FkZHJbNV0gKTsKKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqIEhhc2ggbXVsdGljYXN0IGFkZHJlc3MKKyAqCisgKiBAdiBhZgkJQWRkcmVzcyBmYW1pbHkKKyAqIEB2IG5ldF9hZGRyCQlOZXR3b3JrLWxheWVyIGFkZHJlc3MKKyAqIEB2IGxsX2FkZHIJCUxpbmstbGF5ZXIgYWRkcmVzcyB0byBmaWxsIGluCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IGV0aF9tY19oYXNoICggdW5zaWduZWQgaW50IGFmLCBjb25zdCB2b2lkICpuZXRfYWRkciwgdm9pZCAqbGxfYWRkciApIHsKKwljb25zdCB1aW50OF90ICpuZXRfYWRkcl9ieXRlcyA9IG5ldF9hZGRyOworCXVpbnQ4X3QgKmxsX2FkZHJfYnl0ZXMgPSBsbF9hZGRyOworCisJc3dpdGNoICggYWYgKSB7CisJY2FzZSBBRl9JTkVUOgorCQlsbF9hZGRyX2J5dGVzWzBdID0gMHgwMTsKKwkJbGxfYWRkcl9ieXRlc1sxXSA9IDB4MDA7CisJCWxsX2FkZHJfYnl0ZXNbMl0gPSAweDVlOworCQlsbF9hZGRyX2J5dGVzWzNdID0gbmV0X2FkZHJfYnl0ZXNbMV0gJiAweDdmOworCQlsbF9hZGRyX2J5dGVzWzRdID0gbmV0X2FkZHJfYnl0ZXNbMl07CisJCWxsX2FkZHJfYnl0ZXNbNV0gPSBuZXRfYWRkcl9ieXRlc1szXTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBFdGhlcm5ldC1jb21wYXRpYmxlIGNvbXByZXNzZWQgbGluay1sYXllciBhZGRyZXNzCisgKgorICogQHYgbGxfYWRkcgkJTGluay1sYXllciBhZGRyZXNzCisgKiBAdiBldGhfYWRkcgkJRXRoZXJuZXQtY29tcGF0aWJsZSBhZGRyZXNzIHRvIGZpbGwgaW4KKyAqLworaW50IGV0aF9ldGhfYWRkciAoIGNvbnN0IHZvaWQgKmxsX2FkZHIsIHZvaWQgKmV0aF9hZGRyICkgeworCW1lbWNweSAoIGV0aF9hZGRyLCBsbF9hZGRyLCBFVEhfQUxFTiApOworCXJldHVybiAwOworfQorCisvKiogRXRoZXJuZXQgcHJvdG9jb2wgKi8KK3N0cnVjdCBsbF9wcm90b2NvbCBldGhlcm5ldF9wcm90b2NvbCBfX2xsX3Byb3RvY29sID0geworCS5uYW1lCQk9ICJFdGhlcm5ldCIsCisJLmxsX3Byb3RvCT0gaHRvbnMgKCBBUlBIUkRfRVRIRVIgKSwKKwkuaHdfYWRkcl9sZW4JPSBFVEhfQUxFTiwKKwkubGxfYWRkcl9sZW4JPSBFVEhfQUxFTiwKKwkubGxfaGVhZGVyX2xlbgk9IEVUSF9ITEVOLAorCS5wdXNoCQk9IGV0aF9wdXNoLAorCS5wdWxsCQk9IGV0aF9wdWxsLAorCS5pbml0X2FkZHIJPSBldGhfaW5pdF9hZGRyLAorCS5udG9hCQk9IGV0aF9udG9hLAorCS5tY19oYXNoCT0gZXRoX21jX2hhc2gsCisJLmV0aF9hZGRyCT0gZXRoX2V0aF9hZGRyLAorfTsKKworLyoqCisgKiBBbGxvY2F0ZSBFdGhlcm5ldCBkZXZpY2UKKyAqCisgKiBAdiBwcml2X3NpemUJCVNpemUgb2YgZHJpdmVyIHByaXZhdGUgZGF0YQorICogQHJldCBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlLCBvciBOVUxMCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICogYWxsb2NfZXRoZXJkZXYgKCBzaXplX3QgcHJpdl9zaXplICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwluZXRkZXYgPSBhbGxvY19uZXRkZXYgKCBwcml2X3NpemUgKTsKKwlpZiAoIG5ldGRldiApIHsKKwkJbmV0ZGV2LT5sbF9wcm90b2NvbCA9ICZldGhlcm5ldF9wcm90b2NvbDsKKwkJbmV0ZGV2LT5sbF9icm9hZGNhc3QgPSBldGhfYnJvYWRjYXN0OworCQluZXRkZXYtPm1heF9wa3RfbGVuID0gRVRIX0ZSQU1FX0xFTjsKKwl9CisJcmV0dXJuIG5ldGRldjsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC9mYWtlZGhjcC5jIGIvZ3B4ZS9zcmMvbmV0L2Zha2VkaGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzZjA0NgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9mYWtlZGhjcC5jCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdweGUvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvZGhjcHBrdC5oPgorI2luY2x1ZGUgPGdweGUvZmFrZWRoY3AuaD4KKworLyoqIEBmaWxlCisgKgorICogRmFrZSBESENQIHBhY2tldHMKKyAqCisgKi8KKworLyoqCisgKiBDb3B5IHNldHRpbmdzIHRvIERIQ1AgcGFja2V0CisgKgorICogQHYgZGVzdAkJRGVzdGluYXRpb24gREhDUCBwYWNrZXQKKyAqIEB2IHNvdXJjZQkJU291cmNlIHNldHRpbmdzIGJsb2NrCisgKiBAdiBlbmNhcHN1bGF0b3IJRW5jYXBzdWxhdGluZyBzZXR0aW5nIHRhZyBudW1iZXIsIG9yIHplcm8KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGNvcHlfZW5jYXBfc2V0dGluZ3MgKCBzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRlc3QsCisJCQkJIHN0cnVjdCBzZXR0aW5ncyAqc291cmNlLAorCQkJCSB1bnNpZ25lZCBpbnQgZW5jYXBzdWxhdG9yICkgeworCXN0cnVjdCBzZXR0aW5nIHNldHRpbmcgPSB7IC5uYW1lID0gIiIgfTsKKwl1bnNpZ25lZCBpbnQgc3VidGFnOworCXVuc2lnbmVkIGludCB0YWc7CisJaW50IGxlbjsKKwlpbnQgY2hlY2tfbGVuOworCWludCByYzsKKworCWZvciAoIHN1YnRhZyA9IERIQ1BfTUlOX09QVElPTjsgc3VidGFnIDw9IERIQ1BfTUFYX09QVElPTjsgc3VidGFnKysgKSB7CisJCXRhZyA9IERIQ1BfRU5DQVBfT1BUICggZW5jYXBzdWxhdG9yLCBzdWJ0YWcgKTsKKwkJc3dpdGNoICggdGFnICkgeworCQljYXNlIERIQ1BfRUJfRU5DQVA6CisJCWNhc2UgREhDUF9WRU5ET1JfRU5DQVA6CisJCQkvKiBQcm9jZXNzIGVuY2Fwc3VsYXRlZCBzZXR0aW5ncyAqLworCQkJaWYgKCAoIHJjID0gY29weV9lbmNhcF9zZXR0aW5ncyAoIGRlc3QsIHNvdXJjZSwKKwkJCQkJCQkgIHRhZyApICkgIT0gMCApCisJCQkJcmV0dXJuIHJjOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBDb3B5IHNldHRpbmcsIGlmIHByZXNlbnQgKi8KKwkJCXNldHRpbmcudGFnID0gdGFnOworCQkJbGVuID0gZmV0Y2hfc2V0dGluZ19sZW4gKCBzb3VyY2UsICZzZXR0aW5nICk7CisJCQlpZiAoIGxlbiA8IDAgKQorCQkJCWJyZWFrOworCQkJeworCQkJCWNoYXIgYnVmW2xlbl07CisKKwkJCQljaGVja19sZW4gPSBmZXRjaF9zZXR0aW5nICggc291cmNlLCAmc2V0dGluZywKKwkJCQkJCQkgICAgYnVmLCBzaXplb2YgKGJ1ZikpOworCQkJCWFzc2VydCAoIGNoZWNrX2xlbiA9PSBsZW4gKTsKKwkJCQlpZiAoICggcmMgPSBkaGNwcGt0X3N0b3JlICggZGVzdCwgdGFnLCBidWYsCisJCQkJCQkJICAgIHNpemVvZihidWYpICkpICE9MCkKKwkJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDb3B5IHNldHRpbmdzIHRvIERIQ1AgcGFja2V0CisgKgorICogQHYgZGVzdAkJRGVzdGluYXRpb24gREhDUCBwYWNrZXQKKyAqIEB2IHNvdXJjZQkJU291cmNlIHNldHRpbmdzIGJsb2NrCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBjb3B5X3NldHRpbmdzICggc3RydWN0IGRoY3BfcGFja2V0ICpkZXN0LAorCQkJICAgc3RydWN0IHNldHRpbmdzICpzb3VyY2UgKSB7CisJcmV0dXJuIGNvcHlfZW5jYXBfc2V0dGluZ3MgKCBkZXN0LCBzb3VyY2UsIDAgKTsKK30KKworLyoqCisgKiBDcmVhdGUgZmFrZSBESENQRElTQ09WRVIgcGFja2V0CisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgZGF0YQkJQnVmZmVyIGZvciBESENQIHBhY2tldAorICogQHYgbWF4X2xlbgkJU2l6ZSBvZiBESENQIHBhY2tldCBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFVzZWQgYnkgZXh0ZXJuYWwgY29kZS4KKyAqLworaW50IGNyZWF0ZV9mYWtlZGhjcGRpc2NvdmVyICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBtYXhfbGVuICkgeworCXN0cnVjdCBkaGNwX3BhY2tldCBkaGNwcGt0OworCXN0cnVjdCBpbl9hZGRyIGNpYWRkciA9IHsgMCB9OworCWludCByYzsKKworCWlmICggKCByYyA9IGRoY3BfY3JlYXRlX3JlcXVlc3QgKCAmZGhjcHBrdCwgbmV0ZGV2LCBESENQRElTQ09WRVIsCisJCQkJCSAgY2lhZGRyLCBkYXRhLCBtYXhfbGVuICkgKSAhPSAwICkgeworCQlEQkcgKCAiQ291bGQgbm90IGNyZWF0ZSBESENQRElTQ09WRVI6ICVzXG4iLAorCQkgICAgICBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIENyZWF0ZSBmYWtlIERIQ1BBQ0sgcGFja2V0CisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgZGF0YQkJQnVmZmVyIGZvciBESENQIHBhY2tldAorICogQHYgbWF4X2xlbgkJU2l6ZSBvZiBESENQIHBhY2tldCBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFVzZWQgYnkgZXh0ZXJuYWwgY29kZS4KKyAqLworaW50IGNyZWF0ZV9mYWtlZGhjcGFjayAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IG1heF9sZW4gKSB7CisJc3RydWN0IGRoY3BfcGFja2V0IGRoY3Bwa3Q7CisJaW50IHJjOworCisJLyogQ3JlYXRlIGJhc2UgREhDUEFDSyBwYWNrZXQgKi8KKwlpZiAoICggcmMgPSBkaGNwX2NyZWF0ZV9wYWNrZXQgKCAmZGhjcHBrdCwgbmV0ZGV2LCBESENQQUNLLCBOVUxMLCAwLAorCQkJCQkgZGF0YSwgbWF4X2xlbiApICkgIT0gMCApIHsKKwkJREJHICggIkNvdWxkIG5vdCBjcmVhdGUgREhDUEFDSzogJXNcbiIsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogTWVyZ2UgaW4gZ2xvYmFsbHktc2NvcGVkIHNldHRpbmdzLCB0aGVuIG5ldGRldi1zcGVjaWZpYworCSAqIHNldHRpbmdzLiAgRG8gaXQgaW4gdGhpcyBvcmRlciBzbyB0aGF0IG5ldGRldi1zcGVjaWZpYworCSAqIHNldHRpbmdzIHRha2UgcHJlY2VkZW5jZSByZWdhcmRsZXNzIG9mIHN0YXRlZCBwcmlvcml0aWVzLgorCSAqLworCWlmICggKCByYyA9IGNvcHlfc2V0dGluZ3MgKCAmZGhjcHBrdCwgTlVMTCApICkgIT0gMCApIHsKKwkJREJHICggIkNvdWxkIG5vdCBzZXQgREhDUEFDSyBnbG9iYWwgc2V0dGluZ3M6ICVzXG4iLAorCQkgICAgICBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKwlpZiAoICggcmMgPSBjb3B5X3NldHRpbmdzICggJmRoY3Bwa3QsCisJCQkJICAgIG5ldGRldl9zZXR0aW5ncyAoIG5ldGRldiApICkgKSAhPSAwICkgeworCQlEQkcgKCAiQ291bGQgbm90IHNldCBESENQQUNLIG5ldGRldiBzZXR0aW5nczogJXNcbiIsCisJCSAgICAgIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ3JlYXRlIGZha2UgUFhFIEJvb3QgU2VydmVyIEFDSyBwYWNrZXQKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBkYXRhCQlCdWZmZXIgZm9yIERIQ1AgcGFja2V0CisgKiBAdiBtYXhfbGVuCQlTaXplIG9mIERIQ1AgcGFja2V0IGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogVXNlZCBieSBleHRlcm5hbCBjb2RlLgorICovCitpbnQgY3JlYXRlX2Zha2VweGVic2FjayAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgIHZvaWQgKmRhdGEsIHNpemVfdCBtYXhfbGVuICkgeworCXN0cnVjdCBkaGNwX3BhY2tldCBkaGNwcGt0OworCXN0cnVjdCBzZXR0aW5ncyAqcHJveHlfc2V0dGluZ3M7CisJc3RydWN0IHNldHRpbmdzICpweGVic19zZXR0aW5nczsKKwlpbnQgcmM7CisKKwkvKiBJZGVudGlmeSBhdmFpbGFibGUgc2V0dGluZ3MgKi8KKwlwcm94eV9zZXR0aW5ncyA9IGZpbmRfc2V0dGluZ3MgKCBQUk9YWURIQ1BfU0VUVElOR1NfTkFNRSApOworCXB4ZWJzX3NldHRpbmdzID0gZmluZF9zZXR0aW5ncyAoIFBYRUJTX1NFVFRJTkdTX05BTUUgKTsKKwlpZiAoICggISBwcm94eV9zZXR0aW5ncyApICYmICggISBweGVic19zZXR0aW5ncyApICkgeworCQkvKiBObyBQWEUgYm9vdCBzZXJ2ZXI7IHJldHVybiB0aGUgcmVndWxhciBESENQQUNLICovCisJCXJldHVybiBjcmVhdGVfZmFrZWRoY3BhY2sgKCBuZXRkZXYsIGRhdGEsIG1heF9sZW4gKTsKKwl9CisKKwkvKiBDcmVhdGUgYmFzZSBESENQQUNLIHBhY2tldCAqLworCWlmICggKCByYyA9IGRoY3BfY3JlYXRlX3BhY2tldCAoICZkaGNwcGt0LCBuZXRkZXYsIERIQ1BBQ0ssIE5VTEwsIDAsCisJCQkJCSBkYXRhLCBtYXhfbGVuICkgKSAhPSAwICkgeworCQlEQkcgKCAiQ291bGQgbm90IGNyZWF0ZSBQWEUgQlMgQUNLOiAlc1xuIiwKKwkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBNZXJnZSBpbiBQcm94eURIQ1Agb3B0aW9ucyAqLworCWlmICggcHJveHlfc2V0dGluZ3MgJiYKKwkgICAgICggKCByYyA9IGNvcHlfc2V0dGluZ3MgKCAmZGhjcHBrdCwgcHJveHlfc2V0dGluZ3MgKSApICE9IDAgKSApIHsKKwkJREJHICggIkNvdWxkIG5vdCBjb3B5IFByb3h5REhDUCBzZXR0aW5nczogJXNcbiIsCisJCSAgICAgIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogTWVyZ2UgaW4gQm9vdFNlcnZlckRIQ1Agb3B0aW9ucywgaWYgcHJlc2VudCAqLworCWlmICggcHhlYnNfc2V0dGluZ3MgJiYKKwkgICAgICggKCByYyA9IGNvcHlfc2V0dGluZ3MgKCAmZGhjcHBrdCwgcHhlYnNfc2V0dGluZ3MgKSApICE9IDAgKSApIHsKKwkJREJHICggIkNvdWxkIG5vdCBjb3B5IFBYRSBCUyBzZXR0aW5nczogJXNcbiIsCisJCSAgICAgIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvaWNtcC5jIGIvZ3B4ZS9zcmMvbmV0L2ljbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDljMzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L2ljbXAuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvaW4uaD4KKyNpbmNsdWRlIDxncHhlL3RjcGlwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pY21wLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIElDTVAgcHJvdG9jb2wKKyAqCisgKi8KKworc3RydWN0IHRjcGlwX3Byb3RvY29sIGljbXBfcHJvdG9jb2wgX190Y3BpcF9wcm90b2NvbDsKKworLyoqCisgKiBQcm9jZXNzIGEgcmVjZWl2ZWQgcGFja2V0CisgKgorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEB2IHN0X3NyYwkJUGFydGlhbGx5LWZpbGxlZCBzb3VyY2UgYWRkcmVzcworICogQHYgc3RfZGVzdAkJUGFydGlhbGx5LWZpbGxlZCBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiBAdiBwc2hkcl9jc3VtCVBzZXVkby1oZWFkZXIgY2hlY2tzdW0KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGljbXBfcnggKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1Ziwgc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9zcmMsCisJCSAgICAgc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9kZXN0LAorCQkgICAgIHVpbnQxNl90IHBzaGRyX2NzdW0gX191bnVzZWQgKSB7CisJc3RydWN0IGljbXBfaGVhZGVyICppY21wID0gaW9idWYtPmRhdGE7CisJc2l6ZV90IGxlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCXVuc2lnbmVkIGludCBjc3VtOworCWludCByYzsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggbGVuIDwgc2l6ZW9mICggKmljbXAgKSApIHsKKwkJREJHICggIklDTVAgcGFja2V0IHRvbyBzaG9ydCBhdCAlemQgYnl0ZXMgKG1pbiAlemQgYnl0ZXMpXG4iLAorCQkgICAgICBsZW4sIHNpemVvZiAoICppY21wICkgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogVmVyaWZ5IGNoZWNrc3VtICovCisJY3N1bSA9IHRjcGlwX2Noa3N1bSAoIGljbXAsIGxlbiApOworCWlmICggY3N1bSAhPSAwICkgeworCQlEQkcgKCAiSUNNUCBjaGVja3N1bSBpbmNvcnJlY3QgKGlzICUwNHgsIHNob3VsZCBiZSAwMDAwKVxuIiwKKwkJICAgICAgY3N1bSApOworCQlEQkdfSEQgKCBpY21wLCBsZW4gKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogV2UgcmVzcG9uZCBvbmx5IHRvIHBpbmdzICovCisJaWYgKCBpY21wLT50eXBlICE9IElDTVBfRUNIT19SRVFVRVNUICkgeworCQlEQkcgKCAiSUNNUCBpZ25vcmluZyB0eXBlICVkXG4iLCBpY21wLT50eXBlICk7CisJCXJjID0gMDsKKwkJZ290byBkb25lOworCX0KKworCURCRyAoICJJQ01QIHJlc3BvbmRpbmcgdG8gcGluZ1xuIiApOworCisJLyogQ2hhbmdlIHR5cGUgdG8gcmVzcG9uc2UgYW5kIHJlY2FsY3VsYXRlIGNoZWNrc3VtICovCisJaWNtcC0+dHlwZSA9IElDTVBfRUNIT19SRVNQT05TRTsKKwlpY21wLT5jaGtzdW0gPSAwOworCWljbXAtPmNoa3N1bSA9IHRjcGlwX2Noa3N1bSAoIGljbXAsIGxlbiApOworCisJLyogVHJhbnNtaXQgdGhlIHJlc3BvbnNlICovCisJaWYgKCAoIHJjID0gdGNwaXBfdHggKCBpb2JfZGlzb3duICggaW9idWYgKSwgJmljbXBfcHJvdG9jb2wsIHN0X2Rlc3QsCisJCQkgICAgICAgc3Rfc3JjLCBOVUxMLCBOVUxMICkgKSAhPSAwICkgeworCQlEQkcgKCAiSUNNUCBjb3VsZCBub3QgdHJhbnNtaXQgcGluZyByZXNwb25zZTogJXNcbiIsCisJCSAgICAgIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGRvbmU7CisJfQorCisgZG9uZToKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIHJjOworfQorCisvKiogSUNNUCBUQ1AvSVAgcHJvdG9jb2wgKi8KK3N0cnVjdCB0Y3BpcF9wcm90b2NvbCBpY21wX3Byb3RvY29sIF9fdGNwaXBfcHJvdG9jb2wgPSB7CisJLm5hbWUgPSAiSUNNUCIsCisJLnJ4ID0gaWNtcF9yeCwKKwkudGNwaXBfcHJvdG8gPSBJUF9JQ01QLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC9pY21wdjYuYyBiL2dweGUvc3JjL25ldC9pY21wdjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzdmYzRhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L2ljbXB2Ni5jCkBAIC0wLDAgKzEsMTI4IEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvaW4uaD4KKyNpbmNsdWRlIDxncHhlL2lwNi5oPgorI2luY2x1ZGUgPGdweGUvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZHAuaD4KKyNpbmNsdWRlIDxncHhlL2ljbXA2Lmg+CisjaW5jbHVkZSA8Z3B4ZS90Y3BpcC5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisKK3N0cnVjdCB0Y3BpcF9wcm90b2NvbCBpY21wNl9wcm90b2NvbDsKKworLyoqCisgKiBTZW5kIG5laWdoYm91ciBzb2xpY2l0YXRpb24gcGFja2V0CisgKgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKiBAdiBzcmMJU291cmNlIGFkZHJlc3MKKyAqIEB2IGRlc3QJRGVzdGluYXRpb24gYWRkcmVzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgYSBuZWlnaGJvdXIgc29saWNpdGF0aW9uIHBhY2tldCBhbmQgc2VuZHMgaXQgdG8gdGhlCisgKiBuZXR3b3JrIGxheWVyLgorICovCitpbnQgaWNtcDZfc2VuZF9zb2xpY2l0ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGluNl9hZGRyICpzcmMgX191bnVzZWQsCisJCQkgc3RydWN0IGluNl9hZGRyICpkZXN0ICkgeworCXVuaW9uIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiBzaW42OworCQlzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgc3Q7CisJfSBzdF9kZXN0OworCXN0cnVjdCBsbF9wcm90b2NvbCAqbGxfcHJvdG9jb2wgPSBuZXRkZXYtPmxsX3Byb3RvY29sOworCXN0cnVjdCBuZWlnaGJvdXJfc29saWNpdCAqbnNvbGljaXQ7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgPSBhbGxvY19pb2IgKCBzaXplb2YgKCAqbnNvbGljaXQgKSArIE1JTl9JT0JfTEVOICk7CisJaW9iX3Jlc2VydmUgKCBpb2J1ZiwgTUFYX0hEUl9MRU4gKTsKKwluc29saWNpdCA9IGlvYl9wdXQgKCBpb2J1Ziwgc2l6ZW9mICggKm5zb2xpY2l0ICkgKTsKKworCS8qIEZpbGwgdXAgdGhlIGhlYWRlcnMgKi8KKwltZW1zZXQgKCBuc29saWNpdCwgMCwgc2l6ZW9mICggKm5zb2xpY2l0ICkgKTsKKwluc29saWNpdC0+dHlwZSA9IElDTVA2X05TT0xJQ0lUOworCW5zb2xpY2l0LT5jb2RlID0gMDsKKwluc29saWNpdC0+dGFyZ2V0ID0gKmRlc3Q7CisJbnNvbGljaXQtPm9wdF90eXBlID0gMTsKKwluc29saWNpdC0+b3B0X2xlbiA9ICggMiArIGxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApIC8gODsKKwltZW1jcHkgKCBuc29saWNpdC0+b3B0X2xsX2FkZHIsIG5ldGRldi0+bGxfYWRkciwKKwkJCQluZXRkZXYtPmxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApOworCS8qIFBhcnRpYWwgY2hlY2tzdW0gKi8KKwluc29saWNpdC0+Y3N1bSA9IDA7CisJbnNvbGljaXQtPmNzdW0gPSB0Y3BpcF9jaGtzdW0gKCBuc29saWNpdCwgc2l6ZW9mICggKm5zb2xpY2l0ICkgKTsKKworCS8qIFNvbGljaXRlZCBtdWx0aWNhc3QgYWRkcmVzcyAqLworCXN0X2Rlc3Quc2luNi5zaW5fZmFtaWx5ID0gQUZfSU5FVDY7CisJc3RfZGVzdC5zaW42LnNpbjZfYWRkci5pbjZfdS51Nl9hZGRyOFswXSA9IDB4ZmY7CisJc3RfZGVzdC5zaW42LnNpbjZfYWRkci5pbjZfdS51Nl9hZGRyOFsyXSA9IDB4MDI7CisJc3RfZGVzdC5zaW42LnNpbjZfYWRkci5pbjZfdS51Nl9hZGRyMTZbMV0gPSAweDAwMDA7CisJc3RfZGVzdC5zaW42LnNpbjZfYWRkci5pbjZfdS51Nl9hZGRyMzJbMV0gPSAweDAwMDAwMDAwOworCXN0X2Rlc3Quc2luNi5zaW42X2FkZHIuaW42X3UudTZfYWRkcjE2WzRdID0gMHgwMDAwOworCXN0X2Rlc3Quc2luNi5zaW42X2FkZHIuaW42X3UudTZfYWRkcjE2WzVdID0gMHgwMDAxOworCXN0X2Rlc3Quc2luNi5zaW42X2FkZHIuaW42X3UudTZfYWRkcjMyWzNdID0gZGVzdC0+aW42X3UudTZfYWRkcjMyWzNdOworCXN0X2Rlc3Quc2luNi5zaW42X2FkZHIuaW42X3UudTZfYWRkcjhbMTNdID0gMHhmZjsKKwkKKwkvKiBTZW5kIHBhY2tldCBvdmVyIElQNiAqLworCXJldHVybiB0Y3BpcF90eCAoIGlvYnVmLCAmaWNtcDZfcHJvdG9jb2wsIE5VTEwsICZzdF9kZXN0LnN0LAorCQkJICBOVUxMLCAmbnNvbGljaXQtPmNzdW0gKTsKK30KKworLyoqCisgKiBQcm9jZXNzIElDTVA2IGhlYWRlcnMKKyAqCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKiBAdiBzdF9zcmMJU291cmNlIGFkZHJlc3MKKyAqIEB2IHN0X2Rlc3QJRGVzdGluYXRpb24gYWRkcmVzcworICovCitzdGF0aWMgaW50IGljbXA2X3J4ICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3Rfc3JjLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X2Rlc3QsIF9fdW51c2VkIHVpbnQxNl90IHBzaGRyX2NzdW0gKSB7CisJc3RydWN0IGljbXA2X2hlYWRlciAqaWNtcDZoZHIgPSBpb2J1Zi0+ZGF0YTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggaW9iX2xlbiAoIGlvYnVmICkgPCBzaXplb2YgKCAqaWNtcDZoZHIgKSApIHsKKwkJREJHICggIlBhY2tldCB0b28gc2hvcnQgKCV6ZCBieXRlcylcbiIsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisJCWZyZWVfaW9iICggaW9idWYgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVE9ETzogVmVyaWZ5IGNoZWNrc3VtICovCisKKwkvKiBQcm9jZXNzIHRoZSBJQ01QIGhlYWRlciAqLworCXN3aXRjaCAoIGljbXA2aGRyLT50eXBlICkgeworCWNhc2UgSUNNUDZfTkFEVkVSVDoKKwkJcmV0dXJuIG5kcF9wcm9jZXNzX2FkdmVydCAoIGlvYnVmLCBzdF9zcmMsIHN0X2Rlc3QgKTsKKwl9CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKKyNpZiAwCit2b2lkIGljbXA2X3Rlc3RfbmFkdmVydCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHNvY2thZGRyX2luNiAqc2VydmVyX3AsIGNoYXIgKmxsX2FkZHIpIHsKKworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNlcnZlcjsKKwkJbWVtY3B5ICggJnNlcnZlciwgc2VydmVyX3AsIHNpemVvZiAoIHNlcnZlciApICk7CisgICAgICAgICAgICAgICAgc3RydWN0IGlvX2J1ZmZlciAqcnhpb2J1ZiA9IGFsbG9jX2lvYiAoIDUwMCApOworICAgICAgICAgICAgICAgIGlvYl9yZXNlcnZlICggcnhpb2J1ZiwgTUFYX0hEUl9MRU4gKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydCAqbmFkdmVydCA9IGlvYl9wdXQgKCByeGlvYnVmLCBzaXplb2YgKCAqbmFkdmVydCApICk7CisgICAgICAgICAgICAgICAgbmFkdmVydC0+dHlwZSA9IDEzNjsKKyAgICAgICAgICAgICAgICBuYWR2ZXJ0LT5jb2RlID0gMDsKKyAgICAgICAgICAgICAgICBuYWR2ZXJ0LT5mbGFncyA9IElDTVA2X0ZMQUdTX1NPTElDSVRFRDsKKwkJbmFkdmVydC0+Y3N1bSA9IDB4ZmZmZjsKKwkJbmFkdmVydC0+dGFyZ2V0ID0gc2VydmVyLnNpbjZfYWRkcjsKKyAgICAgICAgICAgICAgICBuYWR2ZXJ0LT5vcHRfdHlwZSA9IDI7CisgICAgICAgICAgICAgICAgbmFkdmVydC0+b3B0X2xlbiA9IDE7CisgICAgICAgICAgICAgICAgbWVtY3B5ICggbmFkdmVydC0+b3B0X2xsX2FkZHIsIGxsX2FkZHIsIDYgKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaXA2X2hlYWRlciAqaXA2aGRyID0gaW9iX3B1c2ggKCByeGlvYnVmLCBzaXplb2YgKCAqaXA2aGRyICkgKTsKKyAgICAgICAgICAgICAgICBpcDZoZHItPnZlcl90cmFmZmljX2NsYXNzX2Zsb3dfbGFiZWwgPSBodG9ubCAoIDB4NjAwMDAwMDAgKTsKKwkJaXA2aGRyLT5ob3BfbGltaXQgPSAyNTU7CisJCWlwNmhkci0+bnh0X2hkciA9IDU4OworCQlpcDZoZHItPnBheWxvYWRfbGVuID0gaHRvbnMgKCBzaXplb2YgKCAqbmFkdmVydCApICk7CisgICAgICAgICAgICAgICAgaXA2aGRyLT5zcmMgPSBzZXJ2ZXIuc2luNl9hZGRyOworICAgICAgICAgICAgICAgIGlwNmhkci0+ZGVzdCA9IHNlcnZlci5zaW42X2FkZHI7CisJCWhleF9kdW1wICggcnhpb2J1Zi0+ZGF0YSwgaW9iX2xlbiAoIHJ4aW9idWYgKSApOworICAgICAgICAgICAgICAgIG5ldF9yeCAoIHJ4aW9idWYsIG5ldGRldiwgaHRvbnMgKCBFVEhfUF9JUFY2ICksIGxsX2FkZHIgKTsKK30KKyNlbmRpZgorCisvKiogSUNNUDYgcHJvdG9jb2wgKi8KK3N0cnVjdCB0Y3BpcF9wcm90b2NvbCBpY21wNl9wcm90b2NvbCBfX3RjcGlwX3Byb3RvY29sID0geworCS5uYW1lID0gIklDTVA2IiwKKwkucnggPSBpY21wNl9yeCwKKwkudGNwaXBfcHJvdG8gPSBJUF9JQ01QNiwgLy8gNTgKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvaW5maW5pYmFuZC5jIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzgxMzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQuYwpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorI2luY2x1ZGUgPGdweGUvZXJyb3J0YWIuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2FycC5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvaXBvaWIuaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2luZmluaWJhbmQuaD4KKyNpbmNsdWRlIDxncHhlL2liX21pLmg+CisjaW5jbHVkZSA8Z3B4ZS9pYl9zbWEuaD4KKworLyoqIEBmaWxlCisgKgorICogSW5maW5pYmFuZCBwcm90b2NvbAorICoKKyAqLworCisvKiogTGlzdCBvZiBJbmZpbmliYW5kIGRldmljZXMgKi8KK3N0cnVjdCBsaXN0X2hlYWQgaWJfZGV2aWNlcyA9IExJU1RfSEVBRF9JTklUICggaWJfZGV2aWNlcyApOworCisvKiogTGlzdCBvZiBvcGVuIEluZmluaWJhbmQgZGV2aWNlcywgaW4gcmV2ZXJzZSBvcmRlciBvZiBvcGVuaW5nICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBvcGVuX2liX2RldmljZXMgPSBMSVNUX0hFQURfSU5JVCAoIG9wZW5faWJfZGV2aWNlcyApOworCisvKiBEaXNhbWJpZ3VhdGUgdGhlIHZhcmlvdXMgcG9zc2libGUgRUlOUFJPR1JFU1NlcyAqLworI2RlZmluZSBFSU5QUk9HUkVTU19JTklUICggRUlOUFJPR1JFU1MgfCBFVU5JUV8wMSApCisjZGVmaW5lIEVJTlBST0dSRVNTX0FSTUVEICggRUlOUFJPR1JFU1MgfCBFVU5JUV8wMiApCisKKy8qKiBIdW1hbi1yZWFkYWJsZSBtZXNzYWdlIGZvciB0aGUgbGluayBzdGF0dXNlcyAqLworc3RydWN0IGVycm9ydGFiIGluZmluaWJhbmRfZXJyb3JzW10gX19lcnJvcnRhYiA9IHsKKwl7IEVJTlBST0dSRVNTX0lOSVQsICJJbml0aWFsaXNpbmciIH0sCisJeyBFSU5QUk9HUkVTU19BUk1FRCwgIkFybWVkIiB9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbXBsZXRpb24gcXVldWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQ3JlYXRlIGNvbXBsZXRpb24gcXVldWUKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG51bV9jcWVzCQlOdW1iZXIgb2YgY29tcGxldGlvbiBxdWV1ZSBlbnRyaWVzCisgKiBAdiBvcAkJQ29tcGxldGlvbiBxdWV1ZSBvcGVyYXRpb25zCisgKiBAcmV0IGNxCQlOZXcgY29tcGxldGlvbiBxdWV1ZQorICovCitzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqCitpYl9jcmVhdGVfY3EgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgdW5zaWduZWQgaW50IG51bV9jcWVzLAorCSAgICAgICBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZV9vcGVyYXRpb25zICpvcCApIHsKKwlzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3E7CisJaW50IHJjOworCisJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgY3JlYXRpbmcgY29tcGxldGlvbiBxdWV1ZVxuIiwgaWJkZXYgKTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGRhdGEgc3RydWN0dXJlICovCisJY3EgPSB6YWxsb2MgKCBzaXplb2YgKCAqY3EgKSApOworCWlmICggISBjcSApCisJCWdvdG8gZXJyX2FsbG9jX2NxOworCWNxLT5pYmRldiA9IGliZGV2OworCWxpc3RfYWRkICggJmNxLT5saXN0LCAmaWJkZXYtPmNxcyApOworCWNxLT5udW1fY3FlcyA9IG51bV9jcWVzOworCUlOSVRfTElTVF9IRUFEICggJmNxLT53b3JrX3F1ZXVlcyApOworCWNxLT5vcCA9IG9wOworCisJLyogUGVyZm9ybSBkZXZpY2Utc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gYW5kIGdldCBDUU4gKi8KKwlpZiAoICggcmMgPSBpYmRldi0+b3AtPmNyZWF0ZV9jcSAoIGliZGV2LCBjcSApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgY291bGQgbm90IGluaXRpYWxpc2UgY29tcGxldGlvbiAiCisJCSAgICAgICAicXVldWU6ICVzXG4iLCBpYmRldiwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX2Rldl9jcmVhdGVfY3E7CisJfQorCisJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgY3JlYXRlZCAlZC1lbnRyeSBjb21wbGV0aW9uIHF1ZXVlICVwICglcCkgIgorCSAgICAgICAid2l0aCBDUU4gJSNseFxuIiwgaWJkZXYsIG51bV9jcWVzLCBjcSwKKwkgICAgICAgaWJfY3FfZ2V0X2RydmRhdGEgKCBjcSApLCBjcS0+Y3FuICk7CisJcmV0dXJuIGNxOworCisJaWJkZXYtPm9wLT5kZXN0cm95X2NxICggaWJkZXYsIGNxICk7CisgZXJyX2Rldl9jcmVhdGVfY3E6CisJbGlzdF9kZWwgKCAmY3EtPmxpc3QgKTsKKwlmcmVlICggY3EgKTsKKyBlcnJfYWxsb2NfY3E6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRGVzdHJveSBjb21wbGV0aW9uIHF1ZXVlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBjcQkJQ29tcGxldGlvbiBxdWV1ZQorICovCit2b2lkIGliX2Rlc3Ryb3lfY3EgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJICAgICBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3EgKSB7CisJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgZGVzdHJveWluZyBjb21wbGV0aW9uIHF1ZXVlICUjbHhcbiIsCisJICAgICAgIGliZGV2LCBjcS0+Y3FuICk7CisJYXNzZXJ0ICggbGlzdF9lbXB0eSAoICZjcS0+d29ya19xdWV1ZXMgKSApOworCWliZGV2LT5vcC0+ZGVzdHJveV9jcSAoIGliZGV2LCBjcSApOworCWxpc3RfZGVsICggJmNxLT5saXN0ICk7CisJZnJlZSAoIGNxICk7Cit9CisKKy8qKgorICogUG9sbCBjb21wbGV0aW9uIHF1ZXVlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBjcQkJQ29tcGxldGlvbiBxdWV1ZQorICovCit2b2lkIGliX3BvbGxfY3EgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJICBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3EgKSB7CisJc3RydWN0IGliX3dvcmtfcXVldWUgKndxOworCisJLyogUG9sbCBjb21wbGV0aW9uIHF1ZXVlICovCisJaWJkZXYtPm9wLT5wb2xsX2NxICggaWJkZXYsIGNxICk7CisKKwkvKiBSZWZpbGwgcmVjZWl2ZSB3b3JrIHF1ZXVlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCB3cSwgJmNxLT53b3JrX3F1ZXVlcywgbGlzdCApIHsKKwkJaWYgKCAhIHdxLT5pc19zZW5kICkKKwkJCWliX3JlZmlsbF9yZWN2ICggaWJkZXYsIHdxLT5xcCApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFdvcmsgcXVldWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQ3JlYXRlIHF1ZXVlIHBhaXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHR5cGUJCVF1ZXVlIHBhaXIgdHlwZQorICogQHYgbnVtX3NlbmRfd3FlcwlOdW1iZXIgb2Ygc2VuZCB3b3JrIHF1ZXVlIGVudHJpZXMKKyAqIEB2IHNlbmRfY3EJCVNlbmQgY29tcGxldGlvbiBxdWV1ZQorICogQHYgbnVtX3JlY3Zfd3FlcwlOdW1iZXIgb2YgcmVjZWl2ZSB3b3JrIHF1ZXVlIGVudHJpZXMKKyAqIEB2IHJlY3ZfY3EJCVJlY2VpdmUgY29tcGxldGlvbiBxdWV1ZQorICogQHJldCBxcAkJUXVldWUgcGFpcgorICoKKyAqIFRoZSBxdWV1ZSBwYWlyIHdpbGwgYmUgbGVmdCBpbiB0aGUgSU5JVCBzdGF0ZTsgeW91IG11c3QgY2FsbAorICogaWJfbW9kaWZ5X3FwKCkgYmVmb3JlIGl0IGlzIHJlYWR5IHRvIHVzZSBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nLgorICovCitzdHJ1Y3QgaWJfcXVldWVfcGFpciAqIGliX2NyZWF0ZV9xcCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSAgICAgIGVudW0gaWJfcXVldWVfcGFpcl90eXBlIHR5cGUsCisJCQkJICAgICAgdW5zaWduZWQgaW50IG51bV9zZW5kX3dxZXMsCisJCQkJICAgICAgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKnNlbmRfY3EsCisJCQkJICAgICAgdW5zaWduZWQgaW50IG51bV9yZWN2X3dxZXMsCisJCQkJICAgICAgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKnJlY3ZfY3EgKSB7CisJc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwOworCXNpemVfdCB0b3RhbF9zaXplOworCWludCByYzsKKworCURCR0MgKCBpYmRldiwgIklCREVWICVwIGNyZWF0aW5nIHF1ZXVlIHBhaXJcbiIsIGliZGV2ICk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBkYXRhIHN0cnVjdHVyZSAqLworCXRvdGFsX3NpemUgPSAoIHNpemVvZiAoICpxcCApICsKKwkJICAgICAgICggbnVtX3NlbmRfd3FlcyAqIHNpemVvZiAoIHFwLT5zZW5kLmlvYnVmc1swXSApICkgKworCQkgICAgICAgKCBudW1fcmVjdl93cWVzICogc2l6ZW9mICggcXAtPnJlY3YuaW9idWZzWzBdICkgKSApOworCXFwID0gemFsbG9jICggdG90YWxfc2l6ZSApOworCWlmICggISBxcCApCisJCWdvdG8gZXJyX2FsbG9jX3FwOworCXFwLT5pYmRldiA9IGliZGV2OworCWxpc3RfYWRkICggJnFwLT5saXN0LCAmaWJkZXYtPnFwcyApOworCXFwLT50eXBlID0gdHlwZTsKKwlxcC0+c2VuZC5xcCA9IHFwOworCXFwLT5zZW5kLmlzX3NlbmQgPSAxOworCXFwLT5zZW5kLmNxID0gc2VuZF9jcTsKKwlsaXN0X2FkZCAoICZxcC0+c2VuZC5saXN0LCAmc2VuZF9jcS0+d29ya19xdWV1ZXMgKTsKKwlxcC0+c2VuZC5wc24gPSAoIHJhbmRvbSgpICYgMHhmZmZmZmZVTCApOworCXFwLT5zZW5kLm51bV93cWVzID0gbnVtX3NlbmRfd3FlczsKKwlxcC0+c2VuZC5pb2J1ZnMgPSAoICggKCB2b2lkICogKSBxcCApICsgc2l6ZW9mICggKnFwICkgKTsKKwlxcC0+cmVjdi5xcCA9IHFwOworCXFwLT5yZWN2LmNxID0gcmVjdl9jcTsKKwlsaXN0X2FkZCAoICZxcC0+cmVjdi5saXN0LCAmcmVjdl9jcS0+d29ya19xdWV1ZXMgKTsKKwlxcC0+cmVjdi5wc24gPSAoIHJhbmRvbSgpICYgMHhmZmZmZmZVTCApOworCXFwLT5yZWN2Lm51bV93cWVzID0gbnVtX3JlY3Zfd3FlczsKKwlxcC0+cmVjdi5pb2J1ZnMgPSAoICggKCB2b2lkICogKSBxcCApICsgc2l6ZW9mICggKnFwICkgKworCQkJICAgICggbnVtX3NlbmRfd3FlcyAqIHNpemVvZiAoIHFwLT5zZW5kLmlvYnVmc1swXSApICkpOworCUlOSVRfTElTVF9IRUFEICggJnFwLT5tZ2lkcyApOworCisJLyogUGVyZm9ybSBkZXZpY2Utc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gYW5kIGdldCBRUE4gKi8KKwlpZiAoICggcmMgPSBpYmRldi0+b3AtPmNyZWF0ZV9xcCAoIGliZGV2LCBxcCApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgY291bGQgbm90IGluaXRpYWxpc2UgcXVldWUgcGFpcjogIgorCQkgICAgICAgIiVzXG4iLCBpYmRldiwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX2Rldl9jcmVhdGVfcXA7CisJfQorCURCR0MgKCBpYmRldiwgIklCREVWICVwIGNyZWF0ZWQgcXVldWUgcGFpciAlcCAoJXApIHdpdGggUVBOICUjbHhcbiIsCisJICAgICAgIGliZGV2LCBxcCwgaWJfcXBfZ2V0X2RydmRhdGEgKCBxcCApLCBxcC0+cXBuICk7CisJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgUVBOICUjbHggaGFzICVkIHNlbmQgZW50cmllcyBhdCBbJXAsJXApXG4iLAorCSAgICAgICBpYmRldiwgcXAtPnFwbiwgbnVtX3NlbmRfd3FlcywgcXAtPnNlbmQuaW9idWZzLAorCSAgICAgICBxcC0+cmVjdi5pb2J1ZnMgKTsKKwlEQkdDICggaWJkZXYsICJJQkRFViAlcCBRUE4gJSNseCBoYXMgJWQgcmVjZWl2ZSBlbnRyaWVzIGF0IFslcCwlcClcbiIsCisJICAgICAgIGliZGV2LCBxcC0+cXBuLCBudW1fcmVjdl93cWVzLCBxcC0+cmVjdi5pb2J1ZnMsCisJICAgICAgICggKCAoIHZvaWQgKiApIHFwICkgKyB0b3RhbF9zaXplICkgKTsKKworCS8qIENhbGN1bGF0ZSBleHRlcm5hbGx5LXZpc2libGUgUVBOICovCisJc3dpdGNoICggdHlwZSApIHsKKwljYXNlIElCX1FQVF9TTUk6CisJCXFwLT5leHRfcXBuID0gSUJfUVBOX1NNSTsKKwkJYnJlYWs7CisJY2FzZSBJQl9RUFRfR1NJOgorCQlxcC0+ZXh0X3FwbiA9IElCX1FQTl9HU0k7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXFwLT5leHRfcXBuID0gcXAtPnFwbjsKKwkJYnJlYWs7CisJfQorCWlmICggcXAtPmV4dF9xcG4gIT0gcXAtPnFwbiApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgUVBOICUjbHggaGFzIGV4dGVybmFsIFFQTiAlI2x4XG4iLAorCQkgICAgICAgaWJkZXYsIHFwLT5xcG4sIHFwLT5leHRfcXBuICk7CisJfQorCisJcmV0dXJuIHFwOworCisJaWJkZXYtPm9wLT5kZXN0cm95X3FwICggaWJkZXYsIHFwICk7CisgZXJyX2Rldl9jcmVhdGVfcXA6CisJbGlzdF9kZWwgKCAmcXAtPnNlbmQubGlzdCApOworCWxpc3RfZGVsICggJnFwLT5yZWN2Lmxpc3QgKTsKKwlsaXN0X2RlbCAoICZxcC0+bGlzdCApOworCWZyZWUgKCBxcCApOworIGVycl9hbGxvY19xcDoKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBNb2RpZnkgcXVldWUgcGFpcgorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGF2CQlOZXcgYWRkcmVzcyB2ZWN0b3IsIGlmIGFwcGxpY2FibGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgaWJfbW9kaWZ5X3FwICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCApIHsKKwlpbnQgcmM7CisKKwlEQkdDICggaWJkZXYsICJJQkRFViAlcCBtb2RpZnlpbmcgUVBOICUjbHhcbiIsIGliZGV2LCBxcC0+cXBuICk7CisKKwlpZiAoICggcmMgPSBpYmRldi0+b3AtPm1vZGlmeV9xcCAoIGliZGV2LCBxcCApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgY291bGQgbm90IG1vZGlmeSBRUE4gJSNseDogJXNcbiIsCisJCSAgICAgICBpYmRldiwgcXAtPnFwbiwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBEZXN0cm95IHF1ZXVlIHBhaXIKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKi8KK3ZvaWQgaWJfZGVzdHJveV9xcCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAgKSB7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisJdW5zaWduZWQgaW50IGk7CisKKwlEQkdDICggaWJkZXYsICJJQkRFViAlcCBkZXN0cm95aW5nIFFQTiAlI2x4XG4iLAorCSAgICAgICBpYmRldiwgcXAtPnFwbiApOworCisJYXNzZXJ0ICggbGlzdF9lbXB0eSAoICZxcC0+bWdpZHMgKSApOworCisJLyogUGVyZm9ybSBkZXZpY2Utc3BlY2lmaWMgZGVzdHJ1Y3Rpb24gKi8KKwlpYmRldi0+b3AtPmRlc3Ryb3lfcXAgKCBpYmRldiwgcXAgKTsKKworCS8qIENvbXBsZXRlIGFueSByZW1haW5pbmcgSS9PIGJ1ZmZlcnMgd2l0aCBlcnJvcnMgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBxcC0+c2VuZC5udW1fd3FlcyA7IGkrKyApIHsKKwkJaWYgKCAoIGlvYnVmID0gcXAtPnNlbmQuaW9idWZzW2ldICkgIT0gTlVMTCApCisJCQlpYl9jb21wbGV0ZV9zZW5kICggaWJkZXYsIHFwLCBpb2J1ZiwgLUVDQU5DRUxFRCApOworCX0KKwlmb3IgKCBpID0gMCA7IGkgPCBxcC0+cmVjdi5udW1fd3FlcyA7IGkrKyApIHsKKwkJaWYgKCAoIGlvYnVmID0gcXAtPnJlY3YuaW9idWZzW2ldICkgIT0gTlVMTCApIHsKKwkJCWliX2NvbXBsZXRlX3JlY3YgKCBpYmRldiwgcXAsIE5VTEwsIGlvYnVmLAorCQkJCQkgICAtRUNBTkNFTEVEICk7CisJCX0KKwl9CisKKwkvKiBSZW1vdmUgd29yayBxdWV1ZXMgZnJvbSBjb21wbGV0aW9uIHF1ZXVlICovCisJbGlzdF9kZWwgKCAmcXAtPnNlbmQubGlzdCApOworCWxpc3RfZGVsICggJnFwLT5yZWN2Lmxpc3QgKTsKKworCS8qIEZyZWUgUVAgKi8KKwlsaXN0X2RlbCAoICZxcC0+bGlzdCApOworCWZyZWUgKCBxcCApOworfQorCisvKioKKyAqIEZpbmQgcXVldWUgcGFpciBieSBRUE4KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwbgkJUXVldWUgcGFpciBudW1iZXIKKyAqIEByZXQgcXAJCVF1ZXVlIHBhaXIsIG9yIE5VTEwKKyAqLworc3RydWN0IGliX3F1ZXVlX3BhaXIgKiBpYl9maW5kX3FwX3FwbiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCQl1bnNpZ25lZCBsb25nIHFwbiApIHsKKwlzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggcXAsICZpYmRldi0+cXBzLCBsaXN0ICkgeworCQlpZiAoICggcXBuID09IHFwLT5xcG4gKSB8fCAoIHFwbiA9PSBxcC0+ZXh0X3FwbiApICkKKwkJCXJldHVybiBxcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRmluZCBxdWV1ZSBwYWlyIGJ5IG11bHRpY2FzdCBHSUQKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IGdpZAkJTXVsdGljYXN0IEdJRAorICogQHJldCBxcAkJUXVldWUgcGFpciwgb3IgTlVMTAorICovCitzdHJ1Y3QgaWJfcXVldWVfcGFpciAqIGliX2ZpbmRfcXBfbWdpZCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCQkgc3RydWN0IGliX2dpZCAqZ2lkICkgeworCXN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcDsKKwlzdHJ1Y3QgaWJfbXVsdGljYXN0X2dpZCAqbWdpZDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBxcCwgJmliZGV2LT5xcHMsIGxpc3QgKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBtZ2lkLCAmcXAtPm1naWRzLCBsaXN0ICkgeworCQkJaWYgKCBtZW1jbXAgKCAmbWdpZC0+Z2lkLCBnaWQsCisJCQkJICAgICAgc2l6ZW9mICggbWdpZC0+Z2lkICkgKSA9PSAwICkgeworCQkJCXJldHVybiBxcDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBGaW5kIHdvcmsgcXVldWUgYmVsb25naW5nIHRvIGNvbXBsZXRpb24gcXVldWUKKyAqCisgKiBAdiBjcQkJQ29tcGxldGlvbiBxdWV1ZQorICogQHYgcXBuCQlRdWV1ZSBwYWlyIG51bWJlcgorICogQHYgaXNfc2VuZAkJRmluZCBzZW5kIHdvcmsgcXVldWUgKHJhdGhlciB0aGFuIHJlY2VpdmUpCisgKiBAcmV0IHdxCQlXb3JrIHF1ZXVlLCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitzdHJ1Y3QgaWJfd29ya19xdWV1ZSAqIGliX2ZpbmRfd3EgKCBzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3EsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcXBuLCBpbnQgaXNfc2VuZCApIHsKKwlzdHJ1Y3QgaWJfd29ya19xdWV1ZSAqd3E7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggd3EsICZjcS0+d29ya19xdWV1ZXMsIGxpc3QgKSB7CisJCWlmICggKCB3cS0+cXAtPnFwbiA9PSBxcG4gKSAmJiAoIHdxLT5pc19zZW5kID09IGlzX3NlbmQgKSApCisJCQlyZXR1cm4gd3E7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIFBvc3Qgc2VuZCB3b3JrIHF1ZXVlIGVudHJ5CisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpYl9wb3N0X3NlbmQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2LAorCQkgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApIHsKKwlzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgYXZfY29weTsKKwlpbnQgcmM7CisKKwkvKiBDaGVjayBxdWV1ZSBmaWxsIGxldmVsICovCisJaWYgKCBxcC0+c2VuZC5maWxsID49IHFwLT5zZW5kLm51bV93cWVzICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBRUE4gJSNseCBzZW5kIHF1ZXVlIGZ1bGxcbiIsCisJCSAgICAgICBpYmRldiwgcXAtPnFwbiApOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJLyogVXNlIGRlZmF1bHQgYWRkcmVzcyB2ZWN0b3IgaWYgbm9uZSBzcGVjaWZpZWQgKi8KKwlpZiAoICEgYXYgKQorCQlhdiA9ICZxcC0+YXY7CisKKwkvKiBNYWtlIG1vZGlmaWFibGUgY29weSBvZiBhZGRyZXNzIHZlY3RvciAqLworCW1lbWNweSAoICZhdl9jb3B5LCBhdiwgc2l6ZW9mICggYXZfY29weSApICk7CisJYXYgPSAmYXZfY29weTsKKworCS8qIEZpbGwgaW4gb3B0aW9uYWwgcGFyYW1ldGVycyBpbiBhZGRyZXNzIHZlY3RvciAqLworCWlmICggISBhdi0+cWtleSApCisJCWF2LT5xa2V5ID0gcXAtPnFrZXk7CisJaWYgKCAhIGF2LT5yYXRlICkKKwkJYXYtPnJhdGUgPSBJQl9SQVRFXzJfNTsKKworCS8qIFBvc3QgdG8gaGFyZHdhcmUgKi8KKwlpZiAoICggcmMgPSBpYmRldi0+b3AtPnBvc3Rfc2VuZCAoIGliZGV2LCBxcCwgYXYsIGlvYnVmICkgKSAhPSAwICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBRUE4gJSNseCBjb3VsZCBub3QgcG9zdCBzZW5kIFdRRTogIgorCQkgICAgICAgIiVzXG4iLCBpYmRldiwgcXAtPnFwbiwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlxcC0+c2VuZC5maWxsKys7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUG9zdCByZWNlaXZlIHdvcmsgcXVldWUgZW50cnkKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpYl9wb3N0X3JlY3YgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApIHsKKwlpbnQgcmM7CisKKwkvKiBDaGVjayBwYWNrZXQgbGVuZ3RoICovCisJaWYgKCBpb2JfdGFpbHJvb20gKCBpb2J1ZiApIDwgSUJfTUFYX1BBWUxPQURfU0laRSApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgUVBOICUjbHggd3JvbmcgUlggYnVmZmVyIHNpemUgKCV6ZClcbiIsCisJCSAgICAgICBpYmRldiwgcXAtPnFwbiwgaW9iX3RhaWxyb29tICggaW9idWYgKSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBxdWV1ZSBmaWxsIGxldmVsICovCisJaWYgKCBxcC0+cmVjdi5maWxsID49IHFwLT5yZWN2Lm51bV93cWVzICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBRUE4gJSNseCByZWNlaXZlIHF1ZXVlIGZ1bGxcbiIsCisJCSAgICAgICBpYmRldiwgcXAtPnFwbiApOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJLyogUG9zdCB0byBoYXJkd2FyZSAqLworCWlmICggKCByYyA9IGliZGV2LT5vcC0+cG9zdF9yZWN2ICggaWJkZXYsIHFwLCBpb2J1ZiApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgUVBOICUjbHggY291bGQgbm90IHBvc3QgcmVjZWl2ZSBXUUU6ICIKKwkJICAgICAgICIlc1xuIiwgaWJkZXYsIHFwLT5xcG4sIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcXAtPnJlY3YuZmlsbCsrOworCXJldHVybiAwOworfQorCisvKioKKyAqIENvbXBsZXRlIHNlbmQgd29yayBxdWV1ZSBlbnRyeQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiByYwkJQ29tcGxldGlvbiBzdGF0dXMgY29kZQorICovCit2b2lkIGliX2NvbXBsZXRlX3NlbmQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGludCByYyApIHsKKworCWlmICggcXAtPnNlbmQuY3EtPm9wLT5jb21wbGV0ZV9zZW5kICkgeworCQlxcC0+c2VuZC5jcS0+b3AtPmNvbXBsZXRlX3NlbmQgKCBpYmRldiwgcXAsIGlvYnVmLCByYyApOworCX0gZWxzZSB7CisJCWZyZWVfaW9iICggaW9idWYgKTsKKwl9CisJcXAtPnNlbmQuZmlsbC0tOworfQorCisvKioKKyAqIENvbXBsZXRlIHJlY2VpdmUgd29yayBxdWV1ZSBlbnRyeQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGF2CQlBZGRyZXNzIHZlY3RvcgorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEB2IHJjCQlDb21wbGV0aW9uIHN0YXR1cyBjb2RlCisgKi8KK3ZvaWQgaWJfY29tcGxldGVfcmVjdiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQlzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2LAorCQkJc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGludCByYyApIHsKKworCWlmICggcXAtPnJlY3YuY3EtPm9wLT5jb21wbGV0ZV9yZWN2ICkgeworCQlxcC0+cmVjdi5jcS0+b3AtPmNvbXBsZXRlX3JlY3YgKCBpYmRldiwgcXAsIGF2LCBpb2J1ZiwgcmMgKTsKKwl9IGVsc2UgeworCQlmcmVlX2lvYiAoIGlvYnVmICk7CisJfQorCXFwLT5yZWN2LmZpbGwtLTsKK30KKworLyoqCisgKiBSZWZpbGwgcmVjZWl2ZSB3b3JrIHF1ZXVlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICovCit2b2lkIGliX3JlZmlsbF9yZWN2ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCApIHsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwlpbnQgcmM7CisKKwkvKiBLZWVwIGZpbGxpbmcgd2hpbGUgdW5maWxsZWQgZW50cmllcyByZW1haW4gKi8KKwl3aGlsZSAoIHFwLT5yZWN2LmZpbGwgPCBxcC0+cmVjdi5udW1fd3FlcyApIHsKKworCQkvKiBBbGxvY2F0ZSBJL08gYnVmZmVyICovCisJCWlvYnVmID0gYWxsb2NfaW9iICggSUJfTUFYX1BBWUxPQURfU0laRSApOworCQlpZiAoICEgaW9idWYgKSB7CisJCQkvKiBOb24tZmF0YWw7IHdlIHdpbGwgcmVmaWxsIG9uIG5leHQgYXR0ZW1wdCAqLworCQkJcmV0dXJuOworCQl9CisKKwkJLyogUG9zdCBJL08gYnVmZmVyICovCisJCWlmICggKCByYyA9IGliX3Bvc3RfcmVjdiAoIGliZGV2LCBxcCwgaW9idWYgKSApICE9IDAgKSB7CisJCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBjb3VsZCBub3QgcmVmaWxsOiAlc1xuIiwKKwkJCSAgICAgICBpYmRldiwgc3RyZXJyb3IgKCByYyApICk7CisJCQlmcmVlX2lvYiAoIGlvYnVmICk7CisJCQkvKiBHaXZlIHVwICovCisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBMaW5rIGNvbnRyb2wKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBPcGVuIHBvcnQKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgaWJfb3BlbiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICkgeworCWludCByYzsKKworCS8qIEluY3JlbWVudCBkZXZpY2Ugb3BlbiByZXF1ZXN0IGNvdW50ZXIgKi8KKwlpZiAoIGliZGV2LT5vcGVuX2NvdW50KysgPiAwICkgeworCQkvKiBEZXZpY2Ugd2FzIGFscmVhZHkgb3BlbjsgZG8gbm90aGluZyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDcmVhdGUgc3VibmV0IG1hbmFnZW1lbnQgaW50ZXJmYWNlICovCisJaWJkZXYtPnNtaSA9IGliX2NyZWF0ZV9taSAoIGliZGV2LCBJQl9RUFRfU01JICk7CisJaWYgKCAhIGliZGV2LT5zbWkgKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIGNvdWxkIG5vdCBjcmVhdGUgU01JXG4iLCBpYmRldiApOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2NyZWF0ZV9zbWk7CisJfQorCisJLyogQ3JlYXRlIHN1Ym5ldCBtYW5hZ2VtZW50IGFnZW50ICovCisJaWYgKCAoIHJjID0gaWJfY3JlYXRlX3NtYSAoIGliZGV2LCBpYmRldi0+c21pICkgKSAhPSAwICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBjb3VsZCBub3QgY3JlYXRlIFNNQTogJXNcbiIsCisJCSAgICAgICBpYmRldiwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX2NyZWF0ZV9zbWE7CisJfQorCisJLyogQ3JlYXRlIGdlbmVyYWwgc2VydmljZXMgaW50ZXJmYWNlICovCisJaWJkZXYtPmdzaSA9IGliX2NyZWF0ZV9taSAoIGliZGV2LCBJQl9RUFRfR1NJICk7CisJaWYgKCAhIGliZGV2LT5nc2kgKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIGNvdWxkIG5vdCBjcmVhdGUgR1NJXG4iLCBpYmRldiApOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2NyZWF0ZV9nc2k7CisJfQorCisJLyogT3BlbiBkZXZpY2UgKi8KKwlpZiAoICggcmMgPSBpYmRldi0+b3AtPm9wZW4gKCBpYmRldiApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgY291bGQgbm90IG9wZW46ICVzXG4iLAorCQkgICAgICAgaWJkZXYsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9vcGVuOworCX0KKworCS8qIEFkZCB0byBoZWFkIG9mIG9wZW4gZGV2aWNlcyBsaXN0ICovCisJbGlzdF9hZGQgKCAmaWJkZXYtPm9wZW5fbGlzdCwgJm9wZW5faWJfZGV2aWNlcyApOworCisJYXNzZXJ0ICggaWJkZXYtPm9wZW5fY291bnQgPT0gMSApOworCXJldHVybiAwOworCisJaWJkZXYtPm9wLT5jbG9zZSAoIGliZGV2ICk7CisgZXJyX29wZW46CisJaWJfZGVzdHJveV9taSAoIGliZGV2LCBpYmRldi0+Z3NpICk7CisgZXJyX2NyZWF0ZV9nc2k6CisJaWJfZGVzdHJveV9zbWEgKCBpYmRldiwgaWJkZXYtPnNtaSApOworIGVycl9jcmVhdGVfc21hOgorCWliX2Rlc3Ryb3lfbWkgKCBpYmRldiwgaWJkZXYtPnNtaSApOworIGVycl9jcmVhdGVfc21pOgorCWFzc2VydCAoIGliZGV2LT5vcGVuX2NvdW50ID09IDEgKTsKKwlpYmRldi0+b3Blbl9jb3VudCA9IDA7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIENsb3NlIHBvcnQKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqLwordm9pZCBpYl9jbG9zZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICkgeworCisJLyogRGVjcmVtZW50IGRldmljZSBvcGVuIHJlcXVlc3QgY291bnRlciAqLworCWliZGV2LT5vcGVuX2NvdW50LS07CisKKwkvKiBDbG9zZSBkZXZpY2UgaWYgdGhpcyB3YXMgdGhlIGxhc3QgcmVtYWluaW5nIHJlcXVlc3RlZCBvcGVuaW5nICovCisJaWYgKCBpYmRldi0+b3Blbl9jb3VudCA9PSAwICkgeworCQlsaXN0X2RlbCAoICZpYmRldi0+b3Blbl9saXN0ICk7CisJCWliX2Rlc3Ryb3lfbWkgKCBpYmRldiwgaWJkZXYtPmdzaSApOworCQlpYl9kZXN0cm95X3NtYSAoIGliZGV2LCBpYmRldi0+c21pICk7CisJCWliX2Rlc3Ryb3lfbWkgKCBpYmRldiwgaWJkZXYtPnNtaSApOworCQlpYmRldi0+b3AtPmNsb3NlICggaWJkZXYgKTsKKwl9Cit9CisKKy8qKgorICogR2V0IGxpbmsgc3RhdGUKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEByZXQgcmMJCUxpbmsgc3RhdHVzIGNvZGUKKyAqLworaW50IGliX2xpbmtfcmMgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKwlzd2l0Y2ggKCBpYmRldi0+cG9ydF9zdGF0ZSApIHsKKwljYXNlIElCX1BPUlRfU1RBVEVfRE9XTjoJcmV0dXJuIC1FTk9UQ09OTjsKKwljYXNlIElCX1BPUlRfU1RBVEVfSU5JVDoJcmV0dXJuIC1FSU5QUk9HUkVTU19JTklUOworCWNhc2UgSUJfUE9SVF9TVEFURV9BUk1FRDoJcmV0dXJuIC1FSU5QUk9HUkVTU19BUk1FRDsKKwljYXNlIElCX1BPUlRfU1RBVEVfQUNUSVZFOglyZXR1cm4gMDsKKwlkZWZhdWx0OgkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE11bHRpY2FzdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIEF0dGFjaCB0byBtdWx0aWNhc3QgZ3JvdXAKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBnaWQJCU11bHRpY2FzdCBHSUQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgb25seSB0aGUgbG9jYWwgZGV2aWNlJ3MgYXR0YWNobWVudAorICogdG8gdGhlIG11bHRpY2FzdCBHSUQ7IGl0IGRvZXMgbm90IGlzc3VlIHRoZSByZWxldmFudCBNQURzIHRvIGpvaW4KKyAqIHRoZSBtdWx0aWNhc3QgZ3JvdXAgb24gdGhlIHN1Ym5ldC4KKyAqLworaW50IGliX21jYXN0X2F0dGFjaCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCSAgICAgIHN0cnVjdCBpYl9naWQgKmdpZCApIHsKKwlzdHJ1Y3QgaWJfbXVsdGljYXN0X2dpZCAqbWdpZDsKKwlpbnQgcmM7CisKKwkvKiBBZGQgdG8gc29mdHdhcmUgbXVsdGljYXN0IEdJRCBsaXN0ICovCisJbWdpZCA9IHphbGxvYyAoIHNpemVvZiAoICptZ2lkICkgKTsKKwlpZiAoICEgbWdpZCApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19tZ2lkOworCX0KKwltZW1jcHkgKCAmbWdpZC0+Z2lkLCBnaWQsIHNpemVvZiAoIG1naWQtPmdpZCApICk7CisJbGlzdF9hZGQgKCAmbWdpZC0+bGlzdCwgJnFwLT5tZ2lkcyApOworCisJLyogQWRkIHRvIGhhcmR3YXJlIG11bHRpY2FzdCBHSUQgbGlzdCAqLworCWlmICggKCByYyA9IGliZGV2LT5vcC0+bWNhc3RfYXR0YWNoICggaWJkZXYsIHFwLCBnaWQgKSApICE9IDAgKQorCQlnb3RvIGVycl9kZXZfbWNhc3RfYXR0YWNoOworCisJcmV0dXJuIDA7CisKKyBlcnJfZGV2X21jYXN0X2F0dGFjaDoKKwlsaXN0X2RlbCAoICZtZ2lkLT5saXN0ICk7CisJZnJlZSAoIG1naWQgKTsKKyBlcnJfYWxsb2NfbWdpZDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogRGV0YWNoIGZyb20gbXVsdGljYXN0IGdyb3VwCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgZ2lkCQlNdWx0aWNhc3QgR0lECisgKi8KK3ZvaWQgaWJfbWNhc3RfZGV0YWNoICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJICAgICAgIHN0cnVjdCBpYl9naWQgKmdpZCApIHsKKwlzdHJ1Y3QgaWJfbXVsdGljYXN0X2dpZCAqbWdpZDsKKworCS8qIFJlbW92ZSBmcm9tIGhhcmR3YXJlIG11bHRpY2FzdCBHSUQgbGlzdCAqLworCWliZGV2LT5vcC0+bWNhc3RfZGV0YWNoICggaWJkZXYsIHFwLCBnaWQgKTsKKworCS8qIFJlbW92ZSBmcm9tIHNvZnR3YXJlIG11bHRpY2FzdCBHSUQgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBtZ2lkLCAmcXAtPm1naWRzLCBsaXN0ICkgeworCQlpZiAoIG1lbWNtcCAoICZtZ2lkLT5naWQsIGdpZCwgc2l6ZW9mICggbWdpZC0+Z2lkICkgKSA9PSAwICkgeworCQkJbGlzdF9kZWwgKCAmbWdpZC0+bGlzdCApOworCQkJZnJlZSAoIG1naWQgKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWlzY2VsbGFuZW91cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIEdldCBJbmZpbmliYW5kIEhDQSBpbmZvcm1hdGlvbgorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHJldCBoY2FfZ3VpZAlIQ0EgR1VJRAorICogQHJldCBudW1fcG9ydHMJTnVtYmVyIG9mIHBvcnRzCisgKi8KK2ludCBpYl9nZXRfaGNhX2luZm8gKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJICAgICAgc3RydWN0IGliX2dpZF9oYWxmICpoY2FfZ3VpZCApIHsKKwlzdHJ1Y3QgaWJfZGV2aWNlICp0bXA7CisJaW50IG51bV9wb3J0cyA9IDA7CisKKwkvKiBTZWFyY2ggZm9yIElCIGRldmljZXMgd2l0aCB0aGUgc2FtZSBwaHlzaWNhbCBkZXZpY2UgdG8KKwkgKiBpZGVudGlmeSBwb3J0IGNvdW50IGFuZCBhIHN1aXRhYmxlIE5vZGUgR1VJRC4KKwkgKi8KKwlmb3JfZWFjaF9pYmRldiAoIHRtcCApIHsKKwkJaWYgKCB0bXAtPmRldiAhPSBpYmRldi0+ZGV2ICkKKwkJCWNvbnRpbnVlOworCQlpZiAoIG51bV9wb3J0cyA9PSAwICkgeworCQkJbWVtY3B5ICggaGNhX2d1aWQsICZ0bXAtPmdpZC51LmhhbGZbMV0sCisJCQkJIHNpemVvZiAoICpoY2FfZ3VpZCApICk7CisJCX0KKwkJbnVtX3BvcnRzKys7CisJfQorCXJldHVybiBudW1fcG9ydHM7Cit9CisKKy8qKgorICogU2V0IHBvcnQgaW5mb3JtYXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG1hZAkJU2V0IHBvcnQgaW5mb3JtYXRpb24gTUFECisgKi8KK2ludCBpYl9zZXRfcG9ydF9pbmZvICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHVuaW9uIGliX21hZCAqbWFkICkgeworCWludCByYzsKKworCS8qIEFkYXB0ZXJzIHdpdGggZW1iZWRkZWQgU01BcyBkbyBub3QgbmVlZCB0byBzdXBwb3J0IHRoaXMgbWV0aG9kICovCisJaWYgKCAhIGliZGV2LT5vcC0+c2V0X3BvcnRfaW5mbyApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgZG9lcyBub3Qgc3VwcG9ydCBzZXR0aW5nIHBvcnQgIgorCQkgICAgICAgImluZm9ybWF0aW9uXG4iLCBpYmRldiApOworCQlyZXR1cm4gLUVOT1RTVVA7CisJfQorCisJaWYgKCAoIHJjID0gaWJkZXYtPm9wLT5zZXRfcG9ydF9pbmZvICggaWJkZXYsIG1hZCApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgY291bGQgbm90IHNldCBwb3J0IGluZm9ybWF0aW9uOiAlc1xuIiwKKwkJICAgICAgIGliZGV2LCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfTsKKworLyoqCisgKiBTZXQgcGFydGl0aW9uIGtleSB0YWJsZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgbWFkCQlTZXQgcGFydGl0aW9uIGtleSB0YWJsZSBNQUQKKyAqLworaW50IGliX3NldF9wa2V5X3RhYmxlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHVuaW9uIGliX21hZCAqbWFkICkgeworCWludCByYzsKKworCS8qIEFkYXB0ZXJzIHdpdGggZW1iZWRkZWQgU01BcyBkbyBub3QgbmVlZCB0byBzdXBwb3J0IHRoaXMgbWV0aG9kICovCisJaWYgKCAhIGliZGV2LT5vcC0+c2V0X3BrZXlfdGFibGUgKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyBwYXJ0aXRpb24gIgorCQkgICAgICAgImtleSB0YWJsZVxuIiwgaWJkZXYgKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KKworCWlmICggKCByYyA9IGliZGV2LT5vcC0+c2V0X3BrZXlfdGFibGUgKCBpYmRldiwgbWFkICkgKSAhPSAwICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBjb3VsZCBub3Qgc2V0IHBhcnRpdGlvbiBrZXkgdGFibGU6ICIKKwkJICAgICAgICIlc1xuIiwgaWJkZXYsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXZlbnQgcXVldWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogSGFuZGxlIEluZmluaWJhbmQgbGluayBzdGF0ZSBjaGFuZ2UKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqLwordm9pZCBpYl9saW5rX3N0YXRlX2NoYW5nZWQgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKworCS8qIE5vdGlmeSBJUG9JQiBvZiBsaW5rIHN0YXRlIGNoYW5nZSAqLworCWlwb2liX2xpbmtfc3RhdGVfY2hhbmdlZCAoIGliZGV2ICk7Cit9CisKKy8qKgorICogUG9sbCBldmVudCBxdWV1ZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICovCit2b2lkIGliX3BvbGxfZXEgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKwlzdHJ1Y3QgaWJfY29tcGxldGlvbl9xdWV1ZSAqY3E7CisKKwkvKiBQb2xsIGRldmljZSdzIGV2ZW50IHF1ZXVlICovCisJaWJkZXYtPm9wLT5wb2xsX2VxICggaWJkZXYgKTsKKworCS8qIFBvbGwgYWxsIGNvbXBsZXRpb24gcXVldWVzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIGNxLCAmaWJkZXYtPmNxcywgbGlzdCApCisJCWliX3BvbGxfY3EgKCBpYmRldiwgY3EgKTsKK30KKworLyoqCisgKiBTaW5nbGUtc3RlcCB0aGUgSW5maW5pYmFuZCBldmVudCBxdWV1ZQorICoKKyAqIEB2IHByb2Nlc3MJCUluZmluaWJhbmQgZXZlbnQgcXVldWUgcHJvY2VzcworICovCitzdGF0aWMgdm9pZCBpYl9zdGVwICggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MgX191bnVzZWQgKSB7CisJc3RydWN0IGliX2RldmljZSAqaWJkZXY7CisKKwlmb3JfZWFjaF9pYmRldiAoIGliZGV2ICkKKwkJaWJfcG9sbF9lcSAoIGliZGV2ICk7Cit9CisKKy8qKiBJbmZpbmliYW5kIGV2ZW50IHF1ZXVlIHByb2Nlc3MgKi8KK3N0cnVjdCBwcm9jZXNzIGliX3Byb2Nlc3MgX19wZXJtYW5lbnRfcHJvY2VzcyA9IHsKKwkubGlzdCA9IExJU1RfSEVBRF9JTklUICggaWJfcHJvY2Vzcy5saXN0ICksCisJLnN0ZXAgPSBpYl9zdGVwLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEluZmluaWJhbmQgZGV2aWNlIGNyZWF0aW9uL2Rlc3RydWN0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQWxsb2NhdGUgSW5maW5pYmFuZCBkZXZpY2UKKyAqCisgKiBAdiBwcml2X3NpemUJCVNpemUgb2YgZHJpdmVyIHByaXZhdGUgZGF0YSBhcmVhCisgKiBAcmV0IGliZGV2CQlJbmZpbmliYW5kIGRldmljZSwgb3IgTlVMTAorICovCitzdHJ1Y3QgaWJfZGV2aWNlICogYWxsb2NfaWJkZXYgKCBzaXplX3QgcHJpdl9zaXplICkgeworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OworCXZvaWQgKmRydl9wcml2OworCXNpemVfdCB0b3RhbF9sZW47CisKKwl0b3RhbF9sZW4gPSAoIHNpemVvZiAoICppYmRldiApICsgcHJpdl9zaXplICk7CisJaWJkZXYgPSB6YWxsb2MgKCB0b3RhbF9sZW4gKTsKKwlpZiAoIGliZGV2ICkgeworCQlkcnZfcHJpdiA9ICggKCAoIHZvaWQgKiApIGliZGV2ICkgKyBzaXplb2YgKCAqaWJkZXYgKSApOworCQlpYl9zZXRfZHJ2ZGF0YSAoIGliZGV2LCBkcnZfcHJpdiApOworCQlJTklUX0xJU1RfSEVBRCAoICZpYmRldi0+Y3FzICk7CisJCUlOSVRfTElTVF9IRUFEICggJmliZGV2LT5xcHMgKTsKKwkJaWJkZXYtPnBvcnRfc3RhdGUgPSBJQl9QT1JUX1NUQVRFX0RPV047CisJCWliZGV2LT5saWQgPSBJQl9MSURfTk9ORTsKKwkJaWJkZXYtPnBrZXkgPSBJQl9QS0VZX0RFRkFVTFQ7CisJfQorCXJldHVybiBpYmRldjsKK30KKworLyoqCisgKiBSZWdpc3RlciBJbmZpbmliYW5kIGRldmljZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCByZWdpc3Rlcl9pYmRldiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ICkgeworCWludCByYzsKKworCS8qIEFkZCB0byBkZXZpY2UgbGlzdCAqLworCWliZGV2X2dldCAoIGliZGV2ICk7CisJbGlzdF9hZGRfdGFpbCAoICZpYmRldi0+bGlzdCwgJmliX2RldmljZXMgKTsKKworCS8qIEFkZCBJUG9JQiBkZXZpY2UgKi8KKwlpZiAoICggcmMgPSBpcG9pYl9wcm9iZSAoIGliZGV2ICkgKSAhPSAwICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBjb3VsZCBub3QgYWRkIElQb0lCIGRldmljZTogJXNcbiIsCisJCSAgICAgICBpYmRldiwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX2lwb2liX3Byb2JlOworCX0KKworCURCR0MgKCBpYmRldiwgIklCREVWICVwIHJlZ2lzdGVyZWQgKHBoeXMgJXMpXG4iLCBpYmRldiwKKwkgICAgICAgaWJkZXYtPmRldi0+bmFtZSApOworCXJldHVybiAwOworCisgZXJyX2lwb2liX3Byb2JlOgorCWxpc3RfZGVsICggJmliZGV2LT5saXN0ICk7CisJaWJkZXZfcHV0ICggaWJkZXYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogVW5yZWdpc3RlciBJbmZpbmliYW5kIGRldmljZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICovCit2b2lkIHVucmVnaXN0ZXJfaWJkZXYgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiApIHsKKworCS8qIENsb3NlIGRldmljZSAqLworCWlwb2liX3JlbW92ZSAoIGliZGV2ICk7CisKKwkvKiBSZW1vdmUgZnJvbSBkZXZpY2UgbGlzdCAqLworCWxpc3RfZGVsICggJmliZGV2LT5saXN0ICk7CisJaWJkZXZfcHV0ICggaWJkZXYgKTsKKwlEQkdDICggaWJkZXYsICJJQkRFViAlcCB1bnJlZ2lzdGVyZWRcbiIsIGliZGV2ICk7Cit9CisKKy8qKgorICogRmluZCBJbmZpbmliYW5kIGRldmljZSBieSBHSUQKKyAqCisgKiBAdiBnaWQJCUdJRAorICogQHJldCBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UsIG9yIE5VTEwKKyAqLworc3RydWN0IGliX2RldmljZSAqIGZpbmRfaWJkZXYgKCBzdHJ1Y3QgaWJfZ2lkICpnaWQgKSB7CisJc3RydWN0IGliX2RldmljZSAqaWJkZXY7CisKKwlmb3JfZWFjaF9pYmRldiAoIGliZGV2ICkgeworCQlpZiAoIG1lbWNtcCAoIGdpZCwgJmliZGV2LT5naWQsIHNpemVvZiAoICpnaWQgKSApID09IDAgKQorCQkJcmV0dXJuIGliZGV2OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBHZXQgbW9zdCByZWNlbnRseSBvcGVuZWQgSW5maW5pYmFuZCBkZXZpY2UKKyAqCisgKiBAcmV0IGliZGV2CQlNb3N0IHJlY2VudGx5IG9wZW5lZCBJbmZpbmliYW5kIGRldmljZSwgb3IgTlVMTAorICovCitzdHJ1Y3QgaWJfZGV2aWNlICogbGFzdF9vcGVuZWRfaWJkZXYgKCB2b2lkICkgeworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIGliZGV2LCAmb3Blbl9pYl9kZXZpY2VzLCBvcGVuX2xpc3QgKSB7CisJCWFzc2VydCAoIGliZGV2LT5vcGVuX2NvdW50ICE9IDAgKTsKKwkJcmV0dXJuIGliZGV2OworCX0KKworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfY20uYyBiL2dweGUvc3JjL25ldC9pbmZpbmliYW5kL2liX2NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNjViMwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9pbmZpbmliYW5kL2liX2NtLmMKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pbmZpbmliYW5kLmg+CisjaW5jbHVkZSA8Z3B4ZS9pYl9taS5oPgorI2luY2x1ZGUgPGdweGUvaWJfcGF0aHJlYy5oPgorI2luY2x1ZGUgPGdweGUvaWJfY20uaD4KKworLyoqCisgKiBAZmlsZQorICoKKyAqIEluZmluaWJhbmQgY29tbXVuaWNhdGlvbiBtYW5hZ2VtZW50CisgKgorICovCisKKy8qKiBMaXN0IG9mIGNvbm5lY3Rpb25zICovCitzdGF0aWMgTElTVF9IRUFEICggaWJfY21fY29ubnMgKTsKKworLyoqCisgKiBTZW5kICJyZWFkeSB0byB1c2UiIHJlc3BvbnNlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtaQkJTWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqIEB2IGNvbm4JCUNvbm5lY3Rpb24KKyAqIEB2IGF2CQlBZGRyZXNzIHZlY3RvcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJfY21fc2VuZF9ydHUgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWksCisJCQkgICAgc3RydWN0IGliX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApIHsKKwl1bmlvbiBpYl9tYWQgbWFkOworCXN0cnVjdCBpYl9jbV9yZWFkeV90b191c2UgKnJlYWR5ID0KKwkJJm1hZC5jbS5jbV9kYXRhLnJlYWR5X3RvX3VzZTsKKwlpbnQgcmM7CisKKwkvKiBDb25zdHJ1Y3QgInJlYWR5IHRvIHVzZSIgcmVzcG9uc2UgKi8KKwltZW1zZXQgKCAmbWFkLCAwLCBzaXplb2YgKCBtYWQgKSApOworCW1hZC5oZHIubWdtdF9jbGFzcyA9IElCX01HTVRfQ0xBU1NfQ007CisJbWFkLmhkci5jbGFzc192ZXJzaW9uID0gSUJfQ01fQ0xBU1NfVkVSU0lPTjsKKwltYWQuaGRyLm1ldGhvZCA9IElCX01HTVRfTUVUSE9EX1NFTkQ7CisJbWFkLmhkci5hdHRyX2lkID0gaHRvbnMgKCBJQl9DTV9BVFRSX1JFQURZX1RPX1VTRSApOworCXJlYWR5LT5sb2NhbF9pZCA9IGh0b25sICggY29ubi0+bG9jYWxfaWQgKTsKKwlyZWFkeS0+cmVtb3RlX2lkID0gaHRvbmwgKCBjb25uLT5yZW1vdGVfaWQgKTsKKwlpZiAoICggcmMgPSBpYl9taV9zZW5kICggaWJkZXYsIG1pLCAmbWFkLCBhdiApICkgIT0gMCApeworCQlEQkdDICggY29ubiwgIkNNICVwIGNvdWxkIG5vdCBzZW5kIFJUVTogJXNcbiIsCisJCSAgICAgICBjb25uLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEhhbmRsZSBkdXBsaWNhdGUgY29ubmVjdGlvbiByZXBsaWVzCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtaQkJTWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqIEB2IG1hZAkJUmVjZWl2ZWQgTUFECisgKiBAdiBhdgkJU291cmNlIGFkZHJlc3MgdmVjdG9yCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBJZiBhICJyZWFkeSB0byB1c2UiIE1BRCBpcyBsb3N0LCB0aGUgcGVlciBtYXkgcmVzZW5kIHRoZSBjb25uZWN0aW9uCisgKiByZXBseS4gIFdlIGhhdmUgdG8gcmVzcG9uZCB0byB0aGVzZSB3aXRoIGR1cGxpY2F0ZSAicmVhZHkgdG8gdXNlIgorICogTUFEcywgb3RoZXJ3aXNlIHRoZSBwZWVyIG1heSB0aW1lIG91dCBhbmQgZHJvcCB0aGUgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaWJfY21fY29ubmVjdF9yZXAgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQlzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWksCisJCQkJdW5pb24gaWJfbWFkICptYWQsCisJCQkJc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApIHsKKwlzdHJ1Y3QgaWJfY21fY29ubmVjdF9yZXBseSAqY29ubmVjdF9yZXAgPQorCQkmbWFkLT5jbS5jbV9kYXRhLmNvbm5lY3RfcmVwbHk7CisJc3RydWN0IGliX2Nvbm5lY3Rpb24gKmNvbm47CisJaW50IHJjOworCisJLyogSWRlbnRpZnkgY29ubmVjdGlvbiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBjb25uLCAmaWJfY21fY29ubnMsIGxpc3QgKSB7CisJCWlmICggbnRvaGwgKCBjb25uZWN0X3JlcC0+cmVtb3RlX2lkICkgIT0gY29ubi0+bG9jYWxfaWQgKQorCQkJY29udGludWU7CisJCS8qIFRyeSB0byBzZW5kICJyZWFkeSB0byB1c2UiIHJlcGx5ICovCisJCWlmICggKCByYyA9IGliX2NtX3NlbmRfcnR1ICggaWJkZXYsIG1pLCBjb25uLCBhdiApICkgIT0gMCApIHsKKwkJCS8qIElnbm9yZSBlcnJvcnMgKi8KKwkJCXJldHVybjsKKwkJfQorCQlyZXR1cm47CisJfQorCisJREJHICggIkNNIHVuaWRlbnRpZmllZCBjb25uZWN0aW9uICUwOHhcbiIsCisJICAgICAgbnRvaGwgKCBjb25uZWN0X3JlcC0+cmVtb3RlX2lkICkgKTsKK30KKworLyoqIENvbW11bmljYXRpb24gbWFuYWdlbWVudCBhZ2VudHMgKi8KK3N0cnVjdCBpYl9tYWRfYWdlbnQgaWJfY21fYWdlbnRbXSBfX2liX21hZF9hZ2VudCA9IHsKKwl7CisJCS5tZ210X2NsYXNzID0gSUJfTUdNVF9DTEFTU19DTSwKKwkJLmNsYXNzX3ZlcnNpb24gPSBJQl9DTV9DTEFTU19WRVJTSU9OLAorCQkuYXR0cl9pZCA9IGh0b25zICggSUJfQ01fQVRUUl9DT05ORUNUX1JFUExZICksCisJCS5oYW5kbGUgPSBpYl9jbV9jb25uZWN0X3JlcCwKKwl9LAorfTsKKworLyoqCisgKiBDb252ZXJ0IGNvbm5lY3Rpb24gcmVqZWN0aW9uIHJlYXNvbiB0byByZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBAdiByZWFzb24JCVJlamVjdGlvbiByZWFzb24gKGluIG5ldHdvcmsgYnl0ZSBvcmRlcikKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX2NtX3JlamVjdGlvbl9yZWFzb25fdG9fcmMgKCB1aW50MTZfdCByZWFzb24gKSB7CisJc3dpdGNoICggcmVhc29uICkgeworCWNhc2UgaHRvbnMgKCBJQl9DTV9SRUpFQ1RfQkFEX1NFUlZJQ0VfSUQgKSA6CisJCXJldHVybiAtRU5PREVWOworCWNhc2UgaHRvbnMgKCBJQl9DTV9SRUpFQ1RfU1RBTEVfQ09OTiApIDoKKwkJcmV0dXJuIC1FQUxSRUFEWTsKKwljYXNlIGh0b25zICggSUJfQ01fUkVKRUNUX0NPTlNVTUVSICkgOgorCQlyZXR1cm4gLUVOT1RUWTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVQRVJNOworCX0KK30KKworLyoqCisgKiBIYW5kbGUgY29ubmVjdGlvbiByZXF1ZXN0IHRyYW5zYWN0aW9uIGNvbXBsZXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG1pCQlNYW5hZ2VtZW50IGludGVyZmFjZQorICogQHYgbWFkeAkJTWFuYWdlbWVudCB0cmFuc2FjdGlvbgorICogQHYgcmMJCVN0YXR1cyBjb2RlCisgKiBAdiBtYWQJCVJlY2VpdmVkIE1BRCAob3IgTlVMTCBvbiBlcnJvcikKKyAqIEB2IGF2CQlTb3VyY2UgYWRkcmVzcyB2ZWN0b3IgKG9yIE5VTEwgb24gZXJyb3IpCisgKi8KK3N0YXRpYyB2b2lkIGliX2NtX3JlcV9jb21wbGV0ZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWksCisJCQkJIHN0cnVjdCBpYl9tYWRfdHJhbnNhY3Rpb24gKm1hZHgsCisJCQkJIGludCByYywgdW5pb24gaWJfbWFkICptYWQsCisJCQkJIHN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciAqYXYgKSB7CisJc3RydWN0IGliX2Nvbm5lY3Rpb24gKmNvbm4gPSBpYl9tYWR4X2dldF9vd25lcmRhdGEgKCBtYWR4ICk7CisJc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwID0gY29ubi0+cXA7CisJc3RydWN0IGliX2NtX2NvbW1vbiAqY29tbW9uID0gJm1hZC0+Y20uY21fZGF0YS5jb21tb247CisJc3RydWN0IGliX2NtX2Nvbm5lY3RfcmVwbHkgKmNvbm5lY3RfcmVwID0KKwkJJm1hZC0+Y20uY21fZGF0YS5jb25uZWN0X3JlcGx5OworCXN0cnVjdCBpYl9jbV9jb25uZWN0X3JlamVjdCAqY29ubmVjdF9yZWogPQorCQkmbWFkLT5jbS5jbV9kYXRhLmNvbm5lY3RfcmVqZWN0OworCXZvaWQgKnByaXZhdGVfZGF0YSA9IE5VTEw7CisJc2l6ZV90IHByaXZhdGVfZGF0YV9sZW4gPSAwOworCisJLyogUmVwb3J0IGZhaWx1cmVzICovCisJaWYgKCAoIHJjID09IDAgKSAmJiAoIG1hZC0+aGRyLnN0YXR1cyAhPSBodG9ucyAoIElCX01HTVRfU1RBVFVTX09LICkgKSkKKwkJcmMgPSAtRUlPOworCWlmICggcmMgIT0gMCApIHsKKwkJREJHQyAoIGNvbm4sICJDTSAlcCBjb25uZWN0aW9uIHJlcXVlc3QgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIGNvbm4sIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBSZWNvcmQgcmVtb3RlIGNvbW11bmljYXRpb24gSUQgKi8KKwljb25uLT5yZW1vdGVfaWQgPSBudG9obCAoIGNvbW1vbi0+bG9jYWxfaWQgKTsKKworCS8qIEhhbmRsZSByZXNwb25zZSAqLworCXN3aXRjaCAoIG1hZC0+aGRyLmF0dHJfaWQgKSB7CisKKwljYXNlIGh0b25zICggSUJfQ01fQVRUUl9DT05ORUNUX1JFUExZICkgOgorCQkvKiBFeHRyYWN0IGZpZWxkcyAqLworCQlxcC0+YXYucXBuID0gKCBudG9obCAoIGNvbm5lY3RfcmVwLT5sb2NhbF9xcG4gKSA+PiA4ICk7CisJCXFwLT5zZW5kLnBzbiA9ICggbnRvaGwgKCBjb25uZWN0X3JlcC0+c3RhcnRpbmdfcHNuICkgPj4gOCApOworCQlwcml2YXRlX2RhdGEgPSAmY29ubmVjdF9yZXAtPnByaXZhdGVfZGF0YTsKKwkJcHJpdmF0ZV9kYXRhX2xlbiA9IHNpemVvZiAoIGNvbm5lY3RfcmVwLT5wcml2YXRlX2RhdGEgKTsKKwkJREJHQyAoIGNvbm4sICJDTSAlcCBjb25uZWN0ZWQgdG8gUVBOICVseCBQU04gJXhcbiIsCisJCSAgICAgICBjb25uLCBxcC0+YXYucXBuLCBxcC0+c2VuZC5wc24gKTsKKworCQkvKiBNb2RpZnkgcXVldWUgcGFpciAqLworCQlpZiAoICggcmMgPSBpYl9tb2RpZnlfcXAgKCBpYmRldiwgcXAgKSApICE9IDAgKSB7CisJCQlEQkdDICggY29ubiwgIkNNICVwIGNvdWxkIG5vdCBtb2RpZnkgcXVldWUgcGFpcjogJXNcbiIsCisJCQkgICAgICAgY29ubiwgc3RyZXJyb3IgKCByYyApICk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIFNlbmQgInJlYWR5IHRvIHVzZSIgcmVwbHkgKi8KKwkJaWYgKCAoIHJjID0gaWJfY21fc2VuZF9ydHUgKCBpYmRldiwgbWksIGNvbm4sIGF2ICkgKSAhPSAwICkgeworCQkJLyogVHJlYXQgYXMgbm9uLWZhdGFsICovCisJCQlyYyA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGh0b25zICggSUJfQ01fQVRUUl9DT05ORUNUX1JFSkVDVCApIDoKKwkJLyogRXh0cmFjdCBmaWVsZHMgKi8KKwkJREJHQyAoIGNvbm4sICJDTSAlcCBjb25uZWN0aW9uIHJlamVjdGVkIChyZWFzb24gJWQpXG4iLAorCQkgICAgICAgY29ubiwgbnRvaHMgKCBjb25uZWN0X3Jlai0+cmVhc29uICkgKTsKKwkJLyogUHJpdmF0ZSBkYXRhIGlzIHZhbGlkIG9ubHkgZm9yIGEgQ29uc3VtZXIgUmVqZWN0ICovCisJCWlmICggY29ubmVjdF9yZWotPnJlYXNvbiA9PSBodG9ucyAoIElCX0NNX1JFSkVDVF9DT05TVU1FUiApICkgeworCQkJcHJpdmF0ZV9kYXRhID0gJmNvbm5lY3RfcmVqLT5wcml2YXRlX2RhdGE7CisJCQlwcml2YXRlX2RhdGFfbGVuID0gc2l6ZW9mIChjb25uZWN0X3Jlai0+cHJpdmF0ZV9kYXRhKTsKKwkJfQorCQlyYyA9IGliX2NtX3JlamVjdGlvbl9yZWFzb25fdG9fcmMgKCBjb25uZWN0X3Jlai0+cmVhc29uICk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREJHQyAoIGNvbm4sICJDTSAlcCB1bmV4cGVjdGVkIHJlc3BvbnNlIChhdHRyaWJ1dGUgJTA0eClcbiIsCisJCSAgICAgICBjb25uLCBudG9ocyAoIG1hZC0+aGRyLmF0dHJfaWQgKSApOworCQlyYyA9IC1FTk9UU1VQOworCQlicmVhazsKKwl9CisKKyBvdXQ6CisJLyogRGVzdHJveSB0aGUgY29tcGxldGVkIHRyYW5zYWN0aW9uICovCisJaWJfZGVzdHJveV9tYWR4ICggaWJkZXYsIGliZGV2LT5nc2ksIG1hZHggKTsKKwljb25uLT5tYWR4ID0gTlVMTDsKKworCS8qIEhhbmQgb2ZmIHRvIHRoZSB1cHBlciBjb21wbGV0aW9uIGhhbmRsZXIgKi8KKwljb25uLT5vcC0+Y2hhbmdlZCAoIGliZGV2LCBxcCwgY29ubiwgcmMsIHByaXZhdGVfZGF0YSwKKwkJCSAgICBwcml2YXRlX2RhdGFfbGVuICk7Cit9CisKKy8qKiBDb25uZWN0aW9uIHJlcXVlc3Qgb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBpYl9tYWRfdHJhbnNhY3Rpb25fb3BlcmF0aW9ucyBpYl9jbV9yZXFfb3AgPSB7CisJLmNvbXBsZXRlID0gaWJfY21fcmVxX2NvbXBsZXRlLAorfTsKKworLyoqCisgKiBIYW5kbGUgY29ubmVjdGlvbiBwYXRoIHRyYW5zYWN0aW9uIGNvbXBsZXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHBhdGgJCVBhdGgKKyAqIEB2IHJjCQlTdGF0dXMgY29kZQorICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yLCBvciBOVUxMIG9uIGVycm9yCisgKi8KK3N0YXRpYyB2b2lkIGliX2NtX3BhdGhfY29tcGxldGUgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkgIHN0cnVjdCBpYl9wYXRoICpwYXRoLCBpbnQgcmMsCisJCQkJICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2ICkgeworCXN0cnVjdCBpYl9jb25uZWN0aW9uICpjb25uID0gaWJfcGF0aF9nZXRfb3duZXJkYXRhICggcGF0aCApOworCXN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCA9IGNvbm4tPnFwOworCXVuaW9uIGliX21hZCBtYWQ7CisJc3RydWN0IGliX2NtX2Nvbm5lY3RfcmVxdWVzdCAqY29ubmVjdF9yZXEgPQorCQkmbWFkLmNtLmNtX2RhdGEuY29ubmVjdF9yZXF1ZXN0OworCXNpemVfdCBwcml2YXRlX2RhdGFfbGVuOworCisJLyogUmVwb3J0IGZhaWx1cmVzICovCisJaWYgKCByYyAhPSAwICkgeworCQlEQkdDICggY29ubiwgIkNNICVwIHBhdGggbG9va3VwIGZhaWxlZDogJXNcbiIsCisJCSAgICAgICBjb25uLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJY29ubi0+b3AtPmNoYW5nZWQgKCBpYmRldiwgcXAsIGNvbm4sIHJjLCBOVUxMLCAwICk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFVwZGF0ZSBxdWV1ZSBwYWlyIHBlZXIgcGF0aCAqLworCW1lbWNweSAoICZxcC0+YXYsIGF2LCBzaXplb2YgKCBxcC0+YXYgKSApOworCisJLyogQ29uc3RydWN0IGNvbm5lY3Rpb24gcmVxdWVzdCAqLworCW1lbXNldCAoICZtYWQsIDAsIHNpemVvZiAoIG1hZCApICk7CisJbWFkLmhkci5tZ210X2NsYXNzID0gSUJfTUdNVF9DTEFTU19DTTsKKwltYWQuaGRyLmNsYXNzX3ZlcnNpb24gPSBJQl9DTV9DTEFTU19WRVJTSU9OOworCW1hZC5oZHIubWV0aG9kID0gSUJfTUdNVF9NRVRIT0RfU0VORDsKKwltYWQuaGRyLmF0dHJfaWQgPSBodG9ucyAoIElCX0NNX0FUVFJfQ09OTkVDVF9SRVFVRVNUICk7CisJY29ubmVjdF9yZXEtPmxvY2FsX2lkID0gaHRvbmwgKCBjb25uLT5sb2NhbF9pZCApOworCW1lbWNweSAoICZjb25uZWN0X3JlcS0+c2VydmljZV9pZCwgJmNvbm4tPnNlcnZpY2VfaWQsCisJCSBzaXplb2YgKCBjb25uZWN0X3JlcS0+c2VydmljZV9pZCApICk7CisJaWJfZ2V0X2hjYV9pbmZvICggaWJkZXYsICZjb25uZWN0X3JlcS0+bG9jYWxfY2EgKTsKKwljb25uZWN0X3JlcS0+bG9jYWxfcXBuX19yZXNwb25kZXJfcmVzb3VyY2VzID0KKwkJaHRvbmwgKCAoIHFwLT5xcG4gPDwgOCApIHwgMSApOworCWNvbm5lY3RfcmVxLT5sb2NhbF9lZWNuX19pbml0aWF0b3JfZGVwdGggPSBodG9ubCAoICggMCA8PCA4ICkgfCAxICk7CisJY29ubmVjdF9yZXEtPnJlbW90ZV9lZWNuX19yZW1vdGVfdGltZW91dF9fc2VydmljZV90eXBlX19lZV9mbG93X2N0cmwgPQorCQlodG9ubCAoICggMHgxNCA8PCAzICkgfCAoIElCX0NNX1RSQU5TUE9SVF9SQyA8PCAxICkgfAorCQkJKCAwIDw8IDAgKSApOworCWNvbm5lY3RfcmVxLT5zdGFydGluZ19wc25fX2xvY2FsX3RpbWVvdXRfX3JldHJ5X2NvdW50ID0KKwkJaHRvbmwgKCAoIHFwLT5yZWN2LnBzbiA8PCA4ICkgfCAoIDB4MTQgPDwgMyApIHwKKwkJCSggMHgwNyA8PCAwICkgKTsKKwljb25uZWN0X3JlcS0+cGtleSA9IGh0b25zICggaWJkZXYtPnBrZXkgKTsKKwljb25uZWN0X3JlcS0+cGF5bG9hZF9tdHVfX3JkY19leGlzdHNfX3Jucl9yZXRyeSA9CisJCSggKCBJQl9NVFVfMjA0OCA8PCA0ICkgfCAoIDEgPDwgMyApIHwgKCAweDA3IDw8IDAgKSApOworCWNvbm5lY3RfcmVxLT5tYXhfY21fcmV0cmllc19fc3JxID0KKwkJKCAoIDB4MGYgPDwgNCApIHwgKCAwIDw8IDMgKSApOworCWNvbm5lY3RfcmVxLT5wcmltYXJ5LmxvY2FsX2xpZCA9IGh0b25zICggaWJkZXYtPmxpZCApOworCWNvbm5lY3RfcmVxLT5wcmltYXJ5LnJlbW90ZV9saWQgPSBodG9ucyAoIGNvbm4tPnFwLT5hdi5saWQgKTsKKwltZW1jcHkgKCAmY29ubmVjdF9yZXEtPnByaW1hcnkubG9jYWxfZ2lkLCAmaWJkZXYtPmdpZCwKKwkJIHNpemVvZiAoIGNvbm5lY3RfcmVxLT5wcmltYXJ5LmxvY2FsX2dpZCApICk7CisJbWVtY3B5ICggJmNvbm5lY3RfcmVxLT5wcmltYXJ5LnJlbW90ZV9naWQsICZjb25uLT5xcC0+YXYuZ2lkLAorCQkgc2l6ZW9mICggY29ubmVjdF9yZXEtPnByaW1hcnkucmVtb3RlX2dpZCApICk7CisJY29ubmVjdF9yZXEtPnByaW1hcnkuZmxvd19sYWJlbF9fcmF0ZSA9CisJCWh0b25sICggKCAwIDw8IDEyICkgfCAoIGNvbm4tPnFwLT5hdi5yYXRlIDw8IDAgKSApOworCWNvbm5lY3RfcmVxLT5wcmltYXJ5LmhvcF9saW1pdCA9IDA7CisJY29ubmVjdF9yZXEtPnByaW1hcnkuc2xfX3N1Ym5ldF9sb2NhbCA9CisJCSggKCBjb25uLT5xcC0+YXYuc2wgPDwgNCApIHwgKCAxIDw8IDMgKSApOworCWNvbm5lY3RfcmVxLT5wcmltYXJ5LmxvY2FsX2Fja190aW1lb3V0ID0gKCAweDEzIDw8IDMgKTsKKwlwcml2YXRlX2RhdGFfbGVuID0gY29ubi0+cHJpdmF0ZV9kYXRhX2xlbjsKKwlpZiAoIHByaXZhdGVfZGF0YV9sZW4gPiBzaXplb2YgKCBjb25uZWN0X3JlcS0+cHJpdmF0ZV9kYXRhICkgKQorCQlwcml2YXRlX2RhdGFfbGVuID0gc2l6ZW9mICggY29ubmVjdF9yZXEtPnByaXZhdGVfZGF0YSApOworCW1lbWNweSAoICZjb25uZWN0X3JlcS0+cHJpdmF0ZV9kYXRhLCAmY29ubi0+cHJpdmF0ZV9kYXRhLAorCQkgcHJpdmF0ZV9kYXRhX2xlbiApOworCisJLyogQ3JlYXRlIGNvbm5lY3Rpb24gcmVxdWVzdCAqLworCWF2LT5xcG4gPSBJQl9RUE5fR1NJOworCWF2LT5xa2V5ID0gSUJfUUtFWV9HU0k7CisJY29ubi0+bWFkeCA9IGliX2NyZWF0ZV9tYWR4ICggaWJkZXYsIGliZGV2LT5nc2ksICZtYWQsIGF2LAorCQkJCSAgICAgICZpYl9jbV9yZXFfb3AgKTsKKwlpZiAoICEgY29ubi0+bWFkeCApIHsKKwkJREJHQyAoIGNvbm4sICJDTSAlcCBjb3VsZCBub3QgY3JlYXRlIGNvbm5lY3Rpb24gcmVxdWVzdFxuIiwKKwkJICAgICAgIGNvbm4gKTsKKwkJY29ubi0+b3AtPmNoYW5nZWQgKCBpYmRldiwgcXAsIGNvbm4sIHJjLCBOVUxMLCAwICk7CisJCWdvdG8gb3V0OworCX0KKwlpYl9tYWR4X3NldF9vd25lcmRhdGEgKCBjb25uLT5tYWR4LCBjb25uICk7CisKKyBvdXQ6CisJLyogRGVzdHJveSB0aGUgY29tcGxldGVkIHRyYW5zYWN0aW9uICovCisJaWJfZGVzdHJveV9wYXRoICggaWJkZXYsIHBhdGggKTsKKwljb25uLT5wYXRoID0gTlVMTDsKK30KKworLyoqIENvbm5lY3Rpb24gcGF0aCBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IGliX3BhdGhfb3BlcmF0aW9ucyBpYl9jbV9wYXRoX29wID0geworCS5jb21wbGV0ZSA9IGliX2NtX3BhdGhfY29tcGxldGUsCit9OworCisvKioKKyAqIENyZWF0ZSBjb25uZWN0aW9uIHRvIHJlbW90ZSBRUAorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGRnaWQJCVRhcmdldCBHSUQKKyAqIEB2IHNlcnZpY2VfaWQJVGFyZ2V0IHNlcnZpY2UgSUQKKyAqIEB2IHByaXZhdGVfZGF0YQlDb25uZWN0aW9uIHJlcXVlc3QgcHJpdmF0ZSBkYXRhCisgKiBAdiBwcml2YXRlX2RhdGFfbGVuCUxlbmd0aCBvZiBjb25uZWN0aW9uIHJlcXVlc3QgcHJpdmF0ZSBkYXRhCisgKiBAdiBvcAkJQ29ubmVjdGlvbiBvcGVyYXRpb25zCisgKiBAcmV0IGNvbm4JCUNvbm5lY3Rpb24KKyAqLworc3RydWN0IGliX2Nvbm5lY3Rpb24gKgoraWJfY3JlYXRlX2Nvbm4gKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkgc3RydWN0IGliX2dpZCAqZGdpZCwgc3RydWN0IGliX2dpZF9oYWxmICpzZXJ2aWNlX2lkLAorCQkgdm9pZCAqcHJpdmF0ZV9kYXRhLCBzaXplX3QgcHJpdmF0ZV9kYXRhX2xlbiwKKwkJIHN0cnVjdCBpYl9jb25uZWN0aW9uX29wZXJhdGlvbnMgKm9wICkgeworCXN0cnVjdCBpYl9jb25uZWN0aW9uICpjb25uOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgcmVxdWVzdCAqLworCWNvbm4gPSB6YWxsb2MgKCBzaXplb2YgKCAqY29ubiApICsgcHJpdmF0ZV9kYXRhX2xlbiApOworCWlmICggISBjb25uICkKKwkJZ290byBlcnJfYWxsb2NfY29ubjsKKwljb25uLT5pYmRldiA9IGliZGV2OworCWNvbm4tPnFwID0gcXA7CisJbWVtc2V0ICggJnFwLT5hdiwgMCwgc2l6ZW9mICggcXAtPmF2ICkgKTsKKwlxcC0+YXYuZ2lkX3ByZXNlbnQgPSAxOworCW1lbWNweSAoICZxcC0+YXYuZ2lkLCBkZ2lkLCBzaXplb2YgKCBxcC0+YXYuZ2lkICkgKTsKKwljb25uLT5sb2NhbF9pZCA9IHJhbmRvbSgpOworCW1lbWNweSAoICZjb25uLT5zZXJ2aWNlX2lkLCBzZXJ2aWNlX2lkLCBzaXplb2YgKCBjb25uLT5zZXJ2aWNlX2lkICkgKTsKKwljb25uLT5vcCA9IG9wOworCWNvbm4tPnByaXZhdGVfZGF0YV9sZW4gPSBwcml2YXRlX2RhdGFfbGVuOworCW1lbWNweSAoICZjb25uLT5wcml2YXRlX2RhdGEsIHByaXZhdGVfZGF0YSwgcHJpdmF0ZV9kYXRhX2xlbiApOworCisJLyogQ3JlYXRlIHBhdGggKi8KKwljb25uLT5wYXRoID0gaWJfY3JlYXRlX3BhdGggKCBpYmRldiwgJnFwLT5hdiwgJmliX2NtX3BhdGhfb3AgKTsKKwlpZiAoICEgY29ubi0+cGF0aCApCisJCWdvdG8gZXJyX2NyZWF0ZV9wYXRoOworCWliX3BhdGhfc2V0X293bmVyZGF0YSAoIGNvbm4tPnBhdGgsIGNvbm4gKTsKKworCS8qIEFkZCB0byBsaXN0IG9mIGNvbm5lY3Rpb25zICovCisJbGlzdF9hZGQgKCAmY29ubi0+bGlzdCwgJmliX2NtX2Nvbm5zICk7CisKKwlEQkdDICggY29ubiwgIkNNICVwIGNyZWF0ZWQgZm9yIElCREVWICVwIFFQTiAlbHhcbiIsCisJICAgICAgIGNvbm4sIGliZGV2LCBxcC0+cXBuICk7CisJREJHQyAoIGNvbm4sICJDTSAlcCBjb25uZWN0aW5nIHRvICUwOHg6JTA4eDolMDh4OiUwOHggJTA4eDolMDh4XG4iLAorCSAgICAgICBjb25uLCBudG9obCAoIGRnaWQtPnUuZHdvcmRzWzBdICksIG50b2hsICggZGdpZC0+dS5kd29yZHNbMV0gKSwKKwkgICAgICAgbnRvaGwgKCBkZ2lkLT51LmR3b3Jkc1syXSApLCBudG9obCAoIGRnaWQtPnUuZHdvcmRzWzNdICksCisJICAgICAgIG50b2hsICggc2VydmljZV9pZC0+dS5kd29yZHNbMF0gKSwKKwkgICAgICAgbnRvaGwgKCBzZXJ2aWNlX2lkLT51LmR3b3Jkc1sxXSApICk7CisKKwlyZXR1cm4gY29ubjsKKworCWliX2Rlc3Ryb3lfcGF0aCAoIGliZGV2LCBjb25uLT5wYXRoICk7CisgZXJyX2NyZWF0ZV9wYXRoOgorCWZyZWUgKCBjb25uICk7CisgZXJyX2FsbG9jX2Nvbm46CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRGVzdHJveSBjb25uZWN0aW9uIHRvIHJlbW90ZSBRUAorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGNvbm4JCUNvbm5lY3Rpb24KKyAqLwordm9pZCBpYl9kZXN0cm95X2Nvbm4gKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJICAgICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCBfX3VudXNlZCwKKwkJICAgICAgIHN0cnVjdCBpYl9jb25uZWN0aW9uICpjb25uICkgeworCisJbGlzdF9kZWwgKCAmY29ubi0+bGlzdCApOworCWlmICggY29ubi0+bWFkeCApCisJCWliX2Rlc3Ryb3lfbWFkeCAoIGliZGV2LCBpYmRldi0+Z3NpLCBjb25uLT5tYWR4ICk7CisJaWYgKCBjb25uLT5wYXRoICkKKwkJaWJfZGVzdHJveV9wYXRoICggaWJkZXYsIGNvbm4tPnBhdGggKTsKKwlmcmVlICggY29ubiApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfY21yYy5jIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfY21yYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNjQ4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvaW5maW5pYmFuZC9pYl9jbXJjLmMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRmVuIFN5c3RlbXMgTHRkIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBCU0QyICk7CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2luZmluaWJhbmQuaD4KKyNpbmNsdWRlIDxncHhlL2liX2NtLmg+CisjaW5jbHVkZSA8Z3B4ZS9pYl9jbXJjLmg+CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBJbmZpbmliYW5kIENvbW11bmljYXRpb24tbWFuYWdlZCBSZWxpYWJsZSBDb25uZWN0aW9ucworICoKKyAqLworCisvKiogQ01SQyBudW1iZXIgb2Ygc2VuZCBXUUVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbi4KKyAqLworI2RlZmluZSBJQl9DTVJDX05VTV9TRU5EX1dRRVMgNAorCisvKiogQ01SQyBudW1iZXIgb2YgcmVjZWl2ZSBXUUVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbi4KKyAqLworI2RlZmluZSBJQl9DTVJDX05VTV9SRUNWX1dRRVMgMgorCisvKiogQ01SQyBudW1iZXIgb2YgY29tcGxldGlvbiBxdWV1ZSBlbnRyaWVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbgorICovCisjZGVmaW5lIElCX0NNUkNfTlVNX0NRRVMgOAorCisvKiogQW4gSW5maW5pYmFuZCBDb21tdW5pY2F0aW9uLU1hbmFnZWQgUmVsaWFibGUgQ29ubmVjdGlvbiAqLworc3RydWN0IGliX2NtcmNfY29ubmVjdGlvbiB7CisJLyoqIFJlZmVyZW5jZSBjb3VudCAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCS8qKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZSAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSB4ZmVyOworCS8qKiBJbmZpbmliYW5kIGRldmljZSAqLworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OworCS8qKiBDb21wbGV0aW9uIHF1ZXVlICovCisJc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWUgKmNxOworCS8qKiBRdWV1ZSBwYWlyICovCisJc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwOworCS8qKiBDb25uZWN0aW9uICovCisJc3RydWN0IGliX2Nvbm5lY3Rpb24gKmNvbm47CisJLyoqIERlc3RpbmF0aW9uIEdJRCAqLworCXN0cnVjdCBpYl9naWQgZGdpZDsKKwkvKiogU2VydmljZSBJRCAqLworCXN0cnVjdCBpYl9naWRfaGFsZiBzZXJ2aWNlX2lkOworCS8qKiBRUCBpcyBjb25uZWN0ZWQgKi8KKwlpbnQgY29ubmVjdGVkOworCS8qKiBTaHV0ZG93biBwcm9jZXNzICovCisJc3RydWN0IHByb2Nlc3Mgc2h1dGRvd247Cit9OworCisvKioKKyAqIFNodXQgZG93biBDTVJDIGNvbm5lY3Rpb24gZ3JhY2VmdWxseQorICoKKyAqIEB2IHByb2Nlc3MJCVByb2Nlc3MKKyAqCisgKiBUaGUgSW5maW5pYmFuZCBkYXRhIHN0cnVjdHVyZXMgYXJlIG5vdCByZWZlcmVuY2UtY291bnRlZCBvcgorICogZ3VhcmRlZC4gIEl0IGlzIHRoZXJlZm9yZSB1bnNhZmUgdG8gc2h1dCB0aGVtIGRvd24gd2hpbGUgd2UgbWF5IGJlCisgKiBpbiB0aGUgbWlkZGxlIG9mIGEgY2FsbGJhY2sgZnJvbSB0aGUgSW5maW5pYmFuZCBzdGFjayAoZS5nLiBpbiBhCisgKiByZWNlaXZlIGNvbXBsZXRpb24gaGFuZGxlcikuCisgKgorICogVGhpcyBzaHV0ZG93biBwcm9jZXNzIHdpbGwgcnVuIHNvbWUgdGltZSBhZnRlciB0aGUgY2FsbCB0bworICogaWJfY21yY19jbG9zZSgpLCBhZnRlciBjb250cm9sIGhhcyByZXR1cm5lZCBvdXQgb2YgdGhlIEluZmluaWJhbmQKKyAqIGNvcmUsIGFuZCB3aWxsIHNodXQgZG93biB0aGUgSW5maW5pYmFuZCBpbnRlcmZhY2VzIGNsZWFubHkuCisgKgorICogVGhlIHNodXRkb3duIHByb2Nlc3MgaG9sZHMgYW4gaW1wbGljaXQgcmVmZXJlbmNlIG9uIHRoZSBDTVJDCisgKiBjb25uZWN0aW9uLCBlbnN1cmluZyB0aGF0IHRoZSBzdHJ1Y3R1cmUgaXMgbm90IGZyZWVkIGJlZm9yZSB0aGUKKyAqIHNodXRkb3duIHByb2Nlc3MgaGFzIHJ1bi4KKyAqLworc3RhdGljIHZvaWQgaWJfY21yY19zaHV0ZG93biAoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzICkgeworCXN0cnVjdCBpYl9jbXJjX2Nvbm5lY3Rpb24gKmNtcmMgPQorCQljb250YWluZXJfb2YgKCBwcm9jZXNzLCBzdHJ1Y3QgaWJfY21yY19jb25uZWN0aW9uLCBzaHV0ZG93biApOworCisJREJHQyAoIGNtcmMsICJDTVJDICVwIHNodXR0aW5nIGRvd25cbiIsIGNtcmMgKTsKKworCS8qIFNodXQgZG93biBJbmZpbmliYW5kIGludGVyZmFjZSAqLworCWliX2Rlc3Ryb3lfY29ubiAoIGNtcmMtPmliZGV2LCBjbXJjLT5xcCwgY21yYy0+Y29ubiApOworCWliX2Rlc3Ryb3lfcXAgKCBjbXJjLT5pYmRldiwgY21yYy0+cXAgKTsKKwlpYl9kZXN0cm95X2NxICggY21yYy0+aWJkZXYsIGNtcmMtPmNxICk7CisJaWJfY2xvc2UgKCBjbXJjLT5pYmRldiApOworCisJLyogUmVtb3ZlIHByb2Nlc3MgZnJvbSBydW4gcXVldWUgKi8KKwlwcm9jZXNzX2RlbCAoICZjbXJjLT5zaHV0ZG93biApOworCisJLyogRHJvcCB0aGUgcmVtYWluaW5nIHJlZmVyZW5jZSAqLworCXJlZl9wdXQgKCAmY21yYy0+cmVmY250ICk7Cit9CisKKy8qKgorICogQ2xvc2UgQ01SQyBjb25uZWN0aW9uCisgKgorICogQHYgY21yYwkJQ29tbXVuaWNhdGlvbi1NYW5hZ2VkIFJlbGlhYmxlIENvbm5lY3Rpb24KKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIGliX2NtcmNfY2xvc2UgKCBzdHJ1Y3QgaWJfY21yY19jb25uZWN0aW9uICpjbXJjLCBpbnQgcmMgKSB7CisKKwkvKiBDbG9zZSBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSAqLworCXhmZXJfbnVsbGlmeSAoICZjbXJjLT54ZmVyICk7CisJeGZlcl9jbG9zZSAoICZjbXJjLT54ZmVyLCByYyApOworCisJLyogU2NoZWR1bGUgc2h1dGRvd24gcHJvY2VzcyAqLworCXByb2Nlc3NfYWRkICggJmNtcmMtPnNodXRkb3duICk7Cit9CisKKy8qKgorICogSGFuZGxlIGNoYW5nZSBvZiBDTVJDIGNvbm5lY3Rpb24gc3RhdHVzCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgY29ubgkJQ29ubmVjdGlvbgorICogQHYgcmNfY20JCUNvbm5lY3Rpb24gc3RhdHVzIGNvZGUKKyAqIEB2IHByaXZhdGVfZGF0YQlQcml2YXRlIGRhdGEsIGlmIGF2YWlsYWJsZQorICogQHYgcHJpdmF0ZV9kYXRhX2xlbglMZW5ndGggb2YgcHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIGliX2NtcmNfY2hhbmdlZCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2IF9fdW51c2VkLAorCQkJICAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJICAgICAgc3RydWN0IGliX2Nvbm5lY3Rpb24gKmNvbm4gX191bnVzZWQsIGludCByY19jbSwKKwkJCSAgICAgIHZvaWQgKnByaXZhdGVfZGF0YSwgc2l6ZV90IHByaXZhdGVfZGF0YV9sZW4gKSB7CisJc3RydWN0IGliX2NtcmNfY29ubmVjdGlvbiAqY21yYyA9IGliX3FwX2dldF9vd25lcmRhdGEgKCBxcCApOworCWludCByY194ZmVyOworCisJLyogUmVjb3JkIGNvbm5lY3Rpb24gc3RhdHVzICovCisJaWYgKCByY19jbSA9PSAwICkgeworCQlEQkdDICggY21yYywgIkNNUkMgJXAgY29ubmVjdGVkXG4iLCBjbXJjICk7CisJCWNtcmMtPmNvbm5lY3RlZCA9IDE7CisJfSBlbHNlIHsKKwkJREJHQyAoIGNtcmMsICJDTVJDICVwIGRpc2Nvbm5lY3RlZDogJXNcbiIsCisJCSAgICAgICBjbXJjLCBzdHJlcnJvciAoIHJjX2NtICkgKTsKKwkJY21yYy0+Y29ubmVjdGVkID0gMDsKKwl9CisKKwkvKiBQYXNzIHVwIGFueSBwcml2YXRlIGRhdGEgKi8KKwlEQkdDMiAoIGNtcmMsICJDTVJDICVwIHJlY2VpdmVkIHByaXZhdGUgZGF0YTpcbiIsIGNtcmMgKTsKKwlEQkdDMl9IREEgKCBjbXJjLCAwLCBwcml2YXRlX2RhdGEsIHByaXZhdGVfZGF0YV9sZW4gKTsKKwlpZiAoIHByaXZhdGVfZGF0YSAmJgorCSAgICAgKCByY194ZmVyID0geGZlcl9kZWxpdmVyX3JhdyAoICZjbXJjLT54ZmVyLCBwcml2YXRlX2RhdGEsCisJCQkJCSAgICBwcml2YXRlX2RhdGFfbGVuICkgKSAhPSAwICkgeworCQlEQkdDICggY21yYywgIkNNUkMgJXAgY291bGQgbm90IGRlbGl2ZXIgcHJpdmF0ZSBkYXRhOiAlc1xuIiwKKwkJICAgICAgIGNtcmMsIHN0cmVycm9yICggcmNfeGZlciApICk7CisJCWliX2NtcmNfY2xvc2UgKCBjbXJjLCByY194ZmVyICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgZGlzY29ubmVjdGVkLCBjbG9zZSB0aGUgdXBwZXIgY29ubmVjdGlvbiAqLworCWlmICggcmNfY20gIT0gMCApIHsKKwkJaWJfY21yY19jbG9zZSAoIGNtcmMsIHJjX2NtICk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKiBDTVJDIGNvbm5lY3Rpb24gb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBpYl9jb25uZWN0aW9uX29wZXJhdGlvbnMgaWJfY21yY19jb25uX29wID0geworCS5jaGFuZ2VkID0gaWJfY21yY19jaGFuZ2VkLAorfTsKKworLyoqCisgKiBIYW5kbGUgQ01SQyBzZW5kIGNvbXBsZXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHFwCQlRdWV1ZSBwYWlyCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgcmMJCUNvbXBsZXRpb24gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIHZvaWQgaWJfY21yY19jb21wbGV0ZV9zZW5kICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgX191bnVzZWQsCisJCQkJICAgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCQkgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIGludCByYyApIHsKKwlzdHJ1Y3QgaWJfY21yY19jb25uZWN0aW9uICpjbXJjID0gaWJfcXBfZ2V0X293bmVyZGF0YSAoIHFwICk7CisKKwkvKiBGcmVlIHRoZSBjb21wbGV0ZWQgSS9PIGJ1ZmZlciAqLworCWZyZWVfaW9iICggaW9idWYgKTsKKworCS8qIENsb3NlIHRoZSBjb25uZWN0aW9uIG9uIGFueSBzZW5kIGVycm9ycyAqLworCWlmICggcmMgIT0gMCApIHsKKwkJREJHQyAoIGNtcmMsICJDTVJDICVwIHNlbmQgZXJyb3I6ICVzXG4iLAorCQkgICAgICAgY21yYywgc3RyZXJyb3IgKCByYyApICk7CisJCWliX2NtcmNfY2xvc2UgKCBjbXJjLCByYyApOworCQlyZXR1cm47CisJfQorfQorCisvKioKKyAqIEhhbmRsZSBDTVJDIHJlY2VpdmUgY29tcGxldGlvbgorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IGF2CQlBZGRyZXNzIHZlY3Rvciwgb3IgTlVMTAorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEB2IHJjCQlDb21wbGV0aW9uIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIGliX2NtcmNfY29tcGxldGVfcmVjdiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2IF9fdW51c2VkLAorCQkJCSAgICBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCQkJICAgIHN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciAqYXYgX191bnVzZWQsCisJCQkJICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBpbnQgcmMgKSB7CisJc3RydWN0IGliX2NtcmNfY29ubmVjdGlvbiAqY21yYyA9IGliX3FwX2dldF9vd25lcmRhdGEgKCBxcCApOworCisJLyogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gb24gYW55IHJlY2VpdmUgZXJyb3JzICovCisJaWYgKCByYyAhPSAwICkgeworCQlEQkdDICggY21yYywgIkNNUkMgJXAgcmVjZWl2ZSBlcnJvcjogJXNcbiIsCisJCSAgICAgICBjbXJjLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZnJlZV9pb2IgKCBpb2J1ZiApOworCQlpYl9jbXJjX2Nsb3NlICggY21yYywgcmMgKTsKKwkJcmV0dXJuOworCX0KKworCURCR0MyICggY21yYywgIkNNUkMgJXAgcmVjZWl2ZWQ6XG4iLCBjbXJjICk7CisJREJHQzJfSERBICggY21yYywgMCwgaW9idWYtPmRhdGEsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisKKwkvKiBQYXNzIHVwIGRhdGEgKi8KKwlpZiAoICggcmMgPSB4ZmVyX2RlbGl2ZXJfaW9iICggJmNtcmMtPnhmZXIsIGlvYnVmICkgKSAhPSAwICkgeworCQlEQkdDICggY21yYywgIkNNUkMgJXAgY291bGQgbm90IGRlbGl2ZXIgZGF0YTogJXNcbiIsCisJCSAgICAgICBjbXJjLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJaWJfY21yY19jbG9zZSAoIGNtcmMsIHJjICk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKiBJbmZpbmliYW5kIENNUkMgY29tcGxldGlvbiBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IGliX2NvbXBsZXRpb25fcXVldWVfb3BlcmF0aW9ucyBpYl9jbXJjX2NvbXBsZXRpb25fb3BzID0geworCS5jb21wbGV0ZV9zZW5kID0gaWJfY21yY19jb21wbGV0ZV9zZW5kLAorCS5jb21wbGV0ZV9yZWN2ID0gaWJfY21yY19jb21wbGV0ZV9yZWN2LAorfTsKKworLyoqCisgKiBTZW5kIGRhdGEgdmlhIENNUkMKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgaW9idWYJCURhdGFncmFtIEkvTyBidWZmZXIKKyAqIEB2IG1ldGEJCURhdGEgdHJhbnNmZXIgbWV0YWRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX2NtcmNfeGZlcl9kZWxpdmVyX2lvYiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCQkgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCQkgICAgICBzdHJ1Y3QgeGZlcl9tZXRhZGF0YSAqbWV0YSBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgaWJfY21yY19jb25uZWN0aW9uICpjbXJjID0KKwkJY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IGliX2NtcmNfY29ubmVjdGlvbiwgeGZlciApOworCWludCByYzsKKworCS8qIElmIG5vIGNvbm5lY3Rpb24gaGFzIHlldCBiZWVuIGF0dGVtcHRlZCwgc2VuZCB0aGlzIGRhdGFncmFtCisJICogYXMgdGhlIENNIFJFUSBwcml2YXRlIGRhdGEuICBPdGhlcndpc2UsIHNlbmQgaXQgdmlhIHRoZSBRUC4KKwkgKi8KKwlpZiAoICEgY21yYy0+Y29ubmVjdGVkICkgeworCisJCS8qIEFib3J0IGlmIHdlIGhhdmUgYWxyZWFkeSBzZW50IGEgQ00gY29ubmVjdGlvbiByZXF1ZXN0ICovCisJCWlmICggY21yYy0+Y29ubiApIHsKKwkJCURCR0MgKCBjbXJjLCAiQ01SQyAlcCBhdHRlbXB0IHRvIHNlbmQgYmVmb3JlICIKKwkJCSAgICAgICAiY29ubmVjdGlvbiBpcyBjb21wbGV0ZVxuIiwgY21yYyApOworCQkJcmMgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBTZW5kIHZpYSBDTSBjb25uZWN0aW9uIHJlcXVlc3QgKi8KKwkJY21yYy0+Y29ubiA9IGliX2NyZWF0ZV9jb25uICggY21yYy0+aWJkZXYsIGNtcmMtPnFwLAorCQkJCQkgICAgICAmY21yYy0+ZGdpZCwgJmNtcmMtPnNlcnZpY2VfaWQsCisJCQkJCSAgICAgIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSwKKwkJCQkJICAgICAgJmliX2NtcmNfY29ubl9vcCApOworCQlpZiAoICEgY21yYy0+Y29ubiApIHsKKwkJCURCR0MgKCBjbXJjLCAiQ01SQyAlcCBjb3VsZCBub3QgY29ubmVjdFxuIiwgY21yYyApOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCX0gZWxzZSB7CisKKwkJLyogU2VuZCB2aWEgUVAgKi8KKwkJaWYgKCAoIHJjID0gaWJfcG9zdF9zZW5kICggY21yYy0+aWJkZXYsIGNtcmMtPnFwLCBOVUxMLAorCQkJCQkgICBpb2JfZGlzb3duICggaW9idWYgKSApICkgIT0gMCApIHsKKwkJCURCR0MgKCBjbXJjLCAiQ01SQyAlcCBjb3VsZCBub3Qgc2VuZDogJXNcbiIsCisJCQkgICAgICAgY21yYywgc3RyZXJyb3IgKCByYyApICk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJfQorCXJldHVybiAwOworCisgb3V0OgorCS8qIEZyZWUgdGhlIEkvTyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisJZnJlZV9pb2IgKCBpb2J1ZiApOworCisJLyogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gb24gYW55IGVycm9ycyAqLworCWlmICggcmMgIT0gMCApCisJCWliX2NtcmNfY2xvc2UgKCBjbXJjLCByYyApOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIENoZWNrIENNUkMgZmxvdyBjb250cm9sIHdpbmRvdworICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHdpbmRvdworICovCitzdGF0aWMgc2l6ZV90IGliX2NtcmNfeGZlcl93aW5kb3cgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIgKSB7CisJc3RydWN0IGliX2NtcmNfY29ubmVjdGlvbiAqY21yYyA9CisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCBpYl9jbXJjX2Nvbm5lY3Rpb24sIHhmZXIgKTsKKworCS8qIFdlIGluZGljYXRlIGEgd2luZG93IG9ubHkgd2hlbiB3ZSBhcmUgc3VjY2Vzc2Z1bGx5CisJICogY29ubmVjdGVkLgorCSAqLworCXJldHVybiAoIGNtcmMtPmNvbm5lY3RlZCA/IElCX01BWF9QQVlMT0FEX1NJWkUgOiAwICk7Cit9CisKKy8qKgorICogQ2xvc2UgQ01SQyBkYXRhLXRyYW5zZmVyIGludGVyZmFjZQorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiByYwkJUmVhc29uIGZvciBjbG9zZQorICovCitzdGF0aWMgdm9pZCBpYl9jbXJjX3hmZXJfY2xvc2UgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGludCByYyApIHsKKwlzdHJ1Y3QgaWJfY21yY19jb25uZWN0aW9uICpjbXJjID0KKwkJY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IGliX2NtcmNfY29ubmVjdGlvbiwgeGZlciApOworCisJREJHQyAoIGNtcmMsICJDTVJDICVwIGNsb3NlZDogJXNcbiIsIGNtcmMsIHN0cmVycm9yICggcmMgKSApOworCWliX2NtcmNfY2xvc2UgKCBjbXJjLCByYyApOworfQorCisvKiogQ01SQyBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgaWJfY21yY194ZmVyX29wZXJhdGlvbnMgPSB7CisJLmNsb3NlCQk9IGliX2NtcmNfeGZlcl9jbG9zZSwKKwkudnJlZGlyZWN0CT0gaWdub3JlX3hmZXJfdnJlZGlyZWN0LAorCS53aW5kb3cJCT0gaWJfY21yY194ZmVyX3dpbmRvdywKKwkuYWxsb2NfaW9iCT0gZGVmYXVsdF94ZmVyX2FsbG9jX2lvYiwKKwkuZGVsaXZlcl9pb2IJPSBpYl9jbXJjX3hmZXJfZGVsaXZlcl9pb2IsCisJLmRlbGl2ZXJfcmF3CT0geGZlcl9kZWxpdmVyX2FzX2lvYiwKK307CisKKy8qKgorICogT3BlbiBDTVJDIGNvbm5lY3Rpb24KKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBkZ2lkCQlEZXN0aW5hdGlvbiBHSUQKKyAqIEB2IHNlcnZpY2VfaWQJU2VydmljZSBJRAorICogQHJldCByYwkJUmV0dXJucyBzdGF0dXMgY29kZQorICovCitpbnQgaWJfY21yY19vcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJICAgc3RydWN0IGliX2dpZCAqZGdpZCwgc3RydWN0IGliX2dpZF9oYWxmICpzZXJ2aWNlX2lkICkgeworCXN0cnVjdCBpYl9jbXJjX2Nvbm5lY3Rpb24gKmNtcmM7CisJaW50IHJjOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2Ugc3RydWN0dXJlICovCisJY21yYyA9IHphbGxvYyAoIHNpemVvZiAoICpjbXJjICkgKTsKKwlpZiAoICEgY21yYyApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisJeGZlcl9pbml0ICggJmNtcmMtPnhmZXIsICZpYl9jbXJjX3hmZXJfb3BlcmF0aW9ucywgJmNtcmMtPnJlZmNudCApOworCWNtcmMtPmliZGV2ID0gaWJkZXY7CisJbWVtY3B5ICggJmNtcmMtPmRnaWQsIGRnaWQsIHNpemVvZiAoIGNtcmMtPmRnaWQgKSApOworCW1lbWNweSAoICZjbXJjLT5zZXJ2aWNlX2lkLCBzZXJ2aWNlX2lkLCBzaXplb2YgKCBjbXJjLT5zZXJ2aWNlX2lkICkgKTsKKwlwcm9jZXNzX2luaXRfc3RvcHBlZCAoICZjbXJjLT5zaHV0ZG93biwgaWJfY21yY19zaHV0ZG93biwKKwkJCSAgICAgICAmY21yYy0+cmVmY250ICk7CisKKwkvKiBPcGVuIEluZmluaWJhbmQgZGV2aWNlICovCisJaWYgKCAoIHJjID0gaWJfb3BlbiAoIGliZGV2ICkgKSAhPSAwICkgeworCQlEQkdDICggY21yYywgIkNNUkMgJXAgY291bGQgbm90IG9wZW4gZGV2aWNlOiAlc1xuIiwKKwkJICAgICAgIGNtcmMsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9vcGVuOworCX0KKworCS8qIENyZWF0ZSBjb21wbGV0aW9uIHF1ZXVlICovCisJY21yYy0+Y3EgPSBpYl9jcmVhdGVfY3EgKCBpYmRldiwgSUJfQ01SQ19OVU1fQ1FFUywKKwkJCQkgICZpYl9jbXJjX2NvbXBsZXRpb25fb3BzICk7CisJaWYgKCAhIGNtcmMtPmNxICkgeworCQlEQkdDICggY21yYywgIkNNUkMgJXAgY291bGQgbm90IGNyZWF0ZSBjb21wbGV0aW9uIHF1ZXVlXG4iLAorCQkgICAgICAgY21yYyApOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2NyZWF0ZV9jcTsKKwl9CisKKwkvKiBDcmVhdGUgcXVldWUgcGFpciAqLworCWNtcmMtPnFwID0gaWJfY3JlYXRlX3FwICggaWJkZXYsIElCX1FQVF9SQywgSUJfQ01SQ19OVU1fU0VORF9XUUVTLAorCQkJCSAgY21yYy0+Y3EsIElCX0NNUkNfTlVNX1JFQ1ZfV1FFUywgY21yYy0+Y3EgKTsKKwlpZiAoICEgY21yYy0+cXAgKSB7CisJCURCR0MgKCBjbXJjLCAiQ01SQyAlcCBjb3VsZCBub3QgY3JlYXRlIHF1ZXVlIHBhaXJcbiIsIGNtcmMgKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9jcmVhdGVfcXA7CisJfQorCWliX3FwX3NldF9vd25lcmRhdGEgKCBjbXJjLT5xcCwgY21yYyApOworCURCR0MgKCBjbXJjLCAiQ01SQyAlcCB1c2luZyBRUE4gJWx4XG4iLCBjbXJjLCBjbXJjLT5xcC0+cXBuICk7CisKKwkvKiBBdHRhY2ggdG8gcGFyZW50IGludGVyZmFjZSwgdHJhbnNmZXIgcmVmZXJlbmNlIChpbXBsaWNpdGx5KQorCSAqIHRvIG91ciBzaHV0ZG93biBwcm9jZXNzLCBhbmQgcmV0dXJuLgorCSAqLworCXhmZXJfcGx1Z19wbHVnICggJmNtcmMtPnhmZXIsIHhmZXIgKTsKKwlyZXR1cm4gMDsKKworCWliX2Rlc3Ryb3lfcXAgKCBpYmRldiwgY21yYy0+cXAgKTsKKyBlcnJfY3JlYXRlX3FwOgorCWliX2Rlc3Ryb3lfY3EgKCBpYmRldiwgY21yYy0+Y3EgKTsKKyBlcnJfY3JlYXRlX2NxOgorCWliX2Nsb3NlICggaWJkZXYgKTsKKyBlcnJfb3BlbjoKKwlyZWZfcHV0ICggJmNtcmMtPnJlZmNudCApOworIGVycl9hbGxvYzoKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvaW5maW5pYmFuZC9pYl9tY2FzdC5jIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfbWNhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2IzOTVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfbWNhc3QuYwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL2luZmluaWJhbmQuaD4KKyNpbmNsdWRlIDxncHhlL2liX21pLmg+CisjaW5jbHVkZSA8Z3B4ZS9pYl9tY2FzdC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBJbmZpbmliYW5kIG11bHRpY2FzdCBncm91cHMKKyAqCisgKi8KKworLyoqCisgKiBHZW5lcmF0ZSBtdWx0aWNhc3QgbWVtYmVyc2hpcCBNQUQKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IGdpZAkJTXVsdGljYXN0IEdJRAorICogQHYgam9pbgkJSm9pbiAocmF0aGVyIHRoYW4gbGVhdmUpIGdyb3VwCisgKiBAdiBtYWQJCU1BRCB0byBmaWxsIGluCisgKi8KK3N0YXRpYyB2b2lkIGliX21jYXN0X21hZCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfZ2lkICpnaWQsCisJCQkgICBpbnQgam9pbiwgdW5pb24gaWJfbWFkICptYWQgKSB7CisJc3RydWN0IGliX21hZF9zYSAqc2EgPSAmbWFkLT5zYTsKKworCS8qIENvbnN0cnVjdCBtdWx0aWNhc3QgbWVtYmVyc2hpcCByZWNvcmQgcmVxdWVzdCAqLworCW1lbXNldCAoIHNhLCAwLCBzaXplb2YgKCAqc2EgKSApOworCXNhLT5tYWRfaGRyLm1nbXRfY2xhc3MgPSBJQl9NR01UX0NMQVNTX1NVQk5fQURNOworCXNhLT5tYWRfaGRyLmNsYXNzX3ZlcnNpb24gPSBJQl9TQV9DTEFTU19WRVJTSU9OOworCXNhLT5tYWRfaGRyLm1ldGhvZCA9CisJCSggam9pbiA/IElCX01HTVRfTUVUSE9EX1NFVCA6IElCX01HTVRfTUVUSE9EX0RFTEVURSApOworCXNhLT5tYWRfaGRyLmF0dHJfaWQgPSBodG9ucyAoIElCX1NBX0FUVFJfTUNfTUVNQkVSX1JFQyApOworCXNhLT5zYV9oZHIuY29tcF9tYXNrWzFdID0KKwkJaHRvbmwgKCBJQl9TQV9NQ01FTUJFUl9SRUNfTUdJRCB8IElCX1NBX01DTUVNQkVSX1JFQ19QT1JUX0dJRCB8CisJCQlJQl9TQV9NQ01FTUJFUl9SRUNfSk9JTl9TVEFURSApOworCXNhLT5zYV9kYXRhLm1jX21lbWJlcl9yZWNvcmQuc2NvcGVfX2pvaW5fc3RhdGUgPSAxOworCW1lbWNweSAoICZzYS0+c2FfZGF0YS5tY19tZW1iZXJfcmVjb3JkLm1naWQsIGdpZCwKKwkJIHNpemVvZiAoIHNhLT5zYV9kYXRhLm1jX21lbWJlcl9yZWNvcmQubWdpZCApICk7CisJbWVtY3B5ICggJnNhLT5zYV9kYXRhLm1jX21lbWJlcl9yZWNvcmQucG9ydF9naWQsICZpYmRldi0+Z2lkLAorCQkgc2l6ZW9mICggc2EtPnNhX2RhdGEubWNfbWVtYmVyX3JlY29yZC5wb3J0X2dpZCApICk7Cit9CisKKy8qKgorICogSGFuZGxlIG11bHRpY2FzdCBtZW1iZXJzaGlwIHJlY29yZCBqb2luIHJlc3BvbnNlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtaQkJTWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqIEB2IG1hZHgJCU1hbmFnZW1lbnQgdHJhbnNhY3Rpb24KKyAqIEB2IHJjCQlTdGF0dXMgY29kZQorICogQHYgbWFkCQlSZWNlaXZlZCBNQUQgKG9yIE5VTEwgb24gZXJyb3IpCisgKiBAdiBhdgkJU291cmNlIGFkZHJlc3MgdmVjdG9yIChvciBOVUxMIG9uIGVycm9yKQorICovCitzdGF0aWMgdm9pZCBpYl9tY2FzdF9jb21wbGV0ZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCXN0cnVjdCBpYl9tYWRfaW50ZXJmYWNlICptaSBfX3VudXNlZCwKKwkJCQlzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uICptYWR4LAorCQkJCWludCByYywgdW5pb24gaWJfbWFkICptYWQsCisJCQkJc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgaWJfbWNfbWVtYmVyc2hpcCAqbWVtYmVyc2hpcCA9IGliX21hZHhfZ2V0X293bmVyZGF0YSAoIG1hZHggKTsKKwlzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAgPSBtZW1iZXJzaGlwLT5xcDsKKwlzdHJ1Y3QgaWJfZ2lkICpnaWQgPSAmbWVtYmVyc2hpcC0+Z2lkOworCXN0cnVjdCBpYl9tY19tZW1iZXJfcmVjb3JkICptY19tZW1iZXJfcmVjb3JkID0KKwkJJm1hZC0+c2Euc2FfZGF0YS5tY19tZW1iZXJfcmVjb3JkOworCWludCBqb2luZWQ7CisJdW5zaWduZWQgbG9uZyBxa2V5OworCisJLyogUmVwb3J0IGZhaWx1cmVzICovCisJaWYgKCAoIHJjID09IDAgKSAmJiAoIG1hZC0+aGRyLnN0YXR1cyAhPSBodG9ucyAoIElCX01HTVRfU1RBVFVTX09LICkgKSkKKwkJcmMgPSAtRU5PVENPTk47CisJaWYgKCByYyAhPSAwICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBRUE4gJWx4IGpvaW4gZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIGliZGV2LCBxcC0+cXBuLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRXh0cmFjdCB2YWx1ZXMgZnJvbSBNQUQgKi8KKwlqb2luZWQgPSAoIG1hZC0+aGRyLm1ldGhvZCA9PSBJQl9NR01UX01FVEhPRF9HRVRfUkVTUCApOworCXFrZXkgPSBudG9obCAoIG1jX21lbWJlcl9yZWNvcmQtPnFrZXkgKTsKKwlEQkdDICggaWJkZXYsICJJQkRFViAlcCBRUE4gJWx4ICVzICUwOHg6JTA4eDolMDh4OiUwOHggcWtleSAlbHhcbiIsCisJICAgICAgIGliZGV2LCBxcC0+cXBuLCAoIGpvaW5lZCA/ICJqb2luZWQiIDogImxlZnQiICksCisJICAgICAgIG50b2hsICggZ2lkLT51LmR3b3Jkc1swXSApLCBudG9obCAoIGdpZC0+dS5kd29yZHNbMV0gKSwKKwkgICAgICAgbnRvaGwgKCBnaWQtPnUuZHdvcmRzWzJdICksIG50b2hsICggZ2lkLT51LmR3b3Jkc1szXSApLAorCSAgICAgICBxa2V5ICk7CisKKwkvKiBTZXQgcXVldWUga2V5ICovCisJcXAtPnFrZXkgPSBxa2V5OworCWlmICggKCByYyA9IGliX21vZGlmeV9xcCAoIGliZGV2LCBxcCApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgUVBOICVseCBjb3VsZCBub3QgbW9kaWZ5IHFrZXk6ICVzXG4iLAorCQkgICAgICAgaWJkZXYsIHFwLT5xcG4sIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIG91dDsKKwl9CisKKyBvdXQ6CisJLyogRGVzdHJveSB0aGUgY29tcGxldGVkIHRyYW5zYWN0aW9uICovCisJaWJfZGVzdHJveV9tYWR4ICggaWJkZXYsIG1pLCBtYWR4ICk7CisJbWVtYmVyc2hpcC0+bWFkeCA9IE5VTEw7CisKKwkvKiBIYW5kIG9mZiB0byB1cHBlciBjb21wbGV0aW9uIGhhbmRsZXIgKi8KKwltZW1iZXJzaGlwLT5jb21wbGV0ZSAoIGliZGV2LCBxcCwgbWVtYmVyc2hpcCwgcmMsIG1hZCApOworfQorCisvKiogTXVsdGljYXN0IG1lbWJlcnNoaXAgbWFuYWdlbWVudCB0cmFuc2FjdGlvbiBjb21wbGV0aW9uIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uX29wZXJhdGlvbnMgaWJfbWNhc3Rfb3AgPSB7CisJLmNvbXBsZXRlID0gaWJfbWNhc3RfY29tcGxldGUsCit9OworCisvKioKKyAqIEpvaW4gbXVsdGljYXN0IGdyb3VwCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgbWVtYmVyc2hpcAlNdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcAorICogQHYgZ2lkCQlNdWx0aWNhc3QgR0lEIHRvIGpvaW4KKyAqIEB2IGpvaW5lZAkJSm9pbiBjb21wbGV0aW9uIGhhbmRsZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgaWJfbWNhc3Rfam9pbiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCSAgICBzdHJ1Y3QgaWJfbWNfbWVtYmVyc2hpcCAqbWVtYmVyc2hpcCwgc3RydWN0IGliX2dpZCAqZ2lkLAorCQkgICAgdm9pZCAoICogY29tcGxldGUgKSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCQkgIHN0cnVjdCBpYl9xdWV1ZV9wYWlyICpxcCwKKwkJCQkJICBzdHJ1Y3QgaWJfbWNfbWVtYmVyc2hpcCAqbWVtYmVyc2hpcCwKKwkJCQkJICBpbnQgcmMsIHVuaW9uIGliX21hZCAqbWFkICkgKSB7CisJdW5pb24gaWJfbWFkIG1hZDsKKwlpbnQgcmM7CisKKwlEQkdDICggaWJkZXYsICJJQkRFViAlcCBRUE4gJWx4IGpvaW5pbmcgJTA4eDolMDh4OiUwOHg6JTA4eFxuIiwKKwkgICAgICAgaWJkZXYsIHFwLT5xcG4sIG50b2hsICggZ2lkLT51LmR3b3Jkc1swXSApLAorCSAgICAgICBudG9obCAoIGdpZC0+dS5kd29yZHNbMV0gKSwgbnRvaGwgKCBnaWQtPnUuZHdvcmRzWzJdICksCisJICAgICAgIG50b2hsICggZ2lkLT51LmR3b3Jkc1szXSApICk7CisKKwkvKiBJbml0aWFsaXNlIHN0cnVjdHVyZSAqLworCW1lbWJlcnNoaXAtPnFwID0gcXA7CisJbWVtY3B5ICggJm1lbWJlcnNoaXAtPmdpZCwgZ2lkLCBzaXplb2YgKCBtZW1iZXJzaGlwLT5naWQgKSApOworCW1lbWJlcnNoaXAtPmNvbXBsZXRlID0gY29tcGxldGU7CisKKwkvKiBBdHRhY2ggcXVldWUgcGFpciB0byBtdWx0aWNhc3QgR0lEICovCisJaWYgKCAoIHJjID0gaWJfbWNhc3RfYXR0YWNoICggaWJkZXYsIHFwLCBnaWQgKSApICE9IDAgKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIFFQTiAlbHggY291bGQgbm90IGF0dGFjaDogJXNcbiIsCisJCSAgICAgICBpYmRldiwgcXAtPnFwbiwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyX21jYXN0X2F0dGFjaDsKKwl9CisKKwkvKiBJbml0aWF0ZSBtdWx0aWNhc3QgbWVtYmVyc2hpcCBqb2luICovCisJaWJfbWNhc3RfbWFkICggaWJkZXYsIGdpZCwgMSwgJm1hZCApOworCW1lbWJlcnNoaXAtPm1hZHggPSBpYl9jcmVhdGVfbWFkeCAoIGliZGV2LCBpYmRldi0+Z3NpLCAmbWFkLCBOVUxMLAorCQkJCQkgICAgJmliX21jYXN0X29wICk7CisJaWYgKCAhIG1lbWJlcnNoaXAtPm1hZHggKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIFFQTiAlbHggY291bGQgbm90IGNyZWF0ZSBqb2luICIKKwkJICAgICAgICJ0cmFuc2FjdGlvblxuIiwgaWJkZXYsIHFwLT5xcG4gKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9jcmVhdGVfbWFkeDsKKwl9CisJaWJfbWFkeF9zZXRfb3duZXJkYXRhICggbWVtYmVyc2hpcC0+bWFkeCwgbWVtYmVyc2hpcCApOworCisJcmV0dXJuIDA7CisKKwlpYl9kZXN0cm95X21hZHggKCBpYmRldiwgaWJkZXYtPmdzaSwgbWVtYmVyc2hpcC0+bWFkeCApOworIGVycl9jcmVhdGVfbWFkeDoKKwlpYl9tY2FzdF9kZXRhY2ggKCBpYmRldiwgcXAsIGdpZCApOworIGVycl9tY2FzdF9hdHRhY2g6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIExlYXZlIG11bHRpY2FzdCBncm91cAorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IG1lbWJlcnNoaXAJTXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAKKyAqLwordm9pZCBpYl9tY2FzdF9sZWF2ZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfcXVldWVfcGFpciAqcXAsCisJCSAgICAgIHN0cnVjdCBpYl9tY19tZW1iZXJzaGlwICptZW1iZXJzaGlwICkgeworCXN0cnVjdCBpYl9naWQgKmdpZCA9ICZtZW1iZXJzaGlwLT5naWQ7CisJdW5pb24gaWJfbWFkIG1hZDsKKwlpbnQgcmM7CisKKwlEQkdDICggaWJkZXYsICJJQkRFViAlcCBRUE4gJWx4IGxlYXZpbmcgJTA4eDolMDh4OiUwOHg6JTA4eFxuIiwKKwkgICAgICAgaWJkZXYsIHFwLT5xcG4sIG50b2hsICggZ2lkLT51LmR3b3Jkc1swXSApLAorCSAgICAgICBudG9obCAoIGdpZC0+dS5kd29yZHNbMV0gKSwgbnRvaGwgKCBnaWQtPnUuZHdvcmRzWzJdICksCisJICAgICAgIG50b2hsICggZ2lkLT51LmR3b3Jkc1szXSApICk7CisKKwkvKiBEZXRhY2ggZnJvbSBtdWx0aWNhc3QgR0lEICovCisJaWJfbWNhc3RfZGV0YWNoICggaWJkZXYsIHFwLCAmbWVtYmVyc2hpcC0+Z2lkICk7CisKKwkvKiBDYW5jZWwgbXVsdGljYXN0IG1lbWJlcnNoaXAgam9pbiwgaWYgYXBwbGljYWJsZSAqLworCWlmICggbWVtYmVyc2hpcC0+bWFkeCApIHsKKwkJaWJfZGVzdHJveV9tYWR4ICggaWJkZXYsIGliZGV2LT5nc2ksIG1lbWJlcnNoaXAtPm1hZHggKTsKKwkJbWVtYmVyc2hpcC0+bWFkeCA9IE5VTEw7CisJfQorCisJLyogU2VuZCBhIHNpbmdsZSBncm91cCBsZWF2ZSBNQUQgKi8KKwlpYl9tY2FzdF9tYWQgKCBpYmRldiwgJm1lbWJlcnNoaXAtPmdpZCwgMCwgJm1hZCApOworCWlmICggKCByYyA9IGliX21pX3NlbmQgKCBpYmRldiwgaWJkZXYtPmdzaSwgJm1hZCwgTlVMTCApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgUVBOICVseCBjb3VsZCBub3Qgc2VuZCBsZWF2ZSByZXF1ZXN0OiAiCisJCSAgICAgICAiJXNcbiIsIGliZGV2LCBxcC0+cXBuLCBzdHJlcnJvciAoIHJjICkgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvaW5maW5pYmFuZC9pYl9taS5jIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTExZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfbWkuYwpAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvaW5maW5pYmFuZC5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL2liX21pLmg+CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBJbmZpbmliYW5kIG1hbmFnZW1lbnQgaW50ZXJmYWNlcworICoKKyAqLworCisvKiogTWFuYWdlbWVudCBpbnRlcmZhY2UgbnVtYmVyIG9mIHNlbmQgV1FFcworICoKKyAqIFRoaXMgaXMgYSBwb2xpY3kgZGVjaXNpb24uCisgKi8KKyNkZWZpbmUgSUJfTUlfTlVNX1NFTkRfV1FFUyA0CisKKy8qKiBNYW5hZ2VtZW50IGludGVyZmFjZSBudW1iZXIgb2YgcmVjZWl2ZSBXUUVzCisgKgorICogVGhpcyBpcyBhIHBvbGljeSBkZWNpc2lvbi4KKyAqLworI2RlZmluZSBJQl9NSV9OVU1fUkVDVl9XUUVTIDIKKworLyoqIE1hbmFnZW1lbnQgaW50ZXJmYWNlIG51bWJlciBvZiBjb21wbGV0aW9uIHF1ZXVlIGVudHJpZXMKKyAqCisgKiBUaGlzIGlzIGEgcG9saWN5IGRlY2lzaW9uCisgKi8KKyNkZWZpbmUgSUJfTUlfTlVNX0NRRVMgOAorCisvKiogVElEIG1hZ2ljIHNpZ25hdHVyZSAqLworI2RlZmluZSBJQl9NSV9USURfTUFHSUMgKCAoICdnJyA8PCAyNCApIHwgKCAnUCcgPDwgMTYgKSB8ICggJ1gnIDw8IDggKSB8ICdFJyApCisKKy8qKiBUSUQgdG8gdXNlIGZvciBuZXh0IE1BRCAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZXh0X3RpZDsKKworLyoqCisgKiBIYW5kbGUgcmVjZWl2ZWQgTUFECisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtaQkJTWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqIEB2IG1hZAkJUmVjZWl2ZWQgTUFECisgKiBAdiBhdgkJU291cmNlIGFkZHJlc3MgdmVjdG9yCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpYl9taV9oYW5kbGUgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pLAorCQkJICB1bmlvbiBpYl9tYWQgKm1hZCwKKwkJCSAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApIHsKKwlzdHJ1Y3QgaWJfbWFkX2hkciAqaGRyID0gJm1hZC0+aGRyOworCXN0cnVjdCBpYl9tYWRfdHJhbnNhY3Rpb24gKm1hZHg7CisJc3RydWN0IGliX21hZF9hZ2VudCAqYWdlbnQ7CisKKwkvKiBMb29rIGZvciBhIG1hdGNoaW5nIHRyYW5zYWN0aW9uIGJ5IFRJRCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBtYWR4LCAmbWktPm1hZHgsIGxpc3QgKSB7CisJCWlmICggbWVtY21wICggJmhkci0+dGlkLCAmbWFkeC0+bWFkLmhkci50aWQsCisJCQkgICAgICBzaXplb2YgKCBoZHItPnRpZCApICkgIT0gMCApCisJCQljb250aW51ZTsKKwkJLyogRm91bmQgYSBtYXRjaGluZyB0cmFuc2FjdGlvbiAqLworCQltYWR4LT5vcC0+Y29tcGxldGUgKCBpYmRldiwgbWksIG1hZHgsIDAsIG1hZCwgYXYgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgdHJhbnNhY3Rpb24sIGxvb2sgZm9yIGEgbGlzdGVuaW5nIGFnZW50ICovCisJZm9yX2VhY2hfdGFibGVfZW50cnkgKCBhZ2VudCwgSUJfTUFEX0FHRU5UUyApIHsKKwkJaWYgKCAoICggYWdlbnQtPm1nbXRfY2xhc3MgJiBJQl9NR01UX0NMQVNTX01BU0sgKSAhPQorCQkgICAgICAgKCBoZHItPm1nbXRfY2xhc3MgJiBJQl9NR01UX0NMQVNTX01BU0sgKSApIHx8CisJCSAgICAgKCBhZ2VudC0+Y2xhc3NfdmVyc2lvbiAhPSBoZHItPmNsYXNzX3ZlcnNpb24gKSB8fAorCQkgICAgICggYWdlbnQtPmF0dHJfaWQgIT0gaGRyLT5hdHRyX2lkICkgKQorCQkJY29udGludWU7CisJCS8qIEZvdW5kIGEgbWF0Y2hpbmcgYWdlbnQgKi8KKwkJYWdlbnQtPmhhbmRsZSAoIGliZGV2LCBtaSwgbWFkLCBhdiApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBPdGhlcndpc2UsIGlnbm9yZSBpdCAqLworCURCR0MgKCBtaSwgIk1JICVwIFJYIFRJRCAlMDh4JTA4eCBpZ25vcmVkXG4iLAorCSAgICAgICBtaSwgbnRvaGwgKCBoZHItPnRpZFswXSApLCBudG9obCAoIGhkci0+dGlkWzFdICkgKTsKKwlyZXR1cm4gLUVOT1RTVVA7Cit9CisKKy8qKgorICogQ29tcGxldGUgcmVjZWl2ZSB2aWEgbWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBxcAkJUXVldWUgcGFpcgorICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgcmMJCUNvbXBsZXRpb24gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIHZvaWQgaWJfbWlfY29tcGxldGVfcmVjdiAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLAorCQkJCSAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiwKKwkJCQkgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBpbnQgcmMgKSB7CisJc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pID0gaWJfcXBfZ2V0X293bmVyZGF0YSAoIHFwICk7CisJdW5pb24gaWJfbWFkICptYWQ7CisJc3RydWN0IGliX21hZF9oZHIgKmhkcjsKKworCS8qIElnbm9yZSBlcnJvcnMgKi8KKwlpZiAoIHJjICE9IDAgKSB7CisJCURCR0MgKCBtaSwgIk1JICVwIFJYIGVycm9yOiAlc1xuIiwgbWksIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCBpb2JfbGVuICggaW9idWYgKSAhPSBzaXplb2YgKCAqbWFkICkgKSB7CisJCURCR0MgKCBtaSwgIk1JICVwIFJYIGJhZCBzaXplICglemQgYnl0ZXMpXG4iLAorCQkgICAgICAgbWksIGlvYl9sZW4gKCBpb2J1ZiApICk7CisJCURCR0NfSERBICggbWksIDAsIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSApOworCQlnb3RvIG91dDsKKwl9CisJbWFkID0gaW9idWYtPmRhdGE7CisJaGRyID0gJm1hZC0+aGRyOworCWlmICggaGRyLT5iYXNlX3ZlcnNpb24gIT0gSUJfTUdNVF9CQVNFX1ZFUlNJT04gKSB7CisJCURCR0MgKCBtaSwgIk1JICVwIFJYIHVuc3VwcG9ydGVkIGJhc2UgdmVyc2lvbiAleFxuIiwKKwkJICAgICAgIG1pLCBoZHItPmJhc2VfdmVyc2lvbiApOworCQlEQkdDX0hEQSAoIG1pLCAwLCBtYWQsIHNpemVvZiAoICptYWQgKSApOworCQlnb3RvIG91dDsKKwl9CisJREJHQyAoIG1pLCAiTUkgJXAgUlggVElEICUwOHglMDh4ICglMDJ4LCUwMngsJTAyeCwlMDR4KSBzdGF0dXMgIgorCSAgICAgICAiJTA0eFxuIiwgbWksIG50b2hsICggaGRyLT50aWRbMF0gKSwgbnRvaGwgKCBoZHItPnRpZFsxXSApLAorCSAgICAgICBoZHItPm1nbXRfY2xhc3MsIGhkci0+Y2xhc3NfdmVyc2lvbiwgaGRyLT5tZXRob2QsCisJICAgICAgIG50b2hzICggaGRyLT5hdHRyX2lkICksIG50b2hzICggaGRyLT5zdGF0dXMgKSApOworCURCR0MyX0hEQSAoIG1pLCAwLCBtYWQsIHNpemVvZiAoICptYWQgKSApOworCisJLyogSGFuZGxlIE1BRCAqLworCWlmICggKCByYyA9IGliX21pX2hhbmRsZSAoIGliZGV2LCBtaSwgbWFkLCBhdiApICkgIT0gMCApCisJCWdvdG8gb3V0OworCisgb3V0OgorCWZyZWVfaW9iICggaW9idWYgKTsKK30KKworLyoqIE1hbmFnZW1lbnQgaW50ZXJmYWNlIGNvbXBsZXRpb24gb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBpYl9jb21wbGV0aW9uX3F1ZXVlX29wZXJhdGlvbnMgaWJfbWlfY29tcGxldGlvbl9vcHMgPSB7CisJLmNvbXBsZXRlX3JlY3YgPSBpYl9taV9jb21wbGV0ZV9yZWN2LAorfTsKKworLyoqCisgKiBUcmFuc21pdCBNQUQKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG1pCQlNYW5hZ2VtZW50IGludGVyZmFjZQorICogQHYgbWFkCQlNQUQKKyAqIEB2IGF2CQlEZXN0aW5hdGlvbiBhZGRyZXNzIHZlY3RvcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpYl9taV9zZW5kICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9tYWRfaW50ZXJmYWNlICptaSwKKwkJIHVuaW9uIGliX21hZCAqbWFkLCBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2ICkgeworCXN0cnVjdCBpYl9tYWRfaGRyICpoZHIgPSAmbWFkLT5oZHI7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisJaW50IHJjOworCisJLyogU2V0IGNvbW1vbiBmaWVsZHMgKi8KKwloZHItPmJhc2VfdmVyc2lvbiA9IElCX01HTVRfQkFTRV9WRVJTSU9OOworCWlmICggKCBoZHItPnRpZFswXSA9PSAwICkgJiYgKCBoZHItPnRpZFsxXSA9PSAwICkgKSB7CisJCWhkci0+dGlkWzBdID0gaHRvbmwgKCBJQl9NSV9USURfTUFHSUMgKTsKKwkJaGRyLT50aWRbMV0gPSBodG9ubCAoICsrbmV4dF90aWQgKTsKKwl9CisJREJHQyAoIG1pLCAiTUkgJXAgVFggVElEICUwOHglMDh4ICglMDJ4LCUwMngsJTAyeCwlMDR4KSBzdGF0dXMgIgorCSAgICAgICAiJTA0eFxuIiwgbWksIG50b2hsICggaGRyLT50aWRbMF0gKSwgbnRvaGwgKCBoZHItPnRpZFsxXSApLAorCSAgICAgICBoZHItPm1nbXRfY2xhc3MsIGhkci0+Y2xhc3NfdmVyc2lvbiwgaGRyLT5tZXRob2QsCisJICAgICAgIG50b2hzICggaGRyLT5hdHRyX2lkICksIG50b2hzICggaGRyLT5zdGF0dXMgKSApOworCURCR0MyX0hEQSAoIG1pLCAwLCBtYWQsIHNpemVvZiAoICptYWQgKSApOworCisJLyogQ29uc3RydWN0IGRpcmVjdGVkIHJvdXRlIHBvcnRpb24gb2YgcmVzcG9uc2UsIGlmIG5lY2Vzc2FyeSAqLworCWlmICggaGRyLT5tZ210X2NsYXNzID09IElCX01HTVRfQ0xBU1NfU1VCTl9ESVJFQ1RFRF9ST1VURSApIHsKKwkJc3RydWN0IGliX21hZF9zbXAgKnNtcCA9ICZtYWQtPnNtcDsKKwkJdW5zaWduZWQgaW50IGhvcF9wb2ludGVyOworCQl1bnNpZ25lZCBpbnQgaG9wX2NvdW50OworCisJCXNtcC0+bWFkX2hkci5zdGF0dXMgfD0gaHRvbnMgKCBJQl9TTVBfU1RBVFVTX0RfSU5CT1VORCApOworCQlob3BfcG9pbnRlciA9IHNtcC0+bWFkX2hkci5jbGFzc19zcGVjaWZpYy5zbXAuaG9wX3BvaW50ZXI7CisJCWhvcF9jb3VudCA9IHNtcC0+bWFkX2hkci5jbGFzc19zcGVjaWZpYy5zbXAuaG9wX2NvdW50OworCQlhc3NlcnQgKCBob3BfY291bnQgPT0gaG9wX3BvaW50ZXIgKTsKKwkJaWYgKCBob3BfcG9pbnRlciA8ICggc2l6ZW9mICggc21wLT5yZXR1cm5fcGF0aC5ob3BzICkgLworCQkJCSAgICAgc2l6ZW9mICggc21wLT5yZXR1cm5fcGF0aC5ob3BzWzBdICkgKSApIHsKKwkJCXNtcC0+cmV0dXJuX3BhdGguaG9wc1tob3BfcG9pbnRlcl0gPSBpYmRldi0+cG9ydDsKKwkJfSBlbHNlIHsKKwkJCURCR0MgKCBtaSwgIk1JICVwIFRYIFRJRCAlMDh4JTA4eCBpbnZhbGlkIGhvcCBwb2ludGVyICIKKwkJCSAgICAgICAiJWRcbiIsIG1pLCBudG9obCAoIGhkci0+dGlkWzBdICksCisJCQkgICAgICAgbnRvaGwgKCBoZHItPnRpZFsxXSApLCBob3BfcG9pbnRlciApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBDb25zdHJ1Y3QgSS9PIGJ1ZmZlciAqLworCWlvYnVmID0gYWxsb2NfaW9iICggc2l6ZW9mICggKm1hZCApICk7CisJaWYgKCAhIGlvYnVmICkgeworCQlEQkdDICggbWksICJNSSAlcCBjb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyIGZvciBUSUQgIgorCQkgICAgICAgIiUwOHglMDh4XG4iLAorCQkgICAgICAgbWksIG50b2hsICggaGRyLT50aWRbMF0gKSwgbnRvaGwgKCBoZHItPnRpZFsxXSApICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1jcHkgKCBpb2JfcHV0ICggaW9idWYsIHNpemVvZiAoICptYWQgKSApLCBtYWQsIHNpemVvZiAoICptYWQgKSApOworCisJLyogU2VuZCBJL08gYnVmZmVyICovCisJaWYgKCAoIHJjID0gaWJfcG9zdF9zZW5kICggaWJkZXYsIG1pLT5xcCwgYXYsIGlvYnVmICkgKSAhPSAwICkgeworCQlEQkdDICggbWksICJNSSAlcCBUWCBUSUQgJTA4eCUwOHggZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIG1pLCAgbnRvaGwgKCBoZHItPnRpZFswXSApLCBudG9obCAoIGhkci0+dGlkWzFdICksCisJCSAgICAgICBzdHJlcnJvciAoIHJjICkgKTsKKwkJZnJlZV9pb2IgKCBpb2J1ZiApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFuZGxlIG1hbmFnZW1lbnQgdHJhbnNhY3Rpb24gdGltZXIgZXhwaXJ5CisgKgorICogQHYgdGltZXIJCVJldHJ5IHRpbWVyCisgKiBAdiBleHBpcmVkCQlGYWlsdXJlIGluZGljYXRvcgorICovCitzdGF0aWMgdm9pZCBpYl9taV90aW1lcl9leHBpcmVkICggc3RydWN0IHJldHJ5X3RpbWVyICp0aW1lciwgaW50IGV4cGlyZWQgKSB7CisJc3RydWN0IGliX21hZF90cmFuc2FjdGlvbiAqbWFkeCA9CisJCWNvbnRhaW5lcl9vZiAoIHRpbWVyLCBzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uLCB0aW1lciApOworCXN0cnVjdCBpYl9tYWRfaW50ZXJmYWNlICptaSA9IG1hZHgtPm1pOworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ID0gbWktPmliZGV2OworCXN0cnVjdCBpYl9tYWRfaGRyICpoZHIgPSAmbWFkeC0+bWFkLmhkcjsKKworCS8qIEFiYW5kb24gdHJhbnNhY3Rpb24gaWYgd2UgaGF2ZSB0cmllZCB0b28gbWFueSB0aW1lcyAqLworCWlmICggZXhwaXJlZCApIHsKKwkJREJHQyAoIG1pLCAiTUkgJXAgYWJhbmRvbmluZyBUSUQgJTA4eCUwOHhcbiIsCisJCSAgICAgICBtaSwgbnRvaGwgKCBoZHItPnRpZFswXSApLCBudG9obCAoIGhkci0+dGlkWzFdICkgKTsKKwkJbWFkeC0+b3AtPmNvbXBsZXRlICggaWJkZXYsIG1pLCBtYWR4LCAtRVRJTUVET1VULCBOVUxMLCBOVUxMICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZXN0YXJ0IHJldHJhbnNtaXNzaW9uIHRpbWVyICovCisJc3RhcnRfdGltZXIgKCB0aW1lciApOworCisJLyogUmVzZW5kIE1BRCAqLworCWliX21pX3NlbmQgKCBpYmRldiwgbWksICZtYWR4LT5tYWQsICZtYWR4LT5hdiApOworfQorCisvKioKKyAqIENyZWF0ZSBtYW5hZ2VtZW50IHRyYW5zYWN0aW9uCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtaQkJTWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqIEB2IG1hZAkJTUFEIHRvIHNlbmQKKyAqIEB2IGF2CQlEZXN0aW5hdGlvbiBhZGRyZXNzLCBvciBOVUxMIHRvIHVzZSBTTSdzIEdTSQorICogQHYgb3AJCU1hbmFnZW1lbnQgdHJhbnNhY3Rpb24gb3BlcmF0aW9ucworICogQHJldCBtYWR4CQlNYW5hZ2VtZW50IHRyYW5zYWN0aW9uLCBvciBOVUxMCisgKi8KK3N0cnVjdCBpYl9tYWRfdHJhbnNhY3Rpb24gKgoraWJfY3JlYXRlX21hZHggKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pLAorCQkgdW5pb24gaWJfbWFkICptYWQsIHN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciAqYXYsCisJCSBzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uX29wZXJhdGlvbnMgKm9wICkgeworCXN0cnVjdCBpYl9tYWRfdHJhbnNhY3Rpb24gKm1hZHg7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBzdHJ1Y3R1cmUgKi8KKwltYWR4ID0gemFsbG9jICggc2l6ZW9mICggKm1hZHggKSApOworCWlmICggISBtYWR4ICkKKwkJcmV0dXJuIE5VTEw7CisJbWFkeC0+bWkgPSBtaTsKKwltYWR4LT50aW1lci5leHBpcmVkID0gaWJfbWlfdGltZXJfZXhwaXJlZDsKKwltYWR4LT5vcCA9IG9wOworCisJLyogRGV0ZXJtaW5lIGFkZHJlc3MgdmVjdG9yICovCisJaWYgKCBhdiApIHsKKwkJbWVtY3B5ICggJm1hZHgtPmF2LCBhdiwgc2l6ZW9mICggbWFkeC0+YXYgKSApOworCX0gZWxzZSB7CisJCW1hZHgtPmF2LmxpZCA9IGliZGV2LT5zbV9saWQ7CisJCW1hZHgtPmF2LnNsID0gaWJkZXYtPnNtX3NsOworCQltYWR4LT5hdi5xcG4gPSBJQl9RUE5fR1NJOworCQltYWR4LT5hdi5xa2V5ID0gSUJfUUtFWV9HU0k7CisJfQorCisJLyogQ29weSBNQUQgKi8KKwltZW1jcHkgKCAmbWFkeC0+bWFkLCBtYWQsIHNpemVvZiAoIG1hZHgtPm1hZCApICk7CisKKwkvKiBBZGQgdG8gbGlzdCBhbmQgc3RhcnQgdGltZXIgdG8gc2VuZCBpbml0aWFsIE1BRCAqLworCWxpc3RfYWRkICggJm1hZHgtPmxpc3QsICZtaS0+bWFkeCApOworCXN0YXJ0X3RpbWVyX25vZGVsYXkgKCAmbWFkeC0+dGltZXIgKTsKKworCXJldHVybiBtYWR4OworfQorCisvKioKKyAqIERlc3Ryb3kgbWFuYWdlbWVudCB0cmFuc2FjdGlvbgorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgbWkJCU1hbmFnZW1lbnQgaW50ZXJmYWNlCisgKiBAdiBtYWR4CQlNYW5hZ2VtZW50IHRyYW5zYWN0aW9uCisgKi8KK3ZvaWQgaWJfZGVzdHJveV9tYWR4ICggc3RydWN0IGliX2RldmljZSAqaWJkZXYgX191bnVzZWQsCisJCSAgICAgICBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWkgX191bnVzZWQsCisJCSAgICAgICBzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uICptYWR4ICkgeworCisJLyogU3RvcCB0aW1lciBhbmQgcmVtb3ZlIGZyb20gbGlzdCAqLworCXN0b3BfdGltZXIgKCAmbWFkeC0+dGltZXIgKTsKKwlsaXN0X2RlbCAoICZtYWR4LT5saXN0ICk7CisKKwkvKiBGcmVlIHRyYW5zYWN0aW9uICovCisJZnJlZSAoIG1hZHggKTsKK30KKworLyoqCisgKiBDcmVhdGUgbWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHR5cGUJCVF1ZXVlIHBhaXIgdHlwZQorICogQHJldCBtaQkJTWFuYWdlbWVudCBhZ2VudCwgb3IgTlVMTAorICovCitzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqIGliX2NyZWF0ZV9taSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCQkgZW51bSBpYl9xdWV1ZV9wYWlyX3R5cGUgdHlwZSApIHsKKwlzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWk7CisJaW50IHJjOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgZmllbGRzICovCisJbWkgPSB6YWxsb2MgKCBzaXplb2YgKCAqbWkgKSApOworCWlmICggISBtaSApCisJCWdvdG8gZXJyX2FsbG9jOworCW1pLT5pYmRldiA9IGliZGV2OworCUlOSVRfTElTVF9IRUFEICggJm1pLT5tYWR4ICk7CisKKwkvKiBDcmVhdGUgY29tcGxldGlvbiBxdWV1ZSAqLworCW1pLT5jcSA9IGliX2NyZWF0ZV9jcSAoIGliZGV2LCBJQl9NSV9OVU1fQ1FFUywgJmliX21pX2NvbXBsZXRpb25fb3BzICk7CisJaWYgKCAhIG1pLT5jcSApIHsKKwkJREJHQyAoIG1pLCAiTUkgJXAgY291bGQgbm90IGFsbG9jYXRlIGNvbXBsZXRpb24gcXVldWVcbiIsIG1pICk7CisJCWdvdG8gZXJyX2NyZWF0ZV9jcTsKKwl9CisKKwkvKiBDcmVhdGUgcXVldWUgcGFpciAqLworCW1pLT5xcCA9IGliX2NyZWF0ZV9xcCAoIGliZGV2LCB0eXBlLCBJQl9NSV9OVU1fU0VORF9XUUVTLCBtaS0+Y3EsCisJCQkJSUJfTUlfTlVNX1JFQ1ZfV1FFUywgbWktPmNxICk7CisJaWYgKCAhIG1pLT5xcCApIHsKKwkJREJHQyAoIG1pLCAiTUkgJXAgY291bGQgbm90IGFsbG9jYXRlIHF1ZXVlIHBhaXJcbiIsIG1pICk7CisJCWdvdG8gZXJyX2NyZWF0ZV9xcDsKKwl9CisJaWJfcXBfc2V0X293bmVyZGF0YSAoIG1pLT5xcCwgbWkgKTsKKwlEQkdDICggbWksICJNSSAlcCAoJXMpIHJ1bm5pbmcgb24gUVBOICUjbHhcbiIsCisJICAgICAgIG1pLCAoICggdHlwZSA9PSBJQl9RUFRfU01JICkgPyAiU01JIiA6ICJHU0kiICksIG1pLT5xcC0+cXBuICk7CisKKwkvKiBTZXQgcXVldWUga2V5ICovCisJbWktPnFwLT5xa2V5ID0gKCAoIHR5cGUgPT0gSUJfUVBUX1NNSSApID8gSUJfUUtFWV9TTUkgOiBJQl9RS0VZX0dTSSApOworCWlmICggKCByYyA9IGliX21vZGlmeV9xcCAoIGliZGV2LCBtaS0+cXAgKSApICE9IDAgKSB7CisJCURCR0MgKCBtaSwgIk1JICVwIGNvdWxkIG5vdCBzZXQgcXVldWUga2V5OiAlc1xuIiwKKwkJICAgICAgIG1pLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnJfbW9kaWZ5X3FwOworCX0KKworCS8qIEZpbGwgcmVjZWl2ZSByaW5nICovCisJaWJfcmVmaWxsX3JlY3YgKCBpYmRldiwgbWktPnFwICk7CisJcmV0dXJuIG1pOworCisgZXJyX21vZGlmeV9xcDoKKwlpYl9kZXN0cm95X3FwICggaWJkZXYsIG1pLT5xcCApOworIGVycl9jcmVhdGVfcXA6CisJaWJfZGVzdHJveV9jcSAoIGliZGV2LCBtaS0+Y3EgKTsKKyBlcnJfY3JlYXRlX2NxOgorCWZyZWUgKCBtaSApOworIGVycl9hbGxvYzoKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBEZXN0cm95IG1hbmFnZW1lbnQgaW50ZXJmYWNlCisgKgorICogQHYgbWkJCU1hbmFnZW1lbnQgaW50ZXJmYWNlCisgKi8KK3ZvaWQgaWJfZGVzdHJveV9taSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWkgKSB7CisJc3RydWN0IGliX21hZF90cmFuc2FjdGlvbiAqbWFkeDsKKwlzdHJ1Y3QgaWJfbWFkX3RyYW5zYWN0aW9uICp0bXA7CisKKwkvKiBGbHVzaCBhbnkgb3V0c3RhbmRpbmcgcmVxdWVzdHMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKCBtYWR4LCB0bXAsICZtaS0+bWFkeCwgbGlzdCApIHsKKwkJREJHQyAoIG1pLCAiTUkgJXAgZGVzdHJveWVkIHdoaWxlIFRJRCAlMDh4JTA4eCBpbiBwcm9ncmVzc1xuIiwKKwkJICAgICAgIG1pLCBudG9obCAoIG1hZHgtPm1hZC5oZHIudGlkWzBdICksCisJCSAgICAgICBudG9obCAoIG1hZHgtPm1hZC5oZHIudGlkWzFdICkgKTsKKwkJbWFkeC0+b3AtPmNvbXBsZXRlICggaWJkZXYsIG1pLCBtYWR4LCAtRUNBTkNFTEVELCBOVUxMLCBOVUxMICk7CisJfQorCisJaWJfZGVzdHJveV9xcCAoIGliZGV2LCBtaS0+cXAgKTsKKwlpYl9kZXN0cm95X2NxICggaWJkZXYsIG1pLT5jcSApOworCWZyZWUgKCBtaSApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfcGFja2V0LmMgYi9ncHhlL3NyYy9uZXQvaW5maW5pYmFuZC9pYl9wYWNrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgyMGVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfcGFja2V0LmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvaW5maW5pYmFuZC5oPgorI2luY2x1ZGUgPGdweGUvaWJfcGFja2V0Lmg+CisKKy8qKgorICogQGZpbGUKKyAqCisgKiBJbmZpbmliYW5kIFBhY2tldCBGb3JtYXRzCisgKgorICovCisKKy8qKgorICogQWRkIElCIGhlYWRlcnMKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyIHRvIGNvbnRhaW4gaGVhZGVycworICogQHYgcXAJCVF1ZXVlIHBhaXIKKyAqIEB2IHBheWxvYWRfbGVuCVBheWxvYWQgbGVuZ3RoCisgKiBAdiBhdgkJQWRkcmVzcyB2ZWN0b3IKKyAqLworaW50IGliX3B1c2ggKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJICAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKnFwLCBzaXplX3QgcGF5bG9hZF9sZW4sCisJICAgICAgY29uc3Qgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApIHsKKwlzdHJ1Y3QgaWJfbG9jYWxfcm91dGVfaGVhZGVyICpscmg7CisJc3RydWN0IGliX2dsb2JhbF9yb3V0ZV9oZWFkZXIgKmdyaDsKKwlzdHJ1Y3QgaWJfYmFzZV90cmFuc3BvcnRfaGVhZGVyICpidGg7CisJc3RydWN0IGliX2RhdGFncmFtX2V4dGVuZGVkX3RyYW5zcG9ydF9oZWFkZXIgKmRldGg7CisJc2l6ZV90IG9yaWdfaW9iX2xlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCXNpemVfdCBwYWRfbGVuOworCXNpemVfdCBscmhfbGVuOworCXNpemVfdCBncmhfbGVuOworCXVuc2lnbmVkIGludCB2bDsKKwl1bnNpZ25lZCBpbnQgbG5oOworCisJREJHQzIgKCBpYmRldiwgIklCREVWICVwIFRYICUwNHg6JTA4bHggPT4gJTA0eDolMDhseCAoa2V5ICUwOGx4KVxuIiwKKwkJaWJkZXYsIGliZGV2LT5saWQsIHFwLT5leHRfcXBuLCBhdi0+bGlkLCBhdi0+cXBuLCBhdi0+cWtleSApOworCisJLyogQ2FsY3VsYXRlIHBhY2tldCBsZW5ndGggKi8KKwlwYWRfbGVuID0gKCAoLXBheWxvYWRfbGVuKSAmIDB4MyApOworCXBheWxvYWRfbGVuICs9IHBhZF9sZW47CisJcGF5bG9hZF9sZW4gKz0gNDsgLyogSUNSQyAqLworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgaGVhZGVycyAqLworCW9yaWdfaW9iX2xlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCWRldGggPSBpb2JfcHVzaCAoIGlvYnVmLCBzaXplb2YgKCAqZGV0aCApICk7CisJYnRoID0gaW9iX3B1c2ggKCBpb2J1Ziwgc2l6ZW9mICggKmJ0aCApICk7CisJZ3JoX2xlbiA9ICggcGF5bG9hZF9sZW4gKyBpb2JfbGVuICggaW9idWYgKSAtIG9yaWdfaW9iX2xlbiApOworCWdyaCA9ICggYXYtPmdpZF9wcmVzZW50ID8KKwkJaW9iX3B1c2ggKCBpb2J1Ziwgc2l6ZW9mICggKmdyaCApICkgOiBOVUxMICk7CisJbHJoID0gaW9iX3B1c2ggKCBpb2J1Ziwgc2l6ZW9mICggKmxyaCApICk7CisJbHJoX2xlbiA9ICggcGF5bG9hZF9sZW4gKyBpb2JfbGVuICggaW9idWYgKSAtIG9yaWdfaW9iX2xlbiApOworCisJLyogQ29uc3RydWN0IExSSCAqLworCXZsID0gKCAoIHFwLT5leHRfcXBuID09IElCX1FQTl9TTUkgKSA/IElCX1ZMX1NNUCA6IElCX1ZMX0RFRkFVTFQgKTsKKwlscmgtPnZsX19sdmVyID0gKCB2bCA8PCA0ICk7CisJbG5oID0gKCBncmggPyBJQl9MTkhfR1JIIDogSUJfTE5IX0JUSCApOworCWxyaC0+c2xfX2xuaCA9ICggKCBhdi0+c2wgPDwgNCApIHwgbG5oICk7CisJbHJoLT5kbGlkID0gaHRvbnMgKCBhdi0+bGlkICk7CisJbHJoLT5sZW5ndGggPSBodG9ucyAoIGxyaF9sZW4gPj4gMiApOworCWxyaC0+c2xpZCA9IGh0b25zICggaWJkZXYtPmxpZCApOworCisJLyogQ29uc3RydWN0IEdSSCwgaWYgcmVxdWlyZWQgKi8KKwlpZiAoIGdyaCApIHsKKwkJZ3JoLT5pcHZlcl9fdGNsYXNzX19mbG93bGFiZWwgPQorCQkJaHRvbmwgKCBJQl9HUkhfSVBWRVJfSVB2NiA8PCAyOCApOworCQlncmgtPnBheWxlbiA9IGh0b25zICggZ3JoX2xlbiApOworCQlncmgtPm54dGhkciA9IElCX0dSSF9OWFRIRFJfSUJBOworCQlncmgtPmhvcGxtdCA9IDA7CisJCW1lbWNweSAoICZncmgtPnNnaWQsICZpYmRldi0+Z2lkLCBzaXplb2YgKCBncmgtPnNnaWQgKSApOworCQltZW1jcHkgKCAmZ3JoLT5kZ2lkLCAmYXYtPmdpZCwgc2l6ZW9mICggZ3JoLT5kZ2lkICkgKTsKKwl9CisKKwkvKiBDb25zdHJ1Y3QgQlRIICovCisJYnRoLT5vcGNvZGUgPSBCVEhfT1BDT0RFX1VEX1NFTkQ7CisJYnRoLT5zZV9fbV9fcGFkY250X190dmVyID0gKCBwYWRfbGVuIDw8IDQgKTsKKwlidGgtPnBrZXkgPSBodG9ucyAoIGliZGV2LT5wa2V5ICk7CisJYnRoLT5kZXN0X3FwID0gaHRvbmwgKCBhdi0+cXBuICk7CisJYnRoLT5hY2tfX3BzbiA9IGh0b25sICggKCBxcC0+c2VuZC5wc24rKyApICYgMHhmZmZmZmZVTCApOworCisJLyogQ29uc3RydWN0IERFVEggKi8KKwlkZXRoLT5xa2V5ID0gaHRvbmwgKCBhdi0+cWtleSApOworCWRldGgtPnNyY19xcCA9IGh0b25sICggcXAtPmV4dF9xcG4gKTsKKworCURCR0NQX0hEQSAoIGliZGV2LCAwLCBpb2J1Zi0+ZGF0YSwKKwkJICAgICggaW9iX2xlbiAoIGlvYnVmICkgLSBvcmlnX2lvYl9sZW4gKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVtb3ZlIElCIGhlYWRlcnMKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyIGNvbnRhaW5pbmcgaGVhZGVycworICogQHYgcXAJCVF1ZXVlIHBhaXIgdG8gZmlsbCBpbiwgb3IgTlVMTAorICogQHYgcGF5bG9hZF9sZW4JUGF5bG9hZCBsZW5ndGggdG8gZmlsbCBpbiwgb3IgTlVMTAorICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yIHRvIGZpbGwgaW4KKyAqLworaW50IGliX3B1bGwgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJICAgICAgc3RydWN0IGliX3F1ZXVlX3BhaXIgKipxcCwgc2l6ZV90ICpwYXlsb2FkX2xlbiwKKwkgICAgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2ICkgeworCXN0cnVjdCBpYl9sb2NhbF9yb3V0ZV9oZWFkZXIgKmxyaDsKKwlzdHJ1Y3QgaWJfZ2xvYmFsX3JvdXRlX2hlYWRlciAqZ3JoOworCXN0cnVjdCBpYl9iYXNlX3RyYW5zcG9ydF9oZWFkZXIgKmJ0aDsKKwlzdHJ1Y3QgaWJfZGF0YWdyYW1fZXh0ZW5kZWRfdHJhbnNwb3J0X2hlYWRlciAqZGV0aDsKKwlzaXplX3Qgb3JpZ19pb2JfbGVuID0gaW9iX2xlbiAoIGlvYnVmICk7CisJdW5zaWduZWQgaW50IGxuaDsKKwlzaXplX3QgcGFkX2xlbjsKKwl1bnNpZ25lZCBsb25nIHFwbjsKKwl1bnNpZ25lZCBpbnQgbGlkOworCisJLyogQ2xlYXIgcmV0dXJuIHZhbHVlcyAqLworCWlmICggcXAgKQorCQkqcXAgPSBOVUxMOworCWlmICggcGF5bG9hZF9sZW4gKQorCQkqcGF5bG9hZF9sZW4gPSAwOworCW1lbXNldCAoIGF2LCAwLCBzaXplb2YgKCAqYXYgKSApOworCisJLyogRXh0cmFjdCBMUkggKi8KKwlpZiAoIGlvYl9sZW4gKCBpb2J1ZiApIDwgc2l6ZW9mICggKmxyaCApICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBSWCB0b28gc2hvcnQgKCV6ZCBieXRlcykgZm9yIExSSFxuIiwKKwkJICAgICAgIGliZGV2LCBpb2JfbGVuICggaW9idWYgKSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbHJoID0gaW9idWYtPmRhdGE7CisJaW9iX3B1bGwgKCBpb2J1Ziwgc2l6ZW9mICggKmxyaCApICk7CisJYXYtPmxpZCA9IG50b2hzICggbHJoLT5zbGlkICk7CisJYXYtPnNsID0gKCBscmgtPnNsX19sbmggPj4gNCApOworCWxuaCA9ICggbHJoLT5zbF9fbG5oICYgMHgzICk7CisJbGlkID0gbnRvaHMgKCBscmgtPmRsaWQgKTsKKworCS8qIFJlamVjdCB1bnN1cHBvcnRlZCBwYWNrZXRzICovCisJaWYgKCAhICggKCBsbmggPT0gSUJfTE5IX0JUSCApIHx8ICggbG5oID09IElCX0xOSF9HUkggKSApICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBSWCB1bnN1cHBvcnRlZCBMTkggJXhcbiIsCisJCSAgICAgICBpYmRldiwgbG5oICk7CisJCXJldHVybiAtRU5PVFNVUDsKKwl9CisKKwkvKiBFeHRyYWN0IEdSSCwgaWYgcHJlc2VudCAqLworCWlmICggbG5oID09IElCX0xOSF9HUkggKSB7CisJCWlmICggaW9iX2xlbiAoIGlvYnVmICkgPCBzaXplb2YgKCAqZ3JoICkgKSB7CisJCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBSWCB0b28gc2hvcnQgKCV6ZCBieXRlcykgIgorCQkJICAgICAgICJmb3IgR1JIXG4iLCBpYmRldiwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWdyaCA9IGlvYnVmLT5kYXRhOworCQlpb2JfcHVsbCAoIGlvYnVmLCBzaXplb2YgKCAqZ3JoICkgKTsKKwkJYXYtPmdpZF9wcmVzZW50ID0gMTsKKwkJbWVtY3B5ICggJmF2LT5naWQsICZncmgtPnNnaWQsIHNpemVvZiAoIGF2LT5naWQgKSApOworCX0gZWxzZSB7CisJCWdyaCA9IE5VTEw7CisJfQorCisJLyogRXh0cmFjdCBCVEggKi8KKwlpZiAoIGlvYl9sZW4gKCBpb2J1ZiApIDwgc2l6ZW9mICggKmJ0aCApICkgeworCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBSWCB0b28gc2hvcnQgKCV6ZCBieXRlcykgZm9yIEJUSFxuIiwKKwkJICAgICAgIGliZGV2LCBpb2JfbGVuICggaW9idWYgKSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYnRoID0gaW9idWYtPmRhdGE7CisJaW9iX3B1bGwgKCBpb2J1Ziwgc2l6ZW9mICggKmJ0aCApICk7CisJaWYgKCBidGgtPm9wY29kZSAhPSBCVEhfT1BDT0RFX1VEX1NFTkQgKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIHVuc3VwcG9ydGVkIEJUSCBvcGNvZGUgJXhcbiIsCisJCSAgICAgICBpYmRldiwgYnRoLT5vcGNvZGUgKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KKwlxcG4gPSBudG9obCAoIGJ0aC0+ZGVzdF9xcCApOworCisJLyogRXh0cmFjdCBERVRIICovCisJaWYgKCBpb2JfbGVuICggaW9idWYgKSA8IHNpemVvZiAoICpkZXRoICkgKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIFJYIHRvbyBzaG9ydCAoJXpkIGJ5dGVzKSBmb3IgREVUSFxuIiwKKwkJICAgICAgIGliZGV2LCBpb2JfbGVuICggaW9idWYgKSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV0aCA9IGlvYnVmLT5kYXRhOworCWlvYl9wdWxsICggaW9idWYsIHNpemVvZiAoICpkZXRoICkgKTsKKwlhdi0+cXBuID0gbnRvaGwgKCBkZXRoLT5zcmNfcXAgKTsKKwlhdi0+cWtleSA9IG50b2hsICggZGV0aC0+cWtleSApOworCisJLyogQ2FsY3VsYXRlIHBheWxvYWQgbGVuZ3RoLCBpZiBhcHBsaWNhYmxlICovCisJaWYgKCBwYXlsb2FkX2xlbiApIHsKKwkJcGFkX2xlbiA9ICggKCBidGgtPnNlX19tX19wYWRjbnRfX3R2ZXIgPj4gNCApICYgMHgzICk7CisJCSpwYXlsb2FkX2xlbiA9ICggKCBudG9ocyAoIGxyaC0+bGVuZ3RoICkgPDwgMiApCisJCQkJIC0gKCBvcmlnX2lvYl9sZW4gLSBpb2JfbGVuICggaW9idWYgKSApCisJCQkJIC0gcGFkX2xlbiAtIDQgLyogSUNSQyAqLyApOworCX0KKworCS8qIERldGVybWluZSBkZXN0aW5hdGlvbiBRUCwgaWYgYXBwbGljYWJsZSAqLworCWlmICggcXAgKSB7CisJCWlmICggSUJfTElEX01VTFRJQ0FTVCAoIGxpZCApICYmIGdyaCApIHsKKwkJCWlmICggISAoICpxcCA9IGliX2ZpbmRfcXBfbWdpZCAoIGliZGV2LCAmZ3JoLT5kZ2lkICkpKXsKKwkJCQlEQkdDICggaWJkZXYsICJJQkRFViAlcCBSWCBmb3IgdW5rbm93biBNR0lEICIKKwkJCQkgICAgICAgIiUwOHg6JTA4eDolMDh4OiUwOHhcbiIsIGliZGV2LAorCQkJCSAgICAgICBudG9obCAoIGdyaC0+ZGdpZC51LmR3b3Jkc1swXSApLAorCQkJCSAgICAgICBudG9obCAoIGdyaC0+ZGdpZC51LmR3b3Jkc1sxXSApLAorCQkJCSAgICAgICBudG9obCAoIGdyaC0+ZGdpZC51LmR3b3Jkc1syXSApLAorCQkJCSAgICAgICBudG9obCAoIGdyaC0+ZGdpZC51LmR3b3Jkc1szXSApICk7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoICEgKCAqcXAgPSBpYl9maW5kX3FwX3FwbiAoIGliZGV2LCBxcG4gKSApICkgeworCQkJCURCR0MgKCBpYmRldiwgIklCREVWICVwIFJYIGZvciBub25leGlzdGVudCAiCisJCQkJICAgICAgICJRUE4gJWx4XG4iLCBpYmRldiwgcXBuICk7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCX0KKwkJYXNzZXJ0ICggKnFwICk7CisJfQorCisJREJHQzIgKCBpYmRldiwgIklCREVWICVwIFJYICUwNHg6JTA4bHggPD0gJTA0eDolMDhseCAoa2V5ICUwOHgpXG4iLAorCQlpYmRldiwgbGlkLCAoIElCX0xJRF9NVUxUSUNBU1QoIGxpZCApID8KKwkJCSAgICAgICggcXAgPyAoKnFwKS0+ZXh0X3FwbiA6IC0xVUwgKSA6IHFwbiApLAorCQlhdi0+bGlkLCBhdi0+cXBuLCBudG9obCAoIGRldGgtPnFrZXkgKSApOworCURCR0NQX0hEQSAoIGliZGV2LCAwLAorCQkgICAgKCBpb2J1Zi0+ZGF0YSAtICggb3JpZ19pb2JfbGVuIC0gaW9iX2xlbiAoIGlvYnVmICkgKSApLAorCQkgICAgKCBvcmlnX2lvYl9sZW4gLSBpb2JfbGVuICggaW9idWYgKSApICk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC9pbmZpbmliYW5kL2liX3BhdGhyZWMuYyBiL2dweGUvc3JjL25ldC9pbmZpbmliYW5kL2liX3BhdGhyZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzZlNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfcGF0aHJlYy5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvaW5maW5pYmFuZC5oPgorI2luY2x1ZGUgPGdweGUvaWJfbWkuaD4KKyNpbmNsdWRlIDxncHhlL2liX3BhdGhyZWMuaD4KKworLyoqIEBmaWxlCisgKgorICogSW5maW5pYmFuZCBwYXRoIGxvb2t1cHMKKyAqCisgKi8KKworLyoqCisgKiBIYW5kbGUgcGF0aCB0cmFuc2FjdGlvbiBjb21wbGV0aW9uCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtaQkJTWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqIEB2IG1hZHgJCU1hbmFnZW1lbnQgdHJhbnNhY3Rpb24KKyAqIEB2IHJjCQlTdGF0dXMgY29kZQorICogQHYgbWFkCQlSZWNlaXZlZCBNQUQgKG9yIE5VTEwgb24gZXJyb3IpCisgKiBAdiBhdgkJU291cmNlIGFkZHJlc3MgdmVjdG9yIChvciBOVUxMIG9uIGVycm9yKQorICovCitzdGF0aWMgdm9pZCBpYl9wYXRoX2NvbXBsZXRlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICAgc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pLAorCQkJICAgICAgIHN0cnVjdCBpYl9tYWRfdHJhbnNhY3Rpb24gKm1hZHgsCisJCQkgICAgICAgaW50IHJjLCB1bmlvbiBpYl9tYWQgKm1hZCwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2IF9fdW51c2VkICkgeworCXN0cnVjdCBpYl9wYXRoICpwYXRoID0gaWJfbWFkeF9nZXRfb3duZXJkYXRhICggbWFkeCApOworCXN0cnVjdCBpYl9naWQgKmRnaWQgPSAmcGF0aC0+YXYuZ2lkOworCXN0cnVjdCBpYl9wYXRoX3JlY29yZCAqcGF0aHJlYyA9ICZtYWQtPnNhLnNhX2RhdGEucGF0aF9yZWNvcmQ7CisKKwkvKiBSZXBvcnQgZmFpbHVyZXMgKi8KKwlpZiAoICggcmMgPT0gMCApICYmICggbWFkLT5oZHIuc3RhdHVzICE9IGh0b25zICggSUJfTUdNVF9TVEFUVVNfT0sgKSApKQorCQlyYyA9IC1FTkVUVU5SRUFDSDsKKwlpZiAoIHJjICE9IDAgKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIHBhdGggbG9va3VwIGZvciAlMDh4OiUwOHg6JTA4eDolMDh4ICIKKwkJICAgICAgICJmYWlsZWQ6ICVzXG4iLCBpYmRldiwgaHRvbmwgKCBkZ2lkLT51LmR3b3Jkc1swXSApLAorCQkgICAgICAgaHRvbmwgKCBkZ2lkLT51LmR3b3Jkc1sxXSApLAorCQkgICAgICAgaHRvbmwgKCBkZ2lkLT51LmR3b3Jkc1syXSApLAorCQkgICAgICAgaHRvbmwgKCBkZ2lkLT51LmR3b3Jkc1szXSApLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRXh0cmFjdCB2YWx1ZXMgZnJvbSBNQUQgKi8KKwlwYXRoLT5hdi5saWQgPSBudG9ocyAoIHBhdGhyZWMtPmRsaWQgKTsKKwlwYXRoLT5hdi5zbCA9ICggcGF0aHJlYy0+cmVzZXJ2ZWRfX3NsICYgMHgwZiApOworCXBhdGgtPmF2LnJhdGUgPSAoIHBhdGhyZWMtPnJhdGVfc2VsZWN0b3JfX3JhdGUgJiAweDNmICk7CisJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgcGF0aCB0byAlMDh4OiUwOHg6JTA4eDolMDh4IGlzICUwNHggc2wgJWQgIgorCSAgICAgICAicmF0ZSAlZFxuIiwgaWJkZXYsIGh0b25sICggZGdpZC0+dS5kd29yZHNbMF0gKSwKKwkgICAgICAgaHRvbmwgKCBkZ2lkLT51LmR3b3Jkc1sxXSApLCBodG9ubCAoIGRnaWQtPnUuZHdvcmRzWzJdICksCisJICAgICAgIGh0b25sICggZGdpZC0+dS5kd29yZHNbM10gKSwgcGF0aC0+YXYubGlkLCBwYXRoLT5hdi5zbCwKKwkgICAgICAgcGF0aC0+YXYucmF0ZSApOworCisgb3V0OgorCS8qIERlc3Ryb3kgdGhlIGNvbXBsZXRlZCB0cmFuc2FjdGlvbiAqLworCWliX2Rlc3Ryb3lfbWFkeCAoIGliZGV2LCBtaSwgbWFkeCApOworCXBhdGgtPm1hZHggPSBOVUxMOworCisJLyogSGFuZCBvZmYgdG8gdXBwZXIgY29tcGxldGlvbiBoYW5kbGVyICovCisJcGF0aC0+b3AtPmNvbXBsZXRlICggaWJkZXYsIHBhdGgsIHJjLCAmcGF0aC0+YXYgKTsKK30KKworLyoqIFBhdGggdHJhbnNhY3Rpb24gY29tcGxldGlvbiBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IGliX21hZF90cmFuc2FjdGlvbl9vcGVyYXRpb25zIGliX3BhdGhfb3AgPSB7CisJLmNvbXBsZXRlID0gaWJfcGF0aF9jb21wbGV0ZSwKK307CisKKy8qKgorICogQ3JlYXRlIHBhdGgKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IGF2CQlBZGRyZXNzIHZlY3RvciB0byBjb21wbGV0ZQorICogQHYgb3AJCVBhdGggb3BlcmF0aW9ucworICogQHJldCBwYXRoCQlQYXRoCisgKi8KK3N0cnVjdCBpYl9wYXRoICoKK2liX2NyZWF0ZV9wYXRoICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciAqYXYsCisJCSBzdHJ1Y3QgaWJfcGF0aF9vcGVyYXRpb25zICpvcCApIHsKKwlzdHJ1Y3QgaWJfcGF0aCAqcGF0aDsKKwl1bmlvbiBpYl9tYWQgbWFkOworCXN0cnVjdCBpYl9tYWRfc2EgKnNhID0gJm1hZC5zYTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHN0cnVjdHVyZSAqLworCXBhdGggPSB6YWxsb2MgKCBzaXplb2YgKCAqcGF0aCApICk7CisJaWYgKCAhIHBhdGggKQorCQlnb3RvIGVycl9hbGxvY19wYXRoOworCXBhdGgtPmliZGV2ID0gaWJkZXY7CisJbWVtY3B5ICggJnBhdGgtPmF2LCBhdiwgc2l6ZW9mICggcGF0aC0+YXYgKSApOworCXBhdGgtPm9wID0gb3A7CisKKwkvKiBDb25zdHJ1Y3QgcGF0aCByZXF1ZXN0ICovCisJbWVtc2V0ICggc2EsIDAsIHNpemVvZiAoICpzYSApICk7CisJc2EtPm1hZF9oZHIubWdtdF9jbGFzcyA9IElCX01HTVRfQ0xBU1NfU1VCTl9BRE07CisJc2EtPm1hZF9oZHIuY2xhc3NfdmVyc2lvbiA9IElCX1NBX0NMQVNTX1ZFUlNJT047CisJc2EtPm1hZF9oZHIubWV0aG9kID0gSUJfTUdNVF9NRVRIT0RfR0VUOworCXNhLT5tYWRfaGRyLmF0dHJfaWQgPSBodG9ucyAoIElCX1NBX0FUVFJfUEFUSF9SRUMgKTsKKwlzYS0+c2FfaGRyLmNvbXBfbWFza1sxXSA9CisJCWh0b25sICggSUJfU0FfUEFUSF9SRUNfREdJRCB8IElCX1NBX1BBVEhfUkVDX1NHSUQgKTsKKwltZW1jcHkgKCAmc2EtPnNhX2RhdGEucGF0aF9yZWNvcmQuZGdpZCwgJnBhdGgtPmF2LmdpZCwKKwkJIHNpemVvZiAoIHNhLT5zYV9kYXRhLnBhdGhfcmVjb3JkLmRnaWQgKSApOworCW1lbWNweSAoICZzYS0+c2FfZGF0YS5wYXRoX3JlY29yZC5zZ2lkLCAmaWJkZXYtPmdpZCwKKwkJIHNpemVvZiAoIHNhLT5zYV9kYXRhLnBhdGhfcmVjb3JkLnNnaWQgKSApOworCisJLyogQ3JlYXRlIG1hbmFnZW1lbnQgdHJhbnNhY3Rpb24gKi8KKwlwYXRoLT5tYWR4ID0gaWJfY3JlYXRlX21hZHggKCBpYmRldiwgaWJkZXYtPmdzaSwgJm1hZCwgTlVMTCwKKwkJCQkgICAgICAmaWJfcGF0aF9vcCApOworCWlmICggISBwYXRoLT5tYWR4ICkKKwkJZ290byBlcnJfY3JlYXRlX21hZHg7CisJaWJfbWFkeF9zZXRfb3duZXJkYXRhICggcGF0aC0+bWFkeCwgcGF0aCApOworCisJcmV0dXJuIHBhdGg7CisKKwlpYl9kZXN0cm95X21hZHggKCBpYmRldiwgaWJkZXYtPmdzaSwgcGF0aC0+bWFkeCApOworIGVycl9jcmVhdGVfbWFkeDoKKwlmcmVlICggcGF0aCApOworIGVycl9hbGxvY19wYXRoOgorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIERlc3Ryb3kgcGF0aAorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgcGF0aAkJUGF0aAorICovCit2b2lkIGliX2Rlc3Ryb3lfcGF0aCAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfcGF0aCAqcGF0aCApIHsKKworCWlmICggcGF0aC0+bWFkeCApCisJCWliX2Rlc3Ryb3lfbWFkeCAoIGliZGV2LCBpYmRldi0+Z3NpLCBwYXRoLT5tYWR4ICk7CisJZnJlZSAoIHBhdGggKTsKK30KKworLyoqIE51bWJlciBvZiBwYXRoIGNhY2hlIGVudHJpZXMKKyAqCisgKiBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgorICovCisjZGVmaW5lIElCX05VTV9DQUNIRURfUEFUSFMgNAorCisvKiogQSBjYWNoZWQgcGF0aCAqLworc3RydWN0IGliX2NhY2hlZF9wYXRoIHsKKwkvKiogUGF0aCAqLworCXN0cnVjdCBpYl9wYXRoICpwYXRoOworfTsKKworLyoqIFBhdGggY2FjaGUgKi8KK3N0YXRpYyBzdHJ1Y3QgaWJfY2FjaGVkX3BhdGggaWJfcGF0aF9jYWNoZVtJQl9OVU1fQ0FDSEVEX1BBVEhTXTsKKworLyoqIE9sZGVzdCBwYXRoIGNhY2hlIGVudHJ5IGluZGV4ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGliX3BhdGhfY2FjaGVfaWR4OworCisvKioKKyAqIEZpbmQgcGF0aCBjYWNoZSBlbnRyeQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgZGdpZAkJRGVzdGluYXRpb24gR0lECisgKiBAcmV0IHBhdGgJCVBhdGggY2FjaGUgZW50cnksIG9yIE5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBpYl9jYWNoZWRfcGF0aCAqCitpYl9maW5kX3BhdGhfY2FjaGVfZW50cnkgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX2dpZCAqZGdpZCApIHsKKwlzdHJ1Y3QgaWJfY2FjaGVkX3BhdGggKmNhY2hlZDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8IElCX05VTV9DQUNIRURfUEFUSFMgOyBpKysgKSB7CisJCWNhY2hlZCA9ICZpYl9wYXRoX2NhY2hlW2ldOworCQlpZiAoICEgY2FjaGVkLT5wYXRoICkKKwkJCWNvbnRpbnVlOworCQlpZiAoIGNhY2hlZC0+cGF0aC0+aWJkZXYgIT0gaWJkZXYgKQorCQkJY29udGludWU7CisJCWlmICggbWVtY21wICggJmNhY2hlZC0+cGF0aC0+YXYuZ2lkLCBkZ2lkLAorCQkJICAgICAgc2l6ZW9mICggY2FjaGVkLT5wYXRoLT5hdi5naWQgKSApICE9IDAgKQorCQkJY29udGludWU7CisJCXJldHVybiBjYWNoZWQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogSGFuZGxlIGNhY2hlZCBwYXRoIHRyYW5zYWN0aW9uIGNvbXBsZXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IHBhdGgJCVBhdGgKKyAqIEB2IHJjCQlTdGF0dXMgY29kZQorICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yLCBvciBOVUxMIG9uIGVycm9yCisgKi8KK3N0YXRpYyB2b2lkIGliX2NhY2hlZF9wYXRoX2NvbXBsZXRlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJICAgICAgc3RydWN0IGliX3BhdGggKnBhdGgsIGludCByYywKKwkJCQkgICAgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2IF9fdW51c2VkICkgeworCXN0cnVjdCBpYl9jYWNoZWRfcGF0aCAqY2FjaGVkID0gaWJfcGF0aF9nZXRfb3duZXJkYXRhICggcGF0aCApOworCisJLyogSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxlZCwgZXJhc2UgdGhlIGNhY2hlIGVudHJ5ICovCisJaWYgKCByYyAhPSAwICkgeworCQkvKiBEZXN0cm95IHRoZSBvbGQgY2FjaGUgZW50cnkgKi8KKwkJaWJfZGVzdHJveV9wYXRoICggaWJkZXYsIHBhdGggKTsKKwkJbWVtc2V0ICggY2FjaGVkLCAwLCBzaXplb2YgKCAqY2FjaGVkICkgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIERvIG5vdCBkZXN0cm95IHRoZSBjb21wbGV0ZWQgdHJhbnNhY3Rpb247IHdlIHN0aWxsIG5lZWQgdG8KKwkgKiByZWZlciB0byB0aGUgcmVzb2x2ZWQgcGF0aC4KKwkgKi8KK30KKworLyoqIENhY2hlZCBwYXRoIHRyYW5zYWN0aW9uIGNvbXBsZXRpb24gb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBpYl9wYXRoX29wZXJhdGlvbnMgaWJfY2FjaGVkX3BhdGhfb3AgPSB7CisJLmNvbXBsZXRlID0gaWJfY2FjaGVkX3BhdGhfY29tcGxldGUsCit9OworCisvKioKKyAqIFJlc29sdmUgcGF0aAorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgYXYJCUFkZHJlc3MgdmVjdG9yIHRvIGNvbXBsZXRlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGlzIHByb3ZpZGVzIGEgbm9uLXRyYW5zYWN0aW9uYWwgd2F5IHRvIHJlc29sdmUgYSBwYXRoLCB2aWEgYQorICogY2FjaGUgc2ltaWxhciB0byBBUlAuCisgKi8KK2ludCBpYl9yZXNvbHZlX3BhdGggKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApIHsKKwlzdHJ1Y3QgaWJfZ2lkICpnaWQgPSAmYXYtPmdpZDsKKwlzdHJ1Y3QgaWJfY2FjaGVkX3BhdGggKmNhY2hlZDsKKwl1bnNpZ25lZCBpbnQgY2FjaGVfaWR4OworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCAhIGF2LT5naWRfcHJlc2VudCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgYXR0ZW1wdCB0byBsb29rIHVwIHBhdGggIgorCQkgICAgICAgIndpdGhvdXQgR0lEXG4iLCBpYmRldiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBMb29rIGluIGNhY2hlIGZvciBhIG1hdGNoaW5nIGVudHJ5ICovCisJY2FjaGVkID0gaWJfZmluZF9wYXRoX2NhY2hlX2VudHJ5ICggaWJkZXYsIGdpZCApOworCWlmICggY2FjaGVkICYmIGNhY2hlZC0+cGF0aC0+YXYubGlkICkgeworCQkvKiBQb3B1bGF0ZWQgZW50cnkgZm91bmQgKi8KKwkJYXYtPmxpZCA9IGNhY2hlZC0+cGF0aC0+YXYubGlkOworCQlhdi0+cmF0ZSA9IGNhY2hlZC0+cGF0aC0+YXYucmF0ZTsKKwkJYXYtPnNsID0gY2FjaGVkLT5wYXRoLT5hdi5zbDsKKwkJREJHQzIgKCBpYmRldiwgIklCREVWICVwIGNhY2hlIGhpdCBmb3IgJTA4eDolMDh4OiUwOHg6JTA4eFxuIiwKKwkJCWliZGV2LCBodG9ubCAoIGdpZC0+dS5kd29yZHNbMF0gKSwKKwkJCWh0b25sICggZ2lkLT51LmR3b3Jkc1sxXSApLCBodG9ubCAoIGdpZC0+dS5kd29yZHNbMl0gKSwKKwkJCWh0b25sICggZ2lkLT51LmR3b3Jkc1szXSApICk7CisJCXJldHVybiAwOworCX0KKwlEQkdDICggaWJkZXYsICJJQkRFViAlcCBjYWNoZSBtaXNzIGZvciAlMDh4OiUwOHg6JTA4eDolMDh4JXNcbiIsCisJICAgICAgIGliZGV2LCBodG9ubCAoIGdpZC0+dS5kd29yZHNbMF0gKSwgaHRvbmwgKCBnaWQtPnUuZHdvcmRzWzFdICksCisJICAgICAgIGh0b25sICggZ2lkLT51LmR3b3Jkc1syXSApLCBodG9ubCAoIGdpZC0+dS5kd29yZHNbM10gKSwKKwkgICAgICAgKCBjYWNoZWQgPyAiIChpbiBwcm9ncmVzcykiIDogIiIgKSApOworCisJLyogSWYgbG9va3VwIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIGRvIG5vdGhpbmcgKi8KKwlpZiAoIGNhY2hlZCApCisJCXJldHVybiAtRU5PRU5UOworCisJLyogTG9jYXRlIGEgbmV3IGNhY2hlIGVudHJ5IHRvIHVzZSAqLworCWNhY2hlX2lkeCA9ICggKGliX3BhdGhfY2FjaGVfaWR4KyspICUgSUJfTlVNX0NBQ0hFRF9QQVRIUyApOworCWNhY2hlZCA9ICZpYl9wYXRoX2NhY2hlW2NhY2hlX2lkeF07CisKKwkvKiBEZXN0cm95IHRoZSBvbGQgY2FjaGUgZW50cnkgKi8KKwlpZiAoIGNhY2hlZC0+cGF0aCApCisJCWliX2Rlc3Ryb3lfcGF0aCAoIGliZGV2LCBjYWNoZWQtPnBhdGggKTsKKwltZW1zZXQgKCBjYWNoZWQsIDAsIHNpemVvZiAoICpjYWNoZWQgKSApOworCisJLyogQ3JlYXRlIG5ldyBwYXRoICovCisJY2FjaGVkLT5wYXRoID0gaWJfY3JlYXRlX3BhdGggKCBpYmRldiwgYXYsICZpYl9jYWNoZWRfcGF0aF9vcCApOworCWlmICggISBjYWNoZWQtPnBhdGggKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIGNvdWxkIG5vdCBjcmVhdGUgcGF0aFxuIiwKKwkJICAgICAgIGliZGV2ICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpYl9wYXRoX3NldF9vd25lcmRhdGEgKCBjYWNoZWQtPnBhdGgsIGNhY2hlZCApOworCisJLyogTm90IGZvdW5kIHlldCAqLworCXJldHVybiAtRU5PRU5UOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfc21hLmMgYi9ncHhlL3NyYy9uZXQvaW5maW5pYmFuZC9pYl9zbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjRjYmJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfc21hLmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL3NldHRpbmdzLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbmZpbmliYW5kLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvaWJfbWkuaD4KKyNpbmNsdWRlIDxncHhlL2liX3NtYS5oPgorCisvKioKKyAqIEBmaWxlCisgKgorICogSW5maW5pYmFuZCBTdWJuZXQgTWFuYWdlbWVudCBBZ2VudAorICoKKyAqLworCisvKioKKyAqIE5vZGUgaW5mb3JtYXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG1pCQlNYW5hZ2VtZW50IGludGVyZmFjZQorICogQHYgbWFkCQlSZWNlaXZlZCBNQUQKKyAqIEB2IGF2CQlTb3VyY2UgYWRkcmVzcyB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgaWJfc21hX25vZGVfaW5mbyAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgIHN0cnVjdCBpYl9tYWRfaW50ZXJmYWNlICptaSwKKwkJCSAgICAgICB1bmlvbiBpYl9tYWQgKm1hZCwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2ICkgeworCXN0cnVjdCBpYl9ub2RlX2luZm8gKm5vZGVfaW5mbyA9ICZtYWQtPnNtcC5zbXBfZGF0YS5ub2RlX2luZm87CisJaW50IHJjOworCisJLyogRmlsbCBpbiBpbmZvcm1hdGlvbiAqLworCW1lbXNldCAoIG5vZGVfaW5mbywgMCwgc2l6ZW9mICggKm5vZGVfaW5mbyApICk7CisJbm9kZV9pbmZvLT5iYXNlX3ZlcnNpb24gPSBJQl9NR01UX0JBU0VfVkVSU0lPTjsKKwlub2RlX2luZm8tPmNsYXNzX3ZlcnNpb24gPSBJQl9TTVBfQ0xBU1NfVkVSU0lPTjsKKwlub2RlX2luZm8tPm5vZGVfdHlwZSA9IElCX05PREVfVFlQRV9IQ0E7CisJbm9kZV9pbmZvLT5udW1fcG9ydHMgPSBpYl9nZXRfaGNhX2luZm8gKCBpYmRldiwgJm5vZGVfaW5mby0+c3lzX2d1aWQgKTsKKwltZW1jcHkgKCAmbm9kZV9pbmZvLT5ub2RlX2d1aWQsICZub2RlX2luZm8tPnN5c19ndWlkLAorCQkgc2l6ZW9mICggbm9kZV9pbmZvLT5ub2RlX2d1aWQgKSApOworCW1lbWNweSAoICZub2RlX2luZm8tPnBvcnRfZ3VpZCwgJmliZGV2LT5naWQudS5oYWxmWzFdLAorCQkgc2l6ZW9mICggbm9kZV9pbmZvLT5wb3J0X2d1aWQgKSApOworCW5vZGVfaW5mby0+cGFydGl0aW9uX2NhcCA9IGh0b25zICggMSApOworCW5vZGVfaW5mby0+bG9jYWxfcG9ydF9udW0gPSBpYmRldi0+cG9ydDsKKworCS8qIFNlbmQgR2V0UmVzcG9uc2UgKi8KKwltYWQtPmhkci5tZXRob2QgPSBJQl9NR01UX01FVEhPRF9HRVRfUkVTUDsKKwlpZiAoICggcmMgPSBpYl9taV9zZW5kICggaWJkZXYsIG1pLCBtYWQsIGF2ICkgKSAhPSAwICkgeworCQlEQkdDICggbWksICJTTUEgJXAgY291bGQgbm90IHNlbmQgTm9kZUluZm8gR2V0UmVzcG9uc2U6ICVzXG4iLAorCQkgICAgICAgbWksIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm47CisJfQorfQorCisvKioKKyAqIE5vZGUgZGVzY3JpcHRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IG1pCQlNYW5hZ2VtZW50IGludGVyZmFjZQorICogQHYgbWFkCQlSZWNlaXZlZCBNQUQKKyAqIEB2IGF2CQlTb3VyY2UgYWRkcmVzcyB2ZWN0b3IKKyAqLworc3RhdGljIHZvaWQgaWJfc21hX25vZGVfZGVzYyAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJICAgICAgIHN0cnVjdCBpYl9tYWRfaW50ZXJmYWNlICptaSwKKwkJCSAgICAgICB1bmlvbiBpYl9tYWQgKm1hZCwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfYWRkcmVzc192ZWN0b3IgKmF2ICkgeworCXN0cnVjdCBpYl9ub2RlX2Rlc2MgKm5vZGVfZGVzYyA9ICZtYWQtPnNtcC5zbXBfZGF0YS5ub2RlX2Rlc2M7CisJc3RydWN0IGliX2dpZF9oYWxmIGd1aWQ7CisJY2hhciBob3N0bmFtZVsgc2l6ZW9mICggbm9kZV9kZXNjLT5ub2RlX3N0cmluZyApIF07CisJaW50IGhvc3RuYW1lX2xlbjsKKwlpbnQgcmM7CisKKwkvKiBGaWxsIGluIGluZm9ybWF0aW9uICovCisJbWVtc2V0ICggbm9kZV9kZXNjLCAwLCBzaXplb2YgKCAqbm9kZV9kZXNjICkgKTsKKwlpYl9nZXRfaGNhX2luZm8gKCBpYmRldiwgJmd1aWQgKTsKKwlob3N0bmFtZV9sZW4gPSBmZXRjaF9zdHJpbmdfc2V0dGluZyAoIE5VTEwsICZob3N0bmFtZV9zZXR0aW5nLAorCQkJCQkgICAgICBob3N0bmFtZSwgc2l6ZW9mICggaG9zdG5hbWUgKSApOworCXNucHJpbnRmICggbm9kZV9kZXNjLT5ub2RlX3N0cmluZywgc2l6ZW9mICggbm9kZV9kZXNjLT5ub2RlX3N0cmluZyApLAorCQkgICAiZ1BYRSAlcyVzJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICglcykiLAorCQkgICBob3N0bmFtZSwgKCAoIGhvc3RuYW1lX2xlbiA+PSAwICkgPyAiICIgOiAiIiApLAorCQkgICBndWlkLnUuYnl0ZXNbMF0sIGd1aWQudS5ieXRlc1sxXSwgZ3VpZC51LmJ5dGVzWzJdLAorCQkgICBndWlkLnUuYnl0ZXNbM10sIGd1aWQudS5ieXRlc1s0XSwgZ3VpZC51LmJ5dGVzWzVdLAorCQkgICBndWlkLnUuYnl0ZXNbNl0sIGd1aWQudS5ieXRlc1s3XSwgaWJkZXYtPmRldi0+bmFtZSApOworCisJLyogU2VuZCBHZXRSZXNwb25zZSAqLworCW1hZC0+aGRyLm1ldGhvZCA9IElCX01HTVRfTUVUSE9EX0dFVF9SRVNQOworCWlmICggKCByYyA9IGliX21pX3NlbmQgKCBpYmRldiwgbWksIG1hZCwgYXYgKSApICE9IDAgKSB7CisJCURCR0MgKCBtaSwgIlNNQSAlcCBjb3VsZCBub3Qgc2VuZCBOb2RlRGVzYyBHZXRSZXNwb25zZTogJXNcbiIsCisJCSAgICAgICBtaSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogR1VJRCBpbmZvcm1hdGlvbgorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgbWkJCU1hbmFnZW1lbnQgaW50ZXJmYWNlCisgKiBAdiBtYWQJCVJlY2VpdmVkIE1BRAorICogQHYgYXYJCVNvdXJjZSBhZGRyZXNzIHZlY3RvcgorICovCitzdGF0aWMgdm9pZCBpYl9zbWFfZ3VpZF9pbmZvICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkgICAgICAgc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pLAorCQkJICAgICAgIHVuaW9uIGliX21hZCAqbWFkLAorCQkJICAgICAgIHN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciAqYXYgKSB7CisJc3RydWN0IGliX2d1aWRfaW5mbyAqZ3VpZF9pbmZvID0gJm1hZC0+c21wLnNtcF9kYXRhLmd1aWRfaW5mbzsKKwlpbnQgcmM7CisKKwkvKiBGaWxsIGluIGluZm9ybWF0aW9uICovCisJbWVtc2V0ICggZ3VpZF9pbmZvLCAwLCBzaXplb2YgKCAqZ3VpZF9pbmZvICkgKTsKKwltZW1jcHkgKCBndWlkX2luZm8tPmd1aWRbMF0sICZpYmRldi0+Z2lkLnUuaGFsZlsxXSwKKwkJIHNpemVvZiAoIGd1aWRfaW5mby0+Z3VpZFswXSApICk7CisKKwkvKiBTZW5kIEdldFJlc3BvbnNlICovCisJbWFkLT5oZHIubWV0aG9kID0gSUJfTUdNVF9NRVRIT0RfR0VUX1JFU1A7CisJaWYgKCAoIHJjID0gaWJfbWlfc2VuZCAoIGliZGV2LCBtaSwgbWFkLCBhdiApICkgIT0gMCApIHsKKwkJREJHQyAoIG1pLCAiU01BICVwIGNvdWxkIG5vdCBzZW5kIEd1aWRJbmZvIEdldFJlc3BvbnNlOiAlc1xuIiwKKwkJICAgICAgIG1pLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoqCisgKiBTZXQgcG9ydCBpbmZvcm1hdGlvbgorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgbWkJCU1hbmFnZW1lbnQgaW50ZXJmYWNlCisgKiBAdiBtYWQJCVJlY2VpdmVkIE1BRAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJfc21hX3NldF9wb3J0X2luZm8gKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkgIHN0cnVjdCBpYl9tYWRfaW50ZXJmYWNlICptaSwKKwkJCQkgIHVuaW9uIGliX21hZCAqbWFkICkgeworCWNvbnN0IHN0cnVjdCBpYl9wb3J0X2luZm8gKnBvcnRfaW5mbyA9ICZtYWQtPnNtcC5zbXBfZGF0YS5wb3J0X2luZm87CisJdW5zaWduZWQgaW50IGxpbmtfd2lkdGhfZW5hYmxlZDsKKwl1bnNpZ25lZCBpbnQgbGlua19zcGVlZF9lbmFibGVkOworCWludCByYzsKKworCS8qIFNldCBwYXJhbWV0ZXJzICovCisJbWVtY3B5ICggJmliZGV2LT5naWQudS5oYWxmWzBdLCBwb3J0X2luZm8tPmdpZF9wcmVmaXgsCisJCSBzaXplb2YgKCBpYmRldi0+Z2lkLnUuaGFsZlswXSApICk7CisJaWJkZXYtPmxpZCA9IG50b2hzICggcG9ydF9pbmZvLT5saWQgKTsKKwlpYmRldi0+c21fbGlkID0gbnRvaHMgKCBwb3J0X2luZm8tPm1hc3RlcnNtX2xpZCApOworCWlmICggKCBsaW5rX3dpZHRoX2VuYWJsZWQgPSBwb3J0X2luZm8tPmxpbmtfd2lkdGhfZW5hYmxlZCApICkKKwkJaWJkZXYtPmxpbmtfd2lkdGhfZW5hYmxlZCA9IGxpbmtfd2lkdGhfZW5hYmxlZDsKKwlpZiAoICggbGlua19zcGVlZF9lbmFibGVkID0KKwkgICAgICAgKCBwb3J0X2luZm8tPmxpbmtfc3BlZWRfYWN0aXZlX19saW5rX3NwZWVkX2VuYWJsZWQgJiAweGYgKSApICkKKwkJaWJkZXYtPmxpbmtfc3BlZWRfZW5hYmxlZCA9IGxpbmtfc3BlZWRfZW5hYmxlZDsKKwlpYmRldi0+c21fc2wgPSAoIHBvcnRfaW5mby0+bmVpZ2hib3VyX210dV9fbWFzdGVyc21fc2wgJiAweGYgKTsKKwlEQkdDICggbWksICJTTUEgJXAgc2V0IExJRCAlMDR4IFNNTElEICUwNHggbGluayB3aWR0aCAlMDJ4IHNwZWVkICIKKwkgICAgICAgIiUwMnhcbiIsIG1pLCBpYmRldi0+bGlkLCBpYmRldi0+c21fbGlkLAorCSAgICAgICBpYmRldi0+bGlua193aWR0aF9lbmFibGVkLCBpYmRldi0+bGlua19zcGVlZF9lbmFibGVkICk7CisKKwkvKiBVcGRhdGUgcGFyYW1ldGVycyBvbiBkZXZpY2UgKi8KKwlpZiAoICggcmMgPSBpYl9zZXRfcG9ydF9pbmZvICggaWJkZXYsIG1hZCApICkgIT0gMCApIHsKKwkJREJHQyAoIG1pLCAiU01BICVwIGNvdWxkIG5vdCBzZXQgcG9ydCBpbmZvcm1hdGlvbjogJXNcbiIsCisJCSAgICAgICBtaSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQb3J0IGluZm9ybWF0aW9uCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtaQkJTWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqIEB2IG1hZAkJUmVjZWl2ZWQgTUFECisgKiBAdiBhdgkJU291cmNlIGFkZHJlc3MgdmVjdG9yCisgKi8KK3N0YXRpYyB2b2lkIGliX3NtYV9wb3J0X2luZm8gKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWksCisJCQkgICAgICAgdW5pb24gaWJfbWFkICptYWQsCisJCQkgICAgICAgc3RydWN0IGliX2FkZHJlc3NfdmVjdG9yICphdiApIHsKKwlzdHJ1Y3QgaWJfcG9ydF9pbmZvICpwb3J0X2luZm8gPSAmbWFkLT5zbXAuc21wX2RhdGEucG9ydF9pbmZvOworCWludCByYzsKKworCS8qIFNldCBwYXJhbWV0ZXJzIGlmIGFwcGxpY2FibGUgKi8KKwlpZiAoIG1hZC0+aGRyLm1ldGhvZCA9PSBJQl9NR01UX01FVEhPRF9TRVQgKSB7CisJCWlmICggKCByYyA9IGliX3NtYV9zZXRfcG9ydF9pbmZvICggaWJkZXYsIG1pLCBtYWQgKSApICE9IDAgKSB7CisJCQltYWQtPmhkci5zdGF0dXMgPQorCQkJICAgICAgaHRvbnMgKCBJQl9NR01UX1NUQVRVU19VTlNVUFBPUlRFRF9NRVRIT0RfQVRUUiApOworCQkJLyogRmFsbCB0aHJvdWdoIHRvIGdlbmVyYXRlIEdldFJlc3BvbnNlICovCisJCX0KKwl9CisKKwkvKiBGaWxsIGluIGluZm9ybWF0aW9uICovCisJbWVtc2V0ICggcG9ydF9pbmZvLCAwLCBzaXplb2YgKCAqcG9ydF9pbmZvICkgKTsKKwltZW1jcHkgKCBwb3J0X2luZm8tPmdpZF9wcmVmaXgsICZpYmRldi0+Z2lkLnUuaGFsZlswXSwKKwkJIHNpemVvZiAoIHBvcnRfaW5mby0+Z2lkX3ByZWZpeCApICk7CisJcG9ydF9pbmZvLT5saWQgPSBudG9ocyAoIGliZGV2LT5saWQgKTsKKwlwb3J0X2luZm8tPm1hc3RlcnNtX2xpZCA9IG50b2hzICggaWJkZXYtPnNtX2xpZCApOworCXBvcnRfaW5mby0+bG9jYWxfcG9ydF9udW0gPSBpYmRldi0+cG9ydDsKKwlwb3J0X2luZm8tPmxpbmtfd2lkdGhfZW5hYmxlZCA9IGliZGV2LT5saW5rX3dpZHRoX2VuYWJsZWQ7CisJcG9ydF9pbmZvLT5saW5rX3dpZHRoX3N1cHBvcnRlZCA9IGliZGV2LT5saW5rX3dpZHRoX3N1cHBvcnRlZDsKKwlwb3J0X2luZm8tPmxpbmtfd2lkdGhfYWN0aXZlID0gaWJkZXYtPmxpbmtfd2lkdGhfYWN0aXZlOworCXBvcnRfaW5mby0+bGlua19zcGVlZF9zdXBwb3J0ZWRfX3BvcnRfc3RhdGUgPQorCQkoICggaWJkZXYtPmxpbmtfc3BlZWRfc3VwcG9ydGVkIDw8IDQgKSB8IGliZGV2LT5wb3J0X3N0YXRlICk7CisJcG9ydF9pbmZvLT5wb3J0X3BoeXNfc3RhdGVfX2xpbmtfZG93bl9kZWZfc3RhdGUgPQorCQkoICggSUJfUE9SVF9QSFlTX1NUQVRFX1BPTExJTkcgPDwgNCApIHwKKwkJICBJQl9QT1JUX1BIWVNfU1RBVEVfUE9MTElORyApOworCXBvcnRfaW5mby0+bGlua19zcGVlZF9hY3RpdmVfX2xpbmtfc3BlZWRfZW5hYmxlZCA9CisJCSggKCBpYmRldi0+bGlua19zcGVlZF9hY3RpdmUgPDwgNCApIHwKKwkJICBpYmRldi0+bGlua19zcGVlZF9lbmFibGVkICk7CisJcG9ydF9pbmZvLT5uZWlnaGJvdXJfbXR1X19tYXN0ZXJzbV9zbCA9CisJCSggKCBJQl9NVFVfMjA0OCA8PCA0ICkgfCBpYmRldi0+c21fc2wgKTsKKwlwb3J0X2luZm8tPnZsX2NhcF9faW5pdF90eXBlID0gKCBJQl9WTF8wIDw8IDQgKTsKKwlwb3J0X2luZm8tPmluaXRfdHlwZV9yZXBseV9fbXR1X2NhcCA9IElCX01UVV8yMDQ4OworCXBvcnRfaW5mby0+b3BlcmF0aW9uYWxfdmxzX19lbmZvcmNlbWVudCA9ICggSUJfVkxfMCA8PCA0ICk7CisJcG9ydF9pbmZvLT5ndWlkX2NhcCA9IDE7CisKKwkvKiBTZW5kIEdldFJlc3BvbnNlICovCisJbWFkLT5oZHIubWV0aG9kID0gSUJfTUdNVF9NRVRIT0RfR0VUX1JFU1A7CisJaWYgKCAoIHJjID0gaWJfbWlfc2VuZCAoIGliZGV2LCBtaSwgbWFkLCBhdiApICkgIT0gMCApIHsKKwkJREJHQyAoIG1pLCAiU01BICVwIGNvdWxkIG5vdCBzZW5kIFBvcnRJbmZvIEdldFJlc3BvbnNlOiAlc1xuIiwKKwkJICAgICAgIG1pLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoqCisgKiBTZXQgcGFydGl0aW9uIGtleSB0YWJsZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgbWkJCU1hbmFnZW1lbnQgaW50ZXJmYWNlCisgKiBAdiBtYWQJCVJlY2VpdmVkIE1BRAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJfc21hX3NldF9wa2V5X3RhYmxlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJICAgc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pLAorCQkJCSAgIHVuaW9uIGliX21hZCAqbWFkICkgeworCXN0cnVjdCBpYl9wa2V5X3RhYmxlICpwa2V5X3RhYmxlID0gJm1hZC0+c21wLnNtcF9kYXRhLnBrZXlfdGFibGU7CisJaW50IHJjOworCisJLyogU2V0IHBhcmFtZXRlcnMgKi8KKwlpYmRldi0+cGtleSA9IG50b2hzICggcGtleV90YWJsZS0+cGtleVswXSApOworCURCR0MgKCBtaSwgIlNNQSAlcCBzZXQgcGtleSAlMDR4XG4iLCBtaSwgaWJkZXYtPnBrZXkgKTsKKworCS8qIFVwZGF0ZSBwYXJhbWV0ZXJzIG9uIGRldmljZSAqLworCWlmICggKCByYyA9IGliX3NldF9wa2V5X3RhYmxlICggaWJkZXYsIG1hZCApICkgIT0gMCApIHsKKwkJREJHQyAoIG1pLCAiU01BICVwIGNvdWxkIG5vdCBzZXQgcGtleSB0YWJsZTogJXNcbiIsCisJCSAgICAgICBtaSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQYXJ0aXRpb24ga2V5IHRhYmxlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtaQkJTWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqIEB2IG1hZAkJUmVjZWl2ZWQgTUFECisgKiBAdiBhdgkJU291cmNlIGFkZHJlc3MgdmVjdG9yCisgKi8KK3N0YXRpYyB2b2lkIGliX3NtYV9wa2V5X3RhYmxlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pLAorCQkJCXVuaW9uIGliX21hZCAqbWFkLAorCQkJCXN0cnVjdCBpYl9hZGRyZXNzX3ZlY3RvciAqYXYgKSB7CisJc3RydWN0IGliX3BrZXlfdGFibGUgKnBrZXlfdGFibGUgPSAmbWFkLT5zbXAuc21wX2RhdGEucGtleV90YWJsZTsKKwlpbnQgcmM7CisKKwkvKiBTZXQgcGFyYW1ldGVycywgaWYgYXBwbGljYWJsZSAqLworCWlmICggbWFkLT5oZHIubWV0aG9kID09IElCX01HTVRfTUVUSE9EX1NFVCApIHsKKwkJaWYgKCAoIHJjID0gaWJfc21hX3NldF9wa2V5X3RhYmxlICggaWJkZXYsIG1pLCBtYWQgKSApICE9IDAgKSB7CisJCQltYWQtPmhkci5zdGF0dXMgPQorCQkJICAgICAgaHRvbnMgKCBJQl9NR01UX1NUQVRVU19VTlNVUFBPUlRFRF9NRVRIT0RfQVRUUiApOworCQkJLyogRmFsbCB0aHJvdWdoIHRvIGdlbmVyYXRlIEdldFJlc3BvbnNlICovCisJCX0KKwl9CisKKwkvKiBGaWxsIGluIGluZm9ybWF0aW9uICovCisJbWFkLT5oZHIubWV0aG9kID0gSUJfTUdNVF9NRVRIT0RfR0VUX1JFU1A7CisJbWVtc2V0ICggcGtleV90YWJsZSwgMCwgc2l6ZW9mICggKnBrZXlfdGFibGUgKSApOworCXBrZXlfdGFibGUtPnBrZXlbMF0gPSBodG9ucyAoIGliZGV2LT5wa2V5ICk7CisKKwkvKiBTZW5kIEdldFJlc3BvbnNlICovCisJbWFkLT5oZHIubWV0aG9kID0gSUJfTUdNVF9NRVRIT0RfR0VUX1JFU1A7CisJaWYgKCAoIHJjID0gaWJfbWlfc2VuZCAoIGliZGV2LCBtaSwgbWFkLCBhdiApICkgIT0gMCApIHsKKwkJREJHQyAoIG1pLCAiU01BICVwIGNvdWxkIG5vdCBzZW5kIFBLZXlUYWJsZSBHZXRSZXNwb25zZTogJXNcbiIsCisJCSAgICAgICBtaSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qKiBTdWJuZXQgbWFuYWdlbWVudCBhZ2VudCAqLworc3RydWN0IGliX21hZF9hZ2VudCBpYl9zbWFfYWdlbnRbXSBfX2liX21hZF9hZ2VudCA9IHsKKwl7CisJCS5tZ210X2NsYXNzID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQsCisJCS5jbGFzc192ZXJzaW9uID0gSUJfU01QX0NMQVNTX1ZFUlNJT04sCisJCS5hdHRyX2lkID0gaHRvbnMgKCBJQl9TTVBfQVRUUl9OT0RFX0lORk8gKSwKKwkJLmhhbmRsZSA9IGliX3NtYV9ub2RlX2luZm8sCisJfSwKKwl7CisJCS5tZ210X2NsYXNzID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQsCisJCS5jbGFzc192ZXJzaW9uID0gSUJfU01QX0NMQVNTX1ZFUlNJT04sCisJCS5hdHRyX2lkID0gaHRvbnMgKCBJQl9TTVBfQVRUUl9OT0RFX0RFU0MgKSwKKwkJLmhhbmRsZSA9IGliX3NtYV9ub2RlX2Rlc2MsCisJfSwKKwl7CisJCS5tZ210X2NsYXNzID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQsCisJCS5jbGFzc192ZXJzaW9uID0gSUJfU01QX0NMQVNTX1ZFUlNJT04sCisJCS5hdHRyX2lkID0gaHRvbnMgKCBJQl9TTVBfQVRUUl9HVUlEX0lORk8gKSwKKwkJLmhhbmRsZSA9IGliX3NtYV9ndWlkX2luZm8sCisJfSwKKwl7CisJCS5tZ210X2NsYXNzID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQsCisJCS5jbGFzc192ZXJzaW9uID0gSUJfU01QX0NMQVNTX1ZFUlNJT04sCisJCS5hdHRyX2lkID0gaHRvbnMgKCBJQl9TTVBfQVRUUl9QT1JUX0lORk8gKSwKKwkJLmhhbmRsZSA9IGliX3NtYV9wb3J0X2luZm8sCisJfSwKKwl7CisJCS5tZ210X2NsYXNzID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQsCisJCS5jbGFzc192ZXJzaW9uID0gSUJfU01QX0NMQVNTX1ZFUlNJT04sCisJCS5hdHRyX2lkID0gaHRvbnMgKCBJQl9TTVBfQVRUUl9QS0VZX1RBQkxFICksCisJCS5oYW5kbGUgPSBpYl9zbWFfcGtleV90YWJsZSwKKwl9LAorfTsKKworLyoqCisgKiBDcmVhdGUgc3VibmV0IG1hbmFnZW1lbnQgYWdlbnQgYW5kIGludGVyZmFjZQorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgbWkJCU1hbmFnZW1lbnQgaW50ZXJmYWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IGliX2NyZWF0ZV9zbWEgKCBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX21hZF9pbnRlcmZhY2UgKm1pICkgeworCisJLyogTm90aGluZyB0byBkbyAqLworCURCR0MgKCBpYmRldiwgIklCREVWICVwIFNNQSB1c2luZyBTTUkgJXBcbiIsIGliZGV2LCBtaSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVzdHJveSBzdWJuZXQgbWFuYWdlbWVudCBhZ2VudCBhbmQgaW50ZXJmYWNlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBtaQkJTWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqLwordm9pZCBpYl9kZXN0cm95X3NtYSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2IF9fdW51c2VkLAorCQkgICAgICBzdHJ1Y3QgaWJfbWFkX2ludGVyZmFjZSAqbWkgX191bnVzZWQgKSB7CisJLyogTm90aGluZyB0byBkbyAqLworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfc21jLmMgYi9ncHhlL3NyYy9uZXQvaW5maW5pYmFuZC9pYl9zbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzA4ZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L2luZmluaWJhbmQvaWJfc21jLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9pbmZpbmliYW5kLmg+CisjaW5jbHVkZSA8Z3B4ZS9pYl9zbWMuaD4KKworLyoqCisgKiBAZmlsZQorICoKKyAqIEluZmluaWJhbmQgU3VibmV0IE1hbmFnZW1lbnQgQ2xpZW50CisgKgorICovCisKKy8qKgorICogR2V0IHBvcnQgaW5mb3JtYXRpb24KKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IGxvY2FsX21hZAkJTWV0aG9kIGZvciBpc3N1aW5nIGxvY2FsIE1BRHMKKyAqIEB2IG1hZAkJTWFuYWdlbWVudCBkYXRhZ3JhbSB0byBmaWxsIGluCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpYl9zbWNfZ2V0X3BvcnRfaW5mbyAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCSAgaWJfbG9jYWxfbWFkX3QgbG9jYWxfbWFkLAorCQkJCSAgdW5pb24gaWJfbWFkICptYWQgKSB7CisJaW50IHJjOworCisJLyogQ29uc3RydWN0IE1BRCAqLworCW1lbXNldCAoIG1hZCwgMCwgc2l6ZW9mICggKm1hZCApICk7CisJbWFkLT5oZHIuYmFzZV92ZXJzaW9uID0gSUJfTUdNVF9CQVNFX1ZFUlNJT047CisJbWFkLT5oZHIubWdtdF9jbGFzcyA9IElCX01HTVRfQ0xBU1NfU1VCTl9MSURfUk9VVEVEOworCW1hZC0+aGRyLmNsYXNzX3ZlcnNpb24gPSAxOworCW1hZC0+aGRyLm1ldGhvZCA9IElCX01HTVRfTUVUSE9EX0dFVDsKKwltYWQtPmhkci5hdHRyX2lkID0gaHRvbnMgKCBJQl9TTVBfQVRUUl9QT1JUX0lORk8gKTsKKwltYWQtPmhkci5hdHRyX21vZCA9IGh0b25sICggaWJkZXYtPnBvcnQgKTsKKworCWlmICggKCByYyA9IGxvY2FsX21hZCAoIGliZGV2LCBtYWQgKSApICE9IDAgKSB7CisJCURCR0MgKCBpYmRldiwgIklCREVWICVwIGNvdWxkIG5vdCBnZXQgcG9ydCBpbmZvOiAlc1xuIiwKKwkJICAgICAgIGliZGV2LCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBHZXQgR1VJRCBpbmZvcm1hdGlvbgorICoKKyAqIEB2IGliZGV2CQlJbmZpbmliYW5kIGRldmljZQorICogQHYgbG9jYWxfbWFkCQlNZXRob2QgZm9yIGlzc3VpbmcgbG9jYWwgTUFEcworICogQHYgbWFkCQlNYW5hZ2VtZW50IGRhdGFncmFtIHRvIGZpbGwgaW4KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX3NtY19nZXRfZ3VpZF9pbmZvICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJICBpYl9sb2NhbF9tYWRfdCBsb2NhbF9tYWQsCisJCQkJICB1bmlvbiBpYl9tYWQgKm1hZCApIHsKKwlpbnQgcmM7CisKKwkvKiBDb25zdHJ1Y3QgTUFEICovCisJbWVtc2V0ICggbWFkLCAwLCBzaXplb2YgKCAqbWFkICkgKTsKKwltYWQtPmhkci5iYXNlX3ZlcnNpb24gPSBJQl9NR01UX0JBU0VfVkVSU0lPTjsKKwltYWQtPmhkci5tZ210X2NsYXNzID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQ7CisJbWFkLT5oZHIuY2xhc3NfdmVyc2lvbiA9IDE7CisJbWFkLT5oZHIubWV0aG9kID0gSUJfTUdNVF9NRVRIT0RfR0VUOworCW1hZC0+aGRyLmF0dHJfaWQgPSBodG9ucyAoIElCX1NNUF9BVFRSX0dVSURfSU5GTyApOworCisJaWYgKCAoIHJjID0gbG9jYWxfbWFkICggaWJkZXYsIG1hZCApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgY291bGQgbm90IGdldCBHVUlEIGluZm86ICVzXG4iLAorCQkgICAgICAgaWJkZXYsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCBwYXJ0aXRpb24ga2V5IHRhYmxlCisgKgorICogQHYgaWJkZXYJCUluZmluaWJhbmQgZGV2aWNlCisgKiBAdiBsb2NhbF9tYWQJCU1ldGhvZCBmb3IgaXNzdWluZyBsb2NhbCBNQURzCisgKiBAdiBtYWQJCU1hbmFnZW1lbnQgZGF0YWdyYW0gdG8gZmlsbCBpbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJfc21jX2dldF9wa2V5X3RhYmxlICggc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJICAgaWJfbG9jYWxfbWFkX3QgbG9jYWxfbWFkLAorCQkJCSAgIHVuaW9uIGliX21hZCAqbWFkICkgeworCWludCByYzsKKworCS8qIENvbnN0cnVjdCBNQUQgKi8KKwltZW1zZXQgKCBtYWQsIDAsIHNpemVvZiAoICptYWQgKSApOworCW1hZC0+aGRyLmJhc2VfdmVyc2lvbiA9IElCX01HTVRfQkFTRV9WRVJTSU9OOworCW1hZC0+aGRyLm1nbXRfY2xhc3MgPSBJQl9NR01UX0NMQVNTX1NVQk5fTElEX1JPVVRFRDsKKwltYWQtPmhkci5jbGFzc192ZXJzaW9uID0gMTsKKwltYWQtPmhkci5tZXRob2QgPSBJQl9NR01UX01FVEhPRF9HRVQ7CisJbWFkLT5oZHIuYXR0cl9pZCA9IGh0b25zICggSUJfU01QX0FUVFJfUEtFWV9UQUJMRSApOworCisJaWYgKCAoIHJjID0gbG9jYWxfbWFkICggaWJkZXYsIG1hZCApICkgIT0gMCApIHsKKwkJREJHQyAoIGliZGV2LCAiSUJERVYgJXAgY291bGQgbm90IGdldCBwa2V5IHRhYmxlOiAlc1xuIiwKKwkJICAgICAgIGliZGV2LCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBHZXQgTUFEIHBhcmFtZXRlcnMKKyAqCisgKiBAdiBpYmRldgkJSW5maW5pYmFuZCBkZXZpY2UKKyAqIEB2IGxvY2FsX21hZAkJTWV0aG9kIGZvciBpc3N1aW5nIGxvY2FsIE1BRHMKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgaWJfc21jX3VwZGF0ZSAoIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBpYl9sb2NhbF9tYWRfdCBsb2NhbF9tYWQgKSB7CisJdW5pb24gaWJfbWFkIG1hZDsKKwlzdHJ1Y3QgaWJfcG9ydF9pbmZvICpwb3J0X2luZm8gPSAmbWFkLnNtcC5zbXBfZGF0YS5wb3J0X2luZm87CisJc3RydWN0IGliX2d1aWRfaW5mbyAqZ3VpZF9pbmZvID0gJm1hZC5zbXAuc21wX2RhdGEuZ3VpZF9pbmZvOworCXN0cnVjdCBpYl9wa2V5X3RhYmxlICpwa2V5X3RhYmxlID0gJm1hZC5zbXAuc21wX2RhdGEucGtleV90YWJsZTsKKwlpbnQgcmM7CisKKwkvKiBQb3J0IGluZm8gZ2l2ZXMgdXMgdGhlIGxpbmsgc3RhdGUsIHRoZSBmaXJzdCBoYWxmIG9mIHRoZQorCSAqIHBvcnQgR0lEIGFuZCB0aGUgU00gTElELgorCSAqLworCWlmICggKCByYyA9IGliX3NtY19nZXRfcG9ydF9pbmZvICggaWJkZXYsIGxvY2FsX21hZCwgJm1hZCApICkgIT0gMCApCisJCXJldHVybiByYzsKKwltZW1jcHkgKCAmaWJkZXYtPmdpZC51LmhhbGZbMF0sIHBvcnRfaW5mby0+Z2lkX3ByZWZpeCwKKwkJIHNpemVvZiAoIGliZGV2LT5naWQudS5oYWxmWzBdICkgKTsKKwlpYmRldi0+bGlkID0gbnRvaHMgKCBwb3J0X2luZm8tPmxpZCApOworCWliZGV2LT5zbV9saWQgPSBudG9ocyAoIHBvcnRfaW5mby0+bWFzdGVyc21fbGlkICk7CisJaWJkZXYtPmxpbmtfd2lkdGhfZW5hYmxlZCA9IHBvcnRfaW5mby0+bGlua193aWR0aF9lbmFibGVkOworCWliZGV2LT5saW5rX3dpZHRoX3N1cHBvcnRlZCA9IHBvcnRfaW5mby0+bGlua193aWR0aF9zdXBwb3J0ZWQ7CisJaWJkZXYtPmxpbmtfd2lkdGhfYWN0aXZlID0gcG9ydF9pbmZvLT5saW5rX3dpZHRoX2FjdGl2ZTsKKwlpYmRldi0+bGlua19zcGVlZF9zdXBwb3J0ZWQgPQorCQkoIHBvcnRfaW5mby0+bGlua19zcGVlZF9zdXBwb3J0ZWRfX3BvcnRfc3RhdGUgPj4gNCApOworCWliZGV2LT5wb3J0X3N0YXRlID0KKwkJKCBwb3J0X2luZm8tPmxpbmtfc3BlZWRfc3VwcG9ydGVkX19wb3J0X3N0YXRlICYgMHhmICk7CisJaWJkZXYtPmxpbmtfc3BlZWRfYWN0aXZlID0KKwkJKCBwb3J0X2luZm8tPmxpbmtfc3BlZWRfYWN0aXZlX19saW5rX3NwZWVkX2VuYWJsZWQgPj4gNCApOworCWliZGV2LT5saW5rX3NwZWVkX2VuYWJsZWQgPQorCQkoIHBvcnRfaW5mby0+bGlua19zcGVlZF9hY3RpdmVfX2xpbmtfc3BlZWRfZW5hYmxlZCAmIDB4ZiApOworCWliZGV2LT5zbV9zbCA9ICggcG9ydF9pbmZvLT5uZWlnaGJvdXJfbXR1X19tYXN0ZXJzbV9zbCAmIDB4ZiApOworCisJLyogR1VJRCBpbmZvIGdpdmVzIHVzIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgcG9ydCBHSUQgKi8KKwlpZiAoICggcmMgPSBpYl9zbWNfZ2V0X2d1aWRfaW5mbyAoIGliZGV2LCBsb2NhbF9tYWQsICZtYWQgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJbWVtY3B5ICggJmliZGV2LT5naWQudS5oYWxmWzFdLCBndWlkX2luZm8tPmd1aWRbMF0sCisJCSBzaXplb2YgKCBpYmRldi0+Z2lkLnUuaGFsZlsxXSApICk7CisKKwkvKiBHZXQgcGFydGl0aW9uIGtleSAqLworCWlmICggKCByYyA9IGliX3NtY19nZXRfcGtleV90YWJsZSAoIGliZGV2LCBsb2NhbF9tYWQsICZtYWQgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJaWJkZXYtPnBrZXkgPSBudG9ocyAoIHBrZXlfdGFibGUtPnBrZXlbMF0gKTsKKworCURCR0MgKCBpYmRldiwgIklCREVWICVwIHBvcnQgR0lEIGlzICUwOHg6JTA4eDolMDh4OiUwOHhcbiIsIGliZGV2LAorCSAgICAgICBodG9ubCAoIGliZGV2LT5naWQudS5kd29yZHNbMF0gKSwKKwkgICAgICAgaHRvbmwgKCBpYmRldi0+Z2lkLnUuZHdvcmRzWzFdICksCisJICAgICAgIGh0b25sICggaWJkZXYtPmdpZC51LmR3b3Jkc1syXSApLAorCSAgICAgICBodG9ubCAoIGliZGV2LT5naWQudS5kd29yZHNbM10gKSApOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvaW5maW5pYmFuZC9pYl9zcnAuYyBiL2dweGUvc3JjL25ldC9pbmZpbmliYW5kL2liX3NycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTZkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvaW5maW5pYmFuZC9pYl9zcnAuYwpAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGZW4gU3lzdGVtcyBMdGQgPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEJTRDIgKTsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9zcnAuaD4KKyNpbmNsdWRlIDxncHhlL2luZmluaWJhbmQuaD4KKyNpbmNsdWRlIDxncHhlL2liX2NtcmMuaD4KKyNpbmNsdWRlIDxncHhlL2liX3NycC5oPgorCisvKioKKyAqIEBmaWxlCisgKgorICogU0NTSSBSRE1BIFByb3RvY29sIG92ZXIgSW5maW5pYmFuZAorICoKKyAqLworCisvKiBEaXNhbWJpZ3VhdGUgdGhlIHZhcmlvdXMgcG9zc2libGUgRUlOVkFMcyAqLworI2RlZmluZSBFSU5WQUxfQllURV9TVFJJTkdfTEVOICggRUlOVkFMIHwgRVVOSVFfMDEgKQorI2RlZmluZSBFSU5WQUxfQllURV9TVFJJTkcgKCBFSU5WQUwgfCBFVU5JUV8wMiApCisjZGVmaW5lIEVJTlZBTF9JTlRFR0VSICggRUlOVkFMIHwgRVVOSVFfMDMgKQorI2RlZmluZSBFSU5WQUxfUlBfVE9PX1NIT1JUICggRUlOVkFMIHwgRVVOSVFfMDQgKQorCisvKiogSUIgU1JQIHBhcnNlIGZsYWdzICovCitlbnVtIGliX3NycF9wYXJzZV9mbGFncyB7CisJSUJfU1JQX1BBUlNFX1JFUVVJUkVEID0gMHgwMDAwLAorCUlCX1NSUF9QQVJTRV9PUFRJT05BTCA9IDB4ODAwMCwKKwlJQl9TUlBfUEFSU0VfRkxBR19NQVNLID0gMHhmMDAwLAorfTsKKworLyoqIElCIFNSUCByb290IHBhdGggcGFyYW1ldGVycyAqLworc3RydWN0IGliX3NycF9yb290X3BhdGggeworCS8qKiBTQ1NJIExVTiAqLworCXN0cnVjdCBzY3NpX2x1biAqbHVuOworCS8qKiBTUlAgcG9ydCBJRHMgKi8KKwlzdHJ1Y3Qgc3JwX3BvcnRfaWRzICpwb3J0X2lkczsKKwkvKiogSUIgU1JQIHBhcmFtZXRlcnMgKi8KKwlzdHJ1Y3QgaWJfc3JwX3BhcmFtZXRlcnMgKmliOworfTsKKworLyoqCisgKiBQYXJzZSBJQiBTUlAgcm9vdCBwYXRoIGJ5dGUtc3RyaW5nIHZhbHVlCisgKgorICogQHYgcnBfY29tcAkJUm9vdCBwYXRoIGNvbXBvbmVudCBzdHJpbmcKKyAqIEB2IGRlZmF1bHRfdmFsdWUJRGVmYXVsdCB2YWx1ZSB0byB1c2UgaWYgY29tcG9uZW50IHN0cmluZyBpcyBlbXB0eQorICogQHJldCB2YWx1ZQkJVmFsdWUKKyAqLworc3RhdGljIGludCBpYl9zcnBfcGFyc2VfYnl0ZV9zdHJpbmcgKCBjb25zdCBjaGFyICpycF9jb21wLCB1aW50OF90ICpieXRlcywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZV9mbGFncyApIHsKKwlzaXplX3Qgc2l6ZSA9ICggc2l6ZV9mbGFncyAmIH5JQl9TUlBfUEFSU0VfRkxBR19NQVNLICk7CisJc2l6ZV90IHJwX2NvbXBfbGVuID0gc3RybGVuICggcnBfY29tcCApOworCWNoYXIgYnVmWzNdOworCWNoYXIgKmJ1Zl9lbmQ7CisKKwkvKiBBbGxvdyBvcHRpb25hbCBjb21wb25lbnRzIHRvIGJlIGVtcHR5ICovCisJaWYgKCAoIHJwX2NvbXBfbGVuID09IDAgKSAmJgorCSAgICAgKCBzaXplX2ZsYWdzICYgSUJfU1JQX1BBUlNFX09QVElPTkFMICkgKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIHN0cmluZyBsZW5ndGggKi8KKwlpZiAoIHJwX2NvbXBfbGVuICE9ICggMiAqIHNpemUgKSApCisJCXJldHVybiAtRUlOVkFMX0JZVEVfU1RSSU5HX0xFTjsKKworCS8qIFBhcnNlIGJ5dGUgc3RyaW5nICovCisJZm9yICggOyBzaXplIDsgc2l6ZS0tLCBycF9jb21wICs9IDIsIGJ5dGVzKysgKSB7CisJCW1lbWNweSAoIGJ1ZiwgcnBfY29tcCwgMiApOworCQlidWZbMl0gPSAnXDAnOworCQkqYnl0ZXMgPSBzdHJ0b3VsICggYnVmLCAmYnVmX2VuZCwgMTYgKTsKKwkJaWYgKCBidWZfZW5kICE9ICZidWZbMl0gKQorCQkJcmV0dXJuIC1FSU5WQUxfQllURV9TVFJJTkc7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIElCIFNSUCByb290IHBhdGggaW50ZWdlciB2YWx1ZQorICoKKyAqIEB2IHJwX2NvbXAJCVJvb3QgcGF0aCBjb21wb25lbnQgc3RyaW5nCisgKiBAdiBkZWZhdWx0X3ZhbHVlCURlZmF1bHQgdmFsdWUgdG8gdXNlIGlmIGNvbXBvbmVudCBzdHJpbmcgaXMgZW1wdHkKKyAqIEByZXQgdmFsdWUJCVZhbHVlCisgKi8KK3N0YXRpYyBpbnQgaWJfc3JwX3BhcnNlX2ludGVnZXIgKCBjb25zdCBjaGFyICpycF9jb21wLCBpbnQgZGVmYXVsdF92YWx1ZSApIHsKKwlpbnQgdmFsdWU7CisJY2hhciAqZW5kOworCisJdmFsdWUgPSBzdHJ0b3VsICggcnBfY29tcCwgJmVuZCwgMTYgKTsKKwlpZiAoICplbmQgKQorCQlyZXR1cm4gLUVJTlZBTF9JTlRFR0VSOworCisJaWYgKCBlbmQgPT0gcnBfY29tcCApCisJCXJldHVybiBkZWZhdWx0X3ZhbHVlOworCisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFBhcnNlIElCIFNSUCByb290IHBhdGggbGl0ZXJhbCBjb21wb25lbnQKKyAqCisgKiBAdiBycF9jb21wCQlSb290IHBhdGggY29tcG9uZW50IHN0cmluZworICogQHYgcnAJCUlCIFNSUCByb290IHBhdGgKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX3NycF9wYXJzZV9saXRlcmFsICggY29uc3QgY2hhciAqcnBfY29tcCBfX3VudXNlZCwKKwkJCQkgIHN0cnVjdCBpYl9zcnBfcm9vdF9wYXRoICpycCBfX3VudXNlZCApIHsKKwkvKiBJZ25vcmUgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQYXJzZSBJQiBTUlAgcm9vdCBwYXRoIHNvdXJjZSBHSUQKKyAqCisgKiBAdiBycF9jb21wCQlSb290IHBhdGggY29tcG9uZW50IHN0cmluZworICogQHYgcnAJCUlCIFNSUCByb290IHBhdGgKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX3NycF9wYXJzZV9zZ2lkICggY29uc3QgY2hhciAqcnBfY29tcCwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfc3JwX3Jvb3RfcGF0aCAqcnAgKSB7CisJc3RydWN0IGliX2RldmljZSAqaWJkZXY7CisKKwkvKiBEZWZhdWx0IHRvIHRoZSBHSUQgb2YgdGhlIGxhc3Qgb3BlbmVkIEluZmluaWJhbmQgZGV2aWNlICovCisJaWYgKCAoIGliZGV2ID0gbGFzdF9vcGVuZWRfaWJkZXYoKSApICE9IE5VTEwgKQorCQltZW1jcHkgKCAmcnAtPmliLT5zZ2lkLCAmaWJkZXYtPmdpZCwgc2l6ZW9mICggcnAtPmliLT5zZ2lkICkgKTsKKworCXJldHVybiBpYl9zcnBfcGFyc2VfYnl0ZV9zdHJpbmcgKCBycF9jb21wLCBycC0+aWItPnNnaWQudS5ieXRlcywKKwkJCQkJICAoIHNpemVvZiAoIHJwLT5pYi0+c2dpZCApIHwKKwkJCQkJICAgIElCX1NSUF9QQVJTRV9PUFRJT05BTCApICk7Cit9CisKKy8qKgorICogUGFyc2UgSUIgU1JQIHJvb3QgcGF0aCBpbml0aWF0b3IgaWRlbnRpZmllciBleHRlbnNpb24KKyAqCisgKiBAdiBycF9jb21wCQlSb290IHBhdGggY29tcG9uZW50IHN0cmluZworICogQHYgcnAJCUlCIFNSUCByb290IHBhdGgKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX3NycF9wYXJzZV9pbml0aWF0b3JfaWRfZXh0ICggY29uc3QgY2hhciAqcnBfY29tcCwKKwkJCQkJICAgc3RydWN0IGliX3NycF9yb290X3BhdGggKnJwICkgeworCXN0cnVjdCBpYl9zcnBfaW5pdGlhdG9yX3BvcnRfaWQgKnBvcnRfaWQgPQorCQlpYl9zcnBfaW5pdGlhdG9yX3BvcnRfaWQgKCBycC0+cG9ydF9pZHMgKTsKKworCXJldHVybiBpYl9zcnBfcGFyc2VfYnl0ZV9zdHJpbmcgKCBycF9jb21wLCBwb3J0X2lkLT5pZF9leHQudS5ieXRlcywKKwkJCQkJICAoIHNpemVvZiAoIHBvcnRfaWQtPmlkX2V4dCApIHwKKwkJCQkJICAgIElCX1NSUF9QQVJTRV9PUFRJT05BTCApICk7Cit9CisKKy8qKgorICogUGFyc2UgSUIgU1JQIHJvb3QgcGF0aCBpbml0aWF0b3IgSENBIEdVSUQKKyAqCisgKiBAdiBycF9jb21wCQlSb290IHBhdGggY29tcG9uZW50IHN0cmluZworICogQHYgcnAJCUlCIFNSUCByb290IHBhdGgKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX3NycF9wYXJzZV9pbml0aWF0b3JfaGNhX2d1aWQgKCBjb25zdCBjaGFyICpycF9jb21wLAorCQkJCQkgICAgIHN0cnVjdCBpYl9zcnBfcm9vdF9wYXRoICpycCApIHsKKwlzdHJ1Y3QgaWJfc3JwX2luaXRpYXRvcl9wb3J0X2lkICpwb3J0X2lkID0KKwkJaWJfc3JwX2luaXRpYXRvcl9wb3J0X2lkICggcnAtPnBvcnRfaWRzICk7CisKKwkvKiBEZWZhdWx0IHRvIHRoZSBHVUlEIHBvcnRpb24gb2YgdGhlIHNvdXJjZSBHSUQgKi8KKwltZW1jcHkgKCAmcG9ydF9pZC0+aGNhX2d1aWQsICZycC0+aWItPnNnaWQudS5oYWxmWzFdLAorCQkgc2l6ZW9mICggcG9ydF9pZC0+aGNhX2d1aWQgKSApOworCisJcmV0dXJuIGliX3NycF9wYXJzZV9ieXRlX3N0cmluZyAoIHJwX2NvbXAsIHBvcnRfaWQtPmhjYV9ndWlkLnUuYnl0ZXMsCisJCQkJCSAgKCBzaXplb2YgKCBwb3J0X2lkLT5oY2FfZ3VpZCApIHwKKwkJCQkJICAgIElCX1NSUF9QQVJTRV9PUFRJT05BTCApICk7Cit9CisKKy8qKgorICogUGFyc2UgSUIgU1JQIHJvb3QgcGF0aCBkZXN0aW5hdGlvbiBHSUQKKyAqCisgKiBAdiBycF9jb21wCQlSb290IHBhdGggY29tcG9uZW50IHN0cmluZworICogQHYgcnAJCUlCIFNSUCByb290IHBhdGgKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX3NycF9wYXJzZV9kZ2lkICggY29uc3QgY2hhciAqcnBfY29tcCwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfc3JwX3Jvb3RfcGF0aCAqcnAgKSB7CisJcmV0dXJuIGliX3NycF9wYXJzZV9ieXRlX3N0cmluZyAoIHJwX2NvbXAsIHJwLT5pYi0+ZGdpZC51LmJ5dGVzLAorCQkJCQkgICggc2l6ZW9mICggcnAtPmliLT5kZ2lkICkgfAorCQkJCQkgICAgSUJfU1JQX1BBUlNFX1JFUVVJUkVEICkgKTsKK30KKworLyoqCisgKiBQYXJzZSBJQiBTUlAgcm9vdCBwYXRoIHBhcnRpdGlvbiBrZXkKKyAqCisgKiBAdiBycF9jb21wCQlSb290IHBhdGggY29tcG9uZW50IHN0cmluZworICogQHYgcnAJCUlCIFNSUCByb290IHBhdGgKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX3NycF9wYXJzZV9wa2V5ICggY29uc3QgY2hhciAqcnBfY29tcCwKKwkJCSAgICAgICBzdHJ1Y3QgaWJfc3JwX3Jvb3RfcGF0aCAqcnAgKSB7CisJaW50IHBrZXk7CisKKwlpZiAoICggcGtleSA9IGliX3NycF9wYXJzZV9pbnRlZ2VyICggcnBfY29tcCwgSUJfUEtFWV9ERUZBVUxUICkgKSA8IDAgKQorCQlyZXR1cm4gcGtleTsKKwlycC0+aWItPnBrZXkgPSBwa2V5OworCXJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIElCIFNSUCByb290IHBhdGggc2VydmljZSBJRAorICoKKyAqIEB2IHJwX2NvbXAJCVJvb3QgcGF0aCBjb21wb25lbnQgc3RyaW5nCisgKiBAdiBycAkJSUIgU1JQIHJvb3QgcGF0aAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJfc3JwX3BhcnNlX3NlcnZpY2VfaWQgKCBjb25zdCBjaGFyICpycF9jb21wLAorCQkJCSAgICAgc3RydWN0IGliX3NycF9yb290X3BhdGggKnJwICkgeworCXJldHVybiBpYl9zcnBfcGFyc2VfYnl0ZV9zdHJpbmcgKCBycF9jb21wLCBycC0+aWItPnNlcnZpY2VfaWQudS5ieXRlcywKKwkJCQkJICAoIHNpemVvZiAoIHJwLT5pYi0+c2VydmljZV9pZCApIHwKKwkJCQkJICAgIElCX1NSUF9QQVJTRV9SRVFVSVJFRCApICk7Cit9CisKKy8qKgorICogUGFyc2UgSUIgU1JQIHJvb3QgcGF0aCBMVU4KKyAqCisgKiBAdiBycF9jb21wCQlSb290IHBhdGggY29tcG9uZW50IHN0cmluZworICogQHYgcnAJCUlCIFNSUCByb290IHBhdGgKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGliX3NycF9wYXJzZV9sdW4gKCBjb25zdCBjaGFyICpycF9jb21wLAorCQkJICAgICAgc3RydWN0IGliX3NycF9yb290X3BhdGggKnJwICkgeworCXJldHVybiBzY3NpX3BhcnNlX2x1biAoIHJwX2NvbXAsIHJwLT5sdW4gKTsKK30KKworLyoqCisgKiBQYXJzZSBJQiBTUlAgcm9vdCBwYXRoIHRhcmdldCBpZGVudGlmaWVyIGV4dGVuc2lvbgorICoKKyAqIEB2IHJwX2NvbXAJCVJvb3QgcGF0aCBjb21wb25lbnQgc3RyaW5nCisgKiBAdiBycAkJSUIgU1JQIHJvb3QgcGF0aAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJfc3JwX3BhcnNlX3RhcmdldF9pZF9leHQgKCBjb25zdCBjaGFyICpycF9jb21wLAorCQkJCQlzdHJ1Y3QgaWJfc3JwX3Jvb3RfcGF0aCAqcnAgKSB7CisJc3RydWN0IGliX3NycF90YXJnZXRfcG9ydF9pZCAqcG9ydF9pZCA9CisJCWliX3NycF90YXJnZXRfcG9ydF9pZCAoIHJwLT5wb3J0X2lkcyApOworCisJcmV0dXJuIGliX3NycF9wYXJzZV9ieXRlX3N0cmluZyAoIHJwX2NvbXAsIHBvcnRfaWQtPmlkX2V4dC51LmJ5dGVzLAorCQkJCQkgICggc2l6ZW9mICggcG9ydF9pZC0+aWRfZXh0ICkgfAorCQkJCQkgICAgSUJfU1JQX1BBUlNFX1JFUVVJUkVEICkgKTsKK30KKworLyoqCisgKiBQYXJzZSBJQiBTUlAgcm9vdCBwYXRoIHRhcmdldCBJL08gY29udHJvbGxlciBHVUlECisgKgorICogQHYgcnBfY29tcAkJUm9vdCBwYXRoIGNvbXBvbmVudCBzdHJpbmcKKyAqIEB2IHJwCQlJQiBTUlAgcm9vdCBwYXRoCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpYl9zcnBfcGFyc2VfdGFyZ2V0X2lvY19ndWlkICggY29uc3QgY2hhciAqcnBfY29tcCwKKwkJCQkJICBzdHJ1Y3QgaWJfc3JwX3Jvb3RfcGF0aCAqcnAgKSB7CisJc3RydWN0IGliX3NycF90YXJnZXRfcG9ydF9pZCAqcG9ydF9pZCA9CisJCWliX3NycF90YXJnZXRfcG9ydF9pZCAoIHJwLT5wb3J0X2lkcyApOworCisJcmV0dXJuIGliX3NycF9wYXJzZV9ieXRlX3N0cmluZyAoIHJwX2NvbXAsIHBvcnRfaWQtPmlvY19ndWlkLnUuYnl0ZXMsCisJCQkJCSAgKCBzaXplb2YgKCBwb3J0X2lkLT5pb2NfZ3VpZCApIHwKKwkJCQkJICAgIElCX1NSUF9QQVJTRV9SRVFVSVJFRCApICk7Cit9CisKKy8qKiBJQiBTUlAgcm9vdCBwYXRoIGNvbXBvbmVudCBwYXJzZXIgKi8KK3N0cnVjdCBpYl9zcnBfcm9vdF9wYXRoX3BhcnNlciB7CisJLyoqCisJICogUGFyc2UgSUIgU1JQIHJvb3QgcGF0aCBjb21wb25lbnQKKwkgKgorCSAqIEB2IHJwX2NvbXAJCVJvb3QgcGF0aCBjb21wb25lbnQgc3RyaW5nCisJICogQHYgcnAJCUlCIFNSUCByb290IHBhdGgKKwkgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIHBhcnNlICkgKCBjb25zdCBjaGFyICpycF9jb21wLCBzdHJ1Y3QgaWJfc3JwX3Jvb3RfcGF0aCAqcnAgKTsKK307CisKKy8qKiBJQiBTUlAgcm9vdCBwYXRoIGNvbXBvbmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3QgaWJfc3JwX3Jvb3RfcGF0aF9wYXJzZXIgaWJfc3JwX3JwX3BhcnNlcltdID0geworCXsgaWJfc3JwX3BhcnNlX2xpdGVyYWwgfSwKKwl7IGliX3NycF9wYXJzZV9zZ2lkIH0sCisJeyBpYl9zcnBfcGFyc2VfaW5pdGlhdG9yX2lkX2V4dCB9LAorCXsgaWJfc3JwX3BhcnNlX2luaXRpYXRvcl9oY2FfZ3VpZCB9LAorCXsgaWJfc3JwX3BhcnNlX2RnaWQgfSwKKwl7IGliX3NycF9wYXJzZV9wa2V5IH0sCisJeyBpYl9zcnBfcGFyc2Vfc2VydmljZV9pZCB9LAorCXsgaWJfc3JwX3BhcnNlX2x1biB9LAorCXsgaWJfc3JwX3BhcnNlX3RhcmdldF9pZF9leHQgfSwKKwl7IGliX3NycF9wYXJzZV90YXJnZXRfaW9jX2d1aWQgfSwKK307CisKKy8qKiBOdW1iZXIgb2YgSUIgU1JQIHJvb3QgcGF0aCBjb21wb25lbnRzICovCisjZGVmaW5lIElCX1NSUF9OVU1fUlBfQ09NUE9ORU5UUyBcCisJKCBzaXplb2YgKCBpYl9zcnBfcnBfcGFyc2VyICkgLyBzaXplb2YgKCBpYl9zcnBfcnBfcGFyc2VyWzBdICkgKQorCisvKioKKyAqIFBhcnNlIElCIFNSUCByb290IHBhdGgKKyAqCisgKiBAdiBzcnAJCVNSUCBkZXZpY2UKKyAqIEB2IHJwX3N0cmluZwkJUm9vdCBwYXRoCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpYl9zcnBfcGFyc2Vfcm9vdF9wYXRoICggc3RydWN0IHNycF9kZXZpY2UgKnNycCwKKwkJCQkgICAgY29uc3QgY2hhciAqcnBfc3RyaW5nICkgeworCXN0cnVjdCBpYl9zcnBfcGFyYW1ldGVycyAqaWJfcGFyYW1zID0gaWJfc3JwX3BhcmFtcyAoIHNycCApOworCXN0cnVjdCBpYl9zcnBfcm9vdF9wYXRoIHJwID0geworCQkubHVuID0gJnNycC0+bHVuLAorCQkucG9ydF9pZHMgPSAmc3JwLT5wb3J0X2lkcywKKwkJLmliID0gaWJfcGFyYW1zLAorCX07CisJY2hhciBycF9zdHJpbmdfY29weVsgc3RybGVuICggcnBfc3RyaW5nICkgKyAxIF07CisJY2hhciAqcnBfY29tcFtJQl9TUlBfTlVNX1JQX0NPTVBPTkVOVFNdOworCWNoYXIgKnJwX3N0cmluZ190bXAgPSBycF9zdHJpbmdfY29weTsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJaW50IHJjOworCisJLyogU3BsaXQgcm9vdCBwYXRoIGludG8gY29tcG9uZW50IHBhcnRzICovCisJc3RyY3B5ICggcnBfc3RyaW5nX2NvcHksIHJwX3N0cmluZyApOworCXdoaWxlICggMSApIHsKKwkJcnBfY29tcFtpKytdID0gcnBfc3RyaW5nX3RtcDsKKwkJaWYgKCBpID09IElCX1NSUF9OVU1fUlBfQ09NUE9ORU5UUyApCisJCQlicmVhazsKKwkJZm9yICggOyAqcnBfc3RyaW5nX3RtcCAhPSAnOicgOyBycF9zdHJpbmdfdG1wKysgKSB7CisJCQlpZiAoICEgKnJwX3N0cmluZ190bXAgKSB7CisJCQkJREJHQyAoIHNycCwgIlNSUCAlcCByb290IHBhdGggXCIlc1wiIHRvbyAiCisJCQkJICAgICAgICJzaG9ydFxuIiwgc3JwLCBycF9zdHJpbmcgKTsKKwkJCQlyZXR1cm4gLUVJTlZBTF9SUF9UT09fU0hPUlQ7CisJCQl9CisJCX0KKwkJKihycF9zdHJpbmdfdG1wKyspID0gJ1wwJzsKKwl9CisKKwkvKiBQYXJzZSByb290IHBhdGggY29tcG9uZW50cyAqLworCWZvciAoIGkgPSAwIDsgaSA8IElCX1NSUF9OVU1fUlBfQ09NUE9ORU5UUyA7IGkrKyApIHsKKwkJaWYgKCAoIHJjID0gaWJfc3JwX3JwX3BhcnNlcltpXS5wYXJzZSAoIHJwX2NvbXBbaV0sCisJCQkJCQkJJnJwICkgKSAhPSAwICkgeworCQkJREJHQyAoIHNycCwgIlNSUCAlcCBjb3VsZCBub3QgcGFyc2UgXCIlc1wiIGluIHJvb3QgIgorCQkJICAgICAgICJwYXRoIFwiJXNcIjogJXNcbiIsIHNycCwgcnBfY29tcFtpXSwKKwkJCSAgICAgICBycF9zdHJpbmcsIHN0cmVycm9yICggcmMgKSApOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29ubmVjdCBJQiBTUlAgc2Vzc2lvbgorICoKKyAqIEB2IHNycAkJU1JQIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaWJfc3JwX2Nvbm5lY3QgKCBzdHJ1Y3Qgc3JwX2RldmljZSAqc3JwICkgeworCXN0cnVjdCBpYl9zcnBfcGFyYW1ldGVycyAqaWJfcGFyYW1zID0gaWJfc3JwX3BhcmFtcyAoIHNycCApOworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OworCWludCByYzsKKworCS8qIElkZW50aWZ5IEluZmluaWJhbmQgZGV2aWNlICovCisJaWJkZXYgPSBmaW5kX2liZGV2ICggJmliX3BhcmFtcy0+c2dpZCApOworCWlmICggISBpYmRldiApIHsKKwkJREJHQyAoIHNycCwgIlNSUCAlcCBjb3VsZCBub3QgaWRlbnRpZnkgSW5maW5pYmFuZCBkZXZpY2VcbiIsCisJCSAgICAgICBzcnAgKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQ29uZmlndXJlIHJlbWFpbmluZyBTUlAgcGFyYW1ldGVycyAqLworCXNycC0+bWVtb3J5X2hhbmRsZSA9IGliZGV2LT5yZG1hX2tleTsKKworCS8qIE9wZW4gQ01SQyBzb2NrZXQgKi8KKwlpZiAoICggcmMgPSBpYl9jbXJjX29wZW4gKCAmc3JwLT5zb2NrZXQsIGliZGV2LCAmaWJfcGFyYW1zLT5kZ2lkLAorCQkJCSAgICZpYl9wYXJhbXMtPnNlcnZpY2VfaWQgKSApICE9IDAgKSB7CisJCURCR0MgKCBzcnAsICJTUlAgJXAgY291bGQgbm90IG9wZW4gQ01SQyBzb2NrZXQ6ICVzXG4iLAorCQkgICAgICAgc3JwLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKiogSUIgU1JQIHRyYW5zcG9ydCB0eXBlICovCitzdHJ1Y3Qgc3JwX3RyYW5zcG9ydF90eXBlIGliX3NycF90cmFuc3BvcnQgPSB7CisJLnByaXZfbGVuID0gc2l6ZW9mICggc3RydWN0IGliX3NycF9wYXJhbWV0ZXJzICksCisJLnBhcnNlX3Jvb3RfcGF0aCA9IGliX3NycF9wYXJzZV9yb290X3BhdGgsCisJLmNvbm5lY3QgPSBpYl9zcnBfY29ubmVjdCwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvaW9icGFkLmMgYi9ncHhlL3NyYy9uZXQvaW9icGFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhZTIyMQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9pb2JwYWQuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEBmaWxlCisgKgorICogSS9PIGJ1ZmZlciBwYWRkaW5nCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisKKy8qKgorICogUGFkIEkvTyBidWZmZXIKKyAqCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbWluX2xlbgkJTWluaW11bSBsZW5ndGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBhZHMgYW5kIGFsaWducyBJL08gYnVmZmVycywgZm9yIGRldmljZXMgdGhhdAorICogYXJlbid0IGNhcGFibGUgb2YgcGFkZGluZyBpbiBoYXJkd2FyZSwgb3IgdGhhdCByZXF1aXJlIHNwZWNpZmljCisgKiBhbGlnbm1lbnQgaW4gVFggYnVmZmVycy4gIFRoZSBwYWNrZXQgZGF0YSB3aWxsIGVuZCB1cCBhbGlnbmVkIHRvIGEKKyAqIG11bHRpcGxlIG9mIEBjIElPQl9BTElHTi4KKyAqCisgKiBAYyBtaW5fbGVuIG11c3Qgbm90IGV4Y2VlZCBAdiBJT0JfWkxFTi4KKyAqLwordm9pZCBpb2JfcGFkICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHNpemVfdCBtaW5fbGVuICkgeworCXZvaWQgKmRhdGE7CisJc2l6ZV90IGxlbjsKKwlzaXplX3QgaGVhZHJvb207CisJc2lnbmVkIGludCBwYWRfbGVuOworCisJYXNzZXJ0ICggbWluX2xlbiA8PSBJT0JfWkxFTiApOworCisJLyogTW92ZSBwYWNrZXQgZGF0YSB0byBzdGFydCBvZiBJL08gYnVmZmVyLiAgVGhpcyB3aWxsIGJvdGgKKwkgKiBhbGlnbiB0aGUgZGF0YSAoc2luY2UgSS9PIGJ1ZmZlcnMgYXJlIGFsaWduZWQgdG8KKwkgKiBJT0JfQUxJR04pIGFuZCBnaXZlIHVzIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRoZQorCSAqIHplcm8tcGFkZGluZworCSAqLworCWRhdGEgPSBpb2J1Zi0+ZGF0YTsKKwlsZW4gPSBpb2JfbGVuICggaW9idWYgKTsKKwloZWFkcm9vbSA9IGlvYl9oZWFkcm9vbSAoIGlvYnVmICk7CisJaW9iX3B1c2ggKCBpb2J1ZiwgaGVhZHJvb20gKTsKKwltZW1tb3ZlICggaW9idWYtPmRhdGEsIGRhdGEsIGxlbiApOworCWlvYl91bnB1dCAoIGlvYnVmLCBoZWFkcm9vbSApOworCisJLyogUGFkIHRvIG1pbmltdW0gcGFja2V0IGxlbmd0aCAqLworCXBhZF9sZW4gPSAoIG1pbl9sZW4gLSBpb2JfbGVuICggaW9idWYgKSApOworCWlmICggcGFkX2xlbiA+IDAgKQorCQltZW1zZXQgKCBpb2JfcHV0ICggaW9idWYsIHBhZF9sZW4gKSwgMCwgcGFkX2xlbiApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L2lwdjQuYyBiL2dweGUvc3JjL25ldC9pcHY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxMzkzZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9pcHY0LmMKQEAgLTAsMCArMSw2MzUgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisjaW5jbHVkZSA8Z3B4ZS9hcnAuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9pcC5oPgorI2luY2x1ZGUgPGdweGUvdGNwaXAuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3AuaD4KKyNpbmNsdWRlIDxncHhlL3NldHRpbmdzLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIElQdjQgcHJvdG9jb2wKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiBVbmlxdWUgSVAgZGF0YWdyYW0gaWRlbnRpZmljYXRpb24gbnVtYmVyICovCitzdGF0aWMgdWludDE2X3QgbmV4dF9pZGVudCA9IDA7CisKK3N0cnVjdCBuZXRfcHJvdG9jb2wgaXB2NF9wcm90b2NvbDsKKworLyoqIExpc3Qgb2YgSVB2NCBtaW5pcm91dGVzICovCitzdHJ1Y3QgbGlzdF9oZWFkIGlwdjRfbWluaXJvdXRlcyA9IExJU1RfSEVBRF9JTklUICggaXB2NF9taW5pcm91dGVzICk7CisKKy8qKiBMaXN0IG9mIGZyYWdtZW50IHJlYXNzZW1ibHkgYnVmZmVycyAqLworc3RhdGljIExJU1RfSEVBRCAoIGZyYWdfYnVmZmVycyApOworCisvKioKKyAqIEFkZCBJUHY0IG1pbmlyb3V0aW5nIHRhYmxlIGVudHJ5CisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgYWRkcmVzcwkJSVB2NCBhZGRyZXNzCisgKiBAdiBuZXRtYXNrCQlTdWJuZXQgbWFzaworICogQHYgZ2F0ZXdheQkJR2F0ZXdheSBhZGRyZXNzIChpZiBhbnkpCisgKiBAcmV0IG1pbmlyb3V0ZQlSb3V0aW5nIHRhYmxlIGVudHJ5LCBvciBOVUxMCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXB2NF9taW5pcm91dGUgKiBfX21hbGxvYworYWRkX2lwdjRfbWluaXJvdXRlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGluX2FkZHIgYWRkcmVzcywKKwkJICAgICBzdHJ1Y3QgaW5fYWRkciBuZXRtYXNrLCBzdHJ1Y3QgaW5fYWRkciBnYXRld2F5ICkgeworCXN0cnVjdCBpcHY0X21pbmlyb3V0ZSAqbWluaXJvdXRlOworCisJREJHICggIklQdjQgYWRkICVzIiwgaW5ldF9udG9hICggYWRkcmVzcyApICk7CisJREJHICggIi8lcyAiLCBpbmV0X250b2EgKCBuZXRtYXNrICkgKTsKKwlpZiAoIGdhdGV3YXkuc19hZGRyICkKKwkJREJHICggImd3ICVzICIsIGluZXRfbnRvYSAoIGdhdGV3YXkgKSApOworCURCRyAoICJ2aWEgJXNcbiIsIG5ldGRldi0+bmFtZSApOworCisJLyogQWxsb2NhdGUgYW5kIHBvcHVsYXRlIG1pbmlyb3V0ZSBzdHJ1Y3R1cmUgKi8KKwltaW5pcm91dGUgPSBtYWxsb2MgKCBzaXplb2YgKCAqbWluaXJvdXRlICkgKTsKKwlpZiAoICEgbWluaXJvdXRlICkgeworCQlEQkcgKCAiSVB2NCBjb3VsZCBub3QgYWRkIG1pbmlyb3V0ZVxuIiApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBSZWNvcmQgcm91dGluZyBpbmZvcm1hdGlvbiAqLworCW1pbmlyb3V0ZS0+bmV0ZGV2ID0gbmV0ZGV2X2dldCAoIG5ldGRldiApOworCW1pbmlyb3V0ZS0+YWRkcmVzcyA9IGFkZHJlc3M7CisJbWluaXJvdXRlLT5uZXRtYXNrID0gbmV0bWFzazsKKwltaW5pcm91dGUtPmdhdGV3YXkgPSBnYXRld2F5OworCQkKKwkvKiBBZGQgdG8gZW5kIG9mIGxpc3QgaWYgd2UgaGF2ZSBhIGdhdGV3YXksIG90aGVyd2lzZQorCSAqIHRvIHN0YXJ0IG9mIGxpc3QuCisJICovCisJaWYgKCBnYXRld2F5LnNfYWRkciApIHsKKwkJbGlzdF9hZGRfdGFpbCAoICZtaW5pcm91dGUtPmxpc3QsICZpcHY0X21pbmlyb3V0ZXMgKTsKKwl9IGVsc2UgeworCQlsaXN0X2FkZCAoICZtaW5pcm91dGUtPmxpc3QsICZpcHY0X21pbmlyb3V0ZXMgKTsKKwl9CisKKwlyZXR1cm4gbWluaXJvdXRlOworfQorCisvKioKKyAqIERlbGV0ZSBJUHY0IG1pbmlyb3V0aW5nIHRhYmxlIGVudHJ5CisgKgorICogQHYgbWluaXJvdXRlCQlSb3V0aW5nIHRhYmxlIGVudHJ5CisgKi8KK3N0YXRpYyB2b2lkIGRlbF9pcHY0X21pbmlyb3V0ZSAoIHN0cnVjdCBpcHY0X21pbmlyb3V0ZSAqbWluaXJvdXRlICkgeworCisJREJHICggIklQdjQgZGVsICVzIiwgaW5ldF9udG9hICggbWluaXJvdXRlLT5hZGRyZXNzICkgKTsKKwlEQkcgKCAiLyVzICIsIGluZXRfbnRvYSAoIG1pbmlyb3V0ZS0+bmV0bWFzayApICk7CisJaWYgKCBtaW5pcm91dGUtPmdhdGV3YXkuc19hZGRyICkKKwkJREJHICggImd3ICVzICIsIGluZXRfbnRvYSAoIG1pbmlyb3V0ZS0+Z2F0ZXdheSApICk7CisJREJHICggInZpYSAlc1xuIiwgbWluaXJvdXRlLT5uZXRkZXYtPm5hbWUgKTsKKworCW5ldGRldl9wdXQgKCBtaW5pcm91dGUtPm5ldGRldiApOworCWxpc3RfZGVsICggJm1pbmlyb3V0ZS0+bGlzdCApOworCWZyZWUgKCBtaW5pcm91dGUgKTsKK30KKworLyoqCisgKiBQZXJmb3JtIElQdjQgcm91dGluZworICoKKyAqIEB2IGRlc3QJCUZpbmFsIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEByZXQgZGVzdAkJTmV4dCBob3AgZGVzdGluYXRpb24gYWRkcmVzcworICogQHJldCBtaW5pcm91dGUJUm91dGluZyB0YWJsZSBlbnRyeSB0byB1c2UsIG9yIE5VTEwgaWYgbm8gcm91dGUKKyAqCisgKiBJZiB0aGUgcm91dGUgcmVxdWlyZXMgdXNlIG9mIGEgZ2F0ZXdheSwgdGhlIG5leHQgaG9wIGRlc3RpbmF0aW9uCisgKiBhZGRyZXNzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgZ2F0ZXdheSBhZGRyZXNzLgorICovCitzdGF0aWMgc3RydWN0IGlwdjRfbWluaXJvdXRlICogaXB2NF9yb3V0ZSAoIHN0cnVjdCBpbl9hZGRyICpkZXN0ICkgeworCXN0cnVjdCBpcHY0X21pbmlyb3V0ZSAqbWluaXJvdXRlOworCWludCBsb2NhbDsKKwlpbnQgaGFzX2d3OworCisJLyogTmV2ZXIgYXR0ZW1wdCB0byByb3V0ZSB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwlpZiAoIGRlc3QtPnNfYWRkciA9PSBJTkFERFJfQlJPQURDQVNUICkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBGaW5kIGZpcnN0IHVzYWJsZSByb3V0ZSBpbiByb3V0aW5nIHRhYmxlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIG1pbmlyb3V0ZSwgJmlwdjRfbWluaXJvdXRlcywgbGlzdCApIHsKKwkJaWYgKCAhICggbWluaXJvdXRlLT5uZXRkZXYtPnN0YXRlICYgTkVUREVWX09QRU4gKSApCisJCQljb250aW51ZTsKKwkJbG9jYWwgPSAoICggKCBkZXN0LT5zX2FkZHIgXiBtaW5pcm91dGUtPmFkZHJlc3Muc19hZGRyICkKKwkJCSAgICAmIG1pbmlyb3V0ZS0+bmV0bWFzay5zX2FkZHIgKSA9PSAwICk7CisJCWhhc19ndyA9ICggbWluaXJvdXRlLT5nYXRld2F5LnNfYWRkciApOworCQlpZiAoIGxvY2FsIHx8IGhhc19ndyApIHsKKwkJCWlmICggISBsb2NhbCApCisJCQkJKmRlc3QgPSBtaW5pcm91dGUtPmdhdGV3YXk7CisJCQlyZXR1cm4gbWluaXJvdXRlOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRnJhZ21lbnQgcmVhc3NlbWJseSBjb3VudGVyIHRpbWVvdXQKKyAqCisgKiBAdiB0aW1lcglSZXRyeSB0aW1lcgorICogQHYgb3ZlcglJZiBhc3NlcnRlZCwgdGhlIHRpbWVyIGlzIGdyZWF0ZXIgdGhhbiBAYyBNQVhfVElNRU9VVCAKKyAqLworc3RhdGljIHZvaWQgaXB2NF9mcmFnX2V4cGlyZWQgKCBzdHJ1Y3QgcmV0cnlfdGltZXIgKnRpbWVyIF9fdW51c2VkLAorCQkJCWludCBvdmVyICkgeworCWlmICggb3ZlciApIHsKKwkJREJHICggIkZyYWdtZW50IHJlYXNzZW1ibHkgdGltZW91dCIgKTsKKwkJLyogRnJlZSB0aGUgZnJhZ21lbnQgYnVmZmVyICovCisJfQorfQorCisvKioKKyAqIEZyZWUgZnJhZ21lbnQgYnVmZmVyCisgKgorICogQHYgZnJhZ2J1ZwlGcmFnbWVudCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgZnJlZV9mcmFnYnVmICggc3RydWN0IGZyYWdfYnVmZmVyICpmcmFnYnVmICkgeworCWZyZWUgKCBmcmFnYnVmICk7Cit9CisKKy8qKgorICogRnJhZ21lbnQgcmVhc3NlbWJsZXIKKyAqCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlciwgZnJhZ21lbnQgb2YgdGhlIGRhdGFncmFtCisgKiBAcmV0IGZyYWdfaW9iCVJlYXNzZW1ibGVkIHBhY2tldCwgb3IgTlVMTAorICovCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqIGlwdjRfcmVhc3NlbWJsZSAoIHN0cnVjdCBpb19idWZmZXIgKiBpb2J1ZiApIHsKKwlzdHJ1Y3QgaXBoZHIgKmlwaGRyID0gaW9idWYtPmRhdGE7CisJc3RydWN0IGZyYWdfYnVmZmVyICpmcmFnYnVmOworCQorCS8qKgorCSAqIENoZWNrIGlmIHRoZSBmcmFnbWVudCBiZWxvbmdzIHRvIGFueSBmcmFnbWVudCBzZXJpZXMKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggZnJhZ2J1ZiwgJmZyYWdfYnVmZmVycywgbGlzdCApIHsKKwkJaWYgKCBmcmFnYnVmLT5pZGVudCA9PSBpcGhkci0+aWRlbnQgJiYKKwkJICAgICBmcmFnYnVmLT5zcmMuc19hZGRyID09IGlwaGRyLT5zcmMuc19hZGRyICkgeworCQkJLyoqCisJCQkgKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIHRoZSBleHBlY3RlZCBmcmFnbWVudAorCQkJICogCisJCQkgKiBUaGUgb2Zmc2V0IG9mIHRoZSBuZXcgcGFja2V0IG11c3QgYmUgZXF1YWwgdG8gdGhlCisJCQkgKiBsZW5ndGggb2YgdGhlIGRhdGEgYWNjdW11bGF0ZWQgc28gZmFyICh0aGUgbGVuZ3RoIG9mCisJCQkgKiB0aGUgcmVhc3NlbWJsZWQgSS9PIGJ1ZmZlcgorCQkJICovCisJCQlpZiAoIGlvYl9sZW4gKCBmcmFnYnVmLT5mcmFnX2lvYiApID09IAorCQkJICAgICAgKCBpcGhkci0+ZnJhZ3MgJiBJUF9NQVNLX09GRlNFVCApICkgeworCQkJCS8qKgorCQkJCSAqIEFwcGVuZCB0aGUgY29udGVudHMgb2YgdGhlIGZyYWdtZW50IHRvIHRoZQorCQkJCSAqIHJlYXNzZW1ibGVkIEkvTyBidWZmZXIKKwkJCQkgKi8KKwkJCQlpb2JfcHVsbCAoIGlvYnVmLCBzaXplb2YgKCAqaXBoZHIgKSApOworCQkJCW1lbWNweSAoIGlvYl9wdXQgKCBmcmFnYnVmLT5mcmFnX2lvYiwKKwkJCQkJCQlpb2JfbGVuICggaW9idWYgKSApLAorCQkJCQkgaW9idWYtPmRhdGEsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisJCQkJZnJlZV9pb2IgKCBpb2J1ZiApOworCisJCQkJLyoqIENoZWNrIGlmIHRoZSBmcmFnbWVudCBzZXJpZXMgaXMgb3ZlciAqLworCQkJCWlmICggISAoIGlwaGRyLT5mcmFncyAmIElQX01BU0tfTU9SRUZSQUdTICkgKSB7CisJCQkJCWlvYnVmID0gZnJhZ2J1Zi0+ZnJhZ19pb2I7CisJCQkJCWZyZWVfZnJhZ2J1ZiAoIGZyYWdidWYgKTsKKwkJCQkJcmV0dXJuIGlvYnVmOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQkvKiBEaXNjYXJkIHRoZSBmcmFnbWVudCBzZXJpZXMgKi8KKwkJCQlmcmVlX2ZyYWdidWYgKCBmcmFnYnVmICk7CisJCQkJZnJlZV9pb2IgKCBpb2J1ZiApOworCQkJfQorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJCisJLyoqIENoZWNrIGlmIHRoZSBmcmFnbWVudCBpcyB0aGUgZmlyc3QgaW4gdGhlIGZyYWdtZW50IHNlcmllcyAqLworCWlmICggaXBoZHItPmZyYWdzICYgSVBfTUFTS19NT1JFRlJBR1MgJiYKKwkJCSggKCBpcGhkci0+ZnJhZ3MgJiBJUF9NQVNLX09GRlNFVCApID09IDAgKSApIHsKKwkKKwkJLyoqIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBidWZmZXIgKi8KKwkJZnJhZ2J1ZiA9ICggc3RydWN0IGZyYWdfYnVmZmVyKiApIG1hbGxvYyAoIHNpemVvZiggKmZyYWdidWYgKSApOworCQlmcmFnYnVmLT5pZGVudCA9IGlwaGRyLT5pZGVudDsKKwkJZnJhZ2J1Zi0+c3JjID0gaXBoZHItPnNyYzsKKworCQkvKiBTZXQgdXAgdGhlIHJlYXNzZW1ibHkgSS9PIGJ1ZmZlciAqLworCQlmcmFnYnVmLT5mcmFnX2lvYiA9IGFsbG9jX2lvYiAoIElQX0ZSQUdfSU9CX1NJWkUgKTsKKwkJaW9iX3B1bGwgKCBpb2J1Ziwgc2l6ZW9mICggKmlwaGRyICkgKTsKKwkJbWVtY3B5ICggaW9iX3B1dCAoIGZyYWdidWYtPmZyYWdfaW9iLCBpb2JfbGVuICggaW9idWYgKSApLAorCQkJIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSApOworCQlmcmVlX2lvYiAoIGlvYnVmICk7CisKKwkJLyogU2V0IHRoZSByZWFzc2VtYmx5IHRpbWVyICovCisJCWZyYWdidWYtPmZyYWdfdGltZXIudGltZW91dCA9IElQX0ZSQUdfVElNRU9VVDsKKwkJZnJhZ2J1Zi0+ZnJhZ190aW1lci5leHBpcmVkID0gaXB2NF9mcmFnX2V4cGlyZWQ7CisJCXN0YXJ0X3RpbWVyICggJmZyYWdidWYtPmZyYWdfdGltZXIgKTsKKworCQkvKiBBZGQgdGhlIGZyYWdtZW50IGJ1ZmZlciB0byB0aGUgbGlzdCBvZiBmcmFnbWVudCBidWZmZXJzICovCisJCWxpc3RfYWRkICggJmZyYWdidWYtPmxpc3QsICZmcmFnX2J1ZmZlcnMgKTsKKwl9CisJCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogQWRkIElQdjQgcHNldWRvLWhlYWRlciBjaGVja3N1bSB0byBleGlzdGluZyBjaGVja3N1bQorICoKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiBjc3VtCQlFeGlzdGluZyBjaGVja3N1bQorICogQHJldCBjc3VtCQlVcGRhdGVkIGNoZWNrc3VtCisgKi8KK3N0YXRpYyB1aW50MTZfdCBpcHY0X3BzaGRyX2Noa3N1bSAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCB1aW50MTZfdCBjc3VtICkgeworCXN0cnVjdCBpcHY0X3BzZXVkb19oZWFkZXIgcHNoZHI7CisJc3RydWN0IGlwaGRyICppcGhkciA9IGlvYnVmLT5kYXRhOworCXNpemVfdCBoZHJsZW4gPSAoICggaXBoZHItPnZlcmhkcmxlbiAmIElQX01BU0tfSExFTiApICogNCApOworCisJLyogQnVpbGQgcHNldWRvLWhlYWRlciAqLworCXBzaGRyLnNyYyA9IGlwaGRyLT5zcmM7CisJcHNoZHIuZGVzdCA9IGlwaGRyLT5kZXN0OworCXBzaGRyLnplcm9fcGFkZGluZyA9IDB4MDA7CisJcHNoZHIucHJvdG9jb2wgPSBpcGhkci0+cHJvdG9jb2w7CisJcHNoZHIubGVuID0gaHRvbnMgKCBpb2JfbGVuICggaW9idWYgKSAtIGhkcmxlbiApOworCisJLyogVXBkYXRlIHRoZSBjaGVja3N1bSB2YWx1ZSAqLworCXJldHVybiB0Y3BpcF9jb250aW51ZV9jaGtzdW0gKCBjc3VtLCAmcHNoZHIsIHNpemVvZiAoIHBzaGRyICkgKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgbGluay1sYXllciBhZGRyZXNzCisgKgorICogQHYgZGVzdAkJSVB2NCBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiBAdiBzcmMJCUlQdjQgc291cmNlIGFkZHJlc3MKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IGxsX2Rlc3QJCUxpbmstbGF5ZXIgZGVzdGluYXRpb24gYWRkcmVzcyBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlwdjRfbGxfYWRkciAoIHN0cnVjdCBpbl9hZGRyIGRlc3QsIHN0cnVjdCBpbl9hZGRyIHNyYywKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDhfdCAqbGxfZGVzdCApIHsKKwlzdHJ1Y3QgbGxfcHJvdG9jb2wgKmxsX3Byb3RvY29sID0gbmV0ZGV2LT5sbF9wcm90b2NvbDsKKworCWlmICggZGVzdC5zX2FkZHIgPT0gSU5BRERSX0JST0FEQ0FTVCApIHsKKwkJLyogQnJvYWRjYXN0IGFkZHJlc3MgKi8KKwkJbWVtY3B5ICggbGxfZGVzdCwgbmV0ZGV2LT5sbF9icm9hZGNhc3QsCisJCQkgbGxfcHJvdG9jb2wtPmxsX2FkZHJfbGVuICk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoIElOX01VTFRJQ0FTVCAoIG50b2hsICggZGVzdC5zX2FkZHIgKSApICkgeworCQlyZXR1cm4gbGxfcHJvdG9jb2wtPm1jX2hhc2ggKCBBRl9JTkVULCAmZGVzdCwgbGxfZGVzdCApOworCX0gZWxzZSB7CisJCS8qIFVuaWNhc3QgYWRkcmVzczogcmVzb2x2ZSB2aWEgQVJQICovCisJCXJldHVybiBhcnBfcmVzb2x2ZSAoIG5ldGRldiwgJmlwdjRfcHJvdG9jb2wsICZkZXN0LAorCQkJCSAgICAgJnNyYywgbGxfZGVzdCApOworCX0KK30KKworLyoqCisgKiBUcmFuc21pdCBJUCBwYWNrZXQKKyAqCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgdGNwaXAJCVRyYW5zcG9ydC1sYXllciBwcm90b2NvbAorICogQHYgc3Rfc3JjCQlTb3VyY2UgbmV0d29yay1sYXllciBhZGRyZXNzCisgKiBAdiBzdF9kZXN0CQlEZXN0aW5hdGlvbiBuZXR3b3JrLWxheWVyIGFkZHJlc3MKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UgdG8gdXNlIGlmIG5vIHJvdXRlIGZvdW5kLCBvciBOVUxMCisgKiBAdiB0cmFuc19jc3VtCVRyYW5zcG9ydC1sYXllciBjaGVja3N1bSB0byBjb21wbGV0ZSwgb3IgTlVMTAorICogQHJldCByYwkJU3RhdHVzCisgKgorICogVGhpcyBmdW5jdGlvbiBleHBlY3RzIGEgdHJhbnNwb3J0LWxheWVyIHNlZ21lbnQgYW5kIHByZXBlbmRzIHRoZSBJUCBoZWFkZXIKKyAqLworc3RhdGljIGludCBpcHY0X3R4ICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCSAgICAgc3RydWN0IHRjcGlwX3Byb3RvY29sICp0Y3BpcF9wcm90b2NvbCwKKwkJICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X3NyYywKKwkJICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X2Rlc3QsCisJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgICB1aW50MTZfdCAqdHJhbnNfY3N1bSApIHsKKwlzdHJ1Y3QgaXBoZHIgKmlwaGRyID0gaW9iX3B1c2ggKCBpb2J1Ziwgc2l6ZW9mICggKmlwaGRyICkgKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbl9zcmMgPSAoICggc3RydWN0IHNvY2thZGRyX2luICogKSBzdF9zcmMgKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbl9kZXN0ID0gKCAoIHN0cnVjdCBzb2NrYWRkcl9pbiAqICkgc3RfZGVzdCApOworCXN0cnVjdCBpcHY0X21pbmlyb3V0ZSAqbWluaXJvdXRlOworCXN0cnVjdCBpbl9hZGRyIG5leHRfaG9wOworCXVpbnQ4X3QgbGxfZGVzdFtNQVhfTExfQUREUl9MRU5dOworCWludCByYzsKKworCS8qIEZpbGwgdXAgdGhlIElQIGhlYWRlciwgZXhjZXB0IHNvdXJjZSBhZGRyZXNzICovCisJbWVtc2V0ICggaXBoZHIsIDAsIHNpemVvZiAoICppcGhkciApICk7CisJaXBoZHItPnZlcmhkcmxlbiA9ICggSVBfVkVSIHwgKCBzaXplb2YgKCAqaXBoZHIgKSAvIDQgKSApOworCWlwaGRyLT5zZXJ2aWNlID0gSVBfVE9TOworCWlwaGRyLT5sZW4gPSBodG9ucyAoIGlvYl9sZW4gKCBpb2J1ZiApICk7CQorCWlwaGRyLT5pZGVudCA9IGh0b25zICggKytuZXh0X2lkZW50ICk7CisJaXBoZHItPnR0bCA9IElQX1RUTDsKKwlpcGhkci0+cHJvdG9jb2wgPSB0Y3BpcF9wcm90b2NvbC0+dGNwaXBfcHJvdG87CisJaXBoZHItPmRlc3QgPSBzaW5fZGVzdC0+c2luX2FkZHI7CisKKwkvKiBVc2Ugcm91dGluZyB0YWJsZSB0byBpZGVudGlmeSBuZXh0IGhvcCBhbmQgdHJhbnNtaXR0aW5nIG5ldGRldiAqLworCW5leHRfaG9wID0gaXBoZHItPmRlc3Q7CisJaWYgKCBzaW5fc3JjICkKKwkJaXBoZHItPnNyYyA9IHNpbl9zcmMtPnNpbl9hZGRyOworCWlmICggKCBuZXh0X2hvcC5zX2FkZHIgIT0gSU5BRERSX0JST0FEQ0FTVCApICYmCisJICAgICAoICEgSU5fTVVMVElDQVNUICggbnRvaGwgKCBuZXh0X2hvcC5zX2FkZHIgKSApICkgJiYKKwkgICAgICggKCBtaW5pcm91dGUgPSBpcHY0X3JvdXRlICggJm5leHRfaG9wICkgKSAhPSBOVUxMICkgKSB7CisJCWlwaGRyLT5zcmMgPSBtaW5pcm91dGUtPmFkZHJlc3M7CisJCW5ldGRldiA9IG1pbmlyb3V0ZS0+bmV0ZGV2OworCX0KKwlpZiAoICEgbmV0ZGV2ICkgeworCQlEQkcgKCAiSVB2NCBoYXMgbm8gcm91dGUgdG8gJXNcbiIsIGluZXRfbnRvYSAoIGlwaGRyLT5kZXN0ICkgKTsKKwkJcmMgPSAtRU5FVFVOUkVBQ0g7CisJCWdvdG8gZXJyOworCX0KKworCS8qIERldGVybWluZSBsaW5rLWxheWVyIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlpZiAoICggcmMgPSBpcHY0X2xsX2FkZHIgKCBuZXh0X2hvcCwgaXBoZHItPnNyYywgbmV0ZGV2LAorCQkJCSAgIGxsX2Rlc3QgKSApICE9IDAgKSB7CisJCURCRyAoICJJUHY0IGhhcyBubyBsaW5rLWxheWVyIGFkZHJlc3MgZm9yICVzOiAlc1xuIiwKKwkJICAgICAgaW5ldF9udG9hICggbmV4dF9ob3AgKSwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyOworCX0KKworCS8qIEZpeCB1cCBjaGVja3N1bXMgKi8KKwlpZiAoIHRyYW5zX2NzdW0gKQorCQkqdHJhbnNfY3N1bSA9IGlwdjRfcHNoZHJfY2hrc3VtICggaW9idWYsICp0cmFuc19jc3VtICk7CisJaXBoZHItPmNoa3N1bSA9IHRjcGlwX2Noa3N1bSAoIGlwaGRyLCBzaXplb2YgKCAqaXBoZHIgKSApOworCisJLyogUHJpbnQgSVA0IGhlYWRlciBmb3IgZGVidWdnaW5nICovCisJREJHICggIklQdjQgVFggJXMtPiIsIGluZXRfbnRvYSAoIGlwaGRyLT5zcmMgKSApOworCURCRyAoICIlcyBsZW4gJWQgcHJvdG8gJWQgaWQgJTA0eCBjc3VtICUwNHhcbiIsCisJICAgICAgaW5ldF9udG9hICggaXBoZHItPmRlc3QgKSwgbnRvaHMgKCBpcGhkci0+bGVuICksIGlwaGRyLT5wcm90b2NvbCwKKwkgICAgICBudG9ocyAoIGlwaGRyLT5pZGVudCApLCBudG9ocyAoIGlwaGRyLT5jaGtzdW0gKSApOworCisJLyogSGFuZCBvZmYgdG8gbGluayBsYXllciAqLworCWlmICggKCByYyA9IG5ldF90eCAoIGlvYnVmLCBuZXRkZXYsICZpcHY0X3Byb3RvY29sLCBsbF9kZXN0ICkgKSAhPSAwICkgeworCQlEQkcgKCAiSVB2NCBjb3VsZCBub3QgdHJhbnNtaXQgcGFja2V0IHZpYSAlczogJXNcbiIsCisJCSAgICAgIG5ldGRldi0+bmFtZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKKworIGVycjoKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFByb2Nlc3MgaW5jb21pbmcgcGFja2V0cworICoKKyAqIEB2IGlvYnVmCUkvTyBidWZmZXIKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorICogQHYgbGxfc291cmNlCUxpbmstbGF5ZXIgZGVzdGluYXRpb24gc291cmNlCisgKgorICogVGhpcyBmdW5jdGlvbiBleHBlY3RzIGFuIElQNCBuZXR3b3JrIGRhdGFncmFtLiBJdCBwcm9jZXNzZXMgdGhlIGhlYWRlcnMgCisgKiBhbmQgc2VuZHMgaXQgdG8gdGhlIHRyYW5zcG9ydCBsYXllci4KKyAqLworc3RhdGljIGludCBpcHY0X3J4ICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgX191bnVzZWQsCisJCSAgICAgY29uc3Qgdm9pZCAqbGxfc291cmNlIF9fdW51c2VkICkgeworCXN0cnVjdCBpcGhkciAqaXBoZHIgPSBpb2J1Zi0+ZGF0YTsKKwlzaXplX3QgaGRybGVuOworCXNpemVfdCBsZW47CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCQlzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgc3Q7CisJfSBzcmMsIGRlc3Q7CisJdWludDE2X3QgY3N1bTsKKwl1aW50MTZfdCBwc2hkcl9jc3VtOworCWludCByYzsKKworCS8qIFNhbml0eSBjaGVjayB0aGUgSVB2NCBoZWFkZXIgKi8KKwlpZiAoIGlvYl9sZW4gKCBpb2J1ZiApIDwgc2l6ZW9mICggKmlwaGRyICkgKSB7CisJCURCRyAoICJJUHY0IHBhY2tldCB0b28gc2hvcnQgYXQgJXpkIGJ5dGVzIChtaW4gJXpkIGJ5dGVzKVxuIiwKKwkJICAgICAgaW9iX2xlbiAoIGlvYnVmICksIHNpemVvZiAoICppcGhkciApICk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoICggaXBoZHItPnZlcmhkcmxlbiAmIElQX01BU0tfVkVSICkgIT0gSVBfVkVSICkgeworCQlEQkcgKCAiSVB2NCB2ZXJzaW9uICUjMDJ4IG5vdCBzdXBwb3J0ZWRcbiIsIGlwaGRyLT52ZXJoZHJsZW4gKTsKKwkJZ290byBlcnI7CisJfQorCWhkcmxlbiA9ICggKCBpcGhkci0+dmVyaGRybGVuICYgSVBfTUFTS19ITEVOICkgKiA0ICk7CisJaWYgKCBoZHJsZW4gPCBzaXplb2YgKCAqaXBoZHIgKSApIHsKKwkJREJHICggIklQdjQgaGVhZGVyIHRvbyBzaG9ydCBhdCAlemQgYnl0ZXMgKG1pbiAlemQgYnl0ZXMpXG4iLAorCQkgICAgICBoZHJsZW4sIHNpemVvZiAoICppcGhkciApICk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoIGhkcmxlbiA+IGlvYl9sZW4gKCBpb2J1ZiApICkgeworCQlEQkcgKCAiSVB2NCBoZWFkZXIgdG9vIGxvbmcgYXQgJXpkIGJ5dGVzICIKKwkJICAgICAgIihwYWNrZXQgaXMgJXpkIGJ5dGVzKVxuIiwgaGRybGVuLCBpb2JfbGVuICggaW9idWYgKSApOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCAoIGNzdW0gPSB0Y3BpcF9jaGtzdW0gKCBpcGhkciwgaGRybGVuICkgKSAhPSAwICkgeworCQlEQkcgKCAiSVB2NCBjaGVja3N1bSBpbmNvcnJlY3QgKGlzICUwNHggaW5jbHVkaW5nIGNoZWNrc3VtICIKKwkJICAgICAgImZpZWxkLCBzaG91bGQgYmUgMDAwMClcbiIsIGNzdW0gKTsKKwkJZ290byBlcnI7CisJfQorCWxlbiA9IG50b2hzICggaXBoZHItPmxlbiApOworCWlmICggbGVuIDwgaGRybGVuICkgeworCQlEQkcgKCAiSVB2NCBsZW5ndGggdG9vIHNob3J0IGF0ICV6ZCBieXRlcyAiCisJCSAgICAgICIoaGVhZGVyIGlzICV6ZCBieXRlcylcbiIsIGxlbiwgaGRybGVuICk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoIGxlbiA+IGlvYl9sZW4gKCBpb2J1ZiApICkgeworCQlEQkcgKCAiSVB2NCBsZW5ndGggdG9vIGxvbmcgYXQgJXpkIGJ5dGVzICIKKwkJICAgICAgIihwYWNrZXQgaXMgJXpkIGJ5dGVzKVxuIiwgbGVuLCBpb2JfbGVuICggaW9idWYgKSApOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBQcmludCBJUHY0IGhlYWRlciBmb3IgZGVidWdnaW5nICovCisJREJHICggIklQdjQgUlggJXM8LSIsIGluZXRfbnRvYSAoIGlwaGRyLT5kZXN0ICkgKTsKKwlEQkcgKCAiJXMgbGVuICVkIHByb3RvICVkIGlkICUwNHggY3N1bSAlMDR4XG4iLAorCSAgICAgIGluZXRfbnRvYSAoIGlwaGRyLT5zcmMgKSwgbnRvaHMgKCBpcGhkci0+bGVuICksIGlwaGRyLT5wcm90b2NvbCwKKwkgICAgICBudG9ocyAoIGlwaGRyLT5pZGVudCApLCBudG9ocyAoIGlwaGRyLT5jaGtzdW0gKSApOworCisJLyogVHJ1bmNhdGUgcGFja2V0IHRvIGNvcnJlY3QgbGVuZ3RoLCBjYWxjdWxhdGUgcHNldWRvLWhlYWRlcgorCSAqIGNoZWNrc3VtIGFuZCB0aGVuIHN0cmlwIG9mZiB0aGUgSVB2NCBoZWFkZXIuCisJICovCisJaW9iX3VucHV0ICggaW9idWYsICggaW9iX2xlbiAoIGlvYnVmICkgLSBsZW4gKSApOworCXBzaGRyX2NzdW0gPSBpcHY0X3BzaGRyX2Noa3N1bSAoIGlvYnVmLCBUQ1BJUF9FTVBUWV9DU1VNICk7CisJaW9iX3B1bGwgKCBpb2J1ZiwgaGRybGVuICk7CisKKwkvKiBGcmFnbWVudCByZWFzc2VtYmx5ICovCisJaWYgKCAoIGlwaGRyLT5mcmFncyAmIGh0b25zICggSVBfTUFTS19NT1JFRlJBR1MgKSApIHx8IAorCSAgICAgKCAoIGlwaGRyLT5mcmFncyAmIGh0b25zICggSVBfTUFTS19PRkZTRVQgKSApICE9IDAgKSApIHsKKwkJLyogUGFzcyB0aGUgZnJhZ21lbnQgdG8gaXB2NF9yZWFzc2VtYmxlKCkgd2hpY2ggZWl0aGVyCisJCSAqIHJldHVybnMgYSBmdWxseSByZWFzc2VtYmxlZCBJL08gYnVmZmVyIG9yIE5VTEwuCisJCSAqLworCQlpb2J1ZiA9IGlwdjRfcmVhc3NlbWJsZSAoIGlvYnVmICk7CisJCWlmICggISBpb2J1ZiApCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDb25zdHJ1Y3Qgc29ja2V0IGFkZHJlc3NlcyBhbmQgaGFuZCBvZmYgdG8gdHJhbnNwb3J0IGxheWVyICovCisJbWVtc2V0ICggJnNyYywgMCwgc2l6ZW9mICggc3JjICkgKTsKKwlzcmMuc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNyYy5zaW4uc2luX2FkZHIgPSBpcGhkci0+c3JjOworCW1lbXNldCAoICZkZXN0LCAwLCBzaXplb2YgKCBkZXN0ICkgKTsKKwlkZXN0LnNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlkZXN0LnNpbi5zaW5fYWRkciA9IGlwaGRyLT5kZXN0OworCWlmICggKCByYyA9IHRjcGlwX3J4ICggaW9idWYsIGlwaGRyLT5wcm90b2NvbCwgJnNyYy5zdCwKKwkJCSAgICAgICAmZGVzdC5zdCwgcHNoZHJfY3N1bSApICkgIT0gMCApIHsKKwkJREJHICggIklQdjQgcmVjZWl2ZWQgcGFja2V0IHJlamVjdGVkIGJ5IHN0YWNrOiAlc1xuIiwKKwkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKKworIGVycjoKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKiAKKyAqIENoZWNrIGV4aXN0ZW5jZSBvZiBJUHY0IGFkZHJlc3MgZm9yIEFSUAorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IG5ldF9hZGRyCQlOZXR3b3JrLWxheWVyIGFkZHJlc3MKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlwdjRfYXJwX2NoZWNrICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgY29uc3Qgdm9pZCAqbmV0X2FkZHIgKSB7CisJY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHJlc3MgPSBuZXRfYWRkcjsKKwlzdHJ1Y3QgaXB2NF9taW5pcm91dGUgKm1pbmlyb3V0ZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBtaW5pcm91dGUsICZpcHY0X21pbmlyb3V0ZXMsIGxpc3QgKSB7CisJCWlmICggKCBtaW5pcm91dGUtPm5ldGRldiA9PSBuZXRkZXYgKSAmJgorCQkgICAgICggbWluaXJvdXRlLT5hZGRyZXNzLnNfYWRkciA9PSBhZGRyZXNzLT5zX2FkZHIgKSApIHsKKwkJCS8qIEZvdW5kIG1hdGNoaW5nIGFkZHJlc3MgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqIENvbnZlcnQgSVB2NCBhZGRyZXNzIHRvIGRvdHRlZC1xdWFkIG5vdGF0aW9uCisgKgorICogQHYgaW4JSVAgYWRkcmVzcworICogQHJldCBzdHJpbmcJSVAgYWRkcmVzcyBpbiBkb3R0ZWQtcXVhZCBub3RhdGlvbgorICovCitjaGFyICogaW5ldF9udG9hICggc3RydWN0IGluX2FkZHIgaW4gKSB7CisJc3RhdGljIGNoYXIgYnVmWzE2XTsgLyogInh4eC54eHgueHh4Lnh4eCIgKi8KKwl1aW50OF90ICpieXRlcyA9ICggdWludDhfdCAqICkgJmluOworCQorCXNwcmludGYgKCBidWYsICIlZC4lZC4lZC4lZCIsIGJ5dGVzWzBdLCBieXRlc1sxXSwgYnl0ZXNbMl0sIGJ5dGVzWzNdICk7CisJcmV0dXJuIGJ1ZjsKK30KKworLyoqCisgKiBUcmFuc2NyaWJlIElQIGFkZHJlc3MKKyAqCisgKiBAdiBuZXRfYWRkcglJUCBhZGRyZXNzCisgKiBAcmV0IHN0cmluZwlJUCBhZGRyZXNzIGluIGRvdHRlZC1xdWFkIG5vdGF0aW9uCisgKgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGlwdjRfbnRvYSAoIGNvbnN0IHZvaWQgKm5ldF9hZGRyICkgeworCXJldHVybiBpbmV0X250b2EgKCAqICggKCBzdHJ1Y3QgaW5fYWRkciAqICkgbmV0X2FkZHIgKSApOworfQorCisvKiogSVB2NCBwcm90b2NvbCAqLworc3RydWN0IG5ldF9wcm90b2NvbCBpcHY0X3Byb3RvY29sIF9fbmV0X3Byb3RvY29sID0geworCS5uYW1lID0gIklQIiwKKwkubmV0X3Byb3RvID0gaHRvbnMgKCBFVEhfUF9JUCApLAorCS5uZXRfYWRkcl9sZW4gPSBzaXplb2YgKCBzdHJ1Y3QgaW5fYWRkciApLAorCS5yeCA9IGlwdjRfcngsCisJLm50b2EgPSBpcHY0X250b2EsCit9OworCisvKiogSVB2NCBUQ1BJUCBuZXQgcHJvdG9jb2wgKi8KK3N0cnVjdCB0Y3BpcF9uZXRfcHJvdG9jb2wgaXB2NF90Y3BpcF9wcm90b2NvbCBfX3RjcGlwX25ldF9wcm90b2NvbCA9IHsKKwkubmFtZSA9ICJJUHY0IiwKKwkuc2FfZmFtaWx5ID0gQUZfSU5FVCwKKwkudHggPSBpcHY0X3R4LAorfTsKKworLyoqIElQdjQgQVJQIHByb3RvY29sICovCitzdHJ1Y3QgYXJwX25ldF9wcm90b2NvbCBpcHY0X2FycF9wcm90b2NvbCBfX2FycF9uZXRfcHJvdG9jb2wgPSB7CisJLm5ldF9wcm90b2NvbCA9ICZpcHY0X3Byb3RvY29sLAorCS5jaGVjayA9IGlwdjRfYXJwX2NoZWNrLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNldHRpbmdzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBJUHY0IGFkZHJlc3Mgc2V0dGluZyAqLworc3RydWN0IHNldHRpbmcgaXBfc2V0dGluZyBfX3NldHRpbmcgPSB7CisJLm5hbWUgPSAiaXAiLAorCS5kZXNjcmlwdGlvbiA9ICJJUHY0IGFkZHJlc3MiLAorCS50YWcgPSBESENQX0VCX1lJQUREUiwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfaXB2NCwKK307CisKKy8qKiBJUHY0IHN1Ym5ldCBtYXNrIHNldHRpbmcgKi8KK3N0cnVjdCBzZXR0aW5nIG5ldG1hc2tfc2V0dGluZyBfX3NldHRpbmcgPSB7CisJLm5hbWUgPSAibmV0bWFzayIsCisJLmRlc2NyaXB0aW9uID0gIklQdjQgc3VibmV0IG1hc2siLAorCS50YWcgPSBESENQX1NVQk5FVF9NQVNLLAorCS50eXBlID0gJnNldHRpbmdfdHlwZV9pcHY0LAorfTsKKworLyoqIERlZmF1bHQgZ2F0ZXdheSBzZXR0aW5nICovCitzdHJ1Y3Qgc2V0dGluZyBnYXRld2F5X3NldHRpbmcgX19zZXR0aW5nID0geworCS5uYW1lID0gImdhdGV3YXkiLAorCS5kZXNjcmlwdGlvbiA9ICJEZWZhdWx0IGdhdGV3YXkiLAorCS50YWcgPSBESENQX1JPVVRFUlMsCisJLnR5cGUgPSAmc2V0dGluZ190eXBlX2lwdjQsCit9OworCisvKioKKyAqIENyZWF0ZSBJUHY0IHJvdXRpbmcgdGFibGUgYmFzZWQgb24gY29uZmlndXJlZCBzZXR0aW5ncworICoKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlwdjRfY3JlYXRlX3JvdXRlcyAoIHZvaWQgKSB7CisJc3RydWN0IGlwdjRfbWluaXJvdXRlICptaW5pcm91dGU7CisJc3RydWN0IGlwdjRfbWluaXJvdXRlICp0bXA7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzOworCXN0cnVjdCBpbl9hZGRyIGFkZHJlc3MgPSB7IDAgfTsKKwlzdHJ1Y3QgaW5fYWRkciBuZXRtYXNrID0geyAwIH07CisJc3RydWN0IGluX2FkZHIgZ2F0ZXdheSA9IHsgMCB9OworCisJLyogRGVsZXRlIGFsbCBleGlzdGluZyByb3V0ZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKCBtaW5pcm91dGUsIHRtcCwgJmlwdjRfbWluaXJvdXRlcywgbGlzdCApCisJCWRlbF9pcHY0X21pbmlyb3V0ZSAoIG1pbmlyb3V0ZSApOworCisJLyogQ3JlYXRlIGEgcm91dGUgZm9yIGVhY2ggY29uZmlndXJlZCBuZXR3b3JrIGRldmljZSAqLworCWZvcl9lYWNoX25ldGRldiAoIG5ldGRldiApIHsKKwkJc2V0dGluZ3MgPSBuZXRkZXZfc2V0dGluZ3MgKCBuZXRkZXYgKTsKKwkJLyogR2V0IElQdjQgYWRkcmVzcyAqLworCQlhZGRyZXNzLnNfYWRkciA9IDA7CisJCWZldGNoX2lwdjRfc2V0dGluZyAoIHNldHRpbmdzLCAmaXBfc2V0dGluZywgJmFkZHJlc3MgKTsKKwkJaWYgKCAhIGFkZHJlc3Muc19hZGRyICkKKwkJCWNvbnRpbnVlOworCQkvKiBHZXQgc3VibmV0IG1hc2sgKi8KKwkJZmV0Y2hfaXB2NF9zZXR0aW5nICggc2V0dGluZ3MsICZuZXRtYXNrX3NldHRpbmcsICZuZXRtYXNrICk7CisJCS8qIENhbGN1bGF0ZSBkZWZhdWx0IG5ldG1hc2ssIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoICEgbmV0bWFzay5zX2FkZHIgKSB7CisJCQlpZiAoIElOX0NMQVNTQSAoIG50b2hsICggYWRkcmVzcy5zX2FkZHIgKSApICkgeworCQkJCW5ldG1hc2suc19hZGRyID0gaHRvbmwgKCBJTl9DTEFTU0FfTkVUICk7CisJCQl9IGVsc2UgaWYgKCBJTl9DTEFTU0IgKCBudG9obCAoIGFkZHJlc3Muc19hZGRyICkgKSApIHsKKwkJCQluZXRtYXNrLnNfYWRkciA9IGh0b25sICggSU5fQ0xBU1NCX05FVCApOworCQkJfSBlbHNlIGlmICggSU5fQ0xBU1NDICggbnRvaGwgKCBhZGRyZXNzLnNfYWRkciApICkgKSB7CisJCQkJbmV0bWFzay5zX2FkZHIgPSBodG9ubCAoIElOX0NMQVNTQ19ORVQgKTsKKwkJCX0KKwkJfQorCQkvKiBHZXQgZGVmYXVsdCBnYXRld2F5LCBpZiBwcmVzZW50ICovCisJCWZldGNoX2lwdjRfc2V0dGluZyAoIHNldHRpbmdzLCAmZ2F0ZXdheV9zZXR0aW5nLCAmZ2F0ZXdheSApOworCQkvKiBDb25maWd1cmUgcm91dGUgKi8KKwkJbWluaXJvdXRlID0gYWRkX2lwdjRfbWluaXJvdXRlICggbmV0ZGV2LCBhZGRyZXNzLAorCQkJCQkJIG5ldG1hc2ssIGdhdGV3YXkgKTsKKwkJaWYgKCAhIG1pbmlyb3V0ZSApCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqIElQdjQgc2V0dGluZ3MgYXBwbGljYXRvciAqLworc3RydWN0IHNldHRpbmdzX2FwcGxpY2F0b3IgaXB2NF9zZXR0aW5nc19hcHBsaWNhdG9yIF9fc2V0dGluZ3NfYXBwbGljYXRvciA9IHsKKwkuYXBwbHkgPSBpcHY0X2NyZWF0ZV9yb3V0ZXMsCit9OworCisvKiBEcmFnIGluIElDTVAgKi8KK1JFUVVJUkVfT0JKRUNUICggaWNtcCApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L2lwdjYuYyBiL2dweGUvc3JjL25ldC9pcHY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczMDhiYgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC9pcHY2LmMKQEAgLTAsMCArMSwzODEgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisjaW5jbHVkZSA8Z3B4ZS9pcDYuaD4KKyNpbmNsdWRlIDxncHhlL25kcC5oPgorI2luY2x1ZGUgPGdweGUvbGlzdC5oPgorI2luY2x1ZGUgPGdweGUvaWNtcDYuaD4KKyNpbmNsdWRlIDxncHhlL3RjcGlwLmg+CisjaW5jbHVkZSA8Z3B4ZS9zb2NrZXQuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisKK3N0cnVjdCBuZXRfcHJvdG9jb2wgaXB2Nl9wcm90b2NvbDsKKworLyogVW5zcGVjaWZpZWQgSVA2IGFkZHJlc3MgKi8KK3N0YXRpYyBzdHJ1Y3QgaW42X2FkZHIgaXA2X25vbmUgPSB7CisgICAgICAgIC5pbjZfdS51Nl9hZGRyMzIgPSB7IDAsMCwwLDAgfQorfTsKKworLyoqIEFuIElQdjYgcm91dGluZyB0YWJsZSBlbnRyeSAqLworc3RydWN0IGlwdjZfbWluaXJvdXRlIHsKKwkvKiBMaXN0IG9mIG1pbmlyb3V0ZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBOZXR3b3JrIGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwkvKiBEZXN0aW5hdGlvbiBwcmVmaXggKi8KKwlzdHJ1Y3QgaW42X2FkZHIgcHJlZml4OworCS8qIFByZWZpeCBsZW5ndGggKi8KKwlpbnQgcHJlZml4X2xlbjsKKwkvKiBJUHY2IGFkZHJlc3Mgb2YgaW50ZXJmYWNlICovCisJc3RydWN0IGluNl9hZGRyIGFkZHJlc3M7CisJLyogR2F0ZXdheSBhZGRyZXNzICovCisJc3RydWN0IGluNl9hZGRyIGdhdGV3YXk7Cit9OworCisvKiogTGlzdCBvZiBJUHY2IG1pbmlyb3V0ZXMgKi8KK3N0YXRpYyBMSVNUX0hFQUQgKCBtaW5pcm91dGVzICk7CisKKy8qKgorICogQWRkIElQdjYgbWluaXJvdXRpbmcgdGFibGUgZW50cnkKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBwcmVmaXgJCURlc3RpbmF0aW9uIHByZWZpeAorICogQHYgYWRkcmVzcwkJQWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlCisgKiBAdiBnYXRld2F5CQlHYXRld2F5IGFkZHJlc3MgKG9yIDo6MCBmb3Igbm8gZ2F0ZXdheSkKKyAqIEByZXQgbWluaXJvdXRlCVJvdXRpbmcgdGFibGUgZW50cnksIG9yIE5VTEwKKyAqLworc3RhdGljIHN0cnVjdCBpcHY2X21pbmlyb3V0ZSAqIF9fbWFsbG9jIAorYWRkX2lwdjZfbWluaXJvdXRlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGluNl9hZGRyIHByZWZpeCwKKwkJICAgICBpbnQgcHJlZml4X2xlbiwgc3RydWN0IGluNl9hZGRyIGFkZHJlc3MsCisJCSAgICAgc3RydWN0IGluNl9hZGRyIGdhdGV3YXkgKSB7CisJc3RydWN0IGlwdjZfbWluaXJvdXRlICptaW5pcm91dGU7CisJCisJbWluaXJvdXRlID0gbWFsbG9jICggc2l6ZW9mICggKm1pbmlyb3V0ZSApICk7CisJaWYgKCBtaW5pcm91dGUgKSB7CisJCS8qIFJlY29yZCByb3V0aW5nIGluZm9ybWF0aW9uICovCisJCW1pbmlyb3V0ZS0+bmV0ZGV2ID0gbmV0ZGV2X2dldCAoIG5ldGRldiApOworCQltaW5pcm91dGUtPnByZWZpeCA9IHByZWZpeDsKKwkJbWluaXJvdXRlLT5wcmVmaXhfbGVuID0gcHJlZml4X2xlbjsKKwkJbWluaXJvdXRlLT5hZGRyZXNzID0gYWRkcmVzczsKKwkJbWluaXJvdXRlLT5nYXRld2F5ID0gZ2F0ZXdheTsKKwkJCisJCS8qIEFkZCBtaW5pcm91dGUgdG8gbGlzdCBvZiBtaW5pcm91dGVzICovCisJCWlmICggIUlQNl9FUVVBTCAoIGdhdGV3YXksIGlwNl9ub25lICkgKSB7CisJCQlsaXN0X2FkZF90YWlsICggJm1pbmlyb3V0ZS0+bGlzdCwgJm1pbmlyb3V0ZXMgKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfYWRkICggJm1pbmlyb3V0ZS0+bGlzdCwgJm1pbmlyb3V0ZXMgKTsKKwkJfQorCX0KKworCXJldHVybiBtaW5pcm91dGU7Cit9CisKKy8qKgorICogRGVsZXRlIElQdjYgbWluaXJvdXRpbmcgdGFibGUgZW50cnkKKyAqCisgKiBAdiBtaW5pcm91dGUJCVJvdXRpbmcgdGFibGUgZW50cnkKKyAqLworc3RhdGljIHZvaWQgZGVsX2lwdjZfbWluaXJvdXRlICggc3RydWN0IGlwdjZfbWluaXJvdXRlICptaW5pcm91dGUgKSB7CisJbmV0ZGV2X3B1dCAoIG1pbmlyb3V0ZS0+bmV0ZGV2ICk7CisJbGlzdF9kZWwgKCAmbWluaXJvdXRlLT5saXN0ICk7CisJZnJlZSAoIG1pbmlyb3V0ZSApOworfQorCisvKioKKyAqIEFkZCBJUHY2IGludGVyZmFjZQorICoKKyAqIEB2IG5ldGRldglOZXR3b3JrIGRldmljZQorICogQHYgcHJlZml4CURlc3RpbmF0aW9uIHByZWZpeAorICogQHYgYWRkcmVzcwlBZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UKKyAqIEB2IGdhdGV3YXkJR2F0ZXdheSBhZGRyZXNzIChvciA6OjAgZm9yIG5vIGdhdGV3YXkpCisgKi8KK2ludCBhZGRfaXB2Nl9hZGRyZXNzICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGluNl9hZGRyIHByZWZpeCwKKwkJICAgICAgIGludCBwcmVmaXhfbGVuLCBzdHJ1Y3QgaW42X2FkZHIgYWRkcmVzcywKKwkJICAgICAgIHN0cnVjdCBpbjZfYWRkciBnYXRld2F5ICkgeworCXN0cnVjdCBpcHY2X21pbmlyb3V0ZSAqbWluaXJvdXRlOworCisJLyogQ2xlYXIgYW55IGV4aXN0aW5nIGFkZHJlc3MgZm9yIHRoaXMgbmV0IGRldmljZSAqLworCWRlbF9pcHY2X2FkZHJlc3MgKCBuZXRkZXYgKTsKKworCS8qIEFkZCBuZXcgbWluaXJvdXRlICovCisJbWluaXJvdXRlID0gYWRkX2lwdjZfbWluaXJvdXRlICggbmV0ZGV2LCBwcmVmaXgsIHByZWZpeF9sZW4sIGFkZHJlc3MsCisJCQkJCSBnYXRld2F5ICk7CisJaWYgKCAhIG1pbmlyb3V0ZSApCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVtb3ZlIElQdjYgaW50ZXJmYWNlCisgKgorICogQHYgbmV0ZGV2CU5ldHdvcmsgZGV2aWNlCisgKi8KK3ZvaWQgZGVsX2lwdjZfYWRkcmVzcyAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IGlwdjZfbWluaXJvdXRlICptaW5pcm91dGU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggbWluaXJvdXRlLCAmbWluaXJvdXRlcywgbGlzdCApIHsKKwkJaWYgKCBtaW5pcm91dGUtPm5ldGRldiA9PSBuZXRkZXYgKSB7CisJCQlkZWxfaXB2Nl9taW5pcm91dGUgKCBtaW5pcm91dGUgKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioKKyAqIENhbGN1bGF0ZSBUQ1BJUCBjaGVja3N1bQorICoKKyAqIEB2IGlvYnVmCUkvTyBidWZmZXIKKyAqIEB2IHRjcGlwCVRDUC9JUCBwcm90b2NvbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyB0aGUgcHNldWRvIGhlYWRlciBhbmQgY29tcGxldGVzIHRoZSBjaGVja3N1bSBpbiB0aGUKKyAqIHVwcGVyIGxheWVyIGhlYWRlci4KKyAqLworc3RhdGljIHVpbnQxNl90IGlwdjZfdHhfY3N1bSAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCB1aW50MTZfdCBjc3VtICkgeworCXN0cnVjdCBpcDZfaGVhZGVyICppcDZoZHIgPSBpb2J1Zi0+ZGF0YTsKKwlzdHJ1Y3QgaXB2Nl9wc2V1ZG9faGVhZGVyIHBzaGRyOworCisJLyogQ2FsY3VsYXRlIHBzZXVkbyBoZWFkZXIgKi8KKwltZW1zZXQgKCAmcHNoZHIsIDAsIHNpemVvZiAoIHBzaGRyICkgKTsKKwlwc2hkci5zcmMgPSBpcDZoZHItPnNyYzsKKwlwc2hkci5kZXN0ID0gaXA2aGRyLT5kZXN0OworCXBzaGRyLmxlbiA9IGh0b25zICggaW9iX2xlbiAoIGlvYnVmICkgLSBzaXplb2YgKCAqaXA2aGRyICkgKTsKKwlwc2hkci5ueHRfaGRyID0gaXA2aGRyLT5ueHRfaGRyOworCisJLyogVXBkYXRlIGNoZWNrc3VtIHZhbHVlICovCisJcmV0dXJuIHRjcGlwX2NvbnRpbnVlX2Noa3N1bSAoIGNzdW0sICZwc2hkciwgc2l6ZW9mICggcHNoZHIgKSApOworfQorCisvKioKKyAqIER1bXAgSVA2IGhlYWRlciBmb3IgZGVidWdnaW5nCisgKgorICogaXA2aGRyCUlQdjYgaGVhZGVyCisgKi8KK3ZvaWQgaXB2Nl9kdW1wICggc3RydWN0IGlwNl9oZWFkZXIgKmlwNmhkciApIHsKKwlEQkcgKCAiSVA2ICVwIHNyYyAlcyBkZXN0ICVzIG54dF9oZHIgJWQgbGVuICVkXG4iLCBpcDZoZHIsCisJICAgICAgaW5ldDZfbnRvYSAoIGlwNmhkci0+c3JjICksIGluZXQ2X250b2EgKCBpcDZoZHItPmRlc3QgKSwKKwkgICAgICBpcDZoZHItPm54dF9oZHIsIG50b2hzICggaXA2aGRyLT5wYXlsb2FkX2xlbiApICk7Cit9CisKKy8qKgorICogVHJhbnNtaXQgSVA2IHBhY2tldAorICoKKyAqIGlvYnVmCQlJL08gYnVmZmVyCisgKiB0Y3BpcAlUQ1AvSVAgcHJvdG9jb2wKKyAqIHN0X2Rlc3QJRGVzdGluYXRpb24gc29ja2V0IGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByZXBlbmRzIHRoZSBJUHY2IGhlYWRlcnMgdG8gdGhlIHBheWxvYWQgYW4gdHJhbnNtaXRzIGl0LgorICovCitzdGF0aWMgaW50IGlwdjZfdHggKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJICAgICBzdHJ1Y3QgdGNwaXBfcHJvdG9jb2wgKnRjcGlwLAorCQkgICAgIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3Rfc3JjIF9fdW51c2VkLAorCQkgICAgIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3RfZGVzdCwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgIHVpbnQxNl90ICp0cmFuc19jc3VtICkgeworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmRlc3QgPSAoIHN0cnVjdCBzb2NrYWRkcl9pbjYqICkgc3RfZGVzdDsKKwlzdHJ1Y3QgaW42X2FkZHIgbmV4dF9ob3A7CisJc3RydWN0IGlwdjZfbWluaXJvdXRlICptaW5pcm91dGU7CisJdWludDhfdCBsbF9kZXN0X2J1ZltNQVhfTExfQUREUl9MRU5dOworCWNvbnN0IHVpbnQ4X3QgKmxsX2Rlc3QgPSBsbF9kZXN0X2J1ZjsKKwlpbnQgcmM7CisKKwkvKiBDb25zdHJ1Y3QgdGhlIElQdjYgcGFja2V0ICovCisJc3RydWN0IGlwNl9oZWFkZXIgKmlwNmhkciA9IGlvYl9wdXNoICggaW9idWYsIHNpemVvZiAoICppcDZoZHIgKSApOworCW1lbXNldCAoIGlwNmhkciwgMCwgc2l6ZW9mICggKmlwNmhkcikgKTsKKwlpcDZoZHItPnZlcl90cmFmZmljX2NsYXNzX2Zsb3dfbGFiZWwgPSBodG9ubCAoIDB4NjAwMDAwMDAgKTsvL0lQNl9WRVJTSU9OOworCWlwNmhkci0+cGF5bG9hZF9sZW4gPSBodG9ucyAoIGlvYl9sZW4gKCBpb2J1ZiApIC0gc2l6ZW9mICggKmlwNmhkciApICk7CisJaXA2aGRyLT5ueHRfaGRyID0gdGNwaXAtPnRjcGlwX3Byb3RvOworCWlwNmhkci0+aG9wX2xpbWl0ID0gSVA2X0hPUF9MSU1JVDsgLy8gMjU1CisKKwkvKiBEZXRlcm1pbmUgdGhlIG5leHQgaG9wIGFkZHJlc3MgYW5kIGludGVyZmFjZQorCSAqCisJICogVE9ETzogSW1wbGVtZW50IHRoZSByb3V0aW5nIHRhYmxlLgorCSAqLworCW5leHRfaG9wID0gZGVzdC0+c2luNl9hZGRyOworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBtaW5pcm91dGUsICZtaW5pcm91dGVzLCBsaXN0ICkgeworCQlpZiAoICggbWVtY21wICggJmlwNmhkci0+ZGVzdCwgJm1pbmlyb3V0ZS0+cHJlZml4LAorCQkJCQltaW5pcm91dGUtPnByZWZpeF9sZW4gKSA9PSAwICkgfHwKKwkJICAgICAoIElQNl9FUVVBTCAoIG1pbmlyb3V0ZS0+Z2F0ZXdheSwgaXA2X25vbmUgKSApICkgeworCQkJbmV0ZGV2ID0gbWluaXJvdXRlLT5uZXRkZXY7CisJCQlpcDZoZHItPnNyYyA9IG1pbmlyb3V0ZS0+YWRkcmVzczsKKwkJCWlmICggISAoIElTX1VOU1BFQ0lGSUVEICggbWluaXJvdXRlLT5nYXRld2F5ICkgKSApIHsKKwkJCQluZXh0X2hvcCA9IG1pbmlyb3V0ZS0+Z2F0ZXdheTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCS8qIE5vIG5ldHdvcmsgaW50ZXJmYWNlIGlkZW50aWZpZWQgKi8KKwlpZiAoICFuZXRkZXYgKSB7CisJCURCRyAoICJObyByb3V0ZSB0byBob3N0ICVzXG4iLCBpbmV0Nl9udG9hICggaXA2aGRyLT5kZXN0ICkgKTsKKwkJcmMgPSAtRU5FVFVOUkVBQ0g7CisJCWdvdG8gZXJyOworCX0KKworCS8qIENvbXBsZXRlIHRoZSB0cmFuc3BvcnQgbGF5ZXIgY2hlY2tzdW0gKi8KKwlpZiAoIHRyYW5zX2NzdW0gKQorCQkqdHJhbnNfY3N1bSA9IGlwdjZfdHhfY3N1bSAoIGlvYnVmLCAqdHJhbnNfY3N1bSApOworCisJLyogUHJpbnQgSVB2NiBoZWFkZXIgKi8KKwlpcHY2X2R1bXAgKCBpcDZoZHIgKTsKKwkKKwkvKiBSZXNvbHZlIGxpbmsgbGF5ZXIgYWRkcmVzcyAqLworCWlmICggbmV4dF9ob3AuaW42X3UudTZfYWRkcjhbMF0gPT0gMHhmZiApIHsKKwkJbGxfZGVzdF9idWZbMF0gPSAweDMzOworCQlsbF9kZXN0X2J1ZlsxXSA9IDB4MzM7CisJCWxsX2Rlc3RfYnVmWzJdID0gbmV4dF9ob3AuaW42X3UudTZfYWRkcjhbMTJdOworCQlsbF9kZXN0X2J1ZlszXSA9IG5leHRfaG9wLmluNl91LnU2X2FkZHI4WzEzXTsKKwkJbGxfZGVzdF9idWZbNF0gPSBuZXh0X2hvcC5pbjZfdS51Nl9hZGRyOFsxNF07CisJCWxsX2Rlc3RfYnVmWzVdID0gbmV4dF9ob3AuaW42X3UudTZfYWRkcjhbMTVdOworCX0gZWxzZSB7CisJCS8qIFVuaWNhc3QgYWRkcmVzcyBuZWVkcyB0byBiZSByZXNvbHZlZCBieSBORFAgKi8KKwkJaWYgKCAoIHJjID0gbmRwX3Jlc29sdmUgKCBuZXRkZXYsICZuZXh0X2hvcCwgJmlwNmhkci0+c3JjLAorCQkJCQkgIGxsX2Rlc3RfYnVmICkgKSAhPSAwICkgeworCQkJREJHICggIk5vIGVudHJ5IGZvciAlc1xuIiwgaW5ldDZfbnRvYSAoIG5leHRfaG9wICkgKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJLyogVHJhbnNtaXQgcGFja2V0ICovCisJcmV0dXJuIG5ldF90eCAoIGlvYnVmLCBuZXRkZXYsICZpcHY2X3Byb3RvY29sLCBsbF9kZXN0ICk7CisKKyAgZXJyOgorCWZyZWVfaW9iICggaW9idWYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUHJvY2VzcyBuZXh0IElQNiBoZWFkZXIKKyAqCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKiBAdiBueHRfaGRyCU5leHQgaGVhZGVyIG51bWJlcgorICogQHYgc3JjCVNvdXJjZSBzb2NrZXQgYWRkcmVzcworICogQHYgZGVzdAlEZXN0aW5hdGlvbiBzb2NrZXQgYWRkcmVzcworICoKKyAqIFJlZmVyIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvaXB2Ni1wYXJhbWV0ZXJzIGZvciB0aGUgbnVtYmVycworICovCitzdGF0aWMgaW50IGlwdjZfcHJvY2Vzc19ueHRfaGRyICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHVpbnQ4X3Qgbnh0X2hkciwKKwkJc3RydWN0IHNvY2thZGRyX3RjcGlwICpzcmMsIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqZGVzdCApIHsKKwlzd2l0Y2ggKCBueHRfaGRyICkgeworCWNhc2UgSVA2X0hPUEJZSE9QOiAKKwljYXNlIElQNl9ST1VUSU5HOiAKKwljYXNlIElQNl9GUkFHTUVOVDogCisJY2FzZSBJUDZfQVVUSEVOVElDQVRJT046IAorCWNhc2UgSVA2X0RFU1RfT1BUUzogCisJY2FzZSBJUDZfRVNQOiAKKwkJREJHICggIkZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgaGVhZGVyICVkXG4iLCBueHRfaGRyICk7CisJCXJldHVybiAtRU5PU1lTOworCWNhc2UgSVA2X0lDTVA2OiAKKwkJYnJlYWs7CisJY2FzZSBJUDZfTk9fSEVBREVSOiAKKwkJREJHICggIk5vIG5leHQgaGVhZGVyXG4iICk7CisJCXJldHVybiAwOworCX0KKwkvKiBOZXh0IGhlYWRlciBpcyBub3QgYSBJUHY2IGV4dGVuc2lvbiBoZWFkZXIgKi8KKwlyZXR1cm4gdGNwaXBfcnggKCBpb2J1Ziwgbnh0X2hkciwgc3JjLCBkZXN0LCAwIC8qIGZpeG1lICovICk7Cit9CisKKy8qKgorICogUHJvY2VzcyBpbmNvbWluZyBJUDYgcGFja2V0cworICoKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBsbF9zb3VyY2UJCUxpbmstbGF5ZXIgc291cmNlIGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIElQdjYgcGFja2V0CisgKi8KK3N0YXRpYyBpbnQgaXB2Nl9yeCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkgICAgIF9fdW51c2VkIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSAgICAgX191bnVzZWQgY29uc3Qgdm9pZCAqbGxfc291cmNlICkgeworCisJc3RydWN0IGlwNl9oZWFkZXIgKmlwNmhkciA9IGlvYnVmLT5kYXRhOworCXVuaW9uIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiBzaW42OworCQlzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgc3Q7CisJfSBzcmMsIGRlc3Q7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIGlvYl9sZW4gKCBpb2J1ZiApIDwgc2l6ZW9mICggKmlwNmhkciApICkgeworCQlEQkcgKCAiUGFja2V0IHRvbyBzaG9ydCAoJXpkIGJ5dGVzKVxuIiwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkJZ290byBkcm9wOworCX0KKworCS8qIFRPRE86IFZlcmlmeSBjaGVja3N1bSAqLworCisJLyogUHJpbnQgSVA2IGhlYWRlciBmb3IgZGVidWdnaW5nICovCisJaXB2Nl9kdW1wICggaXA2aGRyICk7CisKKwkvKiBDaGVjayBoZWFkZXIgdmVyc2lvbiAqLworCWlmICggKCBpcDZoZHItPnZlcl90cmFmZmljX2NsYXNzX2Zsb3dfbGFiZWwgJiAweGYwMDAwMDAwICkgIT0gMHg2MDAwMDAwMCApIHsKKwkJREJHICggIkludmFsaWQgcHJvdG9jb2wgdmVyc2lvblxuIiApOworCQlnb3RvIGRyb3A7CisJfQorCisJLyogQ2hlY2sgdGhlIHBheWxvYWQgbGVuZ3RoICovCisJaWYgKCBudG9ocyAoIGlwNmhkci0+cGF5bG9hZF9sZW4gKSA+IGlvYl9sZW4gKCBpb2J1ZiApICkgeworCQlEQkcgKCAiSW5jb25zaXN0ZW50IHBhY2tldCBsZW5ndGggKCVkIGJ5dGVzKVxuIiwKKwkJCWlwNmhkci0+cGF5bG9hZF9sZW4gKTsKKwkJZ290byBkcm9wOworCX0KKworCS8qIElnbm9yZSB0aGUgdHJhZmZpYyBjbGFzcyBhbmQgZmxvdyBjb250cm9sIHZhbHVlcyAqLworCisJLyogQ29uc3RydWN0IHNvY2tldCBhZGRyZXNzICovCisJbWVtc2V0ICggJnNyYywgMCwgc2l6ZW9mICggc3JjICkgKTsKKwlzcmMuc2luNi5zaW5fZmFtaWx5ID0gQUZfSU5FVDY7CisJc3JjLnNpbjYuc2luNl9hZGRyID0gaXA2aGRyLT5zcmM7CisJbWVtc2V0ICggJmRlc3QsIDAsIHNpemVvZiAoIGRlc3QgKSApOworCWRlc3Quc2luNi5zaW5fZmFtaWx5ID0gQUZfSU5FVDY7CisJZGVzdC5zaW42LnNpbjZfYWRkciA9IGlwNmhkci0+ZGVzdDsKKworCS8qIFN0cmlwIGhlYWRlciAqLworCWlvYl91bnB1dCAoIGlvYnVmLCBpb2JfbGVuICggaW9idWYgKSAtIG50b2hzICggaXA2aGRyLT5wYXlsb2FkX2xlbiApIC0KKwkJCQkJCQlzaXplb2YgKCAqaXA2aGRyICkgKTsKKwlpb2JfcHVsbCAoIGlvYnVmLCBzaXplb2YgKCAqaXA2aGRyICkgKTsKKworCS8qIFNlbmQgaXQgdG8gdGhlIHRyYW5zcG9ydCBsYXllciAqLworCXJldHVybiBpcHY2X3Byb2Nlc3Nfbnh0X2hkciAoIGlvYnVmLCBpcDZoZHItPm54dF9oZHIsICZzcmMuc3QsICZkZXN0LnN0ICk7CisKKyAgZHJvcDoKKwlEQkcgKCAiUGFja2V0IGRyb3BwZWRcbiIgKTsKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIFByaW50IGEgSVA2IGFkZHJlc3MgYXMgeHh4eDp4eHh4Onh4eHg6eHh4eDp4eHh4Onh4eHg6eHh4eDp4eHh4CisgKi8KK2NoYXIgKiBpbmV0Nl9udG9hICggc3RydWN0IGluNl9hZGRyIGluNiApIHsKKwlzdGF0aWMgY2hhciBidWZbNDBdOworCXVpbnQxNl90ICpieXRlcyA9ICggdWludDE2X3QqICkgJmluNjsKKwlzcHJpbnRmICggYnVmLCAiJXg6JXg6JXg6JXg6JXg6JXg6JXg6JXgiLCBieXRlc1swXSwgYnl0ZXNbMV0sIGJ5dGVzWzJdLAorCQkJYnl0ZXNbM10sIGJ5dGVzWzRdLCBieXRlc1s1XSwgYnl0ZXNbNl0sIGJ5dGVzWzddICk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBpcHY2X250b2EgKCBjb25zdCB2b2lkICpuZXRfYWRkciApIHsKKwlyZXR1cm4gaW5ldDZfbnRvYSAoICogKCAoIHN0cnVjdCBpbjZfYWRkciAqICkgbmV0X2FkZHIgKSApOworfQorCisvKiogSVB2NiBwcm90b2NvbCAqLworc3RydWN0IG5ldF9wcm90b2NvbCBpcHY2X3Byb3RvY29sIF9fbmV0X3Byb3RvY29sID0geworCS5uYW1lID0gIklQdjYiLAorCS5uZXRfcHJvdG8gPSBodG9ucyAoIEVUSF9QX0lQVjYgKSwKKwkubmV0X2FkZHJfbGVuID0gc2l6ZW9mICggc3RydWN0IGluNl9hZGRyICksCisJLnJ4ID0gaXB2Nl9yeCwKKwkubnRvYSA9IGlwdjZfbnRvYSwKK307CisKKy8qKiBJUHY2IFRDUElQIG5ldCBwcm90b2NvbCAqLworc3RydWN0IHRjcGlwX25ldF9wcm90b2NvbCBpcHY2X3RjcGlwX3Byb3RvY29sIF9fdGNwaXBfbmV0X3Byb3RvY29sID0geworCS5uYW1lID0gIklQdjYiLAorCS5zYV9mYW1pbHkgPSBBRl9JTkVUNiwKKwkudHggPSBpcHY2X3R4LAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC9taWkuYyBiL2dweGUvc3JjL25ldC9taWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGU2NDQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L21paS5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorCisJbWlpLmM6IE1JSSBpbnRlcmZhY2UgbGlicmFyeQorCisJUG9ydGVkIHRvIGdQWEUgYnkgRGFuaWVsIFZlcmthbXAgPGRhbmllbEBkcnYubnU+CisJZnJvbSBMaW51eCBkcml2ZXJzL25ldC9taWkuYworCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDEsMjAwMiBKZWZmIEdhcnppaworCisJVmFyaW91cyBjb2RlIGNhbWUgZnJvbSBteXNvbjgwMy5jIGFuZCBvdGhlciBmaWxlcyBieQorCURvbmFsZCBCZWNrZXIuICBDb3B5cmlnaHQ6CisKKwkJV3JpdHRlbiAxOTk4LTIwMDIgYnkgRG9uYWxkIEJlY2tlci4KKworCQlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcKKwkJdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKwkJaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuICBEcml2ZXJzIGJhc2VkIG9uCisJCW9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4KKwkJVGhpcyBmaWxlIGlzIG5vdCBhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlCisJCXVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZyBzeXN0ZW0gaXMgbGljZW5zZWQKKwkJdW5kZXIgdGhlIEdQTC4KKworCQlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCQlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwkJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwkJQW5uYXBvbGlzIE1EIDIxNDAzCisKKyovCisKKyNpbmNsdWRlIDxtaWkuaD4KKworLyoqCisgKiBtaWlfbGlua19vayAtIGlzIGxpbmsgc3RhdHVzIHVwL29rCisgKiBAbWlpOiB0aGUgTUlJIGludGVyZmFjZQorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgTUlJIHJlcG9ydHMgbGluayBzdGF0dXMgdXAvb2ssIDAgb3RoZXJ3aXNlLgorICovCitpbnQKK21paV9saW5rX29rICggc3RydWN0IG1paV9pZl9pbmZvICptaWkgKQoreworCS8qIGZpcnN0LCBhIGR1bW15IHJlYWQsIG5lZWRlZCB0byBsYXRjaCBzb21lIE1JSSBwaHlzICovCisJbWlpLT5tZGlvX3JlYWQgKCBtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9CTVNSICk7CisJaWYgKCBtaWktPm1kaW9fcmVhZCAoIG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0JNU1IgKSAmIEJNU1JfTFNUQVRVUyApCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKioKKyAqIG1paV9jaGVja19saW5rIC0gY2hlY2sgTUlJIGxpbmsgc3RhdHVzCisgKiBAbWlpOiBNSUkgaW50ZXJmYWNlCisgKgorICogSWYgdGhlIGxpbmsgc3RhdHVzIGNoYW5nZWQgKHByZXZpb3VzICE9IGN1cnJlbnQpLCBjYWxsCisgKiBuZXRpZl9jYXJyaWVyX29uKCkgaWYgY3VycmVudCBsaW5rIHN0YXR1cyBpcyBVcCBvciBjYWxsCisgKiBuZXRpZl9jYXJyaWVyX29mZigpIGlmIGN1cnJlbnQgbGluayBzdGF0dXMgaXMgRG93bi4KKyAqLwordm9pZAorbWlpX2NoZWNrX2xpbmsgKCBzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSApCit7CisJaW50IGN1cl9saW5rID0gbWlpX2xpbmtfb2sgKCBtaWkgKTsKKwlpbnQgcHJldl9saW5rID0gbmV0ZGV2X2xpbmtfb2sgKCBtaWktPmRldiApOworCisJaWYgKCBjdXJfbGluayAmJiAhcHJldl9saW5rICkKKwkJbmV0ZGV2X2xpbmtfdXAgKCBtaWktPmRldiApOworCWVsc2UgaWYgKHByZXZfbGluayAmJiAhY3VyX2xpbmspCisJCW5ldGRldl9saW5rX2Rvd24gKCBtaWktPmRldiApOworfQorCisKKy8qKgorICogbWlpX2NoZWNrX21lZGlhIC0gY2hlY2sgdGhlIE1JSSBpbnRlcmZhY2UgZm9yIGEgZHVwbGV4IGNoYW5nZQorICogQG1paTogdGhlIE1JSSBpbnRlcmZhY2UKKyAqIEBva190b19wcmludDogT0sgdG8gcHJpbnQgbGluayB1cC9kb3duIG1lc3NhZ2VzCisgKiBAaW5pdF9tZWRpYTogT0sgdG8gc2F2ZSBkdXBsZXggbW9kZSBpbiBAbWlpCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBkdXBsZXggbW9kZSBjaGFuZ2VkLCAwIGlmIG5vdC4KKyAqIElmIHRoZSBtZWRpYSB0eXBlIGlzIGZvcmNlZCwgYWx3YXlzIHJldHVybnMgMC4KKyAqLwordW5zaWduZWQgaW50CittaWlfY2hlY2tfbWVkaWEgKCBzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBva190b19wcmludCwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbml0X21lZGlhICkKK3sKKwl1bnNpZ25lZCBpbnQgb2xkX2NhcnJpZXIsIG5ld19jYXJyaWVyOworCWludCBhZHZlcnRpc2UsIGxwYSwgbWVkaWEsIGR1cGxleDsKKwlpbnQgbHBhMiA9IDA7CisKKwkvKiBpZiBmb3JjZWQgbWVkaWEsIGdvIG5vIGZ1cnRoZXIgKi8KKwlpZiAobWlpLT5mb3JjZV9tZWRpYSkKKwkJcmV0dXJuIDA7IC8qIGR1cGxleCBkaWQgbm90IGNoYW5nZSAqLworCisJLyogY2hlY2sgY3VycmVudCBhbmQgb2xkIGxpbmsgc3RhdHVzICovCisJb2xkX2NhcnJpZXIgPSBuZXRkZXZfbGlua19vayAoIG1paS0+ZGV2ICkgPyAxIDogMDsKKwluZXdfY2FycmllciA9ICh1bnNpZ25lZCBpbnQpIG1paV9saW5rX29rICggbWlpICk7CisKKwkvKiBpZiBjYXJyaWVyIHN0YXRlIGRpZCBub3QgY2hhbmdlLCB0aGlzIGlzIGEgImJvdW5jZSIsCisJICoganVzdCBleGl0IGFzIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBzZXQgY29ycmVjdGx5CisJICovCisJaWYgKCAoICEgaW5pdF9tZWRpYSApICYmICggb2xkX2NhcnJpZXIgPT0gbmV3X2NhcnJpZXIgKSApCisJCXJldHVybiAwOyAvKiBkdXBsZXggZGlkIG5vdCBjaGFuZ2UgKi8KKworCS8qIG5vIGNhcnJpZXIsIG5vdGhpbmcgbXVjaCB0byBkbyAqLworCWlmICggISBuZXdfY2FycmllciApIHsKKwkJbmV0ZGV2X2xpbmtfZG93biAoIG1paS0+ZGV2ICk7CisJCWlmICggb2tfdG9fcHJpbnQgKQorCQkJREJHICggIiVzOiBsaW5rIGRvd25cbiIsIG1paS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7IC8qIGR1cGxleCBkaWQgbm90IGNoYW5nZSAqLworCX0KKworCS8qCisJICogd2UgaGF2ZSBjYXJyaWVyLCBzZWUgd2hvJ3Mgb24gdGhlIG90aGVyIGVuZAorCSAqLworCW5ldGRldl9saW5rX3VwICggbWlpLT5kZXYgKTsKKworCS8qIGdldCBNSUkgYWR2ZXJ0aXNlIGFuZCBMUEEgdmFsdWVzICovCisJaWYgKCAoICEgaW5pdF9tZWRpYSApICYmICggbWlpLT5hZHZlcnRpc2luZyApICkgeworCQlhZHZlcnRpc2UgPSBtaWktPmFkdmVydGlzaW5nOworCX0gZWxzZSB7CisJCWFkdmVydGlzZSA9IG1paS0+bWRpb19yZWFkICggbWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfQURWRVJUSVNFICk7CisJCW1paS0+YWR2ZXJ0aXNpbmcgPSBhZHZlcnRpc2U7CisJfQorCWxwYSA9IG1paS0+bWRpb19yZWFkICggbWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfTFBBICk7CisJaWYgKCBtaWktPnN1cHBvcnRzX2dtaWkgKQorCQlscGEyID0gbWlpLT5tZGlvX3JlYWQgKCBtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9TVEFUMTAwMCApOworCisJLyogZmlndXJlIG91dCBtZWRpYSBhbmQgZHVwbGV4IGZyb20gYWR2ZXJ0aXNlIGFuZCBMUEEgdmFsdWVzICovCisJbWVkaWEgPSBtaWlfbndheV9yZXN1bHQgKCBscGEgJiBhZHZlcnRpc2UgKTsKKwlkdXBsZXggPSAoIG1lZGlhICYgQURWRVJUSVNFX0ZVTEwgKSA/IDEgOiAwOworCWlmICggbHBhMiAmIExQQV8xMDAwRlVMTCApCisJCWR1cGxleCA9IDE7CisKKwlpZiAoIG9rX3RvX3ByaW50ICkKKwkJREJHICggIiVzOiBsaW5rIHVwLCAlc01icHMsICVzLWR1cGxleCwgbHBhIDB4JTA0WFxuIiwKKwkJICAgICAgIG1paS0+ZGV2LT5uYW1lLAorCQkgICAgICAgbHBhMiAmICggTFBBXzEwMDBGVUxMIHwgTFBBXzEwMDBIQUxGICkgPyAiMTAwMCIgOgorCQkgICAgICAgbWVkaWEgJiAoIEFEVkVSVElTRV8xMDBGVUxMIHwgQURWRVJUSVNFXzEwMEhBTEYgKSA/ICIxMDAiIDogIjEwIiwKKwkJICAgICAgIGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwKKwkJICAgICAgIGxwYSk7CisKKwlpZiAoICggaW5pdF9tZWRpYSApIHx8ICggbWlpLT5mdWxsX2R1cGxleCAhPSBkdXBsZXggKSApIHsKKwkJbWlpLT5mdWxsX2R1cGxleCA9IGR1cGxleDsKKwkJcmV0dXJuIDE7IC8qIGR1cGxleCBjaGFuZ2VkICovCisJfQorCisJcmV0dXJuIDA7IC8qIGR1cGxleCBkaWQgbm90IGNoYW5nZSAqLworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L25kcC5jIGIvZ3B4ZS9zcmMvbmV0L25kcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZWE4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvbmRwLmMKQEAgLTAsMCArMSwxODAgQEAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL25kcC5oPgorI2luY2x1ZGUgPGdweGUvaWNtcDYuaD4KKyNpbmNsdWRlIDxncHhlL2lwNi5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE5laWdoYm91ciBEaXNjb3ZlcnkgUHJvdG9jb2wKKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhZGRyZXNzIHJlc29sdXRpb24gYXMgc3BlY2lmaWVkIGJ5IHRoZSBuZWlnaGJvdXIKKyAqIGRpc2NvdmVyeSBwcm90b2NvbCBpbiBSRkMyNDYxLiBUaGlzIHByb3RvY29sIGlzIHBhcnQgb2YgdGhlIElQdjYgcHJvdG9jb2wKKyAqIGZhbWlseS4KKyAqLworCisvKiBBIG5laWdoYm91ciBlbnRyeSAqLworc3RydWN0IG5kcF9lbnRyeSB7CisJLyoqIFRhcmdldCBJUDYgYWRkcmVzcyAqLworCXN0cnVjdCBpbjZfYWRkciBpbjY7CisJLyoqIExpbmsgbGF5ZXIgcHJvdG9jb2wgKi8KKwlzdHJ1Y3QgbGxfcHJvdG9jb2wgKmxsX3Byb3RvY29sOworCS8qKiBMaW5rLWxheWVyIGFkZHJlc3MgKi8KKwl1aW50OF90IGxsX2FkZHJbTUFYX0xMX0FERFJfTEVOXTsKKwkvKiogU3RhdGUgb2YgdGhlIG5laWdoYm91ciBlbnRyeSAqLworCWludCBzdGF0ZTsKK307CisKKy8qKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbmVpZ2hib3VyIGNhY2hlIHRhYmxlICovCisjZGVmaW5lIE5VTV9ORFBfRU5UUklFUyA0CisKKy8qKiBUaGUgbmVpZ2hib3VyIGNhY2hlIHRhYmxlICovCitzdGF0aWMgc3RydWN0IG5kcF9lbnRyeSBuZHBfdGFibGVbTlVNX05EUF9FTlRSSUVTXTsKKyNkZWZpbmUgbmRwX3RhYmxlX2VuZCAmbmRwX3RhYmxlW05VTV9ORFBfRU5UUklFU10KKworc3RhdGljIHVuc2lnbmVkIGludCBuZXh0X25ld19uZHBfZW50cnkgPSAwOworCisvKioKKyAqIEZpbmQgZW50cnkgaW4gdGhlIG5laWdoYm91ciBjYWNoZQorICoKKyAqIEB2IGluNglJUDYgYWRkcmVzcworICovCitzdGF0aWMgc3RydWN0IG5kcF9lbnRyeSAqCituZHBfZmluZF9lbnRyeSAoIHN0cnVjdCBpbjZfYWRkciAqaW42ICkgeworCXN0cnVjdCBuZHBfZW50cnkgKm5kcDsKKworCWZvciAoIG5kcCA9IG5kcF90YWJsZSA7IG5kcCA8IG5kcF90YWJsZV9lbmQgOyBuZHArKyApIHsKKwkJaWYgKCBJUDZfRVFVQUwgKCAoICppbjYgKSwgbmRwLT5pbjYgKSAmJiAKKwkJICAgICAoIG5kcC0+c3RhdGUgIT0gTkRQX1NUQVRFX0lOVkFMSUQgKSApIHsKKwkJCXJldHVybiBuZHA7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogQWRkIE5EUCBlbnRyeQorICogCisgKiBAdiBuZXRkZXYJTmV0d29yayBkZXZpY2UKKyAqIEB2IGluNglJUDYgYWRkcmVzcworICogQHYgbGxfYWRkcglMaW5rLWxheWVyIGFkZHJlc3MKKyAqIEB2IHN0YXRlCVN0YXRlIG9mIHRoZSBlbnRyeSAtIG9uZSBvZiB0aGUgTkRQX1NUQVRFX1hYWCB2YWx1ZXMKKyAqLworc3RhdGljIHZvaWQgCithZGRfbmRwX2VudHJ5ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGluNl9hZGRyICppbjYsCisJCXZvaWQgKmxsX2FkZHIsIGludCBzdGF0ZSApIHsKKwlzdHJ1Y3QgbmRwX2VudHJ5ICpuZHA7CisJbmRwID0gJm5kcF90YWJsZVtuZXh0X25ld19uZHBfZW50cnkrKyAlIE5VTV9ORFBfRU5UUklFU107CisKKwkvKiBGaWxsIHVwIGVudHJ5ICovCisJbmRwLT5sbF9wcm90b2NvbCA9IG5ldGRldi0+bGxfcHJvdG9jb2w7CisJbWVtY3B5ICggJm5kcC0+aW42LCAmKCAqaW42ICksIHNpemVvZiAoICppbjYgKSApOworCWlmICggbGxfYWRkciApIHsKKwkJbWVtY3B5ICggbmRwLT5sbF9hZGRyLCBsbF9hZGRyLCBuZXRkZXYtPmxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApOworCX0gZWxzZSB7CisJCW1lbXNldCAoIG5kcC0+bGxfYWRkciwgMCwgbmV0ZGV2LT5sbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4gKTsKKwl9CisJbmRwLT5zdGF0ZSA9IHN0YXRlOworCURCRyAoICJOZXcgbmVpZ2hib3VyIGNhY2hlIGVudHJ5OiBJUDYgJXMgPT4gJXMgJXNcbiIsCisJICAgICAgaW5ldDZfbnRvYSAoIG5kcC0+aW42ICksIG5ldGRldi0+bGxfcHJvdG9jb2wtPm5hbWUsCisJICAgICAgbmV0ZGV2LT5sbF9wcm90b2NvbC0+bnRvYSAoIG5kcC0+bGxfYWRkciApICk7Cit9CisKKy8qKgorICogUmVzb2x2ZSB0aGUgbGluay1sYXllciBhZGRyZXNzCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgZGVzdAkJRGVzdGluYXRpb24gYWRkcmVzcworICogQHYgc3JjCQlTb3VyY2UgYWRkcmVzcworICogQHJldCBkZXN0X2xsX2FkZHIJRGVzdGluYXRpb24gbGluay1sYXllciBhZGRyZXNzIG9yIE5VTEwKKyAqIEByZXQgcmMJCVN0YXR1cworICoKKyAqIFRoaXMgZnVuY3Rpb24gbG9va3MgdXAgdGhlIG5laWdoYm91ciBjYWNoZSBmb3IgYW4gZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqIGRlc3RpbmF0aW9uIGFkZHJlc3MuIElmIGl0IGZpbmRzIGEgdmFsaWQgZW50cnksIGl0IGZpbGxzIHVwIGRlc3RfbGxfYWRkciBhbmQKKyAqIHJldHVybnMgMC4gT3RoZXJ3aXNlIGl0IHNlbmRzIGEgbmVpZ2hib3VyIHNvbGljaXRhdGlvbiB0byB0aGUgc29saWNpdGVkCisgKiBtdWx0aWNhc3QgYWRkcmVzcy4KKyAqLworaW50IG5kcF9yZXNvbHZlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGluNl9hZGRyICpkZXN0LAorCQkgIHN0cnVjdCBpbjZfYWRkciAqc3JjLCB2b2lkICpkZXN0X2xsX2FkZHIgKSB7CisJc3RydWN0IGxsX3Byb3RvY29sICpsbF9wcm90b2NvbCA9IG5ldGRldi0+bGxfcHJvdG9jb2w7CisJc3RydWN0IG5kcF9lbnRyeSAqbmRwOworCWludCByYzsKKworCW5kcCA9IG5kcF9maW5kX2VudHJ5ICggZGVzdCApOworCS8qIENoZWNrIGlmIHRoZSBlbnRyeSBpcyB2YWxpZCAqLworCWlmICggbmRwICYmIG5kcC0+c3RhdGUgPT0gTkRQX1NUQVRFX1JFQUNIQUJMRSApIHsKKwkJREJHICggIk5laWdoYm91ciBjYWNoZSBoaXQ6IElQNiAlcyA9PiAlcyAlc1xuIiwKKwkJICAgICAgaW5ldDZfbnRvYSAoICpkZXN0ICksIGxsX3Byb3RvY29sLT5uYW1lLAorCQkgICAgICBsbF9wcm90b2NvbC0+bnRvYSAoIG5kcC0+bGxfYWRkciApICk7CisJCW1lbWNweSAoIGRlc3RfbGxfYWRkciwgbmRwLT5sbF9hZGRyLCBsbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4gKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIGVudHJ5IHdhcyBhbHJlYWR5IGNyZWF0ZWQgKi8KKwlpZiAoIG5kcCApIHsKKwkJREJHICggIkF3YWl0aW5nIG5laWdoYm91ciBhZHZlcnRpc2VtZW50XG4iICk7CisJCS8qIEZvciB0ZXN0ICovCisvLwkJbmRwLT5zdGF0ZSA9IE5EUF9TVEFURV9SRUFDSEFCTEU7CisvLwkJbWVtY3B5ICggbmRwLT5sbF9hZGRyLCBuZXRkZXYtPmxsX2FkZHIsIDYgKTsKKy8vCQlhc3NlcnQgKCBuZHAtPmxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiA9PSA2ICk7CisvLwkJaWNtcDZfdGVzdF9uYWR2ZXJ0ICggbmV0ZGV2LCBkZXN0LCBuZHAtPmxsX2FkZHIgKTsKKy8vCQlhc3NlcnQgKCBuZHAtPnN0YXRlID09IE5EUF9TVEFURV9SRUFDSEFCTEUgKTsKKwkJLyogVGFrZSBpdCBvdXQgdGlsbCBoZXJlICovCisJCXJldHVybiAtRU5PRU5UOworCX0KKwlEQkcgKCAiTmVpZ2hib3VyIGNhY2hlIG1pc3M6IElQNiAlc1xuIiwgaW5ldDZfbnRvYSAoICpkZXN0ICkgKTsKKworCS8qIEFkZCBlbnRyeSBpbiB0aGUgbmVpZ2hib3VyIGNhY2hlICovCisJYWRkX25kcF9lbnRyeSAoIG5ldGRldiwgZGVzdCwgTlVMTCwgTkRQX1NUQVRFX0lOQ09NUExFVEUgKTsKKworCS8qIFNlbmQgbmVpZ2hib3VyIHNvbGljaXRhdGlvbiAqLworCWlmICggKCByYyA9IGljbXA2X3NlbmRfc29saWNpdCAoIG5ldGRldiwgc3JjLCBkZXN0ICkgKSAhPSAwICkgeworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqIFByb2Nlc3MgbmVpZ2hib3VyIGFkdmVydGlzZW1lbnQKKyAqCisgKiBAdiBpb2J1ZglJL08gYnVmZmVyCisgKiBAdiBzdF9zcmMJU291cmNlIGFkZHJlc3MKKyAqIEB2IHN0X2Rlc3QJRGVzdGluYXRpb24gYWRkcmVzcyAKKyAqLworaW50IG5kcF9wcm9jZXNzX2FkdmVydCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X3NyYyBfX3VudXNlZCwKKwkJCSAgIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3RfZGVzdCBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydCAqbmFkdmVydCA9IGlvYnVmLT5kYXRhOworCXN0cnVjdCBuZHBfZW50cnkgKm5kcDsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggaW9iX2xlbiAoIGlvYnVmICkgPCBzaXplb2YgKCAqbmFkdmVydCApICkgeworCQlEQkcgKCAiUGFja2V0IHRvbyBzaG9ydCAoJXpkIGJ5dGVzKVxuIiwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXNzZXJ0ICggbmFkdmVydC0+Y29kZSA9PSAwICk7CisJYXNzZXJ0ICggbmFkdmVydC0+ZmxhZ3MgJiBJQ01QNl9GTEFHU19TT0xJQ0lURUQgKTsKKwlhc3NlcnQgKCBuYWR2ZXJ0LT5vcHRfdHlwZSA9PSAyICk7CisKKwkvKiBVcGRhdGUgdGhlIG5laWdoYm91ciBjYWNoZSwgaWYgZW50cnkgaXMgcHJlc2VudCAqLworCW5kcCA9IG5kcF9maW5kX2VudHJ5ICggJm5hZHZlcnQtPnRhcmdldCApOworCWlmICggbmRwICkgeworCisJYXNzZXJ0ICggbmFkdmVydC0+b3B0X2xlbiA9PQorCQkJKCAoIDIgKyBuZHAtPmxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApIC8gOCApICk7CisKKwkJaWYgKCBJUDZfRVFVQUwgKCBuZHAtPmluNiwgbmFkdmVydC0+dGFyZ2V0ICkgKSB7CisJCQltZW1jcHkgKCBuZHAtPmxsX2FkZHIsIG5hZHZlcnQtPm9wdF9sbF9hZGRyLAorCQkJCSBuZHAtPmxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbiApOworCQkJbmRwLT5zdGF0ZSA9IE5EUF9TVEFURV9SRUFDSEFCTEU7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlEQkcgKCAiVW5zb2xpY2l0ZWQgYWR2ZXJ0aXNlbWVudCAoZHJvcHBpbmcgcGFja2V0KVxuIiApOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L25ldGRldl9zZXR0aW5ncy5jIGIvZ3B4ZS9zcmMvbmV0L25ldGRldl9zZXR0aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTQxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvbmV0ZGV2X3NldHRpbmdzLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9kaGNwLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKworLyoqIEBmaWxlCisgKgorICogTmV0d29yayBkZXZpY2UgY29uZmlndXJhdGlvbiBzZXR0aW5ncworICoKKyAqLworCisvKiogTmV0d29yayBkZXZpY2UgbmFtZWQgc2V0dGluZ3MgKi8KK3N0cnVjdCBzZXR0aW5nIG1hY19zZXR0aW5nIF9fc2V0dGluZyA9IHsKKwkubmFtZSA9ICJtYWMiLAorCS5kZXNjcmlwdGlvbiA9ICJNQUMgYWRkcmVzcyIsCisJLnR5cGUgPSAmc2V0dGluZ190eXBlX2hleCwKK307CitzdHJ1Y3Qgc2V0dGluZyBidXNpZF9zZXR0aW5nIF9fc2V0dGluZyA9IHsKKwkubmFtZSA9ICJidXNpZCIsCisJLmRlc2NyaXB0aW9uID0gIkJ1cyBJRCIsCisJLnR5cGUgPSAmc2V0dGluZ190eXBlX2hleCwKK307CisKKy8qKgorICogU3RvcmUgdmFsdWUgb2YgbmV0d29yayBkZXZpY2Ugc2V0dGluZworICoKKyAqIEB2IHNldHRpbmdzCQlTZXR0aW5ncyBibG9jaworICogQHYgc2V0dGluZwkJU2V0dGluZyB0byBzdG9yZQorICogQHYgZGF0YQkJU2V0dGluZyBkYXRhLCBvciBOVUxMIHRvIGNsZWFyIHNldHRpbmcKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIHNldHRpbmcgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbmV0ZGV2X3N0b3JlICggc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgc3RydWN0IHNldHRpbmcgKnNldHRpbmcsCisJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGNvbnRhaW5lcl9vZiAoIHNldHRpbmdzLCBzdHJ1Y3QgbmV0X2RldmljZSwKKwkJCQkJCSAgIHNldHRpbmdzLnNldHRpbmdzICk7CisKKwlpZiAoIHNldHRpbmdfY21wICggc2V0dGluZywgJm1hY19zZXR0aW5nICkgPT0gMCApIHsKKwkJaWYgKCBsZW4gIT0gbmV0ZGV2LT5sbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4gKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbWNweSAoIG5ldGRldi0+bGxfYWRkciwgZGF0YSwgbGVuICk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnZW5lcmljX3NldHRpbmdzX3N0b3JlICggc2V0dGluZ3MsIHNldHRpbmcsIGRhdGEsIGxlbiApOworfQorCisvKioKKyAqIEZldGNoIHZhbHVlIG9mIG5ldHdvcmsgZGV2aWNlIHNldHRpbmcKKyAqCisgKiBAdiBzZXR0aW5ncwkJU2V0dGluZ3MgYmxvY2sKKyAqIEB2IHNldHRpbmcJCVNldHRpbmcgdG8gZmV0Y2gKKyAqIEB2IGRhdGEJCVNldHRpbmcgZGF0YSwgb3IgTlVMTCB0byBjbGVhciBzZXR0aW5nCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBzZXR0aW5nIGRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IG5ldGRldl9mZXRjaCAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsIHN0cnVjdCBzZXR0aW5nICpzZXR0aW5nLAorCQkJICB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBjb250YWluZXJfb2YgKCBzZXR0aW5ncywgc3RydWN0IG5ldF9kZXZpY2UsCisJCQkJCQkgICBzZXR0aW5ncy5zZXR0aW5ncyApOworCXN0cnVjdCBkZXZpY2VfZGVzY3JpcHRpb24gKmRlc2MgPSAmbmV0ZGV2LT5kZXYtPmRlc2M7CisJc3RydWN0IGRoY3BfbmV0ZGV2X2Rlc2MgZGhjcF9kZXNjOworCisJaWYgKCBzZXR0aW5nX2NtcCAoIHNldHRpbmcsICZtYWNfc2V0dGluZyApID09IDAgKSB7CisJCWlmICggbGVuID4gbmV0ZGV2LT5sbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4gKQorCQkJbGVuID0gbmV0ZGV2LT5sbF9wcm90b2NvbC0+bGxfYWRkcl9sZW47CisJCW1lbWNweSAoIGRhdGEsIG5ldGRldi0+bGxfYWRkciwgbGVuICk7CisJCXJldHVybiBuZXRkZXYtPmxsX3Byb3RvY29sLT5sbF9hZGRyX2xlbjsKKwl9CisJaWYgKCBzZXR0aW5nX2NtcCAoIHNldHRpbmcsICZidXNpZF9zZXR0aW5nICkgPT0gMCApIHsKKwkJZGhjcF9kZXNjLnR5cGUgPSBkZXNjLT5idXNfdHlwZTsKKwkJZGhjcF9kZXNjLnZlbmRvciA9IGh0b25zICggZGVzYy0+dmVuZG9yICk7CisJCWRoY3BfZGVzYy5kZXZpY2UgPSBodG9ucyAoIGRlc2MtPmRldmljZSApOworCQlpZiAoIGxlbiA+IHNpemVvZiAoIGRoY3BfZGVzYyApICkKKwkJCWxlbiA9IHNpemVvZiAoIGRoY3BfZGVzYyApOworCQltZW1jcHkgKCBkYXRhLCAmZGhjcF9kZXNjLCBsZW4gKTsKKwkJcmV0dXJuIHNpemVvZiAoIGRoY3BfZGVzYyApOworCX0KKworCXJldHVybiBnZW5lcmljX3NldHRpbmdzX2ZldGNoICggc2V0dGluZ3MsIHNldHRpbmcsIGRhdGEsIGxlbiApOworfQorCisvKioKKyAqIENsZWFyIG5ldHdvcmsgZGV2aWNlIHNldHRpbmdzCisgKgorICogQHYgc2V0dGluZ3MJCVNldHRpbmdzIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIG5ldGRldl9jbGVhciAoIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MgKSB7CisJZ2VuZXJpY19zZXR0aW5nc19jbGVhciAoIHNldHRpbmdzICk7Cit9CisKKy8qKiBOZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIG9wZXJhdGlvbnMgKi8KK3N0cnVjdCBzZXR0aW5nc19vcGVyYXRpb25zIG5ldGRldl9zZXR0aW5nc19vcGVyYXRpb25zID0geworCS5zdG9yZSA9IG5ldGRldl9zdG9yZSwKKwkuZmV0Y2ggPSBuZXRkZXZfZmV0Y2gsCisJLmNsZWFyID0gbmV0ZGV2X2NsZWFyLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC9uZXRkZXZpY2UuYyBiL2dweGUvc3JjL25ldC9uZXRkZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTBkMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L25ldGRldmljZS5jCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z3B4ZS9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorI2luY2x1ZGUgPGdweGUvcHJvY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvaW5pdC5oPgorI2luY2x1ZGUgPGdweGUvZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9lcnJvcnRhYi5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE5ldHdvcmsgZGV2aWNlIG1hbmFnZW1lbnQKKyAqCisgKi8KKworLyoqIExpc3Qgb2YgbmV0d29yayBkZXZpY2VzICovCitzdHJ1Y3QgbGlzdF9oZWFkIG5ldF9kZXZpY2VzID0gTElTVF9IRUFEX0lOSVQgKCBuZXRfZGV2aWNlcyApOworCisvKiogTGlzdCBvZiBvcGVuIG5ldHdvcmsgZGV2aWNlcywgaW4gcmV2ZXJzZSBvcmRlciBvZiBvcGVuaW5nICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBvcGVuX25ldF9kZXZpY2VzID0gTElTVF9IRUFEX0lOSVQgKCBvcGVuX25ldF9kZXZpY2VzICk7CisKKy8qKiBEZWZhdWx0IGxpbmsgc3RhdHVzIGNvZGUgKi8KKyNkZWZpbmUgRVVOS05PV05fTElOS19TVEFUVVMgRUlOUFJPR1JFU1MKKworLyoqIEh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UgZm9yIHRoZSBkZWZhdWx0IGxpbmsgc3RhdHVzICovCitzdHJ1Y3QgZXJyb3J0YWIgbmV0ZGV2X2Vycm9yc1tdIF9fZXJyb3J0YWIgPSB7CisJeyBFVU5LTk9XTl9MSU5LX1NUQVRVUywgIlVua25vd24iIH0sCit9OworCisvKioKKyAqIE1hcmsgbmV0d29yayBkZXZpY2UgYXMgaGF2aW5nIGxpbmsgZG93bgorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqLwordm9pZCBuZXRkZXZfbGlua19kb3duICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKworCXN3aXRjaCAoIG5ldGRldi0+bGlua19yYyApIHsKKwljYXNlIDA6CisJY2FzZSAtRVVOS05PV05fTElOS19TVEFUVVM6CisJCW5ldGRldi0+bGlua19yYyA9IC1FTk9UQ09OTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogQXZvaWQgY2xvYmJlcmluZyBhIG1vcmUgZGV0YWlsZWQgbGluayBzdGF0dXMgY29kZSwKKwkJICogaWYgb25lIGlzIGFscmVhZHkgc2V0LgorCQkgKi8KKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIFJlY29yZCBuZXR3b3JrIGRldmljZSBzdGF0aXN0aWMKKyAqCisgKiBAdiBzdGF0cwkJTmV0d29yayBkZXZpY2Ugc3RhdGlzdGljcworICogQHYgcmMJCVN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIG5ldGRldl9yZWNvcmRfc3RhdCAoIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cywgaW50IHJjICkgeworCXN0cnVjdCBuZXRfZGV2aWNlX2Vycm9yICplcnJvcjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9lcnJvciAqbGVhc3RfY29tbW9uX2Vycm9yOworCXVuc2lnbmVkIGludCBpOworCisJLyogSWYgdGhpcyBpcyBub3QgYW4gZXJyb3IsIGp1c3QgdXBkYXRlIHRoZSBnb29kIGNvdW50ZXIgKi8KKwlpZiAoIHJjID09IDAgKSB7CisJCXN0YXRzLT5nb29kKys7CisJCXJldHVybjsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIGJhZCBjb3VudGVyICovCisJc3RhdHMtPmJhZCsrOworCisJLyogTG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBlcnJvciByZWNvcmQgKi8KKwlsZWFzdF9jb21tb25fZXJyb3IgPSAmc3RhdHMtPmVycm9yc1swXTsKKwlmb3IgKCBpID0gMCA7IGkgPCAoIHNpemVvZiAoIHN0YXRzLT5lcnJvcnMgKSAvCisJCQkgICAgc2l6ZW9mICggc3RhdHMtPmVycm9yc1swXSApICkgOyBpKysgKSB7CisJCWVycm9yID0gJnN0YXRzLT5lcnJvcnNbaV07CisJCS8qIFVwZGF0ZSBtYXRjaGluZyByZWNvcmQsIGlmIGZvdW5kICovCisJCWlmICggZXJyb3ItPnJjID09IHJjICkgeworCQkJZXJyb3ItPmNvdW50Kys7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCBlcnJvci0+Y291bnQgPCBsZWFzdF9jb21tb25fZXJyb3ItPmNvdW50ICkKKwkJCWxlYXN0X2NvbW1vbl9lcnJvciA9IGVycm9yOworCX0KKworCS8qIE92ZXJ3cml0ZSB0aGUgbGVhc3QgY29tbW9uIGVycm9yIHJlY29yZCAqLworCWxlYXN0X2NvbW1vbl9lcnJvci0+cmMgPSByYzsKKwlsZWFzdF9jb21tb25fZXJyb3ItPmNvdW50ID0gMTsKK30KKworLyoqCisgKiBUcmFuc21pdCByYXcgcGFja2V0IHZpYSBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUcmFuc21pdHMgdGhlIHBhY2tldCB2aWEgdGhlIHNwZWNpZmllZCBuZXR3b3JrIGRldmljZS4gIFRoaXMKKyAqIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgSS9PIGJ1ZmZlci4KKyAqLworaW50IG5ldGRldl90eCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCWludCByYzsKKworCURCR0MgKCBuZXRkZXYsICJORVRERVYgJXAgdHJhbnNtaXR0aW5nICVwICglcCslengpXG4iLAorCSAgICAgICBuZXRkZXYsIGlvYnVmLCBpb2J1Zi0+ZGF0YSwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKworCWxpc3RfYWRkX3RhaWwgKCAmaW9idWYtPmxpc3QsICZuZXRkZXYtPnR4X3F1ZXVlICk7CisKKwlpZiAoICEgKCBuZXRkZXYtPnN0YXRlICYgTkVUREVWX09QRU4gKSApIHsKKwkJcmMgPSAtRU5FVFVOUkVBQ0g7CisJCWdvdG8gZXJyOworCX0KKwkJCisJaWYgKCAoIHJjID0gbmV0ZGV2LT5vcC0+dHJhbnNtaXQgKCBuZXRkZXYsIGlvYnVmICkgKSAhPSAwICkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKKworIGVycjoKKwluZXRkZXZfdHhfY29tcGxldGVfZXJyICggbmV0ZGV2LCBpb2J1ZiwgcmMgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogQ29tcGxldGUgbmV0d29yayB0cmFuc21pc3Npb24KKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgcmMJCVBhY2tldCBzdGF0dXMgY29kZQorICoKKyAqIFRoZSBwYWNrZXQgbXVzdCBjdXJyZW50bHkgYmUgaW4gdGhlIG5ldHdvcmsgZGV2aWNlJ3MgVFggcXVldWUuCisgKi8KK3ZvaWQgbmV0ZGV2X3R4X2NvbXBsZXRlX2VyciAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwgaW50IHJjICkgeworCisJLyogVXBkYXRlIHN0YXRpc3RpY3MgY291bnRlciAqLworCW5ldGRldl9yZWNvcmRfc3RhdCAoICZuZXRkZXYtPnR4X3N0YXRzLCByYyApOworCWlmICggcmMgPT0gMCApIHsKKwkJREJHQyAoIG5ldGRldiwgIk5FVERFViAlcCB0cmFuc21pc3Npb24gJXAgY29tcGxldGVcbiIsCisJCSAgICAgICBuZXRkZXYsIGlvYnVmICk7CisJfSBlbHNlIHsKKwkJREJHQyAoIG5ldGRldiwgIk5FVERFViAlcCB0cmFuc21pc3Npb24gJXAgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgIG5ldGRldiwgaW9idWYsIHN0cmVycm9yICggcmMgKSApOworCX0KKworCS8qIENhdGNoIGRhdGEgY29ycnVwdGlvbiBhcyBlYXJseSBhcyBwb3NzaWJsZSAqLworCWFzc2VydCAoIGlvYnVmLT5saXN0Lm5leHQgIT0gTlVMTCApOworCWFzc2VydCAoIGlvYnVmLT5saXN0LnByZXYgIT0gTlVMTCApOworCisJLyogRGVxdWV1ZSBhbmQgZnJlZSBJL08gYnVmZmVyICovCisJbGlzdF9kZWwgKCAmaW9idWYtPmxpc3QgKTsKKwlmcmVlX2lvYiAoIGlvYnVmICk7Cit9CisKKy8qKgorICogQ29tcGxldGUgbmV0d29yayB0cmFuc21pc3Npb24KKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiByYwkJUGFja2V0IHN0YXR1cyBjb2RlCisgKgorICogQ29tcGxldGVzIHRoZSBvbGRlc3Qgb3V0c3RhbmRpbmcgcGFja2V0IGluIHRoZSBUWCBxdWV1ZS4KKyAqLwordm9pZCBuZXRkZXZfdHhfY29tcGxldGVfbmV4dF9lcnIgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcmMgKSB7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggaW9idWYsICZuZXRkZXYtPnR4X3F1ZXVlLCBsaXN0ICkgeworCQluZXRkZXZfdHhfY29tcGxldGVfZXJyICggbmV0ZGV2LCBpb2J1ZiwgcmMgKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoqCisgKiBGbHVzaCBkZXZpY2UncyB0cmFuc21pdCBxdWV1ZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbmV0ZGV2X3R4X2ZsdXNoICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKworCS8qIERpc2NhcmQgYW55IHBhY2tldHMgaW4gdGhlIFRYIHF1ZXVlICovCisJd2hpbGUgKCAhIGxpc3RfZW1wdHkgKCAmbmV0ZGV2LT50eF9xdWV1ZSApICkgeworCQluZXRkZXZfdHhfY29tcGxldGVfbmV4dF9lcnIgKCBuZXRkZXYsIC1FQ0FOQ0VMRUQgKTsKKwl9Cit9CisKKy8qKgorICogQWRkIHBhY2tldCB0byByZWNlaXZlIHF1ZXVlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgaW9idWYJCUkvTyBidWZmZXIsIG9yIE5VTEwKKyAqCisgKiBUaGUgcGFja2V0IGlzIGFkZGVkIHRvIHRoZSBuZXR3b3JrIGRldmljZSdzIFJYIHF1ZXVlLiAgVGhpcworICogZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBJL08gYnVmZmVyLgorICovCit2b2lkIG5ldGRldl9yeCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCisJREJHQyAoIG5ldGRldiwgIk5FVERFViAlcCByZWNlaXZlZCAlcCAoJXArJXp4KVxuIiwKKwkgICAgICAgbmV0ZGV2LCBpb2J1ZiwgaW9idWYtPmRhdGEsIGlvYl9sZW4gKCBpb2J1ZiApICk7CisKKwkvKiBFbnF1ZXVlIHBhY2tldCAqLworCWxpc3RfYWRkX3RhaWwgKCAmaW9idWYtPmxpc3QsICZuZXRkZXYtPnJ4X3F1ZXVlICk7CisKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyBjb3VudGVyICovCisJbmV0ZGV2X3JlY29yZF9zdGF0ICggJm5ldGRldi0+cnhfc3RhdHMsIDAgKTsKK30KKworLyoqCisgKiBEaXNjYXJkIHJlY2VpdmVkIHBhY2tldAorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyLCBvciBOVUxMCisgKiBAdiByYwkJUGFja2V0IHN0YXR1cyBjb2RlCisgKgorICogVGhlIHBhY2tldCBpcyBkaXNjYXJkZWQgYW5kIGFuIFJYIGVycm9yIGlzIHJlY29yZGVkLiAgVGhpcyBmdW5jdGlvbgorICogdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBJL08gYnVmZmVyLiAgQGMgaW9idWYgbWF5IGJlIE5VTEwgaWYsIGZvcgorICogZXhhbXBsZSwgdGhlIG5ldCBkZXZpY2Ugd2lzaGVzIHRvIHJlcG9ydCBhbiBlcnJvciBkdWUgdG8gYmVpbmcKKyAqIHVuYWJsZSB0byBhbGxvY2F0ZSBhbiBJL08gYnVmZmVyLgorICovCit2b2lkIG5ldGRldl9yeF9lcnIgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBpbnQgcmMgKSB7CisKKwlEQkdDICggbmV0ZGV2LCAiTkVUREVWICVwIGZhaWxlZCB0byByZWNlaXZlICVwOiAlc1xuIiwKKwkgICAgICAgbmV0ZGV2LCBpb2J1Ziwgc3RyZXJyb3IgKCByYyApICk7CisKKwkvKiBEaXNjYXJkIHBhY2tldCAqLworCWZyZWVfaW9iICggaW9idWYgKTsKKworCS8qIFVwZGF0ZSBzdGF0aXN0aWNzIGNvdW50ZXIgKi8KKwluZXRkZXZfcmVjb3JkX3N0YXQgKCAmbmV0ZGV2LT5yeF9zdGF0cywgcmMgKTsKK30KKworLyoqCisgKiBQb2xsIGZvciBjb21wbGV0ZWQgYW5kIHJlY2VpdmVkIHBhY2tldHMgb24gbmV0d29yayBkZXZpY2UKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKgorICogUG9sbHMgdGhlIG5ldHdvcmsgZGV2aWNlIGZvciBjb21wbGV0ZWQgdHJhbnNtaXNzaW9ucyBhbmQgcmVjZWl2ZWQKKyAqIHBhY2tldHMuICBBbnkgcmVjZWl2ZWQgcGFja2V0cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBSWCBwYWNrZXQgcXVldWUKKyAqIHZpYSBuZXRkZXZfcngoKS4KKyAqLwordm9pZCBuZXRkZXZfcG9sbCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisKKwlpZiAoIG5ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApCisJCW5ldGRldi0+b3AtPnBvbGwgKCBuZXRkZXYgKTsKK30KKworLyoqCisgKiBSZW1vdmUgcGFja2V0IGZyb20gZGV2aWNlJ3MgcmVjZWl2ZSBxdWV1ZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEByZXQgaW9idWYJCUkvTyBidWZmZXIsIG9yIE5VTEwKKyAqCisgKiBSZW1vdmVzIHRoZSBmaXJzdCBwYWNrZXQgZnJvbSB0aGUgZGV2aWNlJ3MgUlggcXVldWUgYW5kIHJldHVybnMgaXQuCisgKiBPd25lcnNoaXAgb2YgdGhlIHBhY2tldCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgY2FsbGVyLgorICovCitzdHJ1Y3QgaW9fYnVmZmVyICogbmV0ZGV2X3J4X2RlcXVldWUgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIGlvYnVmLCAmbmV0ZGV2LT5yeF9xdWV1ZSwgbGlzdCApIHsKKwkJbGlzdF9kZWwgKCAmaW9idWYtPmxpc3QgKTsKKwkJcmV0dXJuIGlvYnVmOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBGbHVzaCBkZXZpY2UncyByZWNlaXZlIHF1ZXVlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICovCitzdGF0aWMgdm9pZCBuZXRkZXZfcnhfZmx1c2ggKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCisJLyogRGlzY2FyZCBhbnkgcGFja2V0cyBpbiB0aGUgUlggcXVldWUgKi8KKwl3aGlsZSAoICggaW9idWYgPSBuZXRkZXZfcnhfZGVxdWV1ZSAoIG5ldGRldiApICkgKSB7CisJCW5ldGRldl9yeF9lcnIgKCBuZXRkZXYsIGlvYnVmLCAtRUNBTkNFTEVEICk7CisJfQorfQorCisvKioKKyAqIEZyZWUgbmV0d29yayBkZXZpY2UKKyAqCisgKiBAdiByZWZjbnQJCU5ldHdvcmsgZGV2aWNlIHJlZmVyZW5jZSBjb3VudGVyCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfbmV0ZGV2ICggc3RydWN0IHJlZmNudCAqcmVmY250ICkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPQorCQljb250YWluZXJfb2YgKCByZWZjbnQsIHN0cnVjdCBuZXRfZGV2aWNlLCByZWZjbnQgKTsKKwkKKwluZXRkZXZfdHhfZmx1c2ggKCBuZXRkZXYgKTsKKwluZXRkZXZfcnhfZmx1c2ggKCBuZXRkZXYgKTsKKwljbGVhcl9zZXR0aW5ncyAoIG5ldGRldl9zZXR0aW5ncyAoIG5ldGRldiApICk7CisJZnJlZSAoIG5ldGRldiApOworfQorCisvKioKKyAqIEFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgcHJpdl9zaXplCQlTaXplIG9mIHByaXZhdGUgZGF0YSBhcmVhIChuZXRfZGV2aWNlOjpwcml2KQorICogQHJldCBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlLCBvciBOVUxMCisgKgorICogQWxsb2NhdGVzIHNwYWNlIGZvciBhIG5ldHdvcmsgZGV2aWNlIGFuZCBpdHMgcHJpdmF0ZSBkYXRhIGFyZWEuCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICogYWxsb2NfbmV0ZGV2ICggc2l6ZV90IHByaXZfc2l6ZSApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXNpemVfdCB0b3RhbF9sZW47CisKKwl0b3RhbF9sZW4gPSAoIHNpemVvZiAoICpuZXRkZXYgKSArIHByaXZfc2l6ZSApOworCW5ldGRldiA9IHphbGxvYyAoIHRvdGFsX2xlbiApOworCWlmICggbmV0ZGV2ICkgeworCQluZXRkZXYtPnJlZmNudC5mcmVlID0gZnJlZV9uZXRkZXY7CisJCW5ldGRldi0+bGlua19yYyA9IC1FVU5LTk9XTl9MSU5LX1NUQVRVUzsKKwkJSU5JVF9MSVNUX0hFQUQgKCAmbmV0ZGV2LT50eF9xdWV1ZSApOworCQlJTklUX0xJU1RfSEVBRCAoICZuZXRkZXYtPnJ4X3F1ZXVlICk7CisJCW5ldGRldl9zZXR0aW5nc19pbml0ICggbmV0ZGV2ICk7CisJCW5ldGRldi0+cHJpdiA9ICggKCAoIHZvaWQgKiApIG5ldGRldiApICsgc2l6ZW9mICggKm5ldGRldiApICk7CisJfQorCXJldHVybiBuZXRkZXY7Cit9CisKKy8qKgorICogUmVnaXN0ZXIgbmV0d29yayBkZXZpY2UKKyAqCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBHaXZlcyB0aGUgbmV0d29yayBkZXZpY2UgYSBuYW1lIGFuZCBhZGRzIGl0IHRvIHRoZSBsaXN0IG9mIG5ldHdvcmsKKyAqIGRldmljZXMuCisgKi8KK2ludCByZWdpc3Rlcl9uZXRkZXYgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXN0YXRpYyB1bnNpZ25lZCBpbnQgaWZpbmRleCA9IDA7CisJaW50IHJjOworCisJLyogQ3JlYXRlIGRldmljZSBuYW1lICovCisJc25wcmludGYgKCBuZXRkZXYtPm5hbWUsIHNpemVvZiAoIG5ldGRldi0+bmFtZSApLCAibmV0JWQiLAorCQkgICBpZmluZGV4KysgKTsKKworCS8qIFNldCBpbml0aWFsIGxpbmstbGF5ZXIgYWRkcmVzcyAqLworCW5ldGRldi0+bGxfcHJvdG9jb2wtPmluaXRfYWRkciAoIG5ldGRldi0+aHdfYWRkciwgbmV0ZGV2LT5sbF9hZGRyICk7CisKKwkvKiBSZWdpc3RlciBwZXItbmV0ZGV2IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlpZiAoICggcmMgPSByZWdpc3Rlcl9zZXR0aW5ncyAoIG5ldGRldl9zZXR0aW5ncyAoIG5ldGRldiApLAorCQkJCQlOVUxMICkgKSAhPSAwICkgeworCQlEQkdDICggbmV0ZGV2LCAiTkVUREVWICVwIGNvdWxkIG5vdCByZWdpc3RlciBzZXR0aW5nczogJXNcbiIsCisJCSAgICAgICBuZXRkZXYsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogQWRkIHRvIGRldmljZSBsaXN0ICovCisJbmV0ZGV2X2dldCAoIG5ldGRldiApOworCWxpc3RfYWRkX3RhaWwgKCAmbmV0ZGV2LT5saXN0LCAmbmV0X2RldmljZXMgKTsKKwlEQkdDICggbmV0ZGV2LCAiTkVUREVWICVwIHJlZ2lzdGVyZWQgYXMgJXMgKHBoeXMgJXMgaHdhZGRyICVzKVxuIiwKKwkgICAgICAgbmV0ZGV2LCBuZXRkZXYtPm5hbWUsIG5ldGRldi0+ZGV2LT5uYW1lLAorCSAgICAgICBuZXRkZXZfYWRkciAoIG5ldGRldiApICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBPcGVuIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBuZXRkZXZfb3BlbiAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJaW50IHJjOworCisJLyogRG8gbm90aGluZyBpZiBkZXZpY2UgaXMgYWxyZWFkeSBvcGVuICovCisJaWYgKCBuZXRkZXYtPnN0YXRlICYgTkVUREVWX09QRU4gKQorCQlyZXR1cm4gMDsKKworCURCR0MgKCBuZXRkZXYsICJORVRERVYgJXAgb3BlbmluZ1xuIiwgbmV0ZGV2ICk7CisKKwkvKiBPcGVuIHRoZSBkZXZpY2UgKi8KKwlpZiAoICggcmMgPSBuZXRkZXYtPm9wLT5vcGVuICggbmV0ZGV2ICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogTWFyayBhcyBvcGVuZWQgKi8KKwluZXRkZXYtPnN0YXRlIHw9IE5FVERFVl9PUEVOOworCisJLyogQWRkIHRvIGhlYWQgb2Ygb3BlbiBkZXZpY2VzIGxpc3QgKi8KKwlsaXN0X2FkZCAoICZuZXRkZXYtPm9wZW5fbGlzdCwgJm9wZW5fbmV0X2RldmljZXMgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIENsb3NlIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICovCit2b2lkIG5ldGRldl9jbG9zZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisKKwkvKiBEbyBub3RoaW5nIGlmIGRldmljZSBpcyBhbHJlYWR5IGNsb3NlZCAqLworCWlmICggISAoIG5ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApICkKKwkJcmV0dXJuOworCisJREJHQyAoIG5ldGRldiwgIk5FVERFViAlcCBjbG9zaW5nXG4iLCBuZXRkZXYgKTsKKworCS8qIENsb3NlIHRoZSBkZXZpY2UgKi8KKwluZXRkZXYtPm9wLT5jbG9zZSAoIG5ldGRldiApOworCisJLyogRmx1c2ggVFggYW5kIFJYIHF1ZXVlcyAqLworCW5ldGRldl90eF9mbHVzaCAoIG5ldGRldiApOworCW5ldGRldl9yeF9mbHVzaCAoIG5ldGRldiApOworCisJLyogTWFyayBhcyBjbG9zZWQgKi8KKwluZXRkZXYtPnN0YXRlICY9IH5ORVRERVZfT1BFTjsKKworCS8qIFJlbW92ZSBmcm9tIG9wZW4gZGV2aWNlcyBsaXN0ICovCisJbGlzdF9kZWwgKCAmbmV0ZGV2LT5vcGVuX2xpc3QgKTsKK30KKworLyoqCisgKiBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICoKKyAqIFJlbW92ZXMgdGhlIG5ldHdvcmsgZGV2aWNlIGZyb20gdGhlIGxpc3Qgb2YgbmV0d29yayBkZXZpY2VzLgorICovCit2b2lkIHVucmVnaXN0ZXJfbmV0ZGV2ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKworCS8qIEVuc3VyZSBkZXZpY2UgaXMgY2xvc2VkICovCisJbmV0ZGV2X2Nsb3NlICggbmV0ZGV2ICk7CisKKwkvKiBVbnJlZ2lzdGVyIHBlci1uZXRkZXYgY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLworCXVucmVnaXN0ZXJfc2V0dGluZ3MgKCBuZXRkZXZfc2V0dGluZ3MgKCBuZXRkZXYgKSApOworCisJLyogUmVtb3ZlIGZyb20gZGV2aWNlIGxpc3QgKi8KKwlsaXN0X2RlbCAoICZuZXRkZXYtPmxpc3QgKTsKKwluZXRkZXZfcHV0ICggbmV0ZGV2ICk7CisJREJHQyAoIG5ldGRldiwgIk5FVERFViAlcCB1bnJlZ2lzdGVyZWRcbiIsIG5ldGRldiApOworfQorCisvKiogRW5hYmxlIG9yIGRpc2FibGUgaW50ZXJydXB0cworICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IGVuYWJsZQkJSW50ZXJydXB0cyBzaG91bGQgYmUgZW5hYmxlZAorICovCit2b2lkIG5ldGRldl9pcnEgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgZW5hYmxlICkgeworCW5ldGRldi0+b3AtPmlycSAoIG5ldGRldiwgZW5hYmxlICk7Cit9CisKKy8qKgorICogR2V0IG5ldHdvcmsgZGV2aWNlIGJ5IG5hbWUKKyAqCisgKiBAdiBuYW1lCQlOZXR3b3JrIGRldmljZSBuYW1lCisgKiBAcmV0IG5ldGRldgkJTmV0d29yayBkZXZpY2UsIG9yIE5VTEwKKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKiBmaW5kX25ldGRldiAoIGNvbnN0IGNoYXIgKm5hbWUgKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBuZXRkZXYsICZuZXRfZGV2aWNlcywgbGlzdCApIHsKKwkJaWYgKCBzdHJjbXAgKCBuZXRkZXYtPm5hbWUsIG5hbWUgKSA9PSAwICkKKwkJCXJldHVybiBuZXRkZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogR2V0IG5ldHdvcmsgZGV2aWNlIGJ5IFBDSSBidXM6ZGV2LmZuIGFkZHJlc3MKKyAqCisgKiBAdiBidXNfdHlwZQkJQnVzIHR5cGUKKyAqIEB2IGxvY2F0aW9uCQlCdXMgbG9jYXRpb24KKyAqIEByZXQgbmV0ZGV2CQlOZXR3b3JrIGRldmljZSwgb3IgTlVMTAorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqIGZpbmRfbmV0ZGV2X2J5X2xvY2F0aW9uICggdW5zaWduZWQgaW50IGJ1c190eXBlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbG9jYXRpb24gKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBuZXRkZXYsICZuZXRfZGV2aWNlcywgbGlzdCApIHsKKwkJaWYgKCAoIG5ldGRldi0+ZGV2LT5kZXNjLmJ1c190eXBlID09IGJ1c190eXBlICkgJiYKKwkJICAgICAoIG5ldGRldi0+ZGV2LT5kZXNjLmxvY2F0aW9uID09IGxvY2F0aW9uICkgKQorCQkJcmV0dXJuIG5ldGRldjsKKwl9CisKKwlyZXR1cm4gTlVMTDsJCit9CisKKy8qKgorICogR2V0IG1vc3QgcmVjZW50bHkgb3BlbmVkIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHJldCBuZXRkZXYJCU1vc3QgcmVjZW50bHkgb3BlbmVkIG5ldHdvcmsgZGV2aWNlLCBvciBOVUxMCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICogbGFzdF9vcGVuZWRfbmV0ZGV2ICggdm9pZCApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIG5ldGRldiwgJm9wZW5fbmV0X2RldmljZXMsIG9wZW5fbGlzdCApIHsKKwkJYXNzZXJ0ICggbmV0ZGV2LT5zdGF0ZSAmIE5FVERFVl9PUEVOICk7CisJCXJldHVybiBuZXRkZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogVHJhbnNtaXQgbmV0d29yay1sYXllciBwYWNrZXQKKyAqCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgbmV0X3Byb3RvY29sCU5ldHdvcmstbGF5ZXIgcHJvdG9jb2wKKyAqIEB2IGxsX2Rlc3QJCURlc3RpbmF0aW9uIGxpbmstbGF5ZXIgYWRkcmVzcworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogUHJlcGVuZHMgbGluay1sYXllciBoZWFkZXJzIHRvIHRoZSBJL08gYnVmZmVyIGFuZCB0cmFuc21pdHMgdGhlCisgKiBwYWNrZXQgdmlhIHRoZSBzcGVjaWZpZWQgbmV0d29yayBkZXZpY2UuICBUaGlzIGZ1bmN0aW9uIHRha2VzCisgKiBvd25lcnNoaXAgb2YgdGhlIEkvTyBidWZmZXIuCisgKi8KK2ludCBuZXRfdHggKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1Ziwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkgICAgIHN0cnVjdCBuZXRfcHJvdG9jb2wgKm5ldF9wcm90b2NvbCwgY29uc3Qgdm9pZCAqbGxfZGVzdCApIHsKKwlzdHJ1Y3QgbGxfcHJvdG9jb2wgKmxsX3Byb3RvY29sID0gbmV0ZGV2LT5sbF9wcm90b2NvbDsKKwlpbnQgcmM7CisKKwkvKiBGb3JjZSBhIHBvbGwgb24gdGhlIG5ldGRldmljZSB0byAocG90ZW50aWFsbHkpIGNsZWFyIGFueQorCSAqIGJhY2tlZC11cCBUWCBjb21wbGV0aW9ucy4gIFRoaXMgaXMgbmVlZGVkIG9uIHNvbWUgbmV0d29yaworCSAqIGRldmljZXMgdG8gYXZvaWQgZXhjZXNzaXZlIGxvc3NlcyBkdWUgdG8gc21hbGwgVFggcmluZworCSAqIHNpemVzLgorCSAqLworCW5ldGRldl9wb2xsICggbmV0ZGV2ICk7CisKKwkvKiBBZGQgbGluay1sYXllciBoZWFkZXIgKi8KKwlpZiAoICggcmMgPSBsbF9wcm90b2NvbC0+cHVzaCAoIG5ldGRldiwgaW9idWYsIGxsX2Rlc3QsIG5ldGRldi0+bGxfYWRkciwKKwkJCQkJbmV0X3Byb3RvY29sLT5uZXRfcHJvdG8gKSApICE9IDAgKSB7CisJCWZyZWVfaW9iICggaW9idWYgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFRyYW5zbWl0IHBhY2tldCAqLworCXJldHVybiBuZXRkZXZfdHggKCBuZXRkZXYsIGlvYnVmICk7Cit9CisKKy8qKgorICogUHJvY2VzcyByZWNlaXZlZCBuZXR3b3JrLWxheWVyIHBhY2tldAorICoKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBuZXRfcHJvdG8JCU5ldHdvcmstbGF5ZXIgcHJvdG9jb2wsIGluIG5ldHdvcmstYnl0ZSBvcmRlcgorICogQHYgbGxfc291cmNlCQlTb3VyY2UgbGluay1sYXllciBhZGRyZXNzCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IG5ldF9yeCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCSAgICAgdWludDE2X3QgbmV0X3Byb3RvLCBjb25zdCB2b2lkICpsbF9zb3VyY2UgKSB7CisJc3RydWN0IG5ldF9wcm90b2NvbCAqbmV0X3Byb3RvY29sOworCisJLyogSGFuZCBvZmYgdG8gbmV0d29yay1sYXllciBwcm90b2NvbCwgaWYgYW55ICovCisJZm9yX2VhY2hfdGFibGVfZW50cnkgKCBuZXRfcHJvdG9jb2wsIE5FVF9QUk9UT0NPTFMgKSB7CisJCWlmICggbmV0X3Byb3RvY29sLT5uZXRfcHJvdG8gPT0gbmV0X3Byb3RvICkKKwkJCXJldHVybiBuZXRfcHJvdG9jb2wtPnJ4ICggaW9idWYsIG5ldGRldiwgbGxfc291cmNlICk7CisJfQorCisJREJHQyAoIG5ldGRldiwgIk5FVERFViAlcCB1bmtub3duIG5ldHdvcmsgcHJvdG9jb2wgJTA0eFxuIiwKKwkgICAgICAgbmV0ZGV2LCBudG9ocyAoIG5ldF9wcm90byApICk7CisJZnJlZV9pb2IgKCBpb2J1ZiApOworCXJldHVybiAwOworfQorCisvKioKKyAqIFNpbmdsZS1zdGVwIHRoZSBuZXR3b3JrIHN0YWNrCisgKgorICogQHYgcHJvY2VzcwkJTmV0d29yayBzdGFjayBwcm9jZXNzCisgKgorICogVGhpcyBwb2xscyBhbGwgaW50ZXJmYWNlcyBmb3IgcmVjZWl2ZWQgcGFja2V0cywgYW5kIHByb2Nlc3NlcworICogcGFja2V0cyBmcm9tIHRoZSBSWCBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgbmV0X3N0ZXAgKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcyBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXN0cnVjdCBsbF9wcm90b2NvbCAqbGxfcHJvdG9jb2w7CisJY29uc3Qgdm9pZCAqbGxfZGVzdDsKKwljb25zdCB2b2lkICpsbF9zb3VyY2U7CisJdWludDE2X3QgbmV0X3Byb3RvOworCWludCByYzsKKworCS8qIFBvbGwgYW5kIHByb2Nlc3MgZWFjaCBuZXR3b3JrIGRldmljZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBuZXRkZXYsICZuZXRfZGV2aWNlcywgbGlzdCApIHsKKworCQkvKiBQb2xsIGZvciBuZXcgcGFja2V0cyAqLworCQluZXRkZXZfcG9sbCAoIG5ldGRldiApOworCisJCS8qIFByb2Nlc3MgYXQgbW9zdCBvbmUgcmVjZWl2ZWQgcGFja2V0LiAgR2l2ZSBwcmlvcml0eQorCQkgKiB0byBnZXR0aW5nIHBhY2tldHMgb3V0IG9mIHRoZSBOSUMgb3ZlciBwcm9jZXNzaW5nCisJCSAqIHRoZSByZWNlaXZlZCBwYWNrZXRzLCBiZWNhdXNlIHdlIGFkdmVydGlzZSBhIHdpbmRvdworCQkgKiB0aGF0IGFzc3VtZXMgdGhhdCB3ZSBjYW4gcmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhlCisJCSAqIE5JQyBmYXN0ZXIgdGhhbiB0aGV5IGFycml2ZS4KKwkJICovCisJCWlmICggKCBpb2J1ZiA9IG5ldGRldl9yeF9kZXF1ZXVlICggbmV0ZGV2ICkgKSApIHsKKworCQkJREJHQyAoIG5ldGRldiwgIk5FVERFViAlcCBwcm9jZXNzaW5nICVwICglcCslengpXG4iLAorCQkJICAgICAgIG5ldGRldiwgaW9idWYsIGlvYnVmLT5kYXRhLAorCQkJICAgICAgIGlvYl9sZW4gKCBpb2J1ZiApICk7CisKKwkJCS8qIFJlbW92ZSBsaW5rLWxheWVyIGhlYWRlciAqLworCQkJbGxfcHJvdG9jb2wgPSBuZXRkZXYtPmxsX3Byb3RvY29sOworCQkJaWYgKCAoIHJjID0gbGxfcHJvdG9jb2wtPnB1bGwgKCBuZXRkZXYsIGlvYnVmLAorCQkJCQkJCSZsbF9kZXN0LCAmbGxfc291cmNlLAorCQkJCQkJCSZuZXRfcHJvdG8gKSApICE9IDAgKSB7CisJCQkJZnJlZV9pb2IgKCBpb2J1ZiApOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQluZXRfcnggKCBpb2J1ZiwgbmV0ZGV2LCBuZXRfcHJvdG8sIGxsX3NvdXJjZSApOworCQl9CisJfQorfQorCisvKiogTmV0d29ya2luZyBzdGFjayBwcm9jZXNzICovCitzdHJ1Y3QgcHJvY2VzcyBuZXRfcHJvY2VzcyBfX3Blcm1hbmVudF9wcm9jZXNzID0geworCS5saXN0ID0gTElTVF9IRUFEX0lOSVQgKCBuZXRfcHJvY2Vzcy5saXN0ICksCisJLnN0ZXAgPSBuZXRfc3RlcCwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvbnVsbG5ldC5jIGIvZ3B4ZS9zcmMvbmV0L251bGxuZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODFmMDJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L251bGxuZXQuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKworLyoqIEBmaWxlCisgKgorICogTnVsbCBuZXR3b3JrIGRldmljZQorICoKKyAqLworCitzdGF0aWMgaW50IG51bGxfb3BlbiAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgX191bnVzZWQgKSB7CisJcmV0dXJuIC1FTk9ERVY7Cit9OworCitzdGF0aWMgdm9pZCBudWxsX2Nsb3NlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiBfX3VudXNlZCApIHsKKwkvKiBEbyBub3RoaW5nICovCit9OworCitzdGF0aWMgaW50IG51bGxfdHJhbnNtaXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2IF9fdW51c2VkLAorCQkJICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgX191bnVzZWQgKSB7CisJcmV0dXJuIC1FTk9ERVY7Cit9OworCitzdGF0aWMgdm9pZCBudWxsX3BvbGwgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2IF9fdW51c2VkICkgeworCS8qIERvIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHZvaWQgbnVsbF9pcnEgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2IF9fdW51c2VkLAorCQkgICAgICAgaW50IGVuYWJsZSBfX3VudXNlZCApIHsKKwkvKiBEbyBub3RoaW5nICovCit9CisKK3N0cnVjdCBuZXRfZGV2aWNlX29wZXJhdGlvbnMgbnVsbF9uZXRkZXZfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBudWxsX29wZW4sCisJLmNsb3NlCQk9IG51bGxfY2xvc2UsCisJLnRyYW5zbWl0CT0gbnVsbF90cmFuc21pdCwKKwkucG9sbAkJPSBudWxsX3BvbGwsCisJLmlycSAgIAkJPSBudWxsX2lycSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvcmFycC5jIGIvZ3B4ZS9zcmMvbmV0L3JhcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDBkZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L3JhcnAuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL25ldGRldmljZS5oPgorI2luY2x1ZGUgPGdweGUvaW9idWYuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9yYXJwLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFJldmVyc2UgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sCisgKgorICovCisKKy8qKgorICogUHJvY2VzcyBpbmNvbWluZyBBUlAgcGFja2V0cworICoKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBsbF9zb3VyY2UJCUxpbmstbGF5ZXIgc291cmNlIGFkZHJlc3MKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgaXMgYSBkdW1teSBtZXRob2Qgd2hpY2ggc2ltcGx5IGRpc2NhcmRzIFJBUlAgcGFja2V0cy4KKyAqLworc3RhdGljIGludCByYXJwX3J4ICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiBfX3VudXNlZCwKKwkJICAgICBjb25zdCB2b2lkICpsbF9zb3VyY2UgX191bnVzZWQgKSB7CisJZnJlZV9pb2IgKCBpb2J1ZiApOworCXJldHVybiAwOworfQorCisKKy8qKgorICogVHJhbnNjcmliZSBSQVJQIGFkZHJlc3MKKyAqCisgKiBAdiBuZXRfYWRkcglSQVJQIGFkZHJlc3MKKyAqIEByZXQgc3RyaW5nCSI8UkFSUD4iCisgKgorICogVGhpcyBvcGVyYXRpb24gaXMgbWVhbmluZ2xlc3MgZm9yIHRoZSBSQVJQIHByb3RvY29sLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIHJhcnBfbnRvYSAoIGNvbnN0IHZvaWQgKm5ldF9hZGRyIF9fdW51c2VkICkgeworCXJldHVybiAiPFJBUlA+IjsKK30KKworLyoqIFJBUlAgcHJvdG9jb2wgKi8KK3N0cnVjdCBuZXRfcHJvdG9jb2wgcmFycF9wcm90b2NvbCBfX25ldF9wcm90b2NvbCA9IHsKKwkubmFtZSA9ICJSQVJQIiwKKwkubmV0X3Byb3RvID0gaHRvbnMgKCBFVEhfUF9SQVJQICksCisJLnJ4ID0gcmFycF9yeCwKKwkubnRvYSA9IHJhcnBfbnRvYSwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvcmV0cnkuYyBiL2dweGUvc3JjL25ldC9yZXRyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjY1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvcmV0cnkuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGdweGUvdGltZXIuaD4KKyNpbmNsdWRlIDxncHhlL2xpc3QuaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2luaXQuaD4KKyNpbmNsdWRlIDxncHhlL3JldHJ5Lmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFJldHJ5IHRpbWVycworICoKKyAqIEEgcmV0cnkgdGltZXIgaXMgYSBiaW5hcnkgZXhwb25lbnRpYWwgYmFja29mZiB0aW1lci4gIEl0IGNhbiBiZQorICogdXNlZCB0byBidWlsZCBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gaW50byBuZXR3b3JrIHByb3RvY29scy4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0aW1lciBpcyBkZXNpZ25lZCB0byBzYXRpc2Z5IFJGQyAyOTg4CisgKiBhbmQgdGhlcmVmb3JlIGJlIHVzYWJsZSBhcyBhIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lci4KKyAqCisgKiAKKyAqLworCisvKiBUaGUgdGhlb3JldGljYWwgbWluaW11bSB0aGF0IHRoZSBhbGdvcml0aG0gaW4gc3RvcF90aW1lcigpIGNhbgorICogYWRqdXN0IHRoZSB0aW1lb3V0IGJhY2sgZG93biB0byBpcyBzZXZlbiB0aWNrcywgc28gc2V0IHRoZSBtaW5pbXVtCisgKiB0aW1lb3V0IHRvIGF0IGxlYXN0IHRoYXQgdmFsdWUgZm9yIHRoZSBzYWtlIG9mIGNvbnNpc3RlbmN5LgorICovCisjZGVmaW5lIE1JTl9USU1FT1VUIDcKKworLyoqIExpc3Qgb2YgcnVubmluZyB0aW1lcnMgKi8KK3N0YXRpYyBMSVNUX0hFQUQgKCB0aW1lcnMgKTsKKworLyoqCisgKiBTdGFydCB0aW1lcgorICoKKyAqIEB2IHRpbWVyCQlSZXRyeSB0aW1lcgorICoKKyAqIFRoaXMgc3RhcnRzIHRoZSB0aW1lciBydW5uaW5nIHdpdGggdGhlIGN1cnJlbnQgdGltZW91dCB2YWx1ZS4gIElmCisgKiBzdG9wX3RpbWVyKCkgaXMgbm90IGNhbGxlZCBiZWZvcmUgdGhlIHRpbWVyIGV4cGlyZXMsIHRoZSB0aW1lciB3aWxsCisgKiBiZSBzdG9wcGVkIGFuZCB0aGUgdGltZXIncyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZC4KKyAqLwordm9pZCBzdGFydF90aW1lciAoIHN0cnVjdCByZXRyeV90aW1lciAqdGltZXIgKSB7CisJaWYgKCAhIHRpbWVyLT5ydW5uaW5nICkKKwkJbGlzdF9hZGQgKCAmdGltZXItPmxpc3QsICZ0aW1lcnMgKTsKKwl0aW1lci0+c3RhcnQgPSBjdXJydGlja3MoKTsKKwl0aW1lci0+cnVubmluZyA9IDE7CisKKwkvKiAwIG1lYW5zICJ1c2UgZGVmYXVsdCB0aW1lb3V0IiAqLworCWlmICggdGltZXItPm1pbl90aW1lb3V0ID09IDAgKQorCQl0aW1lci0+bWluX3RpbWVvdXQgPSBERUZBVUxUX01JTl9USU1FT1VUOworCS8qIFdlIG11c3QgbmV2ZXIgYmUgbGVzcyB0aGFuIE1JTl9USU1FT1VUIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzICovCisJaWYgKCB0aW1lci0+bWluX3RpbWVvdXQgPCBNSU5fVElNRU9VVCApCisJCXRpbWVyLT5taW5fdGltZW91dCA9IE1JTl9USU1FT1VUOworCS8qIEhvbm9yIHVzZXItc3BlY2lmaWVkIG1pbmltdW0gdGltZW91dCAqLworCWlmICggdGltZXItPnRpbWVvdXQgPCB0aW1lci0+bWluX3RpbWVvdXQgKQorCQl0aW1lci0+dGltZW91dCA9IHRpbWVyLT5taW5fdGltZW91dDsKKworCURCRzIgKCAiVGltZXIgJXAgc3RhcnRlZCBhdCB0aW1lICVsZCAoZXhwaXJlcyBhdCAlbGQpXG4iLAorCSAgICAgICB0aW1lciwgdGltZXItPnN0YXJ0LCAoIHRpbWVyLT5zdGFydCArIHRpbWVyLT50aW1lb3V0ICkgKTsKK30KKworLyoqCisgKiBTdGFydCB0aW1lciB3aXRoIGEgc3BlY2lmaWVkIGZpeGVkIHRpbWVvdXQKKyAqCisgKiBAdiB0aW1lcgkJUmV0cnkgdGltZXIKKyAqIEB2IHRpbWVvdXQJCVRpbWVvdXQsIGluIHRpY2tzCisgKi8KK3ZvaWQgc3RhcnRfdGltZXJfZml4ZWQgKCBzdHJ1Y3QgcmV0cnlfdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQgKSB7CisJc3RhcnRfdGltZXIgKCB0aW1lciApOworCXRpbWVyLT50aW1lb3V0ID0gdGltZW91dDsKKwlEQkcyICggIlRpbWVyICVwIGV4cGlyeSB0aW1lIGNoYW5nZWQgdG8gJWxkXG4iLAorCSAgICAgICB0aW1lciwgKCB0aW1lci0+c3RhcnQgKyB0aW1lci0+dGltZW91dCApICk7Cit9CisKKy8qKgorICogU3RvcCB0aW1lcgorICoKKyAqIEB2IHRpbWVyCQlSZXRyeSB0aW1lcgorICoKKyAqIFRoaXMgc3RvcHMgdGhlIHRpbWVyIGFuZCB1cGRhdGVzIHRoZSB0aW1lcidzIHRpbWVvdXQgdmFsdWUuCisgKi8KK3ZvaWQgc3RvcF90aW1lciAoIHN0cnVjdCByZXRyeV90aW1lciAqdGltZXIgKSB7CisJdW5zaWduZWQgbG9uZyBvbGRfdGltZW91dCA9IHRpbWVyLT50aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgbm93ID0gY3VycnRpY2tzKCk7CisJdW5zaWduZWQgbG9uZyBydW50aW1lOworCisJLyogSWYgdGltZXIgd2FzIGFscmVhZHkgc3RvcHBlZCwgZG8gbm90aGluZyAqLworCWlmICggISB0aW1lci0+cnVubmluZyApCisJCXJldHVybjsKKworCWxpc3RfZGVsICggJnRpbWVyLT5saXN0ICk7CisJcnVudGltZSA9ICggbm93IC0gdGltZXItPnN0YXJ0ICk7CisJdGltZXItPnJ1bm5pbmcgPSAwOworCURCRzIgKCAiVGltZXIgJXAgc3RvcHBlZCBhdCB0aW1lICVsZCAocmFuIGZvciAlbGQpXG4iLAorCSAgICAgICB0aW1lciwgbm93LCBydW50aW1lICk7CisKKwkvKiBVcGRhdGUgdGltZXIuICBWYXJpYWJsZXMgYXJlOgorCSAqCisJICogICByID0gcm91bmQtdHJpcCB0aW1lIGVzdGltYXRlIChpLmUuIHJ1bnRpbWUpCisJICogICB0ID0gdGltZW91dCB2YWx1ZSAoaS5lLiB0aW1lci0+dGltZW91dCkKKwkgKiAgIHMgPSBzbW9vdGhlZCByb3VuZC10cmlwIHRpbWUKKwkgKgorCSAqIEJ5IGNob2ljZSwgd2Ugc2V0IHQgPSA0cywgaS5lLiBhbGxvdyBmb3IgZm91ciB0aW1lcyB0aGUKKwkgKiBub3JtYWwgcm91bmQtdHJpcCB0aW1lIHRvIHBhc3MgYmVmb3JlIHJldHJhbnNtaXR0aW5nLgorCSAqCisJICogV2Ugd2FudCB0byBzbW9vdGggYWNjb3JkaW5nIHRvIHMgOj0gKCA3IHMgKyByICkgLyA4CisJICoKKwkgKiBTaW5jZSB3ZSBkb24ndCBhY3R1YWxseSBzdG9yZSBzLCB0aGlzIHJlZHVjZXMgdG8KKwkgKiB0IDo9ICggNyB0IC8gOCApICsgKCByIC8gMiApCisJICoKKwkgKi8KKwlpZiAoIHRpbWVyLT5jb3VudCApIHsKKwkJdGltZXItPmNvdW50LS07CisJfSBlbHNlIHsKKwkJdGltZXItPnRpbWVvdXQgLT0gKCB0aW1lci0+dGltZW91dCA+PiAzICk7CisJCXRpbWVyLT50aW1lb3V0ICs9ICggcnVudGltZSA+PiAxICk7CisJCWlmICggdGltZXItPnRpbWVvdXQgIT0gb2xkX3RpbWVvdXQgKSB7CisJCQlEQkcgKCAiVGltZXIgJXAgdGltZW91dCB1cGRhdGVkIHRvICVsZFxuIiwKKwkJCSAgICAgIHRpbWVyLCB0aW1lci0+dGltZW91dCApOworCQl9CisJfQorfQorCisvKioKKyAqIEhhbmRsZSBleHBpcmVkIHRpbWVyCisgKgorICogQHYgdGltZXIJCVJldHJ5IHRpbWVyCisgKi8KK3N0YXRpYyB2b2lkIHRpbWVyX2V4cGlyZWQgKCBzdHJ1Y3QgcmV0cnlfdGltZXIgKnRpbWVyICkgeworCWludCBmYWlsOworCisJLyogU3RvcCB0aW1lciB3aXRob3V0IHBlcmZvcm1pbmcgUlRUIGNhbGN1bGF0aW9ucyAqLworCURCRzIgKCAiVGltZXIgJXAgc3RvcHBlZCBhdCB0aW1lICVsZCBvbiBleHBpcnlcbiIsCisJICAgICAgIHRpbWVyLCBjdXJydGlja3MoKSApOworCWFzc2VydCAoIHRpbWVyLT5ydW5uaW5nICk7CisJbGlzdF9kZWwgKCAmdGltZXItPmxpc3QgKTsKKwl0aW1lci0+cnVubmluZyA9IDA7CisJdGltZXItPmNvdW50Kys7CisKKwkvKiBCYWNrIG9mZiB0aGUgdGltZW91dCB2YWx1ZSAqLworCXRpbWVyLT50aW1lb3V0IDw8PSAxOworCWlmICggdGltZXItPm1heF90aW1lb3V0ID09IDAgKSAvKiAwIG1lYW5zICJ1c2UgZGVmYXVsdCB0aW1lb3V0IiAqLworCQl0aW1lci0+bWF4X3RpbWVvdXQgPSBERUZBVUxUX01BWF9USU1FT1VUOworCWlmICggKCBmYWlsID0gKCB0aW1lci0+dGltZW91dCA+IHRpbWVyLT5tYXhfdGltZW91dCApICkgKQorCQl0aW1lci0+dGltZW91dCA9IHRpbWVyLT5tYXhfdGltZW91dDsKKwlEQkcgKCAiVGltZXIgJXAgdGltZW91dCBiYWNrZWQgb2ZmIHRvICVsZFxuIiwKKwkgICAgICB0aW1lciwgdGltZXItPnRpbWVvdXQgKTsKKworCS8qIENhbGwgZXhwaXJ5IGNhbGxiYWNrICovCisJdGltZXItPmV4cGlyZWQgKCB0aW1lciwgZmFpbCApOwkKK30KKworLyoqCisgKiBTaW5nbGUtc3RlcCB0aGUgcmV0cnkgdGltZXIgbGlzdAorICoKKyAqIEB2IHByb2Nlc3MJCVJldHJ5IHRpbWVyIHByb2Nlc3MKKyAqLworc3RhdGljIHZvaWQgcmV0cnlfc3RlcCAoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzIF9fdW51c2VkICkgeworCXN0cnVjdCByZXRyeV90aW1lciAqdGltZXI7CisJc3RydWN0IHJldHJ5X3RpbWVyICp0bXA7CisJdW5zaWduZWQgbG9uZyBub3cgPSBjdXJydGlja3MoKTsKKwl1bnNpZ25lZCBsb25nIHVzZWQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKCB0aW1lciwgdG1wLCAmdGltZXJzLCBsaXN0ICkgeworCQl1c2VkID0gKCBub3cgLSB0aW1lci0+c3RhcnQgKTsKKwkJaWYgKCB1c2VkID49IHRpbWVyLT50aW1lb3V0ICkKKwkJCXRpbWVyX2V4cGlyZWQgKCB0aW1lciApOworCX0KK30KKworLyoqIFJldHJ5IHRpbWVyIHByb2Nlc3MgKi8KK3N0cnVjdCBwcm9jZXNzIHJldHJ5X3Byb2Nlc3MgX19wZXJtYW5lbnRfcHJvY2VzcyA9IHsKKwkubGlzdCA9IExJU1RfSEVBRF9JTklUICggcmV0cnlfcHJvY2Vzcy5saXN0ICksCisJLnN0ZXAgPSByZXRyeV9zdGVwLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC90Y3AuYyBiL2dweGUvc3JjL25ldC90Y3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDYxOTYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L3RjcC5jCkBAIC0wLDAgKzEsMTE1NiBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvdGltZXIuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS9tYWxsb2MuaD4KKyNpbmNsdWRlIDxncHhlL3JldHJ5Lmg+CisjaW5jbHVkZSA8Z3B4ZS9yZWZjbnQuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKyNpbmNsdWRlIDxncHhlL29wZW4uaD4KKyNpbmNsdWRlIDxncHhlL3VyaS5oPgorI2luY2x1ZGUgPGdweGUvdGNwaXAuaD4KKyNpbmNsdWRlIDxncHhlL3RjcC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBUQ1AgcHJvdG9jb2wKKyAqCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogQSBUQ1AgY29ubmVjdGlvbiAqLworc3RydWN0IHRjcF9jb25uZWN0aW9uIHsKKwkvKiogUmVmZXJlbmNlIGNvdW50ZXIgKi8KKwlzdHJ1Y3QgcmVmY250IHJlZmNudDsKKwkvKiogTGlzdCBvZiBUQ1AgY29ubmVjdGlvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiogRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgeGZlcjsKKwkvKiogRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UgY2xvc2VkIGZsYWcgKi8KKwlpbnQgeGZlcl9jbG9zZWQ7CisKKwkvKiogUmVtb3RlIHNvY2tldCBhZGRyZXNzICovCisJc3RydWN0IHNvY2thZGRyX3RjcGlwIHBlZXI7CisJLyoqIExvY2FsIHBvcnQsIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCXVuc2lnbmVkIGludCBsb2NhbF9wb3J0OworCisJLyoqIEN1cnJlbnQgVENQIHN0YXRlICovCisJdW5zaWduZWQgaW50IHRjcF9zdGF0ZTsKKwkvKiogUHJldmlvdXMgVENQIHN0YXRlCisJICoKKwkgKiBNYWludGFpbmVkIG9ubHkgZm9yIGRlYnVnIG1lc3NhZ2VzCisJICovCisJdW5zaWduZWQgaW50IHByZXZfdGNwX3N0YXRlOworCS8qKiBDdXJyZW50IHNlcXVlbmNlIG51bWJlcgorCSAqCisJICogRXF1aXZhbGVudCB0byBTTkQuVU5BIGluIFJGQyA3OTMgdGVybWlub2xvZ3kuCisJICovCisJdWludDMyX3Qgc25kX3NlcTsKKwkvKiogVW5hY2tub3dsZWRnZWQgc2VxdWVuY2UgY291bnQKKwkgKgorCSAqIEVxdWl2YWxlbnQgdG8gKFNORC5OWFQtU05ELlVOQSkgaW4gUkZDIDc5MyB0ZXJtaW5vbG9neS4KKwkgKi8KKwl1aW50MzJfdCBzbmRfc2VudDsKKwkvKiogU2VuZCB3aW5kb3cKKwkgKgorCSAqIEVxdWl2YWxlbnQgdG8gU05ELldORCBpbiBSRkMgNzkzIHRlcm1pbm9sb2d5CisJICovCisJdWludDMyX3Qgc25kX3dpbjsKKwkvKiogQ3VycmVudCBhY2tub3dsZWRnZW1lbnQgbnVtYmVyCisJICoKKwkgKiBFcXVpdmFsZW50IHRvIFJDVi5OWFQgaW4gUkZDIDc5MyB0ZXJtaW5vbG9neS4KKwkgKi8KKwl1aW50MzJfdCByY3ZfYWNrOworCS8qKiBSZWNlaXZlIHdpbmRvdworCSAqCisJICogRXF1aXZhbGVudCB0byBSQ1YuV05EIGluIFJGQyA3OTMgdGVybWlub2xvZ3kuCisJICovCisJdWludDMyX3QgcmN2X3dpbjsKKwkvKiogTW9zdCByZWNlbnQgcmVjZWl2ZWQgdGltZXN0YW1wCisJICoKKwkgKiBFcXVpdmFsZW50IHRvIFRTLlJlY2VudCBpbiBSRkMgMTMyMyB0ZXJtaW5vbG9neS4KKwkgKi8KKwl1aW50MzJfdCB0c19yZWNlbnQ7CisJLyoqIFRpbWVzdGFtcHMgZW5hYmxlZCAqLworCWludCB0aW1lc3RhbXBzOworCisJLyoqIFRyYW5zbWl0IHF1ZXVlICovCisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwkvKiogUmV0cmFuc21pc3Npb24gdGltZXIgKi8KKwlzdHJ1Y3QgcmV0cnlfdGltZXIgdGltZXI7Cit9OworCisvKioKKyAqIExpc3Qgb2YgcmVnaXN0ZXJlZCBUQ1AgY29ubmVjdGlvbnMKKyAqLworc3RhdGljIExJU1RfSEVBRCAoIHRjcF9jb25ucyApOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCB4ZmVyX2ludGVyZmFjZV9vcGVyYXRpb25zIHRjcF94ZmVyX29wZXJhdGlvbnM7CitzdGF0aWMgdm9pZCB0Y3BfZXhwaXJlZCAoIHN0cnVjdCByZXRyeV90aW1lciAqdGltZXIsIGludCBvdmVyICk7CitzdGF0aWMgaW50IHRjcF9yeF9hY2sgKCBzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcCwgdWludDMyX3QgYWNrLAorCQkJdWludDMyX3Qgd2luICk7CisKKy8qKgorICogTmFtZSBUQ1Agc3RhdGUKKyAqCisgKiBAdiBzdGF0ZQkJVENQIHN0YXRlCisgKiBAcmV0IG5hbWUJCU5hbWUgb2YgVENQIHN0YXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIGNvbnN0IGNoYXIgKgordGNwX3N0YXRlICggaW50IHN0YXRlICkgeworCXN3aXRjaCAoIHN0YXRlICkgeworCWNhc2UgVENQX0NMT1NFRDoJCXJldHVybiAiQ0xPU0VEIjsKKwljYXNlIFRDUF9MSVNURU46CQlyZXR1cm4gIkxJU1RFTiI7CisJY2FzZSBUQ1BfU1lOX1NFTlQ6CQlyZXR1cm4gIlNZTl9TRU5UIjsKKwljYXNlIFRDUF9TWU5fUkNWRDoJCXJldHVybiAiU1lOX1JDVkQiOworCWNhc2UgVENQX0VTVEFCTElTSEVEOgkJcmV0dXJuICJFU1RBQkxJU0hFRCI7CisJY2FzZSBUQ1BfRklOX1dBSVRfMToJCXJldHVybiAiRklOX1dBSVRfMSI7CisJY2FzZSBUQ1BfRklOX1dBSVRfMjoJCXJldHVybiAiRklOX1dBSVRfMiI7CisJY2FzZSBUQ1BfQ0xPU0lOR19PUl9MQVNUX0FDSzoJcmV0dXJuICJDTE9TSU5HL0xBU1RfQUNLIjsKKwljYXNlIFRDUF9USU1FX1dBSVQ6CQlyZXR1cm4gIlRJTUVfV0FJVCI7CisJY2FzZSBUQ1BfQ0xPU0VfV0FJVDoJCXJldHVybiAiQ0xPU0VfV0FJVCI7CisJZGVmYXVsdDoJCQlyZXR1cm4gIklOVkFMSUQiOworCX0KK30KKworLyoqCisgKiBEdW1wIFRDUCBzdGF0ZSB0cmFuc2l0aW9uCisgKgorICogQHYgdGNwCQlUQ1AgY29ubmVjdGlvbgorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKCggYWx3YXlzX2lubGluZSApKSB2b2lkCit0Y3BfZHVtcF9zdGF0ZSAoIHN0cnVjdCB0Y3BfY29ubmVjdGlvbiAqdGNwICkgeworCisJaWYgKCB0Y3AtPnRjcF9zdGF0ZSAhPSB0Y3AtPnByZXZfdGNwX3N0YXRlICkgeworCQlEQkdDICggdGNwLCAiVENQICVwIHRyYW5zaXRpb25lZCBmcm9tICVzIHRvICVzXG4iLCB0Y3AsCisJCSAgICAgICB0Y3Bfc3RhdGUgKCB0Y3AtPnByZXZfdGNwX3N0YXRlICksCisJCSAgICAgICB0Y3Bfc3RhdGUgKCB0Y3AtPnRjcF9zdGF0ZSApICk7CisJfQorCXRjcC0+cHJldl90Y3Bfc3RhdGUgPSB0Y3AtPnRjcF9zdGF0ZTsKK30KKworLyoqCisgKiBEdW1wIFRDUCBmbGFncworICoKKyAqIEB2IGZsYWdzCQlUQ1AgZmxhZ3MKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoIGFsd2F5c19pbmxpbmUgKSkgdm9pZAordGNwX2R1bXBfZmxhZ3MgKCBzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcCwgdW5zaWduZWQgaW50IGZsYWdzICkgeworCWlmICggZmxhZ3MgJiBUQ1BfUlNUICkKKwkJREJHQzIgKCB0Y3AsICIgUlNUIiApOworCWlmICggZmxhZ3MgJiBUQ1BfU1lOICkKKwkJREJHQzIgKCB0Y3AsICIgU1lOIiApOworCWlmICggZmxhZ3MgJiBUQ1BfUFNIICkKKwkJREJHQzIgKCB0Y3AsICIgUFNIIiApOworCWlmICggZmxhZ3MgJiBUQ1BfRklOICkKKwkJREJHQzIgKCB0Y3AsICIgRklOIiApOworCWlmICggZmxhZ3MgJiBUQ1BfQUNLICkKKwkJREJHQzIgKCB0Y3AsICIgQUNLIiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogT3BlbiBhbmQgY2xvc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBCaW5kIFRDUCBjb25uZWN0aW9uIHRvIGxvY2FsIHBvcnQKKyAqCisgKiBAdiB0Y3AJCVRDUCBjb25uZWN0aW9uCisgKiBAdiBwb3J0CQlMb2NhbCBwb3J0IG51bWJlciwgaW4gbmV0d29yay1lbmRpYW4gb3JkZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIElmIHRoZSBwb3J0IGlzIDAsIHRoZSBjb25uZWN0aW9uIGlzIGFzc2lnbmVkIGFuIGF2YWlsYWJsZSBwb3J0CisgKiBiZXR3ZWVuIDEwMjQgYW5kIDY1NTM1LgorICovCitzdGF0aWMgaW50IHRjcF9iaW5kICggc3RydWN0IHRjcF9jb25uZWN0aW9uICp0Y3AsIHVuc2lnbmVkIGludCBwb3J0ICkgeworCXN0cnVjdCB0Y3BfY29ubmVjdGlvbiAqZXhpc3Rpbmc7CisJc3RhdGljIHVpbnQxNl90IHRyeV9wb3J0ID0gMTAyMzsKKworCS8qIElmIG5vIHBvcnQgc3BlY2lmaWVkLCBmaW5kIHRoZSBmaXJzdCBhdmFpbGFibGUgcG9ydCAqLworCWlmICggISBwb3J0ICkgeworCQl3aGlsZSAoIHRyeV9wb3J0ICkgeworCQkJdHJ5X3BvcnQrKzsKKwkJCWlmICggdHJ5X3BvcnQgPCAxMDI0ICkKKwkJCQljb250aW51ZTsKKwkJCWlmICggdGNwX2JpbmQgKCB0Y3AsIGh0b25zICggdHJ5X3BvcnQgKSApID09IDAgKQorCQkJCXJldHVybiAwOworCQl9CisJCURCR0MgKCB0Y3AsICJUQ1AgJXAgY291bGQgbm90IGJpbmQ6IG5vIGZyZWUgcG9ydHNcbiIsIHRjcCApOworCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJfQorCisJLyogQXR0ZW1wdCBiaW5kIHRvIGxvY2FsIHBvcnQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggZXhpc3RpbmcsICZ0Y3BfY29ubnMsIGxpc3QgKSB7CisJCWlmICggZXhpc3RpbmctPmxvY2FsX3BvcnQgPT0gcG9ydCApIHsKKwkJCURCR0MgKCB0Y3AsICJUQ1AgJXAgY291bGQgbm90IGJpbmQ6IHBvcnQgJWQgaW4gdXNlXG4iLAorCQkJICAgICAgIHRjcCwgbnRvaHMgKCBwb3J0ICkgKTsKKwkJCXJldHVybiAtRUFERFJJTlVTRTsKKwkJfQorCX0KKwl0Y3AtPmxvY2FsX3BvcnQgPSBwb3J0OworCisJREJHQyAoIHRjcCwgIlRDUCAlcCBib3VuZCB0byBwb3J0ICVkXG4iLCB0Y3AsIG50b2hzICggcG9ydCApICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogT3BlbiBhIFRDUCBjb25uZWN0aW9uCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHBlZXIJCVBlZXIgc29ja2V0IGFkZHJlc3MKKyAqIEB2IGxvY2FsCQlMb2NhbCBzb2NrZXQgYWRkcmVzcywgb3IgTlVMTAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGNwX29wZW4gKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIHN0cnVjdCBzb2NrYWRkciAqcGVlciwKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICpsb2NhbCApIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X3BlZXIgPSAoIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqICkgcGVlcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X2xvY2FsID0gKCBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKiApIGxvY2FsOworCXN0cnVjdCB0Y3BfY29ubmVjdGlvbiAqdGNwOworCXVuc2lnbmVkIGludCBiaW5kX3BvcnQ7CisJaW50IHJjOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2Ugc3RydWN0dXJlICovCisJdGNwID0gemFsbG9jICggc2l6ZW9mICggKnRjcCApICk7CisJaWYgKCAhIHRjcCApCisJCXJldHVybiAtRU5PTUVNOworCURCR0MgKCB0Y3AsICJUQ1AgJXAgYWxsb2NhdGVkXG4iLCB0Y3AgKTsKKwl4ZmVyX2luaXQgKCAmdGNwLT54ZmVyLCAmdGNwX3hmZXJfb3BlcmF0aW9ucywgJnRjcC0+cmVmY250ICk7CisJdGNwLT5wcmV2X3RjcF9zdGF0ZSA9IFRDUF9DTE9TRUQ7CisJdGNwLT50Y3Bfc3RhdGUgPSBUQ1BfU1RBVEVfU0VOVCAoIFRDUF9TWU4gKTsKKwl0Y3BfZHVtcF9zdGF0ZSAoIHRjcCApOworCXRjcC0+c25kX3NlcSA9IHJhbmRvbSgpOworCUlOSVRfTElTVF9IRUFEICggJnRjcC0+cXVldWUgKTsKKwl0Y3AtPnRpbWVyLmV4cGlyZWQgPSB0Y3BfZXhwaXJlZDsKKwltZW1jcHkgKCAmdGNwLT5wZWVyLCBzdF9wZWVyLCBzaXplb2YgKCB0Y3AtPnBlZXIgKSApOworCisJLyogQmluZCB0byBsb2NhbCBwb3J0ICovCisJYmluZF9wb3J0ID0gKCBzdF9sb2NhbCA/IHN0X2xvY2FsLT5zdF9wb3J0IDogMCApOworCWlmICggKCByYyA9IHRjcF9iaW5kICggdGNwLCBiaW5kX3BvcnQgKSApICE9IDAgKQorCQlnb3RvIGVycjsKKworCS8qIFN0YXJ0IHRpbWVyIHRvIGluaXRpYXRlIFNZTiAqLworCXN0YXJ0X3RpbWVyX25vZGVsYXkgKCAmdGNwLT50aW1lciApOworCisJLyogQXR0YWNoIHBhcmVudCBpbnRlcmZhY2UsIHRyYW5zZmVyIHJlZmVyZW5jZSB0byBjb25uZWN0aW9uCisJICogbGlzdCBhbmQgcmV0dXJuCisJICovCisJeGZlcl9wbHVnX3BsdWcgKCAmdGNwLT54ZmVyLCB4ZmVyICk7CisJbGlzdF9hZGQgKCAmdGNwLT5saXN0LCAmdGNwX2Nvbm5zICk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJcmVmX3B1dCAoICZ0Y3AtPnJlZmNudCApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBDbG9zZSBUQ1AgY29ubmVjdGlvbgorICoKKyAqIEB2IHRjcAkJVENQIGNvbm5lY3Rpb24KKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKgorICogQ2xvc2VzIHRoZSBkYXRhIHRyYW5zZmVyIGludGVyZmFjZS4gIElmIHRoZSBUQ1Agc3RhdGUgbWFjaGluZSBpcyBpbgorICogYSBzdWl0YWJsZSBzdGF0ZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBkZWxldGVkLgorICovCitzdGF0aWMgdm9pZCB0Y3BfY2xvc2UgKCBzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcCwgaW50IHJjICkgeworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXN0cnVjdCBpb19idWZmZXIgKnRtcDsKKworCS8qIENsb3NlIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlICovCisJeGZlcl9udWxsaWZ5ICggJnRjcC0+eGZlciApOworCXhmZXJfY2xvc2UgKCAmdGNwLT54ZmVyLCByYyApOworCXRjcC0+eGZlcl9jbG9zZWQgPSAxOworCisJLyogSWYgd2UgYXJlIGluIENMT1NFRCwgb3IgaGF2ZSBvdGhlcndpc2Ugbm90IHlldCByZWNlaXZlZCBhCisJICogU1lOIChpLmUuIHdlIGFyZSBpbiBMSVNURU4gb3IgU1lOX1NFTlQpLCBqdXN0IGRlbGV0ZSB0aGUKKwkgKiBjb25uZWN0aW9uLgorCSAqLworCWlmICggISAoIHRjcC0+dGNwX3N0YXRlICYgVENQX1NUQVRFX1JDVkQgKCBUQ1BfU1lOICkgKSApIHsKKworCQkvKiBUcmFuc2l0aW9uIHRvIENMT1NFRCBmb3IgdGhlIHNha2Ugb2YgZGVidWdnaW5nIG1lc3NhZ2VzICovCisJCXRjcC0+dGNwX3N0YXRlID0gVENQX0NMT1NFRDsKKwkJdGNwX2R1bXBfc3RhdGUgKCB0Y3AgKTsKKworCQkvKiBGcmVlIGFueSB1bnNlbnQgSS9PIGJ1ZmZlcnMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlICggaW9idWYsIHRtcCwgJnRjcC0+cXVldWUsIGxpc3QgKSB7CisJCQlsaXN0X2RlbCAoICZpb2J1Zi0+bGlzdCApOworCQkJZnJlZV9pb2IgKCBpb2J1ZiApOworCQl9CisKKwkJLyogUmVtb3ZlIGZyb20gbGlzdCBhbmQgZHJvcCByZWZlcmVuY2UgKi8KKwkJc3RvcF90aW1lciAoICZ0Y3AtPnRpbWVyICk7CisJCWxpc3RfZGVsICggJnRjcC0+bGlzdCApOworCQlyZWZfcHV0ICggJnRjcC0+cmVmY250ICk7CisJCURCR0MgKCB0Y3AsICJUQ1AgJXAgY29ubmVjdGlvbiBkZWxldGVkXG4iLCB0Y3AgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIHdlIGhhdmUgbm90IGhhZCBvdXIgU1lOIGFja25vd2xlZGdlZCAoaS5lLiB3ZSBhcmUgaW4KKwkgKiBTWU5fUkNWRCksIHByZXRlbmQgdGhhdCBpdCBoYXMgYmVlbiBhY2tub3dsZWRnZWQgc28gdGhhdCB3ZQorCSAqIGNhbiBzZW5kIGEgRklOIHdpdGhvdXQgYnJlYWtpbmcgdGhpbmdzLgorCSAqLworCWlmICggISAoIHRjcC0+dGNwX3N0YXRlICYgVENQX1NUQVRFX0FDS0VEICggVENQX1NZTiApICkgKQorCQl0Y3BfcnhfYWNrICggdGNwLCAoIHRjcC0+c25kX3NlcSArIDEgKSwgMCApOworCisJLyogSWYgd2UgaGF2ZSBubyBkYXRhIHJlbWFpbmluZyB0byBzZW5kLCBzdGFydCBzZW5kaW5nIEZJTiAqLworCWlmICggbGlzdF9lbXB0eSAoICZ0Y3AtPnF1ZXVlICkgKSB7CisJCXRjcC0+dGNwX3N0YXRlIHw9IFRDUF9TVEFURV9TRU5UICggVENQX0ZJTiApOworCQl0Y3BfZHVtcF9zdGF0ZSAoIHRjcCApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRyYW5zbWl0IGRhdGEgcGF0aAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIENhbGN1bGF0ZSB0cmFuc21pc3Npb24gd2luZG93CisgKgorICogQHYgdGNwCQlUQ1AgY29ubmVjdGlvbgorICogQHJldCBsZW4JCU1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIHNlbnQgaW4gYSBzaW5nbGUgcGFja2V0CisgKi8KK3N0YXRpYyBzaXplX3QgdGNwX3htaXRfd2luICggc3RydWN0IHRjcF9jb25uZWN0aW9uICp0Y3AgKSB7CisJc2l6ZV90IGxlbjsKKworCS8qIE5vdCByZWFkeSBpZiB3ZSdyZSBub3QgaW4gYSBzdWl0YWJsZSBjb25uZWN0aW9uIHN0YXRlICovCisJaWYgKCAhIFRDUF9DQU5fU0VORF9EQVRBICggdGNwLT50Y3Bfc3RhdGUgKSApCisJCXJldHVybiAwOworCisJLyogTGVuZ3RoIGlzIHRoZSBtaW5pbXVtIG9mIHRoZSByZWNlaXZlcidzIHdpbmRvdyBhbmQgdGhlIHBhdGggTVRVICovCisJbGVuID0gdGNwLT5zbmRfd2luOworCWlmICggbGVuID4gVENQX1BBVEhfTVRVICkKKwkJbGVuID0gVENQX1BBVEhfTVRVOworCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBQcm9jZXNzIFRDUCB0cmFuc21pdCBxdWV1ZQorICoKKyAqIEB2IHRjcAkJVENQIGNvbm5lY3Rpb24KKyAqIEB2IG1heF9sZW4JCU1heGltdW0gbGVuZ3RoIHRvIHByb2Nlc3MKKyAqIEB2IGRlc3QJCUkvTyBidWZmZXIgdG8gZmlsbCB3aXRoIGRhdGEsIG9yIE5VTEwKKyAqIEB2IHJlbW92ZQkJUmVtb3ZlIGRhdGEgZnJvbSBxdWV1ZQorICogQHJldCBsZW4JCUxlbmd0aCBvZiBkYXRhIHByb2Nlc3NlZAorICoKKyAqIFRoaXMgcHJvY2Vzc2VzIGF0IG1vc3QgQGMgbWF4X2xlbiBieXRlcyBmcm9tIHRoZSBUQ1AgY29ubmVjdGlvbidzCisgKiB0cmFuc21pdCBxdWV1ZS4gIERhdGEgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgQGMgZGVzdCBJL08gYnVmZmVyCisgKiAoaWYgcHJvdmlkZWQpIGFuZCwgaWYgQGMgcmVtb3ZlIGlzIHRydWUsIHJlbW92ZWQgZnJvbSB0aGUgdHJhbnNtaXQKKyAqIHF1ZXVlLgorICovCitzdGF0aWMgc2l6ZV90IHRjcF9wcm9jZXNzX3F1ZXVlICggc3RydWN0IHRjcF9jb25uZWN0aW9uICp0Y3AsIHNpemVfdCBtYXhfbGVuLAorCQkJCSAgc3RydWN0IGlvX2J1ZmZlciAqZGVzdCwgaW50IHJlbW92ZSApIHsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwlzdHJ1Y3QgaW9fYnVmZmVyICp0bXA7CisJc2l6ZV90IGZyYWdfbGVuOworCXNpemVfdCBsZW4gPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlICggaW9idWYsIHRtcCwgJnRjcC0+cXVldWUsIGxpc3QgKSB7CisJCWZyYWdfbGVuID0gaW9iX2xlbiAoIGlvYnVmICk7CisJCWlmICggZnJhZ19sZW4gPiBtYXhfbGVuICkKKwkJCWZyYWdfbGVuID0gbWF4X2xlbjsKKwkJaWYgKCBkZXN0ICkgeworCQkJbWVtY3B5ICggaW9iX3B1dCAoIGRlc3QsIGZyYWdfbGVuICksIGlvYnVmLT5kYXRhLAorCQkJCSBmcmFnX2xlbiApOworCQl9CisJCWlmICggcmVtb3ZlICkgeworCQkJaW9iX3B1bGwgKCBpb2J1ZiwgZnJhZ19sZW4gKTsKKwkJCWlmICggISBpb2JfbGVuICggaW9idWYgKSApIHsKKwkJCQlsaXN0X2RlbCAoICZpb2J1Zi0+bGlzdCApOworCQkJCWZyZWVfaW9iICggaW9idWYgKTsKKwkJCX0KKwkJfQorCQlsZW4gKz0gZnJhZ19sZW47CisJCW1heF9sZW4gLT0gZnJhZ19sZW47CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qKgorICogVHJhbnNtaXQgYW55IG91dHN0YW5kaW5nIGRhdGEKKyAqCisgKiBAdiB0Y3AJCVRDUCBjb25uZWN0aW9uCisgKiBAdiBmb3JjZV9zZW5kCUZvcmNlIHNlbmRpbmcgb2YgcGFja2V0CisgKiAKKyAqIFRyYW5zbWl0cyBhbnkgb3V0c3RhbmRpbmcgZGF0YSBvbiB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgZXZlbiBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgdGhlIHJldHJhbnNtaXNzaW9uIHRpbWVyCisgKiB3aWxsIGhhdmUgYmVlbiBzdGFydGVkIGlmIG5lY2Vzc2FyeSwgYW5kIHNvIHRoZSBzdGFjayB3aWxsCisgKiBldmVudHVhbGx5IGF0dGVtcHQgdG8gcmV0cmFuc21pdCB0aGUgZmFpbGVkIHBhY2tldC4KKyAqLworc3RhdGljIGludCB0Y3BfeG1pdCAoIHN0cnVjdCB0Y3BfY29ubmVjdGlvbiAqdGNwLCBpbnQgZm9yY2Vfc2VuZCApIHsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwlzdHJ1Y3QgdGNwX2hlYWRlciAqdGNwaGRyOworCXN0cnVjdCB0Y3BfbXNzX29wdGlvbiAqbXNzb3B0OworCXN0cnVjdCB0Y3BfdGltZXN0YW1wX3BhZGRlZF9vcHRpb24gKnRzb3B0OworCXZvaWQgKnBheWxvYWQ7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXNpemVfdCBsZW4gPSAwOworCXVpbnQzMl90IHNlcV9sZW47CisJdWludDMyX3QgYXBwX3dpbjsKKwl1aW50MzJfdCBtYXhfcmN2X3dpbjsKKwlpbnQgcmM7CisKKwkvKiBJZiByZXRyYW5zbWlzc2lvbiB0aW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcsIGRvIG5vdGhpbmcgKi8KKwlpZiAoIHRpbWVyX3J1bm5pbmcgKCAmdGNwLT50aW1lciApICkKKwkJcmV0dXJuIDA7CisKKwkvKiBDYWxjdWxhdGUgYm90aCB0aGUgYWN0dWFsIChwYXlsb2FkKSBhbmQgc2VxdWVuY2Ugc3BhY2UKKwkgKiBsZW5ndGhzIHRoYXQgd2Ugd2lzaCB0byB0cmFuc21pdC4KKwkgKi8KKwlpZiAoIFRDUF9DQU5fU0VORF9EQVRBICggdGNwLT50Y3Bfc3RhdGUgKSApIHsKKwkJbGVuID0gdGNwX3Byb2Nlc3NfcXVldWUgKCB0Y3AsIHRjcF94bWl0X3dpbiAoIHRjcCApLAorCQkJCQkgIE5VTEwsIDAgKTsKKwl9CisJc2VxX2xlbiA9IGxlbjsKKwlmbGFncyA9IFRDUF9GTEFHU19TRU5ESU5HICggdGNwLT50Y3Bfc3RhdGUgKTsKKwlpZiAoIGZsYWdzICYgKCBUQ1BfU1lOIHwgVENQX0ZJTiApICkgeworCQkvKiBTWU4gb3IgRklOIGNvbnN1bWUgb25lIGJ5dGUsIGFuZCB3ZSBjYW4gbmV2ZXIgc2VuZCBib3RoICovCisJCWFzc2VydCAoICEgKCAoIGZsYWdzICYgVENQX1NZTiApICYmICggZmxhZ3MgJiBUQ1BfRklOICkgKSApOworCQlzZXFfbGVuKys7CisJfQorCXRjcC0+c25kX3NlbnQgPSBzZXFfbGVuOworCisJLyogSWYgd2UgaGF2ZSBub3RoaW5nIHRvIHRyYW5zbWl0LCBzdG9wIG5vdyAqLworCWlmICggKCBzZXFfbGVuID09IDAgKSAmJiAhIGZvcmNlX3NlbmQgKQorCQlyZXR1cm4gMDsKKworCS8qIElmIHdlIGFyZSB0cmFuc21pdHRpbmcgYW55dGhpbmcgdGhhdCByZXF1aXJlcworCSAqIGFja25vd2xlZGdlbWVudCAoaS5lLiBjb25zdW1lcyBzZXF1ZW5jZSBzcGFjZSksIHN0YXJ0IHRoZQorCSAqIHJldHJhbnNtaXNzaW9uIHRpbWVyLiAgRG8gdGhpcyBiZWZvcmUgYXR0ZW1wdGluZyB0bworCSAqIGFsbG9jYXRlIHRoZSBJL08gYnVmZmVyLCBpbiBjYXNlIGFsbG9jYXRpb24gaXRzZWxmIGZhaWxzLgorCSAqLworCWlmICggc2VxX2xlbiApCisJCXN0YXJ0X3RpbWVyICggJnRjcC0+dGltZXIgKTsKKworCS8qIEFsbG9jYXRlIEkvTyBidWZmZXIgKi8KKwlpb2J1ZiA9IGFsbG9jX2lvYiAoIGxlbiArIE1BWF9IRFJfTEVOICk7CisJaWYgKCAhIGlvYnVmICkgeworCQlEQkdDICggdGNwLCAiVENQICVwIGNvdWxkIG5vdCBhbGxvY2F0ZSBpb2J1ZiBmb3IgJTA4eC4uJTA4eCAiCisJCSAgICAgICAiJTA4eFxuIiwgdGNwLCB0Y3AtPnNuZF9zZXEsICggdGNwLT5zbmRfc2VxICsgc2VxX2xlbiApLAorCQkgICAgICAgdGNwLT5yY3ZfYWNrICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpb2JfcmVzZXJ2ZSAoIGlvYnVmLCBNQVhfSERSX0xFTiApOworCisJLyogRmlsbCBkYXRhIHBheWxvYWQgZnJvbSB0cmFuc21pdCBxdWV1ZSAqLworCXRjcF9wcm9jZXNzX3F1ZXVlICggdGNwLCBsZW4sIGlvYnVmLCAwICk7CisKKwkvKiBFeHBhbmQgcmVjZWl2ZSB3aW5kb3cgaWYgcG9zc2libGUgKi8KKwltYXhfcmN2X3dpbiA9ICggKCBmcmVlbWVtICogMyApIC8gNCApOworCWlmICggbWF4X3Jjdl93aW4gPiBUQ1BfTUFYX1dJTkRPV19TSVpFICkKKwkJbWF4X3Jjdl93aW4gPSBUQ1BfTUFYX1dJTkRPV19TSVpFOworCWFwcF93aW4gPSB4ZmVyX3dpbmRvdyAoICZ0Y3AtPnhmZXIgKTsKKwlpZiAoIG1heF9yY3Zfd2luID4gYXBwX3dpbiApCisJCW1heF9yY3Zfd2luID0gYXBwX3dpbjsKKwltYXhfcmN2X3dpbiAmPSB+MHgwMzsgLyogS2VlcCBldmVyeXRoaW5nIGR3b3JkLWFsaWduZWQgKi8KKwlpZiAoIHRjcC0+cmN2X3dpbiA8IG1heF9yY3Zfd2luICkKKwkJdGNwLT5yY3Zfd2luID0gbWF4X3Jjdl93aW47CisKKwkvKiBGaWxsIHVwIHRoZSBUQ1AgaGVhZGVyICovCisJcGF5bG9hZCA9IGlvYnVmLT5kYXRhOworCWlmICggZmxhZ3MgJiBUQ1BfU1lOICkgeworCQltc3NvcHQgPSBpb2JfcHVzaCAoIGlvYnVmLCBzaXplb2YgKCAqbXNzb3B0ICkgKTsKKwkJbXNzb3B0LT5raW5kID0gVENQX09QVElPTl9NU1M7CisJCW1zc29wdC0+bGVuZ3RoID0gc2l6ZW9mICggKm1zc29wdCApOworCQltc3NvcHQtPm1zcyA9IGh0b25zICggVENQX01TUyApOworCX0KKwlpZiAoICggZmxhZ3MgJiBUQ1BfU1lOICkgfHwgdGNwLT50aW1lc3RhbXBzICkgeworCQl0c29wdCA9IGlvYl9wdXNoICggaW9idWYsIHNpemVvZiAoICp0c29wdCApICk7CisJCW1lbXNldCAoIHRzb3B0LT5ub3AsIFRDUF9PUFRJT05fTk9QLCBzaXplb2YgKCB0c29wdC0+bm9wICkgKTsKKwkJdHNvcHQtPnRzb3B0LmtpbmQgPSBUQ1BfT1BUSU9OX1RTOworCQl0c29wdC0+dHNvcHQubGVuZ3RoID0gc2l6ZW9mICggdHNvcHQtPnRzb3B0ICk7CisJCXRzb3B0LT50c29wdC50c3ZhbCA9IG50b2hsICggY3VycnRpY2tzKCkgKTsKKwkJdHNvcHQtPnRzb3B0LnRzZWNyID0gbnRvaGwgKCB0Y3AtPnRzX3JlY2VudCApOworCX0KKwlpZiAoICEgKCBmbGFncyAmIFRDUF9TWU4gKSApCisJCWZsYWdzIHw9IFRDUF9QU0g7CisJdGNwaGRyID0gaW9iX3B1c2ggKCBpb2J1Ziwgc2l6ZW9mICggKnRjcGhkciApICk7CisJbWVtc2V0ICggdGNwaGRyLCAwLCBzaXplb2YgKCAqdGNwaGRyICkgKTsKKwl0Y3BoZHItPnNyYyA9IHRjcC0+bG9jYWxfcG9ydDsKKwl0Y3BoZHItPmRlc3QgPSB0Y3AtPnBlZXIuc3RfcG9ydDsKKwl0Y3BoZHItPnNlcSA9IGh0b25sICggdGNwLT5zbmRfc2VxICk7CisJdGNwaGRyLT5hY2sgPSBodG9ubCAoIHRjcC0+cmN2X2FjayApOworCXRjcGhkci0+aGxlbiA9ICggKCBwYXlsb2FkIC0gaW9idWYtPmRhdGEgKSA8PCAyICk7CisJdGNwaGRyLT5mbGFncyA9IGZsYWdzOworCXRjcGhkci0+d2luID0gaHRvbnMgKCB0Y3AtPnJjdl93aW4gKTsKKwl0Y3BoZHItPmNzdW0gPSB0Y3BpcF9jaGtzdW0gKCBpb2J1Zi0+ZGF0YSwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKworCS8qIER1bXAgaGVhZGVyICovCisJREJHQzIgKCB0Y3AsICJUQ1AgJXAgVFggJWQtPiVkICUwOHguLiUwOHggICAgICAgICAgICUwOHggJTR6ZCIsCisJCXRjcCwgbnRvaHMgKCB0Y3BoZHItPnNyYyApLCBudG9ocyAoIHRjcGhkci0+ZGVzdCApLAorCQludG9obCAoIHRjcGhkci0+c2VxICksICggbnRvaGwgKCB0Y3BoZHItPnNlcSApICsgc2VxX2xlbiApLAorCQludG9obCAoIHRjcGhkci0+YWNrICksIGxlbiApOworCXRjcF9kdW1wX2ZsYWdzICggdGNwLCB0Y3BoZHItPmZsYWdzICk7CisJREJHQzIgKCB0Y3AsICJcbiIgKTsKKworCS8qIFRyYW5zbWl0IHBhY2tldCAqLworCWlmICggKCByYyA9IHRjcGlwX3R4ICggaW9idWYsICZ0Y3BfcHJvdG9jb2wsIE5VTEwsICZ0Y3AtPnBlZXIsIE5VTEwsCisJCQkgICAgICAgJnRjcGhkci0+Y3N1bSApICkgIT0gMCApIHsKKwkJREJHQyAoIHRjcCwgIlRDUCAlcCBjb3VsZCBub3QgdHJhbnNtaXQgJTA4eC4uJTA4eCAlMDh4OiAlc1xuIiwKKwkJICAgICAgIHRjcCwgdGNwLT5zbmRfc2VxLCAoIHRjcC0+c25kX3NlcSArIHRjcC0+c25kX3NlbnQgKSwKKwkJICAgICAgIHRjcC0+cmN2X2Fjaywgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZXRyYW5zbWlzc2lvbiB0aW1lciBleHBpcmVkCisgKgorICogQHYgdGltZXIJUmV0cnkgdGltZXIKKyAqIEB2IG92ZXIJRmFpbHVyZSBpbmRpY2F0b3IKKyAqLworc3RhdGljIHZvaWQgdGNwX2V4cGlyZWQgKCBzdHJ1Y3QgcmV0cnlfdGltZXIgKnRpbWVyLCBpbnQgb3ZlciApIHsKKwlzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcCA9CisJCWNvbnRhaW5lcl9vZiAoIHRpbWVyLCBzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24sIHRpbWVyICk7CisJaW50IGdyYWNlZnVsX2Nsb3NlID0gVENQX0NMT1NFRF9HUkFDRUZVTExZICggdGNwLT50Y3Bfc3RhdGUgKTsKKworCURCR0MgKCB0Y3AsICJUQ1AgJXAgdGltZXIgJXMgaW4gJXMgZm9yICUwOHguLiUwOHggJTA4eFxuIiwgdGNwLAorCSAgICAgICAoIG92ZXIgPyAiZXhwaXJlZCIgOiAiZmlyZWQiICksIHRjcF9zdGF0ZSAoIHRjcC0+dGNwX3N0YXRlICksCisJICAgICAgIHRjcC0+c25kX3NlcSwgKCB0Y3AtPnNuZF9zZXEgKyB0Y3AtPnNuZF9zZW50ICksIHRjcC0+cmN2X2FjayApOworCisJYXNzZXJ0ICggKCB0Y3AtPnRjcF9zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQgKSB8fAorCQkgKCB0Y3AtPnRjcF9zdGF0ZSA9PSBUQ1BfU1lOX1JDVkQgKSB8fAorCQkgKCB0Y3AtPnRjcF9zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQgKSB8fAorCQkgKCB0Y3AtPnRjcF9zdGF0ZSA9PSBUQ1BfRklOX1dBSVRfMSApIHx8CisJCSAoIHRjcC0+dGNwX3N0YXRlID09IFRDUF9USU1FX1dBSVQgKSB8fAorCQkgKCB0Y3AtPnRjcF9zdGF0ZSA9PSBUQ1BfQ0xPU0VfV0FJVCApIHx8CisJCSAoIHRjcC0+dGNwX3N0YXRlID09IFRDUF9DTE9TSU5HX09SX0xBU1RfQUNLICkgKTsKKworCWlmICggb3ZlciB8fCBncmFjZWZ1bF9jbG9zZSApIHsKKwkJLyogSWYgd2UgaGF2ZSBmaW5hbGx5IHRpbWVkIG91dCBhbmQgZ2l2ZW4gdXAsIG9yIGlmCisJCSAqIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIGdyYWNlZnVsIGNsb3NlLCB0ZXJtaW5hdGUKKwkJICogdGhlIGNvbm5lY3Rpb24KKwkJICovCisJCXRjcC0+dGNwX3N0YXRlID0gVENQX0NMT1NFRDsKKwkJdGNwX2R1bXBfc3RhdGUgKCB0Y3AgKTsKKwkJdGNwX2Nsb3NlICggdGNwLCAtRVRJTUVET1VUICk7CisJfSBlbHNlIHsKKwkJLyogT3RoZXJ3aXNlLCByZXRyYW5zbWl0IHRoZSBwYWNrZXQgKi8KKwkJdGNwX3htaXQgKCB0Y3AsIDAgKTsKKwl9Cit9CisKKy8qKgorICogU2VuZCBSU1QgcmVzcG9uc2UgdG8gaW5jb21pbmcgcGFja2V0CisgKgorICogQHYgaW5fdGNwaGRyCQlUQ1AgaGVhZGVyIG9mIGluY29taW5nIHBhY2tldAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGNwX3htaXRfcmVzZXQgKCBzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcCwKKwkJCSAgICBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X2Rlc3QsCisJCQkgICAgc3RydWN0IHRjcF9oZWFkZXIgKmluX3RjcGhkciApIHsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwlzdHJ1Y3QgdGNwX2hlYWRlciAqdGNwaGRyOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBkYXRhbGVzcyBUWCBidWZmZXIgKi8KKwlpb2J1ZiA9IGFsbG9jX2lvYiAoIE1BWF9IRFJfTEVOICk7CisJaWYgKCAhIGlvYnVmICkgeworCQlEQkdDICggdGNwLCAiVENQICVwIGNvdWxkIG5vdCBhbGxvY2F0ZSBpb2J1ZiBmb3IgUlNUICIKKwkJICAgICAgICIlMDh4Li4lMDh4ICUwOHhcbiIsIHRjcCwgbnRvaGwgKCBpbl90Y3BoZHItPmFjayApLAorCQkgICAgICAgbnRvaGwgKCBpbl90Y3BoZHItPmFjayApLCBudG9obCAoIGluX3RjcGhkci0+c2VxICkgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlvYl9yZXNlcnZlICggaW9idWYsIE1BWF9IRFJfTEVOICk7CisKKwkvKiBDb25zdHJ1Y3QgUlNUIHJlc3BvbnNlICovCisJdGNwaGRyID0gaW9iX3B1c2ggKCBpb2J1Ziwgc2l6ZW9mICggKnRjcGhkciApICk7CisJbWVtc2V0ICggdGNwaGRyLCAwLCBzaXplb2YgKCAqdGNwaGRyICkgKTsKKwl0Y3BoZHItPnNyYyA9IGluX3RjcGhkci0+ZGVzdDsKKwl0Y3BoZHItPmRlc3QgPSBpbl90Y3BoZHItPnNyYzsKKwl0Y3BoZHItPnNlcSA9IGluX3RjcGhkci0+YWNrOworCXRjcGhkci0+YWNrID0gaW5fdGNwaGRyLT5zZXE7CisJdGNwaGRyLT5obGVuID0gKCAoIHNpemVvZiAoICp0Y3BoZHIgKSAvIDQgKSA8PCA0ICk7CisJdGNwaGRyLT5mbGFncyA9ICggVENQX1JTVCB8IFRDUF9BQ0sgKTsKKwl0Y3BoZHItPndpbiA9IGh0b25zICggVENQX01BWF9XSU5ET1dfU0laRSApOworCXRjcGhkci0+Y3N1bSA9IHRjcGlwX2Noa3N1bSAoIGlvYnVmLT5kYXRhLCBpb2JfbGVuICggaW9idWYgKSApOworCisJLyogRHVtcCBoZWFkZXIgKi8KKwlEQkdDMiAoIHRjcCwgIlRDUCAlcCBUWCAlZC0+JWQgJTA4eC4uJTA4eCAgICAgICAgICAgJTA4eCAlNGQiLAorCQl0Y3AsIG50b2hzICggdGNwaGRyLT5zcmMgKSwgbnRvaHMgKCB0Y3BoZHItPmRlc3QgKSwKKwkJbnRvaGwgKCB0Y3BoZHItPnNlcSApLCAoIG50b2hsICggdGNwaGRyLT5zZXEgKSApLAorCQludG9obCAoIHRjcGhkci0+YWNrICksIDAgKTsKKwl0Y3BfZHVtcF9mbGFncyAoIHRjcCwgdGNwaGRyLT5mbGFncyApOworCURCR0MyICggdGNwLCAiXG4iICk7CisKKwkvKiBUcmFuc21pdCBwYWNrZXQgKi8KKwlpZiAoICggcmMgPSB0Y3BpcF90eCAoIGlvYnVmLCAmdGNwX3Byb3RvY29sLCBOVUxMLCBzdF9kZXN0LAorCQkJICAgICAgIE5VTEwsICZ0Y3BoZHItPmNzdW0gKSApICE9IDAgKSB7CisJCURCR0MgKCB0Y3AsICJUQ1AgJXAgY291bGQgbm90IHRyYW5zbWl0IFJTVCAlMDh4Li4lMDh4ICUwOHg6ICIKKwkJICAgICAgICIlc1xuIiwgdGNwLCBudG9obCAoIGluX3RjcGhkci0+YWNrICksCisJCSAgICAgICBudG9obCAoIGluX3RjcGhkci0+YWNrICksIG50b2hsICggaW5fdGNwaGRyLT5zZXEgKSwKKwkJICAgICAgIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWNlaXZlIGRhdGEgcGF0aAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIElkZW50aWZ5IFRDUCBjb25uZWN0aW9uIGJ5IGxvY2FsIHBvcnQgbnVtYmVyCisgKgorICogQHYgbG9jYWxfcG9ydAlMb2NhbCBwb3J0IChpbiBuZXR3b3JrLWVuZGlhbiBvcmRlcikKKyAqIEByZXQgdGNwCQlUQ1AgY29ubmVjdGlvbiwgb3IgTlVMTAorICovCitzdGF0aWMgc3RydWN0IHRjcF9jb25uZWN0aW9uICogdGNwX2RlbXV4ICggdW5zaWduZWQgaW50IGxvY2FsX3BvcnQgKSB7CisJc3RydWN0IHRjcF9jb25uZWN0aW9uICp0Y3A7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICggdGNwLCAmdGNwX2Nvbm5zLCBsaXN0ICkgeworCQlpZiAoIHRjcC0+bG9jYWxfcG9ydCA9PSBsb2NhbF9wb3J0ICkKKwkJCXJldHVybiB0Y3A7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIFBhcnNlIFRDUCByZWNlaXZlZCBvcHRpb25zCisgKgorICogQHYgdGNwCQlUQ1AgY29ubmVjdGlvbgorICogQHYgZGF0YQkJUmF3IG9wdGlvbnMgZGF0YQorICogQHYgbGVuCQlSYXcgb3B0aW9ucyBsZW5ndGgKKyAqIEB2IG9wdGlvbnMJCU9wdGlvbnMgc3RydWN0dXJlIHRvIGZpbGwgaW4KKyAqLworc3RhdGljIHZvaWQgdGNwX3J4X29wdHMgKCBzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgc2l6ZV90IGxlbiwgc3RydWN0IHRjcF9vcHRpb25zICpvcHRpb25zICkgeworCWNvbnN0IHZvaWQgKmVuZCA9ICggZGF0YSArIGxlbiApOworCWNvbnN0IHN0cnVjdCB0Y3Bfb3B0aW9uICpvcHRpb247CisJdW5zaWduZWQgaW50IGtpbmQ7CisKKwltZW1zZXQgKCBvcHRpb25zLCAwLCBzaXplb2YgKCAqb3B0aW9ucyApICk7CisJd2hpbGUgKCBkYXRhIDwgZW5kICkgeworCQlvcHRpb24gPSBkYXRhOworCQlraW5kID0gb3B0aW9uLT5raW5kOworCQlpZiAoIGtpbmQgPT0gVENQX09QVElPTl9FTkQgKQorCQkJcmV0dXJuOworCQlpZiAoIGtpbmQgPT0gVENQX09QVElPTl9OT1AgKSB7CisJCQlkYXRhKys7CisJCQljb250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKCBraW5kICkgeworCQljYXNlIFRDUF9PUFRJT05fTVNTOgorCQkJb3B0aW9ucy0+bXNzb3B0ID0gZGF0YTsKKwkJCWJyZWFrOworCQljYXNlIFRDUF9PUFRJT05fVFM6CisJCQlvcHRpb25zLT50c29wdCA9IGRhdGE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR0MgKCB0Y3AsICJUQ1AgJXAgcmVjZWl2ZWQgdW5rbm93biBvcHRpb24gJWRcbiIsCisJCQkgICAgICAgdGNwLCBraW5kICk7CisJCQlicmVhazsKKwkJfQorCQlkYXRhICs9IG9wdGlvbi0+bGVuZ3RoOworCX0KK30KKworLyoqCisgKiBDb25zdW1lIHJlY2VpdmVkIHNlcXVlbmNlIHNwYWNlCisgKgorICogQHYgdGNwCQlUQ1AgY29ubmVjdGlvbgorICogQHYgc2VxX2xlbgkJU2VxdWVuY2Ugc3BhY2UgbGVuZ3RoIHRvIGNvbnN1bWUKKyAqLworc3RhdGljIHZvaWQgdGNwX3J4X3NlcSAoIHN0cnVjdCB0Y3BfY29ubmVjdGlvbiAqdGNwLCB1aW50MzJfdCBzZXFfbGVuICkgeworCXRjcC0+cmN2X2FjayArPSBzZXFfbGVuOworCWlmICggdGNwLT5yY3Zfd2luID4gc2VxX2xlbiApIHsKKwkJdGNwLT5yY3Zfd2luIC09IHNlcV9sZW47CisJfSBlbHNlIHsKKwkJdGNwLT5yY3Zfd2luID0gMDsKKwl9Cit9CisKKy8qKgorICogSGFuZGxlIFRDUCByZWNlaXZlZCBTWU4KKyAqCisgKiBAdiB0Y3AJCVRDUCBjb25uZWN0aW9uCisgKiBAdiBzZXEJCVNFUSB2YWx1ZSAoaW4gaG9zdC1lbmRpYW4gb3JkZXIpCisgKiBAdiBvcHRpb25zCQlUQ1Agb3B0aW9ucworICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGNwX3J4X3N5biAoIHN0cnVjdCB0Y3BfY29ubmVjdGlvbiAqdGNwLCB1aW50MzJfdCBzZXEsCisJCQlzdHJ1Y3QgdGNwX29wdGlvbnMgKm9wdGlvbnMgKSB7CisKKwkvKiBTeW5jaHJvbmlzZSBzZXF1ZW5jZSBudW1iZXJzIG9uIGZpcnN0IFNZTiAqLworCWlmICggISAoIHRjcC0+dGNwX3N0YXRlICYgVENQX1NUQVRFX1JDVkQgKCBUQ1BfU1lOICkgKSApIHsKKwkJdGNwLT5yY3ZfYWNrID0gc2VxOworCQlpZiAoIG9wdGlvbnMtPnRzb3B0ICkKKwkJCXRjcC0+dGltZXN0YW1wcyA9IDE7CisJfQorCisJLyogSWdub3JlIGR1cGxpY2F0ZSBTWU4gKi8KKwlpZiAoICggdGNwLT5yY3ZfYWNrIC0gc2VxICkgPiAwICkKKwkJcmV0dXJuIDA7CisKKwkvKiBNYXJrIFNZTiBhcyByZWNlaXZlZCBhbmQgc3RhcnQgc2VuZGluZyBBQ0tzIHdpdGggZWFjaCBwYWNrZXQgKi8KKwl0Y3AtPnRjcF9zdGF0ZSB8PSAoIFRDUF9TVEFURV9TRU5UICggVENQX0FDSyApIHwKKwkJCSAgICBUQ1BfU1RBVEVfUkNWRCAoIFRDUF9TWU4gKSApOworCisJLyogQWNrbm93bGVkZ2UgU1lOICovCisJdGNwX3J4X3NlcSAoIHRjcCwgMSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFuZGxlIFRDUCByZWNlaXZlZCBBQ0sKKyAqCisgKiBAdiB0Y3AJCVRDUCBjb25uZWN0aW9uCisgKiBAdiBhY2sJCUFDSyB2YWx1ZSAoaW4gaG9zdC1lbmRpYW4gb3JkZXIpCisgKiBAdiB3aW4JCVdJTiB2YWx1ZSAoaW4gaG9zdC1lbmRpYW4gb3JkZXIpCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0Y3BfcnhfYWNrICggc3RydWN0IHRjcF9jb25uZWN0aW9uICp0Y3AsIHVpbnQzMl90IGFjaywKKwkJCXVpbnQzMl90IHdpbiApIHsKKwl1aW50MzJfdCBhY2tfbGVuID0gKCBhY2sgLSB0Y3AtPnNuZF9zZXEgKTsKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGludCBhY2tlZF9mbGFnczsKKworCS8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2Ugb3Igb2xkIGR1cGxpY2F0ZSBBQ0tzICovCisJaWYgKCBhY2tfbGVuID4gdGNwLT5zbmRfc2VudCApIHsKKwkJREJHQyAoIHRjcCwgIlRDUCAlcCByZWNlaXZlZCBBQ0sgZm9yICUwOHguLiUwOHgsICIKKwkJICAgICAgICJzZW50IG9ubHkgJTA4eC4uJTA4eFxuIiwgdGNwLCB0Y3AtPnNuZF9zZXEsCisJCSAgICAgICAoIHRjcC0+c25kX3NlcSArIGFja19sZW4gKSwgdGNwLT5zbmRfc2VxLAorCQkgICAgICAgKCB0Y3AtPnNuZF9zZXEgKyB0Y3AtPnNuZF9zZW50ICkgKTsKKworCQlpZiAoIFRDUF9IQVNfQkVFTl9FU1RBQkxJU0hFRCAoIHRjcC0+dGNwX3N0YXRlICkgKSB7CisJCQkvKiBKdXN0IGlnbm9yZSB3aGF0IG1pZ2h0IGJlIG9sZCBkdXBsaWNhdGUgQUNLcyAqLworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKiBTZW5kIFJTVCBpZiBhbiBvdXQtb2YtcmFuZ2UgQUNLIGlzIHJlY2VpdmVkCisJCQkgKiBvbiBhIG5vdC15ZXQtZXN0YWJsaXNoZWQgY29ubmVjdGlvbiwgYXMgcGVyCisJCQkgKiBSRkMgNzkzLgorCQkJICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIElnbm9yZSBBQ0tzIHRoYXQgZG9uJ3QgYWN0dWFsbHkgYWNrbm93bGVkZ2UgYW55IG5ldyBkYXRhLgorCSAqIChJbiBwYXJ0aWN1bGFyLCBkbyBub3Qgc3RvcCB0aGUgcmV0cmFuc21pc3Npb24gdGltZXI7IHRoaXMKKwkgKiBhdm9pZHMgY3JlYXRpbmcgYSBzb3JjZXJvcidzIGFwcHJlbnRpY2Ugc3luZHJvbWUgd2hlbiBhCisJICogZHVwbGljYXRlIEFDSyBpcyByZWNlaXZlZCBhbmQgd2Ugc3RpbGwgaGF2ZSBkYXRhIGluIG91cgorCSAqIHRyYW5zbWl0IHF1ZXVlLikKKwkgKi8KKwlpZiAoIGFja19sZW4gPT0gMCApCisJCXJldHVybiAwOworCisJLyogU3RvcCB0aGUgcmV0cmFuc21pc3Npb24gdGltZXIgKi8KKwlzdG9wX3RpbWVyICggJnRjcC0+dGltZXIgKTsKKworCS8qIERldGVybWluZSBhY2tub3dsZWRnZWQgZmxhZ3MgYW5kIGRhdGEgbGVuZ3RoICovCisJbGVuID0gYWNrX2xlbjsKKwlhY2tlZF9mbGFncyA9ICggVENQX0ZMQUdTX1NFTkRJTkcgKCB0Y3AtPnRjcF9zdGF0ZSApICYKKwkJCSggVENQX1NZTiB8IFRDUF9GSU4gKSApOworCWlmICggYWNrZWRfZmxhZ3MgKQorCQlsZW4tLTsKKworCS8qIFVwZGF0ZSBTRVEgYW5kIHNlbnQgY291bnRlcnMsIGFuZCB3aW5kb3cgc2l6ZSAqLworCXRjcC0+c25kX3NlcSA9IGFjazsKKwl0Y3AtPnNuZF9zZW50ID0gMDsKKwl0Y3AtPnNuZF93aW4gPSB3aW47CisKKwkvKiBSZW1vdmUgYW55IGFja25vd2xlZGdlZCBkYXRhIGZyb20gdHJhbnNtaXQgcXVldWUgKi8KKwl0Y3BfcHJvY2Vzc19xdWV1ZSAoIHRjcCwgbGVuLCBOVUxMLCAxICk7CisJCQorCS8qIE1hcmsgU1lOL0ZJTiBhcyBhY2tub3dsZWRnZWQgaWYgYXBwbGljYWJsZS4gKi8KKwlpZiAoIGFja2VkX2ZsYWdzICkKKwkJdGNwLT50Y3Bfc3RhdGUgfD0gVENQX1NUQVRFX0FDS0VEICggYWNrZWRfZmxhZ3MgKTsKKworCS8qIFN0YXJ0IHNlbmRpbmcgRklOIGlmIHdlJ3ZlIGhhZCBhbGwgcG9zc2libGUgZGF0YSBBQ0tlZCAqLworCWlmICggbGlzdF9lbXB0eSAoICZ0Y3AtPnF1ZXVlICkgJiYgdGNwLT54ZmVyX2Nsb3NlZCApCisJCXRjcC0+dGNwX3N0YXRlIHw9IFRDUF9TVEFURV9TRU5UICggVENQX0ZJTiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFuZGxlIFRDUCByZWNlaXZlZCBkYXRhCisgKgorICogQHYgdGNwCQlUQ1AgY29ubmVjdGlvbgorICogQHYgc2VxCQlTRVEgdmFsdWUgKGluIGhvc3QtZW5kaWFuIG9yZGVyKQorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBJL08gYnVmZmVyLgorICovCitzdGF0aWMgaW50IHRjcF9yeF9kYXRhICggc3RydWN0IHRjcF9jb25uZWN0aW9uICp0Y3AsIHVpbnQzMl90IHNlcSwKKwkJCSBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiApIHsKKwl1aW50MzJfdCBhbHJlYWR5X3JjdmQ7CisJdWludDMyX3QgbGVuOworCWludCByYzsKKworCS8qIElnbm9yZSBkdXBsaWNhdGUgb3Igb3V0LW9mLW9yZGVyIGRhdGEgKi8KKwlhbHJlYWR5X3JjdmQgPSAoIHRjcC0+cmN2X2FjayAtIHNlcSApOworCWxlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCWlmICggYWxyZWFkeV9yY3ZkID49IGxlbiApIHsKKwkJZnJlZV9pb2IgKCBpb2J1ZiApOworCQlyZXR1cm4gMDsKKwl9CisJaW9iX3B1bGwgKCBpb2J1ZiwgYWxyZWFkeV9yY3ZkICk7CisJbGVuIC09IGFscmVhZHlfcmN2ZDsKKworCS8qIERlbGl2ZXIgZGF0YSB0byBhcHBsaWNhdGlvbiAqLworCWlmICggKCByYyA9IHhmZXJfZGVsaXZlcl9pb2IgKCAmdGNwLT54ZmVyLCBpb2J1ZiApICkgIT0gMCApIHsKKwkJREJHQyAoIHRjcCwgIlRDUCAlcCBjb3VsZCBub3QgZGVsaXZlciAlMDh4Li4lMDh4OiAlc1xuIiwKKwkJICAgICAgIHRjcCwgc2VxLCAoIHNlcSArIGxlbiApLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEFja25vd2xlZGdlIG5ldyBkYXRhICovCisJdGNwX3J4X3NlcSAoIHRjcCwgbGVuICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgVENQIHJlY2VpdmVkIEZJTgorICoKKyAqIEB2IHRjcAkJVENQIGNvbm5lY3Rpb24KKyAqIEB2IHNlcQkJU0VRIHZhbHVlIChpbiBob3N0LWVuZGlhbiBvcmRlcikKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRjcF9yeF9maW4gKCBzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcCwgdWludDMyX3Qgc2VxICkgeworCisJLyogSWdub3JlIGR1cGxpY2F0ZSBvciBvdXQtb2Ytb3JkZXIgRklOICovCisJaWYgKCAoIHRjcC0+cmN2X2FjayAtIHNlcSApID4gMCApCisJCXJldHVybiAwOworCisJLyogTWFyayBGSU4gYXMgcmVjZWl2ZWQgYW5kIGFja25vd2xlZGdlIGl0ICovCisJdGNwLT50Y3Bfc3RhdGUgfD0gVENQX1NUQVRFX1JDVkQgKCBUQ1BfRklOICk7CisJdGNwX3J4X3NlcSAoIHRjcCwgMSApOworCisJLyogQ2xvc2UgY29ubmVjdGlvbiAqLworCXRjcF9jbG9zZSAoIHRjcCwgMCApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFuZGxlIFRDUCByZWNlaXZlZCBSU1QKKyAqCisgKiBAdiB0Y3AJCVRDUCBjb25uZWN0aW9uCisgKiBAdiBzZXEJCVNFUSB2YWx1ZSAoaW4gaG9zdC1lbmRpYW4gb3JkZXIpCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0Y3BfcnhfcnN0ICggc3RydWN0IHRjcF9jb25uZWN0aW9uICp0Y3AsIHVpbnQzMl90IHNlcSApIHsKKworCS8qIEFjY2VwdCBSU1Qgb25seSBpZiBpdCBmYWxscyB3aXRoaW4gdGhlIHdpbmRvdy4gIElmIHdlIGhhdmUKKwkgKiBub3QgeWV0IHJlY2VpdmVkIGEgU1lOLCB0aGVuIHdlIGhhdmUgbm8gd2luZG93IHRvIHRlc3QKKwkgKiBhZ2FpbnN0LCBzbyBmYWxsIGJhY2sgdG8gY2hlY2tpbmcgdGhhdCBvdXIgU1lOIGhhcyBiZWVuCisJICogQUNLZWQuCisJICovCisJaWYgKCB0Y3AtPnRjcF9zdGF0ZSAmIFRDUF9TVEFURV9SQ1ZEICggVENQX1NZTiApICkgeworCQlpZiAoICggc2VxIC0gdGNwLT5yY3ZfYWNrICkgPj0gdGNwLT5yY3Zfd2luICkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmICggISAoIHRjcC0+dGNwX3N0YXRlICYgVENQX1NUQVRFX0FDS0VEICggVENQX1NZTiApICkgKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogQWJvcnQgY29ubmVjdGlvbiAqLworCXRjcC0+dGNwX3N0YXRlID0gVENQX0NMT1NFRDsKKwl0Y3BfZHVtcF9zdGF0ZSAoIHRjcCApOworCXRjcF9jbG9zZSAoIHRjcCwgLUVDT05OUkVTRVQgKTsKKworCURCR0MgKCB0Y3AsICJUQ1AgJXAgY29ubmVjdGlvbiByZXNldCBieSBwZWVyXG4iLCB0Y3AgKTsKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKKy8qKgorICogUHJvY2VzcyByZWNlaXZlZCBwYWNrZXQKKyAqCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgc3Rfc3JjCQlQYXJ0aWFsbHktZmlsbGVkIHNvdXJjZSBhZGRyZXNzCisgKiBAdiBzdF9kZXN0CQlQYXJ0aWFsbHktZmlsbGVkIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEB2IHBzaGRyX2NzdW0JUHNldWRvLWhlYWRlciBjaGVja3N1bQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgICovCitzdGF0aWMgaW50IHRjcF9yeCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkgICAgc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9zcmMsCisJCSAgICBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X2Rlc3QgX191bnVzZWQsCisJCSAgICB1aW50MTZfdCBwc2hkcl9jc3VtICkgeworCXN0cnVjdCB0Y3BfaGVhZGVyICp0Y3BoZHIgPSBpb2J1Zi0+ZGF0YTsKKwlzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcDsKKwlzdHJ1Y3QgdGNwX29wdGlvbnMgb3B0aW9uczsKKwlzaXplX3QgaGxlbjsKKwl1aW50MTZfdCBjc3VtOworCXVpbnQzMl90IHN0YXJ0X3NlcTsKKwl1aW50MzJfdCBzZXE7CisJdWludDMyX3QgYWNrOworCXVpbnQzMl90IHdpbjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJc2l6ZV90IGxlbjsKKwlpbnQgcmM7CisKKwkvKiBTYW5pdHkgY2hlY2sgcGFja2V0ICovCisJaWYgKCBpb2JfbGVuICggaW9idWYgKSA8IHNpemVvZiAoICp0Y3BoZHIgKSApIHsKKwkJREJHICggIlRDUCBwYWNrZXQgdG9vIHNob3J0IGF0ICV6ZCBieXRlcyAobWluICV6ZCBieXRlcylcbiIsCisJCSAgICAgIGlvYl9sZW4gKCBpb2J1ZiApLCBzaXplb2YgKCAqdGNwaGRyICkgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRpc2NhcmQ7CisJfQorCWhsZW4gPSAoICggdGNwaGRyLT5obGVuICYgVENQX01BU0tfSExFTiApIC8gMTYgKSAqIDQ7CisJaWYgKCBobGVuIDwgc2l6ZW9mICggKnRjcGhkciApICkgeworCQlEQkcgKCAiVENQIGhlYWRlciB0b28gc2hvcnQgYXQgJXpkIGJ5dGVzIChtaW4gJXpkIGJ5dGVzKVxuIiwKKwkJICAgICAgaGxlbiwgc2l6ZW9mICggKnRjcGhkciApICk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkaXNjYXJkOworCX0KKwlpZiAoIGhsZW4gPiBpb2JfbGVuICggaW9idWYgKSApIHsKKwkJREJHICggIlRDUCBoZWFkZXIgdG9vIGxvbmcgYXQgJXpkIGJ5dGVzIChtYXggJXpkIGJ5dGVzKVxuIiwKKwkJICAgICAgaGxlbiwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRpc2NhcmQ7CisJfQorCWNzdW0gPSB0Y3BpcF9jb250aW51ZV9jaGtzdW0gKCBwc2hkcl9jc3VtLCBpb2J1Zi0+ZGF0YSwKKwkJCQkgICAgICAgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwlpZiAoIGNzdW0gIT0gMCApIHsKKwkJREJHICggIlRDUCBjaGVja3N1bSBpbmNvcnJlY3QgKGlzICUwNHggaW5jbHVkaW5nIGNoZWNrc3VtICIKKwkJICAgICAgImZpZWxkLCBzaG91bGQgYmUgMDAwMClcbiIsIGNzdW0gKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRpc2NhcmQ7CisJfQorCQorCS8qIFBhcnNlIHBhcmFtZXRlcnMgZnJvbSBoZWFkZXIgYW5kIHN0cmlwIGhlYWRlciAqLworCXRjcCA9IHRjcF9kZW11eCAoIHRjcGhkci0+ZGVzdCApOworCXN0YXJ0X3NlcSA9IHNlcSA9IG50b2hsICggdGNwaGRyLT5zZXEgKTsKKwlhY2sgPSBudG9obCAoIHRjcGhkci0+YWNrICk7CisJd2luID0gbnRvaHMgKCB0Y3BoZHItPndpbiApOworCWZsYWdzID0gdGNwaGRyLT5mbGFnczsKKwl0Y3Bfcnhfb3B0cyAoIHRjcCwgKCAoICggdm9pZCAqICkgdGNwaGRyICkgKyBzaXplb2YgKCAqdGNwaGRyICkgKSwKKwkJICAgICAgKCBobGVuIC0gc2l6ZW9mICggKnRjcGhkciApICksICZvcHRpb25zICk7CisJaW9iX3B1bGwgKCBpb2J1ZiwgaGxlbiApOworCWxlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCisJLyogRHVtcCBoZWFkZXIgKi8KKwlEQkdDMiAoIHRjcCwgIlRDUCAlcCBSWCAlZDwtJWQgICAgICAgICAgICUwOHggJTA4eC4uJTA4enggJTR6ZCIsCisJCXRjcCwgbnRvaHMgKCB0Y3BoZHItPmRlc3QgKSwgbnRvaHMgKCB0Y3BoZHItPnNyYyApLAorCQludG9obCAoIHRjcGhkci0+YWNrICksIG50b2hsICggdGNwaGRyLT5zZXEgKSwKKwkJKCBudG9obCAoIHRjcGhkci0+c2VxICkgKyBsZW4gKworCQkgICggKCB0Y3BoZHItPmZsYWdzICYgKCBUQ1BfU1lOIHwgVENQX0ZJTiApICkgPyAxIDogMCApKSwgbGVuKTsKKwl0Y3BfZHVtcF9mbGFncyAoIHRjcCwgdGNwaGRyLT5mbGFncyApOworCURCR0MyICggdGNwLCAiXG4iICk7CisKKwkvKiBJZiBubyBjb25uZWN0aW9uIHdhcyBmb3VuZCwgc2VuZCBSU1QgKi8KKwlpZiAoICEgdGNwICkgeworCQl0Y3BfeG1pdF9yZXNldCAoIHRjcCwgc3Rfc3JjLCB0Y3BoZHIgKTsKKwkJcmMgPSAtRU5PVENPTk47CisJCWdvdG8gZGlzY2FyZDsKKwl9CisKKwkvKiBIYW5kbGUgQUNLLCBpZiBwcmVzZW50ICovCisJaWYgKCBmbGFncyAmIFRDUF9BQ0sgKSB7CisJCWlmICggKCByYyA9IHRjcF9yeF9hY2sgKCB0Y3AsIGFjaywgd2luICkgKSAhPSAwICkgeworCQkJdGNwX3htaXRfcmVzZXQgKCB0Y3AsIHN0X3NyYywgdGNwaGRyICk7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgU1lOLCBpZiBwcmVzZW50ICovCisJaWYgKCBmbGFncyAmIFRDUF9TWU4gKSB7CisJCXRjcF9yeF9zeW4gKCB0Y3AsIHNlcSwgJm9wdGlvbnMgKTsKKwkJc2VxKys7CisJfQorCisJLyogSGFuZGxlIFJTVCwgaWYgcHJlc2VudCAqLworCWlmICggZmxhZ3MgJiBUQ1BfUlNUICkgeworCQlpZiAoICggcmMgPSB0Y3BfcnhfcnN0ICggdGNwLCBzZXEgKSApICE9IDAgKQorCQkJZ290byBkaXNjYXJkOworCX0KKworCS8qIEhhbmRsZSBuZXcgZGF0YSwgaWYgYW55ICovCisJdGNwX3J4X2RhdGEgKCB0Y3AsIHNlcSwgaW9idWYgKTsKKwlzZXEgKz0gbGVuOworCisJLyogSGFuZGxlIEZJTiwgaWYgcHJlc2VudCAqLworCWlmICggZmxhZ3MgJiBUQ1BfRklOICkgeworCQl0Y3BfcnhfZmluICggdGNwLCBzZXEgKTsKKwkJc2VxKys7CisJfQorCisJLyogVXBkYXRlIHRpbWVzdGFtcCwgaWYgcHJlc2VudCBhbmQgYXBwbGljYWJsZSAqLworCWlmICggKCBzZXEgPT0gdGNwLT5yY3ZfYWNrICkgJiYgb3B0aW9ucy50c29wdCApCisJCXRjcC0+dHNfcmVjZW50ID0gbnRvaGwgKCBvcHRpb25zLnRzb3B0LT50c3ZhbCApOworCisJLyogRHVtcCBvdXQgYW55IHN0YXRlIGNoYW5nZSBhcyBhIHJlc3VsdCBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0ICovCisJdGNwX2R1bXBfc3RhdGUgKCB0Y3AgKTsKKworCS8qIFNlbmQgb3V0IGFueSBwZW5kaW5nIGRhdGEuICBXZSBmb3JjZSBzZW5kaW5nIGEgcmVwbHkgaWYgZWl0aGVyCisJICoKKwkgKiAgYSkgdGhlIHBlZXIgaXMgZXhwZWN0aW5nIGFuIEFDSyAoaS5lLiBjb25zdW1lZCBzZXF1ZW5jZSBzcGFjZSksIG9yCisJICogIGIpIGVpdGhlciBlbmQgb2YgdGhlIHBhY2tldCB3YXMgb3V0c2lkZSB0aGUgcmVjZWl2ZSB3aW5kb3cKKwkgKgorCSAqIENhc2UgKGIpIGVuYWJsZXMgdXMgdG8gc3VwcG9ydCBUQ1Aga2VlcGFsaXZlcyB1c2luZworCSAqIHplcm8tbGVuZ3RoIHBhY2tldHMsIHdoaWNoIHdlIHdvdWxkIG90aGVyd2lzZSBpZ25vcmUuICBOb3RlCisJICogdGhhdCBmb3IgY2FzZSAoYiksIHdlIG5lZWQgKm9ubHkqIGNvbnNpZGVyIHplcm8tbGVuZ3RoCisJICogcGFja2V0cywgc2luY2Ugbm9uLXplcm8tbGVuZ3RoIHBhY2tldHMgd2lsbCBhbHJlYWR5IGJlCisJICogY2F1Z2h0IGJ5IGNhc2UgKGEpLgorCSAqLworCXRjcF94bWl0ICggdGNwLCAoICggc3RhcnRfc2VxICE9IHNlcSApIHx8CisJCQkgICggKCBzZXEgLSB0Y3AtPnJjdl9hY2sgKSA+IHRjcC0+cmN2X3dpbiApICkgKTsKKworCS8qIElmIHRoaXMgcGFja2V0IHdhcyB0aGUgbGFzdCB3ZSBleHBlY3QgdG8gcmVjZWl2ZSwgc2V0IHVwCisJICogdGltZXIgdG8gZXhwaXJlIGFuZCBjYXVzZSB0aGUgY29ubmVjdGlvbiB0byBiZSBmcmVlZC4KKwkgKi8KKwlpZiAoIFRDUF9DTE9TRURfR1JBQ0VGVUxMWSAoIHRjcC0+dGNwX3N0YXRlICkgKSB7CisJCXRjcC0+dGltZXIudGltZW91dCA9ICggMiAqIFRDUF9NU0wgKTsKKwkJc3RhcnRfdGltZXIgKCAmdGNwLT50aW1lciApOworCX0KKworCXJldHVybiAwOworCisgZGlzY2FyZDoKKwkvKiBGcmVlIHJlY2VpdmVkIHBhY2tldCAqLworCWZyZWVfaW9iICggaW9idWYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKiBUQ1AgcHJvdG9jb2wgKi8KK3N0cnVjdCB0Y3BpcF9wcm90b2NvbCB0Y3BfcHJvdG9jb2wgX190Y3BpcF9wcm90b2NvbCA9IHsKKwkubmFtZSA9ICJUQ1AiLAorCS5yeCA9IHRjcF9yeCwKKwkudGNwaXBfcHJvdG8gPSBJUF9UQ1AsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBDbG9zZSBpbnRlcmZhY2UKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgcmMJCVJlYXNvbiBmb3IgY2xvc2UKKyAqLworc3RhdGljIHZvaWQgdGNwX3hmZXJfY2xvc2UgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGludCByYyApIHsKKwlzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcCA9CisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCB0Y3BfY29ubmVjdGlvbiwgeGZlciApOworCisJLyogQ2xvc2UgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UgKi8KKwl0Y3BfY2xvc2UgKCB0Y3AsIHJjICk7CisKKwkvKiBUcmFuc21pdCBGSU4sIGlmIHBvc3NpYmxlICovCisJdGNwX3htaXQgKCB0Y3AsIDAgKTsKK30KKworLyoqCisgKiBDaGVjayBmbG93IGNvbnRyb2wgd2luZG93CisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEByZXQgbGVuCQlMZW5ndGggb2Ygd2luZG93CisgKi8KK3N0YXRpYyBzaXplX3QgdGNwX3hmZXJfd2luZG93ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyICkgeworCXN0cnVjdCB0Y3BfY29ubmVjdGlvbiAqdGNwID0KKwkJY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IHRjcF9jb25uZWN0aW9uLCB4ZmVyICk7CisKKwkvKiBOb3QgcmVhZHkgaWYgZGF0YSBxdWV1ZSBpcyBub24tZW1wdHkuICBUaGlzIGltcG9zZXMgYSBsaW1pdAorCSAqIG9mIG9ubHkgb25lIHVuQUNLZWQgcGFja2V0IGluIHRoZSBUWCBxdWV1ZSBhdCBhbnkgdGltZTsgd2UKKwkgKiBkbyB0aGlzIHRvIGNvbnNlcnZlIG1lbW9yeSB1c2FnZS4KKwkgKi8KKwlpZiAoICEgbGlzdF9lbXB0eSAoICZ0Y3AtPnF1ZXVlICkgKQorCQlyZXR1cm4gMDsKKworCS8qIFJldHVybiBUQ1Agd2luZG93IGxlbmd0aCAqLworCXJldHVybiB0Y3BfeG1pdF93aW4gKCB0Y3AgKTsKK30KKworLyoqCisgKiBEZWxpdmVyIGRhdGFncmFtIGFzIEkvTyBidWZmZXIKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgaW9idWYJCURhdGFncmFtIEkvTyBidWZmZXIKKyAqIEB2IG1ldGEJCURhdGEgdHJhbnNmZXIgbWV0YWRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRjcF94ZmVyX2RlbGl2ZXJfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCQkJICBzdHJ1Y3QgeGZlcl9tZXRhZGF0YSAqbWV0YSBfX3VudXNlZCApIHsKKwlzdHJ1Y3QgdGNwX2Nvbm5lY3Rpb24gKnRjcCA9CisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCB0Y3BfY29ubmVjdGlvbiwgeGZlciApOworCisJLyogRW5xdWV1ZSBwYWNrZXQgKi8KKwlsaXN0X2FkZF90YWlsICggJmlvYnVmLT5saXN0LCAmdGNwLT5xdWV1ZSApOworCisJLyogVHJhbnNtaXQgZGF0YSwgaWYgcG9zc2libGUgKi8KKwl0Y3BfeG1pdCAoIHRjcCwgMCApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBUQ1AgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2Ugb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCB4ZmVyX2ludGVyZmFjZV9vcGVyYXRpb25zIHRjcF94ZmVyX29wZXJhdGlvbnMgPSB7CisJLmNsb3NlCQk9IHRjcF94ZmVyX2Nsb3NlLAorCS52cmVkaXJlY3QJPSBpZ25vcmVfeGZlcl92cmVkaXJlY3QsCisJLndpbmRvdwkJPSB0Y3BfeGZlcl93aW5kb3csCisJLmFsbG9jX2lvYgk9IGRlZmF1bHRfeGZlcl9hbGxvY19pb2IsCisJLmRlbGl2ZXJfaW9iCT0gdGNwX3hmZXJfZGVsaXZlcl9pb2IsCisJLmRlbGl2ZXJfcmF3CT0geGZlcl9kZWxpdmVyX2FzX2lvYiwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPcGVuZXJzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBUQ1Agc29ja2V0IG9wZW5lciAqLworc3RydWN0IHNvY2tldF9vcGVuZXIgdGNwX3NvY2tldF9vcGVuZXIgX19zb2NrZXRfb3BlbmVyID0geworCS5zZW1hbnRpY3MJPSBUQ1BfU09DS19TVFJFQU0sCisJLmZhbWlseQkJPSBBRl9JTkVULAorCS5vcGVuCQk9IHRjcF9vcGVuLAorfTsKKworLyoqIExpbmthZ2UgaGFjayAqLworaW50IHRjcF9zb2NrX3N0cmVhbSA9IFRDUF9TT0NLX1NUUkVBTTsKKworLyoqCisgKiBPcGVuIFRDUCBVUkkKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdXJpCQlVUkkKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRjcF9vcGVuX3VyaSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgc3RydWN0IHVyaSAqdXJpICkgeworCXN0cnVjdCBzb2NrYWRkcl90Y3BpcCBwZWVyOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCAhIHVyaS0+aG9zdCApCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0ICggJnBlZXIsIDAsIHNpemVvZiAoIHBlZXIgKSApOworCXBlZXIuc3RfcG9ydCA9IGh0b25zICggdXJpX3BvcnQgKCB1cmksIDAgKSApOworCXJldHVybiB4ZmVyX29wZW5fbmFtZWRfc29ja2V0ICggeGZlciwgU09DS19TVFJFQU0sCisJCQkJCSggc3RydWN0IHNvY2thZGRyICogKSAmcGVlciwKKwkJCQkJdXJpLT5ob3N0LCBOVUxMICk7Cit9CisKKy8qKiBUQ1AgVVJJIG9wZW5lciAqLworc3RydWN0IHVyaV9vcGVuZXIgdGNwX3VyaV9vcGVuZXIgX191cmlfb3BlbmVyID0geworCS5zY2hlbWUJCT0gInRjcCIsCisJLm9wZW4JCT0gdGNwX29wZW5fdXJpLAorfTsKKwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L3RjcC9mdHAuYyBiL2dweGUvc3JjL25ldC90Y3AvZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwZTUzNwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC90Y3AvZnRwLmMKQEAgLTAsMCArMSw1MjkgQEAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL3NvY2tldC5oPgorI2luY2x1ZGUgPGdweGUvdGNwaXAuaD4KKyNpbmNsdWRlIDxncHhlL2luLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisjaW5jbHVkZSA8Z3B4ZS91cmkuaD4KKyNpbmNsdWRlIDxncHhlL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Z3B4ZS9mdHAuaD4KKworLyoqIEBmaWxlCisgKgorICogRmlsZSB0cmFuc2ZlciBwcm90b2NvbAorICoKKyAqLworCitGRUFUVVJFICggRkVBVFVSRV9QUk9UT0NPTCwgIkZUUCIsIERIQ1BfRUJfRkVBVFVSRV9GVFAsIDEgKTsKKworLyoqCisgKiBGVFAgc3RhdGVzCisgKgorICogVGhlc2UgQGIgbXVzdCBiZSBzZXF1ZW50aWFsLCBpLmUuIGEgc3VjY2Vzc2Z1bCBGVFAgc2Vzc2lvbiBtdXN0CisgKiBwYXNzIHRocm91Z2ggZWFjaCBvZiB0aGVzZSBzdGF0ZXMgaW4gb3JkZXIuCisgKi8KK2VudW0gZnRwX3N0YXRlIHsKKwlGVFBfQ09OTkVDVCA9IDAsCisJRlRQX1VTRVIsCisJRlRQX1BBU1MsCisJRlRQX1RZUEUsCisJRlRQX1BBU1YsCisJRlRQX1JFVFIsCisJRlRQX1dBSVQsCisJRlRQX1FVSVQsCisJRlRQX0RPTkUsCit9OworCisvKioKKyAqIEFuIEZUUCByZXF1ZXN0CisgKgorICovCitzdHJ1Y3QgZnRwX3JlcXVlc3QgeworCS8qKiBSZWZlcmVuY2UgY291bnRlciAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCS8qKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZSAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSB4ZmVyOworCisJLyoqIFVSSSBiZWluZyBmZXRjaGVkICovCisJc3RydWN0IHVyaSAqdXJpOworCS8qKiBGVFAgY29udHJvbCBjaGFubmVsIGludGVyZmFjZSAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSBjb250cm9sOworCS8qKiBGVFAgZGF0YSBjaGFubmVsIGludGVyZmFjZSAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSBkYXRhOworCisJLyoqIEN1cnJlbnQgc3RhdGUgKi8KKwllbnVtIGZ0cF9zdGF0ZSBzdGF0ZTsKKwkvKiogQnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGEgcmVjZWl2ZWQgdmlhIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKwljaGFyICpyZWN2YnVmOworCS8qKiBSZW1haW5pbmcgc2l6ZSBvZiByZWN2YnVmICovCisJc2l6ZV90IHJlY3ZzaXplOworCS8qKiBGVFAgc3RhdHVzIGNvZGUsIGFzIHRleHQgKi8KKwljaGFyIHN0YXR1c190ZXh0WzVdOworCS8qKiBQYXNzaXZlLW1vZGUgcGFyYW1ldGVycywgYXMgdGV4dCAqLworCWNoYXIgcGFzc2l2ZV90ZXh0WzI0XTsgLyogImFhYSxiYmIsY2NjLGRkZCxlZWUsZmZmIiAqLworfTsKKworLyoqCisgKiBGcmVlIEZUUCByZXF1ZXN0CisgKgorICogQHYgcmVmY250CQlSZWZlcmVuY2UgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBmdHBfZnJlZSAoIHN0cnVjdCByZWZjbnQgKnJlZmNudCApIHsKKwlzdHJ1Y3QgZnRwX3JlcXVlc3QgKmZ0cCA9CisJCWNvbnRhaW5lcl9vZiAoIHJlZmNudCwgc3RydWN0IGZ0cF9yZXF1ZXN0LCByZWZjbnQgKTsKKworCURCR0MgKCBmdHAsICJGVFAgJXAgZnJlZWRcbiIsIGZ0cCApOworCisJdXJpX3B1dCAoIGZ0cC0+dXJpICk7CisJZnJlZSAoIGZ0cCApOworfQorCisvKioKKyAqIE1hcmsgRlRQIG9wZXJhdGlvbiBhcyBjb21wbGV0ZQorICoKKyAqIEB2IGZ0cAkJRlRQIHJlcXVlc3QKKyAqIEB2IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIHZvaWQgZnRwX2RvbmUgKCBzdHJ1Y3QgZnRwX3JlcXVlc3QgKmZ0cCwgaW50IHJjICkgeworCisJREJHQyAoIGZ0cCwgIkZUUCAlcCBjb21wbGV0ZWQgKCVzKVxuIiwgZnRwLCBzdHJlcnJvciAoIHJjICkgKTsKKworCS8qIENsb3NlIGFsbCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZXMgKi8KKwl4ZmVyX251bGxpZnkgKCAmZnRwLT54ZmVyICk7CisJeGZlcl9jbG9zZSAoICZmdHAtPnhmZXIsIHJjICk7CisJeGZlcl9udWxsaWZ5ICggJmZ0cC0+Y29udHJvbCApOworCXhmZXJfY2xvc2UgKCAmZnRwLT5jb250cm9sLCByYyApOworCXhmZXJfbnVsbGlmeSAoICZmdHAtPmRhdGEgKTsKKwl4ZmVyX2Nsb3NlICggJmZ0cC0+ZGF0YSwgcmMgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlRQIGNvbnRyb2wgY2hhbm5lbAorICoKKyAqLworCisvKiogQW4gRlRQIGNvbnRyb2wgY2hhbm5lbCBzdHJpbmcgKi8KK3N0cnVjdCBmdHBfY29udHJvbF9zdHJpbmcgeworCS8qKiBMaXRlcmFsIHBvcnRpb24gKi8KKwljb25zdCBjaGFyICpsaXRlcmFsOworCS8qKiBWYXJpYWJsZSBwb3J0aW9uCisJICoKKwkgKiBAdiBmdHAJRlRQIHJlcXVlc3QKKwkgKiBAcmV0IHN0cmluZwlWYXJpYWJsZSBwb3J0aW9uIG9mIHN0cmluZworCSAqLworCWNvbnN0IGNoYXIgKiAoICp2YXJpYWJsZSApICggc3RydWN0IGZ0cF9yZXF1ZXN0ICpmdHAgKTsKK307CisKKy8qKgorICogUmV0cmlldmUgRlRQIHBhdGhuYW1lCisgKgorICogQHYgZnRwCQlGVFAgcmVxdWVzdAorICogQHJldCBwYXRoCQlGVFAgcGF0aG5hbWUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBmdHBfdXJpX3BhdGggKCBzdHJ1Y3QgZnRwX3JlcXVlc3QgKmZ0cCApIHsKKwlyZXR1cm4gZnRwLT51cmktPnBhdGg7Cit9CisKKy8qKgorICogUmV0cmlldmUgRlRQIHVzZXIKKyAqCisgKiBAdiBmdHAJCUZUUCByZXF1ZXN0CisgKiBAcmV0IHVzZXIJCUZUUCB1c2VyCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogZnRwX3VzZXIgKCBzdHJ1Y3QgZnRwX3JlcXVlc3QgKmZ0cCApIHsKKwlzdGF0aWMgY2hhciAqZnRwX2RlZmF1bHRfdXNlciA9ICJhbm9ueW1vdXMiOworCXJldHVybiBmdHAtPnVyaS0+dXNlciA/IGZ0cC0+dXJpLT51c2VyIDogZnRwX2RlZmF1bHRfdXNlcjsKK30KKworLyoqCisgKiBSZXRyaWV2ZSBGVFAgcGFzc3dvcmQKKyAqCisgKiBAdiBmdHAJCUZUUCByZXF1ZXN0CisgKiBAcmV0IHBhc3N3b3JkCUZUUCBwYXNzd29yZAorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGZ0cF9wYXNzd29yZCAoIHN0cnVjdCBmdHBfcmVxdWVzdCAqZnRwICkgeworCXN0YXRpYyBjaGFyICpmdHBfZGVmYXVsdF9wYXNzd29yZCA9ICJldGhlcmJvb3RAZXRoZXJib290Lm9yZyI7CisJcmV0dXJuIGZ0cC0+dXJpLT5wYXNzd29yZCA/IGZ0cC0+dXJpLT5wYXNzd29yZCA6IGZ0cF9kZWZhdWx0X3Bhc3N3b3JkOworfQorCisvKiogRlRQIGNvbnRyb2wgY2hhbm5lbCBzdHJpbmdzICovCitzdGF0aWMgc3RydWN0IGZ0cF9jb250cm9sX3N0cmluZyBmdHBfc3RyaW5nc1tdID0geworCVtGVFBfQ09OTkVDVF0JPSB7IE5VTEwsIE5VTEwgfSwKKwlbRlRQX1VTRVJdCT0geyAiVVNFUiAiLCBmdHBfdXNlciB9LAorCVtGVFBfUEFTU10JPSB7ICJQQVNTICIsIGZ0cF9wYXNzd29yZCB9LAorCVtGVFBfVFlQRV0JPSB7ICJUWVBFIEkiLCBOVUxMIH0sCisJW0ZUUF9QQVNWXQk9IHsgIlBBU1YiLCBOVUxMIH0sCisJW0ZUUF9SRVRSXQk9IHsgIlJFVFIgIiwgZnRwX3VyaV9wYXRoIH0sCisJW0ZUUF9XQUlUXQk9IHsgTlVMTCwgTlVMTCB9LAorCVtGVFBfUVVJVF0JPSB7ICJRVUlUIiwgTlVMTCB9LAorCVtGVFBfRE9ORV0JPSB7IE5VTEwsIE5VTEwgfSwKK307CisKKy8qKgorICogSGFuZGxlIGNvbnRyb2wgY2hhbm5lbCBiZWluZyBjbG9zZWQKKyAqCisgKiBAdiBjb250cm9sCQlGVFAgY29udHJvbCBjaGFubmVsIGludGVyZmFjZQorICogQHYgcmMJCVJlYXNvbiBmb3IgY2xvc2UKKyAqCisgKiBXaGVuIHRoZSBjb250cm9sIGNoYW5uZWwgaXMgY2xvc2VkLCB0aGUgZGF0YSBjaGFubmVsIG11c3QgYWxzbyBiZQorICogY2xvc2VkLCBpZiBpdCBpcyBjdXJyZW50bHkgb3Blbi4KKyAqLworc3RhdGljIHZvaWQgZnRwX2NvbnRyb2xfY2xvc2UgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKmNvbnRyb2wsIGludCByYyApIHsKKwlzdHJ1Y3QgZnRwX3JlcXVlc3QgKmZ0cCA9CisJCWNvbnRhaW5lcl9vZiAoIGNvbnRyb2wsIHN0cnVjdCBmdHBfcmVxdWVzdCwgY29udHJvbCApOworCisJREJHQyAoIGZ0cCwgIkZUUCAlcCBjb250cm9sIGNvbm5lY3Rpb24gY2xvc2VkOiAlc1xuIiwKKwkgICAgICAgZnRwLCBzdHJlcnJvciAoIHJjICkgKTsKKworCS8qIENvbXBsZXRlIEZUUCBvcGVyYXRpb24gKi8KKwlmdHBfZG9uZSAoIGZ0cCwgcmMgKTsKK30KKworLyoqCisgKiBQYXJzZSBGVFAgYnl0ZSBzZXF1ZW5jZSB2YWx1ZQorICoKKyAqIEB2IHRleHQJCVRleHQgc3RyaW5nCisgKiBAdiB2YWx1ZQkJVmFsdWUgYnVmZmVyCisgKiBAdiBsZW4JCUxlbmd0aCBvZiB2YWx1ZSBidWZmZXIKKyAqCisgKiBUaGlzIHBhcnNlcyBhbiBGVFAgYnl0ZSBzZXF1ZW5jZSB2YWx1ZSAoZS5nLiB0aGUgImFhYSxiYmIsY2NjLGRkZCIKKyAqIGZvcm0gZm9yIElQIGFkZHJlc3NlcyBpbiBQT1JUIGNvbW1hbmRzKSBpbnRvIGEgYnl0ZSBzZXF1ZW5jZS4gIEBjCisgKiAqdGV4dCB3aWxsIGJlIHVwZGF0ZWQgdG8gcG9pbnQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHBhcnNlZCBieXRlCisgKiBzZXF1ZW5jZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHNhZmUgaW4gdGhlIHByZXNlbmNlIG9mIG1hbGZvcm1lZCBkYXRhLCB0aG91Z2ggdGhlCisgKiBvdXRwdXQgaXMgdW5kZWZpbmVkLgorICovCitzdGF0aWMgdm9pZCBmdHBfcGFyc2VfdmFsdWUgKCBjaGFyICoqdGV4dCwgdWludDhfdCAqdmFsdWUsIHNpemVfdCBsZW4gKSB7CisJZG8geworCQkqKHZhbHVlKyspID0gc3RydG91bCAoICp0ZXh0LCB0ZXh0LCAxMCApOworCQlpZiAoICoqdGV4dCApCisJCQkoKnRleHQpKys7CisJfSB3aGlsZSAoIC0tbGVuICk7Cit9CisKKy8qKgorICogTW92ZSB0byBuZXh0IHN0YXRlIGFuZCBzZW5kIHRoZSBhcHByb3ByaWF0ZSBGVFAgY29udHJvbCBzdHJpbmcKKyAqCisgKiBAdiBmdHAJCUZUUCByZXF1ZXN0CisgKgorICovCitzdGF0aWMgdm9pZCBmdHBfbmV4dF9zdGF0ZSAoIHN0cnVjdCBmdHBfcmVxdWVzdCAqZnRwICkgeworCXN0cnVjdCBmdHBfY29udHJvbF9zdHJpbmcgKmZ0cF9zdHJpbmc7CisJY29uc3QgY2hhciAqbGl0ZXJhbDsKKwljb25zdCBjaGFyICp2YXJpYWJsZTsKKworCS8qIE1vdmUgdG8gbmV4dCBzdGF0ZSAqLworCWlmICggZnRwLT5zdGF0ZSA8IEZUUF9ET05FICkKKwkJZnRwLT5zdGF0ZSsrOworCisJLyogU2VuZCBjb250cm9sIHN0cmluZyBpZiBuZWVkZWQgKi8KKwlmdHBfc3RyaW5nID0gJmZ0cF9zdHJpbmdzW2Z0cC0+c3RhdGVdOworCWxpdGVyYWwgPSBmdHBfc3RyaW5nLT5saXRlcmFsOworCXZhcmlhYmxlID0gKCBmdHBfc3RyaW5nLT52YXJpYWJsZSA/CisJCSAgICAgZnRwX3N0cmluZy0+dmFyaWFibGUgKCBmdHAgKSA6ICIiICk7CisJaWYgKCBsaXRlcmFsICkgeworCQlEQkdDICggZnRwLCAiRlRQICVwIHNlbmRpbmcgJXMlc1xuIiwgZnRwLCBsaXRlcmFsLCB2YXJpYWJsZSApOworCQl4ZmVyX3ByaW50ZiAoICZmdHAtPmNvbnRyb2wsICIlcyVzXHJcbiIsIGxpdGVyYWwsIHZhcmlhYmxlICk7CisJfQorfQorCisvKioKKyAqIEhhbmRsZSBhbiBGVFAgY29udHJvbCBjaGFubmVsIHJlc3BvbnNlCisgKgorICogQHYgZnRwCQlGVFAgcmVxdWVzdAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIG9uY2Ugd2UgaGF2ZSByZWNlaXZlZCBhIGNvbXBsZXRlIHJlc3BvbnNlIGxpbmUuCisgKi8KK3N0YXRpYyB2b2lkIGZ0cF9yZXBseSAoIHN0cnVjdCBmdHBfcmVxdWVzdCAqZnRwICkgeworCWNoYXIgc3RhdHVzX21ham9yID0gZnRwLT5zdGF0dXNfdGV4dFswXTsKKwljaGFyIHNlcGFyYXRvciA9IGZ0cC0+c3RhdHVzX3RleHRbM107CisKKwlEQkdDICggZnRwLCAiRlRQICVwIHJlY2VpdmVkIHN0YXR1cyAlc1xuIiwgZnRwLCBmdHAtPnN0YXR1c190ZXh0ICk7CisKKwkvKiBJZ25vcmUgbWFsZm9ybWVkIGxpbmVzICovCisJaWYgKCBzZXBhcmF0b3IgIT0gJyAnICkKKwkJcmV0dXJuOworCisJLyogSWdub3JlICJpbnRlcm1lZGlhdGUiIHJlc3BvbnNlcyAoMXh4IGNvZGVzKSAqLworCWlmICggc3RhdHVzX21ham9yID09ICcxJyApCisJCXJldHVybjsKKworCS8qIEFueXRoaW5nIG90aGVyIHRoYW4gc3VjY2VzcyAoMnh4KSBvciwgaW4gdGhlIGNhc2Ugb2YgYQorCSAqIHJlcHNvbnNlIHRvIGEgIlVTRVIiIGNvbW1hbmQsIGEgcGFzc3dvcmQgcHJvbXB0ICgzeHgpLCBpcyBhCisJICogZmF0YWwgZXJyb3IuCisJICovCisJaWYgKCAhICggKCBzdGF0dXNfbWFqb3IgPT0gJzInICkgfHwKKwkJICggKCBzdGF0dXNfbWFqb3IgPT0gJzMnICkgJiYgKCBmdHAtPnN0YXRlID09IEZUUF9VU0VSICkgKSApICl7CisJCS8qIEZsYWcgcHJvdG9jb2wgZXJyb3IgYW5kIGNsb3NlIGNvbm5lY3Rpb25zICovCisJCWZ0cF9kb25lICggZnRwLCAtRVBST1RPICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBPcGVuIHBhc3NpdmUgY29ubmVjdGlvbiB3aGVuIHdlIGdldCAiUEFTViIgcmVzcG9uc2UgKi8KKwlpZiAoIGZ0cC0+c3RhdGUgPT0gRlRQX1BBU1YgKSB7CisJCWNoYXIgKnB0ciA9IGZ0cC0+cGFzc2l2ZV90ZXh0OworCQl1bmlvbiB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCQkJc3RydWN0IHNvY2thZGRyIHNhOworCQl9IHNhOworCQlpbnQgcmM7CisKKwkJc2Euc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlmdHBfcGFyc2VfdmFsdWUgKCAmcHRyLCAoIHVpbnQ4X3QgKiApICZzYS5zaW4uc2luX2FkZHIsCisJCQkJICBzaXplb2YgKCBzYS5zaW4uc2luX2FkZHIgKSApOworCQlmdHBfcGFyc2VfdmFsdWUgKCAmcHRyLCAoIHVpbnQ4X3QgKiApICZzYS5zaW4uc2luX3BvcnQsCisJCQkJICBzaXplb2YgKCBzYS5zaW4uc2luX3BvcnQgKSApOworCQlpZiAoICggcmMgPSB4ZmVyX29wZW5fc29ja2V0ICggJmZ0cC0+ZGF0YSwgU09DS19TVFJFQU0sCisJCQkJCSAgICAgICAmc2Euc2EsIE5VTEwgKSApICE9IDAgKSB7CisJCQlEQkdDICggZnRwLCAiRlRQICVwIGNvdWxkIG5vdCBvcGVuIGRhdGEgY29ubmVjdGlvblxuIiwKKwkJCSAgICAgICBmdHAgKTsKKwkJCWZ0cF9kb25lICggZnRwLCByYyApOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogTW92ZSB0byBuZXh0IHN0YXRlIGFuZCBzZW5kIGNvbnRyb2wgc3RyaW5nICovCisJZnRwX25leHRfc3RhdGUgKCBmdHAgKTsKKwkKK30KKworLyoqCisgKiBIYW5kbGUgbmV3IGRhdGEgYXJyaXZpbmcgb24gRlRQIGNvbnRyb2wgY2hhbm5lbAorICoKKyAqIEB2IGNvbnRyb2wJCUZUUCBjb250cm9sIGNoYW5uZWwgaW50ZXJmYWNlCisgKiBAdiBkYXRhCQlOZXcgZGF0YQorICogQHYgbGVuCQlMZW5ndGggb2YgbmV3IGRhdGEKKyAqCisgKiBEYXRhIGlzIGNvbGxlY3RlZCB1bnRpbCBhIGNvbXBsZXRlIGxpbmUgaXMgcmVjZWl2ZWQsIGF0IHdoaWNoIHBvaW50CisgKiBpdHMgaW5mb3JtYXRpb24gaXMgcGFzc2VkIHRvIGZ0cF9yZXBseSgpLgorICovCitzdGF0aWMgaW50IGZ0cF9jb250cm9sX2RlbGl2ZXJfcmF3ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICpjb250cm9sLAorCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgZnRwX3JlcXVlc3QgKmZ0cCA9CisJCWNvbnRhaW5lcl9vZiAoIGNvbnRyb2wsIHN0cnVjdCBmdHBfcmVxdWVzdCwgY29udHJvbCApOworCWNoYXIgKnJlY3ZidWYgPSBmdHAtPnJlY3ZidWY7CisJc2l6ZV90IHJlY3ZzaXplID0gZnRwLT5yZWN2c2l6ZTsKKwljaGFyIGM7CisJCisJd2hpbGUgKCBsZW4tLSApIHsKKwkJYyA9ICogKCAoIGNoYXIgKiApIGRhdGErKyApOworCQlzd2l0Y2ggKCBjICkgeworCQljYXNlICdccicgOgorCQljYXNlICdcbicgOgorCQkJLyogRW5kIG9mIGxpbmU6IGNhbGwgZnRwX3JlcGx5KCkgdG8gaGFuZGxlCisJCQkgKiBjb21wbGV0ZWQgcmVwbHkuICBBdm9pZCBjYWxsaW5nIGZ0cF9yZXBseSgpCisJCQkgKiB0d2ljZSBpZiB3ZSByZWNlaXZlIGJvdGggXHIgYW5kIFxuLgorCQkJICovCisJCQlpZiAoIHJlY3ZzaXplID09IDAgKQorCQkJCWZ0cF9yZXBseSAoIGZ0cCApOworCQkJLyogU3RhcnQgZmlsbGluZyB1cCB0aGUgc3RhdHVzIGNvZGUgYnVmZmVyICovCisJCQlyZWN2YnVmID0gZnRwLT5zdGF0dXNfdGV4dDsKKwkJCXJlY3ZzaXplID0gc2l6ZW9mICggZnRwLT5zdGF0dXNfdGV4dCApIC0gMTsKKwkJCWJyZWFrOworCQljYXNlICcoJyA6CisJCQkvKiBTdGFydCBmaWxsaW5nIHVwIHRoZSBwYXNzaXZlIHBhcmFtZXRlciBidWZmZXIgKi8KKwkJCXJlY3ZidWYgPSBmdHAtPnBhc3NpdmVfdGV4dDsKKwkJCXJlY3ZzaXplID0gc2l6ZW9mICggZnRwLT5wYXNzaXZlX3RleHQgKSAtIDE7CisJCQlicmVhazsKKwkJY2FzZSAnKScgOgorCQkJLyogU3RvcCBmaWxsaW5nIHRoZSBwYXNzaXZlIHBhcmFtZXRlciBidWZmZXIgKi8KKwkJCXJlY3ZzaXplID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCS8qIEZpbGwgdXAgYnVmZmVyIGlmIGFwcGxpY2FibGUgKi8KKwkJCWlmICggcmVjdnNpemUgPiAwICkgeworCQkJCSoocmVjdmJ1ZisrKSA9IGM7CisJCQkJcmVjdnNpemUtLTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogU3RvcmUgZm9yIG5leHQgaW52b2NhdGlvbiAqLworCWZ0cC0+cmVjdmJ1ZiA9IHJlY3ZidWY7CisJZnRwLT5yZWN2c2l6ZSA9IHJlY3ZzaXplOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBGVFAgY29udHJvbCBjaGFubmVsIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBmdHBfY29udHJvbF9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSBmdHBfY29udHJvbF9jbG9zZSwKKwkudnJlZGlyZWN0CT0geGZlcl92cmVvcGVuLAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHhmZXJfZGVsaXZlcl9hc19yYXcsCisJLmRlbGl2ZXJfcmF3CT0gZnRwX2NvbnRyb2xfZGVsaXZlcl9yYXcsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVFAgZGF0YSBjaGFubmVsCisgKgorICovCisKKy8qKgorICogSGFuZGxlIEZUUCBkYXRhIGNoYW5uZWwgYmVpbmcgY2xvc2VkCisgKgorICogQHYgZGF0YQkJRlRQIGRhdGEgY2hhbm5lbCBpbnRlcmZhY2UKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3N1cmUKKyAqCisgKiBXaGVuIHRoZSBkYXRhIGNoYW5uZWwgaXMgY2xvc2VkLCB0aGUgY29udHJvbCBjaGFubmVsIHNob3VsZCBiZSBsZWZ0CisgKiBhbG9uZTsgdGhlIHNlcnZlciB3aWxsIHNlbmQgYSBjb21wbGV0aW9uIG1lc3NhZ2UgdmlhIHRoZSBjb250cm9sCisgKiBjaGFubmVsIHdoaWNoIHdlJ2xsIHBpY2sgdXAuCisgKgorICogSWYgdGhlIGRhdGEgY2hhbm5lbCBpcyBjbG9zZWQgZHVlIHRvIGFuIGVycm9yLCB3ZSBhYm9ydCB0aGUgcmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQgZnRwX2RhdGFfY2xvc2VkICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICpkYXRhLCBpbnQgcmMgKSB7CisJc3RydWN0IGZ0cF9yZXF1ZXN0ICpmdHAgPQorCQljb250YWluZXJfb2YgKCBkYXRhLCBzdHJ1Y3QgZnRwX3JlcXVlc3QsIGRhdGEgKTsKKworCURCR0MgKCBmdHAsICJGVFAgJXAgZGF0YSBjb25uZWN0aW9uIGNsb3NlZDogJXNcbiIsCisJICAgICAgIGZ0cCwgc3RyZXJyb3IgKCByYyApICk7CisJCisJLyogSWYgdGhlcmUgd2FzIGFuIGVycm9yLCBjbG9zZSBjb250cm9sIGNoYW5uZWwgYW5kIHJlY29yZCBzdGF0dXMgKi8KKwlpZiAoIHJjICkgeworCQlmdHBfZG9uZSAoIGZ0cCwgcmMgKTsKKwl9IGVsc2UgeworCQlmdHBfbmV4dF9zdGF0ZSAoIGZ0cCApOworCX0KK30KKworLyoqCisgKiBIYW5kbGUgZGF0YSBkZWxpdmVyeSB2aWEgRlRQIGRhdGEgY2hhbm5lbAorICoKKyAqIEB2IHhmZXIJCUZUUCBkYXRhIGNoYW5uZWwgaW50ZXJmYWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbWV0YQkJRGF0YSB0cmFuc2ZlciBtZXRhZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZnRwX2RhdGFfZGVsaXZlcl9pb2IgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKmRhdGEsCisJCQkJICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCQkgIHN0cnVjdCB4ZmVyX21ldGFkYXRhICptZXRhIF9fdW51c2VkICkgeworCXN0cnVjdCBmdHBfcmVxdWVzdCAqZnRwID0KKwkJY29udGFpbmVyX29mICggZGF0YSwgc3RydWN0IGZ0cF9yZXF1ZXN0LCBkYXRhICk7CisJaW50IHJjOworCisJaWYgKCAoIHJjID0geGZlcl9kZWxpdmVyX2lvYiAoICZmdHAtPnhmZXIsIGlvYnVmICkgKSAhPSAwICkgeworCQlEQkdDICggZnRwLCAiRlRQICVwIGZhaWxlZCB0byBkZWxpdmVyIGRhdGE6ICVzXG4iLAorCQkgICAgICAgZnRwLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKiogRlRQIGRhdGEgY2hhbm5lbCBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgZnRwX2RhdGFfb3BlcmF0aW9ucyA9IHsKKwkuY2xvc2UJCT0gZnRwX2RhdGFfY2xvc2VkLAorCS52cmVkaXJlY3QJPSB4ZmVyX3ZyZW9wZW4sCisJLndpbmRvdwkJPSB1bmxpbWl0ZWRfeGZlcl93aW5kb3csCisJLmFsbG9jX2lvYgk9IGRlZmF1bHRfeGZlcl9hbGxvY19pb2IsCisJLmRlbGl2ZXJfaW9iCT0gZnRwX2RhdGFfZGVsaXZlcl9pb2IsCisJLmRlbGl2ZXJfcmF3CT0geGZlcl9kZWxpdmVyX2FzX2lvYiwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKgorICovCisKKy8qKgorICogQ2xvc2UgRlRQIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKgorICogQHYgeGZlcgkJRlRQIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiByYwkJUmVhc29uIGZvciBjbG9zZQorICovCitzdGF0aWMgdm9pZCBmdHBfeGZlcl9jbG9zZWQgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIGludCByYyApIHsKKwlzdHJ1Y3QgZnRwX3JlcXVlc3QgKmZ0cCA9CisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCBmdHBfcmVxdWVzdCwgeGZlciApOworCisJREJHQyAoIGZ0cCwgIkZUUCAlcCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBjbG9zZWQ6ICVzXG4iLAorCSAgICAgICBmdHAsIHN0cmVycm9yICggcmMgKSApOworCQorCWZ0cF9kb25lICggZnRwLCByYyApOworfQorCisvKiogRlRQIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBmdHBfeGZlcl9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSBmdHBfeGZlcl9jbG9zZWQsCisJLnZyZWRpcmVjdAk9IGlnbm9yZV94ZmVyX3ZyZWRpcmVjdCwKKwkud2luZG93CQk9IHVubGltaXRlZF94ZmVyX3dpbmRvdywKKwkuYWxsb2NfaW9iCT0gZGVmYXVsdF94ZmVyX2FsbG9jX2lvYiwKKwkuZGVsaXZlcl9pb2IJPSB4ZmVyX2RlbGl2ZXJfYXNfcmF3LAorCS5kZWxpdmVyX3Jhdwk9IGlnbm9yZV94ZmVyX2RlbGl2ZXJfcmF3LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVVJJIG9wZW5lcgorICoKKyAqLworCisvKioKKyAqIEluaXRpYXRlIGFuIEZUUCBjb25uZWN0aW9uCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHVyaQkJVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBmdHBfb3BlbiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgc3RydWN0IHVyaSAqdXJpICkgeworCXN0cnVjdCBmdHBfcmVxdWVzdCAqZnRwOworCXN0cnVjdCBzb2NrYWRkcl90Y3BpcCBzZXJ2ZXI7CisJaW50IHJjOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmICggISB1cmktPnBhdGggKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoICEgdXJpLT5ob3N0ICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBbGxvY2F0ZSBhbmQgcG9wdWxhdGUgc3RydWN0dXJlICovCisJZnRwID0gemFsbG9jICggc2l6ZW9mICggKmZ0cCApICk7CisJaWYgKCAhIGZ0cCApCisJCXJldHVybiAtRU5PTUVNOworCWZ0cC0+cmVmY250LmZyZWUgPSBmdHBfZnJlZTsKKwl4ZmVyX2luaXQgKCAmZnRwLT54ZmVyLCAmZnRwX3hmZXJfb3BlcmF0aW9ucywgJmZ0cC0+cmVmY250ICk7CisJZnRwLT51cmkgPSB1cmlfZ2V0ICggdXJpICk7CisJeGZlcl9pbml0ICggJmZ0cC0+Y29udHJvbCwgJmZ0cF9jb250cm9sX29wZXJhdGlvbnMsICZmdHAtPnJlZmNudCApOworCXhmZXJfaW5pdCAoICZmdHAtPmRhdGEsICZmdHBfZGF0YV9vcGVyYXRpb25zLCAmZnRwLT5yZWZjbnQgKTsKKwlmdHAtPnJlY3ZidWYgPSBmdHAtPnN0YXR1c190ZXh0OworCWZ0cC0+cmVjdnNpemUgPSBzaXplb2YgKCBmdHAtPnN0YXR1c190ZXh0ICkgLSAxOworCisJREJHQyAoIGZ0cCwgIkZUUCAlcCBmZXRjaGluZyAlc1xuIiwgZnRwLCBmdHAtPnVyaS0+cGF0aCApOworCisJLyogT3BlbiBjb250cm9sIGNvbm5lY3Rpb24gKi8KKwltZW1zZXQgKCAmc2VydmVyLCAwLCBzaXplb2YgKCBzZXJ2ZXIgKSApOworCXNlcnZlci5zdF9wb3J0ID0gaHRvbnMgKCB1cmlfcG9ydCAoIHVyaSwgRlRQX1BPUlQgKSApOworCWlmICggKCByYyA9IHhmZXJfb3Blbl9uYW1lZF9zb2NrZXQgKCAmZnRwLT5jb250cm9sLCBTT0NLX1NUUkVBTSwKKwkJCQkJICAgICAoIHN0cnVjdCBzb2NrYWRkciAqICkgJnNlcnZlciwKKwkJCQkJICAgICB1cmktPmhvc3QsIE5VTEwgKSApICE9IDAgKQorCQlnb3RvIGVycjsKKworCS8qIEF0dGFjaCB0byBwYXJlbnQgaW50ZXJmYWNlLCBtb3J0YWxpc2Ugc2VsZiwgYW5kIHJldHVybiAqLworCXhmZXJfcGx1Z19wbHVnICggJmZ0cC0+eGZlciwgeGZlciApOworCXJlZl9wdXQgKCAmZnRwLT5yZWZjbnQgKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlEQkdDICggZnRwLCAiRlRQICVwIGNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdDogJXNcbiIsIAorCSAgICAgICBmdHAsIHN0cmVycm9yICggcmMgKSApOworCWZ0cF9kb25lICggZnRwLCByYyApOworCXJlZl9wdXQgKCAmZnRwLT5yZWZjbnQgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKiBGVFAgVVJJIG9wZW5lciAqLworc3RydWN0IHVyaV9vcGVuZXIgZnRwX3VyaV9vcGVuZXIgX191cmlfb3BlbmVyID0geworCS5zY2hlbWUJPSAiZnRwIiwKKwkub3Blbgk9IGZ0cF9vcGVuLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC90Y3AvaHR0cC5jIGIvZ3B4ZS9zcmMvbmV0L3RjcC9odHRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2NWIyYQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC90Y3AvaHR0cC5jCkBAIC0wLDAgKzEsNTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKioKKyAqIEBmaWxlCisgKgorICogSHlwZXIgVGV4dCBUcmFuc2ZlciBQcm90b2NvbCAoSFRUUCkKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxncHhlL3VyaS5oPgorI2luY2x1ZGUgPGdweGUvcmVmY250Lmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUveGZlci5oPgorI2luY2x1ZGUgPGdweGUvb3Blbi5oPgorI2luY2x1ZGUgPGdweGUvc29ja2V0Lmg+CisjaW5jbHVkZSA8Z3B4ZS90Y3BpcC5oPgorI2luY2x1ZGUgPGdweGUvcHJvY2Vzcy5oPgorI2luY2x1ZGUgPGdweGUvbGluZWJ1Zi5oPgorI2luY2x1ZGUgPGdweGUvZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxncHhlL2Jhc2U2NC5oPgorI2luY2x1ZGUgPGdweGUvaHR0cC5oPgorCitGRUFUVVJFICggRkVBVFVSRV9QUk9UT0NPTCwgIkhUVFAiLCBESENQX0VCX0ZFQVRVUkVfSFRUUCwgMSApOworCisvKiogSFRUUCByZWNlaXZlIHN0YXRlICovCitlbnVtIGh0dHBfcnhfc3RhdGUgeworCUhUVFBfUlhfUkVTUE9OU0UgPSAwLAorCUhUVFBfUlhfSEVBREVSLAorCUhUVFBfUlhfREFUQSwKKwlIVFRQX1JYX0RFQUQsCit9OworCisvKioKKyAqIEFuIEhUVFAgcmVxdWVzdAorICoKKyAqLworc3RydWN0IGh0dHBfcmVxdWVzdCB7CisJLyoqIFJlZmVyZW5jZSBjb3VudCAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCS8qKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZSAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSB4ZmVyOworCisJLyoqIFVSSSBiZWluZyBmZXRjaGVkICovCisJc3RydWN0IHVyaSAqdXJpOworCS8qKiBUcmFuc3BvcnQgbGF5ZXIgaW50ZXJmYWNlICovCisJc3RydWN0IHhmZXJfaW50ZXJmYWNlIHNvY2tldDsKKworCS8qKiBUWCBwcm9jZXNzICovCisJc3RydWN0IHByb2Nlc3MgcHJvY2VzczsKKworCS8qKiBIVFRQIHJlc3BvbnNlIGNvZGUgKi8KKwl1bnNpZ25lZCBpbnQgcmVzcG9uc2U7CisJLyoqIEhUVFAgQ29udGVudC1MZW5ndGggKi8KKwlzaXplX3QgY29udGVudF9sZW5ndGg7CisJLyoqIFJlY2VpdmVkIGxlbmd0aCAqLworCXNpemVfdCByeF9sZW47CisJLyoqIFJYIHN0YXRlICovCisJZW51bSBodHRwX3J4X3N0YXRlIHJ4X3N0YXRlOworCS8qKiBMaW5lIGJ1ZmZlciBmb3IgcmVjZWl2ZWQgaGVhZGVyIGxpbmVzICovCisJc3RydWN0IGxpbmVfYnVmZmVyIGxpbmVidWY7Cit9OworCisvKioKKyAqIEZyZWUgSFRUUCByZXF1ZXN0CisgKgorICogQHYgcmVmY250CQlSZWZlcmVuY2UgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBodHRwX2ZyZWUgKCBzdHJ1Y3QgcmVmY250ICpyZWZjbnQgKSB7CisJc3RydWN0IGh0dHBfcmVxdWVzdCAqaHR0cCA9CisJCWNvbnRhaW5lcl9vZiAoIHJlZmNudCwgc3RydWN0IGh0dHBfcmVxdWVzdCwgcmVmY250ICk7CisKKwl1cmlfcHV0ICggaHR0cC0+dXJpICk7CisJZW1wdHlfbGluZV9idWZmZXIgKCAmaHR0cC0+bGluZWJ1ZiApOworCWZyZWUgKCBodHRwICk7Cit9OworCisvKioKKyAqIE1hcmsgSFRUUCByZXF1ZXN0IGFzIGNvbXBsZXRlCisgKgorICogQHYgaHR0cAkJSFRUUCByZXF1ZXN0CisgKiBAdiByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIGh0dHBfZG9uZSAoIHN0cnVjdCBodHRwX3JlcXVlc3QgKmh0dHAsIGludCByYyApIHsKKworCS8qIFByZXZlbnQgZnVydGhlciBwcm9jZXNzaW5nIG9mIGFueSBjdXJyZW50IHBhY2tldCAqLworCWh0dHAtPnJ4X3N0YXRlID0gSFRUUF9SWF9ERUFEOworCisJLyogSWYgd2UgaGFkIGEgQ29udGVudC1MZW5ndGgsIGFuZCB0aGUgcmVjZWl2ZWQgY29udGVudCBsZW5ndGgKKwkgKiBpc24ndCBjb3JyZWN0LCBmbGFnIGFuIGVycm9yCisJICovCisJaWYgKCBodHRwLT5jb250ZW50X2xlbmd0aCAmJgorCSAgICAgKCBodHRwLT5jb250ZW50X2xlbmd0aCAhPSBodHRwLT5yeF9sZW4gKSApIHsKKwkJREJHQyAoIGh0dHAsICJIVFRQICVwIGluY29ycmVjdCBsZW5ndGggJXpkLCBzaG91bGQgYmUgJXpkXG4iLAorCQkgICAgICAgaHR0cCwgaHR0cC0+cnhfbGVuLCBodHRwLT5jb250ZW50X2xlbmd0aCApOworCQlyYyA9IC1FSU87CisJfQorCisJLyogUmVtb3ZlIHByb2Nlc3MgKi8KKwlwcm9jZXNzX2RlbCAoICZodHRwLT5wcm9jZXNzICk7CisKKwkvKiBDbG9zZSBhbGwgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2VzICovCisJeGZlcl9udWxsaWZ5ICggJmh0dHAtPnNvY2tldCApOworCXhmZXJfY2xvc2UgKCAmaHR0cC0+c29ja2V0LCByYyApOworCXhmZXJfbnVsbGlmeSAoICZodHRwLT54ZmVyICk7CisJeGZlcl9jbG9zZSAoICZodHRwLT54ZmVyLCByYyApOworfQorCisvKioKKyAqIENvbnZlcnQgSFRUUCByZXNwb25zZSBjb2RlIHRvIHJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIEB2IHJlc3BvbnNlCQlIVFRQIHJlc3BvbnNlIGNvZGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGh0dHBfcmVzcG9uc2VfdG9fcmMgKCB1bnNpZ25lZCBpbnQgcmVzcG9uc2UgKSB7CisJc3dpdGNoICggcmVzcG9uc2UgKSB7CisJY2FzZSAyMDA6CisJY2FzZSAzMDE6CisJY2FzZSAzMDI6CisJCXJldHVybiAwOworCWNhc2UgNDA0OgorCQlyZXR1cm4gLUVOT0VOVDsKKwljYXNlIDQwMzoKKwkJcmV0dXJuIC1FUEVSTTsKKwljYXNlIDQwMToKKwkJcmV0dXJuIC1FQUNDRVM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU87CisJfQorfQorCisvKioKKyAqIEhhbmRsZSBIVFRQIHJlc3BvbnNlCisgKgorICogQHYgaHR0cAkJSFRUUCByZXF1ZXN0CisgKiBAdiByZXNwb25zZQkJSFRUUCByZXNwb25zZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHR0cF9yeF9yZXNwb25zZSAoIHN0cnVjdCBodHRwX3JlcXVlc3QgKmh0dHAsIGNoYXIgKnJlc3BvbnNlICkgeworCWNoYXIgKnNwYzsKKwlpbnQgcmM7CisKKwlEQkdDICggaHR0cCwgIkhUVFAgJXAgcmVzcG9uc2UgXCIlc1wiXG4iLCBodHRwLCByZXNwb25zZSApOworCisJLyogQ2hlY2sgcmVzcG9uc2Ugc3RhcnRzIHdpdGggIkhUVFAvIiAqLworCWlmICggc3RybmNtcCAoIHJlc3BvbnNlLCAiSFRUUC8iLCA1ICkgIT0gMCApCisJCXJldHVybiAtRUlPOworCisJLyogTG9jYXRlIGFuZCBjaGVjayByZXNwb25zZSBjb2RlICovCisJc3BjID0gc3RyY2hyICggcmVzcG9uc2UsICcgJyApOworCWlmICggISBzcGMgKQorCQlyZXR1cm4gLUVJTzsKKwlodHRwLT5yZXNwb25zZSA9IHN0cnRvdWwgKCBzcGMsIE5VTEwsIDEwICk7CisJaWYgKCAoIHJjID0gaHR0cF9yZXNwb25zZV90b19yYyAoIGh0dHAtPnJlc3BvbnNlICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogTW92ZSB0byByZWNlaXZlZCBoZWFkZXJzICovCisJaHR0cC0+cnhfc3RhdGUgPSBIVFRQX1JYX0hFQURFUjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgSFRUUCBMb2NhdGlvbiBoZWFkZXIKKyAqCisgKiBAdiBodHRwCQlIVFRQIHJlcXVlc3QKKyAqIEB2IHZhbHVlCQlIVFRQIGhlYWRlciB2YWx1ZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHR0cF9yeF9sb2NhdGlvbiAoIHN0cnVjdCBodHRwX3JlcXVlc3QgKmh0dHAsIGNvbnN0IGNoYXIgKnZhbHVlICkgeworCWludCByYzsKKworCS8qIFJlZGlyZWN0IHRvIG5ldyBsb2NhdGlvbiAqLworCURCR0MgKCBodHRwLCAiSFRUUCAlcCByZWRpcmVjdGluZyB0byAlc1xuIiwgaHR0cCwgdmFsdWUgKTsKKwlpZiAoICggcmMgPSB4ZmVyX3JlZGlyZWN0ICggJmh0dHAtPnhmZXIsIExPQ0FUSU9OX1VSSV9TVFJJTkcsCisJCQkJICAgIHZhbHVlICkgKSAhPSAwICkgeworCQlEQkdDICggaHR0cCwgIkhUVFAgJXAgY291bGQgbm90IHJlZGlyZWN0OiAlc1xuIiwKKwkJICAgICAgIGh0dHAsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFuZGxlIEhUVFAgQ29udGVudC1MZW5ndGggaGVhZGVyCisgKgorICogQHYgaHR0cAkJSFRUUCByZXF1ZXN0CisgKiBAdiB2YWx1ZQkJSFRUUCBoZWFkZXIgdmFsdWUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGh0dHBfcnhfY29udGVudF9sZW5ndGggKCBzdHJ1Y3QgaHR0cF9yZXF1ZXN0ICpodHRwLAorCQkJCSAgICBjb25zdCBjaGFyICp2YWx1ZSApIHsKKwljaGFyICplbmRwOworCisJaHR0cC0+Y29udGVudF9sZW5ndGggPSBzdHJ0b3VsICggdmFsdWUsICZlbmRwLCAxMCApOworCWlmICggKmVuZHAgIT0gJ1wwJyApIHsKKwkJREJHQyAoIGh0dHAsICJIVFRQICVwIGludmFsaWQgQ29udGVudC1MZW5ndGggXCIlc1wiXG4iLAorCQkgICAgICAgaHR0cCwgdmFsdWUgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogVXNlIHNlZWsoKSB0byBub3RpZnkgcmVjaXBpZW50IG9mIGZpbGVzaXplICovCisJeGZlcl9zZWVrICggJmh0dHAtPnhmZXIsIGh0dHAtPmNvbnRlbnRfbGVuZ3RoLCBTRUVLX1NFVCApOworCXhmZXJfc2VlayAoICZodHRwLT54ZmVyLCAwLCBTRUVLX1NFVCApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBBbiBIVFRQIGhlYWRlciBoYW5kbGVyICovCitzdHJ1Y3QgaHR0cF9oZWFkZXJfaGFuZGxlciB7CisJLyoqIE5hbWUgKGUuZy4gIkNvbnRlbnQtTGVuZ3RoIikgKi8KKwljb25zdCBjaGFyICpoZWFkZXI7CisJLyoqIEhhbmRsZSByZWNlaXZlZCBoZWFkZXIKKwkgKgorCSAqIEB2IGh0dHAJSFRUUCByZXF1ZXN0CisJICogQHYgdmFsdWUJSFRUUCBoZWFkZXIgdmFsdWUKKwkgKiBAcmV0IHJjCVJldHVybiBzdGF0dXMgY29kZQorCSAqCisJICogSWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIHRoZSBkb3dubG9hZCB3aWxsIGJlIGFib3J0ZWQuCisJICovCisJaW50ICggKiByeCApICggc3RydWN0IGh0dHBfcmVxdWVzdCAqaHR0cCwgY29uc3QgY2hhciAqdmFsdWUgKTsKK307CisKKy8qKiBMaXN0IG9mIEhUVFAgaGVhZGVyIGhhbmRsZXJzICovCitzdGF0aWMgc3RydWN0IGh0dHBfaGVhZGVyX2hhbmRsZXIgaHR0cF9oZWFkZXJfaGFuZGxlcnNbXSA9IHsKKwl7CisJCS5oZWFkZXIgPSAiTG9jYXRpb24iLAorCQkucnggPSBodHRwX3J4X2xvY2F0aW9uLAorCX0sCisJeworCQkuaGVhZGVyID0gIkNvbnRlbnQtTGVuZ3RoIiwKKwkJLnJ4ID0gaHR0cF9yeF9jb250ZW50X2xlbmd0aCwKKwl9LAorCXsgTlVMTCwgTlVMTCB9Cit9OworCisvKioKKyAqIEhhbmRsZSBIVFRQIGhlYWRlcgorICoKKyAqIEB2IGh0dHAJCUhUVFAgcmVxdWVzdAorICogQHYgaGVhZGVyCQlIVFRQIGhlYWRlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHR0cF9yeF9oZWFkZXIgKCBzdHJ1Y3QgaHR0cF9yZXF1ZXN0ICpodHRwLCBjaGFyICpoZWFkZXIgKSB7CisJc3RydWN0IGh0dHBfaGVhZGVyX2hhbmRsZXIgKmhhbmRsZXI7CisJY2hhciAqc2VwYXJhdG9yOworCWNoYXIgKnZhbHVlOworCWludCByYzsKKworCS8qIEFuIGVtcHR5IGhlYWRlciBsaW5lIG1hcmtzIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBkYXRhIHBoYXNlICovCisJaWYgKCAhIGhlYWRlclswXSApIHsKKwkJREJHQyAoIGh0dHAsICJIVFRQICVwIHN0YXJ0IG9mIGRhdGFcbiIsIGh0dHAgKTsKKwkJZW1wdHlfbGluZV9idWZmZXIgKCAmaHR0cC0+bGluZWJ1ZiApOworCQlodHRwLT5yeF9zdGF0ZSA9IEhUVFBfUlhfREFUQTsKKwkJcmV0dXJuIDA7CisJfQorCisJREJHQyAoIGh0dHAsICJIVFRQICVwIGhlYWRlciBcIiVzXCJcbiIsIGh0dHAsIGhlYWRlciApOworCisJLyogU3BsaXQgaGVhZGVyIGF0IHRoZSAiOiAiICovCisJc2VwYXJhdG9yID0gc3Ryc3RyICggaGVhZGVyLCAiOiAiICk7CisJaWYgKCAhIHNlcGFyYXRvciApIHsKKwkJREJHQyAoIGh0dHAsICJIVFRQICVwIG1hbGZvcm1lZCBoZWFkZXJcbiIsIGh0dHAgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCSpzZXBhcmF0b3IgPSAnXDAnOworCXZhbHVlID0gKCBzZXBhcmF0b3IgKyAyICk7CisKKwkvKiBIYW5kIG9mZiB0byBoZWFkZXIgaGFuZGxlciwgaWYgb25lIGV4aXN0cyAqLworCWZvciAoIGhhbmRsZXIgPSBodHRwX2hlYWRlcl9oYW5kbGVycyA7IGhhbmRsZXItPmhlYWRlciA7IGhhbmRsZXIrKyApIHsKKwkJaWYgKCBzdHJjYXNlY21wICggaGVhZGVyLCBoYW5kbGVyLT5oZWFkZXIgKSA9PSAwICkgeworCQkJaWYgKCAoIHJjID0gaGFuZGxlci0+cnggKCBodHRwLCB2YWx1ZSApICkgIT0gMCApCisJCQkJcmV0dXJuIHJjOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKiBBbiBIVFRQIGxpbmUtYmFzZWQgZGF0YSBoYW5kbGVyICovCitzdHJ1Y3QgaHR0cF9saW5lX2hhbmRsZXIgeworCS8qKiBIYW5kbGUgbGluZQorCSAqCisJICogQHYgaHR0cAlIVFRQIHJlcXVlc3QKKwkgKiBAdiBsaW5lCUxpbmUgdG8gaGFuZGxlCisJICogQHJldCByYwlSZXR1cm4gc3RhdHVzIGNvZGUKKwkgKi8KKwlpbnQgKCAqIHJ4ICkgKCBzdHJ1Y3QgaHR0cF9yZXF1ZXN0ICpodHRwLCBjaGFyICpsaW5lICk7Cit9OworCisvKiogTGlzdCBvZiBIVFRQIGxpbmUtYmFzZWQgZGF0YSBoYW5kbGVycyAqLworc3RhdGljIHN0cnVjdCBodHRwX2xpbmVfaGFuZGxlciBodHRwX2xpbmVfaGFuZGxlcnNbXSA9IHsKKwlbSFRUUF9SWF9SRVNQT05TRV0JPSB7IC5yeCA9IGh0dHBfcnhfcmVzcG9uc2UgfSwKKwlbSFRUUF9SWF9IRUFERVJdCT0geyAucnggPSBodHRwX3J4X2hlYWRlciB9LAorfTsKKworLyoqCisgKiBIYW5kbGUgbmV3IGRhdGEgYXJyaXZpbmcgdmlhIEhUVFAgY29ubmVjdGlvbiBpbiB0aGUgZGF0YSBwaGFzZQorICoKKyAqIEB2IGh0dHAJCUhUVFAgcmVxdWVzdAorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGh0dHBfcnhfZGF0YSAoIHN0cnVjdCBodHRwX3JlcXVlc3QgKmh0dHAsCisJCQkgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCWludCByYzsKKworCS8qIFVwZGF0ZSByZWNlaXZlZCBsZW5ndGggKi8KKwlodHRwLT5yeF9sZW4gKz0gaW9iX2xlbiAoIGlvYnVmICk7CisKKwkvKiBIYW5kIG9mZiBkYXRhIGJ1ZmZlciAqLworCWlmICggKCByYyA9IHhmZXJfZGVsaXZlcl9pb2IgKCAmaHR0cC0+eGZlciwgaW9idWYgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBJZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGNvbnRlbnQtbGVuZ3RoLCBzdG9wIG5vdyAqLworCWlmICggaHR0cC0+Y29udGVudF9sZW5ndGggJiYKKwkgICAgICggaHR0cC0+cnhfbGVuID49IGh0dHAtPmNvbnRlbnRfbGVuZ3RoICkgKSB7CisJCWh0dHBfZG9uZSAoIGh0dHAsIDAgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgbmV3IGRhdGEgYXJyaXZpbmcgdmlhIEhUVFAgY29ubmVjdGlvbgorICoKKyAqIEB2IHNvY2tldAkJVHJhbnNwb3J0IGxheWVyIGludGVyZmFjZQorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEB2IG1ldGEJCURhdGEgdHJhbnNmZXIgbWV0YWRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGh0dHBfc29ja2V0X2RlbGl2ZXJfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICpzb2NrZXQsCisJCQkJICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCQkgICAgIHN0cnVjdCB4ZmVyX21ldGFkYXRhICptZXRhIF9fdW51c2VkICkgeworCXN0cnVjdCBodHRwX3JlcXVlc3QgKmh0dHAgPQorCQljb250YWluZXJfb2YgKCBzb2NrZXQsIHN0cnVjdCBodHRwX3JlcXVlc3QsIHNvY2tldCApOworCXN0cnVjdCBodHRwX2xpbmVfaGFuZGxlciAqbGg7CisJY2hhciAqbGluZTsKKwlzc2l6ZV90IGxlbjsKKwlpbnQgcmMgPSAwOworCisJd2hpbGUgKCBpb2JfbGVuICggaW9idWYgKSApIHsKKwkJc3dpdGNoICggaHR0cC0+cnhfc3RhdGUgKSB7CisJCWNhc2UgSFRUUF9SWF9ERUFEOgorCQkJLyogRG8gbm8gZnVydGhlciBwcm9jZXNzaW5nICovCisJCQlnb3RvIGRvbmU7CisJCWNhc2UgSFRUUF9SWF9EQVRBOgorCQkJLyogT25jZSB3ZSdyZSBpbnRvIHRoZSBkYXRhIHBoYXNlLCBqdXN0IGZpbGwKKwkJCSAqIHRoZSBkYXRhIGJ1ZmZlcgorCQkJICovCisJCQlyYyA9IGh0dHBfcnhfZGF0YSAoIGh0dHAsIGlvYl9kaXNvd24gKCBpb2J1ZiApICk7CisJCQlnb3RvIGRvbmU7CisJCWNhc2UgSFRUUF9SWF9SRVNQT05TRToKKwkJY2FzZSBIVFRQX1JYX0hFQURFUjoKKwkJCS8qIEluIHRoZSBvdGhlciBwaGFzZXMsIGJ1ZmZlciBhbmQgcHJvY2VzcyBhCisJCQkgKiBsaW5lIGF0IGEgdGltZQorCQkJICovCisJCQlsZW4gPSBsaW5lX2J1ZmZlciAoICZodHRwLT5saW5lYnVmLCBpb2J1Zi0+ZGF0YSwKKwkJCQkJICAgIGlvYl9sZW4gKCBpb2J1ZiApICk7CisJCQlpZiAoIGxlbiA8IDAgKSB7CisJCQkJcmMgPSBsZW47CisJCQkJREJHQyAoIGh0dHAsICJIVFRQICVwIGNvdWxkIG5vdCBidWZmZXIgbGluZTogIgorCQkJCSAgICAgICAiJXNcbiIsIGh0dHAsIHN0cmVycm9yICggcmMgKSApOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWlvYl9wdWxsICggaW9idWYsIGxlbiApOworCQkJbGluZSA9IGJ1ZmZlcmVkX2xpbmUgKCAmaHR0cC0+bGluZWJ1ZiApOworCQkJaWYgKCBsaW5lICkgeworCQkJCWxoID0gJmh0dHBfbGluZV9oYW5kbGVyc1todHRwLT5yeF9zdGF0ZV07CisJCQkJaWYgKCAoIHJjID0gbGgtPnJ4ICggaHR0cCwgbGluZSApICkgIT0gMCApCisJCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXNzZXJ0ICggMCApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKyBkb25lOgorCWlmICggcmMgKQorCQlodHRwX2RvbmUgKCBodHRwLCByYyApOworCWZyZWVfaW9iICggaW9idWYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogSFRUUCBwcm9jZXNzCisgKgorICogQHYgcHJvY2VzcwkJUHJvY2VzcworICovCitzdGF0aWMgdm9pZCBodHRwX3N0ZXAgKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcyApIHsKKwlzdHJ1Y3QgaHR0cF9yZXF1ZXN0ICpodHRwID0KKwkJY29udGFpbmVyX29mICggcHJvY2Vzcywgc3RydWN0IGh0dHBfcmVxdWVzdCwgcHJvY2VzcyApOworCWNvbnN0IGNoYXIgKmhvc3QgPSBodHRwLT51cmktPmhvc3Q7CisJY29uc3QgY2hhciAqdXNlciA9IGh0dHAtPnVyaS0+dXNlcjsKKwljb25zdCBjaGFyICpwYXNzd29yZCA9CisJCSggaHR0cC0+dXJpLT5wYXNzd29yZCA/IGh0dHAtPnVyaS0+cGFzc3dvcmQgOiAiIiApOworCXNpemVfdCB1c2VyX3B3X2xlbiA9ICggdXNlciA/ICggc3RybGVuICggdXNlciApICsgMSAvKiAiOiIgKi8gKworCQkJCQlzdHJsZW4gKCBwYXNzd29yZCApICkgOiAwICk7CisJc2l6ZV90IHVzZXJfcHdfYmFzZTY0X2xlbiA9IGJhc2U2NF9lbmNvZGVkX2xlbiAoIHVzZXJfcHdfbGVuICk7CisJY2hhciB1c2VyX3B3WyB1c2VyX3B3X2xlbiArIDEgLyogTlVMICovIF07CisJY2hhciB1c2VyX3B3X2Jhc2U2NFsgdXNlcl9wd19iYXNlNjRfbGVuICsgMSAvKiBOVUwgKi8gXTsKKwlpbnQgcmM7CisJaW50IHJlcXVlc3RfbGVuID0gdW5wYXJzZV91cmkgKCBOVUxMLCAwLCBodHRwLT51cmksCisJCQkJCVVSSV9QQVRIX0JJVCB8IFVSSV9RVUVSWV9CSVQgKTsKKworCWlmICggeGZlcl93aW5kb3cgKCAmaHR0cC0+c29ja2V0ICkgKSB7CisJCWNoYXIgcmVxdWVzdFtyZXF1ZXN0X2xlbiArIDFdOworCisJCS8qIENvbnN0cnVjdCBwYXRoP3F1ZXJ5IHJlcXVlc3QgKi8KKwkJdW5wYXJzZV91cmkgKCByZXF1ZXN0LCBzaXplb2YgKCByZXF1ZXN0ICksIGh0dHAtPnVyaSwKKwkJCSAgICAgIFVSSV9QQVRIX0JJVCB8IFVSSV9RVUVSWV9CSVQgKTsKKworCQkvKiBXZSB3YW50IHRvIGV4ZWN1dGUgb25seSBvbmNlICovCisJCXByb2Nlc3NfZGVsICggJmh0dHAtPnByb2Nlc3MgKTsKKworCQkvKiBDb25zdHJ1Y3QgYXV0aG9yaXNhdGlvbiwgaWYgYXBwbGljYWJsZSAqLworCQlpZiAoIHVzZXIgKSB7CisJCQkvKiBNYWtlICJ1c2VyOnBhc3N3b3JkIiBzdHJpbmcgZnJvbSBkZWNvZGVkIGZpZWxkcyAqLworCQkJc25wcmludGYgKCB1c2VyX3B3LCBzaXplb2YgKCB1c2VyX3B3ICksICIlczolcyIsCisJCQkJICAgdXNlciwgcGFzc3dvcmQgKTsKKworCQkJLyogQmFzZTY0LWVuY29kZSB0aGUgInVzZXI6cGFzc3dvcmQiIHN0cmluZyAqLworCQkJYmFzZTY0X2VuY29kZSAoIHVzZXJfcHcsIHVzZXJfcHdfYmFzZTY0ICk7CisJCX0KKworCQkvKiBTZW5kIEdFVCByZXF1ZXN0ICovCisJCWlmICggKCByYyA9IHhmZXJfcHJpbnRmICggJmh0dHAtPnNvY2tldCwKKwkJCQkJICAiR0VUICVzJXMgSFRUUC8xLjBcclxuIgorCQkJCQkgICJVc2VyLUFnZW50OiBnUFhFLyIgVkVSU0lPTiAiXHJcbiIKKwkJCQkJICAiJXMlcyVzIgorCQkJCQkgICJIb3N0OiAlc1xyXG4iCisJCQkJCSAgIlxyXG4iLAorCQkJCQkgIGh0dHAtPnVyaS0+cGF0aCA/ICIiIDogIi8iLAorCQkJCQkgIHJlcXVlc3QsCisJCQkJCSAgKCB1c2VyID8KKwkJCQkJICAgICJBdXRob3JpemF0aW9uOiBCYXNpYyAiIDogIiIgKSwKKwkJCQkJICAoIHVzZXIgPyB1c2VyX3B3X2Jhc2U2NCA6ICIiICksCisJCQkJCSAgKCB1c2VyID8gIlxyXG4iIDogIiIgKSwKKwkJCQkJICBob3N0ICkgKSAhPSAwICkgeworCQkJaHR0cF9kb25lICggaHR0cCwgcmMgKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBIVFRQIGNvbm5lY3Rpb24gY2xvc2VkIGJ5IG5ldHdvcmsgc3RhY2sKKyAqCisgKiBAdiBzb2NrZXQJCVRyYW5zcG9ydCBsYXllciBpbnRlcmZhY2UKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIGh0dHBfc29ja2V0X2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICpzb2NrZXQsIGludCByYyApIHsKKwlzdHJ1Y3QgaHR0cF9yZXF1ZXN0ICpodHRwID0KKwkJY29udGFpbmVyX29mICggc29ja2V0LCBzdHJ1Y3QgaHR0cF9yZXF1ZXN0LCBzb2NrZXQgKTsKKworCURCR0MgKCBodHRwLCAiSFRUUCAlcCBzb2NrZXQgY2xvc2VkOiAlc1xuIiwKKwkgICAgICAgaHR0cCwgc3RyZXJyb3IgKCByYyApICk7CisJCisJaHR0cF9kb25lICggaHR0cCwgcmMgKTsKK30KKworLyoqIEhUVFAgc29ja2V0IG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBodHRwX3NvY2tldF9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSBodHRwX3NvY2tldF9jbG9zZSwKKwkudnJlZGlyZWN0CT0geGZlcl92cmVvcGVuLAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IGh0dHBfc29ja2V0X2RlbGl2ZXJfaW9iLAorCS5kZWxpdmVyX3Jhdwk9IHhmZXJfZGVsaXZlcl9hc19pb2IsCit9OworCisvKioKKyAqIENsb3NlIEhUVFAgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgcmMJCVJlYXNvbiBmb3IgY2xvc2UKKyAqLworc3RhdGljIHZvaWQgaHR0cF94ZmVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKSB7CisJc3RydWN0IGh0dHBfcmVxdWVzdCAqaHR0cCA9CisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCBodHRwX3JlcXVlc3QsIHhmZXIgKTsKKworCURCR0MgKCBodHRwLCAiSFRUUCAlcCBpbnRlcmZhY2UgY2xvc2VkOiAlc1xuIiwKKwkgICAgICAgaHR0cCwgc3RyZXJyb3IgKCByYyApICk7CisKKwlodHRwX2RvbmUgKCBodHRwLCByYyApOworfQorCisvKiogSFRUUCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgaHR0cF94ZmVyX29wZXJhdGlvbnMgPSB7CisJLmNsb3NlCQk9IGh0dHBfeGZlcl9jbG9zZSwKKwkudnJlZGlyZWN0CT0gaWdub3JlX3hmZXJfdnJlZGlyZWN0LAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHhmZXJfZGVsaXZlcl9hc19yYXcsCisJLmRlbGl2ZXJfcmF3CT0gaWdub3JlX3hmZXJfZGVsaXZlcl9yYXcsCit9OworCisvKioKKyAqIEluaXRpYXRlIGFuIEhUVFAgY29ubmVjdGlvbiwgd2l0aCBvcHRpb25hbCBmaWx0ZXIKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdXJpCQlVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIKKyAqIEB2IGRlZmF1bHRfcG9ydAlEZWZhdWx0IHBvcnQgbnVtYmVyCisgKiBAdiBmaWx0ZXIJCUZpbHRlciB0byBhcHBseSB0byBzb2NrZXQsIG9yIE5VTEwKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgaHR0cF9vcGVuX2ZpbHRlciAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgc3RydWN0IHVyaSAqdXJpLAorCQkgICAgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydCwKKwkJICAgICAgIGludCAoICogZmlsdGVyICkgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkJCSAgc3RydWN0IHhmZXJfaW50ZXJmYWNlICoqbmV4dCApICkgeworCXN0cnVjdCBodHRwX3JlcXVlc3QgKmh0dHA7CisJc3RydWN0IHNvY2thZGRyX3RjcGlwIHNlcnZlcjsKKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnNvY2tldDsKKwlpbnQgcmM7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCAhIHVyaS0+aG9zdCApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQWxsb2NhdGUgYW5kIHBvcHVsYXRlIEhUVFAgc3RydWN0dXJlICovCisJaHR0cCA9IHphbGxvYyAoIHNpemVvZiAoICpodHRwICkgKTsKKwlpZiAoICEgaHR0cCApCisJCXJldHVybiAtRU5PTUVNOworCWh0dHAtPnJlZmNudC5mcmVlID0gaHR0cF9mcmVlOworCXhmZXJfaW5pdCAoICZodHRwLT54ZmVyLCAmaHR0cF94ZmVyX29wZXJhdGlvbnMsICZodHRwLT5yZWZjbnQgKTsKKyAgICAgICAJaHR0cC0+dXJpID0gdXJpX2dldCAoIHVyaSApOworCXhmZXJfaW5pdCAoICZodHRwLT5zb2NrZXQsICZodHRwX3NvY2tldF9vcGVyYXRpb25zLCAmaHR0cC0+cmVmY250ICk7CisJcHJvY2Vzc19pbml0ICggJmh0dHAtPnByb2Nlc3MsIGh0dHBfc3RlcCwgJmh0dHAtPnJlZmNudCApOworCisJLyogT3BlbiBzb2NrZXQgKi8KKwltZW1zZXQgKCAmc2VydmVyLCAwLCBzaXplb2YgKCBzZXJ2ZXIgKSApOworCXNlcnZlci5zdF9wb3J0ID0gaHRvbnMgKCB1cmlfcG9ydCAoIGh0dHAtPnVyaSwgZGVmYXVsdF9wb3J0ICkgKTsKKwlzb2NrZXQgPSAmaHR0cC0+c29ja2V0OworCWlmICggZmlsdGVyICkgeworCQlpZiAoICggcmMgPSBmaWx0ZXIgKCBzb2NrZXQsICZzb2NrZXQgKSApICE9IDAgKQorCQkJZ290byBlcnI7CisJfQorCWlmICggKCByYyA9IHhmZXJfb3Blbl9uYW1lZF9zb2NrZXQgKCBzb2NrZXQsIFNPQ0tfU1RSRUFNLAorCQkJCQkgICAgICggc3RydWN0IHNvY2thZGRyICogKSAmc2VydmVyLAorCQkJCQkgICAgIHVyaS0+aG9zdCwgTlVMTCApICkgIT0gMCApCisJCWdvdG8gZXJyOworCisJLyogQXR0YWNoIHRvIHBhcmVudCBpbnRlcmZhY2UsIG1vcnRhbGlzZSBzZWxmLCBhbmQgcmV0dXJuICovCisJeGZlcl9wbHVnX3BsdWcgKCAmaHR0cC0+eGZlciwgeGZlciApOworCXJlZl9wdXQgKCAmaHR0cC0+cmVmY250ICk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJREJHQyAoIGh0dHAsICJIVFRQICVwIGNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdDogJXNcbiIsIAorCSAgICAgICBodHRwLCBzdHJlcnJvciAoIHJjICkgKTsKKwlodHRwX2RvbmUgKCBodHRwLCByYyApOworCXJlZl9wdXQgKCAmaHR0cC0+cmVmY250ICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEluaXRpYXRlIGFuIEhUVFAgY29ubmVjdGlvbgorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiB1cmkJCVVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHR0cF9vcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBzdHJ1Y3QgdXJpICp1cmkgKSB7CisJcmV0dXJuIGh0dHBfb3Blbl9maWx0ZXIgKCB4ZmVyLCB1cmksIEhUVFBfUE9SVCwgTlVMTCApOworfQorCisvKiogSFRUUCBVUkkgb3BlbmVyICovCitzdHJ1Y3QgdXJpX29wZW5lciBodHRwX3VyaV9vcGVuZXIgX191cmlfb3BlbmVyID0geworCS5zY2hlbWUJPSAiaHR0cCIsCisJLm9wZW4JPSBodHRwX29wZW4sCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L3RjcC9odHRwcy5jIGIvZ3B4ZS9zcmMvbmV0L3RjcC9odHRwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjk2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvdGNwL2h0dHBzLmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFNlY3VyZSBIeXBlciBUZXh0IFRyYW5zZmVyIFByb3RvY29sIChIVFRQUykKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGdweGUvb3Blbi5oPgorI2luY2x1ZGUgPGdweGUvdGxzLmg+CisjaW5jbHVkZSA8Z3B4ZS9odHRwLmg+CisjaW5jbHVkZSA8Z3B4ZS9mZWF0dXJlcy5oPgorCitGRUFUVVJFICggRkVBVFVSRV9QUk9UT0NPTCwgIkhUVFBTIiwgREhDUF9FQl9GRUFUVVJFX0hUVFBTLCAxICk7CisKKy8qKgorICogSW5pdGlhdGUgYW4gSFRUUFMgY29ubmVjdGlvbgorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiB1cmkJCVVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHR0cHNfb3BlbiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgc3RydWN0IHVyaSAqdXJpICkgeworCXJldHVybiBodHRwX29wZW5fZmlsdGVyICggeGZlciwgdXJpLCBIVFRQU19QT1JULCBhZGRfdGxzICk7Cit9CisKKy8qKiBIVFRQUyBVUkkgb3BlbmVyICovCitzdHJ1Y3QgdXJpX29wZW5lciBodHRwc191cmlfb3BlbmVyIF9fdXJpX29wZW5lciA9IHsKKwkuc2NoZW1lCT0gImh0dHBzIiwKKwkub3Blbgk9IGh0dHBzX29wZW4sCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L3RjcC9pc2NzaS5jIGIvZ3B4ZS9zcmMvbmV0L3RjcC9pc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTM4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvdGNwL2lzY3NpLmMKQEAgLTAsMCArMSwxOTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS92c3ByaW50Zi5oPgorI2luY2x1ZGUgPGdweGUvc29ja2V0Lmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisjaW5jbHVkZSA8Z3B4ZS9zY3NpLmg+CisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS91YWNjZXNzLmg+CisjaW5jbHVkZSA8Z3B4ZS90Y3BpcC5oPgorI2luY2x1ZGUgPGdweGUvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxncHhlL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Z3B4ZS9pc2NzaS5oPgorCisvKiogQGZpbGUKKyAqCisgKiBpU0NTSSBwcm90b2NvbAorICoKKyAqLworCitGRUFUVVJFICggRkVBVFVSRV9QUk9UT0NPTCwgImlTQ1NJIiwgREhDUF9FQl9GRUFUVVJFX0lTQ1NJLCAxICk7CisKKy8qKiBpU0NTSSBpbml0aWF0b3IgbmFtZSAoZXhwbGljaXRseSBzcGVjaWZpZWQpICovCitzdGF0aWMgY2hhciAqaXNjc2lfZXhwbGljaXRfaW5pdGlhdG9yX2lxbjsKKworLyoqIERlZmF1bHQgaVNDU0kgaW5pdGlhdG9yIG5hbWUgKGNvbnN0cnVjdGVkIGZyb20gaG9zdG5hbWUpICovCitzdGF0aWMgY2hhciAqaXNjc2lfZGVmYXVsdF9pbml0aWF0b3JfaXFuOworCisvKiogaVNDU0kgaW5pdGlhdG9yIHVzZXJuYW1lICovCitzdGF0aWMgY2hhciAqaXNjc2lfaW5pdGlhdG9yX3VzZXJuYW1lOworCisvKiogaVNDU0kgaW5pdGlhdG9yIHBhc3N3b3JkICovCitzdGF0aWMgY2hhciAqaXNjc2lfaW5pdGlhdG9yX3Bhc3N3b3JkOworCisvKiogaVNDU0kgdGFyZ2V0IHVzZXJuYW1lICovCitzdGF0aWMgY2hhciAqaXNjc2lfdGFyZ2V0X3VzZXJuYW1lOworCisvKiogaVNDU0kgdGFyZ2V0IHBhc3N3b3JkICovCitzdGF0aWMgY2hhciAqaXNjc2lfdGFyZ2V0X3Bhc3N3b3JkOworCitzdGF0aWMgdm9pZCBpc2NzaV9zdGFydF90eCAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSApOworc3RhdGljIHZvaWQgaXNjc2lfc3RhcnRfbG9naW4gKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2kgKTsKK3N0YXRpYyB2b2lkIGlzY3NpX3N0YXJ0X2RhdGFfb3V0ICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpLAorCQkJCSAgIHVuc2lnbmVkIGludCBkYXRhc24gKTsKKworLyoqCisgKiBGaW5pc2ggcmVjZWl2aW5nIFBEVSBkYXRhIGludG8gYnVmZmVyCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqLworc3RhdGljIHZvaWQgaXNjc2lfcnhfYnVmZmVyZWRfZGF0YV9kb25lICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpICkgeworCWZyZWUgKCBpc2NzaS0+cnhfYnVmZmVyICk7CisJaXNjc2ktPnJ4X2J1ZmZlciA9IE5VTEw7Cit9CisKKy8qKgorICogRnJlZSBpU0NTSSBzZXNzaW9uCisgKgorICogQHYgcmVmY250CQlSZWZlcmVuY2UgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBpc2NzaV9mcmVlICggc3RydWN0IHJlZmNudCAqcmVmY250ICkgeworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSA9CisJCWNvbnRhaW5lcl9vZiAoIHJlZmNudCwgc3RydWN0IGlzY3NpX3Nlc3Npb24sIHJlZmNudCApOworCisJZnJlZSAoIGlzY3NpLT50YXJnZXRfYWRkcmVzcyApOworCWZyZWUgKCBpc2NzaS0+dGFyZ2V0X2lxbiApOworCWZyZWUgKCBpc2NzaS0+aW5pdGlhdG9yX3VzZXJuYW1lICk7CisJZnJlZSAoIGlzY3NpLT5pbml0aWF0b3JfcGFzc3dvcmQgKTsKKwlmcmVlICggaXNjc2ktPnRhcmdldF91c2VybmFtZSApOworCWZyZWUgKCBpc2NzaS0+dGFyZ2V0X3Bhc3N3b3JkICk7CisJY2hhcF9maW5pc2ggKCAmaXNjc2ktPmNoYXAgKTsKKwlpc2NzaV9yeF9idWZmZXJlZF9kYXRhX2RvbmUgKCBpc2NzaSApOworCWZyZWUgKCBpc2NzaSApOworfQorCisvKioKKyAqIE9wZW4gaVNDU0kgdHJhbnNwb3J0LWxheWVyIGNvbm5lY3Rpb24KKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfb3Blbl9jb25uZWN0aW9uICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpICkgeworCXN0cnVjdCBzb2NrYWRkcl90Y3BpcCB0YXJnZXQ7CisJaW50IHJjOworCisJYXNzZXJ0ICggaXNjc2ktPnR4X3N0YXRlID09IElTQ1NJX1RYX0lETEUgKTsKKwlhc3NlcnQgKCBpc2NzaS0+cnhfc3RhdGUgPT0gSVNDU0lfUlhfQkhTICk7CisJYXNzZXJ0ICggaXNjc2ktPnJ4X29mZnNldCA9PSAwICk7CisKKwkvKiBPcGVuIHNvY2tldCAqLworCW1lbXNldCAoICZ0YXJnZXQsIDAsIHNpemVvZiAoIHRhcmdldCApICk7CisJdGFyZ2V0LnN0X3BvcnQgPSBodG9ucyAoIGlzY3NpLT50YXJnZXRfcG9ydCApOworCWlmICggKCByYyA9IHhmZXJfb3Blbl9uYW1lZF9zb2NrZXQgKCAmaXNjc2ktPnNvY2tldCwgU09DS19TVFJFQU0sCisJCQkJCSAgICAgKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZ0YXJnZXQsCisJCQkJCSAgICAgaXNjc2ktPnRhcmdldF9hZGRyZXNzLAorCQkJCQkgICAgIE5VTEwgKSApICE9IDAgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIGNvdWxkIG5vdCBvcGVuIHNvY2tldDogJXNcbiIsCisJCSAgICAgICBpc2NzaSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBFbnRlciBzZWN1cml0eSBuZWdvdGlhdGlvbiBwaGFzZSAqLworCWlzY3NpLT5zdGF0dXMgPSAoIElTQ1NJX1NUQVRVU19TRUNVUklUWV9ORUdPVElBVElPTl9QSEFTRSB8CisJCQkgIElTQ1NJX1NUQVRVU19TVFJJTkdTX1NFQ1VSSVRZICk7CisJaWYgKCBpc2NzaS0+dGFyZ2V0X3VzZXJuYW1lICkKKwkJaXNjc2ktPnN0YXR1cyB8PSBJU0NTSV9TVEFUVVNfQVVUSF9SRVZFUlNFX1JFUVVJUkVEOworCisJLyogQXNzaWduIGZyZXNoIGluaXRpYXRvciB0YXNrIHRhZyAqLworCWlzY3NpLT5pdHQrKzsKKworCS8qIEluaXRpYXRlIGxvZ2luICovCisJaXNjc2lfc3RhcnRfbG9naW4gKCBpc2NzaSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2xvc2UgaVNDU0kgdHJhbnNwb3J0LWxheWVyIGNvbm5lY3Rpb24KKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHYgcmMJCVJlYXNvbiBmb3IgY2xvc2UKKyAqCisgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC1sYXllciBjb25uZWN0aW9uIGFuZCByZXNldHMgdGhlIHNlc3Npb24gc3RhdGUKKyAqIHJlYWR5IHRvIGF0dGVtcHQgYSBmcmVzaCBsb2dpbi4KKyAqLworc3RhdGljIHZvaWQgaXNjc2lfY2xvc2VfY29ubmVjdGlvbiAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwgaW50IHJjICkgeworCisJLyogQ2xvc2UgYWxsIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlcyAqLworCXhmZXJfY2xvc2UgKCAmaXNjc2ktPnNvY2tldCwgcmMgKTsKKworCS8qIENsZWFyIGNvbm5lY3Rpb24gc3RhdHVzICovCisJaXNjc2ktPnN0YXR1cyA9IDA7CisKKwkvKiBSZXNldCBUWCBhbmQgUlggc3RhdGUgbWFjaGluZXMgKi8KKwlpc2NzaS0+dHhfc3RhdGUgPSBJU0NTSV9UWF9JRExFOworCWlzY3NpLT5yeF9zdGF0ZSA9IElTQ1NJX1JYX0JIUzsKKwlpc2NzaS0+cnhfb2Zmc2V0ID0gMDsKKworCS8qIEZyZWUgYW55IHRlbXBvcmFyeSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5ICovCisJY2hhcF9maW5pc2ggKCAmaXNjc2ktPmNoYXAgKTsKKwlpc2NzaV9yeF9idWZmZXJlZF9kYXRhX2RvbmUgKCBpc2NzaSApOworfQorCisvKioKKyAqIE1hcmsgaVNDU0kgU0NTSSBvcGVyYXRpb24gYXMgY29tcGxldGUKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHYgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIE5vdGUgdGhhdCBpc2NzaV9zY3NpX2RvbmUoKSB3aWxsIG5vdCBjbG9zZSB0aGUgY29ubmVjdGlvbiwgYW5kIG11c3QKKyAqIHRoZXJlZm9yZSBiZSBjYWxsZWQgb25seSB3aGVuIHRoZSBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lcyBhcmUgaW4gYW4KKyAqIGFwcHJvcHJpYXRlIHN0YXRlLCBvdGhlcndpc2UgYmFkIHRoaW5ncyBtYXkgaGFwcGVuIG9uIHRoZSBuZXh0IGNhbGwKKyAqIHRvIGlzY3NpX2lzc3VlKCkuICBUaGUgZ2VuZXJhbCBydWxlIGlzIHRvIGNhbGwgaXNjc2lfc2NzaV9kb25lKCkKKyAqIG9ubHkgYXQgdGhlIGVuZCBvZiByZWNlaXZpbmcgYSBQRFU7IGF0IHRoaXMgcG9pbnQgdGhlIFRYIGFuZCBSWAorICogZW5naW5lcyBzaG91bGQgYm90aCBiZSBpZGxlLgorICovCitzdGF0aWMgdm9pZCBpc2NzaV9zY3NpX2RvbmUgKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2ksIGludCByYyApIHsKKworCWFzc2VydCAoIGlzY3NpLT50eF9zdGF0ZSA9PSBJU0NTSV9UWF9JRExFICk7CisJYXNzZXJ0ICggaXNjc2ktPmNvbW1hbmQgIT0gTlVMTCApOworCisJaXNjc2ktPmNvbW1hbmQtPnJjID0gcmM7CisJaXNjc2ktPmNvbW1hbmQgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGlTQ1NJIFNDU0kgY29tbWFuZCBpc3N1aW5nCisgKgorICovCisKKy8qKgorICogQnVpbGQgaVNDU0kgU0NTSSBjb21tYW5kIEJIUworICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKgorICogV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgYmlkaXJlY3Rpb25hbCBjb21tYW5kcyAoaS5lLiB3aXRoIGJvdGgKKyAqIERhdGEtSW4gYW5kIERhdGEtT3V0IHNlZ21lbnRzKTsgdGhlc2Ugd291bGQgcmVxdWlyZSBwcm92aWRpbmcgY29kZQorICogdG8gZ2VuZXJhdGUgYW4gQUhTLCBhbmQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBuZWVkIGZvciBpdCBhdAorICogdGhlIG1vbWVudC4KKyAqLworc3RhdGljIHZvaWQgaXNjc2lfc3RhcnRfY29tbWFuZCAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSApIHsKKwlzdHJ1Y3QgaXNjc2lfYmhzX3Njc2lfY29tbWFuZCAqY29tbWFuZCA9ICZpc2NzaS0+dHhfYmhzLnNjc2lfY29tbWFuZDsKKworCWFzc2VydCAoICEgKCBpc2NzaS0+Y29tbWFuZC0+ZGF0YV9pbiAmJiBpc2NzaS0+Y29tbWFuZC0+ZGF0YV9vdXQgKSApOworCisJLyogQ29uc3RydWN0IEJIUyBhbmQgaW5pdGlhdGUgdHJhbnNtaXNzaW9uICovCisJaXNjc2lfc3RhcnRfdHggKCBpc2NzaSApOworCWNvbW1hbmQtPm9wY29kZSA9IElTQ1NJX09QQ09ERV9TQ1NJX0NPTU1BTkQ7CisJY29tbWFuZC0+ZmxhZ3MgPSAoIElTQ1NJX0ZMQUdfRklOQUwgfAorCQkJICAgSVNDU0lfQ09NTUFORF9BVFRSX1NJTVBMRSApOworCWlmICggaXNjc2ktPmNvbW1hbmQtPmRhdGFfaW4gKQorCQljb21tYW5kLT5mbGFncyB8PSBJU0NTSV9DT01NQU5EX0ZMQUdfUkVBRDsKKwlpZiAoIGlzY3NpLT5jb21tYW5kLT5kYXRhX291dCApCisJCWNvbW1hbmQtPmZsYWdzIHw9IElTQ1NJX0NPTU1BTkRfRkxBR19XUklURTsKKwkvKiBsZW5ndGhzIGxlZnQgYXMgemVybyAqLworCWNvbW1hbmQtPmx1biA9IGlzY3NpLT5sdW47CisJY29tbWFuZC0+aXR0ID0gaHRvbmwgKCArK2lzY3NpLT5pdHQgKTsKKwljb21tYW5kLT5leHBfbGVuID0gaHRvbmwgKCBpc2NzaS0+Y29tbWFuZC0+ZGF0YV9pbl9sZW4gfAorCQkJCSAgIGlzY3NpLT5jb21tYW5kLT5kYXRhX291dF9sZW4gKTsKKwljb21tYW5kLT5jbWRzbiA9IGh0b25sICggaXNjc2ktPmNtZHNuICk7CisJY29tbWFuZC0+ZXhwc3RhdHNuID0gaHRvbmwgKCBpc2NzaS0+c3RhdHNuICsgMSApOworCW1lbWNweSAoICZjb21tYW5kLT5jZGIsICZpc2NzaS0+Y29tbWFuZC0+Y2RiLCBzaXplb2YgKCBjb21tYW5kLT5jZGIgKSk7CisJREJHQzIgKCBpc2NzaSwgImlTQ1NJICVwIHN0YXJ0ICIgU0NTSV9DREJfRk9STUFUICIgJXMgJSN6eFxuIiwKKwkJaXNjc2ksIFNDU0lfQ0RCX0RBVEEgKCBjb21tYW5kLT5jZGIgKSwKKwkJKCBpc2NzaS0+Y29tbWFuZC0+ZGF0YV9pbiA/ICJpbiIgOiAib3V0IiApLAorCQkoIGlzY3NpLT5jb21tYW5kLT5kYXRhX2luID8KKwkJICBpc2NzaS0+Y29tbWFuZC0+ZGF0YV9pbl9sZW4gOgorCQkgIGlzY3NpLT5jb21tYW5kLT5kYXRhX291dF9sZW4gKSApOworfQorCisvKioKKyAqIFJlY2VpdmUgZGF0YSBzZWdtZW50IG9mIGFuIGlTQ1NJIFNDU0kgcmVzcG9uc2UgUERVCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqIEB2IGRhdGEJCVJlY2VpdmVkIGRhdGEKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIHJlY2VpdmVkIGRhdGEKKyAqIEB2IHJlbWFpbmluZwkJRGF0YSByZW1haW5pbmcgYWZ0ZXIgdGhpcyBkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpc2NzaV9yeF9zY3NpX3Jlc3BvbnNlICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpLAorCQkJCSAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLAorCQkJCSAgICBzaXplX3QgcmVtYWluaW5nICkgeworCXN0cnVjdCBpc2NzaV9iaHNfc2NzaV9yZXNwb25zZSAqcmVzcG9uc2UKKwkJPSAmaXNjc2ktPnJ4X2Jocy5zY3NpX3Jlc3BvbnNlOworCWludCBzZW5zZV9vZmZzZXQ7CisKKwkvKiBDYXB0dXJlIHRoZSBzZW5zZSByZXNwb25zZSBjb2RlIGFzIGl0IGZsb2F0cyBwYXN0LCBpZiBwcmVzZW50ICovCisJc2Vuc2Vfb2Zmc2V0ID0gSVNDU0lfU0VOU0VfUkVTUE9OU0VfQ09ERV9PRkZTRVQgLSBpc2NzaS0+cnhfb2Zmc2V0OworCWlmICggKCBzZW5zZV9vZmZzZXQgPj0gMCApICYmIGxlbiApIHsKKwkJaXNjc2ktPmNvbW1hbmQtPnNlbnNlX3Jlc3BvbnNlID0KKwkJCSogKCAoIGNoYXIgKiApIGRhdGEgKyBzZW5zZV9vZmZzZXQgKTsKKwl9CisKKwkvKiBXYWl0IGZvciB3aG9sZSBTQ1NJIHJlc3BvbnNlIHRvIGFycml2ZSAqLworCWlmICggcmVtYWluaW5nICkKKwkJcmV0dXJuIDA7CisJCisJLyogUmVjb3JkIFNDU0kgc3RhdHVzIGNvZGUgKi8KKwlpc2NzaS0+Y29tbWFuZC0+c3RhdHVzID0gcmVzcG9uc2UtPnN0YXR1czsKKworCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KKwlpZiAoIHJlc3BvbnNlLT5yZXNwb25zZSAhPSBJU0NTSV9SRVNQT05TRV9DT01NQU5EX0NPTVBMRVRFICkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBNYXJrIGFzIGNvbXBsZXRlZCAqLworCWlzY3NpX3Njc2lfZG9uZSAoIGlzY3NpLCAwICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVjZWl2ZSBkYXRhIHNlZ21lbnQgb2YgYW4gaVNDU0kgZGF0YS1pbiBQRFUKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHYgZGF0YQkJUmVjZWl2ZWQgZGF0YQorICogQHYgbGVuCQlMZW5ndGggb2YgcmVjZWl2ZWQgZGF0YQorICogQHYgcmVtYWluaW5nCQlEYXRhIHJlbWFpbmluZyBhZnRlciB0aGlzIGRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlzY3NpX3J4X2RhdGFfaW4gKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2ksCisJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLAorCQkJICAgICAgc2l6ZV90IHJlbWFpbmluZyApIHsKKwlzdHJ1Y3QgaXNjc2lfYmhzX2RhdGFfaW4gKmRhdGFfaW4gPSAmaXNjc2ktPnJ4X2Jocy5kYXRhX2luOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJLyogQ29weSBkYXRhIHRvIGRhdGEtaW4gYnVmZmVyICovCisJb2Zmc2V0ID0gbnRvaGwgKCBkYXRhX2luLT5vZmZzZXQgKSArIGlzY3NpLT5yeF9vZmZzZXQ7CisJYXNzZXJ0ICggaXNjc2ktPmNvbW1hbmQgIT0gTlVMTCApOworCWFzc2VydCAoIGlzY3NpLT5jb21tYW5kLT5kYXRhX2luICk7CisJYXNzZXJ0ICggKCBvZmZzZXQgKyBsZW4gKSA8PSBpc2NzaS0+Y29tbWFuZC0+ZGF0YV9pbl9sZW4gKTsKKwljb3B5X3RvX3VzZXIgKCBpc2NzaS0+Y29tbWFuZC0+ZGF0YV9pbiwgb2Zmc2V0LCBkYXRhLCBsZW4gKTsKKworCS8qIFdhaXQgZm9yIHdob2xlIFNDU0kgcmVzcG9uc2UgdG8gYXJyaXZlICovCisJaWYgKCByZW1haW5pbmcgKQorCQlyZXR1cm4gMDsKKworCS8qIE1hcmsgYXMgY29tcGxldGVkIGlmIHN0YXR1cyBpcyBwcmVzZW50ICovCisJaWYgKCBkYXRhX2luLT5mbGFncyAmIElTQ1NJX0RBVEFfRkxBR19TVEFUVVMgKSB7CisJCWFzc2VydCAoICggb2Zmc2V0ICsgbGVuICkgPT0gaXNjc2ktPmNvbW1hbmQtPmRhdGFfaW5fbGVuICk7CisJCWFzc2VydCAoIGRhdGFfaW4tPmZsYWdzICYgSVNDU0lfRkxBR19GSU5BTCApOworCQlpc2NzaS0+Y29tbWFuZC0+c3RhdHVzID0gZGF0YV9pbi0+c3RhdHVzOworCQkvKiBpU0NTSSBjYW5ub3QgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyB2aWEgYSBkYXRhLWluICovCisJCWlzY3NpX3Njc2lfZG9uZSAoIGlzY3NpLCAwICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVjZWl2ZSBkYXRhIHNlZ21lbnQgb2YgYW4gaVNDU0kgUjJUIFBEVQorICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAdiBkYXRhCQlSZWNlaXZlZCBkYXRhCisgKiBAdiBsZW4JCUxlbmd0aCBvZiByZWNlaXZlZCBkYXRhCisgKiBAdiByZW1haW5pbmcJCURhdGEgcmVtYWluaW5nIGFmdGVyIHRoaXMgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfcnhfcjJ0ICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpLAorCQkJICBjb25zdCB2b2lkICpkYXRhIF9fdW51c2VkLCBzaXplX3QgbGVuIF9fdW51c2VkLAorCQkJICBzaXplX3QgcmVtYWluaW5nIF9fdW51c2VkICkgeworCXN0cnVjdCBpc2NzaV9iaHNfcjJ0ICpyMnQgPSAmaXNjc2ktPnJ4X2Jocy5yMnQ7CisKKwkvKiBSZWNvcmQgdHJhbnNmZXIgcGFyYW1ldGVycyBhbmQgdHJpZ2dlciBmaXJzdCBkYXRhLW91dCAqLworCWlzY3NpLT50dHQgPSBudG9obCAoIHIydC0+dHR0ICk7CisJaXNjc2ktPnRyYW5zZmVyX29mZnNldCA9IG50b2hsICggcjJ0LT5vZmZzZXQgKTsKKwlpc2NzaS0+dHJhbnNmZXJfbGVuID0gbnRvaGwgKCByMnQtPmxlbiApOworCWlzY3NpX3N0YXJ0X2RhdGFfb3V0ICggaXNjc2ksIDAgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEJ1aWxkIGlTQ1NJIGRhdGEtb3V0IEJIUworICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAdiBkYXRhc24JCURhdGEgc2VxdWVuY2UgbnVtYmVyIHdpdGhpbiB0aGUgdHJhbnNmZXIKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY3NpX3N0YXJ0X2RhdGFfb3V0ICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpLAorCQkJCSAgIHVuc2lnbmVkIGludCBkYXRhc24gKSB7CisJc3RydWN0IGlzY3NpX2Joc19kYXRhX291dCAqZGF0YV9vdXQgPSAmaXNjc2ktPnR4X2Jocy5kYXRhX291dDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJlbWFpbmluZzsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKworCS8qIFdlIGFsd2F5cyBzZW5kIDUxMi1ieXRlIERhdGEtT3V0IFBEVXM7IHRoaXMgcmVtb3ZlcyB0aGUKKwkgKiBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSB0YXJnZXQncyBNYXhSZWN2RGF0YVNlZ21lbnRMZW5ndGguCisJICovCisJb2Zmc2V0ID0gZGF0YXNuICogNTEyOworCXJlbWFpbmluZyA9IGlzY3NpLT50cmFuc2Zlcl9sZW4gLSBvZmZzZXQ7CisJbGVuID0gcmVtYWluaW5nOworCWlmICggbGVuID4gNTEyICkKKwkJbGVuID0gNTEyOworCisJLyogQ29uc3RydWN0IEJIUyBhbmQgaW5pdGlhdGUgdHJhbnNtaXNzaW9uICovCisJaXNjc2lfc3RhcnRfdHggKCBpc2NzaSApOworCWRhdGFfb3V0LT5vcGNvZGUgPSBJU0NTSV9PUENPREVfREFUQV9PVVQ7CisJaWYgKCBsZW4gPT0gcmVtYWluaW5nICkKKwkJZGF0YV9vdXQtPmZsYWdzID0gKCBJU0NTSV9GTEFHX0ZJTkFMICk7CisJSVNDU0lfU0VUX0xFTkdUSFMgKCBkYXRhX291dC0+bGVuZ3RocywgMCwgbGVuICk7CisJZGF0YV9vdXQtPmx1biA9IGlzY3NpLT5sdW47CisJZGF0YV9vdXQtPml0dCA9IGh0b25sICggaXNjc2ktPml0dCApOworCWRhdGFfb3V0LT50dHQgPSBodG9ubCAoIGlzY3NpLT50dHQgKTsKKwlkYXRhX291dC0+ZXhwc3RhdHNuID0gaHRvbmwgKCBpc2NzaS0+c3RhdHNuICsgMSApOworCWRhdGFfb3V0LT5kYXRhc24gPSBodG9ubCAoIGRhdGFzbiApOworCWRhdGFfb3V0LT5vZmZzZXQgPSBodG9ubCAoIGlzY3NpLT50cmFuc2Zlcl9vZmZzZXQgKyBvZmZzZXQgKTsKKwlEQkdDICggaXNjc2ksICJpU0NTSSAlcCBzdGFydCBkYXRhIG91dCBEYXRhU04gJSN4IGxlbiAlI2x4XG4iLAorCSAgICAgICBpc2NzaSwgZGF0YXNuLCBsZW4gKTsKK30KKworLyoqCisgKiBDb21wbGV0ZSBpU0NTSSBkYXRhLW91dCBQRFUgdHJhbnNtaXNzaW9uCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY3NpX2RhdGFfb3V0X2RvbmUgKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2kgKSB7CisJc3RydWN0IGlzY3NpX2Joc19kYXRhX291dCAqZGF0YV9vdXQgPSAmaXNjc2ktPnR4X2Jocy5kYXRhX291dDsKKworCS8qIElmIHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSwgc3RhcnQKKwkgKiBzZW5kaW5nIHRoZSBuZXh0IGRhdGEtb3V0IFBEVS4KKwkgKi8KKwlpZiAoICEgKCBkYXRhX291dC0+ZmxhZ3MgJiBJU0NTSV9GTEFHX0ZJTkFMICkgKQorCQlpc2NzaV9zdGFydF9kYXRhX291dCAoIGlzY3NpLCBudG9obCAoIGRhdGFfb3V0LT5kYXRhc24gKSArIDEgKTsKK30KKworLyoqCisgKiBTZW5kIGlTQ1NJIGRhdGEtb3V0IGRhdGEgc2VnbWVudAorICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpc2NzaV90eF9kYXRhX291dCAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSApIHsKKwlzdHJ1Y3QgaXNjc2lfYmhzX2RhdGFfb3V0ICpkYXRhX291dCA9ICZpc2NzaS0+dHhfYmhzLmRhdGFfb3V0OworCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXNpemVfdCBsZW47CisKKwlvZmZzZXQgPSBudG9obCAoIGRhdGFfb3V0LT5vZmZzZXQgKTsKKwlsZW4gPSBJU0NTSV9EQVRBX0xFTiAoIGRhdGFfb3V0LT5sZW5ndGhzICk7CisKKwlhc3NlcnQgKCBpc2NzaS0+Y29tbWFuZCAhPSBOVUxMICk7CisJYXNzZXJ0ICggaXNjc2ktPmNvbW1hbmQtPmRhdGFfb3V0ICk7CisJYXNzZXJ0ICggKCBvZmZzZXQgKyBsZW4gKSA8PSBpc2NzaS0+Y29tbWFuZC0+ZGF0YV9vdXRfbGVuICk7CisKKwlpb2J1ZiA9IHhmZXJfYWxsb2NfaW9iICggJmlzY3NpLT5zb2NrZXQsIGxlbiApOworCWlmICggISBpb2J1ZiApCisJCXJldHVybiAtRU5PTUVNOworCQorCWNvcHlfZnJvbV91c2VyICggaW9iX3B1dCAoIGlvYnVmLCBsZW4gKSwKKwkJCSBpc2NzaS0+Y29tbWFuZC0+ZGF0YV9vdXQsIG9mZnNldCwgbGVuICk7CisKKwlyZXR1cm4geGZlcl9kZWxpdmVyX2lvYiAoICZpc2NzaS0+c29ja2V0LCBpb2J1ZiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGlTQ1NJIGxvZ2luCisgKgorICovCisKKy8qKgorICogQnVpbGQgaVNDU0kgbG9naW4gcmVxdWVzdCBzdHJpbmdzCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqCisgKiBUaGVzZSBhcmUgdGhlIGluaXRpYWwgc2V0IG9mIHN0cmluZ3Mgc2VudCBpbiB0aGUgZmlyc3QgbG9naW4KKyAqIHJlcXVlc3QgUERVLiAgV2Ugd2FudCB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgorICoKKyAqICAgICBIZWFkZXJEaWdlc3Q9Tm9uZQorICogICAgIERhdGFEaWdlc3Q9Tm9uZQorICogICAgIE1heENvbm5lY3Rpb25zIGlzIGlycmVsZXZhbnQ7IHdlIG1ha2Ugb25seSBvbmUgY29ubmVjdGlvbiBhbnl3YXkKKyAqICAgICBJbml0aWFsUjJUPVllcyBbMV0KKyAqICAgICBJbW1lZGlhdGVEYXRhIGlzIGlycmVsZXZhbnQ7IHdlIG5ldmVyIHNlbmQgaW1tZWRpYXRlIGRhdGEKKyAqICAgICBNYXhSZWN2RGF0YVNlZ21lbnRMZW5ndGg9ODE5MiAoZGVmYXVsdDsgd2UgZG9uJ3QgY2FyZSkgWzNdCisgKiAgICAgTWF4QnVyc3RMZW5ndGg9MjYyMTQ0IChkZWZhdWx0OyB3ZSBkb24ndCBjYXJlKSBbM10KKyAqICAgICBGaXJzdEJ1cnN0TGVuZ3RoPTI2MjE0NCAoZGVmYXVsdDsgd2UgZG9uJ3QgY2FyZSkKKyAqICAgICBEZWZhdWx0VGltZTJXYWl0PTAgWzJdCisgKiAgICAgRGVmYXVsdFRpbWUyUmV0YWluPTAgWzJdCisgKiAgICAgTWF4T3V0c3RhbmRpbmdSMlQ9MQorICogICAgIERhdGFQRFVJbk9yZGVyPVllcworICogICAgIERhdGFTZXF1ZW5jZUluT3JkZXI9WWVzCisgKiAgICAgRXJyb3JSZWNvdmVyeUxldmVsPTAKKyAqCisgKiBbMV0gSW5pdGlhbFIyVCBoYXMgYW4gT1IgcmVzb2x1dGlvbiBmdW5jdGlvbiwgc28gdGhlIHRhcmdldCBtYXkKKyAqIGZvcmNlIHVzIHRvIHVzZSBpdC4gIFdlIHRoZXJlZm9yZSBzaW1wbGlmeSBvdXIgbG9naWMgYnkgYWx3YXlzCisgKiB1c2luZyBpdC4KKyAqCisgKiBbMl0gVGhlc2UgZW5zdXJlIHRoYXQgd2UgY2FuIHNhZmVseSBzdGFydCBhIG5ldyB0YXNrIG9uY2Ugd2UgaGF2ZQorICogcmVjb25uZWN0ZWQgYWZ0ZXIgYSBmYWlsdXJlLCB3aXRob3V0IGhhdmluZyB0byBtYW51YWxseSB0aWR5IHVwCisgKiBhZnRlciB0aGUgb2xkIG9uZS4KKyAqCisgKiBbM10gV2UgYXJlIHF1aXRlIGhhcHB5IHRvIHVzZSB0aGUgUkZDLWRlZmluZWQgZGVmYXVsdCB2YWx1ZXMgZm9yCisgKiB0aGVzZSBwYXJhbWV0ZXJzLCBidXQgc29tZSB0YXJnZXRzIChub3RhYmx5IE9wZW5Tb2xhcmlzKQorICogaW5jb3JyZWN0bHkgYXNzdW1lIGEgZGVmYXVsdCB2YWx1ZSBvZiB6ZXJvLCBzbyB3ZSBleHBsaWNpdGx5CisgKiBzcGVjaWZ5IHRoZSBkZWZhdWx0IHZhbHVlcy4KKyAqLworc3RhdGljIGludCBpc2NzaV9idWlsZF9sb2dpbl9yZXF1ZXN0X3N0cmluZ3MgKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2ksCisJCQkJCSAgICAgICB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXVuc2lnbmVkIGludCB1c2VkID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICphdXRoX21ldGhvZDsKKworCWlmICggaXNjc2ktPnN0YXR1cyAmIElTQ1NJX1NUQVRVU19TVFJJTkdTX1NFQ1VSSVRZICkgeworCQkvKiBEZWZhdWx0IHRvIGFsbG93aW5nIG5vIGF1dGhlbnRpY2F0aW9uICovCisJCWF1dGhfbWV0aG9kID0gIk5vbmUiOworCQkvKiBJZiB3ZSBoYXZlIGEgY3JlZGVudGlhbCB0byBzdXBwbHksIHBlcm1pdCBDSEFQICovCisJCWlmICggaXNjc2ktPmluaXRpYXRvcl91c2VybmFtZSApCisJCQlhdXRoX21ldGhvZCA9ICJDSEFQLE5vbmUiOworCQkvKiBJZiB3ZSBoYXZlIGEgY3JlZGVudGlhbCB0byBjaGVjaywgZm9yY2UgQ0hBUCAqLworCQlpZiAoIGlzY3NpLT50YXJnZXRfdXNlcm5hbWUgKQorCQkJYXV0aF9tZXRob2QgPSAiQ0hBUCI7CisJCXVzZWQgKz0gc3NucHJpbnRmICggZGF0YSArIHVzZWQsIGxlbiAtIHVzZWQsCisJCQkJICAgICJJbml0aWF0b3JOYW1lPSVzJWMiCisJCQkJICAgICJUYXJnZXROYW1lPSVzJWMiCisJCQkJICAgICJTZXNzaW9uVHlwZT1Ob3JtYWwlYyIKKwkJCQkgICAgIkF1dGhNZXRob2Q9JXMlYyIsCisJCQkJICAgIGlzY3NpX2luaXRpYXRvcl9pcW4oKSwgMCwKKwkJCQkgICAgaXNjc2ktPnRhcmdldF9pcW4sIDAsIDAsCisJCQkJICAgIGF1dGhfbWV0aG9kLCAwICk7CisJfQorCisJaWYgKCBpc2NzaS0+c3RhdHVzICYgSVNDU0lfU1RBVFVTX1NUUklOR1NfQ0hBUF9BTEdPUklUSE0gKSB7CisJCXVzZWQgKz0gc3NucHJpbnRmICggZGF0YSArIHVzZWQsIGxlbiAtIHVzZWQsICJDSEFQX0E9NSVjIiwgMCApOworCX0KKwkKKwlpZiAoICggaXNjc2ktPnN0YXR1cyAmIElTQ1NJX1NUQVRVU19TVFJJTkdTX0NIQVBfUkVTUE9OU0UgKSApIHsKKwkJYXNzZXJ0ICggaXNjc2ktPmluaXRpYXRvcl91c2VybmFtZSAhPSBOVUxMICk7CisJCXVzZWQgKz0gc3NucHJpbnRmICggZGF0YSArIHVzZWQsIGxlbiAtIHVzZWQsCisJCQkJICAgICJDSEFQX049JXMlY0NIQVBfUj0weCIsCisJCQkJICAgIGlzY3NpLT5pbml0aWF0b3JfdXNlcm5hbWUsIDAgKTsKKwkJZm9yICggaSA9IDAgOyBpIDwgaXNjc2ktPmNoYXAucmVzcG9uc2VfbGVuIDsgaSsrICkgeworCQkJdXNlZCArPSBzc25wcmludGYgKCBkYXRhICsgdXNlZCwgbGVuIC0gdXNlZCwgIiUwMngiLAorCQkJCQkgICAgaXNjc2ktPmNoYXAucmVzcG9uc2VbaV0gKTsKKwkJfQorCQl1c2VkICs9IHNzbnByaW50ZiAoIGRhdGEgKyB1c2VkLCBsZW4gLSB1c2VkLCAiJWMiLCAwICk7CisJfQorCisJaWYgKCAoIGlzY3NpLT5zdGF0dXMgJiBJU0NTSV9TVEFUVVNfU1RSSU5HU19DSEFQX0NIQUxMRU5HRSApICkgeworCQl1c2VkICs9IHNzbnByaW50ZiAoIGRhdGEgKyB1c2VkLCBsZW4gLSB1c2VkLAorCQkJCSAgICAiQ0hBUF9JPSVkJWNDSEFQX0M9MHgiLAorCQkJCSAgICBpc2NzaS0+Y2hhcF9jaGFsbGVuZ2VbMF0sIDAgKTsKKwkJZm9yICggaSA9IDEgOyBpIDwgc2l6ZW9mICggaXNjc2ktPmNoYXBfY2hhbGxlbmdlICkgOyBpKysgKSB7CisJCQl1c2VkICs9IHNzbnByaW50ZiAoIGRhdGEgKyB1c2VkLCBsZW4gLSB1c2VkLCAiJTAyeCIsCisJCQkJCSAgICBpc2NzaS0+Y2hhcF9jaGFsbGVuZ2VbaV0gKTsKKwkJfQorCQl1c2VkICs9IHNzbnByaW50ZiAoIGRhdGEgKyB1c2VkLCBsZW4gLSB1c2VkLCAiJWMiLCAwICk7CisJfQorCisJaWYgKCBpc2NzaS0+c3RhdHVzICYgSVNDU0lfU1RBVFVTX1NUUklOR1NfT1BFUkFUSU9OQUwgKSB7CisJCXVzZWQgKz0gc3NucHJpbnRmICggZGF0YSArIHVzZWQsIGxlbiAtIHVzZWQsCisJCQkJICAgICJIZWFkZXJEaWdlc3Q9Tm9uZSVjIgorCQkJCSAgICAiRGF0YURpZ2VzdD1Ob25lJWMiCisJCQkJICAgICJJbml0aWFsUjJUPVllcyVjIgorCQkJCSAgICAiTWF4UmVjdkRhdGFTZWdtZW50TGVuZ3RoPTgxOTIlYyIKKwkJCQkgICAgIk1heEJ1cnN0TGVuZ3RoPTI2MjE0NCVjIgorCQkJCSAgICAiRGVmYXVsdFRpbWUyV2FpdD0wJWMiCisJCQkJICAgICJEZWZhdWx0VGltZTJSZXRhaW49MCVjIgorCQkJCSAgICAiTWF4T3V0c3RhbmRpbmdSMlQ9MSVjIgorCQkJCSAgICAiRGF0YVBEVUluT3JkZXI9WWVzJWMiCisJCQkJICAgICJEYXRhU2VxdWVuY2VJbk9yZGVyPVllcyVjIgorCQkJCSAgICAiRXJyb3JSZWNvdmVyeUxldmVsPTAlYyIsCisJCQkJICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgKTsKKwl9CisKKwlyZXR1cm4gdXNlZDsKK30KKworLyoqCisgKiBCdWlsZCBpU0NTSSBsb2dpbiByZXF1ZXN0IEJIUworICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKi8KK3N0YXRpYyB2b2lkIGlzY3NpX3N0YXJ0X2xvZ2luICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpICkgeworCXN0cnVjdCBpc2NzaV9iaHNfbG9naW5fcmVxdWVzdCAqcmVxdWVzdCA9ICZpc2NzaS0+dHhfYmhzLmxvZ2luX3JlcXVlc3Q7CisJaW50IGxlbjsKKworCS8qIENvbnN0cnVjdCBCSFMgYW5kIGluaXRpYXRlIHRyYW5zbWlzc2lvbiAqLworCWlzY3NpX3N0YXJ0X3R4ICggaXNjc2kgKTsKKwlyZXF1ZXN0LT5vcGNvZGUgPSAoIElTQ1NJX09QQ09ERV9MT0dJTl9SRVFVRVNUIHwKKwkJCSAgICBJU0NTSV9GTEFHX0lNTUVESUFURSApOworCXJlcXVlc3QtPmZsYWdzID0gKCAoIGlzY3NpLT5zdGF0dXMgJiBJU0NTSV9TVEFUVVNfUEhBU0VfTUFTSyApIHwKKwkJCSAgIElTQ1NJX0xPR0lOX0ZMQUdfVFJBTlNJVElPTiApOworCS8qIHZlcnNpb25fbWF4IGFuZCB2ZXJzaW9uX21pbiBsZWZ0IGFzIHplcm8gKi8KKwlsZW4gPSBpc2NzaV9idWlsZF9sb2dpbl9yZXF1ZXN0X3N0cmluZ3MgKCBpc2NzaSwgTlVMTCwgMCApOworCUlTQ1NJX1NFVF9MRU5HVEhTICggcmVxdWVzdC0+bGVuZ3RocywgMCwgbGVuICk7CisJcmVxdWVzdC0+aXNpZF9pYW5hX2VuID0gaHRvbmwgKCBJU0NTSV9JU0lEX0lBTkEgfAorCQkJCQlJQU5BX0VOX0ZFTl9TWVNURU1TICk7CisJLyogaXNpZF9pYW5hX3F1YWwgbGVmdCBhcyB6ZXJvICovCisJcmVxdWVzdC0+dHNpaCA9IGh0b25zICggaXNjc2ktPnRzaWggKTsKKwlyZXF1ZXN0LT5pdHQgPSBodG9ubCAoIGlzY3NpLT5pdHQgKTsKKwkvKiBjaWQgbGVmdCBhcyB6ZXJvICovCisJcmVxdWVzdC0+Y21kc24gPSBodG9ubCAoIGlzY3NpLT5jbWRzbiApOworCXJlcXVlc3QtPmV4cHN0YXRzbiA9IGh0b25sICggaXNjc2ktPnN0YXRzbiArIDEgKTsKK30KKworLyoqCisgKiBDb21wbGV0ZSBpU0NTSSBsb2dpbiByZXF1ZXN0IFBEVSB0cmFuc21pc3Npb24KKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjc2lfbG9naW5fcmVxdWVzdF9kb25lICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpICkgeworCisJLyogQ2xlYXIgYW55ICJzdHJpbmdzIHRvIHNlbmQiIGZsYWdzICovCisJaXNjc2ktPnN0YXR1cyAmPSB+SVNDU0lfU1RBVFVTX1NUUklOR1NfTUFTSzsKKworCS8qIEZyZWUgYW55IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdG9yYWdlIHVzZWQgZm9yIGxvZ2luICovCisJY2hhcF9maW5pc2ggKCAmaXNjc2ktPmNoYXAgKTsKK30KKworLyoqCisgKiBUcmFuc21pdCBkYXRhIHNlZ21lbnQgb2YgYW4gaVNDU0kgbG9naW4gcmVxdWVzdCBQRFUKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogRm9yIGxvZ2luIHJlcXVlc3RzLCB0aGUgZGF0YSBzZWdtZW50IGNvbnNpc3RzIG9mIHRoZSBsb2dpbiBzdHJpbmdzLgorICovCitzdGF0aWMgaW50IGlzY3NpX3R4X2xvZ2luX3JlcXVlc3QgKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2kgKSB7CisJc3RydWN0IGlzY3NpX2Joc19sb2dpbl9yZXF1ZXN0ICpyZXF1ZXN0ID0gJmlzY3NpLT50eF9iaHMubG9naW5fcmVxdWVzdDsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwlzaXplX3QgbGVuOworCisJbGVuID0gSVNDU0lfREFUQV9MRU4gKCByZXF1ZXN0LT5sZW5ndGhzICk7CisJaW9idWYgPSB4ZmVyX2FsbG9jX2lvYiAoICZpc2NzaS0+c29ja2V0LCBsZW4gKTsKKwlpZiAoICEgaW9idWYgKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpb2JfcHV0ICggaW9idWYsIGxlbiApOworCWlzY3NpX2J1aWxkX2xvZ2luX3JlcXVlc3Rfc3RyaW5ncyAoIGlzY3NpLCBpb2J1Zi0+ZGF0YSwgbGVuICk7CisJcmV0dXJuIHhmZXJfZGVsaXZlcl9pb2IgKCAmaXNjc2ktPnNvY2tldCwgaW9idWYgKTsKK30KKworLyoqCisgKiBIYW5kbGUgaVNDU0kgVGFyZ2V0QWRkcmVzcyB0ZXh0IHZhbHVlCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqIEB2IHZhbHVlCQlUYXJnZXRBZGRyZXNzIHZhbHVlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpc2NzaV9oYW5kbGVfdGFyZ2V0YWRkcmVzc192YWx1ZSAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqdmFsdWUgKSB7CisJY2hhciAqc2VwYXJhdG9yOworCisJREJHQyAoIGlzY3NpLCAiaVNDU0kgJXAgd2lsbCByZWRpcmVjdCB0byAlc1xuIiwgaXNjc2ksIHZhbHVlICk7CisKKwkvKiBSZXBsYWNlIHRhcmdldCBhZGRyZXNzICovCisJZnJlZSAoIGlzY3NpLT50YXJnZXRfYWRkcmVzcyApOworCWlzY3NpLT50YXJnZXRfYWRkcmVzcyA9IHN0cmR1cCAoIHZhbHVlICk7CisJaWYgKCAhIGlzY3NpLT50YXJnZXRfYWRkcmVzcyApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUmVwbGFjZSB0YXJnZXQgcG9ydCAqLworCWlzY3NpLT50YXJnZXRfcG9ydCA9IGh0b25zICggSVNDU0lfUE9SVCApOworCXNlcGFyYXRvciA9IHN0cmNociAoIGlzY3NpLT50YXJnZXRfYWRkcmVzcywgJzonICk7CisJaWYgKCBzZXBhcmF0b3IgKSB7CisJCSpzZXBhcmF0b3IgPSAnXDAnOworCQlpc2NzaS0+dGFyZ2V0X3BvcnQgPSBzdHJ0b3VsICggKCBzZXBhcmF0b3IgKyAxICksIE5VTEwsIDAgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgaVNDU0kgQXV0aE1ldGhvZCB0ZXh0IHZhbHVlCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqIEB2IHZhbHVlCQlBdXRoTWV0aG9kIHZhbHVlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpc2NzaV9oYW5kbGVfYXV0aG1ldGhvZF92YWx1ZSAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwKKwkJCQkJICAgY29uc3QgY2hhciAqdmFsdWUgKSB7CisKKwkvKiBJZiBzZXJ2ZXIgcmVxdWVzdHMgQ0hBUCwgc2VuZCB0aGUgQ0hBUF9BIHN0cmluZyAqLworCWlmICggc3RyY21wICggdmFsdWUsICJDSEFQIiApID09IDAgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIGluaXRpYXRpbmcgQ0hBUCBhdXRoZW50aWNhdGlvblxuIiwKKwkJICAgICAgIGlzY3NpICk7CisJCWlzY3NpLT5zdGF0dXMgfD0gKCBJU0NTSV9TVEFUVVNfU1RSSU5HU19DSEFQX0FMR09SSVRITSB8CisJCQkJICAgSVNDU0lfU1RBVFVTX0FVVEhfRk9SV0FSRF9SRVFVSVJFRCApOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEhhbmRsZSBpU0NTSSBDSEFQX0EgdGV4dCB2YWx1ZQorICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAdiB2YWx1ZQkJQ0hBUF9BIHZhbHVlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpc2NzaV9oYW5kbGVfY2hhcF9hX3ZhbHVlICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpLAorCQkJCSAgICAgICBjb25zdCBjaGFyICp2YWx1ZSApIHsKKworCS8qIFdlIG9ubHkgZXZlciBvZmZlciAiNSIgKGkuZS4gTUQ1KSBhcyBhbiBhbGdvcml0aG0sIHNvIGlmCisJICogdGhlIHNlcnZlciByZXNwb25kcyB3aXRoIGFueXRoaW5nIGVsc2UgaXQgaXMgYSBwcm90b2NvbAorCSAqIHZpb2xhdGlvbi4KKwkgKi8KKwlpZiAoIHN0cmNtcCAoIHZhbHVlLCAiNSIgKSAhPSAwICkgeworCQlEQkdDICggaXNjc2ksICJpU0NTSSAlcCBnb3QgaW52YWxpZCBDSEFQIGFsZ29yaXRobSBcIiVzXCJcbiIsCisJCSAgICAgICBpc2NzaSwgdmFsdWUgKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFuZGxlIGlTQ1NJIENIQVBfSSB0ZXh0IHZhbHVlCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqIEB2IHZhbHVlCQlDSEFQX0kgdmFsdWUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlzY3NpX2hhbmRsZV9jaGFwX2lfdmFsdWUgKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2ksCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlICkgeworCXVuc2lnbmVkIGludCBpZGVudGlmaWVyOworCWNoYXIgKmVuZHA7CisJaW50IHJjOworCisJLyogVGhlIENIQVAgaWRlbnRpZmllciBpcyBhbiBpbnRlZ2VyIHZhbHVlICovCisJaWRlbnRpZmllciA9IHN0cnRvdWwgKCB2YWx1ZSwgJmVuZHAsIDAgKTsKKwlpZiAoICplbmRwICE9ICdcMCcgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIHNhdyBpbnZhbGlkIENIQVAgaWRlbnRpZmllciBcIiVzXCJcbiIsCisJCSAgICAgICBpc2NzaSwgdmFsdWUgKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJLyogUHJlcGFyZSBmb3IgQ0hBUCB3aXRoIE1ENSAqLworCWNoYXBfZmluaXNoICggJmlzY3NpLT5jaGFwICk7CisJaWYgKCAoIHJjID0gY2hhcF9pbml0ICggJmlzY3NpLT5jaGFwLCAmbWQ1X2FsZ29yaXRobSApICkgIT0gMCApIHsKKwkJREJHQyAoIGlzY3NpLCAiaVNDU0kgJXAgY291bGQgbm90IGluaXRpYWxpc2UgQ0hBUDogJXNcbiIsCisJCSAgICAgICBpc2NzaSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBJZGVudGlmaWVyIGFuZCBzZWNyZXQgYXJlIHRoZSBmaXJzdCB0d28gY29tcG9uZW50cyBvZiB0aGUKKwkgKiBjaGFsbGVuZ2UuCisJICovCisJY2hhcF9zZXRfaWRlbnRpZmllciAoICZpc2NzaS0+Y2hhcCwgaWRlbnRpZmllciApOworCWlmICggaXNjc2ktPmluaXRpYXRvcl9wYXNzd29yZCApIHsKKwkJY2hhcF91cGRhdGUgKCAmaXNjc2ktPmNoYXAsIGlzY3NpLT5pbml0aWF0b3JfcGFzc3dvcmQsCisJCQkgICAgICBzdHJsZW4gKCBpc2NzaS0+aW5pdGlhdG9yX3Bhc3N3b3JkICkgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgaVNDU0kgQ0hBUF9DIHRleHQgdmFsdWUKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHYgdmFsdWUJCUNIQVBfQyB2YWx1ZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfaGFuZGxlX2NoYXBfY192YWx1ZSAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqdmFsdWUgKSB7CisJY2hhciBidWZbM107CisJY2hhciAqZW5kcDsKKwl1aW50OF90IGJ5dGU7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBDaGVjayBhbmQgc3RyaXAgbGVhZGluZyAiMHgiICovCisJaWYgKCAoIHZhbHVlWzBdICE9ICcwJyApIHx8ICggdmFsdWVbMV0gIT0gJ3gnICkgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIHNhdyBpbnZhbGlkIENIQVAgY2hhbGxlbmdlIFwiJXNcIlxuIiwKKwkJICAgICAgIGlzY3NpLCB2YWx1ZSApOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisJdmFsdWUgKz0gMjsKKworCS8qIFByb2Nlc3MgY2hhbGxlbmdlIGFuIG9jdGV0IGF0IGEgdGltZSAqLworCWZvciAoIDsgKCB2YWx1ZVswXSAmJiB2YWx1ZVsxXSApIDsgdmFsdWUgKz0gMiApIHsKKwkJbWVtY3B5ICggYnVmLCB2YWx1ZSwgMiApOworCQlidWZbMl0gPSAwOworCQlieXRlID0gc3RydG91bCAoIGJ1ZiwgJmVuZHAsIDE2ICk7CisJCWlmICggKmVuZHAgIT0gJ1wwJyApIHsKKwkJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIHNhdyBpbnZhbGlkIENIQVAgY2hhbGxlbmdlICIKKwkJCSAgICAgICAiYnl0ZSBcIiVzXCJcbiIsIGlzY3NpLCBidWYgKTsKKwkJCXJldHVybiAtRVBST1RPOworCQl9CisJCWNoYXBfdXBkYXRlICggJmlzY3NpLT5jaGFwLCAmYnl0ZSwgc2l6ZW9mICggYnl0ZSApICk7CisJfQorCisJLyogQnVpbGQgQ0hBUCByZXNwb25zZSAqLworCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIHNlbmRpbmcgQ0hBUCByZXNwb25zZVxuIiwgaXNjc2kgKTsKKwljaGFwX3Jlc3BvbmQgKCAmaXNjc2ktPmNoYXAgKTsKKwlpc2NzaS0+c3RhdHVzIHw9IElTQ1NJX1NUQVRVU19TVFJJTkdTX0NIQVBfUkVTUE9OU0U7CisKKwkvKiBTZW5kIENIQVAgY2hhbGxlbmdlLCBpZiBhcHBsaWNhYmxlICovCisJaWYgKCBpc2NzaS0+dGFyZ2V0X3VzZXJuYW1lICkgeworCQlpc2NzaS0+c3RhdHVzIHw9IElTQ1NJX1NUQVRVU19TVFJJTkdTX0NIQVBfQ0hBTExFTkdFOworCQkvKiBHZW5lcmF0ZSBDSEFQIGNoYWxsZW5nZSBkYXRhICovCisJCWZvciAoIGkgPSAwIDsgaSA8IHNpemVvZiAoIGlzY3NpLT5jaGFwX2NoYWxsZW5nZSApIDsgaSsrICkgeworCQkJaXNjc2ktPmNoYXBfY2hhbGxlbmdlW2ldID0gcmFuZG9tKCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgaVNDU0kgQ0hBUF9OIHRleHQgdmFsdWUKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHYgdmFsdWUJCUNIQVBfTiB2YWx1ZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfaGFuZGxlX2NoYXBfbl92YWx1ZSAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqdmFsdWUgKSB7CisKKwkvKiBUaGUgdGFyZ2V0IHVzZXJuYW1lIGlzbid0IGFjdHVhbGx5IGludm9sdmVkIGF0IGFueSBwb2ludCBpbgorCSAqIHRoZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzOyBpdCBtZXJlbHkgc2VydmVzIHRvIGlkZW50aWZ5CisJICogd2hpY2ggcGFzc3dvcmQgdGhlIHRhcmdldCBpcyB1c2luZyB0byBnZW5lcmF0ZSB0aGUgQ0hBUAorCSAqIHJlc3BvbnNlLiAgV2UgdW5uZWNlc3NhcmlseSB2ZXJpZnkgdGhhdCB0aGUgdXNlcm5hbWUgaXMgYXMKKwkgKiBleHBlY3RlZCwgaW4gb3JkZXIgdG8gcHJvdmlkZSBtaWxkbHkgaGVscGZ1bCBkaWFnbm9zdGljcyBpZgorCSAqIHRoZSB0YXJnZXQgaXMgc3VwcGx5aW5nIHRoZSB3cm9uZyB1c2VybmFtZS9wYXNzd29yZAorCSAqIGNvbWJpbmF0aW9uLgorCSAqLworCWlmICggaXNjc2ktPnRhcmdldF91c2VybmFtZSAmJgorCSAgICAgKCBzdHJjbXAgKCBpc2NzaS0+dGFyZ2V0X3VzZXJuYW1lLCB2YWx1ZSApICE9IDAgKSApIHsKKwkJREJHQyAoIGlzY3NpLCAiaVNDU0kgJXAgdGFyZ2V0IHVzZXJuYW1lIFwiJXNcIiBpbmNvcnJlY3QgIgorCQkgICAgICAgIih3YW50ZWQgXCIlc1wiKVxuIiwKKwkJICAgICAgIGlzY3NpLCB2YWx1ZSwgaXNjc2ktPnRhcmdldF91c2VybmFtZSApOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgaVNDU0kgQ0hBUF9SIHRleHQgdmFsdWUKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHYgdmFsdWUJCUNIQVBfUiB2YWx1ZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfaGFuZGxlX2NoYXBfcl92YWx1ZSAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqdmFsdWUgKSB7CisJY2hhciBidWZbM107CisJY2hhciAqZW5kcDsKKwl1aW50OF90IGJ5dGU7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjOworCisJLyogR2VuZXJhdGUgQ0hBUCByZXNwb25zZSBmb3IgdmVyaWZpY2F0aW9uICovCisJY2hhcF9maW5pc2ggKCAmaXNjc2ktPmNoYXAgKTsKKwlpZiAoICggcmMgPSBjaGFwX2luaXQgKCAmaXNjc2ktPmNoYXAsICZtZDVfYWxnb3JpdGhtICkgKSAhPSAwICkgeworCQlEQkdDICggaXNjc2ksICJpU0NTSSAlcCBjb3VsZCBub3QgaW5pdGlhbGlzZSBDSEFQOiAlc1xuIiwKKwkJICAgICAgIGlzY3NpLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKwljaGFwX3NldF9pZGVudGlmaWVyICggJmlzY3NpLT5jaGFwLCBpc2NzaS0+Y2hhcF9jaGFsbGVuZ2VbMF0gKTsKKwlpZiAoIGlzY3NpLT50YXJnZXRfcGFzc3dvcmQgKSB7CisJCWNoYXBfdXBkYXRlICggJmlzY3NpLT5jaGFwLCBpc2NzaS0+dGFyZ2V0X3Bhc3N3b3JkLAorCQkJICAgICAgc3RybGVuICggaXNjc2ktPnRhcmdldF9wYXNzd29yZCApICk7CisJfQorCWNoYXBfdXBkYXRlICggJmlzY3NpLT5jaGFwLCAmaXNjc2ktPmNoYXBfY2hhbGxlbmdlWzFdLAorCQkgICAgICAoIHNpemVvZiAoIGlzY3NpLT5jaGFwX2NoYWxsZW5nZSApIC0gMSApICk7CisJY2hhcF9yZXNwb25kICggJmlzY3NpLT5jaGFwICk7CisKKwkvKiBDaGVjayBhbmQgc3RyaXAgbGVhZGluZyAiMHgiICovCisJaWYgKCAoIHZhbHVlWzBdICE9ICcwJyApIHx8ICggdmFsdWVbMV0gIT0gJ3gnICkgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIHNhdyBpbnZhbGlkIENIQVAgcmVzcG9uc2UgXCIlc1wiXG4iLAorCQkgICAgICAgaXNjc2ksIHZhbHVlICk7CisJCXJldHVybiAtRVBST1RPOworCX0KKwl2YWx1ZSArPSAyOworCisJLyogQ2hlY2sgQ0hBUCByZXNwb25zZSBsZW5ndGggKi8KKwlpZiAoIHN0cmxlbiAoIHZhbHVlICkgIT0gKCAyICogaXNjc2ktPmNoYXAucmVzcG9uc2VfbGVuICkgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIGludmFsaWQgQ0hBUCByZXNwb25zZSBsZW5ndGhcbiIsCisJCSAgICAgICBpc2NzaSApOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwkvKiBQcm9jZXNzIHJlc3BvbnNlIGFuIG9jdGV0IGF0IGEgdGltZSAqLworCWZvciAoIGkgPSAwIDsgKCB2YWx1ZVswXSAmJiB2YWx1ZVsxXSApIDsgdmFsdWUgKz0gMiwgaSsrICkgeworCQltZW1jcHkgKCBidWYsIHZhbHVlLCAyICk7CisJCWJ1ZlsyXSA9IDA7CisJCWJ5dGUgPSBzdHJ0b3VsICggYnVmLCAmZW5kcCwgMTYgKTsKKwkJaWYgKCAqZW5kcCAhPSAnXDAnICkgeworCQkJREJHQyAoIGlzY3NpLCAiaVNDU0kgJXAgc2F3IGludmFsaWQgQ0hBUCByZXNwb25zZSAiCisJCQkgICAgICAgImJ5dGUgXCIlc1wiXG4iLCBpc2NzaSwgYnVmICk7CisJCQlyZXR1cm4gLUVQUk9UTzsKKwkJfQorCQlpZiAoIGJ5dGUgIT0gaXNjc2ktPmNoYXAucmVzcG9uc2VbaV0gKSB7CisJCQlEQkdDICggaXNjc2ksICJpU0NTSSAlcCBzYXcgaW5jb3JyZWN0IENIQVAgIgorCQkJICAgICAgICJyZXNwb25zZVxuIiwgaXNjc2kgKTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJfQorCWFzc2VydCAoIGkgPT0gaXNjc2ktPmNoYXAucmVzcG9uc2VfbGVuICk7CisKKwkvKiBNYXJrIHNlc3Npb24gYXMgYXV0aGVudGljYXRlZCAqLworCWlzY3NpLT5zdGF0dXMgfD0gSVNDU0lfU1RBVFVTX0FVVEhfUkVWRVJTRV9PSzsKKworCXJldHVybiAwOworfQorCisvKiogQW4gaVNDU0kgdGV4dCBzdHJpbmcgdGhhdCB3ZSB3YW50IHRvIGhhbmRsZSAqLworc3RydWN0IGlzY3NpX3N0cmluZ190eXBlIHsKKwkvKiogU3RyaW5nIGtleQorCSAqCisJICogVGhpcyBpcyB0aGUgcG9ydGlvbiB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSAiPSIgc2lnbiwKKwkgKiBlLmcuICJJbml0aWF0b3JOYW1lPSIsICJDSEFQX0E9IiwgZXRjLgorCSAqLworCWNvbnN0IGNoYXIgKmtleTsKKwkvKiogSGFuZGxlIGlTQ1NJIHN0cmluZyB2YWx1ZQorCSAqCisJICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKwkgKiBAdiB2YWx1ZQkJaVNDU0kgc3RyaW5nIHZhbHVlCisJICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBoYW5kbGUgKSAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwgY29uc3QgY2hhciAqdmFsdWUgKTsKK307CisKKy8qKiBpU0NTSSB0ZXh0IHN0cmluZ3MgdGhhdCB3ZSB3YW50IHRvIGhhbmRsZSAqLworc3RhdGljIHN0cnVjdCBpc2NzaV9zdHJpbmdfdHlwZSBpc2NzaV9zdHJpbmdfdHlwZXNbXSA9IHsKKwl7ICJUYXJnZXRBZGRyZXNzPSIsIGlzY3NpX2hhbmRsZV90YXJnZXRhZGRyZXNzX3ZhbHVlIH0sCisJeyAiQXV0aE1ldGhvZD0iLCBpc2NzaV9oYW5kbGVfYXV0aG1ldGhvZF92YWx1ZSB9LAorCXsgIkNIQVBfQT0iLCBpc2NzaV9oYW5kbGVfY2hhcF9hX3ZhbHVlIH0sCisJeyAiQ0hBUF9JPSIsIGlzY3NpX2hhbmRsZV9jaGFwX2lfdmFsdWUgfSwKKwl7ICJDSEFQX0M9IiwgaXNjc2lfaGFuZGxlX2NoYXBfY192YWx1ZSB9LAorCXsgIkNIQVBfTj0iLCBpc2NzaV9oYW5kbGVfY2hhcF9uX3ZhbHVlIH0sCisJeyAiQ0hBUF9SPSIsIGlzY3NpX2hhbmRsZV9jaGFwX3JfdmFsdWUgfSwKKwl7IE5VTEwsIE5VTEwgfQorfTsKKworLyoqCisgKiBIYW5kbGUgaVNDU0kgc3RyaW5nCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqIEB2IHN0cmluZwkJaVNDU0kgc3RyaW5nIChpbiAia2V5PXZhbHVlIiBmb3JtYXQpCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpc2NzaV9oYW5kbGVfc3RyaW5nICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpLAorCQkJCSBjb25zdCBjaGFyICpzdHJpbmcgKSB7CisJc3RydWN0IGlzY3NpX3N0cmluZ190eXBlICp0eXBlOworCXNpemVfdCBrZXlfbGVuOworCWludCByYzsKKworCWZvciAoIHR5cGUgPSBpc2NzaV9zdHJpbmdfdHlwZXMgOyB0eXBlLT5rZXkgOyB0eXBlKysgKSB7CisJCWtleV9sZW4gPSBzdHJsZW4gKCB0eXBlLT5rZXkgKTsKKwkJaWYgKCBzdHJuY21wICggc3RyaW5nLCB0eXBlLT5rZXksIGtleV9sZW4gKSAhPSAwICkKKwkJCWNvbnRpbnVlOworCQlEQkdDICggaXNjc2ksICJpU0NTSSAlcCBoYW5kbGluZyAlc1xuIiwgaXNjc2ksIHN0cmluZyApOworCQlpZiAoICggcmMgPSB0eXBlLT5oYW5kbGUgKCBpc2NzaSwKKwkJCQkJICAgKCBzdHJpbmcgKyBrZXlfbGVuICkgKSApICE9IDAgKSB7CisJCQlEQkdDICggaXNjc2ksICJpU0NTSSAlcCBjb3VsZCBub3QgaGFuZGxlICVzOiAlc1xuIiwKKwkJCSAgICAgICBpc2NzaSwgc3RyaW5nLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJREJHQyAoIGlzY3NpLCAiaVNDU0kgJXAgaWdub3JpbmcgJXNcbiIsIGlzY3NpLCBzdHJpbmcgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgaVNDU0kgc3RyaW5ncworICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAdiBzdHJpbmcJCWlTQ1NJIHN0cmluZyBidWZmZXIKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIHN0cmluZyBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlzY3NpX2hhbmRsZV9zdHJpbmdzICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpLAorCQkJCSAgY29uc3QgY2hhciAqc3RyaW5ncywgc2l6ZV90IGxlbiApIHsKKwlzaXplX3Qgc3RyaW5nX2xlbjsKKwlpbnQgcmM7CisKKwkvKiBIYW5kbGUgZWFjaCBzdHJpbmcgaW4gdHVybiwgdGFraW5nIGNhcmUgbm90IHRvIG92ZXJydW4gdGhlCisJICogZGF0YSBidWZmZXIgaW4gY2FzZSBvZiBiYWRseS10ZXJtaW5hdGVkIGRhdGEuCisJICovCisJd2hpbGUgKCAxICkgeworCQlzdHJpbmdfbGVuID0gKCBzdHJubGVuICggc3RyaW5ncywgbGVuICkgKyAxICk7CisJCWlmICggc3RyaW5nX2xlbiA+IGxlbiApCisJCQlicmVhazsKKwkJaWYgKCAoIHJjID0gaXNjc2lfaGFuZGxlX3N0cmluZyAoIGlzY3NpLCBzdHJpbmdzICkgKSAhPSAwICkKKwkJCXJldHVybiByYzsKKwkJc3RyaW5ncyArPSBzdHJpbmdfbGVuOworCQlsZW4gLT0gc3RyaW5nX2xlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVjZWl2ZSBQRFUgZGF0YSBpbnRvIGJ1ZmZlcgorICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAdiBkYXRhCQlEYXRhIHRvIHJlY2VpdmUKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiB0aGUgUlggUERVIHR5cGUgaGFuZGxlciB3aXNoZXMgdG8gYnVmZmVyIHVwCisgKiBhbGwgcmVjZWl2ZWQgZGF0YSBhbmQgcHJvY2VzcyB0aGUgUERVIGFzIGEgc2luZ2xlIHVuaXQuICBUaGUgY2FsbGVyCisgKiBpcyByZXBzb25zaWJsZSBmb3IgY2FsbGluZyBpc2NzaV9yeF9idWZmZXJlZF9kYXRhX2RvbmUoKSBhZnRlcgorICogcHJvY2Vzc2luZyB0aGUgZGF0YS4KKyAqLworc3RhdGljIGludCBpc2NzaV9yeF9idWZmZXJlZF9kYXRhICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpLAorCQkJCSAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCisJLyogQWxsb2NhdGUgYnVmZmVyIG9uIGZpcnN0IGNhbGwgKi8KKwlpZiAoICEgaXNjc2ktPnJ4X2J1ZmZlciApIHsKKwkJaXNjc2ktPnJ4X2J1ZmZlciA9IG1hbGxvYyAoIGlzY3NpLT5yeF9sZW4gKTsKKwkJaWYgKCAhIGlzY3NpLT5yeF9idWZmZXIgKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogQ29weSBkYXRhIHRvIGJ1ZmZlciAqLworCWFzc2VydCAoICggaXNjc2ktPnJ4X29mZnNldCArIGxlbiApIDw9IGlzY3NpLT5yeF9sZW4gKTsKKwltZW1jcHkgKCAoIGlzY3NpLT5yeF9idWZmZXIgKyBpc2NzaS0+cnhfb2Zmc2V0ICksIGRhdGEsIGxlbiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ29udmVydCBpU0NTSSByZXNwb25zZSBzdGF0dXMgdG8gcmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogQHYgc3RhdHVzX2NsYXNzCWlTQ1NJIHN0YXR1cyBjbGFzcworICogQHYgc3RhdHVzX2RldGFpbAlpU0NTSSBzdGF0dXMgZGV0YWlsCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpc2NzaV9zdGF0dXNfdG9fcmMgKCB1bnNpZ25lZCBpbnQgc3RhdHVzX2NsYXNzLAorCQkJCXVuc2lnbmVkIGludCBzdGF0dXNfZGV0YWlsICkgeworCXN3aXRjaCAoIHN0YXR1c19jbGFzcyApIHsKKwljYXNlIElTQ1NJX1NUQVRVU19JTklUSUFUT1JfRVJST1IgOgorCQlzd2l0Y2ggKCBzdGF0dXNfZGV0YWlsICkgeworCQljYXNlIElTQ1NJX1NUQVRVU19JTklUSUFUT1JfRVJST1JfQVVUSEVOVElDQVRJT04gOgorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWNhc2UgSVNDU0lfU1RBVFVTX0lOSVRJQVRPUl9FUlJPUl9BVVRIT1JJU0FUSU9OIDoKKwkJCXJldHVybiAtRVBFUk07CisJCWNhc2UgSVNDU0lfU1RBVFVTX0lOSVRJQVRPUl9FUlJPUl9OT1RfRk9VTkQgOgorCQljYXNlIElTQ1NJX1NUQVRVU19JTklUSUFUT1JfRVJST1JfUkVNT1ZFRCA6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4gLUVOT1RTVVA7CisJCX0KKwljYXNlIElTQ1NJX1NUQVRVU19UQVJHRVRfRVJST1IgOgorCQlyZXR1cm4gLUVJTzsKKwlkZWZhdWx0IDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKioKKyAqIFJlY2VpdmUgZGF0YSBzZWdtZW50IG9mIGFuIGlTQ1NJIGxvZ2luIHJlc3BvbnNlIFBEVQorICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAdiBkYXRhCQlSZWNlaXZlZCBkYXRhCisgKiBAdiBsZW4JCUxlbmd0aCBvZiByZWNlaXZlZCBkYXRhCisgKiBAdiByZW1haW5pbmcJCURhdGEgcmVtYWluaW5nIGFmdGVyIHRoaXMgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfcnhfbG9naW5fcmVzcG9uc2UgKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2ksCisJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLAorCQkJCSAgICAgc2l6ZV90IHJlbWFpbmluZyApIHsKKwlzdHJ1Y3QgaXNjc2lfYmhzX2xvZ2luX3Jlc3BvbnNlICpyZXNwb25zZQorCQk9ICZpc2NzaS0+cnhfYmhzLmxvZ2luX3Jlc3BvbnNlOworCWludCByYzsKKworCS8qIEJ1ZmZlciB1cCB0aGUgUERVIGRhdGEgKi8KKwlpZiAoICggcmMgPSBpc2NzaV9yeF9idWZmZXJlZF9kYXRhICggaXNjc2ksIGRhdGEsIGxlbiApICkgIT0gMCApIHsKKwkJREJHQyAoIGlzY3NpLCAiaVNDU0kgJXAgY291bGQgbm90IGJ1ZmZlciBsb2dpbiByZXNwb25zZTogJXNcbiIsCisJCSAgICAgICBpc2NzaSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisJaWYgKCByZW1haW5pbmcgKQorCQlyZXR1cm4gMDsKKworCS8qIFByb2Nlc3Mgc3RyaW5nIGRhdGEgYW5kIGRpc2NhcmQgc3RyaW5nIGJ1ZmZlciAqLworCWlmICggKCByYyA9IGlzY3NpX2hhbmRsZV9zdHJpbmdzICggaXNjc2ksIGlzY3NpLT5yeF9idWZmZXIsCisJCQkJCSAgIGlzY3NpLT5yeF9sZW4gKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJaXNjc2lfcnhfYnVmZmVyZWRfZGF0YV9kb25lICggaXNjc2kgKTsKKworCS8qIENoZWNrIGZvciBsb2dpbiByZWRpcmVjdGlvbiAqLworCWlmICggcmVzcG9uc2UtPnN0YXR1c19jbGFzcyA9PSBJU0NTSV9TVEFUVVNfUkVESVJFQ1QgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIHJlZGlyZWN0aW5nIHRvIG5ldyBzZXJ2ZXJcbiIsIGlzY3NpICk7CisJCWlzY3NpX2Nsb3NlX2Nvbm5lY3Rpb24gKCBpc2NzaSwgMCApOworCQlpZiAoICggcmMgPSBpc2NzaV9vcGVuX2Nvbm5lY3Rpb24gKCBpc2NzaSApICkgIT0gMCApIHsKKwkJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIGNvdWxkIG5vdCByZWRpcmVjdDogJXNcbiAiLAorCQkJICAgICAgIGlzY3NpLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBmb3IgZmF0YWwgZXJyb3JzICovCisJaWYgKCByZXNwb25zZS0+c3RhdHVzX2NsYXNzICE9IDAgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJIGxvZ2luIGZhaWx1cmU6IGNsYXNzICUwMnggZGV0YWlsICUwMnhcbiIsCisJCSAgICAgICByZXNwb25zZS0+c3RhdHVzX2NsYXNzLCByZXNwb25zZS0+c3RhdHVzX2RldGFpbCApOworCQlyYyA9IGlzY3NpX3N0YXR1c190b19yYyAoIHJlc3BvbnNlLT5zdGF0dXNfY2xhc3MsCisJCQkJCSAgcmVzcG9uc2UtPnN0YXR1c19kZXRhaWwgKTsKKwkJaXNjc2ktPmluc3RhbnRfcmMgPSByYzsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEhhbmRsZSBsb2dpbiB0cmFuc2l0aW9ucyAqLworCWlmICggcmVzcG9uc2UtPmZsYWdzICYgSVNDU0lfTE9HSU5fRkxBR19UUkFOU0lUSU9OICkgeworCQlpc2NzaS0+c3RhdHVzICY9IH4oIElTQ1NJX1NUQVRVU19QSEFTRV9NQVNLIHwKKwkJCQkgICAgSVNDU0lfU1RBVFVTX1NUUklOR1NfTUFTSyApOworCQlzd2l0Y2ggKCByZXNwb25zZS0+ZmxhZ3MgJiBJU0NTSV9MT0dJTl9OU0dfTUFTSyApIHsKKwkJY2FzZSBJU0NTSV9MT0dJTl9OU0dfT1BFUkFUSU9OQUxfTkVHT1RJQVRJT046CisJCQlpc2NzaS0+c3RhdHVzIHw9CisJCQkJKCBJU0NTSV9TVEFUVVNfT1BFUkFUSU9OQUxfTkVHT1RJQVRJT05fUEhBU0UgfAorCQkJCSAgSVNDU0lfU1RBVFVTX1NUUklOR1NfT1BFUkFUSU9OQUwgKTsKKwkJCWJyZWFrOworCQljYXNlIElTQ1NJX0xPR0lOX05TR19GVUxMX0ZFQVRVUkVfUEhBU0U6CisJCQlpc2NzaS0+c3RhdHVzIHw9IElTQ1NJX1NUQVRVU19GVUxMX0ZFQVRVUkVfUEhBU0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIGdvdCBpbnZhbGlkIHJlc3BvbnNlIGZsYWdzICIKKwkJCSAgICAgICAiJTAyeFxuIiwgaXNjc2ksIHJlc3BvbnNlLT5mbGFncyApOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwkvKiBTZW5kIG5leHQgbG9naW4gcmVxdWVzdCBQRFUgaWYgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBmdWxsCisJICogZmVhdHVyZSBwaGFzZSB5ZXQuCisJICovCisJaWYgKCAoIGlzY3NpLT5zdGF0dXMgJiBJU0NTSV9TVEFUVVNfUEhBU0VfTUFTSyApICE9CisJICAgICBJU0NTSV9TVEFUVVNfRlVMTF9GRUFUVVJFX1BIQVNFICkgeworCQlpc2NzaV9zdGFydF9sb2dpbiAoIGlzY3NpICk7CisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIHRoYXQgdGFyZ2V0IGF1dGhlbnRpY2F0aW9uIHdhcyBzdWNjZXNzZnVsIChpZiByZXF1aXJlZCkgKi8KKwlpZiAoICggaXNjc2ktPnN0YXR1cyAmIElTQ1NJX1NUQVRVU19BVVRIX1JFVkVSU0VfUkVRVUlSRUQgKSAmJgorCSAgICAgISAoIGlzY3NpLT5zdGF0dXMgJiBJU0NTSV9TVEFUVVNfQVVUSF9SRVZFUlNFX09LICkgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIG5lZmFyaW91cyB0YXJnZXQgdHJpZWQgdG8gYnlwYXNzICIKKwkJICAgICAgICJhdXRoZW50aWNhdGlvblxuIiwgaXNjc2kgKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJLyogUmVzZXQgcmV0cnkgY291bnQgKi8KKwlpc2NzaS0+cmV0cnlfY291bnQgPSAwOworCisJLyogUmVjb3JkIFRTSUggZm9yIGZ1dHVyZSByZWZlcmVuY2UgKi8KKwlpc2NzaS0+dHNpaCA9IG50b2hsICggcmVzcG9uc2UtPnRzaWggKTsKKwkKKwkvKiBTZW5kIHRoZSBhY3R1YWwgU0NTSSBjb21tYW5kICovCisJaXNjc2lfc3RhcnRfY29tbWFuZCAoIGlzY3NpICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBpU0NTSSB0byBzb2NrZXQgaW50ZXJmYWNlCisgKgorICovCisKKy8qKgorICogU3RhcnQgdXAgYSBuZXcgVFggUERVCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqCisgKiBUaGlzIGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBzZW5kaW5nIGEgbmV3IFBEVS4gIE9ubHkgb25lIFBEVSBtYXkKKyAqIGJlIGluIHRyYW5zaXQgYXQgYW55IG9uZSB0aW1lLgorICovCitzdGF0aWMgdm9pZCBpc2NzaV9zdGFydF90eCAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSApIHsKKwlhc3NlcnQgKCBpc2NzaS0+dHhfc3RhdGUgPT0gSVNDU0lfVFhfSURMRSApOworCQorCS8qIEluaXRpYWxpc2UgVFggQkhTICovCisJbWVtc2V0ICggJmlzY3NpLT50eF9iaHMsIDAsIHNpemVvZiAoIGlzY3NpLT50eF9iaHMgKSApOworCisJLyogRmxhZyBUWCBlbmdpbmUgdG8gc3RhcnQgdHJhbnNtaXR0aW5nICovCisJaXNjc2ktPnR4X3N0YXRlID0gSVNDU0lfVFhfQkhTOworfQorCisvKioKKyAqIFRyYW5zbWl0IG5vdGhpbmcKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfdHhfbm90aGluZyAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSBfX3VudXNlZCApIHsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUcmFuc21pdCBiYXNpYyBoZWFkZXIgc2VnbWVudCBvZiBhbiBpU0NTSSBQRFUKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfdHhfYmhzICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpICkgeworCXJldHVybiB4ZmVyX2RlbGl2ZXJfcmF3ICggJmlzY3NpLT5zb2NrZXQsICAmaXNjc2ktPnR4X2JocywKKwkJCQkgIHNpemVvZiAoIGlzY3NpLT50eF9iaHMgKSApOworfQorCisvKioKKyAqIFRyYW5zbWl0IGRhdGEgc2VnbWVudCBvZiBhbiBpU0NTSSBQRFUKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKiAKKyAqIEhhbmRsZSB0cmFuc21pc3Npb24gb2YgcGFydCBvZiBhIFBEVSBkYXRhIHNlZ21lbnQuICBpc2NzaTo6dHhfYmhzCisgKiB3aWxsIGJlIHZhbGlkIHdoZW4gdGhpcyBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfdHhfZGF0YSAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSApIHsKKwlzdHJ1Y3QgaXNjc2lfYmhzX2NvbW1vbiAqY29tbW9uID0gJmlzY3NpLT50eF9iaHMuY29tbW9uOworCisJc3dpdGNoICggY29tbW9uLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSyApIHsKKwljYXNlIElTQ1NJX09QQ09ERV9EQVRBX09VVDoKKwkJcmV0dXJuIGlzY3NpX3R4X2RhdGFfb3V0ICggaXNjc2kgKTsKKwljYXNlIElTQ1NJX09QQ09ERV9MT0dJTl9SRVFVRVNUOgorCQlyZXR1cm4gaXNjc2lfdHhfbG9naW5fcmVxdWVzdCAoIGlzY3NpICk7CisJZGVmYXVsdDoKKwkJLyogTm90aGluZyB0byBzZW5kIGluIG90aGVyIHN0YXRlcyAqLworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKgorICogVHJhbnNtaXQgZGF0YSBwYWRkaW5nIG9mIGFuIGlTQ1NJIFBEVQorICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqIAorICogSGFuZGxlIHRyYW5zbWlzc2lvbiBvZiBhbnkgZGF0YSBwYWRkaW5nIGluIGEgUERVIGRhdGEgc2VnbWVudC4KKyAqIGlzY3NpOjp0eF9iaHMgd2lsbCBiZSB2YWxpZCB3aGVuIHRoaXMgaXMgY2FsbGVkLgorICovCitzdGF0aWMgaW50IGlzY3NpX3R4X2RhdGFfcGFkZGluZyAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSApIHsKKwlzdGF0aWMgY29uc3QgY2hhciBwYWRbXSA9IHsgJ1wwJywgJ1wwJywgJ1wwJyB9OworCXN0cnVjdCBpc2NzaV9iaHNfY29tbW9uICpjb21tb24gPSAmaXNjc2ktPnR4X2Jocy5jb21tb247CisJc2l6ZV90IHBhZF9sZW47CisJCisJcGFkX2xlbiA9IElTQ1NJX0RBVEFfUEFEX0xFTiAoIGNvbW1vbi0+bGVuZ3RocyApOworCWlmICggISBwYWRfbGVuICkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4geGZlcl9kZWxpdmVyX3JhdyAoICZpc2NzaS0+c29ja2V0LCBwYWQsIHBhZF9sZW4gKTsKK30KKworLyoqCisgKiBDb21wbGV0ZSBpU0NTSSBQRFUgdHJhbnNtaXNzaW9uCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqCisgKiBDYWxsZWQgd2hlbiBhIFBEVSBoYXMgYmVlbiBjb21wbGV0ZWx5IHRyYW5zbWl0dGVkIGFuZCB0aGUgVFggc3RhdGUKKyAqIG1hY2hpbmUgaXMgYWJvdXQgdG8gZW50ZXIgdGhlIGlkbGUgc3RhdGUuICBpc2NzaTo6dHhfYmhzIHdpbGwgYmUKKyAqIHZhbGlkIGZvciB0aGUganVzdC1jb21wbGV0ZWQgUERVIHdoZW4gdGhpcyBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGlzY3NpX3R4X2RvbmUgKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2kgKSB7CisJc3RydWN0IGlzY3NpX2Joc19jb21tb24gKmNvbW1vbiA9ICZpc2NzaS0+dHhfYmhzLmNvbW1vbjsKKworCXN3aXRjaCAoIGNvbW1vbi0+b3Bjb2RlICYgSVNDU0lfT1BDT0RFX01BU0sgKSB7CisJY2FzZSBJU0NTSV9PUENPREVfREFUQV9PVVQ6CisJCWlzY3NpX2RhdGFfb3V0X2RvbmUgKCBpc2NzaSApOworCWNhc2UgSVNDU0lfT1BDT0RFX0xPR0lOX1JFUVVFU1Q6CisJCWlzY3NpX2xvZ2luX3JlcXVlc3RfZG9uZSAoIGlzY3NpICk7CisJZGVmYXVsdDoKKwkJLyogTm8gYWN0aW9uICovCisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBUcmFuc21pdCBpU0NTSSBQRFUKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHYgYnVmCQlUZW1wb3JhcnkgZGF0YSBidWZmZXIKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIHRlbXBvcmFyeSBkYXRhIGJ1ZmZlcgorICogCisgKiBDb25zdHJ1Y3RzIGRhdGEgdG8gYmUgc2VudCBmb3IgdGhlIGN1cnJlbnQgVFggc3RhdGUKKyAqLworc3RhdGljIHZvaWQgaXNjc2lfdHhfc3RlcCAoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzICkgeworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSA9CisJCWNvbnRhaW5lcl9vZiAoIHByb2Nlc3MsIHN0cnVjdCBpc2NzaV9zZXNzaW9uLCBwcm9jZXNzICk7CisJc3RydWN0IGlzY3NpX2Joc19jb21tb24gKmNvbW1vbiA9ICZpc2NzaS0+dHhfYmhzLmNvbW1vbjsKKwlpbnQgKCAqIHR4ICkgKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2kgKTsKKwllbnVtIGlzY3NpX3R4X3N0YXRlIG5leHRfc3RhdGU7CisJc2l6ZV90IHR4X2xlbjsKKwlpbnQgcmM7CisKKwkvKiBTZWxlY3QgZnJhZ21lbnQgdG8gdHJhbnNtaXQgKi8KKwl3aGlsZSAoIDEgKSB7CisJCXN3aXRjaCAoIGlzY3NpLT50eF9zdGF0ZSApIHsKKwkJY2FzZSBJU0NTSV9UWF9JRExFOgorCQkJLyogU3RvcCBwcm9jZXNzaW5nICovCisJCQlyZXR1cm47CisJCWNhc2UgSVNDU0lfVFhfQkhTOgorCQkJdHggPSBpc2NzaV90eF9iaHM7CisJCQl0eF9sZW4gPSBzaXplb2YgKCBpc2NzaS0+dHhfYmhzICk7CisJCQluZXh0X3N0YXRlID0gSVNDU0lfVFhfQUhTOworCQkJYnJlYWs7CisJCWNhc2UgSVNDU0lfVFhfQUhTOgorCQkJdHggPSBpc2NzaV90eF9ub3RoaW5nOworCQkJdHhfbGVuID0gMDsKKwkJCW5leHRfc3RhdGUgPSBJU0NTSV9UWF9EQVRBOworCQkJYnJlYWs7CisJCWNhc2UgSVNDU0lfVFhfREFUQToKKwkJCXR4ID0gaXNjc2lfdHhfZGF0YTsKKwkJCXR4X2xlbiA9IElTQ1NJX0RBVEFfTEVOICggY29tbW9uLT5sZW5ndGhzICk7CisJCQluZXh0X3N0YXRlID0gSVNDU0lfVFhfREFUQV9QQURESU5HOworCQkJYnJlYWs7CisJCWNhc2UgSVNDU0lfVFhfREFUQV9QQURESU5HOgorCQkJdHggPSBpc2NzaV90eF9kYXRhX3BhZGRpbmc7CisJCQl0eF9sZW4gPSBJU0NTSV9EQVRBX1BBRF9MRU4gKCBjb21tb24tPmxlbmd0aHMgKTsKKwkJCW5leHRfc3RhdGUgPSBJU0NTSV9UWF9JRExFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhc3NlcnQgKCAwICk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBDaGVjayBmb3Igd2luZG93IGF2YWlsYWJpbGl0eSwgaWYgbmVlZGVkICovCisJCWlmICggdHhfbGVuICYmICggeGZlcl93aW5kb3cgKCAmaXNjc2ktPnNvY2tldCApID09IDAgKSApIHsKKwkJCS8qIENhbm5vdCB0cmFuc21pdCBhdCB0aGlzIHBvaW50OyBzdG9wIHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFRyYW5zbWl0IGRhdGEgKi8KKwkJaWYgKCAoIHJjID0gdHggKCBpc2NzaSApICkgIT0gMCApIHsKKwkJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIGNvdWxkIG5vdCB0cmFuc21pdDogJXNcbiIsCisJCQkgICAgICAgaXNjc2ksIHN0cmVycm9yICggcmMgKSApOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogTW92ZSB0byBuZXh0IHN0YXRlICovCisJCWlzY3NpLT50eF9zdGF0ZSA9IG5leHRfc3RhdGU7CisJCWlmICggbmV4dF9zdGF0ZSA9PSBJU0NTSV9UWF9JRExFICkKKwkJCWlzY3NpX3R4X2RvbmUgKCBpc2NzaSApOworCX0KK30KKworLyoqCisgKiBSZWNlaXZlIGJhc2ljIGhlYWRlciBzZWdtZW50IG9mIGFuIGlTQ1NJIFBEVQorICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAdiBkYXRhCQlSZWNlaXZlZCBkYXRhCisgKiBAdiBsZW4JCUxlbmd0aCBvZiByZWNlaXZlZCBkYXRhCisgKiBAdiByZW1haW5pbmcJCURhdGEgcmVtYWluaW5nIGFmdGVyIHRoaXMgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogVGhpcyBmaWxscyBpbiBpc2NzaTo6cnhfYmhzIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgQkhTIHBvcnRpb24gb2YKKyAqIHRoZSByZWNlaXZlZCBQRFUuCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfcnhfYmhzICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICBzaXplX3QgbGVuLCBzaXplX3QgcmVtYWluaW5nIF9fdW51c2VkICkgeworCW1lbWNweSAoICZpc2NzaS0+cnhfYmhzLmJ5dGVzW2lzY3NpLT5yeF9vZmZzZXRdLCBkYXRhLCBsZW4gKTsKKwlpZiAoICggaXNjc2ktPnJ4X29mZnNldCArIGxlbiApID49IHNpemVvZiAoIGlzY3NpLT5yeF9iaHMgKSApIHsKKwkJREJHQzIgKCBpc2NzaSwgImlTQ1NJICVwIHJlY2VpdmVkIFBEVSBvcGNvZGUgJSN4IGxlbiAlI3hcbiIsCisJCQlpc2NzaSwgaXNjc2ktPnJ4X2Jocy5jb21tb24ub3Bjb2RlLAorCQkJSVNDU0lfREFUQV9MRU4gKCBpc2NzaS0+cnhfYmhzLmNvbW1vbi5sZW5ndGhzICkgKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGlzY2FyZCBwb3J0aW9uIG9mIGFuIGlTQ1NJIFBEVS4KKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHYgZGF0YQkJUmVjZWl2ZWQgZGF0YQorICogQHYgbGVuCQlMZW5ndGggb2YgcmVjZWl2ZWQgZGF0YQorICogQHYgcmVtYWluaW5nCQlEYXRhIHJlbWFpbmluZyBhZnRlciB0aGlzIGRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFRoaXMgZGlzY2FyZHMgZGF0YSBmcm9tIGEgcG9ydGlvbiBvZiBhIHJlY2VpdmVkIFBEVS4KKyAqLworc3RhdGljIGludCBpc2NzaV9yeF9kaXNjYXJkICggc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpIF9fdW51c2VkLAorCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSBfX3VudXNlZCwgc2l6ZV90IGxlbiBfX3VudXNlZCwKKwkJCSAgICAgIHNpemVfdCByZW1haW5pbmcgX191bnVzZWQgKSB7CisJLyogRG8gbm90aGluZyAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlY2VpdmUgZGF0YSBzZWdtZW50IG9mIGFuIGlTQ1NJIFBEVQorICoKKyAqIEB2IGlzY3NpCQlpU0NTSSBzZXNzaW9uCisgKiBAdiBkYXRhCQlSZWNlaXZlZCBkYXRhCisgKiBAdiBsZW4JCUxlbmd0aCBvZiByZWNlaXZlZCBkYXRhCisgKiBAdiByZW1haW5pbmcJCURhdGEgcmVtYWluaW5nIGFmdGVyIHRoaXMgZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogSGFuZGxlIHByb2Nlc3Npbmcgb2YgcGFydCBvZiBhIFBEVSBkYXRhIHNlZ21lbnQuICBpc2NzaTo6cnhfYmhzCisgKiB3aWxsIGJlIHZhbGlkIHdoZW4gdGhpcyBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfcnhfZGF0YSAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgIHNpemVfdCBsZW4sIHNpemVfdCByZW1haW5pbmcgKSB7CisJc3RydWN0IGlzY3NpX2Joc19jb21tb25fcmVzcG9uc2UgKnJlc3BvbnNlCisJCT0gJmlzY3NpLT5yeF9iaHMuY29tbW9uX3Jlc3BvbnNlOworCisJLyogVXBkYXRlIGNtZHNuIGFuZCBzdGF0c24gKi8KKwlpc2NzaS0+Y21kc24gPSBudG9obCAoIHJlc3BvbnNlLT5leHBjbWRzbiApOworCWlzY3NpLT5zdGF0c24gPSBudG9obCAoIHJlc3BvbnNlLT5zdGF0c24gKTsKKworCXN3aXRjaCAoIHJlc3BvbnNlLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSyApIHsKKwljYXNlIElTQ1NJX09QQ09ERV9MT0dJTl9SRVNQT05TRToKKwkJcmV0dXJuIGlzY3NpX3J4X2xvZ2luX3Jlc3BvbnNlICggaXNjc2ksIGRhdGEsIGxlbiwgcmVtYWluaW5nICk7CisJY2FzZSBJU0NTSV9PUENPREVfU0NTSV9SRVNQT05TRToKKwkJcmV0dXJuIGlzY3NpX3J4X3Njc2lfcmVzcG9uc2UgKCBpc2NzaSwgZGF0YSwgbGVuLCByZW1haW5pbmcgKTsKKwljYXNlIElTQ1NJX09QQ09ERV9EQVRBX0lOOgorCQlyZXR1cm4gaXNjc2lfcnhfZGF0YV9pbiAoIGlzY3NpLCBkYXRhLCBsZW4sIHJlbWFpbmluZyApOworCWNhc2UgSVNDU0lfT1BDT0RFX1IyVDoKKwkJcmV0dXJuIGlzY3NpX3J4X3IydCAoIGlzY3NpLCBkYXRhLCBsZW4sIHJlbWFpbmluZyApOworCWRlZmF1bHQ6CisJCWlmICggcmVtYWluaW5nICkKKwkJCXJldHVybiAwOworCQlEQkdDICggaXNjc2ksICJpU0NTSSAlcCB1bmtub3duIG9wY29kZSAlMDJ4XG4iLCBpc2NzaSwKKwkJICAgICAgIHJlc3BvbnNlLT5vcGNvZGUgKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KK30KKworLyoqCisgKiBSZWNlaXZlIG5ldyBkYXRhCisgKgorICogQHYgc29ja2V0CQlUcmFuc3BvcnQgbGF5ZXIgaW50ZXJmYWNlCisgKiBAdiBkYXRhCQlSZWNlaXZlZCBkYXRhCisgKiBAdiBsZW4JCUxlbmd0aCBvZiByZWNlaXZlZCBkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBUaGlzIGhhbmRsZXMgcmVjZWl2ZWQgUERVcy4gIFRoZSByZWNlaXZlIHN0cmF0ZWd5IGlzIHRvIGZpbGwgaW4KKyAqIGlzY3NpOjpyeF9iaHMgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIEJIUyBwb3J0aW9uIG9mIHRoZSBQRFUsCisgKiB0aHJvdyBhd2F5IGFueSBBSFMgcG9ydGlvbiwgYW5kIHRoZW4gcHJvY2VzcyBlYWNoIHBhcnQgb2YgdGhlIGRhdGEKKyAqIHBvcnRpb24gYXMgaXQgYXJyaXZlcy4gIFRoZSBkYXRhIHByb2Nlc3Npbmcgcm91dGluZSB0aGVyZWZvcmUKKyAqIGFsd2F5cyBoYXMgYSBmdWxsIGNvcHkgb2YgdGhlIEJIUyBhdmFpbGFibGUsIGV2ZW4gZm9yIHBvcnRpb25zIG9mCisgKiB0aGUgZGF0YSBpbiBkaWZmZXJlbnQgcGFja2V0cyB0byB0aGUgQkhTLgorICovCitzdGF0aWMgaW50IGlzY3NpX3NvY2tldF9kZWxpdmVyX3JhdyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqc29ja2V0LAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpID0KKwkJY29udGFpbmVyX29mICggc29ja2V0LCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiwgc29ja2V0ICk7CisJc3RydWN0IGlzY3NpX2Joc19jb21tb24gKmNvbW1vbiA9ICZpc2NzaS0+cnhfYmhzLmNvbW1vbjsKKwlpbnQgKCAqIHJ4ICkgKCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2ksIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgICBzaXplX3QgbGVuLCBzaXplX3QgcmVtYWluaW5nICk7CisJZW51bSBpc2NzaV9yeF9zdGF0ZSBuZXh0X3N0YXRlOworCXNpemVfdCBmcmFnX2xlbjsKKwlzaXplX3QgcmVtYWluaW5nOworCWludCByYzsKKworCXdoaWxlICggMSApIHsKKwkJc3dpdGNoICggaXNjc2ktPnJ4X3N0YXRlICkgeworCQljYXNlIElTQ1NJX1JYX0JIUzoKKwkJCXJ4ID0gaXNjc2lfcnhfYmhzOworCQkJaXNjc2ktPnJ4X2xlbiA9IHNpemVvZiAoIGlzY3NpLT5yeF9iaHMgKTsKKwkJCW5leHRfc3RhdGUgPSBJU0NTSV9SWF9BSFM7CQkJCisJCQlicmVhazsKKwkJY2FzZSBJU0NTSV9SWF9BSFM6CisJCQlyeCA9IGlzY3NpX3J4X2Rpc2NhcmQ7CisJCQlpc2NzaS0+cnhfbGVuID0gNCAqIElTQ1NJX0FIU19MRU4gKCBjb21tb24tPmxlbmd0aHMgKTsKKwkJCW5leHRfc3RhdGUgPSBJU0NTSV9SWF9EQVRBOworCQkJYnJlYWs7CisJCWNhc2UgSVNDU0lfUlhfREFUQToKKwkJCXJ4ID0gaXNjc2lfcnhfZGF0YTsKKwkJCWlzY3NpLT5yeF9sZW4gPSBJU0NTSV9EQVRBX0xFTiAoIGNvbW1vbi0+bGVuZ3RocyApOworCQkJbmV4dF9zdGF0ZSA9IElTQ1NJX1JYX0RBVEFfUEFERElORzsKKwkJCWJyZWFrOworCQljYXNlIElTQ1NJX1JYX0RBVEFfUEFERElORzoKKwkJCXJ4ID0gaXNjc2lfcnhfZGlzY2FyZDsKKwkJCWlzY3NpLT5yeF9sZW4gPSBJU0NTSV9EQVRBX1BBRF9MRU4gKCBjb21tb24tPmxlbmd0aHMgKTsKKwkJCW5leHRfc3RhdGUgPSBJU0NTSV9SWF9CSFM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWFzc2VydCAoIDAgKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZnJhZ19sZW4gPSBpc2NzaS0+cnhfbGVuIC0gaXNjc2ktPnJ4X29mZnNldDsKKwkJaWYgKCBmcmFnX2xlbiA+IGxlbiApCisJCQlmcmFnX2xlbiA9IGxlbjsKKwkJcmVtYWluaW5nID0gaXNjc2ktPnJ4X2xlbiAtIGlzY3NpLT5yeF9vZmZzZXQgLSBmcmFnX2xlbjsKKwkJaWYgKCAoIHJjID0gcnggKCBpc2NzaSwgZGF0YSwgZnJhZ19sZW4sIHJlbWFpbmluZyApICkgIT0gMCApIHsKKwkJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIGNvdWxkIG5vdCBwcm9jZXNzIHJlY2VpdmVkICIKKwkJCSAgICAgICAiZGF0YTogJXNcbiIsIGlzY3NpLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCWlzY3NpX2Nsb3NlX2Nvbm5lY3Rpb24gKCBpc2NzaSwgcmMgKTsKKwkJCWlzY3NpX3Njc2lfZG9uZSAoIGlzY3NpLCByYyApOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJaXNjc2ktPnJ4X29mZnNldCArPSBmcmFnX2xlbjsKKwkJZGF0YSArPSBmcmFnX2xlbjsKKwkJbGVuIC09IGZyYWdfbGVuOworCisJCS8qIElmIGFsbCB0aGUgZGF0YSBmb3IgdGhpcyBzdGF0ZSBoYXMgbm90IHlldCBiZWVuCisJCSAqIHJlY2VpdmVkLCBzdGF5IGluIHRoaXMgc3RhdGUgZm9yIG5vdy4KKwkJICovCisJCWlmICggaXNjc2ktPnJ4X29mZnNldCAhPSBpc2NzaS0+cnhfbGVuICkKKwkJCXJldHVybiAwOworCisJCWlzY3NpLT5yeF9zdGF0ZSA9IG5leHRfc3RhdGU7CisJCWlzY3NpLT5yeF9vZmZzZXQgPSAwOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIEhhbmRsZSBzdHJlYW0gY29ubmVjdGlvbiBjbG9zdXJlCisgKgorICogQHYgc29ja2V0CQlUcmFuc3BvcnQgbGF5ZXIgaW50ZXJmYWNlCisgKiBAdiByYwkJUmVhc29uIGZvciBjbG9zZQorICoKKyAqLworc3RhdGljIHZvaWQgaXNjc2lfc29ja2V0X2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICpzb2NrZXQsIGludCByYyApIHsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2kgPQorCQljb250YWluZXJfb2YgKCBzb2NrZXQsIHN0cnVjdCBpc2NzaV9zZXNzaW9uLCBzb2NrZXQgKTsKKworCS8qIEV2ZW4gYSBncmFjZWZ1bCBjbG9zZSBjb3VudHMgYXMgYW4gZXJyb3IgZm9yIGlTQ1NJICovCisJaWYgKCAhIHJjICkKKwkJcmMgPSAtRUNPTk5SRVNFVDsKKworCS8qIENsb3NlIHNlc3Npb24gY2xlYW5seSAqLworCWlzY3NpX2Nsb3NlX2Nvbm5lY3Rpb24gKCBpc2NzaSwgcmMgKTsKKworCS8qIFJldHJ5IGNvbm5lY3Rpb24gaWYgd2l0aGluIHRoZSByZXRyeSBsaW1pdCwgb3RoZXJ3aXNlIGZhaWwgKi8KKwlpZiAoICsraXNjc2ktPnJldHJ5X2NvdW50IDw9IElTQ1NJX01BWF9SRVRSSUVTICkgeworCQlEQkdDICggaXNjc2ksICJpU0NTSSAlcCByZXRyeWluZyBjb25uZWN0aW9uIChyZXRyeSAjJWQpXG4iLAorCQkgICAgICAgaXNjc2ksIGlzY3NpLT5yZXRyeV9jb3VudCApOworCQlpZiAoICggcmMgPSBpc2NzaV9vcGVuX2Nvbm5lY3Rpb24gKCBpc2NzaSApICkgIT0gMCApIHsKKwkJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIGNvdWxkIG5vdCByZWNvbm5lY3Q6ICVzXG4iLAorCQkJICAgICAgIGlzY3NpLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCWlzY3NpX3Njc2lfZG9uZSAoIGlzY3NpLCByYyApOworCQl9CisJfSBlbHNlIHsKKwkJREJHQyAoIGlzY3NpLCAiaVNDU0kgJXAgcmV0cnkgY291bnQgZXhjZWVkZWRcbiIsIGlzY3NpICk7CisJCWlzY3NpLT5pbnN0YW50X3JjID0gcmM7CisJCWlzY3NpX3Njc2lfZG9uZSAoIGlzY3NpLCByYyApOworCX0KK30KKworLyoqCisgKiBIYW5kbGUgcmVkaXJlY3Rpb24gZXZlbnQKKyAqCisgKiBAdiBzb2NrZXQJCVRyYW5zcG9ydCBsYXllciBpbnRlcmZhY2UKKyAqIEB2IHR5cGUJCUxvY2F0aW9uIHR5cGUKKyAqIEB2IGFyZ3MJCVJlbWFpbmluZyBhcmd1bWVudHMgZGVwZW5kIHVwb24gbG9jYXRpb24gdHlwZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfdnJlZGlyZWN0ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICpzb2NrZXQsIGludCB0eXBlLAorCQkJICAgICB2YV9saXN0IGFyZ3MgKSB7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKmlzY3NpID0KKwkJY29udGFpbmVyX29mICggc29ja2V0LCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiwgc29ja2V0ICk7CisJdmFfbGlzdCB0bXA7CisJc3RydWN0IHNvY2thZGRyICpwZWVyOworCisJLyogSW50ZXJjZXB0IHJlZGlyZWN0cyB0byBhIExPQ0FUSU9OX1NPQ0tFVCBhbmQgcmVjb3JkIHRoZSBJUAorCSAqIGFkZHJlc3MgZm9yIHRoZSBpQkZULiAgVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIGJ1dCBhdm9pZHMKKwkgKiBpbnZlbnRpbmcgYW4gaW9jdGwoKS1zdHlsZSBjYWxsIHRvIHJldHJpZXZlIHRoZSBzb2NrZXQKKwkgKiBhZGRyZXNzIGZyb20gYSBkYXRhLXhmZXIgaW50ZXJmYWNlLgorCSAqLworCWlmICggdHlwZSA9PSBMT0NBVElPTl9TT0NLRVQgKSB7CisJCXZhX2NvcHkgKCB0bXAsIGFyZ3MgKTsKKwkJKCB2b2lkICkgdmFfYXJnICggdG1wLCBpbnQgKTsgLyogRGlzY2FyZCAic2VtYW50aWNzIiAqLworCQlwZWVyID0gdmFfYXJnICggdG1wLCBzdHJ1Y3Qgc29ja2FkZHIgKiApOworCQltZW1jcHkgKCAmaXNjc2ktPnRhcmdldF9zb2NrYWRkciwgcGVlciwKKwkJCSBzaXplb2YgKCBpc2NzaS0+dGFyZ2V0X3NvY2thZGRyICkgKTsKKwkJdmFfZW5kICggdG1wICk7CisJfQorCisJcmV0dXJuIHhmZXJfdnJlb3BlbiAoIHNvY2tldCwgdHlwZSwgYXJncyApOworfQorCQkJICAgICAKKworLyoqIGlTQ1NJIHNvY2tldCBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgaXNjc2lfc29ja2V0X29wZXJhdGlvbnMgPSB7CisJLmNsb3NlCQk9IGlzY3NpX3NvY2tldF9jbG9zZSwKKwkudnJlZGlyZWN0CT0gaXNjc2lfdnJlZGlyZWN0LAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHhmZXJfZGVsaXZlcl9hc19yYXcsCisJLmRlbGl2ZXJfcmF3CT0gaXNjc2lfc29ja2V0X2RlbGl2ZXJfcmF3LAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGlTQ1NJIGNvbW1hbmQgaXNzdWluZworICoKKyAqLworCisvKioKKyAqIElzc3VlIFNDU0kgY29tbWFuZAorICoKKyAqIEB2IHNjc2kJCVNDU0kgZGV2aWNlCisgKiBAdiBjb21tYW5kCQlTQ1NJIGNvbW1hbmQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlzY3NpX2NvbW1hbmQgKCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2ksCisJCQkgICBzdHJ1Y3Qgc2NzaV9jb21tYW5kICpjb21tYW5kICkgeworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSA9CisJCWNvbnRhaW5lcl9vZiAoIHNjc2ktPmJhY2tlbmQsIHN0cnVjdCBpc2NzaV9zZXNzaW9uLCByZWZjbnQgKTsKKwlpbnQgcmM7CisKKwkvKiBBYm9ydCBpbW1lZGlhdGVseSBpZiB3ZSBoYXZlIGEgcmVjb3JkZWQgcGVybWFuZW50IGZhaWx1cmUgKi8KKwlpZiAoIGlzY3NpLT5pbnN0YW50X3JjICkKKwkJcmV0dXJuIGlzY3NpLT5pbnN0YW50X3JjOworCisJLyogUmVjb3JkIFNDU0kgY29tbWFuZCAqLworCWlzY3NpLT5jb21tYW5kID0gY29tbWFuZDsKKworCS8qIElzc3VlIGNvbW1hbmQgb3Igb3BlbiBjb25uZWN0aW9uIGFzIGFwcHJvcHJpYXRlICovCisJaWYgKCBpc2NzaS0+c3RhdHVzICkgeworCQlpc2NzaV9zdGFydF9jb21tYW5kICggaXNjc2kgKTsKKwl9IGVsc2UgeworCQlpZiAoICggcmMgPSBpc2NzaV9vcGVuX2Nvbm5lY3Rpb24gKCBpc2NzaSApICkgIT0gMCApIHsKKwkJCWlzY3NpLT5jb21tYW5kID0gTlVMTDsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFNodXQgZG93biBpU0NTSSBpbnRlcmZhY2UKKyAqCisgKiBAdiBzY3NpCQlTQ1NJIGRldmljZQorICovCit2b2lkIGlzY3NpX2RldGFjaCAoIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSApIHsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqaXNjc2kgPQorCQljb250YWluZXJfb2YgKCBzY3NpLT5iYWNrZW5kLCBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiwgcmVmY250ICk7CisKKwl4ZmVyX251bGxpZnkgKCAmaXNjc2ktPnNvY2tldCApOworCWlzY3NpX2Nsb3NlX2Nvbm5lY3Rpb24gKCBpc2NzaSwgMCApOworCXByb2Nlc3NfZGVsICggJmlzY3NpLT5wcm9jZXNzICk7CisJc2NzaS0+Y29tbWFuZCA9IHNjc2lfZGV0YWNoZWRfY29tbWFuZDsKKwlyZWZfcHV0ICggc2NzaS0+YmFja2VuZCApOworCXNjc2ktPmJhY2tlbmQgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEluc3RhbnRpYXRvcgorICoKKyAqLworCisvKiogaVNDU0kgcm9vdCBwYXRoIGNvbXBvbmVudHMgKGFzIHBlciBSRkM0MTczKSAqLworZW51bSBpc2NzaV9yb290X3BhdGhfY29tcG9uZW50IHsKKwlSUF9MSVRFUkFMID0gMCwKKwlSUF9TRVJWRVJOQU1FLAorCVJQX1BST1RPQ09MLAorCVJQX1BPUlQsCisJUlBfTFVOLAorCVJQX1RBUkdFVE5BTUUsCisJTlVNX1JQX0NPTVBPTkVOVFMKK307CisKKy8qKgorICogUGFyc2UgaVNDU0kgcm9vdCBwYXRoCisgKgorICogQHYgaXNjc2kJCWlTQ1NJIHNlc3Npb24KKyAqIEB2IHJvb3RfcGF0aAkJaVNDU0kgcm9vdCBwYXRoIChhcyBwZXIgUkZDNDE3MykKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGlzY3NpX3BhcnNlX3Jvb3RfcGF0aCAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwKKwkJCQkgICBjb25zdCBjaGFyICpyb290X3BhdGggKSB7CisJY2hhciBycF9jb3B5WyBzdHJsZW4gKCByb290X3BhdGggKSArIDEgXTsKKwljaGFyICpycF9jb21wW05VTV9SUF9DT01QT05FTlRTXTsKKwljaGFyICpycCA9IHJwX2NvcHk7CisJaW50IGkgPSAwOworCWludCByYzsKKworCS8qIFNwbGl0IHJvb3QgcGF0aCBpbnRvIGNvbXBvbmVudCBwYXJ0cyAqLworCXN0cmNweSAoIHJwX2NvcHksIHJvb3RfcGF0aCApOworCXdoaWxlICggMSApIHsKKwkJcnBfY29tcFtpKytdID0gcnA7CisJCWlmICggaSA9PSBOVU1fUlBfQ09NUE9ORU5UUyApCisJCQlicmVhazsKKwkJZm9yICggOyAqcnAgIT0gJzonIDsgcnArKyApIHsKKwkJCWlmICggISAqcnAgKSB7CisJCQkJREJHQyAoIGlzY3NpLCAiaVNDU0kgJXAgcm9vdCBwYXRoIFwiJXNcIiAiCisJCQkJICAgICAgICJ0b28gc2hvcnRcbiIsIGlzY3NpLCByb290X3BhdGggKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCQkqKHJwKyspID0gJ1wwJzsKKwl9CisKKwkvKiBVc2Ugcm9vdCBwYXRoIGNvbXBvbmVudHMgdG8gY29uZmlndXJlIGlTQ1NJIHNlc3Npb24gKi8KKwlpc2NzaS0+dGFyZ2V0X2FkZHJlc3MgPSBzdHJkdXAgKCBycF9jb21wW1JQX1NFUlZFUk5BTUVdICk7CisJaWYgKCAhIGlzY3NpLT50YXJnZXRfYWRkcmVzcyApCisJCXJldHVybiAtRU5PTUVNOworCWlzY3NpLT50YXJnZXRfcG9ydCA9IHN0cnRvdWwgKCBycF9jb21wW1JQX1BPUlRdLCBOVUxMLCAxMCApOworCWlmICggISBpc2NzaS0+dGFyZ2V0X3BvcnQgKQorCQlpc2NzaS0+dGFyZ2V0X3BvcnQgPSBJU0NTSV9QT1JUOworCWlmICggKCByYyA9IHNjc2lfcGFyc2VfbHVuICggcnBfY29tcFtSUF9MVU5dLCAmaXNjc2ktPmx1biApICkgIT0gMCApIHsKKwkJREJHQyAoIGlzY3NpLCAiaVNDU0kgJXAgaW52YWxpZCBMVU4gXCIlc1wiXG4iLAorCQkgICAgICAgaXNjc2ksIHJwX2NvbXBbUlBfTFVOXSApOworCQlyZXR1cm4gcmM7CisJfQorCWlzY3NpLT50YXJnZXRfaXFuID0gc3RyZHVwICggcnBfY29tcFtSUF9UQVJHRVROQU1FXSApOworCWlmICggISBpc2NzaS0+dGFyZ2V0X2lxbiApCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2V0IGlTQ1NJIGF1dGhlbnRpY2F0aW9uIGRldGFpbHMKKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHYgaW5pdGlhdG9yX3VzZXJuYW1lIEluaXRpYXRvciB1c2VybmFtZSwgaWYgYW55CisgKiBAdiBpbml0aWF0b3JfcGFzc3dvcmQgSW5pdGlhdG9yIHBhc3N3b3JkLCBpZiBhbnkKKyAqIEB2IHRhcmdldF91c2VybmFtZQlUYXJnZXQgdXNlcm5hbWUsIGlmIGFueQorICogQHYgdGFyZ2V0X3Bhc3N3b3JkCVRhcmdldCBwYXNzd29yZCwgaWYgYW55CisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBpc2NzaV9zZXRfYXV0aCAoIHN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaSwKKwkJCSAgICBjb25zdCBjaGFyICppbml0aWF0b3JfdXNlcm5hbWUsCisJCQkgICAgY29uc3QgY2hhciAqaW5pdGlhdG9yX3Bhc3N3b3JkLAorCQkJICAgIGNvbnN0IGNoYXIgKnRhcmdldF91c2VybmFtZSwKKwkJCSAgICBjb25zdCBjaGFyICp0YXJnZXRfcGFzc3dvcmQgKSB7CisKKwkvKiBDaGVjayBmb3IgaW5pdGlhdG9yIG9yIHRhcmdldCBjcmVkZW50aWFscyAqLworCWlmICggaW5pdGlhdG9yX3VzZXJuYW1lIHx8IGluaXRpYXRvcl9wYXNzd29yZCB8fAorCSAgICAgdGFyZ2V0X3VzZXJuYW1lIHx8IHRhcmdldF9wYXNzd29yZCApIHsKKworCQkvKiBXZSBtdXN0IGhhdmUgYXQgbGVhc3QgYW4gaW5pdGlhdG9yIHVzZXJuYW1lK3Bhc3N3b3JkICovCisJCWlmICggISAoIGluaXRpYXRvcl91c2VybmFtZSAmJiBpbml0aWF0b3JfcGFzc3dvcmQgKSApCisJCQlnb3RvIGludmFsaWRfYXV0aDsKKworCQkvKiBTdG9yZSBpbml0aWF0b3IgY3JlZGVudGlhbHMgKi8KKwkJaXNjc2ktPmluaXRpYXRvcl91c2VybmFtZSA9IHN0cmR1cCAoIGluaXRpYXRvcl91c2VybmFtZSApOworCQlpZiAoICEgaXNjc2ktPmluaXRpYXRvcl91c2VybmFtZSApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaXNjc2ktPmluaXRpYXRvcl9wYXNzd29yZCA9IHN0cmR1cCAoIGluaXRpYXRvcl9wYXNzd29yZCApOworCQlpZiAoICEgaXNjc2ktPmluaXRpYXRvcl9wYXNzd29yZCApCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBDaGVjayBmb3IgdGFyZ2V0IGNyZWRlbnRpYWxzICovCisJCWlmICggdGFyZ2V0X3VzZXJuYW1lIHx8IHRhcmdldF9wYXNzd29yZCApIHsKKworCQkJLyogV2UgbXVzdCBoYXZlIHRhcmdldCB1c2VybmFtZStwYXNzd29yZCAqLworCQkJaWYgKCAhICggdGFyZ2V0X3VzZXJuYW1lICYmIHRhcmdldF9wYXNzd29yZCApICkKKwkJCQlnb3RvIGludmFsaWRfYXV0aDsKKworCQkJLyogU3RvcmUgdGFyZ2V0IGNyZWRlbnRpYWxzICovCisJCQlpc2NzaS0+dGFyZ2V0X3VzZXJuYW1lID0gc3RyZHVwICggdGFyZ2V0X3VzZXJuYW1lICk7CisJCQlpZiAoICEgaXNjc2ktPnRhcmdldF91c2VybmFtZSApCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlpc2NzaS0+dGFyZ2V0X3Bhc3N3b3JkID0gc3RyZHVwICggdGFyZ2V0X3Bhc3N3b3JkICk7CisJCQlpZiAoICEgaXNjc2ktPnRhcmdldF9wYXNzd29yZCApCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworIGludmFsaWRfYXV0aDoKKwlEQkdDICggaXNjc2ksICJpU0NTSSAlcCBpbnZhbGlkIGNyZWRlbnRpYWxzOiBpbml0aWF0b3IgIgorCSAgICAgICAiJXNuYW1lLCVzcHcsIHRhcmdldCAlc25hbWUsJXNwd1xuIiwgaXNjc2ksCisJICAgICAgICggaW5pdGlhdG9yX3VzZXJuYW1lID8gIiIgOiAibm8gIiApLAorCSAgICAgICAoIGluaXRpYXRvcl9wYXNzd29yZCA/ICIiIDogIm5vICIgKSwKKwkgICAgICAgKCB0YXJnZXRfdXNlcm5hbWUgPyAiIiA6ICJubyAiICksCisJICAgICAgICggdGFyZ2V0X3Bhc3N3b3JkID8gIiIgOiAibm8gIiApICk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogQXR0YWNoIGlTQ1NJIGludGVyZmFjZQorICoKKyAqIEB2IHNjc2kJCVNDU0kgZGV2aWNlCisgKiBAdiByb290X3BhdGgJCWlTQ1NJIHJvb3QgcGF0aCAoYXMgcGVyIFJGQzQxNzMpCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworaW50IGlzY3NpX2F0dGFjaCAoIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaSwgY29uc3QgY2hhciAqcm9vdF9wYXRoICkgeworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICppc2NzaTsKKwlpbnQgcmM7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBzdHJ1Y3R1cmUgKi8KKwlpc2NzaSA9IHphbGxvYyAoIHNpemVvZiAoICppc2NzaSApICk7CisJaWYgKCAhIGlzY3NpICkKKwkJcmV0dXJuIC1FTk9NRU07CisJaXNjc2ktPnJlZmNudC5mcmVlID0gaXNjc2lfZnJlZTsKKwl4ZmVyX2luaXQgKCAmaXNjc2ktPnNvY2tldCwgJmlzY3NpX3NvY2tldF9vcGVyYXRpb25zLCAmaXNjc2ktPnJlZmNudCApOworCXByb2Nlc3NfaW5pdCAoICZpc2NzaS0+cHJvY2VzcywgaXNjc2lfdHhfc3RlcCwgJmlzY3NpLT5yZWZjbnQgKTsKKworCS8qIFBhcnNlIHJvb3QgcGF0aCAqLworCWlmICggKCByYyA9IGlzY3NpX3BhcnNlX3Jvb3RfcGF0aCAoIGlzY3NpLCByb290X3BhdGggKSApICE9IDAgKQorCQlnb3RvIGVycjsKKwkvKiBTZXQgZmllbGRzIG5vdCBzcGVjaWZpZWQgYnkgcm9vdCBwYXRoICovCisJaWYgKCAoIHJjID0gaXNjc2lfc2V0X2F1dGggKCBpc2NzaSwKKwkJCQkgICAgIGlzY3NpX2luaXRpYXRvcl91c2VybmFtZSwKKwkJCQkgICAgIGlzY3NpX2luaXRpYXRvcl9wYXNzd29yZCwKKwkJCQkgICAgIGlzY3NpX3RhcmdldF91c2VybmFtZSwKKwkJCQkgICAgIGlzY3NpX3RhcmdldF9wYXNzd29yZCApICkgIT0gMCApCisJCWdvdG8gZXJyOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmICggISBpc2NzaS0+dGFyZ2V0X2FkZHJlc3MgKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIGRvZXMgbm90IHlldCBzdXBwb3J0IGRpc2NvdmVyeVxuIiwKKwkJICAgICAgIGlzY3NpICk7CisJCXJjID0gLUVOT1RTVVA7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoICEgaXNjc2ktPnRhcmdldF9pcW4gKSB7CisJCURCR0MgKCBpc2NzaSwgImlTQ1NJICVwIG5vIHRhcmdldCBhZGRyZXNzIHN1cHBsaWVkIGluICVzXG4iLAorCQkgICAgICAgaXNjc2ksIHJvb3RfcGF0aCApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCS8qIEF0dGFjaCBwYXJlbnQgaW50ZXJmYWNlLCBtb3J0YWxpc2Ugc2VsZiwgYW5kIHJldHVybiAqLworCXNjc2ktPmJhY2tlbmQgPSByZWZfZ2V0ICggJmlzY3NpLT5yZWZjbnQgKTsKKwlzY3NpLT5jb21tYW5kID0gaXNjc2lfY29tbWFuZDsKKwlyZWZfcHV0ICggJmlzY3NpLT5yZWZjbnQgKTsKKwlyZXR1cm4gMDsKKwkKKyBlcnI6CisJcmVmX3B1dCAoICZpc2NzaS0+cmVmY250ICk7CisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNldHRpbmdzCisgKgorICovCisKKy8qKiBpU0NTSSBpbml0aWF0b3IgSVFOIHNldHRpbmcgKi8KK3N0cnVjdCBzZXR0aW5nIGluaXRpYXRvcl9pcW5fc2V0dGluZyBfX3NldHRpbmcgPSB7CisJLm5hbWUgPSAiaW5pdGlhdG9yLWlxbiIsCisJLmRlc2NyaXB0aW9uID0gImlTQ1NJIGluaXRpYXRvciBuYW1lIiwKKwkudGFnID0gREhDUF9JU0NTSV9JTklUSUFUT1JfSVFOLAorCS50eXBlID0gJnNldHRpbmdfdHlwZV9zdHJpbmcsCit9OworCisvKiogaVNDU0kgcmV2ZXJzZSB1c2VybmFtZSBzZXR0aW5nICovCitzdHJ1Y3Qgc2V0dGluZyByZXZlcnNlX3VzZXJuYW1lX3NldHRpbmcgX19zZXR0aW5nID0geworCS5uYW1lID0gInJldmVyc2UtdXNlcm5hbWUiLAorCS5kZXNjcmlwdGlvbiA9ICJSZXZlcnNlIHVzZXIgbmFtZSIsCisJLnRhZyA9IERIQ1BfRUJfUkVWRVJTRV9VU0VSTkFNRSwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfc3RyaW5nLAorfTsKKworLyoqIGlTQ1NJIHJldmVyc2UgcGFzc3dvcmQgc2V0dGluZyAqLworc3RydWN0IHNldHRpbmcgcmV2ZXJzZV9wYXNzd29yZF9zZXR0aW5nIF9fc2V0dGluZyA9IHsKKwkubmFtZSA9ICJyZXZlcnNlLXBhc3N3b3JkIiwKKwkuZGVzY3JpcHRpb24gPSAiUmV2ZXJzZSBwYXNzd29yZCIsCisJLnRhZyA9IERIQ1BfRUJfUkVWRVJTRV9QQVNTV09SRCwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfc3RyaW5nLAorfTsKKworLyoqIEFuIGlTQ1NJIHN0cmluZyBzZXR0aW5nICovCitzdHJ1Y3QgaXNjc2lfc3RyaW5nX3NldHRpbmcgeworCS8qKiBTZXR0aW5nICovCisJc3RydWN0IHNldHRpbmcgKnNldHRpbmc7CisJLyoqIFN0cmluZyB0byB1cGRhdGUgKi8KKwljaGFyICoqc3RyaW5nOworCS8qKiBTdHJpbmcgcHJlZml4ICovCisJY29uc3QgY2hhciAqcHJlZml4OworfTsKKworLyoqIGlTQ1NJIHN0cmluZyBzZXR0aW5ncyAqLworc3RhdGljIHN0cnVjdCBpc2NzaV9zdHJpbmdfc2V0dGluZyBpc2NzaV9zdHJpbmdfc2V0dGluZ3NbXSA9IHsKKwl7CisJCS5zZXR0aW5nID0gJmluaXRpYXRvcl9pcW5fc2V0dGluZywKKwkJLnN0cmluZyA9ICZpc2NzaV9leHBsaWNpdF9pbml0aWF0b3JfaXFuLAorCQkucHJlZml4ID0gIiIsCisJfSwKKwl7CisJCS5zZXR0aW5nID0gJnVzZXJuYW1lX3NldHRpbmcsCisJCS5zdHJpbmcgPSAmaXNjc2lfaW5pdGlhdG9yX3VzZXJuYW1lLAorCQkucHJlZml4ID0gIiIsCisJfSwKKwl7CisJCS5zZXR0aW5nID0gJnBhc3N3b3JkX3NldHRpbmcsCisJCS5zdHJpbmcgPSAmaXNjc2lfaW5pdGlhdG9yX3Bhc3N3b3JkLAorCQkucHJlZml4ID0gIiIsCisJfSwKKwl7CisJCS5zZXR0aW5nID0gJnJldmVyc2VfdXNlcm5hbWVfc2V0dGluZywKKwkJLnN0cmluZyA9ICZpc2NzaV90YXJnZXRfdXNlcm5hbWUsCisJCS5wcmVmaXggPSAiIiwKKwl9LAorCXsKKwkJLnNldHRpbmcgPSAmcmV2ZXJzZV9wYXNzd29yZF9zZXR0aW5nLAorCQkuc3RyaW5nID0gJmlzY3NpX3RhcmdldF9wYXNzd29yZCwKKwkJLnByZWZpeCA9ICIiLAorCX0sCisJeworCQkuc2V0dGluZyA9ICZob3N0bmFtZV9zZXR0aW5nLAorCQkuc3RyaW5nID0gJmlzY3NpX2RlZmF1bHRfaW5pdGlhdG9yX2lxbiwKKwkJLnByZWZpeCA9ICJpcW4uMjAwMC0wMS5vcmcuZXRoZXJib290OiIsCisJfSwKK307CisKKy8qKgorICogQXBwbHkgaVNDU0kgc2V0dGluZworICoKKyAqIEB2IHNldHRpbmcJCWlTQ1NJIHN0cmluZyBzZXR0aW5nCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcHBseV9pc2NzaV9zdHJpbmdfc2V0dGluZyAoIHN0cnVjdCBpc2NzaV9zdHJpbmdfc2V0dGluZyAqc2V0dGluZyApeworCXNpemVfdCBwcmVmaXhfbGVuOworCWludCBzZXR0aW5nX2xlbjsKKwlzaXplX3QgbGVuOworCWludCBjaGVja19sZW47CisJY2hhciAqcDsKKworCS8qIEZyZWUgb2xkIHN0cmluZyAqLworCWZyZWUgKCAqc2V0dGluZy0+c3RyaW5nICk7CisJKnNldHRpbmctPnN0cmluZyA9IE5VTEw7CisKKwkvKiBBbGxvY2F0ZSBuZXcgc3RyaW5nICovCisJcHJlZml4X2xlbiA9IHN0cmxlbiAoIHNldHRpbmctPnByZWZpeCApOworCXNldHRpbmdfbGVuID0gZmV0Y2hfc2V0dGluZ19sZW4gKCBOVUxMLCBzZXR0aW5nLT5zZXR0aW5nICk7CisJaWYgKCBzZXR0aW5nX2xlbiA8IDAgKSB7CisJCS8qIE1pc3Npbmcgc2V0dGluZ3MgYXJlIG5vdCBlcnJvcnM7IGxlYXZlIHN0cmluZ3MgYXMgTlVMTCAqLworCQlyZXR1cm4gMDsKKwl9CisJbGVuID0gKCBwcmVmaXhfbGVuICsgc2V0dGluZ19sZW4gKyAxICk7CisJcCA9ICpzZXR0aW5nLT5zdHJpbmcgPSBtYWxsb2MgKCBsZW4gKTsKKwlpZiAoICEgcCApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRmlsbCBuZXcgc3RyaW5nICovCisJc3RyY3B5ICggcCwgc2V0dGluZy0+cHJlZml4ICk7CisJY2hlY2tfbGVuID0gZmV0Y2hfc3RyaW5nX3NldHRpbmcgKCBOVUxMLCBzZXR0aW5nLT5zZXR0aW5nLAorCQkJCQkgICAoIHAgKyBwcmVmaXhfbGVuICksCisJCQkJCSAgICggbGVuIC0gcHJlZml4X2xlbiApICk7CisJYXNzZXJ0ICggY2hlY2tfbGVuID09IHNldHRpbmdfbGVuICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBcHBseSBpU0NTSSBzZXR0aW5ncworICoKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGFwcGx5X2lzY3NpX3NldHRpbmdzICggdm9pZCApIHsKKwlzdHJ1Y3QgaXNjc2lfc3RyaW5nX3NldHRpbmcgKnNldHRpbmc7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjOworCisJZm9yICggaSA9IDAgOyBpIDwgKCBzaXplb2YgKCBpc2NzaV9zdHJpbmdfc2V0dGluZ3MgKSAvCisJCQkgICAgc2l6ZW9mICggaXNjc2lfc3RyaW5nX3NldHRpbmdzWzBdICkgKSA7IGkrKyApIHsKKwkJc2V0dGluZyA9ICZpc2NzaV9zdHJpbmdfc2V0dGluZ3NbaV07CisJCWlmICggKCByYyA9IGFwcGx5X2lzY3NpX3N0cmluZ19zZXR0aW5nICggc2V0dGluZyApICkgIT0gMCApIHsKKwkJCURCRyAoICJpU0NTSSBjb3VsZCBub3QgYXBwbHkgc2V0dGluZyAlc1xuIiwKKwkJCSAgICAgIHNldHRpbmctPnNldHRpbmctPm5hbWUgKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiogaVNDU0kgc2V0dGluZ3MgYXBwbGljYXRvciAqLworc3RydWN0IHNldHRpbmdzX2FwcGxpY2F0b3IgaXNjc2lfc2V0dGluZ3NfYXBwbGljYXRvciBfX3NldHRpbmdzX2FwcGxpY2F0b3IgPSB7CisJLmFwcGx5ID0gYXBwbHlfaXNjc2lfc2V0dGluZ3MsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEluaXRpYXRvciBuYW1lCisgKgorICovCisKKy8qKgorICogR2V0IGlTQ1NJIGluaXRpYXRvciBJUU4KKyAqCisgKiBAdiBpc2NzaQkJaVNDU0kgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2NvbnN0IGNoYXIgKiBpc2NzaV9pbml0aWF0b3JfaXFuICggdm9pZCApIHsKKworCWlmICggaXNjc2lfZXhwbGljaXRfaW5pdGlhdG9yX2lxbiApCisJCXJldHVybiBpc2NzaV9leHBsaWNpdF9pbml0aWF0b3JfaXFuOworCWlmICggaXNjc2lfZGVmYXVsdF9pbml0aWF0b3JfaXFuICkKKwkJcmV0dXJuIGlzY3NpX2RlZmF1bHRfaW5pdGlhdG9yX2lxbjsKKwlyZXR1cm4gImlxbi4yMDAwLTA5Lm9yZy5ldGhlcmJvb3Q6VU5LTk9XTiI7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvdGNwaXAuYyBiL2dweGUvc3JjL25ldC90Y3BpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMmZkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvdGNwaXAuYwpAQCAtMCwwICsxLDEzNSBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS90YWJsZXMuaD4KKyNpbmNsdWRlIDxncHhlL3RjcGlwLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFRyYW5zcG9ydC1uZXR3b3JrIGxheWVyIGludGVyZmFjZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgYW5kIHV0aWxpdGllcyBmb3IgdGhlCisgKiBUQ1AvSVAgdHJhbnNwb3J0LW5ldHdvcmsgbGF5ZXIgaW50ZXJmYWNlCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisvKiogUHJvY2VzcyBhIHJlY2VpdmVkIFRDUC9JUCBwYWNrZXQKKyAqCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgdGNwaXBfcHJvdG8JVHJhbnNwb3J0LWxheWVyIHByb3RvY29sIG51bWJlcgorICogQHYgc3Rfc3JjCQlQYXJ0aWFsbHktZmlsbGVkIHNvdXJjZSBhZGRyZXNzCisgKiBAdiBzdF9kZXN0CQlQYXJ0aWFsbHktZmlsbGVkIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEB2IHBzaGRyX2NzdW0JUHNldWRvLWhlYWRlciBjaGVja3N1bQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBleHBlY3RzIGEgdHJhbnNwb3J0LWxheWVyIHNlZ21lbnQgZnJvbSB0aGUgbmV0d29yaworICogbGF5ZXIuICBUaGUgbmV0d29yayBsYXllciBzaG91bGQgZmlsbCBpbiBhcyBtdWNoIGFzIGl0IGNhbiBvZiB0aGUKKyAqIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzIChpLmUuIGl0IHNob3VsZCBmaWxsIGluIHRoZQorICogYWRkcmVzcyBmYW1pbHkgYW5kIHRoZSBuZXR3b3JrLWxheWVyIGFkZHJlc3NlcywgYnV0IGxlYXZlIHRoZSBwb3J0cworICogYW5kIHRoZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmVzIGFzIHplcm8pLgorICovCitpbnQgdGNwaXBfcnggKCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwgdWludDhfdCB0Y3BpcF9wcm90bywgCisJICAgICAgIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3Rfc3JjLAorCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X2Rlc3QsCisJICAgICAgIHVpbnQxNl90IHBzaGRyX2NzdW0gKSB7CisJc3RydWN0IHRjcGlwX3Byb3RvY29sICp0Y3BpcDsKKworCS8qIEhhbmQgb2ZmIHBhY2tldCB0byB0aGUgYXBwcm9wcmlhdGUgdHJhbnNwb3J0LWxheWVyIHByb3RvY29sICovCisJZm9yX2VhY2hfdGFibGVfZW50cnkgKCB0Y3BpcCwgVENQSVBfUFJPVE9DT0xTICkgeworCQlpZiAoIHRjcGlwLT50Y3BpcF9wcm90byA9PSB0Y3BpcF9wcm90byApIHsKKwkJCURCRyAoICJUQ1AvSVAgcmVjZWl2ZWQgJXMgcGFja2V0XG4iLCB0Y3BpcC0+bmFtZSApOworCQkJcmV0dXJuIHRjcGlwLT5yeCAoIGlvYnVmLCBzdF9zcmMsIHN0X2Rlc3QsIHBzaGRyX2NzdW0gKTsKKwkJfQorCX0KKworCURCRyAoICJVbnJlY29nbmlzZWQgVENQL0lQIHByb3RvY29sICVkXG4iLCB0Y3BpcF9wcm90byApOworCWZyZWVfaW9iICggaW9idWYgKTsKKwlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKK30KKworLyoqIFRyYW5zbWl0IGEgVENQL0lQIHBhY2tldAorICoKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiB0Y3BpcF9wcm90b2NvbAlUcmFuc3BvcnQtbGF5ZXIgcHJvdG9jb2wKKyAqIEB2IHN0X3NyYwkJU291cmNlIGFkZHJlc3MsIG9yIE5VTEwgdG8gdXNlIHJvdXRlIGRlZmF1bHQKKyAqIEB2IHN0X2Rlc3QJCURlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UgdG8gdXNlIGlmIG5vIHJvdXRlIGZvdW5kLCBvciBOVUxMCisgKiBAdiB0cmFuc19jc3VtCVRyYW5zcG9ydC1sYXllciBjaGVja3N1bSB0byBjb21wbGV0ZSwgb3IgTlVMTAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB0Y3BpcF90eCAoIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLCBzdHJ1Y3QgdGNwaXBfcHJvdG9jb2wgKnRjcGlwX3Byb3RvY29sLAorCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKnN0X3NyYywgc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9kZXN0LAorCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MTZfdCAqdHJhbnNfY3N1bSApIHsKKwlzdHJ1Y3QgdGNwaXBfbmV0X3Byb3RvY29sICp0Y3BpcF9uZXQ7CisKKwkvKiBIYW5kIG9mZiBwYWNrZXQgdG8gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmstbGF5ZXIgcHJvdG9jb2wgKi8KKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIHRjcGlwX25ldCwgVENQSVBfTkVUX1BST1RPQ09MUyApIHsKKwkJaWYgKCB0Y3BpcF9uZXQtPnNhX2ZhbWlseSA9PSBzdF9kZXN0LT5zdF9mYW1pbHkgKSB7CisJCQlEQkcgKCAiVENQL0lQIHNlbmRpbmcgJXMgcGFja2V0XG4iLCB0Y3BpcF9uZXQtPm5hbWUgKTsKKwkJCXJldHVybiB0Y3BpcF9uZXQtPnR4ICggaW9idWYsIHRjcGlwX3Byb3RvY29sLCBzdF9zcmMsCisJCQkJCSAgICAgICBzdF9kZXN0LCBuZXRkZXYsIHRyYW5zX2NzdW0gKTsKKwkJfQorCX0KKwkKKwlEQkcgKCAiVW5yZWNvZ25pc2VkIFRDUC9JUCBhZGRyZXNzIGZhbWlseSAlZFxuIiwgc3RfZGVzdC0+c3RfZmFtaWx5ICk7CisJZnJlZV9pb2IgKCBpb2J1ZiApOworCXJldHVybiAtRUFGTk9TVVBQT1JUOworfQorCisvKioKKyAqIENhbGN1bGF0ZSBjb250aW51ZWQgVENQL0lQIGNoZWNrdW0KKyAqCisgKiBAdiBwYXJ0aWFsCQlDaGVja3N1bSBvZiBhbHJlYWR5LXN1bW1lZCBkYXRhLCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICogQHJldCBja3N1bQkJVXBkYXRlZCBjaGVja3N1bSwgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKgorICogQ2FsY3VsYXRlcyBhIFRDUC9JUC1zdHlsZSAxNi1iaXQgY2hlY2tzdW0gb3ZlciB0aGUgZGF0YSBibG9jay4gIFRoZQorICogY2hlY2tzdW0gaXMgcmV0dXJuZWQgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gYWRkIG5ldyBkYXRhIHRvIGFuIGV4aXN0aW5nIGNoZWNrc3VtLgorICogVGhlIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBib3RoIHRoZSBvbGQgZGF0YSBhbmQgdGhlIG5ldyBkYXRhIHN0YXJ0CisgKiBvbiBldmVuIGJ5dGUgb2Zmc2V0czsgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvCisgKiBieXRlLXN3YXAgZWl0aGVyIHRoZSBpbnB1dCBwYXJ0aWFsIGNoZWNrc3VtLCB0aGUgb3V0cHV0IGNoZWNrc3VtLAorICogb3IgYm90aC4gIERlY2lkaW5nIHdoaWNoIHRvIHN3YXAgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlCisgKiBpbnRlcmVzdGVkIHJlYWRlci4KKyAqLwordWludDE2X3QgdGNwaXBfY29udGludWVfY2hrc3VtICggdWludDE2X3QgcGFydGlhbCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgc2l6ZV90IGxlbiApIHsKKwl1bnNpZ25lZCBpbnQgY2tzdW0gPSAoICggfnBhcnRpYWwgKSAmIDB4ZmZmZiApOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwkKKwlmb3IgKCBpID0gMCA7IGkgPCBsZW4gOyBpKysgKSB7CisJCXZhbHVlID0gKiAoICggdWludDhfdCAqICkgZGF0YSArIGkgKTsKKwkJaWYgKCBpICYgMSApIHsKKwkJCS8qIE9kZCBieXRlczogc3dhcCBvbiBsaXR0bGUtZW5kaWFuIHN5c3RlbXMgKi8KKwkJCXZhbHVlID0gYmUxNl90b19jcHUgKCB2YWx1ZSApOworCQl9IGVsc2UgeworCQkJLyogRXZlbiBieXRlczogc3dhcCBvbiBiaWctZW5kaWFuIHN5c3RlbXMgKi8KKwkJCXZhbHVlID0gbGUxNl90b19jcHUgKCB2YWx1ZSApOworCQl9CisJCWNrc3VtICs9IHZhbHVlOworCQlpZiAoIGNrc3VtID4gMHhmZmZmICkKKwkJCWNrc3VtIC09IDB4ZmZmZjsKKwl9CisJCisJcmV0dXJuICggfmNrc3VtICk7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIFRDUC9JUCBjaGVja3VtCisgKgorICogQHYgZGF0YQkJRGF0YSBidWZmZXIKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAcmV0IGNrc3VtCQlDaGVja3N1bSwgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKgorICogQ2FsY3VsYXRlcyBhIFRDUC9JUC1zdHlsZSAxNi1iaXQgY2hlY2tzdW0gb3ZlciB0aGUgZGF0YSBibG9jay4gIFRoZQorICogY2hlY2tzdW0gaXMgcmV0dXJuZWQgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICovCit1aW50MTZfdCB0Y3BpcF9jaGtzdW0gKCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXJldHVybiB0Y3BpcF9jb250aW51ZV9jaGtzdW0gKCBUQ1BJUF9FTVBUWV9DU1VNLCBkYXRhLCBsZW4gKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC90bHMuYyBiL2dweGUvc3JjL25ldC90bHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIxMjZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L3Rscy5jCkBAIC0wLDAgKzEsMTc1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSBQcm90b2NvbAorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8Z3B4ZS9obWFjLmg+CisjaW5jbHVkZSA8Z3B4ZS9tZDUuaD4KKyNpbmNsdWRlIDxncHhlL3NoYTEuaD4KKyNpbmNsdWRlIDxncHhlL2Flcy5oPgorI2luY2x1ZGUgPGdweGUvcnNhLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisjaW5jbHVkZSA8Z3B4ZS9maWx0ZXIuaD4KKyNpbmNsdWRlIDxncHhlL2FzbjEuaD4KKyNpbmNsdWRlIDxncHhlL3g1MDkuaD4KKyNpbmNsdWRlIDxncHhlL3Rscy5oPgorCitzdGF0aWMgaW50IHRsc19zZW5kX3BsYWludGV4dCAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCQljb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICk7CitzdGF0aWMgdm9pZCB0bHNfY2xlYXJfY2lwaGVyICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMsCisJCQkgICAgICAgc3RydWN0IHRsc19jaXBoZXJzcGVjICpjaXBoZXJzcGVjICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBVdGlsaXR5IGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIEV4dHJhY3QgMjQtYml0IGZpZWxkIHZhbHVlCisgKgorICogQHYgZmllbGQyNAkJMjQtYml0IGZpZWxkCisgKiBAcmV0IHZhbHVlCQlGaWVsZCB2YWx1ZQorICoKKyAqIFRMUyB1c2VzIDI0LWJpdCBpbnRlZ2VycyBpbiBzZXZlcmFsIHBsYWNlcywgd2hpY2ggYXJlIGF3a3dhcmQgdG8KKyAqIHBhcnNlIGluIEMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRsc191aW50MjQgKCB1aW50OF90IGZpZWxkMjRbM10gKSB7CisJcmV0dXJuICggKCBmaWVsZDI0WzBdIDw8IDE2ICkgKyAoIGZpZWxkMjRbMV0gPDwgOCApICsgZmllbGQyNFsyXSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2xlYW51cCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBGcmVlIFRMUyBzZXNzaW9uCisgKgorICogQHYgcmVmY250CQlSZWZlcmVuY2UgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBmcmVlX3RscyAoIHN0cnVjdCByZWZjbnQgKnJlZmNudCApIHsKKwlzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscyA9CisJCWNvbnRhaW5lcl9vZiAoIHJlZmNudCwgc3RydWN0IHRsc19zZXNzaW9uLCByZWZjbnQgKTsKKworCS8qIEZyZWUgZHluYW1pY2FsbHktYWxsb2NhdGVkIHJlc291cmNlcyAqLworCXRsc19jbGVhcl9jaXBoZXIgKCB0bHMsICZ0bHMtPnR4X2NpcGhlcnNwZWMgKTsKKwl0bHNfY2xlYXJfY2lwaGVyICggdGxzLCAmdGxzLT50eF9jaXBoZXJzcGVjX3BlbmRpbmcgKTsKKwl0bHNfY2xlYXJfY2lwaGVyICggdGxzLCAmdGxzLT5yeF9jaXBoZXJzcGVjICk7CisJdGxzX2NsZWFyX2NpcGhlciAoIHRscywgJnRscy0+cnhfY2lwaGVyc3BlY19wZW5kaW5nICk7CisJeDUwOV9mcmVlX3JzYV9wdWJsaWNfa2V5ICggJnRscy0+cnNhICk7CisJZnJlZSAoIHRscy0+cnhfZGF0YSApOworCisJLyogRnJlZSBUTFMgc3RydWN0dXJlIGl0c2VsZiAqLworCWZyZWUgKCB0bHMgKTsJCit9CisKKy8qKgorICogRmluaXNoIHdpdGggVExTIHNlc3Npb24KKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAdiByYwkJU3RhdHVzIGNvZGUKKyAqLworc3RhdGljIHZvaWQgdGxzX2Nsb3NlICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMsIGludCByYyApIHsKKworCS8qIFJlbW92ZSBwcm9jZXNzICovCisJcHJvY2Vzc19kZWwgKCAmdGxzLT5wcm9jZXNzICk7CisJCisJLyogQ2xvc2UgY2lwaGVydGV4dCBhbmQgcGxhaW50ZXh0IHN0cmVhbXMgKi8KKwl4ZmVyX251bGxpZnkgKCAmdGxzLT5jaXBoZXJzdHJlYW0ueGZlciApOworCXhmZXJfY2xvc2UgKCAmdGxzLT5jaXBoZXJzdHJlYW0ueGZlciwgcmMgKTsKKwl4ZmVyX251bGxpZnkgKCAmdGxzLT5wbGFpbnN0cmVhbS54ZmVyICk7CisJeGZlcl9jbG9zZSAoICZ0bHMtPnBsYWluc3RyZWFtLnhmZXIsIHJjICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSYW5kb20gbnVtYmVyIGdlbmVyYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBHZW5lcmF0ZSByYW5kb20gZGF0YQorICoKKyAqIEB2IGRhdGEJCUJ1ZmZlciB0byBmaWxsCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgdGxzX2dlbmVyYXRlX3JhbmRvbSAoIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJLyogRklYTUU6IFNvbWUgcmVhbCByYW5kb20gZGF0YSBzb3VyY2Ugd291bGQgYmUgbmljZS4uLiAqLworCW1lbXNldCAoIGRhdGEsIDB4MDEsIGxlbiApOworfQorCisvKioKKyAqIFVwZGF0ZSBITUFDIHdpdGggYSBsaXN0IG9mICggZGF0YSwgbGVuICkgcGFpcnMKKyAqCisgKiBAdiBkaWdlc3QJCUhhc2ggZnVuY3Rpb24gdG8gdXNlCisgKiBAdiBkaWdlc3RfY3R4CURpZ2VzdCBjb250ZXh0CisgKiBAdiBhcmdzCQkoIGRhdGEsIGxlbiApIHBhaXJzIG9mIGRhdGEsIHRlcm1pbmF0ZWQgYnkgTlVMTAorICovCitzdGF0aWMgdm9pZCB0bHNfaG1hY191cGRhdGVfdmEgKCBzdHJ1Y3QgZGlnZXN0X2FsZ29yaXRobSAqZGlnZXN0LAorCQkJCSB2b2lkICpkaWdlc3RfY3R4LCB2YV9saXN0IGFyZ3MgKSB7CisJdm9pZCAqZGF0YTsKKwlzaXplX3QgbGVuOworCisJd2hpbGUgKCAoIGRhdGEgPSB2YV9hcmcgKCBhcmdzLCB2b2lkICogKSApICkgeworCQlsZW4gPSB2YV9hcmcgKCBhcmdzLCBzaXplX3QgKTsKKwkJaG1hY191cGRhdGUgKCBkaWdlc3QsIGRpZ2VzdF9jdHgsIGRhdGEsIGxlbiApOworCX0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBzZWN1cmUgcHNldWRvLXJhbmRvbSBkYXRhIHVzaW5nIGEgc2luZ2xlIGhhc2ggZnVuY3Rpb24KKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAdiBkaWdlc3QJCUhhc2ggZnVuY3Rpb24gdG8gdXNlCisgKiBAdiBzZWNyZXQJCVNlY3JldAorICogQHYgc2VjcmV0X2xlbglMZW5ndGggb2Ygc2VjcmV0CisgKiBAdiBvdXQJCU91dHB1dCBidWZmZXIKKyAqIEB2IG91dF9sZW4JCUxlbmd0aCBvZiBvdXRwdXQgYnVmZmVyCisgKiBAdiBzZWVkcwkJKCBkYXRhLCBsZW4gKSBwYWlycyBvZiBzZWVkIGRhdGEsIHRlcm1pbmF0ZWQgYnkgTlVMTAorICovCitzdGF0aWMgdm9pZCB0bHNfcF9oYXNoX3ZhICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMsCisJCQkgICAgc3RydWN0IGRpZ2VzdF9hbGdvcml0aG0gKmRpZ2VzdCwKKwkJCSAgICB2b2lkICpzZWNyZXQsIHNpemVfdCBzZWNyZXRfbGVuLAorCQkJICAgIHZvaWQgKm91dCwgc2l6ZV90IG91dF9sZW4sCisJCQkgICAgdmFfbGlzdCBzZWVkcyApIHsKKwl1aW50OF90IHNlY3JldF9jb3B5W3NlY3JldF9sZW5dOworCXVpbnQ4X3QgZGlnZXN0X2N0eFtkaWdlc3QtPmN0eHNpemVdOworCXVpbnQ4X3QgZGlnZXN0X2N0eF9wYXJ0aWFsW2RpZ2VzdC0+Y3R4c2l6ZV07CisJdWludDhfdCBhW2RpZ2VzdC0+ZGlnZXN0c2l6ZV07CisJdWludDhfdCBvdXRfdG1wW2RpZ2VzdC0+ZGlnZXN0c2l6ZV07CisJc2l6ZV90IGZyYWdfbGVuID0gZGlnZXN0LT5kaWdlc3RzaXplOworCXZhX2xpc3QgdG1wOworCisJLyogQ29weSB0aGUgc2VjcmV0LCBpbiBjYXNlIEhNQUMgbW9kaWZpZXMgaXQgKi8KKwltZW1jcHkgKCBzZWNyZXRfY29weSwgc2VjcmV0LCBzZWNyZXRfbGVuICk7CisJc2VjcmV0ID0gc2VjcmV0X2NvcHk7CisJREJHQzIgKCB0bHMsICJUTFMgJXAgJXMgc2VjcmV0OlxuIiwgdGxzLCBkaWdlc3QtPm5hbWUgKTsKKwlEQkdDMl9IRCAoIHRscywgc2VjcmV0LCBzZWNyZXRfbGVuICk7CisKKwkvKiBDYWxjdWxhdGUgQSgxKSAqLworCWhtYWNfaW5pdCAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwgc2VjcmV0LCAmc2VjcmV0X2xlbiApOworCXZhX2NvcHkgKCB0bXAsIHNlZWRzICk7CisJdGxzX2htYWNfdXBkYXRlX3ZhICggZGlnZXN0LCBkaWdlc3RfY3R4LCB0bXAgKTsKKwl2YV9lbmQgKCB0bXAgKTsKKwlobWFjX2ZpbmFsICggZGlnZXN0LCBkaWdlc3RfY3R4LCBzZWNyZXQsICZzZWNyZXRfbGVuLCBhICk7CisJREJHQzIgKCB0bHMsICJUTFMgJXAgJXMgQSgxKTpcbiIsIHRscywgZGlnZXN0LT5uYW1lICk7CisJREJHQzJfSEQgKCB0bHMsICZhLCBzaXplb2YgKCBhICkgKTsKKworCS8qIEdlbmVyYXRlIGFzIG11Y2ggZGF0YSBhcyByZXF1aXJlZCAqLworCXdoaWxlICggb3V0X2xlbiApIHsKKwkJLyogQ2FsY3VsYXRlIG91dHB1dCBwb3J0aW9uICovCisJCWhtYWNfaW5pdCAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwgc2VjcmV0LCAmc2VjcmV0X2xlbiApOworCQlobWFjX3VwZGF0ZSAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwgYSwgc2l6ZW9mICggYSApICk7CisJCW1lbWNweSAoIGRpZ2VzdF9jdHhfcGFydGlhbCwgZGlnZXN0X2N0eCwgZGlnZXN0LT5jdHhzaXplICk7CisJCXZhX2NvcHkgKCB0bXAsIHNlZWRzICk7CisJCXRsc19obWFjX3VwZGF0ZV92YSAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwgdG1wICk7CisJCXZhX2VuZCAoIHRtcCApOworCQlobWFjX2ZpbmFsICggZGlnZXN0LCBkaWdlc3RfY3R4LAorCQkJICAgICBzZWNyZXQsICZzZWNyZXRfbGVuLCBvdXRfdG1wICk7CisKKwkJLyogQ29weSBvdXRwdXQgKi8KKwkJaWYgKCBmcmFnX2xlbiA+IG91dF9sZW4gKQorCQkJZnJhZ19sZW4gPSBvdXRfbGVuOworCQltZW1jcHkgKCBvdXQsIG91dF90bXAsIGZyYWdfbGVuICk7CisJCURCR0MyICggdGxzLCAiVExTICVwICVzIG91dHB1dDpcbiIsIHRscywgZGlnZXN0LT5uYW1lICk7CisJCURCR0MyX0hEICggdGxzLCBvdXQsIGZyYWdfbGVuICk7CisKKwkJLyogQ2FsY3VsYXRlIEEoaSkgKi8KKwkJaG1hY19maW5hbCAoIGRpZ2VzdCwgZGlnZXN0X2N0eF9wYXJ0aWFsLAorCQkJICAgICBzZWNyZXQsICZzZWNyZXRfbGVuLCBhICk7CisJCURCR0MyICggdGxzLCAiVExTICVwICVzIEEobik6XG4iLCB0bHMsIGRpZ2VzdC0+bmFtZSApOworCQlEQkdDMl9IRCAoIHRscywgJmEsIHNpemVvZiAoIGEgKSApOworCisJCW91dCArPSBmcmFnX2xlbjsKKwkJb3V0X2xlbiAtPSBmcmFnX2xlbjsKKwl9Cit9CisKKy8qKgorICogR2VuZXJhdGUgc2VjdXJlIHBzZXVkby1yYW5kb20gZGF0YQorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IHNlY3JldAkJU2VjcmV0CisgKiBAdiBzZWNyZXRfbGVuCUxlbmd0aCBvZiBzZWNyZXQKKyAqIEB2IG91dAkJT3V0cHV0IGJ1ZmZlcgorICogQHYgb3V0X2xlbgkJTGVuZ3RoIG9mIG91dHB1dCBidWZmZXIKKyAqIEB2IC4uLgkJKCBkYXRhLCBsZW4gKSBwYWlycyBvZiBzZWVkIGRhdGEsIHRlcm1pbmF0ZWQgYnkgTlVMTAorICovCitzdGF0aWMgdm9pZCB0bHNfcHJmICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMsIHZvaWQgKnNlY3JldCwgc2l6ZV90IHNlY3JldF9sZW4sCisJCSAgICAgIHZvaWQgKm91dCwgc2l6ZV90IG91dF9sZW4sIC4uLiApIHsKKwl2YV9saXN0IHNlZWRzOworCXZhX2xpc3QgdG1wOworCXNpemVfdCBzdWJzZWNyZXRfbGVuOworCXZvaWQgKm1kNV9zZWNyZXQ7CisJdm9pZCAqc2hhMV9zZWNyZXQ7CisJdWludDhfdCBvdXRfbWQ1W291dF9sZW5dOworCXVpbnQ4X3Qgb3V0X3NoYTFbb3V0X2xlbl07CisJdW5zaWduZWQgaW50IGk7CisKKwl2YV9zdGFydCAoIHNlZWRzLCBvdXRfbGVuICk7CisKKwkvKiBTcGxpdCBzZWNyZXQgaW50byB0d28sIHdpdGggYW4gb3ZlcmxhcCBvZiB1cCB0byBvbmUgYnl0ZSAqLworCXN1YnNlY3JldF9sZW4gPSAoICggc2VjcmV0X2xlbiArIDEgKSAvIDIgKTsKKwltZDVfc2VjcmV0ID0gc2VjcmV0OworCXNoYTFfc2VjcmV0ID0gKCBzZWNyZXQgKyBzZWNyZXRfbGVuIC0gc3Vic2VjcmV0X2xlbiApOworCisJLyogQ2FsY3VsYXRlIE1ENSBwb3J0aW9uICovCisJdmFfY29weSAoIHRtcCwgc2VlZHMgKTsKKwl0bHNfcF9oYXNoX3ZhICggdGxzLCAmbWQ1X2FsZ29yaXRobSwgbWQ1X3NlY3JldCwgc3Vic2VjcmV0X2xlbiwKKwkJCW91dF9tZDUsIG91dF9sZW4sIHNlZWRzICk7CisJdmFfZW5kICggdG1wICk7CisKKwkvKiBDYWxjdWxhdGUgU0hBMSBwb3J0aW9uICovCisJdmFfY29weSAoIHRtcCwgc2VlZHMgKTsKKwl0bHNfcF9oYXNoX3ZhICggdGxzLCAmc2hhMV9hbGdvcml0aG0sIHNoYTFfc2VjcmV0LCBzdWJzZWNyZXRfbGVuLAorCQkJb3V0X3NoYTEsIG91dF9sZW4sIHNlZWRzICk7CisJdmFfZW5kICggdG1wICk7CisKKwkvKiBYT1IgdGhlIHR3byBwb3J0aW9ucyB0b2dldGhlciBpbnRvIHRoZSBmaW5hbCBvdXRwdXQgYnVmZmVyICovCisJZm9yICggaSA9IDAgOyBpIDwgb3V0X2xlbiA7IGkrKyApIHsKKwkJKiggKCB1aW50OF90ICogKSBvdXQgKyBpICkgPSAoIG91dF9tZDVbaV0gXiBvdXRfc2hhMVtpXSApOworCX0KKworCXZhX2VuZCAoIHNlZWRzICk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc2VjdXJlIHBzZXVkby1yYW5kb20gZGF0YQorICoKKyAqIEB2IHNlY3JldAkJU2VjcmV0CisgKiBAdiBzZWNyZXRfbGVuCUxlbmd0aCBvZiBzZWNyZXQKKyAqIEB2IG91dAkJT3V0cHV0IGJ1ZmZlcgorICogQHYgb3V0X2xlbgkJTGVuZ3RoIG9mIG91dHB1dCBidWZmZXIKKyAqIEB2IGxhYmVsCQlTdHJpbmcgbGl0ZXJhbCBsYWJlbAorICogQHYgLi4uCQkoIGRhdGEsIGxlbiApIHBhaXJzIG9mIHNlZWQgZGF0YQorICovCisjZGVmaW5lIHRsc19wcmZfbGFiZWwoIHRscywgc2VjcmV0LCBzZWNyZXRfbGVuLCBvdXQsIG91dF9sZW4sIGxhYmVsLCAuLi4gKSBcCisJdGxzX3ByZiAoICh0bHMpLCAoc2VjcmV0KSwgKHNlY3JldF9sZW4pLCAob3V0KSwgKG91dF9sZW4pLAkgICBcCisJCSAgbGFiZWwsICggc2l6ZW9mICggbGFiZWwgKSAtIDEgKSwgX19WQV9BUkdTX18sIE5VTEwgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2VjcmV0IG1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBHZW5lcmF0ZSBtYXN0ZXIgc2VjcmV0CisgKgorICogQHYgdGxzCQlUTFMgc2Vzc2lvbgorICoKKyAqIFRoZSBwcmUtbWFzdGVyIHNlY3JldCBhbmQgdGhlIGNsaWVudCBhbmQgc2VydmVyIHJhbmRvbSB2YWx1ZXMgbXVzdAorICogYWxyZWFkeSBiZSBrbm93bi4KKyAqLworc3RhdGljIHZvaWQgdGxzX2dlbmVyYXRlX21hc3Rlcl9zZWNyZXQgKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscyApIHsKKwlEQkdDICggdGxzLCAiVExTICVwIHByZS1tYXN0ZXItc2VjcmV0OlxuIiwgdGxzICk7CisJREJHQ19IRCAoIHRscywgJnRscy0+cHJlX21hc3Rlcl9zZWNyZXQsCisJCSAgc2l6ZW9mICggdGxzLT5wcmVfbWFzdGVyX3NlY3JldCApICk7CisJREJHQyAoIHRscywgIlRMUyAlcCBjbGllbnQgcmFuZG9tIGJ5dGVzOlxuIiwgdGxzICk7CisJREJHQ19IRCAoIHRscywgJnRscy0+Y2xpZW50X3JhbmRvbSwgc2l6ZW9mICggdGxzLT5jbGllbnRfcmFuZG9tICkgKTsKKwlEQkdDICggdGxzLCAiVExTICVwIHNlcnZlciByYW5kb20gYnl0ZXM6XG4iLCB0bHMgKTsKKwlEQkdDX0hEICggdGxzLCAmdGxzLT5zZXJ2ZXJfcmFuZG9tLCBzaXplb2YgKCB0bHMtPnNlcnZlcl9yYW5kb20gKSApOworCisJdGxzX3ByZl9sYWJlbCAoIHRscywgJnRscy0+cHJlX21hc3Rlcl9zZWNyZXQsCisJCQlzaXplb2YgKCB0bHMtPnByZV9tYXN0ZXJfc2VjcmV0ICksCisJCQkmdGxzLT5tYXN0ZXJfc2VjcmV0LCBzaXplb2YgKCB0bHMtPm1hc3Rlcl9zZWNyZXQgKSwKKwkJCSJtYXN0ZXIgc2VjcmV0IiwKKwkJCSZ0bHMtPmNsaWVudF9yYW5kb20sIHNpemVvZiAoIHRscy0+Y2xpZW50X3JhbmRvbSApLAorCQkJJnRscy0+c2VydmVyX3JhbmRvbSwgc2l6ZW9mICggdGxzLT5zZXJ2ZXJfcmFuZG9tICkgKTsKKworCURCR0MgKCB0bHMsICJUTFMgJXAgZ2VuZXJhdGVkIG1hc3RlciBzZWNyZXQ6XG4iLCB0bHMgKTsKKwlEQkdDX0hEICggdGxzLCAmdGxzLT5tYXN0ZXJfc2VjcmV0LCBzaXplb2YgKCB0bHMtPm1hc3Rlcl9zZWNyZXQgKSApOworfQorCisvKioKKyAqIEdlbmVyYXRlIGtleSBtYXRlcmlhbAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqCisgKiBUaGUgbWFzdGVyIHNlY3JldCBtdXN0IGFscmVhZHkgYmUga25vd24uCisgKi8KK3N0YXRpYyBpbnQgdGxzX2dlbmVyYXRlX2tleXMgKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscyApIHsKKwlzdHJ1Y3QgdGxzX2NpcGhlcnNwZWMgKnR4X2NpcGhlcnNwZWMgPSAmdGxzLT50eF9jaXBoZXJzcGVjX3BlbmRpbmc7CisJc3RydWN0IHRsc19jaXBoZXJzcGVjICpyeF9jaXBoZXJzcGVjID0gJnRscy0+cnhfY2lwaGVyc3BlY19wZW5kaW5nOworCXNpemVfdCBoYXNoX3NpemUgPSB0eF9jaXBoZXJzcGVjLT5kaWdlc3QtPmRpZ2VzdHNpemU7CisJc2l6ZV90IGtleV9zaXplID0gdHhfY2lwaGVyc3BlYy0+a2V5X2xlbjsKKwlzaXplX3QgaXZfc2l6ZSA9IHR4X2NpcGhlcnNwZWMtPmNpcGhlci0+YmxvY2tzaXplOworCXNpemVfdCB0b3RhbCA9ICggMiAqICggaGFzaF9zaXplICsga2V5X3NpemUgKyBpdl9zaXplICkgKTsKKwl1aW50OF90IGtleV9ibG9ja1t0b3RhbF07CisJdWludDhfdCAqa2V5OworCWludCByYzsKKworCS8qIEdlbmVyYXRlIGtleSBibG9jayAqLworCXRsc19wcmZfbGFiZWwgKCB0bHMsICZ0bHMtPm1hc3Rlcl9zZWNyZXQsIHNpemVvZiAoIHRscy0+bWFzdGVyX3NlY3JldCApLAorCQkJa2V5X2Jsb2NrLCBzaXplb2YgKCBrZXlfYmxvY2sgKSwgImtleSBleHBhbnNpb24iLAorCQkJJnRscy0+c2VydmVyX3JhbmRvbSwgc2l6ZW9mICggdGxzLT5zZXJ2ZXJfcmFuZG9tICksCisJCQkmdGxzLT5jbGllbnRfcmFuZG9tLCBzaXplb2YgKCB0bHMtPmNsaWVudF9yYW5kb20gKSApOworCisJLyogU3BsaXQga2V5IGJsb2NrIGludG8gcG9ydGlvbnMgKi8KKwlrZXkgPSBrZXlfYmxvY2s7CisKKwkvKiBUWCBNQUMgc2VjcmV0ICovCisJbWVtY3B5ICggdHhfY2lwaGVyc3BlYy0+bWFjX3NlY3JldCwga2V5LCBoYXNoX3NpemUgKTsKKwlEQkdDICggdGxzLCAiVExTICVwIFRYIE1BQyBzZWNyZXQ6XG4iLCB0bHMgKTsKKwlEQkdDX0hEICggdGxzLCBrZXksIGhhc2hfc2l6ZSApOworCWtleSArPSBoYXNoX3NpemU7CisKKwkvKiBSWCBNQUMgc2VjcmV0ICovCisJbWVtY3B5ICggcnhfY2lwaGVyc3BlYy0+bWFjX3NlY3JldCwga2V5LCBoYXNoX3NpemUgKTsKKwlEQkdDICggdGxzLCAiVExTICVwIFJYIE1BQyBzZWNyZXQ6XG4iLCB0bHMgKTsKKwlEQkdDX0hEICggdGxzLCBrZXksIGhhc2hfc2l6ZSApOworCWtleSArPSBoYXNoX3NpemU7CisKKwkvKiBUWCBrZXkgKi8KKwlpZiAoICggcmMgPSBjaXBoZXJfc2V0a2V5ICggdHhfY2lwaGVyc3BlYy0+Y2lwaGVyLAorCQkJCSAgICB0eF9jaXBoZXJzcGVjLT5jaXBoZXJfY3R4LAorCQkJCSAgICBrZXksIGtleV9zaXplICkgKSAhPSAwICkgeworCQlEQkdDICggdGxzLCAiVExTICVwIGNvdWxkIG5vdCBzZXQgVFgga2V5OiAlc1xuIiwKKwkJICAgICAgIHRscywgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisJREJHQyAoIHRscywgIlRMUyAlcCBUWCBrZXk6XG4iLCB0bHMgKTsKKwlEQkdDX0hEICggdGxzLCBrZXksIGtleV9zaXplICk7CisJa2V5ICs9IGtleV9zaXplOworCisJLyogUlgga2V5ICovCisJaWYgKCAoIHJjID0gY2lwaGVyX3NldGtleSAoIHJ4X2NpcGhlcnNwZWMtPmNpcGhlciwKKwkJCQkgICAgcnhfY2lwaGVyc3BlYy0+Y2lwaGVyX2N0eCwKKwkJCQkgICAga2V5LCBrZXlfc2l6ZSApICkgIT0gMCApIHsKKwkJREJHQyAoIHRscywgIlRMUyAlcCBjb3VsZCBub3Qgc2V0IFRYIGtleTogJXNcbiIsCisJCSAgICAgICB0bHMsIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCURCR0MgKCB0bHMsICJUTFMgJXAgUlgga2V5OlxuIiwgdGxzICk7CisJREJHQ19IRCAoIHRscywga2V5LCBrZXlfc2l6ZSApOworCWtleSArPSBrZXlfc2l6ZTsKKworCS8qIFRYIGluaXRpYWxpc2F0aW9uIHZlY3RvciAqLworCWNpcGhlcl9zZXRpdiAoIHR4X2NpcGhlcnNwZWMtPmNpcGhlciwgdHhfY2lwaGVyc3BlYy0+Y2lwaGVyX2N0eCwga2V5ICk7CisJREJHQyAoIHRscywgIlRMUyAlcCBUWCBJVjpcbiIsIHRscyApOworCURCR0NfSEQgKCB0bHMsIGtleSwgaXZfc2l6ZSApOworCWtleSArPSBpdl9zaXplOworCisJLyogUlggaW5pdGlhbGlzYXRpb24gdmVjdG9yICovCisJY2lwaGVyX3NldGl2ICggcnhfY2lwaGVyc3BlYy0+Y2lwaGVyLCByeF9jaXBoZXJzcGVjLT5jaXBoZXJfY3R4LCBrZXkgKTsKKwlEQkdDICggdGxzLCAiVExTICVwIFJYIElWOlxuIiwgdGxzICk7CisJREJHQ19IRCAoIHRscywga2V5LCBpdl9zaXplICk7CisJa2V5ICs9IGl2X3NpemU7CisKKwlhc3NlcnQgKCAoIGtleV9ibG9jayArIHRvdGFsICkgPT0ga2V5ICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENpcGhlciBzdWl0ZSBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQ2xlYXIgY2lwaGVyIHN1aXRlCisgKgorICogQHYgY2lwaGVyc3BlYwlUTFMgY2lwaGVyIHNwZWNpZmljYXRpb24KKyAqLworc3RhdGljIHZvaWQgdGxzX2NsZWFyX2NpcGhlciAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzIF9fdW51c2VkLAorCQkJICAgICAgIHN0cnVjdCB0bHNfY2lwaGVyc3BlYyAqY2lwaGVyc3BlYyApIHsKKwlmcmVlICggY2lwaGVyc3BlYy0+ZHluYW1pYyApOworCW1lbXNldCAoIGNpcGhlcnNwZWMsIDAsIHNpemVvZiAoIGNpcGhlcnNwZWMgKSApOworCWNpcGhlcnNwZWMtPnB1YmtleSA9ICZwdWJrZXlfbnVsbDsKKwljaXBoZXJzcGVjLT5jaXBoZXIgPSAmY2lwaGVyX251bGw7CisJY2lwaGVyc3BlYy0+ZGlnZXN0ID0gJmRpZ2VzdF9udWxsOworfQorCisvKioKKyAqIFNldCBjaXBoZXIgc3VpdGUKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAdiBjaXBoZXJzcGVjCVRMUyBjaXBoZXIgc3BlY2lmaWNhdGlvbgorICogQHYgcHVia2V5CQlQdWJsaWMta2V5IGVuY3J5cHRpb24gZWxnb3JpdGhtCisgKiBAdiBjaXBoZXIJCUJ1bGsgZW5jcnlwdGlvbiBjaXBoZXIgYWxnb3JpdGhtCisgKiBAdiBkaWdlc3QJCU1BQyBkaWdlc3QgYWxnb3JpdGhtCisgKiBAdiBrZXlfbGVuCQlLZXkgbGVuZ3RoCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfc2V0X2NpcGhlciAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzLAorCQkJICAgIHN0cnVjdCB0bHNfY2lwaGVyc3BlYyAqY2lwaGVyc3BlYywKKwkJCSAgICBzdHJ1Y3QgcHVia2V5X2FsZ29yaXRobSAqcHVia2V5LAorCQkJICAgIHN0cnVjdCBjaXBoZXJfYWxnb3JpdGhtICpjaXBoZXIsCisJCQkgICAgc3RydWN0IGRpZ2VzdF9hbGdvcml0aG0gKmRpZ2VzdCwKKwkJCSAgICBzaXplX3Qga2V5X2xlbiApIHsKKwlzaXplX3QgdG90YWw7CisJdm9pZCAqZHluYW1pYzsKKworCS8qIENsZWFyIG91dCBvbGQgY2lwaGVyIGNvbnRlbnRzLCBpZiBhbnkgKi8KKwl0bHNfY2xlYXJfY2lwaGVyICggdGxzLCBjaXBoZXJzcGVjICk7CisJCisJLyogQWxsb2NhdGUgZHluYW1pYyBzdG9yYWdlICovCisJdG90YWwgPSAoIHB1YmtleS0+Y3R4c2l6ZSArIDIgKiBjaXBoZXItPmN0eHNpemUgKyBkaWdlc3QtPmRpZ2VzdHNpemUgKTsKKwlkeW5hbWljID0gbWFsbG9jICggdG90YWwgKTsKKwlpZiAoICEgZHluYW1pYyApIHsKKwkJREJHQyAoIHRscywgIlRMUyAlcCBjb3VsZCBub3QgYWxsb2NhdGUgJXpkIGJ5dGVzIGZvciBjcnlwdG8gIgorCQkgICAgICAgImNvbnRleHRcbiIsIHRscywgdG90YWwgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCAoIGR5bmFtaWMsIDAsIHRvdGFsICk7CisKKwkvKiBBc3NpZ24gc3RvcmFnZSAqLworCWNpcGhlcnNwZWMtPmR5bmFtaWMgPSBkeW5hbWljOworCWNpcGhlcnNwZWMtPnB1YmtleV9jdHggPSBkeW5hbWljOwlkeW5hbWljICs9IHB1YmtleS0+Y3R4c2l6ZTsKKwljaXBoZXJzcGVjLT5jaXBoZXJfY3R4ID0gZHluYW1pYzsJZHluYW1pYyArPSBjaXBoZXItPmN0eHNpemU7CisJY2lwaGVyc3BlYy0+Y2lwaGVyX25leHRfY3R4ID0gZHluYW1pYzsJZHluYW1pYyArPSBjaXBoZXItPmN0eHNpemU7CisJY2lwaGVyc3BlYy0+bWFjX3NlY3JldCA9IGR5bmFtaWM7CWR5bmFtaWMgKz0gZGlnZXN0LT5kaWdlc3RzaXplOworCWFzc2VydCAoICggY2lwaGVyc3BlYy0+ZHluYW1pYyArIHRvdGFsICkgPT0gZHluYW1pYyApOworCisJLyogU3RvcmUgcGFyYW1ldGVycyAqLworCWNpcGhlcnNwZWMtPnB1YmtleSA9IHB1YmtleTsKKwljaXBoZXJzcGVjLT5jaXBoZXIgPSBjaXBoZXI7CisJY2lwaGVyc3BlYy0+ZGlnZXN0ID0gZGlnZXN0OworCWNpcGhlcnNwZWMtPmtleV9sZW4gPSBrZXlfbGVuOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2VsZWN0IG5leHQgY2lwaGVyIHN1aXRlCisgKgorICogQHYgdGxzCQlUTFMgc2Vzc2lvbgorICogQHYgY2lwaGVyX3N1aXRlCUNpcGhlciBzdWl0ZSBzcGVjaWZpY2F0aW9uCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfc2VsZWN0X2NpcGhlciAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjaXBoZXJfc3VpdGUgKSB7CisJc3RydWN0IHB1YmtleV9hbGdvcml0aG0gKnB1YmtleSA9ICZwdWJrZXlfbnVsbDsKKwlzdHJ1Y3QgY2lwaGVyX2FsZ29yaXRobSAqY2lwaGVyID0gJmNpcGhlcl9udWxsOworCXN0cnVjdCBkaWdlc3RfYWxnb3JpdGhtICpkaWdlc3QgPSAmZGlnZXN0X251bGw7CisJdW5zaWduZWQgaW50IGtleV9sZW4gPSAwOworCWludCByYzsKKworCXN3aXRjaCAoIGNpcGhlcl9zdWl0ZSApIHsKKwljYXNlIGh0b25zICggVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSApOgorCQlrZXlfbGVuID0gKCAxMjggLyA4ICk7CisJCWNpcGhlciA9ICZhZXNfY2JjX2FsZ29yaXRobTsKKwkJZGlnZXN0ID0gJnNoYTFfYWxnb3JpdGhtOworCQlicmVhazsKKwljYXNlIGh0b25zICggVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSApOgorCQlrZXlfbGVuID0gKCAyNTYgLyA4ICk7CisJCWNpcGhlciA9ICZhZXNfY2JjX2FsZ29yaXRobTsKKwkJZGlnZXN0ID0gJnNoYTFfYWxnb3JpdGhtOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdDICggdGxzLCAiVExTICVwIGRvZXMgbm90IHN1cHBvcnQgY2lwaGVyICUwNHhcbiIsCisJCSAgICAgICB0bHMsIG50b2hzICggY2lwaGVyX3N1aXRlICkgKTsKKwkJcmV0dXJuIC1FTk9UU1VQOworCX0KKworCS8qIFNldCBjaXBoZXJzICovCisJaWYgKCAoIHJjID0gdGxzX3NldF9jaXBoZXIgKCB0bHMsICZ0bHMtPnR4X2NpcGhlcnNwZWNfcGVuZGluZywgcHVia2V5LAorCQkJCSAgICAgY2lwaGVyLCBkaWdlc3QsIGtleV9sZW4gKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJaWYgKCAoIHJjID0gdGxzX3NldF9jaXBoZXIgKCB0bHMsICZ0bHMtPnJ4X2NpcGhlcnNwZWNfcGVuZGluZywgcHVia2V5LAorCQkJCSAgICAgY2lwaGVyLCBkaWdlc3QsIGtleV9sZW4gKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwlEQkdDICggdGxzLCAiVExTICVwIHNlbGVjdGVkICVzLSVzLSVkLSVzXG4iLCB0bHMsCisJICAgICAgIHB1YmtleS0+bmFtZSwgY2lwaGVyLT5uYW1lLCAoIGtleV9sZW4gKiA4ICksIGRpZ2VzdC0+bmFtZSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQWN0aXZhdGUgbmV4dCBjaXBoZXIgc3VpdGUKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAdiBwZW5kaW5nCQlQZW5kaW5nIGNpcGhlciBzcGVjaWZpY2F0aW9uCisgKiBAdiBhY3RpdmUJCUFjdGl2ZSBjaXBoZXIgc3BlY2lmaWNhdGlvbiB0byByZXBsYWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfY2hhbmdlX2NpcGhlciAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzLAorCQkJICAgICAgIHN0cnVjdCB0bHNfY2lwaGVyc3BlYyAqcGVuZGluZywKKwkJCSAgICAgICBzdHJ1Y3QgdGxzX2NpcGhlcnNwZWMgKmFjdGl2ZSApIHsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggLyogRklYTUUgKHdoZW4gcHVia2V5IGlzIG5vdCBoYXJkLWNvZGVkIHRvIFJTQSk6CisJICAgICAgKiAoIHBlbmRpbmctPnB1YmtleSA9PSAmcHVia2V5X251bGwgKSB8fCAqLworCSAgICAgKCBwZW5kaW5nLT5jaXBoZXIgPT0gJmNpcGhlcl9udWxsICkgfHwKKwkgICAgICggcGVuZGluZy0+ZGlnZXN0ID09ICZkaWdlc3RfbnVsbCApICkgeworCQlEQkdDICggdGxzLCAiVExTICVwIHJlZnVzaW5nIHRvIHVzZSBudWxsIGNpcGhlclxuIiwgdGxzICk7CisJCXJldHVybiAtRU5PVFNVUDsKKwl9CisKKwl0bHNfY2xlYXJfY2lwaGVyICggdGxzLCBhY3RpdmUgKTsKKwltZW1zd2FwICggYWN0aXZlLCBwZW5kaW5nLCBzaXplb2YgKCAqYWN0aXZlICkgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEhhbmRzaGFrZSB2ZXJpZmljYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBBZGQgaGFuZHNoYWtlIHJlY29yZCB0byB2ZXJpZmljYXRpb24gaGFzaAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IGRhdGEJCUhhbmRzaGFrZSByZWNvcmQKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGhhbmRzaGFrZSByZWNvcmQKKyAqLworc3RhdGljIHZvaWQgdGxzX2FkZF9oYW5kc2hha2UgKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscywKKwkJCQljb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCisJZGlnZXN0X3VwZGF0ZSAoICZtZDVfYWxnb3JpdGhtLCB0bHMtPmhhbmRzaGFrZV9tZDVfY3R4LCBkYXRhLCBsZW4gKTsKKwlkaWdlc3RfdXBkYXRlICggJnNoYTFfYWxnb3JpdGhtLCB0bHMtPmhhbmRzaGFrZV9zaGExX2N0eCwgZGF0YSwgbGVuICk7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIGhhbmRzaGFrZSB2ZXJpZmljYXRpb24gaGFzaAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IG91dAkJT3V0cHV0IGJ1ZmZlcgorICoKKyAqIENhbGN1bGF0ZXMgdGhlIE1ENStTSEExIGRpZ2VzdCBvdmVyIGFsbCBoYW5kc2hha2UgbWVzc2FnZXMgc2VlbiBzbworICogZmFyLgorICovCitzdGF0aWMgdm9pZCB0bHNfdmVyaWZ5X2hhbmRzaGFrZSAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzLCB2b2lkICpvdXQgKSB7CisJc3RydWN0IGRpZ2VzdF9hbGdvcml0aG0gKm1kNSA9ICZtZDVfYWxnb3JpdGhtOworCXN0cnVjdCBkaWdlc3RfYWxnb3JpdGhtICpzaGExID0gJnNoYTFfYWxnb3JpdGhtOworCXVpbnQ4X3QgbWQ1X2N0eFttZDUtPmN0eHNpemVdOworCXVpbnQ4X3Qgc2hhMV9jdHhbc2hhMS0+Y3R4c2l6ZV07CisJdm9pZCAqbWQ1X2RpZ2VzdCA9IG91dDsKKwl2b2lkICpzaGExX2RpZ2VzdCA9ICggb3V0ICsgbWQ1LT5kaWdlc3RzaXplICk7CisKKwltZW1jcHkgKCBtZDVfY3R4LCB0bHMtPmhhbmRzaGFrZV9tZDVfY3R4LCBzaXplb2YgKCBtZDVfY3R4ICkgKTsKKwltZW1jcHkgKCBzaGExX2N0eCwgdGxzLT5oYW5kc2hha2Vfc2hhMV9jdHgsIHNpemVvZiAoIHNoYTFfY3R4ICkgKTsKKwlkaWdlc3RfZmluYWwgKCBtZDUsIG1kNV9jdHgsIG1kNV9kaWdlc3QgKTsKKwlkaWdlc3RfZmluYWwgKCBzaGExLCBzaGExX2N0eCwgc2hhMV9kaWdlc3QgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlY29yZCBoYW5kbGluZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFRyYW5zbWl0IEhhbmRzaGFrZSByZWNvcmQKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAdiBkYXRhCQlQbGFpbnRleHQgcmVjb3JkCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBwbGFpbnRleHQgcmVjb3JkCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfc2VuZF9oYW5kc2hha2UgKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscywKKwkJCQl2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCisJLyogQWRkIHRvIGhhbmRzaGFrZSBkaWdlc3QgKi8KKwl0bHNfYWRkX2hhbmRzaGFrZSAoIHRscywgZGF0YSwgbGVuICk7CisKKwkvKiBTZW5kIHJlY29yZCAqLworCXJldHVybiB0bHNfc2VuZF9wbGFpbnRleHQgKCB0bHMsIFRMU19UWVBFX0hBTkRTSEFLRSwgZGF0YSwgbGVuICk7Cit9CisKKy8qKgorICogVHJhbnNtaXQgQ2xpZW50IEhlbGxvIHJlY29yZAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRsc19zZW5kX2NsaWVudF9oZWxsbyAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzICkgeworCXN0cnVjdCB7CisJCXVpbnQzMl90IHR5cGVfbGVuZ3RoOworCQl1aW50MTZfdCB2ZXJzaW9uOworCQl1aW50OF90IHJhbmRvbVszMl07CisJCXVpbnQ4X3Qgc2Vzc2lvbl9pZF9sZW47CisJCXVpbnQxNl90IGNpcGhlcl9zdWl0ZV9sZW47CisJCXVpbnQxNl90IGNpcGhlcl9zdWl0ZXNbMl07CisJCXVpbnQ4X3QgY29tcHJlc3Npb25fbWV0aG9kc19sZW47CisJCXVpbnQ4X3QgY29tcHJlc3Npb25fbWV0aG9kc1sxXTsKKwl9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpIGhlbGxvOworCisJbWVtc2V0ICggJmhlbGxvLCAwLCBzaXplb2YgKCBoZWxsbyApICk7CisJaGVsbG8udHlwZV9sZW5ndGggPSAoIGNwdV90b19sZTMyICggVExTX0NMSUVOVF9IRUxMTyApIHwKKwkJCSAgICAgIGh0b25sICggc2l6ZW9mICggaGVsbG8gKSAtCisJCQkJICAgICAgc2l6ZW9mICggaGVsbG8udHlwZV9sZW5ndGggKSApICk7CisJaGVsbG8udmVyc2lvbiA9IGh0b25zICggVExTX1ZFUlNJT05fVExTXzFfMCApOworCW1lbWNweSAoICZoZWxsby5yYW5kb20sICZ0bHMtPmNsaWVudF9yYW5kb20sIHNpemVvZiAoIGhlbGxvLnJhbmRvbSApICk7CisJaGVsbG8uY2lwaGVyX3N1aXRlX2xlbiA9IGh0b25zICggc2l6ZW9mICggaGVsbG8uY2lwaGVyX3N1aXRlcyApICk7CisJaGVsbG8uY2lwaGVyX3N1aXRlc1swXSA9IGh0b25zICggVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSApOworCWhlbGxvLmNpcGhlcl9zdWl0ZXNbMV0gPSBodG9ucyAoIFRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgKTsKKwloZWxsby5jb21wcmVzc2lvbl9tZXRob2RzX2xlbiA9IHNpemVvZiAoIGhlbGxvLmNvbXByZXNzaW9uX21ldGhvZHMgKTsKKworCXJldHVybiB0bHNfc2VuZF9oYW5kc2hha2UgKCB0bHMsICZoZWxsbywgc2l6ZW9mICggaGVsbG8gKSApOworfQorCisvKioKKyAqIFRyYW5zbWl0IENsaWVudCBLZXkgRXhjaGFuZ2UgcmVjb3JkCisgKgorICogQHYgdGxzCQlUTFMgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGxzX3NlbmRfY2xpZW50X2tleV9leGNoYW5nZSAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzICkgeworCS8qIEZJWE1FOiBIYWNrIGFsZXJ0ICovCisJUlNBX0NUWCAqcnNhX2N0eDsKKwlSU0FfcHViX2tleV9uZXcgKCAmcnNhX2N0eCwgdGxzLT5yc2EubW9kdWx1cywgdGxzLT5yc2EubW9kdWx1c19sZW4sCisJCQkgIHRscy0+cnNhLmV4cG9uZW50LCB0bHMtPnJzYS5leHBvbmVudF9sZW4gKTsKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCB0eXBlX2xlbmd0aDsKKwkJdWludDE2X3QgZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0X2xlbjsKKwkJdWludDhfdCBlbmNyeXB0ZWRfcHJlX21hc3Rlcl9zZWNyZXRbcnNhX2N0eC0+bnVtX29jdGV0c107CisJfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKSBrZXlfeGNoZzsKKworCW1lbXNldCAoICZrZXlfeGNoZywgMCwgc2l6ZW9mICgga2V5X3hjaGcgKSApOworCWtleV94Y2hnLnR5cGVfbGVuZ3RoID0gKCBjcHVfdG9fbGUzMiAoIFRMU19DTElFTlRfS0VZX0VYQ0hBTkdFICkgfAorCQkJCSBodG9ubCAoIHNpemVvZiAoIGtleV94Y2hnICkgLQorCQkJCQkgc2l6ZW9mICgga2V5X3hjaGcudHlwZV9sZW5ndGggKSApICk7CisJa2V5X3hjaGcuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0X2xlbgorCQk9IGh0b25zICggc2l6ZW9mICgga2V5X3hjaGcuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0ICkgKTsKKworCS8qIEZJWE1FOiBIYWNrIGFsZXJ0ICovCisJREJHQyAoIHRscywgIlJTQSBlbmNyeXB0aW5nIHBsYWludGV4dCwgbW9kdWx1cywgZXhwb25lbnQ6XG4iICk7CisJREJHQ19IRCAoIHRscywgJnRscy0+cHJlX21hc3Rlcl9zZWNyZXQsCisJCSAgc2l6ZW9mICggdGxzLT5wcmVfbWFzdGVyX3NlY3JldCApICk7CisJREJHQ19IRCAoIHRscywgdGxzLT5yc2EubW9kdWx1cywgdGxzLT5yc2EubW9kdWx1c19sZW4gKTsKKwlEQkdDX0hEICggdGxzLCB0bHMtPnJzYS5leHBvbmVudCwgdGxzLT5yc2EuZXhwb25lbnRfbGVuICk7CisJUlNBX2VuY3J5cHQgKCByc2FfY3R4LCAoIGNvbnN0IHVpbnQ4X3QgKiApICZ0bHMtPnByZV9tYXN0ZXJfc2VjcmV0LAorCQkgICAgICBzaXplb2YgKCB0bHMtPnByZV9tYXN0ZXJfc2VjcmV0ICksCisJCSAgICAgIGtleV94Y2hnLmVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldCwgMCApOworCURCR0MgKCB0bHMsICJSU0EgZW5jcnlwdCBkb25lLiAgQ2lwaGVydGV4dDpcbiIgKTsKKwlEQkdDX0hEICggdGxzLCAma2V5X3hjaGcuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0LAorCQkgIHNpemVvZiAoIGtleV94Y2hnLmVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldCApICk7CisJUlNBX2ZyZWUgKCByc2FfY3R4ICk7CisKKworCXJldHVybiB0bHNfc2VuZF9oYW5kc2hha2UgKCB0bHMsICZrZXlfeGNoZywgc2l6ZW9mICgga2V5X3hjaGcgKSApOworfQorCisvKioKKyAqIFRyYW5zbWl0IENoYW5nZSBDaXBoZXIgcmVjb3JkCisgKgorICogQHYgdGxzCQlUTFMgc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGxzX3NlbmRfY2hhbmdlX2NpcGhlciAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzICkgeworCXN0YXRpYyBjb25zdCB1aW50OF90IGNoYW5nZV9jaXBoZXJbMV0gPSB7IDEgfTsKKwlyZXR1cm4gdGxzX3NlbmRfcGxhaW50ZXh0ICggdGxzLCBUTFNfVFlQRV9DSEFOR0VfQ0lQSEVSLAorCQkJCSAgICBjaGFuZ2VfY2lwaGVyLCBzaXplb2YgKCBjaGFuZ2VfY2lwaGVyICkgKTsKK30KKworLyoqCisgKiBUcmFuc21pdCBGaW5pc2hlZCByZWNvcmQKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfc2VuZF9maW5pc2hlZCAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzICkgeworCXN0cnVjdCB7CisJCXVpbnQzMl90IHR5cGVfbGVuZ3RoOworCQl1aW50OF90IHZlcmlmeV9kYXRhWzEyXTsKKwl9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpIGZpbmlzaGVkOworCXVpbnQ4X3QgZGlnZXN0W01ENV9ESUdFU1RfU0laRSArIFNIQTFfRElHRVNUX1NJWkVdOworCisJbWVtc2V0ICggJmZpbmlzaGVkLCAwLCBzaXplb2YgKCBmaW5pc2hlZCApICk7CisJZmluaXNoZWQudHlwZV9sZW5ndGggPSAoIGNwdV90b19sZTMyICggVExTX0ZJTklTSEVEICkgfAorCQkJCSBodG9ubCAoIHNpemVvZiAoIGZpbmlzaGVkICkgLQorCQkJCQkgc2l6ZW9mICggZmluaXNoZWQudHlwZV9sZW5ndGggKSApICk7CisJdGxzX3ZlcmlmeV9oYW5kc2hha2UgKCB0bHMsIGRpZ2VzdCApOworCXRsc19wcmZfbGFiZWwgKCB0bHMsICZ0bHMtPm1hc3Rlcl9zZWNyZXQsIHNpemVvZiAoIHRscy0+bWFzdGVyX3NlY3JldCApLAorCQkJZmluaXNoZWQudmVyaWZ5X2RhdGEsIHNpemVvZiAoIGZpbmlzaGVkLnZlcmlmeV9kYXRhICksCisJCQkiY2xpZW50IGZpbmlzaGVkIiwgZGlnZXN0LCBzaXplb2YgKCBkaWdlc3QgKSApOworCisJcmV0dXJuIHRsc19zZW5kX2hhbmRzaGFrZSAoIHRscywgJmZpbmlzaGVkLCBzaXplb2YgKCBmaW5pc2hlZCApICk7Cit9CisKKy8qKgorICogUmVjZWl2ZSBuZXcgQ2hhbmdlIENpcGhlciByZWNvcmQKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAdiBkYXRhCQlQbGFpbnRleHQgcmVjb3JkCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBwbGFpbnRleHQgcmVjb3JkCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfbmV3X2NoYW5nZV9jaXBoZXIgKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscywKKwkJCQkgICB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCWludCByYzsKKworCWlmICggKCBsZW4gIT0gMSApIHx8ICggKiggKCB1aW50OF90ICogKSBkYXRhICkgIT0gMSApICkgeworCQlEQkdDICggdGxzLCAiVExTICVwIHJlY2VpdmVkIGludmFsaWQgQ2hhbmdlIENpcGhlclxuIiwgdGxzICk7CisJCURCR0NfSEQgKCB0bHMsIGRhdGEsIGxlbiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoICggcmMgPSB0bHNfY2hhbmdlX2NpcGhlciAoIHRscywgJnRscy0+cnhfY2lwaGVyc3BlY19wZW5kaW5nLAorCQkJCQkmdGxzLT5yeF9jaXBoZXJzcGVjICkgKSAhPSAwICkgeworCQlEQkdDICggdGxzLCAiVExTICVwIGNvdWxkIG5vdCBhY3RpdmF0ZSBSWCBjaXBoZXI6ICVzXG4iLAorCQkgICAgICAgdGxzLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKwl0bHMtPnJ4X3NlcSA9IH4oICggdWludDY0X3QgKSAwICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWNlaXZlIG5ldyBBbGVydCByZWNvcmQKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAdiBkYXRhCQlQbGFpbnRleHQgcmVjb3JkCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBwbGFpbnRleHQgcmVjb3JkCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfbmV3X2FsZXJ0ICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IHsKKwkJdWludDhfdCBsZXZlbDsKKwkJdWludDhfdCBkZXNjcmlwdGlvbjsKKwkJY2hhciBuZXh0WzBdOworCX0gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSkgKmFsZXJ0ID0gZGF0YTsKKwl2b2lkICplbmQgPSBhbGVydC0+bmV4dDsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggZW5kICE9ICggZGF0YSArIGxlbiApICkgeworCQlEQkdDICggdGxzLCAiVExTICVwIHJlY2VpdmVkIG92ZXJsZW5ndGggQWxlcnRcbiIsIHRscyApOworCQlEQkdDX0hEICggdGxzLCBkYXRhLCBsZW4gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICggYWxlcnQtPmxldmVsICkgeworCWNhc2UgVExTX0FMRVJUX1dBUk5JTkc6CisJCURCR0MgKCB0bHMsICJUTFMgJXAgcmVjZWl2ZWQgd2FybmluZyBhbGVydCAlZFxuIiwKKwkJICAgICAgIHRscywgYWxlcnQtPmRlc2NyaXB0aW9uICk7CisJCXJldHVybiAwOworCWNhc2UgVExTX0FMRVJUX0ZBVEFMOgorCQlEQkdDICggdGxzLCAiVExTICVwIHJlY2VpdmVkIGZhdGFsIGFsZXJ0ICVkXG4iLAorCQkgICAgICAgdGxzLCBhbGVydC0+ZGVzY3JpcHRpb24gKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwlkZWZhdWx0OgorCQlEQkdDICggdGxzLCAiVExTICVwIHJlY2VpdmVkIHVua25vd24gYWxlcnQgbGV2ZWwgJWQiCisJCSAgICAgICAiKGFsZXJ0ICVkKVxuIiwgdGxzLCBhbGVydC0+bGV2ZWwsIGFsZXJ0LT5kZXNjcmlwdGlvbiApOworCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKKy8qKgorICogUmVjZWl2ZSBuZXcgU2VydmVyIEhlbGxvIGhhbmRzaGFrZSByZWNvcmQKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAdiBkYXRhCQlQbGFpbnRleHQgaGFuZHNoYWtlIHJlY29yZAorICogQHYgbGVuCQlMZW5ndGggb2YgcGxhaW50ZXh0IGhhbmRzaGFrZSByZWNvcmQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRsc19uZXdfc2VydmVyX2hlbGxvICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMsCisJCQkJICB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCB7CisJCXVpbnQxNl90IHZlcnNpb247CisJCXVpbnQ4X3QgcmFuZG9tWzMyXTsKKwkJdWludDhfdCBzZXNzaW9uX2lkX2xlbjsKKwkJY2hhciBuZXh0WzBdOworCX0gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSkgKmhlbGxvX2EgPSBkYXRhOworCXN0cnVjdCB7CisJCXVpbnQ4X3Qgc2Vzc2lvbl9pZFtoZWxsb19hLT5zZXNzaW9uX2lkX2xlbl07CisJCXVpbnQxNl90IGNpcGhlcl9zdWl0ZTsKKwkJdWludDhfdCBjb21wcmVzc2lvbl9tZXRob2Q7CisJCWNoYXIgbmV4dFswXTsKKwl9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpICpoZWxsb19iID0gKCB2b2lkICogKSAmaGVsbG9fYS0+bmV4dDsKKwl2b2lkICplbmQgPSBoZWxsb19iLT5uZXh0OworCWludCByYzsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggZW5kICE9ICggZGF0YSArIGxlbiApICkgeworCQlEQkdDICggdGxzLCAiVExTICVwIHJlY2VpdmVkIG92ZXJsZW5ndGggU2VydmVyIEhlbGxvXG4iLCB0bHMgKTsKKwkJREJHQ19IRCAoIHRscywgZGF0YSwgbGVuICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIHByb3RvY29sIHZlcnNpb24gKi8KKwlpZiAoIG50b2hzICggaGVsbG9fYS0+dmVyc2lvbiApIDwgVExTX1ZFUlNJT05fVExTXzFfMCApIHsKKwkJREJHQyAoIHRscywgIlRMUyAlcCBkb2VzIG5vdCBzdXBwb3J0IHByb3RvY29sIHZlcnNpb24gJWQuJWRcbiIsCisJCSAgICAgICB0bHMsICggbnRvaHMgKCBoZWxsb19hLT52ZXJzaW9uICkgPj4gOCApLAorCQkgICAgICAgKCBudG9ocyAoIGhlbGxvX2EtPnZlcnNpb24gKSAmIDB4ZmYgKSApOworCQlyZXR1cm4gLUVOT1RTVVA7CisJfQorCisJLyogQ29weSBvdXQgc2VydmVyIHJhbmRvbSBieXRlcyAqLworCW1lbWNweSAoICZ0bHMtPnNlcnZlcl9yYW5kb20sICZoZWxsb19hLT5yYW5kb20sCisJCSBzaXplb2YgKCB0bHMtPnNlcnZlcl9yYW5kb20gKSApOworCisJLyogU2VsZWN0IGNpcGhlciBzdWl0ZSAqLworCWlmICggKCByYyA9IHRsc19zZWxlY3RfY2lwaGVyICggdGxzLCBoZWxsb19iLT5jaXBoZXJfc3VpdGUgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBHZW5lcmF0ZSBzZWNyZXRzICovCisJdGxzX2dlbmVyYXRlX21hc3Rlcl9zZWNyZXQgKCB0bHMgKTsKKwlpZiAoICggcmMgPSB0bHNfZ2VuZXJhdGVfa2V5cyAoIHRscyApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlY2VpdmUgbmV3IENlcnRpZmljYXRlIGhhbmRzaGFrZSByZWNvcmQKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAdiBkYXRhCQlQbGFpbnRleHQgaGFuZHNoYWtlIHJlY29yZAorICogQHYgbGVuCQlMZW5ndGggb2YgcGxhaW50ZXh0IGhhbmRzaGFrZSByZWNvcmQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRsc19uZXdfY2VydGlmaWNhdGUgKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscywKKwkJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgeworCQl1aW50OF90IGxlbmd0aFszXTsKKwkJdWludDhfdCBjZXJ0aWZpY2F0ZXNbMF07CisJfSBfX2F0dHJpYnV0ZV9fICgoIHBhY2tlZCApKSAqY2VydGlmaWNhdGUgPSBkYXRhOworCXN0cnVjdCB7CisJCXVpbnQ4X3QgbGVuZ3RoWzNdOworCQl1aW50OF90IGNlcnRpZmljYXRlWzBdOworCX0gX19hdHRyaWJ1dGVfXyAoKCBwYWNrZWQgKSkgKmVsZW1lbnQgPQorCQkgICggKCB2b2lkICogKSBjZXJ0aWZpY2F0ZS0+Y2VydGlmaWNhdGVzICk7CisJc2l6ZV90IGVsZW1lbnRzX2xlbiA9IHRsc191aW50MjQgKCBjZXJ0aWZpY2F0ZS0+bGVuZ3RoICk7CisJdm9pZCAqZW5kID0gKCBjZXJ0aWZpY2F0ZS0+Y2VydGlmaWNhdGVzICsgZWxlbWVudHNfbGVuICk7CisJc3RydWN0IGFzbjFfY3Vyc29yIGN1cnNvcjsKKwlpbnQgcmM7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIGVuZCAhPSAoIGRhdGEgKyBsZW4gKSApIHsKKwkJREJHQyAoIHRscywgIlRMUyAlcCByZWNlaXZlZCBvdmVybGVuZ3RoIFNlcnZlciBDZXJ0aWZpY2F0ZVxuIiwKKwkJICAgICAgIHRscyApOworCQlEQkdDX0hEICggdGxzLCBkYXRhLCBsZW4gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVHJhdmVyc2UgY2VydGlmaWNhdGUgY2hhaW4gKi8KKwlkbyB7CisJCWN1cnNvci5kYXRhID0gZWxlbWVudC0+Y2VydGlmaWNhdGU7CisJCWN1cnNvci5sZW4gPSB0bHNfdWludDI0ICggZWxlbWVudC0+bGVuZ3RoICk7CisJCWlmICggKCBjdXJzb3IuZGF0YSArIGN1cnNvci5sZW4gKSA+IGVuZCApIHsKKwkJCURCR0MgKCB0bHMsICJUTFMgJXAgcmVjZWl2ZWQgY29ycnVwdCBTZXJ2ZXIgIgorCQkJICAgICAgICJDZXJ0aWZpY2F0ZVxuIiwgdGxzICk7CisJCQlEQkdDX0hEICggdGxzLCBkYXRhLCBsZW4gKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLy8gSEFDSworCQlpZiAoICggcmMgPSB4NTA5X3JzYV9wdWJsaWNfa2V5ICggJmN1cnNvciwKKwkJCQkJCSAgJnRscy0+cnNhICkgKSAhPSAwICkgeworCQkJREJHQyAoIHRscywgIlRMUyAlcCBjYW5ub3QgZGV0ZXJtaW5lIFJTQSBwdWJsaWMga2V5OiAiCisJCQkgICAgICAgIiVzXG4iLCB0bHMsIHN0cmVycm9yICggcmMgKSApOworCQkJcmV0dXJuIHJjOworCQl9CisJCXJldHVybiAwOworCisJCWVsZW1lbnQgPSAoIGN1cnNvci5kYXRhICsgY3Vyc29yLmxlbiApOworCX0gd2hpbGUgKCBlbGVtZW50ICE9IGVuZCApOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogUmVjZWl2ZSBuZXcgU2VydmVyIEhlbGxvIERvbmUgaGFuZHNoYWtlIHJlY29yZAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IGRhdGEJCVBsYWludGV4dCBoYW5kc2hha2UgcmVjb3JkCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBwbGFpbnRleHQgaGFuZHNoYWtlIHJlY29yZAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGxzX25ld19zZXJ2ZXJfaGVsbG9fZG9uZSAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzLAorCQkJCSAgICAgICB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCB7CisJCWNoYXIgbmV4dFswXTsKKwl9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpICpoZWxsb19kb25lID0gZGF0YTsKKwl2b2lkICplbmQgPSBoZWxsb19kb25lLT5uZXh0OworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCBlbmQgIT0gKCBkYXRhICsgbGVuICkgKSB7CisJCURCR0MgKCB0bHMsICJUTFMgJXAgcmVjZWl2ZWQgb3Zlcmxlbmd0aCBTZXJ2ZXIgSGVsbG8gRG9uZVxuIiwKKwkJICAgICAgIHRscyApOworCQlEQkdDX0hEICggdGxzLCBkYXRhLCBsZW4gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgdGhhdCB3ZSBhcmUgcmVhZHkgdG8gc2VuZCB0aGUgQ2xpZW50IEtleSBFeGNoYW5nZSAqLworCWlmICggdGxzLT50eF9zdGF0ZSAhPSBUTFNfVFhfTk9ORSApIHsKKwkJREJHQyAoIHRscywgIlRMUyAlcCByZWNlaXZlZCBTZXJ2ZXIgSGVsbG8gRG9uZSB3aGlsZSBpbiAiCisJCSAgICAgICAiVFggc3RhdGUgJWRcbiIsIHRscywgdGxzLT50eF9zdGF0ZSApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBTdGFydCBzZW5kaW5nIHRoZSBDbGllbnQgS2V5IEV4Y2hhbmdlICovCisJdGxzLT50eF9zdGF0ZSA9IFRMU19UWF9DTElFTlRfS0VZX0VYQ0hBTkdFOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVjZWl2ZSBuZXcgRmluaXNoZWQgaGFuZHNoYWtlIHJlY29yZAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IGRhdGEJCVBsYWludGV4dCBoYW5kc2hha2UgcmVjb3JkCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBwbGFpbnRleHQgaGFuZHNoYWtlIHJlY29yZAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGxzX25ld19maW5pc2hlZCAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzLAorCQkJICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKworCS8qIEZJWE1FOiBIYW5kbGUgdGhpcyBwcm9wZXJseSAqLworCXRscy0+dHhfc3RhdGUgPSBUTFNfVFhfREFUQTsKKwkoIHZvaWQgKSBkYXRhOworCSggdm9pZCApIGxlbjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWNlaXZlIG5ldyBIYW5kc2hha2UgcmVjb3JkCisgKgorICogQHYgdGxzCQlUTFMgc2Vzc2lvbgorICogQHYgZGF0YQkJUGxhaW50ZXh0IHJlY29yZAorICogQHYgbGVuCQlMZW5ndGggb2YgcGxhaW50ZXh0IHJlY29yZAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGxzX25ld19oYW5kc2hha2UgKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscywKKwkJCSAgICAgICB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCXN0cnVjdCB7CisJCXVpbnQ4X3QgdHlwZTsKKwkJdWludDhfdCBsZW5ndGhbM107CisJCXVpbnQ4X3QgcGF5bG9hZFswXTsKKwl9IF9fYXR0cmlidXRlX18gKCggcGFja2VkICkpICpoYW5kc2hha2UgPSBkYXRhOworCXZvaWQgKnBheWxvYWQgPSAmaGFuZHNoYWtlLT5wYXlsb2FkOworCXNpemVfdCBwYXlsb2FkX2xlbiA9IHRsc191aW50MjQgKCBoYW5kc2hha2UtPmxlbmd0aCApOworCXZvaWQgKmVuZCA9ICggcGF5bG9hZCArIHBheWxvYWRfbGVuICk7CisJaW50IHJjOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCBlbmQgIT0gKCBkYXRhICsgbGVuICkgKSB7CisJCURCR0MgKCB0bHMsICJUTFMgJXAgcmVjZWl2ZWQgb3Zlcmxlbmd0aCBIYW5kc2hha2VcbiIsIHRscyApOworCQlEQkdDX0hEICggdGxzLCBkYXRhLCBsZW4gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICggaGFuZHNoYWtlLT50eXBlICkgeworCWNhc2UgVExTX1NFUlZFUl9IRUxMTzoKKwkJcmMgPSB0bHNfbmV3X3NlcnZlcl9oZWxsbyAoIHRscywgcGF5bG9hZCwgcGF5bG9hZF9sZW4gKTsKKwkJYnJlYWs7CisJY2FzZSBUTFNfQ0VSVElGSUNBVEU6CisJCXJjID0gdGxzX25ld19jZXJ0aWZpY2F0ZSAoIHRscywgcGF5bG9hZCwgcGF5bG9hZF9sZW4gKTsKKwkJYnJlYWs7CisJY2FzZSBUTFNfU0VSVkVSX0hFTExPX0RPTkU6CisJCXJjID0gdGxzX25ld19zZXJ2ZXJfaGVsbG9fZG9uZSAoIHRscywgcGF5bG9hZCwgcGF5bG9hZF9sZW4gKTsKKwkJYnJlYWs7CisJY2FzZSBUTFNfRklOSVNIRUQ6CisJCXJjID0gdGxzX25ld19maW5pc2hlZCAoIHRscywgcGF5bG9hZCwgcGF5bG9hZF9sZW4gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJHQyAoIHRscywgIlRMUyAlcCBpZ25vcmluZyBoYW5kc2hha2UgdHlwZSAlZFxuIiwKKwkJICAgICAgIHRscywgaGFuZHNoYWtlLT50eXBlICk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogQWRkIHRvIGhhbmRzaGFrZSBkaWdlc3QgKGV4Y2VwdCBmb3IgSGVsbG8gUmVxdWVzdHMsIHdoaWNoCisJICogYXJlIGV4cGxpY2l0bHkgZXhjbHVkZWQpLgorCSAqLworCWlmICggaGFuZHNoYWtlLT50eXBlICE9IFRMU19IRUxMT19SRVFVRVNUICkKKwkJdGxzX2FkZF9oYW5kc2hha2UgKCB0bHMsIGRhdGEsIGxlbiApOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFJlY2VpdmUgbmV3IHJlY29yZAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IHR5cGUJCVJlY29yZCB0eXBlCisgKiBAdiBkYXRhCQlQbGFpbnRleHQgcmVjb3JkCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBwbGFpbnRleHQgcmVjb3JkCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfbmV3X3JlY29yZCAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzLAorCQkJICAgIHVuc2lnbmVkIGludCB0eXBlLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCisJc3dpdGNoICggdHlwZSApIHsKKwljYXNlIFRMU19UWVBFX0NIQU5HRV9DSVBIRVI6CisJCXJldHVybiB0bHNfbmV3X2NoYW5nZV9jaXBoZXIgKCB0bHMsIGRhdGEsIGxlbiApOworCWNhc2UgVExTX1RZUEVfQUxFUlQ6CisJCXJldHVybiB0bHNfbmV3X2FsZXJ0ICggdGxzLCBkYXRhLCBsZW4gKTsKKwljYXNlIFRMU19UWVBFX0hBTkRTSEFLRToKKwkJcmV0dXJuIHRsc19uZXdfaGFuZHNoYWtlICggdGxzLCBkYXRhLCBsZW4gKTsKKwljYXNlIFRMU19UWVBFX0RBVEE6CisJCXJldHVybiB4ZmVyX2RlbGl2ZXJfcmF3ICggJnRscy0+cGxhaW5zdHJlYW0ueGZlciwgZGF0YSwgbGVuICk7CisJZGVmYXVsdDoKKwkJLyogUkZDNDM0NiBzYXlzIHRoYXQgd2Ugc2hvdWxkIGp1c3QgaWdub3JlIHVua25vd24KKwkJICogcmVjb3JkIHR5cGVzLgorCQkgKi8KKwkJREJHQyAoIHRscywgIlRMUyAlcCBpZ25vcmluZyByZWNvcmQgdHlwZSAlZFxuIiwgdGxzLCB0eXBlICk7CisJCXJldHVybiAwOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlY29yZCBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBDYWxjdWxhdGUgSE1BQworICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IGNpcGhlcnNwZWMJQ2lwaGVyIHNwZWNpZmljYXRpb24KKyAqIEB2IHNlcQkJU2VxdWVuY2UgbnVtYmVyCisgKiBAdiB0bHNoZHIJCVRMUyBoZWFkZXIKKyAqIEB2IGRhdGEJCURhdGEKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIGRhdGEKKyAqIEB2IG1hYwkJSE1BQyB0byBmaWxsIGluCisgKi8KK3N0YXRpYyB2b2lkIHRsc19obWFjICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMgX191bnVzZWQsCisJCSAgICAgICBzdHJ1Y3QgdGxzX2NpcGhlcnNwZWMgKmNpcGhlcnNwZWMsCisJCSAgICAgICB1aW50NjRfdCBzZXEsIHN0cnVjdCB0bHNfaGVhZGVyICp0bHNoZHIsCisJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB2b2lkICpobWFjICkgeworCXN0cnVjdCBkaWdlc3RfYWxnb3JpdGhtICpkaWdlc3QgPSBjaXBoZXJzcGVjLT5kaWdlc3Q7CisJdWludDhfdCBkaWdlc3RfY3R4W2RpZ2VzdC0+Y3R4c2l6ZV07CisKKwlobWFjX2luaXQgKCBkaWdlc3QsIGRpZ2VzdF9jdHgsIGNpcGhlcnNwZWMtPm1hY19zZWNyZXQsCisJCSAgICAmZGlnZXN0LT5kaWdlc3RzaXplICk7CisJc2VxID0gY3B1X3RvX2JlNjQgKCBzZXEgKTsKKwlobWFjX3VwZGF0ZSAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwgJnNlcSwgc2l6ZW9mICggc2VxICkgKTsKKwlobWFjX3VwZGF0ZSAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwgdGxzaGRyLCBzaXplb2YgKCAqdGxzaGRyICkgKTsKKwlobWFjX3VwZGF0ZSAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwgZGF0YSwgbGVuICk7CisJaG1hY19maW5hbCAoIGRpZ2VzdCwgZGlnZXN0X2N0eCwgY2lwaGVyc3BlYy0+bWFjX3NlY3JldCwKKwkJICAgICAmZGlnZXN0LT5kaWdlc3RzaXplLCBobWFjICk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYW5kIGFzc2VtYmxlIHN0cmVhbS1jaXBoZXJlZCByZWNvcmQgZnJvbSBkYXRhIGFuZCBNQUMgcG9ydGlvbnMKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAcmV0IGRhdGEJCURhdGEKKyAqIEByZXQgbGVuCQlMZW5ndGggb2YgZGF0YQorICogQHJldCBkaWdlc3QJCU1BQyBkaWdlc3QKKyAqIEByZXQgcGxhaW50ZXh0X2xlbglMZW5ndGggb2YgcGxhaW50ZXh0IHJlY29yZAorICogQHJldCBwbGFpbnRleHQJQWxsb2NhdGVkIHBsYWludGV4dCByZWNvcmQKKyAqLworc3RhdGljIHZvaWQgKiBfX21hbGxvYyB0bHNfYXNzZW1ibGVfc3RyZWFtICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMsCisJCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sCisJCQkJICAgIHZvaWQgKmRpZ2VzdCwgc2l6ZV90ICpwbGFpbnRleHRfbGVuICkgeworCXNpemVfdCBtYWNfbGVuID0gdGxzLT50eF9jaXBoZXJzcGVjLmRpZ2VzdC0+ZGlnZXN0c2l6ZTsKKwl2b2lkICpwbGFpbnRleHQ7CisJdm9pZCAqY29udGVudDsKKwl2b2lkICptYWM7CisKKwkvKiBDYWxjdWxhdGUgc3RyZWFtLWNpcGhlcmVkIHN0cnVjdCBsZW5ndGggKi8KKwkqcGxhaW50ZXh0X2xlbiA9ICggbGVuICsgbWFjX2xlbiApOworCisJLyogQWxsb2NhdGUgc3RyZWFtLWNpcGhlcmVkIHN0cnVjdCAqLworCXBsYWludGV4dCA9IG1hbGxvYyAoICpwbGFpbnRleHRfbGVuICk7CisJaWYgKCAhIHBsYWludGV4dCApCisJCXJldHVybiBOVUxMOworCWNvbnRlbnQgPSBwbGFpbnRleHQ7CisJbWFjID0gKCBjb250ZW50ICsgbGVuICk7CisKKwkvKiBGaWxsIGluIHN0cmVhbS1jaXBoZXJlZCBzdHJ1Y3QgKi8KKwltZW1jcHkgKCBjb250ZW50LCBkYXRhLCBsZW4gKTsKKwltZW1jcHkgKCBtYWMsIGRpZ2VzdCwgbWFjX2xlbiApOworCisJcmV0dXJuIHBsYWludGV4dDsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgYXNzZW1ibGUgYmxvY2stY2lwaGVyZWQgcmVjb3JkIGZyb20gZGF0YSBhbmQgTUFDIHBvcnRpb25zCisgKgorICogQHYgdGxzCQlUTFMgc2Vzc2lvbgorICogQHJldCBkYXRhCQlEYXRhCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIGRhdGEKKyAqIEByZXQgZGlnZXN0CQlNQUMgZGlnZXN0CisgKiBAcmV0IHBsYWludGV4dF9sZW4JTGVuZ3RoIG9mIHBsYWludGV4dCByZWNvcmQKKyAqIEByZXQgcGxhaW50ZXh0CUFsbG9jYXRlZCBwbGFpbnRleHQgcmVjb3JkCisgKi8KK3N0YXRpYyB2b2lkICogdGxzX2Fzc2VtYmxlX2Jsb2NrICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMsCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwKKwkJCQkgICB2b2lkICpkaWdlc3QsIHNpemVfdCAqcGxhaW50ZXh0X2xlbiApIHsKKwlzaXplX3QgYmxvY2tzaXplID0gdGxzLT50eF9jaXBoZXJzcGVjLmNpcGhlci0+YmxvY2tzaXplOworCXNpemVfdCBpdl9sZW4gPSBibG9ja3NpemU7CisJc2l6ZV90IG1hY19sZW4gPSB0bHMtPnR4X2NpcGhlcnNwZWMuZGlnZXN0LT5kaWdlc3RzaXplOworCXNpemVfdCBwYWRkaW5nX2xlbjsKKwl2b2lkICpwbGFpbnRleHQ7CisJdm9pZCAqaXY7CisJdm9pZCAqY29udGVudDsKKwl2b2lkICptYWM7CisJdm9pZCAqcGFkZGluZzsKKworCS8qIEZJWE1FOiBUTFN2MS4xIGhhcyBhbiBleHBsaWNpdCBJViAqLworCWl2X2xlbiA9IDA7CisKKwkvKiBDYWxjdWxhdGUgYmxvY2stY2lwaGVyZWQgc3RydWN0IGxlbmd0aCAqLworCXBhZGRpbmdfbGVuID0gKCAoIGJsb2Nrc2l6ZSAtIDEgKSAmIC0oIGl2X2xlbiArIGxlbiArIG1hY19sZW4gKyAxICkgKTsKKwkqcGxhaW50ZXh0X2xlbiA9ICggaXZfbGVuICsgbGVuICsgbWFjX2xlbiArIHBhZGRpbmdfbGVuICsgMSApOworCisJLyogQWxsb2NhdGUgYmxvY2stY2lwaGVyZWQgc3RydWN0ICovCisJcGxhaW50ZXh0ID0gbWFsbG9jICggKnBsYWludGV4dF9sZW4gKTsKKwlpZiAoICEgcGxhaW50ZXh0ICkKKwkJcmV0dXJuIE5VTEw7CisJaXYgPSBwbGFpbnRleHQ7CisJY29udGVudCA9ICggaXYgKyBpdl9sZW4gKTsKKwltYWMgPSAoIGNvbnRlbnQgKyBsZW4gKTsKKwlwYWRkaW5nID0gKCBtYWMgKyBtYWNfbGVuICk7CisKKwkvKiBGaWxsIGluIGJsb2NrLWNpcGhlcmVkIHN0cnVjdCAqLworCW1lbXNldCAoIGl2LCAwLCBpdl9sZW4gKTsKKwltZW1jcHkgKCBjb250ZW50LCBkYXRhLCBsZW4gKTsKKwltZW1jcHkgKCBtYWMsIGRpZ2VzdCwgbWFjX2xlbiApOworCW1lbXNldCAoIHBhZGRpbmcsIHBhZGRpbmdfbGVuLCAoIHBhZGRpbmdfbGVuICsgMSApICk7CisKKwlyZXR1cm4gcGxhaW50ZXh0OworfQorCisvKioKKyAqIFNlbmQgcGxhaW50ZXh0IHJlY29yZAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IHR5cGUJCVJlY29yZCB0eXBlCisgKiBAdiBkYXRhCQlQbGFpbnRleHQgcmVjb3JkCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBwbGFpbnRleHQgcmVjb3JkCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfc2VuZF9wbGFpbnRleHQgKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscywgdW5zaWduZWQgaW50IHR5cGUsCisJCQkJY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgdGxzX2hlYWRlciBwbGFpbnRleHRfdGxzaGRyOworCXN0cnVjdCB0bHNfaGVhZGVyICp0bHNoZHI7CisJc3RydWN0IHRsc19jaXBoZXJzcGVjICpjaXBoZXJzcGVjID0gJnRscy0+dHhfY2lwaGVyc3BlYzsKKwl2b2lkICpwbGFpbnRleHQgPSBOVUxMOworCXNpemVfdCBwbGFpbnRleHRfbGVuOworCXN0cnVjdCBpb19idWZmZXIgKmNpcGhlcnRleHQgPSBOVUxMOworCXNpemVfdCBjaXBoZXJ0ZXh0X2xlbjsKKwlzaXplX3QgbWFjX2xlbiA9IGNpcGhlcnNwZWMtPmRpZ2VzdC0+ZGlnZXN0c2l6ZTsKKwl1aW50OF90IG1hY1ttYWNfbGVuXTsKKwlpbnQgcmM7CisKKwkvKiBDb25zdHJ1Y3QgaGVhZGVyICovCisJcGxhaW50ZXh0X3Rsc2hkci50eXBlID0gdHlwZTsKKwlwbGFpbnRleHRfdGxzaGRyLnZlcnNpb24gPSBodG9ucyAoIFRMU19WRVJTSU9OX1RMU18xXzAgKTsKKwlwbGFpbnRleHRfdGxzaGRyLmxlbmd0aCA9IGh0b25zICggbGVuICk7CisKKwkvKiBDYWxjdWxhdGUgTUFDICovCisJdGxzX2htYWMgKCB0bHMsIGNpcGhlcnNwZWMsIHRscy0+dHhfc2VxLCAmcGxhaW50ZXh0X3Rsc2hkciwKKwkJICAgZGF0YSwgbGVuLCBtYWMgKTsKKworCS8qIEFsbG9jYXRlIGFuZCBhc3NlbWJsZSBwbGFpbnRleHQgc3RydWN0ICovCisJaWYgKCBpc19zdHJlYW1fY2lwaGVyICggY2lwaGVyc3BlYy0+Y2lwaGVyICkgKSB7CisJCXBsYWludGV4dCA9IHRsc19hc3NlbWJsZV9zdHJlYW0gKCB0bHMsIGRhdGEsIGxlbiwgbWFjLAorCQkJCQkJICAmcGxhaW50ZXh0X2xlbiApOworCX0gZWxzZSB7CisJCXBsYWludGV4dCA9IHRsc19hc3NlbWJsZV9ibG9jayAoIHRscywgZGF0YSwgbGVuLCBtYWMsCisJCQkJCQkgJnBsYWludGV4dF9sZW4gKTsKKwl9CisJaWYgKCAhIHBsYWludGV4dCApIHsKKwkJREJHQyAoIHRscywgIlRMUyAlcCBjb3VsZCBub3QgYWxsb2NhdGUgJXpkIGJ5dGVzIGZvciAiCisJCSAgICAgICAicGxhaW50ZXh0XG4iLCB0bHMsIHBsYWludGV4dF9sZW4gKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCisJREJHQzIgKCB0bHMsICJTZW5kaW5nIHBsYWludGV4dCBkYXRhOlxuIiApOworCURCR0MyX0hEICggdGxzLCBwbGFpbnRleHQsIHBsYWludGV4dF9sZW4gKTsKKworCS8qIEFsbG9jYXRlIGNpcGhlcnRleHQgKi8KKwljaXBoZXJ0ZXh0X2xlbiA9ICggc2l6ZW9mICggKnRsc2hkciApICsgcGxhaW50ZXh0X2xlbiApOworCWNpcGhlcnRleHQgPSB4ZmVyX2FsbG9jX2lvYiAoICZ0bHMtPmNpcGhlcnN0cmVhbS54ZmVyLAorCQkJCSAgICAgIGNpcGhlcnRleHRfbGVuICk7CisJaWYgKCAhIGNpcGhlcnRleHQgKSB7CisJCURCR0MgKCB0bHMsICJUTFMgJXAgY291bGQgbm90IGFsbG9jYXRlICV6ZCBieXRlcyBmb3IgIgorCQkgICAgICAgImNpcGhlcnRleHRcbiIsIHRscywgY2lwaGVydGV4dF9sZW4gKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogQXNzZW1ibGUgY2lwaGVydGV4dCAqLworCXRsc2hkciA9IGlvYl9wdXQgKCBjaXBoZXJ0ZXh0LCBzaXplb2YgKCAqdGxzaGRyICkgKTsKKwl0bHNoZHItPnR5cGUgPSB0eXBlOworCXRsc2hkci0+dmVyc2lvbiA9IGh0b25zICggVExTX1ZFUlNJT05fVExTXzFfMCApOworCXRsc2hkci0+bGVuZ3RoID0gaHRvbnMgKCBwbGFpbnRleHRfbGVuICk7CisJbWVtY3B5ICggY2lwaGVyc3BlYy0+Y2lwaGVyX25leHRfY3R4LCBjaXBoZXJzcGVjLT5jaXBoZXJfY3R4LAorCQkgY2lwaGVyc3BlYy0+Y2lwaGVyLT5jdHhzaXplICk7CisJY2lwaGVyX2VuY3J5cHQgKCBjaXBoZXJzcGVjLT5jaXBoZXIsIGNpcGhlcnNwZWMtPmNpcGhlcl9uZXh0X2N0eCwKKwkJCSBwbGFpbnRleHQsIGlvYl9wdXQgKCBjaXBoZXJ0ZXh0LCBwbGFpbnRleHRfbGVuICksCisJCQkgcGxhaW50ZXh0X2xlbiApOworCisJLyogRnJlZSBwbGFpbnRleHQgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBjb25zZXJ2ZSBtZW1vcnkgKi8KKwlmcmVlICggcGxhaW50ZXh0ICk7CisJcGxhaW50ZXh0ID0gTlVMTDsKKworCS8qIFNlbmQgY2lwaGVydGV4dCAqLworCXJjID0geGZlcl9kZWxpdmVyX2lvYiAoICZ0bHMtPmNpcGhlcnN0cmVhbS54ZmVyLCBjaXBoZXJ0ZXh0ICk7CisJY2lwaGVydGV4dCA9IE5VTEw7CisJaWYgKCByYyAhPSAwICkgeworCQlEQkdDICggdGxzLCAiVExTICVwIGNvdWxkIG5vdCBkZWxpdmVyIGNpcGhlcnRleHQ6ICVzXG4iLAorCQkgICAgICAgdGxzLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFVwZGF0ZSBUWCBzdGF0ZSBtYWNoaW5lIHRvIG5leHQgcmVjb3JkICovCisJdGxzLT50eF9zZXEgKz0gMTsKKwltZW1jcHkgKCB0bHMtPnR4X2NpcGhlcnNwZWMuY2lwaGVyX2N0eCwKKwkJIHRscy0+dHhfY2lwaGVyc3BlYy5jaXBoZXJfbmV4dF9jdHgsCisJCSB0bHMtPnR4X2NpcGhlcnNwZWMuY2lwaGVyLT5jdHhzaXplICk7CisKKyBkb25lOgorCWZyZWUgKCBwbGFpbnRleHQgKTsKKwlmcmVlX2lvYiAoIGNpcGhlcnRleHQgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogU3BsaXQgc3RyZWFtLWNpcGhlcmVkIHJlY29yZCBpbnRvIGRhdGEgYW5kIE1BQyBwb3J0aW9ucworICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IHBsYWludGV4dAkJUGxhaW50ZXh0IHJlY29yZAorICogQHYgcGxhaW50ZXh0X2xlbglMZW5ndGggb2YgcmVjb3JkCisgKiBAcmV0IGRhdGEJCURhdGEKKyAqIEByZXQgbGVuCQlMZW5ndGggb2YgZGF0YQorICogQHJldCBkaWdlc3QJCU1BQyBkaWdlc3QKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRsc19zcGxpdF9zdHJlYW0gKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscywKKwkJCSAgICAgIHZvaWQgKnBsYWludGV4dCwgc2l6ZV90IHBsYWludGV4dF9sZW4sCisJCQkgICAgICB2b2lkICoqZGF0YSwgc2l6ZV90ICpsZW4sIHZvaWQgKipkaWdlc3QgKSB7CisJdm9pZCAqY29udGVudDsKKwlzaXplX3QgY29udGVudF9sZW47CisJdm9pZCAqbWFjOworCXNpemVfdCBtYWNfbGVuOworCisJLyogRGVjb21wb3NlIHN0cmVhbS1jaXBoZXJlZCBkYXRhICovCisJbWFjX2xlbiA9IHRscy0+cnhfY2lwaGVyc3BlYy5kaWdlc3QtPmRpZ2VzdHNpemU7CisJaWYgKCBwbGFpbnRleHRfbGVuIDwgbWFjX2xlbiApIHsKKwkJREJHQyAoIHRscywgIlRMUyAlcCByZWNlaXZlZCB1bmRlcmxlbmd0aCByZWNvcmRcbiIsIHRscyApOworCQlEQkdDX0hEICggdGxzLCBwbGFpbnRleHQsIHBsYWludGV4dF9sZW4gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNvbnRlbnRfbGVuID0gKCBwbGFpbnRleHRfbGVuIC0gbWFjX2xlbiApOworCWNvbnRlbnQgPSBwbGFpbnRleHQ7CisJbWFjID0gKCBjb250ZW50ICsgY29udGVudF9sZW4gKTsKKworCS8qIEZpbGwgaW4gcmV0dXJuIHZhbHVlcyAqLworCSpkYXRhID0gY29udGVudDsKKwkqbGVuID0gY29udGVudF9sZW47CisJKmRpZ2VzdCA9IG1hYzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFNwbGl0IGJsb2NrLWNpcGhlcmVkIHJlY29yZCBpbnRvIGRhdGEgYW5kIE1BQyBwb3J0aW9ucworICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IHBsYWludGV4dAkJUGxhaW50ZXh0IHJlY29yZAorICogQHYgcGxhaW50ZXh0X2xlbglMZW5ndGggb2YgcmVjb3JkCisgKiBAcmV0IGRhdGEJCURhdGEKKyAqIEByZXQgbGVuCQlMZW5ndGggb2YgZGF0YQorICogQHJldCBkaWdlc3QJCU1BQyBkaWdlc3QKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRsc19zcGxpdF9ibG9jayAoIHN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzLAorCQkJICAgICB2b2lkICpwbGFpbnRleHQsIHNpemVfdCBwbGFpbnRleHRfbGVuLAorCQkJICAgICB2b2lkICoqZGF0YSwgc2l6ZV90ICpsZW4sCisJCQkgICAgIHZvaWQgKipkaWdlc3QgKSB7CisJdm9pZCAqaXY7CisJc2l6ZV90IGl2X2xlbjsKKwl2b2lkICpjb250ZW50OworCXNpemVfdCBjb250ZW50X2xlbjsKKwl2b2lkICptYWM7CisJc2l6ZV90IG1hY19sZW47CisJdm9pZCAqcGFkZGluZzsKKwlzaXplX3QgcGFkZGluZ19sZW47CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBEZWNvbXBvc2UgYmxvY2stY2lwaGVyZWQgZGF0YSAqLworCWlmICggcGxhaW50ZXh0X2xlbiA8IDEgKSB7CisJCURCR0MgKCB0bHMsICJUTFMgJXAgcmVjZWl2ZWQgdW5kZXJsZW5ndGggcmVjb3JkXG4iLCB0bHMgKTsKKwkJREJHQ19IRCAoIHRscywgcGxhaW50ZXh0LCBwbGFpbnRleHRfbGVuICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpdl9sZW4gPSB0bHMtPnJ4X2NpcGhlcnNwZWMuY2lwaGVyLT5ibG9ja3NpemU7CisKKwkvKiBGSVhNRTogVExTdjEuMSB1c2VzIGFuIGV4cGxpY2l0IElWICovCisJaXZfbGVuID0gMDsKKworCW1hY19sZW4gPSB0bHMtPnJ4X2NpcGhlcnNwZWMuZGlnZXN0LT5kaWdlc3RzaXplOworCXBhZGRpbmdfbGVuID0gKiggKCB1aW50OF90ICogKSAoIHBsYWludGV4dCArIHBsYWludGV4dF9sZW4gLSAxICkgKTsKKwlpZiAoIHBsYWludGV4dF9sZW4gPCAoIGl2X2xlbiArIG1hY19sZW4gKyBwYWRkaW5nX2xlbiArIDEgKSApIHsKKwkJREJHQyAoIHRscywgIlRMUyAlcCByZWNlaXZlZCB1bmRlcmxlbmd0aCByZWNvcmRcbiIsIHRscyApOworCQlEQkdDX0hEICggdGxzLCBwbGFpbnRleHQsIHBsYWludGV4dF9sZW4gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNvbnRlbnRfbGVuID0gKCBwbGFpbnRleHRfbGVuIC0gaXZfbGVuIC0gbWFjX2xlbiAtIHBhZGRpbmdfbGVuIC0gMSApOworCWl2ID0gcGxhaW50ZXh0OworCWNvbnRlbnQgPSAoIGl2ICsgaXZfbGVuICk7CisJbWFjID0gKCBjb250ZW50ICsgY29udGVudF9sZW4gKTsKKwlwYWRkaW5nID0gKCBtYWMgKyBtYWNfbGVuICk7CisKKwkvKiBWZXJpZnkgcGFkZGluZyBieXRlcyAqLworCWZvciAoIGkgPSAwIDsgaSA8IHBhZGRpbmdfbGVuIDsgaSsrICkgeworCQlpZiAoICooICggdWludDhfdCAqICkgKCBwYWRkaW5nICsgaSApICkgIT0gcGFkZGluZ19sZW4gKSB7CisJCQlEQkdDICggdGxzLCAiVExTICVwIHJlY2VpdmVkIGJhZCBwYWRkaW5nXG4iLCB0bHMgKTsKKwkJCURCR0NfSEQgKCB0bHMsIHBsYWludGV4dCwgcGxhaW50ZXh0X2xlbiApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBGaWxsIGluIHJldHVybiB2YWx1ZXMgKi8KKwkqZGF0YSA9IGNvbnRlbnQ7CisJKmxlbiA9IGNvbnRlbnRfbGVuOworCSpkaWdlc3QgPSBtYWM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWNlaXZlIG5ldyBjaXBoZXJ0ZXh0IHJlY29yZAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEB2IHRsc2hkcgkJUmVjb3JkIGhlYWRlcgorICogQHYgY2lwaGVydGV4dAlDaXBoZXJ0ZXh0IHJlY29yZAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGxzX25ld19jaXBoZXJ0ZXh0ICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMsCisJCQkJc3RydWN0IHRsc19oZWFkZXIgKnRsc2hkciwgdm9pZCAqY2lwaGVydGV4dCApIHsKKwlzdHJ1Y3QgdGxzX2hlYWRlciBwbGFpbnRleHRfdGxzaGRyOworCXN0cnVjdCB0bHNfY2lwaGVyc3BlYyAqY2lwaGVyc3BlYyA9ICZ0bHMtPnJ4X2NpcGhlcnNwZWM7CisJc2l6ZV90IHJlY29yZF9sZW4gPSBudG9ocyAoIHRsc2hkci0+bGVuZ3RoICk7CisJdm9pZCAqcGxhaW50ZXh0ID0gTlVMTDsKKwl2b2lkICpkYXRhOworCXNpemVfdCBsZW47CisJdm9pZCAqbWFjOworCXNpemVfdCBtYWNfbGVuID0gY2lwaGVyc3BlYy0+ZGlnZXN0LT5kaWdlc3RzaXplOworCXVpbnQ4X3QgdmVyaWZ5X21hY1ttYWNfbGVuXTsKKwlpbnQgcmM7CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHBsYWludGV4dCAqLworCXBsYWludGV4dCA9IG1hbGxvYyAoIHJlY29yZF9sZW4gKTsKKwlpZiAoICEgcGxhaW50ZXh0ICkgeworCQlEQkdDICggdGxzLCAiVExTICVwIGNvdWxkIG5vdCBhbGxvY2F0ZSAlemQgYnl0ZXMgZm9yICIKKwkJICAgICAgICJkZWNyeXB0aW9uIGJ1ZmZlclxuIiwgdGxzLCByZWNvcmRfbGVuICk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCS8qIERlY3J5cHQgdGhlIHJlY29yZCAqLworCWNpcGhlcl9kZWNyeXB0ICggY2lwaGVyc3BlYy0+Y2lwaGVyLCBjaXBoZXJzcGVjLT5jaXBoZXJfY3R4LAorCQkJIGNpcGhlcnRleHQsIHBsYWludGV4dCwgcmVjb3JkX2xlbiApOworCisJLyogU3BsaXQgcmVjb3JkIGludG8gY29udGVudCBhbmQgTUFDICovCisJaWYgKCBpc19zdHJlYW1fY2lwaGVyICggY2lwaGVyc3BlYy0+Y2lwaGVyICkgKSB7CisJCWlmICggKCByYyA9IHRsc19zcGxpdF9zdHJlYW0gKCB0bHMsIHBsYWludGV4dCwgcmVjb3JkX2xlbiwKKwkJCQkJICAgICAgICZkYXRhLCAmbGVuLCAmbWFjICkgKSAhPSAwICkKKwkJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQlpZiAoICggcmMgPSB0bHNfc3BsaXRfYmxvY2sgKCB0bHMsIHBsYWludGV4dCwgcmVjb3JkX2xlbiwKKwkJCQkJICAgICAgJmRhdGEsICZsZW4sICZtYWMgKSApICE9IDAgKQorCQkJZ290byBkb25lOworCX0KKworCS8qIFZlcmlmeSBNQUMgKi8KKwlwbGFpbnRleHRfdGxzaGRyLnR5cGUgPSB0bHNoZHItPnR5cGU7CisJcGxhaW50ZXh0X3Rsc2hkci52ZXJzaW9uID0gdGxzaGRyLT52ZXJzaW9uOworCXBsYWludGV4dF90bHNoZHIubGVuZ3RoID0gaHRvbnMgKCBsZW4gKTsKKwl0bHNfaG1hYyAoIHRscywgY2lwaGVyc3BlYywgdGxzLT5yeF9zZXEsICZwbGFpbnRleHRfdGxzaGRyLAorCQkgICBkYXRhLCBsZW4sIHZlcmlmeV9tYWMpOworCWlmICggbWVtY21wICggbWFjLCB2ZXJpZnlfbWFjLCBtYWNfbGVuICkgIT0gMCApIHsKKwkJREJHQyAoIHRscywgIlRMUyAlcCBmYWlsZWQgTUFDIHZlcmlmaWNhdGlvblxuIiwgdGxzICk7CisJCURCR0NfSEQgKCB0bHMsIHBsYWludGV4dCwgcmVjb3JkX2xlbiApOworCQlnb3RvIGRvbmU7CisJfQorCisJREJHQzIgKCB0bHMsICJSZWNlaXZlZCBwbGFpbnRleHQgZGF0YTpcbiIgKTsKKwlEQkdDMl9IRCAoIHRscywgZGF0YSwgbGVuICk7CisKKwkvKiBQcm9jZXNzIHBsYWludGV4dCByZWNvcmQgKi8KKwlpZiAoICggcmMgPSB0bHNfbmV3X3JlY29yZCAoIHRscywgdGxzaGRyLT50eXBlLCBkYXRhLCBsZW4gKSApICE9IDAgKQorCQlnb3RvIGRvbmU7CisKKwlyYyA9IDA7CisgZG9uZToKKwlmcmVlICggcGxhaW50ZXh0ICk7CisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUGxhaW50ZXh0IHN0cmVhbSBvcGVyYXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogQ2xvc2UgaW50ZXJmYWNlCisgKgorICogQHYgeGZlcgkJUGxhaW5zdHJlYW0gZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIHRsc19wbGFpbnN0cmVhbV9jbG9zZSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHJjICkgeworCXN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzID0KKwkJY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IHRsc19zZXNzaW9uLCBwbGFpbnN0cmVhbS54ZmVyICk7CisKKwl0bHNfY2xvc2UgKCB0bHMsIHJjICk7Cit9CisKKy8qKgorICogQ2hlY2sgZmxvdyBjb250cm9sIHdpbmRvdworICoKKyAqIEB2IHhmZXIJCVBsYWluc3RyZWFtIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAcmV0IGxlbgkJTGVuZ3RoIG9mIHdpbmRvdworICovCitzdGF0aWMgc2l6ZV90IHRsc19wbGFpbnN0cmVhbV93aW5kb3cgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIgKSB7CisJc3RydWN0IHRsc19zZXNzaW9uICp0bHMgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgdGxzX3Nlc3Npb24sIHBsYWluc3RyZWFtLnhmZXIgKTsKKworCS8qIEJsb2NrIHdpbmRvdyB1bmxlc3Mgd2UgYXJlIHJlYWR5IHRvIGFjY2VwdCBkYXRhICovCisJaWYgKCB0bHMtPnR4X3N0YXRlICE9IFRMU19UWF9EQVRBICkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZmlsdGVyX3dpbmRvdyAoIHhmZXIgKTsKK30KKworLyoqCisgKiBEZWxpdmVyIGRhdGFncmFtIGFzIHJhdyBkYXRhCisgKgorICogQHYgeGZlcgkJUGxhaW5zdHJlYW0gZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IGRhdGEJCURhdGEgYnVmZmVyCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGxzX3BsYWluc3RyZWFtX2RlbGl2ZXJfcmF3ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCQkgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscyA9CisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCB0bHNfc2Vzc2lvbiwgcGxhaW5zdHJlYW0ueGZlciApOworCQorCS8qIFJlZnVzZSB1bmxlc3Mgd2UgYXJlIHJlYWR5IHRvIGFjY2VwdCBkYXRhICovCisJaWYgKCB0bHMtPnR4X3N0YXRlICE9IFRMU19UWF9EQVRBICkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCXJldHVybiB0bHNfc2VuZF9wbGFpbnRleHQgKCB0bHMsIFRMU19UWVBFX0RBVEEsIGRhdGEsIGxlbiApOworfQorCisvKiogVExTIHBsYWludGV4dCBzdHJlYW0gb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCB4ZmVyX2ludGVyZmFjZV9vcGVyYXRpb25zIHRsc19wbGFpbnN0cmVhbV9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSB0bHNfcGxhaW5zdHJlYW1fY2xvc2UsCisJLnZyZWRpcmVjdAk9IGlnbm9yZV94ZmVyX3ZyZWRpcmVjdCwKKwkud2luZG93CQk9IHRsc19wbGFpbnN0cmVhbV93aW5kb3csCisJLmFsbG9jX2lvYgk9IGRlZmF1bHRfeGZlcl9hbGxvY19pb2IsCisJLmRlbGl2ZXJfaW9iCT0geGZlcl9kZWxpdmVyX2FzX3JhdywKKwkuZGVsaXZlcl9yYXcJPSB0bHNfcGxhaW5zdHJlYW1fZGVsaXZlcl9yYXcsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2lwaGVydGV4dCBzdHJlYW0gb3BlcmF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIENsb3NlIGludGVyZmFjZQorICoKKyAqIEB2IHhmZXIJCVBsYWluc3RyZWFtIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiByYwkJUmVhc29uIGZvciBjbG9zZQorICovCitzdGF0aWMgdm9pZCB0bHNfY2lwaGVyc3RyZWFtX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKSB7CisJc3RydWN0IHRsc19zZXNzaW9uICp0bHMgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgdGxzX3Nlc3Npb24sIGNpcGhlcnN0cmVhbS54ZmVyICk7CisKKwl0bHNfY2xvc2UgKCB0bHMsIHJjICk7Cit9CisKKy8qKgorICogSGFuZGxlIHJlY2VpdmVkIFRMUyBoZWFkZXIKKyAqCisgKiBAdiB0bHMJCVRMUyBzZXNzaW9uCisgKiBAcmV0IHJjCQlSZXR1cm5lZCBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRsc19uZXdkYXRhX3Byb2Nlc3NfaGVhZGVyICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMgKSB7CisJc2l6ZV90IGRhdGFfbGVuID0gbnRvaHMgKCB0bHMtPnJ4X2hlYWRlci5sZW5ndGggKTsKKworCS8qIEFsbG9jYXRlIGRhdGEgYnVmZmVyIG5vdyB0aGF0IHdlIGtub3cgdGhlIGxlbmd0aCAqLworCWFzc2VydCAoIHRscy0+cnhfZGF0YSA9PSBOVUxMICk7CisJdGxzLT5yeF9kYXRhID0gbWFsbG9jICggZGF0YV9sZW4gKTsKKwlpZiAoICEgdGxzLT5yeF9kYXRhICkgeworCQlEQkdDICggdGxzLCAiVExTICVwIGNvdWxkIG5vdCBhbGxvY2F0ZSAlemQgYnl0ZXMgIgorCQkgICAgICAgImZvciByZWNlaXZlIGJ1ZmZlclxuIiwgdGxzLCBkYXRhX2xlbiApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBNb3ZlIHRvIGRhdGEgc3RhdGUgKi8KKwl0bHMtPnJ4X3N0YXRlID0gVExTX1JYX0RBVEE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGUgcmVjZWl2ZWQgVExTIGRhdGEgcGF5bG9hZAorICoKKyAqIEB2IHRscwkJVExTIHNlc3Npb24KKyAqIEByZXQgcmMJCVJldHVybmVkIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGxzX25ld2RhdGFfcHJvY2Vzc19kYXRhICggc3RydWN0IHRsc19zZXNzaW9uICp0bHMgKSB7CisJaW50IHJjOworCisJLyogUHJvY2VzcyByZWNvcmQgKi8KKwlpZiAoICggcmMgPSB0bHNfbmV3X2NpcGhlcnRleHQgKCB0bHMsICZ0bHMtPnJ4X2hlYWRlciwKKwkJCQkJIHRscy0+cnhfZGF0YSApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIEluY3JlbWVudCBSWCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl0bHMtPnJ4X3NlcSArPSAxOworCisJLyogRnJlZSBkYXRhIGJ1ZmZlciAqLworCWZyZWUgKCB0bHMtPnJ4X2RhdGEgKTsKKwl0bHMtPnJ4X2RhdGEgPSBOVUxMOworCisJLyogUmV0dXJuIHRvIGhlYWRlciBzdGF0ZSAqLworCXRscy0+cnhfc3RhdGUgPSBUTFNfUlhfSEVBREVSOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVjZWl2ZSBuZXcgY2lwaGVydGV4dAorICoKKyAqIEB2IGFwcAkJU3RyZWFtIGFwcGxpY2F0aW9uCisgKiBAdiBkYXRhCQlEYXRhIHJlY2VpdmVkCisgKiBAdiBsZW4JCUxlbmd0aCBvZiByZWNlaXZlZCBkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0bHNfY2lwaGVyc3RyZWFtX2RlbGl2ZXJfcmF3ICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLAorCQkJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IHRsc19zZXNzaW9uICp0bHMgPSAKKwkJY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IHRsc19zZXNzaW9uLCBjaXBoZXJzdHJlYW0ueGZlciApOworCXNpemVfdCBmcmFnX2xlbjsKKwl2b2lkICpidWY7CisJc2l6ZV90IGJ1Zl9sZW47CisJaW50ICggKiBwcm9jZXNzICkgKCBzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRscyApOworCWludCByYzsKKworCXdoaWxlICggbGVuICkgeworCQkvKiBTZWxlY3QgYnVmZmVyIGFjY29yZGluZyB0byBjdXJyZW50IHN0YXRlICovCisJCXN3aXRjaCAoIHRscy0+cnhfc3RhdGUgKSB7CisJCWNhc2UgVExTX1JYX0hFQURFUjoKKwkJCWJ1ZiA9ICZ0bHMtPnJ4X2hlYWRlcjsKKwkJCWJ1Zl9sZW4gPSBzaXplb2YgKCB0bHMtPnJ4X2hlYWRlciApOworCQkJcHJvY2VzcyA9IHRsc19uZXdkYXRhX3Byb2Nlc3NfaGVhZGVyOworCQkJYnJlYWs7CisJCWNhc2UgVExTX1JYX0RBVEE6CisJCQlidWYgPSB0bHMtPnJ4X2RhdGE7CisJCQlidWZfbGVuID0gbnRvaHMgKCB0bHMtPnJ4X2hlYWRlci5sZW5ndGggKTsKKwkJCXByb2Nlc3MgPSB0bHNfbmV3ZGF0YV9wcm9jZXNzX2RhdGE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWFzc2VydCAoIDAgKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogQ29weSBkYXRhIHBvcnRpb24gdG8gYnVmZmVyICovCisJCWZyYWdfbGVuID0gKCBidWZfbGVuIC0gdGxzLT5yeF9yY3ZkICk7CisJCWlmICggZnJhZ19sZW4gPiBsZW4gKQorCQkJZnJhZ19sZW4gPSBsZW47CisJCW1lbWNweSAoICggYnVmICsgdGxzLT5yeF9yY3ZkICksIGRhdGEsIGZyYWdfbGVuICk7CisJCXRscy0+cnhfcmN2ZCArPSBmcmFnX2xlbjsKKwkJZGF0YSArPSBmcmFnX2xlbjsKKwkJbGVuIC09IGZyYWdfbGVuOworCisJCS8qIFByb2Nlc3MgZGF0YSBpZiBidWZmZXIgaXMgbm93IGZ1bGwgKi8KKwkJaWYgKCB0bHMtPnJ4X3JjdmQgPT0gYnVmX2xlbiApIHsKKwkJCWlmICggKCByYyA9IHByb2Nlc3MgKCB0bHMgKSApICE9IDAgKSB7CisJCQkJdGxzX2Nsb3NlICggdGxzLCByYyApOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCXRscy0+cnhfcmN2ZCA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqIFRMUyBjaXBoZXJ0ZXh0IHN0cmVhbSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgdGxzX2NpcGhlcnN0cmVhbV9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSB0bHNfY2lwaGVyc3RyZWFtX2Nsb3NlLAorCS52cmVkaXJlY3QJPSB4ZmVyX3ZyZW9wZW4sCisJLndpbmRvdwkJPSBmaWx0ZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHhmZXJfZGVsaXZlcl9hc19yYXcsCisJLmRlbGl2ZXJfcmF3CT0gdGxzX2NpcGhlcnN0cmVhbV9kZWxpdmVyX3JhdywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb250cm9sbGluZyBwcm9jZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogVExTIFRYIHN0YXRlIG1hY2hpbmUKKyAqCisgKiBAdiBwcm9jZXNzCQlUTFMgcHJvY2VzcworICovCitzdGF0aWMgdm9pZCB0bHNfc3RlcCAoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzICkgeworCXN0cnVjdCB0bHNfc2Vzc2lvbiAqdGxzID0KKwkJY29udGFpbmVyX29mICggcHJvY2Vzcywgc3RydWN0IHRsc19zZXNzaW9uLCBwcm9jZXNzICk7CisJaW50IHJjOworCisJLyogV2FpdCBmb3IgY2lwaGVyc3RyZWFtIHRvIGJlY29tZSByZWFkeSAqLworCWlmICggISB4ZmVyX3dpbmRvdyAoICZ0bHMtPmNpcGhlcnN0cmVhbS54ZmVyICkgKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKCB0bHMtPnR4X3N0YXRlICkgeworCWNhc2UgVExTX1RYX05PTkU6CisJCS8qIE5vdGhpbmcgdG8gZG8gKi8KKwkJYnJlYWs7CisJY2FzZSBUTFNfVFhfQ0xJRU5UX0hFTExPOgorCQkvKiBTZW5kIENsaWVudCBIZWxsbyAqLworCQlpZiAoICggcmMgPSB0bHNfc2VuZF9jbGllbnRfaGVsbG8gKCB0bHMgKSApICE9IDAgKSB7CisJCQlEQkdDICggdGxzLCAiVExTICVwIGNvdWxkIG5vdCBzZW5kIENsaWVudCBIZWxsbzogJXNcbiIsCisJCQkgICAgICAgdGxzLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXRscy0+dHhfc3RhdGUgPSBUTFNfVFhfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSBUTFNfVFhfQ0xJRU5UX0tFWV9FWENIQU5HRToKKwkJLyogU2VuZCBDbGllbnQgS2V5IEV4Y2hhbmdlICovCisJCWlmICggKCByYyA9IHRsc19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UgKCB0bHMgKSApICE9IDAgKSB7CisJCQlEQkdDICggdGxzLCAiVExTICVwIGNvdWxkIHNlbmQgQ2xpZW50IEtleSBFeGNoYW5nZTogIgorCQkJICAgICAgICIlc1xuIiwgdGxzLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXRscy0+dHhfc3RhdGUgPSBUTFNfVFhfQ0hBTkdFX0NJUEhFUjsKKwkJYnJlYWs7CisJY2FzZSBUTFNfVFhfQ0hBTkdFX0NJUEhFUjoKKwkJLyogU2VuZCBDaGFuZ2UgQ2lwaGVyLCBhbmQgdGhlbiBjaGFuZ2UgdGhlIGNpcGhlciBpbiB1c2UgKi8KKwkJaWYgKCAoIHJjID0gdGxzX3NlbmRfY2hhbmdlX2NpcGhlciAoIHRscyApICkgIT0gMCApIHsKKwkJCURCR0MgKCB0bHMsICJUTFMgJXAgY291bGQgbm90IHNlbmQgQ2hhbmdlIENpcGhlcjogIgorCQkJICAgICAgICIlc1xuIiwgdGxzLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmICggKCByYyA9IHRsc19jaGFuZ2VfY2lwaGVyICggdGxzLAorCQkJCQkJJnRscy0+dHhfY2lwaGVyc3BlY19wZW5kaW5nLAorCQkJCQkJJnRscy0+dHhfY2lwaGVyc3BlYyApKSAhPSAwICl7CisJCQlEQkdDICggdGxzLCAiVExTICVwIGNvdWxkIG5vdCBhY3RpdmF0ZSBUWCBjaXBoZXI6ICIKKwkJCSAgICAgICAiJXNcbiIsIHRscywgc3RyZXJyb3IgKCByYyApICk7CisJCQlnb3RvIGVycjsKKwkJfQorCQl0bHMtPnR4X3NlcSA9IDA7CisJCXRscy0+dHhfc3RhdGUgPSBUTFNfVFhfRklOSVNIRUQ7CisJCWJyZWFrOworCWNhc2UgVExTX1RYX0ZJTklTSEVEOgorCQkvKiBTZW5kIEZpbmlzaGVkICovCisJCWlmICggKCByYyA9IHRsc19zZW5kX2ZpbmlzaGVkICggdGxzICkgKSAhPSAwICkgeworCQkJREJHQyAoIHRscywgIlRMUyAlcCBjb3VsZCBub3Qgc2VuZCBGaW5pc2hlZDogJXNcbiIsCisJCQkgICAgICAgdGxzLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXRscy0+dHhfc3RhdGUgPSBUTFNfVFhfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSBUTFNfVFhfREFUQToKKwkJLyogTm90aGluZyB0byBkbyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhc3NlcnQgKCAwICk7CisJfQorCisJcmV0dXJuOworCisgZXJyOgorCXRsc19jbG9zZSAoIHRscywgcmMgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEluc3RhbnRpYXRvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitpbnQgYWRkX3RscyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgc3RydWN0IHhmZXJfaW50ZXJmYWNlICoqbmV4dCApIHsKKwlzdHJ1Y3QgdGxzX3Nlc3Npb24gKnRsczsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIFRMUyBzdHJ1Y3R1cmUgKi8KKwl0bHMgPSBtYWxsb2MgKCBzaXplb2YgKCAqdGxzICkgKTsKKwlpZiAoICEgdGxzICkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0ICggdGxzLCAwLCBzaXplb2YgKCAqdGxzICkgKTsKKwl0bHMtPnJlZmNudC5mcmVlID0gZnJlZV90bHM7CisJZmlsdGVyX2luaXQgKCAmdGxzLT5wbGFpbnN0cmVhbSwgJnRsc19wbGFpbnN0cmVhbV9vcGVyYXRpb25zLAorCQkgICAgICAmdGxzLT5jaXBoZXJzdHJlYW0sICZ0bHNfY2lwaGVyc3RyZWFtX29wZXJhdGlvbnMsCisJCSAgICAgICZ0bHMtPnJlZmNudCApOworCXRsc19jbGVhcl9jaXBoZXIgKCB0bHMsICZ0bHMtPnR4X2NpcGhlcnNwZWMgKTsKKwl0bHNfY2xlYXJfY2lwaGVyICggdGxzLCAmdGxzLT50eF9jaXBoZXJzcGVjX3BlbmRpbmcgKTsKKwl0bHNfY2xlYXJfY2lwaGVyICggdGxzLCAmdGxzLT5yeF9jaXBoZXJzcGVjICk7CisJdGxzX2NsZWFyX2NpcGhlciAoIHRscywgJnRscy0+cnhfY2lwaGVyc3BlY19wZW5kaW5nICk7CisJdGxzLT5jbGllbnRfcmFuZG9tLmdtdF91bml4X3RpbWUgPSAwOworCXRsc19nZW5lcmF0ZV9yYW5kb20gKCAmdGxzLT5jbGllbnRfcmFuZG9tLnJhbmRvbSwKKwkJCSAgICAgICggc2l6ZW9mICggdGxzLT5jbGllbnRfcmFuZG9tLnJhbmRvbSApICkgKTsKKwl0bHMtPnByZV9tYXN0ZXJfc2VjcmV0LnZlcnNpb24gPSBodG9ucyAoIFRMU19WRVJTSU9OX1RMU18xXzAgKTsKKwl0bHNfZ2VuZXJhdGVfcmFuZG9tICggJnRscy0+cHJlX21hc3Rlcl9zZWNyZXQucmFuZG9tLAorCQkJICAgICAgKCBzaXplb2YgKCB0bHMtPnByZV9tYXN0ZXJfc2VjcmV0LnJhbmRvbSApICkgKTsKKwlkaWdlc3RfaW5pdCAoICZtZDVfYWxnb3JpdGhtLCB0bHMtPmhhbmRzaGFrZV9tZDVfY3R4ICk7CisJZGlnZXN0X2luaXQgKCAmc2hhMV9hbGdvcml0aG0sIHRscy0+aGFuZHNoYWtlX3NoYTFfY3R4ICk7CisJdGxzLT50eF9zdGF0ZSA9IFRMU19UWF9DTElFTlRfSEVMTE87CisJcHJvY2Vzc19pbml0ICggJnRscy0+cHJvY2VzcywgdGxzX3N0ZXAsICZ0bHMtPnJlZmNudCApOworCisJLyogQXR0YWNoIHRvIHBhcmVudCBpbnRlcmZhY2UsIG1vcnRhbGlzZSBzZWxmLCBhbmQgcmV0dXJuICovCisJeGZlcl9wbHVnX3BsdWcgKCAmdGxzLT5wbGFpbnN0cmVhbS54ZmVyLCB4ZmVyICk7CisJKm5leHQgPSAmdGxzLT5jaXBoZXJzdHJlYW0ueGZlcjsKKwlyZWZfcHV0ICggJnRscy0+cmVmY250ICk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC91ZHAuYyBiL2dweGUvc3JjL25ldC91ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE2NTVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L3VkcC5jCkBAIC0wLDAgKzEsNDYzIEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvdGNwaXAuaD4KKyNpbmNsdWRlIDxncHhlL2lvYnVmLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisjaW5jbHVkZSA8Z3B4ZS91cmkuaD4KKyNpbmNsdWRlIDxncHhlL3VkcC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBVRFAgcHJvdG9jb2wKKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKy8qKgorICogQSBVRFAgY29ubmVjdGlvbgorICoKKyAqLworc3RydWN0IHVkcF9jb25uZWN0aW9uIHsKKwkvKiogUmVmZXJlbmNlIGNvdW50ZXIgKi8KKwlzdHJ1Y3QgcmVmY250IHJlZmNudDsKKwkvKiogTGlzdCBvZiBVRFAgY29ubmVjdGlvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiogRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgeGZlcjsKKworCS8qKiBMb2NhbCBzb2NrZXQgYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkcl90Y3BpcCBsb2NhbDsKKwkvKiogUmVtb3RlIHNvY2tldCBhZGRyZXNzICovCisJc3RydWN0IHNvY2thZGRyX3RjcGlwIHBlZXI7Cit9OworCisvKioKKyAqIExpc3Qgb2YgcmVnaXN0ZXJlZCBVRFAgY29ubmVjdGlvbnMKKyAqLworc3RhdGljIExJU1RfSEVBRCAoIHVkcF9jb25ucyApOworCisvKiBGb3J3YXJkIGRlY2xhdGF0aW9ucyAqLworc3RhdGljIHN0cnVjdCB4ZmVyX2ludGVyZmFjZV9vcGVyYXRpb25zIHVkcF94ZmVyX29wZXJhdGlvbnM7CitzdHJ1Y3QgdGNwaXBfcHJvdG9jb2wgdWRwX3Byb3RvY29sOworCisvKioKKyAqIEJpbmQgVURQIGNvbm5lY3Rpb24gdG8gbG9jYWwgcG9ydAorICoKKyAqIEB2IHVkcAkJVURQIGNvbm5lY3Rpb24KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIE9wZW5zIHRoZSBVRFAgY29ubmVjdGlvbiBhbmQgYmluZHMgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBwb3J0LiAgSWYKKyAqIG5vIGxvY2FsIHBvcnQgaXMgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYXZhaWxhYmxlIHBvcnQgd2lsbCBiZSB1c2VkLgorICovCitzdGF0aWMgaW50IHVkcF9iaW5kICggc3RydWN0IHVkcF9jb25uZWN0aW9uICp1ZHAgKSB7CisJc3RydWN0IHVkcF9jb25uZWN0aW9uICpleGlzdGluZzsKKwlzdGF0aWMgdWludDE2X3QgdHJ5X3BvcnQgPSAxMDIzOworCisJLyogSWYgbm8gcG9ydCBzcGVjaWZpZWQsIGZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBwb3J0ICovCisJaWYgKCAhIHVkcC0+bG9jYWwuc3RfcG9ydCApIHsKKwkJd2hpbGUgKCB0cnlfcG9ydCApIHsKKwkJCXRyeV9wb3J0Kys7CisJCQlpZiAoIHRyeV9wb3J0IDwgMTAyNCApCisJCQkJY29udGludWU7CisJCQl1ZHAtPmxvY2FsLnN0X3BvcnQgPSBodG9ucyAoIHRyeV9wb3J0ICk7CisJCQlpZiAoIHVkcF9iaW5kICggdWRwICkgPT0gMCApCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIC1FQUREUklOVVNFOworCX0KKworCS8qIEF0dGVtcHQgYmluZCB0byBsb2NhbCBwb3J0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIGV4aXN0aW5nLCAmdWRwX2Nvbm5zLCBsaXN0ICkgeworCQlpZiAoIGV4aXN0aW5nLT5sb2NhbC5zdF9wb3J0ID09IHVkcC0+bG9jYWwuc3RfcG9ydCApIHsKKwkJCURCR0MgKCB1ZHAsICJVRFAgJXAgY291bGQgbm90IGJpbmQ6IHBvcnQgJWQgaW4gdXNlXG4iLAorCQkJICAgICAgIHVkcCwgbnRvaHMgKCB1ZHAtPmxvY2FsLnN0X3BvcnQgKSApOworCQkJcmV0dXJuIC1FQUREUklOVVNFOworCQl9CisJfQorCisJLyogQWRkIHRvIFVEUCBjb25uZWN0aW9uIGxpc3QgKi8KKwlEQkdDICggdWRwLCAiVURQICVwIGJvdW5kIHRvIHBvcnQgJWRcbiIsCisJICAgICAgIHVkcCwgbnRvaHMgKCB1ZHAtPmxvY2FsLnN0X3BvcnQgKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogT3BlbiBhIFVEUCBjb25uZWN0aW9uCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHBlZXIJCVBlZXIgc29ja2V0IGFkZHJlc3MsIG9yIE5VTEwKKyAqIEB2IGxvY2FsCQlMb2NhbCBzb2NrZXQgYWRkcmVzcywgb3IgTlVMTAorICogQHYgcHJvbWlzYwkJU29ja2V0IGlzIHByb21pc2N1b3VzCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB1ZHBfb3Blbl9jb21tb24gKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkgICAgIHN0cnVjdCBzb2NrYWRkciAqcGVlciwgc3RydWN0IHNvY2thZGRyICpsb2NhbCwKKwkJCSAgICAgaW50IHByb21pc2MgKSB7CisJc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9wZWVyID0gKCBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKiApIHBlZXI7CisJc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9sb2NhbCA9ICggc3RydWN0IHNvY2thZGRyX3RjcGlwICogKSBsb2NhbDsKKwlzdHJ1Y3QgdWRwX2Nvbm5lY3Rpb24gKnVkcDsKKwlpbnQgcmM7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBzdHJ1Y3R1cmUgKi8KKwl1ZHAgPSB6YWxsb2MgKCBzaXplb2YgKCAqdWRwICkgKTsKKwlpZiAoICEgdWRwICkKKwkJcmV0dXJuIC1FTk9NRU07CisJREJHQyAoIHVkcCwgIlVEUCAlcCBhbGxvY2F0ZWRcbiIsIHVkcCApOworCXhmZXJfaW5pdCAoICZ1ZHAtPnhmZXIsICZ1ZHBfeGZlcl9vcGVyYXRpb25zLCAmdWRwLT5yZWZjbnQgKTsKKwlpZiAoIHN0X3BlZXIgKQorCQltZW1jcHkgKCAmdWRwLT5wZWVyLCBzdF9wZWVyLCBzaXplb2YgKCB1ZHAtPnBlZXIgKSApOworCWlmICggc3RfbG9jYWwgKQorCQltZW1jcHkgKCAmdWRwLT5sb2NhbCwgc3RfbG9jYWwsIHNpemVvZiAoIHVkcC0+bG9jYWwgKSApOworCisJLyogQmluZCB0byBsb2NhbCBwb3J0ICovCisJaWYgKCAhIHByb21pc2MgKSB7CisJCWlmICggKCByYyA9IHVkcF9iaW5kICggdWRwICkgKSAhPSAwICkKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIEF0dGFjaCBwYXJlbnQgaW50ZXJmYWNlLCB0cmFuc2ZlciByZWZlcmVuY2UgdG8gY29ubmVjdGlvbgorCSAqIGxpc3QgYW5kIHJldHVybgorCSAqLworCXhmZXJfcGx1Z19wbHVnICggJnVkcC0+eGZlciwgeGZlciApOworCWxpc3RfYWRkICggJnVkcC0+bGlzdCwgJnVkcF9jb25ucyApOworCXJldHVybiAwOworCisgZXJyOgorCXJlZl9wdXQgKCAmdWRwLT5yZWZjbnQgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogT3BlbiBhIFVEUCBjb25uZWN0aW9uCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHBlZXIJCVBlZXIgc29ja2V0IGFkZHJlc3MKKyAqIEB2IGxvY2FsCQlMb2NhbCBzb2NrZXQgYWRkcmVzcywgb3IgTlVMTAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCB1ZHBfb3BlbiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgc3RydWN0IHNvY2thZGRyICpwZWVyLAorCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmxvY2FsICkgeworCXJldHVybiB1ZHBfb3Blbl9jb21tb24gKCB4ZmVyLCBwZWVyLCBsb2NhbCwgMCApOworfQorCisvKioKKyAqIE9wZW4gYSBwcm9taXNjdW91cyBVRFAgY29ubmVjdGlvbgorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBQcm9taXNjdW91cyBVRFAgY29ubmVjdGlvbnMgYXJlIHJlcXVpcmVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlCisgKiBQWEUgQVBJLgorICovCitpbnQgdWRwX29wZW5fcHJvbWlzYyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciApIHsKKwlyZXR1cm4gdWRwX29wZW5fY29tbW9uICggeGZlciwgTlVMTCwgTlVMTCwgMSApOworfQorCisvKioKKyAqIENsb3NlIGEgVURQIGNvbm5lY3Rpb24KKyAqCisgKiBAdiB1ZHAJCVVEUCBjb25uZWN0aW9uCisgKiBAdiByYwkJUmVhc29uIGZvciBjbG9zZQorICovCitzdGF0aWMgdm9pZCB1ZHBfY2xvc2UgKCBzdHJ1Y3QgdWRwX2Nvbm5lY3Rpb24gKnVkcCwgaW50IHJjICkgeworCisJLyogQ2xvc2UgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UgKi8KKwl4ZmVyX251bGxpZnkgKCAmdWRwLT54ZmVyICk7CisJeGZlcl9jbG9zZSAoICZ1ZHAtPnhmZXIsIHJjICk7CisKKwkvKiBSZW1vdmUgZnJvbSBsaXN0IG9mIGNvbm5lY3Rpb25zIGFuZCBkcm9wIGxpc3QncyByZWZlcmVuY2UgKi8KKwlsaXN0X2RlbCAoICZ1ZHAtPmxpc3QgKTsKKwlyZWZfcHV0ICggJnVkcC0+cmVmY250ICk7CisKKwlEQkdDICggdWRwLCAiVURQICVwIGNsb3NlZFxuIiwgdWRwICk7Cit9CisKKy8qKgorICogVHJhbnNtaXQgZGF0YSB2aWEgYSBVRFAgY29ubmVjdGlvbiB0byBhIHNwZWNpZmllZCBhZGRyZXNzCisgKgorICogQHYgdWRwCQlVRFAgY29ubmVjdGlvbgorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEB2IHNyYwkJU291cmNlIGFkZHJlc3MsIG9yIE5VTEwgdG8gdXNlIGRlZmF1bHQKKyAqIEB2IGRlc3QJCURlc3RpbmF0aW9uIGFkZHJlc3MsIG9yIE5VTEwgdG8gdXNlIGRlZmF1bHQKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UsIG9yIE5VTEwgdG8gdXNlIGRlZmF1bHQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHVkcF90eCAoIHN0cnVjdCB1ZHBfY29ubmVjdGlvbiAqdWRwLCBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJICAgIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3JjLCBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKmRlc3QsCisJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworICAgICAgIAlzdHJ1Y3QgdWRwX2hlYWRlciAqdWRwaGRyOworCXNpemVfdCBsZW47CisJaW50IHJjOworCisJLyogQ2hlY2sgd2UgY2FuIGFjY29tbW9kYXRlIHRoZSBoZWFkZXIgKi8KKwlpZiAoICggcmMgPSBpb2JfZW5zdXJlX2hlYWRyb29tICggaW9idWYsIFVEUF9NQVhfSExFTiApICkgIT0gMCApIHsKKwkJZnJlZV9pb2IgKCBpb2J1ZiApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogRmlsbCBpbiBkZWZhdWx0IHZhbHVlcyBpZiBub3QgZXhwbGljaXRseSBwcm92aWRlZCAqLworCWlmICggISBzcmMgKQorCQlzcmMgPSAmdWRwLT5sb2NhbDsKKwlpZiAoICEgZGVzdCApCisJCWRlc3QgPSAmdWRwLT5wZWVyOworCisJLyogQWRkIHRoZSBVRFAgaGVhZGVyICovCisJdWRwaGRyID0gaW9iX3B1c2ggKCBpb2J1Ziwgc2l6ZW9mICggKnVkcGhkciApICk7CisJbGVuID0gaW9iX2xlbiAoIGlvYnVmICk7CisJdWRwaGRyLT5kZXN0ID0gZGVzdC0+c3RfcG9ydDsKKwl1ZHBoZHItPnNyYyA9IHNyYy0+c3RfcG9ydDsKKwl1ZHBoZHItPmxlbiA9IGh0b25zICggbGVuICk7CisJdWRwaGRyLT5jaGtzdW0gPSAwOworCXVkcGhkci0+Y2hrc3VtID0gdGNwaXBfY2hrc3VtICggdWRwaGRyLCBsZW4gKTsKKworCS8qIER1bXAgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCisJREJHQyAoIHVkcCwgIlVEUCAlcCBUWCAlZC0+JWQgbGVuICVkXG4iLCB1ZHAsCisJICAgICAgIG50b2hzICggdWRwaGRyLT5zcmMgKSwgbnRvaHMgKCB1ZHBoZHItPmRlc3QgKSwKKwkgICAgICAgbnRvaHMgKCB1ZHBoZHItPmxlbiApICk7CisKKwkvKiBTZW5kIGl0IHRvIHRoZSBuZXh0IGxheWVyIGZvciBwcm9jZXNzaW5nICovCisJaWYgKCAoIHJjID0gdGNwaXBfdHggKCBpb2J1ZiwgJnVkcF9wcm90b2NvbCwgc3JjLCBkZXN0LCBuZXRkZXYsCisJCQkgICAgICAgJnVkcGhkci0+Y2hrc3VtICkgKSAhPSAwICkgeworCQlEQkdDICggdWRwLCAiVURQICVwIGNvdWxkIG5vdCB0cmFuc21pdCBwYWNrZXQ6ICVzXG4iLAorCQkgICAgICAgdWRwLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIElkZW50aWZ5IFVEUCBjb25uZWN0aW9uIGJ5IGxvY2FsIGFkZHJlc3MKKyAqCisgKiBAdiBsb2NhbAkJTG9jYWwgYWRkcmVzcworICogQHJldCB1ZHAJCVVEUCBjb25uZWN0aW9uLCBvciBOVUxMCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdWRwX2Nvbm5lY3Rpb24gKiB1ZHBfZGVtdXggKCBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKmxvY2FsICkgeworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgZW1wdHlfc29ja2FkZHIgPSB7IC5wYWQgPSB7IDAsIH0gfTsKKwlzdHJ1Y3QgdWRwX2Nvbm5lY3Rpb24gKnVkcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCB1ZHAsICZ1ZHBfY29ubnMsIGxpc3QgKSB7CisJCWlmICggKCAoIHVkcC0+bG9jYWwuc3RfZmFtaWx5ID09IGxvY2FsLT5zdF9mYW1pbHkgKSB8fAorCQkgICAgICAgKCB1ZHAtPmxvY2FsLnN0X2ZhbWlseSA9PSAwICkgKSAmJgorCQkgICAgICggKCB1ZHAtPmxvY2FsLnN0X3BvcnQgPT0gbG9jYWwtPnN0X3BvcnQgKSB8fAorCQkgICAgICAgKCB1ZHAtPmxvY2FsLnN0X3BvcnQgPT0gMCApICkgJiYKKwkJICAgICAoICggbWVtY21wICggdWRwLT5sb2NhbC5wYWQsIGxvY2FsLT5wYWQsCisJCQkJICBzaXplb2YgKCB1ZHAtPmxvY2FsLnBhZCApICkgPT0gMCApIHx8CisJCSAgICAgICAoIG1lbWNtcCAoIHVkcC0+bG9jYWwucGFkLCBlbXB0eV9zb2NrYWRkci5wYWQsCisJCQkJICBzaXplb2YgKCB1ZHAtPmxvY2FsLnBhZCApICkgPT0gMCApICkgKSB7CisJCQlyZXR1cm4gdWRwOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIFByb2Nlc3MgYSByZWNlaXZlZCBwYWNrZXQKKyAqCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgc3Rfc3JjCQlQYXJ0aWFsbHktZmlsbGVkIHNvdXJjZSBhZGRyZXNzCisgKiBAdiBzdF9kZXN0CQlQYXJ0aWFsbHktZmlsbGVkIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEB2IHBzaGRyX2NzdW0JUHNldWRvLWhlYWRlciBjaGVja3N1bQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdWRwX3J4ICggc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqc3Rfc3JjLAorCQkgICAgc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9kZXN0LCB1aW50MTZfdCBwc2hkcl9jc3VtICkgeworCXN0cnVjdCB1ZHBfaGVhZGVyICp1ZHBoZHIgPSBpb2J1Zi0+ZGF0YTsKKwlzdHJ1Y3QgdWRwX2Nvbm5lY3Rpb24gKnVkcDsKKwlzdHJ1Y3QgeGZlcl9tZXRhZGF0YSBtZXRhOworCXNpemVfdCB1bGVuOworCXVuc2lnbmVkIGludCBjc3VtOworCWludCByYyA9IDA7CisKKwkvKiBTYW5pdHkgY2hlY2sgcGFja2V0ICovCisJaWYgKCBpb2JfbGVuICggaW9idWYgKSA8IHNpemVvZiAoICp1ZHBoZHIgKSApIHsKKwkJREJHICggIlVEUCBwYWNrZXQgdG9vIHNob3J0IGF0ICV6ZCBieXRlcyAobWluICV6ZCBieXRlcylcbiIsCisJCSAgICAgIGlvYl9sZW4gKCBpb2J1ZiApLCBzaXplb2YgKCAqdWRwaGRyICkgKTsKKwkJCisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwl1bGVuID0gbnRvaHMgKCB1ZHBoZHItPmxlbiApOworCWlmICggdWxlbiA8IHNpemVvZiAoICp1ZHBoZHIgKSApIHsKKwkJREJHICggIlVEUCBsZW5ndGggdG9vIHNob3J0IGF0ICV6ZCBieXRlcyAiCisJCSAgICAgICIoaGVhZGVyIGlzICV6ZCBieXRlcylcbiIsIHVsZW4sIHNpemVvZiAoICp1ZHBoZHIgKSApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCB1bGVuID4gaW9iX2xlbiAoIGlvYnVmICkgKSB7CisJCURCRyAoICJVRFAgbGVuZ3RoIHRvbyBsb25nIGF0ICV6ZCBieXRlcyAocGFja2V0IGlzICV6ZCAiCisJCSAgICAgICJieXRlcylcbiIsIHVsZW4sIGlvYl9sZW4gKCBpb2J1ZiApICk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIHVkcGhkci0+Y2hrc3VtICkgeworCQljc3VtID0gdGNwaXBfY29udGludWVfY2hrc3VtICggcHNoZHJfY3N1bSwgaW9idWYtPmRhdGEsIHVsZW4gKTsKKwkJaWYgKCBjc3VtICE9IDAgKSB7CisJCQlEQkcgKCAiVURQIGNoZWNrc3VtIGluY29ycmVjdCAoaXMgJTA0eCBpbmNsdWRpbmcgIgorCQkJICAgICAgImNoZWNrc3VtIGZpZWxkLCBzaG91bGQgYmUgMDAwMClcbiIsIGNzdW0gKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCS8qIFBhcnNlIHBhcmFtZXRlcnMgZnJvbSBoZWFkZXIgYW5kIHN0cmlwIGhlYWRlciAqLworCXN0X3NyYy0+c3RfcG9ydCA9IHVkcGhkci0+c3JjOworCXN0X2Rlc3QtPnN0X3BvcnQgPSB1ZHBoZHItPmRlc3Q7CisJdWRwID0gdWRwX2RlbXV4ICggc3RfZGVzdCApOworCWlvYl91bnB1dCAoIGlvYnVmLCAoIGlvYl9sZW4gKCBpb2J1ZiApIC0gdWxlbiApICk7CisJaW9iX3B1bGwgKCBpb2J1Ziwgc2l6ZW9mICggKnVkcGhkciApICk7CisKKwkvKiBEdW1wIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLworCURCR0MgKCB1ZHAsICJVRFAgJXAgUlggJWQ8LSVkIGxlbiAlemRcbiIsIHVkcCwKKwkgICAgICAgbnRvaHMgKCB1ZHBoZHItPmRlc3QgKSwgbnRvaHMgKCB1ZHBoZHItPnNyYyApLCB1bGVuICk7CisKKwkvKiBJZ25vcmUgaWYgbm8gbWF0Y2hpbmcgY29ubmVjdGlvbiBmb3VuZCAqLworCWlmICggISB1ZHAgKSB7CisJCURCRyAoICJObyBVRFAgY29ubmVjdGlvbiBsaXN0ZW5pbmcgb24gcG9ydCAlZFxuIiwKKwkJICAgICAgbnRvaHMgKCB1ZHBoZHItPmRlc3QgKSApOworCQlyYyA9IC1FTk9UQ09OTjsKKwkJZ290byBkb25lOworCX0KKworCS8qIFBhc3MgZGF0YSB0byBhcHBsaWNhdGlvbiAqLworCW1lbXNldCAoICZtZXRhLCAwLCBzaXplb2YgKCBtZXRhICkgKTsKKwltZXRhLnNyYyA9ICggc3RydWN0IHNvY2thZGRyICogKSBzdF9zcmM7CisJbWV0YS5kZXN0ID0gKCBzdHJ1Y3Qgc29ja2FkZHIgKiApIHN0X2Rlc3Q7CisJcmMgPSB4ZmVyX2RlbGl2ZXJfaW9iX21ldGEgKCAmdWRwLT54ZmVyLCBpb2JfZGlzb3duICggaW9idWYgKSwgJm1ldGEgKTsKKworIGRvbmU6CisJZnJlZV9pb2IgKCBpb2J1ZiApOworCXJldHVybiByYzsKK30KKworc3RydWN0IHRjcGlwX3Byb3RvY29sIHVkcF9wcm90b2NvbCBfX3RjcGlwX3Byb3RvY29sID0geworCS5uYW1lID0gIlVEUCIsCisJLnJ4ID0gdWRwX3J4LAorCS50Y3BpcF9wcm90byA9IElQX1VEUCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIENsb3NlIGludGVyZmFjZQorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiByYwkJUmVhc29uIGZvciBjbG9zZQorICovCitzdGF0aWMgdm9pZCB1ZHBfeGZlcl9jbG9zZSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHJjICkgeworCXN0cnVjdCB1ZHBfY29ubmVjdGlvbiAqdWRwID0KKwkJY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IHVkcF9jb25uZWN0aW9uLCB4ZmVyICk7CisKKwkvKiBDbG9zZSBjb25uZWN0aW9uICovCisJdWRwX2Nsb3NlICggdWRwLCByYyApOworfQorCisvKioKKyAqIEFsbG9jYXRlIEkvTyBidWZmZXIgZm9yIFVEUAorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiBsZW4JCVBheWxvYWQgc2l6ZQorICogQHJldCBpb2J1ZgkJSS9PIGJ1ZmZlciwgb3IgTlVMTAorICovCitzdGF0aWMgc3RydWN0IGlvX2J1ZmZlciAqIHVkcF9hbGxvY19pb2IgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkJCSAgc2l6ZV90IGxlbiApIHsKKwlzdHJ1Y3QgdWRwX2Nvbm5lY3Rpb24gKnVkcCA9CisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCB1ZHBfY29ubmVjdGlvbiwgeGZlciApOwkKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKworCWlvYnVmID0gYWxsb2NfaW9iICggVURQX01BWF9ITEVOICsgbGVuICk7CisJaWYgKCAhIGlvYnVmICkgeworCQlEQkdDICggdWRwLCAiVURQICVwIGNhbm5vdCBhbGxvY2F0ZSBidWZmZXIgb2YgbGVuZ3RoICV6ZFxuIiwKKwkJICAgICAgIHVkcCwgbGVuICk7CisJCXJldHVybiBOVUxMOworCX0KKwlpb2JfcmVzZXJ2ZSAoIGlvYnVmLCBVRFBfTUFYX0hMRU4gKTsKKwlyZXR1cm4gaW9idWY7Cit9CisKKy8qKgorICogRGVsaXZlciBkYXRhZ3JhbSBhcyBJL08gYnVmZmVyCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IGlvYnVmCQlEYXRhZ3JhbSBJL08gYnVmZmVyCisgKiBAdiBtZXRhCQlEYXRhIHRyYW5zZmVyIG1ldGFkYXRhCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB1ZHBfeGZlcl9kZWxpdmVyX2lvYiAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwKKwkJCQkgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJCSAgc3RydWN0IHhmZXJfbWV0YWRhdGEgKm1ldGEgKSB7CisJc3RydWN0IHVkcF9jb25uZWN0aW9uICp1ZHAgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgdWRwX2Nvbm5lY3Rpb24sIHhmZXIgKTsKKworCS8qIFRyYW5zbWl0IGRhdGEsIGlmIHBvc3NpYmxlICovCisJdWRwX3R4ICggdWRwLCBpb2J1ZiwgKCAoIHN0cnVjdCBzb2NrYWRkcl90Y3BpcCAqICkgbWV0YS0+c3JjICksCisJCSAoICggc3RydWN0IHNvY2thZGRyX3RjcGlwICogKSBtZXRhLT5kZXN0ICksIG1ldGEtPm5ldGRldiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBVRFAgZGF0YSB0cmFuc2ZlciBpbnRlcmZhY2Ugb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCB4ZmVyX2ludGVyZmFjZV9vcGVyYXRpb25zIHVkcF94ZmVyX29wZXJhdGlvbnMgPSB7CisJLmNsb3NlCQk9IHVkcF94ZmVyX2Nsb3NlLAorCS52cmVkaXJlY3QJPSBpZ25vcmVfeGZlcl92cmVkaXJlY3QsCisJLndpbmRvdwkJPSB1bmxpbWl0ZWRfeGZlcl93aW5kb3csCisJLmFsbG9jX2lvYgk9IHVkcF9hbGxvY19pb2IsCisJLmRlbGl2ZXJfaW9iCT0gdWRwX3hmZXJfZGVsaXZlcl9pb2IsCisJLmRlbGl2ZXJfcmF3CT0geGZlcl9kZWxpdmVyX2FzX2lvYiwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPcGVuZXJzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBVRFAgc29ja2V0IG9wZW5lciAqLworc3RydWN0IHNvY2tldF9vcGVuZXIgdWRwX3NvY2tldF9vcGVuZXIgX19zb2NrZXRfb3BlbmVyID0geworCS5zZW1hbnRpY3MJPSBVRFBfU09DS19ER1JBTSwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCisJLm9wZW4JCT0gdWRwX29wZW4sCit9OworCisvKiogTGlua2FnZSBoYWNrICovCitpbnQgdWRwX3NvY2tfZGdyYW0gPSBVRFBfU09DS19ER1JBTTsKKworLyoqCisgKiBPcGVuIFVEUCBVUkkKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdXJpCQlVUkkKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHVkcF9vcGVuX3VyaSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgc3RydWN0IHVyaSAqdXJpICkgeworCXN0cnVjdCBzb2NrYWRkcl90Y3BpcCBwZWVyOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCAhIHVyaS0+aG9zdCApCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0ICggJnBlZXIsIDAsIHNpemVvZiAoIHBlZXIgKSApOworCXBlZXIuc3RfcG9ydCA9IGh0b25zICggdXJpX3BvcnQgKCB1cmksIDAgKSApOworCXJldHVybiB4ZmVyX29wZW5fbmFtZWRfc29ja2V0ICggeGZlciwgU09DS19ER1JBTSwKKwkJCQkJKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZwZWVyLAorCQkJCQl1cmktPmhvc3QsIE5VTEwgKTsKK30KKworLyoqIFVEUCBVUkkgb3BlbmVyICovCitzdHJ1Y3QgdXJpX29wZW5lciB1ZHBfdXJpX29wZW5lciBfX3VyaV9vcGVuZXIgPSB7CisJLnNjaGVtZQkJPSAidWRwIiwKKwkub3BlbgkJPSB1ZHBfb3Blbl91cmksCit9OwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvbmV0L3VkcC9kaGNwLmMgYi9ncHhlL3NyYy9uZXQvdWRwL2RoY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTJjODIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvbmV0L3VkcC9kaGNwLmMKQEAgLTAsMCArMSwxNTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2RldmljZS5oPgorI2luY2x1ZGUgPGdweGUveGZlci5oPgorI2luY2x1ZGUgPGdweGUvb3Blbi5oPgorI2luY2x1ZGUgPGdweGUvam9iLmg+CisjaW5jbHVkZSA8Z3B4ZS9yZXRyeS5oPgorI2luY2x1ZGUgPGdweGUvdGNwaXAuaD4KKyNpbmNsdWRlIDxncHhlL2lwLmg+CisjaW5jbHVkZSA8Z3B4ZS91dWlkLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorI2luY2x1ZGUgPGdweGUvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3AuaD4KKyNpbmNsdWRlIDxncHhlL2RoY3BvcHRzLmg+CisjaW5jbHVkZSA8Z3B4ZS9kaGNwcGt0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9mZWF0dXJlcy5oPgorCisvKiogQGZpbGUKKyAqCisgKiBEeW5hbWljIEhvc3QgQ29uZmlndXJhdGlvbiBQcm90b2NvbAorICoKKyAqLworCitzdHJ1Y3QgZGhjcF9zZXNzaW9uOworc3RhdGljIGludCBkaGNwX3R4ICggc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCApOworCisvKioKKyAqIERIQ1Agb3BlcmF0aW9uIHR5cGVzCisgKgorICogVGhpcyB0YWJsZSBtYXBzIGZyb20gREhDUCBtZXNzYWdlIHR5cGVzIChpLmUuIHZhbHVlcyBvZiB0aGUgQGMKKyAqIERIQ1BfTUVTU0FHRV9UWVBFIG9wdGlvbikgdG8gdmFsdWVzIG9mIHRoZSAib3AiIGZpZWxkIHdpdGhpbiBhIERIQ1AKKyAqIHBhY2tldC4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGhjcF9vcFtdID0geworCVtESENQRElTQ09WRVJdCT0gQk9PVFBfUkVRVUVTVCwKKwlbREhDUE9GRkVSXQk9IEJPT1RQX1JFUExZLAorCVtESENQUkVRVUVTVF0JPSBCT09UUF9SRVFVRVNULAorCVtESENQREVDTElORV0JPSBCT09UUF9SRVFVRVNULAorCVtESENQQUNLXQk9IEJPT1RQX1JFUExZLAorCVtESENQTkFLXQk9IEJPT1RQX1JFUExZLAorCVtESENQUkVMRUFTRV0JPSBCT09UUF9SRVFVRVNULAorCVtESENQSU5GT1JNXQk9IEJPT1RQX1JFUVVFU1QsCit9OworCisvKiogUmF3IG9wdGlvbiBkYXRhIGZvciBvcHRpb25zIGNvbW1vbiB0byBhbGwgREhDUCByZXF1ZXN0cyAqLworc3RhdGljIHVpbnQ4X3QgZGhjcF9yZXF1ZXN0X29wdGlvbnNfZGF0YVtdID0geworCURIQ1BfTUVTU0FHRV9UWVBFLCBESENQX0JZVEUgKCAwICksCisJREhDUF9NQVhfTUVTU0FHRV9TSVpFLAorCURIQ1BfV09SRCAoIEVUSF9NQVhfTVRVIC0gMjAgLyogSVAgaGVhZGVyICovIC0gOCAvKiBVRFAgaGVhZGVyICovICksCisJREhDUF9DTElFTlRfQVJDSElURUNUVVJFLCBESENQX1dPUkQgKCAwICksCisJREhDUF9DTElFTlRfTkRJLCBESENQX09QVElPTiAoIDEgLyogVU5ESSAqLyAsIDIsIDEgLyogdjIuMSAqLyApLAorCURIQ1BfVkVORE9SX0NMQVNTX0lELAorCURIQ1BfU1RSSU5HICggICdQJywgJ1gnLCAnRScsICdDJywgJ2wnLCAnaScsICdlJywgJ24nLCAndCcsICc6JywKKwkJICAgICAgICdBJywgJ3InLCAnYycsICdoJywgJzonLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzonLAorCQkgICAgICAgJ1UnLCAnTicsICdEJywgJ0knLCAnOicsICcwJywgJzAnLCAnMicsICcwJywgJzAnLCAnMScgKSwKKwlESENQX1VTRVJfQ0xBU1NfSUQsCisJREhDUF9TVFJJTkcgKCAnZycsICdQJywgJ1gnLCAnRScgKSwKKwlESENQX1BBUkFNRVRFUl9SRVFVRVNUX0xJU1QsCisJREhDUF9PUFRJT04gKCBESENQX1NVQk5FVF9NQVNLLCBESENQX1JPVVRFUlMsIERIQ1BfRE5TX1NFUlZFUlMsCisJCSAgICAgIERIQ1BfTE9HX1NFUlZFUlMsIERIQ1BfSE9TVF9OQU1FLCBESENQX0RPTUFJTl9OQU1FLAorCQkgICAgICBESENQX1JPT1RfUEFUSCwgREhDUF9WRU5ET1JfRU5DQVAsIERIQ1BfVkVORE9SX0NMQVNTX0lELAorCQkgICAgICBESENQX1RGVFBfU0VSVkVSX05BTUUsIERIQ1BfQk9PVEZJTEVfTkFNRSwKKwkJICAgICAgREhDUF9FQl9FTkNBUCwgREhDUF9JU0NTSV9JTklUSUFUT1JfSVFOICksCisJREhDUF9FTkQKK307CisKKy8qKiBWZXJzaW9uIG51bWJlciBmZWF0dXJlICovCitGRUFUVVJFX1ZFUlNJT04gKCBWRVJTSU9OX01BSk9SLCBWRVJTSU9OX01JTk9SLCBWRVJTSU9OX1BBVENIICk7CisKKy8qKiBESENQIHNlcnZlciBhZGRyZXNzIHNldHRpbmcgKi8KK3N0cnVjdCBzZXR0aW5nIGRoY3Bfc2VydmVyX3NldHRpbmcgX19zZXR0aW5nID0geworCS5uYW1lID0gImRoY3Atc2VydmVyIiwKKwkuZGVzY3JpcHRpb24gPSAiREhDUCBzZXJ2ZXIgYWRkcmVzcyIsCisJLnRhZyA9IERIQ1BfU0VSVkVSX0lERU5USUZJRVIsCisJLnR5cGUgPSAmc2V0dGluZ190eXBlX2lwdjQsCit9OworCisvKiogREhDUCB1c2VyIGNsYXNzIHNldHRpbmcgKi8KK3N0cnVjdCBzZXR0aW5nIHVzZXJfY2xhc3Nfc2V0dGluZyBfX3NldHRpbmcgPSB7CisJLm5hbWUgPSAidXNlci1jbGFzcyIsCisJLmRlc2NyaXB0aW9uID0gIlVzZXIgY2xhc3MgaWRlbnRpZmllciIsCisJLnRhZyA9IERIQ1BfVVNFUl9DTEFTU19JRCwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfc3RyaW5nLAorfTsKKworLyoqIFVzZSBjYWNoZWQgbmV0d29yayBzZXR0aW5ncyAqLworc3RydWN0IHNldHRpbmcgdXNlX2NhY2hlZF9zZXR0aW5nIF9fc2V0dGluZyA9IHsKKwkubmFtZSA9ICJ1c2UtY2FjaGVkIiwKKwkuZGVzY3JpcHRpb24gPSAiVXNlIGNhY2hlZCBuZXR3b3JrIHNldHRpbmdzIiwKKwkudGFnID0gREhDUF9FQl9VU0VfQ0FDSEVELAorCS50eXBlID0gJnNldHRpbmdfdHlwZV91aW50OCwKK307CisKKy8qKgorICogTmFtZSBhIERIQ1AgcGFja2V0IHR5cGUKKyAqCisgKiBAdiBtc2d0eXBlCQlESENQIG1lc3NhZ2UgdHlwZQorICogQHJldCBzdHJpbmcJCURIQ1AgbWVzYXNnZSB0eXBlIG5hbWUKKyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICogZGhjcF9tc2d0eXBlX25hbWUgKCB1bnNpZ25lZCBpbnQgbXNndHlwZSApIHsKKwlzd2l0Y2ggKCBtc2d0eXBlICkgeworCWNhc2UgREhDUE5PTkU6CQlyZXR1cm4gIkJPT1RQIjsgLyogTm9uLURIQ1AgcGFja2V0ICovCisJY2FzZSBESENQRElTQ09WRVI6CXJldHVybiAiREhDUERJU0NPVkVSIjsKKwljYXNlIERIQ1BPRkZFUjoJCXJldHVybiAiREhDUE9GRkVSIjsKKwljYXNlIERIQ1BSRVFVRVNUOglyZXR1cm4gIkRIQ1BSRVFVRVNUIjsKKwljYXNlIERIQ1BERUNMSU5FOglyZXR1cm4gIkRIQ1BERUNMSU5FIjsKKwljYXNlIERIQ1BBQ0s6CQlyZXR1cm4gIkRIQ1BBQ0siOworCWNhc2UgREhDUE5BSzoJCXJldHVybiAiREhDUE5BSyI7CisJY2FzZSBESENQUkVMRUFTRToJcmV0dXJuICJESENQUkVMRUFTRSI7CisJY2FzZSBESENQSU5GT1JNOglyZXR1cm4gIkRIQ1BJTkZPUk0iOworCWRlZmF1bHQ6CQlyZXR1cm4gIkRIQ1A8aW52YWxpZD4iOworCX0KK30KKworLyoqCisgKiBDYWxjdWxhdGUgREhDUCB0cmFuc2FjdGlvbiBJRCBmb3IgYSBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEByZXQgeGlkCQlESENQIFhJRAorICoKKyAqIEV4dHJhY3QgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGhhcmR3YXJlIGFkZHJlc3MgZm9yIHVzZQorICogYXMgdGhlIHRyYW5zYWN0aW9uIElELgorICovCitzdGF0aWMgdWludDMyX3QgZGhjcF94aWQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXVpbnQzMl90IHhpZDsKKworCW1lbWNweSAoICZ4aWQsICggbmV0ZGV2LT5sbF9hZGRyICsgbmV0ZGV2LT5sbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4KKwkJCSAtIHNpemVvZiAoIHhpZCApICksIHNpemVvZiAoIHhpZCApICk7CisJcmV0dXJuIHhpZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBESENQIHNlc3Npb24KKyAqCisgKi8KKworc3RydWN0IGRoY3Bfc2Vzc2lvbjsKKworLyoqIERIQ1Agc2Vzc2lvbiBzdGF0ZSBvcGVyYXRpb25zICovCitzdHJ1Y3QgZGhjcF9zZXNzaW9uX3N0YXRlIHsKKwkvKiogU3RhdGUgbmFtZSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJLyoqCisJICogQ29uc3RydWN0IHRyYW5zbWl0dGVkIHBhY2tldAorCSAqCisJICogQHYgZGhjcAkJREhDUCBzZXNzaW9uCisJICogQHYgZGhjcHBrdAkJREhDUCBwYWNrZXQKKwkgKiBAdiBwZWVyCQlEZXN0aW5hdGlvbiBhZGRyZXNzCisJICovCisJaW50ICggKiB0eCApICggc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCwKKwkJICAgICAgIHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCwKKwkJICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqcGVlciApOworCS8qKiBIYW5kbGUgcmVjZWl2ZWQgcGFja2V0CisJICoKKwkgKiBAdiBkaGNwCQlESENQIHNlc3Npb24KKwkgKiBAdiBkaGNwcGt0CQlESENQIHBhY2tldAorCSAqIEB2IHBlZXIJCURIQ1Agc2VydmVyIGFkZHJlc3MKKwkgKiBAdiBtc2d0eXBlCQlESENQIG1lc3NhZ2UgdHlwZQorCSAqIEB2IHNlcnZlcl9pZAkJREhDUCBzZXJ2ZXIgSUQKKwkgKi8KKwl2b2lkICggKiByeCApICggc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCwKKwkJCXN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCwKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqcGVlciwKKwkJCXVpbnQ4X3QgbXNndHlwZSwgc3RydWN0IGluX2FkZHIgc2VydmVyX2lkICk7CisJLyoqIEhhbmRsZSB0aW1lciBleHBpcnkKKwkgKgorCSAqIEB2IGRoY3AJCURIQ1Agc2Vzc2lvbgorCSAqLworCXZvaWQgKCAqIGV4cGlyZWQgKSAoIHN0cnVjdCBkaGNwX3Nlc3Npb24gKmRoY3AgKTsKKwkvKiogVHJhbnNtaXR0ZWQgbWVzc2FnZSB0eXBlICovCisJdWludDhfdCB0eF9tc2d0eXBlOworCS8qKiBBcHBseSBtaW5pbXVtIHRpbWVvdXQgKi8KKwl1aW50OF90IGFwcGx5X21pbl90aW1lb3V0OworfTsKKworc3RhdGljIHN0cnVjdCBkaGNwX3Nlc3Npb25fc3RhdGUgZGhjcF9zdGF0ZV9kaXNjb3ZlcjsKK3N0YXRpYyBzdHJ1Y3QgZGhjcF9zZXNzaW9uX3N0YXRlIGRoY3Bfc3RhdGVfcmVxdWVzdDsKK3N0YXRpYyBzdHJ1Y3QgZGhjcF9zZXNzaW9uX3N0YXRlIGRoY3Bfc3RhdGVfcHJveHk7CitzdGF0aWMgc3RydWN0IGRoY3Bfc2Vzc2lvbl9zdGF0ZSBkaGNwX3N0YXRlX3B4ZWJzOworCisvKiogREhDUCBvZmZlciBpcyB2YWxpZCBmb3IgSVAgbGVhc2UgKi8KKyNkZWZpbmUgREhDUF9PRkZFUl9JUAkxCisKKy8qKiBESENQIG9mZmVyIGlzIHZhbGlkIGZvciBQWEUgb3B0aW9ucyAqLworI2RlZmluZSBESENQX09GRkVSX1BYRQkyCisKKy8qKiBBIERIQ1Agb2ZmZXIgKi8KK3N0cnVjdCBkaGNwX29mZmVyIHsKKwkvKiogSVAgYWRkcmVzcyBvZiBzZXJ2ZXIgZ3JhbnRpbmcgb2ZmZXIgKi8KKwlzdHJ1Y3QgaW5fYWRkciBzZXJ2ZXI7CisKKwkvKiogSVAgYWRkcmVzcyBiZWluZyBvZmZlcmVkLCBvciAwLjAuMC4wIGZvciBhIHB1cmUgcHJveHkgKi8KKwlzdHJ1Y3QgaW5fYWRkciBpcDsKKworCS8qKiBESENQIHBhY2tldCBjb250YWluaW5nIFBYRSBvcHRpb25zOyBOVUxMIGlmIG1pc3Npbmcgb3IgcHJveGllZCAqLworCXN0cnVjdCBkaGNwX3BhY2tldCAqcHhlOworCisJLyoqIFZhbGlkIHVzZXMgZm9yIHRoaXMgb2ZmZXIsIGEgY29tYmluYXRpb24gb2YgREhDUF9PRkZFUiBiaXRzICovCisJdWludDhfdCB2YWxpZDsKKworCS8qKiBQcmlvcml0eSBvZiB0aGlzIG9mZmVyICovCisJaW50OF90IHByaW9yaXR5OworCisJLyoqIFdoZXRoZXIgdG8gaWdub3JlIFBYRSBESENQIGV4dGVuc2lvbnMgKi8KKwl1aW50OF90IG5vX3B4ZWRoY3A7Cit9OworCisvKiogTWF4aW11bSBudW1iZXIgb2YgREhDUCBvZmZlcnMgdG8gcXVldWUgKi8KKyNkZWZpbmUgREhDUF9NQVhfT0ZGRVJTICAgNgorCisvKiogQSBESENQIHNlc3Npb24gKi8KK3N0cnVjdCBkaGNwX3Nlc3Npb24geworCS8qKiBSZWZlcmVuY2UgY291bnRlciAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCS8qKiBKb2IgY29udHJvbCBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3Qgam9iX2ludGVyZmFjZSBqb2I7CisJLyoqIERhdGEgdHJhbnNmZXIgaW50ZXJmYWNlICovCisJc3RydWN0IHhmZXJfaW50ZXJmYWNlIHhmZXI7CisKKwkvKiogTmV0d29yayBkZXZpY2UgYmVpbmcgY29uZmlndXJlZCAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJLyoqIExvY2FsIHNvY2tldCBhZGRyZXNzICovCisJc3RydWN0IHNvY2thZGRyX2luIGxvY2FsOworCS8qKiBTdGF0ZSBvZiB0aGUgc2Vzc2lvbiAqLworCXN0cnVjdCBkaGNwX3Nlc3Npb25fc3RhdGUgKnN0YXRlOworCisJLyoqIFBYRSBCb290IFNlcnZlciB0eXBlICovCisJdWludDE2X3QgcHhlX3R5cGU7CisJLyoqIExpc3Qgb2YgUFhFIEJvb3QgU2VydmVycyB0byBhdHRlbXB0ICovCisJc3RydWN0IGluX2FkZHIgKnB4ZV9hdHRlbXB0OworCS8qKiBMaXN0IG9mIFBYRSBCb290IFNlcnZlcnMgdG8gYWNjZXB0ICovCisJc3RydWN0IGluX2FkZHIgKnB4ZV9hY2NlcHQ7CisKKwkvKiogUmV0cmFuc21pc3Npb24gdGltZXIgKi8KKwlzdHJ1Y3QgcmV0cnlfdGltZXIgdGltZXI7CisJLyoqIFN0YXJ0IHRpbWUgb2YgdGhlIGN1cnJlbnQgc3RhdGUgKGluIHRpY2tzKSAqLworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisKKwkvKiogREhDUCBvZmZlciBqdXN0IHJlcXVlc3RlZCAqLworCXN0cnVjdCBkaGNwX29mZmVyICpjdXJyZW50X29mZmVyOworCS8qKiBMaXN0IG9mIERIQ1Agb2ZmZXJzIHJlY2VpdmVkICovCisJc3RydWN0IGRoY3Bfb2ZmZXIgb2ZmZXJzW0RIQ1BfTUFYX09GRkVSU107Cit9OworCisvKioKKyAqIEZyZWUgREhDUCBzZXNzaW9uCisgKgorICogQHYgcmVmY250CQlSZWZlcmVuY2UgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBkaGNwX2ZyZWUgKCBzdHJ1Y3QgcmVmY250ICpyZWZjbnQgKSB7CisJc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCA9CisJCWNvbnRhaW5lcl9vZiAoIHJlZmNudCwgc3RydWN0IGRoY3Bfc2Vzc2lvbiwgcmVmY250ICk7CisJaW50IGk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBESENQX01BWF9PRkZFUlMgOyBpKysgKSB7CisJCWlmICggZGhjcC0+b2ZmZXJzW2ldLnB4ZSApCisJCQlkaGNwcGt0X3B1dCAoIGRoY3AtPm9mZmVyc1tpXS5weGUgKTsKKwl9CisKKwluZXRkZXZfcHV0ICggZGhjcC0+bmV0ZGV2ICk7CisJZnJlZSAoIGRoY3AgKTsKK30KKworLyoqCisgKiBNYXJrIERIQ1Agc2Vzc2lvbiBhcyBjb21wbGV0ZQorICoKKyAqIEB2IGRoY3AJCURIQ1Agc2Vzc2lvbgorICogQHYgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgdm9pZCBkaGNwX2ZpbmlzaGVkICggc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCwgaW50IHJjICkgeworCisJLyogQmxvY2sgZnV0aGVyIGluY29taW5nIG1lc3NhZ2VzICovCisJam9iX251bGxpZnkgKCAmZGhjcC0+am9iICk7CisJeGZlcl9udWxsaWZ5ICggJmRoY3AtPnhmZXIgKTsKKworCS8qIFN0b3AgcmV0cnkgdGltZXIgKi8KKwlzdG9wX3RpbWVyICggJmRoY3AtPnRpbWVyICk7CisKKwkvKiBGcmVlIHJlc291cmNlcyBhbmQgY2xvc2UgaW50ZXJmYWNlcyAqLworCXhmZXJfY2xvc2UgKCAmZGhjcC0+eGZlciwgcmMgKTsKKwlqb2JfZG9uZSAoICZkaGNwLT5qb2IsIHJjICk7Cit9CisKKy8qKgorICogVHJhbnNpdGlvbiB0byBuZXcgREhDUCBzZXNzaW9uIHN0YXRlCisgKgorICogQHYgZGhjcAkJREhDUCBzZXNzaW9uCisgKiBAdiBzdGF0ZQkJTmV3IHNlc3Npb24gc3RhdGUKKyAqLworc3RhdGljIHZvaWQgZGhjcF9zZXRfc3RhdGUgKCBzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwLAorCQkJICAgICBzdHJ1Y3QgZGhjcF9zZXNzaW9uX3N0YXRlICpzdGF0ZSApIHsKKworCURCR0MgKCBkaGNwLCAiREhDUCAlcCBlbnRlcmluZyAlcyBzdGF0ZVxuIiwgZGhjcCwgc3RhdGUtPm5hbWUgKTsKKwlkaGNwLT5zdGF0ZSA9IHN0YXRlOworCWRoY3AtPnN0YXJ0ID0gY3VycnRpY2tzKCk7CisJc3RvcF90aW1lciAoICZkaGNwLT50aW1lciApOworCWRoY3AtPnRpbWVyLm1pbl90aW1lb3V0ID0KKwkJKCBzdGF0ZS0+YXBwbHlfbWluX3RpbWVvdXQgPyBESENQX01JTl9USU1FT1VUIDogMCApOworCWRoY3AtPnRpbWVyLm1heF90aW1lb3V0ID0gREhDUF9NQVhfVElNRU9VVDsKKwlzdGFydF90aW1lcl9ub2RlbGF5ICggJmRoY3AtPnRpbWVyICk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIG5leHQgREhDUCBvZmZlciB0byB0cnkKKyAqCisgKiBAdiBkaGNwCQlESENQIHNlc3Npb24KKyAqIEB2IHR5cGUJCURIQ1Agb2ZmZXIgdHlwZQorICogQHJldCBvZmZlcgkJTmV4dCBESENQIG9mZmVyIHRvIHRyeQorICoKKyAqIE9mZmVycyBhcmUgcmFua2VkIGJ5IHByaW9yaXR5LCB0aGVuIGJ5IGNvbXBsZXRlbmVzcyAoY29tYmluZWQKKyAqIElQK1BYRSBhcmUgdHJpZWQgYmVmb3JlIEBhIHR5cGUgYWxvbmUpLCB0aGVuIGJ5IG9yZGVyIG9mIHJlY2VpcHQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGhjcF9vZmZlciAqIGRoY3BfbmV4dF9vZmZlciAoIHN0cnVjdCBkaGNwX3Nlc3Npb24gKmRoY3AsCisJCQkJCSAgICAgdWludDhfdCB0eXBlICkgeworCisJc3RydWN0IGRoY3Bfb2ZmZXIgKm9mZmVyOworCXN0cnVjdCBkaGNwX29mZmVyICpiZXN0ID0gTlVMTDsKKworCWZvciAoIG9mZmVyID0gZGhjcC0+b2ZmZXJzIDsgb2ZmZXIgPCBkaGNwLT5vZmZlcnMgKyBESENQX01BWF9PRkZFUlMgOworCSAgICAgIG9mZmVyKysgKSB7CisJCWlmICggKCBvZmZlci0+dmFsaWQgJiB0eXBlICkgJiYKKwkJICAgICAoICggYmVzdCA9PSBOVUxMICkgfHwKKwkJICAgICAgICggb2ZmZXItPnByaW9yaXR5ID4gYmVzdC0+cHJpb3JpdHkgKSB8fAorCQkgICAgICAgKCAoIG9mZmVyLT5wcmlvcml0eSA9PSBiZXN0LT5wcmlvcml0eSApICYmCisJCQkgKCBvZmZlci0+dmFsaWQgJiB+YmVzdC0+dmFsaWQgKSApICkgKQorCQkJYmVzdCA9IG9mZmVyOworCX0KKworCXJldHVybiBiZXN0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERIQ1Agc3RhdGUgbWFjaGluZQorICoKKyAqLworCisvKioKKyAqIENvbnN0cnVjdCB0cmFuc21pdHRlZCBwYWNrZXQgZm9yIERIQ1AgZGlzY292ZXJ5CisgKgorICogQHYgZGhjcAkJREhDUCBzZXNzaW9uCisgKiBAdiBkaGNwcGt0CQlESENQIHBhY2tldAorICogQHYgcGVlcgkJRGVzdGluYXRpb24gYWRkcmVzcworICovCitzdGF0aWMgaW50IGRoY3BfZGlzY292ZXJ5X3R4ICggc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCwKKwkJCSAgICAgICBzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3Bwa3QgX191bnVzZWQsCisJCQkgICAgICAgc3RydWN0IHNvY2thZGRyX2luICpwZWVyICkgeworCisJREJHQyAoIGRoY3AsICJESENQICVwIERIQ1BESVNDT1ZFUlxuIiwgZGhjcCApOworCisJLyogU2V0IHNlcnZlciBhZGRyZXNzICovCisJcGVlci0+c2luX2FkZHIuc19hZGRyID0gSU5BRERSX0JST0FEQ0FTVDsKKwlwZWVyLT5zaW5fcG9ydCA9IGh0b25zICggQk9PVFBTX1BPUlQgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEhhbmRsZSByZWNlaXZlZCBESENQT0ZGRVIgZHVyaW5nIGFueSBzdGF0ZQorICoKKyAqIEB2IGRoY3AJCURIQ1Agc2Vzc2lvbgorICogQHYgZGhjcHBrdAkJREhDUCBwYWNrZXQKKyAqIEB2IHBlZXIJCURIQ1Agc2VydmVyIGFkZHJlc3MKKyAqIEB2IG1zZ3R5cGUJCURIQ1AgbWVzc2FnZSB0eXBlCisgKiBAdiBzZXJ2ZXJfaWQJCURIQ1Agc2VydmVyIElECisgKi8KK3N0YXRpYyB2b2lkIGRoY3Bfcnhfb2ZmZXIgKCBzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwLAorCQkJICAgIHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCwKKwkJCSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBlZXIsIHVpbnQ4X3QgbXNndHlwZSwKKwkJCSAgICBzdHJ1Y3QgaW5fYWRkciBzZXJ2ZXJfaWQgKSB7CisJY2hhciB2Y2lbOV07IC8qICJQWEVDbGllbnQiICovCisJaW50IHZjaV9sZW47CisJaW50IGhhc19weGVjbGllbnQ7CisJaW50IHB4ZW9wdHNfbGVuOworCWludCBoYXNfcHhlb3B0czsKKwlzdHJ1Y3QgZGhjcF9vZmZlciAqb2ZmZXI7CisJaW50IGk7CisKKwlEQkdDICggZGhjcCwgIkRIQ1AgJXAgJXMgZnJvbSAlczolZCIsIGRoY3AsCisJICAgICAgIGRoY3BfbXNndHlwZV9uYW1lICggbXNndHlwZSApLCBpbmV0X250b2EgKCBwZWVyLT5zaW5fYWRkciApLAorCSAgICAgICBudG9ocyAoIHBlZXItPnNpbl9wb3J0ICkgKTsKKwlpZiAoIHNlcnZlcl9pZC5zX2FkZHIgIT0gcGVlci0+c2luX2FkZHIuc19hZGRyICkKKwkJREJHQyAoIGRoY3AsICIgKCVzKSIsIGluZXRfbnRvYSAoIHNlcnZlcl9pZCApICk7CisKKwkvKiBJZGVudGlmeSBvZmZlcmVkIElQIGFkZHJlc3MgKi8KKwlpZiAoIGRoY3Bwa3QtPmRoY3BoZHItPnlpYWRkci5zX2FkZHIgKQorCQlEQkdDICggZGhjcCwgIiBmb3IgJXMiLCBpbmV0X250b2EgKCBkaGNwcGt0LT5kaGNwaGRyLT55aWFkZHIgKSk7CisKKwkvKiBFbnF1ZXVlIGFuIG9mZmVyIHRvIGJlIGZpbGxlZCBpbiAqLworCWZvciAoIGkgPSAwIDsgaSA8IERIQ1BfTUFYX09GRkVSUyA7IGkrKyApIHsKKwkJaWYgKCBkaGNwLT5vZmZlcnNbaV0uc2VydmVyLnNfYWRkciA9PSBzZXJ2ZXJfaWQuc19hZGRyICkgeworCQkJREJHQyAoIGRoY3AsICIgZHVwXG4iICk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoICEgZGhjcC0+b2ZmZXJzW2ldLnZhbGlkICkKKwkJCWJyZWFrOworCX0KKwlpZiAoIGkgPT0gREhDUF9NQVhfT0ZGRVJTICkgeworCQlEQkdDICggZGhjcCwgIiBkcm9wcGVkXG4iICk7CisJCXJldHVybjsKKwl9CisKKwlvZmZlciA9ICZkaGNwLT5vZmZlcnNbaV07CisJb2ZmZXItPnNlcnZlciA9IHNlcnZlcl9pZDsKKwlvZmZlci0+aXAgPSBkaGNwcGt0LT5kaGNwaGRyLT55aWFkZHI7CisKKwkvKiBJZGVudGlmeSAiUFhFQ2xpZW50IiB2ZW5kb3IgY2xhc3MgKi8KKwl2Y2lfbGVuID0gZGhjcHBrdF9mZXRjaCAoIGRoY3Bwa3QsIERIQ1BfVkVORE9SX0NMQVNTX0lELAorCQkJCSAgdmNpLCBzaXplb2YgKCB2Y2kgKSApOworCWhhc19weGVjbGllbnQgPSAoICggdmNpX2xlbiA+PSAoIGludCApIHNpemVvZiAoIHZjaSApICkgJiYKKwkJCSAgKCBzdHJuY21wICggIlBYRUNsaWVudCIsIHZjaSwgc2l6ZW9mICh2Y2kpICkgPT0gMCApKTsKKworCS8qIElkZW50aWZ5IHByZXNlbmNlIG9mIFBYRS1zcGVjaWZpYyBvcHRpb25zICovCisJcHhlb3B0c19sZW4gPSBkaGNwcGt0X2ZldGNoICggZGhjcHBrdCwgREhDUF9QWEVfQk9PVF9NRU5VLCBOVUxMLCAwICk7CisJaGFzX3B4ZW9wdHMgPSAoIHB4ZW9wdHNfbGVuID49IDAgKTsKKwlpZiAoIGhhc19weGVjbGllbnQgKQorCQlEQkdDICggZGhjcCwgIiVzIiwgKCBoYXNfcHhlb3B0cyA/ICIgcHhlIiA6ICIgcHJveHkiICkgKTsKKworCWlmICggaGFzX3B4ZWNsaWVudCAmJiBoYXNfcHhlb3B0cyApIHsKKwkJLyogU2F2ZSByZWZlcmVuY2UgdG8gcGFja2V0IGZvciBmdXR1cmUgdXNlICovCisJCWlmICggb2ZmZXItPnB4ZSApCisJCQlkaGNwcGt0X3B1dCAoIG9mZmVyLT5weGUgKTsKKwkJb2ZmZXItPnB4ZSA9IGRoY3Bwa3RfZ2V0ICggZGhjcHBrdCApOworCX0KKworCS8qIElkZW50aWZ5IHByaW9yaXR5ICovCisJZGhjcHBrdF9mZXRjaCAoIGRoY3Bwa3QsIERIQ1BfRUJfUFJJT1JJVFksICZvZmZlci0+cHJpb3JpdHksCisJCQlzaXplb2YgKCBvZmZlci0+cHJpb3JpdHkgKSApOworCWlmICggb2ZmZXItPnByaW9yaXR5ICkKKwkJREJHQyAoIGRoY3AsICIgcHJpICVkIiwgb2ZmZXItPnByaW9yaXR5ICk7CisKKwkvKiBJZGVudGlmeSBpZ25vcmUtUFhFIGZsYWcgKi8KKwlkaGNwcGt0X2ZldGNoICggZGhjcHBrdCwgREhDUF9FQl9OT19QWEVESENQLCAmb2ZmZXItPm5vX3B4ZWRoY3AsCisJCQlzaXplb2YgKCBvZmZlci0+bm9fcHhlZGhjcCApICk7CisJaWYgKCBvZmZlci0+bm9fcHhlZGhjcCApCisJCURCR0MgKCBkaGNwLCAiIG5vcHhlIiApOworCURCR0MgKCBkaGNwLCAiXG4iICk7CisKKwkvKiBEZXRlcm1pbmUgcm9sZXMgdGhpcyBvZmZlciBjYW4gZmlsbCAqLworCWlmICggb2ZmZXItPmlwLnNfYWRkciAmJgorCSAgICAgKCBwZWVyLT5zaW5fcG9ydCA9PSBodG9ucyAoIEJPT1RQU19QT1JUICkgKSAmJgorCSAgICAgKCAoIG1zZ3R5cGUgPT0gREhDUE9GRkVSICkgfHwgKCAhIG1zZ3R5cGUgLyogQk9PVFAgKi8gKSApICkKKwkJb2ZmZXItPnZhbGlkIHw9IERIQ1BfT0ZGRVJfSVA7CisKKwlpZiAoIGhhc19weGVjbGllbnQgJiYgKCBtc2d0eXBlID09IERIQ1BPRkZFUiApICkKKwkJb2ZmZXItPnZhbGlkIHw9IERIQ1BfT0ZGRVJfUFhFOworfQorCisvKioKKyAqIEhhbmRsZSByZWNlaXZlZCBwYWNrZXQgZHVyaW5nIERIQ1AgZGlzY292ZXJ5CisgKgorICogQHYgZGhjcAkJREhDUCBzZXNzaW9uCisgKiBAdiBkaGNwcGt0CQlESENQIHBhY2tldAorICogQHYgcGVlcgkJREhDUCBzZXJ2ZXIgYWRkcmVzcworICogQHYgbXNndHlwZQkJREhDUCBtZXNzYWdlIHR5cGUKKyAqIEB2IHNlcnZlcl9pZAkJREhDUCBzZXJ2ZXIgSUQKKyAqLworc3RhdGljIHZvaWQgZGhjcF9kaXNjb3ZlcnlfcnggKCBzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwLAorCQkJCXN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCwKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBlZXIsIHVpbnQ4X3QgbXNndHlwZSwKKwkJCQlzdHJ1Y3QgaW5fYWRkciBzZXJ2ZXJfaWQgKSB7CisJdW5zaWduZWQgbG9uZyBlbGFwc2VkOworCXN0cnVjdCBkaGNwX29mZmVyICppcF9vZmZlcjsKKworCWRoY3Bfcnhfb2ZmZXIgKCBkaGNwLCBkaGNwcGt0LCBwZWVyLCBtc2d0eXBlLCBzZXJ2ZXJfaWQgKTsKKworCS8qIFdlIGNhbiBleGl0IHRoZSBkaXNjb3Zlcnkgc3RhdGUgd2hlbiB3ZSBoYXZlIGEgdmFsaWQKKwkgKiBESENQT0ZGRVIsIGFuZCBlaXRoZXI6CisJICoKKwkgKiAgbyAgVGhlIERIQ1BPRkZFUiBpbnN0cnVjdHMgdXMgdG8gaWdub3JlIFByb3h5REhDUE9GRkVScywgb3IKKwkgKiAgbyAgV2UgaGF2ZSBhIHZhbGlkIFByb3h5REhDUE9GRkVSLCBvcgorCSAqICBvICBXZSBoYXZlIGFsbG93ZWQgc3VmZmljaWVudCB0aW1lIGZvciBQcm94eURIQ1BPRkZFUnMuCisJICovCisKKwkvKiBJZiB3ZSBkb24ndCB5ZXQgaGF2ZSBhIERIQ1BPRkZFUiwgZG8gbm90aGluZyAqLworCWlwX29mZmVyID0gZGhjcF9uZXh0X29mZmVyICggZGhjcCwgREhDUF9PRkZFUl9JUCApOworCWlmICggISBpcF9vZmZlciApCisJCXJldHVybjsKKworCS8qIElmIHdlIGNhbid0IHlldCB0cmFuc2l0aW9uIHRvIERIQ1BSRVFVRVNULCBkbyBub3RoaW5nICovCisJZWxhcHNlZCA9ICggY3VycnRpY2tzKCkgLSBkaGNwLT5zdGFydCApOworCWlmICggISAoIGlwX29mZmVyLT5ub19weGVkaGNwIHx8CisJCSBkaGNwX25leHRfb2ZmZXIgKCBkaGNwLCBESENQX09GRkVSX1BYRSApIHx8CisJCSAoIGVsYXBzZWQgPiBQUk9YWURIQ1BfTUFYX1RJTUVPVVQgKSApICkKKwkJcmV0dXJuOworCisJLyogVHJhbnNpdGlvbiB0byBESENQUkVRVUVTVCAqLworCWRoY3Bfc2V0X3N0YXRlICggZGhjcCwgJmRoY3Bfc3RhdGVfcmVxdWVzdCApOworfQorCisvKioKKyAqIEhhbmRsZSB0aW1lciBleHBpcnkgZHVyaW5nIERIQ1AgZGlzY292ZXJ5CisgKgorICogQHYgZGhjcAkJREhDUCBzZXNzaW9uCisgKi8KK3N0YXRpYyB2b2lkIGRoY3BfZGlzY292ZXJ5X2V4cGlyZWQgKCBzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwICkgeworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZCA9ICggY3VycnRpY2tzKCkgLSBkaGNwLT5zdGFydCApOworCisJLyogR2l2ZSB1cCB3YWl0aW5nIGZvciBQcm94eURIQ1AgYmVmb3JlIHdlIHJlYWNoIHRoZSBmYWlsdXJlIHBvaW50ICovCisJaWYgKCBkaGNwX25leHRfb2ZmZXIgKCBkaGNwLCBESENQX09GRkVSX0lQICkgJiYKKwkgICAgICggZWxhcHNlZCA+IFBST1hZREhDUF9NQVhfVElNRU9VVCApICkgeworCQlkaGNwX3NldF9zdGF0ZSAoIGRoY3AsICZkaGNwX3N0YXRlX3JlcXVlc3QgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE90aGVyd2lzZSwgcmV0cmFuc21pdCBjdXJyZW50IHBhY2tldCAqLworCWRoY3BfdHggKCBkaGNwICk7Cit9CisKKy8qKiBESENQIGRpc2NvdmVyeSBzdGF0ZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IGRoY3Bfc2Vzc2lvbl9zdGF0ZSBkaGNwX3N0YXRlX2Rpc2NvdmVyID0geworCS5uYW1lCQkJPSAiZGlzY292ZXJ5IiwKKwkudHgJCQk9IGRoY3BfZGlzY292ZXJ5X3R4LAorCS5yeAkJCT0gZGhjcF9kaXNjb3ZlcnlfcngsCisJLmV4cGlyZWQJCT0gZGhjcF9kaXNjb3ZlcnlfZXhwaXJlZCwKKwkudHhfbXNndHlwZQkJPSBESENQRElTQ09WRVIsCisJLmFwcGx5X21pbl90aW1lb3V0CT0gMSwKK307CisKKy8qKgorICogQ29uc3RydWN0IHRyYW5zbWl0dGVkIHBhY2tldCBmb3IgREhDUCByZXF1ZXN0CisgKgorICogQHYgZGhjcAkJREhDUCBzZXNzaW9uCisgKiBAdiBkaGNwcGt0CQlESENQIHBhY2tldAorICogQHYgcGVlcgkJRGVzdGluYXRpb24gYWRkcmVzcworICovCitzdGF0aWMgaW50IGRoY3BfcmVxdWVzdF90eCAoIHN0cnVjdCBkaGNwX3Nlc3Npb24gKmRoY3AsCisJCQkgICAgIHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCwKKwkJCSAgICAgc3RydWN0IHNvY2thZGRyX2luICpwZWVyICkgeworCWludCByYzsKKwlzdHJ1Y3QgZGhjcF9vZmZlciAqb2ZmZXI7CisKKwlvZmZlciA9IGRoY3AtPmN1cnJlbnRfb2ZmZXIgPSBkaGNwX25leHRfb2ZmZXIgKCBkaGNwLCBESENQX09GRkVSX0lQICk7CisKKwlEQkdDICggZGhjcCwgIkRIQ1AgJXAgREhDUFJFUVVFU1QgdG8gJXM6JWQiLAorCSAgICAgICBkaGNwLCBpbmV0X250b2EgKCBvZmZlci0+c2VydmVyICksIEJPT1RQU19QT1JUICk7CisJREJHQyAoIGRoY3AsICIgZm9yICVzXG4iLCBpbmV0X250b2EgKCBvZmZlci0+aXAgKSApOworCisJLyogU2V0IHNlcnZlciBJRCAqLworCWlmICggKCByYyA9IGRoY3Bwa3Rfc3RvcmUgKCBkaGNwcGt0LCBESENQX1NFUlZFUl9JREVOVElGSUVSLAorCQkJCSAgICAmb2ZmZXItPnNlcnZlciwKKwkJCQkgICAgc2l6ZW9mICggb2ZmZXItPnNlcnZlciApICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogU2V0IHJlcXVlc3RlZCBJUCBhZGRyZXNzICovCisJaWYgKCAoIHJjID0gZGhjcHBrdF9zdG9yZSAoIGRoY3Bwa3QsIERIQ1BfUkVRVUVTVEVEX0FERFJFU1MsCisJCQkJICAgICZvZmZlci0+aXAsIHNpemVvZiAoIG9mZmVyLT5pcCApICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogU2V0IHNlcnZlciBhZGRyZXNzICovCisJcGVlci0+c2luX2FkZHIuc19hZGRyID0gSU5BRERSX0JST0FEQ0FTVDsKKwlwZWVyLT5zaW5fcG9ydCA9IGh0b25zICggQk9PVFBTX1BPUlQgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEhhbmRsZSByZWNlaXZlZCBwYWNrZXQgZHVyaW5nIERIQ1AgcmVxdWVzdAorICoKKyAqIEB2IGRoY3AJCURIQ1Agc2Vzc2lvbgorICogQHYgZGhjcHBrdAkJREhDUCBwYWNrZXQKKyAqIEB2IHBlZXIJCURIQ1Agc2VydmVyIGFkZHJlc3MKKyAqIEB2IG1zZ3R5cGUJCURIQ1AgbWVzc2FnZSB0eXBlCisgKiBAdiBzZXJ2ZXJfaWQJCURIQ1Agc2VydmVyIElECisgKi8KK3N0YXRpYyB2b2lkIGRoY3BfcmVxdWVzdF9yeCAoIHN0cnVjdCBkaGNwX3Nlc3Npb24gKmRoY3AsCisJCQkgICAgICBzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3Bwa3QsCisJCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBlZXIsIHVpbnQ4X3QgbXNndHlwZSwKKwkJCSAgICAgIHN0cnVjdCBpbl9hZGRyIHNlcnZlcl9pZCApIHsKKwlzdHJ1Y3QgaW5fYWRkciBpcDsKKwlzdHJ1Y3Qgc2V0dGluZ3MgKnBhcmVudDsKKwlpbnQgcmM7CisJc3RydWN0IGRoY3Bfb2ZmZXIgKnB4ZV9vZmZlcjsKKworCWlmICggbXNndHlwZSA9PSBESENQT0ZGRVIgKSB7CisJCWRoY3Bfcnhfb2ZmZXIgKCBkaGNwLCBkaGNwcGt0LCBwZWVyLCBtc2d0eXBlLCBzZXJ2ZXJfaWQgKTsKKwkJaWYgKCBkaGNwX25leHRfb2ZmZXIgKCBkaGNwLCBESENQX09GRkVSX0lQICkgIT0KKwkJICAgICBkaGNwLT5jdXJyZW50X29mZmVyICkgeworCQkJLyogUmVzdGFydCBkdWUgdG8gaGlnaGVyLXByaW9yaXR5IG9mZmVyIHJlY2VpdmVkICovCisJCQlEQkdDICggZGhjcCwgIkRIQ1AgJXAgcmUtcmVxdWVzdGluZ1xuIiwgZGhjcCApOworCQkJZGhjcF9zZXRfc3RhdGUgKCBkaGNwLCAmZGhjcF9zdGF0ZV9yZXF1ZXN0ICk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCURCR0MgKCBkaGNwLCAiREhDUCAlcCAlcyBmcm9tICVzOiVkIiwgZGhjcCwKKwkgICAgICAgZGhjcF9tc2d0eXBlX25hbWUgKCBtc2d0eXBlICksIGluZXRfbnRvYSAoIHBlZXItPnNpbl9hZGRyICksCisJICAgICAgIG50b2hzICggcGVlci0+c2luX3BvcnQgKSApOworCWlmICggc2VydmVyX2lkLnNfYWRkciAhPSBwZWVyLT5zaW5fYWRkci5zX2FkZHIgKQorCQlEQkdDICggZGhjcCwgIiAoJXMpIiwgaW5ldF9udG9hICggc2VydmVyX2lkICkgKTsKKworCS8qIElkZW50aWZ5IGxlYXNlZCBJUCBhZGRyZXNzICovCisJaXAgPSBkaGNwcGt0LT5kaGNwaGRyLT55aWFkZHI7CisJaWYgKCBpcC5zX2FkZHIgKQorCQlEQkdDICggZGhjcCwgIiBmb3IgJXMiLCBpbmV0X250b2EgKCBpcCApICk7CisJREJHQyAoIGRoY3AsICJcbiIgKTsKKworCS8qIEZpbHRlciBvdXQgdW5hY2NlcHRhYmxlIHJlc3BvbnNlcyAqLworCWlmICggcGVlci0+c2luX3BvcnQgIT0gaHRvbnMgKCBCT09UUFNfUE9SVCApICkKKwkJcmV0dXJuOworCWlmICggbXNndHlwZSAvKiBCT09UUCAqLyAmJiAoIG1zZ3R5cGUgIT0gREhDUEFDSyApICkKKwkJcmV0dXJuOworCWlmICggc2VydmVyX2lkLnNfYWRkciAhPSBkaGNwLT5jdXJyZW50X29mZmVyLT5zZXJ2ZXIuc19hZGRyICkKKwkJcmV0dXJuOworCisJLyogUmVjb3JkIGFzc2lnbmVkIGFkZHJlc3MgKi8KKwlkaGNwLT5sb2NhbC5zaW5fYWRkciA9IGlwOworCisJLyogUmVnaXN0ZXIgc2V0dGluZ3MgKi8KKwlwYXJlbnQgPSBuZXRkZXZfc2V0dGluZ3MgKCBkaGNwLT5uZXRkZXYgKTsKKwlpZiAoICggcmMgPSByZWdpc3Rlcl9zZXR0aW5ncyAoICZkaGNwcGt0LT5zZXR0aW5ncywgcGFyZW50ICkgKSAhPSAwICl7CisJCURCR0MgKCBkaGNwLCAiREhDUCAlcCBjb3VsZCBub3QgcmVnaXN0ZXIgc2V0dGluZ3M6ICVzXG4iLAorCQkgICAgICAgZGhjcCwgc3RyZXJyb3IgKCByYyApICk7CisJCWRoY3BfZmluaXNoZWQgKCBkaGNwLCByYyApOworCQlyZXR1cm47CisJfQorCisJLyogTG9jYXRlIGJlc3Qgc291cmNlIG9mIFBYRSBzZXR0aW5ncyAqLworCXB4ZV9vZmZlciA9IGRoY3BfbmV4dF9vZmZlciAoIGRoY3AsIERIQ1BfT0ZGRVJfUFhFICk7CisKKwlpZiAoICggISBweGVfb2ZmZXIgKSB8fCAvKiBObyBQWEUgYXZhaWxhYmxlICovCisJICAgICAvKiBJUCBvZmZlciBpbnN0cnVjdHMgdXMgdG8gaWdub3JlIFBYRSAqLworCSAgICAgZGhjcC0+Y3VycmVudF9vZmZlci0+bm9fcHhlZGhjcCB8fAorCSAgICAgLyogUFhFIHNldHRpbmdzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIElQIG9mZmVyICovCisJICAgICAoICggZGhjcC0+Y3VycmVudF9vZmZlciA9PSBweGVfb2ZmZXIgKSAmJiAoIHB4ZV9vZmZlci0+cHhlICkgKSApIHsKKworCQkvKiBUZXJtaW5hdGUgREhDUCAqLworCQlkaGNwX2ZpbmlzaGVkICggZGhjcCwgMCApOworCisJfSBlbHNlIGlmICggcHhlX29mZmVyLT5weGUgKSB7CisJCS8qIFJlZ2lzdGVyIFBYRSBzZXR0aW5ncyBhbmQgdGVybWluYXRlIERIQ1AgKi8KKwkJcHhlX29mZmVyLT5weGUtPnNldHRpbmdzLm5hbWUgPSBQUk9YWURIQ1BfU0VUVElOR1NfTkFNRTsKKwkJaWYgKCAoIHJjID0gcmVnaXN0ZXJfc2V0dGluZ3MgKCAmcHhlX29mZmVyLT5weGUtPnNldHRpbmdzLAorCQkJCQkJTlVMTCApICkgIT0gMCApIHsKKwkJCURCR0MgKCBkaGNwLCAiREhDUCAlcCBjb3VsZCBub3QgcmVnaXN0ZXIgc2V0dGluZ3M6ICIKKwkJCSAgICAgICAiJXNcbiIsIGRoY3AsIHN0cmVycm9yICggcmMgKSApOworCQl9CisJCWRoY3BfZmluaXNoZWQgKCBkaGNwLCByYyApOworCX0gZWxzZSB7CisJCS8qIFN0YXJ0IFByb3h5REhDUCAqLworCQlkaGNwX3NldF9zdGF0ZSAoIGRoY3AsICZkaGNwX3N0YXRlX3Byb3h5ICk7CisJfQorfQorCisvKioKKyAqIEhhbmRsZSB0aW1lciBleHBpcnkgZHVyaW5nIERIQ1AgZGlzY292ZXJ5CisgKgorICogQHYgZGhjcAkJREhDUCBzZXNzaW9uCisgKi8KK3N0YXRpYyB2b2lkIGRoY3BfcmVxdWVzdF9leHBpcmVkICggc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCApIHsKKworCS8qIFJldHJhbnNtaXQgY3VycmVudCBwYWNrZXQgKi8KKwlkaGNwX3R4ICggZGhjcCApOworfQorCisvKiogREhDUCByZXF1ZXN0IHN0YXRlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGhjcF9zZXNzaW9uX3N0YXRlIGRoY3Bfc3RhdGVfcmVxdWVzdCA9IHsKKwkubmFtZQkJCT0gInJlcXVlc3QiLAorCS50eAkJCT0gZGhjcF9yZXF1ZXN0X3R4LAorCS5yeAkJCT0gZGhjcF9yZXF1ZXN0X3J4LAorCS5leHBpcmVkCQk9IGRoY3BfcmVxdWVzdF9leHBpcmVkLAorCS50eF9tc2d0eXBlCQk9IERIQ1BSRVFVRVNULAorCS5hcHBseV9taW5fdGltZW91dAk9IDAsCit9OworCisvKioKKyAqIENvbnN0cnVjdCB0cmFuc21pdHRlZCBwYWNrZXQgZm9yIFByb3h5REhDUCByZXF1ZXN0CisgKgorICogQHYgZGhjcAkJREhDUCBzZXNzaW9uCisgKiBAdiBkaGNwcGt0CQlESENQIHBhY2tldAorICogQHYgcGVlcgkJRGVzdGluYXRpb24gYWRkcmVzcworICovCitzdGF0aWMgaW50IGRoY3BfcHJveHlfdHggKCBzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwLAorCQkJICAgc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwcGt0LAorCQkJICAgc3RydWN0IHNvY2thZGRyX2luICpwZWVyICkgeworCWludCByYzsKKwlzdHJ1Y3QgZGhjcF9vZmZlciAqb2ZmZXI7CisKKwlvZmZlciA9IGRoY3AtPmN1cnJlbnRfb2ZmZXIgPSBkaGNwX25leHRfb2ZmZXIgKCBkaGNwLCBESENQX09GRkVSX1BYRSApOworCisJREJHQyAoIGRoY3AsICJESENQICVwIFByb3h5REhDUCBSRVFVRVNUIHRvICVzOiVkXG4iLCBkaGNwLAorCSAgICAgICBpbmV0X250b2EgKCBvZmZlci0+c2VydmVyICksIFBYRV9QT1JUICk7CisKKwkvKiBTZXQgc2VydmVyIElEICovCisJaWYgKCAoIHJjID0gZGhjcHBrdF9zdG9yZSAoIGRoY3Bwa3QsIERIQ1BfU0VSVkVSX0lERU5USUZJRVIsCisJCQkJICAgICZvZmZlci0+c2VydmVyLAorCQkJCSAgICBzaXplb2YgKCBvZmZlci0+c2VydmVyICkgKSApICAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogU2V0IHNlcnZlciBhZGRyZXNzICovCisJcGVlci0+c2luX2FkZHIgPSBvZmZlci0+c2VydmVyOworCXBlZXItPnNpbl9wb3J0ID0gaHRvbnMgKCBQWEVfUE9SVCApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFuZGxlIHJlY2VpdmVkIHBhY2tldCBkdXJpbmcgUHJveHlESENQIHJlcXVlc3QKKyAqCisgKiBAdiBkaGNwCQlESENQIHNlc3Npb24KKyAqIEB2IGRoY3Bwa3QJCURIQ1AgcGFja2V0CisgKiBAdiBwZWVyCQlESENQIHNlcnZlciBhZGRyZXNzCisgKiBAdiBtc2d0eXBlCQlESENQIG1lc3NhZ2UgdHlwZQorICogQHYgc2VydmVyX2lkCQlESENQIHNlcnZlciBJRAorICovCitzdGF0aWMgdm9pZCBkaGNwX3Byb3h5X3J4ICggc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCwKKwkJCSAgICBzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3Bwa3QsCisJCQkgICAgc3RydWN0IHNvY2thZGRyX2luICpwZWVyLCB1aW50OF90IG1zZ3R5cGUsCisJCQkgICAgc3RydWN0IGluX2FkZHIgc2VydmVyX2lkICkgeworCWludCByYzsKKworCS8qIEVucXVldWUgbGFzdC1taW51dGUgREhDUE9GRkVScyBmb3IgdXNlIGluIGNhc2Ugb2YgZmFpbHVyZSAqLworCWlmICggcGVlci0+c2luX3BvcnQgPT0gaHRvbnMgKCBCT09UUFNfUE9SVCApICYmCisJICAgICBtc2d0eXBlID09IERIQ1BPRkZFUiApIHsKKwkJZGhjcF9yeF9vZmZlciAoIGRoY3AsIGRoY3Bwa3QsIHBlZXIsIG1zZ3R5cGUsIHNlcnZlcl9pZCApOworCQlyZXR1cm47CisJfQorCisJREJHQyAoIGRoY3AsICJESENQICVwICVzIGZyb20gJXM6JWQiLCBkaGNwLAorCSAgICAgICBkaGNwX21zZ3R5cGVfbmFtZSAoIG1zZ3R5cGUgKSwgaW5ldF9udG9hICggcGVlci0+c2luX2FkZHIgKSwKKwkgICAgICAgbnRvaHMgKCBwZWVyLT5zaW5fcG9ydCApICk7CisJaWYgKCBzZXJ2ZXJfaWQuc19hZGRyICE9IHBlZXItPnNpbl9hZGRyLnNfYWRkciApCisJCURCR0MgKCBkaGNwLCAiICglcykiLCBpbmV0X250b2EgKCBzZXJ2ZXJfaWQgKSApOworCURCR0MgKCBkaGNwLCAiXG4iICk7CisKKwkvKiBGaWx0ZXIgb3V0IHVuYWNjZXB0YWJsZSByZXNwb25zZXMgKi8KKwlpZiAoIHBlZXItPnNpbl9wb3J0ICE9IGh0b25zICggUFhFX1BPUlQgKSApCisJCXJldHVybjsKKwlpZiAoIG1zZ3R5cGUgIT0gREhDUEFDSyAmJiBtc2d0eXBlICE9IERIQ1BPRkZFUiApCisJCXJldHVybjsKKwlpZiAoIHNlcnZlcl9pZC5zX2FkZHIgLyogTGludXggUFhFIHNlcnZlciBvbWl0cyBzZXJ2ZXIgSUQgKi8gJiYKKwkgICAgICggc2VydmVyX2lkLnNfYWRkciAhPSBkaGNwLT5jdXJyZW50X29mZmVyLT5zZXJ2ZXIuc19hZGRyICkgKQorCQlyZXR1cm47CisKKwkvKiBSZWdpc3RlciBzZXR0aW5ncyAqLworCWRoY3Bwa3QtPnNldHRpbmdzLm5hbWUgPSBQUk9YWURIQ1BfU0VUVElOR1NfTkFNRTsKKwlpZiAoICggcmMgPSByZWdpc3Rlcl9zZXR0aW5ncyAoICZkaGNwcGt0LT5zZXR0aW5ncywgTlVMTCApICkgIT0gMCApIHsKKwkJREJHQyAoIGRoY3AsICJESENQICVwIGNvdWxkIG5vdCByZWdpc3RlciBzZXR0aW5nczogJXNcbiIsCisJCSAgICAgICBkaGNwLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZGhjcF9maW5pc2hlZCAoIGRoY3AsIHJjICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUZXJtaW5hdGUgREhDUCAqLworCWRoY3BfZmluaXNoZWQgKCBkaGNwLCAwICk7Cit9CisKKy8qKgorICogSGFuZGxlIHRpbWVyIGV4cGlyeSBkdXJpbmcgUHJveHlESENQIHJlcXVlc3QKKyAqCisgKiBAdiBkaGNwCQlESENQIHNlc3Npb24KKyAqLworc3RhdGljIHZvaWQgZGhjcF9wcm94eV9leHBpcmVkICggc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCApIHsKKwl1bnNpZ25lZCBsb25nIGVsYXBzZWQgPSAoIGN1cnJ0aWNrcygpIC0gZGhjcC0+c3RhcnQgKTsKKworCS8qIEdpdmUgdXAgd2FpdGluZyBmb3IgUHJveHlESENQIGJlZm9yZSB3ZSByZWFjaCB0aGUgZmFpbHVyZSBwb2ludCAqLworCWlmICggZWxhcHNlZCA+IFBST1hZREhDUF9NQVhfVElNRU9VVCApIHsKKworCQkvKiBNYXJrIGZhaWxlZCBvZmZlciBhcyB1bnN1aXRhYmxlIGZvciBQcm94eURIQ1AgKi8KKwkJZGhjcC0+Y3VycmVudF9vZmZlci0+dmFsaWQgJj0gfkRIQ1BfT0ZGRVJfUFhFOworCisJCS8qIFByZWZlciBub3QgdG8gdXNlIG9ubHkgaGFsZiBvZiBhIFBYRStJUCBvZmZlciBpZiB3ZQorCQkgKiBoYXZlIG90aGVyIG9mZmVycyBhdmFpbGFibGUKKwkJICovCisJCWRoY3AtPmN1cnJlbnRfb2ZmZXItPnByaW9yaXR5ID0gLTE7CisKKwkJLyogSWYgd2UgaGF2ZSBhbnkgb3RoZXIgUFhFIG9mZmVycyB3ZSBjYW4gdHJ5LCBnbyBiYWNrCisJCSAqIHRvIERIQ1BSRVFVRVNUIChzaW5jZSB0aGV5IG1pZ2h0IG5vdCBiZSBwcm94aWVkCisJCSAqIG9mZmVycywgb3IgbWlnaHQgYmUgY291cGxlZCB0byBhIG5ldyBJUCBhZGRyZXNzKS4KKwkJICogV2Ugc2hvdWxkIHByb2JhYmx5IERIQ1BSRUxFQVNFIG91ciBvbGQgSVAsIGJ1dCB0aGUKKwkJICogc3RhbmRhcmQgZG9lcyBub3QgcmVxdWlyZSBpdC4KKwkJICovCisJCWlmICggZGhjcF9uZXh0X29mZmVyICggZGhjcCwgREhDUF9PRkZFUl9QWEUgKSApIHsKKwkJCWRoY3AtPmxvY2FsLnNpbl9hZGRyLnNfYWRkciA9IDA7CisJCQlkaGNwX3NldF9zdGF0ZSAoIGRoY3AsICZkaGNwX3N0YXRlX3JlcXVlc3QgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIE5vIHBvc3NpYmlsaXRpZXMgbGVmdDsgZmluaXNoIHdpdGhvdXQgUFhFIG9wdGlvbnMgKi8KKwkJZGhjcF9maW5pc2hlZCAoIGRoY3AsIDAgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJldHJhbnNtaXQgY3VycmVudCBwYWNrZXQgKi8KKwlkaGNwX3R4ICggZGhjcCApOworfQorCisvKiogUHJveHlESENQIHJlcXVlc3Qgc3RhdGUgb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBkaGNwX3Nlc3Npb25fc3RhdGUgZGhjcF9zdGF0ZV9wcm94eSA9IHsKKwkubmFtZQkJCT0gIlByb3h5REhDUCIsCisJLnR4CQkJPSBkaGNwX3Byb3h5X3R4LAorCS5yeAkJCT0gZGhjcF9wcm94eV9yeCwKKwkuZXhwaXJlZAkJPSBkaGNwX3Byb3h5X2V4cGlyZWQsCisJLnR4X21zZ3R5cGUJCT0gREhDUFJFUVVFU1QsCisJLmFwcGx5X21pbl90aW1lb3V0CT0gMCwKK307CisKKy8qKgorICogQ29uc3RydWN0IHRyYW5zbWl0dGVkIHBhY2tldCBmb3IgUFhFIEJvb3QgU2VydmVyIERpc2NvdmVyeQorICoKKyAqIEB2IGRoY3AJCURIQ1Agc2Vzc2lvbgorICogQHYgZGhjcHBrdAkJREhDUCBwYWNrZXQKKyAqIEB2IHBlZXIJCURlc3RpbmF0aW9uIGFkZHJlc3MKKyAqLworc3RhdGljIGludCBkaGNwX3B4ZWJzX3R4ICggc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCwKKwkJCSAgIHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCwKKwkJCSAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqcGVlciApIHsKKwlzdHJ1Y3QgZGhjcF9weGVfYm9vdF9tZW51X2l0ZW0gbWVudV9pdGVtID0geyAwLCAwIH07CisJaW50IHJjOworCisJLyogU2V0IHNlcnZlciBhZGRyZXNzICovCisJcGVlci0+c2luX2FkZHIgPSAqKGRoY3AtPnB4ZV9hdHRlbXB0KTsKKwlwZWVyLT5zaW5fcG9ydCA9ICggKCBwZWVyLT5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX0JST0FEQ0FTVCApID8KKwkJCSAgIGh0b25zICggQk9PVFBTX1BPUlQgKSA6IGh0b25zICggUFhFX1BPUlQgKSApOworCisJREJHQyAoIGRoY3AsICJESENQICVwIFBYRUJTIFJFUVVFU1QgdG8gJXM6JWQgZm9yIHR5cGUgJWRcbiIsCisJICAgICAgIGRoY3AsIGluZXRfbnRvYSAoIHBlZXItPnNpbl9hZGRyICksIG50b2hzICggcGVlci0+c2luX3BvcnQgKSwKKwkgICAgICAgbGUxNl90b19jcHUgKCBkaGNwLT5weGVfdHlwZSApICk7CisKKwkvKiBTZXQgYm9vdCBtZW51IGl0ZW0gKi8KKwltZW51X2l0ZW0udHlwZSA9IGRoY3AtPnB4ZV90eXBlOworCWlmICggKCByYyA9IGRoY3Bwa3Rfc3RvcmUgKCBkaGNwcGt0LCBESENQX1BYRV9CT09UX01FTlVfSVRFTSwKKwkJCQkgICAgJm1lbnVfaXRlbSwgc2l6ZW9mICggbWVudV9pdGVtICkgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDaGVjayB0byBzZWUgaWYgUFhFIEJvb3QgU2VydmVyIGFkZHJlc3MgaXMgYWNjZXB0YWJsZQorICoKKyAqIEB2IGRoY3AJCURIQ1Agc2Vzc2lvbgorICogQHYgYnMJCUJvb3QgU2VydmVyIGFkZHJlc3MKKyAqIEByZXQgYWNjZXB0CQlCb290IFNlcnZlciBpcyBhY2NlcHRhYmxlCisgKi8KK3N0YXRpYyBpbnQgZGhjcF9weGVic19hY2NlcHQgKCBzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwLAorCQkJICAgICAgIHN0cnVjdCBpbl9hZGRyIGJzICkgeworCXN0cnVjdCBpbl9hZGRyICphY2NlcHQ7CisKKwkvKiBBY2NlcHQgaWYgd2UgaGF2ZSBubyBhY2NlcHRhbmNlIGZpbHRlciAqLworCWlmICggISBkaGNwLT5weGVfYWNjZXB0ICkKKwkJcmV0dXJuIDE7CisKKwkvKiBTY2FuIHRocm91Z2ggYWNjZXB0YW5jZSBsaXN0ICovCisJZm9yICggYWNjZXB0ID0gZGhjcC0+cHhlX2FjY2VwdCA7IGFjY2VwdC0+c19hZGRyIDsgYWNjZXB0KysgKSB7CisJCWlmICggYWNjZXB0LT5zX2FkZHIgPT0gYnMuc19hZGRyICkKKwkJCXJldHVybiAxOworCX0KKworCURCR0MgKCBkaGNwLCAiREhDUCAlcCByZWplY3Rpbmcgc2VydmVyICVzXG4iLAorCSAgICAgICBkaGNwLCBpbmV0X250b2EgKCBicyApICk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFuZGxlIHJlY2VpdmVkIHBhY2tldCBkdXJpbmcgUFhFIEJvb3QgU2VydmVyIERpc2NvdmVyeQorICoKKyAqIEB2IGRoY3AJCURIQ1Agc2Vzc2lvbgorICogQHYgZGhjcHBrdAkJREhDUCBwYWNrZXQKKyAqIEB2IHBlZXIJCURIQ1Agc2VydmVyIGFkZHJlc3MKKyAqIEB2IG1zZ3R5cGUJCURIQ1AgbWVzc2FnZSB0eXBlCisgKiBAdiBzZXJ2ZXJfaWQJCURIQ1Agc2VydmVyIElECisgKi8KK3N0YXRpYyB2b2lkIGRoY3BfcHhlYnNfcnggKCBzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwLAorCQkJICAgIHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCwKKwkJCSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBlZXIsIHVpbnQ4X3QgbXNndHlwZSwKKwkJCSAgICBzdHJ1Y3QgaW5fYWRkciBzZXJ2ZXJfaWQgKSB7CisJc3RydWN0IGRoY3BfcHhlX2Jvb3RfbWVudV9pdGVtIG1lbnVfaXRlbSA9IHsgMCwgMCB9OworCWludCByYzsKKworCURCR0MgKCBkaGNwLCAiREhDUCAlcCAlcyBmcm9tICVzOiVkIiwgZGhjcCwKKwkgICAgICAgZGhjcF9tc2d0eXBlX25hbWUgKCBtc2d0eXBlICksIGluZXRfbnRvYSAoIHBlZXItPnNpbl9hZGRyICksCisJICAgICAgIG50b2hzICggcGVlci0+c2luX3BvcnQgKSApOworCWlmICggc2VydmVyX2lkLnNfYWRkciAhPSBwZWVyLT5zaW5fYWRkci5zX2FkZHIgKQorCQlEQkdDICggZGhjcCwgIiAoJXMpIiwgaW5ldF9udG9hICggc2VydmVyX2lkICkgKTsKKworCS8qIElkZW50aWZ5IGJvb3QgbWVudSBpdGVtICovCisJZGhjcHBrdF9mZXRjaCAoIGRoY3Bwa3QsIERIQ1BfUFhFX0JPT1RfTUVOVV9JVEVNLAorCQkJJm1lbnVfaXRlbSwgc2l6ZW9mICggbWVudV9pdGVtICkgKTsKKwlpZiAoIG1lbnVfaXRlbS50eXBlICkKKwkJREJHQyAoIGRoY3AsICIgZm9yIHR5cGUgJWQiLCBudG9ocyAoIG1lbnVfaXRlbS50eXBlICkgKTsKKwlEQkdDICggZGhjcCwgIlxuIiApOworCisJLyogRmlsdGVyIG91dCB1bmFjY2VwdGFibGUgcmVzcG9uc2VzICovCisJaWYgKCAoIHBlZXItPnNpbl9wb3J0ICE9IGh0b25zICggQk9PVFBTX1BPUlQgKSApICYmCisJICAgICAoIHBlZXItPnNpbl9wb3J0ICE9IGh0b25zICggUFhFX1BPUlQgKSApICkKKwkJcmV0dXJuOworCWlmICggbXNndHlwZSAhPSBESENQQUNLICkKKwkJcmV0dXJuOworCWlmICggbWVudV9pdGVtLnR5cGUgIT0gZGhjcC0+cHhlX3R5cGUgKQorCQlyZXR1cm47CisJaWYgKCAhIGRoY3BfcHhlYnNfYWNjZXB0ICggZGhjcCwgKCBzZXJ2ZXJfaWQuc19hZGRyID8KKwkJCQkJICAgc2VydmVyX2lkIDogcGVlci0+c2luX2FkZHIgKSApICkKKwkJcmV0dXJuOworCisJLyogUmVnaXN0ZXIgc2V0dGluZ3MgKi8KKwlkaGNwcGt0LT5zZXR0aW5ncy5uYW1lID0gUFhFQlNfU0VUVElOR1NfTkFNRTsKKwlpZiAoICggcmMgPSByZWdpc3Rlcl9zZXR0aW5ncyAoICZkaGNwcGt0LT5zZXR0aW5ncywgTlVMTCApICkgIT0gMCApIHsKKwkJREJHQyAoIGRoY3AsICJESENQICVwIGNvdWxkIG5vdCByZWdpc3RlciBzZXR0aW5nczogJXNcbiIsCisJCSAgICAgICBkaGNwLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZGhjcF9maW5pc2hlZCAoIGRoY3AsIHJjICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUZXJtaW5hdGUgREhDUCAqLworCWRoY3BfZmluaXNoZWQgKCBkaGNwLCAwICk7Cit9CisKKy8qKgorICogSGFuZGxlIHRpbWVyIGV4cGlyeSBkdXJpbmcgUFhFIEJvb3QgU2VydmVyIERpc2NvdmVyeQorICoKKyAqIEB2IGRoY3AJCURIQ1Agc2Vzc2lvbgorICovCitzdGF0aWMgdm9pZCBkaGNwX3B4ZWJzX2V4cGlyZWQgKCBzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwICkgeworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZCA9ICggY3VycnRpY2tzKCkgLSBkaGNwLT5zdGFydCApOworCisJLyogR2l2ZSB1cCB3YWl0aW5nIGJlZm9yZSB3ZSByZWFjaCB0aGUgZmFpbHVyZSBwb2ludCwgYW5kIGZhaWwKKwkgKiBvdmVyIHRvIHRoZSBuZXh0IHNlcnZlciBpbiB0aGUgYXR0ZW1wdCBsaXN0CisJICovCisJaWYgKCBlbGFwc2VkID4gUFhFQlNfTUFYX1RJTUVPVVQgKSB7CisJCWRoY3AtPnB4ZV9hdHRlbXB0Kys7CisJCWlmICggZGhjcC0+cHhlX2F0dGVtcHQtPnNfYWRkciApIHsKKwkJCWRoY3Bfc2V0X3N0YXRlICggZGhjcCwgJmRoY3Bfc3RhdGVfcHhlYnMgKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWRoY3BfZmluaXNoZWQgKCBkaGNwLCAtRVRJTUVET1VUICk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBSZXRyYW5zbWl0IGN1cnJlbnQgcGFja2V0ICovCisJZGhjcF90eCAoIGRoY3AgKTsKK30KKworLyoqIFBYRSBCb290IFNlcnZlciBEaXNjb3Zlcnkgc3RhdGUgb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBkaGNwX3Nlc3Npb25fc3RhdGUgZGhjcF9zdGF0ZV9weGVicyA9IHsKKwkubmFtZQkJCT0gIlBYRUJTIiwKKwkudHgJCQk9IGRoY3BfcHhlYnNfdHgsCisJLnJ4CQkJPSBkaGNwX3B4ZWJzX3J4LAorCS5leHBpcmVkCQk9IGRoY3BfcHhlYnNfZXhwaXJlZCwKKwkudHhfbXNndHlwZQkJPSBESENQUkVRVUVTVCwKKwkuYXBwbHlfbWluX3RpbWVvdXQJPSAxLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQYWNrZXQgY29uc3RydWN0aW9uCisgKgorICovCisKKy8qKgorICogQ29uc3RydWN0IERIQ1AgY2xpZW50IGhhcmR3YXJlIGFkZHJlc3MgZmllbGQgYW5kIGJyb2FkY2FzdCBmbGFnCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgaGxlbgkJREhDUCBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCB0byBmaWxsIGluCisgKiBAdiBmbGFncwkJREhDUCBmbGFncyB0byBmaWxsIGluCisgKiBAcmV0IGNoYWRkcgkJREhDUCBjbGllbnQgaGFyZHdhcmUgYWRkcmVzcworICovCit2b2lkICogZGhjcF9jaGFkZHIgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50OF90ICpobGVuLAorCQkgICAgIHVpbnQxNl90ICpmbGFncyApIHsKKwlzdHJ1Y3QgbGxfcHJvdG9jb2wgKmxsX3Byb3RvY29sID0gbmV0ZGV2LT5sbF9wcm90b2NvbDsKKwl0eXBlb2YgKCAoICggc3RydWN0IGRoY3BoZHIgKiApIE5VTEwgKS0+Y2hhZGRyICkgY2hhZGRyOworCisJLyogSWYgdGhlIGxpbmstbGF5ZXIgYWRkcmVzcyBjYW5ub3QgZml0IGludG8gdGhlIGNoYWRkciBmaWVsZAorCSAqIChhcyBpcyB0aGUgY2FzZSBmb3IgSVBvSUIpIHRoZW4gdHJ5IHVzaW5nIHRoZSBoYXJkd2FyZQorCSAqIGFkZHJlc3MgaW5zdGVhZC4gIElmIHdlIGRvIHRoaXMsIHNldCB0aGUgYnJvYWRjYXN0IGZsYWcsCisJICogc2luY2UgY2hhZGRyIHRoZW4gZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgbGluay1sYXllcgorCSAqIGFkZHJlc3MgZm9yIHRoZSByZXR1cm4gcGF0aC4KKwkgKgorCSAqIElmIGV2ZW4gdGhlIGhhcmR3YXJlIGFkZHJlc3MgaXMgdG9vIGxhcmdlLCB1c2UgYW4gZW1wdHkKKwkgKiBjaGFkZHIgZmllbGQgYW5kIHNldCB0aGUgYnJvYWRjYXN0IGZsYWcuCisJICoKKwkgKiBUaGlzIGdvZXMgYWdhaW5zdCBSRkM0MzkwLCBidXQgUkZDNDM5MCBtYW5kYXRlcyB0aGF0IHdlIHVzZQorCSAqIGEgREhDUCBjbGllbnQgaWRlbnRpZmllciB0aGF0IGNvbmZvcm1zIHdpdGggUkZDNDM2MSwgd2hpY2gKKwkgKiB3ZSBjYW5ub3QgZG8gd2l0aG91dCBlaXRoZXIgcGVyc2lzdGVudCAoTklDLWluZGVwZW5kZW50KQorCSAqIHN0b3JhZ2UsIG9yIGJ5IGVsaW1pbmF0aW5nIHRoZSBoYXJkd2FyZSBhZGRyZXNzIGNvbXBsZXRlbHkKKwkgKiBmcm9tIHRoZSBESENQIHBhY2tldCwgd2hpY2ggc2VlbXMgdW5mcmllbmRseSB0byB1c2Vycy4KKwkgKi8KKwlpZiAoICggKmhsZW4gPSBsbF9wcm90b2NvbC0+bGxfYWRkcl9sZW4gKSA8PSBzaXplb2YgKCBjaGFkZHIgKSApIHsKKwkJcmV0dXJuIG5ldGRldi0+bGxfYWRkcjsKKwl9CisJKmZsYWdzID0gaHRvbnMgKCBCT09UUF9GTF9CUk9BRENBU1QgKTsKKwlpZiAoICggKmhsZW4gPSBsbF9wcm90b2NvbC0+aHdfYWRkcl9sZW4gKSA8PSBzaXplb2YgKCBjaGFkZHIgKSApIHsKKwkJcmV0dXJuIG5ldGRldi0+aHdfYWRkcjsKKwl9IGVsc2UgeworCQkqaGxlbiA9IDA7CisJCXJldHVybiBOVUxMOworCX0KK30KKworLyoqCisgKiBDcmVhdGUgYSBESENQIHBhY2tldAorICoKKyAqIEB2IGRoY3Bwa3QJCURIQ1AgcGFja2V0IHN0cnVjdHVyZSB0byBmaWxsIGluCisgKiBAdiBuZXRkZXYJCU5ldHdvcmsgZGV2aWNlCisgKiBAdiBtc2d0eXBlCQlESENQIG1lc3NhZ2UgdHlwZQorICogQHYgb3B0aW9ucwkJSW5pdGlhbCBvcHRpb25zIHRvIGluY2x1ZGUgKG9yIE5VTEwpCisgKiBAdiBvcHRpb25zX2xlbglMZW5ndGggb2YgaW5pdGlhbCBvcHRpb25zCisgKiBAdiBkYXRhCQlCdWZmZXIgZm9yIERIQ1AgcGFja2V0CisgKiBAdiBtYXhfbGVuCQlTaXplIG9mIERIQ1AgcGFja2V0IGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogQ3JlYXRlcyBhIERIQ1AgcGFja2V0IGluIHRoZSBzcGVjaWZpZWQgYnVmZmVyLCBhbmQgaW5pdGlhbGlzZSBhCisgKiBESENQIHBhY2tldCBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkaGNwX2NyZWF0ZV9wYWNrZXQgKCBzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3Bwa3QsCisJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDhfdCBtc2d0eXBlLAorCQkJIGNvbnN0IHZvaWQgKm9wdGlvbnMsIHNpemVfdCBvcHRpb25zX2xlbiwKKwkJCSB2b2lkICpkYXRhLCBzaXplX3QgbWF4X2xlbiApIHsKKwlzdHJ1Y3QgZGhjcGhkciAqZGhjcGhkciA9IGRhdGE7CisJdm9pZCAqY2hhZGRyOworCWludCByYzsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggbWF4X2xlbiA8ICggc2l6ZW9mICggKmRoY3BoZHIgKSArIG9wdGlvbnNfbGVuICkgKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCS8qIEluaXRpYWxpc2UgREhDUCBwYWNrZXQgY29udGVudCAqLworCW1lbXNldCAoIGRoY3BoZHIsIDAsIG1heF9sZW4gKTsKKwlkaGNwaGRyLT54aWQgPSBkaGNwX3hpZCAoIG5ldGRldiApOworCWRoY3BoZHItPm1hZ2ljID0gaHRvbmwgKCBESENQX01BR0lDX0NPT0tJRSApOworCWRoY3BoZHItPmh0eXBlID0gbnRvaHMgKCBuZXRkZXYtPmxsX3Byb3RvY29sLT5sbF9wcm90byApOworCWRoY3BoZHItPm9wID0gZGhjcF9vcFttc2d0eXBlXTsKKwljaGFkZHIgPSBkaGNwX2NoYWRkciAoIG5ldGRldiwgJmRoY3BoZHItPmhsZW4sICZkaGNwaGRyLT5mbGFncyApOworCW1lbWNweSAoIGRoY3BoZHItPmNoYWRkciwgY2hhZGRyLCBkaGNwaGRyLT5obGVuICk7CisJbWVtY3B5ICggZGhjcGhkci0+b3B0aW9ucywgb3B0aW9ucywgb3B0aW9uc19sZW4gKTsKKworCS8qIEluaXRpYWxpc2UgREhDUCBwYWNrZXQgc3RydWN0dXJlICovCisJbWVtc2V0ICggZGhjcHBrdCwgMCwgc2l6ZW9mICggKmRoY3Bwa3QgKSApOworCWRoY3Bwa3RfaW5pdCAoIGRoY3Bwa3QsIGRhdGEsIG1heF9sZW4gKTsKKwkKKwkvKiBTZXQgREhDUF9NRVNTQUdFX1RZUEUgb3B0aW9uICovCisJaWYgKCAoIHJjID0gZGhjcHBrdF9zdG9yZSAoIGRoY3Bwa3QsIERIQ1BfTUVTU0FHRV9UWVBFLAorCQkJCSAgICAmbXNndHlwZSwgc2l6ZW9mICggbXNndHlwZSApICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ3JlYXRlIERIQ1AgcmVxdWVzdCBwYWNrZXQKKyAqCisgKiBAdiBkaGNwcGt0CQlESENQIHBhY2tldCBzdHJ1Y3R1cmUgdG8gZmlsbCBpbgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHYgbXNndHlwZQkJREhDUCBtZXNzYWdlIHR5cGUKKyAqIEB2IGNpYWRkcgkJQ2xpZW50IElQIGFkZHJlc3MKKyAqIEB2IGRhdGEJCUJ1ZmZlciBmb3IgREhDUCBwYWNrZXQKKyAqIEB2IG1heF9sZW4JCVNpemUgb2YgREhDUCBwYWNrZXQgYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqCisgKiBDcmVhdGVzIGEgREhDUCByZXF1ZXN0IHBhY2tldCBpbiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciwgYW5kCisgKiBpbml0aWFsaXNlIGEgREhDUCBwYWNrZXQgc3RydWN0dXJlLgorICovCitpbnQgZGhjcF9jcmVhdGVfcmVxdWVzdCAoIHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcHBrdCwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdW5zaWduZWQgaW50IG1zZ3R5cGUsCisJCQkgIHN0cnVjdCBpbl9hZGRyIGNpYWRkciwgdm9pZCAqZGF0YSwgc2l6ZV90IG1heF9sZW4gKSB7CisJc3RydWN0IGRoY3BfbmV0ZGV2X2Rlc2MgZGhjcF9kZXNjOworCXN0cnVjdCBkaGNwX2NsaWVudF9pZCBjbGllbnRfaWQ7CisJc3RydWN0IGRoY3BfY2xpZW50X3V1aWQgY2xpZW50X3V1aWQ7CisJdWludDhfdCAqZGhjcF9mZWF0dXJlczsKKwlzaXplX3QgZGhjcF9mZWF0dXJlc19sZW47CisJc2l6ZV90IGxsX2FkZHJfbGVuOworCXNzaXplX3QgbGVuOworCWludCByYzsKKworCS8qIENyZWF0ZSBESENQIHBhY2tldCAqLworCWlmICggKCByYyA9IGRoY3BfY3JlYXRlX3BhY2tldCAoIGRoY3Bwa3QsIG5ldGRldiwgbXNndHlwZSwKKwkJCQkJIGRoY3BfcmVxdWVzdF9vcHRpb25zX2RhdGEsCisJCQkJCSBzaXplb2YgKCBkaGNwX3JlcXVlc3Rfb3B0aW9uc19kYXRhICksCisJCQkJCSBkYXRhLCBtYXhfbGVuICkgKSAhPSAwICkgeworCQlEQkcgKCAiREhDUCBjb3VsZCBub3QgY3JlYXRlIERIQ1AgcGFja2V0OiAlc1xuIiwKKwkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBTZXQgY2xpZW50IElQIGFkZHJlc3MgKi8KKwlkaGNwcGt0LT5kaGNwaGRyLT5jaWFkZHIgPSBjaWFkZHI7CisKKwkvKiBBZGQgb3B0aW9ucyB0byBpZGVudGlmeSB0aGUgZmVhdHVyZSBsaXN0ICovCisJZGhjcF9mZWF0dXJlcyA9IHRhYmxlX3N0YXJ0ICggREhDUF9GRUFUVVJFUyApOworCWRoY3BfZmVhdHVyZXNfbGVuID0gdGFibGVfbnVtX2VudHJpZXMgKCBESENQX0ZFQVRVUkVTICk7CisJaWYgKCAoIHJjID0gZGhjcHBrdF9zdG9yZSAoIGRoY3Bwa3QsIERIQ1BfRUJfRU5DQVAsIGRoY3BfZmVhdHVyZXMsCisJCQkJICAgIGRoY3BfZmVhdHVyZXNfbGVuICkgKSAhPSAwICkgeworCQlEQkcgKCAiREhDUCBjb3VsZCBub3Qgc2V0IGZlYXR1cmVzIGxpc3Qgb3B0aW9uOiAlc1xuIiwKKwkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBBZGQgb3B0aW9ucyB0byBpZGVudGlmeSB0aGUgbmV0d29yayBkZXZpY2UgKi8KKwlmZXRjaF9zZXR0aW5nICggJm5ldGRldi0+c2V0dGluZ3Muc2V0dGluZ3MsICZidXNpZF9zZXR0aW5nLCAmZGhjcF9kZXNjLAorCQlzaXplb2YgKCBkaGNwX2Rlc2MgKSApOworCWlmICggKCByYyA9IGRoY3Bwa3Rfc3RvcmUgKCBkaGNwcGt0LCBESENQX0VCX0JVU19JRCwgJmRoY3BfZGVzYywKKwkJCQkgICAgc2l6ZW9mICggZGhjcF9kZXNjICkgKSApICE9IDAgKSB7CisJCURCRyAoICJESENQIGNvdWxkIG5vdCBzZXQgYnVzIElEIG9wdGlvbjogJXNcbiIsCisJCSAgICAgIHN0cmVycm9yICggcmMgKSApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogQWRkIERIQ1AgY2xpZW50IGlkZW50aWZpZXIuICBSZXF1aXJlZCBmb3IgSW5maW5pYmFuZCwgYW5kCisJICogZG9lc24ndCBodXJ0IG90aGVyIGxpbmsgbGF5ZXJzLgorCSAqLworCWNsaWVudF9pZC5sbF9wcm90byA9IG50b2hzICggbmV0ZGV2LT5sbF9wcm90b2NvbC0+bGxfcHJvdG8gKTsKKwlsbF9hZGRyX2xlbiA9IG5ldGRldi0+bGxfcHJvdG9jb2wtPmxsX2FkZHJfbGVuOworCWFzc2VydCAoIGxsX2FkZHJfbGVuIDw9IHNpemVvZiAoIGNsaWVudF9pZC5sbF9hZGRyICkgKTsKKwltZW1jcHkgKCBjbGllbnRfaWQubGxfYWRkciwgbmV0ZGV2LT5sbF9hZGRyLCBsbF9hZGRyX2xlbiApOworCWlmICggKCByYyA9IGRoY3Bwa3Rfc3RvcmUgKCBkaGNwcGt0LCBESENQX0NMSUVOVF9JRCwgJmNsaWVudF9pZCwKKwkJCQkgICAgKCBsbF9hZGRyX2xlbiArIDEgKSApICkgIT0gMCApIHsKKwkJREJHICggIkRIQ1AgY291bGQgbm90IHNldCBjbGllbnQgSUQ6ICVzXG4iLAorCQkgICAgICBzdHJlcnJvciAoIHJjICkgKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEFkZCBjbGllbnQgVVVJRCwgaWYgd2UgaGF2ZSBvbmUuICBSZXF1aXJlZCBmb3IgUFhFLiAqLworCWNsaWVudF91dWlkLnR5cGUgPSBESENQX0NMSUVOVF9VVUlEX1RZUEU7CisJaWYgKCAoIGxlbiA9IGZldGNoX3V1aWRfc2V0dGluZyAoIE5VTEwsICZ1dWlkX3NldHRpbmcsCisJCQkJCSAgJmNsaWVudF91dWlkLnV1aWQgKSApID49IDAgKSB7CisJCWlmICggKCByYyA9IGRoY3Bwa3Rfc3RvcmUgKCBkaGNwcGt0LCBESENQX0NMSUVOVF9VVUlELAorCQkJCQkgICAgJmNsaWVudF91dWlkLAorCQkJCQkgICAgc2l6ZW9mICggY2xpZW50X3V1aWQgKSApICkgIT0gMCApIHsKKwkJCURCRyAoICJESENQIGNvdWxkIG5vdCBzZXQgY2xpZW50IFVVSUQ6ICVzXG4iLAorCQkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwkvKiBBZGQgdXNlciBjbGFzcywgaWYgd2UgaGF2ZSBvbmUuICovCisJaWYgKCAoIGxlbiA9IGZldGNoX3NldHRpbmdfbGVuICggTlVMTCwgJnVzZXJfY2xhc3Nfc2V0dGluZyApICkgPj0gMCApIHsKKwkJY2hhciB1c2VyX2NsYXNzW2xlbl07CisJCWZldGNoX3NldHRpbmcgKCBOVUxMLCAmdXNlcl9jbGFzc19zZXR0aW5nLCB1c2VyX2NsYXNzLAorCQkJCXNpemVvZiAoIHVzZXJfY2xhc3MgKSApOworCQlpZiAoICggcmMgPSBkaGNwcGt0X3N0b3JlICggZGhjcHBrdCwgREhDUF9VU0VSX0NMQVNTX0lELAorCQkJCQkgICAgJnVzZXJfY2xhc3MsCisJCQkJCSAgICBzaXplb2YgKCB1c2VyX2NsYXNzICkgKSApICE9IDAgKSB7CisJCQlEQkcgKCAiREhDUCBjb3VsZCBub3Qgc2V0IHVzZXIgY2xhc3M6ICVzXG4iLAorCQkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICoKKyAqLworCisvKioKKyAqIFRyYW5zbWl0IERIQ1AgcmVxdWVzdAorICoKKyAqIEB2IGRoY3AJCURIQ1Agc2Vzc2lvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZGhjcF90eCAoIHN0cnVjdCBkaGNwX3Nlc3Npb24gKmRoY3AgKSB7CisJc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9pbiBwZWVyID0geworCQkuc2luX2ZhbWlseSA9IEFGX0lORVQsCisJfTsKKwlzdHJ1Y3QgeGZlcl9tZXRhZGF0YSBtZXRhID0geworCQkubmV0ZGV2ID0gZGhjcC0+bmV0ZGV2LAorCQkuc3JjID0gKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZkaGNwLT5sb2NhbCwKKwkJLmRlc3QgPSAoIHN0cnVjdCBzb2NrYWRkciAqICkgJnBlZXIsCisJfTsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwl1aW50OF90IG1zZ3R5cGUgPSBkaGNwLT5zdGF0ZS0+dHhfbXNndHlwZTsKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgZGhjcHBrdDsKKwlpbnQgcmM7CisKKwkvKiBTdGFydCByZXRyeSB0aW1lci4gIERvIHRoaXMgZmlyc3Qgc28gdGhhdCBmYWlsdXJlcyB0bworCSAqIHRyYW5zbWl0IHdpbGwgYmUgcmV0cmllZC4KKwkgKi8KKwlzdGFydF90aW1lciAoICZkaGNwLT50aW1lciApOworCisJLyogQWxsb2NhdGUgYnVmZmVyIGZvciBwYWNrZXQgKi8KKwlpb2J1ZiA9IHhmZXJfYWxsb2NfaW9iICggJmRoY3AtPnhmZXIsIERIQ1BfTUlOX0xFTiApOworCWlmICggISBpb2J1ZiApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQ3JlYXRlIGJhc2ljIERIQ1AgcGFja2V0IGluIHRlbXBvcmFyeSBidWZmZXIgKi8KKwlpZiAoICggcmMgPSBkaGNwX2NyZWF0ZV9yZXF1ZXN0ICggJmRoY3Bwa3QsIGRoY3AtPm5ldGRldiwgbXNndHlwZSwKKwkJCQkJICBkaGNwLT5sb2NhbC5zaW5fYWRkciwgaW9idWYtPmRhdGEsCisJCQkJCSAgaW9iX3RhaWxyb29tICggaW9idWYgKSApICkgIT0gMCApIHsKKwkJREJHQyAoIGRoY3AsICJESENQICVwIGNvdWxkIG5vdCBjb25zdHJ1Y3QgREhDUCByZXF1ZXN0OiAlc1xuIiwKKwkJICAgICAgIGRoY3AsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogRmlsbCBpbiBwYWNrZXQgYmFzZWQgb24gY3VycmVudCBzdGF0ZSAqLworCWlmICggKCByYyA9IGRoY3AtPnN0YXRlLT50eCAoIGRoY3AsICZkaGNwcGt0LCAmcGVlciApICkgIT0gMCApIHsKKwkJREJHQyAoIGRoY3AsICJESENQICVwIGNvdWxkIG5vdCBmaWxsIERIQ1AgcmVxdWVzdDogJXNcbiIsCisJCSAgICAgICBkaGNwLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFRyYW5zbWl0IHRoZSBwYWNrZXQgKi8KKwlpb2JfcHV0ICggaW9idWYsIGRoY3Bwa3QubGVuICk7CisJaWYgKCAoIHJjID0geGZlcl9kZWxpdmVyX2lvYl9tZXRhICggJmRoY3AtPnhmZXIsIGlvYl9kaXNvd24gKCBpb2J1ZiApLAorCQkJCQkgICAgJm1ldGEgKSApICE9IDAgKSB7CisJCURCR0MgKCBkaGNwLCAiREhDUCAlcCBjb3VsZCBub3QgdHJhbnNtaXQgVURQIHBhY2tldDogJXNcbiIsCisJCSAgICAgICBkaGNwLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBkb25lOworCX0KKworIGRvbmU6CisJZnJlZV9pb2IgKCBpb2J1ZiApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZWNlaXZlIG5ldyBkYXRhCisgKgorICogQHYgeGZlciAJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbWV0YQkJVHJhbnNmZXIgbWV0YWRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGRoY3BfZGVsaXZlcl9pb2IgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsCisJCQkgICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCSAgICAgIHN0cnVjdCB4ZmVyX21ldGFkYXRhICptZXRhICkgeworCXN0cnVjdCBkaGNwX3Nlc3Npb24gKmRoY3AgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgZGhjcF9zZXNzaW9uLCB4ZmVyICk7CisJc3RydWN0IHNvY2thZGRyX2luICpwZWVyOworCXNpemVfdCBkYXRhX2xlbjsKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3Bwa3Q7CisJc3RydWN0IGRoY3BoZHIgKmRoY3BoZHI7CisJdWludDhfdCBtc2d0eXBlID0gMDsKKwlzdHJ1Y3QgaW5fYWRkciBzZXJ2ZXJfaWQgPSB7IDAgfTsKKwlpbnQgcmMgPSAwOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmICggISBtZXRhLT5zcmMgKSB7CisJCURCR0MgKCBkaGNwLCAiREhDUCAlcCByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBzb3VyY2UgcG9ydFxuIiwKKwkJICAgICAgIGRoY3AgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycl9ub19zcmM7CisJfQorCXBlZXIgPSAoIHN0cnVjdCBzb2NrYWRkcl9pbiAqICkgbWV0YS0+c3JjOworCisJLyogQ3JlYXRlIGEgREhDUCBwYWNrZXQgY29udGFpbmluZyB0aGUgSS9PIGJ1ZmZlciBjb250ZW50cy4KKwkgKiBXaGlsc3Qgd2UgY291bGQganVzdCB1c2UgdGhlIG9yaWdpbmFsIGJ1ZmZlciBpbiBzaXR1LCB0aGF0CisJICogd291bGQgd2FzdGUgdGhlIHVudXNlZCBzcGFjZSBpbiB0aGUgcGFja2V0IGJ1ZmZlciwgYW5kIGFsc28KKwkgKiB3YXN0ZSBhIHJlbGF0aXZlbHkgc2NhcmNlIGZ1bGx5LWFsaWduZWQgSS9PIGJ1ZmZlci4KKwkgKi8KKwlkYXRhX2xlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCWRoY3Bwa3QgPSB6YWxsb2MgKCBzaXplb2YgKCAqZGhjcHBrdCApICsgZGF0YV9sZW4gKTsKKwlpZiAoICEgZGhjcHBrdCApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19kaGNwcGt0OworCX0KKwlkaGNwaGRyID0gKCAoICggdm9pZCAqICkgZGhjcHBrdCApICsgc2l6ZW9mICggKmRoY3Bwa3QgKSApOworCW1lbWNweSAoIGRoY3BoZHIsIGlvYnVmLT5kYXRhLCBkYXRhX2xlbiApOworCWRoY3Bwa3RfaW5pdCAoIGRoY3Bwa3QsIGRoY3BoZHIsIGRhdGFfbGVuICk7CisKKwkvKiBJZGVudGlmeSBtZXNzYWdlIHR5cGUgKi8KKwlkaGNwcGt0X2ZldGNoICggZGhjcHBrdCwgREhDUF9NRVNTQUdFX1RZUEUsICZtc2d0eXBlLAorCQkJc2l6ZW9mICggbXNndHlwZSApICk7CisKKwkvKiBJZGVudGlmeSBzZXJ2ZXIgSUQgKi8KKwlkaGNwcGt0X2ZldGNoICggZGhjcHBrdCwgREhDUF9TRVJWRVJfSURFTlRJRklFUiwKKwkJCSZzZXJ2ZXJfaWQsIHNpemVvZiAoIHNlcnZlcl9pZCApICk7CisKKwkvKiBDaGVjayBmb3IgbWF0Y2hpbmcgdHJhbnNhY3Rpb24gSUQgKi8KKwlpZiAoIGRoY3BoZHItPnhpZCAhPSBkaGNwX3hpZCAoIGRoY3AtPm5ldGRldiApICkgeworCQlEQkdDICggZGhjcCwgIkRIQ1AgJXAgJXMgZnJvbSAlczolZCBoYXMgYmFkIHRyYW5zYWN0aW9uICIKKwkJICAgICAgICJJRFxuIiwgZGhjcCwgZGhjcF9tc2d0eXBlX25hbWUgKCBtc2d0eXBlICksCisJCSAgICAgICBpbmV0X250b2EgKCBwZWVyLT5zaW5fYWRkciApLAorCQkgICAgICAgbnRvaHMgKCBwZWVyLT5zaW5fcG9ydCApICk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfeGlkOworCX07CisKKwkvKiBIYW5kbGUgcGFja2V0IGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgKi8KKwlkaGNwLT5zdGF0ZS0+cnggKCBkaGNwLCBkaGNwcGt0LCBwZWVyLCBtc2d0eXBlLCBzZXJ2ZXJfaWQgKTsKKworIGVycl94aWQ6CisJZGhjcHBrdF9wdXQgKCBkaGNwcGt0ICk7CisgZXJyX2FsbG9jX2RoY3Bwa3Q6CisgZXJyX25vX3NyYzoKKwlmcmVlX2lvYiAoIGlvYnVmICk7CisJcmV0dXJuIHJjOworfQorCisvKiogREhDUCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgZGhjcF94ZmVyX29wZXJhdGlvbnMgPSB7CisJLmNsb3NlCQk9IGlnbm9yZV94ZmVyX2Nsb3NlLAorCS52cmVkaXJlY3QJPSB4ZmVyX3ZyZW9wZW4sCisJLndpbmRvdwkJPSB1bmxpbWl0ZWRfeGZlcl93aW5kb3csCisJLmFsbG9jX2lvYgk9IGRlZmF1bHRfeGZlcl9hbGxvY19pb2IsCisJLmRlbGl2ZXJfaW9iCT0gZGhjcF9kZWxpdmVyX2lvYiwKKwkuZGVsaXZlcl9yYXcJPSB4ZmVyX2RlbGl2ZXJfYXNfaW9iLAorfTsKKworLyoqCisgKiBIYW5kbGUgREhDUCByZXRyeSB0aW1lciBleHBpcnkKKyAqCisgKiBAdiB0aW1lcgkJREhDUCByZXRyeSB0aW1lcgorICogQHYgZmFpbAkJRmFpbHVyZSBpbmRpY2F0b3IKKyAqLworc3RhdGljIHZvaWQgZGhjcF90aW1lcl9leHBpcmVkICggc3RydWN0IHJldHJ5X3RpbWVyICp0aW1lciwgaW50IGZhaWwgKSB7CisJc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcCA9CisJCWNvbnRhaW5lcl9vZiAoIHRpbWVyLCBzdHJ1Y3QgZGhjcF9zZXNzaW9uLCB0aW1lciApOworCisJLyogSWYgd2UgaGF2ZSBmYWlsZWQsIHRlcm1pbmF0ZSBESENQICovCisJaWYgKCBmYWlsICkgeworCQlkaGNwX2ZpbmlzaGVkICggZGhjcCwgLUVUSU1FRE9VVCApOworCQlyZXR1cm47CisJfQorCisJLyogSGFuZGxlIHRpbWVyIGV4cGlyeSBiYXNlZCBvbiBjdXJyZW50IHN0YXRlICovCisJZGhjcC0+c3RhdGUtPmV4cGlyZWQgKCBkaGNwICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSm9iIGNvbnRyb2wgaW50ZXJmYWNlCisgKgorICovCisKKy8qKgorICogSGFuZGxlIGtpbGwoKSBldmVudCByZWNlaXZlZCB2aWEgam9iIGNvbnRyb2wgaW50ZXJmYWNlCisgKgorICogQHYgam9iCQlESENQIGpvYiBjb250cm9sIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZCBkaGNwX2pvYl9raWxsICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiApIHsKKwlzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwID0KKwkJY29udGFpbmVyX29mICggam9iLCBzdHJ1Y3QgZGhjcF9zZXNzaW9uLCBqb2IgKTsKKworCS8qIFRlcm1pbmF0ZSBESENQIHNlc3Npb24gKi8KKwlkaGNwX2ZpbmlzaGVkICggZGhjcCwgLUVDQU5DRUxFRCApOworfQorCisvKiogREhDUCBqb2IgY29udHJvbCBpbnRlcmZhY2Ugb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBqb2JfaW50ZXJmYWNlX29wZXJhdGlvbnMgZGhjcF9qb2Jfb3BlcmF0aW9ucyA9IHsKKwkuZG9uZQkJPSBpZ25vcmVfam9iX2RvbmUsCisJLmtpbGwJCT0gZGhjcF9qb2Jfa2lsbCwKKwkucHJvZ3Jlc3MJPSBpZ25vcmVfam9iX3Byb2dyZXNzLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbnN0YW50aWF0b3JzCisgKgorICovCisKKy8qKgorICogREhDUCBwZWVyIGFkZHJlc3MgZm9yIHNvY2tldCBvcGVuaW5nCisgKgorICogVGhpcyBpcyBhIGR1bW15IGFkZHJlc3M7IHRoZSBvbmx5IHVzZWZ1bCBwb3J0aW9uIGlzIHRoZSBzb2NrZXQKKyAqIGZhbWlseSAoc28gdGhhdCB3ZSBnZXQgYSBVRFAgY29ubmVjdGlvbikuICBUaGUgREhDUCBjbGllbnQgd2lsbCBzZXQKKyAqIHRoZSBJUCBhZGRyZXNzIGFuZCBzb3VyY2UgcG9ydCBleHBsaWNpdGx5IG9uIGVhY2ggdHJhbnNtaXNzaW9uLgorICovCitzdGF0aWMgc3RydWN0IHNvY2thZGRyIGRoY3BfcGVlciA9IHsKKwkuc2FfZmFtaWx5ID0gQUZfSU5FVCwKK307CisKKy8qKgorICogU3RhcnQgREhDUCBzdGF0ZSBtYWNoaW5lIG9uIGEgbmV0d29yayBkZXZpY2UKKyAqCisgKiBAdiBqb2IJCUpvYiBjb250cm9sIGludGVyZmFjZQorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlLCBvciBwb3NpdGl2ZSBpZiBjYWNoZWQKKyAqCisgKiBTdGFydHMgREhDUCBvbiB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgZGV2aWNlLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlCisgKiBESENQQUNLIChhbmQgUHJveHlESENQQUNLLCBpZiBhcHBsaWNhYmxlKSB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMKKyAqIG9wdGlvbiBzb3VyY2VzLgorICoKKyAqIE9uIGEgcmV0dXJuIG9mIDAsIGEgYmFja2dyb3VuZCBqb2IgaGFzIGJlZW4gc3RhcnRlZCB0byBwZXJmb3JtIHRoZQorICogREhDUCByZXF1ZXN0LiBBbnkgbm9uemVybyByZXR1cm4gbWVhbnMgdGhlIGpvYiBoYXMgbm90IGJlZW4KKyAqIHN0YXJ0ZWQ7IGEgcG9zaXRpdmUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgc3VjY2VzcyBjb25kaXRpb24gb2YKKyAqIGhhdmluZyBmZXRjaGVkIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGZyb20gY2FjaGVkIGluZm9ybWF0aW9uLgorICovCitpbnQgc3RhcnRfZGhjcCAoIHN0cnVjdCBqb2JfaW50ZXJmYWNlICpqb2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IGRoY3Bfc2Vzc2lvbiAqZGhjcDsKKwlpbnQgcmM7CisKKwkvKiBDaGVjayBmb3IgY2FjaGVkIERIQ1AgaW5mb3JtYXRpb24gKi8KKwlnZXRfY2FjaGVkX2RoY3BhY2soKTsKKwlpZiAoIGZldGNoX3VpbnR6X3NldHRpbmcgKCBOVUxMLCAmdXNlX2NhY2hlZF9zZXR0aW5nICkgKSB7CisJCURCRyAoICJESENQIHVzaW5nIGNhY2hlZCBuZXR3b3JrIHNldHRpbmdzXG4iICk7CisJCXJldHVybiAxOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHN0cnVjdHVyZSAqLworCWRoY3AgPSB6YWxsb2MgKCBzaXplb2YgKCAqZGhjcCApICk7CisJaWYgKCAhIGRoY3AgKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkaGNwLT5yZWZjbnQuZnJlZSA9IGRoY3BfZnJlZTsKKwlqb2JfaW5pdCAoICZkaGNwLT5qb2IsICZkaGNwX2pvYl9vcGVyYXRpb25zLCAmZGhjcC0+cmVmY250ICk7CisJeGZlcl9pbml0ICggJmRoY3AtPnhmZXIsICZkaGNwX3hmZXJfb3BlcmF0aW9ucywgJmRoY3AtPnJlZmNudCApOworCWRoY3AtPm5ldGRldiA9IG5ldGRldl9nZXQgKCBuZXRkZXYgKTsKKwlkaGNwLT5sb2NhbC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlkaGNwLT5sb2NhbC5zaW5fcG9ydCA9IGh0b25zICggQk9PVFBDX1BPUlQgKTsKKwlkaGNwLT50aW1lci5leHBpcmVkID0gZGhjcF90aW1lcl9leHBpcmVkOworCisJLyogSW5zdGFudGlhdGUgY2hpbGQgb2JqZWN0cyBhbmQgYXR0YWNoIHRvIG91ciBpbnRlcmZhY2VzICovCisJaWYgKCAoIHJjID0geGZlcl9vcGVuX3NvY2tldCAoICZkaGNwLT54ZmVyLCBTT0NLX0RHUkFNLCAmZGhjcF9wZWVyLAorCQkJCSAgKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZkaGNwLT5sb2NhbCApICkgIT0gMCApCisJCWdvdG8gZXJyOworCisJLyogRW50ZXIgREhDUERJU0NPVkVSIHN0YXRlICovCisJZGhjcF9zZXRfc3RhdGUgKCBkaGNwLCAmZGhjcF9zdGF0ZV9kaXNjb3ZlciApOworCisJLyogQXR0YWNoIHBhcmVudCBpbnRlcmZhY2UsIG1vcnRhbGlzZSBzZWxmLCBhbmQgcmV0dXJuICovCisJam9iX3BsdWdfcGx1ZyAoICZkaGNwLT5qb2IsIGpvYiApOworCXJlZl9wdXQgKCAmZGhjcC0+cmVmY250ICk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJZGhjcF9maW5pc2hlZCAoIGRoY3AsIHJjICk7CisJcmVmX3B1dCAoICZkaGNwLT5yZWZjbnQgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmV0cmlldmUgbGlzdCBvZiBQWEUgYm9vdCBzZXJ2ZXJzIGZvciBhIGdpdmVuIHNlcnZlciB0eXBlCisgKgorICogQHYgZGhjcAkJREhDUCBzZXNzaW9uCisgKiBAdiByYXcJCURIQ1AgUFhFIGJvb3Qgc2VydmVyIGxpc3QKKyAqIEB2IHJhd19sZW4JCUxlbmd0aCBvZiBESENQIFBYRSBib290IHNlcnZlciBsaXN0CisgKiBAdiBpcAkJSVAgYWRkcmVzcyBsaXN0IHRvIGZpbGwgaW4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIElQIGFkZHJlc3MgbGlzdCBoYXMgc3VmZmljaWVudAorICogc3BhY2UuCisgKi8KK3N0YXRpYyB2b2lkIHB4ZWJzX2xpc3QgKCBzdHJ1Y3QgZGhjcF9zZXNzaW9uICpkaGNwLCB2b2lkICpyYXcsCisJCQkgc2l6ZV90IHJhd19sZW4sIHN0cnVjdCBpbl9hZGRyICppcCApIHsKKwlzdHJ1Y3QgZGhjcF9weGVfYm9vdF9zZXJ2ZXIgKnNlcnZlciA9IHJhdzsKKwlzaXplX3Qgc2VydmVyX2xlbjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXdoaWxlICggcmF3X2xlbiApIHsKKwkJaWYgKCByYXdfbGVuIDwgc2l6ZW9mICggKnNlcnZlciApICkgeworCQkJREJHQyAoIGRoY3AsICJESENQICVwIG1hbGZvcm1lZCBQWEUgc2VydmVyIGxpc3RcbiIsCisJCQkgICAgICAgZGhjcCApOworCQkJYnJlYWs7CisJCX0KKwkJc2VydmVyX2xlbiA9IG9mZnNldG9mICggdHlwZW9mICggKnNlcnZlciApLAorCQkJCQlpcFsgc2VydmVyLT5udW1faXAgXSApOworCQlpZiAoIHJhd19sZW4gPCBzZXJ2ZXJfbGVuICkgeworCQkJREJHQyAoIGRoY3AsICJESENQICVwIG1hbGZvcm1lZCBQWEUgc2VydmVyIGxpc3RcbiIsCisJCQkgICAgICAgZGhjcCApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCBzZXJ2ZXItPnR5cGUgPT0gZGhjcC0+cHhlX3R5cGUgKSB7CisJCQlmb3IgKCBpID0gMCA7IGkgPCBzZXJ2ZXItPm51bV9pcCA7IGkrKyApCisJCQkJKihpcCsrKSA9IHNlcnZlci0+aXBbaV07CisJCX0KKwkJc2VydmVyID0gKCAoICggdm9pZCAqICkgc2VydmVyICkgKyBzZXJ2ZXJfbGVuICk7CisJCXJhd19sZW4gLT0gc2VydmVyX2xlbjsKKwl9Cit9CisKKy8qKgorICogU3RhcnQgUFhFIEJvb3QgU2VydmVyIERpc2NvdmVyeSBvbiBhIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgam9iCQlKb2IgY29udHJvbCBpbnRlcmZhY2UKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IHB4ZV90eXBlCQlQWEUgc2VydmVyIHR5cGUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFN0YXJ0cyBQWEUgQm9vdCBTZXJ2ZXIgRGlzY292ZXJ5IG9uIHRoZSBzcGVjaWZpZWQgbmV0d29yayBkZXZpY2UuCisgKiBJZiBzdWNjZXNzZnVsLCB0aGUgQm9vdCBTZXJ2ZXIgQUNLIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyBhbiBvcHRpb24KKyAqIHNvdXJjZS4KKyAqLworaW50IHN0YXJ0X3B4ZWJzICggc3RydWN0IGpvYl9pbnRlcmZhY2UgKmpvYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICB1bnNpZ25lZCBpbnQgcHhlX3R5cGUgKSB7CisJc3RydWN0IHNldHRpbmcgcHhlX2Rpc2NvdmVyeV9jb250cm9sX3NldHRpbmcgPQorCQl7IC50YWcgPSBESENQX1BYRV9ESVNDT1ZFUllfQ09OVFJPTCB9OworCXN0cnVjdCBzZXR0aW5nIHB4ZV9ib290X3NlcnZlcnNfc2V0dGluZyA9CisJCXsgLnRhZyA9IERIQ1BfUFhFX0JPT1RfU0VSVkVSUyB9OworCXN0cnVjdCBzZXR0aW5nIHB4ZV9ib290X3NlcnZlcl9tY2FzdF9zZXR0aW5nID0KKwkJeyAudGFnID0gREhDUF9QWEVfQk9PVF9TRVJWRVJfTUNBU1QgfTsKKwlzc2l6ZV90IHB4ZWJzX2xpc3RfbGVuOworCXN0cnVjdCBkaGNwX3Nlc3Npb24gKmRoY3A7CisJc3RydWN0IGluX2FkZHIgKmlwOworCXVuc2lnbmVkIGludCBweGVfZGlzY292ZXJ5X2NvbnRyb2w7CisJaW50IHJjOworCisJLyogR2V0IHVwcGVyIGJvdW5kIGZvciBQWEUgYm9vdCBzZXJ2ZXIgSVAgYWRkcmVzcyBsaXN0ICovCisJcHhlYnNfbGlzdF9sZW4gPSBmZXRjaF9zZXR0aW5nX2xlbiAoIE5VTEwsICZweGVfYm9vdF9zZXJ2ZXJzX3NldHRpbmcgKTsKKwlpZiAoIHB4ZWJzX2xpc3RfbGVuIDwgMCApCisJCXB4ZWJzX2xpc3RfbGVuID0gMDsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHN0cnVjdHVyZSAqLworCWRoY3AgPSB6YWxsb2MgKCBzaXplb2YgKCAqZGhjcCApICsgc2l6ZW9mICggKmlwICkgLyogbWNhc3QgKi8gKworCQkJc2l6ZW9mICggKmlwICkgLyogYmNhc3QgKi8gKyBweGVic19saXN0X2xlbiArCisJCQlzaXplb2YgKCAqaXAgKSAvKiB0ZXJtaW5hdG9yICovICk7CisJaWYgKCAhIGRoY3AgKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkaGNwLT5yZWZjbnQuZnJlZSA9IGRoY3BfZnJlZTsKKwlqb2JfaW5pdCAoICZkaGNwLT5qb2IsICZkaGNwX2pvYl9vcGVyYXRpb25zLCAmZGhjcC0+cmVmY250ICk7CisJeGZlcl9pbml0ICggJmRoY3AtPnhmZXIsICZkaGNwX3hmZXJfb3BlcmF0aW9ucywgJmRoY3AtPnJlZmNudCApOworCWRoY3AtPm5ldGRldiA9IG5ldGRldl9nZXQgKCBuZXRkZXYgKTsKKwlkaGNwLT5sb2NhbC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlmZXRjaF9pcHY0X3NldHRpbmcgKCBuZXRkZXZfc2V0dGluZ3MgKCBuZXRkZXYgKSwgJmlwX3NldHRpbmcsCisJCQkgICAgICZkaGNwLT5sb2NhbC5zaW5fYWRkciApOworCWRoY3AtPmxvY2FsLnNpbl9wb3J0ID0gaHRvbnMgKCBCT09UUENfUE9SVCApOworCWRoY3AtPnB4ZV90eXBlID0gY3B1X3RvX2xlMTYgKCBweGVfdHlwZSApOworCWRoY3AtPnRpbWVyLmV4cGlyZWQgPSBkaGNwX3RpbWVyX2V4cGlyZWQ7CisKKwkvKiBDb25zdHJ1Y3QgUFhFIGJvb3Qgc2VydmVyIElQIGFkZHJlc3MgbGlzdHMgKi8KKwlweGVfZGlzY292ZXJ5X2NvbnRyb2wgPQorCQlmZXRjaF91aW50el9zZXR0aW5nICggTlVMTCwgJnB4ZV9kaXNjb3ZlcnlfY29udHJvbF9zZXR0aW5nICk7CisJaXAgPSAoICggKCB2b2lkICogKSBkaGNwICkgKyBzaXplb2YgKCAqZGhjcCApICk7CisJZGhjcC0+cHhlX2F0dGVtcHQgPSBpcDsKKwlpZiAoICEgKCBweGVfZGlzY292ZXJ5X2NvbnRyb2wgJiBQWEVCU19OT19NVUxUSUNBU1QgKSApIHsKKwkJZmV0Y2hfaXB2NF9zZXR0aW5nICggTlVMTCwgJnB4ZV9ib290X3NlcnZlcl9tY2FzdF9zZXR0aW5nLCBpcCk7CisJCWlmICggaXAtPnNfYWRkciApCisJCQlpcCsrOworCX0KKwlpZiAoICEgKCBweGVfZGlzY292ZXJ5X2NvbnRyb2wgJiBQWEVCU19OT19CUk9BRENBU1QgKSApCisJCShpcCsrKS0+c19hZGRyID0gSU5BRERSX0JST0FEQ0FTVDsKKwlpZiAoIHB4ZV9kaXNjb3ZlcnlfY29udHJvbCAmIFBYRUJTX05PX1VOS05PV05fU0VSVkVSUyApCisJCWRoY3AtPnB4ZV9hY2NlcHQgPSBpcDsKKwlpZiAoIHB4ZWJzX2xpc3RfbGVuICkgeworCQl1aW50OF90IGJ1ZltweGVic19saXN0X2xlbl07CisKKwkJZmV0Y2hfc2V0dGluZyAoIE5VTEwsICZweGVfYm9vdF9zZXJ2ZXJzX3NldHRpbmcsCisJCQkJYnVmLCBzaXplb2YgKCBidWYgKSApOworCQlweGVic19saXN0ICggZGhjcCwgYnVmLCBzaXplb2YgKCBidWYgKSwgaXAgKTsKKwl9CisJaWYgKCAhIGRoY3AtPnB4ZV9hdHRlbXB0LT5zX2FkZHIgKSB7CisJCURCR0MgKCBkaGNwLCAiREhDUCAlcCBoYXMgbm8gUFhFIGJvb3Qgc2VydmVycyBmb3IgdHlwZSAlMDR4XG4iLAorCQkgICAgICAgZGhjcCwgcHhlX3R5cGUgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBEdW1wIG91dCBQWEUgc2VydmVyIGxpc3RzICovCisJREJHQyAoIGRoY3AsICJESENQICVwIGF0dGVtcHRpbmciLCBkaGNwICk7CisJZm9yICggaXAgPSBkaGNwLT5weGVfYXR0ZW1wdCA7IGlwLT5zX2FkZHIgOyBpcCsrICkKKwkJREJHQyAoIGRoY3AsICIgJXMiLCBpbmV0X250b2EgKCAqaXAgKSApOworCURCR0MgKCBkaGNwLCAiXG4iICk7CisJaWYgKCBkaGNwLT5weGVfYWNjZXB0ICkgeworCQlEQkdDICggZGhjcCwgIkRIQ1AgJXAgYWNjZXB0aW5nIiwgZGhjcCApOworCQlmb3IgKCBpcCA9IGRoY3AtPnB4ZV9hY2NlcHQgOyBpcC0+c19hZGRyIDsgaXArKyApCisJCQlEQkdDICggZGhjcCwgIiAlcyIsIGluZXRfbnRvYSAoICppcCApICk7CisJCURCR0MgKCBkaGNwLCAiXG4iICk7CisJfQorCisJLyogSW5zdGFudGlhdGUgY2hpbGQgb2JqZWN0cyBhbmQgYXR0YWNoIHRvIG91ciBpbnRlcmZhY2VzICovCisJaWYgKCAoIHJjID0geGZlcl9vcGVuX3NvY2tldCAoICZkaGNwLT54ZmVyLCBTT0NLX0RHUkFNLCAmZGhjcF9wZWVyLAorCQkJCSAgKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZkaGNwLT5sb2NhbCApICkgIT0gMCApCisJCWdvdG8gZXJyOworCisJLyogRW50ZXIgUFhFQlMgc3RhdGUgKi8KKwlkaGNwX3NldF9zdGF0ZSAoIGRoY3AsICZkaGNwX3N0YXRlX3B4ZWJzICk7CisKKwkvKiBBdHRhY2ggcGFyZW50IGludGVyZmFjZSwgbW9ydGFsaXNlIHNlbGYsIGFuZCByZXR1cm4gKi8KKwlqb2JfcGx1Z19wbHVnICggJmRoY3AtPmpvYiwgam9iICk7CisJcmVmX3B1dCAoICZkaGNwLT5yZWZjbnQgKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlkaGNwX2ZpbmlzaGVkICggZGhjcCwgcmMgKTsKKwlyZWZfcHV0ICggJmRoY3AtPnJlZmNudCApOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC91ZHAvZG5zLmMgYi9ncHhlL3NyYy9uZXQvdWRwL2Rucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDA5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvdWRwL2Rucy5jCkBAIC0wLDAgKzEsNjAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBQb3J0aW9ucyBjb3B5cmlnaHQgKEMpIDIwMDQgQW5zZWxtIE0uIEhvZmZtZWlzdGVyCisgKiA8c3RvY2tob2xtQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGdweGUvcmVmY250Lmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisjaW5jbHVkZSA8Z3B4ZS9yZXNvbHYuaD4KKyNpbmNsdWRlIDxncHhlL3JldHJ5Lmg+CisjaW5jbHVkZSA8Z3B4ZS90Y3BpcC5oPgorI2luY2x1ZGUgPGdweGUvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxncHhlL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Z3B4ZS9kbnMuaD4KKworLyoqIEBmaWxlCisgKgorICogRE5TIHByb3RvY29sCisgKgorICovCisKK0ZFQVRVUkUgKCBGRUFUVVJFX1BST1RPQ09MLCAiRE5TIiwgREhDUF9FQl9GRUFUVVJFX0ROUywgMSApOworCisvKiogVGhlIEROUyBzZXJ2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgbmFtZXNlcnZlciA9IHsKKwkuc3RfcG9ydCA9IGh0b25zICggRE5TX1BPUlQgKSwKK307CisKKy8qKiBUaGUgbG9jYWwgZG9tYWluICovCitzdGF0aWMgY2hhciAqbG9jYWxkb21haW47CisKKy8qKiBBIEROUyByZXF1ZXN0ICovCitzdHJ1Y3QgZG5zX3JlcXVlc3QgeworCS8qKiBSZWZlcmVuY2UgY291bnRlciAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCS8qKiBOYW1lIHJlc29sdXRpb24gaW50ZXJmYWNlICovCisJc3RydWN0IHJlc29sdl9pbnRlcmZhY2UgcmVzb2x2OworCS8qKiBEYXRhIHRyYW5zZmVyIGludGVyZmFjZSAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSBzb2NrZXQ7CisJLyoqIFJldHJ5IHRpbWVyICovCisJc3RydWN0IHJldHJ5X3RpbWVyIHRpbWVyOworCisJLyoqIFNvY2tldCBhZGRyZXNzIHRvIGZpbGwgaW4gd2l0aCByZXNvbHZlZCBhZGRyZXNzICovCisJc3RydWN0IHNvY2thZGRyIHNhOworCS8qKiBDdXJyZW50IHF1ZXJ5IHBhY2tldCAqLworCXN0cnVjdCBkbnNfcXVlcnkgcXVlcnk7CisJLyoqIExvY2F0aW9uIG9mIHF1ZXJ5IGluZm8gc3RydWN0dXJlIHdpdGhpbiBjdXJyZW50IHBhY2tldAorCSAqCisJICogVGhlIHF1ZXJ5IGluZm8gc3RydWN0dXJlIGlzIGxvY2F0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisJICogY29tcHJlc3NlZCBuYW1lLgorCSAqLworCXN0cnVjdCBkbnNfcXVlcnlfaW5mbyAqcWluZm87CisJLyoqIFJlY3Vyc2lvbiBjb3VudGVyICovCisJdW5zaWduZWQgaW50IHJlY3Vyc2lvbjsKK307CisKKy8qKgorICogTWFyayBETlMgcmVxdWVzdCBhcyBjb21wbGV0ZQorICoKKyAqIEB2IGRucwkJRE5TIHJlcXVlc3QKKyAqIEB2IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIHZvaWQgZG5zX2RvbmUgKCBzdHJ1Y3QgZG5zX3JlcXVlc3QgKmRucywgaW50IHJjICkgeworCisJLyogU3RvcCB0aGUgcmV0cnkgdGltZXIgKi8KKwlzdG9wX3RpbWVyICggJmRucy0+dGltZXIgKTsKKworCS8qIENsb3NlIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlICovCisJeGZlcl9udWxsaWZ5ICggJmRucy0+c29ja2V0ICk7CisJeGZlcl9jbG9zZSAoICZkbnMtPnNvY2tldCwgcmMgKTsKKworCS8qIE1hcmsgbmFtZSByZXNvbHV0aW9uIGFzIGNvbXBsZXRlICovCisJcmVzb2x2X2RvbmUgKCAmZG5zLT5yZXNvbHYsICZkbnMtPnNhLCByYyApOworfQorCisvKioKKyAqIENvbXBhcmUgRE5TIHJlcGx5IG5hbWUgYWdhaW5zdCB0aGUgcXVlcnkgbmFtZSBmcm9tIHRoZSBvcmlnaW5hbCByZXF1ZXN0CisgKgorICogQHYgZG5zCQlETlMgcmVxdWVzdAorICogQHYgcmVwbHkJCUROUyByZXBseQorICogQHYgcm5hbWUJCVJlcGx5IG5hbWUKKyAqIEByZXQJemVybwkJTmFtZXMgbWF0Y2gKKyAqIEByZXQgbm9uLXplcm8JTmFtZXMgZG8gbm90IG1hdGNoCisgKi8KK3N0YXRpYyBpbnQgZG5zX25hbWVfY21wICggc3RydWN0IGRuc19yZXF1ZXN0ICpkbnMsCisJCQkgIGNvbnN0IHN0cnVjdCBkbnNfaGVhZGVyICpyZXBseSwgCisJCQkgIGNvbnN0IGNoYXIgKnJuYW1lICkgeworCWNvbnN0IGNoYXIgKnFuYW1lID0gZG5zLT5xdWVyeS5wYXlsb2FkOworCWludCBpOworCisJd2hpbGUgKCAxICkgeworCQkvKiBPYnRhaW4gbmV4dCBzZWN0aW9uIG9mIHJuYW1lICovCisJCXdoaWxlICggKCAqcm5hbWUgKSAmIDB4YzAgKSB7CisJCQlybmFtZSA9ICggKCAoIGNoYXIgKiApIHJlcGx5ICkgKworCQkJCSAgKCBudG9ocyggKigodWludDE2X3QgKilybmFtZSkgKSAmIH4weGMwMDAgKSk7CisJCX0KKwkJLyogQ2hlY2sgdGhhdCBsZW5ndGhzIG1hdGNoICovCisJCWlmICggKnJuYW1lICE9ICpxbmFtZSApCisJCQlyZXR1cm4gLTE7CisJCS8qIElmIGxlbmd0aCBpcyB6ZXJvLCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCAqLworCQlpZiAoICEgKnFuYW1lICkKKwkJCXJldHVybiAwOworCQkvKiBDaGVjayB0aGF0IGRhdGEgbWF0Y2hlcyAqLworCQlmb3IgKCBpID0gKnFuYW1lICsgMTsgaSA+IDAgOyBpLS0gKSB7CisJCQlpZiAoICoocm5hbWUrKykgIT0gKihxbmFtZSsrKSApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorfQorCisvKioKKyAqIFNraXAgb3ZlciBhIChwb3NzaWJseSBjb21wcmVzc2VkKSBETlMgbmFtZQorICoKKyAqIEB2IG5hbWUJCUROUyBuYW1lCisgKiBAcmV0IG5hbWUJCU5leHQgRE5TIG5hbWUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBkbnNfc2tpcF9uYW1lICggY29uc3QgY2hhciAqbmFtZSApIHsKKwl3aGlsZSAoIDEgKSB7CisJCWlmICggISAqbmFtZSApIHsKKwkJCS8qIEVuZCBvZiBuYW1lICovCisJCQlyZXR1cm4gKCBuYW1lICsgMSk7CisJCX0KKwkJaWYgKCAqbmFtZSAmIDB4YzAgKSB7CisJCQkvKiBTdGFydCBvZiBhIGNvbXByZXNzZWQgbmFtZSAqLworCQkJcmV0dXJuICggbmFtZSArIDIgKTsKKwkJfQorCQkvKiBVbmNvbXByZXNzZWQgbmFtZSBwb3J0aW9uICovCisJCW5hbWUgKz0gKm5hbWUgKyAxOworCX0KK30KKworLyoqCisgKiBGaW5kIGFuIFJSIGluIGEgcmVwbHkgcGFja2V0IGNvcnJlc3BvbmRpbmcgdG8gb3VyIHF1ZXJ5CisgKgorICogQHYgZG5zCQlETlMgcmVxdWVzdAorICogQHYgcmVwbHkJCUROUyByZXBseQorICogQHJldCBycgkJRE5TIFJSLCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgdW5pb24gZG5zX3JyX2luZm8gKiBkbnNfZmluZF9yciAoIHN0cnVjdCBkbnNfcmVxdWVzdCAqZG5zLAorCQkJCQkgY29uc3Qgc3RydWN0IGRuc19oZWFkZXIgKnJlcGx5ICkgeworCWludCBpLCBjbXA7CisJY29uc3QgY2hhciAqcCA9ICggKCBjaGFyICogKSByZXBseSApICsgc2l6ZW9mICggc3RydWN0IGRuc19oZWFkZXIgKTsKKwl1bmlvbiBkbnNfcnJfaW5mbyAqcnJfaW5mbzsKKworCS8qIFNraXAgb3ZlciB0aGUgcXVlc3Rpb25zIHNlY3Rpb24gKi8KKwlmb3IgKCBpID0gbnRvaHMgKCByZXBseS0+cWRjb3VudCApIDsgaSA+IDAgOyBpLS0gKSB7CisJCXAgPSBkbnNfc2tpcF9uYW1lICggcCApICsgc2l6ZW9mICggc3RydWN0IGRuc19xdWVyeV9pbmZvICk7CisJfQorCisJLyogUHJvY2VzcyB0aGUgYW5zd2VycyBzZWN0aW9uICovCisJZm9yICggaSA9IG50b2hzICggcmVwbHktPmFuY291bnQgKSA7IGkgPiAwIDsgaS0tICkgeworCQljbXAgPSBkbnNfbmFtZV9jbXAgKCBkbnMsIHJlcGx5LCBwICk7CisJCXAgPSBkbnNfc2tpcF9uYW1lICggcCApOworCQlycl9pbmZvID0gKCAoIHVuaW9uIGRuc19ycl9pbmZvICogKSBwICk7CisJCWlmICggY21wID09IDAgKQorCQkJcmV0dXJuIHJyX2luZm87CisJCXAgKz0gKCBzaXplb2YgKCBycl9pbmZvLT5jb21tb24gKSArCisJCSAgICAgICBudG9ocyAoIHJyX2luZm8tPmNvbW1vbi5yZGxlbmd0aCApICk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogQXBwZW5kIERIQ1AgZG9tYWluIG5hbWUgaWYgYXZhaWxhYmxlIGFuZCBuYW1lIGlzIG5vdCBmdWxseSBxdWFsaWZpZWQKKyAqCisgKiBAdiBzdHJpbmcJCU5hbWUgYXMgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcKKyAqIEByZXQgZnFkbgkJRnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lLCBtYWxsb2MnZCBjb3B5CisgKgorICogVGhlIGNhbGxlciBtdXN0IGZyZWUgZnFkbiB3aGljaCBpcyBhbGxvY2F0ZWQgZXZlbiBpZiB0aGUgbmFtZSBpcyBhbHJlYWR5CisgKiBmdWxseSBxdWFsaWZpZWQuCisgKi8KK3N0YXRpYyBjaGFyICogZG5zX3F1YWxpZnlfbmFtZSAoIGNvbnN0IGNoYXIgKnN0cmluZyApIHsKKwljaGFyICpmcWRuOworCisJLyogTGVhdmUgdW5jaGFuZ2VkIGlmIGFscmVhZHkgZnVsbHktcXVhbGlmaWVkIG9yIG5vIGxvY2FsIGRvbWFpbiAqLworCWlmICggKCAhIGxvY2FsZG9tYWluICkgfHwgKCBzdHJjaHIgKCBzdHJpbmcsICcuJyApICE9IDAgKSApCisJCXJldHVybiBzdHJkdXAgKCBzdHJpbmcgKTsKKworCS8qIEFwcGVuZCBsb2NhbCBkb21haW4gdG8gbmFtZSAqLworCWFzcHJpbnRmICggJmZxZG4sICIlcy4lcyIsIHN0cmluZywgbG9jYWxkb21haW4gKTsKKwlyZXR1cm4gZnFkbjsKK30KKworLyoqCisgKiBDb252ZXJ0IGEgc3RhbmRhcmQgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIGEgRE5TIG5hbWUKKyAqCisgKiBAdiBzdHJpbmcJCU5hbWUgYXMgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcKKyAqIEB2IGJ1ZgkJQnVmZmVyIGluIHdoaWNoIHRvIHBsYWNlIEROUyBuYW1lCisgKiBAcmV0IG5leHQJCUJ5dGUgZm9sbG93aW5nIGNvbnN0cnVjdGVkIEROUyBuYW1lCisgKgorICogRE5TIG5hbWVzIGNvbnNpc3Qgb2YgIjxsZW5ndGg+ZWxlbWVudCIgcGFpcnMuCisgKi8KK3N0YXRpYyBjaGFyICogZG5zX21ha2VfbmFtZSAoIGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqYnVmICkgeworCWNoYXIgKmxlbmd0aF9ieXRlID0gYnVmKys7CisJY2hhciBjOworCisJd2hpbGUgKCAoIGMgPSAqKHN0cmluZysrKSApICkgeworCQlpZiAoIGMgPT0gJy4nICkgeworCQkJKmxlbmd0aF9ieXRlID0gYnVmIC0gbGVuZ3RoX2J5dGUgLSAxOworCQkJbGVuZ3RoX2J5dGUgPSBidWY7CisJCX0KKwkJKihidWYrKykgPSBjOworCX0KKwkqbGVuZ3RoX2J5dGUgPSBidWYgLSBsZW5ndGhfYnl0ZSAtIDE7CisJKihidWYrKykgPSAnXDAnOworCXJldHVybiBidWY7Cit9CisKKy8qKgorICogQ29udmVydCBhbiB1bmNvbXByZXNzZWQgRE5TIG5hbWUgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcKKyAqCisgKiBAdiBuYW1lCQlETlMgbmFtZQorICogQHJldCBzdHJpbmcJCU5VTC10ZXJtaW5hdGVkIHN0cmluZworICoKKyAqIFByb2R1Y2UgYSBwcmludGFibGUgdmVyc2lvbiBvZiBhIEROUyBuYW1lLiAgVXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqIGRuc191bm1ha2VfbmFtZSAoIGNoYXIgKm5hbWUgKSB7CisJY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJcCA9IG5hbWU7CisJd2hpbGUgKCAoIGxlbiA9ICpwICkgKSB7CisJCSoocCsrKSA9ICcuJzsKKwkJcCArPSBsZW47CisJfQorCisJcmV0dXJuIG5hbWUgKyAxOworfQorCisvKioKKyAqIERlY29tcHJlc3MgYSBETlMgbmFtZQorICoKKyAqIEB2IHJlcGx5CQlETlMgcmVwbGF5CisgKiBAdiBuYW1lCQlETlMgbmFtZQorICogQHYgYnVmCQlCdWZmZXIgaW50byB3aGljaCB0byBkZWNvbXByZXNzIEROUyBuYW1lCisgKiBAcmV0IG5leHQJCUJ5dGUgZm9sbG93aW5nIGRlY29tcHJlc3NlZCBETlMgbmFtZQorICovCitzdGF0aWMgY2hhciAqIGRuc19kZWNvbXByZXNzX25hbWUgKCBjb25zdCBzdHJ1Y3QgZG5zX2hlYWRlciAqcmVwbHksCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZiApIHsKKwlpbnQgaSwgbGVuOworCisJZG8geworCQkvKiBPYnRhaW4gbmV4dCBzZWN0aW9uIG9mIG5hbWUgKi8KKwkJd2hpbGUgKCAoICpuYW1lICkgJiAweGMwICkgeworCQkJbmFtZSA9ICggKCBjaGFyICogKSByZXBseSArCisJCQkJICggbnRvaHMgKCAqKCh1aW50MTZfdCAqKW5hbWUpICkgJiB+MHhjMDAwICkgKTsKKwkJfQorCQkvKiBDb3B5IGRhdGEgKi8KKwkJbGVuID0gKm5hbWU7CisJCWZvciAoIGkgPSBsZW4gKyAxIDsgaSA+IDAgOyBpLS0gKSB7CisJCQkqKGJ1ZisrKSA9ICoobmFtZSsrKTsKKwkJfQorCX0gd2hpbGUgKCBsZW4gKTsKKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqIFNlbmQgbmV4dCBwYWNrZXQgaW4gRE5TIHJlcXVlc3QKKyAqCisgKiBAdiBkbnMJCUROUyByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgZG5zX3NlbmRfcGFja2V0ICggc3RydWN0IGRuc19yZXF1ZXN0ICpkbnMgKSB7CisJc3RhdGljIHVuc2lnbmVkIGludCBxaWQgPSAwOworCXNpemVfdCBxbGVuOworCisJLyogSW5jcmVtZW50IHF1ZXJ5IElEICovCisJZG5zLT5xdWVyeS5kbnMuaWQgPSBodG9ucyAoICsrcWlkICk7CisKKwlEQkdDICggZG5zLCAiRE5TICVwIHNlbmRpbmcgcXVlcnkgSUQgJWRcbiIsIGRucywgcWlkICk7CisKKwkvKiBTdGFydCByZXRyYW5zbWlzc2lvbiB0aW1lciAqLworCXN0YXJ0X3RpbWVyICggJmRucy0+dGltZXIgKTsKKworCS8qIFNlbmQgdGhlIGRhdGEgKi8KKwlxbGVuID0gKCAoICggdm9pZCAqICkgZG5zLT5xaW5mbyApIC0gKCAoIHZvaWQgKiApICZkbnMtPnF1ZXJ5ICkKKwkJICsgc2l6ZW9mICggZG5zLT5xaW5mbyApICk7CisJcmV0dXJuIHhmZXJfZGVsaXZlcl9yYXcgKCAmZG5zLT5zb2NrZXQsICZkbnMtPnF1ZXJ5LCBxbGVuICk7Cit9CisKKy8qKgorICogSGFuZGxlIEROUyByZXRyYW5zbWlzc2lvbiB0aW1lciBleHBpcnkKKyAqCisgKiBAdiB0aW1lcgkJUmV0cnkgdGltZXIKKyAqIEB2IGZhaWwJCUZhaWx1cmUgaW5kaWNhdG9yCisgKi8KK3N0YXRpYyB2b2lkIGRuc190aW1lcl9leHBpcmVkICggc3RydWN0IHJldHJ5X3RpbWVyICp0aW1lciwgaW50IGZhaWwgKSB7CisJc3RydWN0IGRuc19yZXF1ZXN0ICpkbnMgPQorCQljb250YWluZXJfb2YgKCB0aW1lciwgc3RydWN0IGRuc19yZXF1ZXN0LCB0aW1lciApOworCisJaWYgKCBmYWlsICkgeworCQlkbnNfZG9uZSAoIGRucywgLUVUSU1FRE9VVCApOworCX0gZWxzZSB7CisJCWRuc19zZW5kX3BhY2tldCAoIGRucyApOworCX0KK30KKworLyoqCisgKiBSZWNlaXZlIG5ldyBkYXRhCisgKgorICogQHYgc29ja2V0CQlVRFAgc29ja2V0CisgKiBAdiBkYXRhCQlETlMgcmVwbHkKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIEROUyByZXBseQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgZG5zX3hmZXJfZGVsaXZlcl9yYXcgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnNvY2tldCwKKwkJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IGRuc19yZXF1ZXN0ICpkbnMgPQorCQljb250YWluZXJfb2YgKCBzb2NrZXQsIHN0cnVjdCBkbnNfcmVxdWVzdCwgc29ja2V0ICk7CisJY29uc3Qgc3RydWN0IGRuc19oZWFkZXIgKnJlcGx5ID0gZGF0YTsKKwl1bmlvbiBkbnNfcnJfaW5mbyAqcnJfaW5mbzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKwl1bnNpZ25lZCBpbnQgcXR5cGUgPSBkbnMtPnFpbmZvLT5xdHlwZTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggbGVuIDwgc2l6ZW9mICggKnJlcGx5ICkgKSB7CisJCURCR0MgKCBkbnMsICJETlMgJXAgcmVjZWl2ZWQgdW5kZXJsZW5ndGggcGFja2V0IGxlbmd0aCAlemRcbiIsCisJCSAgICAgICBkbnMsIGxlbiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayByZXBseSBJRCBtYXRjaGVzIHF1ZXJ5IElEICovCisJaWYgKCByZXBseS0+aWQgIT0gZG5zLT5xdWVyeS5kbnMuaWQgKSB7CisJCURCR0MgKCBkbnMsICJETlMgJXAgcmVjZWl2ZWQgdW5leHBlY3RlZCByZXBseSBJRCAlZCAiCisJCSAgICAgICAiKHdhbnRlZCAlZClcbiIsIGRucywgbnRvaHMgKCByZXBseS0+aWQgKSwKKwkJICAgICAgIG50b2hzICggZG5zLT5xdWVyeS5kbnMuaWQgKSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEQkdDICggZG5zLCAiRE5TICVwIHJlY2VpdmVkIHJlcGx5IElEICVkXG4iLCBkbnMsIG50b2hzICggcmVwbHktPmlkICkpOworCisJLyogU3RvcCB0aGUgcmV0cnkgdGltZXIuICBBZnRlciB0aGlzIHBvaW50LCBlYWNoIGNvZGUgcGF0aAorCSAqIG11c3QgZWl0aGVyIHJlc3RhcnQgdGhlIHRpbWVyIGJ5IGNhbGxpbmcgZG5zX3NlbmRfcGFja2V0KCksCisJICogb3IgbWFyayB0aGUgRE5TIG9wZXJhdGlvbiBhcyBjb21wbGV0ZSBieSBjYWxsaW5nCisJICogZG5zX2RvbmUoKQorCSAqLworCXN0b3BfdGltZXIgKCAmZG5zLT50aW1lciApOworCisJLyogU2VhcmNoIHRocm91Z2ggcmVzcG9uc2UgZm9yIHVzZWZ1bCBhbnN3ZXJzLiAgRG8gdGhpcworCSAqIG11bHRpcGxlIHRpbWVzLCB0byB0YWtlIGFkdmFudGFnZSBvZiB1c2VmdWwgbmFtZXNlcnZlcnMKKwkgKiB3aGljaCBzZW5kIHVzIGUuZy4gdGhlIENOQU1FICphbmQqIHRoZSBBIHJlY29yZCBmb3IgdGhlCisJICogcG9pbnRlZC10byBuYW1lLgorCSAqLworCXdoaWxlICggKCBycl9pbmZvID0gZG5zX2ZpbmRfcnIgKCBkbnMsIHJlcGx5ICkgKSApIHsKKwkJc3dpdGNoICggcnJfaW5mby0+Y29tbW9uLnR5cGUgKSB7CisKKwkJY2FzZSBodG9ucyAoIEROU19UWVBFX0EgKToKKworCQkJLyogRm91bmQgdGhlIHRhcmdldCBBIHJlY29yZCAqLworCQkJREJHQyAoIGRucywgIkROUyAlcCBmb3VuZCBhZGRyZXNzICVzXG4iLAorCQkJICAgICAgIGRucywgaW5ldF9udG9hICggcnJfaW5mby0+YS5pbl9hZGRyICkgKTsKKwkJCXNpbiA9ICggc3RydWN0IHNvY2thZGRyX2luICogKSAmZG5zLT5zYTsKKwkJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQlzaW4tPnNpbl9hZGRyID0gcnJfaW5mby0+YS5pbl9hZGRyOworCisJCQkvKiBNYXJrIG9wZXJhdGlvbiBhcyBjb21wbGV0ZSAqLworCQkJZG5zX2RvbmUgKCBkbnMsIDAgKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgaHRvbnMgKCBETlNfVFlQRV9DTkFNRSApOgorCisJCQkvKiBGb3VuZCBhIENOQU1FIHJlY29yZDsgdXBkYXRlIHF1ZXJ5IGFuZCByZWN1cnNlICovCisJCQlEQkdDICggZG5zLCAiRE5TICVwIGZvdW5kIENOQU1FXG4iLCBkbnMgKTsKKwkJCWRucy0+cWluZm8gPSAoIHZvaWQgKiApIGRuc19kZWNvbXByZXNzX25hbWUgKCByZXBseSwKKwkJCQkJCQkgcnJfaW5mby0+Y25hbWUuY25hbWUsCisJCQkJCQkJIGRucy0+cXVlcnkucGF5bG9hZCApOworCQkJZG5zLT5xaW5mby0+cXR5cGUgPSBodG9ucyAoIEROU19UWVBFX0EgKTsKKwkJCWRucy0+cWluZm8tPnFjbGFzcyA9IGh0b25zICggRE5TX0NMQVNTX0lOICk7CisJCQkKKwkJCS8qIFRlcm1pbmF0ZSB0aGUgb3BlcmF0aW9uIGlmIHdlIHJlY3Vyc2UgdG9vIGZhciAqLworCQkJaWYgKCArK2Rucy0+cmVjdXJzaW9uID4gRE5TX01BWF9DTkFNRV9SRUNVUlNJT04gKSB7CisJCQkJREJHQyAoIGRucywgIkROUyAlcCByZWN1cnNpb24gZXhjZWVkZWRcbiIsCisJCQkJICAgICAgIGRucyApOworCQkJCWRuc19kb25lICggZG5zLCAtRUxPT1AgKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdDICggZG5zLCAiRE5TICVwIGdvdCB1bmtub3duIHJlY29yZCB0eXBlICVkXG4iLAorCQkJICAgICAgIGRucywgbnRvaHMgKCBycl9pbmZvLT5jb21tb24udHlwZSApICk7CisJCQlicmVhazsKKwkJfQorCX0KKwkKKwkvKiBEZXRlcm1pbmUgd2hhdCB0byBkbyBuZXh0IGJhc2VkIG9uIHRoZSB0eXBlIG9mIHF1ZXJ5IHdlCisJICogaXNzdWVkIGFuZCB0aGUgcmVwb25zZSB3ZSByZWNlaXZlZAorCSAqLworCXN3aXRjaCAoIHF0eXBlICkgeworCisJY2FzZSBodG9ucyAoIEROU19UWVBFX0EgKToKKwkJLyogV2UgYXNrZWQgZm9yIGFuIEEgcmVjb3JkIGFuZCBnb3Qgbm90aGluZzsKKwkJICogdHJ5IHRoZSBDTkFNRS4KKwkJICovCisJCURCR0MgKCBkbnMsICJETlMgJXAgZm91bmQgbm8gQSByZWNvcmQ7IHRyeWluZyBDTkFNRVxuIiwgZG5zICk7CisJCWRucy0+cWluZm8tPnF0eXBlID0gaHRvbnMgKCBETlNfVFlQRV9DTkFNRSApOworCQlkbnNfc2VuZF9wYWNrZXQgKCBkbnMgKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIGh0b25zICggRE5TX1RZUEVfQ05BTUUgKToKKwkJLyogV2UgYXNrZWQgZm9yIGEgQ05BTUUgcmVjb3JkLiAgSWYgd2UgZ290IGEgcmVzcG9uc2UKKwkJICogKGkuZS4gaWYgdGhlIG5leHQgQSBxdWVyeSBpcyBhbHJlYWR5IHNldCB1cCksIHRoZW4KKwkJICogaXNzdWUgaXQsIG90aGVyd2lzZSBhYm9ydC4KKwkJICovCisJCWlmICggZG5zLT5xaW5mby0+cXR5cGUgPT0gaHRvbnMgKCBETlNfVFlQRV9BICkgKSB7CisJCQlkbnNfc2VuZF9wYWNrZXQgKCBkbnMgKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJREJHQyAoIGRucywgIkROUyAlcCBmb3VuZCBubyBDTkFNRSByZWNvcmRcbiIsIGRucyApOworCQkJZG5zX2RvbmUgKCBkbnMsIC1FTlhJTyApOworCQkJcmV0dXJuIDA7CisJCX0KKworCWRlZmF1bHQ6CisJCWFzc2VydCAoIDAgKTsKKwkJZG5zX2RvbmUgKCBkbnMsIC1FSU5WQUwgKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKioKKyAqIFJlY2VpdmUgbmV3IGRhdGEKKyAqCisgKiBAdiBzb2NrZXQJCVVEUCBzb2NrZXQKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIGRuc194ZmVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICpzb2NrZXQsIGludCByYyApIHsKKwlzdHJ1Y3QgZG5zX3JlcXVlc3QgKmRucyA9CisJCWNvbnRhaW5lcl9vZiAoIHNvY2tldCwgc3RydWN0IGRuc19yZXF1ZXN0LCBzb2NrZXQgKTsKKworCWlmICggISByYyApCisJCXJjID0gLUVDT05OQUJPUlRFRDsKKworCWRuc19kb25lICggZG5zLCByYyApOworfQorCisvKiogRE5TIHNvY2tldCBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgZG5zX3NvY2tldF9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSBkbnNfeGZlcl9jbG9zZSwKKwkudnJlZGlyZWN0CT0geGZlcl92cmVvcGVuLAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHhmZXJfZGVsaXZlcl9hc19yYXcsCisJLmRlbGl2ZXJfcmF3CT0gZG5zX3hmZXJfZGVsaXZlcl9yYXcsCit9OworCisvKioKKyAqIFJlc29sdmUgbmFtZSB1c2luZyBETlMKKyAqCisgKiBAdiByZXNvbHYJCU5hbWUgcmVzb2x1dGlvbiBpbnRlcmZhY2UKKyAqIEB2IG5hbWUJCU5hbWUgdG8gcmVzb2x2ZQorICogQHYgc2EJCVNvY2tldCBhZGRyZXNzIHRvIGZpbGwgaW4KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IGRuc19yZXNvbHYgKCBzdHJ1Y3QgcmVzb2x2X2ludGVyZmFjZSAqcmVzb2x2LAorCQkJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyICpzYSApIHsKKwlzdHJ1Y3QgZG5zX3JlcXVlc3QgKmRuczsKKwljaGFyICpmcWRuOworCWludCByYzsKKworCS8qIEZhaWwgaW1tZWRpYXRlbHkgaWYgbm8gRE5TIHNlcnZlcnMgKi8KKwlpZiAoICEgbmFtZXNlcnZlci5zdF9mYW1pbHkgKSB7CisJCURCRyAoICJETlMgbm90IGF0dGVtcHRpbmcgdG8gcmVzb2x2ZSBcIiVzXCI6ICIKKwkJICAgICAgIm5vIEROUyBzZXJ2ZXJzXG4iLCBuYW1lICk7CisJCXJjID0gLUVOWElPOworCQlnb3RvIGVycl9ub19uYW1lc2VydmVyOworCX0KKworCS8qIEVuc3VyZSBmdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUgaWYgREhDUCBvcHRpb24gd2FzIGdpdmVuICovCisJZnFkbiA9IGRuc19xdWFsaWZ5X25hbWUgKCBuYW1lICk7CisJaWYgKCAhIGZxZG4gKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfcXVhbGlmeV9uYW1lOworCX0KKworCS8qIEFsbG9jYXRlIEROUyBzdHJ1Y3R1cmUgKi8KKwlkbnMgPSB6YWxsb2MgKCBzaXplb2YgKCAqZG5zICkgKTsKKwlpZiAoICEgZG5zICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2RuczsKKwl9CisJcmVzb2x2X2luaXQgKCAmZG5zLT5yZXNvbHYsICZudWxsX3Jlc29sdl9vcHMsICZkbnMtPnJlZmNudCApOworCXhmZXJfaW5pdCAoICZkbnMtPnNvY2tldCwgJmRuc19zb2NrZXRfb3BlcmF0aW9ucywgJmRucy0+cmVmY250ICk7CisJZG5zLT50aW1lci5leHBpcmVkID0gZG5zX3RpbWVyX2V4cGlyZWQ7CisJbWVtY3B5ICggJmRucy0+c2EsIHNhLCBzaXplb2YgKCBkbnMtPnNhICkgKTsKKworCS8qIENyZWF0ZSBxdWVyeSAqLworCWRucy0+cXVlcnkuZG5zLmZsYWdzID0gaHRvbnMgKCBETlNfRkxBR19RVUVSWSB8IEROU19GTEFHX09QQ09ERV9RVUVSWSB8CisJCQkJICAgICAgIEROU19GTEFHX1JEICk7CisJZG5zLT5xdWVyeS5kbnMucWRjb3VudCA9IGh0b25zICggMSApOworCWRucy0+cWluZm8gPSAoIHZvaWQgKiApIGRuc19tYWtlX25hbWUgKCBmcWRuLCBkbnMtPnF1ZXJ5LnBheWxvYWQgKTsKKwlkbnMtPnFpbmZvLT5xdHlwZSA9IGh0b25zICggRE5TX1RZUEVfQSApOworCWRucy0+cWluZm8tPnFjbGFzcyA9IGh0b25zICggRE5TX0NMQVNTX0lOICk7CisKKwkvKiBPcGVuIFVEUCBjb25uZWN0aW9uICovCisJaWYgKCAoIHJjID0geGZlcl9vcGVuX3NvY2tldCAoICZkbnMtPnNvY2tldCwgU09DS19ER1JBTSwKKwkJCQkgICAgICAgKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZuYW1lc2VydmVyLAorCQkJCSAgICAgICBOVUxMICkgKSAhPSAwICkgeworCQlEQkdDICggZG5zLCAiRE5TICVwIGNvdWxkIG5vdCBvcGVuIHNvY2tldDogJXNcbiIsCisJCSAgICAgICBkbnMsIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycl9vcGVuX3NvY2tldDsKKwl9CisKKwkvKiBTZW5kIGZpcnN0IEROUyBwYWNrZXQgKi8KKwlkbnNfc2VuZF9wYWNrZXQgKCBkbnMgKTsKKworCS8qIEF0dGFjaCBwYXJlbnQgaW50ZXJmYWNlLCBtb3J0YWxpc2Ugc2VsZiwgYW5kIHJldHVybiAqLworCXJlc29sdl9wbHVnX3BsdWcgKCAmZG5zLT5yZXNvbHYsIHJlc29sdiApOworCXJlZl9wdXQgKCAmZG5zLT5yZWZjbnQgKTsKKwlmcmVlICggZnFkbiApOworCXJldHVybiAwOwkKKworIGVycl9vcGVuX3NvY2tldDoKKyBlcnJfYWxsb2NfZG5zOgorCXJlZl9wdXQgKCAmZG5zLT5yZWZjbnQgKTsKKyBlcnJfcXVhbGlmeV9uYW1lOgorCWZyZWUgKCBmcWRuICk7CisgZXJyX25vX25hbWVzZXJ2ZXI6CisJcmV0dXJuIHJjOworfQorCisvKiogRE5TIG5hbWUgcmVzb2x2ZXIgKi8KK3N0cnVjdCByZXNvbHZlciBkbnNfcmVzb2x2ZXIgX19yZXNvbHZlciAoIFJFU09MVl9OT1JNQUwgKSA9IHsKKwkubmFtZSA9ICJETlMiLAorCS5yZXNvbHYgPSBkbnNfcmVzb2x2LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNldHRpbmdzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiBETlMgc2VydmVyIHNldHRpbmcgKi8KK3N0cnVjdCBzZXR0aW5nIGRuc19zZXR0aW5nIF9fc2V0dGluZyA9IHsKKwkubmFtZSA9ICJkbnMiLAorCS5kZXNjcmlwdGlvbiA9ICJETlMgc2VydmVyIiwKKwkudGFnID0gREhDUF9ETlNfU0VSVkVSUywKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfaXB2NCwKK307CisKKy8qKiBEb21haW4gbmFtZSBzZXR0aW5nICovCitzdHJ1Y3Qgc2V0dGluZyBkb21haW5fc2V0dGluZyBfX3NldHRpbmcgPSB7CisJLm5hbWUgPSAiZG9tYWluIiwKKwkuZGVzY3JpcHRpb24gPSAiTG9jYWwgZG9tYWluIiwKKwkudGFnID0gREhDUF9ET01BSU5fTkFNRSwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfc3RyaW5nLAorfTsKKworLyoqCisgKiBBcHBseSBETlMgc2V0dGluZ3MKKyAqCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBhcHBseV9kbnNfc2V0dGluZ3MgKCB2b2lkICkgeworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luX25hbWVzZXJ2ZXIgPQorCQkoIHN0cnVjdCBzb2NrYWRkcl9pbiAqICkgJm5hbWVzZXJ2ZXI7CisJaW50IGxlbjsKKworCWlmICggKCBsZW4gPSBmZXRjaF9pcHY0X3NldHRpbmcgKCBOVUxMLCAmZG5zX3NldHRpbmcsCisJCQkJCSAgJnNpbl9uYW1lc2VydmVyLT5zaW5fYWRkciApICkgPj0gMCApeworCQlzaW5fbmFtZXNlcnZlci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCURCRyAoICJETlMgdXNpbmcgbmFtZXNlcnZlciAlc1xuIiwKKwkJICAgICAgaW5ldF9udG9hICggc2luX25hbWVzZXJ2ZXItPnNpbl9hZGRyICkgKTsKKwl9CisKKwkvKiBHZXQgbG9jYWwgZG9tYWluIERIQ1Agb3B0aW9uICovCisJaWYgKCAoIGxlbiA9IGZldGNoX3N0cmluZ19zZXR0aW5nX2NvcHkgKCBOVUxMLCAmZG9tYWluX3NldHRpbmcsCisJCQkJCQkgJmxvY2FsZG9tYWluICkgKSA+PSAwICkKKwkJREJHICggIkROUyBsb2NhbCBkb21haW4gJXNcbiIsIGxvY2FsZG9tYWluICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqIEROUyBzZXR0aW5ncyBhcHBsaWNhdG9yICovCitzdHJ1Y3Qgc2V0dGluZ3NfYXBwbGljYXRvciBkbnNfYXBwbGljYXRvciBfX3NldHRpbmdzX2FwcGxpY2F0b3IgPSB7CisJLmFwcGx5ID0gYXBwbHlfZG5zX3NldHRpbmdzLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL25ldC91ZHAvc2xhbS5jIGIvZ3B4ZS9zcmMvbmV0L3VkcC9zbGFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2ZjY5YgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL25ldC91ZHAvc2xhbS5jCkBAIC0wLDAgKzEsODEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxncHhlL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Z3B4ZS9pb2J1Zi5oPgorI2luY2x1ZGUgPGdweGUvYml0bWFwLmg+CisjaW5jbHVkZSA8Z3B4ZS94ZmVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisjaW5jbHVkZSA8Z3B4ZS91cmkuaD4KKyNpbmNsdWRlIDxncHhlL3RjcGlwLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorI2luY2x1ZGUgPGdweGUvcmV0cnkuaD4KKworLyoqIEBmaWxlCisgKgorICogU2NhbGFibGUgTG9jYWwgQXJlYSBNdWx0aWNhc3QgcHJvdG9jb2wKKyAqCisgKiBUaGUgU0xBTSBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgb25seSBieSBFdGhlcmJvb3Q7IGl0IHdhcyBkZXNpZ25lZAorICogYW5kIGltcGxlbWVudGVkIGJ5IEVyaWMgQmllZGVybWFuLiAgQSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaXMKKyAqIGF2YWlsYWJsZSBpbiBjb250cmliL21pbmktc2xhbWQuICBUaGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW55CisgKiBkb2N1bWVudGF0aW9uIGJleW9uZCBhIGZldyBzcGFyc2UgY29tbWVudHMgaW4gRXRoZXJib290J3MKKyAqIHByb3RvX3NsYW0uYy4KKyAqCisgKiBTTEFNIHBhY2tldHMgdXNlIHRocmVlIHR5cGVzIG9mIGRhdGEgZmllbGQ6CisgKgorICogIE51bCA6IEEgc2luZ2xlIE5VTCAoMCkgYnl0ZSwgdXNlZCBhcyBhIGxpc3QgdGVybWluYXRvcgorICoKKyAqICBSYXcgOiBBIGJsb2NrIG9mIHJhdyBkYXRhCisgKgorICogIEludCA6IEEgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIsIGluIGJpZy1lbmRpYW4gb3JkZXIuICBUaGUgbGVuZ3RoCisgKiAgICAgICAgb2YgdGhlIGludGVnZXIgaXMgZW5jb2RlZCBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCB0aHJlZSBiaXRzLgorICoKKyAqIFBhY2tldHMgcmVjZWl2ZWQgYnkgdGhlIGNsaWVudCBoYXZlIHRoZSBmb2xsb3dpbmcgbGF5b3V0OgorICoKKyAqICBJbnQgOiBUcmFuc2FjdGlvbiBpZGVudGlmaWVyLiAgVGhpcyBpcyBhbiBvcGFxdWUgdmFsdWUuCisgKgorICogIEludCA6IFRvdGFsIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdHJhbnNmZXIuCisgKgorICogIEludCA6IEJsb2NrIHNpemUsIGluIGJ5dGVzLgorICoKKyAqICBJbnQgOiBQYWNrZXQgc2VxdWVuY2UgbnVtYmVyIHdpdGhpbiB0aGUgdHJhbnNmZXIgKGlmIHRoaXMgcGFja2V0CisgKiAgICAgICAgY29udGFpbnMgZGF0YSkuCisgKgorICogIFJhdyA6IFBhY2tldCBkYXRhIChpZiB0aGlzIHBhY2tldCBjb250YWlucyBkYXRhKS4KKyAqCisgKiBQYWNrZXRzIHRyYW5zbWl0dGVkIGJ5IHRoZSBjbGllbnQgY29uc2lzdCBvZiBhIHJ1bi1sZW5ndGgtZW5jb2RlZAorICogcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVkLWJsb2NrcyBiaXRtYXAsIGxvb2tpbmcgc29tZXRoaW5nCisgKiBsaWtlOgorICoKKyAqICBJbnQgOiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgc3VjY2Vzc2Z1bGx5LXJlY2VpdmVkIHBhY2tldHMKKyAqICBJbnQgOiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbWlzc2luZyBwYWNrZXRzCisgKiAgSW50IDogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIHN1Y2Nlc3NmdWxseS1yZWNlaXZlZCBwYWNrZXRzCisgKiAgSW50IDogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIG1pc3NpbmcgcGFja2V0cworICogIC4uLi4KKyAqICBOdWwKKyAqCisgKi8KKworRkVBVFVSRSAoIEZFQVRVUkVfUFJPVE9DT0wsICJTTEFNIiwgREhDUF9FQl9GRUFUVVJFX1NMQU0sIDEgKTsKKworLyoqIERlZmF1bHQgU0xBTSBzZXJ2ZXIgcG9ydCAqLworI2RlZmluZSBTTEFNX0RFRkFVTFRfUE9SVCAxMDAwMAorCisvKiogRGVmYXVsdCBTTEFNIG11bHRpY2FzdCBJUCBhZGRyZXNzICovCisjZGVmaW5lIFNMQU1fREVGQVVMVF9NVUxUSUNBU1RfSVAgXAorCSggKCAyMzkgPDwgMjQgKSB8ICggMjU1IDw8IDE2ICkgfCAoIDEgPDwgOCApIHwgKCAxIDw8IDAgKSApCisKKy8qKiBEZWZhdWx0IFNMQU0gbXVsdGljYXN0IHBvcnQgKi8KKyNkZWZpbmUgU0xBTV9ERUZBVUxUX01VTFRJQ0FTVF9QT1JUIDEwMDAwCisKKy8qKiBNYXhpbXVtIFNMQU0gaGVhZGVyIGxlbmd0aCAqLworI2RlZmluZSBTTEFNX01BWF9IRUFERVJfTEVOICggNyAvKiB0cmFuc2FjdGlvbiBpZCAqLyArIDcgLyogdG90YWxfYnl0ZXMgKi8gKyBcCisJCQkgICAgICA3IC8qIGJsb2NrX3NpemUgKi8gKQorCisvKiogTWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHRvIHJlcXVlc3QgcGVyIE5BQ0sKKyAqCisgKiBUaGlzIGlzIGEgcG9saWN5IGRlY2lzaW9uIGVxdWl2YWxlbnQgdG8gc2VsZWN0aW5nIGEgVENQIHdpbmRvdworICogc2l6ZS4KKyAqLworI2RlZmluZSBTTEFNX01BWF9CTE9DS1NfUEVSX05BQ0sgNAorCisvKiogTWF4aW11bSBTTEFNIE5BQ0sgbGVuZ3RoCisgKgorICogV2Ugb25seSBldmVyIHNlbmQgYSBOQUNLIGZvciBhIHNpbmdsZSByYW5nZSBvZiB1cCB0byBAYworICogU0xBTV9NQVhfQkxPQ0tTX1BFUl9OQUNLIGJsb2Nrcy4KKyAqLworI2RlZmluZSBTTEFNX01BWF9OQUNLX0xFTiAoIDcgLyogYmxvY2sgKi8gKyA3IC8qICNibG9ja3MgKi8gKyAxIC8qIE5VTCAqLyApCisKKy8qKiBTTEFNIHNsYXZlIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0xBTV9TTEFWRV9USU1FT1VUICggMSAqIFRJQ0tTX1BFUl9TRUMgKQorCisvKiogQSBTTEFNIHJlcXVlc3QgKi8KK3N0cnVjdCBzbGFtX3JlcXVlc3QgeworCS8qKiBSZWZlcmVuY2UgY291bnRlciAqLworCXN0cnVjdCByZWZjbnQgcmVmY250OworCisJLyoqIERhdGEgdHJhbnNmZXIgaW50ZXJmYWNlICovCisJc3RydWN0IHhmZXJfaW50ZXJmYWNlIHhmZXI7CisJLyoqIFVuaWNhc3Qgc29ja2V0ICovCisJc3RydWN0IHhmZXJfaW50ZXJmYWNlIHNvY2tldDsKKwkvKiogTXVsdGljYXN0IHNvY2tldCAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSBtY19zb2NrZXQ7CisKKwkvKiogTWFzdGVyIGNsaWVudCByZXRyeSB0aW1lciAqLworCXN0cnVjdCByZXRyeV90aW1lciBtYXN0ZXJfdGltZXI7CisJLyoqIFNsYXZlIGNsaWVudCByZXRyeSB0aW1lciAqLworCXN0cnVjdCByZXRyeV90aW1lciBzbGF2ZV90aW1lcjsKKworCS8qKiBDYWNoZWQgaGVhZGVyICovCisJdWludDhfdCBoZWFkZXJbU0xBTV9NQVhfSEVBREVSX0xFTl07CisJLyoqIFNpemUgb2YgY2FjaGVkIGhlYWRlciAqLworCXNpemVfdCBoZWFkZXJfbGVuOworCS8qKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdHJhbnNmZXIgKi8KKwl1bnNpZ25lZCBsb25nIHRvdGFsX2J5dGVzOworCS8qKiBUcmFuc2ZlciBibG9jayBzaXplICovCisJdW5zaWduZWQgbG9uZyBibG9ja19zaXplOworCS8qKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRyYW5zZmVyICovCisJdW5zaWduZWQgbG9uZyBudW1fYmxvY2tzOworCS8qKiBCbG9jayBiaXRtYXAgKi8KKwlzdHJ1Y3QgYml0bWFwIGJpdG1hcDsKKwkvKiogTkFDSyBzZW50IGZsYWcgKi8KKwlpbnQgbmFja19zZW50OworfTsKKworLyoqCisgKiBGcmVlIGEgU0xBTSByZXF1ZXN0CisgKgorICogQHYgcmVmY250CQlSZWZlcmVuY2UgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBzbGFtX2ZyZWUgKCBzdHJ1Y3QgcmVmY250ICpyZWZjbnQgKSB7CisJc3RydWN0IHNsYW1fcmVxdWVzdCAqc2xhbSA9CisJCWNvbnRhaW5lcl9vZiAoIHJlZmNudCwgc3RydWN0IHNsYW1fcmVxdWVzdCwgcmVmY250ICk7CisKKwliaXRtYXBfZnJlZSAoICZzbGFtLT5iaXRtYXAgKTsKKwlmcmVlICggc2xhbSApOworfQorCisvKioKKyAqIE1hcmsgU0xBTSByZXF1ZXN0IGFzIGNvbXBsZXRlCisgKgorICogQHYgc2xhbQkJU0xBTSByZXF1ZXN0CisgKiBAdiByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIHNsYW1fZmluaXNoZWQgKCBzdHJ1Y3Qgc2xhbV9yZXF1ZXN0ICpzbGFtLCBpbnQgcmMgKSB7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2xhbV9kaXNjb25uZWN0W10gPSB7IDAgfTsKKworCURCR0MgKCBzbGFtLCAiU0xBTSAlcCBmaW5pc2hlZCB3aXRoIHN0YXR1cyBjb2RlICVkICglcylcbiIsCisJICAgICAgIHNsYW0sIHJjLCBzdHJlcnJvciAoIHJjICkgKTsKKworCS8qIFNlbmQgYSBkaXNjb25uZWN0IG1lc3NhZ2UgaWYgd2UgZXZlciBzZW50IGFueXRoaW5nIHRvIHRoZQorCSAqIHNlcnZlci4KKwkgKi8KKwlpZiAoIHNsYW0tPm5hY2tfc2VudCApIHsKKwkJeGZlcl9kZWxpdmVyX3JhdyAoICZzbGFtLT5zb2NrZXQsIHNsYW1fZGlzY29ubmVjdCwKKwkJCQkgICBzaXplb2YgKCBzbGFtX2Rpc2Nvbm5lY3QgKSApOworCX0KKworCS8qIFN0b3AgdGhlIHJldHJ5IHRpbWVycyAqLworCXN0b3BfdGltZXIgKCAmc2xhbS0+bWFzdGVyX3RpbWVyICk7CisJc3RvcF90aW1lciAoICZzbGFtLT5zbGF2ZV90aW1lciApOworCisJLyogQ2xvc2UgYWxsIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlcyAqLworCXhmZXJfbnVsbGlmeSAoICZzbGFtLT5zb2NrZXQgKTsKKwl4ZmVyX2Nsb3NlICggJnNsYW0tPnNvY2tldCwgcmMgKTsKKwl4ZmVyX251bGxpZnkgKCAmc2xhbS0+bWNfc29ja2V0ICk7CisJeGZlcl9jbG9zZSAoICZzbGFtLT5tY19zb2NrZXQsIHJjICk7CisJeGZlcl9udWxsaWZ5ICggJnNsYW0tPnhmZXIgKTsKKwl4ZmVyX2Nsb3NlICggJnNsYW0tPnhmZXIsIHJjICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVFggZGF0YXBhdGgKKyAqCisgKi8KKworLyoqCisgKiBBZGQgYSB2YXJpYWJsZS1sZW5ndGggdmFsdWUgdG8gYSBTTEFNIHBhY2tldAorICoKKyAqIEB2IHNsYW0JCVNMQU0gcmVxdWVzdAorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEB2IHZhbHVlCQlWYWx1ZSB0byBhZGQKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIEFkZHMgYSB2YXJpYWJsZS1sZW5ndGggdmFsdWUgdG8gdGhlIGVuZCBvZiBhbiBJL08gYnVmZmVyLiAgV2lsbAorICogYWx3YXlzIGxlYXZlIGF0IGxlYXN0IG9uZSBieXRlIG9mIHRhaWxyb29tIGluIHRoZSBJL08gYnVmZmVyICh0bworICogYWxsb3cgc3BhY2UgZm9yIHRoZSB0ZXJtaW5hdGluZyBOVUwpLgorICovCitzdGF0aWMgaW50IHNsYW1fcHV0X3ZhbHVlICggc3RydWN0IHNsYW1fcmVxdWVzdCAqc2xhbSwKKwkJCSAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwgdW5zaWduZWQgbG9uZyB2YWx1ZSApIHsKKwl1aW50OF90ICpkYXRhOworCXNpemVfdCBsZW47CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBDYWxjdWxhdGUgdmFyaWFibGUgbGVuZ3RoIHJlcXVpcmVkIHRvIHN0b3JlIHZhbHVlLiAgQWx3YXlzCisJICogbGVhdmUgYXQgbGVhc3Qgb25lIGJ5dGUgaW4gdGhlIEkvTyBidWZmZXIuCisJICovCisJbGVuID0gKCAoIGZsc2wgKCB2YWx1ZSApICsgMTAgKSAvIDggKTsKKwlpZiAoIGxlbiA+PSBpb2JfdGFpbHJvb20gKCBpb2J1ZiApICkgeworCQlEQkdDMiAoIHNsYW0sICJTTEFNICVwIGNhbm5vdCBhZGQgJXpkLWJ5dGUgdmFsdWVcbiIsCisJCQlzbGFtLCBsZW4gKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwkvKiBUaGVyZSBpcyBubyB2YWxpZCB3YXkgd2l0aGluIHRoZSBwcm90b2NvbCB0aGF0IHdlIGNhbiBlbmQKKwkgKiB1cCB0cnlpbmcgdG8gcHVzaCBhIGZ1bGwtc2l6ZWQgbG9uZyAoaS5lLiB3aXRob3V0IHNwYWNlIGZvcgorCSAqIHRoZSBsZW5ndGggZW5jb2RpbmcpLgorCSAqLworCWFzc2VydCAoIGxlbiA8PSBzaXplb2YgKCB2YWx1ZSApICk7CisKKwkvKiBBZGQgdmFsdWUgKi8KKwlkYXRhID0gaW9iX3B1dCAoIGlvYnVmLCBsZW4gKTsKKwlmb3IgKCBpID0gbGVuIDsgaS0tIDsgKSB7CisJCWRhdGFbaV0gPSB2YWx1ZTsKKwkJdmFsdWUgPj49IDg7CisJfQorCSpkYXRhIHw9ICggbGVuIDw8IDUgKTsKKwlhc3NlcnQgKCB2YWx1ZSA9PSAwICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTZW5kIFNMQU0gTkFDSyBwYWNrZXQKKyAqCisgKiBAdiBzbGFtCQlTTEFNIHJlcXVlc3QKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNsYW1fdHhfbmFjayAoIHN0cnVjdCBzbGFtX3JlcXVlc3QgKnNsYW0gKSB7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9ibG9jazsKKwl1bnNpZ25lZCBsb25nIG51bV9ibG9ja3M7CisJdWludDhfdCAqbnVsOworCWludCByYzsKKworCS8qIE1hcmsgTkFDSyBhcyBzZW50LCBzbyB0aGF0IHdlIGtub3cgd2UgaGF2ZSB0byBkaXNjb25uZWN0IGxhdGVyICovCisJc2xhbS0+bmFja19zZW50ID0gMTsKKworCS8qIEFsbG9jYXRlIEkvTyBidWZmZXIgKi8KKwlpb2J1ZiA9IHhmZXJfYWxsb2NfaW9iICggJnNsYW0tPnNvY2tldCwJU0xBTV9NQVhfTkFDS19MRU4gKTsKKwlpZiAoICEgaW9idWYgKSB7CisJCURCR0MgKCBzbGFtLCAiU0xBTSAlcCBjb3VsZCBub3QgYWxsb2NhdGUgSS9PIGJ1ZmZlclxuIiwKKwkJICAgICAgIHNsYW0gKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogQ29uc3RydWN0IE5BQ0suICBXZSBhbHdheXMgcmVxdWVzdCBvbmx5IGEgc2luZ2xlIHBhY2tldDsKKwkgKiB0aGlzIGFsbG93cyB1cyB0byBmb3JjZSBtdWx0aWNhc3QtVEZUUC1zdHlsZSBmbG93IGNvbnRyb2wKKwkgKiBvbiB0aGUgU0xBTSBzZXJ2ZXIsIHdoaWNoIHdpbGwgb3RoZXJ3aXNlIGp1c3QgYmxhc3QgdGhlCisJICogZGF0YSBvdXQgYXMgZmFzdCBhcyBpdCBjYW4uICBPbiBhIGdpZ2FiaXQgbmV0d29yaywgd2l0aG91dAorCSAqIFJYIGNoZWNrc3VtbWluZywgdGhpcyB3b3VsZCBpbmV2aXRhYmx5IGNhdXNlIHBhY2tldCBkcm9wcy4KKwkgKi8KKwlmaXJzdF9ibG9jayA9IGJpdG1hcF9maXJzdF9nYXAgKCAmc2xhbS0+Yml0bWFwICk7CisJZm9yICggbnVtX2Jsb2NrcyA9IDEgOyA7IG51bV9ibG9ja3MrKyApIHsKKwkJaWYgKCBudW1fYmxvY2tzID49IFNMQU1fTUFYX0JMT0NLU19QRVJfTkFDSyApCisJCQlicmVhazsKKwkJaWYgKCAoIGZpcnN0X2Jsb2NrICsgbnVtX2Jsb2NrcyApID49IHNsYW0tPm51bV9ibG9ja3MgKQorCQkJYnJlYWs7CisJCWlmICggYml0bWFwX3Rlc3QgKCAmc2xhbS0+Yml0bWFwLAorCQkJCSAgICggZmlyc3RfYmxvY2sgKyBudW1fYmxvY2tzICkgKSApCisJCQlicmVhazsKKwl9CisJaWYgKCBmaXJzdF9ibG9jayApIHsKKwkJREJHQ1AgKCBzbGFtLCAiU0xBTSAlcCB0cmFuc21pdHRpbmcgTkFDSyBmb3IgYmxvY2tzICIKKwkJCSIlbGQtJWxkXG4iLCBzbGFtLCBmaXJzdF9ibG9jaywKKwkJCSggZmlyc3RfYmxvY2sgKyBudW1fYmxvY2tzIC0gMSApICk7CisJfSBlbHNlIHsKKwkJREJHQyAoIHNsYW0sICJTTEFNICVwIHRyYW5zbWl0dGluZyBpbml0aWFsIE5BQ0sgZm9yIGJsb2NrcyAiCisJCSAgICAgICAiMC0lbGRcbiIsIHNsYW0sICggbnVtX2Jsb2NrcyAtIDEgKSApOworCX0KKwlpZiAoICggcmMgPSBzbGFtX3B1dF92YWx1ZSAoIHNsYW0sIGlvYnVmLCBmaXJzdF9ibG9jayApICkgIT0gMCApCisJCXJldHVybiByYzsKKwlpZiAoICggcmMgPSBzbGFtX3B1dF92YWx1ZSAoIHNsYW0sIGlvYnVmLCBudW1fYmxvY2tzICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCW51bCA9IGlvYl9wdXQgKCBpb2J1ZiwgMSApOworCSpudWwgPSAwOworCisJLyogVHJhbnNtaXQgcGFja2V0ICovCisJcmV0dXJuIHhmZXJfZGVsaXZlcl9pb2IgKCAmc2xhbS0+c29ja2V0LCBpb2J1ZiApOworfQorCisvKioKKyAqIEhhbmRsZSBTTEFNIG1hc3RlciBjbGllbnQgcmV0cnkgdGltZXIgZXhwaXJ5CisgKgorICogQHYgdGltZXIJCU1hc3RlciByZXRyeSB0aW1lcgorICogQHYgZmFpbAkJRmFpbHVyZSBpbmRpY2F0b3IKKyAqLworc3RhdGljIHZvaWQgc2xhbV9tYXN0ZXJfdGltZXJfZXhwaXJlZCAoIHN0cnVjdCByZXRyeV90aW1lciAqdGltZXIsCisJCQkJCWludCBmYWlsICkgeworCXN0cnVjdCBzbGFtX3JlcXVlc3QgKnNsYW0gPQorCQljb250YWluZXJfb2YgKCB0aW1lciwgc3RydWN0IHNsYW1fcmVxdWVzdCwgbWFzdGVyX3RpbWVyICk7CisKKwlpZiAoIGZhaWwgKSB7CisJCS8qIEFsbG93IHRpbWVyIHRvIHN0b3AgcnVubmluZy4gIFdlIHdpbGwgdGVybWluYXRlIHRoZQorCQkgKiBjb25uZWN0aW9uIG9ubHkgaWYgdGhlIHNsYXZlIHRpbWVyIHRpbWVzIG91dC4KKwkJICovCisJCURCR0MgKCBzbGFtLCAiU0xBTSAlcCBnaXZpbmcgdXAgYWN0aW5nIGFzIG1hc3RlciBjbGllbnRcbiIsCisJCSAgICAgICBzbGFtICk7CisJfSBlbHNlIHsKKwkJLyogUmV0cmFuc21pdCBOQUNLICovCisJCXN0YXJ0X3RpbWVyICggdGltZXIgKTsKKwkJc2xhbV90eF9uYWNrICggc2xhbSApOworCX0KK30KKworLyoqCisgKiBIYW5kbGUgU0xBTSBzbGF2ZSBjbGllbnQgcmV0cnkgdGltZXIgZXhwaXJ5CisgKgorICogQHYgdGltZXIJCU1hc3RlciByZXRyeSB0aW1lcgorICogQHYgZmFpbAkJRmFpbHVyZSBpbmRpY2F0b3IKKyAqLworc3RhdGljIHZvaWQgc2xhbV9zbGF2ZV90aW1lcl9leHBpcmVkICggc3RydWN0IHJldHJ5X3RpbWVyICp0aW1lciwKKwkJCQkJaW50IGZhaWwgKSB7CisJc3RydWN0IHNsYW1fcmVxdWVzdCAqc2xhbSA9CisJCWNvbnRhaW5lcl9vZiAoIHRpbWVyLCBzdHJ1Y3Qgc2xhbV9yZXF1ZXN0LCBzbGF2ZV90aW1lciApOworCisJaWYgKCBmYWlsICkgeworCQkvKiBUZXJtaW5hdGUgY29ubmVjdGlvbiAqLworCQlzbGFtX2ZpbmlzaGVkICggc2xhbSwgLUVUSU1FRE9VVCApOworCX0gZWxzZSB7CisJCS8qIFRyeSBzZW5kaW5nIGEgTkFDSyAqLworCQlEQkdDICggc2xhbSwgIlNMQU0gJXAgdHJ5aW5nIHRvIGJlY29tZSBtYXN0ZXIgY2xpZW50XG4iLAorCQkgICAgICAgc2xhbSApOworCQlzdGFydF90aW1lciAoIHRpbWVyICk7CisJCXNsYW1fdHhfbmFjayAoIHNsYW0gKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUlggZGF0YXBhdGgKKyAqCisgKi8KKworLyoqCisgKiBSZWFkIGFuZCBzdHJpcCBhIHZhcmlhYmxlLWxlbmd0aCB2YWx1ZSBmcm9tIGEgU0xBTSBwYWNrZXQKKyAqCisgKiBAdiBzbGFtCQlTTEFNIHJlcXVlc3QKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiB2YWx1ZQkJVmFsdWUgdG8gZmlsbCBpbiwgb3IgTlVMTCB0byBpZ25vcmUgdmFsdWUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFJlYWRzIGEgdmFyaWFibGUtbGVuZ3RoIHZhbHVlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBJL08gYnVmZmVyLiAgCisgKi8KK3N0YXRpYyBpbnQgc2xhbV9wdWxsX3ZhbHVlICggc3RydWN0IHNsYW1fcmVxdWVzdCAqc2xhbSwKKwkJCSAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlICkgeworCXVpbnQ4X3QgKmRhdGE7CisJc2l6ZV90IGxlbjsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggaW9iX2xlbiAoIGlvYnVmICkgPT0gMCApIHsKKwkJREJHQyAoIHNsYW0sICJTTEFNICVwIGVtcHR5IHZhbHVlXG4iLCBzbGFtICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFJlYWQgYW5kIHZlcmlmeSBsZW5ndGggb2YgdmFsdWUgKi8KKwlkYXRhID0gaW9idWYtPmRhdGE7CisJbGVuID0gKCAqZGF0YSA+PiA1ICk7CisJaWYgKCAoIGxlbiA9PSAwICkgfHwKKwkgICAgICggdmFsdWUgJiYgKCBsZW4gPiBzaXplb2YgKCAqdmFsdWUgKSApICkgKSB7CisJCURCR0MgKCBzbGFtLCAiU0xBTSAlcCBpbnZhbGlkIHZhbHVlIGxlbmd0aCAlemQgYnl0ZXNcbiIsCisJCSAgICAgICBzbGFtLCBsZW4gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICggbGVuID4gaW9iX2xlbiAoIGlvYnVmICkgKSB7CisJCURCR0MgKCBzbGFtLCAiU0xBTSAlcCB2YWx1ZSBleHRlbmRzIGJleW9uZCBJL08gYnVmZmVyXG4iLAorCQkgICAgICAgc2xhbSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBSZWFkIHZhbHVlICovCisJaW9iX3B1bGwgKCBpb2J1ZiwgbGVuICk7CisJKnZhbHVlID0gKCAqZGF0YSAmIDB4MWYgKTsKKwl3aGlsZSAoIC0tbGVuICkgeworCQkqdmFsdWUgPDw9IDg7CisJCSp2YWx1ZSB8PSAqKCsrZGF0YSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZCBhbmQgc3RyaXAgU0xBTSBoZWFkZXIKKyAqCisgKiBAdiBzbGFtCQlTTEFNIHJlcXVlc3QKKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBzbGFtX3B1bGxfaGVhZGVyICggc3RydWN0IHNsYW1fcmVxdWVzdCAqc2xhbSwKKwkJCSAgICAgIHN0cnVjdCBpb19idWZmZXIgKmlvYnVmICkgeworCXZvaWQgKmhlYWRlciA9IGlvYnVmLT5kYXRhOworCWludCByYzsKKworCS8qIElmIGhlYWRlciBtYXRjaGVzIGNhY2hlZCBoZWFkZXIsIGp1c3QgcHVsbCBpdCBhbmQgcmV0dXJuICovCisJaWYgKCAoIHNsYW0tPmhlYWRlcl9sZW4gPD0gaW9iX2xlbiAoIGlvYnVmICkgKSAmJgorCSAgICAgKCBtZW1jbXAgKCBzbGFtLT5oZWFkZXIsIGlvYnVmLT5kYXRhLCBzbGFtLT5oZWFkZXJfbGVuICkgPT0gMCApKXsKKwkJaW9iX3B1bGwgKCBpb2J1Ziwgc2xhbS0+aGVhZGVyX2xlbiApOworCQlyZXR1cm4gMDsKKwl9CisKKwlEQkdDICggc2xhbSwgIlNMQU0gJXAgZGV0ZWN0ZWQgY2hhbmdlZCBoZWFkZXI7IHJlc2V0dGluZ1xuIiwgc2xhbSApOworCisJLyogUmVhZCBhbmQgc3RyaXAgdHJhbnNhY3Rpb24gSUQsIHRvdGFsIG51bWJlciBvZiBieXRlcywgYW5kCisJICogYmxvY2sgc2l6ZS4KKwkgKi8KKwlpZiAoICggcmMgPSBzbGFtX3B1bGxfdmFsdWUgKCBzbGFtLCBpb2J1ZiwgTlVMTCApICkgIT0gMCApCisJCXJldHVybiByYzsKKwlpZiAoICggcmMgPSBzbGFtX3B1bGxfdmFsdWUgKCBzbGFtLCBpb2J1ZiwKKwkJCQkgICAgICAmc2xhbS0+dG90YWxfYnl0ZXMgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisJaWYgKCAoIHJjID0gc2xhbV9wdWxsX3ZhbHVlICggc2xhbSwgaW9idWYsCisJCQkJICAgICAgJnNsYW0tPmJsb2NrX3NpemUgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBVcGRhdGUgdGhlIGNhY2hlZCBoZWFkZXIgKi8KKwlzbGFtLT5oZWFkZXJfbGVuID0gKCBpb2J1Zi0+ZGF0YSAtIGhlYWRlciApOworCWFzc2VydCAoIHNsYW0tPmhlYWRlcl9sZW4gPD0gc2l6ZW9mICggc2xhbS0+aGVhZGVyICkgKTsKKwltZW1jcHkgKCBzbGFtLT5oZWFkZXIsIGhlYWRlciwgc2xhbS0+aGVhZGVyX2xlbiApOworCisJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgKi8KKwlzbGFtLT5udW1fYmxvY2tzID0gKCAoIHNsYW0tPnRvdGFsX2J5dGVzICsgc2xhbS0+YmxvY2tfc2l6ZSAtIDEgKSAvCisJCQkgICAgIHNsYW0tPmJsb2NrX3NpemUgKTsKKworCURCR0MgKCBzbGFtLCAiU0xBTSAlcCBoYXMgdG90YWwgYnl0ZXMgJWxkLCBibG9jayBzaXplICVsZCwgbnVtICIKKwkgICAgICAgImJsb2NrcyAlbGRcbiIsIHNsYW0sIHNsYW0tPnRvdGFsX2J5dGVzLCBzbGFtLT5ibG9ja19zaXplLAorCSAgICAgICBzbGFtLT5udW1fYmxvY2tzICk7CisKKwkvKiBEaXNjYXJkIGFuZCByZXNldCB0aGUgYml0bWFwICovCisJYml0bWFwX2ZyZWUgKCAmc2xhbS0+Yml0bWFwICk7CisJbWVtc2V0ICggJnNsYW0tPmJpdG1hcCwgMCwgc2l6ZW9mICggc2xhbS0+Yml0bWFwICkgKTsKKworCS8qIEFsbG9jYXRlIGEgbmV3IGJpdG1hcCAqLworCWlmICggKCByYyA9IGJpdG1hcF9yZXNpemUgKCAmc2xhbS0+Yml0bWFwLAorCQkJCSAgICBzbGFtLT5udW1fYmxvY2tzICkgKSAhPSAwICkgeworCQkvKiBGYWlsdXJlIHRvIGFsbG9jYXRlIGEgYml0bWFwIGlzIGZhdGFsICovCisJCURCR0MgKCBzbGFtLCAiU0xBTSAlcCBjb3VsZCBub3QgYWxsb2NhdGUgYml0bWFwIGZvciAlbGQgIgorCQkgICAgICAgImJsb2NrczogJXNcbiIsIHNsYW0sIHNsYW0tPm51bV9ibG9ja3MsCisJCSAgICAgICBzdHJlcnJvciAoIHJjICkgKTsKKwkJc2xhbV9maW5pc2hlZCAoIHNsYW0sIHJjICk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBOb3RpZnkgcmVjaXBpZW50IG9mIGZpbGUgc2l6ZSAqLworCXhmZXJfc2VlayAoICZzbGFtLT54ZmVyLCBzbGFtLT50b3RhbF9ieXRlcywgU0VFS19TRVQgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlY2VpdmUgU0xBTSBkYXRhIHBhY2tldAorICoKKyAqIEB2IG1jX3NvY2tldAkJU0xBTSBtdWx0aWNhc3Qgc29ja2V0CisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc2xhbV9tY19zb2NrZXRfZGVsaXZlciAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqbWNfc29ja2V0LAorCQkJCSAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCQkgICAgc3RydWN0IHhmZXJfbWV0YWRhdGEgKnJ4X21ldGEgX191bnVzZWQgKSB7CisJc3RydWN0IHNsYW1fcmVxdWVzdCAqc2xhbSA9CisJCWNvbnRhaW5lcl9vZiAoIG1jX3NvY2tldCwgc3RydWN0IHNsYW1fcmVxdWVzdCwgbWNfc29ja2V0ICk7CisJc3RydWN0IHhmZXJfbWV0YWRhdGEgbWV0YTsKKwl1bnNpZ25lZCBsb25nIHBhY2tldDsKKwlzaXplX3QgbGVuOworCWludCByYzsKKworCS8qIFN0b3AgdGhlIG1hc3RlciBjbGllbnQgdGltZXIuICBSZXN0YXJ0IHRoZSBzbGF2ZSBjbGllbnQgdGltZXIuICovCisJc3RvcF90aW1lciAoICZzbGFtLT5tYXN0ZXJfdGltZXIgKTsKKwlzdG9wX3RpbWVyICggJnNsYW0tPnNsYXZlX3RpbWVyICk7CisJc3RhcnRfdGltZXJfZml4ZWQgKCAmc2xhbS0+c2xhdmVfdGltZXIsIFNMQU1fU0xBVkVfVElNRU9VVCApOworCisJLyogUmVhZCBhbmQgc3RyaXAgcGFja2V0IGhlYWRlciAqLworCWlmICggKCByYyA9IHNsYW1fcHVsbF9oZWFkZXIgKCBzbGFtLCBpb2J1ZiApICkgIT0gMCApCisJCWdvdG8gZXJyX2Rpc2NhcmQ7CisKKwkvKiBSZWFkIGFuZCBzdHJpcCBwYWNrZXQgbnVtYmVyICovCisJaWYgKCAoIHJjID0gc2xhbV9wdWxsX3ZhbHVlICggc2xhbSwgaW9idWYsICZwYWNrZXQgKSApICE9IDAgKQorCQlnb3RvIGVycl9kaXNjYXJkOworCisJLyogU2FuaXR5IGNoZWNrIHBhY2tldCBudW1iZXIgKi8KKwlpZiAoIHBhY2tldCA+PSBzbGFtLT5udW1fYmxvY2tzICkgeworCQlEQkdDICggc2xhbSwgIlNMQU0gJXAgcmVjZWl2ZWQgb3V0LW9mLXJhbmdlIHBhY2tldCAlbGQgIgorCQkgICAgICAgIihudW1fYmxvY2tzPSVsZClcbiIsIHNsYW0sIHBhY2tldCwgc2xhbS0+bnVtX2Jsb2NrcyApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2Rpc2NhcmQ7CisJfQorCisJLyogU2FuaXR5IGNoZWNrIGxlbmd0aCAqLworCWxlbiA9IGlvYl9sZW4gKCBpb2J1ZiApOworCWlmICggbGVuID4gc2xhbS0+YmxvY2tfc2l6ZSApIHsKKwkJREJHQyAoIHNsYW0sICJTTEFNICVwIHJlY2VpdmVkIG92ZXJzaXplIHBhY2tldCBvZiAlemQgYnl0ZXMgIgorCQkgICAgICAgIihibG9ja19zaXplPSVsZClcbiIsIHNsYW0sIGxlbiwgc2xhbS0+YmxvY2tfc2l6ZSApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2Rpc2NhcmQ7CisJfQorCWlmICggKCBwYWNrZXQgIT0gKCBzbGFtLT5udW1fYmxvY2tzIC0gMSApICkgJiYKKwkgICAgICggbGVuIDwgc2xhbS0+YmxvY2tfc2l6ZSApICkgeworCQlEQkdDICggc2xhbSwgIlNMQU0gJXAgcmVjZWl2ZWQgc2hvcnQgcGFja2V0IG9mICV6ZCBieXRlcyAiCisJCSAgICAgICAiKGJsb2NrX3NpemU9JWxkKVxuIiwgc2xhbSwgbGVuLCBzbGFtLT5ibG9ja19zaXplICk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfZGlzY2FyZDsKKwl9CisKKwkvKiBJZiB3ZSBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIHBhY2tldCwgZGlzY2FyZCBpdCAqLworCWlmICggYml0bWFwX3Rlc3QgKCAmc2xhbS0+Yml0bWFwLCBwYWNrZXQgKSApIHsKKwkJZ290byBkaXNjYXJkOworCX0KKworCS8qIFBhc3MgdG8gcmVjaXBpZW50ICovCisJbWVtc2V0ICggJm1ldGEsIDAsIHNpemVvZiAoIG1ldGEgKSApOworCW1ldGEud2hlbmNlID0gU0VFS19TRVQ7CisJbWV0YS5vZmZzZXQgPSAoIHBhY2tldCAqIHNsYW0tPmJsb2NrX3NpemUgKTsKKwlpZiAoICggcmMgPSB4ZmVyX2RlbGl2ZXJfaW9iX21ldGEgKCAmc2xhbS0+eGZlciwgaW9idWYsCisJCQkJCSAgICAmbWV0YSApICkgIT0gMCApCisJCWdvdG8gZXJyOworCisJLyogTWFyayBibG9jayBhcyByZWNlaXZlZCAqLworCWJpdG1hcF9zZXQgKCAmc2xhbS0+Yml0bWFwLCBwYWNrZXQgKTsKKworCS8qIElmIHdlIGhhdmUgcmVjZWl2ZWQgYWxsIGJsb2NrcywgdGVybWluYXRlICovCisJaWYgKCBiaXRtYXBfZnVsbCAoICZzbGFtLT5iaXRtYXAgKSApCisJCXNsYW1fZmluaXNoZWQgKCBzbGFtLCAwICk7CisKKwlyZXR1cm4gMDsKKworIGVycl9kaXNjYXJkOgorIGRpc2NhcmQ6CisJZnJlZV9pb2IgKCBpb2J1ZiApOworIGVycjoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVjZWl2ZSBTTEFNIG5vbi1kYXRhIHBhY2tldAorICoKKyAqIEB2IHNvY2tldAkJU0xBTSB1bmljYXN0IHNvY2tldAorICogQHYgaW9idWYJCUkvTyBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHNsYW1fc29ja2V0X2RlbGl2ZXIgKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnNvY2tldCwKKwkJCQkgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCQkJIHN0cnVjdCB4ZmVyX21ldGFkYXRhICpyeF9tZXRhIF9fdW51c2VkICkgeworCXN0cnVjdCBzbGFtX3JlcXVlc3QgKnNsYW0gPQorCQljb250YWluZXJfb2YgKCBzb2NrZXQsIHN0cnVjdCBzbGFtX3JlcXVlc3QsIHNvY2tldCApOworCWludCByYzsKKworCS8qIFJlc3RhcnQgdGhlIG1hc3RlciBjbGllbnQgdGltZXIgKi8KKwlzdG9wX3RpbWVyICggJnNsYW0tPm1hc3Rlcl90aW1lciApOworCXN0YXJ0X3RpbWVyICggJnNsYW0tPm1hc3Rlcl90aW1lciApOworCisJLyogUmVhZCBhbmQgc3RyaXAgcGFja2V0IGhlYWRlciAqLworCWlmICggKCByYyA9IHNsYW1fcHVsbF9oZWFkZXIgKCBzbGFtLCBpb2J1ZiApICkgIT0gMCApCisJCWdvdG8gZGlzY2FyZDsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggaW9iX2xlbiAoIGlvYnVmICkgIT0gMCApIHsKKwkJREJHQyAoIHNsYW0sICJTTEFNICVwIHJlY2VpdmVkIHRyYWlsaW5nIGdhcmJhZ2U6XG4iLCBzbGFtICk7CisJCURCR0NfSEQgKCBzbGFtLCBpb2J1Zi0+ZGF0YSwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRpc2NhcmQ7CisJfQorCisJLyogRGlzY2FyZCBwYWNrZXQgKi8KKwlmcmVlX2lvYiAoIGlvYnVmICk7CisKKwkvKiBTZW5kIE5BQ0sgaW4gcmVwbHkgKi8KKwlzbGFtX3R4X25hY2sgKCBzbGFtICk7CisKKwlyZXR1cm4gMDsKKworIGRpc2NhcmQ6CisJZnJlZV9pb2IgKCBpb2J1ZiApOworCXJldHVybiByYzsKKworfQorCisvKioKKyAqIENsb3NlIFNMQU0gdW5pY2FzdCBzb2NrZXQKKyAqCisgKiBAdiBzb2NrZXQJCVNMQU0gdW5pY2FzdCBzb2NrZXQKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIHNsYW1fc29ja2V0X2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICpzb2NrZXQsIGludCByYyApIHsKKwlzdHJ1Y3Qgc2xhbV9yZXF1ZXN0ICpzbGFtID0KKwkJY29udGFpbmVyX29mICggc29ja2V0LCBzdHJ1Y3Qgc2xhbV9yZXF1ZXN0LCBzb2NrZXQgKTsKKworCURCR0MgKCBzbGFtLCAiU0xBTSAlcCB1bmljYXN0IHNvY2tldCBjbG9zZWQ6ICVzXG4iLAorCSAgICAgICBzbGFtLCBzdHJlcnJvciAoIHJjICkgKTsKKworCXNsYW1fZmluaXNoZWQgKCBzbGFtLCByYyApOworfQorCisvKiogU0xBTSB1bmljYXN0IHNvY2tldCBkYXRhIHRyYW5zZmVyIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBzbGFtX3NvY2tldF9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSBzbGFtX3NvY2tldF9jbG9zZSwKKwkudnJlZGlyZWN0CT0geGZlcl92cmVvcGVuLAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHNsYW1fc29ja2V0X2RlbGl2ZXIsCisJLmRlbGl2ZXJfcmF3CT0geGZlcl9kZWxpdmVyX2FzX2lvYiwKK307CisKKy8qKgorICogQ2xvc2UgU0xBTSBtdWx0aWNhc3Qgc29ja2V0CisgKgorICogQHYgbWNfc29ja2V0CQlTTEFNIG11bHRpY2FzdCBzb2NrZXQKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIHNsYW1fbWNfc29ja2V0X2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICptY19zb2NrZXQsIGludCByYyApeworCXN0cnVjdCBzbGFtX3JlcXVlc3QgKnNsYW0gPQorCQljb250YWluZXJfb2YgKCBtY19zb2NrZXQsIHN0cnVjdCBzbGFtX3JlcXVlc3QsIG1jX3NvY2tldCApOworCisJREJHQyAoIHNsYW0sICJTTEFNICVwIG11bHRpY2FzdCBzb2NrZXQgY2xvc2VkOiAlc1xuIiwKKwkgICAgICAgc2xhbSwgc3RyZXJyb3IgKCByYyApICk7CisKKwlzbGFtX2ZpbmlzaGVkICggc2xhbSwgcmMgKTsKK30KKworLyoqIFNMQU0gbXVsdGljYXN0IHNvY2tldCBkYXRhIHRyYW5zZmVyIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBzbGFtX21jX3NvY2tldF9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSBzbGFtX21jX3NvY2tldF9jbG9zZSwKKwkudnJlZGlyZWN0CT0geGZlcl92cmVvcGVuLAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHNsYW1fbWNfc29ja2V0X2RlbGl2ZXIsCisJLmRlbGl2ZXJfcmF3CT0geGZlcl9kZWxpdmVyX2FzX2lvYiwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqCisgKi8KKworLyoqCisgKiBDbG9zZSBTTEFNIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKgorICogQHYgeGZlcgkJU0xBTSBkYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgcmMJCVJlYXNvbiBmb3IgY2xvc2UKKyAqLworc3RhdGljIHZvaWQgc2xhbV94ZmVyX2Nsb3NlICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBpbnQgcmMgKSB7CisJc3RydWN0IHNsYW1fcmVxdWVzdCAqc2xhbSA9CisJCWNvbnRhaW5lcl9vZiAoIHhmZXIsIHN0cnVjdCBzbGFtX3JlcXVlc3QsIHhmZXIgKTsKKworCURCR0MgKCBzbGFtLCAiU0xBTSAlcCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBjbG9zZWQ6ICVzXG4iLAorCSAgICAgICBzbGFtLCBzdHJlcnJvciAoIHJjICkgKTsKKworCXNsYW1fZmluaXNoZWQgKCBzbGFtLCByYyApOworfQorCisvKiogU0xBTSBkYXRhIHRyYW5zZmVyIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyBzbGFtX3hmZXJfb3BlcmF0aW9ucyA9IHsKKwkuY2xvc2UJCT0gc2xhbV94ZmVyX2Nsb3NlLAorCS52cmVkaXJlY3QJPSBpZ25vcmVfeGZlcl92cmVkaXJlY3QsCisJLndpbmRvdwkJPSB1bmxpbWl0ZWRfeGZlcl93aW5kb3csCisJLmFsbG9jX2lvYgk9IGRlZmF1bHRfeGZlcl9hbGxvY19pb2IsCisJLmRlbGl2ZXJfaW9iCT0geGZlcl9kZWxpdmVyX2FzX3JhdywKKwkuZGVsaXZlcl9yYXcJPSBpZ25vcmVfeGZlcl9kZWxpdmVyX3JhdywKK307CisKKy8qKgorICogUGFyc2UgU0xBTSBVUkkgbXVsdGljYXN0IGFkZHJlc3MKKyAqCisgKiBAdiBzbGFtCQlTTEFNIHJlcXVlc3QKKyAqIEB2IHBhdGgJCVBhdGggcG9ydGlvbiBvZiB4LXNsYW06Ly8gVVJJCisgKiBAdiBhZGRyZXNzCQlTb2NrZXQgYWRkcmVzcyB0byBmaWxsIGluCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCBzbGFtX3BhcnNlX211bHRpY2FzdF9hZGRyZXNzICggc3RydWN0IHNsYW1fcmVxdWVzdCAqc2xhbSwKKwkJCQkJICBjb25zdCBjaGFyICpwYXRoLAorCQkJCQkgIHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcmVzcyApIHsKKwljaGFyIHBhdGhfZHVwWyBzdHJsZW4gKCBwYXRoICkgLyogbm8gKzEgKi8gXTsKKwljaGFyICpzZXA7CisJY2hhciAqZW5kOworCisJLyogQ3JlYXRlIHRlbXBvcmFyeSBjb3B5IG9mIHBhdGgsIG1pbnVzIHRoZSBsZWFkaW5nICcvJyAqLworCWFzc2VydCAoICpwYXRoID09ICcvJyApOworCW1lbWNweSAoIHBhdGhfZHVwLCAoIHBhdGggKyAxICkgLCBzaXplb2YgKCBwYXRoX2R1cCApICk7CisKKwkvKiBQYXJzZSBwb3J0LCBpZiBwcmVzZW50ICovCisJc2VwID0gc3RyY2hyICggcGF0aF9kdXAsICc6JyApOworCWlmICggc2VwICkgeworCQkqKHNlcCsrKSA9ICdcMCc7CisJCWFkZHJlc3MtPnNpbl9wb3J0ID0gaHRvbnMgKCBzdHJ0b3VsICggc2VwLCAmZW5kLCAwICkgKTsKKwkJaWYgKCAqZW5kICE9ICdcMCcgKSB7CisJCQlEQkdDICggc2xhbSwgIlNMQU0gJXAgaW52YWxpZCBtdWx0aWNhc3QgcG9ydCAiCisJCQkgICAgICAgIlwiJXNcIlxuIiwgc2xhbSwgc2VwICk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIFBhcnNlIGFkZHJlc3MgKi8KKwlpZiAoIGluZXRfYXRvbiAoIHBhdGhfZHVwLCAmYWRkcmVzcy0+c2luX2FkZHIgKSA9PSAwICkgeworCQlEQkdDICggc2xhbSwgIlNMQU0gJXAgaW52YWxpZCBtdWx0aWNhc3QgYWRkcmVzcyBcIiVzXCJcbiIsCisJCSAgICAgICBzbGFtLCBwYXRoX2R1cCApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBJbml0aWF0ZSBhIFNMQU0gcmVxdWVzdAorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiB1cmkJCVVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgc2xhbV9vcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBzdHJ1Y3QgdXJpICp1cmkgKSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiBkZWZhdWx0X211bHRpY2FzdCA9IHsKKwkJLnNpbl9mYW1pbHkgPSBBRl9JTkVULAorCQkuc2luX3BvcnQgPSBodG9ucyAoIFNMQU1fREVGQVVMVF9NVUxUSUNBU1RfUE9SVCApLAorCQkuc2luX2FkZHIgPSB7IGh0b25sICggU0xBTV9ERUZBVUxUX01VTFRJQ0FTVF9JUCApIH0sCisJfTsKKwlzdHJ1Y3Qgc2xhbV9yZXF1ZXN0ICpzbGFtOworCXN0cnVjdCBzb2NrYWRkcl90Y3BpcCBzZXJ2ZXI7CisJc3RydWN0IHNvY2thZGRyX2luIG11bHRpY2FzdDsKKwlpbnQgcmM7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCAhIHVyaS0+aG9zdCApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQWxsb2NhdGUgYW5kIHBvcHVsYXRlIHN0cnVjdHVyZSAqLworCXNsYW0gPSB6YWxsb2MgKCBzaXplb2YgKCAqc2xhbSApICk7CisJaWYgKCAhIHNsYW0gKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzbGFtLT5yZWZjbnQuZnJlZSA9IHNsYW1fZnJlZTsKKwl4ZmVyX2luaXQgKCAmc2xhbS0+eGZlciwgJnNsYW1feGZlcl9vcGVyYXRpb25zLCAmc2xhbS0+cmVmY250ICk7CisJeGZlcl9pbml0ICggJnNsYW0tPnNvY2tldCwgJnNsYW1fc29ja2V0X29wZXJhdGlvbnMsICZzbGFtLT5yZWZjbnQgKTsKKwl4ZmVyX2luaXQgKCAmc2xhbS0+bWNfc29ja2V0LCAmc2xhbV9tY19zb2NrZXRfb3BlcmF0aW9ucywKKwkJICAgICZzbGFtLT5yZWZjbnQgKTsKKwlzbGFtLT5tYXN0ZXJfdGltZXIuZXhwaXJlZCA9IHNsYW1fbWFzdGVyX3RpbWVyX2V4cGlyZWQ7CisJc2xhbS0+c2xhdmVfdGltZXIuZXhwaXJlZCA9IHNsYW1fc2xhdmVfdGltZXJfZXhwaXJlZDsKKwkvKiBGYWtlIGFuIGludmFsaWQgY2FjaGVkIGhlYWRlciBvZiB7IDB4MDAsIC4uLiB9ICovCisJc2xhbS0+aGVhZGVyX2xlbiA9IDE7CisJLyogRmFrZSBwYXJhbWV0ZXJzIGZvciBpbml0aWFsIE5BQ0sgKi8KKwlzbGFtLT5udW1fYmxvY2tzID0gMTsKKwlpZiAoICggcmMgPSBiaXRtYXBfcmVzaXplICggJnNsYW0tPmJpdG1hcCwgMSApICkgIT0gMCApIHsKKwkJREJHQyAoIHNsYW0sICJTTEFNICVwIGNvdWxkIG5vdCBhbGxvY2F0ZSBpbml0aWFsIGJpdG1hcDogIgorCQkgICAgICAgIiVzXG4iLCBzbGFtLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogT3BlbiB1bmljYXN0IHNvY2tldCAqLworCW1lbXNldCAoICZzZXJ2ZXIsIDAsIHNpemVvZiAoIHNlcnZlciApICk7CisJc2VydmVyLnN0X3BvcnQgPSBodG9ucyAoIHVyaV9wb3J0ICggdXJpLCBTTEFNX0RFRkFVTFRfUE9SVCApICk7CisJaWYgKCAoIHJjID0geGZlcl9vcGVuX25hbWVkX3NvY2tldCAoICZzbGFtLT5zb2NrZXQsIFNPQ0tfREdSQU0sCisJCQkJCSAgICAgKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZzZXJ2ZXIsCisJCQkJCSAgICAgdXJpLT5ob3N0LCBOVUxMICkgKSAhPSAwICkgeworCQlEQkdDICggc2xhbSwgIlNMQU0gJXAgY291bGQgbm90IG9wZW4gdW5pY2FzdCBzb2NrZXQ6ICVzXG4iLAorCQkgICAgICAgc2xhbSwgc3RyZXJyb3IgKCByYyApICk7CisJCWdvdG8gZXJyOworCX0KKworCS8qIE9wZW4gbXVsdGljYXN0IHNvY2tldCAqLworCW1lbWNweSAoICZtdWx0aWNhc3QsICZkZWZhdWx0X211bHRpY2FzdCwgc2l6ZW9mICggbXVsdGljYXN0ICkgKTsKKwlpZiAoIHVyaS0+cGF0aCAmJiAKKwkgICAgICggKCByYyA9IHNsYW1fcGFyc2VfbXVsdGljYXN0X2FkZHJlc3MgKCBzbGFtLCB1cmktPnBhdGgsCisJCQkJCQkgICAgICZtdWx0aWNhc3QgKSApICE9IDAgKSApIHsKKwkJZ290byBlcnI7CisJfQorCWlmICggKCByYyA9IHhmZXJfb3Blbl9zb2NrZXQgKCAmc2xhbS0+bWNfc29ja2V0LCBTT0NLX0RHUkFNLAorCQkJCSAoIHN0cnVjdCBzb2NrYWRkciAqICkgJm11bHRpY2FzdCwKKwkJCQkgKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZtdWx0aWNhc3QgKSApICE9IDAgKSB7CisJCURCR0MgKCBzbGFtLCAiU0xBTSAlcCBjb3VsZCBub3Qgb3BlbiBtdWx0aWNhc3Qgc29ja2V0OiAlc1xuIiwKKwkJICAgICAgIHNsYW0sIHN0cmVycm9yICggcmMgKSApOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBTdGFydCBzbGF2ZSByZXRyeSB0aW1lciAqLworCXN0YXJ0X3RpbWVyX2ZpeGVkICggJnNsYW0tPnNsYXZlX3RpbWVyLCBTTEFNX1NMQVZFX1RJTUVPVVQgKTsKKworCS8qIEF0dGFjaCB0byBwYXJlbnQgaW50ZXJmYWNlLCBtb3J0YWxpc2Ugc2VsZiwgYW5kIHJldHVybiAqLworCXhmZXJfcGx1Z19wbHVnICggJnNsYW0tPnhmZXIsIHhmZXIgKTsKKwlyZWZfcHV0ICggJnNsYW0tPnJlZmNudCApOworCXJldHVybiAwOworCisgZXJyOgorCXNsYW1fZmluaXNoZWQgKCBzbGFtLCByYyApOworCXJlZl9wdXQgKCAmc2xhbS0+cmVmY250ICk7CisJcmV0dXJuIHJjOworfQorCisvKiogU0xBTSBVUkkgb3BlbmVyICovCitzdHJ1Y3QgdXJpX29wZW5lciBzbGFtX3VyaV9vcGVuZXIgX191cmlfb3BlbmVyID0geworCS5zY2hlbWUJPSAieC1zbGFtIiwKKwkub3Blbgk9IHNsYW1fb3BlbiwKK307CmRpZmYgLS1naXQgYS9ncHhlL3NyYy9uZXQvdWRwL3RmdHAuYyBiL2dweGUvc3JjL25ldC91ZHAvdGZ0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTJmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy9uZXQvdWRwL3RmdHAuYwpAQCAtMCwwICsxLDEyODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z3B4ZS9yZWZjbnQuaD4KKyNpbmNsdWRlIDxncHhlL3hmZXIuaD4KKyNpbmNsdWRlIDxncHhlL29wZW4uaD4KKyNpbmNsdWRlIDxncHhlL3VyaS5oPgorI2luY2x1ZGUgPGdweGUvdGNwaXAuaD4KKyNpbmNsdWRlIDxncHhlL3JldHJ5Lmg+CisjaW5jbHVkZSA8Z3B4ZS9mZWF0dXJlcy5oPgorI2luY2x1ZGUgPGdweGUvYml0bWFwLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPGdweGUvZGhjcC5oPgorI2luY2x1ZGUgPGdweGUvdXJpLmg+CisjaW5jbHVkZSA8Z3B4ZS90ZnRwLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFRGVFAgcHJvdG9jb2wKKyAqCisgKi8KKworRkVBVFVSRSAoIEZFQVRVUkVfUFJPVE9DT0wsICJURlRQIiwgREhDUF9FQl9GRUFUVVJFX1RGVFAsIDEgKTsKKworLyogVEZUUC1zcGVjaWZpYyBlcnJvciBjb2RlcyAqLworI2RlZmluZSBFVEZUUF9JTlZBTElEX0JMS1NJWkUJRVVOSVFfMDEKKyNkZWZpbmUgRVRGVFBfSU5WQUxJRF9UU0laRQlFVU5JUV8wMgorI2RlZmluZSBFVEZUUF9NQ19OT19QT1JUCUVVTklRXzAzCisjZGVmaW5lIEVURlRQX01DX05PX01DCQlFVU5JUV8wNAorI2RlZmluZSBFVEZUUF9NQ19JTlZBTElEX01DCUVVTklRXzA1CisjZGVmaW5lIEVURlRQX01DX0lOVkFMSURfSVAJRVVOSVFfMDYKKyNkZWZpbmUgRVRGVFBfTUNfSU5WQUxJRF9QT1JUCUVVTklRXzA3CisKKy8qKgorICogQSBURlRQIHJlcXVlc3QKKyAqCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBzdGF0ZSBmb3IgYW4gb25nb2luZyBURlRQIHRyYW5zZmVyLgorICovCitzdHJ1Y3QgdGZ0cF9yZXF1ZXN0IHsKKwkvKiogUmVmZXJlbmNlIGNvdW50ICovCisJc3RydWN0IHJlZmNudCByZWZjbnQ7CisJLyoqIERhdGEgdHJhbnNmZXIgaW50ZXJmYWNlICovCisJc3RydWN0IHhmZXJfaW50ZXJmYWNlIHhmZXI7CisKKwkvKiogVVJJIGJlaW5nIGZldGNoZWQgKi8KKwlzdHJ1Y3QgdXJpICp1cmk7CisJLyoqIFRyYW5zcG9ydCBsYXllciBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Ugc29ja2V0OworCS8qKiBNdWx0aWNhc3QgdHJhbnNwb3J0IGxheWVyIGludGVyZmFjZSAqLworCXN0cnVjdCB4ZmVyX2ludGVyZmFjZSBtY19zb2NrZXQ7CisKKwkvKiogRGF0YSBibG9jayBzaXplCisJICoKKwkgKiBUaGlzIGlzIHRoZSAiYmxrc2l6ZSIgb3B0aW9uIG5lZ290aWF0ZWQgd2l0aCB0aGUgVEZUUAorCSAqIHNlcnZlci4gIChJZiB0aGUgVEZUUCBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBURlRQIG9wdGlvbnMsCisJICogdGhpcyB3aWxsIGRlZmF1bHQgdG8gNTEyKS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgYmxrc2l6ZTsKKwkvKiogRmlsZSBzaXplCisJICoKKwkgKiBUaGlzIGlzIHRoZSB2YWx1ZSByZXR1cm5lZCBpbiB0aGUgInRzaXplIiBvcHRpb24gZnJvbSB0aGUKKwkgKiBURlRQIHNlcnZlci4gIElmIHRoZSBURlRQIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZQorCSAqICJ0c2l6ZSIgb3B0aW9uLCB0aGlzIHZhbHVlIHdpbGwgYmUgemVyby4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIHRzaXplOworCQorCS8qKiBTZXJ2ZXIgcG9ydAorCSAqCisJICogVGhpcyBpcyB0aGUgcG9ydCB0byB3aGljaCBSUlEgcGFja2V0cyBhcmUgc2VudC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgcG9ydDsKKwkvKiogUGVlciBhZGRyZXNzCisJICoKKwkgKiBUaGUgcGVlciBhZGRyZXNzIGlzIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IHJlc3BvbnNlCisJICogcmVjZWl2ZWQgdG8gdGhlIFRGVFAgUlJRLgorCSAqLworCXN0cnVjdCBzb2NrYWRkcl90Y3BpcCBwZWVyOworCS8qKiBSZXF1ZXN0IGZsYWdzICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCS8qKiBNVEZUUCB0aW1lb3V0IGNvdW50ICovCisJdW5zaWduZWQgaW50IG10ZnRwX3RpbWVvdXRzOworCisJLyoqIEJsb2NrIGJpdG1hcCAqLworCXN0cnVjdCBiaXRtYXAgYml0bWFwOworCS8qKiBNYXhpbXVtIGtub3duIGxlbmd0aAorCSAqCisJICogV2UgZG9uJ3QgYWx3YXlzIGtub3cgdGhlIGZpbGUgbGVuZ3RoIGluIGFkdmFuY2UuICBJbgorCSAqIHBhcnRpY3VsYXIsIGlmIHRoZSBURlRQIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgdGhlIHRzaXplCisJICogb3B0aW9uLCBvciB3ZSBhcmUgdXNpbmcgTVRGVFAsIHRoZW4gd2UgZG9uJ3Qga25vdyB0aGUgZmlsZQorCSAqIGxlbmd0aCB1bnRpbCB3ZSBzZWUgdGhlIGVuZC1vZi1maWxlIGJsb2NrICh3aGljaCwgaW4gdGhlCisJICogY2FzZSBvZiBNVEZUUCwgbWF5IG5vdCBiZSB0aGUgbGFzdCBibG9jayB3ZSBzZWUpLgorCSAqCisJICogVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIHdoZW5ldmVyIHdlIG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dAorCSAqIHRoZSBmaWxlIGxlbmd0aC4KKwkgKi8KKwlzaXplX3QgZmlsZXNpemU7CisJLyoqIFJldHJhbnNtaXNzaW9uIHRpbWVyICovCisJc3RydWN0IHJldHJ5X3RpbWVyIHRpbWVyOworfTsKKworLyoqIFRGVFAgcmVxdWVzdCBmbGFncyAqLworZW51bSB7CisJLyoqIFNlbmQgQUNLIHBhY2tldHMgKi8KKwlURlRQX0ZMX1NFTkRfQUNLID0gMHgwMDAxLAorCS8qKiBSZXF1ZXN0IGJsa3NpemUgYW5kIHRzaXplIG9wdGlvbnMgKi8KKwlURlRQX0ZMX1JSUV9TSVpFUyA9IDB4MDAwMiwKKwkvKiogUmVxdWVzdCBtdWx0aWNhc3Qgb3B0aW9uICovCisJVEZUUF9GTF9SUlFfTVVMVElDQVNUID0gMHgwMDA0LAorCS8qKiBQZXJmb3JtIE1URlRQIHJlY292ZXJ5IG9uIHRpbWVvdXQgKi8KKwlURlRQX0ZMX01URlRQX1JFQ09WRVJZID0gMHgwMDA4LAorCS8qKiBPbmx5IGdldCBmaWxlc2l6ZSBhbmQgdGhlbiBhYm9ydCB0aGUgdHJhbnNmZXIgKi8KKwlURlRQX0ZMX1NJWkVPTkxZID0gMHgwMDEwLAorfTsKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIE1URlRQIG9wZW4gcmVxdWVzdHMgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBURlRQICovCisjZGVmaW5lIE1URlRQX01BWF9USU1FT1VUUyAzCisKKy8qKgorICogRnJlZSBURlRQIHJlcXVlc3QKKyAqCisgKiBAdiByZWZjbnQJCVJlZmVyZW5jZSBjb3VudGVyCisgKi8KK3N0YXRpYyB2b2lkIHRmdHBfZnJlZSAoIHN0cnVjdCByZWZjbnQgKnJlZmNudCApIHsKKwlzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwID0KKwkJY29udGFpbmVyX29mICggcmVmY250LCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0LCByZWZjbnQgKTsKKworCXVyaV9wdXQgKCB0ZnRwLT51cmkgKTsKKwliaXRtYXBfZnJlZSAoICZ0ZnRwLT5iaXRtYXAgKTsKKwlmcmVlICggdGZ0cCApOworfQorCisvKioKKyAqIE1hcmsgVEZUUCByZXF1ZXN0IGFzIGNvbXBsZXRlCisgKgorICogQHYgdGZ0cAkJVEZUUCBjb25uZWN0aW9uCisgKiBAdiByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyB2b2lkIHRmdHBfZG9uZSAoIHN0cnVjdCB0ZnRwX3JlcXVlc3QgKnRmdHAsIGludCByYyApIHsKKworCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCBmaW5pc2hlZCB3aXRoIHN0YXR1cyAlZCAoJXMpXG4iLAorCSAgICAgICB0ZnRwLCByYywgc3RyZXJyb3IgKCByYyApICk7CisKKwkvKiBTdG9wIHRoZSByZXRyeSB0aW1lciAqLworCXN0b3BfdGltZXIgKCAmdGZ0cC0+dGltZXIgKTsKKworCS8qIENsb3NlIGFsbCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZXMgKi8KKwl4ZmVyX251bGxpZnkgKCAmdGZ0cC0+c29ja2V0ICk7CisJeGZlcl9jbG9zZSAoICZ0ZnRwLT5zb2NrZXQsIHJjICk7CisJeGZlcl9udWxsaWZ5ICggJnRmdHAtPm1jX3NvY2tldCApOworCXhmZXJfY2xvc2UgKCAmdGZ0cC0+bWNfc29ja2V0LCByYyApOworCXhmZXJfbnVsbGlmeSAoICZ0ZnRwLT54ZmVyICk7CisJeGZlcl9jbG9zZSAoICZ0ZnRwLT54ZmVyLCByYyApOworfQorCisvKioKKyAqIFJlb3BlbiBURlRQIHNvY2tldAorICoKKyAqIEB2IHRmdHAJCVRGVFAgY29ubmVjdGlvbgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGZ0cF9yZW9wZW4gKCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwICkgeworCXN0cnVjdCBzb2NrYWRkcl90Y3BpcCBzZXJ2ZXI7CisJaW50IHJjOworCisJLyogQ2xvc2Ugc29ja2V0ICovCisJeGZlcl9jbG9zZSAoICZ0ZnRwLT5zb2NrZXQsIDAgKTsKKworCS8qIERpc2FibGUgQUNLIHNlbmRpbmcuICovCisJdGZ0cC0+ZmxhZ3MgJj0gflRGVFBfRkxfU0VORF9BQ0s7CisKKwkvKiBSZXNldCBwZWVyIGFkZHJlc3MgKi8KKwltZW1zZXQgKCAmdGZ0cC0+cGVlciwgMCwgc2l6ZW9mICggdGZ0cC0+cGVlciApICk7CisKKwkvKiBPcGVuIHNvY2tldCAqLworCW1lbXNldCAoICZzZXJ2ZXIsIDAsIHNpemVvZiAoIHNlcnZlciApICk7CisJc2VydmVyLnN0X3BvcnQgPSBodG9ucyAoIHRmdHAtPnBvcnQgKTsKKwlpZiAoICggcmMgPSB4ZmVyX29wZW5fbmFtZWRfc29ja2V0ICggJnRmdHAtPnNvY2tldCwgU09DS19ER1JBTSwKKwkJCQkJICAgICAoIHN0cnVjdCBzb2NrYWRkciAqICkgJnNlcnZlciwKKwkJCQkJICAgICB0ZnRwLT51cmktPmhvc3QsIE5VTEwgKSApICE9IDAgKSB7CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCBjb3VsZCBub3Qgb3BlbiBzb2NrZXQ6ICVzXG4iLAorCQkgICAgICAgdGZ0cCwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZW9wZW4gVEZUUCBtdWx0aWNhc3Qgc29ja2V0CisgKgorICogQHYgdGZ0cAkJVEZUUCBjb25uZWN0aW9uCisgKiBAdiBsb2NhbAkJTG9jYWwgc29ja2V0IGFkZHJlc3MKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBfcmVvcGVuX21jICggc3RydWN0IHRmdHBfcmVxdWVzdCAqdGZ0cCwKKwkJCSAgICBzdHJ1Y3Qgc29ja2FkZHIgKmxvY2FsICkgeworCWludCByYzsKKworCS8qIENsb3NlIG11bHRpY2FzdCBzb2NrZXQgKi8KKwl4ZmVyX2Nsb3NlICggJnRmdHAtPm1jX3NvY2tldCwgMCApOworCisJLyogT3BlbiBtdWx0aWNhc3Qgc29ja2V0LiAgV2UgbmV2ZXIgc2VuZCB2aWEgdGhpcyBzb2NrZXQsIHNvCisJICogdXNlIHRoZSBsb2NhbCBhZGRyZXNzIGFzIHRoZSBwZWVyIGFkZHJlc3MgKHNpbmNlIHRoZSBwZWVyCisJICogYWRkcmVzcyBjYW5ub3QgYmUgTlVMTCkuCisJICovCisJaWYgKCAoIHJjID0geGZlcl9vcGVuX3NvY2tldCAoICZ0ZnRwLT5tY19zb2NrZXQsIFNPQ0tfREdSQU0sCisJCQkJICAgICAgIGxvY2FsLCBsb2NhbCApICkgIT0gMCApIHsKKwkJREJHQyAoIHRmdHAsICJURlRQICVwIGNvdWxkIG5vdCBvcGVuIG11bHRpY2FzdCAiCisJCSAgICAgICAic29ja2V0OiAlc1xuIiwgdGZ0cCwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQcmVzaXplIFRGVFAgcmVjZWl2ZSBidWZmZXJzIGFuZCBibG9jayBiaXRtYXAKKyAqCisgKiBAdiB0ZnRwCQlURlRQIGNvbm5lY3Rpb24KKyAqIEB2IGZpbGVzaXplCQlLbm93biBtaW5pbXVtIGZpbGUgc2l6ZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGZ0cF9wcmVzaXplICggc3RydWN0IHRmdHBfcmVxdWVzdCAqdGZ0cCwgc2l6ZV90IGZpbGVzaXplICkgeworCXVuc2lnbmVkIGludCBudW1fYmxvY2tzOworCWludCByYzsKKworCS8qIERvIG5vdGhpbmcgaWYgd2UgYXJlIGFscmVhZHkgbGFyZ2UgZW5vdWdoICovCisJaWYgKCBmaWxlc2l6ZSA8PSB0ZnRwLT5maWxlc2l6ZSApCisJCXJldHVybiAwOworCisJLyogUmVjb3JkIGZpbGVzaXplICovCisJdGZ0cC0+ZmlsZXNpemUgPSBmaWxlc2l6ZTsKKworCS8qIE5vdGlmeSByZWNpcGllbnQgb2YgZmlsZSBzaXplICovCisJeGZlcl9zZWVrICggJnRmdHAtPnhmZXIsIGZpbGVzaXplLCBTRUVLX1NFVCApOworCXhmZXJfc2VlayAoICZ0ZnRwLT54ZmVyLCAwLCBTRUVLX1NFVCApOworCisJLyogQ2FsY3VsYXRlIGV4cGVjdGVkIG51bWJlciBvZiBibG9ja3MuICBOb3RlIHRoYXQgZmlsZXMgd2hvc2UKKwkgKiBsZW5ndGggaXMgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIGJsb2Nrc2l6ZSB3aWxsIGhhdmUgYQorCSAqIHRyYWlsaW5nIHplcm8tbGVuZ3RoIGJsb2NrLCB3aGljaCBtdXN0IGJlIGluY2x1ZGVkLgorCSAqLworCW51bV9ibG9ja3MgPSAoICggZmlsZXNpemUgLyB0ZnRwLT5ibGtzaXplICkgKyAxICk7CisJaWYgKCAoIHJjID0gYml0bWFwX3Jlc2l6ZSAoICZ0ZnRwLT5iaXRtYXAsIG51bV9ibG9ja3MgKSApICE9IDAgKSB7CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCBjb3VsZCBub3QgcmVzaXplIGJpdG1hcCB0byAlZCBibG9ja3M6ICIKKwkJICAgICAgICIlc1xuIiwgdGZ0cCwgbnVtX2Jsb2Nrcywgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBURlRQIHJlcXVlc3RlZCBibG9ja3NpemUKKyAqCisgKiBUaGlzIGlzIHRyZWF0ZWQgYXMgYSBnbG9iYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGZ0cF9yZXF1ZXN0X2Jsa3NpemUgPSBURlRQX01BWF9CTEtTSVpFOworCisvKioKKyAqIFNldCBURlRQIHJlcXVlc3QgYmxvY2tzaXplCisgKgorICogQHYgYmxrc2l6ZQkJUmVxdWVzdGVkIGJsb2NrIHNpemUKKyAqLwordm9pZCB0ZnRwX3NldF9yZXF1ZXN0X2Jsa3NpemUgKCB1bnNpZ25lZCBpbnQgYmxrc2l6ZSApIHsKKwlpZiAoIGJsa3NpemUgPCBURlRQX0RFRkFVTFRfQkxLU0laRSApCisJCWJsa3NpemUgPSBURlRQX0RFRkFVTFRfQkxLU0laRTsKKwl0ZnRwX3JlcXVlc3RfYmxrc2l6ZSA9IGJsa3NpemU7Cit9CisKKy8qKgorICogTVRGVFAgbXVsdGljYXN0IHJlY2VpdmUgYWRkcmVzcworICoKKyAqIFRoaXMgaXMgdHJlYXRlZCBhcyBhIGdsb2JhbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4KKyAqLworc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9pbiB0ZnRwX210ZnRwX3NvY2tldCA9IHsKKwkuc2luX2ZhbWlseSA9IEFGX0lORVQsCisJLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sICggMHhlZmZmMDEwMSApLAorCS5zaW5fcG9ydCA9IGh0b25zICggMzAwMSApLAorfTsKKworLyoqCisgKiBTZXQgTVRGVFAgbXVsdGljYXN0IGFkZHJlc3MKKyAqCisgKiBAdiBhZGRyZXNzCQlNdWx0aWNhc3QgSVB2NCBhZGRyZXNzCisgKi8KK3ZvaWQgdGZ0cF9zZXRfbXRmdHBfYWRkcmVzcyAoIHN0cnVjdCBpbl9hZGRyIGFkZHJlc3MgKSB7CisJdGZ0cF9tdGZ0cF9zb2NrZXQuc2luX2FkZHIgPSBhZGRyZXNzOworfQorCisvKioKKyAqIFNldCBNVEZUUCBtdWx0aWNhc3QgcG9ydAorICoKKyAqIEB2IHBvcnQJCU11bHRpY2FzdCBwb3J0CisgKi8KK3ZvaWQgdGZ0cF9zZXRfbXRmdHBfcG9ydCAoIHVuc2lnbmVkIGludCBwb3J0ICkgeworCXRmdHBfbXRmdHBfc29ja2V0LnNpbl9wb3J0ID0gaHRvbnMgKCBwb3J0ICk7Cit9CisKKy8qKgorICogVHJhbnNtaXQgUlJRCisgKgorICogQHYgdGZ0cAkJVEZUUCBjb25uZWN0aW9uCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0ZnRwX3NlbmRfcnJxICggc3RydWN0IHRmdHBfcmVxdWVzdCAqdGZ0cCApIHsKKwlzdHJ1Y3QgdGZ0cF9ycnEgKnJycTsKKwljb25zdCBjaGFyICpwYXRoOworCXNpemVfdCBsZW47CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisKKwkvKiBTdHJpcCBpbml0aWFsICcvJyBpZiBwcmVzZW50LiAgSWYgd2Ugd2VyZSBvcGVuZWQgdmlhIHRoZQorCSAqIFVSSSBpbnRlcmZhY2UsIHRoZW4gdGhlcmUgd2lsbCBiZSBhbiBpbml0aWFsICcvJywgc2luY2UgYQorCSAqIGZ1bGwgdGZ0cDovLyBVUkkgcHJvdmlkZXMgbm8gd2F5IHRvIHNwZWNpZnkgYSBub24tYWJzb2x1dGUKKwkgKiBwYXRoLiAgSG93ZXZlciwgbWFueSBURlRQIHNlcnZlcnMgKHBhcnRpY3VsYXJseSBXaW5kb3dzCisJICogVEZUUCBzZXJ2ZXJzKSBjb21wbGFpbiBhYm91dCBoYXZpbmcgYW4gaW5pdGlhbCAnLycsIGFuZCBpdAorCSAqIHZpb2xhdGVzIHVzZXIgZXhwZWN0YXRpb25zIHRvIGhhdmUgYSAnLycgc2lsZW50bHkgYWRkZWQgdG8KKwkgKiB0aGUgREhDUC1zcGVjaWZpZWQgZmlsZW5hbWUuCisJICovCisJcGF0aCA9IHRmdHAtPnVyaS0+cGF0aDsKKwlpZiAoICpwYXRoID09ICcvJyApCisJCXBhdGgrKzsKKworCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZXF1ZXN0aW5nIFwiJXNcIlxuIiwgdGZ0cCwgcGF0aCApOworCisJLyogQWxsb2NhdGUgYnVmZmVyICovCisJbGVuID0gKCBzaXplb2YgKCAqcnJxICkgKyBzdHJsZW4gKCBwYXRoICkgKyAxIC8qIE5VTCAqLworCQkrIDUgKyAxIC8qICJvY3RldCIgKyBOVUwgKi8KKwkJKyA3ICsgMSArIDUgKyAxIC8qICJibGtzaXplIiArIE5VTCArIGRkZGRkICsgTlVMICovCisJCSsgNSArIDEgKyAxICsgMSAvKiAidHNpemUiICsgTlVMICsgIjAiICsgTlVMICovIAorCQkrIDkgKyAxICsgMSAvKiAibXVsdGljYXN0IiArIE5VTCArIE5VTCAqLyApOworCWlvYnVmID0geGZlcl9hbGxvY19pb2IgKCAmdGZ0cC0+c29ja2V0LCBsZW4gKTsKKwlpZiAoICEgaW9idWYgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEJ1aWxkIHJlcXVlc3QgKi8KKwlycnEgPSBpb2JfcHV0ICggaW9idWYsIHNpemVvZiAoICpycnEgKSApOworCXJycS0+b3Bjb2RlID0gaHRvbnMgKCBURlRQX1JSUSApOworCWlvYl9wdXQgKCBpb2J1Ziwgc25wcmludGYgKCBpb2J1Zi0+dGFpbCwgaW9iX3RhaWxyb29tICggaW9idWYgKSwKKwkJCQkgICAgIiVzJWNvY3RldCIsIHBhdGgsIDAgKSArIDEgKTsKKwlpZiAoIHRmdHAtPmZsYWdzICYgVEZUUF9GTF9SUlFfU0laRVMgKSB7CisJCWlvYl9wdXQgKCBpb2J1Ziwgc25wcmludGYgKCBpb2J1Zi0+dGFpbCwKKwkJCQkJICAgIGlvYl90YWlscm9vbSAoIGlvYnVmICksCisJCQkJCSAgICAiYmxrc2l6ZSVjJWQlY3RzaXplJWMwIiwgMCwKKwkJCQkJICAgIHRmdHBfcmVxdWVzdF9ibGtzaXplLCAwLCAwICkgKyAxICk7CisJfQorCWlmICggdGZ0cC0+ZmxhZ3MgJiBURlRQX0ZMX1JSUV9NVUxUSUNBU1QgKSB7CisJCWlvYl9wdXQgKCBpb2J1Ziwgc25wcmludGYgKCBpb2J1Zi0+dGFpbCwKKwkJCQkJICAgIGlvYl90YWlscm9vbSAoIGlvYnVmICksCisJCQkJCSAgICAibXVsdGljYXN0JWMiLCAwICkgKyAxICk7CisJfQorCisJLyogUlJRIGFsd2F5cyBnb2VzIHRvIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgaW5pdGlhbAorCSAqIHhmZXJfb3BlbigpIGNhbGwKKwkgKi8KKwlyZXR1cm4geGZlcl9kZWxpdmVyX2lvYiAoICZ0ZnRwLT5zb2NrZXQsIGlvYnVmICk7Cit9CisKKy8qKgorICogVHJhbnNtaXQgQUNLCisgKgorICogQHYgdGZ0cAkJVEZUUCBjb25uZWN0aW9uCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0ZnRwX3NlbmRfYWNrICggc3RydWN0IHRmdHBfcmVxdWVzdCAqdGZ0cCApIHsKKwlzdHJ1Y3QgdGZ0cF9hY2sgKmFjazsKKwlzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZjsKKwlzdHJ1Y3QgeGZlcl9tZXRhZGF0YSBtZXRhID0geworCQkuZGVzdCA9ICggc3RydWN0IHNvY2thZGRyICogKSAmdGZ0cC0+cGVlciwKKwl9OworCXVuc2lnbmVkIGludCBibG9jazsKKworCS8qIERldGVybWluZSBuZXh0IHJlcXVpcmVkIGJsb2NrIG51bWJlciAqLworCWJsb2NrID0gYml0bWFwX2ZpcnN0X2dhcCAoICZ0ZnRwLT5iaXRtYXAgKTsKKwlEQkdDMiAoIHRmdHAsICJURlRQICVwIHNlbmRpbmcgQUNLIGZvciBibG9jayAlZFxuIiwgdGZ0cCwgYmxvY2sgKTsKKworCS8qIEFsbG9jYXRlIGJ1ZmZlciAqLworCWlvYnVmID0geGZlcl9hbGxvY19pb2IgKCAmdGZ0cC0+c29ja2V0LCBzaXplb2YgKCAqYWNrICkgKTsKKwlpZiAoICEgaW9idWYgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEJ1aWxkIEFDSyAqLworCWFjayA9IGlvYl9wdXQgKCBpb2J1Ziwgc2l6ZW9mICggKmFjayApICk7CisJYWNrLT5vcGNvZGUgPSBodG9ucyAoIFRGVFBfQUNLICk7CisJYWNrLT5ibG9jayA9IGh0b25zICggYmxvY2sgKTsKKworCS8qIEFDSyBhbHdheXMgZ29lcyB0byB0aGUgcGVlciByZWNvcmRlZCBmcm9tIHRoZSBSUlEgcmVzcG9uc2UgKi8KKwlyZXR1cm4geGZlcl9kZWxpdmVyX2lvYl9tZXRhICggJnRmdHAtPnNvY2tldCwgaW9idWYsICZtZXRhICk7Cit9CisKKy8qKgorICogVHJhbnNtaXQgRVJST1IgKEFib3J0KQorICoKKyAqIEB2IHRmdHAJCVRGVFAgY29ubmVjdGlvbgorICogQHYgZXJyY29kZQkJVEZUUCBlcnJvciBjb2RlCisgKiBAdiBlcnJtc2cJCUVycm9yIG1lc3NhZ2Ugc3RyaW5nCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0ZnRwX3NlbmRfZXJyb3IgKCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwLCBpbnQgZXJyY29kZSwKKwkJCSAgICAgY29uc3QgY2hhciAqZXJybXNnICkgeworCXN0cnVjdCB0ZnRwX2Vycm9yICplcnI7CisJc3RydWN0IGlvX2J1ZmZlciAqaW9idWY7CisJc3RydWN0IHhmZXJfbWV0YWRhdGEgbWV0YSA9IHsKKwkJLmRlc3QgPSAoIHN0cnVjdCBzb2NrYWRkciAqICkgJnRmdHAtPnBlZXIsCisJfTsKKwlzaXplX3QgbXNnbGVuOworCisJREJHQzIgKCB0ZnRwLCAiVEZUUCAlcCBzZW5kaW5nIEVSUk9SICVkOiAlc1xuIiwgdGZ0cCwgZXJyY29kZSwKKwkJZXJybXNnICk7CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgKi8KKwltc2dsZW4gPSBzaXplb2YgKCAqZXJyICkgKyBzdHJsZW4gKCBlcnJtc2cgKSArIDEgLyogTlVMICovOworCWlvYnVmID0geGZlcl9hbGxvY19pb2IgKCAmdGZ0cC0+c29ja2V0LCBtc2dsZW4gKTsKKwlpZiAoICEgaW9idWYgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEJ1aWxkIEVSUk9SICovCisJZXJyID0gaW9iX3B1dCAoIGlvYnVmLCBtc2dsZW4gKTsKKwllcnItPm9wY29kZSA9IGh0b25zICggVEZUUF9FUlJPUiApOworCWVyci0+ZXJyY29kZSA9IGh0b25zICggZXJyY29kZSApOworCXN0cmNweSAoIGVyci0+ZXJybXNnLCBlcnJtc2cgKTsKKworCS8qIEVSUiBhbHdheXMgZ29lcyB0byB0aGUgcGVlciByZWNvcmRlZCBmcm9tIHRoZSBSUlEgcmVzcG9uc2UgKi8KKwlyZXR1cm4geGZlcl9kZWxpdmVyX2lvYl9tZXRhICggJnRmdHAtPnNvY2tldCwgaW9idWYsICZtZXRhICk7Cit9CisKKy8qKgorICogVHJhbnNtaXQgbmV4dCByZWxldmFudCBwYWNrZXQKKyAqCisgKiBAdiB0ZnRwCQlURlRQIGNvbm5lY3Rpb24KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBfc2VuZF9wYWNrZXQgKCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwICkgeworCisJLyogVXBkYXRlIHJldHJhbnNtaXNzaW9uIHRpbWVyLiAgV2hpbGUgbmFtZSByZXNvbHV0aW9uIHRha2VzIHBsYWNlIHRoZQorCSAqIHdpbmRvdyBpcyB6ZXJvLiAgQXZvaWQgdW5uZWNlc3NhcnkgZGVsYXkgYWZ0ZXIgbmFtZSByZXNvbHV0aW9uCisJICogY29tcGxldGVzIGJ5IHJldHJ5aW5nIGltbWVkaWF0ZWx5LgorCSAqLworCXN0b3BfdGltZXIgKCAmdGZ0cC0+dGltZXIgKTsKKwlpZiAoIHhmZXJfd2luZG93ICggJnRmdHAtPnNvY2tldCApICkgeworCQlzdGFydF90aW1lciAoICZ0ZnRwLT50aW1lciApOworCX0gZWxzZSB7CisJCXN0YXJ0X3RpbWVyX25vZGVsYXkgKCAmdGZ0cC0+dGltZXIgKTsKKwl9CisKKwkvKiBTZW5kIFJSUSBvciBBQ0sgYXMgYXBwcm9wcmlhdGUgKi8KKwlpZiAoICEgdGZ0cC0+cGVlci5zdF9mYW1pbHkgKSB7CisJCXJldHVybiB0ZnRwX3NlbmRfcnJxICggdGZ0cCApOworCX0gZWxzZSB7CisJCWlmICggdGZ0cC0+ZmxhZ3MgJiBURlRQX0ZMX1NFTkRfQUNLICkgeworCQkJcmV0dXJuIHRmdHBfc2VuZF9hY2sgKCB0ZnRwICk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KKworLyoqCisgKiBIYW5kbGUgVEZUUCByZXRyYW5zbWlzc2lvbiB0aW1lciBleHBpcnkKKyAqCisgKiBAdiB0aW1lcgkJUmV0cnkgdGltZXIKKyAqIEB2IGZhaWwJCUZhaWx1cmUgaW5kaWNhdG9yCisgKi8KK3N0YXRpYyB2b2lkIHRmdHBfdGltZXJfZXhwaXJlZCAoIHN0cnVjdCByZXRyeV90aW1lciAqdGltZXIsIGludCBmYWlsICkgeworCXN0cnVjdCB0ZnRwX3JlcXVlc3QgKnRmdHAgPQorCQljb250YWluZXJfb2YgKCB0aW1lciwgc3RydWN0IHRmdHBfcmVxdWVzdCwgdGltZXIgKTsKKwlpbnQgcmM7CisKKwkvKiBJZiB3ZSBhcmUgZG9pbmcgTVRGVFAsIGF0dGVtcHQgdGhlIHZhcmlvdXMgcmVjb3Zlcnkgc3RyYXRlZ2llcyAqLworCWlmICggdGZ0cC0+ZmxhZ3MgJiBURlRQX0ZMX01URlRQX1JFQ09WRVJZICkgeworCQlpZiAoIHRmdHAtPnBlZXIuc3RfZmFtaWx5ICkgeworCQkJLyogSWYgd2UgaGF2ZSByZWNlaXZlZCBhbnkgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLAorCQkJICogdHJ5IHJlc2VuZGluZyB0aGUgUlJRIHRvIHJlc3RhcnQgdGhlIGRvd25sb2FkLgorCQkJICovCisJCQlEQkdDICggdGZ0cCwgIlRGVFAgJXAgYXR0ZW1wdGluZyByZW9wZW5cbiIsIHRmdHAgKTsKKwkJCWlmICggKCByYyA9IHRmdHBfcmVvcGVuICggdGZ0cCApICkgIT0gMCApCisJCQkJZ290byBlcnI7CisJCX0gZWxzZSB7CisJCQkvKiBGYWxsIGJhY2sgdG8gcGxhaW4gVEZUUCBhZnRlciBzZXZlcmFsIGF0dGVtcHRzICovCisJCQl0ZnRwLT5tdGZ0cF90aW1lb3V0cysrOworCQkJREJHQyAoIHRmdHAsICJURlRQICVwIHRpbWVvdXQgJWQgd2FpdGluZyBmb3IgTVRGVFAgIgorCQkJICAgICAgICJvcGVuXG4iLCB0ZnRwLCB0ZnRwLT5tdGZ0cF90aW1lb3V0cyApOworCisJCQlpZiAoIHRmdHAtPm10ZnRwX3RpbWVvdXRzID4gTVRGVFBfTUFYX1RJTUVPVVRTICkgeworCQkJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCBmYWxsaW5nIGJhY2sgdG8gcGxhaW4gIgorCQkJCSAgICAgICAiVEZUUFxuIiwgdGZ0cCApOworCQkJCXRmdHAtPmZsYWdzID0gVEZUUF9GTF9SUlFfU0laRVM7CisKKwkJCQkvKiBDbG9zZSBtdWx0aWNhc3Qgc29ja2V0ICovCisJCQkJeGZlcl9jbG9zZSAoICZ0ZnRwLT5tY19zb2NrZXQsIDAgKTsKKworCQkJCS8qIFJlc2V0IHJldHJ5IHRpbWVyICovCisJCQkJc3RhcnRfdGltZXJfbm9kZWxheSAoICZ0ZnRwLT50aW1lciApOworCisJCQkJLyogVGhlIGJsb2Nrc2l6ZSBtYXkgY2hhbmdlOiBkaXNjYXJkCisJCQkJICogdGhlIGJsb2NrIGJpdG1hcAorCQkJCSAqLworCQkJCWJpdG1hcF9mcmVlICggJnRmdHAtPmJpdG1hcCApOworCQkJCW1lbXNldCAoICZ0ZnRwLT5iaXRtYXAsIDAsCisJCQkJCSBzaXplb2YgKCB0ZnRwLT5iaXRtYXAgKSApOworCisJCQkJLyogUmVvcGVuIG9uIHN0YW5kYXJkIFRGVFAgcG9ydCAqLworCQkJCXRmdHAtPnBvcnQgPSBURlRQX1BPUlQ7CisJCQkJaWYgKCAoIHJjID0gdGZ0cF9yZW9wZW4gKCB0ZnRwICkgKSAhPSAwICkKKwkJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBOb3QgZG9pbmcgTVRGVFAgKG9yIGhhdmUgZmFsbGVuIGJhY2sgdG8gcGxhaW4KKwkJICogVEZUUCk7IGZhaWwgYXMgcGVyIG5vcm1hbC4KKwkJICovCisJCWlmICggZmFpbCApIHsKKwkJCXJjID0gLUVUSU1FRE9VVDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCXRmdHBfc2VuZF9wYWNrZXQgKCB0ZnRwICk7CisJcmV0dXJuOworCisgZXJyOgorCXRmdHBfZG9uZSAoIHRmdHAsIHJjICk7Cit9CisKKy8qKgorICogUHJvY2VzcyBURlRQICJibGtzaXplIiBvcHRpb24KKyAqCisgKiBAdiB0ZnRwCQlURlRQIGNvbm5lY3Rpb24KKyAqIEB2IHZhbHVlCQlPcHRpb24gdmFsdWUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBfcHJvY2Vzc19ibGtzaXplICggc3RydWN0IHRmdHBfcmVxdWVzdCAqdGZ0cCwKKwkJCQkgIGNvbnN0IGNoYXIgKnZhbHVlICkgeworCWNoYXIgKmVuZDsKKworCXRmdHAtPmJsa3NpemUgPSBzdHJ0b3VsICggdmFsdWUsICZlbmQsIDEwICk7CisJaWYgKCAqZW5kICkgeworCQlEQkdDICggdGZ0cCwgIlRGVFAgJXAgZ290IGludmFsaWQgYmxrc2l6ZSBcIiVzXCJcbiIsCisJCSAgICAgICB0ZnRwLCB2YWx1ZSApOworCQlyZXR1cm4gLSggRUlOVkFMIHwgRVRGVFBfSU5WQUxJRF9CTEtTSVpFICk7CisJfQorCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCBibGtzaXplPSVkXG4iLCB0ZnRwLCB0ZnRwLT5ibGtzaXplICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQcm9jZXNzIFRGVFAgInRzaXplIiBvcHRpb24KKyAqCisgKiBAdiB0ZnRwCQlURlRQIGNvbm5lY3Rpb24KKyAqIEB2IHZhbHVlCQlPcHRpb24gdmFsdWUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBfcHJvY2Vzc190c2l6ZSAoIHN0cnVjdCB0ZnRwX3JlcXVlc3QgKnRmdHAsCisJCQkJY29uc3QgY2hhciAqdmFsdWUgKSB7CisJY2hhciAqZW5kOworCisJdGZ0cC0+dHNpemUgPSBzdHJ0b3VsICggdmFsdWUsICZlbmQsIDEwICk7CisJaWYgKCAqZW5kICkgeworCQlEQkdDICggdGZ0cCwgIlRGVFAgJXAgZ290IGludmFsaWQgdHNpemUgXCIlc1wiXG4iLAorCQkgICAgICAgdGZ0cCwgdmFsdWUgKTsKKwkJcmV0dXJuIC0oIEVJTlZBTCB8IEVURlRQX0lOVkFMSURfVFNJWkUgKTsKKwl9CisJREJHQyAoIHRmdHAsICJURlRQICVwIHRzaXplPSVsZFxuIiwgdGZ0cCwgdGZ0cC0+dHNpemUgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFByb2Nlc3MgVEZUUCAibXVsdGljYXN0IiBvcHRpb24KKyAqCisgKiBAdiB0ZnRwCQlURlRQIGNvbm5lY3Rpb24KKyAqIEB2IHZhbHVlCQlPcHRpb24gdmFsdWUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBfcHJvY2Vzc19tdWx0aWNhc3QgKCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwLAorCQkJCSAgICBjb25zdCBjaGFyICp2YWx1ZSApIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkciBzYTsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwl9IHNvY2tldDsKKwljaGFyIGJ1Zlsgc3RybGVuICggdmFsdWUgKSArIDEgXTsKKwljaGFyICphZGRyOworCWNoYXIgKnBvcnQ7CisJY2hhciAqcG9ydF9lbmQ7CisJY2hhciAqbWM7CisJY2hhciAqbWNfZW5kOworCWludCByYzsKKworCS8qIFNwbGl0IHZhbHVlIGludG8gImFkZHIscG9ydCxtYyIgZmllbGRzICovCisJbWVtY3B5ICggYnVmLCB2YWx1ZSwgc2l6ZW9mICggYnVmICkgKTsKKwlhZGRyID0gYnVmOworCXBvcnQgPSBzdHJjaHIgKCBhZGRyLCAnLCcgKTsKKwlpZiAoICEgcG9ydCApIHsKKwkJREJHQyAoIHRmdHAsICJURlRQICVwIG11bHRpY2FzdCBtaXNzaW5nIHBvcnQsbWNcbiIsIHRmdHAgKTsKKwkJcmV0dXJuIC0oIEVJTlZBTCB8IEVURlRQX01DX05PX1BPUlQgKTsKKwl9CisJKihwb3J0KyspID0gJ1wwJzsKKwltYyA9IHN0cmNociAoIHBvcnQsICcsJyApOworCWlmICggISBtYyApIHsKKwkJREJHQyAoIHRmdHAsICJURlRQICVwIG11bHRpY2FzdCBtaXNzaW5nIG1jXG4iLCB0ZnRwICk7CisJCXJldHVybiAtKCBFSU5WQUwgfCBFVEZUUF9NQ19OT19NQyApOworCX0KKwkqKG1jKyspID0gJ1wwJzsKKworCS8qIFBhcnNlIHBhcmFtZXRlcnMgKi8KKwlpZiAoIHN0cnRvdWwgKCBtYywgJm1jX2VuZCwgMCApID09IDAgKQorCQl0ZnRwLT5mbGFncyAmPSB+VEZUUF9GTF9TRU5EX0FDSzsKKwlpZiAoICptY19lbmQgKSB7CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCBtdWx0aWNhc3QgaW52YWxpZCBtYyAlc1xuIiwgdGZ0cCwgbWMgKTsKKwkJcmV0dXJuIC0oIEVJTlZBTCB8IEVURlRQX01DX0lOVkFMSURfTUMgKTsKKwl9CisJREJHQyAoIHRmdHAsICJURlRQICVwIGlzJXMgdGhlIG1hc3RlciBjbGllbnRcbiIsCisJICAgICAgIHRmdHAsICggKCB0ZnRwLT5mbGFncyAmIFRGVFBfRkxfU0VORF9BQ0sgKSA/ICIiIDogIiBub3QiICkgKTsKKwlpZiAoICphZGRyICYmICpwb3J0ICkgeworCQlzb2NrZXQuc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlpZiAoIGluZXRfYXRvbiAoIGFkZHIsICZzb2NrZXQuc2luLnNpbl9hZGRyICkgPT0gMCApIHsKKwkJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCBtdWx0aWNhc3QgaW52YWxpZCBJUCBhZGRyZXNzICIKKwkJCSAgICAgICAiJXNcbiIsIHRmdHAsIGFkZHIgKTsKKwkJCXJldHVybiAtKCBFSU5WQUwgfCBFVEZUUF9NQ19JTlZBTElEX0lQICk7CisJCX0KKwkJREJHQyAoIHRmdHAsICJURlRQICVwIG11bHRpY2FzdCBJUCBhZGRyZXNzICVzXG4iLAorCQkgICAgICAgdGZ0cCwgaW5ldF9udG9hICggc29ja2V0LnNpbi5zaW5fYWRkciApICk7CisJCXNvY2tldC5zaW4uc2luX3BvcnQgPSBodG9ucyAoIHN0cnRvdWwgKCBwb3J0LCAmcG9ydF9lbmQsIDAgKSApOworCQlpZiAoICpwb3J0X2VuZCApIHsKKwkJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCBtdWx0aWNhc3QgaW52YWxpZCBwb3J0ICVzXG4iLAorCQkJICAgICAgIHRmdHAsIHBvcnQgKTsKKwkJCXJldHVybiAtKCBFSU5WQUwgfCBFVEZUUF9NQ19JTlZBTElEX1BPUlQgKTsKKwkJfQorCQlEQkdDICggdGZ0cCwgIlRGVFAgJXAgbXVsdGljYXN0IHBvcnQgJWRcbiIsCisJCSAgICAgICB0ZnRwLCBudG9ocyAoIHNvY2tldC5zaW4uc2luX3BvcnQgKSApOworCQlpZiAoICggcmMgPSB0ZnRwX3Jlb3Blbl9tYyAoIHRmdHAsICZzb2NrZXQuc2EgKSApICE9IDAgKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKiogQSBURlRQIG9wdGlvbiAqLworc3RydWN0IHRmdHBfb3B0aW9uIHsKKwkvKiogT3B0aW9uIG5hbWUgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKiBPcHRpb24gcHJvY2Vzc29yCisJICoKKwkgKiBAdiB0ZnRwCVRGVFAgY29ubmVjdGlvbgorCSAqIEB2IHZhbHVlCU9wdGlvbiB2YWx1ZQorCSAqIEByZXQgcmMJUmV0dXJuIHN0YXR1cyBjb2RlCisJICovCisJaW50ICggKiBwcm9jZXNzICkgKCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwLCBjb25zdCBjaGFyICp2YWx1ZSApOworfTsKKworLyoqIFJlY29nbmlzZWQgVEZUUCBvcHRpb25zICovCitzdGF0aWMgc3RydWN0IHRmdHBfb3B0aW9uIHRmdHBfb3B0aW9uc1tdID0geworCXsgImJsa3NpemUiLCB0ZnRwX3Byb2Nlc3NfYmxrc2l6ZSB9LAorCXsgInRzaXplIiwgdGZ0cF9wcm9jZXNzX3RzaXplIH0sCisJeyAibXVsdGljYXN0IiwgdGZ0cF9wcm9jZXNzX211bHRpY2FzdCB9LAorCXsgTlVMTCwgTlVMTCB9Cit9OworCisvKioKKyAqIFByb2Nlc3MgVEZUUCBvcHRpb24KKyAqCisgKiBAdiB0ZnRwCQlURlRQIGNvbm5lY3Rpb24KKyAqIEB2IG5hbWUJCU9wdGlvbiBuYW1lCisgKiBAdiB2YWx1ZQkJT3B0aW9uIHZhbHVlCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0ZnRwX3Byb2Nlc3Nfb3B0aW9uICggc3RydWN0IHRmdHBfcmVxdWVzdCAqdGZ0cCwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUgKSB7CisJc3RydWN0IHRmdHBfb3B0aW9uICpvcHRpb247CisKKwlmb3IgKCBvcHRpb24gPSB0ZnRwX29wdGlvbnMgOyBvcHRpb24tPm5hbWUgOyBvcHRpb24rKyApIHsKKwkJaWYgKCBzdHJjYXNlY21wICggbmFtZSwgb3B0aW9uLT5uYW1lICkgPT0gMCApCisJCQlyZXR1cm4gb3B0aW9uLT5wcm9jZXNzICggdGZ0cCwgdmFsdWUgKTsKKwl9CisKKwlEQkdDICggdGZ0cCwgIlRGVFAgJXAgcmVjZWl2ZWQgdW5rbm93biBvcHRpb24gXCIlc1wiID0gXCIlc1wiXG4iLAorCSAgICAgICB0ZnRwLCBuYW1lLCB2YWx1ZSApOworCisJLyogVW5rbm93biBvcHRpb25zIHNob3VsZCBiZSBzaWxlbnRseSBpZ25vcmVkICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVjZWl2ZSBPQUNLCisgKgorICogQHYgdGZ0cAkJVEZUUCBjb25uZWN0aW9uCisgKiBAdiBidWYJCVRlbXBvcmFyeSBkYXRhIGJ1ZmZlcgorICogQHYgbGVuCQlMZW5ndGggb2YgdGVtcG9yYXJ5IGRhdGEgYnVmZmVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0ZnRwX3J4X29hY2sgKCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwLCB2b2lkICpidWYsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IHRmdHBfb2FjayAqb2FjayA9IGJ1ZjsKKwljaGFyICplbmQgPSBidWYgKyBsZW47CisJY2hhciAqbmFtZTsKKwljaGFyICp2YWx1ZTsKKwljaGFyICpuZXh0OworCWludCByYyA9IDA7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIGxlbiA8IHNpemVvZiAoICpvYWNrICkgKSB7CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZWNlaXZlZCB1bmRlcmxlbmd0aCBPQUNLIHBhY2tldCAiCisJCSAgICAgICAibGVuZ3RoICV6ZFxuIiwgdGZ0cCwgbGVuICk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCS8qIFByb2Nlc3MgZWFjaCBvcHRpb24gaW4gdHVybiAqLworCWZvciAoIG5hbWUgPSBvYWNrLT5kYXRhIDsgbmFtZSA8IGVuZCA7IG5hbWUgPSBuZXh0ICkgeworCisJCS8qIFBhcnNlIG9wdGlvbiBuYW1lIGFuZCB2YWx1ZQorCQkgKgorCQkgKiBXZSB0cmVhdCBwYXJzaW5nIGVycm9ycyBhcyBub24tZmF0YWwsIGJlY2F1c2UgdGhlcmUKKwkJICogZXhpc3RzIGF0IGxlYXN0IG9uZSBURlRQIHNlcnZlciAoSUJNIFRpdm9saSBQWEUKKwkJICogU2VydmVyIDUuMS4wLjMpIHRoYXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdG8gc2VuZAorCQkgKiBtYWxmb3JtZWQgT0FDS3MgY29udGFpbmluZyB0cmFpbGluZyBnYXJiYWdlIGJ5dGVzLgorCQkgKi8KKwkJdmFsdWUgPSAoIG5hbWUgKyBzdHJubGVuICggbmFtZSwgKCBlbmQgLSBuYW1lICkgKSArIDEgKTsKKwkJaWYgKCB2YWx1ZSA+IGVuZCApIHsKKwkJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZWNlaXZlZCBPQUNLIHdpdGggbWFsZm9ybWVkICIKKwkJCSAgICAgICAib3B0aW9uIG5hbWU6XG4iLCB0ZnRwICk7CisJCQlEQkdDX0hEICggdGZ0cCwgb2FjaywgbGVuICk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIHZhbHVlID09IGVuZCApIHsKKwkJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZWNlaXZlZCBPQUNLIG1pc3NpbmcgdmFsdWUgIgorCQkJICAgICAgICJmb3Igb3B0aW9uIFwiJXNcIlxuIiwgdGZ0cCwgbmFtZSApOworCQkJREJHQ19IRCAoIHRmdHAsIG9hY2ssIGxlbiApOworCQkJYnJlYWs7CisJCX0KKwkJbmV4dCA9ICggdmFsdWUgKyBzdHJubGVuICggdmFsdWUsICggZW5kIC0gdmFsdWUgKSApICsgMSApOworCQlpZiAoIG5leHQgPiBlbmQgKSB7CisJCQlEQkdDICggdGZ0cCwgIlRGVFAgJXAgcmVjZWl2ZWQgT0FDSyB3aXRoIG1hbGZvcm1lZCAiCisJCQkgICAgICAgInZhbHVlIGZvciBvcHRpb24gXCIlc1wiOlxuIiwgdGZ0cCwgbmFtZSApOworCQkJREJHQ19IRCAoIHRmdHAsIG9hY2ssIGxlbiApOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBQcm9jZXNzIG9wdGlvbiAqLworCQlpZiAoICggcmMgPSB0ZnRwX3Byb2Nlc3Nfb3B0aW9uICggdGZ0cCwgbmFtZSwgdmFsdWUgKSApICE9IDAgKQorCQkJZ290byBkb25lOworCX0KKworCS8qIFByb2Nlc3MgdHNpemUgaW5mb3JtYXRpb24sIGlmIGF2YWlsYWJsZSAqLworCWlmICggdGZ0cC0+dHNpemUgKSB7CisJCWlmICggKCByYyA9IHRmdHBfcHJlc2l6ZSAoIHRmdHAsIHRmdHAtPnRzaXplICkgKSAhPSAwICkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBBYm9ydCByZXF1ZXN0IGlmIG9ubHkgdHJ5aW5nIHRvIGRldGVybWluZSBmaWxlIHNpemUgKi8KKwlpZiAoIHRmdHAtPmZsYWdzICYgVEZUUF9GTF9TSVpFT05MWSApIHsKKwkJcmMgPSAwOworCQl0ZnRwX3NlbmRfZXJyb3IgKCB0ZnRwLCAwLCAiVEZUUCBBYm9ydGVkIiApOworCQl0ZnRwX2RvbmUgKCB0ZnRwLCByYyApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogUmVxdWVzdCBuZXh0IGRhdGEgYmxvY2sgKi8KKwl0ZnRwX3NlbmRfcGFja2V0ICggdGZ0cCApOworCisgZG9uZToKKwlpZiAoIHJjICkKKwkJdGZ0cF9kb25lICggdGZ0cCwgcmMgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVjZWl2ZSBEQVRBCisgKgorICogQHYgdGZ0cAkJVEZUUCBjb25uZWN0aW9uCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKgorICogVGFrZXMgb3duZXJzaGlwIG9mIEkvTyBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgdGZ0cF9yeF9kYXRhICggc3RydWN0IHRmdHBfcmVxdWVzdCAqdGZ0cCwKKwkJCSAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYgKSB7CisJc3RydWN0IHRmdHBfZGF0YSAqZGF0YSA9IGlvYnVmLT5kYXRhOworCXN0cnVjdCB4ZmVyX21ldGFkYXRhIG1ldGE7CisJdW5zaWduZWQgaW50IGJsb2NrOworCW9mZl90IG9mZnNldDsKKwlzaXplX3QgZGF0YV9sZW47CisJaW50IHJjOworCisJaWYgKCB0ZnRwLT5mbGFncyAmIFRGVFBfRkxfU0laRU9OTFkgKSB7CisJCS8qIElmIHdlIGdldCBoZXJlIHRoZW4gc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBTSVpFIG9wdGlvbiAqLworCQlyYyA9IC1FTk9UU1VQOworCQl0ZnRwX3NlbmRfZXJyb3IgKCB0ZnRwLCAwLCAiVEZUUCBBYm9ydGVkIiApOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCBpb2JfbGVuICggaW9idWYgKSA8IHNpemVvZiAoICpkYXRhICkgKSB7CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZWNlaXZlZCB1bmRlcmxlbmd0aCBEQVRBIHBhY2tldCAiCisJCSAgICAgICAibGVuZ3RoICV6ZFxuIiwgdGZ0cCwgaW9iX2xlbiAoIGlvYnVmICkgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogQ2FsY3VsYXRlIGJsb2NrIG51bWJlciAqLworCWJsb2NrID0gKCAoIGJpdG1hcF9maXJzdF9nYXAgKCAmdGZ0cC0+Yml0bWFwICkgKyAxICkgJiB+MHhmZmZmICk7CisJaWYgKCBkYXRhLT5ibG9jayA9PSAwICYmIGJsb2NrID09IDAgKSB7CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZWNlaXZlZCBkYXRhIGJsb2NrIDBcbiIsIHRmdHAgKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWJsb2NrICs9ICggbnRvaHMgKCBkYXRhLT5ibG9jayApIC0gMSApOworCisJLyogRXh0cmFjdCBkYXRhICovCisJb2Zmc2V0ID0gKCBibG9jayAqIHRmdHAtPmJsa3NpemUgKTsKKwlpb2JfcHVsbCAoIGlvYnVmLCBzaXplb2YgKCAqZGF0YSApICk7CisJZGF0YV9sZW4gPSBpb2JfbGVuICggaW9idWYgKTsKKwlpZiAoIGRhdGFfbGVuID4gdGZ0cC0+Ymxrc2l6ZSApIHsKKwkJREJHQyAoIHRmdHAsICJURlRQICVwIHJlY2VpdmVkIG92ZXJsZW5ndGggREFUQSBwYWNrZXQgIgorCQkgICAgICAgImxlbmd0aCAlemRcbiIsIHRmdHAsIGRhdGFfbGVuICk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCS8qIERlbGl2ZXIgZGF0YSAqLworCW1lbXNldCAoICZtZXRhLCAwLCBzaXplb2YgKCBtZXRhICkgKTsKKwltZXRhLndoZW5jZSA9IFNFRUtfU0VUOworCW1ldGEub2Zmc2V0ID0gb2Zmc2V0OworCWlmICggKCByYyA9IHhmZXJfZGVsaXZlcl9pb2JfbWV0YSAoICZ0ZnRwLT54ZmVyLCBpb2JfZGlzb3duICggaW9idWYgKSwKKwkJCQkJICAgICZtZXRhICkgKSAhPSAwICkgeworCQlEQkdDICggdGZ0cCwgIlRGVFAgJXAgY291bGQgbm90IGRlbGl2ZXIgZGF0YTogJXNcbiIsCisJCSAgICAgICB0ZnRwLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIEVuc3VyZSBibG9jayBiaXRtYXAgaXMgcmVhZHkgKi8KKwlpZiAoICggcmMgPSB0ZnRwX3ByZXNpemUgKCB0ZnRwLCAoIG9mZnNldCArIGRhdGFfbGVuICkgKSApICE9IDAgKQorCQlnb3RvIGRvbmU7CisKKwkvKiBNYXJrIGJsb2NrIGFzIHJlY2VpdmVkICovCisJYml0bWFwX3NldCAoICZ0ZnRwLT5iaXRtYXAsIGJsb2NrICk7CisKKwkvKiBBY2tub3dsZWRnZSBibG9jayAqLworCXRmdHBfc2VuZF9wYWNrZXQgKCB0ZnRwICk7CisKKwkvKiBJZiBhbGwgYmxvY2tzIGhhdmUgYmVlbiByZWNlaXZlZCwgZmluaXNoLiAqLworCWlmICggYml0bWFwX2Z1bGwgKCAmdGZ0cC0+Yml0bWFwICkgKQorCQl0ZnRwX2RvbmUgKCB0ZnRwLCAwICk7CisKKyBkb25lOgorCWZyZWVfaW9iICggaW9idWYgKTsKKwlpZiAoIHJjICkKKwkJdGZ0cF9kb25lICggdGZ0cCwgcmMgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKiBUcmFuc2xhdGlvbiBiZXR3ZWVuIFRGVFAgZXJyb3JzIGFuZCBpbnRlcm5hbCBlcnJvciBudW1iZXJzICovCitzdGF0aWMgY29uc3QgaW50IHRmdHBfZXJyb3JzW10gPSB7CisJW1RGVFBfRVJSX0ZJTEVfTk9UX0ZPVU5EXQk9IEVOT0VOVCwKKwlbVEZUUF9FUlJfQUNDRVNTX0RFTklFRF0JPSBFQUNDRVMsCisJW1RGVFBfRVJSX0lMTEVHQUxfT1BdCQk9IEVOT1RTVVAsCit9OworCisvKioKKyAqIFJlY2VpdmUgRVJST1IKKyAqCisgKiBAdiB0ZnRwCQlURlRQIGNvbm5lY3Rpb24KKyAqIEB2IGJ1ZgkJVGVtcG9yYXJ5IGRhdGEgYnVmZmVyCisgKiBAdiBsZW4JCUxlbmd0aCBvZiB0ZW1wb3JhcnkgZGF0YSBidWZmZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBfcnhfZXJyb3IgKCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwLCB2b2lkICpidWYsIHNpemVfdCBsZW4gKSB7CisJc3RydWN0IHRmdHBfZXJyb3IgKmVycm9yID0gYnVmOworCXVuc2lnbmVkIGludCBlcnI7CisJaW50IHJjID0gMDsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICggbGVuIDwgc2l6ZW9mICggKmVycm9yICkgKSB7CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZWNlaXZlZCB1bmRlcmxlbmd0aCBFUlJPUiBwYWNrZXQgIgorCQkgICAgICAgImxlbmd0aCAlemRcbiIsIHRmdHAsIGxlbiApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEQkdDICggdGZ0cCwgIlRGVFAgJXAgcmVjZWl2ZWQgRVJST1IgcGFja2V0IHdpdGggY29kZSAlZCwgbWVzc2FnZSAiCisJICAgICAgICJcIiVzXCJcbiIsIHRmdHAsIG50b2hzICggZXJyb3ItPmVycmNvZGUgKSwgZXJyb3ItPmVycm1zZyApOworCQorCS8qIERldGVybWluZSBmaW5hbCBvcGVyYXRpb24gcmVzdWx0ICovCisJZXJyID0gbnRvaHMgKCBlcnJvci0+ZXJyY29kZSApOworCWlmICggZXJyIDwgKCBzaXplb2YgKCB0ZnRwX2Vycm9ycyApIC8gc2l6ZW9mICggdGZ0cF9lcnJvcnNbMF0gKSApICkKKwkJcmMgPSAtdGZ0cF9lcnJvcnNbZXJyXTsKKwlpZiAoICEgcmMgKQorCQlyYyA9IC1FTk9UU1VQOworCisJLyogQ2xvc2UgVEZUUCByZXF1ZXN0ICovCisJdGZ0cF9kb25lICggdGZ0cCwgcmMgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlY2VpdmUgbmV3IGRhdGEKKyAqCisgKiBAdiB0ZnRwCQlURlRQIGNvbm5lY3Rpb24KKyAqIEB2IGlvYnVmCQlJL08gYnVmZmVyCisgKiBAdiBtZXRhCQlUcmFuc2ZlciBtZXRhZGF0YQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGZ0cF9yeCAoIHN0cnVjdCB0ZnRwX3JlcXVlc3QgKnRmdHAsCisJCSAgICAgc3RydWN0IGlvX2J1ZmZlciAqaW9idWYsCisJCSAgICAgc3RydWN0IHhmZXJfbWV0YWRhdGEgKm1ldGEgKSB7CisJc3RydWN0IHNvY2thZGRyX3RjcGlwICpzdF9zcmM7CisJc3RydWN0IHRmdHBfY29tbW9uICpjb21tb24gPSBpb2J1Zi0+ZGF0YTsKKwlzaXplX3QgbGVuID0gaW9iX2xlbiAoIGlvYnVmICk7CisJaW50IHJjID0gLUVJTlZBTDsKKwkKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCBsZW4gPCBzaXplb2YgKCAqY29tbW9uICkgKSB7CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZWNlaXZlZCB1bmRlcmxlbmd0aCBwYWNrZXQgbGVuZ3RoICIKKwkJICAgICAgICIlemRcbiIsIHRmdHAsIGxlbiApOworCQlnb3RvIGRvbmU7CisJfQorCWlmICggISBtZXRhLT5zcmMgKSB7CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBzb3VyY2UgcG9ydFxuIiwKKwkJICAgICAgIHRmdHAgKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIEZpbHRlciBieSBUSUQuICBTZXQgVElEIG9uIGZpcnN0IHJlc3BvbnNlIHJlY2VpdmVkICovCisJc3Rfc3JjID0gKCBzdHJ1Y3Qgc29ja2FkZHJfdGNwaXAgKiApIG1ldGEtPnNyYzsKKwlpZiAoICEgdGZ0cC0+cGVlci5zdF9mYW1pbHkgKSB7CisJCW1lbWNweSAoICZ0ZnRwLT5wZWVyLCBzdF9zcmMsIHNpemVvZiAoIHRmdHAtPnBlZXIgKSApOworCQlEQkdDICggdGZ0cCwgIlRGVFAgJXAgdXNpbmcgcmVtb3RlIHBvcnQgJWRcbiIsIHRmdHAsCisJCSAgICAgICBudG9ocyAoIHRmdHAtPnBlZXIuc3RfcG9ydCApICk7CisJfSBlbHNlIGlmICggbWVtY21wICggJnRmdHAtPnBlZXIsIHN0X3NyYywKKwkJCSAgICAgc2l6ZW9mICggdGZ0cC0+cGVlciApICkgIT0gMCApIHsKKwkJREJHQyAoIHRmdHAsICJURlRQICVwIHJlY2VpdmVkIHBhY2tldCBmcm9tIHdyb25nIHNvdXJjZSAoZ290ICIKKwkJICAgICAgICIlZCwgd2FudGVkICVkKVxuIiwgdGZ0cCwgbnRvaHMgKCBzdF9zcmMtPnN0X3BvcnQgKSwKKwkJICAgICAgIG50b2hzICggdGZ0cC0+cGVlci5zdF9wb3J0ICkgKTsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAoIGNvbW1vbi0+b3Bjb2RlICkgeworCWNhc2UgaHRvbnMgKCBURlRQX09BQ0sgKToKKwkJcmMgPSB0ZnRwX3J4X29hY2sgKCB0ZnRwLCBpb2J1Zi0+ZGF0YSwgbGVuICk7CisJCWJyZWFrOworCWNhc2UgaHRvbnMgKCBURlRQX0RBVEEgKToKKwkJcmMgPSB0ZnRwX3J4X2RhdGEgKCB0ZnRwLCBpb2JfZGlzb3duICggaW9idWYgKSApOworCQlicmVhazsKKwljYXNlIGh0b25zICggVEZUUF9FUlJPUiApOgorCQlyYyA9IHRmdHBfcnhfZXJyb3IgKCB0ZnRwLCBpb2J1Zi0+ZGF0YSwgbGVuICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR0MgKCB0ZnRwLCAiVEZUUCAlcCByZWNlaXZlZCBzdHJhbmdlIHBhY2tldCB0eXBlICVkXG4iLAorCQkgICAgICAgdGZ0cCwgbnRvaHMgKCBjb21tb24tPm9wY29kZSApICk7CisJCWJyZWFrOworCX07CisKKyBkb25lOgorCWZyZWVfaW9iICggaW9idWYgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVjZWl2ZSBuZXcgZGF0YSB2aWEgc29ja2V0CisgKgorICogQHYgc29ja2V0CQlUcmFuc3BvcnQgbGF5ZXIgaW50ZXJmYWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbWV0YQkJVHJhbnNmZXIgbWV0YWRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBfc29ja2V0X2RlbGl2ZXJfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICpzb2NrZXQsCisJCQkJICAgICBzdHJ1Y3QgaW9fYnVmZmVyICppb2J1ZiwKKwkJCQkgICAgIHN0cnVjdCB4ZmVyX21ldGFkYXRhICptZXRhICkgeworCXN0cnVjdCB0ZnRwX3JlcXVlc3QgKnRmdHAgPQorCQljb250YWluZXJfb2YgKCBzb2NrZXQsIHN0cnVjdCB0ZnRwX3JlcXVlc3QsIHNvY2tldCApOworCisJLyogRW5hYmxlIHNlbmRpbmcgQUNLcyB3aGVuIHdlIHJlY2VpdmUgYSB1bmljYXN0IHBhY2tldC4gIFRoaXMKKwkgKiBjb3ZlcnMgdGhyZWUgY2FzZXM6CisJICoKKwkgKiAxLiBTdGFuZGFyZCBURlRQOyB3ZSBzaG91bGQgYWx3YXlzIHNlbmQgQUNLcywgYW5kIHdpbGwKKwkgKiAgICBhbHdheXMgcmVjZWl2ZSBhIHVuaWNhc3QgcGFja2V0IGJlZm9yZSB3ZSBuZWVkIHRvIHNlbmQgdGhlCisJICogICAgZmlyc3QgQUNLLgorCSAqCisJICogMi4gUkZDMjA5MCBtdWx0aWNhc3QgVEZUUDsgdGhlIG9ubHkgdW5pY2FzdCBwYWNrZXRzIHdlIHdpbGwKKyAgICAgICAgICogICAgcmVjZWl2ZSBhcmUgdGhlIE9BQ0tzOyBlbmFibGUgc2VuZGluZyBBQ0tzIGhlcmUgKGJlZm9yZQorICAgICAgICAgKiAgICBwcm9jZXNzaW5nIHRoZSBPQUNLKSBhbmQgZGlzYWJsZSBpdCB3aGVuIHByb2Nlc3NpbmcgdGhlCisgICAgICAgICAqICAgIG11bHRpY2FzdCBvcHRpb24gaWYgd2UgYXJlIG5vdCB0aGUgbWFzdGVyIGNsaWVudC4KKwkgKgorCSAqIDMuIE1URlRQOyByZWNlaXZpbmcgYSB1bmljYXN0IGRhdGFncmFtIGluZGljYXRlcyB0aGF0IHdlCisJICogICAgYXJlIHRoZSAibWFzdGVyIGNsaWVudCIgYW5kIHNob3VsZCBzZW5kIEFDS3MuCisJICovCisJdGZ0cC0+ZmxhZ3MgfD0gVEZUUF9GTF9TRU5EX0FDSzsKKworCXJldHVybiB0ZnRwX3J4ICggdGZ0cCwgaW9idWYsIG1ldGEgKTsKK30KKworLyoqIFRGVFAgc29ja2V0IG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2Vfb3BlcmF0aW9ucyB0ZnRwX3NvY2tldF9vcGVyYXRpb25zID0geworCS5jbG9zZQkJPSBpZ25vcmVfeGZlcl9jbG9zZSwKKwkudnJlZGlyZWN0CT0geGZlcl92cmVvcGVuLAorCS53aW5kb3cJCT0gdW5saW1pdGVkX3hmZXJfd2luZG93LAorCS5hbGxvY19pb2IJPSBkZWZhdWx0X3hmZXJfYWxsb2NfaW9iLAorCS5kZWxpdmVyX2lvYgk9IHRmdHBfc29ja2V0X2RlbGl2ZXJfaW9iLAorCS5kZWxpdmVyX3Jhdwk9IHhmZXJfZGVsaXZlcl9hc19pb2IsCit9OworCisvKioKKyAqIFJlY2VpdmUgbmV3IGRhdGEgdmlhIG11bHRpY2FzdCBzb2NrZXQKKyAqCisgKiBAdiBtY19zb2NrZXQJCU11bHRpY2FzdCB0cmFuc3BvcnQgbGF5ZXIgaW50ZXJmYWNlCisgKiBAdiBpb2J1ZgkJSS9PIGJ1ZmZlcgorICogQHYgbWV0YQkJVHJhbnNmZXIgbWV0YWRhdGEKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBfbWNfc29ja2V0X2RlbGl2ZXJfaW9iICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICptY19zb2NrZXQsCisJCQkJCXN0cnVjdCBpb19idWZmZXIgKmlvYnVmLAorCQkJCQlzdHJ1Y3QgeGZlcl9tZXRhZGF0YSAqbWV0YSApIHsKKwlzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwID0KKwkJY29udGFpbmVyX29mICggbWNfc29ja2V0LCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0LCBtY19zb2NrZXQgKTsKKworCXJldHVybiB0ZnRwX3J4ICggdGZ0cCwgaW9idWYsIG1ldGEgKTsKK30KKworLyoqIFRGVFAgbXVsdGljYXN0IHNvY2tldCBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgdGZ0cF9tY19zb2NrZXRfb3BlcmF0aW9ucyA9IHsKKwkuY2xvc2UJCT0gaWdub3JlX3hmZXJfY2xvc2UsCisJLnZyZWRpcmVjdAk9IHhmZXJfdnJlb3BlbiwKKwkud2luZG93CQk9IHVubGltaXRlZF94ZmVyX3dpbmRvdywKKwkuYWxsb2NfaW9iCT0gZGVmYXVsdF94ZmVyX2FsbG9jX2lvYiwKKwkuZGVsaXZlcl9pb2IJPSB0ZnRwX21jX3NvY2tldF9kZWxpdmVyX2lvYiwKKwkuZGVsaXZlcl9yYXcJPSB4ZmVyX2RlbGl2ZXJfYXNfaW9iLAorfTsKKworLyoqCisgKiBDbG9zZSBURlRQIGRhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHJjCQlSZWFzb24gZm9yIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIHRmdHBfeGZlcl9jbG9zZSAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciwgaW50IHJjICkgeworCXN0cnVjdCB0ZnRwX3JlcXVlc3QgKnRmdHAgPQorCQljb250YWluZXJfb2YgKCB4ZmVyLCBzdHJ1Y3QgdGZ0cF9yZXF1ZXN0LCB4ZmVyICk7CisKKwlEQkdDICggdGZ0cCwgIlRGVFAgJXAgaW50ZXJmYWNlIGNsb3NlZDogJXNcbiIsCisJICAgICAgIHRmdHAsIHN0cmVycm9yICggcmMgKSApOworCisJdGZ0cF9kb25lICggdGZ0cCwgcmMgKTsKK30KKworLyoqCisgKiBDaGVjayBmbG93IGNvbnRyb2wgd2luZG93CisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEByZXQgbGVuCQlMZW5ndGggb2Ygd2luZG93CisgKi8KK3N0YXRpYyBzaXplX3QgdGZ0cF94ZmVyX3dpbmRvdyAoIHN0cnVjdCB4ZmVyX2ludGVyZmFjZSAqeGZlciApIHsKKwlzdHJ1Y3QgdGZ0cF9yZXF1ZXN0ICp0ZnRwID0KKwkJY29udGFpbmVyX29mICggeGZlciwgc3RydWN0IHRmdHBfcmVxdWVzdCwgeGZlciApOworCisJLyogV2UgYWJ1c2UgdGhpcyBkYXRhLXhmZXIgbWV0aG9kIHRvIGNvbnZleSB0aGUgYmxvY2tzaXplIHRvCisJICogdGhlIGNhbGxlci4gIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBkb25lIHVzaW5nIHNvbWUga2luZCBvZgorCSAqIHN0YXQoKSBtZXRob2QsIGJ1dCB3ZSBkb24ndCB5ZXQgaGF2ZSB0aGUgZmFjaWxpdHkgdG8gZG8KKwkgKiB0aGF0LgorCSAqLworCXJldHVybiB0ZnRwLT5ibGtzaXplOworfQorCisvKiogVEZUUCBkYXRhIHRyYW5zZmVyIGludGVyZmFjZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHhmZXJfaW50ZXJmYWNlX29wZXJhdGlvbnMgdGZ0cF94ZmVyX29wZXJhdGlvbnMgPSB7CisJLmNsb3NlCQk9IHRmdHBfeGZlcl9jbG9zZSwKKwkudnJlZGlyZWN0CT0gaWdub3JlX3hmZXJfdnJlZGlyZWN0LAorCS53aW5kb3cJCT0gdGZ0cF94ZmVyX3dpbmRvdywKKwkuYWxsb2NfaW9iCT0gZGVmYXVsdF94ZmVyX2FsbG9jX2lvYiwKKwkuZGVsaXZlcl9pb2IJPSB4ZmVyX2RlbGl2ZXJfYXNfcmF3LAorCS5kZWxpdmVyX3Jhdwk9IGlnbm9yZV94ZmVyX2RlbGl2ZXJfcmF3LAorfTsKKworLyoqCisgKiBJbml0aWF0ZSBURlRQL1RGVE0vTVRGVFAgZG93bmxvYWQKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdXJpCQlVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBfY29yZV9vcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBzdHJ1Y3QgdXJpICp1cmksCisJCQkgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydCwKKwkJCSAgICBzdHJ1Y3Qgc29ja2FkZHIgKm11bHRpY2FzdCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgKSB7CisJc3RydWN0IHRmdHBfcmVxdWVzdCAqdGZ0cDsKKwlpbnQgcmM7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCAhIHVyaS0+aG9zdCApCisJCXJldHVybiAtRUlOVkFMOworCWlmICggISB1cmktPnBhdGggKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEFsbG9jYXRlIGFuZCBwb3B1bGF0ZSBURlRQIHN0cnVjdHVyZSAqLworCXRmdHAgPSB6YWxsb2MgKCBzaXplb2YgKCAqdGZ0cCApICk7CisJaWYgKCAhIHRmdHAgKQorCQlyZXR1cm4gLUVOT01FTTsKKwl0ZnRwLT5yZWZjbnQuZnJlZSA9IHRmdHBfZnJlZTsKKwl4ZmVyX2luaXQgKCAmdGZ0cC0+eGZlciwgJnRmdHBfeGZlcl9vcGVyYXRpb25zLCAmdGZ0cC0+cmVmY250ICk7CisJdGZ0cC0+dXJpID0gdXJpX2dldCAoIHVyaSApOworCXhmZXJfaW5pdCAoICZ0ZnRwLT5zb2NrZXQsICZ0ZnRwX3NvY2tldF9vcGVyYXRpb25zLCAmdGZ0cC0+cmVmY250ICk7CisJeGZlcl9pbml0ICggJnRmdHAtPm1jX3NvY2tldCwgJnRmdHBfbWNfc29ja2V0X29wZXJhdGlvbnMsCisJCSAgICAmdGZ0cC0+cmVmY250ICk7CisJdGZ0cC0+Ymxrc2l6ZSA9IFRGVFBfREVGQVVMVF9CTEtTSVpFOworCXRmdHAtPmZsYWdzID0gZmxhZ3M7CisJdGZ0cC0+dGltZXIuZXhwaXJlZCA9IHRmdHBfdGltZXJfZXhwaXJlZDsKKworCS8qIE9wZW4gc29ja2V0ICovCisJdGZ0cC0+cG9ydCA9IHVyaV9wb3J0ICggdGZ0cC0+dXJpLCBkZWZhdWx0X3BvcnQgKTsKKwlpZiAoICggcmMgPSB0ZnRwX3Jlb3BlbiAoIHRmdHAgKSApICE9IDAgKQorCQlnb3RvIGVycjsKKworCS8qIE9wZW4gbXVsdGljYXN0IHNvY2tldCAqLworCWlmICggbXVsdGljYXN0ICkgeworCQlpZiAoICggcmMgPSB0ZnRwX3Jlb3Blbl9tYyAoIHRmdHAsIG11bHRpY2FzdCApICkgIT0gMCApCisJCQlnb3RvIGVycjsKKwl9CisKKwkvKiBTdGFydCB0aW1lciB0byBpbml0aWF0ZSBSUlEgKi8KKwlzdGFydF90aW1lcl9ub2RlbGF5ICggJnRmdHAtPnRpbWVyICk7CisKKwkvKiBBdHRhY2ggdG8gcGFyZW50IGludGVyZmFjZSwgbW9ydGFsaXNlIHNlbGYsIGFuZCByZXR1cm4gKi8KKwl4ZmVyX3BsdWdfcGx1ZyAoICZ0ZnRwLT54ZmVyLCB4ZmVyICk7CisJcmVmX3B1dCAoICZ0ZnRwLT5yZWZjbnQgKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlEQkdDICggdGZ0cCwgIlRGVFAgJXAgY291bGQgbm90IGNyZWF0ZSByZXF1ZXN0OiAlc1xuIiwKKwkgICAgICAgdGZ0cCwgc3RyZXJyb3IgKCByYyApICk7CisJdGZ0cF9kb25lICggdGZ0cCwgcmMgKTsKKwlyZWZfcHV0ICggJnRmdHAtPnJlZmNudCApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBJbml0aWF0ZSBURlRQIGRvd25sb2FkCisgKgorICogQHYgeGZlcgkJRGF0YSB0cmFuc2ZlciBpbnRlcmZhY2UKKyAqIEB2IHVyaQkJVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyCisgKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKKyAqLworc3RhdGljIGludCB0ZnRwX29wZW4gKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIHN0cnVjdCB1cmkgKnVyaSApIHsKKwlyZXR1cm4gdGZ0cF9jb3JlX29wZW4gKCB4ZmVyLCB1cmksIFRGVFBfUE9SVCwgTlVMTCwKKwkJCQlURlRQX0ZMX1JSUV9TSVpFUyApOworCit9CisKKy8qKiBURlRQIFVSSSBvcGVuZXIgKi8KK3N0cnVjdCB1cmlfb3BlbmVyIHRmdHBfdXJpX29wZW5lciBfX3VyaV9vcGVuZXIgPSB7CisJLnNjaGVtZQk9ICJ0ZnRwIiwKKwkub3Blbgk9IHRmdHBfb3BlbiwKK307CisKKy8qKgorICogSW5pdGlhdGUgVEZUUC1zaXplIHJlcXVlc3QKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdXJpCQlVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHRmdHBzaXplX29wZW4gKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIHN0cnVjdCB1cmkgKnVyaSApIHsKKwlyZXR1cm4gdGZ0cF9jb3JlX29wZW4gKCB4ZmVyLCB1cmksIFRGVFBfUE9SVCwgTlVMTCwKKwkJCQkoIFRGVFBfRkxfUlJRX1NJWkVTIHwKKwkJCQkgIFRGVFBfRkxfU0laRU9OTFkgKSApOworCit9CisKKy8qKiBURlRQIFVSSSBvcGVuZXIgKi8KK3N0cnVjdCB1cmlfb3BlbmVyIHRmdHBzaXplX3VyaV9vcGVuZXIgX191cmlfb3BlbmVyID0geworCS5zY2hlbWUJPSAidGZ0cHNpemUiLAorCS5vcGVuCT0gdGZ0cHNpemVfb3BlbiwKK307CisKKy8qKgorICogSW5pdGlhdGUgVEZUTSBkb3dubG9hZAorICoKKyAqIEB2IHhmZXIJCURhdGEgdHJhbnNmZXIgaW50ZXJmYWNlCisgKiBAdiB1cmkJCVVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGZ0bV9vcGVuICggc3RydWN0IHhmZXJfaW50ZXJmYWNlICp4ZmVyLCBzdHJ1Y3QgdXJpICp1cmkgKSB7CisJcmV0dXJuIHRmdHBfY29yZV9vcGVuICggeGZlciwgdXJpLCBURlRQX1BPUlQsIE5VTEwsCisJCQkJKCBURlRQX0ZMX1JSUV9TSVpFUyB8CisJCQkJICBURlRQX0ZMX1JSUV9NVUxUSUNBU1QgKSApOworCit9CisKKy8qKiBURlRNIFVSSSBvcGVuZXIgKi8KK3N0cnVjdCB1cmlfb3BlbmVyIHRmdG1fdXJpX29wZW5lciBfX3VyaV9vcGVuZXIgPSB7CisJLnNjaGVtZQk9ICJ0ZnRtIiwKKwkub3Blbgk9IHRmdG1fb3BlbiwKK307CisKKy8qKgorICogSW5pdGlhdGUgTVRGVFAgZG93bmxvYWQKKyAqCisgKiBAdiB4ZmVyCQlEYXRhIHRyYW5zZmVyIGludGVyZmFjZQorICogQHYgdXJpCQlVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IG10ZnRwX29wZW4gKCBzdHJ1Y3QgeGZlcl9pbnRlcmZhY2UgKnhmZXIsIHN0cnVjdCB1cmkgKnVyaSApIHsKKwlyZXR1cm4gdGZ0cF9jb3JlX29wZW4gKCB4ZmVyLCB1cmksIE1URlRQX1BPUlQsCisJCQkJKCBzdHJ1Y3Qgc29ja2FkZHIgKiApICZ0ZnRwX210ZnRwX3NvY2tldCwKKwkJCQlURlRQX0ZMX01URlRQX1JFQ09WRVJZICk7Cit9CisKKy8qKiBNVEZUUCBVUkkgb3BlbmVyICovCitzdHJ1Y3QgdXJpX29wZW5lciBtdGZ0cF91cmlfb3BlbmVyIF9fdXJpX29wZW5lciA9IHsKKwkuc2NoZW1lCT0gIm10ZnRwIiwKKwkub3Blbgk9IG10ZnRwX29wZW4sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0dGluZ3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqIFRGVFAgc2VydmVyIHNldHRpbmcgKi8KK3N0cnVjdCBzZXR0aW5nIG5leHRfc2VydmVyX3NldHRpbmcgX19zZXR0aW5nID0geworCS5uYW1lID0gIm5leHQtc2VydmVyIiwKKwkuZGVzY3JpcHRpb24gPSAiVEZUUCBzZXJ2ZXIiLAorCS50YWcgPSBESENQX0VCX1NJQUREUiwKKwkudHlwZSA9ICZzZXR0aW5nX3R5cGVfaXB2NCwKK307CisKKy8qKgorICogQXBwbHkgVEZUUCBjb25maWd1cmF0aW9uIHNldHRpbmdzCisgKgorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgdGZ0cF9hcHBseV9zZXR0aW5ncyAoIHZvaWQgKSB7CisJc3RhdGljIHN0cnVjdCBpbl9hZGRyIHRmdHBfc2VydmVyID0geyAwIH07CisJc3RydWN0IGluX2FkZHIgbGFzdF90ZnRwX3NlcnZlcjsKKwljaGFyIHVyaV9zdHJpbmdbMzJdOworCXN0cnVjdCB1cmkgKnVyaTsKKworCS8qIFJldHJpZXZlIFRGVFAgc2VydmVyIHNldHRpbmcgKi8KKwlsYXN0X3RmdHBfc2VydmVyID0gdGZ0cF9zZXJ2ZXI7CisJZmV0Y2hfaXB2NF9zZXR0aW5nICggTlVMTCwgJm5leHRfc2VydmVyX3NldHRpbmcsICZ0ZnRwX3NlcnZlciApOworCisJLyogSWYgVEZUUCBzZXJ2ZXIgc2V0dGluZyBoYXMgY2hhbmdlZCwgc2V0IHRoZSBjdXJyZW50IHdvcmtpbmcKKwkgKiBVUkkgdG8gbWF0Y2guICBEbyBpdCBvbmx5IHdoZW4gdGhlIFRGVFAgc2VydmVyIGhhcyBjaGFuZ2VkCisJICogdG8gdHJ5IHRvIG1pbmltaXNlIHN1cnByaXNlcyB0byB0aGUgdXNlciwgd2hvIHByb2JhYmx5CisJICogd29uJ3QgZXhwZWN0IHRoZSBDV1VSSSB0byBjaGFuZ2UganVzdCBiZWNhdXNlIHRoZXkgdXBkYXRlZAorCSAqIGFuIHVucmVsYXRlZCBzZXR0aW5nIGFuZCB0cmlnZ2VyZWQgYWxsIHRoZSBzZXR0aW5ncworCSAqIGFwcGxpY2F0b3JzLgorCSAqLworCWlmICggdGZ0cF9zZXJ2ZXIuc19hZGRyICE9IGxhc3RfdGZ0cF9zZXJ2ZXIuc19hZGRyICkgeworCQlzbnByaW50ZiAoIHVyaV9zdHJpbmcsIHNpemVvZiAoIHVyaV9zdHJpbmcgKSwKKwkJCSAgICJ0ZnRwOi8vJXMvIiwgaW5ldF9udG9hICggdGZ0cF9zZXJ2ZXIgKSApOworCQl1cmkgPSBwYXJzZV91cmkgKCB1cmlfc3RyaW5nICk7CisJCWlmICggISB1cmkgKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWNodXJpICggdXJpICk7CisJCXVyaV9wdXQgKCB1cmkgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqIFRGVFAgc2V0dGluZ3MgYXBwbGljYXRvciAqLworc3RydWN0IHNldHRpbmdzX2FwcGxpY2F0b3IgdGZ0cF9zZXR0aW5nc19hcHBsaWNhdG9yIF9fc2V0dGluZ3NfYXBwbGljYXRvciA9IHsKKwkuYXBwbHkgPSB0ZnRwX2FwcGx5X3NldHRpbmdzLAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL3Vzci9hdXRvYm9vdC5jIGIvZ3B4ZS9zcmMvdXNyL2F1dG9ib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhMTBlNgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL3Vzci9hdXRvYm9vdC5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9kaGNwLmg+CisjaW5jbHVkZSA8Z3B4ZS9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPGdweGUvaW1hZ2UuaD4KKyNpbmNsdWRlIDxncHhlL3NhbmJvb3QuaD4KKyNpbmNsdWRlIDxncHhlL3VyaS5oPgorI2luY2x1ZGUgPHVzci9pZm1nbXQuaD4KKyNpbmNsdWRlIDx1c3Ivcm91dGUuaD4KKyNpbmNsdWRlIDx1c3IvZGhjcG1nbXQuaD4KKyNpbmNsdWRlIDx1c3IvaW1nbWdtdC5oPgorI2luY2x1ZGUgPHVzci9hdXRvYm9vdC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBBdXRvbWF0aWMgYm9vdGluZworICoKKyAqLworCisvKiogU2h1dGRvd24gZmxhZ3MgZm9yIGV4aXQgKi8KK2ludCBzaHV0ZG93bl9leGl0X2ZsYWdzID0gMDsKKworLyoqCisgKiBJZGVudGlmeSB0aGUgYm9vdCBuZXR3b3JrIGRldmljZQorICoKKyAqIEByZXQgbmV0ZGV2CQlCb290IG5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIGZpbmRfYm9vdF9uZXRkZXYgKCB2b2lkICkgeworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIEJvb3QgdXNpbmcgbmV4dC1zZXJ2ZXIgYW5kIGZpbGVuYW1lCisgKgorICogQHYgZmlsZW5hbWUJCUJvb3QgZmlsZW5hbWUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgYm9vdF9uZXh0X3NlcnZlcl9hbmRfZmlsZW5hbWUgKCBzdHJ1Y3QgaW5fYWRkciBuZXh0X3NlcnZlciwKKwkJCQkgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgKSB7CisJc3RydWN0IHVyaSAqdXJpOworCXN0cnVjdCBpbWFnZSAqaW1hZ2U7CisJY2hhciBidWZbIDIzIC8qIHRmdHA6Ly94eHgueHh4Lnh4eC54eHgvICovICsKKwkJICAoIDMgKiBzdHJsZW4oZmlsZW5hbWUpICkgLyogY29tcGxldGVseSBVUkktZW5jb2RlZCAqLworCQkgICsgMSAvKiBOVUwgKi8gXTsKKwlpbnQgZmlsZW5hbWVfaXNfYWJzb2x1dGU7CisJaW50IHJjOworCisJLyogQ29uc3RydWN0IFVSSSAqLworCXVyaSA9IHBhcnNlX3VyaSAoIGZpbGVuYW1lICk7CisJaWYgKCAhIHVyaSApCisJCXJldHVybiAtRU5PTUVNOworCWZpbGVuYW1lX2lzX2Fic29sdXRlID0gdXJpX2lzX2Fic29sdXRlICggdXJpICk7CisJdXJpX3B1dCAoIHVyaSApOworCWlmICggISBmaWxlbmFtZV9pc19hYnNvbHV0ZSApIHsKKwkJLyogQ29uc3RydWN0IGEgdGZ0cDovLyBVUkkgZm9yIHRoZSBmaWxlbmFtZS4gIFdlIGNhbid0CisJCSAqIGp1c3QgcmVseSBvbiB0aGUgY3VycmVudCB3b3JraW5nIFVSSSwgYmVjYXVzZSB0aGUKKwkJICogcmVsYXRpdmUgVVJJIHJlc29sdXRpb24gd2lsbCByZW1vdmUgdGhlIGRpc3RpbmN0aW9uCisJCSAqIGJldHdlZW4gZmlsZW5hbWVzIHdpdGggYW5kIHdpdGhvdXQgaW5pdGlhbCBzbGFzaGVzLAorCQkgKiB3aGljaCBpcyBzaWduaWZpY2FudCBmb3IgVEZUUC4KKwkJICovCisJCXNucHJpbnRmICggYnVmLCBzaXplb2YgKCBidWYgKSwgInRmdHA6Ly8lcy8iLAorCQkJICAgaW5ldF9udG9hICggbmV4dF9zZXJ2ZXIgKSApOworCQl1cmlfZW5jb2RlICggZmlsZW5hbWUsIGJ1ZiArIHN0cmxlbiAoIGJ1ZiApLAorCQkJICAgICBzaXplb2YgKCBidWYgKSAtIHN0cmxlbiAoIGJ1ZiApLCBVUklfUEFUSCApOworCQlmaWxlbmFtZSA9IGJ1ZjsKKwl9CisKKwlpbWFnZSA9IGFsbG9jX2ltYWdlKCk7CisJaWYgKCAhIGltYWdlICkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCAoIHJjID0gaW1nZmV0Y2ggKCBpbWFnZSwgZmlsZW5hbWUsCisJCQkgICAgICAgcmVnaXN0ZXJfYW5kX2F1dG9sb2FkX2ltYWdlICkgKSAhPSAwICkgeworCQlnb3RvIGRvbmU7CisJfQorCWlmICggKCByYyA9IGltZ2V4ZWMgKCBpbWFnZSApICkgIT0gMCApCisJCWdvdG8gZG9uZTsKKworIGRvbmU6CisJaW1hZ2VfcHV0ICggaW1hZ2UgKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogQm9vdCB1c2luZyByb290IHBhdGgKKyAqCisgKiBAdiByb290X3BhdGgJCVJvb3QgcGF0aAorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBib290X3Jvb3RfcGF0aCAoIGNvbnN0IGNoYXIgKnJvb3RfcGF0aCApIHsKKwlzdHJ1Y3Qgc2FuYm9vdF9wcm90b2NvbCAqc2FuYm9vdDsKKworCS8qIFF1aWNrIGhhY2sgKi8KKwlmb3JfZWFjaF90YWJsZV9lbnRyeSAoIHNhbmJvb3QsIFNBTkJPT1RfUFJPVE9DT0xTICkgeworCQlpZiAoIHN0cm5jbXAgKCByb290X3BhdGgsIHNhbmJvb3QtPnByZWZpeCwKKwkJCSAgICAgICBzdHJsZW4gKCBzYW5ib290LT5wcmVmaXggKSApID09IDAgKSB7CisJCQlyZXR1cm4gc2FuYm9vdC0+Ym9vdCAoIHJvb3RfcGF0aCApOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9UU1VQOworfQorCisvKioKKyAqIEJvb3QgZnJvbSBhIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbmV0Ym9vdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKSB7CisJc3RydWN0IHNldHRpbmcgdmVuZG9yX2NsYXNzX2lkX3NldHRpbmcKKwkJPSB7IC50YWcgPSBESENQX1ZFTkRPUl9DTEFTU19JRCB9OworCXN0cnVjdCBzZXR0aW5nIHB4ZV9kaXNjb3ZlcnlfY29udHJvbF9zZXR0aW5nCisJCT0geyAudGFnID0gREhDUF9QWEVfRElTQ09WRVJZX0NPTlRST0wgfTsKKwlzdHJ1Y3Qgc2V0dGluZyBweGVfYm9vdF9tZW51X3NldHRpbmcKKwkJPSB7IC50YWcgPSBESENQX1BYRV9CT09UX01FTlUgfTsKKwljaGFyIGJ1ZlsyNTZdOworCXN0cnVjdCBpbl9hZGRyIG5leHRfc2VydmVyOworCXVuc2lnbmVkIGludCBweGVfZGlzY292ZXJ5X2NvbnRyb2w7CisJaW50IHJjOworCisJLyogT3BlbiBkZXZpY2UgYW5kIGRpc3BsYXkgZGV2aWNlIHN0YXR1cyAqLworCWlmICggKCByYyA9IGlmb3BlbiAoIG5ldGRldiApICkgIT0gMCApCisJCXJldHVybiByYzsKKwlpZnN0YXQgKCBuZXRkZXYgKTsKKworCS8qIENvbmZpZ3VyZSBkZXZpY2UgdmlhIERIQ1AgKi8KKwlpZiAoICggcmMgPSBkaGNwICggbmV0ZGV2ICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCXJvdXRlKCk7CisKKwkvKiBUcnkgUFhFIG1lbnUgYm9vdCwgaWYgYXBwbGljYWJsZSAqLworCWZldGNoX3N0cmluZ19zZXR0aW5nICggTlVMTCwgJnZlbmRvcl9jbGFzc19pZF9zZXR0aW5nLAorCQkJICAgICAgIGJ1Ziwgc2l6ZW9mICggYnVmICkgKTsKKwlweGVfZGlzY292ZXJ5X2NvbnRyb2wgPQorCQlmZXRjaF91aW50el9zZXR0aW5nICggTlVMTCwgJnB4ZV9kaXNjb3ZlcnlfY29udHJvbF9zZXR0aW5nICk7CisJaWYgKCAoIHN0cmNtcCAoIGJ1ZiwgIlBYRUNsaWVudCIgKSA9PSAwICkgJiYgcHhlX21lbnVfYm9vdCAhPSBOVUxMICYmCisJICAgICBzZXR0aW5nX2V4aXN0cyAoIE5VTEwsICZweGVfYm9vdF9tZW51X3NldHRpbmcgKSAmJgorCSAgICAgKCAhICggKCBweGVfZGlzY292ZXJ5X2NvbnRyb2wgJiBQWEVCU19TS0lQICkgJiYKKwkJICAgc2V0dGluZ19leGlzdHMgKCBOVUxMLCAmZmlsZW5hbWVfc2V0dGluZyApICkgKSApIHsKKwkJcHJpbnRmICggIkJvb3RpbmcgZnJvbSBQWEUgbWVudVxuIiApOworCQlyZXR1cm4gcHhlX21lbnVfYm9vdCAoIG5ldGRldiApOworCX0KKworCS8qIFRyeSB0byBkb3dubG9hZCBhbmQgYm9vdCB3aGF0ZXZlciB3ZSBhcmUgZ2l2ZW4gYXMgYSBmaWxlbmFtZSAqLworCWZldGNoX2lwdjRfc2V0dGluZyAoIE5VTEwsICZuZXh0X3NlcnZlcl9zZXR0aW5nLCAmbmV4dF9zZXJ2ZXIgKTsKKwlmZXRjaF9zdHJpbmdfc2V0dGluZyAoIE5VTEwsICZmaWxlbmFtZV9zZXR0aW5nLCBidWYsIHNpemVvZiAoIGJ1ZiApICk7CisJaWYgKCBidWZbMF0gKSB7CisJCXByaW50ZiAoICJCb290aW5nIGZyb20gZmlsZW5hbWUgXCIlc1wiXG4iLCBidWYgKTsKKwkJaWYgKCAoIHJjID0gYm9vdF9uZXh0X3NlcnZlcl9hbmRfZmlsZW5hbWUgKCBuZXh0X3NlcnZlciwKKwkJCQkJCQkgICAgYnVmICkgKSAhPSAwICkgeworCQkJcHJpbnRmICggIkNvdWxkIG5vdCBib290IGZyb20gZmlsZW5hbWUgXCIlc1wiOiAlc1xuIiwKKwkJCQkgYnVmLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJCisJLyogTm8gZmlsZW5hbWU7IHRyeSB0aGUgcm9vdCBwYXRoICovCisJZmV0Y2hfc3RyaW5nX3NldHRpbmcgKCBOVUxMLCAmcm9vdF9wYXRoX3NldHRpbmcsIGJ1Ziwgc2l6ZW9mICggYnVmICkgKTsKKwlpZiAoIGJ1ZlswXSApIHsKKwkJcHJpbnRmICggIkJvb3RpbmcgZnJvbSByb290IHBhdGggXCIlc1wiXG4iLCBidWYgKTsKKwkJaWYgKCAoIHJjID0gYm9vdF9yb290X3BhdGggKCBidWYgKSApICE9IDAgKSB7CisJCQlwcmludGYgKCAiQ291bGQgbm90IGJvb3QgZnJvbSByb290IHBhdGggXCIlc1wiOiAlc1xuIiwKKwkJCQkgYnVmLCBzdHJlcnJvciAoIHJjICkgKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGYgKCAiTm8gZmlsZW5hbWUgb3Igcm9vdCBwYXRoIHNwZWNpZmllZFxuIiApOworCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqIENsb3NlIGFsbCBvcGVuIG5ldCBkZXZpY2VzCisgKgorICogQ2FsbGVkIGJlZm9yZSBhIGZyZXNoIGJvb3QgYXR0ZW1wdCBpbiBvcmRlciB0byBmcmVlIHVwIG1lbW9yeS4gIFdlCisgKiBkb24ndCBqdXN0IGNsb3NlIHRoZSBkZXZpY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGJvb3QgZmFpbHMsCisgKiBiZWNhdXNlIHRoZXJlIG1heSBzdGlsbCBiZSBUQ1AgY29ubmVjdGlvbnMgaW4gdGhlIHByb2Nlc3Mgb2YKKyAqIGNsb3NpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGNsb3NlX2FsbF9uZXRkZXZzICggdm9pZCApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJZm9yX2VhY2hfbmV0ZGV2ICggbmV0ZGV2ICkgeworCQlpZmNsb3NlICggbmV0ZGV2ICk7CisJfQorfQorCisvKioKKyAqIEJvb3QgdGhlIHN5c3RlbQorICovCit2b2lkIGF1dG9ib290ICggdm9pZCApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqYm9vdF9uZXRkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCS8qIElmIHdlIGhhdmUgYW4gaWRlbnRpZmFibGUgYm9vdCBkZXZpY2UsIHRyeSB0aGF0IGZpcnN0ICovCisJY2xvc2VfYWxsX25ldGRldnMoKTsKKwlpZiAoICggYm9vdF9uZXRkZXYgPSBmaW5kX2Jvb3RfbmV0ZGV2KCkgKSApCisJCW5ldGJvb3QgKCBib290X25ldGRldiApOworCisJLyogSWYgdGhhdCBmYWlscywgdHJ5IGJvb3RpbmcgZnJvbSBhbnkgb2YgdGhlIG90aGVyIGRldmljZXMgKi8KKwlmb3JfZWFjaF9uZXRkZXYgKCBuZXRkZXYgKSB7CisJCWlmICggbmV0ZGV2ID09IGJvb3RfbmV0ZGV2ICkKKwkJCWNvbnRpbnVlOworCQljbG9zZV9hbGxfbmV0ZGV2cygpOworCQluZXRib290ICggbmV0ZGV2ICk7CisJfQorCisJcHJpbnRmICggIk5vIG1vcmUgbmV0d29yayBkZXZpY2VzXG4iICk7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy91c3IvZGhjcG1nbXQuYyBiL2dweGUvc3JjL3Vzci9kaGNwbWdtdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MmEzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91c3IvZGhjcG1nbXQuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9kaGNwLmg+CisjaW5jbHVkZSA8Z3B4ZS9tb25vam9iLmg+CisjaW5jbHVkZSA8Z3B4ZS9wcm9jZXNzLmg+CisjaW5jbHVkZSA8dXNyL2lmbWdtdC5oPgorI2luY2x1ZGUgPHVzci9kaGNwbWdtdC5oPgorCisjZGVmaW5lIExJTktfV0FJVF9NUwkxNTAwMAorCisvKiogQGZpbGUKKyAqCisgKiBESENQIG1hbmFnZW1lbnQKKyAqCisgKi8KKworaW50IGRoY3AgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXVpbnQ4X3QgKmNoYWRkcjsKKwl1aW50OF90IGhsZW47CisJdWludDE2X3QgZmxhZ3M7CisJaW50IHJjOworCisJLyogQ2hlY2sgd2UgY2FuIG9wZW4gdGhlIGludGVyZmFjZSBmaXJzdCAqLworCWlmICggKCByYyA9IGlmb3BlbiAoIG5ldGRldiApICkgIT0gMCApCisJCXJldHVybiByYzsKKworCS8qIFdhaXQgZm9yIGxpbmstdXAgKi8KKwlpZiAoICggcmMgPSBpZmxpbmt3YWl0ICggbmV0ZGV2LCBMSU5LX1dBSVRfTVMgKSApICE9IDAgKQorCQlyZXR1cm4gcmM7CisKKwkvKiBQZXJmb3JtIERIQ1AgKi8KKwljaGFkZHIgPSBkaGNwX2NoYWRkciAoIG5ldGRldiwgJmhsZW4sICZmbGFncyApOworCXByaW50ZiAoICJESENQICglcyAiLCBuZXRkZXYtPm5hbWUgKTsKKwl3aGlsZSAoIGhsZW4tLSApCisJCXByaW50ZiAoICIlMDJ4JWMiLCAqKGNoYWRkcisrKSwgKCBobGVuID8gJzonIDogJyknICkgKTsKKworCWlmICggKCByYyA9IHN0YXJ0X2RoY3AgKCAmbW9ub2pvYiwgbmV0ZGV2ICkgKSA9PSAwICkgeworCQlyYyA9IG1vbm9qb2Jfd2FpdCAoICIiICk7CisJfSBlbHNlIGlmICggcmMgPiAwICkgeworCQlwcmludGYgKCAiIHVzaW5nIGNhY2hlZFxuIiApOworCQlyYyA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgcHhlYnMgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1bnNpZ25lZCBpbnQgcHhlX3R5cGUgKSB7CisJaW50IHJjOworCisJLyogUGVyZm9ybSBQWEUgQm9vdCBTZXJ2ZXIgRGlzY292ZXJ5ICovCisJcHJpbnRmICggIlBYRUJTICglcyB0eXBlICVkKSIsIG5ldGRldi0+bmFtZSwgcHhlX3R5cGUgKTsKKwlpZiAoICggcmMgPSBzdGFydF9weGVicyAoICZtb25vam9iLCBuZXRkZXYsIHB4ZV90eXBlICkgKSA9PSAwICkKKwkJcmMgPSBtb25vam9iX3dhaXQgKCAiIiApOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXNyL2lmbWdtdC5jIGIvZ3B4ZS9zcmMvdXNyL2lmbWdtdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Y2M1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91c3IvaWZtZ210LmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2luY2x1ZGUgPGdweGUvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Z3B4ZS9kZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxncHhlL2tleXMuaD4KKyNpbmNsdWRlIDx1c3IvaWZtZ210Lmg+CisKKy8qKiBAZmlsZQorICoKKyAqIE5ldHdvcmsgaW50ZXJmYWNlIG1hbmFnZW1lbnQKKyAqCisgKi8KKworLyoqCisgKiBPcGVuIG5ldHdvcmsgZGV2aWNlCisgKgorICogQHYgbmV0ZGV2CQlOZXR3b3JrIGRldmljZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpZm9wZW4gKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCWludCByYzsKKworCWlmICggKCByYyA9IG5ldGRldl9vcGVuICggbmV0ZGV2ICkgKSAhPSAwICkgeworCQlwcmludGYgKCAiQ291bGQgbm90IG9wZW4gJXM6ICVzXG4iLAorCQkJIG5ldGRldi0+bmFtZSwgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBDbG9zZSBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqLwordm9pZCBpZmNsb3NlICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwluZXRkZXZfY2xvc2UgKCBuZXRkZXYgKTsKK30KKworLyoqCisgKiBQcmludCBuZXR3b3JrIGRldmljZSBlcnJvciBicmVha2Rvd24KKyAqCisgKiBAdiBzdGF0cwkJTmV0d29yayBkZXZpY2Ugc3RhdGlzdGljcworICogQHYgcHJlZml4CQlNZXNzYWdlIHByZWZpeAorICovCitzdGF0aWMgdm9pZCBpZnN0YXRfZXJyb3JzICggc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzLAorCQkJICAgIGNvbnN0IGNoYXIgKnByZWZpeCApIHsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8ICggc2l6ZW9mICggc3RhdHMtPmVycm9ycyApIC8KKwkJCSAgICBzaXplb2YgKCBzdGF0cy0+ZXJyb3JzWzBdICkgKSA7IGkrKyApIHsKKwkJaWYgKCBzdGF0cy0+ZXJyb3JzW2ldLmNvdW50ICkKKwkJCXByaW50ZiAoICIgIFslczogJWQgeCBcIiVzXCJdXG4iLCBwcmVmaXgsCisJCQkJIHN0YXRzLT5lcnJvcnNbaV0uY291bnQsCisJCQkJIHN0cmVycm9yICggc3RhdHMtPmVycm9yc1tpXS5yYyApICk7CisJfQorfQorCisvKioKKyAqIFByaW50IHN0YXR1cyBvZiBuZXR3b3JrIGRldmljZQorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqLwordm9pZCBpZnN0YXQgKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICkgeworCXByaW50ZiAoICIlczogJXMgb24gJXMgKCVzKVxuIgorCQkgIiAgW0xpbms6JXMsIFRYOiVkIFRYRTolZCBSWDolZCBSWEU6JWRdXG4iLAorCQkgbmV0ZGV2LT5uYW1lLCBuZXRkZXZfYWRkciAoIG5ldGRldiApLCBuZXRkZXYtPmRldi0+bmFtZSwKKwkJICggKCBuZXRkZXYtPnN0YXRlICYgTkVUREVWX09QRU4gKSA/ICJvcGVuIiA6ICJjbG9zZWQiICksCisJCSAoIG5ldGRldl9saW5rX29rICggbmV0ZGV2ICkgPyAidXAiIDogImRvd24iICksCisJCSBuZXRkZXYtPnR4X3N0YXRzLmdvb2QsIG5ldGRldi0+dHhfc3RhdHMuYmFkLAorCQkgbmV0ZGV2LT5yeF9zdGF0cy5nb29kLCBuZXRkZXYtPnJ4X3N0YXRzLmJhZCApOworCWlmICggISBuZXRkZXZfbGlua19vayAoIG5ldGRldiApICkgeworCQlwcmludGYgKCAiICBbTGluayBzdGF0dXM6ICVzXVxuIiwKKwkJCSBzdHJlcnJvciAoIG5ldGRldi0+bGlua19yYyApICk7CisJfQorCWlmc3RhdF9lcnJvcnMgKCAmbmV0ZGV2LT50eF9zdGF0cywgIlRYRSIgKTsKKwlpZnN0YXRfZXJyb3JzICggJm5ldGRldi0+cnhfc3RhdHMsICJSWEUiICk7Cit9CisKKy8qKgorICogV2FpdCBmb3IgbGluay11cCwgd2l0aCBzdGF0dXMgaW5kaWNhdGlvbgorICoKKyAqIEB2IG5ldGRldgkJTmV0d29yayBkZXZpY2UKKyAqIEB2IG1heF93YWl0X21zCU1heGltdW0gdGltZSB0byB3YWl0LCBpbiBtcworICovCitpbnQgaWZsaW5rd2FpdCAoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVuc2lnbmVkIGludCBtYXhfd2FpdF9tcyApIHsKKwlpbnQga2V5OworCWludCByYzsKKworCWlmICggbmV0ZGV2X2xpbmtfb2sgKCBuZXRkZXYgKSApCisJCXJldHVybiAwOworCisJcHJpbnRmICggIldhaXRpbmcgZm9yIGxpbmstdXAgb24gJXMuLi4iLCBuZXRkZXYtPm5hbWUgKTsKKworCXdoaWxlICggMSApIHsKKwkJaWYgKCBuZXRkZXZfbGlua19vayAoIG5ldGRldiApICkgeworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCBtYXhfd2FpdF9tcy0tID09IDAgKSB7CisJCQlyYyA9IG5ldGRldi0+bGlua19yYzsKKwkJCWJyZWFrOworCQl9CisJCXN0ZXAoKTsKKwkJaWYgKCBpc2tleSgpICkgeworCQkJa2V5ID0gZ2V0Y2hhcigpOworCQkJaWYgKCBrZXkgPT0gQ1RSTF9DICkgeworCQkJCXJjID0gLUVDQU5DRUxFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQltZGVsYXkgKCAxICk7CisJfQorCisJaWYgKCByYyA9PSAwICkgeworCQlwcmludGYgKCAiIG9rXG4iICk7CisJfSBlbHNlIHsKKwkJcHJpbnRmICggIiBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoIHJjICkgKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy91c3IvaW1nbWdtdC5jIGIvZ3B4ZS9zcmMvdXNyL2ltZ21nbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjNlM2YwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXNyL2ltZ21nbXQuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxncHhlL2ltYWdlLmg+CisjaW5jbHVkZSA8Z3B4ZS9kb3dubG9hZGVyLmg+CisjaW5jbHVkZSA8Z3B4ZS9tb25vam9iLmg+CisjaW5jbHVkZSA8Z3B4ZS9vcGVuLmg+CisjaW5jbHVkZSA8Z3B4ZS91cmkuaD4KKyNpbmNsdWRlIDx1c3IvaW1nbWdtdC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBJbWFnZSBtYW5hZ2VtZW50CisgKgorICovCisKKy8qKgorICogRmV0Y2ggYW4gaW1hZ2UKKyAqCisgKiBAdiB1cmlfc3RyaW5nCVVSSSBhcyBhIHN0cmluZyAoZS5nLiAiaHR0cDovL3d3dy5ub3doZXJlLmNvbS92bWxpbnV6IikKKyAqIEB2IG5hbWUJCU5hbWUgZm9yIGltYWdlLCBvciBOVUxMCisgKiBAdiByZWdpc3Rlcl9pbWFnZQlJbWFnZSByZWdpc3RyYXRpb24gcm91dGluZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpbWdmZXRjaCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UsIGNvbnN0IGNoYXIgKnVyaV9zdHJpbmcsCisJICAgICAgIGludCAoICogaW1hZ2VfcmVnaXN0ZXIgKSAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSApIHsKKwljaGFyIHVyaV9zdHJpbmdfcmVkYWN0ZWRbIHN0cmxlbiAoIHVyaV9zdHJpbmcgKSArIDMgLyogIioqKiIgKi8KKwkJCQkgICsgMSAvKiBOVUwgKi8gXTsKKwlzdHJ1Y3QgdXJpICp1cmk7CisJY29uc3QgY2hhciAqcGFzc3dvcmQ7CisJaW50IHJjOworCisJaWYgKCAhICggdXJpID0gcGFyc2VfdXJpICggdXJpX3N0cmluZyApICkgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWltYWdlX3NldF91cmkgKCBpbWFnZSwgdXJpICk7CisKKwkvKiBSZWRhY3QgcGFzc3dvcmQgcG9ydGlvbiBvZiBVUkksIGlmIG5lY2Vzc2FyeSAqLworCXBhc3N3b3JkID0gdXJpLT5wYXNzd29yZDsKKwlpZiAoIHBhc3N3b3JkICkKKwkJdXJpLT5wYXNzd29yZCA9ICIqKioiOworCXVucGFyc2VfdXJpICggdXJpX3N0cmluZ19yZWRhY3RlZCwgc2l6ZW9mICggdXJpX3N0cmluZ19yZWRhY3RlZCApLAorCQkgICAgICB1cmksIFVSSV9BTEwgKTsKKwl1cmktPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisKKwlpZiAoICggcmMgPSBjcmVhdGVfZG93bmxvYWRlciAoICZtb25vam9iLCBpbWFnZSwgaW1hZ2VfcmVnaXN0ZXIsCisJCQkJCUxPQ0FUSU9OX1VSSSwgdXJpICkgKSA9PSAwICkKKwkJcmMgPSBtb25vam9iX3dhaXQgKCB1cmlfc3RyaW5nX3JlZGFjdGVkICk7CisKKwl1cmlfcHV0ICggdXJpICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIExvYWQgYW4gaW1hZ2UKKyAqCisgKiBAdiBpbWFnZQkJSW1hZ2UKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitpbnQgaW1nbG9hZCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJaW50IHJjOworCisJLyogVHJ5IHRvIGxvYWQgaW1hZ2UgKi8KKwlpZiAoICggcmMgPSBpbWFnZV9hdXRvbG9hZCAoIGltYWdlICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRXhlY3V0ZSBhbiBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlJbWFnZQorICogQHJldCByYwkJUmV0dXJuIHN0YXR1cyBjb2RlCisgKi8KK2ludCBpbWdleGVjICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwlyZXR1cm4gaW1hZ2VfZXhlYyAoIGltYWdlICk7Cit9CisKKy8qKgorICogSWRlbnRpZnkgdGhlIG9ubHkgbG9hZGVkIGltYWdlCisgKgorICogQHJldCBpbWFnZQkJSW1hZ2UsIG9yIE5VTEwgaWYgMCBvciA+MSBpbWFnZXMgYXJlIGxvYWRlZAorICovCitzdHJ1Y3QgaW1hZ2UgKiBpbWdhdXRvc2VsZWN0ICggdm9pZCApIHsKKwlzdHJ1Y3QgaW1hZ2UgKmltYWdlOworCXN0cnVjdCBpbWFnZSAqc2VsZWN0ZWRfaW1hZ2UgPSBOVUxMOworCWludCBmbGFnZ2VkX2ltYWdlcyA9IDA7CisKKwlmb3JfZWFjaF9pbWFnZSAoIGltYWdlICkgeworCQlpZiAoIGltYWdlLT5mbGFncyAmIElNQUdFX0xPQURFRCApIHsKKwkJCXNlbGVjdGVkX2ltYWdlID0gaW1hZ2U7CisJCQlmbGFnZ2VkX2ltYWdlcysrOworCQl9CisJfQorCisJcmV0dXJuICggKCBmbGFnZ2VkX2ltYWdlcyA9PSAxICkgPyBzZWxlY3RlZF9pbWFnZSA6IE5VTEwgKTsKK30KKworLyoqCisgKiBEaXNwbGF5IHN0YXR1cyBvZiBhbiBpbWFnZQorICoKKyAqIEB2IGltYWdlCQlFeGVjdXRhYmxlL2xvYWRhYmxlIGltYWdlCisgKi8KK3ZvaWQgaW1nc3RhdCAoIHN0cnVjdCBpbWFnZSAqaW1hZ2UgKSB7CisJcHJpbnRmICggIiVzOiAlemQgYnl0ZXMiLCBpbWFnZS0+bmFtZSwgaW1hZ2UtPmxlbiApOworCWlmICggaW1hZ2UtPnR5cGUgKQorCQlwcmludGYgKCAiIFslc10iLCBpbWFnZS0+dHlwZS0+bmFtZSApOworCWlmICggaW1hZ2UtPmZsYWdzICYgSU1BR0VfTE9BREVEICkKKwkJcHJpbnRmICggIiBbTE9BREVEXSIgKTsKKwlpZiAoIGltYWdlLT5jbWRsaW5lICkKKwkJcHJpbnRmICggIiBcIiVzXCIiLCBpbWFnZS0+Y21kbGluZSApOworCXByaW50ZiAoICJcbiIgKTsKK30KKworLyoqCisgKiBGcmVlIGFuIGltYWdlCisgKgorICogQHYgaW1hZ2UJCUV4ZWN1dGFibGUvbG9hZGFibGUgaW1hZ2UKKyAqLwordm9pZCBpbWdmcmVlICggc3RydWN0IGltYWdlICppbWFnZSApIHsKKwl1bnJlZ2lzdGVyX2ltYWdlICggaW1hZ2UgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL3Vzci9pd21nbXQuYyBiL2dweGUvc3JjL3Vzci9pd21nbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJhMTAzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXNyL2l3bWdtdC5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEpvc2h1YSBPcmVtYW4gPG9yZW1hbmpAcndjci5uZXQ+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitGSUxFX0xJQ0VOQ0UgKCBHUEwyX09SX0xBVEVSICk7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbnNvbGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdweGUvbmV0ODAyMTEuaD4KKyNpbmNsdWRlIDxncHhlL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8dXNyL2lmbWdtdC5oPgorI2luY2x1ZGUgPHVzci9pd21nbXQuaD4KKyNpbmNsdWRlIDxncHhlL2Vycm9ydGFiLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFdpcmVsZXNzIG5ldHdvcmsgaW50ZXJmYWNlIG1hbmFnZW1lbnQKKyAqCisgKi8KKworLyoqCisgKiBQcmludCBzdGF0dXMgb2YgODAyLjExIGRldmljZQorICoKKyAqIEB2IGRldgk4MDIuMTEgZGV2aWNlCisgKi8KK3ZvaWQgaXdzdGF0ICggc3RydWN0IG5ldDgwMjExX2RldmljZSAqZGV2ICkgeworCisJaWZzdGF0ICggZGV2LT5uZXRkZXYgKTsKKworCXByaW50ZiAoICIgIFs4MDIuMTEgIik7CisJaWYgKCBkZXYtPnN0YXRlICYgTkVUODAyMTFfQVNTT0NJQVRFRCApIHsKKwkJcHJpbnRmICggIlNTSUQgJyVzJywgIiwgZGV2LT5lc3NpZCApOworCX0gZWxzZSB7CisJCXByaW50ZiAoICJub3QgYXNzb2NpYXRlZCwgIiApOworCX0KKwlpZiAoIGRldi0+Y2hhbm5lbCA8IGRldi0+bnJfY2hhbm5lbHMgJiYgZGV2LT5yYXRlIDwgZGV2LT5ucl9yYXRlcyApIHsKKwkJcHJpbnRmICggIkNoOiVkIFNpZzolZCIsIGRldi0+Y2hhbm5lbHNbZGV2LT5jaGFubmVsXS5jaGFubmVsX25yLAorCQkJIGRldi0+bGFzdF9zaWduYWwgKTsKKwkJc3dpdGNoICggZGV2LT5ody0+c2lnbmFsX3R5cGUgKSB7CisJCWNhc2UgTkVUODAyMTFfU0lHTkFMX05PTkU6CisJCQlwcmludGYgKCAiPyIgKTsKKwkJCWJyZWFrOworCQljYXNlIE5FVDgwMjExX1NJR05BTF9BUkJJVFJBUlk6CisJCQlwcmludGYgKCAiLyVkIiwgZGV2LT5ody0+c2lnbmFsX21heCApOworCQkJYnJlYWs7CisJCWNhc2UgTkVUODAyMTFfU0lHTkFMX0RCOgorCQkJcHJpbnRmICggIi8lZCBkQiIsIGRldi0+aHctPnNpZ25hbF9tYXggKTsKKwkJCWJyZWFrOworCQljYXNlIE5FVDgwMjExX1NJR05BTF9EQk06CisJCQlwcmludGYgKCAiIGRCbSIgKTsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ZiAoICIsIFF1YWw6JWQlJSBSYXRlOiVkIE1icHNdXG4iLAorCQkJICggZGV2LT5yeF9iZWFjb25faW50ZXJ2YWwgPT0gMCA/IDAgOgorCQkJICAgMTAwICogZGV2LT50eF9iZWFjb25faW50ZXJ2YWwgLworCQkJICAgZGV2LT5yeF9iZWFjb25faW50ZXJ2YWwgKSwKKwkJCSBkZXYtPnJhdGVzW2Rldi0+cmF0ZV0gLyAxMCApOworCX0gZWxzZSB7CisJCXByaW50ZiAoICJhbnRlbm5hIG9mZl1cbiIgKTsKKwl9CisKKwlpZiAoIGRldi0+c3RhdGUgJiBORVQ4MDIxMV9XT1JLSU5HICkgeworCQlwcmludGYgKCAiICBbYXNzb2NpYXRpbmciICk7CisJCWlmICggZGV2LT5hc3NvY2lhdGluZyApCisJCQlwcmludGYgKCAiIHRvICclcyciLCBkZXYtPmFzc29jaWF0aW5nLT5lc3NpZCApOworCQlwcmludGYgKCAiLi4uXVxuIiApOworCX0KK30KKworLyoqIElkZW50aWZpZXJzIGZvciA4MDIuMTEgY3J5cHRvZ3JhcGh5IHR5cGVzLCBpbmRleGVkIGJ5IHR5cGUgbnVtYmVyICovCitzdGF0aWMgY29uc3QgY2hhciAqY3J5cHRvX3R5cGVzW10gPSB7CisJW05FVDgwMjExX0NSWVBUX05PTkVdID0gIk9wZW4iLAorCVtORVQ4MDIxMV9DUllQVF9XRVBdID0gIldFUCAiLAorCVtORVQ4MDIxMV9DUllQVF9US0lQXSA9ICJXUEEgIiwKKwlbTkVUODAyMTFfQ1JZUFRfQ0NNUF0gPSAiV1BBMiIsCisJW05FVDgwMjExX0NSWVBUX1VOS05PV05dID0gIlVOSyAiLAorfTsKKworLyoqIE51bWJlciBvZiA4MDIuMTEgY3J5cHRvZ3JhcGh5IHR5cGVzIGRlZmluZWQgKi8KKyNkZWZpbmUgTlJfQ1JZUFRPX1RZUEVTICggc2l6ZW9mICggY3J5cHRvX3R5cGVzICkgLyBzaXplb2YgKCBjcnlwdG9fdHlwZXNbMF0gKSApCisKKy8qKiBJZGVudGlmaWVycyBmb3IgODAyLjExIGF1dGhlbnRpY2F0aW9uIHR5cGVzLCBpbmRleGVkIGJ5IHR5cGUgbnVtYmVyICovCitzdGF0aWMgY29uc3QgY2hhciAqYXV0aF90eXBlc1tdID0geworCVtORVQ4MDIxMV9TRUNQUk9UX05PTkVdID0gIiIsCisJW05FVDgwMjExX1NFQ1BST1RfUFNLXSA9ICJQU0siLAorCVtORVQ4MDIxMV9TRUNQUk9UX0VBUF0gPSAiODAyLjFYIiwKKwlbTkVUODAyMTFfU0VDUFJPVF9VTktOT1dOXSA9ICJVTksiLAorfTsKKworLyoqIE51bWJlciBvZiA4MDIuMTEgYXV0aGVudGljYXRpb24gdHlwZXMgZGVmaW5lZCAqLworI2RlZmluZSBOUl9BVVRIX1RZUEVTICggc2l6ZW9mICggYXV0aF90eXBlcyApIC8gc2l6ZW9mICggYXV0aF90eXBlc1swXSApICkKKworLyoqCisgKiBTY2FuIGZvciB3aXJlbGVzcyBuZXR3b3JrcyB1c2luZyA4MDIuMTEgZGV2aWNlCisgKgorICogQHYgZGV2CTgwMi4xMSBkZXZpY2UKKyAqIEB2IGFjdGl2ZQlXaGV0aGVyIHRvIHVzZSBhY3RpdmUgc2Nhbm5pbmcKKyAqCisgKiBUaGUgbGlzdCBvZiBuZXR3b3JrcyBmb3VuZCB3aWxsIGJlIHByaW50ZWQgaW4gdGFidWxhciBmb3JtYXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzYWZlIHRvIGNhbGwgYXQgYWxsIHRpbWVzLCB3aGV0aGVyIHRoZSA4MDIuMTEKKyAqIGRldmljZSBpcyBvcGVuIG9yIG5vdCwgYnV0IGlmIGNhbGxlZCB3aGlsZSB0aGUgYXV0by1hc3NvY2lhdGlvbgorICogdGFzayBpcyBydW5uaW5nIGl0IHdpbGwgcmV0dXJuIGFuIGVycm9yIGluZGljYXRpb24uCisgKi8KK2ludCBpd2xpc3QgKCBzdHJ1Y3QgbmV0ODAyMTFfZGV2aWNlICpkZXYgKSB7CisJc3RydWN0IG5ldDgwMjExX3Byb2JlX2N0eCAqY3R4OworCXN0cnVjdCBsaXN0X2hlYWQgKm5ldHdvcmtzOworCXN0cnVjdCBuZXQ4MDIxMV93bGFuICp3bGFuOworCWNoYXIgc3NpZF9idWZbMjJdOworCWludCByYzsKKwl1bnNpZ25lZCBpOworCWludCB3YXNfb3BlbmVkID0gZGV2LT5uZXRkZXYtPnN0YXRlICYgTkVUREVWX09QRU47CisJaW50IHdhc19jaGFubmVsID0gZGV2LT5jaGFubmVsc1tkZXYtPmNoYW5uZWxdLmNoYW5uZWxfbnI7CisKKwlpZiAoICEgd2FzX29wZW5lZCApIHsKKwkJZGV2LT5zdGF0ZSB8PSBORVQ4MDIxMV9OT19BU1NPQzsKKwkJcmMgPSBuZXRkZXZfb3BlbiAoIGRldi0+bmV0ZGV2ICk7CisJCWlmICggcmMgPCAwICkKKwkJCWdvdG8gZXJyOworCX0KKworCWlmICggZGV2LT5zdGF0ZSAmIE5FVDgwMjExX1dPUktJTkcgKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfY2xvc2VfbmV0ZGV2OworCX0KKworCWlmICggISB3YXNfb3BlbmVkICkgeworCQlyYyA9IG5ldDgwMjExX3ByZXBhcmVfcHJvYmUgKCBkZXYsIGRldi0+aHctPmJhbmRzLCAwICk7CisJCWlmICggcmMgPCAwICkKKwkJCWdvdG8gZXJyX2Nsb3NlX25ldGRldjsKKwl9CisKKwljdHggPSBuZXQ4MDIxMV9wcm9iZV9zdGFydCAoIGRldiwgIiIsIDAgKTsKKwlpZiAoICEgY3R4ICkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2Nsb3NlX25ldGRldjsKKwl9CisKKwl3aGlsZSAoICEgKCByYyA9IG5ldDgwMjExX3Byb2JlX3N0ZXAgKCBjdHggKSApICkgeworCQlzdGVwKCk7CisJfQorCisJbmV0d29ya3MgPSBuZXQ4MDIxMV9wcm9iZV9maW5pc2hfYWxsICggY3R4ICk7CisKKwlpZiAoIGxpc3RfZW1wdHkgKCBuZXR3b3JrcyApICkgeworCQlnb3RvIGVycl9mcmVlX25ldHdvcmtzOworCX0KKworCXJjID0gMDsKKworCXByaW50ZiAoICJOZXR3b3JrcyBvbiAlczpcblxuIiwgZGV2LT5uZXRkZXYtPm5hbWUgKTsKKworCS8qIE91dHB1dCBmb3JtYXQ6CisJICogMCAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICA1ICAgICAgICAgNgorCSAqIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAKKwkgKiBbU2lnXSBTU0lEICAgICAgICAgICAgICAgICAgQlNTSUQgICAgICAgICAgICAgIENoICBDcnlwdC9BdXRoCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFsgMTVdIGFiY2RlZmdoaWprbG1ub3BxcnN0PiAwMDowMDowMDowMDowMDowMCAgMTEgIE9wZW4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBvciBXUEEgICBQU0sgZXRjLgorCSAqLworCisJLyogUXVvdGluZyB0aGUgZGFzaGVzIGFuZCBzcGFjZXMgdmVyYmF0aW0gdXNlcyBsZXNzIGNvZGUgc3BhY2UKKwkgICB0aGFuIGdlbmVyYXRpbmcgdGhlbSBwcm9ncmFtbWF0aWNhbGx5LiAqLworCXByaW50ZiAoICJbU2lnXSBTU0lEICAgICAgICAgICAgICAgICAgQlNTSUQgICAgICAgICAgICAgIENoICBDcnlwdC9BdXRoXG4iCisJCSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoIHdsYW4sIG5ldHdvcmtzLCBsaXN0ICkgeworCisJCS8qIEZvcm1hdCBTU0lEIGludG8gMjItY2hhcmFjdGVyIHN0cmluZywgc3BhY2UtcGFkZGVkLAorCQkgICB3aXRoICc+JyBpbmRpY2F0aW5nIHRydW5jYXRpb24gKi8KKworCQlzbnByaW50ZiAoIHNzaWRfYnVmLCBzaXplb2YgKCBzc2lkX2J1ZiApLCAiJXMiLCB3bGFuLT5lc3NpZCApOworCQlmb3IgKCBpID0gc3RybGVuICggc3NpZF9idWYgKTsgaSA8IHNpemVvZiAoIHNzaWRfYnVmICkgLSAxOworCQkgICAgICBpKysgKQorCQkJc3NpZF9idWZbaV0gPSAnICc7CisJCWlmICggc3NpZF9idWZbc2l6ZW9mICggc3NpZF9idWYgKSAtIDJdICE9ICcgJyApCisJCQlzc2lkX2J1ZltzaXplb2YgKCBzc2lkX2J1ZiApIC0gMl0gPSAnPic7CisJCXNzaWRfYnVmW3NpemVvZiAoIHNzaWRfYnVmICkgLSAxXSA9IDA7CisKKwkJLyogU2FuaXR5IGNoZWNrICovCisJCWlmICggd2xhbi0+Y3J5cHRvID49IE5SX0NSWVBUT19UWVBFUyB8fAorCQkgICAgIHdsYW4tPmhhbmRzaGFraW5nID49IE5SX0FVVEhfVFlQRVMgKQorCQkJY29udGludWU7CisKKwkJcHJpbnRmICggIlslM2RdICVzICVzICAlMmQgICVzICAlc1xuIiwKKwkJCSB3bGFuLT5zaWduYWwgPCAwID8gMTAwICsgd2xhbi0+c2lnbmFsIDogd2xhbi0+c2lnbmFsLAorCQkJIHNzaWRfYnVmLCBldGhfbnRvYSAoIHdsYW4tPmJzc2lkICksIHdsYW4tPmNoYW5uZWwsCisJCQkgY3J5cHRvX3R5cGVzW3dsYW4tPmNyeXB0b10sCisJCQkgYXV0aF90eXBlc1t3bGFuLT5oYW5kc2hha2luZ10gKTsKKwl9CisJcHJpbnRmICggIlxuIiApOworCisgZXJyX2ZyZWVfbmV0d29ya3M6CisJbmV0ODAyMTFfZnJlZV93bGFubGlzdCAoIG5ldHdvcmtzICk7CisKKyBlcnJfY2xvc2VfbmV0ZGV2OgorCWlmICggISB3YXNfb3BlbmVkICkgeworCQlkZXYtPnN0YXRlICY9IH5ORVQ4MDIxMV9OT19BU1NPQzsKKwkJbmV0ZGV2X2Nsb3NlICggZGV2LT5uZXRkZXYgKTsKKwl9IGVsc2UgeworCQluZXQ4MDIxMV9jaGFuZ2VfY2hhbm5lbCAoIGRldiwgd2FzX2NoYW5uZWwgKTsKKwl9CisKKwlpZiAoICEgcmMgKQorCQlyZXR1cm4gMDsKKworIGVycjoKKwlwcmludGYgKCAiU2Nhbm5pbmcgZm9yIG5ldHdvcmtzIG9uICVzOiAlc1xuIiwKKwkJIGRldi0+bmV0ZGV2LT5uYW1lLCBzdHJlcnJvciAoIHJjICkgKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyogUmVjb3JkIGVycm9yIGNvZGVzIGFzIHRob3VnaCB0aGV5IGNvbWUgZnJvbSB0aGUgODAyLjExIHN0YWNrICovCisjdW5kZWYgRVJSRklMRQorI2RlZmluZSBFUlJGSUxFIEVSUkZJTEVfbmV0ODAyMTEKKworLyoqIENvbW1vbiA4MDIuMTEgZXJyb3JzICovCitzdHJ1Y3QgZXJyb3J0YWIgY29tbW9uX3dpcmVsZXNzX2Vycm9yc1tdIF9fZXJyb3J0YWIgPSB7CisJeyBFSU5WQUwgfCBFVU5JUV8wNiwgIlBhY2tldCBkZWNyeXB0aW9uIGVycm9yIiB9LAorCXsgRUNPTk5SRVNFVCB8IEVVTklRXzAxLCAiVW5zcGVjaWZpZWQgcmVhc29uIiB9LAorCXsgRUNPTk5SRVNFVCB8IEVVTklRXzA0LCAiRGlzYXNzb2NpYXRlZCBkdWUgdG8gaW5hY3Rpdml0eSIgfSwKKwl7IEVDT05OUkVTRVQgfCBFVU5JUV8wRiwgIjQtV2F5IEhhbmRzaGFrZSB0aW1lb3V0IiB9LAorCXsgRUNPTk5SRVNFVCB8IEVVTklRXzE3LCAiSUVFRSA4MDIuMVggYXV0aGVudGljYXRpb24gZmFpbGVkIiB9LAorCXsgRUNPTk5SRUZVU0VEIHwgRVVOSVFfMDEsICJVbnNwZWNpZmllZCBmYWlsdXJlIiB9LAorCXsgRUNPTk5SRUZVU0VEIHwgRVVOSVFfMEMsICJBc3NvY2lhdGlvbiBkZW5pZWQiIH0sCisJeyBFQ09OTlJFRlVTRUQgfCBFVU5JUV8wRCwgIkF1dGhlbnRpY2F0aW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkIiB9LAorfTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL3Vzci9weGVtZW51LmMgYi9ncHhlL3NyYy91c3IvcHhlbWVudS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOWMyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91c3IvcHhlbWVudS5jCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworRklMRV9MSUNFTkNFICggR1BMMl9PUl9MQVRFUiApOworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjaW5jbHVkZSA8Z3B4ZS9kaGNwLmg+CisjaW5jbHVkZSA8Z3B4ZS9rZXlzLmg+CisjaW5jbHVkZSA8Z3B4ZS90aW1lci5oPgorI2luY2x1ZGUgPGdweGUvcHJvY2Vzcy5oPgorI2luY2x1ZGUgPHVzci9kaGNwbWdtdC5oPgorI2luY2x1ZGUgPHVzci9hdXRvYm9vdC5oPgorCisvKiogQGZpbGUKKyAqCisgKiBQWEUgQm9vdCBNZW51cworICoKKyAqLworCisvKiBDb2xvdXIgcGFpcnMgKi8KKyNkZWZpbmUgQ1BBSVJfTk9STUFMCTEKKyNkZWZpbmUgQ1BBSVJfU0VMRUNUCTIKKworLyoqIEEgUFhFIGJvb3QgbWVudSBpdGVtICovCitzdHJ1Y3QgcHhlX21lbnVfaXRlbSB7CisJLyoqIEJvb3QgU2VydmVyIHR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwkvKiogRGVzY3JpcHRpb24gKi8KKwljaGFyICpkZXNjOworfTsKKworLyoqCisgKiBBIFBYRSBib290IG1lbnUKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBlbmNhcHN1bGF0ZXMgdGhlIG1lbnUgaW5mb3JtYXRpb24gcHJvdmlkZWQgdmlhIERIQ1AKKyAqIG9wdGlvbnMuCisgKi8KK3N0cnVjdCBweGVfbWVudSB7CisJLyoqIFByb21wdCBzdHJpbmcgKG9wdGlvbmFsKSAqLworCWNvbnN0IGNoYXIgKnByb21wdDsKKwkvKiogVGltZW91dCAoaW4gc2Vjb25kcykKKwkgKgorCSAqIE5lZ2F0aXZlIGluZGljYXRlcyBubyB0aW1lb3V0IChpLmUuIHdhaXQgaW5kZWZpbml0ZWx5KQorCSAqLworCWludCB0aW1lb3V0OworCS8qKiBOdW1iZXIgb2YgbWVudSBpdGVtcyAqLworCXVuc2lnbmVkIGludCBudW1faXRlbXM7CisJLyoqIFNlbGVjdGVkIG1lbnUgaXRlbSAqLworCXVuc2lnbmVkIGludCBzZWxlY3Rpb247CisJLyoqIE1lbnUgaXRlbXMgKi8KKwlzdHJ1Y3QgcHhlX21lbnVfaXRlbSBpdGVtc1swXTsKK307CisKKy8qKgorICogUGFyc2UgYW5kIGFsbG9jYXRlIFBYRSBib290IG1lbnUKKyAqCisgKiBAdiBtZW51CQlQWEUgYm9vdCBtZW51IHRvIGZpbGwgaW4KKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIEl0IGlzIHRoZSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGV2ZW50dWFsbHkgZnJlZSB0aGUgYWxsb2NhdGVkCisgKiBib290IG1lbnUuCisgKi8KK3N0YXRpYyBpbnQgcHhlX21lbnVfcGFyc2UgKCBzdHJ1Y3QgcHhlX21lbnUgKiptZW51ICkgeworCXN0cnVjdCBzZXR0aW5nIHB4ZV9ib290X21lbnVfcHJvbXB0X3NldHRpbmcgPQorCQl7IC50YWcgPSBESENQX1BYRV9CT09UX01FTlVfUFJPTVBUIH07CisJc3RydWN0IHNldHRpbmcgcHhlX2Jvb3RfbWVudV9zZXR0aW5nID0KKwkJeyAudGFnID0gREhDUF9QWEVfQk9PVF9NRU5VIH07CisJdWludDhfdCByYXdfbWVudVsyNTZdOworCWludCByYXdfcHJvbXB0X2xlbjsKKwlpbnQgcmF3X21lbnVfbGVuOworCXN0cnVjdCBkaGNwX3B4ZV9ib290X21lbnUgKnJhd19tZW51X2l0ZW07CisJc3RydWN0IGRoY3BfcHhlX2Jvb3RfbWVudV9wcm9tcHQgKnJhd19tZW51X3Byb21wdDsKKwl2b2lkICpyYXdfbWVudV9lbmQ7CisJdW5zaWduZWQgaW50IG51bV9tZW51X2l0ZW1zOworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKworCS8qIEZldGNoIHJhdyBtZW51ICovCisJbWVtc2V0ICggcmF3X21lbnUsIDAsIHNpemVvZiAoIHJhd19tZW51ICkgKTsKKwlpZiAoICggcmF3X21lbnVfbGVuID0gZmV0Y2hfc2V0dGluZyAoIE5VTEwsICZweGVfYm9vdF9tZW51X3NldHRpbmcsCisJCQkJCSAgICAgIHJhd19tZW51LAorCQkJCQkgICAgICBzaXplb2YgKCByYXdfbWVudSApICkgKSA8IDAgKSB7CisJCXJjID0gcmF3X21lbnVfbGVuOworCQlEQkcgKCAiQ291bGQgbm90IHJldHJpZXZlIHJhdyBQWEUgYm9vdCBtZW51OiAlc1xuIiwKKwkJICAgICAgc3RyZXJyb3IgKCByYyApICk7CisJCXJldHVybiByYzsKKwl9CisJaWYgKCByYXdfbWVudV9sZW4gPj0gKCBpbnQgKSBzaXplb2YgKCByYXdfbWVudSApICkgeworCQlEQkcgKCAiUmF3IFBYRSBib290IG1lbnUgdG9vIGxhcmdlIGZvciBidWZmZXJcbiIgKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCXJhd19tZW51X2VuZCA9ICggcmF3X21lbnUgKyByYXdfbWVudV9sZW4gKTsKKworCS8qIEZldGNoIHJhdyBwcm9tcHQgbGVuZ3RoICovCisJcmF3X3Byb21wdF9sZW4gPSBmZXRjaF9zZXR0aW5nX2xlbiAoIE5VTEwsCisJCQkJCSAgICAgJnB4ZV9ib290X21lbnVfcHJvbXB0X3NldHRpbmcgKTsKKwlpZiAoIHJhd19wcm9tcHRfbGVuIDwgMCApCisJCXJhd19wcm9tcHRfbGVuID0gMDsKKworCS8qIENvdW50IG1lbnUgaXRlbXMgKi8KKwludW1fbWVudV9pdGVtcyA9IDA7CisJcmF3X21lbnVfaXRlbSA9ICggKCB2b2lkICogKSByYXdfbWVudSApOworCXdoaWxlICggMSApIHsKKwkJaWYgKCAoICggKCB2b2lkICogKSByYXdfbWVudV9pdGVtICkgKworCQkgICAgICAgc2l6ZW9mICggKnJhd19tZW51X2l0ZW0gKSApID4gcmF3X21lbnVfZW5kICkKKwkJCWJyZWFrOworCQlpZiAoICggKCAoIHZvaWQgKiApIHJhd19tZW51X2l0ZW0gKSArCisJCSAgICAgICBzaXplb2YgKCAqcmF3X21lbnVfaXRlbSApICsKKwkJICAgICAgIHJhd19tZW51X2l0ZW0tPmRlc2NfbGVuICkgPiByYXdfbWVudV9lbmQgKQorCQkJYnJlYWs7CisJCW51bV9tZW51X2l0ZW1zKys7CisJCXJhd19tZW51X2l0ZW0gPSAoICggKCB2b2lkICogKSByYXdfbWVudV9pdGVtICkgKworCQkJCSAgc2l6ZW9mICggKnJhd19tZW51X2l0ZW0gKSArCisJCQkJICByYXdfbWVudV9pdGVtLT5kZXNjX2xlbiApOworCX0KKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBwYXJzZWQgbWVudSAqLworCSptZW51ID0gemFsbG9jICggc2l6ZW9mICggKiptZW51ICkgKworCQkJICggbnVtX21lbnVfaXRlbXMgKiBzaXplb2YgKCAoKm1lbnUpLT5pdGVtc1swXSApICkgKworCQkJIHJhd19tZW51X2xlbiArIDEgLyogTlVMICovICsKKwkJCSByYXdfcHJvbXB0X2xlbiArIDEgLyogTlVMICovICk7CisJaWYgKCAhICptZW51ICkgeworCQlEQkcgKCAiQ291bGQgbm90IGFsbG9jYXRlIFBYRSBib290IG1lbnVcbiIgKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogRmlsbCBpbiBwYXJzZWQgbWVudSAqLworCSgqbWVudSktPm51bV9pdGVtcyA9IG51bV9tZW51X2l0ZW1zOworCXJhd19tZW51X2l0ZW0gPSAoICggKCB2b2lkICogKSAoKm1lbnUpICkgKyBzaXplb2YgKCAqKm1lbnUgKSArCisJCQkgICggbnVtX21lbnVfaXRlbXMgKiBzaXplb2YgKCAoKm1lbnUpLT5pdGVtc1swXSApICkgKTsKKwltZW1jcHkgKCByYXdfbWVudV9pdGVtLCByYXdfbWVudSwgcmF3X21lbnVfbGVuICk7CisJZm9yICggaSA9IDAgOyBpIDwgbnVtX21lbnVfaXRlbXMgOyBpKysgKSB7CisJCSgqbWVudSktPml0ZW1zW2ldLnR5cGUgPSBsZTE2X3RvX2NwdSAoIHJhd19tZW51X2l0ZW0tPnR5cGUgKTsKKwkJKCptZW51KS0+aXRlbXNbaV0uZGVzYyA9IHJhd19tZW51X2l0ZW0tPmRlc2M7CisJCS8qIFNldCB0eXBlIHRvIDA7IHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBkZXNjcmlwdGlvbgorCQkgKiBmb3IgdGhlIHByZXZpb3VzIG1lbnUgaXRlbSBpcyBOVUwtdGVybWluYXRlZC4KKwkJICogKEZpbmFsIGl0ZW0gaXMgTlVMLXRlcm1pbmF0ZWQgYW55d2F5LikKKwkJICovCisJCXJhd19tZW51X2l0ZW0tPnR5cGUgPSAwOworCQlyYXdfbWVudV9pdGVtID0gKCAoICggdm9pZCAqICkgcmF3X21lbnVfaXRlbSApICsKKwkJCQkgIHNpemVvZiAoICpyYXdfbWVudV9pdGVtICkgKworCQkJCSAgcmF3X21lbnVfaXRlbS0+ZGVzY19sZW4gKTsKKwl9CisJaWYgKCByYXdfcHJvbXB0X2xlbiApIHsKKwkJcmF3X21lbnVfcHJvbXB0ID0gKCAoICggdm9pZCAqICkgcmF3X21lbnVfaXRlbSApICsKKwkJCQkgICAgMSAvKiBOVUwgKi8gKTsKKwkJZmV0Y2hfc2V0dGluZyAoIE5VTEwsICZweGVfYm9vdF9tZW51X3Byb21wdF9zZXR0aW5nLAorCQkJCXJhd19tZW51X3Byb21wdCwgcmF3X3Byb21wdF9sZW4gKTsKKwkJKCptZW51KS0+dGltZW91dCA9CisJCQkoICggcmF3X21lbnVfcHJvbXB0LT50aW1lb3V0ID09IDB4ZmYgKSA/CisJCQkgIC0xIDogcmF3X21lbnVfcHJvbXB0LT50aW1lb3V0ICk7CisJCSgqbWVudSktPnByb21wdCA9IHJhd19tZW51X3Byb21wdC0+cHJvbXB0OworCX0gZWxzZSB7CisJCSgqbWVudSktPnRpbWVvdXQgPSAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBEcmF3IFBYRSBib290IG1lbnUgaXRlbQorICoKKyAqIEB2IG1lbnUJCVBYRSBib290IG1lbnUKKyAqIEB2IGluZGV4CQlJbmRleCBvZiBpdGVtIHRvIGRyYXcKKyAqIEB2IHNlbGVjdGVkCQlJdGVtIGlzIHNlbGVjdGVkCisgKi8KK3N0YXRpYyB2b2lkIHB4ZV9tZW51X2RyYXdfaXRlbSAoIHN0cnVjdCBweGVfbWVudSAqbWVudSwKKwkJCQkgdW5zaWduZWQgaW50IGluZGV4LCBpbnQgc2VsZWN0ZWQgKSB7CisJY2hhciBidWZbQ09MUysxXTsKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGludCByb3c7CisKKwkvKiBQcmVwYXJlIHNwYWNlLXBhZGRlZCByb3cgY29udGVudCAqLworCWxlbiA9IHNucHJpbnRmICggYnVmLCBzaXplb2YgKCBidWYgKSwgIiAlYy4gJXMiLAorCQkJICggJ0EnICsgaW5kZXggKSwgbWVudS0+aXRlbXNbaW5kZXhdLmRlc2MgKTsKKwl3aGlsZSAoIGxlbiA8ICggc2l6ZW9mICggYnVmICkgLSAxICkgKQorCQlidWZbbGVuKytdID0gJyAnOworCWJ1Zlsgc2l6ZW9mICggYnVmICkgLSAxIF0gPSAnXDAnOworCisJLyogRHJhdyByb3cgKi8KKwlyb3cgPSAoIExJTkVTIC0gbWVudS0+bnVtX2l0ZW1zICsgaW5kZXggKTsKKwljb2xvcl9zZXQgKCAoIHNlbGVjdGVkID8gQ1BBSVJfU0VMRUNUIDogQ1BBSVJfTk9STUFMICksIE5VTEwgKTsKKwltdnByaW50dyAoIHJvdywgMCwgIiVzIiwgYnVmICk7CisJbW92ZSAoIHJvdywgMSApOworfQorCisvKioKKyAqIE1ha2Ugc2VsZWN0aW9uIGZyb20gUFhFIGJvb3QgbWVudQorICoKKyAqIEB2IG1lbnUJCVBYRSBib290IG1lbnUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHB4ZV9tZW51X3NlbGVjdCAoIHN0cnVjdCBweGVfbWVudSAqbWVudSApIHsKKwlpbnQga2V5OworCXVuc2lnbmVkIGludCBrZXlfc2VsZWN0aW9uOworCXVuc2lnbmVkIGludCBpOworCWludCByYyA9IDA7CisKKwkvKiBJbml0aWFsaXNlIFVJICovCisJaW5pdHNjcigpOworCXN0YXJ0X2NvbG9yKCk7CisJaW5pdF9wYWlyICggQ1BBSVJfTk9STUFMLCBDT0xPUl9XSElURSwgQ09MT1JfQkxBQ0sgKTsKKwlpbml0X3BhaXIgKCBDUEFJUl9TRUxFQ1QsIENPTE9SX0JMQUNLLCBDT0xPUl9XSElURSApOworCWNvbG9yX3NldCAoIENQQUlSX05PUk1BTCwgTlVMTCApOworCisJLyogRHJhdyBpbml0aWFsIG1lbnUgKi8KKwlmb3IgKCBpID0gMCA7IGkgPCBtZW51LT5udW1faXRlbXMgOyBpKysgKQorCQlwcmludGYgKCAiXG4iICk7CisJZm9yICggaSA9IDAgOyBpIDwgbWVudS0+bnVtX2l0ZW1zIDsgaSsrICkKKwkJcHhlX21lbnVfZHJhd19pdGVtICggbWVudSwgKCBtZW51LT5udW1faXRlbXMgLSBpIC0gMSApLCAwICk7CisKKwl3aGlsZSAoIDEgKSB7CisKKwkJLyogSGlnaGxpZ2h0IGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtICovCisJCXB4ZV9tZW51X2RyYXdfaXRlbSAoIG1lbnUsIG1lbnUtPnNlbGVjdGlvbiwgMSApOworCisJCS8qIFdhaXQgZm9yIGtleWJvYXJkIGlucHV0ICovCisJCXdoaWxlICggISBpc2tleSgpICkKKwkJCXN0ZXAoKTsKKwkJa2V5ID0gZ2V0a2V5KCk7CisKKwkJLyogVW5oaWdobGlnaHQgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gKi8KKwkJcHhlX21lbnVfZHJhd19pdGVtICggbWVudSwgbWVudS0+c2VsZWN0aW9uLCAwICk7CisKKwkJLyogQWN0IHVwb24ga2V5ICovCisJCWlmICggKCBrZXkgPT0gQ1IgKSB8fCAoIGtleSA9PSBMRiApICkgeworCQkJcHhlX21lbnVfZHJhd19pdGVtICggbWVudSwgbWVudS0+c2VsZWN0aW9uLCAxICk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICggKCBrZXkgPT0gQ1RSTF9DICkgfHwgKCBrZXkgPT0gRVNDICkgKSB7CisJCQlyYyA9IC1FQ0FOQ0VMRUQ7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgga2V5ID09IEtFWV9VUCApIHsKKwkJCWlmICggbWVudS0+c2VsZWN0aW9uID4gMCApCisJCQkJbWVudS0+c2VsZWN0aW9uLS07CisJCX0gZWxzZSBpZiAoIGtleSA9PSBLRVlfRE9XTiApIHsKKwkJCWlmICggbWVudS0+c2VsZWN0aW9uIDwgKCBtZW51LT5udW1faXRlbXMgLSAxICkgKQorCQkJCW1lbnUtPnNlbGVjdGlvbisrOworCQl9IGVsc2UgaWYgKCAoIGtleSA8IEtFWV9NSU4gKSAmJgorCQkJICAgICggKCBrZXlfc2VsZWN0aW9uID0gKCB0b3VwcGVyICgga2V5ICkgLSAnQScgKSApCisJCQkgICAgICA8IG1lbnUtPm51bV9pdGVtcyApICkgeworCQkJbWVudS0+c2VsZWN0aW9uID0ga2V5X3NlbGVjdGlvbjsKKwkJCXB4ZV9tZW51X2RyYXdfaXRlbSAoIG1lbnUsIG1lbnUtPnNlbGVjdGlvbiwgMSApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBTaHV0IGRvd24gVUkgKi8KKwllbmR3aW4oKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBQcm9tcHQgZm9yIChhbmQgbWFrZSBzZWxlY3Rpb24gZnJvbSkgUFhFIGJvb3QgbWVudQorICoKKyAqIEB2IG1lbnUJCVBYRSBib290IG1lbnUKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICovCitzdGF0aWMgaW50IHB4ZV9tZW51X3Byb21wdF9hbmRfc2VsZWN0ICggc3RydWN0IHB4ZV9tZW51ICptZW51ICkgeworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBjdXJydGlja3MoKTsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKwl1bnNpZ25lZCBsb25nIGVsYXBzZWQ7CisJc2l6ZV90IGxlbiA9IDA7CisJaW50IGtleTsKKwlpbnQgcmMgPSAwOworCisJLyogRGlzcGxheSBtZW51IGltbWVkaWF0ZWx5LCBpZiBzcGVjaWZpZWQgdG8gZG8gc28gKi8KKwlpZiAoIG1lbnUtPnRpbWVvdXQgPCAwICkgeworCQlpZiAoIG1lbnUtPnByb21wdCApCisJCQlwcmludGYgKCAiJXNcbiIsIG1lbnUtPnByb21wdCApOworCQlyZXR1cm4gcHhlX21lbnVfc2VsZWN0ICggbWVudSApOworCX0KKworCS8qIERpc3BsYXkgcHJvbXB0LCBpZiBzcGVjaWZpZWQgKi8KKwlpZiAoIG1lbnUtPnByb21wdCApCisJCXByaW50ZiAoICIlcyIsIG1lbnUtPnByb21wdCApOworCisJLyogV2FpdCBmb3IgdGltZW91dCwgaWYgc3BlY2lmaWVkICovCisJd2hpbGUgKCBtZW51LT50aW1lb3V0ID4gMCApIHsKKwkJaWYgKCAhIGxlbiApCisJCQlsZW4gPSBwcmludGYgKCAiICglZCkiLCBtZW51LT50aW1lb3V0ICk7CisJCWlmICggaXNrZXkoKSApIHsKKwkJCWtleSA9IGdldGtleSgpOworCQkJaWYgKCBrZXkgPT0gS0VZX0Y4ICkgeworCQkJCS8qIERpc3BsYXkgbWVudSAqLworCQkJCXByaW50ZiAoICJcbiIgKTsKKwkJCQlyZXR1cm4gcHhlX21lbnVfc2VsZWN0ICggbWVudSApOworCQkJfSBlbHNlIGlmICggKCBrZXkgPT0gQ1RSTF9DICkgfHwgKCBrZXkgPT0gRVNDICkgKSB7CisJCQkJLyogQWJvcnQgKi8KKwkJCQlyYyA9IC1FQ0FOQ0VMRUQ7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qIFN0b3Agd2FpdGluZyAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW5vdyA9IGN1cnJ0aWNrcygpOworCQllbGFwc2VkID0gKCBub3cgLSBzdGFydCApOworCQlpZiAoIGVsYXBzZWQgPj0gVElDS1NfUEVSX1NFQyApIHsKKwkJCW1lbnUtPnRpbWVvdXQgLT0gMTsKKwkJCWRvIHsKKwkJCQlwcmludGYgKCAiXGIgXGIiICk7CisJCQl9IHdoaWxlICggLS1sZW4gKTsKKwkJCXN0YXJ0ID0gbm93OworCQl9CisJfQorCisJLyogUmV0dXJuIHdpdGggZGVmYXVsdCBvcHRpb24gc2VsZWN0ZWQgKi8KKwlwcmludGYgKCAiXG4iICk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEJvb3QgdXNpbmcgUFhFIGJvb3QgbWVudQorICoKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIE5vdGUgdGhhdCBhIHN1Y2Nlc3MgcmV0dXJuIHN0YXR1cyBpbmRpY2F0ZXMgdGhhdCBhIFBYRSBib290IG1lbnUKKyAqIGl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWQsIGFuZCB0aGF0IHRoZSBESENQIHNlc3Npb24gc2hvdWxkIHBlcmZvcm0gYQorICogYm9vdCBzZXJ2ZXIgcmVxdWVzdC9hY2suCisgKi8KK2ludCBweGVfbWVudV9ib290ICggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApIHsKKwlzdHJ1Y3QgcHhlX21lbnUgKm1lbnU7CisJdW5zaWduZWQgaW50IHB4ZV90eXBlOworCXN0cnVjdCBzZXR0aW5ncyAqcHhlYnNfc2V0dGluZ3M7CisJc3RydWN0IGluX2FkZHIgbmV4dF9zZXJ2ZXI7CisJY2hhciBmaWxlbmFtZVsyNTZdOworCWludCByYzsKKworCS8qIFBhcnNlIGFuZCBhbGxvY2F0ZSBib290IG1lbnUgKi8KKwlpZiAoICggcmMgPSBweGVfbWVudV9wYXJzZSAoICZtZW51ICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogTWFrZSBzZWxlY3Rpb24gZnJvbSBib290IG1lbnUgKi8KKwlpZiAoICggcmMgPSBweGVfbWVudV9wcm9tcHRfYW5kX3NlbGVjdCAoIG1lbnUgKSApICE9IDAgKSB7CisJCWZyZWUgKCBtZW51ICk7CisJCXJldHVybiByYzsKKwl9CisJcHhlX3R5cGUgPSBtZW51LT5pdGVtc1ttZW51LT5zZWxlY3Rpb25dLnR5cGU7CisKKwkvKiBGcmVlIGJvb3QgbWVudSAqLworCWZyZWUgKCBtZW51ICk7CisKKwkvKiBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgbG9jYWwgYm9vdCBzZWxlY3RlZCAqLworCWlmICggISBweGVfdHlwZSApCisJCXJldHVybiAwOworCisJLyogQXR0ZW1wdCBQWEUgQm9vdCBTZXJ2ZXIgRGlzY292ZXJ5ICovCisJaWYgKCAoIHJjID0gcHhlYnMgKCBuZXRkZXYsIHB4ZV90eXBlICkgKSAhPSAwICkKKwkJcmV0dXJuIHJjOworCisJLyogQXR0ZW1wdCBib290ICovCisJcHhlYnNfc2V0dGluZ3MgPSBmaW5kX3NldHRpbmdzICggUFhFQlNfU0VUVElOR1NfTkFNRSApOworCWFzc2VydCAoIHB4ZWJzX3NldHRpbmdzICk7CisJZmV0Y2hfaXB2NF9zZXR0aW5nICggcHhlYnNfc2V0dGluZ3MsICZuZXh0X3NlcnZlcl9zZXR0aW5nLAorCQkJICAgICAmbmV4dF9zZXJ2ZXIgKTsKKwlmZXRjaF9zdHJpbmdfc2V0dGluZyAoIHB4ZWJzX3NldHRpbmdzLCAmZmlsZW5hbWVfc2V0dGluZywKKwkJCSAgICAgICBmaWxlbmFtZSwgc2l6ZW9mICggZmlsZW5hbWUgKSApOworCXJldHVybiBib290X25leHRfc2VydmVyX2FuZF9maWxlbmFtZSAoIG5leHRfc2VydmVyLCBmaWxlbmFtZSApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXNyL3JvdXRlLmMgYi9ncHhlL3NyYy91c3Ivcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc1NzQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXNyL3JvdXRlLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKK0ZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z3B4ZS9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxncHhlL2lwLmg+CisjaW5jbHVkZSA8dXNyL3JvdXRlLmg+CisKKy8qKiBAZmlsZQorICoKKyAqIFJvdXRpbmcgdGFibGUgbWFuYWdlbWVudAorICoKKyAqLworCit2b2lkIHJvdXRlICggdm9pZCApIHsKKwlzdHJ1Y3QgaXB2NF9taW5pcm91dGUgKm1pbmlyb3V0ZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKCBtaW5pcm91dGUsICZpcHY0X21pbmlyb3V0ZXMsIGxpc3QgKSB7CisJCXByaW50ZiAoICIlczogJXMvIiwgbWluaXJvdXRlLT5uZXRkZXYtPm5hbWUsCisJCQkgaW5ldF9udG9hICggbWluaXJvdXRlLT5hZGRyZXNzICkgKTsKKwkJcHJpbnRmICggIiVzIiwgaW5ldF9udG9hICggbWluaXJvdXRlLT5uZXRtYXNrICkgKTsKKwkJaWYgKCBtaW5pcm91dGUtPmdhdGV3YXkuc19hZGRyICkKKwkJCXByaW50ZiAoICIgZ3cgJXMiLCBpbmV0X250b2EgKCBtaW5pcm91dGUtPmdhdGV3YXkgKSApOworCQlpZiAoICEgKCBtaW5pcm91dGUtPm5ldGRldi0+c3RhdGUgJiBORVRERVZfT1BFTiApICkKKwkJCXByaW50ZiAoICIgKGluYWNjZXNzaWJsZSkiICk7CisJCXByaW50ZiAoICJcbiIgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy91dGlsL01ha2VmaWxlIGIvZ3B4ZS9zcmMvdXRpbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzI2NjFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXRpbC9NYWtlZmlsZQpAQCAtMCwwICsxLDIyIEBACitCTElCID0gLi4vYmluL2JsaWIuYQorQ0ZMQUdTID0gLU9zCisKK2FsbCA6IGhpamFjayBwcm90b3Rlc3RlciBtdWN1cnNlc190ZXN0CisKK2hpamFjayA6IGhpamFjay5jCisJJChDQykgJChDRkxBR1MpICQoRVhUUkFfQ0ZMQUdTKSAtV2FsbCAtbHBjYXAgLW8gJEAgJDwKKworcHJvdG90ZXN0ZXIubyA6IHByb3RvdGVzdGVyLmMKKwkkKENDKSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpIC1XYWxsIC1vICRAIC1jICQ8IC1pZGlyYWZ0ZXIgLi4vaW5jbHVkZQorCitwcm90b3Rlc3RlciA6IHByb3RvdGVzdGVyLm8gJChCTElCKQorCSQoQ0MpIC1vICRAICQ8IC1sYyAkKEJMSUIpCisKK211Y3Vyc2VzX3Rlc3QubyA6IG11Y3Vyc2VzX3Rlc3QuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKEVYVFJBX0NGTEFHUykgLVdhbGwgLW8gJEAgLWMgJDwKKworbXVjdXJzZXNfdGVzdCA6IG11Y3Vyc2VzX3Rlc3QubyAkKEJMSUIpCisJJChDQykgLW8gJEAgJDwgLWxjICQoQkxJQikKKworY2xlYW4gOgorCXJtIC1mIGhpamFjayBwcm90b3Rlc3RlciBtdWN1cnNlc190ZXN0ICoubwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXRpbC9PcHRpb24vUk9NLnBtIGIvZ3B4ZS9zcmMvdXRpbC9PcHRpb24vUk9NLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmQzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL09wdGlvbi9ST00ucG0KQEAgLTAsMCArMSw1MDEgQEAKK3BhY2thZ2UgT3B0aW9uOjpST007CisKKyMgQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyMgTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCis9aGVhZDEgTkFNRQorCitPcHRpb246OlJPTSAtIE9wdGlvbiBST00gbWFuaXB1bGF0aW9uCisKKz1oZWFkMSBTWU5PUFNJUworCisgICAgdXNlIE9wdGlvbjo6Uk9NOworCisgICAgIyBMb2FkIGEgUk9NIGltYWdlCisgICAgbXkgJHJvbSA9IG5ldyBPcHRpb246OlJPTTsKKyAgICAkcm9tLT5sb2FkICggInJ0bDgxMzkucm9tIiApOworCisgICAgIyBNb2RpZnkgdGhlIFBDSSBkZXZpY2UgSUQKKyAgICAkcm9tLT5wY2lfaGVhZGVyLT57ZGV2aWNlX2lkfSA9IDB4MTIzNDsKKyAgICAkcm9tLT5maXhfY2hlY2tzdW0oKTsKKworICAgICMgV3JpdGUgUk9NIGltYWdlIG91dCB0byBhIG5ldyBmaWxlCisgICAgJHJvbS0+c2F2ZSAoICJydGw4MTM5LW1vZGlmaWVkLnJvbSIgKTsKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0M8T3B0aW9uOjpST00+IHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBtYW5pcHVsYXRpbmcgT3B0aW9uIFJPTQoraW1hZ2VzLgorCis9aGVhZDEgTUVUSE9EUworCis9Y3V0CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBPcHRpb246OlJPTTo6RmllbGRzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworcGFja2FnZSBPcHRpb246OlJPTTo6RmllbGRzOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIENhcnA7Cit1c2UgYnl0ZXM7CisKK3N1YiBUSUVIQVNIIHsKKyAgbXkgJGNsYXNzID0gc2hpZnQ7CisgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgYmxlc3MgJHNlbGYsICRjbGFzczsKKyAgcmV0dXJuICRzZWxmOworfQorCitzdWIgRkVUQ0ggeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAka2V5ID0gc2hpZnQ7CisKKyAgcmV0dXJuIHVuZGVmIHVubGVzcyAkc2VsZi0+RVhJU1RTICggJGtleSApOworICBteSAkcmF3ID0gc3Vic3RyICggJHskc2VsZi0+e2RhdGF9fSwKKwkJICAgICAoICRzZWxmLT57b2Zmc2V0fSArICRzZWxmLT57ZmllbGRzfS0+eyRrZXl9LT57b2Zmc2V0fSApLAorCQkgICAgICRzZWxmLT57ZmllbGRzfS0+eyRrZXl9LT57bGVuZ3RofSApOworICBteSAkdW5wYWNrID0gKCByZWYgJHNlbGYtPntmaWVsZHN9LT57JGtleX0tPnt1bnBhY2t9ID8KKwkJICRzZWxmLT57ZmllbGRzfS0+eyRrZXl9LT57dW5wYWNrfSA6CisJCSBzdWIgeyB1bnBhY2sgKCAkc2VsZi0+e2ZpZWxkc30tPnska2V5fS0+e3BhY2t9LCBzaGlmdCApOyB9ICk7CisgIHJldHVybiAmJHVucGFjayAoICRyYXcgKTsKK30KKworc3ViIFNUT1JFIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGtleSA9IHNoaWZ0OworICBteSAkdmFsdWUgPSBzaGlmdDsKKworICBjcm9hayAiTm9uZXhpc3RlbnQgZmllbGQgXCIka2V5XCIiIHVubGVzcyAkc2VsZi0+RVhJU1RTICggJGtleSApOworICBteSAkcGFjayA9ICggcmVmICRzZWxmLT57ZmllbGRzfS0+eyRrZXl9LT57cGFja30gPworCSAgICAgICAkc2VsZi0+e2ZpZWxkc30tPnska2V5fS0+e3BhY2t9IDoKKwkgICAgICAgc3ViIHsgcGFjayAoICRzZWxmLT57ZmllbGRzfS0+eyRrZXl9LT57cGFja30sIHNoaWZ0ICk7IH0gKTsKKyAgbXkgJHJhdyA9ICYkcGFjayAoICR2YWx1ZSApOworICBzdWJzdHIgKCAkeyRzZWxmLT57ZGF0YX19LAorCSAgICggJHNlbGYtPntvZmZzZXR9ICsgJHNlbGYtPntmaWVsZHN9LT57JGtleX0tPntvZmZzZXR9ICksCisJICAgJHNlbGYtPntmaWVsZHN9LT57JGtleX0tPntsZW5ndGh9ICkgPSAkcmF3OworfQorCitzdWIgREVMRVRFIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGtleSA9IHNoaWZ0OworCisgICRzZWxmLT5TVE9SRSAoICRrZXksIDAgKTsKK30KKworc3ViIENMRUFSIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKworICBmb3JlYWNoIG15ICRrZXkgKCBrZXlzICV7JHNlbGYtPntmaWVsZHN9fSApIHsKKyAgICAkc2VsZi0+REVMRVRFICggJGtleSApOworICB9Cit9CisKK3N1YiBFWElTVFMgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAka2V5ID0gc2hpZnQ7CisKKyAgcmV0dXJuICggZXhpc3RzICRzZWxmLT57ZmllbGRzfS0+eyRrZXl9ICYmCisJICAgKCAoICRzZWxmLT57ZmllbGRzfS0+eyRrZXl9LT57b2Zmc2V0fSArCisJICAgICAgICRzZWxmLT57ZmllbGRzfS0+eyRrZXl9LT57bGVuZ3RofSApIDw9ICRzZWxmLT57bGVuZ3RofSApICk7Cit9CisKK3N1YiBGSVJTVEtFWSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAga2V5cyAleyRzZWxmLT57ZmllbGRzfX07CisgIHJldHVybiBlYWNoICV7JHNlbGYtPntmaWVsZHN9fTsKK30KKworc3ViIE5FWFRLRVkgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkbGFzdGtleSA9IHNoaWZ0OworCisgIHJldHVybiBlYWNoICV7JHNlbGYtPntmaWVsZHN9fTsKK30KKworc3ViIFNDQUxBUiB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N1YiBVTlRJRSB7CisgIG15ICRzZWxmID0gc2hpZnQ7Cit9CisKK3N1YiBERVNUUk9ZIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKK30KKworc3ViIGNoZWNrc3VtIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKworICBteSAkcmF3ID0gc3Vic3RyICggJHskc2VsZi0+e2RhdGF9fSwgJHNlbGYtPntvZmZzZXR9LCAkc2VsZi0+e2xlbmd0aH0gKTsKKyAgcmV0dXJuIHVucGFjayAoICIlOEMqIiwgJHJhdyApOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgT3B0aW9uOjpST00KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitwYWNrYWdlIE9wdGlvbjo6Uk9NOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIENhcnA7Cit1c2UgYnl0ZXM7Cit1c2UgRXhwb3J0ZXIgJ2ltcG9ydCc7CisKK3VzZSBjb25zdGFudCBST01fU0lHTkFUVVJFID0+IDB4YWE1NTsKK3VzZSBjb25zdGFudCBQQ0lfU0lHTkFUVVJFID0+ICdQQ0lSJzsKK3VzZSBjb25zdGFudCBQTlBfU0lHTkFUVVJFID0+ICckUG5QJzsKKworb3VyIEBFWFBPUlRfT0sgPSBxdyAoIFJPTV9TSUdOQVRVUkUgUENJX1NJR05BVFVSRSBQTlBfU0lHTkFUVVJFICk7CitvdXIgJUVYUE9SVF9UQUdTID0gKCBhbGwgPT4gWyBARVhQT1JUX09LIF0gKTsKKwordXNlIGNvbnN0YW50IEpNUF9TSE9SVCA9PiAweGViOwordXNlIGNvbnN0YW50IEpNUF9ORUFSID0+IDB4ZTk7CisKK3N1YiBwYWNrX2luaXQgeworICBteSAkZGVzdCA9IHNoaWZ0OworCisgICMgQWx3YXlzIGNyZWF0ZSBhIG5lYXIganVtcDsgaXQncyBzaW1wbGVyCisgIGlmICggJGRlc3QgKSB7CisgICAgcmV0dXJuIHBhY2sgKCAiQ1MiLCBKTVBfTkVBUiwgKCAkZGVzdCAtIDYgKSApOworICB9IGVsc2UgeworICAgIHJldHVybiBwYWNrICggIkNTIiwgMCwgMCApOworICB9Cit9CisKK3N1YiB1bnBhY2tfaW5pdCB7CisgIG15ICRpbnN0ciA9IHNoaWZ0OworCisgICMgQWNjZXB0IGJvdGggc2hvcnQgYW5kIG5lYXIganVtcHMKKyAgbXkgJGp1bXAgPSB1bnBhY2sgKCAiQyIsICRpbnN0ciApOworICBpZiAoICRqdW1wID09IEpNUF9TSE9SVCApIHsKKyAgICBteSAkb2Zmc2V0ID0gdW5wYWNrICggInhDIiwgJGluc3RyICk7CisgICAgcmV0dXJuICggJG9mZnNldCArIDUgKTsKKyAgfSBlbHNpZiAoICRqdW1wID09IEpNUF9ORUFSICkgeworICAgIG15ICRvZmZzZXQgPSB1bnBhY2sgKCAieFMiLCAkaW5zdHIgKTsKKyAgICByZXR1cm4gKCAkb2Zmc2V0ICsgNiApOworICB9IGVsc2lmICggJGp1bXAgPT0gMCApIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBjcm9hayAiVW5yZWNvZ25pc2VkIGp1bXAgaW5zdHJ1Y3Rpb24gaW4gaW5pdCB2ZWN0b3JcbiI7CisgIH0KK30KKworPXBvZAorCis9aXRlbSBDPDwgbmV3ICgpID4+CisKK0NvbnN0cnVjdCBhIG5ldyBDPE9wdGlvbjo6Uk9NPiBvYmplY3QuCisKKz1jdXQKKworc3ViIG5ldyB7CisgIG15ICRjbGFzcyA9IHNoaWZ0OworCisgIG15ICRoYXNoID0ge307CisgIHRpZSAlJGhhc2gsICJPcHRpb246OlJPTTo6RmllbGRzIiwgeworICAgIGRhdGEgPT4gdW5kZWYsCisgICAgb2Zmc2V0ID0+IDB4MDAsCisgICAgbGVuZ3RoID0+IDB4MjAsCisgICAgZmllbGRzID0+IHsKKyAgICAgIHNpZ25hdHVyZSA9Pgl7IG9mZnNldCA9PiAweDAwLCBsZW5ndGggPT4gMHgwMiwgcGFjayA9PiAiUyIgfSwKKyAgICAgIGxlbmd0aCA9PgkJeyBvZmZzZXQgPT4gMHgwMiwgbGVuZ3RoID0+IDB4MDEsIHBhY2sgPT4gIkMiIH0sCisgICAgICAjICJpbml0IiBpcyBwYXJ0IG9mIGEganVtcCBpbnN0cnVjdGlvbgorICAgICAgaW5pdCA9PgkJeyBvZmZzZXQgPT4gMHgwMywgbGVuZ3RoID0+IDB4MDMsCisJCQkgIHBhY2sgPT4gXCZwYWNrX2luaXQsIHVucGFjayA9PiBcJnVucGFja19pbml0IH0sCisgICAgICBjaGVja3N1bSA9Pgl7IG9mZnNldCA9PiAweDA2LCBsZW5ndGggPT4gMHgwMSwgcGFjayA9PiAiQyIgfSwKKyAgICAgIGJvZm1faGVhZGVyID0+CXsgb2Zmc2V0ID0+IDB4MTQsIGxlbmd0aCA9PiAweDAyLCBwYWNrID0+ICJTIiB9LAorICAgICAgdW5kaV9oZWFkZXIgPT4JeyBvZmZzZXQgPT4gMHgxNiwgbGVuZ3RoID0+IDB4MDIsIHBhY2sgPT4gIlMiIH0sCisgICAgICBwY2lfaGVhZGVyID0+CXsgb2Zmc2V0ID0+IDB4MTgsIGxlbmd0aCA9PiAweDAyLCBwYWNrID0+ICJTIiB9LAorICAgICAgcG5wX2hlYWRlciA9Pgl7IG9mZnNldCA9PiAweDFhLCBsZW5ndGggPT4gMHgwMiwgcGFjayA9PiAiUyIgfSwKKyAgICB9LAorICB9OworICBibGVzcyAkaGFzaCwgJGNsYXNzOworICByZXR1cm4gJGhhc2g7Cit9CisKKz1wb2QKKworPWl0ZW0gQzw8IGxvYWQgKCAkZmlsZW5hbWUgKSA+PgorCitMb2FkIG9wdGlvbiBST00gY29udGVudHMgZnJvbSB0aGUgZmlsZSBDPCRmaWxlbmFtZT4uCisKKz1jdXQKKworc3ViIGxvYWQgeworICBteSAkaGFzaCA9IHNoaWZ0OworICBteSAkc2VsZiA9IHRpZWQoJSRoYXNoKTsKKyAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgJHNlbGYtPntmaWxlbmFtZX0gPSAkZmlsZW5hbWU7CisKKyAgb3BlbiBteSAkZmgsICI8JGZpbGVuYW1lIgorICAgICAgb3IgY3JvYWsgIkNhbm5vdCBvcGVuICRmaWxlbmFtZSBmb3IgcmVhZGluZzogJCEiOworICByZWFkICRmaCwgbXkgJGRhdGEsICggMTI4ICogMTAyNCApOyAjIDEyOGtCIGlzIHRoZW9yZXRpY2FsIG1heCBzaXplCisgICRzZWxmLT57ZGF0YX0gPSBcJGRhdGE7CisgIGNsb3NlICRmaDsKK30KKworPXBvZAorCis9aXRlbSBDPDwgc2F2ZSAoIFsgJGZpbGVuYW1lIF0gKSA+PgorCitXcml0ZSB0aGUgUk9NIGRhdGEgYmFjayBvdXQgdG8gdGhlIGZpbGUgQzwkZmlsZW5hbWU+LiAgSWYgQzwkZmlsZW5hbWU+CitpcyBvbWl0dGVkLCB0aGUgZmlsZSB1c2VkIGluIHRoZSBjYWxsIHRvIEM8bG9hZCgpPiB3aWxsIGJlIHVzZWQuCisKKz1jdXQKKworc3ViIHNhdmUgeworICBteSAkaGFzaCA9IHNoaWZ0OworICBteSAkc2VsZiA9IHRpZWQoJSRoYXNoKTsKKyAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgJGZpbGVuYW1lIHx8PSAkc2VsZi0+e2ZpbGVuYW1lfTsKKworICBvcGVuIG15ICRmaCwgIj4kZmlsZW5hbWUiCisgICAgICBvciBjcm9hayAiQ2Fubm90IG9wZW4gJGZpbGVuYW1lIGZvciB3cml0aW5nOiAkISI7CisgIHByaW50ICRmaCAkeyRzZWxmLT57ZGF0YX19OworICBjbG9zZSAkZmg7Cit9CisKKz1wb2QKKworPWl0ZW0gQzw8IGxlbmd0aCAoKSA+PgorCitMZW5ndGggb2Ygb3B0aW9uIFJPTSBkYXRhLiAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlLCBub3QgdGhlCitsZW5ndGggZnJvbSB0aGUgUk9NIGhlYWRlciBsZW5ndGggZmllbGQuCisKKz1jdXQKKworc3ViIGxlbmd0aCB7CisgIG15ICRoYXNoID0gc2hpZnQ7CisgIG15ICRzZWxmID0gdGllZCglJGhhc2gpOworCisgIHJldHVybiBsZW5ndGggJHskc2VsZi0+e2RhdGF9fTsKK30KKworPXBvZAorCis9aXRlbSBDPDwgcGNpX2hlYWRlciAoKSA+PgorCitSZXR1cm4gYSBDPE9wdGlvbjo6Uk9NOjpQQ0k+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFJPTSdzIFBDSSBoZWFkZXIsCitpZiBwcmVzZW50LgorCis9Y3V0CisKK3N1YiBwY2lfaGVhZGVyIHsKKyAgbXkgJGhhc2ggPSBzaGlmdDsKKyAgbXkgJHNlbGYgPSB0aWVkKCUkaGFzaCk7CisKKyAgbXkgJG9mZnNldCA9ICRoYXNoLT57cGNpX2hlYWRlcn07CisgIHJldHVybiB1bmRlZiB1bmxlc3MgJG9mZnNldCAhPSAwOworCisgIHJldHVybiBPcHRpb246OlJPTTo6UENJLT5uZXcgKCAkc2VsZi0+e2RhdGF9LCAkb2Zmc2V0ICk7Cit9CisKKz1wb2QKKworPWl0ZW0gQzw8IHBucF9oZWFkZXIgKCkgPj4KKworUmV0dXJuIGEgQzxPcHRpb246OlJPTTo6UG5QPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBST00ncyBQblAgaGVhZGVyLAoraWYgcHJlc2VudC4KKworPWN1dAorCitzdWIgcG5wX2hlYWRlciB7CisgIG15ICRoYXNoID0gc2hpZnQ7CisgIG15ICRzZWxmID0gdGllZCglJGhhc2gpOworCisgIG15ICRvZmZzZXQgPSAkaGFzaC0+e3BucF9oZWFkZXJ9OworICByZXR1cm4gdW5kZWYgdW5sZXNzICRvZmZzZXQgIT0gMDsKKworICByZXR1cm4gT3B0aW9uOjpST006OlBuUC0+bmV3ICggJHNlbGYtPntkYXRhfSwgJG9mZnNldCApOworfQorCis9cG9kCisKKz1pdGVtIEM8PCBjaGVja3N1bSAoKSA+PgorCitDYWxjdWxhdGUgdGhlIGJ5dGUgY2hlY2tzdW0gb2YgdGhlIFJPTS4KKworPWN1dAorCitzdWIgY2hlY2tzdW0geworICBteSAkaGFzaCA9IHNoaWZ0OworICBteSAkc2VsZiA9IHRpZWQoJSRoYXNoKTsKKworICByZXR1cm4gdW5wYWNrICggIiU4QyoiLCAkeyRzZWxmLT57ZGF0YX19ICk7Cit9CisKKz1wb2QKKworPWl0ZW0gQzw8IGZpeF9jaGVja3N1bSAoKSA+PgorCitGaXggdGhlIGJ5dGUgY2hlY2tzdW0gb2YgdGhlIFJPTS4KKworPWN1dAorCitzdWIgZml4X2NoZWNrc3VtIHsKKyAgbXkgJGhhc2ggPSBzaGlmdDsKKyAgbXkgJHNlbGYgPSB0aWVkKCUkaGFzaCk7CisKKyAgJGhhc2gtPntjaGVja3N1bX0gPSAoICggJGhhc2gtPntjaGVja3N1bX0gLSAkaGFzaC0+Y2hlY2tzdW0oKSApICYgMHhmZiApOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgT3B0aW9uOjpST006OlBDSQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3BhY2thZ2UgT3B0aW9uOjpST006OlBDSTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBDYXJwOwordXNlIGJ5dGVzOworCitzdWIgbmV3IHsKKyAgbXkgJGNsYXNzID0gc2hpZnQ7CisgIG15ICRkYXRhID0gc2hpZnQ7CisgIG15ICRvZmZzZXQgPSBzaGlmdDsKKworICBteSAkaGFzaCA9IHt9OworICB0aWUgJSRoYXNoLCAiT3B0aW9uOjpST006OkZpZWxkcyIsIHsKKyAgICBkYXRhID0+ICRkYXRhLAorICAgIG9mZnNldCA9PiAkb2Zmc2V0LAorICAgIGxlbmd0aCA9PiAweDBjLAorICAgIGZpZWxkcyA9PiB7CisgICAgICBzaWduYXR1cmUgPT4JeyBvZmZzZXQgPT4gMHgwMCwgbGVuZ3RoID0+IDB4MDQsIHBhY2sgPT4gImE0IiB9LAorICAgICAgdmVuZG9yX2lkID0+CXsgb2Zmc2V0ID0+IDB4MDQsIGxlbmd0aCA9PiAweDAyLCBwYWNrID0+ICJTIiB9LAorICAgICAgZGV2aWNlX2lkID0+CXsgb2Zmc2V0ID0+IDB4MDYsIGxlbmd0aCA9PiAweDAyLCBwYWNrID0+ICJTIiB9LAorICAgICAgZGV2aWNlX2xpc3QgPT4JeyBvZmZzZXQgPT4gMHgwOCwgbGVuZ3RoID0+IDB4MDIsIHBhY2sgPT4gIlMiIH0sCisgICAgICBzdHJ1Y3RfbGVuZ3RoID0+CXsgb2Zmc2V0ID0+IDB4MGEsIGxlbmd0aCA9PiAweDAyLCBwYWNrID0+ICJTIiB9LAorICAgICAgc3RydWN0X3JldmlzaW9uID0+eyBvZmZzZXQgPT4gMHgwYywgbGVuZ3RoID0+IDB4MDEsIHBhY2sgPT4gIkMiIH0sCisgICAgICBiYXNlX2NsYXNzID0+IAl7IG9mZnNldCA9PiAweDBkLCBsZW5ndGggPT4gMHgwMSwgcGFjayA9PiAiQyIgfSwKKyAgICAgIHN1Yl9jbGFzcyA9PiAJeyBvZmZzZXQgPT4gMHgwZSwgbGVuZ3RoID0+IDB4MDEsIHBhY2sgPT4gIkMiIH0sCisgICAgICBwcm9nX2ludGYgPT4gCXsgb2Zmc2V0ID0+IDB4MGYsIGxlbmd0aCA9PiAweDAxLCBwYWNrID0+ICJDIiB9LAorICAgICAgaW1hZ2VfbGVuZ3RoID0+CXsgb2Zmc2V0ID0+IDB4MTAsIGxlbmd0aCA9PiAweDAyLCBwYWNrID0+ICJTIiB9LAorICAgICAgcmV2aXNpb24gPT4JeyBvZmZzZXQgPT4gMHgxMiwgbGVuZ3RoID0+IDB4MDIsIHBhY2sgPT4gIlMiIH0sCisgICAgICBjb2RlX3R5cGUgPT4gCXsgb2Zmc2V0ID0+IDB4MTQsIGxlbmd0aCA9PiAweDAxLCBwYWNrID0+ICJDIiB9LAorICAgICAgbGFzdF9pbWFnZSA9PiAJeyBvZmZzZXQgPT4gMHgxNSwgbGVuZ3RoID0+IDB4MDEsIHBhY2sgPT4gIkMiIH0sCisgICAgICBydW50aW1lX2xlbmd0aCA9Pgl7IG9mZnNldCA9PiAweDE2LCBsZW5ndGggPT4gMHgwMiwgcGFjayA9PiAiUyIgfSwKKyAgICAgIGNvbmZfaGVhZGVyID0+CXsgb2Zmc2V0ID0+IDB4MTgsIGxlbmd0aCA9PiAweDAyLCBwYWNrID0+ICJTIiB9LAorICAgICAgY2xwX2VudHJ5ID0+CXsgb2Zmc2V0ID0+IDB4MWEsIGxlbmd0aCA9PiAweDAyLCBwYWNrID0+ICJTIiB9LAorICAgIH0sCisgIH07CisgIGJsZXNzICRoYXNoLCAkY2xhc3M7CisKKyAgIyBSZXRyaWV2ZSB0cnVlIGxlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgbXkgJHNlbGYgPSB0aWVkICggJSRoYXNoICk7CisgICRzZWxmLT57bGVuZ3RofSA9ICRoYXNoLT57c3RydWN0X2xlbmd0aH07CisKKyAgcmV0dXJuICRoYXNoOyAgCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBPcHRpb246OlJPTTo6UG5QCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworcGFja2FnZSBPcHRpb246OlJPTTo6UG5QOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIENhcnA7Cit1c2UgYnl0ZXM7CisKK3N1YiBuZXcgeworICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgbXkgJGRhdGEgPSBzaGlmdDsKKyAgbXkgJG9mZnNldCA9IHNoaWZ0OworCisgIG15ICRoYXNoID0ge307CisgIHRpZSAlJGhhc2gsICJPcHRpb246OlJPTTo6RmllbGRzIiwgeworICAgIGRhdGEgPT4gJGRhdGEsCisgICAgb2Zmc2V0ID0+ICRvZmZzZXQsCisgICAgbGVuZ3RoID0+IDB4MDYsCisgICAgZmllbGRzID0+IHsKKyAgICAgIHNpZ25hdHVyZSA9Pgl7IG9mZnNldCA9PiAweDAwLCBsZW5ndGggPT4gMHgwNCwgcGFjayA9PiAiYTQiIH0sCisgICAgICBzdHJ1Y3RfcmV2aXNpb24gPT57IG9mZnNldCA9PiAweDA0LCBsZW5ndGggPT4gMHgwMSwgcGFjayA9PiAiQyIgfSwKKyAgICAgIHN0cnVjdF9sZW5ndGggPT4JeyBvZmZzZXQgPT4gMHgwNSwgbGVuZ3RoID0+IDB4MDEsIHBhY2sgPT4gIkMiIH0sCisgICAgICBjaGVja3N1bSA9Pgl7IG9mZnNldCA9PiAweDA5LCBsZW5ndGggPT4gMHgwMSwgcGFjayA9PiAiQyIgfSwKKyAgICAgIG1hbnVmYWN0dXJlciA9Pgl7IG9mZnNldCA9PiAweDBlLCBsZW5ndGggPT4gMHgwMiwgcGFjayA9PiAiUyIgfSwKKyAgICAgIHByb2R1Y3QgPT4JeyBvZmZzZXQgPT4gMHgxMCwgbGVuZ3RoID0+IDB4MDIsIHBhY2sgPT4gIlMiIH0sCisgICAgICBiY3YgPT4JCXsgb2Zmc2V0ID0+IDB4MTYsIGxlbmd0aCA9PiAweDAyLCBwYWNrID0+ICJTIiB9LAorICAgICAgYmR2ID0+CQl7IG9mZnNldCA9PiAweDE4LCBsZW5ndGggPT4gMHgwMiwgcGFjayA9PiAiUyIgfSwKKyAgICAgIGJldiA9PgkJeyBvZmZzZXQgPT4gMHgxYSwgbGVuZ3RoID0+IDB4MDIsIHBhY2sgPT4gIlMiIH0sCisgICAgfSwKKyAgfTsKKyAgYmxlc3MgJGhhc2gsICRjbGFzczsKKworICAjIFJldHJpZXZlIHRydWUgbGVuZ3RoIG9mIHN0cnVjdHVyZQorICBteSAkc2VsZiA9IHRpZWQgKCAlJGhhc2ggKTsKKyAgJHNlbGYtPntsZW5ndGh9ID0gKCAkaGFzaC0+e3N0cnVjdF9sZW5ndGh9ICogMTYgKTsKKworICByZXR1cm4gJGhhc2g7ICAKK30KKworc3ViIGNoZWNrc3VtIHsKKyAgbXkgJGhhc2ggPSBzaGlmdDsKKyAgbXkgJHNlbGYgPSB0aWVkKCUkaGFzaCk7CisKKyAgcmV0dXJuICRzZWxmLT5jaGVja3N1bSgpOworfQorCitzdWIgZml4X2NoZWNrc3VtIHsKKyAgbXkgJGhhc2ggPSBzaGlmdDsKKyAgbXkgJHNlbGYgPSB0aWVkKCUkaGFzaCk7CisKKyAgJGhhc2gtPntjaGVja3N1bX0gPSAoICggJGhhc2gtPntjaGVja3N1bX0gLSAkaGFzaC0+Y2hlY2tzdW0oKSApICYgMHhmZiApOworfQorCitzdWIgbWFudWZhY3R1cmVyIHsKKyAgbXkgJGhhc2ggPSBzaGlmdDsKKyAgbXkgJHNlbGYgPSB0aWVkKCUkaGFzaCk7CisKKyAgbXkgJG1hbnVmYWN0dXJlciA9ICRoYXNoLT57bWFudWZhY3R1cmVyfTsKKyAgcmV0dXJuIHVuZGVmIHVubGVzcyAkbWFudWZhY3R1cmVyOworCisgIG15ICRyYXcgPSBzdWJzdHIgKCAkeyRzZWxmLT57ZGF0YX19LCAkbWFudWZhY3R1cmVyICk7CisgIHJldHVybiB1bnBhY2sgKCAiWioiLCAkcmF3ICk7Cit9CisKK3N1YiBwcm9kdWN0IHsKKyAgbXkgJGhhc2ggPSBzaGlmdDsKKyAgbXkgJHNlbGYgPSB0aWVkKCUkaGFzaCk7CisKKyAgbXkgJHByb2R1Y3QgPSAkaGFzaC0+e3Byb2R1Y3R9OworICByZXR1cm4gdW5kZWYgdW5sZXNzICRwcm9kdWN0OworCisgIG15ICRyYXcgPSBzdWJzdHIgKCAkeyRzZWxmLT57ZGF0YX19LCAkcHJvZHVjdCApOworICByZXR1cm4gdW5wYWNrICggIloqIiwgJHJhdyApOworfQorCisxOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXRpbC9jYXRyb20ucGwgYi9ncHhlL3NyYy91dGlsL2NhdHJvbS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZTM3ZTZiCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXRpbC9jYXRyb20ucGwKQEAgLTAsMCArMSw0OCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKK3VzZSB3YXJuaW5nczsKK3VzZSBzdHJpY3Q7CisKK3VzZSBieXRlczsKKwordXNlIGNvbnN0YW50IE1BWF9ST01fTEVOID0+IDEwMjQqMTAyNDsKK3VzZSBjb25zdGFudCBQQ0lfT0ZGID0+IDB4MTg7Cit1c2UgY29uc3RhbnQgSU5ESUNBVE9SX09GRiA9PiAweDE1OworCitteSAkdG90YWxfbGVuID0gMDsKK215IEByb21maWxlcyA9IEBBUkdWCisgICAgb3IgZGllICJVc2FnZTogJDAgcm9tLWZpbGUtMSByb20tZmlsZS0yIC4uLiA+IG11bHRpLXJvbS1maWxlXG4iOworCit3aGlsZSAoIG15ICRyb21maWxlID0gc2hpZnQgQHJvbWZpbGVzICkgeworICBteSAkbGFzdCA9IEByb21maWxlcyA/IDAgOiAxOworCisgIG9wZW4gUk9NLCAiPCRyb21maWxlIiBvciBkaWUgIkNvdWxkIG5vdCBvcGVuICRyb21maWxlOiAkIVxuIjsKKyAgbXkgJGxlbiA9IHJlYWQgKCBST00sIG15ICRyb21kYXRhLCBNQVhfUk9NX0xFTiApCisgICAgICBvciBkaWUgIkNvdWxkIG5vdCByZWFkICRyb21maWxlOiAkIVxuIjsKKyAgY2xvc2UgUk9NOworCisgIGRpZSAiJHJvbWZpbGUgaXMgbm90IGEgUk9NIGZpbGVcbiIKKyAgICAgIHVubGVzcyBzdWJzdHIgKCAkcm9tZGF0YSwgMCwgMiApIGVxICJceDU1XHhBQSI7CisKKyAgKCBteSAkY2hlY2tsZW4gKSA9IHVucGFjayAoICdDJywgc3Vic3RyICggJHJvbWRhdGEsIDIsIDEgKSApOworICAkY2hlY2tsZW4gKj0gNTEyOworICBkaWUgIiRyb21maWxlIGhhcyBpbmNvcnJlY3QgbGVuZ3RoIGZpZWxkICRjaGVja2xlbiAoc2hvdWxkIGJlICRsZW4pXG4iCisgICAgICB1bmxlc3MgJGxlbiA9PSAkY2hlY2tsZW47CisKKyAgKCBteSAkcGNpICkgPSB1bnBhY2sgKCAndicsIHN1YnN0ciAoICRyb21kYXRhLCBQQ0lfT0ZGLCAyICkgKTsKKyAgZGllICJJbnZhbGlkIFBDSSBvZmZzZXQgZmllbGQgaW4gJHJvbWZpbGVcbiIKKyAgICAgIGlmICRwY2kgPj0gJGxlbjsKKyAgZGllICJObyBQQ0lSIHNpZ25hdHVyZSBpbiAkcm9tZmlsZVxuIgorICAgICAgdW5sZXNzIHN1YnN0ciAoICRyb21kYXRhLCAkcGNpLCA0ICkgZXEgIlBDSVIiOworICAKKyAgKCBteSAkaW5kaWNhdG9yICkgPQorICAgICAgdW5wYWNrICggJ0MnLCBzdWJzdHIgKCAkcm9tZGF0YSwgJHBjaSArIElORElDQVRPUl9PRkYsIDEgKSApOworICBteSAkbXNnID0gc3ByaW50ZiAoICIkcm9tZmlsZTogaW5kaWNhdG9yIHdhcyAlMDJ4LCAiLCAkaW5kaWNhdG9yICk7CisgICRpbmRpY2F0b3IgJj0gISAoIDEgPDwgNyApOworICAkaW5kaWNhdG9yIHw9ICggJGxhc3QgPDwgNyApOworICAkbXNnIC49IHNwcmludGYgKCAibm93ICUwMnhcbiIsICRpbmRpY2F0b3IgKTsKKyAgc3Vic3RyICggJHJvbWRhdGEsICRwY2kgKyBJTkRJQ0FUT1JfT0ZGLCAxICkgPSBwYWNrICggJ0MnLCAkaW5kaWNhdG9yICk7CisgIHdhcm4gJG1zZzsKKworICBwcmludCAkcm9tZGF0YTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvZGlmZnNpemUucGwgYi9ncHhlL3NyYy91dGlsL2RpZmZzaXplLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0OTc4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL2RpZmZzaXplLnBsCkBAIC0wLDAgKzEsMTAxIEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMgdXNhZ2U6CisjIFtzb21lYm9keUBzb21ld2hlcmUgfi9ncHhlL3NyY10kIC4vdXRpbC9kaWZmc2l6ZS5wbCBbPG9sZCByZXY+IFs8bmV3IHJldj5dXQorIyBieSBkZWZhdWx0IDxvbGQgcmV2PiBpcyBIRUFEIGFuZCA8bmV3IHJldj4gaXMgdGhlIHdvcmtpbmcgdHJlZQorCit1c2Ugc3RyaWN0OworCistZCAiYmluIiBvciBkaWUgIlBsZWFzZSBydW4gbWUgaW4gdGhlIGdQWEUgc3JjIGRpcmVjdG9yeVxuIjsKK21rZGlyICIuc2l6ZXMiOworCitteSgkb2xkcmV2LCAkbmV3cmV2KTsKK215KCRvbGRuYW1lLCAkbmV3bmFtZSk7CisKK2lmIChAQVJHVikgeworICAkb2xkbmFtZSA9IHNoaWZ0OworfSBlbHNlIHsKKyAgJG9sZG5hbWUgPSAiSEVBRCI7Cit9CisKK2lmIChAQVJHVikgeworICAkbmV3bmFtZSA9IHNoaWZ0OworfSBlbHNlIHsKKyAgJG5ld3JldiA9ICJ0cmVlIiAuIHRpbWUoKTsKK30KKworJG9sZHJldiA9IGBnaXQgcmV2LXBhcnNlICRvbGRuYW1lYDsKK2Nob21wICRvbGRyZXY7CisKK3VubGVzcyAoZGVmaW5lZCAkbmV3cmV2KSB7CisgICRuZXdyZXYgPSBgZ2l0IHJldi1wYXJzZSAkbmV3bmFtZWA7CisgIGNob21wICRuZXdyZXY7Cit9CisKK3N1YiBjYWxjX3NpemVzKCQkKSB7CisgIG15KCRuYW1lLCAkcmV2KSA9IEBfOworICBteSAkb3V0cHV0OworICBteSAkbGFzdHJldjsKKyAgbXkgJHN0YXNoZWQgPSAwOworICBteSAkcmVzID0gMDsKKworICByZXR1cm4gaWYgLWUgIi5zaXplcy8kcmV2LnNpemVzIjsKKworICBpZiAoZGVmaW5lZCAkbmFtZSkgeworICAgICRvdXRwdXQgPSBgZ2l0IHN0YXNoYDsKKyAgICAkc3Rhc2hlZCA9IDEgdW5sZXNzICRvdXRwdXQgPX4gL05vIGxvY2FsIGNoYW5nZXMgdG8gc2F2ZS87CisgICAgJGxhc3RyZXYgPSBgZ2l0IG5hbWUtcmV2IC0tbmFtZS1vbmx5IEhFQURgOworICAgIHN5c3RlbSgiZ2l0IGNoZWNrb3V0ICRuYW1lID4vZGV2L251bGwiKTsgJHJlcyB8fD0gJD87CisgIH0KKworICBzeXN0ZW0oIm1ha2UgLWo0IGJpbi9ncHhlLmxrcm4gPi9kZXYvbnVsbCIpOyAkcmVzIHx8PSAkPzsKKyAgc3lzdGVtKCJtYWtlIGJpbi9ncHhlLmxrcm4uc2l6ZXMgPiAuc2l6ZXMvJHJldi5zaXplcyIpOyAkcmVzIHx8PSAkPzsKKworICBpZiAoZGVmaW5lZCAkbmFtZSkgeworICAgIHN5c3RlbSgiZ2l0IGNoZWNrb3V0ICRsYXN0cmV2ID4vZGV2L251bGwiKTsgJHJlcyB8fD0gJD87CisgICAgc3lzdGVtKCJnaXQgc3Rhc2ggcG9wID4vZGV2L251bGwiKSBpZiAkc3Rhc2hlZDsgJHJlcyB8fD0gJD87CisgIH0KKworICBpZiAoJHJlcykgeworICAgIHVubGluaygiLnNpemVzLyRyZXYuc2l6ZXMiKTsKKyAgICBkaWUgIkVycm9yIG1ha2luZyBzaXplcyBmaWxlXG4iOworICB9Cit9CisKK291ciAlU2l6ZXM7CisKK3N1YiBzYXZlX3NpemVzKCQkKSB7CisgIG15KCRpZCwgJHJldikgPSBAXzsKKyAgbXkgJGZpbGUgPSAiLnNpemVzLyRyZXYuc2l6ZXMiOworCisgIG9wZW4gU0laRVMsICRmaWxlIG9yIGRpZSAib3BlbmluZyAkZmlsZTogJCFcbiI7CisgIHdoaWxlICg8U0laRVM+KSB7CisgICAgbXkoJHRleHQsICRkYXRhLCAkYnNzLCAkdG90YWwsICRoZXgsICRuYW1lKSA9IHNwbGl0OworICAgICRuYW1lID1+IHN8YmluL3x8OyAkbmFtZSA9fiBzfFwubyR8fDsKKworICAgICMgU2tpcCB0aGUgaGVhZGVyIGFuZCB0b3RhbHMgbGluZXMKKyAgICBuZXh0IGlmICR0b3RhbCA9fiAvW2Etel0vIG9yICRuYW1lID1+IC9UT1RBTFMvOworCisgICAgIyBTa2lwIGZpbGVzIG5hbWVkIHdpdGggZGFzaCwgZHVlIHRvIG9sZCBNYWtlZmlsZSBidWcKKyAgICBuZXh0IGlmICRuYW1lID1+IC8tLzsKKworICAgICRTaXplc3skbmFtZX0gPSB7b2xkID0+IDAsIG5ldyA9PiAwfSB1bmxlc3MgZXhpc3RzICRTaXplc3skbmFtZX07CisgICAgJFNpemVzeyRuYW1lfXskaWR9ID0gJHRvdGFsOworICB9Cit9CisKK2NhbGNfc2l6ZXMoJG9sZG5hbWUsICRvbGRyZXYpOworY2FsY19zaXplcygkbmV3bmFtZSwgJG5ld3Jldik7CisKK3NhdmVfc2l6ZXMoJ29sZCcsICRvbGRyZXYpOworc2F2ZV9zaXplcygnbmV3JywgJG5ld3Jldik7CisKK215ICR0b3RhbCA9IDA7CisKK2ZvciAoc29ydCBrZXlzICVTaXplcykgeworICBteSAkZGlmZiA9ICRTaXplc3skX317bmV3fSAtICRTaXplc3skX317b2xkfTsKKyAgaWYgKGFicygkZGlmZikgPj0gMTYpIHsKKyAgICBwcmludGYgIiUxMnMgJStkXG4iLCBzdWJzdHIoJF8sIDAsIDEyKSwgJFNpemVzeyRffXtuZXd9IC0gJFNpemVzeyRffXtvbGR9OworICB9CisgICR0b3RhbCArPSAkZGlmZjsKK30KK3ByaW50ZiAiICAgICAgVE9UQUw6ICUrZFxuIiwgJHRvdGFsOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXRpbC9kaXNyb20ucGwgYi9ncHhlL3NyYy91dGlsL2Rpc3JvbS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZmI0Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXRpbC9kaXNyb20ucGwKQEAgLTAsMCArMSw4MSBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisjIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluIjsKK3VzZSBPcHRpb246OlJPTSBxdyAoIDphbGwgKTsKKworbXkgJHJvbWZpbGUgPSBzaGlmdCB8fCAiLSI7CitteSAkcm9tID0gbmV3IE9wdGlvbjo6Uk9NOworJHJvbS0+bG9hZCAoICRyb21maWxlICk7CisKK2RpZSAiTm90IGFuIG9wdGlvbiBST00gaW1hZ2VcbiIKKyAgICB1bmxlc3MgJHJvbS0+e3NpZ25hdHVyZX0gPT0gUk9NX1NJR05BVFVSRTsKKworbXkgJHJvbWxlbmd0aCA9ICggJHJvbS0+e2xlbmd0aH0gKiA1MTIgKTsKK215ICRmaWxlbGVuZ3RoID0gJHJvbS0+bGVuZ3RoOworZGllICJST00gaW1hZ2UgdHJ1bmNhdGVkIChpcyAkZmlsZWxlbmd0aCwgc2hvdWxkIGJlICRyb21sZW5ndGgpXG4iCisgICAgaWYgJGZpbGVsZW5ndGggPCAkcm9tbGVuZ3RoOworCitwcmludGYgIlJPTSBoZWFkZXI6XG5cbiI7CitwcmludGYgIiAgJS0xNnMgMHglMDJ4ICglZClcbiIsICJMZW5ndGg6IiwgJHJvbS0+e2xlbmd0aH0sICggJHJvbS0+e2xlbmd0aH0gKiA1MTIgKTsKK3ByaW50ZiAiICAlLTE2cyAweCUwMnggKCVzMHglMDJ4KVxuIiwgIkNoZWNrc3VtOiIsICRyb20tPntjaGVja3N1bX0sCisgICAgICAgKCAoICRyb20tPmNoZWNrc3VtID09IDAgKSA/ICIiIDogIklOQ09SUkVDVDogIiApLCAkcm9tLT5jaGVja3N1bTsKK3ByaW50ZiAiICAlLTE2cyAweCUwNHhcbiIsICJJbml0OiIsICRyb20tPntpbml0fTsKK3ByaW50ZiAiICAlLTE2cyAweCUwNHhcbiIsICJVTkRJIGhlYWRlcjoiLCAkcm9tLT57dW5kaV9oZWFkZXJ9OworcHJpbnRmICIgICUtMTZzIDB4JTA0eFxuIiwgIlBDSSBoZWFkZXI6IiwgJHJvbS0+e3BjaV9oZWFkZXJ9OworcHJpbnRmICIgICUtMTZzIDB4JTA0eFxuIiwgIlBuUCBoZWFkZXI6IiwgJHJvbS0+e3BucF9oZWFkZXJ9OworcHJpbnRmICJcbiI7CisKK215ICRwY2kgPSAkcm9tLT5wY2lfaGVhZGVyKCk7CitpZiAoICRwY2kgKSB7CisgIHByaW50ZiAiUENJIGhlYWRlcjpcblxuIjsKKyAgcHJpbnRmICIgICUtMTZzICVzXG4iLCAiU2lnbmF0dXJlOiIsICRwY2ktPntzaWduYXR1cmV9OworICBwcmludGYgIiAgJS0xNnMgMHglMDR4XG4iLCAiVmVuZG9yIElEOiIsICRwY2ktPnt2ZW5kb3JfaWR9OworICBwcmludGYgIiAgJS0xNnMgMHglMDR4XG4iLCAiRGV2aWNlIElEOiIsICRwY2ktPntkZXZpY2VfaWR9OworICBwcmludGYgIiAgJS0xNnMgMHglMDJ4JTAyeCUwMnhcbiIsICJEZXZpY2UgY2xhc3M6IiwKKwkgJHBjaS0+e2Jhc2VfY2xhc3N9LCAkcGNpLT57c3ViX2NsYXNzfSwgJHBjaS0+e3Byb2dfaW50Zn07CisgIHByaW50ZiAiICAlLTE2cyAweCUwNHggKCVkKVxuIiwgIkltYWdlIGxlbmd0aDoiLAorCSAkcGNpLT57aW1hZ2VfbGVuZ3RofSwgKCAkcGNpLT57aW1hZ2VfbGVuZ3RofSAqIDUxMiApOworICBwcmludGYgIiAgJS0xNnMgMHglMDR4ICglZClcbiIsICJSdW50aW1lIGxlbmd0aDoiLAorCSAkcGNpLT57cnVudGltZV9sZW5ndGh9LCAoICRwY2ktPntydW50aW1lX2xlbmd0aH0gKiA1MTIgKTsKKyAgaWYgKCBleGlzdHMgJHBjaS0+e2NvbmZfaGVhZGVyfSApIHsKKyAgICBwcmludGYgIiAgJS0xNnMgMHglMDR4XG4iLCAiQ29uZmlnIGhlYWRlcjoiLCAkcGNpLT57Y29uZl9oZWFkZXJ9OworICAgIHByaW50ZiAiICAlLTE2cyAweCUwNHhcbiIsICJDTFAgZW50cnk6IiwgJHBjaS0+e2NscF9lbnRyeX07CisgIH0KKyAgcHJpbnRmICJcbiI7Cit9CisKK215ICRwbnAgPSAkcm9tLT5wbnBfaGVhZGVyKCk7CitpZiAoICRwbnAgKSB7CisgIHByaW50ZiAiUG5QIGhlYWRlcjpcblxuIjsKKyAgcHJpbnRmICIgICUtMTZzICVzXG4iLCAiU2lnbmF0dXJlOiIsICRwbnAtPntzaWduYXR1cmV9OworICBwcmludGYgIiAgJS0xNnMgMHglMDJ4ICglczB4JTAyeClcbiIsICJDaGVja3N1bToiLCAkcG5wLT57Y2hlY2tzdW19LAorCSAoICggJHBucC0+Y2hlY2tzdW0gPT0gMCApID8gIiIgOiAiSU5DT1JSRUNUOiAiICksICRwbnAtPmNoZWNrc3VtOworICBwcmludGYgIiAgJS0xNnMgMHglMDR4IFwiJXNcIlxuIiwgIk1hbnVmYWN0dXJlcjoiLAorCSAkcG5wLT57bWFudWZhY3R1cmVyfSwgJHBucC0+bWFudWZhY3R1cmVyOworICBwcmludGYgIiAgJS0xNnMgMHglMDR4IFwiJXNcIlxuIiwgIlByb2R1Y3Q6IiwKKwkgJHBucC0+e3Byb2R1Y3R9LCAkcG5wLT5wcm9kdWN0OworICBwcmludGYgIiAgJS0xNnMgMHglMDR4XG4iLCAiQkNWOiIsICRwbnAtPntiY3Z9OworICBwcmludGYgIiAgJS0xNnMgMHglMDR4XG4iLCAiQkRWOiIsICRwbnAtPntiZHZ9OworICBwcmludGYgIiAgJS0xNnMgMHglMDR4XG4iLCAiQkVWOiIsICRwbnAtPntiZXZ9OworICBwcmludGYgIlxuIjsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvZWZpcm9tLmMgYi9ncHhlL3NyYy91dGlsL2VmaXJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjlkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL2VmaXJvbS5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGdweGUvZWZpL2VmaS5oPgorI2luY2x1ZGUgPGdweGUvZWZpL0luZHVzdHJ5U3RhbmRhcmQvUGVJbWFnZS5oPgorI2luY2x1ZGUgPGdweGUvZWZpL0luZHVzdHJ5U3RhbmRhcmQvUGNpMjIuaD4KKworI2RlZmluZSBlcHJpbnRmKC4uLikgZnByaW50ZiAoIHN0ZGVyciwgX19WQV9BUkdTX18gKQorCisvKiogQ29tbWFuZC1saW5lIG9wdGlvbnMgKi8KK3N0cnVjdCBvcHRpb25zIHsKKwl1aW50MTZfdCB2ZW5kb3I7CisJdWludDE2X3QgZGV2aWNlOworfTsKKworLyoqCisgKiBBbGxvY2F0ZSBtZW1vcnkKKyAqCisgKiBAdiBsZW4JCUxlbmd0aCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUKKyAqIEByZXQgcHRyCQlQb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgKiB4bWFsbG9jICggc2l6ZV90IGxlbiApIHsKKwl2b2lkICpwdHI7CisKKwlwdHIgPSBtYWxsb2MgKCBsZW4gKTsKKwlpZiAoICEgcHRyICkgeworCQllcHJpbnRmICggIkNvdWxkIG5vdCBhbGxvY2F0ZSAlemQgYnl0ZXNcbiIsIGxlbiApOworCQlleGl0ICggMSApOworCX0KKworCXJldHVybiBwdHI7Cit9CisKKy8qKgorICogR2V0IGZpbGUgc2l6ZQorICoKKyAqIEB2IGZpbGUJCUZpbGUKKyAqIEB2IGxlbgkJRmlsZSBzaXplCisgKi8KK3N0YXRpYyBzaXplX3QgZmlsZV9zaXplICggRklMRSAqZmlsZSApIHsKKwlzc2l6ZV90IGxlbjsKKworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogUmVhZCBpbmZvcm1hdGlvbiBmcm9tIFBFIGhlYWRlcnMKKyAqCisgKiBAdiBwZQkJUEUgZmlsZQorICogQHJldCBtYWNoaW5lCQlNYWNoaW5lIHR5cGUKKyAqIEByZXQgc3Vic3lzdGVtCUVGSSBzdWJzeXN0ZW0KKyAqLworc3RhdGljIHZvaWQgcmVhZF9wZV9pbmZvICggdm9pZCAqcGUsIHVpbnQxNl90ICptYWNoaW5lLAorCQkJICAgdWludDE2X3QgKnN1YnN5c3RlbSApIHsKKwlFRklfSU1BR0VfRE9TX0hFQURFUiAqZG9zOworCXVuaW9uIHsKKwkJRUZJX0lNQUdFX05UX0hFQURFUlMzMiBudDMyOworCQlFRklfSU1BR0VfTlRfSEVBREVSUzY0IG50NjQ7CisJfSAqbnQ7CisKKwkvKiBMb2NhdGUgTlQgaGVhZGVyICovCisJZG9zID0gcGU7CisJbnQgPSAoIHBlICsgZG9zLT5lX2xmYW5ldyApOworCisJLyogUGFyc2Ugb3V0IFBFIGluZm9ybWF0aW9uICovCisJKm1hY2hpbmUgPSBudC0+bnQzMi5GaWxlSGVhZGVyLk1hY2hpbmU7CisJc3dpdGNoICggKm1hY2hpbmUgKSB7CisJY2FzZSBFRklfSU1BR0VfTUFDSElORV9JQTMyOgorCQkqc3Vic3lzdGVtID0gbnQtPm50MzIuT3B0aW9uYWxIZWFkZXIuU3Vic3lzdGVtOworCQlicmVhazsKKwljYXNlIEVGSV9JTUFHRV9NQUNISU5FX1g2NDoKKwkJKnN1YnN5c3RlbSA9IG50LT5udDY0Lk9wdGlvbmFsSGVhZGVyLlN1YnN5c3RlbTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXByaW50ZiAoICJVbnJlY29nbmlzZWQgbWFjaGluZSB0eXBlICUwNHhcbiIsICptYWNoaW5lICk7CisJCWV4aXQgKCAxICk7CisJfQorfQorCisvKioKKyAqIENvbnZlcnQgRUZJIGltYWdlIHRvIFJPTSBpbWFnZQorICoKKyAqIEB2IHBlCQlFRkkgZmlsZQorICogQHYgcm9tCQlST00gZmlsZQorICovCitzdGF0aWMgdm9pZCBtYWtlX2VmaV9yb20gKCBGSUxFICpwZSwgRklMRSAqcm9tLCBzdHJ1Y3Qgb3B0aW9ucyAqb3B0cyApIHsKKwlzdHJ1Y3QgeworCQlFRklfUENJX0VYUEFOU0lPTl9ST01fSEVBREVSIHJvbTsKKwkJUENJX0RBVEFfU1RSVUNUVVJFIHBjaSBfX2F0dHJpYnV0ZV9fICgoIGFsaWduZWQgKCA0ICkgKSk7CisJCXVpbnQ4X3QgY2hlY2tzdW07CisJfSAqaGVhZGVyczsKKwlzdHJ1Y3Qgc3RhdCBwZV9zdGF0OworCXNpemVfdCBwZV9zaXplOworCXNpemVfdCByb21fc2l6ZTsKKwl2b2lkICpidWY7CisJdm9pZCAqcGF5bG9hZDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1aW50OF90IGNoZWNrc3VtOworCisJLyogRGV0ZXJtaW5lIFBFIGZpbGUgc2l6ZSAqLworCWlmICggZnN0YXQgKCBmaWxlbm8gKCBwZSApLCAmcGVfc3RhdCApICE9IDAgKSB7CisJCWVwcmludGYgKCAiQ291bGQgbm90IHN0YXQgUEUgZmlsZTogJXNcbiIsCisJCQkgIHN0cmVycm9yICggZXJybm8gKSApOworCQlleGl0ICggMSApOworCX0KKwlwZV9zaXplID0gcGVfc3RhdC5zdF9zaXplOworCisJLyogRGV0ZXJtaW5lIFJPTSBmaWxlIHNpemUgKi8KKwlyb21fc2l6ZSA9ICggKCBwZV9zaXplICsgc2l6ZW9mICggKmhlYWRlcnMgKSArIDUxMSApICYgfjUxMSApOworCisJLyogQWxsb2NhdGUgUk9NIGJ1ZmZlciBhbmQgcmVhZCBpbiBQRSBmaWxlICovCisJYnVmID0geG1hbGxvYyAoIHJvbV9zaXplICk7CisJbWVtc2V0ICggYnVmLCAwLCByb21fc2l6ZSApOworCWhlYWRlcnMgPSBidWY7CisJcGF5bG9hZCA9ICggYnVmICsgc2l6ZW9mICggKmhlYWRlcnMgKSApOworCWlmICggZnJlYWQgKCBwYXlsb2FkLCBwZV9zaXplLCAxLCBwZSApICE9IDEgKSB7CisJCWVwcmludGYgKCAiQ291bGQgbm90IHJlYWQgUEUgZmlsZTogJXNcbiIsCisJCQkgIHN0cmVycm9yICggZXJybm8gKSApOworCQlleGl0ICggMSApOworCX0KKworCS8qIENvbnN0cnVjdCBST00gaGVhZGVyICovCisJaGVhZGVycy0+cm9tLlNpZ25hdHVyZSA9IFBDSV9FWFBBTlNJT05fUk9NX0hFQURFUl9TSUdOQVRVUkU7CisJaGVhZGVycy0+cm9tLkluaXRpYWxpemF0aW9uU2l6ZSA9ICggcm9tX3NpemUgLyA1MTIgKTsKKwloZWFkZXJzLT5yb20uRWZpU2lnbmF0dXJlID0gRUZJX1BDSV9FWFBBTlNJT05fUk9NX0hFQURFUl9FRklTSUdOQVRVUkU7CisJcmVhZF9wZV9pbmZvICggcGF5bG9hZCwgJmhlYWRlcnMtPnJvbS5FZmlNYWNoaW5lVHlwZSwKKwkJICAgICAgICZoZWFkZXJzLT5yb20uRWZpU3Vic3lzdGVtICk7CisJaGVhZGVycy0+cm9tLkVmaUltYWdlSGVhZGVyT2Zmc2V0ID0gc2l6ZW9mICggKmhlYWRlcnMgKTsKKwloZWFkZXJzLT5yb20uUGNpck9mZnNldCA9CisJCW9mZnNldG9mICggdHlwZW9mICggKmhlYWRlcnMgKSwgcGNpICk7CisJaGVhZGVycy0+cGNpLlNpZ25hdHVyZSA9IFBDSV9EQVRBX1NUUlVDVFVSRV9TSUdOQVRVUkU7CisJaGVhZGVycy0+cGNpLlZlbmRvcklkID0gb3B0cy0+dmVuZG9yOworCWhlYWRlcnMtPnBjaS5EZXZpY2VJZCA9IG9wdHMtPmRldmljZTsKKwloZWFkZXJzLT5wY2kuTGVuZ3RoID0gc2l6ZW9mICggaGVhZGVycy0+cGNpICk7CisJaGVhZGVycy0+cGNpLkNsYXNzQ29kZVswXSA9IFBDSV9DTEFTU19ORVRXT1JLOworCWhlYWRlcnMtPnBjaS5JbWFnZUxlbmd0aCA9ICggcm9tX3NpemUgLyA1MTIgKTsKKwloZWFkZXJzLT5wY2kuQ29kZVR5cGUgPSAweDAzOyAvKiBObyBjb25zdGFudCBpbiBFRkkgaGVhZGVycz8gKi8KKwloZWFkZXJzLT5wY2kuSW5kaWNhdG9yID0gMHg4MDsgLyogTm8gY29uc3RhbnQgaW4gRUZJIGhlYWRlcnM/ICovCisKKwkvKiBGaXggaW1hZ2UgY2hlY2tzdW0gKi8KKwlmb3IgKCBpID0gMCwgY2hlY2tzdW0gPSAwIDsgaSA8IHJvbV9zaXplIDsgaSsrICkKKwkJY2hlY2tzdW0gKz0gKiggKCB1aW50OF90ICogKSBidWYgKyBpICk7CisJaGVhZGVycy0+Y2hlY2tzdW0gLT0gY2hlY2tzdW07CisKKwkvKiBXcml0ZSBvdXQgUk9NICovCisJaWYgKCBmd3JpdGUgKCBidWYsIHJvbV9zaXplLCAxLCByb20gKSAhPSAxICkgeworCQllcHJpbnRmICggIkNvdWxkIG5vdCB3cml0ZSBST00gZmlsZTogJXNcbiIsCisJCQkgIHN0cmVycm9yICggZXJybm8gKSApOworCQlleGl0ICggMSApOworCX0KK30KKworLyoqCisgKiBQcmludCBoZWxwCisgKgorICogQHYgcHJvZ3JhbV9uYW1lCVByb2dyYW0gbmFtZQorICovCitzdGF0aWMgdm9pZCBwcmludF9oZWxwICggY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lICkgeworCWVwcmludGYgKCAiU3ludGF4OiAlcyBbLS12ZW5kb3I9VlZWVl0gWy0tZGV2aWNlPURERERdICIKKwkJICAiaW5maWxlIG91dGZpbGVcbiIsIHByb2dyYW1fbmFtZSApOworfQorCisvKioKKyAqIFBhcnNlIGNvbW1hbmQtbGluZSBvcHRpb25zCisgKgorICogQHYgYXJnYwkJQXJndW1lbnQgY291bnQKKyAqIEB2IGFyZ3YJCUFyZ3VtZW50IGxpc3QKKyAqIEB2IG9wdHMJCU9wdGlvbnMgc3RydWN0dXJlIHRvIHBvcHVsYXRlCisgKi8KK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyAoIGNvbnN0IGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCSAgIHN0cnVjdCBvcHRpb25zICpvcHRzICkgeworCWNoYXIgKmVuZDsKKwlpbnQgYzsKKworCXdoaWxlICgxKSB7CisJCWludCBvcHRpb25faW5kZXggPSAwOworCQlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJCXsgInZlbmRvciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAndicgfSwKKwkJCXsgImRldmljZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZCcgfSwKKwkJCXsgImhlbHAiLCAwLCBOVUxMLCAnaCcgfSwKKwkJCXsgMCwgMCwgMCwgMCB9CisJCX07CisKKwkJaWYgKCAoIGMgPSBnZXRvcHRfbG9uZyAoIGFyZ2MsIGFyZ3YsICJ2OmQ6aCIsCisJCQkJCSBsb25nX29wdGlvbnMsCisJCQkJCSAmb3B0aW9uX2luZGV4ICkgKSA9PSAtMSApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoICggYyApIHsKKwkJY2FzZSAndic6CisJCQlvcHRzLT52ZW5kb3IgPSBzdHJ0b3VsICggb3B0YXJnLCAmZW5kLCAxNiApOworCQkJaWYgKCAqZW5kICkgeworCQkJCWVwcmludGYgKCAiSW52YWxpZCB2ZW5kb3IgXCIlc1wiXG4iLCBvcHRhcmcgKTsKKwkJCQlleGl0ICggMiApOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJb3B0cy0+ZGV2aWNlID0gc3RydG91bCAoIG9wdGFyZywgJmVuZCwgMTYgKTsKKwkJCWlmICggKmVuZCApIHsKKwkJCQllcHJpbnRmICggIkludmFsaWQgZGV2aWNlIFwiJXNcIlxuIiwgb3B0YXJnICk7CisJCQkJZXhpdCAoIDIgKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCXByaW50X2hlbHAgKCBhcmd2WzBdICk7CisJCQlleGl0ICggMCApOworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCWV4aXQgKCAyICk7CisJCX0KKwl9CisJcmV0dXJuIG9wdGluZDsKK30KKworaW50IG1haW4gKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJc3RydWN0IG9wdGlvbnMgb3B0cyA9IHsKKwl9OworCXVuc2lnbmVkIGludCBpbmZpbGVfaW5kZXg7CisJY29uc3QgY2hhciAqaW5maWxlX25hbWU7CisJY29uc3QgY2hhciAqb3V0ZmlsZV9uYW1lOworCUZJTEUgKmluZmlsZTsKKwlGSUxFICpvdXRmaWxlOworCisJLyogUGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cyAqLworCWluZmlsZV9pbmRleCA9IHBhcnNlX29wdGlvbnMgKCBhcmdjLCBhcmd2LCAmb3B0cyApOworCWlmICggYXJnYyAhPSAoIGluZmlsZV9pbmRleCArIDIgKSApIHsKKwkJcHJpbnRfaGVscCAoIGFyZ3ZbMF0gKTsKKwkJZXhpdCAoIDIgKTsKKwl9CisJaW5maWxlX25hbWUgPSBhcmd2W2luZmlsZV9pbmRleF07CisJb3V0ZmlsZV9uYW1lID0gYXJndltpbmZpbGVfaW5kZXggKyAxXTsKKworCS8qIE9wZW4gaW5wdXQgYW5kIG91dHB1dCBmaWxlcyAqLworCWluZmlsZSA9IGZvcGVuICggaW5maWxlX25hbWUsICJyIiApOworCWlmICggISBpbmZpbGUgKSB7CisJCWVwcmludGYgKCAiQ291bGQgbm90IG9wZW4gJXMgZm9yIHJlYWRpbmc6ICVzXG4iLAorCQkJICBpbmZpbGVfbmFtZSwgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCWV4aXQgKCAxICk7CisJfQorCW91dGZpbGUgPSBmb3BlbiAoIG91dGZpbGVfbmFtZSwgInciICk7CisJaWYgKCAhIG91dGZpbGUgKSB7CisJCWVwcmludGYgKCAiQ291bGQgbm90IG9wZW4gJXMgZm9yIHdyaXRpbmc6ICVzXG4iLAorCQkJICBvdXRmaWxlX25hbWUsIHN0cmVycm9yICggZXJybm8gKSApOworCQlleGl0ICggMSApOworCX0KKworCS8qIENvbnZlcnQgZmlsZSAqLworCW1ha2VfZWZpX3JvbSAoIGluZmlsZSwgb3V0ZmlsZSwgJm9wdHMgKTsKKworCWZjbG9zZSAoIG91dGZpbGUgKTsKKwlmY2xvc2UgKCBpbmZpbGUgKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXRpbC9lbGYyZWZpLmMgYi9ncHhlL3NyYy91dGlsL2VsZjJlZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjc2NmJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXRpbC9lbGYyZWZpLmMKQEAgLTAsMCArMSw4MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFlbCBCcm93biA8bWJyb3duQGZlbnN5c3RlbXMuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGJmZC5oPgorI2luY2x1ZGUgPGdweGUvZWZpL2VmaS5oPgorI2luY2x1ZGUgPGdweGUvZWZpL0luZHVzdHJ5U3RhbmRhcmQvUGVJbWFnZS5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorCisjZGVmaW5lIGVwcmludGYoLi4uKSBmcHJpbnRmICggc3RkZXJyLCBfX1ZBX0FSR1NfXyApCisKKyNkZWZpbmUgRUZJX0ZJTEVfQUxJR04gMHgyMAorCitzdHJ1Y3QgcGVfc2VjdGlvbiB7CisJc3RydWN0IHBlX3NlY3Rpb24gKm5leHQ7CisJRUZJX0lNQUdFX1NFQ1RJT05fSEVBREVSIGhkcjsKKwl1aW50OF90IGNvbnRlbnRzWzBdOworfTsKKworc3RydWN0IHBlX3JlbG9jcyB7CisJc3RydWN0IHBlX3JlbG9jcyAqbmV4dDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3J2YTsKKwl1bnNpZ25lZCBpbnQgdXNlZF9yZWxvY3M7CisJdW5zaWduZWQgaW50IHRvdGFsX3JlbG9jczsKKwl1aW50MTZfdCAqcmVsb2NzOworfTsKKworc3RydWN0IHBlX2hlYWRlciB7CisJRUZJX0lNQUdFX0RPU19IRUFERVIgZG9zOworCXVpbnQ4X3QgcGFkZGluZ1sxMjhdOworI2lmIGRlZmluZWQoTURFX0NQVV9JQTMyKQorCUVGSV9JTUFHRV9OVF9IRUFERVJTMzIgbnQ7CisjZWxpZiBkZWZpbmVkKE1ERV9DUFVfWDY0KQorCUVGSV9JTUFHRV9OVF9IRUFERVJTNjQgbnQ7CisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGVfaGVhZGVyIGVmaV9wZV9oZWFkZXIgPSB7CisJLmRvcyA9IHsKKwkJLmVfbWFnaWMgPSBFRklfSU1BR0VfRE9TX1NJR05BVFVSRSwKKwkJLmVfbGZhbmV3ID0gb2Zmc2V0b2YgKCB0eXBlb2YgKCBlZmlfcGVfaGVhZGVyICksIG50ICksCisJfSwKKwkubnQgPSB7CisJCS5TaWduYXR1cmUgPSBFRklfSU1BR0VfTlRfU0lHTkFUVVJFLAorCQkuRmlsZUhlYWRlciA9IHsKKyNpZiBkZWZpbmVkKE1ERV9DUFVfSUEzMikKKwkJCS5NYWNoaW5lID0gRUZJX0lNQUdFX01BQ0hJTkVfSUEzMiwKKyNlbGlmIGRlZmluZWQoTURFX0NQVV9YNjQpCisJCQkuTWFjaGluZSA9IEVGSV9JTUFHRV9NQUNISU5FX1g2NCwKKyNlbmRpZgorCQkJLlRpbWVEYXRlU3RhbXAgPSAweDEwZDFhODg0LAorCQkJLlNpemVPZk9wdGlvbmFsSGVhZGVyID0KKwkJCQlzaXplb2YgKCBlZmlfcGVfaGVhZGVyLm50Lk9wdGlvbmFsSGVhZGVyICksCisJCQkuQ2hhcmFjdGVyaXN0aWNzID0gKCBFRklfSU1BR0VfRklMRV9ETEwgfAorI2lmIGRlZmluZWQoTURFX0NQVV9JQTMyKQorCQkJCQkgICAgIEVGSV9JTUFHRV9GSUxFXzMyQklUX01BQ0hJTkUgfAorI2VuZGlmCisJCQkJCSAgICAgRUZJX0lNQUdFX0ZJTEVfRVhFQ1VUQUJMRV9JTUFHRSApLAorCQl9LAorCQkuT3B0aW9uYWxIZWFkZXIgPSB7CisjaWYgZGVmaW5lZChNREVfQ1BVX0lBMzIpCisJCQkuTWFnaWMgPSBFRklfSU1BR0VfTlRfT1BUSU9OQUxfSERSMzJfTUFHSUMsCisjZWxpZiBkZWZpbmVkKE1ERV9DUFVfWDY0KQorCQkJLk1hZ2ljID0gRUZJX0lNQUdFX05UX09QVElPTkFMX0hEUjY0X01BR0lDLAorI2VuZGlmCisJCQkuU2VjdGlvbkFsaWdubWVudCA9IEVGSV9GSUxFX0FMSUdOLAorCQkJLkZpbGVBbGlnbm1lbnQgPSBFRklfRklMRV9BTElHTiwKKwkJCS5TaXplT2ZJbWFnZSA9IHNpemVvZiAoIGVmaV9wZV9oZWFkZXIgKSwKKwkJCS5TaXplT2ZIZWFkZXJzID0gc2l6ZW9mICggZWZpX3BlX2hlYWRlciApLAorCQkJLk51bWJlck9mUnZhQW5kU2l6ZXMgPQorCQkJCUVGSV9JTUFHRV9OVU1CRVJfT0ZfRElSRUNUT1JZX0VOVFJJRVMsCisJCX0sCisJfSwKK307CisKKy8qKiBDb21tYW5kLWxpbmUgb3B0aW9ucyAqLworc3RydWN0IG9wdGlvbnMgeworCXVuc2lnbmVkIGludCBzdWJzeXN0ZW07Cit9OworCisvKioKKyAqIEFsbG9jYXRlIG1lbW9yeQorICoKKyAqIEB2IGxlbgkJTGVuZ3RoIG9mIG1lbW9yeSB0byBhbGxvY2F0ZQorICogQHJldCBwdHIJCVBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCAqIHhtYWxsb2MgKCBzaXplX3QgbGVuICkgeworCXZvaWQgKnB0cjsKKworCXB0ciA9IG1hbGxvYyAoIGxlbiApOworCWlmICggISBwdHIgKSB7CisJCWVwcmludGYgKCAiQ291bGQgbm90IGFsbG9jYXRlICV6ZCBieXRlc1xuIiwgbGVuICk7CisJCWV4aXQgKCAxICk7CisJfQorCisJcmV0dXJuIHB0cjsKK30KKworLyoqCisgKiBBbGlnbiBzZWN0aW9uIHdpdGhpbiBQRSBmaWxlCisgKgorICogQHYgb2Zmc2V0CQlVbmFsaWduZWQgb2Zmc2V0CisgKiBAcmV0IGFsaWduZWRfb2Zmc2V0CUFsaWduZWQgb2Zmc2V0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVmaV9maWxlX2FsaWduICggdW5zaWduZWQgbG9uZyBvZmZzZXQgKSB7CisJcmV0dXJuICggKCBvZmZzZXQgKyBFRklfRklMRV9BTElHTiAtIDEgKSAmIH4oIEVGSV9GSUxFX0FMSUdOIC0gMSApICk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgZW50cnkgaW4gUEUgcmVsb2NhdGlvbiB0YWJsZQorICoKKyAqIEB2IHBlX3JlbHRhYgkJUEUgcmVsb2NhdGlvbiB0YWJsZQorICogQHYgcnZhCQlSVkEKKyAqIEB2IHNpemUJCVNpemUgb2YgcmVsb2NhdGlvbiBlbnRyeQorICovCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9wZV9yZWxvYyAoIHN0cnVjdCBwZV9yZWxvY3MgKipwZV9yZWx0YWIsCisJCQkJdW5zaWduZWQgbG9uZyBydmEsIHNpemVfdCBzaXplICkgeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcnZhOworCXVpbnQxNl90IHJlbG9jOworCXN0cnVjdCBwZV9yZWxvY3MgKnBlX3JlbDsKKwl1aW50MTZfdCAqcmVsb2NzOworCisJLyogQ29uc3RydWN0ICovCisJc3RhcnRfcnZhID0gKCBydmEgJiB+MHhmZmYgKTsKKwlyZWxvYyA9ICggcnZhICYgMHhmZmYgKTsKKwlzd2l0Y2ggKCBzaXplICkgeworCWNhc2UgODoKKwkJcmVsb2MgfD0gMHhhMDAwOworCQlicmVhazsKKwljYXNlIDQ6CisJCXJlbG9jIHw9IDB4MzAwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZWxvYyB8PSAweDIwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVwcmludGYgKCAiVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBzaXplICV6ZFxuIiwgc2l6ZSApOworCQlleGl0ICggMSApOworCX0KKworCS8qIExvY2F0ZSBvciBjcmVhdGUgUEUgcmVsb2NhdGlvbiB0YWJsZSAqLworCWZvciAoIHBlX3JlbCA9ICpwZV9yZWx0YWIgOyBwZV9yZWwgOyBwZV9yZWwgPSBwZV9yZWwtPm5leHQgKSB7CisJCWlmICggcGVfcmVsLT5zdGFydF9ydmEgPT0gc3RhcnRfcnZhICkKKwkJCWJyZWFrOworCX0KKwlpZiAoICEgcGVfcmVsICkgeworCQlwZV9yZWwgPSB4bWFsbG9jICggc2l6ZW9mICggKnBlX3JlbCApICk7CisJCW1lbXNldCAoIHBlX3JlbCwgMCwgc2l6ZW9mICggKnBlX3JlbCApICk7CisJCXBlX3JlbC0+bmV4dCA9ICpwZV9yZWx0YWI7CisJCSpwZV9yZWx0YWIgPSBwZV9yZWw7CisJCXBlX3JlbC0+c3RhcnRfcnZhID0gc3RhcnRfcnZhOworCX0KKworCS8qIEV4cGFuZCByZWxvY2F0aW9uIGxpc3QgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCBwZV9yZWwtPnVzZWRfcmVsb2NzIDwgcGVfcmVsLT50b3RhbF9yZWxvY3MgKSB7CisJCXJlbG9jcyA9IHBlX3JlbC0+cmVsb2NzOworCX0gZWxzZSB7CisJCXBlX3JlbC0+dG90YWxfcmVsb2NzID0gKCBwZV9yZWwtPnRvdGFsX3JlbG9jcyA/CisJCQkJCSAoIHBlX3JlbC0+dG90YWxfcmVsb2NzICogMiApIDogMjU2ICk7CisJCXJlbG9jcyA9IHhtYWxsb2MgKCBwZV9yZWwtPnRvdGFsX3JlbG9jcyAqCisJCQkJICAgc2l6ZW9mICggcGVfcmVsLT5yZWxvY3NbMF0gKSApOworCQltZW1zZXQgKCByZWxvY3MsIDAsCisJCQkgcGVfcmVsLT50b3RhbF9yZWxvY3MgKiBzaXplb2YgKCBwZV9yZWwtPnJlbG9jc1swXSApICk7CisJCW1lbWNweSAoIHJlbG9jcywgcGVfcmVsLT5yZWxvY3MsCisJCQkgcGVfcmVsLT51c2VkX3JlbG9jcyAqIHNpemVvZiAoIHBlX3JlbC0+cmVsb2NzWzBdICkgKTsKKwkJZnJlZSAoIHBlX3JlbC0+cmVsb2NzICk7CisJCXBlX3JlbC0+cmVsb2NzID0gcmVsb2NzOworCX0KKworCS8qIFN0b3JlIHJlbG9jYXRpb24gKi8KKwlwZV9yZWwtPnJlbG9jc1sgcGVfcmVsLT51c2VkX3JlbG9jcysrIF0gPSByZWxvYzsKK30KKworLyoqCisgKiBDYWxjdWxhdGUgc2l6ZSBvZiBiaW5hcnkgUEUgcmVsb2NhdGlvbiB0YWJsZQorICoKKyAqIEB2IHBlX3JlbHRhYgkJUEUgcmVsb2NhdGlvbiB0YWJsZQorICogQHYgYnVmZmVyCQlCdWZmZXIgdG8gY29udGFpbiBiaW5hcnkgdGFibGUsIG9yIE5VTEwKKyAqIEByZXQgc2l6ZQkJU2l6ZSBvZiBiaW5hcnkgdGFibGUKKyAqLworc3RhdGljIHNpemVfdCBvdXRwdXRfcGVfcmVsdGFiICggc3RydWN0IHBlX3JlbG9jcyAqcGVfcmVsdGFiLAorCQkJCSB2b2lkICpidWZmZXIgKSB7CisJc3RydWN0IHBlX3JlbG9jcyAqcGVfcmVsOworCXVuc2lnbmVkIGludCBudW1fcmVsb2NzOworCXNpemVfdCBzaXplOworCXNpemVfdCB0b3RhbF9zaXplID0gMDsKKworCWZvciAoIHBlX3JlbCA9IHBlX3JlbHRhYiA7IHBlX3JlbCA7IHBlX3JlbCA9IHBlX3JlbC0+bmV4dCApIHsKKwkJbnVtX3JlbG9jcyA9ICggKCBwZV9yZWwtPnVzZWRfcmVsb2NzICsgMSApICYgfjEgKTsKKwkJc2l6ZSA9ICggc2l6ZW9mICggdWludDMyX3QgKSAvKiBWaXJ0dWFsQWRkcmVzcyAqLyArCisJCQkgc2l6ZW9mICggdWludDMyX3QgKSAvKiBTaXplT2ZCbG9jayAqLyArCisJCQkgKCBudW1fcmVsb2NzICogc2l6ZW9mICggdWludDE2X3QgKSApICk7CisJCWlmICggYnVmZmVyICkgeworCQkJKiggKHVpbnQzMl90ICopICggYnVmZmVyICsgdG90YWxfc2l6ZSArIDAgKSApCisJCQkJPSBwZV9yZWwtPnN0YXJ0X3J2YTsKKwkJCSooICh1aW50MzJfdCAqKSAoIGJ1ZmZlciArIHRvdGFsX3NpemUgKyA0ICkgKSA9IHNpemU7CisJCQltZW1jcHkgKCAoIGJ1ZmZlciArIHRvdGFsX3NpemUgKyA4ICksIHBlX3JlbC0+cmVsb2NzLAorCQkJCSAoIG51bV9yZWxvY3MgKiBzaXplb2YgKCB1aW50MTZfdCApICkgKTsKKwkJfQorCQl0b3RhbF9zaXplICs9IHNpemU7CisJfQorCisJcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKKy8qKgorICogT3BlbiBpbnB1dCBCRkQgZmlsZQorICoKKyAqIEB2IGZpbGVuYW1lCQlGaWxlIG5hbWUKKyAqIEByZXQgaWJmZAkJQkZEIGZpbGUKKyAqLworc3RhdGljIGJmZCAqIG9wZW5faW5wdXRfYmZkICggY29uc3QgY2hhciAqZmlsZW5hbWUgKSB7CisJYmZkICpiZmQ7CisKKwkvKiBPcGVuIHRoZSBmaWxlICovCisJYmZkID0gYmZkX29wZW5yICggZmlsZW5hbWUsIE5VTEwgKTsKKwlpZiAoICEgYmZkICkgeworCQllcHJpbnRmICggIkNhbm5vdCBvcGVuICVzOiAiLCBmaWxlbmFtZSApOworCQliZmRfcGVycm9yICggTlVMTCApOworCQlleGl0ICggMSApOworCX0KKworCS8qIFRoZSBjYWxsIHRvIGJmZF9jaGVja19mb3JtYXQoKSBtdXN0IGJlIHByZXNlbnQsIG90aGVyd2lzZQorCSAqIHdlIGdldCBhIHNlZ2ZhdWx0IGZyb20gbGF0ZXIgQkZEIGNhbGxzLgorCSAqLworCWlmICggYmZkX2NoZWNrX2Zvcm1hdCAoIGJmZCwgYmZkX29iamVjdCApIDwgMCApIHsKKwkJZXByaW50ZiAoICIlcyBpcyBub3QgYW4gb2JqZWN0IGZpbGVcbiIsIGZpbGVuYW1lICk7CisJCWV4aXQgKCAxICk7CisJfQorCisJcmV0dXJuIGJmZDsKK30KKworLyoqCisgKiBSZWFkIHN5bWJvbCB0YWJsZQorICoKKyAqIEB2IGJmZAkJQkZEIGZpbGUKKyAqLworc3RhdGljIGFzeW1ib2wgKiogcmVhZF9zeW10YWIgKCBiZmQgKmJmZCApIHsKKwlsb25nIHN5bXRhYl9zaXplOworCWFzeW1ib2wgKipzeW10YWI7CisJbG9uZyBzeW1jb3VudDsKKworCS8qIEdldCBzeW1ib2wgdGFibGUgc2l6ZSAqLworCXN5bXRhYl9zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKCBiZmQgKTsKKwlpZiAoIHN5bXRhYl9zaXplIDwgMCApIHsKKwkJYmZkX3BlcnJvciAoICJDb3VsZCBub3QgZ2V0IHN5bWJvbCB0YWJsZSB1cHBlciBib3VuZCIgKTsKKwkJZXhpdCAoIDEgKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhbmQgcmVhZCBzeW1ib2wgdGFibGUgKi8KKwlzeW10YWIgPSB4bWFsbG9jICggc3ltdGFiX3NpemUgKTsKKwlzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiICggYmZkLCBzeW10YWIgKTsKKwlpZiAoIHN5bWNvdW50IDwgMCApIHsKKwkJYmZkX3BlcnJvciAoICJDYW5ub3QgcmVhZCBzeW1ib2wgdGFibGUiICk7CisJCWV4aXQgKCAxICk7CisJfQorCisJcmV0dXJuIHN5bXRhYjsKK30KKworLyoqCisgKiBSZWFkIHJlbG9jYXRpb24gdGFibGUKKyAqCisgKiBAdiBiZmQJCUJGRCBmaWxlCisgKiBAdiBzeW10YWIJCVN5bWJvbCB0YWJsZQorICogQHYgc2VjdGlvbgkJU2VjdGlvbgorICogQHYgc3ltdGFiCQlTeW1ib2wgdGFibGUKKyAqIEByZXQgcmVsdGFiCQlSZWxvY2F0aW9uIHRhYmxlCisgKi8KK3N0YXRpYyBhcmVsZW50ICoqIHJlYWRfcmVsdGFiICggYmZkICpiZmQsIGFzeW1ib2wgKipzeW10YWIsCisJCQkJYXNlY3Rpb24gKnNlY3Rpb24gKSB7CisJbG9uZyByZWx0YWJfc2l6ZTsKKwlhcmVsZW50ICoqcmVsdGFiOworCWxvbmcgbnVtcmVsczsKKworCS8qIEdldCByZWxvY2F0aW9uIHRhYmxlIHNpemUgKi8KKwlyZWx0YWJfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKCBiZmQsIHNlY3Rpb24gKTsKKwlpZiAoIHJlbHRhYl9zaXplIDwgMCApIHsKKwkJYmZkX3BlcnJvciAoICJDb3VsZCBub3QgZ2V0IHJlbG9jYXRpb24gdGFibGUgdXBwZXIgYm91bmQiICk7CisJCWV4aXQgKCAxICk7CisJfQorCisJLyogQWxsb2NhdGUgYW5kIHJlYWQgcmVsb2NhdGlvbiB0YWJsZSAqLworCXJlbHRhYiA9IHhtYWxsb2MgKCByZWx0YWJfc2l6ZSApOworCW51bXJlbHMgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jICggYmZkLCBzZWN0aW9uLCByZWx0YWIsIHN5bXRhYiApOworCWlmICggbnVtcmVscyA8IDAgKSB7CisJCWJmZF9wZXJyb3IgKCAiQ2Fubm90IHJlYWQgcmVsb2NhdGlvbiB0YWJsZSIgKTsKKwkJZXhpdCAoIDEgKTsKKwl9CisKKwlyZXR1cm4gcmVsdGFiOworfQorCisvKioKKyAqIFByb2Nlc3Mgc2VjdGlvbgorICoKKyAqIEB2IGJmZAkJQkZEIGZpbGUKKyAqIEB2IHBlX2hlYWRlcgkJUEUgZmlsZSBoZWFkZXIKKyAqIEB2IHNlY3Rpb24JCVNlY3Rpb24KKyAqIEByZXQgbmV3CQlOZXcgUEUgc2VjdGlvbgorICovCitzdGF0aWMgc3RydWN0IHBlX3NlY3Rpb24gKiBwcm9jZXNzX3NlY3Rpb24gKCBiZmQgKmJmZCwKKwkJCQkJICAgICBzdHJ1Y3QgcGVfaGVhZGVyICpwZV9oZWFkZXIsCisJCQkJCSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gKSB7CisJc3RydWN0IHBlX3NlY3Rpb24gKm5ldzsKKwlzaXplX3Qgc2VjdGlvbl9tZW1zejsKKwlzaXplX3Qgc2VjdGlvbl9maWxlc3o7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoIGJmZCwgc2VjdGlvbiApOworCXVuc2lnbmVkIGxvbmcgY29kZV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIGNvZGVfZW5kOworCXVuc2lnbmVkIGxvbmcgZGF0YV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIGRhdGFfbWlkOworCXVuc2lnbmVkIGxvbmcgZGF0YV9lbmQ7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwl1bnNpZ25lZCBsb25nICphcHBsaWNhYmxlX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgKmFwcGxpY2FibGVfZW5kOworCisJLyogRXh0cmFjdCBjdXJyZW50IFJWQSBsaW1pdHMgZnJvbSBmaWxlIGhlYWRlciAqLworCWNvZGVfc3RhcnQgPSBwZV9oZWFkZXItPm50Lk9wdGlvbmFsSGVhZGVyLkJhc2VPZkNvZGU7CisJY29kZV9lbmQgPSAoIGNvZGVfc3RhcnQgKyBwZV9oZWFkZXItPm50Lk9wdGlvbmFsSGVhZGVyLlNpemVPZkNvZGUgKTsKKyNpZiBkZWZpbmVkKE1ERV9DUFVfSUEzMikKKwlkYXRhX3N0YXJ0ID0gcGVfaGVhZGVyLT5udC5PcHRpb25hbEhlYWRlci5CYXNlT2ZEYXRhOworI2VsaWYgZGVmaW5lZChNREVfQ1BVX1g2NCkKKwlkYXRhX3N0YXJ0ID0gY29kZV9lbmQ7CisjZW5kaWYKKwlkYXRhX21pZCA9ICggZGF0YV9zdGFydCArCisJCSAgICAgcGVfaGVhZGVyLT5udC5PcHRpb25hbEhlYWRlci5TaXplT2ZJbml0aWFsaXplZERhdGEgKTsKKwlkYXRhX2VuZCA9ICggZGF0YV9taWQgKworCQkgICAgIHBlX2hlYWRlci0+bnQuT3B0aW9uYWxIZWFkZXIuU2l6ZU9mVW5pbml0aWFsaXplZERhdGEgKTsKKworCS8qIEFsbG9jYXRlIFBFIHNlY3Rpb24gKi8KKwlzZWN0aW9uX21lbXN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoIGJmZCwgc2VjdGlvbiApOworCXNlY3Rpb25fZmlsZXN6ID0gKCAoIGZsYWdzICYgU0VDX0xPQUQgKSA/CisJCQkgICBlZmlfZmlsZV9hbGlnbiAoIHNlY3Rpb25fbWVtc3ogKSA6IDAgKTsKKwluZXcgPSB4bWFsbG9jICggc2l6ZW9mICggKm5ldyApICsgc2VjdGlvbl9maWxlc3ogKTsKKwltZW1zZXQgKCBuZXcsIDAsIHNpemVvZiAoICpuZXcgKSArIHNlY3Rpb25fZmlsZXN6ICk7CisKKwkvKiBGaWxsIGluIHNlY3Rpb24gaGVhZGVyIGRldGFpbHMgKi8KKwlzdHJuY3B5ICggKCBjaGFyICogKSBuZXctPmhkci5OYW1lLCBzZWN0aW9uLT5uYW1lLAorCQkgIHNpemVvZiAoIG5ldy0+aGRyLk5hbWUgKSApOworCW5ldy0+aGRyLk1pc2MuVmlydHVhbFNpemUgPSBzZWN0aW9uX21lbXN6OworCW5ldy0+aGRyLlZpcnR1YWxBZGRyZXNzID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoIGJmZCwgc2VjdGlvbiApOworCW5ldy0+aGRyLlNpemVPZlJhd0RhdGEgPSBzZWN0aW9uX2ZpbGVzejsKKworCS8qIEZpbGwgaW4gc2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MgYW5kIHVwZGF0ZSBSVkEgbGltaXRzICovCisJaWYgKCBmbGFncyAmIFNFQ19DT0RFICkgeworCQkvKiAudGV4dC10eXBlIHNlY3Rpb24gKi8KKwkJbmV3LT5oZHIuQ2hhcmFjdGVyaXN0aWNzID0KKwkJCSggRUZJX0lNQUdFX1NDTl9DTlRfQ09ERSB8CisJCQkgIEVGSV9JTUFHRV9TQ05fTUVNX05PVF9QQUdFRCB8CisJCQkgIEVGSV9JTUFHRV9TQ05fTUVNX0VYRUNVVEUgfAorCQkJICBFRklfSU1BR0VfU0NOX01FTV9SRUFEICk7CisJCWFwcGxpY2FibGVfc3RhcnQgPSAmY29kZV9zdGFydDsKKwkJYXBwbGljYWJsZV9lbmQgPSAmY29kZV9lbmQ7CisJfSBlbHNlIGlmICggZmxhZ3MgJiBTRUNfREFUQSApIHsKKwkJLyogLmRhdGEtdHlwZSBzZWN0aW9uICovCisJCW5ldy0+aGRyLkNoYXJhY3RlcmlzdGljcyA9CisJCQkoIEVGSV9JTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfAorCQkJICBFRklfSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgfAorCQkJICBFRklfSU1BR0VfU0NOX01FTV9SRUFEIHwKKwkJCSAgRUZJX0lNQUdFX1NDTl9NRU1fV1JJVEUgKTsKKwkJYXBwbGljYWJsZV9zdGFydCA9ICZkYXRhX3N0YXJ0OworCQlhcHBsaWNhYmxlX2VuZCA9ICZkYXRhX21pZDsKKwl9IGVsc2UgaWYgKCBmbGFncyAmIFNFQ19SRUFET05MWSApIHsKKwkJLyogLnJvZGF0YS10eXBlIHNlY3Rpb24gKi8KKwkJbmV3LT5oZHIuQ2hhcmFjdGVyaXN0aWNzID0KKwkJCSggRUZJX0lNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSB8CisJCQkgIEVGSV9JTUFHRV9TQ05fTUVNX05PVF9QQUdFRCB8CisJCQkgIEVGSV9JTUFHRV9TQ05fTUVNX1JFQUQgKTsKKwkJYXBwbGljYWJsZV9zdGFydCA9ICZkYXRhX3N0YXJ0OworCQlhcHBsaWNhYmxlX2VuZCA9ICZkYXRhX21pZDsKKwl9IGVsc2UgaWYgKCAhICggZmxhZ3MgJiBTRUNfTE9BRCApICkgeworCQkvKiAuYnNzLXR5cGUgc2VjdGlvbiAqLworCQluZXctPmhkci5DaGFyYWN0ZXJpc3RpY3MgPQorCQkJKCBFRklfSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEgfAorCQkJICBFRklfSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgfAorCQkJICBFRklfSU1BR0VfU0NOX01FTV9SRUFEIHwKKwkJCSAgRUZJX0lNQUdFX1NDTl9NRU1fV1JJVEUgKTsKKwkJYXBwbGljYWJsZV9zdGFydCA9ICZkYXRhX21pZDsKKwkJYXBwbGljYWJsZV9lbmQgPSAmZGF0YV9lbmQ7CisJfQorCisJLyogQ29weSBpbiBzZWN0aW9uIGNvbnRlbnRzICovCisJaWYgKCBmbGFncyAmIFNFQ19MT0FEICkgeworCQlpZiAoICEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzICggYmZkLCBzZWN0aW9uLCBuZXctPmNvbnRlbnRzLAorCQkJCQkJICAwLCBzZWN0aW9uX21lbXN6ICkgKSB7CisJCQllcHJpbnRmICggIkNhbm5vdCByZWFkIHNlY3Rpb24gJXM6ICIsIHNlY3Rpb24tPm5hbWUgKTsKKwkJCWJmZF9wZXJyb3IgKCBOVUxMICk7CisJCQlleGl0ICggMSApOworCQl9CisJfQorCisJLyogVXBkYXRlIFJWQSBsaW1pdHMgKi8KKwlzdGFydCA9IG5ldy0+aGRyLlZpcnR1YWxBZGRyZXNzOworCWVuZCA9ICggc3RhcnQgKyBuZXctPmhkci5NaXNjLlZpcnR1YWxTaXplICk7CisJaWYgKCAoICEgKmFwcGxpY2FibGVfc3RhcnQgKSB8fCAoICphcHBsaWNhYmxlX3N0YXJ0ID49IHN0YXJ0ICkgKQorCQkqYXBwbGljYWJsZV9zdGFydCA9IHN0YXJ0OworCWlmICggKmFwcGxpY2FibGVfZW5kIDwgZW5kICkKKwkJKmFwcGxpY2FibGVfZW5kID0gZW5kOworCWlmICggZGF0YV9zdGFydCA8IGNvZGVfZW5kICkKKwkJZGF0YV9zdGFydCA9IGNvZGVfZW5kOworCWlmICggZGF0YV9taWQgPCBkYXRhX3N0YXJ0ICkKKwkJZGF0YV9taWQgPSBkYXRhX3N0YXJ0OworCWlmICggZGF0YV9lbmQgPCBkYXRhX21pZCApCisJCWRhdGFfZW5kID0gZGF0YV9taWQ7CisKKwkvKiBXcml0ZSBSVkEgbGltaXRzIGJhY2sgdG8gZmlsZSBoZWFkZXIgKi8KKwlwZV9oZWFkZXItPm50Lk9wdGlvbmFsSGVhZGVyLkJhc2VPZkNvZGUgPSBjb2RlX3N0YXJ0OworCXBlX2hlYWRlci0+bnQuT3B0aW9uYWxIZWFkZXIuU2l6ZU9mQ29kZSA9ICggY29kZV9lbmQgLSBjb2RlX3N0YXJ0ICk7CisjaWYgZGVmaW5lZChNREVfQ1BVX0lBMzIpCisJcGVfaGVhZGVyLT5udC5PcHRpb25hbEhlYWRlci5CYXNlT2ZEYXRhID0gZGF0YV9zdGFydDsKKyNlbmRpZgorCXBlX2hlYWRlci0+bnQuT3B0aW9uYWxIZWFkZXIuU2l6ZU9mSW5pdGlhbGl6ZWREYXRhID0KKwkJKCBkYXRhX21pZCAtIGRhdGFfc3RhcnQgKTsKKwlwZV9oZWFkZXItPm50Lk9wdGlvbmFsSGVhZGVyLlNpemVPZlVuaW5pdGlhbGl6ZWREYXRhID0KKwkJKCBkYXRhX2VuZCAtIGRhdGFfbWlkICk7CisKKwkvKiBVcGRhdGUgcmVtYWluaW5nIGZpbGUgaGVhZGVyIGZpZWxkcyAqLworCXBlX2hlYWRlci0+bnQuRmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zKys7CisJcGVfaGVhZGVyLT5udC5PcHRpb25hbEhlYWRlci5TaXplT2ZIZWFkZXJzICs9IHNpemVvZiAoIG5ldy0+aGRyICk7CisJcGVfaGVhZGVyLT5udC5PcHRpb25hbEhlYWRlci5TaXplT2ZJbWFnZSA9CisJCWVmaV9maWxlX2FsaWduICggZGF0YV9lbmQgKTsKKworCXJldHVybiBuZXc7Cit9CisKKy8qKgorICogUHJvY2VzcyByZWxvY2F0aW9uIHJlY29yZAorICoKKyAqIEB2IGJmZAkJQkZEIGZpbGUKKyAqIEB2IHNlY3Rpb24JCVNlY3Rpb24KKyAqIEB2IHJlbAkJUmVsb2NhdGlvbiBlbnRyeQorICogQHYgcGVfcmVsdGFiCQlQRSByZWxvY2F0aW9uIHRhYmxlIHRvIGZpbGwgaW4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19yZWxvYyAoIGJmZCAqYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgYXJlbGVudCAqcmVsLAorCQkJICAgIHN0cnVjdCBwZV9yZWxvY3MgKipwZV9yZWx0YWIgKSB7CisJcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWwtPmhvd3RvOworCWFzeW1ib2wgKnN5bSA9ICoocmVsLT5zeW1fcHRyX3B0cik7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAoIGJmZF9nZXRfc2VjdGlvbl92bWEgKCBiZmQsIHNlY3Rpb24gKSArCisJCQkJIHJlbC0+YWRkcmVzcyApOworCisJaWYgKCBiZmRfaXNfYWJzX3NlY3Rpb24gKCBzeW0tPnNlY3Rpb24gKSApIHsKKwkJLyogU2tpcCBhYnNvbHV0ZSBzeW1ib2xzOyB0aGUgc3ltYm9sIHZhbHVlIHdvbid0CisJCSAqIGNoYW5nZSB3aGVuIHRoZSBvYmplY3QgaXMgbG9hZGVkLgorCQkgKi8KKwl9IGVsc2UgaWYgKCBzdHJjbXAgKCBob3d0by0+bmFtZSwgIlJfWDg2XzY0XzY0IiApID09IDAgKSB7CisJCS8qIEdlbmVyYXRlIGFuIDgtYnl0ZSBQRSByZWxvY2F0aW9uICovCisJCWdlbmVyYXRlX3BlX3JlbG9jICggcGVfcmVsdGFiLCBvZmZzZXQsIDggKTsKKwl9IGVsc2UgaWYgKCAoIHN0cmNtcCAoIGhvd3RvLT5uYW1lLCAiUl8zODZfMzIiICkgPT0gMCApIHx8CisJCSAgICAoIHN0cmNtcCAoIGhvd3RvLT5uYW1lLCAiUl9YODZfNjRfMzIiICkgPT0gMCApICkgeworCQkvKiBHZW5lcmF0ZSBhIDQtYnl0ZSBQRSByZWxvY2F0aW9uICovCisJCWdlbmVyYXRlX3BlX3JlbG9jICggcGVfcmVsdGFiLCBvZmZzZXQsIDQgKTsKKwl9IGVsc2UgaWYgKCBzdHJjbXAgKCBob3d0by0+bmFtZSwgIlJfMzg2XzE2IiApID09IDAgKSB7CisJCS8qIEdlbmVyYXRlIGEgMi1ieXRlIFBFIHJlbG9jYXRpb24gKi8KKwkJZ2VuZXJhdGVfcGVfcmVsb2MgKCBwZV9yZWx0YWIsIG9mZnNldCwgMiApOworCX0gZWxzZSBpZiAoICggc3RyY21wICggaG93dG8tPm5hbWUsICJSXzM4Nl9QQzMyIiApID09IDAgKSB8fAorCQkgICAgKCBzdHJjbXAgKCBob3d0by0+bmFtZSwgIlJfWDg2XzY0X1BDMzIiICkgPT0gMCApICkgeworCQkvKiBTa2lwIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zOyBhbGwgcmVsYXRpdmUgb2Zmc2V0cworCQkgKiByZW1haW4gdW5hbHRlcmVkIHdoZW4gdGhlIG9iamVjdCBpcyBsb2FkZWQuCisJCSAqLworCX0gZWxzZSB7CisJCWVwcmludGYgKCAiVW5yZWNvZ25pc2VkIHJlbG9jYXRpb24gdHlwZSAlc1xuIiwgaG93dG8tPm5hbWUgKTsKKwkJZXhpdCAoIDEgKTsKKwl9Cit9CisKKy8qKgorICogQ3JlYXRlIHJlbG9jYXRpb25zIHNlY3Rpb24KKyAqCisgKiBAdiBwZV9oZWFkZXIJCVBFIGZpbGUgaGVhZGVyCisgKiBAdiBwZV9yZWx0YWIJCVBFIHJlbG9jYXRpb24gdGFibGUKKyAqIEByZXQgc2VjdGlvbgkJUmVsb2NhdGlvbiBzZWN0aW9uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGVfc2VjdGlvbiAqCitjcmVhdGVfcmVsb2Nfc2VjdGlvbiAoIHN0cnVjdCBwZV9oZWFkZXIgKnBlX2hlYWRlciwKKwkJICAgICAgIHN0cnVjdCBwZV9yZWxvY3MgKnBlX3JlbHRhYiApIHsKKwlzdHJ1Y3QgcGVfc2VjdGlvbiAqcmVsb2M7CisJc2l6ZV90IHNlY3Rpb25fbWVtc3o7CisJc2l6ZV90IHNlY3Rpb25fZmlsZXN6OworCUVGSV9JTUFHRV9EQVRBX0RJUkVDVE9SWSAqcmVsb2NkaXI7CisKKwkvKiBBbGxvY2F0ZSBQRSBzZWN0aW9uICovCisJc2VjdGlvbl9tZW1zeiA9IG91dHB1dF9wZV9yZWx0YWIgKCBwZV9yZWx0YWIsIE5VTEwgKTsKKwlzZWN0aW9uX2ZpbGVzeiA9IGVmaV9maWxlX2FsaWduICggc2VjdGlvbl9tZW1zeiApOworCXJlbG9jID0geG1hbGxvYyAoIHNpemVvZiAoICpyZWxvYyApICsgc2VjdGlvbl9maWxlc3ogKTsKKwltZW1zZXQgKCByZWxvYywgMCwgc2l6ZW9mICggKnJlbG9jICkgKyBzZWN0aW9uX2ZpbGVzeiApOworCisJLyogRmlsbCBpbiBzZWN0aW9uIGhlYWRlciBkZXRhaWxzICovCisJc3RybmNweSAoICggY2hhciAqICkgcmVsb2MtPmhkci5OYW1lLCAiLnJlbG9jIiwKKwkJICBzaXplb2YgKCByZWxvYy0+aGRyLk5hbWUgKSApOworCXJlbG9jLT5oZHIuTWlzYy5WaXJ0dWFsU2l6ZSA9IHNlY3Rpb25fbWVtc3o7CisJcmVsb2MtPmhkci5WaXJ0dWFsQWRkcmVzcyA9IHBlX2hlYWRlci0+bnQuT3B0aW9uYWxIZWFkZXIuU2l6ZU9mSW1hZ2U7CisJcmVsb2MtPmhkci5TaXplT2ZSYXdEYXRhID0gc2VjdGlvbl9maWxlc3o7CisJcmVsb2MtPmhkci5DaGFyYWN0ZXJpc3RpY3MgPSAoIEVGSV9JTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfAorCQkJCSAgICAgICBFRklfSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgfAorCQkJCSAgICAgICBFRklfSU1BR0VfU0NOX01FTV9SRUFEICk7CisKKwkvKiBDb3B5IGluIHNlY3Rpb24gY29udGVudHMgKi8KKwlvdXRwdXRfcGVfcmVsdGFiICggcGVfcmVsdGFiLCByZWxvYy0+Y29udGVudHMgKTsKKworCS8qIFVwZGF0ZSBmaWxlIGhlYWRlciBkZXRhaWxzICovCisJcGVfaGVhZGVyLT5udC5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnMrKzsKKwlwZV9oZWFkZXItPm50Lk9wdGlvbmFsSGVhZGVyLlNpemVPZkhlYWRlcnMgKz0gc2l6ZW9mICggcmVsb2MtPmhkciApOworCXBlX2hlYWRlci0+bnQuT3B0aW9uYWxIZWFkZXIuU2l6ZU9mSW1hZ2UgKz0gc2VjdGlvbl9maWxlc3o7CisJcmVsb2NkaXIgPSAmKHBlX2hlYWRlci0+bnQuT3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQorCQkgICAgIFtFRklfSU1BR0VfRElSRUNUT1JZX0VOVFJZX0JBU0VSRUxPQ10pOworCXJlbG9jZGlyLT5WaXJ0dWFsQWRkcmVzcyA9IHJlbG9jLT5oZHIuVmlydHVhbEFkZHJlc3M7CisJcmVsb2NkaXItPlNpemUgPSByZWxvYy0+aGRyLk1pc2MuVmlydHVhbFNpemU7CisKKwlyZXR1cm4gcmVsb2M7Cit9CisKKy8qKgorICogQ3JlYXRlIGRlYnVnIHNlY3Rpb24KKyAqCisgKiBAdiBwZV9oZWFkZXIJCVBFIGZpbGUgaGVhZGVyCisgKiBAcmV0IHNlY3Rpb24JCURlYnVnIHNlY3Rpb24KKyAqLworc3RhdGljIHN0cnVjdCBwZV9zZWN0aW9uICoKK2NyZWF0ZV9kZWJ1Z19zZWN0aW9uICggc3RydWN0IHBlX2hlYWRlciAqcGVfaGVhZGVyLCBjb25zdCBjaGFyICpmaWxlbmFtZSApIHsKKwlzdHJ1Y3QgcGVfc2VjdGlvbiAqZGVidWc7CisJc2l6ZV90IHNlY3Rpb25fbWVtc3o7CisJc2l6ZV90IHNlY3Rpb25fZmlsZXN6OworCUVGSV9JTUFHRV9EQVRBX0RJUkVDVE9SWSAqZGVidWdkaXI7CisJc3RydWN0IHsKKwkJRUZJX0lNQUdFX0RFQlVHX0RJUkVDVE9SWV9FTlRSWSBkZWJ1ZzsKKwkJRUZJX0lNQUdFX0RFQlVHX0NPREVWSUVXX1JTRFNfRU5UUlkgcnNkczsKKwkJY2hhciBuYW1lWyBzdHJsZW4gKCBmaWxlbmFtZSApICsgMSBdOworCX0gKmNvbnRlbnRzOworCisJLyogQWxsb2NhdGUgUEUgc2VjdGlvbiAqLworCXNlY3Rpb25fbWVtc3ogPSBzaXplb2YgKCAqY29udGVudHMgKTsKKwlzZWN0aW9uX2ZpbGVzeiA9IGVmaV9maWxlX2FsaWduICggc2VjdGlvbl9tZW1zeiApOworCWRlYnVnID0geG1hbGxvYyAoIHNpemVvZiAoICpkZWJ1ZyApICsgc2VjdGlvbl9maWxlc3ogKTsKKwltZW1zZXQgKCBkZWJ1ZywgMCwgc2l6ZW9mICggKmRlYnVnICkgKyBzZWN0aW9uX2ZpbGVzeiApOworCWNvbnRlbnRzID0gKCB2b2lkICogKSBkZWJ1Zy0+Y29udGVudHM7CisKKwkvKiBGaWxsIGluIHNlY3Rpb24gaGVhZGVyIGRldGFpbHMgKi8KKwlzdHJuY3B5ICggKCBjaGFyICogKSBkZWJ1Zy0+aGRyLk5hbWUsICIuZGVidWciLAorCQkgIHNpemVvZiAoIGRlYnVnLT5oZHIuTmFtZSApICk7CisJZGVidWctPmhkci5NaXNjLlZpcnR1YWxTaXplID0gc2VjdGlvbl9tZW1zejsKKwlkZWJ1Zy0+aGRyLlZpcnR1YWxBZGRyZXNzID0gcGVfaGVhZGVyLT5udC5PcHRpb25hbEhlYWRlci5TaXplT2ZJbWFnZTsKKwlkZWJ1Zy0+aGRyLlNpemVPZlJhd0RhdGEgPSBzZWN0aW9uX2ZpbGVzejsKKwlkZWJ1Zy0+aGRyLkNoYXJhY3RlcmlzdGljcyA9ICggRUZJX0lNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSB8CisJCQkJICAgICAgIEVGSV9JTUFHRV9TQ05fTUVNX05PVF9QQUdFRCB8CisJCQkJICAgICAgIEVGSV9JTUFHRV9TQ05fTUVNX1JFQUQgKTsKKworCS8qIENyZWF0ZSBzZWN0aW9uIGNvbnRlbnRzICovCisJY29udGVudHMtPmRlYnVnLlRpbWVEYXRlU3RhbXAgPSAweDEwZDFhODg0OworCWNvbnRlbnRzLT5kZWJ1Zy5UeXBlID0gRUZJX0lNQUdFX0RFQlVHX1RZUEVfQ09ERVZJRVc7CisJY29udGVudHMtPmRlYnVnLlNpemVPZkRhdGEgPQorCQkoIHNpemVvZiAoICpjb250ZW50cyApIC0gc2l6ZW9mICggY29udGVudHMtPmRlYnVnICkgKTsKKwljb250ZW50cy0+ZGVidWcuUlZBID0gKCBkZWJ1Zy0+aGRyLlZpcnR1YWxBZGRyZXNzICsKKwkJCQlvZmZzZXRvZiAoIHR5cGVvZiAoICpjb250ZW50cyApLCByc2RzICkgKTsKKwljb250ZW50cy0+cnNkcy5TaWduYXR1cmUgPSBDT0RFVklFV19TSUdOQVRVUkVfUlNEUzsKKwlzbnByaW50ZiAoIGNvbnRlbnRzLT5uYW1lLCBzaXplb2YgKCBjb250ZW50cy0+bmFtZSApLCAiJXMiLAorCQkgICBmaWxlbmFtZSApOworCisJLyogVXBkYXRlIGZpbGUgaGVhZGVyIGRldGFpbHMgKi8KKwlwZV9oZWFkZXItPm50LkZpbGVIZWFkZXIuTnVtYmVyT2ZTZWN0aW9ucysrOworCXBlX2hlYWRlci0+bnQuT3B0aW9uYWxIZWFkZXIuU2l6ZU9mSGVhZGVycyArPSBzaXplb2YgKCBkZWJ1Zy0+aGRyICk7CisJcGVfaGVhZGVyLT5udC5PcHRpb25hbEhlYWRlci5TaXplT2ZJbWFnZSArPSBzZWN0aW9uX2ZpbGVzejsKKwlkZWJ1Z2RpciA9ICYocGVfaGVhZGVyLT5udC5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CisJCSAgICAgW0VGSV9JTUFHRV9ESVJFQ1RPUllfRU5UUllfREVCVUddKTsKKwlkZWJ1Z2Rpci0+VmlydHVhbEFkZHJlc3MgPSBkZWJ1Zy0+aGRyLlZpcnR1YWxBZGRyZXNzOworCWRlYnVnZGlyLT5TaXplID0gZGVidWctPmhkci5NaXNjLlZpcnR1YWxTaXplOworCisJcmV0dXJuIGRlYnVnOworfQorCisvKioKKyAqIFdyaXRlIG91dCBQRSBmaWxlCisgKgorICogQHYgcGVfaGVhZGVyCQlQRSBmaWxlIGhlYWRlcgorICogQHYgcGVfc2VjdGlvbnMJTGlzdCBvZiBQRSBzZWN0aW9ucworICogQHYgcGUJCU91dHB1dCBmaWxlCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3BlX2ZpbGUgKCBzdHJ1Y3QgcGVfaGVhZGVyICpwZV9oZWFkZXIsCisJCQkgICAgc3RydWN0IHBlX3NlY3Rpb24gKnBlX3NlY3Rpb25zLAorCQkJICAgIEZJTEUgKnBlICkgeworCXN0cnVjdCBwZV9zZWN0aW9uICpzZWN0aW9uOworCXVuc2lnbmVkIGxvbmcgZnBvcyA9IDA7CisKKwkvKiBBc3NpZ24gcmF3IGRhdGEgcG9pbnRlcnMgKi8KKwlmcG9zID0gZWZpX2ZpbGVfYWxpZ24gKCBwZV9oZWFkZXItPm50Lk9wdGlvbmFsSGVhZGVyLlNpemVPZkhlYWRlcnMgKTsKKwlmb3IgKCBzZWN0aW9uID0gcGVfc2VjdGlvbnMgOyBzZWN0aW9uIDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQgKSB7CisJCWlmICggc2VjdGlvbi0+aGRyLlNpemVPZlJhd0RhdGEgKSB7CisJCQlzZWN0aW9uLT5oZHIuUG9pbnRlclRvUmF3RGF0YSA9IGZwb3M7CisJCQlmcG9zICs9IHNlY3Rpb24tPmhkci5TaXplT2ZSYXdEYXRhOworCQkJZnBvcyA9IGVmaV9maWxlX2FsaWduICggZnBvcyApOworCQl9CisJfQorCisJLyogV3JpdGUgZmlsZSBoZWFkZXIgKi8KKwlpZiAoIGZ3cml0ZSAoIHBlX2hlYWRlciwgc2l6ZW9mICggKnBlX2hlYWRlciApLCAxLCBwZSApICE9IDEgKSB7CisJCXBlcnJvciAoICJDb3VsZCBub3Qgd3JpdGUgUEUgaGVhZGVyIiApOworCQlleGl0ICggMSApOworCX0KKworCS8qIFdyaXRlIHNlY3Rpb24gaGVhZGVycyAqLworCWZvciAoIHNlY3Rpb24gPSBwZV9zZWN0aW9ucyA7IHNlY3Rpb24gOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCApIHsKKwkJaWYgKCBmd3JpdGUgKCAmc2VjdGlvbi0+aGRyLCBzaXplb2YgKCBzZWN0aW9uLT5oZHIgKSwKKwkJCSAgICAgIDEsIHBlICkgIT0gMSApIHsKKwkJCXBlcnJvciAoICJDb3VsZCBub3Qgd3JpdGUgc2VjdGlvbiBoZWFkZXIiICk7CisJCQlleGl0ICggMSApOworCQl9CisJfQorCisJLyogV3JpdGUgc2VjdGlvbnMgKi8KKwlmb3IgKCBzZWN0aW9uID0gcGVfc2VjdGlvbnMgOyBzZWN0aW9uIDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQgKSB7CisJCWlmICggZnNlZWsgKCBwZSwgc2VjdGlvbi0+aGRyLlBvaW50ZXJUb1Jhd0RhdGEsCisJCQkgICAgIFNFRUtfU0VUICkgIT0gMCApIHsKKwkJCWVwcmludGYgKCAiQ291bGQgbm90IHNlZWsgdG8gJWx4OiAlc1xuIiwKKwkJCQkgIHNlY3Rpb24tPmhkci5Qb2ludGVyVG9SYXdEYXRhLAorCQkJCSAgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCQlleGl0ICggMSApOworCQl9CisJCWlmICggc2VjdGlvbi0+aGRyLlNpemVPZlJhd0RhdGEgJiYKKwkJICAgICAoIGZ3cml0ZSAoIHNlY3Rpb24tPmNvbnRlbnRzLCBzZWN0aW9uLT5oZHIuU2l6ZU9mUmF3RGF0YSwKKwkJCQkxLCBwZSApICE9IDEgKSApIHsKKwkJCWVwcmludGYgKCAiQ291bGQgbm90IHdyaXRlIHNlY3Rpb24gJS44czogJXNcbiIsCisJCQkJICBzZWN0aW9uLT5oZHIuTmFtZSwgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCQlleGl0ICggMSApOworCQl9CisJfQorfQorCisvKioKKyAqIENvbnZlcnQgRUxGIHRvIFBFCisgKgorICogQHYgZWxmX25hbWUJCUVMRiBmaWxlIG5hbWUKKyAqIEB2IHBlX25hbWUJCVBFIGZpbGUgbmFtZQorICovCitzdGF0aWMgdm9pZCBlbGYycGUgKCBjb25zdCBjaGFyICplbGZfbmFtZSwgY29uc3QgY2hhciAqcGVfbmFtZSwKKwkJICAgICBzdHJ1Y3Qgb3B0aW9ucyAqb3B0cyApIHsKKwljaGFyIHBlX25hbWVfdG1wWyBzdHJsZW4gKCBwZV9uYW1lICkgKyAxIF07CisJYmZkICpiZmQ7CisJYXN5bWJvbCAqKnN5bXRhYjsKKwlhc2VjdGlvbiAqc2VjdGlvbjsKKwlhcmVsZW50ICoqcmVsdGFiOworCWFyZWxlbnQgKipyZWw7CisJc3RydWN0IHBlX3JlbG9jcyAqcGVfcmVsdGFiID0gTlVMTDsKKwlzdHJ1Y3QgcGVfc2VjdGlvbiAqcGVfc2VjdGlvbnMgPSBOVUxMOworCXN0cnVjdCBwZV9zZWN0aW9uICoqbmV4dF9wZV9zZWN0aW9uID0gJnBlX3NlY3Rpb25zOworCXN0cnVjdCBwZV9oZWFkZXIgcGVfaGVhZGVyOworCUZJTEUgKnBlOworCisJLyogQ3JlYXRlIGEgbW9kaWZpYWJsZSBjb3B5IG9mIHRoZSBQRSBuYW1lICovCisJbWVtY3B5ICggcGVfbmFtZV90bXAsIHBlX25hbWUsIHNpemVvZiAoIHBlX25hbWVfdG1wICkgKTsKKworCS8qIE9wZW4gdGhlIGZpbGUgKi8KKwliZmQgPSBvcGVuX2lucHV0X2JmZCAoIGVsZl9uYW1lICk7CisJc3ltdGFiID0gcmVhZF9zeW10YWIgKCBiZmQgKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIFBFIGhlYWRlciAqLworCW1lbWNweSAoICZwZV9oZWFkZXIsICZlZmlfcGVfaGVhZGVyLCBzaXplb2YgKCBwZV9oZWFkZXIgKSApOworCXBlX2hlYWRlci5udC5PcHRpb25hbEhlYWRlci5BZGRyZXNzT2ZFbnRyeVBvaW50ID0KKwkJYmZkX2dldF9zdGFydF9hZGRyZXNzICggYmZkICk7CisJcGVfaGVhZGVyLm50Lk9wdGlvbmFsSGVhZGVyLlN1YnN5c3RlbSA9IG9wdHMtPnN1YnN5c3RlbTsKKworCS8qIEZvciBlYWNoIGlucHV0IHNlY3Rpb24sIGJ1aWxkIGFuIG91dHB1dCBzZWN0aW9uIGFuZCBjcmVhdGUKKwkgKiB0aGUgYXBwcm9wcmlhdGUgcmVsb2NhdGlvbiByZWNvcmRzCisJICovCisJZm9yICggc2VjdGlvbiA9IGJmZC0+c2VjdGlvbnMgOyBzZWN0aW9uIDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQgKSB7CisJCS8qIERpc2NhcmQgbm9uLWFsbG9jYXRhYmxlIHNlY3Rpb25zICovCisJCWlmICggISAoIGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoIGJmZCwgc2VjdGlvbiApICYgU0VDX0FMTE9DICkgKQorCQkJY29udGludWU7CisJCS8qIENyZWF0ZSBvdXRwdXQgc2VjdGlvbiAqLworCQkqKG5leHRfcGVfc2VjdGlvbikgPSBwcm9jZXNzX3NlY3Rpb24gKCBiZmQsICZwZV9oZWFkZXIsCisJCQkJCQkgICAgICAgc2VjdGlvbiApOworCQluZXh0X3BlX3NlY3Rpb24gPSAmKCpuZXh0X3BlX3NlY3Rpb24pLT5uZXh0OworCQkvKiBBZGQgcmVsb2NhdGlvbnMgZnJvbSB0aGlzIHNlY3Rpb24gKi8KKwkJcmVsdGFiID0gcmVhZF9yZWx0YWIgKCBiZmQsIHN5bXRhYiwgc2VjdGlvbiApOworCQlmb3IgKCByZWwgPSByZWx0YWIgOyAqcmVsIDsgcmVsKysgKQorCQkJcHJvY2Vzc19yZWxvYyAoIGJmZCwgc2VjdGlvbiwgKnJlbCwgJnBlX3JlbHRhYiApOworCQlmcmVlICggcmVsdGFiICk7CisJfQorCisJLyogQ3JlYXRlIHRoZSAucmVsb2Mgc2VjdGlvbiAqLworCSoobmV4dF9wZV9zZWN0aW9uKSA9IGNyZWF0ZV9yZWxvY19zZWN0aW9uICggJnBlX2hlYWRlciwgcGVfcmVsdGFiICk7CisJbmV4dF9wZV9zZWN0aW9uID0gJigqbmV4dF9wZV9zZWN0aW9uKS0+bmV4dDsKKworCS8qIENyZWF0ZSB0aGUgLnJlbG9jIHNlY3Rpb24gKi8KKwkqKG5leHRfcGVfc2VjdGlvbikgPSBjcmVhdGVfZGVidWdfc2VjdGlvbiAoICZwZV9oZWFkZXIsCisJCQkJCQkgICAgYmFzZW5hbWUgKCBwZV9uYW1lX3RtcCApICk7CisJbmV4dF9wZV9zZWN0aW9uID0gJigqbmV4dF9wZV9zZWN0aW9uKS0+bmV4dDsKKworCS8qIFdyaXRlIG91dCBQRSBmaWxlICovCisJcGUgPSBmb3BlbiAoIHBlX25hbWUsICJ3IiApOworCWlmICggISBwZSApIHsKKwkJZXByaW50ZiAoICJDb3VsZCBub3Qgb3BlbiAlcyBmb3Igd3JpdGluZzogJXNcbiIsCisJCQkgIHBlX25hbWUsIHN0cmVycm9yICggZXJybm8gKSApOworCQlleGl0ICggMSApOworCX0KKwl3cml0ZV9wZV9maWxlICggJnBlX2hlYWRlciwgcGVfc2VjdGlvbnMsIHBlICk7CisJZmNsb3NlICggcGUgKTsKKworCS8qIENsb3NlIEJGRCBmaWxlICovCisJYmZkX2Nsb3NlICggYmZkICk7Cit9CisKKy8qKgorICogUHJpbnQgaGVscAorICoKKyAqIEB2IHByb2dyYW1fbmFtZQlQcm9ncmFtIG5hbWUKKyAqLworc3RhdGljIHZvaWQgcHJpbnRfaGVscCAoIGNvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSApIHsKKwllcHJpbnRmICggIlN5bnRheDogJXMgWy0tc3Vic3lzdGVtPTxudW1iZXI+XSBpbmZpbGUgb3V0ZmlsZVxuIiwKKwkJICBwcm9ncmFtX25hbWUgKTsKK30KKworLyoqCisgKiBQYXJzZSBjb21tYW5kLWxpbmUgb3B0aW9ucworICoKKyAqIEB2IGFyZ2MJCUFyZ3VtZW50IGNvdW50CisgKiBAdiBhcmd2CQlBcmd1bWVudCBsaXN0CisgKiBAdiBvcHRzCQlPcHRpb25zIHN0cnVjdHVyZSB0byBwb3B1bGF0ZQorICovCitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMgKCBjb25zdCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICBzdHJ1Y3Qgb3B0aW9ucyAqb3B0cyApIHsKKwljaGFyICplbmQ7CisJaW50IGM7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMDsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ICJzdWJzeXN0ZW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3MnIH0sCisJCQl7ICJoZWxwIiwgMCwgTlVMTCwgJ2gnIH0sCisJCQl7IDAsIDAsIDAsIDAgfQorCQl9OworCisJCWlmICggKCBjID0gZ2V0b3B0X2xvbmcgKCBhcmdjLCBhcmd2LCAiczpoIiwKKwkJCQkJIGxvbmdfb3B0aW9ucywKKwkJCQkJICZvcHRpb25faW5kZXggKSApID09IC0xICkgeworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKCBjICkgeworCQljYXNlICdzJzoKKwkJCW9wdHMtPnN1YnN5c3RlbSA9IHN0cnRvdWwgKCBvcHRhcmcsICZlbmQsIDAgKTsKKwkJCWlmICggKmVuZCApIHsKKwkJCQllcHJpbnRmICggIkludmFsaWQgc3Vic3l0ZW0gXCIlc1wiXG4iLAorCQkJCQkgIG9wdGFyZyApOworCQkJCWV4aXQgKCAyICk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlwcmludF9oZWxwICggYXJndlswXSApOworCQkJZXhpdCAoIDAgKTsKKwkJY2FzZSAnPyc6CisJCWRlZmF1bHQ6CisJCQlleGl0ICggMiApOworCQl9CisJfQorCXJldHVybiBvcHRpbmQ7Cit9CisKK2ludCBtYWluICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkgeworCXN0cnVjdCBvcHRpb25zIG9wdHMgPSB7CisJCS5zdWJzeXN0ZW0gPSBFRklfSU1BR0VfU1VCU1lTVEVNX0VGSV9BUFBMSUNBVElPTiwKKwl9OworCXVuc2lnbmVkIGludCBpbmZpbGVfaW5kZXg7CisJY29uc3QgY2hhciAqaW5maWxlOworCWNvbnN0IGNoYXIgKm91dGZpbGU7CisKKwkvKiBJbml0aWFsaXNlIGxpYmJmZCAqLworCWJmZF9pbml0KCk7CisKKwkvKiBQYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzICovCisJaW5maWxlX2luZGV4ID0gcGFyc2Vfb3B0aW9ucyAoIGFyZ2MsIGFyZ3YsICZvcHRzICk7CisJaWYgKCBhcmdjICE9ICggaW5maWxlX2luZGV4ICsgMiApICkgeworCQlwcmludF9oZWxwICggYXJndlswXSApOworCQlleGl0ICggMiApOworCX0KKwlpbmZpbGUgPSBhcmd2W2luZmlsZV9pbmRleF07CisJb3V0ZmlsZSA9IGFyZ3ZbaW5maWxlX2luZGV4ICsgMV07CisKKwkvKiBDb252ZXJ0IGZpbGUgKi8KKwllbGYycGUgKCBpbmZpbGUsIG91dGZpbGUsICZvcHRzICk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvZ2VuaXNvIGIvZ3B4ZS9zcmMvdXRpbC9nZW5pc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2MyZjc2NwotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL3V0aWwvZ2VuaXNvCkBAIC0wLDAgKzEsNTUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIEdlbmVyYXRlIGEgaXNvbGludXggSVNPIGJvb3QgaW1hZ2UKKyMKKyMgZ2VuaXNvIGZvby5pc28gZm9vLmxrcm4KKyMKKyMgdGhlIElTTyBpbWFnZSBpcyB0aGUgZmlyc3QgYXJndW1lbnQgc28gdGhhdCBhIGxpc3Qgb2YgLmxrcm4gaW1hZ2VzCisjIHRvIGluY2x1ZGUgY2FuIGJlIHNwZWNpZmllZAorIworY2FzZSAkIyBpbgorMHwxKQorCWVjaG8gVXNhZ2U6ICQwIGZvby5pc28gZm9vLmxrcm4gLi4uCisJZXhpdCAxCisJOzsKK2VzYWMKKyMgVGhpcyBzaG91bGQgYmUgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGlzb2xpbnV4LmJpbiBmaWxlCitpc29saW51eF9iaW49JHtJU09MSU5VWF9CSU46LXV0aWwvaXNvbGludXguYmlufQoraWYgWyAhIC1yICRpc29saW51eF9iaW4gXQordGhlbgorCWVjaG8gJDA6ICRpc29saW51eF9iaW4gbm90IGZvdW5kLCBwbGVhc2UgaW5zdGFsbCwgb3Igc2V0IElTT0xJTlVYX0JJTiBpbiBhcmNoL2kzODYvTWFrZWZpbGUgY29ycmVjdGx5CisJZXhpdCAxCitmaQorb3V0PSQxCitzaGlmdAorZGlyPWBta3RlbXAgLWQgYmluL2lzby5kaXIuWFhYWFhYYAorY2ZnPSRkaXIvaXNvbGludXguY2ZnCitjcCAtcCAkaXNvbGludXhfYmluICRkaXIKK2NhdCA+ICRjZmcgPDxFT0YKKyMgVGhlc2UgZGVmYXVsdCBvcHRpb25zIGNhbiBiZSBjaGFuZ2VkIGluIHRoZSBnZW5pc28gc2NyaXB0CitTQVkgRXRoZXJib290IElTTyBib290IGltYWdlIGdlbmVyYXRlZCBieSBnZW5pc28KK1RJTUVPVVQgMzAKK0VPRgorZmlyc3Q9Citmb3IgZgorZG8KKwlpZiBbICEgLXIgJGYgXQorCXRoZW4KKwkJZWNobyAkZiBkb2VzIG5vdCBleGlzdCwgc2tpcHBpbmcgMT4mMgorCQljb250aW51ZQorCWZpCisJYj0kKGJhc2VuYW1lICRmKQorCWc9JHtiJS5sa3JufQorCWc9JHtnLy9bXmEtejAtOV19LmtybgorCWNhc2UgIiRmaXJzdCIgaW4KKwkiIikKKwkJZWNobyBERUZBVUxUICRnCisJCTs7CisJZXNhYworCWZpcnN0PSRnCisJZWNobyBMQUJFTCAkYgorCWVjaG8gIiIgS0VSTkVMICRnCisJY3AgLXAgJGYgJGRpci8kZworZG9uZSA+PiAkY2ZnCitta2lzb2ZzIC1xIC1sIC1vICRvdXQgLWMgYm9vdC5jYXQgLWIgaXNvbGludXguYmluIC1uby1lbXVsLWJvb3QgLWJvb3QtbG9hZC1zaXplIDQgLWJvb3QtaW5mby10YWJsZSAkZGlyCitybSAtZnIgJGRpcgpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXRpbC9nZW5saXNvIGIvZ3B4ZS9zcmMvdXRpbC9nZW5saXNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmMWMxMTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL2dlbmxpc28KQEAgLTAsMCArMSw3NCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgR2VuZXJhdGUgYSBsZWdhY3kgZmxvcHB5IGVtdWxhdGlvbiBJU08gYm9vdCBpbWFnZQorIworIyBnZW5saXNvIGZvby5saXNvIGZvby5sa3JuIGJhci5sa3JuIC4uLgorIworIyBUaGUgLmxpc28gaW1hZ2UgZmlsZW5hbWUgaXMgdGhlIGZpcnN0IGFyZ3VtZW50IGZvbGxvd2VkIGJ5CisjICAgYSBsaXN0IG9mIC5sa3JuIGltYWdlcyAgaW5jbHVkZSBpbiAubGlzbyBpbWFnZQorCitjYXNlICQjIGluCiswfDEpCisJZWNobyBVc2FnZTogJDAgZm9vLmxpc28gZm9vLmxrcm4gLi4uCisJZXhpdCAxCisJOzsKK2VzYWMKKworY2FzZSAiYG10b29scyAtVmAiIGluCitNdG9vbHNcIHZlcnNpb25cIDMuOS45KnxNdG9vbHNcIHZlcnNpb25cIDMuOS4xWzAtOV0qfFttTV10b29sc1wgKlwgWzQtOV0uKikKKwk7OworKikKKwllY2hvIE10b29scyB2ZXJzaW9uIDMuOS45IG9yIGxhdGVyIGlzIHJlcXVpcmVkCisJZXhpdCAxCisJOzsKK2VzYWMKKworb3V0PSQxCitzaGlmdAorCitkaXI9YG1rdGVtcCAtZCBiaW4vbGlzby5kaXIuWFhYWFhYYAorCitpbWc9JGRpci9ib290LmltZworbWZvcm1hdCAtZiAxNDQwIC1DIC1pICRpbWcgOjoKKworY2ZnPSRkaXIvc3lzbGludXguY2ZnCitjYXQgPiAkY2ZnIDw8RU9GCisjIFRoZXNlIGRlZmF1bHQgb3B0aW9ucyBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgZ2VubGlzbyBzY3JpcHQKK1NBWSBnUFhFIElTTyBib290IGltYWdlIGdlbmVyYXRlZCBieSBnZW5saXNvCitUSU1FT1VUIDMwCitFT0YKKworZmlyc3Q9Citmb3IgZgorZG8KKwlpZiBbICEgLXIgJGYgXQorCXRoZW4KKwkJZWNobyAkZiBkb2VzIG5vdCBleGlzdCwgc2tpcHBpbmcgMT4mMgorCQljb250aW51ZQorCWZpCisJIyBzaG9ydGVuIG5hbWUgZm9yIDguMyBmaWxlc3lzdGVtCisJYj0kKGJhc2VuYW1lICRmKQorCWc9JHtiJS5sa3JufQorCWc9JHtnLy9bXmEtejAtOV19CisJZz0ke2c6MDo4fS5rcm4KKwljYXNlICIkZmlyc3QiIGluCisJIiIpCisJCWVjaG8gREVGQVVMVCAkZworCQk7OworCWVzYWMKKwlmaXJzdD0kZworCWVjaG8gTEFCRUwgJGIKKwllY2hvICIiIEtFUk5FTCAkZworCW1jb3B5IC1tIC1pICRpbWcgJGYgOjokZworZG9uZSA+PiAkY2ZnCisKK21jb3B5IC1pICRpbWcgJGNmZyA6OnN5c2xpbnV4LmNmZworCitpZiAhIHN5c2xpbnV4ICRpbWcKK3RoZW4KKwlleGl0IDEKK2ZpCisKK21raXNvZnMgLXEgLW8gJG91dCAtYyBib290LmNhdCAtYiBib290LmltZyAkZGlyCisKK3JtIC1mciAkZGlyCmRpZmYgLS1naXQgYS9ncHhlL3NyYy91dGlsL2dlbnNkc2sgYi9ncHhlL3NyYy91dGlsL2dlbnNkc2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTg2NjE1OAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL3V0aWwvZ2Vuc2RzawpAQCAtMCwwICsxLDY1IEBACisjIS9iaW4vYmFzaAorIworIyBHZW5lcmF0ZSBhIHN5c2xpbnV4IGZsb3BweSB0aGF0IGxvYWRzIGEgZ1BYRSBpbWFnZQorIworIyBnZW5zZHNrIGZvby5zZHNrIGZvby5sa3JuCisjCisjIHRoZSBmbG9wcHkgaW1hZ2UgaXMgdGhlIGZpcnN0IGFyZ3VtZW50CisjICAgZm9sbG93ZWQgYnkgbGlzdCBvZiAubGtybiBpbWFnZXMKKyMKKworY2FzZSAkIyBpbgorMHwxKQorCWVjaG8gVXNhZ2U6ICQwIGZvby5zZHNrIGZvby5sa3JuIC4uLgorCWV4aXQgMQorCTs7Citlc2FjCitjYXNlICJgbXRvb2xzIC1WYCIgaW4KK010b29sc1wgdmVyc2lvblwgMy45LjkqfE10b29sc1wgdmVyc2lvblwgMy45LjFbMC05XSp8W21NXXRvb2xzXCAqXCBbNC05XS4qKQorCTs7CisqKQorCWVjaG8gTXRvb2xzIHZlcnNpb24gMy45Ljkgb3IgbGF0ZXIgaXMgcmVxdWlyZWQKKwlleGl0IDEKKwk7OworZXNhYworaW1nPSQxCitzaGlmdAorZGlyPWBta3RlbXAgLWQgYmluL3Nkc2suZGlyLlhYWFhYWGAKKworbWZvcm1hdCAtZiAxNDQwIC1DIC1pICRpbWcgOjoKK2NmZz0kZGlyL3N5c2xpbnV4LmNmZworY2F0ID4gJGNmZyA8PEVPRgorCisjIFRoZXNlIGRlZmF1bHQgb3B0aW9ucyBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgZ2Vuc2RzayBzY3JpcHQKK1RJTUVPVVQgMzAKK0VPRgorZmlyc3Q9Citmb3IgZgorZG8KKwlpZiBbICEgLXIgJGYgXQorCXRoZW4KKwkJZWNobyAkZiBkb2VzIG5vdCBleGlzdCwgc2tpcHBpbmcgMT4mMgorCQljb250aW51ZQorCWZpCisJIyBzaG9ydGVuIG5hbWUgZm9yIDguMyBmaWxlc3lzdGVtCisJYj0kKGJhc2VuYW1lICRmKQorCWc9JHtiJS5sa3JufQorCWc9JHtnLy9bXmEtejAtOV19CisJZz0ke2c6MDo4fS5rcm4KKwljYXNlICIkZmlyc3QiIGluCisJIiIpCisJCWVjaG8gREVGQVVMVCAkZworCQk7OworCWVzYWMKKwlmaXJzdD0kZworCWVjaG8gTEFCRUwgJGIKKwllY2hvICIiIEtFUk5FTCAkZworCW1jb3B5IC1tIC1pICRpbWcgJGYgOjokZworZG9uZSA+PiAkY2ZnCittY29weSAtaSAkaW1nICRjZmcgOjpzeXNsaW51eC5jZmcKK2lmICEgc3lzbGludXggJGltZwordGhlbgorCWV4aXQgMQorZmkKKworcm0gLWZyICRkaXIKZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvZ2V0LXBjaS1pZHMgYi9ncHhlL3NyYy91dGlsL2dldC1wY2ktaWRzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1MDFhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL2dldC1wY2ktaWRzCkBAIC0wLDAgKzEsMTM1IEBACisjISAvdXNyL2Jpbi9wZXJsIC13CisKKyMgZ2V0LXBjaS1pZHM6IGV4dHJhY3QgcGNpIHZlbmRvci9kZXZpY2UgaWRzIGZyb20gbGludXggbmV0IGRyaXZlcnMKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMgR2VvcmcgQmF1bSA8Z2JhdW1AdXNlcnMuc2YubmV0PgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworIyBLbm93biBidWdzL2xpbWl0YXRpb25zOgorIyAtIERvZXMgbm90IHJlY29nbml6ZSBhbGwgZHJpdmVycyBiZWNhdXNlIHNvbWUgcmVxdWlyZSBzcGVjaWFsIGNmbGFncy4KKyMgICBGYWlscyBhbHNvIG9uIHNvbWUgZHJpdmVycyB0aGF0IGRvIGJlbG9uZyB0byBvdGhlciBhcmNoaXRlY3R1cmVzCisjICAgdGhhbiB0aGUgb25lIG9mIHRoZSBtYWNoaW5lIHRoaXMgc2NyaXB0IGlzIHJ1bm5pbmcgb24uCisjICAgVGhpcyBpcyBjdXJyZW50bHkgbm90IHNvIGltcG9ydGFudCBiZWNhdXNlIGFsbCBkcml2ZXJzIHRoYXQgaGF2ZSBhbgorIyAgIEV0aGVyYm9vdCBjb3VudGVycGFydCBhcmUgcmVjb2duaXplZC4KKworCit1c2Ugc3RyaWN0OwordXNlIEZpbGU6OkJhc2VuYW1lICJkaXJuYW1lIjsKK3VzZSBQT1NJWCAidW5hbWUiOworCisjIFdoZXJlIHRvIGZpbmQgdGhlIGtlcm5lbCBzb3VyY2VzCitteSAka2VybmVsX3NyYyA9ICIvdXNyL3NyYy9saW51eCI7CisKK2lmKCQjQVJHViA+PSAwKSB7CisJJGtlcm5lbF9zcmMgPSBzaGlmdDsKK30KKworIyBTYW5pdHkgY2hlY2tzCitpZigkI0FSR1YgPj0gMCkgeworCXByaW50IFNUREVSUiAiVG9vIG1hbnkgYXJndW1lbnRzLlxuIjsKKwlwcmludCBTVERFUlIgIlVzYWdlOiBnZXQtcGNpLWlkcyBbcGF0aCB0byBrZXJuZWwgc291cmNlc11cbiI7CisJcHJpbnQgU1RERVJSICIgICAgICAgL3Vzci9zcmMvbGludXggaXMgYXNzdW1lZCBpZiBubyBwYXRoIGlzIGdpdmVuLlxuIjsKKwlleGl0IDE7Cit9CisKK3VubGVzcygtZiAiJGtlcm5lbF9zcmMvaW5jbHVkZS9saW51eC92ZXJzaW9uLmgiKSB7CisJcHJpbnQgU1RERVJSICJDb3VsZCBub3QgZmluZCAka2VybmVsX3NyYy9pbmNsdWRlL2xpbnV4L3ZlcnNpb24uaC5cbiI7CisJcHJpbnQgU1RERVJSICIka2VybmVsX3NyYyBpcyBwcm9iYWJseSBubyBMaW51eCBrZXJuZWwgc291cmNlIHRyZWUuXG4iOworCWV4aXQgMTsKK30KKworIyBGbGFncyB0aGF0IGFyZSBuZWVkZWQgdG8gcHJlcHJvY2VzcyB0aGUgZHJpdmVycy4KKyMgU29tZSBkcml2ZXJzIG5lZWQgb3B0aW1pemF0aW9uCitteSAkY2ZsYWdzPSItRF9fS0VSTkVMX18gLUkka2VybmVsX3NyYy9pbmNsdWRlIC1JJGtlcm5lbF9zcmMvbmV0L2luZXQgLU8yIjsKKworIyBUaGUgQyBwcmVwcm9jZXNzb3IuIEl0IG5lZWRzIHRvIHNwaXQgb3V0IHRoZSBwcmVwcm9jZXNzZWQgc291cmNlIG9uIHN0ZG91dC4KK215ICRjcHA9ImdjYyAtRSI7CisKKyMgTGlzdCBvZiBkcml2ZXJzLiBXZSBwYXJzZSBldmVyeSAuYyBmaWxlLiBJdCBkb2VzIG5vdCBoYXJtIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBkcml2ZXIuCitteSBAZHJpdmVycyA9IHNwbGl0IC9ccysvLCBgZmluZCAka2VybmVsX3NyYy9kcml2ZXJzL25ldCAtbmFtZSAnKi5jJyB8IHNvcnRgOworCisjIEtlcm5lbCB2ZXJzaW9uCitteSAkdmVyc2lvbiA9IGBncmVwIFVUU19SRUxFQVNFICRrZXJuZWxfc3JjL2luY2x1ZGUvbGludXgvdmVyc2lvbi5oYDsKK2Nob21wICR2ZXJzaW9uOworJHZlcnNpb24gPX4gcy9ccyojZGVmaW5lXHMrVVRTX1JFTEVBU0VccysiKFxTKykiLiokLyQxL2c7CisKKyMgQXJjaGl0ZWN0dXJlCitteSBAdW5hbWUgPSB1bmFtZSgpOworCisKKyMgUHJpbnQgaGVhZGVyCitwcmludCAiIyBQQ0kgdmVuZG9yL2RldmljZSBpZHMgZXh0cmFjdGVkIGZyb20gTGludXggJHZlcnNpb24gb24gJHVuYW1lWzRdIGF0ICIgLiBnbXRpbWUoKSAuICJcbiI7CisKK215ICRkcml2ZXI7CisKKyMgUHJvY2VzcyB0aGUgZHJpdmVycworZm9yZWFjaCAkZHJpdmVyIChAZHJpdmVycykgeworCisJIyBQcmVwcm9jZXNzIHRvIGV4cGFuZCBtYWNyb3MKKwlteSAkY29tbWFuZCA9ICIkY3BwICRjZmxhZ3MgLUkiIC4gZGlybmFtZSgkZHJpdmVyKSAuICIgJGRyaXZlciI7CisJb3BlbiAgRFJJVkVSLCAiJGNvbW1hbmQgfCIgb3IgZGllICJDb3VsZCBub3QgZXhlY3V0ZVxuXCIkY29tbWFuZFwiLlxuIjsKKworCSMgRXh0cmFjdCB0aGUgcGNpX2RldmljZV9pZCBzdHJ1Y3R1cmUKKwlteSAkZm91bmQgPSAwOworCW15ICRsaW5lID0gIiI7CisJbXkgQGxpbmVzOworCXdoaWxlKDxEUklWRVI+KSB7CisJCWlmKC9eXHMqc3RhdGljXHMrc3RydWN0XHMrcGNpX2RldmljZV9pZC8pIHsKKwkJCSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgZHJpdmVyLiBQcmludCB0aGUgbmFtZS4KKwkJCSRkcml2ZXIgPX4gcyEka2VybmVsX3NyYy9kcml2ZXJzL25ldC8hIWc7CisJCQlwcmludCAiXG4kZHJpdmVyXG4iOworCQkJJGZvdW5kID0gMTsKKwkJCW5leHQ7CisJCX0KKwkJaWYoJGZvdW5kID09IDEpeworCQkJaWYoL1x9Oy8gb3IgL3tccyowXHMqLD9ccyp9LykgeworCQkJCSMgRW5kIG9mIHN0cnVjdAorCQkJCSRmb3VuZCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWNob21wOworCQkJCWlmKC9cfVxzKiw/XHMqXG4/JC8pIHsKKwkJCQkJIyBUaGlzIGxpbmUgY29udGFpbnMgYSBmdWxsIGVudHJ5IG9yIHRoZSBsYXN0IHBhcnQgb2YgaXQuCisJCQkJCSRfID0gJGxpbmUgLiAkXzsKKwkJCQkJJGxpbmUgPSAiIjsKKwkJCQkJcy9bLFx7XH07XChcKV0vL2c7CSMgU3RyaXAgcHVuY3R1YXRpb24KKwkJCQkJcy9eXHMrLy9nOwkJIyBFYXQgd2hpdGVzcGFjZSBhdCBiZWdpbm5pbmcgb2YgbGluZQorCQkJCQl0cltBLVpdW2Etel07CQkjIENvbnZlcnQgdG8gbG93ZXJjYXNlCisJCQkJCSMgUHVzaCB0aGUgdmVuZG9yIGFuZCBkZXZpY2UgaWQgdG8gQGxpbmVzIGlmIHRoaXMgbGluZSBpcyBub3QgZW1wdHkuCisJCQkJCSMgV2UgaWdub3JlIGV2ZXJ5dGhpbmcgZWxzZSB0aGF0IG1pZ2h0IGJlIHRoZXJlCisJCQkJCW15ICgkdmVuZG9yX2lkLCAkZGV2aWNlX2lkLCAkcmVtYWluZGVyKSA9IHNwbGl0IC9cVysvLCAkXywgMzsKKwkJCQkJcHVzaCBAbGluZXMsICIkdmVuZG9yX2lkICRkZXZpY2VfaWRcbiIgaWYoJHZlbmRvcl9pZCAmJiAkZGV2aWNlX2lkKTsKKwkJCQl9IGVsc2UgeworCQkJCQkjIFRoaXMgbGluZSBkb2VzIGNvbnRhaW4gYSBwYXJ0aWFsIGVudHJ5LiBSZW1lbWJlciBpdC4KKwkJCQkJJGxpbmUgLj0gIiRfICI7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWNsb3NlIERSSVZFUjsJCSMgTm8gIm9yIGRpZSIsIGJlY2F1c2UgJGNwcCBmYWlscyBvbiBzb21lIGZpbGVzCisKKwkjIE5vdyBwcmludCBvdXQgdGhlIHNvcnRlZCB2YWx1ZXMKKwlAbGluZXMgPSBzb3J0IEBsaW5lczsKKwlteSAkbGFzdGxpbmUgPSAiIjsKKwlmb3JlYWNoKEBsaW5lcykgeworCQkjIFByaW50IGVhY2ggdmVuZG9yL2RldmljZSBpZCBjb21iaW5hdGlvbiBvbmx5IG9uY2UuCisJCSMgU29tZSBkcml2ZXJzIChlLmcuIGUxMDApIGRvIGNvbnRhaW4gc3ViZmFtaWxpZXMKKwkJcHJpbnQgaWYoJF8gbmUgJGxhc3RsaW5lKTsKKwkJJGxhc3RsaW5lID0gJF87CisJfQorfQorCisKZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvaGlqYWNrLmMgYi9ncHhlL3NyYy91dGlsL2hpamFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODk1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL2hpamFjay5jCkBAIC0wLDAgKzEsNjI4IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHBjYXAuaD4KKworI2RlZmluZSBTTkFQTEVOIDE2MDAKKworLyoKKyAqIEZJWE1FOiBpcyB0aGVyZSBhIHdheSB0byBkZXRlY3QgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnBjYXAgbGlicmFyeT8KKyAqIFZlcnNpb24gMC45IGhhcyBwY2FwX2luamVjdDsgdmVyc2lvbiAwLjggZG9lc24ndCwgYnV0IGJvdGggcmVwb3J0CisgKiB0aGVpciB2ZXJzaW9uIG51bWJlciBhcyAyLjQuCisgKi8KKyNkZWZpbmUgSEFWRV9QQ0FQX0lOSkVDVCAwCisKK3N0cnVjdCBoaWphY2sgeworCXBjYXBfdCAqcGNhcDsKKwlpbnQgZmQ7CisJaW50IGRhdGFsaW5rOworCWludCBmaWx0ZXJlZDsKKwl1bnNpZ25lZCBsb25nIHJ4X2NvdW50OworCXVuc2lnbmVkIGxvbmcgdHhfY291bnQ7Cit9OworCitzdHJ1Y3QgaGlqYWNrX2xpc3RlbmVyIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc3VuOworCWludCBmZDsKK307CisKK3N0cnVjdCBoaWphY2tfb3B0aW9ucyB7CisJY2hhciBpbnRlcmZhY2VbSUZfTkFNRVNJWkVdOworCWludCBkYWVtb25pc2U7Cit9OworCitzdGF0aWMgaW50IGRhZW1vbmlzZWQgPSAwOworCitzdGF0aWMgaW50IHNpZ25hbGxlZCA9IDA7CisKK3N0YXRpYyB2b2lkIGZsYWdfc2lnbmFsbGVkICggaW50IHNpZ25hbCBfX2F0dHJpYnV0ZV9fICgoIHVudXNlZCApKSApIHsKKwlzaWduYWxsZWQgPSAxOworfQorCisjaWYgISBIQVZFX1BDQVBfSU5KRUNUCisvKioKKyAqIFN1YnN0aXR1dGUgZm9yIHBjYXBfaW5qZWN0KCksIGlmIHRoaXMgdmVyc2lvbiBvZiBsaWJwY2FwIGRvZXNuJ3QKKyAqIGhhdmUgaXQuICBXaWxsIGFsbW9zdCBjZXJ0YWlubHkgb25seSB3b3JrIHVuZGVyIExpbnV4LgorICoKKyAqLworaW50IHBjYXBfaW5qZWN0ICggcGNhcF90ICpwY2FwLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuICkgeworCWludCBmZDsKKwljaGFyICplcnJidWYgPSBwY2FwX2dldGVyciAoIHBjYXAgKTsKKworCWZkID0gcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCAoIHBjYXAgKTsKKwlpZiAoIGZkIDwgMCApIHsKKwkJc25wcmludGYgKCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAiY291bGQgbm90IGdldCBmaWxlIGRlc2NyaXB0b3IiICk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCB3cml0ZSAoIGZkLCBkYXRhLCBsZW4gKSAhPSBsZW4gKSB7CisJCXNucHJpbnRmICggZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgImNvdWxkIG5vdCB3cml0ZSBkYXRhOiAlcyIsIHN0cmVycm9yICggZXJybm8gKSApOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBsZW47Cit9CisjZW5kaWYgLyogISBIQVZFX1BDQVBfSU5KRUNUICovCisKKy8qKgorICogTG9nIGVycm9yIG1lc3NhZ2UKKyAqCisgKi8KK3N0YXRpYyBfX2F0dHJpYnV0ZV9fICgoIGZvcm1hdCAoIHByaW50ZiwgMiwgMyApICkpIHZvaWQKK2xvZ21zZyAoIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKSB7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0ICggYXAsIGZvcm1hdCApOworCWlmICggZGFlbW9uaXNlZCApIHsKKwkJdnN5c2xvZyAoICggTE9HX0RBRU1PTiB8IGxldmVsICksIGZvcm1hdCwgYXAgKTsKKwl9IGVsc2UgeworCQl2ZnByaW50ZiAoIHN0ZGVyciwgZm9ybWF0LCBhcCApOworCX0KKwl2YV9lbmQgKCBhcCApOworfQorCisvKioKKyAqIE9wZW4gcGNhcCBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgaGlqYWNrX29wZW4gKCBjb25zdCBjaGFyICppbnRlcmZhY2UsIHN0cnVjdCBoaWphY2sgKmhpamFjayApIHsKKwljaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKworCS8qIE9wZW4gaW50ZXJmYWNlIHZpYSBwY2FwICovCisJZXJyYnVmWzBdID0gJ1wwJzsKKwloaWphY2stPnBjYXAgPSBwY2FwX29wZW5fbGl2ZSAoIGludGVyZmFjZSwgU05BUExFTiwgMSwgMCwgZXJyYnVmICk7CisJaWYgKCAhIGhpamFjay0+cGNhcCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIkZhaWxlZCB0byBvcGVuICVzOiAlc1xuIiwKKwkJCSBpbnRlcmZhY2UsIGVycmJ1ZiApOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCBlcnJidWZbMF0gKQorCQlsb2dtc2cgKCBMT0dfV0FSTklORywgIldhcm5pbmc6ICVzXG4iLCBlcnJidWYgKTsKKworCS8qIFNldCBjYXB0dXJlIGludGVyZmFjZSB0byBub24tYmxvY2tpbmcgbW9kZSAqLworCWlmICggcGNhcF9zZXRub25ibG9jayAoIGhpamFjay0+cGNhcCwgMSwgZXJyYnVmICkgPCAwICkgeworCQlsb2dtc2cgKCBMT0dfRVJSLCAiQ291bGQgbm90IG1ha2UgJXMgbm9uLWJsb2NraW5nOiAlc1xuIiwKKwkJCSBpbnRlcmZhY2UsIGVycmJ1ZiApOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBHZXQgZmlsZSBkZXNjcmlwdG9yIGZvciBzZWxlY3QoKSAqLworCWhpamFjay0+ZmQgPSBwY2FwX2dldF9zZWxlY3RhYmxlX2ZkICggaGlqYWNrLT5wY2FwICk7CisJaWYgKCBoaWphY2stPmZkIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIkNhbm5vdCBnZXQgc2VsZWN0YWJsZSBmaWxlIGRlc2NyaXB0b3IgIgorCQkJICJmb3IgJXNcbiIsIGludGVyZmFjZSApOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBHZXQgbGluayBsYXllciB0eXBlICovCisJaGlqYWNrLT5kYXRhbGluayA9IHBjYXBfZGF0YWxpbmsgKCBoaWphY2stPnBjYXAgKTsKKworCXJldHVybiAwOworCisgZXJyOgorCWlmICggaGlqYWNrLT5wY2FwICkKKwkJcGNhcF9jbG9zZSAoIGhpamFjay0+cGNhcCApOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBDbG9zZSBwY2FwIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgaGlqYWNrX2Nsb3NlICggc3RydWN0IGhpamFjayAqaGlqYWNrICkgeworCXBjYXBfY2xvc2UgKCBoaWphY2stPnBjYXAgKTsKK30KKworLyoqCisgKiBJbnN0YWxsIGZpbHRlciBmb3IgaGlqYWNrZWQgY29ubmVjdGlvbgorICoKKyAqLworc3RhdGljIGludCBoaWphY2tfaW5zdGFsbF9maWx0ZXIgKCBzdHJ1Y3QgaGlqYWNrICpoaWphY2ssCisJCQkJICAgY2hhciAqZmlsdGVyICkgeworCXN0cnVjdCBicGZfcHJvZ3JhbSBwcm9ncmFtOworCisJLyogQ29tcGlsZSBmaWx0ZXIgKi8KKwlpZiAoIHBjYXBfY29tcGlsZSAoIGhpamFjay0+cGNhcCwgJnByb2dyYW0sIGZpbHRlciwgMSwgMCApIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgImNvdWxkIG5vdCBjb21waWxlIGZpbHRlciBcIiVzXCI6ICVzXG4iLAorCQkJIGZpbHRlciwgcGNhcF9nZXRlcnIgKCBoaWphY2stPnBjYXAgKSApOworCQlnb3RvIGVycl9ub2ZyZWU7CisJfQorCisJLyogSW5zdGFsbCBmaWx0ZXIgKi8KKwlpZiAoIHBjYXBfc2V0ZmlsdGVyICggaGlqYWNrLT5wY2FwLCAmcHJvZ3JhbSApIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgImNvdWxkIG5vdCBpbnN0YWxsIGZpbHRlciBcIiVzXCI6ICVzXG4iLAorCQkJIGZpbHRlciwgcGNhcF9nZXRlcnIgKCBoaWphY2stPnBjYXAgKSApOworCQlnb3RvIGVycjsKKwl9CisJCisJbG9nbXNnICggTE9HX0lORk8sICJ1c2luZyBmaWx0ZXIgXCIlc1wiXG4iLCBmaWx0ZXIgKTsKKworCXBjYXBfZnJlZWNvZGUgKCAmcHJvZ3JhbSApOworCXJldHVybiAwOworCisgZXJyOgkKKwlwY2FwX2ZyZWVjb2RlICggJnByb2dyYW0gKTsKKyBlcnJfbm9mcmVlOgorCXJldHVybiAtMTsKK30KKworLyoqCisgKiBTZXQgdXAgZmlsdGVyIGZvciBoaWphY2tlZCBldGhlcm5ldCBjb25uZWN0aW9uCisgKgorICovCitzdGF0aWMgaW50IGhpamFja19maWx0ZXJfZXRoZXJuZXQgKCBzdHJ1Y3QgaGlqYWNrICpoaWphY2ssIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGxlbiApIHsKKwljaGFyIGZpbHRlcls1NV07IC8qIHNlZSBmb3JtYXQgc3RyaW5nICovCisJc3RydWN0IGV0aGVyX2hlYWRlciAqZXRoZXJfaGVhZGVyID0gKCBzdHJ1Y3QgZXRoZXJfaGVhZGVyICogKSBidWY7CisJdW5zaWduZWQgY2hhciAqaHdhZGRyID0gZXRoZXJfaGVhZGVyLT5ldGhlcl9zaG9zdDsKKworCWlmICggbGVuIDwgc2l6ZW9mICggKmV0aGVyX2hlYWRlciApICkKKwkJcmV0dXJuIC0xOworCisJc25wcmludGYgKCBmaWx0ZXIsIHNpemVvZiAoIGZpbHRlciApLCAiYnJvYWRjYXN0IG9yIG11bHRpY2FzdCBvciAiCisJCSAgICJldGhlciBob3N0ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgaHdhZGRyWzBdLAorCQkgICBod2FkZHJbMV0sIGh3YWRkclsyXSwgaHdhZGRyWzNdLCBod2FkZHJbNF0sIGh3YWRkcls1XSApOworCisJcmV0dXJuIGhpamFja19pbnN0YWxsX2ZpbHRlciAoIGhpamFjaywgZmlsdGVyICk7Cit9CisKKy8qKgorICogU2V0IHVwIGZpbHRlciBmb3IgaGlqYWNrZWQgY29ubmVjdGlvbgorICoKKyAqLworc3RhdGljIGludCBoaWphY2tfZmlsdGVyICggc3RydWN0IGhpamFjayAqaGlqYWNrLCBjb25zdCBjaGFyICpidWYsCisJCQkgICBzaXplX3QgbGVuICkgeworCXN3aXRjaCAoIGhpamFjay0+ZGF0YWxpbmsgKSB7CisJY2FzZSBETFRfRU4xME1COgorCQlyZXR1cm4gaGlqYWNrX2ZpbHRlcl9ldGhlcm5ldCAoIGhpamFjaywgYnVmLCBsZW4gKTsKKwlkZWZhdWx0OgorCQlsb2dtc2cgKCBMT0dfRVJSLCAidW5zdXBwb3J0ZWQgcHJvdG9jb2wgJXM6IGNhbm5vdCBmaWx0ZXJcbiIsCisJCQkgKCBwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lICggaGlqYWNrLT5kYXRhbGluayApID8KKwkJCSAgIHBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUgKCBoaWphY2stPmRhdGFsaW5rICkgOgorCQkJICAgIlVOS05PV04iICkgKTsKKwkJLyogUmV0dXJuIHN1Y2Nlc3Mgc28gd2UgZG9uJ3QgZ2V0IGNhbGxlZCBhZ2FpbiAqLworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKgorICogRm9yd2FyZCBkYXRhIGZyb20gaGlqYWNrZXIKKyAqCisgKi8KK3N0YXRpYyBzc2l6ZV90IGZvcndhcmRfZnJvbV9oaWphY2tlciAoIHN0cnVjdCBoaWphY2sgKmhpamFjaywgaW50IGZkICkgeworCWNoYXIgYnVmW1NOQVBMRU5dOworCXNzaXplX3QgbGVuOworCisJLyogUmVhZCBwYWNrZXQgZnJvbSBoaWphY2tlciAqLworCWxlbiA9IHJlYWQgKCBmZCwgYnVmLCBzaXplb2YgKCBidWYgKSApOworCWlmICggbGVuIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgInJlYWQgZnJvbSBoaWphY2tlciBmYWlsZWQ6ICVzXG4iLAorCQkJIHN0cmVycm9yICggZXJybm8gKSApOworCQlyZXR1cm4gLTE7CisJfQorCWlmICggbGVuID09IDAgKQorCQlyZXR1cm4gMDsKKworCS8qIFNldCB1cCBmaWx0ZXIgaWYgbm90IGFscmVhZHkgaW4gcGxhY2UgKi8KKwlpZiAoICEgaGlqYWNrLT5maWx0ZXJlZCApIHsKKwkJaWYgKCBoaWphY2tfZmlsdGVyICggaGlqYWNrLCBidWYsIGxlbiApID09IDAgKQorCQkJaGlqYWNrLT5maWx0ZXJlZCA9IDE7CisJfQorCisJLyogVHJhbnNtaXQgcGFja2V0IHRvIG5ldHdvcmsgKi8KKwlpZiAoIHBjYXBfaW5qZWN0ICggaGlqYWNrLT5wY2FwLCBidWYsIGxlbiApICE9IGxlbiApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIndyaXRlIHRvIGhpamFja2VkIHBvcnQgZmFpbGVkOiAlc1xuIiwKKwkJCSBwY2FwX2dldGVyciAoIGhpamFjay0+cGNhcCApICk7CisJCXJldHVybiAtMTsKKwl9CisKKwloaWphY2stPnR4X2NvdW50Kys7CisJcmV0dXJuIGxlbjsKK307CisKKy8qKgorICogRm9yd2FyZCBkYXRhIHRvIGhpamFja2VyCisgKgorICovCitzdGF0aWMgc3NpemVfdCBmb3J3YXJkX3RvX2hpamFja2VyICggaW50IGZkLCBzdHJ1Y3QgaGlqYWNrICpoaWphY2sgKSB7CisJc3RydWN0IHBjYXBfcGt0aGRyICpwa3RfaGVhZGVyOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBrdF9kYXRhOworCXNzaXplX3QgbGVuOworCisJLyogUmVjZWl2ZSBwYWNrZXQgZnJvbSBuZXR3b3JrICovCisJaWYgKCBwY2FwX25leHRfZXggKCBoaWphY2stPnBjYXAsICZwa3RfaGVhZGVyLCAmcGt0X2RhdGEgKSA8IDAgKSB7CisJCWxvZ21zZyAoIExPR19FUlIsICJyZWFkIGZyb20gaGlqYWNrZWQgcG9ydCBmYWlsZWQ6ICVzXG4iLAorCQkJIHBjYXBfZ2V0ZXJyICggaGlqYWNrLT5wY2FwICkgKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIHBrdF9oZWFkZXItPmNhcGxlbiAhPSBwa3RfaGVhZGVyLT5sZW4gKSB7CisJCWxvZ21zZyAoIExPR19FUlIsICJyZWFkIHBhcnRpYWwgcGFja2V0ICglZCBvZiAlZCBieXRlcylcbiIsCisJCQkgcGt0X2hlYWRlci0+Y2FwbGVuLCBwa3RfaGVhZGVyLT5sZW4gKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIHBrdF9oZWFkZXItPmNhcGxlbiA9PSAwICkKKwkJcmV0dXJuIDA7CisJbGVuID0gcGt0X2hlYWRlci0+Y2FwbGVuOworCisJLyogV3JpdGUgcGFja2V0IHRvIGhpamFja2VyICovCisJaWYgKCB3cml0ZSAoIGZkLCBwa3RfZGF0YSwgbGVuICkgIT0gbGVuICkgeworCQlsb2dtc2cgKCBMT0dfRVJSLCAid3JpdGUgdG8gaGlqYWNrZXIgZmFpbGVkOiAlc1xuIiwKKwkJCSBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWhpamFjay0+cnhfY291bnQrKzsKKwlyZXR1cm4gbGVuOworfTsKKworCisvKioKKyAqIFJ1biBoaWphY2tlcgorICoKKyAqLworc3RhdGljIGludCBydW5faGlqYWNrZXIgKCBjb25zdCBjaGFyICppbnRlcmZhY2UsIGludCBmZCApIHsKKwlzdHJ1Y3QgaGlqYWNrIGhpamFjazsKKwlmZF9zZXQgZmRzZXQ7CisJaW50IG1heF9mZDsKKwlzc2l6ZV90IGxlbjsKKworCWxvZ21zZyAoIExPR19JTkZPLCAibmV3IGNvbm5lY3Rpb24gZm9yICVzXG4iLCBpbnRlcmZhY2UgKTsKKworCS8qIE9wZW4gY29ubmVjdGlvbiB0byBuZXR3b3JrICovCisJbWVtc2V0ICggJmhpamFjaywgMCwgc2l6ZW9mICggaGlqYWNrICkgKTsKKwlpZiAoIGhpamFja19vcGVuICggaW50ZXJmYWNlLCAmaGlqYWNrICkgPCAwICkKKwkJZ290byBlcnI7CisJCisJLyogRG8gdGhlIGZvcndhcmRpbmcgKi8KKwltYXhfZmQgPSAoICggZmQgPiBoaWphY2suZmQgKSA/IGZkIDogaGlqYWNrLmZkICk7CisJd2hpbGUgKCAxICkgeworCQkvKiBXYWl0IGZvciBhdmFpbGFibGUgZGF0YSAqLworCQlGRF9aRVJPICggJmZkc2V0ICk7CisJCUZEX1NFVCAoIGZkLCAmZmRzZXQgKTsKKwkJRkRfU0VUICggaGlqYWNrLmZkLCAmZmRzZXQgKTsKKwkJaWYgKCBzZWxlY3QgKCAoIG1heF9mZCArIDEgKSwgJmZkc2V0LCBOVUxMLCBOVUxMLCAwICkgPCAwICkgeworCQkJbG9nbXNnICggTE9HX0VSUiwgInNlbGVjdCBmYWlsZWQ6ICVzXG4iLAorCQkJCSBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmICggRkRfSVNTRVQgKCBmZCwgJmZkc2V0ICkgKSB7CisJCQlsZW4gPSBmb3J3YXJkX2Zyb21faGlqYWNrZXIgKCAmaGlqYWNrLCBmZCApOworCQkJaWYgKCBsZW4gPCAwICkKKwkJCQlnb3RvIGVycjsKKwkJCWlmICggbGVuID09IDAgKQorCQkJCWJyZWFrOworCQl9CisJCWlmICggRkRfSVNTRVQgKCBoaWphY2suZmQsICZmZHNldCApICkgeworCQkJbGVuID0gZm9yd2FyZF90b19oaWphY2tlciAoIGZkLCAmaGlqYWNrICk7CisJCQlpZiAoIGxlbiA8IDAgKQorCQkJCWdvdG8gZXJyOworCQkJaWYgKCBsZW4gPT0gMCApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwloaWphY2tfY2xvc2UgKCAmaGlqYWNrICk7CisJbG9nbXNnICggTE9HX0lORk8sICJjbG9zZWQgY29ubmVjdGlvbiBmb3IgJXNcbiIsIGludGVyZmFjZSApOworCWxvZ21zZyAoIExPR19JTkZPLCAicmVjZWl2ZWQgJWxkIHBhY2tldHMsIHNlbnQgJWxkIHBhY2tldHNcbiIsCisJCSBoaWphY2sucnhfY291bnQsIGhpamFjay50eF9jb3VudCApOworCisJcmV0dXJuIDA7CisKKyBlcnI6CisJaWYgKCBoaWphY2sucGNhcCApCisJCWhpamFja19jbG9zZSAoICZoaWphY2sgKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogT3BlbiBsaXN0ZW5lciBzb2NrZXQKKyAqCisgKi8KK3N0YXRpYyBpbnQgb3Blbl9saXN0ZW5lciAoIGNvbnN0IGNoYXIgKmludGVyZmFjZSwKKwkJCSAgIHN0cnVjdCBoaWphY2tfbGlzdGVuZXIgKmxpc3RlbmVyICkgeworCQorCS8qIENyZWF0ZSBzb2NrZXQgKi8KKwlsaXN0ZW5lci0+ZmQgPSBzb2NrZXQgKCBQRl9VTklYLCBTT0NLX1NFUVBBQ0tFVCwgMCApOworCWlmICggbGlzdGVuZXItPmZkIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0OiAlc1xuIiwKKwkJCSBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogQmluZCB0byBsb2NhbCBmaWxlbmFtZSAqLworCWxpc3RlbmVyLT5zdW4uc3VuX2ZhbWlseSA9IEFGX1VOSVgsCisJc25wcmludGYgKCBsaXN0ZW5lci0+c3VuLnN1bl9wYXRoLCBzaXplb2YgKCBsaXN0ZW5lci0+c3VuLnN1bl9wYXRoICksCisJCSAgICIvdmFyL3J1bi9oaWphY2stJXMiLCBpbnRlcmZhY2UgKTsKKwlpZiAoIGJpbmQgKCBsaXN0ZW5lci0+ZmQsICggc3RydWN0IHNvY2thZGRyICogKSAmbGlzdGVuZXItPnN1biwKKwkJICAgIHNpemVvZiAoIGxpc3RlbmVyLT5zdW4gKSApIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIkNvdWxkIG5vdCBiaW5kIHNvY2tldCB0byAlczogJXNcbiIsCisJCQkgbGlzdGVuZXItPnN1bi5zdW5fcGF0aCwgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFNldCBhcyBhIGxpc3RlbmluZyBzb2NrZXQgKi8KKwlpZiAoIGxpc3RlbiAoIGxpc3RlbmVyLT5mZCwgMCApIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIkNvdWxkIG5vdCBsaXN0ZW4gdG8gJXM6ICVzXG4iLAorCQkJIGxpc3RlbmVyLT5zdW4uc3VuX3BhdGgsIHN0cmVycm9yICggZXJybm8gKSApOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKwkKKyBlcnI6CisJaWYgKCBsaXN0ZW5lci0+ZmQgPj0gMCApCisJCWNsb3NlICggbGlzdGVuZXItPmZkICk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIExpc3RlbiBvbiBsaXN0ZW5lciBzb2NrZXQKKyAqCisgKi8KK3N0YXRpYyBpbnQgbGlzdGVuX2Zvcl9oaWphY2tlcnMgKCBzdHJ1Y3QgaGlqYWNrX2xpc3RlbmVyICpsaXN0ZW5lciwKKwkJCQkgIGNvbnN0IGNoYXIgKmludGVyZmFjZSApIHsKKwlpbnQgZmQ7CisJcGlkX3QgY2hpbGQ7CisJaW50IHJjOworCisJbG9nbXNnICggTE9HX0lORk8sICJMaXN0ZW5pbmcgb24gJXNcbiIsIGxpc3RlbmVyLT5zdW4uc3VuX3BhdGggKTsKKworCXdoaWxlICggISBzaWduYWxsZWQgKSB7CisJCS8qIEFjY2VwdCBuZXcgY29ubmVjdGlvbiwgaW50ZXJydXB0aWJseSAqLworCQlzaWdpbnRlcnJ1cHQgKCBTSUdJTlQsIDEgKTsKKwkJc2lnaW50ZXJydXB0ICggU0lHSFVQLCAxICk7CisJCWZkID0gYWNjZXB0ICggbGlzdGVuZXItPmZkLCBOVUxMLCAwICk7CisJCXNpZ2ludGVycnVwdCAoIFNJR0lOVCwgMCApOworCQlzaWdpbnRlcnJ1cHQgKCBTSUdIVVAsIDAgKTsKKwkJaWYgKCBmZCA8IDAgKSB7CisJCQlpZiAoIGVycm5vID09IEVJTlRSICkgeworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlsb2dtc2cgKCBMT0dfRVJSLCAiYWNjZXB0IGZhaWxlZDogJXNcbiIsCisJCQkJCSBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJCS8qIEZvcmsgY2hpbGQgcHJvY2VzcyAqLworCQljaGlsZCA9IGZvcmsoKTsKKwkJaWYgKCBjaGlsZCA8IDAgKSB7CisJCQlsb2dtc2cgKCBMT0dfRVJSLCAiZm9yayBmYWlsZWQ6ICVzXG4iLAorCQkJCSBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmICggY2hpbGQgPT0gMCApIHsKKwkJCS8qIEkgYW0gdGhlIGNoaWxkOyBydW4gdGhlIGhpamFja2VyICovCisJCQlyYyA9IHJ1bl9oaWphY2tlciAoIGludGVyZmFjZSwgZmQgKTsKKwkJCWNsb3NlICggZmQgKTsKKwkJCWV4aXQgKCByYyApOworCQl9CisJCQorCQljbG9zZSAoIGZkICk7CisJfQorCisJbG9nbXNnICggTE9HX0lORk8sICJTdG9wcGVkIGxpc3RlbmluZyBvbiAlc1xuIiwKKwkJIGxpc3RlbmVyLT5zdW4uc3VuX3BhdGggKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlpZiAoIGZkID49IDAgKQorCQljbG9zZSAoIGZkICk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIENsb3NlIGxpc3RlbmVyIHNvY2tldAorICoKKyAqLworc3RhdGljIHZvaWQgY2xvc2VfbGlzdGVuZXIgKCBzdHJ1Y3QgaGlqYWNrX2xpc3RlbmVyICpsaXN0ZW5lciApIHsKKwljbG9zZSAoIGxpc3RlbmVyLT5mZCApOworCXVubGluayAoIGxpc3RlbmVyLT5zdW4uc3VuX3BhdGggKTsKK30KKworLyoqCisgKiBQcmludCB1c2FnZQorICoKKyAqLworc3RhdGljIHZvaWQgdXNhZ2UgKCBjaGFyICoqYXJndiApIHsKKwlsb2dtc2cgKCBMT0dfRVJSLAorCQkgIlVzYWdlOiAlcyBbb3B0aW9uc11cbiIKKwkJICJcbiIKKwkJICJPcHRpb25zOlxuIgorCQkgIiAgLWh8LS1oZWxwICAgICAgICAgICAgICAgUHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2VcbiIKKwkJICIgIC1pfC0taW50ZXJmYWNlIGludGYgICAgIFVzZSBzcGVjaWZpZWQgbmV0d29yayBpbnRlcmZhY2VcbiIKKwkJICIgIC1ufC0tbm9kYWVtb24gICAgICAgICAgIFJ1biBpbiBmb3JlZ3JvdW5kXG4iLAorCQkgYXJndlswXSApOworfQorCisvKioKKyAqIFBhcnNlIGNvbW1hbmQtbGluZSBvcHRpb25zCisgKgorICovCitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMgKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICBzdHJ1Y3QgaGlqYWNrX29wdGlvbnMgKm9wdGlvbnMgKSB7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCXsgImludGVyZmFjZSIsIDEsIE5VTEwsICdpJyB9LAorCQl7ICJub2RhZW1vbiIsIDAsIE5VTEwsICduJyB9LAorCQl7ICJoZWxwIiwgMCwgTlVMTCwgJ2gnIH0sCisJCXsgfSwKKwl9OworCWludCBjOworCisJLyogU2V0IGRlZmF1bHQgb3B0aW9ucyAqLworCW1lbXNldCAoIG9wdGlvbnMsIDAsIHNpemVvZiAoICpvcHRpb25zICkgKTsKKwlzdHJuY3B5ICggb3B0aW9ucy0+aW50ZXJmYWNlLCAiZXRoMCIsIHNpemVvZiAoIG9wdGlvbnMtPmludGVyZmFjZSApICk7CisJb3B0aW9ucy0+ZGFlbW9uaXNlID0gMTsKKworCS8qIFBhcnNlIGNvbW1hbmQtbGluZSBvcHRpb25zICovCisJd2hpbGUgKCAxICkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMDsKKwkJCisJCWMgPSBnZXRvcHRfbG9uZyAoIGFyZ2MsIGFyZ3YsICJpOmhuIiwgbG9uZ19vcHRpb25zLAorCQkJCSAgJm9wdGlvbl9pbmRleCApOworCQlpZiAoIGMgPCAwICkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoIGMgKSB7CisJCWNhc2UgJ2knOgorCQkJc3RybmNweSAoIG9wdGlvbnMtPmludGVyZmFjZSwgb3B0YXJnLAorCQkJCSAgc2l6ZW9mICggb3B0aW9ucy0+aW50ZXJmYWNlICkgKTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW9wdGlvbnMtPmRhZW1vbmlzZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQl1c2FnZSggYXJndiApOworCQkJcmV0dXJuIC0xOworCQljYXNlICc/JzoKKwkJCS8qIFVucmVjb2duaXNlZCBvcHRpb24gKi8KKwkJCXJldHVybiAtMTsKKwkJZGVmYXVsdDoKKwkJCWxvZ21zZyAoIExPR19FUlIsICJVbnJlY29nbmlzZWQgb3B0aW9uICctJWMnXG4iLCBjICk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiBDaGVjayB0aGVyZSdzIG5vdGhpbmcgbGVmdCBvdmVyIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KKwlpZiAoIG9wdGluZCAhPSBhcmdjICkgeworCQl1c2FnZSAoIGFyZ3YgKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIERhZW1vbmlzZQorICoKKyAqLworc3RhdGljIGludCBkYWVtb25pc2UgKCBjb25zdCBjaGFyICppbnRlcmZhY2UgKSB7CisJY2hhciBwaWRmaWxlWzE2ICsgSUZfTkFNRVNJWkUgKyA0XTsgLyogIi92YXIvcnVuL2hpamFjay08aW50Zj4ucGlkIiAqLworCWNoYXIgcGlkWzE2XTsKKwlpbnQgcGlkbGVuOworCWludCBmZCA9IC0xOworCisJLyogRGFlbW9uaXNlICovCisJaWYgKCBkYWVtb24gKCAwLCAwICkgPCAwICkgeworCQlsb2dtc2cgKCBMT0dfRVJSLCAiQ291bGQgbm90IGRhZW1vbmlzZTogJXNcbiIsCisJCQkgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCWdvdG8gZXJyOworCX0KKwlkYWVtb25pc2VkID0gMTsgLyogRGlyZWN0IG1lc3NhZ2VzIHRvIHN5c2xvZyBub3cgKi8KKworCS8qIE9wZW4gcGlkIGZpbGUgKi8KKwlzbnByaW50ZiAoIHBpZGZpbGUsIHNpemVvZiAoIHBpZGZpbGUgKSwgIi92YXIvcnVuL2hpamFjay0lcy5waWQiLAorCQkgICBpbnRlcmZhY2UgKTsKKwlmZCA9IG9wZW4gKCBwaWRmaWxlLCAoIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgKSwKKwkJICAgICggU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCApICk7CisJaWYgKCBmZCA8IDAgKSB7CisJCWxvZ21zZyAoIExPR19FUlIsICJDb3VsZCBub3Qgb3BlbiAlcyBmb3Igd3JpdGluZzogJXNcbiIsCisJCQkgcGlkZmlsZSwgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFdyaXRlIHBpZCB0byBmaWxlICovCisJcGlkbGVuID0gc25wcmludGYgKCBwaWQsIHNpemVvZiAoIHBpZCApLCAiJWRcbiIsIGdldHBpZCgpICk7CisJaWYgKCB3cml0ZSAoIGZkLCBwaWQsIHBpZGxlbiApICE9IHBpZGxlbiApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIkNvdWxkIG5vdCB3cml0ZSAlczogJXNcbiIsCisJCQkgcGlkZmlsZSwgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCWdvdG8gZXJyOworCX0KKworCWNsb3NlICggZmQgKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlpZiAoIGZkID49IDAgKQorCQljbG9zZSAoIGZkICk7CisJcmV0dXJuIC0xOworfQorCitpbnQgbWFpbiAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlzdHJ1Y3QgaGlqYWNrX29wdGlvbnMgb3B0aW9uczsKKwlzdHJ1Y3QgaGlqYWNrX2xpc3RlbmVyIGxpc3RlbmVyOworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwkvKiBQYXJzZSBjb21tYW5kLWxpbmUgb3B0aW9ucyAqLworCWlmICggcGFyc2Vfb3B0aW9ucyAoIGFyZ2MsIGFyZ3YsICZvcHRpb25zICkgPCAwICkKKwkJZXhpdCAoIDEgKTsKKworCS8qIFNldCB1cCBzeXNsb2cgY29ubmVjdGlvbiAqLworCW9wZW5sb2cgKCBiYXNlbmFtZSAoIGFyZ3ZbMF0gKSwgTE9HX1BJRCwgTE9HX0RBRU1PTiApOworCisJLyogU2V0IHVwIGxpc3RlbmluZyBzb2NrZXQgKi8KKwlpZiAoIG9wZW5fbGlzdGVuZXIgKCBvcHRpb25zLmludGVyZmFjZSwgJmxpc3RlbmVyICkgPCAwICkKKwkJZXhpdCAoIDEgKTsKKworCS8qIERhZW1vbmlzZSBvbiBkZW1hbmQgKi8KKwlpZiAoIG9wdGlvbnMuZGFlbW9uaXNlICkgeworCQlpZiAoIGRhZW1vbmlzZSAoIG9wdGlvbnMuaW50ZXJmYWNlICkgPCAwICkKKwkJCWV4aXQgKCAxICk7CisJfQorCisJLyogQXZvaWQgY3JlYXRpbmcgem9tYmllcyAqLworCW1lbXNldCAoICZzYSwgMCwgc2l6ZW9mICggc2EgKSApOworCXNhLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVCB8IFNBX05PQ0xEV0FJVDsKKwlpZiAoIHNpZ2FjdGlvbiAoIFNJR0NITEQsICZzYSwgTlVMTCApIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIkNvdWxkIG5vdCBzZXQgU0lHQ0hMRCBoYW5kbGVyOiAlcyIsCisJCQkgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCWV4aXQgKCAxICk7CisJfQorCisJLyogU2V0ICdzaWduYWxsZWQnIGZsYWcgb24gU0lHSU5UIG9yIFNJR0hVUCAqLworCXNhLnNhX2hhbmRsZXIgPSBmbGFnX3NpZ25hbGxlZDsKKwlzYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQgfCBTQV9SRVNFVEhBTkQ7CisJaWYgKCBzaWdhY3Rpb24gKCBTSUdJTlQsICZzYSwgTlVMTCApIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIkNvdWxkIG5vdCBzZXQgU0lHSU5UIGhhbmRsZXI6ICVzIiwKKwkJCSBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJZXhpdCAoIDEgKTsKKwl9CisJaWYgKCBzaWdhY3Rpb24gKCBTSUdIVVAsICZzYSwgTlVMTCApIDwgMCApIHsKKwkJbG9nbXNnICggTE9HX0VSUiwgIkNvdWxkIG5vdCBzZXQgU0lHSFVQIGhhbmRsZXI6ICVzIiwKKwkJCSBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJZXhpdCAoIDEgKTsKKwl9CisKKwkvKiBMaXN0ZW4gZm9yIGhpamFja2VycyAqLworCWlmICggbGlzdGVuX2Zvcl9oaWphY2tlcnMgKCAmbGlzdGVuZXIsIG9wdGlvbnMuaW50ZXJmYWNlICkgPCAwICkKKwkJZXhpdCAoIDEgKTsKKworCWNsb3NlX2xpc3RlbmVyICggJmxpc3RlbmVyICk7CisJCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHhlL3NyYy91dGlsL2ljY2ZpeC5jIGIvZ3B4ZS9zcmMvdXRpbC9pY2NmaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDNhZTljCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXRpbC9pY2NmaXguYwpAQCAtMCwwICsxLDE1NiBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxncHhlL3RhYmxlcy5oPgorCisjZGVmaW5lIERFQlVHIDAKKworI2RlZmluZSBlcHJpbnRmKC4uLikgZnByaW50ZiAoIHN0ZGVyciwgX19WQV9BUkdTX18gKQorCisjZGVmaW5lIGRwcmludGYoLi4uKSBkbyB7CQkJCQkJXAorCWlmICggREVCVUcgKQkJCQkJCQlcCisJCWZwcmludGYgKCBzdGRlcnIsIF9fVkFfQVJHU19fICk7CQkJXAorCX0gd2hpbGUgKCAwICkKKworI2lmZGVmIFNFTEZfSU5DTFVERUQKKworLyoqCisgKiBGaXggdXAgSUNDIGFsaWdubWVudHMKKyAqCisgKiBAdiBlbGYJCUVMRiBoZWFkZXIKKyAqIEByZXQgcmMJCVJldHVybiBzdGF0dXMgY29kZQorICoKKyAqIFNlZSBjb21tZW50cyBpbiB0YWJsZXMuaCBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9uc3Ryb3NpdHkKKyAqIGlzIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGludCBJQ0NGSVggKCB2b2lkICplbGYgKSB7CisJRUxGX0VIRFIgKmVoZHIgPSBlbGY7CisJRUxGX1NIRFIgKnNoZHIgPSAoIGVsZiArIGVoZHItPmVfc2hvZmYgKTsKKwlzaXplX3Qgc2hlbnRzaXplID0gZWhkci0+ZV9zaGVudHNpemU7CisJdW5zaWduZWQgaW50IHNobnVtID0gZWhkci0+ZV9zaG51bTsKKwlFTEZfU0hEUiAqc3RydGFiID0gKCAoICggdm9pZCAqICkgc2hkciApICsKKwkJCSAgICAgKCBlaGRyLT5lX3Noc3RybmR4ICogc2hlbnRzaXplICkgKTsKKwljaGFyICpzdHJpbmdzID0gKCBlbGYgKyBzdHJ0YWItPnNoX29mZnNldCApOworCisJZm9yICggOyBzaG51bS0tIDsgc2hkciA9ICggKCAoIHZvaWQgKiApIHNoZHIgKSArIHNoZW50c2l6ZSApICkgeworCQljaGFyICpuYW1lID0gKCBzdHJpbmdzICsgc2hkci0+c2hfbmFtZSApOworCQl1bnNpZ25lZCBsb25nIGFsaWduID0gc2hkci0+c2hfYWRkcmFsaWduOworCQl1bnNpZ25lZCBsb25nIG5ld19hbGlnbjsKKworCQlpZiAoICggc3RybmNtcCAoIG5hbWUsICIudGJsLiIsIDUgKSA9PSAwICkgJiYKKwkJICAgICAoIGFsaWduID49IElDQ19BTElHTl9IQUNLX0ZBQ1RPUiApICkgeworCQkJbmV3X2FsaWduID0gKCBhbGlnbiAvIElDQ19BTElHTl9IQUNLX0ZBQ1RPUiApOworCQkJc2hkci0+c2hfYWRkcmFsaWduID0gbmV3X2FsaWduOworCQkJZHByaW50ZiAoICJTZWN0aW9uIFwiJXNcIjogYWxpZ25tZW50ICVkLT4lZFxuIiwKKwkJCQkgIG5hbWUsIGFsaWduLCBuZXdfYWxpZ24gKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworI2Vsc2UgLyogU0VMRl9JTkNMVURFRCAqLworCisjZGVmaW5lIFNFTEZfSU5DTFVERUQKKworLyogSW5jbHVkZSBpY2NmaXgzMigpIGZ1bmN0aW9uICovCisjZGVmaW5lIEVMRl9FSERSIEVsZjMyX0VoZHIKKyNkZWZpbmUgRUxGX1NIRFIgRWxmMzJfU2hkcgorI2RlZmluZSBJQ0NGSVggaWNjZml4MzIKKyNpbmNsdWRlICJpY2NmaXguYyIKKyN1bmRlZiBFTEZfRUhEUgorI3VuZGVmIEVMRl9TSERSCisjdW5kZWYgSUNDRklYCisKKy8qIEluY2x1ZGUgaWNjZml4NjQoKSBmdW5jdGlvbiAqLworI2RlZmluZSBFTEZfRUhEUiBFbGY2NF9FaGRyCisjZGVmaW5lIEVMRl9TSERSIEVsZjY0X1NoZHIKKyNkZWZpbmUgSUNDRklYIGljY2ZpeDY0CisjaW5jbHVkZSAiaWNjZml4LmMiCisjdW5kZWYgRUxGX0VIRFIKKyN1bmRlZiBFTEZfU0hEUgorI3VuZGVmIElDQ0ZJWAorCitzdGF0aWMgaW50IGljY2ZpeCAoIGNvbnN0IGNoYXIgKmZpbGVuYW1lICkgeworCWludCBmZDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCXZvaWQgKmVsZjsKKwl1bnNpZ25lZCBjaGFyICplaWRlbnQ7CisJaW50IHJjOworCisJLyogT3BlbiBhbmQgbW1hcCBmaWxlICovCisJZmQgPSBvcGVuICggZmlsZW5hbWUsIE9fUkRXUiApOworCWlmICggZmQgPCAwICkgeworCQllcHJpbnRmICggIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKwkJCSAgZmlsZW5hbWUsIHN0cmVycm9yICggZXJybm8gKSApOworCQlyYyA9IC0xOworCQlnb3RvIGVycl9vcGVuOworCX0KKwlpZiAoIGZzdGF0ICggZmQsICZzdGF0ICkgPCAwICkgeworCQllcHJpbnRmICggIkNvdWxkIG5vdCBkZXRlcm1pbmUgc2l6ZSBvZiAlczogJXNcbiIsCisJCQkgIGZpbGVuYW1lLCBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJcmMgPSAtMTsKKwkJZ290byBlcnJfZnN0YXQ7CisJfQorCWVsZiA9IG1tYXAgKCBOVUxMLCBzdGF0LnN0X3NpemUsICggUFJPVF9SRUFEIHwgUFJPVF9XUklURSApLAorCQkgICAgIE1BUF9TSEFSRUQsIGZkLCAwICk7CisJaWYgKCBlbGYgPT0gTUFQX0ZBSUxFRCApIHsKKwkJZXByaW50ZiAoICJDb3VsZCBub3QgbWFwICVzOiAlc1xuIiwKKwkJCSAgZmlsZW5hbWUsIHN0cmVycm9yICggZXJybm8gKSApOworCQlyYyA9IC0xOworCQlnb3RvIGVycl9tbWFwOworCX0KKworCS8qIFBlcmZvcm0gZml4dXBzICovCisJZWlkZW50ID0gZWxmOworCXN3aXRjaCAoIGVpZGVudFtFSV9DTEFTU10gKSB7CisJY2FzZSBFTEZDTEFTUzMyOgorCQlyYyA9IGljY2ZpeDMyICggZWxmICk7CisJCWJyZWFrOworCWNhc2UgRUxGQ0xBU1M2NDoKKwkJcmMgPSBpY2NmaXg2NCAoIGVsZiApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcHJpbnRmICggIlVua25vd24gRUxGIGNsYXNzICVkIGluICVzXG4iLAorCQkJICBlaWRlbnRbRUlfQ0xBU1NdLCBmaWxlbmFtZSApOworCQlyYyA9IC0xOworCQlicmVhazsKKwl9CisKKwltdW5tYXAgKCBlbGYsIHN0YXQuc3Rfc2l6ZSApOworIGVycl9tbWFwOgorIGVycl9mc3RhdDoKKwljbG9zZSAoIGZkICk7CisgZXJyX29wZW46CisJcmV0dXJuIHJjOworfQorCitpbnQgbWFpbiAoIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKwlpbnQgaTsKKwlpbnQgcmM7CisKKwkvKiBQYXJzZSBjb21tYW5kIGxpbmUgKi8KKwlpZiAoIGFyZ2MgPCAyICkgeworCQllcHJpbnRmICggIlN5bnRheDogJXMgPG9iamVjdF9maWxlPi4uLlxuIiwgYXJndlswXSApOworCQlleGl0ICggMSApOworCX0KKworCS8qIFByb2Nlc3MgZWFjaCBvYmplY3QgaW4gdHVybiAqLworCWZvciAoIGkgPSAxIDsgaSA8IGFyZ2MgOyBpKysgKSB7CisJCWlmICggKCByYyA9IGljY2ZpeCAoIGFyZ3ZbaV0gKSApICE9IDAgKSB7CisJCQllcHJpbnRmICggIkNvdWxkIG5vdCBmaXggdXAgJXNcbiIsIGFyZ3ZbaV0gKTsKKwkJCWV4aXQgKCAxICk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFNFTEZfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvbGljZW5jZS5wbCBiL2dweGUvc3JjL3V0aWwvbGljZW5jZS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMzc2ODVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXRpbC9saWNlbmNlLnBsCkBAIC0wLDAgKzEsMTQ5IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyMgTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEdldG9wdDo6TG9uZzsKKworIyBMaXN0IG9mIGxpY2VuY2VzIHdlIGNhbiBoYW5kbGUKK215ICRrbm93bl9saWNlbmNlcyA9IHsKKyAgZ3BsX2FueSA9PiB7CisgICAgZGVzYyA9PiAiR1BMIChhbnkgdmVyc2lvbikiLAorICAgIGNhbl9zdWJzdW1lID0+IHsKKyAgICAgIHB1YmxpY19kb21haW4gPT4gMSwKKyAgICAgIGJzZDMgPT4gMSwKKyAgICAgIGJzZDIgPT4gMSwKKyAgICAgIG1pdCAgPT4gMSwKKyAgICAgIGlzYyAgPT4gMSwKKyAgICB9LAorICB9LAorICBncGwyX29yX2xhdGVyID0+IHsKKyAgICBkZXNjID0+ICJHUEwgdmVyc2lvbiAyIChvciwgYXQgeW91ciBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uKSIsCisgICAgY2FuX3N1YnN1bWUgPT4geworICAgICAgZ3BsX2FueSA9PiAxLAorICAgICAgcHVibGljX2RvbWFpbiA9PiAxLAorICAgICAgYnNkMyA9PiAxLAorICAgICAgYnNkMiA9PiAxLAorICAgICAgbWl0ICA9PiAxLAorICAgICAgaXNjICA9PiAxLAorICAgIH0sCisgIH0sCisgIGdwbDJfb25seSA9PiB7CisgICAgZGVzYyA9PiAiR1BMIHZlcnNpb24gMiBvbmx5IiwKKyAgICBjYW5fc3Vic3VtZSA9PiB7CisgICAgICBncGxfYW55ID0+IDEsCisgICAgICBncGwyX29yX2xhdGVyID0+IDEsCisgICAgICBwdWJsaWNfZG9tYWluID0+IDEsCisgICAgICBic2QzID0+IDEsCisgICAgICBic2QyID0+IDEsCisgICAgICBtaXQgID0+IDEsCisgICAgICBpc2MgID0+IDEsCisgICAgfSwKKyAgfSwKKyAgcHVibGljX2RvbWFpbiA9PiB7CisgICAgZGVzYyA9PiAiUHVibGljIERvbWFpbiIsCisgICAgY2FuX3N1YnN1bWUgPT4ge30sCisgIH0sCisgIGJzZDQgPT4geworICAgIGRlc2MgPT4gIkJTRCBMaWNlbmNlICh3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSkiLAorICAgIGNhbl9zdWJzdW1lID0+IHsKKyAgICAgIHB1YmxpY19kb21haW4gPT4gMSwKKyAgICAgIGJzZDMgPT4gMSwKKyAgICAgIGJzZDIgPT4gMSwKKyAgICAgIG1pdCAgPT4gMSwKKyAgICAgIGlzYyAgPT4gMSwKKyAgICB9LAorICB9LAorICBic2QzID0+IHsKKyAgICBkZXNjID0+ICJCU0QgTGljZW5jZSAod2l0aG91dCBhZHZlcnRpc2luZyBjbGF1c2UpIiwKKyAgICBjYW5fc3Vic3VtZSA9PiB7CisgICAgICBwdWJsaWNfZG9tYWluID0+IDEsCisgICAgICBic2QyID0+IDEsCisgICAgICBtaXQgID0+IDEsCisgICAgICBpc2MgID0+IDEsCisgICAgfSwKKyAgfSwKKyAgYnNkMiA9PiB7CisgICAgZGVzYyA9PiAiQlNEIExpY2VuY2UgKHdpdGhvdXQgYWR2ZXJ0aXNpbmcgb3IgZW5kb3JzZW1lbnQgY2xhdXNlcykiLAorICAgIGNhbl9zdWJzdW1lID0+IHsKKyAgICAgIHB1YmxpY19kb21haW4gPT4gMSwKKyAgICAgIG1pdCAgPT4gMSwKKyAgICAgIGlzYyAgPT4gMSwKKyAgICB9LAorICB9LAorICBtaXQgPT4geworICAgIGRlc2MgPT4gIk1JVC9YMTEvWG9yZyBMaWNlbmNlIiwKKyAgICBjYW5fc3Vic3VtZSA9PiB7CisgICAgICBwdWJsaWNfZG9tYWluID0+IDEsCisgICAgICBpc2MgPT4gMSwKKyAgICB9LAorICB9LAorICBpc2MgPT4geworICAgIGRlc2MgPT4gIklTQyBMaWNlbmNlIiwKKyAgICBjYW5fc3Vic3VtZSA9PiB7CisgICAgICBwdWJsaWNfZG9tYWluID0+IDEsCisgICAgfSwKKyAgfSwKK307CisKKyMgUGFyc2UgY29tbWFuZC1saW5lIG9wdGlvbnMKK215ICR2ZXJib3NpdHkgPSAxOworR2V0b3B0OjpMb25nOjpDb25maWd1cmUgKCAnYnVuZGxpbmcnLCAnYXV0b19hYmJyZXYnICk7CitHZXRPcHRpb25zICgKKyAgJ3ZlcmJvc2V8disnID0+IHN1YiB7ICR2ZXJib3NpdHkrKzsgfSwKKyAgJ3F1aWV0fHErJyA9PiBzdWIgeyAkdmVyYm9zaXR5LS07IH0sCispIG9yIGRpZSAiQ291bGQgbm90IHBhcnNlIGNvbW1hbmQtbGluZSBvcHRpb25zXG4iOworCisjIFBhcnNlIGxpY2VuY2UgbGlzdCBmcm9tIGNvbW1hbmQgbGluZQorbXkgJGxpY2VuY2VzID0ge307Citmb3JlYWNoIG15ICRsaWNlbmNlICggQEFSR1YgKSB7CisgIGRpZSAiVW5rbm93biBsaWNlbmNlIFwiJGxpY2VuY2VcIlxuIgorICAgICAgdW5sZXNzIGV4aXN0cyAka25vd25fbGljZW5jZXMtPnskbGljZW5jZX07CisgICRsaWNlbmNlcy0+eyRsaWNlbmNlfSA9ICRrbm93bl9saWNlbmNlcy0+eyRsaWNlbmNlfTsKK30KK2RpZSAiTm8gbGljZW5jZXMgc3BlY2lmaWVkXG4iIHVubGVzcyAlJGxpY2VuY2VzOworCisjIER1bXAgbGljZW5jZSBsaXN0CitpZiAoICR2ZXJib3NpdHkgPj0gMSApIHsKKyAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgbGljZW5jZXMgYXBwZWFyIHdpdGhpbiB0aGlzIGZpbGU6XG4iOworICBmb3JlYWNoIG15ICRsaWNlbmNlICgga2V5cyAlJGxpY2VuY2VzICkgeworICAgIHByaW50ICIgICIuJGxpY2VuY2VzLT57JGxpY2VuY2V9LT57ZGVzY30uIlxuIgorICB9Cit9CisKKyMgQXBwbHkgbGljZW5jZSBjb21wYXRpYmlsaXRpZXMgdG8gcmVkdWNlIHRvIGEgc2luZ2xlIHJlc3VsdGluZyBsaWNlbmNlCitmb3JlYWNoIG15ICRsaWNlbmNlICgga2V5cyAlJGxpY2VuY2VzICkgeworICAjIFNraXAgYWxyZWFkeS1kZWxldGVkIGxpY2VuY2VzCisgIG5leHQgdW5sZXNzIGV4aXN0cyAkbGljZW5jZXMtPnskbGljZW5jZX07CisgICMgU3Vic3VtZSBhbnkgc3Vic3VtYWJsZSBsaWNlbmNlcworICBmb3JlYWNoIG15ICRjYW5fc3Vic3VtZSAoIGtleXMgJXskbGljZW5jZXMtPnskbGljZW5jZX0tPntjYW5fc3Vic3VtZX19ICkgeworICAgIGlmICggZXhpc3RzICRsaWNlbmNlcy0+eyRjYW5fc3Vic3VtZX0gKSB7CisgICAgICBwcmludCAkbGljZW5jZXMtPnskbGljZW5jZX0tPntkZXNjfS4iIHN1YnN1bWVzICIuCisJICAkbGljZW5jZXMtPnskY2FuX3N1YnN1bWV9LT57ZGVzY30uIlxuIgorCSAgaWYgJHZlcmJvc2l0eSA+PSAxOworICAgICAgZGVsZXRlICRsaWNlbmNlcy0+eyRjYW5fc3Vic3VtZX07CisgICAgfQorICB9Cit9CisKKyMgUHJpbnQgcmVzdWx0aW5nIGxpY2VuY2UKK2RpZSAiQ2Fubm90IHJlZHVjZSB0byBhIHNpbmdsZSByZXN1bHRpbmcgbGljZW5jZSFcbiIKKyAgICBpZiAoIGtleXMgJSRsaWNlbmNlcyApICE9IDE7CisoIG15ICRsaWNlbmNlICkgPSBrZXlzICUkbGljZW5jZXM7CitwcmludCAiVGhlIG92ZXJhbGwgbGljZW5jZSBmb3IgdGhpcyBmaWxlIGlzOlxuICAiIGlmICR2ZXJib3NpdHkgPj0gMTsKK3ByaW50ICRsaWNlbmNlcy0+eyRsaWNlbmNlfS0+e2Rlc2N9LiJcbiI7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy91dGlsL21ha2Vyb20ucGwgYi9ncHhlL3NyYy91dGlsL21ha2Vyb20ucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjhjM2JlOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL3V0aWwvbWFrZXJvbS5wbApAQCAtMCwwICsxLDIzMiBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKK3VzZSBHZXRvcHQ6OlN0ZDsKKwordXNlIGNvbnN0YW50IE1JTlJPTVNJWkUgPT4gODE5MjsKK3VzZSBjb25zdGFudCBNQVhST01TSVpFID0+IDI2MjE0NDsKKwordXNlIGNvbnN0YW50IFBDSV9QVFJfTE9DID0+IDB4MTg7CSMgZnJvbSBiZWdpbm5pbmcgb2YgUk9NCit1c2UgY29uc3RhbnQgUENJX0hEUl9TSVpFID0+IDB4MTg7Cit1c2UgY29uc3RhbnQgUE5QX1BUUl9MT0MgPT4gMHgxYTsJIyBmcm9tIGJlZ2lubmluZyBvZiBST00KK3VzZSBjb25zdGFudCBQTlBfSERSX1NJWkUgPT4gMHgyMDsKK3VzZSBjb25zdGFudCBQTlBfQ0hLU1VNX09GRiA9PiAweDk7CSMgYnl0ZXMgZnJvbSBiZWdpbm5pbmcgb2YgUG5QIGhlYWRlcgordXNlIGNvbnN0YW50IFBOUF9ERVZJQ0VfT0ZGID0+IDB4MTA7CSMgYnl0ZXMgZnJvbSBiZWdpbm5pbmcgb2YgUG5QIGhlYWRlcgordXNlIGNvbnN0YW50IFBDSV9WRU5EX0lEX09GRiA9PiAweDQ7CSMgYnl0ZXMgZnJvbSBiZWdpbm5pbmcgb2YgUENJIGhlYWRlcgordXNlIGNvbnN0YW50IFBDSV9ERVZfSURfT0ZGID0+IDB4NjsJIyBieXRlcyBmcm9tIGJlZ2lubmluZyBvZiBQQ0kgaGVhZGVyCit1c2UgY29uc3RhbnQgUENJX1NJWkVfT0ZGID0+IDB4MTA7CSMgYnl0ZXMgZnJvbSBiZWdpbm5pbmcgb2YgUENJIGhlYWRlcgorCit1c2UgY29uc3RhbnQgVU5ESV9QVFJfTE9DID0+IDB4MTY7CSMgZnJvbSBiZWdpbm5pbmcgb2YgUk9NCit1c2UgY29uc3RhbnQgVU5ESV9IRFJfU0laRSA9PiAweDE2OwordXNlIGNvbnN0YW50IFVORElfQ0hLU1VNX09GRiA9PiAweDA1OworCit1c2Ugc3RyaWN0OworCit1c2UgdmFycyBxdyglb3B0cyk7CisKK3VzZSBieXRlczsKKworc3ViIGdldHJvbXNpemUgKCQpIHsKKwlteSAoJHJvbXJlZikgPSBAXzsKKwlteSAkaTsKKworCXByaW50IFNUREVSUiAiQklPUyBleHRlbnNpb24gUk9NIEltYWdlIGRpZCBub3Qgc3RhcnQgd2l0aCAweDU1IDB4QUFcbiIKKwkJaWYgKHN1YnN0cigkJHJvbXJlZiwgMCwgMikgbmUgIlx4NTVceGFhIik7CisJbXkgJHNpemUgPSBvcmQoc3Vic3RyKCQkcm9tcmVmLCAyLCAxKSkgKiA1MTI7CisJZm9yICgkaSA9IE1JTlJPTVNJWkU7ICRpIDwgTUFYUk9NU0laRSBhbmQgJGkgPCAkc2l6ZTsgJGkgKj0gMikgeyB9CisJcHJpbnQgU1RERVJSICIkc2l6ZSBpcyBhIHN0cmFuZ2Ugc2l6ZSBmb3IgYSBib290IFJPTVxuIgorCQlpZiAoJHNpemUgPiAwIGFuZCAkaSA+ICRzaXplKTsKKwlyZXR1cm4gKCRzaXplKTsKK30KKworc3ViIGFkZGlkZW50ICgkKSB7CisJbXkgKCRyb21yZWYpID0gQF87CisKKwlyZXR1cm4gKDApIHVubGVzcyAobXkgJHMgPSAkb3B0c3snaSd9KTsKKwkjIGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIE5VTCBieXRlIHRvbworCSRzIC49ICJceDAwIjsKKwlteSAkbGVuID0gbGVuZ3RoKCRzKTsKKwkjIFB1dCB0aGUgaWRlbnRpZmllciBpbiBvbmx5IGlmIHRoZSBzcGFjZSBpcyBibGFuaworCW15ICRwb3MgPSBsZW5ndGgoJCRyb21yZWYpIC0gJGxlbiAtIDI7CisJcmV0dXJuICgwKSBpZiAoc3Vic3RyKCQkcm9tcmVmLCAkcG9zLCAkbGVuKSBuZSAoIlx4RkYiIHggJGxlbikpOworCXN1YnN0cigkJHJvbXJlZiwgJHBvcywgJGxlbikgPSAkczsKKwlyZXR1cm4gKCRwb3MpOworfQorCitzdWIgcGNpcG5waGVhZGVycyAoJCQpIHsKKwlteSAoJHJvbXJlZiwgJGlkZW50b2Zmc2V0KSA9IEBfOworCW15ICgkcGNpX2hkcl9vZmZzZXQsICRwbnBfaGRyX29mZnNldCk7CisKKwkkcGNpX2hkcl9vZmZzZXQgPSB1bnBhY2soJ3YnLCBzdWJzdHIoJCRyb21yZWYsIFBDSV9QVFJfTE9DLCAyKSk7CisJJHBucF9oZHJfb2Zmc2V0ID0gdW5wYWNrKCd2Jywgc3Vic3RyKCQkcm9tcmVmLCBQTlBfUFRSX0xPQywgMikpOworCSMgU2FuaXR5IGNoZWNrcworCWlmICgkcGNpX2hkcl9vZmZzZXQgPCBQQ0lfUFRSX0xPQyArIDIKKwkJb3IgJHBjaV9oZHJfb2Zmc2V0ID4gbGVuZ3RoKCQkcm9tcmVmKSAtIFBDSV9IRFJfU0laRQorCQlvciAkcG5wX2hkcl9vZmZzZXQgPCBQTlBfUFRSX0xPQyArIDIKKwkJb3IgJHBucF9oZHJfb2Zmc2V0ID4gbGVuZ3RoKCQkcm9tcmVmKSAtIFBOUF9IRFJfU0laRQorCQlvciBzdWJzdHIoJCRyb21yZWYsICRwY2lfaGRyX29mZnNldCwgNCkgbmUgJ1BDSVInCisJCW9yIHN1YnN0cigkJHJvbXJlZiwgJHBucF9oZHJfb2Zmc2V0LCA0KSBuZSAnJFBuUCcpIHsKKwkJJHBjaV9oZHJfb2Zmc2V0ID0gJHBucF9oZHJfb2Zmc2V0ID0gMDsKKwl9IGVsc2UgeworCQlwcmludGYgIlBDSSBoZWFkZXIgYXQgJSN4IGFuZCBQblAgaGVhZGVyIGF0ICUjeFxuIiwKKwkJCSRwY2lfaGRyX29mZnNldCwgJHBucF9oZHJfb2Zmc2V0IGlmICRvcHRzeyd2J307CisJfQorCWlmICgkcGNpX2hkcl9vZmZzZXQgPiAwKSB7CisJCW15ICgkcGNpX3ZlbmRvcl9pZCwgJHBjaV9kZXZpY2VfaWQpOworCQkjIGlmIG5vIC1wIG9wdGlvbiwganVzdCByZXBvcnQgd2hhdCdzIHRoZXJlCisJCWlmICghZGVmaW5lZCgkb3B0c3sncCd9KSkgeworCQkJJHBjaV92ZW5kb3JfaWQgPSB1bnBhY2soJ3YnLCBzdWJzdHIoJCRyb21yZWYsICRwY2lfaGRyX29mZnNldCtQQ0lfVkVORF9JRF9PRkYsIDIpKTsKKwkJCSRwY2lfZGV2aWNlX2lkID0gdW5wYWNrKCd2Jywgc3Vic3RyKCQkcm9tcmVmLCAkcGNpX2hkcl9vZmZzZXQrUENJX0RFVl9JRF9PRkYsIDIpKTsKKwkJCXByaW50ZiAiUENJIFZlbmRvciBJRCAlI3ggRGV2aWNlIElEICUjeFxuIiwKKwkJCQkkcGNpX3ZlbmRvcl9pZCwgJHBjaV9kZXZpY2VfaWQ7CisJCX0gZWxzZSB7CisJCQlzdWJzdHIoJCRyb21yZWYsICRwY2lfaGRyX29mZnNldCArIFBDSV9TSVpFX09GRiwgMikKKwkJCQk9IHBhY2soJ3YnLCBsZW5ndGgoJCRyb21yZWYpIC8gNTEyKTsKKwkJCSgkcGNpX3ZlbmRvcl9pZCwgJHBjaV9kZXZpY2VfaWQpID0gc3BsaXQoLywvLCAkb3B0c3sncCd9KTsKKwkJCXN1YnN0cigkJHJvbXJlZiwgJHBjaV9oZHJfb2Zmc2V0K1BDSV9WRU5EX0lEX09GRiwgMikKKwkJCQk9IHBhY2soJ3YnLCBvY3QoJHBjaV92ZW5kb3JfaWQpKSBpZiAoJHBjaV92ZW5kb3JfaWQpOworCQkJc3Vic3RyKCQkcm9tcmVmLCAkcGNpX2hkcl9vZmZzZXQrUENJX0RFVl9JRF9PRkYsIDIpCisJCQkJPSBwYWNrKCd2Jywgb2N0KCRwY2lfZGV2aWNlX2lkKSkgaWYgKCRwY2lfZGV2aWNlX2lkKTsKKwkJfQorCX0KKwlpZiAoJHBucF9oZHJfb2Zmc2V0ID4gMCkgeworCQlpZiAoZGVmaW5lZCgkaWRlbnRvZmZzZXQpKSB7CisJCQkjIFBvaW50IHRvIGRldmljZSBpZCBzdHJpbmcgYXQgZW5kIG9mIFJPTSBpbWFnZQorCQkJc3Vic3RyKCQkcm9tcmVmLCAkcG5wX2hkcl9vZmZzZXQrUE5QX0RFVklDRV9PRkYsIDIpCisJCQkJPSBwYWNrKCd2JywgJGlkZW50b2Zmc2V0KTsKKwkJfQorCQlzdWJzdHIoJCRyb21yZWYsICRwbnBfaGRyX29mZnNldCtQTlBfQ0hLU1VNX09GRiwgMSkgPSAiXHgwMCI7CisJCW15ICRzdW0gPSB1bnBhY2soJyU4QyonLCBzdWJzdHIoJCRyb21yZWYsICRwbnBfaGRyX29mZnNldCwKKwkJCVBOUF9IRFJfU0laRSkpOworCQlzdWJzdHIoJCRyb21yZWYsICRwbnBfaGRyX29mZnNldCtQTlBfQ0hLU1VNX09GRiwgMSkgPSBjaHIoMjU2IC0gJHN1bSk7CisJfQorfQorCitzdWIgdW5kaWhlYWRlcnMgKCQpIHsKKwlteSAoJHJvbXJlZikgPSBAXzsKKwlteSAoJHVuZGlfaGRyX29mZnNldCk7CisKKwkkdW5kaV9oZHJfb2Zmc2V0ID0gdW5wYWNrKCd2Jywgc3Vic3RyKCQkcm9tcmVmLCBVTkRJX1BUUl9MT0MsIDIpKTsKKwkjIFNhbml0eSBjaGVja3MKKwlpZiAoJHVuZGlfaGRyX29mZnNldCA8IFVORElfUFRSX0xPQyArIDIKKwkJb3IgJHVuZGlfaGRyX29mZnNldCA+IGxlbmd0aCgkJHJvbXJlZikgLSBVTkRJX0hEUl9TSVpFCisJCW9yIHN1YnN0cigkJHJvbXJlZiwgJHVuZGlfaGRyX29mZnNldCwgNCkgbmUgJ1VOREknKSB7CisJCSR1bmRpX2hkcl9vZmZzZXQgPSAwOworCX0gZWxzZSB7CisJCXByaW50ZiAiVU5ESSBoZWFkZXIgYXQgJSN4XG4iLCAkdW5kaV9oZHJfb2Zmc2V0IGlmICRvcHRzeyd2J307CisJfQorCWlmICgkdW5kaV9oZHJfb2Zmc2V0ID4gMCkgeworCQlzdWJzdHIoJCRyb21yZWYsICR1bmRpX2hkcl9vZmZzZXQrVU5ESV9DSEtTVU1fT0ZGLCAxKSA9ICJceDAwIjsKKwkJbXkgJHN1bSA9IHVucGFjaygnJThDKicsIHN1YnN0cigkJHJvbXJlZiwgJHVuZGlfaGRyX29mZnNldCwKKwkJCVVORElfSERSX1NJWkUpKTsKKwkJc3Vic3RyKCQkcm9tcmVmLCAkdW5kaV9oZHJfb2Zmc2V0K1VORElfQ0hLU1VNX09GRiwgMSkgPSBjaHIoMjU2IC0gJHN1bSk7CisJfQorfQorCitzdWIgd3JpdGVyb20gKCQkKSB7CisJbXkgKCRmaWxlbmFtZSwgJHJvbXJlZikgPSBAXzsKKworCW9wZW4oUiwgIj4kZmlsZW5hbWUiKSBvciBkaWUgIiRmaWxlbmFtZTogJCFcbiI7CisJcHJpbnQgUiAkJHJvbXJlZjsKKwljbG9zZShSKTsKK30KKworc3ViIGNoZWNrc3VtICgkJCkgeworCW15ICgkcm9tcmVmLCAkcm9tc2l6ZSkgPSBAXzsKKworCXN1YnN0cigkJHJvbXJlZiwgNiwgMSkgPSAiXHgwMCI7CisJbXkgJHN1bSA9IHVucGFjaygnJThDKicsIHN1YnN0cigkJHJvbXJlZiwgMCwgJHJvbXNpemUpKTsKKwlzdWJzdHIoJCRyb21yZWYsIDYsIDEpID0gY2hyKDI1NiAtICRzdW0pOworCSMgRG91YmxlIGNoZWNrCisJJHN1bSA9IHVucGFjaygnJThDKicsIHN1YnN0cigkJHJvbXJlZiwgMCwgJHJvbXNpemUpKTsKKwlpZiAoJHN1bSAhPSAwKSB7CisJCXByaW50ICJDaGVja3N1bSBmYWlsc1xuIgorCX0gZWxzaWYgKCRvcHRzeyd2J30pIHsKKwkJcHJpbnQgIkNoZWNrc3VtIG9rXG4iOworCX0KK30KKworc3ViIG1ha2Vyb20gKCkgeworCW15ICgkcm9tLCAkcm9tc2l6ZSwgJHN0dWJzaXplKTsKKworCWdldG9wdHMoJzN4bmk6cDpzOnYnLCBcJW9wdHMpOworCSRBUkdWWzBdIG9yIGRpZSAiVXNhZ2U6ICQwIFstcyByb21zaXplXSBbLWkgaWRlbnRdIFstcCB2ZW5kb3JpZCxkZXZpY2VpZF0gWy1uXSBbLXhdIFstM10gcm9tLWZpbGVcbiI7CisJb3BlbihSLCAkQVJHVlswXSkgb3IgZGllICIkQVJHVlswXTogJCFcbiI7CisJIyBSZWFkIGluIHRoZSB3aG9sZSBST00gaW4gb25lIGd1bHAKKwlteSAkZmlsZXNpemUgPSByZWFkKFIsICRyb20sIE1BWFJPTVNJWkUrMSk7CisJY2xvc2UoUik7CisJZGVmaW5lZCgkZmlsZXNpemUpIGFuZCAkZmlsZXNpemUgPj0gMyBvciBkaWUgIkNhbm5vdCBnZXQgZmlyc3QgMyBieXRlcyBvZiBmaWxlXG4iOworCXByaW50ICIkZmlsZXNpemUgYnl0ZXMgcmVhZFxuIiBpZiAkb3B0c3sndid9OworCSMgSWYgUFhFIGltYWdlLCBqdXN0IGZpbGwgdGhlIGxlbmd0aCBmaWVsZCBhbmQgd3JpdGUgaXQgb3V0CisJaWYgKCRvcHRzeyd4J30pIHsKKwkJc3Vic3RyKCRyb20sIDIsIDEpID0gY2hyKChsZW5ndGgoJHJvbSkgKyA1MTEpIC8gNTEyKTsKKwkJd3JpdGVyb20oJEFSR1ZbMF0sIFwkcm9tKTsKKwkJcmV0dXJuOworCX0KKwkjIFNpemUgc3BlY2lmaWVkIHdpdGggLXMgb3ZlcnJpZGVzIHZhbHVlIGluIDNyZCBieXRlIGluIGltYWdlCisJIyAtcyAwIG1lYW5zIHJvdW5kIHVwIHRvIG5leHQgNTEyIGJ5dGUgYmxvY2sKKwlpZiAoZGVmaW5lZCgkb3B0c3sncyd9KSkgeworCQlpZiAoKCRyb21zaXplID0gb2N0KCRvcHRzeydzJ30pKSA8PSAwKSB7CisJCQkjIE5COiBUaGlzIHJvdW5kdXAgdHJpY2sgb25seSB3b3JrcyBvbiBwb3dlcnMgb2YgMgorCQkJJHJvbXNpemUgPSAoJGZpbGVzaXplICsgNTExKSAmIH41MTEKKwkJfQorCX0gZWxzZSB7CisJCSMgU2hyaW5rIHJvbXNpemUgZG93biB0byB0aGUgc21hbGxlc3QgcG93ZXIgb2YgdHdvIHRoYXQgd2lsbCBkbworCQlmb3IgKCRyb21zaXplID0gTUFYUk9NU0laRTsKKwkJICAgICAkcm9tc2l6ZSA+IE1JTlJPTVNJWkUgYW5kICRyb21zaXplID49IDIqJGZpbGVzaXplOworCQkgICAgICRyb21zaXplIC89IDIpIHsgfQorCX0KKwlpZiAoJGZpbGVzaXplID4gJHJvbXNpemUpIHsKKwkJcHJpbnQgU1RERVJSICJST00gc2l6ZSBvZiAkcm9tc2l6ZSBub3QgYmlnIGVub3VnaCBmb3IgZGF0YSwgIjsKKwkJIyBOQjogVGhpcyByb3VuZHVwIHRyaWNrIG9ubHkgd29ya3Mgb24gcG93ZXJzIG9mIDIKKwkJJHJvbXNpemUgPSAoJGZpbGVzaXplICsgNTExKSAmIH41MTE7CisJCXByaW50ICJ3aWxsIHVzZSAkcm9tc2l6ZSBpbnN0ZWFkXG4iCisJfQorCSMgUGFkIHdpdGggMHhGRiB0byAkcm9tc2l6ZQorCSRyb20gLj0gIlx4RkYiIHggKCRyb21zaXplIC0gbGVuZ3RoKCRyb20pKTsKKwkjIElmIHRoaXMgaXMgYSBzdHViIFJPTSwgZG9uJ3QgZm9yY2UgaGVhZGVyIHNpemUgdG8gdGhlIGZ1bGwgYW1vdW50CisJaWYgKCEkb3B0c3snbid9KSB7CisJCWlmICgkcm9tc2l6ZSA+PSAxMjggKiAxMDI0KSB7CisJCQlwcmludCAiV2FybmluZzogUk9NIHNpemUgZXhjZWVkcyBleHRlbnNpb24gQklPUyBsaW1pdFxuIjsKKwkJfQorCQlzdWJzdHIoJHJvbSwgMiwgMSkgPSBjaHIoKCRyb21zaXplIC8gNTEyKSAlIDI1Nik7CisJfSBlbHNlIHsKKwkJJHN0dWJzaXplID0gb3JkKHN1YnN0cigkcm9tLCAyLCAxKSkgKiA1MTI7CisJCXByaW50ICJTdHViIHNpemUgaXMgJHN0dWJzaXplXG4iIGlmICRvcHRzeyd2J307CisJfQorCXByaW50ICJST00gc2l6ZSBpcyAkcm9tc2l6ZVxuIiBpZiAkb3B0c3sndid9OworCSMgc2V0IHRoZSBwcm9kdWN0IHN0cmluZyBvbmx5IGlmIHdlIGRvbid0IGhhdmUgb25lIHlldAorCW15ICRwbnBfaGRyX29mZnNldCA9IHVucGFjaygndicsIHN1YnN0cigkcm9tLCBQTlBfUFRSX0xPQywgMikpOworCW15ICRpZGVudG9mZnNldCA9IHN1YnN0cigkcm9tLCAkcG5wX2hkcl9vZmZzZXQrUE5QX0RFVklDRV9PRkYsIDIpIGVxICJcMFwwIiA/IGFkZGlkZW50KFwkcm9tKSA6IHVuZGVmOworCXBjaXBucGhlYWRlcnMoXCRyb20sICRpZGVudG9mZnNldCk7CisJdW5kaWhlYWRlcnMoXCRyb20pOworCSMgM2M1MDMgcmVxdWlyZXMgbGFzdCB0d28gYnl0ZXMgdG8gYmUgMHg4MAorCXN1YnN0cigkcm9tLCBNSU5ST01TSVpFLTIsIDIpID0gIlx4ODBceDgwIgorCQlpZiAoJG9wdHN7JzMnfSBhbmQgJHJvbXNpemUgPT0gTUlOUk9NU0laRSk7CisJY2hlY2tzdW0oXCRyb20sICRvcHRzeyduJ30gPyAkc3R1YnNpemUgOiAkcm9tc2l6ZSk7CisJd3JpdGVyb20oJEFSR1ZbMF0sIFwkcm9tKTsKK30KKworc3ViIG1vZHJvbSAoKSB7CisJbXkgKCRyb20pOworCisJZ2V0b3B0cygncDp2JywgXCVvcHRzKTsKKwkkQVJHVlswXSBvciBkaWUgIlVzYWdlOiAkMCBbLXAgdmVuZG9yaWQsZGV2aWNlaWRdIHJvbS1maWxlXG4iOworCW9wZW4oUiwgJEFSR1ZbMF0pIG9yIGRpZSAiJEFSR1ZbMF06ICQhXG4iOworCSMgUmVhZCBpbiB0aGUgd2hvbGUgUk9NIGluIG9uZSBndWxwCisJbXkgJGZpbGVzaXplID0gcmVhZChSLCAkcm9tLCBNQVhST01TSVpFKzEpOworCWNsb3NlKFIpOworCWRlZmluZWQoJGZpbGVzaXplKSBhbmQgJGZpbGVzaXplID49IDMgb3IgZGllICJDYW5ub3QgZ2V0IGZpcnN0IDMgYnl0ZXMgb2YgZmlsZVxuIjsKKwlwcmludCAiJGZpbGVzaXplIGJ5dGVzIHJlYWRcbiIgaWYgJG9wdHN7J3YnfTsKKwlwY2lwbnBoZWFkZXJzKFwkcm9tLCB1bmRlZik7CisJdW5kaWhlYWRlcnMoXCRyb20pOworCWNoZWNrc3VtKFwkcm9tLCBvcmQoc3Vic3RyKCRyb20sIDIsIDEpKSAqIDUxMik7CisJd3JpdGVyb20oJEFSR1ZbMF0sIFwkcm9tKTsKK30KKworIyBNYWluIHJvdXRpbmUuIFNlZSBob3cgd2Ugd2VyZSBjYWxsZWQgYW5kIGJlaGF2ZSBhY2NvcmRpbmdseQoraWYgKCQwID1+IG06bW9kcm9tKFwucGwpPyQ6KSB7CisJbW9kcm9tKCk7Cit9IGVsc2UgeworCW1ha2Vyb20oKTsKK30KK2V4aXQoMCk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy91dGlsL21lcmdlcm9tLnBsIGIvZ3B4ZS9zcmMvdXRpbC9tZXJnZXJvbS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOWM1MjUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3B4ZS9zcmMvdXRpbC9tZXJnZXJvbS5wbApAQCAtMCwwICsxLDk4IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyMgTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4iOwordXNlIE9wdGlvbjo6Uk9NIHF3ICggOmFsbCApOworCitzdWIgbWVyZ2VfZW50cnlfcG9pbnRzIHsKKyAgbXkgJGJhc2Vyb21fZW50cnkgPSBcc2hpZnQ7CisgIG15ICRyb21fZW50cnkgPSBcc2hpZnQ7CisgIG15ICRvZmZzZXQgPSBzaGlmdDsKKworICBpZiAoICQkcm9tX2VudHJ5ICkgeworICAgIG15ICRvbGRfZW50cnkgPSAkJGJhc2Vyb21fZW50cnk7CisgICAgJCRiYXNlcm9tX2VudHJ5ID0gKCAkb2Zmc2V0ICsgJCRyb21fZW50cnkgKTsKKyAgICAkJHJvbV9lbnRyeSA9ICRvbGRfZW50cnk7CisgIH0KK30KKworbXkgQHJvbWZpbGVzID0gQEFSR1Y7CitteSBAcm9tcyA9IG1hcCB7IG15ICRyb20gPSBuZXcgT3B0aW9uOjpST007ICRyb20tPmxvYWQoJF8pOyAkcm9tIH0gQHJvbWZpbGVzOworCitteSAkYmFzZXJvbSA9IHNoaWZ0IEByb21zOworbXkgJG9mZnNldCA9ICRiYXNlcm9tLT5sZW5ndGg7CisKK2ZvcmVhY2ggbXkgJHJvbSAoIEByb21zICkgeworCisgICMgVXBkYXRlIGJhc2UgbGVuZ3RoCisgICRiYXNlcm9tLT57bGVuZ3RofSArPSAkcm9tLT57bGVuZ3RofTsKKworICAjIE1lcmdlIGluaXRpYWxpc2F0aW9uIGVudHJ5IHBvaW50CisgIG1lcmdlX2VudHJ5X3BvaW50cyAoICRiYXNlcm9tLT57aW5pdH0sICRyb20tPntpbml0fSwgJG9mZnNldCApOworCisgICMgTWVyZ2UgQk9GTSBoZWFkZXIKKyAgbWVyZ2VfZW50cnlfcG9pbnRzICggJGJhc2Vyb20tPntib2ZtX2hlYWRlcn0sICRyb20tPntib2ZtX2hlYWRlcn0sICRvZmZzZXQgKTsKKworICAjIFVwZGF0ZSBQQ0kgaGVhZGVyLCBpZiBwcmVzZW50IGluIGJvdGgKKyAgbXkgJGJhc2Vyb21fcGNpID0gJGJhc2Vyb20tPnBjaV9oZWFkZXI7CisgIG15ICRyb21fcGNpID0gJHJvbS0+cGNpX2hlYWRlcjsKKyAgaWYgKCAkYmFzZXJvbV9wY2kgJiYgJHJvbV9wY2kgKSB7CisKKyAgICAjIFVwZGF0ZSBQQ0kgbGVuZ3RocworICAgICRiYXNlcm9tX3BjaS0+e2ltYWdlX2xlbmd0aH0gKz0gJHJvbV9wY2ktPntpbWFnZV9sZW5ndGh9OworICAgIGlmICggZXhpc3RzICRiYXNlcm9tX3BjaS0+e3J1bnRpbWVfbGVuZ3RofSApIHsKKyAgICAgIGlmICggZXhpc3RzICRyb21fcGNpLT57cnVudGltZV9sZW5ndGh9ICkgeworCSRiYXNlcm9tX3BjaS0+e3J1bnRpbWVfbGVuZ3RofSArPSAkcm9tX3BjaS0+e3J1bnRpbWVfbGVuZ3RofTsKKyAgICAgIH0gZWxzZSB7CisJJGJhc2Vyb21fcGNpLT57cnVudGltZV9sZW5ndGh9ICs9ICRyb21fcGNpLT57aW1hZ2VfbGVuZ3RofTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAjIE1lcmdlIENMUCBlbnRyeSBwb2ludAorICAgIGlmICggZXhpc3RzICggJGJhc2Vyb21fcGNpLT57Y2xwX2VudHJ5fSApICYmCisJIGV4aXN0cyAoICRyb21fcGNpLT57Y2xwX2VudHJ5fSApICkgeworICAgICAgbWVyZ2VfZW50cnlfcG9pbnRzICggJGJhc2Vyb21fcGNpLT57Y2xwX2VudHJ5fSwgJHJvbV9wY2ktPntjbHBfZW50cnl9LAorCQkJICAgJG9mZnNldCApOworICAgIH0KKyAgfQorCisgICMgVXBkYXRlIFBuUCBoZWFkZXIsIGlmIHByZXNlbnQgaW4gYm90aAorICBteSAkYmFzZXJvbV9wbnAgPSAkYmFzZXJvbS0+cG5wX2hlYWRlcjsKKyAgbXkgJHJvbV9wbnAgPSAkcm9tLT5wbnBfaGVhZGVyOworICBpZiAoICRiYXNlcm9tX3BucCAmJiAkcm9tX3BucCApIHsKKyAgICBtZXJnZV9lbnRyeV9wb2ludHMgKCAkYmFzZXJvbV9wbnAtPntiY3Z9LCAkcm9tX3BucC0+e2Jjdn0sICRvZmZzZXQgKTsKKyAgICBtZXJnZV9lbnRyeV9wb2ludHMgKCAkYmFzZXJvbV9wbnAtPntiZHZ9LCAkcm9tX3BucC0+e2Jkdn0sICRvZmZzZXQgKTsKKyAgICBtZXJnZV9lbnRyeV9wb2ludHMgKCAkYmFzZXJvbV9wbnAtPntiZXZ9LCAkcm9tX3BucC0+e2Jldn0sICRvZmZzZXQgKTsKKyAgfQorCisgICMgRml4IGNoZWNrc3VtIGZvciB0aGlzIFJPTSBzZWdtZW50CisgICRyb20tPmZpeF9jaGVja3N1bSgpOworCisgICRvZmZzZXQgKz0gJHJvbS0+bGVuZ3RoOworfQorCiskYmFzZXJvbS0+cG5wX2hlYWRlci0+Zml4X2NoZWNrc3VtKCkgaWYgJGJhc2Vyb20tPnBucF9oZWFkZXI7CiskYmFzZXJvbS0+Zml4X2NoZWNrc3VtKCk7CiskYmFzZXJvbS0+c2F2ZSAoICItIiApOworZm9yZWFjaCBteSAkcm9tICggQHJvbXMgKSB7CisgICRyb20tPnNhdmUgKCAiLSIgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvbW9kcm9tLnBsIGIvZ3B4ZS9zcmMvdXRpbC9tb2Ryb20ucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2RhYzBiOQotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL3V0aWwvbW9kcm9tLnBsCkBAIC0wLDAgKzEsMjI2IEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIEdldG9wdDo6U3RkOworCit1c2UgY29uc3RhbnQgTUlOUk9NU0laRSA9PiA4MTkyOwordXNlIGNvbnN0YW50IE1BWFJPTVNJWkUgPT4gMjYyMTQ0OworCit1c2UgY29uc3RhbnQgUENJX1BUUl9MT0MgPT4gMHgxODsJIyBmcm9tIGJlZ2lubmluZyBvZiBST00KK3VzZSBjb25zdGFudCBQQ0lfSERSX1NJWkUgPT4gMHgxODsKK3VzZSBjb25zdGFudCBQTlBfUFRSX0xPQyA9PiAweDFhOwkjIGZyb20gYmVnaW5uaW5nIG9mIFJPTQordXNlIGNvbnN0YW50IFBOUF9IRFJfU0laRSA9PiAweDIwOwordXNlIGNvbnN0YW50IFBOUF9DSEtTVU1fT0ZGID0+IDB4OTsJIyBieXRlcyBmcm9tIGJlZ2lubmluZyBvZiBQblAgaGVhZGVyCit1c2UgY29uc3RhbnQgUE5QX0RFVklDRV9PRkYgPT4gMHgxMDsJIyBieXRlcyBmcm9tIGJlZ2lubmluZyBvZiBQblAgaGVhZGVyCit1c2UgY29uc3RhbnQgUENJX1ZFTkRfSURfT0ZGID0+IDB4NDsJIyBieXRlcyBmcm9tIGJlZ2lubmluZyBvZiBQQ0kgaGVhZGVyCit1c2UgY29uc3RhbnQgUENJX0RFVl9JRF9PRkYgPT4gMHg2OwkjIGJ5dGVzIGZyb20gYmVnaW5uaW5nIG9mIFBDSSBoZWFkZXIKK3VzZSBjb25zdGFudCBQQ0lfU0laRV9PRkYgPT4gMHgxMDsJIyBieXRlcyBmcm9tIGJlZ2lubmluZyBvZiBQQ0kgaGVhZGVyCisKK3VzZSBjb25zdGFudCBVTkRJX1BUUl9MT0MgPT4gMHgxNjsJIyBmcm9tIGJlZ2lubmluZyBvZiBST00KK3VzZSBjb25zdGFudCBVTkRJX0hEUl9TSVpFID0+IDB4MTY7Cit1c2UgY29uc3RhbnQgVU5ESV9DSEtTVU1fT0ZGID0+IDB4MDU7CisKK3VzZSBzdHJpY3Q7CisKK3VzZSB2YXJzIHF3KCVvcHRzKTsKKwordXNlIGJ5dGVzOworCitzdWIgZ2V0cm9tc2l6ZSAoJCkgeworCW15ICgkcm9tcmVmKSA9IEBfOworCW15ICRpOworCisJcHJpbnQgU1RERVJSICJCSU9TIGV4dGVuc2lvbiBST00gSW1hZ2UgZGlkIG5vdCBzdGFydCB3aXRoIDB4NTUgMHhBQVxuIgorCQlpZiAoc3Vic3RyKCQkcm9tcmVmLCAwLCAyKSBuZSAiXHg1NVx4YWEiKTsKKwlteSAkc2l6ZSA9IG9yZChzdWJzdHIoJCRyb21yZWYsIDIsIDEpKSAqIDUxMjsKKwlmb3IgKCRpID0gTUlOUk9NU0laRTsgJGkgPCBNQVhST01TSVpFIGFuZCAkaSA8ICRzaXplOyAkaSAqPSAyKSB7IH0KKwlwcmludCBTVERFUlIgIiRzaXplIGlzIGEgc3RyYW5nZSBzaXplIGZvciBhIGJvb3QgUk9NXG4iCisJCWlmICgkc2l6ZSA+IDAgYW5kICRpID4gJHNpemUpOworCXJldHVybiAoJHNpemUpOworfQorCitzdWIgYWRkaWRlbnQgKCQpIHsKKwlteSAoJHJvbXJlZikgPSBAXzsKKworCXJldHVybiAoMCkgdW5sZXNzIChteSAkcyA9ICRvcHRzeydpJ30pOworCSMgaW5jbHVkZSB0aGUgdGVybWluYXRpbmcgTlVMIGJ5dGUgdG9vCisJJHMgLj0gIlx4MDAiOworCW15ICRsZW4gPSBsZW5ndGgoJHMpOworCSMgUHV0IHRoZSBpZGVudGlmaWVyIGluIG9ubHkgaWYgdGhlIHNwYWNlIGlzIGJsYW5rCisJbXkgJHBvcyA9IGxlbmd0aCgkJHJvbXJlZikgLSAkbGVuIC0gMjsKKwlyZXR1cm4gKDApIGlmIChzdWJzdHIoJCRyb21yZWYsICRwb3MsICRsZW4pIG5lICgiXHhGRiIgeCAkbGVuKSk7CisJc3Vic3RyKCQkcm9tcmVmLCAkcG9zLCAkbGVuKSA9ICRzOworCXJldHVybiAoJHBvcyk7Cit9CisKK3N1YiBwY2lwbnBoZWFkZXJzICgkJCkgeworCW15ICgkcm9tcmVmLCAkaWRlbnRvZmZzZXQpID0gQF87CisJbXkgKCRwY2lfaGRyX29mZnNldCwgJHBucF9oZHJfb2Zmc2V0KTsKKworCSRwY2lfaGRyX29mZnNldCA9IHVucGFjaygndicsIHN1YnN0cigkJHJvbXJlZiwgUENJX1BUUl9MT0MsIDIpKTsKKwkkcG5wX2hkcl9vZmZzZXQgPSB1bnBhY2soJ3YnLCBzdWJzdHIoJCRyb21yZWYsIFBOUF9QVFJfTE9DLCAyKSk7CisJIyBTYW5pdHkgY2hlY2tzCisJaWYgKCRwY2lfaGRyX29mZnNldCA8IFBDSV9QVFJfTE9DICsgMgorCQlvciAkcGNpX2hkcl9vZmZzZXQgPiBsZW5ndGgoJCRyb21yZWYpIC0gUENJX0hEUl9TSVpFCisJCW9yICRwbnBfaGRyX29mZnNldCA8IFBOUF9QVFJfTE9DICsgMgorCQlvciAkcG5wX2hkcl9vZmZzZXQgPiBsZW5ndGgoJCRyb21yZWYpIC0gUE5QX0hEUl9TSVpFCisJCW9yIHN1YnN0cigkJHJvbXJlZiwgJHBjaV9oZHJfb2Zmc2V0LCA0KSBuZSAnUENJUicKKwkJb3Igc3Vic3RyKCQkcm9tcmVmLCAkcG5wX2hkcl9vZmZzZXQsIDQpIG5lICckUG5QJykgeworCQkkcGNpX2hkcl9vZmZzZXQgPSAkcG5wX2hkcl9vZmZzZXQgPSAwOworCX0gZWxzZSB7CisJCXByaW50ZiAiUENJIGhlYWRlciBhdCAlI3ggYW5kIFBuUCBoZWFkZXIgYXQgJSN4XG4iLAorCQkJJHBjaV9oZHJfb2Zmc2V0LCAkcG5wX2hkcl9vZmZzZXQ7CisJfQorCWlmICgkcGNpX2hkcl9vZmZzZXQgPiAwKSB7CisJCW15ICgkcGNpX3ZlbmRvcl9pZCwgJHBjaV9kZXZpY2VfaWQpOworCQkjIGlmIG5vIC1wIG9wdGlvbiwganVzdCByZXBvcnQgd2hhdCdzIHRoZXJlCisJCWlmICghZGVmaW5lZCgkb3B0c3sncCd9KSkgeworCQkJJHBjaV92ZW5kb3JfaWQgPSB1bnBhY2soJ3YnLCBzdWJzdHIoJCRyb21yZWYsICRwY2lfaGRyX29mZnNldCtQQ0lfVkVORF9JRF9PRkYsIDIpKTsKKwkJCSRwY2lfZGV2aWNlX2lkID0gdW5wYWNrKCd2Jywgc3Vic3RyKCQkcm9tcmVmLCAkcGNpX2hkcl9vZmZzZXQrUENJX0RFVl9JRF9PRkYsIDIpKTsKKwkJCXByaW50ZiAiUENJIFZlbmRvciBJRCAlI3ggRGV2aWNlIElEICUjeFxuIiwKKwkJCQkkcGNpX3ZlbmRvcl9pZCwgJHBjaV9kZXZpY2VfaWQ7CisJCX0gZWxzZSB7CisJCQlzdWJzdHIoJCRyb21yZWYsICRwY2lfaGRyX29mZnNldCArIFBDSV9TSVpFX09GRiwgMikKKwkJCQk9IHBhY2soJ3YnLCBsZW5ndGgoJCRyb21yZWYpIC8gNTEyKTsKKwkJCSgkcGNpX3ZlbmRvcl9pZCwgJHBjaV9kZXZpY2VfaWQpID0gc3BsaXQoLywvLCAkb3B0c3sncCd9KTsKKwkJCXN1YnN0cigkJHJvbXJlZiwgJHBjaV9oZHJfb2Zmc2V0K1BDSV9WRU5EX0lEX09GRiwgMikKKwkJCQk9IHBhY2soJ3YnLCBvY3QoJHBjaV92ZW5kb3JfaWQpKSBpZiAoJHBjaV92ZW5kb3JfaWQpOworCQkJc3Vic3RyKCQkcm9tcmVmLCAkcGNpX2hkcl9vZmZzZXQrUENJX0RFVl9JRF9PRkYsIDIpCisJCQkJPSBwYWNrKCd2Jywgb2N0KCRwY2lfZGV2aWNlX2lkKSkgaWYgKCRwY2lfZGV2aWNlX2lkKTsKKwkJfQorCX0KKwlpZiAoJHBucF9oZHJfb2Zmc2V0ID4gMCBhbmQgZGVmaW5lZCgkaWRlbnRvZmZzZXQpKSB7CisJCSMgUG9pbnQgdG8gZGV2aWNlIGlkIHN0cmluZyBhdCBlbmQgb2YgUk9NIGltYWdlCisJCXN1YnN0cigkJHJvbXJlZiwgJHBucF9oZHJfb2Zmc2V0K1BOUF9ERVZJQ0VfT0ZGLCAyKQorCQkJPSBwYWNrKCd2JywgJGlkZW50b2Zmc2V0KTsKKwkJc3Vic3RyKCQkcm9tcmVmLCAkcG5wX2hkcl9vZmZzZXQrUE5QX0NIS1NVTV9PRkYsIDEpID0gIlx4MDAiOworCQlteSAkc3VtID0gdW5wYWNrKCclOEMqJywgc3Vic3RyKCQkcm9tcmVmLCAkcG5wX2hkcl9vZmZzZXQsCisJCQlQTlBfSERSX1NJWkUpKTsKKwkJc3Vic3RyKCQkcm9tcmVmLCAkcG5wX2hkcl9vZmZzZXQrUE5QX0NIS1NVTV9PRkYsIDEpID0gY2hyKDI1NiAtICRzdW0pOworCX0KK30KKworc3ViIHVuZGloZWFkZXJzICgkKSB7CisJbXkgKCRyb21yZWYpID0gQF87CisJbXkgKCR1bmRpX2hkcl9vZmZzZXQpOworCisJJHVuZGlfaGRyX29mZnNldCA9IHVucGFjaygndicsIHN1YnN0cigkJHJvbXJlZiwgVU5ESV9QVFJfTE9DLCAyKSk7CisJIyBTYW5pdHkgY2hlY2tzCisJaWYgKCR1bmRpX2hkcl9vZmZzZXQgPCBVTkRJX1BUUl9MT0MgKyAyCisJCW9yICR1bmRpX2hkcl9vZmZzZXQgPiBsZW5ndGgoJCRyb21yZWYpIC0gVU5ESV9IRFJfU0laRQorCQlvciBzdWJzdHIoJCRyb21yZWYsICR1bmRpX2hkcl9vZmZzZXQsIDQpIG5lICdVTkRJJykgeworCQkkdW5kaV9oZHJfb2Zmc2V0ID0gMDsKKwl9IGVsc2UgeworCQlwcmludGYgIlVOREkgaGVhZGVyIGF0ICUjeFxuIiwgJHVuZGlfaGRyX29mZnNldDsKKwl9CisJaWYgKCR1bmRpX2hkcl9vZmZzZXQgPiAwKSB7CisJCXN1YnN0cigkJHJvbXJlZiwgJHVuZGlfaGRyX29mZnNldCtVTkRJX0NIS1NVTV9PRkYsIDEpID0gIlx4MDAiOworCQlteSAkc3VtID0gdW5wYWNrKCclOEMqJywgc3Vic3RyKCQkcm9tcmVmLCAkdW5kaV9oZHJfb2Zmc2V0LAorCQkJVU5ESV9IRFJfU0laRSkpOworCQlzdWJzdHIoJCRyb21yZWYsICR1bmRpX2hkcl9vZmZzZXQrVU5ESV9DSEtTVU1fT0ZGLCAxKSA9IGNocigyNTYgLSAkc3VtKTsKKwl9Cit9CisKK3N1YiB3cml0ZXJvbSAoJCQpIHsKKwlteSAoJGZpbGVuYW1lLCAkcm9tcmVmKSA9IEBfOworCisJb3BlbihSLCAiPiRmaWxlbmFtZSIpIG9yIGRpZSAiJGZpbGVuYW1lOiAkIVxuIjsKKwlwcmludCBSICQkcm9tcmVmOworCWNsb3NlKFIpOworfQorCitzdWIgY2hlY2tzdW0gKCQpIHsKKwlteSAoJHJvbXJlZikgPSBAXzsKKworCXN1YnN0cigkJHJvbXJlZiwgNiwgMSkgPSAiXHgwMCI7CisJbXkgJHN1bSA9IHVucGFjaygnJThDKicsICQkcm9tcmVmKTsKKwlzdWJzdHIoJCRyb21yZWYsIDYsIDEpID0gY2hyKDI1NiAtICRzdW0pOworCSMgRG91YmxlIGNoZWNrCisJJHN1bSA9IHVucGFjaygnJThDKicsICQkcm9tcmVmKTsKKwlpZiAoJHN1bSAhPSAwKSB7CisJCXByaW50ICJDaGVja3N1bSBmYWlsc1xuIgorCX0gZWxzaWYgKCRvcHRzeyd2J30pIHsKKwkJcHJpbnQgIkNoZWNrc3VtIG9rXG4iOworCX0KK30KKworc3ViIG1ha2Vyb20gKCkgeworCW15ICgkcm9tLCAkcm9tc2l6ZSk7CisKKwlnZXRvcHRzKCczeGk6cDpzOnYnLCBcJW9wdHMpOworCSRBUkdWWzBdIG9yIGRpZSAiVXNhZ2U6ICQwIFstcyByb21zaXplXSBbLWkgaWRlbnRdIFstcCB2ZW5kb3JpZCxkZXZpY2VpZF0gWy14XSBbLTNdIHJvbS1maWxlXG4iOworCW9wZW4oUiwgJEFSR1ZbMF0pIG9yIGRpZSAiJEFSR1ZbMF06ICQhXG4iOworCSMgUmVhZCBpbiB0aGUgd2hvbGUgUk9NIGluIG9uZSBndWxwCisJbXkgJGZpbGVzaXplID0gcmVhZChSLCAkcm9tLCBNQVhST01TSVpFKzEpOworCWNsb3NlKFIpOworCWRlZmluZWQoJGZpbGVzaXplKSBhbmQgJGZpbGVzaXplID49IDMgb3IgZGllICJDYW5ub3QgZ2V0IGZpcnN0IDMgYnl0ZXMgb2YgZmlsZVxuIjsKKwlwcmludCAiJGZpbGVzaXplIGJ5dGVzIHJlYWRcbiIgaWYgJG9wdHN7J3YnfTsKKwkjIElmIFBYRSBpbWFnZSwganVzdCBmaWxsIHRoZSBsZW5ndGggZmllbGQgYW5kIHdyaXRlIGl0IG91dAorCWlmICgkb3B0c3sneCd9KSB7CisJCXN1YnN0cigkcm9tLCAyLCAxKSA9IGNocigobGVuZ3RoKCRyb20pICsgNTExKSAvIDUxMik7CisJCSZ3cml0ZXJvbSgkQVJHVlswXSwgXCRyb20pOworCQlyZXR1cm47CisJfQorCSMgU2l6ZSBzcGVjaWZpZWQgd2l0aCAtcyBvdmVycmlkZXMgdmFsdWUgaW4gM3JkIGJ5dGUgaW4gaW1hZ2UKKwkjIC1zIDAgbWVhbnMgcm91bmQgdXAgdG8gbmV4dCA1MTIgYnl0ZSBibG9jaworCWlmIChkZWZpbmVkKCRvcHRzeydzJ30pKSB7CisJCWlmICgoJHJvbXNpemUgPSBvY3QoJG9wdHN7J3MnfSkpIDw9IDApIHsKKwkJCSMgTkI6IFRoaXMgcm91bmR1cCB0cmljayBvbmx5IHdvcmtzIG9uIHBvd2VycyBvZiAyCisJCQkkcm9tc2l6ZSA9ICgkZmlsZXNpemUgKyA1MTEpICYgfjUxMQorCQl9CisJfSBlbHNlIHsKKwkJJHJvbXNpemUgPSAmZ2V0cm9tc2l6ZShcJHJvbSk7CisJCSMgMCBwdXQgdGhlcmUgYnkgKmxvYWRlci5TIG1lYW5zIG1ha2Vyb20gc2hvdWxkIHBpY2sgdGhlIHNpemUKKwkJaWYgKCRyb21zaXplID09IDApIHsKKwkJCSMgU2hyaW5rIHJvbXNpemUgZG93biB0byB0aGUgc21hbGxlc3QgcG93ZXIgb2YgdHdvIHRoYXQgd2lsbCBkbworCQkJZm9yICgkcm9tc2l6ZSA9IE1BWFJPTVNJWkU7CisJCQkJJHJvbXNpemUgPiBNSU5ST01TSVpFIGFuZCAkcm9tc2l6ZSA+PSAyKiRmaWxlc2l6ZTsKKwkJCQkkcm9tc2l6ZSAvPSAyKSB7IH0KKwkJfQorCX0KKwlpZiAoJGZpbGVzaXplID4gJHJvbXNpemUpIHsKKwkJcHJpbnQgU1RERVJSICJST00gc2l6ZSBvZiAkcm9tc2l6ZSBub3QgYmlnIGVub3VnaCBmb3IgZGF0YSwgIjsKKwkJIyBOQjogVGhpcyByb3VuZHVwIHRyaWNrIG9ubHkgd29ya3Mgb24gcG93ZXJzIG9mIDIKKwkJJHJvbXNpemUgPSAoJGZpbGVzaXplICsgNTExKSAmIH41MTE7CisJCXByaW50ICJ3aWxsIHVzZSAkcm9tc2l6ZSBpbnN0ZWFkXG4iCisJfQorCSMgUGFkIHdpdGggMHhGRiB0byAkcm9tc2l6ZQorCSRyb20gLj0gIlx4RkYiIHggKCRyb21zaXplIC0gbGVuZ3RoKCRyb20pKTsKKwlpZiAoJHJvbXNpemUgPj0gMTI4ICogMTAyNCkgeworCQlwcmludCAiV2FybmluZzogUk9NIHNpemUgZXhjZWVkcyBleHRlbnNpb24gQklPUyBsaW1pdFxuIjsKKwl9CisJc3Vic3RyKCRyb20sIDIsIDEpID0gY2hyKCgkcm9tc2l6ZSAvIDUxMikgJSAyNTYpOworCXByaW50ICJST00gc2l6ZSBpcyAkcm9tc2l6ZVxuIiBpZiAkb3B0c3sndid9OworCW15ICRpZGVudG9mZnNldCA9ICZhZGRpZGVudChcJHJvbSk7CisJJnBjaXBucGhlYWRlcnMoXCRyb20sICRpZGVudG9mZnNldCk7CisJJnVuZGloZWFkZXJzKFwkcm9tKTsKKwkjIDNjNTAzIHJlcXVpcmVzIGxhc3QgdHdvIGJ5dGVzIHRvIGJlIDB4ODAKKwlzdWJzdHIoJHJvbSwgTUlOUk9NU0laRS0yLCAyKSA9ICJceDgwXHg4MCIKKwkJaWYgKCRvcHRzeyczJ30gYW5kICRyb21zaXplID09IE1JTlJPTVNJWkUpOworCSZjaGVja3N1bShcJHJvbSk7CisJJndyaXRlcm9tKCRBUkdWWzBdLCBcJHJvbSk7Cit9CisKK3N1YiBtb2Ryb20gKCkgeworCW15ICgkcm9tKTsKKworCWdldG9wdHMoJ3A6dicsIFwlb3B0cyk7CisJJEFSR1ZbMF0gb3IgZGllICJVc2FnZTogJDAgWy1wIHZlbmRvcmlkLGRldmljZWlkXSByb20tZmlsZVxuIjsKKwlvcGVuKFIsICRBUkdWWzBdKSBvciBkaWUgIiRBUkdWWzBdOiAkIVxuIjsKKwkjIFJlYWQgaW4gdGhlIHdob2xlIFJPTSBpbiBvbmUgZ3VscAorCW15ICRmaWxlc2l6ZSA9IHJlYWQoUiwgJHJvbSwgTUFYUk9NU0laRSsxKTsKKwljbG9zZShSKTsKKwlkZWZpbmVkKCRmaWxlc2l6ZSkgYW5kICRmaWxlc2l6ZSA+PSAzIG9yIGRpZSAiQ2Fubm90IGdldCBmaXJzdCAzIGJ5dGVzIG9mIGZpbGVcbiI7CisJcHJpbnQgIiRmaWxlc2l6ZSBieXRlcyByZWFkXG4iIGlmICRvcHRzeyd2J307CisJJnBjaXBucGhlYWRlcnMoXCRyb20pOworCSZ1bmRpaGVhZGVycyhcJHJvbSk7CisJJmNoZWNrc3VtKFwkcm9tKTsKKwkmd3JpdGVyb20oJEFSR1ZbMF0sIFwkcm9tKTsKK30KKworIyBNYWluIHJvdXRpbmUuIFNlZSBob3cgd2Ugd2VyZSBjYWxsZWQgYW5kIGJlaGF2ZSBhY2NvcmRpbmdseQoraWYgKCQwID1+IG06bW9kcm9tKFwucGwpPyQ6KSB7CisJJm1vZHJvbSgpOworfSBlbHNlIHsKKwkmbWFrZXJvbSgpOworfQorZXhpdCgwKTsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvbXVjdXJzZXNfdGVzdC5jIGIvZ3B4ZS9zcmMvdXRpbC9tdWN1cnNlc190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2NTYyZAotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL3V0aWwvbXVjdXJzZXNfdGVzdC5jCkBAIC0wLDAgKzEsNjMgQEAKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2N1cnNlcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCit2b2lkIGdldF9pc2NzaV9jaGFwX3NlY3JldCggY2hhciAqICk7Cit2b2lkIG1kZWxheSggaW50IG1zZWNzICk7CisKK2ludCBtYWluICggdm9pZCApIHsKKwljaGFyIHNlY3JldFsxNl07CisJaW5pdHNjcigpOworCWVjaG8oKTsKKwl3ZXJhc2Uoc3Rkc2NyKTsKKwlib3goIHN0ZHNjciwgJ3wnLCAnLScgKTsKKwlnZXRfaXNjc2lfY2hhcF9zZWNyZXQoc2VjcmV0KTsKKworCW12d3ByaW50dyggc3Rkc2NyLCAzLCA1LCAicGFzc3dvcmQgaXMgXCIlc1wiIiwgc2VjcmV0ICk7CisJbWRlbGF5KDI1MDApOworCisJc3Rkc2NyLT5zY3ItPmV4aXQoc3Rkc2NyLT5zY3IpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2V0X2lzY3NpX2NoYXBfc2VjcmV0KCBjaGFyICpzZWMgKSB7CisJY2hhciAJKnRpdGxlID0gIlNldCBuZXcgaVNDU0kgQ0hBUCBzZWNyZXQiLAorCQkqbXNnID0gIkNvbmZpZ3VyZSB0aGUgaVNDU0kgYWNjZXNzIHNlY3JldCIsCisJCXB3MVsxN10sIHB3MlsxN107CisJV0lORE9XICpzZWNyZXQ7CisKKwlzZWNyZXQgPSBuZXd3aW4oIHN0ZHNjci0+aGVpZ2h0IC8gMiwKKwkJCSBzdGRzY3ItPndpZHRoIC8gMiwKKwkJCSBzdGRzY3ItPmhlaWdodCAvIDQsCisJCQkgc3Rkc2NyLT53aWR0aCAvIDQgKTsKKworCXdib3JkZXIoIHNlY3JldCwgJ3wnLCAnfCcsICctJywgJy0nLCAnKycsICcrJywgJysnLCAnKycgKTsKKwltdndwcmludHcoIHNlY3JldCwgMSwgMiwgIiVzIiwgdGl0bGUgKTsKKwltdndobGluZSggc2VjcmV0LCAyLCAxLCAnLScgfCBzZWNyZXQtPmF0dHJzLCBzZWNyZXQtPndpZHRoIC0gMiApOworCW12d3ByaW50dyggc2VjcmV0LCA0LCAyLCAiJXMiLCBtc2cgKTsKKwltdndwcmludHcoIHNlY3JldCwgNiwgMywgInNlY3JldCIgKTsKKwltdndwcmludHcoIHNlY3JldCwgOCwgMywgImNvbmZpcm0iICk7Cisgc3RhcnQ6CisJbXZ3aGxpbmUoIHNlY3JldCwgNiwgMTIsICdfJyB8IHNlY3JldC0+YXR0cnMsIDE2ICk7CisJbXZ3aGxpbmUoIHNlY3JldCwgOCwgMTIsICdfJyB8IHNlY3JldC0+YXR0cnMsIDE2ICk7CisKKwl3bW92ZSggc2VjcmV0LCA2LCAxMiApOworCXdnZXRuc3RyKCBzZWNyZXQsIHB3MSwgMTYgKTsKKwl3bW92ZSggc2VjcmV0LCA4LCAxMiApOworCXdnZXRuc3RyKCBzZWNyZXQsIHB3MiwgMTYgKTsKKworCWlmICggc3RyY21wKCBwdzEsIHB3MiApID09IDAgKSB7CisJCXN0cmNweSggc2VjLCBwdzEgKTsKKwkJd2VyYXNlKCBzZWNyZXQgKTsKKwl9CisJZWxzZSB7CisJCW12d3ByaW50dyggc2VjcmV0LCAxMCwgMywgIlBhc3N3b3JkcyBkbyBub3QgbWF0Y2giICk7CisJCWdvdG8gc3RhcnQ7CisJfQorfQorCit2b2lkIG1kZWxheSAoIGludCBtc2VjcyApIHsKKwl1c2xlZXAoIG1zZWNzICogMTAwMCApOworfQpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXRpbC9ucnYyYi5jIGIvZ3B4ZS9zcmMvdXRpbC9ucnYyYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYWM0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL25ydjJiLmMKQEAgLTAsMCArMSwxNTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGb3JtIGFkYXB0ZWQgZnJvbSBsemh1Zi5jCisgICAgd3JpdHRlbiBieSBIYXJ1eWFzdSBZb3NoaXpha2kgMTEvMjAvMTk4OAorICAgIHNvbWUgbWlub3IgY2hhbmdlcyA0LzYvMTk4OQorICAgIGNvbW1lbnRzIHRyYW5zbGF0ZWQgYnkgSGFydWhpa28gT2t1bXVyYSA0LzcvMTk4OQorCisgICAgbWlub3IgYmVhdXRpZmljYXRpb25zIGFuZCBhZGp1c3RtZW50cyBmb3IgY29tcGlsaW5nIHVuZGVyIExpbnV4CisgICAgYnkgTWFya3VzIEd1dHNjaGtlIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgorICAgIAkJCQkJCTE5OTctMDEtMjcKKworICAgIE1vZGlmaWNhdGlvbnMgdG8gYWxsb3cgdXNlIGFzIGEgZmlsdGVyIGJ5IEtlbiBZYXAKKyAgICA8a2VuX3lhcEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LgorCisJCQkJCQkxOTk3LTA3LTAxCisKKyAgICBTbWFsbCBtb2QgdG8gY29wZSB3aXRoIHJ1bm5pbmcgb24gYmlnLWVuZGlhbiBtYWNoaW5lcworICAgIGJ5IEppbSBIYWd1ZSA8amltLmhhZ3VlQGFjbS5vcmcpCisJCQkJCQkxOTk4LTAyLTA2CisKKyAgICBNYWtlIGNvbXByZXNzaW9uIHN0YXRpc3RpY3MgcmVwb3J0IHNob3J0ZXIKKyAgICBieSBLZW4gWWFwIDxrZW5feWFwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uCisJCQkJCQkyMDAxLTA0LTI1CisKKyAgICBSZXBsYWNlZCBhbGdvcml0aG0gd2l0aCBucnYyYiBmcm9tIHVjbCB0aGUgY29tcHJlc3Npb24KKyAgICBsaWJyYXJ5IGZyb20gdXB4LiAgVGhhdCBjb2RlIGlzOgorICAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDAyIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgICBBbmQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwuCisgICAgVGhlIGNvbnZlcnNpb24gd2FzIHBlcmZvcm1lZCAKKyAgICBieSBFcmljIEJpZWRlcm1hbiA8ZWJpZWRlcm1hbkBsbnhpLmNvbT4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCBBdWd1c3QgMjAwMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVUNMUEFDS19DT01QQVQgMAorI2RlZmluZSBOREVCVUcgMQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmZGVmIF9fRnJlZUJTRF9fCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpZiBVQ0xQQUNLX0NPTVBBVAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorCisjaWZuZGVmIFZFUkJPU0UKKyNkZWZpbmUgRnByaW50Zih4KQorI2RlZmluZSB3dGVyciAgICAgMAorI2Vsc2UKKyNkZWZpbmUgRnByaW50Zih4KSBmcHJpbnRmIHgKKyNlbmRpZgorCisjaWZuZGVmIE1BSU4KK2V4dGVybgorI2VuZGlmCitGSUxFICAqaW5maWxlLCAqb3V0ZmlsZTsKKworI2lmIGRlZmluZWQoRU5DT0RFKSB8fCBkZWZpbmVkKERFQ09ERSkKKworI2lmbmRlZiBFTkRJQU4KKyNkZWZpbmUgRU5ESUFOICAgMAorI2VuZGlmCisjaWZuZGVmIEJJVFNJWkUKKyNkZWZpbmUgQklUU0laRSAzMgorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgRXJyb3IoY2hhciAqbWVzc2FnZSkKK3sKKwlGcHJpbnRmKChzdGRlcnIsICJcbiVzXG4iLCBtZXNzYWdlKSk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisvKiBUaGVzZSB3aWxsIGJlIGEgY29tcGxldGUgd2FzdGUgb2YgdGltZSBvbiBhIGxvLWVuZGlhbiAqLworLyogc3lzdGVtLCBidXQgaXQgb25seSBnZXRzIGRvbmUgb25jZSBzbyBXVEYuICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpODZ1bF90b19ob3N0KHVuc2lnbmVkIGxvbmcgdWwpCit7CisJdW5zaWduZWQgbG9uZyByZXMgPSAwOworCWludCBpOworCXVuaW9uCisJeworCQl1bnNpZ25lZCBjaGFyIGNbNF07CisJCXVuc2lnbmVkIGxvbmcgdWw7CisJfSB1OworCisJdS51bCA9IHVsOworCWZvciAoaSA9IDM7IGkgPj0gMDsgaS0tKQorCQlyZXMgPSAocmVzIDw8IDgpICsgdS5jW2ldOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhvc3RfdG9faTg2dWwodW5zaWduZWQgbG9uZyB1bCkKK3sKKwlpbnQgaTsKKwl1bmlvbgorCXsKKwkJdW5zaWduZWQgY2hhciBjWzRdOworCQl1bnNpZ25lZCBsb25nIHVsOworCX0gdTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQl1LmNbaV0gPSB1bCAmIDB4ZmY7CisJCXVsID4+PSA4OworCX0KKwlyZXR1cm4gdS51bDsKK30KKyNlbmRpZgorCisKKworI2lmIFVDTFBBQ0tfQ09NUEFUCisvKiBtYWdpYyBmaWxlIGhlYWRlciBmb3IgY29tcHJlc3NlZCBmaWxlcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFnaWNbOF0gPQoreyAweDAwLCAweGU5LCAweDU1LCAweDQzLCAweDRjLCAweGZmLCAweDAxLCAweDFhIH07CisKKyNlbmRpZgorCisjaWZkZWYgRU5DT0RFCisvKioqKioqKioqKiBOUlYyQl85OSBjb21wcmVzc2lvbiAqKioqKioqKioqLworCisvKiBOb3RlIGJ5IGxpbWl0aW5nIHRoZSByaW5nIGJ1ZmZlciBJIGhhdmUgbGltaXRlZCB0aGUgbWF4aW11bQorICogb2Zmc2V0IHRvIDY0Sy4gIFNpbmNlIGV0aGVyYm9vdCByYXJlbHkgZ2V0cyB0aGF0IGJpZyBpdAorICogaXMgbm90IGEgcHJvYmxlbSBhbmQgaXQgZ2l2ZXMgbWUgYSBmaXJtIGd1YXJhbnRlZQorICogdGhhdCBJIHdpbGwgbmV2ZXIgZ2V0IGEgMyBieXRlIHN0cmluZyBtYXRjaCB0aGF0IGlzIGVuY29kZXMKKyAqIHRvIG1vcmUgdGhhbiA5LzggaXQncyBvcmlnaW5hbCBzaXplLgorICogVGhhdCBndWFyYW50ZWVlIGlzIGltcG9ydGFudCB0byBmb3IgdGhlIGlucGxhY2UgZGVjb21wcmVzc29yLgorICogVGhlcmUgYXJlIGJldHRlciB3YXlzIHRvIGRvIHRoaXMgaWYgYSBsYXJnZXIgb2Zmc2V0IGFuZCBidWZmZXIKKyAqIHdvdWxkIGdpdmUgYmV0dGVyIGNvbXByZXNzaW9uLgorICovCisjZGVmaW5lIE4gICAgICAgKDY1NTM2dWwpICAgICAgICAgICAvKiBzaXplIG9mIHJpbmcgYnVmZmVyICovCisjZGVmaW5lIFRIUkVTSE9MRCAgICAgICAxICAgICAgICAgICAvKiBsb3dlciBsaW1pdCBmb3IgbWF0Y2ggbGVuZ3RoICovCisjZGVmaW5lIEYgICAgICAgICAgICAyMDQ4ICAgICAgICAgICAvKiB1cHBlciBsaW1pdCBmb3IgbWF0Y2ggbGVuZ3RoICovCisjZGVmaW5lIE0yX01BWF9PRkZTRVQgICAgICAgICAgICAgICAgIDB4ZDAwCisKKy8qIG5vdGU6IHRvIHVzZSBkZWZhdWx0IHZhbHVlcyBwYXNzIC0xLCBpLmUuIGluaXRpYWxpemUKKyAqIHRoaXMgc3RydWN0IGJ5IGEgbWVtc2V0KHgsMHhmZixzaXplb2YoeCkpICovCitzdHJ1Y3QgdWNsX2NvbXByZXNzX2NvbmZpZworeworCWludCBiYl9lbmRpYW47CisJaW50IGJiX3NpemU7CisJdW5zaWduZWQgaW50IG1heF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IG1heF9tYXRjaDsKKwlpbnQgc19sZXZlbDsKKwlpbnQgaF9sZXZlbDsKKwlpbnQgcF9sZXZlbDsKKwlpbnQgY19mbGFnczsKKwl1bnNpZ25lZCBpbnQgbV9zaXplOworfTsKKworc3RydWN0IHVjbF9jb21wcmVzcworeworCWludCBpbml0OworCisJdW5zaWduZWQgaW50IGxvb2s7ICAgICAgICAgIC8qIGJ5dGVzIGluIGxvb2thaGVhZCBidWZmZXIgKi8KKwkKKwl1bnNpZ25lZCBpbnQgbV9sZW47CisJdW5zaWduZWQgaW50IG1fb2ZmOworCQorCXVuc2lnbmVkIGludCBsYXN0X21fbGVuOworCXVuc2lnbmVkIGludCBsYXN0X21fb2ZmOworCQorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmlwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluX2VuZDsKKwl1bnNpZ25lZCBjaGFyICpvdXQ7CisJCisJdWludDY0X3QgYmJfYjsKKwl1bnNpZ25lZCBiYl9rOworCXVuc2lnbmVkIGJiX2NfZW5kaWFuOworCXVuc2lnbmVkIGJiX2NfczsKKwl1bnNpZ25lZCBiYl9jX3M4OworCXVuc2lnbmVkIGNoYXIgKmJiX3A7CisJdW5zaWduZWQgY2hhciAqYmJfb3A7CisJCisJc3RydWN0IHVjbF9jb21wcmVzc19jb25maWcgY29uZjsKKwl1bnNpZ25lZCBpbnQgKnJlc3VsdDsKKworCXVuc2lnbmVkIGludCB0ZXh0c2l6ZTsgICAgICAvKiB0ZXh0IHNpemUgY291bnRlciAqLworCXVuc2lnbmVkIGludCBjb2Rlc2l6ZTsgICAgICAvKiBjb2RlIHNpemUgY291bnRlciAqLworCXVuc2lnbmVkIGludCBwcmludGNvdW50OyAvKiBjb3VudGVyIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgZXZlcnkgMUsKKwkJCQkgICAgYnl0ZXMgKi8KKworCQorCS8qIHNvbWUgc3RhdHMgKi8KKwl1bnNpZ25lZCBsb25nIGxpdF9ieXRlczsKKwl1bnNpZ25lZCBsb25nIG1hdGNoX2J5dGVzOworCXVuc2lnbmVkIGxvbmcgcmVwX2J5dGVzOworCXVuc2lnbmVkIGxvbmcgbGF6eTsKK307CisKKworCisjZGVmaW5lIGdldGJ5dGUoYykgICgoYykuaXAgPCAoYykuaW5fZW5kID8gKigoYykuaXApKysgOiAoLTEpKQorCisjZGVmaW5lIFVDTF9FX09LICAgICAgICAgICAgICAgMAorI2RlZmluZSBVQ0xfRV9JTlZBTElEX0FSR1VNRU5UIDEKKyNkZWZpbmUgVUNMX0VfT1VUX09GX01FTU9SWSAgICAyCisjZGVmaW5lIFVDTF9FX0VSUk9SICAgICAgICAgICAgMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU1dEX0hTSVpFCTE2Mzg0CisjZGVmaW5lIFNXRF9NQVhfQ0hBSU4JMjA0OAorI2RlZmluZSBTV0RfQkVTVF9PRkYgICAgMQorCisjZGVmaW5lIEhFQUQzKGIscCkgXAorICAgICgoKDB4OWY1ZiooKCgoKHVpbnQzMl90KWJbcF08PDUpXmJbcCsxXSk8PDUpXmJbcCsyXSkpPj41KSAmIChTV0RfSFNJWkUtMSkpCisKKyNkZWZpbmUgSEVBRDIoYixwKSAgICAgIChiW3BdIF4gKCh1bnNpZ25lZCliW3ArMV08PDgpKQorI2RlZmluZSBOSUwyICAgICAgICAgICAgICBVSU5UX01BWAorCitzdHJ1Y3QgdWNsX3N3ZAoreworLyogcHVibGljIC0gImJ1aWx0LWluIiAqLworCXVuc2lnbmVkIGludCBuOworCXVuc2lnbmVkIGludCBmOworCXVuc2lnbmVkIGludCB0aHJlc2hvbGQ7CisJCisvKiBwdWJsaWMgLSBjb25maWd1cmF0aW9uICovCisJdW5zaWduZWQgaW50IG1heF9jaGFpbjsKKwl1bnNpZ25lZCBpbnQgbmljZV9sZW5ndGg7CisJaW50IHVzZV9iZXN0X29mZjsKKwl1bnNpZ25lZCBpbnQgbGF6eV9pbnNlcnQ7CisJCisvKiBwdWJsaWMgLSBvdXRwdXQgKi8KKwl1bnNpZ25lZCBpbnQgbV9sZW47CisJdW5zaWduZWQgaW50IG1fb2ZmOworCXVuc2lnbmVkIGludCBsb29rOworCWludCBiX2NoYXI7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJdW5zaWduZWQgaW50IGJlc3Rfb2ZmWyBTV0RfQkVTVF9PRkYgXTsKKyNlbmRpZgorCQorLyogc2VtaSBwdWJsaWMgKi8KKwlzdHJ1Y3QgdWNsX2NvbXByZXNzICpjOworCXVuc2lnbmVkIGludCBtX3BvczsKKyNpZiBkZWZpbmVkKFNXRF9CRVNUX09GRikKKwl1bnNpZ25lZCBpbnQgYmVzdF9wb3NbIFNXRF9CRVNUX09GRiBdOworI2VuZGlmCisJCisvKiBwcml2YXRlICovCisJY29uc3QgdWludDhfdCAqZGljdDsKKwljb25zdCB1aW50OF90ICpkaWN0X2VuZDsKKwl1bnNpZ25lZCBpbnQgZGljdF9sZW47CisJCisvKiBwcml2YXRlICovCisJdW5zaWduZWQgaW50IGlwOyAgICAgICAgICAgICAgICAvKiBpbnB1dCBwb2ludGVyIChsb29rYWhlYWQpICovCisJdW5zaWduZWQgaW50IGJwOyAgICAgICAgICAgICAgICAvKiBidWZmZXIgcG9pbnRlciAqLworCXVuc2lnbmVkIGludCBycDsgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQgYl9zaXplOworCQorCXVuc2lnbmVkIGNoYXIgKmJfd3JhcDsKKwkKKwl1bnNpZ25lZCBpbnQgbm9kZV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgZmlyc3RfcnA7CisKKwl1bnNpZ25lZCBjaGFyIGIgWyBOICsgRiArIEYgXTsKKwl1bnNpZ25lZCBpbnQgaGVhZDMgWyBTV0RfSFNJWkUgXTsKKwl1bnNpZ25lZCBpbnQgc3VjYzMgWyBOICsgRiBdOworCXVuc2lnbmVkIGludCBiZXN0MyBbIE4gKyBGIF07CisJdW5zaWduZWQgaW50IGxsZW4zIFsgU1dEX0hTSVpFIF07CisJdW5zaWduZWQgaW50IGhlYWQyIFsgNjU1MzZVIF07Cit9OworCisjZGVmaW5lIHNfaGVhZDMocyxrZXkpICAgICAgICBzLT5oZWFkM1trZXldCisKKworI2lmICFkZWZpbmVkKCBOREVCVUcpCitzdGF0aWMgdm9pZCBhc3NlcnRfbWF0Y2goY29uc3Qgc3RydWN0IHVjbF9zd2QgKiBzd2QsIHVuc2lnbmVkIGludCBtX2xlbiwKKwl1bnNpZ25lZCBpbnQgbV9vZmYgKQorCit7CisJY29uc3Qgc3RydWN0IHVjbF9jb21wcmVzcyAqYyA9IHN3ZC0+YzsKKwl1bnNpZ25lZCBpbnQgZF9vZmY7CisJCisJYXNzZXJ0KG1fbGVuID49IDIpOworCWlmIChtX29mZiA8PSAodW5zaWduZWQgaW50KSAoYy0+YnAgLSBjLT5pbikpCisJeworCQlhc3NlcnQoYy0+YnAgLSBtX29mZiArIG1fbGVuIDwgYy0+aXApOworCQlhc3NlcnQobWVtY21wKGMtPmJwLCBjLT5icCAtIG1fb2ZmLCBtX2xlbikgPT0gMCk7CisJfQorCWVsc2UKKwl7CisJCWFzc2VydChzd2QtPmRpY3QgIT0gTlVMTCk7CisJCWRfb2ZmID0gbV9vZmYgLSAodW5zaWduZWQgaW50KSAoYy0+YnAgLSBjLT5pbik7CisJCWFzc2VydChkX29mZiA8PSBzd2QtPmRpY3RfbGVuKTsKKwkJaWYgKG1fbGVuID4gZF9vZmYpCisJCXsKKwkJCWFzc2VydChtZW1jbXAoYy0+YnAsIHN3ZC0+ZGljdF9lbmQgLSBkX29mZiwgZF9vZmYpID09CisJCQkJMCk7CisKKwkJCWFzc2VydChjLT5pbiArIG1fbGVuIC0gZF9vZmYgPCBjLT5pcCk7CisJCQlhc3NlcnQobWVtY21wKGMtPmJwICsgZF9vZmYsIGMtPmluLCBtX2xlbiAtIGRfb2ZmKSA9PQorCQkJCTApOworCisJCX0KKwkJZWxzZQorCQl7CisJCQlhc3NlcnQobWVtY21wKGMtPmJwLCBzd2QtPmRpY3RfZW5kIC0gZF9vZmYsIG1fbGVuKSA9PQorCQkJCTApOworCisJCX0KKwl9Cit9CisjZWxzZQorIyAgZGVmaW5lIGFzc2VydF9tYXRjaChhLGIsYykgICAoKHZvaWQpMCkKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljCit2b2lkIHN3ZF9pbml0ZGljdChzdHJ1Y3QgdWNsX3N3ZCAqcywgY29uc3QgdWludDhfdCAqZGljdCwgdW5zaWduZWQgaW50IGRpY3RfbGVuKQorCit7CisJcy0+ZGljdCA9IHMtPmRpY3RfZW5kID0gTlVMTDsKKwlzLT5kaWN0X2xlbiA9IDA7CisKKwlpZiAoIWRpY3QgfHwgZGljdF9sZW4gPD0gMCkKKwkJcmV0dXJuOworCWlmIChkaWN0X2xlbiA+IHMtPm4pCisJeworCQlkaWN0ICs9IGRpY3RfbGVuIC0gcy0+bjsKKwkJZGljdF9sZW4gPSBzLT5uOworCX0KKworCXMtPmRpY3QgPSBkaWN0OworCXMtPmRpY3RfbGVuID0gZGljdF9sZW47CisJcy0+ZGljdF9lbmQgPSBkaWN0ICsgZGljdF9sZW47CisJbWVtY3B5KHMtPmIsZGljdCxkaWN0X2xlbik7CisJcy0+aXAgPSBkaWN0X2xlbjsKK30KKworCitzdGF0aWMKK3ZvaWQgc3dkX2luc2VydGRpY3Qoc3RydWN0IHVjbF9zd2QgKnMsIHVuc2lnbmVkIGludCBub2RlLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBrZXk7CisKKwlzLT5ub2RlX2NvdW50ID0gcy0+biAtIGxlbjsKKwlzLT5maXJzdF9ycCA9IG5vZGU7CisKKwl3aGlsZSAobGVuLS0gPiAwKQorCXsKKwkJa2V5ID0gSEVBRDMocy0+Yixub2RlKTsKKwkJcy0+c3VjYzNbbm9kZV0gPSBzX2hlYWQzKHMsa2V5KTsKKwkJcy0+aGVhZDNba2V5XSA9ICh1bnNpZ25lZCBpbnQpKG5vZGUpOworCQlzLT5iZXN0M1tub2RlXSA9ICh1bnNpZ25lZCBpbnQpKHMtPmYgKyAxKTsKKwkJcy0+bGxlbjNba2V5XSsrOworCQlhc3NlcnQocy0+bGxlbjNba2V5XSA8PSBzLT5uKTsKKworCQlrZXkgPSBIRUFEMihzLT5iLG5vZGUpOworCQlzLT5oZWFkMltrZXldID0gKHVuc2lnbmVkIGludCkobm9kZSk7CisKKwkJbm9kZSsrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYworaW50IHN3ZF9pbml0KHN0cnVjdCB1Y2xfc3dkICpzLCBjb25zdCB1aW50OF90ICpkaWN0LCB1bnNpZ25lZCBpbnQgZGljdF9sZW4pCit7CisJdW5zaWduZWQgaW50IGkgPSAwOworCWludCBjID0gMDsKKworCWlmIChzLT5uID09IDApCisJCXMtPm4gPSBOOworCWlmIChzLT5mID09IDApCisJCXMtPmYgPSBGOworCXMtPnRocmVzaG9sZCA9IFRIUkVTSE9MRDsKKwlpZiAocy0+biA+IE4gfHwgcy0+ZiA+IEYpCisJCXJldHVybiBVQ0xfRV9JTlZBTElEX0FSR1VNRU5UOworCisJLyogZGVmYXVsdHMgKi8KKwlzLT5tYXhfY2hhaW4gPSBTV0RfTUFYX0NIQUlOOworCXMtPm5pY2VfbGVuZ3RoID0gcy0+ZjsKKwlzLT51c2VfYmVzdF9vZmYgPSAwOworCXMtPmxhenlfaW5zZXJ0ID0gMDsKKworCXMtPmJfc2l6ZSA9IHMtPm4gKyBzLT5mOworCWlmIChzLT5iX3NpemUgKyBzLT5mID49IFVJTlRfTUFYKQorCQlyZXR1cm4gVUNMX0VfRVJST1I7CisJcy0+Yl93cmFwID0gcy0+YiArIHMtPmJfc2l6ZTsKKwlzLT5ub2RlX2NvdW50ID0gcy0+bjsKKworCW1lbXNldChzLT5sbGVuMywgMCwgc2l6ZW9mKHMtPmxsZW4zWzBdKSAqIFNXRF9IU0laRSk7CisJZm9yIChpID0gMDsgaSA8IDY1NTM2VTsgaSsrKQorCQlzLT5oZWFkMltpXSA9IE5JTDI7CisKKwlzLT5pcCA9IDA7CisJc3dkX2luaXRkaWN0KHMsZGljdCxkaWN0X2xlbik7CisJcy0+YnAgPSBzLT5pcDsKKwlzLT5maXJzdF9ycCA9IHMtPmlwOworCisJYXNzZXJ0KHMtPmlwICsgcy0+ZiA8PSBzLT5iX3NpemUpOworCisJcy0+bG9vayA9ICh1bnNpZ25lZCBpbnQpIChzLT5jLT5pbl9lbmQgLSBzLT5jLT5pcCk7CisJaWYgKHMtPmxvb2sgPiAwKQorCXsKKwkJaWYgKHMtPmxvb2sgPiBzLT5mKQorCQkJcy0+bG9vayA9IHMtPmY7CisJCW1lbWNweSgmcy0+YltzLT5pcF0scy0+Yy0+aXAscy0+bG9vayk7CisJCXMtPmMtPmlwICs9IHMtPmxvb2s7CisJCXMtPmlwICs9IHMtPmxvb2s7CisJfQorCWlmIChzLT5pcCA9PSBzLT5iX3NpemUpCisJCXMtPmlwID0gMDsKKworCWlmIChzLT5sb29rID49IDIgJiYgcy0+ZGljdF9sZW4gPiAwKQorCQlzd2RfaW5zZXJ0ZGljdChzLDAscy0+ZGljdF9sZW4pOworCisJcy0+cnAgPSBzLT5maXJzdF9ycDsKKwlpZiAocy0+cnAgPj0gcy0+bm9kZV9jb3VudCkKKwkJcy0+cnAgLT0gcy0+bm9kZV9jb3VudDsKKwllbHNlCisJCXMtPnJwICs9IHMtPmJfc2l6ZSAtIHMtPm5vZGVfY291bnQ7CisKKwkvKiB1bnVzZWQgaSAqLworCS8qIHVudXNlZCBjICovCisJcmV0dXJuIFVDTF9FX09LOworfQorCisKK3N0YXRpYwordm9pZCBzd2RfZXhpdChzdHJ1Y3QgdWNsX3N3ZCAqcykKK3sKKwkvKiB1bnVzZWQgcyAqLworCit9CisKKyNkZWZpbmUgc3dkX3BvczJvZmYocyxwb3MpIFwKKwkocy0+YnAgPiAocG9zKSA/IHMtPmJwIC0gKHBvcykgOiBzLT5iX3NpemUgLSAoKHBvcykgLSBzLT5icCkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgc3dkX2dldGJ5dGUoc3RydWN0IHVjbF9zd2QgKnMpCit7CisJaW50IGM7CisKKwlpZiAoKGMgPSBnZXRieXRlKCoocy0+YykpKSA8IDApCisJeworCQlpZiAocy0+bG9vayA+IDApCisJCQktLXMtPmxvb2s7CisJfQorCWVsc2UKKwl7CisJCXMtPmJbcy0+aXBdID0gKHVpbnQ4X3QpKGMpOworCQlpZiAocy0+aXAgPCBzLT5mKQorCQkJcy0+Yl93cmFwW3MtPmlwXSA9ICh1aW50OF90KShjKTsKKwl9CisJaWYgKCsrcy0+aXAgPT0gcy0+Yl9zaXplKQorCQlzLT5pcCA9IDA7CisJaWYgKCsrcy0+YnAgPT0gcy0+Yl9zaXplKQorCQlzLT5icCA9IDA7CisJaWYgKCsrcy0+cnAgPT0gcy0+Yl9zaXplKQorCQlzLT5ycCA9IDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIHJlbW92ZSBub2RlIGZyb20gbGlzdHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIF9faW5saW5lX18KK3ZvaWQgc3dkX3JlbW92ZV9ub2RlKHN0cnVjdCB1Y2xfc3dkICpzLCB1bnNpZ25lZCBpbnQgbm9kZSkKK3sKKwlpZiAocy0+bm9kZV9jb3VudCA9PSAwKQorCXsKKwkJdW5zaWduZWQgaW50IGtleTsKKwkJCisjaWZkZWYgVUNMX0RFQlVHCisJCWlmIChzLT5maXJzdF9ycCAhPSBVSU5UX01BWCkKKwkJeworCQkJaWYgKG5vZGUgIT0gcy0+Zmlyc3RfcnApCisJCQkJcHJpbnRmKCJSZW1vdmUgJTVkOiAlNWQgJTVkICU1ZCAlNWQgJTZkICU2ZFxuIiwKKworCQkJCQlub2RlLCBzLT5ycCwgcy0+aXAsIHMtPmJwLCBzLT5maXJzdF9ycCwKKwkJCQkJcy0+aXAgLSBub2RlLCBzLT5pcCAtIHMtPmJwKTsKKwkJCWFzc2VydChub2RlID09IHMtPmZpcnN0X3JwKTsKKwkJCXMtPmZpcnN0X3JwID0gVUlOVF9NQVg7CisJCX0KKyNlbmRpZgorCQkKKwkJa2V5ID0gSEVBRDMocy0+Yixub2RlKTsKKwkJYXNzZXJ0KHMtPmxsZW4zW2tleV0gPiAwKTsKKwkJLS1zLT5sbGVuM1trZXldOworCQkKKwkJa2V5ID0gSEVBRDIocy0+Yixub2RlKTsKKwkJYXNzZXJ0KHMtPmhlYWQyW2tleV0gIT0gTklMMik7CisJCWlmICgodW5zaWduZWQgaW50KSBzLT5oZWFkMltrZXldID09IG5vZGUpCisJCQlzLT5oZWFkMltrZXldID0gTklMMjsKKwl9CisJZWxzZQorCQktLXMtPm5vZGVfY291bnQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYwordm9pZCBzd2RfYWNjZXB0KHN0cnVjdCB1Y2xfc3dkICpzLCB1bnNpZ25lZCBpbnQgbikKK3sKKwlhc3NlcnQobiA8PSBzLT5sb29rKTsKKworCWlmIChuID4gMCkgZG8KKwl7CisJCXVuc2lnbmVkIGludCBrZXk7CisKKwkJc3dkX3JlbW92ZV9ub2RlKHMscy0+cnApOworCisJCS8qIGFkZCBicCBpbnRvIEhFQUQzICovCisJCWtleSA9IEhFQUQzKHMtPmIscy0+YnApOworCQlzLT5zdWNjM1tzLT5icF0gPSBzX2hlYWQzKHMsa2V5KTsKKwkJcy0+aGVhZDNba2V5XSA9ICh1bnNpZ25lZCBpbnQpKHMtPmJwKTsKKwkJcy0+YmVzdDNbcy0+YnBdID0gKHVuc2lnbmVkIGludCkocy0+ZiArIDEpOworCQlzLT5sbGVuM1trZXldKys7CisJCWFzc2VydChzLT5sbGVuM1trZXldIDw9IHMtPm4pOworCisJCS8qIGFkZCBicCBpbnRvIEhFQUQyICovCisJCWtleSA9IEhFQUQyKHMtPmIscy0+YnApOworCQlzLT5oZWFkMltrZXldID0gKHVuc2lnbmVkIGludCkocy0+YnApOworCisJCXN3ZF9nZXRieXRlKHMpOworCX0gd2hpbGUgKC0tbiA+IDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYwordm9pZCBzd2Rfc2VhcmNoKHN0cnVjdCB1Y2xfc3dkICpzLCB1bnNpZ25lZCBpbnQgbm9kZSwgdW5zaWduZWQgaW50IGNudCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwMTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwMjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpweDsKKworCXVuc2lnbmVkIGludCBtX2xlbiA9IHMtPm1fbGVuOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiBiICA9IHMtPmI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqIGJwID0gcy0+YiArIHMtPmJwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiBieCA9IHMtPmIgKyBzLT5icCArIHMtPmxvb2s7CisJdW5zaWduZWQgY2hhciBzY2FuX2VuZDE7CisJCisJYXNzZXJ0KHMtPm1fbGVuID4gMCk7CisJCisJc2Nhbl9lbmQxID0gYnBbbV9sZW4gLSAxXTsKKwlmb3IgKCA7IGNudC0tID4gMDsgbm9kZSA9IHMtPnN1Y2MzW25vZGVdKQorCXsKKwkJcDEgPSBicDsKKwkJcDIgPSBiICsgbm9kZTsKKwkJcHggPSBieDsKKwkJCisJCWFzc2VydChtX2xlbiA8IHMtPmxvb2spOworCQkKKwkJaWYgKAorCQkJcDJbbV9sZW4gLSAxXSA9PSBzY2FuX2VuZDEgJiYKKwkJCXAyW21fbGVuXSA9PSBwMVttX2xlbl0gJiYKKwkJCXAyWzBdID09IHAxWzBdICYmCisJCQlwMlsxXSA9PSBwMVsxXSkKKwkJeworCQkJdW5zaWduZWQgaW50IGk7CisJCQlhc3NlcnQobWVtY21wKGJwLCZiW25vZGVdLDMpID09IDApOworCQkJCisJCQlwMSArPSAyOyBwMiArPSAyOworCQkJZG8ge30gd2hpbGUgKCsrcDEgPCBweCAmJiAqcDEgPT0gKisrcDIpOworCQkJaSA9IHAxIC0gYnA7CisJCQkKKyNpZmRlZiBVQ0xfREVCVUcKKwkJCWlmIChtZW1jbXAoYnAsJmJbbm9kZV0saSkgIT0gMCkKKwkJCQlwcmludGYoIiU1bGQgJTVsZCAlMDJ4JTAyeCAlMDJ4JTAyeFxuIiwKKwkJCQkJKGxvbmcpcy0+YnAsIChsb25nKSBub2RlLAorCQkJCQlicFswXSwgYnBbMV0sIGJbbm9kZV0sIGJbbm9kZSsxXSk7CisjZW5kaWYKKwkJCWFzc2VydChtZW1jbXAoYnAsJmJbbm9kZV0saSkgPT0gMCk7CisJCQkKKyNpZiBkZWZpbmVkKFNXRF9CRVNUX09GRikKKwkJCWlmIChpIDwgU1dEX0JFU1RfT0ZGKQorCQkJeworCQkJCWlmIChzLT5iZXN0X3Bvc1tpXSA9PSAwKQorCQkJCQlzLT5iZXN0X3Bvc1tpXSA9IG5vZGUgKyAxOworCQkJfQorI2VuZGlmCisJCQlpZiAoaSA+IG1fbGVuKQorCQkJeworCQkJCXMtPm1fbGVuID0gbV9sZW4gPSBpOworCQkJCXMtPm1fcG9zID0gbm9kZTsKKwkJCQlpZiAobV9sZW4gPT0gcy0+bG9vaykKKwkJCQkJcmV0dXJuOworCQkJCWlmIChtX2xlbiA+PSBzLT5uaWNlX2xlbmd0aCkKKwkJCQkJcmV0dXJuOworCQkJCWlmIChtX2xlbiA+ICh1bnNpZ25lZCBpbnQpIHMtPmJlc3QzW25vZGVdKQorCQkJCQlyZXR1cm47CisJCQkJc2Nhbl9lbmQxID0gYnBbbV9sZW4gLSAxXTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBzd2Rfc2VhcmNoMihzdHJ1Y3QgdWNsX3N3ZCAqcykKK3sKKwl1bnNpZ25lZCBpbnQga2V5OworCQorCWFzc2VydChzLT5sb29rID49IDIpOworCWFzc2VydChzLT5tX2xlbiA+IDApOworCQorCWtleSA9IHMtPmhlYWQyWyBIRUFEMihzLT5iLHMtPmJwKSBdOworCWlmIChrZXkgPT0gTklMMikKKwkJcmV0dXJuIDA7CisjaWZkZWYgVUNMX0RFQlVHCisJaWYgKG1lbWNtcCgmcy0+YltzLT5icF0sJnMtPmJba2V5XSwyKSAhPSAwKQorCQlwcmludGYoIiU1bGQgJTVsZCAlMDJ4JTAyeCAlMDJ4JTAyeFxuIiwgKGxvbmcpcy0+YnAsIChsb25nKWtleSwKKwkJCXMtPmJbcy0+YnBdLCBzLT5iW3MtPmJwKzFdLCBzLT5iW2tleV0sIHMtPmJba2V5KzFdKTsKKyNlbmRpZgorCWFzc2VydChtZW1jbXAoJnMtPmJbcy0+YnBdLCZzLT5iW2tleV0sMikgPT0gMCk7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJaWYgKHMtPmJlc3RfcG9zWzJdID09IDApCisJCXMtPmJlc3RfcG9zWzJdID0ga2V5ICsgMTsKKyNlbmRpZgorCQorCWlmIChzLT5tX2xlbiA8IDIpCisJeworCQlzLT5tX2xlbiA9IDI7CisJCXMtPm1fcG9zID0ga2V5OworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMKK3ZvaWQgc3dkX2ZpbmRiZXN0KHN0cnVjdCB1Y2xfc3dkICpzKQoreworCXVuc2lnbmVkIGludCBrZXk7CisJdW5zaWduZWQgaW50IGNudCwgbm9kZTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJYXNzZXJ0KHMtPm1fbGVuID4gMCk7CisKKwkvKiBnZXQgY3VycmVudCBoZWFkLCBhZGQgYnAgaW50byBIRUFEMyAqLworCWtleSA9IEhFQUQzKHMtPmIscy0+YnApOworCW5vZGUgPSBzLT5zdWNjM1tzLT5icF0gPSBzX2hlYWQzKHMsa2V5KTsKKwljbnQgPSBzLT5sbGVuM1trZXldKys7CisJYXNzZXJ0KHMtPmxsZW4zW2tleV0gPD0gcy0+biArIHMtPmYpOworCWlmIChjbnQgPiBzLT5tYXhfY2hhaW4gJiYgcy0+bWF4X2NoYWluID4gMCkKKwkJY250ID0gcy0+bWF4X2NoYWluOworCXMtPmhlYWQzW2tleV0gPSAodW5zaWduZWQgaW50KShzLT5icCk7CisKKwlzLT5iX2NoYXIgPSBzLT5iW3MtPmJwXTsKKwlsZW4gPSBzLT5tX2xlbjsKKwlpZiAocy0+bV9sZW4gPj0gcy0+bG9vaykKKwl7CisJCWlmIChzLT5sb29rID09IDApCisJCQlzLT5iX2NoYXIgPSAtMTsKKwkJcy0+bV9vZmYgPSAwOworCQlzLT5iZXN0M1tzLT5icF0gPSAodW5zaWduZWQgaW50KShzLT5mICsgMSk7CisJfQorCWVsc2UKKwl7CisJCWlmIChzd2Rfc2VhcmNoMihzKSkKKwkJCWlmIChzLT5sb29rID49IDMpCisJCQkJc3dkX3NlYXJjaChzLG5vZGUsY250KTsKKwkJaWYgKHMtPm1fbGVuID4gbGVuKQorCQkJcy0+bV9vZmYgPSBzd2RfcG9zMm9mZihzLHMtPm1fcG9zKTsKKwkJcy0+YmVzdDNbcy0+YnBdID0gKHVuc2lnbmVkIGludCkocy0+bV9sZW4pOworCisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJCWlmIChzLT51c2VfYmVzdF9vZmYpCisJCXsKKwkJCWludCBpOworCQkJZm9yIChpID0gMjsgaSA8IFNXRF9CRVNUX09GRjsgaSsrKQorCQkJCWlmIChzLT5iZXN0X3Bvc1tpXSA+IDApCisJCQkJCXMtPmJlc3Rfb2ZmW2ldID0KKwkJCQkJCXN3ZF9wb3Myb2ZmKHMscy0+YmVzdF9wb3NbaV0tMSk7CisKKwkJCQllbHNlCisJCQkJCXMtPmJlc3Rfb2ZmW2ldID0gMDsKKwkJfQorI2VuZGlmCisJfQorCisJc3dkX3JlbW92ZV9ub2RlKHMscy0+cnApOworCisJLyogYWRkIGJwIGludG8gSEVBRDIgKi8KKwlrZXkgPSBIRUFEMihzLT5iLHMtPmJwKTsKKwlzLT5oZWFkMltrZXldID0gKHVuc2lnbmVkIGludCkocy0+YnApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAoraW5pdF9tYXRjaCAoIHN0cnVjdCB1Y2xfY29tcHJlc3MgKmMsIHN0cnVjdCB1Y2xfc3dkICpzLAorCWNvbnN0IHVpbnQ4X3QgKmRpY3QsIHVuc2lnbmVkIGludCBkaWN0X2xlbiwKKwl1aW50MzJfdCBmbGFncyApCit7CisJaW50IHI7CisJCisJYXNzZXJ0KCFjLT5pbml0KTsKKwljLT5pbml0ID0gMTsKKwkKKwlzLT5jID0gYzsKKwkKKwljLT5sYXN0X21fbGVuID0gYy0+bGFzdF9tX29mZiA9IDA7CisJCisJYy0+dGV4dHNpemUgPSBjLT5jb2Rlc2l6ZSA9IGMtPnByaW50Y291bnQgPSAwOworCWMtPmxpdF9ieXRlcyA9IGMtPm1hdGNoX2J5dGVzID0gYy0+cmVwX2J5dGVzID0gMDsKKwljLT5sYXp5ID0gMDsKKwkKKwlyID0gc3dkX2luaXQocyxkaWN0LGRpY3RfbGVuKTsKKwlpZiAociAhPSBVQ0xfRV9PSykKKwl7CisJCXN3ZF9leGl0KHMpOworCQlyZXR1cm4gcjsKKwl9CisJCisJcy0+dXNlX2Jlc3Rfb2ZmID0gKGZsYWdzICYgMSkgPyAxIDogMDsKKwlyZXR1cm4gVUNMX0VfT0s7Cit9CisKK3N0YXRpYyBpbnQKK2ZpbmRfbWF0Y2ggKCBzdHJ1Y3QgdWNsX2NvbXByZXNzICpjLCBzdHJ1Y3QgdWNsX3N3ZCAqcywKKwl1bnNpZ25lZCBpbnQgdGhpc19sZW4sIHVuc2lnbmVkIGludCBza2lwICkKK3sKKwlhc3NlcnQoYy0+aW5pdCk7CisJCisJaWYgKHNraXAgPiAwKQorCXsKKwkJYXNzZXJ0KHRoaXNfbGVuID49IHNraXApOworCQlzd2RfYWNjZXB0KHMsIHRoaXNfbGVuIC0gc2tpcCk7CisJCWMtPnRleHRzaXplICs9IHRoaXNfbGVuIC0gc2tpcCArIDE7CisJfQorCWVsc2UKKwl7CisJCWFzc2VydCh0aGlzX2xlbiA8PSAxKTsKKwkJYy0+dGV4dHNpemUgKz0gdGhpc19sZW4gLSBza2lwOworCX0KKwkKKwlzLT5tX2xlbiA9IFRIUkVTSE9MRDsKKyNpZmRlZiBTV0RfQkVTVF9PRkYKKwlpZiAocy0+dXNlX2Jlc3Rfb2ZmKQorCQltZW1zZXQocy0+YmVzdF9wb3MsMCxzaXplb2Yocy0+YmVzdF9wb3MpKTsKKyNlbmRpZgorCXN3ZF9maW5kYmVzdChzKTsKKwljLT5tX2xlbiA9IHMtPm1fbGVuOworCWMtPm1fb2ZmID0gcy0+bV9vZmY7CisJCisJc3dkX2dldGJ5dGUocyk7CisJCisJaWYgKHMtPmJfY2hhciA8IDApCisJeworCQljLT5sb29rID0gMDsKKwkJYy0+bV9sZW4gPSAwOworCQlzd2RfZXhpdChzKTsKKwl9CisJZWxzZQorCXsKKwkJYy0+bG9vayA9IHMtPmxvb2sgKyAxOworCX0KKwljLT5icCA9IGMtPmlwIC0gYy0+bG9vazsKKwkKKyNpZiAwCisJLyogYnJ1dGUgZm9yY2UgbWF0Y2ggc2VhcmNoICovCisJaWYgKGMtPm1fbGVuID4gVEhSRVNIT0xEICYmIGMtPm1fbGVuICsgMSA8PSBjLT5sb29rKQorCXsKKwkJY29uc3QgdWludDhfdCAqaXAgPSBjLT5icDsKKwkJY29uc3QgdWludDhfdCAqbSAgPSBjLT5icCAtIGMtPm1fb2ZmOworCQljb25zdCB1aW50OF90ICppbiA9IGMtPmluOworCQkKKwkJaWYgKGlwIC0gaW4gPiBOKQorCQkJaW4gPSBpcCAtIE47CisJCWZvciAoOzspCisJCXsKKwkJCXdoaWxlICgqaW4gIT0gKmlwKQorCQkJCWluKys7CisJCQlpZiAoaW4gPT0gaXApCisJCQkJYnJlYWs7CisJCQlpZiAoaW4gIT0gbSkKKwkJCQlpZiAobWVtY21wKGluLGlwLGMtPm1fbGVuKzEpID09IDApCisJCQkJCXByaW50ZigiJXAgJXAgJXAgJTVkXG4iLGluLGlwLG0sYy0+bV9sZW4pOworCisJCQlpbisrOworCQl9CisJfQorI2VuZGlmCisJCisJcmV0dXJuIFVDTF9FX09LOworfQorCisKK3N0YXRpYyBpbnQgYmJDb25maWcoc3RydWN0IHVjbF9jb21wcmVzcyAqYywgaW50IGVuZGlhbiwgaW50IGJpdHNpemUpCit7CisJaWYgKGVuZGlhbiAhPSAtMSkKKwl7CisJCWlmIChlbmRpYW4gIT0gMCkKKwkJCXJldHVybiBVQ0xfRV9FUlJPUjsKKwkJYy0+YmJfY19lbmRpYW4gPSBlbmRpYW47CisJfQorCWlmIChiaXRzaXplICE9IC0xKQorCXsKKwkJaWYgKGJpdHNpemUgIT0gOCAmJiBiaXRzaXplICE9IDE2ICYmIGJpdHNpemUgIT0gMzIgJiYgYml0c2l6ZSAhPSA2NCkKKwkJCXJldHVybiBVQ0xfRV9FUlJPUjsKKwkJYy0+YmJfY19zID0gYml0c2l6ZTsKKwkJYy0+YmJfY19zOCA9IGJpdHNpemUgLyA4OworCX0KKwljLT5iYl9iID0gMDsgYy0+YmJfayA9IDA7CisJYy0+YmJfcCA9IE5VTEw7CisJYy0+YmJfb3AgPSBOVUxMOworCXJldHVybiBVQ0xfRV9PSzsKK30KKworc3RhdGljIHZvaWQgYmJXcml0ZUJpdHMoc3RydWN0IHVjbF9jb21wcmVzcyAqYykKK3sKKwl1aW50OF90ICpwID0gYy0+YmJfcDsKKwl1aW50NjRfdCBiID0gYy0+YmJfYjsKKworCXBbMF0gPSAodWludDhfdCkoYiA+PiAgMCk7CisJaWYgKGMtPmJiX2NfcyA+PSAxNikKKwl7CisJCXBbMV0gPSAodWludDhfdCkoYiA+PiAgOCk7CisJCWlmIChjLT5iYl9jX3MgPj0gMzIpCisJCXsKKwkJCXBbMl0gPSAodWludDhfdCkoYiA+PiAxNik7CisJCQlwWzNdID0gKHVpbnQ4X3QpKGIgPj4gMjQpOworCQkJaWYgKGMtPmJiX2NfcyA9PSA2NCkKKwkJCXsKKwkJCQlwWzRdID0gKHVpbnQ4X3QpKGIgPj4gMzIpOworCQkJCXBbNV0gPSAodWludDhfdCkoYiA+PiA0MCk7CisJCQkJcFs2XSA9ICh1aW50OF90KShiID4+IDQ4KTsKKwkJCQlwWzddID0gKHVpbnQ4X3QpKGIgPj4gNTYpOworCQkJfQorCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGJiUHV0Qml0KHN0cnVjdCB1Y2xfY29tcHJlc3MgKmMsIHVuc2lnbmVkIGJpdCkKK3sKKwlhc3NlcnQoYml0ID09IDAgfHwgYml0ID09IDEpOworCWFzc2VydChjLT5iYl9rIDw9IGMtPmJiX2Nfcyk7CisKKwlpZiAoYy0+YmJfayA8IGMtPmJiX2NfcykKKwl7CisJCWlmIChjLT5iYl9rID09IDApCisJCXsKKwkJCWFzc2VydChjLT5iYl9wID09IE5VTEwpOworCQkJYy0+YmJfcCA9IGMtPmJiX29wOworCQkJYy0+YmJfb3AgKz0gYy0+YmJfY19zODsKKwkJfQorCQlhc3NlcnQoYy0+YmJfcCAhPSBOVUxMKTsKKwkJYXNzZXJ0KGMtPmJiX3AgKyBjLT5iYl9jX3M4IDw9IGMtPmJiX29wKTsKKworCQljLT5iYl9iID0gKGMtPmJiX2IgPDwgMSkgKyBiaXQ7CisJCWMtPmJiX2srKzsKKwl9CisJZWxzZQorCXsKKwkJYXNzZXJ0KGMtPmJiX3AgIT0gTlVMTCk7CisJCWFzc2VydChjLT5iYl9wICsgYy0+YmJfY19zOCA8PSBjLT5iYl9vcCk7CisKKwkJYmJXcml0ZUJpdHMoYyk7CisJCWMtPmJiX3AgPSBjLT5iYl9vcDsKKwkJYy0+YmJfb3AgKz0gYy0+YmJfY19zODsKKwkJYy0+YmJfYiA9IGJpdDsKKwkJYy0+YmJfayA9IDE7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGJiUHV0Qnl0ZShzdHJ1Y3QgdWNsX2NvbXByZXNzICpjLCB1bnNpZ25lZCBiKQoreworCS8qKnByaW50ZigicHV0Ynl0ZSAlcCAlcCAleCAgKCVkKVxuIiwgb3AsIGJiX3AsIHgsIGJiX2spOyovCisJYXNzZXJ0KGMtPmJiX3AgPT0gTlVMTCB8fCBjLT5iYl9wICsgYy0+YmJfY19zOCA8PSBjLT5iYl9vcCk7CisJKmMtPmJiX29wKysgPSAodWludDhfdCkoYik7Cit9CisKK3N0YXRpYyB2b2lkIGJiRmx1c2hCaXRzKHN0cnVjdCB1Y2xfY29tcHJlc3MgKmMsIHVuc2lnbmVkIGZpbGxlcl9iaXQpCit7CisJaWYgKGMtPmJiX2sgPiAwKQorCXsKKwkJYXNzZXJ0KGMtPmJiX2sgPD0gYy0+YmJfY19zKTsKKwkJd2hpbGUgKGMtPmJiX2sgIT0gYy0+YmJfY19zKQorCQkJYmJQdXRCaXQoYywgZmlsbGVyX2JpdCk7CisJCWJiV3JpdGVCaXRzKGMpOworCQljLT5iYl9rID0gMDsKKwl9CisJYy0+YmJfcCA9IE5VTEw7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQgY29kZV9wcmVmaXhfc3MxMShzdHJ1Y3QgdWNsX2NvbXByZXNzICpjLCB1aW50MzJfdCBpKQoreworCWlmIChpID49IDIpCisJeworCQl1aW50MzJfdCB0ID0gNDsKKwkJaSArPSAyOworCQlkbyB7CisJCQl0IDw8PSAxOworCQl9IHdoaWxlIChpID49IHQpOworCQl0ID4+PSAxOworCQlkbyB7CisJCQl0ID4+PSAxOworCQkJYmJQdXRCaXQoYywgKGkgJiB0KSA/IDEgOiAwKTsKKwkJCWJiUHV0Qml0KGMsIDApOworCQl9IHdoaWxlICh0ID4gMik7CisJfQorCWJiUHV0Qml0KGMsICh1bnNpZ25lZClpICYgMSk7CisJYmJQdXRCaXQoYywgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb2RlX21hdGNoKHN0cnVjdCB1Y2xfY29tcHJlc3MgKmMsIHVuc2lnbmVkIGludCBtX2xlbiwgY29uc3QgdW5zaWduZWQgaW50IG1fb2ZmKQorCit7CisJd2hpbGUgKG1fbGVuID4gYy0+Y29uZi5tYXhfbWF0Y2gpCisJeworCQljb2RlX21hdGNoKGMsIGMtPmNvbmYubWF4X21hdGNoIC0gMywgbV9vZmYpOworCQltX2xlbiAtPSBjLT5jb25mLm1heF9tYXRjaCAtIDM7CisJfQorCQorCWMtPm1hdGNoX2J5dGVzICs9IG1fbGVuOworCWlmIChtX2xlbiA+IGMtPnJlc3VsdFszXSkKKwkJYy0+cmVzdWx0WzNdID0gbV9sZW47CisJaWYgKG1fb2ZmID4gYy0+cmVzdWx0WzFdKQorCQljLT5yZXN1bHRbMV0gPSBtX29mZjsKKworCWJiUHV0Qml0KGMsIDApOworCisJaWYgKG1fb2ZmID09IGMtPmxhc3RfbV9vZmYpCisJeworCQliYlB1dEJpdChjLCAwKTsKKwkJYmJQdXRCaXQoYywgMSk7CisJfQorCWVsc2UKKwl7CisJCWNvZGVfcHJlZml4X3NzMTEoYywgMSArICgobV9vZmYgLSAxKSA+PiA4KSk7CisJCWJiUHV0Qnl0ZShjLCAodW5zaWduZWQpbV9vZmYgLSAxKTsKKwl9CisJbV9sZW4gPSBtX2xlbiAtIDEgLSAobV9vZmYgPiBNMl9NQVhfT0ZGU0VUKTsKKwlpZiAobV9sZW4gPj0gNCkKKwl7CisJCWJiUHV0Qml0KGMsMCk7CisJCWJiUHV0Qml0KGMsMCk7CisJCWNvZGVfcHJlZml4X3NzMTEoYywgbV9sZW4gLSA0KTsKKwl9CisJZWxzZQorCXsKKwkJYmJQdXRCaXQoYywgbV9sZW4gPiAxKTsKKwkJYmJQdXRCaXQoYywgKHVuc2lnbmVkKW1fbGVuICYgMSk7CisJfQorCisJYy0+bGFzdF9tX29mZiA9IG1fb2ZmOworfQorCitzdGF0aWMgdm9pZAorY29kZV9ydW4oc3RydWN0IHVjbF9jb21wcmVzcyAqYywgY29uc3QgdWludDhfdCAqaWksIHVuc2lnbmVkIGludCBsaXQpCit7CisJaWYgKGxpdCA9PSAwKQorCQlyZXR1cm47CisJYy0+bGl0X2J5dGVzICs9IGxpdDsKKwlpZiAobGl0ID4gYy0+cmVzdWx0WzVdKQorCQljLT5yZXN1bHRbNV0gPSBsaXQ7CisJZG8geworCQliYlB1dEJpdChjLCAxKTsKKwkJYmJQdXRCeXRlKGMsICppaSsrKTsKKwl9IHdoaWxlICgtLWxpdCA+IDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2xlbl9vZl9jb2RlZF9tYXRjaChzdHJ1Y3QgdWNsX2NvbXByZXNzICpjLCB1bnNpZ25lZCBpbnQgbV9sZW4sIHVuc2lnbmVkIGludAorCW1fb2ZmKQorCit7CisJaW50IGI7CisJaWYgKG1fbGVuIDwgMiB8fCAobV9sZW4gPT0gMiAmJiAobV9vZmYgPiBNMl9NQVhfT0ZGU0VUKSkKKwkJfHwgbV9vZmYgPiBjLT5jb25mLm1heF9vZmZzZXQpCisJCXJldHVybiAtMTsKKwlhc3NlcnQobV9vZmYgPiAwKTsKKwkKKwltX2xlbiA9IG1fbGVuIC0gMiAtIChtX29mZiA+IE0yX01BWF9PRkZTRVQpOworCQorCWlmIChtX29mZiA9PSBjLT5sYXN0X21fb2ZmKQorCQliID0gMSArIDI7CisJZWxzZQorCXsKKwkJYiA9IDEgKyAxMDsKKwkJbV9vZmYgPSAobV9vZmYgLSAxKSA+PiA4OworCQl3aGlsZSAobV9vZmYgPiAwKQorCQl7CisJCQliICs9IDI7CisJCQltX29mZiA+Pj0gMTsKKwkJfQorCX0KKworCWIgKz0gMjsKKwlpZiAobV9sZW4gPCAzKQorCQlyZXR1cm4gYjsKKwltX2xlbiAtPSAzOworCisJZG8geworCQliICs9IDI7CisJCW1fbGVuID4+PSAxOworCX0gd2hpbGUgKG1fbGVuID4gMCk7CisKKwlyZXR1cm4gYjsKK30KKworaW50IHVjbF9ucnYyYl85OV9jb21wcmVzcygKKwljb25zdCB1aW50OF90ICppbiwgdW5zaWduZWQgbG9uZyBpbl9sZW4sCisJdWludDhfdCAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRfbGVuLAorCXVuc2lnbmVkIGludCAqcmVzdWx0KQoreworCWNvbnN0IHVpbnQ4X3QgKmlpOworCXVuc2lnbmVkIGludCBsaXQ7CisJdW5zaWduZWQgaW50IG1fbGVuLCBtX29mZjsKKwlzdHJ1Y3QgdWNsX2NvbXByZXNzIGNfYnVmZmVyOworCXN0cnVjdCB1Y2xfY29tcHJlc3MgKiBjb25zdCBjID0gJmNfYnVmZmVyOworCXN0cnVjdCB1Y2xfc3dkICpzd2Q7CisJdW5zaWduZWQgaW50IHJlc3VsdF9idWZmZXJbMTZdOworCWludCByOworCisvKiBtYXggY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgU0NfVFJZX0xBWlkgICAgMgorI2RlZmluZSBTQ19HT09EX0xFTkdUSCBGCisjZGVmaW5lIFNDX01BWF9MQVpZICAgIEYKKyNkZWZpbmUgU0NfTklDRV9MRU5HVEggRgorI2RlZmluZSBTQ19NQVhfQ0hBSU4gICA0MDk2CisjZGVmaW5lIFNDX0ZMQUdTICAgICAgIDEKKyNkZWZpbmUgU0NfTUFYX09GRlNFVCAgTgorCQorCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKwljLT5pcCA9IGMtPmluID0gaW47CisJYy0+aW5fZW5kID0gaW4gKyBpbl9sZW47CisJYy0+b3V0ID0gb3V0OworCWMtPnJlc3VsdCA9IHJlc3VsdCA/IHJlc3VsdCA6IHJlc3VsdF9idWZmZXI7CisJbWVtc2V0KGMtPnJlc3VsdCwgMCwgMTYqc2l6ZW9mKCpjLT5yZXN1bHQpKTsKKwljLT5yZXN1bHRbMF0gPSBjLT5yZXN1bHRbMl0gPSBjLT5yZXN1bHRbNF0gPSBVSU5UX01BWDsKKwlyZXN1bHQgPSBOVUxMOworCW1lbXNldCgmYy0+Y29uZiwgMHhmZiwgc2l6ZW9mKGMtPmNvbmYpKTsKKwlyID0gYmJDb25maWcoYywgRU5ESUFOLCBCSVRTSVpFKTsKKwlpZiAociA9PSAwKQorCQlyID0gYmJDb25maWcoYywgYy0+Y29uZi5iYl9lbmRpYW4sIGMtPmNvbmYuYmJfc2l6ZSk7CisJaWYgKHIgIT0gMCkKKwkJcmV0dXJuIFVDTF9FX0lOVkFMSURfQVJHVU1FTlQ7CisJYy0+YmJfb3AgPSBvdXQ7CisJCisJaWkgPSBjLT5pcDsgICAgICAgICAgICAgLyogcG9pbnQgdG8gc3RhcnQgb2YgbGl0ZXJhbCBydW4gKi8KKwlsaXQgPSAwOworCQorCisJc3dkID0gKHN0cnVjdCB1Y2xfc3dkICopIG1hbGxvYyhzaXplb2YoKnN3ZCkpOworCWlmICghc3dkKQorCQlyZXR1cm4gVUNMX0VfT1VUX09GX01FTU9SWTsKKworCXN3ZC0+ZiA9IEY7CisJc3dkLT5uID0gTjsKKwlpZiAoaW5fbGVuID49IDI1NiAmJiBpbl9sZW4gPCBzd2QtPm4pCisJCXN3ZC0+biA9IGluX2xlbjsKKwlpZiAoc3dkLT5mIDwgOCB8fCBzd2QtPm4gPCAyNTYpCisJCXJldHVybiBVQ0xfRV9JTlZBTElEX0FSR1VNRU5UOworCisJciA9IGluaXRfbWF0Y2goYyxzd2QsTlVMTCwwLCBTQ19GTEFHUyk7CisJaWYgKHIgIT0gVUNMX0VfT0spCisJeworCQlmcmVlKHN3ZCk7CisJCXJldHVybiByOworCX0KKwlpZiAoU0NfTUFYX0NIQUlOID4gMCkKKwkJc3dkLT5tYXhfY2hhaW4gPSBTQ19NQVhfQ0hBSU47CisJaWYgKFNDX05JQ0VfTEVOR1RIID4gMCkKKwkJc3dkLT5uaWNlX2xlbmd0aCA9IFNDX05JQ0VfTEVOR1RIOworCWlmIChjLT5jb25mLm1heF9tYXRjaCA8IHN3ZC0+bmljZV9sZW5ndGgpCisJCXN3ZC0+bmljZV9sZW5ndGggPSBjLT5jb25mLm1heF9tYXRjaDsKKwkKKwljLT5sYXN0X21fb2ZmID0gMTsKKwlyID0gZmluZF9tYXRjaChjLHN3ZCwwLDApOworCWlmIChyICE9IFVDTF9FX09LKQorCQlyZXR1cm4gcjsKKwl3aGlsZSAoYy0+bG9vayA+IDApCisJeworCQl1bnNpZ25lZCBpbnQgYWhlYWQ7CisJCXVuc2lnbmVkIGludCBtYXhfYWhlYWQ7CisJCWludCBsMSwgbDI7CisJCQorCQljLT5jb2Rlc2l6ZSA9IGMtPmJiX29wIC0gb3V0OworCQkKKwkJbV9sZW4gPSBjLT5tX2xlbjsKKwkJbV9vZmYgPSBjLT5tX29mZjsKKwkJCisJCWFzc2VydChjLT5icCA9PSBjLT5pcCAtIGMtPmxvb2spOworCQlhc3NlcnQoYy0+YnAgPj0gaW4pOworCQlpZiAobGl0ID09IDApCisJCQlpaSA9IGMtPmJwOworCQlhc3NlcnQoaWkgKyBsaXQgPT0gYy0+YnApOworCQlhc3NlcnQoc3dkLT5iX2NoYXIgPT0gKihjLT5icCkpOworCQkKKwkJaWYgKG1fbGVuIDwgMiB8fCAobV9sZW4gPT0gMiAmJiAobV9vZmYgPiBNMl9NQVhfT0ZGU0VUKSkKKwkJCXx8IG1fb2ZmID4gYy0+Y29uZi5tYXhfb2Zmc2V0KQorCQl7CisJCQkvKiBhIGxpdGVyYWwgKi8KKwkJCWxpdCsrOworCQkJc3dkLT5tYXhfY2hhaW4gPSBTQ19NQVhfQ0hBSU47CisJCQlyID0gZmluZF9tYXRjaChjLHN3ZCwxLDApOworCQkJYXNzZXJ0KHIgPT0gMCk7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJLyogYSBtYXRjaCAqLworCQlhc3NlcnRfbWF0Y2goc3dkLG1fbGVuLG1fb2ZmKTsKKwkJCisJCS8qIHNoYWxsIHdlIHRyeSBhIGxhenkgbWF0Y2ggPyAqLworCQlhaGVhZCA9IDA7CisJCWlmIChTQ19UUllfTEFaWSA8PSAwIHx8IG1fbGVuID49IFNDX01BWF9MQVpZIHx8IG1fb2ZmID09CisJCQljLT5sYXN0X21fb2ZmKQorCisJCXsKKwkJCS8qIG5vICovCisJCQlsMSA9IDA7CisJCQltYXhfYWhlYWQgPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogeWVzLCB0cnkgYSBsYXp5IG1hdGNoICovCisJCQlsMSA9IGxlbl9vZl9jb2RlZF9tYXRjaChjLG1fbGVuLG1fb2ZmKTsKKwkJCWFzc2VydChsMSA+IDApOworCQkJbWF4X2FoZWFkID0gU0NfVFJZX0xBWlk7CisJCQlpZiAoKG1fbGVuIC0gMSkgPCBtYXhfYWhlYWQpIHsKKwkJCQltYXhfYWhlYWQgPSBtX2xlbiAtMTsKKwkJCX0KKwkJfQorCQkKKwkJd2hpbGUgKGFoZWFkIDwgbWF4X2FoZWFkICYmIGMtPmxvb2sgPiBtX2xlbikKKwkJeworCQkJaWYgKG1fbGVuID49IFNDX0dPT0RfTEVOR1RIKQorCQkJCXN3ZC0+bWF4X2NoYWluID0gU0NfTUFYX0NIQUlOID4+IDI7CisJCQllbHNlCisJCQkJc3dkLT5tYXhfY2hhaW4gPSBTQ19NQVhfQ0hBSU47CisJCQlyID0gZmluZF9tYXRjaChjLHN3ZCwxLDApOworCQkJYWhlYWQrKzsKKwkJCQorCQkJYXNzZXJ0KHIgPT0gMCk7CisJCQlhc3NlcnQoYy0+bG9vayA+IDApOworCQkJYXNzZXJ0KGlpICsgbGl0ICsgYWhlYWQgPT0gYy0+YnApOworCQkJCisJCQlpZiAoYy0+bV9sZW4gPCAyKQorCQkJCWNvbnRpbnVlOworCQkJbDIgPSBsZW5fb2ZfY29kZWRfbWF0Y2goYyxjLT5tX2xlbixjLT5tX29mZik7CisJCQlpZiAobDIgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGwxICsgKGludCkoYWhlYWQgKyBjLT5tX2xlbiAtIG1fbGVuKSAqIDUgPiBsMiArCisJCQkJKGludCkoYWhlYWQpICogOSkKKwkJCXsKKwkJCQljLT5sYXp5Kys7CisJCQkJYXNzZXJ0X21hdGNoKHN3ZCxjLT5tX2xlbixjLT5tX29mZik7CisJCQkJbGl0ICs9IGFoZWFkOworCQkJCWFzc2VydChpaSArIGxpdCA9PSBjLT5icCk7CisJCQkJZ290byBsYXp5X21hdGNoX2RvbmU7CisJCQl9CisJCX0KKwkJCisJCWFzc2VydChpaSArIGxpdCArIGFoZWFkID09IGMtPmJwKTsKKwkJCisJCS8qIDEgLSBjb2RlIHJ1biAqLworCQljb2RlX3J1bihjLGlpLGxpdCk7CisJCWxpdCA9IDA7CisJCQorCQkvKiAyIC0gY29kZSBtYXRjaCAqLworCQljb2RlX21hdGNoKGMsbV9sZW4sbV9vZmYpOworCQlzd2QtPm1heF9jaGFpbiA9IFNDX01BWF9DSEFJTjsKKwkJciA9IGZpbmRfbWF0Y2goYyxzd2QsbV9sZW4sMSthaGVhZCk7CisJCWFzc2VydChyID09IDApOworCQkKKwlsYXp5X21hdGNoX2RvbmU6IDsKKwl9CisJCisJLyogc3RvcmUgZmluYWwgcnVuICovCisJY29kZV9ydW4oYyxpaSxsaXQpOworCQorCS8qIEVPRiAqLworCWJiUHV0Qml0KGMsIDApOworCWNvZGVfcHJlZml4X3NzMTEoYywgMHgxMDAwMDAwVSk7CisJYmJQdXRCeXRlKGMsIDB4ZmYpOworCisJYmJGbHVzaEJpdHMoYywgMCk7CisJCisJYXNzZXJ0KGMtPnRleHRzaXplID09IGluX2xlbik7CisJYy0+Y29kZXNpemUgPSBjLT5iYl9vcCAtIG91dDsKKwkqb3V0X2xlbiA9IGMtPmJiX29wIC0gb3V0OworCQorI2lmIDAKKwlwcmludGYoIiU3bGQgJTdsZCAtPiAlN2xkICAgJTdsZCAlN2xkICAgJWxkICAobWF4OiAlZCAlZCAlZClcbiIsCisJCShsb25nKSBjLT50ZXh0c2l6ZSwgKGxvbmcpIGluX2xlbiwgKGxvbmcpIGMtPmNvZGVzaXplLAorCQljLT5tYXRjaF9ieXRlcywgYy0+bGl0X2J5dGVzLCAgYy0+bGF6eSwKKwkJYy0+cmVzdWx0WzFdLCBjLT5yZXN1bHRbM10sIGMtPnJlc3VsdFs1XSk7CisjZW5kaWYKKwlhc3NlcnQoYy0+bGl0X2J5dGVzICsgYy0+bWF0Y2hfYnl0ZXMgPT0gaW5fbGVuKTsKKwkKKwlzd2RfZXhpdChzd2QpOworCWZyZWUoc3dkKTsKKworCXJldHVybiBVQ0xfRV9PSzsKK30KKworCit2b2lkIEVuY29kZSh2b2lkKSAgLyogY29tcHJlc3Npb24gKi8KK3sKKwl1aW50OF90ICppbiwgKm91dDsKKwl1bnNpZ25lZCBsb25nIGluX2xlbiwgb3V0X2xlbjsKKwl1aW50MzJfdCB0dzsKKwlpbnQgcjsKKwlmc2VlayhpbmZpbGUsIDAsIFNFRUtfRU5EKTsKKwlpbl9sZW4gPSBmdGVsbChpbmZpbGUpOworI2lmZGVmIFZFUkJPU0UKKwlpZiAoKHNpZ25lZCBsb25nKWluX2xlbiA8IDApCisJCUZwcmludGYoKHN0ZGVyciwgIkVycm5vOiAlZCIsIGVycm5vKSk7CisjZW5kaWYKKyNpZiBVQ0xQQUNLX0NPTVBBVAorCXsKKwkJdWludDhfdCBieXRlOworCQlpZiAoZndyaXRlKG1hZ2ljLCBzaXplb2YobWFnaWMpLCAxLCBvdXRmaWxlKSAhPSAxKQorCQkJRXJyb3IoIkNhbid0IHdyaXRlLiIpOworCQl0dyA9IGh0b25sKDApOyAvKiBmbGFncyAqLworCQlpZiAoZndyaXRlKCZ0dywgc2l6ZW9mKHR3KSwgMSwgb3V0ZmlsZSkgIT0gMSkKKwkJCUVycm9yKCJDYW4ndCB3cml0ZS4iKTsKKwkJYnl0ZSA9IDB4MmI7CQkvKiBtZXRob2QgKi8KKwkJaWYgKGZ3cml0ZSgmYnl0ZSwgc2l6ZW9mKGJ5dGUpLCAxLCBvdXRmaWxlKSAhPSAxKQorCQkJRXJyb3IoIkNhbid0IHdyaXRlLiIpOworCQlieXRlID0gMTA7CQkvKiBsZXZlbCAqLworCQlpZiAoZndyaXRlKCZieXRlLCBzaXplb2YoYnl0ZSksIDEsIG91dGZpbGUpICE9IDEpCisJCQlFcnJvcigiQ2FuJ3Qgd3JpdGUuIik7CisJCXR3ID0gaHRvbmwoMjU2KjEwMjQpOwkJLyogYmxvY2tfc2l6ZSAqLworCQlpZiAoZndyaXRlKCZ0dywgc2l6ZW9mKHR3KSwgMSwgb3V0ZmlsZSkgIT0gMSkKKwkJCUVycm9yKCJDYW4ndCB3cml0ZS4iKTsKKwkJdHcgPSBodG9ubChpbl9sZW4pOworCQlpZiAoZndyaXRlKCZ0dywgc2l6ZW9mKHR3KSwgMSwgb3V0ZmlsZSkgIT0gMSkKKwkJCUVycm9yKCJDYW4ndCB3cml0ZS4iKTsJLyogb3V0cHV0IHNpemUgb2YgdGV4dCAqLworCX0KKyNlbHNlCisJdHcgPSBob3N0X3RvX2k4NnVsKGluX2xlbik7CisJaWYgKGZ3cml0ZSgmdHcsIHNpemVvZih0dyksIDEsIG91dGZpbGUpICE9IDEpCisJCUVycm9yKCJDYW4ndCB3cml0ZS4iKTsJLyogb3V0cHV0IHNpemUgb2YgdGV4dCAqLworI2VuZGlmCQorCWlmIChpbl9sZW4gPT0gMCkKKwkJcmV0dXJuOworCXJld2luZChpbmZpbGUpOworCisJaW4gPSBtYWxsb2MoaW5fbGVuKTsKKwlvdXRfbGVuID0gaW5fbGVuICsgKGluX2xlbi84KSArIDI1NjsKKwlvdXQgPSBtYWxsb2Mob3V0X2xlbik7CisJaWYgKCFpbiB8fCAhb3V0KSB7CisJCUVycm9yKCJDYW4ndCBtYWxsb2MiKTsKKwl9CisJaWYgKGZyZWFkKGluLCBpbl9sZW4sIDEsIGluZmlsZSkgIT0gMSkgeworCQlFcnJvcigiQ2FuJ3QgcmVhZCIpOworCX0KKwlyID0gdWNsX25ydjJiXzk5X2NvbXByZXNzKGluLCBpbl9sZW4sIG91dCwgJm91dF9sZW4sIDAgKTsKKwlpZiAociAhPSBVQ0xfRV9PSykKKwkJRXJyb3IoIkNvbXByZXNzaW9uIGZhaWx1cmVcbiIpOworI2lmIFVDTFBBQ0tfQ09NUEFUCisJdHcgPSBodG9ubChvdXRfbGVuKTsKKwlpZiAoZndyaXRlKCZ0dywgc2l6ZW9mKHR3KSwgMSwgb3V0ZmlsZSkgIT0gMSkKKwkJRXJyb3IoIkNhbid0IHdyaXRlLiIpOwkvKiBmaWxlIHNpemUgb2YgdGV4dCAqLworCisjZW5kaWYKKwlpZiAoZndyaXRlKG91dCwgb3V0X2xlbiwgMSwgb3V0ZmlsZSkgIT0gMSkgeworCQlFcnJvcigiV3JpdGUgZXJyb3JcbiIpOworCX0KKyNpZiBVQ0xQQUNLX0NPTVBBVAorCXR3ID0gaHRvbmwoMCk7IC8qIEVPRiBtYXJrZXIgKi8KKwlpZiAoZndyaXRlKCZ0dywgc2l6ZW9mKHR3KSwgMSwgb3V0ZmlsZSkgIT0gMSkKKwkJRXJyb3IoIkNhbid0IHdyaXRlLiIpOworCisjZW5kaWYKKworI2lmZGVmCUxPTkdfUkVQT1JUCisJRnByaW50Zigoc3Rkb3V0LCAiaW5wdXQgc2l6ZSAgICAlbGQgYnl0ZXNcbiIsIGluX2xlbikpOworCUZwcmludGYoKHN0ZG91dCwgIm91dHB1dCBzaXplICAgJWxkIGJ5dGVzXG4iLCBvdXRfbGVuKSk7CisJRnByaW50Zigoc3Rkb3V0LCAiaW5wdXQvb3V0cHV0ICAlLjNmXG4iLCAoZG91YmxlKWluX2xlbiAvIG91dF9sZW4pKTsKKyNlbHNlCisJRnByaW50Zigoc3Rkb3V0LCAiaW5wdXQvb3V0cHV0ID0gJWxkLyVsZCA9ICUuM2ZcbiIsIGluX2xlbiwgb3V0X2xlbiwKKwkJKGRvdWJsZSlpbl9sZW4gLyBvdXRfbGVuKSk7CisjZW5kaWYKKwkKK30KKworI2VuZGlmCisKKyNpZmRlZiBERUNPREUKKworI2RlZmluZSBHRVRCSVRfOChiYiwgc3JjLCBpbGVuKSBcCisgICAgKCgoYmIgPSBiYiAmIDB4N2YgPyBiYioyIDogKCh1bnNpZ25lZClzcmNbaWxlbisrXSoyKzEpKSA+PiA4KSAmIDEpCisKKyNkZWZpbmUgR0VUQklUX0xFMTYoYmIsIHNyYywgaWxlbikgXAorICAgIChiYio9MixiYiYweGZmZmYgPyAoYmI+PjE2KSYxIDogKGlsZW4rPTIsKChiYj0oc3JjW2lsZW4tMl0rc3JjW2lsZW4tMV0qMjU2dSkqMisxKT4+MTYpJjEpKQorCisjZGVmaW5lIEdFVEJJVF9MRTMyKGJiLCBzcmMsIGlsZW4pIFwKKyAgICAoYmMgPiAwID8gKChiYj4+LS1iYykmMSkgOiAoYmM9MzEsXAorICAgIGJiPSooY29uc3QgdWludDMyX3QgKikoKHNyYykraWxlbiksaWxlbis9NCwoYmI+PjMxKSYxKSkKKworI2RlZmluZSBHRVRCSVRfTEU2NChiYiwgc3JjLCBpbGVuKSBcCisgICAgKGJjID4gMCA/ICgoYmI+Pi0tYmMpJjEpIDogKGJjPTYzLCBcCisgICAgYmI9Kihjb25zdCB1aW50NjRfdCAqKSgoc3JjKStpbGVuKSxpbGVuKz04LChiYj4+NjMpJjEpKQorCisjaWYgRU5ESUFOID09IDAgJiYgQklUU0laRSA9PSA4CisjZGVmaW5lIEdFVEJJVChiYiwgc3JjLCBpbGVuKSBHRVRCSVRfOChiYiwgc3JjLCBpbGVuKQorI2VuZGlmCisjaWYgRU5ESUFOID09IDAgJiYgQklUU0laRSA9PSAxNgorI2RlZmluZSBHRVRCSVQoYmIsIHNyYywgaWxlbikgR0VUQklUX0xFMTYoYmIsIHNyYywgaWxlbikKKyNlbmRpZgorI2lmIEVORElBTiA9PSAwICYmIEJJVFNJWkUgPT0gMzIKKyNkZWZpbmUgR0VUQklUKGJiLCBzcmMsIGlsZW4pIEdFVEJJVF9MRTMyKGJiLCBzcmMsIGlsZW4pCisjZW5kaWYKKyNpZiBFTkRJQU4gPT0gMCAmJiBCSVRTSVpFID09IDY0CisjZGVmaW5lIEdFVEJJVChiYiwgc3JjLCBpbGVuKSBHRVRCSVRfTEU2NChiYiwgc3JjLCBpbGVuKQorI2VuZGlmCisjaWZuZGVmIEdFVEJJVAorI2Vycm9yICJCYWQgQ29tYmluYXRpb24gb2YgRU5ESUFOIGFuZCBCSVRTSVpFIHZhbHVlcyBzcGVjaWZpZWQiCisjZW5kaWYKKworI3VuZGVmIFNBRkUKKworI2lmZGVmIFNBRkUKKyNkZWZpbmUgRkFJTCh4LHIpICAgaWYgKHgpIHsgRXJyb3Iocik7IH0KKyNlbHNlCisjZGVmaW5lIEZBSUwoeCxyKQorI2VuZGlmCisKK3ZvaWQgRGVjb2RlKHZvaWQpICAvKiByZWNvdmVyICovCit7CisJdWludDMyX3QgdHc7CisJdWludDhfdCAqc3JjLCAqZHN0OworCXVuc2lnbmVkIGxvbmcgbWF4X3NyY19sZW4sIHNyY19sZW4sIGRzdF9sZW47CisJdW5zaWduZWQgbG9uZyBpbGVuID0gMCwgb2xlbiA9IDAsIGxhc3RfbV9vZmYgPSAgMTsKKyNpZiBCSVRTSVpFIDw9IDMyCisJdWludDMyX3QgYmIgPSAwOworI2VsaWYgQklUU0laRSA9PSA2NAorCXVpbnQ2NF90IGJiID0gMDsKKyNlbmRpZgorCXVuc2lnbmVkIGJjID0gMDsKKyNpZiBVQ0xQQUNLX0NPTVBBVAorCWlmIChmc2VlayhpbmZpbGUsIHNpemVvZihtYWdpYykgKyBzaXplb2YodHcpICsgMSArIDEgKyBzaXplb2YodHcpLAorCQlTRUVLX1NFVCkgIT0gMCkKKworCQlFcnJvcigiU2VlayBFcnJvciIpOworCWlmIChmcmVhZCgmdHcsIHNpemVvZih0dyksIDEsIGluZmlsZSkgPCAxKQorCQlFcnJvcigiQ2FuJ3QgcmVhZCIpOyAvKiByZWFkIHNpemUgb2YgdGV4dCAqLworCWRzdF9sZW4gPSBudG9obCh0dyk7CisJaWYgKGZyZWFkKCZ0dywgc2l6ZW9mKHR3KSwgMSwgaW5maWxlKSA8IDEpCisJCUVycm9yKCJDYW4ndCByZWFkIik7IC8qIHJlYWQgc2l6ZSBvZiBmaWxlICovCisJbWF4X3NyY19sZW4gPSBudG9obCh0dyk7CisjZWxzZQorCWlmIChmcmVhZCgmdHcsIHNpemVvZih0dyksIDEsIGluZmlsZSkgPCAxKQorCQlFcnJvcigiQ2FuJ3QgcmVhZCIpOyAvKiByZWFkIHNpemUgb2YgdGV4dCAqLworCWRzdF9sZW4gPSBpODZ1bF90b19ob3N0KHR3KTsKKwltYXhfc3JjX2xlbiA9IGRzdF9sZW4gKyAoZHN0X2xlbi84KSArIDI1NjsKKyNlbmRpZgorCWlmIChkc3RfbGVuID09IDApCisJCXJldHVybjsKKwlkc3QgPSBtYWxsb2MoZHN0X2xlbik7CisJaWYgKCFkc3QpCisJCUVycm9yKCJDYW4ndCBtYWxsb2MiKTsKKwlzcmMgPSBtYWxsb2MobWF4X3NyY19sZW4pOworCWlmICghc3JjKQorCQlFcnJvcigiQ2FuJ3QgbWFsbG9jIik7CisJc3JjX2xlbiA9IGZyZWFkKHNyYywgMSwgbWF4X3NyY19sZW4sIGluZmlsZSk7CisJaWYgKHNyY19sZW4gPD0gMCkgCisJCUVycm9yKCJDYW4ndCByZWFkIik7CisKKwlmb3IoOzspIHsKKwkJdW5zaWduZWQgaW50IG1fb2ZmLCBtX2xlbjsKKwkJd2hpbGUoR0VUQklUKGJiLCBzcmMsIGlsZW4pKSB7CisJCQlGQUlMKGlsZW4gPj0gc3JjX2xlbiwgImlucHV0IG92ZXJydW4iKTsKKwkJCUZBSUwob2xlbiA+PSBkc3RfbGVuLCAib3V0cHV0ICBvdmVycnVuIik7CisJCQlkc3Rbb2xlbisrXSA9IHNyY1tpbGVuKytdOworCQl9CisJCW1fb2ZmID0gMTsKKwkJZG8geworCQkJbV9vZmYgPSBtX29mZioyICsgR0VUQklUKGJiLCBzcmMsIGlsZW4pOworCQkJRkFJTChpbGVuID49IHNyY19sZW4sICJpbnB1dCBvdmVycnVuIik7CisJCQlGQUlMKG1fb2ZmID4gMHhmZmZmZmZVICszLCAibG9va2JlaGluZCBvdmVycnVuIik7CisJCX0gd2hpbGUgKCFHRVRCSVQoYmIsIHNyYywgaWxlbikpOworCQlpZiAobV9vZmYgPT0gMikKKwkJeworCQkJbV9vZmYgPSBsYXN0X21fb2ZmOworCQl9CisJCWVsc2UKKwkJeworCQkJRkFJTChpbGVuID49IHNyY19sZW4sICJpbnB1dCBvdmVycnVuIik7CisJCQltX29mZiA9IChtX29mZiAtIDMpKjI1NiArIHNyY1tpbGVuKytdOworCQkJaWYgKG1fb2ZmID09IDB4ZmZmZmZmZmZVKQorCQkJCWJyZWFrOworCQkJbGFzdF9tX29mZiA9ICsrbV9vZmY7CisJCX0KKwkJbV9sZW4gPSBHRVRCSVQoYmIsIHNyYywgaWxlbik7CisJCW1fbGVuID0gbV9sZW4qMiArIEdFVEJJVChiYiwgc3JjLCBpbGVuKTsKKwkJaWYgKG1fbGVuID09IDApIAorCQl7CisJCQltX2xlbisrOworCQkJZG8geworCQkJCW1fbGVuID0gbV9sZW4qMiArIEdFVEJJVChiYiwgc3JjLCBpbGVuKTsKKwkJCQlGQUlMKGlsZW4gPj0gc3JjX2xlbiwgImlucHV0IG92ZXJydW4iKTsKKwkJCQlGQUlMKG1fbGVuID49IGRzdF9sZW4sICJvdXRwdXQgb3ZlcnJ1biIpOworCQkJfSB3aGlsZSghR0VUQklUKGJiLCBzcmMsIGlsZW4pKTsKKwkJCW1fbGVuICs9IDI7CisJCX0KKwkJbV9sZW4gKz0gKG1fb2ZmID4gMHhkMDApOworCQlGQUlMKG9sZW4gKyBtX2xlbiA+IGRzdF9sZW4sICJvdXRwdXQgb3ZlcnJ1biIpOworCQlGQUlMKG1fb2ZmID4gb2xlbiwgImxvb2tiZWluZCBvdmVycnVuIik7CisJCXsKKwkJCWNvbnN0IHVpbnQ4X3QgKm1fcG9zOworCQkJbV9wb3MgPSBkc3QgKyBvbGVuIC0gbV9vZmY7CisJCQlkc3Rbb2xlbisrXSA9ICptX3BvcysrOworCQkJZG8geworCQkJCWRzdFtvbGVuKytdID0gKm1fcG9zKys7CisJCQl9IHdoaWxlKC0tbV9sZW4gPiAwKTsKKwkJfQorCX0KKwlGQUlMKGlsZW4gPCBzcmNfbGVuLCAiaW5wdXQgbm90IGNvbnN1bWVkIik7CisJRkFJTChpbGVuID4gc3JjX2xlbiwgImlucHV0IG92ZXJydW4iKTsKKwlhc3NlcnQoaWxlbiA9PSBzcmNfbGVuKTsKKwlGcHJpbnRmKChzdGRlcnIsICIlMTJsZFxuIiwgb2xlbikpOworCWlmIChkc3RfbGVuICE9IG9sZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICJsZW5ndGggIT0gZXhwZWN0ZWQgbGVuZ3RoXG4iKTsKKwl9CisJaWYgKGZ3cml0ZShkc3QsIG9sZW4sIDEsIG91dGZpbGUpICE9IDEpCisJCUVycm9yKCJXcml0ZSBlcnJvclxuIik7CisJZnJlZShzcmMpOworCWZyZWUoZHN0KTsKK30KKyNlbmRpZgorCisjaWZkZWYgTUFJTgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICAqczsKKwlGSUxFICAqZjsKKwlpbnQgICAgYzsKKwkKKwlpZiAoYXJnYyA9PSAyKSB7CisJCW91dGZpbGUgPSBzdGRvdXQ7CisJCWlmICgoZiA9IHRtcGZpbGUoKSkgPT0gTlVMTCkgeworCQkJcGVycm9yKCJ0bXBmaWxlIik7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJCXdoaWxlICgoYyA9IGdldGNoYXIoKSkgIT0gRU9GKQorCQkJZnB1dGMoYywgZik7CisJCXJld2luZChpbmZpbGUgPSBmKTsKKwl9CisJZWxzZSBpZiAoYXJnYyAhPSA0KSB7CisJCUZwcmludGYoKHN0ZGVyciwgIiducnYyYiBlIGZpbGUxIGZpbGUyJyBlbmNvZGVzIGZpbGUxIGludG8gZmlsZTIuXG4iCisJCQkiJ25ydjJiIGQgZmlsZTIgZmlsZTEnIGRlY29kZXMgZmlsZTIgaW50byBmaWxlMS5cbiIpKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJaWYgKGFyZ2MgPT0gNCkgeworCQlpZiAoKHMgPSBhcmd2WzFdLCBzWzFdIHx8IHN0cnBicmsocywgIkRFZGUiKSA9PSBOVUxMKQorCQkJfHwgKHMgPSBhcmd2WzJdLCAoaW5maWxlICA9IGZvcGVuKHMsICJyYiIpKSA9PSBOVUxMKQorCQkJfHwgKHMgPSBhcmd2WzNdLCAob3V0ZmlsZSA9IGZvcGVuKHMsICJ3YiIpKSA9PSBOVUxMKSkgeworCQkJRnByaW50Zigoc3RkZXJyLCAiPz8/ICVzXG4iLCBzKSk7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJfQorCWlmICh0b3VwcGVyKCphcmd2WzFdKSA9PSAnRScpCisJCUVuY29kZSgpOworCWVsc2UKKwkJRGVjb2RlKCk7CisJZmNsb3NlKGluZmlsZSk7CisJZmNsb3NlKG91dGZpbGUpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvcGFkaW1nLnBsIGIvZ3B4ZS9zcmMvdXRpbC9wYWRpbWcucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQyMWFhZgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL3V0aWwvcGFkaW1nLnBsCkBAIC0wLDAgKzEsNDQgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEdldG9wdDo6TG9uZzsKK3VzZSBGY250bDsKKworbXkgJHZlcmJvc2l0eSA9IDA7CitteSAkYmxrc2l6ZSA9IDUxMjsKK215ICRieXRlID0gMDsKKworbXkgJW9wdHMgPSAoCisgICd2ZXJib3NlfHYrJyA9PiBzdWIgeyAkdmVyYm9zaXR5Kys7IH0sCisgICdxdWlldHxxKycgPT4gc3ViIHsgJHZlcmJvc2l0eS0tOyB9LAorICAnYmxrc2l6ZXxzPW8nID0+IHN1YiB7ICRibGtzaXplID0gJF9bMV07IH0sCisgICdieXRlfGI9bycgPT4gc3ViIHsgJGJ5dGUgPSAkX1sxXTsgfSwKKyk7CisKK0dldG9wdDo6TG9uZzo6Q29uZmlndXJlICggJ2J1bmRsaW5nJywgJ2F1dG9fYWJicmV2JyApOworR2V0T3B0aW9ucyAoICVvcHRzICkgb3IgZGllICJDb3VsZCBub3QgcGFyc2UgY29tbWFuZC1saW5lIG9wdGlvbnNcbiI7CisKK3doaWxlICggbXkgJGZpbGVuYW1lID0gc2hpZnQgKSB7CisgIGRpZSAiJGZpbGVuYW1lIGlzIG5vdCBhIGZpbGVcbiIgdW5sZXNzIC1mICRmaWxlbmFtZTsKKyAgbXkgJG9sZHNpemUgPSAtcyAkZmlsZW5hbWU7CisgIG15ICRwYWRzaXplID0gKCAoIC0kb2xkc2l6ZSApICUgJGJsa3NpemUgKTsKKyAgbXkgJG5ld3NpemUgPSAoICRvbGRzaXplICsgJHBhZHNpemUgKTsKKyAgbmV4dCB1bmxlc3MgJHBhZHNpemU7CisgIGlmICggJHZlcmJvc2l0eSA+PSAxICkgeworICAgICAgcHJpbnRmICJQYWRkaW5nICVzIGZyb20gJWQgdG8gJWQgYnl0ZXMgd2l0aCAlZCB4IDB4JTAyeFxuIiwKKwkgICAgICRmaWxlbmFtZSwgJG9sZHNpemUsICRuZXdzaXplLCAkcGFkc2l6ZSwgJGJ5dGU7CisgIH0KKyAgaWYgKCAkYnl0ZSApIHsKKyAgICBzeXNvcGVuICggbXkgJGZoLCAkZmlsZW5hbWUsICggT19XUk9OTFkgfCBPX0FQUEVORCApICkKKwlvciBkaWUgIkNvdWxkIG5vdCBvcGVuICRmaWxlbmFtZSBmb3IgYXBwZW5kaW5nOiAkIVxuIjsKKyAgICBzeXN3cml0ZSAkZmgsICggY2hyICggJGJ5dGUgKSB4ICRwYWRzaXplICkKKwlvciBkaWUgIkNvdWxkIG5vdCBhcHBlbmQgdG8gJGZpbGVuYW1lOiAkIVxuIjsKKyAgICBjbG9zZSAoICRmaCApOworICB9IGVsc2UgeworICAgIHRydW5jYXRlICRmaWxlbmFtZSwgJG5ld3NpemUKKwlvciBkaWUgIkNvdWxkIG5vdCByZXNpemUgJGZpbGVuYW1lOiAkIVxuIjsKKyAgfQorICBkaWUgIkZhaWxlZCB0byBwYWQgJGZpbGVuYW1lXG4iCisgICAgICB1bmxlc3MgKCAoICggLXMgJGZpbGVuYW1lICkgJSAkYmxrc2l6ZSApID09IDAgKTsKK30KZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvcGFyc2Vyb20ucGwgYi9ncHhlL3NyYy91dGlsL3BhcnNlcm9tLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OGViMWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL3BhcnNlcm9tLnBsCkBAIC0wLDAgKzEsNjUgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyBQYXJzZSBQQ0lfUk9NIGFuZCBJU0FfUk9NIGVudHJpZXMgZnJvbSBhIHNvdXJjZSBmaWxlIG9uIHN0ZGluIGFuZAorIyBvdXRwdXQgdGhlIHJlbGV2YW50IE1ha2VmaWxlIHZhcmlhYmxlIGRlZmluaXRpb25zIHRvIHN0ZG91dAorIworIyBCYXNlZCB1cG9uIHBvcnRpb25zIG9mIEtlbiBZYXAncyBnZW5ydWxlcy5wbAorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitkaWUgIlN5bnRheDogJDAgZHJpdmVyX3NvdXJjZS5jIiB1bmxlc3MgQEFSR1YgPT0gMTsKK215ICRzb3VyY2UgPSBzaGlmdDsKK29wZW4gRFJWLCAiPCRzb3VyY2UiIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gJHNvdXJjZTogJCFcbiI7CisKKyggbXkgJGZhbWlseSwgbXkgJGRyaXZlcl9uYW1lICkgPSAoICRzb3VyY2UgPX4gL14oLio/KFteXC9dKykpXC4uJC8gKQorICAgIG9yIGRpZSAiQ291bGQgbm90IHBhcnNlIHNvdXJjZSBmaWxlIG5hbWUgXCIkc291cmNlXCJcbiI7CisKK215ICRwcmludGVkX2ZhbWlseTsKKworc3ViIHJvbSB7CisgICggbXkgJHR5cGUsIG15ICRpbWFnZSwgbXkgJGRlc2MsIG15ICR2ZW5kb3IsIG15ICRkZXZpY2UgKSA9IEBfOworICBteSAkaWRzID0gJHZlbmRvciA/ICIkdmVuZG9yLCRkZXZpY2UiIDogIi0iOworICB1bmxlc3MgKCAkcHJpbnRlZF9mYW1pbHkgKSB7CisgICAgcHJpbnQgIlxuIjsKKyAgICBwcmludCAiIyBOSUNcdFxuIjsKKyAgICBwcmludCAiIyBOSUNcdGZhbWlseVx0JGZhbWlseVxuIjsKKyAgICBwcmludCAiRFJJVkVSUyArPSAkZHJpdmVyX25hbWVcbiI7CisgICAgJHByaW50ZWRfZmFtaWx5ID0gMTsKKyAgfQorICBwcmludCAiXG4iOworICBwcmludCAiIyBOSUNcdCRpbWFnZVx0JGlkc1x0JGRlc2NcbiI7CisgIHByaW50ICJEUklWRVJfJGltYWdlID0gJGRyaXZlcl9uYW1lXG4iOworICBwcmludCAiUk9NX1RZUEVfJGltYWdlID0gJHR5cGVcbiI7CisgIHByaW50ICJST01fREVTQ1JJUFRJT05fJGltYWdlID0gXCIkZGVzY1wiXG4iOworICBwcmludCAiUENJX1ZFTkRPUl8kaW1hZ2UgPSAweCR2ZW5kb3JcbiIgaWYgJHZlbmRvcjsKKyAgcHJpbnQgIlBDSV9ERVZJQ0VfJGltYWdlID0gMHgkZGV2aWNlXG4iIGlmICRkZXZpY2U7CisgIHByaW50ICJST01TICs9ICRpbWFnZVxuIjsKKyAgcHJpbnQgIlJPTVNfJGRyaXZlcl9uYW1lICs9ICRpbWFnZVxuIjsKK30KKword2hpbGUgKCA8RFJWPiApIHsKKyAgbmV4dCB1bmxlc3MgLyhQQ0l8SVNBKV9ST01ccypcKC87CisKKyAgaWYgKCAvXlxzKlBDSV9ST01ccypcKAorICAgICAgICAgXHMqMHgoWzAtOUEtRmEtZl17NH0pXHMqLCAjIFBDSSB2ZW5kb3IKKyAgICAgICAgIFxzKjB4KFswLTlBLUZhLWZdezR9KVxzKiwgIyBQQ0kgZGV2aWNlCisgICAgICAgICBccypcIihbXlwiXSopXCJccyosCSAgICMgSW1hZ2UKKyAgICAgICAgIFxzKlwiKFteXCJdKilcIlxzKiwJICAgIyBEZXNjcmlwdGlvbgorICAgICAgICAgXHMqLipccyoJCSAgICMgRHJpdmVyIGRhdGEKKyAgICAgICBcKS94ICkgeworICAgICggbXkgJHZlbmRvciwgbXkgJGRldmljZSwgbXkgJGltYWdlLCBteSAkZGVzYyApID0gKCBsYyAkMSwgbGMgJDIsICQzLCAkNCApOworICAgIHJvbSAoICJwY2kiLCAkaW1hZ2UsICRkZXNjLCAkdmVuZG9yLCAkZGV2aWNlICk7CisgICAgcm9tICggInBjaSIsIGxjICIke3ZlbmRvcn0ke2RldmljZX0iLCAkZGVzYywgJHZlbmRvciwgJGRldmljZSApOworICB9IGVsc2lmICggL15ccypJU0FfUk9NXHMqXCgKKwkgICAgICBccypcIihbXlwiXSopXCJccyosICAjIEltYWdlCisJICAgICAgXHMqXCIoW15cIl0qKVwiXHMqICAgIyBEZXNjcmlwdGlvbgorCSAgICBcKS94ICkgeworICAgICggbXkgJGltYWdlLCBteSAkZGVzYyApID0gKCAkMSwgJDIgKTsKKyAgICByb20gKCAiaXNhIiwgJGltYWdlLCAkZGVzYyApOworICB9IGVsc2UgeworICAgIHdhcm4gIk1hbGZvcm1lZCBQQ0lfUk9NIG9yIElTQV9ST00gbWFjcm8gb24gbGluZSAkLiBvZiAkc291cmNlXG4iOworICB9Cit9CisKK2Nsb3NlIERSVjsKZGlmZiAtLWdpdCBhL2dweGUvc3JjL3V0aWwvc29ydG9iamR1bXAucGwgYi9ncHhlL3NyYy91dGlsL3NvcnRvYmpkdW1wLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzNzNhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL3NvcnRvYmpkdW1wLnBsCkBAIC0wLDAgKzEsNDAgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCisjIFNvcnQgdGhlIHN5bWJvbCB0YWJsZSBwb3J0aW9uIG9mIHRoZSBvdXRwdXQgb2Ygb2JqZHVtcCAtaHQgYnkKKyMgc2VjdGlvbiwgdGhlbiBieSBzeW1ib2wgdmFsdWUsIHRoZW4gYnkgc2l6ZS4gIFVzZWQgdG8gZW5oYW5jZSB0aGUKKyMgbGlua2VyIG1hcHMgcHJvZHVjZWQgYnkgIm1ha2UgYmluLyUubWFwIiBieSBhbHNvIHNob3dpbmcgdGhlIHZhbHVlcworIyBvZiBhbGwgbm9uLWdsb2JhbCBzeW1ib2xzLgorCitteSAlc2VjdGlvbl9pZHggPSAoICIqQUJTKiIgPT4gIi4iLCAiKlVORCoiID0+ICJfIiApOworbXkgJWxpbmVzOword2hpbGUgKCA8PiApIHsKKyAgaWYgKCAvXlxzKyhcZCspXHMrKFtcLlwqXVxTKylccytbMC05YS1mQS1GXStccytbMC05YS1mQS1GXS8gKSB7CisgICAgIyBJdCdzIGEgaGVhZGVyIGxpbmUgY29udGFpbmluZyBhIHNlY3Rpb24gZGVmaW5pdGlvbjsgZXh0cmFjdCB0aGUKKyAgICAjIHNlY3Rpb24gaW5kZXggYW5kIHN0b3JlIGl0LiAgQWxzbyBwcmludCB0aGUgaGVhZGVyIGxpbmUuCisgICAgcHJpbnQ7CisgICAgKCBteSAkaW5kZXgsIG15ICRzZWN0aW9uICkgPSAoICQxLCAkMiApOworICAgICRzZWN0aW9uX2lkeHskc2VjdGlvbn0gPSBzcHJpbnRmICggIiUwMmQiLCAkaW5kZXggKTsKKyAgfSBlbHNpZiAoIC9eKFswLTlhLWZBLUZdKylccy4qP1xzKFtcLlwqXVxTKylccysoWzAtOWEtZkEtRl0rKVxzKyhcUyspLyApIHsKKyAgICAjIEl0J3MgYSBzeW1ib2wgbGluZSAtIHN0b3JlIGl0IGluIHRoZSBoYXNoLCBpbmRleGVkIGJ5CisgICAgIyAiPHNlY3Rpb25faW5kZXg+Ojx2YWx1ZT46PHNpemU+OjxlbmRfdGFnPiIuICA8ZW5kX3RhZz4gaXMgIjAiIGlmCisgICAgIyB0aGUgc3ltYm9sIG5hbWUgaXMgb2YgdGhlIGZvcm0geHh4X2VuZCwgIjEiIG90aGVyd2lzZTsgdGhpcyBpcworICAgICMgZG9uZSBzbyB0aGF0IHRhYmxlIGVuZCBtYXJrZXJzIHNob3cgdXAgYmVmb3JlIGFueSBvdGhlciBzeW1ib2xzCisgICAgIyB3aXRoIHRoZSBzYW1lIHZhbHVlLgorICAgICggbXkgJHZhbHVlLCBteSAkc2VjdGlvbiwgbXkgJHNpemUsIG15ICRuYW1lICkgPSAoICQxLCAkMiwgJDMsICQ0ICk7CisgICAgZGllICJVbnJlY29nbmlzZWQgc2VjdGlvbiBcIiRzZWN0aW9uXCJcbiIKKwl1bmxlc3MgZXhpc3RzICRzZWN0aW9uX2lkeHskc2VjdGlvbn07CisgICAgbXkgJHNlY3Rpb25faWR4ID0gJHNlY3Rpb25faWR4eyRzZWN0aW9ufTsKKyAgICBteSAkZW5kID0gKCAkbmFtZSA9fiAvX2VuZCQvICkgPyAiMCIgOiAiMSI7CisgICAgbXkgJGtleSA9ICRzZWN0aW9uX2lkeC4iOiIuJHZhbHVlLiI6Ii4kc2l6ZS4iOiIuJGVuZDsKKyAgICAkbGluZXN7JGtleX0gfHw9ICcnOworICAgICRsaW5lc3ska2V5fSAuPSAkXzsKKyAgfSBlbHNlIHsKKyAgICAjIEl0J3MgYSBnZW5lcmljIGhlYWRlciBsaW5lOiBqdXN0IHByaW50IGl0LgorICAgIHByaW50OworICB9Cit9CisKK3ByaW50ICRsaW5lc3skX30gZm9yZWFjaCBzb3J0IGtleXMgJWxpbmVzOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXRpbC9zd2FwZGV2aWRzLnBsIGIvZ3B4ZS9zcmMvdXRpbC9zd2FwZGV2aWRzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2MjU1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL3N3YXBkZXZpZHMucGwKQEAgLTAsMCArMSw0OSBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjCVByb2dyYW0gdG8gcmV2ZXJzZSB0aGUgZGV2aWNlIGlkZW50aWZpZXIgSURzIGluIHRoZSBQQ0lSIGFuZCBQblAKKyMJc3RydWN0dXJlcyBpbiBhIFJPTSBmb3Igb2xkIG5vbi1jb21wbGlhbnQgQklPU2VzCisjCisjCUdQTCwgS2VuIFlhcCAyMDAxCisjCisKK3VzZSBieXRlczsKKwordXNlIElPOjpTZWVrYWJsZTsKKworc3ViIHN3YXBsb2NzICgkJCQpCit7CisJbXkgKCRkYXRhcmVmLCAkbG9jMSwgJGxvYzIpID0gQF87CisJbXkgKCR0KTsKKworCSR0ID0gc3Vic3RyKCQkZGF0YXJlZiwgJGxvYzEsIDEpOworCXN1YnN0cigkJGRhdGFyZWYsICRsb2MxLCAxKSA9IHN1YnN0cigkJGRhdGFyZWYsICRsb2MyLCAxKTsKKwlzdWJzdHIoJCRkYXRhcmVmLCAkbG9jMiwgMSkgPSAkdDsKK30KKworc3ViIHByaW50ZGV2aWRzICgkJCkKK3sKKwlteSAoJGRhdGFyZWYsICRsb2MpID0gQF87CisKKwlyZXR1cm4gKHNwcmludGYgIiUwMnggJTAyeCAlMDJ4IiwgdW5wYWNrKCdDMycsIHN1YnN0cigkJGRhdGFyZWYsICRsb2MsIDMpKSk7Cit9CisKKyQjQVJHViA+PSAwIG9yIGRpZSAiVXNhZ2U6ICQwIHJvbWltYWdlXG4iOworJGZpbGUgPSAkQVJHVlswXTsKK29wZW4oRiwgIis8JGZpbGUiKSBvciBkaWUgIiRmaWxlOiAkIVxuIjsKK2Jpbm1vZGUoRik7CisjIEhhbmRsZSB1cCB0byA2NGtCIFJPTSBpbWFnZXMKKyRsZW4gPSByZWFkKEYsICRkYXRhLCA2NCoxMDI0KTsKK2RlZmluZWQoJGxlbikgb3IgZGllICIkZmlsZTogJCFcbiI7CitzdWJzdHIoJGRhdGEsIDAsIDIpIGVxICJceDU1XHhBQSIgb3IgZGllICIkZmlsZTogTm90IGEgYm9vdCBST00gaW1hZ2VcbiI7CisoJHBjaSwgJHBucCkgPSB1bnBhY2soJ3YyJywgc3Vic3RyKCRkYXRhLCAweDE4LCA0KSk7CisoJHBjaSA8ICRsZW4gYW5kICRwbnAgPCAkbGVuKSBvciBkaWUgIiRmaWxlOiBOb3QgYSBQQ0kgUG5QIFJPTSBpbWFnZVxuIjsKKyhzdWJzdHIoJGRhdGEsICRwY2ksIDQpIGVxICdQQ0lSJyBhbmQgc3Vic3RyKCRkYXRhLCAkcG5wLCA0KSBlcSAnJFBuUCcpCisJb3IgZGllICIkZmlsZTogTm8gUENJIGFuZCBQTlAgc3RydWN0dXJlcywgbm90IGEgUENJIFBOUCBST00gaW1hZ2VcbiI7Cismc3dhcGxvY3MoXCRkYXRhLCAkcGNpKzEzLCAkcGNpKzE1KTsKKyZzd2FwbG9jcyhcJGRhdGEsICRwbnArMTgsICRwbnArMjApOworc2VlayhGLCAwLCBTRUVLX1NFVCkgb3IgZGllICIkZmlsZTogQ2Fubm90IHNlZWsgdG8gYmVnaW5uaW5nXG4iOworcHJpbnQgRiAkZGF0YTsKK2Nsb3NlKEYpOworcHJpbnQgIlBDSSBkZXZpZHMgbm93OiAiLCAmcHJpbnRkZXZpZHMoXCRkYXRhLCAkcGNpKzEzKSwgIlxuIjsKK3ByaW50ICJQblAgZGV2aWRzIG5vdzogIiwgJnByaW50ZGV2aWRzKFwkZGF0YSwgJHBucCsxOCksICJcbiI7CitleGl0KDApOwpkaWZmIC0tZ2l0IGEvZ3B4ZS9zcmMvdXRpbC9zeW1jaGVjay5wbCBiL2dweGUvc3JjL3V0aWwvc3ltY2hlY2sucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODkyNWNhNgotLS0gL2Rldi9udWxsCisrKyBiL2dweGUvc3JjL3V0aWwvc3ltY2hlY2sucGwKQEAgLTAsMCArMSwxOTEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgY29uc3RhbnQgV0FSTklOR19TSVpFID0+IDUxMjsKKworbXkgJHN5bXRhYiA9IHt9OworCisjIFNjYW4gb3V0cHV0IG9mICJvYmpkdW1wIC13IC10IGJpbi9ibGliLmEiIGFuZCBidWlsZCB1cCBzeW1ib2wgdGFibGUKKyMKK215ICRvYmplY3Q7Cit3aGlsZSAoIDw+ICkgeworICBjaG9tcDsKKyAgaWYgKCAvXkluIGFyY2hpdmUvICkgeworICAgICMgRG8gbm90aGluZworICB9IGVsc2lmICggL14kLyApIHsKKyAgICAjIERvIG5vdGhpbmcKKyAgfSBlbHNpZiAoIC9eKFxTK1wubyk6XHMrZmlsZSBmb3JtYXQvICkgeworICAgICRvYmplY3QgPSAkMTsKKyAgfSBlbHNpZiAoIC9eU1lNQk9MIFRBQkxFOi8gKSB7CisgICAgIyBEbyBub3RoaW5nCisgIH0gZWxzaWYgKCAvXihbMC05YS1mQS1GXSspXHMobHxnfFxzKS4uLi4uLlxzKFxTKylccysoWzAtOWEtZkEtRl0rKVxzKyhcUyspJC8gKSB7CisgICAgbXkgJHZhbHVlID0gJDE7CisgICAgbXkgJHNjb3BlID0gJDI7CisgICAgbXkgJHNlY3Rpb24gPSAkMzsKKyAgICBteSAkc2l6ZSA9ICQ0OworICAgIG15ICRzeW1ib2wgPSAkNTsKKyAgICAkc3ltdGFiLT57JG9iamVjdH0tPnskc3ltYm9sfSA9IHsKKyAgICAgIGdsb2JhbAk9PiAoICRzY29wZSBuZSAibCIgKSwKKyAgICAgIHNlY3Rpb24JPT4gKCAkc2VjdGlvbiBlcSAiKlVORCoiID8gdW5kZWYgOiAkc2VjdGlvbiApLAorICAgICAgdmFsdWUJPT4gKCAkdmFsdWUgPyBoZXggKCAkdmFsdWUgKSA6IDAgKSwKKyAgICAgIHNpemUJPT4gKCAkc2l6ZSA/IGhleCAoICRzaXplICkgOiAwICksCisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBkaWUgIlVucmVjb2duaXplZCBsaW5lIFwiJF9cIiI7CisgIH0KK30KKworIyBBZGQgc3ltYm9scyB0aGF0IHdlIGtub3cgd2lsbCBiZSBnZW5lcmF0ZWQgb3IgcmVxdWlyZWQgYnkgdGhlIGxpbmtlcgorIworZm9yZWFjaCBteSAkb2JqZWN0ICgga2V5cyAlJHN5bXRhYiApIHsKKyAgbXkgJG9ial9zeW1ib2wgPSAib2JqXyRvYmplY3QiOworICAkb2JqX3N5bWJvbCA9fiBzL1wubyQvLzsKKyAgJG9ial9zeW1ib2wgPX4gcy9cVy9fL2c7CisgICRzeW10YWItPntMSU5LRVJ9LT57JG9ial9zeW1ib2x9ID0geworICAgIGdsb2JhbAk9PiAxLAorICAgIHNlY3Rpb24JPT4gdW5kZWYsCisgICAgdmFsdWUJPT4gMCwKKyAgICBzaXplCT0+IDAsCisgIH07Cit9Citmb3JlYWNoIG15ICRsaW5rX3N5bSBxdyAoIF9fcHJlZml4IF9wcmVmaXggX3ByZWZpeF9sb2FkX29mZnNldAorCQkJICBfcHJlZml4X3NpemUgX3ByZWZpeF9wcm9nYml0c19zaXplIF9wcmVmaXhfc2l6ZV9wZ2gKKwkJCSAgX190ZXh0MTYgX3RleHQxNiBfdGV4dDE2X2xvYWRfb2Zmc2V0CisJCQkgIF90ZXh0MTZfc2l6ZSBfdGV4dDE2X3Byb2diaXRzX3NpemUgX3RleHQxNl9zaXplX3BnaAorCQkJICBfX2RhdGExNiBfZGF0YTE2IF9kYXRhMTZfbG9hZF9vZmZzZXQKKwkJCSAgX2RhdGExNl9zaXplIF9kYXRhMTZfcHJvZ2JpdHNfc2l6ZSBfZGF0YTE2X3NpemVfcGdoCisJCQkgIF9fdGV4dCBfdGV4dCBfX2RhdGEgX2RhdGEgX3RleHRkYXRhX2xvYWRfb2Zmc2V0CisJCQkgIF90ZXh0ZGF0YV9zaXplIF90ZXh0ZGF0YV9wcm9nYml0c19zaXplCisJCQkgIF9fcm9kYXRhIF9fYnNzIF9lbmQKKwkJCSAgX3BheWxvYWRfb2Zmc2V0IF9tYXhfYWxpZ24KKwkJCSAgX2xvYWRfc2l6ZSBfbG9hZF9zaXplX3BnaCBfbG9hZF9zaXplX3NlY3QKKwkJCSAgcGNpX3ZlbmRvcl9pZCBwY2lfZGV2aWNlX2lkICkgeworICAkc3ltdGFiLT57TElOS0VSfS0+eyRsaW5rX3N5bX0gPSB7CisgICAgZ2xvYmFsCT0+IDEsCisgICAgc2VjdGlvbgk9PiAnKkFCUyonLAorICAgIHZhbHVlCT0+IDAsCisgICAgc2l6ZQk9PiAwLAorICB9OworfQorCisjIEFkZCBzeW1ib2xzIHRoYXQgd2Uga25vdyB3aWxsIGJlIHVzZWQgYnkgdGhlIGRlYnVnIHN5c3RlbQorIworZm9yZWFjaCBteSAkZGVidWdfc3ltIHF3ICggZGJnX2F1dG9jb2xvdXJpc2UgZGJnX2RlY29sb3VyaXNlCisJCQkgICBkYmdfaGV4X2R1bXBfZGEgKSB7CisgICRzeW10YWItPntERUJVR30tPnskZGVidWdfc3ltfSA9IHsKKyAgICBnbG9iYWwJPT4gMSwKKyAgICBzZWN0aW9uCT0+IHVuZGVmLAorICAgIHZhbHVlCT0+IDAsCisgICAgc2l6ZQk9PiAwLAorICB9OworfQorCisjIEJ1aWxkIHVwIHJlcXVpcmVzLCBwcm92aWRlcyBhbmQgc2hhcmVzIHN5bWJvbCB0YWJsZXMgZm9yIGdsb2JhbAorIyBzeW1ib2xzCisjCitteSAkZ2xvYmFscyA9IHt9Oword2hpbGUgKCAoIG15ICRvYmplY3QsIG15ICRzeW1ib2xzICkgPSBlYWNoICUkc3ltdGFiICkgeworICB3aGlsZSAoICggbXkgJHN5bWJvbCwgbXkgJGluZm8gKSA9IGVhY2ggJSRzeW1ib2xzICkgeworICAgIGlmICggJGluZm8tPntnbG9iYWx9ICkgeworICAgICAgbXkgJGNhdGVnb3J5OworICAgICAgaWYgKCAhIGRlZmluZWQgJGluZm8tPntzZWN0aW9ufSApIHsKKwkkY2F0ZWdvcnkgPSAicmVxdWlyZXMiOworICAgICAgfSBlbHNpZiAoICRpbmZvLT57c2VjdGlvbn0gZXEgIipDT00qIiApIHsKKwkkY2F0ZWdvcnkgPSAic2hhcmVzIjsKKyAgICAgIH0gZWxzZSB7CisJJGNhdGVnb3J5ID0gInByb3ZpZGVzIjsKKyAgICAgIH0KKyAgICAgICRnbG9iYWxzLT57JHN5bWJvbH0tPnskY2F0ZWdvcnl9LT57JG9iamVjdH0gPSAxOworICAgIH0KKyAgfQorfQorCisjIENoZWNrIGZvciBtdWx0aXBseSBkZWZpbmVkLCBuZXZlci1kZWZpbmVkIGFuZCB1bnVzZWQgZ2xvYmFsIHN5bWJvbHMKKyMKK215ICRwcm9ibGVtcyA9IHt9Oword2hpbGUgKCAoIG15ICRzeW1ib2wsIG15ICRpbmZvICkgPSBlYWNoICUkZ2xvYmFscyApIHsKKyAgbXkgQHByb3ZpZGVzID0ga2V5cyAleyRpbmZvLT57cHJvdmlkZXN9fTsKKyAgbXkgQHJlcXVpcmVzID0ga2V5cyAleyRpbmZvLT57cmVxdWlyZXN9fTsKKyAgbXkgQHNoYXJlcyA9IGtleXMgJXskaW5mby0+e3NoYXJlc319OworCisgIGlmICggKCBAcHJvdmlkZXMgPT0gMCApICYmICggQHNoYXJlcyA9PSAxICkgKSB7CisgICAgIyBBIHN5bWJvbCAic2hhcmVkIiBieSBqdXN0IGEgc2luZ2xlIGZpbGUgaXMgYWN0dWFsbHkgYmVpbmcKKyAgICAjIHByb3ZpZGVkIGJ5IHRoYXQgZmlsZTsgaXQganVzdCBkb2Vzbid0IGhhdmUgYW4gaW5pdGlhbGlzZXIuCisgICAgQHByb3ZpZGVzID0gQHNoYXJlczsKKyAgICBAc2hhcmVzID0gKCk7CisgIH0KKworICBpZiAoICggQHJlcXVpcmVzID4gMCApICYmICggQHByb3ZpZGVzID09IDAgKSAmJiAoIEBzaGFyZXMgPT0gMCApICkgeworICAgICMgTm8gb2JqZWN0IHByb3ZpZGVzIHRoaXMgc3ltYm9sLCBidXQgc29tZSBvYmplY3RzIHJlcXVpcmUgaXQuCisgICAgJHByb2JsZW1zLT57JF99LT57bm9uZXhpc3RlbnR9LT57JHN5bWJvbH0gPSAxIGZvcmVhY2ggQHJlcXVpcmVzOworICB9CisKKyAgaWYgKCAoIEByZXF1aXJlcyA9PSAwICkgJiYgKCBAcHJvdmlkZXMgPiAwICkgKSB7CisgICAgIyBObyBvYmplY3QgcmVxdWlyZXMgdGhpcyBzeW1ib2wsIGJ1dCBzb21lIG9iamVjdHMgcHJvdmlkZSBpdC4KKyAgICBmb3JlYWNoIG15ICRwcm92aWRlICggQHByb3ZpZGVzICkgeworICAgICAgaWYgKCAkcHJvdmlkZSBlcSAiTElOS0VSIiApIHsKKwkjIExpbmtlci1wcm92aWRlZCBzeW1ib2xzIGFyZSBleGVtcHQgZnJvbSB0aGlzIGNoZWNrLgorICAgICAgfSBlbHNpZiAoICRzeW10YWItPnskcHJvdmlkZX0tPnskc3ltYm9sfS0+e3NlY3Rpb259ID1+IC9eXC50YmxcLi8gKSB7CisJIyBMaW5rZXIgdGFibGVzIGFyZSBleGVtcHQgZnJvbSB0aGlzIGNoZWNrLgorICAgICAgfSBlbHNlIHsKKwkkcHJvYmxlbXMtPnskcHJvdmlkZX0tPnt1bnVzZWR9LT57JHN5bWJvbH0gPSAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICggKCBAc2hhcmVzID4gMCApICYmICggQHByb3ZpZGVzID4gMCApICkgeworICAgICMgQSBzaGFyZWQgc3ltYm9sIGlzIGJlaW5nIGluaXRpYWxpc2VkIGJ5IGFuIG9iamVjdAorICAgICRwcm9ibGVtcy0+eyRffS0+e3NoYXJlZH0tPnskc3ltYm9sfSA9IDEgZm9yZWFjaCBAcHJvdmlkZXM7CisgIH0KKworICBpZiAoIEBwcm92aWRlcyA+IDEgKSB7CisgICAgIyBBIG5vbi1zaGFyZWQgc3ltYm9sIGlzIGRlZmluZWQgaW4gbXVsdGlwbGUgb2JqZWN0cworICAgICRwcm9ibGVtcy0+eyRffS0+e211bHRpcGxlc30tPnskc3ltYm9sfSA9IDEgZm9yZWFjaCBAcHJvdmlkZXM7CisgIH0KK30KKworIyBDaGVjayBmb3IgZXhjZXNzaXZlbHkgbGFyZ2UgbG9jYWwgc3ltYm9scy4gIFRleHQgYW5kIHJvZGF0YSBzeW1ib2xzCisjIGFyZSBleGVtcHQgZnJvbSB0aGlzIGNoZWNrCisjCit3aGlsZSAoICggbXkgJG9iamVjdCwgbXkgJHN5bWJvbHMgKSA9IGVhY2ggJSRzeW10YWIgKSB7CisgIHdoaWxlICggKCBteSAkc3ltYm9sLCBteSAkaW5mbyApID0gZWFjaCAlJHN5bWJvbHMgKSB7CisgICAgaWYgKCAoICEgJGluZm8tPntnbG9iYWx9ICkgJiYKKwkgKCAoIGRlZmluZWQgJGluZm8tPntzZWN0aW9ufSApICYmCisJICAgISAoICRpbmZvLT57c2VjdGlvbn0gPX4gL14oXC50ZXh0fFwucm9kYXRhKS8gKSApICYmCisJICggJGluZm8tPntzaXplfSA+PSBXQVJOSU5HX1NJWkUgKSApIHsKKyAgICAgICRwcm9ibGVtcy0+eyRvYmplY3R9LT57bGFyZ2V9LT57JHN5bWJvbH0gPSAxOworICAgIH0KKyAgfQorfQorCisjIFByaW50IG91dCBlcnJvciBtZXNzYWdlcworIworbXkgJGVycm9ycyA9IDA7CitteSAkd2FybmluZ3MgPSAwOworZm9yZWFjaCBteSAkb2JqZWN0ICggc29ydCBrZXlzICUkcHJvYmxlbXMgKSB7CisgIG15IEBub25leGlzdGVudCA9IHNvcnQga2V5cyAleyRwcm9ibGVtcy0+eyRvYmplY3R9LT57bm9uZXhpc3RlbnR9fTsKKyAgbXkgQG11bHRpcGxlcyA9IHNvcnQga2V5cyAleyRwcm9ibGVtcy0+eyRvYmplY3R9LT57bXVsdGlwbGVzfX07CisgIG15IEB1bnVzZWQgPSBzb3J0IGtleXMgJXskcHJvYmxlbXMtPnskb2JqZWN0fS0+e3VudXNlZH19OworICBteSBAc2hhcmVkID0gc29ydCBrZXlzICV7JHByb2JsZW1zLT57JG9iamVjdH0tPntzaGFyZWR9fTsKKyAgbXkgQGxhcmdlID0gc29ydCBrZXlzICV7JHByb2JsZW1zLT57JG9iamVjdH0tPntsYXJnZX19OworCisgIHByaW50ICJXQVJOICRvYmplY3QgcHJvdmlkZXMgdW51c2VkIHN5bWJvbCAkX1xuIiBmb3JlYWNoIEB1bnVzZWQ7CisgICR3YXJuaW5ncyArPSBAdW51c2VkOworICBwcmludCAiV0FSTiAkb2JqZWN0IGhhcyBsYXJnZSBzdGF0aWMgc3ltYm9sICRfXG4iIGZvcmVhY2ggQGxhcmdlOworICAkd2FybmluZ3MgKz0gQGxhcmdlOworICBwcmludCAiRVJSICAkb2JqZWN0IHJlcXVpcmVzIG5vbi1leGlzdGVudCBzeW1ib2wgJF9cbiIgZm9yZWFjaCBAbm9uZXhpc3RlbnQ7CisgICRlcnJvcnMgKz0gQG5vbmV4aXN0ZW50OworICBmb3JlYWNoIG15ICRzeW1ib2wgKCBAbXVsdGlwbGVzICkgeworICAgIG15IEBvdGhlcl9vYmplY3RzID0gc29ydCBncmVwIHsgJF8gbmUgJG9iamVjdCB9CisJCSAgICAgICAga2V5cyAleyRnbG9iYWxzLT57JHN5bWJvbH0tPntwcm92aWRlc319OworICAgIHByaW50ICJFUlIgICRvYmplY3QgcHJvdmlkZXMgc3ltYm9sICRzeW1ib2wiCisJLiIgKGFsc28gcHJvdmlkZWQgYnkgQG90aGVyX29iamVjdHMpXG4iOworICB9CisgICRlcnJvcnMgKz0gQG11bHRpcGxlczsKKyAgcHJpbnQgIkVSUiAgJG9iamVjdCBtaXN1c2VzIHNoYXJlZCBzeW1ib2wgJF9cbiIgZm9yZWFjaCBAc2hhcmVkOworfQorCitwcmludCAiJGVycm9ycyBlcnJvcihzKSwgJHdhcm5pbmdzIHdhcm5pbmcocylcbiI7CitleGl0ICggJGVycm9ycyA/IDEgOiAwICk7CmRpZmYgLS1naXQgYS9ncHhlL3NyYy91dGlsL3piaW4uYyBiL2dweGUvc3JjL3V0aWwvemJpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2FlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncHhlL3NyYy91dGlsL3piaW4uYwpAQCAtMCwwICsxLDM4MyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBFTkNPREUKKyNkZWZpbmUgVkVSQk9TRQorI2luY2x1ZGUgIm5ydjJiLmMiCitGSUxFICppbmZpbGUsICpvdXRmaWxlOworCisjZGVmaW5lIERFQlVHIDAKKworc3RydWN0IGlucHV0X2ZpbGUgeworCXZvaWQgKmJ1ZjsKKwlzaXplX3QgbGVuOworfTsKKworc3RydWN0IG91dHB1dF9maWxlIHsKKwl2b2lkICpidWY7CisJc2l6ZV90IGxlbjsKKwlzaXplX3QgbWF4X2xlbjsKK307CisKK3N0cnVjdCB6aW5mb19jb21tb24geworCWNoYXIgdHlwZVs0XTsKKwljaGFyIHBhZFsxMl07Cit9OworCitzdHJ1Y3QgemluZm9fY29weSB7CisJY2hhciB0eXBlWzRdOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBsZW47CisJdWludDMyX3QgYWxpZ247Cit9OworCitzdHJ1Y3QgemluZm9fcGFjayB7CisJY2hhciB0eXBlWzRdOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBsZW47CisJdWludDMyX3QgYWxpZ247Cit9OworCitzdHJ1Y3QgemluZm9fYWRkIHsKKwljaGFyIHR5cGVbNF07CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IGRpdmlzb3I7CisJdWludDMyX3QgcGFkOworfTsKKwordW5pb24gemluZm9fcmVjb3JkIHsKKwlzdHJ1Y3QgemluZm9fY29tbW9uIGNvbW1vbjsKKwlzdHJ1Y3QgemluZm9fY29weSBjb3B5OworCXN0cnVjdCB6aW5mb19wYWNrIHBhY2s7CisJc3RydWN0IHppbmZvX2FkZCBhZGQ7Cit9OworCitzdHJ1Y3QgemluZm9fZmlsZSB7CisJdW5pb24gemluZm9fcmVjb3JkICp6aW5mbzsKKwl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7Cit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGlnbiAoIHVuc2lnbmVkIGxvbmcgdmFsdWUsIHVuc2lnbmVkIGxvbmcgYWxpZ24gKSB7CisJcmV0dXJuICggKCB2YWx1ZSArIGFsaWduIC0gMSApICYgfiggYWxpZ24gLSAxICkgKTsKK30KKworc3RhdGljIGludCByZWFkX2ZpbGUgKCBjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqKmJ1Ziwgc2l6ZV90ICpsZW4gKSB7CisJRklMRSAqZmlsZTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCisJZmlsZSA9IGZvcGVuICggZmlsZW5hbWUsICJyIiApOworCWlmICggISBmaWxlICkgeworCQlmcHJpbnRmICggc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gJXM6ICVzXG4iLCBmaWxlbmFtZSwKKwkJCSAgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCWdvdG8gZXJyOworCX0KKworCWlmICggZnN0YXQgKCBmaWxlbm8gKCBmaWxlICksICZzdGF0ICkgPCAwICkgeworCQlmcHJpbnRmICggc3RkZXJyLCAiQ291bGQgbm90IHN0YXQgJXM6ICVzXG4iLCBmaWxlbmFtZSwKKwkJCSAgc3RyZXJyb3IgKCBlcnJubyApICk7CisJCWdvdG8gZXJyOworCX0KKworCSpsZW4gPSBzdGF0LnN0X3NpemU7CisJKmJ1ZiA9IG1hbGxvYyAoICpsZW4gKTsKKwlpZiAoICEgKmJ1ZiApIHsKKwkJZnByaW50ZiAoIHN0ZGVyciwgIkNvdWxkIG5vdCBtYWxsb2MoKSAlemQgYnl0ZXMgZm9yICVzOiAlc1xuIiwKKwkJCSAgKmxlbiwgZmlsZW5hbWUsIHN0cmVycm9yICggZXJybm8gKSApOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIGZyZWFkICggKmJ1ZiwgMSwgKmxlbiwgZmlsZSApICE9ICpsZW4gKSB7CisJCWZwcmludGYgKCBzdGRlcnIsICJDb3VsZCBub3QgcmVhZCAlemQgYnl0ZXMgZnJvbSAlczogJXNcbiIsCisJCQkgICpsZW4sIGZpbGVuYW1lLCBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJZ290byBlcnI7CisJfQorCisJZmNsb3NlICggZmlsZSApOworCXJldHVybiAwOworCisgZXJyOgorCWlmICggZmlsZSApCisJCWZjbG9zZSAoIGZpbGUgKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9pbnB1dF9maWxlICggY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkgICAgIHN0cnVjdCBpbnB1dF9maWxlICppbnB1dCApIHsKKwlyZXR1cm4gcmVhZF9maWxlICggZmlsZW5hbWUsICZpbnB1dC0+YnVmLCAmaW5wdXQtPmxlbiApOworfQorCitzdGF0aWMgaW50IHJlYWRfemluZm9fZmlsZSAoIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJICAgICBzdHJ1Y3QgemluZm9fZmlsZSAqemluZm8gKSB7CisJdm9pZCAqYnVmOworCXNpemVfdCBsZW47CisKKwlpZiAoIHJlYWRfZmlsZSAoIGZpbGVuYW1lLCAmYnVmLCAmbGVuICkgPCAwICkKKwkJcmV0dXJuIC0xOworCisJaWYgKCAoIGxlbiAlIHNpemVvZiAoICooemluZm8tPnppbmZvKSApICkgIT0gMCApIHsKKwkJZnByaW50ZiAoIHN0ZGVyciwgIi56aW5mbyBmaWxlICVzIGhhcyBpbnZhbGlkIGxlbmd0aCAlemRcbiIsCisJCQkgIGZpbGVuYW1lLCBsZW4gKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXppbmZvLT56aW5mbyA9IGJ1ZjsKKwl6aW5mby0+bnVtX2VudHJpZXMgPSAoIGxlbiAvIHNpemVvZiAoICooemluZm8tPnppbmZvKSApICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2Nfb3V0cHV0X2ZpbGUgKCBzaXplX3QgbWF4X2xlbiwgc3RydWN0IG91dHB1dF9maWxlICpvdXRwdXQgKSB7CisJb3V0cHV0LT5sZW4gPSAwOworCW91dHB1dC0+bWF4X2xlbiA9ICggbWF4X2xlbiApOworCW91dHB1dC0+YnVmID0gbWFsbG9jICggbWF4X2xlbiApOworCWlmICggISBvdXRwdXQtPmJ1ZiApIHsKKwkJZnByaW50ZiAoIHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSAlemQgYnl0ZXMgZm9yIG91dHB1dFxuIiwKKwkJCSAgbWF4X2xlbiApOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldCAoIG91dHB1dC0+YnVmLCAweGZmLCBzaXplb2YgKCBvdXRwdXQtPmJ1ZiApICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc196aW5mb19jb3B5ICggc3RydWN0IGlucHV0X2ZpbGUgKmlucHV0LAorCQkJCXN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0cHV0LAorCQkJCXVuaW9uIHppbmZvX3JlY29yZCAqemluZm8gKSB7CisJc3RydWN0IHppbmZvX2NvcHkgKmNvcHkgPSAmemluZm8tPmNvcHk7CisJc2l6ZV90IG9mZnNldCA9IGNvcHktPm9mZnNldDsKKwlzaXplX3QgbGVuID0gY29weS0+bGVuOworCisJaWYgKCAoIG9mZnNldCArIGxlbiApID4gaW5wdXQtPmxlbiApIHsKKwkJZnByaW50ZiAoIHN0ZGVyciwgIklucHV0IGJ1ZmZlciBvdmVycnVuIG9uIGNvcHlcbiIgKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW91dHB1dC0+bGVuID0gYWxpZ24gKCBvdXRwdXQtPmxlbiwgY29weS0+YWxpZ24gKTsKKwlpZiAoICggb3V0cHV0LT5sZW4gKyBsZW4gKSA+IG91dHB1dC0+bWF4X2xlbiApIHsKKwkJZnByaW50ZiAoIHN0ZGVyciwgIk91dHB1dCBidWZmZXIgb3ZlcnJ1biBvbiBjb3B5XG4iICk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIERFQlVHICkgeworCQlmcHJpbnRmICggc3RkZXJyLCAiQ09QWSBbJSN6eCwlI3p4KSB0byBbJSN6eCwlI3p4KVxuIiwKKwkJCSAgb2Zmc2V0LCAoIG9mZnNldCArIGxlbiApLCBvdXRwdXQtPmxlbiwKKwkJCSAgKCBvdXRwdXQtPmxlbiArIGxlbiApICk7CisJfQorCisJbWVtY3B5ICggKCBvdXRwdXQtPmJ1ZiArIG91dHB1dC0+bGVuICksCisJCSAoIGlucHV0LT5idWYgKyBvZmZzZXQgKSwgbGVuICk7CisJb3V0cHV0LT5sZW4gKz0gbGVuOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfemluZm9fcGFjayAoIHN0cnVjdCBpbnB1dF9maWxlICppbnB1dCwKKwkJCQlzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dHB1dCwKKwkJCQl1bmlvbiB6aW5mb19yZWNvcmQgKnppbmZvICkgeworCXN0cnVjdCB6aW5mb19wYWNrICpwYWNrID0gJnppbmZvLT5wYWNrOworCXNpemVfdCBvZmZzZXQgPSBwYWNrLT5vZmZzZXQ7CisJc2l6ZV90IGxlbiA9IHBhY2stPmxlbjsKKwl1bnNpZ25lZCBsb25nIHBhY2tlZF9sZW47CisKKwlpZiAoICggb2Zmc2V0ICsgbGVuICkgPiBpbnB1dC0+bGVuICkgeworCQlmcHJpbnRmICggc3RkZXJyLCAiSW5wdXQgYnVmZmVyIG92ZXJydW4gb24gcGFja1xuIiApOworCQlyZXR1cm4gLTE7CisJfQorCisJb3V0cHV0LT5sZW4gPSBhbGlnbiAoIG91dHB1dC0+bGVuLCBwYWNrLT5hbGlnbiApOworCWlmICggb3V0cHV0LT5sZW4gPiBvdXRwdXQtPm1heF9sZW4gKSB7CisJCWZwcmludGYgKCBzdGRlcnIsICJPdXRwdXQgYnVmZmVyIG92ZXJydW4gb24gcGFja1xuIiApOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCB1Y2xfbnJ2MmJfOTlfY29tcHJlc3MgKCAoIGlucHV0LT5idWYgKyBvZmZzZXQgKSwgbGVuLAorCQkJCSAgICAgKCBvdXRwdXQtPmJ1ZiArIG91dHB1dC0+bGVuICksCisJCQkJICAgICAmcGFja2VkX2xlbiwgMCApICE9IFVDTF9FX09LICkgeworCQlmcHJpbnRmICggc3RkZXJyLCAiQ29tcHJlc3Npb24gZmFpbHVyZVxuIiApOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCBERUJVRyApIHsKKwkJZnByaW50ZiAoIHN0ZGVyciwgIlBBQ0sgWyUjengsJSN6eCkgdG8gWyUjengsJSN6eClcbiIsCisJCQkgIG9mZnNldCwgKCBvZmZzZXQgKyBsZW4gKSwgb3V0cHV0LT5sZW4sCisJCQkgICggc2l6ZV90ICkoIG91dHB1dC0+bGVuICsgcGFja2VkX2xlbiApICk7CisJfQorCisJb3V0cHV0LT5sZW4gKz0gcGFja2VkX2xlbjsKKwlpZiAoIG91dHB1dC0+bGVuID4gb3V0cHV0LT5tYXhfbGVuICkgeworCQlmcHJpbnRmICggc3RkZXJyLCAiT3V0cHV0IGJ1ZmZlciBvdmVycnVuIG9uIHBhY2tcbiIgKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfemluZm9fYWRkICggc3RydWN0IGlucHV0X2ZpbGUgKmlucHV0LAorCQkJICAgICAgIHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0cHV0LAorCQkJICAgICAgIHN0cnVjdCB6aW5mb19hZGQgKmFkZCwKKwkJCSAgICAgICBzaXplX3QgZGF0YXNpemUgKSB7CisJc2l6ZV90IG9mZnNldCA9IGFkZC0+b2Zmc2V0OworCXZvaWQgKnRhcmdldDsKKwlzaWduZWQgbG9uZyBhZGRlbmQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXNpZ25lZCBsb25nIHZhbDsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwlpZiAoICggb2Zmc2V0ICsgZGF0YXNpemUgKSA+IG91dHB1dC0+bGVuICkgeworCQlmcHJpbnRmICggc3RkZXJyLCAiQWRkIGF0ICUjenggb3V0c2lkZSBvdXRwdXQgYnVmZmVyXG4iLAorCQkJICBvZmZzZXQgKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRhcmdldCA9ICggb3V0cHV0LT5idWYgKyBvZmZzZXQgKTsKKwlzaXplID0gKCBhbGlnbiAoIG91dHB1dC0+bGVuLCBhZGQtPmRpdmlzb3IgKSAvIGFkZC0+ZGl2aXNvciApOworCisJc3dpdGNoICggZGF0YXNpemUgKSB7CisJY2FzZSAxOgorCQlhZGRlbmQgPSAqKCAoIGludDhfdCAqICkgdGFyZ2V0ICk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYWRkZW5kID0gKiggKCBpbnQxNl90ICogKSB0YXJnZXQgKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlhZGRlbmQgPSAqKCAoIGludDMyX3QgKiApIHRhcmdldCApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmICggc3RkZXJyLCAiVW5zdXBwb3J0ZWQgYWRkIGRhdGFzaXplICV6ZFxuIiwKKwkJCSAgZGF0YXNpemUgKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXZhbCA9IHNpemUgKyBhZGRlbmQ7CisKKwkvKiBUaGUgcmVzdWx0IG9mIDFVTCA8PCAoIDggKiBzaXplb2YodW5zaWduZWQgbG9uZykgKSBpcyB1bmRlZmluZWQgKi8KKwltYXNrID0gKCAoIGRhdGFzaXplIDwgc2l6ZW9mICggbWFzayApICkgPworCQkgKCAoIDFVTCA8PCAoIDggKiBkYXRhc2l6ZSApICkgLSAxICkgOiB+MFVMICk7CisKKwlpZiAoIHZhbCA8IDAgKSB7CisJCWZwcmludGYgKCBzdGRlcnIsICJBZGQgJXMlI3grJSNseCBhdCAlI3p4ICVzZmxvd3MgZmllbGRcbiIsCisJCQkgICggKCBhZGRlbmQgPCAwICkgPyAiLSIgOiAiIiApLCBhYnMgKCBhZGRlbmQgKSwgc2l6ZSwKKwkJCSAgb2Zmc2V0LCAoICggYWRkZW5kIDwgMCApID8gInVuZGVyIiA6ICJvdmVyIiApICk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIHZhbCAmIH5tYXNrICkgeworCQlmcHJpbnRmICggc3RkZXJyLCAiQWRkICVzJSN4KyUjbHggYXQgJSN6eCBvdmVyZmxvd3MgJXpkLWJ5dGUgIgorCQkJICAiZmllbGQgKCVkIGJ5dGVzIHRvbyBiaWcpXG4iLAorCQkJICAoICggYWRkZW5kIDwgMCApID8gIi0iIDogIiIgKSwgYWJzICggYWRkZW5kICksIHNpemUsCisJCQkgIG9mZnNldCwgZGF0YXNpemUsCisJCQkgICggaW50ICkoICggdmFsIC0gbWFzayAtIDEgKSAqIGFkZC0+ZGl2aXNvciApICk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKCBkYXRhc2l6ZSApIHsKKwljYXNlIDE6CisJCSooICggdWludDhfdCAqICkgdGFyZ2V0ICkgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKiggKCB1aW50MTZfdCAqICkgdGFyZ2V0ICkgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKiggKCB1aW50MzJfdCAqICkgdGFyZ2V0ICkgPSB2YWw7CisJCWJyZWFrOworCX0KKworCWlmICggREVCVUcgKSB7CisJCWZwcmludGYgKCBzdGRlcnIsICJBRER4IFslI3p4LCUjengpICglcyUjeCsoJSN6eC8lI3gpKSA9ICIKKwkJCSAgIiUjbHhcbiIsIG9mZnNldCwgKCBvZmZzZXQgKyBkYXRhc2l6ZSApLAorCQkJICAoICggYWRkZW5kIDwgMCApID8gIi0iIDogIiIgKSwgYWJzICggYWRkZW5kICksCisJCQkgIG91dHB1dC0+bGVuLCBhZGQtPmRpdmlzb3IsIHZhbCApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfemluZm9fYWRkYiAoIHN0cnVjdCBpbnB1dF9maWxlICppbnB1dCwKKwkJCQlzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dHB1dCwKKwkJCQl1bmlvbiB6aW5mb19yZWNvcmQgKnppbmZvICkgeworCXJldHVybiBwcm9jZXNzX3ppbmZvX2FkZCAoIGlucHV0LCBvdXRwdXQsICZ6aW5mby0+YWRkLCAxICk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc196aW5mb19hZGR3ICggc3RydWN0IGlucHV0X2ZpbGUgKmlucHV0LAorCQkJCXN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0cHV0LAorCQkJCXVuaW9uIHppbmZvX3JlY29yZCAqemluZm8gKSB7CisJcmV0dXJuIHByb2Nlc3NfemluZm9fYWRkICggaW5wdXQsIG91dHB1dCwgJnppbmZvLT5hZGQsIDIgKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3ppbmZvX2FkZGwgKCBzdHJ1Y3QgaW5wdXRfZmlsZSAqaW5wdXQsCisJCQkJc3RydWN0IG91dHB1dF9maWxlICpvdXRwdXQsCisJCQkJdW5pb24gemluZm9fcmVjb3JkICp6aW5mbyApIHsKKwlyZXR1cm4gcHJvY2Vzc196aW5mb19hZGQgKCBpbnB1dCwgb3V0cHV0LCAmemluZm8tPmFkZCwgNCApOworfQorCitzdHJ1Y3QgemluZm9fcHJvY2Vzc29yIHsKKwljaGFyICp0eXBlOworCWludCAoICogcHJvY2VzcyApICggc3RydWN0IGlucHV0X2ZpbGUgKmlucHV0LAorCQkJICAgIHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0cHV0LAorCQkJICAgIHVuaW9uIHppbmZvX3JlY29yZCAqemluZm8gKTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgemluZm9fcHJvY2Vzc29yIHppbmZvX3Byb2Nlc3NvcnNbXSA9IHsKKwl7ICJDT1BZIiwgcHJvY2Vzc196aW5mb19jb3B5IH0sCisJeyAiUEFDSyIsIHByb2Nlc3NfemluZm9fcGFjayB9LAorCXsgIkFEREIiLCBwcm9jZXNzX3ppbmZvX2FkZGIgfSwKKwl7ICJBRERXIiwgcHJvY2Vzc196aW5mb19hZGR3IH0sCisJeyAiQURETCIsIHByb2Nlc3NfemluZm9fYWRkbCB9LAorfTsKKworc3RhdGljIGludCBwcm9jZXNzX3ppbmZvICggc3RydWN0IGlucHV0X2ZpbGUgKmlucHV0LAorCQkJICAgc3RydWN0IG91dHB1dF9maWxlICpvdXRwdXQsCisJCQkgICB1bmlvbiB6aW5mb19yZWNvcmQgKnppbmZvICkgeworCXN0cnVjdCB6aW5mb19jb21tb24gKmNvbW1vbiA9ICZ6aW5mby0+Y29tbW9uOworCXN0cnVjdCB6aW5mb19wcm9jZXNzb3IgKnByb2Nlc3NvcjsKKwljaGFyIHR5cGVbIHNpemVvZiAoIGNvbW1vbi0+dHlwZSApICsgMSBdID0gIiI7CisJdW5zaWduZWQgaW50IGk7CisKKwlzdHJuY2F0ICggdHlwZSwgY29tbW9uLT50eXBlLCBzaXplb2YgKCB0eXBlICkgLSAxICk7CisJZm9yICggaSA9IDAgOyBpIDwgKCBzaXplb2YgKCB6aW5mb19wcm9jZXNzb3JzICkgLworCQkJICAgIHNpemVvZiAoIHppbmZvX3Byb2Nlc3NvcnNbMF0gKSApIDsgaSsrICkgeworCQlwcm9jZXNzb3IgPSAmemluZm9fcHJvY2Vzc29yc1tpXTsKKwkJaWYgKCBzdHJjbXAgKCBwcm9jZXNzb3ItPnR5cGUsIHR5cGUgKSA9PSAwICkKKwkJCXJldHVybiBwcm9jZXNzb3ItPnByb2Nlc3MgKCBpbnB1dCwgb3V0cHV0LCB6aW5mbyApOworCX0KKworCWZwcmludGYgKCBzdGRlcnIsICJVbmtub3duIHppbmZvIHJlY29yZCB0eXBlIFwiJXNcIlxuIiwgJnR5cGVbMF0gKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfb3V0cHV0X2ZpbGUgKCBzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dHB1dCApIHsKKwlpZiAoIGZ3cml0ZSAoIG91dHB1dC0+YnVmLCAxLCBvdXRwdXQtPmxlbiwgc3Rkb3V0ICkgIT0gb3V0cHV0LT5sZW4gKSB7CisJCWZwcmludGYgKCBzdGRlcnIsICJDb3VsZCBub3Qgd3JpdGUgJXpkIGJ5dGVzIG9mIG91dHB1dDogJXNcbiIsCisJCQkgIG91dHB1dC0+bGVuLCBzdHJlcnJvciAoIGVycm5vICkgKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4gKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKSB7CisJc3RydWN0IGlucHV0X2ZpbGUgaW5wdXQ7CisJc3RydWN0IG91dHB1dF9maWxlIG91dHB1dDsKKwlzdHJ1Y3QgemluZm9fZmlsZSB6aW5mbzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICggYXJnYyAhPSAzICkgeworCQlmcHJpbnRmICggc3RkZXJyLCAiU3ludGF4OiAlcyBmaWxlLmJpbiBmaWxlLnppbmZvICIKKwkJCSAgIj4gZmlsZS56YmluXG4iLCBhcmd2WzBdICk7CisJCWV4aXQgKCAxICk7CisJfQorCisJaWYgKCByZWFkX2lucHV0X2ZpbGUgKCBhcmd2WzFdLCAmaW5wdXQgKSA8IDAgKQorCQlleGl0ICggMSApOworCWlmICggcmVhZF96aW5mb19maWxlICggYXJndlsyXSwgJnppbmZvICkgPCAwICkKKwkJZXhpdCAoIDEgKTsKKwlpZiAoIGFsbG9jX291dHB1dF9maWxlICggKCBpbnB1dC5sZW4gKiA0ICksICZvdXRwdXQgKSA8IDAgKQorCQlleGl0ICggMSApOworCisJZm9yICggaSA9IDAgOyBpIDwgemluZm8ubnVtX2VudHJpZXMgOyBpKysgKSB7CisJCWlmICggcHJvY2Vzc196aW5mbyAoICZpbnB1dCwgJm91dHB1dCwKKwkJCQkgICAgICZ6aW5mby56aW5mb1tpXSApIDwgMCApCisJCQlleGl0ICggMSApOworCX0KKworCWlmICggd3JpdGVfb3V0cHV0X2ZpbGUgKCAmb3V0cHV0ICkgPCAwICkKKwkJZXhpdCAoIDEgKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZmF0L2NhY2hlLmMgYi9saWJmYXQvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWI3ZWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmF0L2NhY2hlLmMKQEAgLTAsMCArMSw2NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogY2FjaGUuYworICoKKyAqIFNpbXBsZSBzZWN0b3IgY2FjaGUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibGliZmF0aW50LmgiCisKK3ZvaWQgKmxpYmZhdF9nZXRfc2VjdG9yKHN0cnVjdCBsaWJmYXRfZmlsZXN5c3RlbSAqZnMsIGxpYmZhdF9zZWN0b3JfdCBuKQoreworICAgIHN0cnVjdCBsaWJmYXRfc2VjdG9yICpsczsKKworICAgIGZvciAobHMgPSBmcy0+c2VjdG9yczsgbHM7IGxzID0gbHMtPm5leHQpIHsKKwlpZiAobHMtPm4gPT0gbikKKwkgICAgcmV0dXJuIGxzLT5kYXRhOwkvKiBGb3VuZCBpbiBjYWNoZSAqLworICAgIH0KKworICAgIC8qIE5vdCBmb3VuZCBpbiBjYWNoZSAqLworICAgIGxzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGliZmF0X3NlY3RvcikpOworICAgIGlmICghbHMpIHsKKwlsaWJmYXRfZmx1c2goZnMpOworCWxzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGliZmF0X3NlY3RvcikpOworCisJaWYgKCFscykKKwkgICAgcmV0dXJuIE5VTEw7CS8qIENhbid0IGFsbG9jYXRlIG1lbW9yeSAqLworICAgIH0KKworICAgIGlmIChmcy0+cmVhZChmcy0+cmVhZHB0ciwgbHMtPmRhdGEsIExJQkZBVF9TRUNUT1JfU0laRSwgbikKKwkhPSBMSUJGQVRfU0VDVE9SX1NJWkUpIHsKKwlmcmVlKGxzKTsKKwlyZXR1cm4gTlVMTDsJCS8qIEkvTyBlcnJvciAqLworICAgIH0KKworICAgIGxzLT5uID0gbjsKKyAgICBscy0+bmV4dCA9IGZzLT5zZWN0b3JzOworICAgIGZzLT5zZWN0b3JzID0gbHM7CisKKyAgICByZXR1cm4gbHMtPmRhdGE7Cit9CisKK3ZvaWQgbGliZmF0X2ZsdXNoKHN0cnVjdCBsaWJmYXRfZmlsZXN5c3RlbSAqZnMpCit7CisgICAgc3RydWN0IGxpYmZhdF9zZWN0b3IgKmxzLCAqbHNuZXh0OworCisgICAgbHNuZXh0ID0gZnMtPnNlY3RvcnM7CisgICAgZnMtPnNlY3RvcnMgPSBOVUxMOworCisgICAgZm9yIChscyA9IGxzbmV4dDsgbHM7IGxzID0gbHNuZXh0KSB7CisJbHNuZXh0ID0gbHMtPm5leHQ7CisJZnJlZShscyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliZmF0L2ZhdC5oIGIvbGliZmF0L2ZhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZTMyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmYXQvZmF0LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGZhdC5oCisgKgorICogQmFzaWMgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIEZBVCBmaWxlc3lzdGVtCisgKi8KKworI2lmbmRlZiBGQVRfSAorI2RlZmluZSBGQVRfSAorCisjaW5jbHVkZSAidWxpbnQuaCIKKworLyogVGhlIHBvb3IgZXhjdXNlIEZBVCBoYXMgZm9yIGEgc3VwZXJibG9jayAtLSBpbiB0aGUgYm9vdCBzZWN0b3IgKi8KK3N0cnVjdCBmYXRfYm9vdHNlY3QgeworICAgIGxlOF90IGJzSnVtcFszXTsJCS8qIEp1bXAgdG8gY29kZSAqLworICAgIGNoYXIgYnNPZW1OYW1lWzhdOwkJLyogRm9ybWF0dGluZyBwcm9ncmFtICovCisgICAgbGUxNl90IGJzQnl0ZXNQZXJTZWM7CS8qIEJ5dGVzL3NlY3RvciAqLworICAgIGxlOF90IGJzU2VjUGVyQ2x1c3Q7CS8qIFNlY3RvcnMvY2x1c3RlciAqLworICAgIGxlMTZfdCBic1Jlc1NlY3RvcnM7CS8qIFJlc2VydmVkIHNlY3RvcnMgKi8KKyAgICBsZThfdCBic0ZBVHM7CQkvKiBOdW1iZXIgb2YgRkFUcyAqLworICAgIGxlMTZfdCBic1Jvb3REaXJFbnRzOwkvKiBOdW1iZXIgb2YgZW50cmllcy9yb290IGRpcmVjdG9yeSAqLworICAgIGxlMTZfdCBic1NlY3RvcnM7CQkvKiBOdW1iZXIgb2Ygc2VjdG9ycyBbMV0gKi8KKyAgICBsZThfdCBic01lZGlhOwkJLyogTWFnaWMgbWVkaWEgdHlwZSBieXRlICovCisgICAgbGUxNl90IGJzRkFUc2VjczsJCS8qIFNlY3RvcnMvRkFUICovCisgICAgbGUxNl90IGJzU2VjUGVyVHJhY2s7CS8qIFNlY3RvcnMvdHJhY2sgKi8KKyAgICBsZTE2X3QgYnNIZWFkczsJCS8qIE51bWJlciBvZiBoZWFkcyAqLworICAgIGxlMzJfdCBic0hpZGRlblNlY3M7CS8qIE51bWJlciBvZiBoaWRkZW4gc2VjdG9ycyAqLworICAgIGxlMzJfdCBic0h1Z2VTZWN0b3JzOwkvKiBOdW1iZXIgb2Ygc2VjdG9ycyBbMl0gKi8KKyAgICB1bmlvbiB7CisJLyogRkFUMTIvMTYgKi8KKwlzdHJ1Y3QgeworCSAgICBsZThfdCBic0RyaXZlTnVtYmVyOwkvKiBEcml2ZSBudW1iZXIgKi8KKwkgICAgbGU4X3QgYnNSZXNlcnZlZDE7CS8qIFJlc2VydmVkICovCisJICAgIGxlOF90IGJzQm9vdFNpZ25hdHVyZTsJLyogMHgyOSAqLworCSAgICBsZTMyX3QgYnNWb2x1bWVJRDsJLyogVm9sdW1lIHNlcmlhbCBudW1iZXIgKi8KKwkgICAgY2hhciBic1ZvbHVtZUxhYmVsWzExXTsJLyogVm9sdW1lIG5hbWUgKi8KKwkgICAgY2hhciBic0ZpbGVTeXNUeXBlWzhdOwkvKiBGaWxlIHN5c3RlbSB0eXBlICovCisKKwkgICAgbGU4X3QgYnNDb2RlWzQ0OF07CS8qIEJvb3Qgc2VjdG9yIGNvZGUgKi8KKwl9IGZhdDE2OworCisJLyogRkFUMzIgKi8KKwlzdHJ1Y3QgeworCSAgICBsZTMyX3QgYnBiX2ZhdHN6MzI7CS8qIFNlY3RvcnMvRkFUICovCisJICAgIGxlMTZfdCBicGJfZXh0ZmxhZ3M7CS8qIEV4dGVuZGVkIGZsYWdzICovCisJICAgIGxlMTZfdCBicGJfZnN2ZXI7CS8qIEZpbGVzeXN0ZW0gdmVyc2lvbiAqLworCSAgICBsZTMyX3QgYnBiX3Jvb3RjbHVzOwkvKiBSb290IGRpcmVjdG9yeSBjbHVzdGVyICovCisJICAgIGxlMTZfdCBicGJfZnNpbmZvOwkvKiBGU0lORk8gc2VjdG9yIG51bWJlciAqLworCSAgICBsZTE2X3QgYnBiX2JrYm9vdHNlYzsJLyogQmFja3VwIGJvb3Qgc2VjdG9yIChzdXBlcmJsb2NrKSAqLworCSAgICBjaGFyIGJwYl9yZXNlcnZlZFsxMl07CisKKwkgICAgLyogU2FtZSBzaGl0LCBkaWZmZXJlbnQgb2Zmc2V0ISAqLworCSAgICBsZThfdCBic0RyaXZlTnVtYmVyOwkvKiBEcml2ZSBudW1iZXIgKi8KKwkgICAgbGU4X3QgYnNSZXNlcnZlZDE7CS8qIFJlc2VydmVkICovCisJICAgIGxlOF90IGJzQm9vdFNpZ25hdHVyZTsJLyogMHgyOSAqLworCSAgICBsZTMyX3QgYnNWb2x1bWVJRDsJLyogVm9sdW1lIHNlcmlhbCBudW1iZXIgKi8KKwkgICAgY2hhciBic1ZvbHVtZUxhYmVsWzExXTsJLyogVm9sdW1lIG5hbWUgKi8KKwkgICAgY2hhciBic0ZpbGVTeXNUeXBlWzhdOwkvKiBGaWxlIHN5c3RlbSB0eXBlICovCisKKwkgICAgbGU4X3QgYnNDb2RlWzQyMF07CS8qIEJvb3Qgc2VjdG9yIGNvZGUgKi8KKwl9IGZhdDMyOworICAgIH0gdTsKKworICAgIGxlMTZfdCBic1NpZ25hdHVyZTsJCS8qIDB4QUE1NSAqLworfTsKKworI2RlZmluZSBCU19CT09UU0lHTkFUVVJFCTB4MjkKKyNkZWZpbmUgQlNfU0lHTkFUVVJFCQkweEFBNTUKKworLyogQSBGQVQgZmlsZXN5c3RlbSBkaXJlY3RvcnkgZW50cnkgKi8KKworc3RydWN0IGZhdF9kaXJlbnQgeworICAgIGxlOF90IG5hbWVbMTFdOwkJLyogTWFuZ2xlZCBmaWxlbmFtZSAqLworICAgIGxlOF90IGF0dHJpYnV0ZTsJCS8qIEZpbGUgdHlwZS9hdHRyaWJ1dGUgKi8KKyAgICBsZThfdCBjYXNlZmxhZ3M7CQkvKiBWRkFUOiBjYXNlIGZvciBiYXNpcyBhbmQgZXh0ZW5zaW9uICovCisgICAgbGU4X3QgY3RpbWVfbXM7CQkvKiBtcyBvZiBjcmVhdGlvbiB0aW1lICovCisgICAgbGUzMl90IGN0aW1lOwkJLyogQ3JlYXRpb24gdGltZSAqLworICAgIGxlMTZfdCBhdGltZTsJCS8qIERhdGUgcG9ydGlvbiAoaGlnaCAxNiBiaXRzKSBvZiBhdGltZSAqLworICAgIGxlMTZfdCBjbHVzdGhpOwkJLyogRkFUMzI6IGhpZ2ggMTYgYml0cyBvZiBjbHVzdGVyICovCisgICAgbGUzMl90IG10aW1lOwkJLyogTW9kaWZpY2F0aW9uIHRpbWUgKi8KKyAgICBsZTE2X3QgY2x1c3RsbzsJCS8qIEZpcnN0IGNsdXN0ZXIgcG9pbnRlciAqLworICAgIGxlMzJfdCBzaXplOwkJLyogRmlsZSBzaXplIChieXRlcykgKi8KK307CisKKy8qIEEgVkZBVCBmaWxlc3lzdGVtIGNvbnRpbnVhdGlvbiBlbnRyeSAqLworc3RydWN0IGZhdF92ZmF0X3Nsb3QgeworICAgIGxlOF90IGlkOwkJCS8qIFNlcXVlbmNlIG51bWJlciBmb3Igc2xvdCAqLworICAgIGxlMTZfdCBuYW1lMFs1XTsJCS8qIDUgY2hhcmFjdGVycyAqLworICAgIGxlOF90IGF0dHJpYnV0ZTsJCS8qIEF0dHJpYnV0ZSBieXRlICovCisgICAgbGU4X3QgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCwgTUJaICovCisgICAgbGU4X3QgYWxpYXNfY3N1bTsJCS8qIFNob3J0IG5hbWUgY2hlY2tzdW0gKi8KKyAgICBsZTE2X3QgbmFtZTVbNl07CQkvKiA2IGNoYXJhY3RlcnMgKi8KKyAgICBsZTE2X3QgZmlyc3RjbHVzdDsJCS8qIE1CWiAqLworICAgIGxlMTZfdCBuYW1lMTFbMl07CQkvKiAyIGNoYXJhY3RlcnMgKi8KK307CisKKyNlbmRpZiAvKiBGQVRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliZmF0L2ZhdGNoYWluLmMgYi9saWJmYXQvZmF0Y2hhaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODUzYTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmF0L2ZhdGNoYWluLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGZhdGNoYWluLmMKKyAqCisgKiBGb2xsb3cgYSBGQVQgY2hhaW4KKyAqLworCisjaW5jbHVkZSAibGliZmF0aW50LmgiCisjaW5jbHVkZSAidWxpbnQuaCIKKworLyoKKyAqIENvbnZlcnQgYSBjbHVzdGVyIG51bWJlciAob3IgMCBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5KSB0byBhCisgKiBzZWN0b3IgbnVtYmVyLiAgUmV0dXJuIC0xIG9uIGZhaWx1cmUuCisgKi8KK2xpYmZhdF9zZWN0b3JfdCBsaWJmYXRfY2x1c3RlcnRvc2VjdG9yKGNvbnN0IHN0cnVjdCBsaWJmYXRfZmlsZXN5c3RlbSAqZnMsCisJCQkJICAgICAgIGludDMyX3QgY2x1c3RlcikKK3sKKyAgICBpZiAoY2x1c3RlciA9PSAwKQorCWNsdXN0ZXIgPSBmcy0+cm9vdGNsdXN0ZXI7CisKKyAgICBpZiAoY2x1c3RlciA9PSAwKQorCXJldHVybiBmcy0+cm9vdGRpcjsKKyAgICBlbHNlIGlmIChjbHVzdGVyIDwgMiB8fCBjbHVzdGVyID49IGZzLT5lbmRjbHVzdGVyKQorCXJldHVybiAtMTsKKyAgICBlbHNlCisJcmV0dXJuIGZzLT5kYXRhICsgKChsaWJmYXRfc2VjdG9yX3QpIChjbHVzdGVyIC0gMikgPDwgZnMtPmNsdXN0c2hpZnQpOworfQorCisvKgorICogR2V0IHRoZSBuZXh0IHNlY3RvciBvZiBlaXRoZXIgdGhlIHJvb3QgZGlyZWN0b3J5IG9yIGEgRkFUIGNoYWluLgorICogUmV0dXJucyAwIG9uIGVuZCBvZiBmaWxlIGFuZCAtMSBvbiBlcnJvci4KKyAqLworCitsaWJmYXRfc2VjdG9yX3QgbGliZmF0X25leHRzZWN0b3Ioc3RydWN0IGxpYmZhdF9maWxlc3lzdGVtICogZnMsCisJCQkJICBsaWJmYXRfc2VjdG9yX3QgcykKK3sKKyAgICBpbnQzMl90IGNsdXN0ZXIsIG5leHRjbHVzdGVyOworICAgIHVpbnQzMl90IGZhdG9mZnNldDsKKyAgICBsaWJmYXRfc2VjdG9yX3QgZmF0c2VjdDsKKyAgICB1aW50OF90ICpmc2RhdGE7CisgICAgdWludDMyX3QgY2x1c3RtYXNrID0gZnMtPmNsdXN0c2l6ZSAtIDE7CisgICAgbGliZmF0X3NlY3Rvcl90IHJzOworCisgICAgaWYgKHMgPCBmcy0+ZGF0YSkgeworCWlmIChzIDwgZnMtPnJvb3RkaXIpCisJICAgIHJldHVybiAtMTsKKworCS8qIFJvb3QgZGlyZWN0b3J5ICovCisJcysrOworCXJldHVybiAocyA8IGZzLT5kYXRhKSA/IHMgOiAwOworICAgIH0KKworICAgIHJzID0gcyAtIGZzLT5kYXRhOworCisgICAgaWYgKH5ycyAmIGNsdXN0bWFzaykKKwlyZXR1cm4gcyArIDE7CQkvKiBOZXh0IHNlY3RvciBpbiBjbHVzdGVyICovCisKKyAgICBjbHVzdGVyID0gMiArIChycyA+PiBmcy0+Y2x1c3RzaGlmdCk7CisKKyAgICBpZiAoY2x1c3RlciA+PSBmcy0+ZW5kY2x1c3RlcikKKwlyZXR1cm4gLTE7CisKKyAgICBzd2l0Y2ggKGZzLT5mYXRfdHlwZSkgeworICAgIGNhc2UgRkFUMTI6CisJLyogR2V0IGZpcnN0IGJ5dGUgKi8KKwlmYXRvZmZzZXQgPSBjbHVzdGVyICsgKGNsdXN0ZXIgPj4gMSk7CisJZmF0c2VjdCA9IGZzLT5mYXQgKyAoZmF0b2Zmc2V0ID4+IExJQkZBVF9TRUNUT1JfU0hJRlQpOworCWZzZGF0YSA9IGxpYmZhdF9nZXRfc2VjdG9yKGZzLCBmYXRzZWN0KTsKKwlpZiAoIWZzZGF0YSkKKwkgICAgcmV0dXJuIC0xOworCW5leHRjbHVzdGVyID0gZnNkYXRhW2ZhdG9mZnNldCAmIExJQkZBVF9TRUNUT1JfTUFTS107CisKKwkvKiBHZXQgc2Vjb25kIGJ5dGUgKi8KKwlmYXRvZmZzZXQrKzsKKwlmYXRzZWN0ID0gZnMtPmZhdCArIChmYXRvZmZzZXQgPj4gTElCRkFUX1NFQ1RPUl9TSElGVCk7CisJZnNkYXRhID0gbGliZmF0X2dldF9zZWN0b3IoZnMsIGZhdHNlY3QpOworCWlmICghZnNkYXRhKQorCSAgICByZXR1cm4gLTE7CisJbmV4dGNsdXN0ZXIgfD0gZnNkYXRhW2ZhdG9mZnNldCAmIExJQkZBVF9TRUNUT1JfTUFTS10gPDwgODsKKworCS8qIEV4dHJhY3QgdGhlIEZBVCBlbnRyeSAqLworCWlmIChjbHVzdGVyICYgMSkKKwkgICAgbmV4dGNsdXN0ZXIgPj49IDQ7CisJZWxzZQorCSAgICBuZXh0Y2x1c3RlciAmPSAweDBGRkY7CisKKwlpZiAobmV4dGNsdXN0ZXIgPj0gMHgwRkY4KQorCSAgICByZXR1cm4gMDsKKwlicmVhazsKKworICAgIGNhc2UgRkFUMTY6CisJZmF0b2Zmc2V0ID0gY2x1c3RlciA8PCAxOworCWZhdHNlY3QgPSBmcy0+ZmF0ICsgKGZhdG9mZnNldCA+PiBMSUJGQVRfU0VDVE9SX1NISUZUKTsKKwlmc2RhdGEgPSBsaWJmYXRfZ2V0X3NlY3RvcihmcywgZmF0c2VjdCk7CisJaWYgKCFmc2RhdGEpCisJICAgIHJldHVybiAtMTsKKwluZXh0Y2x1c3RlciA9CisJICAgIHJlYWQxNigobGUxNl90ICopICYgZnNkYXRhW2ZhdG9mZnNldCAmIExJQkZBVF9TRUNUT1JfTUFTS10pOworCisJaWYgKG5leHRjbHVzdGVyID49IDB4MEZGRjgpCisJICAgIHJldHVybiAwOworCWJyZWFrOworCisgICAgY2FzZSBGQVQyODoKKwlmYXRvZmZzZXQgPSBjbHVzdGVyIDw8IDI7CisJZmF0c2VjdCA9IGZzLT5mYXQgKyAoZmF0b2Zmc2V0ID4+IExJQkZBVF9TRUNUT1JfU0hJRlQpOworCWZzZGF0YSA9IGxpYmZhdF9nZXRfc2VjdG9yKGZzLCBmYXRzZWN0KTsKKwlpZiAoIWZzZGF0YSkKKwkgICAgcmV0dXJuIC0xOworCW5leHRjbHVzdGVyID0KKwkgICAgcmVhZDMyKChsZTMyX3QgKikgJiBmc2RhdGFbZmF0b2Zmc2V0ICYgTElCRkFUX1NFQ1RPUl9NQVNLXSk7CisJbmV4dGNsdXN0ZXIgJj0gMHgwRkZGRkZGRjsKKworCWlmIChuZXh0Y2x1c3RlciA+PSAweDBGRkZGRkY4KQorCSAgICByZXR1cm4gMDsKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJcmV0dXJuIC0xOwkJLyogV1RGPyAqLworICAgIH0KKworICAgIHJldHVybiBsaWJmYXRfY2x1c3RlcnRvc2VjdG9yKGZzLCBuZXh0Y2x1c3Rlcik7Cit9CmRpZmYgLS1naXQgYS9saWJmYXQvbGliZmF0LmggYi9saWJmYXQvbGliZmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxNzlkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZhdC9saWJmYXQuaApAQCAtMCwwICsxLDg1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBsaWJmYXQuaAorICoKKyAqIEhlYWRlcnMgZm9yIHRoZSBsaWJmYXQgbGlicmFyeQorICovCisKKyNpZm5kZWYgTElCRkFUX0gKKyNkZWZpbmUgTElCRkFUX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNkZWZpbmUgTElCRkFUX1NFQ1RPUl9TSElGVAk5CisjZGVmaW5lIExJQkZBVF9TRUNUT1JfU0laRQk1MTIKKyNkZWZpbmUgTElCRkFUX1NFQ1RPUl9NQVNLCTUxMQorCit0eXBlZGVmIHVpbnQ2NF90IGxpYmZhdF9zZWN0b3JfdDsKK3N0cnVjdCBsaWJmYXRfZmlsZXN5c3RlbTsKKworc3RydWN0IGxpYmZhdF9kaXJlbnRyeSB7CisgICAgbGliZmF0X3NlY3Rvcl90IHNlY3RvcjsKKyAgICBpbnQgb2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIgZW50cnlbMzJdOworfTsKKworLyoKKyAqIE9wZW4gdGhlIGZpbGVzeXN0ZW0uICBUaGUgcmVhZGZ1bmMgaXMgdGhlIGZ1bmN0aW9uIHRvIHJlYWQKKyAqIHNlY3RvcnMsIGluIHRoZSBmb3JtYXQ6CisgKiBpbnQgcmVhZGZ1bmMoaW50cHRyX3QgcmVhZHB0ciwgdm9pZCAqYnVmLCBzaXplX3Qgc2Vjc2l6ZSwKKyAqICAgICAgICAgICAgICBsaWJmYXRfc2VjdG9yX3Qgc2Vjbm8pCisgKgorICogLi4uIHdoZXJlIHJlYWRwdHIgaXMgYSBwcml2YXRlIGFyZ3VtZW50LgorICoKKyAqIEEgcmV0dXJuIHZhbHVlIG9mICE9IHNlY3NpemUgaXMgdHJlYXRlZCBhcyBlcnJvci4KKyAqLworc3RydWN0IGxpYmZhdF9maWxlc3lzdGVtCisgICAgKmxpYmZhdF9vcGVuKGludCAoKnJlYWRmdW5jKSAoaW50cHRyX3QsIHZvaWQgKiwgc2l6ZV90LCBsaWJmYXRfc2VjdG9yX3QpLAorCQkgaW50cHRyX3QgcmVhZHB0cik7CisKK3ZvaWQgbGliZmF0X2Nsb3NlKHN0cnVjdCBsaWJmYXRfZmlsZXN5c3RlbSAqKTsKKworLyoKKyAqIENvbnZlcnQgYSBjbHVzdGVyIG51bWJlciAob3IgMCBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5KSB0byBhCisgKiBzZWN0b3IgbnVtYmVyLiAgUmV0dXJuIC0xIG9uIGZhaWx1cmUuCisgKi8KK2xpYmZhdF9zZWN0b3JfdCBsaWJmYXRfY2x1c3RlcnRvc2VjdG9yKGNvbnN0IHN0cnVjdCBsaWJmYXRfZmlsZXN5c3RlbSAqZnMsCisJCQkJICAgICAgIGludDMyX3QgY2x1c3Rlcik7CisKKy8qCisgKiBHZXQgdGhlIG5leHQgc2VjdG9yIG9mIGVpdGhlciB0aGUgcm9vdCBkaXJlY3Rvcnkgb3IgYSBGQVQgY2hhaW4uCisgKiBSZXR1cm5zIDAgb24gZW5kIG9mIGZpbGUgYW5kIC0xIG9uIGVycm9yLgorICovCitsaWJmYXRfc2VjdG9yX3QgbGliZmF0X25leHRzZWN0b3Ioc3RydWN0IGxpYmZhdF9maWxlc3lzdGVtICpmcywKKwkJCQkgIGxpYmZhdF9zZWN0b3JfdCBzKTsKKworLyoKKyAqIEZsdXNoIGFsbCBjYWNoZWQgc2VjdG9ycyBmb3IgdGhpcyBmaWxlc3lzdGVtLgorICovCit2b2lkIGxpYmZhdF9mbHVzaChzdHJ1Y3QgbGliZmF0X2ZpbGVzeXN0ZW0gKmZzKTsKKworLyoKKyAqIEdldCBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpYyBzZWN0b3IuCisgKi8KK3ZvaWQgKmxpYmZhdF9nZXRfc2VjdG9yKHN0cnVjdCBsaWJmYXRfZmlsZXN5c3RlbSAqZnMsIGxpYmZhdF9zZWN0b3JfdCBuKTsKKworLyoKKyAqIFNlYXJjaCBhIEZBVCBkaXJlY3RvcnkgZm9yIGEgcGFydGljdWxhciBwcmUtbWFuZ2xlZCBmaWxlbmFtZS4KKyAqIENvcGllcyB0aGUgZGlyZWN0b3J5IGVudHJ5IGludG8gZGlyZW50cnkgYW5kIHJldHVybnMgMCBpZiBmb3VuZC4KKyAqLworaW50MzJfdCBsaWJmYXRfc2VhcmNoZGlyKHN0cnVjdCBsaWJmYXRfZmlsZXN5c3RlbSAqZnMsIGludDMyX3QgZGlyY2x1c3QsCisJCQkgY29uc3Qgdm9pZCAqbmFtZSwgc3RydWN0IGxpYmZhdF9kaXJlbnRyeSAqZGlyZW50cnkpOworCisjZW5kaWYgLyogTElCRkFUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmZhdC9saWJmYXRpbnQuaCBiL2xpYmZhdC9saWJmYXRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZhZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmF0L2xpYmZhdGludC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGxpYmZhdGludC5oCisgKgorICogSW50ZXJuYWxzIGZvciB0aGUgbGliZmF0IGZpbGVzeXN0ZW0KKyAqLworCisjaWZuZGVmIExJQkZBVElOVF9ICisjZGVmaW5lIExJQkZBVElOVF9ICisKKyNpbmNsdWRlICJsaWJmYXQuaCIKKyNpbmNsdWRlICJmYXQuaCIKKworc3RydWN0IGxpYmZhdF9zZWN0b3IgeworICAgIGxpYmZhdF9zZWN0b3JfdCBuOwkJLyogU2VjdG9yIG51bWJlciAqLworICAgIHN0cnVjdCBsaWJmYXRfc2VjdG9yICpuZXh0OwkvKiBOZXh0IGluIGxpc3QgKi8KKyAgICBjaGFyIGRhdGFbTElCRkFUX1NFQ1RPUl9TSVpFXTsKK307CisKK2VudW0gZmF0X3R5cGUgeworICAgIEZBVDEyLAorICAgIEZBVDE2LAorICAgIEZBVDI4Cit9OworCitzdHJ1Y3QgbGliZmF0X2ZpbGVzeXN0ZW0geworICAgIGludCAoKnJlYWQpIChpbnRwdHJfdCwgdm9pZCAqLCBzaXplX3QsIGxpYmZhdF9zZWN0b3JfdCk7CisgICAgaW50cHRyX3QgcmVhZHB0cjsKKworICAgIGVudW0gZmF0X3R5cGUgZmF0X3R5cGU7CisgICAgdW5zaWduZWQgaW50IGNsdXN0c2l6ZTsKKyAgICBpbnQgY2x1c3RzaGlmdDsKKyAgICBpbnQzMl90IGVuZGNsdXN0ZXI7CQkvKiBIaWdoZXN0IGxlZ2FsIGNsdXN0ZXIgbnVtYmVyICsgMSAqLworICAgIGludDMyX3Qgcm9vdGNsdXN0ZXI7CS8qIFJvb3QgZGlyZWN0b3J5IGNsdXN0ZXIgKi8KKworICAgIGxpYmZhdF9zZWN0b3JfdCBmYXQ7CS8qIFN0YXJ0IG9mIEZBVCAqLworICAgIGxpYmZhdF9zZWN0b3JfdCByb290ZGlyOwkvKiBTdGFydCBvZiByb290IGRpcmVjdG9yeSAqLworICAgIGxpYmZhdF9zZWN0b3JfdCBkYXRhOwkvKiBTdGFydCBvZiBkYXRhIGFyZWEgKi8KKyAgICBsaWJmYXRfc2VjdG9yX3QgZW5kOwkvKiBFbmQgb2YgZmlsZXN5c3RlbSAqLworCisgICAgc3RydWN0IGxpYmZhdF9zZWN0b3IgKnNlY3RvcnM7Cit9OworCisjZW5kaWYgLyogTElCRkFUSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmZhdC9vcGVuLmMgYi9saWJmYXQvb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODFlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmYXQvb3Blbi5jCkBAIC0wLDAgKzEsMTE3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBvcGVuLmMKKyAqCisgKiBPcGVuIGEgRkFUIGZpbGVzeXN0ZW0gYW5kIGNvbXB1dGUgc29tZSBpbml0aWFsIHZhbHVlczsgcmV0dXJuIE5VTEwKKyAqIG9uIGZhaWx1cmUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxpYmZhdGludC5oIgorI2luY2x1ZGUgInVsaW50LmgiCisKK3N0cnVjdCBsaWJmYXRfZmlsZXN5c3RlbSAqCitsaWJmYXRfb3BlbihpbnQgKCpyZWFkZnVuYykgKGludHB0cl90LCB2b2lkICosIHNpemVfdCwgbGliZmF0X3NlY3Rvcl90KSwKKwkgICAgaW50cHRyX3QgcmVhZHB0cikKK3sKKyAgICBzdHJ1Y3QgbGliZmF0X2ZpbGVzeXN0ZW0gKmZzID0gTlVMTDsKKyAgICBzdHJ1Y3QgZmF0X2Jvb3RzZWN0ICpiczsKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBzZWN0b3JzLCBmYXRzaXplLCBtaW5mYXRzaXplLCByb290ZGlyc2l6ZTsKKyAgICB1aW50MzJfdCBuY2x1c3RlcnM7CisKKyAgICBmcyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGxpYmZhdF9maWxlc3lzdGVtKSk7CisgICAgaWYgKCFmcykKKwlnb3RvIGJhcmY7CisKKyAgICBmcy0+c2VjdG9ycyA9IE5VTEw7CisgICAgZnMtPnJlYWQgPSByZWFkZnVuYzsKKyAgICBmcy0+cmVhZHB0ciA9IHJlYWRwdHI7CisKKyAgICBicyA9IGxpYmZhdF9nZXRfc2VjdG9yKGZzLCAwKTsKKyAgICBpZiAoIWJzKQorCWdvdG8gYmFyZjsKKworICAgIGlmIChyZWFkMTYoJmJzLT5ic0J5dGVzUGVyU2VjKSAhPSBMSUJGQVRfU0VDVE9SX1NJWkUpCisJZ290byBiYXJmOworCisgICAgZm9yIChpID0gMDsgaSA8PSA4OyBpKyspIHsKKwlpZiAoKHVpbnQ4X3QpICgxIDw8IGkpID09IHJlYWQ4KCZicy0+YnNTZWNQZXJDbHVzdCkpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA+IDgpCisJZ290byBiYXJmOworICAgIGZzLT5jbHVzdHNpemUgPSAxIDw8IGk7CS8qIFRyZWF0IDAgYXMgMl44ID0gNjRLICovCisgICAgZnMtPmNsdXN0c2hpZnQgPSBpOworCisgICAgc2VjdG9ycyA9IHJlYWQxNigmYnMtPmJzU2VjdG9ycyk7CisgICAgaWYgKCFzZWN0b3JzKQorCXNlY3RvcnMgPSByZWFkMzIoJmJzLT5ic0h1Z2VTZWN0b3JzKTsKKworICAgIGZzLT5lbmQgPSBzZWN0b3JzOworCisgICAgZnMtPmZhdCA9IHJlYWQxNigmYnMtPmJzUmVzU2VjdG9ycyk7CisgICAgZmF0c2l6ZSA9IHJlYWQxNigmYnMtPmJzRkFUc2Vjcyk7CisgICAgaWYgKCFmYXRzaXplKQorCWZhdHNpemUgPSByZWFkMzIoJmJzLT51LmZhdDMyLmJwYl9mYXRzejMyKTsKKworICAgIGZzLT5yb290ZGlyID0gZnMtPmZhdCArIGZhdHNpemUgKiByZWFkOCgmYnMtPmJzRkFUcyk7CisKKyAgICByb290ZGlyc2l6ZSA9ICgocmVhZDE2KCZicy0+YnNSb290RGlyRW50cykgPDwgNSkgKyBMSUJGQVRfU0VDVE9SX01BU0spCisJPj4gTElCRkFUX1NFQ1RPUl9TSElGVDsKKyAgICBmcy0+ZGF0YSA9IGZzLT5yb290ZGlyICsgcm9vdGRpcnNpemU7CisKKyAgICAvKiBTYW5pdHkgY2hlY2tpbmcgKi8KKyAgICBpZiAoZnMtPmRhdGEgPj0gZnMtPmVuZCkKKwlnb3RvIGJhcmY7CisKKyAgICAvKiBGaWd1cmUgb3V0IGhvdyBtYW55IGNsdXN0ZXJzICovCisgICAgbmNsdXN0ZXJzID0gKGZzLT5lbmQgLSBmcy0+ZGF0YSkgPj4gZnMtPmNsdXN0c2hpZnQ7CisgICAgZnMtPmVuZGNsdXN0ZXIgPSBuY2x1c3RlcnMgKyAyOworCisgICAgaWYgKG5jbHVzdGVycyA8PSAweGZmNCkgeworCWZzLT5mYXRfdHlwZSA9IEZBVDEyOworCW1pbmZhdHNpemUgPSBmcy0+ZW5kY2x1c3RlciArIChmcy0+ZW5kY2x1c3RlciA+PiAxKTsKKyAgICB9IGVsc2UgaWYgKG5jbHVzdGVycyA8PSAweGZmZjQpIHsKKwlmcy0+ZmF0X3R5cGUgPSBGQVQxNjsKKwltaW5mYXRzaXplID0gZnMtPmVuZGNsdXN0ZXIgPDwgMTsKKyAgICB9IGVsc2UgaWYgKG5jbHVzdGVycyA8PSAweGZmZmZmZjQpIHsKKwlmcy0+ZmF0X3R5cGUgPSBGQVQyODsKKwltaW5mYXRzaXplID0gZnMtPmVuZGNsdXN0ZXIgPDwgMjsKKyAgICB9IGVsc2UKKwlnb3RvIGJhcmY7CQkvKiBJbXBvc3NpYmx5IG1hbnkgY2x1c3RlcnMgKi8KKworICAgIG1pbmZhdHNpemUgPSAobWluZmF0c2l6ZSArIExJQkZBVF9TRUNUT1JfU0laRSAtIDEpID4+IExJQkZBVF9TRUNUT1JfU0hJRlQ7CisKKyAgICBpZiAobWluZmF0c2l6ZSA+IGZhdHNpemUpCisJZ290byBiYXJmOwkJLyogVGhlIEZBVHMgZG9uJ3QgZml0ICovCisKKyAgICBpZiAoZnMtPmZhdF90eXBlID09IEZBVDI4KQorCWZzLT5yb290Y2x1c3RlciA9IHJlYWQzMigmYnMtPnUuZmF0MzIuYnBiX3Jvb3RjbHVzKTsKKyAgICBlbHNlCisJZnMtPnJvb3RjbHVzdGVyID0gMDsKKworICAgIHJldHVybiBmczsJCQkvKiBBbGwgZ29vZCAqLworCitiYXJmOgorICAgIGlmIChmcykKKwlmcmVlKGZzKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBsaWJmYXRfY2xvc2Uoc3RydWN0IGxpYmZhdF9maWxlc3lzdGVtICpmcykKK3sKKyAgICBsaWJmYXRfZmx1c2goZnMpOworICAgIGZyZWUoZnMpOworfQpkaWZmIC0tZ2l0IGEvbGliZmF0L3NlYXJjaGRpci5jIGIvbGliZmF0L3NlYXJjaGRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjQxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmYXQvc2VhcmNoZGlyLmMKQEAgLTAsMCArMSw2NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc2VhcmNoZGlyLmMKKyAqCisgKiBTZWFyY2ggYSBGQVQgZGlyZWN0b3J5IGZvciBhIHBhcnRpY3VsYXIgcHJlLW1hbmdsZWQgZmlsZW5hbWUuCisgKiBDb3BpZXMgdGhlIGRpcmVjdG9yeSBlbnRyeSBpbnRvIGRpcmVudHJ5IGFuZCByZXR1cm5zIHRoZSBzdGFydGluZyBjbHVzdGVyCisgKiBpZiBmb3VuZDsgcmV0dXJucyAtMiBvbiBub3QgZm91bmQsIC0xIG9uIGVycm9yLCAwIG9uIGVtcHR5IGZpbGUuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImxpYmZhdGludC5oIgorCitpbnQzMl90IGxpYmZhdF9zZWFyY2hkaXIoc3RydWN0IGxpYmZhdF9maWxlc3lzdGVtICpmcywgaW50MzJfdCBkaXJjbHVzdCwKKwkJCSBjb25zdCB2b2lkICpuYW1lLCBzdHJ1Y3QgbGliZmF0X2RpcmVudHJ5ICpkaXJlbnRyeSkKK3sKKyAgICBzdHJ1Y3QgZmF0X2RpcmVudCAqZGVwOworICAgIGludCBuZW50OworICAgIGxpYmZhdF9zZWN0b3JfdCBzID0gbGliZmF0X2NsdXN0ZXJ0b3NlY3RvcihmcywgZGlyY2x1c3QpOworCisgICAgd2hpbGUgKDEpIHsKKwlpZiAocyA9PSAwKQorCSAgICByZXR1cm4gLTI7CQkvKiBOb3QgZm91bmQgKi8KKwllbHNlIGlmIChzID09IChsaWJmYXRfc2VjdG9yX3QpIC0gMSkKKwkgICAgcmV0dXJuIC0xOwkJLyogRXJyb3IgKi8KKworCWRlcCA9IGxpYmZhdF9nZXRfc2VjdG9yKGZzLCBzKTsKKwlpZiAoIWRlcCkKKwkgICAgcmV0dXJuIC0xOwkJLyogUmVhZCBlcnJvciAqLworCisJZm9yIChuZW50ID0gMDsgbmVudCA8IExJQkZBVF9TRUNUT1JfU0laRTsKKwkgICAgIG5lbnQgKz0gc2l6ZW9mKHN0cnVjdCBmYXRfZGlyZW50KSkgeworCSAgICBpZiAoIW1lbWNtcChkZXAtPm5hbWUsIG5hbWUsIDExKSkgeworCQlpZiAoZGlyZW50cnkpIHsKKwkJICAgIG1lbWNweShkaXJlbnRyeS0+ZW50cnksIGRlcCwgc2l6ZW9mKCpkZXApKTsKKwkJICAgIGRpcmVudHJ5LT5zZWN0b3IgPSBzOworCQkgICAgZGlyZW50cnktPm9mZnNldCA9IG5lbnQ7CisJCX0KKwkJaWYgKHJlYWQzMigmZGVwLT5zaXplKSA9PSAwKQorCQkgICAgcmV0dXJuIDA7CS8qIEFuIGVtcHR5IGZpbGUgaGFzIG5vIGNsdXN0ZXJzICovCisJCWVsc2UKKwkJICAgIHJldHVybiByZWFkMTYoJmRlcC0+Y2x1c3RsbykgKworCQkJKHJlYWQxNigmZGVwLT5jbHVzdGhpKSA8PCAxNik7CisJICAgIH0KKworCSAgICBpZiAoZGVwLT5uYW1lWzBdID09IDApCisJCXJldHVybiAtMjsJLyogSGl0IGhpZ2ggd2F0ZXIgbWFyayAqLworCisJICAgIGRlcCsrOworCX0KKworCXMgPSBsaWJmYXRfbmV4dHNlY3Rvcihmcywgcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliZmF0L3VsaW50LmggYi9saWJmYXQvdWxpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmZhZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZmF0L3VsaW50LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSBNQSAwMjEzOSwKKyAqICAgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogICB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogdWxpbnQuaAorICoKKyAqIEJhc2ljIG9wZXJhdGlvbnMgb24gdW5hbGlnbmVkLCBsaXR0bGVlbmRpYW4gaW50ZWdlcnMKKyAqLworCisjaWZuZGVmIFVMSU5UX0gKKyNkZWZpbmUgVUxJTlRfSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworLyogVGhlc2UgYXJlIHVuYWxpZ25lZCwgbGl0dGxlZW5kaWFuIGludGVnZXIgdHlwZXMgKi8KKwordHlwZWRlZiB1aW50OF90IGxlOF90OwkJLyogIDgtYml0IGJ5dGUgKi8KK3R5cGVkZWYgdWludDhfdCBsZTE2X3RbMl07CS8qIDE2LWJpdCB3b3JkICovCit0eXBlZGVmIHVpbnQ4X3QgbGUzMl90WzRdOwkvKiAzMi1iaXQgZHdvcmQgKi8KKworLyogUmVhZC93cml0ZSB0aGVzZSBxdWFudGl0aWVzICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkOChsZThfdCAqIF9wKQoreworICAgIHJldHVybiAqX3A7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZTgobGU4X3QgKiBfcCwgdWludDhfdCBfdikKK3sKKyAgICAqX3AgPSBfdjsKK30KKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKworLyogTGl0dGxlZW5kaWFuIGFyY2hpdGVjdHVyZXMgd2hpY2ggc3VwcG9ydCB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmVhZDE2KGxlMTZfdCAqIF9wKQoreworICAgIHJldHVybiAqKChjb25zdCB1aW50MTZfdCAqKV9wKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlMTYobGUxNl90ICogX3AsIHVuc2lnbmVkIHNob3J0IF92KQoreworICAgICooKHVpbnQxNl90ICopIF9wKSA9IF92OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkMzIobGUzMl90ICogX3ApCit7CisgICAgcmV0dXJuICooKGNvbnN0IHVpbnQzMl90ICopX3ApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGUzMihsZTMyX3QgKiBfcCwgdWludDMyX3QgX3YpCit7CisgICAgKigodWludDMyX3QgKikgX3ApID0gX3Y7Cit9CisKKyNlbHNlCisKKy8qIEdlbmVyaWMsIG1vc3RseSBwb3J0YWJsZSB2ZXJzaW9ucyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHJlYWQxNihsZTE2X3QgKiBfcHApCit7CisgICAgdWludDhfdCAqX3AgPSAqX3BwOworICAgIHVpbnQxNl90IF92OworCisgICAgX3YgPSBfcFswXTsKKyAgICBfdiB8PSBfcFsxXSA8PCA4OworICAgIHJldHVybiBfdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlMTYobGUxNl90ICogX3BwLCB1aW50MTZfdCBfdikKK3sKKyAgICB1aW50OF90ICpfcCA9ICpfcHA7CisKKyAgICBfcFswXSA9IF92ICYgMHhGRjsKKyAgICBfcFsxXSA9IChfdiA+PiA4KSAmIDB4RkY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJlYWQzMihsZTMyX3QgKiBfcHApCit7CisgICAgdWludDhfdCAqX3AgPSAqX3BwOworICAgIHVpbnQzMl90IF92OworCisgICAgX3YgPSBfcFswXTsKKyAgICBfdiB8PSBfcFsxXSA8PCA4OworICAgIF92IHw9IF9wWzJdIDw8IDE2OworICAgIF92IHw9IF9wWzNdIDw8IDI0OworICAgIHJldHVybiBfdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlMzIobGUzMl90ICogX3BwLCB1aW50MzJfdCBfdikKK3sKKyAgICB1aW50OF90ICpfcCA9ICpfcHA7CisKKyAgICBfcFswXSA9IF92ICYgMHhGRjsKKyAgICBfcFsxXSA9IChfdiA+PiA4KSAmIDB4RkY7CisgICAgX3BbMl0gPSAoX3YgPj4gMTYpICYgMHhGRjsKKyAgICBfcFszXSA9IChfdiA+PiAyNCkgJiAweEZGOworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIFVMSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9NYWtlZmlsZSBiL2xpYmluc3RhbGxlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGE4ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliaW5zdGFsbGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMzcgQEAKKyMgX2Jpbi5jIGZpbGVzIHJlcXVpcmVkIGJ5IGJvdGggQlRBUkdFVCBhbmQgSVRBUkdFVCBpbnN0YWxsZXJzCitCSU5GSUxFUyA9IGJvb3RzZWN0X2Jpbi5jIGxkbGludXhfYmluLmMgXAorCSAgIG1icl9iaW4uYyBncHRtYnJfYmluLmMgbGRsaW51eGMzMl9iaW4uYworCitQRVJMCSA9IHBlcmwKKworVlBBVEggPSAkKFNSQykKKworYWxsOiBpbnN0YWxsZXIKKworYm9vdHNlY3RfYmluLmM6ICQoT0JKKS8uLi9jb3JlL2xkbGludXguYnNzIGJpbjJjLnBsCisJJChQRVJMKSAkKFNSQykvYmluMmMucGwgc3lzbGludXhfYm9vdHNlY3QgPCAkPCA+ICRACisKK2xkbGludXhfYmluLmM6ICQoT0JKKS8uLi9jb3JlL2xkbGludXguc3lzIGJpbjJjLnBsCisJJChQRVJMKSAkKFNSQykvYmluMmMucGwgc3lzbGludXhfbGRsaW51eCA1MTIgPCAkPCA+ICRACisKK21icl9iaW4uYzogJChPQkopLy4uL21ici9tYnIuYmluIGJpbjJjLnBsCisJJChQRVJMKSAkKFNSQykvYmluMmMucGwgc3lzbGludXhfbWJyIDwgJDwgPiAkQAorCitncHRtYnJfYmluLmM6ICQoT0JKKS8uLi9tYnIvZ3B0bWJyLmJpbiBiaW4yYy5wbAorCSQoUEVSTCkgJChTUkMpL2JpbjJjLnBsIHN5c2xpbnV4X2dwdG1iciA8ICQ8ID4gJEAKKworaW5zdGFsbGVyOiAkKEJJTkZJTEVTKQorCitsZGxpbnV4YzMyX2Jpbi5jOiAkKE9CSikvLi4vY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXguYzMyIGJpbjJjLnBsCisJJChQRVJMKSAkKFNSQykvYmluMmMucGwgc3lzbGludXhfbGRsaW51eGMzMiA8ICQ8ID4gJEAKKwordGlkeToKKwlybSAtZiAkKEJJTkZJTEVTKQorCitjbGVhbjogdGlkeQorCitkaXN0OiB0aWR5CisKK3Nwb3RsZXNzOiBjbGVhbgorCitzdHJpcDoKZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9hZHZjb25zdC5oIGIvbGliaW5zdGFsbGVyL2FkdmNvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDQ0NTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9hZHZjb25zdC5oCkBAIC0wLDAgKzEgQEAKKy4uL2NvbTMyL2luY2x1ZGUvc3lzbGludXgvYWR2Y29uc3QuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9hZHZpby5jIGIvbGliaW5zdGFsbGVyL2FkdmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmNjA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9hZHZpby5jCkBAIC0wLDAgKzEsMTYyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBhZHZpby5jCisgKgorICogTGludXggQURWIEkvTworICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLCBhbmQgc2V0IGVycm5vLgorICoKKyAqLworI2RlZmluZSAgX0dOVV9TT1VSQ0UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAic3lzbHhpbnQuaCIKKyNpbmNsdWRlICJzeXNseGNvbS5oIgorCisvKgorICogUmVhZCB0aGUgQURWIGZyb20gYW4gZXhpc3RpbmcgaW5zdGFuY2UsIG9yIGluaXRpYWxpemUgaWYgaW52YWxpZC4KKyAqIFJldHVybnMgLTEgb24gZmF0YWwgZXJyb3JzLCAwIGlmIEFEViBpcyBva2F5LCAxIGlmIHRoZSBBRFYgaXMKKyAqIGludmFsaWQsIGFuZCAyIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgorICovCitpbnQgcmVhZF9hZHYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqY2ZnKQoreworICAgIGNoYXIgKmZpbGU7CisgICAgaW50IGZkID0gLTE7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaW50IGVyciA9IDA7CisgICAgaW50IHJ2OworCisgICAgcnYgPSBhc3ByaW50ZigmZmlsZSwgIiVzJXMlcyIsIHBhdGgsCisJCSAgcGF0aFswXSAmJiBwYXRoW3N0cmxlbihwYXRoKSAtIDFdID09ICcvJyA/ICIiIDogIi8iLCBjZmcpOworCisgICAgaWYgKHJ2IDwgMCB8fCAhZmlsZSkgeworCXBlcnJvcihwcm9ncmFtKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZKTsKKyAgICBpZiAoZmQgPCAwKSB7CisJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCSAgICBlcnIgPSAtMTsKKwl9IGVsc2UgeworCSAgICBzeXNsaW51eF9yZXNldF9hZHYoc3lzbGludXhfYWR2KTsKKwkgICAgZXJyID0gMjsJCS8qIE5vbmV4aXN0ZW5jZSBpcyBub3QgYSBmYXRhbCBlcnJvciAqLworCX0KKyAgICB9IGVsc2UgaWYgKGZzdGF0KGZkLCAmc3QpKSB7CisJZXJyID0gLTE7CisgICAgfSBlbHNlIGlmIChzdC5zdF9zaXplIDwgMiAqIEFEVl9TSVpFKSB7CisJLyogVG9vIHNtYWxsIHRvIGJlIHVzZWZ1bCAqLworCXN5c2xpbnV4X3Jlc2V0X2FkdihzeXNsaW51eF9hZHYpOworCWVyciA9IDA7CQkvKiBOb3RoaW5nIHRvIHJlYWQuLi4gKi8KKyAgICB9IGVsc2UgaWYgKHhwcmVhZChmZCwgc3lzbGludXhfYWR2LCAyICogQURWX1NJWkUsCisJCSAgICAgIHN0LnN0X3NpemUgLSAyICogQURWX1NJWkUpICE9IDIgKiBBRFZfU0laRSkgeworCWVyciA9IC0xOworICAgIH0gZWxzZSB7CisJLyogV2UgZ290IGl0Li4uIG1heWJlPyAqLworCWVyciA9IHN5c2xpbnV4X3ZhbGlkYXRlX2FkdihzeXNsaW51eF9hZHYpID8gMSA6IDA7CisgICAgfQorCisgICAgaWYgKGVyciA8IDApCisJcGVycm9yKGZpbGUpOworCisgICAgaWYgKGZkID49IDApCisJY2xvc2UoZmQpOworCisgICAgZnJlZShmaWxlKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIEFEViBpbiBhbiBleGlzdGluZyBpbnN0YWxsYXRpb24uCisgKi8KK2ludCB3cml0ZV9hZHYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqY2ZnKQoreworICAgIHVuc2lnbmVkIGNoYXIgYWR2dG1wWzIgKiBBRFZfU0laRV07CisgICAgY2hhciAqZmlsZTsKKyAgICBpbnQgZmQgPSAtMTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdCwgeHN0OworICAgIGludCBlcnIgPSAwOworICAgIGludCBydjsKKworICAgIHJ2ID0gYXNwcmludGYoJmZpbGUsICIlcyVzJXMiLCBwYXRoLAorCQkgIHBhdGhbMF0gJiYgcGF0aFtzdHJsZW4ocGF0aCkgLSAxXSA9PSAnLycgPyAiIiA6ICIvIiwgY2ZnKTsKKworICAgIGlmIChydiA8IDAgfHwgIWZpbGUpIHsKKwlwZXJyb3IocHJvZ3JhbSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgeworCWVyciA9IC0xOworICAgIH0gZWxzZSBpZiAoZnN0YXQoZmQsICZzdCkpIHsKKwllcnIgPSAtMTsKKyAgICB9IGVsc2UgaWYgKHN0LnN0X3NpemUgPCAyICogQURWX1NJWkUpIHsKKwkvKiBUb28gc21hbGwgdG8gYmUgdXNlZnVsICovCisJZXJyID0gLTI7CisgICAgfSBlbHNlIGlmICh4cHJlYWQoZmQsIGFkdnRtcCwgMiAqIEFEVl9TSVpFLAorCQkgICAgICBzdC5zdF9zaXplIC0gMiAqIEFEVl9TSVpFKSAhPSAyICogQURWX1NJWkUpIHsKKwllcnIgPSAtMTsKKyAgICB9IGVsc2UgeworCS8qIFdlIGdvdCBpdC4uLiBtYXliZT8gKi8KKwllcnIgPSBzeXNsaW51eF92YWxpZGF0ZV9hZHYoYWR2dG1wKSA/IC0yIDogMDsKKwlpZiAoIWVycikgeworCSAgICAvKiBHb3QgYSBnb29kIG9uZSwgd3JpdGUgb3VyIG93biBBRFYgaGVyZSAqLworCSAgICBjbGVhcl9hdHRyaWJ1dGVzKGZkKTsKKworCSAgICAvKiBOZWVkIHRvIHJlLW9wZW4gcmVhZC13cml0ZSAqLworCSAgICBjbG9zZShmZCk7CisJICAgIGZkID0gb3BlbihmaWxlLCBPX1JEV1IgfCBPX1NZTkMpOworCSAgICBpZiAoZmQgPCAwKSB7CisJCWVyciA9IC0xOworCSAgICB9IGVsc2UgaWYgKGZzdGF0KGZkLCAmeHN0KSB8fCB4c3Quc3RfaW5vICE9IHN0LnN0X2lubyB8fAorCQkgICAgICAgeHN0LnN0X2RldiAhPSBzdC5zdF9kZXYgfHwgeHN0LnN0X3NpemUgIT0gc3Quc3Rfc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiByYWNlIGNvbmRpdGlvbiBvbiB3cml0ZVxuIiwgZmlsZSk7CisJCWVyciA9IC0yOworCSAgICB9CisJICAgIC8qIFdyaXRlIG91ciBvd24gdmVyc2lvbiAuLi4gKi8KKwkgICAgaWYgKHhwd3JpdGUoZmQsIHN5c2xpbnV4X2FkdiwgMiAqIEFEVl9TSVpFLAorCQkJc3Quc3Rfc2l6ZSAtIDIgKiBBRFZfU0laRSkgIT0gMiAqIEFEVl9TSVpFKSB7CisJCWVyciA9IC0xOworCSAgICB9CisKKwkgICAgc3luYygpOworCSAgICBzZXRfYXR0cmlidXRlcyhmZCk7CisJfQorICAgIH0KKworICAgIGlmIChlcnIgPT0gLTIpCisJZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IHdyaXRlIGF1eGlsbGlhcnkgZGF0YSAobmVlZCAtLXVwZGF0ZSk/XG4iLAorCQlmaWxlKTsKKyAgICBlbHNlIGlmIChlcnIgPT0gLTEpCisJcGVycm9yKGZpbGUpOworCisgICAgaWYgKGZkID49IDApCisJY2xvc2UoZmQpOworICAgIGlmIChmaWxlKQorCWZyZWUoZmlsZSk7CisKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGliaW5zdGFsbGVyL2JpbjJjLnBsIGIvbGliaW5zdGFsbGVyL2JpbjJjLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3YzExZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpbnN0YWxsZXIvYmluMmMucGwKQEAgLTAsMCArMSw3OCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDE5OTgtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjCisjIGJpbjJjLnBsOiBiaW5hcnkgZmlsZSB0byBDIHNvdXJjZSBjb252ZXJ0ZXIKKyMKKworZXZhbCB7IHVzZSBieXRlczsgfTsKK2V2YWwgeyBiaW5tb2RlIFNURElOOyB9OworCisoJHRhYmxlX25hbWUsICRwYWQpID0gQEFSR1Y7CisKK2lmICggIWRlZmluZWQoJHRhYmxlX25hbWUpICkgeworICAgIHByaW50IFNUREVSUiAiVXNhZ2U6ICQwIHRhYmxlX25hbWUgW3BhZF0gPCBpbnB1dF9maWxlID4gb3V0cHV0X2ZpbGVcbiI7CisgICAgZXhpdCAxOworfQorCiskcGFkID0gMSBpZiAoJHBhZCA8IDEpOworCitwcmludGYgInVuc2lnbmVkIGNoYXIgJXNbXSA9IHtcbiIsICR0YWJsZV9uYW1lOworCiskcG9zID0gMDsKKyRsaW5lbGVuID0gODsKKworJHRvdGFsX2xlbiA9IDA7CisKK3doaWxlICggKCRuID0gcmVhZChTVERJTiwgJGRhdGEsIDQwOTYpKSA+IDAgKSB7CisgICAgJHRvdGFsX2xlbiArPSAkbjsKKyAgICBmb3IgKCAkaSA9IDAgOyAkaSA8ICRuIDsgJGkrKyApIHsKKwkkYnl0ZSA9IHN1YnN0cigkZGF0YSwgJGksIDEpOworCWlmICggJHBvcyA+PSAkbGluZWxlbiApIHsKKwkgICAgcHJpbnQgIixcblx0IjsKKwkgICAgJHBvcyA9IDA7CisJfSBlbHNpZiAoICRwb3MgPiAwICkgeworCSAgICBwcmludCAiLCAiOworCX0gZWxzZSB7CisJICAgIHByaW50ICJcdCI7CisJfQorCXByaW50ZigiMHglMDJ4IiwgdW5wYWNrKCJDIiwgJGJ5dGUpKTsKKwkkcG9zKys7CisgICAgfQorfQorCiskYWxpZ24gPSAkdG90YWxfbGVuICUgJHBhZDsKK2lmICgkYWxpZ24gIT0gMCkgeworICAgICRuID0gJHBhZCAtICRhbGlnbjsKKyAgICAkdG90YWxfbGVuICs9ICRuOworICAgIGZvciAoICRpID0gMCA7ICRpIDwgJG4gOyAkaSsrICkgeworCWlmICggJHBvcyA+PSAkbGluZWxlbiApIHsKKwkgICAgcHJpbnQgIixcblx0IjsKKwkgICAgJHBvcyA9IDA7CisJfSBlbHNpZiAoICRwb3MgPiAwICkgeworCSAgICBwcmludCAiLCAiOworCX0gZWxzZSB7CisJICAgIHByaW50ICJcdCI7CisJfQorCXByaW50ICcweDAwJzsKKwkkcG9zKys7CisgICAgfQorfQorCitwcmludGYgIlxufTtcblxuY29uc3QgdW5zaWduZWQgaW50ICVzX2xlbiA9ICV1O1xuIiwgJHRhYmxlX25hbWUsICR0b3RhbF9sZW47CisKK0BzdCA9IHN0YXQgU1RESU47CisKK3ByaW50ZiAiXG5jb25zdCBpbnQgJXNfbXRpbWUgPSAlZDtcbiIsICR0YWJsZV9uYW1lLCAkc3RbOV07CisKK2V4aXQgMDsKZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9leHQyZnMvZXh0Ml9mcy5oIGIvbGliaW5zdGFsbGVyL2V4dDJmcy9leHQyX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyYzllMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9leHQyZnMvZXh0Ml9mcy5oCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvbWluaXhfZnMuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2lmbmRlZiBfRVhUMkZTX0VYVDJfRlNfSAorI2RlZmluZSBfRVhUMkZTX0VYVDJfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZXN5c3RlbSBjb25zdGFudHMvc3RydWN0dXJlcworICovCisKKy8qCisgKiBEZWZpbmUgRVhUMkZTX0RFQlVHIHRvIHByb2R1Y2UgZGVidWcgbWVzc2FnZXMKKyAqLworI3VuZGVmIEVYVDJGU19ERUJVRworCisvKgorICogRGVmaW5lIEVYVDJfUFJFQUxMT0NBVEUgdG8gcHJlYWxsb2NhdGUgZGF0YSBibG9ja3MgZm9yIGV4cGFuZGluZyBmaWxlcworICovCisjZGVmaW5lIEVYVDJfUFJFQUxMT0NBVEUKKyNkZWZpbmUgRVhUMl9ERUZBVUxUX1BSRUFMTE9DX0JMT0NLUwk4CisKKy8qCisgKiBUaGUgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIHZlcnNpb24KKyAqLworI2RlZmluZSBFWFQyRlNfREFURQkJIjk1LzA4LzA5IgorI2RlZmluZSBFWFQyRlNfVkVSU0lPTgkJIjAuNWIiCisKKy8qCisgKiBTcGVjaWFsIGlub2RlIG51bWJlcnMKKyAqLworI2RlZmluZSBFWFQyX0JBRF9JTk8JCSAxCS8qIEJhZCBibG9ja3MgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9ST09UX0lOTwkJIDIJLyogUm9vdCBpbm9kZSAqLworI2RlZmluZSBFWFQ0X1VTUl9RVU9UQV9JTk8JIDMJLyogVXNlciBxdW90YSBpbm9kZSAqLworI2RlZmluZSBFWFQ0X0dSUF9RVU9UQV9JTk8JIDQJLyogR3JvdXAgcXVvdGEgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9CT09UX0xPQURFUl9JTk8JIDUJLyogQm9vdCBsb2FkZXIgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9VTkRFTF9ESVJfSU5PCSA2CS8qIFVuZGVsZXRlIGRpcmVjdG9yeSBpbm9kZSAqLworI2RlZmluZSBFWFQyX1JFU0laRV9JTk8JCSA3CS8qIFJlc2VydmVkIGdyb3VwIGRlc2NyaXB0b3JzIGlub2RlICovCisjZGVmaW5lIEVYVDJfSk9VUk5BTF9JTk8JIDgJLyogSm91cm5hbCBpbm9kZSAqLworI2RlZmluZSBFWFQyX0VYQ0xVREVfSU5PCSA5CS8qIFRoZSAiZXhjbHVkZSIgaW5vZGUsIGZvciBzbmFwc2hvdHMgKi8KKyNkZWZpbmUgRVhUNF9SRVBMSUNBX0lOTwkxMAkvKiBVc2VkIGJ5IG5vbi11cHN0cmVhbSBmZWF0dXJlICovCisKKy8qIEZpcnN0IG5vbi1yZXNlcnZlZCBpbm9kZSBmb3Igb2xkIGV4dDIgZmlsZXN5c3RlbXMgKi8KKyNkZWZpbmUgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8JMTEKKworLyoKKyAqIFRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0gbWFnaWMgbnVtYmVyCisgKi8KKyNkZWZpbmUgRVhUMl9TVVBFUl9NQUdJQwkweEVGNTMKKworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgRVhUMl9TQihzYikJKCYoKHNiKS0+dS5leHQyX3NiKSkKKyNlbHNlCisvKiBBc3N1bWUgdGhhdCB1c2VyIG1vZGUgcHJvZ3JhbXMgYXJlIHBhc3NpbmcgaW4gYW4gZXh0MmZzIHN1cGVyYmxvY2ssIG5vdAorICogYSBrZXJuZWwgc3RydWN0IHN1cGVyX2Jsb2NrLiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGNhbGwgdGhlIGZlYXR1cmUtdGVzdAorICogbWFjcm9zIGZyb20gdXNlciBsYW5kLiAqLworI2RlZmluZSBFWFQyX1NCKHNiKQkoc2IpCisjZW5kaWYKKworLyoKKyAqIE1heGltYWwgY291bnQgb2YgbGlua3MgdG8gYSBmaWxlCisgKi8KKyNkZWZpbmUgRVhUMl9MSU5LX01BWAkJNjUwMDAKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBzZXZlcmFsIGJsb2NrIHNpemVzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUJCTEwCS8qIDEwMjQgKi8KKyNkZWZpbmUgRVhUMl9NQVhfQkxPQ0tfTE9HX1NJWkUJCTE2CS8qIDY1NTM2ICovCisjZGVmaW5lIEVYVDJfTUlOX0JMT0NLX1NJWkUJKDEgPDwgRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpCisjZGVmaW5lIEVYVDJfTUFYX0JMT0NLX1NJWkUJKDEgPDwgRVhUMl9NQVhfQkxPQ0tfTE9HX1NJWkUpCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBFWFQyX0JMT0NLX1NJWkUocykJKChzKS0+c19ibG9ja3NpemUpCisjZGVmaW5lIEVYVDJfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfYmxvY2tzaXplX2JpdHMpCisjZGVmaW5lIEVYVDJfQUREUl9QRVJfQkxPQ0tfQklUUyhzKQkoRVhUMl9TQihzKS0+YWRkcl9wZXJfYmxvY2tfYml0cykKKyNkZWZpbmUgRVhUMl9JTk9ERV9TSVpFKHMpCShFWFQyX1NCKHMpLT5zX2lub2RlX3NpemUpCisjZGVmaW5lIEVYVDJfRklSU1RfSU5PKHMpCShFWFQyX1NCKHMpLT5zX2ZpcnN0X2lubykKKyNlbHNlCisjZGVmaW5lIEVYVDJfQkxPQ0tfU0laRShzKQkoRVhUMl9NSU5fQkxPQ0tfU0laRSA8PCAocyktPnNfbG9nX2Jsb2NrX3NpemUpCisjZGVmaW5lIEVYVDJfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfbG9nX2Jsb2NrX3NpemUgKyAxMCkKKyNkZWZpbmUgRVhUMl9JTk9ERV9TSVpFKHMpCSgoKHMpLT5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFVikgPyBcCisJCQkJIEVYVDJfR09PRF9PTERfSU5PREVfU0laRSA6IChzKS0+c19pbm9kZV9zaXplKQorI2RlZmluZSBFWFQyX0ZJUlNUX0lOTyhzKQkoKChzKS0+c19yZXZfbGV2ZWwgPT0gRVhUMl9HT09EX09MRF9SRVYpID8gXAorCQkJCSBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTyA6IChzKS0+c19maXJzdF9pbm8pCisjZW5kaWYKKyNkZWZpbmUgRVhUMl9BRERSX1BFUl9CTE9DSyhzKQkoRVhUMl9CTE9DS19TSVpFKHMpIC8gc2l6ZW9mKF9fdTMyKSkKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBhbGxvY2F0aW9uIGNsdXN0ZXJzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fQ0xVU1RFUl9MT0dfU0laRQlFWFQyX01JTl9CTE9DS19MT0dfU0laRQorI2RlZmluZSBFWFQyX01BWF9DTFVTVEVSX0xPR19TSVpFCTI5CS8qIDUxMk1CICAqLworI2RlZmluZSBFWFQyX01JTl9DTFVTVEVSX1NJWkUJCUVYVDJfTUlOX0JMT0NLX1NJWkUKKyNkZWZpbmUgRVhUMl9NQVhfQ0xVU1RFUl9TSVpFCQkoMSA8PCBFWFQyX01BWF9DTFVTVEVSX0xPR19TSVpFKQorI2RlZmluZSBFWFQyX0NMVVNURVJfU0laRShzKQkJKEVYVDJfTUlOX0JMT0NLX1NJWkUgPDwgXAorCQkJCQkJKHMpLT5zX2xvZ19jbHVzdGVyX3NpemUpCisjZGVmaW5lIEVYVDJfQ0xVU1RFUl9TSVpFX0JJVFMocykJKChzKS0+c19sb2dfY2x1c3Rlcl9zaXplICsgMTApCisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2UgZnJhZ21lbnRzCisgKgorICogTm90ZTogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHksIGZvciB0aGUgZHVtcCBwcm9ncmFtLgorICogRXh0Mi8zLzQgd2lsbCBuZXZlciBzdXBwb3J0IGZyYWdtZW50cy4uLi4KKyAqLworI2RlZmluZSBFWFQyX01JTl9GUkFHX1NJWkUgICAgICAgICAgICAgIEVYVDJfTUlOX0JMT0NLX1NJWkUKKyNkZWZpbmUgRVhUMl9NQVhfRlJBR19TSVpFICAgICAgICAgICAgICBFWFQyX01BWF9CTE9DS19TSVpFCisjZGVmaW5lIEVYVDJfTUlOX0ZSQUdfTE9HX1NJWkUgICAgICAgICAgRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUKKyNkZWZpbmUgRVhUMl9GUkFHX1NJWkUocykJCUVYVDJfQkxPQ0tfU0laRShzKQorI2RlZmluZSBFWFQyX0ZSQUdTX1BFUl9CTE9DSyhzKQkJMQorCisvKgorICogQUNMIHN0cnVjdHVyZXMKKyAqLworc3RydWN0IGV4dDJfYWNsX2hlYWRlcgkvKiBIZWFkZXIgb2YgQWNjZXNzIENvbnRyb2wgTGlzdHMgKi8KK3sKKwlfX3UzMglhY2xoX3NpemU7CisJX191MzIJYWNsaF9maWxlX2NvdW50OworCV9fdTMyCWFjbGhfYWNsZV9jb3VudDsKKwlfX3UzMglhY2xoX2ZpcnN0X2FjbGU7Cit9OworCitzdHJ1Y3QgZXh0Ml9hY2xfZW50cnkJLyogQWNjZXNzIENvbnRyb2wgTGlzdCBFbnRyeSAqLworeworCV9fdTMyCWFjbGVfc2l6ZTsKKwlfX3UxNglhY2xlX3Blcm1zOwkvKiBBY2Nlc3MgcGVybWlzc2lvbnMgKi8KKwlfX3UxNglhY2xlX3R5cGU7CS8qIFR5cGUgb2YgZW50cnkgKi8KKwlfX3UxNglhY2xlX3RhZzsJLyogVXNlciBvciBncm91cCBpZGVudGl0eSAqLworCV9fdTE2CWFjbGVfcGFkMTsKKwlfX3UzMglhY2xlX25leHQ7CS8qIFBvaW50ZXIgb24gbmV4dCBlbnRyeSBmb3IgdGhlICovCisJCQkJCS8qIHNhbWUgaW5vZGUgb3Igb24gbmV4dCBmcmVlIGVudHJ5ICovCit9OworCisvKgorICogU3RydWN0dXJlIG9mIGEgYmxvY2tzIGdyb3VwIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGV4dDJfZ3JvdXBfZGVzYworeworCV9fdTMyCWJnX2Jsb2NrX2JpdG1hcDsJLyogQmxvY2tzIGJpdG1hcCBibG9jayAqLworCV9fdTMyCWJnX2lub2RlX2JpdG1hcDsJLyogSW5vZGVzIGJpdG1hcCBibG9jayAqLworCV9fdTMyCWJnX2lub2RlX3RhYmxlOwkJLyogSW5vZGVzIHRhYmxlIGJsb2NrICovCisJX191MTYJYmdfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisJX191MTYJYmdfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX191MTYJYmdfdXNlZF9kaXJzX2NvdW50OwkvKiBEaXJlY3RvcmllcyBjb3VudCAqLworCV9fdTE2CWJnX2ZsYWdzOworCV9fdTMyCWJnX2V4Y2x1ZGVfYml0bWFwX2xvOwkvKiBFeGNsdWRlIGJpdG1hcCBmb3Igc25hcHNob3RzICovCisJX191MTYJYmdfYmxvY2tfYml0bWFwX2NzdW1fbG87LyogY3JjMzJjKHNfdXVpZCtncnBfbnVtK2JpdG1hcCkgTFNCICovCisJX191MTYJYmdfaW5vZGVfYml0bWFwX2NzdW1fbG87LyogY3JjMzJjKHNfdXVpZCtncnBfbnVtK2JpdG1hcCkgTFNCICovCisJX191MTYJYmdfaXRhYmxlX3VudXNlZDsJLyogVW51c2VkIGlub2RlcyBjb3VudCAqLworCV9fdTE2CWJnX2NoZWNrc3VtOwkJLyogY3JjMTYoc191dWlkK2dyb3VvX251bStncm91cF9kZXNjKSovCit9OworCisvKgorICogU3RydWN0dXJlIG9mIGEgYmxvY2tzIGdyb3VwIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGV4dDRfZ3JvdXBfZGVzYworeworCV9fdTMyCWJnX2Jsb2NrX2JpdG1hcDsJLyogQmxvY2tzIGJpdG1hcCBibG9jayAqLworCV9fdTMyCWJnX2lub2RlX2JpdG1hcDsJLyogSW5vZGVzIGJpdG1hcCBibG9jayAqLworCV9fdTMyCWJnX2lub2RlX3RhYmxlOwkJLyogSW5vZGVzIHRhYmxlIGJsb2NrICovCisJX191MTYJYmdfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisJX191MTYJYmdfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX191MTYJYmdfdXNlZF9kaXJzX2NvdW50OwkvKiBEaXJlY3RvcmllcyBjb3VudCAqLworCV9fdTE2CWJnX2ZsYWdzOwkJLyogRVhUNF9CR19mbGFncyAoSU5PREVfVU5JTklULCBldGMpICovCisJX191MzIJYmdfZXhjbHVkZV9iaXRtYXBfbG87CS8qIEV4Y2x1ZGUgYml0bWFwIGZvciBzbmFwc2hvdHMgKi8KKwlfX3UxNgliZ19ibG9ja19iaXRtYXBfY3N1bV9sbzsvKiBjcmMzMmMoc191dWlkK2dycF9udW0rYml0bWFwKSBMU0IgKi8KKwlfX3UxNgliZ19pbm9kZV9iaXRtYXBfY3N1bV9sbzsvKiBjcmMzMmMoc191dWlkK2dycF9udW0rYml0bWFwKSBMU0IgKi8KKwlfX3UxNgliZ19pdGFibGVfdW51c2VkOwkvKiBVbnVzZWQgaW5vZGVzIGNvdW50ICovCisJX191MTYJYmdfY2hlY2tzdW07CQkvKiBjcmMxNihzYl91dWlkK2dyb3VwK2Rlc2MpICovCisJX191MzIJYmdfYmxvY2tfYml0bWFwX2hpOwkvKiBCbG9ja3MgYml0bWFwIGJsb2NrIE1TQiAqLworCV9fdTMyCWJnX2lub2RlX2JpdG1hcF9oaTsJLyogSW5vZGVzIGJpdG1hcCBibG9jayBNU0IgKi8KKwlfX3UzMgliZ19pbm9kZV90YWJsZV9oaTsJLyogSW5vZGVzIHRhYmxlIGJsb2NrIE1TQiAqLworCV9fdTE2CWJnX2ZyZWVfYmxvY2tzX2NvdW50X2hpOy8qIEZyZWUgYmxvY2tzIGNvdW50IE1TQiAqLworCV9fdTE2CWJnX2ZyZWVfaW5vZGVzX2NvdW50X2hpOy8qIEZyZWUgaW5vZGVzIGNvdW50IE1TQiAqLworCV9fdTE2CWJnX3VzZWRfZGlyc19jb3VudF9oaTsJLyogRGlyZWN0b3JpZXMgY291bnQgTVNCICovCisJX191MTYJYmdfaXRhYmxlX3VudXNlZF9oaTsJLyogVW51c2VkIGlub2RlcyBjb3VudCBNU0IgKi8KKwlfX3UzMgliZ19leGNsdWRlX2JpdG1hcF9oaTsJLyogRXhjbHVkZSBiaXRtYXAgYmxvY2sgTVNCICovCisJX191MTYJYmdfYmxvY2tfYml0bWFwX2NzdW1faGk7LyogY3JjMzJjKHNfdXVpZCtncnBfbnVtK2JpdG1hcCkgTVNCICovCisJX191MTYJYmdfaW5vZGVfYml0bWFwX2NzdW1faGk7LyogY3JjMzJjKHNfdXVpZCtncnBfbnVtK2JpdG1hcCkgTVNCICovCisJX191MzIJYmdfcmVzZXJ2ZWQ7Cit9OworCisjZGVmaW5lIEVYVDJfQkdfSU5PREVfVU5JTklUCTB4MDAwMSAvKiBJbm9kZSB0YWJsZS9iaXRtYXAgbm90IGluaXRpYWxpemVkICovCisjZGVmaW5lIEVYVDJfQkdfQkxPQ0tfVU5JTklUCTB4MDAwMiAvKiBCbG9jayBiaXRtYXAgbm90IGluaXRpYWxpemVkICovCisjZGVmaW5lIEVYVDJfQkdfSU5PREVfWkVST0VECTB4MDAwNCAvKiBPbi1kaXNrIGl0YWJsZSBpbml0aWFsaXplZCB0byB6ZXJvICovCisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgZGlyZWN0b3J5IGluZGV4aW5nIGZlYXR1cmUKKyAqCisgKiBOb3RlOiBhbGwgb2YgdGhlIG11bHRpYnl0ZSBpbnRlZ2VyIGZpZWxkcyBhcmUgbGl0dGxlIGVuZGlhbi4KKyAqLworCisvKgorICogTm90ZTogZHhfcm9vdF9pbmZvIGlzIGxhaWQgb3V0IHNvIHRoYXQgaWYgaXQgc2hvdWxkIHNvbWVob3cgZ2V0CisgKiBvdmVybGFpZCBieSBhIGRpcmVudCB0aGUgdHdvIGxvdyBiaXRzIG9mIHRoZSBoYXNoIHZlcnNpb24gd2lsbCBiZQorICogemVyby4gIFRoZXJlZm9yZSwgdGhlIGhhc2ggdmVyc2lvbiBtb2QgNCBzaG91bGQgbmV2ZXIgYmUgMC4KKyAqIFNpbmNlcmVseSwgdGhlIHBhcmFub2lhIGRlcGFydG1lbnQuCisgKi8KK3N0cnVjdCBleHQyX2R4X3Jvb3RfaW5mbyB7CisJX191MzIgcmVzZXJ2ZWRfemVybzsKKwlfX3U4IGhhc2hfdmVyc2lvbjsgLyogMCBub3csIDEgYXQgcmVsZWFzZSAqLworCV9fdTggaW5mb19sZW5ndGg7IC8qIDggKi8KKwlfX3U4IGluZGlyZWN0X2xldmVsczsKKwlfX3U4IHVudXNlZF9mbGFnczsKK307CisKKyNkZWZpbmUgRVhUMl9IQVNIX0xFR0FDWQkJMAorI2RlZmluZSBFWFQyX0hBU0hfSEFMRl9NRDQJCTEKKyNkZWZpbmUgRVhUMl9IQVNIX1RFQQkJCTIKKyNkZWZpbmUgRVhUMl9IQVNIX0xFR0FDWV9VTlNJR05FRAkzIC8qIHJlc2VydmVkIGZvciB1c2Vyc3BhY2UgbGliICovCisjZGVmaW5lIEVYVDJfSEFTSF9IQUxGX01ENF9VTlNJR05FRAk0IC8qIHJlc2VydmVkIGZvciB1c2Vyc3BhY2UgbGliICovCisjZGVmaW5lIEVYVDJfSEFTSF9URUFfVU5TSUdORUQJCTUgLyogcmVzZXJ2ZWQgZm9yIHVzZXJzcGFjZSBsaWIgKi8KKworI2RlZmluZSBFWFQyX0hBU0hfRkxBR19JTkNPTVBBVAkweDEKKworc3RydWN0IGV4dDJfZHhfZW50cnkgeworCV9fdTMyIGhhc2g7CisJX191MzIgYmxvY2s7Cit9OworCitzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0IHsKKwlfX3UxNiBsaW1pdDsKKwlfX3UxNiBjb3VudDsKK307CisKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBncm91cCBkZXNjcmlwdG9ycworICovCisjZGVmaW5lIEVYVDJfTUlOX0RFU0NfU0laRSAgICAgICAgICAgICAzMgorI2RlZmluZSBFWFQyX01JTl9ERVNDX1NJWkVfNjRCSVQgICAgICAgNjQKKyNkZWZpbmUgRVhUMl9NQVhfREVTQ19TSVpFICAgICAgICAgICAgIEVYVDJfTUlOX0JMT0NLX1NJWkUKKyNkZWZpbmUgRVhUMl9ERVNDX1NJWkUocykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChFWFQyX1NCKHMpLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfNjRCSVQpID8gXAorCShzKS0+c19kZXNjX3NpemUgOiBFWFQyX01JTl9ERVNDX1NJWkUpCisKKyNkZWZpbmUgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHMpCShFWFQyX1NCKHMpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCisjZGVmaW5lIEVYVDJfSU5PREVTX1BFUl9HUk9VUChzKQkoRVhUMl9TQihzKS0+c19pbm9kZXNfcGVyX2dyb3VwKQorI2RlZmluZSBFWFQyX0NMVVNURVJTX1BFUl9HUk9VUChzKQkoRVhUMl9TQihzKS0+c19jbHVzdGVyc19wZXJfZ3JvdXApCisjZGVmaW5lIEVYVDJfSU5PREVTX1BFUl9CTE9DSyhzKQkoRVhUMl9CTE9DS19TSVpFKHMpL0VYVDJfSU5PREVfU0laRShzKSkKKy8qIGxpbWl0cyBpbXBvc2VkIGJ5IDE2LWJpdCB2YWx1ZSBnZF9mcmVlX3tibG9ja3MsaW5vZGV9X2NvdW50ICovCisjZGVmaW5lIEVYVDJfTUFYX0JMT0NLU19QRVJfR1JPVVAocykJKCgoKHVuc2lnbmVkKSAxIDw8IDE2KSAtIDgpICoJXAorCQkJCQkgKEVYVDJfQ0xVU1RFUl9TSVpFKHMpIC8gXAorCQkJCQkgIEVYVDJfQkxPQ0tfU0laRShzKSkpCisjZGVmaW5lIEVYVDJfTUFYX0NMVVNURVJTX1BFUl9HUk9VUChzKQkoKCh1bnNpZ25lZCkgMSA8PCAxNikgLSA4KQorI2RlZmluZSBFWFQyX01BWF9JTk9ERVNfUEVSX0dST1VQKHMpCSgoKHVuc2lnbmVkKSAxIDw8IDE2KSAtIFwKKwkJCQkJIEVYVDJfSU5PREVTX1BFUl9CTE9DSyhzKSkKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIEVYVDJfREVTQ19QRVJfQkxPQ0socykJCShFWFQyX1NCKHMpLT5zX2Rlc2NfcGVyX2Jsb2NrKQorI2RlZmluZSBFWFQyX0RFU0NfUEVSX0JMT0NLX0JJVFMocykJKEVYVDJfU0IocyktPnNfZGVzY19wZXJfYmxvY2tfYml0cykKKyNlbHNlCisjZGVmaW5lIEVYVDJfREVTQ19QRVJfQkxPQ0socykJCShFWFQyX0JMT0NLX1NJWkUocykgLyBFWFQyX0RFU0NfU0laRShzKSkKKyNlbmRpZgorCisvKgorICogQ29uc3RhbnRzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIGJsb2NrcworICovCisjZGVmaW5lIEVYVDJfTkRJUl9CTE9DS1MJCTEyCisjZGVmaW5lIEVYVDJfSU5EX0JMT0NLCQkJRVhUMl9ORElSX0JMT0NLUworI2RlZmluZSBFWFQyX0RJTkRfQkxPQ0sJCQkoRVhUMl9JTkRfQkxPQ0sgKyAxKQorI2RlZmluZSBFWFQyX1RJTkRfQkxPQ0sJCQkoRVhUMl9ESU5EX0JMT0NLICsgMSkKKyNkZWZpbmUgRVhUMl9OX0JMT0NLUwkJCShFWFQyX1RJTkRfQkxPQ0sgKyAxKQorCisvKgorICogSW5vZGUgZmxhZ3MKKyAqLworI2RlZmluZSBFWFQyX1NFQ1JNX0ZMCQkJMHgwMDAwMDAwMSAvKiBTZWN1cmUgZGVsZXRpb24gKi8KKyNkZWZpbmUgRVhUMl9VTlJNX0ZMCQkJMHgwMDAwMDAwMiAvKiBVbmRlbGV0ZSAqLworI2RlZmluZSBFWFQyX0NPTVBSX0ZMCQkJMHgwMDAwMDAwNCAvKiBDb21wcmVzcyBmaWxlICovCisjZGVmaW5lIEVYVDJfU1lOQ19GTAkJCTB4MDAwMDAwMDggLyogU3luY2hyb25vdXMgdXBkYXRlcyAqLworI2RlZmluZSBFWFQyX0lNTVVUQUJMRV9GTAkJMHgwMDAwMDAxMCAvKiBJbW11dGFibGUgZmlsZSAqLworI2RlZmluZSBFWFQyX0FQUEVORF9GTAkJCTB4MDAwMDAwMjAgLyogd3JpdGVzIHRvIGZpbGUgbWF5IG9ubHkgYXBwZW5kICovCisjZGVmaW5lIEVYVDJfTk9EVU1QX0ZMCQkJMHgwMDAwMDA0MCAvKiBkbyBub3QgZHVtcCBmaWxlICovCisjZGVmaW5lIEVYVDJfTk9BVElNRV9GTAkJCTB4MDAwMDAwODAgLyogZG8gbm90IHVwZGF0ZSBhdGltZSAqLworLyogUmVzZXJ2ZWQgZm9yIGNvbXByZXNzaW9uIHVzYWdlLi4uICovCisjZGVmaW5lIEVYVDJfRElSVFlfRkwJCQkweDAwMDAwMTAwCisjZGVmaW5lIEVYVDJfQ09NUFJCTEtfRkwJCTB4MDAwMDAyMDAgLyogT25lIG9yIG1vcmUgY29tcHJlc3NlZCBjbHVzdGVycyAqLworI2RlZmluZSBFWFQyX05PQ09NUFJfRkwJCQkweDAwMDAwNDAwIC8qIEFjY2VzcyByYXcgY29tcHJlc3NlZCBkYXRhICovCisjZGVmaW5lIEVYVDJfRUNPTVBSX0ZMCQkJMHgwMDAwMDgwMCAvKiBDb21wcmVzc2lvbiBlcnJvciAqLworLyogRW5kIGNvbXByZXNzaW9uIGZsYWdzIC0tLSBtYXliZSBub3QgYWxsIHVzZWQgKi8KKyNkZWZpbmUgRVhUMl9CVFJFRV9GTAkJCTB4MDAwMDEwMDAgLyogYnRyZWUgZm9ybWF0IGRpciAqLworI2RlZmluZSBFWFQyX0lOREVYX0ZMCQkJMHgwMDAwMTAwMCAvKiBoYXNoLWluZGV4ZWQgZGlyZWN0b3J5ICovCisjZGVmaW5lIEVYVDJfSU1BR0lDX0ZMCQkJMHgwMDAwMjAwMAorI2RlZmluZSBFWFQzX0pPVVJOQUxfREFUQV9GTAkJMHgwMDAwNDAwMCAvKiBmaWxlIGRhdGEgc2hvdWxkIGJlIGpvdXJuYWxlZCAqLworI2RlZmluZSBFWFQyX05PVEFJTF9GTAkJCTB4MDAwMDgwMDAgLyogZmlsZSB0YWlsIHNob3VsZCBub3QgYmUgbWVyZ2VkICovCisjZGVmaW5lIEVYVDJfRElSU1lOQ19GTCAJCTB4MDAwMTAwMDAgLyogU3luY2hyb25vdXMgZGlyZWN0b3J5IG1vZGlmaWNhdGlvbnMgKi8KKyNkZWZpbmUgRVhUMl9UT1BESVJfRkwJCQkweDAwMDIwMDAwIC8qIFRvcCBvZiBkaXJlY3RvcnkgaGllcmFyY2hpZXMqLworI2RlZmluZSBFWFQ0X0hVR0VfRklMRV9GTCAgICAgICAgICAgICAgIDB4MDAwNDAwMDAgLyogU2V0IHRvIGVhY2ggaHVnZSBmaWxlICovCisjZGVmaW5lIEVYVDRfRVhURU5UU19GTCAJCTB4MDAwODAwMDAgLyogSW5vZGUgdXNlcyBleHRlbnRzICovCisjZGVmaW5lIEVYVDRfRUFfSU5PREVfRkwJICAgICAgICAweDAwMjAwMDAwIC8qIElub2RlIHVzZWQgZm9yIGxhcmdlIEVBICovCisvKiBFWFQ0X0VPRkJMT0NLU19GTCAweDAwNDAwMDAwIHdhcyBoZXJlICovCisjZGVmaW5lIEVYVDRfU05BUEZJTEVfRkwJCTB4MDEwMDAwMDAgIC8qIElub2RlIGlzIGEgc25hcHNob3QgKi8KKyNkZWZpbmUgRVhUNF9TTkFQRklMRV9ERUxFVEVEX0ZMCTB4MDQwMDAwMDAgIC8qIFNuYXBzaG90IGlzIGJlaW5nIGRlbGV0ZWQgKi8KKyNkZWZpbmUgRVhUNF9TTkFQRklMRV9TSFJVTktfRkwJCTB4MDgwMDAwMDAgIC8qIFNuYXBzaG90IHNocmluayBoYXMgY29tcGxldGVkICovCisjZGVmaW5lIEVYVDJfUkVTRVJWRURfRkwJCTB4ODAwMDAwMDAgLyogcmVzZXJ2ZWQgZm9yIGV4dDIgbGliICovCisKKyNkZWZpbmUgRVhUMl9GTF9VU0VSX1ZJU0lCTEUJCTB4MDA0QkRGRkYgLyogVXNlciB2aXNpYmxlIGZsYWdzICovCisjZGVmaW5lIEVYVDJfRkxfVVNFUl9NT0RJRklBQkxFCQkweDAwNEI4MEZGIC8qIFVzZXIgbW9kaWZpYWJsZSBmbGFncyAqLworCisvKgorICogaW9jdGwgY29tbWFuZHMKKyAqLworCisvKiBVc2VkIGZvciBvbmxpbmUgcmVzaXplICovCitzdHJ1Y3QgZXh0Ml9uZXdfZ3JvdXBfaW5wdXQgeworCV9fdTMyIGdyb3VwOwkJLyogR3JvdXAgbnVtYmVyIGZvciB0aGlzIGRhdGEgKi8KKwlfX3UzMiBibG9ja19iaXRtYXA7CS8qIEFic29sdXRlIGJsb2NrIG51bWJlciBvZiBibG9jayBiaXRtYXAgKi8KKwlfX3UzMiBpbm9kZV9iaXRtYXA7CS8qIEFic29sdXRlIGJsb2NrIG51bWJlciBvZiBpbm9kZSBiaXRtYXAgKi8KKwlfX3UzMiBpbm9kZV90YWJsZTsJLyogQWJzb2x1dGUgYmxvY2sgbnVtYmVyIG9mIGlub2RlIHRhYmxlIHN0YXJ0ICovCisJX191MzIgYmxvY2tzX2NvdW50OwkvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgZ3JvdXAgKi8KKwlfX3UxNiByZXNlcnZlZF9ibG9ja3M7CS8qIE51bWJlciBvZiByZXNlcnZlZCBibG9ja3MgaW4gdGhpcyBncm91cCAqLworCV9fdTE2IHVudXNlZDsJCS8qIE51bWJlciBvZiByZXNlcnZlZCBHRFQgYmxvY2tzIGluIGdyb3VwICovCit9OworCitzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfaW5wdXQgeworCV9fdTMyIGdyb3VwOwkJLyogR3JvdXAgbnVtYmVyIGZvciB0aGlzIGRhdGEgKi8KKwlfX3U2NCBibG9ja19iaXRtYXA7CS8qIEFic29sdXRlIGJsb2NrIG51bWJlciBvZiBibG9jayBiaXRtYXAgKi8KKwlfX3U2NCBpbm9kZV9iaXRtYXA7CS8qIEFic29sdXRlIGJsb2NrIG51bWJlciBvZiBpbm9kZSBiaXRtYXAgKi8KKwlfX3U2NCBpbm9kZV90YWJsZTsJLyogQWJzb2x1dGUgYmxvY2sgbnVtYmVyIG9mIGlub2RlIHRhYmxlIHN0YXJ0ICovCisJX191MzIgYmxvY2tzX2NvdW50OwkvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgZ3JvdXAgKi8KKwlfX3UxNiByZXNlcnZlZF9ibG9ja3M7CS8qIE51bWJlciBvZiByZXNlcnZlZCBibG9ja3MgaW4gdGhpcyBncm91cCAqLworCV9fdTE2IHVudXNlZDsKK307CisKKyNpZmRlZiBfX0dOVV9fCQkJLyogTmVlZGVkIGZvciB0aGUgSHVyZCAqLworI2RlZmluZSBfSU9UX2V4dDJfbmV3X2dyb3VwX2lucHV0IF9JT1QgKF9JT1RTKF9fdTMyKSwgNSwgX0lPVFMoX191MTYpLCAyLCAwLCAwKQorI2VuZGlmCisKKyNkZWZpbmUgRVhUMl9JT0NfR0VURkxBR1MJCV9JT1IoJ2YnLCAxLCBsb25nKQorI2RlZmluZSBFWFQyX0lPQ19TRVRGTEFHUwkJX0lPVygnZicsIDIsIGxvbmcpCisjZGVmaW5lIEVYVDJfSU9DX0dFVFZFUlNJT04JCV9JT1IoJ3YnLCAxLCBsb25nKQorI2RlZmluZSBFWFQyX0lPQ19TRVRWRVJTSU9OCQlfSU9XKCd2JywgMiwgbG9uZykKKyNkZWZpbmUgRVhUMl9JT0NfR0VUVkVSU0lPTl9ORVcJCV9JT1IoJ2YnLCAzLCBsb25nKQorI2RlZmluZSBFWFQyX0lPQ19TRVRWRVJTSU9OX05FVwkJX0lPVygnZicsIDQsIGxvbmcpCisjZGVmaW5lIEVYVDJfSU9DX0dST1VQX0VYVEVORAkJX0lPVygnZicsIDcsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIEVYVDJfSU9DX0dST1VQX0FERAkJX0lPVygnZicsIDgsc3RydWN0IGV4dDJfbmV3X2dyb3VwX2lucHV0KQorI2RlZmluZSBFWFQ0X0lPQ19HUk9VUF9BREQJCV9JT1coJ2YnLCA4LHN0cnVjdCBleHQ0X25ld19ncm91cF9pbnB1dCkKKyNkZWZpbmUgRVhUNF9JT0NfUkVTSVpFX0ZTCQlfSU9XKCdmJywgMTYsIF9fdTY0KQorCisvKgorICogU3RydWN0dXJlIG9mIGFuIGlub2RlIG9uIHRoZSBkaXNrCisgKi8KK3N0cnVjdCBleHQyX2lub2RlIHsKKwlfX3UxNglpX21vZGU7CQkvKiBGaWxlIG1vZGUgKi8KKwlfX3UxNglpX3VpZDsJCS8qIExvdyAxNiBiaXRzIG9mIE93bmVyIFVpZCAqLworCV9fdTMyCWlfc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgKi8KKwlfX3UzMglpX2F0aW1lOwkvKiBBY2Nlc3MgdGltZSAqLworCV9fdTMyCWlfY3RpbWU7CS8qIElub2RlIGNoYW5nZSB0aW1lICovCisJX191MzIJaV9tdGltZTsJLyogTW9kaWZpY2F0aW9uIHRpbWUgKi8KKwlfX3UzMglpX2R0aW1lOwkvKiBEZWxldGlvbiBUaW1lICovCisJX191MTYJaV9naWQ7CQkvKiBMb3cgMTYgYml0cyBvZiBHcm91cCBJZCAqLworCV9fdTE2CWlfbGlua3NfY291bnQ7CS8qIExpbmtzIGNvdW50ICovCisJX191MzIJaV9ibG9ja3M7CS8qIEJsb2NrcyBjb3VudCAqLworCV9fdTMyCWlfZmxhZ3M7CS8qIEZpbGUgZmxhZ3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UzMglsX2lfdmVyc2lvbjsgLyogd2FzIGxfaV9yZXNlcnZlZDEgKi8KKwkJfSBsaW51eDE7CisJCXN0cnVjdCB7CisJCQlfX3UzMiAgaF9pX3RyYW5zbGF0b3I7CisJCX0gaHVyZDE7CisJfSBvc2QxOwkJCQkvKiBPUyBkZXBlbmRlbnQgMSAqLworCV9fdTMyCWlfYmxvY2tbRVhUMl9OX0JMT0NLU107LyogUG9pbnRlcnMgdG8gYmxvY2tzICovCisJX191MzIJaV9nZW5lcmF0aW9uOwkvKiBGaWxlIHZlcnNpb24gKGZvciBORlMpICovCisJX191MzIJaV9maWxlX2FjbDsJLyogRmlsZSBBQ0wgKi8KKwlfX3UzMglpX3NpemVfaGlnaDsJLyogRm9ybWVybHkgaV9kaXJfYWNsLCBkaXJlY3RvcnkgQUNMICovCisJX191MzIJaV9mYWRkcjsJLyogRnJhZ21lbnQgYWRkcmVzcyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTE2CWxfaV9ibG9ja3NfaGk7CisJCQlfX3UxNglsX2lfZmlsZV9hY2xfaGlnaDsKKwkJCV9fdTE2CWxfaV91aWRfaGlnaDsJLyogdGhlc2UgMiBmaWVsZHMgICAgKi8KKwkJCV9fdTE2CWxfaV9naWRfaGlnaDsJLyogd2VyZSByZXNlcnZlZDJbMF0gKi8KKwkJCV9fdTE2CWxfaV9jaGVja3N1bV9sbzsgLyogY3JjMzJjKHV1aWQraW51bStpbm9kZSkgKi8KKwkJCV9fdTE2CWxfaV9yZXNlcnZlZDsKKwkJfSBsaW51eDI7CisJCXN0cnVjdCB7CisJCQlfX3U4CWhfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJaF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX3UxNgloX2lfbW9kZV9oaWdoOworCQkJX191MTYJaF9pX3VpZF9oaWdoOworCQkJX191MTYJaF9pX2dpZF9oaWdoOworCQkJX191MzIJaF9pX2F1dGhvcjsKKwkJfSBodXJkMjsKKwl9IG9zZDI7CQkJCS8qIE9TIGRlcGVuZGVudCAyICovCit9OworCisvKgorICogUGVybWFuZW50IHBhcnQgb2YgYW4gbGFyZ2UgaW5vZGUgb24gdGhlIGRpc2sKKyAqLworc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgeworCV9fdTE2CWlfbW9kZTsJCS8qIEZpbGUgbW9kZSAqLworCV9fdTE2CWlfdWlkOwkJLyogTG93IDE2IGJpdHMgb2YgT3duZXIgVWlkICovCisJX191MzIJaV9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyAqLworCV9fdTMyCWlfYXRpbWU7CS8qIEFjY2VzcyB0aW1lICovCisJX191MzIJaV9jdGltZTsJLyogSW5vZGUgQ2hhbmdlIHRpbWUgKi8KKwlfX3UzMglpX210aW1lOwkvKiBNb2RpZmljYXRpb24gdGltZSAqLworCV9fdTMyCWlfZHRpbWU7CS8qIERlbGV0aW9uIFRpbWUgKi8KKwlfX3UxNglpX2dpZDsJCS8qIExvdyAxNiBiaXRzIG9mIEdyb3VwIElkICovCisJX191MTYJaV9saW5rc19jb3VudDsJLyogTGlua3MgY291bnQgKi8KKwlfX3UzMglpX2Jsb2NrczsJLyogQmxvY2tzIGNvdW50ICovCisJX191MzIJaV9mbGFnczsJLyogRmlsZSBmbGFncyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyCWxfaV92ZXJzaW9uOyAvKiB3YXMgbF9pX3Jlc2VydmVkMSAqLworCQl9IGxpbnV4MTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBoX2lfdHJhbnNsYXRvcjsKKwkJfSBodXJkMTsKKwl9IG9zZDE7CQkJCS8qIE9TIGRlcGVuZGVudCAxICovCisJX191MzIJaV9ibG9ja1tFWFQyX05fQkxPQ0tTXTsvKiBQb2ludGVycyB0byBibG9ja3MgKi8KKwlfX3UzMglpX2dlbmVyYXRpb247CS8qIEZpbGUgdmVyc2lvbiAoZm9yIE5GUykgKi8KKwlfX3UzMglpX2ZpbGVfYWNsOwkvKiBGaWxlIEFDTCAqLworCV9fdTMyCWlfc2l6ZV9oaWdoOwkvKiBGb3JtZXJseSBpX2Rpcl9hY2wsIGRpcmVjdG9yeSBBQ0wgKi8KKwlfX3UzMglpX2ZhZGRyOwkvKiBGcmFnbWVudCBhZGRyZXNzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MTYJbF9pX2Jsb2Nrc19oaTsKKwkJCV9fdTE2CWxfaV9maWxlX2FjbF9oaWdoOworCQkJX191MTYJbF9pX3VpZF9oaWdoOwkvKiB0aGVzZSAyIGZpZWxkcyAgICAqLworCQkJX191MTYJbF9pX2dpZF9oaWdoOwkvKiB3ZXJlIHJlc2VydmVkMlswXSAqLworCQkJX191MTYJbF9pX2NoZWNrc3VtX2xvOyAvKiBjcmMzMmModXVpZCtpbnVtK2lub2RlKSAqLworCQkJX191MTYJbF9pX3Jlc2VydmVkOworCQl9IGxpbnV4MjsKKwkJc3RydWN0IHsKKwkJCV9fdTgJaF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAloX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fdTE2CWhfaV9tb2RlX2hpZ2g7CisJCQlfX3UxNgloX2lfdWlkX2hpZ2g7CisJCQlfX3UxNgloX2lfZ2lkX2hpZ2g7CisJCQlfX3UzMgloX2lfYXV0aG9yOworCQl9IGh1cmQyOworCX0gb3NkMjsJCQkJLyogT1MgZGVwZW5kZW50IDIgKi8KKwlfX3UxNglpX2V4dHJhX2lzaXplOworCV9fdTE2CWlfY2hlY2tzdW1faGk7CS8qIGNyYzMyYyh1dWlkK2ludW0raW5vZGUpICovCisJX191MzIJaV9jdGltZV9leHRyYTsJLyogZXh0cmEgQ2hhbmdlIHRpbWUgKG5zZWMgPDwgMiB8IGVwb2NoKSAqLworCV9fdTMyCWlfbXRpbWVfZXh0cmE7CS8qIGV4dHJhIE1vZGlmaWNhdGlvbiB0aW1lIChuc2VjIDw8IDIgfCBlcG9jaCkgKi8KKwlfX3UzMglpX2F0aW1lX2V4dHJhOwkvKiBleHRyYSBBY2Nlc3MgdGltZSAobnNlYyA8PCAyIHwgZXBvY2gpICovCisJX191MzIJaV9jcnRpbWU7CS8qIEZpbGUgY3JlYXRpb24gdGltZSAqLworCV9fdTMyCWlfY3J0aW1lX2V4dHJhOwkvKiBleHRyYSBGaWxlIGNyZWF0aW9uIHRpbWUgKG5zZWMgPDwgMiB8IGVwb2NoKSovCisJX191MzIJaV92ZXJzaW9uX2hpOwkvKiBoaWdoIDMyIGJpdHMgZm9yIDY0LWJpdCB2ZXJzaW9uICovCit9OworCisjZGVmaW5lIGlfZGlyX2FjbAlpX3NpemVfaGlnaAorCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fbGludXhfXykKKyNkZWZpbmUgaV9yZXNlcnZlZDEJb3NkMS5saW51eDEubF9pX3Jlc2VydmVkMQorI2RlZmluZSBpX2ZyYWcJCW9zZDIubGludXgyLmxfaV9mcmFnCisjZGVmaW5lIGlfZnNpemUJCW9zZDIubGludXgyLmxfaV9mc2l6ZQorI2RlZmluZSBpX3VpZF9sb3cJaV91aWQKKyNkZWZpbmUgaV9naWRfbG93CWlfZ2lkCisjZGVmaW5lIGlfdWlkX2hpZ2gJb3NkMi5saW51eDIubF9pX3VpZF9oaWdoCisjZGVmaW5lIGlfZ2lkX2hpZ2gJb3NkMi5saW51eDIubF9pX2dpZF9oaWdoCisjZWxzZQorI2lmIGRlZmluZWQoX19HTlVfXykKKworI2RlZmluZSBpX3RyYW5zbGF0b3IJb3NkMS5odXJkMS5oX2lfdHJhbnNsYXRvcgorI2RlZmluZSBpX2ZyYWcJCW9zZDIuaHVyZDIuaF9pX2ZyYWc7CisjZGVmaW5lIGlfZnNpemUJCW9zZDIuaHVyZDIuaF9pX2ZzaXplOworI2RlZmluZSBpX3VpZF9oaWdoCW9zZDIuaHVyZDIuaF9pX3VpZF9oaWdoCisjZGVmaW5lIGlfZ2lkX2hpZ2gJb3NkMi5odXJkMi5oX2lfZ2lkX2hpZ2gKKyNkZWZpbmUgaV9hdXRob3IJb3NkMi5odXJkMi5oX2lfYXV0aG9yCisKKyNlbmRpZiAgLyogX19HTlVfXyAqLworI2VuZGlmCS8qIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX2xpbnV4X18pICovCisKKyNkZWZpbmUgaW5vZGVfdWlkKGlub2RlKQkoKGlub2RlKS5pX3VpZCB8IChpbm9kZSkub3NkMi5saW51eDIubF9pX3VpZF9oaWdoIDw8IDE2KQorI2RlZmluZSBpbm9kZV9naWQoaW5vZGUpCSgoaW5vZGUpLmlfZ2lkIHwgKGlub2RlKS5vc2QyLmxpbnV4Mi5sX2lfZ2lkX2hpZ2ggPDwgMTYpCisjZGVmaW5lIGV4dDJmc19zZXRfaV91aWRfaGlnaChpbm9kZSx4KSAoKGlub2RlKS5vc2QyLmxpbnV4Mi5sX2lfdWlkX2hpZ2ggPSAoeCkpCisjZGVmaW5lIGV4dDJmc19zZXRfaV9naWRfaGlnaChpbm9kZSx4KSAoKGlub2RlKS5vc2QyLmxpbnV4Mi5sX2lfZ2lkX2hpZ2ggPSAoeCkpCisKKy8qCisgKiBGaWxlIHN5c3RlbSBzdGF0ZXMKKyAqLworI2RlZmluZSBFWFQyX1ZBTElEX0ZTCQkJMHgwMDAxCS8qIFVubW91bnRlZCBjbGVhbmx5ICovCisjZGVmaW5lIEVYVDJfRVJST1JfRlMJCQkweDAwMDIJLyogRXJyb3JzIGRldGVjdGVkICovCisjZGVmaW5lIEVYVDNfT1JQSEFOX0ZTCQkJMHgwMDA0CS8qIE9ycGhhbnMgYmVpbmcgcmVjb3ZlcmVkICovCisKKy8qCisgKiBNaXNjLiBmaWxlc3lzdGVtIGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19TSUdORURfSEFTSAkJMHgwMDAxICAvKiBTaWduZWQgZGlyaGFzaCBpbiB1c2UgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19VTlNJR05FRF9IQVNICTB4MDAwMiAgLyogVW5zaWduZWQgZGlyaGFzaCBpbiB1c2UgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19URVNUX0ZJTEVTWVMJCTB4MDAwNAkvKiBPSyBmb3IgdXNlIG9uIGRldmVsb3BtZW50IGNvZGUgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19JU19TTkFQU0hPVAkJMHgwMDEwCS8qIFRoaXMgaXMgYSBzbmFwc2hvdCBpbWFnZSAqLworI2RlZmluZSBFWFQyX0ZMQUdTX0ZJWF9TTkFQU0hPVAkJMHgwMDIwCS8qIFNuYXBzaG90IGlub2RlcyBjb3JydXB0ZWQgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19GSVhfRVhDTFVERQkJMHgwMDQwCS8qIEV4Y2x1ZGUgYml0bWFwcyBjb3JydXB0ZWQgKi8KKworLyoKKyAqIE1vdW50IGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9DSEVDSwkJMHgwMDAxCS8qIERvIG1vdW50LXRpbWUgY2hlY2tzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfR1JQSUQJCTB4MDAwNAkvKiBDcmVhdGUgZmlsZXMgd2l0aCBkaXJlY3RvcnkncyBncm91cCAqLworI2RlZmluZSBFWFQyX01PVU5UX0RFQlVHCQkweDAwMDgJLyogU29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfQ09OVAkJMHgwMDEwCS8qIENvbnRpbnVlIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19STwkJMHgwMDIwCS8qIFJlbW91bnQgZnMgcm8gb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1BBTklDCQkweDAwNDAJLyogUGFuaWMgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTUlOSVhfREYJCTB4MDA4MAkvKiBNaW1pY3MgdGhlIE1pbml4IHN0YXRmcyAqLworI2RlZmluZSBFWFQyX01PVU5UX05PX1VJRDMyCQkweDAyMDAgIC8qIERpc2FibGUgMzItYml0IFVJRHMgKi8KKworI2RlZmluZSBjbGVhcl9vcHQobywgb3B0KQkJbyAmPSB+RVhUMl9NT1VOVF8jI29wdAorI2RlZmluZSBzZXRfb3B0KG8sIG9wdCkJCQlvIHw9IEVYVDJfTU9VTlRfIyNvcHQKKyNkZWZpbmUgdGVzdF9vcHQoc2IsIG9wdCkJCShFWFQyX1NCKHNiKS0+c19tb3VudF9vcHQgJiBcCisJCQkJCSBFWFQyX01PVU5UXyMjb3B0KQorLyoKKyAqIE1heGltYWwgbW91bnQgY291bnRzIGJldHdlZW4gdHdvIGZpbGVzeXN0ZW0gY2hlY2tzCisgKi8KKyNkZWZpbmUgRVhUMl9ERkxfTUFYX01OVF9DT1VOVAkJMjAJLyogQWxsb3cgMjAgbW91bnRzICovCisjZGVmaW5lIEVYVDJfREZMX0NIRUNLSU5URVJWQUwJCTAJLyogRG9uJ3QgdXNlIGludGVydmFsIGNoZWNrICovCisKKy8qCisgKiBCZWhhdmlvdXIgd2hlbiBkZXRlY3RpbmcgZXJyb3JzCisgKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfQ09OVElOVUUJCTEJLyogQ29udGludWUgZXhlY3V0aW9uICovCisjZGVmaW5lIEVYVDJfRVJST1JTX1JPCQkJMgkvKiBSZW1vdW50IGZzIHJlYWQtb25seSAqLworI2RlZmluZSBFWFQyX0VSUk9SU19QQU5JQwkJMwkvKiBQYW5pYyAqLworI2RlZmluZSBFWFQyX0VSUk9SU19ERUZBVUxUCQlFWFQyX0VSUk9SU19DT05USU5VRQorCisjaWYgKF9fR05VQ19fID49IDQpCisjZGVmaW5lIGV4dDRfb2Zmc2V0b2YoVFlQRSxNRU1CRVIpIF9fYnVpbHRpbl9vZmZzZXRvZihUWVBFLE1FTUJFUikKKyNlbHNlCisjZGVmaW5lIGV4dDRfb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHNpemVfdCkgJigoVFlQRSAqKTApLT5NRU1CRVIpCisjZW5kaWYKKworLyoKKyAqIFN0cnVjdHVyZSBvZiB0aGUgc3VwZXIgYmxvY2sKKyAqLworc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgeworCV9fdTMyCXNfaW5vZGVzX2NvdW50OwkJLyogSW5vZGVzIGNvdW50ICovCisJX191MzIJc19ibG9ja3NfY291bnQ7CQkvKiBCbG9ja3MgY291bnQgKi8KKwlfX3UzMglzX3JfYmxvY2tzX2NvdW50OwkvKiBSZXNlcnZlZCBibG9ja3MgY291bnQgKi8KKwlfX3UzMglzX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fdTMyCXNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX191MzIJc19maXJzdF9kYXRhX2Jsb2NrOwkvKiBGaXJzdCBEYXRhIEJsb2NrICovCisJX191MzIJc19sb2dfYmxvY2tfc2l6ZTsJLyogQmxvY2sgc2l6ZSAqLworCV9fdTMyCXNfbG9nX2NsdXN0ZXJfc2l6ZTsJLyogQWxsb2NhdGlvbiBjbHVzdGVyIHNpemUgKi8KKwlfX3UzMglzX2Jsb2Nrc19wZXJfZ3JvdXA7CS8qICMgQmxvY2tzIHBlciBncm91cCAqLworCV9fdTMyCXNfY2x1c3RlcnNfcGVyX2dyb3VwOwkvKiAjIEZyYWdtZW50cyBwZXIgZ3JvdXAgKi8KKwlfX3UzMglzX2lub2Rlc19wZXJfZ3JvdXA7CS8qICMgSW5vZGVzIHBlciBncm91cCAqLworCV9fdTMyCXNfbXRpbWU7CQkvKiBNb3VudCB0aW1lICovCisJX191MzIJc193dGltZTsJCS8qIFdyaXRlIHRpbWUgKi8KKwlfX3UxNglzX21udF9jb3VudDsJCS8qIE1vdW50IGNvdW50ICovCisJX19zMTYJc19tYXhfbW50X2NvdW50OwkvKiBNYXhpbWFsIG1vdW50IGNvdW50ICovCisJX191MTYJc19tYWdpYzsJCS8qIE1hZ2ljIHNpZ25hdHVyZSAqLworCV9fdTE2CXNfc3RhdGU7CQkvKiBGaWxlIHN5c3RlbSBzdGF0ZSAqLworCV9fdTE2CXNfZXJyb3JzOwkJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCV9fdTE2CXNfbWlub3JfcmV2X2xldmVsOwkvKiBtaW5vciByZXZpc2lvbiBsZXZlbCAqLworCV9fdTMyCXNfbGFzdGNoZWNrOwkJLyogdGltZSBvZiBsYXN0IGNoZWNrICovCisJX191MzIJc19jaGVja2ludGVydmFsOwkvKiBtYXguIHRpbWUgYmV0d2VlbiBjaGVja3MgKi8KKwlfX3UzMglzX2NyZWF0b3Jfb3M7CQkvKiBPUyAqLworCV9fdTMyCXNfcmV2X2xldmVsOwkJLyogUmV2aXNpb24gbGV2ZWwgKi8KKwlfX3UxNglzX2RlZl9yZXN1aWQ7CQkvKiBEZWZhdWx0IHVpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJX191MTYJc19kZWZfcmVzZ2lkOwkJLyogRGVmYXVsdCBnaWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBmb3IgRVhUMl9EWU5BTUlDX1JFViBzdXBlcmJsb2NrcyBvbmx5LgorCSAqCisJICogTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29tcGF0aWJsZSBmZWF0dXJlIHNldCBhbmQKKwkgKiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IGlzIHRoYXQgaWYgdGhlcmUgaXMgYSBiaXQgc2V0CisJICogaW4gdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCB0aGF0IHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIGtub3cgYWJvdXQsIGl0IHNob3VsZCByZWZ1c2UgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0uCisJICoKKwkgKiBlMmZzY2sncyByZXF1aXJlbWVudHMgYXJlIG1vcmUgc3RyaWN0OyBpZiBpdCBkb2Vzbid0IGtub3cKKwkgKiBhYm91dCBhIGZlYXR1cmUgaW4gZWl0aGVyIHRoZSBjb21wYXRpYmxlIG9yIGluY29tcGF0aWJsZQorCSAqIGZlYXR1cmUgc2V0LCBpdCBtdXN0IGFib3J0IGFuZCBub3QgdHJ5IHRvIG1lZGRsZSB3aXRoCisJICogdGhpbmdzIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZC4uLgorCSAqLworCV9fdTMyCXNfZmlyc3RfaW5vOwkJLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlICovCisJX191MTYgICBzX2lub2RlX3NpemU7CQkvKiBzaXplIG9mIGlub2RlIHN0cnVjdHVyZSAqLworCV9fdTE2CXNfYmxvY2tfZ3JvdXBfbnI7CS8qIGJsb2NrIGdyb3VwICMgb2YgdGhpcyBzdXBlcmJsb2NrICovCisJX191MzIJc19mZWF0dXJlX2NvbXBhdDsJLyogY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fdTMyCXNfZmVhdHVyZV9pbmNvbXBhdDsJLyogaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX191MzIJc19mZWF0dXJlX3JvX2NvbXBhdDsJLyogcmVhZG9ubHktY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fdTgJc191dWlkWzE2XTsJCS8qIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lICovCisJY2hhcglzX3ZvbHVtZV9uYW1lWzE2XTsJLyogdm9sdW1lIG5hbWUgKi8KKwljaGFyCXNfbGFzdF9tb3VudGVkWzY0XTsJLyogZGlyZWN0b3J5IHdoZXJlIGxhc3QgbW91bnRlZCAqLworCV9fdTMyCXNfYWxnb3JpdGhtX3VzYWdlX2JpdG1hcDsgLyogRm9yIGNvbXByZXNzaW9uICovCisJLyoKKwkgKiBQZXJmb3JtYW5jZSBoaW50cy4gIERpcmVjdG9yeSBwcmVhbGxvY2F0aW9uIHNob3VsZCBvbmx5CisJICogaGFwcGVuIGlmIHRoZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9QUkVBTExPQyBmbGFnIGlzIG9uLgorCSAqLworCV9fdTgJc19wcmVhbGxvY19ibG9ja3M7CS8qIE5yIG9mIGJsb2NrcyB0byB0cnkgdG8gcHJlYWxsb2NhdGUqLworCV9fdTgJc19wcmVhbGxvY19kaXJfYmxvY2tzOwkvKiBOciB0byBwcmVhbGxvY2F0ZSBmb3IgZGlycyAqLworCV9fdTE2CXNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrczsJLyogUGVyIGdyb3VwIHRhYmxlIGZvciBvbmxpbmUgZ3Jvd3RoICovCisJLyoKKwkgKiBKb3VybmFsaW5nIHN1cHBvcnQgdmFsaWQgaWYgRVhUMl9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCBzZXQuCisJICovCisJX191OAlzX2pvdXJuYWxfdXVpZFsxNl07CS8qIHV1aWQgb2Ygam91cm5hbCBzdXBlcmJsb2NrICovCisJX191MzIJc19qb3VybmFsX2ludW07CQkvKiBpbm9kZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX191MzIJc19qb3VybmFsX2RldjsJCS8qIGRldmljZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX191MzIJc19sYXN0X29ycGhhbjsJCS8qIHN0YXJ0IG9mIGxpc3Qgb2YgaW5vZGVzIHRvIGRlbGV0ZSAqLworCV9fdTMyCXNfaGFzaF9zZWVkWzRdOwkJLyogSFRSRUUgaGFzaCBzZWVkICovCisJX191OAlzX2RlZl9oYXNoX3ZlcnNpb247CS8qIERlZmF1bHQgaGFzaCB2ZXJzaW9uIHRvIHVzZSAqLworCV9fdTgJc19qbmxfYmFja3VwX3R5cGU7IAkvKiBEZWZhdWx0IHR5cGUgb2Ygam91cm5hbCBiYWNrdXAgKi8KKwlfX3UxNglzX2Rlc2Nfc2l6ZTsJCS8qIEdyb3VwIGRlc2MuIHNpemU6IElOQ09NUEFUXzY0QklUICovCisJX191MzIJc19kZWZhdWx0X21vdW50X29wdHM7CisJX191MzIJc19maXJzdF9tZXRhX2JnOwkvKiBGaXJzdCBtZXRhYmxvY2sgZ3JvdXAgKi8KKwlfX3UzMglzX21rZnNfdGltZTsJCS8qIFdoZW4gdGhlIGZpbGVzeXN0ZW0gd2FzIGNyZWF0ZWQgKi8KKwlfX3UzMglzX2pubF9ibG9ja3NbMTddOyAJLyogQmFja3VwIG9mIHRoZSBqb3VybmFsIGlub2RlICovCisJX191MzIJc19ibG9ja3NfY291bnRfaGk7CS8qIEJsb2NrcyBjb3VudCBoaWdoIDMyYml0cyAqLworCV9fdTMyCXNfcl9ibG9ja3NfY291bnRfaGk7CS8qIFJlc2VydmVkIGJsb2NrcyBjb3VudCBoaWdoIDMyIGJpdHMqLworCV9fdTMyCXNfZnJlZV9ibG9ja3NfaGk7IAkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fdTE2CXNfbWluX2V4dHJhX2lzaXplOwkvKiBBbGwgaW5vZGVzIGhhdmUgYXQgbGVhc3QgIyBieXRlcyAqLworCV9fdTE2CXNfd2FudF9leHRyYV9pc2l6ZTsgCS8qIE5ldyBpbm9kZXMgc2hvdWxkIHJlc2VydmUgIyBieXRlcyAqLworCV9fdTMyCXNfZmxhZ3M7CQkvKiBNaXNjZWxsYW5lb3VzIGZsYWdzICovCisJX191MTYgICBzX3JhaWRfc3RyaWRlOwkJLyogUkFJRCBzdHJpZGUgKi8KKwlfX3UxNiAgIHNfbW1wX3VwZGF0ZV9pbnRlcnZhbDsgIC8qICMgc2Vjb25kcyB0byB3YWl0IGluIE1NUCBjaGVja2luZyAqLworCV9fdTY0ICAgc19tbXBfYmxvY2s7ICAgICAgICAgICAgLyogQmxvY2sgZm9yIG11bHRpLW1vdW50IHByb3RlY3Rpb24gKi8KKwlfX3UzMiAgIHNfcmFpZF9zdHJpcGVfd2lkdGg7ICAgIC8qIGJsb2NrcyBvbiBhbGwgZGF0YSBkaXNrcyAoTipzdHJpZGUpKi8KKwlfX3U4CXNfbG9nX2dyb3Vwc19wZXJfZmxleDsJLyogRkxFWF9CRyBncm91cCBzaXplICovCisJX191OCAgICBzX3Jlc2VydmVkX2NoYXJfcGFkOworCV9fdTE2CXNfcmVzZXJ2ZWRfcGFkOwkJLyogUGFkZGluZyB0byBuZXh0IDMyYml0cyAqLworCV9fdTY0CXNfa2J5dGVzX3dyaXR0ZW47CS8qIG5yIG9mIGxpZmV0aW1lIGtpbG9ieXRlcyB3cml0dGVuICovCisJX191MzIJc19zbmFwc2hvdF9pbnVtOwkvKiBJbm9kZSBudW1iZXIgb2YgYWN0aXZlIHNuYXBzaG90ICovCisJX191MzIJc19zbmFwc2hvdF9pZDsJCS8qIHNlcXVlbnRpYWwgSUQgb2YgYWN0aXZlIHNuYXBzaG90ICovCisJX191NjQJc19zbmFwc2hvdF9yX2Jsb2Nrc19jb3VudDsgLyogcmVzZXJ2ZWQgYmxvY2tzIGZvciBhY3RpdmUKKwkJCQkJICAgICAgc25hcHNob3QncyBmdXR1cmUgdXNlICovCisJX191MzIJc19zbmFwc2hvdF9saXN0OwkvKiBpbm9kZSBudW1iZXIgb2YgdGhlIGhlYWQgb2YgdGhlIG9uLWRpc2sgc25hcHNob3QgbGlzdCAqLworI2RlZmluZSBFWFQ0X1NfRVJSX1NUQVJUIGV4dDRfb2Zmc2V0b2Yoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2ssIHNfZXJyb3JfY291bnQpCisJX191MzIJc19lcnJvcl9jb3VudDsJCS8qIG51bWJlciBvZiBmcyBlcnJvcnMgKi8KKwlfX3UzMglzX2ZpcnN0X2Vycm9yX3RpbWU7CS8qIGZpcnN0IHRpbWUgYW4gZXJyb3IgaGFwcGVuZWQgKi8KKwlfX3UzMglzX2ZpcnN0X2Vycm9yX2lubzsJLyogaW5vZGUgaW52b2x2ZWQgaW4gZmlyc3QgZXJyb3IgKi8KKwlfX3U2NAlzX2ZpcnN0X2Vycm9yX2Jsb2NrOwkvKiBibG9jayBpbnZvbHZlZCBvZiBmaXJzdCBlcnJvciAqLworCV9fdTgJc19maXJzdF9lcnJvcl9mdW5jWzMyXTsJLyogZnVuY3Rpb24gd2hlcmUgdGhlIGVycm9yIGhhcHBlbmVkICovCisJX191MzIJc19maXJzdF9lcnJvcl9saW5lOwkvKiBsaW5lIG51bWJlciB3aGVyZSBlcnJvciBoYXBwZW5lZCAqLworCV9fdTMyCXNfbGFzdF9lcnJvcl90aW1lOwkvKiBtb3N0IHJlY2VudCB0aW1lIG9mIGFuIGVycm9yICovCisJX191MzIJc19sYXN0X2Vycm9yX2lubzsJLyogaW5vZGUgaW52b2x2ZWQgaW4gbGFzdCBlcnJvciAqLworCV9fdTMyCXNfbGFzdF9lcnJvcl9saW5lOwkvKiBsaW5lIG51bWJlciB3aGVyZSBlcnJvciBoYXBwZW5lZCAqLworCV9fdTY0CXNfbGFzdF9lcnJvcl9ibG9jazsJLyogYmxvY2sgaW52b2x2ZWQgb2YgbGFzdCBlcnJvciAqLworCV9fdTgJc19sYXN0X2Vycm9yX2Z1bmNbMzJdOwkvKiBmdW5jdGlvbiB3aGVyZSB0aGUgZXJyb3IgaGFwcGVuZWQgKi8KKyNkZWZpbmUgRVhUNF9TX0VSUl9FTkQgZXh0NF9vZmZzZXRvZihzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jaywgc19tb3VudF9vcHRzKQorCV9fdTgJc19tb3VudF9vcHRzWzY0XTsKKwlfX3UzMglzX3Vzcl9xdW90YV9pbnVtOwkvKiBpbm9kZSBudW1iZXIgb2YgdXNlciBxdW90YSBmaWxlICovCisJX191MzIJc19ncnBfcXVvdGFfaW51bTsJLyogaW5vZGUgbnVtYmVyIG9mIGdyb3VwIHF1b3RhIGZpbGUgKi8KKwlfX3UzMglzX292ZXJoZWFkX2Jsb2NrczsJLyogb3ZlcmhlYWQgYmxvY2tzL2NsdXN0ZXJzIGluIGZzICovCisJX191MzIgICBzX3Jlc2VydmVkWzEwOF07ICAgICAgICAvKiBQYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCisJX191MzIJc19jaGVja3N1bTsJCS8qIGNyYzMyYyhzdXBlcmJsb2NrKSAqLworfTsKKworI2RlZmluZSBFWFQ0X1NfRVJSX0xFTiAoRVhUNF9TX0VSUl9FTkQgLSBFWFQ0X1NfRVJSX1NUQVJUKQorCisvKgorICogQ29kZXMgZm9yIG9wZXJhdGluZyBzeXN0ZW1zCisgKi8KKyNkZWZpbmUgRVhUMl9PU19MSU5VWAkJMAorI2RlZmluZSBFWFQyX09TX0hVUkQJCTEKKyNkZWZpbmUgRVhUMl9PQlNPX09TX01BU0lYCTIKKyNkZWZpbmUgRVhUMl9PU19GUkVFQlNECQkzCisjZGVmaW5lIEVYVDJfT1NfTElURVMJCTQKKworLyoKKyAqIFJldmlzaW9uIGxldmVscworICovCisjZGVmaW5lIEVYVDJfR09PRF9PTERfUkVWCTAJLyogVGhlIGdvb2Qgb2xkIChvcmlnaW5hbCkgZm9ybWF0ICovCisjZGVmaW5lIEVYVDJfRFlOQU1JQ19SRVYJMQkvKiBWMiBmb3JtYXQgdy8gZHluYW1pYyBpbm9kZSBzaXplcyAqLworCisjZGVmaW5lIEVYVDJfQ1VSUkVOVF9SRVYJRVhUMl9HT09EX09MRF9SRVYKKyNkZWZpbmUgRVhUMl9NQVhfU1VQUF9SRVYJRVhUMl9EWU5BTUlDX1JFVgorCisjZGVmaW5lIEVYVDJfR09PRF9PTERfSU5PREVfU0laRSAxMjgKKworLyoKKyAqIEpvdXJuYWwgaW5vZGUgYmFja3VwIHR5cGVzCisgKi8KKyNkZWZpbmUgRVhUM19KTkxfQkFDS1VQX0JMT0NLUwkxCisKKy8qCisgKiBGZWF0dXJlIHNldCBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgRVhUMl9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19mZWF0dXJlX2NvbXBhdCAmIChtYXNrKSApCisjZGVmaW5lIEVYVDJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUMl9TQihzYiktPnNfZmVhdHVyZV9yb19jb21wYXQgJiAobWFzaykgKQorI2RlZmluZSBFWFQyX0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUMl9TQihzYiktPnNfZmVhdHVyZV9pbmNvbXBhdCAmIChtYXNrKSApCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MJMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfSU1BR0lDX0lOT0RFUwkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTAkJMHgwMDA0CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIJCTB4MDAwOAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERQkweDAwMTAKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgJCTB4MDAyMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0xBWllfQkcJCTB4MDA0MAorLyogI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYQ0xVREVfSU5PREUJMHgwMDgwIG5vdCB1c2VkLCBsZWdhY3kgKi8KKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9FWENMVURFX0JJVE1BUAkweDAxMDAKKworCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUJMHgwMDAyCisvKiAjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSCTB4MDAwNCBub3QgdXNlZCAqLworI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0hVR0VfRklMRQkweDAwMDgKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9HRFRfQ1NVTQkJMHgwMDEwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfRElSX05MSU5LCTB4MDAyMAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0VYVFJBX0lTSVpFCTB4MDA0MAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0hBU19TTkFQU0hPVAkweDAwODAKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9RVU9UQQkJMHgwMTAwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfQklHQUxMT0MJCTB4MDIwMAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX01FVEFEQVRBX0NTVU0JMHgwNDAwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfUkVQTElDQQkJMHgwODAwCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0NPTVBSRVNTSU9OCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUJCTB4MDAwMgorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUgkJMHgwMDA0IC8qIE5lZWRzIHJlY292ZXJ5ICovCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVgkweDAwMDggLyogSm91cm5hbCBkZXZpY2UgKi8KKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcJCTB4MDAxMAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUwkJMHgwMDQwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF82NEJJVAkJMHgwMDgwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9NTVAJCTB4MDEwMAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRkxFWF9CRwkJMHgwMjAwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FQV9JTk9ERQkJMHgwNDAwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBCQkweDEwMDAKKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX1NVUFAJMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfU1VQUCAgICAoRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFfCBcCisJCQkJICAgICAgIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9NTVApCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRXwgXAorCQkJCQkgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9ESVJfTkxJTkt8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSKQorCisvKgorICogRGVmYXVsdCB2YWx1ZXMgZm9yIHVzZXIgYW5kL29yIGdyb3VwIHVzaW5nIHJlc2VydmVkIGJsb2NrcworICovCisjZGVmaW5lIEVYVDJfREVGX1JFU1VJRAkJMAorI2RlZmluZSBFWFQyX0RFRl9SRVNHSUQJCTAKKworLyoKKyAqIERlZmF1bHQgbW91bnQgb3B0aW9ucworICovCisjZGVmaW5lIEVYVDJfREVGTV9ERUJVRwkJMHgwMDAxCisjZGVmaW5lIEVYVDJfREVGTV9CU0RHUk9VUFMJMHgwMDAyCisjZGVmaW5lIEVYVDJfREVGTV9YQVRUUl9VU0VSCTB4MDAwNAorI2RlZmluZSBFWFQyX0RFRk1fQUNMCQkweDAwMDgKKyNkZWZpbmUgRVhUMl9ERUZNX1VJRDE2CQkweDAwMTAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFCQkweDAwNjAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX0RBVEEJMHgwMDIwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9PUkRFUkVECTB4MDA0MAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfV0JBQ0sJMHgwMDYwCisjZGVmaW5lIEVYVDRfREVGTV9OT0JBUlJJRVIJMHgwMTAwCisjZGVmaW5lIEVYVDRfREVGTV9CTE9DS19WQUxJRElUWSAweDAyMDAKKyNkZWZpbmUgRVhUNF9ERUZNX0RJU0NBUkQJMHgwNDAwCisjZGVmaW5lIEVYVDRfREVGTV9OT0RFTEFMTE9DCTB4MDgwMAorCisvKgorICogU3RydWN0dXJlIG9mIGEgZGlyZWN0b3J5IGVudHJ5CisgKi8KKyNkZWZpbmUgRVhUMl9OQU1FX0xFTiAyNTUKKworc3RydWN0IGV4dDJfZGlyX2VudHJ5IHsKKwlfX3UzMglpbm9kZTsJCQkvKiBJbm9kZSBudW1iZXIgKi8KKwlfX3UxNglyZWNfbGVuOwkJLyogRGlyZWN0b3J5IGVudHJ5IGxlbmd0aCAqLworCV9fdTE2CW5hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKwljaGFyCW5hbWVbRVhUMl9OQU1FX0xFTl07CS8qIEZpbGUgbmFtZSAqLworfTsKKworLyoKKyAqIFRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5LiAgU2luY2UgRVhUMiBzdHJ1Y3R1cmVzIGFyZQorICogc3RvcmVkIGluIGludGVsIGJ5dGUgb3JkZXIsIGFuZCB0aGUgbmFtZV9sZW4gZmllbGQgY291bGQgbmV2ZXIgYmUKKyAqIGJpZ2dlciB0aGFuIDI1NSBjaGFycywgaXQncyBzYWZlIHRvIHJlY2xhaW0gdGhlIGV4dHJhIGJ5dGUgZm9yIHRoZQorICogZmlsZV90eXBlIGZpZWxkLgorICovCitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiB7CisJX191MzIJaW5vZGU7CQkJLyogSW5vZGUgbnVtYmVyICovCisJX191MTYJcmVjX2xlbjsJCS8qIERpcmVjdG9yeSBlbnRyeSBsZW5ndGggKi8KKwlfX3U4CW5hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKwlfX3U4CWZpbGVfdHlwZTsKKwljaGFyCW5hbWVbRVhUMl9OQU1FX0xFTl07CS8qIEZpbGUgbmFtZSAqLworfTsKKworLyoKKyAqIEV4dDIgZGlyZWN0b3J5IGZpbGUgdHlwZXMuICBPbmx5IHRoZSBsb3cgMyBiaXRzIGFyZSB1c2VkLiAgVGhlCisgKiBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBmb3Igbm93LgorICovCisjZGVmaW5lIEVYVDJfRlRfVU5LTk9XTgkJMAorI2RlZmluZSBFWFQyX0ZUX1JFR19GSUxFCTEKKyNkZWZpbmUgRVhUMl9GVF9ESVIJCTIKKyNkZWZpbmUgRVhUMl9GVF9DSFJERVYJCTMKKyNkZWZpbmUgRVhUMl9GVF9CTEtERVYJCTQKKyNkZWZpbmUgRVhUMl9GVF9GSUZPCQk1CisjZGVmaW5lIEVYVDJfRlRfU09DSwkJNgorI2RlZmluZSBFWFQyX0ZUX1NZTUxJTksJCTcKKworI2RlZmluZSBFWFQyX0ZUX01BWAkJOAorCisvKgorICogRVhUMl9ESVJfUEFEIGRlZmluZXMgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGJvdW5kYXJpZXMKKyAqCisgKiBOT1RFOiBJdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNAorICovCisjZGVmaW5lIEVYVDJfRElSX1BBRAkJCTQKKyNkZWZpbmUgRVhUMl9ESVJfUk9VTkQJCQkoRVhUMl9ESVJfUEFEIC0gMSkKKyNkZWZpbmUgRVhUMl9ESVJfUkVDX0xFTihuYW1lX2xlbikJKCgobmFtZV9sZW4pICsgOCArIEVYVDJfRElSX1JPVU5EKSAmIFwKKwkJCQkJIH5FWFQyX0RJUl9ST1VORCkKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIG11bHRpcGxlIG1vdW50IHByb3RlY3Rpb24uIEl0IGlzIHdyaXR0ZW4KKyAqIGludG8gdGhlIGJsb2NrIG51bWJlciBzYXZlZCBpbiB0aGUgc19tbXBfYmxvY2sgZmllbGQgaW4gdGhlIHN1cGVyYmxvY2suCisgKiBQcm9ncmFtcyB0aGF0IGNoZWNrIE1NUCBzaG91bGQgYXNzdW1lIHRoYXQgaWYgU0VRX0ZTQ0sgKG9yIGFueSB1bmtub3duCisgKiBjb2RlIGFib3ZlIFNFUV9NQVgpIGlzIHByZXNlbnQgdGhlbiBpdCBpcyBOT1Qgc2FmZSB0byB1c2UgdGhlIGZpbGVzeXN0ZW0sCisgKiByZWdhcmRsZXNzIG9mIGhvdyBvbGQgdGhlIHRpbWVzdGFtcCBpcy4KKyAqCisgKiBUaGUgdGltZXN0YW1wIGluIHRoZSBNTVAgc3RydWN0dXJlIHdpbGwgYmUgdXBkYXRlZCBieSBlMmZzY2sgYXQgc29tZQorICogYXJiaXRhcnkgaW50ZXJ2YWxzIChzdGFydCBvZiBwYXNzZXMsIGFmdGVyIGV2ZXJ5IGZldyBncm91cHMgb2YgaW5vZGVzCisgKiBpbiBwYXNzMSBhbmQgcGFzczFiKS4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGUyZnNjayBpcyB1cGRhdGluZworICogdGhlIE1NUCBibG9jayBpbiBhIHRpbWVseSBtYW5uZXIsIGFuZCB0aGUgdXBkYXRlcyBpdCBkb2VzIGFyZSBwdXJlbHkKKyAqIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIHN5c2FkbWluIGFuZCBub3QgZm9yIGF1dG9tYXRpYyB2YWxpZGF0aW9uLgorICoKKyAqIE5vdGU6IE9ubHkgdGhlIG1tcF9zZXEgdmFsdWUgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgTU1QIGJsb2NrCisgKglpcyBiZWluZyB1cGRhdGVkLiAgVGhlIG1tcF90aW1lLCBtbXBfbm9kZW5hbWUsIGFuZCBtbXBfYmRldm5hbWUKKyAqCWZpZWxkcyBhcmUgb25seSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBmb3IgdGhlIGFkbWluaXN0cmF0b3IsCisgKglkdWUgdG8gY2xvY2sgc2tldyBiZXR3ZWVuIG5vZGVzIGFuZCBob3N0bmFtZSBIQSBzZXJ2aWNlIHRha2VvdmVyLgorICovCisjZGVmaW5lIEVYVDRfTU1QX01BR0lDICAgICAweDAwNEQ0RDUwVSAvKiBBU0NJSSBmb3IgTU1QICovCisjZGVmaW5lIEVYVDRfTU1QX1NFUV9DTEVBTiAweEZGNEQ0RDUwVSAvKiBtbXBfc2VxIHZhbHVlIGZvciBjbGVhbiB1bm1vdW50ICovCisjZGVmaW5lIEVYVDRfTU1QX1NFUV9GU0NLICAweEUyNEQ0RDUwVSAvKiBtbXBfc2VxIHZhbHVlIHdoZW4gYmVpbmcgZnNja2VkICovCisjZGVmaW5lIEVYVDRfTU1QX1NFUV9NQVggICAweEUyNEQ0RDRGVSAvKiBtYXhpbXVtIHZhbGlkIG1tcF9zZXEgdmFsdWUgKi8KKworc3RydWN0IG1tcF9zdHJ1Y3QgeworCV9fdTMyCW1tcF9tYWdpYzsJCS8qIE1hZ2ljIG51bWJlciBmb3IgTU1QICovCisJX191MzIJbW1wX3NlcTsJCS8qIFNlcXVlbmNlIG5vLiB1cGRhdGVkIHBlcmlvZGljYWxseSAqLworCV9fdTY0CW1tcF90aW1lOwkJLyogVGltZSBsYXN0IHVwZGF0ZWQgKi8KKwljaGFyCW1tcF9ub2RlbmFtZVs2NF07CS8qIE5vZGUgd2hpY2ggbGFzdCB1cGRhdGVkIE1NUCBibG9jayAqLworCWNoYXIJbW1wX2JkZXZuYW1lWzMyXTsJLyogQmRldiB3aGljaCBsYXN0IHVwZGF0ZWQgTU1QIGJsb2NrICovCisJX191MTYJbW1wX2NoZWNrX2ludGVydmFsOwkvKiBDaGFuZ2VkIG1tcF9jaGVja19pbnRlcnZhbCAqLworCV9fdTE2CW1tcF9wYWQxOworCV9fdTMyCW1tcF9wYWQyWzIyN107Cit9OworCisvKgorICogRGVmYXVsdCBpbnRlcnZhbCBmb3IgTU1QIHVwZGF0ZSBpbiBzZWNvbmRzLgorICovCisjZGVmaW5lIEVYVDRfTU1QX1VQREFURV9JTlRFUlZBTAk1CisKKy8qCisgKiBNYXhpbXVtIGludGVydmFsIGZvciBNTVAgdXBkYXRlIGluIHNlY29uZHMuCisgKi8KKyNkZWZpbmUgRVhUNF9NTVBfTUFYX1VQREFURV9JTlRFUlZBTAkzMDAKKworLyoKKyAqIE1pbmltdW0gaW50ZXJ2YWwgZm9yIE1NUCBjaGVja2luZyBpbiBzZWNvbmRzLgorICovCisjZGVmaW5lIEVYVDRfTU1QX01JTl9DSEVDS19JTlRFUlZBTCAgICAgNQorCisjZW5kaWYJLyogX0VYVDJGU19FWFQyX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9mcy5jIGIvbGliaW5zdGFsbGVyL2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkNjlkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9mcy5jCkBAIC0wLDAgKzEsMTc0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMTk5OC0yMDExIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDExIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KKyAqICAgQ29weXJpZ2h0IDIwMTEgUGF1bG8gQWxjYW50YXJhIDxwY2FjanJAZ21haWwuY29tPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBmcy5jIC0gR2VuZXJpYyBzYW5pdHkgY2hlY2sgZm9yIEZBVC9OVEZTLWJhc2VkIGluc3RhbGxlcnMKKyAqLworCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNTAwCS8qIFJlcXVpcmVkIG9uIGdsaWJjIDIueCAqLworI2RlZmluZSBfQlNEX1NPVVJDRQorLyogZ2xpYmMgMi4yMCBkZXByZWNhdGVzIF9CU0RfU09VUkNFIGluIGZhdm91ciBvZiBfREVGQVVMVF9TT1VSQ0UgKi8KKyNkZWZpbmUgX0RFRkFVTFRfU09VUkNFIDEKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzeXNsaW51eC5oIgorI2luY2x1ZGUgInN5c2x4aW50LmgiCisjaW5jbHVkZSAic3lzbHhjb20uaCIKKyNpbmNsdWRlICJzeXNseGZzLmgiCisKK3ZvaWQgc3lzbGludXhfbWFrZV9ib290c2VjdCh2b2lkICpicywgaW50IGZzX3R5cGUpCit7CisgICAgaWYgKGZzX3R5cGUgPT0gVkZBVCkgeworCXN0cnVjdCBmYXRfYm9vdF9zZWN0b3IgKmJvb3RzZWN0ID0gYnM7CisJY29uc3Qgc3RydWN0IGZhdF9ib290X3NlY3RvciAqc2JzID0KKwkgICAgKGNvbnN0IHN0cnVjdCBmYXRfYm9vdF9zZWN0b3IgKilib290X3NlY3RvcjsKKworCW1lbWNweSgmYm9vdHNlY3QtPkZBVF9ic0hlYWQsICZzYnMtPkZBVF9ic0hlYWQsIEZBVF9ic0hlYWRMZW4pOworCW1lbWNweSgmYm9vdHNlY3QtPkZBVF9ic0NvZGUsICZzYnMtPkZBVF9ic0NvZGUsIEZBVF9ic0NvZGVMZW4pOworICAgIH0gZWxzZSBpZiAoZnNfdHlwZSA9PSBOVEZTKSB7CisJc3RydWN0IG50ZnNfYm9vdF9zZWN0b3IgKmJvb3RzZWN0ID0gYnM7CisJY29uc3Qgc3RydWN0IG50ZnNfYm9vdF9zZWN0b3IgKnNicyA9CisJICAgIChjb25zdCBzdHJ1Y3QgbnRmc19ib290X3NlY3RvciAqKWJvb3Rfc2VjdG9yOworCisJbWVtY3B5KCZib290c2VjdC0+TlRGU19ic0hlYWQsICZzYnMtPk5URlNfYnNIZWFkLCBOVEZTX2JzSGVhZExlbik7CisJbWVtY3B5KCZib290c2VjdC0+TlRGU19ic0NvZGUsICZzYnMtPk5URlNfYnNDb2RlLCBOVEZTX2JzQ29kZUxlbik7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2hlY2tfZmF0X2Jvb3RzZWN0KGNvbnN0IHZvaWQgKmJzLCBpbnQgKmZzX3R5cGUpCit7CisgICAgaW50IHNlY3RvcnNpemU7CisgICAgY29uc3Qgc3RydWN0IGZhdF9ib290X3NlY3RvciAqc2VjdGJ1ZiA9IGJzOworICAgIGxvbmcgbG9uZyBzZWN0b3JzLCBmYXRzZWN0b3JzLCBkc2VjdG9yczsKKyAgICBsb25nIGxvbmcgY2x1c3RlcnM7CisgICAgaW50IHJvb3RkaXJlbnRzLCBjbHVzdGVyc2l6ZTsKKworICAgIHNlY3RvcnNpemUgPSBnZXRfMTYoJnNlY3RidWYtPmJzQnl0ZXNQZXJTZWMpOworCisgICAgY2x1c3RlcnNpemUgPSBnZXRfOCgmc2VjdGJ1Zi0+YnNTZWNQZXJDbHVzdCk7CisgICAgaWYgKGNsdXN0ZXJzaXplID09IDAgfHwgKGNsdXN0ZXJzaXplICYgKGNsdXN0ZXJzaXplIC0gMSkpKQorCXJldHVybiAiaW1wb3NzaWJsZSBjbHVzdGVyIHNpemUgb24gYW4gRkFUIHZvbHVtZSI7CisKKyAgICBzZWN0b3JzID0gZ2V0XzE2KCZzZWN0YnVmLT5ic1NlY3RvcnMpOworICAgIHNlY3RvcnMgPSBzZWN0b3JzID8gc2VjdG9ycyA6IGdldF8zMigmc2VjdGJ1Zi0+YnNIdWdlU2VjdG9ycyk7CisKKyAgICBkc2VjdG9ycyA9IHNlY3RvcnMgLSBnZXRfMTYoJnNlY3RidWYtPmJzUmVzU2VjdG9ycyk7CisKKyAgICBmYXRzZWN0b3JzID0gZ2V0XzE2KCZzZWN0YnVmLT5ic0ZBVHNlY3MpOworICAgIGZhdHNlY3RvcnMgPSBmYXRzZWN0b3JzID8gZmF0c2VjdG9ycyA6IGdldF8zMigmc2VjdGJ1Zi0+YnMzMi5GQVRTejMyKTsKKyAgICBmYXRzZWN0b3JzICo9IGdldF84KCZzZWN0YnVmLT5ic0ZBVHMpOworICAgIGRzZWN0b3JzIC09IGZhdHNlY3RvcnM7CisKKyAgICByb290ZGlyZW50cyA9IGdldF8xNigmc2VjdGJ1Zi0+YnNSb290RGlyRW50cyk7CisgICAgZHNlY3RvcnMgLT0gKHJvb3RkaXJlbnRzICsgc2VjdG9yc2l6ZSAvIDMyIC0gMSkgLyBzZWN0b3JzaXplOworCisgICAgaWYgKGRzZWN0b3JzIDwgMCkKKwlyZXR1cm4gIm5lZ2F0aXZlIG51bWJlciBvZiBkYXRhIHNlY3RvcnMgb24gYW4gRkFUIHZvbHVtZSI7CisKKyAgICBjbHVzdGVycyA9IGRzZWN0b3JzIC8gY2x1c3RlcnNpemU7CisKKyAgICBmYXRzZWN0b3JzID0gZ2V0XzE2KCZzZWN0YnVmLT5ic0ZBVHNlY3MpOworICAgIGZhdHNlY3RvcnMgPSBmYXRzZWN0b3JzID8gZmF0c2VjdG9ycyA6IGdldF8zMigmc2VjdGJ1Zi0+YnMzMi5GQVRTejMyKTsKKyAgICBmYXRzZWN0b3JzICo9IGdldF84KCZzZWN0YnVmLT5ic0ZBVHMpOworCisgICAgaWYgKCFmYXRzZWN0b3JzKQorCXJldHVybiAiemVybyBGQVQgc2VjdG9ycyI7CisKKyAgICBpZiAoY2x1c3RlcnMgPCAweEZGRjUpIHsKKwkvKiBGQVQxMiBvciBGQVQxNiAqLworCWlmICghZ2V0XzE2KCZzZWN0YnVmLT5ic0ZBVHNlY3MpKQorCSAgICByZXR1cm4gInplcm8gRkFUIHNlY3RvcnMgKEZBVDEyLzE2KSI7CisKKwlpZiAoZ2V0XzgoJnNlY3RidWYtPmJzMTYuQm9vdFNpZ25hdHVyZSkgPT0gMHgyOSkgeworCSAgICBpZiAoIW1lbWNtcCgmc2VjdGJ1Zi0+YnMxNi5GaWxlU3lzVHlwZSwgIkZBVDEyICAgIiwgOCkpIHsKKwkJaWYgKGNsdXN0ZXJzID49IDB4RkY1KQorCQkgICAgcmV0dXJuICJtb3JlIHRoYW4gNDA4NCBjbHVzdGVycyBidXQgY2xhaW1zIEZBVDEyIjsKKwkgICAgfSBlbHNlIGlmICghbWVtY21wKCZzZWN0YnVmLT5iczE2LkZpbGVTeXNUeXBlLCAiRkFUMTYgICAiLCA4KSkgeworCQlpZiAoY2x1c3RlcnMgPCAweEZGNSkKKwkJICAgIHJldHVybiAibGVzcyB0aGFuIDQwODQgY2x1c3RlcnMgYnV0IGNsYWltcyBGQVQxNiI7CisJICAgIH0gZWxzZSBpZiAoIW1lbWNtcCgmc2VjdGJ1Zi0+YnMxNi5GaWxlU3lzVHlwZSwgIkZBVDMyICAgIiwgOCkpIHsKKwkJcmV0dXJuICJsZXNzIHRoYW4gNjU1MjUgY2x1c3RlcnMgYnV0IGNsYWltcyBGQVQzMiI7CisJICAgIH0gZWxzZSBpZiAobWVtY21wKCZzZWN0YnVmLT5iczE2LkZpbGVTeXNUeXBlLCAiRkFUICAgICAiLCA4KSkgeworCQlzdGF0aWMgY2hhciBmc2VycltdID0gImZpbGVzeXN0ZW0gdHlwZSBcIj8/Pz8/Pz8/XCIgbm90ICIKKwkJICAgICJzdXBwb3J0ZWQiOworCQltZW1jcHkoZnNlcnIgKyAxNywgJnNlY3RidWYtPmJzMTYuRmlsZVN5c1R5cGUsIDgpOworCQlyZXR1cm4gZnNlcnI7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIGlmIChjbHVzdGVycyA8IDB4MEZGRkZGRjUpIHsKKwkvKgorCSAqIEZBVDMyLi4uCisJICoKKwkgKiBNb3ZpbmcgdGhlIEZpbGVTeXNUeXBlIGFuZCBCb290U2lnbmF0dXJlIHdhcyBhIGxvdmVseSBzdHJva2UKKwkgKiBvZiBNJCBpZGlvY3kuLi4KKwkgKi8KKwlpZiAoZ2V0XzgoJnNlY3RidWYtPmJzMzIuQm9vdFNpZ25hdHVyZSkgIT0gMHgyOSB8fAorCSAgICBtZW1jbXAoJnNlY3RidWYtPmJzMzIuRmlsZVN5c1R5cGUsICJGQVQzMiAgICIsIDgpKQorCSAgICByZXR1cm4gIm1pc3NpbmcgRkFUMzIgc2lnbmF0dXJlIjsKKyAgICB9IGVsc2UgeworCXJldHVybiAiaW1wb3NzaWJseSBsYXJnZSBudW1iZXIgb2YgY2x1c3RlcnMgb24gYW4gRkFUIHZvbHVtZSI7CisgICAgfQorCisgICAgaWYgKGZzX3R5cGUpCisJKmZzX3R5cGUgPSBWRkFUOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjaGVja19udGZzX2Jvb3RzZWN0KGNvbnN0IHZvaWQgKmJzLCBpbnQgKmZzX3R5cGUpCit7CisgICAgY29uc3Qgc3RydWN0IG50ZnNfYm9vdF9zZWN0b3IgKnNlY3RidWYgPSBiczsKKworICAgIGlmIChtZW1jbXAoJnNlY3RidWYtPmJzT2VtTmFtZSwgIk5URlMgICAgIiwgOCkgJiYKKwltZW1jbXAoJnNlY3RidWYtPmJzT2VtTmFtZSwgIk1TV0lONC4wIiwgOCkgJiYKKwltZW1jbXAoJnNlY3RidWYtPmJzT2VtTmFtZSwgIk1TV0lONC4xIiwgOCkpCisJcmV0dXJuICJ1bmtub3duIE9FTSBuYW1lIGJ1dCBjbGFpbXMgTlRGUyI7CisKKyAgICBpZiAoZnNfdHlwZSkKKwkqZnNfdHlwZSA9IE5URlM7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqc3lzbGludXhfY2hlY2tfYm9vdHNlY3QoY29uc3Qgdm9pZCAqYnMsIGludCAqZnNfdHlwZSkKK3sKKyAgICB1aW50OF90IG1lZGlhX3NpZzsKKyAgICBpbnQgc2VjdG9yc2l6ZTsKKyAgICBjb25zdCBzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yICpzZWN0YnVmID0gYnM7CisgICAgY29uc3QgY2hhciAqcmV0dmFsOworCisgICAgbWVkaWFfc2lnID0gZ2V0XzgoJnNlY3RidWYtPmJzTWVkaWEpOworICAgIC8qIE11c3QgYmUgMHhGMCBvciAweEY4LTB4RkYgZm9yIEZBVC9OVEZTIHZvbHVtZXMgKi8KKyAgICBpZiAobWVkaWFfc2lnICE9IDB4RjAgJiYgbWVkaWFfc2lnIDwgMHhGOCkKKwlyZXR1cm4gImludmFsaWQgbWVkaWEgc2lnbmF0dXJlIChub3QgYW4gRkFUL05URlMgdm9sdW1lPykiOworCisgICAgc2VjdG9yc2l6ZSA9IGdldF8xNigmc2VjdGJ1Zi0+YnNCeXRlc1BlclNlYyk7CisgICAgaWYgKHNlY3RvcnNpemUgPT0gU0VDVE9SX1NJWkUpIDsJLyogb2sgKi8KKyAgICBlbHNlIGlmIChzZWN0b3JzaXplID49IDUxMiAmJiBzZWN0b3JzaXplIDw9IDQwOTYgJiYKKwkgICAgIChzZWN0b3JzaXplICYgKHNlY3RvcnNpemUgLSAxKSkgPT0gMCkKKwlyZXR1cm4gInVuc3VwcG9ydGVkIHNlY3RvcnMgc2l6ZSI7CisgICAgZWxzZQorCXJldHVybiAiaW1wb3NzaWJsZSBzZWN0b3Igc2l6ZSI7CisKKyAgICBpZiAobnRmc19jaGVja196ZXJvX2ZpZWxkcygoc3RydWN0IG50ZnNfYm9vdF9zZWN0b3IgKilicykpCisJcmV0dmFsID0gY2hlY2tfbnRmc19ib290c2VjdChicywgZnNfdHlwZSk7CisgICAgZWxzZQorCXJldHZhbCA9IGNoZWNrX2ZhdF9ib290c2VjdChicywgZnNfdHlwZSk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvbGliaW5zdGFsbGVyL2dldG9wdC9nZXRvcHQuaCBiL2xpYmluc3RhbGxlci9nZXRvcHQvZ2V0b3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiNzRiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9nZXRvcHQvZ2V0b3B0LmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfR0VUT1BUX0gKKyNkZWZpbmUgX0dFVE9QVF9ICisKKy8qIChWZXJ5IHNsaWdodGx5KSBhZGFwdGVkIGZyb20ga2xpYmMgKi8KKworc3RydWN0IG9wdGlvbiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgaGFzX2FyZzsKKwlpbnQgKmZsYWc7CisJaW50IHZhbDsKK307CisKK2VudW0geworCW5vX2FyZ3VtZW50CSAgPSAwLAorCXJlcXVpcmVkX2FyZ3VtZW50ID0gMSwKKwlvcHRpb25hbF9hcmd1bWVudCA9IDIsCit9OworCitleHRlcm4gY2hhciAqb3B0YXJnOworZXh0ZXJuIGludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OworCitleHRlcm4gaW50IGdldG9wdF9sb25nKGludCwgY2hhciAqY29uc3QgKiwgY29uc3QgY2hhciAqLAorCQkJIGNvbnN0IHN0cnVjdCBvcHRpb24gKiwgaW50ICopOworCisjZW5kaWYgLyogX0dFVE9QVF9IICovCmRpZmYgLS1naXQgYS9saWJpbnN0YWxsZXIvZ2V0b3B0L2dldG9wdF9sb25nLmMgYi9saWJpbnN0YWxsZXIvZ2V0b3B0L2dldG9wdF9sb25nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3ZmVmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9nZXRvcHQvZ2V0b3B0X2xvbmcuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIGdldG9wdC5jCisgKgorICogZ2V0b3B0X2xvbmcoKSwgb3IgYXQgbGVhc3QgYSBjb21tb24gc3Vic2V0IHRoZXJlb2Y6CisgKgorICogLSBPcHRpb24gcmVvcmRlcmluZyBpcyBub3Qgc3VwcG9ydGVkCisgKiAtIC1XIGZvbyBpcyBub3Qgc3VwcG9ydGVkCisgKiAtIEZpcnN0IG9wdHN0cmluZyBjaGFyYWN0ZXIgIi0iIG5vdCBzdXBwb3J0ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCitjaGFyICpvcHRhcmc7CitpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKK3N0YXRpYyBzdHJ1Y3QgZ2V0b3B0X3ByaXZhdGVfc3RhdGUgeworCWNvbnN0IGNoYXIgKm9wdHB0cjsKKwljb25zdCBjaGFyICpsYXN0X29wdHN0cmluZzsKKwljaGFyICpjb25zdCAqbGFzdF9hcmd2OworfSBwdnQ7CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqb3B0aW9uX21hdGNoZXMoY29uc3QgY2hhciAqYXJnX3N0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKm9wdF9uYW1lKQoreworCXdoaWxlICgqYXJnX3N0ciAhPSAnXDAnICYmICphcmdfc3RyICE9ICc9JykgeworCQlpZiAoKmFyZ19zdHIrKyAhPSAqb3B0X25hbWUrKykKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmICgqb3B0X25hbWUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGFyZ19zdHI7Cit9CisKK2ludCBnZXRvcHRfbG9uZyhpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKm9wdHN0cmluZywKKwkJY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZGV4KQoreworCWNvbnN0IGNoYXIgKmNhcmc7CisJY29uc3QgY2hhciAqb3NwdHI7CisJaW50IG9wdDsKKworCS8qIGdldG9wdCgpIHJlbGllcyBvbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgZ2xvYmFsIHN0YXRlCisJICAgdmFyaWFibGVzLCB3aGljaCBjYW4gbWFrZSB0aGlzIHJlYWxseSBjb25mdXNpbmcgaWYgdGhlcmUgaXMKKwkgICBtb3JlIHRoYW4gb25lIHVzZSBvZiBnZXRvcHQoKSBpbiB0aGUgc2FtZSBwcm9ncmFtLiAgVGhpcworCSAgIGF0dGVtcHRzIHRvIGRldGVjdCB0aGF0IHNpdHVhdGlvbiBieSBkZXRlY3RpbmcgaWYgdGhlCisJICAgIm9wdHN0cmluZyIgb3IgImFyZ3YiIGFyZ3VtZW50IGhhdmUgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUKKwkgICB3ZSB3ZXJlIGNhbGxlZDsgaWYgc28sIHJlaW5pdGlhbGl6ZSB0aGUgcXVlcnkgc3RhdGUuICovCisKKwlpZiAob3B0c3RyaW5nICE9IHB2dC5sYXN0X29wdHN0cmluZyB8fCBhcmd2ICE9IHB2dC5sYXN0X2FyZ3YgfHwKKwkgICAgb3B0aW5kIDwgMSB8fCBvcHRpbmQgPiBhcmdjKSB7CisJCS8qIG9wdGluZCBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IHF1ZXJ5ICovCisJCXB2dC5sYXN0X29wdHN0cmluZyA9IG9wdHN0cmluZzsKKwkJcHZ0Lmxhc3RfYXJndiA9IGFyZ3Y7CisJCW9wdGluZCA9IDE7CisJCXB2dC5vcHRwdHIgPSBOVUxMOworCX0KKworCWNhcmcgPSBhcmd2W29wdGluZF07CisKKwkvKiBGaXJzdCwgZWxpbWluYXRlIGFsbCBub24tb3B0aW9uIGNhc2VzICovCisKKwlpZiAoIWNhcmcgfHwgY2FyZ1swXSAhPSAnLScgfHwgIWNhcmdbMV0pCisJCXJldHVybiAtMTsKKworCWlmIChjYXJnWzFdID09ICctJykgeworCQljb25zdCBzdHJ1Y3Qgb3B0aW9uICpsbzsKKwkJY29uc3QgY2hhciAqb3B0X2VuZCA9IE5VTEw7CisKKwkJb3B0aW5kKys7CisKKwkJLyogRWl0aGVyIGl0J3MgYSBsb25nIG9wdGlvbiwgb3IgaXQncyAtLSAqLworCQlpZiAoIWNhcmdbMl0pIHsKKwkJCS8qIEl0J3MgLS0gKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWZvciAobG8gPSBsb25nb3B0czsgbG8tPm5hbWU7IGxvKyspIHsKKwkJCWlmICgob3B0X2VuZCA9IG9wdGlvbl9tYXRjaGVzKGNhcmcrMiwgbG8tPm5hbWUpKSkKKwkJCSAgICBicmVhazsKKwkJfQorCQlpZiAoIW9wdF9lbmQpCisJCQlyZXR1cm4gJz8nOworCisJCWlmIChsb25naW5kZXgpCisJCQkqbG9uZ2luZGV4ID0gbG8tbG9uZ29wdHM7CisKKwkJaWYgKCpvcHRfZW5kID09ICc9JykgeworCQkJaWYgKGxvLT5oYXNfYXJnKQorCQkJCW9wdGFyZyA9IChjaGFyICopb3B0X2VuZCsxOworCQkJZWxzZQorCQkJCXJldHVybiAnPyc7CisJCX0gZWxzZSBpZiAobG8tPmhhc19hcmcgPT0gMSkgeworCQkJaWYgKCEob3B0YXJnID0gYXJndltvcHRpbmRdKSkKKwkJCQlyZXR1cm4gJz8nOworCQkJb3B0aW5kKys7CisJCX0KKworCQlpZiAobG8tPmZsYWcpIHsKKwkJCSpsby0+ZmxhZyA9IGxvLT52YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBsby0+dmFsOworCQl9CisJfQorCisJaWYgKCh1aW50cHRyX3QpIChwdnQub3B0cHRyIC0gY2FyZykgPiAodWludHB0cl90KSBzdHJsZW4oY2FyZykpIHsKKwkJLyogU29tZW9uZSBmcm9iYmVkIG9wdGluZCwgY2hhbmdlIHRvIG5ldyBvcHQuICovCisJCXB2dC5vcHRwdHIgPSBjYXJnICsgMTsKKwl9CisKKwlvcHQgPSAqcHZ0Lm9wdHB0cisrOworCisJaWYgKG9wdCAhPSAnOicgJiYgKG9zcHRyID0gc3RyY2hyKG9wdHN0cmluZywgb3B0KSkpIHsKKwkJaWYgKG9zcHRyWzFdID09ICc6JykgeworCQkJaWYgKCpwdnQub3B0cHRyKSB7CisJCQkJLyogQXJndW1lbnQtdGFraW5nIG9wdGlvbiB3aXRoIGF0dGFjaGVkCisJCQkJICAgYXJndW1lbnQgKi8KKwkJCQlvcHRhcmcgPSAoY2hhciAqKXB2dC5vcHRwdHI7CisJCQkJb3B0aW5kKys7CisJCQl9IGVsc2UgeworCQkJCS8qIEFyZ3VtZW50LXRha2luZyBvcHRpb24gd2l0aCBub24tYXR0YWNoZWQKKwkJCQkgICBhcmd1bWVudCAqLworCQkJCWlmIChhcmd2W29wdGluZCArIDFdKSB7CisJCQkJCW9wdGFyZyA9IChjaGFyICopYXJndltvcHRpbmQrMV07CisJCQkJCW9wdGluZCArPSAyOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE1pc3NpbmcgYXJndW1lbnQgKi8KKwkJCQkJb3B0aW5kKys7CisJCQkJCXJldHVybiAob3B0c3RyaW5nWzBdID09ICc6JykKKwkJCQkJCT8gJzonIDogJz8nOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBvcHQ7CisJCX0gZWxzZSB7CisJCQkvKiBOb24tYXJndW1lbnQtdGFraW5nIG9wdGlvbiAqLworCQkJLyogcHZ0Lm9wdHB0ciB3aWxsIHJlbWVtYmVyIHRoZSBleGFjdCBwb3NpdGlvbiB0bworCQkJICAgcmVzdW1lIGF0ICovCisJCQlpZiAoISpwdnQub3B0cHRyKQorCQkJCW9wdGluZCsrOworCQkJcmV0dXJuIG9wdDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFVua25vd24gb3B0aW9uICovCisJCW9wdG9wdCA9IG9wdDsKKwkJaWYgKCEqcHZ0Lm9wdHB0cikKKwkJCW9wdGluZCsrOworCQlyZXR1cm4gJz8nOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9saW51eC9maWVtYXAuaCBiL2xpYmluc3RhbGxlci9saW51eC9maWVtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODMwNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaW5zdGFsbGVyL2xpbnV4L2ZpZW1hcC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBGU19JT0NfRklFTUFQIGlvY3RsIGluZnJhc3RydWN0dXJlLgorICoKKyAqIFNvbWUgcG9ydGlvbnMgY29weXJpZ2h0IChDKSAyMDA3IENsdXN0ZXIgRmlsZSBTeXN0ZW1zLCBJbmMKKyAqCisgKiBBdXRob3JzOiBNYXJrIEZhc2hlaCA8bWZhc2hlaEBzdXNlLmNvbT4KKyAqICAgICAgICAgIEthbHBhayBTaGFoIDxrYWxwYWsuc2hhaEBzdW4uY29tPgorICogICAgICAgICAgQW5kcmVhcyBEaWxnZXIgPGFkaWxnZXJAc3VuLmNvbT4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9GSUVNQVBfSAorI2RlZmluZSBfTElOVVhfRklFTUFQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBmaWVtYXBfZXh0ZW50IHsKKwlfX3U2NCBmZV9sb2dpY2FsOyAgLyogbG9naWNhbCBvZmZzZXQgaW4gYnl0ZXMgZm9yIHRoZSBzdGFydCBvZgorCQkJICAgICogdGhlIGV4dGVudCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKi8KKwlfX3U2NCBmZV9waHlzaWNhbDsgLyogcGh5c2ljYWwgb2Zmc2V0IGluIGJ5dGVzIGZvciB0aGUgc3RhcnQKKwkJCSAgICAqIG9mIHRoZSBleHRlbnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkaXNrICovCisJX191NjQgZmVfbGVuZ3RoOyAgIC8qIGxlbmd0aCBpbiBieXRlcyBmb3IgdGhpcyBleHRlbnQgKi8KKwlfX3U2NCBmZV9yZXNlcnZlZDY0WzJdOworCV9fdTMyIGZlX2ZsYWdzOyAgICAvKiBGSUVNQVBfRVhURU5UXyogZmxhZ3MgZm9yIHRoaXMgZXh0ZW50ICovCisJX191MzIgZmVfcmVzZXJ2ZWRbM107Cit9OworCitzdHJ1Y3QgZmllbWFwIHsKKwlfX3U2NCBmbV9zdGFydDsJCS8qIGxvZ2ljYWwgb2Zmc2V0IChpbmNsdXNpdmUpIGF0CisJCQkJICogd2hpY2ggdG8gc3RhcnQgbWFwcGluZyAoaW4pICovCisJX191NjQgZm1fbGVuZ3RoOwkvKiBsb2dpY2FsIGxlbmd0aCBvZiBtYXBwaW5nIHdoaWNoCisJCQkJICogdXNlcnNwYWNlIHdhbnRzIChpbikgKi8KKwlfX3UzMiBmbV9mbGFnczsJCS8qIEZJRU1BUF9GTEFHXyogZmxhZ3MgZm9yIHJlcXVlc3QgKGluL291dCkgKi8KKwlfX3UzMiBmbV9tYXBwZWRfZXh0ZW50czsvKiBudW1iZXIgb2YgZXh0ZW50cyB0aGF0IHdlcmUgbWFwcGVkIChvdXQpICovCisJX191MzIgZm1fZXh0ZW50X2NvdW50OyAgLyogc2l6ZSBvZiBmbV9leHRlbnRzIGFycmF5IChpbikgKi8KKwlfX3UzMiBmbV9yZXNlcnZlZDsKKwlzdHJ1Y3QgZmllbWFwX2V4dGVudCBmbV9leHRlbnRzWzBdOyAvKiBhcnJheSBvZiBtYXBwZWQgZXh0ZW50cyAob3V0KSAqLworfTsKKworI2RlZmluZSBGSUVNQVBfTUFYX09GRlNFVAkofjBVTEwpCisKKyNkZWZpbmUgRklFTUFQX0ZMQUdfU1lOQwkweDAwMDAwMDAxIC8qIHN5bmMgZmlsZSBkYXRhIGJlZm9yZSBtYXAgKi8KKyNkZWZpbmUgRklFTUFQX0ZMQUdfWEFUVFIJMHgwMDAwMDAwMiAvKiBtYXAgZXh0ZW5kZWQgYXR0cmlidXRlIHRyZWUgKi8KKworI2RlZmluZSBGSUVNQVBfRkxBR1NfQ09NUEFUCShGSUVNQVBfRkxBR19TWU5DIHwgRklFTUFQX0ZMQUdfWEFUVFIpCisKKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9MQVNUCQkweDAwMDAwMDAxIC8qIExhc3QgZXh0ZW50IGluIGZpbGUuICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfVU5LTk9XTgkJMHgwMDAwMDAwMiAvKiBEYXRhIGxvY2F0aW9uIHVua25vd24uICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfREVMQUxMT0MJCTB4MDAwMDAwMDQgLyogTG9jYXRpb24gc3RpbGwgcGVuZGluZy4KKwkJCQkJCSAgICAqIFNldHMgRVhURU5UX1VOS05PV04uICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfRU5DT0RFRAkJMHgwMDAwMDAwOCAvKiBEYXRhIGNhbiBub3QgYmUgcmVhZAorCQkJCQkJICAgICogd2hpbGUgZnMgaXMgdW5tb3VudGVkICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfREFUQV9FTkNSWVBURUQJMHgwMDAwMDA4MCAvKiBEYXRhIGlzIGVuY3J5cHRlZCBieSBmcy4KKwkJCQkJCSAgICAqIFNldHMgRVhURU5UX05PX0JZUEFTUy4gKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9OT1RfQUxJR05FRAkweDAwMDAwMTAwIC8qIEV4dGVudCBvZmZzZXRzIG1heSBub3QgYmUKKwkJCQkJCSAgICAqIGJsb2NrIGFsaWduZWQuICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfREFUQV9JTkxJTkUJMHgwMDAwMDIwMCAvKiBEYXRhIG1peGVkIHdpdGggbWV0YWRhdGEuCisJCQkJCQkgICAgKiBTZXRzIEVYVEVOVF9OT1RfQUxJR05FRC4qLworI2RlZmluZSBGSUVNQVBfRVhURU5UX0RBVEFfVEFJTAkJMHgwMDAwMDQwMCAvKiBNdWx0aXBsZSBmaWxlcyBpbiBibG9jay4KKwkJCQkJCSAgICAqIFNldHMgRVhURU5UX05PVF9BTElHTkVELiovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfVU5XUklUVEVOCQkweDAwMDAwODAwIC8qIFNwYWNlIGFsbG9jYXRlZCwgYnV0CisJCQkJCQkgICAgKiBubyBkYXRhIChpLmUuIHplcm8pLiAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX01FUkdFRAkJMHgwMDAwMTAwMCAvKiBGaWxlIGRvZXMgbm90IG5hdGl2ZWx5CisJCQkJCQkgICAgKiBzdXBwb3J0IGV4dGVudHMuIFJlc3VsdAorCQkJCQkJICAgICogbWVyZ2VkIGZvciBlZmZpY2llbmN5LiAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX1NIQVJFRAkJMHgwMDAwMjAwMCAvKiBTcGFjZSBzaGFyZWQgd2l0aCBvdGhlcgorCQkJCQkJICAgICogZmlsZXMuICovCisKKyNlbmRpZiAvKiBfTElOVVhfRklFTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9saW51eC9sb29wLmggYi9saWJpbnN0YWxsZXIvbGludXgvbG9vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjM3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpbnN0YWxsZXIvbGludXgvbG9vcC5oCkBAIC0wLDAgKzEsOTYgQEAKKyNpZm5kZWYgX0xJTlVYX0xPT1BfSAorI2RlZmluZSBfTElOVVhfTE9PUF9ICisKKy8qCisgKiBpbmNsdWRlL2xpbnV4L2xvb3AuaAorICoKKyAqIFdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgMy8yOS85My4KKyAqCisgKiBDb3B5cmlnaHQgMTk5MyBieSBUaGVvZG9yZSBUcydvLiAgUmVkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlIGlzCisgKiBwZXJtaXR0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9fTkFNRV9TSVpFCTY0CisjZGVmaW5lIExPX0tFWV9TSVpFCTMyCisKKworLyoKKyAqIExvb3AgZmxhZ3MKKyAqLworZW51bSB7CisJTE9fRkxBR1NfUkVBRF9PTkxZCT0gMSwKKwlMT19GTEFHU19VU0VfQU9QUwk9IDIsCisJTE9fRkxBR1NfQVVUT0NMRUFSCT0gNCwKK307CisKKyNpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXMuaD4JLyogZm9yIF9fa2VybmVsX29sZF9kZXZfdCAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIGZvciBfX3U2NCAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogdmVyc2lvbiBvZiBMaW51eCBrZXJuZWwgaGVhZGVycyAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisvKiBXZSBoYXZlIHRydWx5IGFuY2llbnQgTGludXgga2VybmVsIGhlYWRlcnMgaW5zdGFsbGVkICovCit0eXBlZGVmIF9fa2VybmVsX2Rldl90IF9fa2VybmVsX29sZF9kZXZfdDsKKyNlbmRpZgorCisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB2ZXJzaW9uICovCitzdHJ1Y3QgbG9vcF9pbmZvIHsKKwlpbnQJCSAgIGxvX251bWJlcjsJCS8qIGlvY3RsIHIvbyAqLworCV9fa2VybmVsX29sZF9kZXZfdCBsb19kZXZpY2U7IAkJLyogaW9jdGwgci9vICovCisJdW5zaWduZWQgbG9uZwkgICBsb19pbm9kZTsgCQkvKiBpb2N0bCByL28gKi8KKwlfX2tlcm5lbF9vbGRfZGV2X3QgbG9fcmRldmljZTsgCQkvKiBpb2N0bCByL28gKi8KKwlpbnQJCSAgIGxvX29mZnNldDsKKwlpbnQJCSAgIGxvX2VuY3J5cHRfdHlwZTsKKwlpbnQJCSAgIGxvX2VuY3J5cHRfa2V5X3NpemU7IAkvKiBpb2N0bCB3L28gKi8KKwlpbnQJCSAgIGxvX2ZsYWdzOwkJCS8qIGlvY3RsIHIvbyAqLworCWNoYXIJCSAgIGxvX25hbWVbTE9fTkFNRV9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyCSAgIGxvX2VuY3J5cHRfa2V5W0xPX0tFWV9TSVpFXTsgLyogaW9jdGwgdy9vICovCisJdW5zaWduZWQgbG9uZwkgICBsb19pbml0WzJdOworCWNoYXIJCSAgIHJlc2VydmVkWzRdOworfTsKKworc3RydWN0IGxvb3BfaW5mbzY0IHsKKwlfX3U2NAkJICAgbG9fZGV2aWNlOwkJCS8qIGlvY3RsIHIvbyAqLworCV9fdTY0CQkgICBsb19pbm9kZTsJCQkvKiBpb2N0bCByL28gKi8KKwlfX3U2NAkJICAgbG9fcmRldmljZTsJCQkvKiBpb2N0bCByL28gKi8KKwlfX3U2NAkJICAgbG9fb2Zmc2V0OworCV9fdTY0CQkgICBsb19zaXplbGltaXQ7LyogYnl0ZXMsIDAgPT0gbWF4IGF2YWlsYWJsZSAqLworCV9fdTMyCQkgICBsb19udW1iZXI7CQkJLyogaW9jdGwgci9vICovCisJX191MzIJCSAgIGxvX2VuY3J5cHRfdHlwZTsKKwlfX3UzMgkJICAgbG9fZW5jcnlwdF9rZXlfc2l6ZTsJCS8qIGlvY3RsIHcvbyAqLworCV9fdTMyCQkgICBsb19mbGFnczsJCQkvKiBpb2N0bCByL28gKi8KKwlfX3U4CQkgICBsb19maWxlX25hbWVbTE9fTkFNRV9TSVpFXTsKKwlfX3U4CQkgICBsb19jcnlwdF9uYW1lW0xPX05BTUVfU0laRV07CisJX191OAkJICAgbG9fZW5jcnlwdF9rZXlbTE9fS0VZX1NJWkVdOyAvKiBpb2N0bCB3L28gKi8KKwlfX3U2NAkJICAgbG9faW5pdFsyXTsKK307CisKKy8qCisgKiBMb29wIGZpbHRlciB0eXBlcworICovCisKKyNkZWZpbmUgTE9fQ1JZUFRfTk9ORQkJMAorI2RlZmluZSBMT19DUllQVF9YT1IJCTEKKyNkZWZpbmUgTE9fQ1JZUFRfREVTCQkyCisjZGVmaW5lIExPX0NSWVBUX0ZJU0gyCQkzICAgIC8qIFR3b2Zpc2ggZW5jcnlwdGlvbiAqLworI2RlZmluZSBMT19DUllQVF9CTE9XCQk0CisjZGVmaW5lIExPX0NSWVBUX0NBU1QxMjgJNQorI2RlZmluZSBMT19DUllQVF9JREVBCQk2CisjZGVmaW5lIExPX0NSWVBUX0RVTU1ZCQk5CisjZGVmaW5lIExPX0NSWVBUX1NLSVBKQUNLCTEwCisjZGVmaW5lIExPX0NSWVBUX0NSWVBUT0FQSQkxOAorI2RlZmluZSBNQVhfTE9fQ1JZUFQJCTIwCisKKy8qCisgKiBJT0NUTCBjb21tYW5kcyAtLS0gd2Ugd2lsbCBjb21tYW5kZWVyIDB4NEMgKCdMJykKKyAqLworCisjZGVmaW5lIExPT1BfU0VUX0ZECQkweDRDMDAKKyNkZWZpbmUgTE9PUF9DTFJfRkQJCTB4NEMwMQorI2RlZmluZSBMT09QX1NFVF9TVEFUVVMJCTB4NEMwMgorI2RlZmluZSBMT09QX0dFVF9TVEFUVVMJCTB4NEMwMworI2RlZmluZSBMT09QX1NFVF9TVEFUVVM2NAkweDRDMDQKKyNkZWZpbmUgTE9PUF9HRVRfU1RBVFVTNjQJMHg0QzA1CisjZGVmaW5lIExPT1BfQ0hBTkdFX0ZECQkweDRDMDYKKyNkZWZpbmUgTE9PUF9TRVRfQ0FQQUNJVFkJMHg0QzA3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaW5zdGFsbGVyL2xpbnV4aW9jdGwuaCBiL2xpYmluc3RhbGxlci9saW51eGlvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3MzFjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9saW51eGlvY3RsLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIGxpbnV4aW9jdGwuaAorICoKKyAqIFdyYXBwZXIgZm9yIExpbnV4IGlvY3RsIGRlZmluaXRpb25zLCBpbmNsdWRpbmcgd29ya2Fyb3VuZHMKKyAqLworCisjaWZuZGVmIExJQklOU1RBTExFUl9MSU5VWElPQ1RMX0gKKyNkZWZpbmUgTElCSU5TVEFMTEVSX0xJTlVYSU9DVExfSAorCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpZmRlZiBfX2xpbnV4X18KKworI2RlZmluZSBzdGF0ZnMgX2tlcm5lbF9zdGF0ZnMJLyogSEFDSyB0byBkZWFsIHdpdGggYnJva2VuIDIuNCBkaXN0cm9zICovCisKKyNpbmNsdWRlIDxsaW51eC9mZC5oPgkJLyogRmxvcHB5IGdlb21ldHJ5ICovCisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4JLyogSGFyZCBkaXNrIGdlb21ldHJ5ICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgkJLyogRklHRVRCU1osIEZJQk1BUCwgRlNfSU9DXyogKi8KKworI3VuZGVmIFNFQ1RPUl9TSVpFCQkvKiBEZWZpbmVkIGluIG1zZG9zX2ZzLmggZm9yIG5vIGdvb2QgcmVhc29uICovCisjdW5kZWYgU0VDVE9SX0JJVFMKKworI2lmbmRlZiBGU19JT0NfR0VURkxBR1MKKy8qIE9sZCBrZXJuZWwgaGVhZGVycywgdGhlc2Ugd2VyZSBvbmNlIGV4dDItc3BlY2lmaWMuLi4gKi8KKyMgaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgkvKiBFWFQyX0lPQ18qICovCisKKyMgZGVmaW5lIEZTX0lPQ19HRVRGTEFHUyBFWFQyX0lPQ19HRVRGTEFHUworIyBkZWZpbmUgRlNfSU9DX1NFVEZMQUdTIEVYVDJfSU9DX1NFVEZMQUdTCisKKyMgZGVmaW5lIEZTX0lNTVVUQUJMRV9GTCBFWFQyX0lNTVVUQUJMRV9GTAorCisjZWxzZQorCisjIGluY2x1ZGUgPGV4dDJmcy9leHQyX2ZzLmg+CisKKyNlbmRpZgorCisjaWZuZGVmIEZBVF9JT0NUTF9HRVRfQVRUUklCVVRFUworIyBkZWZpbmUgRkFUX0lPQ1RMX0dFVF9BVFRSSUJVVEVTCV9JT1IoJ3InLCAweDEwLCBfX3UzMikKKyNlbmRpZgorI2lmbmRlZiBGQVRfSU9DVExfU0VUX0FUVFJJQlVURVMKKyMgZGVmaW5lIEZBVF9JT0NUTF9TRVRfQVRUUklCVVRFUwlfSU9XKCdyJywgMHgxMSwgX191MzIpCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgkvKiBGSUVNQVAgZGVmaW5pdGlvbnMgKi8KKworI2lmbmRlZiBGU19JT0NfRklFTUFQCisjIGRlZmluZSBGU19JT0NfRklFTUFQCQlfSU9XUignZicsIDExLCBzdHJ1Y3QgZmllbWFwKQorI2VuZGlmCisKKyN1bmRlZiBzdGF0ZnMKKworI2lmbmRlZiAgQkxLR0VUU0laRTY0CisvKiBUaGlzIHRha2VzIGEgdTY0LCBidXQgdGhlIHNpemUgZmllbGQgc2F5cyBzaXplX3QuICBTb21lb25lIHNjcmV3ZWQgYmlnLiAqLworIyBkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9sb29wLmg+CisKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKworI2VuZGlmIC8qIExJQklOU1RBTExFUl9MSU5VWElPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9zZXRhZHYuYyBiL2xpYmluc3RhbGxlci9zZXRhZHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTRmN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliaW5zdGFsbGVyL3NldGFkdi5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzZXRhZHYuYworICoKKyAqIChPdmVyKXdyaXRlIGEgZGF0YSBpdGVtIGluIHRoZSBhdXhpbGxpYXJ5IGRhdGEgdmVjdG9yLiAgVG8KKyAqIGRlbGV0ZSBhbiBpdGVtLCBzZXQgaXRzIGxlbmd0aCB0byB6ZXJvLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLCBhbmQgc2V0IGVycm5vLgorICoKKyAqLworI2RlZmluZSAgX0dOVV9TT1VSQ0UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJzeXNseGludC5oIgorI2luY2x1ZGUgInN5c2x4Y29tLmgiCisjaW5jbHVkZSAic3lzbHhmcy5oIgorCit1bnNpZ25lZCBjaGFyIHN5c2xpbnV4X2FkdlsyICogQURWX1NJWkVdOworCisjZGVmaW5lIEFEVl9NQUdJQzEJMHg1YTJkMmZhNQkvKiBIZWFkIHNpZ25hdHVyZSAqLworI2RlZmluZSBBRFZfTUFHSUMyCTB4YTMwNDE3NjcJLyogVG90YWwgY2hlY2tzdW0gKi8KKyNkZWZpbmUgQURWX01BR0lDMwkweGRkMjhiZjY0CS8qIFRhaWwgc2lnbmF0dXJlICovCisKK3N0YXRpYyB2b2lkIGNsZWFudXBfYWR2KHVuc2lnbmVkIGNoYXIgKmFkdmJ1ZikKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBjc3VtOworCisgICAgLyogTWFrZSBzdXJlIGJvdGggY29waWVzIGFncmVlLCBhbmQgdXBkYXRlIHRoZSBjaGVja3N1bSAqLworICAgIHNldF8zMigodWludDMyX3QgKikgYWR2YnVmLCBBRFZfTUFHSUMxKTsKKworICAgIGNzdW0gPSBBRFZfTUFHSUMyOworICAgIGZvciAoaSA9IDg7IGkgPCBBRFZfU0laRSAtIDQ7IGkgKz0gNCkKKwljc3VtIC09IGdldF8zMigodWludDMyX3QgKikgKGFkdmJ1ZiArIGkpKTsKKworICAgIHNldF8zMigodWludDMyX3QgKikgKGFkdmJ1ZiArIDQpLCBjc3VtKTsKKyAgICBzZXRfMzIoKHVpbnQzMl90ICopIChhZHZidWYgKyBBRFZfU0laRSAtIDQpLCBBRFZfTUFHSUMzKTsKKworICAgIG1lbWNweShhZHZidWYgKyBBRFZfU0laRSwgYWR2YnVmLCBBRFZfU0laRSk7Cit9CisKK2ludCBzeXNsaW51eF9zZXRhZHYoaW50IHRhZywgc2l6ZV90IHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisgICAgdWludDhfdCAqcDsKKyAgICBzaXplX3QgbGVmdDsKKyAgICB1aW50OF90IGFkdnRtcFtBRFZfU0laRV07CisKKyAgICBpZiAoKHVuc2lnbmVkKXRhZyAtIDEgPiAyNTQpIHsKKwllcnJubyA9IEVJTlZBTDsKKwlyZXR1cm4gLTE7CQkvKiBJbXBvc3NpYmxlIHRhZyB2YWx1ZSAqLworICAgIH0KKworICAgIGlmIChzaXplID4gMjU1KSB7CisJZXJybm8gPSBFTk9TUEM7CQkvKiBNYXggMjU1IGJ5dGVzIGZvciBhIGRhdGEgaXRlbSAqLworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBsZWZ0ID0gQURWX0xFTjsKKyAgICBwID0gYWR2dG1wOworICAgIG1lbWNweShwLCBzeXNsaW51eF9hZHYgKyAyICogNCwgbGVmdCk7CS8qIE1ha2Ugd29ya2luZyBjb3B5ICovCisKKyAgICB3aGlsZSAobGVmdCA+PSAyKSB7CisJdWludDhfdCBwdGFnID0gcFswXTsKKwlzaXplX3QgcGxlbiA9IHBbMV0gKyAyOworCisJaWYgKHB0YWcgPT0gQURWX0VORCkKKwkgICAgYnJlYWs7CisKKwlpZiAocHRhZyA9PSB0YWcpIHsKKwkgICAgLyogRm91bmQgb3VyIHRhZy4gIERlbGV0ZSBpdC4gKi8KKworCSAgICBpZiAocGxlbiA+PSBsZWZ0KSB7CisJCS8qIEVudGlyZSByZW1haW5kZXIgaXMgb3VyIHRhZyAqLworCQlicmVhazsKKwkgICAgfQorCSAgICBtZW1tb3ZlKHAsIHAgKyBwbGVuLCBsZWZ0IC0gcGxlbik7CisJfSBlbHNlIHsKKwkgICAgLyogTm90IG91ciB0YWcgKi8KKwkgICAgaWYgKHBsZW4gPiBsZWZ0KQorCQlicmVhazsJCS8qIENvcnJ1cHQgdGFnIChvdmVycnVuKSAtIG92ZXJ3cml0ZSBpdCAqLworCisJICAgIGxlZnQgLT0gcGxlbjsKKwkgICAgcCArPSBwbGVuOworCX0KKyAgICB9CisKKyAgICAvKiBOb3cgKHAsIGxlZnQpIHJlZmxlY3RzIHRoZSBwb3NpdGlvbiB0byB3cml0ZSBpbiBhbmQgaG93IG11Y2ggc3BhY2UKKyAgICAgICB3ZSBoYXZlIGZvciBvdXIgZGF0YS4gKi8KKworICAgIGlmIChzaXplKSB7CisJaWYgKGxlZnQgPCBzaXplICsgMikgeworCSAgICBlcnJubyA9IEVOT1NQQzsJLyogTm90IGVub3VnaCBzcGFjZSBmb3IgZGF0YSAqLworCSAgICByZXR1cm4gLTE7CisJfQorCisJKnArKyA9IHRhZzsKKwkqcCsrID0gc2l6ZTsKKwltZW1jcHkocCwgZGF0YSwgc2l6ZSk7CisJcCArPSBzaXplOworCWxlZnQgLT0gc2l6ZSArIDI7CisgICAgfQorCisgICAgbWVtc2V0KHAsIDAsIGxlZnQpOworCisgICAgLyogSWYgd2UgZ290IGhlcmUsIGV2ZXJ5dGhpbmcgd2VudCBPSywgY29tbWl0IHRoZSB3cml0ZSAqLworICAgIG1lbWNweShzeXNsaW51eF9hZHYgKyAyICogNCwgYWR2dG1wLCBBRFZfTEVOKTsKKyAgICBjbGVhbnVwX2FkdihzeXNsaW51eF9hZHYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3lzbGludXhfcmVzZXRfYWR2KHVuc2lnbmVkIGNoYXIgKmFkdmJ1ZikKK3sKKyAgICAvKiBDcmVhdGUgYW4gYWxsLXplcm8gQURWICovCisgICAgbWVtc2V0KGFkdmJ1ZiArIDIgKiA0LCAwLCBBRFZfTEVOKTsKKyAgICBjbGVhbnVwX2FkdihhZHZidWYpOworfQorCitzdGF0aWMgaW50IGFkdl9jb25zaXN0ZW50KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnApCit7CisgICAgaW50IGk7CisgICAgdWludDMyX3QgY3N1bTsKKworICAgIGlmIChnZXRfMzIoKHVpbnQzMl90ICopIHApICE9IEFEVl9NQUdJQzEgfHwKKwlnZXRfMzIoKHVpbnQzMl90ICopIChwICsgQURWX1NJWkUgLSA0KSkgIT0gQURWX01BR0lDMykKKwlyZXR1cm4gMDsKKworICAgIGNzdW0gPSAwOworICAgIGZvciAoaSA9IDQ7IGkgPCBBRFZfU0laRSAtIDQ7IGkgKz0gNCkKKwljc3VtICs9IGdldF8zMigodWludDMyX3QgKikgKHAgKyBpKSk7CisKKyAgICByZXR1cm4gY3N1bSA9PSBBRFZfTUFHSUMyOworfQorCisvKgorICogVmVyaWZ5IHRoYXQgYW4gaW4tbWVtb3J5IEFEViBpcyBjb25zaXN0ZW50LCBtYWtpbmcgdGhlIGNvcGllcyBjb25zaXN0ZW50LgorICogSWYgbmVpdGhlciBjb3B5IGlzIE9LLCByZXR1cm4gLTEgYW5kIGNhbGwgc3lzbGludXhfcmVzZXRfYWR2KCkuCisgKi8KK2ludCBzeXNsaW51eF92YWxpZGF0ZV9hZHYodW5zaWduZWQgY2hhciAqYWR2YnVmKQoreworICAgIGlmIChhZHZfY29uc2lzdGVudChhZHZidWYgKyAwICogQURWX1NJWkUpKSB7CisJbWVtY3B5KGFkdmJ1ZiArIEFEVl9TSVpFLCBhZHZidWYsIEFEVl9TSVpFKTsKKwlyZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKGFkdl9jb25zaXN0ZW50KGFkdmJ1ZiArIDEgKiBBRFZfU0laRSkpIHsKKwltZW1jcHkoYWR2YnVmLCBhZHZidWYgKyBBRFZfU0laRSwgQURWX1NJWkUpOworCXJldHVybiAwOworICAgIH0gZWxzZSB7CisJc3lzbGludXhfcmVzZXRfYWR2KGFkdmJ1Zik7CisJcmV0dXJuIC0xOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9zZXRhZHYuaCBiL2xpYmluc3RhbGxlci9zZXRhZHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJkZmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliaW5zdGFsbGVyL3NldGFkdi5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX0hfU0VUX0FEVl8KKyNkZWZpbmUgX0hfU0VUX0FEVl8KKworLyogQURWIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEFEVl9TSVpFCTUxMgkvKiBUb3RhbCBzaXplICovCisjZGVmaW5lIEFEVl9MRU4JCShBRFZfU0laRS0zKjQpCS8qIFVzYWJsZSBkYXRhIHNpemUgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc3lzbGludXhfYWR2WzIgKiBBRFZfU0laRV07CisKK2ludCBzeXNsaW51eF9zZXRhZHYoaW50IHRhZywgc2l6ZV90IHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOwordm9pZCBzeXNsaW51eF9yZXNldF9hZHYodW5zaWduZWQgY2hhciAqYWR2YnVmKTsKK2ludCBzeXNsaW51eF92YWxpZGF0ZV9hZHYodW5zaWduZWQgY2hhciAqYWR2YnVmKTsKK2ludCByZWFkX2Fkdihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpjZmcpOworaW50IHdyaXRlX2Fkdihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpjZmcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9zeXNsaW51eC5oIGIvbGliaW5zdGFsbGVyL3N5c2xpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjNjQzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9zeXNsaW51eC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk4LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBTWVNMSU5VWF9ICisjZGVmaW5lIFNZU0xJTlVYX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiYWR2Y29uc3QuaCIKKyNpbmNsdWRlICJzZXRhZHYuaCIKKworI2lmZGVmIF9fQ0hFQ0tFUl9fCisjIGRlZmluZSBfc2xpbWcgX19hdHRyaWJ1dGVfXygobm9kZXJlZixhZGRyZXNzX3NwYWNlKDEpKSkKKyMgZGVmaW5lIF9mb3JjZSBfX2F0dHJpYnV0ZV9fKChmb3JjZSkpCisjZWxzZQorIyBkZWZpbmUgX3NsaW1nCisjIGRlZmluZSBfZm9yY2UKKyNlbmRpZgorCisvKiBUaGUgc3RhbmRhcmQgYm9vdCBzZWN0b3IgYW5kIGxkbGludXggaW1hZ2UgKi8KK2V4dGVybiB1bnNpZ25lZCBjaGFyIHN5c2xpbnV4X2Jvb3RzZWN0W107CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IHN5c2xpbnV4X2Jvb3RzZWN0X2xlbjsKK2V4dGVybiBjb25zdCBpbnQgc3lzbGludXhfYm9vdHNlY3RfbXRpbWU7CisKK2V4dGVybiB1bnNpZ25lZCBjaGFyIF9zbGltZyBzeXNsaW51eF9sZGxpbnV4W107CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IHN5c2xpbnV4X2xkbGludXhfbGVuOworZXh0ZXJuIGNvbnN0IGludCBzeXNsaW51eF9sZGxpbnV4X210aW1lOworCitleHRlcm4gdW5zaWduZWQgY2hhciBfc2xpbWcgc3lzbGludXhfbGRsaW51eGMzMltdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBzeXNsaW51eF9sZGxpbnV4YzMyX2xlbjsKKworI2RlZmluZSBib290X3NlY3RvcglzeXNsaW51eF9ib290c2VjdAorI2RlZmluZSBib290X3NlY3Rvcl9sZW4gc3lzbGludXhfYm9vdHNlY3RfbGVuCisjZGVmaW5lIGJvb3RfaW1hZ2UJc3lzbGludXhfbGRsaW51eAorI2RlZmluZSBib290X2ltYWdlX2xlbglzeXNsaW51eF9sZGxpbnV4X2xlbgorCitleHRlcm4gdW5zaWduZWQgY2hhciBzeXNsaW51eF9tYnJbXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgc3lzbGludXhfbWJyX2xlbjsKK2V4dGVybiBjb25zdCBpbnQgc3lzbGludXhfbWJyX210aW1lOworCisvKiBTZWN0b3Igc2l6ZSBhc3N1bXB0aW9ucy4uLiAqLworI2RlZmluZSBTRUNUT1JfU0hJRlQJOQorI2RlZmluZSBTRUNUT1JfU0laRQkoMSA8PCBTRUNUT1JfU0hJRlQpCisKKy8qIFRoaXMgdGFrZXMgYSBib290IHNlY3RvciBhbmQgbWVyZ2VzIGluIHRoZSBzeXNsaW51eCBmaWVsZHMgKi8KK3ZvaWQgc3lzbGludXhfbWFrZV9ib290c2VjdCh2b2lkICpicywgaW50IGZzX3R5cGUpOworCisvKiBDaGVjayB0byBzZWUgdGhhdCB3aGF0IHdlIGdvdCB3YXMgaW5kZWVkIGFuIE1TLURPUyBib290IHNlY3Rvci9zdXBlcmJsb2NrICovCitjb25zdCBjaGFyICpzeXNsaW51eF9jaGVja19ib290c2VjdChjb25zdCB2b2lkICpicywgaW50ICpmc190eXBlKTsKKworLyogVGhpcyBwYXRjaGVzIHRoZSBib290IHNlY3RvciBhbmQgbGRsaW51eC5zeXMgYmFzZWQgb24gYSBzZWN0b3IgbWFwICovCit0eXBlZGVmIHVpbnQ2NF90IHNlY3Rvcl90OworaW50IHN5c2xpbnV4X3BhdGNoKGNvbnN0IHNlY3Rvcl90ICpzZWN0b3JzLCBpbnQgbnNlY3RvcnMsCisJCSAgIGludCBzdHVwaWQsIGludCByYWlkX21vZGUsCisJCSAgIGNvbnN0IGNoYXIgKnN1YmRpciwgY29uc3QgY2hhciAqc3Vidm9sKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpbnN0YWxsZXIvc3lzbHhjb20uYyBiL2xpYmluc3RhbGxlci9zeXNseGNvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjEzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpbnN0YWxsZXIvc3lzbHhjb20uYwpAQCAtMCwwICsxLDMwNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycC4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2x4Y29tLmMKKyAqCisgKiBjb21tb24gZnVuY3Rpb25zIGZvciBleHRsaW51eCAmIHN5c2xpbnV4IGluc3RhbGxlcgorICoKKyAqLworI2RlZmluZSAgX0dOVV9TT1VSQ0UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKworI2luY2x1ZGUgImxpbnV4aW9jdGwuaCIKKyNpbmNsdWRlICJzeXNseGNvbS5oIgorI2luY2x1ZGUgInN5c2x4ZnMuaCIKKworY29uc3QgY2hhciAqcHJvZ3JhbTsKKworaW50IGZzX3R5cGU7CisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgZHByaW50ZiBwcmludGYKKyNlbHNlCisjIGRlZmluZSBkcHJpbnRmKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworI2RlZmluZSBTRUNUT1JfU0hJRlQJOQorCitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqbXNnKQoreworICAgIGZwdXRzKG1zZywgc3RkZXJyKTsKKyAgICBleGl0KDEpOworfQorCisvKgorICogcmVhZC93cml0ZSB3cmFwcGVyIGZ1bmN0aW9ucworICovCitzc2l6ZV90IHhwcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBvZmZfdCBvZmZzZXQpCit7CisgICAgY2hhciAqYnVmcCA9IChjaGFyICopYnVmOworICAgIHNzaXplX3QgcnY7CisgICAgc3NpemVfdCBkb25lID0gMDsKKworICAgIHdoaWxlIChjb3VudCkgeworCXJ2ID0gcHJlYWQoZmQsIGJ1ZnAsIGNvdW50LCBvZmZzZXQpOworCWlmIChydiA9PSAwKSB7CisJICAgIGRpZSgic2hvcnQgcmVhZCIpOworCX0gZWxzZSBpZiAocnYgPT0gLTEpIHsKKwkgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CisJCWNvbnRpbnVlOworCSAgICB9IGVsc2UgeworCQlkaWUoc3RyZXJyb3IoZXJybm8pKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGJ1ZnAgKz0gcnY7CisJICAgIG9mZnNldCArPSBydjsKKwkgICAgZG9uZSArPSBydjsKKwkgICAgY291bnQgLT0gcnY7CisJfQorICAgIH0KKworICAgIHJldHVybiBkb25lOworfQorCitzc2l6ZV90IHhwd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgb2ZmX3Qgb2Zmc2V0KQoreworICAgIGNvbnN0IGNoYXIgKmJ1ZnAgPSAoY29uc3QgY2hhciAqKWJ1ZjsKKyAgICBzc2l6ZV90IHJ2OworICAgIHNzaXplX3QgZG9uZSA9IDA7CisKKyAgICB3aGlsZSAoY291bnQpIHsKKwlydiA9IHB3cml0ZShmZCwgYnVmcCwgY291bnQsIG9mZnNldCk7CisJaWYgKHJ2ID09IDApIHsKKwkgICAgZGllKCJzaG9ydCB3cml0ZSIpOworCX0gZWxzZSBpZiAocnYgPT0gLTEpIHsKKwkgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CisJCWNvbnRpbnVlOworCSAgICB9IGVsc2UgeworCQlkaWUoc3RyZXJyb3IoZXJybm8pKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGJ1ZnAgKz0gcnY7CisJICAgIG9mZnNldCArPSBydjsKKwkgICAgZG9uZSArPSBydjsKKwkgICAgY291bnQgLT0gcnY7CisJfQorICAgIH0KKworICAgIHJldHVybiBkb25lOworfQorCisvKgorICogU2V0IGFuZCBjbGVhciBmaWxlIGF0dHJpYnV0ZXMKKyAqLwordm9pZCBjbGVhcl9hdHRyaWJ1dGVzKGludCBmZCkKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIGlmICghZnN0YXQoZmQsICZzdCkpIHsKKwlzd2l0Y2ggKGZzX3R5cGUpIHsKKwljYXNlIEVYVDI6CisJeworCSAgICBpbnQgZmxhZ3M7CisKKwkgICAgaWYgKCFpb2N0bChmZCwgRlNfSU9DX0dFVEZMQUdTLCAmZmxhZ3MpKSB7CisJCWZsYWdzICY9IH5GU19JTU1VVEFCTEVfRkw7CisJCWlvY3RsKGZkLCBGU19JT0NfU0VURkxBR1MsICZmbGFncyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCWNhc2UgVkZBVDoKKwl7CisJICAgIHVpbnQzMl90IGF0dHIgPSAweDAwOyAvKiBDbGVhciBhbGwgYXR0cmlidXRlcyAqLworCSAgICBpb2N0bChmZCwgRkFUX0lPQ1RMX1NFVF9BVFRSSUJVVEVTLCAmYXR0cik7CisJICAgIGJyZWFrOworCX0KKyAgICBjYXNlIE5URlM6CisgICAgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGJyZWFrOworCX0KKwlmY2htb2QoZmQsIHN0LnN0X21vZGUgfCBTX0lXVVNSKTsKKyAgICB9Cit9CisKK3ZvaWQgc2V0X2F0dHJpYnV0ZXMoaW50IGZkKQoreworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgaWYgKCFmc3RhdChmZCwgJnN0KSkgeworCWZjaG1vZChmZCwgc3Quc3RfbW9kZSAmIChTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpKTsKKwlzd2l0Y2ggKGZzX3R5cGUpIHsKKwljYXNlIEVYVDI6CisJeworCSAgICBpbnQgZmxhZ3M7CisKKwkgICAgaWYgKHN0LnN0X3VpZCA9PSAwICYmICFpb2N0bChmZCwgRlNfSU9DX0dFVEZMQUdTLCAmZmxhZ3MpKSB7CisJCWZsYWdzIHw9IEZTX0lNTVVUQUJMRV9GTDsKKwkJaW9jdGwoZmQsIEZTX0lPQ19TRVRGTEFHUywgJmZsYWdzKTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisJY2FzZSBWRkFUOgorCXsKKwkgICAgdWludDMyX3QgYXR0ciA9IDB4MDc7IC8qIEhpZGRlbitTeXN0ZW0rUmVhZG9ubHkgKi8KKwkgICAgaW9jdGwoZmQsIEZBVF9JT0NUTF9TRVRfQVRUUklCVVRFUywgJmF0dHIpOworCSAgICBicmVhazsKKwl9CisgICAgY2FzZSBOVEZTOgorICAgICAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBicmVhazsKKwl9CisgICAgfQorfQorCisvKiBOZXcgRklFTUFQIGJhc2VkIG1hcHBpbmcgKi8KK3N0YXRpYyBpbnQgc2VjdG1hcF9maWUoaW50IGZkLCBzZWN0b3JfdCAqc2VjdG9ycywgaW50IG5zZWN0b3JzKQoreworICAgIHN0cnVjdCBmaWVtYXAgKmZtOworICAgIHN0cnVjdCBmaWVtYXBfZXh0ZW50ICpmZTsKKyAgICB1bnNpZ25lZCBpbnQgaSwgbnNlYzsKKyAgICBzZWN0b3JfdCBzZWMsICpzZWNwLCAqZXNlYzsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICB1aW50NjRfdCBtYXBsZW47CisKKyAgICBpZiAoZnN0YXQoZmQsICZzdCkpCisJcmV0dXJuIC0xOworCisgICAgZm0gPSBhbGxvY2Eoc2l6ZW9mKHN0cnVjdCBmaWVtYXApCisJCSsgbnNlY3RvcnMgKiBzaXplb2Yoc3RydWN0IGZpZW1hcF9leHRlbnQpKTsKKworICAgIG1lbXNldChmbSwgMCwgc2l6ZW9mICpmbSk7CisKKyAgICBtYXBsZW4gPSAodWludDY0X3QpbnNlY3RvcnMgPDwgU0VDVE9SX1NISUZUOworICAgIGlmIChtYXBsZW4gPiAodWludDY0X3Qpc3Quc3Rfc2l6ZSkKKwltYXBsZW4gPSBzdC5zdF9zaXplOworCisgICAgZm0tPmZtX3N0YXJ0ICAgICAgICA9IDA7CisgICAgZm0tPmZtX2xlbmd0aCAgICAgICA9IG1hcGxlbjsKKyAgICBmbS0+Zm1fZmxhZ3MgICAgICAgID0gRklFTUFQX0ZMQUdfU1lOQzsKKyAgICBmbS0+Zm1fZXh0ZW50X2NvdW50ID0gbnNlY3RvcnM7CisKKyAgICBpZiAoaW9jdGwoZmQsIEZTX0lPQ19GSUVNQVAsIGZtKSkKKwlyZXR1cm4gLTE7CisKKyAgICBtZW1zZXQoc2VjdG9ycywgMCwgbnNlY3RvcnMgKiBzaXplb2YgKnNlY3RvcnMpOworICAgIGVzZWMgPSBzZWN0b3JzICsgbnNlY3RvcnM7CisKKyAgICBmZSA9IGZtLT5mbV9leHRlbnRzOworCisgICAgaWYgKGZtLT5mbV9tYXBwZWRfZXh0ZW50cyA8IDEgfHwKKwkhKGZlW2ZtLT5mbV9tYXBwZWRfZXh0ZW50cy0xXS5mZV9mbGFncyAmIEZJRU1BUF9FWFRFTlRfTEFTVCkpCisJcmV0dXJuIC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IGZtLT5mbV9tYXBwZWRfZXh0ZW50czsgaSsrKSB7CisJaWYgKGZlLT5mZV9mbGFncyAmIEZJRU1BUF9FWFRFTlRfTEFTVCkgeworCSAgICAvKiBJZiB0aGlzIGlzIHRoZSAqZmluYWwqIGV4dGVudCwgcGFkIHRoZSBsZW5ndGggKi8KKwkgICAgZmUtPmZlX2xlbmd0aCA9IChmZS0+ZmVfbGVuZ3RoICsgU0VDVE9SX1NJWkUgLSAxKQorCQkmIH4oU0VDVE9SX1NJWkUgLSAxKTsKKwl9CisKKwlpZiAoKGZlLT5mZV9sb2dpY2FsIHwgZmUtPmZlX3BoeXNpY2FsfCBmZS0+ZmVfbGVuZ3RoKSAmCisJICAgIChTRUNUT1JfU0laRSAtIDEpKQorCSAgICByZXR1cm4gLTE7CisKKwlpZiAoZmUtPmZlX2ZsYWdzICYgKEZJRU1BUF9FWFRFTlRfVU5LTk9XTnwKKwkJCSAgICBGSUVNQVBfRVhURU5UX0RFTEFMTE9DfAorCQkJICAgIEZJRU1BUF9FWFRFTlRfRU5DT0RFRHwKKwkJCSAgICBGSUVNQVBfRVhURU5UX0RBVEFfRU5DUllQVEVEfAorCQkJICAgIEZJRU1BUF9FWFRFTlRfVU5XUklUVEVOKSkKKwkgICAgcmV0dXJuIC0xOworCisJc2VjcCA9IHNlY3RvcnMgKyAoZmUtPmZlX2xvZ2ljYWwgPj4gU0VDVE9SX1NISUZUKTsKKwlzZWMgID0gZmUtPmZlX3BoeXNpY2FsID4+IFNFQ1RPUl9TSElGVDsKKwluc2VjID0gZmUtPmZlX2xlbmd0aCA+PiBTRUNUT1JfU0hJRlQ7CisKKwl3aGlsZSAobnNlYy0tKSB7CisJICAgIGlmIChzZWNwID49IGVzZWMpCisJCWJyZWFrOworCSAgICAqc2VjcCsrID0gc2VjKys7CisJfQorCisJZmUrKzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogTGVnYWN5IEZJQk1BUCBiYXNlZCBtYXBwaW5nICovCitzdGF0aWMgaW50IHNlY3RtYXBfZmliKGludCBmZCwgc2VjdG9yX3QgKnNlY3RvcnMsIGludCBuc2VjdG9ycykKK3sKKyAgICB1bnNpZ25lZCBpbnQgYmxrLCBuYmxrOworICAgIHVuc2lnbmVkIGludCBpOworICAgIHVuc2lnbmVkIGludCBibGtzaXplOworICAgIHNlY3Rvcl90IHNlYzsKKworICAgIC8qIEdldCBibG9jayBzaXplICovCisgICAgaWYgKGlvY3RsKGZkLCBGSUdFVEJTWiwgJmJsa3NpemUpKQorCXJldHVybiAtMTsKKworICAgIC8qIE51bWJlciBvZiBzZWN0b3JzIHBlciBibG9jayAqLworICAgIGJsa3NpemUgPj49IFNFQ1RPUl9TSElGVDsKKworICAgIG5ibGsgPSAwOworICAgIHdoaWxlIChuc2VjdG9ycykgeworCWJsayA9IG5ibGsrKzsKKwlpZiAoaW9jdGwoZmQsIEZJQk1BUCwgJmJsaykpCisJICAgIHJldHVybiAtMTsKKworCXNlYyA9IChzZWN0b3JfdClibGsgKiBibGtzaXplOworCWZvciAoaSA9IDA7IGkgPCBibGtzaXplOyBpKyspIHsKKwkgICAgKnNlY3RvcnMrKyA9IHNlYysrOworCSAgICBpZiAoISAtLW5zZWN0b3JzKQorCQlicmVhazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9kdWNlIGZpbGUgbWFwCisgKi8KK2ludCBzZWN0bWFwKGludCBmZCwgc2VjdG9yX3QgKnNlY3RvcnMsIGludCBuc2VjdG9ycykKK3sKKyAgICBpZiAoIXNlY3RtYXBfZmllKGZkLCBzZWN0b3JzLCBuc2VjdG9ycykpCisJcmV0dXJuIDA7CisKKyAgICByZXR1cm4gc2VjdG1hcF9maWIoZmQsIHNlY3RvcnMsIG5zZWN0b3JzKTsKK30KKworLyoKKyAqIFNZU0xJTlVYIGluc3RhbGxzIHRoZSBzdHJpbmcgJ1NZU0xJTlVYJyBhdCBvZmZzZXQgMyBpbiB0aGUgYm9vdAorICogc2VjdG9yOyB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBGQVQgZmlsZXN5c3RlbXMuICBFYXJsaWVyIHZlcnNpb25zCisgKiB3b3VsZCBpbnN0YWxsIHRoZSBzdHJpbmcgIkVYVExJTlVYIiBpbnN0ZWFkLCBoYW5kbGUgYm90aC4KKyAqLworaW50IHN5c2xpbnV4X2FscmVhZHlfaW5zdGFsbGVkKGludCBkZXZfZmQpCit7CisgICAgY2hhciBidWZmZXJbOF07CisKKyAgICB4cHJlYWQoZGV2X2ZkLCBidWZmZXIsIDgsIDMpOworICAgIHJldHVybiAhbWVtY21wKGJ1ZmZlciwgIlNZU0xJTlVYIiwgOCkgfHwgIW1lbWNtcChidWZmZXIsICJFWFRMSU5VWCIsIDgpOworfQpkaWZmIC0tZ2l0IGEvbGliaW5zdGFsbGVyL3N5c2x4Y29tLmggYi9saWJpbnN0YWxsZXIvc3lzbHhjb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjNiNDYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliaW5zdGFsbGVyL3N5c2x4Y29tLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfSF9TWVNMWENPTV8KKyNkZWZpbmUgX0hfU1lTTFhDT01fCisKKyNpbmNsdWRlICJzeXNsaW51eC5oIgorCitleHRlcm4gY29uc3QgY2hhciAqcHJvZ3JhbTsKK3NzaXplX3QgeHByZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCk7Citzc2l6ZV90IHhwd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgb2ZmX3Qgb2Zmc2V0KTsKK3ZvaWQgY2xlYXJfYXR0cmlidXRlcyhpbnQgZmQpOwordm9pZCBzZXRfYXR0cmlidXRlcyhpbnQgZmQpOworaW50IHNlY3RtYXAoaW50IGZkLCBzZWN0b3JfdCAqc2VjdG9ycywgaW50IG5zZWN0b3JzKTsKK2ludCBzeXNsaW51eF9hbHJlYWR5X2luc3RhbGxlZChpbnQgZGV2X2ZkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpbnN0YWxsZXIvc3lzbHhmcy5oIGIvbGliaW5zdGFsbGVyL3N5c2x4ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQ2ZTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliaW5zdGFsbGVyL3N5c2x4ZnMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogICBDb3B5cmlnaHQgMjAxMS0yMDEyIFBhdWxvIEFsY2FudGFyYSA8cGNhY2pyQHp5dG9yLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9TWVNMWEZTX0hfCisjZGVmaW5lIF9TWVNMWEZTX0hfCisKKy8qIEdsb2JhbCBmc190eXBlIGZvciBoYW5kbGluZyBmYXQsIG50ZnMsIGV4dDIvMy80LCBidHJmcywgeGZzIGFuZCB1ZnMxLzIgKi8KK2VudW0gZmlsZXN5c3RlbSB7CisgICAgTk9ORSwKKyAgICBFWFQyLAorICAgIEJUUkZTLAorICAgIFZGQVQsCisgICAgTlRGUywKKyAgICBYRlMsCisgICAgVUZTMSwKKyAgICBVRlMyLAorfTsKKworZXh0ZXJuIGludCBmc190eXBlOworCisjZW5kaWYgLyogX1NZU0xYRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9zeXNseGludC5oIGIvbGliaW5zdGFsbGVyL3N5c2x4aW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlZTc4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9zeXNseGludC5oCkBAIC0wLDAgKzEsMzQyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDE0IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKiAgIENvcHlyaWdodCAyMDExIFBhdWxvIEFsY2FudGFyYSA8cGNhY2pyQGdtYWlsLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIFNZU0xYSU5UX0gKKyNkZWZpbmUgU1lTTFhJTlRfSAorCisjaW5jbHVkZSAic3lzbGludXguaCIKKworI2lmIGRlZmluZWQoX18zODZfXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorIyBkZWZpbmUgWDg2X01FTSAxCQkvKiBMaXR0bGVlbmRpYW4gYW5kIHVuYWxpZ25lZCBzYWZlICovCisjZWxzZQorIyBkZWZpbmUgWDg2X01FTSAwCisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjIGlmZGVmIF9fTUlOR1czMl9fCisgICAvKiBnY2MgNC43IG1pc2NvbXBpbGVzIHBhY2tlZCBzdHJ1Y3R1cmVzIGluIE1TLWJpdGZpZWxkIG1vZGUgKi8KKyMgIGRlZmluZSBQQUNLRUQgX19hdHRyaWJ1dGVfXygocGFja2VkLGdjY19zdHJ1Y3QpKQorIyBlbHNlCisjICBkZWZpbmUgUEFDS0VEIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisjIGVuZGlmCisjZWxzZQorIyBlcnJvciAiTmVlZCB0byBkZWZpbmUgUEFDS0VEIGZvciB0aGlzIGNvbXBpbGVyIgorI2VuZGlmCisKKy8qCisgKiBBY2Nlc3MgZnVuY3Rpb25zIGZvciBsaXR0bGVlbmRpYW4gbnVtYmVycywgcG9zc2libHkgbWlzYWxpZ25lZC4KKyAqLworc3RhdGljIGlubGluZSB1aW50OF90IGdldF84KGNvbnN0IHVpbnQ4X3QgKiBwKQoreworICAgIHJldHVybiAqcDsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBnZXRfMTYoY29uc3QgdWludDE2X3QgKiBwKQoreworI2lmIFg4Nl9NRU0KKyAgICAvKiBMaXR0bGVlbmRpYW4gYW5kIHVuYWxpZ25lZC1jYXBhYmxlICovCisgICAgcmV0dXJuICpwOworI2Vsc2UKKyAgICBjb25zdCB1aW50OF90ICpwcCA9IChjb25zdCB1aW50OF90ICopcDsKKyAgICByZXR1cm4gcHBbMF0gKyAoKHVpbnQxNl90KXBwWzFdIDw8IDgpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZ2V0XzMyKGNvbnN0IHVpbnQzMl90ICogcCkKK3sKKyNpZiBYODZfTUVNCisgICAgLyogTGl0dGxlZW5kaWFuIGFuZCB1bmFsaWduZWQtY2FwYWJsZSAqLworICAgIHJldHVybiAqcDsKKyNlbHNlCisgICAgY29uc3QgdWludDE2X3QgKnBwID0gKGNvbnN0IHVpbnQxNl90ICopcDsKKyAgICByZXR1cm4gZ2V0XzE2KCZwcFswXSkgKyAoKHVpbnQzMl90KWdldF8xNigmcHBbMV0pIDw8IDE2KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGdldF82NChjb25zdCB1aW50NjRfdCAqIHApCit7CisjaWYgWDg2X01FTQorICAgIC8qIExpdHRsZWVuZGlhbiBhbmQgdW5hbGlnbmVkLWNhcGFibGUgKi8KKyAgICByZXR1cm4gKnA7CisjZWxzZQorICAgIGNvbnN0IHVpbnQzMl90ICpwcCA9IChjb25zdCB1aW50MzJfdCAqKXA7CisgICAgcmV0dXJuIGdldF8zMigmcHBbMF0pICsgKCh1aW50NjRfdClnZXRfMzIoJnBwWzFdKSA8PCAzMik7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF84KHVpbnQ4X3QgKnAsIHVpbnQ4X3QgdikKK3sKKyAgICAqcCA9IHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfMTYodWludDE2X3QgKnAsIHVpbnQxNl90IHYpCit7CisjaWYgWDg2X01FTQorICAgIC8qIExpdHRsZWVuZGlhbiBhbmQgdW5hbGlnbmVkLWNhcGFibGUgKi8KKyAgICAqcCA9IHY7CisjZWxzZQorICAgIHVpbnQ4X3QgKnBwID0gKHVpbnQ4X3QgKikgcDsKKyAgICBwcFswXSA9IHY7CisgICAgcHBbMV0gPSB2ID4+IDg7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF8zMih1aW50MzJfdCAqcCwgdWludDMyX3QgdikKK3sKKyNpZiBYODZfTUVNCisgICAgLyogTGl0dGxlZW5kaWFuIGFuZCB1bmFsaWduZWQtY2FwYWJsZSAqLworICAgICpwID0gdjsKKyNlbHNlCisgICAgdWludDE2X3QgKnBwID0gKHVpbnQxNl90ICopIHA7CisgICAgc2V0XzE2KCZwcFswXSwgdik7CisgICAgc2V0XzE2KCZwcFsxXSwgdiA+PiAxNik7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF82NCh1aW50NjRfdCAqcCwgdWludDY0X3QgdikKK3sKKyNpZiBYODZfTUVNCisgICAgLyogTGl0dGxlZW5kaWFuIGFuZCB1bmFsaWduZWQtY2FwYWJsZSAqLworICAgICpwID0gdjsKKyNlbHNlCisgICAgdWludDMyX3QgKnBwID0gKHVpbnQzMl90ICopIHA7CisgICAgc2V0XzMyKCZwcFswXSwgdik7CisgICAgc2V0XzMyKCZwcFsxXSwgdiA+PiAzMik7CisjZW5kaWYKK30KKworLyoKKyAqIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBNUy1ET1MgZGVyaXZhdGl2ZTogc3lzbGludXhfbGRsaW51eAorICogaXMgYSAiZmFyIiBvYmplY3QuLi4KKyAqLworI2lmZGVmIF9fTVNET1NfXworCit1aW50OF90IGdldF84X3NsKGNvbnN0IHVpbnQ4X3QgX3NsaW1nICogcCk7Cit1aW50MTZfdCBnZXRfMTZfc2woY29uc3QgdWludDE2X3QgX3NsaW1nICogcCk7Cit1aW50MzJfdCBnZXRfMzJfc2woY29uc3QgdWludDMyX3QgX3NsaW1nICogcCk7Cit1aW50NjRfdCBnZXRfNjRfc2woY29uc3QgdWludDY0X3QgX3NsaW1nICogcCk7Cit2b2lkIHNldF84X3NsKHVpbnQ4X3QgX3NsaW1nICogcCwgdWludDhfdCB2KTsKK3ZvaWQgc2V0XzE2X3NsKHVpbnQxNl90IF9zbGltZyAqIHAsIHVpbnQxNl90IHYpOwordm9pZCBzZXRfMzJfc2wodWludDMyX3QgX3NsaW1nICogcCwgdWludDMyX3Qgdik7Cit2b2lkIHNldF82NF9zbCh1aW50NjRfdCBfc2xpbWcgKiBwLCB1aW50NjRfdCB2KTsKK3ZvaWQgbWVtY3B5X3RvX3NsKHZvaWQgX3NsaW1nICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbik7Cit2b2lkIG1lbWNweV9mcm9tX3NsKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCBfc2xpbWcgKnNyYywgc2l6ZV90IGxlbik7Cit2b2lkIG1lbXNldF9zbCh2b2lkIF9zbGltZyAqZHN0LCBpbnQgYywgc2l6ZV90IGxlbik7CisKKyNlbHNlCisKKy8qIFNhbmUgc3lzdGVtIC4uLiAqLworc3RhdGljIGlubGluZSB1aW50OF90IGdldF84X3NsKGNvbnN0IHVpbnQ4X3QgX3NsaW1nICogcCkKK3sKKyAgICByZXR1cm4gZ2V0XzgoKGNvbnN0IHVpbnQ4X3QgX2ZvcmNlICopcCk7Cit9CitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGdldF8xNl9zbChjb25zdCB1aW50MTZfdCBfc2xpbWcgKiBwKQoreworICAgIHJldHVybiBnZXRfMTYoKGNvbnN0IHVpbnQxNl90IF9mb3JjZSAqKXApOworfQorc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfMzJfc2woY29uc3QgdWludDMyX3QgX3NsaW1nICogcCkKK3sKKyAgICByZXR1cm4gZ2V0XzMyKChjb25zdCB1aW50MzJfdCBfZm9yY2UgKilwKTsKK30KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZ2V0XzY0X3NsKGNvbnN0IHVpbnQ2NF90IF9zbGltZyAqIHApCit7CisgICAgcmV0dXJuIGdldF82NCgoY29uc3QgdWludDY0X3QgX2ZvcmNlICopcCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0Xzhfc2wodWludDhfdCBfc2xpbWcgKiBwLCB1aW50OF90IHYpCit7CisgICAgc2V0XzgoKHVpbnQ4X3QgX2ZvcmNlICopcCwgdik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0XzE2X3NsKHVpbnQxNl90IF9zbGltZyAqIHAsIHVpbnQxNl90IHYpCit7CisgICAgc2V0XzE2KCh1aW50MTZfdCBfZm9yY2UgKilwLCB2KTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfMzJfc2wodWludDMyX3QgX3NsaW1nICogcCwgdWludDMyX3QgdikKK3sKKyAgICBzZXRfMzIoKHVpbnQzMl90IF9mb3JjZSAqKXAsIHYpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF82NF9zbCh1aW50NjRfdCBfc2xpbWcgKiBwLCB1aW50NjRfdCB2KQoreworICAgIHNldF82NCgodWludDY0X3QgX2ZvcmNlICopcCwgdik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWVtY3B5X3RvX3NsKHZvaWQgX3NsaW1nICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbikKK3sKKyAgICBtZW1jcHkoKHZvaWQgX2ZvcmNlICopZHN0LCBzcmMsIGxlbik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWVtY3B5X2Zyb21fc2wodm9pZCAqZHN0LCBjb25zdCB2b2lkIF9zbGltZyAqc3JjLCBzaXplX3QgbGVuKQoreworICAgIG1lbWNweShkc3QsIChjb25zdCB2b2lkIF9mb3JjZSAqKXNyYywgbGVuKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1zZXRfc2wodm9pZCBfc2xpbWcgKmRzdCwgaW50IGMsIHNpemVfdCBsZW4pCit7CisgICAgbWVtc2V0KCh2b2lkIF9mb3JjZSAqKWRzdCwgYywgbGVuKTsKK30KKworI2VuZGlmCisKKyNkZWZpbmUgTERMSU5VWF9NQUdJQwkweDNlYjIwMmZlCisjZGVmaW5lIEJTX01BR0lDX1ZFUgkoMHgxYiA8PCA5KQorCisvKiBQYXRjaCBhcmVhIGZvciBkaXNrLWJhc2VkIGluc3RhbGxlcnMgKi8KK3N0cnVjdCBwYXRjaF9hcmVhIHsKKyAgICB1aW50MzJfdCBtYWdpYzsJCS8qIExETElOVVhfTUFHSUMgKi8KKyAgICB1aW50MzJfdCBpbnN0YW5jZTsJCS8qIFBlci12ZXJzaW9uIHZhbHVlICovCisgICAgdWludDE2X3QgZGF0YV9zZWN0b3JzOworICAgIHVpbnQxNl90IGFkdl9zZWN0b3JzOworICAgIHVpbnQzMl90IGR3b3JkczsKKyAgICB1aW50MzJfdCBjaGVja3N1bTsKKyAgICB1aW50MTZfdCBtYXh0cmFuc2ZlcjsKKyAgICB1aW50MTZfdCBlcGFvZmZzZXQ7CQkvKiBQb2ludGVyIHRvIHRoZSBleHRlbmRlZCBwYXRjaCBhcmVhICovCit9OworCitzdHJ1Y3QgZXh0X3BhdGNoX2FyZWEgeworICAgIHVpbnQxNl90IGFkdnB0cm9mZnNldDsJLyogQURWIHBvaW50ZXJzICovCisgICAgdWludDE2X3QgZGlyb2Zmc2V0OwkJLyogQ3VycmVudCBkaXJlY3RvcnkgZmllbGQgKi8KKyAgICB1aW50MTZfdCBkaXJsZW47CQkvKiBMZW5ndGggb2YgY3VycmVudCBkaXJlY3RvcnkgZmllbGQgKi8KKyAgICB1aW50MTZfdCBzdWJ2b2xvZmZzZXQ7CS8qIFN1YnZvbHVtZSBmaWVsZCAqLworICAgIHVpbnQxNl90IHN1YnZvbGxlbjsJCS8qIExlbmd0aCBvZiBzdWJ2b2x1bWUgZmllbGQgKi8KKyAgICB1aW50MTZfdCBzZWNwdHJvZmZzZXQ7CS8qIFNlY3RvciBleHRlbnQgcG9pbnRlcnMgKi8KKyAgICB1aW50MTZfdCBzZWNwdHJjbnQ7CQkvKiBOdW1iZXIgb2Ygc2VjdG9yIGV4dGVudCBwb2ludGVycyAqLworCisgICAgdWludDE2X3Qgc2VjdDFwdHIwOwkJLyogQm9vdCBzZWN0b3Igb2Zmc2V0IG9mIHNlY3RvciAxIHB0ciBMU1cgKi8KKyAgICB1aW50MTZfdCBzZWN0MXB0cjE7CQkvKiBCb290IHNlY3RvciBvZmZzZXQgb2Ygc2VjdG9yIDEgcHRyIE1TVyAqLworICAgIHVpbnQxNl90IHJhaWRwYXRjaDsJCS8qIEJvb3Qgc2VjdG9yIFJBSUQgbW9kZSBwYXRjaCBwb2ludGVyICovCit9OworCisvKiBTZWN0b3IgZXh0ZW50ICovCitzdHJ1Y3Qgc3lzbGludXhfZXh0ZW50IHsKKyAgICB1aW50NjRfdCBsYmE7CisgICAgdWludDE2X3QgbGVuOworfSBQQUNLRUQ7CisKKy8qIEZBVCBib290c2VjdG9yIGZvcm1hdCwgYWxzbyB1c2VkIGJ5IG90aGVyIGRpc2stYmFzZWQgZGVyaXZhdGl2ZXMgKi8KK3N0cnVjdCBmYXRfYm9vdF9zZWN0b3IgeworICAgIHVpbnQ4X3QgYnNKdW1wWzNdOworICAgIGNoYXIgYnNPZW1OYW1lWzhdOworICAgIHVpbnQxNl90IGJzQnl0ZXNQZXJTZWM7CisgICAgdWludDhfdCBic1NlY1BlckNsdXN0OworICAgIHVpbnQxNl90IGJzUmVzU2VjdG9yczsKKyAgICB1aW50OF90IGJzRkFUczsKKyAgICB1aW50MTZfdCBic1Jvb3REaXJFbnRzOworICAgIHVpbnQxNl90IGJzU2VjdG9yczsKKyAgICB1aW50OF90IGJzTWVkaWE7CisgICAgdWludDE2X3QgYnNGQVRzZWNzOworICAgIHVpbnQxNl90IGJzU2VjUGVyVHJhY2s7CisgICAgdWludDE2X3QgYnNIZWFkczsKKyAgICB1aW50MzJfdCBic0hpZGRlblNlY3M7CisgICAgdWludDMyX3QgYnNIdWdlU2VjdG9yczsKKworICAgIHVuaW9uIHsKKwlzdHJ1Y3QgeworCSAgICB1aW50OF90IERyaXZlTnVtYmVyOworCSAgICB1aW50OF90IFJlc2VydmVkMTsKKwkgICAgdWludDhfdCBCb290U2lnbmF0dXJlOworCSAgICB1aW50MzJfdCBWb2x1bWVJRDsKKwkgICAgY2hhciBWb2x1bWVMYWJlbFsxMV07CisJICAgIGNoYXIgRmlsZVN5c1R5cGVbOF07CisJICAgIHVpbnQ4X3QgQ29kZVs0NDJdOworCX0gUEFDS0VEIGJzMTY7CisJc3RydWN0IHsKKwkgICAgdWludDMyX3QgRkFUU3ozMjsKKwkgICAgdWludDE2X3QgRXh0RmxhZ3M7CisJICAgIHVpbnQxNl90IEZTVmVyOworCSAgICB1aW50MzJfdCBSb290Q2x1czsKKwkgICAgdWludDE2X3QgRlNJbmZvOworCSAgICB1aW50MTZfdCBCa0Jvb3RTZWM7CisJICAgIHVpbnQ4X3QgUmVzZXJ2ZWQwWzEyXTsKKwkgICAgdWludDhfdCBEcml2ZU51bWJlcjsKKwkgICAgdWludDhfdCBSZXNlcnZlZDE7CisJICAgIHVpbnQ4X3QgQm9vdFNpZ25hdHVyZTsKKwkgICAgdWludDMyX3QgVm9sdW1lSUQ7CisJICAgIGNoYXIgVm9sdW1lTGFiZWxbMTFdOworCSAgICBjaGFyIEZpbGVTeXNUeXBlWzhdOworCSAgICB1aW50OF90IENvZGVbNDE0XTsKKwl9IFBBQ0tFRCBiczMyOworICAgIH0gUEFDS0VEOworCisgICAgdWludDMyX3QgYnNNYWdpYzsKKyAgICB1aW50MTZfdCBic0ZvcndhcmRQdHI7CisgICAgdWludDE2X3QgYnNTaWduYXR1cmU7Cit9IFBBQ0tFRDsKKworLyogTlRGUyBib290c2VjdG9yIGZvcm1hdCAqLworc3RydWN0IG50ZnNfYm9vdF9zZWN0b3IgeworICAgIHVpbnQ4X3QgYnNKdW1wWzNdOworICAgIGNoYXIgYnNPZW1OYW1lWzhdOworICAgIHVpbnQxNl90IGJzQnl0ZXNQZXJTZWM7CisgICAgdWludDhfdCBic1NlY1BlckNsdXN0OworICAgIHVpbnQxNl90IGJzUmVzU2VjdG9yczsKKyAgICB1aW50OF90IGJzWmVyb2VkXzBbM107CisgICAgdWludDE2X3QgYnNaZXJvZWRfMTsKKyAgICB1aW50OF90IGJzTWVkaWE7CisgICAgdWludDE2X3QgYnNaZXJvZWRfMjsKKyAgICB1aW50MTZfdCBic1VudXNlZF8wOworICAgIHVpbnQxNl90IGJzVW51c2VkXzE7CisgICAgdWludDMyX3QgYnNVbnVzZWRfMjsKKyAgICB1aW50MzJfdCBic1plcm9lZF8zOworICAgIHVpbnQzMl90IGJzVW51c2VkXzM7CisgICAgdWludDY0X3QgYnNUb3RhbFNlY3RvcnM7CisgICAgdWludDY0X3QgYnNNRlRMb2dpY2FsQ2x1c3ROcjsKKyAgICB1aW50NjRfdCBic01GVE1pcnJMb2dpY2FsQ2x1c3ROcjsKKyAgICB1aW50OF90IGJzQ2x1c3RQZXJNRlRyZWNvcmQ7CisgICAgdWludDhfdCBic1VudXNlZF80WzNdOworICAgIHVpbnQ4X3QgYnNDbHVzdFBlcklkeEJ1ZjsKKyAgICB1aW50OF90IGJzVW51c2VkXzVbM107CisgICAgdWludDY0X3QgYnNWb2xTZXJpYWxOcjsKKyAgICB1aW50MzJfdCBic1VudXNlZF82OworCisgICAgdWludDhfdCBDb2RlWzQyMF07CisKKyAgICB1aW50MzJfdCBic01hZ2ljOworICAgIHVpbnQxNl90IGJzRm9yd2FyZFB0cjsKKyAgICB1aW50MTZfdCBic1NpZ25hdHVyZTsKK30gUEFDS0VEOworCisjZGVmaW5lIEZBVF9ic0hlYWQgICAgICBic0p1bXAKKyNkZWZpbmUgRkFUX2JzSGVhZExlbiAgIG9mZnNldG9mKHN0cnVjdCBmYXRfYm9vdF9zZWN0b3IsIGJzQnl0ZXNQZXJTZWMpCisjZGVmaW5lIEZBVF9ic0NvZGUJICAgIGJzMzIuQ29kZQkvKiBUaGUgY29tbW9uIHNhZmUgY2hvaWNlICovCisjZGVmaW5lIEZBVF9ic0NvZGVMZW4gICAob2Zmc2V0b2Yoc3RydWN0IGZhdF9ib290X3NlY3RvciwgYnNTaWduYXR1cmUpIC0gXAorCQkgICAgIG9mZnNldG9mKHN0cnVjdCBmYXRfYm9vdF9zZWN0b3IsIEZBVF9ic0NvZGUpKQorCisjZGVmaW5lIE5URlNfYnNIZWFkICAgICBic0p1bXAKKyNkZWZpbmUgTlRGU19ic0hlYWRMZW4gIG9mZnNldG9mKHN0cnVjdCBudGZzX2Jvb3Rfc2VjdG9yLCBic09lbU5hbWUpCisjZGVmaW5lIE5URlNfYnNDb2RlICAgICBDb2RlCisjZGVmaW5lIE5URlNfYnNDb2RlTGVuICAob2Zmc2V0b2Yoc3RydWN0IG50ZnNfYm9vdF9zZWN0b3IsIGJzU2lnbmF0dXJlKSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihzdHJ1Y3QgbnRmc19ib290X3NlY3RvciwgTlRGU19ic0NvZGUpKQorCisvKiBDaGVjayBpZiB0aGVyZSBhcmUgc3BlY2lmaWMgemVybyBmaWVsZHMgaW4gYW4gTlRGUyBib290IHNlY3RvciAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19jaGVja196ZXJvX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgbnRmc19ib290X3NlY3RvciAqc2IpCit7CisgICAgcmV0dXJuICFzYi0+YnNSZXNTZWN0b3JzICYmICghc2ItPmJzWmVyb2VkXzBbMF0gJiYgIXNiLT5ic1plcm9lZF8wWzFdICYmCisgICAgICAgICAgICAhc2ItPmJzWmVyb2VkXzBbMl0pICYmICFzYi0+YnNaZXJvZWRfMSAmJiAhc2ItPmJzWmVyb2VkXzIgJiYKKyAgICAgICAgICAgICFzYi0+YnNaZXJvZWRfMzsKK30KKworc3RhdGljIGlubGluZSBpbnQgbnRmc19jaGVja19zYl9maWVsZHMoY29uc3Qgc3RydWN0IG50ZnNfYm9vdF9zZWN0b3IgKnNiKQoreworICAgIHJldHVybiBudGZzX2NoZWNrX3plcm9fZmllbGRzKHNiKSAmJgorICAgICAgICAgICAgKCFtZW1jbXAoc2ItPmJzT2VtTmFtZSwgIk5URlMgICAgIiwgOCkgfHwKKyAgICAgICAgICAgICAhbWVtY21wKHNiLT5ic09lbU5hbWUsICJNU1dJTjQuMCIsIDgpIHx8CisgICAgICAgICAgICAgIW1lbWNtcChzYi0+YnNPZW1OYW1lLCAiTVNXSU40LjEiLCA4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZhdF9jaGVja19zYl9maWVsZHMoY29uc3Qgc3RydWN0IGZhdF9ib290X3NlY3RvciAqc2IpCit7CisgICAgcmV0dXJuIHNiLT5ic1Jlc1NlY3RvcnMgJiYgc2ItPmJzRkFUcyAmJgorICAgICAgICAgICAgKCFtZW1jbXAoc2ItPmJzMTYuRmlsZVN5c1R5cGUsICJGQVQxMiAgICIsIDgpIHx8CisgICAgICAgICAgICAgIW1lbWNtcChzYi0+YnMxNi5GaWxlU3lzVHlwZSwgIkZBVDE2ICAgIiwgOCkgfHwKKyAgICAgICAgICAgICAhbWVtY21wKHNiLT5iczE2LkZpbGVTeXNUeXBlLCAiRkFUICAgICAiLCA4KSB8fAorICAgICAgICAgICAgICFtZW1jbXAoc2ItPmJzMzIuRmlsZVN5c1R5cGUsICJGQVQzMiAgICIsIDgpKTsKK30KKworI2VuZGlmIC8qIFNZU0xYSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9zeXNseG1vZC5jIGIvbGliaW5zdGFsbGVyL3N5c2x4bW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjNDE2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9zeXNseG1vZC5jCkBAIC0wLDAgKzEsMjA4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMTk5OC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDE0IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbHhtb2QuYyAtIENvZGUgdG8gcHJvdmlkZSBhIFNZU0xJTlVYIGNvZGUgc2V0IHRvIGFuIGluc3RhbGxlci4KKyAqLworCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNTAwCS8qIFJlcXVpcmVkIG9uIGdsaWJjIDIueCAqLworI2RlZmluZSBfQlNEX1NPVVJDRQorLyogZ2xpYmMgMi4yMCBkZXByZWNhdGVzIF9CU0RfU09VUkNFIGluIGZhdm91ciBvZiBfREVGQVVMVF9TT1VSQ0UgKi8KKyNkZWZpbmUgX0RFRkFVTFRfU09VUkNFIDEKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzeXNsaW51eC5oIgorI2luY2x1ZGUgInN5c2x4aW50LmgiCisKKworLyoKKyAqIEdlbmVyYXRlIHNlY3RvciBleHRlbnRzCisgKi8KK3N0YXRpYyB2b2lkIGdlbmVyYXRlX2V4dGVudHMoc3RydWN0IHN5c2xpbnV4X2V4dGVudCBfc2xpbWcgKmV4LCBpbnQgbnB0cnMsCisJCQkgICAgIGNvbnN0IHNlY3Rvcl90ICpzZWN0cCwgaW50IG5zZWN0KQoreworICAgIHVpbnQzMl90IGFkZHIgPSAweDgwMDA7CS8qIGxkbGludXguc3lzIHN0YXJ0cyBsb2FkaW5nIGhlcmUgKi8KKyAgICB1aW50MzJfdCBiYXNlOworICAgIHNlY3Rvcl90IHNlY3QsIGxiYTsKKyAgICB1bnNpZ25lZCBpbnQgbGVuOworCisgICAgYmFzZSA9IGFkZHI7CisgICAgbGVuID0gbGJhID0gMDsKKworICAgIG1lbXNldF9zbChleCwgMCwgbnB0cnMgKiBzaXplb2YgKmV4KTsKKworICAgIHdoaWxlIChuc2VjdCkgeworCXNlY3QgPSAqc2VjdHArKzsKKworCWlmIChsZW4pIHsKKwkgICAgdWludDMyX3QgeGJ5dGVzID0gKGxlbiArIDEpICogU0VDVE9SX1NJWkU7CisKKwkgICAgaWYgKHNlY3QgPT0gbGJhICsgbGVuICYmIHhieXRlcyA8IDY1NTM2ICYmCisJCSgoYWRkciBeIChiYXNlICsgeGJ5dGVzIC0gMSkpICYgMHhmZmZmMDAwMCkgPT0gMCkgeworCQkvKiBXZSBjYW4gYWRkIHRvIHRoZSBjdXJyZW50IGV4dGVudCAqLworCQlsZW4rKzsKKwkJZ290byBuZXh0OworCSAgICB9CisKKwkgICAgc2V0XzY0X3NsKCZleC0+bGJhLCBsYmEpOworCSAgICBzZXRfMTZfc2woJmV4LT5sZW4sIGxlbik7CisJICAgIGV4Kys7CisJfQorCisJYmFzZSA9IGFkZHI7CisJbGJhICA9IHNlY3Q7CisJbGVuICA9IDE7CisKKyAgICBuZXh0OgorCWFkZHIgKz0gU0VDVE9SX1NJWkU7CisJbnNlY3QtLTsKKyAgICB9CisKKyAgICBpZiAobGVuKSB7CisJc2V0XzY0X3NsKCZleC0+bGJhLCBsYmEpOworCXNldF8xNl9zbCgmZXgtPmxlbiwgbGVuKTsKKwlleCsrOworICAgIH0KK30KKworLyoKKyAqIEZvcm0gYSBwb2ludGVyIGJhc2VkIG9uIGEgMTYtYml0IHBhdGNoYXJlYS9lcGEgZmllbGQKKyAqLworc3RhdGljIGlubGluZSB2b2lkICpwdHIodm9pZCAqaW1nLCBjb25zdCB1aW50MTZfdCBfc2xpbWcgKm9mZnNldF9wKQoreworICAgIHJldHVybiAoY2hhciAqKWltZyArIGdldF8xNl9zbChvZmZzZXRfcCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgX3NsaW1nICpzbHB0cih2b2lkIF9zbGltZyAqaW1nLAorCQkJCSBjb25zdCB1aW50MTZfdCBfc2xpbWcgKm9mZnNldF9wKQoreworICAgIHJldHVybiAoY2hhciBfc2xpbWcgKilpbWcgKyBnZXRfMTZfc2wob2Zmc2V0X3ApOworfQorCisvKgorICogVGhpcyBwYXRjaGVzIHRoZSBib290IHNlY3RvciBhbmQgdGhlIGJlZ2lubmluZyBvZiBsZGxpbnV4LnN5cworICogYmFzZWQgb24gYW4gbGRsaW51eC5zeXMgc2VjdG9yIG1hcCBwYXNzZWQgaW4uICBUeXBpY2FsbHkgdGhpcyBpcworICogaGFuZGxlZCBieSB3cml0aW5nIGxkbGludXguc3lzLCBtYXBwaW5nIGl0LCBhbmQgdGhlbiBvdmVyd3JpdGUgaXQKKyAqIHdpdGggdGhlIHBhdGNoZWQgdmVyc2lvbi4gIElmIHRoaXMgaXNuJ3Qgc2FmZSB0byBkbyBiZWNhdXNlIG9mCisgKiBhbiBPUyB3aGljaCBkb2VzIGJsb2NrIHJlYWxsb2NhdGlvbiwgdGhlbiBvdmVyd3JpdGUgaXQgd2l0aAorICogZGlyZWN0IGFjY2VzcyBzaW5jZSB0aGUgbG9jYXRpb24gaXMga25vd24uCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1vZGlmaWVkIGJ5dGVzIGluIGxkbGludXguc3lzIGlmIHN1Y2Nlc3NmdWwsCisgKiBvdGhlcndpc2UgLTEuCisgKi8KK2ludCBzeXNsaW51eF9wYXRjaChjb25zdCBzZWN0b3JfdCAqc2VjdHAsIGludCBuc2VjdG9ycywKKwkJICAgaW50IHN0dXBpZCwgaW50IHJhaWRfbW9kZSwKKwkJICAgY29uc3QgY2hhciAqc3ViZGlyLCBjb25zdCBjaGFyICpzdWJ2b2wpCit7CisgICAgc3RydWN0IHBhdGNoX2FyZWEgX3NsaW1nICpwYXRjaGFyZWE7CisgICAgc3RydWN0IGV4dF9wYXRjaF9hcmVhIF9zbGltZyAqZXBhOworICAgIHN0cnVjdCBzeXNsaW51eF9leHRlbnQgX3NsaW1nICpleDsKKyAgICBjb25zdCB1aW50MzJfdCBfc2xpbWcgKndwOworICAgIGludCBuc2VjdCA9ICgoYm9vdF9pbWFnZV9sZW4gKyBTRUNUT1JfU0laRSAtIDEpID4+IFNFQ1RPUl9TSElGVCkgKyAyOworICAgIHVpbnQzMl90IGNzdW07CisgICAgaW50IGksIGR3LCBucHRyczsKKyAgICBzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yICpzYnMgPSAoc3RydWN0IGZhdF9ib290X3NlY3RvciAqKWJvb3Rfc2VjdG9yOworICAgIHVpbnQ2NF90IF9zbGltZyAqYWR2cHRyczsKKworICAgIGlmIChuc2VjdG9ycyA8IG5zZWN0KQorCXJldHVybiAtMTsJCS8qIFRoZSBhY3R1YWwgZmlsZSBpcyB0b28gc21hbGwgZm9yIGNvbnRlbnQgKi8KKworICAgIC8qIFNlYXJjaCBmb3IgTERMSU5VWF9NQUdJQyB0byBmaW5kIHRoZSBwYXRjaCBhcmVhICovCisgICAgZm9yICh3cCA9IChjb25zdCB1aW50MzJfdCBfc2xpbWcgKilib290X2ltYWdlOworCSBnZXRfMzJfc2wod3ApICE9IExETElOVVhfTUFHSUM7CisJIHdwKyspCisJOworICAgIHBhdGNoYXJlYSA9IChzdHJ1Y3QgcGF0Y2hfYXJlYSBfc2xpbWcgKil3cDsKKyAgICBlcGEgPSBzbHB0cihib290X2ltYWdlLCAmcGF0Y2hhcmVhLT5lcGFvZmZzZXQpOworCisgICAgLyogRmlyc3Qgc2VjdG9yIG5lZWQgcG9pbnRlciBpbiBib290IHNlY3RvciAqLworICAgIHNldF8zMihwdHIoc2JzLCAmZXBhLT5zZWN0MXB0cjApLCBzZWN0cFswXSk7CisgICAgc2V0XzMyKHB0cihzYnMsICZlcGEtPnNlY3QxcHRyMSksIHNlY3RwWzBdID4+IDMyKTsKKyAgICBzZWN0cCsrOworCisgICAgLyogSGFuZGxlIFJBSUQgbW9kZSAqLworICAgIGlmIChyYWlkX21vZGUpIHsKKwkvKiBQYXRjaCBpbiBJTlQgMThoID0gQ0QgMTggKi8KKwlzZXRfMTYocHRyKHNicywgJmVwYS0+cmFpZHBhdGNoKSwgMHgxOENEKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdXAgdGhlIHRvdGFscyAqLworICAgIGR3ID0gYm9vdF9pbWFnZV9sZW4gPj4gMjsJLyogQ09NUExFVEUgZHdvcmRzLCBleGNsdWRpbmcgQURWICovCisgICAgc2V0XzE2X3NsKCZwYXRjaGFyZWEtPmRhdGFfc2VjdG9ycywgbnNlY3QgLSAyKTsgLyogTm90IGluY2x1ZGluZyBBRFZzICovCisgICAgc2V0XzE2X3NsKCZwYXRjaGFyZWEtPmFkdl9zZWN0b3JzLCAyKTsJLyogQURWcyBuZWVkIDIgc2VjdG9ycyAqLworICAgIHNldF8zMl9zbCgmcGF0Y2hhcmVhLT5kd29yZHMsIGR3KTsKKworICAgIC8qIEhhbmRsZSBTdHVwaWQgbW9kZSAqLworICAgIGlmIChzdHVwaWQpIHsKKwkvKiBBY2Nlc3Mgb25seSBvbmUgc2VjdG9yIGF0IGEgdGltZSAqLworCXNldF8xNl9zbCgmcGF0Y2hhcmVhLT5tYXh0cmFuc2ZlciwgMSk7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBzZWN0b3IgZXh0ZW50cyAqLworICAgIGV4ID0gc2xwdHIoYm9vdF9pbWFnZSwgJmVwYS0+c2VjcHRyb2Zmc2V0KTsKKyAgICBucHRycyA9IGdldF8xNl9zbCgmZXBhLT5zZWNwdHJjbnQpOworCisjaWYgMAorICAgIGlmIChuc2VjdCA+IG5wdHJzKSB7CisJLyogTm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yIGluIHRoaXMgY2FzZSwgYnV0IGEgZ2VuZXJhbCBwcm9ibGVtICovCisJZnByaW50ZihzdGRlcnIsICJJbnN1ZmZpY2llbnQgZXh0ZW50IHNwYWNlLCBidWlsZCBlcnJvciFcbiIpOworCWV4aXQoMSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiAtMSBmb3IgdGhlIHBvaW50ZXIgaW4gdGhlIGJvb3Qgc2VjdG9yLCAtMiBmb3IgdGhlIHR3byBBRFZzICovCisgICAgZ2VuZXJhdGVfZXh0ZW50cyhleCwgbnB0cnMsIHNlY3RwLCBuc2VjdC0xLTIpOworCisgICAgLyogQURWIHBvaW50ZXJzICovCisgICAgYWR2cHRycyA9IHNscHRyKGJvb3RfaW1hZ2UsICZlcGEtPmFkdnB0cm9mZnNldCk7CisgICAgc2V0XzY0X3NsKCZhZHZwdHJzWzBdLCBzZWN0cFtuc2VjdC0xLTJdKTsKKyAgICBzZXRfNjRfc2woJmFkdnB0cnNbMV0sIHNlY3RwW25zZWN0LTEtMV0pOworCisgICAgLyogUG9rZSBpbiB0aGUgYmFzZSBkaXJlY3RvcnkgcGF0aCAqLworICAgIGlmIChzdWJkaXIpIHsKKwlpbnQgc3VibGVuID0gc3RybGVuKHN1YmRpcikgKyAxOworCWlmIChnZXRfMTZfc2woJmVwYS0+ZGlybGVuKSA8IHN1YmxlbikgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIlN1YmRpcmVjdG9yeSBwYXRoIHRvbyBsb25nLi4uIGFib3J0aW5nIGluc3RhbGwhXG4iKTsKKwkgICAgZXhpdCgxKTsKKwl9CisJbWVtY3B5X3RvX3NsKHNscHRyKGJvb3RfaW1hZ2UsICZlcGEtPmRpcm9mZnNldCksIHN1YmRpciwgc3VibGVuKTsKKyAgICB9CisKKyAgICAvKiBQb2tlIGluIHRoZSBzdWJ2b2x1bWUgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoc3Vidm9sKSB7CisJaW50IHN1YmxlbiA9IHN0cmxlbihzdWJ2b2wpICsgMTsKKwlpZiAoZ2V0XzE2X3NsKCZlcGEtPnN1YnZvbGxlbikgPCBzdWJsZW4pIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJTdWJ2b2wgbmFtZSB0b28gbG9uZy4uLiBhYm9ydGluZyBpbnN0YWxsIVxuIik7CisJICAgIGV4aXQoMSk7CisJfQorCW1lbWNweV90b19zbChzbHB0cihib290X2ltYWdlLCAmZXBhLT5zdWJ2b2xvZmZzZXQpLCBzdWJ2b2wsIHN1Ymxlbik7CisgICAgfQorCisgICAgLyogTm93IHByb2R1Y2UgYSBjaGVja3N1bSAqLworICAgIHNldF8zMl9zbCgmcGF0Y2hhcmVhLT5jaGVja3N1bSwgMCk7CisKKyAgICBjc3VtID0gTERMSU5VWF9NQUdJQzsKKyAgICBmb3IgKGkgPSAwLCB3cCA9IChjb25zdCB1aW50MzJfdCBfc2xpbWcgKilib290X2ltYWdlOyBpIDwgZHc7IGkrKywgd3ArKykKKwljc3VtIC09IGdldF8zMl9zbCh3cCk7CS8qIE5lZ2F0aXZlIGNoZWNrc3VtICovCisKKyAgICBzZXRfMzJfc2woJnBhdGNoYXJlYS0+Y2hlY2tzdW0sIGNzdW0pOworCisgICAgLyoKKyAgICAgKiBBc3N1bWUgYWxsIGJ5dGVzIG1vZGlmaWVkLiAgVGhpcyBjYW4gYmUgb3B0aW1pemVkIGF0IHRoZSBleHBlbnNlCisgICAgICogb2Yga2VlcGluZyB0cmFjayBvZiB3aGF0IHRoZSBoaWdoZXN0IG1vZGlmaWVkIGFkZHJlc3MgZXZlciB3YXMuCisgICAgICovCisgICAgcmV0dXJuIGR3IDw8IDI7Cit9CmRpZmYgLS1naXQgYS9saWJpbnN0YWxsZXIvc3lzbHhvcHQuYyBiL2xpYmluc3RhbGxlci9zeXNseG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzU1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpbnN0YWxsZXIvc3lzbHhvcHQuYwpAQCAtMCwwICsxLDI3NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycC4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5c2x4b3B0LmMKKyAqCisgKiBwYXJzZSBjbWRsaW5lIGZvciBleHRsaW51eCBhbmQgc3lzbGludXggaW5zdGFsbGVyCisgKgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzeXNleGl0cy5oPgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJzeXNseGNvbS5oIgorI2luY2x1ZGUgInN5c2x4ZnMuaCIKKyNpbmNsdWRlICJzeXNseG9wdC5oIgorCisvKiBUaGVzZSBhcmUgdGhlIG9wdGlvbnMgd2UgY2FuIHNldCB0aGVpciB2YWx1ZXMgKi8KK3N0cnVjdCBzeXNfb3B0aW9ucyBvcHQgPSB7CisgICAgLnNlY3RvcnMgPSAwLAorICAgIC5oZWFkcyA9IDAsCisgICAgLnJhaWRfbW9kZSA9IDAsCisgICAgLnN0dXBpZF9tb2RlID0gMCwKKyAgICAucmVzZXRfYWR2ID0gMCwKKyAgICAuc2V0X29uY2UgPSBOVUxMLAorICAgIC51cGRhdGVfb25seSA9IC0xLAorICAgIC5kaXJlY3RvcnkgPSBOVUxMLAorICAgIC5kZXZpY2UgPSBOVUxMLAorICAgIC5vZmZzZXQgPSAwLAorICAgIC5tZW51X3NhdmUgPSBOVUxMLAorICAgIC5pbnN0YWxsX21iciA9IDAsCisgICAgLmFjdGl2YXRlX3BhcnRpdGlvbiA9IDAsCisgICAgLmZvcmNlID0gMCwKKyAgICAuYm9vdHNlY2ZpbGUgPSBOVUxMLAorfTsKKworY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKyAgICB7ImZvcmNlIiwgMCwgTlVMTCwgJ2YnfSwJLyogRE9TL1dpbjMyL210b29scyBvbmx5ICovCisgICAgeyJpbnN0YWxsIiwgMCwgTlVMTCwgJ2knfSwKKyAgICB7ImRpcmVjdG9yeSIsIDEsIE5VTEwsICdkJ30sCisgICAgeyJvZmZzZXQiLCAxLCBOVUxMLCAndCd9LAorICAgIHsidXBkYXRlIiwgMCwgTlVMTCwgJ1UnfSwKKyAgICB7InppcGRyaXZlIiwgMCwgTlVMTCwgJ3onfSwKKyAgICB7InNlY3RvcnMiLCAxLCBOVUxMLCAnUyd9LAorICAgIHsic3R1cGlkIiwgMCwgTlVMTCwgJ3MnfSwKKyAgICB7ImhlYWRzIiwgMSwgTlVMTCwgJ0gnfSwKKyAgICB7InJhaWQtbW9kZSIsIDAsIE5VTEwsICdyJ30sCisgICAgeyJ2ZXJzaW9uIiwgMCwgTlVMTCwgJ3YnfSwKKyAgICB7ImhlbHAiLCAwLCBOVUxMLCAnaCd9LAorICAgIHsib25jZSIsIDEsIE5VTEwsIE9QVF9PTkNFfSwKKyAgICB7ImNsZWFyLW9uY2UiLCAwLCBOVUxMLCAnTyd9LAorICAgIHsicmVzZXQtYWR2IiwgMCwgTlVMTCwgT1BUX1JFU0VUX0FEVn0sCisgICAgeyJtZW51LXNhdmUiLCAxLCBOVUxMLCAnTSd9LAorICAgIHsibWJyIiwgMCwgTlVMTCwgJ20nfSwJLyogRE9TL1dpbjMyIG9ubHkgKi8KKyAgICB7ImFjdGl2ZSIsIDAsIE5VTEwsICdhJ30sCS8qIERPUy9XaW4zMiBvbmx5ICovCisgICAgeyJkZXZpY2UiLCAxLCBOVUxMLCBPUFRfREVWSUNFfSwKKyAgICB7TlVMTCwgMCwgTlVMTCwgMH0KK307CisKK2NvbnN0IGNoYXIgc2hvcnRfb3B0aW9uc1tdID0gInQ6ZmlkOlV1enNTOkg6cnZobzpPTTptYSI7CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkgdXNhZ2UoaW50IHJ2LCBlbnVtIHN5c2xpbnV4X21vZGUgbW9kZSkKK3sKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIE1PREVfU1lTTElOVVg6CisJLyogRm9yIHVubW91bnRlZCBmcyBpbnN0YWxsYXRpb24gKHN5c2xpbnV4KSAqLworCWZwcmludGYoc3RkZXJyLAorCSAgICAiVXNhZ2U6ICVzIFtvcHRpb25zXSBkZXZpY2VcbiIKKwkgICAgIiAgLS1vZmZzZXQgICAgIC10ICBPZmZzZXQgb2YgdGhlIGZpbGUgc3lzdGVtIG9uIHRoZSBkZXZpY2UgXG4iCisJICAgICIgIC0tZGlyZWN0b3J5ICAtZCAgRGlyZWN0b3J5IGZvciBpbnN0YWxsYXRpb24gdGFyZ2V0XG4iLAorCSAgICBwcm9ncmFtKTsKKwlicmVhazsKKworICAgIGNhc2UgTU9ERV9FWFRMSU5VWDoKKwkvKiBNb3VudGVkIGZzIGluc3RhbGxhdGlvbiAoZXh0bGludXgpICovCisJLyogQWN0dWFsbHkgZXh0bGludXggY2FuIGFsc28gdXNlIC1kIHRvIHByb3ZpZGUgYSBkaXJlY3RvcnkgdG9vLi4uICovCisJZnByaW50ZihzdGRlcnIsCisJICAgICJVc2FnZTogJXMgW29wdGlvbnNdIGRpcmVjdG9yeVxuIgorCSAgICAiICAtLWRldmljZSAgICAgICAgIEZvcmNlIHVzZSBvZiBhIHNwZWNpZmljIGJsb2NrIGRldmljZSAoZXhwZXJ0cyBvbmx5KVxuIiwKKwkgICAgcHJvZ3JhbSk7CisJYnJlYWs7CisKKyAgICBjYXNlIE1PREVfU1lTTElOVVhfRE9TV0lOOgorCS8qIEZvciBmcyBpbnN0YWxsYXRpb24gdW5kZXIgV2luZG93cyAoc3lzbGludXguZXhlKSAqLworCWZwcmludGYoc3RkZXJyLAorCSAgICAiVXNhZ2U6ICVzIFtvcHRpb25zXSA8ZHJpdmU+OiBbYm9vdHNlY2ZpbGVdXG4iCisJICAgICIgIC0tZGlyZWN0b3J5ICAtZCAgRGlyZWN0b3J5IGZvciBpbnN0YWxsYXRpb24gdGFyZ2V0XG4iLAorCSAgICBwcm9ncmFtKTsKKwlicmVhazsKKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwKKwkgICAgIiAgLS1pbnN0YWxsICAgIC1pICBJbnN0YWxsIG92ZXIgdGhlIGN1cnJlbnQgYm9vdHNlY3RvclxuIgorCSAgICAiICAtLXVwZGF0ZSAgICAgLVUgIFVwZGF0ZSBhIHByZXZpb3VzIGluc3RhbGxhdGlvblxuIgorCSAgICAiICAtLXppcCAgICAgICAgLXogIEZvcmNlIHppcGRyaXZlIGdlb21ldHJ5ICgtSCA2NCAtUyAzMilcbiIKKwkgICAgIiAgLS1zZWN0b3JzPSMgIC1TICBGb3JjZSB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgcGVyIHRyYWNrXG4iCisJICAgICIgIC0taGVhZHM9IyAgICAtSCAgRm9yY2UgbnVtYmVyIG9mIGhlYWRzXG4iCisJICAgICIgIC0tc3R1cGlkICAgICAtcyAgU2xvdywgc2FmZSBhbmQgc3R1cGlkIG1vZGVcbiIKKwkgICAgIiAgLS1yYWlkICAgICAgIC1yICBGYWxsIGJhY2sgdG8gdGhlIG5leHQgZGV2aWNlIG9uIGJvb3QgZmFpbHVyZVxuIgorCSAgICAiICAtLW9uY2U9Li4uICAgJXMgIEV4ZWN1dGUgYSBjb21tYW5kIG9uY2UgdXBvbiBib290XG4iCisJICAgICIgIC0tY2xlYXItb25jZSAtTyAgQ2xlYXIgdGhlIGJvb3Qtb25jZSBjb21tYW5kXG4iCisJICAgICIgIC0tcmVzZXQtYWR2ICAgICAgUmVzZXQgYXV4aWxsaWFyeSBkYXRhXG4iLAorCSAgICBtb2RlID09IE1PREVfU1lTTElOVVggID8gIiAgIiA6ICItbyIpOworICAgIC8qCisgICAgICogSGF2ZSB0byBjaG9wIHRoaXMgcm91Z2hseSBpbiBoYWxmIGZvciB0aGUgRE9TIGluc3RhbGxlciBkdWUKKyAgICAgKiB0byBsaW1pdGVkIG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAqLworICAgIGZwcmludGYoc3RkZXJyLAorCSAgICAiICAtLW1lbnUtc2F2ZT0gLU0gIFNldCB0aGUgbGFiZWwgdG8gc2VsZWN0IGFzIGRlZmF1bHQgb24gdGhlIG5leHQgYm9vdFxuIik7CisgICAgaWYgKG1vZGUgPT0gTU9ERV9TWVNMSU5VWF9ET1NXSU4pCisJZnByaW50ZihzdGRlcnIsCisJCSIgIC0tbWJyICAgICAgICAtbSAgSW5zdGFsbCBhbiBNQlJcbiIKKwkJIiAgLS1hY3RpdmUgICAgIC1hICBNYXJrIHBhcnRpdGlvbiBhcyBhY3RpdmVcbiIpOworCisgICAgaWYgKG1vZGUgPT0gTU9ERV9TWVNMSU5VWF9ET1NXSU4gfHwgbW9kZSA9PSBNT0RFX1NZU0xJTlVYKQorCWZwcmludGYoc3RkZXJyLAorCQkiICAtLWZvcmNlICAgICAgLWYgIElnbm9yZSBwcmVjYXV0aW9uc1xuIik7CisKKyAgICBleGl0KHJ2KTsKK30KKwordm9pZCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjaGFyICphcmd2W10sIGVudW0gc3lzbGludXhfbW9kZSBtb2RlKQoreworICAgIGludCBvOworCisgICAgcHJvZ3JhbSA9IGFyZ3ZbMF07CisgICAgd2hpbGUgKChvID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgc2hvcnRfb3B0aW9ucywKKwkJCSAgICBsb25nX29wdGlvbnMsIE5VTEwpKSAhPSBFT0YpIHsKKwlzd2l0Y2ggKG8pIHsKKwljYXNlICdmJzoKKwkgICAgb3B0LmZvcmNlID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSAneic6CisJICAgIG9wdC5oZWFkcyA9IDY0OworCSAgICBvcHQuc2VjdG9ycyA9IDMyOworCSAgICBicmVhazsKKwljYXNlICdTJzoKKwkgICAgb3B0LnNlY3RvcnMgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7CisJICAgIGlmIChvcHQuc2VjdG9ycyA8IDEgfHwgb3B0LnNlY3RvcnMgPiA2MykgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSIlczogaW52YWxpZCBudW1iZXIgb2Ygc2VjdG9yczogJXUgKG11c3QgYmUgMS02MylcbiIsCisJCQlwcm9ncmFtLCBvcHQuc2VjdG9ycyk7CisJCWV4aXQoRVhfVVNBR0UpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgJ0gnOgorCSAgICBvcHQuaGVhZHMgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7CisJICAgIGlmIChvcHQuaGVhZHMgPCAxIHx8IG9wdC5oZWFkcyA+IDI1NikgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSIlczogaW52YWxpZCBudW1iZXIgb2YgaGVhZHM6ICV1IChtdXN0IGJlIDEtMjU2KVxuIiwKKwkJCXByb2dyYW0sIG9wdC5oZWFkcyk7CisJCWV4aXQoRVhfVVNBR0UpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgJ3InOgorCSAgICBvcHQucmFpZF9tb2RlID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSAncyc6CisJICAgIG9wdC5zdHVwaWRfbW9kZSA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgJ2knOgorCSAgICBvcHQudXBkYXRlX29ubHkgPSAwOworCSAgICBicmVhazsKKwljYXNlICd1JzoKKwljYXNlICdVJzoKKwkgICAgb3B0LnVwZGF0ZV9vbmx5ID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSAnaCc6CisJICAgIHVzYWdlKDAsIG1vZGUpOworCSAgICBicmVhazsKKwljYXNlICdvJzoKKwkgICAgaWYgKG1vZGUgPT0gTU9ERV9TWVNMSU5VWCkgeworCQlmcHJpbnRmKHN0ZGVyciwJIiVzOiAtbyB3aWxsIGNoYW5nZSBtZWFuaW5nIGluIGEgZnV0dXJlIHZlcnNpb24sIHVzZSAtdCBvciAtLW9mZnNldFxuIiwgcHJvZ3JhbSk7CisJCWdvdG8gb3B0X29mZnNldDsKKwkgICAgfQorCSAgICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgT1BUX09OQ0U6CisJICAgIG9wdC5zZXRfb25jZSA9IG9wdGFyZzsKKwkgICAgYnJlYWs7CisJY2FzZSAndCc6CisJb3B0X29mZnNldDoKKwkgICAgb3B0Lm9mZnNldCA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnTyc6CisJICAgIG9wdC5zZXRfb25jZSA9ICIiOworCSAgICBicmVhazsKKwljYXNlICdkJzoKKwkgICAgb3B0LmRpcmVjdG9yeSA9IG9wdGFyZzsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfUkVTRVRfQURWOgorCSAgICBvcHQucmVzZXRfYWR2ID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSAnTSc6CisJICAgIG9wdC5tZW51X3NhdmUgPSBvcHRhcmc7CisJICAgIGJyZWFrOworCWNhc2UgJ20nOgorCSAgICBvcHQuaW5zdGFsbF9tYnIgPSAxOworCSAgICBicmVhazsKKwljYXNlICdhJzoKKwkgICAgb3B0LmFjdGl2YXRlX3BhcnRpdGlvbiA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX0RFVklDRToKKwkgICAgaWYgKG1vZGUgIT0gTU9ERV9FWFRMSU5VWCkKKwkJdXNhZ2UoRVhfVVNBR0UsIG1vZGUpOworCSAgICBvcHQuZGV2aWNlID0gb3B0YXJnOworCSAgICBicmVhazsKKwljYXNlICd2JzoKKwkgICAgZnByaW50ZihzdGRlcnIsCisJCSAgICAiJXMgIiBWRVJTSU9OX1NUUiAiICBDb3B5cmlnaHQgMTk5NC0iIFlFQVJfU1RSCisJCSAgICAiIEguIFBldGVyIEFudmluIGV0IGFsXG4iLCBwcm9ncmFtKTsKKwkgICAgZXhpdCgwKTsKKwlkZWZhdWx0OgorCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBVbmtub3duIG9wdGlvbjogLSVjXG4iLCBwcm9ncmFtLCBvcHRvcHQpOworCSAgICB1c2FnZShFWF9VU0FHRSwgbW9kZSk7CisJfQorICAgIH0KKworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgTU9ERV9TWVNMSU5VWDoKKyAgICBjYXNlIE1PREVfU1lTTElOVVhfRE9TV0lOOgorCW9wdC5kZXZpY2UgPSBhcmd2W29wdGluZCsrXTsKKwlicmVhazsKKyAgICBjYXNlIE1PREVfRVhUTElOVVg6CisJaWYgKCFvcHQuZGlyZWN0b3J5KQorCSAgICBvcHQuZGlyZWN0b3J5ID0gYXJndltvcHRpbmQrK107CisJYnJlYWs7CisgICAgfQorCisgICAgaWYgKGFyZ3Zbb3B0aW5kXSAmJiAobW9kZSA9PSBNT0RFX1NZU0xJTlVYX0RPU1dJTikpCisJLyogQWxsb3cgZm9yIHRoZSBib290LXNlY3RvciBhcmd1bWVudCAqLworCW9wdC5ib290c2VjZmlsZSA9IGFyZ3Zbb3B0aW5kKytdOworICAgIGlmIChhcmd2W29wdGluZF0pCisJdXNhZ2UoRVhfVVNBR0UsIG1vZGUpOwkvKiBFeGNlc3MgYXJndW1lbnRzICovCit9CisKKy8qCisgKiBNYWtlIGFueSB1c2VyLXNwZWNpZmllZCBBRFYgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkKKyAqLworaW50IG1vZGlmeV9hZHYodm9pZCkKK3sKKyAgICBpbnQgcnYgPSAwOworCisgICAgaWYgKG9wdC5yZXNldF9hZHYpCisJc3lzbGludXhfcmVzZXRfYWR2KHN5c2xpbnV4X2Fkdik7CisKKyAgICBpZiAob3B0LnNldF9vbmNlKSB7CisJaWYgKHN5c2xpbnV4X3NldGFkdihBRFZfQk9PVE9OQ0UsIHN0cmxlbihvcHQuc2V0X29uY2UpLCBvcHQuc2V0X29uY2UpKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG5vdCBlbm91Z2ggc3BhY2UgZm9yIGJvb3Qtb25jZSBjb21tYW5kXG4iLAorCQkgICAgcHJvZ3JhbSk7CisJICAgIHJ2ID0gLTE7CisJfQorICAgIH0KKyAgICBpZiAob3B0Lm1lbnVfc2F2ZSkgeworICAgICAgICBpZiAoc3lzbGludXhfc2V0YWR2KEFEVl9NRU5VU0FWRSwgc3RybGVuKG9wdC5tZW51X3NhdmUpLCBvcHQubWVudV9zYXZlKSkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBub3QgZW5vdWdoIHNwYWNlIGZvciBtZW51LXNhdmUgbGFiZWxcbiIsCisJCSAgICBwcm9ncmFtKTsKKwkgICAgcnYgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL2xpYmluc3RhbGxlci9zeXNseG9wdC5oIGIvbGliaW5zdGFsbGVyL3N5c2x4b3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyMzAxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmluc3RhbGxlci9zeXNseG9wdC5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX0hfU1lTTFhPUFRfCisjZGVmaW5lIF9IX1NZU0xYT1BUXworCisvKiBUaGVzZSBhcmUgdGhlIG9wdGlvbnMgd2UgY2FuIHNldCBhbmQgdGhlaXIgdmFsdWVzICovCitzdHJ1Y3Qgc3lzX29wdGlvbnMgeworICAgIHVuc2lnbmVkIGludCBzZWN0b3JzOworICAgIHVuc2lnbmVkIGludCBoZWFkczsKKyAgICBpbnQgcmFpZF9tb2RlOworICAgIGludCBzdHVwaWRfbW9kZTsKKyAgICBpbnQgcmVzZXRfYWR2OworICAgIGNvbnN0IGNoYXIgKnNldF9vbmNlOworICAgIGludCB1cGRhdGVfb25seTsKKyAgICBjb25zdCBjaGFyICpkaXJlY3Rvcnk7CisgICAgY29uc3QgY2hhciAqZGV2aWNlOworICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgICAgY29uc3QgY2hhciAqbWVudV9zYXZlOworICAgIGludCBmb3JjZTsKKyAgICBpbnQgaW5zdGFsbF9tYnI7CisgICAgaW50IGFjdGl2YXRlX3BhcnRpdGlvbjsKKyAgICBjb25zdCBjaGFyICpib290c2VjZmlsZTsKK307CisKK2VudW0gbG9uZ19vbmx5X29wdCB7CisgICAgT1BUX05PTkUsCisgICAgT1BUX1JFU0VUX0FEViwKKyAgICBPUFRfT05DRSwKKyAgICBPUFRfREVWSUNFLAorfTsKKworZW51bSBzeXNsaW51eF9tb2RlIHsKKyAgICBNT0RFX1NZU0xJTlVYLAkJLyogVW5tb3VudGVkIGZpbGVzeXN0ZW0gKi8KKyAgICBNT0RFX0VYVExJTlVYLAorICAgIE1PREVfU1lTTElOVVhfRE9TV0lOLAorfTsKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKSB1c2FnZShpbnQgcnYsIGVudW0gc3lzbGludXhfbW9kZSBtb2RlKTsKK3ZvaWQgcGFyc2Vfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqYXJndltdLCBlbnVtIHN5c2xpbnV4X21vZGUgbW9kZSk7CitpbnQgbW9kaWZ5X2Fkdih2b2lkKTsKKworZXh0ZXJuIHN0cnVjdCBzeXNfb3B0aW9ucyBvcHQ7CitleHRlcm4gY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXTsKK2V4dGVybiBjb25zdCBjaGFyIHNob3J0X29wdGlvbnNbXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC9NYWtlZmlsZSBiL2xpbnV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNjY3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC9NYWtlZmlsZQpAQCAtMCwwICsxLDY5IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyMgTGludXggRkFUL05URlMgaW5zdGFsbGVyCisjIworCitpbmNsdWRlICQoTUFLRURJUikvc3lzbGludXgubWsKKworT1BURkxBR1MgPSAtZyAtT3MKK0lOQ0xVREVTID0gLUkkKFNSQykgLUkkKG9iamRpcikgLUkkKFNSQykvLi4vbGliaW5zdGFsbGVyCitDRkxBR1MJID0gJChHQ0NXQVJOKSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0ICQoT1BURkxBR1MpICQoSU5DTFVERVMpCitMREZMQUdTCSA9IAorCitTUkNTICAgICA9IHN5c2xpbnV4LmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9zeXNseG9wdC5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvc3lzbHhjb20uYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL3NldGFkdi5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvYWR2aW8uYyBcCisgICAgICAgICAgIC4uL2xpYmluc3RhbGxlci9mcy5jIFwKKyAgICAgICAgICAgLi4vbGliaW5zdGFsbGVyL3N5c2x4bW9kLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9ib290c2VjdF9iaW4uYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL2xkbGludXhjMzJfYmluLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9sZGxpbnV4X2Jpbi5jCitPQkpTCSA9ICQocGF0c3Vic3QgJS5jLCUubywkKG5vdGRpciAkKFNSQ1MpKSkKKworLlNVRkZJWEVTOiAuYyAubyAuaSAucyAuUworCitWUEFUSCA9ICQoU1JDKTokKFNSQykvLi4vbGliaW5zdGFsbGVyOiQoT0JKKS8uLi9saWJpbnN0YWxsZXIKKworYWxsOiBpbnN0YWxsZXIKKwordGlkeSBkaXN0OgorCS1ybSAtZiAqLm8gKi5pICoucyAqLmEgLiouZCAqLnRtcAorCitjbGVhbjogdGlkeQorCS1ybSAtZiBzeXNsaW51eCBzeXNsaW51eC1ub210b29scworCitzcG90bGVzczogY2xlYW4KKwktcm0gLWYgKn4KKworaW5zdGFsbGVyOiBzeXNsaW51eCBzeXNsaW51eC1ub210b29scworCitzeXNsaW51eDogJChPQkpTKQorCSQoQ0MpICQoTERGTEFHUykgLW8gJEAgJF4KKworc3lzbGludXgtbm9tdG9vbHM6IHN5c2xpbnV4CisJbG4gLWYgJDwgJEAKKworc3RyaXA6CisJJChTVFJJUCkgc3lzbGludXggc3lzbGludXgtbm9tdG9vbHMKKworJS5vOiAlLmMKKwkkKENDKSAkKFVNQUtFREVQUykgJChDRkxBR1MpIC1jIC1vICRAICQ8CislLmk6ICUuYworCSQoQ0MpICQoVU1BS0VERVBTKSAkKENGTEFHUykgLUUgLW8gJEAgJDwKKyUuczogJS5jCisJJChDQykgJChVTUFLRURFUFMpICQoQ0ZMQUdTKSAtUyAtbyAkQCAkPAorCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS9saW51eC9zeXNsaW51eC5jIGIvbGludXgvc3lzbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MTJkZTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgvc3lzbGludXguYwpAQCAtMCwwICsxLDUzNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDE5OTgtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC5jIC0gTGludXggaW5zdGFsbGVyIHByb2dyYW0gZm9yIFNZU0xJTlVYCisgKgorICogVGhpcyBpcyBMaW51eC1zcGVjaWZpYyBieSBub3cuCisgKgorICogVGhpcyBpcyBhbiBhbHRlcm5hdGUgdmVyc2lvbiBvZiB0aGUgaW5zdGFsbGVyIHdoaWNoIGRvZXNuJ3QgcmVxdWlyZQorICogbXRvb2xzLCBidXQgcmVxdWlyZXMgcm9vdCBwcml2aWxlZ2UuCisgKi8KKworLyoKKyAqIElmIERPX0RJUkVDVF9NT1VOVCBpcyAwLCBjYWxsIG1vdW50KDgpCisgKiBJZiBET19ESVJFQ1RfTU9VTlQgaXMgMSwgY2FsbCBtb3VudCgyKQorICovCisjaWZkZWYgX19LTElCQ19fCisjIGRlZmluZSBET19ESVJFQ1RfTU9VTlQgMQorI2Vsc2UKKyMgZGVmaW5lIERPX0RJUkVDVF9NT1VOVCAwCS8qIGdsaWJjIGhhcyBicm9rZW4gbG9zZXR1cCBpb2N0bHMgKi8KKyNlbmRpZgorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNTAwCS8qIEZvciBwcmVhZCgpIHB3cml0ZSgpICovCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHBhdGhzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKworI2luY2x1ZGUgImxpbnV4aW9jdGwuaCIKKworI2luY2x1ZGUgPHBhdGhzLmg+CisjaWZuZGVmIF9QQVRIX01PVU5UCisjIGRlZmluZSBfUEFUSF9NT1VOVCAiL2Jpbi9tb3VudCIKKyNlbmRpZgorI2lmbmRlZiBfUEFUSF9VTU9VTlQKKyMgZGVmaW5lIF9QQVRIX1VNT1VOVCAiL2Jpbi91bW91bnQiCisjZW5kaWYKKyNpZm5kZWYgX1BBVEhfVE1QCisjIGRlZmluZSBfUEFUSF9UTVAgIi90bXAvIgorI2VuZGlmCisKKyNpbmNsdWRlICJzeXNsaW51eC5oIgorCisjaWYgRE9fRElSRUNUX01PVU5UCisjIGluY2x1ZGUgPGxpbnV4L2xvb3AuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3lzZXhpdHMuaD4KKyNpbmNsdWRlICJzeXNseGNvbS5oIgorI2luY2x1ZGUgInN5c2x4ZnMuaCIKKyNpbmNsdWRlICJzZXRhZHYuaCIKKyNpbmNsdWRlICJzeXNseG9wdC5oIiAvKiB1bmlmaWVkIG9wdGlvbnMgKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgKnByb2dyYW07CS8qIE5hbWUgb2YgcHJvZ3JhbSAqLworCitwaWRfdCBteXBpZDsKK2NoYXIgKm1udHBhdGggPSBOVUxMOwkJLyogUGF0aCBvbiB3aGljaCB0byBtb3VudCAqLworCisjaWYgRE9fRElSRUNUX01PVU5UCitpbnQgbG9vcF9mZCA9IC0xOwkJLyogTG9vcCBkZXZpY2UgKi8KKyNlbmRpZgorCit2b2lkIF9fYXR0cmlidXRlX18gKChub3JldHVybikpIGRpZShjb25zdCBjaGFyICptc2cpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHByb2dyYW0sIG1zZyk7CisKKyNpZiBET19ESVJFQ1RfTU9VTlQKKyAgICBpZiAobG9vcF9mZCAhPSAtMSkgeworCWlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTsJLyogRnJlZSBsb29wIGRldmljZSAqLworCWNsb3NlKGxvb3BfZmQpOworCWxvb3BfZmQgPSAtMTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChtbnRwYXRoKQorCXVubGluayhtbnRwYXRoKTsKKworICAgIGV4aXQoMSk7Cit9CisKKy8qCisgKiBNb3VudCByb3V0aW5lCisgKi8KK2ludCBkb19tb3VudChpbnQgZGV2X2ZkLCBpbnQgKmNvb2tpZSwgY29uc3QgY2hhciAqbW50cGF0aCwgY29uc3QgY2hhciAqZnN0eXBlKQoreworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgKHZvaWQpY29va2llOworCisgICAgaWYgKGZzdGF0KGRldl9mZCwgJnN0KSA8IDApCisJcmV0dXJuIGVycm5vOworCisjaWYgRE9fRElSRUNUX01PVU5UCisgICAgeworCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkgeworCSAgICAvKiBJdCdzIGZpbGUsIG5lZWQgdG8gbW91bnQgaXQgbG9vcGJhY2sgKi8KKwkgICAgdW5zaWduZWQgaW50IG4gPSAwOworCSAgICBzdHJ1Y3QgbG9vcF9pbmZvNjQgbG9vcGluZm87CisJICAgIGludCBsb29wX2ZkOworCisJICAgIGZvciAobiA9IDA7IGxvb3BfZmQgPCAwOyBuKyspIHsKKwkJc25wcmludGYoZGV2ZmRuYW1lLCBzaXplb2YgZGV2ZmRuYW1lLCAiL2Rldi9sb29wJXUiLCBuKTsKKwkJbG9vcF9mZCA9IG9wZW4oZGV2ZmRuYW1lLCBPX1JEV1IpOworCQlpZiAobG9vcF9mZCA8IDAgJiYgZXJybm8gPT0gRU5PRU5UKSB7CisJCSAgICBkaWUoIm5vIGF2YWlsYWJsZSBsb29wYmFjayBkZXZpY2UhIik7CisJCX0KKwkJaWYgKGlvY3RsKGxvb3BfZmQsIExPT1BfU0VUX0ZELCAodm9pZCAqKWRldl9mZCkpIHsKKwkJICAgIGNsb3NlKGxvb3BfZmQpOworCQkgICAgbG9vcF9mZCA9IC0xOworCQkgICAgaWYgKGVycm5vICE9IEVCVVNZKQorCQkJZGllKCJjYW5ub3Qgc2V0IHVwIGxvb3BiYWNrIGRldmljZSIpOworCQkgICAgZWxzZQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaW9jdGwobG9vcF9mZCwgTE9PUF9HRVRfU1RBVFVTNjQsICZsb29waW5mbykgfHwKKwkJICAgIChsb29waW5mby5sb19vZmZzZXQgPSBvcHQub2Zmc2V0LAorCQkgICAgIGlvY3RsKGxvb3BfZmQsIExPT1BfU0VUX1NUQVRVUzY0LCAmbG9vcGluZm8pKSkKKwkJICAgIGRpZSgiY2Fubm90IHNldCB1cCBsb29wYmFjayBkZXZpY2UiKTsKKwkgICAgfQorCisJICAgICpjb29raWUgPSBsb29wX2ZkOworCX0gZWxzZSB7CisJICAgIHNucHJpbnRmKGRldmZkbmFtZSwgc2l6ZW9mIGRldmZkbmFtZSwgIi9wcm9jLyVsdS9mZC8lZCIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpbXlwaWQsIGRldl9mZCk7CisJICAgICpjb29raWUgPSAtMTsKKwl9CisKKwlyZXR1cm4gbW91bnQoZGV2ZmRuYW1lLCBtbnRwYXRoLCBmc3R5cGUsCisJCSAgICAgTVNfTk9FWEVDIHwgTVNfTk9TVUlELCAidW1hc2s9MDc3LHF1aWV0Iik7CisgICAgfQorI2Vsc2UKKyAgICB7CisJY2hhciBkZXZmZG5hbWVbMTI4XSwgbW50X29wdHNbMTI4XTsKKwlwaWRfdCBmLCB3OworCWludCBzdGF0dXM7CisKKwlzbnByaW50ZihkZXZmZG5hbWUsIHNpemVvZiBkZXZmZG5hbWUsICIvcHJvYy8lbHUvZmQvJWQiLAorCQkgKHVuc2lnbmVkIGxvbmcpbXlwaWQsIGRldl9mZCk7CisKKwlmID0gZm9yaygpOworCWlmIChmIDwgMCkgeworCSAgICByZXR1cm4gLTE7CisJfSBlbHNlIGlmIChmID09IDApIHsKKwkgICAgaWYgKCFTX0lTQkxLKHN0LnN0X21vZGUpKSB7CisJCXNucHJpbnRmKG1udF9vcHRzLCBzaXplb2YgbW50X29wdHMsCisJCQkgInJ3LG5vZGV2LG5vZXhlYyxsb29wLG9mZnNldD0lbGx1LHVtYXNrPTA3NyxxdWlldCIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylvcHQub2Zmc2V0KTsKKwkgICAgfSBlbHNlIHsKKwkJc25wcmludGYobW50X29wdHMsIHNpemVvZiBtbnRfb3B0cywKKwkJCSAicncsbm9kZXYsbm9leGVjLHVtYXNrPTA3NyxxdWlldCIpOworCSAgICB9CisJICAgIGV4ZWNsKF9QQVRIX01PVU5ULCBfUEFUSF9NT1VOVCwgIi10IiwgZnN0eXBlLCAiLW8iLCBtbnRfb3B0cywKKwkJICBkZXZmZG5hbWUsIG1udHBhdGgsIE5VTEwpOworCSAgICBfZXhpdCgyNTUpOwkJLyogZXhlY2wgZmFpbGVkICovCisJfQorCisJdyA9IHdhaXRwaWQoZiwgJnN0YXR1cywgMCk7CisJcmV0dXJuICh3ICE9IGYgfHwgc3RhdHVzKSA/IC0xIDogMDsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIHVtb3VudCByb3V0aW5lCisgKi8KK3ZvaWQgZG9fdW1vdW50KGNvbnN0IGNoYXIgKm1udHBhdGgsIGludCBjb29raWUpCit7CisjaWYgRE9fRElSRUNUX01PVU5UCisgICAgaW50IGxvb3BfZmQgPSBjb29raWU7CisKKyAgICBpZiAodW1vdW50MihtbnRwYXRoLCAwKSkKKwlkaWUoImNvdWxkIG5vdCB1bW91bnQgcGF0aCIpOworCisgICAgaWYgKGxvb3BfZmQgIT0gLTEpIHsKKwlpb2N0bChsb29wX2ZkLCBMT09QX0NMUl9GRCwgMCk7CS8qIEZyZWUgbG9vcCBkZXZpY2UgKi8KKwljbG9zZShsb29wX2ZkKTsKKwlsb29wX2ZkID0gLTE7CisgICAgfQorI2Vsc2UKKyAgICBwaWRfdCBmID0gZm9yaygpOworICAgIHBpZF90IHc7CisgICAgaW50IHN0YXR1czsKKyAgICAodm9pZCljb29raWU7CisKKyAgICBpZiAoZiA8IDApIHsKKwlwZXJyb3IoImZvcmsiKTsKKwlleGl0KDEpOworICAgIH0gZWxzZSBpZiAoZiA9PSAwKSB7CisJZXhlY2woX1BBVEhfVU1PVU5ULCBfUEFUSF9VTU9VTlQsIG1udHBhdGgsIE5VTEwpOworICAgIH0KKworICAgIHcgPSB3YWl0cGlkKGYsICZzdGF0dXMsIDApOworICAgIGlmICh3ICE9IGYgfHwgc3RhdHVzKSB7CisJZXhpdCgxKTsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIE1vZGlmeSB0aGUgQURWIG9mIGFuIGV4aXN0aW5nIGluc3RhbGxhdGlvbgorICovCitpbnQgbW9kaWZ5X2V4aXN0aW5nX2Fkdihjb25zdCBjaGFyICpwYXRoKQoreworICAgIGlmIChvcHQucmVzZXRfYWR2KQorCXN5c2xpbnV4X3Jlc2V0X2FkdihzeXNsaW51eF9hZHYpOworICAgIGVsc2UgaWYgKHJlYWRfYWR2KHBhdGgsICJsZGxpbnV4LnN5cyIpIDwgMCkKKwlyZXR1cm4gMTsKKworICAgIGlmIChtb2RpZnlfYWR2KCkgPCAwKQorCXJldHVybiAxOworCisgICAgaWYgKHdyaXRlX2FkdihwYXRoLCAibGRsaW51eC5zeXMiKSA8IDApCisJcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRvX29wZW5fZmlsZShjaGFyICpuYW1lKQoreworICAgIGludCBmZDsKKworICAgIGlmICgoZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZKSkgPj0gMCkgeworCXVpbnQzMl90IHplcm9fYXR0ciA9IDA7CisJaW9jdGwoZmQsIEZBVF9JT0NUTF9TRVRfQVRUUklCVVRFUywgJnplcm9fYXR0cik7CisJY2xvc2UoZmQpOworICAgIH0KKworICAgIHVubGluayhuYW1lKTsKKyAgICBmZCA9IG9wZW4obmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDQ0NCk7CisgICAgaWYgKGZkIDwgMCkKKwlwZXJyb3IobmFtZSk7CisKKyAgICByZXR1cm4gZmQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgc2VjdGJ1ZltTRUNUT1JfU0laRV07CisgICAgaW50IGRldl9mZCwgZmQ7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaW50IGVyciA9IDA7CisgICAgY2hhciBtbnRuYW1lWzEyOF07CisgICAgY2hhciAqbGRsaW51eF9uYW1lOworICAgIGNoYXIgKmxkbGludXhfcGF0aDsKKyAgICBjaGFyICpzdWJkaXI7CisgICAgc2VjdG9yX3QgKnNlY3RvcnMgPSBOVUxMOworICAgIGludCBsZGxpbnV4X3NlY3RvcnMgPSAoYm9vdF9pbWFnZV9sZW4gKyBTRUNUT1JfU0laRSAtIDEpID4+IFNFQ1RPUl9TSElGVDsKKyAgICBjb25zdCBjaGFyICplcnJtc2c7CisgICAgaW50IG1udF9jb29raWU7CisgICAgaW50IHBhdGNoX3NlY3RvcnM7CisgICAgaW50IGksIHJ2OworCisgICAgbXlwaWQgPSBnZXRwaWQoKTsKKyAgICB1bWFzaygwNzcpOworICAgIHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgTU9ERV9TWVNMSU5VWCk7CisKKyAgICAvKiBOb3RlOiBzdWJkaXIgaXMgZ3VhcmFudGVlZCB0byBzdGFydCBhbmQgZW5kIGluIC8gKi8KKyAgICBpZiAob3B0LmRpcmVjdG9yeSAmJiBvcHQuZGlyZWN0b3J5WzBdKSB7CisJaW50IGxlbiA9IHN0cmxlbihvcHQuZGlyZWN0b3J5KTsKKwlpbnQgcnYgPSBhc3ByaW50Zigmc3ViZGlyLCAiJXMlcyVzIiwKKwkJCSAgb3B0LmRpcmVjdG9yeVswXSA9PSAnLycgPyAiIiA6ICIvIiwKKwkJCSAgb3B0LmRpcmVjdG9yeSwKKwkJCSAgb3B0LmRpcmVjdG9yeVtsZW4tMV0gPT0gJy8nID8gIiIgOiAiLyIpOworCWlmIChydiA8IDAgfHwgIXN1YmRpcikgeworCSAgICBwZXJyb3IocHJvZ3JhbSk7CisJICAgIGV4aXQoMSk7CisJfQorICAgIH0gZWxzZSB7CisJc3ViZGlyID0gIi8iOworICAgIH0KKworICAgIGlmICghb3B0LmRldmljZSB8fCBvcHQuaW5zdGFsbF9tYnIgfHwgb3B0LmFjdGl2YXRlX3BhcnRpdGlvbikKKwl1c2FnZShFWF9VU0FHRSwgTU9ERV9TWVNMSU5VWCk7CisKKyAgICAvKgorICAgICAqIEZpcnN0IG1ha2Ugc3VyZSB3ZSBjYW4gb3BlbiB0aGUgZGV2aWNlIGF0IGFsbCwgYW5kIHRoYXQgd2UgaGF2ZQorICAgICAqIHJlYWQvd3JpdGUgcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBkZXZfZmQgPSBvcGVuKG9wdC5kZXZpY2UsIE9fUkRXUik7CisgICAgaWYgKGRldl9mZCA8IDAgfHwgZnN0YXQoZGV2X2ZkLCAmc3QpIDwgMCkgeworCXBlcnJvcihvcHQuZGV2aWNlKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIGlmICghU19JU0JMSyhzdC5zdF9tb2RlKSAmJiAhU19JU1JFRyhzdC5zdF9tb2RlKSAmJiAhU19JU0NIUihzdC5zdF9tb2RlKSkgeworCWRpZSgibm90IGEgZGV2aWNlIG9yIHJlZ3VsYXIgZmlsZSIpOworICAgIH0KKworICAgIGlmIChvcHQub2Zmc2V0ICYmIFNfSVNCTEsoc3Quc3RfbW9kZSkpIHsKKwlkaWUoImNhbid0IGNvbWJpbmUgYW4gb2Zmc2V0IHdpdGggYSBibG9jayBkZXZpY2UiKTsKKyAgICB9CisKKyAgICB4cHJlYWQoZGV2X2ZkLCBzZWN0YnVmLCBTRUNUT1JfU0laRSwgb3B0Lm9mZnNldCk7CisgICAgZnN5bmMoZGV2X2ZkKTsKKworICAgIC8qCisgICAgICogQ2hlY2sgdG8gc2VlIHRoYXQgd2hhdCB3ZSBnb3Qgd2FzIGluZGVlZCBhbiBGQVQvTlRGUworICAgICAqIGJvb3Qgc2VjdG9yL3N1cGVyYmxvY2sKKyAgICAgKi8KKyAgICBpZiAoKGVycm1zZyA9IHN5c2xpbnV4X2NoZWNrX2Jvb3RzZWN0KHNlY3RidWYsICZmc190eXBlKSkpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgb3B0LmRldmljZSwgZXJybXNnKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qCisgICAgICogTm93IG1vdW50IHRoZSBkZXZpY2UuCisgICAgICovCisgICAgaWYgKGdldGV1aWQoKSkgeworCWRpZSgiVGhpcyBwcm9ncmFtIG5lZWRzIHJvb3QgcHJpdmlsZWdlIik7CisgICAgfSBlbHNlIHsKKwlpbnQgaSA9IDA7CisJc3RydWN0IHN0YXQgZHN0OworCWludCBydjsKKworCS8qIFdlJ3JlIHJvb3Qgb3IgYXQgbGVhc3Qgc2V0dWlkLgorCSAgIE1ha2UgYSB0ZW1wIGRpciBhbmQgcGFzcyBhbGwgdGhlIGd1bmt5IG9wdGlvbnMgdG8gbW91bnQuICovCisKKwlpZiAoY2hkaXIoX1BBVEhfVE1QKSkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBDYW5ub3QgYWNjZXNzIHRoZSAlcyBkaXJlY3RvcnkuXG4iLAorCQkgICAgcHJvZ3JhbSwgX1BBVEhfVE1QKTsKKwkgICAgZXhpdCgxKTsKKwl9CisjZGVmaW5lIFRNUF9NT0RFIChTX0lYVVNSfFNfSVdVU1J8U19JWEdSUHxTX0lXR1JQfFNfSVdPVEh8U19JWE9USHxTX0lTVlRYKQorCisJaWYgKHN0YXQoIi4iLCAmZHN0KSB8fCAhU19JU0RJUihkc3Quc3RfbW9kZSkgfHwKKwkgICAgKGRzdC5zdF9tb2RlICYgVE1QX01PREUpICE9IFRNUF9NT0RFKSB7CisJICAgIGRpZSgicG9zc2libHkgdW5zYWZlICIgX1BBVEhfVE1QICIgcGVybWlzc2lvbnMiKTsKKwl9CisKKwlmb3IgKGkgPSAwOzsgaSsrKSB7CisJICAgIHNucHJpbnRmKG1udG5hbWUsIHNpemVvZiBtbnRuYW1lLCAic3lzbGludXgubW50LiVsdS4lZCIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpbXlwaWQsIGkpOworCisJICAgIGlmIChsc3RhdChtbnRuYW1lLCAmZHN0KSAhPSAtMSB8fCBlcnJubyAhPSBFTk9FTlQpCisJCWNvbnRpbnVlOworCisJICAgIHJ2ID0gbWtkaXIobW50bmFtZSwgMDAwMCk7CisKKwkgICAgaWYgKHJ2ID09IC0xKSB7CisJCWlmIChlcnJubyA9PSBFRVhJU1QgfHwgZXJybm8gPT0gRUlOVFIpCisJCSAgICBjb250aW51ZTsKKwkJcGVycm9yKHByb2dyYW0pOworCQlleGl0KDEpOworCSAgICB9CisKKwkgICAgaWYgKGxzdGF0KG1udG5hbWUsICZkc3QpIHx8IGRzdC5zdF9tb2RlICE9IChTX0lGRElSIHwgMDAwMCkgfHwKKwkJZHN0LnN0X3VpZCAhPSAwKSB7CisJCWRpZSgic29tZW9uZSBpcyB0cnlpbmcgdG8gc3ltbGluayByYWNlIHVzISIpOworCSAgICB9CisJICAgIGJyZWFrOwkJLyogT0ssIGdvdCBzb21ldGhpbmcuLi4gKi8KKwl9CisKKwltbnRwYXRoID0gbW50bmFtZTsKKyAgICB9CisKKyAgICBpZiAoZnNfdHlwZSA9PSBWRkFUKSB7CisgICAgICAgIGlmIChkb19tb3VudChkZXZfZmQsICZtbnRfY29va2llLCBtbnRwYXRoLCAidmZhdCIpICYmCisgICAgICAgICAgICBkb19tb3VudChkZXZfZmQsICZtbnRfY29va2llLCBtbnRwYXRoLCAibXNkb3MiKSkgeworICAgICAgICAgICAgcm1kaXIobW50cGF0aCk7CisgICAgICAgICAgICBkaWUoImZhaWxlZCBvbiBtb3VudGluZyBmYXQgdm9sdW1lIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZzX3R5cGUgPT0gTlRGUykgeworICAgICAgICBpZiAoZG9fbW91bnQoZGV2X2ZkLCAmbW50X2Nvb2tpZSwgbW50cGF0aCwgIm50ZnMtM2ciKSkgeworICAgICAgICAgICAgcm1kaXIobW50cGF0aCk7CisgICAgICAgICAgICBkaWUoImZhaWxlZCBvbiBtb3VudGluZyBudGZzIHZvbHVtZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgbGRsaW51eF9wYXRoID0gYWxsb2NhKHN0cmxlbihtbnRwYXRoKSArIHN0cmxlbihzdWJkaXIpICsgMSk7CisgICAgc3ByaW50ZihsZGxpbnV4X3BhdGgsICIlcyVzIiwgbW50cGF0aCwgc3ViZGlyKTsKKworICAgIGxkbGludXhfbmFtZSA9IGFsbG9jYShzdHJsZW4obGRsaW51eF9wYXRoKSArIDE0KTsKKyAgICBpZiAoIWxkbGludXhfbmFtZSkgeworCXBlcnJvcihwcm9ncmFtKTsKKwllcnIgPSAxOworCWdvdG8gdW1vdW50OworICAgIH0KKyAgICBzcHJpbnRmKGxkbGludXhfbmFtZSwgIiVzbGRsaW51eC5zeXMiLCBsZGxpbnV4X3BhdGgpOworCisgICAgLyogdXBkYXRlIEFEViBvbmx5ID8gKi8KKyAgICBpZiAob3B0LnVwZGF0ZV9vbmx5ID09IC0xKSB7CisJaWYgKG9wdC5yZXNldF9hZHYgfHwgb3B0LnNldF9vbmNlKSB7CisJICAgIG1vZGlmeV9leGlzdGluZ19hZHYobGRsaW51eF9wYXRoKTsKKwkgICAgZG9fdW1vdW50KG1udHBhdGgsIG1udF9jb29raWUpOworCSAgICBzeW5jKCk7CisJICAgIHJtZGlyKG1udHBhdGgpOworCSAgICBleGl0KDApOworICAgIH0gZWxzZSBpZiAob3B0LnVwZGF0ZV9vbmx5ICYmICFzeXNsaW51eF9hbHJlYWR5X2luc3RhbGxlZChkZXZfZmQpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG5vIHByZXZpb3VzIHN5c2xpbnV4IGJvb3Qgc2VjdG9yIGZvdW5kXG4iLAorICAgICAgICAgICAgICAgIGFyZ3ZbMF0pOworICAgICAgICBleGl0KDEpOworCX0gZWxzZSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHBsZWFzZSBzcGVjaWZ5IC0taW5zdGFsbCBvciAtLXVwZGF0ZSBmb3IgdGhlIGZ1dHVyZVxuIiwgYXJndlswXSk7CisJICAgIG9wdC51cGRhdGVfb25seSA9IDA7CisJfQorICAgIH0KKworICAgIC8qIFJlYWQgYSBwcmUtZXhpc3RpbmcgQURWLCBpZiBhbHJlYWR5IGluc3RhbGxlZCAqLworICAgIGlmIChvcHQucmVzZXRfYWR2KQorCXN5c2xpbnV4X3Jlc2V0X2FkdihzeXNsaW51eF9hZHYpOworICAgIGVsc2UgaWYgKHJlYWRfYWR2KGxkbGludXhfcGF0aCwgImxkbGludXguc3lzIikgPCAwKQorCXN5c2xpbnV4X3Jlc2V0X2FkdihzeXNsaW51eF9hZHYpOworICAgIGlmIChtb2RpZnlfYWR2KCkgPCAwKQorCWV4aXQoMSk7CisKKyAgICBmZCA9IGRvX29wZW5fZmlsZShsZGxpbnV4X25hbWUpOworICAgIGlmIChmZCA8IDApIHsKKwllcnIgPSAxOworCWdvdG8gdW1vdW50OworICAgIH0KKworICAgIC8qIFdyaXRlIGl0IHRoZSBmaXJzdCB0aW1lICovCisgICAgaWYgKHhwd3JpdGUoZmQsIChjb25zdCBjaGFyIF9mb3JjZSAqKWJvb3RfaW1hZ2UsIGJvb3RfaW1hZ2VfbGVuLCAwKQorCSE9IChpbnQpYm9vdF9pbWFnZV9sZW4gfHwKKwl4cHdyaXRlKGZkLCBzeXNsaW51eF9hZHYsIDIgKiBBRFZfU0laRSwKKwkJYm9vdF9pbWFnZV9sZW4pICE9IDIgKiBBRFZfU0laRSkgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IHdyaXRlIGZhaWx1cmUgb24gJXNcbiIsIHByb2dyYW0sIGxkbGludXhfbmFtZSk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICBmc3luYyhmZCk7CisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGF0dHJpYnV0ZXMKKyAgICAgKi8KKyAgICB7CisJdWludDMyX3QgYXR0ciA9IDB4MDc7CS8qIEhpZGRlbitTeXN0ZW0rUmVhZG9ubHkgKi8KKwlpb2N0bChmZCwgRkFUX0lPQ1RMX1NFVF9BVFRSSUJVVEVTLCAmYXR0cik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDcmVhdGUgYSBibG9jayBtYXAuCisgICAgICovCisgICAgbGRsaW51eF9zZWN0b3JzICs9IDI7IC8qIDIgQURWIHNlY3RvcnMgKi8KKyAgICBzZWN0b3JzID0gY2FsbG9jKGxkbGludXhfc2VjdG9ycywgc2l6ZW9mICpzZWN0b3JzKTsKKyAgICBpZiAoc2VjdG1hcChmZCwgc2VjdG9ycywgbGRsaW51eF9zZWN0b3JzKSkgeworCXBlcnJvcigiYm1hcCIpOworCWV4aXQoMSk7CisgICAgfQorICAgIGNsb3NlKGZkKTsKKyAgICBzeW5jKCk7CisKKyAgICBzcHJpbnRmKGxkbGludXhfbmFtZSwgIiVzbGRsaW51eC5jMzIiLCBsZGxpbnV4X3BhdGgpOworICAgIGZkID0gZG9fb3Blbl9maWxlKGxkbGludXhfbmFtZSk7CisgICAgaWYgKGZkIDwgMCkgeworCWVyciA9IDE7CisJZ290byB1bW91bnQ7CisgICAgfQorCisgICAgcnYgPSB4cHdyaXRlKGZkLCAoY29uc3QgY2hhciBfZm9yY2UgKilzeXNsaW51eF9sZGxpbnV4YzMyLAorCQkgc3lzbGludXhfbGRsaW51eGMzMl9sZW4sIDApOworICAgIGlmIChydiAhPSAoaW50KXN5c2xpbnV4X2xkbGludXhjMzJfbGVuKSB7CisJZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZmFpbHVyZSBvbiAlc1xuIiwgcHJvZ3JhbSwgbGRsaW51eF9uYW1lKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIGZzeW5jKGZkKTsKKyAgICAvKgorICAgICAqIFNldCB0aGUgYXR0cmlidXRlcworICAgICAqLworICAgIHsKKwl1aW50MzJfdCBhdHRyID0gMHgwNzsJLyogSGlkZGVuK1N5c3RlbStSZWFkb25seSAqLworCWlvY3RsKGZkLCBGQVRfSU9DVExfU0VUX0FUVFJJQlVURVMsICZhdHRyKTsKKyAgICB9CisKKyAgICBjbG9zZShmZCk7CisgICAgc3luYygpOworCit1bW91bnQ6CisgICAgZG9fdW1vdW50KG1udHBhdGgsIG1udF9jb29raWUpOworICAgIHN5bmMoKTsKKyAgICBybWRpcihtbnRwYXRoKTsKKworICAgIGlmIChlcnIpCisJZXhpdChlcnIpOworCisgICAgLyoKKyAgICAgKiBQYXRjaCBsZGxpbnV4LnN5cyBhbmQgdGhlIGJvb3Qgc2VjdG9yCisgICAgICovCisgICAgaSA9IHN5c2xpbnV4X3BhdGNoKHNlY3RvcnMsIGxkbGludXhfc2VjdG9ycywgb3B0LnN0dXBpZF9tb2RlLAorCQkgICAgICAgb3B0LnJhaWRfbW9kZSwgc3ViZGlyLCBOVUxMKTsKKyAgICBwYXRjaF9zZWN0b3JzID0gKGkgKyBTRUNUT1JfU0laRSAtIDEpID4+IFNFQ1RPUl9TSElGVDsKKworICAgIC8qCisgICAgICogV3JpdGUgdGhlIG5vdy1wYXRjaGVkIGZpcnN0IHNlY3RvcnMgb2YgbGRsaW51eC5zeXMKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGF0Y2hfc2VjdG9yczsgaSsrKSB7CisJeHB3cml0ZShkZXZfZmQsCisJCShjb25zdCBjaGFyIF9mb3JjZSAqKWJvb3RfaW1hZ2UgKyBpICogU0VDVE9SX1NJWkUsCisJCVNFQ1RPUl9TSVpFLAorCQlvcHQub2Zmc2V0ICsgKChvZmZfdCkgc2VjdG9yc1tpXSA8PCBTRUNUT1JfU0hJRlQpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRvIGZpbmlzaCB1cCwgd3JpdGUgdGhlIGJvb3Qgc2VjdG9yCisgICAgICovCisKKyAgICAvKiBSZWFkIHRoZSBzdXBlcmJsb2NrIGFnYWluIHNpbmNlIGl0IG1pZ2h0IGhhdmUgY2hhbmdlZCB3aGlsZSBtb3VudGVkICovCisgICAgeHByZWFkKGRldl9mZCwgc2VjdGJ1ZiwgU0VDVE9SX1NJWkUsIG9wdC5vZmZzZXQpOworCisgICAgLyogQ29weSB0aGUgc3lzbGludXggY29kZSBpbnRvIHRoZSBib290IHNlY3RvciAqLworICAgIHN5c2xpbnV4X21ha2VfYm9vdHNlY3Qoc2VjdGJ1ZiwgZnNfdHlwZSk7CisKKyAgICAvKiBXcml0ZSBuZXcgYm9vdCBzZWN0b3IgKi8KKyAgICB4cHdyaXRlKGRldl9mZCwgc2VjdGJ1ZiwgU0VDVE9SX1NJWkUsIG9wdC5vZmZzZXQpOworCisgICAgY2xvc2UoZGV2X2ZkKTsKKyAgICBzeW5jKCk7CisKKyAgICAvKiBEb25lISAqLworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9sem8vTWFrZWZpbGUgYi9sem8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1ZDI5NgotLS0gL2Rldi9udWxsCisrKyBiL2x6by9NYWtlZmlsZQpAQCAtMCwwICsxLDQyIEBACisjIyAtKi0gbWFrZWZpbGUgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWUEFUSCA9ICQoU1JDKQoraW5jbHVkZSAkKE1BS0VESVIpL2J1aWxkLm1rCisKK0lOQ0xVREVTICs9IC1JJChTUkMpL2luY2x1ZGUKKworTElCT0JKUyA9ICQocGF0c3Vic3QgJS5jLCUubywkKHN1YnN0ICQoU1JDKS8sLCQod2lsZGNhcmQgJChTUkMpL3NyYy8qLmMpKSkKK0xJQiAgICAgPSBsem8uYQorQklOUyAgICA9IHByZXBjb3JlCisKK2FsbCA6IG1ha2VvdXRwdXRkaXJzICQoQklOUykKKworbWFrZW91dHB1dGRpcnM6CisJQG1rZGlyIC1wICQoT0JKKS9zcmMKKworJChMSUIpIDogJChMSUJPQkpTKQorCXJtIC1mICRACisJJChBUikgY3EgJEAgJF4KKwkkKFJBTkxJQikgJEAKKworcHJlcGNvcmUgOiBwcmVwY29yZS5vICQoTElCKQorCSQoQ0MpICQoTERGTEFHUykgLW8gJEAgJF4gJChMSUJTKQorCit0aWR5IGRpc3QgY2xlYW4gc3BvdGxlc3M6CisJcm0gLWYgJChCSU5TKQorCXJtIC1mICoubyAqLmEgLiouZAorCXJtIC1mICovKi5vICovKi5hICovLiouZAorCitpbnN0YWxsZXI6CisKKy1pbmNsdWRlIC4qLmQgKi8uKi5kCmRpZmYgLS1naXQgYS9sem8vZG9jL0xaTy5UWFQgYi9sem8vZG9jL0xaTy5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzYjVhYQotLS0gL2Rldi9udWxsCisrKyBiL2x6by9kb2MvTFpPLlRYVApAQCAtMCwwICsxLDI5MSBAQAorCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIExaTyAtLSBhIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyBBdXRob3IgIDogTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgICAgICAgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICAgICAgICAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyBWZXJzaW9uIDogMi4wNworIERhdGUgICAgOiAyNSBKdW4gMjAxNAorCisKKyBBYnN0cmFjdAorIC0tLS0tLS0tCisgTFpPIGlzIGEgcG9ydGFibGUgbG9zc2xlc3MgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5IHdyaXR0ZW4gaW4gQU5TSSBDLgorIEl0IG9mZmVycyBwcmV0dHkgZmFzdCBjb21wcmVzc2lvbiBhbmQgdmVyeSBmYXN0IGRlY29tcHJlc3Npb24uCisgRGVjb21wcmVzc2lvbiByZXF1aXJlcyBubyBtZW1vcnkuCisKKyBJbiBhZGRpdGlvbiB0aGVyZSBhcmUgc2xvd2VyIGNvbXByZXNzaW9uIGxldmVscyBhY2hpZXZpbmcgYSBxdWl0ZQorIGNvbXBldGl0aXZlIGNvbXByZXNzaW9uIHJhdGlvIHdoaWxlIHN0aWxsIGRlY29tcHJlc3NpbmcgYXQKKyB0aGlzIHZlcnkgaGlnaCBzcGVlZC4KKworIFRoZSBMWk8gYWxnb3JpdGhtcyBhbmQgaW1wbGVtZW50YXRpb25zIGFyZSBjb3B5cmlnaHRlZCBPcGVuU291cmNlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisKKyBJbnRyb2R1Y3Rpb24KKyAtLS0tLS0tLS0tLS0KKyBMWk8gaXMgYSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkgd2hpY2ggaXMgc3VpdGFibGUgZm9yIGRhdGEKKyBkZS0vY29tcHJlc3Npb24gaW4gcmVhbC10aW1lLiBUaGlzIG1lYW5zIGl0IGZhdm91cnMgc3BlZWQKKyBvdmVyIGNvbXByZXNzaW9uIHJhdGlvLgorCisgVGhlIGFjcm9ueW0gTFpPIGlzIHN0YW5kaW5nIGZvciBMZW1wZWwtWml2LU9iZXJodW1lci4KKworIExaTyBpcyB3cml0dGVuIGluIEFOU0kgQy4gQm90aCB0aGUgc291cmNlIGNvZGUgYW5kIHRoZSBjb21wcmVzc2VkCisgZGF0YSBmb3JtYXQgYXJlIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlIGFjcm9zcyBwbGF0Zm9ybXMuCisKKyBMWk8gaW1wbGVtZW50cyBhIG51bWJlciBvZiBhbGdvcml0aG1zIHdpdGggdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKworIC0gRGVjb21wcmVzc2lvbiBpcyBzaW1wbGUgYW5kICp2ZXJ5KiBmYXN0LgorIC0gUmVxdWlyZXMgbm8gbWVtb3J5IGZvciBkZWNvbXByZXNzaW9uLgorIC0gQ29tcHJlc3Npb24gaXMgcHJldHR5IGZhc3QuCisgLSBSZXF1aXJlcyA2NCBLaUIgb2YgbWVtb3J5IGZvciBjb21wcmVzc2lvbi4KKyAtIEFsbG93cyB5b3UgdG8gZGlhbCB1cCBleHRyYSBjb21wcmVzc2lvbiBhdCBhIHNwZWVkIGNvc3QgaW4gdGhlCisgICBjb21wcmVzc29yLiBUaGUgc3BlZWQgb2YgdGhlIGRlY29tcHJlc3NvciBpcyBub3QgcmVkdWNlZC4KKyAtIEluY2x1ZGVzIGNvbXByZXNzaW9uIGxldmVscyBmb3IgZ2VuZXJhdGluZyBwcmUtY29tcHJlc3NlZAorICAgZGF0YSB3aGljaCBhY2hpZXZlIGEgcXVpdGUgY29tcGV0aXRpdmUgY29tcHJlc3Npb24gcmF0aW8uCisgLSBUaGVyZSBpcyBhbHNvIGEgY29tcHJlc3Npb24gbGV2ZWwgd2hpY2ggbmVlZHMgb25seSA4IEtpQiBmb3IgY29tcHJlc3Npb24uCisgLSBBbGdvcml0aG0gaXMgdGhyZWFkIHNhZmUuCisgLSBBbGdvcml0aG0gaXMgbG9zc2xlc3MuCisKKyBMWk8gc3VwcG9ydHMgb3ZlcmxhcHBpbmcgY29tcHJlc3Npb24gYW5kIGluLXBsYWNlIGRlY29tcHJlc3Npb24uCisKKworIERlc2lnbiBjcml0ZXJpYQorIC0tLS0tLS0tLS0tLS0tLQorIExaTyB3YXMgZGVzaWduZWQgd2l0aCBzcGVlZCBpbiBtaW5kLiBEZWNvbXByZXNzb3Igc3BlZWQgaGFzIGJlZW4KKyBmYXZvdXJlZCBvdmVyIGNvbXByZXNzb3Igc3BlZWQuIFJlYWwtdGltZSBkZWNvbXByZXNzaW9uIHNob3VsZCBiZQorIHBvc3NpYmxlIGZvciB2aXJ0dWFsbHkgYW55IGFwcGxpY2F0aW9uLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgTFpPMVggZGVjb21wcmVzc29yIGluIG9wdGltaXplZCBpMzg2IGFzc2VtYmxlciBjb2RlIHJ1bnMgYWJvdXQgYXQKKyB0aGUgdGhpcmQgb2YgdGhlIHNwZWVkIG9mIGEgbWVtY3B5KCkgLSBhbmQgZXZlbiBmYXN0ZXIgZm9yIG1hbnkgZmlsZXMuCisKKyBJbiBmYWN0IEkgZmlyc3Qgd3JvdGUgdGhlIGRlY29tcHJlc3NvciBvZiBlYWNoIGFsZ29yaXRobSB0aGVyZWJ5CisgZGVmaW5pbmcgdGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQsIHZlcmlmaWVkIGl0IHdpdGggbWFudWFsbHkKKyBjcmVhdGVkIHRlc3QgZGF0YSBhbmQgYXQgbGFzdCBhZGRlZCB0aGUgY29tcHJlc3Nvci4KKworCisgUGVyZm9ybWFuY2UKKyAtLS0tLS0tLS0tLQorIFRvIGtlZXAgeW91IGludGVyZXN0ZWQsIGhlcmUgaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGF2ZXJhZ2UgcmVzdWx0cworIHdoZW4gY29tcHJlc3NpbmcgdGhlIENhbGdhcnkgQ29ycHVzIHRlc3Qgc3VpdGUgd2l0aCBhIGJsb2Nrc2l6ZQorIG9mIDI1NiBLaUIsIG9yaWdpbmFsbHkgZG9uZSBvbiBhbiBhbmNpZW50IEludGVsIFBlbnRpdW0gMTMzLgorCisgVGhlIG5hbWluZyBjb252ZW50aW9uIG9mIHRoZSB2YXJpb3VzIGFsZ29yaXRobXMgZ29lcyBMWk94eC1OLCB3aGVyZSBOIGlzCisgdGhlIGNvbXByZXNzaW9uIGxldmVsLiBSYW5nZSAxLTkgaW5kaWNhdGVzIHRoZSBmYXN0IHN0YW5kYXJkIGxldmVscyB1c2luZworIDY0IEtpQiBtZW1vcnkgZm9yIGNvbXByZXNzaW9uLiBMZXZlbCA5OSBvZmZlcnMgYmV0dGVyIGNvbXByZXNzaW9uIGF0IHRoZQorIGNvc3Qgb2YgbW9yZSBtZW1vcnkgKDI1NiBLaUIpLCBhbmQgaXMgc3RpbGwgcmVhc29uYWJseSBmYXN0LgorIExldmVsIDk5OSBhY2hpZXZlcyBuZWFybHkgb3B0aW1hbCBjb21wcmVzc2lvbiAtIGJ1dCBpdCBpcyBzbG93CisgYW5kIHVzZXMgbXVjaCBtZW1vcnksIGFuZCBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIGdlbmVyYXRpbmcKKyBwcmUtY29tcHJlc3NlZCBkYXRhLgorCisgVGhlIEMgdmVyc2lvbiBvZiBMWk8xWC0xIGlzIGFib3V0IDQtNSB0aW1lcyBmYXN0ZXIgdGhhbiB0aGUgZmFzdGVzdAorIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIGFuZCBpdCBhbHNvIG91dHBlcmZvcm1zIG90aGVyIGFsZ29yaXRobXMKKyBsaWtlIExaUlcxLUEgYW5kIExaViBpbiBib3RoIGNvbXByZXNzaW9uIHJhdGlvIGFuZCBjb21wcmVzc2lvbiBzcGVlZAorIGFuZCBkZWNvbXByZXNzaW9uIHNwZWVkLgorCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8IEFsZ29yaXRobSAgICAgICAgTGVuZ3RoICBDeEIgICBDb21MZW4gICVSZW1uICBCaXRzICAgQ29tIEsvcyAgIERlYyBLL3MgfAorIHwgLS0tLS0tLS0tICAgICAgICAtLS0tLS0gIC0tLSAgIC0tLS0tLSAgLS0tLS0gIC0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IG1lbWNweSgpICAgICAgICAgMjI0NDAxICAgIDEgICAyMjQ0MDEgIDEwMC4wICA4LjAwICA2MDk1Ni44MyAgNTkxMjQuNTggfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBMWk8xLTEgICAgICAgICAgIDIyNDQwMSAgICAxICAgMTE3MzYyICAgNTMuMSAgNC4yNSAgIDQ2NjUuMjQgIDEzMzQxLjk4IHwKKyB8IExaTzEtOTkgICAgICAgICAgMjI0NDAxICAgIDEgICAxMDE1NjAgICA0Ni43ICAzLjczICAgMTM3My4yOSAgMTM4MjMuNDAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBMWk8xQS0xICAgICAgICAgIDIyNDQwMSAgICAxICAgMTE1MTc0ICAgNTEuNyAgNC4xNCAgIDQ5MzcuODMgIDE0NDEwLjM1IHwKKyB8IExaTzFBLTk5ICAgICAgICAgMjI0NDAxICAgIDEgICAgOTk5NTggICA0NS41ICAzLjY0ICAgMTM2Mi43MiAgMTQ3MzQuMTcgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBMWk8xQi0xICAgICAgICAgIDIyNDQwMSAgICAxICAgMTA5NTkwICAgNDkuNiAgMy45NyAgIDQ1NjUuNTMgIDE1NDM4LjM0IHwKKyB8IExaTzFCLTIgICAgICAgICAgMjI0NDAxICAgIDEgICAxMDYyMzUgICA0OC40ICAzLjg4ICAgNDI5Ny4zMyAgMTU0OTIuNzkgfAorIHwgTFpPMUItMyAgICAgICAgICAyMjQ0MDEgICAgMSAgIDEwNDM5NSAgIDQ3LjggIDMuODMgICA0MDE4LjIxICAxNTM3My41MiB8CisgfCBMWk8xQi00ICAgICAgICAgIDIyNDQwMSAgICAxICAgMTA0ODI4ICAgNDcuNCAgMy43OSAgIDMwMjQuNDggIDE1MTAwLjExIHwKKyB8IExaTzFCLTUgICAgICAgICAgMjI0NDAxICAgIDEgICAxMDI3MjQgICA0Ni43ICAzLjczICAgMjgyNy44MiAgMTU0MjcuNjIgfAorIHwgTFpPMUItNiAgICAgICAgICAyMjQ0MDEgICAgMSAgIDEwMTIxMCAgIDQ2LjAgIDMuNjggICAyNjE1Ljk2ICAxNTMyNS42OCB8CisgfCBMWk8xQi03ICAgICAgICAgIDIyNDQwMSAgICAxICAgMTAxMzg4ICAgNDYuMCAgMy42OCAgIDI0MzAuODkgIDE1MzYxLjQ3IHwKKyB8IExaTzFCLTggICAgICAgICAgMjI0NDAxICAgIDEgICAgOTk0NTMgICA0NS4yICAzLjYyICAgMjE4My44NyAgMTU0MDIuNzcgfAorIHwgTFpPMUItOSAgICAgICAgICAyMjQ0MDEgICAgMSAgICA5OTExOCAgIDQ1LjAgIDMuNjAgICAxNjc3LjA2ICAxNTA2OS42MCB8CisgfCBMWk8xQi05OSAgICAgICAgIDIyNDQwMSAgICAxICAgIDk1Mzk5ICAgNDMuNiAgMy40OCAgIDEyODYuODcgIDE1NjU2LjExIHwKKyB8IExaTzFCLTk5OSAgICAgICAgMjI0NDAxICAgIDEgICAgODM5MzQgICAzOS4xICAzLjEzICAgIDIzMi40MCAgMTY0NDUuMDUgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBMWk8xQy0xICAgICAgICAgIDIyNDQwMSAgICAxICAgMTExNzM1ICAgNTAuNCAgNC4wMyAgIDQ4ODMuMDggIDE1NTcwLjkxIHwKKyB8IExaTzFDLTIgICAgICAgICAgMjI0NDAxICAgIDEgICAxMDg2NTIgICA0OS4zICAzLjk0ICAgNDQyNC4yNCAgMTU3MzMuMTQgfAorIHwgTFpPMUMtMyAgICAgICAgICAyMjQ0MDEgICAgMSAgIDEwNjgxMCAgIDQ4LjcgIDMuODkgICA0MTI3LjY1ICAxNTY0NS42OSB8CisgfCBMWk8xQy00ICAgICAgICAgIDIyNDQwMSAgICAxICAgMTA1NzE3ICAgNDcuNyAgMy44MiAgIDMwMDcuOTIgIDE1MzQ2LjQ0IHwKKyB8IExaTzFDLTUgICAgICAgICAgMjI0NDAxICAgIDEgICAxMDM2MDUgICA0Ny4wICAzLjc2ICAgMjgyOS4xNSAgMTUxNTMuODggfAorIHwgTFpPMUMtNiAgICAgICAgICAyMjQ0MDEgICAgMSAgIDEwMjU4NSAgIDQ2LjUgIDMuNzIgICAyNjMxLjM3ICAxNTI1Ny41OCB8CisgfCBMWk8xQy03ICAgICAgICAgIDIyNDQwMSAgICAxICAgMTAxOTM3ICAgNDYuMiAgMy43MCAgIDIzNzguNTcgIDE1NDkyLjQ5IHwKKyB8IExaTzFDLTggICAgICAgICAgMjI0NDAxICAgIDEgICAxMDA3NzkgICA0NS42ICAzLjY1ICAgMjE3MS45MyAgMTUzODYuMDcgfAorIHwgTFpPMUMtOSAgICAgICAgICAyMjQ0MDEgICAgMSAgIDEwMDI1NSAgIDQ1LjQgIDMuNjMgICAxNjkxLjQ0ICAxNTE5NC42OCB8CisgfCBMWk8xQy05OSAgICAgICAgIDIyNDQwMSAgICAxICAgIDk3MjUyICAgNDQuMSAgMy41MyAgIDE0NjIuODggIDE1MzQxLjM3IHwKKyB8IExaTzFDLTk5OSAgICAgICAgMjI0NDAxICAgIDEgICAgODc3NDAgICA0MC4yICAzLjIxICAgIDMwNi40NCAgMTY0MTEuOTQgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBMWk8xRi0xICAgICAgICAgIDIyNDQwMSAgICAxICAgMTEzNDEyICAgNTAuOCAgNC4wNyAgIDQ3NTUuOTcgIDE2MDc0LjEyIHwKKyB8IExaTzFGLTk5OSAgICAgICAgMjI0NDAxICAgIDEgICAgODk1OTkgICA0MC4zICAzLjIzICAgIDI4MC42OCAgMTY1NTMuOTAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBMWk8xWC0xKDExKSAgICAgIDIyNDQwMSAgICAxICAgMTE4ODEwICAgNTIuNiAgNC4yMSAgIDQ1NDQuNDIgIDE1ODc5LjA0IHwKKyB8IExaTzFYLTEoMTIpICAgICAgMjI0NDAxICAgIDEgICAxMTM2NzUgICA1MC42ICA0LjA1ICAgNDQxMS4xNSAgMTU3MjEuNTkgfAorIHwgTFpPMVgtMSAgICAgICAgICAyMjQ0MDEgICAgMSAgIDEwOTMyMyAgIDQ5LjQgIDMuOTUgICA0OTkxLjc2ICAxNTU4NC44OSB8CisgfCBMWk8xWC0xKDE1KSAgICAgIDIyNDQwMSAgICAxICAgMTA4NTAwICAgNDkuMSAgMy45MyAgIDUwNzcuNTAgIDE1NzQ0LjU2IHwKKyB8IExaTzFYLTk5OSAgICAgICAgMjI0NDAxICAgIDEgICAgODI4NTQgICAzOC4wICAzLjA0ICAgIDEzNS43NyAgMTY1NDguNDggfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBMWk8xWS0xICAgICAgICAgIDIyNDQwMSAgICAxICAgMTEwODIwICAgNDkuOCAgMy45OCAgIDQ5NTIuNTIgIDE1NjM4LjgyIHwKKyB8IExaTzFZLTk5OSAgICAgICAgMjI0NDAxICAgIDEgICAgODM2MTQgICAzOC4yICAzLjA1ICAgIDEzNS4wNyAgMTYzODUuNDAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBMWk8xWi05OTkgICAgICAgIDIyNDQwMSAgICAxICAgIDgzMDM0ICAgMzguMCAgMy4wNCAgICAxMzMuMzEgIDEwNTUzLjc0IHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgTFpPMkEtOTk5ICAgICAgICAyMjQ0MDEgICAgMSAgICA4Nzg4MCAgIDQwLjAgIDMuMjAgICAgMzAxLjIxICAgODExNS43NSB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworIE5vdGVzOgorICAtIEN4QiBpcyB0aGUgbnVtYmVyIG9mIGJsb2NrcworICAtIEsvcyBpcyB0aGUgc3BlZWQgbWVhc3VyZWQgaW4gMTAwMCB1bmNvbXByZXNzZWQgYnl0ZXMgcGVyIHNlY29uZAorICAtIHRoZSBhc3NlbWJsZXIgZGVjb21wcmVzc29ycyBhcmUgZXZlbiBmYXN0ZXIKKworCisgU2hvcnQgZG9jdW1lbnRhdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyBMWk8gaXMgYSBibG9jayBjb21wcmVzc2lvbiBhbGdvcml0aG0gLSBpdCBjb21wcmVzc2VzIGFuZCBkZWNvbXByZXNzZXMKKyBhIGJsb2NrIG9mIGRhdGEuIEJsb2NrIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBmb3IgY29tcHJlc3Npb24KKyBhbmQgZGVjb21wcmVzc2lvbi4KKworIExaTyBjb21wcmVzc2VzIGEgYmxvY2sgb2YgZGF0YSBpbnRvIG1hdGNoZXMgKGEgc2xpZGluZyBkaWN0aW9uYXJ5KQorIGFuZCBydW5zIG9mIG5vbi1tYXRjaGluZyBsaXRlcmFscy4gTFpPIHRha2VzIGNhcmUgYWJvdXQgbG9uZyBtYXRjaGVzCisgYW5kIGxvbmcgbGl0ZXJhbCBydW5zIHNvIHRoYXQgaXQgcHJvZHVjZXMgZ29vZCByZXN1bHRzIG9uIGhpZ2hseQorIHJlZHVuZGFudCBkYXRhIGFuZCBkZWFscyBhY2NlcHRhYmx5IHdpdGggbm9uLWNvbXByZXNzaWJsZSBkYXRhLgorCisgV2hlbiBkZWFsaW5nIHdpdGggaW5jb21wcmVzc2libGUgZGF0YSwgTFpPIGV4cGFuZHMgdGhlIGlucHV0CisgYmxvY2sgYnkgYSBtYXhpbXVtIG9mIDY0IGJ5dGVzIHBlciAxMDI0IGJ5dGVzIGlucHV0LgorCisgSSBoYXZlIHZlcmlmaWVkIExaTyB1c2luZyBzdWNoIHRvb2xzIGFzIHZhbGdyaW5kIGFuZCBvdGhlciBtZW1vcnkgY2hlY2tlcnMuCisgQW5kIGluIGFkZGl0aW9uIHRvIGNvbXByZXNzaW5nIGdpZ2FieXRlcyBvZiBmaWxlcyB3aGVuIHR1bmluZyBzb21lIHBhcmFtZXRlcnMKKyBJIGhhdmUgYWxzbyBjb25zdWx0ZWQgdmFyaW91cyAnbGludCcgcHJvZ3JhbXMgdG8gc3BvdCBwb3RlbnRpYWwgcG9ydGFiaWxpdHkKKyBwcm9ibGVtcy4gTFpPIGlzIGZyZWUgb2YgYW55IGtub3duIGJ1Z3MuCisKKworIFRoZSBhbGdvcml0aG1zCisgLS0tLS0tLS0tLS0tLS0KKyBUaGVyZSBhcmUgdG9vIG1hbnkgYWxnb3JpdGhtcyBpbXBsZW1lbnRlZC4gQnV0IEkgd2FudCB0byBzdXBwb3J0CisgdW5saW1pdGVkIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHNvIEkgd2lsbCBub3QgcmVkdWNlIHRoZSBMWk8KKyBkaXN0cmlidXRpb24gaW4gdGhlIGZ1dHVyZS4KKworIEFzIHRoZSBtYW55IG9iamVjdCBmaWxlcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIsIHRoZQorIHNpemUgb3ZlcmhlYWQgZm9yIGFuIGV4ZWN1dGFibGUgc3RhdGljYWxseSBsaW5rZWQgd2l0aCB0aGUgTFpPIGxpYnJhcnkKKyBpcyB1c3VhbGx5IHByZXR0eSBsb3cgKGp1c3QgYSBmZXcgS2lCKSBiZWNhdXNlIHRoZSBsaW5rZXIgd2lsbCBvbmx5IGFkZAorIHRoZSBtb2R1bGVzIHRoYXQgeW91IGFyZSBhY3R1YWxseSB1c2luZy4KKworIEkgZmlyc3QgcHVibGlzaGVkIExaTzEgYW5kIExaTzFBIGluIHRoZSBJbnRlcm5ldCBuZXdzZ3JvdXBzCisgY29tcC5jb21wcmVzc2lvbiBhbmQgY29tcC5jb21wcmVzc2lvbi5yZXNlYXJjaCBpbiBNYXJjaCAxOTk2LgorIFRoZXkgYXJlIG1haW5seSBpbmNsdWRlZCBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiBUaGUgTFpPMkEKKyBkZWNvbXByZXNzb3IgaXMgdG9vIHNsb3csIGFuZCB0aGVyZSBpcyBubyBmYXN0IGNvbXByZXNzb3IgYW55d2F5LgorCisgTXkgZXhwZXJpbWVudHMgaGF2ZSBzaG93biB0aGF0IExaTzFCIGlzIGdvb2Qgd2l0aCBhIGxhcmdlIGJsb2Nrc2l6ZQorIG9yIHdpdGggdmVyeSByZWR1bmRhbnQgZGF0YSwgTFpPMUYgaXMgZ29vZCB3aXRoIGEgc21hbGwgYmxvY2tzaXplIG9yCisgd2l0aCBiaW5hcnkgZGF0YSBhbmQgdGhhdCBMWk8xWCBpcyBvZnRlbiB0aGUgYmVzdCBjaG9pY2Ugb2YgYWxsLgorIExaTzFZIGFuZCBMWk8xWiBhcmUgYWxtb3N0IGlkZW50aWNhbCB0byBMWk8xWCAtIHRoZXkgY2FuIGFjaGlldmUgYQorIGJldHRlciBjb21wcmVzc2lvbiByYXRpbyBvbiBzb21lIGZpbGVzLgorIEJld2FyZSwgeW91ciBtaWxlYWdlIG1heSB2YXJ5LgorCisKKyBVc2FnZSBvZiB0aGUgbGlicmFyeQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRGVzcGl0ZSBvZiBpdHMgc2l6ZSwgdGhlIGJhc2ljIHVzYWdlIG9mIExaTyBpcyByZWFsbHkgdmVyeSBzaW1wbGUuCisKKyBMZXQncyBhc3N1bWUgeW91IHdhbnQgdG8gY29tcHJlc3Mgc29tZSBkYXRhIHdpdGggTFpPMVgtMToKKyAgIEEpIGNvbXByZXNzaW9uCisgICAgICAqIGluY2x1ZGUgPGx6by9sem8xeC5oPgorICAgICAgICBjYWxsIGx6b19pbml0KCkKKyAgICAgICAgY29tcHJlc3MgeW91ciBkYXRhIHdpdGggbHpvMXhfMV9jb21wcmVzcygpCisgICAgICAqIGxpbmsgeW91ciBhcHBsaWNhdGlvbiB3aXRoIHRoZSBMWk8gbGlicmFyeQorICAgQikgZGVjb21wcmVzc2lvbgorICAgICAgKiBpbmNsdWRlIDxsem8vbHpvMXguaD4KKyAgICAgICAgY2FsbCBsem9faW5pdCgpCisgICAgICAgIGRlY29tcHJlc3MgeW91ciBkYXRhIHdpdGggbHpvMXhfZGVjb21wcmVzcygpCisgICAgICAqIGxpbmsgeW91ciBhcHBsaWNhdGlvbiB3aXRoIHRoZSBMWk8gbGlicmFyeQorCisgVGhlIHByb2dyYW0gZXhhbXBsZXMvc2ltcGxlLmMgc2hvd3MgYSBmdWxseSB3b3JraW5nIGV4YW1wbGUuCisgU2VlIGFsc28gTFpPLkZBUSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCisgQnVpbGRpbmcgTFpPCisgLS0tLS0tLS0tLS0tCisgQXMgTFpPIHVzZXMgQXV0b2NvbmYrQXV0b21ha2UrTGlidG9vbCB0aGUgYnVpbGRpbmcgcHJvY2VzcyB1bmRlcgorIFVOSVggc3lzdGVtcyBzaG91bGQgYmUgdmVyeSB1bnByb2JsZW1hdGljLiBTaGFyZWQgbGlicmFyaWVzIGFyZQorIHN1cHBvcnRlZCBvbiBtYW55IGFyY2hpdGVjdHVyZXMgYXMgd2VsbC4KKyBGb3IgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIHNlZSB0aGUgZmlsZSBJTlNUQUxMLgorCisgUGxlYXNlIG5vdGUgdGhhdCBkdWUgdG8gdGhlIGRlc2lnbiBvZiB0aGUgRUxGIGV4ZWN1dGFibGUgZm9ybWF0CisgdGhlIHBlcmZvcm1hbmNlIG9mIGEgc2hhcmVkIGxpYnJhcnkgb24gaTM4NiBzeXN0ZW1zIChlLmcuIExpbnV4KQorIGlzIGEgbGl0dGxlIGJpdCBzbG93ZXIsIHNvIHlvdSBtYXkgd2FudCB0byBsaW5rIHlvdXIgYXBwbGljYXRpb25zCisgd2l0aCB0aGUgc3RhdGljIHZlcnNpb24gKGxpYmx6bzIuYSkgYW55d2F5LgorCisgRm9yIGJ1aWxkaW5nIHVuZGVyIERPUywgV2luMTYsIFdpbjMyLCBPUy8yIGFuZCBvdGhlciBzeXN0ZW1zCisgdGFrZSBhIGxvb2sgYXQgdGhlIGZpbGUgQi8wMHJlYWRtZS50eHQuCisKKyBJbiBjYXNlIG9mIHRyb3VibGVzIChsaWtlIGRlY29tcHJlc3Npb24gZGF0YSBlcnJvcnMpIHRyeSByZWNvbXBpbGluZworIGV2ZXJ5dGhpbmcgd2l0aG91dCBvcHRpbWl6YXRpb25zIC0gTFpPIG1heSBicmVhayB0aGUgb3B0aW1pemVyCisgb2YgeW91ciBjb21waWxlci4gU2VlIHRoZSBmaWxlIEJVR1MuCisKKyBMWk8gaXMgd3JpdHRlbiBpbiBBTlNJIEMuIEluIHBhcnRpY3VsYXIgdGhpcyBtZWFuczoKKyAgIC0geW91ciBjb21waWxlciBtdXN0IHVuZGVyc3RhbmQgcHJvdG90eXBlcworICAgLSB5b3VyIGNvbXBpbGVyIG11c3QgdW5kZXJzdGFuZCBwcm90b3R5cGVzIGluIGZ1bmN0aW9uIHBvaW50ZXJzCisgICAtIHlvdXIgY29tcGlsZXIgbXVzdCBjb3JyZWN0bHkgcHJvbW90ZSBpbnRlZ3JhbHMgKCJ2YWx1ZS1wcmVzZXJ2aW5nIikKKyAgIC0geW91ciBwcmVwcm9jZXNzb3IgbXVzdCBpbXBsZW1lbnQgI2VsaWYsICNlcnJvciBhbmQgc3RyaW5naXppbmcKKyAgIC0geW91IG11c3QgaGF2ZSBhIGNvbmZvcm1pbmcgYW5kIGNvcnJlY3QgPGxpbWl0cy5oPiBoZWFkZXIKKyAgIC0geW91IG11c3QgaGF2ZSA8c3RkZGVmLmg+LCA8c3RyaW5nLmg+IGFuZCBvdGhlciBBTlNJIEMgaGVhZGVycworICAgLSB5b3Ugc2hvdWxkIGhhdmUgc2l6ZV90IGFuZCBwdHJkaWZmX3QKKworCisgUG9ydGFiaWxpdHkKKyAtLS0tLS0tLS0tLQorIEkgaGF2ZSBidWlsdCBhbmQgdGVzdGVkIExaTyBzdWNjZXNzZnVsbHkgb24gYSB2YXJpZXR5IG9mIHBsYXRmb3JtcworIGluY2x1ZGluZyBET1MgKDE2ICsgMzIgYml0KSwgV2luZG93cyAzLnggKDE2LWJpdCksIFdpbjMyLCBXaW42NCwKKyBMaW51eCwgKkJTRCwgSFAtVVggYW5kIG1hbnkgbW9yZS4KKworIExaTyBpcyBhbHNvIHJlcG9ydGVkIHRvIHdvcmsgdW5kZXIgQUlYLCBDb252ZXhPUywgSVJJWCwgTWFjT1MsIFBhbG1PUyAoUGlsb3QpLAorIFBTWCAoU29ueSBQbGF5c3RhdGlvbiksIFNvbGFyaXMsIFN1bk9TLCBUT1MgKEF0YXJpIFNUKSBhbmQgVnhXb3Jrcy4KKyBGdXJ0aGVybW9yZSBpdCBpcyBzYWlkIHRoYXQgaXRzIHBlcmZvcm1hbmNlIG9uIGEgQ3JheSBpcyBzdXBlcmlvcgorIHRvIGFsbCBvdGhlciBtYWNoaW5lcy4uLgorCisgQW5kIEkgdGhpbmsgaXQgd291bGQgYmUgbXVjaCBmdW4gdG8gdHJhbnNsYXRlIHRoZSBkZWNvbXByZXNzb3JzCisgdG8gWi04MCBvciA2NTAyIGFzc2VtYmx5LgorCisKKyBUaGUgZnV0dXJlCisgLS0tLS0tLS0tLQorIEhlcmUgaXMgd2hhdCBJJ20gcGxhbm5pbmcgZm9yIHRoZSBuZXh0IG1vbnRocy4gTm8gcHJvbWlzZXMsIHRob3VnaC4uLgorCisgLSBpbnRlcmZhY2VzIHRvIC5ORVQgYW5kIE1vbm8KKyAtIGludGVyZmFjZXMgdG8gUGVybCwgSmF2YSwgUHl0aG9uLCBEZWxwaGksIFZpc3VhbCBCYXNpYywgLi4uCisgLSBpbXByb3ZlIGRvY3VtZW50YXRpb24gYW5kIEFQSSByZWZlcmVuY2UKKworCisgU29tZSBjb21tZW50cyBhYm91dCB0aGUgc291cmNlIGNvZGUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEJlIHdhcm5lZDogdGhlIG1haW4gc291cmNlIGNvZGUgaW4gdGhlICdzcmMnIGRpcmVjdG9yeSBpcyBhCisgcmVhbCBwYWluIHRvIHVuZGVyc3RhbmQgYXMgSSd2ZSBleHBlcmltZW50ZWQgd2l0aCBodW5kcmVkcyBvZiBzbGlnaHRseQorIGRpZmZlcmVudCB2ZXJzaW9ucy4gSXQgY29udGFpbnMgbWFueSAjaWYgYW5kIHNvbWUgZ290b3MsIGFuZAorIGlzICpjb21wbGV0ZWx5IG9wdGltaXplZCBmb3Igc3BlZWQqIGFuZCBub3QgZm9yIHJlYWRhYmlsaXR5LgorIENvZGUgc2hhcmluZyBvZiB0aGUgZGlmZmVyZW50IGFsZ29yaXRobXMgaXMgaW1wbGVtZW50ZWQgYnkgc3RyZXNzaW5nCisgdGhlIHByZXByb2Nlc3NvciAtIHRoaXMgY2FuIGJlIHJlYWxseSBjb25mdXNpbmcuIExvdHMgb2YgbWFyY29zIGFuZAorIGFzc2VydGlvbnMgZG9uJ3QgbWFrZSB0aGluZ3MgYmV0dGVyLgorCisgTmV2ZXJ0aGVsZXNzIExaTyBjb21waWxlcyB2ZXJ5IHF1aWV0bHkgb24gYSB2YXJpZXR5IG9mCisgY29tcGlsZXJzIHdpdGggdGhlIGhpZ2hlc3Qgd2FybmluZyBsZXZlbHMgdHVybmVkIG9uLCBldmVuCisgaW4gQysrIG1vZGUuCisKKworIENvcHlyaWdodAorIC0tLS0tLS0tLQorIExaTyBpcyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgT2Jlcmh1bWVyCisgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIExaTyBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLgorIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgorCisgU3BlY2lhbCBsaWNlbnNlcyBmb3IgY29tbWVyY2lhbCBhbmQgb3RoZXIgYXBwbGljYXRpb25zIHdoaWNoCisgYXJlIG5vdCB3aWxsaW5nIHRvIGFjY2VwdCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhcmUgYXZhaWxhYmxlIGJ5IGNvbnRhY3RpbmcgdGhlIGF1dGhvci4KKworCisKZGlmZiAtLWdpdCBhL2x6by9pbmNsdWRlL2x6by9sem8xLmggYi9sem8vaW5jbHVkZS9sem8vbHpvMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2Q5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vaW5jbHVkZS9sem8vbHpvMS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIGx6bzEuaCAtLSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoZSBMWk8xIGNvbXByZXNzaW9uIGFsZ29yaXRobQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKyNpZm5kZWYgX19MWk8xX0hfSU5DTFVERUQKKyNkZWZpbmUgX19MWk8xX0hfSU5DTFVERUQgMQorCisjaWZuZGVmIF9fTFpPQ09ORl9IX0lOQ0xVREVECisjaW5jbHVkZSAibHpvY29uZi5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSByZXF1aXJlZCBmb3IgdGhlIHdya21lbSBwYXJhbWV0ZXIuCisgKiBXaGVuIHRoZSByZXF1aXJlZCBzaXplIGlzIDAsIHlvdSBjYW4gYWxzbyBwYXNzIGEgTlVMTCBwb2ludGVyLgorICovCisKKyNkZWZpbmUgTFpPMV9NRU1fQ09NUFJFU1MgICAgICAgKChsem9fdWludDMyX3QpICg4MTkyTCAqIGx6b19zaXplb2ZfZGljdF90KSkKKyNkZWZpbmUgTFpPMV9NRU1fREVDT01QUkVTUyAgICAgKDApCisKKworTFpPX0VYVEVSTihpbnQpCitsem8xX2NvbXByZXNzICAgICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCitMWk9fRVhURVJOKGludCkKK2x6bzFfZGVjb21wcmVzcyAgICAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBiZXR0ZXIgY29tcHJlc3Npb24gcmF0aW8gYXQgdGhlIGNvc3Qgb2YgbW9yZSBtZW1vcnkgYW5kIHRpbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMWk8xXzk5X01FTV9DT01QUkVTUyAgICAoKGx6b191aW50MzJfdCkgKDY1NTM2TCAqIGx6b19zaXplb2ZfZGljdF90KSkKKworTFpPX0VYVEVSTihpbnQpCitsem8xXzk5X2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisKKy8qIHZpbTpzZXQgdHM9NCBldDogKi8KZGlmZiAtLWdpdCBhL2x6by9pbmNsdWRlL2x6by9sem8xYS5oIGIvbHpvL2luY2x1ZGUvbHpvL2x6bzFhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkN2U3NQotLS0gL2Rldi9udWxsCisrKyBiL2x6by9pbmNsdWRlL2x6by9sem8xYS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIGx6bzFhLmggLS0gcHVibGljIGludGVyZmFjZSBvZiB0aGUgTFpPMUEgY29tcHJlc3Npb24gYWxnb3JpdGhtCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2lmbmRlZiBfX0xaTzFBX0hfSU5DTFVERUQKKyNkZWZpbmUgX19MWk8xQV9IX0lOQ0xVREVEIDEKKworI2lmbmRlZiBfX0xaT0NPTkZfSF9JTkNMVURFRAorI2luY2x1ZGUgImx6b2NvbmYuaCIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgcmVxdWlyZWQgZm9yIHRoZSB3cmttZW0gcGFyYW1ldGVyLgorICogV2hlbiB0aGUgcmVxdWlyZWQgc2l6ZSBpcyAwLCB5b3UgY2FuIGFsc28gcGFzcyBhIE5VTEwgcG9pbnRlci4KKyAqLworCisjZGVmaW5lIExaTzFBX01FTV9DT01QUkVTUyAgICAgICgobHpvX3VpbnQzMl90KSAoODE5MkwgKiBsem9fc2l6ZW9mX2RpY3RfdCkpCisjZGVmaW5lIExaTzFBX01FTV9ERUNPTVBSRVNTICAgICgwKQorCisKK0xaT19FWFRFUk4oaW50KQorbHpvMWFfY29tcHJlc3MgICAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKKworTFpPX0VYVEVSTihpbnQpCitsem8xYV9kZWNvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSAvKiBOT1QgVVNFRCAqLyApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvIGF0IHRoZSBjb3N0IG9mIG1vcmUgbWVtb3J5IGFuZCB0aW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFpPMUFfOTlfTUVNX0NPTVBSRVNTICAgKChsem9fdWludDMyX3QpICg2NTUzNkwgKiBsem9fc2l6ZW9mX2RpY3RfdCkpCisKK0xaT19FWFRFUk4oaW50KQorbHpvMWFfOTlfY29tcHJlc3MgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmIC8qIGFscmVhZHkgaW5jbHVkZWQgKi8KKworCisvKiB2aW06c2V0IHRzPTQgZXQ6ICovCmRpZmYgLS1naXQgYS9sem8vaW5jbHVkZS9sem8vbHpvMWIuaCBiL2x6by9pbmNsdWRlL2x6by9sem8xYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTViOWUKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vaW5jbHVkZS9sem8vbHpvMWIuaApAQCAtMCwwICsxLDE0OCBAQAorLyogbHpvMWIuaCAtLSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoZSBMWk8xQiBjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaWZuZGVmIF9fTFpPMUJfSF9JTkNMVURFRAorI2RlZmluZSBfX0xaTzFCX0hfSU5DTFVERUQgMQorCisjaWZuZGVmIF9fTFpPQ09ORl9IX0lOQ0xVREVECisjaW5jbHVkZSAibHpvY29uZi5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSByZXF1aXJlZCBmb3IgdGhlIHdya21lbSBwYXJhbWV0ZXIuCisgKiBXaGVuIHRoZSByZXF1aXJlZCBzaXplIGlzIDAsIHlvdSBjYW4gYWxzbyBwYXNzIGEgTlVMTCBwb2ludGVyLgorICovCisKKyNkZWZpbmUgTFpPMUJfTUVNX0NPTVBSRVNTICAgICAgKChsem9fdWludDMyX3QpICgxNjM4NEwgKiBsem9fc2l6ZW9mX2RpY3RfdCkpCisjZGVmaW5lIExaTzFCX01FTV9ERUNPTVBSRVNTICAgICgwKQorCisKKy8qIGNvbXByZXNzaW9uIGxldmVscyAqLworI2RlZmluZSBMWk8xQl9CRVNUX1NQRUVEICAgICAgICAgICAgIDEKKyNkZWZpbmUgTFpPMUJfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5CisjZGVmaW5lIExaTzFCX0RFRkFVTFRfQ09NUFJFU1NJT04gICgtMSkgICAgIC8qIGZhc3Rlc3QgYnkgZGVmYXVsdCAqLworCisKK0xaT19FWFRFUk4oaW50KQorbHpvMWJfY29tcHJlc3MgICAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wcmVzc2lvbl9sZXZlbCApOworCisvKiBkZWNvbXByZXNzaW9uICovCitMWk9fRVhURVJOKGludCkKK2x6bzFiX2RlY29tcHJlc3MgICAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovICk7CisKKy8qIHNhZmUgZGVjb21wcmVzc2lvbiB3aXRoIG92ZXJydW4gdGVzdGluZyAqLworTFpPX0VYVEVSTihpbnQpCitsem8xYl9kZWNvbXByZXNzX3NhZmUgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSAvKiBOT1QgVVNFRCAqLyApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFpPX0VYVEVSTihpbnQpCitsem8xYl8xX2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworTFpPX0VYVEVSTihpbnQpCitsem8xYl8yX2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworTFpPX0VYVEVSTihpbnQpCitsem8xYl8zX2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworTFpPX0VYVEVSTihpbnQpCitsem8xYl80X2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworTFpPX0VYVEVSTihpbnQpCitsem8xYl81X2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworTFpPX0VYVEVSTihpbnQpCitsem8xYl82X2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworTFpPX0VYVEVSTihpbnQpCitsem8xYl83X2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworTFpPX0VYVEVSTihpbnQpCitsem8xYl84X2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworTFpPX0VYVEVSTihpbnQpCitsem8xYl85X2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvIGF0IHRoZSBjb3N0IG9mIG1vcmUgbWVtb3J5IGFuZCB0aW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFpPMUJfOTlfTUVNX0NPTVBSRVNTICAgKChsem9fdWludDMyX3QpICg2NTUzNkwgKiBsem9fc2l6ZW9mX2RpY3RfdCkpCisKK0xaT19FWFRFUk4oaW50KQorbHpvMWJfOTlfY29tcHJlc3MgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKKworCisjZGVmaW5lIExaTzFCXzk5OV9NRU1fQ09NUFJFU1MgICgobHpvX3VpbnQzMl90KSAoMyAqIDY1NTM2TCAqIHNpemVvZihsem9feGludCkpKQorCitMWk9fRVhURVJOKGludCkKK2x6bzFiXzk5OV9jb21wcmVzcyAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBhbHJlYWR5IGluY2x1ZGVkICovCisKKworLyogdmltOnNldCB0cz00IGV0OiAqLwpkaWZmIC0tZ2l0IGEvbHpvL2luY2x1ZGUvbHpvL2x6bzFjLmggYi9sem8vaW5jbHVkZS9sem8vbHpvMWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEzY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvbHpvL2luY2x1ZGUvbHpvL2x6bzFjLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qIGx6bzFjLmggLS0gcHVibGljIGludGVyZmFjZSBvZiB0aGUgTFpPMUMgY29tcHJlc3Npb24gYWxnb3JpdGhtCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2lmbmRlZiBfX0xaTzFDX0hfSU5DTFVERUQKKyNkZWZpbmUgX19MWk8xQ19IX0lOQ0xVREVEIDEKKworI2lmbmRlZiBfX0xaT0NPTkZfSF9JTkNMVURFRAorI2luY2x1ZGUgImx6b2NvbmYuaCIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgcmVxdWlyZWQgZm9yIHRoZSB3cmttZW0gcGFyYW1ldGVyLgorICogV2hlbiB0aGUgcmVxdWlyZWQgc2l6ZSBpcyAwLCB5b3UgY2FuIGFsc28gcGFzcyBhIE5VTEwgcG9pbnRlci4KKyAqLworCisjZGVmaW5lIExaTzFDX01FTV9DT01QUkVTUyAgICAgICgobHpvX3VpbnQzMl90KSAoMTYzODRMICogbHpvX3NpemVvZl9kaWN0X3QpKQorI2RlZmluZSBMWk8xQ19NRU1fREVDT01QUkVTUyAgICAoMCkKKworCisvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi8KKyNkZWZpbmUgTFpPMUNfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCisjZGVmaW5lIExaTzFDX0JFU1RfQ09NUFJFU1NJT04gICAgICAgOQorI2RlZmluZSBMWk8xQ19ERUZBVUxUX0NPTVBSRVNTSU9OICAoLTEpICAgICAvKiBmYXN0ZXN0IGJ5IGRlZmF1bHQgKi8KKworCitMWk9fRVhURVJOKGludCkKK2x6bzFjX2NvbXByZXNzICAgICAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcHJlc3Npb25fbGV2ZWwgKTsKKworLyogZGVjb21wcmVzc2lvbiAqLworTFpPX0VYVEVSTihpbnQpCitsem8xY19kZWNvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSAvKiBOT1QgVVNFRCAqLyApOworCisvKiBzYWZlIGRlY29tcHJlc3Npb24gd2l0aCBvdmVycnVuIHRlc3RpbmcgKi8KK0xaT19FWFRFUk4oaW50KQorbHpvMWNfZGVjb21wcmVzc19zYWZlICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gLyogTk9UIFVTRUQgKi8gKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xaT19FWFRFUk4oaW50KQorbHpvMWNfMV9jb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKK0xaT19FWFRFUk4oaW50KQorbHpvMWNfMl9jb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKK0xaT19FWFRFUk4oaW50KQorbHpvMWNfM19jb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKK0xaT19FWFRFUk4oaW50KQorbHpvMWNfNF9jb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKK0xaT19FWFRFUk4oaW50KQorbHpvMWNfNV9jb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKK0xaT19FWFRFUk4oaW50KQorbHpvMWNfNl9jb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKK0xaT19FWFRFUk4oaW50KQorbHpvMWNfN19jb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKK0xaT19FWFRFUk4oaW50KQorbHpvMWNfOF9jb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKK0xaT19FWFRFUk4oaW50KQorbHpvMWNfOV9jb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGJldHRlciBjb21wcmVzc2lvbiByYXRpbyBhdCB0aGUgY29zdCBvZiBtb3JlIG1lbW9yeSBhbmQgdGltZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExaTzFDXzk5X01FTV9DT01QUkVTUyAgICgobHpvX3VpbnQzMl90KSAoNjU1MzZMICogbHpvX3NpemVvZl9kaWN0X3QpKQorCitMWk9fRVhURVJOKGludCkKK2x6bzFjXzk5X2NvbXByZXNzICAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICk7CisKKworI2RlZmluZSBMWk8xQ185OTlfTUVNX0NPTVBSRVNTICAoKGx6b191aW50MzJfdCkgKDUgKiAxNjM4NEwgKiBzaXplb2Yoc2hvcnQpKSkKKworTFpPX0VYVEVSTihpbnQpCitsem8xY185OTlfY29tcHJlc3MgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisKKy8qIHZpbTpzZXQgdHM9NCBldDogKi8KZGlmZiAtLWdpdCBhL2x6by9pbmNsdWRlL2x6by9sem8xZi5oIGIvbHpvL2luY2x1ZGUvbHpvL2x6bzFmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjNmIwZAotLS0gL2Rldi9udWxsCisrKyBiL2x6by9pbmNsdWRlL2x6by9sem8xZi5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qIGx6bzFmLmggLS0gcHVibGljIGludGVyZmFjZSBvZiB0aGUgTFpPMUYgY29tcHJlc3Npb24gYWxnb3JpdGhtCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2lmbmRlZiBfX0xaTzFGX0hfSU5DTFVERUQKKyNkZWZpbmUgX19MWk8xRl9IX0lOQ0xVREVEIDEKKworI2lmbmRlZiBfX0xaT0NPTkZfSF9JTkNMVURFRAorI2luY2x1ZGUgImx6b2NvbmYuaCIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgcmVxdWlyZWQgZm9yIHRoZSB3cmttZW0gcGFyYW1ldGVyLgorICogV2hlbiB0aGUgcmVxdWlyZWQgc2l6ZSBpcyAwLCB5b3UgY2FuIGFsc28gcGFzcyBhIE5VTEwgcG9pbnRlci4KKyAqLworCisjZGVmaW5lIExaTzFGX01FTV9DT01QUkVTUyAgICAgICgobHpvX3VpbnQzMl90KSAoMTYzODRMICogbHpvX3NpemVvZl9kaWN0X3QpKQorI2RlZmluZSBMWk8xRl9NRU1fREVDT01QUkVTUyAgICAoMCkKKworCisvKiBkZWNvbXByZXNzaW9uICovCitMWk9fRVhURVJOKGludCkKK2x6bzFmX2RlY29tcHJlc3MgICAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovICk7CisKKy8qIHNhZmUgZGVjb21wcmVzc2lvbiB3aXRoIG92ZXJydW4gdGVzdGluZyAqLworTFpPX0VYVEVSTihpbnQpCitsem8xZl9kZWNvbXByZXNzX3NhZmUgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSAvKiBOT1QgVVNFRCAqLyApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFpPX0VYVEVSTihpbnQpCitsem8xZl8xX2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvIGF0IHRoZSBjb3N0IG9mIG1vcmUgbWVtb3J5IGFuZCB0aW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFpPMUZfOTk5X01FTV9DT01QUkVTUyAgKChsem9fdWludDMyX3QpICg1ICogMTYzODRMICogc2l6ZW9mKHNob3J0KSkpCisKK0xaT19FWFRFUk4oaW50KQorbHpvMWZfOTk5X2NvbXByZXNzICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmIC8qIGFscmVhZHkgaW5jbHVkZWQgKi8KKworCisvKiB2aW06c2V0IHRzPTQgZXQ6ICovCmRpZmYgLS1naXQgYS9sem8vaW5jbHVkZS9sem8vbHpvMXguaCBiL2x6by9pbmNsdWRlL2x6by9sem8xeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTkxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vaW5jbHVkZS9sem8vbHpvMXguaApAQCAtMCwwICsxLDE2NSBAQAorLyogbHpvMXguaCAtLSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoZSBMWk8xWCBjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaWZuZGVmIF9fTFpPMVhfSF9JTkNMVURFRAorI2RlZmluZSBfX0xaTzFYX0hfSU5DTFVERUQgMQorCisjaWZuZGVmIF9fTFpPQ09ORl9IX0lOQ0xVREVECisjaW5jbHVkZSAibHpvY29uZi5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSByZXF1aXJlZCBmb3IgdGhlIHdya21lbSBwYXJhbWV0ZXIuCisgKiBXaGVuIHRoZSByZXF1aXJlZCBzaXplIGlzIDAsIHlvdSBjYW4gYWxzbyBwYXNzIGEgTlVMTCBwb2ludGVyLgorICovCisKKyNkZWZpbmUgTFpPMVhfTUVNX0NPTVBSRVNTICAgICAgTFpPMVhfMV9NRU1fQ09NUFJFU1MKKyNkZWZpbmUgTFpPMVhfTUVNX0RFQ09NUFJFU1MgICAgKDApCisjZGVmaW5lIExaTzFYX01FTV9PUFRJTUlaRSAgICAgICgwKQorCisKKy8qIGRlY29tcHJlc3Npb24gKi8KK0xaT19FWFRFUk4oaW50KQorbHpvMXhfZGVjb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gLyogTk9UIFVTRUQgKi8gKTsKKworLyogc2FmZSBkZWNvbXByZXNzaW9uIHdpdGggb3ZlcnJ1biB0ZXN0aW5nICovCitMWk9fRVhURVJOKGludCkKK2x6bzF4X2RlY29tcHJlc3Nfc2FmZSAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExaTzFYXzFfTUVNX0NPTVBSRVNTICAgICgobHpvX3VpbnQzMl90KSAoMTYzODRMICogbHpvX3NpemVvZl9kaWN0X3QpKQorCitMWk9fRVhURVJOKGludCkKK2x6bzF4XzFfY29tcHJlc3MgICAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBzcGVjaWFsIGNvbXByZXNzb3IgdmVyc2lvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdGhpcyB2ZXJzaW9uIG5lZWRzIG9ubHkgOCBLaUIgd29yayBtZW1vcnkgKi8KKyNkZWZpbmUgTFpPMVhfMV8xMV9NRU1fQ09NUFJFU1MgKChsem9fdWludDMyX3QpICgyMDQ4TCAqIGx6b19zaXplb2ZfZGljdF90KSkKKworTFpPX0VYVEVSTihpbnQpCitsem8xeF8xXzExX2NvbXByZXNzICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCisKKy8qIHRoaXMgdmVyc2lvbiBuZWVkcyAxNiBLaUIgd29yayBtZW1vcnkgKi8KKyNkZWZpbmUgTFpPMVhfMV8xMl9NRU1fQ09NUFJFU1MgKChsem9fdWludDMyX3QpICg0MDk2TCAqIGx6b19zaXplb2ZfZGljdF90KSkKKworTFpPX0VYVEVSTihpbnQpCitsem8xeF8xXzEyX2NvbXByZXNzICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCisKKy8qIHVzZSB0aGlzIHZlcnNpb24gaWYgeW91IG5lZWQgYSBsaXR0bGUgbW9yZSBjb21wcmVzc2lvbiBzcGVlZCAqLworI2RlZmluZSBMWk8xWF8xXzE1X01FTV9DT01QUkVTUyAoKGx6b191aW50MzJfdCkgKDMyNzY4TCAqIGx6b19zaXplb2ZfZGljdF90KSkKKworTFpPX0VYVEVSTihpbnQpCitsem8xeF8xXzE1X2NvbXByZXNzICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvIGF0IHRoZSBjb3N0IG9mIG1vcmUgbWVtb3J5IGFuZCB0aW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFpPMVhfOTk5X01FTV9DT01QUkVTUyAgKChsem9fdWludDMyX3QpICgxNCAqIDE2Mzg0TCAqIHNpemVvZihzaG9ydCkpKQorCitMWk9fRVhURVJOKGludCkKK2x6bzF4Xzk5OV9jb21wcmVzcyAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMWk9fRVhURVJOKGludCkKK2x6bzF4Xzk5OV9jb21wcmVzc19kaWN0ICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbHpvX2J5dGVwIGRpY3QsIGx6b191aW50IGRpY3RfbGVuICk7CisKK0xaT19FWFRFUk4oaW50KQorbHpvMXhfOTk5X2NvbXByZXNzX2xldmVsICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fY2FsbGJhY2tfcCBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wcmVzc2lvbl9sZXZlbCApOworCitMWk9fRVhURVJOKGludCkKK2x6bzF4X2RlY29tcHJlc3NfZGljdF9zYWZlICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4gKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIG9wdGltaXplIGEgY29tcHJlc3NlZCBkYXRhIGJsb2NrCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xaT19FWFRFUk4oaW50KQorbHpvMXhfb3B0aW1pemUgICAgICAgICAgKCAgICAgICBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gLyogTk9UIFVTRUQgKi8gKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmIC8qIGFscmVhZHkgaW5jbHVkZWQgKi8KKworCisvKiB2aW06c2V0IHRzPTQgZXQ6ICovCmRpZmYgLS1naXQgYS9sem8vaW5jbHVkZS9sem8vbHpvMXkuaCBiL2x6by9pbmNsdWRlL2x6by9sem8xeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzcwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vaW5jbHVkZS9sem8vbHpvMXkuaApAQCAtMCwwICsxLDEzMyBAQAorLyogbHpvMXkuaCAtLSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoZSBMWk8xWSBjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaWZuZGVmIF9fTFpPMVlfSF9JTkNMVURFRAorI2RlZmluZSBfX0xaTzFZX0hfSU5DTFVERUQgMQorCisjaWZuZGVmIF9fTFpPQ09ORl9IX0lOQ0xVREVECisjaW5jbHVkZSAibHpvY29uZi5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSByZXF1aXJlZCBmb3IgdGhlIHdya21lbSBwYXJhbWV0ZXIuCisgKiBXaGVuIHRoZSByZXF1aXJlZCBzaXplIGlzIDAsIHlvdSBjYW4gYWxzbyBwYXNzIGEgTlVMTCBwb2ludGVyLgorICovCisKKyNkZWZpbmUgTFpPMVlfTUVNX0NPTVBSRVNTICAgICAgKChsem9fdWludDMyX3QpICgxNjM4NEwgKiBsem9fc2l6ZW9mX2RpY3RfdCkpCisjZGVmaW5lIExaTzFZX01FTV9ERUNPTVBSRVNTICAgICgwKQorI2RlZmluZSBMWk8xWV9NRU1fT1BUSU1JWkUgICAgICAoMCkKKworCisvKiBkZWNvbXByZXNzaW9uICovCitMWk9fRVhURVJOKGludCkKK2x6bzF5X2RlY29tcHJlc3MgICAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovICk7CisKKy8qIHNhZmUgZGVjb21wcmVzc2lvbiB3aXRoIG92ZXJydW4gdGVzdGluZyAqLworTFpPX0VYVEVSTihpbnQpCitsem8xeV9kZWNvbXByZXNzX3NhZmUgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSAvKiBOT1QgVVNFRCAqLyApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFpPX0VYVEVSTihpbnQpCitsem8xeV8xX2NvbXByZXNzICAgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvIGF0IHRoZSBjb3N0IG9mIG1vcmUgbWVtb3J5IGFuZCB0aW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFpPMVlfOTk5X01FTV9DT01QUkVTUyAgKChsem9fdWludDMyX3QpICgxNCAqIDE2Mzg0TCAqIHNpemVvZihzaG9ydCkpKQorCitMWk9fRVhURVJOKGludCkKK2x6bzF5Xzk5OV9jb21wcmVzcyAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xaT19FWFRFUk4oaW50KQorbHpvMXlfOTk5X2NvbXByZXNzX2RpY3QgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4gKTsKKworTFpPX0VYVEVSTihpbnQpCitsem8xeV85OTlfY29tcHJlc3NfbGV2ZWwgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGx6b19ieXRlcCBkaWN0LCBsem9fdWludCBkaWN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19jYWxsYmFja19wIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXByZXNzaW9uX2xldmVsICk7CisKK0xaT19FWFRFUk4oaW50KQorbHpvMXlfZGVjb21wcmVzc19kaWN0X3NhZmUgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gLyogTk9UIFVTRUQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGx6b19ieXRlcCBkaWN0LCBsem9fdWludCBkaWN0X2xlbiApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gb3B0aW1pemUgYSBjb21wcmVzc2VkIGRhdGEgYmxvY2sKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFpPX0VYVEVSTihpbnQpCitsem8xeV9vcHRpbWl6ZSAgICAgICAgICAoICAgICAgIGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSAvKiBOT1QgVVNFRCAqLyApOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisKKy8qIHZpbTpzZXQgdHM9NCBldDogKi8KZGlmZiAtLWdpdCBhL2x6by9pbmNsdWRlL2x6by9sem8xei5oIGIvbHpvL2luY2x1ZGUvbHpvL2x6bzF6LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5N2UxMQotLS0gL2Rldi9udWxsCisrKyBiL2x6by9pbmNsdWRlL2x6by9sem8xei5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiBsem8xei5oIC0tIHB1YmxpYyBpbnRlcmZhY2Ugb2YgdGhlIExaTzFaIGNvbXByZXNzaW9uIGFsZ29yaXRobQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKyNpZm5kZWYgX19MWk8xWl9IX0lOQ0xVREVECisjZGVmaW5lIF9fTFpPMVpfSF9JTkNMVURFRCAxCisKKyNpZm5kZWYgX19MWk9DT05GX0hfSU5DTFVERUQKKyNpbmNsdWRlICJsem9jb25mLmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgd3JrbWVtIHBhcmFtZXRlci4KKyAqIFdoZW4gdGhlIHJlcXVpcmVkIHNpemUgaXMgMCwgeW91IGNhbiBhbHNvIHBhc3MgYSBOVUxMIHBvaW50ZXIuCisgKi8KKworI2RlZmluZSBMWk8xWl9NRU1fREVDT01QUkVTUyAgICAoMCkKKworCisvKiBkZWNvbXByZXNzaW9uICovCitMWk9fRVhURVJOKGludCkKK2x6bzF6X2RlY29tcHJlc3MgICAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovICk7CisKKy8qIHNhZmUgZGVjb21wcmVzc2lvbiB3aXRoIG92ZXJydW4gdGVzdGluZyAqLworTFpPX0VYVEVSTihpbnQpCitsem8xel9kZWNvbXByZXNzX3NhZmUgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSAvKiBOT1QgVVNFRCAqLyApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvIGF0IHRoZSBjb3N0IG9mIG1vcmUgbWVtb3J5IGFuZCB0aW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFpPMVpfOTk5X01FTV9DT01QUkVTUyAgKChsem9fdWludDMyX3QpICgxNCAqIDE2Mzg0TCAqIHNpemVvZihzaG9ydCkpKQorCitMWk9fRVhURVJOKGludCkKK2x6bzF6Xzk5OV9jb21wcmVzcyAgICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMWk9fRVhURVJOKGludCkKK2x6bzF6Xzk5OV9jb21wcmVzc19kaWN0ICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbHpvX2J5dGVwIGRpY3QsIGx6b191aW50IGRpY3RfbGVuICk7CisKK0xaT19FWFRFUk4oaW50KQorbHpvMXpfOTk5X2NvbXByZXNzX2xldmVsICAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fY2FsbGJhY2tfcCBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wcmVzc2lvbl9sZXZlbCApOworCitMWk9fRVhURVJOKGludCkKK2x6bzF6X2RlY29tcHJlc3NfZGljdF9zYWZlICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4gKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBhbHJlYWR5IGluY2x1ZGVkICovCisKKworLyogdmltOnNldCB0cz00IGV0OiAqLwpkaWZmIC0tZ2l0IGEvbHpvL2luY2x1ZGUvbHpvL2x6bzJhLmggYi9sem8vaW5jbHVkZS9sem8vbHpvMmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzllZjJlCi0tLSAvZGV2L251bGwKKysrIGIvbHpvL2luY2x1ZGUvbHpvL2x6bzJhLmgKQEAgLTAsMCArMSw4MCBAQAorLyogbHpvMmEuaCAtLSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoZSBMWk8yQSBjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaWZuZGVmIF9fTFpPMkFfSF9JTkNMVURFRAorI2RlZmluZSBfX0xaTzJBX0hfSU5DTFVERUQgMQorCisjaWZuZGVmIF9fTFpPQ09ORl9IX0lOQ0xVREVECisjaW5jbHVkZSAibHpvY29uZi5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFpPMkFfTUVNX0RFQ09NUFJFU1MgICAgKDApCisKKy8qIGRlY29tcHJlc3Npb24gKi8KK0xaT19FWFRFUk4oaW50KQorbHpvMmFfZGVjb21wcmVzcyAgICAgICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gLyogTk9UIFVTRUQgKi8gKTsKKworLyogc2FmZSBkZWNvbXByZXNzaW9uIHdpdGggb3ZlcnJ1biB0ZXN0aW5nICovCitMWk9fRVhURVJOKGludCkKK2x6bzJhX2RlY29tcHJlc3Nfc2FmZSAgICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBiZXR0ZXIgY29tcHJlc3Npb24gcmF0aW8gYXQgdGhlIGNvc3Qgb2YgbW9yZSBtZW1vcnkgYW5kIHRpbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMWk8yQV85OTlfTUVNX0NPTVBSRVNTICAoKGx6b191aW50MzJfdCkgKDggKiAxNjM4NEwgKiBzaXplb2Yoc2hvcnQpKSkKKworTFpPX0VYVEVSTihpbnQpCitsem8yYV85OTlfY29tcHJlc3MgICAgICAoIGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisKKy8qIHZpbTpzZXQgdHM9NCBldDogKi8KZGlmZiAtLWdpdCBhL2x6by9pbmNsdWRlL2x6by9sem9fYXNtLmggYi9sem8vaW5jbHVkZS9sem8vbHpvX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjZmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vaW5jbHVkZS9sem8vbHpvX2FzbS5oCkBAIC0wLDAgKzEsMTQwIEBACisvKiBsem9fYXNtLmggLS0gYXNzZW1ibGVyIHByb3RvdHlwZXMgZm9yIHRoZSBMWk8gZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2lmbmRlZiBfX0xaT19BU01fSF9JTkNMVURFRAorI2RlZmluZSBfX0xaT19BU01fSF9JTkNMVURFRCAxCisKKyNpZm5kZWYgX19MWk9DT05GX0hfSU5DTFVERUQKKyNpbmNsdWRlICJsem9jb25mLmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gaTM4NiBhc3NlbWJseSBkZWNvbXByZXNzb3JzCisvLworLy8gTk9URToKKy8vID09PT0KKy8vCisvLyAtIEZvciByZWFzb25zIG9mIHNwZWVkIGFsbCBmYXN0IGFzc2VtYmxlciBkZWNvbXByZXNzb3JzIChoYXZpbmcgJ19mYXN0JworLy8gICBpbiB0aGVpciBuYW1lKSBjYW4gYWNjZXNzICh3cml0ZSB0bykgdXAgdG8gMyBieXRlcyBwYXN0IHRoZSBlbmQgb2YKKy8vICAgdGhlIGRlY29tcHJlc3NlZCAoImRzdCIpIGJsb2NrLiBEYXRhIHBhc3QgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZAorLy8gICAoInNyYyIpIGJsb2NrIGlzIG5ldmVyIGFjY2Vzc2VkIChyZWFkIGZyb20pLgorLy8gICBbIHRlY2huaWNhbCBub3RlOiBiZWNhdXNlIGRhdGEgaXMgdHJhbnNmZXJyZWQgaW4gMzItYml0IHVuaXRzIF0KKy8vCisvLyAtIFBsZWFzZSBhbHNvIHNlZSBhc20vaTM4Ni8wMFJFQURNRS5UWFQgYW5kIGRvYy9MWk8uRkFRIGZvciBtb3JlCisvLyAgIGltcG9ydGFudCBkZXRhaWxzIGFib3V0IHRoZSBhc3NlbWJsZXIgdmVyc2lvbnMuCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMWk9fRVhURVJOKGludCkgbHpvMWNfZGVjb21wcmVzc19hc20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtKTsKK0xaT19FWFRFUk4oaW50KSBsem8xY19kZWNvbXByZXNzX2FzbV9zYWZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSk7CisKK0xaT19FWFRFUk4oaW50KSBsem8xZl9kZWNvbXByZXNzX2FzbV9mYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSk7CitMWk9fRVhURVJOKGludCkgbHpvMWZfZGVjb21wcmVzc19hc21fZmFzdF9zYWZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSk7CisKK0xaT19FWFRFUk4oaW50KSBsem8xeF9kZWNvbXByZXNzX2FzbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0pOworTFpPX0VYVEVSTihpbnQpIGx6bzF4X2RlY29tcHJlc3NfYXNtX3NhZmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtKTsKK0xaT19FWFRFUk4oaW50KSBsem8xeF9kZWNvbXByZXNzX2FzbV9mYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSk7CitMWk9fRVhURVJOKGludCkgbHpvMXhfZGVjb21wcmVzc19hc21fZmFzdF9zYWZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSk7CisKK0xaT19FWFRFUk4oaW50KSBsem8xeV9kZWNvbXByZXNzX2FzbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0pOworTFpPX0VYVEVSTihpbnQpIGx6bzF5X2RlY29tcHJlc3NfYXNtX3NhZmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtKTsKK0xaT19FWFRFUk4oaW50KSBsem8xeV9kZWNvbXByZXNzX2FzbV9mYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSk7CitMWk9fRVhURVJOKGludCkgbHpvMXlfZGVjb21wcmVzc19hc21fZmFzdF9zYWZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBjaGVja3N1bSBhbmQgbWlzYyBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIDAKKworTFpPX0VYVEVSTihsem9fdWludDMyX3QpCitsem9fY3JjMzJfYXNtKGx6b191aW50MzJfdCBjLCBjb25zdCBsem9fYnl0ZXAgYnVmLCBsem9fdWludCBsZW4sCisgICAgICAgICAgICAgIGNvbnN0IGx6b191aW50MzJfdHAgdGFiKTsKKworTFpPX0VYVEVSTihsem9fdWludDMyX3QpCitsem9fY3JjMzJfYXNtX3NtYWxsKGx6b191aW50MzJfdCBjLCBjb25zdCBsem9fYnl0ZXAgYnVmLCBsem9fdWludCBsZW4pOworCitMWk9fRVhURVJOKGludCkKK2x6b19jcHVpZF9hc20obHpvX3VpbnQzMl90cCAvKiBsem9fdWludDMyX3QgaW5mb1sxNl0gKi8gKTsKKworTFpPX0VYVEVSTihsem9fdWludDMyX3QpCitsem9fcmR0c2NfYXNtKGx6b191aW50MzJfdHAgLyogbHpvX3VpbnQzMl90IHRpY2tzWzJdICovICk7CisKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmIC8qIGFscmVhZHkgaW5jbHVkZWQgKi8KKworCisvKiB2aW06c2V0IHRzPTQgZXQ6ICovCmRpZmYgLS1naXQgYS9sem8vaW5jbHVkZS9sem8vbHpvY29uZi5oIGIvbHpvL2luY2x1ZGUvbHpvL2x6b2NvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZiMjAyCi0tLSAvZGV2L251bGwKKysrIGIvbHpvL2luY2x1ZGUvbHpvL2x6b2NvbmYuaApAQCAtMCwwICsxLDQ0NCBAQAorLyogbHpvY29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIExaTyBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaWZuZGVmIF9fTFpPQ09ORl9IX0lOQ0xVREVECisjZGVmaW5lIF9fTFpPQ09ORl9IX0lOQ0xVREVEIDEKKworI2RlZmluZSBMWk9fVkVSU0lPTiAgICAgICAgICAgICAweDIwNzAKKyNkZWZpbmUgTFpPX1ZFUlNJT05fU1RSSU5HICAgICAgIjIuMDciCisjZGVmaW5lIExaT19WRVJTSU9OX0RBVEUgICAgICAgICJKdW4gMjUgMjAxNCIKKworLyogaW50ZXJuYWwgQXV0b2NvbmYgY29uZmlndXJhdGlvbiBmaWxlIC0gb25seSB1c2VkIHdoZW4gYnVpbGRpbmcgTFpPICovCisjaWYgZGVmaW5lZChMWk9fSEFWRV9DT05GSUdfSCkKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBMWk8gcmVxdWlyZXMgYSBjb25mb3JtaW5nIDxsaW1pdHMuaD4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKENIQVJfQklUKSB8fCAoQ0hBUl9CSVQgIT0gOCkKKyMgIGVycm9yICJpbnZhbGlkIENIQVJfQklUIgorI2VuZGlmCisjaWYgIWRlZmluZWQoVUNIQVJfTUFYKSB8fCAhZGVmaW5lZChVU0hSVF9NQVgpIHx8ICFkZWZpbmVkKFVJTlRfTUFYKSB8fCAhZGVmaW5lZChVTE9OR19NQVgpCisjICBlcnJvciAiY2hlY2sgeW91ciBjb21waWxlciBpbnN0YWxsYXRpb24iCisjZW5kaWYKKyNpZiAoVVNIUlRfTUFYIDwgMSkgfHwgKFVJTlRfTUFYIDwgMSkgfHwgKFVMT05HX01BWCA8IDEpCisjICBlcnJvciAieW91ciBsaW1pdHMuaCBtYWNyb3MgYXJlIGJyb2tlbiIKKyNlbmRpZgorCisvKiBnZXQgT1MgYW5kIGFyY2hpdGVjdHVyZSBkZWZpbmVzICovCisjaWZuZGVmIF9fTFpPREVGU19IX0lOQ0xVREVECisjaW5jbHVkZSAibHpvZGVmcy5oIgorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gc29tZSBjb3JlIGRlZmluZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbWVtb3J5IGNoZWNrZXJzICovCisjaWYgIWRlZmluZWQoX19MWk9fQ0hFQ0tFUikKKyMgIGlmIGRlZmluZWQoX19CT1VORFNfQ0hFQ0tJTkdfT04pCisjICAgIGRlZmluZSBfX0xaT19DSEVDS0VSICAgICAgIDEKKyMgIGVsaWYgZGVmaW5lZChfX0NIRUNLRVJfXykKKyMgICAgZGVmaW5lIF9fTFpPX0NIRUNLRVIgICAgICAgMQorIyAgZWxpZiBkZWZpbmVkKF9fSU5TVVJFX18pCisjICAgIGRlZmluZSBfX0xaT19DSEVDS0VSICAgICAgIDEKKyMgIGVsaWYgZGVmaW5lZChfX1BVUklGWV9fKQorIyAgICBkZWZpbmUgX19MWk9fQ0hFQ0tFUiAgICAgICAxCisjICBlbmRpZgorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBpbnRlZ3JhbCBhbmQgcG9pbnRlciB0eXBlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBsem9fdWludCBtdXN0IG1hdGNoIHNpemVfdCAqLworI2lmICFkZWZpbmVkKExaT19VSU5UX01BWCkKKyMgIGlmIChMWk9fQUJJX0xMUDY0KQorIyAgICBpZiAoTFpPX09TX1dJTjY0KQorICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICBsem9fdWludDsKKyAgICAgdHlwZWRlZiBfX2ludDY0ICAgICAgICAgICAgbHpvX2ludDsKKyMgICAgZWxzZQorICAgICB0eXBlZGVmIGx6b191bGxvbmdfdCAgICAgICBsem9fdWludDsKKyAgICAgdHlwZWRlZiBsem9fbGxvbmdfdCAgICAgICAgbHpvX2ludDsKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1VJTlQgOAorIyAgICBkZWZpbmUgTFpPX1VJTlRfTUFYICAgICAgICAweGZmZmZmZmZmZmZmZmZmZmZ1bGwKKyMgICAgZGVmaW5lIExaT19JTlRfTUFYICAgICAgICAgOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjICAgIGRlZmluZSBMWk9fSU5UX01JTiAgICAgICAgICgtMUxMIC0gTFpPX0lOVF9NQVgpCisjICBlbGlmIChMWk9fQUJJX0lQMzJMNjQpIC8qIE1JUFMgUjU5MDAgKi8KKyAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgbHpvX3VpbnQ7CisgICAgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgIGx6b19pbnQ7CisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xaT19VSU5UIExaT19TSVpFT0ZfSU5UCisjICAgIGRlZmluZSBMWk9fVUlOVF9NQVggICAgICAgIFVJTlRfTUFYCisjICAgIGRlZmluZSBMWk9fSU5UX01BWCAgICAgICAgIElOVF9NQVgKKyMgICAgZGVmaW5lIExaT19JTlRfTUlOICAgICAgICAgSU5UX01JTgorIyAgZWxpZiAoVUxPTkdfTUFYID49IExaT18weGZmZmZmZmZmTCkKKyAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgbHpvX3VpbnQ7CisgICAgIHR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgIGx6b19pbnQ7CisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xaT19VSU5UIExaT19TSVpFT0ZfTE9ORworIyAgICBkZWZpbmUgTFpPX1VJTlRfTUFYICAgICAgICBVTE9OR19NQVgKKyMgICAgZGVmaW5lIExaT19JTlRfTUFYICAgICAgICAgTE9OR19NQVgKKyMgICAgZGVmaW5lIExaT19JTlRfTUlOICAgICAgICAgTE9OR19NSU4KKyMgIGVsc2UKKyMgICAgZXJyb3IgImx6b191aW50IgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgbGFyZ2VyIHR5cGUgb2YgbHpvX3VpbnQgYW5kIGx6b191aW50MzJfdC4gKi8KKyNpZiAoTFpPX1NJWkVPRl9MWk9fVUlOVCA+PSA0KQorIyAgZGVmaW5lIGx6b194aW50ICAgICAgICAgICAgICBsem9fdWludAorI2Vsc2UKKyMgIGRlZmluZSBsem9feGludCAgICAgICAgICAgICAgbHpvX3VpbnQzMl90CisjZW5kaWYKKwordHlwZWRlZiBpbnQgbHpvX2Jvb2w7CisKKy8qIHNhbml0eSBjaGVja3MgKi8KK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3VpbnQpID09IExaT19TSVpFT0ZfTFpPX1VJTlQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b194aW50KSA+PSBzaXplb2YobHpvX3VpbnQpKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9feGludCkgPj0gc2l6ZW9mKGx6b191aW50MzJfdCkpCisKKyNpZm5kZWYgX19MWk9fTU1PREVMCisjZGVmaW5lIF9fTFpPX01NT0RFTCAgICAgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisKKy8qIG5vIHR5cGVkZWYgaGVyZSBiZWNhdXNlIG9mIGNvbnN0LXBvaW50ZXIgaXNzdWVzICovCisjZGVmaW5lIGx6b19ieXRlcCAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX2NoYXJwICAgICAgICAgICAgICAgY2hhciBfX0xaT19NTU9ERUwgKgorI2RlZmluZSBsem9fdm9pZHAgICAgICAgICAgICAgICB2b2lkIF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIGx6b19zaG9ydHAgICAgICAgICAgICAgIHNob3J0IF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIGx6b191c2hvcnRwICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIGx6b19pbnRwICAgICAgICAgICAgICAgIGx6b19pbnQgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3VpbnRwICAgICAgICAgICAgICAgbHpvX3VpbnQgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3hpbnRwICAgICAgICAgICAgICAgbHpvX3hpbnQgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3ZvaWRwcCAgICAgICAgICAgICAgbHpvX3ZvaWRwIF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIGx6b19ieXRlcHAgICAgICAgICAgICAgIGx6b19ieXRlcCBfX0xaT19NTU9ERUwgKgorCisjZGVmaW5lIGx6b19pbnQ4X3RwICAgICAgICAgICAgIGx6b19pbnQ4X3QgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3VpbnQ4X3RwICAgICAgICAgICAgbHpvX3VpbnQ4X3QgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX2ludDE2X3RwICAgICAgICAgICAgbHpvX2ludDE2X3QgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3VpbnQxNl90cCAgICAgICAgICAgbHpvX3VpbnQxNl90IF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIGx6b19pbnQzMl90cCAgICAgICAgICAgIGx6b19pbnQzMl90IF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIGx6b191aW50MzJfdHAgICAgICAgICAgIGx6b191aW50MzJfdCBfX0xaT19NTU9ERUwgKgorI2lmIGRlZmluZWQobHpvX2ludDY0X3QpCisjZGVmaW5lIGx6b19pbnQ2NF90cCAgICAgICAgICAgIGx6b19pbnQ2NF90IF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIGx6b191aW50NjRfdHAgICAgICAgICAgIGx6b191aW50NjRfdCBfX0xaT19NTU9ERUwgKgorI2VuZGlmCisKKy8qIE9sZGVyIExaTyB2ZXJzaW9ucyB1c2VkIHRvIHN1cHBvcnQgYW5jaWVudCBzeXN0ZW1zIGFuZCBtZW1vcnkgbW9kZWxzCisgKiBsaWtlIDE2LWJpdCBNU0RPUyB3aXRoIF9faHVnZSBwb2ludGVycyBhbmQgQ3JheSBQVlAsIGJ1dCB0aGVzZQorICogb2Jzb2xldGUgY29uZmlndXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYW55IGxvbmdlci4KKyAqLworI2lmIGRlZmluZWQoX19MWk9fTU1PREVMX0hVR0UpCisjZXJyb3IgIl9fTFpPX01NT0RFTF9IVUdFIGlzIHVuc3VwcG9ydGVkIgorI2VuZGlmCisjaWYgKExaT19NTV9QVlApCisjZXJyb3IgIkxaT19NTV9QVlAgaXMgdW5zdXBwb3J0ZWQiCisjZW5kaWYKKyNpZiAoTFpPX1NJWkVPRl9JTlQgPCA0KQorI2Vycm9yICJMWk9fU0laRU9GX0lOVCA8IDQgaXMgdW5zdXBwb3J0ZWQiCisjZW5kaWYKKyNpZiAoX19MWk9fVUlOVFBUUl9UX0lTX1BPSU5URVIpCisjZXJyb3IgIl9fTFpPX1VJTlRQVFJfVF9JU19QT0lOVEVSIGlzIHVuc3VwcG9ydGVkIgorI2VuZGlmCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGludCkgPj0gNCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3VpbnQpID49IDQpCisvKiBTdHJhbmdlIGNvbmZpZ3VyYXRpb25zIHdoZXJlIHNpemVvZihsem9fdWludCkgIT0gc2l6ZW9mKHNpemVfdCkgc2hvdWxkCisgKiB3b3JrIGJ1dCBoYXZlIG5vdCByZWNlaXZlZCBtdWNoIHRlc3RpbmcgbGF0ZWx5LCBzbyBiZSBzdHJpY3QgaGVyZS4KKyAqLworTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludCkgPT0gc2l6ZW9mKHNpemVfdCkpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b191aW50KSA9PSBzaXplb2YocHRyZGlmZl90KSkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3VpbnQpID09IHNpemVvZihsem9fdWludHB0cl90KSkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2Yodm9pZCAqKSAgID09IHNpemVvZihsem9fdWludHB0cl90KSkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YoY2hhciAqKSAgID09IHNpemVvZihsem9fdWludHB0cl90KSkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobG9uZyAqKSAgID09IHNpemVvZihsem9fdWludHB0cl90KSkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2Yodm9pZCAqKSAgID09IHNpemVvZihsem9fdm9pZHApKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihjaGFyICopICAgPT0gc2l6ZW9mKGx6b19ieXRlcCkpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBmdW5jdGlvbiB0eXBlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBuYW1lIG1hbmdsaW5nICovCisjaWYgIWRlZmluZWQoX19MWk9fRVhURVJOX0MpCisjICBpZmRlZiBfX2NwbHVzcGx1cworIyAgICBkZWZpbmUgX19MWk9fRVhURVJOX0MgICAgICBleHRlcm4gIkMiCisjICBlbHNlCisjICAgIGRlZmluZSBfX0xaT19FWFRFUk5fQyAgICAgIGV4dGVybgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBjYWxsaW5nIGNvbnZlbnRpb24gKi8KKyNpZiAhZGVmaW5lZChfX0xaT19DREVDTCkKKyMgIGRlZmluZSBfX0xaT19DREVDTCAgICAgICAgICAgX19sem9fY2RlY2wKKyNlbmRpZgorCisvKiBETEwgZXhwb3J0IGluZm9ybWF0aW9uICovCisjaWYgIWRlZmluZWQoX19MWk9fRVhQT1JUMSkKKyMgIGRlZmluZSBfX0xaT19FWFBPUlQxICAgICAgICAgLyplbXB0eSovCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX0xaT19FWFBPUlQyKQorIyAgZGVmaW5lIF9fTFpPX0VYUE9SVDIgICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorCisvKiBfX2NkZWNsIGNhbGxpbmcgY29udmVudGlvbiBmb3IgcHVibGljIEMgYW5kIGFzc2VtYmx5IGZ1bmN0aW9ucyAqLworI2lmICFkZWZpbmVkKExaT19QVUJMSUMpCisjICBkZWZpbmUgTFpPX1BVQkxJQyhfcmV0dHlwZSkgIF9fTFpPX0VYUE9SVDEgX3JldHR5cGUgX19MWk9fRVhQT1JUMiBfX0xaT19DREVDTAorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0VYVEVSTikKKyMgIGRlZmluZSBMWk9fRVhURVJOKF9yZXR0eXBlKSAgX19MWk9fRVhURVJOX0MgTFpPX1BVQkxJQyhfcmV0dHlwZSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19QUklWQVRFKQorIyAgZGVmaW5lIExaT19QUklWQVRFKF9yZXR0eXBlKSBzdGF0aWMgX3JldHR5cGUgX19MWk9fQ0RFQ0wKKyNlbmRpZgorCisvKiBmdW5jdGlvbiB0eXBlcyAqLwordHlwZWRlZiBpbnQKKyhfX0xaT19DREVDTCAqbHpvX2NvbXByZXNzX3QpICAgKCBjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICk7CisKK3R5cGVkZWYgaW50CisoX19MWk9fQ0RFQ0wgKmx6b19kZWNvbXByZXNzX3QpICggY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApOworCit0eXBlZGVmIGludAorKF9fTFpPX0NERUNMICpsem9fb3B0aW1pemVfdCkgICAoICAgICAgIGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKTsKKwordHlwZWRlZiBpbnQKKyhfX0xaT19DREVDTCAqbHpvX2NvbXByZXNzX2RpY3RfdCkoY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4gKTsKKwordHlwZWRlZiBpbnQKKyhfX0xaT19DREVDTCAqbHpvX2RlY29tcHJlc3NfZGljdF90KShjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGx6b19ieXRlcCBkaWN0LCBsem9fdWludCBkaWN0X2xlbiApOworCisKKy8qIENhbGxiYWNrIGludGVyZmFjZS4gQ3VycmVudGx5IG9ubHkgdGhlIHByb2dyZXNzIGluZGljYXRvciAoIm5wcm9ncmVzcyIpCisgKiBpcyB1c2VkLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIGEgZnV0dXJlIHJlbGVhc2UuICovCisKK3N0cnVjdCBsem9fY2FsbGJhY2tfdDsKK3R5cGVkZWYgc3RydWN0IGx6b19jYWxsYmFja190IGx6b19jYWxsYmFja190OworI2RlZmluZSBsem9fY2FsbGJhY2tfcCBsem9fY2FsbGJhY2tfdCBfX0xaT19NTU9ERUwgKgorCisvKiBtYWxsb2MgJiBmcmVlIGZ1bmN0aW9uIHR5cGVzICovCit0eXBlZGVmIGx6b192b2lkcCAoX19MWk9fQ0RFQ0wgKmx6b19hbGxvY19mdW5jX3QpCisgICAgKGx6b19jYWxsYmFja19wIHNlbGYsIGx6b191aW50IGl0ZW1zLCBsem9fdWludCBzaXplKTsKK3R5cGVkZWYgdm9pZCAgICAgIChfX0xaT19DREVDTCAqbHpvX2ZyZWVfZnVuY190KQorICAgIChsem9fY2FsbGJhY2tfcCBzZWxmLCBsem9fdm9pZHAgcHRyKTsKKworLyogYSBwcm9ncmVzcyBpbmRpY2F0b3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgdm9pZCAoX19MWk9fQ0RFQ0wgKmx6b19wcm9ncmVzc19mdW5jX3QpCisgICAgKGx6b19jYWxsYmFja19wLCBsem9fdWludCwgbHpvX3VpbnQsIGludCk7CisKK3N0cnVjdCBsem9fY2FsbGJhY2tfdAoreworICAgIC8qIGN1c3RvbSBhbGxvY2F0b3JzIChzZXQgdG8gMCB0byBkaXNhYmxlKSAqLworICAgIGx6b19hbGxvY19mdW5jX3QgbmFsbG9jOyAgICAgICAgICAgICAgICAvKiBbbm90IHVzZWQgcmlnaHQgbm93XSAqLworICAgIGx6b19mcmVlX2Z1bmNfdCBuZnJlZTsgICAgICAgICAgICAgICAgICAvKiBbbm90IHVzZWQgcmlnaHQgbm93XSAqLworCisgICAgLyogYSBwcm9ncmVzcyBpbmRpY2F0b3IgY2FsbGJhY2sgZnVuY3Rpb24gKHNldCB0byAwIHRvIGRpc2FibGUpICovCisgICAgbHpvX3Byb2dyZXNzX2Z1bmNfdCBucHJvZ3Jlc3M7CisKKyAgICAvKiBJTkZPOiB0aGUgZmlyc3QgcGFyYW1ldGVyICJzZWxmIiBvZiB0aGUgbmFsbG9jL25mcmVlL25wcm9ncmVzcworICAgICAqIGNhbGxiYWNrcyBwb2ludHMgYmFjayB0byB0aGlzIHN0cnVjdCwgc28geW91IGFyZSBmcmVlIHRvIHN0b3JlCisgICAgICogc29tZSBleHRyYSBpbmZvIGluIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzLiAqLworICAgIGx6b192b2lkcCB1c2VyMTsKKyAgICBsem9feGludCB1c2VyMjsKKyAgICBsem9feGludCB1c2VyMzsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBlcnJvciBjb2RlcyBhbmQgcHJvdG90eXBlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQorICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyB3aWxsIGJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0CisgKiBub3JtYWwgZXZlbnRzLgorICovCisjZGVmaW5lIExaT19FX09LICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExaT19FX0VSUk9SICAgICAgICAgICAgICAgICAoLTEpCisjZGVmaW5lIExaT19FX09VVF9PRl9NRU1PUlkgICAgICAgICAoLTIpICAgIC8qIFtsem9fYWxsb2NfZnVuY190IGZhaWx1cmVdICovCisjZGVmaW5lIExaT19FX05PVF9DT01QUkVTU0lCTEUgICAgICAoLTMpICAgIC8qIFtub3QgdXNlZCByaWdodCBub3ddICovCisjZGVmaW5lIExaT19FX0lOUFVUX09WRVJSVU4gICAgICAgICAoLTQpCisjZGVmaW5lIExaT19FX09VVFBVVF9PVkVSUlVOICAgICAgICAoLTUpCisjZGVmaW5lIExaT19FX0xPT0tCRUhJTkRfT1ZFUlJVTiAgICAoLTYpCisjZGVmaW5lIExaT19FX0VPRl9OT1RfRk9VTkQgICAgICAgICAoLTcpCisjZGVmaW5lIExaT19FX0lOUFVUX05PVF9DT05TVU1FRCAgICAoLTgpCisjZGVmaW5lIExaT19FX05PVF9ZRVRfSU1QTEVNRU5URUQgICAoLTkpICAgIC8qIFtub3QgdXNlZCByaWdodCBub3ddICovCisjZGVmaW5lIExaT19FX0lOVkFMSURfQVJHVU1FTlQgICAgICAoLTEwKQorI2RlZmluZSBMWk9fRV9JTlZBTElEX0FMSUdOTUVOVCAgICAgKC0xMSkgICAvKiBwb2ludGVyIGFyZ3VtZW50IGlzIG5vdCBwcm9wZXJseSBhbGlnbmVkICovCisjZGVmaW5lIExaT19FX09VVFBVVF9OT1RfQ09OU1VNRUQgICAoLTEyKQorI2RlZmluZSBMWk9fRV9JTlRFUk5BTF9FUlJPUiAgICAgICAgKC05OSkKKworCisjaWZuZGVmIGx6b19zaXplb2ZfZGljdF90CisjICBkZWZpbmUgbHpvX3NpemVvZl9kaWN0X3QgICAgICgodW5zaWduZWQpc2l6ZW9mKGx6b19ieXRlcCkpCisjZW5kaWYKKworLyogbHpvX2luaXQoKSBzaG91bGQgYmUgdGhlIGZpcnN0IGZ1bmN0aW9uIHlvdSBjYWxsLgorICogQ2hlY2sgdGhlIHJldHVybiBjb2RlICEKKyAqCisgKiBsem9faW5pdCgpIGlzIGEgbWFjcm8gdG8gYWxsb3cgY2hlY2tpbmcgdGhhdCB0aGUgbGlicmFyeSBhbmQgdGhlCisgKiBjb21waWxlcidzIHZpZXcgb2YgdmFyaW91cyB0eXBlcyBhcmUgY29uc2lzdGVudC4KKyAqLworI2RlZmluZSBsem9faW5pdCgpIF9fbHpvX2luaXRfdjIoTFpPX1ZFUlNJT04sKGludClzaXplb2Yoc2hvcnQpLChpbnQpc2l6ZW9mKGludCksXAorICAgIChpbnQpc2l6ZW9mKGxvbmcpLChpbnQpc2l6ZW9mKGx6b191aW50MzJfdCksKGludClzaXplb2YobHpvX3VpbnQpLFwKKyAgICAoaW50KWx6b19zaXplb2ZfZGljdF90LChpbnQpc2l6ZW9mKGNoYXIgKiksKGludClzaXplb2YobHpvX3ZvaWRwKSxcCisgICAgKGludClzaXplb2YobHpvX2NhbGxiYWNrX3QpKQorTFpPX0VYVEVSTihpbnQpIF9fbHpvX2luaXRfdjIodW5zaWduZWQsaW50LGludCxpbnQsaW50LGludCxpbnQsaW50LGludCxpbnQpOworCisvKiB2ZXJzaW9uIGZ1bmN0aW9ucyAodXNlZnVsIGZvciBzaGFyZWQgbGlicmFyaWVzKSAqLworTFpPX0VYVEVSTih1bnNpZ25lZCkgbHpvX3ZlcnNpb24odm9pZCk7CitMWk9fRVhURVJOKGNvbnN0IGNoYXIgKikgbHpvX3ZlcnNpb25fc3RyaW5nKHZvaWQpOworTFpPX0VYVEVSTihjb25zdCBjaGFyICopIGx6b192ZXJzaW9uX2RhdGUodm9pZCk7CitMWk9fRVhURVJOKGNvbnN0IGx6b19jaGFycCkgX2x6b192ZXJzaW9uX3N0cmluZyh2b2lkKTsKK0xaT19FWFRFUk4oY29uc3QgbHpvX2NoYXJwKSBfbHpvX3ZlcnNpb25fZGF0ZSh2b2lkKTsKKworLyogc3RyaW5nIGZ1bmN0aW9ucyAqLworTFpPX0VYVEVSTihpbnQpCisgICAgbHpvX21lbWNtcChjb25zdCBsem9fdm9pZHAgYSwgY29uc3QgbHpvX3ZvaWRwIGIsIGx6b191aW50IGxlbik7CitMWk9fRVhURVJOKGx6b192b2lkcCkKKyAgICBsem9fbWVtY3B5KGx6b192b2lkcCBkc3QsIGNvbnN0IGx6b192b2lkcCBzcmMsIGx6b191aW50IGxlbik7CitMWk9fRVhURVJOKGx6b192b2lkcCkKKyAgICBsem9fbWVtbW92ZShsem9fdm9pZHAgZHN0LCBjb25zdCBsem9fdm9pZHAgc3JjLCBsem9fdWludCBsZW4pOworTFpPX0VYVEVSTihsem9fdm9pZHApCisgICAgbHpvX21lbXNldChsem9fdm9pZHAgYnVmLCBpbnQgYywgbHpvX3VpbnQgbGVuKTsKKworLyogY2hlY2tzdW0gZnVuY3Rpb25zICovCitMWk9fRVhURVJOKGx6b191aW50MzJfdCkKKyAgICBsem9fYWRsZXIzMihsem9fdWludDMyX3QgYywgY29uc3QgbHpvX2J5dGVwIGJ1ZiwgbHpvX3VpbnQgbGVuKTsKK0xaT19FWFRFUk4obHpvX3VpbnQzMl90KQorICAgIGx6b19jcmMzMihsem9fdWludDMyX3QgYywgY29uc3QgbHpvX2J5dGVwIGJ1ZiwgbHpvX3VpbnQgbGVuKTsKK0xaT19FWFRFUk4oY29uc3QgbHpvX3VpbnQzMl90cCkKKyAgICBsem9fZ2V0X2NyYzMyX3RhYmxlKHZvaWQpOworCisvKiBtaXNjLiAqLworTFpPX0VYVEVSTihpbnQpIF9sem9fY29uZmlnX2NoZWNrKHZvaWQpOwordHlwZWRlZiB1bmlvbiB7CisgICAgbHpvX3ZvaWRwIGEwMDsgbHpvX2J5dGVwIGEwMTsgbHpvX3VpbnQgYTAyOyBsem9feGludCBhMDM7IGx6b191aW50cHRyX3QgYTA0OworICAgIHZvaWQgKmEwNTsgdW5zaWduZWQgY2hhciAqYTA2OyB1bnNpZ25lZCBsb25nIGEwNzsgc2l6ZV90IGEwODsgcHRyZGlmZl90IGEwOTsKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NF90KQorICAgIGx6b191aW50NjRfdCBhMTA7CisjZW5kaWYKK30gbHpvX2FsaWduX3Q7CisKKy8qIGFsaWduIGEgY2hhciBwb2ludGVyIG9uIGEgYm91bmRhcnkgdGhhdCBpcyBhIG11bHRpcGxlIG9mICdzaXplJyAqLworTFpPX0VYVEVSTih1bnNpZ25lZCkgX19sem9fYWxpZ25fZ2FwKGNvbnN0IGx6b192b2lkcCBwLCBsem9fdWludCBzaXplKTsKKyNkZWZpbmUgTFpPX1BUUl9BTElHTl9VUChwLHNpemUpIFwKKyAgICAoKHApICsgKGx6b191aW50KSBfX2x6b19hbGlnbl9nYXAoKGNvbnN0IGx6b192b2lkcCkocCksKGx6b191aW50KShzaXplKSkpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBkZXByZWNhdGVkIG1hY3JvcyAtIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGVwcmVjYXRlZCAtIHVzZSAnbHpvX2J5dGVwJyBpbnN0ZWFkIG9mICdsem9fYnl0ZSAqJyAqLworI2RlZmluZSBsem9fYnl0ZSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyCisvKiBkZXByZWNhdGVkIHR5cGUgbmFtZXMgKi8KKyNkZWZpbmUgbHpvX2ludDMyICAgICAgICAgICAgICAgbHpvX2ludDMyX3QKKyNkZWZpbmUgbHpvX3VpbnQzMiAgICAgICAgICAgICAgbHpvX3VpbnQzMl90CisjZGVmaW5lIGx6b19pbnQzMnAgICAgICAgICAgICAgIGx6b19pbnQzMl90IF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIGx6b191aW50MzJwICAgICAgICAgICAgIGx6b191aW50MzJfdCBfX0xaT19NTU9ERUwgKgorI2RlZmluZSBMWk9fSU5UMzJfTUFYICAgICAgICAgICBMWk9fSU5UMzJfQygyMTQ3NDgzNjQ3KQorI2RlZmluZSBMWk9fVUlOVDMyX01BWCAgICAgICAgICBMWk9fVUlOVDMyX0MoNDI5NDk2NzI5NSkKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NF90KQorI2RlZmluZSBsem9faW50NjQgICAgICAgICAgICAgICBsem9faW50NjRfdAorI2RlZmluZSBsem9fdWludDY0ICAgICAgICAgICAgICBsem9fdWludDY0X3QKKyNkZWZpbmUgbHpvX2ludDY0cCAgICAgICAgICAgICAgbHpvX2ludDY0X3QgX19MWk9fTU1PREVMICoKKyNkZWZpbmUgbHpvX3VpbnQ2NHAgICAgICAgICAgICAgbHpvX3VpbnQ2NF90IF9fTFpPX01NT0RFTCAqCisjZGVmaW5lIExaT19JTlQ2NF9NQVggICAgICAgICAgIExaT19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpCisjZGVmaW5lIExaT19VSU5UNjRfTUFYICAgICAgICAgIExaT19VSU5UNjRfQygxODQ0Njc0NDA3MzcwOTU1MTYxNSkKKyNlbmRpZgorLyogZGVwcmVjYXRlZCB0eXBlcyAqLwordHlwZWRlZiB1bmlvbiB7IGx6b19ieXRlcCBhOyBsem9fdWludCBiOyB9IF9fbHpvX3B1X3U7Cit0eXBlZGVmIHVuaW9uIHsgbHpvX2J5dGVwIGE7IGx6b191aW50MzJfdCBiOyB9IF9fbHpvX3B1MzJfdTsKKworI2lmIGRlZmluZWQoTFpPX0NGR19DT01QQVQpCisKKyNkZWZpbmUgX19MWk9DT05GX0ggMQorCisjaWYgZGVmaW5lZChMWk9fQVJDSF9JMDg2KQorIyAgZGVmaW5lIF9fTFpPX2kzODYgMQorI2VsaWYgZGVmaW5lZChMWk9fQVJDSF9JMzg2KQorIyAgZGVmaW5lIF9fTFpPX2kzODYgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExaT19PU19ET1MxNikKKyMgIGRlZmluZSBfX0xaT19ET1MgMQorIyAgZGVmaW5lIF9fTFpPX0RPUzE2IDEKKyNlbGlmIGRlZmluZWQoTFpPX09TX0RPUzMyKQorIyAgZGVmaW5lIF9fTFpPX0RPUyAxCisjZWxpZiBkZWZpbmVkKExaT19PU19XSU4xNikKKyMgIGRlZmluZSBfX0xaT19XSU4gMQorIyAgZGVmaW5lIF9fTFpPX1dJTjE2IDEKKyNlbGlmIGRlZmluZWQoTFpPX09TX1dJTjMyKQorIyAgZGVmaW5lIF9fTFpPX1dJTiAxCisjZW5kaWYKKworI2RlZmluZSBfX0xaT19DTU9ERUwgICAgICAgICAgICAvKmVtcHR5Ki8KKyNkZWZpbmUgX19MWk9fRE1PREVMICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIF9fTFpPX0VOVFJZICAgICAgICAgICAgIF9fTFpPX0NERUNMCisjZGVmaW5lIExaT19FWFRFUk5fQ0RFQ0wgICAgICAgIExaT19FWFRFUk4KKyNkZWZpbmUgTFpPX0FMSUdOICAgICAgICAgICAgICAgTFpPX1BUUl9BTElHTl9VUAorCisjZGVmaW5lIGx6b19jb21wcmVzc19hc21fdCAgICAgIGx6b19jb21wcmVzc190CisjZGVmaW5lIGx6b19kZWNvbXByZXNzX2FzbV90ICAgIGx6b19kZWNvbXByZXNzX3QKKworI2VuZGlmIC8qIExaT19DRkdfQ09NUEFUICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisKKy8qIHZpbTpzZXQgdHM9NCBldDogKi8KZGlmZiAtLWdpdCBhL2x6by9pbmNsdWRlL2x6by9sem9kZWZzLmggYi9sem8vaW5jbHVkZS9sem8vbHpvZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YWU5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vaW5jbHVkZS9sem8vbHpvZGVmcy5oCkBAIC0wLDAgKzEsMjk5OCBAQAorLyogbHpvZGVmcy5oIC0tIGFyY2hpdGVjdHVyZSwgT1MgYW5kIGNvbXBpbGVyIHNwZWNpZmljIGRlZmluZXMKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaWZuZGVmIF9fTFpPREVGU19IX0lOQ0xVREVECisjZGVmaW5lIF9fTFpPREVGU19IX0lOQ0xVREVEIDEKKworI2lmIGRlZmluZWQoX19DWUdXSU4zMl9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCisjZW5kaWYKKyNpZiAxICYmIGRlZmluZWQoX19JTlRFUklYKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfQUxMX1NPVVJDRSkKKyMgIGRlZmluZSBfQUxMX1NPVVJDRSAxCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fUjU5MDBfXykKKyMgIGlmICFkZWZpbmVkKF9fTE9OR19NQVhfXykKKyMgICAgZGVmaW5lIF9fTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19DRkdfTk9fRElTQUJMRV9XVU5ERUYpCisjaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pCisjICBwcmFnbWEgZGlhZ19zdXBwcmVzcyAxOTMKKyNlbGlmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9fY2xhbmdfbWlub3JfXykKKyMgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW5kZWYiCisjZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiAxOTMpCisjZWxpZiBkZWZpbmVkKF9fS0VJTF9fKSAmJiBkZWZpbmVkKF9fQzE2Nl9fKQorIyAgcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA9IDMyMgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgIWRlZmluZWQoX19QQVRIU0NBTEVfXykKKyMgIGlmICgoX19HTlVDX18tMCkgPj0gNSB8fCAoKF9fR05VQ19fLTApID09IDQgJiYgKF9fR05VQ19NSU5PUl9fLTApID49IDIpKQorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bmRlZiIKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX2NsYW5nX18pICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmICFkZWZpbmVkKF9fTVdFUktTX18pCisjICBpZiAoKF9NU0NfVkVSLTApID49IDEzMDApCisjICAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ2NjgpCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiAwICYmIGRlZmluZWQoX19QT0NDX18pICYmIGRlZmluZWQoX1dJTjMyKQorIyAgaWYgKF9fUE9DQ19fID49IDQwMCkKKyMgICAgcHJhZ21hIHdhcm4oZGlzYWJsZTogMjIxNikKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAwICYmIGRlZmluZWQoX19XQVRDT01DX18pCisjICBpZiAoX19XQVRDT01DX18gPj0gMTA1MCkgJiYgKF9fV0FUQ09NQ19fIDwgMTA2MCkKKyMgICAgcHJhZ21hIHdhcm5pbmcgMjAzIDkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKQorIyAgcHJhZ21hIG9wdGlvbiAtaAorI2VuZGlmCisjaWYgIShMWk9fQ0ZHX05PX0RJU0FCTEVfV0NSVE5PTlNUREMpCisjaWZuZGVmIF9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUKKyNkZWZpbmUgX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKyNpZm5kZWYgX0NSVF9OT05TVERDX05PX1dBUk5JTkdTCisjZGVmaW5lIF9DUlRfTk9OU1REQ19OT19XQVJOSU5HUyAxCisjZW5kaWYKKyNpZm5kZWYgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKyNpZm5kZWYgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgMQorI2VuZGlmCisjZW5kaWYKKyNpZiAwCisjZGVmaW5lIExaT18weGZmZmZVTCAgICAgICAgICAgIDB4ZmZmZnVsCisjZGVmaW5lIExaT18weGZmZmZmZmZmVUwgICAgICAgIDB4ZmZmZmZmZmZ1bAorI2Vsc2UKKyNkZWZpbmUgTFpPXzB4ZmZmZlVMICAgICAgICAgICAgNjU1MzV1bAorI2RlZmluZSBMWk9fMHhmZmZmZmZmZlVMICAgICAgICA0Mjk0OTY3Mjk1dWwKKyNlbmRpZgorI2RlZmluZSBMWk9fMHhmZmZmTCAgICAgICAgICAgICBMWk9fMHhmZmZmVUwKKyNkZWZpbmUgTFpPXzB4ZmZmZmZmZmZMICAgICAgICAgTFpPXzB4ZmZmZmZmZmZVTAorI2lmIChMWk9fMHhmZmZmTCA9PSBMWk9fMHhmZmZmZmZmZkwpCisjICBlcnJvciAieW91ciBwcmVwcm9jZXNzb3IgaXMgYnJva2VuIDEiCisjZW5kaWYKKyNpZiAoMTZ1bCAqIDE2Mzg0dWwgIT0gMjYyMTQ0dWwpCisjICBlcnJvciAieW91ciBwcmVwcm9jZXNzb3IgaXMgYnJva2VuIDIiCisjZW5kaWYKKyNpZiAwCisjaWYgKDMyNzY3ID49IDQyOTQ5NjcyOTV1bCkKKyMgIGVycm9yICJ5b3VyIHByZXByb2Nlc3NvciBpcyBicm9rZW4gMyIKKyNlbmRpZgorI2lmICg2NTUzNXUgPj0gNDI5NDk2NzI5NXVsKQorIyAgZXJyb3IgInlvdXIgcHJlcHJvY2Vzc29yIGlzIGJyb2tlbiA0IgorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQ09VTlRFUl9fKQorIyAgaWZuZGVmIExaT19DRkdfVVNFX0NPVU5URVIKKyMgIGRlZmluZSBMWk9fQ0ZHX1VTRV9DT1VOVEVSIDEKKyMgIGVuZGlmCisjZWxzZQorIyAgdW5kZWYgTFpPX0NGR19VU0VfQ09VTlRFUgorI2VuZGlmCisjaWYgKFVJTlRfTUFYID09IExaT18weGZmZmZMKQorI2lmIGRlZmluZWQoX19aVENfXykgJiYgZGVmaW5lZChfX0k4Nl9fKSAmJiAhZGVmaW5lZChfX09TMl9fKQorIyAgaWYgIWRlZmluZWQoTVNET1MpCisjICAgIGRlZmluZSBNU0RPUyAxCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoX01TRE9TKQorIyAgICBkZWZpbmUgX01TRE9TIDEKKyMgIGVuZGlmCisjZWxpZiAwICYmIGRlZmluZWQoX19WRVJTSU9OKSAmJiBkZWZpbmVkKE1CX0xFTl9NQVgpCisjICBpZiAoX19WRVJTSU9OID09IDUyMCkgJiYgKE1CX0xFTl9NQVggPT0gMSkKKyMgICAgaWYgIWRlZmluZWQoX19BWlRFQ19DX18pCisjICAgICAgZGVmaW5lIF9fQVpURUNfQ19fIF9fVkVSU0lPTgorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChfX0RPU19fKQorIyAgICAgIGRlZmluZSBfX0RPU19fIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoTV9JODZITSkgJiYgKFVJTlRfTUFYID09IExaT18weGZmZmZMKQorIyAgZGVmaW5lIHB0cmRpZmZfdCBsb25nCisjICBkZWZpbmUgX1BUUkRJRkZfVF9ERUZJTkVEIDEKKyNlbmRpZgorI2lmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmTCkKKyMgIHVuZGVmIF9fTFpPX1JFTkFNRV9BCisjICB1bmRlZiBfX0xaT19SRU5BTUVfQgorIyAgaWYgZGVmaW5lZChfX0FaVEVDX0NfXykgJiYgZGVmaW5lZChfX0RPU19fKQorIyAgICBkZWZpbmUgX19MWk9fUkVOQU1FX0EgMQorIyAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKE1TRE9TKQorIyAgICBpZiAoX01TQ19WRVIgPCA2MDApCisjICAgICAgZGVmaW5lIF9fTFpPX1JFTkFNRV9BIDEKKyMgICAgZWxpZiAoX01TQ19WRVIgPCA3MDApCisjICAgICAgZGVmaW5lIF9fTFpPX1JFTkFNRV9CIDEKKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZChfX1RTQ19fKSAmJiBkZWZpbmVkKF9fT1MyX18pCisjICAgIGRlZmluZSBfX0xaT19SRU5BTUVfQSAxCisjICBlbGlmIGRlZmluZWQoX19NU0RPU19fKSAmJiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIChfX1RVUkJPQ19fIDwgMHgwNDEwKQorIyAgICBkZWZpbmUgX19MWk9fUkVOQU1FX0EgMQorIyAgZWxpZiBkZWZpbmVkKF9fUEFDSUZJQ19fKSAmJiBkZWZpbmVkKERPUykKKyMgICAgaWYgIWRlZmluZWQoX19mYXIpCisjICAgICAgZGVmaW5lIF9fZmFyIGZhcgorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChfX25lYXIpCisjICAgICAgZGVmaW5lIF9fbmVhciBuZWFyCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChfX0xaT19SRU5BTUVfQSkKKyMgICAgaWYgIWRlZmluZWQoX19jZGVjbCkKKyMgICAgICBkZWZpbmUgX19jZGVjbCBjZGVjbAorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChfX2ZhcikKKyMgICAgICBkZWZpbmUgX19mYXIgZmFyCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkKF9faHVnZSkKKyMgICAgICBkZWZpbmUgX19odWdlIGh1Z2UKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19uZWFyKQorIyAgICAgIGRlZmluZSBfX25lYXIgbmVhcgorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChfX3Bhc2NhbCkKKyMgICAgICBkZWZpbmUgX19wYXNjYWwgcGFzY2FsCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkKF9faHVnZSkKKyMgICAgICBkZWZpbmUgX19odWdlIGh1Z2UKKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZChfX0xaT19SRU5BTUVfQikKKyMgICAgaWYgIWRlZmluZWQoX19jZGVjbCkKKyMgICAgICBkZWZpbmUgX19jZGVjbCBfY2RlY2wKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19mYXIpCisjICAgICAgZGVmaW5lIF9fZmFyIF9mYXIKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19odWdlKQorIyAgICAgIGRlZmluZSBfX2h1Z2UgX2h1Z2UKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19uZWFyKQorIyAgICAgIGRlZmluZSBfX25lYXIgX25lYXIKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19wYXNjYWwpCisjICAgICAgZGVmaW5lIF9fcGFzY2FsIF9wYXNjYWwKKyMgICAgZW5kaWYKKyMgIGVsaWYgKGRlZmluZWQoX19QVVJFQ19fKSB8fCBkZWZpbmVkKF9fVFVSQk9DX18pKSAmJiBkZWZpbmVkKF9fVE9TX18pCisjICAgIGlmICFkZWZpbmVkKF9fY2RlY2wpCisjICAgICAgZGVmaW5lIF9fY2RlY2wgY2RlY2wKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19wYXNjYWwpCisjICAgICAgZGVmaW5lIF9fcGFzY2FsIHBhc2NhbAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIHVuZGVmIF9fTFpPX1JFTkFNRV9BCisjICB1bmRlZiBfX0xaT19SRU5BTUVfQgorI2VuZGlmCisjaWYgKFVJTlRfTUFYID09IExaT18weGZmZmZMKQorI2lmIGRlZmluZWQoX19BWlRFQ19DX18pICYmIGRlZmluZWQoX19ET1NfXykKKyMgIGRlZmluZSBMWk9fQlJPS0VOX0NERUNMX0FMVF9TWU5UQVggMQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNU0RPUykKKyMgIGlmIChfTVNDX1ZFUiA8IDYwMCkKKyMgICAgZGVmaW5lIExaT19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTIDEKKyMgIGVuZGlmCisjICBpZiAoX01TQ19WRVIgPCA3MDApCisjICAgIGRlZmluZSBMWk9fQlJPS0VOX0lOVEVHUkFMX1BST01PVElPTiAxCisjICAgIGRlZmluZSBMWk9fQlJPS0VOX1NJWkVPRiAxCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX1BBQ0lGSUNfXykgJiYgZGVmaW5lZChET1MpCisjICBkZWZpbmUgTFpPX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMgMQorI2VsaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiBkZWZpbmVkKF9fTVNET1NfXykKKyMgIGlmIChfX1RVUkJPQ19fIDwgMHgwMTUwKQorIyAgICBkZWZpbmUgTFpPX0JST0tFTl9DREVDTF9BTFRfU1lOVEFYIDEKKyMgICAgZGVmaW5lIExaT19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTIDEKKyMgICAgZGVmaW5lIExaT19CUk9LRU5fSU5URUdSQUxfUFJPTU9USU9OIDEKKyMgIGVuZGlmCisjICBpZiAoX19UVVJCT0NfXyA8IDB4MDIwMCkKKyMgICAgZGVmaW5lIExaT19CUk9LRU5fU0laRU9GIDEKKyMgIGVuZGlmCisjICBpZiAoX19UVVJCT0NfXyA8IDB4MDQwMCkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgZGVmaW5lIExaT19CUk9LRU5fQ0RFQ0xfQUxUX1NZTlRBWCAxCisjICBlbmRpZgorI2VsaWYgKGRlZmluZWQoX19QVVJFQ19fKSB8fCBkZWZpbmVkKF9fVFVSQk9DX18pKSAmJiBkZWZpbmVkKF9fVE9TX18pCisjICBkZWZpbmUgTFpPX0JST0tFTl9DREVDTF9BTFRfU1lOVEFYIDEKKyMgIGRlZmluZSBMWk9fQlJPS0VOX1NJWkVPRiAxCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19XQVRDT01DX18pICYmIChfX1dBVENPTUNfXyA8IDkwMCkKKyMgIGRlZmluZSBMWk9fQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUyAxCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9DUkFZKSAmJiBkZWZpbmVkKF9DUkFZMSkKKyMgIGRlZmluZSBMWk9fQlJPS0VOX1NJR05FRF9SSUdIVF9TSElGVCAxCisjZW5kaWYKKyNkZWZpbmUgTFpPX1BQX1NUUklOR0laRSh4KSAgICAgICAgICAgICAjeAorI2RlZmluZSBMWk9fUFBfTUFDUk9fRVhQQU5EKHgpICAgICAgICAgIExaT19QUF9TVFJJTkdJWkUoeCkKKyNkZWZpbmUgTFpPX1BQX0NPTkNBVDAoKSAgICAgICAgICAgICAgICAvKmVtcHR5Ki8KKyNkZWZpbmUgTFpPX1BQX0NPTkNBVDEoYSkgICAgICAgICAgICAgICBhCisjZGVmaW5lIExaT19QUF9DT05DQVQyKGEsYikgICAgICAgICAgICAgYSAjIyBiCisjZGVmaW5lIExaT19QUF9DT05DQVQzKGEsYixjKSAgICAgICAgICAgYSAjIyBiICMjIGMKKyNkZWZpbmUgTFpPX1BQX0NPTkNBVDQoYSxiLGMsZCkgICAgICAgICBhICMjIGIgIyMgYyAjIyBkCisjZGVmaW5lIExaT19QUF9DT05DQVQ1KGEsYixjLGQsZSkgICAgICAgYSAjIyBiICMjIGMgIyMgZCAjIyBlCisjZGVmaW5lIExaT19QUF9DT05DQVQ2KGEsYixjLGQsZSxmKSAgICAgYSAjIyBiICMjIGMgIyMgZCAjIyBlICMjIGYKKyNkZWZpbmUgTFpPX1BQX0NPTkNBVDcoYSxiLGMsZCxlLGYsZykgICBhICMjIGIgIyMgYyAjIyBkICMjIGUgIyMgZiAjIyBnCisjZGVmaW5lIExaT19QUF9FQ09OQ0FUMCgpICAgICAgICAgICAgICAgTFpPX1BQX0NPTkNBVDAoKQorI2RlZmluZSBMWk9fUFBfRUNPTkNBVDEoYSkgICAgICAgICAgICAgIExaT19QUF9DT05DQVQxKGEpCisjZGVmaW5lIExaT19QUF9FQ09OQ0FUMihhLGIpICAgICAgICAgICAgTFpPX1BQX0NPTkNBVDIoYSxiKQorI2RlZmluZSBMWk9fUFBfRUNPTkNBVDMoYSxiLGMpICAgICAgICAgIExaT19QUF9DT05DQVQzKGEsYixjKQorI2RlZmluZSBMWk9fUFBfRUNPTkNBVDQoYSxiLGMsZCkgICAgICAgIExaT19QUF9DT05DQVQ0KGEsYixjLGQpCisjZGVmaW5lIExaT19QUF9FQ09OQ0FUNShhLGIsYyxkLGUpICAgICAgTFpPX1BQX0NPTkNBVDUoYSxiLGMsZCxlKQorI2RlZmluZSBMWk9fUFBfRUNPTkNBVDYoYSxiLGMsZCxlLGYpICAgIExaT19QUF9DT05DQVQ2KGEsYixjLGQsZSxmKQorI2RlZmluZSBMWk9fUFBfRUNPTkNBVDcoYSxiLGMsZCxlLGYsZykgIExaT19QUF9DT05DQVQ3KGEsYixjLGQsZSxmLGcpCisjZGVmaW5lIExaT19QUF9FTVBUWSAgICAgICAgICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTAoKSAgICAgICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTEoYSkgICAgICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTIoYSxiKSAgICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTMoYSxiLGMpICAgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTQoYSxiLGMsZCkgICAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTUoYSxiLGMsZCxlKSAgICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTYoYSxiLGMsZCxlLGYpICAgICAgLyplbXB0eSovCisjZGVmaW5lIExaT19QUF9FTVBUWTcoYSxiLGMsZCxlLGYsZykgICAgLyplbXB0eSovCisjaWYgMQorI2RlZmluZSBMWk9fQ1BQX1NUUklOR0laRSh4KSAgICAgICAgICAgICN4CisjZGVmaW5lIExaT19DUFBfTUFDUk9fRVhQQU5EKHgpICAgICAgICAgTFpPX0NQUF9TVFJJTkdJWkUoeCkKKyNkZWZpbmUgTFpPX0NQUF9DT05DQVQyKGEsYikgICAgICAgICAgICBhICMjIGIKKyNkZWZpbmUgTFpPX0NQUF9DT05DQVQzKGEsYixjKSAgICAgICAgICBhICMjIGIgIyMgYworI2RlZmluZSBMWk9fQ1BQX0NPTkNBVDQoYSxiLGMsZCkgICAgICAgIGEgIyMgYiAjIyBjICMjIGQKKyNkZWZpbmUgTFpPX0NQUF9DT05DQVQ1KGEsYixjLGQsZSkgICAgICBhICMjIGIgIyMgYyAjIyBkICMjIGUKKyNkZWZpbmUgTFpPX0NQUF9DT05DQVQ2KGEsYixjLGQsZSxmKSAgICBhICMjIGIgIyMgYyAjIyBkICMjIGUgIyMgZgorI2RlZmluZSBMWk9fQ1BQX0NPTkNBVDcoYSxiLGMsZCxlLGYsZykgIGEgIyMgYiAjIyBjICMjIGQgIyMgZSAjIyBmICMjIGcKKyNkZWZpbmUgTFpPX0NQUF9FQ09OQ0FUMihhLGIpICAgICAgICAgICBMWk9fQ1BQX0NPTkNBVDIoYSxiKQorI2RlZmluZSBMWk9fQ1BQX0VDT05DQVQzKGEsYixjKSAgICAgICAgIExaT19DUFBfQ09OQ0FUMyhhLGIsYykKKyNkZWZpbmUgTFpPX0NQUF9FQ09OQ0FUNChhLGIsYyxkKSAgICAgICBMWk9fQ1BQX0NPTkNBVDQoYSxiLGMsZCkKKyNkZWZpbmUgTFpPX0NQUF9FQ09OQ0FUNShhLGIsYyxkLGUpICAgICBMWk9fQ1BQX0NPTkNBVDUoYSxiLGMsZCxlKQorI2RlZmluZSBMWk9fQ1BQX0VDT05DQVQ2KGEsYixjLGQsZSxmKSAgIExaT19DUFBfQ09OQ0FUNihhLGIsYyxkLGUsZikKKyNkZWZpbmUgTFpPX0NQUF9FQ09OQ0FUNyhhLGIsYyxkLGUsZixnKSBMWk9fQ1BQX0NPTkNBVDcoYSxiLGMsZCxlLGYsZykKKyNlbmRpZgorI2RlZmluZSBfX0xaT19NQVNLX0dFTihvLGIpICAgICAoKCgoKG8pIDw8ICgoYiktISEoYikpKSAtIChvKSkgPDwgMSkgKyAobykqISEoYikpCisjaWYgMSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgaWYgIWRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykKKyMgICAgZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MgMQorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKF9fU1REQ19MSU1JVF9NQUNST1MpCisjICAgIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIExaT19FWFRFUk5fQyAgICAgICAgICBleHRlcm4gIkMiCisjICBkZWZpbmUgTFpPX0VYVEVSTl9DX0JFR0lOICAgIGV4dGVybiAiQyIgeworIyAgZGVmaW5lIExaT19FWFRFUk5fQ19FTkQgICAgICB9CisjZWxzZQorIyAgZGVmaW5lIExaT19FWFRFUk5fQyAgICAgICAgICBleHRlcm4KKyMgIGRlZmluZSBMWk9fRVhURVJOX0NfQkVHSU4gICAgLyplbXB0eSovCisjICBkZWZpbmUgTFpPX0VYVEVSTl9DX0VORCAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19MWk9fT1NfT1ZFUlJJREUpCisjaWYgKExaT19PU19GUkVFU1RBTkRJTkcpCisjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJmcmVlc3RhbmRpbmciCisjZWxpZiAoTFpPX09TX0VNQkVEREVEKQorIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAiZW1iZWRkZWQiCisjZWxpZiAxICYmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykKKyMgIGRlZmluZSBMWk9fT1NfRU1CRURERUQgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAiZW1iZWRkZWQiCisjZWxpZiBkZWZpbmVkKF9fQ1lHV0lOX18pICYmIGRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgTFpPX09TX0NZR1dJTiAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICAgImN5Z3dpbiIKKyNlbGlmIGRlZmluZWQoX19FTVhfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKKyMgIGRlZmluZSBMWk9fT1NfRU1YICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAiZW14IgorI2VsaWYgZGVmaW5lZChfX0JFT1NfXykKKyMgIGRlZmluZSBMWk9fT1NfQkVPUyAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAiYmVvcyIKKyNlbGlmIGRlZmluZWQoX19MeW54X18pCisjICBkZWZpbmUgTFpPX09TX0xZTlhPUyAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICAgImx5bnhvcyIKKyNlbGlmIGRlZmluZWQoX19PUzQwMF9fKQorIyAgZGVmaW5lIExaT19PU19PUzQwMCAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJvczQwMCIKKyNlbGlmIGRlZmluZWQoX19RTlhfXykKKyMgIGRlZmluZSBMWk9fT1NfUU5YICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAicW54IgorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoX19EUE1JMzJfXykgJiYgKF9fQk9STEFORENfXyA+PSAweDA0NjApCisjICBkZWZpbmUgTFpPX09TX0RPUzMyICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICAgImRvczMyIgorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoX19EUE1JMTZfXykKKyMgIGRlZmluZSBMWk9fT1NfRE9TMTYgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAiZG9zMTYiCisjZWxpZiBkZWZpbmVkKF9fWlRDX18pICYmIGRlZmluZWQoRE9TMzg2KQorIyAgZGVmaW5lIExaT19PU19ET1MzMiAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJkb3MzMiIKKyNlbGlmIGRlZmluZWQoX19PUzJfXykgfHwgZGVmaW5lZChfX09TMlYyX18pCisjICBpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpCisjICAgIGRlZmluZSBMWk9fT1NfT1MyMTYgICAgICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgIm9zMjE2IgorIyAgZWxpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZmZmZmZMKQorIyAgICBkZWZpbmUgTFpPX09TX09TMiAgICAgICAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICJvczIiCisjICBlbHNlCisjICAgIGVycm9yICJjaGVjayB5b3VyIGxpbWl0cy5oIGhlYWRlciIKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fV0lONjRfXykgfHwgZGVmaW5lZChfV0lONjQpIHx8IGRlZmluZWQoV0lONjQpCisjICBkZWZpbmUgTFpPX09TX1dJTjY0ICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICAgIndpbjY0IgorI2VsaWYgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fV0lORE9XU18zODZfXykKKyMgIGRlZmluZSBMWk9fT1NfV0lOMzIgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAid2luMzIiCisjZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoX19JTlRFTF9fKQorIyAgZGVmaW5lIExaT19PU19XSU4zMiAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJ3aW4zMiIKKyNlbGlmIGRlZmluZWQoX19XSU5ET1dTX18pIHx8IGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoX1dpbmRvd3MpCisjICBpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpCisjICAgIGRlZmluZSBMWk9fT1NfV0lOMTYgICAgICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgIndpbjE2IgorIyAgZWxpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZmZmZmZMKQorIyAgICBkZWZpbmUgTFpPX09TX1dJTjMyICAgICAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICJ3aW4zMiIKKyMgIGVsc2UKKyMgICAgZXJyb3IgImNoZWNrIHlvdXIgbGltaXRzLmggaGVhZGVyIgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19ET1NfXykgfHwgZGVmaW5lZChfX01TRE9TX18pIHx8IGRlZmluZWQoX01TRE9TKSB8fCBkZWZpbmVkKE1TRE9TKSB8fCAoZGVmaW5lZChfX1BBQ0lGSUNfXykgJiYgZGVmaW5lZChET1MpKQorIyAgaWYgKFVJTlRfTUFYID09IExaT18weGZmZmZMKQorIyAgICBkZWZpbmUgTFpPX09TX0RPUzE2ICAgICAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICJkb3MxNiIKKyMgIGVsaWYgKFVJTlRfTUFYID09IExaT18weGZmZmZmZmZmTCkKKyMgICAgZGVmaW5lIExaT19PU19ET1MzMiAgICAgICAgMQorIyAgICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAiZG9zMzIiCisjICBlbHNlCisjICAgIGVycm9yICJjaGVjayB5b3VyIGxpbWl0cy5oIGhlYWRlciIKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQorIyAgaWYgZGVmaW5lZChfX05UX18pICYmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmTCkKKyMgICAgZGVmaW5lIExaT19PU19ET1MxNiAgICAgICAgMQorIyAgICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAiZG9zMTYiCisjICBlbGlmIGRlZmluZWQoX19OVF9fKSAmJiAoX19XQVRDT01DX18gPCAxMTAwKQorIyAgICBkZWZpbmUgTFpPX09TX1dJTjMyICAgICAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICJ3aW4zMiIKKyMgIGVsaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19MSU5VWF9fKQorIyAgICBkZWZpbmUgTFpPX09TX1BPU0lYICAgICAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICJwb3NpeCIKKyMgIGVsc2UKKyMgICAgZXJyb3IgInBsZWFzZSBzcGVjaWZ5IGEgdGFyZ2V0IHVzaW5nIHRoZSAtYnQgY29tcGlsZXIgb3B0aW9uIgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19wYWxtb3NfXykKKyMgIGRlZmluZSBMWk9fT1NfUEFMTU9TICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAicGFsbW9zIgorI2VsaWYgZGVmaW5lZChfX1RPU19fKSB8fCBkZWZpbmVkKF9fYXRhcmlzdF9fKQorIyAgZGVmaW5lIExaT19PU19UT1MgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJ0b3MiCisjZWxpZiBkZWZpbmVkKG1hY2ludG9zaCkgJiYgIWRlZmluZWQoX19wcGNfXykKKyMgIGRlZmluZSBMWk9fT1NfTUFDQ0xBU1NJQyAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX09TICAgICAgICAgICAibWFjY2xhc3NpYyIKKyNlbGlmIGRlZmluZWQoX19WTVMpCisjICBkZWZpbmUgTFpPX09TX1ZNUyAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICAgInZtcyIKKyNlbGlmIChkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fUjU5MDBfXykpIHx8IGRlZmluZWQoX19NSVBTX1BTWDJfXykKKyMgIGRlZmluZSBMWk9fT1NfQ09OU09MRSAgICAgICAgMQorIyAgZGVmaW5lIExaT19PU19DT05TT0xFX1BTMiAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJjb25zb2xlIgorIyAgZGVmaW5lIExaT19JTkZPX09TX0NPTlNPTEUgICAicHMyIgorI2VsaWYgZGVmaW5lZChfX21pcHNfXykgJiYgZGVmaW5lZChfX3BzcF9fKQorIyAgZGVmaW5lIExaT19PU19DT05TT0xFICAgICAgICAxCisjICBkZWZpbmUgTFpPX09TX0NPTlNPTEVfUFNQICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19PUyAgICAgICAgICAgImNvbnNvbGUiCisjICBkZWZpbmUgTFpPX0lORk9fT1NfQ09OU09MRSAgICJwc3AiCisjZWxzZQorIyAgZGVmaW5lIExaT19PU19QT1NJWCAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fT1MgICAgICAgICAgICJwb3NpeCIKKyNlbmRpZgorI2lmIChMWk9fT1NfUE9TSVgpCisjICBpZiBkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoX19BSVhfXykgfHwgZGVmaW5lZChfX2FpeF9fKQorIyAgICBkZWZpbmUgTFpPX09TX1BPU0lYX0FJWCAgICAgICAgMQorIyAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICAgImFpeCIKKyMgIGVsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyMgICAgZGVmaW5lIExaT19PU19QT1NJWF9GUkVFQlNEICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJmcmVlYnNkIgorIyAgZWxpZiBkZWZpbmVkKF9faHB1eF9fKSB8fCBkZWZpbmVkKF9faHB1eCkKKyMgICAgZGVmaW5lIExaT19PU19QT1NJWF9IUFVYICAgICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJocHV4IgorIyAgZWxpZiBkZWZpbmVkKF9fSU5URVJJWCkKKyMgICAgZGVmaW5lIExaT19PU19QT1NJWF9JTlRFUklYICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJpbnRlcml4IgorIyAgZWxpZiBkZWZpbmVkKF9fSVJJWF9fKSB8fCBkZWZpbmVkKF9faXJpeF9fKQorIyAgICBkZWZpbmUgTFpPX09TX1BPU0lYX0lSSVggICAgICAgMQorIyAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICAgImlyaXgiCisjICBlbGlmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQoX19MSU5VWF9fKQorIyAgICBkZWZpbmUgTFpPX09TX1BPU0lYX0xJTlVYICAgICAgMQorIyAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICAgImxpbnV4IgorIyAgZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKKyMgICAgaWYgKChfX0VOVklST05NRU5UX0lQSE9ORV9PU19WRVJTSU9OX01JTl9SRVFVSVJFRF9fLTApID49IDIwMDAwKQorIyAgICAgIGRlZmluZSBMWk9fT1NfUE9TSVhfREFSV0lOICAgICAxMDQwCisjICAgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJkYXJ3aW5faXBob25lIgorIyAgICBlbGlmICgoX19FTlZJUk9OTUVOVF9NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRF9fLTApID49IDEwNDApCisjICAgICAgZGVmaW5lIExaT19PU19QT1NJWF9EQVJXSU4gICAgIF9fRU5WSVJPTk1FTlRfTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRURfXworIyAgICAgIGRlZmluZSBMWk9fSU5GT19PU19QT1NJWCAgICAgICAiZGFyd2luIgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIExaT19PU19QT1NJWF9EQVJXSU4gICAgIDEKKyMgICAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICAgImRhcndpbiIKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIExaT19PU19QT1NJWF9NQUNPU1ggICAgIExaT19PU19QT1NJWF9EQVJXSU4KKyMgIGVsaWYgZGVmaW5lZChfX21pbml4X18pIHx8IGRlZmluZWQoX19taW5peCkKKyMgICAgZGVmaW5lIExaT19PU19QT1NJWF9NSU5JWCAgICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJtaW5peCIKKyMgIGVsaWYgZGVmaW5lZChfX05ldEJTRF9fKQorIyAgICBkZWZpbmUgTFpPX09TX1BPU0lYX05FVEJTRCAgICAgMQorIyAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICAgIm5ldGJzZCIKKyMgIGVsaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyMgICAgZGVmaW5lIExaT19PU19QT1NJWF9PUEVOQlNEICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJvcGVuYnNkIgorIyAgZWxpZiBkZWZpbmVkKF9fb3NmX18pCisjICAgIGRlZmluZSBMWk9fT1NfUE9TSVhfT1NGICAgICAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19PU19QT1NJWCAgICAgICAib3NmIgorIyAgZWxpZiBkZWZpbmVkKF9fc29sYXJpc19fKSB8fCBkZWZpbmVkKF9fc3VuKQorIyAgICBpZiBkZWZpbmVkKF9fU1ZSNCkgfHwgZGVmaW5lZChfX3N2cjRfXykKKyMgICAgICBkZWZpbmUgTFpPX09TX1BPU0lYX1NPTEFSSVMgIDEKKyMgICAgICBkZWZpbmUgTFpPX0lORk9fT1NfUE9TSVggICAgICJzb2xhcmlzIgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIExaT19PU19QT1NJWF9TVU5PUyAgICAxCisjICAgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAic3Vub3MiCisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQoX191bHRyaXhfXykgfHwgZGVmaW5lZChfX3VsdHJpeCkKKyMgICAgZGVmaW5lIExaT19PU19QT1NJWF9VTFRSSVggICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJ1bHRyaXgiCisjICBlbGlmIGRlZmluZWQoX1VOSUNPUykKKyMgICAgZGVmaW5lIExaT19PU19QT1NJWF9VTklDT1MgICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX09TX1BPU0lYICAgICAgICJ1bmljb3MiCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fT1NfUE9TSVhfVU5LTk9XTiAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19PU19QT1NJWCAgICAgICAidW5rbm93biIKKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fT1NfRE9TMTYgfHwgTFpPX09TX09TMjE2IHx8IExaT19PU19XSU4xNikKKyMgIGlmIChVSU5UX01BWCAhPSBMWk9fMHhmZmZmTCkKKyMgICAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyMgIGVuZGlmCisjICBpZiAoVUxPTkdfTUFYICE9IExaT18weGZmZmZmZmZmTCkKKyMgICAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoTFpPX09TX0RPUzMyIHx8IExaT19PU19PUzIgfHwgTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKKyMgIGlmIChVSU5UX01BWCAhPSBMWk9fMHhmZmZmZmZmZkwpCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjICBlbmRpZgorIyAgaWYgKFVMT05HX01BWCAhPSBMWk9fMHhmZmZmZmZmZkwpCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjICBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChDSUwpICYmIGRlZmluZWQoX0dOVUNDKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIExaT19DQ19DSUxMWSAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJDaWxseSIKKyMgIGlmIGRlZmluZWQoX19DSUxMWV9fKQorIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fQ0lMTFlfXykKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgInVua25vd24iCisjICBlbmRpZgorI2VsaWYgMCAmJiBkZWZpbmVkKFNEQ0MpICYmIGRlZmluZWQoX19WRVJTSU9OX18pICYmICFkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIExaT19DQ19TRENDICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJzZGNjIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKFNEQ0MpCisjZWxpZiBkZWZpbmVkKF9fUEFUSFNDQUxFX18pICYmIGRlZmluZWQoX19QQVRIQ0NfUEFUQ0hMRVZFTF9fKQorIyAgZGVmaW5lIExaT19DQ19QQVRIU0NBTEUgICAgICAoX19QQVRIQ0NfXyAqIDB4MTAwMDBMICsgKF9fUEFUSENDX01JTk9SX18tMCkgKiAweDEwMCArIChfX1BBVEhDQ19QQVRDSExFVkVMX18tMCkpCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJQYXRoc2NhbGUgQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgX19QQVRIU0NBTEVfXworIyAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKKyMgICAgZGVmaW5lIExaT19DQ19QQVRIU0NBTEVfR05VQyAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fR05VQ19QQVRDSExFVkVMX18tMCkpCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAoKF9fSU5URUxfQ09NUElMRVItMCkgPiAwKQorIyAgZGVmaW5lIExaT19DQ19JTlRFTEMgICAgICAgICBfX0lOVEVMX0NPTVBJTEVSCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJJbnRlbCBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fSU5URUxfQ09NUElMRVIpCisjICBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoKF9NU0NfVkVSLTApID4gMCkKKyMgICAgZGVmaW5lIExaT19DQ19JTlRFTENfTVNDICAgX01TQ19WRVIKKyMgIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKKyMgICAgZGVmaW5lIExaT19DQ19JTlRFTENfR05VQyAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19HTlVDX1BBVENITEVWRUxfXy0wKSkKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fUE9DQ19fKSAmJiBkZWZpbmVkKF9XSU4zMikKKyMgIGRlZmluZSBMWk9fQ0NfUEVMTEVTQyAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiUGVsbGVzIEMiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19QT0NDX18pCisjZWxpZiBkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKKyMgIGlmIGRlZmluZWQoX19HTlVDX1BBVENITEVWRUxfXykKKyMgICAgZGVmaW5lIExaT19DQ19BUk1DQ19HTlVDICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyAoX19HTlVDX01JTk9SX18tMCkgKiAweDEwMCArIChfX0dOVUNfUEFUQ0hMRVZFTF9fLTApKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0NDX0FSTUNDX0dOVUMgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwKQorIyAgZW5kaWYKKyMgIGRlZmluZSBMWk9fQ0NfQVJNQ0MgICAgICAgICAgX19BUk1DQ19WRVJTSU9OCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJBUk0gQyBDb21waWxlciIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgX19WRVJTSU9OX18KKyNlbGlmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9fbGx2bV9fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQorIyAgaWYgZGVmaW5lZChfX2NsYW5nX21ham9yX18pICYmIGRlZmluZWQoX19jbGFuZ19taW5vcl9fKSAmJiBkZWZpbmVkKF9fY2xhbmdfcGF0Y2hsZXZlbF9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0NMQU5HICAgICAgICAoX19jbGFuZ19tYWpvcl9fICogMHgxMDAwMEwgKyAoX19jbGFuZ19taW5vcl9fLTApICogMHgxMDAgKyAoX19jbGFuZ19wYXRjaGxldmVsX18tMCkpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQ0NfQ0xBTkcgICAgICAgIDB4MDEwMDAwTAorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoX01TQ19WRVIpICYmICgoX01TQ19WRVItMCkgPiAwKQorIyAgICBkZWZpbmUgTFpPX0NDX0NMQU5HX01TQyAgICBfTVNDX1ZFUgorIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0NMQU5HX0dOVUMgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fR05VQ19QQVRDSExFVkVMX18tMCkpCisjICBlbmRpZgorIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiY2xhbmciCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIF9fVkVSU0lPTl9fCisjZWxpZiBkZWZpbmVkKF9fbGx2bV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQorIyAgaWYgZGVmaW5lZChfX0dOVUNfUEFUQ0hMRVZFTF9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0xMVk1fR05VQyAgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fR05VQ19QQVRDSExFVkVMX18tMCkpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQ0NfTExWTV9HTlVDICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgKF9fR05VQ19NSU5PUl9fLTApICogMHgxMDApCisjICBlbmRpZgorIyAgZGVmaW5lIExaT19DQ19MTFZNICAgICAgICAgICBMWk9fQ0NfTExWTV9HTlVDCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJsbHZtLWdjYyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgX19WRVJTSU9OX18KKyNlbGlmIGRlZmluZWQoX19BQ0tfXykgJiYgZGVmaW5lZChfQUNLKQorIyAgZGVmaW5lIExaT19DQ19BQ0sgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJBbXN0ZXJkYW0gQ29tcGlsZXIgS2l0IEMiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgICJ1bmtub3duIgorI2VsaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pICYmICFkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIExaT19DQ19BUk1DQyAgICAgICAgICBfX0FSTUNDX1ZFUlNJT04KKyMgIGRlZmluZSBMWk9fQ0NfQVJNQ0NfQVJNQ0MgICAgX19BUk1DQ19WRVJTSU9OCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJBUk0gQyBDb21waWxlciIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0FSTUNDX1ZFUlNJT04pCisjZWxpZiBkZWZpbmVkKF9fQVpURUNfQ19fKQorIyAgZGVmaW5lIExaT19DQ19BWlRFQ0MgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJBenRlYyBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fQVpURUNfQ19fKQorI2VsaWYgZGVmaW5lZChfX0NPREVHRUFSQ19fKQorIyAgZGVmaW5lIExaT19DQ19DT0RFR0VBUkMgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJDb2RlR2VhciBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fQ09ERUdFQVJDX18pCisjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykKKyMgIGRlZmluZSBMWk9fQ0NfQk9STEFOREMgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiQm9ybGFuZCBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fQk9STEFORENfXykKKyNlbGlmIGRlZmluZWQoX0NSQVlDKSAmJiBkZWZpbmVkKF9SRUxFQVNFKQorIyAgZGVmaW5lIExaT19DQ19DUkFZQyAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJDcmF5IEMiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX1JFTEVBU0UpCisjZWxpZiBkZWZpbmVkKF9fRE1DX18pICYmIGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIExaT19DQ19ETUMgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJEaWdpdGFsIE1hcnMgQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0RNQ19fKQorI2VsaWYgZGVmaW5lZChfX0RFQ0MpCisjICBkZWZpbmUgTFpPX0NDX0RFQ0MgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIkRFQyBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fREVDQykKKyNlbGlmIChkZWZpbmVkKF9fZ2hzKSB8fCBkZWZpbmVkKF9fZ2hzX18pKSAmJiBkZWZpbmVkKF9fR0hTX1ZFUlNJT05fTlVNQkVSKSAmJiAoKF9fR0hTX1ZFUlNJT05fTlVNQkVSLTApID4gMCkKKyMgIGRlZmluZSBMWk9fQ0NfR0hTICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiR3JlZW4gSGlsbHMgQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0dIU19WRVJTSU9OX05VTUJFUikKKyMgIGlmIGRlZmluZWQoX01TQ19WRVIpICYmICgoX01TQ19WRVItMCkgPiAwKQorIyAgICBkZWZpbmUgTFpPX0NDX0dIU19NU0MgICAgICBfTVNDX1ZFUgorIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fVkVSU0lPTl9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0dIU19HTlVDICAgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fR05VQ19QQVRDSExFVkVMX18tMCkpCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0hJR0hDX18pCisjICBkZWZpbmUgTFpPX0NDX0hJR0hDICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIk1ldGFXYXJlIEhpZ2ggQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgInVua25vd24iCisjZWxpZiBkZWZpbmVkKF9fSFBfYUNDKSAmJiAoKF9fSFBfYUNDLTApID4gMCkKKyMgIGRlZmluZSBMWk9fQ0NfSFBBQ0MgICAgICAgICAgX19IUF9hQ0MKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIkhQIGFDQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0hQX2FDQykKKyNlbGlmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykKKyMgIGRlZmluZSBMWk9fQ0NfSUFSQyAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiSUFSIEMiCisjICBpZiBkZWZpbmVkKF9fVkVSX18pCisjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19WRVJfXykKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgInVua25vd24iCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0lCTUNfXykgJiYgKChfX0lCTUNfXy0wKSA+IDApCisjICBkZWZpbmUgTFpPX0NDX0lCTUMgICAgICAgICAgIF9fSUJNQ19fCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJJQk0gQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0lCTUNfXykKKyNlbGlmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgKChfX0lCTUNQUF9fLTApID4gMCkKKyMgIGRlZmluZSBMWk9fQ0NfSUJNQyAgICAgICAgICAgX19JQk1DUFBfXworIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiSUJNIEMiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19JQk1DUFBfXykKKyNlbGlmIGRlZmluZWQoX19LRUlMX18pICYmIGRlZmluZWQoX19DMTY2X18pCisjICBkZWZpbmUgTFpPX0NDX0tFSUxDICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIktlaWwgQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0MxNjZfXykKKyNlbGlmIGRlZmluZWQoX19MQ0NfXykgJiYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoX19MQ0NPUFRJTUxFVkVMKQorIyAgZGVmaW5lIExaT19DQ19MQ0NXSU4zMiAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJsY2Mtd2luMzIiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgICJ1bmtub3duIgorI2VsaWYgZGVmaW5lZChfX0xDQ19fKQorIyAgZGVmaW5lIExaT19DQ19MQ0MgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJsY2MiCisjICBpZiBkZWZpbmVkKF9fTENDX1ZFUlNJT05fXykKKyMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX0xDQ19WRVJTSU9OX18pCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICJ1bmtub3duIgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgKChfX01XRVJLU19fLTApID4gMCkKKyMgIGRlZmluZSBMWk9fQ0NfTVdFUktTICAgICAgICAgX19NV0VSS1NfXworIyAgZGVmaW5lIExaT19JTkZPX0NDICAgICAgICAgICAiTWV0cm93ZXJrcyBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fTVdFUktTX18pCisjZWxpZiAoZGVmaW5lZChfX05EUENfXykgfHwgZGVmaW5lZChfX05EUFhfXykpICYmIGRlZmluZWQoX19pMzg2KQorIyAgZGVmaW5lIExaT19DQ19ORFBDICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJNaWNyb3dheSBORFAgQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgInVua25vd24iCisjZWxpZiBkZWZpbmVkKF9fUEFDSUZJQ19fKQorIyAgZGVmaW5lIExaT19DQ19QQUNJRklDQyAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJQYWNpZmljIEMiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19QQUNJRklDX18pCisjZWxpZiBkZWZpbmVkKF9fUEdJKSAmJiBkZWZpbmVkKF9fUEdJQ19fKSAmJiBkZWZpbmVkKF9fUEdJQ19NSU5PUl9fKQorIyAgaWYgZGVmaW5lZChfX1BHSUNfUEFUQ0hMRVZFTF9fKQorIyAgICBkZWZpbmUgTFpPX0NDX1BHSSAgICAgICAgICAoX19QR0lDX18gKiAweDEwMDAwTCArIChfX1BHSUNfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fUEdJQ19QQVRDSExFVkVMX18tMCkpCisjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19QR0lDX18pICIuIiBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fUEdJQ19NSU5PUl9fKSAiLiIgTFpPX1BQX01BQ1JPX0VYUEFORChfX1BHSUNfUEFUQ0hMRVZFTF9fKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0NDX1BHSSAgICAgICAgICAoX19QR0lDX18gKiAweDEwMDAwTCArIChfX1BHSUNfTUlOT1JfXy0wKSAqIDB4MTAwKQorIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fUEdJQ19fKSAiLiIgTFpPX1BQX01BQ1JPX0VYUEFORChfX1BHSUNfTUlOT1JfXykgIi4wIgorIyAgZW5kaWYKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlBvcnRsYW5kIEdyb3VwIFBHSSBDIgorI2VsaWYgZGVmaW5lZChfX1BHSSkgJiYgKGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpCisjICBkZWZpbmUgTFpPX0NDX1BHSSAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlBvcnRsYW5kIEdyb3VwIFBHSSBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICAidW5rbm93biIKKyNlbGlmIGRlZmluZWQoX19QVVJFQ19fKSAmJiBkZWZpbmVkKF9fVE9TX18pCisjICBkZWZpbmUgTFpPX0NDX1BVUkVDICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlB1cmUgQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX1BVUkVDX18pCisjZWxpZiBkZWZpbmVkKF9fU0NfXykgJiYgZGVmaW5lZChfX1pUQ19fKQorIyAgZGVmaW5lIExaT19DQ19TWU1BTlRFQ0MgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJTeW1hbnRlYyBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fU0NfXykKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlN1blBybyBDIgorIyAgaWYgKChfX1NVTlBST19DLTApID4gMCkKKyMgICAgZGVmaW5lIExaT19DQ19TVU5QUk9DICAgICAgX19TVU5QUk9fQworIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fU1VOUFJPX0MpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQ0NfU1VOUFJPQyAgICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgInVua25vd24iCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DQykKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlN1blBybyBDIgorIyAgaWYgKChfX1NVTlBST19DQy0wKSA+IDApCisjICAgIGRlZmluZSBMWk9fQ0NfU1VOUFJPQyAgICAgIF9fU1VOUFJPX0NDCisjICAgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19TVU5QUk9fQ0MpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQ0NfU1VOUFJPQyAgICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgInVua25vd24iCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX1RJTllDX18pCisjICBkZWZpbmUgTFpPX0NDX1RJTllDICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlRpbnkgQyIKKyMgIGRlZmluZSBMWk9fSU5GT19DQ1ZFUiAgICAgICAgTFpPX1BQX01BQ1JPX0VYUEFORChfX1RJTllDX18pCisjZWxpZiBkZWZpbmVkKF9fVFNDX18pCisjICBkZWZpbmUgTFpPX0NDX1RPUFNQRUVEQyAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlRvcFNwZWVkIEMiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIExaT19QUF9NQUNST19FWFBBTkQoX19UU0NfXykKKyNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCisjICBkZWZpbmUgTFpPX0NDX1dBVENPTUMgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIldhdGNvbSBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fV0FUQ09NQ19fKQorI2VsaWYgZGVmaW5lZChfX1RVUkJPQ19fKQorIyAgZGVmaW5lIExaT19DQ19UVVJCT0MgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJUdXJibyBDIgorIyAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fVFVSQk9DX18pCisjZWxpZiBkZWZpbmVkKF9fWlRDX18pCisjICBkZWZpbmUgTFpPX0NDX1pPUlRFQ0hDICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIlpvcnRlY2ggQyIKKyMgIGlmICgoX19aVENfXy0wKSA9PSAweDMxMCkKKyMgICAgZGVmaW5lIExaT19JTkZPX0NDVkVSICAgICAgIjB4MzEwIgorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9fWlRDX18pCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykKKyMgIGlmIGRlZmluZWQoX19HTlVDX01JTk9SX18pICYmIGRlZmluZWQoX19HTlVDX1BBVENITEVWRUxfXykKKyMgICAgZGVmaW5lIExaT19DQ19HTlVDICAgICAgICAgKF9fR05VQ19fICogMHgxMDAwMEwgKyAoX19HTlVDX01JTk9SX18tMCkgKiAweDEwMCArIChfX0dOVUNfUEFUQ0hMRVZFTF9fLTApKQorIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKQorIyAgICBkZWZpbmUgTFpPX0NDX0dOVUMgICAgICAgICAoX19HTlVDX18gKiAweDEwMDAwTCArIChfX0dOVUNfTUlOT1JfXy0wKSAqIDB4MTAwKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0NDX0dOVUMgICAgICAgICAoX19HTlVDX18gKiAweDEwMDAwTCkKKyMgIGVuZGlmCisjICBkZWZpbmUgTFpPX0lORk9fQ0MgICAgICAgICAgICJnY2MiCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgIF9fVkVSU0lPTl9fCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoKF9NU0NfVkVSLTApID4gMCkKKyMgIGRlZmluZSBMWk9fQ0NfTVNDICAgICAgICAgICAgX01TQ19WRVIKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgIk1pY3Jvc29mdCBDIgorIyAgaWYgZGVmaW5lZChfTVNDX0ZVTExfVkVSKQorIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9NU0NfVkVSKSAiLiIgTFpPX1BQX01BQ1JPX0VYUEFORChfTVNDX0ZVTExfVkVSKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICBMWk9fUFBfTUFDUk9fRVhQQU5EKF9NU0NfVkVSKQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgTFpPX0NDX1VOS05PV04gICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19DQyAgICAgICAgICAgInVua25vd24iCisjICBkZWZpbmUgTFpPX0lORk9fQ0NWRVIgICAgICAgICJ1bmtub3duIgorI2VuZGlmCisjaWYgKExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fT1BFTjY0X18pCisjICBpZiBkZWZpbmVkKF9fT1BFTkNDX18pICYmIGRlZmluZWQoX19PUEVOQ0NfTUlOT1JfXykgJiYgZGVmaW5lZChfX09QRU5DQ19QQVRDSExFVkVMX18pCisjICAgIGRlZmluZSBMWk9fQ0NfT1BFTjY0ICAgICAgIChfX09QRU5DQ19fICogMHgxMDAwMEwgKyAoX19PUEVOQ0NfTUlOT1JfXy0wKSAqIDB4MTAwICsgKF9fT1BFTkNDX1BBVENITEVWRUxfXy0wKSkKKyMgICAgZGVmaW5lIExaT19DQ19PUEVONjRfR05VQyAgTFpPX0NDX0dOVUMKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19QQ0NfXykKKyMgIGlmIGRlZmluZWQoX19QQ0NfXykgJiYgZGVmaW5lZChfX1BDQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fUENDX01JTk9STUlOT1JfXykKKyMgICAgZGVmaW5lIExaT19DQ19QQ0MgICAgICAgICAgKF9fUENDX18gKiAweDEwMDAwTCArIChfX1BDQ19NSU5PUl9fLTApICogMHgxMDAgKyAoX19QQ0NfTUlOT1JNSU5PUl9fLTApKQorIyAgICBkZWZpbmUgTFpPX0NDX1BDQ19HTlVDICAgICBMWk9fQ0NfR05VQworIyAgZW5kaWYKKyNlbmRpZgorI2lmIDAgJiYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKSAmJiAhZGVmaW5lZChfTVNDX0ZVTExfVkVSKQorIyAgZXJyb3IgIkxaT19DQ19NU0M6IF9NU0NfRlVMTF9WRVIgaXMgbm90IGRlZmluZWQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX0xaT19BUkNIX09WRVJSSURFKSAmJiAhKExaT19BUkNIX0dFTkVSSUMpICYmIGRlZmluZWQoX0NSQVkpCisjICBpZiAoVUlOVF9NQVggPiBMWk9fMHhmZmZmZmZmZkwpICYmIGRlZmluZWQoX0NSQVkpCisjICAgIGlmIGRlZmluZWQoX0NSQVlNUFApIHx8IGRlZmluZWQoX0NSQVlUM0QpIHx8IGRlZmluZWQoX0NSQVlUM0UpCisjICAgICAgZGVmaW5lIExaT19BUkNIX0NSQVlfTVBQICAgICAxCisjICAgIGVsaWYgZGVmaW5lZChfQ1JBWTEpCisjICAgICAgZGVmaW5lIExaT19BUkNIX0NSQVlfUFZQICAgICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19MWk9fQVJDSF9PVkVSUklERSkKKyNpZiAoTFpPX0FSQ0hfR0VORVJJQykKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJnZW5lcmljIgorI2VsaWYgKExaT19PU19ET1MxNiB8fCBMWk9fT1NfT1MyMTYgfHwgTFpPX09TX1dJTjE2KQorIyAgZGVmaW5lIExaT19BUkNIX0kwODYgICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImkwODYiCisjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorIyAgZGVmaW5lIExaT19BUkNIX0FSTTY0ICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImFybTY0IgorI2VsaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19hbHBoYSkgfHwgZGVmaW5lZChfTV9BTFBIQSkKKyMgIGRlZmluZSBMWk9fQVJDSF9BTFBIQSAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJhbHBoYSIKKyNlbGlmIChMWk9fQVJDSF9DUkFZX01QUCkgJiYgKGRlZmluZWQoX0NSQVlUM0QpIHx8IGRlZmluZWQoX0NSQVlUM0UpKQorIyAgZGVmaW5lIExaT19BUkNIX0FMUEhBICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImFscGhhIgorI2VsaWYgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9BTUQ2NCkKKyMgIGRlZmluZSBMWk9fQVJDSF9BTUQ2NCAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJhbWQ2NCIKKyNlbGlmIGRlZmluZWQoX190aHVtYl9fKSB8fCAoZGVmaW5lZChfTV9BUk0pICYmIGRlZmluZWQoX01fVEhVTUIpKQorIyAgZGVmaW5lIExaT19BUkNIX0FSTSAgICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19BUkNIX0FSTV9USFVNQiAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImFybV90aHVtYiIKKyNlbGlmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykgJiYgZGVmaW5lZChfX0lDQ0FSTV9fKQorIyAgZGVmaW5lIExaT19BUkNIX0FSTSAgICAgICAgICAgICAgMQorIyAgaWYgZGVmaW5lZChfX0NQVV9NT0RFX18pICYmICgoX19DUFVfTU9ERV9fLTApID09IDEpCisjICAgIGRlZmluZSBMWk9fQVJDSF9BUk1fVEhVTUIgICAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAiYXJtX3RodW1iIgorIyAgZWxpZiBkZWZpbmVkKF9fQ1BVX01PREVfXykgJiYgKChfX0NQVV9NT0RFX18tMCkgPT0gMikKKyMgICAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICJhcm0iCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAiYXJtIgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pCisjICBkZWZpbmUgTFpPX0FSQ0hfQVJNICAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAiYXJtIgorI2VsaWYgKFVJTlRfTUFYIDw9IExaT18weGZmZmZMKSAmJiBkZWZpbmVkKF9fQVZSX18pCisjICBkZWZpbmUgTFpPX0FSQ0hfQVZSICAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAiYXZyIgorI2VsaWYgZGVmaW5lZChfX2F2cjMyX18pIHx8IGRlZmluZWQoX19BVlIzMl9fKQorIyAgZGVmaW5lIExaT19BUkNIX0FWUjMyICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImF2cjMyIgorI2VsaWYgZGVmaW5lZChfX2JmaW5fXykKKyMgIGRlZmluZSBMWk9fQVJDSF9CTEFDS0ZJTiAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJibGFja2ZpbiIKKyNlbGlmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmTCkgJiYgZGVmaW5lZChfX0MxNjZfXykKKyMgIGRlZmluZSBMWk9fQVJDSF9DMTY2ICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJjMTY2IgorI2VsaWYgZGVmaW5lZChfX2NyaXNfXykKKyMgIGRlZmluZSBMWk9fQVJDSF9DUklTICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJjcmlzIgorI2VsaWYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKSAmJiBkZWZpbmVkKF9fSUNDRVo4MF9fKQorIyAgZGVmaW5lIExaT19BUkNIX0VaODAgICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgImV6ODAiCisjZWxpZiBkZWZpbmVkKF9fSDgzMDBfXykgfHwgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pIHx8IGRlZmluZWQoX19IODMwMFNYX18pCisjICBkZWZpbmUgTFpPX0FSQ0hfSDgzMDAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAiaDgzMDAiCisjZWxpZiBkZWZpbmVkKF9faHBwYV9fKSB8fCBkZWZpbmVkKF9faHBwYSkKKyMgIGRlZmluZSBMWk9fQVJDSF9IUFBBICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJocHBhIgorI2VsaWYgZGVmaW5lZChfXzM4Nl9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9NX0kzODYpCisjICBkZWZpbmUgTFpPX0FSQ0hfSTM4NiAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0FSQ0hfSUEzMiAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAiaTM4NiIKKyNlbGlmIChMWk9fQ0NfWk9SVEVDSEMgJiYgZGVmaW5lZChfX0k4Nl9fKSkKKyMgIGRlZmluZSBMWk9fQVJDSF9JMzg2ICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fQVJDSF9JQTMyICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJpMzg2IgorI2VsaWYgKExaT19PU19ET1MzMiAmJiBMWk9fQ0NfSElHSEMpICYmIGRlZmluZWQoX0kzODYpCisjICBkZWZpbmUgTFpPX0FSQ0hfSTM4NiAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0FSQ0hfSUEzMiAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAiaTM4NiIKKyNlbGlmIGRlZmluZWQoX19pYTY0X18pIHx8IGRlZmluZWQoX19pYTY0KSB8fCBkZWZpbmVkKF9NX0lBNjQpCisjICBkZWZpbmUgTFpPX0FSQ0hfSUE2NCAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAiaWE2NCIKKyNlbGlmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmTCkgJiYgZGVmaW5lZChfX20zMmNfXykKKyMgIGRlZmluZSBMWk9fQVJDSF9NMTZDICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJtMTZjIgorI2VsaWYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKSAmJiBkZWZpbmVkKF9fSUNDTTE2Q19fKQorIyAgZGVmaW5lIExaT19BUkNIX00xNkMgICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgIm0xNmMiCisjZWxpZiBkZWZpbmVkKF9fbTMycl9fKQorIyAgZGVmaW5lIExaT19BUkNIX00zMlIgICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgIm0zMnIiCisjZWxpZiAoTFpPX09TX1RPUykgfHwgZGVmaW5lZChfX202OGtfXykgfHwgZGVmaW5lZChfX202ODAwMF9fKSB8fCBkZWZpbmVkKF9fbWM2ODAwMF9fKSB8fCBkZWZpbmVkKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkKF9NX002OEspCisjICBkZWZpbmUgTFpPX0FSQ0hfTTY4SyAgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAibTY4ayIKKyNlbGlmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmTCkgJiYgZGVmaW5lZChfX0MyNTFfXykKKyMgIGRlZmluZSBMWk9fQVJDSF9NQ1MyNTEgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJtY3MyNTEiCisjZWxpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpICYmIGRlZmluZWQoX19DNTFfXykKKyMgIGRlZmluZSBMWk9fQVJDSF9NQ1M1MSAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJtY3M1MSIKKyNlbGlmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykgJiYgZGVmaW5lZChfX0lDQzgwNTFfXykKKyMgIGRlZmluZSBMWk9fQVJDSF9NQ1M1MSAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJtY3M1MSIKKyNlbGlmIGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQoX19taXBzKSB8fCBkZWZpbmVkKF9NSVBTX0FSQ0gpIHx8IGRlZmluZWQoX01fTVJYMDAwKQorIyAgZGVmaW5lIExaT19BUkNIX01JUFMgICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgIm1pcHMiCisjZWxpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpICYmIGRlZmluZWQoX19NU1A0MzBfXykKKyMgIGRlZmluZSBMWk9fQVJDSF9NU1A0MzAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJtc3A0MzAiCisjZWxpZiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pICYmIGRlZmluZWQoX19JQ0M0MzBfXykKKyMgIGRlZmluZSBMWk9fQVJDSF9NU1A0MzAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJtc3A0MzAiCisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYykgfHwgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fUFBDX18pIHx8IGRlZmluZWQoX01fUFBDKSB8fCBkZWZpbmVkKF9BUkNIX1BQQykgfHwgZGVmaW5lZChfQVJDSF9QV1IpCisjICBkZWZpbmUgTFpPX0FSQ0hfUE9XRVJQQyAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgICAicG93ZXJwYyIKKyNlbGlmIGRlZmluZWQoX19zMzkwX18pIHx8IGRlZmluZWQoX19zMzkwKSB8fCBkZWZpbmVkKF9fczM5MHhfXykgfHwgZGVmaW5lZChfX3MzOTB4KQorIyAgZGVmaW5lIExaT19BUkNIX1MzOTAgICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgInMzOTAiCisjZWxpZiBkZWZpbmVkKF9fc2hfXykgfHwgZGVmaW5lZChfTV9TSCkKKyMgIGRlZmluZSBMWk9fQVJDSF9TSCAgICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJzaCIKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fc3BhcmMpIHx8IGRlZmluZWQoX19zcGFyY3Y4KQorIyAgZGVmaW5lIExaT19BUkNIX1NQQVJDICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgInNwYXJjIgorI2VsaWYgZGVmaW5lZChfX1NQVV9fKQorIyAgZGVmaW5lIExaT19BUkNIX1NQVSAgICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICAgInNwdSIKKyNlbGlmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmTCkgJiYgZGVmaW5lZChfX3o4MCkKKyMgIGRlZmluZSBMWk9fQVJDSF9aODAgICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJ6ODAiCisjZWxpZiAoTFpPX0FSQ0hfQ1JBWV9QVlApCisjICBpZiBkZWZpbmVkKF9DUkFZU1YxKQorIyAgICBkZWZpbmUgTFpPX0FSQ0hfQ1JBWV9TVjEgICAgICAgMQorIyAgICBkZWZpbmUgTFpPX0lORk9fQVJDSCAgICAgICAgICAgImNyYXlfc3YxIgorIyAgZWxpZiAoX0FERFI2NCkKKyMgICAgZGVmaW5lIExaT19BUkNIX0NSQVlfVDkwICAgICAgIDEKKyMgICAgZGVmaW5lIExaT19JTkZPX0FSQ0ggICAgICAgICAgICJjcmF5X3Q5MCIKKyMgIGVsaWYgKF9BRERSMzIpCisjICAgIGRlZmluZSBMWk9fQVJDSF9DUkFZX1lNUCAgICAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAiY3JheV95bXAiCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQVJDSF9DUkFZX1hNUCAgICAgICAxCisjICAgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAiY3JheV94bXAiCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBMWk9fQVJDSF9VTktOT1dOICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BUkNIICAgICAgICAgICAgICJ1bmtub3duIgorI2VuZGlmCisjZW5kaWYKKyNpZiAxICYmIChMWk9fQVJDSF9VTktOT1dOKSAmJiAoTFpPX09TX0RPUzMyIHx8IExaT19PU19PUzIpCisjICBlcnJvciAiRklYTUUgLSBtaXNzaW5nIGRlZmluZSBmb3IgQ1BVIGFyY2hpdGVjdHVyZSIKKyNlbmRpZgorI2lmIDEgJiYgKExaT19BUkNIX1VOS05PV04pICYmIChMWk9fT1NfV0lOMzIpCisjICBlcnJvciAiRklYTUUgLSBtaXNzaW5nIExaT19PU19XSU4zMiBkZWZpbmUgZm9yIENQVSBhcmNoaXRlY3R1cmUiCisjZW5kaWYKKyNpZiAxICYmIChMWk9fQVJDSF9VTktOT1dOKSAmJiAoTFpPX09TX1dJTjY0KQorIyAgZXJyb3IgIkZJWE1FIC0gbWlzc2luZyBMWk9fT1NfV0lONjQgZGVmaW5lIGZvciBDUFUgYXJjaGl0ZWN0dXJlIgorI2VuZGlmCisjaWYgKExaT19PU19PUzIxNiB8fCBMWk9fT1NfV0lOMTYpCisjICBkZWZpbmUgTFpPX0FSQ0hfSTA4NlBNICAgICAgICAgICAxCisjZWxpZiAxICYmIChMWk9fT1NfRE9TMTYgJiYgZGVmaW5lZChCTFgyODYpKQorIyAgZGVmaW5lIExaT19BUkNIX0kwODZQTSAgICAgICAgICAgMQorI2VsaWYgMSAmJiAoTFpPX09TX0RPUzE2ICYmIGRlZmluZWQoRE9TWDI4NikpCisjICBkZWZpbmUgTFpPX0FSQ0hfSTA4NlBNICAgICAgICAgICAxCisjZWxpZiAxICYmIChMWk9fT1NfRE9TMTYgJiYgTFpPX0NDX0JPUkxBTkRDICYmIGRlZmluZWQoX19EUE1JMTZfXykpCisjICBkZWZpbmUgTFpPX0FSQ0hfSTA4NlBNICAgICAgICAgICAxCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQU1ENjQgJiYgIUxaT19BUkNIX1g2NCkKKyMgIGRlZmluZSBMWk9fQVJDSF9YNjQgICAgICAgICAgICAgIDEKKyNlbGlmICghTFpPX0FSQ0hfQU1ENjQgJiYgTFpPX0FSQ0hfWDY0KSAmJiBkZWZpbmVkKF9fTFpPX0FSQ0hfT1ZFUlJJREUpCisjICBkZWZpbmUgTFpPX0FSQ0hfQU1ENjQgICAgICAgICAgICAxCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQVJNNjQgJiYgIUxaT19BUkNIX0FBUkNINjQpCisjICBkZWZpbmUgTFpPX0FSQ0hfQUFSQ0g2NCAgICAgICAgICAxCisjZWxpZiAoIUxaT19BUkNIX0FSTTY0ICYmIExaT19BUkNIX0FBUkNINjQpICYmIGRlZmluZWQoX19MWk9fQVJDSF9PVkVSUklERSkKKyMgIGRlZmluZSBMWk9fQVJDSF9BUk02NCAgICAgICAgICAgIDEKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9JMzg2ICYmICFMWk9fQVJDSF9YODYpCisjICBkZWZpbmUgTFpPX0FSQ0hfWDg2ICAgICAgICAgICAgICAxCisjZWxpZiAoIUxaT19BUkNIX0kzODYgJiYgTFpPX0FSQ0hfWDg2KSAmJiBkZWZpbmVkKF9fTFpPX0FSQ0hfT1ZFUlJJREUpCisjICBkZWZpbmUgTFpPX0FSQ0hfSTM4NiAgICAgICAgICAgIDEKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BTUQ2NCAmJiAhTFpPX0FSQ0hfWDY0KSB8fCAoIUxaT19BUkNIX0FNRDY0ICYmIExaT19BUkNIX1g2NCkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQVJNNjQgJiYgIUxaT19BUkNIX0FBUkNINjQpIHx8ICghTFpPX0FSQ0hfQVJNNjQgJiYgTFpPX0FSQ0hfQUFSQ0g2NCkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfSTM4NiAmJiAhTFpPX0FSQ0hfWDg2KSB8fCAoIUxaT19BUkNIX0kzODYgJiYgTFpPX0FSQ0hfWDg2KQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BUk1fVEhVTUIgJiYgIUxaT19BUkNIX0FSTSkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQVJNX1RIVU1CMSAmJiAhTFpPX0FSQ0hfQVJNX1RIVU1CKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BUk1fVEhVTUIyICYmICFMWk9fQVJDSF9BUk1fVEhVTUIpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19BUkNIX0FSTV9USFVNQjEgJiYgTFpPX0FSQ0hfQVJNX1RIVU1CMikKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfSTA4NlBNICYmICFMWk9fQVJDSF9JMDg2KQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9JMDg2KQorIyAgaWYgKFVJTlRfTUFYICE9IExaT18weGZmZmZMKQorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorIyAgZW5kaWYKKyMgIGlmIChVTE9OR19NQVggIT0gTFpPXzB4ZmZmZmZmZmZMKQorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9JMzg2KQorIyAgaWYgKFVJTlRfTUFYICE9IExaT18weGZmZmZMKSAmJiBkZWZpbmVkKF9faTM4Nl9pbnQxNl9fKQorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorIyAgZW5kaWYKKyMgIGlmIChVSU5UX01BWCAhPSBMWk9fMHhmZmZmZmZmZkwpICYmICFkZWZpbmVkKF9faTM4Nl9pbnQxNl9fKQorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorIyAgZW5kaWYKKyMgIGlmIChVTE9OR19NQVggIT0gTFpPXzB4ZmZmZmZmZmZMKQorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9JMzg2KQorIyAgaWYgIWRlZmluZWQoTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTIpCisjICAgIGlmIGRlZmluZWQoX19TU0UyX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9TU0UyICAgICAgIDEKKyMgICAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoKGRlZmluZWQoX01fSVg4Nl9GUCkgJiYgKChfTV9JWDg2X0ZQKSswID49IDIpKSB8fCBkZWZpbmVkKF9NX0FNRDY0KSkKKyMgICAgICBkZWZpbmUgTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTIgICAgICAgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMykKKyMgIGlmIChMWk9fVEFSR0VUX0ZFQVRVUkVfU1NFMikKKyMgICAgaWYgZGVmaW5lZChfX1NTU0UzX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMyAgICAgIDEKKyMgICAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9fQVZYX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMyAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTRfMikKKyMgIGlmIChMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMpCisjICAgIGlmIGRlZmluZWQoX19TU0U0XzJfXykKKyMgICAgICBkZWZpbmUgTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTRfMiAgICAgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYKQorIyAgaWYgKExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMykKKyMgICAgaWYgZGVmaW5lZChfX0FWWF9fKQorIyAgICAgIGRlZmluZSBMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYICAgICAgICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKExaT19UQVJHRVRfRkVBVFVSRV9BVlgyKQorIyAgaWYgKExaT19UQVJHRVRfRkVBVFVSRV9BVlgpCisjICAgIGlmIGRlZmluZWQoX19BVlgyX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9BVlgyICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgKExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMyAmJiAhKExaT19UQVJHRVRfRkVBVFVSRV9TU0UyKSkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAoTFpPX1RBUkdFVF9GRUFUVVJFX1NTRTRfMiAmJiAhKExaT19UQVJHRVRfRkVBVFVSRV9TU1NFMykpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgKExaT19UQVJHRVRfRkVBVFVSRV9BVlggJiYgIShMWk9fVEFSR0VUX0ZFQVRVUkVfU1NTRTMpKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fVEFSR0VUX0ZFQVRVUkVfQVZYMiAmJiAhKExaT19UQVJHRVRfRkVBVFVSRV9BVlgpKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BUk0pCisjICBpZiAhZGVmaW5lZChMWk9fVEFSR0VUX0ZFQVRVUkVfTkVPTikKKyMgICAgaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pCisjICAgICAgZGVmaW5lIExaT19UQVJHRVRfRkVBVFVSRV9ORU9OICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfQVJNNjQpCisjICBpZiAhZGVmaW5lZChMWk9fVEFSR0VUX0ZFQVRVUkVfTkVPTikKKyMgICAgaWYgMQorIyAgICAgIGRlZmluZSBMWk9fVEFSR0VUX0ZFQVRVUkVfTkVPTiAgICAgICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgMAorI2VsaWYgIWRlZmluZWQoX19MWk9fTU1fT1ZFUlJJREUpCisjaWYgKExaT19BUkNIX0kwODYpCisjaWYgKFVJTlRfTUFYICE9IExaT18weGZmZmZMKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIGRlZmluZWQoX19USU5ZX18pIHx8IGRlZmluZWQoTV9JODZUTSkgfHwgZGVmaW5lZChfTV9JODZUTSkKKyMgIGRlZmluZSBMWk9fTU1fVElOWSAgICAgICAgICAgMQorI2VsaWYgZGVmaW5lZChfX0hVR0VfXykgfHwgZGVmaW5lZChfSFVHRV8pIHx8IGRlZmluZWQoTV9JODZITSkgfHwgZGVmaW5lZChfTV9JODZITSkKKyMgIGRlZmluZSBMWk9fTU1fSFVHRSAgICAgICAgICAgMQorI2VsaWYgZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChfTV9JODZTTSkgfHwgZGVmaW5lZChTTUFMTF9NT0RFTCkKKyMgIGRlZmluZSBMWk9fTU1fU01BTEwgICAgICAgICAgMQorI2VsaWYgZGVmaW5lZChfX01FRElVTV9fKSB8fCBkZWZpbmVkKE1fSTg2TU0pIHx8IGRlZmluZWQoX01fSTg2TU0pCisjICBkZWZpbmUgTFpPX01NX01FRElVTSAgICAgICAgIDEKKyNlbGlmIGRlZmluZWQoX19DT01QQUNUX18pIHx8IGRlZmluZWQoTV9JODZDTSkgfHwgZGVmaW5lZChfTV9JODZDTSkKKyMgIGRlZmluZSBMWk9fTU1fQ09NUEFDVCAgICAgICAgMQorI2VsaWYgZGVmaW5lZChfX0xBUkdFX18pIHx8IGRlZmluZWQoTV9JODZMTSkgfHwgZGVmaW5lZChfTV9JODZMTSkgfHwgZGVmaW5lZChMQVJHRV9NT0RFTCkKKyMgIGRlZmluZSBMWk9fTU1fTEFSR0UgICAgICAgICAgMQorI2VsaWYgKExaT19DQ19BWlRFQ0MpCisjICBpZiBkZWZpbmVkKF9MQVJHRV9DT0RFKSAmJiBkZWZpbmVkKF9MQVJHRV9EQVRBKQorIyAgICBkZWZpbmUgTFpPX01NX0xBUkdFICAgICAgICAxCisjICBlbGlmIGRlZmluZWQoX0xBUkdFX0NPREUpCisjICAgIGRlZmluZSBMWk9fTU1fTUVESVVNICAgICAgIDEKKyMgIGVsaWYgZGVmaW5lZChfTEFSR0VfREFUQSkKKyMgICAgZGVmaW5lIExaT19NTV9DT01QQUNUICAgICAgMQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX01NX1NNQUxMICAgICAgICAxCisjICBlbmRpZgorI2VsaWYgKExaT19DQ19aT1JURUNIQyAmJiBkZWZpbmVkKF9fVkNNX18pKQorIyAgZGVmaW5lIExaT19NTV9MQVJHRSAgICAgICAgICAxCisjZWxzZQorIyAgZXJyb3IgInVua25vd24gTFpPX0FSQ0hfSTA4NiBtZW1vcnkgbW9kZWwiCisjZW5kaWYKKyNpZiAoTFpPX09TX0RPUzE2IHx8IExaT19PU19PUzIxNiB8fCBMWk9fT1NfV0lOMTYpCisjZGVmaW5lIExaT19IQVZFX01NX0hVR0VfUFRSICAgICAgICAxCisjZGVmaW5lIExaT19IQVZFX01NX0hVR0VfQVJSQVkgICAgICAxCisjaWYgKExaT19NTV9USU5ZKQorIyAgdW5kZWYgTFpPX0hBVkVfTU1fSFVHRV9BUlJBWQorI2VuZGlmCisjaWYgKExaT19DQ19BWlRFQ0MgfHwgTFpPX0NDX1BBQ0lGSUNDIHx8IExaT19DQ19aT1JURUNIQykKKyMgIHVuZGVmIExaT19IQVZFX01NX0hVR0VfUFRSCisjICB1bmRlZiBMWk9fSEFWRV9NTV9IVUdFX0FSUkFZCisjZWxpZiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfU1lNQU5URUNDKQorIyAgdW5kZWYgTFpPX0hBVkVfTU1fSFVHRV9BUlJBWQorI2VsaWYgKExaT19DQ19NU0MgJiYgZGVmaW5lZChfUUMpKQorIyAgdW5kZWYgTFpPX0hBVkVfTU1fSFVHRV9BUlJBWQorIyAgaWYgKF9NU0NfVkVSIDwgNjAwKQorIyAgICB1bmRlZiBMWk9fSEFWRV9NTV9IVUdFX1BUUgorIyAgZW5kaWYKKyNlbGlmIChMWk9fQ0NfVFVSQk9DICYmIChfX1RVUkJPQ19fIDwgMHgwMjk1KSkKKyMgIHVuZGVmIExaT19IQVZFX01NX0hVR0VfQVJSQVkKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9JMDg2UE0pICYmICEoTFpPX0hBVkVfTU1fSFVHRV9QVFIpCisjICBpZiAoTFpPX09TX0RPUzE2KQorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorIyAgZWxpZiAoTFpPX0NDX1pPUlRFQ0hDKQorIyAgZWxzZQorIyAgICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorIyAgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorI2lmIChMWk9fQ0NfQk9STEFOREMgJiYgKF9fQk9STEFORENfXyA+PSAweDAyMDApKQorICAgZXh0ZXJuIHZvaWQgX19uZWFyIF9fY2RlY2wgX0FIU0hJRlQodm9pZCk7CisjICBkZWZpbmUgTFpPX01NX0FIU0hJRlQgICAgICAoKHVuc2lnbmVkKSBfQUhTSElGVCkKKyNlbGlmIChMWk9fQ0NfRE1DIHx8IExaT19DQ19TWU1BTlRFQ0MgfHwgTFpPX0NDX1pPUlRFQ0hDKQorICAgZXh0ZXJuIHZvaWQgX19uZWFyIF9fY2RlY2wgX0FIU0hJRlQodm9pZCk7CisjICBkZWZpbmUgTFpPX01NX0FIU0hJRlQgICAgICAoKHVuc2lnbmVkKSBfQUhTSElGVCkKKyNlbGlmIChMWk9fQ0NfTVNDIHx8IExaT19DQ19UT1BTUEVFREMpCisgICBleHRlcm4gdm9pZCBfX25lYXIgX19jZGVjbCBfQUhTSElGVCh2b2lkKTsKKyMgIGRlZmluZSBMWk9fTU1fQUhTSElGVCAgICAgICgodW5zaWduZWQpIF9BSFNISUZUKQorI2VsaWYgKExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPj0gMHgwMjk1KSkKKyAgIGV4dGVybiB2b2lkIF9fbmVhciBfX2NkZWNsIF9BSFNISUZUKHZvaWQpOworIyAgZGVmaW5lIExaT19NTV9BSFNISUZUICAgICAgKCh1bnNpZ25lZCkgX0FIU0hJRlQpCisjZWxpZiAoKExaT19DQ19BWlRFQ0MgfHwgTFpPX0NDX1BBQ0lGSUNDIHx8IExaT19DQ19UVVJCT0MpICYmIExaT19PU19ET1MxNikKKyMgIGRlZmluZSBMWk9fTU1fQUhTSElGVCAgICAgIDEyCisjZWxpZiAoTFpPX0NDX1dBVENPTUMpCisgICBleHRlcm4gdW5zaWduZWQgY2hhciBfSFNoaWZ0OworIyAgZGVmaW5lIExaT19NTV9BSFNISUZUICAgICAgKCh1bnNpZ25lZCkgX0hTaGlmdCkKKyNlbHNlCisjICBlcnJvciAiRklYTUUgLSBpbXBsZW1lbnQgTFpPX01NX0FIU0hJRlQiCisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKKyNlbGlmIChMWk9fQVJDSF9DMTY2KQorI2lmICFkZWZpbmVkKF9fTU9ERUxfXykKKyMgIGVycm9yICJGSVhNRSAtIExaT19BUkNIX0MxNjYgX19NT0RFTF9fIgorI2VsaWYgKChfX01PREVMX18pID09IDApCisjICBkZWZpbmUgTFpPX01NX1NNQUxMICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSAxKQorIyAgZGVmaW5lIExaT19NTV9TTUFMTCAgICAgICAgICAxCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gMikKKyMgIGRlZmluZSBMWk9fTU1fTEFSR0UgICAgICAgICAgMQorI2VsaWYgKChfX01PREVMX18pID09IDMpCisjICBkZWZpbmUgTFpPX01NX1RJTlkgICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSA0KQorIyAgZGVmaW5lIExaT19NTV9YVElOWSAgICAgICAgICAxCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gNSkKKyMgIGRlZmluZSBMWk9fTU1fWFNNQUxMICAgICAgICAgMQorI2Vsc2UKKyMgIGVycm9yICJGSVhNRSAtIExaT19BUkNIX0MxNjYgX19NT0RFTF9fIgorI2VuZGlmCisjZWxpZiAoTFpPX0FSQ0hfTUNTMjUxKQorI2lmICFkZWZpbmVkKF9fTU9ERUxfXykKKyMgIGVycm9yICJGSVhNRSAtIExaT19BUkNIX01DUzI1MSBfX01PREVMX18iCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gMCkKKyMgIGRlZmluZSBMWk9fTU1fU01BTEwgICAgICAgICAgMQorI2VsaWYgKChfX01PREVMX18pID09IDIpCisjICBkZWZpbmUgTFpPX01NX0xBUkdFICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSAzKQorIyAgZGVmaW5lIExaT19NTV9USU5ZICAgICAgICAgICAxCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gNCkKKyMgIGRlZmluZSBMWk9fTU1fWFRJTlkgICAgICAgICAgMQorI2VsaWYgKChfX01PREVMX18pID09IDUpCisjICBkZWZpbmUgTFpPX01NX1hTTUFMTCAgICAgICAgIDEKKyNlbHNlCisjICBlcnJvciAiRklYTUUgLSBMWk9fQVJDSF9NQ1MyNTEgX19NT0RFTF9fIgorI2VuZGlmCisjZWxpZiAoTFpPX0FSQ0hfTUNTNTEpCisjaWYgIWRlZmluZWQoX19NT0RFTF9fKQorIyAgZXJyb3IgIkZJWE1FIC0gTFpPX0FSQ0hfTUNTNTEgX19NT0RFTF9fIgorI2VsaWYgKChfX01PREVMX18pID09IDEpCisjICBkZWZpbmUgTFpPX01NX1NNQUxMICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSAyKQorIyAgZGVmaW5lIExaT19NTV9MQVJHRSAgICAgICAgICAxCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gMykKKyMgIGRlZmluZSBMWk9fTU1fVElOWSAgICAgICAgICAgMQorI2VsaWYgKChfX01PREVMX18pID09IDQpCisjICBkZWZpbmUgTFpPX01NX1hUSU5ZICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSA1KQorIyAgZGVmaW5lIExaT19NTV9YU01BTEwgICAgICAgICAxCisjZWxzZQorIyAgZXJyb3IgIkZJWE1FIC0gTFpPX0FSQ0hfTUNTNTEgX19NT0RFTF9fIgorI2VuZGlmCisjZWxpZiAoTFpPX0FSQ0hfQ1JBWV9QVlApCisjICBkZWZpbmUgTFpPX01NX1BWUCAgICAgICAgICAgIDEKKyNlbHNlCisjICBkZWZpbmUgTFpPX01NX0ZMQVQgICAgICAgICAgIDEKKyNlbmRpZgorI2lmIChMWk9fTU1fQ09NUEFDVCkKKyMgIGRlZmluZSBMWk9fSU5GT19NTSAgICAgICAgICAgImNvbXBhY3QiCisjZWxpZiAoTFpPX01NX0ZMQVQpCisjICBkZWZpbmUgTFpPX0lORk9fTU0gICAgICAgICAgICJmbGF0IgorI2VsaWYgKExaT19NTV9IVUdFKQorIyAgZGVmaW5lIExaT19JTkZPX01NICAgICAgICAgICAiaHVnZSIKKyNlbGlmIChMWk9fTU1fTEFSR0UpCisjICBkZWZpbmUgTFpPX0lORk9fTU0gICAgICAgICAgICJsYXJnZSIKKyNlbGlmIChMWk9fTU1fTUVESVVNKQorIyAgZGVmaW5lIExaT19JTkZPX01NICAgICAgICAgICAibWVkaXVtIgorI2VsaWYgKExaT19NTV9QVlApCisjICBkZWZpbmUgTFpPX0lORk9fTU0gICAgICAgICAgICJwdnAiCisjZWxpZiAoTFpPX01NX1NNQUxMKQorIyAgZGVmaW5lIExaT19JTkZPX01NICAgICAgICAgICAic21hbGwiCisjZWxpZiAoTFpPX01NX1RJTlkpCisjICBkZWZpbmUgTFpPX0lORk9fTU0gICAgICAgICAgICJ0aW55IgorI2Vsc2UKKyMgIGVycm9yICJ1bmtub3duIG1lbW9yeSBtb2RlbCIKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fZ251Y19leHRlbnNpb25fXykKKyNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMjA4MDB1bCkKKyMgIGRlZmluZSBfX2x6b19nbnVjX2V4dGVuc2lvbl9fICAgIF9fZXh0ZW5zaW9uX18KKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19nbnVjX2V4dGVuc2lvbl9fICAgIF9fZXh0ZW5zaW9uX18KKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA2MDApCisjICBkZWZpbmUgX19sem9fZ251Y19leHRlbnNpb25fXyAgICBfX2V4dGVuc2lvbl9fCisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19nbnVjX2V4dGVuc2lvbl9fKQorIyAgZGVmaW5lIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gICAgLyplbXB0eSovCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIDAKKyMgIGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDgwMHVsKSkKKyMgICAgZGVmaW5lIExaT19DRkdfVVNFX05FV19TVFlMRV9DQVNUUyAwCisjICBlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSIDwgMTIwMCkpCisjICAgIGRlZmluZSBMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMgMAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICBkZWZpbmUgTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTIDAKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgaWYgZGVmaW5lZChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICAgIHVuZGVmIExaT19DRkdfVVNFX05FV19TVFlMRV9DQVNUUworIyAgZW5kaWYKKyMgIGRlZmluZSBMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMgMAorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1JFSU5URVJQUkVUX0NBU1QpCisjICBpZiAoTFpPX0NGR19VU0VfTkVXX1NUWUxFX0NBU1RTKQorIyAgICBkZWZpbmUgTFpPX1JFSU5URVJQUkVUX0NBU1QodCxlKSAgICAgICAocmVpbnRlcnByZXRfY2FzdDx0PiAoZSkpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1JFSU5URVJQUkVUX0NBU1QpCisjICBkZWZpbmUgTFpPX1JFSU5URVJQUkVUX0NBU1QodCxlKSAgICAgICAgICgodCkgKGUpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1NUQVRJQ19DQVNUKQorIyAgaWYgKExaT19DRkdfVVNFX05FV19TVFlMRV9DQVNUUykKKyMgICAgZGVmaW5lIExaT19TVEFUSUNfQ0FTVCh0LGUpICAgICAgICAgICAgKHN0YXRpY19jYXN0PHQ+IChlKSkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fU1RBVElDX0NBU1QpCisjICBkZWZpbmUgTFpPX1NUQVRJQ19DQVNUKHQsZSkgICAgICAgICAgICAgICgodCkgKGUpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1NUQVRJQ19DQVNUMikKKyMgIGRlZmluZSBMWk9fU1RBVElDX0NBU1QyKHQxLHQyLGUpICAgICAgICAgTFpPX1NUQVRJQ19DQVNUKHQxLCBMWk9fU1RBVElDX0NBU1QodDIsIGUpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOQ09OU1RfQ0FTVCkKKyMgIGlmIChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICAgIGRlZmluZSBMWk9fVU5DT05TVF9DQVNUKHQsZSkgICAgICAgICAgIChjb25zdF9jYXN0PHQ+IChlKSkKKyMgIGVsaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfQ0FTVCh0LGUpICAgICAgICAgICAoKHQpIChlKSkKKyMgIGVsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfQ0FTVCh0LGUpICAgICAgICAgICAoKHQpICgodm9pZCAqKSAoKGx6b191aW50cHRyX3QpICgoY29uc3Qgdm9pZCAqKSAoZSkpKSkpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOQ09OU1RfQ0FTVCkKKyMgIGRlZmluZSBMWk9fVU5DT05TVF9DQVNUKHQsZSkgICAgICAgICAgICAgKCh0KSAoKHZvaWQgKikgKChjb25zdCB2b2lkICopIChlKSkpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOQ09OU1RfVk9MQVRJTEVfQ0FTVCkKKyMgIGlmIChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICAgIGRlZmluZSBMWk9fVU5DT05TVF9WT0xBVElMRV9DQVNUKHQsZSkgIChjb25zdF9jYXN0PHQ+IChlKSkKKyMgIGVsaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfVk9MQVRJTEVfQ0FTVCh0LGUpICAoKHQpIChlKSkKKyMgIGVsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgICBkZWZpbmUgTFpPX1VOQ09OU1RfVk9MQVRJTEVfQ0FTVCh0LGUpICAoKHQpICgodm9sYXRpbGUgdm9pZCAqKSAoKGx6b191aW50cHRyX3QpICgodm9sYXRpbGUgY29uc3Qgdm9pZCAqKSAoZSkpKSkpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOQ09OU1RfVk9MQVRJTEVfQ0FTVCkKKyMgIGRlZmluZSBMWk9fVU5DT05TVF9WT0xBVElMRV9DQVNUKHQsZSkgICAgKCh0KSAoKHZvbGF0aWxlIHZvaWQgKikgKCh2b2xhdGlsZSBjb25zdCB2b2lkICopIChlKSkpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOVk9MQVRJTEVfQ0FTVCkKKyMgIGlmIChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DQVNUKHQsZSkgICAgICAgIChjb25zdF9jYXN0PHQ+IChlKSkKKyMgIGVsaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorIyAgICBkZWZpbmUgTFpPX1VOVk9MQVRJTEVfQ0FTVCh0LGUpICAgICAgICAoKHQpIChlKSkKKyMgIGVsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgICBkZWZpbmUgTFpPX1VOVk9MQVRJTEVfQ0FTVCh0LGUpICAgICAgICAoKHQpICgodm9pZCAqKSAoKGx6b191aW50cHRyX3QpICgodm9sYXRpbGUgdm9pZCAqKSAoZSkpKSkpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOVk9MQVRJTEVfQ0FTVCkKKyMgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DQVNUKHQsZSkgICAgICAgICAgKCh0KSAoKHZvaWQgKikgKCh2b2xhdGlsZSB2b2lkICopIChlKSkpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOVk9MQVRJTEVfQ09OU1RfQ0FTVCkKKyMgIGlmIChMWk9fQ0ZHX1VTRV9ORVdfU1RZTEVfQ0FTVFMpCisjICAgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKHQsZSkgIChjb25zdF9jYXN0PHQ+IChlKSkKKyMgIGVsaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorIyAgICBkZWZpbmUgTFpPX1VOVk9MQVRJTEVfQ09OU1RfQ0FTVCh0LGUpICAoKHQpIChlKSkKKyMgIGVsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgICBkZWZpbmUgTFpPX1VOVk9MQVRJTEVfQ09OU1RfQ0FTVCh0LGUpICAoKHQpICgoY29uc3Qgdm9pZCAqKSAoKGx6b191aW50cHRyX3QpICgodm9sYXRpbGUgY29uc3Qgdm9pZCAqKSAoZSkpKSkpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOVk9MQVRJTEVfQ09OU1RfQ0FTVCkKKyMgIGRlZmluZSBMWk9fVU5WT0xBVElMRV9DT05TVF9DQVNUKHQsZSkgICAgKCh0KSAoKGNvbnN0IHZvaWQgKikgKCh2b2xhdGlsZSBjb25zdCB2b2lkICopIChlKSkpKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1BDQVNUKQorIyAgaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorIyAgICBkZWZpbmUgTFpPX1BDQVNUKHQsZSkgICAgICAgICAgICAgICAgICAoKHQpIChlKSkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fUENBU1QpCisjICBkZWZpbmUgTFpPX1BDQVNUKHQsZSkgICAgICAgICAgICAgICAgICAgIExaT19TVEFUSUNfQ0FTVCh0LCBMWk9fU1RBVElDX0NBU1Qodm9pZCAqLCBlKSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19DQ0FTVCkKKyMgIGlmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyMgICAgZGVmaW5lIExaT19DQ0FTVCh0LGUpICAgICAgICAgICAgICAgICAgKCh0KSAoZSkpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0NDQVNUKQorIyAgZGVmaW5lIExaT19DQ0FTVCh0LGUpICAgICAgICAgICAgICAgICAgICBMWk9fU1RBVElDX0NBU1QodCwgTFpPX1NUQVRJQ19DQVNUKGNvbnN0IHZvaWQgKiwgZSkpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fSUNPTlYpCisjICBkZWZpbmUgTFpPX0lDT05WKHQsZSkgICAgICAgICAgICAgICAgICAgIExaT19TVEFUSUNfQ0FTVCh0LCBlKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0lDQVNUKQorIyAgZGVmaW5lIExaT19JQ0FTVCh0LGUpICAgICAgICAgICAgICAgICAgICBMWk9fU1RBVElDX0NBU1QodCwgZSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19JVFJVTkMpCisjICBkZWZpbmUgTFpPX0lUUlVOQyh0LGUpICAgICAgICAgICAgICAgICAgIExaT19TVEFUSUNfQ0FTVCh0LCBlKQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fY3RlKQorIyAgaWYgKExaT19DQ19NU0MgfHwgTFpPX0NDX1dBVENPTUMpCisjICAgIGRlZmluZSBfX2x6b19jdGUoZSkgICAgICAgICAgICAoKHZvaWQpMCwoZSkpCisjICBlbGlmIDEKKyMgICAgZGVmaW5lIF9fbHpvX2N0ZShlKSAgICAgICAgICAgICgodm9pZCkwLChlKSkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19jdGUpCisjICBkZWZpbmUgX19sem9fY3RlKGUpICAgICAgICAgICAgICAoZSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19CTE9DS19CRUdJTikKKyMgIGRlZmluZSBMWk9fQkxPQ0tfQkVHSU4gICAgICAgICAgIGRvIHsKKyMgIGRlZmluZSBMWk9fQkxPQ0tfRU5EICAgICAgICAgICAgIH0gd2hpbGUgX19sem9fY3RlKDApCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fVU5VU0VEKQorIyAgaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDYwMCkpCisjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICAoKHZvaWQpICZ2YXIpCisjICBlbGlmIChMWk9fQ0NfQk9STEFOREMgfHwgTFpPX0NDX0hJR0hDIHx8IExaT19DQ19ORFBDIHx8IExaT19DQ19QRUxMRVNDIHx8IExaT19DQ19UVVJCT0MpCisjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICBpZiAoJnZhcikgOyBlbHNlCisjICBlbGlmIChMWk9fQ0NfQ0xBTkcgJiYgKExaT19DQ19DTEFORyA+PSAweDAzMDIwMHVsKSkKKyMgICAgZGVmaW5lIExaT19VTlVTRUQodmFyKSAgICAgICAgICgodm9pZCkgJnZhcikKKyMgIGVsaWYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgICBkZWZpbmUgTFpPX1VOVVNFRCh2YXIpICAgICAgICAgKCh2b2lkKSB2YXIpCisjICBlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA8IDkwMCkpCisjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICBpZiAoJnZhcikgOyBlbHNlCisjICBlbGlmIChMWk9fQ0NfS0VJTEMpCisjICAgIGRlZmluZSBMWk9fVU5VU0VEKHZhcikgICAgICAgICB7TFpPX0VYVEVSTl9DIGludCBsem9fdW51c2VkX19bMS0yKiEoc2l6ZW9mKHZhcik+MCldO30KKyMgIGVsaWYgKExaT19DQ19QQUNJRklDQykKKyMgICAgZGVmaW5lIExaT19VTlVTRUQodmFyKSAgICAgICAgICgodm9pZCkgc2l6ZW9mKHZhcikpCisjICBlbGlmIChMWk9fQ0NfV0FUQ09NQykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgZGVmaW5lIExaT19VTlVTRUQodmFyKSAgICAgICAgICgodm9pZCkgdmFyKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX1VOVVNFRCh2YXIpICAgICAgICAgKCh2b2lkKSAmdmFyKQorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19VTlVTRURfRlVOQykKKyMgIGlmIChMWk9fQ0NfQk9STEFOREMgJiYgKF9fQk9STEFORENfXyA+PSAweDA2MDApKQorIyAgICBkZWZpbmUgTFpPX1VOVVNFRF9GVU5DKGZ1bmMpICAgKCh2b2lkKSBmdW5jKQorIyAgZWxpZiAoTFpPX0NDX0JPUkxBTkRDIHx8IExaT19DQ19ORFBDIHx8IExaT19DQ19UVVJCT0MpCisjICAgIGRlZmluZSBMWk9fVU5VU0VEX0ZVTkMoZnVuYykgICBpZiAoZnVuYykgOyBlbHNlCisjICBlbGlmIChMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0pCisjICAgIGRlZmluZSBMWk9fVU5VU0VEX0ZVTkMoZnVuYykgICAoKHZvaWQpICZmdW5jKQorIyAgZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPCA5MDApKQorIyAgICBkZWZpbmUgTFpPX1VOVVNFRF9GVU5DKGZ1bmMpICAgaWYgKGZ1bmMpIDsgZWxzZQorIyAgZWxpZiAoTFpPX0NDX01TQykKKyMgICAgZGVmaW5lIExaT19VTlVTRURfRlVOQyhmdW5jKSAgICgodm9pZCkgJmZ1bmMpCisjICBlbGlmIChMWk9fQ0NfS0VJTEMgfHwgTFpPX0NDX1BFTExFU0MpCisjICAgIGRlZmluZSBMWk9fVU5VU0VEX0ZVTkMoZnVuYykgICB7TFpPX0VYVEVSTl9DIGludCBsem9fdW51c2VkX2Z1bmNfX1sxLTIqIShzaXplb2YoKGludClmdW5jKT4wKV07fQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX1VOVVNFRF9GVU5DKGZ1bmMpICAgKCh2b2lkKSBmdW5jKQorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19VTlVTRURfTEFCRUwpCisjICBpZiAoTFpPX0NDX0NMQU5HID49IDB4MDIwODAwdWwpCisjICAgIGRlZmluZSBMWk9fVU5VU0VEX0xBQkVMKGwpICAgICAoX19sem9fZ251Y19leHRlbnNpb25fXyAoKHZvaWQpICgoY29uc3Qgdm9pZCAqKSAmJmwpKSkKKyMgIGVsaWYgKExaT19DQ19BUk1DQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0lOVEVMQyB8fCBMWk9fQ0NfV0FUQ09NQykKKyMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIGlmIF9fbHpvX2N0ZSgwKSBnb3RvIGwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19VTlVTRURfTEFCRUwobCkgICAgIHN3aXRjaCAoMCkgY2FzZSAxOmdvdG8gbAorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19ERUZJTkVfVU5JTklUSUFMSVpFRF9WQVIpCisjICBpZiAwCisjICAgIGRlZmluZSBMWk9fREVGSU5FX1VOSU5JVElBTElaRURfVkFSKHR5cGUsdmFyLGluaXQpICB0eXBlIHZhcgorIyAgZWxpZiAwICYmIChMWk9fQ0NfR05VQykKKyMgICAgZGVmaW5lIExaT19ERUZJTkVfVU5JTklUSUFMSVpFRF9WQVIodHlwZSx2YXIsaW5pdCkgIHR5cGUgdmFyID0gdmFyCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fREVGSU5FX1VOSU5JVElBTElaRURfVkFSKHR5cGUsdmFyLGluaXQpICB0eXBlIHZhciA9IGluaXQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19pbmxpbmUpCisjaWYgKExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPD0gMHgwMjk1KSkKKyNlbGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIGlubGluZQorI2VsaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXy0wID49IDE5OTkwMUwpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIGlubGluZQorI2VsaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDU1MCkpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NJTExZIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IExaT19DQ19QR0kpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KKyNlbGlmIChMWk9fQ0NfRE1DKQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQorI2VsaWYgKExaT19DQ19HSFMpCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA2MDApCisjICBkZWZpbmUgX19sem9faW5saW5lICAgICAgICAgIF9faW5saW5lX18KKyNlbGlmIChMWk9fQ0NfSU5URUxDKQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQorI2VsaWYgKExaT19DQ19NV0VSS1MgJiYgKF9fTVdFUktTX18gPj0gMHgyNDA1KSkKKyMgIGRlZmluZSBfX2x6b19pbmxpbmUgICAgICAgICAgX19pbmxpbmUKKyNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSA5MDApKQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICBfX2lubGluZQorI2VsaWYgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkKKyMgIGRlZmluZSBfX2x6b19pbmxpbmUgICAgICAgICAgX19pbmxpbmVfXworI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2lubGluZSkKKyMgIGlmbmRlZiBfX2x6b19IQVZFX2lubGluZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfaW5saW5lIDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX2lubGluZSAgICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2ZvcmNlaW5saW5lKQorI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDIwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA3MDApCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDQ1MCkpCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9fZm9yY2VpbmxpbmUKKyNlbGlmIChMWk9fQ0NfSU5URUxDX0dOVUMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSkKKyMgIGRlZmluZSBfX2x6b19mb3JjZWlubGluZSAgICAgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2ZvcmNlaW5saW5lCisjZWxpZiAoTFpPX0NDX1BHSSA+PSAweDBkMGEwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyNlbGlmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApCisjICBkZWZpbmUgX19sem9fZm9yY2VpbmxpbmUgICAgIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2ZvcmNlaW5saW5lKQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfZm9yY2VpbmxpbmUKKyMgIGRlZmluZSBfX2x6b19IQVZFX2ZvcmNlaW5saW5lIDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX2ZvcmNlaW5saW5lICAgICBfX2x6b19pbmxpbmUKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX25vaW5saW5lKQorI2lmIDEgJiYgKExaT19BUkNIX0kzODYpICYmIChMWk9fQ0NfR05VQyA+PSAweDA0MDAwMHVsKSAmJiAoTFpPX0NDX0dOVUMgPCAweDA0MDAwM3VsKQorIyAgZGVmaW5lIF9fbHpvX25vaW5saW5lICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18sX191c2VkX18pKQorI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDMwMjAwdWwpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX0lCTUMgPj0gNzAwKQorIyAgZGVmaW5lIF9fbHpvX25vaW5saW5lICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjZWxpZiAoTFpPX0NDX01XRVJLUyAmJiAoX19NV0VSS1NfXyA+PSAweDMyMDApICYmIChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0KSkKKyMgIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICBlbHNlCisjICAgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgIF9fZGVjbHNwZWMobm9pbmxpbmUpCisjICBlbmRpZgorI2VsaWYgKExaT19DQ19QR0kgPj0gMHgwZDBhMDB1bCkKKyMgIGRlZmluZSBfX2x6b19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKKyNlbGlmIChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fbm9pbmxpbmUpCisjICBpZm5kZWYgX19sem9fSEFWRV9ub2lubGluZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfbm9pbmxpbmUgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fbm9pbmxpbmUgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgKF9fbHpvX0hBVkVfZm9yY2VpbmxpbmUgfHwgX19sem9fSEFWRV9ub2lubGluZSkgJiYgIShfX2x6b19IQVZFX2lubGluZSkKKyMgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19zdGF0aWNfaW5saW5lKQorI2lmIChMWk9fQ0NfSUJNQykKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfaW5saW5lICAgICAgIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gc3RhdGljIF9fbHpvX2lubGluZQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19zdGF0aWNfaW5saW5lKQorIyAgZGVmaW5lIF9fbHpvX3N0YXRpY19pbmxpbmUgICAgICAgc3RhdGljIF9fbHpvX2lubGluZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fc3RhdGljX2ZvcmNlaW5saW5lKQorI2lmIChMWk9fQ0NfSUJNQykKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gc3RhdGljIF9fbHpvX2ZvcmNlaW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX3N0YXRpY19mb3JjZWlubGluZSkKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgIHN0YXRpYyBfX2x6b19mb3JjZWlubGluZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fc3RhdGljX25vaW5saW5lKQorI2lmIChMWk9fQ0NfSUJNQykKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfbm9pbmxpbmUgICAgIF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gc3RhdGljIF9fbHpvX25vaW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX3N0YXRpY19ub2lubGluZSkKKyMgIGRlZmluZSBfX2x6b19zdGF0aWNfbm9pbmxpbmUgICAgIHN0YXRpYyBfX2x6b19ub2lubGluZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fYzk5X2V4dGVybl9pbmxpbmUpCisjaWYgZGVmaW5lZChfX0dOVUNfR05VX0lOTElORV9fKQorIyAgZGVmaW5lIF9fbHpvX2M5OV9leHRlcm5faW5saW5lICAgX19sem9faW5saW5lCisjZWxpZiBkZWZpbmVkKF9fR05VQ19TVERDX0lOTElORV9fKQorIyAgZGVmaW5lIF9fbHpvX2M5OV9leHRlcm5faW5saW5lICAgZXh0ZXJuIF9fbHpvX2lubGluZQorI2VsaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXy0wID49IDE5OTkwMUwpCisjICBkZWZpbmUgX19sem9fYzk5X2V4dGVybl9pbmxpbmUgICBleHRlcm4gX19sem9faW5saW5lCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19jOTlfZXh0ZXJuX2lubGluZSkgJiYgKF9fbHpvX0hBVkVfaW5saW5lKQorIyAgZGVmaW5lIF9fbHpvX2M5OV9leHRlcm5faW5saW5lICAgX19sem9faW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fYzk5X2V4dGVybl9pbmxpbmUpCisjICBpZm5kZWYgX19sem9fSEFWRV9jOTlfZXh0ZXJuX2lubGluZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfYzk5X2V4dGVybl9pbmxpbmUgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fYzk5X2V4dGVybl9pbmxpbmUgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX21heV9hbGlhcykKKyNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzA0MDB1bCkKKyMgIGRlZmluZSBfX2x6b19tYXlfYWxpYXMgICAgICAgX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpCisjZWxpZiAoTFpPX0NDX0NMQU5HID49IDB4MDIwOTAwdWwpCisjICBkZWZpbmUgX19sem9fbWF5X2FsaWFzICAgICAgIF9fYXR0cmlidXRlX18oKF9fbWF5X2FsaWFzX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfR05VQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSAxMjEwKSkgJiYgMAorIyAgZGVmaW5lIF9fbHpvX21heV9hbGlhcyAgICAgICBfX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSkKKyNlbGlmIChMWk9fQ0NfUEdJID49IDB4MGQwYTAwdWwpICYmIDAKKyMgIGRlZmluZSBfX2x6b19tYXlfYWxpYXMgICAgICAgX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fbWF5X2FsaWFzKQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfbWF5X2FsaWFzCisjICBkZWZpbmUgX19sem9fSEFWRV9tYXlfYWxpYXMgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fbWF5X2FsaWFzICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fbm9yZXR1cm4pCisjaWYgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoTFpPX0NDX0lCTUMgPj0gNzAwKQorIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDQ1MCkpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTIwMCkpCisjICBkZWZpbmUgX19sem9fbm9yZXR1cm4gICAgICAgIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxpZiAoTFpPX0NDX1BHSSA+PSAweDBkMGEwMHVsKQorIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX25vcmV0dXJuKQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfbm9yZXR1cm4KKyMgIGRlZmluZSBfX2x6b19IQVZFX25vcmV0dXJuIDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX25vcmV0dXJuICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX25vdGhyb3cpCisjaWYgKExaT19DQ19HTlVDID49IDB4MDMwMzAwdWwpCisjICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKKyNlbGlmIChMWk9fQ0NfSU5URUxDX01TQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA0NTApKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICBfX2RlY2xzcGVjKG5vdGhyb3cpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDkwMCkpCisjICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19ub3Rocm93ICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3Rocm93X18pKQorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIF9fbHpvX25vdGhyb3cgICAgICAgICBfX2RlY2xzcGVjKG5vdGhyb3cpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fbm90aHJvdykKKyMgIGlmbmRlZiBfX2x6b19IQVZFX25vdGhyb3cKKyMgIGRlZmluZSBfX2x6b19IQVZFX25vdGhyb3cgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fbm90aHJvdyAgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fcmVzdHJpY3QpCisjaWYgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19JQk1DID49IDgwMCkgJiYgIWRlZmluZWQoX19jcGx1c3BsdXMpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19JQk1DID49IDEyMTApCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDYwMCkpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfTExWTSkKKyMgIGRlZmluZSBfX2x6b19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdF9fCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3QKKyNlbGlmIChMWk9fQ0NfUEdJID49IDB4MGQwYTAwdWwpCisjICBkZWZpbmUgX19sem9fcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX3Jlc3RyaWN0KQorIyAgaWZuZGVmIF9fbHpvX0hBVkVfcmVzdHJpY3QKKyMgIGRlZmluZSBfX2x6b19IQVZFX3Jlc3RyaWN0IDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX3Jlc3RyaWN0ICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2FsaWdub2YpCisjaWYgKExaT19DQ19BUk1DQyB8fCBMWk9fQ0NfQ0lMTFkgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUgfHwgTFpPX0NDX1BHSSkKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChMWk9fQ0NfR0hTKSAmJiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA2MDApCisjICBkZWZpbmUgX19sem9fYWxpZ25vZihlKSAgICAgIChfX2x6b19nbnVjX2V4dGVuc2lvbl9fIF9fYWxpZ25vZl9fKGUpKQorI2VsaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gNzAwKSkKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMzAwKSkKKyMgIGRlZmluZSBfX2x6b19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mKGUpCisjZWxpZiAoTFpPX0NDX1NVTlBST0MgPj0gMHg1MTAwKQorIyAgZGVmaW5lIF9fbHpvX2FsaWdub2YoZSkgICAgICBfX2FsaWdub2ZfXyhlKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2FsaWdub2YpCisjICBpZm5kZWYgX19sem9fSEFWRV9hbGlnbm9mCisjICBkZWZpbmUgX19sem9fSEFWRV9hbGlnbm9mIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19zdHJ1Y3RfcGFja2VkKQorI2lmICAgKExaT19DQ19DTEFORyAmJiAoTFpPX0NDX0NMQU5HIDwgMHgwMjA4MDB1bCkpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZWxpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjA3MDB1bCkpCisjZWxpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjA4MDB1bCkpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZWxpZiAoTFpPX0NDX1BDQyAmJiAoTFpPX0NDX1BDQyA8IDB4MDEwMTAwdWwpKQorI2VsaWYgKExaT19DQ19TVU5QUk9DICYmIChMWk9fQ0NfU1VOUFJPQyA8IDB4NTExMCkpICYmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpICYmICEoTFpPX0NDX1BDQ19HTlVDKSAmJiAoTFpPX0FSQ0hfQU1ENjQgfHwgTFpPX0FSQ0hfSTM4NikKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfcGFja2VkKHMpICAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9lbmQoKSAgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2djY19zdHJ1Y3RfXyxfX3BhY2tlZF9fKSk7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9tYV9lbmQoKSAgfSBfX2x6b19tYXlfYWxpYXMgX19hdHRyaWJ1dGVfXygoX19nY2Nfc3RydWN0X18sX19wYWNrZWRfXykpOworI2VsaWYgKExaT19DQ19BUk1DQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0dOVUMgfHwgTFpPX0NDX0lOVEVMQ19HTlVDIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUgfHwgKExaT19DQ19QR0kgPj0gMHgwZDBhMDB1bCkgfHwgKExaT19DQ19TVU5QUk9DID49IDB4NTEwMCkpCisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZChzKSAgICAgICAgc3RydWN0IHMgeworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKCkgICAgIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWRfbWFfZW5kKCkgIH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA3MDApCisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZChzKSAgICAgICAgX19sem9fZ251Y19leHRlbnNpb25fXyBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9lbmQoKSAgICAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9tYV9lbmQoKSAgfSBfX2x6b19tYXlfYWxpYXMgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworI2VsaWYgKExaT19DQ19JTlRFTENfTVNDKSB8fCAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZChzKSAgICAgICAgX19wcmFnbWEocGFjayhwdXNoLDEpKSBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X3BhY2tlZF9lbmQoKSAgICAgfSBfX3ByYWdtYShwYWNrKHBvcCkpOworI2VsaWYgKExaT19DQ19XQVRDT01DICYmIChfX1dBVENPTUNfXyA+PSA5MDApKQorIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWQocykgICAgICAgIF9QYWNrZWQgc3RydWN0IHMgeworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKCkgICAgIH07CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fc3RydWN0X3BhY2tlZCkgJiYgIWRlZmluZWQoX19sem9fc3RydWN0X3BhY2tlZF9tYSkKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfcGFja2VkX21hKHMpICAgICBfX2x6b19zdHJ1Y3RfcGFja2VkKHMpCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKSAmJiAhZGVmaW5lZChfX2x6b19zdHJ1Y3RfcGFja2VkX21hX2VuZCkKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfcGFja2VkX21hX2VuZCgpICBfX2x6b19zdHJ1Y3RfcGFja2VkX2VuZCgpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19ieXRlX3N0cnVjdCkKKyNpZiBkZWZpbmVkKF9fbHpvX3N0cnVjdF9wYWNrZWQpCisjICBkZWZpbmUgX19sem9fYnl0ZV9zdHJ1Y3QocyxuKSAgICAgICAgX19sem9fc3RydWN0X3BhY2tlZChzKSB1bnNpZ25lZCBjaGFyIGFbbl07IF9fbHpvX3N0cnVjdF9wYWNrZWRfZW5kKCkKKyMgIGRlZmluZSBfX2x6b19ieXRlX3N0cnVjdF9tYShzLG4pICAgICBfX2x6b19zdHJ1Y3RfcGFja2VkX21hKHMpIHVuc2lnbmVkIGNoYXIgYVtuXTsgX19sem9fc3RydWN0X3BhY2tlZF9tYV9lbmQoKQorI2VsaWYgKExaT19DQ19DSUxMWSB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX1BHSSB8fCAoTFpPX0NDX1NVTlBST0MgPj0gMHg1MTAwKSkKKyMgIGRlZmluZSBfX2x6b19ieXRlX3N0cnVjdChzLG4pICAgICAgICBzdHJ1Y3QgcyB7IHVuc2lnbmVkIGNoYXIgYVtuXTsgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisjICBkZWZpbmUgX19sem9fYnl0ZV9zdHJ1Y3RfbWEocyxuKSAgICAgc3RydWN0IHMgeyB1bnNpZ25lZCBjaGFyIGFbbl07IH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2x6b19ieXRlX3N0cnVjdCkgJiYgICFkZWZpbmVkKF9fbHpvX2J5dGVfc3RydWN0X21hKQorIyAgZGVmaW5lIF9fbHpvX2J5dGVfc3RydWN0X21hKHMsbikgICAgIF9fbHpvX2J5dGVfc3RydWN0KHMsbikKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX3N0cnVjdF9hbGlnbjE2KSAmJiAoX19sem9fSEFWRV9hbGlnbm9mKQorI2lmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAzMDAwMHVsKSkKKyNlbGlmIChMWk9fQ0NfQ0xBTkcgJiYgKExaT19DQ19DTEFORyA8IDB4MDIwODAwdWwpKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2VsaWYgKExaT19DQ19DSUxMWSB8fCBMWk9fQ0NfUENDKQorI2VsaWYgKExaT19DQ19JTlRFTENfTVNDKSB8fCAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMTYocykgICAgICAgc3RydWN0IF9fZGVjbHNwZWMoYWxpZ24oMTYpKSBzIHsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ24xNl9lbmQoKSAgICB9OworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9hbGlnbjMyKHMpICAgICAgIHN0cnVjdCBfX2RlY2xzcGVjKGFsaWduKDMyKSkgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMzJfZW5kKCkgICAgfTsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ242NChzKSAgICAgICBzdHJ1Y3QgX19kZWNsc3BlYyhhbGlnbig2NCkpIHMgeworIyAgZGVmaW5lIF9fbHpvX3N0cnVjdF9hbGlnbjY0X2VuZCgpICAgIH07CisjZWxpZiAoTFpPX0NDX0FSTUNDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCAoTFpPX0NDX0lCTUMgPj0gNzAwKSB8fCBMWk9fQ0NfSU5URUxDX0dOVUMgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ24xNihzKSAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMTZfZW5kKCkgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxNikpKTsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ24zMihzKSAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduMzJfZW5kKCkgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygzMikpKTsKKyMgIGRlZmluZSBfX2x6b19zdHJ1Y3RfYWxpZ242NChzKSAgICAgICBzdHJ1Y3QgcyB7CisjICBkZWZpbmUgX19sem9fc3RydWN0X2FsaWduNjRfZW5kKCkgICAgfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg2NCkpKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fdW5pb25fdW0pCisjaWYgICAoTFpPX0NDX0NMQU5HICYmIChMWk9fQ0NfQ0xBTkcgPCAweDAyMDgwMHVsKSkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDcwMHVsKSkKKyNlbGlmIChMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPCAweDAyMDgwMHVsKSkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChMWk9fQ0NfSU5URUxDX0dOVUMgJiYgKF9fSU5URUxfQ09NUElMRVIgPCA4MTApKQorI2VsaWYgKExaT19DQ19QQ0MgJiYgKExaT19DQ19QQ0MgPCAweDAxMDEwMHVsKSkKKyNlbGlmIChMWk9fQ0NfU1VOUFJPQyAmJiAoTFpPX0NDX1NVTlBST0MgPCAweDUxMTApKSAmJiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChMWk9fQ0NfQVJNQ0MgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19JTlRFTENfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IChMWk9fQ0NfUEdJID49IDB4MGQwYTAwdWwpIHx8IChMWk9fQ0NfU1VOUFJPQyA+PSAweDUxMDApKQorIyAgZGVmaW5lIF9fbHpvX3VuaW9uX2FtKHMpICAgICAgICAgICAgIHVuaW9uIHMgeworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX2FtX2VuZCgpICAgICAgICAgIH0gX19sem9fbWF5X2FsaWFzOworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtKHMpICAgICAgICAgICAgIHVuaW9uIHMgeworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtX2VuZCgpICAgICAgICAgIH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbGlmIChMWk9fQ0NfSUJNQyA+PSA3MDApCisjICBkZWZpbmUgX19sem9fdW5pb25fYW0ocykgICAgICAgICAgICAgX19sem9fZ251Y19leHRlbnNpb25fXyB1bmlvbiBzIHsKKyMgIGRlZmluZSBfX2x6b191bmlvbl9hbV9lbmQoKSAgICAgICAgICB9IF9fbHpvX21heV9hbGlhczsKKyMgIGRlZmluZSBfX2x6b191bmlvbl91bShzKSAgICAgICAgICAgICBfX2x6b19nbnVjX2V4dGVuc2lvbl9fIHVuaW9uIHMgeworIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtX2VuZCgpICAgICAgICAgIH0gX19sem9fbWF5X2FsaWFzIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKyNlbGlmIChMWk9fQ0NfSU5URUxDX01TQykgfHwgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEzMDApKQorIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtKHMpICAgICAgICAgICAgIF9fcHJhZ21hKHBhY2socHVzaCwxKSkgdW5pb24gcyB7CisjICBkZWZpbmUgX19sem9fdW5pb25fdW1fZW5kKCkgICAgICAgICAgfSBfX3ByYWdtYShwYWNrKHBvcCkpOworI2VsaWYgKExaT19DQ19XQVRDT01DICYmIChfX1dBVENPTUNfXyA+PSA5MDApKQorIyAgZGVmaW5lIF9fbHpvX3VuaW9uX3VtKHMpICAgICAgICAgICAgIF9QYWNrZWQgdW5pb24gcyB7CisjICBkZWZpbmUgX19sem9fdW5pb25fdW1fZW5kKCkgICAgICAgICAgfTsKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fdW5pb25fYW0pCisjICBkZWZpbmUgX19sem9fdW5pb25fYW0ocykgICAgICAgICAgICAgdW5pb24gcyB7CisjICBkZWZpbmUgX19sem9fdW5pb25fYW1fZW5kKCkgICAgICAgICAgfTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2NvbnN0cnVjdG9yKQorI2lmIChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2NvbnN0cnVjdG9yICAgICBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0cnVjdG9yX18sX191c2VkX18pKQorI2VsaWYgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpCisjICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXyxfX3VzZWRfXykpCisjZWxpZiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19sem9fY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fY29uc3RydWN0b3IpCisjICBpZm5kZWYgX19sem9fSEFWRV9jb25zdHJ1Y3RvcgorIyAgZGVmaW5lIF9fbHpvX0hBVkVfY29uc3RydWN0b3IgMQorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2Rlc3RydWN0b3IpCisjaWYgKExaT19DQ19HTlVDID49IDB4MDMwNDAwdWwpCisjICBkZWZpbmUgX19sem9fZGVzdHJ1Y3RvciAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVzdHJ1Y3Rvcl9fLF9fdXNlZF9fKSkKKyNlbGlmIChMWk9fQ0NfR05VQyA+PSAweDAyMDcwMHVsKQorIyAgZGVmaW5lIF9fbHpvX2Rlc3RydWN0b3IgICAgICBfX2F0dHJpYnV0ZV9fKChfX2Rlc3RydWN0b3JfXykpCisjZWxpZiAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fZGVzdHJ1Y3RvciAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVzdHJ1Y3Rvcl9fLF9fdXNlZF9fKSkKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19kZXN0cnVjdG9yICAgICAgX19hdHRyaWJ1dGVfXygoX19kZXN0cnVjdG9yX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2Rlc3RydWN0b3IpCisjICBpZm5kZWYgX19sem9fSEFWRV9kZXN0cnVjdG9yCisjICBkZWZpbmUgX19sem9fSEFWRV9kZXN0cnVjdG9yIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoX19sem9fSEFWRV9kZXN0cnVjdG9yKSAmJiAhKF9fbHpvX0hBVkVfY29uc3RydWN0b3IpCisjICBlcnJvciAidW5leHBlY3RlZCBjb25maWd1cmF0aW9uIC0gY2hlY2sgeW91ciBjb21waWxlciBkZWZpbmVzIgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fbGlrZWx5KSAmJiAhZGVmaW5lZChfX2x6b191bmxpa2VseSkKKyNpZiAoTFpPX0NDX0dOVUMgPj0gMHgwMzAyMDB1bCkKKyMgIGRlZmluZSBfX2x6b19saWtlbHkoZSkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMSkpCisjICBkZWZpbmUgX19sem9fdW5saWtlbHkoZSkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDApKQorI2VsaWYgKExaT19DQ19JQk1DID49IDEwMTApCisjICBkZWZpbmUgX19sem9fbGlrZWx5KGUpICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDEpKQorIyAgZGVmaW5lIF9fbHpvX3VubGlrZWx5KGUpICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwwKSkKKyNlbGlmIChMWk9fQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkpCisjICBkZWZpbmUgX19sem9fbGlrZWx5KGUpICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDEpKQorIyAgZGVmaW5lIF9fbHpvX3VubGlrZWx5KGUpICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwwKSkKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2x6b19saWtlbHkoZSkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMSkpCisjICBkZWZpbmUgX19sem9fdW5saWtlbHkoZSkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDApKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2xpa2VseSkKKyMgIGlmbmRlZiBfX2x6b19IQVZFX2xpa2VseQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfbGlrZWx5IDEKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoZSkKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fdW5saWtlbHkpCisjICBpZm5kZWYgX19sem9fSEFWRV91bmxpa2VseQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfdW5saWtlbHkgMQorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgX19sem9fdW5saWtlbHkoZSkgICAgIChlKQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fc3RhdGljX3VudXNlZF92b2lkX2Z1bmMpCisjICBpZiAxICYmIChMWk9fQ0NfQVJNQ0NfR05VQyB8fCBMWk9fQ0NfQ0xBTkcgfHwgKExaT19DQ19HTlVDID49IDB4MDIwNzAwdWwpIHx8IExaT19DQ19JTlRFTENfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFIHx8IExaT19DQ19QR0kpCisjICAgIGRlZmluZSBfX2x6b19zdGF0aWNfdW51c2VkX3ZvaWRfZnVuYyhmKSAgICBzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkgZih2b2lkKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX19sem9fc3RhdGljX3VudXNlZF92b2lkX2Z1bmMoZikgICAgc3RhdGljIF9fbHpvX2lubGluZSB2b2lkIGYodm9pZCkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2x6b19sb29wX2ZvcmV2ZXIpCisjICBpZiAoTFpPX0NDX0lCTUMpCisjICAgIGRlZmluZSBfX2x6b19sb29wX2ZvcmV2ZXIoKSAgICBMWk9fQkxPQ0tfQkVHSU4gZm9yICg7OykgeyA7IH0gTFpPX0JMT0NLX0VORAorIyAgZWxzZQorIyAgICBkZWZpbmUgX19sem9fbG9vcF9mb3JldmVyKCkgICAgZG8geyA7IH0gd2hpbGUgX19sem9fY3RlKDEpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fdW5yZWFjaGFibGUpCisjaWYgKExaT19DQ19DTEFORyAmJiAoTFpPX0NDX0NMQU5HID49IDB4MDIwODAwdWwpKQorIyAgZGVmaW5lIF9fbHpvX3VucmVhY2hhYmxlKCkgICAgICAgX19idWlsdGluX3VucmVhY2hhYmxlKCk7CisjZWxpZiAoTFpPX0NDX0dOVUMgPj0gMHgwNDA1MDB1bCkKKyMgIGRlZmluZSBfX2x6b191bnJlYWNoYWJsZSgpICAgICAgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpOworI2VsaWYgKExaT19DQ19JTlRFTENfR05VQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSAxMzAwKSkgJiYgMQorIyAgZGVmaW5lIF9fbHpvX3VucmVhY2hhYmxlKCkgICAgICAgX19idWlsdGluX3VucmVhY2hhYmxlKCk7CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19sem9fdW5yZWFjaGFibGUpCisjICBpZm5kZWYgX19sem9fSEFWRV91bnJlYWNoYWJsZQorIyAgZGVmaW5lIF9fbHpvX0hBVkVfdW5yZWFjaGFibGUgMQorIyAgZW5kaWYKKyNlbHNlCisjICBpZiAwCisjICBkZWZpbmUgX19sem9fdW5yZWFjaGFibGUoKSAgICAgICAoKHZvaWQpMCk7CisjICBlbHNlCisjICBkZWZpbmUgX19sem9fdW5yZWFjaGFibGUoKSAgICAgICBfX2x6b19sb29wX2ZvcmV2ZXIoKTsKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgX19MWk9fQ1RBX05BTUUKKyNpZiAoTFpPX0NGR19VU0VfQ09VTlRFUikKKyMgIGRlZmluZSBfX0xaT19DVEFfTkFNRShhKSAgICAgICAgIExaT19QUF9FQ09OQ0FUMihhLF9fQ09VTlRFUl9fKQorI2Vsc2UKKyMgIGRlZmluZSBfX0xaT19DVEFfTkFNRShhKSAgICAgICAgIExaT19QUF9FQ09OQ0FUMihhLF9fTElORV9fKQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIpCisjICBpZiAoTFpPX0NDX0FaVEVDQyB8fCBMWk9fQ0NfWk9SVEVDSEMpCisjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoZSkgIExaT19FWFRFUk5fQ19CRUdJTiBleHRlcm4gaW50IF9fTFpPX0NUQV9OQU1FKGx6b19jdGFfXylbMS0hKGUpXTsgTFpPX0VYVEVSTl9DX0VORAorIyAgZWxpZiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfU1lNQU5URUNDKQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBMWk9fRVhURVJOX0NfQkVHSU4gZXh0ZXJuIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX18pWzF1LTIqIShlKV07IExaT19FWFRFUk5fQ19FTkQKKyMgIGVsaWYgKExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPT0gMHgwMjk1KSkKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgTFpPX0VYVEVSTl9DX0JFR0lOIGV4dGVybiBpbnQgX19MWk9fQ1RBX05BTUUobHpvX2N0YV9fKVsxLSEoZSldOyBMWk9fRVhURVJOX0NfRU5ECisjICBlbGlmIChMWk9fQ0NfQ0xBTkcgJiYgKExaT19DQ19DTEFORyA8IDB4MDIwOTAwdWwpKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBMWk9fRVhURVJOX0NfQkVHSU4gaW50IF9fTFpPX0NUQV9OQU1FKGx6b19jdGFfZl9fKShpbnQgWzEtMiohKGUpXSk7IExaT19FWFRFUk5fQ19FTkQKKyMgIGVsaWYgKExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fQ0hFQ0tFUl9fKSAmJiBkZWZpbmVkKF9fU1BBUlNFX0NIRUNLRVJfXykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgTFpPX0VYVEVSTl9DX0JFR0lOIGVudW0ge19fTFpPX0NUQV9OQU1FKGx6b19jdGFfZV9fKT0xLyEhKGUpfSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSk7IExaT19FWFRFUk5fQ19FTkQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihlKSAgTFpPX0VYVEVSTl9DX0JFR0lOIGV4dGVybiBpbnQgX19MWk9fQ1RBX05BTUUobHpvX2N0YV9fKVsxLTIqIShlKV07IExaT19FWFRFUk5fQ19FTkQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fQ09NUElMRV9USU1FX0FTU0VSVCkKKyMgIGlmIChMWk9fQ0NfQVpURUNDKQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoZSkgIHt0eXBlZGVmIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX3RfXylbMS0hKGUpXTt9CisjICBlbGlmIChMWk9fQ0NfRE1DIHx8IExaT19DQ19QQUNJRklDQyB8fCBMWk9fQ0NfU1lNQU5URUNDIHx8IExaT19DQ19aT1JURUNIQykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICBzd2l0Y2goMCkgY2FzZSAxOmNhc2UgIShlKTpicmVhazsKKyMgIGVsaWYgKExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fQ0hFQ0tFUl9fKSAmJiBkZWZpbmVkKF9fU1BBUlNFX0NIRUNLRVJfXykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICB7KHZvaWQpICgwLyEhKGUpKTt9CisjICBlbGlmIChMWk9fQ0NfR05VQyA+PSAweDA0MDcwMHVsKSAmJiAoTFpPX0NGR19VU0VfQ09VTlRFUikgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgZGVmaW5lIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICB7ZW51bSB7X19MWk9fQ1RBX05BTUUobHpvX2N0YV9lX18pPTEvISEoZSl9IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTt9CisjICBlbGlmIChMWk9fQ0NfR05VQyA+PSAweDA0MDcwMHVsKQorIyAgICBkZWZpbmUgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoZSkgIHt0eXBlZGVmIGludCBfX0xaT19DVEFfTkFNRShsem9fY3RhX3RfXylbMS0yKiEoZSldIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTt9CisjICBlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA8IDkwMCkpCisjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAgc3dpdGNoKDApIGNhc2UgMTpjYXNlICEoZSk6YnJlYWs7CisjICBlbGlmIChMWk9fQ0NfVFVSQk9DICYmIChfX1RVUkJPQ19fID09IDB4MDI5NSkpCisjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAgc3dpdGNoKDApIGNhc2UgMTpjYXNlICEoZSk6YnJlYWs7CisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChlKSAge3R5cGVkZWYgaW50IF9fTFpPX0NUQV9OQU1FKGx6b19jdGFfdF9fKVsxLTIqIShlKV07fQorIyAgZW5kaWYKKyNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKDEgPT0gMSkKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7IExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUigyID09IDIpIH0KKyNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKDMgPT0gMykKKyNpZiAoTFpPX0FSQ0hfSTA4NiB8fCBMWk9fQVJDSF9JMzg2KSAmJiAoTFpPX09TX0RPUzE2IHx8IExaT19PU19ET1MzMiB8fCBMWk9fT1NfT1MyIHx8IExaT19PU19PUzIxNiB8fCBMWk9fT1NfV0lOMTYgfHwgTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKKyMgIGlmIChMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfSElHSEMgfHwgTFpPX0NDX05EUEMgfHwgTFpPX0NDX1BBQ0lGSUNDKQorIyAgZWxpZiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfU1lNQU5URUNDIHx8IExaT19DQ19aT1JURUNIQykKKyMgICAgZGVmaW5lIF9fbHpvX2NkZWNsICAgICAgICAgICAgICAgICBfX2NkZWNsCisjICAgIGRlZmluZSBfX2x6b19jZGVjbF9hdGV4aXQgICAgICAgICAgLyplbXB0eSovCisjICAgIGRlZmluZSBfX2x6b19jZGVjbF9tYWluICAgICAgICAgICAgX19jZGVjbAorIyAgICBpZiAoTFpPX09TX09TMiAmJiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfU1lNQU5URUNDKSkKKyMgICAgICBkZWZpbmUgX19sem9fY2RlY2xfcXNvcnQgICAgICAgICBfX3Bhc2NhbAorIyAgICBlbGlmIChMWk9fT1NfT1MyICYmIChMWk9fQ0NfWk9SVEVDSEMpKQorIyAgICAgIGRlZmluZSBfX2x6b19jZGVjbF9xc29ydCAgICAgICAgIF9zdGRjYWxsCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX19sem9fY2RlY2xfcXNvcnQgICAgICAgICBfX2NkZWNsCisjICAgIGVuZGlmCisjICBlbGlmIChMWk9fQ0NfV0FUQ09NQykKKyMgICAgZGVmaW5lIF9fbHpvX2NkZWNsICAgICAgICAgICAgICAgICBfX2NkZWNsCisjICBlbHNlCisjICAgIGRlZmluZSBfX2x6b19jZGVjbCAgICAgICAgICAgICAgICAgX19jZGVjbAorIyAgICBkZWZpbmUgX19sem9fY2RlY2xfYXRleGl0ICAgICAgICAgIF9fY2RlY2wKKyMgICAgZGVmaW5lIF9fbHpvX2NkZWNsX21haW4gICAgICAgICAgICBfX2NkZWNsCisjICAgIGRlZmluZSBfX2x6b19jZGVjbF9xc29ydCAgICAgICAgICAgX19jZGVjbAorIyAgZW5kaWYKKyMgIGlmIChMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfSElHSEMgfHwgTFpPX0NDX05EUEMgfHwgTFpPX0NDX1BBQ0lGSUNDIHx8IExaT19DQ19XQVRDT01DKQorIyAgZWxpZiAoTFpPX09TX09TMiAmJiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfU1lNQU5URUNDKSkKKyMgICAgZGVmaW5lIF9fbHpvX2NkZWNsX3NpZ2hhbmRsZXIgICAgICBfX3Bhc2NhbAorIyAgZWxpZiAoTFpPX09TX09TMiAmJiAoTFpPX0NDX1pPUlRFQ0hDKSkKKyMgICAgZGVmaW5lIF9fbHpvX2NkZWNsX3NpZ2hhbmRsZXIgICAgICBfc3RkY2FsbAorIyAgZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpICYmIGRlZmluZWQoX01fQ0VFX1BVUkUpCisjICAgIGRlZmluZSBfX2x6b19jZGVjbF9zaWdoYW5kbGVyICAgICAgX19jbHJjYWxsCisjICBlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSA2MDAgJiYgX01TQ19WRVIgPCA3MDApKQorIyAgICBpZiBkZWZpbmVkKF9ETEwpCisjICAgICAgZGVmaW5lIF9fbHpvX2NkZWNsX3NpZ2hhbmRsZXIgICAgX2ZhciBfY2RlY2wgX2xvYWRkcworIyAgICBlbGlmIGRlZmluZWQoX01UKQorIyAgICAgIGRlZmluZSBfX2x6b19jZGVjbF9zaWdoYW5kbGVyICAgIF9mYXIgX2NkZWNsCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX19sem9fY2RlY2xfc2lnaGFuZGxlciAgICBfY2RlY2wKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9fbHpvX2NkZWNsX3NpZ2hhbmRsZXIgICAgICBfX2NkZWNsCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX0kzODYpICYmIChMWk9fQ0NfV0FUQ09NQykKKyMgIGRlZmluZSBfX2x6b19jZGVjbCAgICAgICAgICAgICAgICAgICBfX2NkZWNsCisjZWxpZiAoTFpPX0FSQ0hfTTY4SyAmJiBMWk9fT1NfVE9TICYmIChMWk9fQ0NfUFVSRUMgfHwgTFpPX0NDX1RVUkJPQykpCisjICBkZWZpbmUgX19sem9fY2RlY2wgICAgICAgICAgICAgICAgICAgY2RlY2wKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2NkZWNsKQorIyAgZGVmaW5lIF9fbHpvX2NkZWNsICAgICAgICAgICAgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fY2RlY2xfYXRleGl0KQorIyAgZGVmaW5lIF9fbHpvX2NkZWNsX2F0ZXhpdCAgICAgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fY2RlY2xfbWFpbikKKyMgIGRlZmluZSBfX2x6b19jZGVjbF9tYWluICAgICAgICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2NkZWNsX3Fzb3J0KQorIyAgZGVmaW5lIF9fbHpvX2NkZWNsX3Fzb3J0ICAgICAgICAgICAgIC8qZW1wdHkqLworI2VuZGlmCisjaWYgIWRlZmluZWQoX19sem9fY2RlY2xfc2lnaGFuZGxlcikKKyMgIGRlZmluZSBfX2x6b19jZGVjbF9zaWdoYW5kbGVyICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fbHpvX2NkZWNsX3ZhKQorIyAgZGVmaW5lIF9fbHpvX2NkZWNsX3ZhICAgICAgICAgICAgICAgIF9fbHpvX2NkZWNsCisjZW5kaWYKKyNpZiAhKExaT19DRkdfTk9fV0lORE9XU19IKQorI2lmICFkZWZpbmVkKExaT19IQVZFX1dJTkRPV1NfSCkKKyNpZiAoTFpPX09TX0NZR1dJTiB8fCAoTFpPX09TX0VNWCAmJiBkZWZpbmVkKF9fUlNYTlRfXykpIHx8IExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpCisjICBpZiAoTFpPX0NDX1dBVENPTUMgJiYgKF9fV0FUQ09NQ19fIDwgMTAwMCkpCisjICBlbGlmIChMWk9fT1NfV0lOMzIgJiYgTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19QVzMyX18pCisjICBlbGlmICgoTFpPX09TX0NZR1dJTiB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkgJiYgKExaT19DQ19HTlVDICYmIChMWk9fQ0NfR05VQyA8IDB4MDI1ZjAwdWwpKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19IQVZFX1dJTkRPV1NfSCAxCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX1NIT1JUCisjaWYgZGVmaW5lZChTSVpFT0ZfU0hPUlQpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgICAoU0laRU9GX1NIT1JUKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9TSE9SVF9fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgICAgKF9fU0laRU9GX1NIT1JUX18pCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX0lOVAorI2lmIGRlZmluZWQoU0laRU9GX0lOVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAgIChTSVpFT0ZfSU5UKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9JTlRfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAgIChfX1NJWkVPRl9JTlRfXykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfTE9ORworI2lmIGRlZmluZWQoU0laRU9GX0xPTkcpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgICAoU0laRU9GX0xPTkcpCisjZWxpZiBkZWZpbmVkKF9fU0laRU9GX0xPTkdfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAgIChfX1NJWkVPRl9MT05HX18pCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX0xPTkdfTE9ORworI2lmIGRlZmluZWQoU0laRU9GX0xPTkdfTE9ORykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIChTSVpFT0ZfTE9OR19MT05HKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9MT05HX0xPTkdfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIChfX1NJWkVPRl9MT05HX0xPTkdfXykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfX19JTlQxNgorI2lmIGRlZmluZWQoU0laRU9GX19fSU5UMTYpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDE2ICAgICAgICAoU0laRU9GX19fSU5UMTYpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX19fSU5UMzIKKyNpZiBkZWZpbmVkKFNJWkVPRl9fX0lOVDMyKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQzMiAgICAgICAgKFNJWkVPRl9fX0lOVDMyKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTFpPX1NJWkVPRl9fX0lOVDY0CisjaWYgZGVmaW5lZChTSVpFT0ZfX19JTlQ2NCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIChTSVpFT0ZfX19JTlQ2NCkKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfVk9JRF9QCisjaWYgZGVmaW5lZChTSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgKFNJWkVPRl9WT0lEX1ApCisjZWxpZiBkZWZpbmVkKF9fU0laRU9GX1BPSU5URVJfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIChfX1NJWkVPRl9QT0lOVEVSX18pCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMWk9fU0laRU9GX1NJWkVfVAorI2lmIGRlZmluZWQoU0laRU9GX1NJWkVfVCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIChTSVpFT0ZfU0laRV9UKQorI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9TSVpFX1RfXykKKyMgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICAgIChfX1NJWkVPRl9TSVpFX1RfXykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExaT19TSVpFT0ZfUFRSRElGRl9UCisjaWYgZGVmaW5lZChTSVpFT0ZfUFRSRElGRl9UKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgICAgKFNJWkVPRl9QVFJESUZGX1QpCisjZWxpZiBkZWZpbmVkKF9fU0laRU9GX1BUUkRJRkZfVF9fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgICAgKF9fU0laRU9GX1BUUkRJRkZfVF9fKQorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgX19MWk9fTFNSKHgsYikgICAgKCgoeCkrMHVsKSA+PiAoYikpCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9TSE9SVCkKKyMgIGlmIChMWk9fQVJDSF9DUkFZX1BWUCkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDgKKyMgIGVsaWYgKFVTSFJUX01BWCA9PSBMWk9fMHhmZmZmTCkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDIKKyMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsNykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDEKKyMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsMTUpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1NIT1JUICAgICAgICAyCisjICBlbGlmIChfX0xaT19MU1IoVVNIUlRfTUFYLDMxKSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgNAorIyAgZWxpZiAoX19MWk9fTFNSKFVTSFJUX01BWCw2MykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0hPUlQgICAgICAgIDgKKyMgIGVsaWYgKF9fTFpPX0xTUihVU0hSVF9NQVgsMTI3KSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9TSE9SVCAgICAgICAgMTYKKyMgIGVsc2UKKyMgICAgZXJyb3IgIkxaT19TSVpFT0ZfU0hPUlQiCisjICBlbmRpZgorI2VuZGlmCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoTFpPX1NJWkVPRl9TSE9SVCA9PSBzaXplb2Yoc2hvcnQpKQorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfSU5UKQorIyAgaWYgKExaT19BUkNIX0NSQVlfUFZQKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9JTlQgICAgICAgICAgOAorIyAgZWxpZiAoVUlOVF9NQVggPT0gTFpPXzB4ZmZmZkwpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAyCisjICBlbGlmIChVSU5UX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICA0CisjICBlbGlmIChfX0xaT19MU1IoVUlOVF9NQVgsNykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDEKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxNSkgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDIKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwzMSkgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDQKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCw2MykgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfSU5UICAgICAgICAgIDgKKyMgIGVsaWYgKF9fTFpPX0xTUihVSU5UX01BWCwxMjcpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0lOVCAgICAgICAgICAxNgorIyAgZWxzZQorIyAgICBlcnJvciAiTFpPX1NJWkVPRl9JTlQiCisjICBlbmRpZgorI2VuZGlmCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoTFpPX1NJWkVPRl9JTlQgPT0gc2l6ZW9mKGludCkpCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HKQorIyAgaWYgKFVMT05HX01BWCA9PSBMWk9fMHhmZmZmZmZmZkwpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA0CisjICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDcpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAxCisjICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDE1KSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgMgorIyAgZWxpZiAoX19MWk9fTFNSKFVMT05HX01BWCwzMSkgPT0gMSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfTE9ORyAgICAgICAgIDQKKyMgIGVsaWYgKF9fTFpPX0xTUihVTE9OR19NQVgsMzkpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICA1CisjICBlbGlmIChfX0xaT19MU1IoVUxPTkdfTUFYLDYzKSA9PSAxKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HICAgICAgICAgOAorIyAgZWxpZiAoX19MWk9fTFNSKFVMT05HX01BWCwxMjcpID09IDEpCisjICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkcgICAgICAgICAxNgorIyAgZWxzZQorIyAgICBlcnJvciAiTFpPX1NJWkVPRl9MT05HIgorIyAgZW5kaWYKKyNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKExaT19TSVpFT0ZfTE9ORyA9PSBzaXplb2YobG9uZykpCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKKyNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQorIyAgaWYgZGVmaW5lZChfX0xPTkdfTUFYX18pICYmIGRlZmluZWQoX19MT05HX0xPTkdfTUFYX18pCisjICAgIGlmIChMWk9fQ0NfR05VQyA+PSAweDAzMDMwMHVsKQorIyAgICAgIGlmICgoX19MT05HX01BWF9fLTApID09IChfX0xPTkdfTE9OR19NQVhfXy0wKSkKKyMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIExaT19TSVpFT0ZfTE9ORworIyAgICAgIGVsaWYgKF9fTFpPX0xTUihfX0xPTkdfTE9OR19NQVhfXywzMCkgPT0gMSkKKyMgICAgICAgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDQKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9MT05HX0xPTkcpICYmICFkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQ2NCkKKyNpZiAoTFpPX1NJWkVPRl9MT05HID4gMCAmJiBMWk9fU0laRU9GX0xPTkcgPCA4KQorI2lmIChMWk9fQVJDSF9JMDg2ICYmIExaT19DQ19ETUMpCisjZWxpZiAoTFpPX0NDX0NJTExZKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKExaT19DQ19BUk1DQ19HTlVDIHx8IExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfTExWTSB8fCBMWk9fQ0NfUEFUSFNDQUxFKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjMyKSkgJiYgTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoTFpPX09TX1dJTjY0IHx8IGRlZmluZWQoX1dJTjY0KSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfRE1DKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfU1lNQU5URUNDICYmIChfX1NDX18gPj0gMHg3MDApKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDICYmIGRlZmluZWQoX19saW51eF9fKSkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX01XRVJLUyB8fCBMWk9fQ0NfUEVMTEVTQyB8fCBMWk9fQ0NfUEdJIHx8IExaT19DQ19TVU5QUk9DKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MpKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfX19JTlQ2NCAgICAgICAgOAorI2VsaWYgKChMWk9fT1NfV0lOMzIgfHwgZGVmaW5lZChfV0lOMzIpKSAmJiAoTFpPX0NDX01TQykpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNTIwKSkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX1dBVENPTUMgJiYgKF9fV0FUQ09NQ19fID49IDExMDApKSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX19fSU5UNjQgICAgICAgIDgKKyNlbGlmIChMWk9fQ0NfR0hTICYmIGRlZmluZWQoX19MTE9OR19CSVQpICYmICgoX19MTE9OR19CSVQtMCkgPT0gNjQpKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKExaT19DQ19XQVRDT01DICYmIGRlZmluZWQoX0lOVEVHUkFMX01BWF9CSVRTKSAmJiAoKF9JTlRFR1JBTF9NQVhfQklUUy0wKSA9PSA2NCkpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoTFpPX09TX09TNDAwIHx8IGRlZmluZWQoX19PUzQwMF9fKSkgJiYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKGRlZmluZWQoX192bXMpIHx8IGRlZmluZWQoX19WTVMpKSAmJiAoKF9fSU5JVElBTF9QT0lOVEVSX1NJWkUtMCkgPT0gNjQpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoTFpPX0NDX1NEQ0MpICYmIChMWk9fU0laRU9GX0lOVCA9PSAyKQorI2VsaWYgMSAmJiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgKExaT19DQ19HTlVDKQorIyAgaWYgKExaT19DQ19HTlVDIDwgMHgwMjA4MDB1bCkKKyMgICAgdW5kZWYgTFpPX1NJWkVPRl9MT05HX0xPTkcKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0NGR19OT19MT05HX0xPTkcpCisjICB1bmRlZiBMWk9fU0laRU9GX0xPTkdfTE9ORworI2VsaWYgZGVmaW5lZChfX05PX0xPTkdfTE9ORykKKyMgIHVuZGVmIExaT19TSVpFT0ZfTE9OR19MT05HCisjZWxpZiBkZWZpbmVkKF9OT19MT05HTE9ORykKKyMgIHVuZGVmIExaT19TSVpFT0ZfTE9OR19MT05HCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fV09SRFNJWkUpCisjaWYgKExaT19BUkNIX0FMUEhBKQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgOAorI2VsaWYgKExaT19BUkNIX0FNRDY0KQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgOAorI2VsaWYgKExaT19BUkNIX0FWUikKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDEKKyNlbGlmIChMWk9fQVJDSF9IODMwMCkKKyMgIGlmIGRlZmluZWQoX19OT1JNQUxfTU9ERV9fKQorIyAgICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgNAorIyAgZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykgfHwgZGVmaW5lZChfX0g4MzAwU1hfXykKKyMgICAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgIDQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgIDIKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfSTA4NikKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDIKKyNlbGlmIChMWk9fQVJDSF9JQTY0KQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgOAorI2VsaWYgKExaT19BUkNIX00xNkMpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICAyCisjZWxpZiAoTFpPX0FSQ0hfU1BVKQorIyAgZGVmaW5lIExaT19XT1JEU0laRSAgICAgICAgICAgICAgNAorI2VsaWYgKExaT19BUkNIX1o4MCkKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDEKKyNlbGlmIChMWk9fU0laRU9GX0xPTkcgPT0gOCkgJiYgKChkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fUjU5MDBfXykpIHx8IGRlZmluZWQoX19NSVBTX1BTWDJfXykpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICA4CisjZWxpZiAoTFpPX09TX09TNDAwIHx8IGRlZmluZWQoX19PUzQwMF9fKSkKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDgKKyNlbGlmIChkZWZpbmVkKF9fdm1zKSB8fCBkZWZpbmVkKF9fVk1TKSkgJiYgKF9fSU5JVElBTF9QT0lOVEVSX1NJWkUrMCA9PSA2NCkKKyMgIGRlZmluZSBMWk9fV09SRFNJWkUgICAgICAgICAgICAgIDgKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9WT0lEX1ApCisjaWYgZGVmaW5lZChfX0lMUDMyX18pIHx8IGRlZmluZWQoX19JTFAzMikgfHwgZGVmaW5lZChfSUxQMzIpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGludCkgID09IDQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGxvbmcpID09IDQpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICA0CisjZWxpZiBkZWZpbmVkKF9fSUxQNjRfXykgfHwgZGVmaW5lZChfX0lMUDY0KSB8fCBkZWZpbmVkKF9JTFA2NCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YoaW50KSAgPT0gOCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobG9uZykgPT0gOCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDgKKyNlbGlmIGRlZmluZWQoX19MTFA2NF9fKSB8fCBkZWZpbmVkKF9fTExQNjQpIHx8IGRlZmluZWQoX0xMUDY0KSB8fCBkZWZpbmVkKF9XSU42NCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobG9uZykgPT0gNCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDgKKyNlbGlmIGRlZmluZWQoX19MUDY0X18pIHx8IGRlZmluZWQoX19MUDY0KSB8fCBkZWZpbmVkKF9MUDY0KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsb25nKSA9PSA4KQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgOAorI2VsaWYgKExaT19BUkNIX0FWUikKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDIKKyNlbGlmIChMWk9fQVJDSF9DMTY2IHx8IExaT19BUkNIX01DUzUxIHx8IExaT19BUkNIX01DUzI1MSB8fCBMWk9fQVJDSF9NU1A0MzApCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICAyCisjZWxpZiAoTFpPX0FSQ0hfSDgzMDApCisjICBpZiBkZWZpbmVkKF9fTk9STUFMX01PREVfXykKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgIDIKKyMgIGVsaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pIHx8IGRlZmluZWQoX19IODMwMFNYX18pCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICA0CisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAyCisjICBlbmRpZgorIyAgaWYgKExaT19DQ19HTlVDICYmIChMWk9fQ0NfR05VQyA8IDB4MDQwMDAwdWwpKSAmJiAoTFpPX1NJWkVPRl9JTlQgPT0gNCkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgIExaT19TSVpFT0ZfSU5UCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgICBMWk9fU0laRU9GX0lOVAorIyAgZW5kaWYKKyNlbGlmIChMWk9fQVJDSF9JMDg2KQorIyAgaWYgKExaT19NTV9USU5ZIHx8IExaT19NTV9TTUFMTCB8fCBMWk9fTU1fTUVESVVNKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMgorIyAgZWxpZiAoTFpPX01NX0NPTVBBQ1QgfHwgTFpPX01NX0xBUkdFIHx8IExaT19NTV9IVUdFKQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgNAorIyAgZWxzZQorIyAgICBlcnJvciAiaW52YWxpZCBMWk9fQVJDSF9JMDg2IG1lbW9yeSBtb2RlbCIKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfTTE2QykKKyMgIGlmIGRlZmluZWQoX19tMzJjX2NwdV9fKSB8fCBkZWZpbmVkKF9fbTMyY21fY3B1X18pCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICA0CisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAyCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX1NQVSkKKyMgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICAgIDQKKyNlbGlmIChMWk9fQVJDSF9aODApCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICAyCisjZWxpZiAoTFpPX1NJWkVPRl9MT05HID09IDgpICYmICgoZGVmaW5lZChfX21pcHNfXykgJiYgZGVmaW5lZChfX1I1OTAwX18pKSB8fCBkZWZpbmVkKF9fTUlQU19QU1gyX18pKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgNAorI2VsaWYgKExaT19PU19PUzQwMCB8fCBkZWZpbmVkKF9fT1M0MDBfXykpCisjICBpZiBkZWZpbmVkKF9fTExQNjRfSUZDX18pCisjICAgIGRlZmluZSBMWk9fU0laRU9GX1ZPSURfUCAgICAgICA4CisjICAgIGRlZmluZSBMWk9fU0laRU9GX1NJWkVfVCAgICAgICBMWk9fU0laRU9GX0xPTkcKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgIExaT19TSVpFT0ZfTE9ORworIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgMTYKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgIExaT19TSVpFT0ZfTE9ORworIyAgICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgICAgTFpPX1NJWkVPRl9MT05HCisjICBlbmRpZgorI2VsaWYgKGRlZmluZWQoX192bXMpIHx8IGRlZmluZWQoX19WTVMpKSAmJiAoX19JTklUSUFMX1BPSU5URVJfU0laRSswID09IDY0KQorIyAgZGVmaW5lIExaT19TSVpFT0ZfVk9JRF9QICAgICAgICAgOAorIyAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgICAgTFpPX1NJWkVPRl9MT05HCisjICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgICAgICBMWk9fU0laRU9GX0xPTkcKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1NJWkVPRl9WT0lEX1ApCisjICBkZWZpbmUgTFpPX1NJWkVPRl9WT0lEX1AgICAgICAgICBMWk9fU0laRU9GX0xPTkcKKyNlbmRpZgorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKExaT19TSVpFT0ZfVk9JRF9QID09IHNpemVvZih2b2lkICopKQorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfU0laRV9UKQorI2lmIChMWk9fQVJDSF9JMDg2IHx8IExaT19BUkNIX00xNkMpCisjICBkZWZpbmUgTFpPX1NJWkVPRl9TSVpFX1QgICAgICAgICAyCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfU0laRV9UKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfU0laRV9UICAgICAgICAgTFpPX1NJWkVPRl9WT0lEX1AKKyNlbmRpZgorI2lmIGRlZmluZWQob2Zmc2V0b2YpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoTFpPX1NJWkVPRl9TSVpFX1QgPT0gc2l6ZW9mKHNpemVfdCkpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fU0laRU9GX1BUUkRJRkZfVCkKKyNpZiAoTFpPX0FSQ0hfSTA4NikKKyMgIGlmIChMWk9fTU1fVElOWSB8fCBMWk9fTU1fU01BTEwgfHwgTFpPX01NX01FRElVTSB8fCBMWk9fTU1fSFVHRSkKKyMgICAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgIExaT19TSVpFT0ZfVk9JRF9QCisjICBlbGlmIChMWk9fTU1fQ09NUEFDVCB8fCBMWk9fTU1fTEFSR0UpCisjICAgIGlmIChMWk9fQ0NfQk9STEFOREMgfHwgTFpPX0NDX1RVUkJPQykKKyMgICAgICBkZWZpbmUgTFpPX1NJWkVPRl9QVFJESUZGX1QgIDQKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBMWk9fU0laRU9GX1BUUkRJRkZfVCAgMgorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBlcnJvciAiaW52YWxpZCBMWk9fQVJDSF9JMDg2IG1lbW9yeSBtb2RlbCIKKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT19TSVpFT0ZfUFRSRElGRl9UKQorIyAgZGVmaW5lIExaT19TSVpFT0ZfUFRSRElGRl9UICAgICAgTFpPX1NJWkVPRl9TSVpFX1QKKyNlbmRpZgorI2lmIGRlZmluZWQob2Zmc2V0b2YpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoTFpPX1NJWkVPRl9QVFJESUZGX1QgPT0gc2l6ZW9mKHB0cmRpZmZfdCkpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fV09SRFNJWkUpCisjICBkZWZpbmUgTFpPX1dPUkRTSVpFICAgICAgICAgICAgICBMWk9fU0laRU9GX1ZPSURfUAorI2VuZGlmCisjaWYgKExaT19BQklfTkVVVFJBTF9FTkRJQU4pCisjICB1bmRlZiBMWk9fQUJJX0JJR19FTkRJQU4KKyMgIHVuZGVmIExaT19BQklfTElUVExFX0VORElBTgorI2VsaWYgIShMWk9fQUJJX0JJR19FTkRJQU4pICYmICEoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorI2lmIChMWk9fQVJDSF9BTFBIQSkgJiYgKExaT19BUkNIX0NSQVlfTVBQKQorIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQorI2VsaWYgKExaT19BUkNIX0lBNjQpICYmIChMWk9fT1NfUE9TSVhfTElOVVggfHwgTFpPX09TX1dJTjY0KQorIyAgZGVmaW5lIExaT19BQklfTElUVExFX0VORElBTiAgICAgMQorI2VsaWYgKExaT19BUkNIX0FMUEhBIHx8IExaT19BUkNIX0FNRDY0IHx8IExaT19BUkNIX0JMQUNLRklOIHx8IExaT19BUkNIX0NSSVMgfHwgTFpPX0FSQ0hfSTA4NiB8fCBMWk9fQVJDSF9JMzg2IHx8IExaT19BUkNIX01TUDQzMCkKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIChMWk9fQVJDSF9BVlIzMiB8fCBMWk9fQVJDSF9NNjhLIHx8IExaT19BUkNIX1MzOTAgfHwgTFpPX0FSQ0hfU1BVKQorIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQorI2VsaWYgMSAmJiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pCisjICBpZiAoX19MSVRUTEVfRU5ESUFOX18gPT0gMSkKKyMgICAgZGVmaW5lIExaT19BQklfTElUVExFX0VORElBTiAgIDEKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAxICYmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pICYmICFkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQorIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQorI2VsaWYgMSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKSAmJiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIDEgJiYgKExaT19BUkNIX0FSTSkgJiYgZGVmaW5lZChfX0FSTUVCX18pICYmICFkZWZpbmVkKF9fQVJNRUxfXykKKyMgIGRlZmluZSBMWk9fQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIDEgJiYgKExaT19BUkNIX0FSTSkgJiYgZGVmaW5lZChfX0FSTUVMX18pICYmICFkZWZpbmVkKF9fQVJNRUJfXykKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIDEgJiYgKExaT19BUkNIX0FSTSAmJiBMWk9fQ0NfQVJNQ0NfQVJNQ0MpCisjICBpZiBkZWZpbmVkKF9fQklHX0VORElBTikgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjICAgIGVycm9yICJ1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gLSBjaGVjayB5b3VyIGNvbXBpbGVyIGRlZmluZXMiCisjICBlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorIyAgICBkZWZpbmUgTFpPX0FCSV9CSUdfRU5ESUFOICAgICAgMQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0FCSV9MSVRUTEVfRU5ESUFOICAgMQorIyAgZW5kaWYKKyMgIGRlZmluZSBMWk9fQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIDEgJiYgKExaT19BUkNIX0FSTTY0KSAmJiBkZWZpbmVkKF9fQUFSQ0g2NEVCX18pICYmICFkZWZpbmVkKF9fQUFSQ0g2NEVMX18pCisjICBkZWZpbmUgTFpPX0FCSV9CSUdfRU5ESUFOICAgICAgICAxCisjZWxpZiAxICYmIChMWk9fQVJDSF9BUk02NCkgJiYgZGVmaW5lZChfX0FBUkNINjRFTF9fKSAmJiAhZGVmaW5lZChfX0FBUkNINjRFQl9fKQorIyAgZGVmaW5lIExaT19BQklfTElUVExFX0VORElBTiAgICAgMQorI2VsaWYgMSAmJiAoTFpPX0FSQ0hfTUlQUykgJiYgZGVmaW5lZChfX01JUFNFQl9fKSAmJiAhZGVmaW5lZChfX01JUFNFTF9fKQorIyAgZGVmaW5lIExaT19BQklfQklHX0VORElBTiAgICAgICAgMQorI2VsaWYgMSAmJiAoTFpPX0FSQ0hfTUlQUykgJiYgZGVmaW5lZChfX01JUFNFTF9fKSAmJiAhZGVmaW5lZChfX01JUFNFQl9fKQorIyAgZGVmaW5lIExaT19BQklfTElUVExFX0VORElBTiAgICAgMQorI2VuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0FCSV9CSUdfRU5ESUFOKSAmJiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorIyAgZXJyb3IgInVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiAtIGNoZWNrIHlvdXIgY29tcGlsZXIgZGVmaW5lcyIKKyNlbmRpZgorI2lmIChMWk9fQUJJX0JJR19FTkRJQU4pCisjICBkZWZpbmUgTFpPX0lORk9fQUJJX0VORElBTiAgICAgICAiYmUiCisjZWxpZiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9FTkRJQU4gICAgICAgImxlIgorI2VsaWYgKExaT19BQklfTkVVVFJBTF9FTkRJQU4pCisjICBkZWZpbmUgTFpPX0lORk9fQUJJX0VORElBTiAgICAgICAibmV1dHJhbCIKKyNlbmRpZgorI2lmIChMWk9fU0laRU9GX0lOVCA9PSAxICYmIExaT19TSVpFT0ZfTE9ORyA9PSAyICYmIExaT19TSVpFT0ZfVk9JRF9QID09IDIpCisjICBkZWZpbmUgTFpPX0FCSV9JOExQMTYgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQUJJX1BNICAgICAgICJpOGxwMTYiCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gMiAmJiBMWk9fU0laRU9GX0xPTkcgPT0gMiAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSAyKQorIyAgZGVmaW5lIExaT19BQklfSUxQMTYgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQUJJX1BNICAgICAgICJpbHAxNiIKKyNlbGlmIChMWk9fU0laRU9GX0lOVCA9PSAyICYmIExaT19TSVpFT0ZfTE9ORyA9PSA0ICYmIExaT19TSVpFT0ZfVk9JRF9QID09IDQpCisjICBkZWZpbmUgTFpPX0FCSV9MUDMyICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19BQklfUE0gICAgICAgImxwMzIiCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gNCAmJiBMWk9fU0laRU9GX0xPTkcgPT0gNCAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSA0KQorIyAgZGVmaW5lIExaT19BQklfSUxQMzIgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQUJJX1BNICAgICAgICJpbHAzMiIKKyNlbGlmIChMWk9fU0laRU9GX0lOVCA9PSA0ICYmIExaT19TSVpFT0ZfTE9ORyA9PSA0ICYmIExaT19TSVpFT0ZfVk9JRF9QID09IDggJiYgTFpPX1NJWkVPRl9TSVpFX1QgPT0gOCkKKyMgIGRlZmluZSBMWk9fQUJJX0xMUDY0ICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAibGxwNjQiCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gNCAmJiBMWk9fU0laRU9GX0xPTkcgPT0gOCAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSA4KQorIyAgZGVmaW5lIExaT19BQklfTFA2NCAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQUJJX1BNICAgICAgICJscDY0IgorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDggJiYgTFpPX1NJWkVPRl9MT05HID09IDggJiYgTFpPX1NJWkVPRl9WT0lEX1AgPT0gOCkKKyMgIGRlZmluZSBMWk9fQUJJX0lMUDY0ICAgICAgICAgMQorIyAgZGVmaW5lIExaT19JTkZPX0FCSV9QTSAgICAgICAiaWxwNjQiCisjZWxpZiAoTFpPX1NJWkVPRl9JTlQgPT0gNCAmJiBMWk9fU0laRU9GX0xPTkcgPT0gOCAmJiBMWk9fU0laRU9GX1ZPSURfUCA9PSA0KQorIyAgZGVmaW5lIExaT19BQklfSVAzMkw2NCAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fQUJJX1BNICAgICAgICJpcDMybDY0IgorI2VuZGlmCisjaWYgMAorI2VsaWYgIWRlZmluZWQoX19MWk9fTElCQ19PVkVSUklERSkKKyNpZiAoTFpPX0xJQkNfTkFLRUQpCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJuYWtlZCIKKyNlbGlmIChMWk9fTElCQ19GUkVFU1RBTkRJTkcpCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJmcmVlc3RhbmRpbmciCisjZWxpZiAoTFpPX0xJQkNfTU9TVExZX0ZSRUVTVEFORElORykKKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgIm1mcmVlc3RhbmRpbmciCisjZWxpZiAoTFpPX0xJQkNfSVNPQzkwKQorIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAiaXNvYzkwIgorI2VsaWYgKExaT19MSUJDX0lTT0M5OSkKKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgImlzb2M5OSIKKyNlbGlmIChMWk9fQ0NfQVJNQ0NfQVJNQ0MpICYmIGRlZmluZWQoX19BUk1DTElCX1ZFUlNJT04pCisjICBkZWZpbmUgTFpPX0xJQkNfSVNPQzkwICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgImlzb2M5MCIKKyNlbGlmIGRlZmluZWQoX19kaWV0bGliY19fKQorIyAgZGVmaW5lIExaT19MSUJDX0RJRVRMSUJDICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJkaWV0bGliYyIKKyNlbGlmIGRlZmluZWQoX05FV0xJQl9WRVJTSU9OKQorIyAgZGVmaW5lIExaT19MSUJDX05FV0xJQiAgICAgICAxCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJuZXdsaWIiCisjZWxpZiBkZWZpbmVkKF9fVUNMSUJDX18pICYmIGRlZmluZWQoX19VQ0xJQkNfTUFKT1JfXykgJiYgZGVmaW5lZChfX1VDTElCQ19NSU5PUl9fKQorIyAgaWYgZGVmaW5lZChfX1VDTElCQ19TVUJMRVZFTF9fKQorIyAgICBkZWZpbmUgTFpPX0xJQkNfVUNMSUJDICAgICAoX19VQ0xJQkNfTUFKT1JfXyAqIDB4MTAwMDBMICsgKF9fVUNMSUJDX01JTk9SX18tMCkgKiAweDEwMCArIChfX1VDTElCQ19TVUJMRVZFTF9fLTApKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0xJQkNfVUNMSUJDICAgICAweDAwMDkwYkwKKyMgIGVuZGlmCisjICBkZWZpbmUgTFpPX0lORk9fTElCQyAgICAgICAgICJ1YyIgImxpYmMiCisjZWxpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgZGVmaW5lZChfX0dMSUJDX01JTk9SX18pCisjICBkZWZpbmUgTFpPX0xJQkNfR0xJQkMgICAgICAgIChfX0dMSUJDX18gKiAweDEwMDAwTCArIChfX0dMSUJDX01JTk9SX18tMCkgKiAweDEwMCkKKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgImdsaWJjIgorI2VsaWYgKExaT19DQ19NV0VSS1MpICYmIGRlZmluZWQoX19NU0xfXykKKyMgIGRlZmluZSBMWk9fTElCQ19NU0wgICAgICAgICAgX19NU0xfXworIyAgZGVmaW5lIExaT19JTkZPX0xJQkMgICAgICAgICAibXNsIgorI2VsaWYgMSAmJiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pCisjICBkZWZpbmUgTFpPX0xJQkNfSVNPQzkwICAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgImlzb2M5MCIKKyNlbHNlCisjICBkZWZpbmUgTFpPX0xJQkNfREVGQVVMVCAgICAgIDEKKyMgIGRlZmluZSBMWk9fSU5GT19MSUJDICAgICAgICAgImRlZmF1bHQiCisjZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9JMzg2ICYmIChMWk9fT1NfRE9TMzIgfHwgTFpPX09TX1dJTjMyKSAmJiAoTFpPX0NDX0RNQyB8fCBMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MgfHwgTFpPX0NDX1BFTExFU0MpKQorIyAgZGVmaW5lIExaT19BU01fU1lOVEFYX01TQyAxCisjZWxpZiAoTFpPX09TX1dJTjY0ICYmIChMWk9fQ0NfRE1DIHx8IExaT19DQ19JTlRFTEMgfHwgTFpPX0NDX01TQyB8fCBMWk9fQ0NfUEVMTEVTQykpCisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiBMWk9fQ0NfR05VQyAmJiAoTFpPX0NDX0dOVUMgPT0gMHgwMTFmMDB1bCkpCisjZWxpZiAoTFpPX0FSQ0hfSTM4NiAmJiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19HTlVDIHx8IExaT19DQ19JTlRFTEMgfHwgTFpPX0NDX1BBVEhTQ0FMRSkpCisjICBkZWZpbmUgTFpPX0FTTV9TWU5UQVhfR05VQyAxCisjZWxpZiAoTFpPX0FSQ0hfQU1ENjQgJiYgKExaT19DQ19DTEFORyB8fCBMWk9fQ0NfR05VQyB8fCBMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19QQVRIU0NBTEUpKQorIyAgZGVmaW5lIExaT19BU01fU1lOVEFYX0dOVUMgMQorI2VsaWYgKExaT19DQ19HTlVDKQorIyAgZGVmaW5lIExaT19BU01fU1lOVEFYX0dOVUMgMQorI2VuZGlmCisjaWYgKExaT19BU01fU1lOVEFYX0dOVUMpCisjaWYgKExaT19BUkNIX0kzODYgJiYgTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjAwMDB1bCkpCisjICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVIgICAgICAgICAgICAgICAgICAgICAiYXgiCisjICBkZWZpbmUgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQyAgICAgICAgICAgICAvKmVtcHR5Ki8KKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDX01FTU9SWSAgICAgIC8qZW1wdHkqLworIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfRU1QVFkgICAgICAgICAgLyplbXB0eSovCisjZWxpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA8IDEwMDApKQorIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSIKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDICAgICAgICAgICAgIC8qZW1wdHkqLworIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0NfTUVNT1JZICAgICAgOiAibWVtb3J5IgorIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfRU1QVFkgICAgICAgICAgLyplbXB0eSovCisjZWxzZQorIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSICAgICAgICAgICAgICAgICAgICAgImNjIiwgIm1lbW9yeSIKKyMgIGRlZmluZSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDICAgICAgICAgICAgIDogImNjIgorIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0NfTUVNT1JZICAgICAgOiAiY2MiLCAibWVtb3J5IgorIyAgZGVmaW5lIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfRU1QVFkgICAgICAgICAgLyplbXB0eSovCisjZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9BTFBIQSkKKyMgIGRlZmluZSBMWk9fT1BUX0FWT0lEX1VJTlRfSU5ERVggICAgICAgICAgMQorI2VsaWYgKExaT19BUkNIX0FNRDY0KQorIyAgZGVmaW5lIExaT19PUFRfQVZPSURfSU5UX0lOREVYICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9BVk9JRF9VSU5UX0lOREVYICAgICAgICAgIDEKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVENjQKKyMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDY0ICAgICAgICAgICAgICAgMQorIyAgZW5kaWYKKyNlbGlmIChMWk9fQVJDSF9BUk0pCisjICBpZiBkZWZpbmVkKF9fQVJNX0ZFQVRVUkVfVU5BTElHTkVEKQorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDMyCisjICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZChfX1RBUkdFVF9BUkNIX0FSTSkgJiYgKChfX1RBUkdFVF9BUkNIX0FSTSswKSA+PSA3KQorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDMyCisjICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZChfX1RBUkdFVF9BUkNIX0FSTSkgJiYgKChfX1RBUkdFVF9BUkNIX0FSTSswKSA+PSA2KSAmJiAhZGVmaW5lZChfX1RBUkdFVF9QUk9GSUxFX00pCisjICAgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDE2ICAgICAgICAgICAgIDEKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbGlmIChMWk9fQVJDSF9BUk02NCkKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVENjQKKyMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDY0ICAgICAgICAgICAgICAgMQorIyAgZW5kaWYKKyNlbGlmIChMWk9fQVJDSF9DUklTKQorIyAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMTYKKyMgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDE2ICAgICAgICAgICAgICAgMQorIyAgZW5kaWYKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDMyCisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfSTM4NikKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgICAxCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX0lBNjQpCisjICBkZWZpbmUgTFpPX09QVF9BVk9JRF9JTlRfSU5ERVggICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fT1BUX0FWT0lEX1VJTlRfSU5ERVggICAgICAgICAgMQorIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BPU1RJTkMgICAgICAgICAgICAxCisjZWxpZiAoTFpPX0FSQ0hfTTY4SykKKyMgIGRlZmluZSBMWk9fT1BUX1BSRUZFUl9QT1NUSU5DICAgICAgICAgICAgMQorIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BSRURFQyAgICAgICAgICAgICAxCisjICBpZiBkZWZpbmVkKF9fbWM2ODAyMF9fKSAmJiAhZGVmaW5lZChfX21jb2xkZmlyZV9fKQorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQxNgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDMyCisjICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDMyICAgICAgICAgICAgIDEKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfTUlQUykKKyMgIGRlZmluZSBMWk9fT1BUX0FWT0lEX1VJTlRfSU5ERVggICAgICAgICAgMQorI2VsaWYgKExaT19BUkNIX1BPV0VSUEMpCisjICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUFJFSU5DICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBMWk9fT1BUX1BSRUZFUl9QUkVERUMgICAgICAgICAgICAgMQorIyAgaWYgKExaT19BQklfQklHX0VORElBTikKKyMgICAgaWZuZGVmIExaT19PUFRfVU5BTElHTkVEMTYKKyMgICAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMTYgICAgICAgICAgICAgMQorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQzMiAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICAgIGlmIChMWk9fV09SRFNJWkUgPT0gOCkKKyMgICAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQ2NAorIyAgICAgIGRlZmluZSBMWk9fT1BUX1VOQUxJR05FRDY0ICAgICAgICAgICAxCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfUzM5MCkKKyMgIGlmbmRlZiBMWk9fT1BUX1VOQUxJR05FRDE2CisjICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQxNiAgICAgICAgICAgICAgIDEKKyMgIGVuZGlmCisjICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQzMgorIyAgZGVmaW5lIExaT19PUFRfVU5BTElHTkVEMzIgICAgICAgICAgICAgICAxCisjICBlbmRpZgorIyAgaWYgKExaT19XT1JEU0laRSA9PSA4KQorIyAgICBpZm5kZWYgTFpPX09QVF9VTkFMSUdORUQ2NAorIyAgICBkZWZpbmUgTFpPX09QVF9VTkFMSUdORUQ2NCAgICAgICAgICAgICAxCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VsaWYgKExaT19BUkNIX1NIKQorIyAgZGVmaW5lIExaT19PUFRfUFJFRkVSX1BPU1RJTkMgICAgICAgICAgICAxCisjICBkZWZpbmUgTFpPX09QVF9QUkVGRVJfUFJFREVDICAgICAgICAgICAgIDEKKyNlbmRpZgorI2lmbmRlZiBMWk9fQ0ZHX05PX0lOTElORV9BU00KKyNpZiAoTFpPX0FCSV9ORVVUUkFMX0VORElBTikgfHwgKExaT19BUkNIX0dFTkVSSUMpCisjICBkZWZpbmUgTFpPX0NGR19OT19JTkxJTkVfQVNNIDEKKyNlbGlmIChMWk9fQ0NfTExWTSkKKyMgIGRlZmluZSBMWk9fQ0ZHX05PX0lOTElORV9BU00gMQorI2VuZGlmCisjZW5kaWYKKyNpZiAoTFpPX0NGR19OT19JTkxJTkVfQVNNKQorIyAgdW5kZWYgTFpPX0FTTV9TWU5UQVhfTVNDCisjICB1bmRlZiBMWk9fQVNNX1NZTlRBWF9HTlVDCisjICB1bmRlZiBfX0xaT19BU01fQ0xPQkJFUgorIyAgdW5kZWYgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQworIyAgdW5kZWYgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQ19NRU1PUlkKKyMgIHVuZGVmIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfRU1QVFkKKyNlbmRpZgorI2lmbmRlZiBMWk9fQ0ZHX05PX1VOQUxJR05FRAorI2lmIChMWk9fQUJJX05FVVRSQUxfRU5ESUFOKSB8fCAoTFpPX0FSQ0hfR0VORVJJQykKKyMgIGRlZmluZSBMWk9fQ0ZHX05PX1VOQUxJR05FRCAxCisjZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fQ0ZHX05PX1VOQUxJR05FRCkKKyMgIHVuZGVmIExaT19PUFRfVU5BTElHTkVEMTYKKyMgIHVuZGVmIExaT19PUFRfVU5BTElHTkVEMzIKKyMgIHVuZGVmIExaT19PUFRfVU5BTElHTkVENjQKKyNlbmRpZgorI2lmIGRlZmluZWQoX19MWk9fSU5GT1NUUl9NTSkKKyNlbGlmIChMWk9fTU1fRkxBVCkgJiYgKGRlZmluZWQoX19MWk9fSU5GT1NUUl9QTSkgfHwgZGVmaW5lZChMWk9fSU5GT19BQklfUE0pKQorIyAgZGVmaW5lIF9fTFpPX0lORk9TVFJfTU0gICAgICAgICAgIiIKKyNlbGlmIGRlZmluZWQoTFpPX0lORk9fTU0pCisjICBkZWZpbmUgX19MWk9fSU5GT1NUUl9NTSAgICAgICAgICAiLiIgTFpPX0lORk9fTU0KKyNlbHNlCisjICBkZWZpbmUgX19MWk9fSU5GT1NUUl9NTSAgICAgICAgICAiIgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0xaT19JTkZPU1RSX1BNKQorI2VsaWYgZGVmaW5lZChMWk9fSU5GT19BQklfUE0pCisjICBkZWZpbmUgX19MWk9fSU5GT1NUUl9QTSAgICAgICAgICAiLiIgTFpPX0lORk9fQUJJX1BNCisjZWxzZQorIyAgZGVmaW5lIF9fTFpPX0lORk9TVFJfUE0gICAgICAgICAgIiIKKyNlbmRpZgorI2lmIGRlZmluZWQoX19MWk9fSU5GT1NUUl9FTkRJQU4pCisjZWxpZiBkZWZpbmVkKExaT19JTkZPX0FCSV9FTkRJQU4pCisjICBkZWZpbmUgX19MWk9fSU5GT1NUUl9FTkRJQU4gICAgICAiLiIgTFpPX0lORk9fQUJJX0VORElBTgorI2Vsc2UKKyMgIGRlZmluZSBfX0xaT19JTkZPU1RSX0VORElBTiAgICAgICIiCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTFpPX0lORk9TVFJfT1NOQU1FKQorI2VsaWYgZGVmaW5lZChMWk9fSU5GT19PU19DT05TT0xFKQorIyAgZGVmaW5lIF9fTFpPX0lORk9TVFJfT1NOQU1FICAgICAgTFpPX0lORk9fT1MgIi4iIExaT19JTkZPX09TX0NPTlNPTEUKKyNlbGlmIGRlZmluZWQoTFpPX0lORk9fT1NfUE9TSVgpCisjICBkZWZpbmUgX19MWk9fSU5GT1NUUl9PU05BTUUgICAgICBMWk9fSU5GT19PUyAiLiIgTFpPX0lORk9fT1NfUE9TSVgKKyNlbHNlCisjICBkZWZpbmUgX19MWk9fSU5GT1NUUl9PU05BTUUgICAgICBMWk9fSU5GT19PUworI2VuZGlmCisjaWYgZGVmaW5lZChfX0xaT19JTkZPU1RSX0xJQkMpCisjZWxpZiBkZWZpbmVkKExaT19JTkZPX0xJQkMpCisjICBkZWZpbmUgX19MWk9fSU5GT1NUUl9MSUJDICAgICAgICAiLiIgTFpPX0lORk9fTElCQworI2Vsc2UKKyMgIGRlZmluZSBfX0xaT19JTkZPU1RSX0xJQkMgICAgICAgICIiCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTFpPX0lORk9TVFJfQ0NWRVIpCisjZWxpZiBkZWZpbmVkKExaT19JTkZPX0NDVkVSKQorIyAgZGVmaW5lIF9fTFpPX0lORk9TVFJfQ0NWRVIgICAgICAgIiAiIExaT19JTkZPX0NDVkVSCisjZWxzZQorIyAgZGVmaW5lIF9fTFpPX0lORk9TVFJfQ0NWRVIgICAgICAgIiIKKyNlbmRpZgorI2RlZmluZSBMWk9fSU5GT19TVFJJTkcgXAorICAgIExaT19JTkZPX0FSQ0ggX19MWk9fSU5GT1NUUl9NTSBfX0xaT19JTkZPU1RSX1BNIF9fTFpPX0lORk9TVFJfRU5ESUFOIFwKKyAgICAiICIgX19MWk9fSU5GT1NUUl9PU05BTUUgX19MWk9fSU5GT1NUUl9MSUJDICIgIiBMWk9fSU5GT19DQyBfX0xaT19JTkZPU1RSX0NDVkVSCisjaWYgIShMWk9fQ0ZHX1NLSVBfTFpPX1RZUEVTKQorI2lmICghKExaT19TSVpFT0ZfU0hPUlQrMCA+IDAgJiYgTFpPX1NJWkVPRl9JTlQrMCA+IDAgJiYgTFpPX1NJWkVPRl9MT05HKzAgPiAwKSkKKyMgIGVycm9yICJtaXNzaW5nIGRlZmluZXMgZm9yIHNpemVzIgorI2VuZGlmCisjaWYgKCEoTFpPX1NJWkVPRl9QVFJESUZGX1QrMCA+IDAgJiYgTFpPX1NJWkVPRl9TSVpFX1QrMCA+IDAgJiYgTFpPX1NJWkVPRl9WT0lEX1ArMCA+IDApKQorIyAgZXJyb3IgIm1pc3NpbmcgZGVmaW5lcyBmb3Igc2l6ZXMiCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9fbGxvbmdfdCkKKyNpZiAoTFpPX1NJWkVPRl9MT05HX0xPTkcrMCA+IDApCitfX2x6b19nbnVjX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBsb25nIGx6b19sbG9uZ190X187CitfX2x6b19nbnVjX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGx6b191bGxvbmdfdF9fOworIyAgZGVmaW5lIGx6b19sbG9uZ190ICAgICAgICAgICAgICAgbHpvX2xsb25nX3RfXworIyAgZGVmaW5lIGx6b191bGxvbmdfdCAgICAgICAgICAgICAgbHpvX3VsbG9uZ190X18KKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQobHpvX2ludDE2ZV90KQorI2lmIChMWk9fU0laRU9GX0xPTkcgPT0gMikKKyMgIGRlZmluZSBsem9faW50MTZlX3QgICAgICAgICAgICAgIGxvbmcKKyMgIGRlZmluZSBsem9fdWludDE2ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcKKyNlbGlmIChMWk9fU0laRU9GX0lOVCA9PSAyKQorIyAgZGVmaW5lIGx6b19pbnQxNmVfdCAgICAgICAgICAgICAgaW50CisjICBkZWZpbmUgbHpvX3VpbnQxNmVfdCAgICAgICAgICAgICB1bnNpZ25lZCBpbnQKKyNlbGlmIChMWk9fU0laRU9GX1NIT1JUID09IDIpCisjICBkZWZpbmUgbHpvX2ludDE2ZV90ICAgICAgICAgICAgICBzaG9ydCBpbnQKKyMgIGRlZmluZSBsem9fdWludDE2ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGludAorI2VsaWYgMSAmJiAhKExaT19DRkdfVFlQRV9OT19NT0RFX0hJKSAmJiAoTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAyNWYwMHVsKSB8fCBMWk9fQ0NfTExWTSkKKyAgIHR5cGVkZWYgaW50IGx6b19pbnQxNmVfaGlfdF9fIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fSElfXykpKTsKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IGx6b191aW50MTZlX2hpX3RfXyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0hJX18pKSk7CisjICBkZWZpbmUgbHpvX2ludDE2ZV90ICAgICAgICAgICAgICBsem9faW50MTZlX2hpX3RfXworIyAgZGVmaW5lIGx6b191aW50MTZlX3QgICAgICAgICAgICAgbHpvX3VpbnQxNmVfaGlfdF9fCisjZWxpZiAoTFpPX1NJWkVPRl9fX0lOVDE2ID09IDIpCisjICBkZWZpbmUgbHpvX2ludDE2ZV90ICAgICAgICAgICAgICBfX2ludDE2CisjICBkZWZpbmUgbHpvX3VpbnQxNmVfdCAgICAgICAgICAgICB1bnNpZ25lZCBfX2ludDE2CisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQxNmVfdCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQxNkVfVCAgIDIKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDE2ZV90KSA9PSAyKQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MTZlX3QpID09IExaT19TSVpFT0ZfTFpPX0lOVDE2RV9UKQorI2VuZGlmCisjaWYgIWRlZmluZWQobHpvX2ludDMyZV90KQorI2lmIChMWk9fU0laRU9GX0xPTkcgPT0gNCkKKyMgIGRlZmluZSBsem9faW50MzJlX3QgICAgICAgICAgICAgIGxvbmcgaW50CisjICBkZWZpbmUgbHpvX3VpbnQzMmVfdCAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGludAorI2VsaWYgKExaT19TSVpFT0ZfSU5UID09IDQpCisjICBkZWZpbmUgbHpvX2ludDMyZV90ICAgICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIHVuc2lnbmVkIGludAorI2VsaWYgKExaT19TSVpFT0ZfU0hPUlQgPT0gNCkKKyMgIGRlZmluZSBsem9faW50MzJlX3QgICAgICAgICAgICAgIHNob3J0IGludAorIyAgZGVmaW5lIGx6b191aW50MzJlX3QgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CisjZWxpZiAoTFpPX1NJWkVPRl9MT05HX0xPTkcgPT0gNCkKKyMgIGRlZmluZSBsem9faW50MzJlX3QgICAgICAgICAgICAgIGx6b19sbG9uZ190CisjICBkZWZpbmUgbHpvX3VpbnQzMmVfdCAgICAgICAgICAgICBsem9fdWxsb25nX3QKKyNlbGlmIDEgJiYgIShMWk9fQ0ZHX1RZUEVfTk9fTU9ERV9TSSkgJiYgKExaT19DQ19DTEFORyB8fCAoTFpPX0NDX0dOVUMgPj0gMHgwMjVmMDB1bCkgfHwgTFpPX0NDX0xMVk0pICYmIChfX0lOVF9NQVhfXyswID4gMjE0NzQ4MzY0N0wpCisgICB0eXBlZGVmIGludCBsem9faW50MzJlX3NpX3RfXyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCBsem9fdWludDMyZV9zaV90X18gX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOworIyAgZGVmaW5lIGx6b19pbnQzMmVfdCAgICAgICAgICAgICAgbHpvX2ludDMyZV9zaV90X18KKyMgIGRlZmluZSBsem9fdWludDMyZV90ICAgICAgICAgICAgIGx6b191aW50MzJlX3NpX3RfXworI2VsaWYgMSAmJiAhKExaT19DRkdfVFlQRV9OT19NT0RFX1NJKSAmJiAoTFpPX0NDX0dOVUMgPj0gMHgwMjVmMDB1bCkgJiYgZGVmaW5lZChfX0FWUl9fKSAmJiAoX19MT05HX01BWF9fKzAgPT0gMzI3NjdMKQorICAgdHlwZWRlZiBpbnQgbHpvX2ludDMyZV9zaV90X18gX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOworICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgbHpvX3VpbnQzMmVfc2lfdF9fIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsKKyMgIGRlZmluZSBsem9faW50MzJlX3QgICAgICAgICAgICAgIGx6b19pbnQzMmVfc2lfdF9fCisjICBkZWZpbmUgbHpvX3VpbnQzMmVfdCAgICAgICAgICAgICBsem9fdWludDMyZV9zaV90X18KKyMgIGRlZmluZSBMWk9fSU5UMzJfQyhjKSAgICAgICAgICAgIChjIyNMTCkKKyMgIGRlZmluZSBMWk9fVUlOVDMyX0MoYykgICAgICAgICAgIChjIyNVTEwpCisjZWxpZiAoTFpPX1NJWkVPRl9fX0lOVDMyID09IDQpCisjICBkZWZpbmUgbHpvX2ludDMyZV90ICAgICAgICAgICAgICBfX2ludDMyCisjICBkZWZpbmUgbHpvX3VpbnQzMmVfdCAgICAgICAgICAgICB1bnNpZ25lZCBfX2ludDMyCisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQzMmVfdCkKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQzMkVfVCAgIDQKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMyZV90KSA9PSA0KQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MzJlX3QpID09IExaT19TSVpFT0ZfTFpPX0lOVDMyRV9UKQorI2VuZGlmCisjaWYgIWRlZmluZWQobHpvX2ludDY0ZV90KQorI2lmIChMWk9fU0laRU9GX19fSU5UNjQgPT0gOCkKKyMgIGlmIChMWk9fQ0NfQk9STEFOREMpICYmICEoTFpPX0NGR19UWVBFX1BSRUZFUl9fX0lOVDY0KQorIyAgICBkZWZpbmUgTFpPX0NGR19UWVBFX1BSRUZFUl9fX0lOVDY0IDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoTFpPX1NJWkVPRl9JTlQgPT0gOCkgJiYgKExaT19TSVpFT0ZfSU5UIDwgTFpPX1NJWkVPRl9MT05HKQorIyAgZGVmaW5lIGx6b19pbnQ2NGVfdCAgICAgICAgICAgICAgaW50CisjICBkZWZpbmUgbHpvX3VpbnQ2NGVfdCAgICAgICAgICAgICB1bnNpZ25lZCBpbnQKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQ2NEVfVCAgIExaT19TSVpFT0ZfSU5UCisjZWxpZiAoTFpPX1NJWkVPRl9MT05HID09IDgpCisjICBkZWZpbmUgbHpvX2ludDY0ZV90ICAgICAgICAgICAgICBsb25nIGludAorIyAgZGVmaW5lIGx6b191aW50NjRlX3QgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQ2NEVfVCAgIExaT19TSVpFT0ZfTE9ORworI2VsaWYgKExaT19TSVpFT0ZfTE9OR19MT05HID09IDgpICYmICEoTFpPX0NGR19UWVBFX1BSRUZFUl9fX0lOVDY0KQorIyAgZGVmaW5lIGx6b19pbnQ2NGVfdCAgICAgICAgICAgICAgbHpvX2xsb25nX3QKKyMgIGRlZmluZSBsem9fdWludDY0ZV90ICAgICAgICAgICAgIGx6b191bGxvbmdfdAorIyAgaWYgKExaT19DQ19CT1JMQU5EQykKKyMgICAgZGVmaW5lIExaT19JTlQ2NF9DKGMpICAgICAgICAgICgoYykgKyAwbGwpCisjICAgIGRlZmluZSBMWk9fVUlOVDY0X0MoYykgICAgICAgICAoKGMpICsgMHVsbCkKKyMgIGVsaWYgMAorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKF9fbHpvX2dudWNfZXh0ZW5zaW9uX18gKGMjI0xMKSkKKyMgICAgZGVmaW5lIExaT19VSU5UNjRfQyhjKSAgICAgICAgIChfX2x6b19nbnVjX2V4dGVuc2lvbl9fIChjIyNVTEwpKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKGMjI0xMKQorIyAgICBkZWZpbmUgTFpPX1VJTlQ2NF9DKGMpICAgICAgICAgKGMjI1VMTCkKKyMgIGVuZGlmCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UNjRFX1QgICBMWk9fU0laRU9GX0xPTkdfTE9ORworI2VsaWYgKExaT19TSVpFT0ZfX19JTlQ2NCA9PSA4KQorIyAgZGVmaW5lIGx6b19pbnQ2NGVfdCAgICAgICAgICAgICAgX19pbnQ2NAorIyAgZGVmaW5lIGx6b191aW50NjRlX3QgICAgICAgICAgICAgdW5zaWduZWQgX19pbnQ2NAorIyAgaWYgKExaT19DQ19CT1JMQU5EQykKKyMgICAgZGVmaW5lIExaT19JTlQ2NF9DKGMpICAgICAgICAgICgoYykgKyAwaTY0KQorIyAgICBkZWZpbmUgTFpPX1VJTlQ2NF9DKGMpICAgICAgICAgKChjKSArIDB1aTY0KQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKGMjI2k2NCkKKyMgICAgZGVmaW5lIExaT19VSU5UNjRfQyhjKSAgICAgICAgIChjIyN1aTY0KQorIyAgZW5kaWYKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQ2NEVfVCAgIExaT19TSVpFT0ZfX19JTlQ2NAorI2Vsc2UKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChsem9faW50NjRlX3QpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ2NGVfdCkgPT0gOCkKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDY0ZV90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQ2NEVfVCkKKyNlbmRpZgorI2lmICFkZWZpbmVkKGx6b19pbnQzMmxfdCkKKyNpZiBkZWZpbmVkKGx6b19pbnQzMmVfdCkKKyMgIGRlZmluZSBsem9faW50MzJsX3QgICAgICAgICAgICAgIGx6b19pbnQzMmVfdAorIyAgZGVmaW5lIGx6b191aW50MzJsX3QgICAgICAgICAgICAgbHpvX3VpbnQzMmVfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDMyTF9UICAgTFpPX1NJWkVPRl9MWk9fSU5UMzJFX1QKKyNlbGlmIChMWk9fU0laRU9GX0lOVCA+PSA0KSAmJiAoTFpPX1NJWkVPRl9JTlQgPCBMWk9fU0laRU9GX0xPTkcpCisjICBkZWZpbmUgbHpvX2ludDMybF90ICAgICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBsem9fdWludDMybF90ICAgICAgICAgICAgIHVuc2lnbmVkIGludAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDMyTF9UICAgTFpPX1NJWkVPRl9JTlQKKyNlbGlmIChMWk9fU0laRU9GX0xPTkcgPj0gNCkKKyMgIGRlZmluZSBsem9faW50MzJsX3QgICAgICAgICAgICAgIGxvbmcgaW50CisjICBkZWZpbmUgbHpvX3VpbnQzMmxfdCAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGludAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDMyTF9UICAgTFpPX1NJWkVPRl9MT05HCisjZWxzZQorIyAgZXJyb3IgImx6b19pbnQzMmxfdCIKKyNlbmRpZgorI2VuZGlmCisjaWYgMQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MzJsX3QpID49IDQpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQzMmxfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UMzJMX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50NjRsX3QpCisjaWYgZGVmaW5lZChsem9faW50NjRlX3QpCisjICBkZWZpbmUgbHpvX2ludDY0bF90ICAgICAgICAgICAgICBsem9faW50NjRlX3QKKyMgIGRlZmluZSBsem9fdWludDY0bF90ICAgICAgICAgICAgIGx6b191aW50NjRlX3QKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQ2NExfVCAgIExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UCisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDY0bF90KSA+PSA4KQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRsX3QpID09IExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UKQorI2VuZGlmCisjaWYgIWRlZmluZWQobHpvX2ludDMyZl90KQorI2lmIChMWk9fU0laRU9GX1NJWkVfVCA+PSA4KQorIyAgZGVmaW5lIGx6b19pbnQzMmZfdCAgICAgICAgICAgICAgbHpvX2ludDY0bF90CisjICBkZWZpbmUgbHpvX3VpbnQzMmZfdCAgICAgICAgICAgICBsem9fdWludDY0bF90CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMzJGX1QgICBMWk9fU0laRU9GX0xaT19JTlQ2NExfVAorI2Vsc2UKKyMgIGRlZmluZSBsem9faW50MzJmX3QgICAgICAgICAgICAgIGx6b19pbnQzMmxfdAorIyAgZGVmaW5lIGx6b191aW50MzJmX3QgICAgICAgICAgICAgbHpvX3VpbnQzMmxfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDMyRl9UICAgTFpPX1NJWkVPRl9MWk9fSU5UMzJMX1QKKyNlbmRpZgorI2VuZGlmCisjaWYgMQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MzJmX3QpID49IDQpCisgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQzMmZfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UMzJGX1QpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9faW50NjRmX3QpCisjaWYgZGVmaW5lZChsem9faW50NjRsX3QpCisjICBkZWZpbmUgbHpvX2ludDY0Zl90ICAgICAgICAgICAgICBsem9faW50NjRsX3QKKyMgIGRlZmluZSBsem9fdWludDY0Zl90ICAgICAgICAgICAgIGx6b191aW50NjRsX3QKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19JTlQ2NEZfVCAgIExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UCisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGZfdCkKKyAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDY0Zl90KSA+PSA4KQorICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRmX3QpID09IExaT19TSVpFT0ZfTFpPX0lOVDY0Rl9UKQorI2VuZGlmCisjaWYgIWRlZmluZWQobHpvX2ludHB0cl90KQorI2lmIDEgJiYgKExaT19PU19PUzQwMCAmJiAoTFpPX1NJWkVPRl9WT0lEX1AgPT0gMTYpKQorIyAgZGVmaW5lIF9fTFpPX0lOVFBUUl9UX0lTX1BPSU5URVIgMQorICAgdHlwZWRlZiBjaGFyKiAgICAgICAgICAgICAgICAgICAgbHpvX2ludHB0cl90OworICAgdHlwZWRlZiBjaGFyKiAgICAgICAgICAgICAgICAgICAgbHpvX3VpbnRwdHJfdDsKKyMgIGRlZmluZSBsem9faW50cHRyX3QgICAgICAgICAgICAgIGx6b19pbnRwdHJfdAorIyAgZGVmaW5lIGx6b191aW50cHRyX3QgICAgICAgICAgICAgbHpvX3VpbnRwdHJfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVFBUUl9UICAgTFpPX1NJWkVPRl9WT0lEX1AKKyNlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMzAwKSAmJiAoTFpPX1NJWkVPRl9WT0lEX1AgPT0gNCkgJiYgKExaT19TSVpFT0ZfSU5UID09IDQpKQorICAgdHlwZWRlZiBfX3c2NCBpbnQgICAgICAgICAgICAgICAgbHpvX2ludHB0cl90OworICAgdHlwZWRlZiBfX3c2NCB1bnNpZ25lZCBpbnQgICAgICAgbHpvX3VpbnRwdHJfdDsKKyMgIGRlZmluZSBsem9faW50cHRyX3QgICAgICAgICAgICAgIGx6b19pbnRwdHJfdAorIyAgZGVmaW5lIGx6b191aW50cHRyX3QgICAgICAgICAgICAgbHpvX3VpbnRwdHJfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVFBUUl9UICAgTFpPX1NJWkVPRl9JTlQKKyNlbGlmIChMWk9fU0laRU9GX1NIT1JUID09IExaT19TSVpFT0ZfVk9JRF9QKSAmJiAoTFpPX1NJWkVPRl9JTlQgPiBMWk9fU0laRU9GX1ZPSURfUCkKKyMgIGRlZmluZSBsem9faW50cHRyX3QgICAgICAgICAgICAgIHNob3J0CisjICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVFBUUl9UICAgTFpPX1NJWkVPRl9TSE9SVAorI2VsaWYgKExaT19TSVpFT0ZfSU5UID49IExaT19TSVpFT0ZfVk9JRF9QKSAmJiAoTFpPX1NJWkVPRl9JTlQgPCBMWk9fU0laRU9GX0xPTkcpCisjICBkZWZpbmUgbHpvX2ludHB0cl90ICAgICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBsem9fdWludHB0cl90ICAgICAgICAgICAgIHVuc2lnbmVkIGludAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVFBUUl9UICAgTFpPX1NJWkVPRl9JTlQKKyNlbGlmIChMWk9fU0laRU9GX0xPTkcgPj0gTFpPX1NJWkVPRl9WT0lEX1ApCisjICBkZWZpbmUgbHpvX2ludHB0cl90ICAgICAgICAgICAgICBsb25nCisjICBkZWZpbmUgbHpvX3VpbnRwdHJfdCAgICAgICAgICAgICB1bnNpZ25lZCBsb25nCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QgICBMWk9fU0laRU9GX0xPTkcKKyNlbGlmIChMWk9fU0laRU9GX0xaT19JTlQ2NExfVCA+PSBMWk9fU0laRU9GX1ZPSURfUCkKKyMgIGRlZmluZSBsem9faW50cHRyX3QgICAgICAgICAgICAgIGx6b19pbnQ2NGxfdAorIyAgZGVmaW5lIGx6b191aW50cHRyX3QgICAgICAgICAgICAgbHpvX3VpbnQ2NGxfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVFBUUl9UICAgTFpPX1NJWkVPRl9MWk9fSU5UNjRMX1QKKyNlbHNlCisjICBlcnJvciAibHpvX2ludHB0cl90IgorI2VuZGlmCisjZW5kaWYKKyNpZiAxCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50cHRyX3QpID49IHNpemVvZih2b2lkICopKQorICAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludHB0cl90KSA9PSBzaXplb2YobHpvX3VpbnRwdHJfdCkpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9fd29yZF90KQorI2lmIGRlZmluZWQoTFpPX1dPUkRTSVpFKSAmJiAoTFpPX1dPUkRTSVpFKzAgPiAwKQorI2lmIChMWk9fV09SRFNJWkUgPT0gTFpPX1NJWkVPRl9MWk9fSU5UUFRSX1QpICYmICEoX19MWk9fSU5UUFRSX1RfSVNfUE9JTlRFUikKKyMgIGRlZmluZSBsem9fd29yZF90ICAgICAgICAgICAgICAgIGx6b191aW50cHRyX3QKKyMgIGRlZmluZSBsem9fc3dvcmRfdCAgICAgICAgICAgICAgIGx6b19pbnRwdHJfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1dPUkRfVCBMWk9fU0laRU9GX0xaT19JTlRQVFJfVAorI2VsaWYgKExaT19XT1JEU0laRSA9PSBMWk9fU0laRU9GX0xPTkcpCisjICBkZWZpbmUgbHpvX3dvcmRfdCAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nCisjICBkZWZpbmUgbHpvX3N3b3JkX3QgICAgICAgICAgICAgICBsb25nCisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fV09SRF9UIExaT19TSVpFT0ZfTE9ORworI2VsaWYgKExaT19XT1JEU0laRSA9PSBMWk9fU0laRU9GX0lOVCkKKyMgIGRlZmluZSBsem9fd29yZF90ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludAorIyAgZGVmaW5lIGx6b19zd29yZF90ICAgICAgICAgICAgICAgaW50CisjICBkZWZpbmUgTFpPX1NJWkVPRl9MWk9fV09SRF9UIExaT19TSVpFT0ZfSU5UCisjZWxpZiAoTFpPX1dPUkRTSVpFID09IExaT19TSVpFT0ZfU0hPUlQpCisjICBkZWZpbmUgbHpvX3dvcmRfdCAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydAorIyAgZGVmaW5lIGx6b19zd29yZF90ICAgICAgICAgICAgICAgc2hvcnQKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19XT1JEX1QgTFpPX1NJWkVPRl9TSE9SVAorI2VsaWYgKExaT19XT1JEU0laRSA9PSAxKQorIyAgZGVmaW5lIGx6b193b3JkX3QgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcgorIyAgZGVmaW5lIGx6b19zd29yZF90ICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIKKyMgIGRlZmluZSBMWk9fU0laRU9GX0xaT19XT1JEX1QgMQorI2VsaWYgKExaT19XT1JEU0laRSA9PSBMWk9fU0laRU9GX0xaT19JTlQ2NExfVCkKKyMgIGRlZmluZSBsem9fd29yZF90ICAgICAgICAgICAgICAgIGx6b191aW50NjRsX3QKKyMgIGRlZmluZSBsem9fc3dvcmRfdCAgICAgICAgICAgICAgIGx6b19pbnQ2NGxfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1dPUkRfVCBMWk9fU0laRU9GX0xaT19JTlQ2NExfVAorI2VsaWYgKExaT19BUkNIX1NQVSkgJiYgKExaT19DQ19HTlVDKQorI2lmIDAKKyAgIHR5cGVkZWYgdW5zaWduZWQgbHpvX3dvcmRfdCAgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19WMTZRSV9fKSkpOworICAgdHlwZWRlZiBpbnQgICAgICBsem9fc3dvcmRfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1YxNlFJX18pKSk7CisjICBkZWZpbmUgbHpvX3dvcmRfdCAgICAgICAgICAgICAgICBsem9fd29yZF90CisjICBkZWZpbmUgbHpvX3N3b3JkX3QgICAgICAgICAgICAgICBsem9fc3dvcmRfdAorIyAgZGVmaW5lIExaT19TSVpFT0ZfTFpPX1dPUkRfVCAgICAgMTYKKyNlbmRpZgorI2Vsc2UKKyMgIGVycm9yICJsem9fd29yZF90IgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmIDEgJiYgZGVmaW5lZChsem9fd29yZF90KQorICAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3dvcmRfdCkgID09IExaT19XT1JEU0laRSkKKyAgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19zd29yZF90KSA9PSBMWk9fV09SRFNJWkUpCisjZW5kaWYKKyNpZiAxCisjZGVmaW5lIGx6b19pbnQ4X3QgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhcgorI2RlZmluZSBsem9fdWludDhfdCAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcgorI2RlZmluZSBMWk9fU0laRU9GX0xaT19JTlQ4X1QgICAgICAgMQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50OF90KSA9PSAxKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50OF90KSA9PSBzaXplb2YobHpvX3VpbnQ4X3QpKQorI2VuZGlmCisjaWYgZGVmaW5lZChsem9faW50MTZlX3QpCisjZGVmaW5lIGx6b19pbnQxNl90ICAgICAgICAgICAgICAgICBsem9faW50MTZlX3QKKyNkZWZpbmUgbHpvX3VpbnQxNl90ICAgICAgICAgICAgICAgIGx6b191aW50MTZlX3QKKyNkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UMTZfVCAgICAgIExaT19TSVpFT0ZfTFpPX0lOVDE2RV9UCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQxNl90KSA9PSAyKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50MTZfdCkgPT0gc2l6ZW9mKGx6b191aW50MTZfdCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQzMmVfdCkKKyNkZWZpbmUgbHpvX2ludDMyX3QgICAgICAgICAgICAgICAgIGx6b19pbnQzMmVfdAorI2RlZmluZSBsem9fdWludDMyX3QgICAgICAgICAgICAgICAgbHpvX3VpbnQzMmVfdAorI2RlZmluZSBMWk9fU0laRU9GX0xaT19JTlQzMl9UICAgICAgTFpPX1NJWkVPRl9MWk9fSU5UMzJFX1QKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMyX3QpID09IDQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQzMl90KSA9PSBzaXplb2YobHpvX3VpbnQzMl90KSkKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0ZV90KQorI2RlZmluZSBsem9faW50NjRfdCAgICAgICAgICAgICAgICAgbHpvX2ludDY0ZV90CisjZGVmaW5lIGx6b191aW50NjRfdCAgICAgICAgICAgICAgICBsem9fdWludDY0ZV90CisjZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVDY0X1QgICAgICBMWk9fU0laRU9GX0xaT19JTlQ2NEVfVAorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9faW50NjRfdCkgPT0gOCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDY0X3QpID09IHNpemVvZihsem9fdWludDY0X3QpKQorI2VuZGlmCisjaWYgMQorI2RlZmluZSBsem9faW50X2xlYXN0MzJfdCAgICAgICAgICAgbHpvX2ludDMybF90CisjZGVmaW5lIGx6b191aW50X2xlYXN0MzJfdCAgICAgICAgICBsem9fdWludDMybF90CisjZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVF9MRUFTVDMyX1QgTFpPX1NJWkVPRl9MWk9fSU5UMzJMX1QKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9sZWFzdDMyX3QpID49IDQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnRfbGVhc3QzMl90KSA9PSBzaXplb2YobHpvX3VpbnRfbGVhc3QzMl90KSkKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorI2RlZmluZSBsem9faW50X2xlYXN0NjRfdCAgICAgICAgICAgbHpvX2ludDY0bF90CisjZGVmaW5lIGx6b191aW50X2xlYXN0NjRfdCAgICAgICAgICBsem9fdWludDY0bF90CisjZGVmaW5lIExaT19TSVpFT0ZfTFpPX0lOVF9MRUFTVDY0X1QgTFpPX1NJWkVPRl9MWk9fSU5UNjRMX1QKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludF9sZWFzdDY0X3QpID49IDgpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnRfbGVhc3Q2NF90KSA9PSBzaXplb2YobHpvX3VpbnRfbGVhc3Q2NF90KSkKKyNlbmRpZgorI2lmIDEKKyNkZWZpbmUgbHpvX2ludF9mYXN0MzJfdCAgICAgICAgICAgbHpvX2ludDMyZl90CisjZGVmaW5lIGx6b191aW50X2Zhc3QzMl90ICAgICAgICAgIGx6b191aW50MzJmX3QKKyNkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UX0ZBU1QzMl9UIExaT19TSVpFT0ZfTFpPX0lOVDMyRl9UCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnRfZmFzdDMyX3QpID49IDQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnRfZmFzdDMyX3QpID09IHNpemVvZihsem9fdWludF9mYXN0MzJfdCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGZfdCkKKyNkZWZpbmUgbHpvX2ludF9mYXN0NjRfdCAgICAgICAgICAgbHpvX2ludDY0Zl90CisjZGVmaW5lIGx6b191aW50X2Zhc3Q2NF90ICAgICAgICAgIGx6b191aW50NjRmX3QKKyNkZWZpbmUgTFpPX1NJWkVPRl9MWk9fSU5UX0ZBU1Q2NF9UIExaT19TSVpFT0ZfTFpPX0lOVDY0Rl9UCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnRfZmFzdDY0X3QpID49IDgpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnRfZmFzdDY0X3QpID09IHNpemVvZihsem9fdWludF9mYXN0NjRfdCkpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fSU5UMTZfQykKKyMgIGlmIChMWk9fQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKExaT19TSVpFT0ZfSU5UID49IDIpCisjICAgIGRlZmluZSBMWk9fSU5UMTZfQyhjKSAgICAgICAgICAoKGMpICsgMCkKKyMgICAgZGVmaW5lIExaT19VSU5UMTZfQyhjKSAgICAgICAgICgoYykgKyAwVSkKKyMgIGVsaWYgKExaT19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTKSAmJiAoTFpPX1NJWkVPRl9MT05HID49IDIpCisjICAgIGRlZmluZSBMWk9fSU5UMTZfQyhjKSAgICAgICAgICAoKGMpICsgMEwpCisjICAgIGRlZmluZSBMWk9fVUlOVDE2X0MoYykgICAgICAgICAoKGMpICsgMFVMKQorIyAgZWxpZiAoTFpPX1NJWkVPRl9JTlQgPj0gMikKKyMgICAgZGVmaW5lIExaT19JTlQxNl9DKGMpICAgICAgICAgIChjKQorIyAgICBkZWZpbmUgTFpPX1VJTlQxNl9DKGMpICAgICAgICAgKGMjI1UpCisjICBlbGlmIChMWk9fU0laRU9GX0xPTkcgPj0gMikKKyMgICAgZGVmaW5lIExaT19JTlQxNl9DKGMpICAgICAgICAgIChjIyNMKQorIyAgICBkZWZpbmUgTFpPX1VJTlQxNl9DKGMpICAgICAgICAgKGMjI1VMKQorIyAgZWxzZQorIyAgICBlcnJvciAiTFpPX0lOVDE2X0MiCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0lOVDMyX0MpCisjICBpZiAoTFpPX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChMWk9fU0laRU9GX0lOVCA+PSA0KQorIyAgICBkZWZpbmUgTFpPX0lOVDMyX0MoYykgICAgICAgICAgKChjKSArIDApCisjICAgIGRlZmluZSBMWk9fVUlOVDMyX0MoYykgICAgICAgICAoKGMpICsgMFUpCisjICBlbGlmIChMWk9fQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKExaT19TSVpFT0ZfTE9ORyA+PSA0KQorIyAgICBkZWZpbmUgTFpPX0lOVDMyX0MoYykgICAgICAgICAgKChjKSArIDBMKQorIyAgICBkZWZpbmUgTFpPX1VJTlQzMl9DKGMpICAgICAgICAgKChjKSArIDBVTCkKKyMgIGVsaWYgKExaT19TSVpFT0ZfSU5UID49IDQpCisjICAgIGRlZmluZSBMWk9fSU5UMzJfQyhjKSAgICAgICAgICAoYykKKyMgICAgZGVmaW5lIExaT19VSU5UMzJfQyhjKSAgICAgICAgIChjIyNVKQorIyAgZWxpZiAoTFpPX1NJWkVPRl9MT05HID49IDQpCisjICAgIGRlZmluZSBMWk9fSU5UMzJfQyhjKSAgICAgICAgICAoYyMjTCkKKyMgICAgZGVmaW5lIExaT19VSU5UMzJfQyhjKSAgICAgICAgIChjIyNVTCkKKyMgIGVsaWYgKExaT19TSVpFT0ZfTE9OR19MT05HID49IDQpCisjICAgIGRlZmluZSBMWk9fSU5UMzJfQyhjKSAgICAgICAgICAoYyMjTEwpCisjICAgIGRlZmluZSBMWk9fVUlOVDMyX0MoYykgICAgICAgICAoYyMjVUxMKQorIyAgZWxzZQorIyAgICBlcnJvciAiTFpPX0lOVDMyX0MiCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0lOVDY0X0MpICYmIGRlZmluZWQobHpvX2ludDY0bF90KQorIyAgaWYgKExaT19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTKSAmJiAoTFpPX1NJWkVPRl9JTlQgPj0gOCkKKyMgICAgZGVmaW5lIExaT19JTlQ2NF9DKGMpICAgICAgICAgICgoYykgKyAwKQorIyAgICBkZWZpbmUgTFpPX1VJTlQ2NF9DKGMpICAgICAgICAgKChjKSArIDBVKQorIyAgZWxpZiAoTFpPX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChMWk9fU0laRU9GX0xPTkcgPj0gOCkKKyMgICAgZGVmaW5lIExaT19JTlQ2NF9DKGMpICAgICAgICAgICgoYykgKyAwTCkKKyMgICAgZGVmaW5lIExaT19VSU5UNjRfQyhjKSAgICAgICAgICgoYykgKyAwVUwpCisjICBlbGlmIChMWk9fU0laRU9GX0lOVCA+PSA4KQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKGMpCisjICAgIGRlZmluZSBMWk9fVUlOVDY0X0MoYykgICAgICAgICAoYyMjVSkKKyMgIGVsaWYgKExaT19TSVpFT0ZfTE9ORyA+PSA4KQorIyAgICBkZWZpbmUgTFpPX0lOVDY0X0MoYykgICAgICAgICAgKGMjI0wpCisjICAgIGRlZmluZSBMWk9fVUlOVDY0X0MoYykgICAgICAgICAoYyMjVUwpCisjICBlbHNlCisjICAgIGVycm9yICJMWk9fSU5UNjRfQyIKKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisvKiB2aW06c2V0IHRzPTQgc3c9NCBldDogKi8KZGlmZiAtLWdpdCBhL2x6by9pbmNsdWRlL2x6by9sem91dGlsLmggYi9sem8vaW5jbHVkZS9sem8vbHpvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZWE1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vaW5jbHVkZS9sem8vbHpvdXRpbC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIGx6b3V0aWwuaCAtLSB1dGlsaXRpeSBmdW5jdGlvbnMgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgW0RFUFJFQ0FURURdCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2lmbmRlZiBfX0xaT1VUSUxfSF9JTkNMVURFRAorI2RlZmluZSBfX0xaT1VUSUxfSF9JTkNMVURFRCAxCisKKyNpZm5kZWYgX19MWk9DT05GX0hfSU5DTFVERUQKKyNpbmNsdWRlICJsem9jb25mLmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gTFpPLXYxIGRlcHJlY2F0ZWQgbWFjcm9zICh3aGljaCB3ZXJlIHVzZWQgaW4gdGhlIG9sZCBleGFtcGxlIHByb2dyYW1zKQorLy8gRE8gTk9UIFVTRQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGx6b19hbGxvYyhhLGIpICAgICAgKG1hbGxvYygoYSkqKGIpKSkKKyNkZWZpbmUgbHpvX21hbGxvYyhhKSAgICAgICAobWFsbG9jKGEpKQorI2RlZmluZSBsem9fZnJlZShhKSAgICAgICAgIChmcmVlKGEpKQorCisjZGVmaW5lIGx6b19mcmVhZChmLGIscykgICAgKGZyZWFkKGIsMSxzLGYpKQorI2RlZmluZSBsem9fZndyaXRlKGYsYixzKSAgIChmd3JpdGUoYiwxLHMsZikpCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisKKy8qIHZpbTpzZXQgdHM9NCBldDogKi8KZGlmZiAtLWdpdCBhL2x6by9wcmVwY29yZS5jIGIvbHpvL3ByZXBjb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0N2IyZQotLS0gL2Rldi9udWxsCisrKyBiL2x6by9wcmVwY29yZS5jCkBAIC0wLDAgKzEsMzg3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgIAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAKKyAgIFRoaXMgZmlsZSBpcyBiYXNlZCBpbiBwYXJ0IG9uOgorCisgICBwcmVjb21wMi5jIC0tIGV4YW1wbGUgcHJvZ3JhbTogaG93IHRvIGdlbmVyYXRlIHByZS1jb21wcmVzc2VkIGRhdGEKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA3IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwNiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDAxIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTkgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAxOTk4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTYgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKyNpbmNsdWRlICJsem8vbHpvY29uZi5oIgorI2luY2x1ZGUgImx6by9sem8xeC5oIgorCitMWk9fRVhURVJOKGludCkKK2x6bzF4Xzk5OV9jb21wcmVzc19pbnRlcm5hbChjb25zdCBsem9fYnl0ZXAgaW4sIGx6b191aW50IGluX2xlbiwKKwkJCSAgICBsem9fYnl0ZXAgb3V0LCBsem9fdWludHAgb3V0X2xlbiwKKwkJCSAgICBsem9fdm9pZHAgd3JrbWVtLAorCQkJICAgIGNvbnN0IGx6b19ieXRlcCBkaWN0LCBsem9fdWludCBkaWN0X2xlbiwKKwkJCSAgICBsem9fY2FsbGJhY2tfcCBjYiwKKwkJCSAgICBpbnQgdHJ5X2xhenksCisJCQkgICAgbHpvX3VpbnQgZ29vZF9sZW5ndGgsCisJCQkgICAgbHpvX3VpbnQgbWF4X2xhenksCisJCQkgICAgbHpvX3VpbnQgbmljZV9sZW5ndGgsCisJCQkgICAgbHpvX3VpbnQgbWF4X2NoYWluLCBsem9fdWludDMyIGZsYWdzKTsKKworTFpPX0VYVEVSTihpbnQpCitsem8xeV85OTlfY29tcHJlc3NfaW50ZXJuYWwoY29uc3QgbHpvX2J5dGVwIGluLCBsem9fdWludCBpbl9sZW4sCisJCQkgICAgbHpvX2J5dGVwIG91dCwgbHpvX3VpbnRwIG91dF9sZW4sCisJCQkgICAgbHpvX3ZvaWRwIHdya21lbSwKKwkJCSAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4sCisJCQkgICAgbHpvX2NhbGxiYWNrX3AgY2IsCisJCQkgICAgaW50IHRyeV9sYXp5LAorCQkJICAgIGx6b191aW50IGdvb2RfbGVuZ3RoLAorCQkJICAgIGx6b191aW50IG1heF9sYXp5LAorCQkJICAgIGx6b191aW50IG5pY2VfbGVuZ3RoLAorCQkJICAgIGx6b191aW50IG1heF9jaGFpbiwgbHpvX3VpbnQzMiBmbGFncyk7CisKKyNkZWZpbmUgUEFSQU5PSUQgMQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgbm9yZXR1cm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZWxzZQorIyBkZWZpbmUgbm9yZXR1cm4gdm9pZAorI2VuZGlmCisKK3N0cnVjdCBwcmVmaXggeworICAgIHVpbnQzMl90IHBmeF9zdGFydDsKKyAgICB1aW50MzJfdCBwZnhfY29tcHJlc3NlZDsKKyAgICB1aW50MzJfdCBwZnhfY2RhdGFsZW47CisgICAgdWludDMyX3QgcGZ4X2NoZWNrc3VtOworICAgIHVpbnQzMl90IHBmeF9tYXhsbWE7Cit9OworCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF8zMihjb25zdCB1aW50MzJfdCAqIHApCit7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorICAgIC8qIExpdHRsZWVuZGlhbiBhbmQgdW5hbGlnbmVkLWNhcGFibGUgKi8KKyAgICByZXR1cm4gKnA7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKnBwID0gKGNvbnN0IHVpbnQ4X3QgKilwOworICAgIHJldHVybiAodWludDMyX3QpIHBwWzBdICsgKCh1aW50MzJfdCkgcHBbMV0gPDwgOCkgKworCSgodWludDMyX3QpIHBwWzJdIDw8IDE2KSArICgodWludDMyX3QpIHBwWzNdIDw8IDI0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0XzMyKHVpbnQzMl90ICogcCwgdWludDMyX3QgdikKK3sKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisgICAgLyogTGl0dGxlZW5kaWFuIGFuZCB1bmFsaWduZWQtY2FwYWJsZSAqLworICAgICpwID0gdjsKKyNlbHNlCisgICAgdWludDhfdCAqcHAgPSAodWludDhfdCAqKSBwOworICAgIHBwWzBdID0gKHYgJiAweGZmKTsKKyAgICBwcFsxXSA9ICgodiA+PiA4KSAmIDB4ZmYpOworICAgIHBwWzJdID0gKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgIHBwWzNdID0gKCh2ID4+IDI0KSAmIDB4ZmYpOworI2VuZGlmCit9CisKK2NvbnN0IGNoYXIgKnByb2duYW1lID0gTlVMTDsKK2NvbnN0IGNoYXIgKmluX25hbWUgID0gTlVMTDsKK2NvbnN0IGNoYXIgKm91dF9uYW1lID0gTlVMTDsKKworc3RhdGljIG5vcmV0dXJuIGVycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7CisgICAgaWYgKGluX25hbWUpCisJZnByaW50ZihzdGRlcnIsICIlczogIiwgaW5fbmFtZSk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKyAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgIHZhX2VuZChhcCk7CisKKyAgICBleGl0KDEpOworfQorCitzdGF0aWMgdm9pZCAqeHphbGxvYyhzaXplX3QgbikKK3sKKyAgICB2b2lkICpwID0gY2FsbG9jKG4sIDEpOworICAgIGlmICghcCkKKwllcnJvcigib3V0IG9mIG1lbW9yeSIpOworICAgIHJldHVybiBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCByOworICAgIGludCBsYXp5OworICAgIGNvbnN0IGludCBtYXhfdHJ5X2xhenkgPSA1OworICAgIGNvbnN0IGx6b191aW50IGJpZyA9IDY1NTM2TDsJLyogY2FuIHJlc3VsdCBpbiB2ZXJ5IHNsb3cgY29tcHJlc3Npb24gKi8KKyAgICBjb25zdCBsem9fdWludDMyIGZsYWdzID0gMHgxOworCisgICAgbHpvX2J5dGVwIGluOworICAgIGx6b19ieXRlcCBpbmZpbGU7CisgICAgbHpvX3VpbnQgaW5fbGVuLCBpbmZpbGVfbGVuLCBzdGFydCwgb2Zmc2V0LCBzb2ZmOworCisgICAgbHpvX2J5dGVwIG91dDsKKyAgICBsem9fdWludCBvdXRfYnVmc2l6ZTsKKyAgICBsem9fdWludCBvdXRfbGVuID0gMDsKKyAgICBsem9fdWludCBvdXRmaWxlX2xlbjsKKworICAgIGx6b19ieXRlcCB0ZXN0OworCisgICAgbHpvX2J5dGUgd3JrbWVtW0xaTzFYXzk5OV9NRU1fQ09NUFJFU1NdOworCisgICAgbHpvX3VpbnQgYmVzdF9sZW47CisgICAgaW50IGJlc3RfbGF6eSA9IC0xOworCisgICAgbHpvX3VpbnQgb3JpZ19sZW47CisgICAgbHpvX3VpbnQzMiB1bmNvbXByZXNzZWRfY2hlY2tzdW07CisgICAgbHpvX3VpbnQzMiBjb21wcmVzc2VkX2NoZWNrc3VtOworCisgICAgRklMRSAqZjsKKyAgICBsb25nIGw7CisKKyAgICBzdHJ1Y3QgcHJlZml4ICpwcmVmaXg7CisKKyAgICBwcm9nbmFtZSA9IGFyZ3ZbMF07CisgICAgaWYgKGFyZ2MgIT0gMykgeworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGZpbGUgb3V0cHV0LWZpbGVcbiIsIHByb2duYW1lKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBpbl9uYW1lID0gYXJndlsxXTsKKyAgICBpZiAoYXJnYyA+IDIpCisJb3V0X25hbWUgPSBhcmd2WzJdOworCisvKgorICogU3RlcCAxOiBpbml0aWFsaXplIHRoZSBMWk8gbGlicmFyeQorICovCisgICAgaWYgKGx6b19pbml0KCkgIT0gTFpPX0VfT0spCisJZXJyb3IoImludGVybmFsIGVycm9yIC0gbHpvX2luaXQoKSBmYWlsZWQhIik7CisKKy8qCisgKiBTdGVwIDM6IG9wZW4gdGhlIGlucHV0IGZpbGUKKyAqLworICAgIGYgPSBmb3Blbihpbl9uYW1lLCAicmIiKTsKKyAgICBpZiAoIWYpCisJZXJyb3IoImNhbm5vdCBvcGVuIGZpbGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworICAgIGZzZWVrKGYsIDAsIFNFRUtfRU5EKTsKKyAgICBsID0gZnRlbGwoZik7CisgICAgZnNlZWsoZiwgMCwgU0VFS19TRVQpOworICAgIGlmIChsIDw9IDApIHsKKwllcnJvcigiZW1wdHkgZmlsZSIsIHByb2duYW1lLCBpbl9uYW1lKTsKKwlmY2xvc2UoZik7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaW5maWxlX2xlbiA9IChsem9fdWludCkgbDsKKyAgICBvdXRfYnVmc2l6ZSA9IGluZmlsZV9sZW4gKyBpbmZpbGVfbGVuIC8gMTYgKyA2NCArIDMgKyAyMDQ4OworCisvKgorICogU3RlcCA0OiBhbGxvY2F0ZSBjb21wcmVzc2lvbiBidWZmZXJzIGFuZCByZWFkIHRoZSBmaWxlCisgKi8KKyAgICBpbmZpbGUgPSB4emFsbG9jKGluZmlsZV9sZW4pOworICAgIG91dCA9IHh6YWxsb2Mob3V0X2J1ZnNpemUpOworICAgIGluZmlsZV9sZW4gPSBmcmVhZChpbmZpbGUsIDEsIGluZmlsZV9sZW4sIGYpOworICAgIGZjbG9zZShmKTsKKworLyoKKyAqIFNlbGVjdCB0aGUgcG9ydGlvbiB3aGljaCBpcyBmb3IgY29tcHJlc3Npb24uLi4KKyAqLworICAgIHByZWZpeCA9IChzdHJ1Y3QgcHJlZml4ICopaW5maWxlOworICAgIHN0YXJ0ID0gZ2V0XzMyKCZwcmVmaXgtPnBmeF9zdGFydCk7CisgICAgb2Zmc2V0ID0gZ2V0XzMyKCZwcmVmaXgtPnBmeF9jb21wcmVzc2VkKTsKKyAgICBpbiA9IGluZmlsZSArIG9mZnNldDsKKyAgICBpbl9sZW4gPSBpbmZpbGVfbGVuIC0gb2Zmc2V0OworICAgIGJlc3RfbGVuID0gaW5fbGVuOworCisvKgorICogU3RlcCA1OiBjb21wdXRlIGEgY2hlY2tzdW0gb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhCisgKi8KKyAgICB1bmNvbXByZXNzZWRfY2hlY2tzdW0gPSBsem9fYWRsZXIzMigwLCBOVUxMLCAwKTsKKyAgICB1bmNvbXByZXNzZWRfY2hlY2tzdW0gPSBsem9fYWRsZXIzMih1bmNvbXByZXNzZWRfY2hlY2tzdW0sIGluLCBpbl9sZW4pOworCisvKgorICogU3RlcCA2YTogY29tcHJlc3MgZnJvbSBgaW4nIHRvIGBvdXQnIHdpdGggTFpPMVgtOTk5CisgKi8KKyAgICBmb3IgKGxhenkgPSAwOyBsYXp5IDw9IG1heF90cnlfbGF6eTsgbGF6eSsrKSB7CisJb3V0X2xlbiA9IG91dF9idWZzaXplOworCXIgPSBsem8xeF85OTlfY29tcHJlc3NfaW50ZXJuYWwoaW4sIGluX2xlbiwgb3V0LCAmb3V0X2xlbiwgd3JrbWVtLAorCQkJCQlOVUxMLCAwLCAwLAorCQkJCQlsYXp5LCBiaWcsIGJpZywgYmlnLCBiaWcsIGZsYWdzKTsKKwlpZiAociAhPSBMWk9fRV9PSykKKwkgICAgLyogdGhpcyBzaG91bGQgTkVWRVIgaGFwcGVuICovCisJICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIGNvbXByZXNzaW9uIGZhaWxlZDogJWQiLCByKTsKKworCWlmIChvdXRfbGVuIDwgYmVzdF9sZW4pIHsKKwkgICAgYmVzdF9sZW4gPSBvdXRfbGVuOworCSAgICBiZXN0X2xhenkgPSBsYXp5OworCX0KKyAgICB9CisKKy8qCisgKiBTdGVwIDc6IGNoZWNrIGlmIGNvbXByZXNzaWJsZQorICovCisgICAgaWYgKGJlc3RfbGVuID49IGluX2xlbikgeworCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiB0aGlzIGZpbGUgY29udGFpbnMgaW5jb21wcmVzc2libGUgZGF0YS4iLAorCQlwcm9nbmFtZSwgaW5fbmFtZSk7CisJLyogZG8gaXQgYW55d2F5ICovCisgICAgfQorCisvKgorICogU3RlcCA4OiBjb21wcmVzcyBkYXRhIGFnYWluIHVzaW5nIHRoZSBiZXN0IGNvbXByZXNzb3IgZm91bmQKKyAqLworICAgIG91dF9sZW4gPSBvdXRfYnVmc2l6ZTsKKyAgICByID0gbHpvMXhfOTk5X2NvbXByZXNzX2ludGVybmFsKGluLCBpbl9sZW4sIG91dCwgJm91dF9sZW4sIHdya21lbSwKKwkJCQkgICAgTlVMTCwgMCwgMCwKKwkJCQkgICAgYmVzdF9sYXp5LCBiaWcsIGJpZywgYmlnLCBiaWcsIGZsYWdzKTsKKyAgICBhc3NlcnQociA9PSBMWk9fRV9PSyk7CisgICAgYXNzZXJ0KG91dF9sZW4gPT0gYmVzdF9sZW4pOworCisvKgorICogU3RlcCA5OiBvcHRpbWl6ZSBjb21wcmVzc2VkIGRhdGEgKGNvbXByZXNzZWQgZGF0YSBpcyBpbiBgb3V0JyBidWZmZXIpCisgKi8KKyNpZiAxCisgICAgLyogT3B0aW1pemF0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55IGRhdGEgaW4gdGhlIGJ1ZmZlciB0aGF0IHdpbGwKKyAgICAgKiBob2xkIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4gVG8gcHJvdmUgdGhpcywgd2UgY2xlYXIgdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBtZW1zZXQoaW4sIDAsIGluX2xlbik7CisjZW5kaWYKKworICAgIG9yaWdfbGVuID0gaW5fbGVuOworICAgIHIgPSBsem8xeF9vcHRpbWl6ZShvdXQsIG91dF9sZW4sIGluLCAmb3JpZ19sZW4sIE5VTEwpOworICAgIGlmIChyICE9IExaT19FX09LIHx8IG9yaWdfbGVuICE9IGluX2xlbikgeworCS8qIHRoaXMgc2hvdWxkIE5FVkVSIGhhcHBlbiAqLworCWVycm9yKCJpbnRlcm5hbCBlcnJvciAtIG9wdGltaXphdGlvbiBmYWlsZWQ6ICVkIiwgcik7CisgICAgfQorCisvKgorICogU3RlcCAxMDogY29tcHV0ZSBhIGNoZWNrc3VtIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEKKyAqLworICAgIGNvbXByZXNzZWRfY2hlY2tzdW0gPSBsem9fYWRsZXIzMigwLCBOVUxMLCAwKTsKKyAgICBjb21wcmVzc2VkX2NoZWNrc3VtID0gbHpvX2FkbGVyMzIoY29tcHJlc3NlZF9jaGVja3N1bSwgb3V0LCBvdXRfbGVuKTsKKworLyoKKyAqIFN0ZXAgMTE6IHdyaXRlIGNvbXByZXNzZWQgZGF0YSB0byBhIGZpbGUKKyAqLworICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHVwIHRvIDIwNDggYnl0ZXMgb2YgemVybyBhZnRlciB0aGUgb3V0cHV0ICovCisgICAgbWVtc2V0KG91dCArIG91dF9sZW4sIDAsIDIwNDgpOworCisgICAgb3V0ZmlsZV9sZW4gPSBvdXRfbGVuOworCisgICAgc29mZiA9IGdldF8zMigmcHJlZml4LT5wZnhfY2RhdGFsZW4pOworICAgIHNldF8zMigodWludDMyX3QgKikgKGluZmlsZSArIHNvZmYpLCBvdXRfbGVuKTsKKworICAgIHNvZmYgPSBnZXRfMzIoJnByZWZpeC0+cGZ4X2NoZWNrc3VtKTsKKyAgICBpZiAoc29mZikgeworCS8qIElTT0xJTlVYIHBhZGRpbmcgYW5kIGNoZWNrc3VtbWluZyAqLworCXVpbnQzMl90IGNzdW0gPSAwOworCXVuc2lnbmVkIGludCBwdHI7CisJb3V0ZmlsZV9sZW4gPQorCSAgICAoKG9mZnNldCAtIHN0YXJ0ICsgb3V0X2xlbiArIDIwNDcpICYgfjIwNDcpIC0gKG9mZnNldCAtIHN0YXJ0KTsKKwlmb3IgKHB0ciA9IDY0OyBwdHIgPCBvZmZzZXQ7IHB0ciArPSA0KQorCSAgICBjc3VtICs9IGdldF8zMigodWludDMyX3QgKikgKGluZmlsZSArIHB0cikpOworCWZvciAocHRyID0gMDsgcHRyIDwgb3V0ZmlsZV9sZW47IHB0ciArPSA0KQorCSAgICBjc3VtICs9IGdldF8zMigodWludDMyX3QgKikgKG91dCArIHB0cikpOworCisJc2V0XzMyKCh1aW50MzJfdCAqKSAoaW5maWxlICsgc29mZiksIG9mZnNldCAtIHN0YXJ0ICsgb3V0ZmlsZV9sZW4pOworCXNldF8zMigodWludDMyX3QgKikgKGluZmlsZSArIHNvZmYgKyA0KSwgY3N1bSk7CisgICAgfQorCisJLyoKKyAgICBpZiAob2Zmc2V0K291dGZpbGVfbGVuID4gZ2V0XzMyKCZwcmVmaXgtPnBmeF9tYXhsbWEpKQorCWVycm9yKCJvdXRwdXQgdG9vIGJpZyAoJWx1LCBtYXggJWx1KSIsCisJICAgICAgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0K291dGZpbGVfbGVuLAorCSAgICAgICh1bnNpZ25lZCBsb25nKWdldF8zMigmcHJlZml4LT5wZnhfbWF4bG1hKSk7CisJICAgICAgKi8KKworICAgIGYgPSBmb3BlbihvdXRfbmFtZSwgIndiIik7CisgICAgaWYgKCFmKQorCWVycm9yKCJjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlczogJXMiLCBvdXRfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKworICAgIGlmIChmd3JpdGUoaW5maWxlICsgc3RhcnQsIDEsIG9mZnNldCAtIHN0YXJ0LCBmKSAhPSBvZmZzZXQgLSBzdGFydCB8fAorCWZ3cml0ZShvdXQsIDEsIG91dGZpbGVfbGVuLCBmKSAhPSBvdXRmaWxlX2xlbiB8fCBmY2xvc2UoZikpCisJZXJyb3IoIndyaXRlIGVycm9yIik7CisKKy8qCisgKiBTdGVwIDEyOiB2ZXJpZnkgZGVjb21wcmVzc2lvbgorICovCisjaWZkZWYgUEFSQU5PSUQKKyAgICBvcmlnX2xlbiA9IGluX2xlbiAqIDI7CisgICAgdGVzdCA9IHh6YWxsb2Mob3JpZ19sZW4pOworICAgIHIgPSBsem8xeF9kZWNvbXByZXNzX3NhZmUob3V0LCBvdXRfbGVuLCB0ZXN0LCAmb3JpZ19sZW4sIE5VTEwpOworCisgICAgaWYgKHIgIT0gTFpPX0VfT0sgfHwgb3JpZ19sZW4gIT0gaW5fbGVuKSB7CisJLyogdGhpcyBzaG91bGQgTkVWRVIgaGFwcGVuICovCisJZXJyb3IoImludGVybmFsIGVycm9yIC0gZGVjb21wcmVzc2lvbiBmYWlsZWQ6ICVkIiwgcik7CisgICAgfQorCisgICAgaWYgKG1lbWNtcCh0ZXN0LCBpbiwgaW5fbGVuKSkgeworCS8qIHRoaXMgc2hvdWxkIE5FVkVSIGhhcHBlbiAqLworCWVycm9yKCJpbnRlcm5hbCBlcnJvciAtIGRlY29tcHJlc3Npb24gZGF0YSBlcnJvciIpOworICAgIH0KKworICAgIC8qIE5vdyB5b3UgY291bGQgYWxzbyB2ZXJpZnkgZGVjb21wcmVzc2lvbiB1bmRlciBzaW1pbGFyIGNvbmRpdGlvbnMgYXMgaW4KKyAgICAgKiB5b3VyIGFwcGxpY2F0aW9uLCBlLmcuIG92ZXJsYXBwaW5nIGFzc2VtYmxlciBkZWNvbXByZXNzaW9uIGV0Yy4KKyAgICAgKi8KKworICAgIGZyZWUodGVzdCk7CisjZW5kaWYKKworICAgIGZyZWUoaW5maWxlKTsKKyAgICBmcmVlKG91dCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2x6by9zcmMvY29tcHIxYi5oIGIvbHpvL3NyYy9jb21wcjFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMjI2NgotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvY29tcHIxYi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGNvbXByMWIuaCAtLQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKyNkZWZpbmUgTFpPX05FRURfRElDVF9IIDEKKyNpbmNsdWRlICJjb25maWcxYi5oIgorCisKKyNpZiAhZGVmaW5lZChDT01QUkVTU19JRCkKKyNkZWZpbmUgQ09NUFJFU1NfSUQgICAgIExaT19QUF9FQ09OQ0FUMihERF9CSVRTLENMRVZFTCkKKyNlbmRpZgorCisKKyNpbmNsdWRlICJsem8xYl9jLmNoIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMWk9fQ09NUFJFU1MgXAorICAgIExaT19QUF9FQ09OQ0FUMyhsem8xYl8sQ09NUFJFU1NfSUQsX2NvbXByZXNzKQorCisjZGVmaW5lIExaT19DT01QUkVTU19GVU5DIFwKKyAgICBMWk9fUFBfRUNPTkNBVDMoX2x6bzFiXyxDT01QUkVTU19JRCxfY29tcHJlc3NfZnVuYykKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgbHpvX2NvbXByZXNzX3QgTFpPX0NPTVBSRVNTX0ZVTkMgPSBkb19jb21wcmVzczsKKworTFpPX1BVQkxJQyhpbnQpCitMWk9fQ09NUFJFU1MgKCBjb25zdCBsem9fYnl0ZXAgaW4sICBsem9fdWludCAgaW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIG91dCwgbHpvX3VpbnRwIG91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICkKK3sKKyAgICByZXR1cm4gX2x6bzFiX2RvX2NvbXByZXNzKGluLGluX2xlbixvdXQsb3V0X2xlbix3cmttZW0sZG9fY29tcHJlc3MpOworfQorCisvKgordmk6dHM9NDpldAorKi8KZGlmZiAtLWdpdCBhL2x6by9zcmMvY29tcHIxYy5oIGIvbHpvL3NyYy9jb21wcjFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2YmE0NAotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvY29tcHIxYy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGNvbXByMWMuaCAtLQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKyNkZWZpbmUgTFpPX05FRURfRElDVF9IIDEKKyNpbmNsdWRlICJjb25maWcxYy5oIgorCisKKyNpZiAhZGVmaW5lZChDT01QUkVTU19JRCkKKyNkZWZpbmUgQ09NUFJFU1NfSUQgICAgIExaT19QUF9FQ09OQ0FUMihERF9CSVRTLENMRVZFTCkKKyNlbmRpZgorCisKKyNpbmNsdWRlICJsem8xYl9jLmNoIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMWk9fQ09NUFJFU1MgXAorICAgIExaT19QUF9FQ09OQ0FUMyhsem8xY18sQ09NUFJFU1NfSUQsX2NvbXByZXNzKQorCisjZGVmaW5lIExaT19DT01QUkVTU19GVU5DIFwKKyAgICBMWk9fUFBfRUNPTkNBVDMoX2x6bzFjXyxDT01QUkVTU19JRCxfY29tcHJlc3NfZnVuYykKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgbHpvX2NvbXByZXNzX3QgTFpPX0NPTVBSRVNTX0ZVTkMgPSBkb19jb21wcmVzczsKKworTFpPX1BVQkxJQyhpbnQpCitMWk9fQ09NUFJFU1MgKCBjb25zdCBsem9fYnl0ZXAgaW4sICBsem9fdWludCAgaW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIG91dCwgbHpvX3VpbnRwIG91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICkKK3sKKyAgICByZXR1cm4gX2x6bzFjX2RvX2NvbXByZXNzKGluLGluX2xlbixvdXQsb3V0X2xlbix3cmttZW0sZG9fY29tcHJlc3MpOworfQorCisvKgordmk6dHM9NDpldAorKi8KZGlmZiAtLWdpdCBhL2x6by9zcmMvY29uZmlnMXguaCBiL2x6by9zcmMvY29uZmlnMXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJjMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9jb25maWcxeC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKiBjb25maWcxeC5oIC0tIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBMWk8xWCBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGxpYnJhcnkgYW5kIGlzIHN1YmplY3QKKyAgIHRvIGNoYW5nZS4KKyAqLworCisKKyNpZm5kZWYgX19MWk9fQ09ORklHMVhfSAorI2RlZmluZSBfX0xaT19DT05GSUcxWF9IIDEKKworI2lmICFkZWZpbmVkKExaTzFYKSAmJiAhZGVmaW5lZChMWk8xWSkgJiYgIWRlZmluZWQoTFpPMVopCisjICBkZWZpbmUgTFpPMVggMQorI2VuZGlmCisKKyNpbmNsdWRlICJsem9fY29uZi5oIgorI2lmICFkZWZpbmVkKF9fTFpPX0lOX01JTklMWk8pCisjaW5jbHVkZSAibHpvL2x6bzF4LmgiCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTFpPX0VPRl9DT0RFCisjZGVmaW5lIExaT19FT0ZfQ09ERSAxCisjZW5kaWYKKyN1bmRlZiBMWk9fREVURVJNSU5JU1RJQworCisjZGVmaW5lIE0xX01BWF9PRkZTRVQgICAweDA0MDAKKyNpZm5kZWYgTTJfTUFYX09GRlNFVAorI2RlZmluZSBNMl9NQVhfT0ZGU0VUICAgMHgwODAwCisjZW5kaWYKKyNkZWZpbmUgTTNfTUFYX09GRlNFVCAgIDB4NDAwMAorI2RlZmluZSBNNF9NQVhfT0ZGU0VUICAgMHhiZmZmCisKKyNkZWZpbmUgTVhfTUFYX09GRlNFVCAgIChNMV9NQVhfT0ZGU0VUICsgTTJfTUFYX09GRlNFVCkKKworI2RlZmluZSBNMV9NSU5fTEVOICAgICAgMgorI2RlZmluZSBNMV9NQVhfTEVOICAgICAgMgorI2RlZmluZSBNMl9NSU5fTEVOICAgICAgMworI2lmbmRlZiBNMl9NQVhfTEVOCisjZGVmaW5lIE0yX01BWF9MRU4gICAgICA4CisjZW5kaWYKKyNkZWZpbmUgTTNfTUlOX0xFTiAgICAgIDMKKyNkZWZpbmUgTTNfTUFYX0xFTiAgICAgIDMzCisjZGVmaW5lIE00X01JTl9MRU4gICAgICAzCisjZGVmaW5lIE00X01BWF9MRU4gICAgICA5CisKKyNkZWZpbmUgTTFfTUFSS0VSICAgICAgIDAKKyNkZWZpbmUgTTJfTUFSS0VSICAgICAgIDY0CisjZGVmaW5lIE0zX01BUktFUiAgICAgICAzMgorI2RlZmluZSBNNF9NQVJLRVIgICAgICAgMTYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTUlOX0xPT0tBSEVBRAorI2RlZmluZSBNSU5fTE9PS0FIRUFEICAgICAgIChNMl9NQVhfTEVOICsgMSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChMWk9fTkVFRF9ESUNUX0gpCisKKyNpZm5kZWYgTFpPX0hBU0gKKyNkZWZpbmUgTFpPX0hBU0ggICAgICAgICAgICBMWk9fSEFTSF9MWk9fSU5DUkVNRU5UQUxfQgorI2VuZGlmCisjZGVmaW5lIERMX01JTl9MRU4gICAgICAgICAgTTJfTUlOX0xFTgorI2luY2x1ZGUgImx6b19kaWN0LmgiCisKKyNlbmRpZgorCisKKworI2VuZGlmIC8qIGFscmVhZHkgaW5jbHVkZWQgKi8KKworLyoKK3ZpOnRzPTQ6ZXQKKyovCisKZGlmZiAtLWdpdCBhL2x6by9zcmMvbHpvMV9kLmNoIGIvbHpvL3NyYy9sem8xX2QuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkZmYwNAotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbHpvMV9kLmNoCkBAIC0wLDAgKzEsMTYwIEBACisvKiBsem8xX2QuY2ggLS0gY29tbW9uIGRlY29tcHJlc3Npb24gc3R1ZmYKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisKKyNpZiBkZWZpbmVkKExaT19URVNUX09WRVJSVU4pCisjICBpZiAhZGVmaW5lZChMWk9fVEVTVF9PVkVSUlVOX0lOUFVUKQorIyAgICBkZWZpbmUgTFpPX1RFU1RfT1ZFUlJVTl9JTlBVVCAgICAgICAyCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoTFpPX1RFU1RfT1ZFUlJVTl9PVVRQVVQpCisjICAgIGRlZmluZSBMWk9fVEVTVF9PVkVSUlVOX09VVFBVVCAgICAgIDIKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChMWk9fVEVTVF9PVkVSUlVOX0xPT0tCRUhJTkQpCisjICAgIGRlZmluZSBMWk9fVEVTVF9PVkVSUlVOX0xPT0tCRUhJTkQgIDEKKyMgIGVuZGlmCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIE92ZXJydW4gZGV0ZWN0aW9uIGlzIGludGVybmFsbHkgaGFuZGxlZCBieSB0aGVzZSBtYWNyb3M6CisvLworLy8gICBURVNUX0lQICAgIHRlc3QgaW5wdXQgb3ZlcnJ1biBhdCBsb29wIGJlZ2luCisvLyAgIE5FRURfSVAgICAgdGVzdCBpbnB1dCBvdmVycnVuIGF0IGV2ZXJ5IGlucHV0IGJ5dGUKKy8vCisvLyAgIFRFU1RfT1AgICAgdGVzdCBvdXRwdXQgb3ZlcnJ1biBhdCBsb29wIGJlZ2luCisvLyAgIE5FRURfT1AgICAgdGVzdCBvdXRwdXQgb3ZlcnJ1biBhdCBldmVyeSBvdXRwdXQgYnl0ZQorLy8KKy8vICAgVEVTVF9MQiAgICB0ZXN0IG1hdGNoIHBvc2l0aW9uCisvLworLy8gVGhlIGZhc3Rlc3QgZGVjb21wcmVzc29yIHJlc3VsdHMgd2hlbiB0ZXN0aW5nIGZvciBubyBvdmVycnVucworLy8gYW5kIHVzaW5nIExaT19FT0ZfQ09ERS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIFRFU1RfSVAKKyN1bmRlZiBURVNUX09QCisjdW5kZWYgVEVTVF9JUF9BTkRfVEVTVF9PUAorI3VuZGVmIFRFU1RfTEIKKyN1bmRlZiBURVNUX0xCTworI3VuZGVmIE5FRURfSVAKKyN1bmRlZiBORUVEX09QCisjdW5kZWYgVEVTVF9JVgorI3VuZGVmIFRFU1RfT1YKKyN1bmRlZiBIQVZFX1RFU1RfSVAKKyN1bmRlZiBIQVZFX1RFU1RfT1AKKyN1bmRlZiBIQVZFX05FRURfSVAKKyN1bmRlZiBIQVZFX05FRURfT1AKKyN1bmRlZiBIQVZFX0FOWV9JUAorI3VuZGVmIEhBVkVfQU5ZX09QCisKKworI2lmIGRlZmluZWQoTFpPX1RFU1RfT1ZFUlJVTl9JTlBVVCkKKyMgIGlmIChMWk9fVEVTVF9PVkVSUlVOX0lOUFVUID49IDEpCisjICAgIGRlZmluZSBURVNUX0lQICAgICAgICAgICAgIChpcCA8IGlwX2VuZCkKKyMgIGVuZGlmCisjICBpZiAoTFpPX1RFU1RfT1ZFUlJVTl9JTlBVVCA+PSAyKQorIyAgICBkZWZpbmUgTkVFRF9JUCh4KSBcCisgICAgICAgICAgICBpZiAoKGx6b191aW50KShpcF9lbmQgLSBpcCkgPCAobHpvX3VpbnQpKHgpKSAgZ290byBpbnB1dF9vdmVycnVuCisjICAgIGRlZmluZSBURVNUX0lWKHgpICAgICAgICAgIGlmICgoeCkgPiAgKGx6b191aW50KTAgLSAoNTExKSkgZ290byBpbnB1dF9vdmVycnVuCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExaT19URVNUX09WRVJSVU5fT1VUUFVUKQorIyAgaWYgKExaT19URVNUX09WRVJSVU5fT1VUUFVUID49IDEpCisjICAgIGRlZmluZSBURVNUX09QICAgICAgICAgICAgIChvcCA8PSBvcF9lbmQpCisjICBlbmRpZgorIyAgaWYgKExaT19URVNUX09WRVJSVU5fT1VUUFVUID49IDIpCisjICAgIHVuZGVmIFRFU1RfT1AgICAgICAgICAgICAgIC8qIGRvbid0IG5lZWQgYm90aCBvZiB0aGUgdGVzdHMgaGVyZSAqLworIyAgICBkZWZpbmUgTkVFRF9PUCh4KSBcCisgICAgICAgICAgICBpZiAoKGx6b191aW50KShvcF9lbmQgLSBvcCkgPCAobHpvX3VpbnQpKHgpKSAgZ290byBvdXRwdXRfb3ZlcnJ1bgorIyAgICBkZWZpbmUgVEVTVF9PVih4KSAgICAgICAgICBpZiAoKHgpID4gIChsem9fdWludCkwIC0gKDUxMSkpIGdvdG8gb3V0cHV0X292ZXJydW4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTFpPX1RFU1RfT1ZFUlJVTl9MT09LQkVISU5EKQorIyAgZGVmaW5lIFRFU1RfTEIobV9wb3MpICAgICAgICBpZiAoUFRSX0xUKG1fcG9zLG91dCkgfHwgUFRSX0dFKG1fcG9zLG9wKSkgZ290byBsb29rYmVoaW5kX292ZXJydW4KKyMgIGRlZmluZSBURVNUX0xCTyhtX3BvcyxvKSAgICAgaWYgKFBUUl9MVChtX3BvcyxvdXQpIHx8IFBUUl9HRShtX3BvcyxvcC0obykpKSBnb3RvIGxvb2tiZWhpbmRfb3ZlcnJ1bgorI2Vsc2UKKyMgIGRlZmluZSBURVNUX0xCKG1fcG9zKSAgICAgICAgKCh2b2lkKSAwKQorIyAgZGVmaW5lIFRFU1RfTEJPKG1fcG9zLG8pICAgICAoKHZvaWQpIDApCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoTFpPX0VPRl9DT0RFKSAmJiAhZGVmaW5lZChURVNUX0lQKQorICAgLyogaWYgd2UgaGF2ZSBubyBFT0YgY29kZSwgd2UgaGF2ZSB0byB0ZXN0IGZvciB0aGUgZW5kIG9mIHRoZSBpbnB1dCAqLworIyAgZGVmaW5lIFRFU1RfSVAgICAgICAgICAgICAgICAoaXAgPCBpcF9lbmQpCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChURVNUX0lQKQorIyAgZGVmaW5lIEhBVkVfVEVTVF9JUCAxCisjZWxzZQorIyAgZGVmaW5lIFRFU1RfSVAgICAgICAgICAgICAgICAxCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRFU1RfT1ApCisjICBkZWZpbmUgSEFWRV9URVNUX09QIDEKKyNlbHNlCisjICBkZWZpbmUgVEVTVF9PUCAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1RFU1RfSVApICYmIGRlZmluZWQoSEFWRV9URVNUX09QKQorIyAgZGVmaW5lIFRFU1RfSVBfQU5EX1RFU1RfT1AgICAoVEVTVF9JUCAmJiBURVNUX09QKQorI2VsaWYgZGVmaW5lZChIQVZFX1RFU1RfSVApCisjICBkZWZpbmUgVEVTVF9JUF9BTkRfVEVTVF9PUCAgIFRFU1RfSVAKKyNlbGlmIGRlZmluZWQoSEFWRV9URVNUX09QKQorIyAgZGVmaW5lIFRFU1RfSVBfQU5EX1RFU1RfT1AgICBURVNUX09QCisjZWxzZQorIyAgZGVmaW5lIFRFU1RfSVBfQU5EX1RFU1RfT1AgICAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoTkVFRF9JUCkKKyMgIGRlZmluZSBIQVZFX05FRURfSVAgMQorI2Vsc2UKKyMgIGRlZmluZSBORUVEX0lQKHgpICAgICAgICAgICAgKCh2b2lkKSAwKQorIyAgZGVmaW5lIFRFU1RfSVYoeCkgICAgICAgICAgICAoKHZvaWQpIDApCisjZW5kaWYKKyNpZiBkZWZpbmVkKE5FRURfT1ApCisjICBkZWZpbmUgSEFWRV9ORUVEX09QIDEKKyNlbHNlCisjICBkZWZpbmUgTkVFRF9PUCh4KSAgICAgICAgICAgICgodm9pZCkgMCkKKyMgIGRlZmluZSBURVNUX09WKHgpICAgICAgICAgICAgKCh2b2lkKSAwKQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoSEFWRV9URVNUX0lQKSB8fCBkZWZpbmVkKEhBVkVfTkVFRF9JUCkKKyMgIGRlZmluZSBIQVZFX0FOWV9JUCAxCisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfVEVTVF9PUCkgfHwgZGVmaW5lZChIQVZFX05FRURfT1ApCisjICBkZWZpbmUgSEFWRV9BTllfT1AgMQorI2VuZGlmCisKKworCisvKgordmk6dHM9NDpldAorKi8KKwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem8xeF8xLmMgYi9sem8vc3JjL2x6bzF4XzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmRlY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9sem8xeF8xLmMKQEAgLTAsMCArMSw1NSBAQAorLyogbHpvMXhfMS5jIC0tIExaTzFYLTEgY29tcHJlc3Npb24KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaW5jbHVkZSAibHpvX2NvbmYuaCIKKyNpZiAxICYmIGRlZmluZWQoVUFfR0VUX0xFMzIpCisjdW5kZWYgIExaT19ESUNUX1VTRV9QVFIKKyNkZWZpbmUgTFpPX0RJQ1RfVVNFX1BUUiAwCisjdW5kZWYgIGx6b19kaWN0X3QKKyNkZWZpbmUgbHpvX2RpY3RfdCBsem9fdWludDE2X3QKKyNlbmRpZgorCisjZGVmaW5lIExaT19ORUVEX0RJQ1RfSCAxCisjaWZuZGVmIERfQklUUworI2RlZmluZSBEX0JJVFMgICAgICAgICAgMTQKKyNlbmRpZgorI2RlZmluZSBEX0lOREVYMShkLHApICAgICAgIGQgPSBETShETVVMKDB4MjEsRFgzKHAsNSw1LDYpKSA+PiA1KQorI2RlZmluZSBEX0lOREVYMihkLHApICAgICAgIGQgPSAoZCAmIChEX01BU0sgJiAweDdmZikpIF4gKERfSElHSCB8IDB4MWYpCisjaWYgMQorI2RlZmluZSBESU5ERVgoZHYscCkgICAgICAgIERNKCgoRE1VTCgweDE4MjQ0MjlkLGR2KSkgPj4gKDMyLURfQklUUykpKQorI2Vsc2UKKyNkZWZpbmUgRElOREVYKGR2LHApICAgICAgICBETSgoZHYpICsgKChkdikgPj4gKDMyLURfQklUUykpKQorI2VuZGlmCisjaW5jbHVkZSAiY29uZmlnMXguaCIKKyNkZWZpbmUgTFpPX0RFVEVSTUlOSVNUSUMgIShMWk9fRElDVF9VU0VfUFRSKQorCisjaWZuZGVmIERPX0NPTVBSRVNTCisjZGVmaW5lIERPX0NPTVBSRVNTICAgICBsem8xeF8xX2NvbXByZXNzCisjZW5kaWYKKworI2luY2x1ZGUgImx6bzF4X2MuY2giCmRpZmYgLS1naXQgYS9sem8vc3JjL2x6bzF4XzFrLmMgYi9sem8vc3JjL2x6bzF4XzFrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmYTIzNAotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbHpvMXhfMWsuYwpAQCAtMCwwICsxLDU1IEBACisvKiBsem8xeF8xay5jIC0tIExaTzFYLTEoMTEpIGNvbXByZXNzaW9uIChuZWVkcyBvbmx5IDhrQiB3b3JrIG1lbW9yeSkKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaW5jbHVkZSAibHpvX2NvbmYuaCIKKyNpZiAxICYmIGRlZmluZWQoVUFfR0VUX0xFMzIpCisjdW5kZWYgIExaT19ESUNUX1VTRV9QVFIKKyNkZWZpbmUgTFpPX0RJQ1RfVVNFX1BUUiAwCisjdW5kZWYgIGx6b19kaWN0X3QKKyNkZWZpbmUgbHpvX2RpY3RfdCBsem9fdWludDE2X3QKKyNlbmRpZgorCisjZGVmaW5lIExaT19ORUVEX0RJQ1RfSCAxCisjaWZuZGVmIERfQklUUworI2RlZmluZSBEX0JJVFMgICAgICAgICAgMTEKKyNlbmRpZgorI2RlZmluZSBEX0lOREVYMShkLHApICAgICAgIGQgPSBETShETVVMKDB4MjEsRFgyKHAsMyw1KSkgPj4gNSkKKyNkZWZpbmUgRF9JTkRFWDIoZCxwKSAgICAgICBkID0gZCBeIERfTUFTSworI2lmIDEKKyNkZWZpbmUgRElOREVYKGR2LHApICAgICAgICBETSgoKERNVUwoMHgxODI0NDI5ZCxkdikpID4+ICgzMi1EX0JJVFMpKSkKKyNlbHNlCisjZGVmaW5lIERJTkRFWChkdixwKSAgICAgICAgRE0oKGR2KSArICgoZHYpID4+ICgzMi1EX0JJVFMpKSkKKyNlbmRpZgorI2luY2x1ZGUgImNvbmZpZzF4LmgiCisjZGVmaW5lIExaT19ERVRFUk1JTklTVElDICEoTFpPX0RJQ1RfVVNFX1BUUikKKworI2lmbmRlZiBET19DT01QUkVTUworI2RlZmluZSBET19DT01QUkVTUyAgICAgbHpvMXhfMV8xMV9jb21wcmVzcworI2VuZGlmCisKKyNpbmNsdWRlICJsem8xeF9jLmNoIgpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem8xeF8xbC5jIGIvbHpvL3NyYy9sem8xeF8xbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlODU3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vc3JjL2x6bzF4XzFsLmMKQEAgLTAsMCArMSw1NSBAQAorLyogbHpvMXhfMWwuYyAtLSBMWk8xWC0xKDEyKSBjb21wcmVzc2lvbgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKyNpbmNsdWRlICJsem9fY29uZi5oIgorI2lmIDEgJiYgZGVmaW5lZChVQV9HRVRfTEUzMikKKyN1bmRlZiAgTFpPX0RJQ1RfVVNFX1BUUgorI2RlZmluZSBMWk9fRElDVF9VU0VfUFRSIDAKKyN1bmRlZiAgbHpvX2RpY3RfdAorI2RlZmluZSBsem9fZGljdF90IGx6b191aW50MTZfdAorI2VuZGlmCisKKyNkZWZpbmUgTFpPX05FRURfRElDVF9IIDEKKyNpZm5kZWYgRF9CSVRTCisjZGVmaW5lIERfQklUUyAgICAgICAgICAxMgorI2VuZGlmCisjZGVmaW5lIERfSU5ERVgxKGQscCkgICAgICAgZCA9IERNKERNVUwoMHgyMSxEWDIocCw0LDUpKSA+PiA1KQorI2RlZmluZSBEX0lOREVYMihkLHApICAgICAgIGQgPSBkIF4gRF9NQVNLCisjaWYgMQorI2RlZmluZSBESU5ERVgoZHYscCkgICAgICAgIERNKCgoRE1VTCgweDE4MjQ0MjlkLGR2KSkgPj4gKDMyLURfQklUUykpKQorI2Vsc2UKKyNkZWZpbmUgRElOREVYKGR2LHApICAgICAgICBETSgoZHYpICsgKChkdikgPj4gKDMyLURfQklUUykpKQorI2VuZGlmCisjaW5jbHVkZSAiY29uZmlnMXguaCIKKyNkZWZpbmUgTFpPX0RFVEVSTUlOSVNUSUMgIShMWk9fRElDVF9VU0VfUFRSKQorCisjaWZuZGVmIERPX0NPTVBSRVNTCisjZGVmaW5lIERPX0NPTVBSRVNTICAgICBsem8xeF8xXzEyX2NvbXByZXNzCisjZW5kaWYKKworI2luY2x1ZGUgImx6bzF4X2MuY2giCmRpZmYgLS1naXQgYS9sem8vc3JjL2x6bzF4XzFvLmMgYi9sem8vc3JjL2x6bzF4XzFvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmZGFmZgotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbHpvMXhfMW8uYwpAQCAtMCwwICsxLDU2IEBACisvKiBsem8xeF8xby5jIC0tIExaTzFYLTEoMTUpIGNvbXByZXNzaW9uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2luY2x1ZGUgImx6b19jb25mLmgiCisjaWYgMSAmJiBkZWZpbmVkKFVBX0dFVF9MRTMyKQorI3VuZGVmICBMWk9fRElDVF9VU0VfUFRSCisjZGVmaW5lIExaT19ESUNUX1VTRV9QVFIgMAorI3VuZGVmICBsem9fZGljdF90CisjZGVmaW5lIGx6b19kaWN0X3QgbHpvX3VpbnQxNl90CisjZGVmaW5lIERfQklUUyAxMworI2VuZGlmCisKKyNkZWZpbmUgTFpPX05FRURfRElDVF9IIDEKKyNpZm5kZWYgRF9CSVRTCisjZGVmaW5lIERfQklUUyAgICAgICAgICAxNQorI2VuZGlmCisjZGVmaW5lIERfSU5ERVgxKGQscCkgICAgICAgZCA9IERNKERNVUwoMHgyMSxEWDMocCw1LDUsNikpID4+IDUpCisjZGVmaW5lIERfSU5ERVgyKGQscCkgICAgICAgZCA9IChkICYgKERfTUFTSyAmIDB4N2ZmKSkgXiAoRF9ISUdIIHwgMHgxZikKKyNpZiAxCisjZGVmaW5lIERJTkRFWChkdixwKSAgICAgICAgRE0oKChETVVMKDB4MTgyNDQyOWQsZHYpKSA+PiAoMzItRF9CSVRTKSkpCisjZWxzZQorI2RlZmluZSBESU5ERVgoZHYscCkgICAgICAgIERNKChkdikgKyAoKGR2KSA+PiAoMzItRF9CSVRTKSkpCisjZW5kaWYKKyNpbmNsdWRlICJjb25maWcxeC5oIgorI2RlZmluZSBMWk9fREVURVJNSU5JU1RJQyAhKExaT19ESUNUX1VTRV9QVFIpCisKKyNpZm5kZWYgRE9fQ09NUFJFU1MKKyNkZWZpbmUgRE9fQ09NUFJFU1MgICAgIGx6bzF4XzFfMTVfY29tcHJlc3MKKyNlbmRpZgorCisjaW5jbHVkZSAibHpvMXhfYy5jaCIKZGlmZiAtLWdpdCBhL2x6by9zcmMvbHpvMXhfOXguYyBiL2x6by9zcmMvbHpvMXhfOXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU3NWRmCi0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9sem8xeF85eC5jCkBAIC0wLDAgKzEsODcwIEBACisvKiBsem8xeF85eC5jIC0tIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMWk8xWC05OTkgY29tcHJlc3Npb24gYWxnb3JpdGhtCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2lmICFkZWZpbmVkKExaTzFYKSAmJiAhZGVmaW5lZChMWk8xWSkgJiYgIWRlZmluZWQoTFpPMVopCisjICBkZWZpbmUgTFpPMVggMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExaTzFYKQorIyAgaW5jbHVkZSAiY29uZmlnMXguaCIKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisjICBpbmNsdWRlICJjb25maWcxeS5oIgorI2VsaWYgZGVmaW5lZChMWk8xWikKKyMgIGluY2x1ZGUgImNvbmZpZzF6LmgiCisjZWxzZQorIyAgZXJyb3IKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTV0RfTiAgICAgICAgICAgTTRfTUFYX09GRlNFVCAgIC8qIHNpemUgb2YgcmluZyBidWZmZXIgKi8KKyNkZWZpbmUgU1dEX1RIUkVTSE9MRCAgICAgICAxICAgICAgICAgICAvKiBsb3dlciBsaW1pdCBmb3IgbWF0Y2ggbGVuZ3RoICovCisjZGVmaW5lIFNXRF9GICAgICAgICAgICAgMjA0OCAgICAgICAgICAgLyogdXBwZXIgbGltaXQgZm9yIG1hdGNoIGxlbmd0aCAqLworCisjZGVmaW5lIFNXRF9CRVNUX09GRiAgICAoTFpPX01BWDMoIE0yX01BWF9MRU4sIE0zX01BWF9MRU4sIE00X01BWF9MRU4gKSArIDEpCisKKyNpZiBkZWZpbmVkKExaTzFYKQorIyAgZGVmaW5lIExaT19DT01QUkVTU19UICAgICAgICAgICAgICAgIGx6bzF4Xzk5OV90CisjICBkZWZpbmUgbHpvX3N3ZF90ICAgICAgICAgICAgICAgICAgICAgbHpvMXhfOTk5X3N3ZF90CisjZWxpZiBkZWZpbmVkKExaTzFZKQorIyAgZGVmaW5lIExaT19DT01QUkVTU19UICAgICAgICAgICAgICAgIGx6bzF5Xzk5OV90CisjICBkZWZpbmUgbHpvX3N3ZF90ICAgICAgICAgICAgICAgICAgICAgbHpvMXlfOTk5X3N3ZF90CisjICBkZWZpbmUgbHpvMXhfOTk5X2NvbXByZXNzX2ludGVybmFsICAgbHpvMXlfOTk5X2NvbXByZXNzX2ludGVybmFsCisjICBkZWZpbmUgbHpvMXhfOTk5X2NvbXByZXNzX2RpY3QgICAgICAgbHpvMXlfOTk5X2NvbXByZXNzX2RpY3QKKyMgIGRlZmluZSBsem8xeF85OTlfY29tcHJlc3NfbGV2ZWwgICAgICBsem8xeV85OTlfY29tcHJlc3NfbGV2ZWwKKyMgIGRlZmluZSBsem8xeF85OTlfY29tcHJlc3MgICAgICAgICAgICBsem8xeV85OTlfY29tcHJlc3MKKyNlbGlmIGRlZmluZWQoTFpPMVopCisjICBkZWZpbmUgTFpPX0NPTVBSRVNTX1QgICAgICAgICAgICAgICAgbHpvMXpfOTk5X3QKKyMgIGRlZmluZSBsem9fc3dkX3QgICAgICAgICAgICAgICAgICAgICBsem8xel85OTlfc3dkX3QKKyMgIGRlZmluZSBsem8xeF85OTlfY29tcHJlc3NfaW50ZXJuYWwgICBsem8xel85OTlfY29tcHJlc3NfaW50ZXJuYWwKKyMgIGRlZmluZSBsem8xeF85OTlfY29tcHJlc3NfZGljdCAgICAgICBsem8xel85OTlfY29tcHJlc3NfZGljdAorIyAgZGVmaW5lIGx6bzF4Xzk5OV9jb21wcmVzc19sZXZlbCAgICAgIGx6bzF6Xzk5OV9jb21wcmVzc19sZXZlbAorIyAgZGVmaW5lIGx6bzF4Xzk5OV9jb21wcmVzcyAgICAgICAgICAgIGx6bzF6Xzk5OV9jb21wcmVzcworI2Vsc2UKKyMgIGVycm9yCisjZW5kaWYKKworI2lmIDAKKyMgIGRlZmluZSBIRUFEMyhiLHApIFwKKyAgICAoKCgoKChsem9feGludCliW3BdPDwzKV5iW3ArMV0pPDwzKV5iW3ArMl0pICYgKFNXRF9IU0laRS0xKSkKKyNlbmRpZgorI2lmIDAgJiYgKExaT19PUFRfVU5BTElHTkVEMzIpICYmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisjICBkZWZpbmUgSEVBRDMoYixwKSBcCisgICAgKCgoKiAobHpvX3VpbnQzMl90cCkgJmJbcF0pIF4gKCgqIChsem9fdWludDMyX3RwKSAmYltwXSk+PjEwKSkgJiAoU1dEX0hTSVpFLTEpKQorI2VuZGlmCisKKyNpbmNsdWRlICJsem9fbWNody5jaCIKKworCisvKiB0aGlzIGlzIGEgcHVibGljIGZ1bmN0aW9ucywgYnV0IHRoZXJlIGlzIG5vIHByb3RvdHlwZSBpbiBhIGhlYWRlciBmaWxlICovCitMWk9fRVhURVJOKGludCkKK2x6bzF4Xzk5OV9jb21wcmVzc19pbnRlcm5hbCAoIGNvbnN0IGx6b19ieXRlcCBpbiAsIGx6b191aW50ICBpbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgb3V0LCBsem9fdWludHAgb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fY2FsbGJhY2tfcCBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cnlfbGF6eV9wYXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3VpbnQgZ29vZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdWludCBtYXhfbGF6eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b191aW50IG5pY2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3VpbnQgbWF4X2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3VpbnQzMl90IGZsYWdzICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgbHpvX2J5dGVwCitjb2RlX21hdGNoICggTFpPX0NPTVBSRVNTX1QgKmMsIGx6b19ieXRlcCBvcCwgbHpvX3VpbnQgbV9sZW4sIGx6b191aW50IG1fb2ZmICkKK3sKKyAgICBsem9fdWludCB4X2xlbiA9IG1fbGVuOworICAgIGx6b191aW50IHhfb2ZmID0gbV9vZmY7CisKKyAgICBjLT5tYXRjaF9ieXRlcyArPSAodW5zaWduZWQgbG9uZykgbV9sZW47CisKKyNpZiAwCisvKgorICAgIHN0YXRpYyBsem9fdWludCBsYXN0X21fbGVuID0gMCwgbGFzdF9tX29mZiA9IDA7CisgICAgc3RhdGljIGx6b191aW50IHByZXZfbV9vZmZbNF07CisgICAgc3RhdGljIHVuc2lnbmVkIHByZXZfbV9vZmZfcHRyID0gMDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgLy9pZiAobV9sZW4gPj0gMyAmJiBtX2xlbiA8PSBNMl9NQVhfTEVOICYmIG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCisgICAgaWYgKG1fbGVuID49IDMgJiYgbV9sZW4gPD0gTTJfTUFYX0xFTikKKyAgICB7CisgICAgLy9pZiAobV9sZW4gPT0gbGFzdF9tX2xlbiAmJiBtX29mZiA9PSBsYXN0X21fb2ZmKQorICAgICAgICAvL3ByaW50ZigibGFzdF9tX2xlbiArIGxhc3RfbV9vZmZcbiIpOworICAgIC8vZWxzZQorICAgIGlmIChtX29mZiA9PSBsYXN0X21fb2ZmKQorICAgICAgICBwcmludGYoImxhc3RfbV9vZmZcbiIpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBpZiAobV9vZmYgPT0gcHJldl9tX29mZltpXSkKKyAgICAgICAgICAgICAgICBwcmludGYoInByZXZfbV9vZmYgJXU6ICU1bGRcbiIsaSwobG9uZyltX29mZik7CisgICAgfQorICAgIH0KKyAgICBsYXN0X21fbGVuID0gbV9sZW47CisgICAgbGFzdF9tX29mZiA9IHByZXZfbV9vZmZbcHJldl9tX29mZl9wdHJdID0gbV9vZmY7CisgICAgcHJldl9tX29mZl9wdHIgPSAocHJldl9tX29mZl9wdHIgKyAxKSAmIDM7CisqLworI2VuZGlmCisKKyAgICBhc3NlcnQob3AgPiBjLT5vdXQpOworICAgIGlmIChtX2xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KG1fb2ZmIDw9IE0xX01BWF9PRkZTRVQpOworICAgICAgICBhc3NlcnQoYy0+cjFfbGl0ID4gMCk7IGFzc2VydChjLT5yMV9saXQgPCA0KTsKKyAgICAgICAgbV9vZmYgLT0gMTsKKyNpZiBkZWZpbmVkKExaTzFaKQorICAgICAgICAqb3ArKyA9IExaT19CWVRFKE0xX01BUktFUiB8IChtX29mZiA+PiA2KSk7CisgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9vZmYgPDwgMik7CisjZWxzZQorICAgICAgICAqb3ArKyA9IExaT19CWVRFKE0xX01BUktFUiB8ICgobV9vZmYgJiAzKSA8PCAyKSk7CisgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9vZmYgPj4gMik7CisjZW5kaWYKKyAgICAgICAgYy0+bTFhX20rKzsKKyAgICB9CisjaWYgZGVmaW5lZChMWk8xWikKKyAgICBlbHNlIGlmIChtX2xlbiA8PSBNMl9NQVhfTEVOICYmIChtX29mZiA8PSBNMl9NQVhfT0ZGU0VUIHx8IG1fb2ZmID09IGMtPmxhc3RfbV9vZmYpKQorI2Vsc2UKKyAgICBlbHNlIGlmIChtX2xlbiA8PSBNMl9NQVhfTEVOICYmIG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCisjZW5kaWYKKyAgICB7CisgICAgICAgIGFzc2VydChtX2xlbiA+PSAzKTsKKyNpZiBkZWZpbmVkKExaTzFYKQorICAgICAgICBtX29mZiAtPSAxOworICAgICAgICAqb3ArKyA9IExaT19CWVRFKCgobV9sZW4gLSAxKSA8PCA1KSB8ICgobV9vZmYgJiA3KSA8PCAyKSk7CisgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9vZmYgPj4gMyk7CisgICAgICAgIGFzc2VydChvcFstMl0gPj0gTTJfTUFSS0VSKTsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisgICAgICAgIG1fb2ZmIC09IDE7CisgICAgICAgICpvcCsrID0gTFpPX0JZVEUoKChtX2xlbiArIDEpIDw8IDQpIHwgKChtX29mZiAmIDMpIDw8IDIpKTsKKyAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiAyKTsKKyAgICAgICAgYXNzZXJ0KG9wWy0yXSA+PSBNMl9NQVJLRVIpOworI2VsaWYgZGVmaW5lZChMWk8xWikKKyAgICAgICAgaWYgKG1fb2ZmID09IGMtPmxhc3RfbV9vZmYpCisgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKCgobV9sZW4gLSAxKSA8PCA1KSB8ICgweDcwMCA+PiA2KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbV9vZmYgLT0gMTsKKyAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoKChtX2xlbiAtIDEpIDw8IDUpIHwgKG1fb2ZmID4+IDYpKTsKKyAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9vZmYgPDwgMik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBjLT5tMl9tKys7CisgICAgfQorICAgIGVsc2UgaWYgKG1fbGVuID09IE0yX01JTl9MRU4gJiYgbV9vZmYgPD0gTVhfTUFYX09GRlNFVCAmJiBjLT5yMV9saXQgPj0gNCkKKyAgICB7CisgICAgICAgIGFzc2VydChtX2xlbiA9PSAzKTsKKyAgICAgICAgYXNzZXJ0KG1fb2ZmID4gTTJfTUFYX09GRlNFVCk7CisgICAgICAgIG1fb2ZmIC09IDEgKyBNMl9NQVhfT0ZGU0VUOworI2lmIGRlZmluZWQoTFpPMVopCisgICAgICAgICpvcCsrID0gTFpPX0JZVEUoTTFfTUFSS0VSIHwgKG1fb2ZmID4+IDYpKTsKKyAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA8PCAyKTsKKyNlbHNlCisgICAgICAgICpvcCsrID0gTFpPX0JZVEUoTTFfTUFSS0VSIHwgKChtX29mZiAmIDMpIDw8IDIpKTsKKyAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiAyKTsKKyNlbmRpZgorICAgICAgICBjLT5tMWJfbSsrOworICAgIH0KKyAgICBlbHNlIGlmIChtX29mZiA8PSBNM19NQVhfT0ZGU0VUKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KG1fbGVuID49IDMpOworICAgICAgICBtX29mZiAtPSAxOworICAgICAgICBpZiAobV9sZW4gPD0gTTNfTUFYX0xFTikKKyAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoTTNfTUFSS0VSIHwgKG1fbGVuIC0gMikpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fbGVuIC09IE0zX01BWF9MRU47CisgICAgICAgICAgICAqb3ArKyA9IE0zX01BUktFUiB8IDA7CisgICAgICAgICAgICB3aGlsZSAobV9sZW4gPiAyNTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9sZW4gLT0gMjU1OworICAgICAgICAgICAgICAgICpvcCsrID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChtX2xlbiA+IDApOworICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX2xlbik7CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKExaTzFaKQorICAgICAgICAqb3ArKyA9IExaT19CWVRFKG1fb2ZmID4+IDYpOworICAgICAgICAqb3ArKyA9IExaT19CWVRFKG1fb2ZmIDw8IDIpOworI2Vsc2UKKyAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA8PCAyKTsKKyAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiA2KTsKKyNlbmRpZgorICAgICAgICBjLT5tM19tKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGx6b191aW50IGs7CisKKyAgICAgICAgYXNzZXJ0KG1fbGVuID49IDMpOworICAgICAgICBhc3NlcnQobV9vZmYgPiAweDQwMDApOyBhc3NlcnQobV9vZmYgPD0gMHhiZmZmKTsKKyAgICAgICAgbV9vZmYgLT0gMHg0MDAwOworICAgICAgICBrID0gKG1fb2ZmICYgMHg0MDAwKSA+PiAxMTsKKyAgICAgICAgaWYgKG1fbGVuIDw9IE00X01BWF9MRU4pCisgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKE00X01BUktFUiB8IGsgfCAobV9sZW4gLSAyKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbV9sZW4gLT0gTTRfTUFYX0xFTjsKKyAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoTTRfTUFSS0VSIHwgayB8IDApOworICAgICAgICAgICAgd2hpbGUgKG1fbGVuID4gMjU1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fbGVuIC09IDI1NTsKKyAgICAgICAgICAgICAgICAqb3ArKyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQobV9sZW4gPiAwKTsKKyAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9sZW4pOworICAgICAgICB9CisjaWYgZGVmaW5lZChMWk8xWikKKyAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiA2KTsKKyAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA8PCAyKTsKKyNlbHNlCisgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9vZmYgPDwgMik7CisgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9vZmYgPj4gNik7CisjZW5kaWYKKyAgICAgICAgYy0+bTRfbSsrOworICAgIH0KKworICAgIGMtPmxhc3RfbV9sZW4gPSB4X2xlbjsKKyAgICBjLT5sYXN0X21fb2ZmID0geF9vZmY7CisgICAgcmV0dXJuIG9wOworfQorCisKK3N0YXRpYyBsem9fYnl0ZXAKK1NUT1JFX1JVTiAoIExaT19DT01QUkVTU19UICpjLCBsem9fYnl0ZXAgb3AsIGNvbnN0IGx6b19ieXRlcCBpaSwgbHpvX3VpbnQgdCApCit7CisgICAgYy0+bGl0X2J5dGVzICs9ICh1bnNpZ25lZCBsb25nKSB0OworCisgICAgaWYgKG9wID09IGMtPm91dCAmJiB0IDw9IDIzOCkKKyAgICB7CisgICAgICAgICpvcCsrID0gTFpPX0JZVEUoMTcgKyB0KTsKKyAgICB9CisgICAgZWxzZSBpZiAodCA8PSAzKQorICAgIHsKKyNpZiBkZWZpbmVkKExaTzFaKQorICAgICAgICBvcFstMV0gPSBMWk9fQllURShvcFstMV0gfCB0KTsKKyNlbHNlCisgICAgICAgIG9wWy0yXSA9IExaT19CWVRFKG9wWy0yXSB8IHQpOworI2VuZGlmCisgICAgICAgIGMtPmxpdDFfcisrOworICAgIH0KKyAgICBlbHNlIGlmICh0IDw9IDE4KQorICAgIHsKKyAgICAgICAgKm9wKysgPSBMWk9fQllURSh0IC0gMyk7CisgICAgICAgIGMtPmxpdDJfcisrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsem9fdWludCB0dCA9IHQgLSAxODsKKworICAgICAgICAqb3ArKyA9IDA7CisgICAgICAgIHdoaWxlICh0dCA+IDI1NSkKKyAgICAgICAgeworICAgICAgICAgICAgdHQgLT0gMjU1OworICAgICAgICAgICAgKm9wKysgPSAwOworICAgICAgICB9CisgICAgICAgIGFzc2VydCh0dCA+IDApOworICAgICAgICAqb3ArKyA9IExaT19CWVRFKHR0KTsKKyAgICAgICAgYy0+bGl0M19yKys7CisgICAgfQorICAgIGRvICpvcCsrID0gKmlpKys7IHdoaWxlICgtLXQgPiAwKTsKKworICAgIHJldHVybiBvcDsKK30KKworCitzdGF0aWMgbHpvX2J5dGVwCitjb2RlX3J1biAoIExaT19DT01QUkVTU19UICpjLCBsem9fYnl0ZXAgb3AsIGNvbnN0IGx6b19ieXRlcCBpaSwKKyAgICAgICAgICAgbHpvX3VpbnQgbGl0LCBsem9fdWludCBtX2xlbiApCit7CisgICAgaWYgKGxpdCA+IDApCisgICAgeworICAgICAgICBhc3NlcnQobV9sZW4gPj0gMik7CisgICAgICAgIG9wID0gU1RPUkVfUlVOKGMsb3AsaWksbGl0KTsKKyAgICAgICAgYy0+cjFfbV9sZW4gPSBtX2xlbjsKKyAgICAgICAgYy0+cjFfbGl0ID0gbGl0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhc3NlcnQobV9sZW4gPj0gMyk7CisgICAgICAgIGMtPnIxX21fbGVuID0gMDsKKyAgICAgICAgYy0+cjFfbGl0ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gb3A7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgbHpvX3VpbnQKK2xlbl9vZl9jb2RlZF9tYXRjaCAoIGx6b191aW50IG1fbGVuLCBsem9fdWludCBtX29mZiwgbHpvX3VpbnQgbGl0ICkKK3sKKyAgICBsem9fdWludCBuID0gNDsKKworICAgIGlmIChtX2xlbiA8IDIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChtX2xlbiA9PSAyKQorICAgICAgICByZXR1cm4gKG1fb2ZmIDw9IE0xX01BWF9PRkZTRVQgJiYgbGl0ID4gMCAmJiBsaXQgPCA0KSA/IDIgOiAwOworICAgIGlmIChtX2xlbiA8PSBNMl9NQVhfTEVOICYmIG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChtX2xlbiA9PSBNMl9NSU5fTEVOICYmIG1fb2ZmIDw9IE1YX01BWF9PRkZTRVQgJiYgbGl0ID49IDQpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChtX29mZiA8PSBNM19NQVhfT0ZGU0VUKQorICAgIHsKKyAgICAgICAgaWYgKG1fbGVuIDw9IE0zX01BWF9MRU4pCisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgbV9sZW4gLT0gTTNfTUFYX0xFTjsKKyAgICAgICAgd2hpbGUgKG1fbGVuID4gMjU1KQorICAgICAgICB7CisgICAgICAgICAgICBtX2xlbiAtPSAyNTU7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorICAgIGlmIChtX29mZiA8PSBNNF9NQVhfT0ZGU0VUKQorICAgIHsKKyAgICAgICAgaWYgKG1fbGVuIDw9IE00X01BWF9MRU4pCisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgbV9sZW4gLT0gTTRfTUFYX0xFTjsKKyAgICAgICAgd2hpbGUgKG1fbGVuID4gMjU1KQorICAgICAgICB7CisgICAgICAgICAgICBtX2xlbiAtPSAyNTU7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBsem9fdWludAorbWluX2dhaW4obHpvX3VpbnQgYWhlYWQsIGx6b191aW50IGxpdDEsIGx6b191aW50IGxpdDIsIGx6b191aW50IGwxLCBsem9fdWludCBsMiwgbHpvX3VpbnQgbDMpCit7CisgICAgbHpvX3VpbnQgbGF6eV9tYXRjaF9taW5fZ2FpbjsKKworICAgIGFzc2VydCAoYWhlYWQgPj0gMSk7CisgICAgbGF6eV9tYXRjaF9taW5fZ2FpbiA9IGFoZWFkOworCisjaWYgMAorICAgIGlmIChsMykKKyAgICAgICAgbGl0MiAtPSBhaGVhZDsKKyNlbmRpZgorCisgICAgaWYgKGxpdDEgPD0gMykKKyAgICAgICAgbGF6eV9tYXRjaF9taW5fZ2FpbiArPSAobGl0MiA8PSAzKSA/IDAgOiAyOworICAgIGVsc2UgaWYgKGxpdDEgPD0gMTgpCisgICAgICAgIGxhenlfbWF0Y2hfbWluX2dhaW4gKz0gKGxpdDIgPD0gMTgpID8gMCA6IDE7CisKKyAgICBsYXp5X21hdGNoX21pbl9nYWluICs9IChsMiAtIGwxKSAqIDI7CisgICAgaWYgKGwzKQorICAgICAgICBsYXp5X21hdGNoX21pbl9nYWluIC09IChhaGVhZCAtIGwzKSAqIDI7CisKKyAgICBpZiAoKGx6b19pbnQpIGxhenlfbWF0Y2hfbWluX2dhaW4gPCAwKQorICAgICAgICBsYXp5X21hdGNoX21pbl9nYWluID0gMDsKKworI2lmIDAKKyAgICBpZiAobDEgPT0gMikKKyAgICAgICAgaWYgKGxhenlfbWF0Y2hfbWluX2dhaW4gPT0gMCkKKyAgICAgICAgICAgIGxhenlfbWF0Y2hfbWluX2dhaW4gPSAxOworI2VuZGlmCisKKyAgICByZXR1cm4gbGF6eV9tYXRjaF9taW5fZ2FpbjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChOREVCVUcpCitzdGF0aWMKK3ZvaWQgYXNzZXJ0X21hdGNoKCBjb25zdCBsem9fc3dkX3Agc3dkLCBsem9fdWludCBtX2xlbiwgbHpvX3VpbnQgbV9vZmYgKQoreworICAgIGNvbnN0IExaT19DT01QUkVTU19UICpjID0gc3dkLT5jOworICAgIGx6b191aW50IGRfb2ZmOworCisgICAgYXNzZXJ0KG1fbGVuID49IDIpOworICAgIGlmIChtX29mZiA8PSAobHpvX3VpbnQpIChjLT5icCAtIGMtPmluKSkKKyAgICB7CisgICAgICAgIGFzc2VydChjLT5icCAtIG1fb2ZmICsgbV9sZW4gPCBjLT5pcCk7CisgICAgICAgIGFzc2VydChsem9fbWVtY21wKGMtPmJwLCBjLT5icCAtIG1fb2ZmLCBtX2xlbikgPT0gMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFzc2VydChzd2QtPmRpY3QgIT0gTlVMTCk7CisgICAgICAgIGRfb2ZmID0gbV9vZmYgLSAobHpvX3VpbnQpIChjLT5icCAtIGMtPmluKTsKKyAgICAgICAgYXNzZXJ0KGRfb2ZmIDw9IHN3ZC0+ZGljdF9sZW4pOworICAgICAgICBpZiAobV9sZW4gPiBkX29mZikKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KGx6b19tZW1jbXAoYy0+YnAsIHN3ZC0+ZGljdF9lbmQgLSBkX29mZiwgZF9vZmYpID09IDApOworICAgICAgICAgICAgYXNzZXJ0KGMtPmluICsgbV9sZW4gLSBkX29mZiA8IGMtPmlwKTsKKyAgICAgICAgICAgIGFzc2VydChsem9fbWVtY21wKGMtPmJwICsgZF9vZmYsIGMtPmluLCBtX2xlbiAtIGRfb2ZmKSA9PSAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChsem9fbWVtY21wKGMtPmJwLCBzd2QtPmRpY3RfZW5kIC0gZF9vZmYsIG1fbGVuKSA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCisjICBkZWZpbmUgYXNzZXJ0X21hdGNoKGEsYixjKSAgICgodm9pZCkwKQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCitzdGF0aWMgdm9pZAorYmV0dGVyX21hdGNoICggY29uc3QgbHpvX3N3ZF9wIHN3ZCwgbHpvX3VpbnQgKm1fbGVuLCBsem9fdWludCAqbV9vZmYgKQoreworI2lmIGRlZmluZWQoTFpPMVopCisgICAgY29uc3QgTFpPX0NPTVBSRVNTX1QgKmMgPSBzd2QtPmM7CisjZW5kaWYKKworICAgIGlmICgqbV9sZW4gPD0gTTJfTUlOX0xFTikKKyAgICAgICAgcmV0dXJuOworI2lmIGRlZmluZWQoTFpPMVopCisgICAgaWYgKCptX29mZiA9PSBjLT5sYXN0X21fb2ZmICYmICptX2xlbiA8PSBNMl9NQVhfTEVOKQorICAgICAgICByZXR1cm47CisjaWYgMQorICAgIGlmICgqbV9sZW4gPj0gTTJfTUlOX0xFTiArIDEgJiYgKm1fbGVuIDw9IE0yX01BWF9MRU4gKyAxICYmCisgICAgICAgIGMtPmxhc3RfbV9vZmYgJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMV0gPT0gYy0+bGFzdF9tX29mZikKKyAgICB7CisgICAgICAgICptX2xlbiA9ICptX2xlbiAtIDE7CisgICAgICAgICptX29mZiA9IHN3ZC0+YmVzdF9vZmZbKm1fbGVuXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgICBpZiAoKm1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCisgICAgICAgIHJldHVybjsKKworI2lmIDEKKyAgICAvKiBNMy9NNCAtPiBNMiAqLworICAgIGlmICgqbV9vZmYgPiBNMl9NQVhfT0ZGU0VUICYmCisgICAgICAgICptX2xlbiA+PSBNMl9NSU5fTEVOICsgMSAmJiAqbV9sZW4gPD0gTTJfTUFYX0xFTiArIDEgJiYKKyAgICAgICAgc3dkLT5iZXN0X29mZlsqbV9sZW4tMV0gJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMV0gPD0gTTJfTUFYX09GRlNFVCkKKyAgICB7CisgICAgICAgICptX2xlbiA9ICptX2xlbiAtIDE7CisgICAgICAgICptX29mZiA9IHN3ZC0+YmVzdF9vZmZbKm1fbGVuXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjaWYgMQorICAgIC8qIE00IC0+IE0yICovCisgICAgaWYgKCptX29mZiA+IE0zX01BWF9PRkZTRVQgJiYKKyAgICAgICAgKm1fbGVuID49IE00X01BWF9MRU4gKyAxICYmICptX2xlbiA8PSBNMl9NQVhfTEVOICsgMiAmJgorICAgICAgICBzd2QtPmJlc3Rfb2ZmWyptX2xlbi0yXSAmJiBzd2QtPmJlc3Rfb2ZmWyptX2xlbi0yXSA8PSBNMl9NQVhfT0ZGU0VUKQorICAgIHsKKyAgICAgICAgKm1fbGVuID0gKm1fbGVuIC0gMjsKKyAgICAgICAgKm1fb2ZmID0gc3dkLT5iZXN0X29mZlsqbV9sZW5dOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyNpZiAxCisgICAgLyogTTQgLT4gTTMgKi8KKyAgICBpZiAoKm1fb2ZmID4gTTNfTUFYX09GRlNFVCAmJgorICAgICAgICAqbV9sZW4gPj0gTTRfTUFYX0xFTiArIDEgJiYgKm1fbGVuIDw9IE0zX01BWF9MRU4gKyAxICYmCisgICAgICAgIHN3ZC0+YmVzdF9vZmZbKm1fbGVuLTFdICYmIHN3ZC0+YmVzdF9vZmZbKm1fbGVuLTFdIDw9IE0zX01BWF9PRkZTRVQpCisgICAgeworICAgICAgICAqbV9sZW4gPSAqbV9sZW4gLSAxOworICAgICAgICAqbV9vZmYgPSBzd2QtPmJlc3Rfb2ZmWyptX2xlbl07CisgICAgfQorI2VuZGlmCit9CisKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFpPX1BVQkxJQyhpbnQpCitsem8xeF85OTlfY29tcHJlc3NfaW50ZXJuYWwgKCBjb25zdCBsem9fYnl0ZXAgaW4gLCBsem9fdWludCAgaW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIG91dCwgbHpvX3VpbnRwIG91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbHpvX2J5dGVwIGRpY3QsIGx6b191aW50IGRpY3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2NhbGxiYWNrX3AgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJ5X2xhenlfcGFybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b191aW50IGdvb2RfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3VpbnQgbWF4X2xhenksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdWludCBuaWNlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b191aW50IG1heF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b191aW50MzJfdCBmbGFncyApCit7CisgICAgbHpvX2J5dGVwIG9wOworICAgIGNvbnN0IGx6b19ieXRlcCBpaTsKKyAgICBsem9fdWludCBsaXQ7CisgICAgbHpvX3VpbnQgbV9sZW4sIG1fb2ZmOworICAgIExaT19DT01QUkVTU19UIGNjOworICAgIExaT19DT01QUkVTU19UICogY29uc3QgYyA9ICZjYzsKKyAgICBsem9fc3dkX3AgY29uc3Qgc3dkID0gKGx6b19zd2RfcCkgd3JrbWVtOworICAgIGx6b191aW50IHRyeV9sYXp5OworICAgIGludCByOworCisgICAgLyogc2FuaXR5IGNoZWNrICovCisjaWYgZGVmaW5lZChMWk8xWCkKKyAgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChMWk8xWF85OTlfTUVNX0NPTVBSRVNTID49IFNJWkVPRl9MWk9fU1dEX1QpCisjZWxpZiBkZWZpbmVkKExaTzFZKQorICAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKExaTzFZXzk5OV9NRU1fQ09NUFJFU1MgPj0gU0laRU9GX0xaT19TV0RfVCkKKyNlbGlmIGRlZmluZWQoTFpPMVopCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoTFpPMVpfOTk5X01FTV9DT01QUkVTUyA+PSBTSVpFT0ZfTFpPX1NXRF9UKQorI2Vsc2UKKyMgIGVycm9yCisjZW5kaWYKKworLyogc2V0dXAgcGFyYW1ldGVyIGRlZmF1bHRzICovCisgICAgLyogbnVtYmVyIG9mIGxhenkgbWF0Y2ggdHJpZXMgKi8KKyAgICB0cnlfbGF6eSA9IChsem9fdWludCkgdHJ5X2xhenlfcGFybTsKKyAgICBpZiAodHJ5X2xhenlfcGFybSA8IDApCisgICAgICAgIHRyeV9sYXp5ID0gMTsKKyAgICAvKiByZWR1Y2UgbGF6eSBtYXRjaCBzZWFyY2ggaWYgd2UgYWxyZWFkeSBoYXZlIGEgbWF0Y2ggd2l0aCB0aGlzIGxlbmd0aCAqLworICAgIGlmIChnb29kX2xlbmd0aCA9PSAwKQorICAgICAgICBnb29kX2xlbmd0aCA9IDMyOworICAgIC8qIGRvIG5vdCB0cnkgYSBsYXp5IG1hdGNoIGlmIHdlIGFscmVhZHkgaGF2ZSBhIG1hdGNoIHdpdGggdGhpcyBsZW5ndGggKi8KKyAgICBpZiAobWF4X2xhenkgPT0gMCkKKyAgICAgICAgbWF4X2xhenkgPSAzMjsKKyAgICAvKiBzdG9wIHNlYXJjaGluZyBmb3IgbG9uZ2VyIG1hdGNoZXMgdGhhbiB0aGlzIG9uZSAqLworICAgIGlmIChuaWNlX2xlbmd0aCA9PSAwKQorICAgICAgICBuaWNlX2xlbmd0aCA9IDA7CisgICAgLyogZG9uJ3Qgc2VhcmNoIG1vcmUgcG9zaXRpb25zIHRoYW4gdGhpcyAqLworICAgIGlmIChtYXhfY2hhaW4gPT0gMCkKKyAgICAgICAgbWF4X2NoYWluID0gU1dEX01BWF9DSEFJTjsKKworICAgIGMtPmluaXQgPSAwOworICAgIGMtPmlwID0gYy0+aW4gPSBpbjsKKyAgICBjLT5pbl9lbmQgPSBpbiArIGluX2xlbjsKKyAgICBjLT5vdXQgPSBvdXQ7CisgICAgYy0+Y2IgPSBjYjsKKyAgICBjLT5tMWFfbSA9IGMtPm0xYl9tID0gYy0+bTJfbSA9IGMtPm0zX20gPSBjLT5tNF9tID0gMDsKKyAgICBjLT5saXQxX3IgPSBjLT5saXQyX3IgPSBjLT5saXQzX3IgPSAwOworCisgICAgb3AgPSBvdXQ7CisgICAgaWkgPSBjLT5pcDsgICAgICAgICAgICAgLyogcG9pbnQgdG8gc3RhcnQgb2YgbGl0ZXJhbCBydW4gKi8KKyAgICBsaXQgPSAwOworICAgIGMtPnIxX2xpdCA9IGMtPnIxX21fbGVuID0gMDsKKworICAgIHIgPSBpbml0X21hdGNoKGMsc3dkLGRpY3QsZGljdF9sZW4sZmxhZ3MpOworICAgIGlmIChyICE9IDApCisgICAgICAgIHJldHVybiByOworICAgIGlmIChtYXhfY2hhaW4gPiAwKQorICAgICAgICBzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKyAgICBpZiAobmljZV9sZW5ndGggPiAwKQorICAgICAgICBzd2QtPm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7CisKKyAgICByID0gZmluZF9tYXRjaChjLHN3ZCwwLDApOworICAgIGlmIChyICE9IDApCisgICAgICAgIHJldHVybiByOworICAgIHdoaWxlIChjLT5sb29rID4gMCkKKyAgICB7CisgICAgICAgIGx6b191aW50IGFoZWFkOworICAgICAgICBsem9fdWludCBtYXhfYWhlYWQ7CisgICAgICAgIGx6b191aW50IGwxLCBsMiwgbDM7CisKKyAgICAgICAgYy0+Y29kZXNpemUgPSBwZChvcCwgb3V0KTsKKworICAgICAgICBtX2xlbiA9IGMtPm1fbGVuOworICAgICAgICBtX29mZiA9IGMtPm1fb2ZmOworCisgICAgICAgIGFzc2VydChjLT5icCA9PSBjLT5pcCAtIGMtPmxvb2spOworICAgICAgICBhc3NlcnQoYy0+YnAgPj0gaW4pOworICAgICAgICBpZiAobGl0ID09IDApCisgICAgICAgICAgICBpaSA9IGMtPmJwOworICAgICAgICBhc3NlcnQoaWkgKyBsaXQgPT0gYy0+YnApOworICAgICAgICBhc3NlcnQoc3dkLT5iX2NoYXIgPT0gKihjLT5icCkpOworCisgICAgICAgIGlmICggbV9sZW4gPCAyIHx8CisgICAgICAgICAgICAobV9sZW4gPT0gMiAmJiAobV9vZmYgPiBNMV9NQVhfT0ZGU0VUIHx8IGxpdCA9PSAwIHx8IGxpdCA+PSA0KSkgfHwKKyNpZiAxCisgICAgICAgICAgICAvKiBEbyBub3QgYWNjZXB0IHRoaXMgbWF0Y2ggZm9yIGNvbXByZXNzZWQtZGF0YSBjb21wYXRpYmlsaXR5CisgICAgICAgICAgICAgKiB3aXRoIExaTyB2MS4wMSBhbmQgYmVmb3JlCisgICAgICAgICAgICAgKiBbIG1pZ2h0IGJlIGEgcHJvYmxlbSBmb3IgZGVjb21wcmVzcygpIGFuZCBvcHRpbWl6ZSgpIF0KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgKG1fbGVuID09IDIgJiYgb3AgPT0gb3V0KSB8fAorI2VuZGlmCisgICAgICAgICAgICAob3AgPT0gb3V0ICYmIGxpdCA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogYSBsaXRlcmFsICovCisgICAgICAgICAgICBtX2xlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobV9sZW4gPT0gTTJfTUlOX0xFTikKKyAgICAgICAgeworICAgICAgICAgICAgLyogY29tcHJlc3Npb24gcmF0aW8gaW1wcm92ZXMgaWYgd2UgY29kZSBhIGxpdGVyYWwgaW4gc29tZSBjYXNlcyAqLworICAgICAgICAgICAgaWYgKG1fb2ZmID4gTVhfTUFYX09GRlNFVCAmJiBsaXQgPj0gNCkKKyAgICAgICAgICAgICAgICBtX2xlbiA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9sZW4gPT0gMCkKKyAgICAgICAgeworICAgIC8qIGEgbGl0ZXJhbCAqLworICAgICAgICAgICAgbGl0Kys7CisgICAgICAgICAgICBzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKyAgICAgICAgICAgIHIgPSBmaW5kX21hdGNoKGMsc3dkLDEsMCk7CisgICAgICAgICAgICBhc3NlcnQociA9PSAwKTsgTFpPX1VOVVNFRChyKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAvKiBhIG1hdGNoICovCisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisgICAgICAgIGlmIChzd2QtPnVzZV9iZXN0X29mZikKKyAgICAgICAgICAgIGJldHRlcl9tYXRjaChzd2QsJm1fbGVuLCZtX29mZik7CisjZW5kaWYKKyAgICAgICAgYXNzZXJ0X21hdGNoKHN3ZCxtX2xlbixtX29mZik7CisKKworICAgICAgICAvKiBzaGFsbCB3ZSB0cnkgYSBsYXp5IG1hdGNoID8gKi8KKyAgICAgICAgYWhlYWQgPSAwOworICAgICAgICBpZiAodHJ5X2xhenkgPT0gMCB8fCBtX2xlbiA+PSBtYXhfbGF6eSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbm8gKi8KKyAgICAgICAgICAgIGwxID0gMDsKKyAgICAgICAgICAgIG1heF9haGVhZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiB5ZXMsIHRyeSBhIGxhenkgbWF0Y2ggKi8KKyAgICAgICAgICAgIGwxID0gbGVuX29mX2NvZGVkX21hdGNoKG1fbGVuLG1fb2ZmLGxpdCk7CisgICAgICAgICAgICBhc3NlcnQobDEgPiAwKTsKKyNpZiAxCisgICAgICAgICAgICBtYXhfYWhlYWQgPSBMWk9fTUlOKHRyeV9sYXp5LCBsMSAtIDEpOworI2Vsc2UKKyAgICAgICAgICAgIG1heF9haGVhZCA9IExaT19NSU4zKHRyeV9sYXp5LCBsMSwgbV9sZW4gLSAxKTsKKyNlbmRpZgorICAgICAgICB9CisKKworICAgICAgICB3aGlsZSAoYWhlYWQgPCBtYXhfYWhlYWQgJiYgYy0+bG9vayA+IG1fbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBsem9fdWludCBsYXp5X21hdGNoX21pbl9nYWluOworCisgICAgICAgICAgICBpZiAobV9sZW4gPj0gZ29vZF9sZW5ndGgpCisgICAgICAgICAgICAgICAgc3dkLT5tYXhfY2hhaW4gPSBtYXhfY2hhaW4gPj4gMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKyAgICAgICAgICAgIHIgPSBmaW5kX21hdGNoKGMsc3dkLDEsMCk7CisgICAgICAgICAgICBhaGVhZCsrOworCisgICAgICAgICAgICBhc3NlcnQociA9PSAwKTsgTFpPX1VOVVNFRChyKTsKKyAgICAgICAgICAgIGFzc2VydChjLT5sb29rID4gMCk7CisgICAgICAgICAgICBhc3NlcnQoaWkgKyBsaXQgKyBhaGVhZCA9PSBjLT5icCk7CisKKyNpZiBkZWZpbmVkKExaTzFaKQorICAgICAgICAgICAgaWYgKG1fb2ZmID09IGMtPmxhc3RfbV9vZmYgJiYgYy0+bV9vZmYgIT0gYy0+bGFzdF9tX29mZikKKyAgICAgICAgICAgICAgICBpZiAobV9sZW4gPj0gTTJfTUlOX0xFTiAmJiBtX2xlbiA8PSBNMl9NQVhfTEVOKQorICAgICAgICAgICAgICAgICAgICBjLT5tX2xlbiA9IDA7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChjLT5tX2xlbiA8IG1fbGVuKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworI2lmIDEKKyAgICAgICAgICAgIGlmIChjLT5tX2xlbiA9PSBtX2xlbiAmJiBjLT5tX29mZiA+PSBtX29mZikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZgorI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorICAgICAgICAgICAgaWYgKHN3ZC0+dXNlX2Jlc3Rfb2ZmKQorICAgICAgICAgICAgICAgIGJldHRlcl9tYXRjaChzd2QsJmMtPm1fbGVuLCZjLT5tX29mZik7CisjZW5kaWYKKyAgICAgICAgICAgIGwyID0gbGVuX29mX2NvZGVkX21hdGNoKGMtPm1fbGVuLGMtPm1fb2ZmLGxpdCthaGVhZCk7CisgICAgICAgICAgICBpZiAobDIgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNpZiAwCisgICAgICAgICAgICBpZiAoYy0+bV9sZW4gPT0gbV9sZW4gJiYgbDIgPj0gbDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisjZW5kaWYKKworCisjaWYgMQorICAgICAgICAgICAgLyogY29tcHJlc3NlZC1kYXRhIGNvbXBhdGliaWxpdHkgW3NlZSBhYm92ZV0gKi8KKyAgICAgICAgICAgIGwzID0gKG9wID09IG91dCkgPyAwIDogbGVuX29mX2NvZGVkX21hdGNoKGFoZWFkLG1fb2ZmLGxpdCk7CisjZWxzZQorICAgICAgICAgICAgbDMgPSBsZW5fb2ZfY29kZWRfbWF0Y2goYWhlYWQsbV9vZmYsbGl0KTsKKyNlbmRpZgorCisgICAgICAgICAgICBsYXp5X21hdGNoX21pbl9nYWluID0gbWluX2dhaW4oYWhlYWQsbGl0LGxpdCthaGVhZCxsMSxsMixsMyk7CisgICAgICAgICAgICBpZiAoYy0+bV9sZW4gPj0gbV9sZW4gKyBsYXp5X21hdGNoX21pbl9nYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGMtPmxhenkrKzsKKyAgICAgICAgICAgICAgICBhc3NlcnRfbWF0Y2goc3dkLGMtPm1fbGVuLGMtPm1fb2ZmKTsKKworICAgICAgICAgICAgICAgIGlmIChsMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgcHJldmlvdXMgcnVuICovCisgICAgICAgICAgICAgICAgICAgIG9wID0gY29kZV9ydW4oYyxvcCxpaSxsaXQsYWhlYWQpOworICAgICAgICAgICAgICAgICAgICBsaXQgPSAwOworICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIHNob3J0ZW5lZCBtYXRjaCAqLworICAgICAgICAgICAgICAgICAgICBvcCA9IGNvZGVfbWF0Y2goYyxvcCxhaGVhZCxtX29mZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpdCArPSBhaGVhZDsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGlpICsgbGl0ID09IGMtPmJwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBsYXp5X21hdGNoX2RvbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGFzc2VydChpaSArIGxpdCArIGFoZWFkID09IGMtPmJwKTsKKworICAgICAgICAvKiAxIC0gY29kZSBydW4gKi8KKyAgICAgICAgb3AgPSBjb2RlX3J1bihjLG9wLGlpLGxpdCxtX2xlbik7CisgICAgICAgIGxpdCA9IDA7CisKKyAgICAgICAgLyogMiAtIGNvZGUgbWF0Y2ggKi8KKyAgICAgICAgb3AgPSBjb2RlX21hdGNoKGMsb3AsbV9sZW4sbV9vZmYpOworICAgICAgICBzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKyAgICAgICAgciA9IGZpbmRfbWF0Y2goYyxzd2QsbV9sZW4sMSthaGVhZCk7CisgICAgICAgIGFzc2VydChyID09IDApOyBMWk9fVU5VU0VEKHIpOworCitsYXp5X21hdGNoX2RvbmU6IDsKKyAgICB9CisKKworICAgIC8qIHN0b3JlIGZpbmFsIHJ1biAqLworICAgIGlmIChsaXQgPiAwKQorICAgICAgICBvcCA9IFNUT1JFX1JVTihjLG9wLGlpLGxpdCk7CisKKyNpZiBkZWZpbmVkKExaT19FT0ZfQ09ERSkKKyAgICAqb3ArKyA9IE00X01BUktFUiB8IDE7CisgICAgKm9wKysgPSAwOworICAgICpvcCsrID0gMDsKKyNlbmRpZgorCisgICAgYy0+Y29kZXNpemUgPSBwZChvcCwgb3V0KTsKKyAgICBhc3NlcnQoYy0+dGV4dHNpemUgPT0gaW5fbGVuKTsKKworICAgICpvdXRfbGVuID0gcGQob3AsIG91dCk7CisKKyAgICBpZiAoYy0+Y2IgJiYgYy0+Y2ItPm5wcm9ncmVzcykKKyAgICAgICAgKCpjLT5jYi0+bnByb2dyZXNzKShjLT5jYiwgYy0+dGV4dHNpemUsIGMtPmNvZGVzaXplLCAwKTsKKworI2lmIDAKKyAgICBwcmludGYoIiVsZCAlbGQgLT4gJWxkICAlbGQ6ICVsZCAlbGQgJWxkICVsZCAlbGQgICVsZDogJWxkICVsZCAlbGQgICVsZFxuIiwKKyAgICAgICAgKGxvbmcpIGMtPnRleHRzaXplLCAobG9uZykgaW5fbGVuLCAobG9uZykgYy0+Y29kZXNpemUsCisgICAgICAgIGMtPm1hdGNoX2J5dGVzLCBjLT5tMWFfbSwgYy0+bTFiX20sIGMtPm0yX20sIGMtPm0zX20sIGMtPm00X20sCisgICAgICAgIGMtPmxpdF9ieXRlcywgYy0+bGl0MV9yLCBjLT5saXQyX3IsIGMtPmxpdDNfciwgYy0+bGF6eSk7CisjZW5kaWYKKyAgICBhc3NlcnQoYy0+bGl0X2J5dGVzICsgYy0+bWF0Y2hfYnl0ZXMgPT0gaW5fbGVuKTsKKworICAgIHJldHVybiBMWk9fRV9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xaT19QVUJMSUMoaW50KQorbHpvMXhfOTk5X2NvbXByZXNzX2xldmVsICAgICggY29uc3QgbHpvX2J5dGVwIGluICwgbHpvX3VpbnQgIGluX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBvdXQsIGx6b191aW50cCBvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGx6b19ieXRlcCBkaWN0LCBsem9fdWludCBkaWN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19jYWxsYmFja19wIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXByZXNzaW9uX2xldmVsICkKK3sKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0CisgICAgeworICAgICAgICBpbnQgdHJ5X2xhenlfcGFybTsKKyAgICAgICAgbHpvX3VpbnQgZ29vZF9sZW5ndGg7CisgICAgICAgIGx6b191aW50IG1heF9sYXp5OworICAgICAgICBsem9fdWludCBuaWNlX2xlbmd0aDsKKyAgICAgICAgbHpvX3VpbnQgbWF4X2NoYWluOworICAgICAgICBsem9fdWludDMyX3QgZmxhZ3M7CisgICAgfSBjWzldID0geworICAgICAgICAvKiBmYXN0ZXIgY29tcHJlc3Npb24gKi8KKyAgICAgICAgeyAgIDAsICAgICAwLCAgICAgMCwgICAgIDgsICAgIDQsICAgMCB9LAorICAgICAgICB7ICAgMCwgICAgIDAsICAgICAwLCAgICAxNiwgICAgOCwgICAwIH0sCisgICAgICAgIHsgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgIDE2LCAgIDAgfSwKKyAgICAgICAgeyAgIDEsICAgICA0LCAgICAgNCwgICAgMTYsICAgMTYsICAgMCB9LAorICAgICAgICB7ICAgMSwgICAgIDgsICAgIDE2LCAgICAzMiwgICAzMiwgICAwIH0sCisgICAgICAgIHsgICAxLCAgICAgOCwgICAgMTYsICAgMTI4LCAgMTI4LCAgIDAgfSwKKyAgICAgICAgeyAgIDIsICAgICA4LCAgICAzMiwgICAxMjgsICAyNTYsICAgMCB9LAorICAgICAgICB7ICAgMiwgICAgMzIsICAgMTI4LCBTV0RfRiwgMjA0OCwgICAxIH0sCisgICAgICAgIHsgICAyLCBTV0RfRiwgU1dEX0YsIFNXRF9GLCA0MDk2LCAgIDEgfQorICAgICAgICAvKiBtYXguIGNvbXByZXNzaW9uICovCisgICAgfTsKKworICAgIGlmIChjb21wcmVzc2lvbl9sZXZlbCA8IDEgfHwgY29tcHJlc3Npb25fbGV2ZWwgPiA5KQorICAgICAgICByZXR1cm4gTFpPX0VfRVJST1I7CisKKyAgICBjb21wcmVzc2lvbl9sZXZlbCAtPSAxOworICAgIHJldHVybiBsem8xeF85OTlfY29tcHJlc3NfaW50ZXJuYWwoaW4sIGluX2xlbiwgb3V0LCBvdXRfbGVuLCB3cmttZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LCBkaWN0X2xlbiwgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW2NvbXByZXNzaW9uX2xldmVsXS50cnlfbGF6eV9wYXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1tjb21wcmVzc2lvbl9sZXZlbF0uZ29vZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW2NvbXByZXNzaW9uX2xldmVsXS5tYXhfbGF6eSwKKyNpZiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW2NvbXByZXNzaW9uX2xldmVsXS5uaWNlX2xlbmd0aCwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW2NvbXByZXNzaW9uX2xldmVsXS5tYXhfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW2NvbXByZXNzaW9uX2xldmVsXS5mbGFncyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMWk9fUFVCTElDKGludCkKK2x6bzF4Xzk5OV9jb21wcmVzc19kaWN0ICAgICAoIGNvbnN0IGx6b19ieXRlcCBpbiAsIGx6b191aW50ICBpbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgb3V0LCBsem9fdWludHAgb3V0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4gKQoreworICAgIHJldHVybiBsem8xeF85OTlfY29tcHJlc3NfbGV2ZWwoaW4sIGluX2xlbiwgb3V0LCBvdXRfbGVuLCB3cmttZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LCBkaWN0X2xlbiwgMCwgOCk7Cit9CisKK0xaT19QVUJMSUMoaW50KQorbHpvMXhfOTk5X2NvbXByZXNzICAoIGNvbnN0IGx6b19ieXRlcCBpbiAsIGx6b191aW50ICBpbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIG91dCwgbHpvX3VpbnRwIG91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSApCit7CisgICAgcmV0dXJuIGx6bzF4Xzk5OV9jb21wcmVzc19sZXZlbChpbiwgaW5fbGVuLCBvdXQsIG91dF9sZW4sIHdya21lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIChsem9fY2FsbGJhY2tfcCkgMCwgOCk7Cit9CisKKworLyoKK3ZpOnRzPTQ6ZXQKKyovCisKZGlmZiAtLWdpdCBhL2x6by9zcmMvbHpvMXhfYy5jaCBiL2x6by9zcmMvbHpvMXhfYy5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDVmNzFkCi0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9sem8xeF9jLmNoCkBAIC0wLDAgKzEsNDA1IEBACisvKiBsem8xeF9jLmNoIC0tIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMWk8xW1hZXS0xIGNvbXByZXNzaW9uIGFsZ29yaXRobQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKworI2lmIDEgJiYgZGVmaW5lZChET19DT01QUkVTUykgJiYgIWRlZmluZWQoZG9fY29tcHJlc3MpCisgICAvKiBjaG9vc2UgYSB1bmlxdWUgbmFtZSB0byBiZXR0ZXIgaGVscCBQR08gb3B0aW1pemF0aW9ucyAqLworIyAgZGVmaW5lIGRvX2NvbXByZXNzICAgICAgIExaT19QUF9FQ09OQ0FUMihET19DT01QUkVTUyxfY29yZSkKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gY29tcHJlc3MgYSBibG9jayBvZiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgX19sem9fbm9pbmxpbmUgbHpvX3VpbnQKK2RvX2NvbXByZXNzICggY29uc3QgbHpvX2J5dGVwIGluICwgbHpvX3VpbnQgIGluX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIG91dCwgbHpvX3VpbnRwIG91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgIGx6b191aW50ICB0aSwgIGx6b192b2lkcCB3cmttZW0pCit7CisgICAgY29uc3QgbHpvX2J5dGVwIGlwOworICAgIGx6b19ieXRlcCBvcDsKKyAgICBjb25zdCBsem9fYnl0ZXAgY29uc3QgaW5fZW5kID0gaW4gKyBpbl9sZW47CisgICAgY29uc3QgbHpvX2J5dGVwIGNvbnN0IGlwX2VuZCA9IGluICsgaW5fbGVuIC0gMjA7CisgICAgY29uc3QgbHpvX2J5dGVwIGlpOworICAgIGx6b19kaWN0X3AgY29uc3QgZGljdCA9IChsem9fZGljdF9wKSB3cmttZW07CisKKyAgICBvcCA9IG91dDsKKyAgICBpcCA9IGluOworICAgIGlpID0gaXA7CisKKyAgICBpcCArPSB0aSA8IDQgPyA0IC0gdGkgOiAwOworICAgIGZvciAoOzspCisgICAgeworICAgICAgICBjb25zdCBsem9fYnl0ZXAgbV9wb3M7CisjaWYgIShMWk9fREVURVJNSU5JU1RJQykKKyAgICAgICAgTFpPX0RFRklORV9VTklOSVRJQUxJWkVEX1ZBUihsem9fdWludCwgbV9vZmYsIDApOworICAgICAgICBsem9fdWludCBtX2xlbjsKKyAgICAgICAgbHpvX3VpbnQgZGluZGV4OworbmV4dDoKKyAgICAgICAgaWYgX19sem9fdW5saWtlbHkoaXAgPj0gaXBfZW5kKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIERJTkRFWDEoZGluZGV4LGlwKTsKKyAgICAgICAgR0lOREVYKG1fcG9zLG1fb2ZmLGRpY3QsZGluZGV4LGluKTsKKyAgICAgICAgaWYgKExaT19DSEVDS19NUE9TX05PTl9ERVQobV9wb3MsbV9vZmYsaW4saXAsTTRfTUFYX09GRlNFVCkpCisgICAgICAgICAgICBnb3RvIGxpdGVyYWw7CisjaWYgMQorICAgICAgICBpZiAobV9vZmYgPD0gTTJfTUFYX09GRlNFVCB8fCBtX3Bvc1szXSA9PSBpcFszXSkKKyAgICAgICAgICAgIGdvdG8gdHJ5X21hdGNoOworICAgICAgICBESU5ERVgyKGRpbmRleCxpcCk7CisjZW5kaWYKKyAgICAgICAgR0lOREVYKG1fcG9zLG1fb2ZmLGRpY3QsZGluZGV4LGluKTsKKyAgICAgICAgaWYgKExaT19DSEVDS19NUE9TX05PTl9ERVQobV9wb3MsbV9vZmYsaW4saXAsTTRfTUFYX09GRlNFVCkpCisgICAgICAgICAgICBnb3RvIGxpdGVyYWw7CisgICAgICAgIGlmIChtX29mZiA8PSBNMl9NQVhfT0ZGU0VUIHx8IG1fcG9zWzNdID09IGlwWzNdKQorICAgICAgICAgICAgZ290byB0cnlfbWF0Y2g7CisgICAgICAgIGdvdG8gbGl0ZXJhbDsKKwordHJ5X21hdGNoOgorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICBpZiAoVUFfR0VUX05FMzIobV9wb3MpICE9IFVBX0dFVF9ORTMyKGlwKSkKKyNlbHNlCisgICAgICAgIGlmIChtX3Bvc1swXSAhPSBpcFswXSB8fCBtX3Bvc1sxXSAhPSBpcFsxXSB8fCBtX3Bvc1syXSAhPSBpcFsyXSB8fCBtX3Bvc1szXSAhPSBpcFszXSkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAvKiBhIGxpdGVyYWwgKi8KK2xpdGVyYWw6CisgICAgICAgICAgICBVUERBVEVfSShkaWN0LDAsZGluZGV4LGlwLGluKTsKKyAgICAgICAgICAgIGlwICs9IDEgKyAoKGlwIC0gaWkpID4+IDUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKy8qbWF0Y2g6Ki8KKyAgICAgICAgVVBEQVRFX0koZGljdCwwLGRpbmRleCxpcCxpbik7CisjZWxzZQorICAgICAgICBsem9fdWludCBtX29mZjsKKyAgICAgICAgbHpvX3VpbnQgbV9sZW47CisgICAgICAgIHsKKyAgICAgICAgbHpvX3VpbnQzMl90IGR2OworICAgICAgICBsem9fdWludCBkaW5kZXg7CitsaXRlcmFsOgorICAgICAgICBpcCArPSAxICsgKChpcCAtIGlpKSA+PiA1KTsKK25leHQ6CisgICAgICAgIGlmIF9fbHpvX3VubGlrZWx5KGlwID49IGlwX2VuZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkdiA9IFVBX0dFVF9MRTMyKGlwKTsKKyAgICAgICAgZGluZGV4ID0gRElOREVYKGR2LGlwKTsKKyAgICAgICAgR0lOREVYKG1fb2ZmLG1fcG9zLGluK2RpY3QsZGluZGV4LGluKTsKKyAgICAgICAgVVBEQVRFX0koZGljdCwwLGRpbmRleCxpcCxpbik7CisgICAgICAgIGlmIF9fbHpvX3VubGlrZWx5KGR2ICE9IFVBX0dFVF9MRTMyKG1fcG9zKSkKKyAgICAgICAgICAgIGdvdG8gbGl0ZXJhbDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAvKiBhIG1hdGNoICovCisKKyAgICAgICAgaWkgLT0gdGk7IHRpID0gMDsKKyAgICAgICAgeworICAgICAgICBsem9fdWludCB0ID0gcGQoaXAsaWkpOworICAgICAgICBpZiAodCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodCA8PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9wWy0yXSA9IExaT19CWVRFKG9wWy0yXSB8IHQpOworI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICAgICAgICAgIFVBX0NPUFk0KG9wLCBpaSk7CisgICAgICAgICAgICAgICAgb3AgKz0gdDsKKyNlbHNlCisgICAgICAgICAgICAgICAgeyBkbyAqb3ArKyA9ICppaSsrOyB3aGlsZSAoLS10ID4gMCk7IH0KKyNlbmRpZgorICAgICAgICAgICAgfQorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKSB8fCAoTFpPX09QVF9VTkFMSUdORUQ2NCkKKyAgICAgICAgICAgIGVsc2UgaWYgKHQgPD0gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURSh0IC0gMyk7CisgICAgICAgICAgICAgICAgVUFfQ09QWTgob3AsIGlpKTsKKyAgICAgICAgICAgICAgICBVQV9DT1BZOChvcCs4LCBpaSs4KTsKKyAgICAgICAgICAgICAgICBvcCArPSB0OworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHQgPD0gMTgpCisgICAgICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUodCAtIDMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGx6b191aW50IHR0ID0gdCAtIDE4OworICAgICAgICAgICAgICAgICAgICAqb3ArKyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIF9fbHpvX3VubGlrZWx5KHR0ID4gMjU1KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0dCAtPSAyNTU7CisgICAgICAgICAgICAgICAgICAgICAgICBVQV9TRVQxKG9wLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR0ID4gMCk7CisgICAgICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUodHQpOworICAgICAgICAgICAgICAgIH0KKyNpZiAoTFpPX09QVF9VTkFMSUdORUQzMikgfHwgKExaT19PUFRfVU5BTElHTkVENjQpCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBVQV9DT1BZOChvcCwgaWkpOworICAgICAgICAgICAgICAgICAgICBVQV9DT1BZOChvcCs4LCBpaSs4KTsKKyAgICAgICAgICAgICAgICAgICAgb3AgKz0gMTY7IGlpICs9IDE2OyB0IC09IDE2OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKHQgPj0gMTYpOyBpZiAodCA+IDApCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7IGRvICpvcCsrID0gKmlpKys7IHdoaWxlICgtLXQgPiAwKTsgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9sZW4gPSA0OworICAgICAgICB7CisjaWYgKExaT19PUFRfVU5BTElHTkVENjQpCisgICAgICAgIGx6b191aW50NjRfdCB2OworICAgICAgICB2ID0gVUFfR0VUX05FNjQoaXAgKyBtX2xlbikgXiBVQV9HRVRfTkU2NChtX3BvcyArIG1fbGVuKTsKKyAgICAgICAgaWYgX19sem9fdW5saWtlbHkodiA9PSAwKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gODsKKyAgICAgICAgICAgICAgICB2ID0gVUFfR0VUX05FNjQoaXAgKyBtX2xlbikgXiBVQV9HRVRfTkU2NChtX3BvcyArIG1fbGVuKTsKKyAgICAgICAgICAgICAgICBpZiBfX2x6b191bmxpa2VseShpcCArIG1fbGVuID49IGlwX2VuZCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBtX2xlbl9kb25lOworICAgICAgICAgICAgfSB3aGlsZSAodiA9PSAwKTsKKyAgICAgICAgfQorI2lmIChMWk9fQUJJX0JJR19FTkRJQU4pICYmIGRlZmluZWQobHpvX2JpdG9wc19jdGx6NjQpCisgICAgICAgIG1fbGVuICs9IGx6b19iaXRvcHNfY3RsejY0KHYpIC8gQ0hBUl9CSVQ7CisjZWxpZiAoTFpPX0FCSV9CSUdfRU5ESUFOKQorICAgICAgICBpZiAoKHYgPj4gKDY0IC0gQ0hBUl9CSVQpKSA9PSAwKSBkbyB7CisgICAgICAgICAgICB2IDw8PSBDSEFSX0JJVDsKKyAgICAgICAgICAgIG1fbGVuICs9IDE7CisgICAgICAgIH0gd2hpbGUgKCh2ID4+ICg2NCAtIENIQVJfQklUKSkgPT0gMCk7CisjZWxpZiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKGx6b19iaXRvcHNfY3R0ejY0KQorICAgICAgICBtX2xlbiArPSBsem9fYml0b3BzX2N0dHo2NCh2KSAvIENIQVJfQklUOworI2VsaWYgKExaT19BQklfTElUVExFX0VORElBTikKKyAgICAgICAgaWYgKCh2ICYgVUNIQVJfTUFYKSA9PSAwKSBkbyB7CisgICAgICAgICAgICB2ID4+PSBDSEFSX0JJVDsKKyAgICAgICAgICAgIG1fbGVuICs9IDE7CisgICAgICAgIH0gd2hpbGUgKCh2ICYgVUNIQVJfTUFYKSA9PSAwKTsKKyNlbHNlCisgICAgICAgIGlmIChpcFttX2xlbl0gPT0gbV9wb3NbbV9sZW5dKSBkbyB7CisgICAgICAgICAgICBtX2xlbiArPSAxOworICAgICAgICB9IHdoaWxlIChpcFttX2xlbl0gPT0gbV9wb3NbbV9sZW5dKTsKKyNlbmRpZgorI2VsaWYgKExaT19PUFRfVU5BTElHTkVEMzIpCisgICAgICAgIGx6b191aW50MzJfdCB2OworICAgICAgICB2ID0gVUFfR0VUX05FMzIoaXAgKyBtX2xlbikgXiBVQV9HRVRfTkUzMihtX3BvcyArIG1fbGVuKTsKKyAgICAgICAgaWYgX19sem9fdW5saWtlbHkodiA9PSAwKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gNDsKKyAgICAgICAgICAgICAgICB2ID0gVUFfR0VUX05FMzIoaXAgKyBtX2xlbikgXiBVQV9HRVRfTkUzMihtX3BvcyArIG1fbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAodiAhPSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtX2xlbiArPSA0OworICAgICAgICAgICAgICAgIHYgPSBVQV9HRVRfTkUzMihpcCArIG1fbGVuKSBeIFVBX0dFVF9ORTMyKG1fcG9zICsgbV9sZW4pOworICAgICAgICAgICAgICAgIGlmIF9fbHpvX3VubGlrZWx5KGlwICsgbV9sZW4gPj0gaXBfZW5kKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG1fbGVuX2RvbmU7CisgICAgICAgICAgICB9IHdoaWxlICh2ID09IDApOworICAgICAgICB9CisjaWYgKExaT19BQklfQklHX0VORElBTikgJiYgZGVmaW5lZChsem9fYml0b3BzX2N0bHozMikKKyAgICAgICAgbV9sZW4gKz0gbHpvX2JpdG9wc19jdGx6MzIodikgLyBDSEFSX0JJVDsKKyNlbGlmIChMWk9fQUJJX0JJR19FTkRJQU4pCisgICAgICAgIGlmICgodiA+PiAoMzIgLSBDSEFSX0JJVCkpID09IDApIGRvIHsKKyAgICAgICAgICAgIHYgPDw9IENIQVJfQklUOworICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgfSB3aGlsZSAoKHYgPj4gKDMyIC0gQ0hBUl9CSVQpKSA9PSAwKTsKKyNlbGlmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQobHpvX2JpdG9wc19jdHR6MzIpCisgICAgICAgIG1fbGVuICs9IGx6b19iaXRvcHNfY3R0ejMyKHYpIC8gQ0hBUl9CSVQ7CisjZWxpZiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorICAgICAgICBpZiAoKHYgJiBVQ0hBUl9NQVgpID09IDApIGRvIHsKKyAgICAgICAgICAgIHYgPj49IENIQVJfQklUOworICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgfSB3aGlsZSAoKHYgJiBVQ0hBUl9NQVgpID09IDApOworI2Vsc2UKKyAgICAgICAgaWYgKGlwW21fbGVuXSA9PSBtX3Bvc1ttX2xlbl0pIGRvIHsKKyAgICAgICAgICAgIG1fbGVuICs9IDE7CisgICAgICAgIH0gd2hpbGUgKGlwW21fbGVuXSA9PSBtX3Bvc1ttX2xlbl0pOworI2VuZGlmCisjZWxzZQorICAgICAgICBpZiBfX2x6b191bmxpa2VseShpcFttX2xlbl0gPT0gbV9wb3NbbV9sZW5dKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoaXBbbV9sZW5dICE9IG1fcG9zW21fbGVuXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoaXBbbV9sZW5dICE9IG1fcG9zW21fbGVuXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoaXBbbV9sZW5dICE9IG1fcG9zW21fbGVuXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoaXBbbV9sZW5dICE9IG1fcG9zW21fbGVuXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoaXBbbV9sZW5dICE9IG1fcG9zW21fbGVuXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoaXBbbV9sZW5dICE9IG1fcG9zW21fbGVuXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoaXBbbV9sZW5dICE9IG1fcG9zW21fbGVuXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbV9sZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiBfX2x6b191bmxpa2VseShpcCArIG1fbGVuID49IGlwX2VuZCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBtX2xlbl9kb25lOworICAgICAgICAgICAgfSB3aGlsZSAoaXBbbV9sZW5dID09IG1fcG9zW21fbGVuXSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CittX2xlbl9kb25lOgorICAgICAgICBtX29mZiA9IHBkKGlwLG1fcG9zKTsKKyAgICAgICAgaXAgKz0gbV9sZW47CisgICAgICAgIGlpID0gaXA7CisgICAgICAgIGlmIChtX2xlbiA8PSBNMl9NQVhfTEVOICYmIG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fb2ZmIC09IDE7CisjaWYgZGVmaW5lZChMWk8xWCkKKyAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUoKChtX2xlbiAtIDEpIDw8IDUpIHwgKChtX29mZiAmIDcpIDw8IDIpKTsKKyAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9vZmYgPj4gMyk7CisjZWxpZiBkZWZpbmVkKExaTzFZKQorICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURSgoKG1fbGVuICsgMSkgPDwgNCkgfCAoKG1fb2ZmICYgMykgPDwgMikpOworICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiAyKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1fb2ZmIDw9IE0zX01BWF9PRkZTRVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fb2ZmIC09IDE7CisgICAgICAgICAgICBpZiAobV9sZW4gPD0gTTNfTUFYX0xFTikKKyAgICAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKE0zX01BUktFUiB8IChtX2xlbiAtIDIpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2xlbiAtPSBNM19NQVhfTEVOOworICAgICAgICAgICAgICAgICpvcCsrID0gTTNfTUFSS0VSIHwgMDsKKyAgICAgICAgICAgICAgICB3aGlsZSBfX2x6b191bmxpa2VseShtX2xlbiA+IDI1NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fbGVuIC09IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgVUFfU0VUMShvcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIG9wKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9sZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA8PCAyKTsKKyAgICAgICAgICAgICpvcCsrID0gTFpPX0JZVEUobV9vZmYgPj4gNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtX29mZiAtPSAweDQwMDA7CisgICAgICAgICAgICBpZiAobV9sZW4gPD0gTTRfTUFYX0xFTikKKyAgICAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKE00X01BUktFUiB8ICgobV9vZmYgPj4gMTEpICYgOCkgfCAobV9sZW4gLSAyKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9sZW4gLT0gTTRfTUFYX0xFTjsKKyAgICAgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKE00X01BUktFUiB8ICgobV9vZmYgPj4gMTEpICYgOCkpOworICAgICAgICAgICAgICAgIHdoaWxlIF9fbHpvX3VubGlrZWx5KG1fbGVuID4gMjU1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbV9sZW4gLT0gMjU1OworICAgICAgICAgICAgICAgICAgICBVQV9TRVQxKG9wLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgb3ArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX2xlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKG1fb2ZmIDw8IDIpOworICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURShtX29mZiA+PiA2KTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIG5leHQ7CisgICAgfQorCisgICAgKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKyAgICByZXR1cm4gcGQoaW5fZW5kLGlpLXRpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIHB1YmxpYyBlbnRyeSBwb2ludAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMWk9fUFVCTElDKGludCkKK0RPX0NPTVBSRVNTICAgICAgKCBjb25zdCBsem9fYnl0ZXAgaW4gLCBsem9fdWludCAgaW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBvdXQsIGx6b191aW50cCBvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0gKQoreworICAgIGNvbnN0IGx6b19ieXRlcCBpcCA9IGluOworICAgIGx6b19ieXRlcCBvcCA9IG91dDsKKyAgICBsem9fdWludCBsID0gaW5fbGVuOworICAgIGx6b191aW50IHQgPSAwOworCisgICAgd2hpbGUgKGwgPiAyMCkKKyAgICB7CisgICAgICAgIGx6b191aW50IGxsID0gbDsKKyAgICAgICAgbHpvX3VpbnRwdHJfdCBsbF9lbmQ7CisjaWYgMCB8fCAoTFpPX0RFVEVSTUlOSVNUSUMpCisgICAgICAgIGxsID0gTFpPX01JTihsbCwgNDkxNTIpOworI2VuZGlmCisgICAgICAgIGxsX2VuZCA9IChsem9fdWludHB0cl90KWlwICsgbGw7CisgICAgICAgIGlmICgobGxfZW5kICsgKCh0ICsgbGwpID4+IDUpKSA8PSBsbF9lbmQgfHwgKGNvbnN0IGx6b19ieXRlcCkobGxfZW5kICsgKCh0ICsgbGwpID4+IDUpKSA8PSBpcCArIGxsKQorICAgICAgICAgICAgYnJlYWs7CisjaWYgKExaT19ERVRFUk1JTklTVElDKQorICAgICAgICBsem9fbWVtc2V0KHdya21lbSwgMCwgKChsem9fdWludCkxIDw8IERfQklUUykgKiBzaXplb2YobHpvX2RpY3RfdCkpOworI2VuZGlmCisgICAgICAgIHQgPSBkb19jb21wcmVzcyhpcCxsbCxvcCxvdXRfbGVuLHQsd3JrbWVtKTsKKyAgICAgICAgaXAgKz0gbGw7CisgICAgICAgIG9wICs9ICpvdXRfbGVuOworICAgICAgICBsICAtPSBsbDsKKyAgICB9CisgICAgdCArPSBsOworCisgICAgaWYgKHQgPiAwKQorICAgIHsKKyAgICAgICAgY29uc3QgbHpvX2J5dGVwIGlpID0gaW4gKyBpbl9sZW4gLSB0OworCisgICAgICAgIGlmIChvcCA9PSBvdXQgJiYgdCA8PSAyMzgpCisgICAgICAgICAgICAqb3ArKyA9IExaT19CWVRFKDE3ICsgdCk7CisgICAgICAgIGVsc2UgaWYgKHQgPD0gMykKKyAgICAgICAgICAgIG9wWy0yXSA9IExaT19CWVRFKG9wWy0yXSB8IHQpOworICAgICAgICBlbHNlIGlmICh0IDw9IDE4KQorICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURSh0IC0gMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbHpvX3VpbnQgdHQgPSB0IC0gMTg7CisKKyAgICAgICAgICAgICpvcCsrID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0dCA+IDI1NSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0dCAtPSAyNTU7CisgICAgICAgICAgICAgICAgVUFfU0VUMShvcCwgMCk7CisgICAgICAgICAgICAgICAgb3ArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCh0dCA+IDApOworICAgICAgICAgICAgKm9wKysgPSBMWk9fQllURSh0dCk7CisgICAgICAgIH0KKyAgICAgICAgVUFfQ09QWU4ob3AsIGlpLCB0KTsKKyAgICAgICAgb3AgKz0gdDsKKyAgICB9CisKKyAgICAqb3ArKyA9IE00X01BUktFUiB8IDE7CisgICAgKm9wKysgPSAwOworICAgICpvcCsrID0gMDsKKworICAgICpvdXRfbGVuID0gcGQob3AsIG91dCk7CisgICAgcmV0dXJuIExaT19FX09LOworfQorCisKKy8qCit2aTp0cz00OmV0CisqLwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem8xeF9kLmNoIGIvbHpvL3NyYy9sem8xeF9kLmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGE4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vc3JjL2x6bzF4X2QuY2gKQEAgLTAsMCArMSw0NzggQEAKKy8qIGx6bzF4X2QuY2ggLS0gaW1wbGVtZW50YXRpb24gb2YgdGhlIExaTzFYIGRlY29tcHJlc3Npb24gYWxnb3JpdGhtCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2luY2x1ZGUgImx6bzFfZC5jaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGRlY29tcHJlc3MgYSBibG9jayBvZiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChET19ERUNPTVBSRVNTKQorTFpPX1BVQkxJQyhpbnQpCitET19ERUNPTVBSRVNTICAoIGNvbnN0IGx6b19ieXRlcCBpbiAsIGx6b191aW50ICBpbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBvdXQsIGx6b191aW50cCBvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICkKKyNlbmRpZgoreworICAgIGx6b19ieXRlcCBvcDsKKyAgICBjb25zdCBsem9fYnl0ZXAgaXA7CisgICAgbHpvX3VpbnQgdDsKKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKyAgICBsem9fdWludCBtX29mZjsKKyAgICBjb25zdCBsem9fYnl0ZXAgZGljdF9lbmQ7CisjZWxzZQorICAgIGNvbnN0IGx6b19ieXRlcCBtX3BvczsKKyNlbmRpZgorCisgICAgY29uc3QgbHpvX2J5dGVwIGNvbnN0IGlwX2VuZCA9IGluICsgaW5fbGVuOworI2lmIGRlZmluZWQoSEFWRV9BTllfT1ApCisgICAgbHpvX2J5dGVwIGNvbnN0IG9wX2VuZCA9IG91dCArICpvdXRfbGVuOworI2VuZGlmCisjaWYgZGVmaW5lZChMWk8xWikKKyAgICBsem9fdWludCBsYXN0X21fb2ZmID0gMDsKKyNlbmRpZgorCisgICAgTFpPX1VOVVNFRCh3cmttZW0pOworCisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisgICAgaWYgKGRpY3QpCisgICAgeworICAgICAgICBpZiAoZGljdF9sZW4gPiBNNF9NQVhfT0ZGU0VUKQorICAgICAgICB7CisgICAgICAgICAgICBkaWN0ICs9IGRpY3RfbGVuIC0gTTRfTUFYX09GRlNFVDsKKyAgICAgICAgICAgIGRpY3RfbGVuID0gTTRfTUFYX09GRlNFVDsKKyAgICAgICAgfQorICAgICAgICBkaWN0X2VuZCA9IGRpY3QgKyBkaWN0X2xlbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZGljdF9sZW4gPSAwOworICAgICAgICBkaWN0X2VuZCA9IE5VTEw7CisgICAgfQorI2VuZGlmIC8qIENPUFlfRElDVCAqLworCisgICAgKm91dF9sZW4gPSAwOworCisgICAgb3AgPSBvdXQ7CisgICAgaXAgPSBpbjsKKworICAgIE5FRURfSVAoMSk7CisgICAgaWYgKCppcCA+IDE3KQorICAgIHsKKyAgICAgICAgdCA9ICppcCsrIC0gMTc7CisgICAgICAgIGlmICh0IDwgNCkKKyAgICAgICAgICAgIGdvdG8gbWF0Y2hfbmV4dDsKKyAgICAgICAgYXNzZXJ0KHQgPiAwKTsgTkVFRF9PUCh0KTsgTkVFRF9JUCh0KzMpOworICAgICAgICBkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisgICAgICAgIGdvdG8gZmlyc3RfbGl0ZXJhbF9ydW47CisgICAgfQorCisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIE5FRURfSVAoMyk7CisgICAgICAgIHQgPSAqaXArKzsKKyAgICAgICAgaWYgKHQgPj0gMTYpCisgICAgICAgICAgICBnb3RvIG1hdGNoOworICAgICAgICAvKiBhIGxpdGVyYWwgcnVuICovCisgICAgICAgIGlmICh0ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICgqaXAgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ICs9IDI1NTsKKyAgICAgICAgICAgICAgICBpcCsrOworICAgICAgICAgICAgICAgIFRFU1RfSVYodCk7CisgICAgICAgICAgICAgICAgTkVFRF9JUCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQgKz0gMTUgKyAqaXArKzsKKyAgICAgICAgfQorICAgICAgICAvKiBjb3B5IGxpdGVyYWxzICovCisgICAgICAgIGFzc2VydCh0ID4gMCk7IE5FRURfT1AodCszKTsgTkVFRF9JUCh0KzYpOworI2lmIChMWk9fT1BUX1VOQUxJR05FRDY0KSAmJiAoTFpPX09QVF9VTkFMSUdORUQzMikKKyAgICAgICAgdCArPSAzOworICAgICAgICBpZiAodCA+PSA4KSBkbworICAgICAgICB7CisgICAgICAgICAgICBVQV9DT1BZOChvcCxpcCk7CisgICAgICAgICAgICBvcCArPSA4OyBpcCArPSA4OyB0IC09IDg7CisgICAgICAgIH0gd2hpbGUgKHQgPj0gOCk7CisgICAgICAgIGlmICh0ID49IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVBX0NPUFk0KG9wLGlwKTsKKyAgICAgICAgICAgIG9wICs9IDQ7IGlwICs9IDQ7IHQgLT0gNDsKKyAgICAgICAgfQorICAgICAgICBpZiAodCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpvcCsrID0gKmlwKys7CisgICAgICAgICAgICBpZiAodCA+IDEpIHsgKm9wKysgPSAqaXArKzsgaWYgKHQgPiAyKSB7ICpvcCsrID0gKmlwKys7IH0gfQorICAgICAgICB9CisjZWxpZiAoTFpPX09QVF9VTkFMSUdORUQzMikgfHwgKExaT19BTElHTkVEX09LXzQpCisjaWYgIShMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICBpZiAoUFRSX0FMSUdORUQyXzQob3AsaXApKQorICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgVUFfQ09QWTQob3AsaXApOworICAgICAgICBvcCArPSA0OyBpcCArPSA0OworICAgICAgICBpZiAoLS10ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHQgPj0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIFVBX0NPUFk0KG9wLGlwKTsKKyAgICAgICAgICAgICAgICAgICAgb3AgKz0gNDsgaXAgKz0gNDsgdCAtPSA0OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKHQgPj0gNCk7CisgICAgICAgICAgICAgICAgaWYgKHQgPiAwKSBkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworICAgICAgICB9CisjaWYgIShMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisjaWYgIShMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICB7CisgICAgICAgICAgICAqb3ArKyA9ICppcCsrOyAqb3ArKyA9ICppcCsrOyAqb3ArKyA9ICppcCsrOworICAgICAgICAgICAgZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworICAgICAgICB9CisjZW5kaWYKKworCitmaXJzdF9saXRlcmFsX3J1bjoKKworCisgICAgICAgIHQgPSAqaXArKzsKKyAgICAgICAgaWYgKHQgPj0gMTYpCisgICAgICAgICAgICBnb3RvIG1hdGNoOworI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorI2lmIGRlZmluZWQoTFpPMVopCisgICAgICAgIG1fb2ZmID0gKDEgKyBNMl9NQVhfT0ZGU0VUKSArICh0IDw8IDYpICsgKCppcCsrID4+IDIpOworICAgICAgICBsYXN0X21fb2ZmID0gbV9vZmY7CisjZWxzZQorICAgICAgICBtX29mZiA9ICgxICsgTTJfTUFYX09GRlNFVCkgKyAodCA+PiAyKSArICgqaXArKyA8PCAyKTsKKyNlbmRpZgorICAgICAgICBORUVEX09QKDMpOworICAgICAgICB0ID0gMzsgQ09QWV9ESUNUKHQsbV9vZmYpCisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisjaWYgZGVmaW5lZChMWk8xWikKKyAgICAgICAgdCA9ICgxICsgTTJfTUFYX09GRlNFVCkgKyAodCA8PCA2KSArICgqaXArKyA+PiAyKTsKKyAgICAgICAgbV9wb3MgPSBvcCAtIHQ7CisgICAgICAgIGxhc3RfbV9vZmYgPSB0OworI2Vsc2UKKyAgICAgICAgbV9wb3MgPSBvcCAtICgxICsgTTJfTUFYX09GRlNFVCk7CisgICAgICAgIG1fcG9zIC09IHQgPj4gMjsKKyAgICAgICAgbV9wb3MgLT0gKmlwKysgPDwgMjsKKyNlbmRpZgorICAgICAgICBURVNUX0xCKG1fcG9zKTsgTkVFRF9PUCgzKTsKKyAgICAgICAgKm9wKysgPSAqbV9wb3MrKzsgKm9wKysgPSAqbV9wb3MrKzsgKm9wKysgPSAqbV9wb3M7CisjZW5kaWYgLyogQ09QWV9ESUNUICovCisgICAgICAgIGdvdG8gbWF0Y2hfZG9uZTsKKworCisgICAgICAgIC8qIGhhbmRsZSBtYXRjaGVzICovCisgICAgICAgIGZvciAoOzspIHsKK21hdGNoOgorICAgICAgICAgICAgaWYgKHQgPj0gNjQpICAgICAgICAgICAgICAgIC8qIGEgTTIgbWF0Y2ggKi8KKyAgICAgICAgICAgIHsKKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKyNpZiBkZWZpbmVkKExaTzFYKQorICAgICAgICAgICAgICAgIG1fb2ZmID0gMSArICgodCA+PiAyKSAmIDcpICsgKCppcCsrIDw8IDMpOworICAgICAgICAgICAgICAgIHQgPSAodCA+PiA1KSAtIDE7CisjZWxpZiBkZWZpbmVkKExaTzFZKQorICAgICAgICAgICAgICAgIG1fb2ZmID0gMSArICgodCA+PiAyKSAmIDMpICsgKCppcCsrIDw8IDIpOworICAgICAgICAgICAgICAgIHQgPSAodCA+PiA0KSAtIDM7CisjZWxpZiBkZWZpbmVkKExaTzFaKQorICAgICAgICAgICAgICAgIG1fb2ZmID0gdCAmIDB4MWY7CisgICAgICAgICAgICAgICAgaWYgKG1fb2ZmID49IDB4MWMpCisgICAgICAgICAgICAgICAgICAgIG1fb2ZmID0gbGFzdF9tX29mZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX29mZiA9IDEgKyAobV9vZmYgPDwgNikgKyAoKmlwKysgPj4gMik7CisgICAgICAgICAgICAgICAgICAgIGxhc3RfbV9vZmYgPSBtX29mZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdCA9ICh0ID4+IDUpIC0gMTsKKyNlbmRpZgorI2Vsc2UgLyogIUNPUFlfRElDVCAqLworI2lmIGRlZmluZWQoTFpPMVgpCisgICAgICAgICAgICAgICAgbV9wb3MgPSBvcCAtIDE7CisgICAgICAgICAgICAgICAgbV9wb3MgLT0gKHQgPj4gMikgJiA3OworICAgICAgICAgICAgICAgIG1fcG9zIC09ICppcCsrIDw8IDM7CisgICAgICAgICAgICAgICAgdCA9ICh0ID4+IDUpIC0gMTsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisgICAgICAgICAgICAgICAgbV9wb3MgPSBvcCAtIDE7CisgICAgICAgICAgICAgICAgbV9wb3MgLT0gKHQgPj4gMikgJiAzOworICAgICAgICAgICAgICAgIG1fcG9zIC09ICppcCsrIDw8IDI7CisgICAgICAgICAgICAgICAgdCA9ICh0ID4+IDQpIC0gMzsKKyNlbGlmIGRlZmluZWQoTFpPMVopCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsem9fdWludCBvZmYgPSB0ICYgMHgxZjsKKyAgICAgICAgICAgICAgICAgICAgbV9wb3MgPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZiA+PSAweDFjKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQobGFzdF9tX29mZiA+IDApOworICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3MgLT0gbGFzdF9tX29mZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZiA9IDEgKyAob2ZmIDw8IDYpICsgKCppcCsrID4+IDIpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3MgLT0gb2ZmOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9tX29mZiA9IG9mZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ID0gKHQgPj4gNSkgLSAxOworI2VuZGlmCisgICAgICAgICAgICAgICAgVEVTVF9MQihtX3Bvcyk7IGFzc2VydCh0ID4gMCk7IE5FRURfT1AodCszLTEpOworICAgICAgICAgICAgICAgIGdvdG8gY29weV9tYXRjaDsKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHQgPj0gMzIpICAgICAgICAgICAvKiBhIE0zIG1hdGNoICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdCAmPSAzMTsKKyAgICAgICAgICAgICAgICBpZiAodCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCppcCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwKys7CisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX09WKHQpOworICAgICAgICAgICAgICAgICAgICAgICAgTkVFRF9JUCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ICs9IDMxICsgKmlwKys7CisgICAgICAgICAgICAgICAgICAgIE5FRURfSVAoMik7CisgICAgICAgICAgICAgICAgfQorI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorI2lmIGRlZmluZWQoTFpPMVopCisgICAgICAgICAgICAgICAgbV9vZmYgPSAxICsgKGlwWzBdIDw8IDYpICsgKGlwWzFdID4+IDIpOworICAgICAgICAgICAgICAgIGxhc3RfbV9vZmYgPSBtX29mZjsKKyNlbHNlCisgICAgICAgICAgICAgICAgbV9vZmYgPSAxICsgKGlwWzBdID4+IDIpICsgKGlwWzFdIDw8IDYpOworI2VuZGlmCisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisjaWYgZGVmaW5lZChMWk8xWikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGx6b191aW50IG9mZiA9IDEgKyAoaXBbMF0gPDwgNikgKyAoaXBbMV0gPj4gMik7CisgICAgICAgICAgICAgICAgICAgIG1fcG9zID0gb3AgLSBvZmY7CisgICAgICAgICAgICAgICAgICAgIGxhc3RfbV9vZmYgPSBvZmY7CisgICAgICAgICAgICAgICAgfQorI2VsaWYgKExaT19PUFRfVU5BTElHTkVEMTYpICYmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgICAgICAgICAgICAgbV9wb3MgPSBvcCAtIDE7CisgICAgICAgICAgICAgICAgbV9wb3MgLT0gVUFfR0VUX0xFMTYoaXApID4+IDI7CisjZWxzZQorICAgICAgICAgICAgICAgIG1fcG9zID0gb3AgLSAxOworICAgICAgICAgICAgICAgIG1fcG9zIC09IChpcFswXSA+PiAyKSArIChpcFsxXSA8PCA2KTsKKyNlbmRpZgorI2VuZGlmIC8qIENPUFlfRElDVCAqLworICAgICAgICAgICAgICAgIGlwICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0ID49IDE2KSAgICAgICAgICAgLyogYSBNNCBtYXRjaCAqLworICAgICAgICAgICAgeworI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorICAgICAgICAgICAgICAgIG1fb2ZmID0gKHQgJiA4KSA8PCAxMTsKKyNlbHNlIC8qICFDT1BZX0RJQ1QgKi8KKyAgICAgICAgICAgICAgICBtX3BvcyA9IG9wOworICAgICAgICAgICAgICAgIG1fcG9zIC09ICh0ICYgOCkgPDwgMTE7CisjZW5kaWYgLyogQ09QWV9ESUNUICovCisgICAgICAgICAgICAgICAgdCAmPSA3OworICAgICAgICAgICAgICAgIGlmICh0ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmlwID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gMjU1OworICAgICAgICAgICAgICAgICAgICAgICAgaXArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfT1YodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEX0lQKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHQgKz0gNyArICppcCsrOworICAgICAgICAgICAgICAgICAgICBORUVEX0lQKDIpOworICAgICAgICAgICAgICAgIH0KKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKyNpZiBkZWZpbmVkKExaTzFaKQorICAgICAgICAgICAgICAgIG1fb2ZmICs9IChpcFswXSA8PCA2KSArIChpcFsxXSA+PiAyKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgbV9vZmYgKz0gKGlwWzBdID4+IDIpICsgKGlwWzFdIDw8IDYpOworI2VuZGlmCisgICAgICAgICAgICAgICAgaXAgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAobV9vZmYgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlb2ZfZm91bmQ7CisgICAgICAgICAgICAgICAgbV9vZmYgKz0gMHg0MDAwOworI2lmIGRlZmluZWQoTFpPMVopCisgICAgICAgICAgICAgICAgbGFzdF9tX29mZiA9IG1fb2ZmOworI2VuZGlmCisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisjaWYgZGVmaW5lZChMWk8xWikKKyAgICAgICAgICAgICAgICBtX3BvcyAtPSAoaXBbMF0gPDwgNikgKyAoaXBbMV0gPj4gMik7CisjZWxpZiAoTFpPX09QVF9VTkFMSUdORUQxNikgJiYgKExaT19BQklfTElUVExFX0VORElBTikKKyAgICAgICAgICAgICAgICBtX3BvcyAtPSBVQV9HRVRfTEUxNihpcCkgPj4gMjsKKyNlbHNlCisgICAgICAgICAgICAgICAgbV9wb3MgLT0gKGlwWzBdID4+IDIpICsgKGlwWzFdIDw8IDYpOworI2VuZGlmCisgICAgICAgICAgICAgICAgaXAgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAobV9wb3MgPT0gb3ApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW9mX2ZvdW5kOworICAgICAgICAgICAgICAgIG1fcG9zIC09IDB4NDAwMDsKKyNpZiBkZWZpbmVkKExaTzFaKQorICAgICAgICAgICAgICAgIGxhc3RfbV9vZmYgPSBwZCgoY29uc3QgbHpvX2J5dGVwKW9wLCBtX3Bvcyk7CisjZW5kaWYKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYSBNMSBtYXRjaCAqLworICAgICAgICAgICAgeworI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorI2lmIGRlZmluZWQoTFpPMVopCisgICAgICAgICAgICAgICAgbV9vZmYgPSAxICsgKHQgPDwgNikgKyAoKmlwKysgPj4gMik7CisgICAgICAgICAgICAgICAgbGFzdF9tX29mZiA9IG1fb2ZmOworI2Vsc2UKKyAgICAgICAgICAgICAgICBtX29mZiA9IDEgKyAodCA+PiAyKSArICgqaXArKyA8PCAyKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIE5FRURfT1AoMik7CisgICAgICAgICAgICAgICAgdCA9IDI7IENPUFlfRElDVCh0LG1fb2ZmKQorI2Vsc2UgLyogIUNPUFlfRElDVCAqLworI2lmIGRlZmluZWQoTFpPMVopCisgICAgICAgICAgICAgICAgdCA9IDEgKyAodCA8PCA2KSArICgqaXArKyA+PiAyKTsKKyAgICAgICAgICAgICAgICBtX3BvcyA9IG9wIC0gdDsKKyAgICAgICAgICAgICAgICBsYXN0X21fb2ZmID0gdDsKKyNlbHNlCisgICAgICAgICAgICAgICAgbV9wb3MgPSBvcCAtIDE7CisgICAgICAgICAgICAgICAgbV9wb3MgLT0gdCA+PiAyOworICAgICAgICAgICAgICAgIG1fcG9zIC09ICppcCsrIDw8IDI7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBURVNUX0xCKG1fcG9zKTsgTkVFRF9PUCgyKTsKKyAgICAgICAgICAgICAgICAqb3ArKyA9ICptX3BvcysrOyAqb3ArKyA9ICptX3BvczsKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKyAgICAgICAgICAgICAgICBnb3RvIG1hdGNoX2RvbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNvcHkgbWF0Y2ggKi8KKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKworICAgICAgICAgICAgTkVFRF9PUCh0KzMtMSk7CisgICAgICAgICAgICB0ICs9IDMtMTsgQ09QWV9ESUNUKHQsbV9vZmYpCisKKyNlbHNlIC8qICFDT1BZX0RJQ1QgKi8KKworICAgICAgICAgICAgVEVTVF9MQihtX3Bvcyk7IGFzc2VydCh0ID4gMCk7IE5FRURfT1AodCszLTEpOworI2lmIChMWk9fT1BUX1VOQUxJR05FRDY0KSAmJiAoTFpPX09QVF9VTkFMSUdORUQzMikKKyAgICAgICAgICAgIGlmIChvcCAtIG1fcG9zID49IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdCArPSAoMyAtIDEpOworICAgICAgICAgICAgICAgIGlmICh0ID49IDgpIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVQV9DT1BZOChvcCxtX3Bvcyk7CisgICAgICAgICAgICAgICAgICAgIG9wICs9IDg7IG1fcG9zICs9IDg7IHQgLT0gODsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICh0ID49IDgpOworICAgICAgICAgICAgICAgIGlmICh0ID49IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVQV9DT1BZNChvcCxtX3Bvcyk7CisgICAgICAgICAgICAgICAgICAgIG9wICs9IDQ7IG1fcG9zICs9IDQ7IHQgLT0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKm9wKysgPSBtX3Bvc1swXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQgPiAxKSB7ICpvcCsrID0gbV9wb3NbMV07IGlmICh0ID4gMikgeyAqb3ArKyA9IG1fcG9zWzJdOyB9IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZWxpZiAoTFpPX09QVF9VTkFMSUdORUQzMikgfHwgKExaT19BTElHTkVEX09LXzQpCisjaWYgIShMWk9fT1BUX1VOQUxJR05FRDMyKQorICAgICAgICAgICAgaWYgKHQgPj0gMiAqIDQgLSAoMyAtIDEpICYmIFBUUl9BTElHTkVEMl80KG9wLG1fcG9zKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoKG9wIC0gbV9wb3MpID49IDQpOyAgLyogYm90aCBwb2ludGVycyBhcmUgYWxpZ25lZCAqLworI2Vsc2UKKyAgICAgICAgICAgIGlmICh0ID49IDIgKiA0IC0gKDMgLSAxKSAmJiAob3AgLSBtX3BvcykgPj0gNCkKKyAgICAgICAgICAgIHsKKyNlbmRpZgorICAgICAgICAgICAgICAgIFVBX0NPUFk0KG9wLG1fcG9zKTsKKyAgICAgICAgICAgICAgICBvcCArPSA0OyBtX3BvcyArPSA0OyB0IC09IDQgLSAoMyAtIDEpOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgVUFfQ09QWTQob3AsbV9wb3MpOworICAgICAgICAgICAgICAgICAgICBvcCArPSA0OyBtX3BvcyArPSA0OyB0IC09IDQ7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodCA+PSA0KTsKKyAgICAgICAgICAgICAgICBpZiAodCA+IDApIGRvICpvcCsrID0gKm1fcG9zKys7IHdoaWxlICgtLXQgPiAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworY29weV9tYXRjaDoKKyAgICAgICAgICAgICAgICAqb3ArKyA9ICptX3BvcysrOyAqb3ArKyA9ICptX3BvcysrOworICAgICAgICAgICAgICAgIGRvICpvcCsrID0gKm1fcG9zKys7IHdoaWxlICgtLXQgPiAwKTsKKyAgICAgICAgICAgIH0KKworI2VuZGlmIC8qIENPUFlfRElDVCAqLworCittYXRjaF9kb25lOgorI2lmIGRlZmluZWQoTFpPMVopCisgICAgICAgICAgICB0ID0gaXBbLTFdICYgMzsKKyNlbHNlCisgICAgICAgICAgICB0ID0gaXBbLTJdICYgMzsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKHQgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogY29weSBsaXRlcmFscyAqLworbWF0Y2hfbmV4dDoKKyAgICAgICAgICAgIGFzc2VydCh0ID4gMCk7IGFzc2VydCh0IDwgNCk7IE5FRURfT1AodCk7IE5FRURfSVAodCszKTsKKyNpZiAwCisgICAgICAgICAgICBkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisjZWxzZQorICAgICAgICAgICAgKm9wKysgPSAqaXArKzsKKyAgICAgICAgICAgIGlmICh0ID4gMSkgeyAqb3ArKyA9ICppcCsrOyBpZiAodCA+IDIpIHsgKm9wKysgPSAqaXArKzsgfSB9CisjZW5kaWYKKyAgICAgICAgICAgIHQgPSAqaXArKzsKKyAgICAgICAgfQorICAgIH0KKworZW9mX2ZvdW5kOgorICAgICpvdXRfbGVuID0gcGQob3AsIG91dCk7CisgICAgcmV0dXJuIChpcCA9PSBpcF9lbmQgPyBMWk9fRV9PSyA6CisgICAgICAgICAgIChpcCA8IGlwX2VuZCAgPyBMWk9fRV9JTlBVVF9OT1RfQ09OU1VNRUQgOiBMWk9fRV9JTlBVVF9PVkVSUlVOKSk7CisKKworI2lmIGRlZmluZWQoSEFWRV9ORUVEX0lQKQoraW5wdXRfb3ZlcnJ1bjoKKyAgICAqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworICAgIHJldHVybiBMWk9fRV9JTlBVVF9PVkVSUlVOOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfTkVFRF9PUCkKK291dHB1dF9vdmVycnVuOgorICAgICpvdXRfbGVuID0gcGQob3AsIG91dCk7CisgICAgcmV0dXJuIExaT19FX09VVFBVVF9PVkVSUlVOOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKExaT19URVNUX09WRVJSVU5fTE9PS0JFSElORCkKK2xvb2tiZWhpbmRfb3ZlcnJ1bjoKKyAgICAqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworICAgIHJldHVybiBMWk9fRV9MT09LQkVISU5EX09WRVJSVU47CisjZW5kaWYKK30KKworCisvKgordmk6dHM9NDpldAorKi8KKwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem8xeF9kMS5jIGIvbHpvL3NyYy9sem8xeF9kMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNDJhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vc3JjL2x6bzF4X2QxLmMKQEAgLTAsMCArMSwzNCBAQAorLyogbHpvMXhfZDEuYyAtLSBMWk8xWCBkZWNvbXByZXNzaW9uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2luY2x1ZGUgImNvbmZpZzF4LmgiCisKKyN1bmRlZiBMWk9fVEVTVF9PVkVSUlVOCisjZGVmaW5lIERPX0RFQ09NUFJFU1MgICAgICAgbHpvMXhfZGVjb21wcmVzcworCisjaW5jbHVkZSAibHpvMXhfZC5jaCIKZGlmZiAtLWdpdCBhL2x6by9zcmMvbHpvMXhfZDIuYyBiL2x6by9zcmMvbHpvMXhfZDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc1MjJjCi0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9sem8xeF9kMi5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIGx6bzF4X2QyLmMgLS0gTFpPMVggZGVjb21wcmVzc2lvbiB3aXRoIG92ZXJydW4gdGVzdGluZworCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKyNpbmNsdWRlICJjb25maWcxeC5oIgorCisjZGVmaW5lIExaT19URVNUX09WRVJSVU4gMQorI2RlZmluZSBET19ERUNPTVBSRVNTICAgICAgIGx6bzF4X2RlY29tcHJlc3Nfc2FmZQorCisjaW5jbHVkZSAibHpvMXhfZC5jaCIKKworI2lmIGRlZmluZWQoTFpPX0FSQ0hfSTM4NikgJiYgZGVmaW5lZChMWk9fVVNFX0FTTSkKK0xaT19FWFRFUk4oaW50KSBsem8xeF9kZWNvbXByZXNzX2FzbV9zYWZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBsem9fYnl0ZXAgc3JjLCBsem9fdWludCAgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBkc3QsIGx6b191aW50cCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX3ZvaWRwIHdya21lbSk7CitMWk9fUFVCTElDKGludCkgbHpvMXhfZGVjb21wcmVzc19hc21fc2FmZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgbHpvX2J5dGVwIHNyYywgbHpvX3VpbnQgIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fYnl0ZXAgZHN0LCBsem9fdWludHAgZHN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b192b2lkcCB3cmttZW0pCit7CisgICAgcmV0dXJuIGx6bzF4X2RlY29tcHJlc3Nfc2FmZShzcmMsIHNyY19sZW4sIGRzdCwgZHN0X2xlbiwgd3JrbWVtKTsKK30KK0xaT19FWFRFUk4oaW50KSBsem8xeF9kZWNvbXByZXNzX2FzbV9mYXN0X3NhZmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtKTsKK0xaT19QVUJMSUMoaW50KSBsem8xeF9kZWNvbXByZXNzX2FzbV9mYXN0X3NhZmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGx6b19ieXRlcCBzcmMsIGx6b191aW50ICBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX2J5dGVwIGRzdCwgbHpvX3VpbnRwIGRzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtKQoreworICAgIHJldHVybiBsem8xeF9kZWNvbXByZXNzX3NhZmUoc3JjLCBzcmNfbGVuLCBkc3QsIGRzdF9sZW4sIHdya21lbSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2x6by9zcmMvbHpvMXhfZDMuYyBiL2x6by9zcmMvbHpvMXhfZDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGEwNjkyCi0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9sem8xeF9kMy5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIGx6bzF4X2QzLmMgLS0gTFpPMVggZGVjb21wcmVzc2lvbiB3aXRoIHByZXNldCBkaWN0aW9uYXJ5CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2luY2x1ZGUgImNvbmZpZzF4LmgiCisKKyNkZWZpbmUgTFpPX1RFU1RfT1ZFUlJVTiAxCisKKworI2RlZmluZSBTTE9XX01FTUNQWShhLGIsbCkgICAgICB7IGRvICphKysgPSAqYisrOyB3aGlsZSAoLS1sID4gMCk7IH0KKyNkZWZpbmUgRkFTVF9NRU1DUFkoYSxiLGwpICAgICAgeyBsem9fbWVtY3B5KGEsYixsKTsgYSArPSBsOyB9CisKKyNpZiAxICYmIGRlZmluZWQoRkFTVF9NRU1DUFkpCisjICBkZWZpbmUgRElDVF9NRU1NT1ZFKG9wLG1fcG9zLG1fbGVuLG1fb2ZmKSBcCisgICAgICAgIGlmIChtX29mZiA+PSAobV9sZW4pKSBcCisgICAgICAgICAgICBGQVNUX01FTUNQWShvcCxtX3BvcyxtX2xlbikgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIFNMT1dfTUVNQ1BZKG9wLG1fcG9zLG1fbGVuKQorI2Vsc2UKKyMgIGRlZmluZSBESUNUX01FTU1PVkUob3AsbV9wb3MsbV9sZW4sbV9vZmYpIFwKKyAgICAgICAgU0xPV19NRU1DUFkob3AsbV9wb3MsbV9sZW4pCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZBU1RfTUVNQ1BZKQorIyAgZGVmaW5lIEZBU1RfTUVNQ1BZICAgU0xPV19NRU1DUFkKKyNlbmRpZgorCisKKyNkZWZpbmUgQ09QWV9ESUNUX0RJQ1QobV9sZW4sbV9vZmYpIFwKKyAgICB7IFwKKyAgICAgICAgY29uc3QgbHpvX2J5dGVwIG1fcG9zOyBcCisgICAgICAgIG1fb2ZmIC09IHBkKG9wLCBvdXQpOyBhc3NlcnQobV9vZmYgPiAwKTsgXAorICAgICAgICBpZiAobV9vZmYgPiBkaWN0X2xlbikgZ290byBsb29rYmVoaW5kX292ZXJydW47IFwKKyAgICAgICAgbV9wb3MgPSBkaWN0X2VuZCAtIG1fb2ZmOyBcCisgICAgICAgIGlmIChtX2xlbiA+IG1fb2ZmKSBcCisgICAgICAgIHsgXAorICAgICAgICAgICAgbV9sZW4gLT0gbV9vZmY7IFwKKyAgICAgICAgICAgIEZBU1RfTUVNQ1BZKG9wLG1fcG9zLG1fb2ZmKSBcCisgICAgICAgICAgICBtX3BvcyA9IG91dDsgXAorICAgICAgICAgICAgU0xPV19NRU1DUFkob3AsbV9wb3MsbV9sZW4pIFwKKyAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgRkFTVF9NRU1DUFkob3AsbV9wb3MsbV9sZW4pIFwKKyAgICB9CisKKyNkZWZpbmUgQ09QWV9ESUNUKG1fbGVuLG1fb2ZmKSBcCisgICAgYXNzZXJ0KG1fbGVuID49IDIpOyBhc3NlcnQobV9vZmYgPiAwKTsgYXNzZXJ0KG9wID4gb3V0KTsgXAorICAgIGlmIChtX29mZiA8PSBwZChvcCwgb3V0KSkgXAorICAgIHsgXAorICAgICAgICBjb25zdCBsem9fYnl0ZXAgbV9wb3MgPSBvcCAtIG1fb2ZmOyBcCisgICAgICAgIERJQ1RfTUVNTU9WRShvcCxtX3BvcyxtX2xlbixtX29mZikgXAorICAgIH0gXAorICAgIGVsc2UgXAorICAgICAgICBDT1BZX0RJQ1RfRElDVChtX2xlbixtX29mZikKKworCisKKworTFpPX1BVQkxJQyhpbnQpCitsem8xeF9kZWNvbXByZXNzX2RpY3Rfc2FmZSAoIGNvbnN0IGx6b19ieXRlcCBpbiwgIGx6b191aW50ICBpbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBvdXQsIGx6b191aW50cCBvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtIC8qIE5PVCBVU0VEICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4pCisKKworI2luY2x1ZGUgImx6bzF4X2QuY2giCisKKworLyoKK3ZpOnRzPTQ6ZXQKKyovCisKZGlmZiAtLWdpdCBhL2x6by9zcmMvbHpvMXhfby5jIGIvbHpvL3NyYy9sem8xeF9vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzZGJhZgotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbHpvMXhfby5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGx6bzF4X28uYyAtLSBMWk8xWCBjb21wcmVzc2VkIGRhdGEgb3B0aW1pemVyCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2luY2x1ZGUgImNvbmZpZzF4LmgiCisKKyNkZWZpbmUgRE9fT1BUSU1JWkUgICAgIGx6bzF4X29wdGltaXplCisKKyNpbmNsdWRlICJsem8xeF9vby5jaCIKZGlmZiAtLWdpdCBhL2x6by9zcmMvbHpvMXhfb28uY2ggYi9sem8vc3JjL2x6bzF4X29vLmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjQwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vc3JjL2x6bzF4X29vLmNoCkBAIC0wLDAgKzEsMzU1IEBACisvKiBsem8xeF9vby5jaCAtLSBMWk8xWCBjb21wcmVzc2VkIGRhdGEgb3B0aW1pemVyCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2RlZmluZSBURVNUX0lQICAgICAoaXAgPCBpcF9lbmQpCisjZGVmaW5lIFRFU1RfT1AgICAgIChvcCA8PSBvcF9lbmQpCisjZGVmaW5lIFRFU1RfSVBfQU5EX1RFU1RfT1AgKFRFU1RfSVAgJiYgVEVTVF9PUCkKKworI2RlZmluZSBOT19MSVQgICAgICBMWk9fVUlOVF9NQVgKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNvcHkyKGx6b19ieXRlcCBpcCwgY29uc3QgbHpvX2J5dGVwIG1fcG9zLCBsem9fdWludCBvZmYpCit7CisgICAgYXNzZXJ0KG9mZiA+IDApOworICAgIGlwWzBdID0gbV9wb3NbMF07CisgICAgaWYgKG9mZiA9PSAxKQorICAgICAgICBpcFsxXSA9IG1fcG9zWzBdOworICAgIGVsc2UKKyAgICAgICAgaXBbMV0gPSBtX3Bvc1sxXTsKK30KKworCitzdGF0aWMgdm9pZCBjb3B5Myhsem9fYnl0ZXAgaXAsIGNvbnN0IGx6b19ieXRlcCBtX3BvcywgbHpvX3VpbnQgb2ZmKQoreworICAgIGFzc2VydChvZmYgPiAwKTsKKyAgICBpcFswXSA9IG1fcG9zWzBdOworICAgIGlmIChvZmYgPT0gMSkKKyAgICB7CisgICAgICAgIGlwWzJdID0gaXBbMV0gPSBtX3Bvc1swXTsKKyAgICB9CisgICAgZWxzZSBpZiAob2ZmID09IDIpCisgICAgeworICAgICAgICBpcFsxXSA9IG1fcG9zWzFdOworICAgICAgICBpcFsyXSA9IG1fcG9zWzBdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpcFsxXSA9IG1fcG9zWzFdOworICAgICAgICBpcFsyXSA9IG1fcG9zWzJdOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIG9wdGltaXplIGEgYmxvY2sgb2YgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFpPX1BVQkxJQyhpbnQpCitET19PUFRJTUlaRSAgICAgICAgICAoICAgICAgIGx6b19ieXRlcCBpbiAsIGx6b191aW50ICBpbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6b19ieXRlcCBvdXQsIGx6b191aW50cCBvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsem9fdm9pZHAgd3JrbWVtICkKK3sKKyAgICBsem9fYnl0ZXAgb3A7CisgICAgbHpvX2J5dGVwIGlwOworICAgIGx6b191aW50IHQ7CisgICAgbHpvX2J5dGVwIG1fcG9zOworICAgIGx6b19ieXRlcCBjb25zdCBpcF9lbmQgPSBpbiArIGluX2xlbjsKKyAgICBsem9fYnl0ZXAgY29uc3Qgb3BfZW5kID0gb3V0ICsgKm91dF9sZW47CisgICAgbHpvX2J5dGVwIGxpdHAgPSBOVUxMOworICAgIGx6b191aW50IGxpdCA9IDA7CisgICAgbHpvX3VpbnQgbmV4dF9saXQgPSBOT19MSVQ7CisgICAgbHpvX3VpbnQgbmw7CisgICAgdW5zaWduZWQgbG9uZyBvX20xX2EgPSAwLCBvX20xX2IgPSAwLCBvX20yID0gMCwgb19tM19hID0gMCwgb19tM19iID0gMDsKKworICAgIExaT19VTlVTRUQod3JrbWVtKTsKKworICAgICpvdXRfbGVuID0gMDsKKworICAgIG9wID0gb3V0OworICAgIGlwID0gaW47CisKKyAgICBhc3NlcnQoaW5fbGVuID49IDMpOworICAgIGlmICgqaXAgPiAxNykKKyAgICB7CisgICAgICAgIHQgPSAqaXArKyAtIDE3OworICAgICAgICBpZiAodCA8IDQpCisgICAgICAgICAgICBnb3RvIG1hdGNoX25leHQ7CisgICAgICAgIGdvdG8gZmlyc3RfbGl0ZXJhbF9ydW47CisgICAgfQorICAgIGFzc2VydCgqaXAgPCAxNiB8fCAoKmlwID09IDE3ICYmIGluX2xlbiA9PSAzKSk7CisKKyAgICB3aGlsZSAoVEVTVF9JUF9BTkRfVEVTVF9PUCkKKyAgICB7CisgICAgICAgIHQgPSAqaXArKzsKKyAgICAgICAgaWYgKHQgPj0gMTYpCisgICAgICAgICAgICBnb3RvIG1hdGNoOworICAgICAgICAvKiBhIGxpdGVyYWwgcnVuICovCisgICAgICAgIGxpdHAgPSBpcCAtIDE7CisgICAgICAgIGlmICh0ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHQgPSAxNTsKKyAgICAgICAgICAgIHdoaWxlICgqaXAgPT0gMCkKKyAgICAgICAgICAgICAgICB0ICs9IDI1NSwgaXArKzsKKyAgICAgICAgICAgIHQgKz0gKmlwKys7CisgICAgICAgIH0KKyAgICAgICAgbGl0ID0gdCArIDM7CisgICAgICAgIC8qIGNvcHkgbGl0ZXJhbHMgKi8KK2NvcHlfbGl0ZXJhbF9ydW46CisgICAgICAgICpvcCsrID0gKmlwKys7ICpvcCsrID0gKmlwKys7ICpvcCsrID0gKmlwKys7CitmaXJzdF9saXRlcmFsX3J1bjoKKyAgICAgICAgZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworCisKKyAgICAgICAgdCA9ICppcCsrOworCisgICAgICAgIGlmICh0ID49IDE2KQorICAgICAgICAgICAgZ290byBtYXRjaDsKKyNpZiBkZWZpbmVkKExaTzFYKQorICAgICAgICBtX3BvcyA9IG9wIC0gMSAtIDB4ODAwOworI2VsaWYgZGVmaW5lZChMWk8xWSkKKyAgICAgICAgbV9wb3MgPSBvcCAtIDEgLSAweDQwMDsKKyNlbmRpZgorICAgICAgICBtX3BvcyAtPSB0ID4+IDI7CisgICAgICAgIG1fcG9zIC09ICppcCsrIDw8IDI7CisgICAgICAgICpvcCsrID0gKm1fcG9zKys7ICpvcCsrID0gKm1fcG9zKys7ICpvcCsrID0gKm1fcG9zKys7CisgICAgICAgIGxpdCA9IDA7CisgICAgICAgIGdvdG8gbWF0Y2hfZG9uZTsKKworCisgICAgICAgIC8qIGhhbmRsZSBtYXRjaGVzICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmICh0IDwgMTYpICAgICAgICAgICAgICAgICAgICAgLyogYSBNMSBtYXRjaCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fcG9zID0gb3AgLSAxOworICAgICAgICAgICAgICAgIG1fcG9zIC09IHQgPj4gMjsKKyAgICAgICAgICAgICAgICBtX3BvcyAtPSAqaXArKyA8PCAyOworCisgICAgICAgICAgICAgICAgaWYgKGxpdHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBjb3B5X20xOworCisgICAgICAgICAgICAgICAgLyogYXNzZXJ0IHRoYXQgdGhlcmUgd2FzIGEgbWF0Y2gganVzdCBiZWZvcmUgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQobGl0ID49IDEgJiYgbGl0IDw9IDMpOworICAgICAgICAgICAgICAgIGFzc2VydChsaXRwID09IGlwIC0gMiAtIGxpdCAtIDIpOworICAgICAgICAgICAgICAgIGFzc2VydCgobHpvX3VpbnQpKCpsaXRwICYgMykgPT0gbGl0KTsKKyAgICAgICAgICAgICAgICBubCA9IGlwWy0yXSAmIDM7CisgICAgICAgICAgICAgICAgLyogdGVzdCBpZiBhIG1hdGNoIGZvbGxvd3MgKi8KKyAgICAgICAgICAgICAgICBpZiAobmwgPT0gMCAmJiBsaXQgPT0gMSAmJiBpcFswXSA+PSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5leHRfbGl0ID0gbmw7CisgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdCBsZW5ndGggb2YgcHJldmlvdXMgc2hvcnQgcnVuICovCisgICAgICAgICAgICAgICAgICAgIGxpdCArPSAyOworICAgICAgICAgICAgICAgICAgICAqbGl0cCA9IExaT19CWVRFKCgqbGl0cCAmIH4zKSB8IGxpdCk7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgb3ZlciB0aGUgMiBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisgICAgICAgICAgICAgICAgICAgIGNvcHkyKGlwLTIsbV9wb3MscGQob3AsbV9wb3MpKTsKKyAgICAgICAgICAgICAgICAgICAgb19tMV9hKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIHRlc3QgaWYgYSBsaXRlcmFsIHJ1biBmb2xsb3dzICovCisgICAgICAgICAgICAgICAgZWxzZSBpZiAobmwgPT0gMCAmJiBpcFswXSA8IDE2ICYmIGlwWzBdICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAobGl0ICsgMiArIGlwWzBdIDwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdCA9ICppcCsrOworICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgc2hvcnQgcnVuICovCisgICAgICAgICAgICAgICAgICAgICpsaXRwICY9IH4zOworICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IG92ZXIgdGhlIDIgbGl0ZXJhbHMgdGhhdCByZXBsYWNlIHRoZSBtYXRjaCAqLworICAgICAgICAgICAgICAgICAgICBjb3B5MihpcC0zKzEsbV9wb3MscGQob3AsbV9wb3MpKTsKKyAgICAgICAgICAgICAgICAgICAgLyogbW92ZSBsaXRlcmFscyAxIGJ5dGUgYWhlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgbGl0cCArPSAyOworICAgICAgICAgICAgICAgICAgICBpZiAobGl0ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGx6b19tZW1tb3ZlKGxpdHArMSxsaXRwLGxpdCk7CisgICAgICAgICAgICAgICAgICAgIC8qIGluc2VydCBuZXcgbGVuZ3RoIG9mIGxvbmcgbGl0ZXJhbCBydW4gKi8KKyAgICAgICAgICAgICAgICAgICAgbGl0ICs9IDIgKyB0ICsgMzsgYXNzZXJ0KGxpdCA8PSAxOCk7CisgICAgICAgICAgICAgICAgICAgICpsaXRwID0gTFpPX0JZVEUobGl0IC0gMyk7CisKKyAgICAgICAgICAgICAgICAgICAgb19tMV9iKys7CisgICAgICAgICAgICAgICAgICAgICpvcCsrID0gKm1fcG9zKys7ICpvcCsrID0gKm1fcG9zKys7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gY29weV9saXRlcmFsX3J1bjsKKyAgICAgICAgICAgICAgICB9Citjb3B5X20xOgorICAgICAgICAgICAgICAgICpvcCsrID0gKm1fcG9zKys7ICpvcCsrID0gKm1fcG9zKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CittYXRjaDoKKyAgICAgICAgICAgICAgICBpZiAodCA+PSA2NCkgICAgICAgICAgICAgICAgLyogYSBNMiBtYXRjaCAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbV9wb3MgPSBvcCAtIDE7CisjaWYgZGVmaW5lZChMWk8xWCkKKyAgICAgICAgICAgICAgICAgICAgbV9wb3MgLT0gKHQgPj4gMikgJiA3OworICAgICAgICAgICAgICAgICAgICBtX3BvcyAtPSAqaXArKyA8PCAzOworICAgICAgICAgICAgICAgICAgICB0ID0gKHQgPj4gNSkgLSAxOworI2VsaWYgZGVmaW5lZChMWk8xWSkKKyAgICAgICAgICAgICAgICAgICAgbV9wb3MgLT0gKHQgPj4gMikgJiAzOworICAgICAgICAgICAgICAgICAgICBtX3BvcyAtPSAqaXArKyA8PCAyOworICAgICAgICAgICAgICAgICAgICB0ID0gKHQgPj4gNCkgLSAzOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmIChsaXRwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNvcHlfbTsKKworICAgICAgICAgICAgICAgICAgICBubCA9IGlwWy0yXSAmIDM7CisgICAgICAgICAgICAgICAgICAgIC8qIHRlc3QgaWYgaW4gYmVldHdlZW4gdHdvIGxvbmcgbGl0ZXJhbCBydW5zICovCisgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IDEgJiYgbGl0ID4gMyAmJiBubCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBpcFswXSA8IDE2ICYmIGlwWzBdICE9IDAgJiYgKGxpdCArIDMgKyBpcFswXSA8IDE2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCpsaXRwID09IGxpdCAtIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICppcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBvdmVyIHRoZSAzIGxpdGVyYWxzIHRoYXQgcmVwbGFjZSB0aGUgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkzKGlwLTEtMixtX3BvcyxwZChvcCxtX3BvcykpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG5ldyBsZW5ndGggb2YgcHJldmlvdXMgbGl0ZXJhbCBydW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpdCArPSAzICsgdCArIDM7IGFzc2VydChsaXQgPD0gMTgpOworICAgICAgICAgICAgICAgICAgICAgICAgKmxpdHAgPSBMWk9fQllURShsaXQgLSAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9fbTIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvcCsrID0gKm1fcG9zKys7ICpvcCsrID0gKm1fcG9zKys7ICpvcCsrID0gKm1fcG9zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNvcHlfbGl0ZXJhbF9ydW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQgPj0gMzIpICAgICAgICAgICAgLyogYSBNMyBtYXRjaCAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ICY9IDMxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gMzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCppcCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IDI1NSwgaXArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9ICppcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3MgPSBvcCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcyAtPSAqaXArKyA+PiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3MgLT0gKmlwKysgPDwgNjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAvKiBhIE00IG1hdGNoICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9zID0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcyAtPSAodCAmIDgpIDw8IDExOworICAgICAgICAgICAgICAgICAgICAgICAgdCAmPSA3OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gNzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmlwID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gMjU1LCBpcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gKmlwKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BvcyAtPSAqaXArKyA+PiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbV9wb3MgLT0gKmlwKysgPDwgNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BvcyA9PSBvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVvZl9mb3VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9zIC09IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGl0cCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjb3B5X207CisKKyAgICAgICAgICAgICAgICAgICAgbmwgPSBpcFstMl0gJiAzOworICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IGlmIGluIGJlZXR3ZWVuIHR3byBtYXRjaGVzICovCisgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IDEgJiYgbGl0ID09IDAgJiYgbmwgPT0gMCAmJiBpcFswXSA+PSAxNikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGxpdHAgPT0gaXAgLSAzIC0gbGl0IC0gMik7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoKGx6b191aW50KSgqbGl0cCAmIDMpID09IGxpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2xpdCA9IG5sOworICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBhIHByZXZpb3VzIHNob3J0IHJ1biAqLworICAgICAgICAgICAgICAgICAgICAgICAgbGl0ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAqbGl0cCA9IExaT19CWVRFKCgqbGl0cCAmIH4zKSB8IGxpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IG92ZXIgdGhlIDMgbGl0ZXJhbHMgdGhhdCByZXBsYWNlIHRoZSBtYXRjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29weTMoaXAtMyxtX3BvcyxwZChvcCxtX3BvcykpOworICAgICAgICAgICAgICAgICAgICAgICAgb19tM19hKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBpZiBhIGxpdGVyYWwgcnVuIGZvbGxvd3MgKi8KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodCA9PSAxICYmIGxpdCA8PSAzICYmIG5sID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBbMF0gPCAxNiAmJiBpcFswXSAhPSAwICYmIChsaXQgKyAzICsgaXBbMF0gPCAxNikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChsaXRwID09IGlwIC0gMyAtIGxpdCAtIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KChsem9fdWludCkoKmxpdHAgJiAzKSA9PSBsaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICppcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHNob3J0IHJ1biAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmxpdHAgJj0gfjM7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IG92ZXIgdGhlIDMgbGl0ZXJhbHMgdGhhdCByZXBsYWNlIHRoZSBtYXRjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29weTMoaXAtNCsxLG1fcG9zLHBkKG9wLG1fcG9zKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3ZlIGxpdGVyYWxzIDEgYnl0ZSBhaGVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgbGl0cCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpdCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpvX21lbW1vdmUobGl0cCsxLGxpdHAsbGl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluc2VydCBuZXcgbGVuZ3RoIG9mIGxvbmcgbGl0ZXJhbCBydW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpdCArPSAzICsgdCArIDM7IGFzc2VydChsaXQgPD0gMTgpOworICAgICAgICAgICAgICAgICAgICAgICAgKmxpdHAgPSBMWk9fQllURShsaXQgLSAzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb19tM19iKys7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3ArKyA9ICptX3BvcysrOyAqb3ArKyA9ICptX3BvcysrOyAqb3ArKyA9ICptX3BvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjb3B5X2xpdGVyYWxfcnVuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorY29weV9tOgorICAgICAgICAgICAgICAgICpvcCsrID0gKm1fcG9zKys7ICpvcCsrID0gKm1fcG9zKys7CisgICAgICAgICAgICAgICAgZG8gKm9wKysgPSAqbV9wb3MrKzsgd2hpbGUgKC0tdCA+IDApOworICAgICAgICAgICAgfQorCittYXRjaF9kb25lOgorICAgICAgICAgICAgaWYgKG5leHRfbGl0ID09IE5PX0xJVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gaXBbLTJdICYgMzsKKyAgICAgICAgICAgICAgICBsaXQgPSB0OworICAgICAgICAgICAgICAgIGxpdHAgPSBpcCAtIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdCA9IG5leHRfbGl0OworICAgICAgICAgICAgYXNzZXJ0KHQgPD0gMyk7CisgICAgICAgICAgICBuZXh0X2xpdCA9IE5PX0xJVDsKKyAgICAgICAgICAgIGlmICh0ID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBjb3B5IGxpdGVyYWxzICovCittYXRjaF9uZXh0OgorICAgICAgICAgICAgZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworICAgICAgICAgICAgdCA9ICppcCsrOworICAgICAgICB9IHdoaWxlIChURVNUX0lQX0FORF9URVNUX09QKTsKKyAgICB9CisKKyAgICAvKiBubyBFT0YgY29kZSB3YXMgZm91bmQgKi8KKyAgICAqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworICAgIHJldHVybiBMWk9fRV9FT0ZfTk9UX0ZPVU5EOworCitlb2ZfZm91bmQ6CisgICAgYXNzZXJ0KHQgPT0gMSk7CisjaWYgMAorICAgIHByaW50Zigib3B0aW1pemU6ICU1bHUgJTVsdSAgICU1bHUgICAlNWx1ICU1bHVcbiIsCisgICAgICAgICAgIG9fbTFfYSwgb19tMV9iLCBvX20yLCBvX20zX2EsIG9fbTNfYik7CisjZW5kaWYKKyAgICBMWk9fVU5VU0VEKG9fbTFfYSk7IExaT19VTlVTRUQob19tMV9iKTsgTFpPX1VOVVNFRChvX20yKTsKKyAgICBMWk9fVU5VU0VEKG9fbTNfYSk7IExaT19VTlVTRUQob19tM19iKTsKKyAgICAqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworICAgIHJldHVybiAoaXAgPT0gaXBfZW5kID8gTFpPX0VfT0sgOgorICAgICAgICAgICAoaXAgPCBpcF9lbmQgID8gTFpPX0VfSU5QVVRfTk9UX0NPTlNVTUVEIDogTFpPX0VfSU5QVVRfT1ZFUlJVTikpOworfQorCisKKy8qCit2aTp0cz00OmV0CisqLworCmRpZmYgLS1naXQgYS9sem8vc3JjL2x6b19jb25mLmggYi9sem8vc3JjL2x6b19jb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0M2IxNAotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbHpvX2NvbmYuaApAQCAtMCwwICsxLDM5MCBAQAorLyogbHpvX2NvbmYuaCAtLSBtYWluIGludGVybmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIHRoZSBMWk8gbGlicmFyeQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSBhbmQgaXMgc3ViamVjdAorICAgdG8gY2hhbmdlLgorICovCisKKworI2lmbmRlZiBfX0xaT19DT05GX0gKKyNkZWZpbmUgX19MWk9fQ09ORl9IIDEKKworI2lmICFkZWZpbmVkKF9fTFpPX0lOX01JTklMWk8pCisjaWYgZGVmaW5lZChMWk9fQ0ZHX0ZSRUVTVEFORElORykgJiYgKExaT19DRkdfRlJFRVNUQU5ESU5HKQorIyAgZGVmaW5lIExaT19MSUJDX0ZSRUVTVEFORElORyAxCisjICBkZWZpbmUgTFpPX09TX0ZSRUVTVEFORElORyAxCisjZW5kaWYKKyNpZiBkZWZpbmVkKExaT19DRkdfRVhUUkFfQ09ORklHX0hFQURFUikKKyMgIGluY2x1ZGUgTFpPX0NGR19FWFRSQV9DT05GSUdfSEVBREVSCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTFpPQ09ORl9IKSB8fCBkZWZpbmVkKF9fTFpPQ09ORl9IX0lOQ0xVREVEKQorIyAgZXJyb3IgImluY2x1ZGUgdGhpcyBmaWxlIGZpcnN0IgorI2VuZGlmCisjaW5jbHVkZSAibHpvL2x6b2NvbmYuaCIKKyNpZiBkZWZpbmVkKExaT19DRkdfRVhUUkFfQ09ORklHX0hFQURFUjIpCisjICBpbmNsdWRlIExaT19DRkdfRVhUUkFfQ09ORklHX0hFQURFUjIKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAoTFpPX1ZFUlNJT04gPCAweDIwNzApIHx8ICFkZWZpbmVkKF9fTFpPQ09ORl9IX0lOQ0xVREVEKQorIyAgZXJyb3IgInZlcnNpb24gbWlzbWF0Y2giCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIHByYWdtYXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMDAwICYmIF9NU0NfVkVSIDwgMTEwMCkpCisgICAvKiBkaXNhYmxlIGJvZ3VzICJ1bnJlYWNoYWJsZSBjb2RlIiB3YXJuaW5ncyAqLworIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDcwMikKKyNlbmRpZgorI2lmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMDAwKSkKKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQxMjcgNDcwMSkKKyAgIC8qIGRpc2FibGUgd2FybmluZ3MgYWJvdXQgaW5saW5pbmcgKi8KKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ1MTQgNDcxMCA0NzExKQorI2VuZGlmCisjaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEzMDApKQorICAgLyogZGlzYWJsZSAnLVdhbGwnIHdhcm5pbmdzIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMgKi8KKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ4MjApCisjZW5kaWYKKyNpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTgwMCkpCisgICAvKiBkaXNhYmxlICctV2FsbCcgd2FybmluZ3MgaW4gc3lzdGVtIGhlYWRlciBmaWxlcyAqLworIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDc0NikKKyNlbmRpZgorCisjaWYgKExaT19DQ19TVU5QUk9DKQorI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgcHJhZ21hIGVycm9yX21lc3NhZ2VzKG9mZixFX0VORF9PRl9MT09QX0NPREVfTk9UX1JFQUNIRUQpCisjICBwcmFnbWEgZXJyb3JfbWVzc2FnZXMob2ZmLEVfTE9PUF9OT1RfRU5URVJFRF9BVF9UT1ApCisjICBwcmFnbWEgZXJyb3JfbWVzc2FnZXMob2ZmLEVfU1RBVEVNRU5UX05PVF9SRUFDSEVEKQorI2VuZGlmCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKF9fTFpPX0lOX01JTklMWk8pIHx8IChMWk9fQ0ZHX0ZSRUVTVEFORElORykKKyNlbGlmIDEKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyMgIGRlZmluZSBMWk9fV0FOVF9BQ0NfSU5DRF9IIDEKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX0hBVkVfQ09ORklHX0gpCisjICBkZWZpbmUgTFpPX0NGR19OT19DT05GSUdfSEVBREVSIDEKKyNlbmRpZgorI2luY2x1ZGUgImx6b19zdXBwLmgiCisKKy8qIEludGVncmFsIHR5cGVzICovCisjaWYgMSB8fCBkZWZpbmVkKGx6b19pbnQ4X3QpIHx8IGRlZmluZWQobHpvX3VpbnQ4X3QpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQ4X3QpICA9PSAxKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludDhfdCkgPT0gMSkKKyNlbmRpZgorI2lmIDEgfHwgZGVmaW5lZChsem9faW50MTZfdCkgfHwgZGVmaW5lZChsem9fdWludDE2X3QpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKGx6b19pbnQxNl90KSAgPT0gMikKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX3VpbnQxNl90KSA9PSAyKQorI2VuZGlmCisjaWYgMSB8fCBkZWZpbmVkKGx6b19pbnQzMl90KSB8fCBkZWZpbmVkKGx6b191aW50MzJfdCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDMyX3QpICA9PSA0KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludDMyX3QpID09IDQpCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NF90KSB8fCBkZWZpbmVkKGx6b191aW50NjRfdCkKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YobHpvX2ludDY0X3QpICA9PSA4KQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZihsem9fdWludDY0X3QpID09IDgpCisjZW5kaWYKKworI2lmIChMWk9fQ0ZHX0ZSRUVTVEFORElORykKKyMgIHVuZGVmIEhBVkVfTUVNQ01QCisjICB1bmRlZiBIQVZFX01FTUNQWQorIyAgdW5kZWYgSEFWRV9NRU1NT1ZFCisjICB1bmRlZiBIQVZFX01FTVNFVAorI2VuZGlmCisKKyNpZiAhKEhBVkVfTUVNQ01QKQorIyAgdW5kZWYgbWVtY21wCisjICBkZWZpbmUgbWVtY21wKGEsYixjKSAgICAgICAgIGx6b19tZW1jbXAoYSxiLGMpCisjZWxzZQorIyAgdW5kZWYgbHpvX21lbWNtcAorIyAgZGVmaW5lIGx6b19tZW1jbXAoYSxiLGMpICAgICBtZW1jbXAoYSxiLGMpCisjZW5kaWYKKyNpZiAhKEhBVkVfTUVNQ1BZKQorIyAgdW5kZWYgbWVtY3B5CisjICBkZWZpbmUgbWVtY3B5KGEsYixjKSAgICAgICAgIGx6b19tZW1jcHkoYSxiLGMpCisjZWxzZQorIyAgdW5kZWYgbHpvX21lbWNweQorIyAgZGVmaW5lIGx6b19tZW1jcHkoYSxiLGMpICAgICBtZW1jcHkoYSxiLGMpCisjZW5kaWYKKyNpZiAhKEhBVkVfTUVNTU9WRSkKKyMgIHVuZGVmIG1lbW1vdmUKKyMgIGRlZmluZSBtZW1tb3ZlKGEsYixjKSAgICAgICAgbHpvX21lbW1vdmUoYSxiLGMpCisjZWxzZQorIyAgdW5kZWYgbHpvX21lbW1vdmUKKyMgIGRlZmluZSBsem9fbWVtbW92ZShhLGIsYykgICAgbWVtbW92ZShhLGIsYykKKyNlbmRpZgorI2lmICEoSEFWRV9NRU1TRVQpCisjICB1bmRlZiBtZW1zZXQKKyMgIGRlZmluZSBtZW1zZXQoYSxiLGMpICAgICAgICAgbHpvX21lbXNldChhLGIsYykKKyNlbHNlCisjICB1bmRlZiBsem9fbWVtc2V0CisjICBkZWZpbmUgbHpvX21lbXNldChhLGIsYykgICAgIG1lbXNldChhLGIsYykKKyNlbmRpZgorCisjdW5kZWYgTkRFQlVHCisjaWYgKExaT19DRkdfRlJFRVNUQU5ESU5HKQorIyAgdW5kZWYgTFpPX0RFQlVHCisjICBkZWZpbmUgTkRFQlVHIDEKKyMgIHVuZGVmIGFzc2VydAorIyAgZGVmaW5lIGFzc2VydChlKSAoKHZvaWQpMCkKKyNlbHNlCisjICBpZiAhZGVmaW5lZChMWk9fREVCVUcpCisjICAgIGRlZmluZSBOREVCVUcgMQorIyAgZW5kaWYKKyMgIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyNpZiAwICYmIGRlZmluZWQoX19CT1VORFNfQ0hFQ0tJTkdfT04pCisjICBpbmNsdWRlIDx1bmNoZWNrZWQuaD4KKyNlbHNlCisjICBkZWZpbmUgQk9VTkRTX0NIRUNLSU5HX09GRl9EVVJJTkcoc3RtdCkgICAgICBzdG10CisjICBkZWZpbmUgQk9VTkRTX0NIRUNLSU5HX09GRl9JTl9FWFBSKGV4cHIpICAgICAoZXhwcikKKyNlbmRpZgorCisjaWYgKExaT19DRkdfUEdPKQorIyAgdW5kZWYgX19sem9fbGlrZWx5CisjICB1bmRlZiBfX2x6b191bmxpa2VseQorIyAgZGVmaW5lIF9fbHpvX2xpa2VseShlKSAgICAgICAoZSkKKyMgIGRlZmluZSBfX2x6b191bmxpa2VseShlKSAgICAgKGUpCisjZW5kaWYKKworI3VuZGVmIF8KKyN1bmRlZiBfXworI3VuZGVmIF9fXworI3VuZGVmIF9fX18KKyN1bmRlZiBfcDAKKyN1bmRlZiBfcDEKKyN1bmRlZiBfcDIKKyN1bmRlZiBfcDMKKyN1bmRlZiBfcDQKKyN1bmRlZiBfczAKKyN1bmRlZiBfczEKKyN1bmRlZiBfczIKKyN1bmRlZiBfczMKKyN1bmRlZiBfczQKKyN1bmRlZiBfd3cKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAxCisjICBkZWZpbmUgTFpPX0JZVEUoeCkgICAgICAgKCh1bnNpZ25lZCBjaGFyKSAoeCkpCisjZWxzZQorIyAgZGVmaW5lIExaT19CWVRFKHgpICAgICAgICgodW5zaWduZWQgY2hhcikgKCh4KSAmIDB4ZmYpKQorI2VuZGlmCisKKyNkZWZpbmUgTFpPX01BWChhLGIpICAgICAgICAoKGEpID49IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTFpPX01JTihhLGIpICAgICAgICAoKGEpIDw9IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTFpPX01BWDMoYSxiLGMpICAgICAoKGEpID49IChiKSA/IExaT19NQVgoYSxjKSA6IExaT19NQVgoYixjKSkKKyNkZWZpbmUgTFpPX01JTjMoYSxiLGMpICAgICAoKGEpIDw9IChiKSA/IExaT19NSU4oYSxjKSA6IExaT19NSU4oYixjKSkKKworI2RlZmluZSBsem9fc2l6ZW9mKHR5cGUpICAgICgobHpvX3VpbnQpIChzaXplb2YodHlwZSkpKQorCisjZGVmaW5lIExaT19ISUdIKGFycmF5KSAgICAgKChsem9fdWludCkgKHNpemVvZihhcnJheSkvc2l6ZW9mKCooYXJyYXkpKSkpCisKKy8qIHRoaXMgYWx3YXlzIGZpdHMgaW50byAzMiBiaXRzICovCisjZGVmaW5lIExaT19TSVpFKGJpdHMpICAgICAgKDF1IDw8IChiaXRzKSkKKyNkZWZpbmUgTFpPX01BU0soYml0cykgICAgICAoTFpPX1NJWkUoYml0cykgLSAxKQorCisjZGVmaW5lIExaT19VU0laRShiaXRzKSAgICAgKChsem9fdWludCkgMSA8PCAoYml0cykpCisjZGVmaW5lIExaT19VTUFTSyhiaXRzKSAgICAgKExaT19VU0laRShiaXRzKSAtIDEpCisKKyNpZiAhZGVmaW5lZChETVVMKQorI2lmIDAKKyAgIC8qIDMyKjMyIG11bHRpcGxpZXMgbWF5IGJlIGZhc3RlciB0aGFuIDY0KjY0IG9uIHNvbWUgNjQtYml0IG1hY2hpbmVzLAorICAgICogYnV0IHRoZW4gd2UgbmVlZCBleHRyYSBjYXN0cyBmcm9tIHVuc2lnbmVkPC0+c2l6ZV90ICovCisjICBkZWZpbmUgRE1VTChhLGIpICgobHpvX3hpbnQpICgobHpvX3VpbnQzMl90KShhKSAqIChsem9fdWludDMyX3QpKGIpKSkKKyNlbHNlCisjICBkZWZpbmUgRE1VTChhLGIpICgobHpvX3hpbnQpICgoYSkgKiAoYikpKQorI2VuZGlmCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGNvbXBpbGVyIGFuZCBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgc3R1ZmYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU29tZSBkZWZpbmVzIHRoYXQgaW5kaWNhdGUgaWYgbWVtb3J5IGNhbiBiZSBhY2Nlc3NlZCBhdCB1bmFsaWduZWQKKyAqIG1lbW9yeSBhZGRyZXNzZXMuIFlvdSBzaG91bGQgYWxzbyB0ZXN0IHRoYXQgdGhpcyBpcyBhY3R1YWxseSBmYXN0ZXIKKyAqIGV2ZW4gaWYgaXQgaXMgYWxsb3dlZCBieSB5b3VyIHN5c3RlbS4KKyAqLworCisjaW5jbHVkZSAibHpvX2Z1bmMuaCIKKworI2lmbmRlZiBVQV9TRVQxCisjZGVmaW5lIFVBX1NFVDEgICAgICAgICAgICAgTFpPX01FTU9QU19TRVQxCisjZW5kaWYKKyNpZm5kZWYgVUFfU0VUMgorI2RlZmluZSBVQV9TRVQyICAgICAgICAgICAgIExaT19NRU1PUFNfU0VUMgorI2VuZGlmCisjaWZuZGVmIFVBX1NFVDMKKyNkZWZpbmUgVUFfU0VUMyAgICAgICAgICAgICBMWk9fTUVNT1BTX1NFVDMKKyNlbmRpZgorI2lmbmRlZiBVQV9TRVQ0CisjZGVmaW5lIFVBX1NFVDQgICAgICAgICAgICAgTFpPX01FTU9QU19TRVQ0CisjZW5kaWYKKyNpZm5kZWYgVUFfTU9WRTEKKyNkZWZpbmUgVUFfTU9WRTEgICAgICAgICAgICBMWk9fTUVNT1BTX01PVkUxCisjZW5kaWYKKyNpZm5kZWYgVUFfTU9WRTIKKyNkZWZpbmUgVUFfTU9WRTIgICAgICAgICAgICBMWk9fTUVNT1BTX01PVkUyCisjZW5kaWYKKyNpZm5kZWYgVUFfTU9WRTMKKyNkZWZpbmUgVUFfTU9WRTMgICAgICAgICAgICBMWk9fTUVNT1BTX01PVkUzCisjZW5kaWYKKyNpZm5kZWYgVUFfTU9WRTQKKyNkZWZpbmUgVUFfTU9WRTQgICAgICAgICAgICBMWk9fTUVNT1BTX01PVkU0CisjZW5kaWYKKyNpZm5kZWYgVUFfTU9WRTgKKyNkZWZpbmUgVUFfTU9WRTggICAgICAgICAgICBMWk9fTUVNT1BTX01PVkU4CisjZW5kaWYKKyNpZm5kZWYgVUFfQ09QWTEKKyNkZWZpbmUgVUFfQ09QWTEgICAgICAgICAgICBMWk9fTUVNT1BTX0NPUFkxCisjZW5kaWYKKyNpZm5kZWYgVUFfQ09QWTIKKyNkZWZpbmUgVUFfQ09QWTIgICAgICAgICAgICBMWk9fTUVNT1BTX0NPUFkyCisjZW5kaWYKKyNpZm5kZWYgVUFfQ09QWTMKKyNkZWZpbmUgVUFfQ09QWTMgICAgICAgICAgICBMWk9fTUVNT1BTX0NPUFkzCisjZW5kaWYKKyNpZm5kZWYgVUFfQ09QWTQKKyNkZWZpbmUgVUFfQ09QWTQgICAgICAgICAgICBMWk9fTUVNT1BTX0NPUFk0CisjZW5kaWYKKyNpZm5kZWYgVUFfQ09QWTgKKyNkZWZpbmUgVUFfQ09QWTggICAgICAgICAgICBMWk9fTUVNT1BTX0NPUFk4CisjZW5kaWYKKyNpZm5kZWYgVUFfQ09QWU4KKyNkZWZpbmUgVUFfQ09QWU4gICAgICAgICAgICBMWk9fTUVNT1BTX0NPUFlOCisjZW5kaWYKKyNpZm5kZWYgVUFfQ09QWU5fWAorI2RlZmluZSBVQV9DT1BZTl9YICAgICAgICAgIExaT19NRU1PUFNfQ09QWU4KKyNlbmRpZgorI2lmbmRlZiBVQV9HRVRfTEUxNgorI2RlZmluZSBVQV9HRVRfTEUxNiAgICAgICAgIExaT19NRU1PUFNfR0VUX0xFMTYKKyNlbmRpZgorI2lmbmRlZiBVQV9HRVRfTEUzMgorI2RlZmluZSBVQV9HRVRfTEUzMiAgICAgICAgIExaT19NRU1PUFNfR0VUX0xFMzIKKyNlbmRpZgorI2lmZGVmIExaT19NRU1PUFNfR0VUX0xFNjQKKyNpZm5kZWYgVUFfR0VUX0xFNjQKKyNkZWZpbmUgVUFfR0VUX0xFNjQgICAgICAgICBMWk9fTUVNT1BTX0dFVF9MRTY0CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBVQV9HRVRfTkUxNgorI2RlZmluZSBVQV9HRVRfTkUxNiAgICAgICAgIExaT19NRU1PUFNfR0VUX05FMTYKKyNlbmRpZgorI2lmbmRlZiBVQV9HRVRfTkUzMgorI2RlZmluZSBVQV9HRVRfTkUzMiAgICAgICAgIExaT19NRU1PUFNfR0VUX05FMzIKKyNlbmRpZgorI2lmZGVmIExaT19NRU1PUFNfR0VUX05FNjQKKyNpZm5kZWYgVUFfR0VUX05FNjQKKyNkZWZpbmUgVUFfR0VUX05FNjQgICAgICAgICBMWk9fTUVNT1BTX0dFVF9ORTY0CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBVQV9QVVRfTEUxNgorI2RlZmluZSBVQV9QVVRfTEUxNiAgICAgICAgIExaT19NRU1PUFNfUFVUX0xFMTYKKyNlbmRpZgorI2lmbmRlZiBVQV9QVVRfTEUzMgorI2RlZmluZSBVQV9QVVRfTEUzMiAgICAgICAgIExaT19NRU1PUFNfUFVUX0xFMzIKKyNlbmRpZgorI2lmbmRlZiBVQV9QVVRfTkUxNgorI2RlZmluZSBVQV9QVVRfTkUxNiAgICAgICAgIExaT19NRU1PUFNfUFVUX05FMTYKKyNlbmRpZgorI2lmbmRlZiBVQV9QVVRfTkUzMgorI2RlZmluZSBVQV9QVVRfTkUzMiAgICAgICAgIExaT19NRU1PUFNfUFVUX05FMzIKKyNlbmRpZgorCisKKy8qIEZhc3QgbWVtY3B5IHRoYXQgY29waWVzIG11bHRpcGxlcyBvZiA4IGJ5dGUgY2h1bmtzLgorICogbGVuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuCisgKiBub3RlOiBhbGwgcGFyYW1ldGVycyBtdXN0IGJlIGx2YWx1ZXMsIGxlbiA+PSA4CisgKiAgICAgICBkZXN0IGFuZCBzcmMgYWR2YW5jZSwgbGVuIGlzIHVuZGVmaW5lZCBhZnRlcndhcmRzCisgKi8KKworI2RlZmluZSBNRU1DUFk4X0RTKGRlc3Qsc3JjLGxlbikgXAorICAgIGx6b19tZW1jcHkoZGVzdCxzcmMsbGVuKTsgZGVzdCArPSBsZW47IHNyYyArPSBsZW4KKworI2RlZmluZSBCWkVSTzhfUFRSKHMsbCxuKSBcCisgICAgbHpvX21lbXNldCgobHpvX3ZvaWRwKShzKSwwLChsem9fdWludCkobCkqKG4pKQorCisjZGVmaW5lIE1FTUNQWV9EUyhkZXN0LHNyYyxsZW4pIFwKKyAgICBkbyAqZGVzdCsrID0gKnNyYysrOyB3aGlsZSAoLS1sZW4gPiAwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFpPX0VYVEVSTihjb25zdCBsem9fYnl0ZXApIGx6b19jb3B5cmlnaHQodm9pZCk7CisKKyNpbmNsdWRlICJsem9fcHRyLmgiCisKKy8qIEdlbmVyYXRlIGNvbXByZXNzZWQgZGF0YSBpbiBhIGRldGVybWluaXN0aWMgd2F5LgorICogVGhpcyBpcyBmdWxseSBwb3J0YWJsZSwgYW5kIGNvbXByZXNzaW9uIGNhbiBiZSBmYXN0ZXIgYXMgd2VsbC4KKyAqIEEgcmVhc29uIE5PVCB0byBiZSBkZXRlcm1pbmlzdGljIGlzIHdoZW4gdGhlIGJsb2NrIHNpemUgaXMKKyAqIHZlcnkgc21hbGwgKGUuZy4gOGtCKSBvciB0aGUgZGljdGlvbmFyeSBpcyBiaWcsIGJlY2F1c2UKKyAqIHRoZW4gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBkaWN0aW9uYXJ5IGJlY29tZXMgYSByZWxldmFudAorICogbWFnbml0dWRlIGZvciBjb21wcmVzc2lvbiBzcGVlZC4KKyAqLworI2lmbmRlZiBMWk9fREVURVJNSU5JU1RJQworI2RlZmluZSBMWk9fREVURVJNSU5JU1RJQyAxCisjZW5kaWYKKworCisjaWZuZGVmIExaT19ESUNUX1VTRV9QVFIKKyNkZWZpbmUgTFpPX0RJQ1RfVVNFX1BUUiAxCisjZW5kaWYKKworI2lmIChMWk9fRElDVF9VU0VfUFRSKQorIyAgZGVmaW5lIGx6b19kaWN0X3QgICAgY29uc3QgbHpvX2J5dGVwCisjICBkZWZpbmUgbHpvX2RpY3RfcCAgICBsem9fZGljdF90ICoKKyNlbHNlCisjICBkZWZpbmUgbHpvX2RpY3RfdCAgICBsem9fdWludAorIyAgZGVmaW5lIGx6b19kaWN0X3AgICAgbHpvX2RpY3RfdCAqCisjZW5kaWYKKworCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisvKgordmk6dHM9NDpldAorKi8KKwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem9fY3JjLmMgYi9sem8vc3JjL2x6b19jcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGI3MjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9sem9fY3JjLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qIGx6b19jcmMuYyAtLSBjcmMgY2hlY2tzdW0gZm9yIHRoZSB0aGUgTFpPIGxpYnJhcnkKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaW5jbHVkZSAibHpvX2NvbmYuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGNyYzMyIGNoZWNrc3VtCisvLyBhZGFwdGVkIGZyb20gZnJlZSBjb2RlIGJ5IE1hcmsgQWRsZXIgPG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU+CisvLyBzZWUgaHR0cDovL3d3dy56bGliLm9yZy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IGx6b191aW50MzJfdCBsem9fY3JjMzJfdGFibGVbMjU2XSA9IHsKKyAgMHgwMDAwMDAwMEwsIDB4NzcwNzMwOTZMLCAweGVlMGU2MTJjTCwgMHg5OTA5NTFiYUwsIDB4MDc2ZGM0MTlMLAorICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCisgIDB4ZTBkNWU5MWVMLCAweDk3ZDJkOTg4TCwgMHgwOWI2NGMyYkwsIDB4N2ViMTdjYmRMLCAweGU3YjgyZDA3TCwKKyAgMHg5MGJmMWQ5MUwsIDB4MWRiNzEwNjRMLCAweDZhYjAyMGYyTCwgMHhmM2I5NzE0OEwsIDB4ODRiZTQxZGVMLAorICAweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwgMHgxMzZjOTg1NkwsCisgIDB4NjQ2YmE4YzBMLCAweGZkNjJmOTdhTCwgMHg4YTY1YzllY0wsIDB4MTQwMTVjNGZMLCAweDYzMDY2Y2Q5TCwKKyAgMHhmYTBmM2Q2M0wsIDB4OGQwODBkZjVMLCAweDNiNmUyMGM4TCwgMHg0YzY5MTA1ZUwsIDB4ZDU2MDQxZTRMLAorICAweGEyNjc3MTcyTCwgMHgzYzAzZTRkMUwsIDB4NGIwNGQ0NDdMLCAweGQyMGQ4NWZkTCwgMHhhNTBhYjU2YkwsCisgIDB4MzViNWE4ZmFMLCAweDQyYjI5ODZjTCwgMHhkYmJiYzlkNkwsIDB4YWNiY2Y5NDBMLCAweDMyZDg2Y2UzTCwKKyAgMHg0NWRmNWM3NUwsIDB4ZGNkNjBkY2ZMLCAweGFiZDEzZDU5TCwgMHgyNmQ5MzBhY0wsIDB4NTFkZTAwM2FMLAorICAweGM4ZDc1MTgwTCwgMHhiZmQwNjExNkwsIDB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsCisgIDB4YjhiZGE1MGZMLCAweDI4MDJiODllTCwgMHg1ZjA1ODgwOEwsIDB4YzYwY2Q5YjJMLCAweGIxMGJlOTI0TCwKKyAgMHgyZjZmN2M4N0wsIDB4NTg2ODRjMTFMLCAweGMxNjExZGFiTCwgMHhiNjY2MmQzZEwsIDB4NzZkYzQxOTBMLAorICAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLCAweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsCisgIDB4OWZiZmU0YTVMLCAweGU4YjhkNDMzTCwgMHg3ODA3YzlhMkwsIDB4MGYwMGY5MzRMLCAweDk2MDlhODhlTCwKKyAgMHhlMTBlOTgxOEwsIDB4N2Y2YTBkYmJMLCAweDA4NmQzZDJkTCwgMHg5MTY0NmM5N0wsIDB4ZTY2MzVjMDFMLAorICAweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwgMHg2YzA2OTVlZEwsCisgIDB4MWIwMWE1N2JMLCAweDgyMDhmNGMxTCwgMHhmNTBmYzQ1N0wsIDB4NjViMGQ5YzZMLCAweDEyYjdlOTUwTCwKKyAgMHg4YmJlYjhlYUwsIDB4ZmNiOTg4N2NMLCAweDYyZGQxZGRmTCwgMHgxNWRhMmQ0OUwsIDB4OGNkMzdjZjNMLAorICAweGZiZDQ0YzY1TCwgMHg0ZGIyNjE1OEwsIDB4M2FiNTUxY2VMLCAweGEzYmMwMDc0TCwgMHhkNGJiMzBlMkwsCisgIDB4NGFkZmE1NDFMLCAweDNkZDg5NWQ3TCwgMHhhNGQxYzQ2ZEwsIDB4ZDNkNmY0ZmJMLCAweDQzNjllOTZhTCwKKyAgMHgzNDZlZDlmY0wsIDB4YWQ2Nzg4NDZMLCAweGRhNjBiOGQwTCwgMHg0NDA0MmQ3M0wsIDB4MzMwMzFkZTVMLAorICAweGFhMGE0YzVmTCwgMHhkZDBkN2NjOUwsIDB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsCisgIDB4YzkwYzIwODZMLCAweDU3NjhiNTI1TCwgMHgyMDZmODViM0wsIDB4Yjk2NmQ0MDlMLCAweGNlNjFlNDlmTCwKKyAgMHg1ZWRlZjkwZUwsIDB4MjlkOWM5OThMLCAweGIwZDA5ODIyTCwgMHhjN2Q3YThiNEwsIDB4NTliMzNkMTdMLAorICAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLCAweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsCisgIDB4MDNiNmUyMGNMLCAweDc0YjFkMjlhTCwgMHhlYWQ1NDczOUwsIDB4OWRkMjc3YWZMLCAweDA0ZGIyNjE1TCwKKyAgMHg3M2RjMTY4M0wsIDB4ZTM2MzBiMTJMLCAweDk0NjQzYjg0TCwgMHgwZDZkNmEzZUwsIDB4N2E2YTVhYThMLAorICAweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwgMHhmMDBmOTM0NEwsCisgIDB4ODcwOGEzZDJMLCAweDFlMDFmMjY4TCwgMHg2OTA2YzJmZUwsIDB4Zjc2MjU3NWRMLCAweDgwNjU2N2NiTCwKKyAgMHgxOTZjMzY3MUwsIDB4NmU2YjA2ZTdMLCAweGZlZDQxYjc2TCwgMHg4OWQzMmJlMEwsIDB4MTBkYTdhNWFMLAorICAweDY3ZGQ0YWNjTCwgMHhmOWI5ZGY2ZkwsIDB4OGViZWVmZjlMLCAweDE3YjdiZTQzTCwgMHg2MGIwOGVkNUwsCisgIDB4ZDZkNmEzZThMLCAweGExZDE5MzdlTCwgMHgzOGQ4YzJjNEwsIDB4NGZkZmYyNTJMLCAweGQxYmI2N2YxTCwKKyAgMHhhNmJjNTc2N0wsIDB4M2ZiNTA2ZGRMLCAweDQ4YjIzNjRiTCwgMHhkODBkMmJkYUwsIDB4YWYwYTFiNGNMLAorICAweDM2MDM0YWY2TCwgMHg0MTA0N2E2MEwsIDB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsCisgIDB4NDY2OWJlNzlMLCAweGNiNjFiMzhjTCwgMHhiYzY2ODMxYUwsIDB4MjU2ZmQyYTBMLCAweDUyNjhlMjM2TCwKKyAgMHhjYzBjNzc5NUwsIDB4YmIwYjQ3MDNMLCAweDIyMDIxNmI5TCwgMHg1NTA1MjYyZkwsIDB4YzViYTNiYmVMLAorICAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLCAweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsCisgIDB4MmNkOTllOGJMLCAweDViZGVhZTFkTCwgMHg5YjY0YzJiMEwsIDB4ZWM2M2YyMjZMLCAweDc1NmFhMzljTCwKKyAgMHgwMjZkOTMwYUwsIDB4OWMwOTA2YTlMLCAweGViMGUzNjNmTCwgMHg3MjA3Njc4NUwsIDB4MDUwMDU3MTNMLAorICAweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwgMHg5MmQyOGU5YkwsCisgIDB4ZTVkNWJlMGRMLCAweDdjZGNlZmI3TCwgMHgwYmRiZGYyMUwsIDB4ODZkM2QyZDRMLCAweGYxZDRlMjQyTCwKKyAgMHg2OGRkYjNmOEwsIDB4MWZkYTgzNmVMLCAweDgxYmUxNmNkTCwgMHhmNmI5MjY1YkwsIDB4NmZiMDc3ZTFMLAorICAweDE4Yjc0Nzc3TCwgMHg4ODA4NWFlNkwsIDB4ZmYwZjZhNzBMLCAweDY2MDYzYmNhTCwgMHgxMTAxMGI1Y0wsCisgIDB4OGY2NTllZmZMLCAweGY4NjJhZTY5TCwgMHg2MTZiZmZkM0wsIDB4MTY2Y2NmNDVMLCAweGEwMGFlMjc4TCwKKyAgMHhkNzBkZDJlZUwsIDB4NGUwNDgzNTRMLCAweDM5MDNiM2MyTCwgMHhhNzY3MjY2MUwsIDB4ZDA2MDE2ZjdMLAorICAweDQ5Njk0NzRkTCwgMHgzZTZlNzdkYkwsIDB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsCisgIDB4MzdkODNiZjBMLCAweGE5YmNhZTUzTCwgMHhkZWJiOWVjNUwsIDB4NDdiMmNmN2ZMLCAweDMwYjVmZmU5TCwKKyAgMHhiZGJkZjIxY0wsIDB4Y2FiYWMyOGFMLCAweDUzYjM5MzMwTCwgMHgyNGI0YTNhNkwsIDB4YmFkMDM2MDVMLAorICAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLCAweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsCisgIDB4NWQ2ODFiMDJMLCAweDJhNmYyYjk0TCwgMHhiNDBiYmUzN0wsIDB4YzMwYzhlYTFMLCAweDVhMDVkZjFiTCwKKyAgMHgyZDAyZWY4ZEwKK307CisKKworTFpPX1BVQkxJQyhjb25zdCBsem9fdWludDMyX3RwKQorbHpvX2dldF9jcmMzMl90YWJsZSh2b2lkKQoreworICAgIHJldHVybiBsem9fY3JjMzJfdGFibGU7Cit9CisKKworI2lmIDEKKyNkZWZpbmUgTFpPX0RPMShidWYsaSkgXAorICAgIGNyYyA9IHRhYmxlWygodW5zaWduZWQpY3JjIF4gYnVmW2ldKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KQorI2Vsc2UKKyNkZWZpbmUgTFpPX0RPMShidWYsaSkgXAorICAgIGNyYyA9IHRhYmxlWyh1bnNpZ25lZCBjaGFyKSgodW5zaWduZWQgY2hhciljcmMgXiBidWZbaV0pXSBeIChjcmMgPj4gOCkKKyNlbmRpZgorI2RlZmluZSBMWk9fRE8yKGJ1ZixpKSAgTFpPX0RPMShidWYsaSk7IExaT19ETzEoYnVmLGkrMSk7CisjZGVmaW5lIExaT19ETzQoYnVmLGkpICBMWk9fRE8yKGJ1ZixpKTsgTFpPX0RPMihidWYsaSsyKTsKKyNkZWZpbmUgTFpPX0RPOChidWYsaSkgIExaT19ETzQoYnVmLGkpOyBMWk9fRE80KGJ1ZixpKzQpOworI2RlZmluZSBMWk9fRE8xNihidWYsaSkgTFpPX0RPOChidWYsaSk7IExaT19ETzgoYnVmLGkrOCk7CisKKworTFpPX1BVQkxJQyhsem9fdWludDMyX3QpCitsem9fY3JjMzIobHpvX3VpbnQzMl90IGMsIGNvbnN0IGx6b19ieXRlcCBidWYsIGx6b191aW50IGxlbikKK3sKKyAgICBsem9fdWludDMyX3QgY3JjOworI3VuZGVmIHRhYmxlCisjaWYgMQorIyAgZGVmaW5lIHRhYmxlIGx6b19jcmMzMl90YWJsZQorI2Vsc2UKKyAgIGNvbnN0IGx6b191aW50MzJfdCAqIHRhYmxlID0gbHpvX2NyYzMyX3RhYmxlOworI2VuZGlmCisKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgY3JjID0gKGMgJiBMWk9fVUlOVDMyX0MoMHhmZmZmZmZmZikpIF4gTFpPX1VJTlQzMl9DKDB4ZmZmZmZmZmYpOworICAgIGlmIChsZW4gPj0gMTYpIGRvCisgICAgeworICAgICAgICBMWk9fRE8xNihidWYsMCk7CisgICAgICAgIGJ1ZiArPSAxNjsKKyAgICAgICAgbGVuIC09IDE2OworICAgIH0gd2hpbGUgKGxlbiA+PSAxNik7CisgICAgaWYgKGxlbiAhPSAwKSBkbworICAgIHsKKyAgICAgICAgTFpPX0RPMShidWYsMCk7CisgICAgICAgIGJ1ZiArPSAxOworICAgICAgICBsZW4gLT0gMTsKKyAgICB9IHdoaWxlIChsZW4gPiAwKTsKKworICAgIHJldHVybiBjcmMgXiBMWk9fVUlOVDMyX0MoMHhmZmZmZmZmZik7CisjdW5kZWYgdGFibGUKK30KKworI3VuZGVmIExaT19ETzEKKyN1bmRlZiBMWk9fRE8yCisjdW5kZWYgTFpPX0RPNAorI3VuZGVmIExaT19ETzgKKyN1bmRlZiBMWk9fRE8xNgorCisKKy8qCit2aTp0cz00OmV0CisqLwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem9fZGljdC5oIGIvbHpvL3NyYy9sem9fZGljdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZGQ1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vc3JjL2x6b19kaWN0LmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qIGx6b19kaWN0LmggLS0gZGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgdGhlIHRoZSBMWk8gbGlicmFyeQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSBhbmQgaXMgc3ViamVjdAorICAgdG8gY2hhbmdlLgorICovCisKKworI2lmbmRlZiBfX0xaT19ESUNUX0gKKyNkZWZpbmUgX19MWk9fRElDVF9IIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBkaWN0aW9uYXJ5IHNpemUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGljdGlvbmFyeSBuZWVkZWQgZm9yIGNvbXByZXNzaW9uICovCisjaWYgIWRlZmluZWQoRF9CSVRTKSAmJiBkZWZpbmVkKERCSVRTKQorIyAgZGVmaW5lIERfQklUUyAgICAgICAgREJJVFMKKyNlbmRpZgorI2lmICFkZWZpbmVkKERfQklUUykKKyMgIGVycm9yICJEX0JJVFMgaXMgbm90IGRlZmluZWQiCisjZW5kaWYKKyNpZiAoRF9CSVRTIDwgMTYpCisjICBkZWZpbmUgRF9TSVpFICAgICAgICBMWk9fU0laRShEX0JJVFMpCisjICBkZWZpbmUgRF9NQVNLICAgICAgICBMWk9fTUFTSyhEX0JJVFMpCisjZWxzZQorIyAgZGVmaW5lIERfU0laRSAgICAgICAgTFpPX1VTSVpFKERfQklUUykKKyMgIGRlZmluZSBEX01BU0sgICAgICAgIExaT19VTUFTSyhEX0JJVFMpCisjZW5kaWYKKyNkZWZpbmUgRF9ISUdIICAgICAgICAgICgoRF9NQVNLID4+IDEpICsgMSkKKworCisvKiBkaWN0aW9uYXJ5IGRlcHRoICovCisjaWYgIWRlZmluZWQoRERfQklUUykKKyMgIGRlZmluZSBERF9CSVRTICAgICAgIDAKKyNlbmRpZgorI2RlZmluZSBERF9TSVpFICAgICAgICAgTFpPX1NJWkUoRERfQklUUykKKyNkZWZpbmUgRERfTUFTSyAgICAgICAgIExaT19NQVNLKEREX0JJVFMpCisKKy8qIGRpY3Rpb25hcnkgbGVuZ3RoICovCisjaWYgIWRlZmluZWQoRExfQklUUykKKyMgIGRlZmluZSBETF9CSVRTICAgICAgIChEX0JJVFMgLSBERF9CSVRTKQorI2VuZGlmCisjaWYgKERMX0JJVFMgPCAxNikKKyMgIGRlZmluZSBETF9TSVpFICAgICAgIExaT19TSVpFKERMX0JJVFMpCisjICBkZWZpbmUgRExfTUFTSyAgICAgICBMWk9fTUFTSyhETF9CSVRTKQorI2Vsc2UKKyMgIGRlZmluZSBETF9TSVpFICAgICAgIExaT19VU0laRShETF9CSVRTKQorIyAgZGVmaW5lIERMX01BU0sgICAgICAgTFpPX1VNQVNLKERMX0JJVFMpCisjZW5kaWYKKworCisjaWYgKERfQklUUyAhPSBETF9CSVRTICsgRERfQklUUykKKyMgIGVycm9yICJEX0JJVFMgZG9lcyBub3QgbWF0Y2giCisjZW5kaWYKKyNpZiAoRF9CSVRTIDwgNiB8fCBEX0JJVFMgPiAxOCkKKyMgIGVycm9yICJpbnZhbGlkIERfQklUUyIKKyNlbmRpZgorI2lmIChETF9CSVRTIDwgNiB8fCBETF9CSVRTID4gMjApCisjICBlcnJvciAiaW52YWxpZCBETF9CSVRTIgorI2VuZGlmCisjaWYgKEREX0JJVFMgPCAwIHx8IEREX0JJVFMgPiA2KQorIyAgZXJyb3IgImludmFsaWQgRERfQklUUyIKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZChETF9NSU5fTEVOKQorIyAgZGVmaW5lIERMX01JTl9MRU4gICAgMworI2VuZGlmCisjaWYgIWRlZmluZWQoRExfU0hJRlQpCisjICBkZWZpbmUgRExfU0hJRlQgICAgICAoKERMX0JJVFMgKyAoRExfTUlOX0xFTiAtIDEpKSAvIERMX01JTl9MRU4pCisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gZGljdGlvbmFyeSBhY2Nlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMWk9fSEFTSF9HWklQICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTFpPX0hBU0hfR1pJUF9JTkNSRU1FTlRBTCAgICAgICAyCisjZGVmaW5lIExaT19IQVNIX0xaT19JTkNSRU1FTlRBTF9BICAgICAgMworI2RlZmluZSBMWk9fSEFTSF9MWk9fSU5DUkVNRU5UQUxfQiAgICAgIDQKKworI2lmICFkZWZpbmVkKExaT19IQVNIKQorIyAgZXJyb3IgImNob29zZSBhIGhhc2hpbmcgc3RyYXRlZ3kiCisjZW5kaWYKKworI3VuZGVmIERNCisjdW5kZWYgRFgKKworI2lmIChETF9NSU5fTEVOID09IDMpCisjICBkZWZpbmUgX0RWMl9BKHAsc2hpZnQxLHNoaWZ0MikgXAorICAgICAgICAoKCgoIChsem9feGludCkoKHApWzBdKSA8PCBzaGlmdDEpIF4gKHApWzFdKSA8PCBzaGlmdDIpIF4gKHApWzJdKQorIyAgZGVmaW5lIF9EVjJfQihwLHNoaWZ0MSxzaGlmdDIpIFwKKyAgICAgICAgKCgoKCAobHpvX3hpbnQpKChwKVsyXSkgPDwgc2hpZnQxKSBeIChwKVsxXSkgPDwgc2hpZnQyKSBeIChwKVswXSkKKyMgIGRlZmluZSBfRFYzX0IocCxzaGlmdDEsc2hpZnQyLHNoaWZ0MykgXAorICAgICAgICAoKF9EVjJfQigocCkrMSxzaGlmdDEsc2hpZnQyKSA8PCAoc2hpZnQzKSkgXiAocClbMF0pCisjZWxpZiAoRExfTUlOX0xFTiA9PSAyKQorIyAgZGVmaW5lIF9EVjJfQShwLHNoaWZ0MSxzaGlmdDIpIFwKKyAgICAgICAgKCggKGx6b194aW50KShwWzBdKSA8PCBzaGlmdDEpIF4gcFsxXSkKKyMgIGRlZmluZSBfRFYyX0IocCxzaGlmdDEsc2hpZnQyKSBcCisgICAgICAgICgoIChsem9feGludCkocFsxXSkgPDwgc2hpZnQxKSBeIHBbMl0pCisjZWxzZQorIyAgZXJyb3IgImludmFsaWQgRExfTUlOX0xFTiIKKyNlbmRpZgorI2RlZmluZSBfRFZfQShwLHNoaWZ0KSAgICAgIF9EVjJfQShwLHNoaWZ0LHNoaWZ0KQorI2RlZmluZSBfRFZfQihwLHNoaWZ0KSAgICAgIF9EVjJfQihwLHNoaWZ0LHNoaWZ0KQorI2RlZmluZSBEQTIocCxzMSxzMikgXAorICAgICAgICAoKCgoKGx6b194aW50KSgocClbMl0pIDw8IChzMikpICsgKHApWzFdKSA8PCAoczEpKSArIChwKVswXSkKKyNkZWZpbmUgRFMyKHAsczEsczIpIFwKKyAgICAgICAgKCgoKChsem9feGludCkoKHApWzJdKSA8PCAoczIpKSAtIChwKVsxXSkgPDwgKHMxKSkgLSAocClbMF0pCisjZGVmaW5lIERYMihwLHMxLHMyKSBcCisgICAgICAgICgoKCgobHpvX3hpbnQpKChwKVsyXSkgPDwgKHMyKSkgXiAocClbMV0pIDw8IChzMSkpIF4gKHApWzBdKQorI2RlZmluZSBEQTMocCxzMSxzMixzMykgKChEQTIoKHApKzEsczIsczMpIDw8IChzMSkpICsgKHApWzBdKQorI2RlZmluZSBEUzMocCxzMSxzMixzMykgKChEUzIoKHApKzEsczIsczMpIDw8IChzMSkpIC0gKHApWzBdKQorI2RlZmluZSBEWDMocCxzMSxzMixzMykgKChEWDIoKHApKzEsczIsczMpIDw8IChzMSkpIF4gKHApWzBdKQorI2RlZmluZSBETVModixzKSAgICAgICAgKChsem9fdWludCkgKCgodikgJiAoRF9NQVNLID4+IChzKSkpIDw8IChzKSkpCisjZGVmaW5lIERNKHYpICAgICAgICAgICBETVModiwwKQorCisKKyNpZiAoTFpPX0hBU0ggPT0gTFpPX0hBU0hfR1pJUCkKKyAgIC8qIGhhc2ggZnVuY3Rpb24gbGlrZSBpbiBnemlwL3psaWIgKGRlZmxhdGUpICovCisjICBkZWZpbmUgX0RJTkRFWChkdixwKSAgICAgKF9EVl9BKChwKSxETF9TSElGVCkpCisKKyNlbGlmIChMWk9fSEFTSCA9PSBMWk9fSEFTSF9HWklQX0lOQ1JFTUVOVEFMKQorICAgLyogaW5jcmVtZW50YWwgaGFzaCBsaWtlIGluIGd6aXAvemxpYiAoZGVmbGF0ZSkgKi8KKyMgIGRlZmluZSBfX0xaT19IQVNIX0lOQ1JFTUVOVEFMIDEKKyMgIGRlZmluZSBEVkFMX0ZJUlNUKGR2LHApICBkdiA9IF9EVl9BKChwKSxETF9TSElGVCkKKyMgIGRlZmluZSBEVkFMX05FWFQoZHYscCkgICBkdiA9ICgoKGR2KSA8PCBETF9TSElGVCkgXiBwWzJdKQorIyAgZGVmaW5lIF9ESU5ERVgoZHYscCkgICAgIChkdikKKyMgIGRlZmluZSBEVkFMX0xPT0tBSEVBRCAgICBETF9NSU5fTEVOCisKKyNlbGlmIChMWk9fSEFTSCA9PSBMWk9fSEFTSF9MWk9fSU5DUkVNRU5UQUxfQSkKKyAgIC8qIGluY3JlbWVudGFsIExaTyBoYXNoIHZlcnNpb24gQSAqLworIyAgZGVmaW5lIF9fTFpPX0hBU0hfSU5DUkVNRU5UQUwgMQorIyAgZGVmaW5lIERWQUxfRklSU1QoZHYscCkgIGR2ID0gX0RWX0EoKHApLDUpCisjICBkZWZpbmUgRFZBTF9ORVhUKGR2LHApIFwKKyAgICAgICAgICAgICAgICBkdiBePSAobHpvX3hpbnQpKHBbLTFdKSA8PCAoMio1KTsgZHYgPSAoKChkdikgPDwgNSkgXiBwWzJdKQorIyAgZGVmaW5lIF9ESU5ERVgoZHYscCkgICAgICgoRE1VTCgweDlmNWYsZHYpKSA+PiA1KQorIyAgZGVmaW5lIERWQUxfTE9PS0FIRUFEICAgIERMX01JTl9MRU4KKworI2VsaWYgKExaT19IQVNIID09IExaT19IQVNIX0xaT19JTkNSRU1FTlRBTF9CKQorICAgLyogaW5jcmVtZW50YWwgTFpPIGhhc2ggdmVyc2lvbiBCICovCisjICBkZWZpbmUgX19MWk9fSEFTSF9JTkNSRU1FTlRBTCAxCisjICBkZWZpbmUgRFZBTF9GSVJTVChkdixwKSAgZHYgPSBfRFZfQigocCksNSkKKyMgIGRlZmluZSBEVkFMX05FWFQoZHYscCkgXAorICAgICAgICAgICAgICAgIGR2IF49IHBbLTFdOyBkdiA9ICgoKGR2KSA+PiA1KSBeICgobHpvX3hpbnQpKHBbMl0pIDw8ICgyKjUpKSkKKyMgIGRlZmluZSBfRElOREVYKGR2LHApICAgICAoKERNVUwoMHg5ZjVmLGR2KSkgPj4gNSkKKyMgIGRlZmluZSBEVkFMX0xPT0tBSEVBRCAgICBETF9NSU5fTEVOCisKKyNlbHNlCisjICBlcnJvciAiY2hvb3NlIGEgaGFzaGluZyBzdHJhdGVneSIKKyNlbmRpZgorCisKKyNpZm5kZWYgRElOREVYCisjZGVmaW5lIERJTkRFWChkdixwKSAgICAgICAgKChsem9fdWludCkoKF9ESU5ERVgoZHYscCkpICYgRExfTUFTSykgPDwgRERfQklUUykKKyNlbmRpZgorI2lmICFkZWZpbmVkKERJTkRFWDEpICYmIGRlZmluZWQoRF9JTkRFWDEpCisjZGVmaW5lIERJTkRFWDEgICAgICAgICAgICAgRF9JTkRFWDEKKyNlbmRpZgorI2lmICFkZWZpbmVkKERJTkRFWDIpICYmIGRlZmluZWQoRF9JTkRFWDIpCisjZGVmaW5lIERJTkRFWDIgICAgICAgICAgICAgRF9JTkRFWDIKKyNlbmRpZgorCisKKworI2lmICFkZWZpbmVkKF9fTFpPX0hBU0hfSU5DUkVNRU5UQUwpCisjICBkZWZpbmUgRFZBTF9GSVJTVChkdixwKSAgKCh2b2lkKSAwKQorIyAgZGVmaW5lIERWQUxfTkVYVChkdixwKSAgICgodm9pZCkgMCkKKyMgIGRlZmluZSBEVkFMX0xPT0tBSEVBRCAgICAwCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoRFZBTF9BU1NFUlQpCisjaWYgZGVmaW5lZChfX0xaT19IQVNIX0lOQ1JFTUVOVEFMKSAmJiAhZGVmaW5lZChOREVCVUcpCisjaWYgKExaT19DQ19DTEFORyB8fCAoTFpPX0NDX0dOVUMgPj0gMHgwMjA3MDB1bCkgfHwgTFpPX0NDX0xMVk0pCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKyNlbHNlCitzdGF0aWMgdm9pZAorI2VuZGlmCitEVkFMX0FTU0VSVChsem9feGludCBkdiwgY29uc3QgbHpvX2J5dGVwIHApCit7CisgICAgbHpvX3hpbnQgZGY7CisgICAgRFZBTF9GSVJTVChkZiwocCkpOworICAgIGFzc2VydChESU5ERVgoZHYscCkgPT0gRElOREVYKGRmLHApKTsKK30KKyNlbHNlCisjICBkZWZpbmUgRFZBTF9BU1NFUlQoZHYscCkgKCh2b2lkKSAwKQorI2VuZGlmCisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gZGljdGlvbmFyeSB1cGRhdGluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKExaT19ESUNUX1VTRV9QVFIpCisjICBkZWZpbmUgREVOVFJZKHAsaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAocCkKKyMgIGRlZmluZSBHSU5ERVgobV9wb3MsbV9vZmYsZGljdCxkaW5kZXgsaW4pICAgIG1fcG9zID0gZGljdFtkaW5kZXhdCisjZWxzZQorIyAgZGVmaW5lIERFTlRSWShwLGluKSAgICAgICAgICAgICAgICAgICAgICAgICAgKChsem9fZGljdF90KSBwZChwLCBpbikpCisjICBkZWZpbmUgR0lOREVYKG1fcG9zLG1fb2ZmLGRpY3QsZGluZGV4LGluKSAgICBtX29mZiA9IGRpY3RbZGluZGV4XQorI2VuZGlmCisKKworI2lmIChERF9CSVRTID09IDApCisKKyMgIGRlZmluZSBVUERBVEVfRChkaWN0LGRydW4sZHYscCxpbikgICAgICAgZGljdFsgRElOREVYKGR2LHApIF0gPSBERU5UUlkocCxpbikKKyMgIGRlZmluZSBVUERBVEVfSShkaWN0LGRydW4saW5kZXgscCxpbikgICAgZGljdFtpbmRleF0gPSBERU5UUlkocCxpbikKKyMgIGRlZmluZSBVUERBVEVfUChwdHIsZHJ1bixwLGluKSAgICAgICAgICAgKHB0cilbMF0gPSBERU5UUlkocCxpbikKKworI2Vsc2UKKworIyAgZGVmaW5lIFVQREFURV9EKGRpY3QsZHJ1bixkdixwLGluKSAgIFwKKyAgICAgICAgZGljdFsgRElOREVYKGR2LHApICsgZHJ1bisrIF0gPSBERU5UUlkocCxpbik7IGRydW4gJj0gRERfTUFTSworIyAgZGVmaW5lIFVQREFURV9JKGRpY3QsZHJ1bixpbmRleCxwLGluKSAgICBcCisgICAgICAgIGRpY3RbIChpbmRleCkgKyBkcnVuKysgXSA9IERFTlRSWShwLGluKTsgZHJ1biAmPSBERF9NQVNLCisjICBkZWZpbmUgVVBEQVRFX1AocHRyLGRydW4scCxpbikgICBcCisgICAgICAgIChwdHIpIFsgZHJ1bisrIF0gPSBERU5UUlkocCxpbik7IGRydW4gJj0gRERfTUFTSworCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIHRlc3QgZm9yIGEgbWF0Y2gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIChMWk9fRElDVF9VU0VfUFRSKQorCisvKiBtX3BvcyBpcyBlaXRoZXIgTlVMTCBvciBhIHZhbGlkIHBvaW50ZXIgKi8KKyNkZWZpbmUgTFpPX0NIRUNLX01QT1NfREVUKG1fcG9zLG1fb2ZmLGluLGlwLG1heF9vZmZzZXQpIFwKKyAgICAgICAgKG1fcG9zID09IE5VTEwgfHwgKG1fb2ZmID0gcGQoaXAsIG1fcG9zKSkgPiBtYXhfb2Zmc2V0KQorCisvKiBtX3BvcyBtYXkgcG9pbnQgYW55d2hlcmUuLi4gKi8KKyNkZWZpbmUgTFpPX0NIRUNLX01QT1NfTk9OX0RFVChtX3BvcyxtX29mZixpbixpcCxtYXhfb2Zmc2V0KSBcCisgICAgKEJPVU5EU19DSEVDS0lOR19PRkZfSU5fRVhQUigoIFwKKyAgICAgICAgbV9wb3MgPSBpcCAtIChsem9fdWludCkgUFRSX0RJRkYoaXAsbV9wb3MpLCBcCisgICAgICAgIFBUUl9MVChtX3BvcyxpbikgfHwgXAorICAgICAgICAobV9vZmYgPSAobHpvX3VpbnQpIFBUUl9ESUZGKGlwLG1fcG9zKSkgPT0gMCB8fCBcCisgICAgICAgICBtX29mZiA+IG1heF9vZmZzZXQgKSkpCisKKyNlbHNlCisKKyNkZWZpbmUgTFpPX0NIRUNLX01QT1NfREVUKG1fcG9zLG1fb2ZmLGluLGlwLG1heF9vZmZzZXQpIFwKKyAgICAgICAgKG1fb2ZmID09IDAgfHwgXAorICAgICAgICAgKChtX29mZiA9IHBkKGlwLCBpbikgLSBtX29mZikgPiBtYXhfb2Zmc2V0KSB8fCBcCisgICAgICAgICAobV9wb3MgPSAoaXApIC0gKG1fb2ZmKSwgMCkgKQorCisjZGVmaW5lIExaT19DSEVDS19NUE9TX05PTl9ERVQobV9wb3MsbV9vZmYsaW4saXAsbWF4X29mZnNldCkgXAorICAgICAgICAocGQoaXAsIGluKSA8PSBtX29mZiB8fCBcCisgICAgICAgICAoKG1fb2ZmID0gcGQoaXAsIGluKSAtIG1fb2ZmKSA+IG1heF9vZmZzZXQpIHx8IFwKKyAgICAgICAgIChtX3BvcyA9IChpcCkgLSAobV9vZmYpLCAwKSApCisKKyNlbmRpZgorCisKKyNpZiAoTFpPX0RFVEVSTUlOSVNUSUMpCisjICBkZWZpbmUgTFpPX0NIRUNLX01QT1MgICAgTFpPX0NIRUNLX01QT1NfREVUCisjZWxzZQorIyAgZGVmaW5lIExaT19DSEVDS19NUE9TICAgIExaT19DSEVDS19NUE9TX05PTl9ERVQKKyNlbmRpZgorCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisvKgordmk6dHM9NDpldAorKi8KKwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem9fZGxsLmNoIGIvbHpvL3NyYy9sem9fZGxsLmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODBlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vc3JjL2x6b19kbGwuY2gKQEAgLTAsMCArMSw1MiBAQAorLyogbHpvX2RsbC5jaCAtLSBETEwgaW5pdGlhbGl6YXRpb24gb2YgdGhlIExaTyBsaWJyYXJ5CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBXaW5kb3dzIDE2IGJpdCArIFdhdGNvbSBDICsgRExMCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoTFpPX09TX1dJTjE2ICYmIExaT19DQ19XQVRDT01DKSAmJiBkZWZpbmVkKF9fU1dfQkQpCisKKy8qIGRvbid0IHB1bGwgaW4gPHdpbmRvd3MuaD4gLSB3ZSBkb24ndCBuZWVkIGl0ICovCisjaWYgMAorQk9PTCBGQVIgUEFTQ0FMIExpYk1haW4gKCBIQU5ETEUgaEluc3RhbmNlLCBXT1JEIHdEYXRhU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3SGVhcFNpemUsIExQU1RSIGxwc3pDbWRMaW5lICkKKyNlbHNlCitpbnQgX19mYXIgX19wYXNjYWwgTGliTWFpbiAoIGludCBhLCBzaG9ydCBiLCBzaG9ydCBjLCBsb25nIGQgKQorI2VuZGlmCit7CisgICAgTFpPX1VOVVNFRChhKTsgTFpPX1VOVVNFRChiKTsgTFpPX1VOVVNFRChjKTsgTFpPX1VOVVNFRChkKTsKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKworLyoKK3ZpOnRzPTQ6ZXQKKyovCmRpZmYgLS1naXQgYS9sem8vc3JjL2x6b19mdW5jLmggYi9sem8vc3JjL2x6b19mdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExZjJhZQotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbHpvX2Z1bmMuaApAQCAtMCwwICsxLDQ5NCBAQAorLyogbHpvX2Z1bmMuaCAtLSBmdW5jdGlvbnMKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGxpYnJhcnkgYW5kIGlzIHN1YmplY3QKKyAgIHRvIGNoYW5nZS4KKyAqLworCisKKyNpZm5kZWYgX19MWk9fRlVOQ19ICisjZGVmaW5lIF9fTFpPX0ZVTkNfSCAxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBiaXRvcHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKExaT19CSVRPUFNfVVNFX0FTTV9CSVRTQ0FOKSAmJiAhZGVmaW5lZChMWk9fQklUT1BTX1VTRV9HTlVDX0JJVFNDQU4pICYmICFkZWZpbmVkKExaT19CSVRPUFNfVVNFX01TQ19CSVRTQ0FOKQorI2lmIDEgJiYgKExaT19BUkNIX0FNRDY0KSAmJiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwNDAwMDB1bCkpICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorI2RlZmluZSBMWk9fQklUT1BTX1VTRV9BU01fQklUU0NBTiAxCisjZWxpZiAoTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKSB8fCAoTFpPX0NDX0lOVEVMQ19HTlVDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDEwMDApKSB8fCAoTFpPX0NDX0xMVk0gJiYgKCFkZWZpbmVkKF9fbGx2bV90b29sc192ZXJzaW9uX18pIHx8IChfX2xsdm1fdG9vbHNfdmVyc2lvbl9fKzAgPj0gMHgwMTA1MDB1bCkpKSkKKyNkZWZpbmUgTFpPX0JJVE9QU19VU0VfR05VQ19CSVRTQ0FOIDEKKyNlbGlmIChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0KSAmJiAoKExaT19DQ19JTlRFTENfTVNDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDEwMTApKSB8fCAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTQwMCkpKQorI2RlZmluZSBMWk9fQklUT1BTX1VTRV9NU0NfQklUU0NBTiAxCisjaWYgKExaT19DQ19NU0MpICYmIChMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9JMzg2KQorI2luY2x1ZGUgPGludHJpbi5oPgorI2VuZGlmCisjaWYgKExaT19DQ19NU0MpICYmIChMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9JMzg2KQorI3ByYWdtYSBpbnRyaW5zaWMoX0JpdFNjYW5SZXZlcnNlKQorI3ByYWdtYSBpbnRyaW5zaWMoX0JpdFNjYW5Gb3J3YXJkKQorI2VuZGlmCisjaWYgKExaT19DQ19NU0MpICYmIChMWk9fQVJDSF9BTUQ2NCkKKyNwcmFnbWEgaW50cmluc2ljKF9CaXRTY2FuUmV2ZXJzZTY0KQorI3ByYWdtYSBpbnRyaW5zaWMoX0JpdFNjYW5Gb3J3YXJkNjQpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKK19fbHpvX3N0YXRpY19mb3JjZWlubGluZSB1bnNpZ25lZCBsem9fYml0b3BzX2N0bHozMl9mdW5jKGx6b191aW50MzJfdCB2KQoreworI2lmIChMWk9fQklUT1BTX1VTRV9NU0NfQklUU0NBTikgJiYgKExaT19BUkNIX0FNRDY0IHx8IExaT19BUkNIX0kzODYpCisgICAgdW5zaWduZWQgbG9uZyByOyAodm9pZCkgX0JpdFNjYW5SZXZlcnNlKCZyLCB2KTsgcmV0dXJuICh1bnNpZ25lZCkgciBeIDMxOworI2RlZmluZSBsem9fYml0b3BzX2N0bHozMih2KSAgICBsem9fYml0b3BzX2N0bHozMl9mdW5jKHYpCisjZWxpZiAoTFpPX0JJVE9QU19VU0VfQVNNX0JJVFNDQU4pICYmIChMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9JMzg2KSAmJiAoTFpPX0FTTV9TWU5UQVhfR05VQykKKyAgICBsem9fdWludDMyX3QgcjsKKyAgICBfX2FzbV9fKCJic3IgJTEsJTAiIDogIj1yIiAocikgOiAicm0iICh2KSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKSByIF4gMzE7CisjZGVmaW5lIGx6b19iaXRvcHNfY3RsejMyKHYpICAgIGx6b19iaXRvcHNfY3RsejMyX2Z1bmModikKKyNlbGlmIChMWk9fQklUT1BTX1VTRV9HTlVDX0JJVFNDQU4pICYmIChMWk9fU0laRU9GX0lOVCA9PSA0KQorICAgIHVuc2lnbmVkIHI7IHIgPSAodW5zaWduZWQpIF9fYnVpbHRpbl9jbHoodik7IHJldHVybiByOworI2RlZmluZSBsem9fYml0b3BzX2N0bHozMih2KSAgICAoKHVuc2lnbmVkKSBfX2J1aWx0aW5fY2x6KHYpKQorI2Vsc2UKKyAgICBMWk9fVU5VU0VEKHYpOyByZXR1cm4gMDsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChsem9fdWludDY0X3QpCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgdW5zaWduZWQgbHpvX2JpdG9wc19jdGx6NjRfZnVuYyhsem9fdWludDY0X3QgdikKK3sKKyNpZiAoTFpPX0JJVE9QU19VU0VfTVNDX0JJVFNDQU4pICYmIChMWk9fQVJDSF9BTUQ2NCkKKyAgICB1bnNpZ25lZCBsb25nIHI7ICh2b2lkKSBfQml0U2NhblJldmVyc2U2NCgmciwgdik7IHJldHVybiAodW5zaWduZWQpIHIgXiA2MzsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdGx6NjQodikgICAgbHpvX2JpdG9wc19jdGx6NjRfZnVuYyh2KQorI2VsaWYgKExaT19CSVRPUFNfVVNFX0FTTV9CSVRTQ0FOKSAmJiAoTFpPX0FSQ0hfQU1ENjQpICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIGx6b191aW50NjRfdCByOworICAgIF9fYXNtX18oImJzciAlMSwlMCIgOiAiPXIiIChyKSA6ICJybSIgKHYpIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0MpOworICAgIHJldHVybiAodW5zaWduZWQpIHIgXiA2MzsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdGx6NjQodikgICAgbHpvX2JpdG9wc19jdGx6NjRfZnVuYyh2KQorI2VsaWYgKExaT19CSVRPUFNfVVNFX0dOVUNfQklUU0NBTikgJiYgKExaT19TSVpFT0ZfTE9ORyA9PSA4KSAmJiAoTFpPX1dPUkRTSVpFID49IDgpCisgICAgdW5zaWduZWQgcjsgciA9ICh1bnNpZ25lZCkgX19idWlsdGluX2Nsemwodik7IHJldHVybiByOworI2RlZmluZSBsem9fYml0b3BzX2N0bHo2NCh2KSAgICAoKHVuc2lnbmVkKSBfX2J1aWx0aW5fY2x6bCh2KSkKKyNlbGlmIChMWk9fQklUT1BTX1VTRV9HTlVDX0JJVFNDQU4pICYmIChMWk9fU0laRU9GX0xPTkdfTE9ORyA9PSA4KSAmJiAoTFpPX1dPUkRTSVpFID49IDgpCisgICAgdW5zaWduZWQgcjsgciA9ICh1bnNpZ25lZCkgX19idWlsdGluX2NsemxsKHYpOyByZXR1cm4gcjsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdGx6NjQodikgICAgKCh1bnNpZ25lZCkgX19idWlsdGluX2NsemxsKHYpKQorI2Vsc2UKKyAgICBMWk9fVU5VU0VEKHYpOyByZXR1cm4gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKK19fbHpvX3N0YXRpY19mb3JjZWlubGluZSB1bnNpZ25lZCBsem9fYml0b3BzX2N0dHozMl9mdW5jKGx6b191aW50MzJfdCB2KQoreworI2lmIChMWk9fQklUT1BTX1VTRV9NU0NfQklUU0NBTikgJiYgKExaT19BUkNIX0FNRDY0IHx8IExaT19BUkNIX0kzODYpCisgICAgdW5zaWduZWQgbG9uZyByOyAodm9pZCkgX0JpdFNjYW5Gb3J3YXJkKCZyLCB2KTsgcmV0dXJuICh1bnNpZ25lZCkgcjsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdHR6MzIodikgICAgbHpvX2JpdG9wc19jdHR6MzJfZnVuYyh2KQorI2VsaWYgKExaT19CSVRPUFNfVVNFX0FTTV9CSVRTQ0FOKSAmJiAoTFpPX0FSQ0hfQU1ENjQgfHwgTFpPX0FSQ0hfSTM4NikgJiYgKExaT19BU01fU1lOVEFYX0dOVUMpCisgICAgbHpvX3VpbnQzMl90IHI7CisgICAgX19hc21fXygiYnNmICUxLCUwIiA6ICI9ciIgKHIpIDogInJtIiAodikgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQyk7CisgICAgcmV0dXJuICh1bnNpZ25lZCkgcjsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdHR6MzIodikgICAgbHpvX2JpdG9wc19jdHR6MzJfZnVuYyh2KQorI2VsaWYgKExaT19CSVRPUFNfVVNFX0dOVUNfQklUU0NBTikgJiYgKExaT19TSVpFT0ZfSU5UID49IDQpCisgICAgdW5zaWduZWQgcjsgciA9ICh1bnNpZ25lZCkgX19idWlsdGluX2N0eih2KTsgcmV0dXJuIHI7CisjZGVmaW5lIGx6b19iaXRvcHNfY3R0ejMyKHYpICAgICgodW5zaWduZWQpIF9fYnVpbHRpbl9jdHoodikpCisjZWxzZQorICAgIExaT19VTlVTRUQodik7IHJldHVybiAwOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKGx6b191aW50NjRfdCkKK19fbHpvX3N0YXRpY19mb3JjZWlubGluZSB1bnNpZ25lZCBsem9fYml0b3BzX2N0dHo2NF9mdW5jKGx6b191aW50NjRfdCB2KQoreworI2lmIChMWk9fQklUT1BTX1VTRV9NU0NfQklUU0NBTikgJiYgKExaT19BUkNIX0FNRDY0KQorICAgIHVuc2lnbmVkIGxvbmcgcjsgKHZvaWQpIF9CaXRTY2FuRm9yd2FyZDY0KCZyLCB2KTsgcmV0dXJuICh1bnNpZ25lZCkgcjsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdHR6NjQodikgICAgbHpvX2JpdG9wc19jdHR6NjRfZnVuYyh2KQorI2VsaWYgKExaT19CSVRPUFNfVVNFX0FTTV9CSVRTQ0FOKSAmJiAoTFpPX0FSQ0hfQU1ENjQpICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIGx6b191aW50NjRfdCByOworICAgIF9fYXNtX18oImJzZiAlMSwlMCIgOiAiPXIiIChyKSA6ICJybSIgKHYpIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0MpOworICAgIHJldHVybiAodW5zaWduZWQpIHI7CisjZGVmaW5lIGx6b19iaXRvcHNfY3R0ejY0KHYpICAgIGx6b19iaXRvcHNfY3R0ejY0X2Z1bmModikKKyNlbGlmIChMWk9fQklUT1BTX1VTRV9HTlVDX0JJVFNDQU4pICYmIChMWk9fU0laRU9GX0xPTkcgPj0gOCkgJiYgKExaT19XT1JEU0laRSA+PSA4KQorICAgIHVuc2lnbmVkIHI7IHIgPSAodW5zaWduZWQpIF9fYnVpbHRpbl9jdHpsKHYpOyByZXR1cm4gcjsKKyNkZWZpbmUgbHpvX2JpdG9wc19jdHR6NjQodikgICAgKCh1bnNpZ25lZCkgX19idWlsdGluX2N0emwodikpCisjZWxpZiAoTFpPX0JJVE9QU19VU0VfR05VQ19CSVRTQ0FOKSAmJiAoTFpPX1NJWkVPRl9MT05HX0xPTkcgPj0gOCkgJiYgKExaT19XT1JEU0laRSA+PSA4KQorICAgIHVuc2lnbmVkIHI7IHIgPSAodW5zaWduZWQpIF9fYnVpbHRpbl9jdHpsbCh2KTsgcmV0dXJuIHI7CisjZGVmaW5lIGx6b19iaXRvcHNfY3R0ejY0KHYpICAgICgodW5zaWduZWQpIF9fYnVpbHRpbl9jdHpsbCh2KSkKKyNlbHNlCisgICAgTFpPX1VOVVNFRCh2KTsgcmV0dXJuIDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgMSAmJiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAyMDcwMHVsKSB8fCBMWk9fQ0NfSU5URUxDX0dOVUMgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSB8fCBMWk9fQ0NfUEdJKQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZWxzZQorX19sem9fc3RhdGljX2ZvcmNlaW5saW5lIHZvaWQKKyNlbmRpZgorbHpvX2JpdG9wc191bnVzZWRfZnVuY3Modm9pZCkKK3sKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX2JpdG9wc19jdGx6MzJfZnVuYyk7CisgICAgTFpPX1VOVVNFRF9GVU5DKGx6b19iaXRvcHNfY3R0ejMyX2Z1bmMpOworI2lmIGRlZmluZWQobHpvX3VpbnQ2NF90KQorICAgIExaT19VTlVTRURfRlVOQyhsem9fYml0b3BzX2N0bHo2NF9mdW5jKTsKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX2JpdG9wc19jdHR6NjRfZnVuYyk7CisjZW5kaWYKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX2JpdG9wc191bnVzZWRfZnVuY3MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gbWVtb3BzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKF9fbHpvX2FsaWdub2YpICYmICEoTFpPX0NGR19OT19VTkFMSUdORUQpCisjaWZuZGVmIF9fbHpvX21lbW9wc190Y2hlY2sKKyNkZWZpbmUgX19sem9fbWVtb3BzX3RjaGVjayh0LGEsYikgKCh2b2lkKTAsIHNpemVvZih0KSA9PSAoYSkgJiYgX19sem9fYWxpZ25vZih0KSA9PSAoYikpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVMHAKKyNkZWZpbmUgbHpvX21lbW9wc19UVTBwIHZvaWQgX19MWk9fTU1PREVMICoKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVMXAKKyNkZWZpbmUgbHpvX21lbW9wc19UVTFwIHVuc2lnbmVkIGNoYXIgX19MWk9fTU1PREVMICoKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVMnAKKyNpZiAoTFpPX09QVF9VTkFMSUdORUQxNikKK3R5cGVkZWYgbHpvX3VpbnQxNl90IF9fbHpvX21heV9hbGlhcyBsem9fbWVtb3BzX1RVMjsKKyNkZWZpbmUgbHpvX21lbW9wc19UVTJwIHZvbGF0aWxlIGx6b19tZW1vcHNfVFUyICoKKyNlbGlmIGRlZmluZWQoX19sem9fYnl0ZV9zdHJ1Y3QpCitfX2x6b19ieXRlX3N0cnVjdChsem9fbWVtb3BzX1RVMl9zdHJ1Y3QsMikKK3R5cGVkZWYgc3RydWN0IGx6b19tZW1vcHNfVFUyX3N0cnVjdCBsem9fbWVtb3BzX1RVMjsKKyNlbHNlCitzdHJ1Y3QgbHpvX21lbW9wc19UVTJfc3RydWN0IHsgdW5zaWduZWQgY2hhciBhWzJdOyB9IF9fbHpvX21heV9hbGlhczsKK3R5cGVkZWYgc3RydWN0IGx6b19tZW1vcHNfVFUyX3N0cnVjdCBsem9fbWVtb3BzX1RVMjsKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVMnAKKyNkZWZpbmUgbHpvX21lbW9wc19UVTJwIGx6b19tZW1vcHNfVFUyICoKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIGx6b19tZW1vcHNfVFU0cAorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKQordHlwZWRlZiBsem9fdWludDMyX3QgX19sem9fbWF5X2FsaWFzIGx6b19tZW1vcHNfVFU0OworI2RlZmluZSBsem9fbWVtb3BzX1RVNHAgdm9sYXRpbGUgbHpvX21lbW9wc19UVTQgX19MWk9fTU1PREVMICoKKyNlbGlmIGRlZmluZWQoX19sem9fYnl0ZV9zdHJ1Y3QpCitfX2x6b19ieXRlX3N0cnVjdChsem9fbWVtb3BzX1RVNF9zdHJ1Y3QsNCkKK3R5cGVkZWYgc3RydWN0IGx6b19tZW1vcHNfVFU0X3N0cnVjdCBsem9fbWVtb3BzX1RVNDsKKyNlbHNlCitzdHJ1Y3QgbHpvX21lbW9wc19UVTRfc3RydWN0IHsgdW5zaWduZWQgY2hhciBhWzRdOyB9IF9fbHpvX21heV9hbGlhczsKK3R5cGVkZWYgc3RydWN0IGx6b19tZW1vcHNfVFU0X3N0cnVjdCBsem9fbWVtb3BzX1RVNDsKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVNHAKKyNkZWZpbmUgbHpvX21lbW9wc19UVTRwIGx6b19tZW1vcHNfVFU0IF9fTFpPX01NT0RFTCAqCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX1RVOHAKKyNpZiAoTFpPX09QVF9VTkFMSUdORUQ2NCkKK3R5cGVkZWYgbHpvX3VpbnQ2NF90IF9fbHpvX21heV9hbGlhcyBsem9fbWVtb3BzX1RVODsKKyNkZWZpbmUgbHpvX21lbW9wc19UVThwIHZvbGF0aWxlIGx6b19tZW1vcHNfVFU4IF9fTFpPX01NT0RFTCAqCisjZWxpZiBkZWZpbmVkKF9fbHpvX2J5dGVfc3RydWN0KQorX19sem9fYnl0ZV9zdHJ1Y3QobHpvX21lbW9wc19UVThfc3RydWN0LDgpCit0eXBlZGVmIHN0cnVjdCBsem9fbWVtb3BzX1RVOF9zdHJ1Y3QgbHpvX21lbW9wc19UVTg7CisjZWxzZQorc3RydWN0IGx6b19tZW1vcHNfVFU4X3N0cnVjdCB7IHVuc2lnbmVkIGNoYXIgYVs4XTsgfSBfX2x6b19tYXlfYWxpYXM7Cit0eXBlZGVmIHN0cnVjdCBsem9fbWVtb3BzX1RVOF9zdHJ1Y3QgbHpvX21lbW9wc19UVTg7CisjZW5kaWYKKyNpZm5kZWYgbHpvX21lbW9wc19UVThwCisjZGVmaW5lIGx6b19tZW1vcHNfVFU4cCBsem9fbWVtb3BzX1RVOCBfX0xaT19NTU9ERUwgKgorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgbHpvX21lbW9wc19zZXRfVFUxcAorI2RlZmluZSBsem9fbWVtb3BzX3NldF9UVTFwICAgICB2b2xhdGlsZSBsem9fbWVtb3BzX1RVMXAKKyNlbmRpZgorI2lmbmRlZiBsem9fbWVtb3BzX21vdmVfVFUxcAorI2RlZmluZSBsem9fbWVtb3BzX21vdmVfVFUxcCAgICBsem9fbWVtb3BzX1RVMXAKKyNlbmRpZgorI2RlZmluZSBMWk9fTUVNT1BTX1NFVDEoZGQsY2MpIFwKKyAgICBMWk9fQkxPQ0tfQkVHSU4gXAorICAgIGx6b19tZW1vcHNfc2V0X1RVMXAgZF9fMSA9IChsem9fbWVtb3BzX3NldF9UVTFwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpOyBcCisgICAgZF9fMVswXSA9IExaT19CWVRFKGNjKTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19TRVQyKGRkLGNjKSBcCisgICAgTFpPX0JMT0NLX0JFR0lOIFwKKyAgICBsem9fbWVtb3BzX3NldF9UVTFwIGRfXzIgPSAobHpvX21lbW9wc19zZXRfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGRfXzJbMF0gPSBMWk9fQllURShjYyk7IGRfXzJbMV0gPSBMWk9fQllURShjYyk7IFwKKyAgICBMWk9fQkxPQ0tfRU5ECisjZGVmaW5lIExaT19NRU1PUFNfU0VUMyhkZCxjYykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19zZXRfVFUxcCBkX18zID0gKGx6b19tZW1vcHNfc2V0X1RVMXApIChsem9fbWVtb3BzX1RVMHApIChkZCk7IFwKKyAgICBkX18zWzBdID0gTFpPX0JZVEUoY2MpOyBkX18zWzFdID0gTFpPX0JZVEUoY2MpOyBkX18zWzJdID0gTFpPX0JZVEUoY2MpOyBcCisgICAgTFpPX0JMT0NLX0VORAorI2RlZmluZSBMWk9fTUVNT1BTX1NFVDQoZGQsY2MpIFwKKyAgICBMWk9fQkxPQ0tfQkVHSU4gXAorICAgIGx6b19tZW1vcHNfc2V0X1RVMXAgZF9fNCA9IChsem9fbWVtb3BzX3NldF9UVTFwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpOyBcCisgICAgZF9fNFswXSA9IExaT19CWVRFKGNjKTsgZF9fNFsxXSA9IExaT19CWVRFKGNjKTsgZF9fNFsyXSA9IExaT19CWVRFKGNjKTsgZF9fNFszXSA9IExaT19CWVRFKGNjKTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19NT1ZFMShkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19tb3ZlX1RVMXAgZF9fMSA9IChsem9fbWVtb3BzX21vdmVfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwIHNfXzEgPSAoY29uc3QgbHpvX21lbW9wc19tb3ZlX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBkX18xWzBdID0gc19fMVswXTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19NT1ZFMihkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19tb3ZlX1RVMXAgZF9fMiA9IChsem9fbWVtb3BzX21vdmVfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwIHNfXzIgPSAoY29uc3QgbHpvX21lbW9wc19tb3ZlX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBkX18yWzBdID0gc19fMlswXTsgZF9fMlsxXSA9IHNfXzJbMV07IFwKKyAgICBMWk9fQkxPQ0tfRU5ECisjZGVmaW5lIExaT19NRU1PUFNfTU9WRTMoZGQsc3MpIFwKKyAgICBMWk9fQkxPQ0tfQkVHSU4gXAorICAgIGx6b19tZW1vcHNfbW92ZV9UVTFwIGRfXzMgPSAobHpvX21lbW9wc19tb3ZlX1RVMXApIChsem9fbWVtb3BzX1RVMHApIChkZCk7IFwKKyAgICBjb25zdCBsem9fbWVtb3BzX21vdmVfVFUxcCBzX18zID0gKGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwKSAoY29uc3QgbHpvX21lbW9wc19UVTBwKSAoc3MpOyBcCisgICAgZF9fM1swXSA9IHNfXzNbMF07IGRfXzNbMV0gPSBzX18zWzFdOyBkX18zWzJdID0gc19fM1syXTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19NT1ZFNChkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19tb3ZlX1RVMXAgZF9fNCA9IChsem9fbWVtb3BzX21vdmVfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwIHNfXzQgPSAoY29uc3QgbHpvX21lbW9wc19tb3ZlX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBkX180WzBdID0gc19fNFswXTsgZF9fNFsxXSA9IHNfXzRbMV07IGRfXzRbMl0gPSBzX180WzJdOyBkX180WzNdID0gc19fNFszXTsgXAorICAgIExaT19CTE9DS19FTkQKKyNkZWZpbmUgTFpPX01FTU9QU19NT1ZFOChkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBcCisgICAgbHpvX21lbW9wc19tb3ZlX1RVMXAgZF9fOCA9IChsem9fbWVtb3BzX21vdmVfVFUxcCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKTsgXAorICAgIGNvbnN0IGx6b19tZW1vcHNfbW92ZV9UVTFwIHNfXzggPSAoY29uc3QgbHpvX21lbW9wc19tb3ZlX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBkX184WzBdID0gc19fOFswXTsgZF9fOFsxXSA9IHNfXzhbMV07IGRfXzhbMl0gPSBzX184WzJdOyBkX184WzNdID0gc19fOFszXTsgXAorICAgIGRfXzhbNF0gPSBzX184WzRdOyBkX184WzVdID0gc19fOFs1XTsgZF9fOFs2XSA9IHNfXzhbNl07IGRfXzhbN10gPSBzX184WzddOyBcCisgICAgTFpPX0JMT0NLX0VORAorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZigqKGx6b19tZW1vcHNfVFUxcCkwKT09MSkKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZMShkZCxzcykgTFpPX01FTU9QU19NT1ZFMShkZCxzcykKKyNpZiAoTFpPX09QVF9VTkFMSUdORUQxNikKK0xaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihzaXplb2YoKihsem9fbWVtb3BzX1RVMnApMCk9PTIpCisjZGVmaW5lIExaT19NRU1PUFNfQ09QWTIoZGQsc3MpIFwKKyAgICAqIChsem9fbWVtb3BzX1RVMnApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAqIChjb25zdCBsem9fbWVtb3BzX1RVMnApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbGlmIGRlZmluZWQoX19sem9fbWVtb3BzX3RjaGVjaykKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZMihkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBpZiAoX19sem9fbWVtb3BzX3RjaGVjayhsem9fbWVtb3BzX1RVMiwyLDEpKSB7IFwKKyAgICAgICAgKiAobHpvX21lbW9wc19UVTJwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpID0gKiAoY29uc3QgbHpvX21lbW9wc19UVTJwKSAoY29uc3QgbHpvX21lbW9wc19UVTBwKSAoc3MpOyBcCisgICAgfSBlbHNlIHsgTFpPX01FTU9QU19NT1ZFMihkZCxzcyk7IH0gTFpPX0JMT0NLX0VORAorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZMihkZCxzcykgTFpPX01FTU9QU19NT1ZFMihkZCxzcykKKyNlbmRpZgorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorTFpPX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKHNpemVvZigqKGx6b19tZW1vcHNfVFU0cCkwKT09NCkKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZNChkZCxzcykgXAorICAgICogKGx6b19tZW1vcHNfVFU0cCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKSA9ICogKGNvbnN0IGx6b19tZW1vcHNfVFU0cCkgKGNvbnN0IGx6b19tZW1vcHNfVFUwcCkgKHNzKQorI2VsaWYgZGVmaW5lZChfX2x6b19tZW1vcHNfdGNoZWNrKQorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFk0KGRkLHNzKSBcCisgICAgTFpPX0JMT0NLX0JFR0lOIGlmIChfX2x6b19tZW1vcHNfdGNoZWNrKGx6b19tZW1vcHNfVFU0LDQsMSkpIHsgXAorICAgICAgICAqIChsem9fbWVtb3BzX1RVNHApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAqIChjb25zdCBsem9fbWVtb3BzX1RVNHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICB9IGVsc2UgeyBMWk9fTUVNT1BTX01PVkU0KGRkLHNzKTsgfSBMWk9fQkxPQ0tfRU5ECisjZWxzZQorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFk0KGRkLHNzKSBMWk9fTUVNT1BTX01PVkU0KGRkLHNzKQorI2VuZGlmCisjaWYgKExaT19XT1JEU0laRSAhPSA4KQorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFk4KGRkLHNzKSBcCisgICAgTFpPX0JMT0NLX0JFR0lOIExaT19NRU1PUFNfQ09QWTQoZGQsc3MpOyBMWk9fTUVNT1BTX0NPUFk0KChsem9fbWVtb3BzX1RVMXApKGx6b19tZW1vcHNfVFUwcCkoZGQpKzQsKGNvbnN0IGx6b19tZW1vcHNfVFUxcCkoY29uc3QgbHpvX21lbW9wc19UVTBwKShzcykrNCk7IExaT19CTE9DS19FTkQKKyNlbHNlCisjaWYgKExaT19PUFRfVU5BTElHTkVENjQpCitMWk9fQ09NUElMRV9USU1FX0FTU0VSVF9IRUFERVIoc2l6ZW9mKCoobHpvX21lbW9wc19UVThwKTApPT04KQorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFk4KGRkLHNzKSBcCisgICAgKiAobHpvX21lbW9wc19UVThwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpID0gKiAoY29uc3QgbHpvX21lbW9wc19UVThwKSAoY29uc3QgbHpvX21lbW9wc19UVTBwKSAoc3MpCisjZWxpZiAoTFpPX09QVF9VTkFMSUdORUQzMikKKyNkZWZpbmUgTFpPX01FTU9QU19DT1BZOChkZCxzcykgXAorICAgIExaT19CTE9DS19CRUdJTiBMWk9fTUVNT1BTX0NPUFk0KGRkLHNzKTsgTFpPX01FTU9QU19DT1BZNCgobHpvX21lbW9wc19UVTFwKShsem9fbWVtb3BzX1RVMHApKGRkKSs0LChjb25zdCBsem9fbWVtb3BzX1RVMXApKGNvbnN0IGx6b19tZW1vcHNfVFUwcCkoc3MpKzQpOyBMWk9fQkxPQ0tfRU5ECisjZWxpZiBkZWZpbmVkKF9fbHpvX21lbW9wc190Y2hlY2spCisjZGVmaW5lIExaT19NRU1PUFNfQ09QWTgoZGQsc3MpIFwKKyAgICBMWk9fQkxPQ0tfQkVHSU4gaWYgKF9fbHpvX21lbW9wc190Y2hlY2sobHpvX21lbW9wc19UVTgsOCwxKSkgeyBcCisgICAgICAgICogKGx6b19tZW1vcHNfVFU4cCkgKGx6b19tZW1vcHNfVFUwcCkgKGRkKSA9ICogKGNvbnN0IGx6b19tZW1vcHNfVFU4cCkgKGNvbnN0IGx6b19tZW1vcHNfVFUwcCkgKHNzKTsgXAorICAgIH0gZWxzZSB7IExaT19NRU1PUFNfTU9WRTgoZGQsc3MpOyB9IExaT19CTE9DS19FTkQKKyNlbHNlCisjZGVmaW5lIExaT19NRU1PUFNfQ09QWTgoZGQsc3MpIExaT19NRU1PUFNfTU9WRTgoZGQsc3MpCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZSBMWk9fTUVNT1BTX0NPUFlOKGRkLHNzLG5uKSBcCisgICAgTFpPX0JMT0NLX0JFR0lOIFwKKyAgICBsem9fbWVtb3BzX1RVMXAgZF9fbiA9IChsem9fbWVtb3BzX1RVMXApIChsem9fbWVtb3BzX1RVMHApIChkZCk7IFwKKyAgICBjb25zdCBsem9fbWVtb3BzX1RVMXAgc19fbiA9IChjb25zdCBsem9fbWVtb3BzX1RVMXApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcyk7IFwKKyAgICBsem9fdWludCBuX19uID0gKG5uKTsgXAorICAgIHdoaWxlICgodm9pZCkwLCBuX19uID49IDgpIHsgTFpPX01FTU9QU19DT1BZOChkX19uLCBzX19uKTsgZF9fbiArPSA4OyBzX19uICs9IDg7IG5fX24gLT0gODsgfSBcCisgICAgaWYgKCh2b2lkKTAsIG5fX24gPj0gNCkgeyBMWk9fTUVNT1BTX0NPUFk0KGRfX24sIHNfX24pOyBkX19uICs9IDQ7IHNfX24gKz0gNDsgbl9fbiAtPSA0OyB9IFwKKyAgICBpZiAoKHZvaWQpMCwgbl9fbiA+IDApIGRvIHsgKmRfX24rKyA9ICpzX19uKys7IH0gd2hpbGUgKC0tbl9fbiA+IDApOyBcCisgICAgTFpPX0JMT0NLX0VORAorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgbHpvX3VpbnQxNl90IGx6b19tZW1vcHNfZ2V0X2xlMTYoY29uc3QgbHpvX3ZvaWRwIHNzKQoreworICAgIGx6b191aW50MTZfdCB2OworI2lmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgTFpPX01FTU9QU19DT1BZMigmdiwgc3MpOworI2VsaWYgKExaT19PUFRfVU5BTElHTkVEMTYgJiYgTFpPX0FSQ0hfUE9XRVJQQyAmJiBMWk9fQUJJX0JJR19FTkRJQU4pICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIGNvbnN0IGx6b19tZW1vcHNfVFUycCBzID0gKGNvbnN0IGx6b19tZW1vcHNfVFUycCkgc3M7CisgICAgdW5zaWduZWQgbG9uZyB2djsKKyAgICBfX2FzbV9fKCJsaGJyeCAlMCwwLCUxIiA6ICI9ciIgKHZ2KSA6ICJyIiAocyksICJtIiAoKnMpKTsKKyAgICB2ID0gKGx6b191aW50MTZfdCkgdnY7CisjZWxzZQorICAgIGNvbnN0IGx6b19tZW1vcHNfVFUxcCBzID0gKGNvbnN0IGx6b19tZW1vcHNfVFUxcCkgc3M7CisgICAgdiA9IChsem9fdWludDE2X3QpICgoKGx6b191aW50MTZfdClzWzBdKSB8ICgobHpvX3VpbnQxNl90KXNbMV0gPDwgOCkpOworI2VuZGlmCisgICAgcmV0dXJuIHY7Cit9CisjaWYgKExaT19PUFRfVU5BTElHTkVEMTYpICYmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisjZGVmaW5lIExaT19NRU1PUFNfR0VUX0xFMTYoc3MpICAgICogKGNvbnN0IGx6b19tZW1vcHNfVFUycCkgKGNvbnN0IGx6b19tZW1vcHNfVFUwcCkgKHNzKQorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19HRVRfTEUxNihzcykgICAgbHpvX21lbW9wc19nZXRfbGUxNihzcykKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgbHpvX3VpbnQzMl90IGx6b19tZW1vcHNfZ2V0X2xlMzIoY29uc3QgbHpvX3ZvaWRwIHNzKQoreworICAgIGx6b191aW50MzJfdCB2OworI2lmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgTFpPX01FTU9QU19DT1BZNCgmdiwgc3MpOworI2VsaWYgKExaT19PUFRfVU5BTElHTkVEMzIgJiYgTFpPX0FSQ0hfUE9XRVJQQyAmJiBMWk9fQUJJX0JJR19FTkRJQU4pICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIGNvbnN0IGx6b19tZW1vcHNfVFU0cCBzID0gKGNvbnN0IGx6b19tZW1vcHNfVFU0cCkgc3M7CisgICAgdW5zaWduZWQgbG9uZyB2djsKKyAgICBfX2FzbV9fKCJsd2JyeCAlMCwwLCUxIiA6ICI9ciIgKHZ2KSA6ICJyIiAocyksICJtIiAoKnMpKTsKKyAgICB2ID0gKGx6b191aW50MzJfdCkgdnY7CisjZWxzZQorICAgIGNvbnN0IGx6b19tZW1vcHNfVFUxcCBzID0gKGNvbnN0IGx6b19tZW1vcHNfVFUxcCkgc3M7CisgICAgdiA9IChsem9fdWludDMyX3QpICgoKGx6b191aW50MzJfdClzWzBdIDw8IDI0KSB8ICgobHpvX3VpbnQzMl90KXNbMV0gPDwgMTYpIHwgKChsem9fdWludDMyX3Qpc1syXSA8PCA4KSB8ICgobHpvX3VpbnQzMl90KXNbM10pKTsKKyNlbmRpZgorICAgIHJldHVybiB2OworfQorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKSAmJiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9MRTMyKHNzKSAgICAqIChjb25zdCBsem9fbWVtb3BzX1RVNHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbHNlCisjZGVmaW5lIExaT19NRU1PUFNfR0VUX0xFMzIoc3MpICAgIGx6b19tZW1vcHNfZ2V0X2xlMzIoc3MpCisjZW5kaWYKKworI2lmIChMWk9fT1BUX1VOQUxJR05FRDY0KSAmJiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9MRTY0KHNzKSAgICAqIChjb25zdCBsem9fbWVtb3BzX1RVOHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgbHpvX3VpbnQxNl90IGx6b19tZW1vcHNfZ2V0X25lMTYoY29uc3QgbHpvX3ZvaWRwIHNzKQoreworICAgIGx6b191aW50MTZfdCB2OworICAgIExaT19NRU1PUFNfQ09QWTIoJnYsIHNzKTsKKyAgICByZXR1cm4gdjsKK30KKyNpZiAoTFpPX09QVF9VTkFMSUdORUQxNikKKyNkZWZpbmUgTFpPX01FTU9QU19HRVRfTkUxNihzcykgICAgKiAoY29uc3QgbHpvX21lbW9wc19UVTJwKSAoY29uc3QgbHpvX21lbW9wc19UVTBwKSAoc3MpCisjZWxzZQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9ORTE2KHNzKSAgICBsem9fbWVtb3BzX2dldF9uZTE2KHNzKQorI2VuZGlmCisKK19fbHpvX3N0YXRpY19mb3JjZWlubGluZSBsem9fdWludDMyX3QgbHpvX21lbW9wc19nZXRfbmUzMihjb25zdCBsem9fdm9pZHAgc3MpCit7CisgICAgbHpvX3VpbnQzMl90IHY7CisgICAgTFpPX01FTU9QU19DT1BZNCgmdiwgc3MpOworICAgIHJldHVybiB2OworfQorI2lmIChMWk9fT1BUX1VOQUxJR05FRDMyKQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9ORTMyKHNzKSAgICAqIChjb25zdCBsem9fbWVtb3BzX1RVNHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbHNlCisjZGVmaW5lIExaT19NRU1PUFNfR0VUX05FMzIoc3MpICAgIGx6b19tZW1vcHNfZ2V0X25lMzIoc3MpCisjZW5kaWYKKworI2lmIChMWk9fT1BUX1VOQUxJR05FRDY0KQorI2RlZmluZSBMWk9fTUVNT1BTX0dFVF9ORTY0KHNzKSAgICAqIChjb25zdCBsem9fbWVtb3BzX1RVOHApIChjb25zdCBsem9fbWVtb3BzX1RVMHApIChzcykKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgdm9pZCBsem9fbWVtb3BzX3B1dF9sZTE2KGx6b192b2lkcCBkZCwgbHpvX3VpbnQxNl90IHZ2KQoreworI2lmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgTFpPX01FTU9QU19DT1BZMihkZCwgJnZ2KTsKKyNlbGlmIChMWk9fT1BUX1VOQUxJR05FRDE2ICYmIExaT19BUkNIX1BPV0VSUEMgJiYgTFpPX0FCSV9CSUdfRU5ESUFOKSAmJiAoTFpPX0FTTV9TWU5UQVhfR05VQykKKyAgICBsem9fbWVtb3BzX1RVMnAgZCA9IChsem9fbWVtb3BzX1RVMnApIGRkOworICAgIHVuc2lnbmVkIGxvbmcgdiA9IHZ2OworICAgIF9fYXNtX18oInN0aGJyeCAlMiwwLCUxIiA6ICI9bSIgKCpkKSA6ICJyIiAoZCksICJyIiAodikpOworI2Vsc2UKKyAgICBsem9fbWVtb3BzX1RVMXAgZCA9IChsem9fbWVtb3BzX1RVMXApIGRkOworICAgIGRbMF0gPSBMWk9fQllURSgodnYgICAgICApICYgMHhmZik7CisgICAgZFsxXSA9IExaT19CWVRFKCh2diA+PiAgOCkgJiAweGZmKTsKKyNlbmRpZgorfQorI2lmIChMWk9fT1BUX1VOQUxJR05FRDE2KSAmJiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBMWk9fTUVNT1BTX1BVVF9MRTE2KGRkLHZ2KSAoKiAobHpvX21lbW9wc19UVTJwKSAobHpvX21lbW9wc19UVTBwKSAoZGQpID0gKHZ2KSkKKyNlbHNlCisjZGVmaW5lIExaT19NRU1PUFNfUFVUX0xFMTYoZGQsdnYpIGx6b19tZW1vcHNfcHV0X2xlMTYoZGQsdnYpCisjZW5kaWYKKworX19sem9fc3RhdGljX2ZvcmNlaW5saW5lIHZvaWQgbHpvX21lbW9wc19wdXRfbGUzMihsem9fdm9pZHAgZGQsIGx6b191aW50MzJfdCB2dikKK3sKKyNpZiAoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorICAgIExaT19NRU1PUFNfQ09QWTQoZGQsICZ2dik7CisjZWxpZiAoTFpPX09QVF9VTkFMSUdORUQzMiAmJiBMWk9fQVJDSF9QT1dFUlBDICYmIExaT19BQklfQklHX0VORElBTikgJiYgKExaT19BU01fU1lOVEFYX0dOVUMpCisgICAgbHpvX21lbW9wc19UVTRwIGQgPSAobHpvX21lbW9wc19UVTRwKSBkZDsKKyAgICB1bnNpZ25lZCBsb25nIHYgPSB2djsKKyAgICBfX2FzbV9fKCJzdHdicnggJTIsMCwlMSIgOiAiPW0iICgqZCkgOiAiciIgKGQpLCAiciIgKHYpKTsKKyNlbHNlCisgICAgbHpvX21lbW9wc19UVTFwIGQgPSAobHpvX21lbW9wc19UVTFwKSBkZDsKKyAgICBkWzBdID0gTFpPX0JZVEUoKHZ2ICAgICAgKSAmIDB4ZmYpOworICAgIGRbMV0gPSBMWk9fQllURSgodnYgPj4gIDgpICYgMHhmZik7CisgICAgZFsyXSA9IExaT19CWVRFKCh2diA+PiAxNikgJiAweGZmKTsKKyAgICBkWzNdID0gTFpPX0JZVEUoKHZ2ID4+IDI0KSAmIDB4ZmYpOworI2VuZGlmCit9CisjaWYgKExaT19PUFRfVU5BTElHTkVEMzIpICYmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisjZGVmaW5lIExaT19NRU1PUFNfUFVUX0xFMzIoZGQsdnYpICgqIChsem9fbWVtb3BzX1RVNHApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAodnYpKQorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19QVVRfTEUzMihkZCx2dikgbHpvX21lbW9wc19wdXRfbGUzMihkZCx2dikKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgdm9pZCBsem9fbWVtb3BzX3B1dF9uZTE2KGx6b192b2lkcCBkZCwgbHpvX3VpbnQxNl90IHZ2KQoreworICAgIExaT19NRU1PUFNfQ09QWTIoZGQsICZ2dik7Cit9CisjaWYgKExaT19PUFRfVU5BTElHTkVEMTYpCisjZGVmaW5lIExaT19NRU1PUFNfUFVUX05FMTYoZGQsdnYpICgqIChsem9fbWVtb3BzX1RVMnApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAodnYpKQorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19QVVRfTkUxNihkZCx2dikgbHpvX21lbW9wc19wdXRfbmUxNihkZCx2dikKKyNlbmRpZgorCitfX2x6b19zdGF0aWNfZm9yY2VpbmxpbmUgdm9pZCBsem9fbWVtb3BzX3B1dF9uZTMyKGx6b192b2lkcCBkZCwgbHpvX3VpbnQzMl90IHZ2KQoreworICAgIExaT19NRU1PUFNfQ09QWTQoZGQsICZ2dik7Cit9CisjaWYgKExaT19PUFRfVU5BTElHTkVEMzIpCisjZGVmaW5lIExaT19NRU1PUFNfUFVUX05FMzIoZGQsdnYpICgqIChsem9fbWVtb3BzX1RVNHApIChsem9fbWVtb3BzX1RVMHApIChkZCkgPSAodnYpKQorI2Vsc2UKKyNkZWZpbmUgTFpPX01FTU9QU19QVVRfTkUzMihkZCx2dikgbHpvX21lbW9wc19wdXRfbmUzMihkZCx2dikKKyNlbmRpZgorCisjaWYgMSAmJiAoTFpPX0NDX0FSTUNDX0dOVUMgfHwgTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAyMDcwMHVsKSB8fCBMWk9fQ0NfSU5URUxDX0dOVUMgfHwgTFpPX0NDX0xMVk0gfHwgTFpPX0NDX1BBVEhTQ0FMRSB8fCBMWk9fQ0NfUEdJKQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZWxzZQorX19sem9fc3RhdGljX2ZvcmNlaW5saW5lIHZvaWQKKyNlbmRpZgorbHpvX21lbW9wc191bnVzZWRfZnVuY3Modm9pZCkKK3sKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX21lbW9wc19nZXRfbGUxNik7CisgICAgTFpPX1VOVVNFRF9GVU5DKGx6b19tZW1vcHNfZ2V0X2xlMzIpOworICAgIExaT19VTlVTRURfRlVOQyhsem9fbWVtb3BzX2dldF9uZTE2KTsKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX21lbW9wc19nZXRfbmUzMik7CisgICAgTFpPX1VOVVNFRF9GVU5DKGx6b19tZW1vcHNfcHV0X2xlMTYpOworICAgIExaT19VTlVTRURfRlVOQyhsem9fbWVtb3BzX3B1dF9sZTMyKTsKKyAgICBMWk9fVU5VU0VEX0ZVTkMobHpvX21lbW9wc19wdXRfbmUxNik7CisgICAgTFpPX1VOVVNFRF9GVU5DKGx6b19tZW1vcHNfcHV0X25lMzIpOworICAgIExaT19VTlVTRURfRlVOQyhsem9fbWVtb3BzX3VudXNlZF9mdW5jcyk7Cit9CisKKyNlbmRpZiAvKiBhbHJlYWR5IGluY2x1ZGVkICovCisKKy8qIHZpbTpzZXQgdHM9NCBzdz00IGV0OiAqLwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem9faW5pdC5jIGIvbHpvL3NyYy9sem9faW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjhhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vc3JjL2x6b19pbml0LmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qIGx6b19pbml0LmMgLS0gaW5pdGlhbGl6YXRpb24gb2YgdGhlIExaTyBsaWJyYXJ5CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2luY2x1ZGUgImx6b19jb25mLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBSdW50aW1lIGNoZWNrIG9mIHRoZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgc2l6ZSBvZiBidWlsdGluIHR5cGVzLAorLy8gbWVtb3J5IG1vZGVsLCBieXRlIG9yZGVyIGFuZCBvdGhlciBsb3ctbGV2ZWwgY29uc3RydWN0cy4KKy8vCisvLyBXZSBhcmUgcmVhbGx5IHBhcmFub2lkIGhlcmUgLSBMWk8gc2hvdWxkIGVpdGhlciBmYWlsCisvLyBhdCBzdGFydHVwIG9yIG5vdCBhdCBhbGwuCisvLworLy8gQmVjYXVzZSBvZiBpbmxpbmluZyBtdWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyBldmFsdWF0ZXMgdG8gbm90aGluZy4KKy8vCisvLyBBbmQgd2hpbGUgbWFueSBvZiB0aGUgdGVzdHMgc2VlbSBoaWdobHkgb2J2aW91cyBhbmQgcmVkdW5kYW50IHRoZXkgYXJlCisvLyBoZXJlIHRvIGNhdGNoIGNvbXBpbGVyL29wdGltaXplciBidWdzLiBZZXMsIHRoZXNlIGRvIGV4aXN0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoX19MWk9fSU5fTUlOSUxaTykKKworI2RlZmluZSBMWk9fV0FOVF9BQ0NfQ0hLX0NIIDEKKyN1bmRlZiBMWk9DSEtfQVNTRVJUCisjaW5jbHVkZSAibHpvX3N1cHAuaCIKKworICAgIExaT0NIS19BU1NFUlQoKExaT19VSU5UMzJfQygxKSA8PCAoaW50KSg4KnNpemVvZihMWk9fVUlOVDMyX0MoMSkpLTEpKSA+IDApCisgICAgTFpPQ0hLX0FTU0VSVF9JU19TSUdORURfVChsem9faW50KQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludCkKKyNpZiAhKF9fTFpPX1VJTlRQVFJfVF9JU19QT0lOVEVSKQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludHB0cl90KQorI2VuZGlmCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX3VpbnRwdHJfdCkgPj0gc2l6ZW9mKGx6b192b2lkcCkpCisgICAgTFpPQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKGx6b194aW50KQorCisjZW5kaWYKKyN1bmRlZiBMWk9DSEtfQVNTRVJUCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBsem9fY29uZmlnX2NoZWNrX3VuaW9uIHsKKyAgICBsem9fdWludCBhWzJdOworICAgIHVuc2lnbmVkIGNoYXIgYlsyKkxaT19NQVgoOCxzaXplb2YobHpvX3VpbnQpKV07CisjaWYgZGVmaW5lZChsem9fdWludDY0X3QpCisgICAgbHpvX3VpbnQ2NF90IGNbMl07CisjZW5kaWYKK307CisKKworI2lmIDAKKyNkZWZpbmUgdTJwKHB0cixvZmYpICgobHpvX3ZvaWRwKSAoKChsem9fYnl0ZXApKGx6b192b2lkcCkocHRyKSkgKyAob2ZmKSkpCisjZWxzZQorc3RhdGljIF9fbHpvX25vaW5saW5lIGx6b192b2lkcCB1MnAobHpvX3ZvaWRwIHB0ciwgbHpvX3VpbnQgb2ZmKQoreworICAgIHJldHVybiAobHpvX3ZvaWRwKSAoKGx6b19ieXRlcCkgcHRyICsgb2ZmKTsKK30KKyNlbmRpZgorCisKK0xaT19QVUJMSUMoaW50KQorX2x6b19jb25maWdfY2hlY2sodm9pZCkKK3sKKyNpZiAoTFpPX0NDX0NMQU5HICYmIChMWk9fQ0NfQ0xBTkcgPj0gMHgwMzAxMDB1bCAmJiBMWk9fQ0NfQ0xBTkcgPCAweDAzMDMwMHVsKSkKKyMgaWYgMAorICAgIC8qIHdvcmsgYXJvdW5kIGEgY2xhbmcgMy4xIGFuZCBjbGFuZyAzLjIgY29tcGlsZXIgYnVnOyBjbGFuZyAzLjMgYW5kIDMuNCB3b3JrICovCisgICAgdm9sYXRpbGUKKyMgZW5kaWYKKyNlbmRpZgorICAgIHVuaW9uIGx6b19jb25maWdfY2hlY2tfdW5pb24gdTsKKyAgICBsem9fdm9pZHAgcDsKKyAgICB1bnNpZ25lZCByID0gMTsKKworICAgIHUuYVswXSA9IHUuYVsxXSA9IDA7CisgICAgcCA9IHUycCgmdSwgMCk7CisgICAgciAmPSAoKCogKGx6b19ieXRlcCkgcCkgPT0gMCk7CisjaWYgIShMWk9fQ0ZHX05PX0NPTkZJR19DSEVDSykKKyNpZiAoTFpPX0FCSV9CSUdfRU5ESUFOKQorICAgIHUuYVswXSA9IHUuYVsxXSA9IDA7IHUuYltzaXplb2YobHpvX3VpbnQpIC0gMV0gPSAxMjg7CisgICAgcCA9IHUycCgmdSwgMCk7CisgICAgciAmPSAoKCogKGx6b191aW50cCkgcCkgPT0gMTI4KTsKKyNlbmRpZgorI2lmIChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisgICAgdS5hWzBdID0gdS5hWzFdID0gMDsgdS5iWzBdID0gMTI4OworICAgIHAgPSB1MnAoJnUsIDApOworICAgIHIgJj0gKCgqIChsem9fdWludHApIHApID09IDEyOCk7CisjZW5kaWYKKyAgICB1LmFbMF0gPSB1LmFbMV0gPSAwOworICAgIHUuYlswXSA9IDE7IHUuYlszXSA9IDI7CisgICAgcCA9IHUycCgmdSwgMSk7CisgICAgciAmPSBVQV9HRVRfTkUxNihwKSA9PSAwOworICAgIHIgJj0gVUFfR0VUX0xFMTYocCkgPT0gMDsKKyAgICB1LmJbMV0gPSAxMjg7CisgICAgciAmPSBVQV9HRVRfTEUxNihwKSA9PSAxMjg7CisgICAgdS5hWzBdID0gdS5hWzFdID0gMDsKKyAgICB1LmJbMF0gPSAzOyB1LmJbNV0gPSA0OworICAgIHAgPSB1MnAoJnUsIDEpOworICAgIHIgJj0gVUFfR0VUX05FMzIocCkgPT0gMDsKKyAgICByICY9IFVBX0dFVF9MRTMyKHApID09IDA7CisgICAgdS5iWzFdID0gMTI4OworICAgIHIgJj0gVUFfR0VUX0xFMzIocCkgPT0gMTI4OworI2lmIGRlZmluZWQoVUFfR0VUX05FNjQpCisgICAgdS5jWzBdID0gdS5jWzFdID0gMDsKKyAgICB1LmJbMF0gPSA1OyB1LmJbOV0gPSA2OworICAgIHAgPSB1MnAoJnUsIDEpOworICAgIHUuY1swXSA9IHUuY1sxXSA9IDA7CisgICAgciAmPSBVQV9HRVRfTkU2NChwKSA9PSAwOworI2lmIGRlZmluZWQoVUFfR0VUX0xFNjQpCisgICAgciAmPSBVQV9HRVRfTEU2NChwKSA9PSAwOworICAgIHUuYlsxXSA9IDEyODsKKyAgICByICY9IFVBX0dFVF9MRTY0KHApID09IDEyODsKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChsem9fYml0b3BzX2N0bHozMikKKyAgICB7IHVuc2lnbmVkIGkgPSAwOyBsem9fdWludDMyX3QgdjsKKyAgICBmb3IgKHYgPSAxOyB2ICE9IDAgJiYgciA9PSAxOyB2IDw8PSAxLCBpKyspIHsKKyAgICAgICAgciAmPSBsem9fYml0b3BzX2N0bHozMih2KSA9PSAzMSAtIGk7CisgICAgICAgIHIgJj0gbHpvX2JpdG9wc19jdGx6MzJfZnVuYyh2KSA9PSAzMSAtIGk7CisgICAgfX0KKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2JpdG9wc19jdGx6NjQpCisgICAgeyB1bnNpZ25lZCBpID0gMDsgbHpvX3VpbnQ2NF90IHY7CisgICAgZm9yICh2ID0gMTsgdiAhPSAwICYmIHIgPT0gMTsgdiA8PD0gMSwgaSsrKSB7CisgICAgICAgIHIgJj0gbHpvX2JpdG9wc19jdGx6NjQodikgPT0gNjMgLSBpOworICAgICAgICByICY9IGx6b19iaXRvcHNfY3RsejY0X2Z1bmModikgPT0gNjMgLSBpOworICAgIH19CisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19iaXRvcHNfY3R0ejMyKQorICAgIHsgdW5zaWduZWQgaSA9IDA7IGx6b191aW50MzJfdCB2OworICAgIGZvciAodiA9IDE7IHYgIT0gMCAmJiByID09IDE7IHYgPDw9IDEsIGkrKykgeworICAgICAgICByICY9IGx6b19iaXRvcHNfY3R0ejMyKHYpID09IGk7CisgICAgICAgIHIgJj0gbHpvX2JpdG9wc19jdHR6MzJfZnVuYyh2KSA9PSBpOworICAgIH19CisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19iaXRvcHNfY3R0ejY0KQorICAgIHsgdW5zaWduZWQgaSA9IDA7IGx6b191aW50NjRfdCB2OworICAgIGZvciAodiA9IDE7IHYgIT0gMCAmJiByID09IDE7IHYgPDw9IDEsIGkrKykgeworICAgICAgICByICY9IGx6b19iaXRvcHNfY3R0ejY0KHYpID09IGk7CisgICAgICAgIHIgJj0gbHpvX2JpdG9wc19jdHR6NjRfZnVuYyh2KSA9PSBpOworICAgIH19CisjZW5kaWYKKyNlbmRpZgorICAgIExaT19VTlVTRURfRlVOQyhsem9fYml0b3BzX3VudXNlZF9mdW5jcyk7CisKKyAgICByZXR1cm4gciA9PSAxID8gTFpPX0VfT0sgOiBMWk9fRV9FUlJPUjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xaT19QVUJMSUMoaW50KQorX19sem9faW5pdF92Mih1bnNpZ25lZCB2LCBpbnQgczEsIGludCBzMiwgaW50IHMzLCBpbnQgczQsIGludCBzNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHM2LCBpbnQgczcsIGludCBzOCwgaW50IHM5KQoreworICAgIGludCByOworCisjaWYgZGVmaW5lZChfX0xaT19JTl9NSU5JTFpPKQorI2VsaWYgKExaT19DQ19NU0MgJiYgKChfTVNDX1ZFUikgPCA3MDApKQorI2Vsc2UKKyNkZWZpbmUgTFpPX1dBTlRfQUNDX0NIS19DSCAxCisjdW5kZWYgTFpPQ0hLX0FTU0VSVAorI2RlZmluZSBMWk9DSEtfQVNTRVJUKGV4cHIpICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChleHByKQorI2luY2x1ZGUgImx6b19zdXBwLmgiCisjZW5kaWYKKyN1bmRlZiBMWk9DSEtfQVNTRVJUCisKKyAgICBpZiAodiA9PSAwKQorICAgICAgICByZXR1cm4gTFpPX0VfRVJST1I7CisKKyAgICByID0gKHMxID09IC0xIHx8IHMxID09IChpbnQpIHNpemVvZihzaG9ydCkpICYmCisgICAgICAgIChzMiA9PSAtMSB8fCBzMiA9PSAoaW50KSBzaXplb2YoaW50KSkgJiYKKyAgICAgICAgKHMzID09IC0xIHx8IHMzID09IChpbnQpIHNpemVvZihsb25nKSkgJiYKKyAgICAgICAgKHM0ID09IC0xIHx8IHM0ID09IChpbnQpIHNpemVvZihsem9fdWludDMyX3QpKSAmJgorICAgICAgICAoczUgPT0gLTEgfHwgczUgPT0gKGludCkgc2l6ZW9mKGx6b191aW50KSkgJiYKKyAgICAgICAgKHM2ID09IC0xIHx8IHM2ID09IChpbnQpIGx6b19zaXplb2ZfZGljdF90KSAmJgorICAgICAgICAoczcgPT0gLTEgfHwgczcgPT0gKGludCkgc2l6ZW9mKGNoYXIgKikpICYmCisgICAgICAgIChzOCA9PSAtMSB8fCBzOCA9PSAoaW50KSBzaXplb2YobHpvX3ZvaWRwKSkgJiYKKyAgICAgICAgKHM5ID09IC0xIHx8IHM5ID09IChpbnQpIHNpemVvZihsem9fY2FsbGJhY2tfdCkpOworICAgIGlmICghcikKKyAgICAgICAgcmV0dXJuIExaT19FX0VSUk9SOworCisgICAgciA9IF9sem9fY29uZmlnX2NoZWNrKCk7CisgICAgaWYgKHIgIT0gTFpPX0VfT0spCisgICAgICAgIHJldHVybiByOworCisgICAgcmV0dXJuIHI7Cit9CisKKworI2lmICFkZWZpbmVkKF9fTFpPX0lOX01JTklMWk8pCisjaW5jbHVkZSAibHpvX2RsbC5jaCIKKyNlbmRpZgorCisKKy8qCit2aTp0cz00OmV0CisqLwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem9fbWNody5jaCBiL2x6by9zcmMvbHpvX21jaHcuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3MzYxMgotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbHpvX21jaHcuY2gKQEAgLTAsMCArMSwyMjUgQEAKKy8qIGx6b19tY2h3LmNoIC0tIG1hdGNoaW5nIGZ1bmN0aW9ucyB1c2luZyBhIHdpbmRvdworCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBpbml0OworCisgICAgbHpvX3VpbnQgbG9vazsgICAgICAgICAgLyogYnl0ZXMgaW4gbG9va2FoZWFkIGJ1ZmZlciAqLworCisgICAgbHpvX3VpbnQgbV9sZW47CisgICAgbHpvX3VpbnQgbV9vZmY7CisKKyAgICBsem9fdWludCBsYXN0X21fbGVuOworICAgIGx6b191aW50IGxhc3RfbV9vZmY7CisKKyAgICBjb25zdCBsem9fYnl0ZXAgYnA7CisgICAgY29uc3QgbHpvX2J5dGVwIGlwOworICAgIGNvbnN0IGx6b19ieXRlcCBpbjsKKyAgICBjb25zdCBsem9fYnl0ZXAgaW5fZW5kOworICAgIGx6b19ieXRlcCBvdXQ7CisKKyAgICBsem9fY2FsbGJhY2tfcCBjYjsKKworICAgIGx6b191aW50IHRleHRzaXplOyAgICAgIC8qIHRleHQgc2l6ZSBjb3VudGVyICovCisgICAgbHpvX3VpbnQgY29kZXNpemU7ICAgICAgLyogY29kZSBzaXplIGNvdW50ZXIgKi8KKyAgICBsem9fdWludCBwcmludGNvdW50OyAgICAvKiBjb3VudGVyIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgZXZlcnkgMUsgYnl0ZXMgKi8KKworICAgIC8qIHNvbWUgc3RhdHMgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxpdF9ieXRlczsKKyAgICB1bnNpZ25lZCBsb25nIG1hdGNoX2J5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgcmVwX2J5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgbGF6eTsKKworI2lmIGRlZmluZWQoTFpPMUIpCisgICAgbHpvX3VpbnQgcjFfbV9sZW47CisKKyAgICAvKiBzb21lIHN0YXRzICovCisgICAgdW5zaWduZWQgbG9uZyByMV9yLCBtM19yLCBtMl9tLCBtM19tOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKExaTzFDKQorICAgIGx6b191aW50IHIxX21fbGVuOworICAgIGx6b19ieXRlcCBtMzsKKworICAgIC8qIHNvbWUgc3RhdHMgKi8KKyAgICB1bnNpZ25lZCBsb25nIHIxX3IsIG0zX3IsIG0yX20sIG0zX207CisjZW5kaWYKKworI2lmIGRlZmluZWQoTFpPMUYpCisgICAgbHpvX3VpbnQgcjFfbGl0OworICAgIGx6b191aW50IHIxX21fbGVuOworCisgICAgLyogc29tZSBzdGF0cyAqLworICAgIHVuc2lnbmVkIGxvbmcgcjFfciwgbTJfbSwgbTNfbTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChMWk8xWCkgfHwgZGVmaW5lZChMWk8xWSkgfHwgZGVmaW5lZChMWk8xWikKKyAgICBsem9fdWludCByMV9saXQ7CisgICAgbHpvX3VpbnQgcjFfbV9sZW47CisKKyAgICAvKiBzb21lIHN0YXRzICovCisgICAgdW5zaWduZWQgbG9uZyBtMWFfbSwgbTFiX20sIG0yX20sIG0zX20sIG00X207CisgICAgdW5zaWduZWQgbG9uZyBsaXQxX3IsIGxpdDJfciwgbGl0M19yOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKExaTzJBKQorICAgIC8qIHNvbWUgc3RhdHMgKi8KKyAgICB1bnNpZ25lZCBsb25nIG0xLCBtMiwgbTMsIG00OworI2VuZGlmCit9CitMWk9fQ09NUFJFU1NfVDsKKworCisjZGVmaW5lIGdldGJ5dGUoYykgICgoYykuaXAgPCAoYykuaW5fZW5kID8gKigoYykuaXApKysgOiAoLTEpKQorCisjaW5jbHVkZSAibHpvX3N3ZC5jaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2luaXRfbWF0Y2ggKCBMWk9fQ09NUFJFU1NfVCAqYywgbHpvX3N3ZF9wIHMsCisgICAgICAgICAgICAgY29uc3QgbHpvX2J5dGVwIGRpY3QsIGx6b191aW50IGRpY3RfbGVuLAorICAgICAgICAgICAgIGx6b191aW50MzJfdCBmbGFncyApCit7CisgICAgaW50IHI7CisKKyAgICBhc3NlcnQoIWMtPmluaXQpOworICAgIGMtPmluaXQgPSAxOworCisgICAgcy0+YyA9IGM7CisKKyAgICBjLT5sYXN0X21fbGVuID0gYy0+bGFzdF9tX29mZiA9IDA7CisKKyAgICBjLT50ZXh0c2l6ZSA9IGMtPmNvZGVzaXplID0gYy0+cHJpbnRjb3VudCA9IDA7CisgICAgYy0+bGl0X2J5dGVzID0gYy0+bWF0Y2hfYnl0ZXMgPSBjLT5yZXBfYnl0ZXMgPSAwOworICAgIGMtPmxhenkgPSAwOworCisgICAgciA9IHN3ZF9pbml0KHMsZGljdCxkaWN0X2xlbik7CisgICAgaWYgKHIgIT0gTFpPX0VfT0spCisgICAgeworICAgICAgICBzd2RfZXhpdChzKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgcy0+dXNlX2Jlc3Rfb2ZmID0gKGZsYWdzICYgMSkgPyAxIDogMDsKKyAgICByZXR1cm4gTFpPX0VfT0s7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitmaW5kX21hdGNoICggTFpPX0NPTVBSRVNTX1QgKmMsIGx6b19zd2RfcCBzLAorICAgICAgICAgICAgIGx6b191aW50IHRoaXNfbGVuLCBsem9fdWludCBza2lwICkKK3sKKyAgICBhc3NlcnQoYy0+aW5pdCk7CisKKyAgICBpZiAoc2tpcCA+IDApCisgICAgeworICAgICAgICBhc3NlcnQodGhpc19sZW4gPj0gc2tpcCk7CisgICAgICAgIHN3ZF9hY2NlcHQocywgdGhpc19sZW4gLSBza2lwKTsKKyAgICAgICAgYy0+dGV4dHNpemUgKz0gdGhpc19sZW4gLSBza2lwICsgMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXNzZXJ0KHRoaXNfbGVuIDw9IDEpOworICAgICAgICBjLT50ZXh0c2l6ZSArPSB0aGlzX2xlbiAtIHNraXA7CisgICAgfQorCisgICAgcy0+bV9sZW4gPSBTV0RfVEhSRVNIT0xEOworICAgIHMtPm1fb2ZmID0gMDsKKyNpZmRlZiBTV0RfQkVTVF9PRkYKKyAgICBpZiAocy0+dXNlX2Jlc3Rfb2ZmKQorICAgICAgICBsem9fbWVtc2V0KHMtPmJlc3RfcG9zLDAsc2l6ZW9mKHMtPmJlc3RfcG9zKSk7CisjZW5kaWYKKyAgICBzd2RfZmluZGJlc3Qocyk7CisgICAgYy0+bV9sZW4gPSBzLT5tX2xlbjsKKyAgICBjLT5tX29mZiA9IHMtPm1fb2ZmOworCisgICAgc3dkX2dldGJ5dGUocyk7CisKKyAgICBpZiAocy0+Yl9jaGFyIDwgMCkKKyAgICB7CisgICAgICAgIGMtPmxvb2sgPSAwOworICAgICAgICBjLT5tX2xlbiA9IDA7CisgICAgICAgIHN3ZF9leGl0KHMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjLT5sb29rID0gcy0+bG9vayArIDE7CisgICAgfQorICAgIGMtPmJwID0gYy0+aXAgLSBjLT5sb29rOworCisjaWYgMAorICAgIC8qIGJydXRlIGZvcmNlIG1hdGNoIHNlYXJjaCAqLworICAgIGlmIChjLT5tX2xlbiA+IFNXRF9USFJFU0hPTEQgJiYgYy0+bV9sZW4gKyAxIDw9IGMtPmxvb2spCisgICAgeworICAgICAgICBjb25zdCBsem9fYnl0ZXAgaXAgPSBjLT5icDsKKyAgICAgICAgY29uc3QgbHpvX2J5dGVwIG0gID0gYy0+YnAgLSBjLT5tX29mZjsKKyAgICAgICAgY29uc3QgbHpvX2J5dGVwIGluID0gYy0+aW47CisKKyAgICAgICAgaWYgKGlwIC0gaW4gPiBzLT5zd2RfbikKKyAgICAgICAgICAgIGluID0gaXAgLSBzLT5zd2RfbjsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKCppbiAhPSAqaXApCisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgIGlmIChpbiA9PSBpcCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChpbiAhPSBtKQorICAgICAgICAgICAgICAgIGlmIChsem9fbWVtY21wKGluLGlwLGMtPm1fbGVuKzEpID09IDApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXAgJXAgJXAgJTVkXG4iLGluLGlwLG0sYy0+bV9sZW4pOworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGMtPmNiICYmIGMtPmNiLT5ucHJvZ3Jlc3MgJiYgYy0+dGV4dHNpemUgPiBjLT5wcmludGNvdW50KQorICAgIHsKKyAgICAgICAgKCpjLT5jYi0+bnByb2dyZXNzKShjLT5jYiwgYy0+dGV4dHNpemUsIGMtPmNvZGVzaXplLCAwKTsKKyAgICAgICAgYy0+cHJpbnRjb3VudCArPSAxMDI0OworICAgIH0KKworICAgIHJldHVybiBMWk9fRV9PSzsKK30KKworCisvKgordmk6dHM9NDpldAorKi8KKwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem9fcHRyLmMgYi9sem8vc3JjL2x6b19wdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk2YjcwCi0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9sem9fcHRyLmMKQEAgLTAsMCArMSw3OCBAQAorLyogbHpvX3B0ci5jIC0tIGxvdy1sZXZlbCBwb2ludGVyIGNvbnN0cnVjdHMKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaW5jbHVkZSAibHpvX2NvbmYuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xaT19QVUJMSUMobHpvX3VpbnRwdHJfdCkKK19fbHpvX3B0cl9saW5lYXIoY29uc3QgbHpvX3ZvaWRwIHB0cikKK3sKKyAgICBsem9fdWludHB0cl90IHA7CisKKyNpZiAoTFpPX0FSQ0hfSTA4NikKKyNlcnJvciAiTFpPX0FSQ0hfSTA4NiBpcyB1bnN1cHBvcnRlZCIKKyNlbGlmIChMWk9fTU1fUFZQKQorI2Vycm9yICJMWk9fTU1fUFZQIGlzIHVuc3VwcG9ydGVkIgorI2Vsc2UKKyAgICBwID0gKGx6b191aW50cHRyX3QpIFBUUl9MSU5FQVIocHRyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMWk9fUFVCTElDKHVuc2lnbmVkKQorX19sem9fYWxpZ25fZ2FwKGNvbnN0IGx6b192b2lkcCBwdHIsIGx6b191aW50IHNpemUpCit7CisjaWYgKF9fTFpPX1VJTlRQVFJfVF9JU19QT0lOVEVSKQorI2Vycm9yICJfX0xaT19VSU5UUFRSX1RfSVNfUE9JTlRFUiBpcyB1bnN1cHBvcnRlZCIKKyNlbHNlCisgICAgbHpvX3VpbnRwdHJfdCBwLCBuOworICAgIHAgPSBfX2x6b19wdHJfbGluZWFyKHB0cik7CisgICAgbiA9ICgoKHAgKyBzaXplIC0gMSkgLyBzaXplKSAqIHNpemUpIC0gcDsKKyNlbmRpZgorCisgICAgYXNzZXJ0KHNpemUgPiAwKTsKKyAgICBhc3NlcnQoKGxvbmcpbiA+PSAwKTsKKyAgICBhc3NlcnQobiA8PSBzaXplKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKW47Cit9CisKKworCisvKgordmk6dHM9NDpldAorKi8KZGlmZiAtLWdpdCBhL2x6by9zcmMvbHpvX3B0ci5oIGIvbHpvL3NyYy9sem9fcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyMzU0OAotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbHpvX3B0ci5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiBsem9fcHRyLmggLS0gbG93LWxldmVsIHBvaW50ZXIgY29uc3RydWN0cworCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSBhbmQgaXMgc3ViamVjdAorICAgdG8gY2hhbmdlLgorICovCisKKworI2lmbmRlZiBfX0xaT19QVFJfSAorI2RlZmluZSBfX0xaT19QVFJfSCAxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFsd2F5cyB1c2UgdGhlIHNhZmUgKD1pbnRlZ3JhbCkgdmVyc2lvbiBmb3IgcG9pbnRlci1jb21wYXJpc29ucy4KKyAqIFRoZSBjb21waWxlciBzaG91bGQgb3B0aW1pemUgYXdheSB0aGUgYWRkaXRpb25hbCBjYXN0cyBhbnl3YXkuCisgKgorICogTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBpZiB0aGUgcmVwcmVzZW50YXRpb24gYW5kIG9yZGVyaW5nCisgKiBvZiB0aGUgcG9pbnRlciBhbmQgdGhlIGludGVncmFsIGlzIHRoZSBzYW1lIChhdCBiaXQgbGV2ZWwpLgorICovCisKKyNpZiAoTFpPX0FSQ0hfSTA4NikKKyNlcnJvciAiTFpPX0FSQ0hfSTA4NiBpcyB1bnN1cHBvcnRlZCIKKyNlbGlmIChMWk9fTU1fUFZQKQorI2Vycm9yICJMWk9fTU1fUFZQIGlzIHVuc3VwcG9ydGVkIgorI2Vsc2UKKyNkZWZpbmUgUFRSKGEpICAgICAgICAgICAgICAoKGx6b191aW50cHRyX3QpIChhKSkKKyNkZWZpbmUgUFRSX0xJTkVBUihhKSAgICAgICBQVFIoYSkKKyNkZWZpbmUgUFRSX0FMSUdORURfNChhKSAgICAoKFBUUl9MSU5FQVIoYSkgJiAzKSA9PSAwKQorI2RlZmluZSBQVFJfQUxJR05FRF84KGEpICAgICgoUFRSX0xJTkVBUihhKSAmIDcpID09IDApCisjZGVmaW5lIFBUUl9BTElHTkVEMl80KGEsYikgKCgoUFRSX0xJTkVBUihhKSB8IFBUUl9MSU5FQVIoYikpICYgMykgPT0gMCkKKyNkZWZpbmUgUFRSX0FMSUdORUQyXzgoYSxiKSAoKChQVFJfTElORUFSKGEpIHwgUFRSX0xJTkVBUihiKSkgJiA3KSA9PSAwKQorI2VuZGlmCisKKyNkZWZpbmUgUFRSX0xUKGEsYikgICAgICAgICAoUFRSKGEpIDwgUFRSKGIpKQorI2RlZmluZSBQVFJfR0UoYSxiKSAgICAgICAgIChQVFIoYSkgPj0gUFRSKGIpKQorI2RlZmluZSBQVFJfRElGRihhLGIpICAgICAgIChQVFIoYSkgLSBQVFIoYikpCisjZGVmaW5lIHBkKGEsYikgICAgICAgICAgICAgKChsem9fdWludCkgKChhKS0oYikpKQorCisKK0xaT19FWFRFUk4obHpvX3VpbnRwdHJfdCkKK19fbHpvX3B0cl9saW5lYXIoY29uc3QgbHpvX3ZvaWRwIHB0cik7CisKKwordHlwZWRlZiB1bmlvbgoreworICAgIGNoYXIgICAgICAgICAgICBhX2NoYXI7CisgICAgdW5zaWduZWQgY2hhciAgIGFfdWNoYXI7CisgICAgc2hvcnQgICAgICAgICAgIGFfc2hvcnQ7CisgICAgdW5zaWduZWQgc2hvcnQgIGFfdXNob3J0OworICAgIGludCAgICAgICAgICAgICBhX2ludDsKKyAgICB1bnNpZ25lZCBpbnQgICAgYV91aW50OworICAgIGxvbmcgICAgICAgICAgICBhX2xvbmc7CisgICAgdW5zaWduZWQgbG9uZyAgIGFfdWxvbmc7CisgICAgbHpvX2ludCAgICAgICAgIGFfbHpvX2ludDsKKyAgICBsem9fdWludCAgICAgICAgYV9sem9fdWludDsKKyAgICBsem9feGludCAgICAgICAgYV9sem9feGludDsKKyAgICBsem9faW50MTZfdCAgICAgYV9sem9faW50MTZfdDsKKyAgICBsem9fdWludDE2X3QgICAgYV9sem9fdWludDE2X3Q7CisgICAgbHpvX2ludDMyX3QgICAgIGFfbHpvX2ludDMyX3Q7CisgICAgbHpvX3VpbnQzMl90ICAgIGFfbHpvX3VpbnQzMl90OworI2lmIGRlZmluZWQobHpvX3VpbnQ2NF90KQorICAgIGx6b19pbnQ2NF90ICAgICBhX2x6b19pbnQ2NF90OworICAgIGx6b191aW50NjRfdCAgICBhX2x6b191aW50NjRfdDsKKyNlbmRpZgorICAgIHNpemVfdCAgICAgICAgICBhX3NpemVfdDsKKyAgICBwdHJkaWZmX3QgICAgICAgYV9wdHJkaWZmX3Q7CisgICAgbHpvX3VpbnRwdHJfdCAgIGFfbHpvX3VpbnRwdHJfdDsKKyAgICB2b2lkICogICAgICAgICAgYV92b2lkX3A7CisgICAgY2hhciAqICAgICAgICAgIGFfY2hhcl9wOworICAgIHVuc2lnbmVkIGNoYXIgKiBhX3VjaGFyX3A7CisgICAgY29uc3Qgdm9pZCAqICAgICAgICAgIGFfY192b2lkX3A7CisgICAgY29uc3QgY2hhciAqICAgICAgICAgIGFfY19jaGFyX3A7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGFfY191Y2hhcl9wOworICAgIGx6b192b2lkcCAgICAgICBhX2x6b192b2lkcDsKKyAgICBsem9fYnl0ZXAgICAgICAgYV9sem9fYnl0ZXA7CisgICAgY29uc3QgbHpvX3ZvaWRwIGFfY19sem9fdm9pZHA7CisgICAgY29uc3QgbHpvX2J5dGVwIGFfY19sem9fYnl0ZXA7Cit9Citsem9fZnVsbF9hbGlnbl90OworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogYWxyZWFkeSBpbmNsdWRlZCAqLworCisvKgordmk6dHM9NDpldAorKi8KKwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem9fc3RyLmMgYi9sem8vc3JjL2x6b19zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NhNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9sem9fc3RyLmMKQEAgLTAsMCArMSw1OSBAQAorLyogbHpvX3N0ci5jIC0tIHN0cmluZyBmdW5jdGlvbnMgZm9yIHRoZSB0aGUgTFpPIGxpYnJhcnkKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaW5jbHVkZSAibHpvX2NvbmYuaCIKKworI3VuZGVmIGx6b19tZW1jbXAKKyN1bmRlZiBsem9fbWVtY3B5CisjdW5kZWYgbHpvX21lbW1vdmUKKyN1bmRlZiBsem9fbWVtc2V0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBzbG93IGJ1dCBwb3J0YWJsZSA8c3RyaW5nLmg+IHN0dWZmLCBvbmx5IHVzZWQgaW4gYXNzZXJ0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGx6b19oc2l6ZV90ICAgICAgICAgICAgIGx6b191aW50CisjZGVmaW5lIGx6b19odm9pZF9wICAgICAgICAgICAgIGx6b192b2lkcAorI2RlZmluZSBsem9faGJ5dGVfcCAgICAgICAgICAgICBsem9fYnl0ZXAKKyNkZWZpbmUgTFpPTElCX1BVQkxJQyhyLGYpICAgICAgTFpPX1BVQkxJQyhyKSBmCisjaWZuZGVmIF9fTFpPTElCX0ZVTkNOQU1FCisjZGVmaW5lIF9fTFpPTElCX0ZVTkNOQU1FKGYpICAgIGYKKyNlbmRpZgorI2RlZmluZSBsem9faG1lbWNtcCAgICAgICAgICAgICBfX0xaT0xJQl9GVU5DTkFNRShsem9fbWVtY21wKQorI2RlZmluZSBsem9faG1lbWNweSAgICAgICAgICAgICBfX0xaT0xJQl9GVU5DTkFNRShsem9fbWVtY3B5KQorI2RlZmluZSBsem9faG1lbW1vdmUgICAgICAgICAgICBfX0xaT0xJQl9GVU5DTkFNRShsem9fbWVtbW92ZSkKKyNkZWZpbmUgbHpvX2htZW1zZXQgICAgICAgICAgICAgX19MWk9MSUJfRlVOQ05BTUUobHpvX21lbXNldCkKKyNkZWZpbmUgTFpPX1dBTlRfQUNDTElCX0hNRU1DUFkgMQorI2luY2x1ZGUgImx6b19zdXBwLmgiCisjdW5kZWYgTFpPTElCX1BVQkxJQworCisKKy8qCit2aTp0cz00OmV0CisqLwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9sem9fc3VwcC5oIGIvbHpvL3NyYy9sem9fc3VwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZDAzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vc3JjL2x6b19zdXBwLmgKQEAgLTAsMCArMSwzNjg1IEBACisvKiBsem9fc3VwcC5oIC0tIGFyY2hpdGVjdHVyZSwgT1MgYW5kIGNvbXBpbGVyIHNwZWNpZmljIGRlZmluZXMKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaWZuZGVmIF9fTFpPX1NVUFBfSF9JTkNMVURFRAorI2RlZmluZSBfX0xaT19TVVBQX0hfSU5DTFVERUQgMQorI2lmIChMWk9fQ0ZHX05PX0NPTkZJR19IRUFERVIpCisjZWxpZiBkZWZpbmVkKExaT19DRkdfQ09ORklHX0hFQURFUikKKyNlbHNlCisjaWYgIShMWk9fQ0ZHX0FVVE9fTk9fSEVBREVSUykKKyNpZiAoTFpPX0xJQkNfTkFLRUQpCisjZWxpZiAoTFpPX0xJQkNfRlJFRVNUQU5ESU5HKQorIyAgZGVmaW5lIEhBVkVfTElNSVRTX0ggMQorIyAgZGVmaW5lIEhBVkVfU1REQVJHX0ggMQorIyAgZGVmaW5lIEhBVkVfU1REREVGX0ggMQorI2VsaWYgKExaT19MSUJDX01PU1RMWV9GUkVFU1RBTkRJTkcpCisjICBkZWZpbmUgSEFWRV9MSU1JVFNfSCAxCisjICBkZWZpbmUgSEFWRV9TRVRKTVBfSCAxCisjICBkZWZpbmUgSEFWRV9TVERBUkdfSCAxCisjICBkZWZpbmUgSEFWRV9TVERERUZfSCAxCisjICBkZWZpbmUgSEFWRV9TVERJT19IIDEKKyMgIGRlZmluZSBIQVZFX1NUUklOR19IIDEKKyNlbHNlCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisjZGVmaW5lIEhBVkVfQVNTRVJUX0ggMQorI2RlZmluZSBIQVZFX0NUWVBFX0ggMQorI2RlZmluZSBIQVZFX0RJUkVOVF9IIDEKKyNkZWZpbmUgSEFWRV9FUlJOT19IIDEKKyNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKyNkZWZpbmUgSEFWRV9GTE9BVF9IIDEKKyNkZWZpbmUgSEFWRV9MSU1JVFNfSCAxCisjZGVmaW5lIEhBVkVfTUFMTE9DX0ggMQorI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKKyNkZWZpbmUgSEFWRV9TRVRKTVBfSCAxCisjZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQorI2RlZmluZSBIQVZFX1NUREFSR19IIDEKKyNkZWZpbmUgSEFWRV9TVERERUZfSCAxCisjZGVmaW5lIEhBVkVfU1RESU9fSCAxCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKyNkZWZpbmUgSEFWRV9USU1FX0ggMQorI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKyNkZWZpbmUgSEFWRV9VVElNRV9IIDEKKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKyNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisjaWYgKExaT19PU19QT1NJWCkKKyMgIGlmIChMWk9fT1NfUE9TSVhfQUlYKQorIyAgICBkZWZpbmUgSEFWRV9TWVNfUkVTT1VSQ0VfSCAxCisjICBlbGlmIChMWk9fT1NfUE9TSVhfRlJFRUJTRCB8fCBMWk9fT1NfUE9TSVhfTUFDT1NYIHx8IExaT19PU19QT1NJWF9ORVRCU0QgfHwgTFpPX09TX1BPU0lYX09QRU5CU0QpCisjICAgIGRlZmluZSBIQVZFX1NUUklOR1NfSCAxCisjICAgIHVuZGVmIEhBVkVfTUFMTE9DX0gKKyMgIGVsaWYgKExaT19PU19QT1NJWF9IUFVYIHx8IExaT19PU19QT1NJWF9JTlRFUklYKQorIyAgICBkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCisjICBlbGlmIChMWk9fT1NfUE9TSVhfTUFDT1NYICYmIExaT19MSUJDX01TTCkKKyMgICAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjICAgIHVuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyMgIGVsaWYgKExaT19PU19QT1NJWF9TT0xBUklTIHx8IExaT19PU19QT1NJWF9TVU5PUykKKyMgICAgZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorIyAgZW5kaWYKKyMgIGlmIChMWk9fTElCQ19ESUVUTElCQyB8fCBMWk9fTElCQ19HTElCQyB8fCBMWk9fTElCQ19VQ0xJQkMpCisjICAgIGRlZmluZSBIQVZFX1NUUklOR1NfSCAxCisjICAgIGRlZmluZSBIQVZFX1NZU19NTUFOX0ggMQorIyAgICBkZWZpbmUgSEFWRV9TWVNfUkVTT1VSQ0VfSCAxCisjICAgIGRlZmluZSBIQVZFX1NZU19XQUlUX0ggMQorIyAgZW5kaWYKKyMgIGlmIChMWk9fTElCQ19ORVdMSUIpCisjICAgIHVuZGVmIEhBVkVfU1RSSU5HU19ICisjICBlbmRpZgorI2VsaWYgKExaT19PU19DWUdXSU4pCisjICBkZWZpbmUgSEFWRV9JT19IIDEKKyNlbGlmIChMWk9fT1NfRU1YKQorIyAgZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorIyAgZGVmaW5lIEhBVkVfSU9fSCAxCisjZWxpZiAoTFpPX0FSQ0hfTTY4SyAmJiBMWk9fT1NfVE9TICYmIExaT19DQ19HTlVDKQorIyAgaWYgIWRlZmluZWQoX19NSU5UX18pCisjICAgIHVuZGVmIEhBVkVfTUFMTE9DX0gKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfTTY4SyAmJiBMWk9fT1NfVE9TICYmIChMWk9fQ0NfUFVSRUMgfHwgTFpPX0NDX1RVUkJPQykpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX0ZDTlRMX0gKKyMgIHVuZGVmIEhBVkVfTUFMTE9DX0gKKyMgIHVuZGVmIEhBVkVfTUVNT1JZX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisjICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNlbmRpZgorI2lmIChMWk9fT1NfRE9TMTYgfHwgTFpPX09TX0RPUzMyIHx8IExaT19PU19PUzIgfHwgTFpPX09TX09TMjE2IHx8IExaT19PU19XSU4xNiB8fCBMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0KQorI2RlZmluZSBIQVZFX0NPTklPX0ggMQorI2RlZmluZSBIQVZFX0RJUkVDVF9IIDEKKyNkZWZpbmUgSEFWRV9ET1NfSCAxCisjZGVmaW5lIEhBVkVfSU9fSCAxCisjZGVmaW5lIEhBVkVfU0hBUkVfSCAxCisjaWYgKExaT19DQ19BWlRFQ0MpCisjICB1bmRlZiBIQVZFX0NPTklPX0gKKyMgIHVuZGVmIEhBVkVfRElSRUNUX0gKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfTUFMTE9DX0gKKyMgIHVuZGVmIEhBVkVfU0hBUkVfSAorIyAgdW5kZWYgSEFWRV9VTklTVERfSAorIyAgdW5kZWYgSEFWRV9VVElNRV9ICisjICB1bmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAorI2VsaWYgKExaT19DQ19CT1JMQU5EQykKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgaWYgKExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpCisjICAgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIGVuZGlmCisjICBpZiAoX19CT1JMQU5EQ19fIDwgMHgwNDAwKQorIyAgICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICAgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgZW5kaWYKKyNlbGlmIChMWk9fQ0NfRE1DKQorIyAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgdW5kZWYgSEFWRV9VTklTVERfSAorIyAgZGVmaW5lIEhBVkVfU1lTX0RJUkVOVF9IIDEKKyNlbGlmIChMWk9fT1NfRE9TMzIgJiYgTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19ESkdQUF9fKQorI2VsaWYgKExaT19PU19ET1MzMiAmJiBMWk9fQ0NfSElHSEMpCisjICBkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjZWxpZiAoTFpPX0NDX0lCTUMgJiYgTFpPX09TX09TMikKKyMgIHVuZGVmIEhBVkVfRE9TX0gKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjICBkZWZpbmUgSEFWRV9TWVNfVVRJTUVfSCAxCisjZWxpZiAoTFpPX0NDX0dIUyB8fCBMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgZGVmaW5lIEhBVkVfU1lTX1VUSU1FX0ggMQorI2VsaWYgKExaT19DQ19MQ0NXSU4zMikKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfRE9TX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorI2VsaWYgKExaT19PU19XSU4zMiAmJiBMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX01JTkdXMzJfXykKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgZGVmaW5lIEhBVkVfU1lTX1VUSU1FX0ggMQorI2VsaWYgKExaT19PU19XSU4zMiAmJiBMWk9fTElCQ19NU0wpCisjICBkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCisjICB1bmRlZiBIQVZFX0RPU19ICisjICB1bmRlZiBIQVZFX1NIQVJFX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorI2VsaWYgKExaT19DQ19ORFBDKQorIyAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgdW5kZWYgSEFWRV9ET1NfSAorIyAgdW5kZWYgSEFWRV9VTklTVERfSAorIyAgdW5kZWYgSEFWRV9VVElNRV9ICisjICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyNlbGlmIChMWk9fQ0NfUEFDSUZJQ0MpCisjICB1bmRlZiBIQVZFX0RJUkVDVF9ICisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX0ZDTlRMX0gKKyMgIHVuZGVmIEhBVkVfSU9fSAorIyAgdW5kZWYgSEFWRV9NQUxMT0NfSAorIyAgdW5kZWYgSEFWRV9NRU1PUllfSAorIyAgdW5kZWYgSEFWRV9TSEFSRV9ICisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1NUQVRfSAorIyAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjICB1bmRlZiBIQVZFX1NZU19UWVBFU19ICisjZWxpZiAoTFpPX09TX1dJTjMyICYmIExaT19DQ19QRUxMRVNDKQorIyAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgdW5kZWYgSEFWRV9ET1NfSAorIyAgdW5kZWYgSEFWRV9NQUxMT0NfSAorIyAgdW5kZWYgSEFWRV9TSEFSRV9ICisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgaWYgKF9fUE9DQ19fIDwgMjgwKQorIyAgZWxzZQorIyAgICBkZWZpbmUgSEFWRV9TWVNfVVRJTUVfSCAxCisjICBlbmRpZgorI2VsaWYgKExaT19PU19XSU4zMiAmJiBMWk9fQ0NfUEdJKSAmJiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgdW5kZWYgSEFWRV9VVElNRV9ICisjICBkZWZpbmUgSEFWRV9TWVNfVVRJTUVfSCAxCisjZWxpZiAoTFpPX09TX1dJTjMyICYmIExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fUFczMl9fKQorI2VsaWYgKExaT19DQ19TWU1BTlRFQ0MpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICBpZiAoX19TQ19fIDwgMHg3MDApCisjICAgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0NDX1RPUFNQRUVEQykKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisjICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNlbGlmIChMWk9fQ0NfVFVSQk9DKQorIyAgdW5kZWYgSEFWRV9VTklTVERfSAorIyAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjICB1bmRlZiBIQVZFX1NZU19UWVBFU19ICisjICBpZiAoTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKKyMgICAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgZW5kaWYKKyMgIGlmIChfX1RVUkJPQ19fIDwgMHgwMjAwKQorIyAgICB1bmRlZiBIQVZFX1NJR05BTF9ICisjICBlbmRpZgorIyAgaWYgKF9fVFVSQk9DX18gPCAweDA0MDApCisjICAgIHVuZGVmIEhBVkVfRElSRUNUX0gKKyMgICAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgICB1bmRlZiBIQVZFX01BTExPQ19ICisjICAgIHVuZGVmIEhBVkVfTUVNT1JZX0gKKyMgICAgdW5kZWYgSEFWRV9VVElNRV9ICisjICBlbmRpZgorI2VsaWYgKExaT19DQ19XQVRDT01DKQorIyAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgdW5kZWYgSEFWRV9VVElNRV9ICisjICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIGRlZmluZSBIQVZFX1NZU19VVElNRV9IIDEKKyMgIGlmIChfX1dBVENPTUNfXyA8IDk1MCkKKyMgICAgdW5kZWYgSEFWRV9VTklTVERfSAorIyAgZW5kaWYKKyNlbGlmIChMWk9fQ0NfWk9SVEVDSEMpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX01FTU9SWV9ICisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorI2VuZGlmCisjZW5kaWYKKyNpZiAoTFpPX09TX0NPTlNPTEUpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjZW5kaWYKKyNpZiAoTFpPX09TX0VNQkVEREVEKQorIyAgdW5kZWYgSEFWRV9ESVJFTlRfSAorI2VuZGlmCisjaWYgKExaT19MSUJDX0lTT0M5MCB8fCBMWk9fTElCQ19JU09DOTkpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX0ZDTlRMX0gKKyMgIHVuZGVmIEhBVkVfTUFMTE9DX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisjICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNlbmRpZgorI2lmIChMWk9fTElCQ19HTElCQyA+PSAweDAyMDEwMHVsKQorIyAgZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorI2VsaWYgKExaT19MSUJDX0RJRVRMSUJDKQorIyAgdW5kZWYgSEFWRV9TVERJTlRfSAorI2VsaWYgKExaT19MSUJDX1VDTElCQykKKyMgIGRlZmluZSBIQVZFX1NURElOVF9IIDEKKyNlbGlmIChMWk9fQ0NfQk9STEFOREMpICYmIChfX0JPUkxBTkRDX18gPj0gMHg1NjApCisjICB1bmRlZiBIQVZFX1NURElOVF9ICisjZWxpZiAoTFpPX0NDX0RNQykgJiYgKF9fRE1DX18gPj0gMHg4MjUpCisjICBkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZW5kaWYKKyNpZiAoSEFWRV9TWVNfVElNRV9IICYmIEhBVkVfVElNRV9IKQorIyAgZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgIShMWk9fQ0ZHX0FVVE9fTk9fRlVOQ1RJT05TKQorI2lmIChMWk9fTElCQ19OQUtFRCkKKyNlbGlmIChMWk9fTElCQ19GUkVFU1RBTkRJTkcpCisjZWxpZiAoTFpPX0xJQkNfTU9TVExZX0ZSRUVTVEFORElORykKKyMgIGRlZmluZSBIQVZFX0xPTkdKTVAgMQorIyAgZGVmaW5lIEhBVkVfTUVNQ01QIDEKKyMgIGRlZmluZSBIQVZFX01FTUNQWSAxCisjICBkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKKyMgIGRlZmluZSBIQVZFX01FTVNFVCAxCisjICBkZWZpbmUgSEFWRV9TRVRKTVAgMQorI2Vsc2UKKyNkZWZpbmUgSEFWRV9BQ0NFU1MgMQorI2RlZmluZSBIQVZFX0FMTE9DQSAxCisjZGVmaW5lIEhBVkVfQVRFWElUIDEKKyNkZWZpbmUgSEFWRV9BVE9JIDEKKyNkZWZpbmUgSEFWRV9BVE9MIDEKKyNkZWZpbmUgSEFWRV9DSE1PRCAxCisjZGVmaW5lIEhBVkVfQ0hPV04gMQorI2RlZmluZSBIQVZFX0NUSU1FIDEKKyNkZWZpbmUgSEFWRV9ESUZGVElNRSAxCisjZGVmaW5lIEhBVkVfRklMRU5PIDEKKyNkZWZpbmUgSEFWRV9GU1RBVCAxCisjZGVmaW5lIEhBVkVfR0VURU5WIDEKKyNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQorI2RlZmluZSBIQVZFX0dNVElNRSAxCisjZGVmaW5lIEhBVkVfSVNBVFRZIDEKKyNkZWZpbmUgSEFWRV9MT0NBTFRJTUUgMQorI2RlZmluZSBIQVZFX0xPTkdKTVAgMQorI2RlZmluZSBIQVZFX0xTVEFUIDEKKyNkZWZpbmUgSEFWRV9NRU1DTVAgMQorI2RlZmluZSBIQVZFX01FTUNQWSAxCisjZGVmaW5lIEhBVkVfTUVNTU9WRSAxCisjZGVmaW5lIEhBVkVfTUVNU0VUIDEKKyNkZWZpbmUgSEFWRV9NS0RJUiAxCisjZGVmaW5lIEhBVkVfTUtUSU1FIDEKKyNkZWZpbmUgSEFWRV9RU09SVCAxCisjZGVmaW5lIEhBVkVfUkFJU0UgMQorI2RlZmluZSBIQVZFX1JNRElSIDEKKyNkZWZpbmUgSEFWRV9TRVRKTVAgMQorI2RlZmluZSBIQVZFX1NJR05BTCAxCisjZGVmaW5lIEhBVkVfU05QUklOVEYgMQorI2RlZmluZSBIQVZFX1NUQVQgMQorI2RlZmluZSBIQVZFX1NUUkNIUiAxCisjZGVmaW5lIEhBVkVfU1RSRFVQIDEKKyNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCisjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQorI2RlZmluZSBIQVZFX1NUUlJDSFIgMQorI2RlZmluZSBIQVZFX1NUUlNUUiAxCisjZGVmaW5lIEhBVkVfVElNRSAxCisjZGVmaW5lIEhBVkVfVU1BU0sgMQorI2RlZmluZSBIQVZFX1VUSU1FIDEKKyNkZWZpbmUgSEFWRV9WU05QUklOVEYgMQorI2lmIChMWk9fT1NfQkVPUyB8fCBMWk9fT1NfQ1lHV0lOIHx8IExaT19PU19QT1NJWCB8fCBMWk9fT1NfUU5YIHx8IExaT19PU19WTVMpCisjICBkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKKyMgIGRlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKKyNlbGlmIChMWk9fT1NfV0lOMzIgJiYgTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19QVzMyX18pCisjICBkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKKyMgIGRlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKKyNlbHNlCisjICBkZWZpbmUgSEFWRV9TVFJJQ01QIDEKKyMgIGRlZmluZSBIQVZFX1NUUk5JQ01QIDEKKyNlbmRpZgorI2lmIChMWk9fT1NfUE9TSVgpCisjICBpZiAoTFpPX09TX1BPU0lYX0FJWCkKKyMgICAgZGVmaW5lIEhBVkVfR0VUUlVTQUdFIDEKKyMgIGVsaWYgKExaT19PU19QT1NJWF9NQUNPU1ggJiYgTFpPX0xJQkNfTVNMKQorIyAgICB1bmRlZiBIQVZFX0NIT1dOCisjICAgIHVuZGVmIEhBVkVfTFNUQVQKKyMgIGVsaWYgKExaT19PU19QT1NJWF9VTklDT1MpCisjICAgIHVuZGVmIEhBVkVfQUxMT0NBCisjICAgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgICAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjICBpZiAoTFpPX0NDX1RJTllDKQorIyAgICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgZW5kaWYKKyMgIGlmIChMWk9fTElCQ19ESUVUTElCQyB8fCBMWk9fTElCQ19HTElCQyB8fCBMWk9fTElCQ19VQ0xJQkMpCisjICAgIGRlZmluZSBIQVZFX0dFVFJVU0FHRSAxCisjICAgIGRlZmluZSBIQVZFX0dFVFBBR0VTSVpFIDEKKyMgICAgZGVmaW5lIEhBVkVfTU1BUCAxCisjICAgIGRlZmluZSBIQVZFX01QUk9URUNUIDEKKyMgICAgZGVmaW5lIEhBVkVfTVVOTUFQIDEKKyMgIGVuZGlmCisjZWxpZiAoTFpPX09TX0NZR1dJTikKKyMgIGlmIChMWk9fQ0NfR05VQyA8IDB4MDI1YTAwdWwpCisjICAgIHVuZGVmIEhBVkVfR0VUVElNRU9GREFZCisjICAgIHVuZGVmIEhBVkVfTFNUQVQKKyMgIGVuZGlmCisjICBpZiAoTFpPX0NDX0dOVUMgPCAweDAyNWYwMHVsKQorIyAgICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICAgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBlbmRpZgorI2VsaWYgKExaT19PU19FTVgpCisjICB1bmRlZiBIQVZFX0NIT1dOCisjICB1bmRlZiBIQVZFX0xTVEFUCisjZWxpZiAoTFpPX0FSQ0hfTTY4SyAmJiBMWk9fT1NfVE9TICYmIExaT19DQ19HTlVDKQorIyAgaWYgIWRlZmluZWQoX19NSU5UX18pCisjICAgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgICAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0FSQ0hfTTY4SyAmJiBMWk9fT1NfVE9TICYmIChMWk9fQ0NfUFVSRUMgfHwgTFpPX0NDX1RVUkJPQykpCisjICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgdW5kZWYgSEFWRV9BQ0NFU1MKKyMgIHVuZGVmIEhBVkVfQ0hNT0QKKyMgIHVuZGVmIEhBVkVfQ0hPV04KKyMgIHVuZGVmIEhBVkVfRlNUQVQKKyMgIHVuZGVmIEhBVkVfR0VUVElNRU9GREFZCisjICB1bmRlZiBIQVZFX0xTVEFUCisjICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICB1bmRlZiBIQVZFX1VNQVNLCisjICB1bmRlZiBIQVZFX1VUSU1FCisjICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorI2VuZGlmCisjaWYgKExaT19PU19ET1MxNiB8fCBMWk9fT1NfRE9TMzIgfHwgTFpPX09TX09TMiB8fCBMWk9fT1NfT1MyMTYgfHwgTFpPX09TX1dJTjE2IHx8IExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpCisjdW5kZWYgSEFWRV9DSE9XTgorI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZCisjdW5kZWYgSEFWRV9MU1RBVAorI3VuZGVmIEhBVkVfVU1BU0sKKyNpZiAoTFpPX0NDX0FaVEVDQykKKyMgIHVuZGVmIEhBVkVfQUxMT0NBCisjICB1bmRlZiBIQVZFX0RJRkZUSU1FCisjICB1bmRlZiBIQVZFX0ZTVEFUCisjICB1bmRlZiBIQVZFX1NUUkRVUAorIyAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgdW5kZWYgSEFWRV9VVElNRQorIyAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyNlbGlmIChMWk9fQ0NfQk9STEFOREMpCisjICBpZiAoX19CT1JMQU5EQ19fIDwgMHgwNDAwKQorIyAgICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgICB1bmRlZiBIQVZFX1VUSU1FCisjICBlbmRpZgorIyAgaWYgKChfX0JPUkxBTkRDX18gPCAweDA0MTApICYmIExaT19PU19XSU4xNikKKyMgICAgdW5kZWYgSEFWRV9BTExPQ0EKKyMgIGVuZGlmCisjICBpZiAoX19CT1JMQU5EQ19fIDwgMHgwNTUwKQorIyAgICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICAgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBlbmRpZgorI2VsaWYgKExaT19DQ19ETUMpCisjICBpZiAoTFpPX09TX1dJTjE2KQorIyAgICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgZW5kaWYKKyMgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyMgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2VsaWYgKExaT19PU19ET1MzMiAmJiBMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX0RKR1BQX18pCisjICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorI2VsaWYgKExaT19PU19ET1MzMiAmJiBMWk9fQ0NfSElHSEMpCisjICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorI2VsaWYgKExaT19DQ19HSFMpCisjICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgaWZuZGVmIHNucHJpbnRmCisjICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjICBlbmRpZgorIyAgaWZuZGVmIHZzbnByaW50ZgorIyAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjICBlbmRpZgorI2VsaWYgKExaT19DQ19JQk1DKQorIyAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyNlbGlmIChMWk9fQ0NfSU5URUxDKQorIyAgaWZuZGVmIHNucHJpbnRmCisjICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjICBlbmRpZgorIyAgaWZuZGVmIHZzbnByaW50ZgorIyAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjICBlbmRpZgorI2VsaWYgKExaT19DQ19MQ0NXSU4zMikKKyMgIGRlZmluZSB1dGltZSBfdXRpbWUKKyNlbGlmIChMWk9fQ0NfTVNDKQorIyAgaWYgKF9NU0NfVkVSIDwgNjAwKQorIyAgICB1bmRlZiBIQVZFX1NUUkZUSU1FCisjICBlbmRpZgorIyAgaWYgKF9NU0NfVkVSIDwgNzAwKQorIyAgICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICAgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBlbGlmIChfTVNDX1ZFUiA8IDE1MDApCisjICAgIGlmbmRlZiBzbnByaW50ZgorIyAgICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiB2c25wcmludGYKKyMgICAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGlmbmRlZiBzbnByaW50ZgorIyAgICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgKChfTVNDX1ZFUiA8IDgwMCkgJiYgTFpPX09TX1dJTjE2KQorIyAgICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgZW5kaWYKKyMgIGlmIChMWk9fQVJDSF9JMDg2KSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICB1bmRlZiBIQVZFX0xPTkdKTVAKKyMgICAgdW5kZWYgSEFWRV9TRVRKTVAKKyMgIGVuZGlmCisjZWxpZiAoTFpPX09TX1dJTjMyICYmIExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgaWYgKExaT19DQ19HTlVDIDwgMHgwMjVmMDB1bCkKKyMgICAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgZWxzZQorIyAgICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjICAgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorIyAgZW5kaWYKKyNlbGlmIChMWk9fT1NfV0lOMzIgJiYgTFpPX0xJQkNfTVNMKQorIyAgaWYgKF9fTVNMX18gPCAweDgwMDB1bCkKKyMgICAgdW5kZWYgSEFWRV9DSE1PRAorIyAgZW5kaWYKKyNlbGlmIChMWk9fQ0NfTkRQQykKKyMgIHVuZGVmIEhBVkVfQUxMT0NBCisjICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICB1bmRlZiBIQVZFX1NUUk5JQ01QCisjICB1bmRlZiBIQVZFX1VUSU1FCisjICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgdW5kZWYgSEFWRV9TVEFUCisjICBlbmRpZgorI2VsaWYgKExaT19DQ19QQUNJRklDQykKKyMgIHVuZGVmIEhBVkVfQUNDRVNTCisjICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgdW5kZWYgSEFWRV9DSE1PRAorIyAgdW5kZWYgSEFWRV9ESUZGVElNRQorIyAgdW5kZWYgSEFWRV9GU1RBVAorIyAgdW5kZWYgSEFWRV9NS1RJTUUKKyMgIHVuZGVmIEhBVkVfUkFJU0UKKyMgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgIHVuZGVmIEhBVkVfU1RSRlRJTUUKKyMgIHVuZGVmIEhBVkVfVVRJTUUKKyMgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjZWxpZiAoTFpPX09TX1dJTjMyICYmIExaT19DQ19QRUxMRVNDKQorIyAgaWYgKF9fUE9DQ19fIDwgMjgwKQorIyAgICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgICAgdW5kZWYgSEFWRV9VVElNRQorIyAgZW5kaWYKKyNlbGlmIChMWk9fT1NfV0lOMzIgJiYgTFpPX0NDX1BHSSkgJiYgZGVmaW5lZChfX01JTkdXMzJfXykKKyMgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyMgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2VsaWYgKExaT19PU19XSU4zMiAmJiBMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX1BXMzJfXykKKyMgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjZWxpZiAoTFpPX0NDX1NZTUFOVEVDQykKKyMgIGlmIChMWk9fT1NfV0lOMTYgJiYgKExaT19NTV9NRURJVU0gfHwgTFpPX01NX0xBUkdFIHx8IExaT19NTV9IVUdFKSkKKyMgICAgdW5kZWYgSEFWRV9BTExPQ0EKKyMgIGVuZGlmCisjICBpZiAoX19TQ19fIDwgMHg2MDApCisjICAgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgICAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyMgIGVsc2UKKyMgICAgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorIyAgICBkZWZpbmUgdnNucHJpbnRmIF92c25wcmludGYKKyMgIGVuZGlmCisjICBpZiAoX19TQ19fIDwgMHg3MDApCisjICAgIHVuZGVmIEhBVkVfRElGRlRJTUUKKyMgICAgdW5kZWYgSEFWRV9VVElNRQorIyAgZW5kaWYKKyNlbGlmIChMWk9fQ0NfVE9QU1BFRURDKQorIyAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyNlbGlmIChMWk9fQ0NfVFVSQk9DKQorIyAgdW5kZWYgSEFWRV9BTExPQ0EKKyMgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBpZiAoX19UVVJCT0NfXyA8IDB4MDIwMCkKKyMgICAgdW5kZWYgSEFWRV9SQUlTRQorIyAgICB1bmRlZiBIQVZFX1NJR05BTAorIyAgZW5kaWYKKyMgIGlmIChfX1RVUkJPQ19fIDwgMHgwMjk1KQorIyAgICB1bmRlZiBIQVZFX01LVElNRQorIyAgICB1bmRlZiBIQVZFX1NUUkZUSU1FCisjICBlbmRpZgorIyAgaWYgKF9fVFVSQk9DX18gPCAweDA0MDApCisjICAgIHVuZGVmIEhBVkVfVVRJTUUKKyMgIGVuZGlmCisjZWxpZiAoTFpPX0NDX1dBVENPTUMpCisjICBpZiAoX19XQVRDT01DX18gPCAxMTAwKQorIyAgICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICAgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBlbGlmIChfX1dBVENPTUNfXyA8IDEyMDApCisjICAgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyMgICAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjICBlbmRpZgorI2VsaWYgKExaT19DQ19aT1JURUNIQykKKyMgIGlmIChMWk9fT1NfV0lOMTYgJiYgKExaT19NTV9NRURJVU0gfHwgTFpPX01NX0xBUkdFIHx8IExaT19NTV9IVUdFKSkKKyMgICAgdW5kZWYgSEFWRV9BTExPQ0EKKyMgIGVuZGlmCisjICB1bmRlZiBIQVZFX0RJRkZUSU1FCisjICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICB1bmRlZiBIQVZFX1VUSU1FCisjICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorI2VuZGlmCisjZW5kaWYKKyNpZiAoTFpPX09TX0NPTlNPTEUpCisjICB1bmRlZiBIQVZFX0FDQ0VTUworIyAgdW5kZWYgSEFWRV9DSE1PRAorIyAgdW5kZWYgSEFWRV9DSE9XTgorIyAgdW5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKKyMgIHVuZGVmIEhBVkVfTFNUQVQKKyMgIHVuZGVmIEhBVkVfVElNRQorIyAgdW5kZWYgSEFWRV9VTUFTSworIyAgdW5kZWYgSEFWRV9VVElNRQorI2VuZGlmCisjaWYgKExaT19MSUJDX0lTT0M5MCB8fCBMWk9fTElCQ19JU09DOTkpCisjICB1bmRlZiBIQVZFX0FDQ0VTUworIyAgdW5kZWYgSEFWRV9DSE1PRAorIyAgdW5kZWYgSEFWRV9DSE9XTgorIyAgdW5kZWYgSEFWRV9GSUxFTk8KKyMgIHVuZGVmIEhBVkVfRlNUQVQKKyMgIHVuZGVmIEhBVkVfR0VUVElNRU9GREFZCisjICB1bmRlZiBIQVZFX0xTVEFUCisjICB1bmRlZiBIQVZFX1NUQVQKKyMgIHVuZGVmIEhBVkVfVU1BU0sKKyMgIHVuZGVmIEhBVkVfVVRJTUUKKyMgaWYgMQorIyAgdW5kZWYgSEFWRV9BTExPQ0EKKyMgIHVuZGVmIEhBVkVfSVNBVFRZCisjICB1bmRlZiBIQVZFX01LRElSCisjICB1bmRlZiBIQVZFX1JNRElSCisjICB1bmRlZiBIQVZFX1NUUkRVUAorIyAgdW5kZWYgSEFWRV9TVFJJQ01QCisjICB1bmRlZiBIQVZFX1NUUk5JQ01QCisjIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgIShMWk9fQ0ZHX0FVVE9fTk9fU0laRVMpCisjaWYgIWRlZmluZWQoU0laRU9GX1NIT1JUKSAmJiBkZWZpbmVkKExaT19TSVpFT0ZfU0hPUlQpCisjICBkZWZpbmUgU0laRU9GX1NIT1JUICAgICAgICAgIExaT19TSVpFT0ZfU0hPUlQKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9JTlQpICYmIGRlZmluZWQoTFpPX1NJWkVPRl9JTlQpCisjICBkZWZpbmUgU0laRU9GX0lOVCAgICAgICAgICAgIExaT19TSVpFT0ZfSU5UCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfTE9ORykgJiYgZGVmaW5lZChMWk9fU0laRU9GX0xPTkcpCisjICBkZWZpbmUgU0laRU9GX0xPTkcgICAgICAgICAgIExaT19TSVpFT0ZfTE9ORworI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX0xPTkdfTE9ORykgJiYgZGVmaW5lZChMWk9fU0laRU9GX0xPTkdfTE9ORykKKyMgIGRlZmluZSBTSVpFT0ZfTE9OR19MT05HICAgICAgTFpPX1NJWkVPRl9MT05HX0xPTkcKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9fX0lOVDMyKSAmJiBkZWZpbmVkKExaT19TSVpFT0ZfX19JTlQzMikKKyMgIGRlZmluZSBTSVpFT0ZfX19JTlQzMiAgICAgICAgTFpPX1NJWkVPRl9fX0lOVDMyCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfX19JTlQ2NCkgJiYgZGVmaW5lZChMWk9fU0laRU9GX19fSU5UNjQpCisjICBkZWZpbmUgU0laRU9GX19fSU5UNjQgICAgICAgIExaT19TSVpFT0ZfX19JTlQ2NAorI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX1ZPSURfUCkgJiYgZGVmaW5lZChMWk9fU0laRU9GX1ZPSURfUCkKKyMgIGRlZmluZSBTSVpFT0ZfVk9JRF9QICAgICAgICAgTFpPX1NJWkVPRl9WT0lEX1AKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9TSVpFX1QpICYmIGRlZmluZWQoTFpPX1NJWkVPRl9TSVpFX1QpCisjICBkZWZpbmUgU0laRU9GX1NJWkVfVCAgICAgICAgIExaT19TSVpFT0ZfU0laRV9UCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfUFRSRElGRl9UKSAmJiBkZWZpbmVkKExaT19TSVpFT0ZfUFRSRElGRl9UKQorIyAgZGVmaW5lIFNJWkVPRl9QVFJESUZGX1QgICAgICBMWk9fU0laRU9GX1BUUkRJRkZfVAorI2VuZGlmCisjZW5kaWYKKyNpZiAoSEFWRV9TSUdOQUwpICYmICFkZWZpbmVkKFJFVFNJR1RZUEUpCisjICBkZWZpbmUgUkVUU0lHVFlQRSB2b2lkCisjZW5kaWYKKyNlbmRpZgorI2lmICEoTFpPX0NGR19TS0lQX0xaT19UWVBFUykKKyNpZiAxICYmICFkZWZpbmVkKGx6b19zaWdub190KSAmJiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfX2RpZXRsaWJjX18pICYmIChMWk9fU0laRU9GX0lOVCAhPSA0KQorIyAgZGVmaW5lIGx6b19zaWdub190ICAgICAgICAgICAgICAgbHpvX2ludDMyZV90CisjZW5kaWYKKyNpZiAhZGVmaW5lZChsem9fc2lnbm9fdCkKKyMgIGRlZmluZSBsem9fc2lnbm9fdCAgICAgICAgICAgICAgIGludAorI2VuZGlmCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisjaWYgKExaT19CUk9LRU5fQ0RFQ0xfQUxUX1NZTlRBWCkKK3R5cGVkZWYgdm9pZCBfX2x6b19jZGVjbF9zaWdoYW5kbGVyICgqbHpvX3NpZ2hhbmRsZXJfdCkobHpvX3NpZ25vX3QpOworI2VsaWYgZGVmaW5lZChSRVRTSUdUWVBFKQordHlwZWRlZiBSRVRTSUdUWVBFIChfX2x6b19jZGVjbF9zaWdoYW5kbGVyICpsem9fc2lnaGFuZGxlcl90KShsem9fc2lnbm9fdCk7CisjZWxzZQordHlwZWRlZiB2b2lkIChfX2x6b19jZGVjbF9zaWdoYW5kbGVyICpsem9fc2lnaGFuZGxlcl90KShsem9fc2lnbm9fdCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX1dBTlRfQUNDX0lOQ0RfSCkKKyMgIHVuZGVmIExaT19XQU5UX0FDQ19JTkNEX0gKKyNpZm5kZWYgX19MWk9fSU5DRF9IX0lOQ0xVREVECisjZGVmaW5lIF9fTFpPX0lOQ0RfSF9JTkNMVURFRCAxCisjaWYgKExaT19MSUJDX05BS0VEKQorI2lmbmRlZiBfX0xaT19GQUxMQkFDS19TVERERUZfSF9JTkNMVURFRAorI2RlZmluZSBfX0xaT19GQUxMQkFDS19TVERERUZfSF9JTkNMVURFRCAxCisjaWYgZGVmaW5lZChfX1BUUkRJRkZfVFlQRV9fKQordHlwZWRlZiBfX1BUUkRJRkZfVFlQRV9fIGx6b19mYWxsYmFja19wdHJkaWZmX3Q7CisjZWxpZiBkZWZpbmVkKF9fTUlQU19QU1gyX18pCit0eXBlZGVmIGludCBsem9fZmFsbGJhY2tfcHRyZGlmZl90OworI2Vsc2UKK3R5cGVkZWYgbG9uZyBsem9fZmFsbGJhY2tfcHRyZGlmZl90OworI2VuZGlmCisjaWYgZGVmaW5lZChfX1NJWkVfVFlQRV9fKQordHlwZWRlZiBfX1NJWkVfVFlQRV9fIGx6b19mYWxsYmFja19zaXplX3Q7CisjZWxpZiBkZWZpbmVkKF9fTUlQU19QU1gyX18pCit0eXBlZGVmIHVuc2lnbmVkIGludCBsem9fZmFsbGJhY2tfc2l6ZV90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsem9fZmFsbGJhY2tfc2l6ZV90OworI2VuZGlmCisjaWYgIWRlZmluZWQocHRyZGlmZl90KQordHlwZWRlZiBsem9fZmFsbGJhY2tfcHRyZGlmZl90IHB0cmRpZmZfdDsKKyNpZm5kZWYgX1BUUkRJRkZfVF9ERUZJTkVECisjZGVmaW5lIF9QVFJESUZGX1RfREVGSU5FRCAxCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKHNpemVfdCkKK3R5cGVkZWYgbHpvX2ZhbGxiYWNrX3NpemVfdCBzaXplX3Q7CisjaWZuZGVmIF9TSVpFX1RfREVGSU5FRAorI2RlZmluZSBfU0laRV9UX0RFRklORUQgMQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQod2NoYXJfdCkKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgd2NoYXJfdDsKKyNpZm5kZWYgX1dDSEFSX1RfREVGSU5FRAorI2RlZmluZSBfV0NIQVJfVF9ERUZJTkVEIDEKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIE5VTEwKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gNCkKKyNkZWZpbmUgTlVMTCAgICBfX251bGwKKyNlbGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE5VTEwgICAgMAorI2Vsc2UKKyNkZWZpbmUgTlVMTCAgICAoKHZvaWQqKTApCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZihzLG0pICAgKChzaXplX3QpKChwdHJkaWZmX3QpJigoKHMqKTApLT5tKSkpCisjZW5kaWYKKyNlbmRpZgorI2VsaWYgKExaT19MSUJDX0ZSRUVTVEFORElORykKKyMgaWYgZGVmaW5lZChIQVZFX1NURERFRl9IKSAmJiAoSEFWRV9TVERERUZfSCswKQorIyAgaW5jbHVkZSA8c3RkZGVmLmg+CisjIGVuZGlmCisjIGlmIGRlZmluZWQoSEFWRV9TVERJTlRfSCkgJiYgKEhBVkVfU1RESU5UX0grMCkKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyBlbmRpZgorI2VsaWYgKExaT19MSUJDX01PU1RMWV9GUkVFU1RBTkRJTkcpCisjIGlmIGRlZmluZWQoSEFWRV9TVERJT19IKSAmJiAoSEFWRV9TVERJT19IKzApCisjICBpbmNsdWRlIDxzdGRpby5oPgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKEhBVkVfU1REREVGX0gpICYmIChIQVZFX1NURERFRl9IKzApCisjICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChIQVZFX1NURElOVF9IKSAmJiAoSEFWRV9TVERJTlRfSCswKQorIyAgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGVuZGlmCisjZWxzZQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgZGVmaW5lZChIQVZFX1RJTUVfSCkgJiYgKEhBVkVfVElNRV9IKzApICYmIGRlZmluZWQoX19NU0xfXykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NZU19UWVBFU19IKSAmJiAoSEFWRV9TWVNfVFlQRVNfSCswKQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TWVNfU1RBVF9IKSAmJiAoSEFWRV9TWVNfU1RBVF9IKzApCisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNURENfSEVBREVSUykgJiYgKFNURENfSEVBREVSUyswKQorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9TVERMSUJfSCkgJiYgKEhBVkVfU1RETElCX0grMCkKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBkZWZpbmVkKEhBVkVfU1RSSU5HX0gpICYmIChIQVZFX1NUUklOR19IKzApCisjIGlmIGRlZmluZWQoU1REQ19IRUFERVJTKSAmJiAoU1REQ19IRUFERVJTKzApCisjIGVsaWYgZGVmaW5lZChIQVZFX01FTU9SWV9IKSAmJiAoSEFWRV9NRU1PUllfSCswKQorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NUUklOR1NfSCkgJiYgKEhBVkVfU1RSSU5HU19IKzApCisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9JTlRUWVBFU19IKSAmJiAoSEFWRV9JTlRUWVBFU19IKzApCisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfU1RESU5UX0gpICYmIChIQVZFX1NURElOVF9IKzApCisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1VOSVNURF9IKSAmJiAoSEFWRV9VTklTVERfSCswKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX1dBTlRfQUNDX0lOQ0VfSCkKKyMgIHVuZGVmIExaT19XQU5UX0FDQ19JTkNFX0gKKyNpZm5kZWYgX19MWk9fSU5DRV9IX0lOQ0xVREVECisjZGVmaW5lIF9fTFpPX0lOQ0VfSF9JTkNMVURFRCAxCisjaWYgKExaT19MSUJDX05BS0VEKQorI2VsaWYgKExaT19MSUJDX0ZSRUVTVEFORElORykKKyNlbGlmIChMWk9fTElCQ19NT1NUTFlfRlJFRVNUQU5ESU5HKQorIyAgaWYgKEhBVkVfU0VUSk1QX0gpCisjICAgIGluY2x1ZGUgPHNldGptcC5oPgorIyAgZW5kaWYKKyNlbHNlCisjaWYgKEhBVkVfU1REQVJHX0gpCisjICBpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbmRpZgorI2lmIChIQVZFX0NUWVBFX0gpCisjICBpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmCisjaWYgKEhBVkVfRVJSTk9fSCkKKyMgIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZiAoSEFWRV9NQUxMT0NfSCkKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorI2VuZGlmCisjaWYgKEhBVkVfQUxMT0NBX0gpCisjICBpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZgorI2lmIChIQVZFX0ZDTlRMX0gpCisjICBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisjaWYgKEhBVkVfRElSRU5UX0gpCisjICBpbmNsdWRlIDxkaXJlbnQuaD4KKyNlbmRpZgorI2lmIChIQVZFX1NFVEpNUF9IKQorIyAgaW5jbHVkZSA8c2V0am1wLmg+CisjZW5kaWYKKyNpZiAoSEFWRV9TSUdOQUxfSCkKKyMgIGluY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisjaWYgKFRJTUVfV0lUSF9TWVNfVElNRSkKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjICBpbmNsdWRlIDx0aW1lLmg+CisjZWxpZiAoSEFWRV9USU1FX0gpCisjICBpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKyNpZiAoSEFWRV9VVElNRV9IKQorIyAgaW5jbHVkZSA8dXRpbWUuaD4KKyNlbGlmIChIQVZFX1NZU19VVElNRV9IKQorIyAgaW5jbHVkZSA8c3lzL3V0aW1lLmg+CisjZW5kaWYKKyNpZiAoSEFWRV9JT19IKQorIyAgaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorI2lmIChIQVZFX0RPU19IKQorIyAgaW5jbHVkZSA8ZG9zLmg+CisjZW5kaWYKKyNpZiAoSEFWRV9ESVJFQ1RfSCkKKyMgIGluY2x1ZGUgPGRpcmVjdC5oPgorI2VuZGlmCisjaWYgKEhBVkVfU0hBUkVfSCkKKyMgIGluY2x1ZGUgPHNoYXJlLmg+CisjZW5kaWYKKyNpZiAoTFpPX0NDX05EUEMpCisjICBpbmNsdWRlIDxvcy5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChfX1RPU19fKSAmJiAoZGVmaW5lZChfX1BVUkVDX18pIHx8IGRlZmluZWQoX19UVVJCT0NfXykpCisjICBpbmNsdWRlIDxleHQuaD4KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX1dBTlRfQUNDX0lOQ0lfSCkKKyMgIHVuZGVmIExaT19XQU5UX0FDQ19JTkNJX0gKKyNpZm5kZWYgX19MWk9fSU5DSV9IX0lOQ0xVREVECisjZGVmaW5lIF9fTFpPX0lOQ0lfSF9JTkNMVURFRCAxCisjaWYgKExaT19MSUJDX05BS0VEKQorI2VsaWYgKExaT19MSUJDX0ZSRUVTVEFORElORykKKyNlbGlmIChMWk9fTElCQ19NT1NUTFlfRlJFRVNUQU5ESU5HKQorI2Vsc2UKKyNpZiAoTFpPX09TX1RPUyAmJiAoTFpPX0NDX1BVUkVDIHx8IExaT19DQ19UVVJCT0MpKQorIyAgaW5jbHVkZSA8dG9zLmg+CisjZWxpZiAoTFpPX0hBVkVfV0lORE9XU19IKQorIyAgaWYgMSAmJiAhZGVmaW5lZChXSU4zMl9MRUFOX0FORF9NRUFOKQorIyAgICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCisjICBlbmRpZgorIyAgaWYgMSAmJiAhZGVmaW5lZChfV0lOMzJfV0lOTlQpCisjICAgIGRlZmluZSBfV0lOMzJfV0lOTlQgMHgwNDAwCisjICBlbmRpZgorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgaWYgKExaT19DQ19CT1JMQU5EQyB8fCBMWk9fQ0NfVFVSQk9DKQorIyAgICBpbmNsdWRlIDxkaXIuaD4KKyMgIGVuZGlmCisjZWxpZiAoTFpPX09TX0RPUzE2IHx8IExaT19PU19ET1MzMiB8fCBMWk9fT1NfV0lOMTYpCisjICBpZiAoTFpPX0NDX0FaVEVDQykKKyMgICAgaW5jbHVkZSA8bW9kZWwuaD4KKyMgICAgaW5jbHVkZSA8c3RhdC5oPgorIyAgZWxpZiAoTFpPX0NDX0JPUkxBTkRDIHx8IExaT19DQ19UVVJCT0MpCisjICAgIGluY2x1ZGUgPGFsbG9jLmg+CisjICAgIGluY2x1ZGUgPGRpci5oPgorIyAgZWxpZiAoTFpPX09TX0RPUzMyICYmIExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fREpHUFBfXykKKyMgICAgaW5jbHVkZSA8c3lzL2V4Y2VwdG4uaD4KKyMgIGVsaWYgKExaT19DQ19QQUNJRklDQykKKyMgICAgaW5jbHVkZSA8dW5peGlvLmg+CisjICAgIGluY2x1ZGUgPHN0YXQuaD4KKyMgICAgaW5jbHVkZSA8c3lzLmg+CisjICBlbGlmIChMWk9fQ0NfV0FUQ09NQykKKyMgICAgaW5jbHVkZSA8aTg2Lmg+CisjICBlbmRpZgorI2VsaWYgKExaT19PU19PUzIxNikKKyMgIGlmIChMWk9fQ0NfV0FUQ09NQykKKyMgICAgaW5jbHVkZSA8aTg2Lmg+CisjICBlbmRpZgorI2VuZGlmCisjaWYgKEhBVkVfU1lTX01NQU5fSCkKKyMgIGluY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKyNpZiAoSEFWRV9TWVNfUkVTT1VSQ0VfSCkKKyMgIGluY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisjaWYgKExaT19PU19ET1MxNiB8fCBMWk9fT1NfT1MyMTYgfHwgTFpPX09TX1dJTjE2KQorIyAgaWYgZGVmaW5lZChGUF9PRkYpCisjICAgIGRlZmluZSBMWk9fUFRSX0ZQX09GRih4KSAgIEZQX09GRih4KQorIyAgZWxpZiBkZWZpbmVkKF9GUF9PRkYpCisjICAgIGRlZmluZSBMWk9fUFRSX0ZQX09GRih4KSAgIF9GUF9PRkYoeCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT19QVFJfRlBfT0ZGKHgpICAgKCgoY29uc3QgdW5zaWduZWQgX19mYXIqKSYoeCkpWzBdKQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoRlBfU0VHKQorIyAgICBkZWZpbmUgTFpPX1BUUl9GUF9TRUcoeCkgICBGUF9TRUcoeCkKKyMgIGVsaWYgZGVmaW5lZChfRlBfU0VHKQorIyAgICBkZWZpbmUgTFpPX1BUUl9GUF9TRUcoeCkgICBfRlBfU0VHKHgpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9fUFRSX0ZQX1NFRyh4KSAgICgoKGNvbnN0IHVuc2lnbmVkIF9fZmFyKikmKHgpKVsxXSkKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkKE1LX0ZQKQorIyAgICBkZWZpbmUgTFpPX1BUUl9NS19GUChzLG8pICBNS19GUChzLG8pCisjICBlbGlmIGRlZmluZWQoX01LX0ZQKQorIyAgICBkZWZpbmUgTFpPX1BUUl9NS19GUChzLG8pICBfTUtfRlAocyxvKQorIyAgZWxzZQorIyAgICBkZWZpbmUgTFpPX1BUUl9NS19GUChzLG8pICAoKHZvaWQgX19mYXIqKSgoKHVuc2lnbmVkIGxvbmcpKHMpPDwxNikrKHVuc2lnbmVkKShvKSkpCisjICBlbmRpZgorIyAgaWYgMAorIyAgICB1bmRlZiBMWk9fUFRSX0ZQX09GRgorIyAgICB1bmRlZiBMWk9fUFRSX0ZQX1NFRworIyAgICB1bmRlZiBMWk9fUFRSX01LX0ZQCisjICAgIGRlZmluZSBMWk9fUFRSX0ZQX09GRih4KSAgICgoKGNvbnN0IHVuc2lnbmVkIF9fZmFyKikmKHgpKVswXSkKKyMgICAgZGVmaW5lIExaT19QVFJfRlBfU0VHKHgpICAgKCgoY29uc3QgdW5zaWduZWQgX19mYXIqKSYoeCkpWzFdKQorIyAgICBkZWZpbmUgTFpPX1BUUl9NS19GUChzLG8pICAoKHZvaWQgX19mYXIqKSgoKHVuc2lnbmVkIGxvbmcpKHMpPDwxNikrKHVuc2lnbmVkKShvKSkpCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChMWk9fV0FOVF9BQ0NfTElCX0gpCisjICB1bmRlZiBMWk9fV0FOVF9BQ0NfTElCX0gKKyNpZm5kZWYgX19MWk9fTElCX0hfSU5DTFVERUQKKyNkZWZpbmUgX19MWk9fTElCX0hfSU5DTFVERUQgMQorI2lmICFkZWZpbmVkKF9fTFpPTElCX0ZVTkNOQU1FKQorIyAgZGVmaW5lIF9fTFpPTElCX0ZVTkNOQU1FKGYpICBmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9MSUJfRVhURVJOKQorIyAgZGVmaW5lIExaT0xJQl9FWFRFUk4ocixmKSAgICAgICAgICAgICAgICBleHRlcm4gciBfX0xaT0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPTElCX0VYVEVSTl9OT0lOTElORSkKKyMgIGlmIGRlZmluZWQoX19sem9fbm9pbmxpbmUpCisjICAgIGRlZmluZSBMWk9MSUJfRVhURVJOX05PSU5MSU5FKHIsZikgICAgIGV4dGVybiBfX2x6b19ub2lubGluZSByIF9fTFpPTElCX0ZVTkNOQU1FKGYpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9MSUJfRVhURVJOX05PSU5MSU5FKHIsZikgICAgIGV4dGVybiByIF9fTFpPTElCX0ZVTkNOQU1FKGYpCisjICBlbmRpZgorI2VuZGlmCisjaWYgKExaT19TSVpFT0ZfTE9ORyA+IExaT19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIGx6b2xpYl9oYW5kbGVfdCAgICAgICBsb25nCisjZWxzZQorIyAgZGVmaW5lIGx6b2xpYl9oYW5kbGVfdCAgICAgICBsem9faW50cHRyX3QKKyNlbmRpZgorI2lmIDAKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9fYXNjaWlfZGlnaXQpICAgKGludCk7CitMWk9MSUJfRVhURVJOKGludCwgbHpvX2FzY2lpX2lzbG93ZXIpIChpbnQpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19hc2NpaV9pc3VwcGVyKSAoaW50KTsKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9fYXNjaWlfdG9sb3dlcikgKGludCk7CitMWk9MSUJfRVhURVJOKGludCwgbHpvX2FzY2lpX3RvdXBwZXIpIChpbnQpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19hc2NpaV91dG9sb3dlcikgKGludCk7CitMWk9MSUJfRVhURVJOKGludCwgbHpvX2FzY2lpX3V0b3VwcGVyKSAoaW50KTsKKyNlbmRpZgorI2RlZmluZSBsem9fYXNjaWlfaXNkaWdpdChjKSAgICAoKExaT19JQ0FTVCh1bnNpZ25lZCwgYykgLSA0OCkgPCAxMCkKKyNkZWZpbmUgbHpvX2FzY2lpX2lzbG93ZXIoYykgICAgKChMWk9fSUNBU1QodW5zaWduZWQsIGMpIC0gOTcpIDwgMjYpCisjZGVmaW5lIGx6b19hc2NpaV9pc3VwcGVyKGMpICAgICgoTFpPX0lDQVNUKHVuc2lnbmVkLCBjKSAtIDY1KSA8IDI2KQorI2RlZmluZSBsem9fYXNjaWlfdG9sb3dlcihjKSAgICAoTFpPX0lDQVNUKGludCwgYykgKyAobHpvX2FzY2lpX2lzdXBwZXIoYykgPDwgNSkpCisjZGVmaW5lIGx6b19hc2NpaV90b3VwcGVyKGMpICAgIChMWk9fSUNBU1QoaW50LCBjKSAtIChsem9fYXNjaWlfaXNsb3dlcihjKSA8PCA1KSkKKyNkZWZpbmUgbHpvX2FzY2lpX3V0b2xvd2VyKGMpICAgbHpvX2FzY2lpX3RvbG93ZXIoTFpPX0lUUlVOQyh1bnNpZ25lZCBjaGFyLCBjKSkKKyNkZWZpbmUgbHpvX2FzY2lpX3V0b3VwcGVyKGMpICAgbHpvX2FzY2lpX3RvdXBwZXIoTFpPX0lUUlVOQyh1bnNpZ25lZCBjaGFyLCBjKSkKKyNpZm5kZWYgbHpvX2hzaXplX3QKKyNpZiAoTFpPX0hBVkVfTU1fSFVHRV9QVFIpCisjICBkZWZpbmUgbHpvX2hzaXplX3QgICB1bnNpZ25lZCBsb25nCisjICBkZWZpbmUgbHpvX2h2b2lkX3AgICB2b2lkIF9faHVnZSAqCisjICBkZWZpbmUgbHpvX2hjaGFyX3AgICBjaGFyIF9faHVnZSAqCisjICBkZWZpbmUgbHpvX2hjaGFyX3BwICBjaGFyIF9faHVnZSAqIF9faHVnZSAqCisjICBkZWZpbmUgbHpvX2hieXRlX3AgICB1bnNpZ25lZCBjaGFyIF9faHVnZSAqCisjZWxzZQorIyAgZGVmaW5lIGx6b19oc2l6ZV90ICAgc2l6ZV90CisjICBkZWZpbmUgbHpvX2h2b2lkX3AgICB2b2lkICoKKyMgIGRlZmluZSBsem9faGNoYXJfcCAgIGNoYXIgKgorIyAgZGVmaW5lIGx6b19oY2hhcl9wcCAgY2hhciAqKgorIyAgZGVmaW5lIGx6b19oYnl0ZV9wICAgdW5zaWduZWQgY2hhciAqCisjZW5kaWYKKyNlbmRpZgorTFpPTElCX0VYVEVSTihsem9faHZvaWRfcCwgbHpvX2hhbGxvYykgKGx6b19oc2l6ZV90KTsKK0xaT0xJQl9FWFRFUk4odm9pZCwgbHpvX2hmcmVlKSAobHpvX2h2b2lkX3ApOworI2lmIChMWk9fT1NfRE9TMTYgfHwgTFpPX09TX09TMjE2KQorTFpPTElCX0VYVEVSTih2b2lkIF9fZmFyKiwgbHpvX2Rvc19hbGxvYykgKHVuc2lnbmVkIGxvbmcpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19kb3NfZnJlZSkgKHZvaWQgX19mYXIqKTsKKyNlbmRpZgorTFpPTElCX0VYVEVSTihpbnQsIGx6b19obWVtY21wKSAoY29uc3QgbHpvX2h2b2lkX3AsIGNvbnN0IGx6b19odm9pZF9wLCBsem9faHNpemVfdCk7CitMWk9MSUJfRVhURVJOKGx6b19odm9pZF9wLCBsem9faG1lbWNweSkgKGx6b19odm9pZF9wLCBjb25zdCBsem9faHZvaWRfcCwgbHpvX2hzaXplX3QpOworTFpPTElCX0VYVEVSTihsem9faHZvaWRfcCwgbHpvX2htZW1tb3ZlKSAobHpvX2h2b2lkX3AsIGNvbnN0IGx6b19odm9pZF9wLCBsem9faHNpemVfdCk7CitMWk9MSUJfRVhURVJOKGx6b19odm9pZF9wLCBsem9faG1lbXNldCkgKGx6b19odm9pZF9wLCBpbnQsIGx6b19oc2l6ZV90KTsKK0xaT0xJQl9FWFRFUk4obHpvX2hzaXplX3QsIGx6b19oc3RybGVuKSAoY29uc3QgbHpvX2hjaGFyX3ApOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19oc3RyY21wKSAoY29uc3QgbHpvX2hjaGFyX3AsIGNvbnN0IGx6b19oY2hhcl9wKTsKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9faHN0cm5jbXApKGNvbnN0IGx6b19oY2hhcl9wLCBjb25zdCBsem9faGNoYXJfcCwgbHpvX2hzaXplX3QpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19hc2NpaV9oc3RyaWNtcCkgKGNvbnN0IGx6b19oY2hhcl9wLCBjb25zdCBsem9faGNoYXJfcCk7CitMWk9MSUJfRVhURVJOKGludCwgbHpvX2FzY2lpX2hzdHJuaWNtcCkoY29uc3QgbHpvX2hjaGFyX3AsIGNvbnN0IGx6b19oY2hhcl9wLCBsem9faHNpemVfdCk7CitMWk9MSUJfRVhURVJOKGludCwgbHpvX2FzY2lpX2htZW1pY21wKSAoY29uc3QgbHpvX2h2b2lkX3AsIGNvbnN0IGx6b19odm9pZF9wLCBsem9faHNpemVfdCk7CitMWk9MSUJfRVhURVJOKGx6b19oY2hhcl9wLCBsem9faHN0cnN0cikgKGNvbnN0IGx6b19oY2hhcl9wLCBjb25zdCBsem9faGNoYXJfcCk7CitMWk9MSUJfRVhURVJOKGx6b19oY2hhcl9wLCBsem9fYXNjaWlfaHN0cmlzdHIpIChjb25zdCBsem9faGNoYXJfcCwgY29uc3QgbHpvX2hjaGFyX3ApOworTFpPTElCX0VYVEVSTihsem9faHZvaWRfcCwgbHpvX2htZW1tZW0pIChjb25zdCBsem9faHZvaWRfcCwgbHpvX2hzaXplX3QsIGNvbnN0IGx6b19odm9pZF9wLCBsem9faHNpemVfdCk7CitMWk9MSUJfRVhURVJOKGx6b19odm9pZF9wLCBsem9fYXNjaWlfaG1lbWltZW0pIChjb25zdCBsem9faHZvaWRfcCwgbHpvX2hzaXplX3QsIGNvbnN0IGx6b19odm9pZF9wLCBsem9faHNpemVfdCk7CitMWk9MSUJfRVhURVJOKGx6b19oY2hhcl9wLCBsem9faHN0cmNweSkgKGx6b19oY2hhcl9wLCBjb25zdCBsem9faGNoYXJfcCk7CitMWk9MSUJfRVhURVJOKGx6b19oY2hhcl9wLCBsem9faHN0cmNhdCkgKGx6b19oY2hhcl9wLCBjb25zdCBsem9faGNoYXJfcCk7CitMWk9MSUJfRVhURVJOKGx6b19oc2l6ZV90LCBsem9faHN0cmxjcHkpIChsem9faGNoYXJfcCwgY29uc3QgbHpvX2hjaGFyX3AsIGx6b19oc2l6ZV90KTsKK0xaT0xJQl9FWFRFUk4obHpvX2hzaXplX3QsIGx6b19oc3RybGNhdCkgKGx6b19oY2hhcl9wLCBjb25zdCBsem9faGNoYXJfcCwgbHpvX2hzaXplX3QpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19oc3Ryc2NweSkgKGx6b19oY2hhcl9wLCBjb25zdCBsem9faGNoYXJfcCwgbHpvX2hzaXplX3QpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19oc3Ryc2NhdCkgKGx6b19oY2hhcl9wLCBjb25zdCBsem9faGNoYXJfcCwgbHpvX2hzaXplX3QpOworTFpPTElCX0VYVEVSTihsem9faGNoYXJfcCwgbHpvX2hzdHJjY3B5KSAobHpvX2hjaGFyX3AsIGNvbnN0IGx6b19oY2hhcl9wLCBpbnQpOworTFpPTElCX0VYVEVSTihsem9faHZvaWRfcCwgbHpvX2htZW1jY3B5KSAobHpvX2h2b2lkX3AsIGNvbnN0IGx6b19odm9pZF9wLCBpbnQsIGx6b19oc2l6ZV90KTsKK0xaT0xJQl9FWFRFUk4obHpvX2hjaGFyX3AsIGx6b19oc3RyY2hyKSAgKGNvbnN0IGx6b19oY2hhcl9wLCBpbnQpOworTFpPTElCX0VYVEVSTihsem9faGNoYXJfcCwgbHpvX2hzdHJyY2hyKSAoY29uc3QgbHpvX2hjaGFyX3AsIGludCk7CitMWk9MSUJfRVhURVJOKGx6b19oY2hhcl9wLCBsem9fYXNjaWlfaHN0cmljaHIpIChjb25zdCBsem9faGNoYXJfcCwgaW50KTsKK0xaT0xJQl9FWFRFUk4obHpvX2hjaGFyX3AsIGx6b19hc2NpaV9oc3RycmljaHIpIChjb25zdCBsem9faGNoYXJfcCwgaW50KTsKK0xaT0xJQl9FWFRFUk4obHpvX2h2b2lkX3AsIGx6b19obWVtY2hyKSAgKGNvbnN0IGx6b19odm9pZF9wLCBpbnQsIGx6b19oc2l6ZV90KTsKK0xaT0xJQl9FWFRFUk4obHpvX2h2b2lkX3AsIGx6b19obWVtcmNocikgKGNvbnN0IGx6b19odm9pZF9wLCBpbnQsIGx6b19oc2l6ZV90KTsKK0xaT0xJQl9FWFRFUk4obHpvX2h2b2lkX3AsIGx6b19hc2NpaV9obWVtaWNocikgKGNvbnN0IGx6b19odm9pZF9wLCBpbnQsIGx6b19oc2l6ZV90KTsKK0xaT0xJQl9FWFRFUk4obHpvX2h2b2lkX3AsIGx6b19hc2NpaV9obWVtcmljaHIpIChjb25zdCBsem9faHZvaWRfcCwgaW50LCBsem9faHNpemVfdCk7CitMWk9MSUJfRVhURVJOKGx6b19oc2l6ZV90LCBsem9faHN0cnNwbikgIChjb25zdCBsem9faGNoYXJfcCwgY29uc3QgbHpvX2hjaGFyX3ApOworTFpPTElCX0VYVEVSTihsem9faHNpemVfdCwgbHpvX2hzdHJyc3BuKSAoY29uc3QgbHpvX2hjaGFyX3AsIGNvbnN0IGx6b19oY2hhcl9wKTsKK0xaT0xJQl9FWFRFUk4obHpvX2hzaXplX3QsIGx6b19oc3RyY3NwbikgIChjb25zdCBsem9faGNoYXJfcCwgY29uc3QgbHpvX2hjaGFyX3ApOworTFpPTElCX0VYVEVSTihsem9faHNpemVfdCwgbHpvX2hzdHJyY3NwbikgKGNvbnN0IGx6b19oY2hhcl9wLCBjb25zdCBsem9faGNoYXJfcCk7CitMWk9MSUJfRVhURVJOKGx6b19oY2hhcl9wLCBsem9faHN0cnBicmspICAoY29uc3QgbHpvX2hjaGFyX3AsIGNvbnN0IGx6b19oY2hhcl9wKTsKK0xaT0xJQl9FWFRFUk4obHpvX2hjaGFyX3AsIGx6b19oc3RycnBicmspIChjb25zdCBsem9faGNoYXJfcCwgY29uc3QgbHpvX2hjaGFyX3ApOworTFpPTElCX0VYVEVSTihsem9faGNoYXJfcCwgbHpvX2hzdHJzZXApICAobHpvX2hjaGFyX3BwLCBjb25zdCBsem9faGNoYXJfcCk7CitMWk9MSUJfRVhURVJOKGx6b19oY2hhcl9wLCBsem9faHN0cnJzZXApIChsem9faGNoYXJfcHAsIGNvbnN0IGx6b19oY2hhcl9wKTsKK0xaT0xJQl9FWFRFUk4obHpvX2hjaGFyX3AsIGx6b19hc2NpaV9oc3RybHdyKSAobHpvX2hjaGFyX3ApOworTFpPTElCX0VYVEVSTihsem9faGNoYXJfcCwgbHpvX2FzY2lpX2hzdHJ1cHIpIChsem9faGNoYXJfcCk7CitMWk9MSUJfRVhURVJOKGx6b19odm9pZF9wLCBsem9fYXNjaWlfaG1lbWx3cikgKGx6b19odm9pZF9wLCBsem9faHNpemVfdCk7CitMWk9MSUJfRVhURVJOKGx6b19odm9pZF9wLCBsem9fYXNjaWlfaG1lbXVwcikgKGx6b19odm9pZF9wLCBsem9faHNpemVfdCk7CitMWk9MSUJfRVhURVJOKGx6b19oc2l6ZV90LCBsem9faGZyZWFkKSAodm9pZCAqLCBsem9faHZvaWRfcCwgbHpvX2hzaXplX3QpOworTFpPTElCX0VYVEVSTihsem9faHNpemVfdCwgbHpvX2hmd3JpdGUpICh2b2lkICosIGNvbnN0IGx6b19odm9pZF9wLCBsem9faHNpemVfdCk7CisjaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKQorTFpPTElCX0VYVEVSTihsb25nLCBsem9faHJlYWQpIChpbnQsIGx6b19odm9pZF9wLCBsb25nKTsKK0xaT0xJQl9FWFRFUk4obG9uZywgbHpvX2h3cml0ZSkgKGludCwgY29uc3QgbHpvX2h2b2lkX3AsIGxvbmcpOworI2VuZGlmCitMWk9MSUJfRVhURVJOKGxvbmcsIGx6b19zYWZlX2hyZWFkKSAoaW50LCBsem9faHZvaWRfcCwgbG9uZyk7CitMWk9MSUJfRVhURVJOKGxvbmcsIGx6b19zYWZlX2h3cml0ZSkgKGludCwgY29uc3QgbHpvX2h2b2lkX3AsIGxvbmcpOworTFpPTElCX0VYVEVSTih1bnNpZ25lZCwgbHpvX3VhX2dldF9iZTE2KSAoY29uc3QgbHpvX2h2b2lkX3ApOworTFpPTElCX0VYVEVSTihsem9fdWludDMybF90LCBsem9fdWFfZ2V0X2JlMjQpIChjb25zdCBsem9faHZvaWRfcCk7CitMWk9MSUJfRVhURVJOKGx6b191aW50MzJsX3QsIGx6b191YV9nZXRfYmUzMikgKGNvbnN0IGx6b19odm9pZF9wKTsKK0xaT0xJQl9FWFRFUk4odm9pZCwgbHpvX3VhX3NldF9iZTE2KSAobHpvX2h2b2lkX3AsIHVuc2lnbmVkKTsKK0xaT0xJQl9FWFRFUk4odm9pZCwgbHpvX3VhX3NldF9iZTI0KSAobHpvX2h2b2lkX3AsIGx6b191aW50MzJsX3QpOworTFpPTElCX0VYVEVSTih2b2lkLCBsem9fdWFfc2V0X2JlMzIpIChsem9faHZvaWRfcCwgbHpvX3VpbnQzMmxfdCk7CitMWk9MSUJfRVhURVJOKHVuc2lnbmVkLCBsem9fdWFfZ2V0X2xlMTYpIChjb25zdCBsem9faHZvaWRfcCk7CitMWk9MSUJfRVhURVJOKGx6b191aW50MzJsX3QsIGx6b191YV9nZXRfbGUyNCkgKGNvbnN0IGx6b19odm9pZF9wKTsKK0xaT0xJQl9FWFRFUk4obHpvX3VpbnQzMmxfdCwgbHpvX3VhX2dldF9sZTMyKSAoY29uc3QgbHpvX2h2b2lkX3ApOworTFpPTElCX0VYVEVSTih2b2lkLCBsem9fdWFfc2V0X2xlMTYpIChsem9faHZvaWRfcCwgdW5zaWduZWQpOworTFpPTElCX0VYVEVSTih2b2lkLCBsem9fdWFfc2V0X2xlMjQpIChsem9faHZvaWRfcCwgbHpvX3VpbnQzMmxfdCk7CitMWk9MSUJfRVhURVJOKHZvaWQsIGx6b191YV9zZXRfbGUzMikgKGx6b19odm9pZF9wLCBsem9fdWludDMybF90KTsKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKK0xaT0xJQl9FWFRFUk4obHpvX3VpbnQ2NGxfdCwgbHpvX3VhX2dldF9iZTY0KSAoY29uc3QgbHpvX2h2b2lkX3ApOworTFpPTElCX0VYVEVSTih2b2lkLCBsem9fdWFfc2V0X2JlNjQpIChsem9faHZvaWRfcCwgbHpvX3VpbnQ2NGxfdCk7CitMWk9MSUJfRVhURVJOKGx6b191aW50NjRsX3QsIGx6b191YV9nZXRfbGU2NCkgKGNvbnN0IGx6b19odm9pZF9wKTsKK0xaT0xJQl9FWFRFUk4odm9pZCwgbHpvX3VhX3NldF9sZTY0KSAobHpvX2h2b2lkX3AsIGx6b191aW50NjRsX3QpOworI2VuZGlmCitMWk9MSUJfRVhURVJOX05PSU5MSU5FKHNob3J0LCBsem9fdmdldF9zaG9ydCkgKHNob3J0LCBpbnQpOworTFpPTElCX0VYVEVSTl9OT0lOTElORShpbnQsIGx6b192Z2V0X2ludCkgKGludCwgaW50KTsKK0xaT0xJQl9FWFRFUk5fTk9JTkxJTkUobG9uZywgbHpvX3ZnZXRfbG9uZykgKGxvbmcsIGludCk7CisjaWYgZGVmaW5lZChsem9faW50NjRsX3QpCitMWk9MSUJfRVhURVJOX05PSU5MSU5FKGx6b19pbnQ2NGxfdCwgbHpvX3ZnZXRfbHpvX2ludDY0bF90KSAobHpvX2ludDY0bF90LCBpbnQpOworI2VuZGlmCitMWk9MSUJfRVhURVJOX05PSU5MSU5FKGx6b19oc2l6ZV90LCBsem9fdmdldF9sem9faHNpemVfdCkgKGx6b19oc2l6ZV90LCBpbnQpOworI2lmICEoTFpPX0NGR19OT19GTE9BVCkKK0xaT0xJQl9FWFRFUk5fTk9JTkxJTkUoZmxvYXQsIGx6b192Z2V0X2Zsb2F0KSAoZmxvYXQsIGludCk7CisjZW5kaWYKKyNpZiAhKExaT19DRkdfTk9fRE9VQkxFKQorTFpPTElCX0VYVEVSTl9OT0lOTElORShkb3VibGUsIGx6b192Z2V0X2RvdWJsZSkgKGRvdWJsZSwgaW50KTsKKyNlbmRpZgorTFpPTElCX0VYVEVSTl9OT0lOTElORShsem9faHZvaWRfcCwgbHpvX3ZnZXRfbHpvX2h2b2lkX3ApIChsem9faHZvaWRfcCwgaW50KTsKK0xaT0xJQl9FWFRFUk5fTk9JTkxJTkUoY29uc3QgbHpvX2h2b2lkX3AsIGx6b192Z2V0X2x6b19odm9pZF9jcCkgKGNvbnN0IGx6b19odm9pZF9wLCBpbnQpOworI2lmICFkZWZpbmVkKExaT19GTl9QQVRIX01BWCkKKyNpZiAoTFpPX09TX0RPUzE2IHx8IExaT19PU19XSU4xNikKKyMgIGRlZmluZSBMWk9fRk5fUEFUSF9NQVggICAxNDMKKyNlbGlmIChMWk9fT1NfRE9TMzIgfHwgTFpPX09TX09TMiB8fCBMWk9fT1NfT1MyMTYgfHwgTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKKyMgIGRlZmluZSBMWk9fRk5fUEFUSF9NQVggICAyNTkKKyNlbGlmIChMWk9fT1NfVE9TKQorIyAgZGVmaW5lIExaT19GTl9QQVRIX01BWCAgIDI1OQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fRk5fUEFUSF9NQVgpCisjICBkZWZpbmUgTFpPX0ZOX1BBVEhfTUFYICAgMTAyMworI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX0ZOX05BTUVfTUFYKQorI2lmIChMWk9fT1NfRE9TMTYgfHwgTFpPX09TX1dJTjE2KQorIyAgZGVmaW5lIExaT19GTl9OQU1FX01BWCAgIDEyCisjZWxpZiAoTFpPX0FSQ0hfTTY4SyAmJiBMWk9fT1NfVE9TICYmIChMWk9fQ0NfUFVSRUMgfHwgTFpPX0NDX1RVUkJPQykpCisjICBkZWZpbmUgTFpPX0ZOX05BTUVfTUFYICAgMTIKKyNlbGlmIChMWk9fT1NfRE9TMzIgJiYgTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19ESkdQUF9fKQorI2VsaWYgKExaT19PU19ET1MzMikKKyMgIGRlZmluZSBMWk9fRk5fTkFNRV9NQVggICAxMgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fRk5fTkFNRV9NQVgpCisjICBkZWZpbmUgTFpPX0ZOX05BTUVfTUFYICAgTFpPX0ZOX1BBVEhfTUFYCisjZW5kaWYKKyNkZWZpbmUgTFpPX0ZOTUFUQ0hfTk9FU0NBUEUgICAgICAgIDEKKyNkZWZpbmUgTFpPX0ZOTUFUQ0hfUEFUSE5BTUUgICAgICAgIDIKKyNkZWZpbmUgTFpPX0ZOTUFUQ0hfUEFUSFNUQVIgICAgICAgIDQKKyNkZWZpbmUgTFpPX0ZOTUFUQ0hfUEVSSU9EICAgICAgICAgIDgKKyNkZWZpbmUgTFpPX0ZOTUFUQ0hfQVNDSUlfQ0FTRUZPTEQgIDE2CitMWk9MSUJfRVhURVJOKGludCwgbHpvX2ZubWF0Y2gpIChjb25zdCBsem9faGNoYXJfcCwgY29uc3QgbHpvX2hjaGFyX3AsIGludCk7CisjdW5kZWYgX19MWk9MSUJfVVNFX09QRU5ESVIKKyNpZiAoSEFWRV9ESVJFTlRfSCB8fCBMWk9fQ0NfV0FUQ09NQykKKyMgIGRlZmluZSBfX0xaT0xJQl9VU0VfT1BFTkRJUiAxCisjICBpZiAoTFpPX09TX0RPUzMyICYmIGRlZmluZWQoX19CT1JMQU5EQ19fKSkKKyMgIGVsaWYgKExaT19PU19ET1MzMiAmJiBMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX0RKR1BQX18pCisjICBlbGlmIChMWk9fT1NfT1MyIHx8IExaT19PU19PUzIxNikKKyMgIGVsaWYgKExaT19BUkNIX002OEsgJiYgTFpPX09TX1RPUyAmJiBMWk9fQ0NfR05VQykKKyMgIGVsaWYgKExaT19PU19XSU4zMiAmJiAhKExaT19IQVZFX1dJTkRPV1NfSCkpCisjICBlbGlmIChMWk9fT1NfRE9TMTYgfHwgTFpPX09TX0RPUzMyIHx8IExaT19PU19PUzIgfHwgTFpPX09TX09TMjE2IHx8IExaT19PU19UT1MgfHwgTFpPX09TX1dJTjE2IHx8IExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpCisjICAgIHVuZGVmIF9fTFpPTElCX1VTRV9PUEVORElSCisjICBlbmRpZgorI2VuZGlmCit0eXBlZGVmIHN0cnVjdAoreworI2lmIGRlZmluZWQoX19MWk9MSUJfVVNFX09QRU5ESVIpCisgICAgdm9pZCogdV9kaXJwOworIyBpZiAoTFpPX0NDX1dBVENPTUMpCisgICAgdW5zaWduZWQgc2hvcnQgZl90aW1lOworICAgIHVuc2lnbmVkIHNob3J0IGZfZGF0ZTsKKyAgICB1bnNpZ25lZCBsb25nIGZfc2l6ZTsKKyMgZW5kaWYKKyAgICBjaGFyIGZfbmFtZVtMWk9fRk5fTkFNRV9NQVgrMV07CisjZWxpZiAoTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKKyAgICBsem9saWJfaGFuZGxlX3QgdV9oYW5kbGU7CisgICAgdW5zaWduZWQgZl9hdHRyOworICAgIHVuc2lnbmVkIGZfc2l6ZV9sb3c7CisgICAgdW5zaWduZWQgZl9zaXplX2hpZ2g7CisgICAgY2hhciBmX25hbWVbTFpPX0ZOX05BTUVfTUFYKzFdOworI2VsaWYgKExaT19PU19ET1MxNiB8fCBMWk9fT1NfRE9TMzIgfHwgTFpPX09TX1RPUyB8fCBMWk9fT1NfV0lOMTYpCisgICAgY2hhciB1X2R0YVsyMV07CisgICAgdW5zaWduZWQgY2hhciBmX2F0dHI7CisgICAgdW5zaWduZWQgc2hvcnQgZl90aW1lOworICAgIHVuc2lnbmVkIHNob3J0IGZfZGF0ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBmX3NpemVfbG93OworICAgIHVuc2lnbmVkIHNob3J0IGZfc2l6ZV9oaWdoOworICAgIGNoYXIgZl9uYW1lW0xaT19GTl9OQU1FX01BWCsxXTsKKyAgICBjaGFyIHVfZGlycDsKKyNlbHNlCisgICAgdm9pZCogdV9kaXJwOworICAgIGNoYXIgZl9uYW1lW0xaT19GTl9OQU1FX01BWCsxXTsKKyNlbmRpZgorfSBsem9fZGlyX3Q7CisjaWZuZGVmIGx6b19kaXJfcAorI2RlZmluZSBsem9fZGlyX3AgbHpvX2Rpcl90ICoKKyNlbmRpZgorTFpPTElCX0VYVEVSTihpbnQsIGx6b19vcGVuZGlyKSAgKGx6b19kaXJfcCwgY29uc3QgY2hhciopOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19yZWFkZGlyKSAgKGx6b19kaXJfcCk7CitMWk9MSUJfRVhURVJOKGludCwgbHpvX2Nsb3NlZGlyKSAobHpvX2Rpcl9wKTsKKyNpZiAoTFpPX0NDX0dOVUMpICYmIChkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorIyAgZGVmaW5lIGx6b19hbGxvY2EoeCkgICAgIF9fYnVpbHRpbl9hbGxvY2EoKHgpKQorI2VsaWYgKExaT19DQ19HTlVDKSAmJiAoTFpPX09TX0NPTlNPTEVfUFMyKQorIyAgZGVmaW5lIGx6b19hbGxvY2EoeCkgICAgIF9fYnVpbHRpbl9hbGxvY2EoKHgpKQorI2VsaWYgKExaT19DQ19CT1JMQU5EQyB8fCBMWk9fQ0NfTENDKSAmJiBkZWZpbmVkKF9fbGludXhfXykKKyNlbGlmIChIQVZFX0FMTE9DQSkKKyMgIGRlZmluZSBsem9fYWxsb2NhKHgpICAgICBMWk9fU1RBVElDX0NBU1Qodm9pZCAqLCBhbGxvY2EoKHgpKSkKKyNlbmRpZgorI2lmIChMWk9fT1NfRE9TMzIgJiYgTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19ESkdQUF9fKQorIyAgZGVmaW5lIGx6b19zdGFja2F2YWlsKCkgIHN0YWNrYXZhaWwoKQorI2VsaWYgKExaT19BUkNIX0kwODYgJiYgTFpPX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNDEwKSkKKyMgIGRlZmluZSBsem9fc3RhY2thdmFpbCgpICBzdGFja2F2YWlsKCkKKyNlbGlmIChMWk9fQVJDSF9JMDg2ICYmIExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDQwMCkpCisjICBpZiAoTFpPX09TX1dJTjE2KSAmJiAoTFpPX01NX1RJTlkgfHwgTFpPX01NX1NNQUxMIHx8IExaT19NTV9NRURJVU0pCisjICBlbHNlCisjICAgIGRlZmluZSBsem9fc3RhY2thdmFpbCgpICBzdGFja2F2YWlsKCkKKyMgIGVuZGlmCisjZWxpZiAoKExaT19BUkNIX0kwODYgfHwgTFpPX0FSQ0hfSTM4NikgJiYgKExaT19DQ19ETUMgfHwgTFpPX0NDX1NZTUFOVEVDQykpCisjICBkZWZpbmUgbHpvX3N0YWNrYXZhaWwoKSAgc3RhY2thdmFpbCgpCisjZWxpZiAoKExaT19BUkNIX0kwODYpICYmIExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDcwMCkpCisjICBkZWZpbmUgbHpvX3N0YWNrYXZhaWwoKSAgX3N0YWNrYXZhaWwoKQorI2VsaWYgKChMWk9fQVJDSF9JMDg2KSAmJiBMWk9fQ0NfTVNDKQorIyAgZGVmaW5lIGx6b19zdGFja2F2YWlsKCkgIHN0YWNrYXZhaWwoKQorI2VsaWYgKChMWk9fQVJDSF9JMDg2IHx8IExaT19BUkNIX0kzODYpICYmIExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPj0gMHgwNDUwKSkKKyMgIGRlZmluZSBsem9fc3RhY2thdmFpbCgpICBzdGFja2F2YWlsKCkKKyNlbGlmIChMWk9fQVJDSF9JMDg2ICYmIExaT19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPj0gMHgwNDAwKSkKKyAgIExaT19FWFRFUk5fQyBzaXplX3QgX19jZGVjbCBzdGFja2F2YWlsKHZvaWQpOworIyAgZGVmaW5lIGx6b19zdGFja2F2YWlsKCkgIHN0YWNrYXZhaWwoKQorI2VsaWYgKChMWk9fQVJDSF9JMDg2IHx8IExaT19BUkNIX0kzODYpICYmIChMWk9fQ0NfV0FUQ09NQykpCisjICBkZWZpbmUgbHpvX3N0YWNrYXZhaWwoKSAgc3RhY2thdmFpbCgpCisjZWxpZiAoTFpPX0FSQ0hfSTA4NiAmJiBMWk9fQ0NfWk9SVEVDSEMpCisjICBkZWZpbmUgbHpvX3N0YWNrYXZhaWwoKSAgX2Noa3N0YWNrKCkKKyNlbmRpZgorTFpPTElCX0VYVEVSTihsem9faW50cHRyX3QsIGx6b19nZXRfb3NmaGFuZGxlKSAoaW50KTsKK0xaT0xJQl9FWFRFUk4oY29uc3QgY2hhciAqLCBsem9fZ2V0ZW52KSAoY29uc3QgY2hhciAqKTsKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9faXNhdHR5KSAoaW50KTsKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9fbWtkaXIpIChjb25zdCBjaGFyKiwgdW5zaWduZWQpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19ybWRpcikgKGNvbnN0IGNoYXIqKTsKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9fcmVzcG9uc2UpIChpbnQqLCBjaGFyKioqKTsKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9fc2V0X2Jpbm1vZGUpIChpbnQsIGludCk7CisjaWYgZGVmaW5lZChsem9faW50MzJlX3QpCitMWk9MSUJfRVhURVJOKGx6b19pbnQzMmVfdCwgbHpvX211bGRpdjMycykgKGx6b19pbnQzMmVfdCwgbHpvX2ludDMyZV90LCBsem9faW50MzJlX3QpOworTFpPTElCX0VYVEVSTihsem9fdWludDMyZV90LCBsem9fbXVsZGl2MzJ1KSAobHpvX3VpbnQzMmVfdCwgbHpvX3VpbnQzMmVfdCwgbHpvX3VpbnQzMmVfdCk7CisjZW5kaWYKK0xaT0xJQl9FWFRFUk4odm9pZCwgbHpvX3dpbGRhcmd2KSAoaW50KiwgY2hhcioqKik7CitMWk9MSUJfRVhURVJOX05PSU5MSU5FKHZvaWQsIGx6b19kZWJ1Z19icmVhaykgKHZvaWQpOworTFpPTElCX0VYVEVSTl9OT0lOTElORSh2b2lkLCBsem9fZGVidWdfbm9wKSAodm9pZCk7CitMWk9MSUJfRVhURVJOX05PSU5MSU5FKGludCwgbHpvX2RlYnVnX2FsaWduX2NoZWNrX3F1ZXJ5KSAodm9pZCk7CitMWk9MSUJfRVhURVJOX05PSU5MSU5FKGludCwgbHpvX2RlYnVnX2FsaWduX2NoZWNrX2VuYWJsZSkgKGludCk7CitMWk9MSUJfRVhURVJOX05PSU5MSU5FKHVuc2lnbmVkLCBsem9fZGVidWdfcnVubmluZ19vbl9xZW11KSAodm9pZCk7CitMWk9MSUJfRVhURVJOX05PSU5MSU5FKHVuc2lnbmVkLCBsem9fZGVidWdfcnVubmluZ19vbl92YWxncmluZCkgKHZvaWQpOworI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorTFpPTElCX0VYVEVSTihpbnQsIGx6b190c2NfcmVhZCkgKGx6b191aW50MzJlX3QqKTsKKyNlbmRpZgorc3RydWN0IGx6b19wY2xvY2tfaGFuZGxlX3Q7CitzdHJ1Y3QgbHpvX3BjbG9ja190OwordHlwZWRlZiBzdHJ1Y3QgbHpvX3BjbG9ja19oYW5kbGVfdCBsem9fcGNsb2NrX2hhbmRsZV90OwordHlwZWRlZiBzdHJ1Y3QgbHpvX3BjbG9ja190IGx6b19wY2xvY2tfdDsKKyNpZm5kZWYgbHpvX3BjbG9ja19oYW5kbGVfcAorI2RlZmluZSBsem9fcGNsb2NrX2hhbmRsZV9wIGx6b19wY2xvY2tfaGFuZGxlX3QgKgorI2VuZGlmCisjaWZuZGVmIGx6b19wY2xvY2tfcAorI2RlZmluZSBsem9fcGNsb2NrX3AgbHpvX3BjbG9ja190ICoKKyNlbmRpZgorI2RlZmluZSBMWk9fUENMT0NLX1JFQUxUSU1FICAgICAgICAgICAgIDAKKyNkZWZpbmUgTFpPX1BDTE9DS19NT05PVE9OSUMgICAgICAgICAgICAxCisjZGVmaW5lIExaT19QQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEICAgMgorI2RlZmluZSBMWk9fUENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEICAgIDMKK3R5cGVkZWYgaW50ICgqbHpvX3BjbG9ja19nZXR0aW1lX3QpIChsem9fcGNsb2NrX2hhbmRsZV9wLCBsem9fcGNsb2NrX3ApOworc3RydWN0IGx6b19wY2xvY2tfaGFuZGxlX3QgeworICAgIGx6b2xpYl9oYW5kbGVfdCBoOworICAgIGludCBtb2RlOworICAgIGludCByZWFkX2Vycm9yOworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgbHpvX3BjbG9ja19nZXR0aW1lX3QgZ2V0dGltZTsKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKKyAgICBsem9fdWludDY0bF90IHRpY2tzX2Jhc2U7CisjZW5kaWYKK307CitzdHJ1Y3QgbHpvX3BjbG9ja190IHsKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKKyAgICBsem9faW50NjRsX3QgdHZfc2VjOworI2Vsc2UKKyAgICBsem9faW50MzJsX3QgdHZfc2VjX2hpZ2g7CisgICAgbHpvX3VpbnQzMmxfdCB0dl9zZWNfbG93OworI2VuZGlmCisgICAgbHpvX3VpbnQzMmxfdCB0dl9uc2VjOworfTsKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9fcGNsb2NrX29wZW4pICAobHpvX3BjbG9ja19oYW5kbGVfcCwgaW50KTsKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9fcGNsb2NrX29wZW5fZGVmYXVsdCkgKGx6b19wY2xvY2tfaGFuZGxlX3ApOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19wY2xvY2tfY2xvc2UpIChsem9fcGNsb2NrX2hhbmRsZV9wKTsKK0xaT0xJQl9FWFRFUk4odm9pZCwgbHpvX3BjbG9ja19yZWFkKSAobHpvX3BjbG9ja19oYW5kbGVfcCwgbHpvX3BjbG9ja19wKTsKKyNpZiAhKExaT19DRkdfTk9fRE9VQkxFKQorTFpPTElCX0VYVEVSTihkb3VibGUsIGx6b19wY2xvY2tfZ2V0X2VsYXBzZWQpIChsem9fcGNsb2NrX2hhbmRsZV9wLCBjb25zdCBsem9fcGNsb2NrX3AsIGNvbnN0IGx6b19wY2xvY2tfcCk7CisjZW5kaWYKK0xaT0xJQl9FWFRFUk4oaW50LCBsem9fcGNsb2NrX2ZsdXNoX2NwdV9jYWNoZSkgKGx6b19wY2xvY2tfaGFuZGxlX3AsIHVuc2lnbmVkKTsKK3N0cnVjdCBsem9fZ2V0b3B0X3Q7Cit0eXBlZGVmIHN0cnVjdCBsem9fZ2V0b3B0X3QgbHpvX2dldG9wdF90OworI2lmbmRlZiBsem9fZ2V0b3B0X3AKKyNkZWZpbmUgbHpvX2dldG9wdF9wIGx6b19nZXRvcHRfdCAqCisjZW5kaWYKK3N0cnVjdCBsem9fZ2V0b3B0X2xvbmdvcHRfdDsKK3R5cGVkZWYgc3RydWN0IGx6b19nZXRvcHRfbG9uZ29wdF90IGx6b19nZXRvcHRfbG9uZ29wdF90OworI2lmbmRlZiBsem9fZ2V0b3B0X2xvbmdvcHRfcAorI2RlZmluZSBsem9fZ2V0b3B0X2xvbmdvcHRfcCBsem9fZ2V0b3B0X2xvbmdvcHRfdCAqCisjZW5kaWYKK3N0cnVjdCBsem9fZ2V0b3B0X2xvbmdvcHRfdCB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBpbnQgaGFzX2FyZzsKKyAgICBpbnQqIGZsYWc7CisgICAgaW50IHZhbDsKK307Cit0eXBlZGVmIHZvaWQgKCpsem9fZ2V0b3B0X29wdGVycl90KShsem9fZ2V0b3B0X3AsIGNvbnN0IGNoYXIqLCB2b2lkICopOworc3RydWN0IGx6b19nZXRvcHRfdCB7CisgICAgdm9pZCAqdXNlcjsKKyAgICBjb25zdCBjaGFyICpwcm9nbmFtZTsKKyAgICBpbnQgYmFkX29wdGlvbjsKKyAgICBjaGFyICpvcHRhcmc7CisgICAgbHpvX2dldG9wdF9vcHRlcnJfdCBvcHRlcnI7CisgICAgaW50IG9wdGluZDsKKyAgICBpbnQgb3B0b3B0OworICAgIGludCBlcnJjb3VudDsKKyAgICBpbnQgYXJnYzsgY2hhcioqIGFyZ3Y7CisgICAgaW50IGVvZjsgaW50IHNob3J0cG9zOworICAgIGludCBwZW5kaW5nX3JvdGF0ZV9maXJzdCwgcGVuZGluZ19yb3RhdGVfbWlkZGxlOworfTsKK2VudW0geyBMWk9fR0VUT1BUX05PX0FSRywgTFpPX0dFVE9QVF9SRVFVSVJFRF9BUkcsIExaT19HRVRPUFRfT1BUSU9OQUxfQVJHLCBMWk9fR0VUT1BUX0VYQUNUX0FSRyA9IDB4MTAgfTsKK2VudW0geyBMWk9fR0VUT1BUX1BFUk1VVEUsIExaT19HRVRPUFRfUkVUVVJOX0lOX09SREVSLCBMWk9fR0VUT1BUX1JFUVVJUkVfT1JERVIgfTsKK0xaT0xJQl9FWFRFUk4odm9pZCwgbHpvX2dldG9wdF9pbml0KSAobHpvX2dldG9wdF9wIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9hcmdjLCBpbnQgYXJnYywgY2hhcioqIGFyZ3YpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19nZXRvcHQpIChsem9fZ2V0b3B0X3AgZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hvcnRvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsem9fZ2V0b3B0X2xvbmdvcHRfcCBsb25nb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBsb25naW5kKTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBsem9fdWludDMybF90IHNlZWQ7Cit9IGx6b19yYW5kMzFfdDsKKyNpZm5kZWYgbHpvX3JhbmQzMV9wCisjZGVmaW5lIGx6b19yYW5kMzFfcCBsem9fcmFuZDMxX3QgKgorI2VuZGlmCitMWk9MSUJfRVhURVJOKHZvaWQsIGx6b19zcmFuZDMxKSAobHpvX3JhbmQzMV9wLCBsem9fdWludDMybF90KTsKK0xaT0xJQl9FWFRFUk4obHpvX3VpbnQzMmxfdCwgbHpvX3JhbmQzMSkgKGx6b19yYW5kMzFfcCk7CisjaWYgZGVmaW5lZChsem9faW50NjRsX3QpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbHpvX3VpbnQ2NGxfdCBzZWVkOworfSBsem9fcmFuZDQ4X3Q7CisjaWZuZGVmIGx6b19yYW5kNDhfcAorI2RlZmluZSBsem9fcmFuZDQ4X3AgbHpvX3JhbmQ0OF90ICoKKyNlbmRpZgorTFpPTElCX0VYVEVSTih2b2lkLCBsem9fc3JhbmQ0OCkgKGx6b19yYW5kNDhfcCwgbHpvX3VpbnQzMmxfdCk7CitMWk9MSUJfRVhURVJOKGx6b191aW50MzJsX3QsIGx6b19yYW5kNDgpIChsem9fcmFuZDQ4X3ApOworTFpPTElCX0VYVEVSTihsem9fdWludDMybF90LCBsem9fcmFuZDQ4X3IzMikgKGx6b19yYW5kNDhfcCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBsem9fdWludDY0bF90IHNlZWQ7Cit9IGx6b19yYW5kNjRfdDsKKyNpZm5kZWYgbHpvX3JhbmQ2NF9wCisjZGVmaW5lIGx6b19yYW5kNjRfcCBsem9fcmFuZDY0X3QgKgorI2VuZGlmCitMWk9MSUJfRVhURVJOKHZvaWQsIGx6b19zcmFuZDY0KSAobHpvX3JhbmQ2NF9wLCBsem9fdWludDY0bF90KTsKK0xaT0xJQl9FWFRFUk4obHpvX3VpbnQzMmxfdCwgbHpvX3JhbmQ2NCkgKGx6b19yYW5kNjRfcCk7CitMWk9MSUJfRVhURVJOKGx6b191aW50MzJsX3QsIGx6b19yYW5kNjRfcjMyKSAobHpvX3JhbmQ2NF9wKTsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIG47CisgICAgbHpvX3VpbnQzMmxfdCBzWzYyNF07Cit9IGx6b19yYW5kbXRfdDsKKyNpZm5kZWYgbHpvX3JhbmRtdF9wCisjZGVmaW5lIGx6b19yYW5kbXRfcCBsem9fcmFuZG10X3QgKgorI2VuZGlmCitMWk9MSUJfRVhURVJOKHZvaWQsIGx6b19zcmFuZG10KSAobHpvX3JhbmRtdF9wLCBsem9fdWludDMybF90KTsKK0xaT0xJQl9FWFRFUk4obHpvX3VpbnQzMmxfdCwgbHpvX3JhbmRtdCkgKGx6b19yYW5kbXRfcCk7CitMWk9MSUJfRVhURVJOKGx6b191aW50MzJsX3QsIGx6b19yYW5kbXRfcjMyKSAobHpvX3JhbmRtdF9wKTsKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBuOworICAgIGx6b191aW50NjRsX3Qgc1szMTJdOworfSBsem9fcmFuZG10NjRfdDsKKyNpZm5kZWYgbHpvX3JhbmRtdDY0X3AKKyNkZWZpbmUgbHpvX3JhbmRtdDY0X3AgbHpvX3JhbmRtdDY0X3QgKgorI2VuZGlmCitMWk9MSUJfRVhURVJOKHZvaWQsIGx6b19zcmFuZG10NjQpIChsem9fcmFuZG10NjRfcCwgbHpvX3VpbnQ2NGxfdCk7CitMWk9MSUJfRVhURVJOKGx6b191aW50NjRsX3QsIGx6b19yYW5kbXQ2NF9yNjQpIChsem9fcmFuZG10NjRfcCk7CisjZW5kaWYKKyNkZWZpbmUgTFpPX1NQQVdOX1BfV0FJVCAgICAwCisjZGVmaW5lIExaT19TUEFXTl9QX05PV0FJVCAgMQorTFpPTElCX0VYVEVSTihpbnQsIGx6b19zcGF3bnYpICAoaW50IG1vZGUsIGNvbnN0IGNoYXIqIGZuLCBjb25zdCBjaGFyKiBjb25zdCAqIGFyZ3YpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19zcGF3bnZwKSAoaW50IG1vZGUsIGNvbnN0IGNoYXIqIGZuLCBjb25zdCBjaGFyKiBjb25zdCAqIGFyZ3YpOworTFpPTElCX0VYVEVSTihpbnQsIGx6b19zcGF3bnZlKSAoaW50IG1vZGUsIGNvbnN0IGNoYXIqIGZuLCBjb25zdCBjaGFyKiBjb25zdCAqIGFyZ3YsIGNvbnN0IGNoYXIgKiBjb25zdCBlbnZwKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChMWk9fV0FOVF9BQ0NfQ1hYX0gpCisjICB1bmRlZiBMWk9fV0FOVF9BQ0NfQ1hYX0gKKyNpZm5kZWYgX19MWk9fQ1hYX0hfSU5DTFVERUQKKyNkZWZpbmUgX19MWk9fQ1hYX0hfSU5DTFVERUQgMQorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjaWYgZGVmaW5lZChMWk9fQ1hYX05PVEhST1cpCisjZWxpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjA4MDB1bCkpCisjZWxpZiAoTFpPX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPCAweDA0NTApKQorI2VsaWYgKExaT19DQ19HSFMgJiYgIWRlZmluZWQoX19FWENFUFRJT05TKSkKKyNlbGlmIChMWk9fQ0NfSElHSEMpCisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPCAxMTAwKSkKKyNlbGlmIChMWk9fQ0NfTkRQQykKKyNlbGlmIChMWk9fQ0NfVFVSQk9DKQorI2VsaWYgKExaT19DQ19XQVRDT01DICYmICFkZWZpbmVkKF9DUFBVTldJTkQpKQorI2VsaWYgKExaT19DQ19aT1JURUNIQykKKyNlbHNlCisjICBkZWZpbmUgTFpPX0NYWF9OT1RIUk9XICAgICAgICAgICB0aHJvdygpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fQ1hYX05PVEhST1cpCisjICBkZWZpbmUgTFpPX0NYWF9OT1RIUk9XICAgICAgICAgICAvKmVtcHR5Ki8KKyNlbmRpZgorI2lmIGRlZmluZWQoX19MWk9fQ1hYX0RPX05FVykKKyNlbGlmIChMWk9fQ0NfR0hTIHx8IExaT19DQ19ORFBDIHx8IExaT19DQ19QR0kpCisjICBkZWZpbmUgX19MWk9fQ1hYX0RPX05FVyAgICAgICAgICB7IHJldHVybiAwOyB9CisjZWxpZiAoKExaT19DQ19CT1JMQU5EQyB8fCBMWk9fQ0NfVFVSQk9DKSAmJiBMWk9fQVJDSF9JMDg2KQorIyAgZGVmaW5lIF9fTFpPX0NYWF9ET19ORVcgICAgICAgICAgeyByZXR1cm4gMDsgfQorI2Vsc2UKKyMgIGRlZmluZSBfX0xaT19DWFhfRE9fTkVXICAgICAgICAgIDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19MWk9fQ1hYX0RPX0RFTEVURSkKKyNlbGlmIChMWk9fQ0NfQk9STEFOREMgfHwgTFpPX0NDX1RVUkJPQykKKyMgIGRlZmluZSBfX0xaT19DWFhfRE9fREVMRVRFICAgICAgIHsgfQorI2Vsc2UKKyMgIGRlZmluZSBfX0xaT19DWFhfRE9fREVMRVRFICAgICAgIExaT19DWFhfTk9USFJPVyB7IH0KKyNlbmRpZgorI2lmIChMWk9fQ0NfQk9STEFOREMgJiYgKF9fQk9STEFORENfXyA8IDB4MDQ1MCkpCisjZWxpZiAoTFpPX0NDX01TQyAmJiBMWk9fTU1fSFVHRSkKKyMgIGRlZmluZSBMWk9fQ1hYX0RJU0FCTEVfTkVXX0RFTEVURSBwcml2YXRlOgorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSIDwgMTEwMCkpCisjZWxpZiAoTFpPX0NDX05EUEMpCisjZWxpZiAoTFpPX0NDX1NZTUFOVEVDQyB8fCBMWk9fQ0NfWk9SVEVDSEMpCisjZWxpZiAoTFpPX0NDX1RVUkJPQykKKyNlbGlmIChMWk9fQ0NfV0FUQ09NQyAmJiAoX19XQVRDT01DX18gPCAxMTAwKSkKKyNlbHNlCisjICBkZWZpbmUgX19MWk9fQ1hYX0hBVkVfQVJSQVlfTkVXIDEKKyNlbmRpZgorI2lmIChfX0xaT19DWFhfSEFWRV9BUlJBWV9ORVcpCisjICBkZWZpbmUgX19MWk9fQ1hYX0hBVkVfUExBQ0VNRU5UX05FVyAxCisjZW5kaWYKKyNpZiAoX19MWk9fQ1hYX0hBVkVfUExBQ0VNRU5UX05FVykKKyMgIGlmIChMWk9fQ0NfR05VQyA+PSAweDAzMDAwMHVsKQorIyAgICBkZWZpbmUgX19MWk9fQ1hYX0hBVkVfUExBQ0VNRU5UX0RFTEVURSAxCisjICBlbGlmIChMWk9fQ0NfSU5URUxDKQorIyAgICBkZWZpbmUgX19MWk9fQ1hYX0hBVkVfUExBQ0VNRU5UX0RFTEVURSAxCisjICBlbGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMjAwKSkKKyMgICAgZGVmaW5lIF9fTFpPX0NYWF9IQVZFX1BMQUNFTUVOVF9ERUxFVEUgMQorIyAgZWxpZiAoTFpPX0NDX0NMQU5HIHx8IExaT19DQ19MTFZNIHx8IExaT19DQ19QQVRIU0NBTEUpCisjICAgIGRlZmluZSBfX0xaT19DWFhfSEFWRV9QTEFDRU1FTlRfREVMRVRFIDEKKyMgIGVsaWYgKExaT19DQ19QR0kpCisjICAgIGRlZmluZSBfX0xaT19DWFhfSEFWRV9QTEFDRU1FTlRfREVMRVRFIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKExaT19DWFhfRElTQUJMRV9ORVdfREVMRVRFKQorI2VsaWYgZGVmaW5lZChuZXcpIHx8IGRlZmluZWQoZGVsZXRlKQorIyAgZGVmaW5lIExaT19DWFhfRElTQUJMRV9ORVdfREVMRVRFIHByaXZhdGU6CisjZWxpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjViMDB1bCkpCisjICBkZWZpbmUgTFpPX0NYWF9ESVNBQkxFX05FV19ERUxFVEUgcHJpdmF0ZToKKyNlbGlmICAoTFpPX0NDX0hJR0hDKQorIyAgZGVmaW5lIExaT19DWFhfRElTQUJMRV9ORVdfREVMRVRFIHByaXZhdGU6CisjZWxpZiAhKF9fTFpPX0NYWF9IQVZFX0FSUkFZX05FVykKKyMgIGRlZmluZSBMWk9fQ1hYX0RJU0FCTEVfTkVXX0RFTEVURSBcCisgICAgICAgIHByb3RlY3RlZDogc3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqKSBfX0xaT19DWFhfRE9fREVMRVRFIFwKKyAgICAgICAgcHJvdGVjdGVkOiBzdGF0aWMgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCkgX19MWk9fQ1hYX0RPX05FVyBcCisgICAgICAgIHByaXZhdGU6CisjZWxzZQorIyAgZGVmaW5lIExaT19DWFhfRElTQUJMRV9ORVdfREVMRVRFIFwKKyAgICAgICAgcHJvdGVjdGVkOiBzdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopIF9fTFpPX0NYWF9ET19ERUxFVEUgXAorICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqKSBfX0xaT19DWFhfRE9fREVMRVRFIFwKKyAgICAgICAgcHJpdmF0ZTogICBzdGF0aWMgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCkgIF9fTFpPX0NYWF9ET19ORVcgXAorICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkKiBvcGVyYXRvciBuZXdbXShzaXplX3QpIF9fTFpPX0NYWF9ET19ORVcKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX0NYWF9UUklHR0VSX0ZVTkNUSU9OKQorI2Vsc2UKKyMgIGRlZmluZSBMWk9fQ1hYX1RSSUdHRVJfRlVOQ1RJT04gXAorICAgICAgICBwcm90ZWN0ZWQ6IHZpcnR1YWwgY29uc3Qgdm9pZCogbHpvX2N4eF90cmlnZ2VyX2Z1bmN0aW9uKCkgY29uc3Q7IFwKKyAgICAgICAgcHJpdmF0ZToKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX0NYWF9UUklHR0VSX0ZVTkNUSU9OX0lNUEwpCisjZWxzZQorIyAgZGVmaW5lIExaT19DWFhfVFJJR0dFUl9GVU5DVElPTl9JTVBMKGtsYXNzKSBcCisgICAgICAgIGNvbnN0IHZvaWQqIGtsYXNzOjpsem9fY3h4X3RyaWdnZXJfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBMWk9fU1RBVElDX0NBU1QoY29uc3Qgdm9pZCAqLCAwKTsgfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChMWk9fV0FOVF9BQ0NfQ0hLX0NIKQorIyAgdW5kZWYgTFpPX1dBTlRfQUNDX0NIS19DSAorI2lmICFkZWZpbmVkKExaT0NIS19BU1NFUlQpCisjICBkZWZpbmUgTFpPQ0hLX0FTU0VSVChleHByKSAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihleHByKQorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPQ0hLX0FTU0VSVF9TSUdOX1QpCisjICBkZWZpbmUgTFpPQ0hLX0FTU0VSVF9TSUdOX1QodHlwZSxyZWxvcCkgXAorICAgICAgICBMWk9DSEtfQVNTRVJUKCBMWk9fU1RBVElDX0NBU1QodHlwZSwgLTEpICByZWxvcCAgTFpPX1NUQVRJQ19DQVNUKHR5cGUsIDApKSBcCisgICAgICAgIExaT0NIS19BU1NFUlQoIExaT19TVEFUSUNfQ0FTVCh0eXBlLCB+TFpPX1NUQVRJQ19DQVNUKHR5cGUsIDApKSByZWxvcCAgTFpPX1NUQVRJQ19DQVNUKHR5cGUsIDApKSBcCisgICAgICAgIExaT0NIS19BU1NFUlQoIExaT19TVEFUSUNfQ0FTVCh0eXBlLCB+TFpPX1NUQVRJQ19DQVNUKHR5cGUsIDApKSA9PSAgICAgTFpPX1NUQVRJQ19DQVNUKHR5cGUsIC0xKSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT0NIS19BU1NFUlRfSVNfU0lHTkVEX1QpCisjICBkZWZpbmUgTFpPQ0hLX0FTU0VSVF9JU19TSUdORURfVCh0eXBlKSAgICAgICBMWk9DSEtfQVNTRVJUX1NJR05fVCh0eXBlLDwpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9DSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QpCisjICBpZiAoTFpPX0JST0tFTl9JTlRFR1JBTF9QUk9NT1RJT04pCisjICAgIGRlZmluZSBMWk9DSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QodHlwZSkgXAorICAgICAgICBMWk9DSEtfQVNTRVJUKCBMWk9fU1RBVElDX0NBU1QodHlwZSwgLTEpID4gTFpPX1NUQVRJQ19DQVNUKHR5cGUsIDApICkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVCh0eXBlKSAgIExaT0NIS19BU1NFUlRfU0lHTl9UKHR5cGUsPikKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKExaT0NIS19DRkdfUEVEQU5USUMpCisjaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDU1MCkgJiYgKF9fQk9STEFORENfXyA8IDB4MDU2MCkpCisjICBwcmFnbWEgb3B0aW9uIHB1c2ggLXctODA1NQorI2VsaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDUzMCkgJiYgKF9fQk9STEFORENfXyA8IDB4MDU1MCkpCisjICBwcmFnbWEgb3B0aW9uIHB1c2ggLXctb3NoCisjZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fMHhmZmZmZmZmZkwgLSBMWk9fVUlOVDMyX0MoNDI5NDk2NzI5NCkgIT0gMSkKKyMgIGVycm9yICJwcmVwcm9jZXNzb3IgZXJyb3IiCisjZW5kaWYKKyNpZiAoTFpPXzB4ZmZmZmZmZmZMIC0gTFpPX1VJTlQzMl9DKDB4ZmZmZmZmZmQpICE9IDIpCisjICBlcnJvciAicHJlcHJvY2Vzc29yIGVycm9yIgorI2VuZGlmCisjaWYgKzAKKyMgIGVycm9yICJwcmVwcm9jZXNzb3IgZXJyb3IiCisjZW5kaWYKKyNpZiAtMAorIyAgZXJyb3IgInByZXByb2Nlc3NvciBlcnJvciIKKyNlbmRpZgorI2lmICswICE9IDAKKyMgIGVycm9yICJwcmVwcm9jZXNzb3IgZXJyb3IiCisjZW5kaWYKKyNpZiAtMCAhPSAwCisjICBlcnJvciAicHJlcHJvY2Vzc29yIGVycm9yIgorI2VuZGlmCisjZGVmaW5lIExaT0NIS19WQUwgIDEKKyNkZWZpbmUgTFpPQ0hLX1RNUDEgTFpPQ0hLX1ZBTAorI3VuZGVmIExaT0NIS19WQUwKKyNkZWZpbmUgTFpPQ0hLX1ZBTCAgMgorI2RlZmluZSBMWk9DSEtfVE1QMiBMWk9DSEtfVkFMCisjaWYgKExaT0NIS19UTVAxICE9IDIpCisjICBlcnJvciAicHJlcHJvY2Vzc29yIGVycm9yIDNhIgorI2VuZGlmCisjaWYgKExaT0NIS19UTVAyICE9IDIpCisjICBlcnJvciAicHJlcHJvY2Vzc29yIGVycm9yIDNiIgorI2VuZGlmCisjdW5kZWYgTFpPQ0hLX1ZBTAorI2lmIChMWk9DSEtfVE1QMikKKyMgIGVycm9yICJwcmVwcm9jZXNzb3IgZXJyb3IgM2MiCisjZW5kaWYKKyNpZiAoTFpPQ0hLX1RNUDIgKyAwICE9IDApCisjICBlcnJvciAicHJlcHJvY2Vzc29yIGVycm9yIDNkIgorI2VuZGlmCisjdW5kZWYgTFpPQ0hLX1RNUDEKKyN1bmRlZiBMWk9DSEtfVE1QMgorI2lmIDAgfHwgZGVmaW5lZChMWk9DSEtfQ0ZHX1BFREFOVElDKQorIyAgaWYgKExaT19BUkNIX01JUFMpICYmIGRlZmluZWQoX01JUFNfU1pJTlQpCisgICAgTFpPQ0hLX0FTU0VSVCgoX01JUFNfU1pJTlQpID09IDggKiBzaXplb2YoaW50KSkKKyMgIGVuZGlmCisjICBpZiAoTFpPX0FSQ0hfTUlQUykgJiYgZGVmaW5lZChfTUlQU19TWkxPTkcpCisgICAgTFpPQ0hLX0FTU0VSVCgoX01JUFNfU1pMT05HKSA9PSA4ICogc2l6ZW9mKGxvbmcpKQorIyAgZW5kaWYKKyMgIGlmIChMWk9fQVJDSF9NSVBTKSAmJiBkZWZpbmVkKF9NSVBTX1NaUFRSKQorICAgIExaT0NIS19BU1NFUlQoKF9NSVBTX1NaUFRSKSA9PSA4ICogc2l6ZW9mKHZvaWQgKikpCisjICBlbmRpZgorI2VuZGlmCisgICAgTFpPQ0hLX0FTU0VSVCgxID09IDEpCisgICAgTFpPQ0hLX0FTU0VSVChfX0xaT19NQVNLX0dFTigxdSwxKSA9PSAxKQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oMXUsMikgPT0gMykKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDF1LDMpID09IDcpCisgICAgTFpPQ0hLX0FTU0VSVChfX0xaT19NQVNLX0dFTigxdSw4KSA9PSAyNTUpCisjaWYgKFNJWkVPRl9JTlQgPj0gMikKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDEsMTUpID09IDMyNzY3KQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oMXUsMTYpID09IDB4ZmZmZlUpCisgICAgTFpPQ0hLX0FTU0VSVChfX0xaT19NQVNLX0dFTigwdSwxNikgPT0gMHUpCisjZWxzZQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oMXVsLDE2KSA9PSAweGZmZmZVTCkKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDB1bCwxNikgPT0gMHVsKQorI2VuZGlmCisjaWYgKFNJWkVPRl9JTlQgPj0gNCkKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDEsMzEpID09IDIxNDc0ODM2NDcpCisgICAgTFpPQ0hLX0FTU0VSVChfX0xaT19NQVNLX0dFTigxdSwzMikgPT0gMHhmZmZmZmZmZlUpCisgICAgTFpPQ0hLX0FTU0VSVChfX0xaT19NQVNLX0dFTigwdSwzMikgPT0gMHUpCisjZW5kaWYKKyNpZiAoU0laRU9GX0xPTkcgPj0gNCkKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDF1bCwzMikgPT0gMHhmZmZmZmZmZlVMKQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oMHVsLDMyKSA9PSAwdWwpCisjZW5kaWYKKyNpZiAoU0laRU9GX0xPTkcgPj0gOCkKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDF1bCw2NCkgPT0gMHhmZmZmZmZmZmZmZmZmZmZmVUwpCisgICAgTFpPQ0hLX0FTU0VSVChfX0xaT19NQVNLX0dFTigwdWwsNjQpID09IDB1bCkKKyNlbmRpZgorI2lmICEoTFpPX0JST0tFTl9JTlRFR1JBTF9QUk9NT1RJT04pCisgICAgTFpPQ0hLX0FTU0VSVChfX0xaT19NQVNLX0dFTigxdSxTSVpFT0ZfSU5UKjgpID09IH4wdSkKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDF1bCxTSVpFT0ZfTE9ORyo4KSA9PSB+MHVsKQorI2VuZGlmCisjaWYgMQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oMCwwKSA9PSAwKQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oMSwwKSA9PSAwKQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oMiwwKSA9PSAwKQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oNCwwKSA9PSAwKQorI2VuZGlmCisjaWYgMQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oMiwxKSA9PSAyKQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oNCwxKSA9PSA0KQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oOCwxKSA9PSA4KQorICAgIExaT0NIS19BU1NFUlQoX19MWk9fTUFTS19HRU4oMiwyKSA9PSAyKzQpCisgICAgTFpPQ0hLX0FTU0VSVChfX0xaT19NQVNLX0dFTig0LDIpID09IDQrOCkKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDgsMikgPT0gOCsxNikKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDIsMykgPT0gMis0KzgpCisgICAgTFpPQ0hLX0FTU0VSVChfX0xaT19NQVNLX0dFTig0LDMpID09IDQrOCsxNikKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDgsMykgPT0gOCsxNiszMikKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDcsMSkgPT0gNykKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDcsMikgPT0gNysxNCkKKyAgICBMWk9DSEtfQVNTRVJUKF9fTFpPX01BU0tfR0VOKDcsMykgPT0gNysxNCsyOCkKKyNlbmRpZgorI2lmICEoTFpPX0JST0tFTl9TSUdORURfUklHSFRfU0hJRlQpCisgICAgTFpPQ0hLX0FTU0VSVCgoKC0xKSA+PiA3KSA9PSAtMSkKKyNlbmRpZgorICAgIExaT0NIS19BU1NFUlQoKCgxKSAgPj4gNykgPT0gMCkKKyNpZiAoTFpPX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA5MDApKQorIyAgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDEwMjUpCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUKCh+MGwgICYgfjApICA9PSB+MGwpCisgICAgTFpPQ0hLX0FTU0VSVCgofjBsICAmIH4wdSkgPT0gfjB1KQorICAgIExaT0NIS19BU1NFUlQoKH4wdWwgJiB+MCkgID09IH4wdWwpCisgICAgTFpPQ0hLX0FTU0VSVCgofjB1bCAmIH4wdSkgPT0gfjB1KQorI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIChfX1RVUkJPQ19fIDwgMHgwMTUwKQorI2VsaWYgKFNJWkVPRl9JTlQgPT0gMikKKyAgICBMWk9DSEtfQVNTRVJUKCh+MGwgICYgfjB1KSA9PSAweGZmZmZVKQorICAgIExaT0NIS19BU1NFUlQoKH4wdWwgJiB+MHUpID09IDB4ZmZmZlUpCisjZWxpZiAoU0laRU9GX0lOVCA9PSA0KQorICAgIExaT0NIS19BU1NFUlQoKH4wbCAgJiB+MHUpID09IDB4ZmZmZmZmZmZVKQorICAgIExaT0NIS19BU1NFUlQoKH4wdWwgJiB+MHUpID09IDB4ZmZmZmZmZmZVKQorI2VuZGlmCisjaWYgKExaT19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gOTAwKSkKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorICAgIExaT0NIS19BU1NFUlRfSVNfU0lHTkVEX1Qoc2lnbmVkIGNoYXIpCisgICAgTFpPQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKHVuc2lnbmVkIGNoYXIpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yoc2lnbmVkIGNoYXIpID09IHNpemVvZihjaGFyKSkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZih1bnNpZ25lZCBjaGFyKSA9PSBzaXplb2YoY2hhcikpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoY2hhcikgPT0gMSkKKyNpZiAoTFpPX0NDX0NJTExZKSAmJiAoIWRlZmluZWQoX19DSUxMWV9fKSB8fCAoX19DSUxMWV9fIDwgMHgwMTAzMDJMKSkKKyNlbHNlCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoY2hhcikgPT0gc2l6ZW9mKExaT19TVEFUSUNfQ0FTVChjaGFyLCAwKSkpCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKCdcMCcpID09IHNpemVvZihjaGFyKSkKKyNlbHNlCisjICBpZiAoTFpPX0NDX0RNQykKKyMgIGVsc2UKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZignXDAnKSA9PSBzaXplb2YoaW50KSkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbHpvX2FsaWdub2YpCisgICAgTFpPQ0hLX0FTU0VSVChfX2x6b19hbGlnbm9mKGNoYXIpID09IDEpCisgICAgTFpPQ0hLX0FTU0VSVChfX2x6b19hbGlnbm9mKHNpZ25lZCBjaGFyKSA9PSAxKQorICAgIExaT0NIS19BU1NFUlQoX19sem9fYWxpZ25vZih1bnNpZ25lZCBjaGFyKSA9PSAxKQorI2lmIGRlZmluZWQobHpvX2ludDE2ZV90KQorICAgIExaT0NIS19BU1NFUlQoX19sem9fYWxpZ25vZihsem9faW50MTZlX3QpID49IDEpCisgICAgTFpPQ0hLX0FTU0VSVChfX2x6b19hbGlnbm9mKGx6b19pbnQxNmVfdCkgPD0gMikKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorICAgIExaT0NIS19BU1NFUlQoX19sem9fYWxpZ25vZihsem9faW50MzJlX3QpID49IDEpCisgICAgTFpPQ0hLX0FTU0VSVChfX2x6b19hbGlnbm9mKGx6b19pbnQzMmVfdCkgPD0gNCkKKyNlbmRpZgorI2VuZGlmCisgICAgTFpPQ0hLX0FTU0VSVF9JU19TSUdORURfVChzaG9ydCkKKyAgICBMWk9DSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QodW5zaWduZWQgc2hvcnQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yoc2hvcnQpID09IHNpemVvZih1bnNpZ25lZCBzaG9ydCkpCisjaWYgIShMWk9fQUJJX0k4TFAxNikKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihzaG9ydCkgPj0gMikKKyNlbmRpZgorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHNob3J0KSA+PSBzaXplb2YoY2hhcikpCisjaWYgKExaT19DQ19DSUxMWSkgJiYgKCFkZWZpbmVkKF9fQ0lMTFlfXykgfHwgKF9fQ0lMTFlfXyA8IDB4MDEwMzAyTCkpCisjZWxzZQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHNob3J0KSA9PSBzaXplb2YoTFpPX1NUQVRJQ19DQVNUKHNob3J0LCAwKSkpCisjZW5kaWYKKyNpZiAoU0laRU9GX1NIT1JUID4gMCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihzaG9ydCkgPT0gU0laRU9GX1NIT1JUKQorI2VuZGlmCisgICAgTFpPQ0hLX0FTU0VSVF9JU19TSUdORURfVChpbnQpCisgICAgTFpPQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKHVuc2lnbmVkIGludCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihpbnQpID09IHNpemVvZih1bnNpZ25lZCBpbnQpKQorI2lmICEoTFpPX0FCSV9JOExQMTYpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoaW50KSA+PSAyKQorI2VuZGlmCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoaW50KSA+PSBzaXplb2Yoc2hvcnQpKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKDApKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKExaT19TVEFUSUNfQ0FTVChpbnQsIDApKSkKKyNpZiAoU0laRU9GX0lOVCA+IDApCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoaW50KSA9PSBTSVpFT0ZfSU5UKQorI2VuZGlmCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoMCkgPT0gc2l6ZW9mKGludCkpCisgICAgTFpPQ0hLX0FTU0VSVF9JU19TSUdORURfVChsb25nKQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVCh1bnNpZ25lZCBsb25nKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGxvbmcpID09IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKyNpZiAhKExaT19BQklfSThMUDE2KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGxvbmcpID49IDQpCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsb25nKSA+PSBzaXplb2YoaW50KSkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsb25nKSA9PSBzaXplb2YoMEwpKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGxvbmcpID09IHNpemVvZihMWk9fU1RBVElDX0NBU1QobG9uZywgMCkpKQorI2lmIChTSVpFT0ZfTE9ORyA+IDApCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobG9uZykgPT0gU0laRU9GX0xPTkcpCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZigwTCkgPT0gc2l6ZW9mKGxvbmcpKQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChzaXplX3QpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA+PSBzaXplb2YoaW50KSkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihzaXplX3QpID09IHNpemVvZihzaXplb2YoMCkpKQorI2lmIChTSVpFT0ZfU0laRV9UID4gMCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihzaXplX3QpID09IFNJWkVPRl9TSVpFX1QpCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUX0lTX1NJR05FRF9UKHB0cmRpZmZfdCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID49IHNpemVvZihpbnQpKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHB0cmRpZmZfdCkgPj0gc2l6ZW9mKHNpemVfdCkpCisjaWYgIShMWk9fQlJPS0VOX1NJWkVPRikKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID09IHNpemVvZihMWk9fU1RBVElDX0NBU1QoY2hhciosIDApIC0gTFpPX1NUQVRJQ19DQVNUKGNoYXIqLCAwKSkpCisjIGlmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyAgICBMWk9DSEtfQVNTRVJUKDQgPT0gc2l6ZW9mKExaT19TVEFUSUNfQ0FTVChjaGFyIF9faHVnZSosIDApIC0gTFpPX1NUQVRJQ19DQVNUKGNoYXIgX19odWdlKiwgMCkpKQorIyBlbmRpZgorI2VuZGlmCisjaWYgKFNJWkVPRl9QVFJESUZGX1QgPiAwKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHB0cmRpZmZfdCkgPT0gU0laRU9GX1BUUkRJRkZfVCkKKyNlbmRpZgorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHZvaWQqKSA+PSBzaXplb2YoY2hhciopKQorI2lmIChTSVpFT0ZfVk9JRF9QID4gMCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZih2b2lkKikgPT0gU0laRU9GX1ZPSURfUCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihjaGFyKikgPT0gU0laRU9GX1ZPSURfUCkKKyNlbmRpZgorI2lmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyAgICBMWk9DSEtfQVNTRVJUKDQgPT0gc2l6ZW9mKHZvaWQgX19odWdlKikpCisgICAgTFpPQ0hLX0FTU0VSVCg0ID09IHNpemVvZihjaGFyIF9faHVnZSopKQorI2VuZGlmCisjaWYgKExaT19BQklfSThMUDE2KQorICAgIExaT0NIS19BU1NFUlQoKCgoMXUgIDw8ICA3KSArIDEpID4+ICA3KSA9PSAxKQorICAgIExaT0NIS19BU1NFUlQoKCgoMXVsIDw8IDE1KSArIDEpID4+IDE1KSA9PSAxKQorI2Vsc2UKKyAgICBMWk9DSEtfQVNTRVJUKCgoKDF1ICA8PCAxNSkgKyAxKSA+PiAxNSkgPT0gMSkKKyAgICBMWk9DSEtfQVNTRVJUKCgoKDF1bCA8PCAzMSkgKyAxKSA+PiAzMSkgPT0gMSkKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPQ0hLX0NGR19QRURBTlRJQykKKyNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiAoX19UVVJCT0NfXyA8IDB4MDE1MCkKKyNlbHNlCisgICAgTFpPQ0hLX0FTU0VSVCgoMSAgIDw8ICg4KlNJWkVPRl9JTlQtMSkpIDwgMCkKKyNlbmRpZgorI2VuZGlmCisgICAgTFpPQ0hLX0FTU0VSVCgoMXUgIDw8ICg4KlNJWkVPRl9JTlQtMSkpID4gMCkKKyNpZiBkZWZpbmVkKExaT0NIS19DRkdfUEVEQU5USUMpCisgICAgTFpPQ0hLX0FTU0VSVCgoMWwgIDw8ICg4KlNJWkVPRl9MT05HLTEpKSA8IDApCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUKCgxdWwgPDwgKDgqU0laRU9GX0xPTkctMSkpID4gMCkKKyNpZiBkZWZpbmVkKGx6b19pbnQxNmVfdCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50MTZlX3QpID09IDIpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludDE2ZV90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQxNkVfVCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9fdWludDE2ZV90KSA9PSAyKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQxNmVfdCkgPT0gc2l6ZW9mKGx6b191aW50MTZlX3QpKQorICAgIExaT0NIS19BU1NFUlRfSVNfU0lHTkVEX1QobHpvX2ludDE2ZV90KQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludDE2ZV90KQorI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIChfX1RVUkJPQ19fIDwgMHgwMTUwKQorI2Vsc2UKKyAgICBMWk9DSEtfQVNTRVJUKChMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQxNmVfdCwgKH5MWk9fU1RBVElDX0NBU1QobHpvX3VpbnQxNmVfdCwwdWwpKSkgPj4gMTUpID09IDEpCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUKCBMWk9fU1RBVElDX0NBU1QobHpvX2ludDE2ZV90LCAoMSArIH5MWk9fU1RBVElDX0NBU1QobHpvX2ludDE2ZV90LCAwKSkpID09IDApCisjaWYgZGVmaW5lZChMWk9DSEtfQ0ZHX1BFREFOVElDKQorICAgIExaT0NIS19BU1NFUlQoIExaT19TVEFUSUNfQ0FTVChsem9fdWludDE2ZV90LCAoMSArIH5MWk9fU1RBVElDX0NBU1QobHpvX3VpbnQxNmVfdCwgMCkpKSA9PSAwKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGx6b19pbnQzMmVfdCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50MzJlX3QpID09IDQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludDMyZV90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQzMkVfVCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9fdWludDMyZV90KSA9PSA0KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQzMmVfdCkgPT0gc2l6ZW9mKGx6b191aW50MzJlX3QpKQorICAgIExaT0NIS19BU1NFUlRfSVNfU0lHTkVEX1QobHpvX2ludDMyZV90KQorICAgIExaT0NIS19BU1NFUlQoKCgoIExaT19TVEFUSUNfQ0FTVChsem9faW50MzJlX3QsIDEpIDw8IDMwKSArIDEpID4+IDMwKSA9PSAxKQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludDMyZV90KQorICAgIExaT0NIS19BU1NFUlQoKCgoIExaT19TVEFUSUNfQ0FTVChsem9fdWludDMyZV90LCAxKSA8PCAzMSkgKyAxKSA+PiAzMSkgPT0gMSkKKyAgICBMWk9DSEtfQVNTRVJUKChMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmVfdCwgKH5MWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmVfdCwgMHVsKSkpID4+IDMxKSA9PSAxKQorICAgIExaT0NIS19BU1NFUlQoIExaT19TVEFUSUNfQ0FTVChsem9faW50MzJlX3QsICgxICsgfkxaT19TVEFUSUNfQ0FTVChsem9faW50MzJlX3QsIDApKSkgPT0gMCkKKyNpZiBkZWZpbmVkKExaT0NIS19DRkdfUEVEQU5USUMpCisgICAgTFpPQ0hLX0FTU0VSVCggTFpPX1NUQVRJQ19DQVNUKGx6b191aW50MzJlX3QsICgxICsgfkxaT19TVEFUSUNfQ0FTVChsem9fdWludDMyZV90LCAwKSkpID09IDApCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQzMmxfdCkgPj0gc2l6ZW9mKGx6b19pbnQzMmVfdCkpCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50MzJsX3QpID49IDQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludDMybF90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQzMkxfVCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9fdWludDMybF90KSA+PSA0KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQzMmxfdCkgPT0gc2l6ZW9mKGx6b191aW50MzJsX3QpKQorICAgIExaT0NIS19BU1NFUlRfSVNfU0lHTkVEX1QobHpvX2ludDMybF90KQorICAgIExaT0NIS19BU1NFUlQoKCgoIExaT19TVEFUSUNfQ0FTVChsem9faW50MzJsX3QsIDEpIDw8IDMwKSArIDEpID4+IDMwKSA9PSAxKQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludDMybF90KQorICAgIExaT0NIS19BU1NFUlQoKCgoIExaT19TVEFUSUNfQ0FTVChsem9fdWludDMybF90LCAxKSA8PCAzMSkgKyAxKSA+PiAzMSkgPT0gMSkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50MzJmX3QpID49IHNpemVvZihpbnQpKQorI2lmIGRlZmluZWQobHpvX2ludDMyZV90KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQzMmZfdCkgPj0gc2l6ZW9mKGx6b19pbnQzMmVfdCkpCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50MzJmX3QpID49IHNpemVvZihsem9faW50MzJsX3QpKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQzMmZfdCkgPj0gNCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50MzJmX3QpID49IHNpemVvZihsem9faW50MzJsX3QpKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQzMmZfdCkgPT0gTFpPX1NJWkVPRl9MWk9fSU5UMzJGX1QpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX3VpbnQzMmZfdCkgPj0gNCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9fdWludDMyZl90KSA+PSBzaXplb2YobHpvX3VpbnQzMmxfdCkpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludDMyZl90KSA9PSBzaXplb2YobHpvX3VpbnQzMmZfdCkpCisgICAgTFpPQ0hLX0FTU0VSVF9JU19TSUdORURfVChsem9faW50MzJmX3QpCisgICAgTFpPQ0hLX0FTU0VSVCgoKCggTFpPX1NUQVRJQ19DQVNUKGx6b19pbnQzMmZfdCwgMSkgPDwgMzApICsgMSkgPj4gMzApID09IDEpCisgICAgTFpPQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKGx6b191aW50MzJmX3QpCisgICAgTFpPQ0hLX0FTU0VSVCgoKCggTFpPX1NUQVRJQ19DQVNUKGx6b191aW50MzJmX3QsIDEpIDw8IDMxKSArIDEpID4+IDMxKSA9PSAxKQorI2lmIGRlZmluZWQobHpvX2ludDY0ZV90KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQ2NGVfdCkgPT0gOCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50NjRlX3QpID09IExaT19TSVpFT0ZfTFpPX0lOVDY0RV9UKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b191aW50NjRlX3QpID09IDgpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludDY0ZV90KSA9PSBzaXplb2YobHpvX3VpbnQ2NGVfdCkpCisgICAgTFpPQ0hLX0FTU0VSVF9JU19TSUdORURfVChsem9faW50NjRlX3QpCisjaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fIDwgMHgwNTMwKSkKKyNlbHNlCisgICAgTFpPQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKGx6b191aW50NjRlX3QpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorI2lmIGRlZmluZWQobHpvX2ludDY0ZV90KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQ2NGxfdCkgPj0gc2l6ZW9mKGx6b19pbnQ2NGVfdCkpCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50NjRsX3QpID49IDgpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludDY0bF90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQ2NExfVCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9fdWludDY0bF90KSA+PSA4KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQ2NGxfdCkgPT0gc2l6ZW9mKGx6b191aW50NjRsX3QpKQorICAgIExaT0NIS19BU1NFUlRfSVNfU0lHTkVEX1QobHpvX2ludDY0bF90KQorICAgIExaT0NIS19BU1NFUlQoKCgoIExaT19TVEFUSUNfQ0FTVChsem9faW50NjRsX3QsIDEpIDw8IDYyKSArIDEpID4+IDYyKSA9PSAxKQorICAgIExaT0NIS19BU1NFUlQoKCgoIExaT19JTlQ2NF9DKDEpIDw8IDYyKSArIDEpID4+IDYyKSA9PSAxKQorI2lmIChMWk9fQ0NfQk9STEFOREMgJiYgKF9fQk9STEFORENfXyA8IDB4MDUzMCkpCisjZWxzZQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludDY0bF90KQorICAgIExaT0NIS19BU1NFUlQoTFpPX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSAgICAgPiAwKQorI2VuZGlmCisgICAgTFpPQ0hLX0FTU0VSVCgoKCggTFpPX1NUQVRJQ19DQVNUKGx6b191aW50NjRsX3QsIDEpIDw8IDYzKSArIDEpID4+IDYzKSA9PSAxKQorICAgIExaT0NIS19BU1NFUlQoKCgoIExaT19VSU5UNjRfQygxKSA8PCA2MykgKyAxKSA+PiA2MykgPT0gMSkKKyNpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjA2MDB1bCkpCisgICAgTFpPQ0hLX0FTU0VSVChMWk9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSAgICAgICA+IExaT19JTlQ2NF9DKDApKQorI2Vsc2UKKyAgICBMWk9DSEtfQVNTRVJUKExaT19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpICAgICAgID4gMCkKKyNlbmRpZgorICAgIExaT0NIS19BU1NFUlQoTFpPX0lOVDY0X0MoLTkyMjMzNzIwMzY4NTQ3NzU4MDcpIC0gMSAgPCAwKQorICAgIExaT0NIS19BU1NFUlQoIExaT19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpICUgTFpPX0lOVDMyX0MoMjE0NzQ4MzYyOSkgID09IDcyMSkKKyAgICBMWk9DSEtfQVNTRVJUKCBMWk9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSAlIExaT19JTlQzMl9DKDIxNDc0ODM2NDcpICA9PSAxKQorICAgIExaT0NIS19BU1NFUlQoTFpPX1VJTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpICUgTFpPX1VJTlQzMl9DKDIxNDc0ODM2MjkpID09IDcyMSkKKyAgICBMWk9DSEtfQVNTRVJUKExaT19VSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSAlIExaT19VSU5UMzJfQygyMTQ3NDgzNjQ3KSA9PSAxKQorI2VuZGlmCisjaWYgZGVmaW5lZChsem9faW50NjRmX3QpCisjaWYgZGVmaW5lZChsem9faW50NjRlX3QpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludDY0Zl90KSA+PSBzaXplb2YobHpvX2ludDY0ZV90KSkKKyNlbmRpZgorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQ2NGZfdCkgPj0gc2l6ZW9mKGx6b19pbnQ2NGxfdCkpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludDY0Zl90KSA+PSA4KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQ2NGZfdCkgPj0gc2l6ZW9mKGx6b19pbnQ2NGxfdCkpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludDY0Zl90KSA9PSBMWk9fU0laRU9GX0xaT19JTlQ2NEZfVCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9fdWludDY0Zl90KSA+PSA4KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b191aW50NjRmX3QpID49IHNpemVvZihsem9fdWludDY0bF90KSkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50NjRmX3QpID09IHNpemVvZihsem9fdWludDY0Zl90KSkKKyAgICBMWk9DSEtfQVNTRVJUX0lTX1NJR05FRF9UKGx6b19pbnQ2NGZfdCkKKyNpZiAoTFpPX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPCAweDA1MzApKQorI2Vsc2UKKyAgICBMWk9DSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QobHpvX3VpbnQ2NGZfdCkKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19MWk9fSU5UUFRSX1RfSVNfUE9JTlRFUikKKyAgICBMWk9DSEtfQVNTRVJUX0lTX1NJR05FRF9UKGx6b19pbnRwdHJfdCkKKyAgICBMWk9DSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QobHpvX3VpbnRwdHJfdCkKKyNlbmRpZgorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnRwdHJfdCkgPj0gc2l6ZW9mKHZvaWQgKikpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludHB0cl90KSA9PSBMWk9fU0laRU9GX0xaT19JTlRQVFJfVCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50cHRyX3QpID09IHNpemVvZihsem9fdWludHB0cl90KSkKKyNpZiBkZWZpbmVkKGx6b193b3JkX3QpCisgICAgTFpPQ0hLX0FTU0VSVChMWk9fV09SRFNJWkUgPT0gTFpPX1NJWkVPRl9MWk9fV09SRF9UKQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fd29yZF90KQorICAgIExaT0NIS19BU1NFUlRfSVNfU0lHTkVEX1QobHpvX3N3b3JkX3QpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX3dvcmRfdCkgPT0gTFpPX1NJWkVPRl9MWk9fV09SRF9UKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b193b3JkX3QpID09IHNpemVvZihsem9fc3dvcmRfdCkpCisjZW5kaWYKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50OF90KSA9PSAxKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b191aW50OF90KSA9PSAxKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnQ4X3QpID09IHNpemVvZihsem9fdWludDhfdCkpCisgICAgTFpPQ0hLX0FTU0VSVF9JU19TSUdORURfVChsem9faW50OF90KQorICAgIExaT0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChsem9fdWludDhfdCkKKyNpZiBkZWZpbmVkKExaT19JTlQxNl9DKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKExaT19JTlQxNl9DKDApKSA+PSAyKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKExaT19VSU5UMTZfQygwKSkgPj0gMikKKyAgICBMWk9DSEtfQVNTRVJUKChMWk9fVUlOVDE2X0MoMHhmZmZmKSA+PiAxNSkgPT0gMSkKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX0lOVDMyX0MpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoTFpPX0lOVDMyX0MoMCkpID49IDQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoTFpPX1VJTlQzMl9DKDApKSA+PSA0KQorICAgIExaT0NIS19BU1NFUlQoKExaT19VSU5UMzJfQygweGZmZmZmZmZmKSA+PiAzMSkgPT0gMSkKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX0lOVDY0X0MpCisjaWYgKExaT19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fIDwgMHgwNTYwKSkKKyNlbHNlCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoTFpPX0lOVDY0X0MoMCkpID49IDgpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoTFpPX1VJTlQ2NF9DKDApKSA+PSA4KQorI2VuZGlmCisgICAgTFpPQ0hLX0FTU0VSVCgoTFpPX1VJTlQ2NF9DKDB4ZmZmZmZmZmZmZmZmZmZmZikgPj4gNjMpID09IDEpCisgICAgTFpPQ0hLX0FTU0VSVCgoTFpPX1VJTlQ2NF9DKDB4ZmZmZmZmZmZmZmZmZmZmZikgJiB+MCkgID09IExaT19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpKQorICAgIExaT0NIS19BU1NFUlQoKExaT19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpICYgfjBsKSA9PSBMWk9fVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSkKKyNpZiAoU0laRU9GX0lOVCA9PSA0KQorIyBpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjAwMDB1bCkpCisjIGVsc2UKKyAgICBMWk9DSEtfQVNTRVJUKChMWk9fVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSAmICh+MHUrMHUpKSA9PSAweGZmZmZmZmZmdSkKKyMgZW5kaWYKKyNlbmRpZgorI2lmIChTSVpFT0ZfTE9ORyA9PSA0KQorIyBpZiAoTFpPX0NDX0dOVUMgJiYgKExaT19DQ19HTlVDIDwgMHgwMjAwMDB1bCkpCisjIGVsc2UKKyAgICBMWk9DSEtfQVNTRVJUKChMWk9fVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSAmICh+MHVsKzB1bCkpID09IDB4ZmZmZmZmZmZ1bCkKKyMgZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgKExaT19NTV9USU5ZIHx8IExaT19NTV9TTUFMTCB8fCBMWk9fTU1fTUVESVVNKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHZvaWQqKSA9PSAyKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHB0cmRpZmZfdCkgPT0gMikKKyNlbGlmIChMWk9fTU1fQ09NUEFDVCB8fCBMWk9fTU1fTEFSR0UgfHwgTFpPX01NX0hVR0UpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yodm9pZCopID09IDQpCisjZW5kaWYKKyNpZiAoTFpPX01NX1RJTlkgfHwgTFpPX01NX1NNQUxMIHx8IExaT19NTV9DT01QQUNUKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHZvaWQgKCopKHZvaWQpKSA9PSAyKQorI2VsaWYgKExaT19NTV9NRURJVU0gfHwgTFpPX01NX0xBUkdFIHx8IExaT19NTV9IVUdFKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHZvaWQgKCopKHZvaWQpKSA9PSA0KQorI2VuZGlmCisjaWYgKExaT19BQklfSUxQMzIpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoaW50KSA9PSA0KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGxvbmcpID09IDQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yodm9pZCopID09IDQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YocHRyZGlmZl90KSA9PSBzaXplb2Yodm9pZCopKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50cHRyX3QpID09IHNpemVvZih2b2lkICopKQorI2VuZGlmCisjaWYgKExaT19BQklfSUxQNjQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YoaW50KSA9PSA4KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGxvbmcpID09IDgpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yodm9pZCopID09IDgpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YocHRyZGlmZl90KSA9PSBzaXplb2Yodm9pZCopKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50cHRyX3QpID09IHNpemVvZih2b2lkICopKQorI2VuZGlmCisjaWYgKExaT19BQklfSVAzMkw2NCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihpbnQpID09IDQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobG9uZykgPT0gOCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZih2b2lkKikgPT0gNCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID09IHNpemVvZih2b2lkKikpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA9PSBzaXplb2Yodm9pZCopKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnRwdHJfdCkgPT0gc2l6ZW9mKHZvaWQgKikpCisjZW5kaWYKKyNpZiAoTFpPX0FCSV9MTFA2NCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihpbnQpID09IDQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobG9uZykgPT0gNCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZih2b2lkKikgPT0gOCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID09IHNpemVvZih2b2lkKikpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA9PSBzaXplb2Yodm9pZCopKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnRwdHJfdCkgPT0gc2l6ZW9mKHZvaWQgKikpCisjZW5kaWYKKyNpZiAoTFpPX0FCSV9MUDMyKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gMikKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsb25nKSA9PSA0KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnRwdHJfdCkgPT0gc2l6ZW9mKHZvaWQgKikpCisjZW5kaWYKKyNpZiAoTFpPX0FCSV9MUDY0KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gNCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsb25nKSA9PSA4KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHZvaWQqKSA9PSA4KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHB0cmRpZmZfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihzaXplX3QpID09IHNpemVvZih2b2lkKikpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YobHpvX2ludHB0cl90KSA9PSBzaXplb2Yodm9pZCAqKSkKKyNlbmRpZgorI2lmIChMWk9fQVJDSF9JMDg2KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPT0gMikKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihsem9faW50cHRyX3QpID09IHNpemVvZih2b2lkICopKQorI2VsaWYgKExaT19BUkNIX0kzODYgfHwgTFpPX0FSQ0hfTTY4SykKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihzaXplX3QpID09IDQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2YocHRyZGlmZl90KSA9PSA0KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKGx6b19pbnRwdHJfdCkgPT0gc2l6ZW9mKHZvaWQgKikpCisjZW5kaWYKKyNpZiAoTFpPX09TX0RPUzMyIHx8IExaT19PU19PUzIgfHwgTFpPX09TX1dJTjMyKQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPT0gNCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID09IDQpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yodm9pZCAoKikodm9pZCkpID09IDQpCisjZWxpZiAoTFpPX09TX1dJTjY0KQorICAgIExaT0NIS19BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPT0gOCkKKyAgICBMWk9DSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID09IDgpCisgICAgTFpPQ0hLX0FTU0VSVChzaXplb2Yodm9pZCAoKikodm9pZCkpID09IDgpCisjZW5kaWYKKyNpZiAoTFpPX0NDX05EUEMpCisjZWxpZiAoU0laRU9GX0lOVCA+IDEpCisgICAgTFpPQ0hLX0FTU0VSVCggTFpPX1NUQVRJQ19DQVNUKGludCwgTFpPX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGNoYXIsIExaT19TVEFUSUNfQ0FTVChzaWduZWQgY2hhciwgLTEpKSkgPT0gMjU1KQorI2VuZGlmCisjaWYgZGVmaW5lZChMWk9DSEtfQ0ZHX1BFREFOVElDKQorI2lmIChMWk9fQ0NfS0VJTEMpCisjZWxpZiAoTFpPX0NDX05EUEMpCisjZWxpZiAhKExaT19CUk9LRU5fSU5URUdSQUxfUFJPTU9USU9OKSAmJiAoU0laRU9GX0lOVCA+IDEpCisgICAgTFpPQ0hLX0FTU0VSVCggKChMWk9fU1RBVElDX0NBU1QodW5zaWduZWQgY2hhciwgMTI4KSkgPDwgTFpPX1NUQVRJQ19DQVNUKGludCwgKDgqc2l6ZW9mKGludCktOCkpKSA8IDApCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPQ0hLX0NGR19QRURBTlRJQykKKyNpZiAoTFpPX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNTMwKSAmJiAoX19CT1JMQU5EQ19fIDwgMHgwNTYwKSkKKyMgIHByYWdtYSBvcHRpb24gcG9wCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChMWk9fV0FOVF9BQ0NMSUJfVkdFVCkKKyMgIHVuZGVmIExaT19XQU5UX0FDQ0xJQl9WR0VUCisjZGVmaW5lIF9fTFpPTElCX1ZHRVRfQ0hfSU5DTFVERUQgMQorI2lmICFkZWZpbmVkKExaT0xJQl9QVUJMSUMpCisjICBkZWZpbmUgTFpPTElCX1BVQkxJQyhyLGYpICAgICAgICAgICAgICAgIHIgX19MWk9MSUJfRlVOQ05BTUUoZikKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT0xJQl9QVUJMSUNfTk9JTkxJTkUpCisjICBpZiAhZGVmaW5lZChfX2x6b19ub2lubGluZSkKKyMgICAgZGVmaW5lIExaT0xJQl9QVUJMSUNfTk9JTkxJTkUocixmKSAgICAgciBfX0xaT0xJQl9GVU5DTkFNRShmKQorIyAgZWxpZiAoTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKSB8fCBMWk9fQ0NfTExWTSkKKyMgICAgZGVmaW5lIExaT0xJQl9QVUJMSUNfTk9JTkxJTkUocixmKSAgICAgX19sem9fbm9pbmxpbmUgX19hdHRyaWJ1dGVfXygoX191c2VkX18pKSByIF9fTFpPTElCX0ZVTkNOQU1FKGYpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9MSUJfUFVCTElDX05PSU5MSU5FKHIsZikgICAgIF9fbHpvX25vaW5saW5lIHIgX19MWk9MSUJfRlVOQ05BTUUoZikKKyMgIGVuZGlmCisjZW5kaWYKK2V4dGVybiB2b2lkKiB2b2xhdGlsZSBsem9fdmdldF9wdHJfXzsKKyNpZiAoTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKSB8fCBMWk9fQ0NfTExWTSkKK3ZvaWQqIHZvbGF0aWxlIF9fYXR0cmlidXRlX18oKF9fdXNlZF9fKSkgbHpvX3ZnZXRfcHRyX18gPSBMWk9fU1RBVElDX0NBU1Qodm9pZCAqLCAwKTsKKyNlbHNlCit2b2lkKiB2b2xhdGlsZSBsem9fdmdldF9wdHJfXyA9IExaT19TVEFUSUNfQ0FTVCh2b2lkICosIDApOworI2VuZGlmCisjaWZuZGVmIF9fTFpPTElCX1ZHRVRfQk9EWQorI2RlZmluZSBfX0xaT0xJQl9WR0VUX0JPRFkoVCkgXAorICAgIGlmIF9fbHpvX3VubGlrZWx5KGx6b192Z2V0X3B0cl9fKSB7IFwKKyAgICAgICAgdHlwZWRlZiBUIF9fbHpvX21heV9hbGlhcyBUVDsgXAorICAgICAgICB1bnNpZ25lZCBjaGFyIGU7IGV4cHIgJj0gMjU1OyBlID0gTFpPX1NUQVRJQ19DQVNUKHVuc2lnbmVkIGNoYXIsIGV4cHIpOyBcCisgICAgICAgICogTFpPX1NUQVRJQ19DQVNUKFRUICosIGx6b192Z2V0X3B0cl9fKSA9IHY7IFwKKyAgICAgICAgKiBMWk9fU1RBVElDX0NBU1QodW5zaWduZWQgY2hhciAqLCBsem9fdmdldF9wdHJfXykgPSBlOyBcCisgICAgICAgIHYgPSAqIExaT19TVEFUSUNfQ0FTVChUVCAqLCBsem9fdmdldF9wdHJfXyk7IFwKKyAgICB9IFwKKyAgICByZXR1cm4gdjsKKyNlbmRpZgorTFpPTElCX1BVQkxJQ19OT0lOTElORShzaG9ydCwgbHpvX3ZnZXRfc2hvcnQpIChzaG9ydCB2LCBpbnQgZXhwcikKK3sKKyAgICBfX0xaT0xJQl9WR0VUX0JPRFkoc2hvcnQpCit9CitMWk9MSUJfUFVCTElDX05PSU5MSU5FKGludCwgbHpvX3ZnZXRfaW50KSAoaW50IHYsIGludCBleHByKQoreworICAgIF9fTFpPTElCX1ZHRVRfQk9EWShpbnQpCit9CitMWk9MSUJfUFVCTElDX05PSU5MSU5FKGxvbmcsIGx6b192Z2V0X2xvbmcpIChsb25nIHYsIGludCBleHByKQoreworICAgIF9fTFpPTElCX1ZHRVRfQk9EWShsb25nKQorfQorI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorTFpPTElCX1BVQkxJQ19OT0lOTElORShsem9faW50NjRsX3QsIGx6b192Z2V0X2x6b19pbnQ2NGxfdCkgKGx6b19pbnQ2NGxfdCB2LCBpbnQgZXhwcikKK3sKKyAgICBfX0xaT0xJQl9WR0VUX0JPRFkobHpvX2ludDY0bF90KQorfQorI2VuZGlmCitMWk9MSUJfUFVCTElDX05PSU5MSU5FKGx6b19oc2l6ZV90LCBsem9fdmdldF9sem9faHNpemVfdCkgKGx6b19oc2l6ZV90IHYsIGludCBleHByKQoreworICAgIF9fTFpPTElCX1ZHRVRfQk9EWShsem9faHNpemVfdCkKK30KKyNpZiAhKExaT19DRkdfTk9fRE9VQkxFKQorTFpPTElCX1BVQkxJQ19OT0lOTElORShkb3VibGUsIGx6b192Z2V0X2RvdWJsZSkgKGRvdWJsZSB2LCBpbnQgZXhwcikKK3sKKyAgICBfX0xaT0xJQl9WR0VUX0JPRFkoZG91YmxlKQorfQorI2VuZGlmCitMWk9MSUJfUFVCTElDX05PSU5MSU5FKGx6b19odm9pZF9wLCBsem9fdmdldF9sem9faHZvaWRfcCkgKGx6b19odm9pZF9wIHYsIGludCBleHByKQoreworICAgIF9fTFpPTElCX1ZHRVRfQk9EWShsem9faHZvaWRfcCkKK30KKyNpZiAoTFpPX0FSQ0hfSTA4NiAmJiBMWk9fQ0NfVFVSQk9DICYmIChfX1RVUkJPQ19fID09IDB4MDI5NSkpICYmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorTFpPTElCX1BVQkxJQ19OT0lOTElORShsem9faHZvaWRfcCwgbHpvX3ZnZXRfbHpvX2h2b2lkX2NwKSAoY29uc3QgbHpvX2h2b2lkX3AgdnYsIGludCBleHByKQoreworICAgIGx6b19odm9pZF9wIHYgPSAobHpvX2h2b2lkX3ApIHZ2OworICAgIF9fTFpPTElCX1ZHRVRfQk9EWShsem9faHZvaWRfcCkKK30KKyNlbHNlCitMWk9MSUJfUFVCTElDX05PSU5MSU5FKGNvbnN0IGx6b19odm9pZF9wLCBsem9fdmdldF9sem9faHZvaWRfY3ApIChjb25zdCBsem9faHZvaWRfcCB2LCBpbnQgZXhwcikKK3sKKyAgICBfX0xaT0xJQl9WR0VUX0JPRFkoY29uc3QgbHpvX2h2b2lkX3ApCit9CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX1dBTlRfQUNDTElCX0hNRU1DUFkpCisjICB1bmRlZiBMWk9fV0FOVF9BQ0NMSUJfSE1FTUNQWQorI2RlZmluZSBfX0xaT0xJQl9ITUVNQ1BZX0NIX0lOQ0xVREVEIDEKKyNpZiAhZGVmaW5lZChMWk9MSUJfUFVCTElDKQorIyAgZGVmaW5lIExaT0xJQl9QVUJMSUMocixmKSAgICByIF9fTFpPTElCX0ZVTkNOQU1FKGYpCisjZW5kaWYKK0xaT0xJQl9QVUJMSUMoaW50LCBsem9faG1lbWNtcCkgKGNvbnN0IGx6b19odm9pZF9wIHMxLCBjb25zdCBsem9faHZvaWRfcCBzMiwgbHpvX2hzaXplX3QgbGVuKQoreworI2lmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikgfHwgIShIQVZFX01FTUNNUCkKKyAgICBjb25zdCBsem9faGJ5dGVfcCBwMSA9IExaT19TVEFUSUNfQ0FTVChjb25zdCBsem9faGJ5dGVfcCwgczEpOworICAgIGNvbnN0IGx6b19oYnl0ZV9wIHAyID0gTFpPX1NUQVRJQ19DQVNUKGNvbnN0IGx6b19oYnl0ZV9wLCBzMik7CisgICAgaWYgX19sem9fbGlrZWx5KGxlbiA+IDApIGRvCisgICAgeworICAgICAgICBpbnQgZCA9ICpwMSAtICpwMjsKKyAgICAgICAgaWYgKGQgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICBwMSsrOyBwMisrOworICAgIH0gd2hpbGUgX19sem9fbGlrZWx5KC0tbGVuID4gMCk7CisgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIHJldHVybiBtZW1jbXAoczEsIHMyLCBsZW4pOworI2VuZGlmCit9CitMWk9MSUJfUFVCTElDKGx6b19odm9pZF9wLCBsem9faG1lbWNweSkgKGx6b19odm9pZF9wIGRlc3QsIGNvbnN0IGx6b19odm9pZF9wIHNyYywgbHpvX2hzaXplX3QgbGVuKQoreworI2lmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikgfHwgIShIQVZFX01FTUNQWSkKKyAgICBsem9faGJ5dGVfcCBwMSA9IExaT19TVEFUSUNfQ0FTVChsem9faGJ5dGVfcCwgZGVzdCk7CisgICAgY29uc3QgbHpvX2hieXRlX3AgcDIgPSBMWk9fU1RBVElDX0NBU1QoY29uc3QgbHpvX2hieXRlX3AsIHNyYyk7CisgICAgaWYgKCEobGVuID4gMCkgfHwgcDEgPT0gcDIpCisgICAgICAgIHJldHVybiBkZXN0OworICAgIGRvCisgICAgICAgICpwMSsrID0gKnAyKys7CisgICAgd2hpbGUgX19sem9fbGlrZWx5KC0tbGVuID4gMCk7CisgICAgcmV0dXJuIGRlc3Q7CisjZWxzZQorICAgIHJldHVybiBtZW1jcHkoZGVzdCwgc3JjLCBsZW4pOworI2VuZGlmCit9CitMWk9MSUJfUFVCTElDKGx6b19odm9pZF9wLCBsem9faG1lbW1vdmUpIChsem9faHZvaWRfcCBkZXN0LCBjb25zdCBsem9faHZvaWRfcCBzcmMsIGx6b19oc2l6ZV90IGxlbikKK3sKKyNpZiAoTFpPX0hBVkVfTU1fSFVHRV9QVFIpIHx8ICEoSEFWRV9NRU1NT1ZFKQorICAgIGx6b19oYnl0ZV9wIHAxID0gTFpPX1NUQVRJQ19DQVNUKGx6b19oYnl0ZV9wLCBkZXN0KTsKKyAgICBjb25zdCBsem9faGJ5dGVfcCBwMiA9IExaT19TVEFUSUNfQ0FTVChjb25zdCBsem9faGJ5dGVfcCwgc3JjKTsKKyAgICBpZiAoIShsZW4gPiAwKSB8fCBwMSA9PSBwMikKKyAgICAgICAgcmV0dXJuIGRlc3Q7CisgICAgaWYgKHAxIDwgcDIpCisgICAgeworICAgICAgICBkbworICAgICAgICAgICAgKnAxKysgPSAqcDIrKzsKKyAgICAgICAgd2hpbGUgX19sem9fbGlrZWx5KC0tbGVuID4gMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHAxICs9IGxlbjsKKyAgICAgICAgcDIgKz0gbGVuOworICAgICAgICBkbworICAgICAgICAgICAgKi0tcDEgPSAqLS1wMjsKKyAgICAgICAgd2hpbGUgX19sem9fbGlrZWx5KC0tbGVuID4gMCk7CisgICAgfQorICAgIHJldHVybiBkZXN0OworI2Vsc2UKKyAgICByZXR1cm4gbWVtbW92ZShkZXN0LCBzcmMsIGxlbik7CisjZW5kaWYKK30KK0xaT0xJQl9QVUJMSUMobHpvX2h2b2lkX3AsIGx6b19obWVtc2V0KSAobHpvX2h2b2lkX3AgcywgaW50IGNjLCBsem9faHNpemVfdCBsZW4pCit7CisjaWYgKExaT19IQVZFX01NX0hVR0VfUFRSKSB8fCAhKEhBVkVfTUVNU0VUKQorICAgIGx6b19oYnl0ZV9wIHAgPSBMWk9fU1RBVElDX0NBU1QobHpvX2hieXRlX3AsIHMpOworICAgIHVuc2lnbmVkIGNoYXIgYyA9IExaT19JVFJVTkModW5zaWduZWQgY2hhciwgY2MpOworICAgIGlmIF9fbHpvX2xpa2VseShsZW4gPiAwKSBkbworICAgICAgICAqcCsrID0gYzsKKyAgICB3aGlsZSBfX2x6b19saWtlbHkoLS1sZW4gPiAwKTsKKyAgICByZXR1cm4gczsKKyNlbHNlCisgICAgcmV0dXJuIG1lbXNldChzLCBjYywgbGVuKTsKKyNlbmRpZgorfQorI2VuZGlmCisjaWYgZGVmaW5lZChMWk9fV0FOVF9BQ0NMSUJfUkFORCkKKyMgIHVuZGVmIExaT19XQU5UX0FDQ0xJQl9SQU5ECisjZGVmaW5lIF9fTFpPTElCX1JBTkRfQ0hfSU5DTFVERUQgMQorI2lmICFkZWZpbmVkKExaT0xJQl9QVUJMSUMpCisjICBkZWZpbmUgTFpPTElCX1BVQkxJQyhyLGYpICAgIHIgX19MWk9MSUJfRlVOQ05BTUUoZikKKyNlbmRpZgorTFpPTElCX1BVQkxJQyh2b2lkLCBsem9fc3JhbmQzMSkgKGx6b19yYW5kMzFfcCByLCBsem9fdWludDMybF90IHNlZWQpCit7CisgICAgci0+c2VlZCA9IHNlZWQgJiBMWk9fVUlOVDMyX0MoMHhmZmZmZmZmZik7Cit9CitMWk9MSUJfUFVCTElDKGx6b191aW50MzJsX3QsIGx6b19yYW5kMzEpIChsem9fcmFuZDMxX3AgcikKK3sKKyAgICByLT5zZWVkID0gci0+c2VlZCAqIExaT19VSU5UMzJfQygxMTAzNTE1MjQ1KSArIDEyMzQ1OworICAgIHItPnNlZWQgJj0gTFpPX1VJTlQzMl9DKDB4N2ZmZmZmZmYpOworICAgIHJldHVybiByLT5zZWVkOworfQorI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorTFpPTElCX1BVQkxJQyh2b2lkLCBsem9fc3JhbmQ0OCkgKGx6b19yYW5kNDhfcCByLCBsem9fdWludDMybF90IHNlZWQpCit7CisgICAgci0+c2VlZCA9IHNlZWQgJiBMWk9fVUlOVDMyX0MoMHhmZmZmZmZmZik7CisgICAgci0+c2VlZCA8PD0gMTY7IHItPnNlZWQgfD0gMHgzMzBlOworfQorTFpPTElCX1BVQkxJQyhsem9fdWludDMybF90LCBsem9fcmFuZDQ4KSAobHpvX3JhbmQ0OF9wIHIpCit7CisgICAgbHpvX3VpbnQ2NGxfdCBhOworICAgIHItPnNlZWQgPSByLT5zZWVkICogTFpPX1VJTlQ2NF9DKDI1MjE0OTAzOTE3KSArIDExOworICAgIHItPnNlZWQgJj0gTFpPX1VJTlQ2NF9DKDB4ZmZmZmZmZmZmZmZmKTsKKyAgICBhID0gci0+c2VlZCA+PiAxNzsKKyAgICByZXR1cm4gTFpPX1NUQVRJQ19DQVNUKGx6b191aW50MzJsX3QsIGEpOworfQorTFpPTElCX1BVQkxJQyhsem9fdWludDMybF90LCBsem9fcmFuZDQ4X3IzMikgKGx6b19yYW5kNDhfcCByKQoreworICAgIGx6b191aW50NjRsX3QgYTsKKyAgICByLT5zZWVkID0gci0+c2VlZCAqIExaT19VSU5UNjRfQygyNTIxNDkwMzkxNykgKyAxMTsKKyAgICByLT5zZWVkICY9IExaT19VSU5UNjRfQygweGZmZmZmZmZmZmZmZik7CisgICAgYSA9IHItPnNlZWQgPj4gMTY7CisgICAgcmV0dXJuIExaT19TVEFUSUNfQ0FTVChsem9fdWludDMybF90LCBhKTsKK30KKyNlbmRpZgorI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorTFpPTElCX1BVQkxJQyh2b2lkLCBsem9fc3JhbmQ2NCkgKGx6b19yYW5kNjRfcCByLCBsem9fdWludDY0bF90IHNlZWQpCit7CisgICAgci0+c2VlZCA9IHNlZWQgJiBMWk9fVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKTsKK30KK0xaT0xJQl9QVUJMSUMobHpvX3VpbnQzMmxfdCwgbHpvX3JhbmQ2NCkgKGx6b19yYW5kNjRfcCByKQoreworICAgIGx6b191aW50NjRsX3QgYTsKKyAgICByLT5zZWVkID0gci0+c2VlZCAqIExaT19VSU5UNjRfQyg2MzY0MTM2MjIzODQ2NzkzMDA1KSArIDE7CisjaWYgKExaT19TSVpFT0ZfTFpPX0lOVDY0TF9UID4gOCkKKyAgICByLT5zZWVkICY9IExaT19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpOworI2VuZGlmCisgICAgYSA9IHItPnNlZWQgPj4gMzM7CisgICAgcmV0dXJuIExaT19TVEFUSUNfQ0FTVChsem9fdWludDMybF90LCBhKTsKK30KK0xaT0xJQl9QVUJMSUMobHpvX3VpbnQzMmxfdCwgbHpvX3JhbmQ2NF9yMzIpIChsem9fcmFuZDY0X3AgcikKK3sKKyAgICBsem9fdWludDY0bF90IGE7CisgICAgci0+c2VlZCA9IHItPnNlZWQgKiBMWk9fVUlOVDY0X0MoNjM2NDEzNjIyMzg0Njc5MzAwNSkgKyAxOworI2lmIChMWk9fU0laRU9GX0xaT19JTlQ2NExfVCA+IDgpCisgICAgci0+c2VlZCAmPSBMWk9fVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKTsKKyNlbmRpZgorICAgIGEgPSByLT5zZWVkID4+IDMyOworICAgIHJldHVybiBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmxfdCwgYSk7Cit9CisjZW5kaWYKK0xaT0xJQl9QVUJMSUModm9pZCwgbHpvX3NyYW5kbXQpIChsem9fcmFuZG10X3AgciwgbHpvX3VpbnQzMmxfdCBzZWVkKQoreworICAgIHVuc2lnbmVkIGkgPSAwOworICAgIGRvIHsKKyAgICAgICAgci0+c1tpKytdID0gKHNlZWQgJj0gTFpPX1VJTlQzMl9DKDB4ZmZmZmZmZmYpKTsKKyAgICAgICAgc2VlZCBePSBzZWVkID4+IDMwOworICAgICAgICBzZWVkID0gc2VlZCAqIExaT19VSU5UMzJfQygweDZjMDc4OTY1KSArIGk7CisgICAgfSB3aGlsZSAoaSAhPSA2MjQpOworICAgIHItPm4gPSBpOworfQorTFpPTElCX1BVQkxJQyhsem9fdWludDMybF90LCBsem9fcmFuZG10KSAobHpvX3JhbmRtdF9wIHIpCit7CisgICAgcmV0dXJuIChfX0xaT0xJQl9GVU5DTkFNRShsem9fcmFuZG10X3IzMikocikpID4+IDE7Cit9CitMWk9MSUJfUFVCTElDKGx6b191aW50MzJsX3QsIGx6b19yYW5kbXRfcjMyKSAobHpvX3JhbmRtdF9wIHIpCit7CisgICAgbHpvX3VpbnQzMmxfdCB2OworICAgIGlmIF9fbHpvX3VubGlrZWx5KHItPm4gPT0gNjI0KSB7CisgICAgICAgIHVuc2lnbmVkIGkgPSAwLCBqOworICAgICAgICByLT5uID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaiA9IGkgLSA2MjM7IGlmIChMWk9fU1RBVElDX0NBU1QoaW50LCBqKSA8IDApIGogKz0gNjI0OworICAgICAgICAgICAgdiA9IChyLT5zW2ldICYgTFpPX1VJTlQzMl9DKDB4ODAwMDAwMDApKSBeIChyLT5zW2pdICYgTFpPX1VJTlQzMl9DKDB4N2ZmZmZmZmYpKTsKKyAgICAgICAgICAgIGogPSBpIC0gMjI3OyBpZiAoTFpPX1NUQVRJQ19DQVNUKGludCwgaikgPCAwKSBqICs9IDYyNDsKKyAgICAgICAgICAgIHItPnNbaV0gPSByLT5zW2pdIF4gKHYgPj4gMSk7CisgICAgICAgICAgICBpZiAodiAmIDEpIHItPnNbaV0gXj0gTFpPX1VJTlQzMl9DKDB4OTkwOGIwZGYpOworICAgICAgICB9IHdoaWxlICgrK2kgIT0gNjI0KTsKKyAgICB9CisgICAgeyB1bnNpZ25lZCBpID0gci0+bisrOyB2ID0gci0+c1tpXTsgfQorICAgIHYgXj0gdiA+PiAxMTsgdiBePSAodiAmIExaT19VSU5UMzJfQygweDAxM2E1OGFkKSkgPDwgNzsKKyAgICB2IF49ICh2ICYgTFpPX1VJTlQzMl9DKDB4MDAwMWRmOGMpKSA8PCAxNTsgdiBePSB2ID4+IDE4OworICAgIHJldHVybiB2OworfQorI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorTFpPTElCX1BVQkxJQyh2b2lkLCBsem9fc3JhbmRtdDY0KSAobHpvX3JhbmRtdDY0X3AgciwgbHpvX3VpbnQ2NGxfdCBzZWVkKQoreworICAgIHVuc2lnbmVkIGkgPSAwOworICAgIGRvIHsKKyAgICAgICAgci0+c1tpKytdID0gKHNlZWQgJj0gTFpPX1VJTlQ2NF9DKDB4ZmZmZmZmZmZmZmZmZmZmZikpOworICAgICAgICBzZWVkIF49IHNlZWQgPj4gNjI7CisgICAgICAgIHNlZWQgPSBzZWVkICogTFpPX1VJTlQ2NF9DKDB4NTg1MWY0MmQ0Yzk1N2YyZCkgKyBpOworICAgIH0gd2hpbGUgKGkgIT0gMzEyKTsKKyAgICByLT5uID0gaTsKK30KKyNpZiAwCitMWk9MSUJfUFVCTElDKGx6b191aW50MzJsX3QsIGx6b19yYW5kbXQ2NCkgKGx6b19yYW5kbXQ2NF9wIHIpCit7CisgICAgbHpvX3VpbnQ2NGxfdCB2OworICAgIHYgPSAoX19MWk9MSUJfRlVOQ05BTUUobHpvX3JhbmRtdDY0X3I2NCkocikpID4+IDMzOworICAgIHJldHVybiBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmxfdCwgdik7Cit9CisjZW5kaWYKK0xaT0xJQl9QVUJMSUMobHpvX3VpbnQ2NGxfdCwgbHpvX3JhbmRtdDY0X3I2NCkgKGx6b19yYW5kbXQ2NF9wIHIpCit7CisgICAgbHpvX3VpbnQ2NGxfdCB2OworICAgIGlmIF9fbHpvX3VubGlrZWx5KHItPm4gPT0gMzEyKSB7CisgICAgICAgIHVuc2lnbmVkIGkgPSAwLCBqOworICAgICAgICByLT5uID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaiA9IGkgLSAzMTE7IGlmIChMWk9fU1RBVElDX0NBU1QoaW50LCBqKSA8IDApIGogKz0gMzEyOworICAgICAgICAgICAgdiA9IChyLT5zW2ldICYgTFpPX1VJTlQ2NF9DKDB4ZmZmZmZmZmY4MDAwMDAwMCkpIF4gKHItPnNbal0gJiBMWk9fVUlOVDY0X0MoMHg3ZmZmZmZmZikpOworICAgICAgICAgICAgaiA9IGkgLSAxNTY7IGlmIChMWk9fU1RBVElDX0NBU1QoaW50LCBqKSA8IDApIGogKz0gMzEyOworICAgICAgICAgICAgci0+c1tpXSA9IHItPnNbal0gXiAodiA+PiAxKTsKKyAgICAgICAgICAgIGlmICh2ICYgMSkgci0+c1tpXSBePSBMWk9fVUlOVDY0X0MoMHhiNTAyNmY1YWE5NjYxOWU5KTsKKyAgICAgICAgfSB3aGlsZSAoKytpICE9IDMxMik7CisgICAgfQorICAgIHsgdW5zaWduZWQgaSA9IHItPm4rKzsgdiA9IHItPnNbaV07IH0KKyAgICB2IF49ICh2ICYgTFpPX1VJTlQ2NF9DKDB4YWFhYWFhYWFhMDAwMDAwMCkpID4+IDI5OworICAgIHYgXj0gKHYgJiBMWk9fVUlOVDY0X0MoMHgzOGViM2ZmZmY2ZDMpKSA8PCAxNzsKKyAgICB2IF49ICh2ICYgTFpPX1VJTlQ2NF9DKDB4N2ZmYmY3NykpIDw8IDM3OworICAgIHJldHVybiB2IF4gKHYgPj4gNDMpOworfQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKExaT19XQU5UX0FDQ0xJQl9SRFRTQykKKyMgIHVuZGVmIExaT19XQU5UX0FDQ0xJQl9SRFRTQworI2RlZmluZSBfX0xaT0xJQl9SRFRTQ19DSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoTFpPTElCX1BVQkxJQykKKyMgIGRlZmluZSBMWk9MSUJfUFVCTElDKHIsZikgICAgciBfX0xaT0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCisjaWYgZGVmaW5lZChsem9faW50MzJlX3QpCisjaWYgKExaT19PU19XSU4zMiAmJiBMWk9fQ0NfUEVMTEVTQyAmJiAoX19QT0NDX18gPj0gMjkwKSkKKyMgIHByYWdtYSB3YXJuKHB1c2gpCisjICBwcmFnbWEgd2FybihkaXNhYmxlOjIwMDcpCisjZW5kaWYKKyNpZiAoTFpPX0FSQ0hfQU1ENjQgfHwgTFpPX0FSQ0hfSTM4NikgJiYgKExaT19BU01fU1lOVEFYX0dOVUMpCisjaWYgKExaT19BUkNIX0FNRDY0ICYmIExaT19DQ19JTlRFTEMpCisjICBkZWZpbmUgX19MWk9MSUJfUkRUU0NfUkVHUyAgIDogOiAiYyIgKHQpIDogIm1lbW9yeSIsICJyYXgiLCAicmR4IgorI2VsaWYgKExaT19BUkNIX0FNRDY0KQorIyAgZGVmaW5lIF9fTFpPTElCX1JEVFNDX1JFR1MgICA6IDogImMiICh0KSA6ICJjYyIsICJtZW1vcnkiLCAicmF4IiwgInJkeCIKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIExaT19DQ19HTlVDICYmIChMWk9fQ0NfR05VQyA8IDB4MDIwMDAwdWwpKQorIyAgZGVmaW5lIF9fTFpPTElCX1JEVFNDX1JFR1MgICA6IDogImMiICh0KSA6ICJheCIsICJkeCIKKyNlbGlmIChMWk9fQVJDSF9JMzg2ICYmIExaT19DQ19JTlRFTEMpCisjICBkZWZpbmUgX19MWk9MSUJfUkRUU0NfUkVHUyAgIDogOiAiYyIgKHQpIDogIm1lbW9yeSIsICJlYXgiLCAiZWR4IgorI2Vsc2UKKyMgIGRlZmluZSBfX0xaT0xJQl9SRFRTQ19SRUdTICAgOiA6ICJjIiAodCkgOiAiY2MiLCAibWVtb3J5IiwgImVheCIsICJlZHgiCisjZW5kaWYKKyNlbmRpZgorTFpPTElCX1BVQkxJQyhpbnQsIGx6b190c2NfcmVhZCkgKGx6b191aW50MzJlX3QqIHQpCit7CisjaWYgKExaT19BUkNIX0FNRDY0IHx8IExaT19BUkNIX0kzODYpICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorICAgICAgICAiY2xjIFxuIiAiLmJ5dGUgMHgwZiwweDMxXG4iCisgICAgICAgICJtb3ZsICUlZWF4LCglMClcbiIgIm1vdmwgJSVlZHgsNCglMClcbiIKKyAgICAgICAgX19MWk9MSUJfUkRUU0NfUkVHUworICAgICk7CisgICAgcmV0dXJuIDA7CisjZWxpZiAoTFpPX0FSQ0hfSTM4NikgJiYgKExaT19BU01fU1lOVEFYX01TQykKKyAgICBMWk9fVU5VU0VEKHQpOworICAgIF9fYXNtIHsKKyAgICAgICAgbW92IGVjeCwgdAorICAgICAgICBjbGMKKyMgIGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA8IDEyMDApKQorICAgICAgICBfZW1pdCAweDBmCisgICAgICAgIF9lbWl0IDB4MzEKKyMgIGVsc2UKKyAgICAgICAgcmR0c2MKKyMgIGVuZGlmCisgICAgICAgIG1vdiBbZWN4XSwgZWF4CisgICAgICAgIG1vdiBbZWN4KzRdLCBlZHgKKyAgICB9CisgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIHRbMF0gPSB0WzFdID0gMDsgcmV0dXJuIC0xOworI2VuZGlmCit9CisjaWYgKExaT19PU19XSU4zMiAmJiBMWk9fQ0NfUEVMTEVTQyAmJiAoX19QT0NDX18gPj0gMjkwKSkKKyMgIHByYWdtYSB3YXJuKHBvcCkKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKExaT19XQU5UX0FDQ0xJQl9ET1NBTExPQykKKyMgIHVuZGVmIExaT19XQU5UX0FDQ0xJQl9ET1NBTExPQworI2RlZmluZSBfX0xaT0xJQl9ET1NBTExPQ19DSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoTFpPTElCX1BVQkxJQykKKyMgIGRlZmluZSBMWk9MSUJfUFVCTElDKHIsZikgICAgciBfX0xaT0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCisjaWYgKExaT19PU19PUzIxNikKK0xaT19FWFRFUk5fQyB1bnNpZ25lZCBzaG9ydCBfX2ZhciBfX3Bhc2NhbCBEb3NBbGxvY0h1Z2UodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCBfX2ZhciAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworTFpPX0VYVEVSTl9DIHVuc2lnbmVkIHNob3J0IF9fZmFyIF9fcGFzY2FsIERvc0ZyZWVTZWcodW5zaWduZWQgc2hvcnQpOworI2VuZGlmCisjaWYgKExaT19PU19ET1MxNiB8fCBMWk9fT1NfV0lOMTYpCisjaWYgIShMWk9fQ0NfQVpURUNDKQorTFpPTElCX1BVQkxJQyh2b2lkIF9fZmFyKiwgbHpvX2Rvc19hbGxvYykgKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICB2b2lkIF9fZmFyKiBwID0gMDsKKyAgICB1bmlvbiBSRUdTIHJpLCBybzsKKyAgICBpZiAoKGxvbmcpc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gcDsKKyAgICBzaXplID0gKHNpemUgKyAxNSkgPj4gNDsKKyAgICBpZiAoc2l6ZSA+IDB4ZmZmZnUpCisgICAgICAgIHJldHVybiBwOworICAgIHJpLnguYXggPSAweDQ4MDA7CisgICAgcmkueC5ieCA9ICh1bnNpZ25lZCBzaG9ydCkgc2l6ZTsKKyAgICBpbnQ4NigweDIxLCAmcmksICZybyk7CisgICAgaWYgKChyby54LmNmbGFnICYgMSkgPT0gMCkKKyAgICAgICAgcCA9ICh2b2lkIF9fZmFyKikgTFpPX1BUUl9NS19GUChyby54LmF4LCAwKTsKKyAgICByZXR1cm4gcDsKK30KK0xaT0xJQl9QVUJMSUMoaW50LCBsem9fZG9zX2ZyZWUpICh2b2lkIF9fZmFyKiBwKQoreworICAgIHVuaW9uIFJFR1MgcmksIHJvOworICAgIHN0cnVjdCBTUkVHUyByczsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChMWk9fUFRSX0ZQX09GRihwKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2VncmVhZCgmcnMpOworICAgIHJpLnguYXggPSAweDQ5MDA7CisgICAgcnMuZXMgPSBMWk9fUFRSX0ZQX1NFRyhwKTsKKyAgICBpbnQ4NngoMHgyMSwgJnJpLCAmcm8sICZycyk7CisgICAgaWYgKHJvLnguY2ZsYWcgJiAxKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fT1NfT1MyMTYpCitMWk9MSUJfUFVCTElDKHZvaWQgX19mYXIqLCBsem9fZG9zX2FsbG9jKSAodW5zaWduZWQgbG9uZyBzaXplKQoreworICAgIHZvaWQgX19mYXIqIHAgPSAwOworICAgIHVuc2lnbmVkIHNob3J0IHNlbCA9IDA7CisgICAgaWYgKChsb25nKXNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIHA7CisgICAgaWYgKERvc0FsbG9jSHVnZSgodW5zaWduZWQgc2hvcnQpKHNpemUgPj4gMTYpLCAodW5zaWduZWQgc2hvcnQpc2l6ZSwgJnNlbCwgMCwgMCkgPT0gMCkKKyAgICAgICAgcCA9ICh2b2lkIF9fZmFyKikgTFpPX1BUUl9NS19GUChzZWwsIDApOworICAgIHJldHVybiBwOworfQorTFpPTElCX1BVQkxJQyhpbnQsIGx6b19kb3NfZnJlZSkgKHZvaWQgX19mYXIqIHApCit7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoTFpPX1BUUl9GUF9PRkYocCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChEb3NGcmVlU2VnKExaT19QVFJfRlBfU0VHKHApKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX1dBTlRfQUNDTElCX0dFVE9QVCkKKyMgIHVuZGVmIExaT19XQU5UX0FDQ0xJQl9HRVRPUFQKKyNkZWZpbmUgX19MWk9MSUJfR0VUT1BUX0NIX0lOQ0xVREVEIDEKKyNpZiAhZGVmaW5lZChMWk9MSUJfUFVCTElDKQorIyAgZGVmaW5lIExaT0xJQl9QVUJMSUMocixmKSAgICByIF9fTFpPTElCX0ZVTkNOQU1FKGYpCisjZW5kaWYKK0xaT0xJQl9QVUJMSUModm9pZCwgbHpvX2dldG9wdF9pbml0KSAobHpvX2dldG9wdF9wIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9hcmdjLCBpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgbWVtc2V0KGcsIDAsIHNpemVvZigqZykpOworICAgIGctPm9wdGluZCA9IHN0YXJ0X2FyZ2M7CisgICAgZy0+YXJnYyA9IGFyZ2M7IGctPmFyZ3YgPSBhcmd2OworICAgIGctPm9wdG9wdCA9IC0xOworfQorc3RhdGljIGludCBfX0xaT0xJQl9GVU5DTkFNRShsem9fZ2V0b3B0X3JvdGF0ZSkgKGNoYXIqKiBwLCBpbnQgZmlyc3QsIGludCBtaWRkbGUsIGludCBsYXN0KQoreworICAgIGludCBpID0gbWlkZGxlLCBuID0gbWlkZGxlIC0gZmlyc3Q7CisgICAgaWYgKGZpcnN0ID49IG1pZGRsZSB8fCBtaWRkbGUgPj0gbGFzdCkgcmV0dXJuIDA7CisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIGNoYXIqIHQgPSBwW2ZpcnN0XTsgcFtmaXJzdF0gPSBwW2ldOyBwW2ldID0gdDsKKyAgICAgICAgaWYgKCsrZmlyc3QgPT0gbWlkZGxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKytpID09IGxhc3QpIGJyZWFrOworICAgICAgICAgICAgbWlkZGxlID0gaTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgrK2kgPT0gbGFzdCkKKyAgICAgICAgICAgIGkgPSBtaWRkbGU7CisgICAgfQorICAgIHJldHVybiBuOworfQorc3RhdGljIGludCBfX0xaT0xJQl9GVU5DTkFNRShsem9fZ2V0b3B0X3BlcnJvcikgKGx6b19nZXRvcHRfcCBnLCBpbnQgcmV0LCBjb25zdCBjaGFyKiBmLCAuLi4pCit7CisgICAgaWYgKGctPm9wdGVycikKKyAgICB7CisjaWYgKEhBVkVfU1REQVJHX0gpCisgICAgICAgIHN0cnVjdCB7IHZhX2xpc3QgYXA7IH0gczsKKyAgICAgICAgdmFfc3RhcnQocy5hcCwgZik7CisgICAgICAgIGctPm9wdGVycihnLCBmLCAmcyk7CisgICAgICAgIHZhX2VuZChzLmFwKTsKKyNlbHNlCisgICAgICAgIGctPm9wdGVycihnLCBmLCBOVUxMKTsKKyNlbmRpZgorICAgIH0KKyAgICArK2ctPmVycmNvdW50OworICAgIHJldHVybiByZXQ7Cit9CitMWk9MSUJfUFVCTElDKGludCwgbHpvX2dldG9wdCkgKGx6b19nZXRvcHRfcCBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaG9ydG9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGx6b19nZXRvcHRfbG9uZ29wdF9wIGxvbmdvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxvbmdpbmQpCit7CisjZGVmaW5lIHBlICBfX0xaT0xJQl9GVU5DTkFNRShsem9fZ2V0b3B0X3BlcnJvcikKKyAgICBpbnQgb3JkZXJpbmcgPSBMWk9fR0VUT1BUX1BFUk1VVEU7CisgICAgaW50IG1pc3NpbmdfYXJnX3JldCA9IGctPmJhZF9vcHRpb247CisgICAgY2hhciogYTsKKyAgICBpZiAoc2hvcnRvcHRzKQorICAgIHsKKyAgICAgICAgaWYgKCpzaG9ydG9wdHMgPT0gJy0nIHx8ICpzaG9ydG9wdHMgPT0gJysnKQorICAgICAgICAgICAgb3JkZXJpbmcgPSAqc2hvcnRvcHRzKysgPT0gJy0nID8gTFpPX0dFVE9QVF9SRVRVUk5fSU5fT1JERVIgOiBMWk9fR0VUT1BUX1JFUVVJUkVfT1JERVI7CisgICAgICAgIGlmICgqc2hvcnRvcHRzID09ICc6JykKKyAgICAgICAgICAgIG1pc3NpbmdfYXJnX3JldCA9ICpzaG9ydG9wdHMrKzsKKyAgICB9CisgICAgZy0+b3B0YXJnID0gTlVMTDsKKyAgICBpZiAoZy0+b3B0b3B0ID09IC0xKQorICAgICAgICBnLT5vcHRvcHQgPSBnLT5iYWRfb3B0aW9uOworICAgIGlmIChsb25naW5kKQorICAgICAgICAqbG9uZ2luZCA9IC0xOworICAgIGlmIChnLT5lb2YpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoZy0+c2hvcnRwb3MpCisgICAgICAgIGdvdG8gbHpvX2xhYmVsX25leHRfc2hvcnRvcHQ7CisgICAgZy0+b3B0aW5kIC09IF9fTFpPTElCX0ZVTkNOQU1FKGx6b19nZXRvcHRfcm90YXRlKShnLT5hcmd2LCBnLT5wZW5kaW5nX3JvdGF0ZV9maXJzdCwgZy0+cGVuZGluZ19yb3RhdGVfbWlkZGxlLCBnLT5vcHRpbmQpOworICAgIGctPnBlbmRpbmdfcm90YXRlX2ZpcnN0ID0gZy0+cGVuZGluZ19yb3RhdGVfbWlkZGxlID0gZy0+b3B0aW5kOworICAgIGlmIChvcmRlcmluZyA9PSBMWk9fR0VUT1BUX1BFUk1VVEUpCisgICAgeworICAgICAgICB3aGlsZSAoZy0+b3B0aW5kIDwgZy0+YXJnYyAmJiAhKGctPmFyZ3ZbZy0+b3B0aW5kXVswXSA9PSAnLScgJiYgZy0+YXJndltnLT5vcHRpbmRdWzFdKSkKKyAgICAgICAgICAgICsrZy0+b3B0aW5kOworICAgICAgICBnLT5wZW5kaW5nX3JvdGF0ZV9taWRkbGUgPSBnLT5vcHRpbmQ7CisgICAgfQorICAgIGlmIChnLT5vcHRpbmQgPj0gZy0+YXJnYykKKyAgICB7CisgICAgICAgIGctPm9wdGluZCA9IGctPnBlbmRpbmdfcm90YXRlX2ZpcnN0OworICAgICAgICBnb3RvIGx6b19sYWJlbF9lb2Y7CisgICAgfQorICAgIGEgPSBnLT5hcmd2W2ctPm9wdGluZF07CisgICAgaWYgKGFbMF0gPT0gJy0nICYmIGFbMV0gPT0gJy0nKQorICAgIHsKKyAgICAgICAgc2l6ZV90IGwgPSAwOworICAgICAgICBjb25zdCBsem9fZ2V0b3B0X2xvbmdvcHRfcCBvOworICAgICAgICBjb25zdCBsem9fZ2V0b3B0X2xvbmdvcHRfcCBvMSA9IE5VTEw7CisgICAgICAgIGNvbnN0IGx6b19nZXRvcHRfbG9uZ29wdF9wIG8yID0gTlVMTDsKKyAgICAgICAgaW50IG5lZWRfZXhhY3QgPSAwOworICAgICAgICArK2ctPm9wdGluZDsKKyAgICAgICAgaWYgKCFhWzJdKQorICAgICAgICAgICAgZ290byBsem9fbGFiZWxfZW9mOworICAgICAgICBmb3IgKGEgKz0gMjsgYVtsXSAmJiBhW2xdICE9ICc9JyAmJiBhW2xdICE9ICcjJzsgKQorICAgICAgICAgICAgKytsOworICAgICAgICBmb3IgKG8gPSBsb25nb3B0czsgbCAmJiBvICYmIG8tPm5hbWU7ICsrbykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYSwgby0+bmFtZSwgbCkgIT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghby0+bmFtZVtsXSkKKyAgICAgICAgICAgICAgICBnb3RvIGx6b19sYWJlbF9mb3VuZF9vOworICAgICAgICAgICAgbmVlZF9leGFjdCB8PSBvLT5oYXNfYXJnICYgTFpPX0dFVE9QVF9FWEFDVF9BUkc7CisgICAgICAgICAgICBpZiAobzEpIG8yID0gbzsKKyAgICAgICAgICAgIGVsc2UgICAgbzEgPSBvOworICAgICAgICB9CisgICAgICAgIGlmICghbzEgfHwgbmVlZF9leGFjdCkKKyAgICAgICAgICAgIHJldHVybiBwZShnLCBnLT5iYWRfb3B0aW9uLCAidW5yZWNvZ25pemVkIG9wdGlvbiAnLS0lcyciLCBhKTsKKyAgICAgICAgaWYgKG8yKQorICAgICAgICAgICAgcmV0dXJuIHBlKGcsIGctPmJhZF9vcHRpb24sICJvcHRpb24gJy0tJXMnIGlzIGFtYmlndW91cyAoY291bGQgYmUgJy0tJXMnIG9yICctLSVzJykiLCBhLCBvMS0+bmFtZSwgbzItPm5hbWUpOworICAgICAgICBvID0gbzE7CisgICAgbHpvX2xhYmVsX2ZvdW5kX286CisgICAgICAgIGEgKz0gbDsKKyAgICAgICAgc3dpdGNoIChvLT5oYXNfYXJnICYgMHgyZikKKyAgICAgICAgeworICAgICAgICBjYXNlIExaT19HRVRPUFRfT1BUSU9OQUxfQVJHOgorICAgICAgICAgICAgaWYgKGFbMF0pCisgICAgICAgICAgICAgICAgZy0+b3B0YXJnID0gYSArIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMWk9fR0VUT1BUX1JFUVVJUkVEX0FSRzoKKyAgICAgICAgICAgIGlmIChhWzBdKQorICAgICAgICAgICAgICAgIGctPm9wdGFyZyA9IGEgKyAxOworICAgICAgICAgICAgZWxzZSBpZiAoZy0+b3B0aW5kIDwgZy0+YXJnYykKKyAgICAgICAgICAgICAgICBnLT5vcHRhcmcgPSBnLT5hcmd2W2ctPm9wdGluZCsrXTsKKyAgICAgICAgICAgIGlmICghZy0+b3B0YXJnKQorICAgICAgICAgICAgICAgIHJldHVybiBwZShnLCBtaXNzaW5nX2FyZ19yZXQsICJvcHRpb24gJy0tJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iiwgby0+bmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMWk9fR0VUT1BUX1JFUVVJUkVEX0FSRyB8IDB4MjA6CisgICAgICAgICAgICBpZiAoYVswXSAmJiBhWzFdKQorICAgICAgICAgICAgICAgIGctPm9wdGFyZyA9IGEgKyAxOworICAgICAgICAgICAgaWYgKCFnLT5vcHRhcmcpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBlKGcsIG1pc3NpbmdfYXJnX3JldCwgIm9wdGlvbiAnLS0lcz0nIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iiwgby0+bmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChhWzBdKQorICAgICAgICAgICAgICAgIHJldHVybiBwZShnLCBnLT5iYWRfb3B0aW9uLCAib3B0aW9uICctLSVzJyBkb2Vzbid0IGFsbG93IGFuIGFyZ3VtZW50Iiwgby0+bmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9uZ2luZCkKKyAgICAgICAgICAgICpsb25naW5kID0gKGludCkgKG8gLSBsb25nb3B0cyk7CisgICAgICAgIGlmIChvLT5mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICAqby0+ZmxhZyA9IG8tPnZhbDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvLT52YWw7CisgICAgfQorICAgIGlmIChhWzBdID09ICctJyAmJiBhWzFdKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjOworICAgICAgICBjb25zdCBjaGFyKiBzOworICAgIGx6b19sYWJlbF9uZXh0X3Nob3J0b3B0OgorICAgICAgICBhID0gZy0+YXJndltnLT5vcHRpbmRdICsgKytnLT5zaG9ydHBvczsKKyAgICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSAqYSsrOyBzID0gTlVMTDsKKyAgICAgICAgaWYgKGMgIT0gJzonICYmIHNob3J0b3B0cykKKyAgICAgICAgICAgIHMgPSBzdHJjaHIoc2hvcnRvcHRzLCBjKTsKKyAgICAgICAgaWYgKCFzIHx8IHNbMV0gIT0gJzonKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWFbMF0pCisgICAgICAgICAgICAgICAgKytnLT5vcHRpbmQsIGctPnNob3J0cG9zID0gMDsKKyAgICAgICAgICAgIGlmICghcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnLT5vcHRvcHQgPSBjOworICAgICAgICAgICAgICAgIHJldHVybiBwZShnLCBnLT5iYWRfb3B0aW9uLCAiaW52YWxpZCBvcHRpb24gJy0lYyciLCBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICsrZy0+b3B0aW5kLCBnLT5zaG9ydHBvcyA9IDA7CisgICAgICAgICAgICBpZiAoYVswXSkKKyAgICAgICAgICAgICAgICBnLT5vcHRhcmcgPSBhOworICAgICAgICAgICAgZWxzZSBpZiAoc1syXSAhPSAnOicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGctPm9wdGluZCA8IGctPmFyZ2MpCisgICAgICAgICAgICAgICAgICAgIGctPm9wdGFyZyA9IGctPmFyZ3ZbZy0+b3B0aW5kKytdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGctPm9wdG9wdCA9IGM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwZShnLCBtaXNzaW5nX2FyZ19yZXQsICJvcHRpb24gJy0lYycgcmVxdWlyZXMgYW4gYXJndW1lbnQiLCBjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorICAgIGlmIChvcmRlcmluZyA9PSBMWk9fR0VUT1BUX1JFVFVSTl9JTl9PUkRFUikKKyAgICB7CisgICAgICAgICsrZy0+b3B0aW5kOworICAgICAgICBnLT5vcHRhcmcgPSBhOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Citsem9fbGFiZWxfZW9mOgorICAgIGctPm9wdGluZCAtPSBfX0xaT0xJQl9GVU5DTkFNRShsem9fZ2V0b3B0X3JvdGF0ZSkoZy0+YXJndiwgZy0+cGVuZGluZ19yb3RhdGVfZmlyc3QsIGctPnBlbmRpbmdfcm90YXRlX21pZGRsZSwgZy0+b3B0aW5kKTsKKyAgICBnLT5wZW5kaW5nX3JvdGF0ZV9maXJzdCA9IGctPnBlbmRpbmdfcm90YXRlX21pZGRsZSA9IGctPm9wdGluZDsKKyAgICBnLT5lb2YgPSAxOworICAgIHJldHVybiAtMTsKKyN1bmRlZiBwZQorfQorI2VuZGlmCisjaWYgZGVmaW5lZChMWk9fV0FOVF9BQ0NMSUJfSEFMTE9DKQorIyAgdW5kZWYgTFpPX1dBTlRfQUNDTElCX0hBTExPQworI2RlZmluZSBfX0xaT0xJQl9IQUxMT0NfQ0hfSU5DTFVERUQgMQorI2lmICFkZWZpbmVkKExaT0xJQl9QVUJMSUMpCisjICBkZWZpbmUgTFpPTElCX1BVQkxJQyhyLGYpICAgIHIgX19MWk9MSUJfRlVOQ05BTUUoZikKKyNlbmRpZgorI2lmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyNpZiAxICYmIChMWk9fT1NfRE9TMTYgJiYgZGVmaW5lZChCTFgyODYpKQorIyAgZGVmaW5lIF9fTFpPTElCX0hBTExPQ19VU0VfREFIIDEKKyNlbGlmIDEgJiYgKExaT19PU19ET1MxNiAmJiBkZWZpbmVkKERPU1gyODYpKQorIyAgZGVmaW5lIF9fTFpPTElCX0hBTExPQ19VU0VfREFIIDEKKyNlbGlmIDEgJiYgKExaT19PU19PUzIxNikKKyMgIGRlZmluZSBfX0xaT0xJQl9IQUxMT0NfVVNFX0RBSCAxCisjZWxpZiAxICYmIChMWk9fT1NfV0lOMTYpCisjICBkZWZpbmUgX19MWk9MSUJfSEFMTE9DX1VTRV9HQSAxCisjZWxpZiAxICYmIChMWk9fT1NfRE9TMTYpICYmIChMWk9fQ0NfQk9STEFOREMpICYmIGRlZmluZWQoX19EUE1JMTZfXykKKyMgIGRlZmluZSBfX0xaT0xJQl9IQUxMT0NfVVNFX0dBIDEKKyNlbmRpZgorI2VuZGlmCisjaWYgKF9fTFpPTElCX0hBTExPQ19VU0VfREFIKQorI2lmIDAgJiYgKExaT19PU19PUzIxNikKKyNpbmNsdWRlIDxvczIuaD4KKyNlbHNlCitMWk9fRVhURVJOX0MgdW5zaWduZWQgc2hvcnQgX19mYXIgX19wYXNjYWwgRG9zQWxsb2NIdWdlKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQgX19mYXIgKiwgdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKK0xaT19FWFRFUk5fQyB1bnNpZ25lZCBzaG9ydCBfX2ZhciBfX3Bhc2NhbCBEb3NGcmVlU2VnKHVuc2lnbmVkIHNob3J0KTsKKyNlbmRpZgorI2VuZGlmCisjaWYgKF9fTFpPTElCX0hBTExPQ19VU0VfR0EpCisjaWYgMAorI2RlZmluZSBTVFJJQ1QgMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCitMWk9fRVhURVJOX0MgY29uc3Qgdm9pZCBfX25lYXIqIF9fZmFyIF9fcGFzY2FsIEdsb2JhbEFsbG9jKHVuc2lnbmVkLCB1bnNpZ25lZCBsb25nKTsKK0xaT19FWFRFUk5fQyBjb25zdCB2b2lkIF9fbmVhciogX19mYXIgX19wYXNjYWwgR2xvYmFsRnJlZShjb25zdCB2b2lkIF9fbmVhciopOworTFpPX0VYVEVSTl9DIHVuc2lnbmVkIGxvbmcgX19mYXIgX19wYXNjYWwgR2xvYmFsSGFuZGxlKHVuc2lnbmVkKTsKK0xaT19FWFRFUk5fQyB2b2lkIF9fZmFyKiBfX2ZhciBfX3Bhc2NhbCBHbG9iYWxMb2NrKGNvbnN0IHZvaWQgX19uZWFyKik7CitMWk9fRVhURVJOX0MgaW50IF9fZmFyIF9fcGFzY2FsIEdsb2JhbFVubG9jayhjb25zdCB2b2lkIF9fbmVhciopOworI2VuZGlmCisjZW5kaWYKK0xaT0xJQl9QVUJMSUMobHpvX2h2b2lkX3AsIGx6b19oYWxsb2MpIChsem9faHNpemVfdCBzaXplKQoreworICAgIGx6b19odm9pZF9wIHAgPSBMWk9fU1RBVElDX0NBU1QobHpvX2h2b2lkX3AsIDApOworICAgIGlmICghKHNpemUgPiAwKSkKKyAgICAgICAgcmV0dXJuIHA7CisjaWYgMCAmJiBkZWZpbmVkKF9fcGFsbW9zX18pCisgICAgcCA9IE1lbVB0ck5ldyhzaXplKTsKKyNlbGlmICEoTFpPX0hBVkVfTU1fSFVHRV9QVFIpCisgICAgaWYgKHNpemUgPCBMWk9fU1RBVElDX0NBU1Qoc2l6ZV90LCAtMSkpCisgICAgICAgIHAgPSBtYWxsb2MoTFpPX1NUQVRJQ19DQVNUKHNpemVfdCwgc2l6ZSkpOworI2Vsc2UKKyAgICBpZiAoTFpPX1NUQVRJQ19DQVNUKGxvbmcsIHNpemUpIDw9IDApCisgICAgICAgIHJldHVybiBwOworeworI2lmIChfX0xaT0xJQl9IQUxMT0NfVVNFX0RBSCkKKyAgICB1bnNpZ25lZCBzaG9ydCBzZWwgPSAwOworICAgIGlmIChEb3NBbGxvY0h1Z2UoKHVuc2lnbmVkIHNob3J0KShzaXplID4+IDE2KSwgKHVuc2lnbmVkIHNob3J0KXNpemUsICZzZWwsIDAsIDApID09IDApCisgICAgICAgIHAgPSAobHpvX2h2b2lkX3ApIExaT19QVFJfTUtfRlAoc2VsLCAwKTsKKyNlbGlmIChfX0xaT0xJQl9IQUxMT0NfVVNFX0dBKQorICAgIGNvbnN0IHZvaWQgX19uZWFyKiBoID0gR2xvYmFsQWxsb2MoMiwgc2l6ZSk7CisgICAgaWYgKGgpIHsKKyAgICAgICAgcCA9IEdsb2JhbExvY2soaCk7CisgICAgICAgIGlmIChwICYmIExaT19QVFJfRlBfT0ZGKHApICE9IDApIHsKKyAgICAgICAgICAgIEdsb2JhbFVubG9jayhoKTsKKyAgICAgICAgICAgIHAgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoaCk7CisgICAgfQorI2VsaWYgKExaT19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDcwMCkpCisgICAgcCA9IF9oYWxsb2Moc2l6ZSwgMSk7CisjZWxpZiAoTFpPX0NDX01TQyB8fCBMWk9fQ0NfV0FUQ09NQykKKyAgICBwID0gaGFsbG9jKHNpemUsIDEpOworI2VsaWYgKExaT19DQ19ETUMgfHwgTFpPX0NDX1NZTUFOVEVDQyB8fCBMWk9fQ0NfWk9SVEVDSEMpCisgICAgcCA9IGZhcm1hbGxvYyhzaXplKTsKKyNlbGlmIChMWk9fQ0NfQk9STEFOREMgfHwgTFpPX0NDX1RVUkJPQykKKyAgICBwID0gZmFybWFsbG9jKHNpemUpOworI2VsaWYgKExaT19DQ19BWlRFQ0MpCisgICAgcCA9IGxtYWxsb2Moc2l6ZSk7CisjZWxzZQorICAgIGlmIChzaXplIDwgTFpPX1NUQVRJQ19DQVNUKHNpemVfdCwgLTEpKQorICAgICAgICBwID0gbWFsbG9jKChzaXplX3QpIHNpemUpOworI2VuZGlmCit9CisjZW5kaWYKKyAgICByZXR1cm4gcDsKK30KK0xaT0xJQl9QVUJMSUModm9pZCwgbHpvX2hmcmVlKSAobHpvX2h2b2lkX3AgcCkKK3sKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybjsKKyNpZiAwICYmIGRlZmluZWQoX19wYWxtb3NfXykKKyAgICBNZW1QdHJGcmVlKHApOworI2VsaWYgIShMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyAgICBmcmVlKHApOworI2Vsc2UKKyNpZiAoX19MWk9MSUJfSEFMTE9DX1VTRV9EQUgpCisgICAgaWYgKExaT19QVFJfRlBfT0ZGKHApID09IDApCisgICAgICAgIERvc0ZyZWVTZWcoKHVuc2lnbmVkIHNob3J0KSBMWk9fUFRSX0ZQX1NFRyhwKSk7CisjZWxpZiAoX19MWk9MSUJfSEFMTE9DX1VTRV9HQSkKKyAgICBpZiAoTFpPX1BUUl9GUF9PRkYocCkgPT0gMCkgeworICAgICAgICBjb25zdCB2b2lkIF9fbmVhciogaCA9IChjb25zdCB2b2lkIF9fbmVhciopICh1bnNpZ25lZCkgR2xvYmFsSGFuZGxlKExaT19QVFJfRlBfU0VHKHApKTsKKyAgICAgICAgaWYgKGgpIHsKKyAgICAgICAgICAgIEdsb2JhbFVubG9jayhoKTsKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoaCk7CisgICAgICAgIH0KKyAgICB9CisjZWxpZiAoTFpPX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gNzAwKSkKKyAgICBfaGZyZWUocCk7CisjZWxpZiAoTFpPX0NDX01TQyB8fCBMWk9fQ0NfV0FUQ09NQykKKyAgICBoZnJlZShwKTsKKyNlbGlmIChMWk9fQ0NfRE1DIHx8IExaT19DQ19TWU1BTlRFQ0MgfHwgTFpPX0NDX1pPUlRFQ0hDKQorICAgIGZhcmZyZWUoKHZvaWQgX19mYXIqKSBwKTsKKyNlbGlmIChMWk9fQ0NfQk9STEFOREMgfHwgTFpPX0NDX1RVUkJPQykKKyAgICBmYXJmcmVlKCh2b2lkIF9fZmFyKikgcCk7CisjZWxpZiAoTFpPX0NDX0FaVEVDQykKKyAgICBsZnJlZShwKTsKKyNlbHNlCisgICAgZnJlZShwKTsKKyNlbmRpZgorI2VuZGlmCit9CisjZW5kaWYKKyNpZiBkZWZpbmVkKExaT19XQU5UX0FDQ0xJQl9IRlJFQUQpCisjICB1bmRlZiBMWk9fV0FOVF9BQ0NMSUJfSEZSRUFECisjZGVmaW5lIF9fTFpPTElCX0hGUkVBRF9DSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoTFpPTElCX1BVQkxJQykKKyMgIGRlZmluZSBMWk9MSUJfUFVCTElDKHIsZikgICAgciBfX0xaT0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCitMWk9MSUJfUFVCTElDKGx6b19oc2l6ZV90LCBsem9faGZyZWFkKSAodm9pZCogdmZwLCBsem9faHZvaWRfcCBidWYsIGx6b19oc2l6ZV90IHNpemUpCit7CisgICAgRklMRSogZnAgPSBMWk9fU1RBVElDX0NBU1QoRklMRSAqLCB2ZnApOworI2lmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyNpZiAoTFpPX01NX1RJTlkgfHwgTFpPX01NX1NNQUxMIHx8IExaT19NTV9NRURJVU0pCisjZGVmaW5lIF9fTFpPTElCX1JFUVVJUkVfSE1FTUNQWV9DSCAxCisgICAgdW5zaWduZWQgY2hhciB0bXBbNTEyXTsKKyAgICBsem9faHNpemVfdCBsID0gMDsKKyAgICB3aGlsZSAobCA8IHNpemUpCisgICAgeworICAgICAgICBzaXplX3QgbiA9IHNpemUgLSBsID4gc2l6ZW9mKHRtcCkgPyBzaXplb2YodG1wKSA6IChzaXplX3QpIChzaXplIC0gbCk7CisgICAgICAgIG4gPSBmcmVhZCh0bXAsIDEsIG4sIGZwKTsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBfX0xaT0xJQl9GVU5DTkFNRShsem9faG1lbWNweSkoKGx6b19oYnl0ZV9wKWJ1ZiArIGwsIHRtcCwgKGx6b19oc2l6ZV90KW4pOworICAgICAgICBsICs9IG47CisgICAgfQorICAgIHJldHVybiBsOworI2VsaWYgKExaT19NTV9DT01QQUNUIHx8IExaT19NTV9MQVJHRSB8fCBMWk9fTU1fSFVHRSkKKyAgICBsem9faGJ5dGVfcCBiID0gKGx6b19oYnl0ZV9wKSBidWY7CisgICAgbHpvX2hzaXplX3QgbCA9IDA7CisgICAgd2hpbGUgKGwgPCBzaXplKQorICAgIHsKKyAgICAgICAgc2l6ZV90IG47CisgICAgICAgIG4gPSBMWk9fUFRSX0ZQX09GRihiKTsgbiA9IChuIDw9IDEpID8gMHg4MDAwdSA6ICgwdSAtIG4pOworICAgICAgICBpZiAoKGx6b19oc2l6ZV90KSBuID4gc2l6ZSAtIGwpCisgICAgICAgICAgICBuID0gKHNpemVfdCkgKHNpemUgLSBsKTsKKyAgICAgICAgbiA9IGZyZWFkKCh2b2lkIF9fZmFyKiliLCAxLCBuLCBmcCk7CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYiArPSBuOyBsICs9IG47CisgICAgfQorICAgIHJldHVybiBsOworI2Vsc2UKKyMgIGVycm9yICJ1bmtub3duIG1lbW9yeSBtb2RlbCIKKyNlbmRpZgorI2Vsc2UKKyAgICByZXR1cm4gZnJlYWQoYnVmLCAxLCBzaXplLCBmcCk7CisjZW5kaWYKK30KK0xaT0xJQl9QVUJMSUMobHpvX2hzaXplX3QsIGx6b19oZndyaXRlKSAodm9pZCogdmZwLCBjb25zdCBsem9faHZvaWRfcCBidWYsIGx6b19oc2l6ZV90IHNpemUpCit7CisgICAgRklMRSogZnAgPSBMWk9fU1RBVElDX0NBU1QoRklMRSAqLCB2ZnApOworI2lmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyNpZiAoTFpPX01NX1RJTlkgfHwgTFpPX01NX1NNQUxMIHx8IExaT19NTV9NRURJVU0pCisjZGVmaW5lIF9fTFpPTElCX1JFUVVJUkVfSE1FTUNQWV9DSCAxCisgICAgdW5zaWduZWQgY2hhciB0bXBbNTEyXTsKKyAgICBsem9faHNpemVfdCBsID0gMDsKKyAgICB3aGlsZSAobCA8IHNpemUpCisgICAgeworICAgICAgICBzaXplX3QgbiA9IHNpemUgLSBsID4gc2l6ZW9mKHRtcCkgPyBzaXplb2YodG1wKSA6IChzaXplX3QpIChzaXplIC0gbCk7CisgICAgICAgIF9fTFpPTElCX0ZVTkNOQU1FKGx6b19obWVtY3B5KSh0bXAsIChjb25zdCBsem9faGJ5dGVfcClidWYgKyBsLCAobHpvX2hzaXplX3Qpbik7CisgICAgICAgIG4gPSBmd3JpdGUodG1wLCAxLCBuLCBmcCk7CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbCArPSBuOworICAgIH0KKyAgICByZXR1cm4gbDsKKyNlbGlmIChMWk9fTU1fQ09NUEFDVCB8fCBMWk9fTU1fTEFSR0UgfHwgTFpPX01NX0hVR0UpCisgICAgY29uc3QgbHpvX2hieXRlX3AgYiA9IChjb25zdCBsem9faGJ5dGVfcCkgYnVmOworICAgIGx6b19oc2l6ZV90IGwgPSAwOworICAgIHdoaWxlIChsIDwgc2l6ZSkKKyAgICB7CisgICAgICAgIHNpemVfdCBuOworICAgICAgICBuID0gTFpPX1BUUl9GUF9PRkYoYik7IG4gPSAobiA8PSAxKSA/IDB4ODAwMHUgOiAoMHUgLSBuKTsKKyAgICAgICAgaWYgKChsem9faHNpemVfdCkgbiA+IHNpemUgLSBsKQorICAgICAgICAgICAgbiA9IChzaXplX3QpIChzaXplIC0gbCk7CisgICAgICAgIG4gPSBmd3JpdGUoKHZvaWQgX19mYXIqKWIsIDEsIG4sIGZwKTsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBiICs9IG47IGwgKz0gbjsKKyAgICB9CisgICAgcmV0dXJuIGw7CisjZWxzZQorIyAgZXJyb3IgInVua25vd24gbWVtb3J5IG1vZGVsIgorI2VuZGlmCisjZWxzZQorICAgIHJldHVybiBmd3JpdGUoYnVmLCAxLCBzaXplLCBmcCk7CisjZW5kaWYKK30KKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPX1dBTlRfQUNDTElCX0hTUkVBRCkKKyMgIHVuZGVmIExaT19XQU5UX0FDQ0xJQl9IU1JFQUQKKyNkZWZpbmUgX19MWk9MSUJfSFNSRUFEX0NIX0lOQ0xVREVEIDEKKyNpZiAhZGVmaW5lZChMWk9MSUJfUFVCTElDKQorIyAgZGVmaW5lIExaT0xJQl9QVUJMSUMocixmKSAgICByIF9fTFpPTElCX0ZVTkNOQU1FKGYpCisjZW5kaWYKK0xaT0xJQl9QVUJMSUMobG9uZywgbHpvX3NhZmVfaHJlYWQpIChpbnQgZmQsIGx6b19odm9pZF9wIGJ1ZiwgbG9uZyBzaXplKQoreworICAgIGx6b19oYnl0ZV9wIGIgPSAobHpvX2hieXRlX3ApIGJ1ZjsKKyAgICBsb25nIGwgPSAwOworICAgIGludCBzYXZlZF9lcnJubzsKKyAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgIHdoaWxlIChsIDwgc2l6ZSkKKyAgICB7CisgICAgICAgIGxvbmcgbiA9IHNpemUgLSBsOworI2lmIChMWk9fSEFWRV9NTV9IVUdFX1BUUikKKyMgIGRlZmluZSBfX0xaT0xJQl9SRVFVSVJFX0hSRUFEX0NIIDEKKyAgICAgICAgZXJybm8gPSAwOyBuID0gbHpvX2hyZWFkKGZkLCBiLCBuKTsKKyNlbGlmIChMWk9fT1NfRE9TMzIpICYmIGRlZmluZWQoX19ESkdQUF9fKQorICAgICAgICBlcnJubyA9IDA7IG4gPSBfcmVhZChmZCwgYiwgbik7CisjZWxzZQorICAgICAgICBlcnJubyA9IDA7IG4gPSByZWFkKGZkLCBiLCBuKTsKKyNlbmRpZgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChuIDwgMCkgeworI2lmIGRlZmluZWQoRUFHQUlOKQorICAgICAgICAgICAgaWYgKGVycm5vID09IChFQUdBSU4pKSBjb250aW51ZTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRUlOVFIpCisgICAgICAgICAgICBpZiAoZXJybm8gPT0gKEVJTlRSKSkgY29udGludWU7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSAwKSBlcnJubyA9IDE7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorICAgICAgICBiICs9IG47IGwgKz0gbjsKKyAgICB9CisgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKKyAgICByZXR1cm4gbDsKK30KK0xaT0xJQl9QVUJMSUMobG9uZywgbHpvX3NhZmVfaHdyaXRlKSAoaW50IGZkLCBjb25zdCBsem9faHZvaWRfcCBidWYsIGxvbmcgc2l6ZSkKK3sKKyAgICBjb25zdCBsem9faGJ5dGVfcCBiID0gKGNvbnN0IGx6b19oYnl0ZV9wKSBidWY7CisgICAgbG9uZyBsID0gMDsKKyAgICBpbnQgc2F2ZWRfZXJybm87CisgICAgc2F2ZWRfZXJybm8gPSBlcnJubzsKKyAgICB3aGlsZSAobCA8IHNpemUpCisgICAgeworICAgICAgICBsb25nIG4gPSBzaXplIC0gbDsKKyNpZiAoTFpPX0hBVkVfTU1fSFVHRV9QVFIpCisjICBkZWZpbmUgX19MWk9MSUJfUkVRVUlSRV9IUkVBRF9DSCAxCisgICAgICAgIGVycm5vID0gMDsgbiA9IGx6b19od3JpdGUoZmQsIGIsIG4pOworI2VsaWYgKExaT19PU19ET1MzMikgJiYgZGVmaW5lZChfX0RKR1BQX18pCisgICAgICAgIGVycm5vID0gMDsgbiA9IF93cml0ZShmZCwgYiwgbik7CisjZWxzZQorICAgICAgICBlcnJubyA9IDA7IG4gPSB3cml0ZShmZCwgYiwgbik7CisjZW5kaWYKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAobiA8IDApIHsKKyNpZiBkZWZpbmVkKEVBR0FJTikKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSAoRUFHQUlOKSkgY29udGludWU7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEVJTlRSKQorICAgICAgICAgICAgaWYgKGVycm5vID09IChFSU5UUikpIGNvbnRpbnVlOworI2VuZGlmCisgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkgZXJybm8gPSAxOworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKyAgICAgICAgYiArPSBuOyBsICs9IG47CisgICAgfQorICAgIGVycm5vID0gc2F2ZWRfZXJybm87CisgICAgcmV0dXJuIGw7Cit9CisjZW5kaWYKKyNpZiBkZWZpbmVkKExaT19XQU5UX0FDQ0xJQl9QQ0xPQ0spCisjICB1bmRlZiBMWk9fV0FOVF9BQ0NMSUJfUENMT0NLCisjZGVmaW5lIF9fTFpPTElCX1BDTE9DS19DSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoTFpPTElCX1BVQkxJQykKKyMgIGRlZmluZSBMWk9MSUJfUFVCTElDKHIsZikgICAgciBfX0xaT0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCisjaWYgMSAmJiAoTFpPX09TX1BPU0lYX0xJTlVYICYmIExaT19BUkNIX0FNRDY0ICYmIExaT19BU01fU1lOVEFYX0dOVUMpCisjaWZuZGVmIGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lCisjZGVmaW5lIGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lIGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lCisjZW5kaWYKK19fbHpvX3N0YXRpY19ub2lubGluZSBsb25nIGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lKGxvbmcgY2xvY2tpZCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKyAgICB1bnNpZ25lZCBsb25nIHIgPSAyMjg7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN5c2NhbGxcbiIgOiAiPWEiIChyKSA6ICIwIiAociksICJEIiAoY2xvY2tpZCksICJTIiAodHMpIF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0NfTUVNT1JZKTsKKyAgICByZXR1cm4gTFpPX0lDQVNUKGxvbmcsIHIpOworfQorI2VuZGlmCisjaWYgMSAmJiAoTFpPX09TX1BPU0lYX0xJTlVYICYmIExaT19BUkNIX0kzODYgJiYgTFpPX0FTTV9TWU5UQVhfR05VQykgJiYgZGVmaW5lZChsem9faW50NjRsX3QpCisjaWZuZGVmIGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lCisjZGVmaW5lIGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lIGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lCisjZW5kaWYKK19fbHpvX3N0YXRpY19ub2lubGluZSBsb25nIGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lKGxvbmcgY2xvY2tpZCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKyAgICB1bnNpZ25lZCBsb25nIHIgPSAyNjU7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hsICUlZWJ4XG4gcHVzaGwgJSVlZHhcbiBwb3BsICUlZWJ4XG4gaW50ICQweDgwXG4gcG9wbCAlJWVieFxuIiA6ICI9YSIgKHIpIDogIjAiIChyKSwgImQiIChjbG9ja2lkKSwgImMiICh0cykgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQ19NRU1PUlkpOworICAgIHJldHVybiBMWk9fSUNBU1QobG9uZywgcik7Cit9CisjZW5kaWYKKyNpZiAwICYmIGRlZmluZWQobHpvX3BjbG9ja19zeXNjYWxsX2Nsb2NrX2dldHRpbWUpCisjaWZuZGVmIGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3Jfc3lzY2FsbAorI2RlZmluZSBsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9yX3N5c2NhbGwgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfcl9zeXNjYWxsCisjZW5kaWYKK3N0YXRpYyBpbnQgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfcl9zeXNjYWxsKGx6b19wY2xvY2tfaGFuZGxlX3AgaCwgbHpvX3BjbG9ja19wIGMpCit7CisgICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICBpZiAobHpvX3BjbG9ja19zeXNjYWxsX2Nsb2NrX2dldHRpbWUoMCwgJnRzKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYy0+dHZfc2VjID0gdHMudHZfc2VjOworICAgIGMtPnR2X25zZWMgPSBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmxfdCwgdHMudHZfbnNlYyk7CisgICAgTFpPX1VOVVNFRChoKTsgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNpZiAoSEFWRV9HRVRUSU1FT0ZEQVkpCisjaWZuZGVmIGx6b19wY2xvY2tfcmVhZF9nZXR0aW1lb2ZkYXkKKyNkZWZpbmUgbHpvX3BjbG9ja19yZWFkX2dldHRpbWVvZmRheSBsem9fcGNsb2NrX3JlYWRfZ2V0dGltZW9mZGF5CisjZW5kaWYKK3N0YXRpYyBpbnQgbHpvX3BjbG9ja19yZWFkX2dldHRpbWVvZmRheShsem9fcGNsb2NrX2hhbmRsZV9wIGgsIGx6b19wY2xvY2tfcCBjKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGlmIChnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisjaWYgZGVmaW5lZChsem9faW50NjRsX3QpCisgICAgYy0+dHZfc2VjID0gdHYudHZfc2VjOworI2Vsc2UKKyAgICBjLT50dl9zZWNfaGlnaCA9IDA7CisgICAgYy0+dHZfc2VjX2xvdyA9IHR2LnR2X3NlYzsKKyNlbmRpZgorICAgIGMtPnR2X25zZWMgPSBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmxfdCwgKHR2LnR2X3VzZWMgKiAxMDAwdSkpOworICAgIExaT19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgZGVmaW5lZChDTE9DS1NfUEVSX1NFQykgJiYgIShMWk9fQ0ZHX05PX0RPVUJMRSkKKyNpZm5kZWYgbHpvX3BjbG9ja19yZWFkX2Nsb2NrCisjZGVmaW5lIGx6b19wY2xvY2tfcmVhZF9jbG9jayBsem9fcGNsb2NrX3JlYWRfY2xvY2sKKyNlbmRpZgorc3RhdGljIGludCBsem9fcGNsb2NrX3JlYWRfY2xvY2sobHpvX3BjbG9ja19oYW5kbGVfcCBoLCBsem9fcGNsb2NrX3AgYykKK3sKKyAgICBjbG9ja190IHRpY2tzOworICAgIGRvdWJsZSBzZWNzOworI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorICAgIGx6b191aW50NjRsX3QgbnNlY3M7CisgICAgdGlja3MgPSBjbG9jaygpOworICAgIHNlY3MgPSBMWk9fU1RBVElDX0NBU1QoZG91YmxlLCB0aWNrcykgLyAoQ0xPQ0tTX1BFUl9TRUMpOworICAgIG5zZWNzID0gTFpPX1NUQVRJQ19DQVNUKGx6b191aW50NjRsX3QsIChzZWNzICogMTAwMDAwMDAwMC4wKSk7CisgICAgYy0+dHZfc2VjID0gTFpPX1NUQVRJQ19DQVNUKGx6b19pbnQ2NGxfdCwgKG5zZWNzIC8gMTAwMDAwMDAwMHVsKSk7CisgICAgbnNlY3MgPSAobnNlY3MgJSAxMDAwMDAwMDAwdWwpOworICAgIGMtPnR2X25zZWMgPSBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmxfdCwgbnNlY3MpOworI2Vsc2UKKyAgICB0aWNrcyA9IGNsb2NrKCk7CisgICAgc2VjcyA9IExaT19TVEFUSUNfQ0FTVChkb3VibGUsIHRpY2tzKSAvIChDTE9DS1NfUEVSX1NFQyk7CisgICAgYy0+dHZfc2VjX2hpZ2ggPSAwOworICAgIGMtPnR2X3NlY19sb3cgPSBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmxfdCwgKHNlY3MgKyAwLjUpKTsKKyAgICBjLT50dl9uc2VjID0gMDsKKyNlbmRpZgorICAgIExaT19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgMSAmJiBkZWZpbmVkKGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lKQorI2lmbmRlZiBsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9tX3N5c2NhbGwKKyNkZWZpbmUgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfbV9zeXNjYWxsIGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX21fc3lzY2FsbAorI2VuZGlmCitzdGF0aWMgaW50IGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX21fc3lzY2FsbChsem9fcGNsb2NrX2hhbmRsZV9wIGgsIGx6b19wY2xvY2tfcCBjKQoreworICAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgaWYgKGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lKDEsICZ0cykgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGMtPnR2X3NlYyA9IHRzLnR2X3NlYzsKKyAgICBjLT50dl9uc2VjID0gTFpPX1NUQVRJQ19DQVNUKGx6b191aW50MzJsX3QsIHRzLnR2X25zZWMpOworICAgIExaT19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgKExaT19PU19ET1MzMiAmJiBMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX0RKR1BQX18pICYmIGRlZmluZWQoVUNMT0NLU19QRVJfU0VDKSAmJiAhKExaT19DRkdfTk9fRE9VQkxFKQorI2lmbmRlZiBsem9fcGNsb2NrX3JlYWRfdWNsb2NrCisjZGVmaW5lIGx6b19wY2xvY2tfcmVhZF91Y2xvY2sgbHpvX3BjbG9ja19yZWFkX3VjbG9jaworI2VuZGlmCitzdGF0aWMgaW50IGx6b19wY2xvY2tfcmVhZF91Y2xvY2sobHpvX3BjbG9ja19oYW5kbGVfcCBoLCBsem9fcGNsb2NrX3AgYykKK3sKKyAgICBsem9fdWludDY0bF90IHRpY2tzOworICAgIGRvdWJsZSBzZWNzOworICAgIGx6b191aW50NjRsX3QgbnNlY3M7CisgICAgdGlja3MgPSB1Y2xvY2soKTsKKyAgICBzZWNzID0gTFpPX1NUQVRJQ19DQVNUKGRvdWJsZSwgdGlja3MpIC8gKFVDTE9DS1NfUEVSX1NFQyk7CisgICAgbnNlY3MgPSBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQ2NGxfdCwgKHNlY3MgKiAxMDAwMDAwMDAwLjApKTsKKyAgICBjLT50dl9zZWMgPSBuc2VjcyAvIDEwMDAwMDAwMDB1bDsKKyAgICBjLT50dl9uc2VjID0gTFpPX1NUQVRJQ19DQVNUKGx6b191aW50MzJsX3QsIChuc2VjcyAlIDEwMDAwMDAwMDB1bCkpOworICAgIExaT19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgMSAmJiAoSEFWRV9DTE9DS19HRVRUSU1FKSAmJiBkZWZpbmVkKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCkgJiYgZGVmaW5lZChsem9faW50NjRsX3QpCisjaWZuZGVmIGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3BfbGliYworI2RlZmluZSBsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9wX2xpYmMgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfcF9saWJjCisjZW5kaWYKK3N0YXRpYyBpbnQgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfcF9saWJjKGx6b19wY2xvY2tfaGFuZGxlX3AgaCwgbHpvX3BjbG9ja19wIGMpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJnRzKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYy0+dHZfc2VjID0gdHMudHZfc2VjOworICAgIGMtPnR2X25zZWMgPSBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmxfdCwgdHMudHZfbnNlYyk7CisgICAgTFpPX1VOVVNFRChoKTsgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNpZiAxICYmIGRlZmluZWQobHpvX3BjbG9ja19zeXNjYWxsX2Nsb2NrX2dldHRpbWUpCisjaWZuZGVmIGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3Bfc3lzY2FsbAorI2RlZmluZSBsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9wX3N5c2NhbGwgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfcF9zeXNjYWxsCisjZW5kaWYKK3N0YXRpYyBpbnQgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfcF9zeXNjYWxsKGx6b19wY2xvY2tfaGFuZGxlX3AgaCwgbHpvX3BjbG9ja19wIGMpCit7CisgICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICBpZiAobHpvX3BjbG9ja19zeXNjYWxsX2Nsb2NrX2dldHRpbWUoMiwgJnRzKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYy0+dHZfc2VjID0gdHMudHZfc2VjOworICAgIGMtPnR2X25zZWMgPSBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmxfdCwgdHMudHZfbnNlYyk7CisgICAgTFpPX1VOVVNFRChoKTsgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNpZiAoTFpPX09TX0NZR1dJTiB8fCBMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0KSAmJiAoTFpPX0hBVkVfV0lORE9XU19IKSAmJiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKKyNpZm5kZWYgbHpvX3BjbG9ja19yZWFkX2dldHByb2Nlc3N0aW1lcworI2RlZmluZSBsem9fcGNsb2NrX3JlYWRfZ2V0cHJvY2Vzc3RpbWVzIGx6b19wY2xvY2tfcmVhZF9nZXRwcm9jZXNzdGltZXMKKyNlbmRpZgorc3RhdGljIGludCBsem9fcGNsb2NrX3JlYWRfZ2V0cHJvY2Vzc3RpbWVzKGx6b19wY2xvY2tfaGFuZGxlX3AgaCwgbHpvX3BjbG9ja19wIGMpCit7CisgICAgRklMRVRJTUUgY3QsIGV0LCBrdCwgdXQ7CisgICAgbHpvX3VpbnQ2NGxfdCB0aWNrczsKKyAgICBpZiAoR2V0UHJvY2Vzc1RpbWVzKEdldEN1cnJlbnRQcm9jZXNzKCksICZjdCwgJmV0LCAma3QsICZ1dCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHRpY2tzID0gKExaT19TVEFUSUNfQ0FTVChsem9fdWludDY0bF90LCB1dC5kd0hpZ2hEYXRlVGltZSkgPDwgMzIpIHwgdXQuZHdMb3dEYXRlVGltZTsKKyAgICBpZiBfX2x6b191bmxpa2VseShoLT50aWNrc19iYXNlID09IDApCisgICAgICAgIGgtPnRpY2tzX2Jhc2UgPSB0aWNrczsKKyAgICBlbHNlCisgICAgICAgIHRpY2tzIC09IGgtPnRpY2tzX2Jhc2U7CisgICAgYy0+dHZfc2VjID0gTFpPX1NUQVRJQ19DQVNUKGx6b19pbnQ2NGxfdCwgKHRpY2tzIC8gMTAwMDAwMDB1bCkpOworICAgIHRpY2tzID0gKHRpY2tzICUgMTAwMDAwMDB1bCkgKiAxMDB1OworICAgIGMtPnR2X25zZWMgPSBMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQzMmxfdCwgdGlja3MpOworICAgIExaT19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgKEhBVkVfR0VUUlVTQUdFKSAmJiBkZWZpbmVkKFJVU0FHRV9TRUxGKQorI2lmbmRlZiBsem9fcGNsb2NrX3JlYWRfZ2V0cnVzYWdlCisjZGVmaW5lIGx6b19wY2xvY2tfcmVhZF9nZXRydXNhZ2UgbHpvX3BjbG9ja19yZWFkX2dldHJ1c2FnZQorI2VuZGlmCitzdGF0aWMgaW50IGx6b19wY2xvY2tfcmVhZF9nZXRydXNhZ2UobHpvX3BjbG9ja19oYW5kbGVfcCBoLCBsem9fcGNsb2NrX3AgYykKK3sKKyAgICBzdHJ1Y3QgcnVzYWdlIHJ1OworICAgIGlmIChnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorICAgIGMtPnR2X3NlYyA9IHJ1LnJ1X3V0aW1lLnR2X3NlYzsKKyNlbHNlCisgICAgYy0+dHZfc2VjX2hpZ2ggPSAwOworICAgIGMtPnR2X3NlY19sb3cgPSBydS5ydV91dGltZS50dl9zZWM7CisjZW5kaWYKKyAgICBjLT50dl9uc2VjID0gTFpPX1NUQVRJQ19DQVNUKGx6b191aW50MzJsX3QsIChydS5ydV91dGltZS50dl91c2VjICogMTAwMHUpKTsKKyAgICBMWk9fVU5VU0VEKGgpOyByZXR1cm4gMDsKK30KKyNlbmRpZgorI2lmIDEgJiYgKEhBVkVfQ0xPQ0tfR0VUVElNRSkgJiYgZGVmaW5lZChDTE9DS19USFJFQURfQ1BVVElNRV9JRCkgJiYgZGVmaW5lZChsem9faW50NjRsX3QpCisjaWZuZGVmIGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3RfbGliYworI2RlZmluZSBsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV90X2xpYmMgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfdF9saWJjCisjZW5kaWYKK3N0YXRpYyBpbnQgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfdF9saWJjKGx6b19wY2xvY2tfaGFuZGxlX3AgaCwgbHpvX3BjbG9ja19wIGMpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELCAmdHMpICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBjLT50dl9zZWMgPSB0cy50dl9zZWM7CisgICAgYy0+dHZfbnNlYyA9IChsem9fdWludDMybF90KSB0cy50dl9uc2VjOworICAgIExaT19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgMSAmJiBkZWZpbmVkKGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lKQorI2lmbmRlZiBsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV90X3N5c2NhbGwKKyNkZWZpbmUgbHpvX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfdF9zeXNjYWxsIGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3Rfc3lzY2FsbAorI2VuZGlmCitzdGF0aWMgaW50IGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3Rfc3lzY2FsbChsem9fcGNsb2NrX2hhbmRsZV9wIGgsIGx6b19wY2xvY2tfcCBjKQoreworICAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgaWYgKGx6b19wY2xvY2tfc3lzY2FsbF9jbG9ja19nZXR0aW1lKDMsICZ0cykgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGMtPnR2X3NlYyA9IHRzLnR2X3NlYzsKKyAgICBjLT50dl9uc2VjID0gTFpPX1NUQVRJQ19DQVNUKGx6b191aW50MzJsX3QsIHRzLnR2X25zZWMpOworICAgIExaT19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgKExaT19PU19DWUdXSU4gfHwgTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkgJiYgKExaT19IQVZFX1dJTkRPV1NfSCkgJiYgZGVmaW5lZChsem9faW50NjRsX3QpCisjaWZuZGVmIGx6b19wY2xvY2tfcmVhZF9nZXR0aHJlYWR0aW1lcworI2RlZmluZSBsem9fcGNsb2NrX3JlYWRfZ2V0dGhyZWFkdGltZXMgbHpvX3BjbG9ja19yZWFkX2dldHRocmVhZHRpbWVzCisjZW5kaWYKK3N0YXRpYyBpbnQgbHpvX3BjbG9ja19yZWFkX2dldHRocmVhZHRpbWVzKGx6b19wY2xvY2tfaGFuZGxlX3AgaCwgbHpvX3BjbG9ja19wIGMpCit7CisgICAgRklMRVRJTUUgY3QsIGV0LCBrdCwgdXQ7CisgICAgbHpvX3VpbnQ2NGxfdCB0aWNrczsKKyAgICBpZiAoR2V0VGhyZWFkVGltZXMoR2V0Q3VycmVudFRocmVhZCgpLCAmY3QsICZldCwgJmt0LCAmdXQpID09IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICB0aWNrcyA9IChMWk9fU1RBVElDX0NBU1QobHpvX3VpbnQ2NGxfdCwgdXQuZHdIaWdoRGF0ZVRpbWUpIDw8IDMyKSB8IHV0LmR3TG93RGF0ZVRpbWU7CisgICAgaWYgX19sem9fdW5saWtlbHkoaC0+dGlja3NfYmFzZSA9PSAwKQorICAgICAgICBoLT50aWNrc19iYXNlID0gdGlja3M7CisgICAgZWxzZQorICAgICAgICB0aWNrcyAtPSBoLT50aWNrc19iYXNlOworICAgIGMtPnR2X3NlYyA9IExaT19TVEFUSUNfQ0FTVChsem9faW50NjRsX3QsICh0aWNrcyAvIDEwMDAwMDAwdWwpKTsKKyAgICB0aWNrcyA9ICh0aWNrcyAlIDEwMDAwMDAwdWwpICogMTAwdTsKKyAgICBjLT50dl9uc2VjID0gTFpPX1NUQVRJQ19DQVNUKGx6b191aW50MzJsX3QsIHRpY2tzKTsKKyAgICBMWk9fVU5VU0VEKGgpOyByZXR1cm4gMDsKK30KKyNlbmRpZgorTFpPTElCX1BVQkxJQyhpbnQsIGx6b19wY2xvY2tfb3BlbikgKGx6b19wY2xvY2tfaGFuZGxlX3AgaCwgaW50IG1vZGUpCit7CisgICAgbHpvX3BjbG9ja190IGM7CisgICAgaW50IGk7CisgICAgaC0+aCA9IExaT19TVEFUSUNfQ0FTVChsem9saWJfaGFuZGxlX3QsIDApOworICAgIGgtPm1vZGUgPSAtMTsKKyAgICBoLT5yZWFkX2Vycm9yID0gMjsKKyAgICBoLT5uYW1lID0gTlVMTDsKKyAgICBoLT5nZXR0aW1lID0gTFpPX1NUQVRJQ19DQVNUKGx6b19wY2xvY2tfZ2V0dGltZV90LCAwKTsKKyNpZiBkZWZpbmVkKGx6b19pbnQ2NGxfdCkKKyAgICBoLT50aWNrc19iYXNlID0gMDsKKyNlbmRpZgorICAgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgY2FzZSBMWk9fUENMT0NLX1JFQUxUSU1FOgorIyAgICAgaWYgZGVmaW5lZChsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9yX3N5c2NhbGwpCisgICAgICAgIGlmIChsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9yX3N5c2NhbGwoaCwgJmMpID09IDApIHsKKyAgICAgICAgICAgIGgtPmdldHRpbWUgPSBsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9yX3N5c2NhbGw7CisgICAgICAgICAgICBoLT5uYW1lID0gIkNMT0NLX1JFQUxUSU1FL3N5c2NhbGwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyMgICAgIGVuZGlmCisjICAgICBpZiBkZWZpbmVkKGx6b19wY2xvY2tfcmVhZF9nZXR0aW1lb2ZkYXkpCisgICAgICAgIGlmIChsem9fcGNsb2NrX3JlYWRfZ2V0dGltZW9mZGF5KGgsICZjKSA9PSAwKSB7CisgICAgICAgICAgICBoLT5nZXR0aW1lID0gbHpvX3BjbG9ja19yZWFkX2dldHRpbWVvZmRheTsKKyAgICAgICAgICAgIGgtPm5hbWUgPSAiZ2V0dGltZW9mZGF5IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjICAgICBlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIExaT19QQ0xPQ0tfTU9OT1RPTklDOgorIyAgICAgaWYgZGVmaW5lZChsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9tX3N5c2NhbGwpCisgICAgICAgIGlmIChsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9tX3N5c2NhbGwoaCwgJmMpID09IDApIHsKKyAgICAgICAgICAgIGgtPmdldHRpbWUgPSBsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9tX3N5c2NhbGw7CisgICAgICAgICAgICBoLT5uYW1lID0gIkNMT0NLX01PTk9UT05JQy9zeXNjYWxsIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjICAgICBlbmRpZgorIyAgICAgaWYgZGVmaW5lZChsem9fcGNsb2NrX3JlYWRfdWNsb2NrKQorICAgICAgICBpZiAobHpvX3BjbG9ja19yZWFkX3VjbG9jayhoLCAmYykgPT0gMCkgeworICAgICAgICAgICAgaC0+Z2V0dGltZSA9IGx6b19wY2xvY2tfcmVhZF91Y2xvY2s7CisgICAgICAgICAgICBoLT5uYW1lID0gInVjbG9jayI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorIyAgICAgZW5kaWYKKyMgICAgIGlmIGRlZmluZWQobHpvX3BjbG9ja19yZWFkX2Nsb2NrKQorICAgICAgICBpZiAobHpvX3BjbG9ja19yZWFkX2Nsb2NrKGgsICZjKSA9PSAwKSB7CisgICAgICAgICAgICBoLT5nZXR0aW1lID0gbHpvX3BjbG9ja19yZWFkX2Nsb2NrOworICAgICAgICAgICAgaC0+bmFtZSA9ICJjbG9jayI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorIyAgICAgZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMWk9fUENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRDoKKyMgICAgIGlmIGRlZmluZWQobHpvX3BjbG9ja19yZWFkX2dldHByb2Nlc3N0aW1lcykKKyAgICAgICAgaWYgKGx6b19wY2xvY2tfcmVhZF9nZXRwcm9jZXNzdGltZXMoaCwgJmMpID09IDApIHsKKyAgICAgICAgICAgIGgtPmdldHRpbWUgPSBsem9fcGNsb2NrX3JlYWRfZ2V0cHJvY2Vzc3RpbWVzOworICAgICAgICAgICAgaC0+bmFtZSA9ICJHZXRQcm9jZXNzVGltZXMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyMgICAgIGVuZGlmCisjICAgICBpZiBkZWZpbmVkKGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3Bfc3lzY2FsbCkKKyAgICAgICAgaWYgKGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3Bfc3lzY2FsbChoLCAmYykgPT0gMCkgeworICAgICAgICAgICAgaC0+Z2V0dGltZSA9IGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3Bfc3lzY2FsbDsKKyAgICAgICAgICAgIGgtPm5hbWUgPSAiQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEL3N5c2NhbGwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyMgICAgIGVuZGlmCisjICAgICBpZiBkZWZpbmVkKGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3BfbGliYykKKyAgICAgICAgaWYgKGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3BfbGliYyhoLCAmYykgPT0gMCkgeworICAgICAgICAgICAgaC0+Z2V0dGltZSA9IGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3BfbGliYzsKKyAgICAgICAgICAgIGgtPm5hbWUgPSAiQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEL2xpYmMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyMgICAgIGVuZGlmCisjICAgICBpZiBkZWZpbmVkKGx6b19wY2xvY2tfcmVhZF9nZXRydXNhZ2UpCisgICAgICAgIGlmIChsem9fcGNsb2NrX3JlYWRfZ2V0cnVzYWdlKGgsICZjKSA9PSAwKSB7CisgICAgICAgICAgICBoLT5nZXR0aW1lID0gbHpvX3BjbG9ja19yZWFkX2dldHJ1c2FnZTsKKyAgICAgICAgICAgIGgtPm5hbWUgPSAiZ2V0cnVzYWdlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjICAgICBlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIExaT19QQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQ6CisjICAgICBpZiBkZWZpbmVkKGx6b19wY2xvY2tfcmVhZF9nZXR0aHJlYWR0aW1lcykKKyAgICAgICAgaWYgKGx6b19wY2xvY2tfcmVhZF9nZXR0aHJlYWR0aW1lcyhoLCAmYykgPT0gMCkgeworICAgICAgICAgICAgaC0+Z2V0dGltZSA9IGx6b19wY2xvY2tfcmVhZF9nZXR0aHJlYWR0aW1lczsKKyAgICAgICAgICAgIGgtPm5hbWUgPSAiR2V0VGhyZWFkVGltZXMiOworICAgICAgICB9CisjICAgICBlbmRpZgorIyAgICAgaWYgZGVmaW5lZChsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV90X3N5c2NhbGwpCisgICAgICAgIGlmIChsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV90X3N5c2NhbGwoaCwgJmMpID09IDApIHsKKyAgICAgICAgICAgIGgtPmdldHRpbWUgPSBsem9fcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV90X3N5c2NhbGw7CisgICAgICAgICAgICBoLT5uYW1lID0gIkNMT0NLX1RIUkVBRF9DUFVUSU1FX0lEL3N5c2NhbGwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyMgICAgIGVuZGlmCisjICAgICBpZiBkZWZpbmVkKGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3RfbGliYykKKyAgICAgICAgaWYgKGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3RfbGliYyhoLCAmYykgPT0gMCkgeworICAgICAgICAgICAgaC0+Z2V0dGltZSA9IGx6b19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3RfbGliYzsKKyAgICAgICAgICAgIGgtPm5hbWUgPSAiQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQvbGliYyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorIyAgICAgZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghaC0+Z2V0dGltZSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghaC0+aCkKKyAgICAgICAgaC0+aCA9IExaT19TVEFUSUNfQ0FTVChsem9saWJfaGFuZGxlX3QsIDEpOworICAgIGgtPm1vZGUgPSBtb2RlOworICAgIGgtPnJlYWRfZXJyb3IgPSAwOworICAgIGlmICghaC0+bmFtZSkKKyAgICAgICAgaC0+bmFtZSA9ICJ1bmtub3duIjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBfX0xaT0xJQl9GVU5DTkFNRShsem9fcGNsb2NrX3JlYWQpKGgsICZjKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CitMWk9MSUJfUFVCTElDKGludCwgbHpvX3BjbG9ja19vcGVuX2RlZmF1bHQpIChsem9fcGNsb2NrX2hhbmRsZV9wIGgpCit7CisgICAgaWYgKF9fTFpPTElCX0ZVTkNOQU1FKGx6b19wY2xvY2tfb3BlbikoaCwgTFpPX1BDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChfX0xaT0xJQl9GVU5DTkFNRShsem9fcGNsb2NrX29wZW4pKGgsIExaT19QQ0xPQ0tfTU9OT1RPTklDKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoX19MWk9MSUJfRlVOQ05BTUUobHpvX3BjbG9ja19vcGVuKShoLCBMWk9fUENMT0NLX1JFQUxUSU1FKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoX19MWk9MSUJfRlVOQ05BTUUobHpvX3BjbG9ja19vcGVuKShoLCBMWk9fUENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7Cit9CitMWk9MSUJfUFVCTElDKGludCwgbHpvX3BjbG9ja19jbG9zZSkgKGx6b19wY2xvY2tfaGFuZGxlX3AgaCkKK3sKKyAgICBoLT5oID0gTFpPX1NUQVRJQ19DQVNUKGx6b2xpYl9oYW5kbGVfdCwgMCk7CisgICAgaC0+bW9kZSA9IC0xOworICAgIGgtPm5hbWUgPSBOVUxMOworICAgIGgtPmdldHRpbWUgPSBMWk9fU1RBVElDX0NBU1QobHpvX3BjbG9ja19nZXR0aW1lX3QsIDApOworICAgIHJldHVybiAwOworfQorTFpPTElCX1BVQkxJQyh2b2lkLCBsem9fcGNsb2NrX3JlYWQpIChsem9fcGNsb2NrX2hhbmRsZV9wIGgsIGx6b19wY2xvY2tfcCBjKQoreworICAgIGlmIChoLT5nZXR0aW1lKSB7CisgICAgICAgIGlmIChoLT5nZXR0aW1lKGgsIGMpID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIGgtPnJlYWRfZXJyb3IgPSAxOworI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorICAgIGMtPnR2X3NlYyA9IDA7CisjZWxzZQorICAgIGMtPnR2X3NlY19oaWdoID0gMDsKKyAgICBjLT50dl9zZWNfbG93ID0gMDsKKyNlbmRpZgorICAgIGMtPnR2X25zZWMgPSAwOworfQorI2lmICEoTFpPX0NGR19OT19ET1VCTEUpCitMWk9MSUJfUFVCTElDKGRvdWJsZSwgbHpvX3BjbG9ja19nZXRfZWxhcHNlZCkgKGx6b19wY2xvY2tfaGFuZGxlX3AgaCwgY29uc3QgbHpvX3BjbG9ja19wIHN0YXJ0LCBjb25zdCBsem9fcGNsb2NrX3Agc3RvcCkKK3sKKyAgICBpZiAoIWgtPmgpIHsgaC0+bW9kZSA9IC0xOyByZXR1cm4gMC4wOyB9CisgICAgeworI2lmIDEgJiYgKExaT19BUkNIX0kzODYgJiYgTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19TVFJJQ1RfQUxJR05NRU5UX18pCisgICAgZmxvYXQgdHN0b3AsIHRzdGFydDsKKyAgICB0c3RvcCAgPSBMWk9fU1RBVElDX0NBU1QoZmxvYXQsIChzdG9wLT50dl9zZWMgICsgc3RvcC0+dHZfbnNlYyAgLyAxMDAwMDAwMDAwLjApKTsKKyAgICB0c3RhcnQgPSBMWk9fU1RBVElDX0NBU1QoZmxvYXQsIChzdGFydC0+dHZfc2VjICsgc3RhcnQtPnR2X25zZWMgLyAxMDAwMDAwMDAwLjApKTsKKyNlbGlmIGRlZmluZWQobHpvX2ludDY0bF90KQorICAgIGRvdWJsZSB0c3RvcCwgdHN0YXJ0OworI2lmIDEgJiYgKExaT19DQ19JTlRFTEMpCisgICAgeyBsem9faW50NjRsX3QgYSA9IHN0b3AtPnR2X3NlYzsgbHpvX3VpbnQzMmxfdCBiID0gc3RvcC0+dHZfbnNlYzsKKyAgICB0c3RvcCA9IGEgKyBiIC8gMTAwMDAwMDAwMC4wOyB9CisgICAgeyBsem9faW50NjRsX3QgYSA9IHN0YXJ0LT50dl9zZWM7IGx6b191aW50MzJsX3QgYiA9IHN0YXJ0LT50dl9uc2VjOworICAgIHRzdGFydCA9IGEgKyBiIC8gMTAwMDAwMDAwMC4wOyB9CisjZWxzZQorICAgIHRzdG9wICA9IHN0b3AtPnR2X3NlYyAgKyBzdG9wLT50dl9uc2VjICAvIDEwMDAwMDAwMDAuMDsKKyAgICB0c3RhcnQgPSBzdGFydC0+dHZfc2VjICsgc3RhcnQtPnR2X25zZWMgLyAxMDAwMDAwMDAwLjA7CisjZW5kaWYKKyNlbHNlCisgICAgZG91YmxlIHRzdG9wLCB0c3RhcnQ7CisgICAgdHN0b3AgID0gc3RvcC0+dHZfc2VjX2xvdyAgKyBzdG9wLT50dl9uc2VjICAvIDEwMDAwMDAwMDAuMDsKKyAgICB0c3RhcnQgPSBzdGFydC0+dHZfc2VjX2xvdyArIHN0YXJ0LT50dl9uc2VjIC8gMTAwMDAwMDAwMC4wOworI2VuZGlmCisgICAgcmV0dXJuIHRzdG9wIC0gdHN0YXJ0OworICAgIH0KK30KKyNlbmRpZgorTFpPTElCX1BVQkxJQyhpbnQsIGx6b19wY2xvY2tfZmx1c2hfY3B1X2NhY2hlKSAobHpvX3BjbG9ja19oYW5kbGVfcCBoLCB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBMWk9fVU5VU0VEKGgpOyBMWk9fVU5VU0VEKGZsYWdzKTsKKyAgICByZXR1cm4gLTE7Cit9CisjaWYgZGVmaW5lZChfX0xaT0xJQl9QQ0xPQ0tfTkVFRF9XQVJOX1BPUCkKKyMgIGlmIChMWk9fQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMjAwKSkKKyMgICAgcHJhZ21hIHdhcm5pbmcocG9wKQorIyAgZWxzZQorIyAgICBlcnJvciAiX19MWk9MSUJfUENMT0NLX05FRURfV0FSTl9QT1AiCisjICBlbmRpZgorIyAgdW5kZWYgX19MWk9MSUJfUENMT0NLX05FRURfV0FSTl9QT1AKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChMWk9fV0FOVF9BQ0NMSUJfTUlTQykKKyMgIHVuZGVmIExaT19XQU5UX0FDQ0xJQl9NSVNDCisjZGVmaW5lIF9fTFpPTElCX01JU0NfQ0hfSU5DTFVERUQgMQorI2lmICFkZWZpbmVkKExaT0xJQl9QVUJMSUMpCisjICBkZWZpbmUgTFpPTElCX1BVQkxJQyhyLGYpICAgICAgICAgICAgICAgIHIgX19MWk9MSUJfRlVOQ05BTUUoZikKKyNlbmRpZgorI2lmICFkZWZpbmVkKExaT0xJQl9QVUJMSUNfTk9JTkxJTkUpCisjICBpZiAhZGVmaW5lZChfX2x6b19ub2lubGluZSkKKyMgICAgZGVmaW5lIExaT0xJQl9QVUJMSUNfTk9JTkxJTkUocixmKSAgICAgciBfX0xaT0xJQl9GVU5DTkFNRShmKQorIyAgZWxpZiAoTFpPX0NDX0NMQU5HIHx8IChMWk9fQ0NfR05VQyA+PSAweDAzMDQwMHVsKSB8fCBMWk9fQ0NfTExWTSkKKyMgICAgZGVmaW5lIExaT0xJQl9QVUJMSUNfTk9JTkxJTkUocixmKSAgICAgX19sem9fbm9pbmxpbmUgX19hdHRyaWJ1dGVfXygoX191c2VkX18pKSByIF9fTFpPTElCX0ZVTkNOQU1FKGYpCisjICBlbHNlCisjICAgIGRlZmluZSBMWk9MSUJfUFVCTElDX05PSU5MSU5FKHIsZikgICAgIF9fbHpvX25vaW5saW5lIHIgX19MWk9MSUJfRlVOQ05BTUUoZikKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoTFpPX09TX1dJTjMyICYmIExaT19DQ19QRUxMRVNDICYmIChfX1BPQ0NfXyA+PSAyOTApKQorIyAgcHJhZ21hIHdhcm4ocHVzaCkKKyMgIHByYWdtYSB3YXJuKGRpc2FibGU6MjAwNykKKyNlbmRpZgorTFpPTElCX1BVQkxJQyhjb25zdCBjaGFyICosIGx6b19nZXRlbnYpIChjb25zdCBjaGFyICpzKQoreworI2lmIChIQVZFX0dFVEVOVikKKyAgICByZXR1cm4gZ2V0ZW52KHMpOworI2Vsc2UKKyAgICBMWk9fVU5VU0VEKHMpOyByZXR1cm4gTFpPX1NUQVRJQ19DQVNUKGNvbnN0IGNoYXIgKiwgMCk7CisjZW5kaWYKK30KK0xaT0xJQl9QVUJMSUMobHpvX2ludHB0cl90LCBsem9fZ2V0X29zZmhhbmRsZSkgKGludCBmZCkKK3sKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisjaWYgKExaT19PU19DWUdXSU4pCisgICAgcmV0dXJuIGdldF9vc2ZoYW5kbGUoZmQpOworI2VsaWYgKExaT19PU19FTVggJiYgZGVmaW5lZChfX1JTWE5UX18pKQorICAgIHJldHVybiAtMTsKKyNlbGlmIChMWk9fT1NfV0lOMzIgJiYgTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19QVzMyX18pCisgICAgcmV0dXJuIC0xOworI2VsaWYgKExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpCisjIGlmIChMWk9fQ0NfUEVMTEVTQyAmJiAoX19QT0NDX18gPCAyODApKQorICAgIHJldHVybiAtMTsKKyMgZWxpZiAoTFpPX0NDX1dBVENPTUMgJiYgKF9fV0FUQ09NQ19fIDwgMTAwMCkpCisgICAgcmV0dXJuIC0xOworIyBlbGlmIChMWk9fQ0NfV0FUQ09NQyAmJiAoX19XQVRDT01DX18gPCAxMTAwKSkKKyAgICByZXR1cm4gX29zX2hhbmRsZShmZCk7CisjIGVsc2UKKyAgICByZXR1cm4gX2dldF9vc2ZoYW5kbGUoZmQpOworIyBlbmRpZgorI2Vsc2UKKyAgICByZXR1cm4gZmQ7CisjZW5kaWYKK30KK0xaT0xJQl9QVUJMSUMoaW50LCBsem9fc2V0X2Jpbm1vZGUpIChpbnQgZmQsIGludCBiaW5hcnkpCit7CisjaWYgKExaT19BUkNIX002OEsgJiYgTFpPX09TX1RPUyAmJiBMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX01JTlRfXykKKyAgICBGSUxFKiBmcDsgaW50IG9sZF9iaW5hcnk7CisgICAgaWYgKGZkID09IFNURElOX0ZJTEVOTykgZnAgPSBzdGRpbjsKKyAgICBlbHNlIGlmIChmZCA9PSBTVERPVVRfRklMRU5PKSBmcCA9IHN0ZG91dDsKKyAgICBlbHNlIGlmIChmZCA9PSBTVERFUlJfRklMRU5PKSBmcCA9IHN0ZGVycjsKKyAgICBlbHNlIHJldHVybiAtMTsKKyAgICBvbGRfYmluYXJ5ID0gZnAtPl9fbW9kZS5fX2JpbmFyeTsKKyAgICBfX3NldF9iaW5tb2RlKGZwLCBiaW5hcnkgPyAxIDogMCk7CisgICAgcmV0dXJuIG9sZF9iaW5hcnkgPyAxIDogMDsKKyNlbGlmIChMWk9fQVJDSF9NNjhLICYmIExaT19PU19UT1MpCisgICAgTFpPX1VOVVNFRChmZCk7IExaT19VTlVTRUQoYmluYXJ5KTsKKyAgICByZXR1cm4gLTE7CisjZWxpZiAoTFpPX09TX0RPUzE2ICYmIChMWk9fQ0NfQVpURUNDIHx8IExaT19DQ19QQUNJRklDQykpCisgICAgTFpPX1VOVVNFRChmZCk7IExaT19VTlVTRUQoYmluYXJ5KTsKKyAgICByZXR1cm4gLTE7CisjZWxpZiAoTFpPX09TX0RPUzMyICYmIExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fREpHUFBfXykKKyAgICBpbnQgcjsgdW5zaWduZWQgb2xkX2ZsYWdzID0gX19kamdwcF9od2ludF9mbGFnczsKKyAgICBMWk9fQ09NUElMRV9USU1FX0FTU0VSVChPX0JJTkFSWSA+IDApCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoT19URVhUID4gMCkKKyAgICBpZiAoZmQgPCAwKSByZXR1cm4gLTE7CisgICAgciA9IHNldG1vZGUoZmQsIGJpbmFyeSA/IE9fQklOQVJZIDogT19URVhUKTsKKyAgICBpZiAoKG9sZF9mbGFncyAmIDF1KSAhPSAoX19kamdwcF9od2ludF9mbGFncyAmIDF1KSkKKyAgICAgICAgX19kamdwcF9zZXRfY3RybF9jKCEob2xkX2ZsYWdzICYgMSkpOworICAgIGlmIChyID09IC0xKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIChyICYgT19URVhUKSA/IDAgOiAxOworI2VsaWYgKExaT19PU19XSU4zMiAmJiBMWk9fQ0NfR05VQykgJiYgZGVmaW5lZChfX1BXMzJfXykKKyAgICBpZiAoZmQgPCAwKSByZXR1cm4gLTE7CisgICAgTFpPX1VOVVNFRChiaW5hcnkpOworICAgIHJldHVybiAxOworI2VsaWYgKExaT19PU19ET1MzMiAmJiBMWk9fQ0NfSElHSEMpCisgICAgRklMRSogZnA7IGludCByOworICAgIGlmIChmZCA9PSBmaWxlbm8oc3RkaW4pKSBmcCA9IHN0ZGluOworICAgIGVsc2UgaWYgKGZkID09IGZpbGVubyhzdGRvdXQpKSBmcCA9IHN0ZG91dDsKKyAgICBlbHNlIGlmIChmZCA9PSBmaWxlbm8oc3RkZXJyKSkgZnAgPSBzdGRlcnI7CisgICAgZWxzZSByZXR1cm4gLTE7CisgICAgciA9IF9zZXRtb2RlKGZwLCBiaW5hcnkgPyBfQklOQVJZIDogX1RFWFQpOworICAgIGlmIChyID09IC0xKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIChyICYgX0JJTkFSWSkgPyAxIDogMDsKKyNlbGlmIChMWk9fT1NfV0lOMzIgJiYgTFpPX0NDX01XRVJLUykgJiYgZGVmaW5lZChfX01TTF9fKQorICAgIExaT19VTlVTRUQoZmQpOyBMWk9fVU5VU0VEKGJpbmFyeSk7CisgICAgcmV0dXJuIC0xOworI2VsaWYgKExaT19PU19DWUdXSU4gJiYgKExaT19DQ19HTlVDIDwgMHgwMjVhMDB1bCkpCisgICAgTFpPX1VOVVNFRChmZCk7IExaT19VTlVTRUQoYmluYXJ5KTsKKyAgICByZXR1cm4gLTE7CisjZWxpZiAoTFpPX09TX0NZR1dJTiB8fCBMWk9fT1NfRE9TMTYgfHwgTFpPX09TX0RPUzMyIHx8IExaT19PU19FTVggfHwgTFpPX09TX09TMiB8fCBMWk9fT1NfT1MyMTYgfHwgTFpPX09TX1dJTjE2IHx8IExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpCisgICAgaW50IHI7CisjaWYgIShMWk9fQ0NfWk9SVEVDSEMpCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoT19CSU5BUlkgPiAwKQorI2VuZGlmCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoT19URVhUID4gMCkKKyAgICBpZiAoZmQgPCAwKSByZXR1cm4gLTE7CisgICAgciA9IHNldG1vZGUoZmQsIGJpbmFyeSA/IE9fQklOQVJZIDogT19URVhUKTsKKyAgICBpZiAociA9PSAtMSkgcmV0dXJuIC0xOworICAgIHJldHVybiAociAmIE9fVEVYVCkgPyAwIDogMTsKKyNlbHNlCisgICAgaWYgKGZkIDwgMCkgcmV0dXJuIC0xOworICAgIExaT19VTlVTRUQoYmluYXJ5KTsKKyAgICByZXR1cm4gMTsKKyNlbmRpZgorfQorTFpPTElCX1BVQkxJQyhpbnQsIGx6b19pc2F0dHkpIChpbnQgZmQpCit7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYgKExaT19PU19ET1MxNiAmJiAhKExaT19DQ19BWlRFQ0MpKQorICAgIHsKKyAgICAgICAgdW5pb24gUkVHUyByaSwgcm87CisgICAgICAgIHJpLnguYXggPSAweDQ0MDA7IHJpLnguYnggPSBmZDsKKyAgICAgICAgaW50ODYoMHgyMSwgJnJpLCAmcm8pOworICAgICAgICBpZiAoKHJvLnguY2ZsYWcgJiAxKSA9PSAwKQorICAgICAgICAgICAgaWYgKChyby54LmF4ICYgMHg4MykgIT0gMHg4MykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisjZWxpZiAoTFpPX09TX0RPUzMyICYmIExaT19DQ19XQVRDT01DKQorICAgIHsKKyAgICAgICAgdW5pb24gUkVHUyByaSwgcm87CisgICAgICAgIHJpLncuYXggPSAweDQ0MDA7IHJpLncuYnggPSBMWk9fU1RBVElDX0NBU1QodW5zaWduZWQgc2hvcnQsIGZkKTsKKyAgICAgICAgaW50Mzg2KDB4MjEsICZyaSwgJnJvKTsKKyAgICAgICAgaWYgKChyby53LmNmbGFnICYgMSkgPT0gMCkKKyAgICAgICAgICAgIGlmICgocm8udy5heCAmIDB4ODMpICE9IDB4ODMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VsaWYgKExaT19IQVZFX1dJTkRPV1NfSCkKKyAgICB7CisgICAgICAgIGx6b19pbnRwdHJfdCBoID0gX19MWk9MSUJfRlVOQ05BTUUobHpvX2dldF9vc2ZoYW5kbGUpKGZkKTsKKyAgICAgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoc2l6ZW9mKGgpID09IHNpemVvZihIQU5ETEUpKQorICAgICAgICBpZiAoaCAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgRFdPUkQgZCA9IDA7CisgICAgICAgICAgICBpZiAoR2V0Q29uc29sZU1vZGUoTFpPX1JFSU5URVJQUkVUX0NBU1QoSEFORExFLCBoKSwgJmQpID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyNpZiAoSEFWRV9JU0FUVFkpCisgICAgcmV0dXJuIChpc2F0dHkoZmQpKSA/IDEgOiAwOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorTFpPTElCX1BVQkxJQyhpbnQsIGx6b19ta2RpcikgKGNvbnN0IGNoYXIqIG5hbWUsIHVuc2lnbmVkIG1vZGUpCit7CisjaWYgIShIQVZFX01LRElSKQorICAgIExaT19VTlVTRUQobmFtZSk7IExaT19VTlVTRUQobW9kZSk7CisgICAgcmV0dXJuIC0xOworI2VsaWYgKExaT19BUkNIX002OEsgJiYgTFpPX09TX1RPUyAmJiAoTFpPX0NDX1BVUkVDIHx8IExaT19DQ19UVVJCT0MpKQorICAgIExaT19VTlVTRUQobW9kZSk7CisgICAgcmV0dXJuIERjcmVhdGUobmFtZSk7CisjZWxpZiAoTFpPX09TX0RPUzMyICYmIExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fREpHUFBfXykKKyAgICByZXR1cm4gbWtkaXIobmFtZSwgbW9kZSk7CisjZWxpZiAoTFpPX09TX1dJTjMyICYmIExaT19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fUFczMl9fKQorICAgIHJldHVybiBta2RpcihuYW1lLCBtb2RlKTsKKyNlbGlmICgoTFpPX09TX0RPUzE2IHx8IExaT19PU19ET1MzMikgJiYgKExaT19DQ19ISUdIQyB8fCBMWk9fQ0NfUEFDSUZJQ0MpKQorICAgIExaT19VTlVTRUQobW9kZSk7CisgICAgcmV0dXJuIG1rZGlyKExaT19VTkNPTlNUX0NBU1QoY2hhciAqLCBuYW1lKSk7CisjZWxpZiAoTFpPX09TX0RPUzE2IHx8IExaT19PU19ET1MzMiB8fCBMWk9fT1NfT1MyIHx8IExaT19PU19PUzIxNiB8fCBMWk9fT1NfV0lOMTYgfHwgTFpPX09TX1dJTjMyIHx8IExaT19PU19XSU42NCkKKyAgICBMWk9fVU5VU0VEKG1vZGUpOworICAgIHJldHVybiBta2RpcihuYW1lKTsKKyNlbGlmIChMWk9fQ0NfV0FUQ09NQykKKyAgICByZXR1cm4gbWtkaXIobmFtZSwgTFpPX1NUQVRJQ19DQVNUKG1vZGVfdCwgbW9kZSkpOworI2Vsc2UKKyAgICByZXR1cm4gbWtkaXIobmFtZSwgbW9kZSk7CisjZW5kaWYKK30KK0xaT0xJQl9QVUJMSUMoaW50LCBsem9fcm1kaXIpIChjb25zdCBjaGFyKiBuYW1lKQoreworI2lmICEoSEFWRV9STURJUikKKyAgICBMWk9fVU5VU0VEKG5hbWUpOworICAgIHJldHVybiAtMTsKKyNlbGlmICgoTFpPX09TX0RPUzE2IHx8IExaT19PU19ET1MzMikgJiYgKExaT19DQ19ISUdIQyB8fCBMWk9fQ0NfUEFDSUZJQ0MpKQorICAgIHJldHVybiBybWRpcihMWk9fVU5DT05TVF9DQVNUKGNoYXIgKiwgbmFtZSkpOworI2Vsc2UKKyAgICByZXR1cm4gcm1kaXIobmFtZSk7CisjZW5kaWYKK30KKyNpZiBkZWZpbmVkKGx6b19pbnQzMmVfdCkKK0xaT0xJQl9QVUJMSUMobHpvX2ludDMyZV90LCBsem9fbXVsZGl2MzJzKSAobHpvX2ludDMyZV90IGEsIGx6b19pbnQzMmVfdCBiLCBsem9faW50MzJlX3QgeCkKK3sKKyAgICBsem9faW50MzJlX3QgciA9IDA7CisgICAgaWYgX19sem9fbGlrZWx5KHggIT0gMCkKKyAgICB7CisjaWYgZGVmaW5lZChsem9faW50NjRsX3QpCisgICAgICAgIGx6b19pbnQ2NGxfdCByciA9IChMWk9fSUNPTlYobHpvX2ludDY0bF90LCBhKSAqIGIpIC8geDsKKyAgICAgICAgciA9IExaT19JVFJVTkMobHpvX2ludDMyZV90LCBycik7CisjZWxzZQorICAgICAgICBMWk9fVU5VU0VEKGEpOyBMWk9fVU5VU0VEKGIpOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiByOworfQorTFpPTElCX1BVQkxJQyhsem9fdWludDMyZV90LCBsem9fbXVsZGl2MzJ1KSAobHpvX3VpbnQzMmVfdCBhLCBsem9fdWludDMyZV90IGIsIGx6b191aW50MzJlX3QgeCkKK3sKKyAgICBsem9fdWludDMyZV90IHIgPSAwOworICAgIGlmIF9fbHpvX2xpa2VseSh4ICE9IDApCisgICAgeworI2lmIGRlZmluZWQobHpvX2ludDY0bF90KQorICAgICAgICBsem9fdWludDY0bF90IHJyID0gKExaT19JQ09OVihsem9fdWludDY0bF90LCBhKSAqIGIpIC8geDsKKyAgICAgICAgciA9IExaT19JVFJVTkMobHpvX3VpbnQzMmVfdCwgcnIpOworI2Vsc2UKKyAgICAgICAgTFpPX1VOVVNFRChhKTsgTFpPX1VOVVNFRChiKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gcjsKK30KKyNlbmRpZgorI2lmIDAKK0xaT0xJQl9QVUJMSUNfTk9JTkxJTkUoaW50LCBsem9fc3lzY2FsbF9jbG9ja19nZXR0aW1lKSAoaW50IGMpCit7Cit9CisjZW5kaWYKKyNpZiAoTFpPX09TX1dJTjE2KQorTFpPX0VYVEVSTl9DIHZvaWQgX19mYXIgX19wYXNjYWwgRGVidWdCcmVhayh2b2lkKTsKKyNlbmRpZgorTFpPTElCX1BVQkxJQ19OT0lOTElORSh2b2lkLCBsem9fZGVidWdfYnJlYWspICh2b2lkKQoreworI2lmIChMWk9fT1NfV0lOMTYpCisgICAgRGVidWdCcmVhaygpOworI2VsaWYgKExaT19BUkNIX0kwODYpCisjZWxpZiAoTFpPX09TX1dJTjY0KSAmJiAoTFpPX0hBVkVfV0lORE9XU19IKQorICAgIERlYnVnQnJlYWsoKTsKKyNlbGlmIChMWk9fQVJDSF9BTUQ2NCB8fCBMWk9fQVJDSF9JMzg2KSAmJiAoTFpPX0FTTV9TWU5UQVhfR05VQykKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50ICQzXG4iIDogOiBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDX01FTU9SWSk7CisjZWxpZiAoTFpPX0FSQ0hfSTM4NikgJiYgKExaT19BU01fU1lOVEFYX01TQykKKyAgICBfX2FzbSB7IGludCAzIH0KKyNlbGlmIChMWk9fT1NfV0lOMzIpICYmIChMWk9fSEFWRV9XSU5ET1dTX0gpCisgICAgRGVidWdCcmVhaygpOworI2Vsc2UKKyAgICB2b2xhdGlsZSBsem9faW50cHRyX3QgYSA9IC0xOworICAgICogTFpPX1NUQVRJQ19DQVNUKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiwgTFpPX1JFSU5URVJQUkVUX0NBU1Qodm9sYXRpbGUgdm9pZCAqLCBhKSkgPSB+MHVsOworI2VuZGlmCit9CitMWk9MSUJfUFVCTElDX05PSU5MSU5FKHZvaWQsIGx6b19kZWJ1Z19ub3ApICh2b2lkKQoreworfQorTFpPTElCX1BVQkxJQ19OT0lOTElORShpbnQsIGx6b19kZWJ1Z19hbGlnbl9jaGVja19xdWVyeSkgKHZvaWQpCit7CisjaWYgKExaT19BUkNIX0FNRDY0IHx8IExaT19BUkNIX0kzODYpICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorIyBpZiAoTFpPX0FSQ0hfQU1ENjQpCisgICAgbHpvX3VpbnQ2NGVfdCByID0gMDsKKyMgZWxzZQorICAgIHNpemVfdCByID0gMDsKKyMgZW5kaWYKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGZcbiBwb3AgJTBcbiIgOiAiPWEiIChyKSA6IF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0NfTUVNT1JZKTsKKyAgICByZXR1cm4gTFpPX0lDT05WKGludCwgKHIgPj4gMTgpICYgMSk7CisjZWxpZiAoTFpPX0FSQ0hfSTM4NikgJiYgKExaT19BU01fU1lOVEFYX01TQykKKyAgICB1bnNpZ25lZCBsb25nIHI7CisgICAgX19hc20geworICAgICAgICBwdXNoZgorICAgICAgICBwb3AgZWF4CisgICAgICAgIG1vdiByLGVheAorICAgIH0KKyAgICByZXR1cm4gTFpPX0lDT05WKGludCwgKHIgPj4gMTgpICYgMSk7CisjZWxzZQorICAgIHJldHVybiAtMTsKKyNlbmRpZgorfQorTFpPTElCX1BVQkxJQ19OT0lOTElORShpbnQsIGx6b19kZWJ1Z19hbGlnbl9jaGVja19lbmFibGUpIChpbnQgdikKK3sKKyNpZiAoTFpPX0FSQ0hfQU1ENjQpICYmIChMWk9fQVNNX1NZTlRBWF9HTlVDKQorICAgIGlmICh2KSB7CisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJwdXNoZlxuIG9ybCAkMjYyMTQ0LCglJXJzcClcbiBwb3BmXG4iIDogOiBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDX01FTU9SWSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hmXG4gYW5kbCAkLTI2MjE0NSwoJSVyc3ApXG4gcG9wZlxuIiA6IDogX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQ19NRU1PUlkpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyNlbGlmIChMWk9fQVJDSF9JMzg2KSAmJiAoTFpPX0FTTV9TWU5UQVhfR05VQykKKyAgICBpZiAodikgeworICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGZcbiBvcmwgJDI2MjE0NCwoJSVlc3ApXG4gcG9wZlxuIiA6IDogX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQ19NRU1PUlkpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJwdXNoZlxuIGFuZGwgJC0yNjIxNDUsKCUlZXNwKVxuIHBvcGZcbiIgOiA6IF9fTFpPX0FTTV9DTE9CQkVSX0xJU1RfQ0NfTUVNT1JZKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisjZWxpZiAoTFpPX0FSQ0hfSTM4NikgJiYgKExaT19BU01fU1lOVEFYX01TQykKKyAgICBpZiAodikgeyBfX2FzbSB7CisgICAgICAgIHB1c2hmCisgICAgICAgIG9yIGR3b3JkIHB0ciBbZXNwXSwyNjIxNDQKKyAgICAgICAgcG9wZgorICAgIH19IGVsc2UgeyBfX2FzbSB7CisgICAgICAgIHB1c2hmCisgICAgICAgIGFuZCBkd29yZCBwdHIgW2VzcF0sLTI2MjE0NQorICAgICAgICBwb3BmCisgICAgfX0KKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgTFpPX1VOVVNFRCh2KTsgcmV0dXJuIC0xOworI2VuZGlmCit9CitMWk9MSUJfUFVCTElDX05PSU5MSU5FKHVuc2lnbmVkLCBsem9fZGVidWdfcnVubmluZ19vbl9xZW11KSAodm9pZCkKK3sKKyAgICB1bnNpZ25lZCByID0gMDsKKyNpZiAoTFpPX09TX1BPU0lYX0xJTlVYIHx8IExaT19PU19XSU4zMiB8fCBMWk9fT1NfV0lONjQpCisgICAgY29uc3QgY2hhciogcDsKKyAgICBwID0gX19MWk9MSUJfRlVOQ05BTUUobHpvX2dldGVudikoTFpPX1BQX1NUUklOR0laRShMWk9fRU5WX1JVTk5JTkdfT05fUUVNVSkpOworICAgIGlmIChwKSB7CisgICAgICAgIGlmIChwWzBdID09IDApIHIgPSAwOworICAgICAgICBlbHNlIGlmICgocFswXSA+PSAnMCcgJiYgcFswXSA8PSAnOScpICYmIHBbMV0gPT0gMCkgciA9IExaT19JQ0FTVCh1bnNpZ25lZCwgcFswXSkgLSAnMCc7CisgICAgICAgIGVsc2UgciA9IDE7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHI7Cit9CitMWk9MSUJfUFVCTElDX05PSU5MSU5FKHVuc2lnbmVkLCBsem9fZGVidWdfcnVubmluZ19vbl92YWxncmluZCkgKHZvaWQpCit7CisjaWYgKExaT19BUkNIX0FNRDY0ICYmIExaT19BQklfSUxQMzIpCisgICAgcmV0dXJuIDA7CisjZWxpZiAoTFpPX0FSQ0hfQU1ENjQgfHwgTFpPX0FSQ0hfSTM4NikgJiYgKExaT19BU01fU1lOVEFYX0dOVUMpCisgICAgdm9sYXRpbGUgc2l6ZV90IGFbNl07CisgICAgc2l6ZV90IHIgPSAwOworICAgIGFbMF0gPSAweDEwMDE7IGFbMV0gPSAwOyBhWzJdID0gMDsgYVszXSA9IDA7IGFbNF0gPSAwOyBhWzVdID0gMDsKKyMgIGlmIChMWk9fQVJDSF9BTUQ2NCkKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLmJ5dGUgMHg0OCwweGMxLDB4YzcsMHgwMywweDQ4LDB4YzEsMHhjNywweDBkLDB4NDgsMHhjMSwweGM3LDB4M2QsMHg0OCwweGMxLDB4YzcsMHgzMywweDQ4LDB4ODcsMHhkYlxuIiA6ICI9ZCIgKHIpIDogImEiICgmYVswXSksICJkIiAocikgX19MWk9fQVNNX0NMT0JCRVJfTElTVF9DQ19NRU1PUlkpOworIyAgZWxpZiAoTFpPX0FSQ0hfSTM4NikKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLmJ5dGUgMHhjMSwweGM3LDB4MDMsMHhjMSwweGM3LDB4MGQsMHhjMSwweGM3LDB4MWQsMHhjMSwweGM3LDB4MTMsMHg4NywweGRiXG4iIDogIj1kIiAocikgOiAiYSIgKCZhWzBdKSwgImQiIChyKSBfX0xaT19BU01fQ0xPQkJFUl9MSVNUX0NDX01FTU9SWSk7CisjICBlbmRpZgorICAgIHJldHVybiBMWk9fSVRSVU5DKHVuc2lnbmVkLCByKTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKyNpZiAoTFpPX09TX1dJTjMyICYmIExaT19DQ19QRUxMRVNDICYmIChfX1BPQ0NfXyA+PSAyOTApKQorIyAgcHJhZ21hIHdhcm4ocG9wKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKExaT19XQU5UX0FDQ0xJQl9XSUxEQVJHVikKKyMgIHVuZGVmIExaT19XQU5UX0FDQ0xJQl9XSUxEQVJHVgorI2RlZmluZSBfX0xaT0xJQl9XSUxEQVJHVl9DSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoTFpPTElCX1BVQkxJQykKKyMgIGRlZmluZSBMWk9MSUJfUFVCTElDKHIsZikgICAgciBfX0xaT0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCisjaWYgKExaT19PU19ET1MxNiB8fCBMWk9fT1NfT1MyMTYgfHwgTFpPX09TX1dJTjE2KQorI2lmIDAgJiYgKExaT19DQ19NU0MpCitMWk9fRVhURVJOX0MgaW50IF9fbHpvX2NkZWNsIF9fc2V0YXJndih2b2lkKTsKK0xaT19FWFRFUk5fQyBpbnQgX19sem9fY2RlY2wgX3NldGFyZ3Yodm9pZCk7CitMWk9fRVhURVJOX0MgaW50IF9fbHpvX2NkZWNsIF9zZXRhcmd2KHZvaWQpIHsgcmV0dXJuIF9fc2V0YXJndigpOyB9CisjZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fT1NfV0lOMzIgfHwgTFpPX09TX1dJTjY0KQorI2lmIChMWk9fQ0NfSU5URUxDIHx8IExaT19DQ19NU0MpCitMWk9fRVhURVJOX0MgaW50IF9fbHpvX2NkZWNsIF9fc2V0YXJndih2b2lkKTsKK0xaT19FWFRFUk5fQyBpbnQgX19sem9fY2RlY2wgX3NldGFyZ3Yodm9pZCk7CitMWk9fRVhURVJOX0MgaW50IF9fbHpvX2NkZWNsIF9zZXRhcmd2KHZvaWQpIHsgcmV0dXJuIF9fc2V0YXJndigpOyB9CisjZW5kaWYKKyNlbmRpZgorI2lmIChMWk9fT1NfRU1YKQorI2RlZmluZSBfX0xaT0xJQl9IQVZFX0xaT19XSUxEQVJHViAxCitMWk9MSUJfUFVCTElDKHZvaWQsIGx6b193aWxkYXJndikgKGludCogYXJnYywgY2hhcioqKiBhcmd2KQoreworICAgIGlmIChhcmdjICYmIGFyZ3YpIHsKKyAgICAgICAgX3Jlc3BvbnNlKGFyZ2MsIGFyZ3YpOworICAgICAgICBfd2lsZGNhcmQoYXJnYywgYXJndik7CisgICAgfQorfQorI2VuZGlmCisjaWYgKExaT19PU19DT05TT0xFX1BTUCkgJiYgZGVmaW5lZChfX1BTUFNES19ERUJVR19fKQorI2RlZmluZSBfX0xaT0xJQl9IQVZFX0xaT19XSUxEQVJHViAxCitMWk9fRVhURVJOX0MgaW50IGx6b19wc3BfaW5pdF9tb2R1bGUoaW50KiwgY2hhcioqKiwgaW50KTsKK0xaT0xJQl9QVUJMSUModm9pZCwgbHpvX3dpbGRhcmd2KSAoaW50KiBhcmdjLCBjaGFyKioqIGFyZ3YpCit7CisgICAgbHpvX3BzcF9pbml0X21vZHVsZShhcmdjLCBhcmd2LCAtMSk7Cit9CisjZW5kaWYKKyNpZiAhKF9fTFpPTElCX0hBVkVfTFpPX1dJTERBUkdWKQorI2RlZmluZSBfX0xaT0xJQl9IQVZFX0xaT19XSUxEQVJHViAxCitMWk9MSUJfUFVCTElDKHZvaWQsIGx6b193aWxkYXJndikgKGludCogYXJnYywgY2hhcioqKiBhcmd2KQoreworI2lmIDEgJiYgKExaT19BUkNIX0kwODZQTSkKKyAgICBpZiAoTFpPX01NX0FIU0hJRlQgIT0gMykgeyBleGl0KDEpOyB9CisjZWxpZiAxICYmIChMWk9fQVJDSF9NNjhLICYmIExaT19PU19UT1MgJiYgTFpPX0NDX0dOVUMpICYmIGRlZmluZWQoX19NSU5UX18pCisgICAgX19iaW5tb2RlKDEpOworICAgIGlmIChpc2F0dHkoMSkpIF9fc2V0X2Jpbm1vZGUoc3Rkb3V0LCAwKTsKKyAgICBpZiAoaXNhdHR5KDIpKSBfX3NldF9iaW5tb2RlKHN0ZGVyciwgMCk7CisjZW5kaWYKKyAgICBMWk9fVU5VU0VEKGFyZ2MpOyBMWk9fVU5VU0VEKGFyZ3YpOworfQorI2VuZGlmCisjZW5kaWYKKworLyogdmltOnNldCB0cz00IHN3PTQgZXQ6ICovCmRpZmYgLS1naXQgYS9sem8vc3JjL2x6b19zd2QuY2ggYi9sem8vc3JjL2x6b19zd2QuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2YWNhNAotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbHpvX3N3ZC5jaApAQCAtMCwwICsxLDY4OSBAQAorLyogbHpvX3N3ZC5jaCAtLSBzbGlkaW5nIHdpbmRvdyBkaWN0aW9uYXJ5CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2lmIChMWk9fVUlOVF9NQVggPCBMWk9fMHhmZmZmZmZmZkwpCisjICBlcnJvciAiTFpPX1VJTlRfTUFYIgorI2VuZGlmCisjaWYgZGVmaW5lZChMWk9fREVCVUcpCisjICBpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0xaT19DSEVDS0VSKQorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHVuc2lnbmVkIHR5cGUgZm9yIGRpY3Rpb25hcnkgYWNjZXNzIC0gZG9uJ3Qgd2FzdGUgbWVtb3J5IGhlcmUgKi8KKyNpZiAoMFVMICsgU1dEX04gKyBTV0RfRiArIFNXRF9GIDwgNjU1MzVVTCkKKyAgIHR5cGVkZWYgbHpvX3VpbnQxNl90ICAgICBzd2RfdWludDsKKyMgIGRlZmluZSBTV0RfVUlOVF9NQVggICAgICAweGZmZmZ1CisjZWxzZQorICAgdHlwZWRlZiBsem9fdWludDMyX3QgICAgIHN3ZF91aW50OworIyAgZGVmaW5lIFNXRF9VSU5UX01BWCAgICAgIDB4ZmZmZmZmZmZ1CisjZW5kaWYKKyNkZWZpbmUgc3dkX3VpbnRwICAgICAgICAgICBzd2RfdWludCAqCisjZGVmaW5lIFNXRF9VSU5UKHgpICAgICAgICAgKChzd2RfdWludCkoeCkpCisKKworI2lmbmRlZiBTV0RfSFNJWkUKKyMgIGRlZmluZSBTV0RfSFNJWkUgICAgICAgICAxNjM4NAorI2VuZGlmCisjaWZuZGVmIFNXRF9NQVhfQ0hBSU4KKyMgIGRlZmluZSBTV0RfTUFYX0NIQUlOICAgICAyMDQ4CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhFQUQzKQorI2lmIDEKKyMgIGRlZmluZSBIRUFEMyhiLHApIFwKKyAgICAoKERNVUwoMHg5ZjVmLCgoKCgobHpvX3hpbnQpYltwXTw8NSleYltwKzFdKTw8NSleYltwKzJdKSk+PjUpICYgKFNXRF9IU0laRS0xKSkKKyNlbHNlCisjICBkZWZpbmUgSEVBRDMoYixwKSBcCisgICAgKChETVVMKDB4OWY1ZiwoKCgoKGx6b194aW50KWJbcCsyXTw8NSleYltwKzFdKTw8NSleYltwXSkpPj41KSAmIChTV0RfSFNJWkUtMSkpCisjZW5kaWYKKyNlbmRpZgorCisjaWYgIShTV0RfTk9fSEVBRDIpICYmIChTV0RfVEhSRVNIT0xEID09IDEpICYmICFkZWZpbmVkKEhFQUQyKQorIyAgaWYgMSAmJiAoTFpPX09QVF9VTkFMSUdORUQxNikKKyMgICAgZGVmaW5lIEhFQUQyKGIscCkgICAgICBVQV9HRVRfTkUxNigoYikrKHApKQorIyAgZWxzZQorIyAgICBkZWZpbmUgSEVBRDIoYixwKSAgICAgIChiW3BdIF4gKCh1bnNpZ25lZCliWyhwKSsxXTw8OCkpCisjICBlbmRpZgorIyAgZGVmaW5lIE5JTDIgICAgICAgICAgICAgIFNXRF9VSU5UX01BWAorI2VuZGlmCisjaWZuZGVmIElGX0hFQUQyCisjZGVmaW5lIElGX0hFQUQyKHMpICAgICAgICAgLyplbXB0eSovCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdAoreworLyogcHVibGljIC0gImJ1aWx0LWluIiAqLworICAgIGx6b191aW50IHN3ZF9uOworICAgIGx6b191aW50IHN3ZF9mOworICAgIGx6b191aW50IHN3ZF90aHJlc2hvbGQ7CisKKy8qIHB1YmxpYyAtIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBsem9fdWludCBtYXhfY2hhaW47CisgICAgbHpvX3VpbnQgbmljZV9sZW5ndGg7CisgICAgbHpvX2Jvb2wgdXNlX2Jlc3Rfb2ZmOworICAgIGx6b191aW50IGxhenlfaW5zZXJ0OworCisvKiBwdWJsaWMgLSBvdXRwdXQgKi8KKyAgICBsem9fdWludCBtX2xlbjsKKyAgICBsem9fdWludCBtX29mZjsKKyAgICBsem9fdWludCBsb29rOworICAgIGludCBiX2NoYXI7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisgICAgbHpvX3VpbnQgYmVzdF9vZmZbIFNXRF9CRVNUX09GRiBdOworI2VuZGlmCisKKy8qIHNlbWkgcHVibGljICovCisgICAgTFpPX0NPTVBSRVNTX1QgKmM7CisgICAgbHpvX3VpbnQgbV9wb3M7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisgICAgbHpvX3VpbnQgYmVzdF9wb3NbIFNXRF9CRVNUX09GRiBdOworI2VuZGlmCisKKy8qIHByaXZhdGUgKi8KKyAgICBjb25zdCBsem9fYnl0ZXAgZGljdDsKKyAgICBjb25zdCBsem9fYnl0ZXAgZGljdF9lbmQ7CisgICAgbHpvX3VpbnQgZGljdF9sZW47CisKKy8qIHByaXZhdGUgKi8KKyAgICBsem9fdWludCBpcDsgICAgICAgICAgICAgICAgLyogaW5wdXQgcG9pbnRlciAobG9va2FoZWFkKSAqLworICAgIGx6b191aW50IGJwOyAgICAgICAgICAgICAgICAvKiBidWZmZXIgcG9pbnRlciAqLworICAgIGx6b191aW50IHJwOyAgICAgICAgICAgICAgICAvKiByZW1vdmUgcG9pbnRlciAqLworICAgIGx6b191aW50IGJfc2l6ZTsKKworICAgIGx6b19ieXRlcCBiX3dyYXA7CisKKyAgICBsem9fdWludCBub2RlX2NvdW50OworICAgIGx6b191aW50IGZpcnN0X3JwOworCisjaWYgZGVmaW5lZChfX0xaT19DSEVDS0VSKQorICAgIC8qIG1hbGxvYyBhcnJheXMgb2YgdGhlIGV4YWN0IHNpemUgdG8gZGV0ZWN0IGFueSBvdmVycnVuICovCisgICAgdW5zaWduZWQgY2hhciAqYjsKKyAgICBzd2RfdWludCAqaGVhZDM7CisgICAgc3dkX3VpbnQgKnN1Y2MzOworICAgIHN3ZF91aW50ICpiZXN0MzsKKyAgICBzd2RfdWludCAqbGxlbjM7CisjIGlmZGVmIEhFQUQyCisgICAgc3dkX3VpbnQgKmhlYWQyOworIyBlbmRpZgorCisjZWxzZQorICAgIHVuc2lnbmVkIGNoYXIgYiBbIFNXRF9OICsgU1dEX0YgKyBTV0RfRiBdOworICAgIHN3ZF91aW50IGhlYWQzIFsgU1dEX0hTSVpFIF07CisgICAgc3dkX3VpbnQgc3VjYzMgWyBTV0RfTiArIFNXRF9GIF07CisgICAgc3dkX3VpbnQgYmVzdDMgWyBTV0RfTiArIFNXRF9GIF07CisgICAgc3dkX3VpbnQgbGxlbjMgWyBTV0RfSFNJWkUgXTsKKyMgaWZkZWYgSEVBRDIKKyAgICBzd2RfdWludCBoZWFkMiBbIDY1NTM2TCBdOworIyBlbmRpZgorI2VuZGlmCit9Citsem9fc3dkX3Q7CisjZGVmaW5lIGx6b19zd2RfcCAgIGx6b19zd2RfdCAqCisKKworI2RlZmluZSBzX2IocykgICAgICBzLT5iCisjZGVmaW5lIHNfaGVhZDMocykgIHMtPmhlYWQzCisjZGVmaW5lIHNfc3VjYzMocykgIHMtPnN1Y2MzCisjZGVmaW5lIHNfYmVzdDMocykgIHMtPmJlc3QzCisjZGVmaW5lIHNfbGxlbjMocykgIHMtPmxsZW4zCisjaWZkZWYgSEVBRDIKKyNkZWZpbmUgc19oZWFkMihzKSAgcy0+aGVhZDIKKyNlbmRpZgorI2RlZmluZSBTSVpFT0ZfTFpPX1NXRF9UICAgIChzaXplb2YobHpvX3N3ZF90KSkKKworCisvKiBBY2Nlc3MgbWFjcm8gZm9yIGhlYWQzLgorICogaGVhZDNba2V5XSBtYXkgYmUgdW5pbml0aWFsaXplZCBpZiB0aGUgbGlzdCBpcyBlbXRweSwKKyAqIGJ1dCB0aGVuIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuCisgKi8KKyNpZiAxIHx8IGRlZmluZWQoX19MWk9fQ0hFQ0tFUikKKyMgIGRlZmluZSBzX2dldF9oZWFkMyhzLGtleSkgXAorICAgICAgICAoKHN3ZF91aW50KSgoc19sbGVuMyhzKVtrZXldID09IDApID8gU1dEX1VJTlRfTUFYIDogc19oZWFkMyhzKVtrZXldKSkKKyNlbHNlCisjICBkZWZpbmUgc19nZXRfaGVhZDMocyxrZXkpICAgIChzX2hlYWQzKHMpW2tleV0pCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYwordm9pZCBzd2RfaW5pdGRpY3QobHpvX3N3ZF9wIHMsIGNvbnN0IGx6b19ieXRlcCBkaWN0LCBsem9fdWludCBkaWN0X2xlbikKK3sKKyAgICBzLT5kaWN0ID0gcy0+ZGljdF9lbmQgPSBOVUxMOworICAgIHMtPmRpY3RfbGVuID0gMDsKKworICAgIGlmICghZGljdCB8fCBkaWN0X2xlbiA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGRpY3RfbGVuID4gcy0+c3dkX24pCisgICAgeworICAgICAgICBkaWN0ICs9IGRpY3RfbGVuIC0gcy0+c3dkX247CisgICAgICAgIGRpY3RfbGVuID0gcy0+c3dkX247CisgICAgfQorCisgICAgcy0+ZGljdCA9IGRpY3Q7CisgICAgcy0+ZGljdF9sZW4gPSBkaWN0X2xlbjsKKyAgICBzLT5kaWN0X2VuZCA9IGRpY3QgKyBkaWN0X2xlbjsKKyAgICBsem9fbWVtY3B5KHNfYihzKSxkaWN0LGRpY3RfbGVuKTsKKyAgICBzLT5pcCA9IGRpY3RfbGVuOworfQorCisKK3N0YXRpYwordm9pZCBzd2RfaW5zZXJ0ZGljdChsem9fc3dkX3AgcywgbHpvX3VpbnQgbm9kZSwgbHpvX3VpbnQgbGVuKQoreworICAgIGx6b191aW50IGtleTsKKworICAgIHMtPm5vZGVfY291bnQgPSBzLT5zd2RfbiAtIGxlbjsKKyAgICBzLT5maXJzdF9ycCA9IG5vZGU7CisKKyAgICBpZiAobGVuKSBkbworICAgIHsKKyAgICAgICAga2V5ID0gSEVBRDMoc19iKHMpLG5vZGUpOworICAgICAgICBzX3N1Y2MzKHMpW25vZGVdID0gc19nZXRfaGVhZDMocyxrZXkpOworICAgICAgICBzX2hlYWQzKHMpW2tleV0gPSBTV0RfVUlOVChub2RlKTsKKyAgICAgICAgc19iZXN0MyhzKVtub2RlXSA9IFNXRF9VSU5UKHMtPnN3ZF9mICsgMSk7CisgICAgICAgIHNfbGxlbjMocylba2V5XSsrOworICAgICAgICBhc3NlcnQoc19sbGVuMyhzKVtrZXldIDw9IHMtPnN3ZF9uKTsKKworI2lmZGVmIEhFQUQyCisgICAgICAgIElGX0hFQUQyKHMpIHsKKyAgICAgICAgICAgIGtleSA9IEhFQUQyKHNfYihzKSxub2RlKTsKKyAgICAgICAgICAgIHNfaGVhZDIocylba2V5XSA9IFNXRF9VSU5UKG5vZGUpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBub2RlKys7CisgICAgfQorICAgIHdoaWxlICgtLWxlbiAhPSAwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYworaW50IHN3ZF9pbml0KGx6b19zd2RfcCBzLCBjb25zdCBsem9fYnl0ZXAgZGljdCwgbHpvX3VpbnQgZGljdF9sZW4pCit7CisjaWYgZGVmaW5lZChfX0xaT19DSEVDS0VSKQorICAgIHMtPmIgPSAobHpvX2J5dGVwKSBtYWxsb2MoU1dEX04gKyBTV0RfRiArIFNXRF9GKTsKKyAgICBzLT5oZWFkMyA9IChzd2RfdWludHApIG1hbGxvYyhzaXplb2Yoc3dkX3VpbnQpICogU1dEX0hTSVpFKTsKKyAgICBzLT5zdWNjMyA9IChzd2RfdWludHApIG1hbGxvYyhzaXplb2Yoc3dkX3VpbnQpICogKFNXRF9OICsgU1dEX0YpKTsKKyAgICBzLT5iZXN0MyA9IChzd2RfdWludHApIG1hbGxvYyhzaXplb2Yoc3dkX3VpbnQpICogKFNXRF9OICsgU1dEX0YpKTsKKyAgICBzLT5sbGVuMyA9IChzd2RfdWludHApIG1hbGxvYyhzaXplb2Yoc3dkX3VpbnQpICogU1dEX0hTSVpFKTsKKyNpZmRlZiBIRUFEMgorICAgIElGX0hFQUQyKHMpIHsKKyAgICAgICAgcy0+aGVhZDIgPSAoc3dkX3VpbnRwKSBtYWxsb2Moc2l6ZW9mKHN3ZF91aW50KSAqIDY1NTM2TCk7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAgIHMtPm1fbGVuID0gMDsKKyAgICBzLT5tX29mZiA9IDA7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU1dEX0JFU1RfT0ZGOyBpKyspCisgICAgICAgICAgICBzLT5iZXN0X29mZltpXSA9IHMtPmJlc3RfcG9zW2ldID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIHMtPnN3ZF9uID0gU1dEX047CisgICAgcy0+c3dkX2YgPSBTV0RfRjsKKyAgICBzLT5zd2RfdGhyZXNob2xkID0gU1dEX1RIUkVTSE9MRDsKKworICAgIC8qIGRlZmF1bHRzICovCisgICAgcy0+bWF4X2NoYWluID0gU1dEX01BWF9DSEFJTjsKKyAgICBzLT5uaWNlX2xlbmd0aCA9IHMtPnN3ZF9mOworICAgIHMtPnVzZV9iZXN0X29mZiA9IDA7CisgICAgcy0+bGF6eV9pbnNlcnQgPSAwOworCisgICAgcy0+Yl9zaXplID0gcy0+c3dkX24gKyBzLT5zd2RfZjsKKyNpZiAwCisgICAgaWYgKDIgKiBzLT5zd2RfZiA+PSBzLT5zd2RfbiB8fCBzLT5iX3NpemUgKyBzLT5zd2RfZiA+PSBTV0RfVUlOVF9NQVgpCisgICAgICAgIHJldHVybiBMWk9fRV9FUlJPUjsKKyNlbHNlCisgICAgTFpPX0NPTVBJTEVfVElNRV9BU1NFUlQoISgwdWwgKyAyICogU1dEX0YgPj0gU1dEX04pKQorICAgIExaT19DT01QSUxFX1RJTUVfQVNTRVJUKCEoMHVsICsgU1dEX04gKyBTV0RfRiArIFNXRF9GID49IFNXRF9VSU5UX01BWCkpCisjZW5kaWYKKyAgICBzLT5iX3dyYXAgPSBzX2IocykgKyBzLT5iX3NpemU7CisgICAgcy0+bm9kZV9jb3VudCA9IHMtPnN3ZF9uOworCisgICAgbHpvX21lbXNldChzX2xsZW4zKHMpLCAwLCAobHpvX3VpbnQpc2l6ZW9mKHNfbGxlbjMocylbMF0pICogKGx6b191aW50KVNXRF9IU0laRSk7CisjaWZkZWYgSEVBRDIKKyAgICBJRl9IRUFEMihzKSB7CisjaWYgMQorICAgICAgICBsem9fbWVtc2V0KHNfaGVhZDIocyksIDB4ZmYsIChsem9fdWludClzaXplb2Yoc19oZWFkMihzKVswXSkgKiA2NTUzNkwpOworICAgICAgICBhc3NlcnQoc19oZWFkMihzKVswXSA9PSBOSUwyKTsKKyNlbHNlCisgICAgICAgIGx6b194aW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NTUzNkw7IGkrKykKKyAgICAgICAgICAgIHNfaGVhZDIocylbaV0gPSBOSUwyOworI2VuZGlmCisgICAgfQorI2VuZGlmCisKKyAgICBzLT5pcCA9IDA7CisgICAgc3dkX2luaXRkaWN0KHMsZGljdCxkaWN0X2xlbik7CisgICAgcy0+YnAgPSBzLT5pcDsKKyAgICBzLT5maXJzdF9ycCA9IHMtPmlwOworCisgICAgYXNzZXJ0KHMtPmlwICsgcy0+c3dkX2YgPD0gcy0+Yl9zaXplKTsKKyNpZiAxCisgICAgcy0+bG9vayA9IChsem9fdWludCkgKHMtPmMtPmluX2VuZCAtIHMtPmMtPmlwKTsKKyAgICBpZiAocy0+bG9vayA+IDApCisgICAgeworICAgICAgICBpZiAocy0+bG9vayA+IHMtPnN3ZF9mKQorICAgICAgICAgICAgcy0+bG9vayA9IHMtPnN3ZF9mOworICAgICAgICBsem9fbWVtY3B5KCZzX2Iocylbcy0+aXBdLHMtPmMtPmlwLHMtPmxvb2spOworICAgICAgICBzLT5jLT5pcCArPSBzLT5sb29rOworICAgICAgICBzLT5pcCArPSBzLT5sb29rOworICAgIH0KKyNlbHNlCisgICAgcy0+bG9vayA9IDA7CisgICAgd2hpbGUgKHMtPmxvb2sgPCBzLT5zd2RfZikKKyAgICB7CisgICAgICAgIGludCBjOworICAgICAgICBpZiAoKGMgPSBnZXRieXRlKCoocy0+YykpKSA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc19iKHMpW3MtPmlwXSA9IExaT19CWVRFKGMpOworICAgICAgICBzLT5pcCsrOworICAgICAgICBzLT5sb29rKys7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHMtPmlwID09IHMtPmJfc2l6ZSkKKyAgICAgICAgcy0+aXAgPSAwOworCisgICAgaWYgKHMtPmxvb2sgPj0gMiAmJiBzLT5kaWN0X2xlbiA+IDApCisgICAgICAgIHN3ZF9pbnNlcnRkaWN0KHMsMCxzLT5kaWN0X2xlbik7CisKKyAgICBzLT5ycCA9IHMtPmZpcnN0X3JwOworICAgIGlmIChzLT5ycCA+PSBzLT5ub2RlX2NvdW50KQorICAgICAgICBzLT5ycCAtPSBzLT5ub2RlX2NvdW50OworICAgIGVsc2UKKyAgICAgICAgcy0+cnAgKz0gcy0+Yl9zaXplIC0gcy0+bm9kZV9jb3VudDsKKworI2lmIDEgfHwgZGVmaW5lZChfX0xaT19DSEVDS0VSKQorICAgIC8qIGluaXRpYWxpemUgbWVtb3J5IGZvciB0aGUgZmlyc3QgZmV3IEhFQUQzIChpZiBzLT5pcCBpcyBub3QgZmFyCisgICAgICogZW5vdWdoIGFoZWFkIHRvIGRvIHRoaXMgam9iIGZvciB1cykuIFRoZSB2YWx1ZSBkb2Vzbid0IG1hdHRlci4gKi8KKyAgICBpZiAocy0+bG9vayA8IDMpIHsKKyAgICAgICAgbHpvX2J5dGVwIHAgPSAmc19iKHMpW3MtPmJwK3MtPmxvb2tdOworICAgICAgICBwWzBdID0gcFsxXSA9IHBbMl0gPSAwOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIExaT19FX09LOworfQorCisKK3N0YXRpYwordm9pZCBzd2RfZXhpdChsem9fc3dkX3AgcykKK3sKKyNpZiBkZWZpbmVkKF9fTFpPX0NIRUNLRVIpCisgICAgLyogZnJlZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb25zICovCisjaWZkZWYgSEVBRDIKKyAgICBmcmVlKHMtPmhlYWQyKTsgcy0+aGVhZDIgPSBOVUxMOworI2VuZGlmCisgICAgZnJlZShzLT5sbGVuMyk7IHMtPmxsZW4zID0gTlVMTDsKKyAgICBmcmVlKHMtPmJlc3QzKTsgcy0+YmVzdDMgPSBOVUxMOworICAgIGZyZWUocy0+c3VjYzMpOyBzLT5zdWNjMyA9IE5VTEw7CisgICAgZnJlZShzLT5oZWFkMyk7IHMtPmhlYWQzID0gTlVMTDsKKyAgICBmcmVlKHMtPmIpOyBzLT5iID0gTlVMTDsKKyNlbHNlCisgICAgTFpPX1VOVVNFRChzKTsKKyNlbmRpZgorfQorCisKKyNkZWZpbmUgc3dkX3BvczJvZmYocyxwb3MpIFwKKyAgICAocy0+YnAgPiAocG9zKSA/IHMtPmJwIC0gKHBvcykgOiBzLT5iX3NpemUgLSAoKHBvcykgLSBzLT5icCkpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgX19sem9faW5saW5lCit2b2lkIHN3ZF9nZXRieXRlKGx6b19zd2RfcCBzKQoreworICAgIGludCBjOworCisgICAgaWYgKChjID0gZ2V0Ynl0ZSgqKHMtPmMpKSkgPCAwKQorICAgIHsKKyAgICAgICAgaWYgKHMtPmxvb2sgPiAwKQorICAgICAgICAgICAgLS1zLT5sb29rOworI2lmIDEgfHwgZGVmaW5lZChfX0xaT19DSEVDS0VSKQorICAgICAgICAvKiBpbml0aWFsaXplIG1lbW9yeSAtIHZhbHVlIGRvZXNuJ3QgbWF0dGVyICovCisgICAgICAgIHNfYihzKVtzLT5pcF0gPSAwOworICAgICAgICBpZiAocy0+aXAgPCBzLT5zd2RfZikKKyAgICAgICAgICAgIHMtPmJfd3JhcFtzLT5pcF0gPSAwOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNfYihzKVtzLT5pcF0gPSBMWk9fQllURShjKTsKKyAgICAgICAgaWYgKHMtPmlwIDwgcy0+c3dkX2YpCisgICAgICAgICAgICBzLT5iX3dyYXBbcy0+aXBdID0gTFpPX0JZVEUoYyk7CisgICAgfQorICAgIGlmICgrK3MtPmlwID09IHMtPmJfc2l6ZSkKKyAgICAgICAgcy0+aXAgPSAwOworICAgIGlmICgrK3MtPmJwID09IHMtPmJfc2l6ZSkKKyAgICAgICAgcy0+YnAgPSAwOworICAgIGlmICgrK3MtPnJwID09IHMtPmJfc2l6ZSkKKyAgICAgICAgcy0+cnAgPSAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gcmVtb3ZlIG5vZGUgZnJvbSBsaXN0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgX19sem9faW5saW5lCit2b2lkIHN3ZF9yZW1vdmVfbm9kZShsem9fc3dkX3AgcywgbHpvX3VpbnQgbm9kZSkKK3sKKyAgICBpZiAocy0+bm9kZV9jb3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgbHpvX3VpbnQga2V5OworCisjaWZkZWYgTFpPX0RFQlVHCisgICAgICAgIGlmIChzLT5maXJzdF9ycCAhPSBMWk9fVUlOVF9NQVgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChub2RlICE9IHMtPmZpcnN0X3JwKQorICAgICAgICAgICAgICAgIHByaW50ZigiUmVtb3ZlICU1bGQ6ICU1bGQgJTVsZCAlNWxkICU1bGQgICU2bGQgJTZsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKW5vZGUsIChsb25nKXMtPnJwLCAobG9uZylzLT5pcCwgKGxvbmcpcy0+YnAsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZylzLT5maXJzdF9ycCwgKGxvbmcpKHMtPmlwIC0gbm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykocy0+aXAgLSBzLT5icCkpOworICAgICAgICAgICAgYXNzZXJ0KG5vZGUgPT0gcy0+Zmlyc3RfcnApOworICAgICAgICAgICAgcy0+Zmlyc3RfcnAgPSBMWk9fVUlOVF9NQVg7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGtleSA9IEhFQUQzKHNfYihzKSxub2RlKTsKKyAgICAgICAgYXNzZXJ0KHNfbGxlbjMocylba2V5XSA+IDApOworICAgICAgICAtLXNfbGxlbjMocylba2V5XTsKKworI2lmZGVmIEhFQUQyCisgICAgICAgIElGX0hFQUQyKHMpIHsKKyAgICAgICAgICAgIGtleSA9IEhFQUQyKHNfYihzKSxub2RlKTsKKyAgICAgICAgICAgIGFzc2VydChzX2hlYWQyKHMpW2tleV0gIT0gTklMMik7CisgICAgICAgICAgICBpZiAoKGx6b191aW50KSBzX2hlYWQyKHMpW2tleV0gPT0gbm9kZSkKKyAgICAgICAgICAgICAgICBzX2hlYWQyKHMpW2tleV0gPSBOSUwyOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgICAgICAtLXMtPm5vZGVfY291bnQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMKK3ZvaWQgc3dkX2FjY2VwdChsem9fc3dkX3AgcywgbHpvX3VpbnQgbikKK3sKKyAgICBhc3NlcnQobiA8PSBzLT5sb29rKTsKKworICAgIGlmIChuKSBkbworICAgIHsKKyAgICAgICAgbHpvX3VpbnQga2V5OworCisgICAgICAgIHN3ZF9yZW1vdmVfbm9kZShzLHMtPnJwKTsKKworICAgICAgICAvKiBhZGQgYnAgaW50byBIRUFEMyAqLworICAgICAgICBrZXkgPSBIRUFEMyhzX2Iocykscy0+YnApOworICAgICAgICBzX3N1Y2MzKHMpW3MtPmJwXSA9IHNfZ2V0X2hlYWQzKHMsa2V5KTsKKyAgICAgICAgc19oZWFkMyhzKVtrZXldID0gU1dEX1VJTlQocy0+YnApOworICAgICAgICBzX2Jlc3QzKHMpW3MtPmJwXSA9IFNXRF9VSU5UKHMtPnN3ZF9mICsgMSk7CisgICAgICAgIHNfbGxlbjMocylba2V5XSsrOworICAgICAgICBhc3NlcnQoc19sbGVuMyhzKVtrZXldIDw9IHMtPnN3ZF9uKTsKKworI2lmZGVmIEhFQUQyCisgICAgICAgIC8qIGFkZCBicCBpbnRvIEhFQUQyICovCisgICAgICAgIElGX0hFQUQyKHMpIHsKKyAgICAgICAgICAgIGtleSA9IEhFQUQyKHNfYihzKSxzLT5icCk7CisgICAgICAgICAgICBzX2hlYWQyKHMpW2tleV0gPSBTV0RfVUlOVChzLT5icCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHN3ZF9nZXRieXRlKHMpOworICAgIH0gd2hpbGUgKC0tbiAhPSAwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYwordm9pZCBzd2Rfc2VhcmNoKGx6b19zd2RfcCBzLCBsem9fdWludCBub2RlLCBsem9fdWludCBjbnQpCit7CisgICAgY29uc3QgbHpvX2J5dGVwIHAxOworICAgIGNvbnN0IGx6b19ieXRlcCBwMjsKKyAgICBjb25zdCBsem9fYnl0ZXAgcHg7CisgICAgbHpvX3VpbnQgbV9sZW4gPSBzLT5tX2xlbjsKKyAgICBjb25zdCBsem9fYnl0ZXAgYiAgPSBzX2Iocyk7CisgICAgY29uc3QgbHpvX2J5dGVwIGJwID0gc19iKHMpICsgcy0+YnA7CisgICAgY29uc3QgbHpvX2J5dGVwIGJ4ID0gc19iKHMpICsgcy0+YnAgKyBzLT5sb29rOworICAgIHVuc2lnbmVkIGNoYXIgc2Nhbl9lbmQxOworCisgICAgYXNzZXJ0KHMtPm1fbGVuID4gMCk7CisKKyAgICBzY2FuX2VuZDEgPSBicFttX2xlbiAtIDFdOworICAgIGZvciAoIDsgY250LS0gPiAwOyBub2RlID0gc19zdWNjMyhzKVtub2RlXSkKKyAgICB7CisgICAgICAgIHAxID0gYnA7CisgICAgICAgIHAyID0gYiArIG5vZGU7CisgICAgICAgIHB4ID0gYng7CisKKyAgICAgICAgYXNzZXJ0KG1fbGVuIDwgcy0+bG9vayk7CisKKyAgICAgICAgaWYgKAorI2lmIDEKKyAgICAgICAgICAgIHAyW21fbGVuIC0gMV0gPT0gc2Nhbl9lbmQxICYmCisgICAgICAgICAgICBwMlttX2xlbl0gPT0gcDFbbV9sZW5dICYmCisjZW5kaWYKKyAgICAgICAgICAgIHAyWzBdID09IHAxWzBdICYmCisgICAgICAgICAgICBwMlsxXSA9PSBwMVsxXSkKKyAgICAgICAgeworICAgICAgICAgICAgbHpvX3VpbnQgaTsKKyAgICAgICAgICAgIGFzc2VydChsem9fbWVtY21wKGJwLCZiW25vZGVdLDMpID09IDApOworCisjaWYgMCAmJiAoTFpPX09QVF9VTkFMSUdORUQzMikKKyAgICAgICAgICAgIHAxICs9IDM7IHAyICs9IDM7CisgICAgICAgICAgICB3aGlsZSAocDEgKyA0IDw9IHB4ICYmIFVBX0dFVF9ORTMyKHAxKSA9PSBVQV9HRVRfTkUzMihwMikpCisgICAgICAgICAgICAgICAgcDEgKz0gNCwgcDIgKz0gNDsKKyAgICAgICAgICAgIHdoaWxlIChwMSA8IHB4ICYmICpwMSA9PSAqcDIpCisgICAgICAgICAgICAgICAgcDEgKz0gMSwgcDIgKz0gMTsKKyNlbHNlCisgICAgICAgICAgICBwMSArPSAyOyBwMiArPSAyOworICAgICAgICAgICAgZG8ge30gd2hpbGUgKCsrcDEgPCBweCAmJiAqcDEgPT0gKisrcDIpOworI2VuZGlmCisgICAgICAgICAgICBpID0gcGQocDEsIGJwKTsKKworI2lmZGVmIExaT19ERUJVRworICAgICAgICAgICAgaWYgKGx6b19tZW1jbXAoYnAsJmJbbm9kZV0saSkgIT0gMCkKKyAgICAgICAgICAgICAgICBwcmludGYoIiU1bGQgJTVsZCAlNWxkICUwMngvJTAyeCAlMDJ4LyUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZylzLT5icCwgKGxvbmcpIG5vZGUsIChsb25nKSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgYnBbMF0sIGJwWzFdLCBiW25vZGVdLCBiW25vZGUrMV0pOworI2VuZGlmCisgICAgICAgICAgICBhc3NlcnQobHpvX21lbWNtcChicCwmYltub2RlXSxpKSA9PSAwKTsKKworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorICAgICAgICAgICAgaWYgKGkgPCBTV0RfQkVTVF9PRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmJlc3RfcG9zW2ldID09IDApCisgICAgICAgICAgICAgICAgICAgIHMtPmJlc3RfcG9zW2ldID0gbm9kZSArIDE7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChpID4gbV9sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcy0+bV9sZW4gPSBtX2xlbiA9IGk7CisgICAgICAgICAgICAgICAgcy0+bV9wb3MgPSBub2RlOworICAgICAgICAgICAgICAgIGlmIChtX2xlbiA9PSBzLT5sb29rKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKG1fbGVuID49IHMtPm5pY2VfbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKG1fbGVuID4gKGx6b191aW50KSBzX2Jlc3QzKHMpW25vZGVdKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgc2Nhbl9lbmQxID0gYnBbbV9sZW4gLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBIRUFEMgorCitzdGF0aWMKK2x6b19ib29sIHN3ZF9zZWFyY2gyKGx6b19zd2RfcCBzKQoreworICAgIGx6b191aW50IGtleTsKKworICAgIGFzc2VydChzLT5sb29rID49IDIpOworICAgIGFzc2VydChzLT5tX2xlbiA+IDApOworCisgICAga2V5ID0gc19oZWFkMihzKVsgSEVBRDIoc19iKHMpLHMtPmJwKSBdOworICAgIGlmIChrZXkgPT0gTklMMikKKyAgICAgICAgcmV0dXJuIDA7CisjaWZkZWYgTFpPX0RFQlVHCisgICAgaWYgKGx6b19tZW1jbXAoJnNfYihzKVtzLT5icF0sJnNfYihzKVtrZXldLDIpICE9IDApCisgICAgICAgIHByaW50ZigiJTVsZCAlNWxkICUwMngvJTAyeCAlMDJ4LyUwMnhcbiIsIChsb25nKXMtPmJwLCAobG9uZylrZXksCisgICAgICAgICAgICAgICAgc19iKHMpW3MtPmJwXSwgc19iKHMpW3MtPmJwKzFdLCBzX2Iocylba2V5XSwgc19iKHMpW2tleSsxXSk7CisjZW5kaWYKKyAgICBhc3NlcnQobHpvX21lbWNtcCgmc19iKHMpW3MtPmJwXSwmc19iKHMpW2tleV0sMikgPT0gMCk7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisgICAgaWYgKHMtPmJlc3RfcG9zWzJdID09IDApCisgICAgICAgIHMtPmJlc3RfcG9zWzJdID0ga2V5ICsgMTsKKyNlbmRpZgorCisgICAgaWYgKHMtPm1fbGVuIDwgMikKKyAgICB7CisgICAgICAgIHMtPm1fbGVuID0gMjsKKyAgICAgICAgcy0+bV9wb3MgPSBrZXk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYwordm9pZCBzd2RfZmluZGJlc3QobHpvX3N3ZF9wIHMpCit7CisgICAgbHpvX3VpbnQga2V5OworICAgIGx6b191aW50IGNudCwgbm9kZTsKKyAgICBsem9fdWludCBsZW47CisKKyAgICBhc3NlcnQocy0+bV9sZW4gPiAwKTsKKworICAgIC8qIGdldCBjdXJyZW50IGhlYWQsIGFkZCBicCBpbnRvIEhFQUQzICovCisgICAga2V5ID0gSEVBRDMoc19iKHMpLHMtPmJwKTsKKyAgICBub2RlID0gc19zdWNjMyhzKVtzLT5icF0gPSBzX2dldF9oZWFkMyhzLGtleSk7CisgICAgY250ID0gc19sbGVuMyhzKVtrZXldKys7CisgICAgYXNzZXJ0KHNfbGxlbjMocylba2V5XSA8PSBzLT5zd2RfbiArIHMtPnN3ZF9mKTsKKyAgICBpZiAoY250ID4gcy0+bWF4X2NoYWluICYmIHMtPm1heF9jaGFpbiA+IDApCisgICAgICAgIGNudCA9IHMtPm1heF9jaGFpbjsKKyAgICBzX2hlYWQzKHMpW2tleV0gPSBTV0RfVUlOVChzLT5icCk7CisKKyAgICBzLT5iX2NoYXIgPSBzX2Iocylbcy0+YnBdOworICAgIGxlbiA9IHMtPm1fbGVuOworICAgIGlmIChzLT5tX2xlbiA+PSBzLT5sb29rKQorICAgIHsKKyAgICAgICAgaWYgKHMtPmxvb2sgPT0gMCkKKyAgICAgICAgICAgIHMtPmJfY2hhciA9IC0xOworICAgICAgICBzLT5tX29mZiA9IDA7CisgICAgICAgIHNfYmVzdDMocylbcy0+YnBdID0gU1dEX1VJTlQocy0+c3dkX2YgKyAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZiBkZWZpbmVkKEhFQUQyKQorICAgICAgICBpZiAoc3dkX3NlYXJjaDIocykgJiYgcy0+bG9vayA+PSAzKQorICAgICAgICAgICAgc3dkX3NlYXJjaChzLG5vZGUsY250KTsKKyNlbHNlCisgICAgICAgIGlmIChzLT5sb29rID49IDMpCisgICAgICAgICAgICBzd2Rfc2VhcmNoKHMsbm9kZSxjbnQpOworI2VuZGlmCisgICAgICAgIGlmIChzLT5tX2xlbiA+IGxlbikKKyAgICAgICAgICAgIHMtPm1fb2ZmID0gc3dkX3BvczJvZmYocyxzLT5tX3Bvcyk7CisgICAgICAgIHNfYmVzdDMocylbcy0+YnBdID0gU1dEX1VJTlQocy0+bV9sZW4pOworCisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisgICAgICAgIGlmIChzLT51c2VfYmVzdF9vZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGk7CisgICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgU1dEX0JFU1RfT0ZGOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHMtPmJlc3RfcG9zW2ldID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcy0+YmVzdF9vZmZbaV0gPSBzd2RfcG9zMm9mZihzLHMtPmJlc3RfcG9zW2ldLTEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcy0+YmVzdF9vZmZbaV0gPSAwOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBzd2RfcmVtb3ZlX25vZGUocyxzLT5ycCk7CisKKyNpZmRlZiBIRUFEMgorICAgIC8qIGFkZCBicCBpbnRvIEhFQUQyICovCisgICAgSUZfSEVBRDIocykgeworICAgICAgICBrZXkgPSBIRUFEMihzX2Iocykscy0+YnApOworICAgICAgICBzX2hlYWQyKHMpW2tleV0gPSBTV0RfVUlOVChzLT5icCk7CisgICAgfQorI2VuZGlmCit9CisKKworI3VuZGVmIEhFQUQzCisjdW5kZWYgSEVBRDIKKyN1bmRlZiBJRl9IRUFEMgorI3VuZGVmIHNfZ2V0X2hlYWQzCisKKworLyoKK3ZpOnRzPTQ6ZXQKKyovCisKZGlmZiAtLWdpdCBhL2x6by9zcmMvbHpvX3V0aWwuYyBiL2x6by9zcmMvbHpvX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjJhNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9sem9fdXRpbC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKiBsem9fdXRpbC5jIC0tIHV0aWxpdGllcyBmb3IgdGhlIExaTyBsaWJyYXJ5CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworI2luY2x1ZGUgImx6b19jb25mLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJZiB5b3UgdXNlIHRoZSBMWk8gbGlicmFyeSBpbiBhIHByb2R1Y3QsIEkgd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdQorICoga2VlcCB0aGlzIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgorLiovCisKK3N0YXRpYyBjb25zdCBjaGFyIF9fbHpvX2NvcHlyaWdodFtdID0KKyNpZiAhZGVmaW5lZChfX0xaT19JTl9NSU5MWk8pCisgICAgLyogc2F2ZSBzcGFjZSBhcyBzb21lIHBlb3BsZSB3YW50IGEgcmVhbGx5IHNtYWxsIGRlY29tcHJlc3NvciAqLworICAgIExaT19WRVJTSU9OX1NUUklORzsKKyNlbHNlCisgICAgIlxyXG5cbiIKKyAgICAiTFpPIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS5cbiIKKyAgICAiJENvcHlyaWdodDogTFpPIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXJcbiIKKyAgICAiPG1hcmt1c0BvYmVyaHVtZXIuY29tPlxuIgorICAgICJodHRwOi8vd3d3Lm9iZXJodW1lci5jb20gJFxuXG4iCisgICAgIiRJZDogTFpPIHZlcnNpb246IHYiIExaT19WRVJTSU9OX1NUUklORyAiLCAiIExaT19WRVJTSU9OX0RBVEUgIiAkXG4iCisgICAgIiRJbmZvOiAiIExaT19JTkZPX1NUUklORyAiICRcbiI7CisjZW5kaWYKKworCitMWk9fUFVCTElDKGNvbnN0IGx6b19ieXRlcCkKK2x6b19jb3B5cmlnaHQodm9pZCkKK3sKKyAgICByZXR1cm4gKGNvbnN0IGx6b19ieXRlcCkgX19sem9fY29weXJpZ2h0OworfQorCitMWk9fUFVCTElDKHVuc2lnbmVkKQorbHpvX3ZlcnNpb24odm9pZCkKK3sKKyAgICByZXR1cm4gTFpPX1ZFUlNJT047Cit9CisKK0xaT19QVUJMSUMoY29uc3QgY2hhciAqKQorbHpvX3ZlcnNpb25fc3RyaW5nKHZvaWQpCit7CisgICAgcmV0dXJuIExaT19WRVJTSU9OX1NUUklORzsKK30KKworTFpPX1BVQkxJQyhjb25zdCBjaGFyICopCitsem9fdmVyc2lvbl9kYXRlKHZvaWQpCit7CisgICAgcmV0dXJuIExaT19WRVJTSU9OX0RBVEU7Cit9CisKK0xaT19QVUJMSUMoY29uc3QgbHpvX2NoYXJwKQorX2x6b192ZXJzaW9uX3N0cmluZyh2b2lkKQoreworICAgIHJldHVybiBMWk9fVkVSU0lPTl9TVFJJTkc7Cit9CisKK0xaT19QVUJMSUMoY29uc3QgbHpvX2NoYXJwKQorX2x6b192ZXJzaW9uX2RhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gTFpPX1ZFUlNJT05fREFURTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGFkbGVyMzIgY2hlY2tzdW0KKy8vIGFkYXB0ZWQgZnJvbSBmcmVlIGNvZGUgYnkgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KKy8vIHNlZSBodHRwOi8vd3d3LnpsaWIub3JnLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExaT19CQVNFIDY1NTIxdSAvKiBsYXJnZXN0IHByaW1lIHNtYWxsZXIgdGhhbiA2NTUzNiAqLworI2RlZmluZSBMWk9fTk1BWCA1NTUyCisvKiBOTUFYIGlzIHRoZSBsYXJnZXN0IG4gc3VjaCB0aGF0IDI1NW4obisxKS8yICsgKG4rMSkoQkFTRS0xKSA8PSAyXjMyLTEgKi8KKworI2RlZmluZSBMWk9fRE8xKGJ1ZixpKSAgczEgKz0gYnVmW2ldOyBzMiArPSBzMQorI2RlZmluZSBMWk9fRE8yKGJ1ZixpKSAgTFpPX0RPMShidWYsaSk7IExaT19ETzEoYnVmLGkrMSk7CisjZGVmaW5lIExaT19ETzQoYnVmLGkpICBMWk9fRE8yKGJ1ZixpKTsgTFpPX0RPMihidWYsaSsyKTsKKyNkZWZpbmUgTFpPX0RPOChidWYsaSkgIExaT19ETzQoYnVmLGkpOyBMWk9fRE80KGJ1ZixpKzQpOworI2RlZmluZSBMWk9fRE8xNihidWYsaSkgTFpPX0RPOChidWYsaSk7IExaT19ETzgoYnVmLGkrOCk7CisKK0xaT19QVUJMSUMobHpvX3VpbnQzMl90KQorbHpvX2FkbGVyMzIobHpvX3VpbnQzMl90IGFkbGVyLCBjb25zdCBsem9fYnl0ZXAgYnVmLCBsem9fdWludCBsZW4pCit7CisgICAgbHpvX3VpbnQzMl90IHMxID0gYWRsZXIgJiAweGZmZmY7CisgICAgbHpvX3VpbnQzMl90IHMyID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKKyAgICB1bnNpZ25lZCBrOworCisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgICAgayA9IGxlbiA8IExaT19OTUFYID8gKHVuc2lnbmVkKSBsZW4gOiBMWk9fTk1BWDsKKyAgICAgICAgbGVuIC09IGs7CisgICAgICAgIGlmIChrID49IDE2KSBkbworICAgICAgICB7CisgICAgICAgICAgICBMWk9fRE8xNihidWYsMCk7CisgICAgICAgICAgICBidWYgKz0gMTY7CisgICAgICAgICAgICBrIC09IDE2OworICAgICAgICB9IHdoaWxlIChrID49IDE2KTsKKyAgICAgICAgaWYgKGsgIT0gMCkgZG8KKyAgICAgICAgeworICAgICAgICAgICAgczEgKz0gKmJ1ZisrOworICAgICAgICAgICAgczIgKz0gczE7CisgICAgICAgIH0gd2hpbGUgKC0tayA+IDApOworICAgICAgICBzMSAlPSBMWk9fQkFTRTsKKyAgICAgICAgczIgJT0gTFpPX0JBU0U7CisgICAgfQorICAgIHJldHVybiAoczIgPDwgMTYpIHwgczE7Cit9CisKKyN1bmRlZiBMWk9fRE8xCisjdW5kZWYgTFpPX0RPMgorI3VuZGVmIExaT19ETzQKKyN1bmRlZiBMWk9fRE84CisjdW5kZWYgTFpPX0RPMTYKKworCisvKgordmk6dHM9NDpldAorKi8KZGlmZiAtLWdpdCBhL2x6by9zcmMvbWluaWFjYy5oIGIvbHpvL3NyYy9taW5pYWNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1YTIwYgotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvbWluaWFjYy5oCkBAIC0wLDAgKzEsNjU1MyBAQAorLyogQUNDIC0tLSBBdXRvbWF0aWMgQ29tcGlsZXIgQ29uZmlndXJhdGlvbgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMjAwOCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDcgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA2IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwNSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDAzIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDEgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDAwIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5OSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5NiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisjaWZuZGVmIF9fQUNDX0hfSU5DTFVERUQKKyNkZWZpbmUgX19BQ0NfSF9JTkNMVURFRCAxCisjZGVmaW5lIEFDQ19WRVJTSU9OICAgICAyMDA4MDQzMEwKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOMzJfXykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyMgIGRlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXworI2VuZGlmCisjaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiAhZGVmaW5lZChfX0lCTUNfXykKKyMgIGRlZmluZSBfX0lCTUNfXyBfX0lCTUNQUF9fCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fSUNMKSAmJiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyMgIGRlZmluZSBfX0lOVEVMX0NPTVBJTEVSIF9fSUNMCisjZW5kaWYKKyNpZiAxICYmIGRlZmluZWQoX19JTlRFUklYKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfQUxMX1NPVVJDRSkKKyMgIGRlZmluZSBfQUxMX1NPVVJDRSAxCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fUjU5MDBfXykKKyMgIGlmICFkZWZpbmVkKF9fTE9OR19NQVhfXykKKyMgICAgZGVmaW5lIF9fTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAorIyAgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgZGVmaW5lZChfX2xpbnV4X18pCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiAxOTMpCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fS0VJTF9fKSAmJiBkZWZpbmVkKF9fQzE2Nl9fKQorIyAgcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA9IDMyMgorI2VsaWYgMCAmJiBkZWZpbmVkKF9fQzI1MV9fKQorIyAgcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA9IDMyMgorI2VuZGlmCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19NV0VSS1NfXykKKyMgIGlmIChfTVNDX1ZFUiA+PSAxMzAwKQorIyAgICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0NjY4KQorIyAgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19QT0NDX18pICYmIGRlZmluZWQoX1dJTjMyKQorIyAgaWYgKF9fUE9DQ19fID49IDQwMCkKKyMgICAgcHJhZ21hIHdhcm4oZGlzYWJsZTogMjIxNikKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAwICYmIGRlZmluZWQoX19XQVRDT01DX18pCisjICBpZiAoX19XQVRDT01DX18gPj0gMTA1MCkgJiYgKF9fV0FUQ09NQ19fIDwgMTA2MCkKKyMgICAgcHJhZ21hIHdhcm5pbmcgMjAzIDkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKQorIyAgcHJhZ21hIG9wdGlvbiAtaAorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfQ0ZHX05PX0NPTkZJR19IRUFERVIpCisjZWxpZiBkZWZpbmVkKEFDQ19DRkdfQ09ORklHX0hFQURFUikKKyMgIGluY2x1ZGUgQUNDX0NGR19DT05GSUdfSEVBREVSCisjZWxzZQorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfQ0ZHX05PX0xJTUlUU19IKQorI2VsaWYgZGVmaW5lZChBQ0NfTElCQ19OQUtFRCkgfHwgZGVmaW5lZChBQ0NfQlJPS0VOX0xJTUlUU19IKQorI2lmbmRlZiBfX0FDQ19GQUxMQkFDS19MSU1JVFNfSF9JTkNMVURFRAorI2RlZmluZSBfX0FDQ19GQUxMQkFDS19MSU1JVFNfSF9JTkNMVURFRAorI3VuZGVmIENIQVJfQklUCisjZGVmaW5lIENIQVJfQklUICAgICAgICA4CisjaWZuZGVmIE1CX0xFTl9NQVgKKyNkZWZpbmUgTUJfTEVOX01BWCAgICAgIDEKKyNlbmRpZgorI2lmbmRlZiBfX1NDSEFSX01BWF9fCisjZGVmaW5lIF9fU0NIQVJfTUFYX18gICAxMjcKKyNlbmRpZgorI2lmbmRlZiBfX1NIUlRfTUFYX18KKyNkZWZpbmUgX19TSFJUX01BWF9fICAgIDMyNzY3CisjZW5kaWYKKyNpZm5kZWYgX19JTlRfTUFYX18KKyNkZWZpbmUgX19JTlRfTUFYX18gICAgIDIxNDc0ODM2NDcKKyNlbmRpZgorI2lmbmRlZiBfX0xPTkdfTUFYX18KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfTFA2NCkgfHwgZGVmaW5lZChfX01JUFNfUFNYMl9fKQorI2RlZmluZSBfX0xPTkdfTUFYX18gICAgOTIyMzM3MjAzNjg1NDc3NTgwN0wKKyNlbHNlCisjZGVmaW5lIF9fTE9OR19NQVhfXyAgICAyMTQ3NDgzNjQ3TAorI2VuZGlmCisjZW5kaWYKKyN1bmRlZiBTQ0hBUl9NSU4KKyN1bmRlZiBTQ0hBUl9NQVgKKyN1bmRlZiBVQ0hBUl9NQVgKKyNkZWZpbmUgU0NIQVJfTUlOICAgICAgICgtMSAtIFNDSEFSX01BWCkKKyNkZWZpbmUgU0NIQVJfTUFYICAgICAgIChfX1NDSEFSX01BWF9fKQorI2RlZmluZSBVQ0hBUl9NQVggICAgICAgKFNDSEFSX01BWCAqIDIgKyAxKQorI3VuZGVmIFNIUlRfTUlOCisjdW5kZWYgU0hSVF9NQVgKKyN1bmRlZiBVU0hSVF9NQVgKKyNkZWZpbmUgU0hSVF9NSU4gICAgICAgICgtMSAtIFNIUlRfTUFYKQorI2RlZmluZSBTSFJUX01BWCAgICAgICAgKF9fU0hSVF9NQVhfXykKKyNpZiAoKF9fSU5UX01BWF9fKSA9PSAoX19TSFJUX01BWF9fKSkKKyNkZWZpbmUgVVNIUlRfTUFYICAgICAgIChTSFJUX01BWCAqIDJVICsgMVUpCisjZWxzZQorI2RlZmluZSBVU0hSVF9NQVggICAgICAgKFNIUlRfTUFYICogMiArIDEpCisjZW5kaWYKKyN1bmRlZiBJTlRfTUlOCisjdW5kZWYgSU5UX01BWAorI3VuZGVmIFVJTlRfTUFYCisjZGVmaW5lIElOVF9NSU4gICAgICAgICAoLTEgLSBJTlRfTUFYKQorI2RlZmluZSBJTlRfTUFYICAgICAgICAgKF9fSU5UX01BWF9fKQorI2RlZmluZSBVSU5UX01BWCAgICAgICAgKElOVF9NQVggKiAyVSArIDFVKQorI3VuZGVmIExPTkdfTUlOCisjdW5kZWYgTE9OR19NQVgKKyN1bmRlZiBVTE9OR19NQVgKKyNkZWZpbmUgTE9OR19NSU4gICAgICAgICgtMUwgLSBMT05HX01BWCkKKyNkZWZpbmUgTE9OR19NQVggICAgICAgICgoX19MT05HX01BWF9fKSArIDBMKQorI2RlZmluZSBVTE9OR19NQVggICAgICAgKExPTkdfTUFYICogMlVMICsgMVVMKQorI3VuZGVmIENIQVJfTUlOCisjdW5kZWYgQ0hBUl9NQVgKKyNpZiBkZWZpbmVkKF9fQ0hBUl9VTlNJR05FRF9fKSB8fCBkZWZpbmVkKF9DSEFSX1VOU0lHTkVEKQorI2RlZmluZSBDSEFSX01JTiAgICAgICAgMAorI2RlZmluZSBDSEFSX01BWCAgICAgICAgVUNIQVJfTUFYCisjZWxzZQorI2RlZmluZSBDSEFSX01JTiAgICAgICAgU0NIQVJfTUlOCisjZGVmaW5lIENIQVJfTUFYICAgICAgICBTQ0hBUl9NQVgKKyNlbmRpZgorI2VuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKyNpZiAwCisjZGVmaW5lIEFDQ18weGZmZmZMICAgICAgICAgICAgIDB4ZmZmZnVsCisjZGVmaW5lIEFDQ18weGZmZmZmZmZmTCAgICAgICAgIDB4ZmZmZmZmZmZ1bAorI2Vsc2UKKyNkZWZpbmUgQUNDXzB4ZmZmZkwgICAgICAgICAgICAgNjU1MzV1bAorI2RlZmluZSBBQ0NfMHhmZmZmZmZmZkwgICAgICAgICA0Mjk0OTY3Mjk1dWwKKyNlbmRpZgorI2lmIChBQ0NfMHhmZmZmTCA9PSBBQ0NfMHhmZmZmZmZmZkwpCisjICBlcnJvciAieW91ciBwcmVwcm9jZXNzb3IgaXMgYnJva2VuIDEiCisjZW5kaWYKKyNpZiAoMTZ1bCAqIDE2Mzg0dWwgIT0gMjYyMTQ0dWwpCisjICBlcnJvciAieW91ciBwcmVwcm9jZXNzb3IgaXMgYnJva2VuIDIiCisjZW5kaWYKKyNpZiAwCisjaWYgKDMyNzY3ID49IDQyOTQ5NjcyOTV1bCkKKyMgIGVycm9yICJ5b3VyIHByZXByb2Nlc3NvciBpcyBicm9rZW4gMyIKKyNlbmRpZgorI2lmICg2NTUzNXUgPj0gNDI5NDk2NzI5NXVsKQorIyAgZXJyb3IgInlvdXIgcHJlcHJvY2Vzc29yIGlzIGJyb2tlbiA0IgorI2VuZGlmCisjZW5kaWYKKyNpZiAoVUlOVF9NQVggPT0gQUNDXzB4ZmZmZkwpCisjaWYgZGVmaW5lZChfX1pUQ19fKSAmJiBkZWZpbmVkKF9fSTg2X18pICYmICFkZWZpbmVkKF9fT1MyX18pCisjICBpZiAhZGVmaW5lZChNU0RPUykKKyMgICAgZGVmaW5lIE1TRE9TIDEKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChfTVNET1MpCisjICAgIGRlZmluZSBfTVNET1MgMQorIyAgZW5kaWYKKyNlbGlmIDAgJiYgZGVmaW5lZChfX1ZFUlNJT04pICYmIGRlZmluZWQoTUJfTEVOX01BWCkKKyMgIGlmIChfX1ZFUlNJT04gPT0gNTIwKSAmJiAoTUJfTEVOX01BWCA9PSAxKQorIyAgICBpZiAhZGVmaW5lZChfX0FaVEVDX0NfXykKKyMgICAgICBkZWZpbmUgX19BWlRFQ19DX18gX19WRVJTSU9OCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkKF9fRE9TX18pCisjICAgICAgZGVmaW5lIF9fRE9TX18gMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNX0k4NkhNKSAmJiAoVUlOVF9NQVggPT0gQUNDXzB4ZmZmZkwpCisjICBkZWZpbmUgcHRyZGlmZl90IGxvbmcKKyMgIGRlZmluZSBfUFRSRElGRl9UX0RFRklORUQKKyNlbmRpZgorI2lmIChVSU5UX01BWCA9PSBBQ0NfMHhmZmZmTCkKKyMgIHVuZGVmIF9fQUNDX1JFTkFNRV9BCisjICB1bmRlZiBfX0FDQ19SRU5BTUVfQgorIyAgaWYgZGVmaW5lZChfX0FaVEVDX0NfXykgJiYgZGVmaW5lZChfX0RPU19fKQorIyAgICBkZWZpbmUgX19BQ0NfUkVOQU1FX0EgMQorIyAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKE1TRE9TKQorIyAgICBpZiAoX01TQ19WRVIgPCA2MDApCisjICAgICAgZGVmaW5lIF9fQUNDX1JFTkFNRV9BIDEKKyMgICAgZWxpZiAoX01TQ19WRVIgPCA3MDApCisjICAgICAgZGVmaW5lIF9fQUNDX1JFTkFNRV9CIDEKKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZChfX1RTQ19fKSAmJiBkZWZpbmVkKF9fT1MyX18pCisjICAgIGRlZmluZSBfX0FDQ19SRU5BTUVfQSAxCisjICBlbGlmIGRlZmluZWQoX19NU0RPU19fKSAmJiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIChfX1RVUkJPQ19fIDwgMHgwNDEwKQorIyAgICBkZWZpbmUgX19BQ0NfUkVOQU1FX0EgMQorIyAgZWxpZiBkZWZpbmVkKF9fUEFDSUZJQ19fKSAmJiBkZWZpbmVkKERPUykKKyMgICAgaWYgIWRlZmluZWQoX19mYXIpCisjICAgICAgZGVmaW5lIF9fZmFyIGZhcgorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChfX25lYXIpCisjICAgICAgZGVmaW5lIF9fbmVhciBuZWFyCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChfX0FDQ19SRU5BTUVfQSkKKyMgICAgaWYgIWRlZmluZWQoX19jZGVjbCkKKyMgICAgICBkZWZpbmUgX19jZGVjbCBjZGVjbAorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChfX2ZhcikKKyMgICAgICBkZWZpbmUgX19mYXIgZmFyCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkKF9faHVnZSkKKyMgICAgICBkZWZpbmUgX19odWdlIGh1Z2UKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19uZWFyKQorIyAgICAgIGRlZmluZSBfX25lYXIgbmVhcgorIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChfX3Bhc2NhbCkKKyMgICAgICBkZWZpbmUgX19wYXNjYWwgcGFzY2FsCisjICAgIGVuZGlmCisjICAgIGlmICFkZWZpbmVkKF9faHVnZSkKKyMgICAgICBkZWZpbmUgX19odWdlIGh1Z2UKKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZChfX0FDQ19SRU5BTUVfQikKKyMgICAgaWYgIWRlZmluZWQoX19jZGVjbCkKKyMgICAgICBkZWZpbmUgX19jZGVjbCBfY2RlY2wKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19mYXIpCisjICAgICAgZGVmaW5lIF9fZmFyIF9mYXIKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19odWdlKQorIyAgICAgIGRlZmluZSBfX2h1Z2UgX2h1Z2UKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19uZWFyKQorIyAgICAgIGRlZmluZSBfX25lYXIgX25lYXIKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19wYXNjYWwpCisjICAgICAgZGVmaW5lIF9fcGFzY2FsIF9wYXNjYWwKKyMgICAgZW5kaWYKKyMgIGVsaWYgKGRlZmluZWQoX19QVVJFQ19fKSB8fCBkZWZpbmVkKF9fVFVSQk9DX18pKSAmJiBkZWZpbmVkKF9fVE9TX18pCisjICAgIGlmICFkZWZpbmVkKF9fY2RlY2wpCisjICAgICAgZGVmaW5lIF9fY2RlY2wgY2RlY2wKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoX19wYXNjYWwpCisjICAgICAgZGVmaW5lIF9fcGFzY2FsIHBhc2NhbAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIHVuZGVmIF9fQUNDX1JFTkFNRV9BCisjICB1bmRlZiBfX0FDQ19SRU5BTUVfQgorI2VuZGlmCisjaWYgKFVJTlRfTUFYID09IEFDQ18weGZmZmZMKQorI2lmIGRlZmluZWQoX19BWlRFQ19DX18pICYmIGRlZmluZWQoX19ET1NfXykKKyMgIGRlZmluZSBBQ0NfQlJPS0VOX0NERUNMX0FMVF9TWU5UQVggMQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNU0RPUykKKyMgIGlmIChfTVNDX1ZFUiA8IDYwMCkKKyMgICAgZGVmaW5lIEFDQ19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTIDEKKyMgIGVuZGlmCisjICBpZiAoX01TQ19WRVIgPCA3MDApCisjICAgIGRlZmluZSBBQ0NfQlJPS0VOX0lOVEVHUkFMX1BST01PVElPTiAxCisjICAgIGRlZmluZSBBQ0NfQlJPS0VOX1NJWkVPRiAxCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX1BBQ0lGSUNfXykgJiYgZGVmaW5lZChET1MpCisjICBkZWZpbmUgQUNDX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMgMQorI2VsaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiBkZWZpbmVkKF9fTVNET1NfXykKKyMgIGlmIChfX1RVUkJPQ19fIDwgMHgwMTUwKQorIyAgICBkZWZpbmUgQUNDX0JST0tFTl9DREVDTF9BTFRfU1lOVEFYIDEKKyMgICAgZGVmaW5lIEFDQ19CUk9LRU5fSU5URUdSQUxfQ09OU1RBTlRTIDEKKyMgICAgZGVmaW5lIEFDQ19CUk9LRU5fSU5URUdSQUxfUFJPTU9USU9OIDEKKyMgIGVuZGlmCisjICBpZiAoX19UVVJCT0NfXyA8IDB4MDIwMCkKKyMgICAgZGVmaW5lIEFDQ19CUk9LRU5fU0laRU9GIDEKKyMgIGVuZGlmCisjICBpZiAoX19UVVJCT0NfXyA8IDB4MDQwMCkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgZGVmaW5lIEFDQ19CUk9LRU5fQ0RFQ0xfQUxUX1NZTlRBWCAxCisjICBlbmRpZgorI2VsaWYgKGRlZmluZWQoX19QVVJFQ19fKSB8fCBkZWZpbmVkKF9fVFVSQk9DX18pKSAmJiBkZWZpbmVkKF9fVE9TX18pCisjICBkZWZpbmUgQUNDX0JST0tFTl9DREVDTF9BTFRfU1lOVEFYIDEKKyMgIGRlZmluZSBBQ0NfQlJPS0VOX1NJWkVPRiAxCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19XQVRDT01DX18pICYmIChfX1dBVENPTUNfXyA8IDkwMCkKKyMgIGRlZmluZSBBQ0NfQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUyAxCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9DUkFZKSAmJiBkZWZpbmVkKF9DUkFZMSkKKyMgIGRlZmluZSBBQ0NfQlJPS0VOX1NJR05FRF9SSUdIVF9TSElGVCAxCisjZW5kaWYKKyNkZWZpbmUgQUNDX1BQX1NUUklOR0laRSh4KSAgICAgICAgICAgICAjeAorI2RlZmluZSBBQ0NfUFBfTUFDUk9fRVhQQU5EKHgpICAgICAgICAgIEFDQ19QUF9TVFJJTkdJWkUoeCkKKyNkZWZpbmUgQUNDX1BQX0NPTkNBVDIoYSxiKSAgICAgICAgICAgICBhICMjIGIKKyNkZWZpbmUgQUNDX1BQX0NPTkNBVDMoYSxiLGMpICAgICAgICAgICBhICMjIGIgIyMgYworI2RlZmluZSBBQ0NfUFBfQ09OQ0FUNChhLGIsYyxkKSAgICAgICAgIGEgIyMgYiAjIyBjICMjIGQKKyNkZWZpbmUgQUNDX1BQX0NPTkNBVDUoYSxiLGMsZCxlKSAgICAgICBhICMjIGIgIyMgYyAjIyBkICMjIGUKKyNkZWZpbmUgQUNDX1BQX0VDT05DQVQyKGEsYikgICAgICAgICAgICBBQ0NfUFBfQ09OQ0FUMihhLGIpCisjZGVmaW5lIEFDQ19QUF9FQ09OQ0FUMyhhLGIsYykgICAgICAgICAgQUNDX1BQX0NPTkNBVDMoYSxiLGMpCisjZGVmaW5lIEFDQ19QUF9FQ09OQ0FUNChhLGIsYyxkKSAgICAgICAgQUNDX1BQX0NPTkNBVDQoYSxiLGMsZCkKKyNkZWZpbmUgQUNDX1BQX0VDT05DQVQ1KGEsYixjLGQsZSkgICAgICBBQ0NfUFBfQ09OQ0FUNShhLGIsYyxkLGUpCisjaWYgMQorI2RlZmluZSBBQ0NfQ1BQX1NUUklOR0laRSh4KSAgICAgICAgICAgICN4CisjZGVmaW5lIEFDQ19DUFBfTUFDUk9fRVhQQU5EKHgpICAgICAgICAgQUNDX0NQUF9TVFJJTkdJWkUoeCkKKyNkZWZpbmUgQUNDX0NQUF9DT05DQVQyKGEsYikgICAgICAgICAgICBhICMjIGIKKyNkZWZpbmUgQUNDX0NQUF9DT05DQVQzKGEsYixjKSAgICAgICAgICBhICMjIGIgIyMgYworI2RlZmluZSBBQ0NfQ1BQX0NPTkNBVDQoYSxiLGMsZCkgICAgICAgIGEgIyMgYiAjIyBjICMjIGQKKyNkZWZpbmUgQUNDX0NQUF9DT05DQVQ1KGEsYixjLGQsZSkgICAgICBhICMjIGIgIyMgYyAjIyBkICMjIGUKKyNkZWZpbmUgQUNDX0NQUF9FQ09OQ0FUMihhLGIpICAgICAgICAgICBBQ0NfQ1BQX0NPTkNBVDIoYSxiKQorI2RlZmluZSBBQ0NfQ1BQX0VDT05DQVQzKGEsYixjKSAgICAgICAgIEFDQ19DUFBfQ09OQ0FUMyhhLGIsYykKKyNkZWZpbmUgQUNDX0NQUF9FQ09OQ0FUNChhLGIsYyxkKSAgICAgICBBQ0NfQ1BQX0NPTkNBVDQoYSxiLGMsZCkKKyNkZWZpbmUgQUNDX0NQUF9FQ09OQ0FUNShhLGIsYyxkLGUpICAgICBBQ0NfQ1BQX0NPTkNBVDUoYSxiLGMsZCxlKQorI2VuZGlmCisjZGVmaW5lIF9fQUNDX01BU0tfR0VOKG8sYikgICAgICgoKCgobykgPDwgKChiKS0xKSkgLSAobykpIDw8IDEpICsgKG8pKQorI2lmIDEgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgIGlmICFkZWZpbmVkKF9fU1REQ19DT05TVEFOVF9NQUNST1MpCisjICAgIGRlZmluZSBfX1NURENfQ09OU1RBTlRfTUFDUk9TIDEKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChfX1NURENfTElNSVRfTUFDUk9TKQorIyAgICBkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyAxCisjICBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBBQ0NfRVhURVJOX0MgZXh0ZXJuICJDIgorI2Vsc2UKKyMgIGRlZmluZSBBQ0NfRVhURVJOX0MgZXh0ZXJuCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX0FDQ19PU19PVkVSUklERSkKKyNpZiBkZWZpbmVkKEFDQ19PU19GUkVFU1RBTkRJTkcpCisjICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAgICJmcmVlc3RhbmRpbmciCisjZWxpZiBkZWZpbmVkKEFDQ19PU19FTUJFRERFRCkKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgImVtYmVkZGVkIgorI2VsaWYgMSAmJiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pCisjICBkZWZpbmUgQUNDX09TX0VNQkVEREVEICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgImVtYmVkZGVkIgorI2VsaWYgZGVmaW5lZChfX0NZR1dJTl9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIEFDQ19PU19DWUdXSU4gICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAgICJjeWd3aW4iCisjZWxpZiBkZWZpbmVkKF9fRU1YX18pICYmIGRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgQUNDX09TX0VNWCAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgImVteCIKKyNlbGlmIGRlZmluZWQoX19CRU9TX18pCisjICBkZWZpbmUgQUNDX09TX0JFT1MgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgImJlb3MiCisjZWxpZiBkZWZpbmVkKF9fTHlueF9fKQorIyAgZGVmaW5lIEFDQ19PU19MWU5YT1MgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAgICJseW54b3MiCisjZWxpZiBkZWZpbmVkKF9fT1M0MDBfXykKKyMgIGRlZmluZSBBQ0NfT1NfT1M0MDAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX09TICAgICAgICAgICAib3M0MDAiCisjZWxpZiBkZWZpbmVkKF9fUU5YX18pCisjICBkZWZpbmUgQUNDX09TX1FOWCAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgInFueCIKKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKF9fRFBNSTMyX18pICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNDYwKQorIyAgZGVmaW5lIEFDQ19PU19ET1MzMiAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAgICJkb3MzMiIKKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkKF9fRFBNSTE2X18pCisjICBkZWZpbmUgQUNDX09TX0RPUzE2ICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgImRvczE2IgorI2VsaWYgZGVmaW5lZChfX1pUQ19fKSAmJiBkZWZpbmVkKERPUzM4NikKKyMgIGRlZmluZSBBQ0NfT1NfRE9TMzIgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX09TICAgICAgICAgICAiZG9zMzIiCisjZWxpZiBkZWZpbmVkKF9fT1MyX18pIHx8IGRlZmluZWQoX19PUzJWMl9fKQorIyAgaWYgKFVJTlRfTUFYID09IEFDQ18weGZmZmZMKQorIyAgICBkZWZpbmUgQUNDX09TX09TMjE2ICAgICAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICJvczIxNiIKKyMgIGVsaWYgKFVJTlRfTUFYID09IEFDQ18weGZmZmZmZmZmTCkKKyMgICAgZGVmaW5lIEFDQ19PU19PUzIgICAgICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAib3MyIgorIyAgZWxzZQorIyAgICBlcnJvciAiY2hlY2sgeW91ciBsaW1pdHMuaCBoZWFkZXIiCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX1dJTjY0X18pIHx8IGRlZmluZWQoX1dJTjY0KSB8fCBkZWZpbmVkKFdJTjY0KQorIyAgZGVmaW5lIEFDQ19PU19XSU42NCAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAgICJ3aW42NCIKKyNlbGlmIGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dJTkRPV1NfMzg2X18pCisjICBkZWZpbmUgQUNDX09TX1dJTjMyICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgIndpbjMyIgorI2VsaWYgZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKF9fSU5URUxfXykKKyMgIGRlZmluZSBBQ0NfT1NfV0lOMzIgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX09TICAgICAgICAgICAid2luMzIiCisjZWxpZiBkZWZpbmVkKF9fV0lORE9XU19fKSB8fCBkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKF9XaW5kb3dzKQorIyAgaWYgKFVJTlRfTUFYID09IEFDQ18weGZmZmZMKQorIyAgICBkZWZpbmUgQUNDX09TX1dJTjE2ICAgICAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICJ3aW4xNiIKKyMgIGVsaWYgKFVJTlRfTUFYID09IEFDQ18weGZmZmZmZmZmTCkKKyMgICAgZGVmaW5lIEFDQ19PU19XSU4zMiAgICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAid2luMzIiCisjICBlbHNlCisjICAgIGVycm9yICJjaGVjayB5b3VyIGxpbWl0cy5oIGhlYWRlciIKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fRE9TX18pIHx8IGRlZmluZWQoX19NU0RPU19fKSB8fCBkZWZpbmVkKF9NU0RPUykgfHwgZGVmaW5lZChNU0RPUykgfHwgKGRlZmluZWQoX19QQUNJRklDX18pICYmIGRlZmluZWQoRE9TKSkKKyMgIGlmIChVSU5UX01BWCA9PSBBQ0NfMHhmZmZmTCkKKyMgICAgZGVmaW5lIEFDQ19PU19ET1MxNiAgICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAiZG9zMTYiCisjICBlbGlmIChVSU5UX01BWCA9PSBBQ0NfMHhmZmZmZmZmZkwpCisjICAgIGRlZmluZSBBQ0NfT1NfRE9TMzIgICAgICAgIDEKKyMgICAgZGVmaW5lIEFDQ19JTkZPX09TICAgICAgICAgImRvczMyIgorIyAgZWxzZQorIyAgICBlcnJvciAiY2hlY2sgeW91ciBsaW1pdHMuaCBoZWFkZXIiCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKKyMgIGlmIGRlZmluZWQoX19OVF9fKSAmJiAoVUlOVF9NQVggPT0gQUNDXzB4ZmZmZkwpCisjICAgIGRlZmluZSBBQ0NfT1NfRE9TMTYgICAgICAgIDEKKyMgICAgZGVmaW5lIEFDQ19JTkZPX09TICAgICAgICAgImRvczE2IgorIyAgZWxpZiBkZWZpbmVkKF9fTlRfXykgJiYgKF9fV0FUQ09NQ19fIDwgMTEwMCkKKyMgICAgZGVmaW5lIEFDQ19PU19XSU4zMiAgICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAid2luMzIiCisjICBlbGlmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fTElOVVhfXykKKyMgICAgZGVmaW5lIEFDQ19PU19QT1NJWCAgICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAicG9zaXgiCisjICBlbHNlCisjICAgIGVycm9yICJwbGVhc2Ugc3BlY2lmeSBhIHRhcmdldCB1c2luZyB0aGUgLWJ0IGNvbXBpbGVyIG9wdGlvbiIKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fcGFsbW9zX18pCisjICBkZWZpbmUgQUNDX09TX1BBTE1PUyAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgInBhbG1vcyIKKyNlbGlmIGRlZmluZWQoX19UT1NfXykgfHwgZGVmaW5lZChfX2F0YXJpc3RfXykKKyMgIGRlZmluZSBBQ0NfT1NfVE9TICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX09TICAgICAgICAgICAidG9zIgorI2VsaWYgZGVmaW5lZChtYWNpbnRvc2gpICYmICFkZWZpbmVkKF9fcHBjX18pCisjICBkZWZpbmUgQUNDX09TX01BQ0NMQVNTSUMgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgIm1hY2NsYXNzaWMiCisjZWxpZiBkZWZpbmVkKF9fVk1TKQorIyAgZGVmaW5lIEFDQ19PU19WTVMgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAgICJ2bXMiCisjZWxpZiAoKGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19SNTkwMF9fKSkgfHwgZGVmaW5lZChfX01JUFNfUFNYMl9fKSkKKyMgIGRlZmluZSBBQ0NfT1NfQ09OU09MRSAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19PU19DT05TT0xFX1BTMiAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fT1MgICAgICAgICAgICJjb25zb2xlIgorIyAgZGVmaW5lIEFDQ19JTkZPX09TX0NPTlNPTEUgICAicHMyIgorI2VsaWYgKGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19wc3BfXykpCisjICBkZWZpbmUgQUNDX09TX0NPTlNPTEUgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfT1NfQ09OU09MRV9QU1AgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX09TICAgICAgICAgICAiY29uc29sZSIKKyMgIGRlZmluZSBBQ0NfSU5GT19PU19DT05TT0xFICAgInBzcCIKKyNlbHNlCisjICBkZWZpbmUgQUNDX09TX1BPU0lYICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19PUyAgICAgICAgICAgInBvc2l4IgorI2VuZGlmCisjaWYgKEFDQ19PU19QT1NJWCkKKyMgIGlmIGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX0FJWF9fKSB8fCBkZWZpbmVkKF9fYWl4X18pCisjICAgIGRlZmluZSBBQ0NfT1NfUE9TSVhfQUlYICAgICAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19PU19QT1NJWCAgICAgICAiYWl4IgorIyAgZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQorIyAgICBkZWZpbmUgQUNDX09TX1BPU0lYX0ZSRUVCU0QgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1NfUE9TSVggICAgICAgImZyZWVic2QiCisjICBlbGlmIGRlZmluZWQoX19ocHV4X18pIHx8IGRlZmluZWQoX19ocHV4KQorIyAgICBkZWZpbmUgQUNDX09TX1BPU0lYX0hQVVggICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1NfUE9TSVggICAgICAgImhwdXgiCisjICBlbGlmIGRlZmluZWQoX19JTlRFUklYKQorIyAgICBkZWZpbmUgQUNDX09TX1BPU0lYX0lOVEVSSVggICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1NfUE9TSVggICAgICAgImludGVyaXgiCisjICBlbGlmIGRlZmluZWQoX19JUklYX18pIHx8IGRlZmluZWQoX19pcml4X18pCisjICAgIGRlZmluZSBBQ0NfT1NfUE9TSVhfSVJJWCAgICAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19PU19QT1NJWCAgICAgICAiaXJpeCIKKyMgIGVsaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChfX0xJTlVYX18pCisjICAgIGRlZmluZSBBQ0NfT1NfUE9TSVhfTElOVVggICAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19PU19QT1NJWCAgICAgICAibGludXgiCisjICBlbGlmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fTUFDT1NfXykKKyMgICAgZGVmaW5lIEFDQ19PU19QT1NJWF9NQUNPU1ggICAgIDEKKyMgICAgZGVmaW5lIEFDQ19JTkZPX09TX1BPU0lYICAgICAgICJtYWNvc3giCisjICBlbGlmIGRlZmluZWQoX19taW5peF9fKSB8fCBkZWZpbmVkKF9fbWluaXgpCisjICAgIGRlZmluZSBBQ0NfT1NfUE9TSVhfTUlOSVggICAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19PU19QT1NJWCAgICAgICAibWluaXgiCisjICBlbGlmIGRlZmluZWQoX19OZXRCU0RfXykKKyMgICAgZGVmaW5lIEFDQ19PU19QT1NJWF9ORVRCU0QgICAgIDEKKyMgICAgZGVmaW5lIEFDQ19JTkZPX09TX1BPU0lYICAgICAgICJuZXRic2QiCisjICBlbGlmIGRlZmluZWQoX19PcGVuQlNEX18pCisjICAgIGRlZmluZSBBQ0NfT1NfUE9TSVhfT1BFTkJTRCAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19PU19QT1NJWCAgICAgICAib3BlbmJzZCIKKyMgIGVsaWYgZGVmaW5lZChfX29zZl9fKQorIyAgICBkZWZpbmUgQUNDX09TX1BPU0lYX09TRiAgICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1NfUE9TSVggICAgICAgIm9zZiIKKyMgIGVsaWYgZGVmaW5lZChfX3NvbGFyaXNfXykgfHwgZGVmaW5lZChfX3N1bikKKyMgICAgaWYgZGVmaW5lZChfX1NWUjQpIHx8IGRlZmluZWQoX19zdnI0X18pCisjICAgICAgZGVmaW5lIEFDQ19PU19QT1NJWF9TT0xBUklTICAxCisjICAgICAgZGVmaW5lIEFDQ19JTkZPX09TX1BPU0lYICAgICAic29sYXJpcyIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBBQ0NfT1NfUE9TSVhfU1VOT1MgICAgMQorIyAgICAgIGRlZmluZSBBQ0NfSU5GT19PU19QT1NJWCAgICAgInN1bm9zIgorIyAgICBlbmRpZgorIyAgZWxpZiBkZWZpbmVkKF9fdWx0cml4X18pIHx8IGRlZmluZWQoX191bHRyaXgpCisjICAgIGRlZmluZSBBQ0NfT1NfUE9TSVhfVUxUUklYICAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19PU19QT1NJWCAgICAgICAidWx0cml4IgorIyAgZWxpZiBkZWZpbmVkKF9VTklDT1MpCisjICAgIGRlZmluZSBBQ0NfT1NfUE9TSVhfVU5JQ09TICAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19PU19QT1NJWCAgICAgICAidW5pY29zIgorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX09TX1BPU0lYX1VOS05PV04gICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fT1NfUE9TSVggICAgICAgInVua25vd24iCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19PUzIxNiB8fCBBQ0NfT1NfV0lOMTYpCisjICBpZiAoVUlOVF9NQVggIT0gQUNDXzB4ZmZmZkwpCisjICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgZW5kaWYKKyMgIGlmIChVTE9OR19NQVggIT0gQUNDXzB4ZmZmZmZmZmZMKQorIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoQUNDX09TX0RPUzMyIHx8IEFDQ19PU19PUzIgfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkKKyMgIGlmIChVSU5UX01BWCAhPSBBQ0NfMHhmZmZmZmZmZkwpCisjICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgZW5kaWYKKyMgIGlmIChVTE9OR19NQVggIT0gQUNDXzB4ZmZmZmZmZmZMKQorIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKENJTCkgJiYgZGVmaW5lZChfR05VQ0MpICYmIGRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgQUNDX0NDX0NJTExZICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIkNpbGx5IgorIyAgaWYgZGVmaW5lZChfX0NJTExZX18pCisjICAgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoX19DSUxMWV9fKQorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICAidW5rbm93biIKKyMgIGVuZGlmCisjZWxpZiAwICYmIGRlZmluZWQoU0RDQykgJiYgZGVmaW5lZChfX1ZFUlNJT05fXykgJiYgIWRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgQUNDX0NDX1NEQ0MgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgInNkY2MiCisjICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoU0RDQykKKyNlbGlmIGRlZmluZWQoX19QQVRIU0NBTEVfXykgJiYgZGVmaW5lZChfX1BBVEhDQ19QQVRDSExFVkVMX18pCisjICBkZWZpbmUgQUNDX0NDX1BBVEhTQ0FMRSAgICAgIChfX1BBVEhDQ19fICogMHgxMDAwMEwgKyBfX1BBVEhDQ19NSU5PUl9fICogMHgxMDAgKyBfX1BBVEhDQ19QQVRDSExFVkVMX18pCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJQYXRoc2NhbGUgQyIKKyMgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgICAgX19QQVRIU0NBTEVfXworI2VsaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorIyAgZGVmaW5lIEFDQ19DQ19JTlRFTEMgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJJbnRlbCBDIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICBBQ0NfUFBfTUFDUk9fRVhQQU5EKF9fSU5URUxfQ09NUElMRVIpCisjICBpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisjICAgIGRlZmluZSBBQ0NfQ0NfU1lOVEFYX01TQyAxCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfQ0NfU1lOVEFYX0dOVUMgMQorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19QT0NDX18pICYmIGRlZmluZWQoX1dJTjMyKQorIyAgZGVmaW5lIEFDQ19DQ19QRUxMRVNDICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJQZWxsZXMgQyIKKyMgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgICAgQUNDX1BQX01BQ1JPX0VYUEFORChfX1BPQ0NfXykKKyNlbGlmIGRlZmluZWQoX19sbHZtX18pICYmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19WRVJTSU9OX18pCisjICBpZiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fR05VQ19QQVRDSExFVkVMX18pCisjICAgIGRlZmluZSBBQ0NfQ0NfTExWTSAgICAgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgX19HTlVDX01JTk9SX18gKiAweDEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfQ0NfTExWTSAgICAgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgX19HTlVDX01JTk9SX18gKiAweDEwMCkKKyMgIGVuZGlmCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJsbHZtLWdjYyIKKyMgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgICAgX19WRVJTSU9OX18KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19WRVJTSU9OX18pCisjICBpZiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKSAmJiBkZWZpbmVkKF9fR05VQ19QQVRDSExFVkVMX18pCisjICAgIGRlZmluZSBBQ0NfQ0NfR05VQyAgICAgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgX19HTlVDX01JTk9SX18gKiAweDEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCisjICBlbGlmIGRlZmluZWQoX19HTlVDX01JTk9SX18pCisjICAgIGRlZmluZSBBQ0NfQ0NfR05VQyAgICAgICAgIChfX0dOVUNfXyAqIDB4MTAwMDBMICsgX19HTlVDX01JTk9SX18gKiAweDEwMCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ19DQ19HTlVDICAgICAgICAgKF9fR05VQ19fICogMHgxMDAwMEwpCisjICBlbmRpZgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAiZ2NjIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICBfX1ZFUlNJT05fXworI2VsaWYgZGVmaW5lZChfX0FDS19fKSAmJiBkZWZpbmVkKF9BQ0spCisjICBkZWZpbmUgQUNDX0NDX0FDSyAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIkFtc3RlcmRhbSBDb21waWxlciBLaXQgQyIKKyMgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgICAgInVua25vd24iCisjZWxpZiBkZWZpbmVkKF9fQVpURUNfQ19fKQorIyAgZGVmaW5lIEFDQ19DQ19BWlRFQ0MgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJBenRlYyBDIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICBBQ0NfUFBfTUFDUk9fRVhQQU5EKF9fQVpURUNfQ19fKQorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjICBkZWZpbmUgQUNDX0NDX0JPUkxBTkRDICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIkJvcmxhbmQgQyIKKyMgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgICAgQUNDX1BQX01BQ1JPX0VYUEFORChfX0JPUkxBTkRDX18pCisjZWxpZiBkZWZpbmVkKF9DUkFZQykgJiYgZGVmaW5lZChfUkVMRUFTRSkKKyMgIGRlZmluZSBBQ0NfQ0NfQ1JBWUMgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAiQ3JheSBDIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICBBQ0NfUFBfTUFDUk9fRVhQQU5EKF9SRUxFQVNFKQorI2VsaWYgZGVmaW5lZChfX0RNQ19fKSAmJiBkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBBQ0NfQ0NfRE1DICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAiRGlnaXRhbCBNYXJzIEMiCisjICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoX19ETUNfXykKKyNlbGlmIGRlZmluZWQoX19ERUNDKQorIyAgZGVmaW5lIEFDQ19DQ19ERUNDICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJERUMgQyIKKyMgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgICAgQUNDX1BQX01BQ1JPX0VYUEFORChfX0RFQ0MpCisjZWxpZiBkZWZpbmVkKF9fSElHSENfXykKKyMgIGRlZmluZSBBQ0NfQ0NfSElHSEMgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAiTWV0YVdhcmUgSGlnaCBDIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICAidW5rbm93biIKKyNlbGlmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykKKyMgIGRlZmluZSBBQ0NfQ0NfSUFSQyAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAiSUFSIEMiCisjICBpZiBkZWZpbmVkKF9fVkVSX18pCisjICAgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoX19WRVJfXykKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgInVua25vd24iCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0lCTUNfXykKKyMgIGRlZmluZSBBQ0NfQ0NfSUJNQyAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAiSUJNIEMiCisjICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoX19JQk1DX18pCisjZWxpZiBkZWZpbmVkKF9fS0VJTF9fKSAmJiBkZWZpbmVkKF9fQzE2Nl9fKQorIyAgZGVmaW5lIEFDQ19DQ19LRUlMQyAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJLZWlsIEMiCisjICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoX19DMTY2X18pCisjZWxpZiBkZWZpbmVkKF9fTENDX18pICYmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKF9fTENDT1BUSU1MRVZFTCkKKyMgIGRlZmluZSBBQ0NfQ0NfTENDV0lOMzIgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAibGNjLXdpbjMyIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICAidW5rbm93biIKKyNlbGlmIGRlZmluZWQoX19MQ0NfXykKKyMgIGRlZmluZSBBQ0NfQ0NfTENDICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAibGNjIgorIyAgaWYgZGVmaW5lZChfX0xDQ19WRVJTSU9OX18pCisjICAgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoX19MQ0NfVkVSU0lPTl9fKQorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICAidW5rbm93biIKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgZGVmaW5lIEFDQ19DQ19NU0MgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJNaWNyb3NvZnQgQyIKKyMgIGlmIGRlZmluZWQoX01TQ19GVUxMX1ZFUikKKyMgICAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgQUNDX1BQX01BQ1JPX0VYUEFORChfTVNDX1ZFUikgIi4iIEFDQ19QUF9NQUNST19FWFBBTkQoX01TQ19GVUxMX1ZFUikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgQUNDX1BQX01BQ1JPX0VYUEFORChfTVNDX1ZFUikKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pCisjICBkZWZpbmUgQUNDX0NDX01XRVJLUyAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIk1ldHJvd2Vya3MgQyIKKyMgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgICAgQUNDX1BQX01BQ1JPX0VYUEFORChfX01XRVJLU19fKQorI2VsaWYgKGRlZmluZWQoX19ORFBDX18pIHx8IGRlZmluZWQoX19ORFBYX18pKSAmJiBkZWZpbmVkKF9faTM4NikKKyMgIGRlZmluZSBBQ0NfQ0NfTkRQQyAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAiTWljcm93YXkgTkRQIEMiCisjICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICAgICJ1bmtub3duIgorI2VsaWYgZGVmaW5lZChfX1BBQ0lGSUNfXykKKyMgIGRlZmluZSBBQ0NfQ0NfUEFDSUZJQ0MgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0NDICAgICAgICAgICAiUGFjaWZpYyBDIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICBBQ0NfUFBfTUFDUk9fRVhQQU5EKF9fUEFDSUZJQ19fKQorI2VsaWYgZGVmaW5lZChfX1BHSSkgJiYgKGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpCisjICBkZWZpbmUgQUNDX0NDX1BHSSAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIlBvcnRsYW5kIEdyb3VwIFBHSSBDIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICAidW5rbm93biIKKyNlbGlmIGRlZmluZWQoX19QVVJFQ19fKSAmJiBkZWZpbmVkKF9fVE9TX18pCisjICBkZWZpbmUgQUNDX0NDX1BVUkVDICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIlB1cmUgQyIKKyMgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgICAgQUNDX1BQX01BQ1JPX0VYUEFORChfX1BVUkVDX18pCisjZWxpZiBkZWZpbmVkKF9fU0NfXykgJiYgZGVmaW5lZChfX1pUQ19fKQorIyAgZGVmaW5lIEFDQ19DQ19TWU1BTlRFQ0MgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJTeW1hbnRlYyBDIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICBBQ0NfUFBfTUFDUk9fRVhQQU5EKF9fU0NfXykKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIlN1blBybyBDIgorIyAgaWYgKChfX1NVTlBST19DKSswID4gMCkKKyMgICAgZGVmaW5lIEFDQ19DQ19TVU5QUk9DICAgICAgX19TVU5QUk9fQworIyAgICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICBBQ0NfUFBfTUFDUk9fRVhQQU5EKF9fU1VOUFJPX0MpCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfQ0NfU1VOUFJPQyAgICAgIDEKKyMgICAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgInVua25vd24iCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DQykKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIlN1blBybyBDIgorIyAgaWYgKChfX1NVTlBST19DQykrMCA+IDApCisjICAgIGRlZmluZSBBQ0NfQ0NfU1VOUFJPQyAgICAgIF9fU1VOUFJPX0NDCisjICAgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoX19TVU5QUk9fQ0MpCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfQ0NfU1VOUFJPQyAgICAgIDEKKyMgICAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgInVua25vd24iCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX1RJTllDX18pCisjICBkZWZpbmUgQUNDX0NDX1RJTllDICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIlRpbnkgQyIKKyMgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgICAgQUNDX1BQX01BQ1JPX0VYUEFORChfX1RJTllDX18pCisjZWxpZiBkZWZpbmVkKF9fVFNDX18pCisjICBkZWZpbmUgQUNDX0NDX1RPUFNQRUVEQyAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIlRvcFNwZWVkIEMiCisjICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoX19UU0NfXykKKyNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCisjICBkZWZpbmUgQUNDX0NDX1dBVENPTUMgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIldhdGNvbSBDIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICBBQ0NfUFBfTUFDUk9fRVhQQU5EKF9fV0FUQ09NQ19fKQorI2VsaWYgZGVmaW5lZChfX1RVUkJPQ19fKQorIyAgZGVmaW5lIEFDQ19DQ19UVVJCT0MgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJUdXJibyBDIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICBBQ0NfUFBfTUFDUk9fRVhQQU5EKF9fVFVSQk9DX18pCisjZWxpZiBkZWZpbmVkKF9fWlRDX18pCisjICBkZWZpbmUgQUNDX0NDX1pPUlRFQ0hDICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19DQyAgICAgICAgICAgIlpvcnRlY2ggQyIKKyMgIGlmIChfX1pUQ19fID09IDB4MzEwKQorIyAgICBkZWZpbmUgQUNDX0lORk9fQ0NWRVIgICAgICAiMHgzMTAiCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfSU5GT19DQ1ZFUiAgICAgIEFDQ19QUF9NQUNST19FWFBBTkQoX19aVENfXykKKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIEFDQ19DQ19VTktOT1dOICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQ0MgICAgICAgICAgICJ1bmtub3duIgorIyAgZGVmaW5lIEFDQ19JTkZPX0NDVkVSICAgICAgICAidW5rbm93biIKKyNlbmRpZgorI2lmIDAgJiYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKSAmJiAhZGVmaW5lZChfTVNDX0ZVTExfVkVSKQorIyAgZXJyb3IgIkFDQ19DQ19NU0M6IF9NU0NfRlVMTF9WRVIgaXMgbm90IGRlZmluZWQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX0FDQ19BUkNIX09WRVJSSURFKSAmJiAhZGVmaW5lZChBQ0NfQVJDSF9HRU5FUklDKSAmJiBkZWZpbmVkKF9DUkFZKQorIyAgaWYgKFVJTlRfTUFYID4gQUNDXzB4ZmZmZmZmZmZMKSAmJiBkZWZpbmVkKF9DUkFZKQorIyAgICBpZiBkZWZpbmVkKF9DUkFZTVBQKSB8fCBkZWZpbmVkKF9DUkFZVDNEKSB8fCBkZWZpbmVkKF9DUkFZVDNFKQorIyAgICAgIGRlZmluZSBBQ0NfQVJDSF9DUkFZX01QUCAgICAgMQorIyAgICBlbGlmIGRlZmluZWQoX0NSQVkxKQorIyAgICAgIGRlZmluZSBBQ0NfQVJDSF9DUkFZX1BWUCAgICAgMQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fQUNDX0FSQ0hfT1ZFUlJJREUpCisjaWYgZGVmaW5lZChBQ0NfQVJDSF9HRU5FUklDKQorIyAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICAgImdlbmVyaWMiCisjZWxpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19PUzIxNiB8fCBBQ0NfT1NfV0lOMTYpCisjICBkZWZpbmUgQUNDX0FSQ0hfSTA4NiAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0FSQ0hfSUExNiAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAiaTA4NiIKKyNlbGlmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fYWxwaGEpIHx8IGRlZmluZWQoX01fQUxQSEEpCisjICBkZWZpbmUgQUNDX0FSQ0hfQUxQSEEgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAiYWxwaGEiCisjZWxpZiAoQUNDX0FSQ0hfQ1JBWV9NUFApICYmIChkZWZpbmVkKF9DUkFZVDNEKSB8fCBkZWZpbmVkKF9DUkFZVDNFKSkKKyMgIGRlZmluZSBBQ0NfQVJDSF9BTFBIQSAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAgICJhbHBoYSIKKyNlbGlmIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fQU1ENjQpCisjICBkZWZpbmUgQUNDX0FSQ0hfQU1ENjQgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAiYW1kNjQiCisjZWxpZiBkZWZpbmVkKF9fdGh1bWJfXykgfHwgKGRlZmluZWQoX01fQVJNKSAmJiBkZWZpbmVkKF9NX1RIVU1CKSkKKyMgIGRlZmluZSBBQ0NfQVJDSF9BUk0gICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfQVJDSF9BUk1fVEhVTUIgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAgICJhcm1fdGh1bWIiCisjZWxpZiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pICYmIGRlZmluZWQoX19JQ0NBUk1fXykKKyMgIGRlZmluZSBBQ0NfQVJDSF9BUk0gICAgICAgICAgICAgIDEKKyMgIGlmIGRlZmluZWQoX19DUFVfTU9ERV9fKSAmJiAoKF9fQ1BVX01PREVfXykrMCA9PSAxKQorIyAgICBkZWZpbmUgQUNDX0FSQ0hfQVJNX1RIVU1CICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgImFybV90aHVtYiIKKyMgIGVsaWYgZGVmaW5lZChfX0NQVV9NT0RFX18pICYmICgoX19DUFVfTU9ERV9fKSswID09IDIpCisjICAgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAiYXJtIgorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgImFybSIKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKQorIyAgZGVmaW5lIEFDQ19BUkNIX0FSTSAgICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICAgImFybSIKKyNlbGlmIChVSU5UX01BWCA8PSBBQ0NfMHhmZmZmTCkgJiYgZGVmaW5lZChfX0FWUl9fKQorIyAgZGVmaW5lIEFDQ19BUkNIX0FWUiAgICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICAgImF2ciIKKyNlbGlmIGRlZmluZWQoX19iZmluX18pCisjICBkZWZpbmUgQUNDX0FSQ0hfQkxBQ0tGSU4gICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAiYmxhY2tmaW4iCisjZWxpZiAoVUlOVF9NQVggPT0gQUNDXzB4ZmZmZkwpICYmIGRlZmluZWQoX19DMTY2X18pCisjICBkZWZpbmUgQUNDX0FSQ0hfQzE2NiAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAiYzE2NiIKKyNlbGlmIGRlZmluZWQoX19jcmlzX18pCisjICBkZWZpbmUgQUNDX0FSQ0hfQ1JJUyAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAiY3JpcyIKKyNlbGlmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykgJiYgZGVmaW5lZChfX0lDQ0VaODBfXykKKyMgIGRlZmluZSBBQ0NfQVJDSF9FWjgwICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAgICJlejgwIgorI2VsaWYgZGVmaW5lZChfX0g4MzAwX18pIHx8IGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKSB8fCBkZWZpbmVkKF9fSDgzMDBTWF9fKQorIyAgZGVmaW5lIEFDQ19BUkNIX0g4MzAwICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICAgImg4MzAwIgorI2VsaWYgZGVmaW5lZChfX2hwcGFfXykgfHwgZGVmaW5lZChfX2hwcGEpCisjICBkZWZpbmUgQUNDX0FSQ0hfSFBQQSAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAiaHBwYSIKKyNlbGlmIGRlZmluZWQoX18zODZfXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfTV9JMzg2KQorIyAgZGVmaW5lIEFDQ19BUkNIX0kzODYgICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19BUkNIX0lBMzIgICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICAgImkzODYiCisjZWxpZiAoQUNDX0NDX1pPUlRFQ0hDICYmIGRlZmluZWQoX19JODZfXykpCisjICBkZWZpbmUgQUNDX0FSQ0hfSTM4NiAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0FSQ0hfSUEzMiAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAiaTM4NiIKKyNlbGlmIChBQ0NfT1NfRE9TMzIgJiYgQUNDX0NDX0hJR0hDKSAmJiBkZWZpbmVkKF9JMzg2KQorIyAgZGVmaW5lIEFDQ19BUkNIX0kzODYgICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19BUkNIX0lBMzIgICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICAgImkzODYiCisjZWxpZiBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9faWE2NCkgfHwgZGVmaW5lZChfTV9JQTY0KQorIyAgZGVmaW5lIEFDQ19BUkNIX0lBNjQgICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICAgImlhNjQiCisjZWxpZiAoVUlOVF9NQVggPT0gQUNDXzB4ZmZmZkwpICYmIGRlZmluZWQoX19tMzJjX18pCisjICBkZWZpbmUgQUNDX0FSQ0hfTTE2QyAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAibTE2YyIKKyNlbGlmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykgJiYgZGVmaW5lZChfX0lDQ00xNkNfXykKKyMgIGRlZmluZSBBQ0NfQVJDSF9NMTZDICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAgICJtMTZjIgorI2VsaWYgZGVmaW5lZChfX20zMnJfXykKKyMgIGRlZmluZSBBQ0NfQVJDSF9NMzJSICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAgICJtMzJyIgorI2VsaWYgKEFDQ19PU19UT1MpIHx8IGRlZmluZWQoX19tNjhrX18pIHx8IGRlZmluZWQoX19tNjgwMDBfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgfHwgZGVmaW5lZChfX21jNjgwMjBfXykgfHwgZGVmaW5lZChfTV9NNjhLKQorIyAgZGVmaW5lIEFDQ19BUkNIX002OEsgICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICAgIm02OGsiCisjZWxpZiAoVUlOVF9NQVggPT0gQUNDXzB4ZmZmZkwpICYmIGRlZmluZWQoX19DMjUxX18pCisjICBkZWZpbmUgQUNDX0FSQ0hfTUNTMjUxICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAibWNzMjUxIgorI2VsaWYgKFVJTlRfTUFYID09IEFDQ18weGZmZmZMKSAmJiBkZWZpbmVkKF9fQzUxX18pCisjICBkZWZpbmUgQUNDX0FSQ0hfTUNTNTEgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAibWNzNTEiCisjZWxpZiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pICYmIGRlZmluZWQoX19JQ0M4MDUxX18pCisjICBkZWZpbmUgQUNDX0FSQ0hfTUNTNTEgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAibWNzNTEiCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fbWlwcykgfHwgZGVmaW5lZChfTUlQU19BUkNIKSB8fCBkZWZpbmVkKF9NX01SWDAwMCkKKyMgIGRlZmluZSBBQ0NfQVJDSF9NSVBTICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAgICJtaXBzIgorI2VsaWYgKFVJTlRfTUFYID09IEFDQ18weGZmZmZMKSAmJiBkZWZpbmVkKF9fTVNQNDMwX18pCisjICBkZWZpbmUgQUNDX0FSQ0hfTVNQNDMwICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAibXNwNDMwIgorI2VsaWYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKSAmJiBkZWZpbmVkKF9fSUNDNDMwX18pCisjICBkZWZpbmUgQUNDX0FSQ0hfTVNQNDMwICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAibXNwNDMwIgorI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3Bvd2VycGMpIHx8IGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChfX1BQQ19fKSB8fCBkZWZpbmVkKF9NX1BQQykgfHwgZGVmaW5lZChfQVJDSF9QUEMpIHx8IGRlZmluZWQoX0FSQ0hfUFdSKQorIyAgZGVmaW5lIEFDQ19BUkNIX1BPV0VSUEMgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICAgInBvd2VycGMiCisjZWxpZiBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9fczM5MCkgfHwgZGVmaW5lZChfX3MzOTB4X18pIHx8IGRlZmluZWQoX19zMzkweCkKKyMgIGRlZmluZSBBQ0NfQVJDSF9TMzkwICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAgICJzMzkwIgorI2VsaWYgZGVmaW5lZChfX3NoX18pIHx8IGRlZmluZWQoX01fU0gpCisjICBkZWZpbmUgQUNDX0FSQ0hfU0ggICAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAic2giCisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX3NwYXJjKSB8fCBkZWZpbmVkKF9fc3BhcmN2OCkKKyMgIGRlZmluZSBBQ0NfQVJDSF9TUEFSQyAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAgICJzcGFyYyIKKyNlbGlmIGRlZmluZWQoX19TUFVfXykKKyMgIGRlZmluZSBBQ0NfQVJDSF9TUFUgICAgICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAgICJzcHUiCisjZWxpZiAoVUlOVF9NQVggPT0gQUNDXzB4ZmZmZkwpICYmIGRlZmluZWQoX196ODApCisjICBkZWZpbmUgQUNDX0FSQ0hfWjgwICAgICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAiejgwIgorI2VsaWYgKEFDQ19BUkNIX0NSQVlfUFZQKQorIyAgaWYgZGVmaW5lZChfQ1JBWVNWMSkKKyMgICAgZGVmaW5lIEFDQ19BUkNIX0NSQVlfU1YxICAgICAgIDEKKyMgICAgZGVmaW5lIEFDQ19JTkZPX0FSQ0ggICAgICAgICAgICJjcmF5X3N2MSIKKyMgIGVsaWYgKF9BRERSNjQpCisjICAgIGRlZmluZSBBQ0NfQVJDSF9DUkFZX1Q5MCAgICAgICAxCisjICAgIGRlZmluZSBBQ0NfSU5GT19BUkNIICAgICAgICAgICAiY3JheV90OTAiCisjICBlbGlmIChfQUREUjMyKQorIyAgICBkZWZpbmUgQUNDX0FSQ0hfQ1JBWV9ZTVAgICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgImNyYXlfeW1wIgorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX0FSQ0hfQ1JBWV9YTVAgICAgICAgMQorIyAgICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgImNyYXlfeG1wIgorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgQUNDX0FSQ0hfVU5LTk9XTiAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQVJDSCAgICAgICAgICAgICAidW5rbm93biIKKyNlbmRpZgorI2VuZGlmCisjaWYgMSAmJiAoQUNDX0FSQ0hfVU5LTk9XTikgJiYgKEFDQ19PU19ET1MzMiB8fCBBQ0NfT1NfT1MyKQorIyAgZXJyb3IgIkZJWE1FIC0gbWlzc2luZyBkZWZpbmUgZm9yIENQVSBhcmNoaXRlY3R1cmUiCisjZW5kaWYKKyNpZiAxICYmIChBQ0NfQVJDSF9VTktOT1dOKSAmJiAoQUNDX09TX1dJTjMyKQorIyAgZXJyb3IgIkZJWE1FIC0gbWlzc2luZyBXSU4zMiBkZWZpbmUgZm9yIENQVSBhcmNoaXRlY3R1cmUiCisjZW5kaWYKKyNpZiAxICYmIChBQ0NfQVJDSF9VTktOT1dOKSAmJiAoQUNDX09TX1dJTjY0KQorIyAgZXJyb3IgIkZJWE1FIC0gbWlzc2luZyBXSU42NCBkZWZpbmUgZm9yIENQVSBhcmNoaXRlY3R1cmUiCisjZW5kaWYKKyNpZiAoQUNDX09TX09TMjE2IHx8IEFDQ19PU19XSU4xNikKKyMgIGRlZmluZSBBQ0NfQVJDSF9JMDg2UE0gICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfQVJDSF9JQTE2UE0gICAgICAgICAgIDEKKyNlbGlmIDEgJiYgKEFDQ19PU19ET1MxNiAmJiBkZWZpbmVkKEJMWDI4NikpCisjICBkZWZpbmUgQUNDX0FSQ0hfSTA4NlBNICAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0FSQ0hfSUExNlBNICAgICAgICAgICAxCisjZWxpZiAxICYmIChBQ0NfT1NfRE9TMTYgJiYgZGVmaW5lZChET1NYMjg2KSkKKyMgIGRlZmluZSBBQ0NfQVJDSF9JMDg2UE0gICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfQVJDSF9JQTE2UE0gICAgICAgICAgIDEKKyNlbGlmIDEgJiYgKEFDQ19PU19ET1MxNiAmJiBBQ0NfQ0NfQk9STEFOREMgJiYgZGVmaW5lZChfX0RQTUkxNl9fKSkKKyMgIGRlZmluZSBBQ0NfQVJDSF9JMDg2UE0gICAgICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfQVJDSF9JQTE2UE0gICAgICAgICAgIDEKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX0FSQ0hfQVJNX1RIVU1CKSAmJiAhZGVmaW5lZChBQ0NfQVJDSF9BUk0pCisjICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX0FSQ0hfSTA4NlBNKSAmJiAhZGVmaW5lZChBQ0NfQVJDSF9JMDg2KQorIyAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjZW5kaWYKKyNpZiAoQUNDX0FSQ0hfSTA4NikKKyMgIGlmIChVSU5UX01BWCAhPSBBQ0NfMHhmZmZmTCkKKyMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICBlbmRpZgorIyAgaWYgKFVMT05HX01BWCAhPSBBQ0NfMHhmZmZmZmZmZkwpCisjICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfQVJDSF9JMzg2KQorIyAgaWYgKFVJTlRfTUFYICE9IEFDQ18weGZmZmZMKSAmJiBkZWZpbmVkKF9faTM4Nl9pbnQxNl9fKQorIyAgICBlcnJvciAidGhpcyBzaG91bGQgbm90IGhhcHBlbiIKKyMgIGVuZGlmCisjICBpZiAoVUlOVF9NQVggIT0gQUNDXzB4ZmZmZmZmZmZMKSAmJiAhZGVmaW5lZChfX2kzODZfaW50MTZfXykKKyMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICBlbmRpZgorIyAgaWYgKFVMT05HX01BWCAhPSBBQ0NfMHhmZmZmZmZmZkwpCisjICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fQUNDX01NX09WRVJSSURFKQorI2lmIChBQ0NfQVJDSF9JMDg2KQorI2lmIChVSU5UX01BWCAhPSBBQ0NfMHhmZmZmTCkKKyMgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorI2VuZGlmCisjaWYgZGVmaW5lZChfX1RJTllfXykgfHwgZGVmaW5lZChNX0k4NlRNKSB8fCBkZWZpbmVkKF9NX0k4NlRNKQorIyAgZGVmaW5lIEFDQ19NTV9USU5ZICAgICAgICAgICAxCisjZWxpZiBkZWZpbmVkKF9fSFVHRV9fKSB8fCBkZWZpbmVkKF9IVUdFXykgfHwgZGVmaW5lZChNX0k4NkhNKSB8fCBkZWZpbmVkKF9NX0k4NkhNKQorIyAgZGVmaW5lIEFDQ19NTV9IVUdFICAgICAgICAgICAxCisjZWxpZiBkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKF9NX0k4NlNNKSB8fCBkZWZpbmVkKFNNQUxMX01PREVMKQorIyAgZGVmaW5lIEFDQ19NTV9TTUFMTCAgICAgICAgICAxCisjZWxpZiBkZWZpbmVkKF9fTUVESVVNX18pIHx8IGRlZmluZWQoTV9JODZNTSkgfHwgZGVmaW5lZChfTV9JODZNTSkKKyMgIGRlZmluZSBBQ0NfTU1fTUVESVVNICAgICAgICAgMQorI2VsaWYgZGVmaW5lZChfX0NPTVBBQ1RfXykgfHwgZGVmaW5lZChNX0k4NkNNKSB8fCBkZWZpbmVkKF9NX0k4NkNNKQorIyAgZGVmaW5lIEFDQ19NTV9DT01QQUNUICAgICAgICAxCisjZWxpZiBkZWZpbmVkKF9fTEFSR0VfXykgfHwgZGVmaW5lZChNX0k4NkxNKSB8fCBkZWZpbmVkKF9NX0k4NkxNKSB8fCBkZWZpbmVkKExBUkdFX01PREVMKQorIyAgZGVmaW5lIEFDQ19NTV9MQVJHRSAgICAgICAgICAxCisjZWxpZiAoQUNDX0NDX0FaVEVDQykKKyMgIGlmIGRlZmluZWQoX0xBUkdFX0NPREUpICYmIGRlZmluZWQoX0xBUkdFX0RBVEEpCisjICAgIGRlZmluZSBBQ0NfTU1fTEFSR0UgICAgICAgIDEKKyMgIGVsaWYgZGVmaW5lZChfTEFSR0VfQ09ERSkKKyMgICAgZGVmaW5lIEFDQ19NTV9NRURJVU0gICAgICAgMQorIyAgZWxpZiBkZWZpbmVkKF9MQVJHRV9EQVRBKQorIyAgICBkZWZpbmUgQUNDX01NX0NPTVBBQ1QgICAgICAxCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfTU1fU01BTEwgICAgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAoQUNDX0NDX1pPUlRFQ0hDICYmIGRlZmluZWQoX19WQ01fXykpCisjICBkZWZpbmUgQUNDX01NX0xBUkdFICAgICAgICAgIDEKKyNlbHNlCisjICBlcnJvciAidW5rbm93biBtZW1vcnkgbW9kZWwiCisjZW5kaWYKKyNpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19PUzIxNiB8fCBBQ0NfT1NfV0lOMTYpCisjZGVmaW5lIEFDQ19IQVZFX01NX0hVR0VfUFRSICAgICAgICAxCisjZGVmaW5lIEFDQ19IQVZFX01NX0hVR0VfQVJSQVkgICAgICAxCisjaWYgKEFDQ19NTV9USU5ZKQorIyAgdW5kZWYgQUNDX0hBVkVfTU1fSFVHRV9BUlJBWQorI2VuZGlmCisjaWYgKEFDQ19DQ19BWlRFQ0MgfHwgQUNDX0NDX1BBQ0lGSUNDIHx8IEFDQ19DQ19aT1JURUNIQykKKyMgIHVuZGVmIEFDQ19IQVZFX01NX0hVR0VfUFRSCisjICB1bmRlZiBBQ0NfSEFWRV9NTV9IVUdFX0FSUkFZCisjZWxpZiAoQUNDX0NDX0RNQyB8fCBBQ0NfQ0NfU1lNQU5URUNDKQorIyAgdW5kZWYgQUNDX0hBVkVfTU1fSFVHRV9BUlJBWQorI2VsaWYgKEFDQ19DQ19NU0MgJiYgZGVmaW5lZChfUUMpKQorIyAgdW5kZWYgQUNDX0hBVkVfTU1fSFVHRV9BUlJBWQorIyAgaWYgKF9NU0NfVkVSIDwgNjAwKQorIyAgICB1bmRlZiBBQ0NfSEFWRV9NTV9IVUdFX1BUUgorIyAgZW5kaWYKKyNlbGlmIChBQ0NfQ0NfVFVSQk9DICYmIChfX1RVUkJPQ19fIDwgMHgwMjk1KSkKKyMgIHVuZGVmIEFDQ19IQVZFX01NX0hVR0VfQVJSQVkKKyNlbmRpZgorI2lmIChBQ0NfQVJDSF9JMDg2UE0pICYmICFkZWZpbmVkKEFDQ19IQVZFX01NX0hVR0VfUFRSKQorIyAgaWYgKEFDQ19PU19ET1MxNikKKyMgICAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjICBlbGlmIChBQ0NfQ0NfWk9SVEVDSEMpCisjICBlbHNlCisjICAgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorIyAgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorI2lmIChBQ0NfQ0NfQk9STEFOREMgJiYgKF9fQk9STEFORENfXyA+PSAweDAyMDApKQorICAgZXh0ZXJuIHZvaWQgX19uZWFyIF9fY2RlY2wgX0FIU0hJRlQodm9pZCk7CisjICBkZWZpbmUgQUNDX01NX0FIU0hJRlQgICAgICAoKHVuc2lnbmVkKSBfQUhTSElGVCkKKyNlbGlmIChBQ0NfQ0NfRE1DIHx8IEFDQ19DQ19TWU1BTlRFQ0MgfHwgQUNDX0NDX1pPUlRFQ0hDKQorICAgZXh0ZXJuIHZvaWQgX19uZWFyIF9fY2RlY2wgX0FIU0hJRlQodm9pZCk7CisjICBkZWZpbmUgQUNDX01NX0FIU0hJRlQgICAgICAoKHVuc2lnbmVkKSBfQUhTSElGVCkKKyNlbGlmIChBQ0NfQ0NfTVNDIHx8IEFDQ19DQ19UT1BTUEVFREMpCisgICBleHRlcm4gdm9pZCBfX25lYXIgX19jZGVjbCBfQUhTSElGVCh2b2lkKTsKKyMgIGRlZmluZSBBQ0NfTU1fQUhTSElGVCAgICAgICgodW5zaWduZWQpIF9BSFNISUZUKQorI2VsaWYgKEFDQ19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPj0gMHgwMjk1KSkKKyAgIGV4dGVybiB2b2lkIF9fbmVhciBfX2NkZWNsIF9BSFNISUZUKHZvaWQpOworIyAgZGVmaW5lIEFDQ19NTV9BSFNISUZUICAgICAgKCh1bnNpZ25lZCkgX0FIU0hJRlQpCisjZWxpZiAoKEFDQ19DQ19BWlRFQ0MgfHwgQUNDX0NDX1BBQ0lGSUNDIHx8IEFDQ19DQ19UVVJCT0MpICYmIEFDQ19PU19ET1MxNikKKyMgIGRlZmluZSBBQ0NfTU1fQUhTSElGVCAgICAgIDEyCisjZWxpZiAoQUNDX0NDX1dBVENPTUMpCisgICBleHRlcm4gdW5zaWduZWQgY2hhciBfSFNoaWZ0OworIyAgZGVmaW5lIEFDQ19NTV9BSFNISUZUICAgICAgKCh1bnNpZ25lZCkgX0hTaGlmdCkKKyNlbHNlCisjICBlcnJvciAiRklYTUUgLSBpbXBsZW1lbnQgQUNDX01NX0FIU0hJRlQiCisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKKyNlbGlmIChBQ0NfQVJDSF9DMTY2KQorI2lmICFkZWZpbmVkKF9fTU9ERUxfXykKKyMgIGVycm9yICJGSVhNRSAtIEMxNjYgX19NT0RFTF9fIgorI2VsaWYgKChfX01PREVMX18pID09IDApCisjICBkZWZpbmUgQUNDX01NX1NNQUxMICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSAxKQorIyAgZGVmaW5lIEFDQ19NTV9TTUFMTCAgICAgICAgICAxCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gMikKKyMgIGRlZmluZSBBQ0NfTU1fTEFSR0UgICAgICAgICAgMQorI2VsaWYgKChfX01PREVMX18pID09IDMpCisjICBkZWZpbmUgQUNDX01NX1RJTlkgICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSA0KQorIyAgZGVmaW5lIEFDQ19NTV9YVElOWSAgICAgICAgICAxCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gNSkKKyMgIGRlZmluZSBBQ0NfTU1fWFNNQUxMICAgICAgICAgMQorI2Vsc2UKKyMgIGVycm9yICJGSVhNRSAtIEMxNjYgX19NT0RFTF9fIgorI2VuZGlmCisjZWxpZiAoQUNDX0FSQ0hfTUNTMjUxKQorI2lmICFkZWZpbmVkKF9fTU9ERUxfXykKKyMgIGVycm9yICJGSVhNRSAtIE1DUzI1MSBfX01PREVMX18iCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gMCkKKyMgIGRlZmluZSBBQ0NfTU1fU01BTEwgICAgICAgICAgMQorI2VsaWYgKChfX01PREVMX18pID09IDIpCisjICBkZWZpbmUgQUNDX01NX0xBUkdFICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSAzKQorIyAgZGVmaW5lIEFDQ19NTV9USU5ZICAgICAgICAgICAxCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gNCkKKyMgIGRlZmluZSBBQ0NfTU1fWFRJTlkgICAgICAgICAgMQorI2VsaWYgKChfX01PREVMX18pID09IDUpCisjICBkZWZpbmUgQUNDX01NX1hTTUFMTCAgICAgICAgIDEKKyNlbHNlCisjICBlcnJvciAiRklYTUUgLSBNQ1MyNTEgX19NT0RFTF9fIgorI2VuZGlmCisjZWxpZiAoQUNDX0FSQ0hfTUNTNTEpCisjaWYgIWRlZmluZWQoX19NT0RFTF9fKQorIyAgZXJyb3IgIkZJWE1FIC0gTUNTNTEgX19NT0RFTF9fIgorI2VsaWYgKChfX01PREVMX18pID09IDEpCisjICBkZWZpbmUgQUNDX01NX1NNQUxMICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSAyKQorIyAgZGVmaW5lIEFDQ19NTV9MQVJHRSAgICAgICAgICAxCisjZWxpZiAoKF9fTU9ERUxfXykgPT0gMykKKyMgIGRlZmluZSBBQ0NfTU1fVElOWSAgICAgICAgICAgMQorI2VsaWYgKChfX01PREVMX18pID09IDQpCisjICBkZWZpbmUgQUNDX01NX1hUSU5ZICAgICAgICAgIDEKKyNlbGlmICgoX19NT0RFTF9fKSA9PSA1KQorIyAgZGVmaW5lIEFDQ19NTV9YU01BTEwgICAgICAgICAxCisjZWxzZQorIyAgZXJyb3IgIkZJWE1FIC0gTUNTNTEgX19NT0RFTF9fIgorI2VuZGlmCisjZWxpZiAoQUNDX0FSQ0hfQ1JBWV9QVlApCisjICBkZWZpbmUgQUNDX01NX1BWUCAgICAgICAgICAgIDEKKyNlbHNlCisjICBkZWZpbmUgQUNDX01NX0ZMQVQgICAgICAgICAgIDEKKyNlbmRpZgorI2lmIChBQ0NfTU1fQ09NUEFDVCkKKyMgIGRlZmluZSBBQ0NfSU5GT19NTSAgICAgICAgICAgImNvbXBhY3QiCisjZWxpZiAoQUNDX01NX0ZMQVQpCisjICBkZWZpbmUgQUNDX0lORk9fTU0gICAgICAgICAgICJmbGF0IgorI2VsaWYgKEFDQ19NTV9IVUdFKQorIyAgZGVmaW5lIEFDQ19JTkZPX01NICAgICAgICAgICAiaHVnZSIKKyNlbGlmIChBQ0NfTU1fTEFSR0UpCisjICBkZWZpbmUgQUNDX0lORk9fTU0gICAgICAgICAgICJsYXJnZSIKKyNlbGlmIChBQ0NfTU1fTUVESVVNKQorIyAgZGVmaW5lIEFDQ19JTkZPX01NICAgICAgICAgICAibWVkaXVtIgorI2VsaWYgKEFDQ19NTV9QVlApCisjICBkZWZpbmUgQUNDX0lORk9fTU0gICAgICAgICAgICJwdnAiCisjZWxpZiAoQUNDX01NX1NNQUxMKQorIyAgZGVmaW5lIEFDQ19JTkZPX01NICAgICAgICAgICAic21hbGwiCisjZWxpZiAoQUNDX01NX1RJTlkpCisjICBkZWZpbmUgQUNDX0lORk9fTU0gICAgICAgICAgICJ0aW55IgorI2Vsc2UKKyMgIGVycm9yICJ1bmtub3duIG1lbW9yeSBtb2RlbCIKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChTSVpFT0ZfU0hPUlQpCisjICBkZWZpbmUgQUNDX1NJWkVPRl9TSE9SVCAgICAgICAgICAoU0laRU9GX1NIT1JUKQorI2VuZGlmCisjaWYgZGVmaW5lZChTSVpFT0ZfSU5UKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfSU5UICAgICAgICAgICAgKFNJWkVPRl9JTlQpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJWkVPRl9MT05HKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfTE9ORyAgICAgICAgICAgKFNJWkVPRl9MT05HKQorI2VuZGlmCisjaWYgZGVmaW5lZChTSVpFT0ZfTE9OR19MT05HKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfTE9OR19MT05HICAgICAgKFNJWkVPRl9MT05HX0xPTkcpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJWkVPRl9fX0lOVDE2KQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfX19JTlQxNiAgICAgICAgKFNJWkVPRl9fX0lOVDE2KQorI2VuZGlmCisjaWYgZGVmaW5lZChTSVpFT0ZfX19JTlQzMikKKyMgIGRlZmluZSBBQ0NfU0laRU9GX19fSU5UMzIgICAgICAgIChTSVpFT0ZfX19JTlQzMikKKyNlbmRpZgorI2lmIGRlZmluZWQoU0laRU9GX19fSU5UNjQpCisjICBkZWZpbmUgQUNDX1NJWkVPRl9fX0lOVDY0ICAgICAgICAoU0laRU9GX19fSU5UNjQpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJWkVPRl9WT0lEX1ApCisjICBkZWZpbmUgQUNDX1NJWkVPRl9WT0lEX1AgICAgICAgICAoU0laRU9GX1ZPSURfUCkKKyNlbmRpZgorI2lmIGRlZmluZWQoU0laRU9GX1NJWkVfVCkKKyMgIGRlZmluZSBBQ0NfU0laRU9GX1NJWkVfVCAgICAgICAgIChTSVpFT0ZfU0laRV9UKQorI2VuZGlmCisjaWYgZGVmaW5lZChTSVpFT0ZfUFRSRElGRl9UKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfUFRSRElGRl9UICAgICAgKFNJWkVPRl9QVFJESUZGX1QpCisjZW5kaWYKKyNkZWZpbmUgX19BQ0NfTFNSKHgsYikgICAgKCgoeCkrMHVsKSA+PiAoYikpCisjaWYgIWRlZmluZWQoQUNDX1NJWkVPRl9TSE9SVCkKKyMgIGlmIChBQ0NfQVJDSF9DUkFZX1BWUCkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfU0hPUlQgICAgICAgIDgKKyMgIGVsaWYgKFVTSFJUX01BWCA9PSBBQ0NfMHhmZmZmTCkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfU0hPUlQgICAgICAgIDIKKyMgIGVsaWYgKF9fQUNDX0xTUihVU0hSVF9NQVgsNykgPT0gMSkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfU0hPUlQgICAgICAgIDEKKyMgIGVsaWYgKF9fQUNDX0xTUihVU0hSVF9NQVgsMTUpID09IDEpCisjICAgIGRlZmluZSBBQ0NfU0laRU9GX1NIT1JUICAgICAgICAyCisjICBlbGlmIChfX0FDQ19MU1IoVVNIUlRfTUFYLDMxKSA9PSAxKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9TSE9SVCAgICAgICAgNAorIyAgZWxpZiAoX19BQ0NfTFNSKFVTSFJUX01BWCw2MykgPT0gMSkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfU0hPUlQgICAgICAgIDgKKyMgIGVsaWYgKF9fQUNDX0xTUihVU0hSVF9NQVgsMTI3KSA9PSAxKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9TSE9SVCAgICAgICAgMTYKKyMgIGVsc2UKKyMgICAgZXJyb3IgIkFDQ19TSVpFT0ZfU0hPUlQiCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX1NJWkVPRl9JTlQpCisjICBpZiAoQUNDX0FSQ0hfQ1JBWV9QVlApCisjICAgIGRlZmluZSBBQ0NfU0laRU9GX0lOVCAgICAgICAgICA4CisjICBlbGlmIChVSU5UX01BWCA9PSBBQ0NfMHhmZmZmTCkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfSU5UICAgICAgICAgIDIKKyMgIGVsaWYgKFVJTlRfTUFYID09IEFDQ18weGZmZmZmZmZmTCkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfSU5UICAgICAgICAgIDQKKyMgIGVsaWYgKF9fQUNDX0xTUihVSU5UX01BWCw3KSA9PSAxKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9JTlQgICAgICAgICAgMQorIyAgZWxpZiAoX19BQ0NfTFNSKFVJTlRfTUFYLDE1KSA9PSAxKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9JTlQgICAgICAgICAgMgorIyAgZWxpZiAoX19BQ0NfTFNSKFVJTlRfTUFYLDMxKSA9PSAxKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9JTlQgICAgICAgICAgNAorIyAgZWxpZiAoX19BQ0NfTFNSKFVJTlRfTUFYLDYzKSA9PSAxKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9JTlQgICAgICAgICAgOAorIyAgZWxpZiAoX19BQ0NfTFNSKFVJTlRfTUFYLDEyNykgPT0gMSkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfSU5UICAgICAgICAgIDE2CisjICBlbHNlCisjICAgIGVycm9yICJBQ0NfU0laRU9GX0lOVCIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfU0laRU9GX0xPTkcpCisjICBpZiAoVUxPTkdfTUFYID09IEFDQ18weGZmZmZmZmZmTCkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfTE9ORyAgICAgICAgIDQKKyMgIGVsaWYgKF9fQUNDX0xTUihVTE9OR19NQVgsNykgPT0gMSkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfTE9ORyAgICAgICAgIDEKKyMgIGVsaWYgKF9fQUNDX0xTUihVTE9OR19NQVgsMTUpID09IDEpCisjICAgIGRlZmluZSBBQ0NfU0laRU9GX0xPTkcgICAgICAgICAyCisjICBlbGlmIChfX0FDQ19MU1IoVUxPTkdfTUFYLDMxKSA9PSAxKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9MT05HICAgICAgICAgNAorIyAgZWxpZiAoX19BQ0NfTFNSKFVMT05HX01BWCw2MykgPT0gMSkKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfTE9ORyAgICAgICAgIDgKKyMgIGVsaWYgKF9fQUNDX0xTUihVTE9OR19NQVgsMTI3KSA9PSAxKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9MT05HICAgICAgICAgMTYKKyMgIGVsc2UKKyMgICAgZXJyb3IgIkFDQ19TSVpFT0ZfTE9ORyIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfU0laRU9GX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQUNDX1NJWkVPRl9fX0lOVDY0KQorI2lmIChBQ0NfU0laRU9GX0xPTkcgPiAwICYmIEFDQ19TSVpFT0ZfTE9ORyA8IDgpCisjICBpZiBkZWZpbmVkKF9fTE9OR19NQVhfXykgJiYgZGVmaW5lZChfX0xPTkdfTE9OR19NQVhfXykKKyMgICAgaWYgKEFDQ19DQ19HTlVDID49IDB4MDMwMzAwdWwpCisjICAgICAgaWYgKChfX0xPTkdfTUFYX18pKzAgPT0gKF9fTE9OR19MT05HX01BWF9fKSswKQorIyAgICAgICAgZGVmaW5lIEFDQ19TSVpFT0ZfTE9OR19MT05HICAgICAgQUNDX1NJWkVPRl9MT05HCisjICAgICAgZWxpZiAoX19BQ0NfTFNSKF9fTE9OR19MT05HX01BWF9fLDMwKSA9PSAxKQorIyAgICAgICAgZGVmaW5lIEFDQ19TSVpFT0ZfTE9OR19MT05HICAgICAgNAorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfU0laRU9GX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQUNDX1NJWkVPRl9fX0lOVDY0KQorI2lmIChBQ0NfU0laRU9GX0xPTkcgPiAwICYmIEFDQ19TSVpFT0ZfTE9ORyA8IDgpCisjaWYgKEFDQ19BUkNIX0kwODYgJiYgQUNDX0NDX0RNQykKKyNlbGlmIChBQ0NfQ0NfQ0lMTFkpICYmIGRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgQUNDX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoQUNDX0NDX0dOVUMgfHwgQUNDX0NDX0xMVk0gfHwgQUNDX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmICgoQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCB8fCBkZWZpbmVkKF9XSU4zMikpICYmIEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDE0MDApKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKEFDQ19PU19XSU42NCB8fCBkZWZpbmVkKF9XSU42NCkpCisjICBkZWZpbmUgQUNDX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoQUNDX0FSQ0hfSTM4NiAmJiAoQUNDX0NDX0RNQykpCisjICBkZWZpbmUgQUNDX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoQUNDX0FSQ0hfSTM4NiAmJiAoQUNDX0NDX1NZTUFOVEVDQyAmJiAoX19TQ19fID49IDB4NzAwKSkpCisjICBkZWZpbmUgQUNDX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoQUNDX0FSQ0hfSTM4NiAmJiAoQUNDX0NDX0lOVEVMQyAmJiBkZWZpbmVkKF9fbGludXhfXykpKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfTE9OR19MT05HICAgICAgOAorI2VsaWYgKEFDQ19BUkNIX0kzODYgJiYgKEFDQ19DQ19NV0VSS1MgfHwgQUNDX0NDX1BFTExFU0MgfHwgQUNDX0NDX1BHSSB8fCBBQ0NfQ0NfU1VOUFJPQykpCisjICBkZWZpbmUgQUNDX1NJWkVPRl9MT05HX0xPTkcgICAgICA4CisjZWxpZiAoQUNDX0FSQ0hfSTM4NiAmJiAoQUNDX0NDX0lOVEVMQyB8fCBBQ0NfQ0NfTVNDKSkKKyMgIGRlZmluZSBBQ0NfU0laRU9GX19fSU5UNjQgICAgICAgIDgKKyNlbGlmICgoQUNDX09TX1dJTjMyIHx8IGRlZmluZWQoX1dJTjMyKSkgJiYgKEFDQ19DQ19NU0MpKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfX19JTlQ2NCAgICAgICAgOAorI2VsaWYgKEFDQ19BUkNIX0kzODYgJiYgKEFDQ19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDUyMCkpKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfX19JTlQ2NCAgICAgICAgOAorI2VsaWYgKEFDQ19BUkNIX0kzODYgJiYgKEFDQ19DQ19XQVRDT01DICYmIChfX1dBVENPTUNfXyA+PSAxMTAwKSkpCisjICBkZWZpbmUgQUNDX1NJWkVPRl9fX0lOVDY0ICAgICAgICA4CisjZWxpZiAoQUNDX0NDX1dBVENPTUMgJiYgZGVmaW5lZChfSU5URUdSQUxfTUFYX0JJVFMpICYmIChfSU5URUdSQUxfTUFYX0JJVFMgPT0gNjQpKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfX19JTlQ2NCAgICAgICAgOAorI2VsaWYgKEFDQ19PU19PUzQwMCB8fCBkZWZpbmVkKF9fT1M0MDBfXykpICYmIGRlZmluZWQoX19MTFA2NF9JRkNfXykKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChkZWZpbmVkKF9fdm1zKSB8fCBkZWZpbmVkKF9fVk1TKSkgJiYgKF9fSU5JVElBTF9QT0lOVEVSX1NJWkUrMCA9PSA2NCkKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbGlmIChBQ0NfQ0NfU0RDQykgJiYgKEFDQ19TSVpFT0ZfSU5UID09IDIpCisjZWxpZiAxICYmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0xPTkdfTE9ORyAgICAgIDgKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBkZWZpbmVkKEFDQ19DQ19HTlVDKQorIyAgaWYgKEFDQ19DQ19HTlVDIDwgMHgwMjA4MDB1bCkKKyMgICAgdW5kZWYgQUNDX1NJWkVPRl9MT05HX0xPTkcKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19DRkdfTk9fTE9OR19MT05HKSB8fCBkZWZpbmVkKF9fTk9fTE9OR19MT05HKQorIyAgdW5kZWYgQUNDX1NJWkVPRl9MT05HX0xPTkcKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19TSVpFT0ZfVk9JRF9QKQorI2lmIChBQ0NfQVJDSF9JMDg2KQorIyAgZGVmaW5lIF9fQUNDX1dPUkRTSVpFICAgICAgICAgICAgMgorIyAgaWYgKEFDQ19NTV9USU5ZIHx8IEFDQ19NTV9TTUFMTCB8fCBBQ0NfTU1fTUVESVVNKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9WT0lEX1AgICAgICAgMgorIyAgZWxpZiAoQUNDX01NX0NPTVBBQ1QgfHwgQUNDX01NX0xBUkdFIHx8IEFDQ19NTV9IVUdFKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9WT0lEX1AgICAgICAgNAorIyAgZWxzZQorIyAgICBlcnJvciAiQUNDX01NIgorIyAgZW5kaWYKKyNlbGlmIChBQ0NfQVJDSF9BVlIgfHwgQUNDX0FSQ0hfWjgwKQorIyAgZGVmaW5lIF9fQUNDX1dPUkRTSVpFICAgICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfVk9JRF9QICAgICAgICAgMgorI2VsaWYgKEFDQ19BUkNIX0MxNjYgfHwgQUNDX0FSQ0hfTUNTNTEgfHwgQUNDX0FSQ0hfTUNTMjUxIHx8IEFDQ19BUkNIX01TUDQzMCkKKyMgIGRlZmluZSBBQ0NfU0laRU9GX1ZPSURfUCAgICAgICAgIDIKKyNlbGlmIChBQ0NfQVJDSF9IODMwMCkKKyMgIGlmIGRlZmluZWQoX19OT1JNQUxfTU9ERV9fKQorIyAgICBkZWZpbmUgX19BQ0NfV09SRFNJWkUgICAgICAgICAgNAorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9WT0lEX1AgICAgICAgMgorIyAgZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykgfHwgZGVmaW5lZChfX0g4MzAwU1hfXykKKyMgICAgZGVmaW5lIF9fQUNDX1dPUkRTSVpFICAgICAgICAgIDQKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfVk9JRF9QICAgICAgIDQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9fQUNDX1dPUkRTSVpFICAgICAgICAgIDIKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfVk9JRF9QICAgICAgIDIKKyMgIGVuZGlmCisjICBpZiAoQUNDX0NDX0dOVUMgJiYgKEFDQ19DQ19HTlVDIDwgMHgwNDAwMDB1bCkpICYmIChBQ0NfU0laRU9GX0lOVCA9PSA0KQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9TSVpFX1QgICAgICAgQUNDX1NJWkVPRl9JTlQKKyMgICAgZGVmaW5lIEFDQ19TSVpFT0ZfUFRSRElGRl9UICAgIEFDQ19TSVpFT0ZfSU5UCisjICBlbmRpZgorI2VsaWYgKEFDQ19BUkNIX00xNkMpCisjICBkZWZpbmUgX19BQ0NfV09SRFNJWkUgICAgICAgICAgICAyCisjICBpZiBkZWZpbmVkKF9fbTMyY19jcHVfXykgfHwgZGVmaW5lZChfX20zMmNtX2NwdV9fKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9WT0lEX1AgICAgICAgNAorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9WT0lEX1AgICAgICAgMgorIyAgZW5kaWYKKyNlbGlmIChBQ0NfU0laRU9GX0xPTkcgPT0gOCkgJiYgKChkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fUjU5MDBfXykpIHx8IGRlZmluZWQoX19NSVBTX1BTWDJfXykpCisjICBkZWZpbmUgX19BQ0NfV09SRFNJWkUgICAgICAgICAgICA4CisjICBkZWZpbmUgQUNDX1NJWkVPRl9WT0lEX1AgICAgICAgICA0CisjZWxpZiBkZWZpbmVkKF9fTExQNjRfXykgfHwgZGVmaW5lZChfX0xMUDY0KSB8fCBkZWZpbmVkKF9MTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCisjICBkZWZpbmUgX19BQ0NfV09SRFNJWkUgICAgICAgICAgICA4CisjICBkZWZpbmUgQUNDX1NJWkVPRl9WT0lEX1AgICAgICAgICA4CisjZWxpZiAoQUNDX09TX09TNDAwIHx8IGRlZmluZWQoX19PUzQwMF9fKSkgJiYgZGVmaW5lZChfX0xMUDY0X0lGQ19fKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfVk9JRF9QICAgICAgICAgQUNDX1NJWkVPRl9MT05HCisjICBkZWZpbmUgQUNDX1NJWkVPRl9TSVpFX1QgICAgICAgICBBQ0NfU0laRU9GX0xPTkcKKyMgIGRlZmluZSBBQ0NfU0laRU9GX1BUUkRJRkZfVCAgICAgIEFDQ19TSVpFT0ZfTE9ORworI2VsaWYgKEFDQ19PU19PUzQwMCB8fCBkZWZpbmVkKF9fT1M0MDBfXykpCisjICBkZWZpbmUgX19BQ0NfV09SRFNJWkUgICAgICAgICAgICBBQ0NfU0laRU9GX0xPTkcKKyMgIGRlZmluZSBBQ0NfU0laRU9GX1ZPSURfUCAgICAgICAgIDE2CisjICBkZWZpbmUgQUNDX1NJWkVPRl9TSVpFX1QgICAgICAgICBBQ0NfU0laRU9GX0xPTkcKKyMgIGRlZmluZSBBQ0NfU0laRU9GX1BUUkRJRkZfVCAgICAgIEFDQ19TSVpFT0ZfTE9ORworI2VsaWYgKGRlZmluZWQoX192bXMpIHx8IGRlZmluZWQoX19WTVMpKSAmJiAoX19JTklUSUFMX1BPSU5URVJfU0laRSswID09IDY0KQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfVk9JRF9QICAgICAgICAgOAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfU0laRV9UICAgICAgICAgQUNDX1NJWkVPRl9MT05HCisjICBkZWZpbmUgQUNDX1NJWkVPRl9QVFJESUZGX1QgICAgICBBQ0NfU0laRU9GX0xPTkcKKyNlbGlmIChBQ0NfQVJDSF9TUFUpCisjIGlmIDAKKyMgIGRlZmluZSBfX0FDQ19XT1JEU0laRSAgICAgICAgICAgIDE2CisjIGVuZGlmCisjICBkZWZpbmUgQUNDX1NJWkVPRl9WT0lEX1AgICAgICAgICA0CisjZWxzZQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfVk9JRF9QICAgICAgICAgQUNDX1NJWkVPRl9MT05HCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19XT1JEU0laRSkKKyMgIGlmIGRlZmluZWQoX19BQ0NfV09SRFNJWkUpCisjICAgIGRlZmluZSBBQ0NfV09SRFNJWkUgICAgICAgICAgICBfX0FDQ19XT1JEU0laRQorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX1dPUkRTSVpFICAgICAgICAgICAgQUNDX1NJWkVPRl9WT0lEX1AKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfU0laRU9GX1NJWkVfVCkKKyNpZiAoQUNDX0FSQ0hfSTA4NiB8fCBBQ0NfQVJDSF9NMTZDKQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfU0laRV9UICAgICAgICAgMgorI2Vsc2UKKyMgIGRlZmluZSBBQ0NfU0laRU9GX1NJWkVfVCAgICAgICAgIEFDQ19TSVpFT0ZfVk9JRF9QCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19TSVpFT0ZfUFRSRElGRl9UKQorI2lmIChBQ0NfQVJDSF9JMDg2KQorIyAgaWYgKEFDQ19NTV9USU5ZIHx8IEFDQ19NTV9TTUFMTCB8fCBBQ0NfTU1fTUVESVVNIHx8IEFDQ19NTV9IVUdFKQorIyAgICBkZWZpbmUgQUNDX1NJWkVPRl9QVFJESUZGX1QgICAgQUNDX1NJWkVPRl9WT0lEX1AKKyMgIGVsaWYgKEFDQ19NTV9DT01QQUNUIHx8IEFDQ19NTV9MQVJHRSkKKyMgICAgaWYgKEFDQ19DQ19CT1JMQU5EQyB8fCBBQ0NfQ0NfVFVSQk9DKQorIyAgICAgIGRlZmluZSBBQ0NfU0laRU9GX1BUUkRJRkZfVCAgNAorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEFDQ19TSVpFT0ZfUFRSRElGRl9UICAyCisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGVycm9yICJBQ0NfTU0iCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBBQ0NfU0laRU9GX1BUUkRJRkZfVCAgICAgIEFDQ19TSVpFT0ZfU0laRV9UCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX0FCSV9ORVVUUkFMX0VORElBTikKKyMgIHVuZGVmIEFDQ19BQklfQklHX0VORElBTgorIyAgdW5kZWYgQUNDX0FCSV9MSVRUTEVfRU5ESUFOCisjZWxpZiAhZGVmaW5lZChBQ0NfQUJJX0JJR19FTkRJQU4pICYmICFkZWZpbmVkKEFDQ19BQklfTElUVExFX0VORElBTikKKyNpZiAoQUNDX0FSQ0hfQUxQSEEpICYmIChBQ0NfQVJDSF9DUkFZX01QUCkKKyMgIGRlZmluZSBBQ0NfQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIChBQ0NfQVJDSF9BTFBIQSB8fCBBQ0NfQVJDSF9BTUQ2NCB8fCBBQ0NfQVJDSF9CTEFDS0ZJTiB8fCBBQ0NfQVJDSF9DUklTIHx8IEFDQ19BUkNIX0kwODYgfHwgQUNDX0FSQ0hfSTM4NiB8fCBBQ0NfQVJDSF9NU1A0MzApCisjICBkZWZpbmUgQUNDX0FCSV9MSVRUTEVfRU5ESUFOICAgICAxCisjZWxpZiAoQUNDX0FSQ0hfTTY4SyB8fCBBQ0NfQVJDSF9TMzkwKQorIyAgZGVmaW5lIEFDQ19BQklfQklHX0VORElBTiAgICAgICAgMQorI2VsaWYgMSAmJiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pCisjICBpZiAoX19MSVRUTEVfRU5ESUFOX18gPT0gMSkKKyMgICAgZGVmaW5lIEFDQ19BQklfTElUVExFX0VORElBTiAgIDEKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ19BQklfQklHX0VORElBTiAgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAxICYmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pICYmICFkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQorIyAgZGVmaW5lIEFDQ19BQklfQklHX0VORElBTiAgICAgICAgMQorI2VsaWYgMSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKSAmJiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykKKyMgIGRlZmluZSBBQ0NfQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIDEgJiYgKEFDQ19BUkNIX0FSTSkgJiYgZGVmaW5lZChfX0FSTUVCX18pICYmICFkZWZpbmVkKF9fQVJNRUxfXykKKyMgIGRlZmluZSBBQ0NfQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIDEgJiYgKEFDQ19BUkNIX0FSTSkgJiYgZGVmaW5lZChfX0FSTUVMX18pICYmICFkZWZpbmVkKF9fQVJNRUJfXykKKyMgIGRlZmluZSBBQ0NfQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbGlmIDEgJiYgKEFDQ19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUJfXykgJiYgIWRlZmluZWQoX19NSVBTRUxfXykKKyMgIGRlZmluZSBBQ0NfQUJJX0JJR19FTkRJQU4gICAgICAgIDEKKyNlbGlmIDEgJiYgKEFDQ19BUkNIX01JUFMpICYmIGRlZmluZWQoX19NSVBTRUxfXykgJiYgIWRlZmluZWQoX19NSVBTRUJfXykKKyMgIGRlZmluZSBBQ0NfQUJJX0xJVFRMRV9FTkRJQU4gICAgIDEKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfQUJJX0JJR19FTkRJQU4pICYmIGRlZmluZWQoQUNDX0FCSV9MSVRUTEVfRU5ESUFOKQorIyAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19BQklfQklHX0VORElBTikKKyMgIGRlZmluZSBBQ0NfSU5GT19BQklfRU5ESUFOICAgICAgICJiZSIKKyNlbGlmIGRlZmluZWQoQUNDX0FCSV9MSVRUTEVfRU5ESUFOKQorIyAgZGVmaW5lIEFDQ19JTkZPX0FCSV9FTkRJQU4gICAgICAgImxlIgorI2VsaWYgZGVmaW5lZChBQ0NfQUJJX05FVVRSQUxfRU5ESUFOKQorIyAgZGVmaW5lIEFDQ19JTkZPX0FCSV9FTkRJQU4gICAgICAgIm5ldXRyYWwiCisjZW5kaWYKKyNpZiAoQUNDX1NJWkVPRl9JTlQgPT0gMSAmJiBBQ0NfU0laRU9GX0xPTkcgPT0gMiAmJiBBQ0NfU0laRU9GX1ZPSURfUCA9PSAyKQorIyAgZGVmaW5lIEFDQ19BQklfSThMUDE2ICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FCSV9QTSAgICAgICAiaThscDE2IgorI2VsaWYgKEFDQ19TSVpFT0ZfSU5UID09IDIgJiYgQUNDX1NJWkVPRl9MT05HID09IDIgJiYgQUNDX1NJWkVPRl9WT0lEX1AgPT0gMikKKyMgIGRlZmluZSBBQ0NfQUJJX0lMUDE2ICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FCSV9QTSAgICAgICAiaWxwMTYiCisjZWxpZiAoQUNDX1NJWkVPRl9JTlQgPT0gNCAmJiBBQ0NfU0laRU9GX0xPTkcgPT0gNCAmJiBBQ0NfU0laRU9GX1ZPSURfUCA9PSA0KQorIyAgZGVmaW5lIEFDQ19BQklfSUxQMzIgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQUJJX1BNICAgICAgICJpbHAzMiIKKyNlbGlmIChBQ0NfU0laRU9GX0lOVCA9PSA0ICYmIEFDQ19TSVpFT0ZfTE9ORyA9PSA0ICYmIEFDQ19TSVpFT0ZfVk9JRF9QID09IDggJiYgQUNDX1NJWkVPRl9TSVpFX1QgPT0gOCkKKyMgIGRlZmluZSBBQ0NfQUJJX0xMUDY0ICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FCSV9QTSAgICAgICAibGxwNjQiCisjZWxpZiAoQUNDX1NJWkVPRl9JTlQgPT0gNCAmJiBBQ0NfU0laRU9GX0xPTkcgPT0gOCAmJiBBQ0NfU0laRU9GX1ZPSURfUCA9PSA4KQorIyAgZGVmaW5lIEFDQ19BQklfTFA2NCAgICAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQUJJX1BNICAgICAgICJscDY0IgorI2VsaWYgKEFDQ19TSVpFT0ZfSU5UID09IDggJiYgQUNDX1NJWkVPRl9MT05HID09IDggJiYgQUNDX1NJWkVPRl9WT0lEX1AgPT0gOCkKKyMgIGRlZmluZSBBQ0NfQUJJX0lMUDY0ICAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0FCSV9QTSAgICAgICAiaWxwNjQiCisjZWxpZiAoQUNDX1NJWkVPRl9JTlQgPT0gNCAmJiBBQ0NfU0laRU9GX0xPTkcgPT0gOCAmJiBBQ0NfU0laRU9GX1ZPSURfUCA9PSA0KQorIyAgZGVmaW5lIEFDQ19BQklfSVAzMkw2NCAgICAgICAxCisjICBkZWZpbmUgQUNDX0lORk9fQUJJX1BNICAgICAgICJpcDMybDY0IgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19BQ0NfTElCQ19PVkVSUklERSkKKyNpZiBkZWZpbmVkKEFDQ19MSUJDX05BS0VEKQorIyAgZGVmaW5lIEFDQ19JTkZPX0xJQkMgICAgICAgICAibmFrZWQiCisjZWxpZiBkZWZpbmVkKEFDQ19MSUJDX0ZSRUVTVEFORElORykKKyMgIGRlZmluZSBBQ0NfSU5GT19MSUJDICAgICAgICAgImZyZWVzdGFuZGluZyIKKyNlbGlmIGRlZmluZWQoQUNDX0xJQkNfTU9TVExZX0ZSRUVTVEFORElORykKKyMgIGRlZmluZSBBQ0NfSU5GT19MSUJDICAgICAgICAgIm1mcmVlc3RhbmRpbmciCisjZWxpZiBkZWZpbmVkKEFDQ19MSUJDX0lTT0M5MCkKKyMgIGRlZmluZSBBQ0NfSU5GT19MSUJDICAgICAgICAgImlzb2M5MCIKKyNlbGlmIGRlZmluZWQoQUNDX0xJQkNfSVNPQzk5KQorIyAgZGVmaW5lIEFDQ19JTkZPX0xJQkMgICAgICAgICAiaXNvYzk5IgorI2VsaWYgZGVmaW5lZChfX2RpZXRsaWJjX18pCisjICBkZWZpbmUgQUNDX0xJQkNfRElFVExJQkMgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19MSUJDICAgICAgICAgImRpZXRsaWJjIgorI2VsaWYgZGVmaW5lZChfTkVXTElCX1ZFUlNJT04pCisjICBkZWZpbmUgQUNDX0xJQkNfTkVXTElCICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfSU5GT19MSUJDICAgICAgICAgIm5ld2xpYiIKKyNlbGlmIGRlZmluZWQoX19VQ0xJQkNfXykgJiYgZGVmaW5lZChfX1VDTElCQ19NQUpPUl9fKSAmJiBkZWZpbmVkKF9fVUNMSUJDX01JTk9SX18pCisjICBpZiBkZWZpbmVkKF9fVUNMSUJDX1NVQkxFVkVMX18pCisjICAgIGRlZmluZSBBQ0NfTElCQ19VQ0xJQkMgICAgIChfX1VDTElCQ19NQUpPUl9fICogMHgxMDAwMEwgKyBfX1VDTElCQ19NSU5PUl9fICogMHgxMDAgKyBfX1VDTElCQ19TVUJMRVZFTF9fKQorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX0xJQkNfVUNMSUJDICAgICAweDAwMDkwYkwKKyMgIGVuZGlmCisjICBkZWZpbmUgQUNDX0lORk9fTElCQyAgICAgICAgICJ1Y2xpYmMiCisjZWxpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgZGVmaW5lZChfX0dMSUJDX01JTk9SX18pCisjICBkZWZpbmUgQUNDX0xJQkNfR0xJQkMgICAgICAgIChfX0dMSUJDX18gKiAweDEwMDAwTCArIF9fR0xJQkNfTUlOT1JfXyAqIDB4MTAwKQorIyAgZGVmaW5lIEFDQ19JTkZPX0xJQkMgICAgICAgICAiZ2xpYmMiCisjZWxpZiAoQUNDX0NDX01XRVJLUykgJiYgZGVmaW5lZChfX01TTF9fKQorIyAgZGVmaW5lIEFDQ19MSUJDX01TTCAgICAgICAgICBfX01TTF9fCisjICBkZWZpbmUgQUNDX0lORk9fTElCQyAgICAgICAgICJtc2wiCisjZWxpZiAxICYmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykKKyMgIGRlZmluZSBBQ0NfTElCQ19JU09DOTAgICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0xJQkMgICAgICAgICAiaXNvYzkwIgorI2Vsc2UKKyMgIGRlZmluZSBBQ0NfTElCQ19ERUZBVUxUICAgICAgMQorIyAgZGVmaW5lIEFDQ19JTkZPX0xJQkMgICAgICAgICAiZGVmYXVsdCIKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19hY2NfZ251Y19leHRlbnNpb25fXykKKyNpZiAoQUNDX0NDX0dOVUMgPj0gMHgwMjA4MDB1bCkKKyMgIGRlZmluZSBfX2FjY19nbnVjX2V4dGVuc2lvbl9fICAgIF9fZXh0ZW5zaW9uX18KKyNlbGlmIChBQ0NfQ0NfTExWTSB8fCBBQ0NfQ0NfUEFUSFNDQUxFKQorIyAgZGVmaW5lIF9fYWNjX2dudWNfZXh0ZW5zaW9uX18gICAgX19leHRlbnNpb25fXworI2Vsc2UKKyMgIGRlZmluZSBfX2FjY19nbnVjX2V4dGVuc2lvbl9fCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX3VhX3ZvbGF0aWxlKQorIyAgZGVmaW5lIF9fYWNjX3VhX3ZvbGF0aWxlICAgICB2b2xhdGlsZQorI2VuZGlmCisjaWYgIWRlZmluZWQoX19hY2NfYWxpZ25vZikKKyNpZiAoQUNDX0NDX0NJTExZIHx8IEFDQ19DQ19HTlVDIHx8IEFDQ19DQ19MTFZNIHx8IEFDQ19DQ19QQVRIU0NBTEUgfHwgQUNDX0NDX1BHSSkKKyMgIGRlZmluZSBfX2FjY19hbGlnbm9mKGUpICAgICAgX19hbGlnbm9mX18oZSkKKyNlbGlmIChBQ0NfQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDcwMCkpCisjICBkZWZpbmUgX19hY2NfYWxpZ25vZihlKSAgICAgIF9fYWxpZ25vZl9fKGUpCisjZWxpZiAoQUNDX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTMwMCkpCisjICBkZWZpbmUgX19hY2NfYWxpZ25vZihlKSAgICAgIF9fYWxpZ25vZihlKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fYWNjX2FsaWdub2YpCisjICBkZWZpbmUgX19hY2NfSEFWRV9hbGlnbm9mIDEKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX2NvbnN0cnVjdG9yKQorI2lmIChBQ0NfQ0NfR05VQyA+PSAweDAzMDQwMHVsKQorIyAgZGVmaW5lIF9fYWNjX2NvbnN0cnVjdG9yICAgICBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0cnVjdG9yX18sX191c2VkX18pKQorI2VsaWYgKEFDQ19DQ19HTlVDID49IDB4MDIwNzAwdWwpCisjICBkZWZpbmUgX19hY2NfY29uc3RydWN0b3IgICAgIF9fYXR0cmlidXRlX18oKF9fY29uc3RydWN0b3JfXykpCisjZWxpZiAoQUNDX0NDX0xMVk0gfHwgQUNDX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2FjY19jb25zdHJ1Y3RvciAgICAgX19hdHRyaWJ1dGVfXygoX19jb25zdHJ1Y3Rvcl9fKSkKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2FjY19jb25zdHJ1Y3RvcikKKyMgIGRlZmluZSBfX2FjY19IQVZFX2NvbnN0cnVjdG9yIDEKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX2Rlc3RydWN0b3IpCisjaWYgKEFDQ19DQ19HTlVDID49IDB4MDMwNDAwdWwpCisjICBkZWZpbmUgX19hY2NfZGVzdHJ1Y3RvciAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVzdHJ1Y3Rvcl9fLF9fdXNlZF9fKSkKKyNlbGlmIChBQ0NfQ0NfR05VQyA+PSAweDAyMDcwMHVsKQorIyAgZGVmaW5lIF9fYWNjX2Rlc3RydWN0b3IgICAgICBfX2F0dHJpYnV0ZV9fKChfX2Rlc3RydWN0b3JfXykpCisjZWxpZiAoQUNDX0NDX0xMVk0gfHwgQUNDX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2FjY19kZXN0cnVjdG9yICAgICAgX19hdHRyaWJ1dGVfXygoX19kZXN0cnVjdG9yX18pKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fYWNjX2Rlc3RydWN0b3IpCisjICBkZWZpbmUgX19hY2NfSEFWRV9kZXN0cnVjdG9yIDEKKyNlbmRpZgorI2lmIGRlZmluZWQoX19hY2NfSEFWRV9kZXN0cnVjdG9yKSAmJiAhZGVmaW5lZChfX2FjY19IQVZFX2NvbnN0cnVjdG9yKQorIyAgZXJyb3IgInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2FjY19pbmxpbmUpCisjaWYgKEFDQ19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPD0gMHgwMjk1KSkKKyNlbGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICBkZWZpbmUgX19hY2NfaW5saW5lICAgICAgICAgIGlubGluZQorI2VsaWYgKEFDQ19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDU1MCkpCisjICBkZWZpbmUgX19hY2NfaW5saW5lICAgICAgICAgIF9faW5saW5lCisjZWxpZiAoQUNDX0NDX0NJTExZIHx8IEFDQ19DQ19HTlVDIHx8IEFDQ19DQ19MTFZNIHx8IEFDQ19DQ19QQVRIU0NBTEUgfHwgQUNDX0NDX1BHSSkKKyMgIGRlZmluZSBfX2FjY19pbmxpbmUgICAgICAgICAgX19pbmxpbmVfXworI2VsaWYgKEFDQ19DQ19ETUMpCisjICBkZWZpbmUgX19hY2NfaW5saW5lICAgICAgICAgIF9faW5saW5lCisjZWxpZiAoQUNDX0NDX0lOVEVMQykKKyMgIGRlZmluZSBfX2FjY19pbmxpbmUgICAgICAgICAgX19pbmxpbmUKKyNlbGlmIChBQ0NfQ0NfTVdFUktTICYmIChfX01XRVJLU19fID49IDB4MjQwNSkpCisjICBkZWZpbmUgX19hY2NfaW5saW5lICAgICAgICAgIF9faW5saW5lCisjZWxpZiAoQUNDX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gOTAwKSkKKyMgIGRlZmluZSBfX2FjY19pbmxpbmUgICAgICAgICAgX19pbmxpbmUKKyNlbGlmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKyMgIGRlZmluZSBfX2FjY19pbmxpbmUgICAgICAgICAgaW5saW5lCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19hY2NfaW5saW5lKQorIyAgZGVmaW5lIF9fYWNjX0hBVkVfaW5saW5lIDEKKyNlbHNlCisjICBkZWZpbmUgX19hY2NfaW5saW5lCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2FjY19mb3JjZWlubGluZSkKKyNpZiAoQUNDX0NDX0dOVUMgPj0gMHgwMzAyMDB1bCkKKyMgIGRlZmluZSBfX2FjY19mb3JjZWlubGluZSAgICAgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCisjZWxpZiAoQUNDX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA0NTApICYmIEFDQ19DQ19TWU5UQVhfTVNDKQorIyAgZGVmaW5lIF9fYWNjX2ZvcmNlaW5saW5lICAgICBfX2ZvcmNlaW5saW5lCisjZWxpZiAoQUNDX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA4MDApICYmIEFDQ19DQ19TWU5UQVhfR05VQykKKyMgIGRlZmluZSBfX2FjY19mb3JjZWlubGluZSAgICAgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCisjZWxpZiAoQUNDX0NDX0xMVk0gfHwgQUNDX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2FjY19mb3JjZWlubGluZSAgICAgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpCisjZWxpZiAoQUNDX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTIwMCkpCisjICBkZWZpbmUgX19hY2NfZm9yY2VpbmxpbmUgICAgIF9fZm9yY2VpbmxpbmUKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2FjY19mb3JjZWlubGluZSkKKyMgIGRlZmluZSBfX2FjY19IQVZFX2ZvcmNlaW5saW5lIDEKKyNlbHNlCisjICBkZWZpbmUgX19hY2NfZm9yY2VpbmxpbmUKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX25vaW5saW5lKQorI2lmIDEgJiYgKEFDQ19BUkNIX0kzODYpICYmIChBQ0NfQ0NfR05VQyA+PSAweDA0MDAwMHVsKSAmJiAoQUNDX0NDX0dOVUMgPCAweDA0MDAwM3VsKQorIyAgZGVmaW5lIF9fYWNjX25vaW5saW5lICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18sX191c2VkX18pKQorI2VsaWYgKEFDQ19DQ19HTlVDID49IDB4MDMwMjAwdWwpCisjICBkZWZpbmUgX19hY2Nfbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoQUNDX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA2MDApICYmIEFDQ19DQ19TWU5UQVhfTVNDKQorIyAgZGVmaW5lIF9fYWNjX25vaW5saW5lICAgICAgICBfX2RlY2xzcGVjKG5vaW5saW5lKQorI2VsaWYgKEFDQ19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSAmJiBBQ0NfQ0NfU1lOVEFYX0dOVUMpCisjICBkZWZpbmUgX19hY2Nfbm9pbmxpbmUgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjZWxpZiAoQUNDX0NDX0xMVk0gfHwgQUNDX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2FjY19ub2lubGluZSAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKKyNlbGlmIChBQ0NfQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMzAwKSkKKyMgIGRlZmluZSBfX2FjY19ub2lubGluZSAgICAgICAgX19kZWNsc3BlYyhub2lubGluZSkKKyNlbGlmIChBQ0NfQ0NfTVdFUktTICYmIChfX01XRVJLU19fID49IDB4MzIwMCkgJiYgKEFDQ19PU19XSU4zMiB8fCBBQ0NfT1NfV0lONjQpKQorIyAgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9fYWNjX25vaW5saW5lICAgICAgX19kZWNsc3BlYyhub2lubGluZSkKKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19hY2Nfbm9pbmxpbmUpCisjICBkZWZpbmUgX19hY2NfSEFWRV9ub2lubGluZSAxCisjZWxzZQorIyAgZGVmaW5lIF9fYWNjX25vaW5saW5lCisjZW5kaWYKKyNpZiAoZGVmaW5lZChfX2FjY19IQVZFX2ZvcmNlaW5saW5lKSB8fCBkZWZpbmVkKF9fYWNjX0hBVkVfbm9pbmxpbmUpKSAmJiAhZGVmaW5lZChfX2FjY19IQVZFX2lubGluZSkKKyMgIGVycm9yICJ0aGlzIHNob3VsZCBub3QgaGFwcGVuIgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19hY2Nfbm9yZXR1cm4pCisjaWYgKEFDQ19DQ19HTlVDID49IDB4MDIwNzAwdWwpCisjICBkZWZpbmUgX19hY2Nfbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoQUNDX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA0NTApICYmIEFDQ19DQ19TWU5UQVhfTVNDKQorIyAgZGVmaW5lIF9fYWNjX25vcmV0dXJuICAgICAgICBfX2RlY2xzcGVjKG5vcmV0dXJuKQorI2VsaWYgKEFDQ19DQ19JTlRFTEMgJiYgKF9fSU5URUxfQ09NUElMRVIgPj0gNjAwKSAmJiBBQ0NfQ0NfU1lOVEFYX0dOVUMpCisjICBkZWZpbmUgX19hY2Nfbm9yZXR1cm4gICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiAoQUNDX0NDX0xMVk0gfHwgQUNDX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2FjY19ub3JldHVybiAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKKyNlbGlmIChBQ0NfQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMjAwKSkKKyMgIGRlZmluZSBfX2FjY19ub3JldHVybiAgICAgICAgX19kZWNsc3BlYyhub3JldHVybikKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX2FjY19ub3JldHVybikKKyMgIGRlZmluZSBfX2FjY19IQVZFX25vcmV0dXJuIDEKKyNlbHNlCisjICBkZWZpbmUgX19hY2Nfbm9yZXR1cm4KKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX25vdGhyb3cpCisjaWYgKEFDQ19DQ19HTlVDID49IDB4MDMwMzAwdWwpCisjICBkZWZpbmUgX19hY2Nfbm90aHJvdyAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKKyNlbGlmIChBQ0NfQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDQ1MCkgJiYgQUNDX0NDX1NZTlRBWF9NU0MpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICBkZWZpbmUgX19hY2Nfbm90aHJvdyAgICAgICAgIF9fZGVjbHNwZWMobm90aHJvdykKKyNlbGlmIChBQ0NfQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDgwMCkgJiYgQUNDX0NDX1NZTlRBWF9HTlVDKQorIyAgZGVmaW5lIF9fYWNjX25vdGhyb3cgICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vdGhyb3dfXykpCisjZWxpZiAoQUNDX0NDX0xMVk0gfHwgQUNDX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2FjY19ub3Rocm93ICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19ub3Rocm93X18pKQorI2VsaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIF9fYWNjX25vdGhyb3cgICAgICAgICBfX2RlY2xzcGVjKG5vdGhyb3cpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19hY2Nfbm90aHJvdykKKyMgIGRlZmluZSBfX2FjY19IQVZFX25vdGhyb3cgMQorI2Vsc2UKKyMgIGRlZmluZSBfX2FjY19ub3Rocm93CisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2FjY19yZXN0cmljdCkKKyNpZiAoQUNDX0NDX0dOVUMgPj0gMHgwMzA0MDB1bCkKKyMgIGRlZmluZSBfX2FjY19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdF9fCisjZWxpZiAoQUNDX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA2MDApICYmIEFDQ19DQ19TWU5UQVhfR05VQykKKyMgIGRlZmluZSBfX2FjY19yZXN0cmljdCAgICAgICAgX19yZXN0cmljdF9fCisjZWxpZiAoQUNDX0NDX0xMVk0pCisjICBkZWZpbmUgX19hY2NfcmVzdHJpY3QgICAgICAgIF9fcmVzdHJpY3RfXworI2VsaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDE0MDApKQorIyAgZGVmaW5lIF9fYWNjX3Jlc3RyaWN0ICAgICAgICBfX3Jlc3RyaWN0CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19hY2NfcmVzdHJpY3QpCisjICBkZWZpbmUgX19hY2NfSEFWRV9yZXN0cmljdCAxCisjZWxzZQorIyAgZGVmaW5lIF9fYWNjX3Jlc3RyaWN0CisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2FjY19saWtlbHkpICYmICFkZWZpbmVkKF9fYWNjX3VubGlrZWx5KQorI2lmIChBQ0NfQ0NfR05VQyA+PSAweDAzMDIwMHVsKQorIyAgZGVmaW5lIF9fYWNjX2xpa2VseShlKSAgICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwxKSkKKyMgIGRlZmluZSBfX2FjY191bmxpa2VseShlKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMCkpCisjZWxpZiAoQUNDX0NDX0lOVEVMQyAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSA4MDApKQorIyAgZGVmaW5lIF9fYWNjX2xpa2VseShlKSAgICAgICAoX19idWlsdGluX2V4cGVjdCghIShlKSwxKSkKKyMgIGRlZmluZSBfX2FjY191bmxpa2VseShlKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMCkpCisjZWxpZiAoQUNDX0NDX0xMVk0gfHwgQUNDX0NDX1BBVEhTQ0FMRSkKKyMgIGRlZmluZSBfX2FjY19saWtlbHkoZSkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoZSksMSkpCisjICBkZWZpbmUgX19hY2NfdW5saWtlbHkoZSkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCEhKGUpLDApKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fYWNjX2xpa2VseSkKKyMgIGRlZmluZSBfX2FjY19IQVZFX2xpa2VseSAxCisjZWxzZQorIyAgZGVmaW5lIF9fYWNjX2xpa2VseShlKSAgICAgICAoZSkKKyNlbmRpZgorI2lmIGRlZmluZWQoX19hY2NfdW5saWtlbHkpCisjICBkZWZpbmUgX19hY2NfSEFWRV91bmxpa2VseSAxCisjZWxzZQorIyAgZGVmaW5lIF9fYWNjX3VubGlrZWx5KGUpICAgICAoZSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19VTlVTRUQpCisjICBpZiAoQUNDX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNjAwKSkKKyMgICAgZGVmaW5lIEFDQ19VTlVTRUQodmFyKSAgICAgICAgICgodm9pZCkgJnZhcikKKyMgIGVsaWYgKEFDQ19DQ19CT1JMQU5EQyB8fCBBQ0NfQ0NfSElHSEMgfHwgQUNDX0NDX05EUEMgfHwgQUNDX0NDX1BFTExFU0MgfHwgQUNDX0NDX1RVUkJPQykKKyMgICAgZGVmaW5lIEFDQ19VTlVTRUQodmFyKSAgICAgICAgIGlmICgmdmFyKSA7IGVsc2UKKyMgIGVsaWYgKEFDQ19DQ19HTlVDIHx8IEFDQ19DQ19MTFZNIHx8IEFDQ19DQ19QQVRIU0NBTEUpCisjICAgIGRlZmluZSBBQ0NfVU5VU0VEKHZhcikgICAgICAgICAoKHZvaWQpIHZhcikKKyMgIGVsaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSIDwgOTAwKSkKKyMgICAgZGVmaW5lIEFDQ19VTlVTRUQodmFyKSAgICAgICAgIGlmICgmdmFyKSA7IGVsc2UKKyMgIGVsaWYgKEFDQ19DQ19LRUlMQykKKyMgICAgZGVmaW5lIEFDQ19VTlVTRUQodmFyKSAgICAgICAgIHtleHRlcm4gaW50IF9fYWNjX3VudXNlZFsxLTIqIShzaXplb2YodmFyKT4wKV07fQorIyAgZWxpZiAoQUNDX0NDX1BBQ0lGSUNDKQorIyAgICBkZWZpbmUgQUNDX1VOVVNFRCh2YXIpICAgICAgICAgKCh2b2lkKSBzaXplb2YodmFyKSkKKyMgIGVsaWYgKEFDQ19DQ19XQVRDT01DKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICBkZWZpbmUgQUNDX1VOVVNFRCh2YXIpICAgICAgICAgKCh2b2lkKSB2YXIpCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfVU5VU0VEKHZhcikgICAgICAgICAoKHZvaWQpICZ2YXIpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX1VOVVNFRF9GVU5DKQorIyAgaWYgKEFDQ19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDYwMCkpCisjICAgIGRlZmluZSBBQ0NfVU5VU0VEX0ZVTkMoZnVuYykgICAoKHZvaWQpIGZ1bmMpCisjICBlbGlmIChBQ0NfQ0NfQk9STEFOREMgfHwgQUNDX0NDX05EUEMgfHwgQUNDX0NDX1RVUkJPQykKKyMgICAgZGVmaW5lIEFDQ19VTlVTRURfRlVOQyhmdW5jKSAgIGlmIChmdW5jKSA7IGVsc2UKKyMgIGVsaWYgKEFDQ19DQ19MTFZNKQorIyAgICBkZWZpbmUgQUNDX1VOVVNFRF9GVU5DKGZ1bmMpICAgKCh2b2lkKSAmZnVuYykKKyMgIGVsaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSIDwgOTAwKSkKKyMgICAgZGVmaW5lIEFDQ19VTlVTRURfRlVOQyhmdW5jKSAgIGlmIChmdW5jKSA7IGVsc2UKKyMgIGVsaWYgKEFDQ19DQ19NU0MpCisjICAgIGRlZmluZSBBQ0NfVU5VU0VEX0ZVTkMoZnVuYykgICAoKHZvaWQpICZmdW5jKQorIyAgZWxpZiAoQUNDX0NDX0tFSUxDIHx8IEFDQ19DQ19QRUxMRVNDKQorIyAgICBkZWZpbmUgQUNDX1VOVVNFRF9GVU5DKGZ1bmMpICAge2V4dGVybiBpbnQgX19hY2NfdW51c2VkWzEtMiohKHNpemVvZigoaW50KWZ1bmMpPjApXTt9CisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfVU5VU0VEX0ZVTkMoZnVuYykgICAoKHZvaWQpIGZ1bmMpCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX1VOVVNFRF9MQUJFTCkKKyMgIGlmIChBQ0NfQ0NfV0FUQ09NQykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgZGVmaW5lIEFDQ19VTlVTRURfTEFCRUwobCkgICAgIHN3aXRjaCgwKSBjYXNlIDE6Z290byBsCisjICBlbGlmIChBQ0NfQ0NfSU5URUxDIHx8IEFDQ19DQ19XQVRDT01DKQorIyAgICBkZWZpbmUgQUNDX1VOVVNFRF9MQUJFTChsKSAgICAgaWYgKDApIGdvdG8gbAorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX1VOVVNFRF9MQUJFTChsKSAgICAgc3dpdGNoKDApIGNhc2UgMTpnb3RvIGwKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfREVGSU5FX1VOSU5JVElBTElaRURfVkFSKQorIyAgaWYgMAorIyAgICBkZWZpbmUgQUNDX0RFRklORV9VTklOSVRJQUxJWkVEX1ZBUih0eXBlLHZhcixpbml0KSAgdHlwZSB2YXIKKyMgIGVsaWYgMCAmJiAoQUNDX0NDX0dOVUMpCisjICAgIGRlZmluZSBBQ0NfREVGSU5FX1VOSU5JVElBTElaRURfVkFSKHR5cGUsdmFyLGluaXQpICB0eXBlIHZhciA9IHZhcgorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX0RFRklORV9VTklOSVRJQUxJWkVEX1ZBUih0eXBlLHZhcixpbml0KSAgdHlwZSB2YXIgPSBpbml0CisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKQorIyAgaWYgKEFDQ19DQ19BWlRFQ0MgfHwgQUNDX0NDX1pPUlRFQ0hDKQorIyAgICBkZWZpbmUgQUNDX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBleHRlcm4gaW50IF9fYWNjX2N0YVsxLSEoZSldOworIyAgZWxpZiAoQUNDX0NDX0RNQyB8fCBBQ0NfQ0NfU1lNQU5URUNDKQorIyAgICBkZWZpbmUgQUNDX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBleHRlcm4gaW50IF9fYWNjX2N0YVsxdS0yKiEoZSldOworIyAgZWxpZiAoQUNDX0NDX1RVUkJPQyAmJiAoX19UVVJCT0NfXyA9PSAweDAyOTUpKQorIyAgICBkZWZpbmUgQUNDX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBleHRlcm4gaW50IF9fYWNjX2N0YVsxLSEoZSldOworIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX0NPTVBJTEVfVElNRV9BU1NFUlRfSEVBREVSKGUpICBleHRlcm4gaW50IF9fYWNjX2N0YVsxLTIqIShlKV07CisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX0NPTVBJTEVfVElNRV9BU1NFUlQpCisjICBpZiAoQUNDX0NDX0FaVEVDQykKKyMgICAgZGVmaW5lIEFDQ19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICB7dHlwZWRlZiBpbnQgX19hY2NfY3RhX3RbMS0hKGUpXTt9CisjICBlbGlmIChBQ0NfQ0NfRE1DIHx8IEFDQ19DQ19QQUNJRklDQyB8fCBBQ0NfQ0NfU1lNQU5URUNDIHx8IEFDQ19DQ19aT1JURUNIQykKKyMgICAgZGVmaW5lIEFDQ19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICBzd2l0Y2goMCkgY2FzZSAxOmNhc2UgIShlKTpicmVhazsKKyMgIGVsaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSIDwgOTAwKSkKKyMgICAgZGVmaW5lIEFDQ19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICBzd2l0Y2goMCkgY2FzZSAxOmNhc2UgIShlKTpicmVhazsKKyMgIGVsaWYgKEFDQ19DQ19UVVJCT0MgJiYgKF9fVFVSQk9DX18gPT0gMHgwMjk1KSkKKyMgICAgZGVmaW5lIEFDQ19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICBzd2l0Y2goMCkgY2FzZSAxOmNhc2UgIShlKTpicmVhazsKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ19DT01QSUxFX1RJTUVfQVNTRVJUKGUpICB7dHlwZWRlZiBpbnQgX19hY2NfY3RhX3RbMS0yKiEoZSldO30KKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoQUNDX0FSQ0hfSTA4NiB8fCBBQ0NfQVJDSF9JMzg2KSAmJiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19ET1MzMiB8fCBBQ0NfT1NfT1MyIHx8IEFDQ19PU19PUzIxNiB8fCBBQ0NfT1NfV0lOMTYgfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkKKyMgIGlmIChBQ0NfQ0NfR05VQyB8fCBBQ0NfQ0NfSElHSEMgfHwgQUNDX0NDX05EUEMgfHwgQUNDX0NDX1BBQ0lGSUNDKQorIyAgZWxpZiAoQUNDX0NDX0RNQyB8fCBBQ0NfQ0NfU1lNQU5URUNDIHx8IEFDQ19DQ19aT1JURUNIQykKKyMgICAgZGVmaW5lIF9fYWNjX2NkZWNsICAgICAgICAgICAgICAgICBfX2NkZWNsCisjICAgIGRlZmluZSBfX2FjY19jZGVjbF9hdGV4aXQKKyMgICAgZGVmaW5lIF9fYWNjX2NkZWNsX21haW4gICAgICAgICAgICBfX2NkZWNsCisjICAgIGlmIChBQ0NfT1NfT1MyICYmIChBQ0NfQ0NfRE1DIHx8IEFDQ19DQ19TWU1BTlRFQ0MpKQorIyAgICAgIGRlZmluZSBfX2FjY19jZGVjbF9xc29ydCAgICAgICAgIF9fcGFzY2FsCisjICAgIGVsaWYgKEFDQ19PU19PUzIgJiYgKEFDQ19DQ19aT1JURUNIQykpCisjICAgICAgZGVmaW5lIF9fYWNjX2NkZWNsX3Fzb3J0ICAgICAgICAgX3N0ZGNhbGwKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfX2FjY19jZGVjbF9xc29ydCAgICAgICAgIF9fY2RlY2wKKyMgICAgZW5kaWYKKyMgIGVsaWYgKEFDQ19DQ19XQVRDT01DKQorIyAgICBkZWZpbmUgX19hY2NfY2RlY2wgICAgICAgICAgICAgICAgIF9fY2RlY2wKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9fYWNjX2NkZWNsICAgICAgICAgICAgICAgICBfX2NkZWNsCisjICAgIGRlZmluZSBfX2FjY19jZGVjbF9hdGV4aXQgICAgICAgICAgX19jZGVjbAorIyAgICBkZWZpbmUgX19hY2NfY2RlY2xfbWFpbiAgICAgICAgICAgIF9fY2RlY2wKKyMgICAgZGVmaW5lIF9fYWNjX2NkZWNsX3Fzb3J0ICAgICAgICAgICBfX2NkZWNsCisjICBlbmRpZgorIyAgaWYgKEFDQ19DQ19HTlVDIHx8IEFDQ19DQ19ISUdIQyB8fCBBQ0NfQ0NfTkRQQyB8fCBBQ0NfQ0NfUEFDSUZJQ0MgfHwgQUNDX0NDX1dBVENPTUMpCisjICBlbGlmIChBQ0NfT1NfT1MyICYmIChBQ0NfQ0NfRE1DIHx8IEFDQ19DQ19TWU1BTlRFQ0MpKQorIyAgICBkZWZpbmUgX19hY2NfY2RlY2xfc2lnaGFuZGxlciAgICAgIF9fcGFzY2FsCisjICBlbGlmIChBQ0NfT1NfT1MyICYmIChBQ0NfQ0NfWk9SVEVDSEMpKQorIyAgICBkZWZpbmUgX19hY2NfY2RlY2xfc2lnaGFuZGxlciAgICAgIF9zdGRjYWxsCisjICBlbGlmIChBQ0NfQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxNDAwKSkgJiYgZGVmaW5lZChfTV9DRUVfUFVSRSkKKyMgICAgZGVmaW5lIF9fYWNjX2NkZWNsX3NpZ2hhbmRsZXIgICAgICBfX2NscmNhbGwKKyMgIGVsaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDYwMCAmJiBfTVNDX1ZFUiA8IDcwMCkpCisjICAgIGlmIGRlZmluZWQoX0RMTCkKKyMgICAgICBkZWZpbmUgX19hY2NfY2RlY2xfc2lnaGFuZGxlciAgICBfZmFyIF9jZGVjbCBfbG9hZGRzCisjICAgIGVsaWYgZGVmaW5lZChfTVQpCisjICAgICAgZGVmaW5lIF9fYWNjX2NkZWNsX3NpZ2hhbmRsZXIgICAgX2ZhciBfY2RlY2wKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBfX2FjY19jZGVjbF9zaWdoYW5kbGVyICAgIF9jZGVjbAorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBkZWZpbmUgX19hY2NfY2RlY2xfc2lnaGFuZGxlciAgICAgIF9fY2RlY2wKKyMgIGVuZGlmCisjZWxpZiAoQUNDX0FSQ0hfSTM4NikgJiYgKEFDQ19DQ19XQVRDT01DKQorIyAgZGVmaW5lIF9fYWNjX2NkZWNsICAgICAgICAgICAgICAgICAgIF9fY2RlY2wKKyNlbGlmIChBQ0NfQVJDSF9NNjhLICYmIEFDQ19PU19UT1MgJiYgKEFDQ19DQ19QVVJFQyB8fCBBQ0NfQ0NfVFVSQk9DKSkKKyMgIGRlZmluZSBfX2FjY19jZGVjbCAgICAgICAgICAgICAgICAgICBjZGVjbAorI2VuZGlmCisjaWYgIWRlZmluZWQoX19hY2NfY2RlY2wpCisjICBkZWZpbmUgX19hY2NfY2RlY2wKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX2NkZWNsX2F0ZXhpdCkKKyMgIGRlZmluZSBfX2FjY19jZGVjbF9hdGV4aXQKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX2NkZWNsX21haW4pCisjICBkZWZpbmUgX19hY2NfY2RlY2xfbWFpbgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19hY2NfY2RlY2xfcXNvcnQpCisjICBkZWZpbmUgX19hY2NfY2RlY2xfcXNvcnQKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX2NkZWNsX3NpZ2hhbmRsZXIpCisjICBkZWZpbmUgX19hY2NfY2RlY2xfc2lnaGFuZGxlcgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19hY2NfY2RlY2xfdmEpCisjICBkZWZpbmUgX19hY2NfY2RlY2xfdmEgICAgICAgICAgICAgICAgX19hY2NfY2RlY2wKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19DRkdfTk9fV0lORE9XU19IKQorI2lmIChBQ0NfT1NfQ1lHV0lOIHx8IChBQ0NfT1NfRU1YICYmIGRlZmluZWQoX19SU1hOVF9fKSkgfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkKKyMgIGlmIChBQ0NfQ0NfV0FUQ09NQyAmJiAoX19XQVRDT01DX18gPCAxMDAwKSkKKyMgIGVsaWYgKEFDQ19PU19XSU4zMiAmJiBBQ0NfQ0NfR05VQykgJiYgZGVmaW5lZChfX1BXMzJfXykKKyMgIGVsaWYgKChBQ0NfT1NfQ1lHV0lOIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKSAmJiAoQUNDX0NDX0dOVUMgJiYgKEFDQ19DQ19HTlVDIDwgMHgwMjVmMDB1bCkpKQorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX0hBVkVfV0lORE9XU19IIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfQVJDSF9BTFBIQSkKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX1VJTlRfSU5ERVggIDEKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX1NIT1JUICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX1VTSE9SVCAgICAgIDEKKyNlbGlmIChBQ0NfQVJDSF9BTUQ2NCkKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX0lOVF9JTkRFWCAgIDEKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX1VJTlRfSU5ERVggIDEKKyMgIGRlZmluZSBBQ0NfT1BUX1VOQUxJR05FRDE2ICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfT1BUX1VOQUxJR05FRDMyICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfT1BUX1VOQUxJR05FRDY0ICAgICAgIDEKKyNlbGlmIChBQ0NfQVJDSF9BUk0gJiYgQUNDX0FSQ0hfQVJNX1RIVU1CKQorI2VsaWYgKEFDQ19BUkNIX0FSTSkKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX1NIT1JUICAgICAgIDEKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX1VTSE9SVCAgICAgIDEKKyNlbGlmIChBQ0NfQVJDSF9DUklTKQorIyAgZGVmaW5lIEFDQ19PUFRfVU5BTElHTkVEMTYgICAgICAgMQorIyAgZGVmaW5lIEFDQ19PUFRfVU5BTElHTkVEMzIgICAgICAgMQorI2VsaWYgKEFDQ19BUkNIX0kzODYpCisjICBkZWZpbmUgQUNDX09QVF9VTkFMSUdORUQxNiAgICAgICAxCisjICBkZWZpbmUgQUNDX09QVF9VTkFMSUdORUQzMiAgICAgICAxCisjZWxpZiAoQUNDX0FSQ0hfSUE2NCkKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX0lOVF9JTkRFWCAgIDEKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX1VJTlRfSU5ERVggIDEKKyMgIGRlZmluZSBBQ0NfT1BUX1BSRUZFUl9QT1NUSU5DICAgIDEKKyNlbGlmIChBQ0NfQVJDSF9NNjhLKQorIyAgZGVmaW5lIEFDQ19PUFRfUFJFRkVSX1BPU1RJTkMgICAgMQorIyAgZGVmaW5lIEFDQ19PUFRfUFJFRkVSX1BSRURFQyAgICAgMQorIyAgaWYgZGVmaW5lZChfX21jNjgwMjBfXykgJiYgIWRlZmluZWQoX19tY29sZGZpcmVfXykKKyMgICAgZGVmaW5lIEFDQ19PUFRfVU5BTElHTkVEMTYgICAgIDEKKyMgICAgZGVmaW5lIEFDQ19PUFRfVU5BTElHTkVEMzIgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAoQUNDX0FSQ0hfTUlQUykKKyMgIGRlZmluZSBBQ0NfT1BUX0FWT0lEX1VJTlRfSU5ERVggIDEKKyNlbGlmIChBQ0NfQVJDSF9QT1dFUlBDKQorIyAgZGVmaW5lIEFDQ19PUFRfUFJFRkVSX1BSRUlOQyAgICAgMQorIyAgZGVmaW5lIEFDQ19PUFRfUFJFRkVSX1BSRURFQyAgICAgMQorIyAgaWYgZGVmaW5lZChBQ0NfQUJJX0JJR19FTkRJQU4pCisjICAgIGRlZmluZSBBQ0NfT1BUX1VOQUxJR05FRDE2ICAgICAxCisjICAgIGRlZmluZSBBQ0NfT1BUX1VOQUxJR05FRDMyICAgICAxCisjICBlbmRpZgorI2VsaWYgKEFDQ19BUkNIX1MzOTApCisjICBkZWZpbmUgQUNDX09QVF9VTkFMSUdORUQxNiAgICAgICAxCisjICBkZWZpbmUgQUNDX09QVF9VTkFMSUdORUQzMiAgICAgICAxCisjICBpZiAoQUNDX1NJWkVPRl9TSVpFX1QgPT0gOCkKKyMgICAgZGVmaW5lIEFDQ19PUFRfVU5BTElHTkVENjQgICAgIDEKKyMgIGVuZGlmCisjZWxpZiAoQUNDX0FSQ0hfU0gpCisjICBkZWZpbmUgQUNDX09QVF9QUkVGRVJfUE9TVElOQyAgICAxCisjICBkZWZpbmUgQUNDX09QVF9QUkVGRVJfUFJFREVDICAgICAxCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfQ0ZHX05PX0lOTElORV9BU00pCisjaWYgZGVmaW5lZChBQ0NfQ0NfTExWTSkKKyMgIGRlZmluZSBBQ0NfQ0ZHX05PX0lOTElORV9BU00gMQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfQ0ZHX05PX1VOQUxJR05FRCkKKyNpZiBkZWZpbmVkKEFDQ19BQklfTkVVVFJBTF9FTkRJQU4pIHx8IGRlZmluZWQoQUNDX0FSQ0hfR0VORVJJQykKKyMgIGRlZmluZSBBQ0NfQ0ZHX05PX1VOQUxJR05FRCAxCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX0NGR19OT19VTkFMSUdORUQpCisjICB1bmRlZiBBQ0NfT1BUX1VOQUxJR05FRDE2CisjICB1bmRlZiBBQ0NfT1BUX1VOQUxJR05FRDMyCisjICB1bmRlZiBBQ0NfT1BUX1VOQUxJR05FRDY0CisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19DRkdfTk9fSU5MSU5FX0FTTSkKKyNlbGlmIChBQ0NfQVJDSF9JMzg2ICYmIChBQ0NfT1NfRE9TMzIgfHwgQUNDX09TX1dJTjMyKSAmJiAoQUNDX0NDX0RNQyB8fCBBQ0NfQ0NfSU5URUxDIHx8IEFDQ19DQ19NU0MgfHwgQUNDX0NDX1BFTExFU0MpKQorIyAgZGVmaW5lIEFDQ19BU01fU1lOVEFYX01TQyAxCisjZWxpZiAoQUNDX09TX1dJTjY0ICYmIChBQ0NfQ0NfRE1DIHx8IEFDQ19DQ19JTlRFTEMgfHwgQUNDX0NDX01TQyB8fCBBQ0NfQ0NfUEVMTEVTQykpCisjZWxpZiAoQUNDX0FSQ0hfSTM4NiAmJiAoQUNDX0NDX0dOVUMgfHwgQUNDX0NDX0lOVEVMQyB8fCBBQ0NfQ0NfUEFUSFNDQUxFKSkKKyMgIGRlZmluZSBBQ0NfQVNNX1NZTlRBWF9HTlVDIDEKKyNlbGlmIChBQ0NfQVJDSF9BTUQ2NCAmJiAoQUNDX0NDX0dOVUMgfHwgQUNDX0NDX0lOVEVMQyB8fCBBQ0NfQ0NfUEFUSFNDQUxFKSkKKyMgIGRlZmluZSBBQ0NfQVNNX1NZTlRBWF9HTlVDIDEKKyNlbmRpZgorI2lmIChBQ0NfQVNNX1NZTlRBWF9HTlVDKQorI2lmIChBQ0NfQVJDSF9JMzg2ICYmIEFDQ19DQ19HTlVDICYmIChBQ0NfQ0NfR05VQyA8IDB4MDIwMDAwdWwpKQorIyAgZGVmaW5lIF9fQUNDX0FTTV9DTE9CQkVSICAgICAgICAgImF4IgorI2VsaWYgKEFDQ19DQ19JTlRFTEMpCisjICBkZWZpbmUgX19BQ0NfQVNNX0NMT0JCRVIgICAgICAgICAibWVtb3J5IgorI2Vsc2UKKyMgIGRlZmluZSBfX0FDQ19BU01fQ0xPQkJFUiAgICAgICAgICJjYyIsICJtZW1vcnkiCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19BQ0NfSU5GT1NUUl9NTSkKKyNlbGlmIChBQ0NfTU1fRkxBVCkgJiYgKGRlZmluZWQoX19BQ0NfSU5GT1NUUl9QTSkgfHwgZGVmaW5lZChBQ0NfSU5GT19BQklfUE0pKQorIyAgZGVmaW5lIF9fQUNDX0lORk9TVFJfTU0gICAgICAgICAgIiIKKyNlbGlmIGRlZmluZWQoQUNDX0lORk9fTU0pCisjICBkZWZpbmUgX19BQ0NfSU5GT1NUUl9NTSAgICAgICAgICAiLiIgQUNDX0lORk9fTU0KKyNlbHNlCisjICBkZWZpbmUgX19BQ0NfSU5GT1NUUl9NTSAgICAgICAgICAiIgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0FDQ19JTkZPU1RSX1BNKQorI2VsaWYgZGVmaW5lZChBQ0NfSU5GT19BQklfUE0pCisjICBkZWZpbmUgX19BQ0NfSU5GT1NUUl9QTSAgICAgICAgICAiLiIgQUNDX0lORk9fQUJJX1BNCisjZWxzZQorIyAgZGVmaW5lIF9fQUNDX0lORk9TVFJfUE0gICAgICAgICAgIiIKKyNlbmRpZgorI2lmIGRlZmluZWQoX19BQ0NfSU5GT1NUUl9FTkRJQU4pCisjZWxpZiBkZWZpbmVkKEFDQ19JTkZPX0FCSV9FTkRJQU4pCisjICBkZWZpbmUgX19BQ0NfSU5GT1NUUl9FTkRJQU4gICAgICAiLiIgQUNDX0lORk9fQUJJX0VORElBTgorI2Vsc2UKKyMgIGRlZmluZSBfX0FDQ19JTkZPU1RSX0VORElBTiAgICAgICIiCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQUNDX0lORk9TVFJfT1NOQU1FKQorI2VsaWYgZGVmaW5lZChBQ0NfSU5GT19PU19DT05TT0xFKQorIyAgZGVmaW5lIF9fQUNDX0lORk9TVFJfT1NOQU1FICAgICAgQUNDX0lORk9fT1MgIi4iIEFDQ19JTkZPX09TX0NPTlNPTEUKKyNlbGlmIGRlZmluZWQoQUNDX0lORk9fT1NfUE9TSVgpCisjICBkZWZpbmUgX19BQ0NfSU5GT1NUUl9PU05BTUUgICAgICBBQ0NfSU5GT19PUyAiLiIgQUNDX0lORk9fT1NfUE9TSVgKKyNlbHNlCisjICBkZWZpbmUgX19BQ0NfSU5GT1NUUl9PU05BTUUgICAgICBBQ0NfSU5GT19PUworI2VuZGlmCisjaWYgZGVmaW5lZChfX0FDQ19JTkZPU1RSX0xJQkMpCisjZWxpZiBkZWZpbmVkKEFDQ19JTkZPX0xJQkMpCisjICBkZWZpbmUgX19BQ0NfSU5GT1NUUl9MSUJDICAgICAgICAiLiIgQUNDX0lORk9fTElCQworI2Vsc2UKKyMgIGRlZmluZSBfX0FDQ19JTkZPU1RSX0xJQkMgICAgICAgICIiCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQUNDX0lORk9TVFJfQ0NWRVIpCisjZWxpZiBkZWZpbmVkKEFDQ19JTkZPX0NDVkVSKQorIyAgZGVmaW5lIF9fQUNDX0lORk9TVFJfQ0NWRVIgICAgICAgIiAiIEFDQ19JTkZPX0NDVkVSCisjZWxzZQorIyAgZGVmaW5lIF9fQUNDX0lORk9TVFJfQ0NWRVIgICAgICAgIiIKKyNlbmRpZgorI2RlZmluZSBBQ0NfSU5GT19TVFJJTkcgXAorICAgIEFDQ19JTkZPX0FSQ0ggX19BQ0NfSU5GT1NUUl9NTSBfX0FDQ19JTkZPU1RSX1BNIF9fQUNDX0lORk9TVFJfRU5ESUFOIFwKKyAgICAiICIgX19BQ0NfSU5GT1NUUl9PU05BTUUgX19BQ0NfSU5GT1NUUl9MSUJDICIgIiBBQ0NfSU5GT19DQyBfX0FDQ19JTkZPU1RSX0NDVkVSCisjaWYgZGVmaW5lZChBQ0NfQ0ZHX05PX0NPTkZJR19IRUFERVIpCisjZWxpZiBkZWZpbmVkKEFDQ19DRkdfQ09ORklHX0hFQURFUikKKyNlbHNlCisjaWYgIWRlZmluZWQoQUNDX0NGR19BVVRPX05PX0hFQURFUlMpCisjaWYgZGVmaW5lZChBQ0NfTElCQ19OQUtFRCkKKyNlbGlmIGRlZmluZWQoQUNDX0xJQkNfRlJFRVNUQU5ESU5HKQorIyAgZGVmaW5lIEhBVkVfTElNSVRTX0ggMQorIyAgZGVmaW5lIEhBVkVfU1REQVJHX0ggMQorIyAgZGVmaW5lIEhBVkVfU1REREVGX0ggMQorI2VsaWYgZGVmaW5lZChBQ0NfTElCQ19NT1NUTFlfRlJFRVNUQU5ESU5HKQorIyAgZGVmaW5lIEhBVkVfTElNSVRTX0ggMQorIyAgZGVmaW5lIEhBVkVfU0VUSk1QX0ggMQorIyAgZGVmaW5lIEhBVkVfU1REQVJHX0ggMQorIyAgZGVmaW5lIEhBVkVfU1REREVGX0ggMQorIyAgZGVmaW5lIEhBVkVfU1RESU9fSCAxCisjICBkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisjZWxzZQorI2RlZmluZSBTVERDX0hFQURFUlMgMQorI2RlZmluZSBIQVZFX0FTU0VSVF9IIDEKKyNkZWZpbmUgSEFWRV9DVFlQRV9IIDEKKyNkZWZpbmUgSEFWRV9ESVJFTlRfSCAxCisjZGVmaW5lIEhBVkVfRVJSTk9fSCAxCisjZGVmaW5lIEhBVkVfRkNOVExfSCAxCisjZGVmaW5lIEhBVkVfRkxPQVRfSCAxCisjZGVmaW5lIEhBVkVfTElNSVRTX0ggMQorI2RlZmluZSBIQVZFX01BTExPQ19IIDEKKyNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisjZGVmaW5lIEhBVkVfU0VUSk1QX0ggMQorI2RlZmluZSBIQVZFX1NJR05BTF9IIDEKKyNkZWZpbmUgSEFWRV9TVERBUkdfSCAxCisjZGVmaW5lIEhBVkVfU1REREVGX0ggMQorI2RlZmluZSBIQVZFX1NURElPX0ggMQorI2RlZmluZSBIQVZFX1NURExJQl9IIDEKKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisjZGVmaW5lIEhBVkVfVElNRV9IIDEKKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisjZGVmaW5lIEhBVkVfVVRJTUVfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorI2lmIChBQ0NfT1NfUE9TSVgpCisjICBpZiAoQUNDX09TX1BPU0lYX0FJWCkKKyMgICAgZGVmaW5lIEhBVkVfU1lTX1JFU09VUkNFX0ggMQorIyAgZWxpZiAoQUNDX09TX1BPU0lYX0ZSRUVCU0QgfHwgQUNDX09TX1BPU0lYX01BQ09TWCB8fCBBQ0NfT1NfUE9TSVhfTkVUQlNEIHx8IEFDQ19PU19QT1NJWF9PUEVOQlNEKQorIyAgICBkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorIyAgICB1bmRlZiBIQVZFX01BTExPQ19ICisjICBlbGlmIChBQ0NfT1NfUE9TSVhfSFBVWCB8fCBBQ0NfT1NfUE9TSVhfSU5URVJJWCkKKyMgICAgZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorIyAgZWxpZiAoQUNDX09TX1BPU0lYX01BQ09TWCAmJiBBQ0NfTElCQ19NU0wpCisjICAgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgICB1bmRlZiBIQVZFX1NZU19UWVBFU19ICisjICBlbGlmIChBQ0NfT1NfUE9TSVhfU09MQVJJUyB8fCBBQ0NfT1NfUE9TSVhfU1VOT1MpCisjICAgIGRlZmluZSBIQVZFX0FMTE9DQV9IIDEKKyMgIGVuZGlmCisjICBpZiAoQUNDX0xJQkNfRElFVExJQkMgfHwgQUNDX0xJQkNfR0xJQkMgfHwgQUNDX0xJQkNfVUNMSUJDKQorIyAgICBkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorIyAgICBkZWZpbmUgSEFWRV9TWVNfTU1BTl9IIDEKKyMgICAgZGVmaW5lIEhBVkVfU1lTX1JFU09VUkNFX0ggMQorIyAgICBkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKKyMgIGVuZGlmCisjICBpZiAoQUNDX0xJQkNfTkVXTElCKQorIyAgICB1bmRlZiBIQVZFX1NUUklOR1NfSAorIyAgZW5kaWYKKyNlbGlmIChBQ0NfT1NfQ1lHV0lOKQorIyAgZGVmaW5lIEhBVkVfSU9fSCAxCisjZWxpZiAoQUNDX09TX0VNWCkKKyMgIGRlZmluZSBIQVZFX0FMTE9DQV9IIDEKKyMgIGRlZmluZSBIQVZFX0lPX0ggMQorI2VsaWYgKEFDQ19BUkNIX002OEsgJiYgQUNDX09TX1RPUyAmJiBBQ0NfQ0NfR05VQykKKyMgIGlmICFkZWZpbmVkKF9fTUlOVF9fKQorIyAgICB1bmRlZiBIQVZFX01BTExPQ19ICisjICBlbmRpZgorI2VsaWYgKEFDQ19BUkNIX002OEsgJiYgQUNDX09TX1RPUyAmJiAoQUNDX0NDX1BVUkVDIHx8IEFDQ19DQ19UVVJCT0MpKQorIyAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgdW5kZWYgSEFWRV9GQ05UTF9ICisjICB1bmRlZiBIQVZFX01BTExPQ19ICisjICB1bmRlZiBIQVZFX01FTU9SWV9ICisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1NUQVRfSAorIyAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjICB1bmRlZiBIQVZFX1NZU19UWVBFU19ICisjZW5kaWYKKyNpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19ET1MzMiB8fCBBQ0NfT1NfT1MyIHx8IEFDQ19PU19PUzIxNiB8fCBBQ0NfT1NfV0lOMTYgfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkKKyNkZWZpbmUgSEFWRV9DT05JT19IIDEKKyNkZWZpbmUgSEFWRV9ESVJFQ1RfSCAxCisjZGVmaW5lIEhBVkVfRE9TX0ggMQorI2RlZmluZSBIQVZFX0lPX0ggMQorI2RlZmluZSBIQVZFX1NIQVJFX0ggMQorI2lmIChBQ0NfQ0NfQVpURUNDKQorIyAgdW5kZWYgSEFWRV9DT05JT19ICisjICB1bmRlZiBIQVZFX0RJUkVDVF9ICisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX01BTExPQ19ICisjICB1bmRlZiBIQVZFX1NIQVJFX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisjICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNlbGlmIChBQ0NfQ0NfQk9STEFOREMpCisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIGlmIChBQ0NfT1NfV0lOMzIgfHwgQUNDX09TX1dJTjY0KQorIyAgICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICBlbmRpZgorIyAgaWYgKF9fQk9STEFORENfXyA8IDB4MDQwMCkKKyMgICAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIGVuZGlmCisjZWxpZiAoQUNDX0NDX0RNQykKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIGRlZmluZSBIQVZFX1NZU19ESVJFTlRfSCAxCisjZWxpZiAoQUNDX09TX0RPUzMyICYmIEFDQ19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fREpHUFBfXykKKyNlbGlmIChBQ0NfT1NfRE9TMzIgJiYgQUNDX0NDX0hJR0hDKQorIyAgZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorIyAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgdW5kZWYgSEFWRV9VTklTVERfSAorI2VsaWYgKEFDQ19DQ19JQk1DICYmIEFDQ19PU19PUzIpCisjICB1bmRlZiBIQVZFX0RPU19ICisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgZGVmaW5lIEhBVkVfU1lTX1VUSU1FX0ggMQorI2VsaWYgKEFDQ19DQ19JTlRFTEMgfHwgQUNDX0NDX01TQykKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjICBkZWZpbmUgSEFWRV9TWVNfVVRJTUVfSCAxCisjZWxpZiAoQUNDX0NDX0xDQ1dJTjMyKQorIyAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgdW5kZWYgSEFWRV9ET1NfSAorIyAgdW5kZWYgSEFWRV9VTklTVERfSAorIyAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjZWxpZiAoQUNDX09TX1dJTjMyICYmIEFDQ19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgdW5kZWYgSEFWRV9VVElNRV9ICisjICBkZWZpbmUgSEFWRV9TWVNfVVRJTUVfSCAxCisjZWxpZiAoQUNDX09TX1dJTjMyICYmIEFDQ19MSUJDX01TTCkKKyMgIGRlZmluZSBIQVZFX0FMTE9DQV9IIDEKKyMgIHVuZGVmIEhBVkVfRE9TX0gKKyMgIHVuZGVmIEhBVkVfU0hBUkVfSAorIyAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjZWxpZiAoQUNDX0NDX05EUEMpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX0RPU19ICisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorI2VsaWYgKEFDQ19DQ19QQUNJRklDQykKKyMgIHVuZGVmIEhBVkVfRElSRUNUX0gKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfRkNOVExfSAorIyAgdW5kZWYgSEFWRV9JT19ICisjICB1bmRlZiBIQVZFX01BTExPQ19ICisjICB1bmRlZiBIQVZFX01FTU9SWV9ICisjICB1bmRlZiBIQVZFX1NIQVJFX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisjICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNlbGlmIChBQ0NfT1NfV0lOMzIgJiYgQUNDX0NDX1BFTExFU0MpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX0RPU19ICisjICB1bmRlZiBIQVZFX01BTExPQ19ICisjICB1bmRlZiBIQVZFX1NIQVJFX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjICBpZiAoX19QT0NDX18gPCAyODApCisjICBlbHNlCisjICAgIGRlZmluZSBIQVZFX1NZU19VVElNRV9IIDEKKyMgIGVuZGlmCisjZWxpZiAoQUNDX09TX1dJTjMyICYmIEFDQ19DQ19QR0kpICYmIGRlZmluZWQoX19NSU5HVzMyX18pCisjICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIGRlZmluZSBIQVZFX1NZU19VVElNRV9IIDEKKyNlbGlmIChBQ0NfT1NfV0lOMzIgJiYgQUNDX0NDX0dOVUMpICYmIGRlZmluZWQoX19QVzMyX18pCisjZWxpZiAoQUNDX0NDX1NZTUFOVEVDQykKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIGlmIChfX1NDX18gPCAweDcwMCkKKyMgICAgdW5kZWYgSEFWRV9VVElNRV9ICisjICAgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgZW5kaWYKKyNlbGlmIChBQ0NfQ0NfVE9QU1BFRURDKQorIyAgdW5kZWYgSEFWRV9ESVJFTlRfSAorIyAgdW5kZWYgSEFWRV9VTklTVERfSAorIyAgdW5kZWYgSEFWRV9VVElNRV9ICisjICB1bmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAorI2VsaWYgKEFDQ19DQ19UVVJCT0MpCisjICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICB1bmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyMgIGlmIChBQ0NfT1NfV0lOMzIgfHwgQUNDX09TX1dJTjY0KQorIyAgICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICBlbmRpZgorIyAgaWYgKF9fVFVSQk9DX18gPCAweDAyMDApCisjICAgIHVuZGVmIEhBVkVfU0lHTkFMX0gKKyMgIGVuZGlmCisjICBpZiAoX19UVVJCT0NfXyA8IDB4MDQwMCkKKyMgICAgdW5kZWYgSEFWRV9ESVJFQ1RfSAorIyAgICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICAgIHVuZGVmIEhBVkVfTUFMTE9DX0gKKyMgICAgdW5kZWYgSEFWRV9NRU1PUllfSAorIyAgICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIGVuZGlmCisjZWxpZiAoQUNDX0NDX1dBVENPTUMpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjICB1bmRlZiBIQVZFX1VUSU1FX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgZGVmaW5lIEhBVkVfU1lTX1VUSU1FX0ggMQorIyAgaWYgKF9fV0FUQ09NQ19fIDwgOTUwKQorIyAgICB1bmRlZiBIQVZFX1VOSVNURF9ICisjICBlbmRpZgorI2VsaWYgKEFDQ19DQ19aT1JURUNIQykKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfTUVNT1JZX0gKKyMgIHVuZGVmIEhBVkVfVU5JU1REX0gKKyMgIHVuZGVmIEhBVkVfVVRJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfVElNRV9ICisjZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfT1NfQ09OU09MRSkKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyNlbmRpZgorI2lmIChBQ0NfT1NfRU1CRURERUQpCisjICB1bmRlZiBIQVZFX0RJUkVOVF9ICisjZW5kaWYKKyNpZiAoQUNDX0xJQkNfSVNPQzkwIHx8IEFDQ19MSUJDX0lTT0M5OSkKKyMgIHVuZGVmIEhBVkVfRElSRU5UX0gKKyMgIHVuZGVmIEhBVkVfRkNOVExfSAorIyAgdW5kZWYgSEFWRV9NQUxMT0NfSAorIyAgdW5kZWYgSEFWRV9VTklTVERfSAorIyAgdW5kZWYgSEFWRV9VVElNRV9ICisjICB1bmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgIHVuZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAorI2VuZGlmCisjaWYgKEFDQ19MSUJDX0dMSUJDID49IDB4MDIwMTAwdWwpCisjICBkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZWxpZiAoQUNDX0xJQkNfRElFVExJQkMpCisjICB1bmRlZiBIQVZFX1NURElOVF9ICisjZWxpZiAoQUNDX0xJQkNfVUNMSUJDKQorIyAgZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorI2VsaWYgKEFDQ19DQ19CT1JMQU5EQykgJiYgKF9fQk9STEFORENfXyA+PSAweDU2MCkKKyMgIHVuZGVmIEhBVkVfU1RESU5UX0gKKyNlbGlmIChBQ0NfQ0NfRE1DKSAmJiAoX19ETUNfXyA+PSAweDgyNSkKKyMgIGRlZmluZSBIQVZFX1NURElOVF9IIDEKKyNlbmRpZgorI2lmIChIQVZFX1NZU19USU1FX0ggJiYgSEFWRV9USU1FX0gpCisjICBkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfQ0ZHX0FVVE9fTk9fRlVOQ1RJT05TKQorI2lmIGRlZmluZWQoQUNDX0xJQkNfTkFLRUQpCisjZWxpZiBkZWZpbmVkKEFDQ19MSUJDX0ZSRUVTVEFORElORykKKyNlbGlmIGRlZmluZWQoQUNDX0xJQkNfTU9TVExZX0ZSRUVTVEFORElORykKKyMgIGRlZmluZSBIQVZFX0xPTkdKTVAgMQorIyAgZGVmaW5lIEhBVkVfTUVNQ01QIDEKKyMgIGRlZmluZSBIQVZFX01FTUNQWSAxCisjICBkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKKyMgIGRlZmluZSBIQVZFX01FTVNFVCAxCisjICBkZWZpbmUgSEFWRV9TRVRKTVAgMQorI2Vsc2UKKyNkZWZpbmUgSEFWRV9BQ0NFU1MgMQorI2RlZmluZSBIQVZFX0FMTE9DQSAxCisjZGVmaW5lIEhBVkVfQVRFWElUIDEKKyNkZWZpbmUgSEFWRV9BVE9JIDEKKyNkZWZpbmUgSEFWRV9BVE9MIDEKKyNkZWZpbmUgSEFWRV9DSE1PRCAxCisjZGVmaW5lIEhBVkVfQ0hPV04gMQorI2RlZmluZSBIQVZFX0NUSU1FIDEKKyNkZWZpbmUgSEFWRV9ESUZGVElNRSAxCisjZGVmaW5lIEhBVkVfRklMRU5PIDEKKyNkZWZpbmUgSEFWRV9GU1RBVCAxCisjZGVmaW5lIEhBVkVfR0VURU5WIDEKKyNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQorI2RlZmluZSBIQVZFX0dNVElNRSAxCisjZGVmaW5lIEhBVkVfSVNBVFRZIDEKKyNkZWZpbmUgSEFWRV9MT0NBTFRJTUUgMQorI2RlZmluZSBIQVZFX0xPTkdKTVAgMQorI2RlZmluZSBIQVZFX0xTVEFUIDEKKyNkZWZpbmUgSEFWRV9NRU1DTVAgMQorI2RlZmluZSBIQVZFX01FTUNQWSAxCisjZGVmaW5lIEhBVkVfTUVNTU9WRSAxCisjZGVmaW5lIEhBVkVfTUVNU0VUIDEKKyNkZWZpbmUgSEFWRV9NS0RJUiAxCisjZGVmaW5lIEhBVkVfTUtUSU1FIDEKKyNkZWZpbmUgSEFWRV9RU09SVCAxCisjZGVmaW5lIEhBVkVfUkFJU0UgMQorI2RlZmluZSBIQVZFX1JNRElSIDEKKyNkZWZpbmUgSEFWRV9TRVRKTVAgMQorI2RlZmluZSBIQVZFX1NJR05BTCAxCisjZGVmaW5lIEhBVkVfU05QUklOVEYgMQorI2RlZmluZSBIQVZFX1NUQVQgMQorI2RlZmluZSBIQVZFX1NUUkNIUiAxCisjZGVmaW5lIEhBVkVfU1RSRFVQIDEKKyNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCisjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQorI2RlZmluZSBIQVZFX1NUUlJDSFIgMQorI2RlZmluZSBIQVZFX1NUUlNUUiAxCisjZGVmaW5lIEhBVkVfVElNRSAxCisjZGVmaW5lIEhBVkVfVU1BU0sgMQorI2RlZmluZSBIQVZFX1VUSU1FIDEKKyNkZWZpbmUgSEFWRV9WU05QUklOVEYgMQorI2lmIChBQ0NfT1NfQkVPUyB8fCBBQ0NfT1NfQ1lHV0lOIHx8IEFDQ19PU19QT1NJWCB8fCBBQ0NfT1NfUU5YIHx8IEFDQ19PU19WTVMpCisjICBkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKKyMgIGRlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKKyNlbGlmIChBQ0NfT1NfV0lOMzIgJiYgQUNDX0NDX0dOVUMpICYmIGRlZmluZWQoX19QVzMyX18pCisjICBkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKKyMgIGRlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKKyNlbHNlCisjICBkZWZpbmUgSEFWRV9TVFJJQ01QIDEKKyMgIGRlZmluZSBIQVZFX1NUUk5JQ01QIDEKKyNlbmRpZgorI2lmIChBQ0NfT1NfUE9TSVgpCisjICBpZiAoQUNDX09TX1BPU0lYX0FJWCkKKyMgICAgZGVmaW5lIEhBVkVfR0VUUlVTQUdFIDEKKyMgIGVsaWYgKEFDQ19PU19QT1NJWF9NQUNPU1ggJiYgQUNDX0xJQkNfTVNMKQorIyAgICB1bmRlZiBIQVZFX0NIT1dOCisjICAgIHVuZGVmIEhBVkVfTFNUQVQKKyMgIGVsaWYgKEFDQ19PU19QT1NJWF9VTklDT1MpCisjICAgIHVuZGVmIEhBVkVfQUxMT0NBCisjICAgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgICAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjICBpZiAoQUNDX0NDX1RJTllDKQorIyAgICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgZW5kaWYKKyMgIGlmIChBQ0NfTElCQ19ESUVUTElCQyB8fCBBQ0NfTElCQ19HTElCQyB8fCBBQ0NfTElCQ19VQ0xJQkMpCisjICAgIGRlZmluZSBIQVZFX0dFVFJVU0FHRSAxCisjICAgIGRlZmluZSBIQVZFX0dFVFBBR0VTSVpFIDEKKyMgICAgZGVmaW5lIEhBVkVfTU1BUCAxCisjICAgIGRlZmluZSBIQVZFX01QUk9URUNUIDEKKyMgICAgZGVmaW5lIEhBVkVfTVVOTUFQIDEKKyMgIGVuZGlmCisjZWxpZiAoQUNDX09TX0NZR1dJTikKKyMgIGlmIChBQ0NfQ0NfR05VQyA8IDB4MDI1YTAwdWwpCisjICAgIHVuZGVmIEhBVkVfR0VUVElNRU9GREFZCisjICAgIHVuZGVmIEhBVkVfTFNUQVQKKyMgIGVuZGlmCisjICBpZiAoQUNDX0NDX0dOVUMgPCAweDAyNWYwMHVsKQorIyAgICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICAgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBlbmRpZgorI2VsaWYgKEFDQ19PU19FTVgpCisjICB1bmRlZiBIQVZFX0NIT1dOCisjICB1bmRlZiBIQVZFX0xTVEFUCisjZWxpZiAoQUNDX0FSQ0hfTTY4SyAmJiBBQ0NfT1NfVE9TICYmIEFDQ19DQ19HTlVDKQorIyAgaWYgIWRlZmluZWQoX19NSU5UX18pCisjICAgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgICAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZWxpZiAoQUNDX0FSQ0hfTTY4SyAmJiBBQ0NfT1NfVE9TICYmIChBQ0NfQ0NfUFVSRUMgfHwgQUNDX0NDX1RVUkJPQykpCisjICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgdW5kZWYgSEFWRV9BQ0NFU1MKKyMgIHVuZGVmIEhBVkVfQ0hNT0QKKyMgIHVuZGVmIEhBVkVfQ0hPV04KKyMgIHVuZGVmIEhBVkVfRlNUQVQKKyMgIHVuZGVmIEhBVkVfR0VUVElNRU9GREFZCisjICB1bmRlZiBIQVZFX0xTVEFUCisjICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICB1bmRlZiBIQVZFX1VNQVNLCisjICB1bmRlZiBIQVZFX1VUSU1FCisjICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorI2VuZGlmCisjaWYgKEFDQ19PU19ET1MxNiB8fCBBQ0NfT1NfRE9TMzIgfHwgQUNDX09TX09TMiB8fCBBQ0NfT1NfT1MyMTYgfHwgQUNDX09TX1dJTjE2IHx8IEFDQ19PU19XSU4zMiB8fCBBQ0NfT1NfV0lONjQpCisjdW5kZWYgSEFWRV9DSE9XTgorI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZCisjdW5kZWYgSEFWRV9MU1RBVAorI3VuZGVmIEhBVkVfVU1BU0sKKyNpZiAoQUNDX0NDX0FaVEVDQykKKyMgIHVuZGVmIEhBVkVfQUxMT0NBCisjICB1bmRlZiBIQVZFX0RJRkZUSU1FCisjICB1bmRlZiBIQVZFX0ZTVEFUCisjICB1bmRlZiBIQVZFX1NUUkRVUAorIyAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgdW5kZWYgSEFWRV9VVElNRQorIyAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyNlbGlmIChBQ0NfQ0NfQk9STEFOREMpCisjICBpZiAoX19CT1JMQU5EQ19fIDwgMHgwNDAwKQorIyAgICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgICB1bmRlZiBIQVZFX1VUSU1FCisjICBlbmRpZgorIyAgaWYgKChfX0JPUkxBTkRDX18gPCAweDA0MTApICYmIEFDQ19PU19XSU4xNikKKyMgICAgdW5kZWYgSEFWRV9BTExPQ0EKKyMgIGVuZGlmCisjICBpZiAoX19CT1JMQU5EQ19fIDwgMHgwNTUwKQorIyAgICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICAgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBlbmRpZgorI2VsaWYgKEFDQ19DQ19ETUMpCisjICBpZiAoQUNDX09TX1dJTjE2KQorIyAgICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgZW5kaWYKKyMgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyMgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2VsaWYgKEFDQ19PU19ET1MzMiAmJiBBQ0NfQ0NfR05VQykgJiYgZGVmaW5lZChfX0RKR1BQX18pCisjICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorI2VsaWYgKEFDQ19PU19ET1MzMiAmJiBBQ0NfQ0NfSElHSEMpCisjICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorI2VsaWYgKEFDQ19DQ19JQk1DKQorIyAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyNlbGlmIChBQ0NfQ0NfSU5URUxDKQorIyAgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorIyAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjZWxpZiAoQUNDX0NDX0xDQ1dJTjMyKQorIyAgZGVmaW5lIHV0aW1lIF91dGltZQorI2VsaWYgKEFDQ19DQ19NU0MpCisjICBpZiAoX01TQ19WRVIgPCA2MDApCisjICAgIHVuZGVmIEhBVkVfU1RSRlRJTUUKKyMgIGVuZGlmCisjICBpZiAoX01TQ19WRVIgPCA3MDApCisjICAgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgICAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyMgIGVsaWYgKF9NU0NfVkVSIDwgMTUwMCkKKyMgICAgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorIyAgICBkZWZpbmUgdnNucHJpbnRmIF92c25wcmludGYKKyMgIGVuZGlmCisjICBpZiAoKF9NU0NfVkVSIDwgODAwKSAmJiBBQ0NfT1NfV0lOMTYpCisjICAgIHVuZGVmIEhBVkVfQUxMT0NBCisjICBlbmRpZgorIyAgaWYgKEFDQ19BUkNIX0kwODYpICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICAgIHVuZGVmIEhBVkVfTE9OR0pNUAorIyAgICB1bmRlZiBIQVZFX1NFVEpNUAorIyAgZW5kaWYKKyNlbGlmIChBQ0NfT1NfV0lOMzIgJiYgQUNDX0NDX0dOVUMpICYmIGRlZmluZWQoX19NSU5HVzMyX18pCisjICBpZiAoQUNDX0NDX0dOVUMgPCAweDAyNWYwMHVsKQorIyAgICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICAgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBlbHNlCisjICAgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyMgICAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjICBlbmRpZgorI2VsaWYgKEFDQ19PU19XSU4zMiAmJiBBQ0NfTElCQ19NU0wpCisjICBpZiAoX19NU0xfXyA8IDB4ODAwMHVsKQorIyAgICB1bmRlZiBIQVZFX0NITU9ECisjICBlbmRpZgorI2VsaWYgKEFDQ19DQ19ORFBDKQorIyAgdW5kZWYgSEFWRV9BTExPQ0EKKyMgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgIHVuZGVmIEhBVkVfU1RSTklDTVAKKyMgIHVuZGVmIEhBVkVfVVRJTUUKKyMgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICB1bmRlZiBIQVZFX1NUQVQKKyMgIGVuZGlmCisjZWxpZiAoQUNDX0NDX1BBQ0lGSUNDKQorIyAgdW5kZWYgSEFWRV9BQ0NFU1MKKyMgIHVuZGVmIEhBVkVfQUxMT0NBCisjICB1bmRlZiBIQVZFX0NITU9ECisjICB1bmRlZiBIQVZFX0RJRkZUSU1FCisjICB1bmRlZiBIQVZFX0ZTVEFUCisjICB1bmRlZiBIQVZFX01LVElNRQorIyAgdW5kZWYgSEFWRV9SQUlTRQorIyAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgdW5kZWYgSEFWRV9TVFJGVElNRQorIyAgdW5kZWYgSEFWRV9VVElNRQorIyAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyNlbGlmIChBQ0NfT1NfV0lOMzIgJiYgQUNDX0NDX1BFTExFU0MpCisjICBpZiAoX19QT0NDX18gPCAyODApCisjICAgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyAgICB1bmRlZiBIQVZFX1VUSU1FCisjICBlbmRpZgorI2VsaWYgKEFDQ19PU19XSU4zMiAmJiBBQ0NfQ0NfUEdJKSAmJiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorIyAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjZWxpZiAoQUNDX09TX1dJTjMyICYmIEFDQ19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fUFczMl9fKQorIyAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyNlbGlmIChBQ0NfQ0NfU1lNQU5URUNDKQorIyAgaWYgKEFDQ19PU19XSU4xNiAmJiAoQUNDX01NX01FRElVTSB8fCBBQ0NfTU1fTEFSR0UgfHwgQUNDX01NX0hVR0UpKQorIyAgICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgZW5kaWYKKyMgIGlmIChfX1NDX18gPCAweDYwMCkKKyMgICAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgZWxzZQorIyAgICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjICAgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorIyAgZW5kaWYKKyMgIGlmIChfX1NDX18gPCAweDcwMCkKKyMgICAgdW5kZWYgSEFWRV9ESUZGVElNRQorIyAgICB1bmRlZiBIQVZFX1VUSU1FCisjICBlbmRpZgorI2VsaWYgKEFDQ19DQ19UT1BTUEVFREMpCisjICB1bmRlZiBIQVZFX1NOUFJJTlRGCisjICB1bmRlZiBIQVZFX1ZTTlBSSU5URgorI2VsaWYgKEFDQ19DQ19UVVJCT0MpCisjICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgdW5kZWYgSEFWRV9TTlBSSU5URgorIyAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyMgIGlmIChfX1RVUkJPQ19fIDwgMHgwMjAwKQorIyAgICB1bmRlZiBIQVZFX1JBSVNFCisjICAgIHVuZGVmIEhBVkVfU0lHTkFMCisjICBlbmRpZgorIyAgaWYgKF9fVFVSQk9DX18gPCAweDAyOTUpCisjICAgIHVuZGVmIEhBVkVfTUtUSU1FCisjICAgIHVuZGVmIEhBVkVfU1RSRlRJTUUKKyMgIGVuZGlmCisjICBpZiAoX19UVVJCT0NfXyA8IDB4MDQwMCkKKyMgICAgdW5kZWYgSEFWRV9VVElNRQorIyAgZW5kaWYKKyNlbGlmIChBQ0NfQ0NfV0FUQ09NQykKKyMgIGlmIChfX1dBVENPTUNfXyA8IDExMDApCisjICAgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgICAgdW5kZWYgSEFWRV9WU05QUklOVEYKKyMgIGVsaWYgKF9fV0FUQ09NQ19fIDwgMTIwMCkKKyMgICAgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorIyAgICBkZWZpbmUgdnNucHJpbnRmIF92c25wcmludGYKKyMgIGVuZGlmCisjZWxpZiAoQUNDX0NDX1pPUlRFQ0hDKQorIyAgaWYgKEFDQ19PU19XSU4xNiAmJiAoQUNDX01NX01FRElVTSB8fCBBQ0NfTU1fTEFSR0UgfHwgQUNDX01NX0hVR0UpKQorIyAgICB1bmRlZiBIQVZFX0FMTE9DQQorIyAgZW5kaWYKKyMgIHVuZGVmIEhBVkVfRElGRlRJTUUKKyMgIHVuZGVmIEhBVkVfU05QUklOVEYKKyMgIHVuZGVmIEhBVkVfVVRJTUUKKyMgIHVuZGVmIEhBVkVfVlNOUFJJTlRGCisjZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfT1NfQ09OU09MRSkKKyMgIHVuZGVmIEhBVkVfQUNDRVNTCisjICB1bmRlZiBIQVZFX0NITU9ECisjICB1bmRlZiBIQVZFX0NIT1dOCisjICB1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorIyAgdW5kZWYgSEFWRV9MU1RBVAorIyAgdW5kZWYgSEFWRV9USU1FCisjICB1bmRlZiBIQVZFX1VNQVNLCisjICB1bmRlZiBIQVZFX1VUSU1FCisjZW5kaWYKKyNpZiAoQUNDX0xJQkNfSVNPQzkwIHx8IEFDQ19MSUJDX0lTT0M5OSkKKyMgIHVuZGVmIEhBVkVfQUNDRVNTCisjICB1bmRlZiBIQVZFX0NITU9ECisjICB1bmRlZiBIQVZFX0NIT1dOCisjICB1bmRlZiBIQVZFX0ZTVEFUCisjICB1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorIyAgdW5kZWYgSEFWRV9MU1RBVAorIyAgdW5kZWYgSEFWRV9TVEFUCisjICB1bmRlZiBIQVZFX1VNQVNLCisjICB1bmRlZiBIQVZFX1VUSU1FCisjIGlmIDEKKyMgIHVuZGVmIEhBVkVfQUxMT0NBCisjICB1bmRlZiBIQVZFX0lTQVRUWQorIyAgdW5kZWYgSEFWRV9NS0RJUgorIyAgdW5kZWYgSEFWRV9STURJUgorIyAgdW5kZWYgSEFWRV9TVFJEVVAKKyMgIHVuZGVmIEhBVkVfU1RSSUNNUAorIyAgdW5kZWYgSEFWRV9TVFJOSUNNUAorIyBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19DRkdfQVVUT19OT19TSVpFUykKKyNpZiAhZGVmaW5lZChTSVpFT0ZfU0hPUlQpICYmIGRlZmluZWQoQUNDX1NJWkVPRl9TSE9SVCkKKyMgIGRlZmluZSBTSVpFT0ZfU0hPUlQgICAgICAgICAgQUNDX1NJWkVPRl9TSE9SVAorI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX0lOVCkgJiYgZGVmaW5lZChBQ0NfU0laRU9GX0lOVCkKKyMgIGRlZmluZSBTSVpFT0ZfSU5UICAgICAgICAgICAgQUNDX1NJWkVPRl9JTlQKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9MT05HKSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBTSVpFT0ZfTE9ORyAgICAgICAgICAgQUNDX1NJWkVPRl9MT05HCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfTE9OR19MT05HKSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfTE9OR19MT05HKQorIyAgZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgICAgICBBQ0NfU0laRU9GX0xPTkdfTE9ORworI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX19fSU5UMzIpICYmIGRlZmluZWQoQUNDX1NJWkVPRl9fX0lOVDMyKQorIyAgZGVmaW5lIFNJWkVPRl9fX0lOVDMyICAgICAgICBBQ0NfU0laRU9GX19fSU5UMzIKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9fX0lOVDY0KSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfX19JTlQ2NCkKKyMgIGRlZmluZSBTSVpFT0ZfX19JTlQ2NCAgICAgICAgQUNDX1NJWkVPRl9fX0lOVDY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfVk9JRF9QKSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIFNJWkVPRl9WT0lEX1AgICAgICAgICBBQ0NfU0laRU9GX1ZPSURfUAorI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX1NJWkVfVCkgJiYgZGVmaW5lZChBQ0NfU0laRU9GX1NJWkVfVCkKKyMgIGRlZmluZSBTSVpFT0ZfU0laRV9UICAgICAgICAgQUNDX1NJWkVPRl9TSVpFX1QKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9QVFJESUZGX1QpICYmIGRlZmluZWQoQUNDX1NJWkVPRl9QVFJESUZGX1QpCisjICBkZWZpbmUgU0laRU9GX1BUUkRJRkZfVCAgICAgIEFDQ19TSVpFT0ZfUFRSRElGRl9UCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TSUdOQUwpICYmICFkZWZpbmVkKFJFVFNJR1RZUEUpCisjICBkZWZpbmUgUkVUU0lHVFlQRSB2b2lkCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX0NGR19OT19BQ0NfVFlQRV9IKQorI2Vsc2UKKyNpZiAoQUNDX1NJWkVPRl9MT05HX0xPTkcrMCA+IDApCitfX2FjY19nbnVjX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBsb25nIGFjY19sbG9uZ190OworX19hY2NfZ251Y19leHRlbnNpb25fXyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBhY2NfdWxsb25nX3Q7CisjZW5kaWYKKyNpZiAoIShBQ0NfU0laRU9GX1NIT1JUKzAgPiAwICYmIEFDQ19TSVpFT0ZfSU5UKzAgPiAwICYmIEFDQ19TSVpFT0ZfTE9ORyswID4gMCkpCisjICBlcnJvciAibWlzc2luZyBkZWZpbmVzIGZvciBzaXplcyIKKyNlbmRpZgorI2lmICghKEFDQ19TSVpFT0ZfUFRSRElGRl9UKzAgPiAwICYmIEFDQ19TSVpFT0ZfU0laRV9UKzAgPiAwICYmIEFDQ19TSVpFT0ZfVk9JRF9QKzAgPiAwKSkKKyMgIGVycm9yICJtaXNzaW5nIGRlZmluZXMgZm9yIHNpemVzIgorI2VuZGlmCisjaWYgIWRlZmluZWQoYWNjX2ludDE2ZV90KQorI2lmIChBQ0NfU0laRU9GX0xPTkcgPT0gMikKKyMgIGRlZmluZSBhY2NfaW50MTZlX3QgICAgICAgICAgbG9uZworIyAgZGVmaW5lIGFjY191aW50MTZlX3QgICAgICAgICB1bnNpZ25lZCBsb25nCisjZWxpZiAoQUNDX1NJWkVPRl9JTlQgPT0gMikKKyMgIGRlZmluZSBhY2NfaW50MTZlX3QgICAgICAgICAgaW50CisjICBkZWZpbmUgYWNjX3VpbnQxNmVfdCAgICAgICAgIHVuc2lnbmVkIGludAorI2VsaWYgKEFDQ19TSVpFT0ZfU0hPUlQgPT0gMikKKyMgIGRlZmluZSBhY2NfaW50MTZlX3QgICAgICAgICAgc2hvcnQgaW50CisjICBkZWZpbmUgYWNjX3VpbnQxNmVfdCAgICAgICAgIHVuc2lnbmVkIHNob3J0IGludAorI2VsaWYgMSAmJiAhZGVmaW5lZChBQ0NfQ0ZHX1RZUEVfTk9fTU9ERV9ISSkgJiYgKEFDQ19DQ19HTlVDID49IDB4MDI1ZjAwdWwgfHwgQUNDX0NDX0xMVk0pCisgICB0eXBlZGVmIGludCBfX2FjY19pbnQxNmVfaGlfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0hJX18pKSk7CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCBfX2FjY191aW50MTZlX2hpX3QgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ISV9fKSkpOworIyAgZGVmaW5lIGFjY19pbnQxNmVfdCAgICAgICAgICBfX2FjY19pbnQxNmVfaGlfdAorIyAgZGVmaW5lIGFjY191aW50MTZlX3QgICAgICAgICBfX2FjY191aW50MTZlX2hpX3QKKyNlbGlmIChBQ0NfU0laRU9GX19fSU5UMTYgPT0gMikKKyMgIGRlZmluZSBhY2NfaW50MTZlX3QgICAgICAgICAgX19pbnQxNgorIyAgZGVmaW5lIGFjY191aW50MTZlX3QgICAgICAgICB1bnNpZ25lZCBfX2ludDE2CisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGFjY19pbnQxNmVfdCkKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlQxNkVfVCAgIDIKKyNlbmRpZgorI2lmICFkZWZpbmVkKGFjY19pbnQzMmVfdCkKKyNpZiAoQUNDX1NJWkVPRl9MT05HID09IDQpCisjICBkZWZpbmUgYWNjX2ludDMyZV90ICAgICAgICAgIGxvbmcgaW50CisjICBkZWZpbmUgYWNjX3VpbnQzMmVfdCAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50CisjZWxpZiAoQUNDX1NJWkVPRl9JTlQgPT0gNCkKKyMgIGRlZmluZSBhY2NfaW50MzJlX3QgICAgICAgICAgaW50CisjICBkZWZpbmUgYWNjX3VpbnQzMmVfdCAgICAgICAgIHVuc2lnbmVkIGludAorI2VsaWYgKEFDQ19TSVpFT0ZfU0hPUlQgPT0gNCkKKyMgIGRlZmluZSBhY2NfaW50MzJlX3QgICAgICAgICAgc2hvcnQgaW50CisjICBkZWZpbmUgYWNjX3VpbnQzMmVfdCAgICAgICAgIHVuc2lnbmVkIHNob3J0IGludAorI2VsaWYgKEFDQ19TSVpFT0ZfTE9OR19MT05HID09IDQpCisjICBkZWZpbmUgYWNjX2ludDMyZV90ICAgICAgICAgIGFjY19sbG9uZ190CisjICBkZWZpbmUgYWNjX3VpbnQzMmVfdCAgICAgICAgIGFjY191bGxvbmdfdAorI2VsaWYgMSAmJiAhZGVmaW5lZChBQ0NfQ0ZHX1RZUEVfTk9fTU9ERV9TSSkgJiYgKEFDQ19DQ19HTlVDID49IDB4MDI1ZjAwdWwgfHwgQUNDX0NDX0xMVk0pICYmIChfX0lOVF9NQVhfXyswID4gMjE0NzQ4MzY0N0wpCisgICB0eXBlZGVmIGludCBfX2FjY19pbnQzMmVfc2lfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCBfX2FjY191aW50MzJlX3NpX3QgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOworIyAgZGVmaW5lIGFjY19pbnQzMmVfdCAgICAgICAgICBfX2FjY19pbnQzMmVfc2lfdAorIyAgZGVmaW5lIGFjY191aW50MzJlX3QgICAgICAgICBfX2FjY191aW50MzJlX3NpX3QKKyNlbGlmIDEgJiYgIWRlZmluZWQoQUNDX0NGR19UWVBFX05PX01PREVfU0kpICYmIChBQ0NfQ0NfR05VQyA+PSAweDAyNWYwMHVsKSAmJiBkZWZpbmVkKF9fQVZSX18pICYmIChfX0xPTkdfTUFYX18rMCA9PSAzMjc2N0wpCisgICB0eXBlZGVmIGludCBfX2FjY19pbnQzMmVfc2lfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCBfX2FjY191aW50MzJlX3NpX3QgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOworIyAgZGVmaW5lIGFjY19pbnQzMmVfdCAgICAgICAgICBfX2FjY19pbnQzMmVfc2lfdAorIyAgZGVmaW5lIGFjY191aW50MzJlX3QgICAgICAgICBfX2FjY191aW50MzJlX3NpX3QKKyMgIGRlZmluZSBBQ0NfSU5UMzJfQyhjKSAgICAgICAgYyMjTEwKKyMgIGRlZmluZSBBQ0NfVUlOVDMyX0MoYykgICAgICAgYyMjVUxMCisjZWxpZiAoQUNDX1NJWkVPRl9fX0lOVDMyID09IDQpCisjICBkZWZpbmUgYWNjX2ludDMyZV90ICAgICAgICAgIF9faW50MzIKKyMgIGRlZmluZSBhY2NfdWludDMyZV90ICAgICAgICAgdW5zaWduZWQgX19pbnQzMgorI2Vsc2UKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChhY2NfaW50MzJlX3QpCisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UMzJFX1QgICA0CisjZW5kaWYKKyNpZiAhZGVmaW5lZChhY2NfaW50NjRlX3QpCisjaWYgKEFDQ19TSVpFT0ZfX19JTlQ2NCA9PSA4KQorIyAgaWYgKEFDQ19DQ19CT1JMQU5EQykgJiYgIWRlZmluZWQoQUNDX0NGR19UWVBFX1BSRUZFUl9fX0lOVDY0KQorIyAgICBkZWZpbmUgQUNDX0NGR19UWVBFX1BSRUZFUl9fX0lOVDY0IDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoQUNDX1NJWkVPRl9JTlQgPT0gOCkgJiYgKEFDQ19TSVpFT0ZfSU5UIDwgQUNDX1NJWkVPRl9MT05HKQorIyAgZGVmaW5lIGFjY19pbnQ2NGVfdCAgICAgICAgICBpbnQKKyMgIGRlZmluZSBhY2NfdWludDY0ZV90ICAgICAgICAgdW5zaWduZWQgaW50CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UNjRFX1QgICBBQ0NfU0laRU9GX0lOVAorI2VsaWYgKEFDQ19TSVpFT0ZfTE9ORyA9PSA4KQorIyAgZGVmaW5lIGFjY19pbnQ2NGVfdCAgICAgICAgICBsb25nIGludAorIyAgZGVmaW5lIGFjY191aW50NjRlX3QgICAgICAgICB1bnNpZ25lZCBsb25nIGludAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVDY0RV9UICAgQUNDX1NJWkVPRl9MT05HCisjZWxpZiAoQUNDX1NJWkVPRl9MT05HX0xPTkcgPT0gOCkgJiYgIWRlZmluZWQoQUNDX0NGR19UWVBFX1BSRUZFUl9fX0lOVDY0KQorIyAgZGVmaW5lIGFjY19pbnQ2NGVfdCAgICAgICAgICBhY2NfbGxvbmdfdAorIyAgZGVmaW5lIGFjY191aW50NjRlX3QgICAgICAgICBhY2NfdWxsb25nX3QKKyMgIGlmIChBQ0NfQ0NfQk9STEFOREMpCisjICAgIGRlZmluZSBBQ0NfSU5UNjRfQyhjKSAgICAgICgoYykgKyAwbGwpCisjICAgIGRlZmluZSBBQ0NfVUlOVDY0X0MoYykgICAgICgoYykgKyAwdWxsKQorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX0lOVDY0X0MoYykgICAgICBjIyNMTAorIyAgICBkZWZpbmUgQUNDX1VJTlQ2NF9DKGMpICAgICBjIyNVTEwKKyMgIGVuZGlmCisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UNjRFX1QgICBBQ0NfU0laRU9GX0xPTkdfTE9ORworI2VsaWYgKEFDQ19TSVpFT0ZfX19JTlQ2NCA9PSA4KQorIyAgZGVmaW5lIGFjY19pbnQ2NGVfdCAgICAgICAgICBfX2ludDY0CisjICBkZWZpbmUgYWNjX3VpbnQ2NGVfdCAgICAgICAgIHVuc2lnbmVkIF9faW50NjQKKyMgIGlmIChBQ0NfQ0NfQk9STEFOREMpCisjICAgIGRlZmluZSBBQ0NfSU5UNjRfQyhjKSAgICAgICgoYykgKyAwaTY0KQorIyAgICBkZWZpbmUgQUNDX1VJTlQ2NF9DKGMpICAgICAoKGMpICsgMHVpNjQpCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfSU5UNjRfQyhjKSAgICAgIGMjI2k2NAorIyAgICBkZWZpbmUgQUNDX1VJTlQ2NF9DKGMpICAgICBjIyN1aTY0CisjICBlbmRpZgorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVDY0RV9UICAgQUNDX1NJWkVPRl9fX0lOVDY0CisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChhY2NfaW50MzJsX3QpCisjaWYgZGVmaW5lZChhY2NfaW50MzJlX3QpCisjICBkZWZpbmUgYWNjX2ludDMybF90ICAgICAgICAgIGFjY19pbnQzMmVfdAorIyAgZGVmaW5lIGFjY191aW50MzJsX3QgICAgICAgICBhY2NfdWludDMyZV90CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UMzJMX1QgICBBQ0NfU0laRU9GX0FDQ19JTlQzMkVfVAorI2VsaWYgKEFDQ19TSVpFT0ZfSU5UID49IDQpICYmIChBQ0NfU0laRU9GX0lOVCA8IEFDQ19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBhY2NfaW50MzJsX3QgICAgICAgICAgaW50CisjICBkZWZpbmUgYWNjX3VpbnQzMmxfdCAgICAgICAgIHVuc2lnbmVkIGludAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVDMyTF9UICAgQUNDX1NJWkVPRl9JTlQKKyNlbGlmIChBQ0NfU0laRU9GX0xPTkcgPj0gNCkKKyMgIGRlZmluZSBhY2NfaW50MzJsX3QgICAgICAgICAgbG9uZyBpbnQKKyMgIGRlZmluZSBhY2NfdWludDMybF90ICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlQzMkxfVCAgIEFDQ19TSVpFT0ZfTE9ORworI2Vsc2UKKyMgIGVycm9yICJhY2NfaW50MzJsX3QiCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyNpZiBkZWZpbmVkKGFjY19pbnQ2NGVfdCkKKyMgIGRlZmluZSBhY2NfaW50NjRsX3QgICAgICAgICAgYWNjX2ludDY0ZV90CisjICBkZWZpbmUgYWNjX3VpbnQ2NGxfdCAgICAgICAgIGFjY191aW50NjRlX3QKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlQ2NExfVCAgIEFDQ19TSVpFT0ZfQUNDX0lOVDY0RV9UCisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChhY2NfaW50MzJmX3QpCisjaWYgKEFDQ19TSVpFT0ZfU0laRV9UID49IDgpCisjICBkZWZpbmUgYWNjX2ludDMyZl90ICAgICAgICAgIGFjY19pbnQ2NGxfdAorIyAgZGVmaW5lIGFjY191aW50MzJmX3QgICAgICAgICBhY2NfdWludDY0bF90CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UMzJGX1QgICBBQ0NfU0laRU9GX0FDQ19JTlQ2NExfVAorI2Vsc2UKKyMgIGRlZmluZSBhY2NfaW50MzJmX3QgICAgICAgICAgYWNjX2ludDMybF90CisjICBkZWZpbmUgYWNjX3VpbnQzMmZfdCAgICAgICAgIGFjY191aW50MzJsX3QKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlQzMkZfVCAgIEFDQ19TSVpFT0ZfQUNDX0lOVDMyTF9UCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKGFjY19pbnRwdHJfdCkKKyNpZiAxICYmIChBQ0NfT1NfT1M0MDAgJiYgKEFDQ19TSVpFT0ZfVk9JRF9QID09IDE2KSkKKyMgIGRlZmluZSBfX0FDQ19JTlRQVFJfVF9JU19QT0lOVEVSIDEKKyAgIHR5cGVkZWYgY2hhciogICAgICAgICAgICAgICAgYWNjX2ludHB0cl90OworICAgdHlwZWRlZiBjaGFyKiAgICAgICAgICAgICAgICBhY2NfdWludHB0cl90OworIyAgZGVmaW5lIGFjY19pbnRwdHJfdCAgICAgICAgICBhY2NfaW50cHRyX3QKKyMgIGRlZmluZSBhY2NfdWludHB0cl90ICAgICAgICAgYWNjX3VpbnRwdHJfdAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVFBUUl9UICAgQUNDX1NJWkVPRl9WT0lEX1AKKyNlbGlmIChBQ0NfQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMzAwKSAmJiAoQUNDX1NJWkVPRl9WT0lEX1AgPT0gNCkgJiYgKEFDQ19TSVpFT0ZfSU5UID09IDQpKQorICAgdHlwZWRlZiBfX3c2NCBpbnQgICAgICAgICAgICBhY2NfaW50cHRyX3Q7CisgICB0eXBlZGVmIF9fdzY0IHVuc2lnbmVkIGludCAgIGFjY191aW50cHRyX3Q7CisjICBkZWZpbmUgYWNjX2ludHB0cl90ICAgICAgICAgIGFjY19pbnRwdHJfdAorIyAgZGVmaW5lIGFjY191aW50cHRyX3QgICAgICAgICBhY2NfdWludHB0cl90CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UUFRSX1QgICBBQ0NfU0laRU9GX0lOVAorI2VsaWYgKEFDQ19TSVpFT0ZfU0hPUlQgPT0gQUNDX1NJWkVPRl9WT0lEX1ApICYmIChBQ0NfU0laRU9GX0lOVCA+IEFDQ19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIGFjY19pbnRwdHJfdCAgICAgICAgICBzaG9ydAorIyAgZGVmaW5lIGFjY191aW50cHRyX3QgICAgICAgICB1bnNpZ25lZCBzaG9ydAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVFBUUl9UICAgQUNDX1NJWkVPRl9TSE9SVAorI2VsaWYgKEFDQ19TSVpFT0ZfSU5UID49IEFDQ19TSVpFT0ZfVk9JRF9QKSAmJiAoQUNDX1NJWkVPRl9JTlQgPCBBQ0NfU0laRU9GX0xPTkcpCisjICBkZWZpbmUgYWNjX2ludHB0cl90ICAgICAgICAgIGludAorIyAgZGVmaW5lIGFjY191aW50cHRyX3QgICAgICAgICB1bnNpZ25lZCBpbnQKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlRQVFJfVCAgIEFDQ19TSVpFT0ZfSU5UCisjZWxpZiAoQUNDX1NJWkVPRl9MT05HID49IEFDQ19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIGFjY19pbnRwdHJfdCAgICAgICAgICBsb25nCisjICBkZWZpbmUgYWNjX3VpbnRwdHJfdCAgICAgICAgIHVuc2lnbmVkIGxvbmcKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlRQVFJfVCAgIEFDQ19TSVpFT0ZfTE9ORworI2VsaWYgKEFDQ19TSVpFT0ZfQUNDX0lOVDY0TF9UID49IEFDQ19TSVpFT0ZfVk9JRF9QKQorIyAgZGVmaW5lIGFjY19pbnRwdHJfdCAgICAgICAgICBhY2NfaW50NjRsX3QKKyMgIGRlZmluZSBhY2NfdWludHB0cl90ICAgICAgICAgYWNjX3VpbnQ2NGxfdAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVFBUUl9UICAgQUNDX1NJWkVPRl9BQ0NfSU5UNjRMX1QKKyNlbHNlCisjICBlcnJvciAiYWNjX2ludHB0cl90IgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChhY2Nfd29yZF90KQorI2lmIGRlZmluZWQoQUNDX1dPUkRTSVpFKSAmJiAoQUNDX1dPUkRTSVpFID4gMCkKKyNpZiAoQUNDX1dPUkRTSVpFID09IEFDQ19TSVpFT0ZfQUNDX0lOVFBUUl9UKSAmJiAhZGVmaW5lZChfX0FDQ19JTlRQVFJfVF9JU19QT0lOVEVSKQorIyAgZGVmaW5lIGFjY193b3JkX3QgICAgICAgICAgICBhY2NfdWludHB0cl90CisjICBkZWZpbmUgYWNjX3N3b3JkX3QgICAgICAgICAgIGFjY19pbnRwdHJfdAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX1dPUkRfVCBBQ0NfU0laRU9GX0FDQ19JTlRQVFJfVAorI2VsaWYgKEFDQ19XT1JEU0laRSA9PSBBQ0NfU0laRU9GX0xPTkcpCisjICBkZWZpbmUgYWNjX3dvcmRfdCAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcKKyMgIGRlZmluZSBhY2Nfc3dvcmRfdCAgICAgICAgICAgbG9uZworIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX1dPUkRfVCBBQ0NfU0laRU9GX0xPTkcKKyNlbGlmIChBQ0NfV09SRFNJWkUgPT0gQUNDX1NJWkVPRl9JTlQpCisjICBkZWZpbmUgYWNjX3dvcmRfdCAgICAgICAgICAgIHVuc2lnbmVkIGludAorIyAgZGVmaW5lIGFjY19zd29yZF90ICAgICAgICAgICBpbnQKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19XT1JEX1QgQUNDX1NJWkVPRl9JTlQKKyNlbGlmIChBQ0NfV09SRFNJWkUgPT0gQUNDX1NJWkVPRl9TSE9SVCkKKyMgIGRlZmluZSBhY2Nfd29yZF90ICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQKKyMgIGRlZmluZSBhY2Nfc3dvcmRfdCAgICAgICAgICAgc2hvcnQKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19XT1JEX1QgQUNDX1NJWkVPRl9TSE9SVAorI2VsaWYgKEFDQ19XT1JEU0laRSA9PSAxKQorIyAgZGVmaW5lIGFjY193b3JkX3QgICAgICAgICAgICB1bnNpZ25lZCBjaGFyCisjICBkZWZpbmUgYWNjX3N3b3JkX3QgICAgICAgICAgIHNpZ25lZCBjaGFyCisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfV09SRF9UIDEKKyNlbGlmIChBQ0NfV09SRFNJWkUgPT0gQUNDX1NJWkVPRl9BQ0NfSU5UNjRMX1QpCisjICBkZWZpbmUgYWNjX3dvcmRfdCAgICAgICAgICAgIGFjY191aW50NjRsX3QKKyMgIGRlZmluZSBhY2Nfc3dvcmRfdCAgICAgICAgICAgYWNjX2ludDY0bF90CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfV09SRF9UIEFDQ19TSVpFT0ZfQUNDX0lOVDY0TF9UCisjZWxpZiAoQUNDX0FSQ0hfU1BVKSAmJiAoQUNDX0NDX0dOVUMpCisjaWYgMAorICAgdHlwZWRlZiB1bnNpZ25lZCBhY2Nfd29yZF90ICBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1YxNlFJX18pKSk7CisgICB0eXBlZGVmIGludCAgICAgIGFjY19zd29yZF90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fVjE2UUlfXykpKTsKKyMgIGRlZmluZSBhY2Nfd29yZF90ICAgICAgICAgICAgYWNjX3dvcmRfdAorIyAgZGVmaW5lIGFjY19zd29yZF90ICAgICAgICAgICBhY2Nfc3dvcmRfdAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX1dPUkRfVCAxNgorI2VuZGlmCisjZWxzZQorIyAgZXJyb3IgImFjY193b3JkX3QiCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX0lOVDE2X0MpCisjICBpZiAoQUNDX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChBQ0NfU0laRU9GX0lOVCA+PSAyKQorIyAgICBkZWZpbmUgQUNDX0lOVDE2X0MoYykgICAgICAoKGMpICsgMCkKKyMgICAgZGVmaW5lIEFDQ19VSU5UMTZfQyhjKSAgICAgKChjKSArIDBVKQorIyAgZWxpZiAoQUNDX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChBQ0NfU0laRU9GX0xPTkcgPj0gMikKKyMgICAgZGVmaW5lIEFDQ19JTlQxNl9DKGMpICAgICAgKChjKSArIDBMKQorIyAgICBkZWZpbmUgQUNDX1VJTlQxNl9DKGMpICAgICAoKGMpICsgMFVMKQorIyAgZWxpZiAoQUNDX1NJWkVPRl9JTlQgPj0gMikKKyMgICAgZGVmaW5lIEFDQ19JTlQxNl9DKGMpICAgICAgYworIyAgICBkZWZpbmUgQUNDX1VJTlQxNl9DKGMpICAgICBjIyNVCisjICBlbGlmIChBQ0NfU0laRU9GX0xPTkcgPj0gMikKKyMgICAgZGVmaW5lIEFDQ19JTlQxNl9DKGMpICAgICAgYyMjTAorIyAgICBkZWZpbmUgQUNDX1VJTlQxNl9DKGMpICAgICBjIyNVTAorIyAgZWxzZQorIyAgICBlcnJvciAiQUNDX0lOVDE2X0MiCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX0lOVDMyX0MpCisjICBpZiAoQUNDX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChBQ0NfU0laRU9GX0lOVCA+PSA0KQorIyAgICBkZWZpbmUgQUNDX0lOVDMyX0MoYykgICAgICAoKGMpICsgMCkKKyMgICAgZGVmaW5lIEFDQ19VSU5UMzJfQyhjKSAgICAgKChjKSArIDBVKQorIyAgZWxpZiAoQUNDX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChBQ0NfU0laRU9GX0xPTkcgPj0gNCkKKyMgICAgZGVmaW5lIEFDQ19JTlQzMl9DKGMpICAgICAgKChjKSArIDBMKQorIyAgICBkZWZpbmUgQUNDX1VJTlQzMl9DKGMpICAgICAoKGMpICsgMFVMKQorIyAgZWxpZiAoQUNDX1NJWkVPRl9JTlQgPj0gNCkKKyMgICAgZGVmaW5lIEFDQ19JTlQzMl9DKGMpICAgICAgYworIyAgICBkZWZpbmUgQUNDX1VJTlQzMl9DKGMpICAgICBjIyNVCisjICBlbGlmIChBQ0NfU0laRU9GX0xPTkcgPj0gNCkKKyMgICAgZGVmaW5lIEFDQ19JTlQzMl9DKGMpICAgICAgYyMjTAorIyAgICBkZWZpbmUgQUNDX1VJTlQzMl9DKGMpICAgICBjIyNVTAorIyAgZWxpZiAoQUNDX1NJWkVPRl9MT05HX0xPTkcgPj0gNCkKKyMgICAgZGVmaW5lIEFDQ19JTlQzMl9DKGMpICAgICAgYyMjTEwKKyMgICAgZGVmaW5lIEFDQ19VSU5UMzJfQyhjKSAgICAgYyMjVUxMCisjICBlbHNlCisjICAgIGVycm9yICJBQ0NfSU5UMzJfQyIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfSU5UNjRfQykgJiYgZGVmaW5lZChhY2NfaW50NjRsX3QpCisjICBpZiAoQUNDX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChBQ0NfU0laRU9GX0lOVCA+PSA4KQorIyAgICBkZWZpbmUgQUNDX0lOVDY0X0MoYykgICAgICAoKGMpICsgMCkKKyMgICAgZGVmaW5lIEFDQ19VSU5UNjRfQyhjKSAgICAgKChjKSArIDBVKQorIyAgZWxpZiAoQUNDX0JST0tFTl9JTlRFR1JBTF9DT05TVEFOVFMpICYmIChBQ0NfU0laRU9GX0xPTkcgPj0gOCkKKyMgICAgZGVmaW5lIEFDQ19JTlQ2NF9DKGMpICAgICAgKChjKSArIDBMKQorIyAgICBkZWZpbmUgQUNDX1VJTlQ2NF9DKGMpICAgICAoKGMpICsgMFVMKQorIyAgZWxpZiAoQUNDX1NJWkVPRl9JTlQgPj0gOCkKKyMgICAgZGVmaW5lIEFDQ19JTlQ2NF9DKGMpICAgICAgYworIyAgICBkZWZpbmUgQUNDX1VJTlQ2NF9DKGMpICAgICBjIyNVCisjICBlbGlmIChBQ0NfU0laRU9GX0xPTkcgPj0gOCkKKyMgICAgZGVmaW5lIEFDQ19JTlQ2NF9DKGMpICAgICAgYyMjTAorIyAgICBkZWZpbmUgQUNDX1VJTlQ2NF9DKGMpICAgICBjIyNVTAorIyAgZWxzZQorIyAgICBlcnJvciAiQUNDX0lOVDY0X0MiCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX0FDQ19JTlQxNkVfVCkgJiYgZGVmaW5lZChBQ0NfU0laRU9GX0FDQ19JTlQxNkVfVCkKKyMgIGRlZmluZSBTSVpFT0ZfQUNDX0lOVDE2RV9UICAgQUNDX1NJWkVPRl9BQ0NfSU5UMTZFX1QKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9BQ0NfSU5UMzJFX1QpICYmIGRlZmluZWQoQUNDX1NJWkVPRl9BQ0NfSU5UMzJFX1QpCisjICBkZWZpbmUgU0laRU9GX0FDQ19JTlQzMkVfVCAgIEFDQ19TSVpFT0ZfQUNDX0lOVDMyRV9UCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfQUNDX0lOVDY0RV9UKSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfQUNDX0lOVDY0RV9UKQorIyAgZGVmaW5lIFNJWkVPRl9BQ0NfSU5UNjRFX1QgICBBQ0NfU0laRU9GX0FDQ19JTlQ2NEVfVAorI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX0FDQ19JTlQzMkxfVCkgJiYgZGVmaW5lZChBQ0NfU0laRU9GX0FDQ19JTlQzMkxfVCkKKyMgIGRlZmluZSBTSVpFT0ZfQUNDX0lOVDMyTF9UICAgQUNDX1NJWkVPRl9BQ0NfSU5UMzJMX1QKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9BQ0NfSU5UNjRMX1QpICYmIGRlZmluZWQoQUNDX1NJWkVPRl9BQ0NfSU5UNjRMX1QpCisjICBkZWZpbmUgU0laRU9GX0FDQ19JTlQ2NExfVCAgIEFDQ19TSVpFT0ZfQUNDX0lOVDY0TF9UCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfQUNDX0lOVDMyRl9UKSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfQUNDX0lOVDMyRl9UKQorIyAgZGVmaW5lIFNJWkVPRl9BQ0NfSU5UMzJGX1QgICBBQ0NfU0laRU9GX0FDQ19JTlQzMkZfVAorI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX0FDQ19JTlRQVFJfVCkgJiYgZGVmaW5lZChBQ0NfU0laRU9GX0FDQ19JTlRQVFJfVCkKKyMgIGRlZmluZSBTSVpFT0ZfQUNDX0lOVFBUUl9UICAgQUNDX1NJWkVPRl9BQ0NfSU5UUFRSX1QKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9BQ0NfV09SRF9UKSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfQUNDX1dPUkRfVCkKKyMgIGRlZmluZSBTSVpFT0ZfQUNDX1dPUkRfVCAgICAgQUNDX1NJWkVPRl9BQ0NfV09SRF9UCisjZW5kaWYKKyNpZiAxICYmICFkZWZpbmVkKGFjY19zaWdub190KSAmJiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfX2RpZXRsaWJjX18pICYmIChBQ0NfU0laRU9GX0lOVCAhPSA0KQorIyAgZGVmaW5lIGFjY19zaWdub190ICAgICAgICAgICBhY2NfaW50MzJlX3QKKyNlbmRpZgorI2lmICFkZWZpbmVkKGFjY19zaWdub190KQorIyAgZGVmaW5lIGFjY19zaWdub190ICAgICAgICAgICBpbnQKKyNlbmRpZgorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorI2lmIChBQ0NfQlJPS0VOX0NERUNMX0FMVF9TWU5UQVgpCit0eXBlZGVmIHZvaWQgX19hY2NfY2RlY2xfc2lnaGFuZGxlciAoKmFjY19zaWdoYW5kbGVyX3QpKGFjY19zaWdub190KTsKKyNlbGlmIGRlZmluZWQoUkVUU0lHVFlQRSkKK3R5cGVkZWYgUkVUU0lHVFlQRSAoX19hY2NfY2RlY2xfc2lnaGFuZGxlciAqYWNjX3NpZ2hhbmRsZXJfdCkoYWNjX3NpZ25vX3QpOworI2Vsc2UKK3R5cGVkZWYgdm9pZCAoX19hY2NfY2RlY2xfc2lnaGFuZGxlciAqYWNjX3NpZ2hhbmRsZXJfdCkoYWNjX3NpZ25vX3QpOworI2VuZGlmCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorIyAgaWYgZGVmaW5lZChBQ0NfQ0ZHX05PX0FDQ19VQV9IKQorIyAgZWxzZQorI2lmIChBQ0NfQ0NfR05VQyAmJiAoQUNDX0NDX0dOVUMgPCAweDAyMDcwMHVsKSkKKyNlbGlmIChBQ0NfQ0NfR05VQyAmJiAoQUNDX0NDX0dOVUMgPCAweDAyMDgwMHVsKSkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChBQ0NfQ0NfSU5URUxDKSAmJiBkZWZpbmVkKF9XSU4zMikKKyNlbGlmIChBQ0NfQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSIDwgNzAwKSkKKyNlbGlmIChBQ0NfQ0NfTExWTSkKKyNlbGlmIChBQ0NfQ0NfR05VQyB8fCBBQ0NfQ0NfSU5URUxDIHx8IEFDQ19DQ19QQVRIU0NBTEUpCisjaWYgIWRlZmluZWQoX19hY2NfdWExNl90KSAmJiAoQUNDX09QVF9VTkFMSUdORUQxNikgJiYgZGVmaW5lZChhY2NfaW50MTZlX3QpCisgICB0eXBlZGVmIHN0cnVjdCB7IF9fYWNjX3VhX3ZvbGF0aWxlIGFjY191aW50MTZlX3QgdiBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7IH0gX19hY2NfdWExNl90OworIyAgZGVmaW5lIF9fYWNjX3VhMTZfdCBfX2FjY191YTE2X3QKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX3VhMzJfdCkgJiYgKEFDQ19PUFRfVU5BTElHTkVEMzIpICYmIGRlZmluZWQoYWNjX2ludDMyZV90KQorICAgdHlwZWRlZiBzdHJ1Y3QgeyBfX2FjY191YV92b2xhdGlsZSBhY2NfdWludDMyZV90IHYgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOyB9IF9fYWNjX3VhMzJfdDsKKyMgIGRlZmluZSBfX2FjY191YTMyX3QgX19hY2NfdWEzMl90CisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2FjY191YTY0X3QpICYmIChBQ0NfT1BUX1VOQUxJR05FRDY0KSAmJiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyAgIHR5cGVkZWYgc3RydWN0IHsgX19hY2NfdWFfdm9sYXRpbGUgYWNjX3VpbnQ2NGxfdCB2IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsgfSBfX2FjY191YTY0X3Q7CisjICBkZWZpbmUgX19hY2NfdWE2NF90IF9fYWNjX3VhNjRfdAorI2VuZGlmCisjZW5kaWYKKyNpZiAoQUNDX09QVF9VTkFMSUdORUQxNikgJiYgZGVmaW5lZChhY2NfaW50MTZlX3QpCisjZGVmaW5lIEFDQ19VQV9HRVQxNihwKSAgICAgICAgICgqIChfX2FjY191YV92b2xhdGlsZSBjb25zdCBhY2NfdWludDE2ZV90KikgKF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IHZvaWQqKSAocCkpCisjZGVmaW5lIEFDQ19VQV9TRVQxNihwLHYpICAgICAgICgqIChfX2FjY191YV92b2xhdGlsZSBhY2NfdWludDE2ZV90KikgKF9fYWNjX3VhX3ZvbGF0aWxlIHZvaWQqKSAocCkgPSAoYWNjX3VpbnQxNmVfdCkgKHYpKQorI2lmIChBQ0NfQUJJX0JJR19FTkRJQU4pCisjICBkZWZpbmUgQUNDX1VBX0dFVF9CRTE2KHApICAgIEFDQ19VQV9HRVQxNihwKQorIyAgZGVmaW5lIEFDQ19VQV9TRVRfQkUxNihwLHYpICBBQ0NfVUFfU0VUMTYocCx2KQorI2VsaWYgKEFDQ19BQklfTElUVExFX0VORElBTikKKyMgIGRlZmluZSBBQ0NfVUFfR0VUX0xFMTYocCkgICAgQUNDX1VBX0dFVDE2KHApCisjICBkZWZpbmUgQUNDX1VBX1NFVF9MRTE2KHAsdikgIEFDQ19VQV9TRVQxNihwLHYpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfQ0ZHX05PX0lOTElORV9BU00pICYmIGRlZmluZWQoX19hY2NfSEFWRV9mb3JjZWlubGluZSkKKyNpZiAoQUNDX0FSQ0hfUE9XRVJQQyAmJiBBQ0NfQUJJX0JJR19FTkRJQU4pICYmIChBQ0NfQ0NfR05VQykKKyNpZiAhZGVmaW5lZChBQ0NfVUFfR0VUX0xFMTYpCitleHRlcm4gX19hY2NfZm9yY2VpbmxpbmUgdW5zaWduZWQgbG9uZyBfX0FDQ19VQV9HRVRfTEUxNihfX2FjY191YV92b2xhdGlsZSBjb25zdCB2b2lkKiBwcCk7CitleHRlcm4gX19hY2NfZm9yY2VpbmxpbmUgdW5zaWduZWQgbG9uZyBfX0FDQ19VQV9HRVRfTEUxNihfX2FjY191YV92b2xhdGlsZSBjb25zdCB2b2lkKiBwcCkgeworICAgIF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IGFjY191aW50MTZlX3QqIHAgPSAoX19hY2NfdWFfdm9sYXRpbGUgY29uc3QgYWNjX3VpbnQxNmVfdCopIHBwOworICAgIHVuc2lnbmVkIGxvbmcgdjsKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGhicnggJTAsMCwlMSIgOiAiPXIiICh2KSA6ICJyIiAocCksICJtIiAoKnApKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgQUNDX1VBX0dFVF9MRTE2KHApICAgICAgX19BQ0NfVUFfR0VUX0xFMTYocCkKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19VQV9TRVRfTEUxNikKK2V4dGVybiBfX2FjY19mb3JjZWlubGluZSB2b2lkIF9fQUNDX1VBX1NFVF9MRTE2KF9fYWNjX3VhX3ZvbGF0aWxlIHZvaWQqIHBwLCB1bnNpZ25lZCBsb25nIHYpOworZXh0ZXJuIF9fYWNjX2ZvcmNlaW5saW5lIHZvaWQgX19BQ0NfVUFfU0VUX0xFMTYoX19hY2NfdWFfdm9sYXRpbGUgdm9pZCogcHAsIHVuc2lnbmVkIGxvbmcgdikgeworICAgIF9fYWNjX3VhX3ZvbGF0aWxlIGFjY191aW50MTZlX3QqIHAgPSAoX19hY2NfdWFfdm9sYXRpbGUgYWNjX3VpbnQxNmVfdCopIHBwOworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJzdGhicnggJTIsMCwlMSIgOiAiPW0iICgqcCkgOiAiciIgKHApLCAiciIgKHYpKTsKK30KKyNkZWZpbmUgQUNDX1VBX1NFVF9MRTE2KHAsdikgICAgX19BQ0NfVUFfU0VUX0xFMTYocCx2KQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19VQV9DT1BZMTYpCisjICBkZWZpbmUgQUNDX1VBX0NPUFkxNihkLHMpICAgIEFDQ19VQV9TRVQxNihkLCBBQ0NfVUFfR0VUMTYocykpCisjZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfT1BUX1VOQUxJR05FRDMyKSAmJiBkZWZpbmVkKGFjY19pbnQzMmVfdCkKKyNkZWZpbmUgQUNDX1VBX0dFVDMyKHApICAgICAgICAgKCogKF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IGFjY191aW50MzJlX3QqKSAoX19hY2NfdWFfdm9sYXRpbGUgY29uc3Qgdm9pZCopIChwKSkKKyNkZWZpbmUgQUNDX1VBX1NFVDMyKHAsdikgICAgICAgKCogKF9fYWNjX3VhX3ZvbGF0aWxlIGFjY191aW50MzJlX3QqKSAoX19hY2NfdWFfdm9sYXRpbGUgdm9pZCopIChwKSA9IChhY2NfdWludDMyZV90KSAodikpCisjaWYgKEFDQ19BQklfQklHX0VORElBTikKKyMgIGRlZmluZSBBQ0NfVUFfR0VUX0JFMzIocCkgICAgQUNDX1VBX0dFVDMyKHApCisjICBkZWZpbmUgQUNDX1VBX1NFVF9CRTMyKHAsdikgIEFDQ19VQV9TRVQzMihwLHYpCisjZWxpZiAoQUNDX0FCSV9MSVRUTEVfRU5ESUFOKQorIyAgZGVmaW5lIEFDQ19VQV9HRVRfTEUzMihwKSAgICBBQ0NfVUFfR0VUMzIocCkKKyMgIGRlZmluZSBBQ0NfVUFfU0VUX0xFMzIocCx2KSAgQUNDX1VBX1NFVDMyKHAsdikKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19DRkdfTk9fSU5MSU5FX0FTTSkgJiYgZGVmaW5lZChfX2FjY19IQVZFX2ZvcmNlaW5saW5lKQorI2lmIChBQ0NfQVJDSF9QT1dFUlBDICYmIEFDQ19BQklfQklHX0VORElBTikgJiYgKEFDQ19DQ19HTlVDKQorI2lmICFkZWZpbmVkKEFDQ19VQV9HRVRfTEUzMikKK2V4dGVybiBfX2FjY19mb3JjZWlubGluZSB1bnNpZ25lZCBsb25nIF9fQUNDX1VBX0dFVF9MRTMyKF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IHZvaWQqIHBwKTsKK2V4dGVybiBfX2FjY19mb3JjZWlubGluZSB1bnNpZ25lZCBsb25nIF9fQUNDX1VBX0dFVF9MRTMyKF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IHZvaWQqIHBwKSB7CisgICAgX19hY2NfdWFfdm9sYXRpbGUgY29uc3QgYWNjX3VpbnQzMmVfdCogcCA9IChfX2FjY191YV92b2xhdGlsZSBjb25zdCBhY2NfdWludDMyZV90KikgcHA7CisgICAgdW5zaWduZWQgbG9uZyB2OworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsd2JyeCAlMCwwLCUxIiA6ICI9ciIgKHYpIDogInIiIChwKSwgIm0iICgqcCkpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSBBQ0NfVUFfR0VUX0xFMzIocCkgICAgICBfX0FDQ19VQV9HRVRfTEUzMihwKQorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX1VBX1NFVF9MRTMyKQorZXh0ZXJuIF9fYWNjX2ZvcmNlaW5saW5lIHZvaWQgX19BQ0NfVUFfU0VUX0xFMzIoX19hY2NfdWFfdm9sYXRpbGUgdm9pZCogcHAsIHVuc2lnbmVkIGxvbmcgdik7CitleHRlcm4gX19hY2NfZm9yY2VpbmxpbmUgdm9pZCBfX0FDQ19VQV9TRVRfTEUzMihfX2FjY191YV92b2xhdGlsZSB2b2lkKiBwcCwgdW5zaWduZWQgbG9uZyB2KSB7CisgICAgX19hY2NfdWFfdm9sYXRpbGUgYWNjX3VpbnQzMmVfdCogcCA9IChfX2FjY191YV92b2xhdGlsZSBhY2NfdWludDMyZV90KikgcHA7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN0d2JyeCAlMiwwLCUxIiA6ICI9bSIgKCpwKSA6ICJyIiAocCksICJyIiAodikpOworfQorI2RlZmluZSBBQ0NfVUFfU0VUX0xFMzIocCx2KSAgICBfX0FDQ19VQV9TRVRfTEUzMihwLHYpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX1VBX0NPUFkzMikKKyMgIGRlZmluZSBBQ0NfVUFfQ09QWTMyKGQscykgICAgQUNDX1VBX1NFVDMyKGQsIEFDQ19VQV9HRVQzMihzKSkKKyNlbmRpZgorI2VuZGlmCisjaWYgKEFDQ19PUFRfVU5BTElHTkVENjQpICYmIGRlZmluZWQoYWNjX2ludDY0bF90KQorI2RlZmluZSBBQ0NfVUFfR0VUNjQocCkgICAgICAgICAoKiAoX19hY2NfdWFfdm9sYXRpbGUgY29uc3QgYWNjX3VpbnQ2NGxfdCopIChfX2FjY191YV92b2xhdGlsZSBjb25zdCB2b2lkKikgKHApKQorI2RlZmluZSBBQ0NfVUFfU0VUNjQocCx2KSAgICAgICAoKiAoX19hY2NfdWFfdm9sYXRpbGUgYWNjX3VpbnQ2NGxfdCopIChfX2FjY191YV92b2xhdGlsZSB2b2lkKikgKHApID0gKGFjY191aW50NjRsX3QpICh2KSkKKyNpZiAoQUNDX0FCSV9CSUdfRU5ESUFOKQorIyAgZGVmaW5lIEFDQ19VQV9HRVRfQkU2NChwKSAgICBBQ0NfVUFfR0VUNjQocCkKKyMgIGRlZmluZSBBQ0NfVUFfU0VUX0JFNjQocCx2KSAgQUNDX1VBX1NFVDY0KHAsdikKKyNlbGlmIChBQ0NfQUJJX0xJVFRMRV9FTkRJQU4pCisjICBkZWZpbmUgQUNDX1VBX0dFVF9MRTY0KHApICAgIEFDQ19VQV9HRVQ2NChwKQorIyAgZGVmaW5lIEFDQ19VQV9TRVRfTEU2NChwLHYpICBBQ0NfVUFfU0VUNjQocCx2KQorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX1VBX0NPUFk2NCkKKyMgIGRlZmluZSBBQ0NfVUFfQ09QWTY0KGQscykgICAgQUNDX1VBX1NFVDY0KGQsIEFDQ19VQV9HRVQ2NChzKSkKKyNlbmRpZgorI2VuZGlmCisjICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19XQU5UX0FDQ19UWVBFX0gpCisjICB1bmRlZiBBQ0NfV0FOVF9BQ0NfVFlQRV9ICisjICBpZiBkZWZpbmVkKEFDQ19DRkdfTk9fQUNDX1RZUEVfSCkKKyMgICAgZXJyb3IgIkFDQ19XQU5UX0FDQ19UWVBFX0ggd2l0aCBBQ0NfQ0ZHX05PX0FDQ19UWVBFX0giCisjICBlbmRpZgorI2lmIChBQ0NfU0laRU9GX0xPTkdfTE9ORyswID4gMCkKK19fYWNjX2dudWNfZXh0ZW5zaW9uX18gdHlwZWRlZiBsb25nIGxvbmcgYWNjX2xsb25nX3Q7CitfX2FjY19nbnVjX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGFjY191bGxvbmdfdDsKKyNlbmRpZgorI2lmICghKEFDQ19TSVpFT0ZfU0hPUlQrMCA+IDAgJiYgQUNDX1NJWkVPRl9JTlQrMCA+IDAgJiYgQUNDX1NJWkVPRl9MT05HKzAgPiAwKSkKKyMgIGVycm9yICJtaXNzaW5nIGRlZmluZXMgZm9yIHNpemVzIgorI2VuZGlmCisjaWYgKCEoQUNDX1NJWkVPRl9QVFJESUZGX1QrMCA+IDAgJiYgQUNDX1NJWkVPRl9TSVpFX1QrMCA+IDAgJiYgQUNDX1NJWkVPRl9WT0lEX1ArMCA+IDApKQorIyAgZXJyb3IgIm1pc3NpbmcgZGVmaW5lcyBmb3Igc2l6ZXMiCisjZW5kaWYKKyNpZiAhZGVmaW5lZChhY2NfaW50MTZlX3QpCisjaWYgKEFDQ19TSVpFT0ZfTE9ORyA9PSAyKQorIyAgZGVmaW5lIGFjY19pbnQxNmVfdCAgICAgICAgICBsb25nCisjICBkZWZpbmUgYWNjX3VpbnQxNmVfdCAgICAgICAgIHVuc2lnbmVkIGxvbmcKKyNlbGlmIChBQ0NfU0laRU9GX0lOVCA9PSAyKQorIyAgZGVmaW5lIGFjY19pbnQxNmVfdCAgICAgICAgICBpbnQKKyMgIGRlZmluZSBhY2NfdWludDE2ZV90ICAgICAgICAgdW5zaWduZWQgaW50CisjZWxpZiAoQUNDX1NJWkVPRl9TSE9SVCA9PSAyKQorIyAgZGVmaW5lIGFjY19pbnQxNmVfdCAgICAgICAgICBzaG9ydCBpbnQKKyMgIGRlZmluZSBhY2NfdWludDE2ZV90ICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CisjZWxpZiAxICYmICFkZWZpbmVkKEFDQ19DRkdfVFlQRV9OT19NT0RFX0hJKSAmJiAoQUNDX0NDX0dOVUMgPj0gMHgwMjVmMDB1bCB8fCBBQ0NfQ0NfTExWTSkKKyAgIHR5cGVkZWYgaW50IF9fYWNjX2ludDE2ZV9oaV90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fSElfXykpKTsKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9fYWNjX3VpbnQxNmVfaGlfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0hJX18pKSk7CisjICBkZWZpbmUgYWNjX2ludDE2ZV90ICAgICAgICAgIF9fYWNjX2ludDE2ZV9oaV90CisjICBkZWZpbmUgYWNjX3VpbnQxNmVfdCAgICAgICAgIF9fYWNjX3VpbnQxNmVfaGlfdAorI2VsaWYgKEFDQ19TSVpFT0ZfX19JTlQxNiA9PSAyKQorIyAgZGVmaW5lIGFjY19pbnQxNmVfdCAgICAgICAgICBfX2ludDE2CisjICBkZWZpbmUgYWNjX3VpbnQxNmVfdCAgICAgICAgIHVuc2lnbmVkIF9faW50MTYKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoYWNjX2ludDE2ZV90KQorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVDE2RV9UICAgMgorI2VuZGlmCisjaWYgIWRlZmluZWQoYWNjX2ludDMyZV90KQorI2lmIChBQ0NfU0laRU9GX0xPTkcgPT0gNCkKKyMgIGRlZmluZSBhY2NfaW50MzJlX3QgICAgICAgICAgbG9uZyBpbnQKKyMgIGRlZmluZSBhY2NfdWludDMyZV90ICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQKKyNlbGlmIChBQ0NfU0laRU9GX0lOVCA9PSA0KQorIyAgZGVmaW5lIGFjY19pbnQzMmVfdCAgICAgICAgICBpbnQKKyMgIGRlZmluZSBhY2NfdWludDMyZV90ICAgICAgICAgdW5zaWduZWQgaW50CisjZWxpZiAoQUNDX1NJWkVPRl9TSE9SVCA9PSA0KQorIyAgZGVmaW5lIGFjY19pbnQzMmVfdCAgICAgICAgICBzaG9ydCBpbnQKKyMgIGRlZmluZSBhY2NfdWludDMyZV90ICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CisjZWxpZiAoQUNDX1NJWkVPRl9MT05HX0xPTkcgPT0gNCkKKyMgIGRlZmluZSBhY2NfaW50MzJlX3QgICAgICAgICAgYWNjX2xsb25nX3QKKyMgIGRlZmluZSBhY2NfdWludDMyZV90ICAgICAgICAgYWNjX3VsbG9uZ190CisjZWxpZiAxICYmICFkZWZpbmVkKEFDQ19DRkdfVFlQRV9OT19NT0RFX1NJKSAmJiAoQUNDX0NDX0dOVUMgPj0gMHgwMjVmMDB1bCB8fCBBQ0NfQ0NfTExWTSkgJiYgKF9fSU5UX01BWF9fKzAgPiAyMTQ3NDgzNjQ3TCkKKyAgIHR5cGVkZWYgaW50IF9fYWNjX2ludDMyZV9zaV90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9fYWNjX3VpbnQzMmVfc2lfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisjICBkZWZpbmUgYWNjX2ludDMyZV90ICAgICAgICAgIF9fYWNjX2ludDMyZV9zaV90CisjICBkZWZpbmUgYWNjX3VpbnQzMmVfdCAgICAgICAgIF9fYWNjX3VpbnQzMmVfc2lfdAorI2VsaWYgMSAmJiAhZGVmaW5lZChBQ0NfQ0ZHX1RZUEVfTk9fTU9ERV9TSSkgJiYgKEFDQ19DQ19HTlVDID49IDB4MDI1ZjAwdWwpICYmIGRlZmluZWQoX19BVlJfXykgJiYgKF9fTE9OR19NQVhfXyswID09IDMyNzY3TCkKKyAgIHR5cGVkZWYgaW50IF9fYWNjX2ludDMyZV9zaV90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9fYWNjX3VpbnQzMmVfc2lfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisjICBkZWZpbmUgYWNjX2ludDMyZV90ICAgICAgICAgIF9fYWNjX2ludDMyZV9zaV90CisjICBkZWZpbmUgYWNjX3VpbnQzMmVfdCAgICAgICAgIF9fYWNjX3VpbnQzMmVfc2lfdAorIyAgZGVmaW5lIEFDQ19JTlQzMl9DKGMpICAgICAgICBjIyNMTAorIyAgZGVmaW5lIEFDQ19VSU5UMzJfQyhjKSAgICAgICBjIyNVTEwKKyNlbGlmIChBQ0NfU0laRU9GX19fSU5UMzIgPT0gNCkKKyMgIGRlZmluZSBhY2NfaW50MzJlX3QgICAgICAgICAgX19pbnQzMgorIyAgZGVmaW5lIGFjY191aW50MzJlX3QgICAgICAgICB1bnNpZ25lZCBfX2ludDMyCisjZWxzZQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGFjY19pbnQzMmVfdCkKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlQzMkVfVCAgIDQKKyNlbmRpZgorI2lmICFkZWZpbmVkKGFjY19pbnQ2NGVfdCkKKyNpZiAoQUNDX1NJWkVPRl9fX0lOVDY0ID09IDgpCisjICBpZiAoQUNDX0NDX0JPUkxBTkRDKSAmJiAhZGVmaW5lZChBQ0NfQ0ZHX1RZUEVfUFJFRkVSX19fSU5UNjQpCisjICAgIGRlZmluZSBBQ0NfQ0ZHX1RZUEVfUFJFRkVSX19fSU5UNjQgMQorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfU0laRU9GX0lOVCA9PSA4KSAmJiAoQUNDX1NJWkVPRl9JTlQgPCBBQ0NfU0laRU9GX0xPTkcpCisjICBkZWZpbmUgYWNjX2ludDY0ZV90ICAgICAgICAgIGludAorIyAgZGVmaW5lIGFjY191aW50NjRlX3QgICAgICAgICB1bnNpZ25lZCBpbnQKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlQ2NEVfVCAgIEFDQ19TSVpFT0ZfSU5UCisjZWxpZiAoQUNDX1NJWkVPRl9MT05HID09IDgpCisjICBkZWZpbmUgYWNjX2ludDY0ZV90ICAgICAgICAgIGxvbmcgaW50CisjICBkZWZpbmUgYWNjX3VpbnQ2NGVfdCAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UNjRFX1QgICBBQ0NfU0laRU9GX0xPTkcKKyNlbGlmIChBQ0NfU0laRU9GX0xPTkdfTE9ORyA9PSA4KSAmJiAhZGVmaW5lZChBQ0NfQ0ZHX1RZUEVfUFJFRkVSX19fSU5UNjQpCisjICBkZWZpbmUgYWNjX2ludDY0ZV90ICAgICAgICAgIGFjY19sbG9uZ190CisjICBkZWZpbmUgYWNjX3VpbnQ2NGVfdCAgICAgICAgIGFjY191bGxvbmdfdAorIyAgaWYgKEFDQ19DQ19CT1JMQU5EQykKKyMgICAgZGVmaW5lIEFDQ19JTlQ2NF9DKGMpICAgICAgKChjKSArIDBsbCkKKyMgICAgZGVmaW5lIEFDQ19VSU5UNjRfQyhjKSAgICAgKChjKSArIDB1bGwpCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfSU5UNjRfQyhjKSAgICAgIGMjI0xMCisjICAgIGRlZmluZSBBQ0NfVUlOVDY0X0MoYykgICAgIGMjI1VMTAorIyAgZW5kaWYKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlQ2NEVfVCAgIEFDQ19TSVpFT0ZfTE9OR19MT05HCisjZWxpZiAoQUNDX1NJWkVPRl9fX0lOVDY0ID09IDgpCisjICBkZWZpbmUgYWNjX2ludDY0ZV90ICAgICAgICAgIF9faW50NjQKKyMgIGRlZmluZSBhY2NfdWludDY0ZV90ICAgICAgICAgdW5zaWduZWQgX19pbnQ2NAorIyAgaWYgKEFDQ19DQ19CT1JMQU5EQykKKyMgICAgZGVmaW5lIEFDQ19JTlQ2NF9DKGMpICAgICAgKChjKSArIDBpNjQpCisjICAgIGRlZmluZSBBQ0NfVUlOVDY0X0MoYykgICAgICgoYykgKyAwdWk2NCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ19JTlQ2NF9DKGMpICAgICAgYyMjaTY0CisjICAgIGRlZmluZSBBQ0NfVUlOVDY0X0MoYykgICAgIGMjI3VpNjQKKyMgIGVuZGlmCisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UNjRFX1QgICBBQ0NfU0laRU9GX19fSU5UNjQKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKGFjY19pbnQzMmxfdCkKKyNpZiBkZWZpbmVkKGFjY19pbnQzMmVfdCkKKyMgIGRlZmluZSBhY2NfaW50MzJsX3QgICAgICAgICAgYWNjX2ludDMyZV90CisjICBkZWZpbmUgYWNjX3VpbnQzMmxfdCAgICAgICAgIGFjY191aW50MzJlX3QKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlQzMkxfVCAgIEFDQ19TSVpFT0ZfQUNDX0lOVDMyRV9UCisjZWxpZiAoQUNDX1NJWkVPRl9JTlQgPj0gNCkgJiYgKEFDQ19TSVpFT0ZfSU5UIDwgQUNDX1NJWkVPRl9MT05HKQorIyAgZGVmaW5lIGFjY19pbnQzMmxfdCAgICAgICAgICBpbnQKKyMgIGRlZmluZSBhY2NfdWludDMybF90ICAgICAgICAgdW5zaWduZWQgaW50CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UMzJMX1QgICBBQ0NfU0laRU9GX0lOVAorI2VsaWYgKEFDQ19TSVpFT0ZfTE9ORyA+PSA0KQorIyAgZGVmaW5lIGFjY19pbnQzMmxfdCAgICAgICAgICBsb25nIGludAorIyAgZGVmaW5lIGFjY191aW50MzJsX3QgICAgICAgICB1bnNpZ25lZCBsb25nIGludAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVDMyTF9UICAgQUNDX1NJWkVPRl9MT05HCisjZWxzZQorIyAgZXJyb3IgImFjY19pbnQzMmxfdCIKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoYWNjX2ludDY0bF90KQorI2lmIGRlZmluZWQoYWNjX2ludDY0ZV90KQorIyAgZGVmaW5lIGFjY19pbnQ2NGxfdCAgICAgICAgICBhY2NfaW50NjRlX3QKKyMgIGRlZmluZSBhY2NfdWludDY0bF90ICAgICAgICAgYWNjX3VpbnQ2NGVfdAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVDY0TF9UICAgQUNDX1NJWkVPRl9BQ0NfSU5UNjRFX1QKKyNlbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKGFjY19pbnQzMmZfdCkKKyNpZiAoQUNDX1NJWkVPRl9TSVpFX1QgPj0gOCkKKyMgIGRlZmluZSBhY2NfaW50MzJmX3QgICAgICAgICAgYWNjX2ludDY0bF90CisjICBkZWZpbmUgYWNjX3VpbnQzMmZfdCAgICAgICAgIGFjY191aW50NjRsX3QKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlQzMkZfVCAgIEFDQ19TSVpFT0ZfQUNDX0lOVDY0TF9UCisjZWxzZQorIyAgZGVmaW5lIGFjY19pbnQzMmZfdCAgICAgICAgICBhY2NfaW50MzJsX3QKKyMgIGRlZmluZSBhY2NfdWludDMyZl90ICAgICAgICAgYWNjX3VpbnQzMmxfdAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVDMyRl9UICAgQUNDX1NJWkVPRl9BQ0NfSU5UMzJMX1QKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoYWNjX2ludHB0cl90KQorI2lmIDEgJiYgKEFDQ19PU19PUzQwMCAmJiAoQUNDX1NJWkVPRl9WT0lEX1AgPT0gMTYpKQorIyAgZGVmaW5lIF9fQUNDX0lOVFBUUl9UX0lTX1BPSU5URVIgMQorICAgdHlwZWRlZiBjaGFyKiAgICAgICAgICAgICAgICBhY2NfaW50cHRyX3Q7CisgICB0eXBlZGVmIGNoYXIqICAgICAgICAgICAgICAgIGFjY191aW50cHRyX3Q7CisjICBkZWZpbmUgYWNjX2ludHB0cl90ICAgICAgICAgIGFjY19pbnRwdHJfdAorIyAgZGVmaW5lIGFjY191aW50cHRyX3QgICAgICAgICBhY2NfdWludHB0cl90CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UUFRSX1QgICBBQ0NfU0laRU9GX1ZPSURfUAorI2VsaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEzMDApICYmIChBQ0NfU0laRU9GX1ZPSURfUCA9PSA0KSAmJiAoQUNDX1NJWkVPRl9JTlQgPT0gNCkpCisgICB0eXBlZGVmIF9fdzY0IGludCAgICAgICAgICAgIGFjY19pbnRwdHJfdDsKKyAgIHR5cGVkZWYgX193NjQgdW5zaWduZWQgaW50ICAgYWNjX3VpbnRwdHJfdDsKKyMgIGRlZmluZSBhY2NfaW50cHRyX3QgICAgICAgICAgYWNjX2ludHB0cl90CisjICBkZWZpbmUgYWNjX3VpbnRwdHJfdCAgICAgICAgIGFjY191aW50cHRyX3QKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19JTlRQVFJfVCAgIEFDQ19TSVpFT0ZfSU5UCisjZWxpZiAoQUNDX1NJWkVPRl9TSE9SVCA9PSBBQ0NfU0laRU9GX1ZPSURfUCkgJiYgKEFDQ19TSVpFT0ZfSU5UID4gQUNDX1NJWkVPRl9WT0lEX1ApCisjICBkZWZpbmUgYWNjX2ludHB0cl90ICAgICAgICAgIHNob3J0CisjICBkZWZpbmUgYWNjX3VpbnRwdHJfdCAgICAgICAgIHVuc2lnbmVkIHNob3J0CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UUFRSX1QgICBBQ0NfU0laRU9GX1NIT1JUCisjZWxpZiAoQUNDX1NJWkVPRl9JTlQgPj0gQUNDX1NJWkVPRl9WT0lEX1ApICYmIChBQ0NfU0laRU9GX0lOVCA8IEFDQ19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBhY2NfaW50cHRyX3QgICAgICAgICAgaW50CisjICBkZWZpbmUgYWNjX3VpbnRwdHJfdCAgICAgICAgIHVuc2lnbmVkIGludAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVFBUUl9UICAgQUNDX1NJWkVPRl9JTlQKKyNlbGlmIChBQ0NfU0laRU9GX0xPTkcgPj0gQUNDX1NJWkVPRl9WT0lEX1ApCisjICBkZWZpbmUgYWNjX2ludHB0cl90ICAgICAgICAgIGxvbmcKKyMgIGRlZmluZSBhY2NfdWludHB0cl90ICAgICAgICAgdW5zaWduZWQgbG9uZworIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX0lOVFBUUl9UICAgQUNDX1NJWkVPRl9MT05HCisjZWxpZiAoQUNDX1NJWkVPRl9BQ0NfSU5UNjRMX1QgPj0gQUNDX1NJWkVPRl9WT0lEX1ApCisjICBkZWZpbmUgYWNjX2ludHB0cl90ICAgICAgICAgIGFjY19pbnQ2NGxfdAorIyAgZGVmaW5lIGFjY191aW50cHRyX3QgICAgICAgICBhY2NfdWludDY0bF90CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfSU5UUFRSX1QgICBBQ0NfU0laRU9GX0FDQ19JTlQ2NExfVAorI2Vsc2UKKyMgIGVycm9yICJhY2NfaW50cHRyX3QiCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKGFjY193b3JkX3QpCisjaWYgZGVmaW5lZChBQ0NfV09SRFNJWkUpICYmIChBQ0NfV09SRFNJWkUgPiAwKQorI2lmIChBQ0NfV09SRFNJWkUgPT0gQUNDX1NJWkVPRl9BQ0NfSU5UUFRSX1QpICYmICFkZWZpbmVkKF9fQUNDX0lOVFBUUl9UX0lTX1BPSU5URVIpCisjICBkZWZpbmUgYWNjX3dvcmRfdCAgICAgICAgICAgIGFjY191aW50cHRyX3QKKyMgIGRlZmluZSBhY2Nfc3dvcmRfdCAgICAgICAgICAgYWNjX2ludHB0cl90CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfV09SRF9UIEFDQ19TSVpFT0ZfQUNDX0lOVFBUUl9UCisjZWxpZiAoQUNDX1dPUkRTSVpFID09IEFDQ19TSVpFT0ZfTE9ORykKKyMgIGRlZmluZSBhY2Nfd29yZF90ICAgICAgICAgICAgdW5zaWduZWQgbG9uZworIyAgZGVmaW5lIGFjY19zd29yZF90ICAgICAgICAgICBsb25nCisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfV09SRF9UIEFDQ19TSVpFT0ZfTE9ORworI2VsaWYgKEFDQ19XT1JEU0laRSA9PSBBQ0NfU0laRU9GX0lOVCkKKyMgIGRlZmluZSBhY2Nfd29yZF90ICAgICAgICAgICAgdW5zaWduZWQgaW50CisjICBkZWZpbmUgYWNjX3N3b3JkX3QgICAgICAgICAgIGludAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX1dPUkRfVCBBQ0NfU0laRU9GX0lOVAorI2VsaWYgKEFDQ19XT1JEU0laRSA9PSBBQ0NfU0laRU9GX1NIT1JUKQorIyAgZGVmaW5lIGFjY193b3JkX3QgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydAorIyAgZGVmaW5lIGFjY19zd29yZF90ICAgICAgICAgICBzaG9ydAorIyAgZGVmaW5lIEFDQ19TSVpFT0ZfQUNDX1dPUkRfVCBBQ0NfU0laRU9GX1NIT1JUCisjZWxpZiAoQUNDX1dPUkRTSVpFID09IDEpCisjICBkZWZpbmUgYWNjX3dvcmRfdCAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIKKyMgIGRlZmluZSBhY2Nfc3dvcmRfdCAgICAgICAgICAgc2lnbmVkIGNoYXIKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19XT1JEX1QgMQorI2VsaWYgKEFDQ19XT1JEU0laRSA9PSBBQ0NfU0laRU9GX0FDQ19JTlQ2NExfVCkKKyMgIGRlZmluZSBhY2Nfd29yZF90ICAgICAgICAgICAgYWNjX3VpbnQ2NGxfdAorIyAgZGVmaW5lIGFjY19zd29yZF90ICAgICAgICAgICBhY2NfaW50NjRsX3QKKyMgIGRlZmluZSBBQ0NfU0laRU9GX0FDQ19XT1JEX1QgQUNDX1NJWkVPRl9BQ0NfSU5UNjRMX1QKKyNlbGlmIChBQ0NfQVJDSF9TUFUpICYmIChBQ0NfQ0NfR05VQykKKyNpZiAwCisgICB0eXBlZGVmIHVuc2lnbmVkIGFjY193b3JkX3QgIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fVjE2UUlfXykpKTsKKyAgIHR5cGVkZWYgaW50ICAgICAgYWNjX3N3b3JkX3QgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19WMTZRSV9fKSkpOworIyAgZGVmaW5lIGFjY193b3JkX3QgICAgICAgICAgICBhY2Nfd29yZF90CisjICBkZWZpbmUgYWNjX3N3b3JkX3QgICAgICAgICAgIGFjY19zd29yZF90CisjICBkZWZpbmUgQUNDX1NJWkVPRl9BQ0NfV09SRF9UIDE2CisjZW5kaWYKKyNlbHNlCisjICBlcnJvciAiYWNjX3dvcmRfdCIKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfSU5UMTZfQykKKyMgIGlmIChBQ0NfQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKEFDQ19TSVpFT0ZfSU5UID49IDIpCisjICAgIGRlZmluZSBBQ0NfSU5UMTZfQyhjKSAgICAgICgoYykgKyAwKQorIyAgICBkZWZpbmUgQUNDX1VJTlQxNl9DKGMpICAgICAoKGMpICsgMFUpCisjICBlbGlmIChBQ0NfQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKEFDQ19TSVpFT0ZfTE9ORyA+PSAyKQorIyAgICBkZWZpbmUgQUNDX0lOVDE2X0MoYykgICAgICAoKGMpICsgMEwpCisjICAgIGRlZmluZSBBQ0NfVUlOVDE2X0MoYykgICAgICgoYykgKyAwVUwpCisjICBlbGlmIChBQ0NfU0laRU9GX0lOVCA+PSAyKQorIyAgICBkZWZpbmUgQUNDX0lOVDE2X0MoYykgICAgICBjCisjICAgIGRlZmluZSBBQ0NfVUlOVDE2X0MoYykgICAgIGMjI1UKKyMgIGVsaWYgKEFDQ19TSVpFT0ZfTE9ORyA+PSAyKQorIyAgICBkZWZpbmUgQUNDX0lOVDE2X0MoYykgICAgICBjIyNMCisjICAgIGRlZmluZSBBQ0NfVUlOVDE2X0MoYykgICAgIGMjI1VMCisjICBlbHNlCisjICAgIGVycm9yICJBQ0NfSU5UMTZfQyIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfSU5UMzJfQykKKyMgIGlmIChBQ0NfQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKEFDQ19TSVpFT0ZfSU5UID49IDQpCisjICAgIGRlZmluZSBBQ0NfSU5UMzJfQyhjKSAgICAgICgoYykgKyAwKQorIyAgICBkZWZpbmUgQUNDX1VJTlQzMl9DKGMpICAgICAoKGMpICsgMFUpCisjICBlbGlmIChBQ0NfQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKEFDQ19TSVpFT0ZfTE9ORyA+PSA0KQorIyAgICBkZWZpbmUgQUNDX0lOVDMyX0MoYykgICAgICAoKGMpICsgMEwpCisjICAgIGRlZmluZSBBQ0NfVUlOVDMyX0MoYykgICAgICgoYykgKyAwVUwpCisjICBlbGlmIChBQ0NfU0laRU9GX0lOVCA+PSA0KQorIyAgICBkZWZpbmUgQUNDX0lOVDMyX0MoYykgICAgICBjCisjICAgIGRlZmluZSBBQ0NfVUlOVDMyX0MoYykgICAgIGMjI1UKKyMgIGVsaWYgKEFDQ19TSVpFT0ZfTE9ORyA+PSA0KQorIyAgICBkZWZpbmUgQUNDX0lOVDMyX0MoYykgICAgICBjIyNMCisjICAgIGRlZmluZSBBQ0NfVUlOVDMyX0MoYykgICAgIGMjI1VMCisjICBlbGlmIChBQ0NfU0laRU9GX0xPTkdfTE9ORyA+PSA0KQorIyAgICBkZWZpbmUgQUNDX0lOVDMyX0MoYykgICAgICBjIyNMTAorIyAgICBkZWZpbmUgQUNDX1VJTlQzMl9DKGMpICAgICBjIyNVTEwKKyMgIGVsc2UKKyMgICAgZXJyb3IgIkFDQ19JTlQzMl9DIgorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19JTlQ2NF9DKSAmJiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyMgIGlmIChBQ0NfQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKEFDQ19TSVpFT0ZfSU5UID49IDgpCisjICAgIGRlZmluZSBBQ0NfSU5UNjRfQyhjKSAgICAgICgoYykgKyAwKQorIyAgICBkZWZpbmUgQUNDX1VJTlQ2NF9DKGMpICAgICAoKGMpICsgMFUpCisjICBlbGlmIChBQ0NfQlJPS0VOX0lOVEVHUkFMX0NPTlNUQU5UUykgJiYgKEFDQ19TSVpFT0ZfTE9ORyA+PSA4KQorIyAgICBkZWZpbmUgQUNDX0lOVDY0X0MoYykgICAgICAoKGMpICsgMEwpCisjICAgIGRlZmluZSBBQ0NfVUlOVDY0X0MoYykgICAgICgoYykgKyAwVUwpCisjICBlbGlmIChBQ0NfU0laRU9GX0lOVCA+PSA4KQorIyAgICBkZWZpbmUgQUNDX0lOVDY0X0MoYykgICAgICBjCisjICAgIGRlZmluZSBBQ0NfVUlOVDY0X0MoYykgICAgIGMjI1UKKyMgIGVsaWYgKEFDQ19TSVpFT0ZfTE9ORyA+PSA4KQorIyAgICBkZWZpbmUgQUNDX0lOVDY0X0MoYykgICAgICBjIyNMCisjICAgIGRlZmluZSBBQ0NfVUlOVDY0X0MoYykgICAgIGMjI1VMCisjICBlbHNlCisjICAgIGVycm9yICJBQ0NfSU5UNjRfQyIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfQUNDX0lOVDE2RV9UKSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfQUNDX0lOVDE2RV9UKQorIyAgZGVmaW5lIFNJWkVPRl9BQ0NfSU5UMTZFX1QgICBBQ0NfU0laRU9GX0FDQ19JTlQxNkVfVAorI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX0FDQ19JTlQzMkVfVCkgJiYgZGVmaW5lZChBQ0NfU0laRU9GX0FDQ19JTlQzMkVfVCkKKyMgIGRlZmluZSBTSVpFT0ZfQUNDX0lOVDMyRV9UICAgQUNDX1NJWkVPRl9BQ0NfSU5UMzJFX1QKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9BQ0NfSU5UNjRFX1QpICYmIGRlZmluZWQoQUNDX1NJWkVPRl9BQ0NfSU5UNjRFX1QpCisjICBkZWZpbmUgU0laRU9GX0FDQ19JTlQ2NEVfVCAgIEFDQ19TSVpFT0ZfQUNDX0lOVDY0RV9UCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfQUNDX0lOVDMyTF9UKSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfQUNDX0lOVDMyTF9UKQorIyAgZGVmaW5lIFNJWkVPRl9BQ0NfSU5UMzJMX1QgICBBQ0NfU0laRU9GX0FDQ19JTlQzMkxfVAorI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX0FDQ19JTlQ2NExfVCkgJiYgZGVmaW5lZChBQ0NfU0laRU9GX0FDQ19JTlQ2NExfVCkKKyMgIGRlZmluZSBTSVpFT0ZfQUNDX0lOVDY0TF9UICAgQUNDX1NJWkVPRl9BQ0NfSU5UNjRMX1QKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNJWkVPRl9BQ0NfSU5UMzJGX1QpICYmIGRlZmluZWQoQUNDX1NJWkVPRl9BQ0NfSU5UMzJGX1QpCisjICBkZWZpbmUgU0laRU9GX0FDQ19JTlQzMkZfVCAgIEFDQ19TSVpFT0ZfQUNDX0lOVDMyRl9UCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTSVpFT0ZfQUNDX0lOVFBUUl9UKSAmJiBkZWZpbmVkKEFDQ19TSVpFT0ZfQUNDX0lOVFBUUl9UKQorIyAgZGVmaW5lIFNJWkVPRl9BQ0NfSU5UUFRSX1QgICBBQ0NfU0laRU9GX0FDQ19JTlRQVFJfVAorI2VuZGlmCisjaWYgIWRlZmluZWQoU0laRU9GX0FDQ19XT1JEX1QpICYmIGRlZmluZWQoQUNDX1NJWkVPRl9BQ0NfV09SRF9UKQorIyAgZGVmaW5lIFNJWkVPRl9BQ0NfV09SRF9UICAgICBBQ0NfU0laRU9GX0FDQ19XT1JEX1QKKyNlbmRpZgorI2lmIDEgJiYgIWRlZmluZWQoYWNjX3NpZ25vX3QpICYmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fZGlldGxpYmNfXykgJiYgKEFDQ19TSVpFT0ZfSU5UICE9IDQpCisjICBkZWZpbmUgYWNjX3NpZ25vX3QgICAgICAgICAgIGFjY19pbnQzMmVfdAorI2VuZGlmCisjaWYgIWRlZmluZWQoYWNjX3NpZ25vX3QpCisjICBkZWZpbmUgYWNjX3NpZ25vX3QgICAgICAgICAgIGludAorI2VuZGlmCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisjaWYgKEFDQ19CUk9LRU5fQ0RFQ0xfQUxUX1NZTlRBWCkKK3R5cGVkZWYgdm9pZCBfX2FjY19jZGVjbF9zaWdoYW5kbGVyICgqYWNjX3NpZ2hhbmRsZXJfdCkoYWNjX3NpZ25vX3QpOworI2VsaWYgZGVmaW5lZChSRVRTSUdUWVBFKQordHlwZWRlZiBSRVRTSUdUWVBFIChfX2FjY19jZGVjbF9zaWdoYW5kbGVyICphY2Nfc2lnaGFuZGxlcl90KShhY2Nfc2lnbm9fdCk7CisjZWxzZQordHlwZWRlZiB2b2lkIChfX2FjY19jZGVjbF9zaWdoYW5kbGVyICphY2Nfc2lnaGFuZGxlcl90KShhY2Nfc2lnbm9fdCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisjICBpZiAhZGVmaW5lZChBQ0NfQ0ZHX05PX0FDQ19VQV9IKQorI2lmIChBQ0NfQ0NfR05VQyAmJiAoQUNDX0NDX0dOVUMgPCAweDAyMDcwMHVsKSkKKyNlbGlmIChBQ0NfQ0NfR05VQyAmJiAoQUNDX0NDX0dOVUMgPCAweDAyMDgwMHVsKSkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNlbGlmIChBQ0NfQ0NfSU5URUxDKSAmJiBkZWZpbmVkKF9XSU4zMikKKyNlbGlmIChBQ0NfQ0NfSU5URUxDICYmIChfX0lOVEVMX0NPTVBJTEVSIDwgNzAwKSkKKyNlbGlmIChBQ0NfQ0NfTExWTSkKKyNlbGlmIChBQ0NfQ0NfR05VQyB8fCBBQ0NfQ0NfSU5URUxDIHx8IEFDQ19DQ19QQVRIU0NBTEUpCisjaWYgIWRlZmluZWQoX19hY2NfdWExNl90KSAmJiAoQUNDX09QVF9VTkFMSUdORUQxNikgJiYgZGVmaW5lZChhY2NfaW50MTZlX3QpCisgICB0eXBlZGVmIHN0cnVjdCB7IF9fYWNjX3VhX3ZvbGF0aWxlIGFjY191aW50MTZlX3QgdiBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7IH0gX19hY2NfdWExNl90OworIyAgZGVmaW5lIF9fYWNjX3VhMTZfdCBfX2FjY191YTE2X3QKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fYWNjX3VhMzJfdCkgJiYgKEFDQ19PUFRfVU5BTElHTkVEMzIpICYmIGRlZmluZWQoYWNjX2ludDMyZV90KQorICAgdHlwZWRlZiBzdHJ1Y3QgeyBfX2FjY191YV92b2xhdGlsZSBhY2NfdWludDMyZV90IHYgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOyB9IF9fYWNjX3VhMzJfdDsKKyMgIGRlZmluZSBfX2FjY191YTMyX3QgX19hY2NfdWEzMl90CisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX2FjY191YTY0X3QpICYmIChBQ0NfT1BUX1VOQUxJR05FRDY0KSAmJiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyAgIHR5cGVkZWYgc3RydWN0IHsgX19hY2NfdWFfdm9sYXRpbGUgYWNjX3VpbnQ2NGxfdCB2IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsgfSBfX2FjY191YTY0X3Q7CisjICBkZWZpbmUgX19hY2NfdWE2NF90IF9fYWNjX3VhNjRfdAorI2VuZGlmCisjZW5kaWYKKyNpZiAoQUNDX09QVF9VTkFMSUdORUQxNikgJiYgZGVmaW5lZChhY2NfaW50MTZlX3QpCisjZGVmaW5lIEFDQ19VQV9HRVQxNihwKSAgICAgICAgICgqIChfX2FjY191YV92b2xhdGlsZSBjb25zdCBhY2NfdWludDE2ZV90KikgKF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IHZvaWQqKSAocCkpCisjZGVmaW5lIEFDQ19VQV9TRVQxNihwLHYpICAgICAgICgqIChfX2FjY191YV92b2xhdGlsZSBhY2NfdWludDE2ZV90KikgKF9fYWNjX3VhX3ZvbGF0aWxlIHZvaWQqKSAocCkgPSAoYWNjX3VpbnQxNmVfdCkgKHYpKQorI2lmIChBQ0NfQUJJX0JJR19FTkRJQU4pCisjICBkZWZpbmUgQUNDX1VBX0dFVF9CRTE2KHApICAgIEFDQ19VQV9HRVQxNihwKQorIyAgZGVmaW5lIEFDQ19VQV9TRVRfQkUxNihwLHYpICBBQ0NfVUFfU0VUMTYocCx2KQorI2VsaWYgKEFDQ19BQklfTElUVExFX0VORElBTikKKyMgIGRlZmluZSBBQ0NfVUFfR0VUX0xFMTYocCkgICAgQUNDX1VBX0dFVDE2KHApCisjICBkZWZpbmUgQUNDX1VBX1NFVF9MRTE2KHAsdikgIEFDQ19VQV9TRVQxNihwLHYpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfQ0ZHX05PX0lOTElORV9BU00pICYmIGRlZmluZWQoX19hY2NfSEFWRV9mb3JjZWlubGluZSkKKyNpZiAoQUNDX0FSQ0hfUE9XRVJQQyAmJiBBQ0NfQUJJX0JJR19FTkRJQU4pICYmIChBQ0NfQ0NfR05VQykKKyNpZiAhZGVmaW5lZChBQ0NfVUFfR0VUX0xFMTYpCitleHRlcm4gX19hY2NfZm9yY2VpbmxpbmUgdW5zaWduZWQgbG9uZyBfX0FDQ19VQV9HRVRfTEUxNihfX2FjY191YV92b2xhdGlsZSBjb25zdCB2b2lkKiBwcCk7CitleHRlcm4gX19hY2NfZm9yY2VpbmxpbmUgdW5zaWduZWQgbG9uZyBfX0FDQ19VQV9HRVRfTEUxNihfX2FjY191YV92b2xhdGlsZSBjb25zdCB2b2lkKiBwcCkgeworICAgIF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IGFjY191aW50MTZlX3QqIHAgPSAoX19hY2NfdWFfdm9sYXRpbGUgY29uc3QgYWNjX3VpbnQxNmVfdCopIHBwOworICAgIHVuc2lnbmVkIGxvbmcgdjsKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGhicnggJTAsMCwlMSIgOiAiPXIiICh2KSA6ICJyIiAocCksICJtIiAoKnApKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgQUNDX1VBX0dFVF9MRTE2KHApICAgICAgX19BQ0NfVUFfR0VUX0xFMTYocCkKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19VQV9TRVRfTEUxNikKK2V4dGVybiBfX2FjY19mb3JjZWlubGluZSB2b2lkIF9fQUNDX1VBX1NFVF9MRTE2KF9fYWNjX3VhX3ZvbGF0aWxlIHZvaWQqIHBwLCB1bnNpZ25lZCBsb25nIHYpOworZXh0ZXJuIF9fYWNjX2ZvcmNlaW5saW5lIHZvaWQgX19BQ0NfVUFfU0VUX0xFMTYoX19hY2NfdWFfdm9sYXRpbGUgdm9pZCogcHAsIHVuc2lnbmVkIGxvbmcgdikgeworICAgIF9fYWNjX3VhX3ZvbGF0aWxlIGFjY191aW50MTZlX3QqIHAgPSAoX19hY2NfdWFfdm9sYXRpbGUgYWNjX3VpbnQxNmVfdCopIHBwOworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJzdGhicnggJTIsMCwlMSIgOiAiPW0iICgqcCkgOiAiciIgKHApLCAiciIgKHYpKTsKK30KKyNkZWZpbmUgQUNDX1VBX1NFVF9MRTE2KHAsdikgICAgX19BQ0NfVUFfU0VUX0xFMTYocCx2KQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19VQV9DT1BZMTYpCisjICBkZWZpbmUgQUNDX1VBX0NPUFkxNihkLHMpICAgIEFDQ19VQV9TRVQxNihkLCBBQ0NfVUFfR0VUMTYocykpCisjZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfT1BUX1VOQUxJR05FRDMyKSAmJiBkZWZpbmVkKGFjY19pbnQzMmVfdCkKKyNkZWZpbmUgQUNDX1VBX0dFVDMyKHApICAgICAgICAgKCogKF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IGFjY191aW50MzJlX3QqKSAoX19hY2NfdWFfdm9sYXRpbGUgY29uc3Qgdm9pZCopIChwKSkKKyNkZWZpbmUgQUNDX1VBX1NFVDMyKHAsdikgICAgICAgKCogKF9fYWNjX3VhX3ZvbGF0aWxlIGFjY191aW50MzJlX3QqKSAoX19hY2NfdWFfdm9sYXRpbGUgdm9pZCopIChwKSA9IChhY2NfdWludDMyZV90KSAodikpCisjaWYgKEFDQ19BQklfQklHX0VORElBTikKKyMgIGRlZmluZSBBQ0NfVUFfR0VUX0JFMzIocCkgICAgQUNDX1VBX0dFVDMyKHApCisjICBkZWZpbmUgQUNDX1VBX1NFVF9CRTMyKHAsdikgIEFDQ19VQV9TRVQzMihwLHYpCisjZWxpZiAoQUNDX0FCSV9MSVRUTEVfRU5ESUFOKQorIyAgZGVmaW5lIEFDQ19VQV9HRVRfTEUzMihwKSAgICBBQ0NfVUFfR0VUMzIocCkKKyMgIGRlZmluZSBBQ0NfVUFfU0VUX0xFMzIocCx2KSAgQUNDX1VBX1NFVDMyKHAsdikKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19DRkdfTk9fSU5MSU5FX0FTTSkgJiYgZGVmaW5lZChfX2FjY19IQVZFX2ZvcmNlaW5saW5lKQorI2lmIChBQ0NfQVJDSF9QT1dFUlBDICYmIEFDQ19BQklfQklHX0VORElBTikgJiYgKEFDQ19DQ19HTlVDKQorI2lmICFkZWZpbmVkKEFDQ19VQV9HRVRfTEUzMikKK2V4dGVybiBfX2FjY19mb3JjZWlubGluZSB1bnNpZ25lZCBsb25nIF9fQUNDX1VBX0dFVF9MRTMyKF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IHZvaWQqIHBwKTsKK2V4dGVybiBfX2FjY19mb3JjZWlubGluZSB1bnNpZ25lZCBsb25nIF9fQUNDX1VBX0dFVF9MRTMyKF9fYWNjX3VhX3ZvbGF0aWxlIGNvbnN0IHZvaWQqIHBwKSB7CisgICAgX19hY2NfdWFfdm9sYXRpbGUgY29uc3QgYWNjX3VpbnQzMmVfdCogcCA9IChfX2FjY191YV92b2xhdGlsZSBjb25zdCBhY2NfdWludDMyZV90KikgcHA7CisgICAgdW5zaWduZWQgbG9uZyB2OworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsd2JyeCAlMCwwLCUxIiA6ICI9ciIgKHYpIDogInIiIChwKSwgIm0iICgqcCkpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSBBQ0NfVUFfR0VUX0xFMzIocCkgICAgICBfX0FDQ19VQV9HRVRfTEUzMihwKQorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX1VBX1NFVF9MRTMyKQorZXh0ZXJuIF9fYWNjX2ZvcmNlaW5saW5lIHZvaWQgX19BQ0NfVUFfU0VUX0xFMzIoX19hY2NfdWFfdm9sYXRpbGUgdm9pZCogcHAsIHVuc2lnbmVkIGxvbmcgdik7CitleHRlcm4gX19hY2NfZm9yY2VpbmxpbmUgdm9pZCBfX0FDQ19VQV9TRVRfTEUzMihfX2FjY191YV92b2xhdGlsZSB2b2lkKiBwcCwgdW5zaWduZWQgbG9uZyB2KSB7CisgICAgX19hY2NfdWFfdm9sYXRpbGUgYWNjX3VpbnQzMmVfdCogcCA9IChfX2FjY191YV92b2xhdGlsZSBhY2NfdWludDMyZV90KikgcHA7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN0d2JyeCAlMiwwLCUxIiA6ICI9bSIgKCpwKSA6ICJyIiAocCksICJyIiAodikpOworfQorI2RlZmluZSBBQ0NfVUFfU0VUX0xFMzIocCx2KSAgICBfX0FDQ19VQV9TRVRfTEUzMihwLHYpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX1VBX0NPUFkzMikKKyMgIGRlZmluZSBBQ0NfVUFfQ09QWTMyKGQscykgICAgQUNDX1VBX1NFVDMyKGQsIEFDQ19VQV9HRVQzMihzKSkKKyNlbmRpZgorI2VuZGlmCisjaWYgKEFDQ19PUFRfVU5BTElHTkVENjQpICYmIGRlZmluZWQoYWNjX2ludDY0bF90KQorI2RlZmluZSBBQ0NfVUFfR0VUNjQocCkgICAgICAgICAoKiAoX19hY2NfdWFfdm9sYXRpbGUgY29uc3QgYWNjX3VpbnQ2NGxfdCopIChfX2FjY191YV92b2xhdGlsZSBjb25zdCB2b2lkKikgKHApKQorI2RlZmluZSBBQ0NfVUFfU0VUNjQocCx2KSAgICAgICAoKiAoX19hY2NfdWFfdm9sYXRpbGUgYWNjX3VpbnQ2NGxfdCopIChfX2FjY191YV92b2xhdGlsZSB2b2lkKikgKHApID0gKGFjY191aW50NjRsX3QpICh2KSkKKyNpZiAoQUNDX0FCSV9CSUdfRU5ESUFOKQorIyAgZGVmaW5lIEFDQ19VQV9HRVRfQkU2NChwKSAgICBBQ0NfVUFfR0VUNjQocCkKKyMgIGRlZmluZSBBQ0NfVUFfU0VUX0JFNjQocCx2KSAgQUNDX1VBX1NFVDY0KHAsdikKKyNlbGlmIChBQ0NfQUJJX0xJVFRMRV9FTkRJQU4pCisjICBkZWZpbmUgQUNDX1VBX0dFVF9MRTY0KHApICAgIEFDQ19VQV9HRVQ2NChwKQorIyAgZGVmaW5lIEFDQ19VQV9TRVRfTEU2NChwLHYpICBBQ0NfVUFfU0VUNjQocCx2KQorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX1VBX0NPUFk2NCkKKyMgIGRlZmluZSBBQ0NfVUFfQ09QWTY0KGQscykgICAgQUNDX1VBX1NFVDY0KGQsIEFDQ19VQV9HRVQ2NChzKSkKKyNlbmRpZgorI2VuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfV0FOVF9BQ0NfSU5DRF9IKQorIyAgdW5kZWYgQUNDX1dBTlRfQUNDX0lOQ0RfSAorI2lmbmRlZiBfX0FDQ19JTkNEX0hfSU5DTFVERUQKKyNkZWZpbmUgX19BQ0NfSU5DRF9IX0lOQ0xVREVEIDEKKyNpZiBkZWZpbmVkKEFDQ19MSUJDX05BS0VEKQorI2lmbmRlZiBfX0FDQ19GQUxMQkFDS19TVERERUZfSF9JTkNMVURFRAorI2RlZmluZSBfX0FDQ19GQUxMQkFDS19TVERERUZfSF9JTkNMVURFRAorI2lmIGRlZmluZWQoX19QVFJESUZGX1RZUEVfXykKK3R5cGVkZWYgX19QVFJESUZGX1RZUEVfXyBhY2NfZmFsbGJhY2tfcHRyZGlmZl90OworI2VsaWYgZGVmaW5lZChfX01JUFNfUFNYMl9fKQordHlwZWRlZiBpbnQgYWNjX2ZhbGxiYWNrX3B0cmRpZmZfdDsKKyNlbHNlCit0eXBlZGVmIGxvbmcgYWNjX2ZhbGxiYWNrX3B0cmRpZmZfdDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19TSVpFX1RZUEVfXykKK3R5cGVkZWYgX19TSVpFX1RZUEVfXyBhY2NfZmFsbGJhY2tfc2l6ZV90OworI2VsaWYgZGVmaW5lZChfX01JUFNfUFNYMl9fKQordHlwZWRlZiB1bnNpZ25lZCBpbnQgYWNjX2ZhbGxiYWNrX3NpemVfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgYWNjX2ZhbGxiYWNrX3NpemVfdDsKKyNlbmRpZgorI2lmICFkZWZpbmVkKHB0cmRpZmZfdCkKK3R5cGVkZWYgYWNjX2ZhbGxiYWNrX3B0cmRpZmZfdCBwdHJkaWZmX3Q7CisjaWZuZGVmIF9QVFJESUZGX1RfREVGSU5FRAorI2RlZmluZSBfUFRSRElGRl9UX0RFRklORUQgMQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChzaXplX3QpCit0eXBlZGVmIGFjY19mYWxsYmFja19zaXplX3Qgc2l6ZV90OworI2lmbmRlZiBfU0laRV9UX0RFRklORUQKKyNkZWZpbmUgX1NJWkVfVF9ERUZJTkVEIDEKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKHdjaGFyX3QpCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHdjaGFyX3Q7CisjaWZuZGVmIF9XQ0hBUl9UX0RFRklORUQKKyNkZWZpbmUgX1dDSEFSX1RfREVGSU5FRCAxCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBOVUxMCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDQpCisjZGVmaW5lIE5VTEwgICAgX19udWxsCisjZWxpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBOVUxMICAgIDAKKyNlbHNlCisjZGVmaW5lIE5VTEwgICAgKCh2b2lkKikwKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgb2Zmc2V0b2YKKyNkZWZpbmUgb2Zmc2V0b2YocyxtKSAgICgoc2l6ZV90KSgocHRyZGlmZl90KSYoKChzKikwKS0+bSkpKQorI2VuZGlmCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoQUNDX0xJQkNfRlJFRVNUQU5ESU5HKQorIyBpZiBIQVZFX1NURERFRl9ICisjICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgZW5kaWYKKyMgaWYgSEFWRV9TVERJTlRfSAorIyAgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKEFDQ19MSUJDX01PU1RMWV9GUkVFU1RBTkRJTkcpCisjIGlmIEhBVkVfU1RESU9fSAorIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgZW5kaWYKKyMgaWYgSEFWRV9TVERERUZfSAorIyAgaW5jbHVkZSA8c3RkZGVmLmg+CisjIGVuZGlmCisjIGlmIEhBVkVfU1RESU5UX0gKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyBlbmRpZgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIGRlZmluZWQoSEFWRV9USU1FX0gpICYmIGRlZmluZWQoX19NU0xfXykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhU1REQ19IRUFERVJTICYmIEhBVkVfTUVNT1JZX0gKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1RSSU5HU19ICisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmIEhBVkVfSU5UVFlQRVNfSAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyMgaWYgSEFWRV9TVERJTlRfSAorIyAgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfV0FOVF9BQ0NfSU5DRV9IKQorIyAgdW5kZWYgQUNDX1dBTlRfQUNDX0lOQ0VfSAorI2lmbmRlZiBfX0FDQ19JTkNFX0hfSU5DTFVERUQKKyNkZWZpbmUgX19BQ0NfSU5DRV9IX0lOQ0xVREVEIDEKKyNpZiBkZWZpbmVkKEFDQ19MSUJDX05BS0VEKQorI2VsaWYgZGVmaW5lZChBQ0NfTElCQ19GUkVFU1RBTkRJTkcpCisjZWxpZiBkZWZpbmVkKEFDQ19MSUJDX01PU1RMWV9GUkVFU1RBTkRJTkcpCisjICBpZiBkZWZpbmVkKEhBVkVfU0VUSk1QX0gpCisjICAgIGluY2x1ZGUgPHNldGptcC5oPgorIyAgZW5kaWYKKyNlbHNlCisjaWYgZGVmaW5lZChIQVZFX1NUREFSR19IKQorIyAgaW5jbHVkZSA8c3RkYXJnLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfQ1RZUEVfSCkKKyMgIGluY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfRVJSTk9fSCkKKyMgIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfTUFMTE9DX0gpCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9BTExPQ0FfSCkKKyMgIGluY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0ZDTlRMX0gpCisjICBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0RJUkVOVF9IKQorIyAgaW5jbHVkZSA8ZGlyZW50Lmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfU0VUSk1QX0gpCisjICBpbmNsdWRlIDxzZXRqbXAuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TSUdOQUxfSCkKKyMgIGluY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChUSU1FX1dJVEhfU1lTX1RJTUUpCisjICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyAgaW5jbHVkZSA8dGltZS5oPgorI2VsaWYgZGVmaW5lZChIQVZFX1RJTUVfSCkKKyMgIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9VVElNRV9IKQorIyAgaW5jbHVkZSA8dXRpbWUuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9TWVNfVVRJTUVfSCkKKyMgIGluY2x1ZGUgPHN5cy91dGltZS5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0lPX0gpCisjICBpbmNsdWRlIDxpby5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0RPU19IKQorIyAgaW5jbHVkZSA8ZG9zLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfRElSRUNUX0gpCisjICBpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TSEFSRV9IKQorIyAgaW5jbHVkZSA8c2hhcmUuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX0NDX05EUEMpCisjICBpbmNsdWRlIDxvcy5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChfX1RPU19fKSAmJiAoZGVmaW5lZChfX1BVUkVDX18pIHx8IGRlZmluZWQoX19UVVJCT0NfXykpCisjICBpbmNsdWRlIDxleHQuaD4KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX1dBTlRfQUNDX0lOQ0lfSCkKKyMgIHVuZGVmIEFDQ19XQU5UX0FDQ19JTkNJX0gKKyNpZm5kZWYgX19BQ0NfSU5DSV9IX0lOQ0xVREVECisjZGVmaW5lIF9fQUNDX0lOQ0lfSF9JTkNMVURFRCAxCisjaWYgZGVmaW5lZChBQ0NfTElCQ19OQUtFRCkKKyNlbGlmIGRlZmluZWQoQUNDX0xJQkNfRlJFRVNUQU5ESU5HKQorI2VsaWYgZGVmaW5lZChBQ0NfTElCQ19NT1NUTFlfRlJFRVNUQU5ESU5HKQorI2Vsc2UKKyNpZiAoQUNDX09TX1RPUyAmJiAoQUNDX0NDX1BVUkVDIHx8IEFDQ19DQ19UVVJCT0MpKQorIyAgaW5jbHVkZSA8dG9zLmg+CisjZWxpZiAoQUNDX0hBVkVfV0lORE9XU19IKQorIyAgaWYgMSAmJiAhZGVmaW5lZChXSU4zMl9MRUFOX0FORF9NRUFOKQorIyAgICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCisjICBlbmRpZgorIyAgaWYgMSAmJiAhZGVmaW5lZChfV0lOMzJfV0lOTlQpCisjICAgIGRlZmluZSBfV0lOMzJfV0lOTlQgMHgwNDAwCisjICBlbmRpZgorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgaWYgKEFDQ19DQ19CT1JMQU5EQyB8fCBBQ0NfQ0NfVFVSQk9DKQorIyAgICBpbmNsdWRlIDxkaXIuaD4KKyMgIGVuZGlmCisjZWxpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19ET1MzMiB8fCBBQ0NfT1NfV0lOMTYpCisjICBpZiAoQUNDX0NDX0FaVEVDQykKKyMgICAgaW5jbHVkZSA8bW9kZWwuaD4KKyMgICAgaW5jbHVkZSA8c3RhdC5oPgorIyAgZWxpZiAoQUNDX0NDX0JPUkxBTkRDIHx8IEFDQ19DQ19UVVJCT0MpCisjICAgIGluY2x1ZGUgPGFsbG9jLmg+CisjICAgIGluY2x1ZGUgPGRpci5oPgorIyAgZWxpZiAoQUNDX09TX0RPUzMyICYmIEFDQ19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fREpHUFBfXykKKyMgICAgaW5jbHVkZSA8c3lzL2V4Y2VwdG4uaD4KKyMgIGVsaWYgKEFDQ19DQ19QQUNJRklDQykKKyMgICAgaW5jbHVkZSA8dW5peGlvLmg+CisjICAgIGluY2x1ZGUgPHN0YXQuaD4KKyMgICAgaW5jbHVkZSA8c3lzLmg+CisjICBlbGlmIChBQ0NfQ0NfV0FUQ09NQykKKyMgICAgaW5jbHVkZSA8aTg2Lmg+CisjICBlbmRpZgorI2VsaWYgKEFDQ19PU19PUzIxNikKKyMgIGlmIChBQ0NfQ0NfV0FUQ09NQykKKyMgICAgaW5jbHVkZSA8aTg2Lmg+CisjICBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NZU19NTUFOX0gpCisjICBpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NZU19SRVNPVVJDRV9IKQorIyAgaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjZW5kaWYKKyNpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19PUzIxNiB8fCBBQ0NfT1NfV0lOMTYpCisjICBpZiBkZWZpbmVkKEZQX09GRikKKyMgICAgZGVmaW5lIEFDQ19QVFJfRlBfT0ZGKHgpICAgRlBfT0ZGKHgpCisjICBlbGlmIGRlZmluZWQoX0ZQX09GRikKKyMgICAgZGVmaW5lIEFDQ19QVFJfRlBfT0ZGKHgpICAgX0ZQX09GRih4KQorIyAgZWxzZQorIyAgICBkZWZpbmUgQUNDX1BUUl9GUF9PRkYoeCkgICAoKChjb25zdCB1bnNpZ25lZCBfX2ZhciopJih4KSlbMF0pCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChGUF9TRUcpCisjICAgIGRlZmluZSBBQ0NfUFRSX0ZQX1NFRyh4KSAgIEZQX1NFRyh4KQorIyAgZWxpZiBkZWZpbmVkKF9GUF9TRUcpCisjICAgIGRlZmluZSBBQ0NfUFRSX0ZQX1NFRyh4KSAgIF9GUF9TRUcoeCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ19QVFJfRlBfU0VHKHgpICAgKCgoY29uc3QgdW5zaWduZWQgX19mYXIqKSYoeCkpWzFdKQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoTUtfRlApCisjICAgIGRlZmluZSBBQ0NfUFRSX01LX0ZQKHMsbykgIE1LX0ZQKHMsbykKKyMgIGVsaWYgZGVmaW5lZChfTUtfRlApCisjICAgIGRlZmluZSBBQ0NfUFRSX01LX0ZQKHMsbykgIF9NS19GUChzLG8pCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NfUFRSX01LX0ZQKHMsbykgICgodm9pZCBfX2ZhciopKCgodW5zaWduZWQgbG9uZykocyk8PDE2KSsodW5zaWduZWQpKG8pKSkKKyMgIGVuZGlmCisjICBpZiAwCisjICAgIHVuZGVmIEFDQ19QVFJfRlBfT0ZGCisjICAgIHVuZGVmIEFDQ19QVFJfRlBfU0VHCisjICAgIHVuZGVmIEFDQ19QVFJfTUtfRlAKKyMgICAgZGVmaW5lIEFDQ19QVFJfRlBfT0ZGKHgpICAgKCgoY29uc3QgdW5zaWduZWQgX19mYXIqKSYoeCkpWzBdKQorIyAgICBkZWZpbmUgQUNDX1BUUl9GUF9TRUcoeCkgICAoKChjb25zdCB1bnNpZ25lZCBfX2ZhciopJih4KSlbMV0pCisjICAgIGRlZmluZSBBQ0NfUFRSX01LX0ZQKHMsbykgICgodm9pZCBfX2ZhciopKCgodW5zaWduZWQgbG9uZykocyk8PDE2KSsodW5zaWduZWQpKG8pKSkKKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19XQU5UX0FDQ19MSUJfSCkKKyMgIHVuZGVmIEFDQ19XQU5UX0FDQ19MSUJfSAorI2lmbmRlZiBfX0FDQ19MSUJfSF9JTkNMVURFRAorI2RlZmluZSBfX0FDQ19MSUJfSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoX19BQ0NMSUJfRlVOQ05BTUUpCisjICBkZWZpbmUgX19BQ0NMSUJfRlVOQ05BTUUoZikgIGYKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ0xJQl9FWFRFUk4pCisjICBkZWZpbmUgQUNDTElCX0VYVEVSTihyLGYpICAgICAgICAgICAgICAgIGV4dGVybiByIF9fQUNDTElCX0ZVTkNOQU1FKGYpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NMSUJfRVhURVJOX05PSU5MSU5FKQorIyAgaWYgZGVmaW5lZChfX2FjY19ub2lubGluZSkKKyMgICAgZGVmaW5lIEFDQ0xJQl9FWFRFUk5fTk9JTkxJTkUocixmKSAgICAgZXh0ZXJuIF9fYWNjX25vaW5saW5lIHIgX19BQ0NMSUJfRlVOQ05BTUUoZikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ0xJQl9FWFRFUk5fTk9JTkxJTkUocixmKSAgICAgZXh0ZXJuIHIgX19BQ0NMSUJfRlVOQ05BTUUoZikKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX0FDQ0xJQl9DT05TVF9DQVNUX1JFVFVSTikKKyNpZiAxICYmIChBQ0NfQ0NfR05VQyB8fCBBQ0NfQ0NfTExWTSB8fCBBQ0NfQ0NfUEFUSFNDQUxFKQorIyAgZGVmaW5lIF9fQUNDTElCX0NPTlNUX0NBU1RfUkVUVVJOKHR5cGUsdmFyKSByZXR1cm4gKHR5cGUpIChhY2NfdWludHB0cl90KSAodmFyKTsKKyNlbGlmIChBQ0NfQ0NfR05VQyB8fCBBQ0NfQ0NfTExWTSB8fCBBQ0NfQ0NfUEFUSFNDQUxFKQorIyAgZGVmaW5lIF9fQUNDTElCX0NPTlNUX0NBU1RfUkVUVVJOKHR5cGUsdmFyKSBcCisgICAgICAgIHsgdW5pb24geyB0eXBlIGE7IGNvbnN0IHR5cGUgYjsgfSB1OyB1LmIgPSAodmFyKTsgcmV0dXJuIHUuYTsgfQorI2Vsc2UKKyMgIGRlZmluZSBfX0FDQ0xJQl9DT05TVF9DQVNUX1JFVFVSTih0eXBlLHZhcikgcmV0dXJuICh0eXBlKSAodmFyKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgKEFDQ19PU19XSU42NCkKKyMgIGRlZmluZSBhY2NsaWJfaGFuZGxlX3QgICAgICAgYWNjX2ludDY0bF90CisjICBkZWZpbmUgYWNjbGliX3VoYW5kbGVfdCAgICAgIGFjY191aW50NjRsX3QKKyNlbGlmIChBQ0NfQVJDSF9JMzg2ICYmIEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEzMDApKQorICAgdHlwZWRlZiBfX3c2NCBsb25nICAgICAgICAgICBhY2NsaWJfaGFuZGxlX3Q7CisgICB0eXBlZGVmIF9fdzY0IHVuc2lnbmVkIGxvbmcgIGFjY2xpYl91aGFuZGxlX3Q7CisjICBkZWZpbmUgYWNjbGliX2hhbmRsZV90ICAgICAgIGFjY2xpYl9oYW5kbGVfdAorIyAgZGVmaW5lIGFjY2xpYl91aGFuZGxlX3QgICAgICBhY2NsaWJfdWhhbmRsZV90CisjZWxzZQorIyAgZGVmaW5lIGFjY2xpYl9oYW5kbGVfdCAgICAgICBsb25nCisjICBkZWZpbmUgYWNjbGliX3VoYW5kbGVfdCAgICAgIHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorI2lmIDAKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfYXNjaWlfZGlnaXQpICAgKGludCk7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX2FzY2lpX2lzbG93ZXIpIChpbnQpOworQUNDTElCX0VYVEVSTihpbnQsIGFjY19hc2NpaV9pc3VwcGVyKSAoaW50KTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfYXNjaWlfdG9sb3dlcikgKGludCk7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX2FzY2lpX3RvdXBwZXIpIChpbnQpOworQUNDTElCX0VYVEVSTihpbnQsIGFjY19hc2NpaV91dG9sb3dlcikgKGludCk7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX2FzY2lpX3V0b3VwcGVyKSAoaW50KTsKKyNlbmRpZgorI2RlZmluZSBhY2NfYXNjaWlfaXNkaWdpdChjKSAgICAoKCh1bnNpZ25lZCkoYykgLSA0OCkgPCAxMCkKKyNkZWZpbmUgYWNjX2FzY2lpX2lzbG93ZXIoYykgICAgKCgodW5zaWduZWQpKGMpIC0gOTcpIDwgMjYpCisjZGVmaW5lIGFjY19hc2NpaV9pc3VwcGVyKGMpICAgICgoKHVuc2lnbmVkKShjKSAtIDY1KSA8IDI2KQorI2RlZmluZSBhY2NfYXNjaWlfdG9sb3dlcihjKSAgICAoKGludCkoYykgKyAoYWNjX2FzY2lpX2lzdXBwZXIoYykgPDwgNSkpCisjZGVmaW5lIGFjY19hc2NpaV90b3VwcGVyKGMpICAgICgoaW50KShjKSAtIChhY2NfYXNjaWlfaXNsb3dlcihjKSA8PCA1KSkKKyNkZWZpbmUgYWNjX2FzY2lpX3V0b2xvd2VyKGMpICAgYWNjX2FzY2lpX3RvbG93ZXIoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBhY2NfYXNjaWlfdXRvdXBwZXIoYykgICBhY2NfYXNjaWlfdG91cHBlcigodW5zaWduZWQgY2hhcikoYykpCisjaWZuZGVmIGFjY19oc2l6ZV90CisjaWYgKEFDQ19IQVZFX01NX0hVR0VfUFRSKQorIyAgZGVmaW5lIGFjY19oc2l6ZV90ICAgdW5zaWduZWQgbG9uZworIyAgZGVmaW5lIGFjY19odm9pZF9wICAgdm9pZCBfX2h1Z2UgKgorIyAgZGVmaW5lIGFjY19oY2hhcl9wICAgY2hhciBfX2h1Z2UgKgorIyAgZGVmaW5lIGFjY19oY2hhcl9wcCAgY2hhciBfX2h1Z2UgKiBfX2h1Z2UgKgorIyAgZGVmaW5lIGFjY19oYnl0ZV9wICAgdW5zaWduZWQgY2hhciBfX2h1Z2UgKgorI2Vsc2UKKyMgIGRlZmluZSBhY2NfaHNpemVfdCAgIHNpemVfdAorIyAgZGVmaW5lIGFjY19odm9pZF9wICAgdm9pZCAqCisjICBkZWZpbmUgYWNjX2hjaGFyX3AgICBjaGFyICoKKyMgIGRlZmluZSBhY2NfaGNoYXJfcHAgIGNoYXIgKioKKyMgIGRlZmluZSBhY2NfaGJ5dGVfcCAgIHVuc2lnbmVkIGNoYXIgKgorI2VuZGlmCisjZW5kaWYKK0FDQ0xJQl9FWFRFUk4oYWNjX2h2b2lkX3AsIGFjY19oYWxsb2MpIChhY2NfaHNpemVfdCk7CitBQ0NMSUJfRVhURVJOKHZvaWQsIGFjY19oZnJlZSkgKGFjY19odm9pZF9wKTsKKyNpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19PUzIxNikKK0FDQ0xJQl9FWFRFUk4odm9pZCBfX2ZhciosIGFjY19kb3NfYWxsb2MpICh1bnNpZ25lZCBsb25nKTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfZG9zX2ZyZWUpICh2b2lkIF9fZmFyKik7CisjZW5kaWYKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfaG1lbWNtcCkgKGNvbnN0IGFjY19odm9pZF9wLCBjb25zdCBhY2NfaHZvaWRfcCwgYWNjX2hzaXplX3QpOworQUNDTElCX0VYVEVSTihhY2NfaHZvaWRfcCwgYWNjX2htZW1jcHkpIChhY2NfaHZvaWRfcCwgY29uc3QgYWNjX2h2b2lkX3AsIGFjY19oc2l6ZV90KTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2h2b2lkX3AsIGFjY19obWVtbW92ZSkgKGFjY19odm9pZF9wLCBjb25zdCBhY2NfaHZvaWRfcCwgYWNjX2hzaXplX3QpOworQUNDTElCX0VYVEVSTihhY2NfaHZvaWRfcCwgYWNjX2htZW1zZXQpIChhY2NfaHZvaWRfcCwgaW50LCBhY2NfaHNpemVfdCk7CitBQ0NMSUJfRVhURVJOKGFjY19oc2l6ZV90LCBhY2NfaHN0cmxlbikgKGNvbnN0IGFjY19oY2hhcl9wKTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfaHN0cmNtcCkgKGNvbnN0IGFjY19oY2hhcl9wLCBjb25zdCBhY2NfaGNoYXJfcCk7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX2hzdHJuY21wKShjb25zdCBhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3AsIGFjY19oc2l6ZV90KTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfYXNjaWlfaHN0cmljbXApIChjb25zdCBhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3ApOworQUNDTElCX0VYVEVSTihpbnQsIGFjY19hc2NpaV9oc3RybmljbXApKGNvbnN0IGFjY19oY2hhcl9wLCBjb25zdCBhY2NfaGNoYXJfcCwgYWNjX2hzaXplX3QpOworQUNDTElCX0VYVEVSTihpbnQsIGFjY19hc2NpaV9obWVtaWNtcCkgKGNvbnN0IGFjY19odm9pZF9wLCBjb25zdCBhY2NfaHZvaWRfcCwgYWNjX2hzaXplX3QpOworQUNDTElCX0VYVEVSTihhY2NfaGNoYXJfcCwgYWNjX2hzdHJzdHIpIChjb25zdCBhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3ApOworQUNDTElCX0VYVEVSTihhY2NfaGNoYXJfcCwgYWNjX2FzY2lpX2hzdHJpc3RyKSAoY29uc3QgYWNjX2hjaGFyX3AsIGNvbnN0IGFjY19oY2hhcl9wKTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2h2b2lkX3AsIGFjY19obWVtbWVtKSAoY29uc3QgYWNjX2h2b2lkX3AsIGFjY19oc2l6ZV90LCBjb25zdCBhY2NfaHZvaWRfcCwgYWNjX2hzaXplX3QpOworQUNDTElCX0VYVEVSTihhY2NfaHZvaWRfcCwgYWNjX2FzY2lpX2htZW1pbWVtKSAoY29uc3QgYWNjX2h2b2lkX3AsIGFjY19oc2l6ZV90LCBjb25zdCBhY2NfaHZvaWRfcCwgYWNjX2hzaXplX3QpOworQUNDTElCX0VYVEVSTihhY2NfaGNoYXJfcCwgYWNjX2hzdHJjcHkpIChhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3ApOworQUNDTElCX0VYVEVSTihhY2NfaGNoYXJfcCwgYWNjX2hzdHJjYXQpIChhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3ApOworQUNDTElCX0VYVEVSTihhY2NfaHNpemVfdCwgYWNjX2hzdHJsY3B5KSAoYWNjX2hjaGFyX3AsIGNvbnN0IGFjY19oY2hhcl9wLCBhY2NfaHNpemVfdCk7CitBQ0NMSUJfRVhURVJOKGFjY19oc2l6ZV90LCBhY2NfaHN0cmxjYXQpIChhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3AsIGFjY19oc2l6ZV90KTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfaHN0cnNjcHkpIChhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3AsIGFjY19oc2l6ZV90KTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfaHN0cnNjYXQpIChhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3AsIGFjY19oc2l6ZV90KTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2hjaGFyX3AsIGFjY19oc3RyY2NweSkgKGFjY19oY2hhcl9wLCBjb25zdCBhY2NfaGNoYXJfcCwgaW50KTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2h2b2lkX3AsIGFjY19obWVtY2NweSkgKGFjY19odm9pZF9wLCBjb25zdCBhY2NfaHZvaWRfcCwgaW50LCBhY2NfaHNpemVfdCk7CitBQ0NMSUJfRVhURVJOKGFjY19oY2hhcl9wLCBhY2NfaHN0cmNocikgIChjb25zdCBhY2NfaGNoYXJfcCwgaW50KTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2hjaGFyX3AsIGFjY19oc3RycmNocikgKGNvbnN0IGFjY19oY2hhcl9wLCBpbnQpOworQUNDTElCX0VYVEVSTihhY2NfaGNoYXJfcCwgYWNjX2FzY2lpX2hzdHJpY2hyKSAoY29uc3QgYWNjX2hjaGFyX3AsIGludCk7CitBQ0NMSUJfRVhURVJOKGFjY19oY2hhcl9wLCBhY2NfYXNjaWlfaHN0cnJpY2hyKSAoY29uc3QgYWNjX2hjaGFyX3AsIGludCk7CitBQ0NMSUJfRVhURVJOKGFjY19odm9pZF9wLCBhY2NfaG1lbWNocikgIChjb25zdCBhY2NfaHZvaWRfcCwgaW50LCBhY2NfaHNpemVfdCk7CitBQ0NMSUJfRVhURVJOKGFjY19odm9pZF9wLCBhY2NfaG1lbXJjaHIpIChjb25zdCBhY2NfaHZvaWRfcCwgaW50LCBhY2NfaHNpemVfdCk7CitBQ0NMSUJfRVhURVJOKGFjY19odm9pZF9wLCBhY2NfYXNjaWlfaG1lbWljaHIpIChjb25zdCBhY2NfaHZvaWRfcCwgaW50LCBhY2NfaHNpemVfdCk7CitBQ0NMSUJfRVhURVJOKGFjY19odm9pZF9wLCBhY2NfYXNjaWlfaG1lbXJpY2hyKSAoY29uc3QgYWNjX2h2b2lkX3AsIGludCwgYWNjX2hzaXplX3QpOworQUNDTElCX0VYVEVSTihhY2NfaHNpemVfdCwgYWNjX2hzdHJzcG4pICAoY29uc3QgYWNjX2hjaGFyX3AsIGNvbnN0IGFjY19oY2hhcl9wKTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2hzaXplX3QsIGFjY19oc3RycnNwbikgKGNvbnN0IGFjY19oY2hhcl9wLCBjb25zdCBhY2NfaGNoYXJfcCk7CitBQ0NMSUJfRVhURVJOKGFjY19oc2l6ZV90LCBhY2NfaHN0cmNzcG4pICAoY29uc3QgYWNjX2hjaGFyX3AsIGNvbnN0IGFjY19oY2hhcl9wKTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2hzaXplX3QsIGFjY19oc3RycmNzcG4pIChjb25zdCBhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3ApOworQUNDTElCX0VYVEVSTihhY2NfaGNoYXJfcCwgYWNjX2hzdHJwYnJrKSAgKGNvbnN0IGFjY19oY2hhcl9wLCBjb25zdCBhY2NfaGNoYXJfcCk7CitBQ0NMSUJfRVhURVJOKGFjY19oY2hhcl9wLCBhY2NfaHN0cnJwYnJrKSAoY29uc3QgYWNjX2hjaGFyX3AsIGNvbnN0IGFjY19oY2hhcl9wKTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2hjaGFyX3AsIGFjY19oc3Ryc2VwKSAgKGFjY19oY2hhcl9wcCwgY29uc3QgYWNjX2hjaGFyX3ApOworQUNDTElCX0VYVEVSTihhY2NfaGNoYXJfcCwgYWNjX2hzdHJyc2VwKSAoYWNjX2hjaGFyX3BwLCBjb25zdCBhY2NfaGNoYXJfcCk7CitBQ0NMSUJfRVhURVJOKGFjY19oY2hhcl9wLCBhY2NfYXNjaWlfaHN0cmx3cikgKGFjY19oY2hhcl9wKTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2hjaGFyX3AsIGFjY19hc2NpaV9oc3RydXByKSAoYWNjX2hjaGFyX3ApOworQUNDTElCX0VYVEVSTihhY2NfaHZvaWRfcCwgYWNjX2FzY2lpX2htZW1sd3IpIChhY2NfaHZvaWRfcCwgYWNjX2hzaXplX3QpOworQUNDTElCX0VYVEVSTihhY2NfaHZvaWRfcCwgYWNjX2FzY2lpX2htZW11cHIpIChhY2NfaHZvaWRfcCwgYWNjX2hzaXplX3QpOworQUNDTElCX0VYVEVSTihhY2NfaHNpemVfdCwgYWNjX2hmcmVhZCkgKHZvaWQgKiwgYWNjX2h2b2lkX3AsIGFjY19oc2l6ZV90KTsKK0FDQ0xJQl9FWFRFUk4oYWNjX2hzaXplX3QsIGFjY19oZndyaXRlKSAodm9pZCAqLCBjb25zdCBhY2NfaHZvaWRfcCwgYWNjX2hzaXplX3QpOworI2lmIChBQ0NfSEFWRV9NTV9IVUdFX1BUUikKK0FDQ0xJQl9FWFRFUk4obG9uZywgYWNjX2hyZWFkKSAoaW50LCBhY2NfaHZvaWRfcCwgbG9uZyk7CitBQ0NMSUJfRVhURVJOKGxvbmcsIGFjY19od3JpdGUpIChpbnQsIGNvbnN0IGFjY19odm9pZF9wLCBsb25nKTsKKyNlbmRpZgorQUNDTElCX0VYVEVSTihsb25nLCBhY2Nfc2FmZV9ocmVhZCkgKGludCwgYWNjX2h2b2lkX3AsIGxvbmcpOworQUNDTElCX0VYVEVSTihsb25nLCBhY2Nfc2FmZV9od3JpdGUpIChpbnQsIGNvbnN0IGFjY19odm9pZF9wLCBsb25nKTsKK0FDQ0xJQl9FWFRFUk4odW5zaWduZWQsIGFjY191YV9nZXRfYmUxNikgKGNvbnN0IGFjY19odm9pZF9wKTsKK0FDQ0xJQl9FWFRFUk4oYWNjX3VpbnQzMmxfdCwgYWNjX3VhX2dldF9iZTI0KSAoY29uc3QgYWNjX2h2b2lkX3ApOworQUNDTElCX0VYVEVSTihhY2NfdWludDMybF90LCBhY2NfdWFfZ2V0X2JlMzIpIChjb25zdCBhY2NfaHZvaWRfcCk7CitBQ0NMSUJfRVhURVJOKHZvaWQsIGFjY191YV9zZXRfYmUxNikgKGFjY19odm9pZF9wLCB1bnNpZ25lZCk7CitBQ0NMSUJfRVhURVJOKHZvaWQsIGFjY191YV9zZXRfYmUyNCkgKGFjY19odm9pZF9wLCBhY2NfdWludDMybF90KTsKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3VhX3NldF9iZTMyKSAoYWNjX2h2b2lkX3AsIGFjY191aW50MzJsX3QpOworQUNDTElCX0VYVEVSTih1bnNpZ25lZCwgYWNjX3VhX2dldF9sZTE2KSAoY29uc3QgYWNjX2h2b2lkX3ApOworQUNDTElCX0VYVEVSTihhY2NfdWludDMybF90LCBhY2NfdWFfZ2V0X2xlMjQpIChjb25zdCBhY2NfaHZvaWRfcCk7CitBQ0NMSUJfRVhURVJOKGFjY191aW50MzJsX3QsIGFjY191YV9nZXRfbGUzMikgKGNvbnN0IGFjY19odm9pZF9wKTsKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3VhX3NldF9sZTE2KSAoYWNjX2h2b2lkX3AsIHVuc2lnbmVkKTsKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3VhX3NldF9sZTI0KSAoYWNjX2h2b2lkX3AsIGFjY191aW50MzJsX3QpOworQUNDTElCX0VYVEVSTih2b2lkLCBhY2NfdWFfc2V0X2xlMzIpIChhY2NfaHZvaWRfcCwgYWNjX3VpbnQzMmxfdCk7CisjaWYgZGVmaW5lZChhY2NfaW50NjRsX3QpCitBQ0NMSUJfRVhURVJOKGFjY191aW50NjRsX3QsIGFjY191YV9nZXRfYmU2NCkgKGNvbnN0IGFjY19odm9pZF9wKTsKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3VhX3NldF9iZTY0KSAoYWNjX2h2b2lkX3AsIGFjY191aW50NjRsX3QpOworQUNDTElCX0VYVEVSTihhY2NfdWludDY0bF90LCBhY2NfdWFfZ2V0X2xlNjQpIChjb25zdCBhY2NfaHZvaWRfcCk7CitBQ0NMSUJfRVhURVJOKHZvaWQsIGFjY191YV9zZXRfbGU2NCkgKGFjY19odm9pZF9wLCBhY2NfdWludDY0bF90KTsKKyNlbmRpZgorQUNDTElCX0VYVEVSTl9OT0lOTElORShzaG9ydCwgYWNjX3ZnZXRfc2hvcnQpIChzaG9ydCwgaW50KTsKK0FDQ0xJQl9FWFRFUk5fTk9JTkxJTkUoaW50LCBhY2NfdmdldF9pbnQpIChpbnQsIGludCk7CitBQ0NMSUJfRVhURVJOX05PSU5MSU5FKGxvbmcsIGFjY192Z2V0X2xvbmcpIChsb25nLCBpbnQpOworI2lmIGRlZmluZWQoYWNjX2ludDY0bF90KQorQUNDTElCX0VYVEVSTl9OT0lOTElORShhY2NfaW50NjRsX3QsIGFjY192Z2V0X2FjY19pbnQ2NGxfdCkgKGFjY19pbnQ2NGxfdCwgaW50KTsKKyNlbmRpZgorQUNDTElCX0VYVEVSTl9OT0lOTElORShhY2NfaHNpemVfdCwgYWNjX3ZnZXRfYWNjX2hzaXplX3QpIChhY2NfaHNpemVfdCwgaW50KTsKKyNpZiAhZGVmaW5lZChBQ0NfQ0ZHX05PX0ZMT0FUKQorQUNDTElCX0VYVEVSTl9OT0lOTElORShmbG9hdCwgYWNjX3ZnZXRfZmxvYXQpIChmbG9hdCwgaW50KTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19DRkdfTk9fRE9VQkxFKQorQUNDTElCX0VYVEVSTl9OT0lOTElORShkb3VibGUsIGFjY192Z2V0X2RvdWJsZSkgKGRvdWJsZSwgaW50KTsKKyNlbmRpZgorQUNDTElCX0VYVEVSTl9OT0lOTElORShhY2NfaHZvaWRfcCwgYWNjX3ZnZXRfYWNjX2h2b2lkX3ApIChhY2NfaHZvaWRfcCwgaW50KTsKK0FDQ0xJQl9FWFRFUk5fTk9JTkxJTkUoY29uc3QgYWNjX2h2b2lkX3AsIGFjY192Z2V0X2FjY19odm9pZF9jcCkgKGNvbnN0IGFjY19odm9pZF9wLCBpbnQpOworI2lmICFkZWZpbmVkKEFDQ19GTl9QQVRIX01BWCkKKyNpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19XSU4xNikKKyMgIGRlZmluZSBBQ0NfRk5fUEFUSF9NQVggICAxNDMKKyNlbGlmIChBQ0NfT1NfRE9TMzIgfHwgQUNDX09TX09TMiB8fCBBQ0NfT1NfT1MyMTYgfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkKKyMgIGRlZmluZSBBQ0NfRk5fUEFUSF9NQVggICAyNTkKKyNlbGlmIChBQ0NfT1NfVE9TKQorIyAgZGVmaW5lIEFDQ19GTl9QQVRIX01BWCAgIDI1OQorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfRk5fUEFUSF9NQVgpCisjICBkZWZpbmUgQUNDX0ZOX1BBVEhfTUFYICAgMTAyMworI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX0ZOX05BTUVfTUFYKQorI2lmIChBQ0NfT1NfRE9TMTYgfHwgQUNDX09TX1dJTjE2KQorIyAgZGVmaW5lIEFDQ19GTl9OQU1FX01BWCAgIDEyCisjZWxpZiAoQUNDX0FSQ0hfTTY4SyAmJiBBQ0NfT1NfVE9TICYmIChBQ0NfQ0NfUFVSRUMgfHwgQUNDX0NDX1RVUkJPQykpCisjICBkZWZpbmUgQUNDX0ZOX05BTUVfTUFYICAgMTIKKyNlbGlmIChBQ0NfT1NfRE9TMzIgJiYgQUNDX0NDX0dOVUMpICYmIGRlZmluZWQoX19ESkdQUF9fKQorI2VsaWYgKEFDQ19PU19ET1MzMikKKyMgIGRlZmluZSBBQ0NfRk5fTkFNRV9NQVggICAxMgorI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NfRk5fTkFNRV9NQVgpCisjICBkZWZpbmUgQUNDX0ZOX05BTUVfTUFYICAgQUNDX0ZOX1BBVEhfTUFYCisjZW5kaWYKKyNkZWZpbmUgQUNDX0ZOTUFUQ0hfTk9FU0NBUEUgICAgICAgIDEKKyNkZWZpbmUgQUNDX0ZOTUFUQ0hfUEFUSE5BTUUgICAgICAgIDIKKyNkZWZpbmUgQUNDX0ZOTUFUQ0hfUEFUSFNUQVIgICAgICAgIDQKKyNkZWZpbmUgQUNDX0ZOTUFUQ0hfUEVSSU9EICAgICAgICAgIDgKKyNkZWZpbmUgQUNDX0ZOTUFUQ0hfQVNDSUlfQ0FTRUZPTEQgIDE2CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX2ZubWF0Y2gpIChjb25zdCBhY2NfaGNoYXJfcCwgY29uc3QgYWNjX2hjaGFyX3AsIGludCk7CisjdW5kZWYgX19BQ0NMSUJfVVNFX09QRU5ESVIKKyNpZiAoSEFWRV9ESVJFTlRfSCB8fCBBQ0NfQ0NfV0FUQ09NQykKKyMgIGRlZmluZSBfX0FDQ0xJQl9VU0VfT1BFTkRJUiAxCisjICBpZiAoQUNDX09TX0RPUzMyICYmIGRlZmluZWQoX19CT1JMQU5EQ19fKSkKKyMgIGVsaWYgKEFDQ19PU19ET1MzMiAmJiBBQ0NfQ0NfR05VQykgJiYgZGVmaW5lZChfX0RKR1BQX18pCisjICBlbGlmIChBQ0NfT1NfT1MyIHx8IEFDQ19PU19PUzIxNikKKyMgIGVsaWYgKEFDQ19BUkNIX002OEsgJiYgQUNDX09TX1RPUyAmJiBBQ0NfQ0NfR05VQykKKyMgIGVsaWYgKEFDQ19PU19XSU4zMiAmJiAhZGVmaW5lZChBQ0NfSEFWRV9XSU5ET1dTX0gpKQorIyAgZWxpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19ET1MzMiB8fCBBQ0NfT1NfT1MyIHx8IEFDQ19PU19PUzIxNiB8fCBBQ0NfT1NfVE9TIHx8IEFDQ19PU19XSU4xNiB8fCBBQ0NfT1NfV0lOMzIgfHwgQUNDX09TX1dJTjY0KQorIyAgICB1bmRlZiBfX0FDQ0xJQl9VU0VfT1BFTkRJUgorIyAgZW5kaWYKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QKK3sKKyNpZiBkZWZpbmVkKF9fQUNDTElCX1VTRV9PUEVORElSKQorICAgIHZvaWQqIHVfZGlycDsKKyMgaWYgKEFDQ19DQ19XQVRDT01DKQorICAgIHVuc2lnbmVkIHNob3J0IGZfdGltZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBmX2RhdGU7CisgICAgdW5zaWduZWQgbG9uZyBmX3NpemU7CisjIGVuZGlmCisgICAgY2hhciBmX25hbWVbQUNDX0ZOX05BTUVfTUFYKzFdOworI2VsaWYgKEFDQ19PU19XSU4zMiB8fCBBQ0NfT1NfV0lONjQpCisgICAgYWNjbGliX2hhbmRsZV90IHVfaGFuZGxlOworICAgIHVuc2lnbmVkIGZfYXR0cjsKKyAgICB1bnNpZ25lZCBmX3NpemVfbG93OworICAgIHVuc2lnbmVkIGZfc2l6ZV9oaWdoOworICAgIGNoYXIgZl9uYW1lW0FDQ19GTl9OQU1FX01BWCsxXTsKKyNlbGlmIChBQ0NfT1NfRE9TMTYgfHwgQUNDX09TX0RPUzMyIHx8IEFDQ19PU19UT1MgfHwgQUNDX09TX1dJTjE2KQorICAgIGNoYXIgdV9kdGFbMjFdOworICAgIHVuc2lnbmVkIGNoYXIgZl9hdHRyOworICAgIHVuc2lnbmVkIHNob3J0IGZfdGltZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBmX2RhdGU7CisgICAgdW5zaWduZWQgc2hvcnQgZl9zaXplX2xvdzsKKyAgICB1bnNpZ25lZCBzaG9ydCBmX3NpemVfaGlnaDsKKyAgICBjaGFyIGZfbmFtZVtBQ0NfRk5fTkFNRV9NQVgrMV07CisgICAgY2hhciB1X2RpcnA7CisjZWxzZQorICAgIHZvaWQqIHVfZGlycDsKKyAgICBjaGFyIGZfbmFtZVtBQ0NfRk5fTkFNRV9NQVgrMV07CisjZW5kaWYKK30gYWNjX2Rpcl90OworI2lmbmRlZiBhY2NfZGlyX3AKKyNkZWZpbmUgYWNjX2Rpcl9wIGFjY19kaXJfdCAqCisjZW5kaWYKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2Nfb3BlbmRpcikgIChhY2NfZGlyX3AsIGNvbnN0IGNoYXIqKTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfcmVhZGRpcikgIChhY2NfZGlyX3ApOworQUNDTElCX0VYVEVSTihpbnQsIGFjY19jbG9zZWRpcikgKGFjY19kaXJfcCk7CisjaWYgKEFDQ19DQ19HTlVDKSAmJiAoZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKyMgIGRlZmluZSBhY2NfYWxsb2NhKHgpICAgICBfX2J1aWx0aW5fYWxsb2NhKCh4KSkKKyNlbGlmIChBQ0NfQ0NfR05VQykgJiYgKEFDQ19PU19DT05TT0xFX1BTMikKKyMgIGRlZmluZSBhY2NfYWxsb2NhKHgpICAgICBfX2J1aWx0aW5fYWxsb2NhKCh4KSkKKyNlbGlmIChBQ0NfQ0NfQk9STEFOREMgfHwgQUNDX0NDX0xDQykgJiYgZGVmaW5lZChfX2xpbnV4X18pCisjZWxpZiAoSEFWRV9BTExPQ0EpCisjICBkZWZpbmUgYWNjX2FsbG9jYSh4KSAgICAgKCh2b2lkICopIChhbGxvY2EoKHgpKSkpCisjZW5kaWYKKyNpZiAoQUNDX09TX0RPUzMyICYmIEFDQ19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fREpHUFBfXykKKyMgIGRlZmluZSBhY2Nfc3RhY2thdmFpbCgpICBzdGFja2F2YWlsKCkKKyNlbGlmIChBQ0NfQVJDSF9JMDg2ICYmIEFDQ19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fID49IDB4MDQxMCkpCisjICBkZWZpbmUgYWNjX3N0YWNrYXZhaWwoKSAgc3RhY2thdmFpbCgpCisjZWxpZiAoQUNDX0FSQ0hfSTA4NiAmJiBBQ0NfQ0NfQk9STEFOREMgJiYgKF9fQk9STEFORENfXyA+PSAweDA0MDApKQorIyAgaWYgKEFDQ19PU19XSU4xNikgJiYgKEFDQ19NTV9USU5ZIHx8IEFDQ19NTV9TTUFMTCB8fCBBQ0NfTU1fTUVESVVNKQorIyAgZWxzZQorIyAgICBkZWZpbmUgYWNjX3N0YWNrYXZhaWwoKSAgc3RhY2thdmFpbCgpCisjICBlbmRpZgorI2VsaWYgKChBQ0NfQVJDSF9JMDg2IHx8IEFDQ19BUkNIX0kzODYpICYmIChBQ0NfQ0NfRE1DIHx8IEFDQ19DQ19TWU1BTlRFQ0MpKQorIyAgZGVmaW5lIGFjY19zdGFja2F2YWlsKCkgIHN0YWNrYXZhaWwoKQorI2VsaWYgKChBQ0NfQVJDSF9JMDg2KSAmJiBBQ0NfQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSA3MDApKQorIyAgZGVmaW5lIGFjY19zdGFja2F2YWlsKCkgIF9zdGFja2F2YWlsKCkKKyNlbGlmICgoQUNDX0FSQ0hfSTA4NikgJiYgQUNDX0NDX01TQykKKyMgIGRlZmluZSBhY2Nfc3RhY2thdmFpbCgpICBzdGFja2F2YWlsKCkKKyNlbGlmICgoQUNDX0FSQ0hfSTA4NiB8fCBBQ0NfQVJDSF9JMzg2KSAmJiBBQ0NfQ0NfVFVSQk9DICYmIChfX1RVUkJPQ19fID49IDB4MDQ1MCkpCisjICBkZWZpbmUgYWNjX3N0YWNrYXZhaWwoKSAgc3RhY2thdmFpbCgpCisjZWxpZiAoQUNDX0FSQ0hfSTA4NiAmJiBBQ0NfQ0NfVFVSQk9DICYmIChfX1RVUkJPQ19fID49IDB4MDQwMCkpCisgICBBQ0NfRVhURVJOX0Mgc2l6ZV90IF9fY2RlY2wgc3RhY2thdmFpbCh2b2lkKTsKKyMgIGRlZmluZSBhY2Nfc3RhY2thdmFpbCgpICBzdGFja2F2YWlsKCkKKyNlbGlmICgoQUNDX0FSQ0hfSTA4NiB8fCBBQ0NfQVJDSF9JMzg2KSAmJiAoQUNDX0NDX1dBVENPTUMpKQorIyAgZGVmaW5lIGFjY19zdGFja2F2YWlsKCkgIHN0YWNrYXZhaWwoKQorI2VsaWYgKEFDQ19BUkNIX0kwODYgJiYgQUNDX0NDX1pPUlRFQ0hDKQorIyAgZGVmaW5lIGFjY19zdGFja2F2YWlsKCkgIF9jaGtzdGFjaygpCisjZW5kaWYKK0FDQ0xJQl9FWFRFUk4oYWNjbGliX2hhbmRsZV90LCBhY2NfZ2V0X29zZmhhbmRsZSkgKGludCk7CitBQ0NMSUJfRVhURVJOKGNvbnN0IGNoYXIgKiwgYWNjX2dldGVudikgKGNvbnN0IGNoYXIgKik7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX2lzYXR0eSkgKGludCk7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX21rZGlyKSAoY29uc3QgY2hhciosIHVuc2lnbmVkKTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2Nfcm1kaXIpIChjb25zdCBjaGFyKik7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX3Jlc3BvbnNlKSAoaW50KiwgY2hhcioqKik7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX3NldF9iaW5tb2RlKSAoaW50LCBpbnQpOworI2lmIGRlZmluZWQoYWNjX2ludDMyZV90KQorQUNDTElCX0VYVEVSTihhY2NfaW50MzJlX3QsIGFjY19tdWxkaXYzMnMpIChhY2NfaW50MzJlX3QsIGFjY19pbnQzMmVfdCwgYWNjX2ludDMyZV90KTsKK0FDQ0xJQl9FWFRFUk4oYWNjX3VpbnQzMmVfdCwgYWNjX211bGRpdjMydSkgKGFjY191aW50MzJlX3QsIGFjY191aW50MzJlX3QsIGFjY191aW50MzJlX3QpOworI2VuZGlmCitBQ0NMSUJfRVhURVJOKHZvaWQsIGFjY193aWxkYXJndikgKGludCosIGNoYXIqKiopOworQUNDTElCX0VYVEVSTl9OT0lOTElORSh2b2lkLCBhY2NfZGVidWdfYnJlYWspICh2b2lkKTsKK0FDQ0xJQl9FWFRFUk5fTk9JTkxJTkUodm9pZCwgYWNjX2RlYnVnX25vcCkgKHZvaWQpOworQUNDTElCX0VYVEVSTl9OT0lOTElORShpbnQsIGFjY19kZWJ1Z19hbGlnbl9jaGVja19xdWVyeSkgKHZvaWQpOworQUNDTElCX0VYVEVSTl9OT0lOTElORShpbnQsIGFjY19kZWJ1Z19hbGlnbl9jaGVja19lbmFibGUpIChpbnQpOworQUNDTElCX0VYVEVSTl9OT0lOTElORSh1bnNpZ25lZCwgYWNjX2RlYnVnX3J1bm5pbmdfb25fcWVtdSkgKHZvaWQpOworQUNDTElCX0VYVEVSTl9OT0lOTElORSh1bnNpZ25lZCwgYWNjX2RlYnVnX3J1bm5pbmdfb25fdmFsZ3JpbmQpICh2b2lkKTsKKyNpZiAhZGVmaW5lZChhY2NfaW50NjRsX3QpIHx8IGRlZmluZWQoQUNDX0NGR19OT19ET1VCTEUpCisjICB1bmRlZiBfX0FDQ0xJQl9QQ0xPQ0tfVVNFX1JEVFNDCisjICB1bmRlZiBfX0FDQ0xJQl9QQ0xPQ0tfVVNFX1BFUkZDVFIKKyMgIHVuZGVmIF9fQUNDTElCX1VDTE9DS19VU0VfUkRUU0MKKyMgIHVuZGVmIF9fQUNDTElCX1VDTE9DS19VU0VfUEVSRkNUUgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkKiBoOworICAgIGludCBtb2RlOworICAgIGRvdWJsZSB0c2NfdG9fc2Vjb25kczsKKyAgICB1bnNpZ25lZCBjcHVfdHlwZSwgY3B1X2ZlYXR1cmVzLCBjcHVfa2h6LCBjcHVfbnJjdHJzOworICAgIGNvbnN0IGNoYXIqIGNwdV9uYW1lOworfSBhY2NfcGVyZmN0cl9oYW5kbGVfdDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBhY2NfdWludDY0bF90IHRzYzsKKyNpZiAoQUNDX09TX1BPU0lYX0xJTlVYKQorICAgIGFjY191aW50NjRsX3QgcG1jWzE4XTsKKyNlbHNlCisgICAgYWNjX3VpbnQ2NGxfdCBwbWNbMV07CisjZW5kaWYKK30gYWNjX3BlcmZjdHJfY2xvY2tfdDsKKyNpZm5kZWYgYWNjX3BlcmZjdHJfaGFuZGxlX3AKKyNkZWZpbmUgYWNjX3BlcmZjdHJfaGFuZGxlX3AgYWNjX3BlcmZjdHJfaGFuZGxlX3QgKgorI2VuZGlmCisjaWZuZGVmIGFjY19wZXJmY3RyX2Nsb2NrX3AKKyNkZWZpbmUgYWNjX3BlcmZjdHJfY2xvY2tfcCBhY2NfcGVyZmN0cl9jbG9ja190ICoKKyNlbmRpZgorQUNDTElCX0VYVEVSTihpbnQsIGFjY19wZXJmY3RyX29wZW4pICAoYWNjX3BlcmZjdHJfaGFuZGxlX3ApOworQUNDTElCX0VYVEVSTihpbnQsIGFjY19wZXJmY3RyX2Nsb3NlKSAoYWNjX3BlcmZjdHJfaGFuZGxlX3ApOworQUNDTElCX0VYVEVSTih2b2lkLCBhY2NfcGVyZmN0cl9yZWFkKSAoYWNjX3BlcmZjdHJfaGFuZGxlX3AsIGFjY19wZXJmY3RyX2Nsb2NrX3ApOworI2lmICFkZWZpbmVkKEFDQ19DRkdfTk9fRE9VQkxFKQorQUNDTElCX0VYVEVSTihkb3VibGUsIGFjY19wZXJmY3RyX2dldF9lbGFwc2VkKSAoYWNjX3BlcmZjdHJfaGFuZGxlX3AsIGNvbnN0IGFjY19wZXJmY3RyX2Nsb2NrX3AsIGNvbnN0IGFjY19wZXJmY3RyX2Nsb2NrX3ApOworQUNDTElCX0VYVEVSTihkb3VibGUsIGFjY19wZXJmY3RyX2dldF9lbGFwc2VkX3RzYykgKGFjY19wZXJmY3RyX2hhbmRsZV9wLCBhY2NfdWludDY0bF90KTsKKyNlbmRpZgorQUNDTElCX0VYVEVSTihpbnQsIGFjY19wZXJmY3RyX2ZsdXNoX2NwdV9jYWNoZSkgKGFjY19wZXJmY3RyX2hhbmRsZV9wLCB1bnNpZ25lZCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKGFjY19pbnQzMmVfdCkKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfdHNjX3JlYWQpIChhY2NfdWludDMyZV90Kik7CisjZWxzZQorIyAgdW5kZWYgX19BQ0NMSUJfUENMT0NLX1VTRV9SRFRTQworIyAgdW5kZWYgX19BQ0NMSUJfVUNMT0NLX1VTRV9SRFRTQworI2VuZGlmCitzdHJ1Y3QgYWNjX3BjbG9ja19oYW5kbGVfdDsKK3N0cnVjdCBhY2NfcGNsb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCBhY2NfcGNsb2NrX2hhbmRsZV90IGFjY19wY2xvY2tfaGFuZGxlX3Q7Cit0eXBlZGVmIHN0cnVjdCBhY2NfcGNsb2NrX3QgYWNjX3BjbG9ja190OworI2lmbmRlZiBhY2NfcGNsb2NrX2hhbmRsZV9wCisjZGVmaW5lIGFjY19wY2xvY2tfaGFuZGxlX3AgYWNjX3BjbG9ja19oYW5kbGVfdCAqCisjZW5kaWYKKyNpZm5kZWYgYWNjX3BjbG9ja19wCisjZGVmaW5lIGFjY19wY2xvY2tfcCBhY2NfcGNsb2NrX3QgKgorI2VuZGlmCisjZGVmaW5lIEFDQ19QQ0xPQ0tfUkVBTFRJTUUgICAgICAgICAgICAgMAorI2RlZmluZSBBQ0NfUENMT0NLX01PTk9UT05JQyAgICAgICAgICAgIDEKKyNkZWZpbmUgQUNDX1BDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQgICAyCisjZGVmaW5lIEFDQ19QQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQgICAgMworI2RlZmluZSBBQ0NfUENMT0NLX1JFQUxUSU1FX0hSICAgICAgICAgIDQKKyNkZWZpbmUgQUNDX1BDTE9DS19NT05PVE9OSUNfSFIgICAgICAgICA1CitzdHJ1Y3QgYWNjX3BjbG9ja19oYW5kbGVfdCB7CisgICAgYWNjbGliX2hhbmRsZV90IGg7CisgICAgaW50IG1vZGU7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBpbnQgKCpnZXR0aW1lKSAoYWNjX3BjbG9ja19oYW5kbGVfcCwgYWNjX3BjbG9ja19wKTsKKyNpZiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyAgICBhY2NfdWludDY0bF90IHRpY2tzX2Jhc2U7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQUNDTElCX1BDTE9DS19VU0VfUEVSRkNUUikKKyAgICBhY2NfcGVyZmN0cl9oYW5kbGVfdCBwY2g7CisjZW5kaWYKK307CitzdHJ1Y3QgYWNjX3BjbG9ja190IHsKKyNpZiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyAgICBhY2NfaW50NjRsX3QgdHZfc2VjOworI2Vsc2UKKyAgICBhY2NfaW50MzJsX3QgdHZfc2VjX2hpZ2g7CisgICAgYWNjX3VpbnQzMmxfdCB0dl9zZWNfbG93OworI2VuZGlmCisgICAgYWNjX3VpbnQzMmxfdCB0dl9uc2VjOworfTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfcGNsb2NrX29wZW4pICAoYWNjX3BjbG9ja19oYW5kbGVfcCwgaW50KTsKK0FDQ0xJQl9FWFRFUk4oaW50LCBhY2NfcGNsb2NrX29wZW5fZGVmYXVsdCkgKGFjY19wY2xvY2tfaGFuZGxlX3ApOworQUNDTElCX0VYVEVSTihpbnQsIGFjY19wY2xvY2tfY2xvc2UpIChhY2NfcGNsb2NrX2hhbmRsZV9wKTsKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3BjbG9ja19yZWFkKSAoYWNjX3BjbG9ja19oYW5kbGVfcCwgYWNjX3BjbG9ja19wKTsKKyNpZiAhZGVmaW5lZChBQ0NfQ0ZHX05PX0RPVUJMRSkKK0FDQ0xJQl9FWFRFUk4oZG91YmxlLCBhY2NfcGNsb2NrX2dldF9lbGFwc2VkKSAoYWNjX3BjbG9ja19oYW5kbGVfcCwgY29uc3QgYWNjX3BjbG9ja19wLCBjb25zdCBhY2NfcGNsb2NrX3ApOworI2VuZGlmCitBQ0NMSUJfRVhURVJOKGludCwgYWNjX3BjbG9ja19mbHVzaF9jcHVfY2FjaGUpIChhY2NfcGNsb2NrX2hhbmRsZV9wLCB1bnNpZ25lZCk7CisjaWYgIWRlZmluZWQoYWNjX2ludDY0bF90KSB8fCBkZWZpbmVkKEFDQ19DRkdfTk9fRE9VQkxFKQorIyAgdW5kZWYgX19BQ0NMSUJfVUNMT0NLX1VTRV9RUEMKKyNlbGlmIChBQ0NfT1NfQ1lHV0lOIHx8IEFDQ19PU19FTVggfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkgJiYgKEFDQ19IQVZFX1dJTkRPV1NfSCkKKyMgIGRlZmluZSBfX0FDQ0xJQl9VQ0xPQ0tfVVNFX1FQQyAxCisjZWxzZQorIyAgdW5kZWYgX19BQ0NMSUJfVUNMT0NLX1VTRV9RUEMKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICAgIGFjY2xpYl9oYW5kbGVfdCBoOworICAgIGludCBtb2RlOworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisjaWYgZGVmaW5lZChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX1BFUkZDVFIpCisgICAgYWNjX3BlcmZjdHJfaGFuZGxlX3QgcGNoOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX1FQQykKKyAgICBkb3VibGUgcXBmOworI2VuZGlmCit9IGFjY191Y2xvY2tfaGFuZGxlX3Q7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5pb24geworICAgICAgICBhY2NfdWludDMybF90IHQzMjsKKyNpZiAhKEFDQ19PU19ET1MxNiB8fCBBQ0NfT1NfV0lOMTYpCisjICBpZiAhZGVmaW5lZChBQ0NfQ0ZHX05PX0RPVUJMRSkKKyAgICAgICAgZG91YmxlIHRkOworIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoYWNjX2ludDY0bF90KQorICAgICAgICBhY2NfaW50NjRsX3QgdDY0OworIyAgZW5kaWYKKyNlbmRpZgorICAgIH0gdGlja3M7CisjaWYgZGVmaW5lZChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX1JEVFNDKQorICAgIGFjY191aW50NjRsX3QgdHNjOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX1BFUkZDVFIpCisgICAgYWNjX3BlcmZjdHJfY2xvY2tfdCBwY2M7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQUNDTElCX1VDTE9DS19VU0VfUVBDKQorICAgIGFjY19pbnQ2NGxfdCBxcGM7CisjZW5kaWYKK30gYWNjX3VjbG9ja190OworI2lmbmRlZiBhY2NfdWNsb2NrX2hhbmRsZV9wCisjZGVmaW5lIGFjY191Y2xvY2tfaGFuZGxlX3AgYWNjX3VjbG9ja19oYW5kbGVfdCAqCisjZW5kaWYKKyNpZm5kZWYgYWNjX3VjbG9ja19wCisjZGVmaW5lIGFjY191Y2xvY2tfcCBhY2NfdWNsb2NrX3QgKgorI2VuZGlmCitBQ0NMSUJfRVhURVJOKGludCwgYWNjX3VjbG9ja19vcGVuKSAgKGFjY191Y2xvY2tfaGFuZGxlX3ApOworQUNDTElCX0VYVEVSTihpbnQsIGFjY191Y2xvY2tfY2xvc2UpIChhY2NfdWNsb2NrX2hhbmRsZV9wKTsKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3VjbG9ja19yZWFkKSAoYWNjX3VjbG9ja19oYW5kbGVfcCwgYWNjX3VjbG9ja19wKTsKKyNpZiAhZGVmaW5lZChBQ0NfQ0ZHX05PX0RPVUJMRSkKK0FDQ0xJQl9FWFRFUk4oZG91YmxlLCBhY2NfdWNsb2NrX2dldF9lbGFwc2VkKSAoYWNjX3VjbG9ja19oYW5kbGVfcCwgY29uc3QgYWNjX3VjbG9ja19wLCBjb25zdCBhY2NfdWNsb2NrX3ApOworI2VuZGlmCitBQ0NMSUJfRVhURVJOKGludCwgYWNjX3VjbG9ja19mbHVzaF9jcHVfY2FjaGUpIChhY2NfdWNsb2NrX2hhbmRsZV9wLCB1bnNpZ25lZCk7CitzdHJ1Y3QgYWNjX2dldG9wdF90OwordHlwZWRlZiBzdHJ1Y3QgYWNjX2dldG9wdF90IGFjY19nZXRvcHRfdDsKKyNpZm5kZWYgYWNjX2dldG9wdF9wCisjZGVmaW5lIGFjY19nZXRvcHRfcCBhY2NfZ2V0b3B0X3QgKgorI2VuZGlmCitzdHJ1Y3QgYWNjX2dldG9wdF9sb25nb3B0X3Q7Cit0eXBlZGVmIHN0cnVjdCBhY2NfZ2V0b3B0X2xvbmdvcHRfdCBhY2NfZ2V0b3B0X2xvbmdvcHRfdDsKKyNpZm5kZWYgYWNjX2dldG9wdF9sb25nb3B0X3AKKyNkZWZpbmUgYWNjX2dldG9wdF9sb25nb3B0X3AgYWNjX2dldG9wdF9sb25nb3B0X3QgKgorI2VuZGlmCitzdHJ1Y3QgYWNjX2dldG9wdF9sb25nb3B0X3QgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgaW50IGhhc19hcmc7CisgICAgaW50KiBmbGFnOworICAgIGludCB2YWw7Cit9Oworc3RydWN0IGFjY19nZXRvcHRfdCB7CisgICAgdm9pZCAqdXNlcjsKKyAgICBjaGFyICpvcHRhcmc7CisgICAgdm9pZCAoKm9wdGVycikoYWNjX2dldG9wdF9wLCBjb25zdCBjaGFyKiwgdm9pZCAqKTsKKyAgICBpbnQgb3B0aW5kOworICAgIGludCBvcHRvcHQ7CisgICAgaW50IGVycmNvdW50OworICAgIGNvbnN0IGNoYXIqIHByb2duYW1lOworICAgIGludCBhcmdjOyBjaGFyKiogYXJndjsKKyAgICBpbnQgZW9mOyBpbnQgc2hvcnRwb3M7CisgICAgaW50IHBlbmRpbmdfcm90YXRlX2ZpcnN0LCBwZW5kaW5nX3JvdGF0ZV9taWRkbGU7Cit9OworZW51bSB7IEFDQ19HRVRPUFRfTk9fQVJHLCBBQ0NfR0VUT1BUX1JFUVVJUkVEX0FSRywgQUNDX0dFVE9QVF9PUFRJT05BTF9BUkcsIEFDQ19HRVRPUFRfRVhBQ1RfQVJHID0gMHgxMCB9OworZW51bSB7IEFDQ19HRVRPUFRfUEVSTVVURSwgQUNDX0dFVE9QVF9SRVRVUk5fSU5fT1JERVIsIEFDQ19HRVRPUFRfUkVRVUlSRV9PUkRFUiB9OworQUNDTElCX0VYVEVSTih2b2lkLCBhY2NfZ2V0b3B0X2luaXQpIChhY2NfZ2V0b3B0X3AgZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2FyZ2MsIGludCBhcmdjLCBjaGFyKiogYXJndik7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX2dldG9wdCkgKGFjY19nZXRvcHRfcCBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaG9ydG9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY19nZXRvcHRfbG9uZ29wdF9wIGxvbmdvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxvbmdpbmQpOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGFjY191aW50MzJsX3Qgc2VlZDsKK30gYWNjX3JhbmQzMV90OworI2lmbmRlZiBhY2NfcmFuZDMxX3AKKyNkZWZpbmUgYWNjX3JhbmQzMV9wIGFjY19yYW5kMzFfdCAqCisjZW5kaWYKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3NyYW5kMzEpIChhY2NfcmFuZDMxX3AsIGFjY191aW50MzJsX3QpOworQUNDTElCX0VYVEVSTihhY2NfdWludDMybF90LCBhY2NfcmFuZDMxKSAoYWNjX3JhbmQzMV9wKTsKKyNpZiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBhY2NfdWludDY0bF90IHNlZWQ7Cit9IGFjY19yYW5kNDhfdDsKKyNpZm5kZWYgYWNjX3JhbmQ0OF9wCisjZGVmaW5lIGFjY19yYW5kNDhfcCBhY2NfcmFuZDQ4X3QgKgorI2VuZGlmCitBQ0NMSUJfRVhURVJOKHZvaWQsIGFjY19zcmFuZDQ4KSAoYWNjX3JhbmQ0OF9wLCBhY2NfdWludDMybF90KTsKK0FDQ0xJQl9FWFRFUk4oYWNjX3VpbnQzMmxfdCwgYWNjX3JhbmQ0OCkgKGFjY19yYW5kNDhfcCk7CitBQ0NMSUJfRVhURVJOKGFjY191aW50MzJsX3QsIGFjY19yYW5kNDhfcjMyKSAoYWNjX3JhbmQ0OF9wKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoYWNjX2ludDY0bF90KQordHlwZWRlZiBzdHJ1Y3QgeworICAgIGFjY191aW50NjRsX3Qgc2VlZDsKK30gYWNjX3JhbmQ2NF90OworI2lmbmRlZiBhY2NfcmFuZDY0X3AKKyNkZWZpbmUgYWNjX3JhbmQ2NF9wIGFjY19yYW5kNjRfdCAqCisjZW5kaWYKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3NyYW5kNjQpIChhY2NfcmFuZDY0X3AsIGFjY191aW50NjRsX3QpOworQUNDTElCX0VYVEVSTihhY2NfdWludDMybF90LCBhY2NfcmFuZDY0KSAoYWNjX3JhbmQ2NF9wKTsKK0FDQ0xJQl9FWFRFUk4oYWNjX3VpbnQzMmxfdCwgYWNjX3JhbmQ2NF9yMzIpIChhY2NfcmFuZDY0X3ApOworI2VuZGlmCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgbjsKKyAgICBhY2NfdWludDMybF90IHNbNjI0XTsKK30gYWNjX3JhbmRtdF90OworI2lmbmRlZiBhY2NfcmFuZG10X3AKKyNkZWZpbmUgYWNjX3JhbmRtdF9wIGFjY19yYW5kbXRfdCAqCisjZW5kaWYKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3NyYW5kbXQpIChhY2NfcmFuZG10X3AsIGFjY191aW50MzJsX3QpOworQUNDTElCX0VYVEVSTihhY2NfdWludDMybF90LCBhY2NfcmFuZG10KSAoYWNjX3JhbmRtdF9wKTsKK0FDQ0xJQl9FWFRFUk4oYWNjX3VpbnQzMmxfdCwgYWNjX3JhbmRtdF9yMzIpIChhY2NfcmFuZG10X3ApOworI2lmIGRlZmluZWQoYWNjX2ludDY0bF90KQordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIG47CisgICAgYWNjX3VpbnQ2NGxfdCBzWzMxMl07Cit9IGFjY19yYW5kbXQ2NF90OworI2lmbmRlZiBhY2NfcmFuZG10NjRfcAorI2RlZmluZSBhY2NfcmFuZG10NjRfcCBhY2NfcmFuZG10NjRfdCAqCisjZW5kaWYKK0FDQ0xJQl9FWFRFUk4odm9pZCwgYWNjX3NyYW5kbXQ2NCkgKGFjY19yYW5kbXQ2NF9wLCBhY2NfdWludDY0bF90KTsKK0FDQ0xJQl9FWFRFUk4oYWNjX3VpbnQ2NGxfdCwgYWNjX3JhbmRtdDY0X3I2NCkgKGFjY19yYW5kbXQ2NF9wKTsKKyNlbmRpZgorI2RlZmluZSBBQ0NfU1BBV05fUF9XQUlUICAgIDAKKyNkZWZpbmUgQUNDX1NQQVdOX1BfTk9XQUlUICAxCitBQ0NMSUJfRVhURVJOKGludCwgYWNjX3NwYXdudikgIChpbnQgbW9kZSwgY29uc3QgY2hhciogZm4sIGNvbnN0IGNoYXIqIGNvbnN0ICogYXJndik7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX3NwYXdudnApIChpbnQgbW9kZSwgY29uc3QgY2hhciogZm4sIGNvbnN0IGNoYXIqIGNvbnN0ICogYXJndik7CitBQ0NMSUJfRVhURVJOKGludCwgYWNjX3NwYXdudmUpIChpbnQgbW9kZSwgY29uc3QgY2hhciogZm4sIGNvbnN0IGNoYXIqIGNvbnN0ICogYXJndiwgY29uc3QgY2hhciAqIGNvbnN0IGVudnApOworI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19XQU5UX0FDQ19DWFhfSCkKKyMgIHVuZGVmIEFDQ19XQU5UX0FDQ19DWFhfSAorI2lmbmRlZiBfX0FDQ19DWFhfSF9JTkNMVURFRAorI2RlZmluZSBfX0FDQ19DWFhfSF9JTkNMVURFRCAxCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNpZiBkZWZpbmVkKEFDQ19DWFhfTk9USFJPVykKKyNlbGlmIChBQ0NfQ0NfR05VQyAmJiAoQUNDX0NDX0dOVUMgPCAweDAyMDgwMHVsKSkKKyNlbGlmIChBQ0NfQ0NfQk9STEFOREMgJiYgKF9fQk9STEFORENfXyA8IDB4MDQ1MCkpCisjZWxpZiAoQUNDX0NDX0hJR0hDKQorI2VsaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSIDwgMTEwMCkpCisjZWxpZiAoQUNDX0NDX05EUEMpCisjZWxpZiAoQUNDX0NDX1RVUkJPQykKKyNlbGlmIChBQ0NfQ0NfV0FUQ09NQyAmJiAhZGVmaW5lZChfQ1BQVU5XSU5EKSkKKyNlbGlmIChBQ0NfQ0NfWk9SVEVDSEMpCisjZWxzZQorIyAgZGVmaW5lIEFDQ19DWFhfTk9USFJPVyAgIHRocm93KCkKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19DWFhfTk9USFJPVykKKyMgIGRlZmluZSBBQ0NfQ1hYX05PVEhST1cKKyNlbmRpZgorI2lmIGRlZmluZWQoX19BQ0NfQ1hYX0RPX05FVykKKyNlbGlmIChBQ0NfQ0NfTkRQQyB8fCBBQ0NfQ0NfUEdJKQorIyAgZGVmaW5lIF9fQUNDX0NYWF9ET19ORVcgICAgICAgICAgeyByZXR1cm4gMDsgfQorI2VsaWYgKChBQ0NfQ0NfQk9STEFOREMgfHwgQUNDX0NDX1RVUkJPQykgJiYgQUNDX0FSQ0hfSTA4NikKKyMgIGRlZmluZSBfX0FDQ19DWFhfRE9fTkVXICAgICAgICAgIHsgcmV0dXJuIDA7IH0KKyNlbHNlCisjICBkZWZpbmUgX19BQ0NfQ1hYX0RPX05FVyAgICAgICAgICA7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQUNDX0NYWF9ET19ERUxFVEUpCisjZWxpZiAoQUNDX0NDX0JPUkxBTkRDIHx8IEFDQ19DQ19UVVJCT0MpCisjICBkZWZpbmUgX19BQ0NfQ1hYX0RPX0RFTEVURSAgICAgICB7IH0KKyNlbHNlCisjICBkZWZpbmUgX19BQ0NfQ1hYX0RPX0RFTEVURSAgICAgICBBQ0NfQ1hYX05PVEhST1cgeyB9CisjZW5kaWYKKyNpZiAoQUNDX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPCAweDA0NTApKQorI2VsaWYgKEFDQ19DQ19NU0MgJiYgQUNDX01NX0hVR0UpCisjICBkZWZpbmUgQUNDX0NYWF9ESVNBQkxFX05FV19ERUxFVEUgcHJpdmF0ZToKKyNlbGlmIChBQ0NfQ0NfTVNDICYmIChfTVNDX1ZFUiA8IDExMDApKQorI2VsaWYgKEFDQ19DQ19ORFBDKQorI2VsaWYgKEFDQ19DQ19TWU1BTlRFQ0MgfHwgQUNDX0NDX1pPUlRFQ0hDKQorI2VsaWYgKEFDQ19DQ19UVVJCT0MpCisjZWxpZiAoQUNDX0NDX1dBVENPTUMgJiYgKF9fV0FUQ09NQ19fIDwgMTEwMCkpCisjZWxzZQorIyAgZGVmaW5lIF9fQUNDX0NYWF9IQVZFX0FSUkFZX05FVyAxCisjZW5kaWYKKyNpZiAoX19BQ0NfQ1hYX0hBVkVfQVJSQVlfTkVXKQorIyAgZGVmaW5lIF9fQUNDX0NYWF9IQVZFX1BMQUNFTUVOVF9ORVcgMQorI2VuZGlmCisjaWYgKF9fQUNDX0NYWF9IQVZFX1BMQUNFTUVOVF9ORVcpCisjICBpZiAoQUNDX0NDX0dOVUMgPj0gMHgwMzAwMDB1bCkKKyMgICAgZGVmaW5lIF9fQUNDX0NYWF9IQVZFX1BMQUNFTUVOVF9ERUxFVEUgMQorIyAgZWxpZiAoQUNDX0NDX0lOVEVMQykKKyMgICAgZGVmaW5lIF9fQUNDX0NYWF9IQVZFX1BMQUNFTUVOVF9ERUxFVEUgMQorIyAgZWxpZiAoQUNDX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTIwMCkpCisjICAgIGRlZmluZSBfX0FDQ19DWFhfSEFWRV9QTEFDRU1FTlRfREVMRVRFIDEKKyMgIGVsaWYgKEFDQ19DQ19MTFZNIHx8IEFDQ19DQ19QQVRIU0NBTEUpCisjICAgIGRlZmluZSBfX0FDQ19DWFhfSEFWRV9QTEFDRU1FTlRfREVMRVRFIDEKKyMgIGVsaWYgKEFDQ19DQ19QR0kpCisjICAgIGRlZmluZSBfX0FDQ19DWFhfSEFWRV9QTEFDRU1FTlRfREVMRVRFIDEKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19DWFhfRElTQUJMRV9ORVdfREVMRVRFKQorI2VsaWYgZGVmaW5lZChuZXcpIHx8IGRlZmluZWQoZGVsZXRlKQorIyAgZGVmaW5lIEFDQ19DWFhfRElTQUJMRV9ORVdfREVMRVRFIHByaXZhdGU6CisjZWxpZiAoQUNDX0NDX0dOVUMgJiYgKEFDQ19DQ19HTlVDIDwgMHgwMjViMDB1bCkpCisjICBkZWZpbmUgQUNDX0NYWF9ESVNBQkxFX05FV19ERUxFVEUgcHJpdmF0ZToKKyNlbGlmICAoQUNDX0NDX0hJR0hDKQorIyAgZGVmaW5lIEFDQ19DWFhfRElTQUJMRV9ORVdfREVMRVRFIHByaXZhdGU6CisjZWxpZiAhZGVmaW5lZChfX0FDQ19DWFhfSEFWRV9BUlJBWV9ORVcpCisjICBkZWZpbmUgQUNDX0NYWF9ESVNBQkxFX05FV19ERUxFVEUgXAorICAgICAgICBwcm90ZWN0ZWQ6IHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKikgX19BQ0NfQ1hYX0RPX0RFTEVURSBcCisgICAgICAgIHByb3RlY3RlZDogc3RhdGljIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QpIF9fQUNDX0NYWF9ET19ORVcgXAorICAgICAgICBwcml2YXRlOgorI2Vsc2UKKyMgIGRlZmluZSBBQ0NfQ1hYX0RJU0FCTEVfTkVXX0RFTEVURSBcCisgICAgICAgIHByb3RlY3RlZDogc3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqKSBfX0FDQ19DWFhfRE9fREVMRVRFIFwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKikgX19BQ0NfQ1hYX0RPX0RFTEVURSBcCisgICAgICAgIHByaXZhdGU6ICAgc3RhdGljIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QpICBfX0FDQ19DWFhfRE9fTkVXIFwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCogb3BlcmF0b3IgbmV3W10oc2l6ZV90KSBfX0FDQ19DWFhfRE9fTkVXCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19DWFhfVFJJR0dFUl9GVU5DVElPTikKKyNlbHNlCisjICBkZWZpbmUgQUNDX0NYWF9UUklHR0VSX0ZVTkNUSU9OIFwKKyAgICAgICAgcHJvdGVjdGVkOiB2aXJ0dWFsIGNvbnN0IHZvaWQqIGFjY19jeHhfdHJpZ2dlcl9mdW5jdGlvbigpIGNvbnN0OyBcCisgICAgICAgIHByaXZhdGU6CisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19DWFhfVFJJR0dFUl9GVU5DVElPTl9JTVBMKQorI2Vsc2UKKyMgIGRlZmluZSBBQ0NfQ1hYX1RSSUdHRVJfRlVOQ1RJT05fSU1QTChrbGFzcykgXAorICAgICAgICBjb25zdCB2b2lkKiBrbGFzczo6YWNjX2N4eF90cmlnZ2VyX2Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gMDsgfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfV0FOVF9BQ0NfQ0hLX0NIKQorIyAgdW5kZWYgQUNDX1dBTlRfQUNDX0NIS19DSAorI2lmICFkZWZpbmVkKEFDQ0NIS19BU1NFUlQpCisjICBkZWZpbmUgQUNDQ0hLX0FTU0VSVChleHByKSAgIEFDQ19DT01QSUxFX1RJTUVfQVNTRVJUX0hFQURFUihleHByKQorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDQ0hLX0FTU0VSVF9TSUdOX1QpCisjICBkZWZpbmUgQUNDQ0hLX0FTU0VSVF9TSUdOX1QodHlwZSxyZWxvcCkgXAorICAgICAgICBBQ0NDSEtfQVNTRVJUKCAodHlwZSkgKC0xKSAgICAgICByZWxvcCAgKHR5cGUpIDAgKSBcCisgICAgICAgIEFDQ0NIS19BU1NFUlQoICh0eXBlKSAofih0eXBlKTApIHJlbG9wICAodHlwZSkgMCApIFwKKyAgICAgICAgQUNDQ0hLX0FTU0VSVCggKHR5cGUpICh+KHR5cGUpMCkgPT0gICAgICh0eXBlKSAoLTEpICkKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ0NIS19BU1NFUlRfSVNfU0lHTkVEX1QpCisjICBkZWZpbmUgQUNDQ0hLX0FTU0VSVF9JU19TSUdORURfVCh0eXBlKSAgICAgICBBQ0NDSEtfQVNTRVJUX1NJR05fVCh0eXBlLDwpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NDSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QpCisjICBpZiAoQUNDX0JST0tFTl9JTlRFR1JBTF9QUk9NT1RJT04pCisjICAgIGRlZmluZSBBQ0NDSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QodHlwZSkgXAorICAgICAgICBBQ0NDSEtfQVNTRVJUKCAodHlwZSkgKC0xKSA+ICh0eXBlKSAwICkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ0NIS19BU1NFUlRfSVNfVU5TSUdORURfVCh0eXBlKSAgIEFDQ0NIS19BU1NFUlRfU0lHTl9UKHR5cGUsPikKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoQUNDX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNTUwKSAmJiAoX19CT1JMQU5EQ19fIDwgMHgwNTYwKSkKKyMgIHByYWdtYSBvcHRpb24gcHVzaCAtdy04MDU1CisjZWxpZiAoQUNDX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNTMwKSAmJiAoX19CT1JMQU5EQ19fIDwgMHgwNTUwKSkKKyMgIHByYWdtYSBvcHRpb24gcHVzaCAtdy1vc2gKKyNlbmRpZgorI2lmIChBQ0NfMHhmZmZmZmZmZkwgLSBBQ0NfVUlOVDMyX0MoNDI5NDk2NzI5NCkgIT0gMSkKKyMgIGVycm9yICJwcmVwcm9jZXNzb3IgZXJyb3IgMSIKKyNlbmRpZgorI2lmIChBQ0NfMHhmZmZmZmZmZkwgLSBBQ0NfVUlOVDMyX0MoMHhmZmZmZmZmZCkgIT0gMikKKyMgIGVycm9yICJwcmVwcm9jZXNzb3IgZXJyb3IgMiIKKyNlbmRpZgorI2RlZmluZSBBQ0NDSEtfVkFMICAxCisjZGVmaW5lIEFDQ0NIS19UTVAxIEFDQ0NIS19WQUwKKyN1bmRlZiBBQ0NDSEtfVkFMCisjZGVmaW5lIEFDQ0NIS19WQUwgIDIKKyNkZWZpbmUgQUNDQ0hLX1RNUDIgQUNDQ0hLX1ZBTAorI2lmIChBQ0NDSEtfVE1QMSAhPSAyKQorIyAgZXJyb3IgInByZXByb2Nlc3NvciBlcnJvciAzYSIKKyNlbmRpZgorI2lmIChBQ0NDSEtfVE1QMiAhPSAyKQorIyAgZXJyb3IgInByZXByb2Nlc3NvciBlcnJvciAzYiIKKyNlbmRpZgorI3VuZGVmIEFDQ0NIS19WQUwKKyNpZiAoQUNDQ0hLX1RNUDIpCisjICBlcnJvciAicHJlcHJvY2Vzc29yIGVycm9yIDNjIgorI2VuZGlmCisjaWYgKEFDQ0NIS19UTVAyICsgMCAhPSAwKQorIyAgZXJyb3IgInByZXByb2Nlc3NvciBlcnJvciAzZCIKKyNlbmRpZgorI3VuZGVmIEFDQ0NIS19UTVAxCisjdW5kZWYgQUNDQ0hLX1RNUDIKKyNpZiAwIHx8IGRlZmluZWQoQUNDQ0hLX0NGR19QRURBTlRJQykKKyMgIGlmIChBQ0NfQVJDSF9NSVBTKSAmJiBkZWZpbmVkKF9NSVBTX1NaSU5UKQorICAgIEFDQ0NIS19BU1NFUlQoKF9NSVBTX1NaSU5UKSA9PSA4ICogc2l6ZW9mKGludCkpCisjICBlbmRpZgorIyAgaWYgKEFDQ19BUkNIX01JUFMpICYmIGRlZmluZWQoX01JUFNfU1pMT05HKQorICAgIEFDQ0NIS19BU1NFUlQoKF9NSVBTX1NaTE9ORykgPT0gOCAqIHNpemVvZihsb25nKSkKKyMgIGVuZGlmCisjICBpZiAoQUNDX0FSQ0hfTUlQUykgJiYgZGVmaW5lZChfTUlQU19TWlBUUikKKyAgICBBQ0NDSEtfQVNTRVJUKChfTUlQU19TWlBUUikgPT0gOCAqIHNpemVvZih2b2lkICopKQorIyAgZW5kaWYKKyNlbmRpZgorICAgIEFDQ0NIS19BU1NFUlQoMSA9PSAxKQorICAgIEFDQ0NIS19BU1NFUlQoX19BQ0NfTUFTS19HRU4oMXUsMikgPT0gMykKKyAgICBBQ0NDSEtfQVNTRVJUKF9fQUNDX01BU0tfR0VOKDF1LDgpID09IDI1NSkKKyNpZiAoU0laRU9GX0lOVCA+PSAyKQorICAgIEFDQ0NIS19BU1NFUlQoX19BQ0NfTUFTS19HRU4oMSwxNSkgPT0gMzI3NjcpCisgICAgQUNDQ0hLX0FTU0VSVChfX0FDQ19NQVNLX0dFTigxdSwxNikgPT0gMHhmZmZmVSkKKyNlbHNlCisgICAgQUNDQ0hLX0FTU0VSVChfX0FDQ19NQVNLX0dFTigxdWwsMTYpID09IDB4ZmZmZlVMKQorI2VuZGlmCisjaWYgKFNJWkVPRl9JTlQgPj0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKF9fQUNDX01BU0tfR0VOKDEsMzEpID09IDIxNDc0ODM2NDcpCisgICAgQUNDQ0hLX0FTU0VSVChfX0FDQ19NQVNLX0dFTigxdSwzMikgPT0gMHhmZmZmZmZmZlUpCisjZW5kaWYKKyNpZiAoU0laRU9GX0xPTkcgPj0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKF9fQUNDX01BU0tfR0VOKDF1bCwzMikgPT0gMHhmZmZmZmZmZlVMKQorI2VuZGlmCisjaWYgKFNJWkVPRl9MT05HID49IDgpCisgICAgQUNDQ0hLX0FTU0VSVChfX0FDQ19NQVNLX0dFTigxdWwsNjQpID09IDB4ZmZmZmZmZmZmZmZmZmZmZlVMKQorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX0JST0tFTl9JTlRFR1JBTF9QUk9NT1RJT04pCisgICAgQUNDQ0hLX0FTU0VSVChfX0FDQ19NQVNLX0dFTigxdSxTSVpFT0ZfSU5UKjgpID09IH4wdSkKKyAgICBBQ0NDSEtfQVNTRVJUKF9fQUNDX01BU0tfR0VOKDF1bCxTSVpFT0ZfTE9ORyo4KSA9PSB+MHVsKQorI2VuZGlmCisjaWYgIWRlZmluZWQoQUNDX0JST0tFTl9TSUdORURfUklHSFRfU0hJRlQpCisgICAgQUNDQ0hLX0FTU0VSVCgoKC0xKSA+PiA3KSA9PSAtMSkKKyNlbmRpZgorICAgIEFDQ0NIS19BU1NFUlQoKCgxKSAgPj4gNykgPT0gMCkKKyAgICBBQ0NDSEtfQVNTRVJUKCh+MGwgICYgfjApICA9PSB+MGwpCisgICAgQUNDQ0hLX0FTU0VSVCgofjBsICAmIH4wdSkgPT0gfjB1KQorICAgIEFDQ0NIS19BU1NFUlQoKH4wdWwgJiB+MCkgID09IH4wdWwpCisgICAgQUNDQ0hLX0FTU0VSVCgofjB1bCAmIH4wdSkgPT0gfjB1KQorI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIChfX1RVUkJPQ19fIDwgMHgwMTUwKQorI2VsaWYgKFNJWkVPRl9JTlQgPT0gMikKKyAgICBBQ0NDSEtfQVNTRVJUKCh+MGwgICYgfjB1KSA9PSAweGZmZmZVKQorICAgIEFDQ0NIS19BU1NFUlQoKH4wdWwgJiB+MHUpID09IDB4ZmZmZlUpCisjZWxpZiAoU0laRU9GX0lOVCA9PSA0KQorICAgIEFDQ0NIS19BU1NFUlQoKH4wbCAgJiB+MHUpID09IDB4ZmZmZmZmZmZVKQorICAgIEFDQ0NIS19BU1NFUlQoKH4wdWwgJiB+MHUpID09IDB4ZmZmZmZmZmZVKQorI2VuZGlmCisgICAgQUNDQ0hLX0FTU0VSVF9JU19TSUdORURfVChzaWduZWQgY2hhcikKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QodW5zaWduZWQgY2hhcikKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihzaWduZWQgY2hhcikgPT0gc2l6ZW9mKGNoYXIpKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHVuc2lnbmVkIGNoYXIpID09IHNpemVvZihjaGFyKSkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihjaGFyKSA9PSAxKQorI2lmIChBQ0NfQ0NfQ0lMTFkpICYmICghZGVmaW5lZChfX0NJTExZX18pIHx8IChfX0NJTExZX18gPCAweDAxMDMwMkwpKQorI2Vsc2UKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihjaGFyKSA9PSBzaXplb2YoKGNoYXIpMCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKCdcMCcpID09IHNpemVvZihjaGFyKSkKKyNlbHNlCisjICBpZiAoQUNDX0NDX0RNQykKKyMgIGVsc2UKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZignXDAnKSA9PSBzaXplb2YoaW50KSkKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fYWNjX2FsaWdub2YpCisgICAgQUNDQ0hLX0FTU0VSVChfX2FjY19hbGlnbm9mKGNoYXIpID09IDEpCisgICAgQUNDQ0hLX0FTU0VSVChfX2FjY19hbGlnbm9mKHNpZ25lZCBjaGFyKSA9PSAxKQorICAgIEFDQ0NIS19BU1NFUlQoX19hY2NfYWxpZ25vZih1bnNpZ25lZCBjaGFyKSA9PSAxKQorI2lmIGRlZmluZWQoYWNjX2ludDE2ZV90KQorICAgIEFDQ0NIS19BU1NFUlQoX19hY2NfYWxpZ25vZihhY2NfaW50MTZlX3QpID49IDEpCisgICAgQUNDQ0hLX0FTU0VSVChfX2FjY19hbGlnbm9mKGFjY19pbnQxNmVfdCkgPD0gMikKKyNlbmRpZgorI2lmIGRlZmluZWQoYWNjX2ludDMyZV90KQorICAgIEFDQ0NIS19BU1NFUlQoX19hY2NfYWxpZ25vZihhY2NfaW50MzJlX3QpID49IDEpCisgICAgQUNDQ0hLX0FTU0VSVChfX2FjY19hbGlnbm9mKGFjY19pbnQzMmVfdCkgPD0gNCkKKyNlbmRpZgorI2VuZGlmCisgICAgQUNDQ0hLX0FTU0VSVF9JU19TSUdORURfVChzaG9ydCkKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QodW5zaWduZWQgc2hvcnQpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yoc2hvcnQpID09IHNpemVvZih1bnNpZ25lZCBzaG9ydCkpCisjaWYgIWRlZmluZWQoQUNDX0FCSV9JOExQMTYpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yoc2hvcnQpID49IDIpCisjZW5kaWYKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihzaG9ydCkgPj0gc2l6ZW9mKGNoYXIpKQorI2lmIChBQ0NfQ0NfQ0lMTFkpICYmICghZGVmaW5lZChfX0NJTExZX18pIHx8IChfX0NJTExZX18gPCAweDAxMDMwMkwpKQorI2Vsc2UKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihzaG9ydCkgPT0gc2l6ZW9mKChzaG9ydCkwKSkKKyNlbmRpZgorI2lmIChTSVpFT0ZfU0hPUlQgPiAwKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHNob3J0KSA9PSBTSVpFT0ZfU0hPUlQpCisjZW5kaWYKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1NJR05FRF9UKGludCkKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QodW5zaWduZWQgaW50KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGludCkpCisjaWYgIWRlZmluZWQoQUNDX0FCSV9JOExQMTYpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoaW50KSA+PSAyKQorI2VuZGlmCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoaW50KSA+PSBzaXplb2Yoc2hvcnQpKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKDApKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKChpbnQpMCkpCisjaWYgKFNJWkVPRl9JTlQgPiAwKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gU0laRU9GX0lOVCkKKyNlbmRpZgorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKDApID09IHNpemVvZihpbnQpKQorICAgIEFDQ0NIS19BU1NFUlRfSVNfU0lHTkVEX1QobG9uZykKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QodW5zaWduZWQgbG9uZykKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihsb25nKSA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCisjaWYgIWRlZmluZWQoQUNDX0FCSV9JOExQMTYpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YobG9uZykgPj0gNCkKKyNlbmRpZgorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGxvbmcpID49IHNpemVvZihpbnQpKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGxvbmcpID09IHNpemVvZigwTCkpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YobG9uZykgPT0gc2l6ZW9mKChsb25nKTApKQorI2lmIChTSVpFT0ZfTE9ORyA+IDApCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YobG9uZykgPT0gU0laRU9GX0xPTkcpCisjZW5kaWYKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZigwTCkgPT0gc2l6ZW9mKGxvbmcpKQorICAgIEFDQ0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChzaXplX3QpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA+PSBzaXplb2YoaW50KSkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihzaXplX3QpID09IHNpemVvZihzaXplb2YoMCkpKQorI2lmIChTSVpFT0ZfU0laRV9UID4gMCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihzaXplX3QpID09IFNJWkVPRl9TSVpFX1QpCisjZW5kaWYKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1NJR05FRF9UKHB0cmRpZmZfdCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID49IHNpemVvZihpbnQpKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHB0cmRpZmZfdCkgPj0gc2l6ZW9mKHNpemVfdCkpCisjaWYgIWRlZmluZWQoQUNDX0JST0tFTl9TSVpFT0YpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YocHRyZGlmZl90KSA9PSBzaXplb2YoKGNoYXIqKTAgLSAoY2hhciopMCkpCisjIGlmIChBQ0NfSEFWRV9NTV9IVUdFX1BUUikKKyAgICBBQ0NDSEtfQVNTRVJUKDQgPT0gc2l6ZW9mKChjaGFyIF9faHVnZSopMCAtIChjaGFyIF9faHVnZSopMCkpCisjIGVuZGlmCisjZW5kaWYKKyNpZiAoU0laRU9GX1BUUkRJRkZfVCA+IDApCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YocHRyZGlmZl90KSA9PSBTSVpFT0ZfUFRSRElGRl9UKQorI2VuZGlmCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yodm9pZCopID49IHNpemVvZihjaGFyKikpCisjaWYgKFNJWkVPRl9WT0lEX1AgPiAwKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHZvaWQqKSA9PSBTSVpFT0ZfVk9JRF9QKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGNoYXIqKSA9PSBTSVpFT0ZfVk9JRF9QKQorI2VuZGlmCisjaWYgKEFDQ19IQVZFX01NX0hVR0VfUFRSKQorICAgIEFDQ0NIS19BU1NFUlQoNCA9PSBzaXplb2Yodm9pZCBfX2h1Z2UqKSkKKyAgICBBQ0NDSEtfQVNTRVJUKDQgPT0gc2l6ZW9mKGNoYXIgX19odWdlKikpCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19BQklfSThMUDE2KQorICAgIEFDQ0NIS19BU1NFUlQoKCgoMXUgIDw8ICA3KSArIDEpID4+ICA3KSA9PSAxKQorICAgIEFDQ0NIS19BU1NFUlQoKCgoMXVsIDw8IDE1KSArIDEpID4+IDE1KSA9PSAxKQorI2Vsc2UKKyAgICBBQ0NDSEtfQVNTRVJUKCgoKDF1ICA8PCAxNSkgKyAxKSA+PiAxNSkgPT0gMSkKKyAgICBBQ0NDSEtfQVNTRVJUKCgoKDF1bCA8PCAzMSkgKyAxKSA+PiAzMSkgPT0gMSkKKyNlbmRpZgorI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIChfX1RVUkJPQ19fIDwgMHgwMTUwKQorI2VsaWYgMSAmJiAoQUNDX0NDX1NVTlBST0MpICYmICFkZWZpbmVkKEFDQ0NIS19DRkdfUEVEQU5USUMpCisjZWxzZQorICAgIEFDQ0NIS19BU1NFUlQoKDEgICA8PCAoOCpTSVpFT0ZfSU5ULTEpKSA8IDApCisjZW5kaWYKKyAgICBBQ0NDSEtfQVNTRVJUKCgxdSAgPDwgKDgqU0laRU9GX0lOVC0xKSkgPiAwKQorI2lmIDEgJiYgKEFDQ19DQ19TVU5QUk9DKSAmJiAhZGVmaW5lZChBQ0NDSEtfQ0ZHX1BFREFOVElDKQorI2Vsc2UKKyAgICBBQ0NDSEtfQVNTRVJUKCgxbCAgPDwgKDgqU0laRU9GX0xPTkctMSkpIDwgMCkKKyNlbmRpZgorICAgIEFDQ0NIS19BU1NFUlQoKDF1bCA8PCAoOCpTSVpFT0ZfTE9ORy0xKSkgPiAwKQorI2lmIGRlZmluZWQoYWNjX2ludDE2ZV90KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnQxNmVfdCkgPT0gMikKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50MTZlX3QpID09IFNJWkVPRl9BQ0NfSU5UMTZFX1QpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX3VpbnQxNmVfdCkgPT0gMikKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50MTZlX3QpID09IHNpemVvZihhY2NfdWludDE2ZV90KSkKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1NJR05FRF9UKGFjY19pbnQxNmVfdCkKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1VOU0lHTkVEX1QoYWNjX3VpbnQxNmVfdCkKKyNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiAoX19UVVJCT0NfXyA8IDB4MDE1MCkKKyNlbHNlCisgICAgQUNDQ0hLX0FTU0VSVCgoKGFjY191aW50MTZlX3QpKH4oYWNjX3VpbnQxNmVfdCkwdWwpID4+IDE1KSA9PSAxKQorI2VuZGlmCisgICAgQUNDQ0hLX0FTU0VSVCggKGFjY19pbnQxNmVfdCkgKDEgKyB+KGFjY19pbnQxNmVfdCkwKSA9PSAwKQorI2lmIGRlZmluZWQoQUNDQ0hLX0NGR19QRURBTlRJQykKKyAgICBBQ0NDSEtfQVNTRVJUKCAoYWNjX3VpbnQxNmVfdCkoMSArIH4oYWNjX3VpbnQxNmVfdCkwKSA9PSAwKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKGFjY19pbnQzMmVfdCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50MzJlX3QpID09IDQpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludDMyZV90KSA9PSBTSVpFT0ZfQUNDX0lOVDMyRV9UKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY191aW50MzJlX3QpID09IDQpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludDMyZV90KSA9PSBzaXplb2YoYWNjX3VpbnQzMmVfdCkpCisgICAgQUNDQ0hLX0FTU0VSVF9JU19TSUdORURfVChhY2NfaW50MzJlX3QpCisgICAgQUNDQ0hLX0FTU0VSVCgoKCggKGFjY19pbnQzMmVfdCkxIDw8IDMwKSArIDEpID4+IDMwKSA9PSAxKQorICAgIEFDQ0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChhY2NfdWludDMyZV90KQorICAgIEFDQ0NIS19BU1NFUlQoKCgoIChhY2NfdWludDMyZV90KTEgPDwgMzEpICsgMSkgPj4gMzEpID09IDEpCisgICAgQUNDQ0hLX0FTU0VSVCgoKGFjY191aW50MzJlX3QpKH4oYWNjX3VpbnQzMmVfdCkwdWwpID4+IDMxKSA9PSAxKQorICAgIEFDQ0NIS19BU1NFUlQoIChhY2NfaW50MzJlX3QpICgxICsgfihhY2NfaW50MzJlX3QpMCkgPT0gMCkKKyNpZiBkZWZpbmVkKEFDQ0NIS19DRkdfUEVEQU5USUMpCisgICAgQUNDQ0hLX0FTU0VSVCggKGFjY191aW50MzJlX3QpKDEgKyB+KGFjY191aW50MzJlX3QpMCkgPT0gMCkKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChhY2NfaW50MzJlX3QpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludDMybF90KSA+PSBzaXplb2YoYWNjX2ludDMyZV90KSkKKyNlbmRpZgorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnQzMmxfdCkgPj0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50MzJsX3QpID09IFNJWkVPRl9BQ0NfSU5UMzJMX1QpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX3VpbnQzMmxfdCkgPj0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50MzJsX3QpID09IHNpemVvZihhY2NfdWludDMybF90KSkKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1NJR05FRF9UKGFjY19pbnQzMmxfdCkKKyAgICBBQ0NDSEtfQVNTRVJUKCgoKCAoYWNjX2ludDMybF90KTEgPDwgMzApICsgMSkgPj4gMzApID09IDEpCisgICAgQUNDQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKGFjY191aW50MzJsX3QpCisgICAgQUNDQ0hLX0FTU0VSVCgoKCggKGFjY191aW50MzJsX3QpMSA8PCAzMSkgKyAxKSA+PiAzMSkgPT0gMSkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50MzJmX3QpID49IHNpemVvZihpbnQpKQorI2lmIGRlZmluZWQoYWNjX2ludDMyZV90KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnQzMmZfdCkgPj0gc2l6ZW9mKGFjY19pbnQzMmVfdCkpCisjZW5kaWYKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50MzJmX3QpID49IHNpemVvZihhY2NfaW50MzJsX3QpKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnQzMmZfdCkgPj0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50MzJmX3QpID49IHNpemVvZihhY2NfaW50MzJsX3QpKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnQzMmZfdCkgPT0gU0laRU9GX0FDQ19JTlQzMkZfVCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfdWludDMyZl90KSA+PSA0KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY191aW50MzJmX3QpID49IHNpemVvZihhY2NfdWludDMybF90KSkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50MzJmX3QpID09IHNpemVvZihhY2NfdWludDMyZl90KSkKKyAgICBBQ0NDSEtfQVNTRVJUX0lTX1NJR05FRF9UKGFjY19pbnQzMmZfdCkKKyAgICBBQ0NDSEtfQVNTRVJUKCgoKCAoYWNjX2ludDMyZl90KTEgPDwgMzApICsgMSkgPj4gMzApID09IDEpCisgICAgQUNDQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKGFjY191aW50MzJmX3QpCisgICAgQUNDQ0hLX0FTU0VSVCgoKCggKGFjY191aW50MzJmX3QpMSA8PCAzMSkgKyAxKSA+PiAzMSkgPT0gMSkKKyNpZiBkZWZpbmVkKGFjY19pbnQ2NGVfdCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50NjRlX3QpID09IDgpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludDY0ZV90KSA9PSBTSVpFT0ZfQUNDX0lOVDY0RV9UKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY191aW50NjRlX3QpID09IDgpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludDY0ZV90KSA9PSBzaXplb2YoYWNjX3VpbnQ2NGVfdCkpCisgICAgQUNDQ0hLX0FTU0VSVF9JU19TSUdORURfVChhY2NfaW50NjRlX3QpCisjaWYgKEFDQ19DQ19CT1JMQU5EQyAmJiAoX19CT1JMQU5EQ19fIDwgMHgwNTMwKSkKKyNlbHNlCisgICAgQUNDQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKGFjY191aW50NjRlX3QpCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoYWNjX2ludDY0bF90KQorI2lmIGRlZmluZWQoYWNjX2ludDY0ZV90KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnQ2NGxfdCkgPj0gc2l6ZW9mKGFjY19pbnQ2NGVfdCkpCisjZW5kaWYKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50NjRsX3QpID49IDgpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludDY0bF90KSA9PSBTSVpFT0ZfQUNDX0lOVDY0TF9UKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY191aW50NjRsX3QpID49IDgpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludDY0bF90KSA9PSBzaXplb2YoYWNjX3VpbnQ2NGxfdCkpCisgICAgQUNDQ0hLX0FTU0VSVF9JU19TSUdORURfVChhY2NfaW50NjRsX3QpCisgICAgQUNDQ0hLX0FTU0VSVCgoKCggKGFjY19pbnQ2NGxfdCkxIDw8IDYyKSArIDEpID4+IDYyKSA9PSAxKQorICAgIEFDQ0NIS19BU1NFUlQoKCgoIEFDQ19JTlQ2NF9DKDEpIDw8IDYyKSArIDEpID4+IDYyKSA9PSAxKQorI2lmIChBQ0NfQ0NfQk9STEFOREMgJiYgKF9fQk9STEFORENfXyA8IDB4MDUzMCkpCisjZWxzZQorICAgIEFDQ0NIS19BU1NFUlRfSVNfVU5TSUdORURfVChhY2NfdWludDY0bF90KQorICAgIEFDQ0NIS19BU1NFUlQoQUNDX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSAgICAgPiAwKQorI2VuZGlmCisgICAgQUNDQ0hLX0FTU0VSVCgoKCggKGFjY191aW50NjRsX3QpMSA8PCA2MykgKyAxKSA+PiA2MykgPT0gMSkKKyAgICBBQ0NDSEtfQVNTRVJUKCgoKCBBQ0NfVUlOVDY0X0MoMSkgPDwgNjMpICsgMSkgPj4gNjMpID09IDEpCisjaWYgKEFDQ19DQ19HTlVDICYmIChBQ0NfQ0NfR05VQyA8IDB4MDIwNjAwdWwpKQorICAgIEFDQ0NIS19BU1NFUlQoQUNDX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykgICAgICAgPiBBQ0NfSU5UNjRfQygwKSkKKyNlbHNlCisgICAgQUNDQ0hLX0FTU0VSVChBQ0NfSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSAgICAgICA+IDApCisjZW5kaWYKKyAgICBBQ0NDSEtfQVNTRVJUKEFDQ19JTlQ2NF9DKC05MjIzMzcyMDM2ODU0Nzc1ODA3KSAtIDEgIDwgMCkKKyAgICBBQ0NDSEtfQVNTRVJUKCBBQ0NfSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSAlIEFDQ19JTlQzMl9DKDIxNDc0ODM2MjkpICA9PSA3MjEpCisgICAgQUNDQ0hLX0FTU0VSVCggQUNDX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykgJSBBQ0NfSU5UMzJfQygyMTQ3NDgzNjQ3KSAgPT0gMSkKKyAgICBBQ0NDSEtfQVNTRVJUKEFDQ19VSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSAlIEFDQ19VSU5UMzJfQygyMTQ3NDgzNjI5KSA9PSA3MjEpCisgICAgQUNDQ0hLX0FTU0VSVChBQ0NfVUlOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykgJSBBQ0NfVUlOVDMyX0MoMjE0NzQ4MzY0NykgPT0gMSkKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9fQUNDX0lOVFBUUl9UX0lTX1BPSU5URVIpCisgICAgQUNDQ0hLX0FTU0VSVF9JU19TSUdORURfVChhY2NfaW50cHRyX3QpCisgICAgQUNDQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKGFjY191aW50cHRyX3QpCisjZW5kaWYKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50cHRyX3QpID49IHNpemVvZih2b2lkICopKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnRwdHJfdCkgPT0gU0laRU9GX0FDQ19JTlRQVFJfVCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50cHRyX3QpID09IHNpemVvZihhY2NfdWludHB0cl90KSkKKyNpZiBkZWZpbmVkKGFjY193b3JkX3QpCisgICAgQUNDQ0hLX0FTU0VSVChBQ0NfV09SRFNJWkUgPT0gU0laRU9GX0FDQ19XT1JEX1QpCisgICAgQUNDQ0hLX0FTU0VSVF9JU19VTlNJR05FRF9UKGFjY193b3JkX3QpCisgICAgQUNDQ0hLX0FTU0VSVF9JU19TSUdORURfVChhY2Nfc3dvcmRfdCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2Nfd29yZF90KSA9PSBTSVpFT0ZfQUNDX1dPUkRfVCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2Nfd29yZF90KSA9PSBzaXplb2YoYWNjX3N3b3JkX3QpKQorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfSU5UMTZfQykKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihBQ0NfSU5UMTZfQygwKSkgPj0gMikKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihBQ0NfVUlOVDE2X0MoMCkpID49IDIpCisgICAgQUNDQ0hLX0FTU0VSVCgoQUNDX1VJTlQxNl9DKDB4ZmZmZikgPj4gMTUpID09IDEpCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19JTlQzMl9DKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKEFDQ19JTlQzMl9DKDApKSA+PSA0KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKEFDQ19VSU5UMzJfQygwKSkgPj0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKChBQ0NfVUlOVDMyX0MoMHhmZmZmZmZmZikgPj4gMzEpID09IDEpCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19JTlQ2NF9DKQorI2lmIChBQ0NfQ0NfQk9STEFOREMgJiYgKF9fQk9STEFORENfXyA8IDB4MDU2MCkpCisjZWxzZQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKEFDQ19JTlQ2NF9DKDApKSA+PSA4KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKEFDQ19VSU5UNjRfQygwKSkgPj0gOCkKKyNlbmRpZgorICAgIEFDQ0NIS19BU1NFUlQoKEFDQ19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpID4+IDYzKSA9PSAxKQorICAgIEFDQ0NIS19BU1NFUlQoKEFDQ19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpICYgfjApICA9PSBBQ0NfVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSkKKyAgICBBQ0NDSEtfQVNTRVJUKChBQ0NfVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSAmIH4wbCkgPT0gQUNDX1VJTlQ2NF9DKDB4ZmZmZmZmZmZmZmZmZmZmZikpCisjaWYgKFNJWkVPRl9JTlQgPT0gNCkKKyMgaWYgKEFDQ19DQ19HTlVDICYmIChBQ0NfQ0NfR05VQyA8IDB4MDIwMDAwdWwpKQorIyBlbHNlCisgICAgQUNDQ0hLX0FTU0VSVCgoQUNDX1VJTlQ2NF9DKDB4ZmZmZmZmZmZmZmZmZmZmZikgJiB+MHUpID09IDB4ZmZmZmZmZmZ1KQorIyBlbmRpZgorI2VuZGlmCisjaWYgKFNJWkVPRl9MT05HID09IDQpCisjIGlmIChBQ0NfQ0NfR05VQyAmJiAoQUNDX0NDX0dOVUMgPCAweDAyMDAwMHVsKSkKKyMgZWxzZQorICAgIEFDQ0NIS19BU1NFUlQoKEFDQ19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpICYgfjB1bCkgPT0gMHhmZmZmZmZmZnVsKQorIyBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiAoQUNDX01NX1RJTlkgfHwgQUNDX01NX1NNQUxMIHx8IEFDQ19NTV9NRURJVU0pCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yodm9pZCopID09IDIpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YocHRyZGlmZl90KSA9PSAyKQorI2VsaWYgKEFDQ19NTV9DT01QQUNUIHx8IEFDQ19NTV9MQVJHRSB8fCBBQ0NfTU1fSFVHRSkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZih2b2lkKikgPT0gNCkKKyNlbmRpZgorI2lmIChBQ0NfTU1fVElOWSB8fCBBQ0NfTU1fU01BTEwgfHwgQUNDX01NX0NPTVBBQ1QpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yodm9pZCAoKikodm9pZCkpID09IDIpCisjZWxpZiAoQUNDX01NX01FRElVTSB8fCBBQ0NfTU1fTEFSR0UgfHwgQUNDX01NX0hVR0UpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yodm9pZCAoKikodm9pZCkpID09IDQpCisjZW5kaWYKKyNpZiAoQUNDX0FCSV9JTFAzMikKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihpbnQpID09IDQpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YobG9uZykgPT0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZih2b2lkKikgPT0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID09IHNpemVvZih2b2lkKikpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA9PSBzaXplb2Yodm9pZCopKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnRwdHJfdCkgPT0gc2l6ZW9mKHZvaWQgKikpCisjZW5kaWYKKyNpZiAoQUNDX0FCSV9JTFA2NCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihpbnQpID09IDgpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YobG9uZykgPT0gOCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZih2b2lkKikgPT0gOCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID09IHNpemVvZih2b2lkKikpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA9PSBzaXplb2Yodm9pZCopKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnRwdHJfdCkgPT0gc2l6ZW9mKHZvaWQgKikpCisjZW5kaWYKKyNpZiAoQUNDX0FCSV9JUDMyTDY0KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihsb25nKSA9PSA4KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHZvaWQqKSA9PSA0KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHB0cmRpZmZfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihzaXplX3QpID09IHNpemVvZih2b2lkKikpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludHB0cl90KSA9PSBzaXplb2Yodm9pZCAqKSkKKyNlbmRpZgorI2lmIChBQ0NfQUJJX0xMUDY0KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGludCkgPT0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihsb25nKSA9PSA0KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHZvaWQqKSA9PSA4KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHB0cmRpZmZfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihzaXplX3QpID09IHNpemVvZih2b2lkKikpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludHB0cl90KSA9PSBzaXplb2Yodm9pZCAqKSkKKyNlbmRpZgorI2lmIChBQ0NfQUJJX0xQMzIpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoaW50KSA9PSAyKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGxvbmcpID09IDQpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yodm9pZCopID09IDQpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludHB0cl90KSA9PSBzaXplb2Yodm9pZCAqKSkKKyNlbmRpZgorI2lmIChBQ0NfQUJJX0xQNjQpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoaW50KSA9PSA0KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGxvbmcpID09IDgpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yodm9pZCopID09IDgpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YocHRyZGlmZl90KSA9PSBzaXplb2Yodm9pZCopKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPT0gc2l6ZW9mKHZvaWQqKSkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihhY2NfaW50cHRyX3QpID09IHNpemVvZih2b2lkICopKQorI2VuZGlmCisjaWYgKEFDQ19BUkNIX0kwODYpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA9PSAyKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKGFjY19pbnRwdHJfdCkgPT0gc2l6ZW9mKHZvaWQgKikpCisjZWxpZiAoQUNDX0FSQ0hfSTM4NiB8fCBBQ0NfQVJDSF9NNjhLKQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPT0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZihwdHJkaWZmX3QpID09IDQpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2YoYWNjX2ludHB0cl90KSA9PSBzaXplb2Yodm9pZCAqKSkKKyNlbmRpZgorI2lmIChBQ0NfT1NfRE9TMzIgfHwgQUNDX09TX09TMiB8fCBBQ0NfT1NfV0lOMzIpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA9PSA0KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHB0cmRpZmZfdCkgPT0gNCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZih2b2lkICgqKSh2b2lkKSkgPT0gNCkKKyNlbGlmIChBQ0NfT1NfV0lONjQpCisgICAgQUNDQ0hLX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA9PSA4KQorICAgIEFDQ0NIS19BU1NFUlQoc2l6ZW9mKHB0cmRpZmZfdCkgPT0gOCkKKyAgICBBQ0NDSEtfQVNTRVJUKHNpemVvZih2b2lkICgqKSh2b2lkKSkgPT0gOCkKKyNlbmRpZgorI2lmIChBQ0NfQ0NfTkRQQykKKyNlbGlmIChTSVpFT0ZfSU5UID4gMSkKKyAgICBBQ0NDSEtfQVNTRVJUKCAoaW50KSAoKHVuc2lnbmVkIGNoYXIpICgoc2lnbmVkIGNoYXIpIC0xKSkgPT0gMjU1KQorI2VuZGlmCisjaWYgKEFDQ19DQ19LRUlMQykKKyNlbGlmIChBQ0NfQ0NfTkRQQykKKyNlbGlmIDEgJiYgKEFDQ19DQ19MQ0MgfHwgQUNDX0NDX0xDQ1dJTjMyKSAmJiAhZGVmaW5lZChBQ0NDSEtfQ0ZHX1BFREFOVElDKQorI2VsaWYgMSAmJiAoQUNDX0NDX1NVTlBST0MpICYmICFkZWZpbmVkKEFDQ0NIS19DRkdfUEVEQU5USUMpCisjZWxpZiAhZGVmaW5lZChBQ0NfQlJPS0VOX0lOVEVHUkFMX1BST01PVElPTikgJiYgKFNJWkVPRl9JTlQgPiAxKQorICAgIEFDQ0NIS19BU1NFUlQoICgoKHVuc2lnbmVkIGNoYXIpMTI4KSA8PCAoaW50KSg4KnNpemVvZihpbnQpLTgpKSA8IDApCisjZW5kaWYKKyNpZiAoQUNDX0NDX0JPUkxBTkRDICYmIChfX0JPUkxBTkRDX18gPj0gMHgwNTMwKSAmJiAoX19CT1JMQU5EQ19fIDwgMHgwNTYwKSkKKyMgIHByYWdtYSBvcHRpb24gcG9wCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX1dBTlRfQUNDTElCX1VBKQorIyAgdW5kZWYgQUNDX1dBTlRfQUNDTElCX1VBCisjZGVmaW5lIF9fQUNDTElCX1VBX0NIX0lOQ0xVREVEIDEKKyNpZiAhZGVmaW5lZChBQ0NMSUJfUFVCTElDKQorIyAgZGVmaW5lIEFDQ0xJQl9QVUJMSUMocixmKSAgICByIF9fQUNDTElCX0ZVTkNOQU1FKGYpCisjZW5kaWYKK0FDQ0xJQl9QVUJMSUModW5zaWduZWQsIGFjY191YV9nZXRfYmUxNikgKGNvbnN0IGFjY19odm9pZF9wIHApCit7CisjaWYgZGVmaW5lZChBQ0NfVUFfR0VUX0JFMTYpCisgICAgcmV0dXJuIEFDQ19VQV9HRVRfQkUxNihwKTsKKyNlbHNlCisgICAgY29uc3QgYWNjX2hieXRlX3AgYiA9IChjb25zdCBhY2NfaGJ5dGVfcCkgcDsKKyAgICByZXR1cm4gKCh1bnNpZ25lZCliWzFdKSB8ICgodW5zaWduZWQpYlswXSA8PCA4KTsKKyNlbmRpZgorfQorQUNDTElCX1BVQkxJQyhhY2NfdWludDMybF90LCBhY2NfdWFfZ2V0X2JlMjQpIChjb25zdCBhY2NfaHZvaWRfcCBwKQoreworICAgIGNvbnN0IGFjY19oYnl0ZV9wIGIgPSAoY29uc3QgYWNjX2hieXRlX3ApIHA7CisgICAgcmV0dXJuICgoYWNjX3VpbnQzMmxfdCliWzJdKSB8ICgoYWNjX3VpbnQzMmxfdCliWzFdIDw8IDgpIHwgKChhY2NfdWludDMybF90KWJbMF0gPDwgMTYpOworfQorQUNDTElCX1BVQkxJQyhhY2NfdWludDMybF90LCBhY2NfdWFfZ2V0X2JlMzIpIChjb25zdCBhY2NfaHZvaWRfcCBwKQoreworI2lmIGRlZmluZWQoQUNDX1VBX0dFVF9CRTMyKQorICAgIHJldHVybiBBQ0NfVUFfR0VUX0JFMzIocCk7CisjZWxzZQorICAgIGNvbnN0IGFjY19oYnl0ZV9wIGIgPSAoY29uc3QgYWNjX2hieXRlX3ApIHA7CisgICAgcmV0dXJuICgoYWNjX3VpbnQzMmxfdCliWzNdKSB8ICgoYWNjX3VpbnQzMmxfdCliWzJdIDw8IDgpIHwgKChhY2NfdWludDMybF90KWJbMV0gPDwgMTYpIHwgKChhY2NfdWludDMybF90KWJbMF0gPDwgMjQpOworI2VuZGlmCit9CitBQ0NMSUJfUFVCTElDKHZvaWQsIGFjY191YV9zZXRfYmUxNikgKGFjY19odm9pZF9wIHAsIHVuc2lnbmVkIHYpCit7CisjaWYgZGVmaW5lZChBQ0NfVUFfU0VUX0JFMTYpCisgICAgQUNDX1VBX1NFVF9CRTE2KHAsIHYpOworI2Vsc2UKKyAgICBhY2NfaGJ5dGVfcCBiID0gKGFjY19oYnl0ZV9wKSBwOworICAgIGJbMV0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+ICAwKSAmIDB4ZmYpOworICAgIGJbMF0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+ICA4KSAmIDB4ZmYpOworI2VuZGlmCit9CitBQ0NMSUJfUFVCTElDKHZvaWQsIGFjY191YV9zZXRfYmUyNCkgKGFjY19odm9pZF9wIHAsIGFjY191aW50MzJsX3QgdikKK3sKKyAgICBhY2NfaGJ5dGVfcCBiID0gKGFjY19oYnl0ZV9wKSBwOworICAgIGJbMl0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+ICAwKSAmIDB4ZmYpOworICAgIGJbMV0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+ICA4KSAmIDB4ZmYpOworICAgIGJbMF0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+IDE2KSAmIDB4ZmYpOworfQorQUNDTElCX1BVQkxJQyh2b2lkLCBhY2NfdWFfc2V0X2JlMzIpIChhY2NfaHZvaWRfcCBwLCBhY2NfdWludDMybF90IHYpCit7CisjaWYgZGVmaW5lZChBQ0NfVUFfU0VUX0JFMzIpCisgICAgQUNDX1VBX1NFVF9CRTMyKHAsIHYpOworI2Vsc2UKKyAgICBhY2NfaGJ5dGVfcCBiID0gKGFjY19oYnl0ZV9wKSBwOworICAgIGJbM10gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+ICAwKSAmIDB4ZmYpOworICAgIGJbMl0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+ICA4KSAmIDB4ZmYpOworICAgIGJbMV0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgIGJbMF0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+IDI0KSAmIDB4ZmYpOworI2VuZGlmCit9CitBQ0NMSUJfUFVCTElDKHVuc2lnbmVkLCBhY2NfdWFfZ2V0X2xlMTYpIChjb25zdCBhY2NfaHZvaWRfcCBwKQoreworI2lmIGRlZmluZWQoQUNDX1VBX0dFVF9MRTE2KQorICAgIHJldHVybiBBQ0NfVUFfR0VUX0xFMTYocCk7CisjZWxzZQorICAgIGNvbnN0IGFjY19oYnl0ZV9wIGIgPSAoY29uc3QgYWNjX2hieXRlX3ApIHA7CisgICAgcmV0dXJuICgodW5zaWduZWQpYlswXSkgfCAoKHVuc2lnbmVkKWJbMV0gPDwgOCk7CisjZW5kaWYKK30KK0FDQ0xJQl9QVUJMSUMoYWNjX3VpbnQzMmxfdCwgYWNjX3VhX2dldF9sZTI0KSAoY29uc3QgYWNjX2h2b2lkX3AgcCkKK3sKKyAgICBjb25zdCBhY2NfaGJ5dGVfcCBiID0gKGNvbnN0IGFjY19oYnl0ZV9wKSBwOworICAgIHJldHVybiAoKGFjY191aW50MzJsX3QpYlswXSkgfCAoKGFjY191aW50MzJsX3QpYlsxXSA8PCA4KSB8ICgoYWNjX3VpbnQzMmxfdCliWzJdIDw8IDE2KTsKK30KK0FDQ0xJQl9QVUJMSUMoYWNjX3VpbnQzMmxfdCwgYWNjX3VhX2dldF9sZTMyKSAoY29uc3QgYWNjX2h2b2lkX3AgcCkKK3sKKyNpZiBkZWZpbmVkKEFDQ19VQV9HRVRfTEUzMikKKyAgICByZXR1cm4gQUNDX1VBX0dFVF9MRTMyKHApOworI2Vsc2UKKyAgICBjb25zdCBhY2NfaGJ5dGVfcCBiID0gKGNvbnN0IGFjY19oYnl0ZV9wKSBwOworICAgIHJldHVybiAoKGFjY191aW50MzJsX3QpYlswXSkgfCAoKGFjY191aW50MzJsX3QpYlsxXSA8PCA4KSB8ICgoYWNjX3VpbnQzMmxfdCliWzJdIDw8IDE2KSB8ICgoYWNjX3VpbnQzMmxfdCliWzNdIDw8IDI0KTsKKyNlbmRpZgorfQorQUNDTElCX1BVQkxJQyh2b2lkLCBhY2NfdWFfc2V0X2xlMTYpIChhY2NfaHZvaWRfcCBwLCB1bnNpZ25lZCB2KQoreworI2lmIGRlZmluZWQoQUNDX1VBX1NFVF9MRTE2KQorICAgIEFDQ19VQV9TRVRfTEUxNihwLCB2KTsKKyNlbHNlCisgICAgYWNjX2hieXRlX3AgYiA9IChhY2NfaGJ5dGVfcCkgcDsKKyAgICBiWzBdID0gKHVuc2lnbmVkIGNoYXIpICgodiA+PiAgMCkgJiAweGZmKTsKKyAgICBiWzFdID0gKHVuc2lnbmVkIGNoYXIpICgodiA+PiAgOCkgJiAweGZmKTsKKyNlbmRpZgorfQorQUNDTElCX1BVQkxJQyh2b2lkLCBhY2NfdWFfc2V0X2xlMjQpIChhY2NfaHZvaWRfcCBwLCBhY2NfdWludDMybF90IHYpCit7CisgICAgYWNjX2hieXRlX3AgYiA9IChhY2NfaGJ5dGVfcCkgcDsKKyAgICBiWzBdID0gKHVuc2lnbmVkIGNoYXIpICgodiA+PiAgMCkgJiAweGZmKTsKKyAgICBiWzFdID0gKHVuc2lnbmVkIGNoYXIpICgodiA+PiAgOCkgJiAweGZmKTsKKyAgICBiWzJdID0gKHVuc2lnbmVkIGNoYXIpICgodiA+PiAxNikgJiAweGZmKTsKK30KK0FDQ0xJQl9QVUJMSUModm9pZCwgYWNjX3VhX3NldF9sZTMyKSAoYWNjX2h2b2lkX3AgcCwgYWNjX3VpbnQzMmxfdCB2KQoreworI2lmIGRlZmluZWQoQUNDX1VBX1NFVF9MRTMyKQorICAgIEFDQ19VQV9TRVRfTEUzMihwLCB2KTsKKyNlbHNlCisgICAgYWNjX2hieXRlX3AgYiA9IChhY2NfaGJ5dGVfcCkgcDsKKyAgICBiWzBdID0gKHVuc2lnbmVkIGNoYXIpICgodiA+PiAgMCkgJiAweGZmKTsKKyAgICBiWzFdID0gKHVuc2lnbmVkIGNoYXIpICgodiA+PiAgOCkgJiAweGZmKTsKKyAgICBiWzJdID0gKHVuc2lnbmVkIGNoYXIpICgodiA+PiAxNikgJiAweGZmKTsKKyAgICBiWzNdID0gKHVuc2lnbmVkIGNoYXIpICgodiA+PiAyNCkgJiAweGZmKTsKKyNlbmRpZgorfQorI2lmIGRlZmluZWQoYWNjX2ludDY0bF90KQorQUNDTElCX1BVQkxJQyhhY2NfdWludDY0bF90LCBhY2NfdWFfZ2V0X2JlNjQpIChjb25zdCBhY2NfaHZvaWRfcCBwKQoreworI2lmIGRlZmluZWQoQUNDX1VBX0dFVF9CRTY0KQorICAgIHJldHVybiBBQ0NfVUFfR0VUX0JFNjQocCk7CisjZWxpZiBkZWZpbmVkKEFDQ19VQV9HRVRfQkUzMikKKyAgICBjb25zdCBhY2NfaGJ5dGVfcCBiID0gKGNvbnN0IGFjY19oYnl0ZV9wKSBwOworICAgIGFjY191aW50MzJlX3QgdjAsIHYxOworICAgIHYxID0gQUNDX1VBX0dFVF9CRTMyKGIgKyAwKTsKKyAgICB2MCA9IEFDQ19VQV9HRVRfQkUzMihiICsgNCk7CisgICAgcmV0dXJuICgoYWNjX3VpbnQ2NGxfdCl2MCkgfCAoKGFjY191aW50NjRsX3QpdjEgPDwgMzIpOworI2VsaWYgKEFDQ19TSVpFT0ZfTE9ORyA+PSA4KSB8fCAoQUNDX1NJWkVPRl9TSVpFX1QgPj0gOCkKKyAgICBjb25zdCBhY2NfaGJ5dGVfcCBiID0gKGNvbnN0IGFjY19oYnl0ZV9wKSBwOworICAgIHJldHVybiAoKGFjY191aW50NjRsX3QpYls3XSkgfCAoKGFjY191aW50NjRsX3QpYls2XSA8PCA4KSB8ICgoYWNjX3VpbnQ2NGxfdCliWzVdIDw8IDE2KSB8ICgoYWNjX3VpbnQ2NGxfdCliWzRdIDw8IDI0KSB8ICgoYWNjX3VpbnQ2NGxfdCliWzNdIDw8IDMyKSB8ICgoYWNjX3VpbnQ2NGxfdCliWzJdIDw8IDQwKSB8ICgoYWNjX3VpbnQ2NGxfdCliWzFdIDw8IDQ4KSB8ICgoYWNjX3VpbnQ2NGxfdCliWzBdIDw8IDU2KTsKKyNlbHNlCisgICAgY29uc3QgYWNjX2hieXRlX3AgYiA9IChjb25zdCBhY2NfaGJ5dGVfcCkgcDsKKyAgICBhY2NfdWludDMybF90IHYwLCB2MTsKKyAgICB2MSA9ICgoYWNjX3VpbnQzMmxfdCliWzNdKSB8ICgoYWNjX3VpbnQzMmxfdCliWzJdIDw8IDgpIHwgKChhY2NfdWludDMybF90KWJbMV0gPDwgMTYpIHwgKChhY2NfdWludDMybF90KWJbMF0gPDwgMjQpOworICAgIGIgKz0gNDsKKyAgICB2MCA9ICgoYWNjX3VpbnQzMmxfdCliWzNdKSB8ICgoYWNjX3VpbnQzMmxfdCliWzJdIDw8IDgpIHwgKChhY2NfdWludDMybF90KWJbMV0gPDwgMTYpIHwgKChhY2NfdWludDMybF90KWJbMF0gPDwgMjQpOworICAgIHJldHVybiAoKGFjY191aW50NjRsX3QpdjApIHwgKChhY2NfdWludDY0bF90KXYxIDw8IDMyKTsKKyNlbmRpZgorfQorQUNDTElCX1BVQkxJQyh2b2lkLCBhY2NfdWFfc2V0X2JlNjQpIChhY2NfaHZvaWRfcCBwLCBhY2NfdWludDY0bF90IHYpCit7CisjaWYgZGVmaW5lZChBQ0NfVUFfU0VUX0JFNjQpCisgICAgQUNDX1VBX1NFVF9CRTY0KHAsIHYpOworI2VsaWYgZGVmaW5lZChBQ0NfVUFfU0VUX0JFMzIpCisgICAgYWNjX2hieXRlX3AgYiA9IChhY2NfaGJ5dGVfcCkgcDsKKyAgICBBQ0NfVUFfU0VUX0JFMzIoYiArIDQsICh2ID4+ICAwKSk7CisgICAgQUNDX1VBX1NFVF9CRTMyKGIgKyAwLCAodiA+PiAzMikpOworI2VsaWYgKEFDQ19TSVpFT0ZfTE9ORyA+PSA4KSB8fCAoQUNDX1NJWkVPRl9TSVpFX1QgPj0gOCkKKyAgICBhY2NfaGJ5dGVfcCBiID0gKGFjY19oYnl0ZV9wKSBwOworICAgIGJbN10gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+ICAwKSAmIDB4ZmYpOworICAgIGJbNl0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+ICA4KSAmIDB4ZmYpOworICAgIGJbNV0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgIGJbNF0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+IDI0KSAmIDB4ZmYpOworICAgIGJbM10gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+IDMyKSAmIDB4ZmYpOworICAgIGJbMl0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+IDQwKSAmIDB4ZmYpOworICAgIGJbMV0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+IDQ4KSAmIDB4ZmYpOworICAgIGJbMF0gPSAodW5zaWduZWQgY2hhcikgKCh2ID4+IDU2KSAmIDB4ZmYpOworI2Vsc2UKKyAgICBhY2NfaGJ5dGVfcCBiID0gKGFjY19oYnl0ZV9wKSBwOworICAgIGFjY191aW50MzJsX3QgeDsKKyAgICB4ID0gKGFjY191aW50MzJsX3QpICh2ID4+ICAwKTsKKyAgICBiWzddID0gKHVuc2lnbmVkIGNoYXIpICgoeCA+PiAgMCkgJiAweGZmKTsKKyAgICBiWzZdID0gKHVuc2lnbmVkIGNoYXIpICgoeCA+PiAgOCkgJiAweGZmKTsKKyAgICBiWzVdID0gKHVuc2lnbmVkIGNoYXIpICgoeCA+PiAxNikgJiAweGZmKTsKKyAgICBiWzRdID0gKHVuc2lnbmVkIGNoYXIpICgoeCA+PiAyNCkgJiAweGZmKTsKKyAgICB4ID0gKGFjY191aW50MzJsX3QpICh2ID4+IDMyKTsKKyAgICBiWzNdID0gKHVuc2lnbmVkIGNoYXIpICgoeCA+PiAgMCkgJiAweGZmKTsKKyAgICBiWzJdID0gKHVuc2lnbmVkIGNoYXIpICgoeCA+PiAgOCkgJiAweGZmKTsKKyAgICBiWzFdID0gKHVuc2lnbmVkIGNoYXIpICgoeCA+PiAxNikgJiAweGZmKTsKKyAgICBiWzBdID0gKHVuc2lnbmVkIGNoYXIpICgoeCA+PiAyNCkgJiAweGZmKTsKKyNlbmRpZgorfQorI2VuZGlmCisjaWYgZGVmaW5lZChhY2NfaW50NjRsX3QpCitBQ0NMSUJfUFVCTElDKGFjY191aW50NjRsX3QsIGFjY191YV9nZXRfbGU2NCkgKGNvbnN0IGFjY19odm9pZF9wIHApCit7CisjaWYgZGVmaW5lZChBQ0NfVUFfR0VUX0xFNjQpCisgICAgcmV0dXJuIEFDQ19VQV9HRVRfTEU2NChwKTsKKyNlbGlmIGRlZmluZWQoQUNDX1VBX0dFVF9MRTMyKQorICAgIGNvbnN0IGFjY19oYnl0ZV9wIGIgPSAoY29uc3QgYWNjX2hieXRlX3ApIHA7CisgICAgYWNjX3VpbnQzMmVfdCB2MCwgdjE7CisgICAgdjAgPSBBQ0NfVUFfR0VUX0xFMzIoYiArIDApOworICAgIHYxID0gQUNDX1VBX0dFVF9MRTMyKGIgKyA0KTsKKyAgICByZXR1cm4gKChhY2NfdWludDY0bF90KXYwKSB8ICgoYWNjX3VpbnQ2NGxfdCl2MSA8PCAzMik7CisjZWxpZiAoQUNDX1NJWkVPRl9MT05HID49IDgpIHx8IChBQ0NfU0laRU9GX1NJWkVfVCA+PSA4KQorICAgIGNvbnN0IGFjY19oYnl0ZV9wIGIgPSAoY29uc3QgYWNjX2hieXRlX3ApIHA7CisgICAgcmV0dXJuICgoYWNjX3VpbnQ2NGxfdCliWzBdKSB8ICgoYWNjX3VpbnQ2NGxfdCliWzFdIDw8IDgpIHwgKChhY2NfdWludDY0bF90KWJbMl0gPDwgMTYpIHwgKChhY2NfdWludDY0bF90KWJbM10gPDwgMjQpIHwgKChhY2NfdWludDY0bF90KWJbNF0gPDwgMzIpIHwgKChhY2NfdWludDY0bF90KWJbNV0gPDwgNDApIHwgKChhY2NfdWludDY0bF90KWJbNl0gPDwgNDgpIHwgKChhY2NfdWludDY0bF90KWJbN10gPDwgNTYpOworI2Vsc2UKKyAgICBjb25zdCBhY2NfaGJ5dGVfcCBiID0gKGNvbnN0IGFjY19oYnl0ZV9wKSBwOworICAgIGFjY191aW50MzJsX3QgdjAsIHYxOworICAgIHYwID0gKChhY2NfdWludDMybF90KWJbMF0pIHwgKChhY2NfdWludDMybF90KWJbMV0gPDwgOCkgfCAoKGFjY191aW50MzJsX3QpYlsyXSA8PCAxNikgfCAoKGFjY191aW50MzJsX3QpYlszXSA8PCAyNCk7CisgICAgYiArPSA0OworICAgIHYxID0gKChhY2NfdWludDMybF90KWJbMF0pIHwgKChhY2NfdWludDMybF90KWJbMV0gPDwgOCkgfCAoKGFjY191aW50MzJsX3QpYlsyXSA8PCAxNikgfCAoKGFjY191aW50MzJsX3QpYlszXSA8PCAyNCk7CisgICAgcmV0dXJuICgoYWNjX3VpbnQ2NGxfdCl2MCkgfCAoKGFjY191aW50NjRsX3QpdjEgPDwgMzIpOworI2VuZGlmCit9CitBQ0NMSUJfUFVCTElDKHZvaWQsIGFjY191YV9zZXRfbGU2NCkgKGFjY19odm9pZF9wIHAsIGFjY191aW50NjRsX3QgdikKK3sKKyNpZiBkZWZpbmVkKEFDQ19VQV9TRVRfTEU2NCkKKyAgICBBQ0NfVUFfU0VUX0xFNjQocCwgdik7CisjZWxpZiBkZWZpbmVkKEFDQ19VQV9TRVRfTEUzMikKKyAgICBhY2NfaGJ5dGVfcCBiID0gKGFjY19oYnl0ZV9wKSBwOworICAgIEFDQ19VQV9TRVRfTEUzMihiICsgMCwgKHYgPj4gIDApKTsKKyAgICBBQ0NfVUFfU0VUX0xFMzIoYiArIDQsICh2ID4+IDMyKSk7CisjZWxpZiAoQUNDX1NJWkVPRl9MT05HID49IDgpIHx8IChBQ0NfU0laRU9GX1NJWkVfVCA+PSA4KQorICAgIGFjY19oYnl0ZV9wIGIgPSAoYWNjX2hieXRlX3ApIHA7CisgICAgYlswXSA9ICh1bnNpZ25lZCBjaGFyKSAoKHYgPj4gIDApICYgMHhmZik7CisgICAgYlsxXSA9ICh1bnNpZ25lZCBjaGFyKSAoKHYgPj4gIDgpICYgMHhmZik7CisgICAgYlsyXSA9ICh1bnNpZ25lZCBjaGFyKSAoKHYgPj4gMTYpICYgMHhmZik7CisgICAgYlszXSA9ICh1bnNpZ25lZCBjaGFyKSAoKHYgPj4gMjQpICYgMHhmZik7CisgICAgYls0XSA9ICh1bnNpZ25lZCBjaGFyKSAoKHYgPj4gMzIpICYgMHhmZik7CisgICAgYls1XSA9ICh1bnNpZ25lZCBjaGFyKSAoKHYgPj4gNDApICYgMHhmZik7CisgICAgYls2XSA9ICh1bnNpZ25lZCBjaGFyKSAoKHYgPj4gNDgpICYgMHhmZik7CisgICAgYls3XSA9ICh1bnNpZ25lZCBjaGFyKSAoKHYgPj4gNTYpICYgMHhmZik7CisjZWxzZQorICAgIGFjY19oYnl0ZV9wIGIgPSAoYWNjX2hieXRlX3ApIHA7CisgICAgYWNjX3VpbnQzMmxfdCB4OworICAgIHggPSAoYWNjX3VpbnQzMmxfdCkgKHYgPj4gIDApOworICAgIGJbMF0gPSAodW5zaWduZWQgY2hhcikgKCh4ID4+ICAwKSAmIDB4ZmYpOworICAgIGJbMV0gPSAodW5zaWduZWQgY2hhcikgKCh4ID4+ICA4KSAmIDB4ZmYpOworICAgIGJbMl0gPSAodW5zaWduZWQgY2hhcikgKCh4ID4+IDE2KSAmIDB4ZmYpOworICAgIGJbM10gPSAodW5zaWduZWQgY2hhcikgKCh4ID4+IDI0KSAmIDB4ZmYpOworICAgIHggPSAoYWNjX3VpbnQzMmxfdCkgKHYgPj4gMzIpOworICAgIGJbNF0gPSAodW5zaWduZWQgY2hhcikgKCh4ID4+ICAwKSAmIDB4ZmYpOworICAgIGJbNV0gPSAodW5zaWduZWQgY2hhcikgKCh4ID4+ICA4KSAmIDB4ZmYpOworICAgIGJbNl0gPSAodW5zaWduZWQgY2hhcikgKCh4ID4+IDE2KSAmIDB4ZmYpOworICAgIGJbN10gPSAodW5zaWduZWQgY2hhcikgKCh4ID4+IDI0KSAmIDB4ZmYpOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX1dBTlRfQUNDTElCX1ZHRVQpCisjICB1bmRlZiBBQ0NfV0FOVF9BQ0NMSUJfVkdFVAorI2RlZmluZSBfX0FDQ0xJQl9WR0VUX0NIX0lOQ0xVREVEIDEKKyNpZiAhZGVmaW5lZChBQ0NMSUJfUFVCTElDKQorIyAgZGVmaW5lIEFDQ0xJQl9QVUJMSUMocixmKSAgICAgICAgICAgICAgICByIF9fQUNDTElCX0ZVTkNOQU1FKGYpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChBQ0NMSUJfUFVCTElDX05PSU5MSU5FKQorIyAgaWYgIWRlZmluZWQoX19hY2Nfbm9pbmxpbmUpCisjICAgIGRlZmluZSBBQ0NMSUJfUFVCTElDX05PSU5MSU5FKHIsZikgICAgIHIgX19BQ0NMSUJfRlVOQ05BTUUoZikKKyMgIGVsaWYgKEFDQ19DQ19HTlVDID49IDB4MDMwNDAwdWwpIHx8IChBQ0NfQ0NfTExWTSkKKyMgICAgZGVmaW5lIEFDQ0xJQl9QVUJMSUNfTk9JTkxJTkUocixmKSAgICAgX19hY2Nfbm9pbmxpbmUgX19hdHRyaWJ1dGVfXygoX191c2VkX18pKSByIF9fQUNDTElCX0ZVTkNOQU1FKGYpCisjICBlbHNlCisjICAgIGRlZmluZSBBQ0NMSUJfUFVCTElDX05PSU5MSU5FKHIsZikgICAgIF9fYWNjX25vaW5saW5lIHIgX19BQ0NMSUJfRlVOQ05BTUUoZikKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoQUNDX0NDX0dOVUMgPj0gMHgwMzA0MDB1bCkgfHwgKEFDQ19DQ19MTFZNKQorZXh0ZXJuIHZvaWQqIHZvbGF0aWxlIF9fYWNjX3ZnZXRfcHRyOwordm9pZCogdm9sYXRpbGUgX19hdHRyaWJ1dGVfXygoX191c2VkX18pKSBfX2FjY192Z2V0X3B0ciA9ICh2b2lkICopIDA7CisjZWxzZQorZXh0ZXJuIHZvaWQqIHZvbGF0aWxlIF9fYWNjX3ZnZXRfcHRyOwordm9pZCogdm9sYXRpbGUgX19hY2NfdmdldF9wdHIgPSAodm9pZCAqKSAwOworI2VuZGlmCisjaWZuZGVmIF9fQUNDTElCX1ZHRVRfQk9EWQorI2RlZmluZSBfX0FDQ0xJQl9WR0VUX0JPRFkoVCkgXAorICAgIGlmIF9fYWNjX3VubGlrZWx5KF9fYWNjX3ZnZXRfcHRyKSB7IFwKKyAgICAgICAgKiAoVCAqKSBfX2FjY192Z2V0X3B0ciA9IHY7IFwKKyAgICAgICAgKiAoaW50ICopIF9fYWNjX3ZnZXRfcHRyID0gZXhwcjsgXAorICAgICAgICB2ID0gKiAoVCAqKSBfX2FjY192Z2V0X3B0cjsgXAorICAgIH0gXAorICAgIHJldHVybiB2OworI2VuZGlmCitBQ0NMSUJfUFVCTElDX05PSU5MSU5FKHNob3J0LCBhY2NfdmdldF9zaG9ydCkgKHNob3J0IHYsIGludCBleHByKQoreworICAgIF9fQUNDTElCX1ZHRVRfQk9EWShzaG9ydCkKK30KK0FDQ0xJQl9QVUJMSUNfTk9JTkxJTkUoaW50LCBhY2NfdmdldF9pbnQpIChpbnQgdiwgaW50IGV4cHIpCit7CisgICAgX19BQ0NMSUJfVkdFVF9CT0RZKGludCkKK30KK0FDQ0xJQl9QVUJMSUNfTk9JTkxJTkUobG9uZywgYWNjX3ZnZXRfbG9uZykgKGxvbmcgdiwgaW50IGV4cHIpCit7CisgICAgX19BQ0NMSUJfVkdFVF9CT0RZKGxvbmcpCit9CisjaWYgZGVmaW5lZChhY2NfaW50NjRsX3QpCitBQ0NMSUJfUFVCTElDX05PSU5MSU5FKGFjY19pbnQ2NGxfdCwgYWNjX3ZnZXRfYWNjX2ludDY0bF90KSAoYWNjX2ludDY0bF90IHYsIGludCBleHByKQoreworICAgIF9fQUNDTElCX1ZHRVRfQk9EWShhY2NfaW50NjRsX3QpCit9CisjZW5kaWYKK0FDQ0xJQl9QVUJMSUNfTk9JTkxJTkUoYWNjX2hzaXplX3QsIGFjY192Z2V0X2FjY19oc2l6ZV90KSAoYWNjX2hzaXplX3QgdiwgaW50IGV4cHIpCit7CisgICAgX19BQ0NMSUJfVkdFVF9CT0RZKGFjY19oc2l6ZV90KQorfQorI2lmICFkZWZpbmVkKEFDQ19DRkdfTk9fRkxPQVQpCitBQ0NMSUJfUFVCTElDX05PSU5MSU5FKGZsb2F0LCBhY2NfdmdldF9mbG9hdCkgKGZsb2F0IHYsIGludCBleHByKQoreworICAgIF9fQUNDTElCX1ZHRVRfQk9EWShmbG9hdCkKK30KKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ19DRkdfTk9fRE9VQkxFKQorQUNDTElCX1BVQkxJQ19OT0lOTElORShkb3VibGUsIGFjY192Z2V0X2RvdWJsZSkgKGRvdWJsZSB2LCBpbnQgZXhwcikKK3sKKyAgICBfX0FDQ0xJQl9WR0VUX0JPRFkoZG91YmxlKQorfQorI2VuZGlmCitBQ0NMSUJfUFVCTElDX05PSU5MSU5FKGFjY19odm9pZF9wLCBhY2NfdmdldF9hY2NfaHZvaWRfcCkgKGFjY19odm9pZF9wIHYsIGludCBleHByKQoreworICAgIF9fQUNDTElCX1ZHRVRfQk9EWShhY2NfaHZvaWRfcCkKK30KKyNpZiAoQUNDX0FSQ0hfSTA4NiAmJiBBQ0NfQ0NfVFVSQk9DICYmIChfX1RVUkJPQ19fID09IDB4MDI5NSkpICYmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorQUNDTElCX1BVQkxJQ19OT0lOTElORShhY2NfaHZvaWRfcCwgYWNjX3ZnZXRfYWNjX2h2b2lkX2NwKSAoY29uc3QgYWNjX2h2b2lkX3AgdnYsIGludCBleHByKQoreworICAgIGFjY19odm9pZF9wIHYgPSAoYWNjX2h2b2lkX3ApIHZ2OworICAgIF9fQUNDTElCX1ZHRVRfQk9EWShhY2NfaHZvaWRfcCkKK30KKyNlbHNlCitBQ0NMSUJfUFVCTElDX05PSU5MSU5FKGNvbnN0IGFjY19odm9pZF9wLCBhY2NfdmdldF9hY2NfaHZvaWRfY3ApIChjb25zdCBhY2NfaHZvaWRfcCB2LCBpbnQgZXhwcikKK3sKKyAgICBfX0FDQ0xJQl9WR0VUX0JPRFkoY29uc3QgYWNjX2h2b2lkX3ApCit9CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX1dBTlRfQUNDTElCX0hNRU1DUFkpCisjICB1bmRlZiBBQ0NfV0FOVF9BQ0NMSUJfSE1FTUNQWQorI2RlZmluZSBfX0FDQ0xJQl9ITUVNQ1BZX0NIX0lOQ0xVREVEIDEKKyNpZiAhZGVmaW5lZChBQ0NMSUJfUFVCTElDKQorIyAgZGVmaW5lIEFDQ0xJQl9QVUJMSUMocixmKSAgICByIF9fQUNDTElCX0ZVTkNOQU1FKGYpCisjZW5kaWYKK0FDQ0xJQl9QVUJMSUMoaW50LCBhY2NfaG1lbWNtcCkgKGNvbnN0IGFjY19odm9pZF9wIHMxLCBjb25zdCBhY2NfaHZvaWRfcCBzMiwgYWNjX2hzaXplX3QgbGVuKQoreworI2lmIChBQ0NfSEFWRV9NTV9IVUdFX1BUUikgfHwgIWRlZmluZWQoSEFWRV9NRU1DTVApCisgICAgY29uc3QgYWNjX2hieXRlX3AgcDEgPSAoY29uc3QgYWNjX2hieXRlX3ApIHMxOworICAgIGNvbnN0IGFjY19oYnl0ZV9wIHAyID0gKGNvbnN0IGFjY19oYnl0ZV9wKSBzMjsKKyAgICBpZiBfX2FjY19saWtlbHkobGVuID4gMCkgZG8KKyAgICB7CisgICAgICAgIGludCBkID0gKnAxIC0gKnAyOworICAgICAgICBpZiAoZCAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgIHAxKys7IHAyKys7CisgICAgfSB3aGlsZSBfX2FjY19saWtlbHkoLS1sZW4gPiAwKTsKKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgcmV0dXJuIG1lbWNtcChzMSwgczIsIGxlbik7CisjZW5kaWYKK30KK0FDQ0xJQl9QVUJMSUMoYWNjX2h2b2lkX3AsIGFjY19obWVtY3B5KSAoYWNjX2h2b2lkX3AgZGVzdCwgY29uc3QgYWNjX2h2b2lkX3Agc3JjLCBhY2NfaHNpemVfdCBsZW4pCit7CisjaWYgKEFDQ19IQVZFX01NX0hVR0VfUFRSKSB8fCAhZGVmaW5lZChIQVZFX01FTUNQWSkKKyAgICBhY2NfaGJ5dGVfcCBwMSA9IChhY2NfaGJ5dGVfcCkgZGVzdDsKKyAgICBjb25zdCBhY2NfaGJ5dGVfcCBwMiA9IChjb25zdCBhY2NfaGJ5dGVfcCkgc3JjOworICAgIGlmICghKGxlbiA+IDApIHx8IHAxID09IHAyKQorICAgICAgICByZXR1cm4gZGVzdDsKKyAgICBkbworICAgICAgICAqcDErKyA9ICpwMisrOworICAgIHdoaWxlIF9fYWNjX2xpa2VseSgtLWxlbiA+IDApOworICAgIHJldHVybiBkZXN0OworI2Vsc2UKKyAgICByZXR1cm4gbWVtY3B5KGRlc3QsIHNyYywgbGVuKTsKKyNlbmRpZgorfQorQUNDTElCX1BVQkxJQyhhY2NfaHZvaWRfcCwgYWNjX2htZW1tb3ZlKSAoYWNjX2h2b2lkX3AgZGVzdCwgY29uc3QgYWNjX2h2b2lkX3Agc3JjLCBhY2NfaHNpemVfdCBsZW4pCit7CisjaWYgKEFDQ19IQVZFX01NX0hVR0VfUFRSKSB8fCAhZGVmaW5lZChIQVZFX01FTU1PVkUpCisgICAgYWNjX2hieXRlX3AgcDEgPSAoYWNjX2hieXRlX3ApIGRlc3Q7CisgICAgY29uc3QgYWNjX2hieXRlX3AgcDIgPSAoY29uc3QgYWNjX2hieXRlX3ApIHNyYzsKKyAgICBpZiAoIShsZW4gPiAwKSB8fCBwMSA9PSBwMikKKyAgICAgICAgcmV0dXJuIGRlc3Q7CisgICAgaWYgKHAxIDwgcDIpCisgICAgeworICAgICAgICBkbworICAgICAgICAgICAgKnAxKysgPSAqcDIrKzsKKyAgICAgICAgd2hpbGUgX19hY2NfbGlrZWx5KC0tbGVuID4gMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHAxICs9IGxlbjsKKyAgICAgICAgcDIgKz0gbGVuOworICAgICAgICBkbworICAgICAgICAgICAgKi0tcDEgPSAqLS1wMjsKKyAgICAgICAgd2hpbGUgX19hY2NfbGlrZWx5KC0tbGVuID4gMCk7CisgICAgfQorICAgIHJldHVybiBkZXN0OworI2Vsc2UKKyAgICByZXR1cm4gbWVtbW92ZShkZXN0LCBzcmMsIGxlbik7CisjZW5kaWYKK30KK0FDQ0xJQl9QVUJMSUMoYWNjX2h2b2lkX3AsIGFjY19obWVtc2V0KSAoYWNjX2h2b2lkX3AgcywgaW50IGMsIGFjY19oc2l6ZV90IGxlbikKK3sKKyNpZiAoQUNDX0hBVkVfTU1fSFVHRV9QVFIpIHx8ICFkZWZpbmVkKEhBVkVfTUVNU0VUKQorICAgIGFjY19oYnl0ZV9wIHAgPSAoYWNjX2hieXRlX3ApIHM7CisgICAgaWYgX19hY2NfbGlrZWx5KGxlbiA+IDApIGRvCisgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikgYzsKKyAgICB3aGlsZSBfX2FjY19saWtlbHkoLS1sZW4gPiAwKTsKKyAgICByZXR1cm4gczsKKyNlbHNlCisgICAgcmV0dXJuIG1lbXNldChzLCBjLCBsZW4pOworI2VuZGlmCit9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19XQU5UX0FDQ0xJQl9SQU5EKQorIyAgdW5kZWYgQUNDX1dBTlRfQUNDTElCX1JBTkQKKyNkZWZpbmUgX19BQ0NMSUJfUkFORF9DSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoQUNDTElCX1BVQkxJQykKKyMgIGRlZmluZSBBQ0NMSUJfUFVCTElDKHIsZikgICAgciBfX0FDQ0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCitBQ0NMSUJfUFVCTElDKHZvaWQsIGFjY19zcmFuZDMxKSAoYWNjX3JhbmQzMV9wIHIsIGFjY191aW50MzJsX3Qgc2VlZCkKK3sKKyAgICByLT5zZWVkID0gc2VlZCAmIEFDQ19VSU5UMzJfQygweGZmZmZmZmZmKTsKK30KK0FDQ0xJQl9QVUJMSUMoYWNjX3VpbnQzMmxfdCwgYWNjX3JhbmQzMSkgKGFjY19yYW5kMzFfcCByKQoreworICAgIHItPnNlZWQgPSByLT5zZWVkICogQUNDX1VJTlQzMl9DKDExMDM1MTUyNDUpICsgMTIzNDU7CisgICAgci0+c2VlZCAmPSBBQ0NfVUlOVDMyX0MoMHg3ZmZmZmZmZik7CisgICAgcmV0dXJuIHItPnNlZWQ7Cit9CisjaWYgZGVmaW5lZChhY2NfaW50NjRsX3QpCitBQ0NMSUJfUFVCTElDKHZvaWQsIGFjY19zcmFuZDQ4KSAoYWNjX3JhbmQ0OF9wIHIsIGFjY191aW50MzJsX3Qgc2VlZCkKK3sKKyAgICByLT5zZWVkID0gc2VlZCAmIEFDQ19VSU5UMzJfQygweGZmZmZmZmZmKTsKKyAgICByLT5zZWVkIDw8PSAxNjsgci0+c2VlZCB8PSAweDMzMGU7Cit9CitBQ0NMSUJfUFVCTElDKGFjY191aW50MzJsX3QsIGFjY19yYW5kNDgpIChhY2NfcmFuZDQ4X3AgcikKK3sKKyAgICByLT5zZWVkID0gci0+c2VlZCAqIEFDQ19VSU5UNjRfQygyNTIxNDkwMzkxNykgKyAxMTsKKyAgICByLT5zZWVkICY9IEFDQ19VSU5UNjRfQygweGZmZmZmZmZmZmZmZik7CisgICAgcmV0dXJuIChhY2NfdWludDMybF90KSAoci0+c2VlZCA+PiAxNyk7Cit9CitBQ0NMSUJfUFVCTElDKGFjY191aW50MzJsX3QsIGFjY19yYW5kNDhfcjMyKSAoYWNjX3JhbmQ0OF9wIHIpCit7CisgICAgci0+c2VlZCA9IHItPnNlZWQgKiBBQ0NfVUlOVDY0X0MoMjUyMTQ5MDM5MTcpICsgMTE7CisgICAgci0+c2VlZCAmPSBBQ0NfVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmYpOworICAgIHJldHVybiAoYWNjX3VpbnQzMmxfdCkgKHItPnNlZWQgPj4gMTYpOworfQorI2VuZGlmCisjaWYgZGVmaW5lZChhY2NfaW50NjRsX3QpCitBQ0NMSUJfUFVCTElDKHZvaWQsIGFjY19zcmFuZDY0KSAoYWNjX3JhbmQ2NF9wIHIsIGFjY191aW50NjRsX3Qgc2VlZCkKK3sKKyAgICByLT5zZWVkID0gc2VlZCAmIEFDQ19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpOworfQorQUNDTElCX1BVQkxJQyhhY2NfdWludDMybF90LCBhY2NfcmFuZDY0KSAoYWNjX3JhbmQ2NF9wIHIpCit7CisgICAgci0+c2VlZCA9IHItPnNlZWQgKiBBQ0NfVUlOVDY0X0MoNjM2NDEzNjIyMzg0Njc5MzAwNSkgKyAxOworI2lmIChBQ0NfU0laRU9GX0FDQ19JTlQ2NExfVCA+IDgpCisgICAgci0+c2VlZCAmPSBBQ0NfVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKTsKKyNlbmRpZgorICAgIHJldHVybiAoYWNjX3VpbnQzMmxfdCkgKHItPnNlZWQgPj4gMzMpOworfQorQUNDTElCX1BVQkxJQyhhY2NfdWludDMybF90LCBhY2NfcmFuZDY0X3IzMikgKGFjY19yYW5kNjRfcCByKQoreworICAgIHItPnNlZWQgPSByLT5zZWVkICogQUNDX1VJTlQ2NF9DKDYzNjQxMzYyMjM4NDY3OTMwMDUpICsgMTsKKyNpZiAoQUNDX1NJWkVPRl9BQ0NfSU5UNjRMX1QgPiA4KQorICAgIHItPnNlZWQgJj0gQUNDX1VJTlQ2NF9DKDB4ZmZmZmZmZmZmZmZmZmZmZik7CisjZW5kaWYKKyAgICByZXR1cm4gKGFjY191aW50MzJsX3QpIChyLT5zZWVkID4+IDMyKTsKK30KKyNlbmRpZgorQUNDTElCX1BVQkxJQyh2b2lkLCBhY2Nfc3JhbmRtdCkgKGFjY19yYW5kbXRfcCByLCBhY2NfdWludDMybF90IHNlZWQpCit7CisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgZG8geworICAgICAgICByLT5zW2krK10gPSAoc2VlZCAmPSBBQ0NfVUlOVDMyX0MoMHhmZmZmZmZmZikpOworICAgICAgICBzZWVkIF49IHNlZWQgPj4gMzA7CisgICAgICAgIHNlZWQgPSBzZWVkICogQUNDX1VJTlQzMl9DKDB4NmMwNzg5NjUpICsgaTsKKyAgICB9IHdoaWxlIChpICE9IDYyNCk7CisgICAgci0+biA9IGk7Cit9CitBQ0NMSUJfUFVCTElDKGFjY191aW50MzJsX3QsIGFjY19yYW5kbXQpIChhY2NfcmFuZG10X3AgcikKK3sKKyAgICByZXR1cm4gKF9fQUNDTElCX0ZVTkNOQU1FKGFjY19yYW5kbXRfcjMyKShyKSkgPj4gMTsKK30KK0FDQ0xJQl9QVUJMSUMoYWNjX3VpbnQzMmxfdCwgYWNjX3JhbmRtdF9yMzIpIChhY2NfcmFuZG10X3AgcikKK3sKKyAgICBhY2NfdWludDMybF90IHY7CisgICAgaWYgX19hY2NfdW5saWtlbHkoci0+biA9PSA2MjQpIHsKKyAgICAgICAgaW50IGkgPSAwLCBqOworICAgICAgICByLT5uID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaiA9IGkgLSA2MjM7IGlmIChqIDwgMCkgaiArPSA2MjQ7CisgICAgICAgICAgICB2ID0gKHItPnNbaV0gJiBBQ0NfVUlOVDMyX0MoMHg4MDAwMDAwMCkpIF4gKHItPnNbal0gJiBBQ0NfVUlOVDMyX0MoMHg3ZmZmZmZmZikpOworICAgICAgICAgICAgaiA9IGkgLSAyMjc7IGlmIChqIDwgMCkgaiArPSA2MjQ7CisgICAgICAgICAgICByLT5zW2ldID0gci0+c1tqXSBeICh2ID4+IDEpOworICAgICAgICAgICAgaWYgKHYgJiAxKSByLT5zW2ldIF49IEFDQ19VSU5UMzJfQygweDk5MDhiMGRmKTsKKyAgICAgICAgfSB3aGlsZSAoKytpICE9IDYyNCk7CisgICAgfQorICAgIHYgPSByLT5zW3ItPm4rK107CisgICAgdiBePSB2ID4+IDExOyB2IF49ICh2ICYgQUNDX1VJTlQzMl9DKDB4MDEzYTU4YWQpKSA8PCA3OworICAgIHYgXj0gKHYgJiBBQ0NfVUlOVDMyX0MoMHgwMDAxZGY4YykpIDw8IDE1OyB2IF49IHYgPj4gMTg7CisgICAgcmV0dXJuIHY7Cit9CisjaWYgZGVmaW5lZChhY2NfaW50NjRsX3QpCitBQ0NMSUJfUFVCTElDKHZvaWQsIGFjY19zcmFuZG10NjQpIChhY2NfcmFuZG10NjRfcCByLCBhY2NfdWludDY0bF90IHNlZWQpCit7CisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgZG8geworICAgICAgICByLT5zW2krK10gPSAoc2VlZCAmPSBBQ0NfVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSk7CisgICAgICAgIHNlZWQgXj0gc2VlZCA+PiA2MjsKKyAgICAgICAgc2VlZCA9IHNlZWQgKiBBQ0NfVUlOVDY0X0MoMHg1ODUxZjQyZDRjOTU3ZjJkKSArIGk7CisgICAgfSB3aGlsZSAoaSAhPSAzMTIpOworICAgIHItPm4gPSBpOworfQorI2lmIDAKK0FDQ0xJQl9QVUJMSUMoYWNjX3VpbnQzMmxfdCwgYWNjX3JhbmRtdDY0KSAoYWNjX3JhbmRtdDY0X3AgcikKK3sKKyAgICBhY2NfdWludDY0bF90IHY7CisgICAgdiA9IChfX0FDQ0xJQl9GVU5DTkFNRShhY2NfcmFuZG10NjRfcjY0KShyKSkgPj4gMzM7CisgICAgcmV0dXJuIChhY2NfdWludDMybF90KSB2OworfQorI2VuZGlmCitBQ0NMSUJfUFVCTElDKGFjY191aW50NjRsX3QsIGFjY19yYW5kbXQ2NF9yNjQpIChhY2NfcmFuZG10NjRfcCByKQoreworICAgIGFjY191aW50NjRsX3QgdjsKKyAgICBpZiBfX2FjY191bmxpa2VseShyLT5uID09IDMxMikgeworICAgICAgICBpbnQgaSA9IDAsIGo7CisgICAgICAgIHItPm4gPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBqID0gaSAtIDMxMTsgaWYgKGogPCAwKSBqICs9IDMxMjsKKyAgICAgICAgICAgIHYgPSAoci0+c1tpXSAmIEFDQ19VSU5UNjRfQygweGZmZmZmZmZmODAwMDAwMDApKSBeIChyLT5zW2pdICYgQUNDX1VJTlQ2NF9DKDB4N2ZmZmZmZmYpKTsKKyAgICAgICAgICAgIGogPSBpIC0gMTU2OyBpZiAoaiA8IDApIGogKz0gMzEyOworICAgICAgICAgICAgci0+c1tpXSA9IHItPnNbal0gXiAodiA+PiAxKTsKKyAgICAgICAgICAgIGlmICh2ICYgMSkgci0+c1tpXSBePSBBQ0NfVUlOVDY0X0MoMHhiNTAyNmY1YWE5NjYxOWU5KTsKKyAgICAgICAgfSB3aGlsZSAoKytpICE9IDMxMik7CisgICAgfQorICAgIHYgPSByLT5zW3ItPm4rK107CisgICAgdiBePSAodiAmIEFDQ19VSU5UNjRfQygweGFhYWFhYWFhYTAwMDAwMDApKSA+PiAyOTsKKyAgICB2IF49ICh2ICYgQUNDX1VJTlQ2NF9DKDB4MzhlYjNmZmZmNmQzKSkgPDwgMTc7CisgICAgdiBePSAodiAmIEFDQ19VSU5UNjRfQygweDdmZmJmNzcpKSA8PCAzNzsKKyAgICByZXR1cm4gdiBeICh2ID4+IDQzKTsKK30KKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfV0FOVF9BQ0NMSUJfUkRUU0MpCisjICB1bmRlZiBBQ0NfV0FOVF9BQ0NMSUJfUkRUU0MKKyNkZWZpbmUgX19BQ0NMSUJfUkRUU0NfQ0hfSU5DTFVERUQgMQorI2lmICFkZWZpbmVkKEFDQ0xJQl9QVUJMSUMpCisjICBkZWZpbmUgQUNDTElCX1BVQkxJQyhyLGYpICAgIHIgX19BQ0NMSUJfRlVOQ05BTUUoZikKKyNlbmRpZgorI2lmIGRlZmluZWQoYWNjX2ludDMyZV90KQorI2lmIChBQ0NfT1NfV0lOMzIgJiYgQUNDX0NDX1BFTExFU0MgJiYgKF9fUE9DQ19fID49IDI5MCkpCisjICBwcmFnbWEgd2FybihwdXNoKQorIyAgcHJhZ21hIHdhcm4oZGlzYWJsZToyMDA3KQorI2VuZGlmCisjaWYgKEFDQ19BUkNIX0FNRDY0IHx8IEFDQ19BUkNIX0kzODYpICYmIChBQ0NfQVNNX1NZTlRBWF9HTlVDKQorI2lmIChBQ0NfQVJDSF9BTUQ2NCAmJiBBQ0NfQ0NfUEFUSFNDQUxFKQorIyAgZGVmaW5lIF9fQUNDTElCX1JEVFNDX1JFR1MgICA6IDogImMiICh0KSA6ICJjYyIsICJtZW1vcnkiLCAicmF4IiwgInJkeCIKKyNlbGlmIChBQ0NfQVJDSF9BTUQ2NCAmJiBBQ0NfQ0NfSU5URUxDKQorIyAgZGVmaW5lIF9fQUNDTElCX1JEVFNDX1JFR1MgICA6IDogInIiICh0KSA6ICJtZW1vcnkiLCAicmF4IiwgInJkeCIKKyNlbGlmIChBQ0NfQVJDSF9BTUQ2NCkKKyMgIGRlZmluZSBfX0FDQ0xJQl9SRFRTQ19SRUdTICAgOiA6ICJyIiAodCkgOiAiY2MiLCAibWVtb3J5IiwgInJheCIsICJyZHgiCisjZWxpZiAoQUNDX0FSQ0hfSTM4NiAmJiBBQ0NfQ0NfR05VQyAmJiAoQUNDX0NDX0dOVUMgPCAweDAyMDAwMHVsKSkKKyMgIGRlZmluZSBfX0FDQ0xJQl9SRFRTQ19SRUdTICAgOiA6ICJyIiAodCkgOiAiYXgiLCAiZHgiCisjZWxpZiAoQUNDX0FSQ0hfSTM4NiAmJiBBQ0NfQ0NfSU5URUxDKQorIyAgZGVmaW5lIF9fQUNDTElCX1JEVFNDX1JFR1MgICA6IDogInIiICh0KSA6ICJtZW1vcnkiLCAiZWF4IiwgImVkeCIKKyNlbGlmIChBQ0NfQVJDSF9JMzg2ICYmIEFDQ19DQ19QQVRIU0NBTEUpCisjICBkZWZpbmUgX19BQ0NMSUJfUkRUU0NfUkVHUyAgIDogOiAiYyIgKHQpIDogIm1lbW9yeSIsICJlYXgiLCAiZWR4IgorI2Vsc2UKKyMgIGRlZmluZSBfX0FDQ0xJQl9SRFRTQ19SRUdTICAgOiA6ICJyIiAodCkgOiAiY2MiLCAibWVtb3J5IiwgImVheCIsICJlZHgiCisjZW5kaWYKKyNlbmRpZgorQUNDTElCX1BVQkxJQyhpbnQsIGFjY190c2NfcmVhZCkgKGFjY191aW50MzJlX3QqIHQpCit7CisjaWYgKEFDQ19BUkNIX0FNRDY0IHx8IEFDQ19BUkNIX0kzODYpICYmIChBQ0NfQVNNX1NZTlRBWF9HTlVDKQorICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorICAgICAgICAiY2xjIFxuIiAiLmJ5dGUgMHgwZiwweDMxXG4iCisgICAgICAgICJtb3ZsICUlZWF4LCglMClcbiIgIm1vdmwgJSVlZHgsNCglMClcbiIKKyAgICAgICAgX19BQ0NMSUJfUkRUU0NfUkVHUworICAgICk7CisgICAgcmV0dXJuIDA7CisjZWxpZiAoQUNDX0FSQ0hfSTM4NikgJiYgKEFDQ19BU01fU1lOVEFYX01TQykKKyAgICBBQ0NfVU5VU0VEKHQpOworICAgIF9fYXNtIHsKKyAgICAgICAgbW92IGVjeCwgdAorICAgICAgICBjbGMKKyMgIGlmIChBQ0NfQ0NfTVNDICYmIChfTVNDX1ZFUiA8IDEyMDApKQorICAgICAgICBfZW1pdCAweDBmCisgICAgICAgIF9lbWl0IDB4MzEKKyMgIGVsc2UKKyAgICAgICAgcmR0c2MKKyMgIGVuZGlmCisgICAgICAgIG1vdiBbZWN4XSwgZWF4CisgICAgICAgIG1vdiBbZWN4KzRdLCBlZHgKKyAgICB9CisgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIHRbMF0gPSB0WzFdID0gMDsgcmV0dXJuIC0xOworI2VuZGlmCit9CisjaWYgKEFDQ19PU19XSU4zMiAmJiBBQ0NfQ0NfUEVMTEVTQyAmJiAoX19QT0NDX18gPj0gMjkwKSkKKyMgIHByYWdtYSB3YXJuKHBvcCkKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19XQU5UX0FDQ0xJQl9ET1NBTExPQykKKyMgIHVuZGVmIEFDQ19XQU5UX0FDQ0xJQl9ET1NBTExPQworI2RlZmluZSBfX0FDQ0xJQl9ET1NBTExPQ19DSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoQUNDTElCX1BVQkxJQykKKyMgIGRlZmluZSBBQ0NMSUJfUFVCTElDKHIsZikgICAgciBfX0FDQ0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCisjaWYgKEFDQ19PU19PUzIxNikKK0FDQ19FWFRFUk5fQyB1bnNpZ25lZCBzaG9ydCBfX2ZhciBfX3Bhc2NhbCBEb3NBbGxvY0h1Z2UodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCBfX2ZhciAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworQUNDX0VYVEVSTl9DIHVuc2lnbmVkIHNob3J0IF9fZmFyIF9fcGFzY2FsIERvc0ZyZWVTZWcodW5zaWduZWQgc2hvcnQpOworI2VuZGlmCisjaWYgKEFDQ19PU19ET1MxNiB8fCBBQ0NfT1NfV0lOMTYpCisjaWYgIWRlZmluZWQoQUNDX0NDX0FaVEVDQykKK0FDQ0xJQl9QVUJMSUModm9pZCBfX2ZhciosIGFjY19kb3NfYWxsb2MpICh1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgdm9pZCBfX2ZhciogcCA9IDA7CisgICAgdW5pb24gUkVHUyByaSwgcm87CisgICAgaWYgKChsb25nKXNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIHA7CisgICAgc2l6ZSA9IChzaXplICsgMTUpID4+IDQ7CisgICAgaWYgKHNpemUgPiAweGZmZmZ1KQorICAgICAgICByZXR1cm4gcDsKKyAgICByaS54LmF4ID0gMHg0ODAwOworICAgIHJpLnguYnggPSAodW5zaWduZWQgc2hvcnQpIHNpemU7CisgICAgaW50ODYoMHgyMSwgJnJpLCAmcm8pOworICAgIGlmICgocm8ueC5jZmxhZyAmIDEpID09IDApCisgICAgICAgIHAgPSAodm9pZCBfX2ZhciopIEFDQ19QVFJfTUtfRlAocm8ueC5heCwgMCk7CisgICAgcmV0dXJuIHA7Cit9CitBQ0NMSUJfUFVCTElDKGludCwgYWNjX2Rvc19mcmVlKSAodm9pZCBfX2ZhciogcCkKK3sKKyAgICB1bmlvbiBSRUdTIHJpLCBybzsKKyAgICBzdHJ1Y3QgU1JFR1MgcnM7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoQUNDX1BUUl9GUF9PRkYocCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlZ3JlYWQoJnJzKTsKKyAgICByaS54LmF4ID0gMHg0OTAwOworICAgIHJzLmVzID0gQUNDX1BUUl9GUF9TRUcocCk7CisgICAgaW50ODZ4KDB4MjEsICZyaSwgJnJvLCAmcnMpOworICAgIGlmIChyby54LmNmbGFnICYgMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKyNpZiAoQUNDX09TX09TMjE2KQorQUNDTElCX1BVQkxJQyh2b2lkIF9fZmFyKiwgYWNjX2Rvc19hbGxvYykgKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICB2b2lkIF9fZmFyKiBwID0gMDsKKyAgICB1bnNpZ25lZCBzaG9ydCBzZWwgPSAwOworICAgIGlmICgobG9uZylzaXplIDw9IDApCisgICAgICAgIHJldHVybiBwOworICAgIGlmIChEb3NBbGxvY0h1Z2UoKHVuc2lnbmVkIHNob3J0KShzaXplID4+IDE2KSwgKHVuc2lnbmVkIHNob3J0KXNpemUsICZzZWwsIDAsIDApID09IDApCisgICAgICAgIHAgPSAodm9pZCBfX2ZhciopIEFDQ19QVFJfTUtfRlAoc2VsLCAwKTsKKyAgICByZXR1cm4gcDsKK30KK0FDQ0xJQl9QVUJMSUMoaW50LCBhY2NfZG9zX2ZyZWUpICh2b2lkIF9fZmFyKiBwKQoreworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKEFDQ19QVFJfRlBfT0ZGKHApICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoRG9zRnJlZVNlZyhBQ0NfUFRSX0ZQX1NFRyhwKSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19XQU5UX0FDQ0xJQl9IQUxMT0MpCisjICB1bmRlZiBBQ0NfV0FOVF9BQ0NMSUJfSEFMTE9DCisjZGVmaW5lIF9fQUNDTElCX0hBTExPQ19DSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoQUNDTElCX1BVQkxJQykKKyMgIGRlZmluZSBBQ0NMSUJfUFVCTElDKHIsZikgICAgciBfX0FDQ0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCisjaWYgKEFDQ19IQVZFX01NX0hVR0VfUFRSKQorI2lmIDEgJiYgKEFDQ19PU19ET1MxNiAmJiBkZWZpbmVkKEJMWDI4NikpCisjICBkZWZpbmUgX19BQ0NMSUJfSEFMTE9DX1VTRV9EQUggMQorI2VsaWYgMSAmJiAoQUNDX09TX0RPUzE2ICYmIGRlZmluZWQoRE9TWDI4NikpCisjICBkZWZpbmUgX19BQ0NMSUJfSEFMTE9DX1VTRV9EQUggMQorI2VsaWYgMSAmJiAoQUNDX09TX09TMjE2KQorIyAgZGVmaW5lIF9fQUNDTElCX0hBTExPQ19VU0VfREFIIDEKKyNlbGlmIDEgJiYgKEFDQ19PU19XSU4xNikKKyMgIGRlZmluZSBfX0FDQ0xJQl9IQUxMT0NfVVNFX0dBIDEKKyNlbGlmIDEgJiYgKEFDQ19PU19ET1MxNikgJiYgKEFDQ19DQ19CT1JMQU5EQykgJiYgZGVmaW5lZChfX0RQTUkxNl9fKQorIyAgZGVmaW5lIF9fQUNDTElCX0hBTExPQ19VU0VfR0EgMQorI2VuZGlmCisjZW5kaWYKKyNpZiAoX19BQ0NMSUJfSEFMTE9DX1VTRV9EQUgpCisjaWYgMCAmJiAoQUNDX09TX09TMjE2KQorI2luY2x1ZGUgPG9zMi5oPgorI2Vsc2UKK0FDQ19FWFRFUk5fQyB1bnNpZ25lZCBzaG9ydCBfX2ZhciBfX3Bhc2NhbCBEb3NBbGxvY0h1Z2UodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCBfX2ZhciAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworQUNDX0VYVEVSTl9DIHVuc2lnbmVkIHNob3J0IF9fZmFyIF9fcGFzY2FsIERvc0ZyZWVTZWcodW5zaWduZWQgc2hvcnQpOworI2VuZGlmCisjZW5kaWYKKyNpZiAoX19BQ0NMSUJfSEFMTE9DX1VTRV9HQSkKKyNpZiAwCisjZGVmaW5lIFNUUklDVCAxCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKK0FDQ19FWFRFUk5fQyBjb25zdCB2b2lkIF9fbmVhciogX19mYXIgX19wYXNjYWwgR2xvYmFsQWxsb2ModW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOworQUNDX0VYVEVSTl9DIGNvbnN0IHZvaWQgX19uZWFyKiBfX2ZhciBfX3Bhc2NhbCBHbG9iYWxGcmVlKGNvbnN0IHZvaWQgX19uZWFyKik7CitBQ0NfRVhURVJOX0MgdW5zaWduZWQgbG9uZyBfX2ZhciBfX3Bhc2NhbCBHbG9iYWxIYW5kbGUodW5zaWduZWQpOworQUNDX0VYVEVSTl9DIHZvaWQgX19mYXIqIF9fZmFyIF9fcGFzY2FsIEdsb2JhbExvY2soY29uc3Qgdm9pZCBfX25lYXIqKTsKK0FDQ19FWFRFUk5fQyBpbnQgX19mYXIgX19wYXNjYWwgR2xvYmFsVW5sb2NrKGNvbnN0IHZvaWQgX19uZWFyKik7CisjZW5kaWYKKyNlbmRpZgorQUNDTElCX1BVQkxJQyhhY2NfaHZvaWRfcCwgYWNjX2hhbGxvYykgKGFjY19oc2l6ZV90IHNpemUpCit7CisgICAgYWNjX2h2b2lkX3AgcCA9IDA7CisgICAgaWYgKCEoc2l6ZSA+IDApKQorICAgICAgICByZXR1cm4gcDsKKyNpZiAwICYmIGRlZmluZWQoX19wYWxtb3NfXykKKyAgICBwID0gTWVtUHRyTmV3KHNpemUpOworI2VsaWYgIWRlZmluZWQoQUNDX0hBVkVfTU1fSFVHRV9QVFIpCisgICAgaWYgKHNpemUgPCAoc2l6ZV90KSAtMSkKKyAgICAgICAgcCA9IG1hbGxvYygoc2l6ZV90KSBzaXplKTsKKyNlbHNlCisgICAgaWYgKChsb25nKXNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIHA7Cit7CisjaWYgKF9fQUNDTElCX0hBTExPQ19VU0VfREFIKQorICAgIHVuc2lnbmVkIHNob3J0IHNlbCA9IDA7CisgICAgaWYgKERvc0FsbG9jSHVnZSgodW5zaWduZWQgc2hvcnQpKHNpemUgPj4gMTYpLCAodW5zaWduZWQgc2hvcnQpc2l6ZSwgJnNlbCwgMCwgMCkgPT0gMCkKKyAgICAgICAgcCA9IChhY2NfaHZvaWRfcCkgQUNDX1BUUl9NS19GUChzZWwsIDApOworI2VsaWYgKF9fQUNDTElCX0hBTExPQ19VU0VfR0EpCisgICAgY29uc3Qgdm9pZCBfX25lYXIqIGggPSBHbG9iYWxBbGxvYygyLCBzaXplKTsKKyAgICBpZiAoaCkgeworICAgICAgICBwID0gR2xvYmFsTG9jayhoKTsKKyAgICAgICAgaWYgKHAgJiYgQUNDX1BUUl9GUF9PRkYocCkgIT0gMCkgeworICAgICAgICAgICAgR2xvYmFsVW5sb2NrKGgpOworICAgICAgICAgICAgcCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgR2xvYmFsRnJlZShoKTsKKyAgICB9CisjZWxpZiAoQUNDX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gNzAwKSkKKyAgICBwID0gX2hhbGxvYyhzaXplLCAxKTsKKyNlbGlmIChBQ0NfQ0NfTVNDIHx8IEFDQ19DQ19XQVRDT01DKQorICAgIHAgPSBoYWxsb2Moc2l6ZSwgMSk7CisjZWxpZiAoQUNDX0NDX0RNQyB8fCBBQ0NfQ0NfU1lNQU5URUNDIHx8IEFDQ19DQ19aT1JURUNIQykKKyAgICBwID0gZmFybWFsbG9jKHNpemUpOworI2VsaWYgKEFDQ19DQ19CT1JMQU5EQyB8fCBBQ0NfQ0NfVFVSQk9DKQorICAgIHAgPSBmYXJtYWxsb2Moc2l6ZSk7CisjZWxpZiBkZWZpbmVkKEFDQ19DQ19BWlRFQ0MpCisgICAgcCA9IGxtYWxsb2Moc2l6ZSk7CisjZWxzZQorICAgIGlmIChzaXplIDwgKHNpemVfdCkgLTEpCisgICAgICAgIHAgPSBtYWxsb2MoKHNpemVfdCkgc2l6ZSk7CisjZW5kaWYKK30KKyNlbmRpZgorICAgIHJldHVybiBwOworfQorQUNDTElCX1BVQkxJQyh2b2lkLCBhY2NfaGZyZWUpIChhY2NfaHZvaWRfcCBwKQoreworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuOworI2lmIDAgJiYgZGVmaW5lZChfX3BhbG1vc19fKQorICAgIE1lbVB0ckZyZWUocCk7CisjZWxpZiAhZGVmaW5lZChBQ0NfSEFWRV9NTV9IVUdFX1BUUikKKyAgICBmcmVlKHApOworI2Vsc2UKKyNpZiAoX19BQ0NMSUJfSEFMTE9DX1VTRV9EQUgpCisgICAgaWYgKEFDQ19QVFJfRlBfT0ZGKHApID09IDApCisgICAgICAgIERvc0ZyZWVTZWcoKHVuc2lnbmVkIHNob3J0KSBBQ0NfUFRSX0ZQX1NFRyhwKSk7CisjZWxpZiAoX19BQ0NMSUJfSEFMTE9DX1VTRV9HQSkKKyAgICBpZiAoQUNDX1BUUl9GUF9PRkYocCkgPT0gMCkgeworICAgICAgICBjb25zdCB2b2lkIF9fbmVhciogaCA9IChjb25zdCB2b2lkIF9fbmVhciopICh1bnNpZ25lZCkgR2xvYmFsSGFuZGxlKEFDQ19QVFJfRlBfU0VHKHApKTsKKyAgICAgICAgaWYgKGgpIHsKKyAgICAgICAgICAgIEdsb2JhbFVubG9jayhoKTsKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoaCk7CisgICAgICAgIH0KKyAgICB9CisjZWxpZiAoQUNDX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gNzAwKSkKKyAgICBfaGZyZWUocCk7CisjZWxpZiAoQUNDX0NDX01TQyB8fCBBQ0NfQ0NfV0FUQ09NQykKKyAgICBoZnJlZShwKTsKKyNlbGlmIChBQ0NfQ0NfRE1DIHx8IEFDQ19DQ19TWU1BTlRFQ0MgfHwgQUNDX0NDX1pPUlRFQ0hDKQorICAgIGZhcmZyZWUoKHZvaWQgX19mYXIqKSBwKTsKKyNlbGlmIChBQ0NfQ0NfQk9STEFOREMgfHwgQUNDX0NDX1RVUkJPQykKKyAgICBmYXJmcmVlKCh2b2lkIF9fZmFyKikgcCk7CisjZWxpZiBkZWZpbmVkKEFDQ19DQ19BWlRFQ0MpCisgICAgbGZyZWUocCk7CisjZWxzZQorICAgIGZyZWUocCk7CisjZW5kaWYKKyNlbmRpZgorfQorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfV0FOVF9BQ0NMSUJfSEZSRUFEKQorIyAgdW5kZWYgQUNDX1dBTlRfQUNDTElCX0hGUkVBRAorI2RlZmluZSBfX0FDQ0xJQl9IRlJFQURfQ0hfSU5DTFVERUQgMQorI2lmICFkZWZpbmVkKEFDQ0xJQl9QVUJMSUMpCisjICBkZWZpbmUgQUNDTElCX1BVQkxJQyhyLGYpICAgIHIgX19BQ0NMSUJfRlVOQ05BTUUoZikKKyNlbmRpZgorQUNDTElCX1BVQkxJQyhhY2NfaHNpemVfdCwgYWNjX2hmcmVhZCkgKHZvaWQqIHZmcCwgYWNjX2h2b2lkX3AgYnVmLCBhY2NfaHNpemVfdCBzaXplKQoreworICAgIEZJTEUqIGZwID0gKEZJTEUgKikgdmZwOworI2lmIChBQ0NfSEFWRV9NTV9IVUdFX1BUUikKKyNpZiAoQUNDX01NX1RJTlkgfHwgQUNDX01NX1NNQUxMIHx8IEFDQ19NTV9NRURJVU0pCisjZGVmaW5lIF9fQUNDTElCX1JFUVVJUkVfSE1FTUNQWV9DSCAxCisgICAgdW5zaWduZWQgY2hhciB0bXBbNTEyXTsKKyAgICBhY2NfaHNpemVfdCBsID0gMDsKKyAgICB3aGlsZSAobCA8IHNpemUpCisgICAgeworICAgICAgICBzaXplX3QgbiA9IHNpemUgLSBsID4gc2l6ZW9mKHRtcCkgPyBzaXplb2YodG1wKSA6IChzaXplX3QpIChzaXplIC0gbCk7CisgICAgICAgIG4gPSBmcmVhZCh0bXAsIDEsIG4sIGZwKTsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBfX0FDQ0xJQl9GVU5DTkFNRShhY2NfaG1lbWNweSkoKGFjY19oYnl0ZV9wKWJ1ZiArIGwsIHRtcCwgKGFjY19oc2l6ZV90KW4pOworICAgICAgICBsICs9IG47CisgICAgfQorICAgIHJldHVybiBsOworI2VsaWYgKEFDQ19NTV9DT01QQUNUIHx8IEFDQ19NTV9MQVJHRSB8fCBBQ0NfTU1fSFVHRSkKKyAgICBhY2NfaGJ5dGVfcCBiID0gKGFjY19oYnl0ZV9wKSBidWY7CisgICAgYWNjX2hzaXplX3QgbCA9IDA7CisgICAgd2hpbGUgKGwgPCBzaXplKQorICAgIHsKKyAgICAgICAgc2l6ZV90IG47CisgICAgICAgIG4gPSBBQ0NfUFRSX0ZQX09GRihiKTsgbiA9IChuIDw9IDEpID8gMHg4MDAwdSA6ICgwdSAtIG4pOworICAgICAgICBpZiAoKGFjY19oc2l6ZV90KSBuID4gc2l6ZSAtIGwpCisgICAgICAgICAgICBuID0gKHNpemVfdCkgKHNpemUgLSBsKTsKKyAgICAgICAgbiA9IGZyZWFkKCh2b2lkIF9fZmFyKiliLCAxLCBuLCBmcCk7CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYiArPSBuOyBsICs9IG47CisgICAgfQorICAgIHJldHVybiBsOworI2Vsc2UKKyMgIGVycm9yICJ1bmtub3duIG1lbW9yeSBtb2RlbCIKKyNlbmRpZgorI2Vsc2UKKyAgICByZXR1cm4gZnJlYWQoYnVmLCAxLCBzaXplLCBmcCk7CisjZW5kaWYKK30KK0FDQ0xJQl9QVUJMSUMoYWNjX2hzaXplX3QsIGFjY19oZndyaXRlKSAodm9pZCogdmZwLCBjb25zdCBhY2NfaHZvaWRfcCBidWYsIGFjY19oc2l6ZV90IHNpemUpCit7CisgICAgRklMRSogZnAgPSAoRklMRSAqKSB2ZnA7CisjaWYgKEFDQ19IQVZFX01NX0hVR0VfUFRSKQorI2lmIChBQ0NfTU1fVElOWSB8fCBBQ0NfTU1fU01BTEwgfHwgQUNDX01NX01FRElVTSkKKyNkZWZpbmUgX19BQ0NMSUJfUkVRVUlSRV9ITUVNQ1BZX0NIIDEKKyAgICB1bnNpZ25lZCBjaGFyIHRtcFs1MTJdOworICAgIGFjY19oc2l6ZV90IGwgPSAwOworICAgIHdoaWxlIChsIDwgc2l6ZSkKKyAgICB7CisgICAgICAgIHNpemVfdCBuID0gc2l6ZSAtIGwgPiBzaXplb2YodG1wKSA/IHNpemVvZih0bXApIDogKHNpemVfdCkgKHNpemUgLSBsKTsKKyAgICAgICAgX19BQ0NMSUJfRlVOQ05BTUUoYWNjX2htZW1jcHkpKHRtcCwgKGNvbnN0IGFjY19oYnl0ZV9wKWJ1ZiArIGwsIChhY2NfaHNpemVfdCluKTsKKyAgICAgICAgbiA9IGZ3cml0ZSh0bXAsIDEsIG4sIGZwKTsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsICs9IG47CisgICAgfQorICAgIHJldHVybiBsOworI2VsaWYgKEFDQ19NTV9DT01QQUNUIHx8IEFDQ19NTV9MQVJHRSB8fCBBQ0NfTU1fSFVHRSkKKyAgICBjb25zdCBhY2NfaGJ5dGVfcCBiID0gKGNvbnN0IGFjY19oYnl0ZV9wKSBidWY7CisgICAgYWNjX2hzaXplX3QgbCA9IDA7CisgICAgd2hpbGUgKGwgPCBzaXplKQorICAgIHsKKyAgICAgICAgc2l6ZV90IG47CisgICAgICAgIG4gPSBBQ0NfUFRSX0ZQX09GRihiKTsgbiA9IChuIDw9IDEpID8gMHg4MDAwdSA6ICgwdSAtIG4pOworICAgICAgICBpZiAoKGFjY19oc2l6ZV90KSBuID4gc2l6ZSAtIGwpCisgICAgICAgICAgICBuID0gKHNpemVfdCkgKHNpemUgLSBsKTsKKyAgICAgICAgbiA9IGZ3cml0ZSgodm9pZCBfX2ZhciopYiwgMSwgbiwgZnApOworICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGIgKz0gbjsgbCArPSBuOworICAgIH0KKyAgICByZXR1cm4gbDsKKyNlbHNlCisjICBlcnJvciAidW5rbm93biBtZW1vcnkgbW9kZWwiCisjZW5kaWYKKyNlbHNlCisgICAgcmV0dXJuIGZ3cml0ZShidWYsIDEsIHNpemUsIGZwKTsKKyNlbmRpZgorfQorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfV0FOVF9BQ0NMSUJfSFNSRUFEKQorIyAgdW5kZWYgQUNDX1dBTlRfQUNDTElCX0hTUkVBRAorI2RlZmluZSBfX0FDQ0xJQl9IU1JFQURfQ0hfSU5DTFVERUQgMQorI2lmICFkZWZpbmVkKEFDQ0xJQl9QVUJMSUMpCisjICBkZWZpbmUgQUNDTElCX1BVQkxJQyhyLGYpICAgIHIgX19BQ0NMSUJfRlVOQ05BTUUoZikKKyNlbmRpZgorQUNDTElCX1BVQkxJQyhsb25nLCBhY2Nfc2FmZV9ocmVhZCkgKGludCBmZCwgYWNjX2h2b2lkX3AgYnVmLCBsb25nIHNpemUpCit7CisgICAgYWNjX2hieXRlX3AgYiA9IChhY2NfaGJ5dGVfcCkgYnVmOworICAgIGxvbmcgbCA9IDA7CisgICAgaW50IHNhdmVkX2Vycm5vOworICAgIHNhdmVkX2Vycm5vID0gZXJybm87CisgICAgd2hpbGUgKGwgPCBzaXplKQorICAgIHsKKyAgICAgICAgbG9uZyBuID0gc2l6ZSAtIGw7CisjaWYgKEFDQ19IQVZFX01NX0hVR0VfUFRSKQorIyAgZGVmaW5lIF9fQUNDTElCX1JFUVVJUkVfSFJFQURfQ0ggMQorICAgICAgICBlcnJubyA9IDA7IG4gPSBhY2NfaHJlYWQoZmQsIGIsIG4pOworI2VsaWYgKEFDQ19PU19ET1MzMikgJiYgZGVmaW5lZChfX0RKR1BQX18pCisgICAgICAgIGVycm5vID0gMDsgbiA9IF9yZWFkKGZkLCBiLCBuKTsKKyNlbHNlCisgICAgICAgIGVycm5vID0gMDsgbiA9IHJlYWQoZmQsIGIsIG4pOworI2VuZGlmCisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKG4gPCAwKSB7CisjaWYgZGVmaW5lZChFQUdBSU4pCisgICAgICAgICAgICBpZiAoZXJybm8gPT0gKEVBR0FJTikpIGNvbnRpbnVlOworI2VuZGlmCisjaWYgZGVmaW5lZChFSU5UUikKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSAoRUlOVFIpKSBjb250aW51ZTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGVycm5vID09IDApIGVycm5vID0gMTsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisgICAgICAgIGIgKz0gbjsgbCArPSBuOworICAgIH0KKyAgICBlcnJubyA9IHNhdmVkX2Vycm5vOworICAgIHJldHVybiBsOworfQorQUNDTElCX1BVQkxJQyhsb25nLCBhY2Nfc2FmZV9od3JpdGUpIChpbnQgZmQsIGNvbnN0IGFjY19odm9pZF9wIGJ1ZiwgbG9uZyBzaXplKQoreworICAgIGNvbnN0IGFjY19oYnl0ZV9wIGIgPSAoY29uc3QgYWNjX2hieXRlX3ApIGJ1ZjsKKyAgICBsb25nIGwgPSAwOworICAgIGludCBzYXZlZF9lcnJubzsKKyAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgIHdoaWxlIChsIDwgc2l6ZSkKKyAgICB7CisgICAgICAgIGxvbmcgbiA9IHNpemUgLSBsOworI2lmIChBQ0NfSEFWRV9NTV9IVUdFX1BUUikKKyMgIGRlZmluZSBfX0FDQ0xJQl9SRVFVSVJFX0hSRUFEX0NIIDEKKyAgICAgICAgZXJybm8gPSAwOyBuID0gYWNjX2h3cml0ZShmZCwgYiwgbik7CisjZWxpZiAoQUNDX09TX0RPUzMyKSAmJiBkZWZpbmVkKF9fREpHUFBfXykKKyAgICAgICAgZXJybm8gPSAwOyBuID0gX3dyaXRlKGZkLCBiLCBuKTsKKyNlbHNlCisgICAgICAgIGVycm5vID0gMDsgbiA9IHdyaXRlKGZkLCBiLCBuKTsKKyNlbmRpZgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChuIDwgMCkgeworI2lmIGRlZmluZWQoRUFHQUlOKQorICAgICAgICAgICAgaWYgKGVycm5vID09IChFQUdBSU4pKSBjb250aW51ZTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRUlOVFIpCisgICAgICAgICAgICBpZiAoZXJybm8gPT0gKEVJTlRSKSkgY29udGludWU7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSAwKSBlcnJubyA9IDE7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorICAgICAgICBiICs9IG47IGwgKz0gbjsKKyAgICB9CisgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKKyAgICByZXR1cm4gbDsKK30KKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX1dBTlRfQUNDTElCX1BDTE9DSykKKyMgIHVuZGVmIEFDQ19XQU5UX0FDQ0xJQl9QQ0xPQ0sKKyNkZWZpbmUgX19BQ0NMSUJfUENMT0NLX0NIX0lOQ0xVREVEIDEKKyNpZiAhZGVmaW5lZChBQ0NMSUJfUFVCTElDKQorIyAgZGVmaW5lIEFDQ0xJQl9QVUJMSUMocixmKSAgICByIF9fQUNDTElCX0ZVTkNOQU1FKGYpCisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQorI2lmbmRlZiBhY2NfcGNsb2NrX3JlYWRfZ2V0dGltZW9mZGF5CisjZGVmaW5lIGFjY19wY2xvY2tfcmVhZF9nZXR0aW1lb2ZkYXkgYWNjX3BjbG9ja19yZWFkX2dldHRpbWVvZmRheQorI2VuZGlmCitzdGF0aWMgaW50IGFjY19wY2xvY2tfcmVhZF9nZXR0aW1lb2ZkYXkoYWNjX3BjbG9ja19oYW5kbGVfcCBoLCBhY2NfcGNsb2NrX3AgYykKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0diwgMCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworI2lmIGRlZmluZWQoYWNjX2ludDY0bF90KQorICAgIGMtPnR2X3NlYyA9IHR2LnR2X3NlYzsKKyNlbHNlCisgICAgYy0+dHZfc2VjX2hpZ2ggPSAwOworICAgIGMtPnR2X3NlY19sb3cgPSB0di50dl9zZWM7CisjZW5kaWYKKyAgICBjLT50dl9uc2VjID0gKGFjY191aW50MzJsX3QpICh0di50dl91c2VjICogMTAwMHUpOworICAgIEFDQ19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgZGVmaW5lZChDTE9DS1NfUEVSX1NFQykKKyNpZm5kZWYgYWNjX3BjbG9ja19yZWFkX2Nsb2NrCisjZGVmaW5lIGFjY19wY2xvY2tfcmVhZF9jbG9jayBhY2NfcGNsb2NrX3JlYWRfY2xvY2sKKyNlbmRpZgorc3RhdGljIGludCBhY2NfcGNsb2NrX3JlYWRfY2xvY2soYWNjX3BjbG9ja19oYW5kbGVfcCBoLCBhY2NfcGNsb2NrX3AgYykKK3sKKyAgICBjbG9ja190IHRpY2tzOworICAgIGRvdWJsZSBzZWNzOworI2lmIGRlZmluZWQoYWNjX2ludDY0bF90KQorICAgIGFjY191aW50NjRsX3QgbnNlY3M7CisgICAgdGlja3MgPSBjbG9jaygpOworICAgIHNlY3MgPSAoZG91YmxlKXRpY2tzIC8gKENMT0NLU19QRVJfU0VDKTsKKyAgICBuc2VjcyA9IChhY2NfdWludDY0bF90KSAoc2VjcyAqIDEwMDAwMDAwMDAuMCk7CisgICAgYy0+dHZfc2VjID0gKGFjY19pbnQ2NGxfdCkgKG5zZWNzIC8gMTAwMDAwMDAwMHVsKTsKKyAgICBjLT50dl9uc2VjID0gKGFjY191aW50MzJsX3QpIChuc2VjcyAlIDEwMDAwMDAwMDB1bCk7CisjZWxzZQorICAgIHRpY2tzID0gY2xvY2soKTsKKyAgICBzZWNzID0gKGRvdWJsZSl0aWNrcyAvIChDTE9DS1NfUEVSX1NFQyk7CisgICAgYy0+dHZfc2VjX2hpZ2ggPSAwOworICAgIGMtPnR2X3NlY19sb3cgPSAoYWNjX3VpbnQzMmxfdCkgKHNlY3MgKyAwLjUpOworICAgIGMtPnR2X25zZWMgPSAwOworI2VuZGlmCisgICAgQUNDX1VOVVNFRChoKTsgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNpZiAoQUNDX09TX0RPUzMyICYmIEFDQ19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fREpHUFBfXykgJiYgZGVmaW5lZChVQ0xPQ0tTX1BFUl9TRUMpCisjaWZuZGVmIGFjY19wY2xvY2tfcmVhZF91Y2xvY2sKKyNkZWZpbmUgYWNjX3BjbG9ja19yZWFkX3VjbG9jayBhY2NfcGNsb2NrX3JlYWRfdWNsb2NrCisjZW5kaWYKK3N0YXRpYyBpbnQgYWNjX3BjbG9ja19yZWFkX3VjbG9jayhhY2NfcGNsb2NrX2hhbmRsZV9wIGgsIGFjY19wY2xvY2tfcCBjKQoreworICAgIGFjY191aW50NjRsX3QgdGlja3M7CisgICAgZG91YmxlIHNlY3M7CisgICAgYWNjX3VpbnQ2NGxfdCBuc2VjczsKKyAgICB0aWNrcyA9IHVjbG9jaygpOworICAgIHNlY3MgPSAoZG91YmxlKXRpY2tzIC8gKFVDTE9DS1NfUEVSX1NFQyk7CisgICAgbnNlY3MgPSAoYWNjX3VpbnQ2NGxfdCkgKHNlY3MgKiAxMDAwMDAwMDAwLjApOworICAgIGMtPnR2X3NlYyA9IG5zZWNzIC8gMTAwMDAwMDAwMHVsOworICAgIGMtPnR2X25zZWMgPSAoYWNjX3VpbnQzMmxfdCkgKG5zZWNzICUgMTAwMDAwMDAwMHVsKTsKKyAgICBBQ0NfVU5VU0VEKGgpOyByZXR1cm4gMDsKK30KKyNlbmRpZgorI2lmIDAgJiYgZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUUpICYmIGRlZmluZWQoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEKSAmJiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyNpZm5kZWYgYWNjX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfcAorI2RlZmluZSBhY2NfcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9wIGFjY19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3AKKyNlbmRpZgorc3RhdGljIGludCBhY2NfcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9wKGFjY19wY2xvY2tfaGFuZGxlX3AgaCwgYWNjX3BjbG9ja19wIGMpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJnRzKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYy0+dHZfc2VjID0gdHMudHZfc2VjOworICAgIGMtPnR2X25zZWMgPSB0cy50dl9uc2VjOworICAgIEFDQ19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgKEFDQ19PU19DWUdXSU4gfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkgJiYgKEFDQ19IQVZFX1dJTkRPV1NfSCkgJiYgZGVmaW5lZChhY2NfaW50NjRsX3QpCisjaWZuZGVmIGFjY19wY2xvY2tfcmVhZF9nZXRwcm9jZXNzdGltZXMKKyNkZWZpbmUgYWNjX3BjbG9ja19yZWFkX2dldHByb2Nlc3N0aW1lcyBhY2NfcGNsb2NrX3JlYWRfZ2V0cHJvY2Vzc3RpbWVzCisjZW5kaWYKK3N0YXRpYyBpbnQgYWNjX3BjbG9ja19yZWFkX2dldHByb2Nlc3N0aW1lcyhhY2NfcGNsb2NrX2hhbmRsZV9wIGgsIGFjY19wY2xvY2tfcCBjKQoreworICAgIEZJTEVUSU1FIGN0LCBldCwga3QsIHV0OworICAgIGFjY191aW50NjRsX3QgdGlja3M7CisgICAgaWYgKEdldFByb2Nlc3NUaW1lcyhHZXRDdXJyZW50UHJvY2VzcygpLCAmY3QsICZldCwgJmt0LCAmdXQpID09IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICB0aWNrcyA9ICgoYWNjX3VpbnQ2NGxfdCl1dC5kd0hpZ2hEYXRlVGltZSA8PCAzMikgfCB1dC5kd0xvd0RhdGVUaW1lOworICAgIGlmIF9fYWNjX3VubGlrZWx5KGgtPnRpY2tzX2Jhc2UgPT0gMCkKKyAgICAgICAgaC0+dGlja3NfYmFzZSA9IHRpY2tzOworICAgIGVsc2UKKyAgICAgICAgdGlja3MgLT0gaC0+dGlja3NfYmFzZTsKKyAgICBjLT50dl9zZWMgPSAoYWNjX2ludDY0bF90KSAodGlja3MgLyAxMDAwMDAwMHVsKTsKKyAgICBjLT50dl9uc2VjID0gKGFjY191aW50MzJsX3QpKHRpY2tzICUgMTAwMDAwMDB1bCkgKiAxMDB1OworICAgIEFDQ19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0dFVFJVU0FHRSkgJiYgZGVmaW5lZChSVVNBR0VfU0VMRikKKyNpZm5kZWYgYWNjX3BjbG9ja19yZWFkX2dldHJ1c2FnZQorI2RlZmluZSBhY2NfcGNsb2NrX3JlYWRfZ2V0cnVzYWdlIGFjY19wY2xvY2tfcmVhZF9nZXRydXNhZ2UKKyNlbmRpZgorc3RhdGljIGludCBhY2NfcGNsb2NrX3JlYWRfZ2V0cnVzYWdlKGFjY19wY2xvY2tfaGFuZGxlX3AgaCwgYWNjX3BjbG9ja19wIGMpCit7CisgICAgc3RydWN0IHJ1c2FnZSBydTsKKyAgICBpZiAoZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnUpICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKyNpZiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyAgICBjLT50dl9zZWMgPSBydS5ydV91dGltZS50dl9zZWM7CisjZWxzZQorICAgIGMtPnR2X3NlY19oaWdoID0gMDsKKyAgICBjLT50dl9zZWNfbG93ID0gcnUucnVfdXRpbWUudHZfc2VjOworI2VuZGlmCisgICAgYy0+dHZfbnNlYyA9IChhY2NfdWludDMybF90KSAocnUucnVfdXRpbWUudHZfdXNlYyAqIDEwMDB1KTsKKyAgICBBQ0NfVU5VU0VEKGgpOyByZXR1cm4gMDsKK30KKyNlbmRpZgorI2lmIChfX0FDQ0xJQl9QQ0xPQ0tfVVNFX1BFUkZDVFIpCisjaWZuZGVmIGFjY19wY2xvY2tfcmVhZF9wZXJmY3RyCisjZGVmaW5lIGFjY19wY2xvY2tfcmVhZF9wZXJmY3RyIGFjY19wY2xvY2tfcmVhZF9wZXJmY3RyCisjZW5kaWYKK3N0YXRpYyBpbnQgYWNjX3BjbG9ja19yZWFkX3BlcmZjdHIoYWNjX3BjbG9ja19oYW5kbGVfcCBoLCBhY2NfcGNsb2NrX3AgYykKK3sKKyAgICBhY2NfcGVyZmN0cl9jbG9ja190IHBjYzsKKyAgICBkb3VibGUgc2VjczsKKyAgICBhY2NfdWludDY0bF90IG5zZWNzOworICAgIGFjY19wZXJmY3RyX3JlYWQoJmgtPnBjaCwgJnBjYyk7CisgICAgaWYgX19hY2NfdW5saWtlbHkoaC0+dGlja3NfYmFzZSA9PSAwKQorICAgICAgICBoLT50aWNrc19iYXNlID0gcGNjLnRzYzsKKyAgICBlbHNlCisgICAgICAgIHBjYy50c2MgLT0gaC0+dGlja3NfYmFzZTsKKyAgICBzZWNzID0gcGNjLnRzYyAqIGgtPnBjaC50c2NfdG9fc2Vjb25kczsKKyAgICBuc2VjcyA9IChhY2NfdWludDY0bF90KSAoc2VjcyAqIDEwMDAwMDAwMDAuMCk7CisgICAgYy0+dHZfc2VjID0gbnNlY3MgLyAxMDAwMDAwMDAwdWw7CisgICAgYy0+dHZfbnNlYyA9IChhY2NfdWludDMybF90KSAobnNlY3MgJSAxMDAwMDAwMDAwdWwpOworICAgIEFDQ19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgMCAmJiBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkgJiYgZGVmaW5lZChDTE9DS19USFJFQURfQ1BVVElNRV9JRCkgJiYgZGVmaW5lZChhY2NfaW50NjRsX3QpCisjaWZuZGVmIGFjY19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3QKKyNkZWZpbmUgYWNjX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfdCBhY2NfcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV90CisjZW5kaWYKK3N0YXRpYyBpbnQgYWNjX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfdChhY2NfcGNsb2NrX2hhbmRsZV9wIGgsIGFjY19wY2xvY2tfcCBjKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICBpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJnRzKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYy0+dHZfc2VjID0gdHMudHZfc2VjOworICAgIGMtPnR2X25zZWMgPSB0cy50dl9uc2VjOworICAgIEFDQ19VTlVTRUQoaCk7IHJldHVybiAwOworfQorI2VuZGlmCisjaWYgKEFDQ19PU19DWUdXSU4gfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkgJiYgKEFDQ19IQVZFX1dJTkRPV1NfSCkgJiYgZGVmaW5lZChhY2NfaW50NjRsX3QpCisjaWZuZGVmIGFjY19wY2xvY2tfcmVhZF9nZXR0aHJlYWR0aW1lcworI2RlZmluZSBhY2NfcGNsb2NrX3JlYWRfZ2V0dGhyZWFkdGltZXMgYWNjX3BjbG9ja19yZWFkX2dldHRocmVhZHRpbWVzCisjZW5kaWYKK3N0YXRpYyBpbnQgYWNjX3BjbG9ja19yZWFkX2dldHRocmVhZHRpbWVzKGFjY19wY2xvY2tfaGFuZGxlX3AgaCwgYWNjX3BjbG9ja19wIGMpCit7CisgICAgRklMRVRJTUUgY3QsIGV0LCBrdCwgdXQ7CisgICAgYWNjX3VpbnQ2NGxfdCB0aWNrczsKKyAgICBpZiAoR2V0VGhyZWFkVGltZXMoR2V0Q3VycmVudFRocmVhZCgpLCAmY3QsICZldCwgJmt0LCAmdXQpID09IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICB0aWNrcyA9ICgoYWNjX3VpbnQ2NGxfdCl1dC5kd0hpZ2hEYXRlVGltZSA8PCAzMikgfCB1dC5kd0xvd0RhdGVUaW1lOworICAgIGlmIF9fYWNjX3VubGlrZWx5KGgtPnRpY2tzX2Jhc2UgPT0gMCkKKyAgICAgICAgaC0+dGlja3NfYmFzZSA9IHRpY2tzOworICAgIGVsc2UKKyAgICAgICAgdGlja3MgLT0gaC0+dGlja3NfYmFzZTsKKyAgICBjLT50dl9zZWMgPSAoYWNjX2ludDY0bF90KSAodGlja3MgLyAxMDAwMDAwMHVsKTsKKyAgICBjLT50dl9uc2VjID0gKGFjY191aW50MzJsX3QpKHRpY2tzICUgMTAwMDAwMDB1bCkgKiAxMDA7CisgICAgQUNDX1VOVVNFRChoKTsgcmV0dXJuIDA7Cit9CisjZW5kaWYKK0FDQ0xJQl9QVUJMSUMoaW50LCBhY2NfcGNsb2NrX29wZW4pIChhY2NfcGNsb2NrX2hhbmRsZV9wIGgsIGludCBtb2RlKQoreworICAgIGFjY19wY2xvY2tfdCBjOworICAgIGludCBpOworICAgIGgtPmggPSAoYWNjbGliX2hhbmRsZV90KSAwOworICAgIGgtPm1vZGUgPSAtMTsKKyAgICBoLT5uYW1lID0gTlVMTDsKKyAgICBoLT5nZXR0aW1lID0gMDsKKyNpZiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyAgICBoLT50aWNrc19iYXNlID0gMDsKKyNlbmRpZgorICAgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgY2FzZSBBQ0NfUENMT0NLX1JFQUxUSU1FX0hSOgorIyAgICAgaWYgZGVmaW5lZChhY2NfcGNsb2NrX3JlYWRfZ2V0dGltZW9mZGF5KQorICAgICAgICBoLT5nZXR0aW1lID0gYWNjX3BjbG9ja19yZWFkX2dldHRpbWVvZmRheTsKKyAgICAgICAgaC0+bmFtZSA9ICJnZXR0aW1lb2ZkYXkiOworIyAgICAgZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQ0NfUENMT0NLX1JFQUxUSU1FOgorIyAgICAgaWYgZGVmaW5lZChhY2NfcGNsb2NrX3JlYWRfZ2V0dGltZW9mZGF5KQorICAgICAgICBoLT5nZXR0aW1lID0gYWNjX3BjbG9ja19yZWFkX2dldHRpbWVvZmRheTsKKyAgICAgICAgaC0+bmFtZSA9ICJnZXR0aW1lb2ZkYXkiOworIyAgICAgZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQ0NfUENMT0NLX01PTk9UT05JQ19IUjoKKyMgICAgIGlmIGRlZmluZWQoYWNjX3BjbG9ja19yZWFkX3VjbG9jaykKKyAgICAgICAgaC0+Z2V0dGltZSA9IGFjY19wY2xvY2tfcmVhZF91Y2xvY2s7CisgICAgICAgIGgtPm5hbWUgPSAidWNsb2NrIjsKKyMgICAgIGVuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDX1BDTE9DS19NT05PVE9OSUM6CisjICAgICBpZiBkZWZpbmVkKGFjY19wY2xvY2tfcmVhZF9jbG9jaykKKyAgICAgICAgaWYgKCFoLT5nZXR0aW1lKSB7CisgICAgICAgICAgICBoLT5nZXR0aW1lID0gYWNjX3BjbG9ja19yZWFkX2Nsb2NrOworICAgICAgICAgICAgaC0+bmFtZSA9ICJjbG9jayI7CisgICAgICAgIH0KKyMgICAgIGVuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDX1BDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQ6CisjICAgICBpZiBkZWZpbmVkKGFjY19wY2xvY2tfcmVhZF9wZXJmY3RyKQorICAgICAgICBpZiAoYWNjX3BlcmZjdHJfb3BlbigmaC0+cGNoKSA9PSAwKSB7CisgICAgICAgICAgICBoLT5nZXR0aW1lID0gYWNjX3BjbG9ja19yZWFkX3BlcmZjdHI7CisgICAgICAgICAgICBoLT5uYW1lID0gInBlcmZjdHIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyMgICAgIGVuZGlmCisjICAgICBpZiBkZWZpbmVkKGFjY19wY2xvY2tfcmVhZF9nZXRwcm9jZXNzdGltZXMpCisgICAgICAgIGlmICghaC0+Z2V0dGltZSAmJiBhY2NfcGNsb2NrX3JlYWRfZ2V0cHJvY2Vzc3RpbWVzKGgsICZjKSA9PSAwKSB7CisgICAgICAgICAgICBoLT5nZXR0aW1lID0gYWNjX3BjbG9ja19yZWFkX2dldHByb2Nlc3N0aW1lczsKKyAgICAgICAgICAgIGgtPm5hbWUgPSAiR2V0UHJvY2Vzc1RpbWVzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjICAgICBlbmRpZgorIyAgICAgaWYgZGVmaW5lZChhY2NfcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV9wKQorICAgICAgICBpZiAoIWgtPmdldHRpbWUgJiYgYWNjX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfcChoLCAmYykgPT0gMCkgeworICAgICAgICAgICAgaC0+Z2V0dGltZSA9IGFjY19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3A7CisgICAgICAgICAgICBoLT5uYW1lID0gIkNMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorIyAgICAgZW5kaWYKKyMgICAgIGlmIGRlZmluZWQoYWNjX3BjbG9ja19yZWFkX2dldHJ1c2FnZSkKKyAgICAgICAgaC0+Z2V0dGltZSA9IGFjY19wY2xvY2tfcmVhZF9nZXRydXNhZ2U7CisgICAgICAgIGgtPm5hbWUgPSAiZ2V0cnVzYWdlIjsKKyMgICAgIGVuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDX1BDTE9DS19USFJFQURfQ1BVVElNRV9JRDoKKyMgICAgIGlmIGRlZmluZWQoYWNjX3BjbG9ja19yZWFkX2dldHRocmVhZHRpbWVzKQorICAgICAgICBpZiAoIWgtPmdldHRpbWUgJiYgYWNjX3BjbG9ja19yZWFkX2dldHRocmVhZHRpbWVzKGgsICZjKSA9PSAwKSB7CisgICAgICAgICAgICBoLT5nZXR0aW1lID0gYWNjX3BjbG9ja19yZWFkX2dldHRocmVhZHRpbWVzOworICAgICAgICAgICAgaC0+bmFtZSA9ICJHZXRUaHJlYWRUaW1lcyI7CisgICAgICAgIH0KKyMgICAgIGVuZGlmCisjICAgICBpZiBkZWZpbmVkKGFjY19wY2xvY2tfcmVhZF9jbG9ja19nZXR0aW1lX3QpCisgICAgICAgIGlmICghaC0+Z2V0dGltZSAmJiBhY2NfcGNsb2NrX3JlYWRfY2xvY2tfZ2V0dGltZV90KGgsICZjKSA9PSAwKSB7CisgICAgICAgICAgICBoLT5nZXR0aW1lID0gYWNjX3BjbG9ja19yZWFkX2Nsb2NrX2dldHRpbWVfdDsKKyAgICAgICAgICAgIGgtPm5hbWUgPSAiQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyMgICAgIGVuZGlmCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIWgtPmdldHRpbWUpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIWgtPmgpCisgICAgICAgIGgtPmggPSAoYWNjbGliX2hhbmRsZV90KSAxOworICAgIGgtPm1vZGUgPSBtb2RlOworICAgIGlmICghaC0+bmFtZSkKKyAgICAgICAgaC0+bmFtZSA9ICJ1bmtub3duIjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBhY2NfcGNsb2NrX3JlYWQoaCwgJmMpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KK0FDQ0xJQl9QVUJMSUMoaW50LCBhY2NfcGNsb2NrX29wZW5fZGVmYXVsdCkgKGFjY19wY2xvY2tfaGFuZGxlX3AgaCkKK3sKKyAgICBpZiAoYWNjX3BjbG9ja19vcGVuKGgsIEFDQ19QQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYWNjX3BjbG9ja19vcGVuKGgsIEFDQ19QQ0xPQ0tfTU9OT1RPTklDX0hSKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYWNjX3BjbG9ja19vcGVuKGgsIEFDQ19QQ0xPQ0tfUkVBTFRJTUVfSFIpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhY2NfcGNsb2NrX29wZW4oaCwgQUNDX1BDTE9DS19NT05PVE9OSUMpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhY2NfcGNsb2NrX29wZW4oaCwgQUNDX1BDTE9DS19SRUFMVElNRSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGFjY19wY2xvY2tfb3BlbihoLCBBQ0NfUENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7Cit9CitBQ0NMSUJfUFVCTElDKGludCwgYWNjX3BjbG9ja19jbG9zZSkgKGFjY19wY2xvY2tfaGFuZGxlX3AgaCkKK3sKKyAgICBoLT5oID0gKGFjY2xpYl9oYW5kbGVfdCkgMDsKKyAgICBoLT5tb2RlID0gLTE7CisgICAgaC0+bmFtZSA9IE5VTEw7CisgICAgaC0+Z2V0dGltZSA9IDA7CisjaWYgKF9fQUNDTElCX1BDTE9DS19VU0VfUEVSRkNUUikKKyAgICBhY2NfcGVyZmN0cl9jbG9zZSgmaC0+cGNoKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorQUNDTElCX1BVQkxJQyh2b2lkLCBhY2NfcGNsb2NrX3JlYWQpIChhY2NfcGNsb2NrX2hhbmRsZV9wIGgsIGFjY19wY2xvY2tfcCBjKQoreworICAgIGlmIChoLT5nZXR0aW1lKSB7CisgICAgICAgIGlmIChoLT5nZXR0aW1lKGgsIGMpID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorI2lmIGRlZmluZWQoYWNjX2ludDY0bF90KQorICAgIGMtPnR2X3NlYyA9IDA7CisjZWxzZQorICAgIGMtPnR2X3NlY19oaWdoID0gMDsKKyAgICBjLT50dl9zZWNfbG93ID0gMDsKKyNlbmRpZgorICAgIGMtPnR2X25zZWMgPSAwOworfQorI2lmICFkZWZpbmVkKEFDQ19DRkdfTk9fRE9VQkxFKQorQUNDTElCX1BVQkxJQyhkb3VibGUsIGFjY19wY2xvY2tfZ2V0X2VsYXBzZWQpIChhY2NfcGNsb2NrX2hhbmRsZV9wIGgsIGNvbnN0IGFjY19wY2xvY2tfcCBzdGFydCwgY29uc3QgYWNjX3BjbG9ja19wIHN0b3ApCit7CisgICAgZG91YmxlIHRzdG9wLCB0c3RhcnQ7CisgICAgaWYgKCFoLT5oKSB7CisgICAgICAgIGgtPm1vZGUgPSAtMTsKKyAgICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisjaWYgZGVmaW5lZChhY2NfaW50NjRsX3QpCisgICAgdHN0b3AgID0gc3RvcC0+dHZfc2VjICArIHN0b3AtPnR2X25zZWMgIC8gMTAwMDAwMDAwMC4wOworICAgIHRzdGFydCA9IHN0YXJ0LT50dl9zZWMgKyBzdGFydC0+dHZfbnNlYyAvIDEwMDAwMDAwMDAuMDsKKyNlbHNlCisgICAgdHN0b3AgID0gc3RvcC0+dHZfc2VjX2xvdyAgKyBzdG9wLT50dl9uc2VjICAvIDEwMDAwMDAwMDAuMDsKKyAgICB0c3RhcnQgPSBzdGFydC0+dHZfc2VjX2xvdyArIHN0YXJ0LT50dl9uc2VjIC8gMTAwMDAwMDAwMC4wOworI2VuZGlmCisgICAgcmV0dXJuIHRzdG9wIC0gdHN0YXJ0OworfQorI2VuZGlmCitBQ0NMSUJfUFVCTElDKGludCwgYWNjX3BjbG9ja19mbHVzaF9jcHVfY2FjaGUpIChhY2NfcGNsb2NrX2hhbmRsZV9wIGgsIHVuc2lnbmVkIGZsYWdzKQoreworICAgIGlmIChoLT5oKSB7CisjaWYgKF9fQUNDTElCX1BDTE9DS19VU0VfUEVSRkNUUikKKyAgICAgICAgcmV0dXJuIGFjY19wZXJmY3RyX2ZsdXNoX2NwdV9jYWNoZSgmaC0+cGNoLCBmbGFncyk7CisjZW5kaWYKKyAgICB9CisgICAgQUNDX1VOVVNFRChoKTsgQUNDX1VOVVNFRChmbGFncyk7CisgICAgcmV0dXJuIC0xOworfQorI2lmIGRlZmluZWQoX19BQ0NMSUJfUENMT0NLX05FRURfV0FSTl9QT1ApCisjICBpZiAoQUNDX0NDX01TQyAmJiAoX01TQ19WRVIgPj0gMTIwMCkpCisjICAgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgIGVsc2UKKyMgICAgZXJyb3IgIl9fQUNDTElCX1BDTE9DS19ORUVEX1dBUk5fUE9QIgorIyAgZW5kaWYKKyMgIHVuZGVmIF9fQUNDTElCX1BDTE9DS19ORUVEX1dBUk5fUE9QCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQUNDX1dBTlRfQUNDTElCX1VDTE9DSykKKyMgIHVuZGVmIEFDQ19XQU5UX0FDQ0xJQl9VQ0xPQ0sKKyNkZWZpbmUgX19BQ0NMSUJfVUNMT0NLX0NIX0lOQ0xVREVEIDEKKyNpZiAhZGVmaW5lZChBQ0NMSUJfUFVCTElDKQorIyAgZGVmaW5lIEFDQ0xJQl9QVUJMSUMocixmKSAgICByIF9fQUNDTElCX0ZVTkNOQU1FKGYpCisjZW5kaWYKKyNpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19XSU4xNikKKyNlbGlmIChBQ0NfT1NfRE9TMzIgJiYgQUNDX0NDX0dOVUMpICYmIGRlZmluZWQoX19ESkdQUF9fKQorI2VsaWYgKEFDQ19PU19DWUdXSU4gfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkgJiYgKEFDQ19IQVZFX1dJTkRPV1NfSCkKKyMgIGlmICgoQUNDX0NDX0RNQyAmJiAoX19ETUNfXyA8IDB4ODM4KSkgfHwgQUNDX0NDX0xDQ1dJTjMyKQorIyAgICBkZWZpbmUgX19BQ0NMSUJfVUNMT0NLX1VTRV9DTE9DSyAxCisjICBlbHNlCisjICAgIGRlZmluZSBfX0FDQ0xJQl9VQ0xPQ0tfVVNFX1dJTk1NIDEKKyMgICAgaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDEyMDApKQorIyAgICAgIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjICAgICAgZGVmaW5lIF9fQUNDTElCX1VDTE9DS19ORUVEX1dBUk5fUE9QIDEKKyMgICAgZW5kaWYKKyMgICAgaWYgKEFDQ19DQ19NU0MgJiYgKF9NU0NfVkVSID49IDkwMCkpCisjICAgICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDIwMSkKKyMgICAgZWxpZiAoQUNDX0NDX01XRVJLUykKKyMgICAgICBkZWZpbmUgTFBVSU5UIF9fQUNDX01NU1lTVEVNX0hfTFBVSU5UCisjICAgIGVuZGlmCisjICAgIGlmIDEKKyMgICAgICBpbmNsdWRlIDxtbXN5c3RlbS5oPgorIyAgICBlbHNlCisjICAgICAgaWYgKEFDQ19DQ19JTlRFTEMgfHwgQUNDX0NDX01TQyB8fCBBQ0NfQ0NfUEVMTEVTQykKKyAgICAgICAgIEFDQ19FWFRFUk5fQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgdGltZUdldFRpbWUodm9pZCk7CisjICAgICAgZWxzZQorICAgICAgICAgQUNDX0VYVEVSTl9DIHVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIHRpbWVHZXRUaW1lKHZvaWQpOworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICAgIGlmIChBQ0NfQ0NfRE1DKQorIyAgICAgIHByYWdtYSBETUMgaW5jbHVkZWxpYiAid2lubW0ubGliIgorIyAgICBlbGlmIChBQ0NfQ0NfSU5URUxDIHx8IEFDQ19DQ19NU0MgfHwgQUNDX0NDX1BFTExFU0MpCisjICAgICAgcHJhZ21hIGNvbW1lbnQobGliLCAid2lubW0ubGliIikKKyMgICAgZWxpZiAoQUNDX0NDX01XRVJLUyAmJiAoX19NV0VSS1NfXyA+PSAweDMwMDApKQorIyAgICAgIHByYWdtYSBjb21tZW50KGxpYiwgIndpbm1tLmxpYiIpCisjICAgIGVsaWYgKEFDQ19DQ19TWU1BTlRFQ0MpCisjICAgICAgcHJhZ21hIFNDIGluY2x1ZGVsaWIgIndpbm1tLmxpYiIKKyMgICAgZWxpZiAoQUNDX0NDX1dBVENPTUMgJiYgKF9fV0FUQ09NQ19fID49IDEwNTApKQorIyAgICAgIHByYWdtYSBsaWJyYXJ5KCJ3aW5tbS5saWIiKQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbGlmIChBQ0NfT1NfQ1lHV0lOIHx8IEFDQ19PU19ET1MzMiB8fCBBQ0NfT1NfRU1YIHx8IEFDQ19PU19PUzIgfHwgQUNDX09TX09TMjE2IHx8IEFDQ19PU19UT1MgfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkKKyMgIGRlZmluZSBfX0FDQ0xJQl9VQ0xPQ0tfVVNFX0NMT0NLIDEKKyNlbGlmIChBQ0NfT1NfQ09OU09MRSkgJiYgZGVmaW5lZChDTE9DS1NfUEVSX1NFQykKKyMgIGRlZmluZSBfX0FDQ0xJQl9VQ0xPQ0tfVVNFX0NMT0NLIDEKKyNlbGlmIChBQ0NfTElCQ19JU09DOTAgfHwgQUNDX0xJQkNfSVNPQzk5KSAmJiBkZWZpbmVkKENMT0NLU19QRVJfU0VDKQorIyAgZGVmaW5lIF9fQUNDTElCX1VDTE9DS19VU0VfQ0xPQ0sgMQorI2VuZGlmCisjaWYgKF9fQUNDTElCX1VDTE9DS19VU0VfQ0xPQ0spICYmICFkZWZpbmVkKENMT0NLU19QRVJfU0VDKQorIyAgaWYgZGVmaW5lZChDTEtfVENLKQorIyAgICBkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMgQ0xLX1RDSworIyAgZWxzZQorIyAgICB1bmRlZiBfX0FDQ0xJQl9VQ0xPQ0tfVVNFX0NMT0NLCisjICBlbmRpZgorI2VuZGlmCisjaWYgKF9fQUNDTElCX1VDTE9DS19VU0VfR0VUUlVTQUdFKQorIyAgaWYgIWRlZmluZWQoUlVTQUdFX1NFTEYpCisjICAgIHVuZGVmIF9fQUNDTElCX1VDTE9DS19VU0VfR0VUUlVTQUdFCisjICBlbmRpZgorI2VuZGlmCitBQ0NMSUJfUFVCTElDKGludCwgYWNjX3VjbG9ja19vcGVuKSAoYWNjX3VjbG9ja19oYW5kbGVfcCBoKQoreworICAgIGludCBpOworI2lmIChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX1FQQykKKyAgICBMQVJHRV9JTlRFR0VSIGxpOworI2VuZGlmCisgICAgaC0+aCA9IChhY2NsaWJfaGFuZGxlX3QpIDE7CisgICAgaC0+bW9kZSA9IDA7CisgICAgaC0+bmFtZSA9IE5VTEw7CisjaWYgKF9fQUNDTElCX1VDTE9DS19VU0VfUEVSRkNUUikKKyAgICBoLT5wY2guaCA9IDA7CisgICAgaWYgKGgtPm1vZGUgPT0gMCAmJiBhY2NfcGVyZmN0cl9vcGVuKCZoLT5wY2gpID09IDApCisgICAgICAgIGgtPm1vZGUgPSAyOworI2VuZGlmCisjaWYgKF9fQUNDTElCX1VDTE9DS19VU0VfUVBDKQorICAgIGgtPnFwZiA9IDAuMDsKKyAgICBpZiAoaC0+bW9kZSA9PSAwICYmIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmxpKSAhPSAwKSB7CisgICAgICAgIGRvdWJsZSBkID0gKGRvdWJsZSkgbGkuUXVhZFBhcnQ7CisgICAgICAgIGlmIChkID4gMC4wICYmIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZsaSkgIT0gMCkgeworICAgICAgICAgICAgaC0+bW9kZSA9IDM7CisgICAgICAgICAgICBoLT5xcGYgPSBkOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgYWNjX3VjbG9ja190IGM7CisgICAgICAgIGFjY191Y2xvY2tfcmVhZChoLCAmYyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorQUNDTElCX1BVQkxJQyhpbnQsIGFjY191Y2xvY2tfY2xvc2UpIChhY2NfdWNsb2NrX2hhbmRsZV9wIGgpCit7CisgICAgaC0+aCA9IChhY2NsaWJfaGFuZGxlX3QpIDA7CisgICAgaC0+bW9kZSA9IC0xOworICAgIGgtPm5hbWUgPSBOVUxMOworI2lmIChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX1BFUkZDVFIpCisgICAgYWNjX3BlcmZjdHJfY2xvc2UoJmgtPnBjaCk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KK0FDQ0xJQl9QVUJMSUModm9pZCwgYWNjX3VjbG9ja19yZWFkKSAoYWNjX3VjbG9ja19oYW5kbGVfcCBoLCBhY2NfdWNsb2NrX3AgYykKK3sKKyNpZiAoX19BQ0NMSUJfVUNMT0NLX1VTRV9SRFRTQykKKyAgICBhY2NfdHNjX3JlYWQoKGFjY191aW50MzJlX3QqKSAodm9pZCopICZjLT50c2MpOworI2VuZGlmCisjaWYgKF9fQUNDTElCX1VDTE9DS19VU0VfUEVSRkNUUikKKyAgICBpZiAoaC0+cGNoLmgpIHsKKyAgICAgICAgYWNjX3BlcmZjdHJfcmVhZCgmaC0+cGNoLCAmYy0+cGNjKTsKKyAgICAgICAgaWYgKGgtPm1vZGUgPiAwICYmIGgtPm1vZGUgPD0gMikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyNpZiAoX19BQ0NMSUJfVUNMT0NLX1VTRV9RUEMpCisgICAgaWYgKGgtPnFwZiA+IDAuMCkgeworICAgICAgICBMQVJHRV9JTlRFR0VSIGxpOworICAgICAgICBpZiAoUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmxpKSAhPSAwKSB7CisgICAgICAgICAgICBjLT5xcGMgPSAoYWNjX2ludDY0bF90KSBsaS5RdWFkUGFydDsKKyAgICAgICAgICAgIGlmIChoLT5tb2RlID4gMCAmJiBoLT5tb2RlIDw9IDMpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaC0+bW9kZSA9IDA7IGgtPnFwZiA9IDAuMDsgYy0+cXBjID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIHsKKyNpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19XSU4xNikKKyMgaWYgKEFDQ19DQ19BWlRFQ0MpCisgICAgYy0+dGlja3MudDMyID0gMDsKKyMgZWxzZQorICAgIHVuaW9uIFJFR1MgcmksIHJvOworICAgIHJpLnguYXggPSAweDJjMDA7IGludDg2KDB4MjEsICZyaSwgJnJvKTsKKyAgICBjLT50aWNrcy50MzIgPSByby5oLmNoKjYwVUwqNjBVTCoxMDBVTCArIHJvLmguY2wqNjBVTCoxMDBVTCArIHJvLmguZGgqMTAwVUwgKyByby5oLmRsOworIyBlbmRpZgorI2VsaWYgKEFDQ19PU19ET1MzMiAmJiBBQ0NfQ0NfR05VQykgJiYgZGVmaW5lZChfX0RKR1BQX18pCisgICAgYy0+dGlja3MudDY0ID0gdWNsb2NrKCk7CisjZWxpZiAoX19BQ0NMSUJfVUNMT0NLX1VTRV9DTE9DSykgJiYgZGVmaW5lZChhY2NfaW50NjRsX3QpCisgICAgYy0+dGlja3MudDY0ID0gY2xvY2soKTsKKyNlbGlmIChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX0NMT0NLKQorICAgIGMtPnRpY2tzLnQzMiA9IGNsb2NrKCk7CisjZWxpZiAoX19BQ0NMSUJfVUNMT0NLX1VTRV9XSU5NTSkKKyAgICBjLT50aWNrcy50MzIgPSB0aW1lR2V0VGltZSgpOworI2VsaWYgKF9fQUNDTElCX1VDTE9DS19VU0VfR0VUUlVTQUdFKQorICAgIHN0cnVjdCBydXNhZ2UgcnU7CisgICAgaWYgKGdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1KSAhPSAwKSBjLT50aWNrcy50ZCA9IDA7CisgICAgZWxzZSBjLT50aWNrcy50ZCA9IHJ1LnJ1X3V0aW1lLnR2X3NlYyArIHJ1LnJ1X3V0aW1lLnR2X3VzZWMgLyAxMDAwMDAwLjA7CisjZWxpZiAoSEFWRV9HRVRUSU1FT0ZEQVkpCisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgaWYgKGdldHRpbWVvZmRheSgmdHYsIDApICE9IDApIGMtPnRpY2tzLnRkID0gMDsKKyAgICBlbHNlIGMtPnRpY2tzLnRkID0gdHYudHZfc2VjICsgdHYudHZfdXNlYyAvIDEwMDAwMDAuMDsKKyNlbHNlCisgICAgQUNDX1VOVVNFRChjKTsKKyNlbmRpZgorICAgIH0KKyAgICBBQ0NfVU5VU0VEKGgpOworfQorQUNDTElCX1BVQkxJQyhkb3VibGUsIGFjY191Y2xvY2tfZ2V0X2VsYXBzZWQpIChhY2NfdWNsb2NrX2hhbmRsZV9wIGgsIGNvbnN0IGFjY191Y2xvY2tfcCBzdGFydCwgY29uc3QgYWNjX3VjbG9ja19wIHN0b3ApCit7CisgICAgZG91YmxlIGQ7CisgICAgaWYgKCFoLT5oKSB7CisgICAgICAgIGgtPm1vZGUgPSAtMTsKKyAgICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisjaWYgKF9fQUNDTElCX1VDTE9DS19VU0VfUkRUU0MpCisgICAgaWYgKGgtPm1vZGUgPT0gMSkgeworICAgICAgICBpZiAoIWgtPm5hbWUpIGgtPm5hbWUgPSAicmR0c2MiOworICAgICAgICBkID0gKGRvdWJsZSkgKChhY2NfaW50NjRsX3Qpc3RvcC0+dHNjIC0gKGFjY19pbnQ2NGxfdClzdGFydC0+dHNjKTsKKyAgICAgICAgcmV0dXJuIGQgLyAxMDAwMDAwMDAwLjA7CisgICAgfQorI2VuZGlmCisjaWYgKF9fQUNDTElCX1VDTE9DS19VU0VfUEVSRkNUUikKKyAgICBpZiAoaC0+cGNoLmggJiYgaC0+bW9kZSA9PSAyKSB7CisgICAgICAgIGlmICghaC0+bmFtZSkgaC0+bmFtZSA9ICJwZXJmY3RyIjsKKyAgICAgICAgcmV0dXJuIGFjY19wZXJmY3RyX2dldF9lbGFwc2VkKCZoLT5wY2gsICZzdGFydC0+cGNjLCAmc3RvcC0+cGNjKTsKKyAgICB9CisjZW5kaWYKKyNpZiAoX19BQ0NMSUJfVUNMT0NLX1VTRV9RUEMpCisgICAgaWYgKGgtPnFwZiA+IDAuMCAmJiBoLT5tb2RlID09IDMpIHsKKyAgICAgICAgaWYgKCFoLT5uYW1lKSBoLT5uYW1lID0gInFwYyI7CisgICAgICAgIGlmIChzdGFydC0+cXBjID09IDAgfHwgc3RvcC0+cXBjID09IDApIHJldHVybiAwLjA7CisgICAgICAgIHJldHVybiAoZG91YmxlKSAoc3RvcC0+cXBjIC0gc3RhcnQtPnFwYykgLyBoLT5xcGY7CisgICAgfQorI2VuZGlmCisjaWYgKEFDQ19PU19ET1MxNiB8fCBBQ0NfT1NfV0lOMTYpCisgICAgaC0+bW9kZSA9IDExOworICAgIGlmICghaC0+bmFtZSkgaC0+bmFtZSA9ICJ1Y2xvY2siOworICAgIGQgPSAoZG91YmxlKSAoc3RvcC0+dGlja3MudDMyIC0gc3RhcnQtPnRpY2tzLnQzMikgLyAxMDAuMDsKKyAgICBpZiAoZCA8IDAuMCkgZCArPSA4NjQwMC4wOworI2VsaWYgKEFDQ19PU19ET1MzMiAmJiBBQ0NfQ0NfR05VQykgJiYgZGVmaW5lZChfX0RKR1BQX18pCisgICAgaC0+bW9kZSA9IDEyOworICAgIGlmICghaC0+bmFtZSkgaC0+bmFtZSA9ICJ1Y2xvY2siOworICAgIGQgPSAoZG91YmxlKSAoc3RvcC0+dGlja3MudDY0IC0gc3RhcnQtPnRpY2tzLnQ2NCkgLyAoVUNMT0NLU19QRVJfU0VDKTsKKyNlbGlmIChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX0NMT0NLKSAmJiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyAgICBoLT5tb2RlID0gMTM7CisgICAgaWYgKCFoLT5uYW1lKSBoLT5uYW1lID0gImNsb2NrIjsKKyAgICB7CisgICAgYWNjX2ludDY0bF90IHQ7CisgICAgdCA9IHN0b3AtPnRpY2tzLnQ2NCAtIHN0YXJ0LT50aWNrcy50NjQ7CisgICAgaWYgKHQgPCAwKQorICAgICAgICB0ICs9IHNpemVvZihjbG9ja190KSA9PSA0ID8gQUNDX0lOVDY0X0MoMHgxMDAwMDAwMDApIDogQUNDX0lOVDY0X0MoMCk7CisgICAgZCA9IChkb3VibGUpIHQgLyAoQ0xPQ0tTX1BFUl9TRUMpOworICAgIH0KKyNlbGlmIChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX0NMT0NLKQorICAgIGgtPm1vZGUgPSAxNDsKKyAgICBpZiAoIWgtPm5hbWUpIGgtPm5hbWUgPSAiY2xvY2siOworICAgIGQgPSAoZG91YmxlKSAoc3RvcC0+dGlja3MudDMyIC0gc3RhcnQtPnRpY2tzLnQzMikgLyAoQ0xPQ0tTX1BFUl9TRUMpOworI2VsaWYgKF9fQUNDTElCX1VDTE9DS19VU0VfV0lOTU0pCisgICAgaC0+bW9kZSA9IDE1OworICAgIGlmICghaC0+bmFtZSkgaC0+bmFtZSA9ICJ0aW1lR2V0VGltZSI7CisgICAgZCA9IChkb3VibGUpIChzdG9wLT50aWNrcy50MzIgLSBzdGFydC0+dGlja3MudDMyKSAvIDEwMDAuMDsKKyNlbGlmIChfX0FDQ0xJQl9VQ0xPQ0tfVVNFX0dFVFJVU0FHRSkKKyAgICBoLT5tb2RlID0gMTY7CisgICAgaWYgKCFoLT5uYW1lKSBoLT5uYW1lID0gImdldHJ1c2FnZSI7CisgICAgZCA9IHN0b3AtPnRpY2tzLnRkIC0gc3RhcnQtPnRpY2tzLnRkOworI2VsaWYgKEhBVkVfR0VUVElNRU9GREFZKQorICAgIGgtPm1vZGUgPSAxNzsKKyAgICBpZiAoIWgtPm5hbWUpIGgtPm5hbWUgPSAiZ2V0dGltZW9mZGF5IjsKKyAgICBkID0gc3RvcC0+dGlja3MudGQgLSBzdGFydC0+dGlja3MudGQ7CisjZWxzZQorICAgIGgtPm1vZGUgPSAwOworICAgIGQgPSAwLjA7CisjZW5kaWYKKyAgICByZXR1cm4gZDsKK30KK0FDQ0xJQl9QVUJMSUMoaW50LCBhY2NfdWNsb2NrX2ZsdXNoX2NwdV9jYWNoZSkgKGFjY191Y2xvY2tfaGFuZGxlX3AgaCwgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgaWYgKGgtPmgpIHsKKyNpZiAoX19BQ0NMSUJfVUNMT0NLX1VTRV9QRVJGQ1RSKQorICAgICAgICByZXR1cm4gYWNjX3BlcmZjdHJfZmx1c2hfY3B1X2NhY2hlKCZoLT5wY2gsIGZsYWdzKTsKKyNlbmRpZgorICAgIH0KKyAgICBBQ0NfVU5VU0VEKGgpOyBBQ0NfVU5VU0VEKGZsYWdzKTsKKyAgICByZXR1cm4gLTE7Cit9CisjaWYgZGVmaW5lZChfX0FDQ0xJQl9VQ0xPQ0tfTkVFRF9XQVJOX1BPUCkKKyMgIGlmIChBQ0NfQ0NfTVNDICYmIChfTVNDX1ZFUiA+PSAxMjAwKSkKKyMgICAgcHJhZ21hIHdhcm5pbmcocG9wKQorIyAgZWxzZQorIyAgICBlcnJvciAiX19BQ0NMSUJfVUNMT0NLX05FRURfV0FSTl9QT1AiCisjICBlbmRpZgorIyAgdW5kZWYgX19BQ0NMSUJfVUNMT0NLX05FRURfV0FSTl9QT1AKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChBQ0NfV0FOVF9BQ0NMSUJfTUlTQykKKyMgIHVuZGVmIEFDQ19XQU5UX0FDQ0xJQl9NSVNDCisjZGVmaW5lIF9fQUNDTElCX01JU0NfQ0hfSU5DTFVERUQgMQorI2lmICFkZWZpbmVkKEFDQ0xJQl9QVUJMSUMpCisjICBkZWZpbmUgQUNDTElCX1BVQkxJQyhyLGYpICAgICAgICAgICAgICAgIHIgX19BQ0NMSUJfRlVOQ05BTUUoZikKKyNlbmRpZgorI2lmICFkZWZpbmVkKEFDQ0xJQl9QVUJMSUNfTk9JTkxJTkUpCisjICBpZiAhZGVmaW5lZChfX2FjY19ub2lubGluZSkKKyMgICAgZGVmaW5lIEFDQ0xJQl9QVUJMSUNfTk9JTkxJTkUocixmKSAgICAgciBfX0FDQ0xJQl9GVU5DTkFNRShmKQorIyAgZWxpZiAoQUNDX0NDX0dOVUMgPj0gMHgwMzA0MDB1bCkgfHwgKEFDQ19DQ19MTFZNKQorIyAgICBkZWZpbmUgQUNDTElCX1BVQkxJQ19OT0lOTElORShyLGYpICAgICBfX2FjY19ub2lubGluZSBfX2F0dHJpYnV0ZV9fKChfX3VzZWRfXykpIHIgX19BQ0NMSUJfRlVOQ05BTUUoZikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFDQ0xJQl9QVUJMSUNfTk9JTkxJTkUocixmKSAgICAgX19hY2Nfbm9pbmxpbmUgciBfX0FDQ0xJQl9GVU5DTkFNRShmKQorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfT1NfV0lOMzIgJiYgQUNDX0NDX1BFTExFU0MgJiYgKF9fUE9DQ19fID49IDI5MCkpCisjICBwcmFnbWEgd2FybihwdXNoKQorIyAgcHJhZ21hIHdhcm4oZGlzYWJsZToyMDA3KQorI2VuZGlmCitBQ0NMSUJfUFVCTElDKGNvbnN0IGNoYXIgKiwgYWNjX2dldGVudikgKGNvbnN0IGNoYXIgKnMpCit7CisjaWYgZGVmaW5lZChIQVZFX0dFVEVOVikKKyAgICByZXR1cm4gZ2V0ZW52KHMpOworI2Vsc2UKKyAgICBBQ0NfVU5VU0VEKHMpOyByZXR1cm4gKGNvbnN0IGNoYXIgKikgMDsKKyNlbmRpZgorfQorQUNDTElCX1BVQkxJQyhhY2NsaWJfaGFuZGxlX3QsIGFjY19nZXRfb3NmaGFuZGxlKSAoaW50IGZkKQoreworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyNpZiAoQUNDX09TX0NZR1dJTikKKyAgICByZXR1cm4gZ2V0X29zZmhhbmRsZShmZCk7CisjZWxpZiAoQUNDX09TX0VNWCAmJiBkZWZpbmVkKF9fUlNYTlRfXykpCisgICAgcmV0dXJuIC0xOworI2VsaWYgKEFDQ19PU19XSU4zMiAmJiBBQ0NfQ0NfR05VQykgJiYgZGVmaW5lZChfX1BXMzJfXykKKyAgICByZXR1cm4gLTE7CisjZWxpZiAoQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkKKyMgaWYgKEFDQ19DQ19QRUxMRVNDICYmIChfX1BPQ0NfXyA8IDI4MCkpCisgICAgcmV0dXJuIC0xOworIyBlbGlmIChBQ0NfQ0NfV0FUQ09NQyAmJiAoX19XQVRDT01DX18gPCAxMDAwKSkKKyAgICByZXR1cm4gLTE7CisjIGVsaWYgKEFDQ19DQ19XQVRDT01DICYmIChfX1dBVENPTUNfXyA8IDExMDApKQorICAgIHJldHVybiBfb3NfaGFuZGxlKGZkKTsKKyMgZWxzZQorICAgIHJldHVybiBfZ2V0X29zZmhhbmRsZShmZCk7CisjIGVuZGlmCisjZWxzZQorICAgIHJldHVybiBmZDsKKyNlbmRpZgorfQorQUNDTElCX1BVQkxJQyhpbnQsIGFjY19zZXRfYmlubW9kZSkgKGludCBmZCwgaW50IGJpbmFyeSkKK3sKKyNpZiAoQUNDX0FSQ0hfTTY4SyAmJiBBQ0NfT1NfVE9TICYmIEFDQ19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fTUlOVF9fKQorICAgIEZJTEUqIGZwOyBpbnQgb2xkX2JpbmFyeTsKKyAgICBpZiAoZmQgPT0gU1RESU5fRklMRU5PKSBmcCA9IHN0ZGluOworICAgIGVsc2UgaWYgKGZkID09IFNURE9VVF9GSUxFTk8pIGZwID0gc3Rkb3V0OworICAgIGVsc2UgaWYgKGZkID09IFNUREVSUl9GSUxFTk8pIGZwID0gc3RkZXJyOworICAgIGVsc2UgcmV0dXJuIC0xOworICAgIG9sZF9iaW5hcnkgPSBmcC0+X19tb2RlLl9fYmluYXJ5OworICAgIF9fc2V0X2Jpbm1vZGUoZnAsIGJpbmFyeSA/IDEgOiAwKTsKKyAgICByZXR1cm4gb2xkX2JpbmFyeSA/IDEgOiAwOworI2VsaWYgKEFDQ19BUkNIX002OEsgJiYgQUNDX09TX1RPUykKKyAgICBBQ0NfVU5VU0VEKGZkKTsgQUNDX1VOVVNFRChiaW5hcnkpOworICAgIHJldHVybiAtMTsKKyNlbGlmIChBQ0NfT1NfRE9TMTYgJiYgKEFDQ19DQ19BWlRFQ0MgfHwgQUNDX0NDX1BBQ0lGSUNDKSkKKyAgICBBQ0NfVU5VU0VEKGZkKTsgQUNDX1VOVVNFRChiaW5hcnkpOworICAgIHJldHVybiAtMTsKKyNlbGlmIChBQ0NfT1NfRE9TMzIgJiYgQUNDX0NDX0dOVUMpICYmIGRlZmluZWQoX19ESkdQUF9fKQorICAgIGludCByOyB1bnNpZ25lZCBvbGRfZmxhZ3MgPSBfX2RqZ3BwX2h3aW50X2ZsYWdzOworICAgIEFDQ19DT01QSUxFX1RJTUVfQVNTRVJUKE9fQklOQVJZID4gMCkKKyAgICBBQ0NfQ09NUElMRV9USU1FX0FTU0VSVChPX1RFWFQgPiAwKQorICAgIGlmIChmZCA8IDApIHJldHVybiAtMTsKKyAgICByID0gc2V0bW9kZShmZCwgYmluYXJ5ID8gT19CSU5BUlkgOiBPX1RFWFQpOworICAgIGlmICgob2xkX2ZsYWdzICYgMXUpICE9IChfX2RqZ3BwX2h3aW50X2ZsYWdzICYgMXUpKQorICAgICAgICBfX2RqZ3BwX3NldF9jdHJsX2MoIShvbGRfZmxhZ3MgJiAxKSk7CisgICAgaWYgKHIgPT0gLTEpIHJldHVybiAtMTsKKyAgICByZXR1cm4gKHIgJiBPX1RFWFQpID8gMCA6IDE7CisjZWxpZiAoQUNDX09TX1dJTjMyICYmIEFDQ19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fUFczMl9fKQorICAgIGlmIChmZCA8IDApIHJldHVybiAtMTsKKyAgICBBQ0NfVU5VU0VEKGJpbmFyeSk7CisgICAgcmV0dXJuIDE7CisjZWxpZiAoQUNDX09TX0RPUzMyICYmIEFDQ19DQ19ISUdIQykKKyAgICBGSUxFKiBmcDsgaW50IHI7CisgICAgaWYgKGZkID09IGZpbGVubyhzdGRpbikpIGZwID0gc3RkaW47CisgICAgZWxzZSBpZiAoZmQgPT0gZmlsZW5vKHN0ZG91dCkpIGZwID0gc3Rkb3V0OworICAgIGVsc2UgaWYgKGZkID09IGZpbGVubyhzdGRlcnIpKSBmcCA9IHN0ZGVycjsKKyAgICBlbHNlIHJldHVybiAtMTsKKyAgICByID0gX3NldG1vZGUoZnAsIGJpbmFyeSA/IF9CSU5BUlkgOiBfVEVYVCk7CisgICAgaWYgKHIgPT0gLTEpIHJldHVybiAtMTsKKyAgICByZXR1cm4gKHIgJiBfQklOQVJZKSA/IDEgOiAwOworI2VsaWYgKEFDQ19PU19XSU4zMiAmJiBBQ0NfQ0NfTVdFUktTKSAmJiBkZWZpbmVkKF9fTVNMX18pCisgICAgQUNDX1VOVVNFRChmZCk7IEFDQ19VTlVTRUQoYmluYXJ5KTsKKyAgICByZXR1cm4gLTE7CisjZWxpZiAoQUNDX09TX0NZR1dJTiAmJiAoQUNDX0NDX0dOVUMgPCAweDAyNWEwMHVsKSkKKyAgICBBQ0NfVU5VU0VEKGZkKTsgQUNDX1VOVVNFRChiaW5hcnkpOworICAgIHJldHVybiAtMTsKKyNlbGlmIChBQ0NfT1NfQ1lHV0lOIHx8IEFDQ19PU19ET1MxNiB8fCBBQ0NfT1NfRE9TMzIgfHwgQUNDX09TX0VNWCB8fCBBQ0NfT1NfT1MyIHx8IEFDQ19PU19PUzIxNiB8fCBBQ0NfT1NfV0lOMTYgfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkKKyAgICBpbnQgcjsKKyNpZiAhZGVmaW5lZChBQ0NfQ0NfWk9SVEVDSEMpCisgICAgQUNDX0NPTVBJTEVfVElNRV9BU1NFUlQoT19CSU5BUlkgPiAwKQorI2VuZGlmCisgICAgQUNDX0NPTVBJTEVfVElNRV9BU1NFUlQoT19URVhUID4gMCkKKyAgICBpZiAoZmQgPCAwKSByZXR1cm4gLTE7CisgICAgciA9IHNldG1vZGUoZmQsIGJpbmFyeSA/IE9fQklOQVJZIDogT19URVhUKTsKKyAgICBpZiAociA9PSAtMSkgcmV0dXJuIC0xOworICAgIHJldHVybiAociAmIE9fVEVYVCkgPyAwIDogMTsKKyNlbHNlCisgICAgaWYgKGZkIDwgMCkgcmV0dXJuIC0xOworICAgIEFDQ19VTlVTRUQoYmluYXJ5KTsKKyAgICByZXR1cm4gMTsKKyNlbmRpZgorfQorQUNDTElCX1BVQkxJQyhpbnQsIGFjY19pc2F0dHkpIChpbnQgZmQpCit7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYgKEFDQ19PU19ET1MxNiAmJiAhZGVmaW5lZChBQ0NfQ0NfQVpURUNDKSkKKyAgICB7CisgICAgICAgIHVuaW9uIFJFR1MgcmksIHJvOworICAgICAgICByaS54LmF4ID0gMHg0NDAwOyByaS54LmJ4ID0gZmQ7CisgICAgICAgIGludDg2KDB4MjEsICZyaSwgJnJvKTsKKyAgICAgICAgaWYgKChyby54LmNmbGFnICYgMSkgPT0gMCkKKyAgICAgICAgICAgIGlmICgocm8ueC5heCAmIDB4ODMpICE9IDB4ODMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VsaWYgKEFDQ19PU19ET1MzMiAmJiBBQ0NfQ0NfV0FUQ09NQykKKyAgICB7CisgICAgICAgIHVuaW9uIFJFR1MgcmksIHJvOworICAgICAgICByaS53LmF4ID0gMHg0NDAwOyByaS53LmJ4ID0gKHVuc2lnbmVkIHNob3J0KSBmZDsKKyAgICAgICAgaW50Mzg2KDB4MjEsICZyaSwgJnJvKTsKKyAgICAgICAgaWYgKChyby53LmNmbGFnICYgMSkgPT0gMCkKKyAgICAgICAgICAgIGlmICgocm8udy5heCAmIDB4ODMpICE9IDB4ODMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VsaWYgKEFDQ19IQVZFX1dJTkRPV1NfSCkKKyAgICB7CisgICAgICAgIGFjY2xpYl9oYW5kbGVfdCBoID0gX19BQ0NMSUJfRlVOQ05BTUUoYWNjX2dldF9vc2ZoYW5kbGUpKGZkKTsKKyAgICAgICAgaWYgKChIQU5ETEUpaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgRFdPUkQgZCA9IDA7CisgICAgICAgICAgICBpZiAoR2V0Q29uc29sZU1vZGUoKEhBTkRMRSloLCAmZCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9JU0FUVFkpCisgICAgcmV0dXJuIChpc2F0dHkoZmQpKSA/IDEgOiAwOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorQUNDTElCX1BVQkxJQyhpbnQsIGFjY19ta2RpcikgKGNvbnN0IGNoYXIqIG5hbWUsIHVuc2lnbmVkIG1vZGUpCit7CisjaWYgIWRlZmluZWQoSEFWRV9NS0RJUikKKyAgICBBQ0NfVU5VU0VEKG5hbWUpOyBBQ0NfVU5VU0VEKG1vZGUpOworICAgIHJldHVybiAtMTsKKyNlbGlmIChBQ0NfQVJDSF9NNjhLICYmIEFDQ19PU19UT1MgJiYgKEFDQ19DQ19QVVJFQyB8fCBBQ0NfQ0NfVFVSQk9DKSkKKyAgICBBQ0NfVU5VU0VEKG1vZGUpOworICAgIHJldHVybiBEY3JlYXRlKG5hbWUpOworI2VsaWYgKEFDQ19PU19ET1MzMiAmJiBBQ0NfQ0NfR05VQykgJiYgZGVmaW5lZChfX0RKR1BQX18pCisgICAgcmV0dXJuIG1rZGlyKG5hbWUsIG1vZGUpOworI2VsaWYgKEFDQ19PU19XSU4zMiAmJiBBQ0NfQ0NfR05VQykgJiYgZGVmaW5lZChfX1BXMzJfXykKKyAgICByZXR1cm4gbWtkaXIobmFtZSwgbW9kZSk7CisjZWxpZiAoQUNDX09TX0RPUzE2IHx8IEFDQ19PU19ET1MzMiB8fCBBQ0NfT1NfT1MyIHx8IEFDQ19PU19PUzIxNiB8fCBBQ0NfT1NfV0lOMTYgfHwgQUNDX09TX1dJTjMyIHx8IEFDQ19PU19XSU42NCkKKyAgICBBQ0NfVU5VU0VEKG1vZGUpOworIyBpZiAoQUNDX0NDX0hJR0hDIHx8IEFDQ19DQ19QQUNJRklDQykKKyAgICByZXR1cm4gbWtkaXIoKGNoYXIqKSBuYW1lKTsKKyMgZWxzZQorICAgIHJldHVybiBta2RpcihuYW1lKTsKKyMgZW5kaWYKKyNlbHNlCisgICAgcmV0dXJuIG1rZGlyKG5hbWUsIG1vZGUpOworI2VuZGlmCit9CitBQ0NMSUJfUFVCTElDKGludCwgYWNjX3JtZGlyKSAoY29uc3QgY2hhciogbmFtZSkKK3sKKyNpZiAhZGVmaW5lZChIQVZFX1JNRElSKQorICAgIEFDQ19VTlVTRUQobmFtZSk7CisgICAgcmV0dXJuIC0xOworI2VsaWYgKChBQ0NfT1NfRE9TMTYgfHwgQUNDX09TX0RPUzMyKSAmJiAoQUNDX0NDX0hJR0hDIHx8IEFDQ19DQ19QQUNJRklDQykpCisgICAgcmV0dXJuIHJtZGlyKChjaGFyICopIG5hbWUpOworI2Vsc2UKKyAgICByZXR1cm4gcm1kaXIobmFtZSk7CisjZW5kaWYKK30KKyNpZiBkZWZpbmVkKGFjY19pbnQzMmVfdCkKK0FDQ0xJQl9QVUJMSUMoYWNjX2ludDMyZV90LCBhY2NfbXVsZGl2MzJzKSAoYWNjX2ludDMyZV90IGEsIGFjY19pbnQzMmVfdCBiLCBhY2NfaW50MzJlX3QgeCkKK3sKKyAgICBhY2NfaW50MzJlX3QgciA9IDA7CisgICAgaWYgX19hY2NfbGlrZWx5KHggIT0gMCkKKyAgICB7CisjaWYgZGVmaW5lZChhY2NfaW50NjRsX3QpCisgICAgICAgIHIgPSAoYWNjX2ludDMyZV90KSAoKChhY2NfaW50NjRsX3QpIGEgKiBiKSAvIHgpOworI2Vsc2UKKyAgICAgICAgQUNDX1VOVVNFRChhKTsgQUNDX1VOVVNFRChiKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gcjsKK30KK0FDQ0xJQl9QVUJMSUMoYWNjX3VpbnQzMmVfdCwgYWNjX211bGRpdjMydSkgKGFjY191aW50MzJlX3QgYSwgYWNjX3VpbnQzMmVfdCBiLCBhY2NfdWludDMyZV90IHgpCit7CisgICAgYWNjX3VpbnQzMmVfdCByID0gMDsKKyAgICBpZiBfX2FjY19saWtlbHkoeCAhPSAwKQorICAgIHsKKyNpZiBkZWZpbmVkKGFjY19pbnQ2NGxfdCkKKyAgICAgICAgciA9IChhY2NfdWludDMyZV90KSAoKChhY2NfdWludDY0bF90KSBhICogYikgLyB4KTsKKyNlbHNlCisgICAgICAgIEFDQ19VTlVTRUQoYSk7IEFDQ19VTlVTRUQoYik7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKyNpZiAwCitBQ0NMSUJfUFVCTElDX05PSU5MSU5FKGludCwgYWNjX3N5c2NhbGxfY2xvY2tfZ2V0dGltZSkgKGludCBjKQoreworfQorI2VuZGlmCisjaWYgKEFDQ19PU19XSU4xNikKK0FDQ19FWFRFUk5fQyB2b2lkIF9fZmFyIF9fcGFzY2FsIERlYnVnQnJlYWsodm9pZCk7CisjZW5kaWYKK0FDQ0xJQl9QVUJMSUNfTk9JTkxJTkUodm9pZCwgYWNjX2RlYnVnX2JyZWFrKSAodm9pZCkKK3sKKyNpZiAoQUNDX09TX1dJTjE2KQorICAgIERlYnVnQnJlYWsoKTsKKyNlbGlmIChBQ0NfQVJDSF9JMDg2KQorI2VsaWYgKEFDQ19PU19XSU42NCkgJiYgKEFDQ19IQVZFX1dJTkRPV1NfSCkKKyAgICBEZWJ1Z0JyZWFrKCk7CisjZWxpZiBkZWZpbmVkKEFDQ19DRkdfTk9fSU5MSU5FX0FTTSkgJiYgKEFDQ19PU19XSU4zMikgJiYgKEFDQ19IQVZFX1dJTkRPV1NfSCkKKyAgICBEZWJ1Z0JyZWFrKCk7CisjZWxpZiAoQUNDX0FSQ0hfQU1ENjQgfHwgQUNDX0FSQ0hfSTM4NikgJiYgKEFDQ19BU01fU1lOVEFYX0dOVUMpCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImludCAkM1xuIiA6IDogOiBfX0FDQ19BU01fQ0xPQkJFUik7CisjZWxpZiAoQUNDX0FSQ0hfSTM4NikgJiYgKEFDQ19BU01fU1lOVEFYX01TQykKKyAgICBfX2FzbSB7IGludCAzIH0KKyNlbGlmIChBQ0NfT1NfV0lOMzIpICYmIChBQ0NfSEFWRV9XSU5ET1dTX0gpCisgICAgRGVidWdCcmVhaygpOworI2Vsc2UKKyAgICAqICh2b2xhdGlsZSBpbnQgKikgMHgxID0gLTE7CisjZW5kaWYKK30KK0FDQ0xJQl9QVUJMSUNfTk9JTkxJTkUodm9pZCwgYWNjX2RlYnVnX25vcCkgKHZvaWQpCit7Cit9CitBQ0NMSUJfUFVCTElDX05PSU5MSU5FKGludCwgYWNjX2RlYnVnX2FsaWduX2NoZWNrX3F1ZXJ5KSAodm9pZCkKK3sKKyNpZiAoQUNDX0FSQ0hfQU1ENjQgfHwgQUNDX0FSQ0hfSTM4NikgJiYgKEFDQ19BU01fU1lOVEFYX0dOVUMpCisgICAgc2l6ZV90IHI7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hmXG4gcG9wICUwXG4iIDogIj1hIiAocikgOiA6IF9fQUNDX0FTTV9DTE9CQkVSKTsKKyAgICByZXR1cm4gKGludCkociA+PiAxOCkgJiAxOworI2VsaWYgKEFDQ19BUkNIX0kzODYpICYmIChBQ0NfQVNNX1NZTlRBWF9NU0MpCisgICAgdW5zaWduZWQgbG9uZyByOworICAgIF9fYXNtIHsKKyAgICAgICAgcHVzaGYKKyAgICAgICAgcG9wIGVheAorICAgICAgICBtb3YgcixlYXgKKyAgICB9CisgICAgcmV0dXJuIChpbnQpKHIgPj4gMTgpICYgMTsKKyNlbHNlCisgICAgcmV0dXJuIC0xOworI2VuZGlmCit9CitBQ0NMSUJfUFVCTElDX05PSU5MSU5FKGludCwgYWNjX2RlYnVnX2FsaWduX2NoZWNrX2VuYWJsZSkgKGludCB2KQoreworICAgIGludCByOworI2lmIChBQ0NfQVJDSF9BTUQ2NCkgJiYgKEFDQ19BU01fU1lOVEFYX0dOVUMpCisgICAgaWYgKHYpIHsKKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hmXG4gb3JsICQyNjIxNDQsKCUlcnNwKVxuIHBvcGZcbiIgOiA6IDogX19BQ0NfQVNNX0NMT0JCRVIpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJwdXNoZlxuIGFuZGwgJC0yNjIxNDUsKCUlcnNwKVxuIHBvcGZcbiIgOiA6IDogX19BQ0NfQVNNX0NMT0JCRVIpOworICAgIH0KKyAgICByID0gMDsKKyNlbGlmIChBQ0NfQVJDSF9JMzg2KSAmJiAoQUNDX0FTTV9TWU5UQVhfR05VQykKKyAgICBpZiAodikgeworICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGZcbiBvcmwgJDI2MjE0NCwoJSVlc3ApXG4gcG9wZlxuIiA6IDogOiBfX0FDQ19BU01fQ0xPQkJFUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hmXG4gYW5kbCAkLTI2MjE0NSwoJSVlc3ApXG4gcG9wZlxuIiA6IDogOiBfX0FDQ19BU01fQ0xPQkJFUik7CisgICAgfQorICAgIHIgPSAwOworI2VsaWYgKEFDQ19BUkNIX0kzODYpICYmIChBQ0NfQVNNX1NZTlRBWF9NU0MpCisgICAgaWYgKHYpIHsgX19hc20geworICAgICAgICBwdXNoZgorICAgICAgICBvciBkd29yZCBwdHIgW2VzcF0sMjYyMTQ0CisgICAgICAgIHBvcGYKKyAgICB9fSBlbHNlIHsgX19hc20geworICAgICAgICBwdXNoZgorICAgICAgICBhbmQgZHdvcmQgcHRyIFtlc3BdLC0yNjIxNDUKKyAgICAgICAgcG9wZgorICAgIH19CisgICAgciA9IDA7CisjZWxzZQorICAgIHIgPSAtMTsKKyNlbmRpZgorICAgIEFDQ19VTlVTRUQodik7IHJldHVybiByOworfQorQUNDTElCX1BVQkxJQ19OT0lOTElORSh1bnNpZ25lZCwgYWNjX2RlYnVnX3J1bm5pbmdfb25fcWVtdSkgKHZvaWQpCit7CisgICAgdW5zaWduZWQgciA9IDA7CisjaWYgKEFDQ19PU19QT1NJWF9MSU5VWCB8fCBBQ0NfT1NfV0lOMzIgfHwgQUNDX09TX1dJTjY0KQorICAgIGNvbnN0IGNoYXIqIHA7CisgICAgcCA9IGFjY19nZXRlbnYoIkFDQ19FTlZfUlVOTklOR19PTl9RRU1VIik7CisgICAgaWYgKHApIHsKKyAgICAgICAgaWYgKHBbMF0gPT0gMCkgciA9IDA7CisgICAgICAgIGVsc2UgaWYgKChwWzBdID49ICcwJyAmJiBwWzBdIDw9ICc5JykgJiYgcFsxXSA9PSAwKSByID0gcFswXSAtICcwJzsKKyAgICAgICAgZWxzZSByID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gcjsKK30KK0FDQ0xJQl9QVUJMSUNfTk9JTkxJTkUodW5zaWduZWQsIGFjY19kZWJ1Z19ydW5uaW5nX29uX3ZhbGdyaW5kKSAodm9pZCkKK3sKKyNpZiAoQUNDX0FSQ0hfQU1ENjQgfHwgQUNDX0FSQ0hfSTM4NikgJiYgKEFDQ19BU01fU1lOVEFYX0dOVUMpCisgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBhcmdzWzVdID0geyAweDEwMDEsIDAsIDAsIDAsIDAgfTsKKyAgICB1bnNpZ25lZCBsb25nIHIgPSAwOworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCIuYnl0ZSAweGMxLDB4YzAsMHgxZCwweGMxLDB4YzAsMHgwMywweGMxLDB4YzgsMHgxYiwweGMxLDB4YzgsMHgwNSwweGMxLDB4YzAsMHgwZCwweGMxLDB4YzAsMHgxM1xuIiA6ICI9ZCIgKHIpIDogImEiICgmYXJnc1swXSksICJkIiAocikgOiBfX0FDQ19BU01fQ0xPQkJFUik7CisgICAgcmV0dXJuICh1bnNpZ25lZCkgcjsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKyNpZiAoQUNDX09TX1dJTjMyICYmIEFDQ19DQ19QRUxMRVNDICYmIChfX1BPQ0NfXyA+PSAyOTApKQorIyAgcHJhZ21hIHdhcm4ocG9wKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFDQ19XQU5UX0FDQ0xJQl9XSUxEQVJHVikKKyMgIHVuZGVmIEFDQ19XQU5UX0FDQ0xJQl9XSUxEQVJHVgorI2RlZmluZSBfX0FDQ0xJQl9XSUxEQVJHVl9DSF9JTkNMVURFRCAxCisjaWYgIWRlZmluZWQoQUNDTElCX1BVQkxJQykKKyMgIGRlZmluZSBBQ0NMSUJfUFVCTElDKHIsZikgICAgciBfX0FDQ0xJQl9GVU5DTkFNRShmKQorI2VuZGlmCisjaWYgKEFDQ19PU19ET1MxNiB8fCBBQ0NfT1MyMTYgfHwgQUNDX09TX1dJTjE2KQorI2lmIDAgJiYgKEFDQ19DQ19NU0MpCitBQ0NfRVhURVJOX0MgaW50IF9fYWNjX2NkZWNsIF9fc2V0YXJndih2b2lkKTsKK0FDQ19FWFRFUk5fQyBpbnQgX19hY2NfY2RlY2wgX3NldGFyZ3Yodm9pZCk7CitBQ0NfRVhURVJOX0MgaW50IF9fYWNjX2NkZWNsIF9zZXRhcmd2KHZvaWQpIHsgcmV0dXJuIF9fc2V0YXJndigpOyB9CisjZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfT1NfV0lOMzIgfHwgQUNDX09TX1dJTjY0KQorI2lmIChBQ0NfQ0NfSU5URUxDIHx8IEFDQ19DQ19NU0MpCitBQ0NfRVhURVJOX0MgaW50IF9fYWNjX2NkZWNsIF9fc2V0YXJndih2b2lkKTsKK0FDQ19FWFRFUk5fQyBpbnQgX19hY2NfY2RlY2wgX3NldGFyZ3Yodm9pZCk7CitBQ0NfRVhURVJOX0MgaW50IF9fYWNjX2NkZWNsIF9zZXRhcmd2KHZvaWQpIHsgcmV0dXJuIF9fc2V0YXJndigpOyB9CisjZW5kaWYKKyNlbmRpZgorI2lmIChBQ0NfT1NfRU1YKQorI2RlZmluZSBfX0FDQ0xJQl9IQVZFX0FDQ19XSUxEQVJHViAxCitBQ0NMSUJfUFVCTElDKHZvaWQsIGFjY193aWxkYXJndikgKGludCogYXJnYywgY2hhcioqKiBhcmd2KQoreworICAgIGlmIChhcmdjICYmIGFyZ3YpIHsKKyAgICAgICAgX3Jlc3BvbnNlKGFyZ2MsIGFyZ3YpOworICAgICAgICBfd2lsZGNhcmQoYXJnYywgYXJndik7CisgICAgfQorfQorI2VuZGlmCisjaWYgKEFDQ19PU19DT05TT0xFX1BTUCkgJiYgZGVmaW5lZChfX1BTUFNES19ERUJVR19fKQorI2RlZmluZSBfX0FDQ0xJQl9IQVZFX0FDQ19XSUxEQVJHViAxCitBQ0NfRVhURVJOX0MgaW50IGFjY19wc3BfaW5pdF9tb2R1bGUoaW50KiwgY2hhcioqKiwgaW50KTsKK0FDQ0xJQl9QVUJMSUModm9pZCwgYWNjX3dpbGRhcmd2KSAoaW50KiBhcmdjLCBjaGFyKioqIGFyZ3YpCit7CisgICAgYWNjX3BzcF9pbml0X21vZHVsZShhcmdjLCBhcmd2LCAtMSk7Cit9CisjZW5kaWYKKyNpZiAhZGVmaW5lZChfX0FDQ0xJQl9IQVZFX0FDQ19XSUxEQVJHVikKKyNkZWZpbmUgX19BQ0NMSUJfSEFWRV9BQ0NfV0lMREFSR1YgMQorQUNDTElCX1BVQkxJQyh2b2lkLCBhY2Nfd2lsZGFyZ3YpIChpbnQqIGFyZ2MsIGNoYXIqKiogYXJndikKK3sKKyNpZiAxICYmIChBQ0NfQVJDSF9JMDg2UE0pCisgICAgaWYgKEFDQ19NTV9BSFNISUZUICE9IDMpIHsgZXhpdCgxKTsgfQorI2VsaWYgMSAmJiAoQUNDX0FSQ0hfTTY4SyAmJiBBQ0NfT1NfVE9TICYmIEFDQ19DQ19HTlVDKSAmJiBkZWZpbmVkKF9fTUlOVF9fKQorICAgIF9fYmlubW9kZSgxKTsKKyAgICBpZiAoaXNhdHR5KDEpKSBfX3NldF9iaW5tb2RlKHN0ZG91dCwgMCk7CisgICAgaWYgKGlzYXR0eSgyKSkgX19zZXRfYmlubW9kZShzdGRlcnIsIDApOworI2VuZGlmCisgICAgQUNDX1VOVVNFRChhcmdjKTsgQUNDX1VOVVNFRChhcmd2KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qIHZpbTpzZXQgdHM9NCBldDogKi8KZGlmZiAtLWdpdCBhL2x6by9zcmMvc3RhdHMxYS5oIGIvbHpvL3NyYy9zdGF0czFhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyYWYzOAotLS0gL2Rldi9udWxsCisrKyBiL2x6by9zcmMvc3RhdHMxYS5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiBzdGF0czFhLmggLS0gc3RhdGlzdGljcyBmb3IgdGhlIHRoZSBMWk8xQSBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKi8KKworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIExaTyBwYWNrYWdlIGFuZCBpcyBzdWJqZWN0CisgICB0byBjaGFuZ2UuCisgKi8KKworCisjaWZuZGVmIF9fTFpPX1NUQVRTMUFfSAorI2RlZmluZSBfX0xaT19TVEFUUzFBX0ggMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGNvbGxlY3Qgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gd2hlbiBjb21wcmVzc2luZworLy8gdXNlZCBmb3IgZmluZXR1bmluZywgdmlldyB3aXRoIGEgZGVidWdnZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIChMWk9fQ09MTEVDVF9TVEFUUykKKyMgIGRlZmluZSBMWk9fU1RBVFMoZXhwcikgICBleHByCisjZWxzZQorIyAgZGVmaW5lIExaT19TVEFUUyhleHByKSAgICgodm9pZCkgMCkKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCisvKiBjb25maWd1cmF0aW9uICovCisgICAgdW5zaWduZWQgcmJpdHM7CisgICAgdW5zaWduZWQgY2xldmVsOworCisvKiBpbnRlcm5hbCBjb25maWd1cmF0aW9uICovCisgICAgdW5zaWduZWQgZGJpdHM7CisgICAgdW5zaWduZWQgbGJpdHM7CisKKy8qIGNvbnN0YW50cyAqLworICAgIHVuc2lnbmVkIG1pbl9tYXRjaF9zaG9ydDsKKyAgICB1bnNpZ25lZCBtYXhfbWF0Y2hfc2hvcnQ7CisgICAgdW5zaWduZWQgbWluX21hdGNoX2xvbmc7CisgICAgdW5zaWduZWQgbWF4X21hdGNoX2xvbmc7CisgICAgdW5zaWduZWQgbWluX29mZnNldDsKKyAgICB1bnNpZ25lZCBtYXhfb2Zmc2V0OworICAgIHVuc2lnbmVkIHIwbWluOworICAgIHVuc2lnbmVkIHIwZmFzdDsKKyAgICB1bnNpZ25lZCByMG1heDsKKworLyogY291bnRzICovCisgICAgbG9uZyBzaG9ydF9tYXRjaGVzOworICAgIGxvbmcgbG9uZ19tYXRjaGVzOworICAgIGxvbmcgcjFfbWF0Y2hlczsKKyAgICBsb25nIGxpdF9ydW5zOworICAgIGxvbmcgbGl0X3J1bnNfYWZ0ZXJfbG9uZ19tYXRjaDsKKyAgICBsb25nIHIwc2hvcnRfcnVuczsKKyAgICBsb25nIHIwZmFzdF9ydW5zOworICAgIGxvbmcgcjBsb25nX3J1bnM7CisKKy8qICovCisgICAgbG9uZyBsaXRfcnVuW1JTSVpFXTsKKyAgICBsb25nIGxpdF9ydW5fYWZ0ZXJfbG9uZ19tYXRjaFtSU0laRV07CisgICAgbG9uZyBzaG9ydF9tYXRjaFtNQVhfTUFUQ0hfU0hPUlQgKyAxXTsKKyAgICBsb25nIGxvbmdfbWF0Y2hbTUFYX01BVENIX0xPTkcgKyAxXTsKKyAgICBsb25nIG1hcmtlclsyNTZdOworCisvKiB0aGVzZSBjb3VsZCBwcm92ZSB1c2VmdWwgZm9yIGZ1cnRoZXIgb3B0aW1pemF0aW9ucyAqLworICAgIGxvbmcgc2hvcnRfbWF0Y2hfb2Zmc2V0X29zaXplW01BWF9NQVRDSF9TSE9SVCArIDFdOworICAgIGxvbmcgc2hvcnRfbWF0Y2hfb2Zmc2V0XzI1NltNQVhfTUFUQ0hfU0hPUlQgKyAxXTsKKyAgICBsb25nIHNob3J0X21hdGNoX29mZnNldF8xMDI0W01BWF9NQVRDSF9TSE9SVCArIDFdOworICAgIGxvbmcgbWF0Y2hlc19vdXRfb2ZfcmFuZ2U7CisgICAgbG9uZyBtYXRjaGVzX291dF9vZl9yYW5nZV8yOworICAgIGxvbmcgbWF0Y2hlc19vdXRfb2ZfcmFuZ2VfNDsKKyAgICBsb25nIG1hdGNoX291dF9vZl9yYW5nZVtNQVhfTUFUQ0hfU0hPUlQgKyAxXTsKKworLyogKi8KKyAgICBsb25nIGluX2xlbjsKKyAgICBsb25nIG91dF9sZW47Cit9Citsem8xYV9zdGF0c190OworCitleHRlcm4gbHpvMWFfc3RhdHNfdCAqbHpvMWFfc3RhdHM7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBhbHJlYWR5IGluY2x1ZGVkICovCisKKy8qCit2aTp0cz00OmV0CisqLwpkaWZmIC0tZ2l0IGEvbHpvL3NyYy9zdGF0czFiLmggYi9sem8vc3JjL3N0YXRzMWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTNlN2FiCi0tLSAvZGV2L251bGwKKysrIGIvbHpvL3NyYy9zdGF0czFiLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qIHN0YXRzMWIuaCAtLSBzdGF0aXN0aWNzIGZvciB0aGUgdGhlIExaTyBsaWJyYXJ5CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICovCisKKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5IGFuZCBpcyBzdWJqZWN0CisgICB0byBjaGFuZ2UuCisgKi8KKworCisjaWZuZGVmIF9fTFpPX1NUQVRTMUJfSAorI2RlZmluZSBfX0xaT19TVEFUUzFCX0ggMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBDb2xsZWN0IHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIHdoZW4gY29tcHJlc3NpbmcuCisvLyBVc2VmdWwgZm9yIGZpbmV0dW5pbmcgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS4KKy8vIEV4YW1pbmUgdGhlIHN5bWJvbCAnbHpvMWJfc3RhdHMnIHdpdGggYSBkZWJ1Z2dlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIChMWk9fQ09MTEVDVF9TVEFUUykKKyMgIGRlZmluZSBMWk9fU1RBVFMoZXhwcikgICBleHByCisjZWxzZQorIyAgZGVmaW5lIExaT19TVEFUUyhleHByKSAgICgodm9pZCkgMCkKKyNlbmRpZgorCisKKyNpZiAoTFpPX0NPTExFQ1RfU1RBVFMpCisKK3R5cGVkZWYgc3RydWN0Cit7CisvKiBhbGdvcml0aG0gY29uZmlndXJhdGlvbiAqLworICAgIHVuc2lnbmVkIHJfYml0czsKKyAgICB1bnNpZ25lZCBtM29fYml0czsKKyAgICB1bnNpZ25lZCBkZF9iaXRzOworICAgIHVuc2lnbmVkIGNsZXZlbDsKKworLyogaW50ZXJuYWwgY29uZmlndXJhdGlvbiAqLworICAgIHVuc2lnbmVkIGRfYml0czsKKyAgICBsb25nIG1pbl9sb29rYWhlYWQ7CisgICAgbG9uZyBtYXhfbG9va2JlaGluZDsKKyAgICBjb25zdCBjaGFyICpjb21wcmVzc19pZDsKKworLyogY291bnRzICovCisgICAgbG9uZyBsaXRfcnVuczsKKyAgICBsb25nIHIwc2hvcnRfcnVuczsKKyAgICBsb25nIHIwZmFzdF9ydW5zOworICAgIGxvbmcgcjBsb25nX3J1bnM7CisgICAgbG9uZyBtMV9tYXRjaGVzOworICAgIGxvbmcgbTJfbWF0Y2hlczsKKyAgICBsb25nIG0zX21hdGNoZXM7CisgICAgbG9uZyBtNF9tYXRjaGVzOworICAgIGxvbmcgcjFfbWF0Y2hlczsKKworLyogKi8KKyAgICBsb25nIGxpdF9ydW5bUjBNSU5dOworICAgIGxvbmcgbTJfbWF0Y2hbTTJfTUFYX0xFTiArIDFdOworICAgIGxvbmcgbTNfbWF0Y2hbTTNfTUFYX0xFTiArIDFdOworI2lmIChNM09fQklUUyA8IDgpCisgICAgbG9uZyBsaXRfcnVuc19hZnRlcl9tM19tYXRjaDsKKyAgICBsb25nIGxpdF9ydW5fYWZ0ZXJfbTNfbWF0Y2hbTFpPX1NJWkUoOC1NM09fQklUUyldOworI2VuZGlmCisKKy8qICovCisgICAgbG9uZyBtYXRjaGVzOworICAgIGxvbmcgbWF0Y2hfYnl0ZXM7CisgICAgbG9uZyBsaXRlcmFsczsKKyAgICBsb25nIGxpdGVyYWxfb3ZlcmhlYWQ7CisgICAgbG9uZyBsaXRlcmFsX2J5dGVzOworICAgIGRvdWJsZSBsaXRlcmFsX292ZXJoZWFkX3BlcmNlbnQ7CisKKy8qICovCisgICAgbG9uZyB1bnVzZWRfZGljdF9lbnRyaWVzOworICAgIGRvdWJsZSB1bnVzZWRfZGljdF9lbnRyaWVzX3BlcmNlbnQ7CisKKy8qICovCisgICAgbG9uZyBpbl9sZW47CisgICAgbG9uZyBvdXRfbGVuOworfQorbHpvMWJfc3RhdHNfdDsKKworCit2b2lkIF9sem8xYl9zdGF0c19pbml0KGx6bzFiX3N0YXRzX3QgKmx6b19zdGF0cyk7Cit2b2lkIF9sem8xYl9zdGF0c19jYWxjKGx6bzFiX3N0YXRzX3QgKmx6b19zdGF0cyk7CisKK2V4dGVybiBsem8xYl9zdGF0c190ICogY29uc3QgbHpvMWJfc3RhdHM7CisKKyNkZWZpbmUgbHpvX3N0YXRzX3QgICAgIGx6bzFiX3N0YXRzX3QKKyNkZWZpbmUgbHpvX3N0YXRzICAgICAgIGx6bzFiX3N0YXRzCisKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmIC8qIGFscmVhZHkgaW5jbHVkZWQgKi8KKworLyoKK3ZpOnRzPTQ6ZXQKKyovCmRpZmYgLS1naXQgYS9sem8vc3JjL3N0YXRzMWMuaCBiL2x6by9zcmMvc3RhdHMxYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMWY0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9sem8vc3JjL3N0YXRzMWMuaApAQCAtMCwwICsxLDQ5IEBACisvKiBzdGF0czFjLmggLS0gc3RhdGlzdGljcyBmb3IgdGhlIHRoZSBMWk8gbGlicmFyeQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAgIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqLworCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSBhbmQgaXMgc3ViamVjdAorICAgdG8gY2hhbmdlLgorICovCisKKworI2lmbmRlZiBfX0xaT19TVEFUUzFDX0gKKyNkZWZpbmUgX19MWk9fU1RBVFMxQ19IIDEKKworI2RlZmluZSBsem8xYl9zdGF0c190ICAgICAgIGx6bzFjX3N0YXRzX3QKKyNkZWZpbmUgbHpvMWJfc3RhdHMgICAgICAgICBsem8xY19zdGF0cworI2RlZmluZSBfbHpvMWJfc3RhdHNfaW5pdCAgIF9sem8xY19zdGF0c19pbml0CisjZGVmaW5lIF9sem8xYl9zdGF0c19jYWxjICAgX2x6bzFjX3N0YXRzX2NhbGMKKworI2luY2x1ZGUgInN0YXRzMWIuaCIKKworI2VuZGlmIC8qIGFscmVhZHkgaW5jbHVkZWQgKi8KKworLyoKK3ZpOnRzPTQ6ZXQKKyovCmRpZmYgLS1naXQgYS9tYW4vZXh0bGludXguMSBiL21hbi9leHRsaW51eC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYWE0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vZXh0bGludXguMQpAQCAtMCwwICsxLDczIEBACisuVEggZXh0bGludXggIjEiICIxOCBEZWNlbWJlciAyMDA3IiAiU1lTTElOVVggZm9yIGV4dDIvZXh0MyBmaWxlc3lzdGVtIgorLlNIIE5BTUUKK2V4dGxpbnV4IFwtIGluc3RhbGwgdGhlIFxzLTFTWVNMSU5VWFxzKzEgYm9vdGxvYWRlciBvbiBhIGV4dDIvZXh0MyBmaWxlc3lzdGVtCisuU0ggU1lOT1BTSVMKKy5CIGV4dGxpbnV4CitbXGZJb3B0aW9uc1xmUF0gXGZJZGlyZWN0b3J5XGZQCisuU0ggREVTQ1JJUFRJT04KK1xmQkVYVExJTlVYXGZQIGlzIGEgbmV3IHN5c2xpbnV4IGRlcml2YXRpdmUsIHdoaWNoIGJvb3RzIGZyb20gYSBMaW51eCBleHQyL2V4dDMKK2ZpbGVzeXN0ZW0uICBJdCB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgXGZCU1lTTElOVVhcZlAsIHdpdGggYSBmZXcgc2xpZ2h0IG1vZGlmaWNhdGlvbnMuCitJdCBpcyBpbnRlbmRlZCB0byBzaW1wbGlmeSBmaXJzdC10aW1lIGluc3RhbGxhdGlvbiBvZiBMaW51eCwgYW5kIGZvciBjcmVhdGlvbiBvZgorcmVzY3VlIGFuZCBvdGhlciBzcGVjaWFsLXB1cnBvc2UgYm9vdCBkaXNrcy4KKy5QUAorVGhlIGluc3RhbGxlciBpcyBkZXNpZ25lZCB0byBiZSBydW4gb24gYSBtb3VudGVkIGRpcmVjdG9yeS4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhbgorZXh0MiBvciBleHQzIHVzYiBrZXkgbW91bnRlZCBvbiAvbW50LCB5b3UgY2FuIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisuSVAKKy5CIGV4dGxpbnV4IC0taW5zdGFsbCAvbW50CisuU0ggT1BUSU9OUworLlRQCitcZkJcLUhcZlIsIFxmQlwtXC1oZWFkc1xmUj0jCitGb3JjZSB0aGUgbnVtYmVyIG9mIGhlYWRzLgorLlRQCitcZkJcLWlcZlIsIFxmQlwtXC1pbnN0YWxsXGZSCitJbnN0YWxsIG92ZXIgdGhlIGN1cnJlbnQgYm9vdHNlY3Rvci4KKy5UUAorXGZCXC1PXGZSLCBcZkJcLVwtY2xlYXJcLW9uY2VcZlIKK0NsZWFyIHRoZSBib290LW9uY2UgY29tbWFuZC4KKy5UUAorXGZCXC1vXGZSLCBcZkJcLVwtb25jZVxmUj1cZkljb21tYW5kXGZSCitFeGVjdXRlIGEgY29tbWFuZCBvbmNlIHVwb24gYm9vdC4KKy5UUAorXGZCXC1NXGZSLCBcZkJcLVwtbWVudVwtc2F2ZVxmUj1cZklsYWJlbFxmUgorU2V0IHRoZSBsYWJlbCB0byBzZWxlY3QgYXMgZGVmYXVsdCBvbiB0aGUgbmV4dCBib290CisuVFAKK1xmQlwtclxmUiwgXGZCXC1cLXJhaWRcZlIKK0ZhbGwgYmFjayB0byB0aGUgbmV4dCBkZXZpY2Ugb24gYm9vdCBmYWlsdXJlLgorLlRQCitcZkJcLVwtcmVzZXRcLWFkdlxmUgorUmVzZXQgYXV4aWxpYXJ5IGRhdGEuCisuVFAKK1xmQlwtU1xmUiwgXGZCXC1cLXNlY3RvcnNcZlI9XGZJI1xmUgorRm9yY2UgdGhlIG51bWJlciBvZiBzZWN0b3JzIHBlciB0cmFjay4KKy5UUAorXGZCXC1VXGZSLCBcZkJcLVwtdXBkYXRlXGZSCitVcGRhdGVzIGEgcHJldmlvdXMgXGZCRVhUTElOVVhcZlAgaW5zdGFsbGF0aW9uLgorLlRQCitcZkJcLXpcZlIsIFxmQlwtXC16aXBcZlIKK0ZvcmNlIHppcGRyaXZlIGdlb21ldHJ5ICgtSCA2NCAtUyAzMikuCisuVFAKK1xmQlwtXC1kZXZpY2VcZlI9XGZJZGV2aWNlbmFtZVxmUgorT3ZlcnJpZGUgdGhlIGF1dG9tYXRpYyBkZXRlY3Rpb24gb2YgZGV2aWNlIG5hbWVzLiAgVGhpcyBvcHRpb24gaXMKK2ludGVuZGVkIGZvciBzcGVjaWFsIGVudmlyb25tZW50cyBvbmx5IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkKK25vcm1hbCB1c2Vycy4gIE1pc3VzZSBvZiB0aGlzIG9wdGlvbiBjYW4gY2F1c2UgZGlzayBjb3JydXB0aW9uIGFuZAorbG9zdCBkYXRhLgorLlNIIEZJTEVTCitUaGUgZXh0bGludXggY29uZmlndXJhdGlvbiBmaWxlIG5lZWRzIHRvIGJlIG5hbWVkIHN5c2xpbnV4LmNmZyBvcgorZXh0bGludXguY29uZiBhbmQgbmVlZHMgdG8gYmUgc3RvcmVkIGluIHRoZSBleHRsaW51eCBpbnN0YWxsYXRpb24KK2RpcmVjdG9yeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRlbnRzIG9mIGV4dGxpbnV4LmNvbmYsCitzZWUgc3lzbGludXgoMSkgbWFucGFnZSwgc2VjdGlvbiBmaWxlcy4KKy5TSCBCVUdTCitJIHdvdWxkIGFwcHJlY2lhdGUgaGVhcmluZyBvZiBhbnkgcHJvYmxlbXMgeW91IGhhdmUgd2l0aCBccy0xU1lTTElOVVhccysxLiAgSQord291bGQgYWxzbyBsaWtlIHRvIGhlYXIgZnJvbSB5b3UgaWYgeW91IGhhdmUgc3VjY2Vzc2Z1bGx5IHVzZWQgXHMtMVNZU0xJTlVYXHMrMSwKK2VzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBpdCBmb3IgYSBkaXN0cmlidXRpb24uCisuUFAKK0lmIHlvdSBhcmUgcmVwb3J0aW5nIHByb2JsZW1zLCBwbGVhc2UgaW5jbHVkZSBhbGwgcG9zc2libGUgaW5mb3JtYXRpb24KK2Fib3V0IHlvdXIgc3lzdGVtIGFuZCB5b3VyIEJJT1M7IHRoZSB2YXN0IG1ham9yaXR5IG9mIGFsbCBwcm9ibGVtcworcmVwb3J0ZWQgdHVybiBvdXQgdG8gYmUgQklPUyBvciBoYXJkd2FyZSBidWdzLCBhbmQgSSBuZWVkIGFzIG11Y2gKK2luZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvIGRpYWdub3NlIHRoZSBwcm9ibGVtcy4KKy5QUAorVGhlcmUgaXMgYSBtYWlsaW5nIGxpc3QgZm9yIGRpc2N1c3Npb24gYW1vbmcgXHMtMVNZU0xJTlVYXHMrMSB1c2VycyBhbmQgZm9yCithbm5vdW5jZW1lbnRzIG9mIG5ldyBhbmQgdGVzdCB2ZXJzaW9ucy4gVG8gam9pbiwgc2VuZCBhIG1lc3NhZ2UgdG8KK21ham9yZG9tb0BsaW51eC5rZXJuZWwub3JnIHdpdGggdGhlIGxpbmU6CisuU0ggU0VFIEFMU08KKy5CUiBzeXNsaW51eCAoMSkKZGlmZiAtLWdpdCBhL21hbi9nZXRob3N0aXAuMSBiL21hbi9nZXRob3N0aXAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjA4MWYxCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2dldGhvc3RpcC4xCkBAIC0wLDAgKzEsNDUgQEAKKy5USCAiR0VUSE9TVElQIiAiMSIKKy5TSCAiTkFNRSIKK2dldGhvc3RpcCBcKGVtIGNvbnZlcnQgYW4gSVAgYWRkcmVzcyBpbnRvIHZhcmlvdXMgZm9ybWF0cworLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCZ2V0aG9zdGlwXGZSIFtcZkItZHhuZlxmUF0gIFtcZkJcZklIT1NUTkFNRXxJUFxmUlxmUF0KKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIGJyaWVmbHkgdGhlCitcZkJnZXRob3N0aXBcZlIgY29tbWFuZC4KKy5QUAorVGhlIFxmQmdldGhvc3RpcFxmUiB1dGlsaXR5IGNvbnZlcnRzIHRoZSBnaXZlbiBob3N0bmFtZSBvcgorSVAgYWRkcmVzcyBpbnRvIGEgdmFyaWV0eSBmb3JtYXRzLiAgSXQgaXMgcHJvdmlkZWQgYnkgdGhlIHN5c2xpbnV4CitwYWNrYWdlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNhbGN1bGF0ZSB0aGUgYXBwcm9wcmlhdGUgbmFtZXMgZm9yCitweGVsaW51eCBjb25maWd1cmF0aW9uIGZpbGVzLiAgVGhlc2UgZmlsZW5hbWVzIGNhbiBiZSB0aGUgY29tcGxldGUKK2hleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIGZvciBhIGdpdmVuIElQIGFkZHJlc3MsIG9yIGEgcGFydGlhbAoraGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gdG8gbWF0Y2ggYSByYW5nZSBvZiBJUCBhZGRyZXNzZXMuCisKKy5TSCAiT1BUSU9OUyIKKy5QUAorQSBzdW1tYXJ5IG9mIG9wdGlvbnMgaXMgaW5jbHVkZWQgYmVsb3cuCisuSVAgIlxmQi1kXGZQIiAxMAorT3V0cHV0IHRoZSBJUCBhZGRyZXNzIGluIGRlY2ltYWwgZm9ybWF0LgorLklQICJcZkIteFxmUCIgMTAKK091dHB1dCB0aGUgSVAgYWRkcmVzcyBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuCisuSVAgIlxmQi1uXGZQIiAxMAorT3V0cHV0IHRoZSBob3N0J3MgY2Fub25pY2FsIG5hbWUuCisuSVAgIlxmQi1mXGZQIiAxMAorRnVsbCBvdXRwdXQuICBPdXRwdXRzIHRoZSBJUCBhZGRyZXNzIGluIGFsbCBzdXBwb3J0ZWQgZm9ybWF0cy4KK1NhbWUgYXMgXGZCLXhkblxmUC4KKworLlNIICJTRUUgQUxTTyIKKy5QUAorXGZCc3lzbGludXhcZlIoMSkKKworLlBQCitNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBweGVsaW51eCBkb2N1bWVudGF0aW9uLCB3aGljaAorY2FuIGJlIGZvdW5kIGluCitcZkIvdXNyL3NoYXJlL2RvYy9zeXNsaW51eC9weGVsaW51eC5kb2MuZ3pcZlAgb24KK1xmQkRlYmlhbiBHTlUvTGludXhcZlAgc3lzdGVtcy4KKworLlNIICJBVVRIT1IiCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIGNvbXBpbGVkIGJ5IGRhbm4gZnJhemllciA8ZGFubmZAZGViaWFuLm9yZz4gZm9yCit0aGUgXGZCRGViaWFuIEdOVS9MaW51eFxmUCBzeXN0ZW0gKGJ1dCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgpkaWZmIC0tZ2l0IGEvbWFuL2lzb2h5YnJpZC4xIGIvbWFuL2lzb2h5YnJpZC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTAxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vaXNvaHlicmlkLjEKQEAgLTAsMCArMSw2NCBAQAorLlRIIGlzb2h5YnJpZCAxICIxNyBKYW4gMjAxNCIgImlzb2h5YnJpZCIKKy5TSCAiTkFNRSIKK2lzb2h5YnJpZCBcKGVtIFBvc3QtcHJvY2VzcyBhbiBJU08gOTY2MCBpbWFnZSBmb3IgYm9vdGluZyBhcyBhIGhhcmQgZGlzay4KKy5TSCAiU1lOT1BTSVMiCisuQiBpc29oeWJyaWQKK1tcZkJPUFRJT05TXGZQXQorLkkgPGJvb3QuaXNvPgorLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhlIFxmQmlzb2h5YnJpZFxmUiB1dGlsaXR5IG1vZGlmaWVzIGFuIElTTyA5NjYwIGltYWdlIGdlbmVyYXRlZCB3aXRoCitta2lzb2ZzLCBnZW5pc29pbWFnZSwgb3IgY29tcGF0aWJsZSB1dGlsaXRpZXMsIHRvIGJlIGJvb3RhYmxlIGFzIGEgQ0QtUk9NIG9yCithcyBhIGhhcmQgZGlzay4KKy5TSCAiT1BUSU9OUyIKKy5UUAorXGZCLWhcZlIgXGZJPFg+XGZSXGZOCisuYnIKK051bWJlciBvZiBnZW9tZXRyeSBoZWFkcyAoZGVmYXVsdCA2NCkKKy5UUAorXGZCLXNcZlIgXGZJPFg+XGZSCisuYnIKK051bWJlciBvZiBnZW9tZXRyeSBzZWN0b3JzIChkZWZhdWx0IDMyKQorLlRQCitcZkItZVxmUiBcZkk8WD5cZlIsIFxmQi0tZW50cnlcZlIgXGZJPFg+XGZSCitTcGVjaWZ5IHBhcml0aXRvbiBlbnRyeSBudW1iZXIgKDEtNCkKKy5UUAorXGZCLW9cZlIgXGZJPFg+XGZSLCBcZkItLW9mZnNldFxmUiBcZkk8WD5cZlIKKy5icgorU3BlY2lmeSBwYXJ0aXRpb24gb2Zmc2V0IChkZWZhdWx0IDApCisuVFAKK1xmQi10XGZSIFxmSTxYPlxmUiwgXGZCLS10eXBlXGZSIFxmSTxYPlxmUgorLmJyCitTcGVjaWZ5IHBhcnRpdGlvbiB0eXBlIChkZWZhdWx0IDB4MTcpCisuVFAKK1xmQi1pXGZSIFxmSTxYPlxmUiwgXGZCLS1pZFxmUiBcZkk8WD5cZlIKKy5icgorU3BlY2lmeSBNQlIgSUQgKGRlZmF1bHQgcmFuZG9tKQorLlRQCitcZkItdVxmUiwgXGZCLS11ZWZpXGZCCitCdWlsZCBFRkkgYm9vdGFibGUgaW1hZ2UKKy5UUAorXGZCLW1cZlIsIFxmQi0tbWFjXGZCCitBZGQgQXBwbGUgRmlsZSBQcm90b2NvbCBwYXJ0aXRpb24gdGFibGUgc3VwcG9ydAorLlRQCitcZkItLWZvcmNlaGQwXGZSCitBc3N1bWUgd2UgYXJlIGxhb2RlZCBhcyBkaXNrIElEIDAKKy5UUAorXGZCLS1jdHJsaGQwXGZSCitBc3N1bWUgZGlzayBJRCAwIGlmIHRoZSBDdHJsIGtleSBpcyBwcmVzc2VkCisuVFAKK1xmQi0tcGFydG9rXGZSCitBbGxvdyBib290aW5nIGZyb20gd2l0aGluIGEgcGFydGl0aW9uCisuVFAKK1xmQi0/XGZSLCBcZkItLWhlbHBcZlIKK0Rpc3BsYXkgaGVscAorLlRQCitcZkItdlxmUiwgXGZCLS12ZXJib3NlXGZSCitEaXNwbGF5IHZlcmJvc2Ugb3V0cHV0CisuVFAKK1xmQi1WXGZSLCBcZkItLXZlcnNpb25cZlIKK0Rpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbgorCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZkJta2lzb2ZzXGZSKDEpCmRpZmYgLS1naXQgYS9tYW4vbHNzMTZ0b3BwbS4xIGIvbWFuL2xzczE2dG9wcG0uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDQ0N2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL2xzczE2dG9wcG0uMQpAQCAtMCwwICsxLDI3IEBACisuVEggIkxTUzE2VE9QUE0iICIxIgorLlNIICJOQU1FIgorbHNzMTZ0b3BwbSBcKGVtIENvbnZlcnQgYW4gTFNTLTE2IGltYWdlIHRvIFBQTQorLlNIICJTWU5PUFNJUyIKKy5QUAorXGZCbHNzMTZ0b3BwbVxmUiBbXGZCLW1hcFxmUF0gIFs8IGZpbGUubHNzXSAgWz4gZmlsZS5wcG1dCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyBicmllZmx5IHRoZSBcZkJsc3MxNnRvcHBtXGZSICAgICAgIGNvbW1hbmQuCisKKy5QUAorVGhlIFxmQmxzczE2dG9wcG1cZlIgdXRpbGl0eSBjb252ZXJ0cyBhbiBMU1MtMTYgaW1hZ2UgdG8gYQorUFBNIGltYWdlLgorCisuU0ggIk9QVElPTlMiCisuUFAKK0Egc3VtbWFyeSBvZiBvcHRpb25zIGlzIGluY2x1ZGVkIGJlbG93LgorLklQICJcZkItbWFwXGZQIiAxMAorT3V0cHV0IHRoZSBjb2xvciBtYXAgdG8gc3RhbmRhcmQgZXJyb3IuCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZkJwcG10b2xzczE2XGZSKDEpCisKKy5TSCAiQVVUSE9SIgorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyBjb21waWxlZCBieSBkYW5uIGZyYXppZXIgPGRhbm5mQGRlYmlhbi5vcmc+IGZvcgordGhlIFxmQkRlYmlhbiBHTlUvTGludXhcZlAgc3lzdGVtIChidXQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4KZGlmZiAtLWdpdCBhL21hbi9tZW1kaXNrZmluZC4xIGIvbWFuL21lbWRpc2tmaW5kLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkNjc3YwotLS0gL2Rldi9udWxsCisrKyBiL21hbi9tZW1kaXNrZmluZC4xCkBAIC0wLDAgKzEsMTAgQEAKKy5USCBtZW1kaXNrZmluZCAxICIxNyBKYW4gMjAxNCIgIm1lbWRpc2tmaW5kIgorLlNIICJOQU1FIgorbWVtZGlza2ZpbmQgXChlbSBTaW1wbGUgdXRpbGl0eSB0byBmaW5kIGEgcmVzaWRlbnQgXGZCbWVtZGlza1xmUiBpbnN0YW5jZS4KKy5TSCAiU1lOT1BTSVMiCisuQiBtZW1kaXNrZmluZAorLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhlIFxmQm1lbWRpc2tmaW5kXGZSIHV0aWxpdHkgc2VhcmNoZXMgbWVtb3J5IGZvciBhIFxmQm1lbWRpc2tcZlIgaW5zdGFuY2UsCithbmQsIGlmIGZvdW5kLCBvdXRwdXRzIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZCB0byB1c2UgdGhlIFxmcGhyYW1cZlIgZHJpdmVyIGluCitMaW51eCB0byBtYXAgaXQuCmRpZmYgLS1naXQgYS9tYW4vcHBtdG9sc3MxNi4xIGIvbWFuL3BwbXRvbHNzMTYuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTRlOTRiCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL3BwbXRvbHNzMTYuMQpAQCAtMCwwICsxLDY0IEBACisuVEggIlBQTVRPTFNTMTYiICIxIgorLlNIICJOQU1FIgorcHBtdG9sc3MxNiBcKGVtIENvbnZlcnQgYSBQUE0gdG8gYW4gTFNTMTYgaW1hZ2UKKy5TSCAiU1lOT1BTSVMiCisuUFAKK1xmQnBwbXRvbHNzMTZcZlIgWyAgICAgICAgXGZCCSAgXGZJI3JyZ2diYlxmUj1cZklpXGZSIAlcZlAgICAgICAgIFwmLi4uXSAgWzwgaW5wdXQucHBtXSAgWz4gb3V0cHV0LnJsZV0KKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIGJyaWVmbHkgdGhlIFxmQnBwbXRvbHNzMTZcZlIgY29tbWFuZC4KKworLlBQCitUaGUgXGZCcHBtdG9sc3MxNlxmUiBwcm9ncmFtIGNvbnZlcnRzIGEgInJhdyIgUFBNIGZpbGUgd2l0aAorbWF4IDE2IGNvbG9ycyB0byBhIHNpbXBsZSBSTEUtYmFzZWQgZm9ybWF0OgorCisuUFAKK1xmQnNpbXBsZSBSTEUtYmFzZWQgZm9ybWF0XGZSCisuVFMKK3RhYigHKTsKK2wgbC4KK3VuaW50MzIgMHgxNDEzZjNkB21hZ2ljIChsaXR0bGVlbmRpYW4pCit1bmludDE2IHhzaXplB2xpdHRsZWVuZGlhbgordW5pbnQxNSB5c2l6ZQdsaXR0bGVlbmRpYW4KKzE2IHggdW5pbnQ4IHIsZyxiB2NvbG9yIG1hcAorLlRFCisuUFAKK0NvbG9yIG1hcCBpcyBpbiA2LWJpdCBmb3JtYXQgKGVhY2ggYnl0ZSBpcyAwLi42MykKKy5QUAorVGhlbiwgYSBzZXF1ZW5jZSBvZiBueWJibGVzOgorLlBQCitOICAgLi4uIGlmIE4gaXMgIT0gcHJldmlvdXMgcGl4ZWwsIG9uZSBwaXhlbCBvZiBjb2xvciBOLCBvdGhlcndpc2UKK3J1biBzZXF1ZW5jZSBmb2xsb3dzIC4uLgorCisuUFAKK00gICAuLi4gaWYgTSA+IDAgdGhlbiBydW4gbGVuZ3RoIGlzIE0rMSwgb3RoZXJ3aXNlIHJ1biBzZXF1ZW5jZSBpcworZW5jb2RlZCBpbiB0d28gbnliYmxlcywgbGl0dGxlZW5kaWFuLCArMTcKKworLlBQCitUaGUgbnliYmxlIHNlcXVlbmNlcyBhcmUgb24gYSBwZXItcm93IGJhc2lzLCBydW5zIG1heSBub3QgZXh0ZW5kIGFjcm9zcworcm93cyBhbmQgb2RkLW55YmJsZSByb3dzIGFyZSB6ZXJvLXBhZGRlZC4KKworLlBQCitBdCB0aGUgc3RhcnQgb2YgYSByb3csIHRoZSAicHJldmlvdXMgcGl4ZWwiIGlzIGFzc3VtZWQgdG8gYmUgemVyby4KKworLlNIICJPUFRJT05TIgorLlBQCitBIHN1bW1hcnkgb2Ygb3B0aW9ucyBpcyBpbmNsdWRlZCBiZWxvdy4KKy5JUCAiXGZCXGZJI3JyZ2diYlxmUj1cZklpXGZSXGZQIiAxMAorU3BlY2lmeSB0aGF0IHRoZSBjb2xvciAjcnJnZ2JiIChoZXgpIHNob3VsZCBiZSBhc3NpZ25lZCBpbmRleAoraSAoZGVjaW1hbCkuCisKKy5TSCAiQlVHIgorLlBQCitUaGlzIHByb2dyYW0gY2Fubm90IGhhbmRsZSBjb21tZW50cyBpbiB0aGUgaGVhZGVyLCBub3IgInBsYWluIiBwcG0KK2Zvcm1hdC4KKworLlNIICJTRUUgQUxTTyIKKy5QUAorXGZCcHBtdG9sc3MxNlxmUigxKQorCisuU0ggIkFVVEhPUiIKKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgY29tcGlsZWQgYnkgZGFubiBmcmF6aWVyIDxkYW5uZkBkZWJpYW4ub3JnPiBmb3IKK3RoZSBcZkJEZWJpYW4gR05VL0xpbnV4XGZQIHN5c3RlbSAoYnV0IG1heSBiZSB1c2VkIGJ5IG90aGVycykuICBNb3N0IG9mIHRoZSBjb250ZW50Cit3YXMgd3JpdHRlbiBieSBILiBQZXRlciBBbnZpbi4KZGlmZiAtLWdpdCBhL21hbi9zeXNsaW51eC4xIGIvbWFuL3N5c2xpbnV4LjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjYWY5NAotLS0gL2Rldi9udWxsCisrKyBiL21hbi9zeXNsaW51eC4xCkBAIC0wLDAgKzEsMzg3IEBACisuVEggU1lTTElOVVggMSAiMTkgSnVseSAyMDEwIiAiU1lTTElOVVgiCisuU0ggTkFNRQorc3lzbGludXggXC0gaW5zdGFsbCB0aGUgXHMtMVNZU0xJTlVYXHMrMSBib290bG9hZGVyIG9uIGEgRkFUIGZpbGVzeXN0ZW0KKy5TSCBTWU5PUFNJUworLkIgc3lzbGludXgKK1tcZkJPUFRJT05TXGZQXQorLkkgZGV2aWNlCisuU0ggREVTQ1JJUFRJT04KK1xmQlN5c2xpbnV4XGZQIGlzIGEgYm9vdCBsb2FkZXIgZm9yIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtIHdoaWNoCitvcGVyYXRlcyBvZmYgYW4gTVMtRE9TL1dpbmRvd3MgRkFUIGZpbGVzeXN0ZW0uIEl0IGlzIGludGVuZGVkIHRvCitzaW1wbGlmeSBmaXJzdC10aW1lIGluc3RhbGxhdGlvbiBvZiBMaW51eCwgYW5kIGZvciBjcmVhdGlvbiBvZiByZXNjdWUKK2FuZCBvdGhlciBzcGVjaWFsLXB1cnBvc2UgYm9vdCBkaXNrcy4KKy5QUAorSW4gb3JkZXIgdG8gY3JlYXRlIGEgYm9vdGFibGUgTGludXggZmxvcHB5IHVzaW5nIFxmQlN5c2xpbnV4XGZQLCBwcmVwYXJlIGEKK25vcm1hbCBNUy1ET1MgZm9ybWF0dGVkIGZsb3BweS4gQ29weSBvbmUgb3IgbW9yZSBMaW51eCBrZXJuZWwgZmlsZXMgdG8KK2l0LCB0aGVuIGV4ZWN1dGUgdGhlIGNvbW1hbmQ6CisuSVAKKy5CIHN5c2xpbnV4IFwtXC1pbnN0YWxsIC9kZXYvZmQwCisuUFAKK1RoaXMgd2lsbCBhbHRlciB0aGUgYm9vdCBzZWN0b3Igb24gdGhlIGRpc2sgYW5kIGNvcHkgYSBmaWxlIG5hbWVkCisuSSBsZGxpbnV4LnN5cworaW50byBpdHMgcm9vdCBkaXJlY3RvcnkuCisuUFAKK09uIGJvb3QgdGltZSwgYnkgZGVmYXVsdCwgdGhlIGtlcm5lbCB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBpbWFnZSBuYW1lZAorTElOVVggb24gdGhlIGJvb3QgZmxvcHB5LiAgVGhpcyBkZWZhdWx0IGNhbiBiZSBjaGFuZ2VkLCBzZWUgdGhlIHNlY3Rpb24KK29uIHRoZSBcZkJzeXNsaW51eFxmUCBjb25maWd1cmF0aW9uIGZpbGUuCisuUFAKK0lmIHRoZSBTaGlmdCBvciBBbHQga2V5cyBhcmUgaGVsZCBkb3duIGR1cmluZyBib290LCBvciB0aGUgQ2FwcyBvciBTY3JvbGwKK2xvY2tzIGFyZSBzZXQsIFxmQnN5c2xpbnV4XGZQIHdpbGwgZGlzcGxheSBhCisuQlIgbGlsbyAoOCkKKy1zdHlsZSAiYm9vdDoiIHByb21wdC4gVGhlIHVzZXIgY2FuIHRoZW4gdHlwZSBhIGtlcm5lbCBmaWxlIG5hbWUKK2ZvbGxvd2VkIGJ5IGFueSBrZXJuZWwgcGFyYW1ldGVycy4gVGhlIFxzLTFTWVNMSU5VWFxzKzEgYm9vdGxvYWRlcgorZG9lcyBub3QgbmVlZCB0byBrbm93IGFib3V0IHRoZSBrZXJuZWwgZmlsZSBpbiBhZHZhbmNlOyBhbGwgdGhhdCBpcworcmVxdWlyZWQgaXMgdGhhdCBpdCBpcyBhIGZpbGUgbG9jYXRlZCBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb24gdGhlCitkaXNrLgorLlBQCitcZkJTeXNsaW51eFxmUCBzdXBwb3J0cyB0aGUgbG9hZGluZyBvZiBpbml0aWFsIHJhbWRpc2tzIChpbml0cmQpIGFuZCB0aGUKK2J6SW1hZ2Uga2VybmVsIGZvcm1hdC4KKy5TSCBPUFRJT05TCisuVFAKK1xmQlwtaVxmUCwgXGZCXC1cLWluc3RhbGxcZlAKK0luc3RhbGwgXHMtMVNZU0xJTlVYXHMrMSBvbiBhIG5ldyBtZWRpdW0sIG92ZXJ3cml0aW5nIGFueSBwcmV2aW91c2x5CitpbnN0YWxsZWQgYm9vdGxvYWRlci4KKy5UUAorXGZCXC1VXGZQLCBcZkJcLVwtdXBkYXRlXGZQCitJbnN0YWxsIFxzLTFTWVNMSU5VWFxzKzEgb24gYSBuZXcgbWVkaXVtIGlmIGFuZCBvbmx5IGlmIGEgdmVyc2lvbiBvZgorXHMtMVNZU0xJTlVYXHMrMSBpcyBhbHJlYWR5IGluc3RhbGxlZC4KKy5UUAorXGZCXC1zXGZQLCBcZkJcLVwtc3R1cGlkXGZQCitJbnN0YWxsIGEgInNhZmUsIHNsb3cgYW5kIHN0dXBpZCIgdmVyc2lvbiBvZiBccy0xU1lTTElOVVhccysxLiBUaGlzIHZlcnNpb24gbWF5Cit3b3JrIG9uIHNvbWUgdmVyeSBidWdneSBCSU9TZXMgb24gd2hpY2ggXHMtMVNZU0xJTlVYXHMrMSB3b3VsZCBvdGhlcndpc2UgZmFpbC4KK0lmIHlvdSBmaW5kIGEgbWFjaGluZSBvbiB3aGljaCB0aGUgXC1zIG9wdGlvbiBpcyByZXF1aXJlZCB0byBtYWtlIGl0IGJvb3QKK3JlbGlhYmx5LCBwbGVhc2Ugc2VuZCBhcyBtdWNoIGluZm8gYWJvdXQgeW91ciBtYWNoaW5lIGFzIHlvdSBjYW4sIGFuZCBpbmNsdWRlCit0aGUgZmFpbHVyZSBtb2RlLgorLlRQCitcZkJcLWZcZlAsIFxmQlwtXC1mb3JjZVxmUAorRm9yY2UgaW5zdGFsbCBldmVuIGlmIGl0IGFwcGVhcnMgdW5zYWZlLgorLlRQCitcZkJcLXJcZlAsIFxmQlwtXC1yYWlkXGZCCitSQUlEIG1vZGUuICBJZiBib290IGZhaWxzLCB0ZWxsIHRoZSBCSU9TIHRvIGJvb3QgdGhlIG5leHQgZGV2aWNlIGluCit0aGUgYm9vdCBzZXF1ZW5jZSAodXN1YWxseSB0aGUgbmV4dCBoYXJkIGRpc2spIGluc3RlYWQgb2Ygc3RvcHBpbmcKK3dpdGggYW4gZXJyb3IgbWVzc2FnZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBSQUlELTEgYm9vdGluZy4KKy5UUAorXGZCXC1kXGZQLCBcZkJcLVwtZGlyZWN0b3J5XGZQIFxmSXN1YmRpcmVjdG9yeVxmUAorSW5zdGFsbCB0aGUgXHMtMVNZU0xJTlVYXHMrMSBjb250cm9sIGZpbGVzIGluIGEgc3ViZGlyZWN0b3J5IHdpdGggdGhlCitzcGVjaWZpZWQgbmFtZSAocmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IG9uIHRoZSBkZXZpY2UpLgorLlRQCitcZkJcLXRcZlAsIFxmQlwtXC1vZmZzZXRcZlAgXGZJb2Zmc2V0XGZQCitJbmRpY2F0ZXMgdGhhdCB0aGUgZmlsZXN5c3RlbSBpcyBhdCBhbiBvZmZzZXQgZnJvbSB0aGUgYmFzZSBvZiB0aGUKK2RldmljZSBvciBmaWxlLgorLlRQCitcZkJcLVwtb25jZVxmUCBcZkljb21tYW5kXGZQCitEZWNsYXJlIGEgYm9vdCBjb21tYW5kIHRvIGJlIHRyaWVkIG9uIHRoZSBmaXJzdCBib290IG9ubHkuCisuVFAKK1xmQlwtT1xmUCwgXGZCXC1cLWNsZWFyLW9uY2VcZlAKK0NsZWFyIHRoZSBib290LW9uY2UgY29tbWFuZC4KKy5UUAorXGZCXC1IXGZQLCBcZkJcLVwtaGVhZHNcZlAgXGZJaGVhZC1jb3VudFxmUAorT3ZlcnJpZGUgdGhlIGRldGVjdGVkIG51bWJlciBvZiBoZWFkcyBmb3IgdGhlIGdlb21ldHJ5LgorLlRQCitcZkJcLVNcZlAsIFxmQlwtXC1zZWN0b3JzXGZQIFxmSXNlY3Rvci1jb3VudFxmUAorT3ZlcnJpZGUgdGhlIGRldGVjdGVkIG51bWJlciBvZiBzZWN0b3JzIGZvciB0aGUgZ2VvbWV0cnkuCisuVFAKK1xmQlwtelxmUCwgXGZCXC1cLXppcGRyaXZlXGZQCitBc3N1bWUgemlwZHJpdmUgZ2VvbWV0cnkgKFxmSVwtXC1oZWFkcyA2NCBcLVwtc2VjdG9ycyAzMikuCisuU0ggRklMRVMKKy5TUyAiQ29uZmlndXJhdGlvbiBmaWxlIgorQWxsIHRoZSBjb25maWd1cmFibGUgZGVmYXVsdHMgaW4gXHMtMVNZU0xJTlVYXHMrMSBjYW4gYmUgY2hhbmdlZCBieSBwdXR0aW5nIGEKK2ZpbGUgY2FsbGVkCisuQiBzeXNsaW51eC5jZmcKK2luIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBvZiB0aGUgYm9vdCBkaXNrLiBUaGlzCitpcyBhIHRleHQgZmlsZSBpbiBlaXRoZXIgVU5JWCBvciBET1MgZm9ybWF0LCBjb250YWluaW5nIG9uZSBvciBtb3JlIG9mCit0aGUgZm9sbG93aW5nIGl0ZW1zIChjYXNlIGlzIGluc2Vuc2l0aXZlIGZvciBrZXl3b3JkcykuCisuUFAKK1RoaXMgbGlzdCBpcyBvdXQgb2YgZGF0ZS4KKy5QUAorSW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBibGFuayBsaW5lcyBhbmQgY29tbWVudCBsaW5lcyBiZWdpbm5pbmcKK3dpdGggYSBoYXNoIG1hcmsgKCMpIGFyZSBpZ25vcmVkLgorLlRQCitcZkJkZWZhdWx0XGZQIFxmSWtlcm5lbFxmUCBbIFxmSW9wdGlvbnMgLi4uXGZQIF0KK1NldHMgdGhlIGRlZmF1bHQgY29tbWFuZCBsaW5lLiBJZiBcZkJzeXNsaW51eFxmUCBib290cyBhdXRvbWF0aWNhbGx5LAoraXQgd2lsbCBhY3QganVzdCBhcyBpZiB0aGUgZW50cmllcyBhZnRlciAiZGVmYXVsdCIgaGFkIGJlZW4gdHlwZWQgaW4KK2F0IHRoZSAiYm9vdDoiIHByb21wdC4KKy5JUAorSWYgbm8gREVGQVVMVCBvciBVSSBzdGF0ZW1lbnQgaXMgZm91bmQsIG9yIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbWlzc2luZworZW50aXJlbHksIFxzLTFTWVNMSU5VWFxzKzEgZHJvcHMgdG8gdGhlIGJvb3Q6IHByb21wdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgKGlmCitOT0VTQ0FQRSBpcyBzZXQsIGl0IHN0b3BzIHdpdGggYSAiYm9vdCBmYWlsZWQiIG1lc3NhZ2U7IHRoaXMgaXMgYWxzbyB0aGUgY2FzZQorZm9yIFBYRUxJTlVYIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IGZvdW5kLikKKy5UUAorTk9URTogVW50aWwgXHMtMVNZU0xJTlVYXHMrMSAzLjg1LCBpZiBubyBjb25maWd1cmF0aW9uIGZpbGUgaXMgcHJlc2VudCwgb3Igbm8KKyJkZWZhdWx0IiBlbnRyeSBpcyBwcmVzZW50IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIHRoZSBkZWZhdWx0IGlzCisibGludXggYXV0byIuCisuVFAKK0V2ZW4gZWFybGllciB2ZXJzaW9ucyBvZiBccy0xU1lTTElOVVhccysxIHVzZWQgdG8gYXV0b21hdGljYWxseQorYXBwZW5kIHRoZSBzdHJpbmcgImF1dG8iIHRvIHdoYXRldmVyIHRoZSB1c2VyIHNwZWNpZmllZCB1c2luZwordGhlIERFRkFVTFQgY29tbWFuZC4gIEFzIG9mIHZlcnNpb24gMS41NCwgdGhpcyBpcyBubyBsb25nZXIKK3RydWUsIGFzIGl0IGNhdXNlZCBwcm9ibGVtcyB3aGVuIHVzaW5nIGEgc2hlbGwgYXMgYSBzdWJzdGl0dXRlCitmb3IgImluaXQuIiAgWW91IG1heSB3YW50IHRvIGluY2x1ZGUgdGhpcyBvcHRpb24gbWFudWFsbHkuCisuVFAKKy5CSSBhcHBlbmQgIiBvcHRpb25zIC4uLiIKK0FkZCBvbmUgb3IgbW9yZSBcZklvcHRpb25zXGZQIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBUaGVzZSBhcmUgYWRkZWQgYm90aAorZm9yIGF1dG9tYXRpYyBhbmQgbWFudWFsIGJvb3RzLiBUaGUgb3B0aW9ucyBhcmUgYWRkZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mCit0aGUga2VybmVsIGNvbW1hbmQgbGluZSwgdXN1YWxseSBwZXJtaXR0aW5nIGV4cGxpY2l0bHkgZW50ZXJlZCBrZXJuZWwgb3B0aW9ucwordG8gb3ZlcnJpZGUgdGhlbS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUKKy5CUiBsaWxvICg4KQorICJhcHBlbmQiIG9wdGlvbi4KKy5QUAorLm5mCisuQkkgbGFiZWxcICBsYWJlbAorLlJTIDIKKy5CSSBrZXJuZWxcICBpbWFnZQorLkJJIGFwcGVuZFwgIG9wdGlvbnNcIC4uLgorLlJFCisuZmkKKy5SUworSW5kaWNhdGVzIHRoYXQgaWYgXGZJbGFiZWxcZlAgaXMgZW50ZXJlZCBhcyB0aGUga2VybmVsIHRvIGJvb3QsIFxmQnN5c2xpbnV4XGZQIHNob3VsZAoraW5zdGVhZCBib290IFxmSWltYWdlXGZQLCBhbmQgdGhlIHNwZWNpZmllZCAiYXBwZW5kIiBvcHRpb25zIHNob3VsZCBiZSB1c2VkCitpbnN0ZWFkIG9mIHRoZSBvbmVzIHNwZWNpZmllZCBpbiB0aGUgZ2xvYmFsIHNlY3Rpb24gb2YgdGhlIGZpbGUgKGJlZm9yZSB0aGUKK2ZpcnN0ICJsYWJlbCIgY29tbWFuZC4pIFRoZSBkZWZhdWx0IGZvciBcZklpbWFnZVxmUCBpcyB0aGUgc2FtZSBhcyBcZklsYWJlbFxmUCwKK2FuZCBpZiBubyAiYXBwZW5kIiBpcyBnaXZlbiB0aGUgZGVmYXVsdCBpcyB0byB1c2UgdGhlIGdsb2JhbCBlbnRyeSAoaWYgYW55KS4KK1VzZSAiYXBwZW5kIC0iIHRvIHVzZSBubyBvcHRpb25zIGF0IGFsbC4gIFVwIHRvIDEyOCAibGFiZWwiIGVudHJpZXMgYXJlCitwZXJtaXR0ZWQuCisuSVAKK1RoZSAiaW1hZ2UiIGRvZXNuJ3QgaGF2ZSB0byBiZSBhIExpbnV4IGtlcm5lbDsgaXQgY2FuIGJlIGEgYm9vdCBzZWN0b3IgKHNlZSBiZWxvdy4pCisuUkUKKy5UUAorLkJJIGltcGxpY2l0XCAgZmxhZ192YWwKK0lmIFxmSWZsYWdfdmFsXGZQIGlzIDAsIGRvIG5vdCBsb2FkIGEga2VybmVsIGltYWdlIHVubGVzcyBpdCBoYXMgYmVlbgorZXhwbGljaXRseSBuYW1lZCBpbiBhICJsYWJlbCIgc3RhdGVtZW50LiAgVGhlIGRlZmF1bHQgaXMgMS4KKy5UUAorLkJJIHRpbWVvdXRcICB0aW1lb3V0CitJbmRpY2F0ZXMgaG93IGxvbmcgdG8gd2FpdCBhdCB0aGUgImJvb3Q6IiBwcm9tcHQgdW50aWwgYm9vdGluZyBhdXRvbWF0aWNhbGx5LCBpbgordW5pdHMgb2YgMS8xMCBzLiBUaGUgdGltZW91dCBpcyBjYW5jZWxsZWQgYXMgc29vbiBhcyB0aGUgdXNlciB0eXBlcyBhbnl0aGluZworb24gdGhlIGtleWJvYXJkLCB0aGUgYXNzdW1wdGlvbiBiZWluZyB0aGF0IHRoZSB1c2VyIHdpbGwgY29tcGxldGUgdGhlIGNvbW1hbmQKK2xpbmUgYWxyZWFkeSBiZWd1bi4gQSB0aW1lb3V0IG9mIHplcm8gd2lsbCBkaXNhYmxlIHRoZSB0aW1lb3V0IGNvbXBsZXRlbHksCit0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQuIFRoZSBtYXhpbXVtIHBvc3NpYmxlIHRpbWVvdXQgdmFsdWUgaXMgMzU5OTY7Citjb3JyZXNwb25kaW5nIHRvIGp1c3QgYmVsb3cgb25lIGhvdXIuCisuVFAKK1xmQnNlcmlhbFxmUCBcZklwb3J0XGZQIFsgXGZJYmF1ZHJhdGVcZlAgXQorRW5hYmxlcyBhIHNlcmlhbCBwb3J0IHRvIGFjdCBhcyB0aGUgY29uc29sZS4gInBvcnQiIGlzIGEgbnVtYmVyICgwID0gL2Rldi90dHlTMAorPSBDT00xLCBldGMuKTsgaWYgImJhdWRyYXRlIiBpcyBvbWl0dGVkLCB0aGUgYmF1ZCByYXRlIGRlZmF1bHRzIHRvIDk2MDAgYnBzLgorVGhlIHNlcmlhbCBwYXJhbWV0ZXJzIGFyZSBoYXJkY29kZWQgdG8gYmUgOCBiaXRzLCBubyBwYXJpdHksIDEgc3RvcCBiaXQuCisuSVAKK0ZvciB0aGlzIGRpcmVjdGl2ZSB0byBiZSBndWFyYW50ZWVkIHRvIHdvcmsgcHJvcGVybHksIGl0CitzaG91bGQgYmUgdGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorLlRQCisuQkkgZm9udFwgIGZpbGVuYW1lCitMb2FkIGEgZm9udCBpbiAucHNmIGZvcm1hdCBiZWZvcmUgZGlzcGxheWluZyBhbnkgb3V0cHV0IChleGNlcHQgdGhlIGNvcHlyaWdodAorbGluZSwgd2hpY2ggaXMgb3V0cHV0IGFzIGxkbGludXguc3lzIGl0c2VsZiBpcyBsb2FkZWQuKSBcZkJzeXNsaW51eFxmUCBvbmx5IGxvYWRzCit0aGUgZm9udCBvbnRvIHRoZSB2aWRlbyBjYXJkOyBpZiB0aGUgLnBzZiBmaWxlIGNvbnRhaW5zIGEgVW5pY29kZSB0YWJsZSBpdCBpcworaWdub3JlZC4gIFRoaXMgb25seSB3b3JrcyBvbiBFR0EgYW5kIFZHQSBjYXJkczsgaG9wZWZ1bGx5IGl0IHNob3VsZCBkbyBub3RoaW5nCitvbiBvdGhlcnMuCisuVFAKKy5CSSBrYmRtYXBcICBrZXltYXAKK0luc3RhbGwgYSBzaW1wbGUga2V5Ym9hcmQgbWFwLiBUaGUga2V5Ym9hcmQgcmVtYXBwZXIgdXNlZCBpcyBcZkl2ZXJ5XGZQCitzaW1wbGlzdGljIChpdCBzaW1wbHkgcmVtYXBzIHRoZSBrZXljb2RlcyByZWNlaXZlZCBmcm9tIHRoZSBCSU9TLCB3aGljaCBtZWFucwordGhhdCBvbmx5IHRoZSBrZXkgY29tYmluYXRpb25zIHJlbGV2YW50IGluIHRoZSBkZWZhdWx0IGxheW91dCBcLSB1c3VhbGx5IFUuUy4KK0VuZ2xpc2ggXC0gY2FuIGJlIG1hcHBlZCkgYnV0IHNob3VsZCBhdCBsZWFzdCBoZWxwIHBlb3BsZSB3aXRoIEFaRVJUWSBrZXlib2FyZAorbGF5b3V0IGFuZCB0aGUgbG9jYXRpb25zIG9mID0gYW5kICwgKHR3byBzcGVjaWFsIGNoYXJhY3RlcnMgdXNlZCBoZWF2aWx5IG9uIHRoZQorTGludXgga2VybmVsIGNvbW1hbmQgbGluZS4pCisuSVAKK1RoZSBpbmNsdWRlZCBwcm9ncmFtCisuQlIga2V5dGFiLWxpbG8ucGwgKDgpCitmcm9tIHRoZQorLkJSIGxpbG8gKDgpCisgZGlzdHJpYnV0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBzdWNoIGtleW1hcHMuCisuVFAKKy5CSSBkaXNwbGF5XCAgZmlsZW5hbWUKK0Rpc3BsYXlzIHRoZSBpbmRpY2F0ZWQgZmlsZSBvbiB0aGUgc2NyZWVuIGF0IGJvb3QgdGltZSAoYmVmb3JlIHRoZSBib290OgorcHJvbXB0LCBpZiBkaXNwbGF5ZWQpLiBQbGVhc2Ugc2VlIHRoZSBzZWN0aW9uIGJlbG93IG9uIERJU1BMQVkgZmlsZXMuIElmIHRoZQorZmlsZSBpcyBtaXNzaW5nLCB0aGlzIG9wdGlvbiBpcyBzaW1wbHkgaWdub3JlZC4KKy5UUAorLkJJIHByb21wdFwgIGZsYWdfdmFsCitJZiBcZklmbGFnX3ZhbFxmUCBpcyAwLCBkaXNwbGF5IHRoZSAiYm9vdDoiIHByb21wdCBvbmx5IGlmIHRoZSBTaGlmdCBvciBBbHQga2V5CitpcyBwcmVzc2VkLCBvciBDYXBzIExvY2sgb3IgU2Nyb2xsIGxvY2sgaXMgc2V0ICh0aGlzIGlzIHRoZSBkZWZhdWx0KS4gIElmCitcZklmbGFnX3ZhbFxmUCBpcyAxLCBhbHdheXMgZGlzcGxheSB0aGUgImJvb3Q6IiBwcm9tcHQuCisuUFAKKy5uZgorLkJJIGYxXCAgZmlsZW5hbWUKKy5CSSBmMlwgIGZpbGVuYW1lCisuSSAuLi4KKy5CSSBmOVwgIGZpbGVuYW1lCisuQkkgZjEwXCAgZmlsZW5hbWUKKy5CSSBmMTFcICBmaWxlbmFtZQorLkJJIGYxMlwgIGZpbGVuYW1lCisuZmkKKy5SUworRGlzcGxheXMgdGhlIGluZGljYXRlZCBmaWxlIG9uIHRoZSBzY3JlZW4gd2hlbiBhIGZ1bmN0aW9uIGtleSBpcyBwcmVzc2VkIGF0IHRoZQorImJvb3Q6IiBwcm9tcHQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHByZS1ib290IG9ubGluZSBoZWxwIChwcmVzdW1hYmx5Citmb3IgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9ucy4pCisuUkUKKy5JUAorV2hlbiB1c2luZyB0aGUgc2VyaWFsIGNvbnNvbGUsIHByZXNzIFxmSTxDdHJsLUY+PGRpZ2l0PlxmUCB0byBnZXQgdG8KK3RoZSBoZWxwIHNjcmVlbnMsIGUuZy4gXGZJPEN0cmwtRj4yXGZQIHRvIGdldCB0byB0aGUgZjIgc2NyZWVuLiAgRm9yCitmMTAtZjEyLCBoaXQgXGZJPEN0cmwtRj5BXGZQLCBcZkk8Q3RybC1GPkJcZlAsIFxmSTxDdHJsLUY+Q1xmUC4gIEZvcgorY29tcGF0aWJsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucywgZjEwIGNhbiBhbHNvIGJlIGVudGVyZWQgYXMKK1xmSTxDdHJsLUY+MFxmUC4KKy5TUyAiRGlzcGxheSBmaWxlIGZvcm1hdCIKK0RJU1BMQVkgYW5kIGZ1bmN0aW9uLWtleSBoZWxwIGZpbGVzIGFyZSB0ZXh0IGZpbGVzIGluIGVpdGhlciBET1Mgb3IgVU5JWAorZm9ybWF0ICh3aXRoIG9yIHdpdGhvdXQgXGZJPENSPlxmUCkuIEluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIHNwZWNpYWwgY29kZXMKK2FyZSBpbnRlcnByZXRlZDoKKy5UUAorXGZJPEZGPlxmUCA9IFxmSTxDdHJsLUw+XGZQID0gQVNDSUkgMTIKK0NsZWFyIHRoZSBzY3JlZW4sIGhvbWUgdGhlIGN1cnNvci4gIE5vdGUgdGhhdCB0aGUgc2NyZWVuIGlzCitmaWxsZWQgd2l0aCB0aGUgY3VycmVudCBkaXNwbGF5IGNvbG9yLgorLlRQCitcZkk8U0k+PGJnPjxmZz5cZlAsIFxmSTxTST5cZlAgPSBcZkk8Q3RybC1PPlxmUCA9IEFTQ0lJIDE1CitTZXQgdGhlIGRpc3BsYXkgY29sb3JzIHRvIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZCBjb2xvcnMsIHdoZXJlCitcZkk8Ymc+XGZQIGFuZCBcZkk8Zmc+XGZQIGFyZSBoZXggZGlnaXRzLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFuZGFyZCBQQworZGlzcGxheSBhdHRyaWJ1dGVzOgorLklQCisubmYKKy50YSBcdyc1ID0gZGFyayBwdXJwbGUgICAgJ3UKKzAgPSBibGFjawk4ID0gZGFyayBncmV5CisxID0gZGFyayBibHVlCTkgPSBicmlnaHQgYmx1ZQorMiA9IGRhcmsgZ3JlZW4JYSA9IGJyaWdodCBncmVlbgorMyA9IGRhcmsgY3lhbgliID0gYnJpZ2h0IGN5YW4KKzQgPSBkYXJrIHJlZAljID0gYnJpZ2h0IHJlZAorNSA9IGRhcmsgcHVycGxlCWQgPSBicmlnaHQgcHVycGxlCis2ID0gYnJvd24JZSA9IHllbGxvdworNyA9IGxpZ2h0IGdyZXkJZiA9IHdoaXRlCisuZmkKKy5JUAorUGlja2luZyBhIGJyaWdodCBjb2xvciAoOC1mKSBmb3IgdGhlIGJhY2tncm91bmQgcmVzdWx0cyBpbiB0aGUKK2NvcnJlc3BvbmRpbmcgZGFyayBjb2xvciAoMC03KSwgd2l0aCB0aGUgZm9yZWdyb3VuZCBmbGFzaGluZy4KKy5JUAorY29sb3JzIGFyZSBub3QgdmlzaWJsZSBvdmVyIHRoZSBzZXJpYWwgY29uc29sZS4KKy5UUAorXGZJPENBTj5cZlBmaWxlbmFtZVxmSTxuZXdsaW5lPlxmUCwgXGZJPENBTj5cZlAgPSBcZkk8Q3RybC1YPlxmUCA9IEFTQ0lJIDI0CitJZiBhIFZHQSBkaXNwbGF5IGlzIHByZXNlbnQsIGVudGVyIGdyYXBoaWNzIG1vZGUgYW5kIGRpc3BsYXkKK3RoZSBncmFwaGljIGluY2x1ZGVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoZSBmaWxlIGZvcm1hdAoraXMgYW4gYWQgaG9jIGZvcm1hdCBjYWxsZWQgTFNTMTY7IHRoZSBpbmNsdWRlZCBQZXJsIHByb2dyYW0KKyJwcG10b2xzczE2IiBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIHRoZXNlIGltYWdlcy4gIFRoaXMgUGVybAorcHJvZ3JhbSBhbHNvIGluY2x1ZGVzIHRoZSBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uLgorLklQCitUaGUgaW1hZ2UgaXMgZGlzcGxheWVkIGluIDY0MHg0ODAgMTYtY29sb3IgbW9kZS4gIE9uY2UgaW4KK2dyYXBoaWNzIG1vZGUsIHRoZSBkaXNwbGF5IGF0dHJpYnV0ZXMgKHNldCBieSBcZkk8U0k+XGZQIGNvZGUKK3NlcXVlbmNlcykgd29yayBzbGlnaHRseSBkaWZmZXJlbnRseTogdGhlIGJhY2tncm91bmQgY29sb3IgaXMKK2lnbm9yZWQsIGFuZCB0aGUgZm9yZWdyb3VuZCBjb2xvcnMgYXJlIHRoZSAxNiBjb2xvcnMgc3BlY2lmaWVkCitpbiB0aGUgaW1hZ2UgZmlsZS4gIEZvciB0aGF0IHJlYXNvbiwgcHBtdG9sc3MxNiBhbGxvd3MgeW91IHRvCitzcGVjaWZ5IHRoYXQgY2VydGFpbiBjb2xvcnMgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHNwZWNpZmljCitjb2xvciBpbmRpY2llcy4KKy5JUAorQ29sb3IgaW5kaWNpZXMgMCBhbmQgNywgaW4gcGFydGljdWxhciwgc2hvdWxkIGJlIGNob3NlbiB3aXRoCitjYXJlOiAwIGlzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQgNyBpcyB0aGUgY29sb3IgdXNlZCBmb3IKK3RoZSB0ZXh0IHByaW50ZWQgYnkgXHMtMVNZU0xJTlVYXHMrMSBpdHNlbGYuCisuVFAKK1xmSTxFTT5cZlAsIFxmSTxFTT5cZlAgPSBcZkk8Q3RybC1VPlxmUCA9IEFTQ0lJIDI1CitJZiB3ZSBhcmUgY3VycmVudGx5IGluIGdyYXBoaWNzIG1vZGUsIHJldHVybiB0byB0ZXh0IG1vZGUuCisuVFAKK1xmSTxETEU+XGZQLi5cZkk8RVRCPlxmQiwgXGZJPEN0cmwtUD5cZlAuLlxmSTxDdHJsLVc+XGZQID0gQVNDSUkgMTYtMjMKK1RoZXNlIGNvZGVzIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGljaCBtb2RlcyB0byBwcmludCBhCitjZXJ0YWluIHBhcnQgb2YgdGhlIG1lc3NhZ2UgZmlsZSBpbi4gIEVhY2ggb2YgdGhlc2UgY29udHJvbAorY2hhcmFjdGVycyBzZWxlY3QgYSBzcGVjaWZpYyBzZXQgb2YgbW9kZXMgKHRleHQgc2NyZWVuLAorZ3JhcGhpY3Mgc2NyZWVuLCBzZXJpYWwgcG9ydCkgZm9yIHdoaWNoIHRoZSBvdXRwdXQgaXMgYWN0dWFsbHkKK2Rpc3BsYXllZDoKKy5JUAorLm5mCitDaGFyYWN0ZXIgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgR3JhcGggICBTZXJpYWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPERMRT4gPSA8Q3RybC1QPiA9IEFTQ0lJIDE2ICAgICBObyAgICAgIE5vICAgICAgTm8KKzxEQzE+ID0gPEN0cmwtUT4gPSBBU0NJSSAxNyAgICAgWWVzICAgICBObyAgICAgIE5vCis8REMyPiA9IDxDdHJsLVI+ID0gQVNDSUkgMTggICAgIE5vICAgICAgWWVzICAgICBObworPERDMz4gPSA8Q3RybC1TPiA9IEFTQ0lJIDE5ICAgICBZZXMgICAgIFllcyAgICAgTm8KKzxEQzQ+ID0gPEN0cmwtVD4gPSBBU0NJSSAyMCAgICAgTm8gICAgICBObyAgICAgIFllcworPE5BSz4gPSA8Q3RybC1VPiA9IEFTQ0lJIDIxICAgICBZZXMgICAgIE5vICAgICAgWWVzCis8U1lOPiA9IDxDdHJsLVY+ID0gQVNDSUkgMjIgICAgIE5vICAgICAgWWVzICAgICBZZXMKKzxFVEI+ID0gPEN0cmwtVz4gPSBBU0NJSSAyMyAgICAgWWVzICAgICBZZXMgICAgIFllcworLmZpCisuSVAKK0ZvciBleGFtcGxlOgorLm5mCis8REMxPlRleHQgbW9kZTxEQzI+R3JhcGhpY3MgbW9kZTxEQzQ+U2VyaWFsIHBvcnQ8RVRCPgorLmZpCisgLi4uIHdpbGwgYWN0dWFsbHkgcHJpbnQgb3V0IHdoaWNoIG1vZGUgdGhlIGNvbnNvbGUgaXMgaW4hCisuVFAKK1xmSTxTVUI+XGZQID0gXGZJPEN0cmwtWj5cZlAgPSBBU0NJSSAyNgorRW5kIG9mIGZpbGUgKERPUyBjb252ZW50aW9uKS4KKy5TUyBPdGhlciBvcGVyYXRpbmcgc3lzdGVtcworVGhpcyB2ZXJzaW9uIG9mIFxmQnN5c2xpbnV4XGZQIHN1cHBvcnRzIGNoYWluIGxvYWRpbmcgb2Ygb3RoZXIgb3BlcmF0aW5nCitzeXN0ZW1zIChzdWNoIGFzIE1TLURPUyBhbmQgaXRzIGRlcml2YXRpdmVzLCBpbmNsdWRpbmcgV2luZG93cyA5NS85OCkuCisuUFAKK0NoYWluIGxvYWRpbmcgcmVxdWlyZXMgdGhlIGJvb3Qgc2VjdG9yIG9mIHRoZSBmb3JlaWduIG9wZXJhdGluZyBzeXN0ZW0KK3RvIGJlIHN0b3JlZCBpbiBhIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBmaWxlc3lzdGVtLgorQmVjYXVzZSBuZWl0aGVyIExpbnV4IGtlcm5lbHMsIG5vciBib290IHNlY3RvciBpbWFnZXMgaGF2ZSByZWxpYWJsZSBtYWdpYworbnVtYmVycywgXGZCc3lzbGludXhcZlAgd2lsbCBsb29rIGF0IHRoZSBmaWxlCitleHRlbnNpb24uIFRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyBhcmUgcmVjb2duaXNlZDoKKy5QUAorLm5mCisudGEgXHcnbm9uZSBvciBvdGhlciAgICAndQorbm9uZSBvciBvdGhlcglMaW51eCBrZXJuZWwgaW1hZ2UKK0JTUwlCb290IHNlY3RvciAoRE9TIHN1cGVyYmxvY2sgd2lsbCBiZSBwYXRjaGVkIGluKQorQlMJQm9vdCBzZWN0b3IKKy5maQorLlBQCitGb3IgZmlsZW5hbWVzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIFxmQnN5c2xpbnV4XGZQIHdpbGwgc2VhcmNoIGZvciB0aGUKK2ZpbGUgYnkgYWRkaW5nIGV4dGVuc2lvbnMgaW4gdGhlIG9yZGVyIGxpc3RlZCBhYm92ZSBpZiB0aGUgcGxhaW4KK2ZpbGVuYW1lIGlzIG5vdCBmb3VuZC4gRmlsZW5hbWVzIGluIEtFUk5FTCBzdGF0ZW1lbnRzIG11c3QgYmUgZnVsbHkKK3F1YWxpZmllZC4KKy5QUAorLlNTIE5vdmljZSBwcm90ZWN0aW9uCitcZkJTeXNsaW51eFxmUCB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IGlmIHRoZSB1c2VyIGlzIHRyeWluZyB0byBib290IG9uIGEgMjg2CitvciBsb3dlciBjbGFzcyBtYWNoaW5lLCBvciBhIG1hY2hpbmUgd2l0aCBsZXNzIHRoYW4gNjA4SyBvZiBsb3cgKCJET1MiKQorUkFNICh3aGljaCBtZWFucyB0aGUgTGludXggYm9vdCBzZXF1ZW5jZSBjYW5ub3QgY29tcGxldGUpLiAgSWYgc28sIGEKK21lc3NhZ2UgaXMgZGlzcGxheWVkIGFuZCB0aGUgYm9vdCBzZXF1ZW5jZSBhYm9ydGVkLiAgSG9sZGluZyBkb3duIHRoZQorQ3RybCBrZXkgd2hpbGUgYm9vdGluZyBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuCisuUFAKK1RoZSBjb21waWxlIHRpbWUgYW5kIGRhdGUgb2YgYSBzcGVjaWZpYyBcZkJzeXNsaW51eFxmUCB2ZXJzaW9uIGNhbiBiZSBvYnRhaW5lZAorYnkgdGhlIERPUyBjb21tYW5kICJ0eXBlIGxkbGludXguc3lzIi4gVGhpcyBpcyBhbHNvIHVzZWQgYXMgdGhlCitzaWduYXR1cmUgZm9yIHRoZSBMRExJTlVYLlNZUyBmaWxlLCB3aGljaCBtdXN0IG1hdGNoIHRoZSBib290IHNlY3RvcgorLlBQCitBbnkgZmlsZSB0aGF0IFxmQnN5c2xpbnV4XGZQIHVzZXMgY2FuIGJlIG1hcmtlZCBoaWRkZW4sIHN5c3RlbSBvciByZWFkb25seSBpZgorc28gaXMgY29udmVuaWVudDsgXGZCc3lzbGludXhcZlAgaWdub3JlcyBhbGwgZmlsZSBhdHRyaWJ1dGVzLiAgVGhlIFxzLTFTWVNMSU5VWFxzKzEKK2luc3RhbGxlZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBvbiBMRExJTlVYLlNZUy4KKy5TUyBCb290YWJsZSBDRC1ST01zCitccy0xU1lTTElOVVhccysxIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBib290ZGlzayBpbWFnZXMgZm9yIEVsCitUb3JpdG8tY29tcGF0aWJsZSBib290YWJsZSBDRC1ST01zLiBIb3dldmVyLCBpdCBhcHBlYXJzIHRoYXQgbWFueQorQklPU2VzIGFyZSB2ZXJ5IGJ1Z2d5IHdoZW4gaXQgY29tZXMgdG8gYm9vdGluZyBDRC1ST01zLiBTb21lIHVzZXJzCitoYXZlIHJlcG9ydGVkIHRoYXQgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgaGVscGZ1bCBpbiBtYWtpbmcgYSBDRC1ST00KK3RoYXQgaXMgYm9vdGFibGUgb24gdGhlIGxhcmdlc3QgcG9zc2libGUgbnVtYmVyIG9mIG1hY2hpbmVzOgorLklQIFwoYnUKK1VzZSB0aGUgLXMgKHNhZmUsIHNsb3cgYW5kIHN0dXBpZCkgb3B0aW9uIHRvIFxzLTFTWVNMSU5VWFxzKzEKKy5JUCBcKGJ1CitQdXQgdGhlIGJvb3QgaW1hZ2UgYXMgY2xvc2UgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKK0lTTyA5NjYwIGZpbGVzeXN0ZW0gYXMgcG9zc2libGUuCisuUFAKK0EgQ0QtUk9NIGlzIHNvIG11Y2ggZmFzdGVyIHRoYW4gYSBmbG9wcHkgdGhhdCB0aGUgLXMgb3B0aW9uIHNob3VsZG4ndAorbWF0dGVyIGZyb20gYSBzcGVlZCBwZXJzcGVjdGl2ZS4KKy5QUAorT2YgY291cnNlLCB5b3UgcHJvYmFibHkgd2FudCB0byB1c2UgSVNPTElOVVggaW5zdGVhZC4gIFNlZSB0aGUKK2RvY3VtZW50YXRpb24gZmlsZQorLkJSIGlzb2xpbnV4LmRvYyAuCisuU1MgQm9vdGluZyBmcm9tIGEgRkFUIHBhcnRpdGlvbiBvbiBhIGhhcmQgZGlzaworXHMtMVNZU0xJTlVYXHMrMSBjYW4gYm9vdCBmcm9tIGEgRkFUIGZpbGVzeXN0ZW0gcGFydGl0aW9uIG9uIGEgaGFyZAorZGlzayAoaW5jbHVkaW5nIEZBVDMyKS4gVGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgaXMgaWRlbnRpY2FsIHRvIHRoZQorcHJvY2VkdXJlIGZvciBpbnN0YWxsaW5nIGl0IG9uIGEgZmxvcHB5LCBhbmQgc2hvdWxkIHdvcmsgdW5kZXIgZWl0aGVyCitET1Mgb3IgTGludXguIFRvIGJvb3QgZnJvbSBhIHBhcnRpdGlvbiwgXHMtMVNZU0xJTlVYXHMrMSBuZWVkcyB0byBiZQorbGF1bmNoZWQgZnJvbSBhIE1hc3RlciBCb290IFJlY29yZCBvciBhbm90aGVyIGJvb3QgbG9hZGVyLCBqdXN0IGxpa2UKK0RPUyBpdHNlbGYgd291bGQuIEEgc2FtcGxlIG1hc3RlciBib290IHNlY3RvciAoXGZCbWJyLmJpblxmUCkgaXMKK2luY2x1ZGVkIHdpdGggXHMtMVNZU0xJTlVYXHMrMS4KKy5TSCBCVUdTCitJIHdvdWxkIGFwcHJlY2lhdGUgaGVhcmluZyBvZiBhbnkgcHJvYmxlbXMgeW91IGhhdmUgd2l0aCBccy0xU1lTTElOVVhccysxLiAgSQord291bGQgYWxzbyBsaWtlIHRvIGhlYXIgZnJvbSB5b3UgaWYgeW91IGhhdmUgc3VjY2Vzc2Z1bGx5IHVzZWQgXHMtMVNZU0xJTlVYXHMrMSwKK2VzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBpdCBmb3IgYSBkaXN0cmlidXRpb24uCisuUFAKK0lmIHlvdSBhcmUgcmVwb3J0aW5nIHByb2JsZW1zLCBwbGVhc2UgaW5jbHVkZSBhbGwgcG9zc2libGUgaW5mb3JtYXRpb24KK2Fib3V0IHlvdXIgc3lzdGVtIGFuZCB5b3VyIEJJT1M7IHRoZSB2YXN0IG1ham9yaXR5IG9mIGFsbCBwcm9ibGVtcworcmVwb3J0ZWQgdHVybiBvdXQgdG8gYmUgQklPUyBvciBoYXJkd2FyZSBidWdzLCBhbmQgSSBuZWVkIGFzIG11Y2gKK2luZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvIGRpYWdub3NlIHRoZSBwcm9ibGVtcy4KKy5QUAorVGhlcmUgaXMgYSBtYWlsaW5nIGxpc3QgZm9yIGRpc2N1c3Npb24gYW1vbmcgXHMtMVNZU0xJTlVYXHMrMSB1c2VycyBhbmQgZm9yCithbm5vdW5jZW1lbnRzIG9mIG5ldyBhbmQgdGVzdCB2ZXJzaW9ucy4gVG8gam9pbiwgc2VuZCBhIG1lc3NhZ2UgdG8KK21ham9yZG9tb0BsaW51eC5rZXJuZWwub3JnIHdpdGggdGhlIGxpbmU6CisuUFAKKy5CIHN1YnNjcmliZSBzeXNsaW51eAorLlBQCitpbiB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4gVGhlIHN1Ym1pc3Npb24gYWRkcmVzcyBpcyBzeXNsaW51eEBsaW51eC5rZXJuZWwub3JnLgorLlNIIFNFRSBBTFNPCisuQlIgbGlsbyAoOCksCisuQlIga2V5dGFiLWxpbG8ucGwgKDgpLAorLkJSIGZkaXNrICg4KSwKKy5CUiBta2ZzICg4KSwKKy5CUiBzdXBlcmZvcm1hdCAoMSkuCisuU0ggQVVUSE9SCitUaGlzIG1hbnVhbCBwYWdlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgXGZCc3lzbGludXhcZlAKK2RvY3VtZW50YXRpb24gYnkgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+LiBUaGUgY29udmVyc2lvbiB0byBhIG1hbnBhZ2UKK3dhcyBtYWRlIGJ5IEFydGh1ciBLb3JuIDxhcnRodXJAa29ybi5jaD4uCmRpZmYgLS1naXQgYS9tYW4vc3lzbGludXgyYW5zaS4xIGIvbWFuL3N5c2xpbnV4MmFuc2kuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNlMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL3N5c2xpbnV4MmFuc2kuMQpAQCAtMCwwICsxLDQxIEBACisuVEggU1lTTElOVVgyQU5TSSAxCisuU0ggTkFNRQorc3lzbGludXgyYW5zaSBcLSBjb252ZXJ0cyBhIHN5c2xpbnV4LWZvcm1hdCBzY3JlZW4gdG8gcGMtYW5zaQorLlNIIFNZTk9QU0lTCisuQiBzeXNsaW51eDJhbnNpCis8IGZpbGVuYW1lLmlucHV0ID4gZmlsZW5hbWUub3V0cHV0CisuU0ggREVTQ1JJUFRJT04KKy5JIFN5c2xpbnV4MmFuc2kKK2lzIGEgZmlsdGVyIHdoaWNoIGNvbnZlcnRzIGEgc2NyZWVuIGZvcm1hdHRlZCBmb3Igc3lzbGludXggdG8gb25lCitjb21wYXRpYmxlIHdpdGggUEMgQU5TSS4gIEl0IHdpbGwgb25seSByZWFkIGZyb20gc3RhbmRhcmQgaW4sIGFuZCBoYXMKK25vIGNvbW1hbmQgbGluZSBvcHRpb25zLgorLlNIIEJVR1MKK0hlbHAgYW5kIHZlcnNpb24gY29tbWFuZCBsaW5lIG9wdGlvbnMgd291bGQgYmUgdXNlZnVsLgorLlBQCitUaGUgYWJpbGl0eSB0byBwdXQgaW5wdXQgYW5kIG91dHB1dCBmaWxlbmFtZXMgb24gdGhlIGNvbW1hbmQgbGluZSBtaWdodAorYmUgZ29vZCBhcyB3ZWxsLgorLlNTIEJ1ZyByZXBvcnRzCitJIHdvdWxkIGFwcHJlY2lhdGUgaGVhcmluZyBvZiBhbnkgcHJvYmxlbXMgeW91IGhhdmUgd2l0aCBTWVNMSU5VWC4gIEkKK3dvdWxkIGFsc28gbGlrZSB0byBoZWFyIGZyb20geW91IGlmIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSB1c2VkIFNZU0xJTlVYLAorZXNwZWNpYWxseSBpZiB5b3UgYXJlIHVzaW5nIGl0IGZvciBhIGRpc3RyaWJ1dGlvbi4KKy5QUAorSWYgeW91IGFyZSByZXBvcnRpbmcgcHJvYmxlbXMsIHBsZWFzZSBpbmNsdWRlIGFsbCBwb3NzaWJsZSBpbmZvcm1hdGlvbgorYWJvdXQgeW91ciBzeXN0ZW0gYW5kIHlvdXIgQklPUzsgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWxsIHByb2JsZW1zCityZXBvcnRlZCB0dXJuIG91dCB0byBiZSBCSU9EIG9yIGhhcmR3YXJlIGJ1Z3MsIGFuZCBJIG5lZWQgYXMgbXVjaAoraW5mb3JtYXRpb24gYXMgcG9zc2libGUgaW4gb3JkZXIgdG8gZGlhZ25vc2UgdGhlIHByb2JsZW1zLgorLlBQCitUaGVyZSBpcyBhIG1haWxpbmcgbGlzdCBmb3IgZGlzY3Vzc2lvbiBhbW9uZyBTWVNMSU5VWCB1c2VycyBhbmQgZm9yCithbm5vdW5jZW1lbnRzIG9mIG5ldyBhbmQgdGVzdCB2ZXJzaW9ucy4gICBUbyBqb2luLCBzZW5kIGEgbWVzc2FnZSB0bworbWFqb3Jkb21vQGxpbnV4Lmtlcm5lbC5vcmcgd2l0aCB0aGUgbGluZToKKy5QUAorLkIgc3Vic2NyaWJlIHN5c2xpbnV4CisuUFAKK2luIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLiAgVGhlIHN1Ym1pc3Npb24gYWRkcmVzcyBpcworc3lzbGludXhAbGludXgua2VybmVsLm9yZy4KKy5TSCAiU0VFIEFMU08iCisuQlIgc3lzbGludXgoMSksCisuQlIgcGVybCgxKQorLlNIIEFVVEhPUgorVGhpcyBtYW51YWwgcGFnZSBpcyBhIHF1aWNrIHdyaXRlLXVwIGZvciBEZWJpYW4gZG9uZSBieSBLZXZpbiBLcmVhbWVyCis8a2tyZWFtZXJAZXRoZXJob2d6Lm9yZz4sIGJ5IGxvb2tpbmcgb3ZlciB0aGUgMSBzY3JlZW5mdWwgb2YgUGVybCB0aGF0IGlzCisuQiBzeXNsaW51eDJhbnNpLgpkaWZmIC0tZ2l0IGEvbWJyL01ha2VmaWxlIGIvbWJyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmJkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tYnIvTWFrZWZpbGUKQEAgLTAsMCArMSw1NyBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDA3LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIworIyBNYWtlZmlsZSBmb3IgTUJSCisjCisKK1ZQQVRIID0gJChTUkMpCisKK2luY2x1ZGUgJChNQUtFRElSKS9lbWJlZGRlZC5taworCithbGw6CW1ici5iaW4gICBhbHRtYnIuYmluICAgZ3B0bWJyLmJpbiAgIGlzb2hkcGZ4LmJpbiAgIGlzb2hkcHB4LmJpbiBcCisJbWJyX2MuYmluIGFsdG1icl9jLmJpbiBncHRtYnJfYy5iaW4gaXNvaGRwZnhfYy5iaW4gaXNvaGRwcHhfYy5iaW4gXAorCW1icl9mLmJpbiBhbHRtYnJfZi5iaW4gZ3B0bWJyX2YuYmluIGlzb2hkcGZ4X2YuYmluIGlzb2hkcHB4X2YuYmluCisKKyUubzogJS5TCisJJChDQykgJChNQUtFREVQUykgJChTRkxBR1MpIC1XYSwtYT0kKi5sc3QgLWMgLW8gJEAgJDwKKworJV9jLm86ICUuUworCSQoQ0MpICQoTUFLRURFUFMpICQoU0ZMQUdTKSAtV2EsLWE9JCpfYy5sc3QgLURDVFJMXzgwIC1jIC1vICRAICQ8CisKKyVfZi5vOiAlLlMKKwkkKENDKSAkKE1BS0VERVBTKSAkKFNGTEFHUykgLVdhLC1hPSQqX2YubHN0IC1ERk9SQ0VfODAgLWMgLW8gJEAgJDwKKworLlBSRUNJT1VTOiAlLmVsZgorIyUuZWxmOiAlLm8gbWJyLmxkCislLmVsZjogJS5vICQoU1JDKS8kKEFSQ0gpL21ici5sZAorCSQoTEQpICQoTERGTEFHUykgLVQgJChTUkMpLyQoQVJDSCkvbWJyLmxkIC1lIF9zdGFydCAtbyAkQCAkPAorCislLmJpbjogJS5lbGYgJChTUkMpL2NoZWNrc2l6ZS5wbAorCSQoT0JKQ09QWSkgLU8gYmluYXJ5ICQ8ICRACisJJChQRVJMKSAkKFNSQykvY2hlY2tzaXplLnBsICRACisJJChDSE1PRCkgLXggJEAKKworbWJyX2Jpbi5jOiBtYnIuYmluCisKK2luc3RhbGw6CisKK3RpZHkgZGlzdDoKKwlybSAtZiAqLm8gKi5lbGYgKi5sc3QgLiouZAorCitjbGVhbjogdGlkeQorCitzcG90bGVzczogY2xlYW4KKwlybSAtZiAqLmJpbgorCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS9tYnIvYWRqdXN0LmggYi9tYnIvYWRqdXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4NzE2ZQotLS0gL2Rldi9udWxsCisrKyBiL21ici9hZGp1c3QuaApAQCAtMCwwICsxLDU3IEBACisvKiAtKi0gYXNtIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYWRqdXN0LmgKKyAqCisgKiBNYWNyb3MgdG8gYWRqdXN0IHRoZSBkcml2ZSBudW1iZXIKKyAqLworCisjaWZuZGVmIEFESlVTVF9ICisjZGVmaW5lIEFESlVTVF9ICisKKyNpZmRlZiBDVFJMXzgwCisJLm1hY3JvIEFESlVTVF9EUklWRQorCXB1c2hhCisJbW92YgkkMHgwMiwgJWFoCisJaW50CSQweDE2CisJdGVzdGIJJDB4MDQsICVhbAorCXBvcGEKKwlqegkxZgorCW1vdmIJJDB4ODAsICVkbAorMToKKwkuZW5kbQorI2VsaWYgZGVmaW5lZChGT1JDRV84MCkKKwkubWFjcm8gQURKVVNUX0RSSVZFCisJbW92YgkkMHg4MCwgJWRsCisJLmVuZG0KKyNlbHNlCisJLm1hY3JvIEFESlVTVF9EUklWRQorCS5lbmRtCisjZW5kaWYKKworI2VuZGlmIC8qIEFESlVTVF9IICovCmRpZmYgLS1naXQgYS9tYnIvYWx0bWJyLlMgYi9tYnIvYWx0bWJyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2YjRkZAotLS0gL2Rldi9udWxsCisrKyBiL21ici9hbHRtYnIuUwpAQCAtMCwwICsxLDMwNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAyMDA3LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJhZGp1c3QuaCIKKworCS5jb2RlMTYKKwkudGV4dAorCisJLmdsb2JsCWJvb3RzZWMKK3N0YWNrCQk9IDB4N2MwMAorZHJpdmVubwkJPSAoc3RhY2stNikKK3NlY3RvcnMJCT0gKHN0YWNrLTgpCitzZWNwZXJjeWwJPSAoc3RhY2stMTIpCisKK0JJT1Nfa2JkZmxhZ3MJPSAweDQxNworQklPU19wYWdlCT0gMHg0NjIKKworCS8qIGdhcy9sZCBoYXMgaXNzdWVzIHdpdGggZG9pbmcgdGhpcyBhcyBhYnNvbHV0ZSBhZGRyZXNzZXMuLi4gKi8KKwkuc2VjdGlvbiAiLmJvb3RzZWMiLCAiYSIsIEBub2JpdHMKKwkuZ2xvYmwJYm9vdHNlYworYm9vdHNlYzoKKwkuc3BhY2UJNTEyCisKKwkudGV4dAorCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKwkuYnl0ZQkweDMzLCAweGMwCS8qIHhvcncJJWF4LCAlYXggKi8KKwljbGkKKwltb3Z3CSVheCwgJWRzCisJbW92dwklYXgsICVzcworCW1vdncJJHN0YWNrLCAlc3AKKwltb3Z3CSVzcCwgJXNpCisJcHVzaHcJJWVzCQkvKiBlczpkaSAtPiAkUG5QIGhlYWRlciAqLworCXB1c2h3CSVkaQorCW1vdncJJWF4LCAlZXMKKwlzdGkKKwljbGQKKworCS8qIENvcHkgZG93biB0byAwOjB4NjAwICovCisJbW92dwkkX3N0YXJ0LCAlZGkKKwltb3Z3CSQoNTEyLzIpLCAlY3gKKwlyZXA7IG1vdnN3CisKKwlsam1wdwkkMCwgJG5leHQKK25leHQ6CisKKwlBREpVU1RfRFJJVkUKKwlwdXNodwklZHgJCS8qIGRsIC0+IGRyaXZlIG51bWJlciAqLworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgRUJJT1MgKi8KKwlwdXNodwklZHgJCS8qIGRyaXZlIG51bWJlciAqLworCW1vdmIJJDB4NDEsICVhaAkvKiAlYWwgPT0gMCBhbHJlYWR5ICovCisJbW92dwkkMHg1NWFhLCAlYngKKwl4b3J3CSVjeCwgJWN4CisJeG9yYgklZGgsICVkaAorCXN0YworCWludAkkMHgxMworCWpjCTFmCisJY21wdwkkMHhhYTU1LCAlYngKKwlqbmUJMWYKKwlzaHJ3CSVjeAkJLyogQml0IDAgPSBmaXhlZCBkaXNrIHN1YnNldCAqLworCWpuYwkxZgorCisJLyogV2UgaGF2ZSBFQklPUzsgcGF0Y2ggaW4gdGhlIGZvbGxvd2luZyBjb2RlIGF0CisJICAgcmVhZF9zZWN0b3JfY2Jpb3M6IG1vdmIgJDB4NDIsICVhaCA7ICBqbXAgcmVhZF9jb21tb24gKi8KKwltb3ZsCSQweGViNDJiNCsoKHJlYWRfY29tbW9uLXJlYWRfc2VjdG9yX2NiaW9zLTQpIDw8IDI0KSwgXAorCQkocmVhZF9zZWN0b3JfY2Jpb3MpCisKKzE6CisJcG9wdwklZHgKKworCS8qIEdldCAoQylIUyBnZW9tZXRyeSAqLworCW1vdmIJJDB4MDgsICVhaAorCWludAkkMHgxMworCWFuZHcJJDB4M2YsICVjeAkvKiBTZWN0b3IgY291bnQgKi8KKwlwdXNodwklY3gJCS8qIFNhdmUgc2VjdG9ycyBvbiB0aGUgc3RhY2sgKi8KKwltb3Z6YncJJWRoLCAlYXgJLyogZGggPSBtYXggaGVhZCAqLworCWluY3cJJWF4CQkvKiBGcm9tIDAtYmFzZWQgbWF4IHRvIGNvdW50ICovCisJbXVsdwklY3gJCS8qIEhlYWRzKnNlY3RvcnMgLT4gc2VjdG9ycyBwZXIgY3lsaW5kZXIgKi8KKworCS8qIFNhdmUgc2VjdG9ycy9jeWxpbmRlciBvbiB0aGUgc3RhY2sgKi8KKwlwdXNodwklZHgJCS8qIEhpZ2ggd29yZCAqLworCXB1c2h3CSVheAkJLyogTG93IHdvcmQgKi8KKworCXhvcmwJJWVheCwgJWVheAkvKiBCYXNlICovCisJY2RxCQkJLyogUm9vdCAoJWVkeCA8LSAwKSAqLworCWNhbGwJc2Nhbl9wYXJ0aXRpb25fdGFibGUKKworCS8qIElmIHdlIGdldCBoZXJlLCB3ZSBoYXZlIG5vIE9TICovCittaXNzaW5nX29zOgorCWNhbGwJZXJyb3IKKwkuYXNjaWkJIk1pc3Npbmcgb3BlcmF0aW5nIHN5c3RlbS5cclxuIgorCisvKgorICogcmVhZF9zZWN0b3I6IHJlYWQgYSBzaW5nbGUgc2VjdG9yIHBvaW50ZWQgdG8gYnkgJWVheCB0byAweDdjMDAuCisgKiBDRiBpcyBzZXQgb24gZXJyb3IuICBBbGwgcmVnaXN0ZXJzIHNhdmVkLgorICovCityZWFkX3NlY3RvcjoKKwlwdXNoYWwKKwl4b3JsCSVlZHgsICVlZHgKKwltb3Z3CSRib290c2VjLCAlYngKKwlwdXNobAklZWR4CS8qIE1TVyBvZiBMQkEgKi8KKwlwdXNobAklZWF4CS8qIExTVyBvZiBMQkEgKi8KKwlwdXNodwklZXMJLyogQnVmZmVyIHNlZ21lbnQgKi8KKwlwdXNodwklYngJLyogQnVmZmVyIG9mZnNldCAqLworCXB1c2h3CSQxCS8qIFNlY3RvciBjb3VudCAqLworCXB1c2h3CSQxNgkvKiBTaXplIG9mIHBhY2tldCAqLworCW1vdncJJXNwLCAlc2kKKworCS8qIFRoaXMgY2h1bmsgaXMgc2tpcHBlZCBpZiB3ZSBoYXZlIGViaW9zICovCisJLyogRG8gbm90IGNsb2JiZXIgJWVheCBiZWZvcmUgdGhpcyBjaHVuayEgKi8KKwkvKiBUaGlzIGFsc28gcmVsaWVzIG9uICVieCBhbmQgJWVkeCBhcyBzZXQgdXAgYWJvdmUuICovCityZWFkX3NlY3Rvcl9jYmlvczoKKwlkaXZsCShzZWNwZXJjeWwpCisJc2hsYgkkNiwgJWFoCisJbW92YgklYWgsICVjbAorCW1vdmIJJWFsLCAlY2gKKwl4Y2hndwklZHgsICVheAorCWRpdmIJKHNlY3RvcnMpCisJbW92YgklYWwsICVkaAorCW9yYgklYWgsICVjbAorCWluY3cJJWN4CS8qIFNlY3RvcnMgYXJlIDEtYmFzZWQgKi8KKwltb3Z3CSQweDAyMDEsICVheAorCityZWFkX2NvbW1vbjoKKwltb3ZiCShkcml2ZW5vKSwgJWRsCisJaW50CSQweDEzCisJbGVhdwkxNiglc2kpLCAlc3AJLyogRHJvcCBEQVBBICovCisJcG9wYWwKKwlyZXQKKworLyoKKyAqIHJlYWRfcGFydGl0aW9uX3RhYmxlOgorICoJUmVhZCBhIHBhcnRpdGlvbiB0YWJsZSAocG9pbnRlZCB0byBieSAlZWF4KSwgYW5kIGNvcHkKKyAqCXRoZSBwYXJ0aXRpb24gdGFibGUgaW50byB0aGUgcHRhYiBidWZmZXIuCisgKgorICoJQ2xvYmJlcnMgJXNpLCAlZGksIGFuZCAlY3gsIG90aGVyIHJlZ2lzdGVycyBwcmVzZXJ2ZWQuCisgKgklY3ggPSAwIG9uIGV4aXQuCisgKgorICoJT24gZXJyb3IsIENGIGlzIHNldCBhbmQgcHRhYiBpcyBvdmVyd3JpdHRlbiB3aXRoIGp1bmsuCisgKi8KK3B0YWIJPSBfc3RhcnQrNDQ2CisKK3JlYWRfcGFydGl0aW9uX3RhYmxlOgorCWNhbGwJcmVhZF9zZWN0b3IKKwltb3Z3CSRib290c2VjKzQ0NiwgJXNpCisJbW92dwkkcHRhYiwgJWRpCisJbW92dwkkKDE2KjQvMiksICVjeAorCXJlcCA7IG1vdnN3CisJcmV0CisKKy8qCisgKiBzY2FuX3BhcnRpdGlvbl90YWJsZToKKyAqCVNjYW4gYSBwYXJ0aXRpb24gdGFibGUgY3VycmVudGx5IGxvYWRlZCBpbiB0aGUgcGFydGl0aW9uIHRhYmxlCisgKglhcmVhLiAgUHJlc2VydmUgYWxsIHJlZ2lzdGVycy4KKyAqCisgKiAgICAgIE9uIGVudHJ5OgorICoJICAlZWF4IC0gYmFzZSAobG9jYXRpb24gb2YgdGhpcyBwYXJ0aXRpb24gdGFibGUpCisgKgkgICVlZHggLSByb290IChvZmZzZXQgZnJvbSBNQlIsIG9yIDAgZm9yIE1CUikKKyAqCisgKiAgICAgIFRoZXNlIGdldCBwdXNoZWQgaW50byBzdGFjayBzbG90czoKKyAqICAgICAgICAyOCglYnApIC0gJWVheCAtIGJhc2UKKyAqCSAgMjAoJWJwKSAtICVlZHggLSByb290CisgKi8KKworc2Nhbl9wYXJ0aXRpb25fdGFibGU6CisJcHVzaGFsCisJbW92dwklc3AsICVicAorCisJLyogU2NhbiB0aGUgcHJpbWFyeSBwYXJ0aXRpb24gdGFibGUgKi8KKwltb3Z3CSRwdGFiLCAlc2kKKwltb3Z3CSQ0LCAlY3gKKwkvKiBJcyBpdCBhIHByaW1hcnkgcGFydGl0aW9uIHRhYmxlPyAqLworCWFuZGwJJWVkeCwgJWVkeAorCWpuegk3ZgorCXB1c2gJJXNpCisJcHVzaAklY3gKKworNToKKwlkZWNiCShwYXJ0aXRpb24pCisJanoJYm9vdAorCWFkZHcJJDE2LCAlc2kKKwlsb29wdwk1YgorCisJcG9wdwklY3gJCQkvKiAlY3ggPC0gNCAgICAqLworCXBvcHcJJXNpCQkJLyogJXNpIDwtIHB0YWIgKi8KKworCS8qIE5vIHByaW1hcnkgcGFydGl0aW9ucyBmb3VuZCwgbG9vayBmb3IgZXh0ZW5kZWQvbG9naWNhbCBwYXJ0aXRpb25zICovCis3OgorCW1vdmIJNCglc2kpLCAlYWwKKwlhbmRiCSVhbCwgJWFsCisJanoJMTJmCQkJLyogTm90IGEgdmFsaWQgcGFydGl0aW9uICovCisJY21wYgkkMHgwZiwgJWFsCQkvKiAweDBmID0gV2luOXggZXh0ZW5kZWQgKi8KKwlqZQk4ZgorCWFuZGIJJH4weDgwLCAlYWwJCS8qIDB4ODUgPSBMaW51eCBleHRlbmRlZCAqLworCWNtcGIJJDB4MDUsICVhbAkJLyogMHgwNSA9IE1TLURPUyBleHRlbmRlZCAqLworCWpuZQk5ZgorCisJLyogSXQgaXMgYW4gZXh0ZW5kZWQgcGFydGl0aW9uLiAgUmVhZCB0aGUgZXh0ZW5kZWQgcGFydGl0aW9uIGFuZAorCSAgIHRyeSB0byBzY2FuIGl0LiAgSWYgdGhlIHNjYW4gcmV0dXJucywgcmUtbG9hZCB0aGUgY3VycmVudAorCSAgIHBhcnRpdGlvbiB0YWJsZSBhbmQgcmVzdW1lIHNjYW4uICovCis4OgorCW1vdmwJOCglc2kpLCAlZWF4CQkvKiBQYXJ0aXRpb24gdGFibGUgb2Zmc2V0ICovCisJYWRkbAklZWR4LCAlZWF4CQkvKiBDb21wdXRlIGxvY2F0aW9uIG9mIG5ldyBwdGFiICovCisJYW5kbAklZWR4LCAlZWR4CQkvKiBJcyB0aGlzIHRoZSBNQlI/ICovCisJam56CTEwZgorCW1vdmwJJWVheCwgJWVkeAkJLyogT2Zmc2V0IC0+IHJvb3QgaWYgdGhpcyB3YXMgTUJSICovCisxMDoKKwljYWxsCXJlYWRfcGFydGl0aW9uX3RhYmxlCisJamMJMTFmCisJY2FsbAlzY2FuX3BhcnRpdGlvbl90YWJsZQorMTE6CisJLyogVGhpcyByZXR1cm5lZCwgc28gd2UgbmVlZCB0byByZWxvYWQgdGhlIGN1cnJlbnQgcGFydGl0aW9uIHRhYmxlICovCisJbW92bAkyOCglYnApLCAlZWF4CQkvKiAiQmFzZSIgKi8KKwljYWxsCXJlYWRfcGFydGl0aW9uX3RhYmxlCisKKwkvKiBmYWxsIHRocm91Z2ggKi8KKzk6CisJLyogTm90IGFuIGV4dGVuZGVkIHBhcnRpdGlvbiAqLworCWFuZGwJJWVkeCwgJWVkeAkJLyogQXJlIHdlIGluc2lkZSBhbiBleHRlbmRlZCBwYXJ0PyAqLworCWp6CTEyZgorCS8qIElmIHNvLCB0aGlzIGlzIGEgbG9naWNhbCBwYXJ0aXRpb24gKi8KKwlkZWNiCShwYXJ0aXRpb24pCisJamUJYm9vdAorMTI6CisJYWRkdwkkMTYsICVzaQorCWxvb3B3CTdiCisKKwkvKiBOb3RoaW5nIGZvdW5kLCByZXR1cm4gKi8KKwlwb3BhbAorCXJldAorCisvKgorICogYm9vdDogaW52b2tlIHRoZSBhY3R1YWwgYm9vdHN0cmFwLiAoJXNpKSBwb2ludHMgdG8gdGhlIHBhcnRpdGlvbgorICoJIHRhYmxlIGVudHJ5LCBhbmQgMjgoJWJwKSBoYXMgdGhlIHBhcnRpdGlvbiB0YWJsZSBiYXNlLgorICovCitib290OgorCWNtcGIJJDAsIDQoJXNpKQorCWplCW1pc3Npbmdfb3MKKwltb3ZsCTgoJXNpKSwgJWVheAorCWFkZGwJMjgoJWJwKSwgJWVheAorCW1vdmwJJWVheCwgOCglc2kpCS8qIEFkanVzdCBpbi1tZW1vcnkgcGFydGl0aW9uIHRhYmxlIGVudHJ5ICovCisJY2FsbAlyZWFkX3NlY3RvcgorCWpjCWRpc2tfZXJyb3IKKwljbXB3CSQweGFhNTUsIChib290c2VjKzUxMCkKKwlqbmUJbWlzc2luZ19vcwkJLyogTm90IGEgdmFsaWQgYm9vdCBzZWN0b3IgKi8KKwltb3Z3CSRkcml2ZW5vLCAlc3AJLyogZHJpdmVubyA9PSBib290c2VjLTYgKi8KKwlwb3B3CSVkeAkJLyogZGwgLT4gZHJpdmUgbnVtYmVyICovCisJcG9wdwklZGkJCS8qIGVzOmRpIC0+ICRQblAgdmVjdG9yICovCisJcG9wdwklZXMKKwljbGkKKwlqbXB3CSolc3AJCS8qICVzcCA9PSBib290c2VjICovCisKK2Rpc2tfZXJyb3I6CisJY2FsbAllcnJvcgorCS5hc2NpaQkiT3BlcmF0aW5nIHN5c3RlbSBsb2FkIGVycm9yLlxyXG4iCisKKy8qCisgKiBQcmludCBlcnJvciBtZXNzYWdlcy4gIFRoaXMgaXMgaW52b2tlZCB3aXRoICJjYWxsIiwgd2l0aCB0aGUKKyAqIGVycm9yIG1lc3NhZ2UgYXQgdGhlIHJldHVybiBhZGRyZXNzLgorICovCitlcnJvcjoKKwlwb3B3CSVzaQorMjoKKwlsb2RzYgorCW1vdmIJJDB4MGUsICVhaAorCW1vdmIJKEJJT1NfcGFnZSksICViaAorCW1vdmIJJDB4MDcsICVibAorCWludAkkMHgxMAkJLyogTWF5IGRlc3Ryb3kgJWJwICovCisJY21wYgkkMTAsICVhbAkvKiBOZXdsaW5lPyAqLworCWpuZQkyYgorCisJaW50CSQweDE4CQkvKiBCb290IGZhaWx1cmUgKi8KK2RpZToKKwlobHQKKwlqbXAJZGllCisKKy8qIExvY2F0aW9uIG9mIHRoZSBwYXJ0aXRpb24gY29uZmlndXJhdGlvbiBieXRlICovCitwYXJ0aXRpb24gPSBfc3RhcnQgKyA0MzkKZGlmZiAtLWdpdCBhL21ici9jaGVja3NpemUucGwgYi9tYnIvY2hlY2tzaXplLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiNDIzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9tYnIvY2hlY2tzaXplLnBsCkBAIC0wLDAgKzEsNTQgQEAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMjAwNy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMgICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIyBjaGVja3NpemUucGwKKyMjCisjIyBDaGVjayB0aGUgc2l6ZSBvZiBhIGJpbmFyeSBmaWxlIGFuZCBwYWQgaXQgd2l0aCB6ZXJvZXMgdG8gdGhhdCBzaXplCisjIworCit1c2UgYnl0ZXM7CisKKygkZmlsZSwgJG1heHNpemUsICRwYWRzaXplKSA9IEBBUkdWOworCitpZiAoIWRlZmluZWQoJG1heHNpemUpKSB7CisgICAgIyBEZWZhdWx0cyBiYXNlZCBvbiB0aGUgZmlsZW5hbWUKKyAgICBpZiAoJGZpbGUgPX4gL15tYnJbXjAtOWEtel0vKSB7CisJJG1heHNpemUgPSAkcGFkc2l6ZSA9IDQ0MDsKKyAgICB9IGVsc2lmICgkZmlsZSA9fiAvXmdwdG1iclteMC05YS16XS8pIHsKKwkkbWF4c2l6ZSA9ICRwYWRzaXplID0gNDQwOworICAgIH0gZWxzaWYgKCRmaWxlID1+IC9eaXNvaGRwW2ZwXXhbXjAtOWEtel0vKSB7CisJJG1heHNpemUgPSAkcGFkc2l6ZSA9IDQzMjsKKyAgICB9IGVsc2lmICgkZmlsZSA9fiAvXmFsdG1iclteMC05YS16XS8pIHsKKwkkbWF4c2l6ZSA9ICRwYWRzaXplID0gNDM5OworICAgIH0gZWxzZSB7CisJZGllICIkMDogbm8gZGVmYXVsdCBzaXplIGZvciBmaWxlbmFtZTogJGZpbGVcbiI7CisgICAgfQorfQorCiskcGFkc2l6ZSA9ICRtYXhzaXplIHVubGVzcyhkZWZpbmVkKCRwYWRzaXplKSk7CisKK29wZW4oRklMRSwgJys8JywgJGZpbGUpIG9yIGRpZTsKK0BzdCA9IHN0YXQoRklMRSk7CitpZiAoIWRlZmluZWQoJHNpemUgPSAkc3RbN10pKSB7CisgICAgZGllICIkMDogJGZpbGU6ICQhXG4iOworfQoraWYgKCRzaXplID4gJG1heHNpemUpIHsKKyAgICBwcmludCBTVERFUlIgIiRmaWxlOiB0b28gYmlnICgkc2l6ZSA+ICRtYXhzaXplKVxuIjsKKyAgICBleGl0IDE7Cit9IGVsc2lmICgkc2l6ZSA8ICRwYWRzaXplKSB7CisgICAgc2VlayhGSUxFLCAkc2l6ZSwgMCk7CisgICAgcHJpbnQgRklMRSAiXDAiIHggKCRwYWRzaXplLSRzaXplKTsKK30KKworZXhpdCAwOwpkaWZmIC0tZ2l0IGEvbWJyL2dwdG1ici5TIGIvbWJyL2dwdG1ici5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZGI0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tYnIvZ3B0bWJyLlMKQEAgLTAsMCArMSwzMjQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJhZGp1c3QuaCIKKworCS5jb2RlMTYKKwkudGV4dAorCisJLmdsb2JsCWJvb3RzZWMKK3N0YWNrCQk9IDB4N2MwMAorCisvKiBQYXJ0aXRpb24gdGFibGUgaGVhZGVyIGhlcmUgKi8KK3BoZHIJCT0gc3RhY2sJCS8qIEFib3ZlIHRoZSBzdGFjaywgb3ZlcndyaXR0ZW4gYnkgYm9vdHNlY3QgKi8KKy8qIFBhcnRpdGlvbiB0YWJsZSBzZWN0b3IgaGVyZSAqLworLyogVG8gaGFuZGxlID4gMzJLIHdlIG5lZWQgdG8gcGxheSBzZWdtZW50IHRyaWNrcy4uLiAqLworcHNlYwkJPSBfcGhkciArIDUxMgorCisvKiBXaGVyZSB3ZSBwdXQgRFM6U0kgKi8KK2Rzc2lfb3V0CT0gX3N0YXJ0ICsgMHgxYmUKKworQklPU19rYmRmbGFncwk9IDB4NDE3CitCSU9TX3BhZ2UJPSAweDQ2MgorCisJLyogZ2FzL2xkIGhhcyBpc3N1ZXMgd2l0aCBkb2luZyB0aGlzIGFzIGFic29sdXRlIGFkZHJlc3Nlcy4uLiAqLworCS5zZWN0aW9uICIuYm9vdHNlYyIsICJhIiwgQG5vYml0cworCS5nbG9ibAlib290c2VjCitib290c2VjOgorCS5zcGFjZQk1MTIKKworCS50ZXh0CisJLmdsb2JsCV9zdGFydAorX3N0YXJ0OgorCS5ieXRlCTB4MzMsIDB4YzAJLyogeG9ydwklYXgsICVheCAqLworCWNsaQorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJXNzCisJbW92dwkkc3RhY2ssICVzcAorCW1vdncJJXNwLCAlc2kKKwlwdXNodwklZXMJCS8qIDQoJWJwKSBlczpkaSAtPiAkUG5QIGhlYWRlciAqLworCXB1c2h3CSVkaQkJLyogMiglYnApICovCisJbW92dwklYXgsICVlcworCXN0aQorCWNsZAorCisJLyogQ29weSBkb3duIHRvIDA6MHg2MDAgKi8KKwltb3Z3CSRfc3RhcnQsICVkaQorCW1vdncJJCg1MTIvMiksICVjeAorCXJlcDsgbW92c3cKKworCWxqbXB3CSQwLCAkbmV4dAorbmV4dDoKKworCUFESlVTVF9EUklWRQorCXB1c2h3CSVkeAkJLyogMCglYnApID0gJWRsIC0+IGRyaXZlIG51bWJlciAqLworCW1vdncJJXNwLCAlYnAJLyogJWJwIC0+IGZyYW1lIHBvaW50ZXI6IExFQVZFIFVOQ0hBTkdFRCAqLworCisJLyogcHJlcGFyZSB0byByZWFkIHNlY3RvciBzaXplICovCisJc3ViCSQweDFjLCAlc3AJLyogLTI4KCVicCkgPT0gJXNwICovCisJcHVzaHcJJDB4MWUJCS8qIC0zMCglYnApID09ICVzcCAqLworCW1vdncJJDB4MjAwLCAtNiglYnApCS8qIC02KCVicCkgc2VjdG9yIHNpemUgKi8KKworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIEVCSU9TICovCisJcHVzaHcJJWR4CQkvKiBkcml2ZSBudW1iZXIgKi8KKwltb3ZiCSQweDQxLCAlYWgJLyogJWFsID09IDAgYWxyZWFkeSAqLworCW1vdncJJDB4NTVhYSwgJWJ4CisJeG9ydwklY3gsICVjeAorCXhvcmIJJWRoLCAlZGgKKwlzdGMKKwlpbnQJJDB4MTMKKwlwb3B3CSVkeAkJLyogcmVzdG9yZSBkcml2ZSAqLworCW1vdmIJJDB4MDgsICVhaAkvKiBnZXQgQ0hTIGdlb21ldHJ5ICovCisJamMJMWYKKwljbXB3CSQweGFhNTUsICVieAorCWpuZQkxZgorCXNocncJJWN4CQkvKiBCaXQgMCA9IGZpeGVkIGRpc2sgc3Vic2V0ICovCisJam5jCTFmCisKKwkvKiBXZSBoYXZlIEVCSU9TOyBwYXRjaCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgYXQKKwkgICByZWFkX3NlY3Rvcl9jYmlvczogbW92YiAkMHg0MiwgJWFoIDsgIGptcCByZWFkX2NvbW1vbiAqLworCW1vdmwJJDB4ZWI0MmI0KygocmVhZF9jb21tb24tcmVhZF9zZWN0b3JfY2Jpb3MtNCkgPDwgMjQpLCBcCisJCShyZWFkX3NlY3Rvcl9jYmlvcykKKworCS8qCisJICogcmVhZCBzZWN0b3Igc2l6ZS4KKwkgKiBTaG91bGQgbm90IGZhaWwgYnV0IGlmIGl0IGRvZXMgSSBhc3N1bWUgdGhhdCBhdCBsZWFzdAorCSAqIHByZXZpb3VzIDUxMiB2YWx1ZSBpcyBub3Qgb3ZlcnJpZGRlbgorCSAqLworCW1vdmIJJDB4NDgsICVhaAorCW1vdncJJXNwLCAlc2kKKworMToKKwkvKiBHZXQgKEMpSFMgZ2VvbWV0cnkgKi8KKwlpbnQJJDB4MTMKKworCS8qIGhlcmUgd2UgY29tcHV0ZXIgQ0hTIHZhbHVlcyBvciBqdXN0IGRvIHNvbWUgZHVtbXkgY29tcHV0YXRpb24gZm9yIEVCSU9TICovCisJYW5kdwkkMHgzZiwgJWN4CS8qIFNlY3RvciBjb3VudCAqLworCXB1c2h3CSVjeAkJLyogLTMyKCVicCkgU2F2ZSBzZWN0b3JzIG9uIHRoZSBzdGFjayAqLworCW1vdnpidwklZGgsICVheAkvKiBkaCA9IG1heCBoZWFkICovCisJaW5jdwklYXgJCS8qIEZyb20gMC1iYXNlZCBtYXggdG8gY291bnQgKi8KKwltdWx3CSVjeAkJLyogSGVhZHMqc2VjdG9ycyAtPiBzZWN0b3JzIHBlciBjeWxpbmRlciAqLworCisJLyogU2F2ZSBzZWN0b3JzL2N5bGluZGVyIG9uIHRoZSBzdGFjayAqLworCXB1c2h3CSVkeAkJLyogLTM0KCVicCkgSGlnaCB3b3JkICovCisJcHVzaHcJJWF4CQkvKiAtMzYoJWJwKSBMb3cgd29yZCAqLworCisJLyogTG9hZCBwYXJ0aXRpb24gdGFibGUgaGVhZGVyICovCisJeG9ybAklZWF4LCVlYXgKKwljbHRkCisJaW5jdwklYXgJCS8qICVlZHg6JWVheCA9IDEgKi8KKwljYWxsCXJlYWRfc2VjdG9yX3BoZHIKKworCS8qIE51bWJlciBvZiBwYXJ0aXRpb24gc2VjdG9ycyAqLworCS8qIFdlIGFzc3VtZSB0aGUgcGFydGl0aW9uIHRhYmxlIGlzIDMySyBvciBsZXNzICovCisJbW92dwkoODArNikoJWJwKSwlY3gJCS8qIE51bWJlck9mUGFydGl0aW9uRW50cmllcyAqLworCW1vdncJKDg0KzYpKCVicCksJWF4CQkvKiBTaXplT2ZQYXJ0aXRpb25FbnRyeSAqLworCXB1c2h3CSVheAorCXB1c2h3CSVjeAorCW11bHcJJWN4CisJZGl2dwktNiglYnApCS8qICVkeCA9PSAwIGhlcmUgKi8KKwl4Y2hndwklYXgsJWN4CisJaW5jdwklY3gKKworCS8qIFN0YXJ0aW5nIExCQSBvZiBwYXJ0aXRpb24gYXJyYXkgKi8KKwltb3ZsCSg3Mis2KSglYnApLCVlYXgKKwltb3ZsCSg3Nis2KSglYnApLCVlZHgKKworCXB1c2h3CSVieAorZ2V0X3B0YWI6CisJY2FsbAlyZWFkX3NlY3RvcgorCWxvb3B3CWdldF9wdGFiCisKKwkvKiBGaW5kIHRoZSBib290IHBhcnRpdGlvbiAqLworCXhvcncJJXNpLCVzaQkJCS8qIE5vdGhpbmcgZm91bmQgeWV0ICovCisJcG9wdwklZGkJCQkvKiBQYXJ0aXRpb24gdGFibGUgaW4gbWVtb3J5ICovCisJcG9wdwklY3gJCQkvKiBOdW1iZXJPZlBhcnRpdGlvbkVudHJpZXMgKi8KKwlwb3B3CSVheAkJCS8qIFNpemVPZlBhcnRpdGlvbkVudHJ5ICovCisKK2ZpbmRfcGFydDoKKwkvKiBJZiB0aGUgUGFydGl0aW9uVHlwZUdVSUQgaXMgYWxsIHplcm8sIGl0J3MgYW4gZW1wdHkgc2xvdCAqLworCW1vdmwJICAoJWRpKSwlZWR4CisJb3JsCSA0KCVkaSksJWVkeAorCW9ybAkgOCglZGkpLCVlZHgKKwlvcmwJMTIoJWRpKSwlZWR4CisJanoJbm90X3RoaXMKKwl0ZXN0YgkkMHgwNCw0OCglZGkpCisJanoJbm90X3RoaXMKKwlhbmR3CSVzaSwlc2kKKwlqbnoJZm91bmRfbXVsdGlwbGUKKwltb3Z3CSVkaSwlc2kKK25vdF90aGlzOgorCWFkZHcJJWF4LCVkaQorCWxvb3B3CWZpbmRfcGFydAorCisJYW5kdwklc2ksJXNpCisJam56CWZvdW5kX3BhcnQKKworbWlzc2luZ19vczoKKwljYWxsCWVycm9yCisJLmFzY2lpCSJNaXNzaW5nIE9TXHJcbiIKKworZm91bmRfbXVsdGlwbGU6CisJY2FsbAllcnJvcgorCS5hc2NpaQkiTXVsdGlwbGUgYWN0aXZlIHBhcnRpdGlvbnNcclxuIgorCitmb3VuZF9wYXJ0OgorCXhjaGd3CSVheCwlY3gJCS8qIFNldCB1cCAlY3ggZm9yIHJlcCBtb3ZzYiBmdXJ0aGVyIGRvd24gKi8KKworCW1vdncJJGRzc2lfb3V0LCVkaQorCXB1c2h3CSVkaQorCisJLyogODAgMDAgMDAgMDAgZWUgMDAgMDAgMDAKKwkgICAtIGJvb3RhYmxlIHBhcnRpdGlvbiwgdHlwZSBFRkkgKEVFKSwgbm8gQ0hTIGluZm9ybWF0aW9uICovCisJeG9ybAklZWF4LCVlYXgKKwltb3ZiCSQweDgwLCVhbAorCXN0b3NsCisJbW92YgkkMHhlZCwlYWwKKwlzdG9zbAorCW1vdmwJMzIoJXNpKSwlZWF4CisJbW92bAkzNiglc2kpLCVlZHgKKwljYWxsCXNhdHVyYXRlX3N0b3NsCQkvKiBQYXJ0aXRpb24gc3RhcnQgKi8KKworCW1vdmwJNDAoJXNpKSwlZWF4CisJbW92bAk0NCglc2kpLCVlZHgKKwlzdWJsCTMyKCVzaSksJWVheAorCXNiYmwJMzYoJXNpKSwlZWR4CisJY2FsbAlpbmM2NAorCWNhbGwJc2F0dXJhdGVfc3Rvc2wJCS8qIFBhcnRpdGlvbiBsZW5ndGggKi8KKworCW1vdnp3bAklY3gsJWVheAkJLyogTGVuZ3RoIG9mIEdQVCBlbnRyeSAqLworCXN0b3NsCisKKwlyZXA7IG1vdnNiCQkJLyogR1BUIGVudHJ5IGZvbGxvd3MgTUJSIGVudHJ5ICovCisJcG9wdwklc2kKKworLyoKKyAqIGJvb3Q6IGludm9rZSB0aGUgYWN0dWFsIGJvb3RzdHJhcC4gJWRzOiVzaSBwb2ludHMgdG8gdGhlCisgKiBwYXJ0aXRpb24gaW5mb3JtYXRpb24gaW4gbWVtb3J5LiAgVGhlIHRvcCB3b3JkIG9uIHRoZSBzdGFjaworICogaXMgcGhkciA9PSAweDdjMDAgPT0gdGhlIGFkZHJlc3Mgb2YgdGhlIGJvb3Qgc2VjdG9yLgorICovCitib290OgorCW1vdmwJKDMyKzIwKSglc2kpLCVlYXgKKwltb3ZsCSgzNisyMCkoJXNpKSwlZWR4CisJY2FsbAlyZWFkX3NlY3Rvcl9waGRyCisJY21wdwkkMHhhYTU1LCAoMHg3YzAwKzB4MWZlKQorCWpuZQltaXNzaW5nX29zCS8qIE5vdCBhIHZhbGlkIGJvb3Qgc2VjdG9yICovCisJbW92dwklYnAsICVzcAkvKiBkcml2ZW5vID09IGJvb3RzZWMtNiAqLworCXBvcHcJJWR4CQkvKiBkbCAtPiBkcml2ZSBudW1iZXIgKi8KKwlwb3B3CSVkaQkJLyogZXM6ZGkgLT4gJFBuUCB2ZWN0b3IgKi8KKwlwb3B3CSVlcworCW1vdmwJJDB4NTQ1MDQ3MjEsJWVheCAvKiAhR1BUIG1hZ2ljIG51bWJlciAqLworCWNsaQorCWptcHcJKiVzcAkJLyogJXNwID09IGJvb3RzZWMgKi8KKworLyoKKyAqIFN0b3JlIHRoZSB2YWx1ZSBpbiAlZWF4IHRvICVkaSBpZmYgJWVkeCA9PSAwLCBvdGhlcndpc2Ugc3RvcmUgLTEuCisgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyBhY3R1YWxseSB3cml0dGVuIGluICVlYXguCisgKi8KK3NhdHVyYXRlX3N0b3NsOgorCWFuZGwJJWVkeCwlZWR4CisJanogMWYKKwlvcmwJJC0xLCVlYXgKKzE6CXN0b3NsCisJcmV0CisKK3JlYWRfc2VjdG9yX3BoZHI6CisJbW92dwkkcGhkciwgJWJ4CisKKwkvKiBmYWxsIHRocm91Z2ggYW5kIHJlYWQgc2VjdG9yICovCisKKy8qCisgKiByZWFkX3NlY3RvcjogcmVhZCBhIHNpbmdsZSBzZWN0b3IgcG9pbnRlZCB0byBieSAlZWR4OiVlYXggdG8KKyAqICVlczolYnguICBDRiBpcyBzZXQgb24gZXJyb3IuICBBbGwgcmVnaXN0ZXJzIHNhdmVkLgorICogJWVkeDolZWF4IGFuZCAlZXM6JWJ4IGFyZSBpbmNyZW1lbnRlZCB0byByZWFkIG5leHQgc2VjdG9yCisgKi8KK3JlYWRfc2VjdG9yOgorCXB1c2hhbAorCXB1c2hsCSVlZHgJLyogTVNXIG9mIExCQSAqLworCXB1c2hsCSVlYXgJLyogTFNXIG9mIExCQSAqLworCXB1c2h3CSVlcwkvKiBCdWZmZXIgc2VnbWVudCAqLworCXB1c2h3CSVieAkvKiBCdWZmZXIgb2Zmc2V0ICovCisJcHVzaHcJJDEJLyogU2VjdG9yIGNvdW50ICovCisJcHVzaHcJJDE2CS8qIFNpemUgb2YgcGFja2V0ICovCisJbW92dwklc3AsICVzaQorCisJLyogVGhpcyBjaHVuayBpcyBza2lwcGVkIGlmIHdlIGhhdmUgZWJpb3MgKi8KKwkvKiBEbyBub3QgY2xvYmJlciAlZXM6JWJ4IG9yICVlZHg6JWVheCBiZWZvcmUgdGhpcyBjaHVuayEgKi8KK3JlYWRfc2VjdG9yX2NiaW9zOgorCWRpdmwJLTM2KCVicCkJLyogc2VjcGVyY3lsICovCisJc2hsYgkkNiwgJWFoCisJbW92YgklYWgsICVjbAorCW1vdmIJJWFsLCAlY2gKKwl4Y2hndwklZHgsICVheAorCWRpdmIJLTMyKCVicCkJLyogc2VjdG9ycyAqLworCW1vdmIJJWFsLCAlZGgKKwlvcmIJJWFoLCAlY2wKKwlpbmN3CSVjeAkvKiBTZWN0b3JzIGFyZSAxLWJhc2VkICovCisJbW92dwkkMHgwMjAxLCAlYXgKKworcmVhZF9jb21tb246CisJbW92YgkoJWJwKSwgJWRsIC8qIGRyaXZlbm8gKi8KKwlpbnQJJDB4MTMKKwlsZWF3CTE2KCVzaSksICVzcAkvKiBEcm9wIERBUEEgKi8KKwlwb3BhbAorCWpjCWRpc2tfZXJyb3IKKwlhZGRiCS01KCVicCksICViaAkJLyogYnggKz0gc2VjdG9yIHNpemU6IHBvaW50IHRvIHRoZSBuZXh0IGJ1ZmZlciAqLworCisJLyogZmFsbCB0aHJvdWdoIGFuZCBpbmNyZW1lbnQgc2VjdG9yIG51bWJlciAqLworCisvKgorICogSW5jcmVtZW50ICVlZHg6JWVheAorICovCitpbmM2NDoKKwlhZGRsCSQxLCVlYXgKKwlhZGNsCSQwLCVlZHgKKwlyZXQKKworZGlza19lcnJvcjoKKwljYWxsCWVycm9yCisJLmFzY2lpCSJEaXNrIGVycm9yXHJcbiIKKworLyoKKyAqIFByaW50IGVycm9yIG1lc3NhZ2VzLiAgVGhpcyBpcyBpbnZva2VkIHdpdGggImNhbGwiLCB3aXRoIHRoZQorICogZXJyb3IgbWVzc2FnZSBhdCB0aGUgcmV0dXJuIGFkZHJlc3MuCisgKi8KK2Vycm9yOgorCXBvcHcJJXNpCisyOgorCWxvZHNiCisJbW92YgkkMHgwZSwgJWFoCisJbW92YgkoQklPU19wYWdlKSwgJWJoCisJbW92YgkkMHgwNywgJWJsCisJaW50CSQweDEwCQkvKiBNYXkgZGVzdHJveSAlYnAgKi8KKwljbXBiCSQxMCwgJWFsCS8qIE5ld2xpbmU/ICovCisJam5lCTJiCisKKwlpbnQJJDB4MTgJCS8qIEJvb3QgZmFpbHVyZSAqLworZGllOgorCWhsdAorCWptcAlkaWUKZGlmZiAtLWdpdCBhL21ici9pMzg2L21ici5sZCBiL21ici9pMzg2L21ici5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTRiYTgwCi0tLSAvZGV2L251bGwKKysrIGIvbWJyL2kzODYvbWJyLmxkCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciBNQlIKKyAqLworCisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRVhURVJOKF9zdGFydCkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMHg2MDA7CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0KikKKyAgICAqKC5yb2RhdGEqKQorICB9ID0weDkwOTA5MDkwCisKKyAgLiA9IEFMSUdOKDQpOworICAuZGF0YQkJICA6CisgIHsKKyAgICAqKC5kYXRhKikKKyAgfQorCisgIC4gPSBBTElHTigxMjgpOworICAuYnNzCQkgIDoKKyAgeworICAgICooLmJzcyopCisgIH0KKworICAuID0gMHg3YzAwOworICAuYm9vdHNlYwkgIDoKKyAgeworICAgICooLmJvb3RzZWMpCisgIH0KKworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgfQorfQpkaWZmIC0tZ2l0IGEvbWJyL2lzb2hkcGZ4LlMgYi9tYnIvaXNvaGRwZnguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2UxZWZlCi0tLSAvZGV2L251bGwKKysrIGIvbWJyL2lzb2hkcGZ4LlMKQEAgLTAsMCArMSwyOTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogTW9kaWZpZWQgTUJSIGNvZGUgdXNlZCBvbiBhbiBJU08gaW1hZ2UgaW4gaHlicmlkIG1vZGUuCisgKgorICogVGhpcyBkb2Vzbid0IGZvbGxvdyB0aGUgRWwgVG9yaXRvIHNwZWMgYXQgYWxsIC0tIGl0IGlzIGp1c3QgYSBzdHViCisgKiBsb2FkZXIgb2YgYSBoYXJkLWNvZGVkIG9mZnNldCwgYnV0IHRoYXQncyBnb29kIGVub3VnaCB0byBsb2FkCisgKiBJU09MSU5VWC4KKyAqLworCisjaW5jbHVkZSAiYWRqdXN0LmgiCisKKwkuY29kZTE2CisJLnRleHQKKworSFlCUklEX01BR0lDCQkJPSAweDcwNzhjMGZiCitpc29saW51eF9oeWJyaWRfc2lnbmF0dXJlCT0gMHg3YzAwKzY0Citpc29saW51eF9zdGFydF9oeWJyaWQJCT0gMHg3YzAwKzY0KzQKKworCS5nbG9ibAlib290c2VjCisvKiBJbXBvcnRhbnQ6IHRoZSB0b3AgNiB3b3JkcyBvbiB0aGUgc3RhY2sgYXJlIHBhc3NlZCB0byBpc29saW51eC5iaW4gKi8KK3N0YWNrCQk9IDB4N2MwMAorcGFydG9mZnNldAk9IChzdGFjay04KQorZHJpdmVubwkJPSAoc3RhY2stMTQpCitoZWFkcwkJPSAoc3RhY2stMTYpCitzZWN0b3JzCQk9IChzdGFjay0xOCkKK2ViaW9zX2ZsYWcJPSAoc3RhY2stMjApCitzZWNwZXJjeWwJPSAoc3RhY2stMjQpCisKK0JJT1Nfa2JkZmxhZ3MJPSAweDQxNworQklPU19wYWdlCT0gMHg0NjIKKworCS8qIGdhcy9sZCBoYXMgaXNzdWVzIHdpdGggZG9pbmcgdGhpcyBhcyBhYnNvbHV0ZSBhZGRyZXNzZXMuLi4gKi8KKwkuc2VjdGlvbiAiLmJvb3RzZWMiLCAiYSIsIEBub2JpdHMKKwkuZ2xvYmwJYm9vdHNlYworYm9vdHNlYzoKKwkuc3BhY2UJNTEyCisKKwkudGV4dAorCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKwkuYnl0ZQkweDMzLCAweGVkCS8qIHhvcncJJWJwLCAlYnAgKi8KKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwkuYnl0ZQkweDMzLCAweGVkCS8qIHhvcncJJWJwLCAlYnAgKi8KKwljbGkKKwltb3Z3CSVicCwgJXNzCisJbW92dwkkc3RhY2ssICVzcAorCXN0aQorCWNsZAorCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBwYXJ0aXRpb24gdGFibGUgZW50cnkgKi8KKwl4b3JsCSVlYngsICVlYngKKwl4b3JsCSVlY3gsICVlY3gKKyNpZmRlZiBQQVJUSVRJT05fU1VQUE9SVAorCWFuZHcJJXNpLCAlc2kJCS8qICVzaSA9PSAwIC0+IG5vIHBhcnRpdGlvbiBkYXRhICovCisJanoJMWYKKwl0ZXN0YgkkMHg3ZiwgKCVzaSkJCS8qIEludmFsaWQgYWN0aXZlIGZsYWcgZmllbGQ/ICovCisJam56CTFmCisJY21wYgklY2wsIDQoJXNpKQkJLyogUGFydGl0aW9uIHR5cGUgemVybyA9PSBpbnZhbGlkPyAqLworCWplCTFmCisJY21wbAkkMHg1ODUwNDcyMSwgJWVheAkvKiAhR1BUIHNpZ25hdHVyZSBpbiBFQVg/ICovCisJam5lCTJmCisJY21wYgkkMHhlZCwgNCglc2kpCQkvKiBFRkkgcGFydGl0aW9uIHR5cGU/ICovCisJam5lCTJmCisJCisJLyogV2UgaGF2ZSBHUFQgcGFydGl0aW9uIGluZm9ybWF0aW9uICovCisJbW92bAkoMzIrMjApKCVzaSksICVlY3gKKwltb3ZsCSgzNisyMCkoJXNpKSwgJWVieAorCWptcAkxZgorCisJLyogV2UgaGF2ZSBub24tR1BUIHBhcnRpdGlvbiBpbmZvcm1hdGlvbiAqLworMjoKKwltb3ZsCTgoJXNpKSwgJWVjeAorI2VuZGlmCisxOgorCS8qIFdlIGhhdmUgbm8gcGFydGl0aW9uIGluZm9ybWF0aW9uICovCisJcHVzaGwJJWVieAkJCS8qICAtNDogcGFydG9mZnNldF9oaSAqLworCXB1c2hsCSVlY3gJCQkvKiAgLTg6IHBhcnRvZmZzZXRfbG8gKi8KKwlwdXNodwklZXMJCQkvKiAtMTA6IGVzOmRpIC0+ICRQblAgaGVhZGVyICovCisJcHVzaHcJJWRpCQkJLyogLTEyOiBlczpkaSAtPiAkUG5QIGhlYWRlciAqLworCisJbW92dwklYnAsICVkcworCW1vdncJJWJwLCAlZXMKKwkKKwlBREpVU1RfRFJJVkUKKwlwdXNodwklZHgJCQkvKiAtMTQ6IGRsIC0+IGRyaXZlIG51bWJlciAqLworCisJLyogQ29weSBkb3duIHRvIDA6MHg2MDAgKi8KKwltb3Z3CSQweDdjMDAsICVzaQorCW1vdncJJF9zdGFydCwgJWRpCisJbW92dwkkKDUxMi8yKSwgJWN4CisJcmVwOyBtb3ZzdworCisJbGptcHcJJDAsICRuZXh0CituZXh0OgorCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgRUJJT1MgKi8KKwlwdXNodwklZHgJCS8qIGRyaXZlIG51bWJlciAqLworCW1vdmIJJDB4NDEsICVhaAkvKiAlYWwgPT0gMCBhbHJlYWR5ICovCisJbW92dwkkMHg1NWFhLCAlYngKKwl4b3J3CSVjeCwgJWN4CisJeG9yYgklZGgsICVkaAorCXN0YworCWludAkkMHgxMworCWpjCTFmCisJY21wdwkkMHhhYTU1LCAlYngKKwlqbmUJMWYKKwlhbmR3CSQxLCVjeAkJLyogQml0IDAgPSBmaXhlZCBkaXNrIHN1YnNldCAqLworCWp6CTFmCisKKwkvKiBXZSBoYXZlIEVCSU9TOyBwYXRjaCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgYXQKKwkgICByZWFkX3NlY3Rvcl9jYmlvczogbW92YiAkMHg0MiwgJWFoIDsgIGptcCByZWFkX2NvbW1vbiAqLworCW1vdmwJJDB4ZWI0MmI0KygocmVhZF9jb21tb24tcmVhZF9zZWN0b3JfY2Jpb3MtNCkgPDwgMjQpLCBcCisJCShyZWFkX3NlY3Rvcl9jYmlvcykKKwlqbXAJMWYKKzE6CisJcG9wdwklZHgKKwlwdXNodwklY3gJCS8qIEVCSU9TIGZsYWcgKi8KKworCS8qIEdldCAoQylIUyBnZW9tZXRyeSAqLworCW1vdmIJJDB4MDgsICVhaAorCWludAkkMHgxMworCWFuZHcJJDB4M2YsICVjeAkvKiBTZWN0b3IgY291bnQgKi8KKwlwb3B3CSVieAkJLyogRUJJT1MgZmxhZyAqLworCXB1c2h3CSVjeAkJLyogLTE2OiBTYXZlIHNlY3RvcnMgb24gdGhlIHN0YWNrICovCisJbW92emJ3CSVkaCwgJWF4CS8qIGRoID0gbWF4IGhlYWQgKi8KKwlpbmN3CSVheAkJLyogRnJvbSAwLWJhc2VkIG1heCB0byBjb3VudCAqLworCXB1c2h3CSVheAkJLyogLTE4OiBTYXZlIGhlYWRzIG9uIHRoZSBzdGFjayAqLworCW11bHcJJWN4CQkvKiBIZWFkcypzZWN0b3JzIC0+IHNlY3RvcnMgcGVyIGN5bGluZGVyICovCisKKwlwdXNodwklYngJCS8qIC0yMDogRUJJT1MgZmxhZyAqLworCQorCS8qIFNhdmUgc2VjdG9ycy9jeWxpbmRlciBvbiB0aGUgc3RhY2sgKi8KKwlwdXNodwklZHgJCS8qIC0yMjogSGlnaCB3b3JkICovCisJcHVzaHcJJWF4CQkvKiAtMjQ6IExvdyB3b3JkICovCisKKwkvKgorCSAqIExvYWQgc2VjdG9ycy4gIFdlIGRvIHRoaXMgb25lIGF0IGEgdGltZSBtb3N0bHkgdG8gYXZvaWQKKwkgKiBwaXRmYWxscyBhbmQgdG8gc2hhcmUgY29kZSB3aXRoIHRoZSBzdG9jayBNQlIgY29kZS4KKwkgKi8KKwltb3Z3CSQweDdjMDAsICVieAorCW1vdncJJDQsICVjeAkJLyogU2VjdG9yIGNvdW50ICovCisJbW92bAkobGJhX29mZnNldCksICVlYXgKKworMjoKKwljYWxsCXJlYWRfc2VjdG9yCisJamMJZGlza19lcnJvcgorCWluY2wJJWVheAorCWFkZGIJJCg1MTIgPj4gOCksICViaAorCWxvb3B3CTJiCisKKwkvKgorCSAqIE9rYXksIHRoYXQgYWN0dWFsbHkgd29ya2VkLi4uIHVwZGF0ZSB0aGUgc3RhY2sgcG9pbnRlcgorCSAqIGFuZCBqdW1wIGludG8gaXNvbGludXguYmluLi4uCisJICovCisJY21wbAkkSFlCUklEX01BR0lDLChpc29saW51eF9oeWJyaWRfc2lnbmF0dXJlKQorCWpuZQliYWRfc2lnbmF0dXJlCisKKwljbGkKKwltb3Z3CSRlYmlvc19mbGFnLCAlc3AKKworCS8qCisJICogVXNlIGEgbGptcHcgaGVyZSB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBzb21lIHVua25vd24gdmVyc2lvbgorCSAqIG9mIGdhcyBvciBsZCB3aGVuIGl0IGNvbWVzIHRvIGp1bXBpbmcgdG8gYW4gYWJzb2x1dGUgc3ltYm9sLi4uCisJICoKKwkgKiBMb29rIG1vcmUgY2xvc2VseSBpbnRvIGl0IGlmIHdlIGV2ZXIgYXJlIHNob3J0IG9uIHNwYWNlLgorCSAqLworCWxqbXB3CSQwLCAkaXNvbGludXhfc3RhcnRfaHlicmlkCisKK2JhZF9zaWduYXR1cmU6CisJY2FsbAllcnJvcgorCS5hc2NpaQkiaXNvbGludXguYmluIG1pc3Npbmcgb3IgY29ycnVwdC5cclxuIgorCisvKgorICogcmVhZF9zZWN0b3I6IHJlYWQgYSBzaW5nbGUgc2VjdG9yIHBvaW50ZWQgdG8gYnkgJWVheCB0byAlZXM6JWJ4LgorICogQ0YgaXMgc2V0IG9uIGVycm9yLiAgQWxsIHJlZ2lzdGVycyBzYXZlZC4KKyAqLworcmVhZF9zZWN0b3I6CisJcHVzaGFsCisJeG9ybAklZWR4LCAlZWR4CisJYWRkbAkocGFydG9mZnNldCksICVlYXgKKwlhZGNsCShwYXJ0b2Zmc2V0KzQpLCAlZWR4CisJcHVzaGwJJWVkeAkvKiBNU1cgb2YgTEJBICovCisJcHVzaGwJJWVheAkvKiBMU1cgb2YgTEJBICovCisJcHVzaHcJJWVzCS8qIEJ1ZmZlciBzZWdtZW50ICovCisJcHVzaHcJJWJ4CS8qIEJ1ZmZlciBvZmZzZXQgKi8KKwlwdXNodwkkMQkvKiBTZWN0b3IgY291bnQgKi8KKwlwdXNodwkkMTYJLyogU2l6ZSBvZiBwYWNrZXQgKi8KKwltb3Z3CSVzcCwgJXNpCisKKwkvKiBUaGlzIGNodW5rIGlzIHNraXBwZWQgaWYgd2UgaGF2ZSBlYmlvcyAqLworCS8qIERvIG5vdCBjbG9iYmVyICVlYXggYmVmb3JlIHRoaXMgY2h1bmshICovCisJLyogVGhpcyBhbHNvIHJlbGllcyBvbiAlYnggYW5kICVlZHggYXMgc2V0IHVwIGFib3ZlLiAqLworcmVhZF9zZWN0b3JfY2Jpb3M6CisJZGl2bAkoc2VjcGVyY3lsKQorCXNobGIJJDYsICVhaAorCW1vdmIJJWFoLCAlY2wKKwltb3ZiCSVhbCwgJWNoCisJeGNoZ3cJJWR4LCAlYXgKKwlkaXZiCShzZWN0b3JzKQorCW1vdmIJJWFsLCAlZGgKKwlvcmIJJWFoLCAlY2wKKwlpbmN3CSVjeAkvKiBTZWN0b3JzIGFyZSAxLWJhc2VkICovCisJbW92dwkkMHgwMjAxLCAlYXgKKworcmVhZF9jb21tb246CisJbW92YgkoZHJpdmVubyksICVkbAorCWludAkkMHgxMworCWxlYXcJMTYoJXNpKSwgJXNwCS8qIERyb3AgREFQQSAqLworCXBvcGFsCisJcmV0CisKK2Rpc2tfZXJyb3I6CisJY2FsbAllcnJvcgorCS5hc2NpaQkiT3BlcmF0aW5nIHN5c3RlbSBsb2FkIGVycm9yLlxyXG4iCisKKy8qCisgKiBQcmludCBlcnJvciBtZXNzYWdlcy4gIFRoaXMgaXMgaW52b2tlZCB3aXRoICJjYWxsIiwgd2l0aCB0aGUKKyAqIGVycm9yIG1lc3NhZ2UgYXQgdGhlIHJldHVybiBhZGRyZXNzLgorICovCitlcnJvcjoKKwlwb3B3CSVzaQorMjoKKwlsb2RzYgorCW1vdmIJJDB4MGUsICVhaAorCW1vdmIJKEJJT1NfcGFnZSksICViaAorCW1vdmIJJDB4MDcsICVibAorCWludAkkMHgxMAkJLyogTWF5IGRlc3Ryb3kgJWJwICovCisJY21wYgkkMTAsICVhbAkvKiBOZXdsaW5lPyAqLworCWpuZQkyYgorCisJaW50CSQweDE4CQkvKiBCb290IGZhaWx1cmUgKi8KK2RpZToKKwlobHQKKwlqbXAJZGllCisKKwkvKiBBZGRyZXNzIG9mIHBvaW50ZXIgdG8gaXNvbGludXguYmluICovCitsYmFfb2Zmc2V0ID0gX3N0YXJ0KzQzMgpkaWZmIC0tZ2l0IGEvbWJyL2lzb2hkcHB4LlMgYi9tYnIvaXNvaGRwcHguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYyNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWJyL2lzb2hkcHB4LlMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFBBUlRJVElPTl9TVVBQT1JUIDEKKyNpbmNsdWRlICJpc29oZHBmeC5TIgpkaWZmIC0tZ2l0IGEvbWJyL21ici5TIGIvbWJyL21ici5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MGEzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tYnIvbWJyLlMKQEAgLTAsMCArMSwzMTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBDb3B5cmlnaHQgMjAwNy0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAiYWRqdXN0LmgiCisKKwkuY29kZTE2CisJLnRleHQKKworCS5nbG9ibAlib290c2VjCitzdGFjawkJPSAweDdjMDAKK2RyaXZlbm8JCT0gKHN0YWNrLTYpCitzZWN0b3JzCQk9IChzdGFjay04KQorc2VjcGVyY3lsCT0gKHN0YWNrLTEyKQorCitCSU9TX2tiZGZsYWdzCT0gMHg0MTcKK0JJT1NfcGFnZQk9IDB4NDYyCisKKwkvKiBnYXMvbGQgaGFzIGlzc3VlcyB3aXRoIGRvaW5nIHRoaXMgYXMgYWJzb2x1dGUgYWRkcmVzc2VzLi4uICovCisJLnNlY3Rpb24gIi5ib290c2VjIiwgImEiLCBAbm9iaXRzCisJLmdsb2JsCWJvb3RzZWMKK2Jvb3RzZWM6CisJLnNwYWNlCTUxMgorCisJLnRleHQKKwkuZ2xvYmwJX3N0YXJ0Citfc3RhcnQ6CisJLmJ5dGUJMHgzMywgMHhjMAkvKiB4b3J3CSVheCwgJWF4ICovCisJY2xpCisJbW92dwklYXgsICVkcworCW1vdncJJWF4LCAlc3MKKwltb3Z3CSRzdGFjaywgJXNwCisJbW92dwklc3AsICVzaQorCXB1c2h3CSVlcwkJLyogZXM6ZGkgLT4gJFBuUCBoZWFkZXIgKi8KKwlwdXNodwklZGkKKwltb3Z3CSVheCwgJWVzCisJc3RpCisJY2xkCisKKwkvKiBDb3B5IGRvd24gdG8gMDoweDYwMCAqLworCW1vdncJJF9zdGFydCwgJWRpCisJbW92dwkkKDUxMi8yKSwgJWN4CisJcmVwOyBtb3ZzdworCisJbGptcHcJJDAsICRuZXh0CituZXh0OgorCisJQURKVVNUX0RSSVZFCisJcHVzaHcJJWR4CQkvKiBkbCAtPiBkcml2ZSBudW1iZXIgKi8KKworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIEVCSU9TICovCisJcHVzaHcJJWR4CQkvKiBkcml2ZSBudW1iZXIgKi8KKwltb3ZiCSQweDQxLCAlYWgJLyogJWFsID09IDAgYWxyZWFkeSAqLworCW1vdncJJDB4NTVhYSwgJWJ4CisJeG9ydwklY3gsICVjeAorCXhvcmIJJWRoLCAlZGgKKwlzdGMKKwlpbnQJJDB4MTMKKwlqYwkxZgorCWNtcHcJJDB4YWE1NSwgJWJ4CisJam5lCTFmCisJc2hydwklY3gJCS8qIEJpdCAwID0gZml4ZWQgZGlzayBzdWJzZXQgKi8KKwlqbmMJMWYKKworCS8qIFdlIGhhdmUgRUJJT1M7IHBhdGNoIGluIHRoZSBmb2xsb3dpbmcgY29kZSBhdAorCSAgIHJlYWRfc2VjdG9yX2NiaW9zOiBtb3ZiICQweDQyLCAlYWggOyAgam1wIHJlYWRfY29tbW9uICovCisJbW92bAkkMHhlYjQyYjQrKChyZWFkX2NvbW1vbi1yZWFkX3NlY3Rvcl9jYmlvcy00KSA8PCAyNCksIFwKKwkJKHJlYWRfc2VjdG9yX2NiaW9zKQorCisxOgorCXBvcHcJJWR4CisKKwkvKiBHZXQgKEMpSFMgZ2VvbWV0cnkgKi8KKwltb3ZiCSQweDA4LCAlYWgKKwlpbnQJJDB4MTMKKwlhbmR3CSQweDNmLCAlY3gJLyogU2VjdG9yIGNvdW50ICovCisJcHVzaHcJJWN4CQkvKiBTYXZlIHNlY3RvcnMgb24gdGhlIHN0YWNrICovCisJbW92emJ3CSVkaCwgJWF4CS8qIGRoID0gbWF4IGhlYWQgKi8KKwlpbmN3CSVheAkJLyogRnJvbSAwLWJhc2VkIG1heCB0byBjb3VudCAqLworCW11bHcJJWN4CQkvKiBIZWFkcypzZWN0b3JzIC0+IHNlY3RvcnMgcGVyIGN5bGluZGVyICovCisKKwkvKiBTYXZlIHNlY3RvcnMvY3lsaW5kZXIgb24gdGhlIHN0YWNrICovCisJcHVzaHcJJWR4CQkvKiBIaWdoIHdvcmQgKi8KKwlwdXNodwklYXgJCS8qIExvdyB3b3JkICovCisKKwl4b3JsCSVlYXgsICVlYXgJLyogQmFzZSAqLworCWNkcQkJCS8qIFJvb3QgKCVlZHggPC0gMCkgKi8KKwljYWxsCXNjYW5fcGFydGl0aW9uX3RhYmxlCisKKwkvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZSBubyBPUyAqLworbWlzc2luZ19vczoKKwljYWxsCWVycm9yCisJLmFzY2lpCSJNaXNzaW5nIG9wZXJhdGluZyBzeXN0ZW0uXHJcbiIKKworLyoKKyAqIHJlYWRfc2VjdG9yOiByZWFkIGEgc2luZ2xlIHNlY3RvciBwb2ludGVkIHRvIGJ5ICVlYXggdG8gMHg3YzAwLgorICogQ0YgaXMgc2V0IG9uIGVycm9yLiAgQWxsIHJlZ2lzdGVycyBzYXZlZC4KKyAqLworcmVhZF9zZWN0b3I6CisJcHVzaGFsCisJeG9ybAklZWR4LCAlZWR4CisJbW92dwkkYm9vdHNlYywgJWJ4CisJcHVzaGwJJWVkeAkvKiBNU1cgb2YgTEJBICovCisJcHVzaGwJJWVheAkvKiBMU1cgb2YgTEJBICovCisJcHVzaHcJJWVzCS8qIEJ1ZmZlciBzZWdtZW50ICovCisJcHVzaHcJJWJ4CS8qIEJ1ZmZlciBvZmZzZXQgKi8KKwlwdXNodwkkMQkvKiBTZWN0b3IgY291bnQgKi8KKwlwdXNodwkkMTYJLyogU2l6ZSBvZiBwYWNrZXQgKi8KKwltb3Z3CSVzcCwgJXNpCisKKwkvKiBUaGlzIGNodW5rIGlzIHNraXBwZWQgaWYgd2UgaGF2ZSBlYmlvcyAqLworCS8qIERvIG5vdCBjbG9iYmVyICVlYXggYmVmb3JlIHRoaXMgY2h1bmshICovCisJLyogVGhpcyBhbHNvIHJlbGllcyBvbiAlYnggYW5kICVlZHggYXMgc2V0IHVwIGFib3ZlLiAqLworcmVhZF9zZWN0b3JfY2Jpb3M6CisJZGl2bAkoc2VjcGVyY3lsKQorCXNobGIJJDYsICVhaAorCW1vdmIJJWFoLCAlY2wKKwltb3ZiCSVhbCwgJWNoCisJeGNoZ3cJJWR4LCAlYXgKKwlkaXZiCShzZWN0b3JzKQorCW1vdmIJJWFsLCAlZGgKKwlvcmIJJWFoLCAlY2wKKwlpbmN3CSVjeAkvKiBTZWN0b3JzIGFyZSAxLWJhc2VkICovCisJbW92dwkkMHgwMjAxLCAlYXgKKworcmVhZF9jb21tb246CisJbW92YgkoZHJpdmVubyksICVkbAorCWludAkkMHgxMworCWxlYXcJMTYoJXNpKSwgJXNwCS8qIERyb3AgREFQQSAqLworCXBvcGFsCisJcmV0CisKKy8qCisgKiByZWFkX3BhcnRpdGlvbl90YWJsZToKKyAqCVJlYWQgYSBwYXJ0aXRpb24gdGFibGUgKHBvaW50ZWQgdG8gYnkgJWVheCksIGFuZCBjb3B5CisgKgl0aGUgcGFydGl0aW9uIHRhYmxlIGludG8gdGhlIHB0YWIgYnVmZmVyLgorICoKKyAqCUNsb2JiZXJzICVzaSwgJWRpLCBhbmQgJWN4LCBvdGhlciByZWdpc3RlcnMgcHJlc2VydmVkLgorICoJJWN4ID0gMCBvbiBleGl0LgorICoKKyAqCU9uIGVycm9yLCBDRiBpcyBzZXQgYW5kIHB0YWIgaXMgb3ZlcndyaXR0ZW4gd2l0aCBqdW5rLgorICovCitwdGFiCT0gX3N0YXJ0KzQ0NgorCityZWFkX3BhcnRpdGlvbl90YWJsZToKKwljYWxsCXJlYWRfc2VjdG9yCisJbW92dwkkYm9vdHNlYys0NDYsICVzaQorCW1vdncJJHB0YWIsICVkaQorCW1vdncJJCgxNio0LzIpLCAlY3gKKwlyZXAgOyBtb3ZzdworCXJldAorCisvKgorICogc2Nhbl9wYXJ0aXRpb25fdGFibGU6CisgKglTY2FuIGEgcGFydGl0aW9uIHRhYmxlIGN1cnJlbnRseSBsb2FkZWQgaW4gdGhlIHBhcnRpdGlvbiB0YWJsZQorICoJYXJlYS4gIFByZXNlcnZlIGFsbCByZWdpc3RlcnMuCisgKgorICogICAgICBPbiBlbnRyeToKKyAqCSAgJWVheCAtIGJhc2UgKGxvY2F0aW9uIG9mIHRoaXMgcGFydGl0aW9uIHRhYmxlKQorICoJICAlZWR4IC0gcm9vdCAob2Zmc2V0IGZyb20gTUJSLCBvciAwIGZvciBNQlIpCisgKgorICogICAgICBUaGVzZSBnZXQgcHVzaGVkIGludG8gc3RhY2sgc2xvdHM6CisgKiAgICAgICAgMjgoJWJwKSAtICVlYXggLSBiYXNlCisgKgkgIDIwKCVicCkgLSAlZWR4IC0gcm9vdAorICovCisKK3NjYW5fcGFydGl0aW9uX3RhYmxlOgorCXB1c2hhbAorCW1vdncJJXNwLCAlYnAKKworCS8qIFNlYXJjaCBmb3IgYWN0aXZlIHBhcnRpdGlvbnMgKi8KKwltb3Z3CSRwdGFiLCAlYngKKwltb3Z3CSQ0LCAlY3gKKwl4b3J3CSVheCwgJWF4CisJcHVzaAklYngKKwlwdXNoCSVjeAorNToKKwl0ZXN0YgkkMHg4MCwgKCVieCkKKwlqegk2ZgorCWluY3cJJWF4CisJbW92dwklYngsICVzaQorNjoKKwlhZGR3CSQxNiwgJWJ4CisJbG9vcHcJNWIKKworCWRlY3cJJWF4CQkvKiBOdW1iZXIgb2YgYWN0aXZlIHBhcnRpdGlvbnMgZm91bmQgKi8KKwlqeglib290CisJam5zCXRvb19tYW55X2FjdGl2ZQorCisJLyogTm8gYWN0aXZlIHBhcnRpdGlvbnMgZm91bmQsIGxvb2sgZm9yIGV4dGVuZGVkIHBhcnRpdGlvbnMgKi8KKwlwb3B3CSVjeAkJLyogJWN4IDwtIDQgICAgKi8KKwlwb3B3CSVieAkJLyogJWJ4IDwtIHB0YWIgKi8KKzc6CisJbW92Ygk0KCVieCksICVhbAorCWNtcGIJJDB4MGYsICVhbAkvKiAweDBmID0gV2luOXggZXh0ZW5kZWQgKi8KKwlqZQk4ZgorCWFuZGIJJH4weDgwLCAlYWwJLyogMHg4NSA9IExpbnV4IGV4dGVuZGVkICovCisJY21wYgkkMHgwNSwgJWFsCS8qIDB4MDUgPSBNUy1ET1MgZXh0ZW5kZWQgKi8KKwlqbmUJOWYKKworCS8qIEl0IGlzIGFuIGV4dGVuZGVkIHBhcnRpdGlvbi4gIFJlYWQgdGhlIGV4dGVuZGVkIHBhcnRpdGlvbiBhbmQKKwkgICB0cnkgdG8gc2NhbiBpdC4gIElmIHRoZSBzY2FuIHJldHVybnMsIHJlLWxvYWQgdGhlIGN1cnJlbnQKKwkgICBwYXJ0aXRpb24gdGFibGUgYW5kIHJlc3VtZSBzY2FuLiAqLworODoKKwltb3ZsCTgoJWJ4KSwgJWVheAkJLyogUGFydGl0aW9uIHRhYmxlIG9mZnNldCAqLworCW1vdmwJMjAoJWJwKSwgJWVkeAkJLyogIlJvb3QiICovCisJYWRkbAklZWR4LCAlZWF4CQkvKiBDb21wdXRlIGxvY2F0aW9uIG9mIG5ldyBwdGFiICovCisJYW5kbAklZWR4LCAlZWR4CQkvKiBJcyB0aGlzIHRoZSBNQlI/ICovCisJam56CTEwZgorCW1vdmwJJWVheCwgJWVkeAkJLyogT2Zmc2V0IC0+IHJvb3QgaWYgdGhpcyB3YXMgTUJSICovCisxMDoKKwljYWxsCXJlYWRfcGFydGl0aW9uX3RhYmxlCisJamMJMTFmCisJY2FsbAlzY2FuX3BhcnRpdGlvbl90YWJsZQorMTE6CisJLyogVGhpcyByZXR1cm5lZCwgc28gd2UgbmVlZCB0byByZWxvYWQgdGhlIGN1cnJlbnQgcGFydGl0aW9uIHRhYmxlICovCisJbW92bAkyOCglYnApLCAlZWF4CQkvKiAiQmFzZSIgKi8KKwljYWxsCXJlYWRfcGFydGl0aW9uX3RhYmxlCisKKwkvKiBmYWxsIHRocm91Z2ggKi8KKzk6CisJLyogTm90IGFuIGV4dGVuZGVkIHBhcnRpdGlvbiAqLworCWFkZHcJJDE2LCAlYngKKwlsb29wdwk3YgorCisJLyogTm90aGluZyBmb3VuZCwgcmV0dXJuICovCisJcG9wYWwKKwlyZXQKKwordG9vX21hbnlfYWN0aXZlOgorCWNhbGwJZXJyb3IKKwkuYXNjaWkJIk11bHRpcGxlIGFjdGl2ZSBwYXJ0aXRpb25zLlxyXG4iCisKKy8qCisgKiBib290OiBpbnZva2UgdGhlIGFjdHVhbCBib290c3RyYXAuICglc2kpIHBvaW50cyB0byB0aGUgcGFydGl0aW9uCisgKgkgdGFibGUgZW50cnksIGFuZCAyOCglYnApIGhhcyB0aGUgcGFydGl0aW9uIHRhYmxlIGJhc2UuCisgKi8KK2Jvb3Q6CisJbW92bAk4KCVzaSksICVlYXgKKwlhZGRsCTI4KCVicCksICVlYXgKKwltb3ZsCSVlYXgsIDgoJXNpKQkvKiBBZGp1c3QgaW4tbWVtb3J5IHBhcnRpdGlvbiB0YWJsZSBlbnRyeSAqLworCWNhbGwJcmVhZF9zZWN0b3IKKwlqYwlkaXNrX2Vycm9yCisKKwkvKiBDaGVjayBpZiB0aGUgcmVhZCBzZWN0b3IgaXMgYSBYRlMgc3VwZXJibG9jayAqLworCWNtcGwJJDB4NDI1MzQ2NTgsIChib290c2VjKSAvKiAiWEZTQiIgKi8KKwlqbmUJbm9feGZzCisKKwkvKiBXZSBwdXQgdGhlIFN5c2xpbnV4IGJvb3Qgc2VjdG9yIGF0IG9mZnNldCAweDgwMCAoNCBzZWN0b3JzKSwgc28gd2UKKwkgKiBuZWVkIHRvIGFkanVzdCAlZWF4ICglZWF4ICsgNCkgdG8gcmVhZCB0aGUgcmlnaHQgc2VjdG9yIGludG8gMHg3QzAwLgorCSAqLworCWFkZGwJJDB4ODAwID4+IDB4MDksICVlYXggLyogcGx1cyA0IHNlY3RvcnMgKi8KKwljYWxsCXJlYWRfc2VjdG9yCisJamMJZGlza19lcnJvcgorCitub194ZnM6CisJY21wdwkkMHhhYTU1LCAoYm9vdHNlYys1MTApCisJam5lCW1pc3Npbmdfb3MJCS8qIE5vdCBhIHZhbGlkIGJvb3Qgc2VjdG9yICovCisJbW92dwkkZHJpdmVubywgJXNwCS8qIGRyaXZlbm8gPT0gYm9vdHNlYy02ICovCisJcG9wdwklZHgJCS8qIGRsIC0+IGRyaXZlIG51bWJlciAqLworCXBvcHcJJWRpCQkvKiBlczpkaSAtPiAkUG5QIHZlY3RvciAqLworCXBvcHcJJWVzCisJY2xpCisJam1wdwkqJXNwCQkvKiAlc3AgPT0gYm9vdHNlYyAqLworCitkaXNrX2Vycm9yOgorCWNhbGwJZXJyb3IKKwkuYXNjaWkJIk9wZXJhdGluZyBzeXN0ZW0gbG9hZCBlcnJvci5cclxuIgorCisvKgorICogUHJpbnQgZXJyb3IgbWVzc2FnZXMuICBUaGlzIGlzIGludm9rZWQgd2l0aCAiY2FsbCIsIHdpdGggdGhlCisgKiBlcnJvciBtZXNzYWdlIGF0IHRoZSByZXR1cm4gYWRkcmVzcy4KKyAqLworZXJyb3I6CisJcG9wdwklc2kKKzI6CisJbG9kc2IKKwltb3ZiCSQweDBlLCAlYWgKKwltb3ZiCShCSU9TX3BhZ2UpLCAlYmgKKwltb3ZiCSQweDA3LCAlYmwKKwlpbnQJJDB4MTAJCS8qIE1heSBkZXN0cm95ICVicCAqLworCWNtcGIJJDEwLCAlYWwJLyogTmV3bGluZT8gKi8KKwlqbmUJMmIKKworCWludAkkMHgxOAkJLyogQm9vdCBmYWlsdXJlICovCitkaWU6CisJaGx0CisJam1wCWRpZQpkaWZmIC0tZ2l0IGEvbWJyL21ici5sZCBiL21ici9tYnIubGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0YmE4MAotLS0gL2Rldi9udWxsCisrKyBiL21ici9tYnIubGQKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpbmtlciBzY3JpcHQgZm9yIE1CUgorICovCisKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFWFRFUk4oX3N0YXJ0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAweDYwMDsKKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQqKQorICAgICooLnJvZGF0YSopCisgIH0gPTB4OTA5MDkwOTAKKworICAuID0gQUxJR04oNCk7CisgIC5kYXRhCQkgIDoKKyAgeworICAgICooLmRhdGEqKQorICB9CisKKyAgLiA9IEFMSUdOKDEyOCk7CisgIC5ic3MJCSAgOgorICB7CisgICAgKiguYnNzKikKKyAgfQorCisgIC4gPSAweDdjMDA7CisgIC5ib290c2VjCSAgOgorICB7CisgICAgKiguYm9vdHNlYykKKyAgfQorCisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSB9Cit9CmRpZmYgLS1naXQgYS9tYnIvb2xkbWJyLmFzbSBiL21ici9vbGRtYnIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmIwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9tYnIvb2xkbWJyLmFzbQpAQCAtMCwwICsxLDIzMCBAQAorOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgIENvcHlyaWdodCAyMDAzLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCis7Cis7ICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKzsgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorOyAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKzsgICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKzsgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKzsgICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCis7ICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCis7ICAgY29uZGl0aW9uczoKKzsKKzsgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorOyAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorOworOyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorOyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworOyAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECis7ICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKzsgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKzsgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKzsgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCis7ICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorOworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Cis7IG1ici5hc20KKzsKKzsgU2ltcGxlIE1hc3RlciBCb290IFJlY29yZCwgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIEVCSU9TIGV4dGVuc2lvbnMuCis7Cis7IFRoZSBNQlIgbGl2ZXMgaW4gZnJvbnQgb2YgdGhlIGJvb3Qgc2VjdG9yLCBhbmQgaXMgcmVzcG9uc2libGUgZm9yCis7IGxvYWRpbmcgdGhlIGJvb3Qgc2VjdG9yIG9mIHRoZSBhY3RpdmUgcGFydGl0aW9uLiAgVGhlIEVCSU9TIHN1cHBvcnQKKzsgaXMgbmVlZGVkIGlmIHRoZSBhY3RpdmUgcGFydGl0aW9uIHN0YXJ0cyBiZXlvbmQgY3lsaW5kZXIgMTAyNC4KKzsKKzsgVGhpcyBNQlIgZGV0ZXJtaW5lcyBhbGwgZ2VvbWV0cnkgaW5mbyBhdCBydW50aW1lLiAgSXQgdXNlcyBvbmx5IHRoZQorOyBsaW5lYXIgYmxvY2sgZmllbGQgaW4gdGhlIHBhcnRpdGlvbiB0YWJsZS4gIEl0IGRvZXMsIGhvd2V2ZXIsIHBhc3MKKzsgdGhlIHBhcnRpdGlvbiB0YWJsZSBpbmZvcm1hdGlvbiB1bmNoYW5nZWQgdG8gdGhlIHRhcmdldCBPUy4KKzsKKzsgVGhpcyBNQlIgc2hvdWxkIGJlICI4MDg2LWNsZWFuIiwgaS5lLiBub3QgcmVxdWlyZSBhIDM4Ni4KKzsKKworJWluY2x1ZGUgImJpb3MuaW5jIgorCis7Cis7IE5vdGU6IFRoZSBNQlIgaXMgYWN0dWFsbHkgbG9hZGVkIGF0IDA6N0MwMGgsIGJ1dCB3ZSBxdWlja2x5IG1vdmUgaXQgZG93biB0bworOyAwNjAwaC4KKzsKKwkJc2VjdGlvbiAudGV4dAorCQljcHUgODA4NgorCQlvcmcgMDYwMGgKKworX3N0YXJ0OgkJY2xpCisJCXhvciBheCxheAorCQltb3YgZHMsYXgKKwkJbW92IGVzLGF4CisJCW1vdiBzcyxheAorCQltb3Ygc3AsN0MwMGgKKwkJc3RpCisJCWNsZAorCQltb3Ygc2ksc3AJCTsgU3RhcnQgYWRkcmVzcworCQltb3YgZGksMDYwMGgJCTsgRGVzdGluYXRpb24gYWRkcmVzcworCQltb3YgY3gsNTEyLzIKKwkJcmVwIG1vdnN3CisKKzsKKzsgTm93LCBqdW1wIHRvIHRoZSBjb3B5IGF0IDA2MDBoIHNvIHdlIGNhbiBsb2FkIHRoZSBib290IHNlY3RvciBhdCA3QzAwaC4KKzsgU2luY2Ugc29tZSBCSU9TZXMgc2VlbSB0byB0aGluayAwMDAwOjdDMDBoIGFuZCAwN0MwOjAwMDBoIGFyZSB0aGUgc2FtZQorOyB0aGluZywgdXNlIGEgZmFyIGp1bXAgdG8gY2Fub25pY2FsaXplIHRoZSBhZGRyZXNzLiAgVGhpcyBhbHNvIG1ha2VzCis7IHN1cmUgdGhhdCBpdCBpcyBhIGNvZGUgc3BlY3VsYXRpb24gYmFycmllci4KKzsKKworCQlqbXAgMDpuZXh0CQk7IEp1bXAgdG8gY29weSBhdCAwNjAwaAorCituZXh0OgorCQltb3YgW0RyaXZlTm9dLCBkbAkJOyBEcml2ZSBudW1iZXIgc3RvcmVkIGluIERMCis7Cis7IENoZWNrIGZvciBDSFMgcGFyYW1ldGVycy4gIFRoaXMgZG9lc24ndCB3b3JrIG9uIGZsb3BweSBkaXNrcywKKzsgYnV0IGZvciBhbiBNQlIgd2UgZG9uJ3QgY2FyZS4KKzsKKwkJbW92IGFoLDA4aAkJCTsgR2V0IGRyaXZlIHBhcmFtZXRlcnMKKwkJaW50IDEzaAorCQlhbmQgY3gsM0ZoCQkJOyBNYXggc2VjdG9yIG51bWJlcgorCQltb3YgW1NlY3RvcnNdLGN4CisJCXhvciBheCxheAorCQltb3YgYWwsZGgKKwkJaW5jIGF4CQkJCTsgRnJvbSAwLWJhc2VkIHRvIGNvdW50CisJCW11bCBjeAkJCQk7IEhlYWRzKlNlY3RvcnMKKwkJbW92IFtTZWNQZXJDeWxdLGF4CisJCTsgTm90ZTogd2UgYWN0dWFsbHkgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbnVtYmVyIG9mCisJCTsgY3lsaW5kZXJzLCBzaW5jZSB0aGF0J3MgdGhlIGhpZ2hlc3Qtb3JkZXIgZGl2aXNpb24KKworOworOyBOb3cgbG9vayBmb3Igb25lIChhbmQgb25seSBvbmUpIGFjdGl2ZSBwYXJ0aXRpb24uCis7CisJCW1vdiBzaSxQYXJ0aXRpb25UYWJsZQorCQl4b3IgYXgsYXgKKwkJbW92IGN4LDQKK2NoZWNrcGFydGxvb3A6CisJCXRlc3QgYnl0ZSBbc2ldLDgwaAorCQlqeiAubm90YWN0aXZlCisJCWluYyBheAorCQltb3YgZGksc2kKKy5ub3RhY3RpdmU6CWFkZCBzaSxieXRlIDE2CisJCWxvb3AgY2hlY2twYXJ0bG9vcAorCisJCWNtcCBheCxieXRlIDEJCQk7IEJldHRlciBiZSBvbmx5IG9uZQorCQlqbnogbm90X29uZV9wYXJ0aXRpb24KKworOworOyBOb3cgd2UgaGF2ZSB0aGUgYWN0aXZlIHBhcnRpdGlvbiBwYXJ0aXRpb24gaW5mb3JtYXRpb24gaW4gRFM6REkuCis7IENoZWNrIHRvIHNlZSBpZiB3ZSBzdXBwb3J0IEVCSU9TLgorOworCQltb3YgZGwsW0RyaXZlTm9dCisJCW1vdiBheCw0MTAwaAorCQltb3YgYngsMDU1QUFoCisJCXhvciBjeCxjeAorCQl4b3IgZGgsZGgKKwkJc3RjCisJCWludCAxM2gKKwkJamMgbm9fZWJpb3MKKwkJY21wIGJ4LDBBQTU1aAorCQlqbmUgbm9fZWJpb3MKKwkJdGVzdCBjbCwxCQkJOyBMQkEgZGV2aWNlIGFjY2VzcworCQlqeiBub19lYmlvcworOworOyBXZSBoYXZlIEVCSU9TLiAgTG9hZCB0aGUgYm9vdCBzZWN0b3IgdXNpbmcgTEJBLgorOworCQlwdXNoIGRpCisJCW1vdiBzaSxkYXBhCisJCW1vdiBieCxbZGkrOF0JCQk7IENvcHkgdGhlIGJsb2NrIGFkZHJlc3MKKwkJbW92IFtzaSs4XSxieAorCQltb3YgYngsW2RpKzEwXQorCQltb3YgW3NpKzEwXSxieAorCQltb3YgZGwsW0RyaXZlTm9dCisJCW1vdiBhaCw0MmgJCQk7IEV4dGVuZGVkIFJlYWQKKwkJam1wIHNob3J0IGNvbW1vbl90YWlsCis7Cis7IE5vIEVCSU9TLiAgTG9hZCB0aGUgYm9vdCBzZWN0b3IgdXNpbmcgQ0hTLgorOworbm9fZWJpb3M6CisJCXB1c2ggZGkKKwkJbW92IGF4LFtkaSs4XQorCQltb3YgZHgsW2RpKzEwXQorCQlkaXYgd29yZCBbU2VjUGVyQ3lsXQk7IEFYID0gY3lsaW5kZXIgRFggPSBzZWMgaW4gY3lsCisJCXJvciBhaCwxCisJCXJvciBhaCwxCisJCW1vdiBjbCxhaAorCQltb3YgY2gsYWwJCQk7IENMID0gY3lsWzk6OF0sIENIID0gY3lsWzc6MF0KKworCQltb3YgYXgsZHgKKwkJZGl2IGJ5dGUgW1NlY3RvcnNdCQk7IEFMID0gaGVhZCBBSCA9IHNlY3RvcgorCQltb3YgZGgsYWwKKwkJaW5jIGFoCisJCW9yIGNsLGFoCQkJOyBDWCA9IGN5bGluZGVyIGFuZCBzZWN0b3IKKworCQltb3YgZGwsW0RyaXZlTm9dCisJCW1vdiBieCw3QzAwaAorCQltb3YgYXgsMDIwMWgJCQk7IFJlYWQgb25lIHNlY3RvcgorY29tbW9uX3RhaWw6CisJCWludCAxM2gKKwkJamMgZGlza19lcnJvcgorCQlwb3Agc2kJCQkJOyBEUzpTSSAtPiBwYXJ0aXRpb24gdGFibGUgZW50cnkKKzsKKzsgVmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIGJvb3Qgc2VjdG9yLCBqdW1wCis7CisJCWNtcCB3b3JkIFs3QzAwaCs1MTBdLDBBQTU1aAorCQlqbmUgbWlzc2luZ19vcworCQljbGkKKwkJam1wIDA6N0MwMGgJCQk7IEp1bXAgdG8gYm9vdCBzZWN0b3I7IGZhcgorCQkJCQkJOyBqdW1wIGlzIHNwZWN1bGF0aW9uIGJhcnJpZXIKKwkJCQkJCTsgKFByb2JhYmx5IG5vdCBuZWVjZXNzYXJ5LCBidXQKKwkJCQkJCTsgdGhlcmUgaXMgcGxlbnR5IG9mIHNwYWNlLikKKworbm90X29uZV9wYXJ0aXRpb246CisJCWphIHRvb19tYW55X29zCittaXNzaW5nX29zOgorCQltb3Ygc2ksbWlzc2luZ19vc19tc2cKKwkJam1wIHNob3J0IGRpZQordG9vX21hbnlfb3M6CitkaXNrX2Vycm9yOgorCQltb3Ygc2ksYmFkX2Rpc2tfbXNnCitkaWU6CisubXNnbG9vcDoKKwkJbG9kc2IKKwkJYW5kIGFsLGFsCisJCWp6IC5ub3cKKwkJbW92IGFoLDBFaAkJCTsgVFRZIG91dHB1dAorCQltb3YgYmgsW0JJT1NfcGFnZV0JCTsgQ3VycmVudCBwYWdlCisJCW1vdiBibCwwN2gKKwkJaW50IDEwaAorCQlqbXAgc2hvcnQgLm1zZ2xvb3AKKy5ub3c6CisJCWptcCBzaG9ydCAubm93CisKKwkJYWxpZ24gNCwgZGIgMAkJCTsgQmVnaW4gZGF0YSBhcmVhCisKKzsKKzsgRUJJT1MgZGlzayBhZGRyZXNzIHBhY2tldAorOworZGFwYToKKwkJZHcgMTYJCQkJOyBQYWNrZXQgc2l6ZQorLmNvdW50OgkJZHcgMQkJCQk7IEJsb2NrIGNvdW50Cisub2ZmOgkJZHcgN0MwMGgJCQk7IE9mZnNldCBvZiBidWZmZXIKKy5zZWc6CQlkdyAwCQkJCTsgU2VnbWVudCBvZiBidWZmZXIKKy5sYmE6CQlkZCAwCQkJCTsgTEJBIChMU1cpCisJCWRkIDAJCQkJOyBMQkEgKE1TVykKKworOyBDSFMgaW5mb3JtYXRpb24KK1NlY1BlckN5bDoJZHcgMAkJCQk7IEhlYWRzKlNlY3RvcnMKK1NlY3RvcnM6CWR3IDAKKworOyBFcnJvciBtZXNzYWdlcworbWlzc2luZ19vc19tc2cJZGIgJ01pc3Npbmcgb3BlcmF0aW5nIHN5c3RlbScsIDEzLCAxMCwgMAorYmFkX2Rpc2tfbXNnCWRiICdPcGVyYXRpbmcgc3lzdGVtIGxvYWRpbmcgZXJyb3InLCAxMywgMTAsIDAKKworOworOyBNYXhpbXVtIE1CUiBzaXplOiA0NDYgYnl0ZXM7IGVuZC1vZi1ib290LXNlY3RvciBzaWduYXR1cmUgYWxzbyBuZWVkZWQuCis7IE5vdGUgdGhhdCBzb21lIG9wZXJhdGluZyBzeXN0ZW1zIChOVCwgRFItRE9TKSBwdXQgYWRkaXRpb25hbCBzdHVmZiBhdAorOyB0aGUgZW5kIG9mIHRoZSBNQlIsIHNvIHNob3J0ZXIgaXMgYmV0dGVyLiAgTG9jYXRpb24gNDQwIGlzIGtub3duIHRvCis7IGhhdmUgYSA0LWJ5dGUgYXR0ZW1wdC1hdC11bmlxdWUtSUQgZm9yIHNvbWUgT1Nlcy4KKzsKKworUGFydGl0aW9uVGFibGUJZXF1ICQkKzQ0NgkJCTsgU3RhcnQgb2YgcGFydGl0aW9uIHRhYmxlCisKKzsKKzsgQlNTIGRhdGE7IHB1dCBhdCA4MDBoCis7CitEcml2ZU5vCQllcXUgMDgwMGgKZGlmZiAtLWdpdCBhL21ici94ODZfNjQvbWJyLmxkIGIvbWJyL3g4Nl82NC9tYnIubGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyN2Q0OQotLS0gL2Rldi9udWxsCisrKyBiL21ici94ODZfNjQvbWJyLmxkCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciBNQlIKKyAqLworCisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFWFRFUk4oX3N0YXJ0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAweDYwMDsKKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQqKQorICAgICooLnJvZGF0YSopCisgIH0gPTB4OTA5MDkwOTAKKworICAuID0gQUxJR04oNCk7CisgIC5kYXRhCQkgIDoKKyAgeworICAgICooLmRhdGEqKQorICB9CisKKyAgLiA9IEFMSUdOKDEyOCk7CisgIC5ic3MJCSAgOgorICB7CisgICAgKiguYnNzKikKKyAgfQorCisgIC4gPSAweDdjMDA7CisgIC5ib290c2VjCSAgOgorICB7CisgICAgKiguYm9vdHNlYykKKyAgfQorCisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSB9Cit9CmRpZmYgLS1naXQgYS9tZW1kaXNrL01ha2VmaWxlIGIvbWVtZGlzay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU1N2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9NYWtlZmlsZQpAQCAtMCwwICsxLDEwMyBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5jbHVkZSAkKE1BS0VESVIpL2VtYmVkZGVkLm1rCistaW5jbHVkZSAkKHRvcGRpcikvdmVyc2lvbi5taworCitJTkNMVURFUyA9IC1JJCh0b3BkaXIpL2NvbTMyL2luY2x1ZGUgLUkkKG9iamRpcikKK0NGTEFHUyAgKz0gLURfX01FTURJU0tfXyAtRERBVEU9JyIkKERBVEUpIicgLW1yZWdwYXJtPTMgLURSRUdQQVJNPTMKK0xERkxBR1MgID0gJChHQ0NPUFQpIC1nCitOQVNNICAgICA9IG5hc20KK05BU01PUFQgID0gLU94CitORkxBR1MgICA9IC1kREFURT0nIiQoREFURSkiJworTklOQ0xVREUgPSAtSSQoU1JDKS8KKworVlBBVEggPSAkKFNSQykKK1NSQ1MJID0gJCh3aWxkY2FyZCAqLmFzbSAqLmMgKi5oKQorCisjIFRoZSBEQVRFIGlzIHNldCBvbiB0aGUgbWFrZSBjb21tYW5kIGxpbmUgd2hlbiBidWlsZGluZyBiaW5hcmllcyBmb3IKKyMgb2ZmaWNpYWwgcmVsZWFzZS4gIE90aGVyd2lzZSwgc3Vic3RpdHV0ZSBhIGhleCBzdHJpbmcgdGhhdCBpcyBwcmV0dHkgbXVjaAorIyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSB0byBiZSB1bmlxdWUgZnJvbSBidWlsZCB0byBidWlsZC4KK2lmbmRlZiBIRVhEQVRFCitIRVhEQVRFIDo9ICQoc2hlbGwgJChQRVJMKSAkKFNSQykvLi4vbm93LnBsICQoU1JDUykpCitlbmRpZgoraWZuZGVmIERBVEUKK0RBVEUgICAgOj0gJChzaGVsbCBzaCAkKFNSQykvLi4vZ2VuLWlkLnNoICQoVkVSU0lPTikgJChIRVhEQVRFKSkKK2VuZGlmCisKKyMgSW1wb3J0YW50OiBpbml0Lm8xNiBtdXN0IGJlIGZpcnN0ISEKK09CSlMxNiAgID0gaW5pdC5vMTYgaW5pdDMyLm8KK09CSlMzMiAgID0gc3RhcnQzMi5vIHNldHVwLm8gbXNldHVwLm8gZTgyMGZ1bmMubyBjb25pby5vIG1lbWNweS5vIG1lbXNldC5vIFwKKwkgICBtZW1tb3ZlLm8gdW56aXAubyBkc2twcm9iZS5vIGVsdG9yaXRvLm8gXAorCSAgIGN0eXBlcy5vIHN0cm50b3VtYXgubyBzdHJ0b3VsbC5vIHN1ZmZpeF9udW1iZXIubyBcCisJICAgbWVtZGlza19jaHNfNTEyLm8gbWVtZGlza19lZGRfNTEyLm8gXAorCSAgIG1lbWRpc2tfaXNvXzUxMi5vIG1lbWRpc2tfaXNvXzIwNDgubworCitDU1JDICAgICA9IHNldHVwLmMgbXNldHVwLmMgZTgyMGZ1bmMuYyBjb25pby5jIHVuemlwLmMgZHNrcHJvYmUuYyBlbHRvcml0by5jIFwKKwkgICBjdHlwZXMuYyBzdHJudG91bWF4LmMgc3RydG91bGwuYyBzdWZmaXhfbnVtYmVyLmMKK1NTUkMgICAgID0gc3RhcnQzMi5TIG1lbWNweS5TIG1lbXNldC5TIG1lbW1vdmUuUworTkFTTVNSQyAgPSBtZW1kaXNrX2Noc181MTIuYXNtIG1lbWRpc2tfZWRkXzUxMi5hc20gXAorCSAgIG1lbWRpc2tfaXNvXzUxMi5hc20gbWVtZGlza19pc29fMjA0OC5hc20gXAorCSAgIG1lbWRpc2sxNi5hc20KKworYWxsOiBtZW1kaXNrICMgZTgyMHRlc3QKKworIyB0aWR5LCBjbGVhbiByZW1vdmVzIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBmaW5hbCBiaW5hcnkKK3RpZHkgZGlzdDoKKwlybSAtZiAqLm8gKi5zICoudG1wICoubzE2ICouczE2ICouYmluICoubHN0ICouZWxmIGU4MjB0ZXN0IC4qLmQKKwlybSAtZiAqLm1hcAorCitjbGVhbjogdGlkeQorCisjIHNwb3RsZXNzIGFsc28gcmVtb3ZlcyB0aGUgcHJvZHVjdCBiaW5hcnkKK3Nwb3RsZXNzOiBjbGVhbgorCXJtIC1mIG1lbWRpc2sgLmRlcGVuZAorCittZW1kaXNrMTYubzogbWVtZGlzazE2LmFzbQorCisjIENhbmNlbCBydWxlCislLm86ICUuYXNtCisKK21lbWRpc2sxNi5vOiBtZW1kaXNrMTYuYXNtCisJKCAkKE5BU00pIC1NIC1EREVQRU5EICQoTkZMQUdTKSAkKE5JTkNMVURFKSAtbyAkQCAkPCA7IGVjaG8gJycgKSA+IC4kQC5kIDsgdHJ1ZQorCSQoTkFTTSkgLWYgZWxmICQoTkFTTU9QVCkgJChORkxBR1MpICQoTklOQ0xVREUpIC1vICRAIC1sICQqLmxzdCAkPAorCisuUFJFQ0lPVVM6ICUuYmluCislLmJpbjogJS5hc20KKwkoICQoTkFTTSkgLU0gLURERVBFTkQgJChORkxBR1MpICQoTklOQ0xVREUpIC1vICRAICQ8IDsgZWNobyAnJyApID4gLiRALmQgOyB0cnVlCisJJChOQVNNKSAtZiBiaW4gJChOQVNNT1BUKSAkKE5GTEFHUykgJChOSU5DTFVERSkgLW8gJEAgLWwgJCoubHN0ICQ8CisKK21lbWRpc2tfJS5vOiBtZW1kaXNrXyUuYmluCisJJChMRCkgLXIgLWIgYmluYXJ5IC1vICRAICQ8CisKK21lbWRpc2sxNi5lbGY6ICQoT0JKUzE2KQorCSQoTEQpIC1UdGV4dCAwIC1vICRAICReCisKKyNtZW1kaXNrMzIuZWxmOiBtZW1kaXNrLmxkICQoT0JKUzMyKQorbWVtZGlzazMyLmVsZjogJChBUkNIKS9tZW1kaXNrLmxkICQoT0JKUzMyKQorCSQoTEQpIC1vICRAIC1UICReCisKKyUuYmluOiAlLmVsZgorCSQoT0JKQ09QWSkgLU8gYmluYXJ5ICQ8ICRACisKK21lbWRpc2s6IG1lbWRpc2sxNi5iaW4gbWVtZGlzazMyLmJpbiBwb3N0cHJvY2Vzcy5wbAorCSQoUEVSTCkgJChTUkMpL3Bvc3Rwcm9jZXNzLnBsICRAIG1lbWRpc2sxNi5iaW4gbWVtZGlzazMyLmJpbgorCitlODIwdGVzdDogZTgyMHRlc3QuYyBlODIwZnVuYy5jIG1zZXR1cC5jCisJJChDQykgLW0zMiAtZyAkKEdDQ1dBUk4pIC1EVEVTVCAtbyAkQCAkXgorCisjIFRoaXMgZmlsZSBjb250YWlucyB0aGUgdmVyc2lvbiBudW1iZXIsIHNvIGFkZCBhIGRlcGVuZGVuY3kgZm9yIGl0CitzZXR1cC5zOiAuLi92ZXJzaW9uCisKKyMgSW5jbHVkZSBkZXBlbmRlbmNpZXMgZmlsZQorLWluY2x1ZGUgLiouZApkaWZmIC0tZ2l0IGEvbWVtZGlzay9hY3BpLmggYi9tZW1kaXNrL2FjcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzJkMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9hY3BpLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJyb3duIDxtYnJvd25AZmVuc3lzdGVtcy5jby51az4uCisgKiBUaGlzIGZpbGUgZGVyaXZlZCBhbG1vc3QgaW4gaXRzIGVudGlyZXR5IGZyb20gZ1BYRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoqIEBmaWxlCisgKgorICogQUNQSSBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIEFuIEFDUEkgZGVzY3JpcHRpb24gaGVhZGVyCisgKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGNvbW1vbiB0byB0aGUgc3RhcnQgb2YgYWxsIEFDUEkgc3lzdGVtCisgKiBkZXNjcmlwdGlvbiB0YWJsZXMuCisgKi8KK01FTURJU0tfUEFDS0VEX1BSRUZJWAorc3RydWN0IGFjcGlfZGVzY3JpcHRpb25faGVhZGVyIHsKKwkvKiogQUNQSSBzaWduYXR1cmUgKDQgQVNDSUkgY2hhcmFjdGVycykgKi8KKwljaGFyIHNpZ25hdHVyZVs0XTsKKwkvKiogTGVuZ3RoIG9mIHRhYmxlLCBpbiBieXRlcywgaW5jbHVkaW5nIGhlYWRlciAqLworCXVpbnQzMl90IGxlbmd0aDsKKwkvKiogQUNQSSBTcGVjaWZpY2F0aW9uIG1pbm9yIHZlcnNpb24gbnVtYmVyICovCisJdWludDhfdCByZXZpc2lvbjsKKwkvKiogVG8gbWFrZSBzdW0gb2YgZW50aXJlIHRhYmxlID09IDAgKi8KKwl1aW50OF90IGNoZWNrc3VtOworCS8qKiBPRU0gaWRlbnRpZmljYXRpb24gKi8KKwljaGFyIG9lbV9pZFs2XTsKKwkvKiogT0VNIHRhYmxlIGlkZW50aWZpY2F0aW9uICovCisJY2hhciBvZW1fdGFibGVfaWRbOF07CisJLyoqIE9FTSByZXZpc2lvbiBudW1iZXIgKi8KKwl1aW50MzJfdCBvZW1fcmV2aXNpb247CisJLyoqIEFTTCBjb21waWxlciB2ZW5kb3IgSUQgKi8KKwljaGFyIGFzbF9jb21waWxlcl9pZFs0XTsKKwkvKiogQVNMIGNvbXBpbGVyIHJldmlzaW9uIG51bWJlciAqLworCXVpbnQzMl90IGFzbF9jb21waWxlcl9yZXZpc2lvbjsKK30gTUVNRElTS19QQUNLRURfUE9TVEZJWDsKKwpkaWZmIC0tZ2l0IGEvbWVtZGlzay9iZGEuaCBiL21lbWRpc2svYmRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhYzQ0MQotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svYmRhLmgKQEAgLTAsMCArMSw1NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDEtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIEFkZHJlc3NlcyBpbiB0aGUgemVybyBwYWdlICovCisjZGVmaW5lIEJJT1NfSU5UMTMJKDB4MTMqNCkJLyogSU5UIDEzaCB2ZWN0b3IgKi8KKyNkZWZpbmUgQklPU19JTlQxNQkoMHgxNSo0KQkvKiBJTlQgMTVoIHZlY3RvciAqLworI2RlZmluZSBCSU9TX0lOVDFFCSgweDFFKjQpCS8qIElOVCAxRWggdmVjdG9yICovCisjZGVmaW5lIEJJT1NfSU5UNDAJKDB4NDAqNCkJLyogSU5UIDEzaCB2ZWN0b3IgKi8KKyNkZWZpbmUgQklPU19JTlQ0MQkoMHg0MSo0KQkvKiBJTlQgNDFoIHZlY3RvciAqLworI2RlZmluZSBCSU9TX0lOVDQ2CSgweDQ2KjQpCS8qIElOVCA0NmggdmVjdG9yICovCisjZGVmaW5lIEJJT1NfQkFTRU1FTQkweDQxMwkJLyogQW1vdW50IG9mIERPUyBtZW1vcnkgKi8KKyNkZWZpbmUgQklPU19FUVVJUAkweDQxMAkJLyogQklPUyBlcXVpcG1lbnQgbGlzdCAqLworI2RlZmluZSBCSU9TX0hEX0NPVU5UCTB4NDc1CQkvKiBOdW1iZXIgb2YgaGFyZCBkcml2ZXMgcHJlc2VudCAqLworCisvKiBBY2Nlc3MgdG8gb2JqZWN0cyBpbiB0aGUgemVybyBwYWdlICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3J6XzgodWludDMyX3QgYWRkciwgdWludDhfdCBkYXRhKQoreworICAgICooKHVpbnQ4X3QgKikgYWRkcikgPSBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3J6XzE2KHVpbnQzMl90IGFkZHIsIHVpbnQxNl90IGRhdGEpCit7CisgICAgKigodWludDE2X3QgKikgYWRkcikgPSBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3J6XzMyKHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IGRhdGEpCit7CisgICAgKigodWludDMyX3QgKikgYWRkcikgPSBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgcmR6XzgodWludDMyX3QgYWRkcikKK3sKKyAgICByZXR1cm4gKigodWludDhfdCAqKSBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCByZHpfMTYodWludDMyX3QgYWRkcikKK3sKKyAgICByZXR1cm4gKigodWludDE2X3QgKikgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgcmR6XzMyKHVpbnQzMl90IGFkZHIpCit7CisgICAgcmV0dXJuICooKHVpbnQzMl90ICopIGFkZHIpOworfQpkaWZmIC0tZ2l0IGEvbWVtZGlzay9jb21waWxlci5oIGIvbWVtZGlzay9jb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjAzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL2NvbXBpbGVyLmgKQEAgLTAsMCArMSw5IEBACisKKyNpZmRlZiBfX1dBVENPTUNfXworIyBkZWZpbmUgTUVNRElTS19QQUNLRURfUFJFRklYIF9QYWNrZWQKKyMgZGVmaW5lIE1FTURJU0tfUEFDS0VEX1BPU1RGSVgKKyNlbHNlCisvKiBBc3N1bWUgR05VIEMgZm9yIG5vdyAqLworIyBkZWZpbmUgTUVNRElTS19QQUNLRURfUFJFRklYCisjIGRlZmluZSBNRU1ESVNLX1BBQ0tFRF9QT1NURklYIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lbWRpc2svY29uaW8uYyBiL21lbWRpc2svY29uaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2JlMTNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9jb25pby5jCkBAIC0wLDAgKzEsMzk1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjb25pby5jCisgKgorICogT3V0cHV0IHRvIHRoZSBzY3JlZW4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibWVtZGlzay5oIgorI2luY2x1ZGUgImNvbmlvLmgiCisKK2ludCBwdXRjaGFyKGludCBjaCkKK3sKKyAgICBjb20zMnN5c190IHJlZ3M7CisgICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YgcmVncyk7CisKKyAgICBpZiAoY2ggPT0gJ1xuJykgeworCS8qIFxuIC0+IFxyXG4gKi8KKwlwdXRjaGFyKCdccicpOworICAgIH0KKworICAgIHJlZ3MuZWF4LndbMF0gPSAweDBlMDAgfCAoY2ggJiAweGZmKTsKKyAgICBpbnRjYWxsKDB4MTAsICZyZWdzLCBOVUxMKTsKKworICAgIHJldHVybiBjaDsKK30KKworaW50IHB1dHMoY29uc3QgY2hhciAqcykKK3sKKyAgICBpbnQgY291bnQgPSAwOworCisgICAgd2hpbGUgKCpzKSB7CisJcHV0Y2hhcigqcyk7CisJY291bnQrKzsKKwlzKys7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKgorICogT2gsIGl0J3MgYSB3YXN0ZSBvZiBzcGFjZSwgYnV0IG9oLXNvLXl1bW15IGZvciBkZWJ1Z2dpbmcuICBJdCdzIGp1c3QKKyAqIGluaXRpYWxpemF0aW9uIGNvZGUgYW55d2F5LCBzbyBpdCBkb2Vzbid0IHRha2UgdXAgc3BhY2Ugd2hlbiB3ZSdyZQorICogYWN0dWFsbHkgcnVubmluZy4gIFRoaXMgdmVyc2lvbiBvZiBwcmludGYoKSBkb2VzIG5vdCBpbmNsdWRlIDY0LWJpdAorICogc3VwcG9ydC4gICJMaXZlIHdpdGggaXQuIgorICoKKyAqIE1vc3Qgb2YgdGhpcyBjb2RlIHdhcyBzaGFtZWxlc3NseSBzbmFyZmVkIGZyb20gdGhlIExpbnV4IGtlcm5lbCwgdGhlbgorICogbW9kaWZpZWQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgaXNkaWdpdChpbnQgY2gpCit7CisgICAgcmV0dXJuIChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpOworfQorCitzdGF0aWMgaW50IHNraXBfYXRvaShjb25zdCBjaGFyICoqcykKK3sKKyAgICBpbnQgaSA9IDA7CisKKyAgICB3aGlsZSAoaXNkaWdpdCgqKnMpKQorCWkgPSBpICogMTAgKyAqKCgqcykrKykgLSAnMCc7CisgICAgcmV0dXJuIGk7Cit9CisKK3Vuc2lnbmVkIGludCBhdG91KGNvbnN0IGNoYXIgKnMpCit7CisgICAgdW5zaWduZWQgaW50IGkgPSAwOworICAgIHdoaWxlIChpc2RpZ2l0KCpzKSkKKwlpID0gaSAqIDEwICsgKCpzKysgLSAnMCcpOworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50IHN0cm5sZW4oY29uc3QgY2hhciAqcywgaW50IG1heGxlbikKK3sKKyAgICBjb25zdCBjaGFyICplcyA9IHM7CisgICAgd2hpbGUgKCplcyAmJiBtYXhsZW4pIHsKKwllcysrOworCW1heGxlbi0tOworICAgIH0KKworICAgIHJldHVybiAoZXMgLSBzKTsKK30KKworI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8KKyNkZWZpbmUgU0lHTgkyCQkvKiB1bnNpZ25lZC9zaWduZWQgbG9uZyAqLworI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLworI2RlZmluZSBTUEFDRQk4CQkvKiBzcGFjZSBpZiBwbHVzICovCisjZGVmaW5lIExFRlQJMTYJCS8qIGxlZnQganVzdGlmaWVkICovCisjZGVmaW5lIFNQRUNJQUwJMzIJCS8qIDB4ICovCisjZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAnYWJjZGVmJyAqLworCisjZGVmaW5lIGRvX2RpdihuLGJhc2UpICh7IFwKK2ludCBfX3JlczsgXAorX19yZXMgPSAoKHVuc2lnbmVkIGxvbmcpIG4pICUgKHVuc2lnbmVkKSBiYXNlOyBcCituID0gKCh1bnNpZ25lZCBsb25nKSBuKSAvICh1bnNpZ25lZCkgYmFzZTsgXAorX19yZXM7IH0pCisKK3N0YXRpYyBjaGFyICpudW1iZXIoY2hhciAqc3RyLCBsb25nIG51bSwgaW50IGJhc2UsIGludCBzaXplLCBpbnQgcHJlY2lzaW9uLAorCQkgICAgaW50IHR5cGUpCit7CisgICAgY2hhciBjLCBzaWduLCB0bXBbNjZdOworICAgIGNvbnN0IGNoYXIgKmRpZ2l0cyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICBpbnQgaTsKKworICAgIGlmICh0eXBlICYgTEFSR0UpCisJZGlnaXRzID0gIjAxMjM0NTY3ODlBQkNERUYiOworICAgIGlmICh0eXBlICYgTEVGVCkKKwl0eXBlICY9IH5aRVJPUEFEOworICAgIGlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpCisJcmV0dXJuIDA7CisgICAgYyA9ICh0eXBlICYgWkVST1BBRCkgPyAnMCcgOiAnICc7CisgICAgc2lnbiA9IDA7CisgICAgaWYgKHR5cGUgJiBTSUdOKSB7CisJaWYgKG51bSA8IDApIHsKKwkgICAgc2lnbiA9ICctJzsKKwkgICAgbnVtID0gLW51bTsKKwkgICAgc2l6ZS0tOworCX0gZWxzZSBpZiAodHlwZSAmIFBMVVMpIHsKKwkgICAgc2lnbiA9ICcrJzsKKwkgICAgc2l6ZS0tOworCX0gZWxzZSBpZiAodHlwZSAmIFNQQUNFKSB7CisJICAgIHNpZ24gPSAnICc7CisJICAgIHNpemUtLTsKKwl9CisgICAgfQorICAgIGlmICh0eXBlICYgU1BFQ0lBTCkgeworCWlmIChiYXNlID09IDE2KQorCSAgICBzaXplIC09IDI7CisJZWxzZSBpZiAoYmFzZSA9PSA4KQorCSAgICBzaXplLS07CisgICAgfQorICAgIGkgPSAwOworICAgIGlmIChudW0gPT0gMCkKKwl0bXBbaSsrXSA9ICcwJzsKKyAgICBlbHNlCisJd2hpbGUgKG51bSAhPSAwKQorCSAgICB0bXBbaSsrXSA9IGRpZ2l0c1tkb19kaXYobnVtLCBiYXNlKV07CisgICAgaWYgKGkgPiBwcmVjaXNpb24pCisJcHJlY2lzaW9uID0gaTsKKyAgICBzaXplIC09IHByZWNpc2lvbjsKKyAgICBpZiAoISh0eXBlICYgKFpFUk9QQUQgKyBMRUZUKSkpCisJd2hpbGUgKHNpemUtLSA+IDApCisJICAgICpzdHIrKyA9ICcgJzsKKyAgICBpZiAoc2lnbikKKwkqc3RyKysgPSBzaWduOworICAgIGlmICh0eXBlICYgU1BFQ0lBTCkgeworCWlmIChiYXNlID09IDgpCisJICAgICpzdHIrKyA9ICcwJzsKKwllbHNlIGlmIChiYXNlID09IDE2KSB7CisJICAgICpzdHIrKyA9ICcwJzsKKwkgICAgKnN0cisrID0gZGlnaXRzWzMzXTsKKwl9CisgICAgfQorICAgIGlmICghKHR5cGUgJiBMRUZUKSkKKwl3aGlsZSAoc2l6ZS0tID4gMCkKKwkgICAgKnN0cisrID0gYzsKKyAgICB3aGlsZSAoaSA8IHByZWNpc2lvbi0tKQorCSpzdHIrKyA9ICcwJzsKKyAgICB3aGlsZSAoaS0tID4gMCkKKwkqc3RyKysgPSB0bXBbaV07CisgICAgd2hpbGUgKHNpemUtLSA+IDApCisJKnN0cisrID0gJyAnOworICAgIHJldHVybiBzdHI7Cit9CisKK2ludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworICAgIGludCBsZW47CisgICAgdW5zaWduZWQgbG9uZyBudW07CisgICAgaW50IGksIGJhc2U7CisgICAgY2hhciAqc3RyOworICAgIGNvbnN0IGNoYXIgKnM7CisKKyAgICBpbnQgZmxhZ3M7CQkJLyogZmxhZ3MgdG8gbnVtYmVyKCkgKi8KKworICAgIGludCBmaWVsZF93aWR0aDsJCS8qIHdpZHRoIG9mIG91dHB1dCBmaWVsZCAqLworICAgIGludCBwcmVjaXNpb247CQkvKiBtaW4uICMgb2YgZGlnaXRzIGZvciBpbnRlZ2VyczsgbWF4CisJCQkJICAgbnVtYmVyIG9mIGNoYXJzIGZvciBmcm9tIHN0cmluZyAqLworICAgIGludCBxdWFsaWZpZXI7CQkvKiAnaCcsICdsJywgb3IgJ0wnIGZvciBpbnRlZ2VyIGZpZWxkcyAqLworCisgICAgZm9yIChzdHIgPSBidWY7ICpmbXQ7ICsrZm10KSB7CisJaWYgKCpmbXQgIT0gJyUnKSB7CisJICAgICpzdHIrKyA9ICpmbXQ7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qIHByb2Nlc3MgZmxhZ3MgKi8KKwlmbGFncyA9IDA7CityZXBlYXQ6CisJKytmbXQ7CQkJLyogdGhpcyBhbHNvIHNraXBzIGZpcnN0ICclJyAqLworCXN3aXRjaCAoKmZtdCkgeworCWNhc2UgJy0nOgorCSAgICBmbGFncyB8PSBMRUZUOworCSAgICBnb3RvIHJlcGVhdDsKKwljYXNlICcrJzoKKwkgICAgZmxhZ3MgfD0gUExVUzsKKwkgICAgZ290byByZXBlYXQ7CisJY2FzZSAnICc6CisJICAgIGZsYWdzIHw9IFNQQUNFOworCSAgICBnb3RvIHJlcGVhdDsKKwljYXNlICcjJzoKKwkgICAgZmxhZ3MgfD0gU1BFQ0lBTDsKKwkgICAgZ290byByZXBlYXQ7CisJY2FzZSAnMCc6CisJICAgIGZsYWdzIHw9IFpFUk9QQUQ7CisJICAgIGdvdG8gcmVwZWF0OworCX0KKworCS8qIGdldCBmaWVsZCB3aWR0aCAqLworCWZpZWxkX3dpZHRoID0gLTE7CisJaWYgKGlzZGlnaXQoKmZtdCkpCisJICAgIGZpZWxkX3dpZHRoID0gc2tpcF9hdG9pKCZmbXQpOworCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJICAgICsrZm10OworCSAgICAvKiBpdCdzIHRoZSBuZXh0IGFyZ3VtZW50ICovCisJICAgIGZpZWxkX3dpZHRoID0gdmFfYXJnKGFyZ3MsIGludCk7CisJICAgIGlmIChmaWVsZF93aWR0aCA8IDApIHsKKwkJZmllbGRfd2lkdGggPSAtZmllbGRfd2lkdGg7CisJCWZsYWdzIHw9IExFRlQ7CisJICAgIH0KKwl9CisKKwkvKiBnZXQgdGhlIHByZWNpc2lvbiAqLworCXByZWNpc2lvbiA9IC0xOworCWlmICgqZm10ID09ICcuJykgeworCSAgICArK2ZtdDsKKwkgICAgaWYgKGlzZGlnaXQoKmZtdCkpCisJCXByZWNpc2lvbiA9IHNraXBfYXRvaSgmZm10KTsKKwkgICAgZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKKwkJKytmbXQ7CisJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJcHJlY2lzaW9uID0gdmFfYXJnKGFyZ3MsIGludCk7CisJICAgIH0KKwkgICAgaWYgKHByZWNpc2lvbiA8IDApCisJCXByZWNpc2lvbiA9IDA7CisJfQorCisJLyogZ2V0IHRoZSBjb252ZXJzaW9uIHF1YWxpZmllciAqLworCXF1YWxpZmllciA9IC0xOworCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJykgeworCSAgICBxdWFsaWZpZXIgPSAqZm10OworCSAgICArK2ZtdDsKKwl9CisKKwkvKiBkZWZhdWx0IGJhc2UgKi8KKwliYXNlID0gMTA7CisKKwlzd2l0Y2ggKCpmbXQpIHsKKwljYXNlICdjJzoKKwkgICAgaWYgKCEoZmxhZ3MgJiBMRUZUKSkKKwkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkgICAgKnN0cisrID0gJyAnOworCSAgICAqc3RyKysgPSAodW5zaWduZWQgY2hhcil2YV9hcmcoYXJncywgaW50KTsKKwkgICAgd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkqc3RyKysgPSAnICc7CisJICAgIGNvbnRpbnVlOworCisJY2FzZSAncyc6CisJICAgIHMgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKKwkgICAgbGVuID0gc3RybmxlbihzLCBwcmVjaXNpb24pOworCisJICAgIGlmICghKGZsYWdzICYgTEVGVCkpCisJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkgICAgKnN0cisrID0gJyAnOworCSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCSpzdHIrKyA9ICpzKys7CisJICAgIHdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkqc3RyKysgPSAnICc7CisJICAgIGNvbnRpbnVlOworCisJY2FzZSAncCc6CisJICAgIGlmIChmaWVsZF93aWR0aCA9PSAtMSkgeworCQlmaWVsZF93aWR0aCA9IDIgKiBzaXplb2Yodm9pZCAqKTsKKwkJZmxhZ3MgfD0gWkVST1BBRDsKKwkgICAgfQorCSAgICBzdHIgPSBudW1iZXIoc3RyLAorCQkJICh1bnNpZ25lZCBsb25nKXZhX2FyZyhhcmdzLCB2b2lkICopLCAxNiwKKwkJCSBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CisJICAgIGNvbnRpbnVlOworCisJY2FzZSAnbic6CisJICAgIGlmIChxdWFsaWZpZXIgPT0gJ2wnKSB7CisJCWxvbmcgKmlwID0gdmFfYXJnKGFyZ3MsIGxvbmcgKik7CisJCSppcCA9IChzdHIgLSBidWYpOworCSAgICB9IGVsc2UgeworCQlpbnQgKmlwID0gdmFfYXJnKGFyZ3MsIGludCAqKTsKKwkJKmlwID0gKHN0ciAtIGJ1Zik7CisJICAgIH0KKwkgICAgY29udGludWU7CisKKwljYXNlICclJzoKKwkgICAgKnN0cisrID0gJyUnOworCSAgICBjb250aW51ZTsKKworCSAgICAvKiBpbnRlZ2VyIG51bWJlciBmb3JtYXRzIC0gc2V0IHVwIHRoZSBmbGFncyBhbmQgImJyZWFrIiAqLworCWNhc2UgJ28nOgorCSAgICBiYXNlID0gODsKKwkgICAgYnJlYWs7CisKKwljYXNlICdYJzoKKwkgICAgZmxhZ3MgfD0gTEFSR0U7CisJY2FzZSAneCc6CisJICAgIGJhc2UgPSAxNjsKKwkgICAgYnJlYWs7CisKKwljYXNlICdkJzoKKwljYXNlICdpJzoKKwkgICAgZmxhZ3MgfD0gU0lHTjsKKwljYXNlICd1JzoKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICAqc3RyKysgPSAnJSc7CisJICAgIGlmICgqZm10KQorCQkqc3RyKysgPSAqZm10OworCSAgICBlbHNlCisJCS0tZm10OworCSAgICBjb250aW51ZTsKKwl9CisJaWYgKHF1YWxpZmllciA9PSAnbCcpCisJICAgIG51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKwllbHNlIGlmIChxdWFsaWZpZXIgPT0gJ2gnKSB7CisJICAgIG51bSA9ICh1bnNpZ25lZCBzaG9ydCl2YV9hcmcoYXJncywgaW50KTsKKwkgICAgaWYgKGZsYWdzICYgU0lHTikKKwkJbnVtID0gKHNob3J0KW51bTsKKwl9IGVsc2UgaWYgKGZsYWdzICYgU0lHTikKKwkgICAgbnVtID0gdmFfYXJnKGFyZ3MsIGludCk7CisJZWxzZQorCSAgICBudW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKKwlzdHIgPSBudW1iZXIoc3RyLCBudW0sIGJhc2UsIGZpZWxkX3dpZHRoLCBwcmVjaXNpb24sIGZsYWdzKTsKKyAgICB9CisgICAgKnN0ciA9ICdcMCc7CisgICAgcmV0dXJuIHN0ciAtIGJ1ZjsKK30KKworI2lmIDAKK2ludCBzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCBpOworCisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICBpID0gdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm4gaTsKK30KKyNlbmRpZgorCitpbnQgdnByaW50Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKyAgICBjaGFyIHByaW50Zl9idWZbMjA0OF07CisgICAgaW50IHByaW50ZWQ7CisKKyAgICBwcmludGVkID0gdnNwcmludGYocHJpbnRmX2J1ZiwgZm10LCBhcmdzKTsKKyAgICBwdXRzKHByaW50Zl9idWYpOworICAgIHJldHVybiBwcmludGVkOworfQorCitpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICBpbnQgcHJpbnRlZDsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgcHJpbnRlZCA9IHZwcmludGYoZm10LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisgICAgcmV0dXJuIHByaW50ZWQ7Cit9CisKKy8qCisgKiBKdW1wIGhlcmUgaWYgYWxsIGhvcGUgaXMgZ29uZS4uLgorICovCit2b2lkIF9fYXR0cmlidXRlX18gKChub3JldHVybikpIGRpZShjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdnByaW50ZihmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworCisgICAgc3RpKCk7CisgICAgZm9yICg7OykKKwlhc20gdm9sYXRpbGUoImhsdCIpOworfQpkaWZmIC0tZ2l0IGEvbWVtZGlzay9jb25pby5oIGIvbWVtZGlzay9jb25pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzVlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL2NvbmlvLmgKQEAgLTAsMCArMSwzMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogY29uaW8uaAorICoKKyAqIExpbWl0ZWQgY29uc29sZSBJL08KKyAqLworCisjaWZuZGVmIENPTklPX0gKKyNkZWZpbmUgQ09OSU9fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBwdXRjaGFyKGludCk7CitpbnQgcHV0cyhjb25zdCBjaGFyICopOworaW50IHZwcmludGYoY29uc3QgY2hhciAqLCB2YV9saXN0IGFwKTsKK2ludCBwcmludGYoY29uc3QgY2hhciAqLCAuLi4pOwordm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIGRpZShjb25zdCBjaGFyICosIC4uLik7Cit1bnNpZ25lZCBpbnQgYXRvdShjb25zdCBjaGFyICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lbWRpc2svY3R5cGVzLmMgYi9tZW1kaXNrL2N0eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2NhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL2N0eXBlcy5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi9jb20zMi9saWIvY3R5cGVzLmMiCmRpZmYgLS1naXQgYS9tZW1kaXNrL2Rza3Byb2JlLmMgYi9tZW1kaXNrL2Rza3Byb2JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwYmY2NAotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svZHNrcHJvYmUuYwpAQCAtMCwwICsxLDIyOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgU2hhbyBNaWxsZXIgLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGRza3Byb2JlLmMKKyAqCisgKiBSb3V0aW5lcyBmb3IgcHJvYmluZyBCSU9TIGRpc2sgZHJpdmVzCisgKi8KKworLyogQ2hhbmdlIHRvIDEgZm9yIGRlYnVnZ2luZyAqLworI2RlZmluZSBEQkdfRFNLUFJPQkUgMAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibWVtZGlzay5oIgorI2luY2x1ZGUgImJkYS5oIgorI2luY2x1ZGUgImNvbmlvLmgiCisKKy8qIEZ1bmN0aW9uIHR5cGUgZm9yIHByaW50ZigpICovCit0eXBlZGVmIGludCAoZl9wcmludGYpIChjb25zdCBjaGFyICosIC4uLik7CisKKy8qIER1bW15IHByaW50ZigpIHRoYXQgZG9lcyBub3RoaW5nICovCitzdGF0aWMgZl9wcmludGYgbm9fcHJpbnRmOworc3RhdGljIGZfcHJpbnRmICpkc2twcm9iZV9wcmludGZzW10gPSB7IG5vX3ByaW50ZiwgcHJpbnRmIH07CisKKyNkZWZpbmUgZHNrcHJvYmVfcHJpbnRmIChkc2twcm9iZV9wcmludGZzW0RCR19EU0tQUk9CRV0pCisKK3N0YXRpYyB2b2lkIGRza3Byb2JlX3BhdXNlKGNvbTMyc3lzX3QgKik7CisKKy8qIFByb2JlIHJvdXRpbmUgZnVuY3Rpb24gdHlwZSAqLwordHlwZWRlZiBpbnQgKGZfcHJvYmUpICh1aW50OF90LCBjb20zMnN5c190ICopOworc3RhdGljIGZfcHJvYmUgcHJvYmVfaW50MTNoXzA4aCwgcHJvYmVfaW50MTNoXzE1aCwgcHJvYmVfaW50MTNoXzQxaDsKKworLyogV2Ugd2lsbCBwcm9iZSBhIEJJT1MgZHJpdmUgbnVtYmVyIHVzaW5nIElOVCAweDEzLCBBSCA9PSBmdW5jICovCitzdGF0aWMgdm9pZCBwcm9iZV9hbnkodWludDhfdCBmdW5jLCB1aW50OF90IGRyaXZlLCBjb20zMnN5c190ICogcmVncykKK3sKKyAgICByZWdzLT5lYXguYlsxXSA9IGZ1bmM7CS8qIEFIID09IHN1Yi1mdW5jdGlvbiBmb3IgcHJvYmUgKi8KKyAgICByZWdzLT5lZHguYlswXSA9IGRyaXZlOwkvKiBETCA9PSBkcml2ZSBudW1iZXIgdG8gcHJvYmUgKi8KKyAgICBpbnRjYWxsKDB4MTMsIHJlZ3MsIHJlZ3MpOworICAgIHJldHVybjsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIHJldHVybiBmcm9tIHByb2JlX2ludDEzaF8wMWggaW5kaWNhdGVzIGEgZmFpbHVyZTsgYQorICogcmV0dXJuIG9mIHplcm8gaW5kaWNhdGVzIG5vIGtub3duIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgcHJvYmVfaW50MTNoXzAxaF9mYWlsKGludCBpc3RhdHVzKQoreworICAgIGludCBzdGF0dXMgPSAwOworCisgICAgaWYgKGlzdGF0dXMgPj0gMjU2KQorCXN0YXR1cyA9IGlzdGF0dXM7CisgICAgZWxzZQorCXN3aXRjaCAoaXN0YXR1cykgeworCWNhc2UgMTogc3RhdHVzID0gaXN0YXR1czsKKwl9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBJTlQgMHgxMywgQUggPT0gMHgwMTogR2V0IHN0YXR1cyBvZiBsYXN0IGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgcHJvYmVfaW50MTNoXzAxaCh1aW50OF90IGRyaXZlKQoreworICAgIGludCBzdGF0dXM7CisgICAgY29tMzJzeXNfdCByZWdzOworCisgICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YgcmVncyk7CisgICAgcHJvYmVfYW55KDB4MDEsIGRyaXZlLCAmcmVncyk7CisgICAgc3RhdHVzID0gKHJlZ3MuZWZsYWdzLmwgJiAxKSAqIDI1NiArIHJlZ3MuZWF4LmJbMV07CisgICAgZHNrcHJvYmVfcHJpbnRmKCIgIEFIMDE6IENGJWQgQUglMDJ4IiwgcmVncy5lZmxhZ3MubCAmIDEsIHJlZ3MuZWF4LmJbMV0pOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogSU5UIDB4MTMsIEFIID09IDB4MDg6IEdldCBkcml2ZSBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgaW50IHByb2JlX2ludDEzaF8wOGgodWludDhfdCBkcml2ZSwgY29tMzJzeXNfdCAqIHJlZ3MpCit7CisgICAgaW50IHByZXNlbnQ7CisgICAgaW50IHN0YXR1czsKKworICAgIG1lbXNldChyZWdzLCAwLCBzaXplb2YgKnJlZ3MpOworICAgIHByb2JlX2FueSgweDA4LCBkcml2ZSwgcmVncyk7CisgICAgZHNrcHJvYmVfcHJpbnRmKCIgIEFIMDg6IENGJWQgQUglMDJ4IEFMJTAyeCBCTCUwMnggREwlMDJ4ICAgICIsCisJCSAgICByZWdzLT5lZmxhZ3MubCAmIDEsIHJlZ3MtPmVheC5iWzFdLCByZWdzLT5lYXguYlswXSwKKwkJICAgIHJlZ3MtPmVieC5iWzBdLCByZWdzLT5lZHguYlswXSk7CisgICAgcHJlc2VudCA9ICEocmVncy0+ZWZsYWdzLmwgJiAxKSAmJiAhcmVncy0+ZWF4LmJbMV07CisgICAgc3RhdHVzID0gcHJvYmVfaW50MTNoXzAxaChkcml2ZSk7CisgICAgcHJlc2VudCA9IHByZXNlbnQgJiYgIShwcm9iZV9pbnQxM2hfMDFoX2ZhaWwoc3RhdHVzKSk7CisgICAgZHNrcHJvYmVfcHJpbnRmKCIgIFAlZFxuIiwgIHByZXNlbnQpOworICAgIHJldHVybiBwcmVzZW50OworfQorCisvKioKKyAqIElOVCAweDEzLCBBSCA9PSAweDE1OiBHZXQgZGlzayB0eXBlLgorICovCitzdGF0aWMgaW50IHByb2JlX2ludDEzaF8xNWgodWludDhfdCBkcml2ZSwgY29tMzJzeXNfdCAqIHJlZ3MpCit7CisgICAgaW50IHByZXNlbnQ7CisgICAgaW50IHN0YXR1czsKKworICAgIG1lbXNldChyZWdzLCAwLCBzaXplb2YgKnJlZ3MpOworICAgIHByb2JlX2FueSgweDE1LCBkcml2ZSwgcmVncyk7CisgICAgZHNrcHJvYmVfcHJpbnRmKCIgIEFIMTU6IENGJWQgQUglMDJ4IEFMJTAyeCBDWCUwNHggRFglMDR4IiwKKwkJICAgIHJlZ3MtPmVmbGFncy5sICYgMSwgcmVncy0+ZWF4LmJbMV0sIHJlZ3MtPmVheC5iWzBdLAorCQkgICAgcmVncy0+ZWN4LndbMF0sIHJlZ3MtPmVkeC53WzBdKTsKKyAgICBwcmVzZW50ID0gIShyZWdzLT5lZmxhZ3MubCAmIDEpICYmIHJlZ3MtPmVheC5iWzFdOworICAgIHN0YXR1cyA9IHByb2JlX2ludDEzaF8wMWgoZHJpdmUpOworICAgIHByZXNlbnQgPSBwcmVzZW50ICYmICEocHJvYmVfaW50MTNoXzAxaF9mYWlsKHN0YXR1cykpOworICAgIGRza3Byb2JlX3ByaW50ZigiICBQJWRcbiIsICBwcmVzZW50KTsKKyAgICByZXR1cm4gcHJlc2VudDsKK30KKworLyoqCisgKiBJTlQgMHgxMywgQUggPT0gMHg0MTogSU5UIDB4MTMgZXh0ZW5zaW9ucyBpbnN0YWxsYXRpb24gY2hlY2suCisgKi8KK3N0YXRpYyBpbnQgcHJvYmVfaW50MTNoXzQxaCh1aW50OF90IGRyaXZlLCBjb20zMnN5c190ICogcmVncykKK3sKKyAgICBpbnQgcHJlc2VudDsKKyAgICBpbnQgc3RhdHVzOworCisgICAgbWVtc2V0KHJlZ3MsIDAsIHNpemVvZiAqcmVncyk7CisgICAgcmVncy0+ZWJ4LndbMF0gPSAweDU1QUE7CS8qIEJYID09IDB4NTVBQSAqLworICAgIHByb2JlX2FueSgweDQxLCBkcml2ZSwgcmVncyk7CisgICAgZHNrcHJvYmVfcHJpbnRmKCIgIEFINDE6IENGJWQgQUglMDJ4IEJYJTA0eCBDWCUwNHggREglMDJ4IiwKKwkJICAgIHJlZ3MtPmVmbGFncy5sICYgMSwgcmVncy0+ZWF4LmJbMV0sIHJlZ3MtPmVieC53WzBdLAorCQkgICAgcmVncy0+ZWN4LndbMF0sIHJlZ3MtPmVkeC5iWzFdKTsKKyAgICBwcmVzZW50ID0gIShyZWdzLT5lZmxhZ3MubCAmIDEpICYmIChyZWdzLT5lYngud1swXSA9PSAweEFBNTUpOworICAgIHN0YXR1cyA9IHByb2JlX2ludDEzaF8wMWgoZHJpdmUpOworICAgIHByZXNlbnQgPSBwcmVzZW50ICYmICEocHJvYmVfaW50MTNoXzAxaF9mYWlsKHN0YXR1cykpOworICAgIGRza3Byb2JlX3ByaW50ZigiICBQJWRcbiIsICBwcmVzZW50KTsKKyAgICByZXR1cm4gcHJlc2VudDsKK30KKworLyoKKyAqIFdlIHdpbGwgcHJvYmUgdGhlIEJJT1MgRGF0YSBBcmVhIGFuZCBjb3VudCB0aGUgZHJpdmVzIGZvdW5kIHRoZXJlLgorICogVGhpcyBoZXVyaXN0aWMgdGhlbiBhc3N1bWVzIHRoYXQgYWxsIGRyaXZlcyBvZiAnZHJpdmUncyB0eXBlIGFyZQorICogZm91bmQgaW4gYSBjb250aWd1b3VzIHJhbmdlLCBhbmQgcmV0dXJucyAxIGlmIHRoZSBwcm9iZWQgZHJpdmUKKyAqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgQkRBIGNvdW50LgorICogVGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uJ3MgY29kZSBpcyBkZXJpdmVkIGZyb20gY29kZSBpbiBzZXR1cC5jIGJ5CisgKiBILiBQZXRlciBBbnZpbi4gIFBsZWFzZSByZXNwZWN0IHRoYXQgZmlsZSdzIGNvcHlyaWdodCBmb3IgdGhpcyBmdW5jdGlvbgorICovCitpbnQgcHJvYmVfYmRhX2RyaXZlKHVpbnQ4X3QgZHJpdmUpCit7CisgICAgaW50IGJpb3NfZHJpdmVzOworICAgIGludCBlcnI7CisKKyAgICBpZiAoZHJpdmUgJiAweDgwKSB7CisJYmlvc19kcml2ZXMgPSByZHpfOChCSU9TX0hEX0NPVU5UKTsJLyogSEREIGNvdW50ICovCisgICAgfSBlbHNlIHsKKwl1aW50OF90IGVxdWlwID0gcmR6XzgoQklPU19FUVVJUCk7CisJaWYgKGVxdWlwICYgMSkKKwkgICAgYmlvc19kcml2ZXMgPSAoZXF1aXAgPj4gNikgKyAxOwkvKiBGbG9wcHkgY291bnQgKi8KKwllbHNlCisJICAgIGJpb3NfZHJpdmVzID0gMDsKKyAgICB9CisgICAgZXJyID0gKGRyaXZlIC0gKGRyaXZlICYgMHg4MCkpID49IGJpb3NfZHJpdmVzID8gMCA6IDE7CisgICAgZHNrcHJvYmVfcHJpbnRmKCJCREEgZHJpdmUgJTAyeD8gJWQsIHRvdGFsIGNvdW50OiAlZFxuIiwgZHJpdmUsIGVyciwKKwkJICAgIGJpb3NfZHJpdmVzKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICogV2Ugd2lsbCBwcm9iZSBhIGRyaXZlIHdpdGggYSBmZXcgZGlmZmVyZW50IG1ldGhvZHMsIHJldHVybmluZworICogdGhlIGNvdW50IG9mIHN1Y2Nlc2Z1bCBwcm9iZXMKKyAqLworaW50IG11bHRpX3Byb2JlX2RyaXZlKHVpbnQ4X3QgZHJpdmUpCit7CisgICAgaW50IGMgPSAwOworICAgIGNvbTMyc3lzX3QgcmVnczsKKworICAgIGRza3Byb2JlX3ByaW50ZigiSU5UIDEzIERMJTAyeDpcbiIsIGRyaXZlKTsKKyAgICAvKiBPbmx5IHByb2JlIHRoZSBCREEgZm9yIGZsb3BwaWVzICovCisgICAgaWYgKGRyaXZlICYgMHg4MCkgeworCisJYyArPSBwcm9iZV9pbnQxM2hfMDhoKGRyaXZlLCAmcmVncyk7CisJYyArPSBwcm9iZV9pbnQxM2hfMTVoKGRyaXZlLCAmcmVncyk7CisJYyArPSBwcm9iZV9pbnQxM2hfNDFoKGRyaXZlLCAmcmVncyk7CisgICAgfQorICAgIGMgKz0gcHJvYmVfYmRhX2RyaXZlKGRyaXZlKTsKKyAgICBkc2twcm9iZV9wYXVzZSgmcmVncyk7CisgICAgcmV0dXJuIGM7Cit9CisKKy8qCisgKiBXZSB3aWxsIHByb2JlIGEgY29udGlndW91cyByYW5nZSBvZiBCSU9TIGRyaXZlLCBzdGFydGluZyB3aXRoIGRyaXZlCisgKiBudW1iZXIgJ3N0YXJ0Jy4gIFdlIHByb2JlIHdpdGggYSBmZXcgZGlmZmVyZW50IG1ldGhvZHMsIGFuZCByZXR1cm4KKyAqIHRoZSBmaXJzdCBkcml2ZSB3aGljaCBkb2Vzbid0IHJlc3BvbmQgdG8gYW55IG9mIHRoZSBwcm9iZXMuCisgKi8KK3VpbnQ4X3QgcHJvYmVfZHJpdmVfcmFuZ2UodWludDhfdCBzdGFydCkKK3sKKyAgICB1aW50OF90IGRyaXZlID0gc3RhcnQ7CisgICAgd2hpbGUgKG11bHRpX3Byb2JlX2RyaXZlKGRyaXZlKSkgeworCWRyaXZlKys7CisJLyogQ2hlY2sgZm9yIHBhc3NpbmcgdGhlIGZsb3BweS9IREQgYm91bmRhcnkgKi8KKwlpZiAoKGRyaXZlICYgMHg3RikgPT0gMCkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBkcml2ZTsKK30KKworLyogRHVtbXkgcHJpbnRmKCkgdGhhdCBkb2VzIG5vdGhpbmcgKi8KK3N0YXRpYyBpbnQgbm9fcHJpbnRmKGNvbnN0IGNoYXIgKmlnbm9yZWQsIC4uLikKK3sKKyAgICAodm9pZClpZ25vcmVkOworICAgIHJldHVybiAwOworfQorCisvKiBQYXVzZSBpZiB3ZSBhcmUgaW4gZGVidWctbW9kZSAqLworc3RhdGljIHZvaWQgZHNrcHJvYmVfcGF1c2UoY29tMzJzeXNfdCAqIHJlZ3MpCit7CisgICAgaWYgKCFEQkdfRFNLUFJPQkUpCisJcmV0dXJuOworICAgIGRza3Byb2JlX3ByaW50ZigiUHJlc3MgYSBrZXkgdG8gY29udGludWUuLi5cbiIpOworICAgIG1lbXNldChyZWdzLCAwLCBzaXplb2YgKnJlZ3MpOworICAgIHJlZ3MtPmVheC53WzBdID0gMDsKKyAgICBpbnRjYWxsKDB4MTYsIHJlZ3MsIE5VTEwpOworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL21lbWRpc2svZHNrcHJvYmUuaCBiL21lbWRpc2svZHNrcHJvYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWJmYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9kc2twcm9iZS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFNoYW8gTWlsbGVyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBkc2twcm9iZS5oCisgKgorICogUm91dGluZXMgZm9yIHByb2JpbmcgQklPUyBkaXNrIGRyaXZlcworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZXh0ZXJuIHVpbnQ4X3QgcHJvYmVfZHJpdmVfcmFuZ2UodWludDhfdCk7CmRpZmYgLS1naXQgYS9tZW1kaXNrL2U4MjAuaCBiL21lbWRpc2svZTgyMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTU2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL2U4MjAuaApAQCAtMCwwICsxLDMzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBlODIwLmgKKyAqCisgKiBDb21tb24gcm91dGluZXMgZm9yIGU4MjAgbWVtb3J5IG1hcCBtYW5hZ2VtZW50CisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdHJ1Y3QgZTgyMHJhbmdlIHsKKyAgICB1aW50NjRfdCBzdGFydDsKKyAgICB1aW50MzJfdCB0eXBlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2V4dGVybiBzdHJ1Y3QgZTgyMHJhbmdlIHJhbmdlc1tdOworZXh0ZXJuIGludCBucmFuZ2VzOworZXh0ZXJuIHVpbnQzMl90IGRvc19tZW0sIGxvd19tZW0sIGhpZ2hfbWVtOworCitleHRlcm4gdm9pZCBlODIwbWFwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbnNlcnRyYW5nZSh1aW50NjRfdCwgdWludDY0X3QsIHVpbnQzMl90KTsKK2V4dGVybiB2b2lkIGdldF9tZW0odm9pZCk7CitleHRlcm4gdm9pZCBwYXJzZV9tZW0odm9pZCk7CmRpZmYgLS1naXQgYS9tZW1kaXNrL2U4MjBkYXRhIGIvbWVtZGlzay9lODIwZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDMyMGFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9lODIwZGF0YQpAQCAtMCwwICsxLDE1IEBACiswMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwOWJjMDAgMSAxCiswMDAwMDAwMDAwMDliYzAwIDAwMDAwMDAwMDAwMDQ0MDAgMiAxCiswMDAwMDAwMDAwMGU5ODAwIDAwMDAwMDAwMDAwMTY4MDAgMiAxCiswMDAwMDAwMDAwMGU5ODAwIDAwMDAwMDAwMDAwMGI0MDAgMiAxCiswMDAwMDAwMDAwMGY1MDAwIDAwMDAwMDAwMDAwMGIwMDAgMiA5CiswMDAwMDAwMDAwMTAwMDAwIDAwMDAwMDAwMDZlZTAwMDAgMSAxCiswMDAwMDAwMDA2ZmUwMDAwIDAwMDAwMDAwMDAwMGZjMDAgMyAxCiswMDAwMDAwMDA2ZmVmYzAwIDAwMDAwMDAwMDAwMDA0MDAgNCAxCiswMDAwMDAwMDA2ZmYwMDAwIDAwMDAwMDAwMDAwMDIwMDAgMiAxCiswMDAwMDAwMDA2ZmYyMDAwIDAwMDAwMDAwMDAwMGUwMDAgMSAxCiswMDAwMDAwMDA3MDAwMDAwIDAwMDAwMDAwMDAxMDAwMDAgMiAxCiswMDAwMDAwMGZmZjAwMDAwIDAwMDAwMDAwMDAxMDAwMDAgMiAxCisKKzAwMDAwMDAwMDA1ODYwMDAgMDAwMDAwMDAwMDE2ODAwMCAyIDEKKzAwMDAwMDAwMDAwOWJhMDAgMDAwMDAwMDAwMDAwMDIwMCAyIDEKZGlmZiAtLWdpdCBhL21lbWRpc2svZTgyMGZ1bmMuYyBiL21lbWRpc2svZTgyMGZ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2MwYTZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9lODIwZnVuYy5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMS0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBlODIwZnVuYy5jCisgKgorICogRTgyMCByYW5nZSBkYXRhYmFzZSBtYW5hZ2VyCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmZGVmIFRFU1QKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSAibWVtZGlzay5oIgkJLyogRm9yIG1lbXNldCgpICovCisjZW5kaWYKKyNpbmNsdWRlICJlODIwLmgiCisKKyNkZWZpbmUgTUFYUkFOR0VTCTEwMjQKKy8qIEFsbCBvZiBtZW1vcnkgc3RhcnRzIG91dCBhcyBvbmUgcmFuZ2Ugb2YgImluZGV0ZXJtaW5hdGUiIHR5cGUgKi8KK3N0cnVjdCBlODIwcmFuZ2UgcmFuZ2VzW01BWFJBTkdFU107CitpbnQgbnJhbmdlczsKKwordm9pZCBlODIwbWFwX2luaXQodm9pZCkKK3sKKyAgICBtZW1zZXQocmFuZ2VzLCAwLCBzaXplb2YocmFuZ2VzKSk7CisgICAgbnJhbmdlcyA9IDE7CisgICAgcmFuZ2VzWzFdLnR5cGUgPSAtMVU7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydHJhbmdlX2F0KGludCB3aGVyZSwgdWludDY0X3Qgc3RhcnQsIHVpbnQzMl90IHR5cGUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSBucmFuZ2VzOyBpID4gd2hlcmU7IGktLSkKKwlyYW5nZXNbaV0gPSByYW5nZXNbaSAtIDFdOworCisgICAgcmFuZ2VzW3doZXJlXS5zdGFydCA9IHN0YXJ0OworICAgIHJhbmdlc1t3aGVyZV0udHlwZSA9IHR5cGU7CisKKyAgICBucmFuZ2VzKys7CisgICAgcmFuZ2VzW25yYW5nZXNdLnN0YXJ0ID0gMFVMTDsKKyAgICByYW5nZXNbbnJhbmdlc10udHlwZSA9IC0xVTsKK30KKwordm9pZCBpbnNlcnRyYW5nZSh1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuLCB1aW50MzJfdCB0eXBlKQoreworICAgIHVpbnQ2NF90IGxhc3Q7CisgICAgdWludDMyX3Qgb2xkdHlwZTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIFJlbW92ZSB0aGlzIHRvIG1ha2UgbGVuID09IDAgbWVhbiBhbGwgb2YgbWVtb3J5ICovCisgICAgaWYgKGxlbiA9PSAwKQorCXJldHVybjsJCQkvKiBOb3RoaW5nIHRvIGluc2VydCAqLworCisgICAgbGFzdCA9IHN0YXJ0ICsgbGVuIC0gMTsJLyogTWF5IHJvbGwgb3ZlciAqLworCisgICAgaSA9IDA7CisgICAgb2xkdHlwZSA9IC0yVTsKKyAgICB3aGlsZSAoc3RhcnQgPiByYW5nZXNbaV0uc3RhcnQgJiYgcmFuZ2VzW2ldLnR5cGUgIT0gLTFVKSB7CisJb2xkdHlwZSA9IHJhbmdlc1tpXS50eXBlOworCWkrKzsKKyAgICB9CisKKyAgICAvKiBDb25zaWRlciB0aGUgcmVwbGFjZW1lbnQgcG9saWN5LiAgVGhpcyBjdXJyZW50IG9uZSBpcyAib3ZlcndyaXRlLiIgKi8KKworICAgIGlmIChzdGFydCA8IHJhbmdlc1tpXS5zdGFydCB8fCByYW5nZXNbaV0udHlwZSA9PSAtMVUpCisJaW5zZXJ0cmFuZ2VfYXQoaSsrLCBzdGFydCwgdHlwZSk7CisKKyAgICB3aGlsZSAoaSA9PSAwIHx8IGxhc3QgPiByYW5nZXNbaV0uc3RhcnQgLSAxKSB7CisJb2xkdHlwZSA9IHJhbmdlc1tpXS50eXBlOworCXJhbmdlc1tpXS50eXBlID0gdHlwZTsKKwlpKys7CisgICAgfQorCisgICAgaWYgKGxhc3QgPCByYW5nZXNbaV0uc3RhcnQgLSAxKQorCWluc2VydHJhbmdlX2F0KGksIGxhc3QgKyAxLCBvbGR0eXBlKTsKKworICAgIC8qIE5vdyB0aGUgbWFwIGlzIGNvcnJlY3QsIGJ1dCBxdWl0ZSBwb3NzaWJseSBub3Qgb3B0aW1hbC4gIFNjYW4gdGhlCisgICAgICAgbWFwIGZvciByYW5nZXMgd2hpY2ggYXJlIHJlZHVuZGFudCBhbmQgcmVtb3ZlIHRoZW0uICovCisgICAgaSA9IGogPSAxOworICAgIG9sZHR5cGUgPSByYW5nZXNbMF0udHlwZTsKKyAgICB3aGlsZSAoaSA8IG5yYW5nZXMpIHsKKwlpZiAocmFuZ2VzW2ldLnR5cGUgPT0gb2xkdHlwZSkgeworCSAgICBpKys7CisJfSBlbHNlIHsKKwkgICAgb2xkdHlwZSA9IHJhbmdlc1tpXS50eXBlOworCSAgICBpZiAoaSAhPSBqKQorCQlyYW5nZXNbal0gPSByYW5nZXNbaV07CisJICAgIGkrKzsKKwkgICAgaisrOworCX0KKyAgICB9CisKKyAgICBpZiAoaSAhPSBqKSB7CisJcmFuZ2VzW2pdID0gcmFuZ2VzW2ldOwkvKiBUZXJtaW5hdGlvbiBzZW50aW5lbCBjb3B5ICovCisJbnJhbmdlcyAtPSAoaSAtIGopOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lbWRpc2svZTgyMHRlc3QuYyBiL21lbWRpc2svZTgyMHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmQ2YzRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9lODIwdGVzdC5jCkBAIC0wLDAgKzEsODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGU4MjBoYWNrLmMKKyAqCisgKiBUZXN0IG9mIElOVCAxNTpFODIwIGNhbm9uaWNhbGl6YXRpb24vbWFuaXB1bGF0aW9uIHJvdXRpbmUKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgImU4MjAuaCIKKwordm9pZCAqc3lzX2JvdW5jZTsJCS8qIER1bW15ICovCisKK2V4dGVybiB2b2lkIHBhcnNlX21lbSh2b2lkKTsKK2V4dGVybiB1aW50MzJfdCBkb3NfbWVtLCBsb3dfbWVtLCBoaWdoX21lbTsKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKSBkaWUodm9pZCkKK3sKKyAgICBhYm9ydCgpOworfQorCit2b2lkIHByaW50cmFuZ2VzKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnJhbmdlczsgaSsrKSB7CisJcHJpbnRmKCIlMDE2bGx4ICUwMTZsbHggJWRcbiIsCisJICAgICAgIHJhbmdlc1tpXS5zdGFydCwKKwkgICAgICAgcmFuZ2VzW2kgKyAxXS5zdGFydCAtIHJhbmdlc1tpXS5zdGFydCwgcmFuZ2VzW2ldLnR5cGUpOworICAgIH0KK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICB1aW50NjRfdCBzdGFydCwgbGVuOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY2hhciBsaW5lW0JVRlNJWl0sICpwOworCisgICAgZTgyMG1hcF9pbml0KCk7CisgICAgcHJpbnRyYW5nZXMoKTsKKworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBCVUZTSVosIHN0ZGluKSkgeworCXAgPSBzdHJjaHIobGluZSwgJzonKTsKKwlwID0gcCA/IHAgKyAxIDogbGluZTsKKwlpZiAoc3NjYW5mKHAsICIgJWxseCAlbGx4ICVkIiwgJnN0YXJ0LCAmbGVuLCAmdHlwZSkgPT0gMykgeworCSAgICBwdXRjaGFyKCdcbicpOworCSAgICBwcmludGYoIiUwMTZsbHggJTAxNmxseCAlZCA8LVxuIiwgc3RhcnQsIGxlbiwgdHlwZSk7CisJICAgIHB1dGNoYXIoJ1xuJyk7CisJICAgIGluc2VydHJhbmdlKHN0YXJ0LCBsZW4sIHR5cGUpOworCSAgICBwcmludHJhbmdlcygpOworCX0KKyAgICB9CisKKyAgICBwYXJzZV9tZW0oKTsKKworICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgcHJpbnRmKCJET1MgIG1lbSA9ICUjMTB4ICgldSBLKVxuIiwgZG9zX21lbSwgZG9zX21lbSA+PiAxMCk7CisgICAgcHJpbnRmKCJMb3cgIG1lbSA9ICUjMTB4ICgldSBLKVxuIiwgbG93X21lbSwgbG93X21lbSA+PiAxMCk7CisgICAgcHJpbnRmKCJIaWdoIG1lbSA9ICUjMTB4ICgldSBLKVxuIiwgaGlnaF9tZW0sIGhpZ2hfbWVtID4+IDEwKTsKKyAgICBwdXRjaGFyKCdcbicpOworCisgICAgLyogTm93LCBzdGVhbCBhIGNodW5rICgySykgb2YgRE9TIG1lbW9yeSBhbmQgbWFrZSBzdXJlIGl0IHJlZ2lzdGVyZWQgT0sgKi8KKyAgICBpbnNlcnRyYW5nZShkb3NfbWVtIC0gMjA0OCwgMjA0OCwgMiwgMSk7CS8qIFR5cGUgMiA9IHJlc2VydmVkICovCisKKyAgICBwcmludHJhbmdlcygpOworICAgIHBhcnNlX21lbSgpOworCisgICAgcHV0Y2hhcignXG4nKTsKKyAgICBwcmludGYoIkRPUyAgbWVtID0gJSMxMHggKCV1IEspXG4iLCBkb3NfbWVtLCBkb3NfbWVtID4+IDEwKTsKKyAgICBwcmludGYoIkxvdyAgbWVtID0gJSMxMHggKCV1IEspXG4iLCBsb3dfbWVtLCBsb3dfbWVtID4+IDEwKTsKKyAgICBwcmludGYoIkhpZ2ggbWVtID0gJSMxMHggKCV1IEspXG4iLCBoaWdoX21lbSwgaGlnaF9tZW0gPj4gMTApOworICAgIHB1dGNoYXIoJ1xuJyk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lbWRpc2svZWx0b3JpdG8uYyBiL21lbWRpc2svZWx0b3JpdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTBiYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9lbHRvcml0by5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IFNoYW8gTWlsbGVyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBlbHRvcml0by5jCisgKgorICogRURELTQgRWwgVG9yaXRvIHN0cnVjdHVyZXMgYW5kIGRlYnVnZ2luZyByb3V0aW5lcworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJtZW1kaXNrLmgiCisjaW5jbHVkZSAiY29uaW8uaCIKKyNpbmNsdWRlICJlbHRvcml0by5oIgorCisjaWZkZWYgREJHX0VMVE9SSVRPCit2b2lkIGVsdG9yaXRvX2R1bXAodWludDMyX3QgaW1hZ2UpCit7CisgICAgcHJpbnRmKCItLSBFbCBUb3JpdG8gZHVtcCAtLVxuIiwgaW1hZ2UpOworCisgICAgLyogQlZEIHN0YXJ0cyBhdCBzZWN0b3IgMTcuICovCisgICAgc3RydWN0IGVkZDRfYnZkICpidmQgPSAoc3RydWN0IGVkZDRfYnZkICopKGltYWdlICsgMTcgKiAyMDQ4KTsKKworICAgIHByaW50ZigiYnZkLmJvb3RfcmVjX2luZDogMHglMDJ4XG4iLCBidmQtPmJvb3RfcmVjX2luZCk7CisgICAgcHJpbnRmKCJidmQuaXNvOTY2MF9pZDogJWMlYyVjJWMlY1xuIiwgYnZkLT5pc285NjYwX2lkWzBdLAorCSAgIGJ2ZC0+aXNvOTY2MF9pZFsxXSwgYnZkLT5pc285NjYwX2lkWzJdLCBidmQtPmlzbzk2NjBfaWRbM10sCisJICAgYnZkLT5pc285NjYwX2lkWzRdKTsKKyAgICBwcmludGYoImJ2ZC52ZXI6IDB4JTAyeFxuIiwgYnZkLT52ZXIpOworICAgIHByaW50ZigiYnZkLmVsdG9yaXRvOiAlc1xuIiwgYnZkLT5lbHRvcml0byk7CisgICAgcHJpbnRmKCJidmQuYm9vdF9jYXQ6IDB4JTA4eFxuIiwgYnZkLT5ib290X2NhdCk7CisKKyAgICBzdHJ1Y3QgZWRkNF9ib290Y2F0ICpib290X2NhdCA9CisJKHN0cnVjdCBlZGQ0X2Jvb3RjYXQgKikoaW1hZ2UgKyBidmQtPmJvb3RfY2F0ICogMjA0OCk7CisKKyAgICBwcmludGYoImJvb3RfY2F0LnZhbGlkYXRpb25fZW50cnlcbiIpOworICAgIHByaW50ZigiICAuaGVhZGVyX2lkOiAweCUwMnhcbiIsIGJvb3RfY2F0LT52YWxpZGF0aW9uX2VudHJ5LmhlYWRlcl9pZCk7CisgICAgcHJpbnRmKCIgIC5wbGF0Zm9ybV9pZDogMHglMDJ4XG4iLCBib290X2NhdC0+dmFsaWRhdGlvbl9lbnRyeS5wbGF0Zm9ybV9pZCk7CisgICAgcHJpbnRmKCIgIC5pZF9zdHJpbmc6ICVzXG4iLCBib290X2NhdC0+dmFsaWRhdGlvbl9lbnRyeS5pZF9zdHJpbmcpOworICAgIHByaW50ZigiICAuY2hlY2tzdW06IDB4JTA0eFxuIiwgYm9vdF9jYXQtPnZhbGlkYXRpb25fZW50cnkuY2hlY2tzdW0pOworICAgIHByaW50ZigiICAua2V5NTU6IDB4JTAyeFxuIiwgYm9vdF9jYXQtPnZhbGlkYXRpb25fZW50cnkua2V5NTUpOworICAgIHByaW50ZigiICAua2V5QUE6IDB4JTAyeFxuIiwgYm9vdF9jYXQtPnZhbGlkYXRpb25fZW50cnkua2V5QUEpOworICAgIHByaW50ZigiYm9vdF9jYXQuaW5pdGlhbF9lbnRyeVxuIik7CisgICAgcHJpbnRmKCIgIC5oZWFkZXJfaWQ6IDB4JTAyeFxuIiwgYm9vdF9jYXQtPmluaXRpYWxfZW50cnkuaGVhZGVyX2lkKTsKKyAgICBwcmludGYoIiAgLm1lZGlhX3R5cGU6IDB4JTAyeFxuIiwgYm9vdF9jYXQtPmluaXRpYWxfZW50cnkubWVkaWFfdHlwZSk7CisgICAgcHJpbnRmKCIgIC5sb2FkX3NlZzogMHglMDR4XG4iLCBib290X2NhdC0+aW5pdGlhbF9lbnRyeS5sb2FkX3NlZyk7CisgICAgcHJpbnRmKCIgIC5zeXN0ZW1fdHlwZTogMHglMDJ4XG4iLCBib290X2NhdC0+aW5pdGlhbF9lbnRyeS5zeXN0ZW1fdHlwZSk7CisgICAgcHJpbnRmKCIgIC5zZWN0X2NvdW50OiAlZFxuIiwgYm9vdF9jYXQtPmluaXRpYWxfZW50cnkuc2VjdF9jb3VudCk7CisgICAgcHJpbnRmKCIgIC5sb2FkX2Jsb2NrOiAweCUwOHhcbiIsIGJvb3RfY2F0LT5pbml0aWFsX2VudHJ5LmxvYWRfYmxvY2spOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZW1kaXNrL2VsdG9yaXRvLmggYi9tZW1kaXNrL2VsdG9yaXRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0YzRhMQotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svZWx0b3JpdG8uaApAQCAtMCwwICsxLDgwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOS0yMDEwIFNoYW8gTWlsbGVyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBlbHRvcml0by5oCisgKgorICogRURELTQgRWwgVG9yaXRvIHN0cnVjdHVyZXMgYW5kIGRlYnVnZ2luZyByb3V0aW5lcworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJjb21waWxlci5oIgorCisvKiBFREQtNCBCb290YWJsZSBPcHRpY2FsIERpc2MgRHJpdmUgQm9vdCBWb2x1bWUgRGVzY3JpcHRvciAqLworTUVNRElTS19QQUNLRURfUFJFRklYCitzdHJ1Y3QgZWRkNF9idmQgeworICAgIHVpbnQ4X3QgYm9vdF9yZWNfaW5kOwkvKiBCb290IFJlY29yZCBJbmRpY2F0b3IgKi8KKyAgICB1aW50OF90IGlzbzk2NjBfaWRbNV07CS8qIElTTzk2NjAgSUQgICAgICAgICAgICAqLworICAgIHVpbnQ4X3QgdmVyOwkJLyogRGVzY3JpcHRvciBWZXJzaW9uICAgICovCisgICAgdWludDhfdCBlbHRvcml0b1szMl07CS8qICJFTCBUT1JJVE8iIGV0Yy4gICAgICAqLworICAgIHVpbnQ4X3QgcmVzMVszMl07CQkvKiBSZXNlcnZlZCAgICAgICAgICAgICAgKi8KKyAgICB1aW50MzJfdCBib290X2NhdDsJCS8qIEJvb3QgY2F0YWxvZyBzZWN0b3IgICAqLworICAgIHVpbnQ4X3QgcmVzMlsxOTczXTsJCS8qIFJlc2VydmVkICAgICAgICAgICAgICAqLworfSBNRU1ESVNLX1BBQ0tFRF9QT1NURklYOworCitNRU1ESVNLX1BBQ0tFRF9QUkVGSVgKK3N0cnVjdCB2YWxpZGF0aW9uX2VudHJ5IHsKKyAgICB1aW50OF90IGhlYWRlcl9pZDsJCS8qIEhlYWRlciBJRCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQ4X3QgcGxhdGZvcm1faWQ7CS8qIFBsYXRmb3JtIElEICAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQxNl90IHJlczE7CQkvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1aW50OF90IGlkX3N0cmluZ1syNF07CS8qIE1hbnVmYWN0dXJlciAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQxNl90IGNoZWNrc3VtOwkJLyogU3VtcyB3aXRoIHdob2xlIHJlY29yZCB0byB6ZXJvICovCisgICAgdWludDhfdCBrZXk1NTsJCS8qIEtleSBieXRlIDB4NTUgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQ4X3Qga2V5QUE7CQkvKiBLZXkgYnl0ZSAweEFBICAgICAgICAgICAgICAgICAgKi8KK30gTUVNRElTS19QQUNLRURfUE9TVEZJWDsKKworTUVNRElTS19QQUNLRURfUFJFRklYCitzdHJ1Y3QgaW5pdGlhbF9lbnRyeSB7CisgICAgdWludDhfdCBoZWFkZXJfaWQ7CQkvKiBIZWFkZXIgSUQgICAgICAgICAgICAgICAgKi8KKyAgICB1aW50OF90IG1lZGlhX3R5cGU7CQkvKiBNZWRpYSB0eXBlICAgICAgICAgICAgICAgKi8KKyAgICB1aW50MTZfdCBsb2FkX3NlZzsJCS8qIExvYWQgc2VnbWVudCAgICAgICAgICAgICAqLworICAgIHVpbnQ4X3Qgc3lzdGVtX3R5cGU7CS8qIChGaWxlc3lzdGVtIElEKSAgICAgICAgICAqLworICAgIHVpbnQ4X3QgcmVzMTsJCS8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQxNl90IHNlY3RfY291bnQ7CS8qIEVtdWxhdGVkIHNlY3RvcnMgdG8gbG9hZCAqLworICAgIHVpbnQzMl90IGxvYWRfYmxvY2s7CS8qIFN0YXJ0aW5nIHNlY3RvciBvZiBpbWFnZSAqLworICAgIHVpbnQ4X3QgcmVzMls0XTsJCS8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAqLworfSBNRU1ESVNLX1BBQ0tFRF9QT1NURklYOworCisvKiBFREQtNCBCb290YWJsZSBPcHRpY2FsIERpc2MgRHJpdmUgQm9vdCBDYXRhbG9nIChmaXhlZC1zaXplIHBvcnRpb25zKSAqLworTUVNRElTS19QQUNLRURfUFJFRklYCitzdHJ1Y3QgZWRkNF9ib290Y2F0IHsKKyAgICBzdHJ1Y3QgdmFsaWRhdGlvbl9lbnRyeSB2YWxpZGF0aW9uX2VudHJ5OworICAgIHN0cnVjdCBpbml0aWFsX2VudHJ5IGluaXRpYWxfZW50cnk7Cit9IE1FTURJU0tfUEFDS0VEX1BPU1RGSVg7CisKKy8qIEVERC00IENEIFNwZWNpZmljYXRpb24gUGFja2V0ICovCitNRU1ESVNLX1BBQ0tFRF9QUkVGSVgKK3N0cnVjdCBlZGQ0X2NkX3BrdCB7CisgICAgdWludDhfdCBzaXplOwkJLyogUGFja2V0IHNpemUgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQ4X3QgdHlwZTsJCS8qIEJvb3QgbWVkaWEgdHlwZSAoZmxhZ3MpICAgICAgICAgKi8KKyAgICB1aW50OF90IGRyaXZlbm87CQkvKiBJTlQgMTNoIGRyaXZlIG51bWJlciAgICAgICAgICAgICovCisgICAgdWludDhfdCBjb250cm9sbGVyOwkJLyogQ29udHJvbGxlciBpbmRleCAgICAgICAgICAgICAgICAqLworICAgIHVpbnQzMl90IHN0YXJ0OwkJLyogU3RhcnRpbmcgTEJBIG9mIGltYWdlICAgICAgICAgICAqLworICAgIHVpbnQxNl90IGRldm5vOwkJLyogRGV2aWNlIG51bWJlciAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQxNl90IHVzZXJidWY7CQkvKiBVc2VyIGJ1ZmZlciBzZWdtZW50ICAgICAgICAgICAgICovCisgICAgdWludDE2X3QgbG9hZF9zZWc7CQkvKiBMb2FkIHNlZ21lbnQgICAgICAgICAgICAgICAgICAgICovCisgICAgdWludDE2X3Qgc2VjdF9jb3VudDsJLyogRW11bGF0ZWQgc2VjdG9ycyB0byBsb2FkICAgICAgICAqLworICAgIHVpbnQ4X3QgZ2VvbTE7CQkvKiBDeWxpbmRlcnMgYml0cyAwIHRocnUgNyAgICAgICAgICovCisgICAgdWludDhfdCBnZW9tMjsJCS8qIFNlY3RzL3RyYWNrIDAgdGhydSA1LCBjeWxzIDgsIDkgKi8KKyAgICB1aW50OF90IGdlb20zOwkJLyogSGVhZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBNRU1ESVNLX1BBQ0tFRF9QT1NURklYOworCmRpZmYgLS1naXQgYS9tZW1kaXNrL2ZkZ2VvLnBsIGIvbWVtZGlzay9mZGdlby5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNzY3MjdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9mZGdlby5wbApAQCAtMCwwICsxLDU2IEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgVHJ5IGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIGdlb21ldHJpZXMKKyMKKworKCRrKSA9IEBBUkdWOworJHNlYyA9IGludCgkayoyKzAuNSk7CisKK2lmICgkc2VjIDwgMzIwKjIpIHsKKyAgICAkYyA9IDQwOworICAgICRoID0gMTsKKyAgICAkdHlwZSA9IDE7Cit9IGVsc2lmICgkc2VjIDwgNjQwKjIpIHsKKyAgICAkYyA9IDQwOworICAgICRoID0gMjsKKyAgICAkdHlwZSA9IDE7Cit9IGVsc2lmICgkc2VjIDwgMTIwMCoyKSB7CisgICAgJGMgPSA4MDsKKyAgICAkaCA9IDI7CisgICAgJHR5cGUgPSAzOworfSBlbHNpZiAoJHNlYyA8IDE0NDAqMikgeworICAgICRjID0gODA7CisgICAgJGggPSAyOworICAgICR0eXBlID0gMjsKK30gZWxzaWYgKCRzZWMgPCAyODgwKjIpIHsKKyAgICAkYyA9IDgwOworICAgICRoID0gMjsKKyAgICAkdHlwZSA9IDQ7Cit9IGVsc2lmICgkc2VjIDwgNDA5NioyKSB7CisgICAgJGMgPSA4MDsKKyAgICAkaCA9IDI7CisgICAgJHR5cGUgPSA2OworfSBlbHNlIHsKKyAgICBwcmludGYgIiUuMWZLLCAlZCBzZWN0b3JzOiAiLCAkc2VjLzIsICRzZWM7CisgICAgcHJpbnQgIkNvbnNpZGVyZWQgYSBoYXJkIGRpc2tcbiI7CisgICAgZXhpdCAyOworfQorCiskb2sgPSAwOword2hpbGUgKCRjIDwgMjU2KSB7CisgICAgJHMgPSBpbnQoJHNlYy8oJGMqJGgpKzAuNSk7CisgICAgaWYgKCRzIDw9IDYzICYmICRzZWMgPT0gJGMqJGgqJHMpIHsKKwkkb2sgPSAxOworCWxhc3Q7CisgICAgfQorICAgICRjKys7Cit9CisKK3ByaW50ZiAiJS4xZkssICVkIHNlY3RvcnM6ICIsICRzZWMvMiwgJHNlYzsKK2lmICgkb2spIHsKKyAgICBwcmludCAiYz0kYywgaD0kaCwgcz0kcywgdHlwZT0kdHlwZVxuIjsKKyAgICBleGl0IDA7Cit9IGVsc2UgeworICAgIHByaW50ICJObyB2YWxpZCBnZW9tZXRyeSBmb3VuZCAoTUVNRElTSyB3aWxsIGZha2UgaXQpXG4iOworICAgIGV4aXQgMTsKK30KZGlmZiAtLWdpdCBhL21lbWRpc2svaTM4Ni9tZW1kaXNrLmxkIGIvbWVtZGlzay9pMzg2L21lbWRpc2subGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjM2UzNQotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svaTM4Ni9tZW1kaXNrLmxkCkBAIC0wLDAgKzEsMTQwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIExpbmtlciBzY3JpcHQgZm9yIE1FTURJU0sKKyAqLworCisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VYVEVSTihfc3RhcnQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDB4MTAwMDAwOworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAuKTsKKworICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorCisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDQpOworICBQUk9WSURFIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDogeyAqKC5wcmVpbml0X2FycmF5KSB9CisgIFBST1ZJREUgKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERSAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6IHsgKiguaW5pdF9hcnJheSkgfQorICBQUk9WSURFIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREUgKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOiB7ICooLmZpbmlfYXJyYXkpIH0KKyAgUFJPVklERSAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFIChfX2N0b3JzX3N0YXJ0ID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgUFJPVklERSAoX19jdG9yc19lbmQgPSAuKTsKKyAgUFJPVklERSAoX19kdG9yc19zdGFydCA9IC4pOworICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIFBST1ZJREUgKF9fZHRvcnNfZW5kID0gLik7CisKKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgQXZvaWQgbWl4aW5nIGNvZGUgYW5kCisgICAgIGRhdGEgd2l0aGluIHNhbWUgMTI4LWJ5dGUgY2h1bmsuICovCisgIC4gPSBBTElHTigxMjgpOworCisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gQUxJR04oMTYpOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICBfX2Jzc19zdGFydCA9IC47CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDQpOworICAgX19ic3NfZW5kID0gLjsKKyAgfQorICBfZW5kID0gLjsKKyAgUFJPVklERSAoZW5kID0gLik7CisKKworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgfQorfQpkaWZmIC0tZ2l0IGEvbWVtZGlzay9pbmZsYXRlLmMgYi9tZW1kaXNrL2luZmxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzgyNWYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9pbmZsYXRlLmMKQEAgLTAsMCArMSwxMDI2IEBACisjZGVmaW5lIERFQkcoeCkKKyNkZWZpbmUgREVCRzEoeCkKKy8qIGluZmxhdGUuYyAtLSBOb3QgY29weXJpZ2h0ZWQgMTk5MiBieSBNYXJrIEFkbGVyCisgICB2ZXJzaW9uIGMxMHAxLCAxMCBKYW51YXJ5IDE5OTMgKi8KKworLyoKKyAqIEFkYXB0ZWQgZm9yIGJvb3RpbmcgTGludXggYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzCisgKiBiYXNlZCBvbiBnemlwLTEuMC4zCisgKgorICogTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPiwgMTk5OS8wNC8xNCA6CisgKiAgIExpdHRsZSBtb2RzIGZvciBhbGwgdmFyaWFibGUgdG8gcmVzaWRlIGVpdGhlciBpbnRvIHJvZGF0YSBvciBic3Mgc2VnbWVudHMKKyAqICAgYnkgbWFya2luZyBjb25zdGFudCB2YXJpYWJsZXMgd2l0aCAnY29uc3QnIGFuZCBpbml0aWFsaXppbmcgYWxsIHRoZSBvdGhlcnMKKyAqICAgYXQgcnVuLXRpbWUgb25seS4gIFRoaXMgYWxsb3dzIGZvciB0aGUga2VybmVsIHVuY29tcHJlc3NvciB0byBydW4KKyAqICAgZGlyZWN0bHkgZnJvbSBGbGFzaCBvciBST00gbWVtb3J5IG9uIGVtYmVkZGVkIHN5c3RlbXMuCisgKgorICogQWRhcHRlZCBmb3IgTUVNRElTSyBieSBILiBQZXRlciBBbnZpbiwgQXByaWwgMjAwMworICovCisKKy8qCisgICBJbmZsYXRlIGRlZmxhdGVkIChQS1pJUCdzIG1ldGhvZCA4IGNvbXByZXNzZWQpIGRhdGEuICBUaGUgY29tcHJlc3Npb24KKyAgIG1ldGhvZCBzZWFyY2hlcyBmb3IgYXMgbXVjaCBvZiB0aGUgY3VycmVudCBzdHJpbmcgb2YgYnl0ZXMgKHVwIHRvIGEKKyAgIGxlbmd0aCBvZiAyNTgpIGluIHRoZSBwcmV2aW91cyAzMiBLIGJ5dGVzLiAgSWYgaXQgZG9lc24ndCBmaW5kIGFueQorICAgbWF0Y2hlcyAob2YgYXQgbGVhc3QgbGVuZ3RoIDMpLCBpdCBjb2RlcyB0aGUgbmV4dCBieXRlLiAgT3RoZXJ3aXNlLCBpdAorICAgY29kZXMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCBzdHJpbmcgYW5kIGl0cyBkaXN0YW5jZSBiYWNrd2FyZHMgZnJvbQorICAgdGhlIGN1cnJlbnQgcG9zaXRpb24uICBUaGVyZSBpcyBhIHNpbmdsZSBIdWZmbWFuIGNvZGUgdGhhdCBjb2RlcyBib3RoCisgICBzaW5nbGUgYnl0ZXMgKGNhbGxlZCAibGl0ZXJhbHMiKSBhbmQgbWF0Y2ggbGVuZ3Rocy4gIEEgc2Vjb25kIEh1ZmZtYW4KKyAgIGNvZGUgY29kZXMgdGhlIGRpc3RhbmNlIGluZm9ybWF0aW9uLCB3aGljaCBmb2xsb3dzIGEgbGVuZ3RoIGNvZGUuICBFYWNoCisgICBsZW5ndGggb3IgZGlzdGFuY2UgY29kZSBhY3R1YWxseSByZXByZXNlbnRzIGEgYmFzZSB2YWx1ZSBhbmQgYSBudW1iZXIKKyAgIG9mICJleHRyYSIgKHNvbWV0aW1lcyB6ZXJvKSBiaXRzIHRvIGdldCB0byBhZGQgdG8gdGhlIGJhc2UgdmFsdWUuICBBdAorICAgdGhlIGVuZCBvZiBlYWNoIGRlZmxhdGVkIGJsb2NrIGlzIGEgc3BlY2lhbCBlbmQtb2YtYmxvY2sgKEVPQikgbGl0ZXJhbC8KKyAgIGxlbmd0aCBjb2RlLiAgVGhlIGRlY29kaW5nIHByb2Nlc3MgaXMgYmFzaWNhbGx5OiBnZXQgYSBsaXRlcmFsL2xlbmd0aAorICAgY29kZTsgaWYgRU9CIHRoZW4gZG9uZTsgaWYgYSBsaXRlcmFsLCBlbWl0IHRoZSBkZWNvZGVkIGJ5dGU7IGlmIGEKKyAgIGxlbmd0aCB0aGVuIGdldCB0aGUgZGlzdGFuY2UgYW5kIGVtaXQgdGhlIHJlZmVycmVkLXRvIGJ5dGVzIGZyb20gdGhlCisgICBzbGlkaW5nIHdpbmRvdyBvZiBwcmV2aW91c2x5IGVtaXR0ZWQgZGF0YS4KKworICAgVGhlcmUgYXJlIChjdXJyZW50bHkpIHRocmVlIGtpbmRzIG9mIGluZmxhdGUgYmxvY2tzOiBzdG9yZWQsIGZpeGVkLCBhbmQKKyAgIGR5bmFtaWMuICBUaGUgY29tcHJlc3NvciBkZWFscyB3aXRoIHNvbWUgY2h1bmsgb2YgZGF0YSBhdCBhIHRpbWUsIGFuZAorICAgZGVjaWRlcyB3aGljaCBtZXRob2QgdG8gdXNlIG9uIGEgY2h1bmstYnktY2h1bmsgYmFzaXMuICBBIGNodW5rIG1pZ2h0CisgICB0eXBpY2FsbHkgYmUgMzIgSyBvciA2NCBLLiAgSWYgdGhlIGNodW5rIGlzIGluY29tcHJlc3NpYmxlLCB0aGVuIHRoZQorICAgInN0b3JlZCIgbWV0aG9kIGlzIHVzZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBieXRlcyBhcmUgc2ltcGx5IHN0b3JlZCBhcworICAgaXMsIGVpZ2h0IGJpdHMgcGVyIGJ5dGUsIHdpdGggbm9uZSBvZiB0aGUgYWJvdmUgY29kaW5nLiAgVGhlIGJ5dGVzIGFyZQorICAgcHJlY2VkZWQgYnkgYSBjb3VudCwgc2luY2UgdGhlcmUgaXMgbm8gbG9uZ2VyIGFuIEVPQiBjb2RlLgorCisgICBJZiB0aGUgZGF0YSBpcyBjb21wcmVzc2libGUsIHRoZW4gZWl0aGVyIHRoZSBmaXhlZCBvciBkeW5hbWljIG1ldGhvZHMKKyAgIGFyZSB1c2VkLiAgSW4gdGhlIGR5bmFtaWMgbWV0aG9kLCB0aGUgY29tcHJlc3NlZCBkYXRhIGlzIHByZWNlZGVkIGJ5CisgICBhbiBlbmNvZGluZyBvZiB0aGUgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIEh1ZmZtYW4gY29kZXMgdGhhdCBhcmUKKyAgIHRvIGJlIHVzZWQgdG8gZGVjb2RlIHRoaXMgYmxvY2suICBUaGUgcmVwcmVzZW50YXRpb24gaXMgaXRzZWxmIEh1ZmZtYW4KKyAgIGNvZGVkLCBhbmQgc28gaXMgcHJlY2VkZWQgYnkgYSBkZXNjcmlwdGlvbiBvZiB0aGF0IGNvZGUuICBUaGVzZSBjb2RlCisgICBkZXNjcmlwdGlvbnMgdGFrZSB1cCBhIGxpdHRsZSBzcGFjZSwgYW5kIHNvIGZvciBzbWFsbCBibG9ja3MsIHRoZXJlIGlzCisgICBhIHByZWRlZmluZWQgc2V0IG9mIGNvZGVzLCBjYWxsZWQgdGhlIGZpeGVkIGNvZGVzLiAgVGhlIGZpeGVkIG1ldGhvZCBpcworICAgdXNlZCBpZiB0aGUgYmxvY2sgY29kZXMgdXAgc21hbGxlciB0aGF0IHdheSAodXN1YWxseSBmb3IgcXVpdGUgc21hbGwKKyAgIGNodW5rcyksIG90aGVyd2lzZSB0aGUgZHluYW1pYyBtZXRob2QgaXMgdXNlZC4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCisgICBjb2RlcyBhcmUgY3VzdG9taXplZCB0byB0aGUgcHJvYmFiaWxpdGllcyBpbiB0aGUgY3VycmVudCBibG9jaywgYW5kIHNvCisgICBjYW4gY29kZSBpdCBtdWNoIGJldHRlciB0aGFuIHRoZSBwcmUtZGV0ZXJtaW5lZCBmaXhlZCBjb2Rlcy4KKworICAgVGhlIEh1ZmZtYW4gY29kZXMgdGhlbXNlbHZlcyBhcmUgZGVjb2RlZCB1c2luZyBhIG11bHRpLWxldmVsIHRhYmxlCisgICBsb29rdXAsIGluIG9yZGVyIHRvIG1heGltaXplIHRoZSBzcGVlZCBvZiBkZWNvZGluZyBwbHVzIHRoZSBzcGVlZCBvZgorICAgYnVpbGRpbmcgdGhlIGRlY29kaW5nIHRhYmxlcy4gIFNlZSB0aGUgY29tbWVudHMgYmVsb3cgdGhhdCBwcmVjZWRlIHRoZQorICAgbGJpdHMgYW5kIGRiaXRzIHR1bmluZyBwYXJhbWV0ZXJzLgorICovCisKKy8qCisgICBOb3RlcyBiZXlvbmQgdGhlIDEuOTNhIGFwcG5vdGUudHh0OgorCisgICAxLiBEaXN0YW5jZSBwb2ludGVycyBuZXZlciBwb2ludCBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0CisgICAgICBzdHJlYW0uCisgICAyLiBEaXN0YW5jZSBwb2ludGVycyBjYW4gcG9pbnQgYmFjayBhY3Jvc3MgYmxvY2tzLCB1cCB0byAzMmsgYXdheS4KKyAgIDMuIFRoZXJlIGlzIGFuIGltcGxpZWQgbWF4aW11bSBvZiA3IGJpdHMgZm9yIHRoZSBiaXQgbGVuZ3RoIHRhYmxlIGFuZAorICAgICAgMTUgYml0cyBmb3IgdGhlIGFjdHVhbCBkYXRhLgorICAgNC4gSWYgb25seSBvbmUgY29kZSBleGlzdHMsIHRoZW4gaXQgaXMgZW5jb2RlZCB1c2luZyBvbmUgYml0LiAgKFplcm8KKyAgICAgIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBidXQgcGVyaGFwcyBhIGxpdHRsZSBjb25mdXNpbmcuKSAgSWYgdHdvCisgICAgICBjb2RlcyBleGlzdCwgdGhleSBhcmUgY29kZWQgdXNpbmcgb25lIGJpdCBlYWNoICgwIGFuZCAxKS4KKyAgIDUuIFRoZXJlIGlzIG5vIHdheSBvZiBzZW5kaW5nIHplcm8gZGlzdGFuY2UgY29kZXMtLWEgZHVtbXkgbXVzdCBiZQorICAgICAgc2VudCBpZiB0aGVyZSBhcmUgbm9uZS4gIChIaXN0b3J5OiBhIHByZSAyLjAgdmVyc2lvbiBvZiBQS1pJUCB3b3VsZAorICAgICAgc3RvcmUgYmxvY2tzIHdpdGggbm8gZGlzdGFuY2UgY29kZXMsIGJ1dCB0aGlzIHdhcyBkaXNjb3ZlcmVkIHRvIGJlCisgICAgICB0b28gaGFyc2ggYSBjcml0ZXJpb24uKSAgVmFsaWQgb25seSBmb3IgMS45M2EuICAyLjA0YyBkb2VzIGFsbG93CisgICAgICB6ZXJvIGRpc3RhbmNlIGNvZGVzLCB3aGljaCBpcyBzZW50IGFzIG9uZSBjb2RlIG9mIHplcm8gYml0cyBpbgorICAgICAgbGVuZ3RoLgorICAgNi4gVGhlcmUgYXJlIHVwIHRvIDI4NiBsaXRlcmFsL2xlbmd0aCBjb2Rlcy4gIENvZGUgMjU2IHJlcHJlc2VudHMgdGhlCisgICAgICBlbmQtb2YtYmxvY2suICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgc3RhdGljIGxlbmd0aCB0cmVlIGRlZmluZXMKKyAgICAgIDI4OCBjb2RlcyBqdXN0IHRvIGZpbGwgb3V0IHRoZSBIdWZmbWFuIGNvZGVzLiAgQ29kZXMgMjg2IGFuZCAyODcKKyAgICAgIGNhbm5vdCBiZSB1c2VkIHRob3VnaCwgc2luY2UgdGhlcmUgaXMgbm8gbGVuZ3RoIGJhc2Ugb3IgZXh0cmEgYml0cworICAgICAgZGVmaW5lZCBmb3IgdGhlbS4gIFNpbWlsYXJseSwgdGhlcmUgYXJlIHVwIHRvIDMwIGRpc3RhbmNlIGNvZGVzLgorICAgICAgSG93ZXZlciwgc3RhdGljIHRyZWVzIGRlZmluZSAzMiBjb2RlcyAoYWxsIDUgYml0cykgdG8gZmlsbCBvdXQgdGhlCisgICAgICBIdWZmbWFuIGNvZGVzLCBidXQgdGhlIGxhc3QgdHdvIGhhZCBiZXR0ZXIgbm90IHNob3cgdXAgaW4gdGhlIGRhdGEuCisgICA3LiBVbnppcCBjYW4gY2hlY2sgZHluYW1pYyBIdWZmbWFuIGJsb2NrcyBmb3IgY29tcGxldGUgY29kZSBzZXRzLgorICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGF0IGEgc2luZ2xlIGNvZGUgd291bGQgbm90IGJlIGNvbXBsZXRlIChzZWUgIzQpLgorICAgOC4gVGhlIGZpdmUgYml0cyBmb2xsb3dpbmcgdGhlIGJsb2NrIHR5cGUgaXMgcmVhbGx5IHRoZSBudW1iZXIgb2YKKyAgICAgIGxpdGVyYWwgY29kZXMgc2VudCBtaW51cyAyNTcuCisgICA5LiBMZW5ndGggY29kZXMgOCwxNiwxNiBhcmUgaW50ZXJwcmV0ZWQgYXMgMTMgbGVuZ3RoIGNvZGVzIG9mIDggYml0cworICAgICAgKDErNis2KS4gIFRoZXJlZm9yZSwgdG8gb3V0cHV0IHRocmVlIHRpbWVzIHRoZSBsZW5ndGgsIHlvdSBvdXRwdXQKKyAgICAgIHRocmVlIGNvZGVzICgxKzErMSksIHdoZXJlYXMgdG8gb3V0cHV0IGZvdXIgdGltZXMgdGhlIHNhbWUgbGVuZ3RoLAorICAgICAgeW91IG9ubHkgbmVlZCB0d28gY29kZXMgKDErMykuICBIbW0uCisgIDEwLiBJbiB0aGUgdHJlZSByZWNvbnN0cnVjdGlvbiBhbGdvcml0aG0sIENvZGUgPSBDb2RlICsgSW5jcmVtZW50CisgICAgICBvbmx5IGlmIEJpdExlbmd0aChpKSBpcyBub3QgemVyby4gIChQcmV0dHkgb2J2aW91cy4pCisgIDExLiBDb3JyZWN0aW9uOiA0IEJpdHM6ICMgb2YgQml0IExlbmd0aCBjb2RlcyAtIDQgICAgICg0IC0gMTkpCisgIDEyLiBOb3RlOiBsZW5ndGggY29kZSAyODQgY2FuIHJlcHJlc2VudCAyMjctMjU4LCBidXQgbGVuZ3RoIGNvZGUgMjg1CisgICAgICByZWFsbHkgaXMgMjU4LiAgVGhlIGxhc3QgbGVuZ3RoIGRlc2VydmVzIGl0cyBvd24sIHNob3J0IGNvZGUKKyAgICAgIHNpbmNlIGl0IGdldHMgdXNlZCBhIGxvdCBpbiB2ZXJ5IHJlZHVuZGFudCBmaWxlcy4gIFRoZSBsZW5ndGgKKyAgICAgIDI1OCBpcyBzcGVjaWFsIHNpbmNlIDI1OCAtIDMgKHRoZSBtaW4gbWF0Y2ggbGVuZ3RoKSBpcyAyNTUuCisgIDEzLiBUaGUgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgYml0IGxlbmd0aHMgYXJlIHJlYWQgYXMgYQorICAgICAgc2luZ2xlIHN0cmVhbSBvZiBsZW5ndGhzLiAgSXQgaXMgcG9zc2libGUgKGFuZCBhZHZhbnRhZ2VvdXMpIGZvcgorICAgICAgYSByZXBlYXQgY29kZSAoMTYsIDE3LCBvciAxOCkgdG8gZ28gYWNyb3NzIHRoZSBib3VuZGFyeSBiZXR3ZWVuCisgICAgICB0aGUgdHdvIHNldHMgb2YgbGVuZ3Rocy4KKyAqLworCisjaWZkZWYgUkNTSUQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiI0lkOiBpbmZsYXRlLmMsdiAwLjE0IDE5OTMvMDYvMTAgMTM6Mjc6MDQgamxvdXAgRXhwICMiOworI2VuZGlmCisKKyNkZWZpbmUgc2xpZGUgd2luZG93CisKKy8qIEh1ZmZtYW4gY29kZSBsb29rdXAgdGFibGUgZW50cnktLXRoaXMgZW50cnkgaXMgZm91ciBieXRlcyBmb3IgbWFjaGluZXMKKyAgIHRoYXQgaGF2ZSAxNi1iaXQgcG9pbnRlcnMgKGUuZy4gUEMncyBpbiB0aGUgc21hbGwgb3IgbWVkaXVtIG1vZGVsKS4KKyAgIFZhbGlkIGV4dHJhIGJpdHMgYXJlIDAuLjEzLiAgZSA9PSAxNSBpcyBFT0IgKGVuZCBvZiBibG9jayksIGUgPT0gMTYKKyAgIG1lYW5zIHRoYXQgdiBpcyBhIGxpdGVyYWwsIDE2IDwgZSA8IDMyIG1lYW5zIHRoYXQgdiBpcyBhIHBvaW50ZXIgdG8KKyAgIHRoZSBuZXh0IHRhYmxlLCB3aGljaCBjb2RlcyBlIC0gMTYgYml0cywgYW5kIGxhc3RseSBlID09IDk5IGluZGljYXRlcworICAgYW4gdW51c2VkIGNvZGUuICBJZiBhIGNvZGUgd2l0aCBlID09IDk5IGlzIGxvb2tlZCB1cCwgdGhpcyBpbXBsaWVzIGFuCisgICBlcnJvciBpbiB0aGUgZGF0YS4gKi8KK3N0cnVjdCBodWZ0IHsKKyAgICB1Y2ggZTsJCQkvKiBudW1iZXIgb2YgZXh0cmEgYml0cyBvciBvcGVyYXRpb24gKi8KKyAgICB1Y2ggYjsJCQkvKiBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGNvZGUgb3Igc3ViY29kZSAqLworICAgIHVuaW9uIHsKKwl1c2ggbjsJCQkvKiBsaXRlcmFsLCBsZW5ndGggYmFzZSwgb3IgZGlzdGFuY2UgYmFzZSAqLworCXN0cnVjdCBodWZ0ICp0OwkJLyogcG9pbnRlciB0byBuZXh0IGxldmVsIG9mIHRhYmxlICovCisgICAgfSB2OworfTsKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworU1RBVElDIGludCBodWZ0X2J1aWxkIE9GKCh1bnNpZ25lZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQsCisJCQkgIGNvbnN0IHVzaCAqLCBjb25zdCB1c2ggKiwgc3RydWN0IGh1ZnQgKiosIGludCAqKSk7CitTVEFUSUMgaW50IGh1ZnRfZnJlZSBPRigoc3RydWN0IGh1ZnQgKikpOworU1RBVElDIGludCBpbmZsYXRlX2NvZGVzIE9GKChzdHJ1Y3QgaHVmdCAqLCBzdHJ1Y3QgaHVmdCAqLCBpbnQsIGludCkpOworU1RBVElDIGludCBpbmZsYXRlX3N0b3JlZCBPRigodm9pZCkpOworU1RBVElDIGludCBpbmZsYXRlX2ZpeGVkIE9GKCh2b2lkKSk7CitTVEFUSUMgaW50IGluZmxhdGVfZHluYW1pYyBPRigodm9pZCkpOworU1RBVElDIGludCBpbmZsYXRlX2Jsb2NrIE9GKChpbnQgKikpOworU1RBVElDIGludCBpbmZsYXRlIE9GKCh2b2lkKSk7CisKKy8qIFRoZSBpbmZsYXRlIGFsZ29yaXRobSB1c2VzIGEgc2xpZGluZyAzMiBLIGJ5dGUgd2luZG93IG9uIHRoZSB1bmNvbXByZXNzZWQKKyAgIHN0cmVhbSB0byBmaW5kIHJlcGVhdGVkIGJ5dGUgc3RyaW5ncy4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZSBhcyBhCisgICBjaXJjdWxhciBidWZmZXIuICBUaGUgaW5kZXggaXMgdXBkYXRlZCBzaW1wbHkgYnkgaW5jcmVtZW50aW5nIGFuZCB0aGVuCisgICBBTkRpbmcgd2l0aCAweDdmZmYgKDMySy0xKS4gKi8KKy8qIEl0IGlzIGxlZnQgdG8gb3RoZXIgbW9kdWxlcyB0byBzdXBwbHkgdGhlIDMyIEsgYXJlYS4gIEl0IGlzIGFzc3VtZWQKKyAgIHRvIGJlIHVzYWJsZSBhcyBpZiBpdCB3ZXJlIGRlY2xhcmVkICJ1Y2ggc2xpZGVbMzI3NjhdOyIgb3IgYXMganVzdAorICAgInVjaCAqc2xpZGU7IiBhbmQgdGhlbiBtYWxsb2MnZWQgaW4gdGhlIGxhdHRlciBjYXNlLiAgVGhlIGRlZmluaXRpb24KKyAgIG11c3QgYmUgaW4gdW56aXAuaCwgaW5jbHVkZWQgYWJvdmUuICovCisvKiB1bnNpZ25lZCB3cDsgICAgICAgICAgICAgY3VycmVudCBwb3NpdGlvbiBpbiBzbGlkZSAqLworI2RlZmluZSB3cCBvdXRjbnQKKyNkZWZpbmUgZmx1c2hfb3V0cHV0KHcpICh3cD0odyksZmx1c2hfd2luZG93KCkpCisKKy8qIFRhYmxlcyBmb3IgZGVmbGF0ZSBmcm9tIFBLWklQJ3MgYXBwbm90ZS50eHQuICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgYm9yZGVyW10gPSB7CS8qIE9yZGVyIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgIDE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTUKK307CisKK3N0YXRpYyBjb25zdCB1c2ggY3BsZW5zW10gPSB7CS8qIENvcHkgbGVuZ3RocyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLworICAgIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsCisgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDAKK307CisKKwkvKiBub3RlOiBzZWUgbm90ZSAjMTMgYWJvdmUgYWJvdXQgdGhlIDI1OCBpbiB0aGlzIGxpc3QuICovCitzdGF0aWMgY29uc3QgdXNoIGNwbGV4dFtdID0gewkvKiBFeHRyYSBiaXRzIGZvciBsaXRlcmFsIGNvZGVzIDI1Ny4uMjg1ICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwLCA5OSwgOTkKK307CQkJCS8qIDk5PT1pbnZhbGlkICovCisKK3N0YXRpYyBjb25zdCB1c2ggY3BkaXN0W10gPSB7CS8qIENvcHkgb2Zmc2V0cyBmb3IgZGlzdGFuY2UgY29kZXMgMC4uMjkgKi8KKyAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCisgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAorICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcKK307CisKK3N0YXRpYyBjb25zdCB1c2ggY3BkZXh0W10gPSB7CS8qIEV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlIGNvZGVzICovCisgICAgMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwKKyAgICA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwKKyAgICAxMiwgMTIsIDEzLCAxMworfTsKKworLyogTWFjcm9zIGZvciBpbmZsYXRlKCkgYml0IHBlZWtpbmcgYW5kIGdyYWJiaW5nLgorICAgVGhlIHVzYWdlIGlzOgorCisgICAgICAgIE5FRURCSVRTKGopCisgICAgICAgIHggPSBiICYgbWFza19iaXRzW2pdOworICAgICAgICBEVU1QQklUUyhqKQorCisgICB3aGVyZSBORUVEQklUUyBtYWtlcyBzdXJlIHRoYXQgYiBoYXMgYXQgbGVhc3QgaiBiaXRzIGluIGl0LCBhbmQKKyAgIERVTVBCSVRTIHJlbW92ZXMgdGhlIGJpdHMgZnJvbSBiLiAgVGhlIG1hY3JvcyB1c2UgdGhlIHZhcmlhYmxlIGsKKyAgIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYi4gIE5vcm1hbGx5LCBiIGFuZCBrIGFyZSByZWdpc3RlcgorICAgdmFyaWFibGVzIGZvciBzcGVlZCwgYW5kIGFyZSBpbml0aWFsaXplZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgIHJvdXRpbmUgdGhhdCB1c2VzIHRoZXNlIG1hY3JvcyBmcm9tIGEgZ2xvYmFsIGJpdCBidWZmZXIgYW5kIGNvdW50LgorCisgICBJZiB3ZSBhc3N1bWUgdGhhdCBFT0Igd2lsbCBiZSB0aGUgbG9uZ2VzdCBjb2RlLCB0aGVuIHdlIHdpbGwgbmV2ZXIKKyAgIGFzayBmb3IgYml0cyB3aXRoIE5FRURCSVRTIHRoYXQgYXJlIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgICBTbywgTkVFREJJVFMgc2hvdWxkIG5vdCByZWFkIGFueSBtb3JlIGJ5dGVzIHRoYW4gYXJlIG5lZWRlZCB0bworICAgbWVldCB0aGUgcmVxdWVzdC4gIFRoZW4gbm8gYnl0ZXMgbmVlZCB0byBiZSAicmV0dXJuZWQiIHRvIHRoZSBidWZmZXIKKyAgIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgYmxvY2suCisKKyAgIEhvd2V2ZXIsIHRoaXMgYXNzdW1wdGlvbiBpcyBub3QgdHJ1ZSBmb3IgZml4ZWQgYmxvY2tzLS10aGUgRU9CIGNvZGUKKyAgIGlzIDcgYml0cywgYnV0IHRoZSBvdGhlciBsaXRlcmFsL2xlbmd0aCBjb2RlcyBjYW4gYmUgOCBvciA5IGJpdHMuCisgICAoVGhlIEVPQiBjb2RlIGlzIHNob3J0ZXIgdGhhbiBvdGhlciBjb2RlcyBiZWNhdXNlIGZpeGVkIGJsb2NrcyBhcmUKKyAgIGdlbmVyYWxseSBzaG9ydC4gIFNvLCB3aGlsZSBhIGJsb2NrIGFsd2F5cyBoYXMgYW4gRU9CLCBtYW55IG90aGVyCisgICBsaXRlcmFsL2xlbmd0aCBjb2RlcyBoYXZlIGEgc2lnbmlmaWNhbnRseSBsb3dlciBwcm9iYWJpbGl0eSBvZgorICAgc2hvd2luZyB1cCBhdCBhbGwuKSAgSG93ZXZlciwgYnkgbWFraW5nIHRoZSBmaXJzdCB0YWJsZSBoYXZlIGEKKyAgIGxvb2t1cCBvZiBzZXZlbiBiaXRzLCB0aGUgRU9CIGNvZGUgd2lsbCBiZSBmb3VuZCBpbiB0aGF0IGZpcnN0CisgICBsb29rdXAsIGFuZCBzbyB3aWxsIG5vdCByZXF1aXJlIHRoYXQgdG9vIG1hbnkgYml0cyBiZSBwdWxsZWQgZnJvbQorICAgdGhlIHN0cmVhbS4KKyAqLworCitTVEFUSUMgdWxnIGJiOwkJCS8qIGJpdCBidWZmZXIgKi8KK1NUQVRJQyB1bnNpZ25lZCBiazsJCS8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCitTVEFUSUMgY29uc3QgdXNoIG1hc2tfYml0c1tdID0geworICAgIDB4MDAwMCwKKyAgICAweDAwMDEsIDB4MDAwMywgMHgwMDA3LCAweDAwMGYsIDB4MDAxZiwgMHgwMDNmLCAweDAwN2YsIDB4MDBmZiwKKyAgICAweDAxZmYsIDB4MDNmZiwgMHgwN2ZmLCAweDBmZmYsIDB4MWZmZiwgMHgzZmZmLCAweDdmZmYsIDB4ZmZmZgorfTsKKworI2RlZmluZSBORVhUQllURSgpICAodWNoKWdldF9ieXRlKCkKKyNkZWZpbmUgTkVFREJJVFMobikge3doaWxlKGs8KG4pKXtifD0oKHVsZylORVhUQllURSgpKTw8aztrKz04O319CisjZGVmaW5lIERVTVBCSVRTKG4pIHtiPj49KG4pO2stPShuKTt9CisKKy8qCisgICBIdWZmbWFuIGNvZGUgZGVjb2RpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIGEgbXVsdGktbGV2ZWwgdGFibGUgbG9va3VwLgorICAgVGhlIGZhc3Rlc3Qgd2F5IHRvIGRlY29kZSBpcyB0byBzaW1wbHkgYnVpbGQgYSBsb29rdXAgdGFibGUgd2hvc2UKKyAgIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwgdGhlIHRpbWUgaXQgdGFrZXMKKyAgIHRvIGJ1aWxkIHRoaXMgdGFibGUgY2FuIGFsc28gYmUgYSBmYWN0b3IgaWYgdGhlIGRhdGEgYmVpbmcgZGVjb2RlZAorICAgaXMgbm90IHZlcnkgbG9uZy4gIFRoZSBtb3N0IGNvbW1vbiBjb2RlcyBhcmUgbmVjZXNzYXJpbHkgdGhlCisgICBzaG9ydGVzdCBjb2Rlcywgc28gdGhvc2UgY29kZXMgZG9taW5hdGUgdGhlIGRlY29kaW5nIHRpbWUsIGFuZCBoZW5jZQorICAgdGhlIHNwZWVkLiAgVGhlIGlkZWEgaXMgeW91IGNhbiBoYXZlIGEgc2hvcnRlciB0YWJsZSB0aGF0IGRlY29kZXMgdGhlCisgICBzaG9ydGVyLCBtb3JlIHByb2JhYmxlIGNvZGVzLCBhbmQgdGhlbiBwb2ludCB0byBzdWJzaWRpYXJ5IHRhYmxlcyBmb3IKKyAgIHRoZSBsb25nZXIgY29kZXMuICBUaGUgdGltZSBpdCBjb3N0cyB0byBkZWNvZGUgdGhlIGxvbmdlciBjb2RlcyBpcworICAgdGhlbiB0cmFkZWQgYWdhaW5zdCB0aGUgdGltZSBpdCB0YWtlcyB0byBtYWtlIGxvbmdlciB0YWJsZXMuCisKKyAgIFRoaXMgcmVzdWx0cyBvZiB0aGlzIHRyYWRlIGFyZSBpbiB0aGUgdmFyaWFibGVzIGxiaXRzIGFuZCBkYml0cworICAgYmVsb3cuICBsYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhlIGZpcnN0IGxldmVsIHRhYmxlIGZvciBsaXRlcmFsLworICAgbGVuZ3RoIGNvZGVzIGNhbiBkZWNvZGUgaW4gb25lIHN0ZXAsIGFuZCBkYml0cyBpcyB0aGUgc2FtZSB0aGluZyBmb3IKKyAgIHRoZSBkaXN0YW5jZSBjb2Rlcy4gIFN1YnNlcXVlbnQgdGFibGVzIGFyZSBhbHNvIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgdGhvc2Ugc2l6ZXMuICBUaGVzZSB2YWx1ZXMgbWF5IGJlIGFkanVzdGVkIGVpdGhlciB3aGVuIGFsbCBvZiB0aGUKKyAgIGNvZGVzIGFyZSBzaG9ydGVyIHRoYW4gdGhhdCwgaW4gd2hpY2ggY2FzZSB0aGUgbG9uZ2VzdCBjb2RlIGxlbmd0aCBpbgorICAgYml0cyBpcyB1c2VkLCBvciB3aGVuIHRoZSBzaG9ydGVzdCBjb2RlIGlzICpsb25nZXIqIHRoYW4gdGhlIHJlcXVlc3RlZAorICAgdGFibGUgc2l6ZSwgaW4gd2hpY2ggY2FzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBjb2RlIGluIGJpdHMgaXMKKyAgIHVzZWQuCisKKyAgIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIHR3byB0YWJsZXMsIHNpbmNlIHRoZXkgY29kZSBhCisgICBkaWZmZXJlbnQgbnVtYmVyIG9mIHBvc3NpYmlsaXRpZXMgZWFjaC4gIFRoZSBsaXRlcmFsL2xlbmd0aCB0YWJsZQorICAgY29kZXMgMjg2IHBvc3NpYmxlIHZhbHVlcywgb3IgaW4gYSBmbGF0IGNvZGUsIGEgbGl0dGxlIG92ZXIgZWlnaHQKKyAgIGJpdHMuICBUaGUgZGlzdGFuY2UgdGFibGUgY29kZXMgMzAgcG9zc2libGUgdmFsdWVzLCBvciBhIGxpdHRsZSBsZXNzCisgICB0aGFuIGZpdmUgYml0cywgZmxhdC4gIFRoZSBvcHRpbXVtIHZhbHVlcyBmb3Igc3BlZWQgZW5kIHVwIGJlaW5nCisgICBhYm91dCBvbmUgYml0IG1vcmUgdGhhbiB0aG9zZSwgc28gbGJpdHMgaXMgOCsxIGFuZCBkYml0cyBpcyA1KzEuCisgICBUaGUgb3B0aW11bSB2YWx1ZXMgbWF5IGRpZmZlciB0aG91Z2ggZnJvbSBtYWNoaW5lIHRvIG1hY2hpbmUsIGFuZAorICAgcG9zc2libHkgZXZlbiBiZXR3ZWVuIGNvbXBpbGVycy4gIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KKyAqLworCitTVEFUSUMgY29uc3QgaW50IGxiaXRzID0gOTsJLyogYml0cyBpbiBiYXNlIGxpdGVyYWwvbGVuZ3RoIGxvb2t1cCB0YWJsZSAqLworU1RBVElDIGNvbnN0IGludCBkYml0cyA9IDY7CS8qIGJpdHMgaW4gYmFzZSBkaXN0YW5jZSBsb29rdXAgdGFibGUgKi8KKworLyogSWYgQk1BWCBuZWVkcyB0byBiZSBsYXJnZXIgdGhhbiAxNiwgdGhlbiBoIGFuZCB4W10gc2hvdWxkIGJlIHVsZy4gKi8KKyNkZWZpbmUgQk1BWCAxNgkJCS8qIG1heGltdW0gYml0IGxlbmd0aCBvZiBhbnkgY29kZSAoMTYgZm9yIGV4cGxvZGUpICovCisjZGVmaW5lIE5fTUFYIDI4OAkJLyogbWF4aW11bSBudW1iZXIgb2YgY29kZXMgaW4gYW55IHNldCAqLworCitTVEFUSUMgdW5zaWduZWQgaHVmdHM7CQkvKiB0cmFjayBtZW1vcnkgdXNhZ2UgKi8KKworU1RBVElDIGludCBodWZ0X2J1aWxkKGIsIG4sIHMsIGQsIGUsIHQsIG0pCit1bnNpZ25lZCAqYjsJCQkvKiBjb2RlIGxlbmd0aHMgaW4gYml0cyAoYWxsIGFzc3VtZWQgPD0gQk1BWCkgKi8KK3Vuc2lnbmVkIG47CQkJLyogbnVtYmVyIG9mIGNvZGVzIChhc3N1bWVkIDw9IE5fTUFYKSAqLwordW5zaWduZWQgczsJCQkvKiBudW1iZXIgb2Ygc2ltcGxlLXZhbHVlZCBjb2RlcyAoMC4ucy0xKSAqLworY29uc3QgdXNoICpkOwkJCS8qIGxpc3Qgb2YgYmFzZSB2YWx1ZXMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KK2NvbnN0IHVzaCAqZTsJCQkvKiBsaXN0IG9mIGV4dHJhIGJpdHMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KK3N0cnVjdCBodWZ0ICoqdDsJCS8qIHJlc3VsdDogc3RhcnRpbmcgdGFibGUgKi8KK2ludCAqbTsJCQkJLyogbWF4aW11bSBsb29rdXAgYml0cywgcmV0dXJucyBhY3R1YWwgKi8KKy8qIEdpdmVuIGEgbGlzdCBvZiBjb2RlIGxlbmd0aHMgYW5kIGEgbWF4aW11bSB0YWJsZSBzaXplLCBtYWtlIGEgc2V0IG9mCisgICB0YWJsZXMgdG8gZGVjb2RlIHRoYXQgc2V0IG9mIGNvZGVzLiAgUmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb25lIGlmCisgICB0aGUgZ2l2ZW4gY29kZSBzZXQgaXMgaW5jb21wbGV0ZSAodGhlIHRhYmxlcyBhcmUgc3RpbGwgYnVpbHQgaW4gdGhpcworICAgY2FzZSksIHR3byBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCAoYWxsIHplcm8gbGVuZ3RoIGNvZGVzIG9yIGFuCisgICBvdmVyc3Vic2NyaWJlZCBzZXQgb2YgbGVuZ3RocyksIGFuZCB0aHJlZSBpZiBub3QgZW5vdWdoIG1lbW9yeS4gKi8KK3sKKyAgICB1bnNpZ25lZCBhOwkJCS8qIGNvdW50ZXIgZm9yIGNvZGVzIG9mIGxlbmd0aCBrICovCisgICAgdW5zaWduZWQgY1tCTUFYICsgMV07CS8qIGJpdCBsZW5ndGggY291bnQgdGFibGUgKi8KKyAgICB1bnNpZ25lZCBmOwkJCS8qIGkgcmVwZWF0cyBpbiB0YWJsZSBldmVyeSBmIGVudHJpZXMgKi8KKyAgICBpbnQgZzsJCQkvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisgICAgaW50IGg7CQkJLyogdGFibGUgbGV2ZWwgKi8KKyAgICByZWdpc3RlciB1bnNpZ25lZCBpOwkvKiBjb3VudGVyLCBjdXJyZW50IGNvZGUgKi8KKyAgICByZWdpc3RlciB1bnNpZ25lZCBqOwkvKiBjb3VudGVyICovCisgICAgcmVnaXN0ZXIgaW50IGs7CQkvKiBudW1iZXIgb2YgYml0cyBpbiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbDsJCQkvKiBiaXRzIHBlciB0YWJsZSAocmV0dXJuZWQgaW4gbSkgKi8KKyAgICByZWdpc3RlciB1bnNpZ25lZCAqcDsJLyogcG9pbnRlciBpbnRvIGNbXSwgYltdLCBvciB2W10gKi8KKyAgICByZWdpc3RlciBzdHJ1Y3QgaHVmdCAqcTsJLyogcG9pbnRzIHRvIGN1cnJlbnQgdGFibGUgKi8KKyAgICBzdHJ1Y3QgaHVmdCByOwkJLyogdGFibGUgZW50cnkgZm9yIHN0cnVjdHVyZSBhc3NpZ25tZW50ICovCisgICAgc3RydWN0IGh1ZnQgKnVbQk1BWF07CS8qIHRhYmxlIHN0YWNrICovCisgICAgdW5zaWduZWQgdltOX01BWF07CQkvKiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aCAqLworICAgIHJlZ2lzdGVyIGludCB3OwkJLyogYml0cyBiZWZvcmUgdGhpcyB0YWJsZSA9PSAobCAqIGgpICovCisgICAgdW5zaWduZWQgeFtCTUFYICsgMV07CS8qIGJpdCBvZmZzZXRzLCB0aGVuIGNvZGUgc3RhY2sgKi8KKyAgICB1bnNpZ25lZCAqeHA7CQkvKiBwb2ludGVyIGludG8geCAqLworICAgIGludCB5OwkJCS8qIG51bWJlciBvZiBkdW1teSBjb2RlcyBhZGRlZCAqLworICAgIHVuc2lnbmVkIHo7CQkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gY3VycmVudCB0YWJsZSAqLworCisgICAgREVCRygiaHVmdDEgIik7CisKKyAgICAvKiBHZW5lcmF0ZSBjb3VudHMgZm9yIGVhY2ggYml0IGxlbmd0aCAqLworICAgIG1lbXplcm8oYywgc2l6ZW9mKGMpKTsKKyAgICBwID0gYjsKKyAgICBpID0gbjsKKyAgICBkbyB7CisJVHJhY2VjdigqcCwKKwkJKHN0ZGVyciwKKwkJIChuIC0gaSA+PSAnICcKKwkJICAmJiBuIC0gaSA8PSAnficgPyAiJWMgJWRcbiIgOiAiMHgleCAlZFxuIiksIG4gLSBpLCAqcCkpOworCWNbKnBdKys7CQkvKiBhc3N1bWUgYWxsIGVudHJpZXMgPD0gQk1BWCAqLworCXArKzsJCQkvKiBDYW4ndCBjb21iaW5lIHdpdGggYWJvdmUgbGluZSAoU29sYXJpcyBidWcpICovCisgICAgfSB3aGlsZSAoLS1pKTsKKyAgICBpZiAoY1swXSA9PSBuKSB7CQkvKiBudWxsIGlucHV0LS1hbGwgemVybyBsZW5ndGggY29kZXMgKi8KKwkqdCA9IChzdHJ1Y3QgaHVmdCAqKU5VTEw7CisJKm0gPSAwOworCXJldHVybiAwOworICAgIH0KKworICAgIERFQkcoImh1ZnQyICIpOworCisgICAgLyogRmluZCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCwgYm91bmQgKm0gYnkgdGhvc2UgKi8KKyAgICBsID0gKm07CisgICAgZm9yIChqID0gMTsgaiA8PSBCTUFYOyBqKyspCisJaWYgKGNbal0pCisJICAgIGJyZWFrOworICAgIGsgPSBqOwkJCS8qIG1pbmltdW0gY29kZSBsZW5ndGggKi8KKyAgICBpZiAoKHVuc2lnbmVkKWwgPCBqKQorCWwgPSBqOworICAgIGZvciAoaSA9IEJNQVg7IGk7IGktLSkKKwlpZiAoY1tpXSkKKwkgICAgYnJlYWs7CisgICAgZyA9IGk7CQkJLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLworICAgIGlmICgodW5zaWduZWQpbCA+IGkpCisJbCA9IGk7CisgICAgKm0gPSBsOworCisgICAgREVCRygiaHVmdDMgIik7CisKKyAgICAvKiBBZGp1c3QgbGFzdCBsZW5ndGggY291bnQgdG8gZmlsbCBvdXQgY29kZXMsIGlmIG5lZWRlZCAqLworICAgIGZvciAoeSA9IDEgPDwgajsgaiA8IGk7IGorKywgeSA8PD0gMSkKKwlpZiAoKHkgLT0gY1tqXSkgPCAwKQorCSAgICByZXR1cm4gMjsJCS8qIGJhZCBpbnB1dDogbW9yZSBjb2RlcyB0aGFuIGJpdHMgKi8KKyAgICBpZiAoKHkgLT0gY1tpXSkgPCAwKQorCXJldHVybiAyOworICAgIGNbaV0gKz0geTsKKworICAgIERFQkcoImh1ZnQ0ICIpOworCisgICAgLyogR2VuZXJhdGUgc3RhcnRpbmcgb2Zmc2V0cyBpbnRvIHRoZSB2YWx1ZSB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKyAgICB4WzFdID0gaiA9IDA7CisgICAgcCA9IGMgKyAxOworICAgIHhwID0geCArIDI7CisgICAgd2hpbGUgKC0taSkgewkJLyogbm90ZSB0aGF0IGkgPT0gZyBmcm9tIGFib3ZlICovCisJKnhwKysgPSAoaiArPSAqcCsrKTsKKyAgICB9CisKKyAgICBERUJHKCJodWZ0NSAiKTsKKworICAgIC8qIE1ha2UgYSB0YWJsZSBvZiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aHMgKi8KKyAgICBwID0gYjsKKyAgICBpID0gMDsKKyAgICBkbyB7CisJaWYgKChqID0gKnArKykgIT0gMCkKKwkgICAgdlt4W2pdKytdID0gaTsKKyAgICB9IHdoaWxlICgrK2kgPCBuKTsKKworICAgIERFQkcoImg2ICIpOworCisgICAgLyogR2VuZXJhdGUgdGhlIEh1ZmZtYW4gY29kZXMgYW5kIGZvciBlYWNoLCBtYWtlIHRoZSB0YWJsZSBlbnRyaWVzICovCisgICAgeFswXSA9IGkgPSAwOwkJLyogZmlyc3QgSHVmZm1hbiBjb2RlIGlzIHplcm8gKi8KKyAgICBwID0gdjsJCQkvKiBncmFiIHZhbHVlcyBpbiBiaXQgb3JkZXIgKi8KKyAgICBoID0gLTE7CQkJLyogbm8gdGFibGVzIHlldC0tbGV2ZWwgLTEgKi8KKyAgICB3ID0gLWw7CQkJLyogYml0cyBkZWNvZGVkID09IChsICogaCkgKi8KKyAgICB1WzBdID0gKHN0cnVjdCBodWZ0ICopTlVMTDsJLyoganVzdCB0byBrZWVwIGNvbXBpbGVycyBoYXBweSAqLworICAgIHEgPSAoc3RydWN0IGh1ZnQgKilOVUxMOwkvKiBkaXR0byAqLworICAgIHogPSAwOwkJCS8qIGRpdHRvICovCisgICAgREVCRygiaDZhICIpOworCisgICAgLyogZ28gdGhyb3VnaCB0aGUgYml0IGxlbmd0aHMgKGsgYWxyZWFkeSBpcyBiaXRzIGluIHNob3J0ZXN0IGNvZGUpICovCisgICAgZm9yICg7IGsgPD0gZzsgaysrKSB7CisJREVCRygiaDZiICIpOworCWEgPSBjW2tdOworCXdoaWxlIChhLS0pIHsKKwkgICAgREVCRygiaDZiMSAiKTsKKwkgICAgLyogaGVyZSBpIGlzIHRoZSBIdWZmbWFuIGNvZGUgb2YgbGVuZ3RoIGsgYml0cyBmb3IgdmFsdWUgKnAgKi8KKwkgICAgLyogbWFrZSB0YWJsZXMgdXAgdG8gcmVxdWlyZWQgbGV2ZWwgKi8KKwkgICAgd2hpbGUgKGsgPiB3ICsgbCkgeworCQlERUJHMSgiMSAiKTsKKwkJaCsrOworCQl3ICs9IGw7CQkvKiBwcmV2aW91cyB0YWJsZSBhbHdheXMgbCBiaXRzICovCisKKwkJLyogY29tcHV0ZSBtaW5pbXVtIHNpemUgdGFibGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGwgYml0cyAqLworCQl6ID0gKHogPSBnIC0gdykgPiAodW5zaWduZWQpbCA/IGwgOiB6OwkvKiB1cHBlciBsaW1pdCBvbiB0YWJsZSBzaXplICovCisJCWlmICgoZiA9IDEgPDwgKGogPSBrIC0gdykpID4gYSArIDEpIHsJLyogdHJ5IGEgay13IGJpdCB0YWJsZSAqLy8qIHRvbyBmZXcgY29kZXMgZm9yIGstdyBiaXQgdGFibGUgKi8KKwkJICAgIERFQkcxKCIyICIpOworCQkgICAgZiAtPSBhICsgMTsJLyogZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgbGVmdCAqLworCQkgICAgeHAgPSBjICsgazsKKwkJICAgIHdoaWxlICgrK2ogPCB6KSB7CS8qIHRyeSBzbWFsbGVyIHRhYmxlcyB1cCB0byB6IGJpdHMgKi8KKwkJCWlmICgoZiA8PD0gMSkgPD0gKisreHApCisJCQkgICAgYnJlYWs7CS8qIGVub3VnaCBjb2RlcyB0byB1c2UgdXAgaiBiaXRzICovCisJCQlmIC09ICp4cDsJLyogZWxzZSBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucyAqLworCQkgICAgfQorCQl9CisJCURFQkcxKCIzICIpOworCQl6ID0gMSA8PCBqOwkvKiB0YWJsZSBlbnRyaWVzIGZvciBqLWJpdCB0YWJsZSAqLworCisJCS8qIGFsbG9jYXRlIGFuZCBsaW5rIGluIG5ldyB0YWJsZSAqLworCQlpZiAoKHEgPQorCQkgICAgIChzdHJ1Y3QgaHVmdCAqKW1hbGxvYygoeiArIDEpICogc2l6ZW9mKHN0cnVjdCBodWZ0KSkpID09CisJCSAgICAoc3RydWN0IGh1ZnQgKilOVUxMKSB7CisJCSAgICBpZiAoaCkKKwkJCWh1ZnRfZnJlZSh1WzBdKTsKKwkJICAgIHJldHVybiAzOwkvKiBub3QgZW5vdWdoIG1lbW9yeSAqLworCQl9CisJCURFQkcxKCI0ICIpOworCQlodWZ0cyArPSB6ICsgMTsJLyogdHJhY2sgbWVtb3J5IHVzYWdlICovCisJCSp0ID0gcSArIDE7CS8qIGxpbmsgdG8gbGlzdCBmb3IgaHVmdF9mcmVlKCkgKi8KKwkJKih0ID0gJihxLT52LnQpKSA9IChzdHJ1Y3QgaHVmdCAqKU5VTEw7CisJCXVbaF0gPSArK3E7CS8qIHRhYmxlIHN0YXJ0cyBhZnRlciBsaW5rICovCisKKwkJREVCRzEoIjUgIik7CisJCS8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSwgaWYgdGhlcmUgaXMgb25lICovCisJCWlmIChoKSB7CisJCSAgICB4W2hdID0gaTsJLyogc2F2ZSBwYXR0ZXJuIGZvciBiYWNraW5nIHVwICovCisJCSAgICByLmIgPSAodWNoKSBsOwkvKiBiaXRzIHRvIGR1bXAgYmVmb3JlIHRoaXMgdGFibGUgKi8KKwkJICAgIHIuZSA9ICh1Y2gpICgxNiArIGopOwkvKiBiaXRzIGluIHRoaXMgdGFibGUgKi8KKwkJICAgIHIudi50ID0gcTsJLyogcG9pbnRlciB0byB0aGlzIHRhYmxlICovCisJCSAgICBqID0gaSA+PiAodyAtIGwpOwkvKiAoZ2V0IGFyb3VuZCBUdXJibyBDIGJ1ZykgKi8KKwkJICAgIHVbaCAtIDFdW2pdID0gcjsJLyogY29ubmVjdCB0byBsYXN0IHRhYmxlICovCisJCX0KKwkJREVCRzEoIjYgIik7CisJICAgIH0KKwkgICAgREVCRygiaDZjICIpOworCisJICAgIC8qIHNldCB1cCB0YWJsZSBlbnRyeSBpbiByICovCisJICAgIHIuYiA9ICh1Y2gpIChrIC0gdyk7CisJICAgIGlmIChwID49IHYgKyBuKQorCQlyLmUgPSA5OTsJLyogb3V0IG9mIHZhbHVlcy0taW52YWxpZCBjb2RlICovCisJICAgIGVsc2UgaWYgKCpwIDwgcykgeworCQlyLmUgPSAodWNoKSAoKnAgPCAyNTYgPyAxNiA6IDE1KTsJLyogMjU2IGlzIGVuZC1vZi1ibG9jayBjb2RlICovCisJCXIudi5uID0gKHVzaCkgKCpwKTsJLyogc2ltcGxlIGNvZGUgaXMganVzdCB0aGUgdmFsdWUgKi8KKwkJcCsrOwkJLyogb25lIGNvbXBpbGVyIGRvZXMgbm90IGxpa2UgKnArKyAqLworCSAgICB9IGVsc2UgeworCQlyLmUgPSAodWNoKSBlWypwIC0gc107CS8qIG5vbi1zaW1wbGUtLWxvb2sgdXAgaW4gbGlzdHMgKi8KKwkJci52Lm4gPSBkWypwKysgLSBzXTsKKwkgICAgfQorCSAgICBERUJHKCJoNmQgIik7CisKKwkgICAgLyogZmlsbCBjb2RlLWxpa2UgZW50cmllcyB3aXRoIHIgKi8KKwkgICAgZiA9IDEgPDwgKGsgLSB3KTsKKwkgICAgZm9yIChqID0gaSA+PiB3OyBqIDwgejsgaiArPSBmKQorCQlxW2pdID0gcjsKKworCSAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBrLWJpdCBjb2RlIGkgKi8KKwkgICAgZm9yIChqID0gMSA8PCAoayAtIDEpOyBpICYgajsgaiA+Pj0gMSkKKwkJaSBePSBqOworCSAgICBpIF49IGo7CisKKwkgICAgLyogYmFja3VwIG92ZXIgZmluaXNoZWQgdGFibGVzICovCisJICAgIHdoaWxlICgoaSAmICgoMSA8PCB3KSAtIDEpKSAhPSB4W2hdKSB7CisJCWgtLTsJCS8qIGRvbid0IG5lZWQgdG8gdXBkYXRlIHEgKi8KKwkJdyAtPSBsOworCSAgICB9CisJICAgIERFQkcoImg2ZSAiKTsKKwl9CisJREVCRygiaDZmICIpOworICAgIH0KKworICAgIERFQkcoImh1ZnQ3ICIpOworCisgICAgLyogUmV0dXJuIHRydWUgKDEpIGlmIHdlIHdlcmUgZ2l2ZW4gYW4gaW5jb21wbGV0ZSB0YWJsZSAqLworICAgIHJldHVybiB5ICE9IDAgJiYgZyAhPSAxOworfQorCitTVEFUSUMgaW50IGh1ZnRfZnJlZSh0KQorc3RydWN0IGh1ZnQgKnQ7CQkJLyogdGFibGUgdG8gZnJlZSAqLworLyogRnJlZSB0aGUgbWFsbG9jJ2VkIHRhYmxlcyBidWlsdCBieSBodWZ0X2J1aWxkKCksIHdoaWNoIG1ha2VzIGEgbGlua2VkCisgICBsaXN0IG9mIHRoZSB0YWJsZXMgaXQgbWFkZSwgd2l0aCB0aGUgbGlua3MgaW4gYSBkdW1teSBmaXJzdCBlbnRyeSBvZgorICAgZWFjaCB0YWJsZS4gKi8KK3sKKyAgICByZWdpc3RlciBzdHJ1Y3QgaHVmdCAqcCwgKnE7CisKKyAgICAvKiBHbyB0aHJvdWdoIGxpbmtlZCBsaXN0LCBmcmVlaW5nIGZyb20gdGhlIG1hbGxvY2VkICh0Wy0xXSkgYWRkcmVzcy4gKi8KKyAgICBwID0gdDsKKyAgICB3aGlsZSAocCAhPSAoc3RydWN0IGh1ZnQgKilOVUxMKSB7CisJcSA9ICgtLXApLT52LnQ7CisJZnJlZSgoY2hhciAqKXApOworCXAgPSBxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworU1RBVElDIGludCBpbmZsYXRlX2NvZGVzKHRsLCB0ZCwgYmwsIGJkKQorc3RydWN0IGh1ZnQgKnRsLCAqdGQ7CQkvKiBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RlciB0YWJsZXMgKi8KK2ludCBibCwgYmQ7CQkJLyogbnVtYmVyIG9mIGJpdHMgZGVjb2RlZCBieSB0bFtdIGFuZCB0ZFtdICovCisvKiBpbmZsYXRlIChkZWNvbXByZXNzKSB0aGUgY29kZXMgaW4gYSBkZWZsYXRlZCAoY29tcHJlc3NlZCkgYmxvY2suCisgICBSZXR1cm4gYW4gZXJyb3IgY29kZSBvciB6ZXJvIGlmIGl0IGFsbCBnb2VzIG9rLiAqLworeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGU7CS8qIHRhYmxlIGVudHJ5IGZsYWcvbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBuLCBkOwkJLyogbGVuZ3RoIGFuZCBpbmRleCBmb3IgY29weSAqLworICAgIHVuc2lnbmVkIHc7CQkJLyogY3VycmVudCB3aW5kb3cgcG9zaXRpb24gKi8KKyAgICBzdHJ1Y3QgaHVmdCAqdDsJCS8qIHBvaW50ZXIgdG8gdGFibGUgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBtbCwgbWQ7CQkvKiBtYXNrcyBmb3IgYmwgYW5kIGJkIGJpdHMgKi8KKyAgICByZWdpc3RlciB1bGcgYjsJCS8qIGJpdCBidWZmZXIgKi8KKyAgICByZWdpc3RlciB1bnNpZ25lZCBrOwkvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKyAgICAvKiBtYWtlIGxvY2FsIGNvcGllcyBvZiBnbG9iYWxzICovCisgICAgYiA9IGJiOwkJCS8qIGluaXRpYWxpemUgYml0IGJ1ZmZlciAqLworICAgIGsgPSBiazsKKyAgICB3ID0gd3A7CQkJLyogaW5pdGlhbGl6ZSB3aW5kb3cgcG9zaXRpb24gKi8KKworICAgIC8qIGluZmxhdGUgdGhlIGNvZGVkIGRhdGEgKi8KKyAgICBtbCA9IG1hc2tfYml0c1tibF07CQkvKiBwcmVjb21wdXRlIG1hc2tzIGZvciBzcGVlZCAqLworICAgIG1kID0gbWFza19iaXRzW2JkXTsKKyAgICBmb3IgKDs7KSB7CQkJLyogZG8gdW50aWwgZW5kIG9mIGJsb2NrICovCisJTkVFREJJVFMoKHVuc2lnbmVkKWJsKQorCSAgICBpZiAoKGUgPSAodCA9IHRsICsgKCh1bnNpZ25lZCliICYgbWwpKS0+ZSkgPiAxNikKKwkgICAgZG8geworCQlpZiAoZSA9PSA5OSkKKwkJICAgIHJldHVybiAxOworCQlEVU1QQklUUyh0LT5iKQorCQkgICAgZSAtPSAxNjsKKwkJTkVFREJJVFMoZSkKKwkgICAgfSB3aGlsZSAoKGUgPSAodCA9IHQtPnYudCArICgodW5zaWduZWQpYiAmIG1hc2tfYml0c1tlXSkpLT5lKSA+IDE2KTsKKwlEVU1QQklUUyh0LT5iKQorCSAgICBpZiAoZSA9PSAxNikgewkvKiB0aGVuIGl0J3MgYSBsaXRlcmFsICovCisJICAgIHNsaWRlW3crK10gPSAodWNoKSB0LT52Lm47CisJICAgIFRyYWNldnYoKHN0ZGVyciwgIiVjIiwgc2xpZGVbdyAtIDFdKSk7CisJICAgIGlmICh3ID09IFdTSVpFKSB7CisJCWZsdXNoX291dHB1dCh3KTsKKwkJdyA9IDA7CisJICAgIH0KKwl9IGVsc2UgewkJLyogaXQncyBhbiBFT0Igb3IgYSBsZW5ndGggKi8KKworCSAgICAvKiBleGl0IGlmIGVuZCBvZiBibG9jayAqLworCSAgICBpZiAoZSA9PSAxNSkKKwkJYnJlYWs7CisKKwkgICAgLyogZ2V0IGxlbmd0aCBvZiBibG9jayB0byBjb3B5ICovCisJICAgIE5FRURCSVRTKGUpCisJCW4gPSB0LT52Lm4gKyAoKHVuc2lnbmVkKWIgJiBtYXNrX2JpdHNbZV0pOworCSAgICBEVU1QQklUUyhlKTsKKworCSAgICAvKiBkZWNvZGUgZGlzdGFuY2Ugb2YgYmxvY2sgdG8gY29weSAqLworCSAgICBORUVEQklUUygodW5zaWduZWQpYmQpCisJCWlmICgoZSA9ICh0ID0gdGQgKyAoKHVuc2lnbmVkKWIgJiBtZCkpLT5lKSA+IDE2KQorCQlkbyB7CisJCSAgICBpZiAoZSA9PSA5OSkKKwkJCXJldHVybiAxOworCQkgICAgRFVNUEJJVFModC0+YikKKwkJCWUgLT0gMTY7CisJCSAgICBORUVEQklUUyhlKQorCQl9IHdoaWxlICgoZSA9CisJCQkgICh0ID0gdC0+di50ICsgKCh1bnNpZ25lZCliICYgbWFza19iaXRzW2VdKSktPmUpID4gMTYpOworCSAgICBEVU1QQklUUyh0LT5iKQorCQlORUVEQklUUyhlKQorCQlkID0gdyAtIHQtPnYubiAtICgodW5zaWduZWQpYiAmIG1hc2tfYml0c1tlXSk7CisJICAgIERVTVBCSVRTKGUpCisJCVRyYWNldnYoKHN0ZGVyciwgIlxcWyVkLCVkXSIsIHcgLSBkLCBuKSk7CisKKwkgICAgLyogZG8gdGhlIGNvcHkgKi8KKwkgICAgZG8geworCQluIC09IChlID0KKwkJICAgICAgKGUgPSBXU0laRSAtICgoZCAmPSBXU0laRSAtIDEpID4gdyA/IGQgOiB3KSkgPiBuID8gbiA6IGUpOworI2lmICFkZWZpbmVkKE5PTUVNQ1BZKSAmJiAhZGVmaW5lZChERUJVRykKKwkJaWYgKHcgLSBkID49IGUpIHsJLyogKHRoaXMgdGVzdCBhc3N1bWVzIHVuc2lnbmVkIGNvbXBhcmlzb24pICovCisJCSAgICBtZW1jcHkoc2xpZGUgKyB3LCBzbGlkZSArIGQsIGUpOworCQkgICAgdyArPSBlOworCQkgICAgZCArPSBlOworCQl9IGVsc2UJCS8qIGRvIGl0IHNsb3cgdG8gYXZvaWQgbWVtY3B5KCkgb3ZlcmxhcCAqLworI2VuZGlmIC8qICFOT01FTUNQWSAqLworCQkgICAgZG8geworCQkJc2xpZGVbdysrXSA9IHNsaWRlW2QrK107CisJCQlUcmFjZXZ2KChzdGRlcnIsICIlYyIsIHNsaWRlW3cgLSAxXSkpOworCQkgICAgfSB3aGlsZSAoLS1lKTsKKwkJaWYgKHcgPT0gV1NJWkUpIHsKKwkJICAgIGZsdXNoX291dHB1dCh3KTsKKwkJICAgIHcgPSAwOworCQl9CisJICAgIH0gd2hpbGUgKG4pOworCX0KKyAgICB9CisKKyAgICAvKiByZXN0b3JlIHRoZSBnbG9iYWxzIGZyb20gdGhlIGxvY2FscyAqLworICAgIHdwID0gdzsJCQkvKiByZXN0b3JlIGdsb2JhbCB3aW5kb3cgcG9pbnRlciAqLworICAgIGJiID0gYjsJCQkvKiByZXN0b3JlIGdsb2JhbCBiaXQgYnVmZmVyICovCisgICAgYmsgPSBrOworCisgICAgLyogZG9uZSAqLworICAgIHJldHVybiAwOworfQorCitTVEFUSUMgaW50IGluZmxhdGVfc3RvcmVkKCkKKy8qICJkZWNvbXByZXNzIiBhbiBpbmZsYXRlZCB0eXBlIDAgKHN0b3JlZCkgYmxvY2suICovCit7CisgICAgdW5zaWduZWQgbjsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gYmxvY2sgKi8KKyAgICB1bnNpZ25lZCB3OwkJCS8qIGN1cnJlbnQgd2luZG93IHBvc2l0aW9uICovCisgICAgcmVnaXN0ZXIgdWxnIGI7CQkvKiBiaXQgYnVmZmVyICovCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgazsJLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisgICAgREVCRygiPHN0b3IiKTsKKworICAgIC8qIG1ha2UgbG9jYWwgY29waWVzIG9mIGdsb2JhbHMgKi8KKyAgICBiID0gYmI7CQkJLyogaW5pdGlhbGl6ZSBiaXQgYnVmZmVyICovCisgICAgayA9IGJrOworICAgIHcgPSB3cDsJCQkvKiBpbml0aWFsaXplIHdpbmRvdyBwb3NpdGlvbiAqLworCisgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICAgIG4gPSBrICYgNzsKKyAgICBEVU1QQklUUyhuKTsKKworICAgIC8qIGdldCB0aGUgbGVuZ3RoIGFuZCBpdHMgY29tcGxlbWVudCAqLworICAgIE5FRURCSVRTKDE2KQorCW4gPSAoKHVuc2lnbmVkKWIgJiAweGZmZmYpOworICAgIERVTVBCSVRTKDE2KQorCU5FRURCSVRTKDE2KQorCWlmIChuICE9ICh1bnNpZ25lZCkoKH5iKSAmIDB4ZmZmZikpCisJcmV0dXJuIDE7CQkvKiBlcnJvciBpbiBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICBEVU1QQklUUygxNikKKworCS8qIHJlYWQgYW5kIG91dHB1dCB0aGUgY29tcHJlc3NlZCBkYXRhICovCisJd2hpbGUgKG4tLSkgeworCU5FRURCSVRTKDgpCisJICAgIHNsaWRlW3crK10gPSAodWNoKSBiOworCWlmICh3ID09IFdTSVpFKSB7CisJICAgIGZsdXNoX291dHB1dCh3KTsKKwkgICAgdyA9IDA7CisJfQorCURVTVBCSVRTKDgpCisgICAgfQorCisgICAgLyogcmVzdG9yZSB0aGUgZ2xvYmFscyBmcm9tIHRoZSBsb2NhbHMgKi8KKyAgICB3cCA9IHc7CQkJLyogcmVzdG9yZSBnbG9iYWwgd2luZG93IHBvaW50ZXIgKi8KKyAgICBiYiA9IGI7CQkJLyogcmVzdG9yZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworICAgIGJrID0gazsKKworICAgIERFQkcoIj4iKTsKKyAgICByZXR1cm4gMDsKK30KKworU1RBVElDIGludCBpbmZsYXRlX2ZpeGVkKCkKKy8qIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgdHlwZSAxIChmaXhlZCBIdWZmbWFuIGNvZGVzKSBibG9jay4gIFdlIHNob3VsZAorICAgZWl0aGVyIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIGRlY29kZXIsIG9yIGF0IGxlYXN0IHByZWNvbXB1dGUgdGhlCisgICBIdWZmbWFuIHRhYmxlcy4gKi8KK3sKKyAgICBpbnQgaTsJCQkvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKyAgICBzdHJ1Y3QgaHVmdCAqdGw7CQkvKiBsaXRlcmFsL2xlbmd0aCBjb2RlIHRhYmxlICovCisgICAgc3RydWN0IGh1ZnQgKnRkOwkJLyogZGlzdGFuY2UgY29kZSB0YWJsZSAqLworICAgIGludCBibDsJCQkvKiBsb29rdXAgYml0cyBmb3IgdGwgKi8KKyAgICBpbnQgYmQ7CQkJLyogbG9va3VwIGJpdHMgZm9yIHRkICovCisgICAgdW5zaWduZWQgbFsyODhdOwkJLyogbGVuZ3RoIGxpc3QgZm9yIGh1ZnRfYnVpbGQgKi8KKworICAgIERFQkcoIjxmaXgiKTsKKworICAgIC8qIHNldCB1cCBsaXRlcmFsIHRhYmxlICovCisgICAgZm9yIChpID0gMDsgaSA8IDE0NDsgaSsrKQorCWxbaV0gPSA4OworICAgIGZvciAoOyBpIDwgMjU2OyBpKyspCisJbFtpXSA9IDk7CisgICAgZm9yICg7IGkgPCAyODA7IGkrKykKKwlsW2ldID0gNzsKKyAgICBmb3IgKDsgaSA8IDI4ODsgaSsrKQkvKiBtYWtlIGEgY29tcGxldGUsIGJ1dCB3cm9uZyBjb2RlIHNldCAqLworCWxbaV0gPSA4OworICAgIGJsID0gNzsKKyAgICBpZiAoKGkgPSBodWZ0X2J1aWxkKGwsIDI4OCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgJnRsLCAmYmwpKSAhPSAwKQorCXJldHVybiBpOworCisgICAgLyogc2V0IHVwIGRpc3RhbmNlIHRhYmxlICovCisgICAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspCS8qIG1ha2UgYW4gaW5jb21wbGV0ZSBjb2RlIHNldCAqLworCWxbaV0gPSA1OworICAgIGJkID0gNTsKKyAgICBpZiAoKGkgPSBodWZ0X2J1aWxkKGwsIDMwLCAwLCBjcGRpc3QsIGNwZGV4dCwgJnRkLCAmYmQpKSA+IDEpIHsKKwlodWZ0X2ZyZWUodGwpOworCisJREVCRygiPiIpOworCXJldHVybiBpOworICAgIH0KKworICAgIC8qIGRlY29tcHJlc3MgdW50aWwgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgICBpZiAoaW5mbGF0ZV9jb2Rlcyh0bCwgdGQsIGJsLCBiZCkpCisJcmV0dXJuIDE7CisKKyAgICAvKiBmcmVlIHRoZSBkZWNvZGluZyB0YWJsZXMsIHJldHVybiAqLworICAgIGh1ZnRfZnJlZSh0bCk7CisgICAgaHVmdF9mcmVlKHRkKTsKKyAgICByZXR1cm4gMDsKK30KKworU1RBVElDIGludCBpbmZsYXRlX2R5bmFtaWMoKQorLyogZGVjb21wcmVzcyBhbiBpbmZsYXRlZCB0eXBlIDIgKGR5bmFtaWMgSHVmZm1hbiBjb2RlcykgYmxvY2suICovCit7CisgICAgaW50IGk7CQkJLyogdGVtcG9yYXJ5IHZhcmlhYmxlcyAqLworICAgIHVuc2lnbmVkIGo7CisgICAgdW5zaWduZWQgbDsJCQkvKiBsYXN0IGxlbmd0aCAqLworICAgIHVuc2lnbmVkIG07CQkJLyogbWFzayBmb3IgYml0IGxlbmd0aHMgdGFibGUgKi8KKyAgICB1bnNpZ25lZCBuOwkJCS8qIG51bWJlciBvZiBsZW5ndGhzIHRvIGdldCAqLworICAgIHN0cnVjdCBodWZ0ICp0bDsJCS8qIGxpdGVyYWwvbGVuZ3RoIGNvZGUgdGFibGUgKi8KKyAgICBzdHJ1Y3QgaHVmdCAqdGQ7CQkvKiBkaXN0YW5jZSBjb2RlIHRhYmxlICovCisgICAgaW50IGJsOwkJCS8qIGxvb2t1cCBiaXRzIGZvciB0bCAqLworICAgIGludCBiZDsJCQkvKiBsb29rdXAgYml0cyBmb3IgdGQgKi8KKyAgICB1bnNpZ25lZCBuYjsJCS8qIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzICovCisgICAgdW5zaWduZWQgbmw7CQkvKiBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KKyAgICB1bnNpZ25lZCBuZDsJCS8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworI2lmZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgdW5zaWduZWQgbGxbMjg4ICsgMzJdOwkvKiBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisjZWxzZQorICAgIHVuc2lnbmVkIGxsWzI4NiArIDMwXTsJLyogbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworI2VuZGlmCisgICAgcmVnaXN0ZXIgdWxnIGI7CQkvKiBiaXQgYnVmZmVyICovCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgazsJLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisgICAgREVCRygiPGR5biIpOworCisgICAgLyogbWFrZSBsb2NhbCBiaXQgYnVmZmVyICovCisgICAgYiA9IGJiOworICAgIGsgPSBiazsKKworICAgIC8qIHJlYWQgaW4gdGFibGUgbGVuZ3RocyAqLworICAgIE5FRURCSVRTKDUpCisJbmwgPSAyNTcgKyAoKHVuc2lnbmVkKWIgJiAweDFmKTsJLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisgICAgRFVNUEJJVFMoNSkKKwlORUVEQklUUyg1KQorCW5kID0gMSArICgodW5zaWduZWQpYiAmIDB4MWYpOwkvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyAgICBEVU1QQklUUyg1KQorCU5FRURCSVRTKDQpCisJbmIgPSA0ICsgKCh1bnNpZ25lZCliICYgMHhmKTsJLyogbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgKi8KKyAgICBEVU1QQklUUyg0KQorI2lmZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisJaWYgKG5sID4gMjg4IHx8IG5kID4gMzIpCisjZWxzZQorCWlmIChubCA+IDI4NiB8fCBuZCA+IDMwKQorI2VuZGlmCisJcmV0dXJuIDE7CQkvKiBiYWQgbGVuZ3RocyAqLworCisgICAgREVCRygiZHluMSAiKTsKKworICAgIC8qIHJlYWQgaW4gYml0LWxlbmd0aC1jb2RlIGxlbmd0aHMgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgbmI7IGorKykgeworCU5FRURCSVRTKDMpCisJICAgIGxsW2JvcmRlcltqXV0gPSAodW5zaWduZWQpYiAmIDc7CisJRFVNUEJJVFMoMykKKyAgICB9CisgICAgZm9yICg7IGogPCAxOTsgaisrKQorCWxsW2JvcmRlcltqXV0gPSAwOworCisgICAgREVCRygiZHluMiAiKTsKKworICAgIC8qIGJ1aWxkIGRlY29kaW5nIHRhYmxlIGZvciB0cmVlcy0tc2luZ2xlIGxldmVsLCA3IGJpdCBsb29rdXAgKi8KKyAgICBibCA9IDc7CisgICAgaWYgKChpID0gaHVmdF9idWlsZChsbCwgMTksIDE5LCBOVUxMLCBOVUxMLCAmdGwsICZibCkpICE9IDApIHsKKwlpZiAoaSA9PSAxKQorCSAgICBodWZ0X2ZyZWUodGwpOworCXJldHVybiBpOwkJLyogaW5jb21wbGV0ZSBjb2RlIHNldCAqLworICAgIH0KKworICAgIERFQkcoImR5bjMgIik7CisKKyAgICAvKiByZWFkIGluIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworICAgIG4gPSBubCArIG5kOworICAgIG0gPSBtYXNrX2JpdHNbYmxdOworICAgIGkgPSBsID0gMDsKKyAgICB3aGlsZSAoKHVuc2lnbmVkKWkgPCBuKSB7CisJTkVFREJJVFMoKHVuc2lnbmVkKWJsKQorCSAgICBqID0gKHRkID0gdGwgKyAoKHVuc2lnbmVkKWIgJiBtKSktPmI7CisJRFVNUEJJVFMoaikKKwkgICAgaiA9IHRkLT52Lm47CisJaWYgKGogPCAxNikJCS8qIGxlbmd0aCBvZiBjb2RlIGluIGJpdHMgKDAuLjE1KSAqLworCSAgICBsbFtpKytdID0gbCA9IGo7CS8qIHNhdmUgbGFzdCBsZW5ndGggaW4gbCAqLworCWVsc2UgaWYgKGogPT0gMTYpIHsJLyogcmVwZWF0IGxhc3QgbGVuZ3RoIDMgdG8gNiB0aW1lcyAqLworCSAgICBORUVEQklUUygyKQorCQlqID0gMyArICgodW5zaWduZWQpYiAmIDMpOworCSAgICBEVU1QQklUUygyKQorCQlpZiAoKHVuc2lnbmVkKWkgKyBqID4gbikKKwkJcmV0dXJuIDE7CisJICAgIHdoaWxlIChqLS0pCisJCWxsW2krK10gPSBsOworCX0gZWxzZSBpZiAoaiA9PSAxNykgewkvKiAzIHRvIDEwIHplcm8gbGVuZ3RoIGNvZGVzICovCisJICAgIE5FRURCSVRTKDMpCisJCWogPSAzICsgKCh1bnNpZ25lZCliICYgNyk7CisJICAgIERVTVBCSVRTKDMpCisJCWlmICgodW5zaWduZWQpaSArIGogPiBuKQorCQlyZXR1cm4gMTsKKwkgICAgd2hpbGUgKGotLSkKKwkJbGxbaSsrXSA9IDA7CisJICAgIGwgPSAwOworCX0gZWxzZSB7CQkvKiBqID09IDE4OiAxMSB0byAxMzggemVybyBsZW5ndGggY29kZXMgKi8KKworCSAgICBORUVEQklUUyg3KQorCQlqID0gMTEgKyAoKHVuc2lnbmVkKWIgJiAweDdmKTsKKwkgICAgRFVNUEJJVFMoNykKKwkJaWYgKCh1bnNpZ25lZClpICsgaiA+IG4pCisJCXJldHVybiAxOworCSAgICB3aGlsZSAoai0tKQorCQlsbFtpKytdID0gMDsKKwkgICAgbCA9IDA7CisJfQorICAgIH0KKworICAgIERFQkcoImR5bjQgIik7CisKKyAgICAvKiBmcmVlIGRlY29kaW5nIHRhYmxlIGZvciB0cmVlcyAqLworICAgIGh1ZnRfZnJlZSh0bCk7CisKKyAgICBERUJHKCJkeW41ICIpOworCisgICAgLyogcmVzdG9yZSB0aGUgZ2xvYmFsIGJpdCBidWZmZXIgKi8KKyAgICBiYiA9IGI7CisgICAgYmsgPSBrOworCisgICAgREVCRygiZHluNWEgIik7CisKKyAgICAvKiBidWlsZCB0aGUgZGVjb2RpbmcgdGFibGVzIGZvciBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZXMgKi8KKyAgICBibCA9IGxiaXRzOworICAgIGlmICgoaSA9IGh1ZnRfYnVpbGQobGwsIG5sLCAyNTcsIGNwbGVucywgY3BsZXh0LCAmdGwsICZibCkpICE9IDApIHsKKwlERUJHKCJkeW41YiAiKTsKKwlpZiAoaSA9PSAxKSB7CisJICAgIGVycm9yKCIgaW5jb21wbGV0ZSBsaXRlcmFsIHRyZWUiKTsKKwkgICAgaHVmdF9mcmVlKHRsKTsKKwl9CisJcmV0dXJuIGk7CQkvKiBpbmNvbXBsZXRlIGNvZGUgc2V0ICovCisgICAgfQorICAgIERFQkcoImR5bjVjICIpOworICAgIGJkID0gZGJpdHM7CisgICAgaWYgKChpID0gaHVmdF9idWlsZChsbCArIG5sLCBuZCwgMCwgY3BkaXN0LCBjcGRleHQsICZ0ZCwgJmJkKSkgIT0gMCkgeworCURFQkcoImR5bjVkICIpOworCWlmIChpID09IDEpIHsKKwkgICAgZXJyb3IoIiBpbmNvbXBsZXRlIGRpc3RhbmNlIHRyZWUiKTsKKyNpZmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAorCSAgICBpID0gMDsKKwl9CisjZWxzZQorCSAgICBodWZ0X2ZyZWUodGQpOworCX0KKwlodWZ0X2ZyZWUodGwpOworCXJldHVybiBpOwkJLyogaW5jb21wbGV0ZSBjb2RlIHNldCAqLworI2VuZGlmCisgICAgfQorCisgICAgREVCRygiZHluNiAiKTsKKworICAgIC8qIGRlY29tcHJlc3MgdW50aWwgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgICBpZiAoaW5mbGF0ZV9jb2Rlcyh0bCwgdGQsIGJsLCBiZCkpCisJcmV0dXJuIDE7CisKKyAgICBERUJHKCJkeW43ICIpOworCisgICAgLyogZnJlZSB0aGUgZGVjb2RpbmcgdGFibGVzLCByZXR1cm4gKi8KKyAgICBodWZ0X2ZyZWUodGwpOworICAgIGh1ZnRfZnJlZSh0ZCk7CisKKyAgICBERUJHKCI+Iik7CisgICAgcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQgaW5mbGF0ZV9ibG9jayhlKQoraW50ICplOwkJCQkvKiBsYXN0IGJsb2NrIGZsYWcgKi8KKy8qIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgYmxvY2sgKi8KK3sKKyAgICB1bnNpZ25lZCB0OwkJCS8qIGJsb2NrIHR5cGUgKi8KKyAgICByZWdpc3RlciB1bGcgYjsJCS8qIGJpdCBidWZmZXIgKi8KKyAgICByZWdpc3RlciB1bnNpZ25lZCBrOwkvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKyAgICBERUJHKCI8YmxrIik7CisKKyAgICAvKiBtYWtlIGxvY2FsIGJpdCBidWZmZXIgKi8KKyAgICBiID0gYmI7CisgICAgayA9IGJrOworCisgICAgLyogcmVhZCBpbiBsYXN0IGJsb2NrIGJpdCAqLworICAgIE5FRURCSVRTKDEpCisJKiBlID0gKGludCliICYgMTsKKyAgICBEVU1QQklUUygxKQorCisJLyogcmVhZCBpbiBibG9jayB0eXBlICovCisJTkVFREJJVFMoMikKKwl0ID0gKHVuc2lnbmVkKWIgJiAzOworICAgIERVTVBCSVRTKDIpCisKKwkvKiByZXN0b3JlIHRoZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworCWJiID0gYjsKKyAgICBiayA9IGs7CisKKyAgICAvKiBpbmZsYXRlIHRoYXQgYmxvY2sgdHlwZSAqLworICAgIGlmICh0ID09IDIpCisJcmV0dXJuIGluZmxhdGVfZHluYW1pYygpOworICAgIGlmICh0ID09IDApCisJcmV0dXJuIGluZmxhdGVfc3RvcmVkKCk7CisgICAgaWYgKHQgPT0gMSkKKwlyZXR1cm4gaW5mbGF0ZV9maXhlZCgpOworCisgICAgREVCRygiPiIpOworCisgICAgLyogYmFkIGJsb2NrIHR5cGUgKi8KKyAgICByZXR1cm4gMjsKK30KKworU1RBVElDIGludCBpbmZsYXRlKCkKKy8qIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgZW50cnkgKi8KK3sKKyAgICBpbnQgZTsJCQkvKiBsYXN0IGJsb2NrIGZsYWcgKi8KKyAgICBpbnQgcjsJCQkvKiByZXN1bHQgY29kZSAqLworICAgIHVuc2lnbmVkIGg7CQkJLyogbWF4aW11bSBzdHJ1Y3QgaHVmdCdzIG1hbGxvYydlZCAqLworICAgIHZvaWQgKnB0cjsKKworICAgIC8qIGluaXRpYWxpemUgd2luZG93LCBiaXQgYnVmZmVyICovCisgICAgd3AgPSAwOworICAgIGJrID0gMDsKKyAgICBiYiA9IDA7CisKKyAgICAvKiBkZWNvbXByZXNzIHVudGlsIHRoZSBsYXN0IGJsb2NrICovCisgICAgaCA9IDA7CisgICAgZG8geworCWh1ZnRzID0gMDsKKwlnemlwX21hcmsoJnB0cik7CisJaWYgKChyID0gaW5mbGF0ZV9ibG9jaygmZSkpICE9IDApIHsKKwkgICAgZ3ppcF9yZWxlYXNlKCZwdHIpOworCSAgICByZXR1cm4gcjsKKwl9CisJZ3ppcF9yZWxlYXNlKCZwdHIpOworCWlmIChodWZ0cyA+IGgpCisJICAgIGggPSBodWZ0czsKKyAgICB9IHdoaWxlICghZSk7CisKKyAgICAvKiBVbmRvIHRvbyBtdWNoIGxvb2thaGVhZC4gVGhlIG5leHQgcmVhZCB3aWxsIGJlIGJ5dGUgYWxpZ25lZCBzbyB3ZQorICAgICAqIGNhbiBkaXNjYXJkIHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IG1lYW5pbmdmdWwgYnl0ZS4KKyAgICAgKi8KKyAgICB3aGlsZSAoYmsgPj0gOCkgeworCWJrIC09IDg7CisJdW5nZXRfYnl0ZSgpOworICAgIH0KKworICAgIC8qIGZsdXNoIG91dCBzbGlkZSAqLworICAgIGZsdXNoX291dHB1dCh3cCk7CisKKyAgICAvKiByZXR1cm4gc3VjY2VzcyAqLworI2lmZGVmIERFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICI8JXU+ICIsIGgpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIGZvbGxvd2luZyBhcmUgc3VwcG9ydCByb3V0aW5lcyBmb3IgaW5mbGF0ZS5jCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1bGcgY3JjXzMyX3RhYlsyNTZdOworc3RhdGljIHVsZyBjcmM7CQkJLyogaW5pdGlhbGl6ZWQgaW4gbWFrZWNyYygpIHNvIGl0J2xsIHJlc2lkZSBpbiBic3MgKi8KKyNkZWZpbmUgQ1JDX1ZBTFVFIChjcmMgXiAweGZmZmZmZmZmTCkKKworLyoKKyAqIENvZGUgdG8gY29tcHV0ZSB0aGUgQ1JDLTMyIHRhYmxlLiBCb3Jyb3dlZCBmcm9tCisgKiBnemlwLTEuMC4zL21ha2VjcmMuYy4KKyAqLworCitzdGF0aWMgdm9pZCBtYWtlY3JjKHZvaWQpCit7CisvKiBOb3QgY29weXJpZ2h0ZWQgMTk5MCBNYXJrIEFkbGVyCSovCisKKyAgICB1bnNpZ25lZCBsb25nIGM7CQkvKiBjcmMgc2hpZnQgcmVnaXN0ZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIGU7CQkvKiBwb2x5bm9taWFsIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuICovCisgICAgaW50IGk7CQkJLyogY291bnRlciBmb3IgYWxsIHBvc3NpYmxlIGVpZ2h0IGJpdCB2YWx1ZXMgKi8KKyAgICBpbnQgazsJCQkvKiBieXRlIGJlaW5nIHNoaWZ0ZWQgaW50byBjcmMgYXBwYXJhdHVzICovCisKKyAgICAvKiB0ZXJtcyBvZiBwb2x5bm9taWFsIGRlZmluaW5nIHRoaXMgY3JjIChleGNlcHQgeF4zMik6ICovCisgICAgc3RhdGljIGNvbnN0IGludCBwW10gPSB7IDAsIDEsIDIsIDQsIDUsIDcsIDgsIDEwLCAxMSwgMTIsIDE2LCAyMiwgMjMsIDI2IH07CisKKyAgICAvKiBNYWtlIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuIGZyb20gcG9seW5vbWlhbCAqLworICAgIGUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YocCkgLyBzaXplb2YoaW50KTsgaSsrKQorCWUgfD0gMUwgPDwgKDMxIC0gcFtpXSk7CisKKyAgICBjcmNfMzJfdGFiWzBdID0gMDsKKworICAgIGZvciAoaSA9IDE7IGkgPCAyNTY7IGkrKykgeworCWMgPSAwOworCWZvciAoayA9IGkgfCAyNTY7IGsgIT0gMTsgayA+Pj0gMSkgeworCSAgICBjID0gYyAmIDEgPyAoYyA+PiAxKSBeIGUgOiBjID4+IDE7CisJICAgIGlmIChrICYgMSkKKwkJYyBePSBlOworCX0KKwljcmNfMzJfdGFiW2ldID0gYzsKKyAgICB9CisKKyAgICAvKiB0aGlzIGlzIGluaXRpYWxpemVkIGhlcmUgc28gdGhpcyBjb2RlIGNvdWxkIHJlc2lkZSBpbiBST00gKi8KKyAgICBjcmMgPSAodWxnKSAweGZmZmZmZmZmTDsJLyogc2hpZnQgcmVnaXN0ZXIgY29udGVudHMgKi8KK30KKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEJLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IEFTQ0lJIHRleHQgKi8KKyNkZWZpbmUgQ09OVElOVUFUSU9OIDB4MDIJLyogYml0IDEgc2V0OiBjb250aW51YXRpb24gb2YgbXVsdGktcGFydCBnemlwIGZpbGUgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQJLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4CS8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAJLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBFTkNSWVBURUQgICAgMHgyMAkvKiBiaXQgNSBzZXQ6IGZpbGUgaXMgZW5jcnlwdGVkICovCisjZGVmaW5lIFJFU0VSVkVEICAgICAweEMwCS8qIGJpdCA2LDc6ICAgcmVzZXJ2ZWQgKi8KKworLyoKKyAqIERvIHRoZSB1bmNvbXByZXNzaW9uIQorICovCitpbnQgZ3VuemlwKHZvaWQpCit7CisgICAgaW50IHJlczsKKworICAgIC8qIERlY29tcHJlc3MgKi8KKyAgICBpZiAoKHJlcyA9IGluZmxhdGUoKSkpIHsKKwlzd2l0Y2ggKHJlcykgeworCWNhc2UgMDoKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBlcnJvcigiaW52YWxpZCBjb21wcmVzc2VkIGZvcm1hdCAoZXJyPTEpIik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgZXJyb3IoImludmFsaWQgY29tcHJlc3NlZCBmb3JtYXQgKGVycj0yKSIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIGVycm9yKCJvdXQgb2YgbWVtb3J5Iik7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGVycm9yKCJpbnZhbGlkIGNvbXByZXNzZWQgZm9ybWF0IChvdGhlcikiKTsKKwl9CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVtZGlzay9tZW1jcHkuUyBiL21lbWRpc2svbWVtY3B5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5ODZhMAotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svbWVtY3B5LlMKQEAgLTAsMCArMSw4NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBtZW1jcHkuUworICoKKyAqIFJlYXNvbmFibHkgZWZmaWNpZW50IG1lbWNweSwgdXNpbmcgYWxpZ25lZCB0cmFuc2ZlcnMgYXQgbGVhc3QKKyAqIGZvciB0aGUgZGVzdGluYXRpb24gb3BlcmFuZC4KKyAqLworCisJLnRleHQKKwkuZ2xvYmwJbWVtY3B5CisJLnR5cGUJbWVtY3B5LCBAZnVuY3Rpb24KK21lbWNweToKKwlqZWN4egkxZgorCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlwdXNobAklZWF4CQkvKiBSZXR1cm4gdmFsdWUgKi8KKworCW1vdmwJJWVheCwlZWRpCisJbW92bAklZWR4LCVlc2kKKworCS8qIEluaXRpYWwgYWxpZ25tZW50ICovCisJbW92bAklZWRpLCVlZHgKKwlzaHJsCSQxLCVlZHgKKwlqbmMJMTFmCisJbW92c2IKKwlkZWNsCSVlY3gKKzExOgorCW1vdmIJJWNsLCVhbAorCWNtcGwJJDIsJWVjeAorCWpiCTEzZgorCisJc2hybAkkMSwlZWR4CisJam5jCTEyZgorCW1vdnN3CisJc3VibAkkMiwlZWN4CisxMjoKKwkvKiBCdWxrIHRyYW5zZmVyICovCisJbW92YgklY2wsJWFsCisJc2hybAkkMiwlZWN4CisJcmVwOyBtb3ZzbAorCisJLyogRmluYWwgYWxpZ25tZW50ICovCisJdGVzdGIJJDIsJWFsCisJanoJMTRmCisJbW92c3cKKzEzOgorMTQ6CisJdGVzdGIJJDEsJWFsCisJanoJMTVmCisJbW92c2IKKzE1OgorCisJcG9wbAklZWF4CQkvKiBSZXR1cm4gdmFsdWUgKi8KKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKzE6CisJcmV0CisKKwkuc2l6ZQltZW1jcHksIC4tbWVtY3B5CmRpZmYgLS1naXQgYS9tZW1kaXNrL21lbWNweS5jIGIvbWVtZGlzay9tZW1jcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UyMDZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9tZW1jcHkuYwpAQCAtMCwwICsxLDI5IEBACisvKgorICogbWVtY3B5LmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgKm1lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisJY29uc3QgY2hhciAqcCA9IHNyYzsKKwljaGFyICpxID0gZHN0OworI2lmIGRlZmluZWQoX19pMzg2X18pCisJc2l6ZV90IG5sID0gbiA+PiAyOworCWFzbSB2b2xhdGlsZSAoImNsZCA7IHJlcCA7IG1vdnNsIDsgbW92bCAlMywlMCA7IHJlcCA7IG1vdnNiIjoiK2MiIChubCksCisJCSAgICAgICIrUyIocCksICIrRCIocSkKKwkJICAgICAgOiJyIihuICYgMykpOworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCXNpemVfdCBucSA9IG4gPj4gMzsKKwlhc20gdm9sYXRpbGUgKCJjbGQgOyByZXAgOyBtb3ZzcSA7IG1vdmwgJTMsJSVlY3ggOyByZXAgOyBtb3ZzYiI6IitjIgorCQkgICAgICAobnEpLCAiK1MiKHApLCAiK0QiKHEpCisJCSAgICAgIDoiciIoKHVpbnQzMl90KSAobiAmIDcpKSk7CisjZWxzZQorCXdoaWxlIChuLS0pIHsKKwkJKnErKyA9ICpwKys7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvbWVtZGlzay9tZW1kaXNrLmggYi9tZW1kaXNrL21lbWRpc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGE1YWZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9tZW1kaXNrLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1lbWRpc2suaAorICoKKyAqIE1pc2NlbGxhbmVvdXMgaGVhZGVyIGRlZmluaXRpb25zCisgKi8KKworI2lmbmRlZiBNRU1ESVNLX0gKKyNkZWZpbmUgTUVNRElTS19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogV2UgdXNlIHRoZSBjb20zMiBpbnRlcmZhY2UgZm9yIGNhbGxpbmcgMTYtYml0IGNvZGUgKi8KKyNpbmNsdWRlIDxjb20zMi5oPgorCisvKiBkZWZpbmUgaXQgb25seSBmb3IgaTM4NiAqLworI2lmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA0CisjZGVmaW5lIF9fY2RlY2wgX19hdHRyaWJ1dGVfXygoY2RlY2wscmVncGFybSgwKSkpCisjZW5kaWYKKwordm9pZCBfX2NkZWNsIGludGNhbGwodWludDhfdCwgY29tMzJzeXNfdCAqLCBjb20zMnN5c190ICopOworCisvKiBTdHJ1Y3R1cmUgcGFzc2VkIGluIGZyb20gdGhlIHJlYWwtbW9kZSBjb2RlICovCitzdHJ1Y3QgcmVhbF9tb2RlX2FyZ3MgeworICAgIHVpbnQzMl90IHJtX3JldHVybjsKKyAgICB1aW50MzJfdCBybV9pbnRjYWxsOworICAgIHVpbnQzMl90IHJtX2JvdW5jZTsKKyAgICB1aW50MzJfdCBybV9iYXNlOworICAgIHVpbnQzMl90IHJtX2hhbmRsZV9pbnRlcnJ1cHQ7CisgICAgdWludDMyX3Qgcm1fZ2R0OworICAgIHVpbnQzMl90IHJtX3NpemU7CisgICAgdWludDMyX3Qgcm1fcG1qbXA7CisgICAgdWludDMyX3Qgcm1fcm1qbXA7Cit9OworZXh0ZXJuIHN0cnVjdCByZWFsX21vZGVfYXJncyBybV9hcmdzOworI2RlZmluZSBzeXNfYm91bmNlICgodm9pZCAqKXJtX2FyZ3Mucm1fYm91bmNlKQorCisvKiBUaGlzIGlzIHRoZSBoZWFkZXIgaW4gdGhlIGJvb3Qgc2VjdG9yL3NldHVwIGFyZWEgKi8KK3N0cnVjdCBzZXR1cF9oZWFkZXIgeworICAgIGNoYXIgY21kbGluZVsweDFmMV07CisgICAgdWludDhfdCBzZXR1cF9zZWNzOworICAgIHVpbnQxNl90IHN5c3NpemU7CisgICAgdWludDE2X3Qgc3dhcF9kZXY7CisgICAgdWludDE2X3QgcmFtX3NpemU7CisgICAgdWludDE2X3QgdmlkX21vZGU7CisgICAgdWludDE2X3Qgcm9vdF9kZXY7CisgICAgdWludDE2X3QgYm9vdF9mbGFnOworICAgIHVpbnQxNl90IGp1bXA7CisgICAgY2hhciBoZWFkZXJbNF07CisgICAgdWludDE2X3QgdmVyc2lvbjsKKyAgICB1aW50MzJfdCByZWFsbW9kZV9zd3RjaDsKKyAgICB1aW50MzJfdCBzdGFydF9zeXM7CisgICAgdWludDhfdCB0eXBlX29mX2xvYWRlcjsKKyAgICB1aW50OF90IGxvYWRmbGFnczsKKyAgICB1aW50MTZfdCBzZXR1cF9tb3ZlX3NpemU7CisgICAgdWludDMyX3QgY29kZTMyX3N0YXJ0OworICAgIHVpbnQzMl90IHJhbWRpc2tfaW1hZ2U7CisgICAgdWludDMyX3QgcmFtZGlza19zaXplOworICAgIHVpbnQzMl90IGJvb3RzZWN0X2tsdWRnZTsKKyAgICB1aW50MTZfdCBoZWFkX2VuZF9wdHI7CisgICAgdWludDE2X3QgcGFkMTsKKyAgICB1aW50MzJfdCBjbWRfbGluZV9wdHI7CisgICAgdWludDMyX3QgaW5pdHJkX2FkZHJfbWF4OworICAgIHVpbnQzMl90IGVzZGk7CisgICAgdWludDMyX3QgZWR4OworICAgIHVpbnQzMl90IHNzc3A7CisgICAgdWludDMyX3QgY3NpcDsKK307CisjZGVmaW5lIHNoZHIgKChzdHJ1Y3Qgc2V0dXBfaGVhZGVyICopcm1fYXJncy5ybV9iYXNlKQorCisvKiBTdGFuZGFyZCByb3V0aW5lcyAqLwordm9pZCAqbWVtY3B5KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwordm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBzaXplX3QpOwordm9pZCAqbWVtbW92ZSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKworI2RlZmluZSBzdHJjcHkoYSxiKSAgIF9fYnVpbHRpbl9zdHJjcHkoYSxiKQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqX19hKQoreworICAgIGNvbnN0IGNoYXIgKl9fRDsKKyAgICBzaXplX3QgX19jOworCithc20oInJlcG5lO3NjYXNiIjoiPUQiKF9fRCksICI9YyIoX19jKQorOgkiRCIoX19hKSwgImMiKC0xKSwgImEiKDApLCAibSIoKl9fYSkpOworCisgICAgcmV0dXJuIF9fRCAtIF9fYSAtIDE7Cit9CisKKy8qIG1lbWNweSgpIGJ1dCByZXR1cm5zIGEgcG9pbnRlciB0byBlbmQgb2YgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgKm1lbXBjcHkodm9pZCAqX19kLCBjb25zdCB2b2lkICpfX3MsIHVuc2lnbmVkIGludCBfX24pCit7CisgICAgbWVtY3B5KF9fZCwgX19zLCBfX24pOworICAgIHJldHVybiAodm9pZCAqKSgoY2hhciAqKV9fZCArIF9fbik7Cit9CisKKy8qIG1lbWNtcCgpICovCitzdGF0aWMgaW5saW5lIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqX19hLCBjb25zdCB2b2lkICpfX2IsIHVuc2lnbmVkIGludCBfX24pCit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqX19hYSA9IF9fYTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpfX2JiID0gX19iOworICAgIGludCBfX2Q7CisKKyAgICB3aGlsZSAoX19uLS0pIHsKKwlfX2QgPSAqX19iYisrIC0gKl9fYWErKzsKKwlpZiAoX19kKQorCSAgICByZXR1cm4gX19kOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RpKHZvaWQpCit7CisgICAgYXNtIHZvbGF0aWxlKCJzdGkiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsaSh2b2lkKQoreworICAgIGFzbSB2b2xhdGlsZSgiY2xpIik7Cit9CisKKy8qIERlY29tcHJlc3Npb24gKi8KK2V4dGVybiBpbnQgY2hlY2tfemlwKHZvaWQgKmluZGF0YSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgKiB6Ynl0ZXNfcCwKKwkJICAgICB1aW50MzJfdCAqIGRieXRlc19wLCB1aW50MzJfdCAqIG9yaWdfY3JjLAorCQkgICAgIHVpbnQzMl90ICogb2Zmc2V0X3ApOworZXh0ZXJuIHZvaWQgKnVuemlwKHZvaWQgKmluZGF0YSwgdWludDMyX3QgemJ5dGVzLCB1aW50MzJfdCBkYnl0ZXMsCisJCSAgIHVpbnQzMl90IG9yaWdfY3JjLCB2b2lkICp0YXJnZXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lbWRpc2svbWVtZGlzay5pbmMgYi9tZW1kaXNrL21lbWRpc2suaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMDQwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL21lbWRpc2suaW5jCkBAIC0wLDAgKzEsMTE4OSBAQAorOyAtKi0gZnVuZGFtZW50YWwgLSotIChhc20tbW9kZSBzdWNrcykKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOworOyAgbWVtZGlzay5pbmMKKzsKKzsgIEEgcHJvZ3JhbSB0byBlbXVsYXRlIGFuIElOVCAxM2ggZGlzayBCSU9TIGZyb20gYSAiZGlzayIgaW4gZXh0ZW5kZWQKKzsgIG1lbW9yeS4KKzsKKzsgICBDb3B5cmlnaHQgMjAwMS0yMDA5IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCis7ICAgUG9ydGlvbnMgY29weXJpZ2h0IDIwMDkgU2hhbyBNaWxsZXIgW0VsIFRvcml0byBjb2RlLCBtQkZULCBzYWZlIGhvb2tdCis7Cis7ICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzsgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorOyAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKzsgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOworOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICIuLi92ZXJzaW9uLmdlbiIKKworOyAlZGVmaW5lIERFQlVHX1RSQUNFUlMJCQk7IFVuY29tbWVudCB0byBnZXQgZGVidWdnaW5nIHRyYWNlcnMKKworJWlmZGVmIERFQlVHX1RSQUNFUlMKKworJW1hY3JvIFRSQUNFUgkxCisJY2FsbCBkZWJ1Z190cmFjZXIKKwlkYiAlMQorJWVuZG1hY3JvCislbWFjcm8gV1JJVEVIRVgyIDAtMSBhbAorJWlmbmlkbmkgJTEsYWwKKwlwdXNoIGF4CisJbW92IGFsLCUxCisJY2FsbCB3cml0ZWhleDIKKwlwb3AgYXgKKyVlbHNlCisJY2FsbCB3cml0ZWhleDIKKyVlbmRpZgorJWVuZG1hY3JvCislbWFjcm8gV1JJVEVIRVg0IDAtMSBheAorJWlmbmlkbmkgJTEsYXgKKwlwdXNoIGF4CisJbW92IGF4LCUxCisJY2FsbCB3cml0ZWhleDQKKwlwb3AgYXgKKyVlbHNlCisJY2FsbCB3cml0ZWhleDQKKyVlbmRpZgorJWVuZG1hY3JvCislbWFjcm8gV1JJVEVIRVg4IDAtMSBlYXgKKyVpZm5pZG5pICUxLGVheAorCXB1c2ggZWF4CisJbW92IGVheCwlMQorCWNhbGwgd3JpdGVoZXg4CisJcG9wIGVheAorJWVsc2UKKwljYWxsIHdyaXRlaGV4OAorJWVuZGlmCislZW5kbWFjcm8KKworJWVsc2UJOyBERUJVR19UUkFDRVJTCisKKyVtYWNybwlUUkFDRVIJMQorJWVuZG1hY3JvCislbWFjcm8gV1JJVEVIRVgyIDAtMQorJWVuZG1hY3JvCislbWFjcm8gV1JJVEVIRVg0IDAtMQorJWVuZG1hY3JvCislbWFjcm8gV1JJVEVIRVg4IDAtMQorJWVuZG1hY3JvCisKKyVlbmRpZgk7IERFQlVHX1RSQUNFUlMKKworOyBGbGFncyB3ZSB0ZXN0IG91ciBjb25maWd1cmF0aW9uIGFnYWluc3QKKyVkZWZpbmUgQ09ORklHX1JFQURPTkxZCTB4MDEKKyVkZWZpbmUgQ09ORklHX1JBVwkweDAyCislZGVmaW5lIENPTkZJR19TQUZFSU5UCTB4MDQKKyVkZWZpbmUgQ09ORklHX0JJR1JBVwkweDA4CQk7IE1VU1QgYmUgOCEKKworCQlvcmcgMGgKKworJWRlZmluZQlTRUNUT1JTSVpFCSgxIDw8IFNFQ1RPUlNJWkVfTEcyKQorCisJCTsgUGFyYW1ldGVyIHJlZ2lzdGVycyBkZWZpbml0aW9uOyB0aGlzIGlzIHRoZSBkZWZpbml0aW9uCisJCTsgb2YgdGhlIHN0YWNrIGZyYW1lLgorJWRlZmluZQkJUF9EUwkJd29yZCBbYnArMzRdCislZGVmaW5lCQlQX0VTCQl3b3JkIFticCszMl0KKyVkZWZpbmUJCVBfRUFYCQlkd29yZCBbYnArMjhdCislZGVmaW5lCQlQX0hBWAkJd29yZCBbYnArMzBdCislZGVmaW5lCQlQX0FYCQl3b3JkIFticCsyOF0KKyVkZWZpbmUJCVBfQUwJCWJ5dGUgW2JwKzI4XQorJWRlZmluZQkJUF9BSAkJYnl0ZSBbYnArMjldCislZGVmaW5lCQlQX0VDWAkJZHdvcmQgW2JwKzI0XQorJWRlZmluZQkJUF9IQ1gJCXdvcmQgW2JwKzI2XQorJWRlZmluZQkJUF9DWAkJd29yZCBbYnArMjRdCislZGVmaW5lCQlQX0NMCQlieXRlIFticCsyNF0KKyVkZWZpbmUJCVBfQ0gJCWJ5dGUgW2JwKzI1XQorJWRlZmluZQkJUF9FRFgJCWR3b3JkIFticCsyMF0KKyVkZWZpbmUJCVBfSERYCQl3b3JkIFticCsyMl0KKyVkZWZpbmUJCVBfRFgJCXdvcmQgW2JwKzIwXQorJWRlZmluZQkJUF9ETAkJYnl0ZSBbYnArMjBdCislZGVmaW5lCQlQX0RICQlieXRlIFticCsyMV0KKyVkZWZpbmUJCVBfRUJYCQlkd29yZCBbYnArMTZdCislZGVmaW5lCQlQX0hCWAkJd29yZCBbYnArMThdCislZGVmaW5lCQlQX0hCWEwJCWJ5dGUgW2JwKzE4XQorJWRlZmluZQkJUF9CWAkJd29yZCBbYnArMTZdCislZGVmaW5lCQlQX0JMCQlieXRlIFticCsxNl0KKyVkZWZpbmUJCVBfQkgJCWJ5dGUgW2JwKzE3XQorJWRlZmluZQkJUF9FQlAJCWR3b3JkIFticCs4XQorJWRlZmluZQkJUF9CUAkJd29yZCBbYnArOF0KKyVkZWZpbmUJCVBfRVNJCQlkd29yZCBbYnArNF0KKyVkZWZpbmUJCVBfU0kJCXdvcmQgW2JwKzRdCislZGVmaW5lCQlQX0VESQkJZHdvcmQgW2JwXQorJWRlZmluZQkJUF9ESQkJd29yZCBbYnBdCisKKwkJc2VjdGlvbiAudGV4dAorCQk7IFRoZXNlIHBvaW50ZXJzIGFyZSB1c2VkIGJ5IHRoZSBpbnN0YWxsZXIgYW5kCisJCTsgbXVzdCBiZSBmaXJzdCBpbiB0aGUgYmluYXJ5CitQb2ludGVyczoJZHcgSW50MTNTdGFydAorCQlkdyBJbnQxNVN0YXJ0CisJCWR3IE1lbURpc2tfSW5mbwkJOyBQb3J0aW9ucyBhcmUgcGF0Y2hlZCBieSBpbnN0YWxsZXIKKwkJZHcgVG90YWxTaXplCisJCWR3IElyZXRQdHIKKworSXJldFB0cgkJZXF1IEludDEzU3RhcnQuaXJldAorSW50MTNTdGFydDoKKwkJam1wIHN0cmljdCBuZWFyIC5TYWZlSG9va0VuZCA7IDMtYnl0ZSBqdW1wCisJCWRiICckSU5UMTNTRicJCTsgU2lnbmF0dXJlIGZvciAic2FmZSBob29rIgorCQlkYiAnTUVNRElTSyAnCQk7IFZlbmRvciBJRAorCQlkZCAwCQkJOyBTRUc6T0ZGIG9mIHByZXZpb3VzIElOVCAxM2ggaG9vaworCQkJCQk7IE11c3QgYmUgZmlsbGVkIGluIGJ5IGluc3RhbGxlcgorCQlkZCAwCQkJOyAiU2FmZSBob29rIiBmbGFncworOyAtLS0tICJTYWZlIGhvb2siIHN0cnVjdHVyZSBlbmRzIGhlcmUgLS0tCisKKzsgVGhpcyBuZXh0IGZpZWxkIHNob3VsZCBiZSBndWFyYW50ZWVkIGF0IHRoaXMgcG9zaXRpb24gYWZ0ZXIgdGhlCis7ICJzYWZlIGhvb2siIHN0cnVjdHVyZS4gIFRoaXMgYWxsb3dzIGZvciBhIE1FTURJU0sgT1MgZHJpdmVyIHRvCis7IGltbWVkaWF0ZWx5IGZpbmQgb3V0IHRoZSBwYXJ0aWN1bGFyIHBhcmFtZXRlcnMgdXNpbmcgdGhlIG1CRlQKKzsgYW5kIE1ESSBzdHJ1Y3R1cmVzLiAgVGhpcyBiaW5hcnkgd2lsbCBoYXZlIHRoZSBvZmZzZXQgdG8gdGhlIG1CRlQKKzsgaW4gdGhpcyBmaWVsZCB0byBiZWdpbiB3aXRoLCBzbyB0aGUgaW5zdGFsbGVyIGtub3dzIHdoZXJlIHRoZSBtQkZUCis7IGlzLiAgVGhpcyBpcyBha2luIHRvIHRoZSAiUG9pbnRlcnMiIHNlY3Rpb24gYWJvdmUuICBUaGUgaW5zdGFsbGVyCis7IHdpbGwgcmVmaWxsIHRoaXMgZmllbGQgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbUJGVCBmb3IKKzsgZnV0dXJlIGNvbnN1bWVycywgc3VjaCBhcyBPUyBkcml2ZXJzLgorCQlkZCBtQkZUCQkJOyBPZmZzZXQgZnJvbSBob29rIHRvIHRoZSBtQkZUCisKKy5TYWZlSG9va0VuZDoKKwkJY21wIHdvcmQgW2NzOlJlY3Vyc2l2ZV0sMAorCQlqbmUgcmVjdXJzaXZlCisKKwkJOyBTd2FwIHN0YWNrCisJCW1vdiBbY3M6U3RhY2tdLGVzcAorCQltb3YgW2NzOlN0YWNrKzRdLHNzCisJCW1vdiBbY3M6U2F2ZWRBWF0sYXgKKwkJbW92IGF4LGNzCisJCW1vdiBzcyxheAorCQltb3Ygc3AsW2NzOk15U3RhY2tdCisKKyVpZiBFTFRPUklUTworCQljbXAgd29yZCBbY3M6U2F2ZWRBWF0sNGEwMGgJOyBFbCBUb3JpdG8gZnVuY3Rpb24/CisJCWphZSBvdXJfZHJpdmUJCQk7IFdlIGdyYWIgaXQKKyVlbmRpZgorCQk7IFNlZSBpZiBETCBwb2ludHMgdG8gb3VyIGNsYXNzIG9mIGRldmljZSAoRkQsIEhEKQorCQlwdXNoIGR4CisJCXB1c2ggZHgKKwkJeG9yIGRsLFtjczpEcml2ZU5vXQorCQlwb3AgZHgKKwkJanMgLm5vbWF0Y2gJCTsgSWYgU0Y9MCwgd2UgaGF2ZSBhIGNsYXNzIG1hdGNoIGhlcmUKKwkJCQkJOyAweDAwIHRoZSBzaWduIGJpdCBmb3IgRkQKKwkJCQkJOyAweDgwIHRoZSBzaWduIGJpdCBmb3IgSEQKKwkJanogb3VyX2RyaXZlCQk7IElmIFpGPTEsIHdlIGhhdmUgYW4gZXhhY3QgbWF0Y2gKKwkJY21wIGRsLFtjczpEcml2ZU5vXQorCQlqYiAubm9tYXRjaAkJOyBEcml2ZSA8IE91ciBkcml2ZQorCQljbXAgZGwsW2NzOkRyaXZlU2hpZnRMaW1pdF0KKwkJamFlIC5ub21hdGNoCQk7IERyaXZlID4gVGhlIG1heGltdW0gZHJpdmUKKwkJCQkJOyBudW1iZXIgdGhhdCB3ZSB3aWxsIHNoaWZ0IGZvci4KKwkJCQkJOyBUaGlzIGxlYXZlcyBhbnkgaGlnaGVyLXVwIEJJT1MKKwkJCQkJOyBkcml2ZXMgYWxvbmUsIHN1Y2ggYXMgYW4gb3B0aWNhbAorCQkJCQk7IGRpc2MgZHJpdmUgMHhBMCBvciAweEUwCisJCWRlYyBkbAkJCTsgRHJpdmUgPiBPdXIgZHJpdmUsIGFkanVzdCBkcml2ZSAjCisubm9tYXRjaDoKKwkJVFJBQ0VSICchJworCQlXUklURUhFWDIgZGwKKwkJVFJBQ0VSICcsJworCQltb3YgYXgsW2NzOlNhdmVkQVhdCisJCVdSSVRFSEVYNAorCQlpbmMgd29yZCBbY3M6UmVjdXJzaXZlXQorCQlwdXNoZgorCQljYWxsIGZhciBbY3M6T2xkSW50MTNdCisJCXB1c2hmCisJCWRlYyB3b3JkIFtjczpSZWN1cnNpdmVdCisJCXB1c2ggYnAKKwkJbW92IGJwLHNwCisJCWNtcCBieXRlIFtjczpTYXZlZEFYKzFdLDA4aAk7IEdldCBkcml2ZSBwYXJhbXMgZnVuY3Rpb24/CisJCWplIC5ub3Jlc3RvcmVkbAkJCTsgREwgPSBudW1iZXIgb2YgZHJpdmVzCisJCWNtcCBieXRlIFtjczpTYXZlZEFYKzFdLDE1aAk7IEdldCBkaXNrIHR5cGUgZnVuY3Rpb24/CisJCWpuZSAucmVzdG9yZWRsCisJCXRlc3QgYnl0ZSBbYnArNF0sODBoCQk7IEhhcmQgZGlzaz8KKwkJam56IC5ub3Jlc3RvcmVkbAkJOyBDWDpEWCA9IHNpemUgb2YgZGV2aWNlCisucmVzdG9yZWRsOgorCQltb3YgZGwsW2JwKzRdCisubm9yZXN0b3JlZGw6CisJCXB1c2ggYXgKKwkJcHVzaCBlYngKKwkJcHVzaCBkcworCQltb3YgYXgsW2JwKzJdCQk7IEZsYWdzCisJCWxkcyBlYngsW2NzOlN0YWNrXQorCQltb3YgW2J4KzRdLGFsCQk7IEFyaXRobWV0aWMgZmxhZ3MKKwkJcG9wIGRzCisJCXBvcCBlYngKKwkJcG9wIGF4CisJCXBvcCBicAorCQlsc3MgZXNwLFtjczpTdGFja10KKy5pcmV0OgkJaXJldAorCityZWN1cnNpdmU6CisJCVRSQUNFUiAnQCcKK2ptcF9vbGRpbnQxMzoKKwkJam1wIGZhciBbY3M6T2xkSW50MTNdCisKK291cl9kcml2ZToKKwkJOyBTZXQgdXAgc3RhbmRhcmQgZW50cnkgZnJhbWUKKwkJcHVzaCBkcworCQlwdXNoIGVzCisJCW1vdiBkcyxheAorCQltb3YgZXMsYXgKKwkJbW92IGF4LFtTYXZlZEFYXQorCQlwdXNoYWQKKwkJbW92IGJwLHNwCQk7IFBvaW50IEJQIHRvIHRoZSBlbnRyeSBzdGFjayBmcmFtZQorCQlUUkFDRVIgJ0YnCisJCVdSSVRFSEVYNAorCQk7IE5vdGU6IEFYID09IFBfQVggaGVyZQorCQljbXAgYWgsSW50MTNGdW5jc0NudC0xCisJCWphIEludmFsaWRfanVtcAorJWlmIEVMVE9SSVRPCisJCW1vdiBhbCxbQ0RfUEtULnR5cGVdCTsgQ2hlY2sgaWYgd2UgYXJlIGluCisJCWNtcCBhbCwwCQk7IEVsIFRvcml0byBubyBlbXVsYXRpb24gbW9kZQorCQlqYSAuZW11bGF0aW9uCQk7IE5vLiAgV2Ugc3VwcG9ydCB0aGUgZnVuY3Rpb24KKwkJY21wIGFoLDNmaAkJOyBZZXMuICBXZSBtdXN0IG5vdCBzdXBwb3J0IGZ1bmN0aW9ucworCQlqYmUgSW52YWxpZF9qdW1wCTsgMCB0aHJvdWdoIDNGaC4gIENoZWNrIGFuZCBkZWNpZGUKKy5lbXVsYXRpb246CislZW5kaWYKKwkJeG9yIGFsLGFsCQk7IEFMID0gMCBpcyBzdGFuZGFyZCBlbnRyeSBjb25kaXRpb24KKwkJbW92IGRpLGF4CisJCXNociBkaSw3CQk7IENvbnZlcnQgQUggdG8gYW4gb2Zmc2V0IGluIERJCisJCWNhbGwgW0ludDEzRnVuY3MrZGldCisKK0RvbmU6CQk7IFN0YW5kYXJkIHJvdXRpbmUgZm9yIHJldHVybgorCQltb3YgUF9BWCxheAorRG9uZVdlaXJkOgorCQlUUkFDRVIgJ0QnCisJCXhvciBieCxieAorCQltb3YgZXMsYngKKwkJbW92IGJ4LFtTdGF0dXNQdHJdCisJCW1vdiBbZXM6YnhdLGFoCQk7IFNhdmUgc3RhdHVzCisJCWFuZCBhaCxhaAorCisJCWxkcyBlYngsW1N0YWNrXQorCQk7IFRoaXMgc2V0cyB0aGUgbG93IGJ5dGUgKHRoZSBhcml0aG1ldGljIGZsYWdzKSBvZiB0aGUKKwkJOyBGTEFHUyBvbiBzdGFjayB0byBlaXRoZXIgMDBoIChubyBmbGFncykgb3IgMDFoIChDRikKKwkJOyBkZXBlbmRpbmcgb24gaWYgQUggd2FzIHplcm8gb3Igbm90LgorCQlzZXRueiBbYngrNF0JCTsgU2V0IENGIGlmZiBlcnJvcgorCQlwb3BhZAorCQlwb3AgZXMKKwkJcG9wIGRzCisJCWxzcyBlc3AsW2NzOlN0YWNrXQorCQlpcmV0CisKK1Jlc2V0OgorCQk7IFJlc2V0IGFmZmVjdHMgbXVsdGlwbGUgZHJpdmVzLCBzbyB3ZSBuZWVkIHRvIHBhc3MgaXQgb24KKwkJVFJBQ0VSICdSJworCQl4b3IgYXgsYXgJCTsgQm90dG9tIG9mIG1lbW9yeQorCQltb3YgZXMsYXgKKwkJdGVzdCBkbCxkbAkJOyBBbHdheXMgcGFzcyBpdCBvbiBpZiB3ZSBhcmUKKwkJCQkJOyByZXNldHRpbmcgSEQKKwkJanMgLmhhcmRfZGlzawkJOyBCaXQgNyBzZXQKKwkJOyBTb21lIEJJT1NlcyBnZXQgdmVyeSB1bmhhcHB5IGlmIHdlIHBhc3MgYSByZXNldCBmbG9wcHkKKwkJOyBjb21tYW5kIHRvIHRoZW0gYW5kIGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IGZsb3BwaWVzLgorCQk7IFRoaXMgaXMgYSBidWcsIGJ1dCB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBpdCBub250aGVsZXNzLgorCQk7IFRoZXJlZm9yZSwgaWYgd2UgYXJlIHRoZSAqT05MWSogZmxvcHB5IGRyaXZlLCBhbmQgdGhlCisJCTsgdXNlciBkaWRuJ3QgcmVxdWVzdCBIRCByZXNldCwgdGhlbiBqdXN0IGRyb3AgdGhlIGNvbW1hbmQuCisJCTsgQklPUyBlcXVpcG1lbnQgYnl0ZSwgdG9wIHR3byBiaXRzICsgMSA9PSB0b3RhbCAjIG9mIGZsb3BwaWVzCisJCXRlc3QgYnl0ZSBbZXM6MHg0MTBdLDBDMGgKKwkJanogc3VjY2VzcworCQlqbXAgLnBhc3Nfb24JCTsgLi4uIG90aGVyd2lzZSBwYXNzIGl0IHRvIHRoZSBCSU9TCisuaGFyZF9kaXNrOgorCQk7IC4uLiBzYW1lIHRoaW5nIGZvciBoYXJkIGRpc2tzLCBzaWdoIC4uLgorCQljbXAgYnl0ZSBbZXM6MHg0NzVdLDEJOyBCSU9TIHZhcmlhYmxlIGZvciBudW1iZXIgb2YgaGFyZAorCQkJCQk7IGRpc2tzCisJCWpiZSBzdWNjZXNzCisKKy5wYXNzX29uOgorCQlwb3AgYXgJCQk7IERyb3AgcmV0dXJuIGFkZHJlc3MKKwkJcG9wYWQJCQk7IFJlc3RvcmUgYWxsIHJlZ2lzdGVycworCQlwb3AgZXMKKwkJcG9wIGRzCisJCWxzcyBlc3AsW2NzOlN0YWNrXQk7IFJlc3RvcmUgdGhlIHN0YWNrCisJCWFuZCBkbCw4MGgJCTsgQ2xlYXIgYWxsIGJ1dCB0aGUgdHlwZSBiaXQKKwkJam1wIGptcF9vbGRpbnQxMworCisKK0ludmFsaWQ6CisJCXBvcCBkeAkJCTsgRHJvcCByZXR1cm4gYWRkcmVzcworSW52YWxpZF9qdW1wOgorCQlUUkFDRVIgJ0knCisJCW1vdiBhaCwwMWgJCTsgVW5zdXBwb3J0ZWQgZnVuY3Rpb24KKwkJam1wIHNob3J0IERvbmUKKworR2V0RHJpdmVUeXBlOgorCQl0ZXN0IGJ5dGUgW0RyaXZlTm9dLDgwaAorCQltb3YgYmwsMDJoCQk7IFR5cGUgMDJoID0gZmxvcHB5IHdpdGggY2hhbmdlbGluZQorCQlqeiAuZmxvcHB5CisJCTsgSGFyZCBkaXNrcyBvbmx5ISAgRE8gTk9UIHNldCBDWDpEWCBmb3IgZmxvcHBpZXMuLi4KKwkJOyBpdCBhcHBhcmVudGx5IGNhdXNlcyBXaW45OFNFIERPUyB0byBnbyBpbnRvIGFuIGxvb3AKKwkJOyByZXNldHRpbmcgdGhlIGRyaXZlIG92ZXIgYW5kIG92ZXIuICBTaWdoLgorCQlpbmMgYngJCQk7IFR5cGUgPSAwM2gKKwkJbW92IGR4LFtEaXNrU2l6ZV0JOyBSZXR1cm4gdGhlIGRpc2sgc2l6ZSBpbiBzZWN0b3JzCisJCW1vdiBQX0RYLGR4CisJCW1vdiBjeCxbRGlza1NpemUrMl0KKwkJbW92IFBfQ1gsY3gKKy5mbG9wcHk6CisJCW1vdiBQX0FILGJsCQk7IDAyaCBmbG9wcHksIDAzaCBoYXJkIGRpc2sKKwkJcG9wIGF4CQkJOyBEcm9wIHJldHVybiBhZGRyZXNzCisJCXhvciBheCxheAkJOyBTdWNjZXNzLi4uCisJCWptcCBEb25lV2VpcmQJCTsgQnV0IGRvbid0IHN0aWNrIGl0IGludG8gUF9BWAorCitHZXRTdGF0dXM6CisJCXhvciBheCxheAorCQltb3YgZXMsYXgKKwkJbW92IGJ4LFtTdGF0dXNQdHJdCisJCW1vdiBhaCxbYnhdCQk7IENvcHkgbGFzdCBzdGF0dXMKKwkJcmV0CisKK1JlYWRNdWx0OgorCQlUUkFDRVIgJ20nCitSZWFkOgorCQlUUkFDRVIgJ1InCisJCWNhbGwgc2V0dXBfcmVncworZG9fY29weToKKwkJVFJBQ0VSICc8JworCQljYWxsIGJjb3B5CisJCVRSQUNFUiAnPicKKwkJbW92enggYXgsUF9BTAkJOyBBSCA9IDAsIEFMID0gdHJhbnNmZXIgY291bnQKKwkJcmV0CisKK1dyaXRlTXVsdDoKKwkJVFJBQ0VSICdNJworV3JpdGU6CisJCVRSQUNFUiAnVycKKwkJdGVzdCBieXRlIFtDb25maWdGbGFnc10sQ09ORklHX1JFQURPTkxZCisJCWpueiAucmVhZG9ubHkKKwkJY2FsbCBzZXR1cF9yZWdzCisJCXhjaGcgZXNpLGVkaQkJOyBPcHBvc2l0ZSBkaXJlY3Rpb24gb2YgYSBSZWFkIQorCQlqbXAgc2hvcnQgZG9fY29weQorLnJlYWRvbmx5Ogltb3YgYWgsMDNoCQk7IFdyaXRlIHByb3RlY3RlZCBtZWRpdW0KKwkJcmV0CisKKwkJOyBWZXJpZnkgaW50ZWdyaXR5OyBqdXN0IGJvdW5kcy1jaGVjaworU2VlazoKK1ZlcmlmeToKKwkJY2FsbCBzZXR1cF9yZWdzCQk7IFJldHVybnMgZXJyb3IgaWYgYXBwcm9wcmlhdGUKKwkJOyBBbmQgZmFsbCB0aHJvdWdoIHRvIHN1Y2Nlc3MKKworQ2hlY2tJZlJlYWR5OgkJCQk7IFRoZXNlIGFyZSBhbHdheXMtc3VjY2Vzc2Z1bCBub29wIGZ1bmN0aW9ucworUmVjYWxpYnJhdGU6CitJbml0V2l0aFBhcm1zOgorRGV0ZWN0Q2hhbmdlOgorRURERGV0ZWN0Q2hhbmdlOgorRURETG9jazoKK1NldE1vZGU6CitzdWNjZXNzOgorCQl4b3IgYXgsYXgJCTsgQWx3YXlzIHN1Y2Nlc3NmdWwKKwkJcmV0CisKK0dldFBhcm1zOgorCQlUUkFDRVIgJ0cnCisJCW1vdiBkbCxbRHJpdmVDbnRdCTsgQ2FjaGVkIGRhdGEKKwkJbW92IFBfREwsZGwKKwkJdGVzdCBieXRlIFtEcml2ZU5vXSw4MGgKKwkJam56IC5oZAorCQltb3YgUF9ESSxEUFQKKwkJbW92IFBfRVMsY3MKKwkJbW92IGJsLFtEcml2ZVR5cGVdCisJCW1vdiBQX0JMLGJsCisuaGQ6CisJCW1vdiBheCxbQ3lsaW5kZXJzXQorCQlkZWMgYXgJCQk7IFdlIHJlcG9ydCB0aGUgaGlnaGVzdCAjLCBub3QgdGhlIGNvdW50CisJCXhjaGcgYWwsYWgKKwkJc2hsIGFsLDYKKwkJb3IgYWwsW1NlY3RvcnNdCisJCW1vdiBQX0NYLGF4CisJCW1vdiBheCxbSGVhZHNdCisJCWRlYyBheAorCQltb3YgUF9ESCxhbAorCisJCTsKKwkJOyBJcyB0aGlzIE1FTURJU0sgaW5zdGFsbGF0aW9uIGNoZWNrPworCQk7CisJCWNtcCBQX0hBWCwnTUUnCisJCWpuZSAubm90aWMKKwkJY21wIFBfSENYLCdNRCcKKwkJam5lIC5ub3RpYworCQljbXAgUF9IRFgsJ0lTJworCQlqbmUgLm5vdGljCisJCWNtcCBQX0hCWCwnSz8nCisJCWpuZSAubm90aWMKKworCQk7IE1FTURJU0sgaW5zdGFsbGF0aW9uIGNoZWNrLi4uCisJCW1vdiBQX0hBWCwnIU0nCisJCW1vdiBQX0hDWCwnRU0nCisJCW1vdiBQX0hEWCwnREknCisJCW1vdiBQX0hCWCwnU0snCisJCW1vdiBQX0VTLGNzCisJCW1vdiBQX0RJLE1lbURpc2tfSW5mbworCisubm90aWM6CisJCXhvciBheCxheAorCQlyZXQKKzsKKzsgRUREIGZ1bmN0aW9ucyAtLSBvbmx5IGlmIGVuYWJsZWQKKzsKKyVpZiBFREQKK0VERFByZXNlbmNlOgorCQlUUkFDRVIgJ0UnCisJCVRSQUNFUiAnYycKKworCQljbXAgUF9CWCw1NUFBaAorCQlqbmUgSW52YWxpZAorCQltb3YgUF9CWCwwQUE1NWgJCTsgRUREIHNpZ25hdHVyZQorCQltb3YgUF9BWCwwMzAwMGgJCTsgRUREIDMuMAorCQltb3YgUF9DWCwwMDA3aAkJOyBCaXQgMCAtIEZpeGVkIGRpc2sgYWNjZXNzIHN1YnNldAorCQkJCQk7IEJpdCAxIC0gTG9ja2luZyBhbmQgZWplY3Rpbmcgc3Vic2V0CisJCQkJCTsgQml0IDIgLSBFREQgc3Vic2V0CisJCXBvcCBheAkJCTsgRHJvcCByZXR1cm4gYWRkcmVzcworCQl4b3IgYXgsYXgJCTsgU3VjY2VzcworCQlqbXAgRG9uZVdlaXJkCQk7IFN1Y2Nlc3MsIGJ1dCBBSCAhPSAwLCBzaWdoLi4uCisKK0VERFJlYWQ6CisJCVRSQUNFUiAnRScKKwkJVFJBQ0VSICdyJworCisJCWNhbGwgZWRkX3NldHVwX3JlZ3MKKwkJY2FsbCBiY29weQorCQl4b3IgYXgsYXgKKwkJcmV0CisKK0VERFdyaXRlOgorCQlUUkFDRVIgJ0UnCisJCVRSQUNFUiAndycKKworCQljYWxsIGVkZF9zZXR1cF9yZWdzCisJCXhjaGcgZXNpLGVkaQkJOyBPcHBvc2l0ZSBkaXJlY3Rpb24gb2YgYSBSZWFkIQorCQljYWxsIGJjb3B5CisJCXhvciBheCxheAorCQlyZXQKKworRUREVmVyaWZ5OgorRUREU2VlazoKKwkJY2FsbCBlZGRfc2V0dXBfcmVncwk7IEp1c3QgYm91bmRzIGNoZWNraW5nCisJCXhvciBheCxheAorCQlyZXQKKworRURER2V0UGFybXM6CisJCVRSQUNFUiAnRScKKwkJVFJBQ0VSICdwJworCisJCW1vdiBlcyxQX0RTCisJCW1vdiBkaSxQX1NJCisJCW1vdiBzaSxFRERfRFBUCisKKwkJbG9kc3cJCQk7IExlbmd0aCBvZiBvdXIgRFBUCisJCW1vdiBjeCxbZXM6ZGldCisJCWNtcCBjeCwyNgkJOyBNaW5pbXVtIHNpemUKKwkJamIgLm92ZXJydW4KKworCQljbXAgY3gsYXgKKwkJamIgLm9rc2l6ZQorCQltb3YgY3gsYXgKKworLm9rc2l6ZToKKwkJbW92IGF4LGN4CisJCXN0b3N3CisJCWRlYyBjeAorCQlkZWMgY3gKKwkJcmVwIG1vdnNiCisKKwkJeG9yIGF4LGF4CisJCXJldAorCisub3ZlcnJ1bjoKKwkJbW92IGF4LDAxMDBoCisJCXJldAorJWVuZGlmIDsgRURECisKKwkJOyBTZXQgdXAgcmVnaXN0ZXJzIGFzIGZvciBhICJSZWFkIiwgYW5kIGNvbXBhcmVzIGFnYWluc3QgZGlzaworCQk7IHNpemUuCisJCTsgV0FSTklORzogVGhpcyBmYWlscyBpbW1lZGlhdGVseSwgZXZlbiBpZiB3ZSBjYW4gdHJhbnNmZXIgc29tZQorCQk7IHNlY3RvcnMuICBUaGlzIGlzbid0IHJlYWxseSB0aGUgY29ycmVjdCBiZWhhdmlvdXIuCitzZXR1cF9yZWdzOgorCisJCTsgQ29udmVydCBhIENIUyBhZGRyZXNzIGluIFBfQ1gvUF9ESCBpbnRvIGFuIExCQSBpbiBlYXgKKwkJOyBDSCA9IGN5bFs3OjBdCisJCTsgQ0xbMDo1XSA9IHNlY3RvciAoMS1iYXNlZCkgIENMWzc6Nl0gPSBjeWxbOTo4XQorCQk7IERIID0gaGVhZAorCQltb3Z6eCBlY3gsUF9DWAorCQltb3Z6eCBlYngsY2wJCTsgU2VjdG9yIG51bWJlcgorCQlhbmQgYmwsM0ZoCisJCWRlYyBlYngJCQk7IFNlY3RvciBudW1iZXIgaXMgMS1iYXNlZAorCQljbXAgYngsW1NlY3RvcnNdCisJCWphZSAub3ZlcnJ1bgorCQltb3Z6eCBlZGksUF9ESAkJOyBIZWFkIG51bWJlcgorCQltb3Z6eCBlYXgsd29yZCBbSGVhZHNdCisJCWNtcCBkaSxheAorCQlqYWUgLm92ZXJydW4KKwkJc2hyIGNsLDYKKwkJeGNoZyBjbCxjaAkJOyBOb3cgKEUpQ1ggPC0gY3lsaW5kZXIgbnVtYmVyCisJCW11bCBlY3gJCQk7IGVheCA8LSBIZWFkcypjeWwjIChlZHggPC0gMCkKKwkJYWRkIGVheCxlZGkKKwkJbXVsIGR3b3JkIFtTZWN0b3JzXQorCQlhZGQgZWF4LGVieAorCQk7IE5vdyBlYXggPSBMQkEsIGVkeCA9IDAKKworCQk7CisJCTsgc2V0dXBfcmVncyBjb250aW51ZXMuLi4KKwkJOworCQk7IE5vdGU6IGVkaVszMToxNl0gYW5kIGVjeFszMToxNl0gPSAwIGFscmVhZHkKKwkJbW92IGRpLFBfQlgJCTsgR2V0IGxpbmVhciBhZGRyZXNzIG9mIHRhcmdldCBidWZmZXIKKwkJbW92IGN4LFBfRVMKKwkJc2hsIGVjeCw0CisJCWFkZCBlZGksZWN4CQk7IEVESSA9IGFkZHJlc3MgdG8gZmV0Y2ggdG8KKwkJbW92enggZWN4LFBfQUwJCTsgU2VjdG9yIGNvdW50CisJCW1vdiBlc2ksZWF4CisJCWFkZCBlYXgsZWN4CQk7IExCQSBvZiBmaW5hbCBzZWN0b3IgKyAxCisJCXNobCBlc2ksU0VDVE9SU0laRV9MRzIJOyBMQkEgLT4gYnl0ZSBvZmZzZXQKKwkJYWRkIGVzaSxbRGlza0J1Zl0JOyBHZXQgYWRkcmVzcyBpbiBoaWdoIG1lbW9yeQorCQljbXAgZWF4LFtEaXNrU2l6ZV0JOyBDaGVjayB0aGUgaGlnaCBtYXJrIGFnYWluc3QgbGltaXQKKwkJamEgLm92ZXJydW4KKwkJc2hsIGVjeCxTRUNUT1JTSVpFX0xHMi0yIDsgQ29udmVydCBjb3VudCB0byBkd29yZHMKKwkJcmV0CisKKy5vdmVycnVuOglwb3AgYXgJCQk7IERyb3Agc2V0dXBfcmVncyByZXR1cm4gYWRkcmVzcworCQltb3YgYXgsMDIwMGgJCTsgTWlzc2luZyBhZGRyZXNzIG1hcmsKKwkJcmV0CQkJOyBSZXR1cm4gdG8gRG9uZQorCisJCTsgU2V0IHVwIHJlZ2lzdGVycyBhcyBmb3IgYW4gRUREIFJlYWQsIGFuZCBjb21wYXJlcyBhZ2FpbnN0IGRpc2sgc2l6ZS4KKyVpZiBFREQKK2VkZF9zZXR1cF9yZWdzOgorCQlwdXNoIGVzCisJCW1vdiBzaSxQX1NJCQk7IERTOlNJIC0+IERBUEEKKwkJbW92IGVzLFBfRFMKKworCQltb3YgZHgsW2VzOnNpXQorCQljbXAgZHgsMTYKKwkJamIgLmJhZGRhcGEKKworCQljbXAgZHdvcmQgW2VzOnNpKzRdLC0xCisJCWplIC5saW5lYXJfYWRkcmVzcworCisJCW1vdnp4IGVieCx3b3JkIFtlczpzaSs0XQk7IE9mZnNldAorCQltb3Z6eCBlZGksd29yZCBbZXM6c2krNl0JOyBTZWdtZW50CisJCXNobCBlZGksNAorCQlhZGQgZWJ4LGVkaQorCQlqbXAgLmdvdF9hZGRyZXNzCisKKy5saW5lYXJfYWRkcmVzczoKKwkJY21wIGR4LDI0CQk7IE11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQKKwkJCQkJOyBsaW5lYXIgYWRkcmVzcworCQlqYiAuYmFkZGFwYQorCisJCWNtcCBkd29yZCBbZXM6c2krMjBdLDAJOyA+IDQgR0IgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQKKwkJbW92IGF4LDA5MDBoCQk7ICJEYXRhIGJvdW5kYXJ5IGVycm9yIiAtIGJvZ3VzLCBidXQKKwkJCQkJOyBubyByZWFsbHkgYmV0dGVyIGNvZGUgYXZhaWxhYmxlCisJCWpuZSAuZXJyb3IKKworCQltb3YgZWJ4LFtlczpzaSsxNl0KKworLmdvdF9hZGRyZXNzOgorCQljbXAgZHdvcmQgW2VzOnNpKzEyXSwwCQk7IExCQSB0b28gbGFyZ2U/CisJCWpuZSAub3ZlcnJ1bgorCisJCW1vdnp4IGVjeCwgd29yZCBbZXM6c2krMl0JOyBTZWN0b3JzIHRvIHRyYW5zZmVyCisJCW1vdiBlc2ksW2VzOnNpKzhdCQk7IFN0YXJ0aW5nIHNlY3RvcgorCQltb3YgZWF4LGVzaQorCQlhZGQgZWF4LGVjeAorCQlqYyAub3ZlcnJ1bgorCQljbXAgZWF4LFtEaXNrU2l6ZV0KKwkJamEgLm92ZXJydW4KKworCQlzaGwgZWN4LFNFQ1RPUlNJWkVfTEcyLTIJOyBDb252ZXJ0IHRvIGR3b3JkcworCQlzaGwgZXNpLFNFQ1RPUlNJWkVfTEcyCQk7IENvbnZlcnQgdG8gYW4gb2Zmc2V0CisJCWFkZCBlc2ksW0Rpc2tCdWZdCisJCW1vdiBlZGksZWJ4CisJCXBvcCBlcworCQlyZXQKKworLmJhZGRhcGE6CisJCW1vdiBheCwwMTAwaAkJOyBJbnZhbGlkIGNvbW1hbmQKKwkJcG9wIGVzCisJCXBvcCBheAkJCTsgRHJvcCBzZXR1cF9yZWdzIHJldHVybiBhZGRyZXNzCisJCXJldAorCisub3ZlcnJ1bjoKKwkJbW92IGF4LDAyMDBoCQk7ICJBZGRyZXNzIG1hcmsgbm90IGZvdW5kIiA9CisJCQkJCTsgTEJBIGJleW9uZCBlbmQgb2YgZGlzaworLmVycm9yOgorCQlhbmQgd29yZCBbZXM6c2krMl0sMAk7IE5vIHNlY3RvcnMgdHJhbnNmZXJyZWQKKwkJcG9wIGVzCisJCXBvcCBheAorCQlyZXQKKworRURERWplY3Q6CisJCW1vdiBheCwwQjIwMGgJCTsgVm9sdW1lIE5vdCBSZW1vdmFibGUKKwkJcmV0CislaWYgRUxUT1JJVE8KK0VsVG9yaXRvVGVybWluYXRlOgorCQlUUkFDRVIgJ1QnCisJCW1vdiBheCxbY3M6U2F2ZWRBWF0KKwkJY21wIGFsLDEJCTsgV2Ugb25seSBzdXBwb3J0IHF1ZXJ5LCBub3QgdGVybWluYXRlCisJCWpuZSBFbFRvcml0b0VycgkJOyBGYWlsCisJCWNtcCBkbCw3ZmgJCTsgVGVybWluYXRlIGFsbD8KKwkJamUgLmRvaXQKKwkJY21wIGRsLFtjczpEcml2ZU5vXQk7IFRlcm1pbmF0ZSBvdXIgZHJpdmU/CisJCWplIC5kb2l0CisJCWptcCBFbFRvcml0b0VycgkJOyBGYWlsCisuZG9pdDoJCW1vdiBlcyxQX0RTCQk7IENhbGxlcidzIERTOlNJIHBvaW50ZWQgdG8gcGFja2V0CisJCW1vdiBkaSxQX1NJCQk7IFdlJ2xsIHVzZSBFUzpESQorCQltb3Ygc2ksQ0RfUEtULnNpemUJOyBGaXJzdCBieXRlIGlzIHBhY2tldCBzaXplCisJCXhvciBjeCwwCQk7IEVtcHR5IG91ciBjb3VudAorCQk7bW92IGNsLFtkczpzaV0JCTsgV2UnbGwgY29weSB0aGF0IG1hbnkgYnl0ZXMKKwkJbW92IGNsLDEzaAorCQlyZXAgbW92c2IJCTsgQ29weSB1bnRpbCBDWCBpcyB6ZXJvCisJCW1vdiBheCwwCQk7IFN1Y2Nlc3MKKwkJcmV0CitFbFRvcml0b0VtdWxhdGU6CitFbFRvcml0b0Jvb3Q6CitFbFRvcml0b0NhdGFsb2c6CitFbFRvcml0b0VycjoKKwkJVFJBQ0VSICchJworCQltb3YgYXgsMTAwaAkJOyBJbnZhbGlkIHBhcmFtZXRlcgorCQlyZXQKKyVlbmRpZiA7IEVMVE9SSVRPCislZW5kaWYgOyBFREQKKworOworOyBJTlQgMTVoIGludGVyY2VwdCByb3V0aW5lcworOworaW50MTVfZTgyMDoKKwkJY21wIGVkeCw1MzRENDE1MGgJOyAiU01BUCIKKwkJam5lIG9sZGludDE1CisJCWNtcCBlY3gsMjAJCTsgTmVlZCAyMCBieXRlcworCQlqYiBlcnI4NgorCQlwdXNoIGRzCisJCXB1c2ggY3MKKwkJcG9wIGRzCisJCXB1c2ggZWR4CQk7ICJTTUFQIgorCQlhbmQgZWJ4LGVieAorCQlqbmUgLnJlbmV3CisJCW1vdiBlYngsRTgyMFRhYmxlCisucmVuZXc6CisJCWFkZCBieCwxMgkJOyBBZHZhbmNlIHRvIG5leHQKKwkJbW92IGVheCxbYngtNF0JCTsgVHlwZQorCQlhbmQgZWF4LGVheAkJOyBOdWxsIHR5cGU/CisJCWp6IC5yZW5ldwkJOyBJZiBzbyBhZHZhbmNlIHRvIG5leHQKKwkJbW92IFtlczpkaSsxNl0sZWF4CisJCW1vdiBlYXgsW2J4LTEyXQkJOyBTdGFydCBhZGRyIChsb3cpCisJCW1vdiBlZHgsW2J4LThdCQk7IFN0YXJ0IGFkZHIgKGhpZ2gpCisJCW1vdiBbZXM6ZGldLGVheAorCQltb3YgW2VzOmRpKzRdLGVkeAorCQltb3YgZWF4LFtieF0JCTsgRW5kIGFkZHIgKGxvdykKKwkJbW92IGVkeCxbYngrNF0JCTsgRW5kIGFkZHIgKGhpZ2gpCisJCXN1YiBlYXgsW2J4LTEyXQkJOyBEZXJpdmUgdGhlIGxlbmd0aAorCQlzYmIgZWR4LFtieC04XQorCQltb3YgW2VzOmRpKzhdLGVheAk7IExlbmd0aCAobG93KQorCQltb3YgW2VzOmRpKzEyXSxlZHgJOyBMZW5ndGggKGhpZ2gpCisJCWNtcCBkd29yZCBbYngrOF0sLTEJOyBUeXBlIG9mIG5leHQgPSBlbmQ/CisJCWpuZSAubm90ZG9uZQorCQl4b3IgZWJ4LGVieAkJOyBEb25lIHdpdGggdGFibGUKKy5ub3Rkb25lOgorCQlwb3AgZWF4CQkJOyAiU01BUCIKKwkJbW92IGVkeCxlYXgJCTsgU29tZSBzeXN0ZW1zIGV4cGVjdCBlYXggPSBlZHggPSBTTUFQCisJCW1vdiBlY3gsMjAJCTsgQnl0ZXMgbG9hZGVkCisJCXBvcCBkcworaW50MTVfc3VjY2VzczoKKwkJbW92IGJ5dGUgW2JwKzZdLCAwMmgJOyBDbGVhciBDRgorCQlwb3AgYnAKKwkJaXJldAorCitlcnI4NjoKKwkJbW92IGJ5dGUgW2JwKzZdLCAwM2gJOyBTZXQgQ0YKKwkJbW92IGFoLDg2aAorCQlwb3AgYnAKKwkJaXJldAorCitJbnQxNVN0YXJ0OgorCQlwdXNoIGJwCisJCW1vdiBicCxzcAorCQljbXAgYXgsMEU4MjBoCisJCWplIG5lYXIgaW50MTVfZTgyMAorCQljbXAgYXgsMEU4MDFoCisJCWplIGludDE1X2U4MDEKKwkJY21wIGF4LDBFODgxaAorCQlqZSBpbnQxNV9lODgxCisJCWNtcCBhaCw4OGgKKwkJamUgaW50MTVfODgKK29sZGludDE1Oglwb3AgYnAKKwkJam1wIGZhciBbY3M6T2xkSW50MTVdCisKK2ludDE1X2U4MDE6CQkJCTsgR2V0IG1lbSBzaXplIGZvciA+IDY0IE1CIGNvbmZpZworCQltb3YgYXgsW2NzOk1lbTFNQl0KKwkJbW92IGN4LGF4CisJCW1vdiBieCxbY3M6TWVtMTZNQl0KKwkJbW92IGR4LGJ4CisJCWptcCBzaG9ydCBpbnQxNV9zdWNjZXNzCisKK2ludDE1X2U4ODE6CQkJCTsgR2V0IG1lbSBzaXplIGZvciA+IDY0IE1CIGNvbmZpZworCQkJCQk7IDMyLWJpdCBjb2RlCisJCW1vdiBlYXgsW2NzOk1lbTFNQl0KKwkJbW92IGVjeCxlYXgKKwkJbW92IGVieCxbY3M6TWVtMTZNQl0KKwkJbW92IGVkeCxlYngKKwkJam1wIHNob3J0IGludDE1X3N1Y2Nlc3MKKworaW50MTVfODg6CQkJCTsgR2V0IGV4dGVuZGVkIG1lbSBzaXplCisJCW1vdiBheCxbY3M6TWVtSW50MTU4OF0KKwkJam1wIHNob3J0IGludDE1X3N1Y2Nlc3MKKworOworOyBSb3V0aW5lIHRvIGNvcHkgaW4vb3V0IG9mIGhpZ2ggbWVtb3J5Cis7IGVzaSA9IGxpbmVhciBzb3VyY2UgYWRkcmVzcworOyBlZGkgPSBsaW5lYXIgdGFyZ2V0IGFkZHJlc3MKKzsgZWN4ID0gMzItYml0IHdvcmQgY291bnQKKzsKKzsgQXNzdW1lcyBjcyA9IGRzID0gZXMKKzsKK2Jjb3B5OgorCQlwdXNoIGVheAorCQlwdXNoIGVieAorCQlwdXNoIGVkeAorCQlwdXNoIGVicAorCisJCW1vdiBieCwgcmVhbF9pbnQxNV9zdHViCisKKwkJdGVzdCBieXRlIFtDb25maWdGbGFnc10sIENPTkZJR19SQVd8Q09ORklHX1NBRkVJTlQKKwkJanogLmFueW1vZGUJCTsgQWx3YXlzIGRvIHRoZSByZWFsIElOVCAxNWgKKworCQlzbXN3IGF4CQkJOyBVbnByaXZpbGVnZWQhCisJCXRlc3QgYWwsMDFoCisJCWpueiAucHJvdG1vZGUJCTsgUHJvdG1vZGUgLT4gZG8gcmVhbCBJTlQgMTVoCisKKy5yZWFsbW9kZToKKwkJOyBSYXcgb3IgU2FmZWludCBtb2RlLCBhbmQgd2UncmUgaW4gcmVhbCBtb2RlLi4uCisKKwkJdGVzdCBieXRlIFtDb25maWdGbGFnc10sIENPTkZJR19TQUZFSU5UCisJCWpueiAuZmFrZWludDE1CisKKy5yYXc6CisJCVRSQUNFUiAncicKKwkJOyBXZSdyZSBpbiByZWFsIG1vZGUsIGRvIGl0IG91dHNlbHZlcworCisJCXB1c2hmZAkJCTsgPEE+CisJCXB1c2ggZHMJCQk7IDxCPgorCQlwdXNoIGVzCQkJOyA8Qz4KKworCQljbGkKKwkJY2xkCisKKwkJeG9yIGVieCxlYngKKwkJbW92IGJ4LGNzCisJCXNobCBlYngsNAorCQlsZWEgZWR4LFtTaGFrZXIrZWJ4XQorCQltb3YgW1NoYWtlcisyXSxlZHgKKworCQk7IFRlc3QgdG8gc2VlIGlmIEEyMCBpcyBlbmFibGVkIG9yIG5vdAorCQl4b3IgYXgsYXgKKwkJbW92IGRzLGF4CisJCWRlYyBheAorCQltb3YgZXMsYXgKKworCQltb3YgYXgsWzBdCisJCW1vdiBieCxheAorCQl4b3IgYngsW2VzOjEwaF0KKwkJbm90IGF4CisJCW1vdiBbMF0sYXgKKwkJbW92IGR4LGF4CisJCXhvciBkeCxbZXM6MTBoXQorCQlub3QgYXgKKwkJbW92IFswXSxheAorCisJCW9yIGR4LGJ4CisJCXB1c2ggZHgJCQk7IDxEPiBTYXZlIEEyMCBzdGF0dXMKKwkJam56IC5za2lwX2EyMGUKKworCQltb3YgYXgsMjQwMWgJCTsgRW5hYmxlIEEyMAorCQlpbnQgMTVoCisuc2tpcF9hMjBlOgorCQltb3YgZGwsW0NvbmZpZ0ZsYWdzXQorCQlhbmQgZHgsQ09ORklHX0JJR1JBVworCQlhZGQgZHgsOAorCQk7IERYID0gMTYgZm9yIEJJR1JBVywgOCBmb3IgUkFXCisJCTsgIDggaXMgc2VsZWN0b3IgZm9yIGEgNjRLIGZsYXQgc2VnbWVudCwKKwkJOyAxNiBpcyBzZWxlY3RvciBmb3IgYSA0R0IgZmxhdCBzZWdtZW50LgorCisJCWxnZHQgW2NzOlNoYWtlcl0KKwkJbW92IGVheCxjcjAKKwkJb3IgYWwsMDFoCisJCW1vdiBjcjAsZWF4CisKKwkJbW92IGJ4LDE2CQk7IExhcmdlIGZsYXQgc2VnbWVudAorCQltb3YgZHMsYngKKwkJbW92IGVzLGJ4CisKKwkJYTMyIHJlcCBtb3ZzZAorCisJCTsgRFggaGFzIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSB0byBwdXQgaW4KKwkJOyB0aGUgcmVnaXN0ZXJzIG9uIHJldHVybgorCQltb3YgZHMsZHgKKwkJbW92IGVzLGR4CisKKwkJYW5kIGFsLH4wMWgKKwkJbW92IGNyMCxlYXgKKworCQlwb3AgZHgJCQk7IDxEPiBBMjAgc3RhdHVzCisJCXBvcCBlcwkJCTsgPEM+CisJCXBvcCBkcwkJCTsgPEI+CisKKwkJYW5kIGR4LGR4CisJCWpueiAuc2tpcF9hMjBkCisJCW1vdiBheCwyNDAwaAkJOyBEaXNhYmxlIEEyMAorCQlpbnQgMTVoCisuc2tpcF9hMjBkOgorCQlwb3BmZAkJCTsgPEE+CisJCWptcCAuZG9uZQorCisuZmFrZWludDE1OgorCQk7IFdlJ3JlIGluIHJlYWwgbW9kZSB3aXRoIENPTkZJR19TQUZFSU5ULCBpbnZva2UgdGhlCisJCTsgb3JpZ2luYWwgSU5UIDE1aCB2ZWN0b3IuICBXZSB1c2VkIHRvIHRlc3QgZm9yIHRoZQorCQk7IElOVCAxNWggdmVjdG9yIGJlaW5nIHVuY2hhbmdlZCBoZXJlLCBidXQgdGhhdCBpcworCQk7ICp1cyo7IGhvd2V2ZXIsIHRoZSB0ZXN0IHdhcyB3cm9uZyBmb3IgeWVhcnMgKGFsd2F5cworCQk7IG5lZ2F0aXZlKSBzbyBpbnN0ZWFkIG9mIGZpeGluZyB0aGUgdGVzdCBkbyB3aGF0IHdlCisJCTsgdGVzdGVkIGFuZCBkb24ndCBib3RoZXIgcHJvYmluZy4KKwkJbW92IGJ4LCBmYWtlX2ludDE1X3N0dWIKKworLnByb3Rtb2RlOgorCQlUUkFDRVIgJ3AnCisuYW55bW9kZToKKworLmNvcHlfbG9vcDoKKwkJcHVzaCBlc2kKKwkJcHVzaCBlZGkKKwkJcHVzaCBlY3gKKwkJY21wIGVjeCw0MDAwaAorCQlqbmEgLnNhZmVfc2l6ZQorCQltb3YgZWN4LDQwMDBoCisuc2FmZV9zaXplOgorCQlwdXNoIGVjeAk7IFRyYW5zZmVyIHNpemUgdGhpcyBjeWNsZQorCQltb3YgZWF4LCBlc2kKKwkJbW92IFtNb3Zlcl9zcmMxXSwgc2kKKwkJc2hyIGVheCwgMTYKKwkJbW92IFtNb3Zlcl9zcmMxKzJdLCBhbAorCQltb3YgW01vdmVyX3NyYzJdLCBhaAorCQltb3YgZWF4LCBlZGkKKwkJbW92IFtNb3Zlcl9kc3QxXSwgZGkKKwkJc2hyIGVheCwgMTYKKwkJbW92IFtNb3Zlcl9kc3QxKzJdLCBhbAorCQltb3YgW01vdmVyX2RzdDJdLCBhaAorCQltb3Ygc2ksTW92ZXIKKwkJbW92IGFoLCA4N2gKKwkJc2hsIGN4LDEJOyBDb252ZXJ0IHRvIDE2LWJpdCB3b3JkcworCQljYWxsIGJ4CQk7IElOVCAxNWggc3R1YgorCQlwb3AgZWF4CQk7IFRyYW5zZmVyIHNpemUgdGhpcyBjeWNsZQorCQlwb3AgZWN4CisJCXBvcCBlZGkKKwkJcG9wIGVzaQorCQlqYyAuZXJyb3IKKwkJbGVhIGVzaSxbZXNpKzQqZWF4XQorCQlsZWEgZWRpLFtlZGkrNCplYXhdCisJCXN1YiBlY3gsIGVheAorCQlqbnogLmNvcHlfbG9vcAorCQk7IENGID0gMAorLmVycm9yOgorLmRvbmU6CisJCXBvcCBlYnAKKwkJcG9wIGVkeAorCQlwb3AgZWJ4CisJCXBvcCBlYXgKKwkJcmV0CisKK3JlYWxfaW50MTVfc3R1YjoKKwkJaW50IDE1aAorCQljbGkJCTsgU29tZSBCSU9TZXMgZW5hYmxlIGludGVycnVwdHMgb24gSU5UIDE1aAorCQlyZXQKKworZmFrZV9pbnQxNV9zdHViOgorCQlwdXNoZgorCQljYWxsIGZhciBbT2xkSW50MTVdCisJCWNsaQorCQlyZXQKKworJWlmZGVmIERFQlVHX1RSQUNFUlMKK2RlYnVnX3RyYWNlcjoJcHVzaGFkCisJCXB1c2hmZAorCQltb3YgYnAsc3AKKwkJbW92IGJ4LFticCs5KjRdCisJCW1vdiBhbCxbY3M6YnhdCisJCWluYyB3b3JkIFticCs5KjRdCisJCW1vdiBhaCwwRWgKKwkJbW92IGJ4LDcKKwkJaW50IDEwaAorCQlwb3BmZAorCQlwb3BhZAorCQlyZXQKKword3JpdGVoZXgyOglwdXNoYWQKKwkJcHVzaGZkCisJCW1vdiBjeCwyCisJCXJvciBlYXgsNAorCQlqbXAgd3JpdGVoZXhfY29tbW9uCit3cml0ZWhleDQ6CXB1c2hhZAorCQlwdXNoZmQKKwkJbW92IGN4LDQKKwkJcm9yIGVheCwxMgorCQlqbXAgd3JpdGVoZXhfY29tbW9uCit3cml0ZWhleDg6CXB1c2hhZAorCQlwdXNoZmQKKwkJbW92IGN4LDgKKwkJcm9yIGVheCwyOAord3JpdGVoZXhfY29tbW9uOgorLmxvb3A6CQlwdXNoIGN4CisJCXB1c2ggZWF4CisJCWFuZCBhbCwwRmgKKwkJY21wIGFsLDEwCisJCWpiIC5pc2RlYworCQlhZGQgYWwsJ2EnLScwJy0xMAorLmlzZGVjOgkJYWRkIGFsLCcwJworCQltb3YgYWgsMEVoCisJCW1vdiBieCw3CisJCWludCAxMGgKKwkJcG9wIGVheAorCQlyb2wgZWF4LDQKKwkJcG9wIGN4CisJCWxvb3AgLmxvb3AKKwkJcG9wZmQKKwkJcG9wYWQKKwkJcmV0CislZW5kaWYKKworCQlzZWN0aW9uIC5kYXRhIGFsaWduPTE2CisJCWFsaWduYiAyCitJbnQxM0Z1bmNzCWR3IFJlc2V0CQk7IDAwaCAtIFJFU0VUCisJCWR3IEdldFN0YXR1cwkJOyAwMWggLSBHRVQgU1RBVFVTCisJCWR3IFJlYWQJCQk7IDAyaCAtIFJFQUQKKwkJZHcgV3JpdGUJCTsgMDNoIC0gV1JJVEUKKwkJZHcgVmVyaWZ5CQk7IDA0aCAtIFZFUklGWQorCQlkdyBJbnZhbGlkCQk7IDA1aCAtIEZPUk1BVCBUUkFDSworCQlkdyBJbnZhbGlkCQk7IDA2aCAtIEZPUk1BVCBUUkFDSyBBTkQgU0VUIEJBRCBGTEFHUworCQlkdyBJbnZhbGlkCQk7IDA3aCAtIEZPUk1BVCBEUklWRSBBVCBUUkFDSworCQlkdyBHZXRQYXJtcwkJOyAwOGggLSBHRVQgUEFSQU1FVEVSUworCQlkdyBJbml0V2l0aFBhcm1zCTsgMDloIC0gSU5JVElBTElaRSBDT05UUk9MTEVSIFdJVEgKKwkJCQkJOwlEUklWRSBQQVJBTUVURVJTCisJCWR3IEludmFsaWQJCTsgMEFoCisJCWR3IEludmFsaWQJCTsgMEJoCisJCWR3IFNlZWsJCQk7IDBDaCAtIFNFRUsgVE8gQ1lMSU5ERVIKKwkJZHcgUmVzZXQJCTsgMERoIC0gUkVTRVQgSEFSRCBESVNLUworCQlkdyBJbnZhbGlkCQk7IDBFaAorCQlkdyBJbnZhbGlkCQk7IDBGaAorCQlkdyBDaGVja0lmUmVhZHkJCTsgMTBoIC0gQ0hFQ0sgSUYgUkVBRFkKKwkJZHcgUmVjYWxpYnJhdGUJCTsgMTFoIC0gUkVDQUxJQlJBVEUKKwkJZHcgSW52YWxpZAkJOyAxMmgKKwkJZHcgSW52YWxpZAkJOyAxM2gKKwkJZHcgSW52YWxpZAkJOyAxNGgKKwkJZHcgR2V0RHJpdmVUeXBlCQk7IDE1aCAtIEdFVCBEUklWRSBUWVBFCisJCWR3IERldGVjdENoYW5nZQkJOyAxNmggLSBERVRFQ1QgRFJJVkUgQ0hBTkdFCislaWYgRURECisJCWR3IEludmFsaWQJCTsgMTdoCisJCWR3IEludmFsaWQJCTsgMThoCisJCWR3IEludmFsaWQJCTsgMTloCisJCWR3IEludmFsaWQJCTsgMUFoCisJCWR3IEludmFsaWQJCTsgMUJoCisJCWR3IEludmFsaWQJCTsgMUNoCisJCWR3IEludmFsaWQJCTsgMURoCisJCWR3IEludmFsaWQJCTsgMUVoCisJCWR3IEludmFsaWQJCTsgMUZoCisJCWR3IEludmFsaWQJCTsgMjBoCisJCWR3IFJlYWRNdWx0CQk7IDIxaCAtIFJFQUQgTVVMVElQTEUKKwkJZHcgV3JpdGVNdWx0CQk7IDIyaCAtIFdSSVRFIE1VTFRJUExFCisJCWR3IFNldE1vZGUJCTsgMjNoIC0gU0VUIENPTlRST0xMRVIgRkVBVFVSRVMKKwkJZHcgU2V0TW9kZQkJOyAyNGggLSBTRVQgTVVMVElQTEUgTU9ERQorCQlkdyBJbnZhbGlkCQk7IDI1aCAtIElERU5USUZZIERSSVZFCisJCWR3IEludmFsaWQJCTsgMjZoCisJCWR3IEludmFsaWQJCTsgMjdoCisJCWR3IEludmFsaWQJCTsgMjhoCisJCWR3IEludmFsaWQJCTsgMjloCisJCWR3IEludmFsaWQJCTsgMkFoCisJCWR3IEludmFsaWQJCTsgMkJoCisJCWR3IEludmFsaWQJCTsgMkNoCisJCWR3IEludmFsaWQJCTsgMkRoCisJCWR3IEludmFsaWQJCTsgMkVoCisJCWR3IEludmFsaWQJCTsgMkZoCisJCWR3IEludmFsaWQJCTsgMzBoCisJCWR3IEludmFsaWQJCTsgMzFoCisJCWR3IEludmFsaWQJCTsgMzJoCisJCWR3IEludmFsaWQJCTsgMzNoCisJCWR3IEludmFsaWQJCTsgMzRoCisJCWR3IEludmFsaWQJCTsgMzVoCisJCWR3IEludmFsaWQJCTsgMzZoCisJCWR3IEludmFsaWQJCTsgMzdoCisJCWR3IEludmFsaWQJCTsgMzhoCisJCWR3IEludmFsaWQJCTsgMzloCisJCWR3IEludmFsaWQJCTsgM0FoCisJCWR3IEludmFsaWQJCTsgM0JoCisJCWR3IEludmFsaWQJCTsgM0NoCisJCWR3IEludmFsaWQJCTsgM0RoCisJCWR3IEludmFsaWQJCTsgM0VoCisJCWR3IEludmFsaWQJCTsgM0ZoCisJCWR3IEludmFsaWQJCTsgNDBoCisJCWR3IEVERFByZXNlbmNlCQk7IDQxaCAtIEVERCBQUkVTRU5DRSBERVRFQ1QKKwkJZHcgRUREUmVhZAkJOyA0MmggLSBFREQgUkVBRAorCQlkdyBFRERXcml0ZQkJOyA0M2ggLSBFREQgV1JJVEUKKwkJZHcgRUREVmVyaWZ5CQk7IDQ0aCAtIEVERCBWRVJJRlkKKwkJZHcgRURETG9jawkJOyA0NWggLSBFREQgTE9DSy9VTkxPQ0sgTUVESUEKKwkJZHcgRURERWplY3QJCTsgNDZoIC0gRUREIEVKRUNUCisJCWR3IEVERFNlZWsJCTsgNDdoIC0gRUREIFNFRUsKKwkJZHcgRURER2V0UGFybXMJCTsgNDhoIC0gRUREIEdFVCBQQVJBTUVURVJTCisJCWR3IEVERERldGVjdENoYW5nZQk7IDQ5aCAtIEVERCBNRURJQSBDSEFOR0UgU1RBVFVTCislaWYgRUxUT1JJVE8JCQkJOyBFREQgRWwgVG9yaXRvIEZ1bmN0aW9ucworCQkJCQk7IEVMVE9SSVRPIF9tdXN0XyBhbHNvIGhhdmUgRURECisJCWR3IEVsVG9yaXRvRW11bGF0ZQk7IDRBaCAtIEluaXRpYXRlIERpc2sgRW11bGF0aW9uCisJCWR3IEVsVG9yaXRvVGVybWluYXRlCTsgNEJoIC0gVGVybWluYXRlIERpc2sgRW11bGF0aW9uCisJCWR3IEVsVG9yaXRvQm9vdAkJOyA0Q2ggLSBJbml0aWF0ZSBEaXNrIEVtdS4gYW5kIFJlYm9vdAorCQlkdyBFbFRvcml0b0NhdGFsb2cJOyA0RGggLSBSZXR1cm4gQm9vdCBDYXRhbG9nCislZW5kaWYgOyBFTFRPUklUTworJWVuZGlmIDsgRURECisKK0ludDEzRnVuY3NFbmQJZXF1ICQKK0ludDEzRnVuY3NDbnQJZXF1IChJbnQxM0Z1bmNzRW5kLUludDEzRnVuY3MpID4+IDEKKworCisJCWFsaWduYiA4LCBkYiAwCitTaGFrZXIJCWR3IFNoYWtlckVuZC0kLTEJOyBEZXNjcmlwdG9yIHRhYmxlIGxpbWl0CisJCWRkIDAJCQk7IFBvaW50ZXIgdG8gc2VsZgorCQlkdyAwCisKK1NoYWtlcl9STURTOglkZCAweDAwMDBmZmZmCQk7IDY0SyBkYXRhIHNlZ21lbnQKKwkJZGQgMHgwMDAwOTMwMAorCitTaGFrZXJfRFM6CWRkIDB4MDAwMGZmZmYJCTsgNEdCIGRhdGEgc2VnbWVudAorCQlkZCAweDAwOGY5MzAwCisKK1NoYWtlckVuZAllcXUgJAorCisJCWFsaWduYiA4LCBkYiAwCisKK01vdmVyCQlkZCAwLCAwLCAwLCAwCQk7IE11c3QgYmUgemVybworCQlkdyAwZmZmZmgJCTsgNjQgSyBzZWdtZW50IHNpemUKK01vdmVyX3NyYzE6CWRiIDAsIDAsIDAJCTsgTG93IDI0IGJpdHMgb2Ygc291cmNlIGFkZHkKKwkJZGIgOTNoCQkJOyBBY2Nlc3MgcmlnaHRzCisJCWRiIDAwaAkJCTsgRXh0ZW5kZWQgYWNjZXNzIHJpZ2h0cworTW92ZXJfc3JjMjoJZGIgMAkJCTsgSGlnaCA4IGJpdHMgb2Ygc291cmNlIGFkZHkKKwkJZHcgMGZmZmZoCQk7IDY0IEsgc2VnbWVudCBzaXplCitNb3Zlcl9kc3QxOglkYiAwLCAwLCAwCQk7IExvdyAyNCBiaXRzIG9mIHRhcmdldCBhZGR5CisJCWRiIDkzaAkJCTsgQWNjZXNzIHJpZ2h0cworCQlkYiAwMGgJCQk7IEV4dGVuZGVkIGFjY2VzcyByaWdodHMKK01vdmVyX2RzdDI6CWRiIDAJCQk7IEhpZ2ggOCBiaXRzIG9mIHNvdXJjZSBhZGR5CitNb3Zlcl9kdW1teTI6CWRkIDAsIDAsIDAsIDAJCTsgTW9yZSBzcGFjZSBmb3IgdGhlIEJJT1MKKworCQlhbGlnbmIgMTYsIGRiIDAKK21CRlQ6Cis7IEZpZWxkcyBjb21tb24gdG8gYWxsIEFDUEkgdGFibGVzCisJCWRkICcgICAgJwkJOyBBQ1BJIHNpZ25hdHVyZSAoIm1CRlQiKQorCQkJCQk7IFRoaXMgaXMgZmlsbGVkLWluIGJ5IHRoZSBpbnN0YWxsZXIKKwkJCQkJOyB0byBhdm9pZCBhbiBhY2NpZGVudGFsbHkgdmFsaWQgbUJGVAorCQlkZCBtQkZUX0xlbgkJOyBBQ1BJIHRhYmxlIGxlbmd0aAorCQlkYiAxCQkJOyBBQ1BJIHJldmlzaW9uCisJCWRiIDAJCQk7IEFDUEkgdGFibGUgY2hlY2tzdW0KKwkJZGIgJ01FTURTSycJCTsgQUNQSSBPRU0gSUQKKwkJZGIgJ1N5c2xpbnV4JwkJOyBBQ1BJIE9FTSB0YWJsZSBJRAorCQlkZCAwCQkJOyBBQ1BJIE9FTSByZXZpc2lvbgorCQlkZCAwCQkJOyBBQ1BJIEFTTCBjb21waWxlciB2ZW5kb3IgSUQKKwkJZGQgMAkJCTsgQUNQSSBBU0wgY29tcGlsZXIgcmV2aXNpb24KKzsgVGhlIG5leHQgZmllbGQgaXMgbUJGVC1zcGVjaWZpYyBhbmQgZmlsbGVkLWluIGJ5IHRoZSBpbnN0YWxsZXIKKwkJZGQgMAkJCTsgIlNhZmUgaG9vayIgcGh5c2ljYWwgYWRkcmVzcworCis7IE5vdGUgdGhhdCB0aGUgYWJvdmUgZW5kcyBvbiBhIERXT1JEIGJvdW5kYXJ5LgorOyBUaGUgTURJIGhhcyBhbHdheXMgc3RhcnRlZCBhdCBzdWNoIGEgYm91bmRhcnkuCis7IFBvcnRpb25zIG9mIHRoZSBNREkgYXJlIHBhdGNoZWQgYnkgdGhlIGluc3RhbGxlcgorTWVtRGlza19JbmZvCWVxdSAkCQkJOyBQb2ludGVkIHRvIGJ5IGluc3RhbGxhdGlvbiBjaGVjaworTURJX0J5dGVzCWR3IE1ESV9MZW4JCTsgVG90YWwgYnl0ZXMgaW4gTURJIHN0cnVjdHVyZQorTURJX1ZlcnNpb24JZGIgVkVSU0lPTl9NSU5PUiwgVkVSU0lPTl9NQUpPUgk7IE1FTURJU0sgdmVyc2lvbgorCitEaXNrQnVmCQlkZCAwCQkJOyBMaW5lYXIgYWRkcmVzcyBvZiBoaWdoIG1lbW9yeSBkaXNrCitEaXNrU2l6ZQlkZCAwCQkJOyBTaXplIG9mIGRpc2sgaW4gYmxvY2tzCitDb21tYW5kTGluZQlkdyAwLCAwCQkJOyBGYXIgcG9pbnRlciB0byBzYXZlZCBjb21tYW5kIGxpbmUKKworT2xkSW50MTMJZGQgMAkJCTsgSU5UIDEzaCBpbiBjaGFpbgorT2xkSW50MTUJZGQgMAkJCTsgSU5UIDE1aCBpbiBjaGFpbgorCitPbGREb3NNZW0JZHcgMAkJCTsgT2xkIHBvc2l0aW9uIG9mIERPUyBtZW0gZW5kCitCb290TG9hZGVySUQJZGIgMAkJCTsgQm9vdCBsb2FkZXIgSUQgZnJvbSBoZWFkZXIKKwkJZGIgMAkJCTsgcGFkCisKK0RQVF9wdHIJCWR3IDAJCQk7IElmIG5vbnplcm8sIHBvaW50ZXIgdG8gRFBUCisJCQkJCTsgT3JpZ2luYWwgRFBUIHBvaW50ZXIgZm9sbG93cworCitNRElfTGVuCQllcXUgJC1NZW1EaXNrX0luZm8KK21CRlRfTGVuCWVxdSAkLW1CRlQJCTsgbUJGVCBpbmNsdWRlcyB0aGUgTURJCisKKzsgLS0tLSBNREkgc3RydWN0dXJlIGVuZHMgaGVyZSAtLS0KK0RyaXZlU2hpZnRMaW1pdAlkYiAwZmZoCQkJOyBJbnN0YWxsZXIgd2lsbCBwcm9iZSBmb3IKKwkJCQkJOyBhIHJhbmdlIG9mIGNvbnRpZ3VvdXMgZHJpdmVzLgorCQkJCQk7IEFueSBCSU9TIGRyaXZlcyBhYm92ZSB0aGlzIHJlZ2lvbgorCQkJCQk7IHNoYWxsIG5vdCBiZSBpbXBhY3RlZCBieSBvdXIKKwkJCQkJOyBzaGlmdGluZyBiZWhhdmlvdXIKKwkJZGIgMAkJCTsgcGFkIHRvIGEgRFdPUkQKKwkJZHcgMAkJCTsgcGFkIHRvIGEgUVdPUkQKK01lbUludDE1ODgJZHcgMAkJCTsgMU1CLTY1TUIgbWVtb3J5IGFtb3VudCAoMUspCisKK0N5bGluZGVycwlkdyAwCQkJOyBDeWxpbmRlciBjb3VudAorSGVhZHMJCWR3IDAJCQk7IEhlYWQgY291bnQKK1NlY3RvcnMJCWRkIDAJCQk7IFNlY3RvciBjb3VudCAoemVyby1leHRlbmRlZCkKKworTWVtMU1CCQlkZCAwCQkJOyAxTUItMTZNQiBtZW1vcnkgYW1vdW50ICgxSykKK01lbTE2TUIJCWRkIDAJCQk7IDE2TUItNEcgbWVtb3J5IGFtb3VudCAoNjRLKQorCitEcml2ZU5vCQlkYiAwCQkJOyBPdXIgZHJpdmUgbnVtYmVyCitEcml2ZVR5cGUJZGIgMAkJCTsgT3VyIGRyaXZlIHR5cGUgKGZsb3BwaWVzKQorRHJpdmVDbnQJZGIgMAkJCTsgRHJpdmUgY291bnQgKGZyb20gdGhlIEJJT1MpCisKK0NvbmZpZ0ZsYWdzCWRiIDAJCQk7IEJpdCAwIC0gcmVhZG9ubHkKKworTXlTdGFjawkJZHcgMAkJCTsgT2Zmc2V0IG9mIHN0YWNrCitTdGF0dXNQdHIJZHcgMAkJCTsgV2hlcmUgdG8gc2F2ZSBzdGF0dXMgKHplcm9zZWcgcHRyKQorCitEUFQJCXRpbWVzIDE2IGRiIDAJCTsgQklPUyBwYXJhbWV0ZXIgdGFibGUgcG9pbnRlciAoZmxvcHBpZXMpCitPbGRJbnQxRQlkZCAwCQkJOyBQcmV2aW91cyBJTlQgMUUgcG9pbnRlciAoRFBUKQorCislaWYgRURECitFRERfRFBUOgorLmxlbmd0aAkJZHcgMzAKKy5pbmZvCQlkdyAwMDI5aAorCQk7IEJpdCAwIC0gRE1BIGJvdW5kYXJpZXMgaGFuZGxlZCB0cmFuc3BhcmVudGx5CisJCTsgQml0IDMgLSBEZXZpY2Ugc3VwcG9ydHMgd3JpdGUgdmVyaWZ5CisJCTsgQml0IDUgLSBNZWRpYSBpcyBsb2NrYWJsZQorLmN5bGluZGVycwlkZCAwCQkJOyBGaWxsZWQgaW4gYnkgaW5zdGFsbGVyCisuaGVhZHMJCWRkIDAJCQk7IEZpbGxlZCBpbiBieSBpbnN0YWxsZXIKKy5zZWN0b3JzCWRkIDAJCQk7IEZpbGxlZCBpbiBieSBpbnN0YWxsZXIKKy50b3RhbHNpemUJZGQgMCwgMAkJCTsgRmlsbGVkIGluIGJ5IGluc3RhbGxlcgorLmJ5dGVzcGVyc2VjCWR3IFNFQ1RPUlNJWkUKKy5lZGR0YWJsZQlkdyAtMSwgLTEJCTsgSW52YWxpZCBEUFRFIHBvaW50ZXIKKy5kcGlrZXkJCWR3IDBCRUREaAkJOyBEZXZpY2UgUGF0aCBJbmZvIG1hZ2ljCisuZHBpbGVuCQlkYiAyY2gJCQk7IERQSSBsZW4KKy5yZXMxCQlkYiAwCQkJOyBSZXNlcnZlZAorLnJlczIJCWR3IDAJCQk7IFJlc2VydmVkCisuYnVzdHlwZQlkZCAnTUVNICcJCTsgSG9zdCBidXMgdHlwZSAoNCBieXRlcywgc3BhY2UgcGFkZGVkKQorLmludHR5cGUJZGQgJ01FTU9SWSAgJwkJOyBJbnRlcmZhY2UgdHlwZSAoOCBieXRlcywgc3BjLiBwYWRkZWQpCisuaW50cGF0aAlkZCAwLCAwCQkJOyBJbnRlcmZhY2UgcGF0aAorLmRldnBhdGgJZGQgMCwgMCwgMCwgMAkJOyBEZXZpY2UgcGF0aAorLnJlczMJCWRiIDAJCQk7IFJlc2VydmVkCisuY2hrc3VtCQlkYiAwCQkJOyBEUEkgY2hlY2tzdW0KKworJWlmIEVMVE9SSVRPCis7IEVsIFRvcml0byBDRCBTcGVjaWZpY2F0aW9uIFBhY2tldCAtIG1vc3RseSBmaWxsZWQgaW4gYnkgaW5zdGFsbGVyCitDRF9QS1Q6Cisuc2l6ZQkJZGIgMTNoCTsgUGFja2V0IHNpemUgKDE5IGJ5dGVzKQorLnR5cGUJCWRiIDAJOyBCb290IG1lZGlhIHR5cGUgKGZsYWdzKQorLmRyaXZlbm8JZGIgMEUwaAk7IElOVCAxM2ggZHJpdmUgbnVtYmVyCisuY29udHJvbGxlcglkYiAwCTsgQ29udHJvbGxlciBpbmRleAorLnN0YXJ0CQlkZCAwCTsgU3RhcnRpbmcgTEJBIG9mIGltYWdlCisuZGV2bm8JCWR3IDAJOyBEZXZpY2UgbnVtYmVyCisudXNlcl9idWYJZHcgMAk7IFVzZXIgYnVmZmVyIHNlZ21lbnQKKy5sb2FkX3NlZwlkdyAwCTsgTG9hZCBzZWdtZW50Cisuc2VjdF9jb3VudAlkdyAwCTsgRW11bGF0ZWQgc2VjdG9ycyB0byBsb2FkCisuZ2VvbTEJCWRiIDAJOyBDeWxpbmRlcnMgYml0cyAwIHRocnUgNworLmdlb20yCQlkYiAwCTsgU2VjdHMvdHJhY2sgMCB0aHJ1IDUsIGN5bHMgOCwgOQorLmdlb20zCQlkYiAwCTsgSGVhZHMKKyVlbmRpZiA7IEVMVE9SSVRPCisKKyVlbmRpZiA7IEVERAorCis7IEVuZCBwYXRjaCBhcmVhCisKKwkJYWxpZ25iIDQsIGRiIDAKK1N0YWNrCQlkZCAwCQkJOyBTYXZlZCBTUzpFU1Agb24gaW52b2NhdGlvbgorCQlkdyAwCitTYXZlZEFYCQlkdyAwCQkJOyBBWCBzYXZlZCBvbiBpbnZvY2F0aW9uCitSZWN1cnNpdmUJZHcgMAkJCTsgUmVjdXJzaW9uIGNvdW50ZXIKKworCQlhbGlnbmIgNCwgZGIgMAkJOyBXZSAqTVVTVCogZW5kIG9uIGEgZHdvcmQgYm91bmRhcnkKKworRTgyMFRhYmxlCWVxdSAkCQkJOyBUaGUgaW5zdGFsbGVyIGxvYWRzIHRoZSBFODIwIHRhYmxlIGhlcmUKK1RvdGFsU2l6ZQllcXUgJAkJCTsgRW5kIHBvaW50ZXIKZGlmZiAtLWdpdCBhL21lbWRpc2svbWVtZGlzay5sZCBiL21lbWRpc2svbWVtZGlzay5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWMzZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9tZW1kaXNrLmxkCkBAIC0wLDAgKzEsMTQwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqICAgQm9zdG9uIE1BIDAyMTEwLTEzMDEsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIExpbmtlciBzY3JpcHQgZm9yIE1FTURJU0sKKyAqLworCisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VYVEVSTihfc3RhcnQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDB4MTAwMDAwOworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAuKTsKKworICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorCisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDQpOworICBQUk9WSURFIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDogeyAqKC5wcmVpbml0X2FycmF5KSB9CisgIFBST1ZJREUgKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERSAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6IHsgKiguaW5pdF9hcnJheSkgfQorICBQUk9WSURFIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREUgKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOiB7ICooLmZpbmlfYXJyYXkpIH0KKyAgUFJPVklERSAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFIChfX2N0b3JzX3N0YXJ0ID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgUFJPVklERSAoX19jdG9yc19lbmQgPSAuKTsKKyAgUFJPVklERSAoX19kdG9yc19zdGFydCA9IC4pOworICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIFBST1ZJREUgKF9fZHRvcnNfZW5kID0gLik7CisKKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgQXZvaWQgbWl4aW5nIGNvZGUgYW5kCisgICAgIGRhdGEgd2l0aGluIHNhbWUgMTI4LWJ5dGUgY2h1bmsuICovCisgIC4gPSBBTElHTigxMjgpOworCisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gQUxJR04oMTYpOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICBfX2Jzc19zdGFydCA9IC47CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDQpOworICAgX19ic3NfZW5kID0gLjsKKyAgfQorICBfZW5kID0gLjsKKyAgUFJPVklERSAoZW5kID0gLik7CisKKworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgfQorfQpkaWZmIC0tZ2l0IGEvbWVtZGlzay9tZW1kaXNrMTYuYXNtIGIvbWVtZGlzay9tZW1kaXNrMTYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYWZhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL21lbWRpc2sxNi5hc20KQEAgLTAsMCArMSw3OTMgQEAKKzs7IC0qLSBmdW5kYW1lbnRhbCAtKi0KKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OworOzsgICBDb3B5cmlnaHQgMTk5NC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOzsgICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorOzsKKzs7ICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7ICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCis7OyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorOzsKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzs7Cis7OyBpbml0MTYuYXNtCis7OworOzsgUm91dGluZSB0byBpbml0aWFsaXplIGFuZCB0byB0cmFtcG9saW5lIGludG8gMzItYml0Cis7OyBwcm90ZWN0ZWQgbWVtb3J5LiAgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBiY29weTMyLmluYyBhbmQKKzs7IGNvbTMyLmluYyBpbiB0aGUgbWFpbiBTWVNMSU5VWCBkaXN0cmlidXRpb24uCis7OworCislaW5jbHVkZSAnLi4vdmVyc2lvbi5nZW4nCisKK01ZX0NTCQllcXUgMHgwODAwCQk7IFNlZ21lbnQgYWRkcmVzcyB0byB1c2UKK0NTX0JBU0UJCWVxdSAoTVlfQ1MgPDwgNCkJOyBDb3JyZXNwb25kaW5nIGFkZHJlc3MKKworOyBMb3cgbWVtb3J5IGJvdW5jZSBidWZmZXIKK0JPVU5DRV9TRUcJZXF1IChNWV9DUysweDEwMDApCisKKyVkZWZpbmUgRE9fV0JJTlZEIDAKKworCQlzZWN0aW9uIC5yb2RhdGEgYWxpZ249MTYKKwkJc2VjdGlvbiAuZGF0YSAgIGFsaWduPTE2CisJCXNlY3Rpb24gLmJzcyAgICBhbGlnbj0xNgorCQlzZWN0aW9uIC5zdGFjawlhbGlnbj0xNiBub2JpdHMKK3N0YWNrCQlyZXNiIDUxMgorc3RhY2tfZW5kCWVxdSAkCisKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyAgS2VybmVsIGltYWdlIGhlYWRlcgorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlzZWN0aW9uIC50ZXh0CQk7IE11c3QgYmUgZmlyc3QgaW4gaW1hZ2UKKwkJYml0cyAxNgorCitjbWRsaW5lCQl0aW1lcyA0OTcgZGIgMAkJOyBXZSBwdXQgdGhlIGNvbW1hbmQgbGluZSBoZXJlCitzZXR1cF9zZWN0cwlkYiAwCityb290X2ZsYWdzCWR3IDAKK3N5c3NpemUJCWR3IDAKK3N3YXBfZGV2CWR3IDAKK3JhbV9zaXplCWR3IDAKK3ZpZF9tb2RlCWR3IDAKK3Jvb3RfZGV2CWR3IDAKK2Jvb3RfZmxhZwlkdyAweEFBNTUKKworX3N0YXJ0OgkJam1wIHNob3J0IHN0YXJ0CisKKwkJZGIgIkhkclMiCQk7IEhlYWRlciBzaWduYXR1cmUKKwkJZHcgMHgwMjAzCQk7IEhlYWRlciB2ZXJzaW9uIG51bWJlcgorCityZWFsbW9kZV9zd3RjaAlkdyAwLCAwCQkJOyBkZWZhdWx0X3N3aXRjaCwgU0VUVVBTRUcKK3N0YXJ0X3N5c19zZWcJZHcgMHgxMDAwCQk7IG9ic29sZXRlCit2ZXJzaW9uX3B0cglkdyBtZW1kaXNrX3ZlcnNpb24tMHgyMDAJOyB2ZXJzaW9uIHN0cmluZyBwdHIKK3R5cGVfb2ZfbG9hZGVyCWRiIDAJCQk7IEZpbGxlZCBpbiBieSBib290IGxvYWRlcgorbG9hZGZsYWdzCWRiIDEJCQk7IFBsZWFzZSBsb2FkIGhpZ2gKK3NldHVwX21vdmVfc2l6ZQlkdyAwCQkJOyBVbnVzZWQKK2NvZGUzMl9zdGFydAlkZCAweDEwMDAwMAkJOyAzMi1iaXQgc3RhcnQgYWRkcmVzcworcmFtZGlza19pbWFnZQlkZCAwCQkJOyBMb2FkZWQgcmFtZGlzayBpbWFnZSBhZGRyZXNzCityYW1kaXNrX3NpemUJZGQgMAkJCTsgU2l6ZSBvZiBsb2FkZWQgcmFtZGlzaworYm9vdHNlY3Rfa2x1ZGdlCWR3IDAsIDAKK2hlYXBfZW5kX3B0cglkdyAwCitwYWQxCQlkdyAwCitjbWRfbGluZV9wdHIJZGQgMAkJCTsgQ29tbWFuZCBsaW5lCityYW1kaXNrX21heAlkZCAweGZmZmZmZmZmCQk7IEhpZ2hlc3QgYWxsb3dlZCByYW1kaXNrIGFkZHJlc3MKKworOworOyBUaGVzZSBmaWVsZHMgYXJlbid0IHJlYWwgc2V0dXAgZmllbGRzLCB0aGV5J3JlIHBva2VkIGluIGJ5IHRoZQorOyAzMi1iaXQgY29kZS4KKzsKK2JfZXNkaQkJZGQgMAkJCTsgRVM6REkgZm9yIGJvb3Qgc2VjdG9yIGludm9jYXRpb24KK2JfZWR4CQlkZCAwCQkJOyBFRFggZm9yIGJvb3Qgc2VjdG9yIGludm9jYXRpb24KK2Jfc3NzcAkJZGQgMAkJCTsgU1M6U1Agb24gYm9vdCBzZWN0b3IgaW52b2NhdGlvbgorYl9jc2lwCQlkZCAwCQkJOyBDUzpJUCBvbiBib290IHNlY3RvciBpbnZvY2F0aW9uCisKKwkJc2VjdGlvbiAucm9kYXRhCittZW1kaXNrX3ZlcnNpb246CisJCWRiICJNRU1ESVNLICIsIFZFUlNJT05fU1RSLCAiICIsIERBVEUsIDAKKworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzs7ICBFbmQga2VybmVsIGltYWdlIGhlYWRlcgorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOworOyBNb3ZlIG91cnNlbHZlcyBkb3duIGludG8gbWVtb3J5IHRvIHJlZHVjZSB0aGUgcmlzayBvZiBjb25mbGljdHM7Cis7IHRoZW4gY2Fub25pY2FsaXplIENTIHRvIG1hdGNoIHRoZSBvdGhlciBzZWdtZW50cy4KKzsKKwkJc2VjdGlvbiAudGV4dAorCQliaXRzIDE2CitzdGFydDoKKwkJbW92IGF4LE1ZX0NTCisJCW1vdiBlcyxheAorCQltb3Z6eCBjeCxieXRlIFtzZXR1cF9zZWN0c10KKwkJaW5jIGN4CQkJOyBBZGQgb25lIGZvciB0aGUgYm9vdCBzZWN0b3IKKwkJc2hsIGN4LDcJCTsgQ29udmVydCB0byBkd29yZHMKKwkJeG9yIHNpLHNpCisJCXhvciBkaSxkaQorCQltb3YgZnMsc2kJCTsgZnMgPC0gMAorCQljbGQKKwkJcmVwIG1vdnNkCisJCW1vdiBkcyxheAorCQltb3Ygc3MsYXgKKwkJbW92IGVzcCxzdGFja19lbmQKKwkJam1wIE1ZX0NTOi5uZXh0CisubmV4dDoKKworOworOyBDb3B5IHRoZSBjb21tYW5kIGxpbmUsIGlmIHRoZXJlIGlzIG9uZQorOworY29weV9jbWRsaW5lOgorCQl4b3IgZGksZGkJCTsgQm90dG9tIG9mIG91ciBvd24gc2VnbWVudCAoPSAiYm9vdCBzZWN0b3IiKQorCQltb3YgZWF4LFtjbWRfbGluZV9wdHJdCisJCWFuZCBlYXgsZWF4CisJCWp6IC5lbmRjbWQJCTsgTm8gY29tbWFuZCBsaW5lCisJCW1vdiBzaSxheAorCQlzaHIgZWF4LDQJCTsgQ29udmVydCB0byBzZWdtZW50CisJCWFuZCBzaSwweDAwMEYJCTsgU3RhcnRpbmcgb2Zmc2V0IG9ubHkKKwkJbW92IGdzLGF4CisJCW1vdiBjeCw0OTYJCTsgTWF4IG51bWJlciBvZiBieXRlcworLmNvcHljbWQ6CisJCWdzIGxvZHNiCisJCWFuZCBhbCxhbAorCQlqeiAuZW5kY21kCisJCXN0b3NiCisJCWxvb3AgLmNvcHljbWQKKy5lbmRjbWQ6CisJCXhvciBhbCxhbAorCQlzdG9zYgorCis7Cis7IE5vdyBqdW1wIHRvIDMyLWJpdCBjb2RlCis7CisJCXN0aQorCQljYWxsIGluaXQzMgorOworOyBXaGVuIGluaXQzMiByZXR1cm5zLCB3ZSBoYXZlIGJlZW4gc2V0IHVwLCB0aGUgbmV3IGJvb3Qgc2VjdG9yIGxvYWRlZCwKKzsgYW5kIHdlIHNob3VsZCBnbyBhbmQgYW5kIHJ1biB0aGUgbmV3bHkgbG9hZGVkIGJvb3Qgc2VjdG9yLgorOworOyBUaGUgc2V0dXAgZnVuY3Rpb24gd2lsbCBoYXZlIHBva2VkIHZhbHVlcyBpbnRvIHRoZSBzZXR1cCBhcmVhLgorOworCQltb3Z6eCBlZGksd29yZCBbY3M6Yl9lc2RpXQorCQltb3YgZXMsd29yZCBbY3M6Yl9lc2RpKzJdCisJCW1vdiBlZHgsW2NzOmJfZWR4XQorCisJCWNsaQorCQl4b3IgZXNpLGVzaQkJOyBObyBwYXJ0aXRpb24gdGFibGUgaW52b2x2ZWQKKwkJbW92IGRzLHNpCQk7IE1ha2UgYWxsIHRoZSBzZWdtZW50cyBjb25zaXN0ZW50CisJCW1vdiBmcyxzaQorCQltb3YgZ3Msc2kKKwkJbHNzIHNwLFtjczpiX3Nzc3BdCisJCW1vdnp4IGVzcCxzcAorCQlqbXAgZmFyIFtjczpiX2NzaXBdCisKKzsKKzsgV2UgZW50ZXIgcHJvdGVjdGVkIG1vZGUsIHNldCB1cCBhIGZsYXQgMzItYml0IGVudmlyb25tZW50LCBydW4gcmVwIG1vdnNkCis7IGFuZCB0aGVuIGV4aXQuICBJTVBPUlRBTlQ6IFRoaXMgY29kZSBhc3N1bWVzIGNzID09IE1ZX0NTLgorOworOyBUaGlzIGNvZGUgaXMgcHJvYmFibHkgZXhjZXNzaXZlbHkgYW5hbC1yZXRlbnRpdmUgaW4gaXRzIGhhbmRsaW5nIG9mCis7IHNlZ21lbnRzLCBidXQgdGhpcyBzdHVmZiBpcyBwYWluZnVsIGVub3VnaCBhcyBpdCBpcyB3aXRob3V0IGhhdmluZyB0byByZWx5Cis7IG9uIGV2ZXJ5dGhpbmcgaGFwcGVuaW5nICJhcyBpdCBvdWdodCB0by4iCis7CitEdW1teVRTUwllcXUgIDB4NTgwCQk7IEhvcGVmdWxseSBzYWZlIHBsYWNlIGluIGxvdyBtbW9lcnkKKworCQlzZWN0aW9uIC5kYXRhCisKKwk7IGRlc2MgYmFzZSwgbGltaXQsIGZsYWdzCislbWFjcm8JZGVzYyAzCisJZGQgKCUyICYgMHhmZmZmKSB8ICgoJTEgJiAweGZmZmYpIDw8IDE2KQorCWRkICglMSAmIDB4ZmYwMDAwMDApIHwgKCUyICYgMHhmMDAwMCkgfCAoKCUzICYgMHhmMGZmKSA8PCA4KSB8ICgoJTEgJiAweDAwZmYwMDAwKSA+PiAxNikKKyVlbmRtYWNybworCisJCWFsaWduIDgsIGRiIDAKK2NhbGwzMl9nZHQ6CWR3IGNhbGwzMl9nZHRfc2l6ZS0xCTsgTnVsbCBkZXNjcmlwdG9yIC0gY29udGFpbnMgR0RUCisuYWRqMToJCWRkIGNhbGwzMl9nZHQrQ1NfQkFTRQk7IHBvaW50ZXIgZm9yIExHRFQgaW5zdHJ1Y3Rpb24KKwkJZHcgMAorCisJCTsgMDAwODogRHVtbXkgVFNTIHRvIG1ha2UgSW50ZWwgVlQgaGFwcHkKKwkJOyBTaG91bGQgbmV2ZXIgYmUgYWN0dWFsbHkgYWNjZXNzZWQuLi4KKwkJZGVzYyBEdW1teVRTUywgMTAzLCAweDgwODkKKworCQk7IDAwMTA6IENvZGUgc2VnbWVudCwgdXNlMTYsIHJlYWRhYmxlLCBkcGwgMCwgYmFzZSBDU19CQVNFLCA2NEsKKwkJZGVzYyBDU19CQVNFLCAweGZmZmYsIDB4MDA5YgorCisJCTsgMDAxODogRGF0YSBzZWdtZW50LCB1c2UxNiwgcmVhZC93cml0ZSwgZHBsIDAsIGJhc2UgQ1NfQkFTRSwgNjRLCisJCWRlc2MgQ1NfQkFTRSwgMHhmZmZmLCAweDAwOTMKKworCQk7IDAwMjA6IENvZGUgc2VnbWVudCwgdXNlMzIsIHJlYWQvd3JpdGUsIGRwbCAwLCBiYXNlIDAsIDRHCisJCWRlc2MgMCwgMHhmZmZmZiwgMHhjMDliCisKKwkJOyAwMDI4OiBEYXRhIHNlZ21lbnQsIHVzZTMyLCByZWFkL3dyaXRlLCBkcGwgMCwgYmFzZSAwLCA0RworCQlkZXNjIDAsIDB4ZmZmZmYsIDB4YzA5MworCitjYWxsMzJfZ2R0X3NpemU6CWVxdSAkLWNhbGwzMl9nZHQKKworZXJyX2EyMDoJZGIgJ0VSUk9SOiBBMjAgZ2F0ZSBub3QgcmVzcG9uZGluZyEnLDEzLDEwLDAKKworCQlzZWN0aW9uIC5ic3MKKwkJYWxpZ25iIDQKK1JldHVybgkJcmVzZCAxCQkJOyBSZXR1cm4gdmFsdWUKK1NhdmVkU1AJCXJlc3cgMQkJCTsgUGxhY2UgdG8gc2F2ZSBTUAorQTIwVHJpZXMJcmVzYiAxCisKKwkJc2VjdGlvbiAuZGF0YQorCQlhbGlnbiA0LCBkYiAwCitUYXJnZXQJCWRkIDAJCQk7IFRhcmdldCBhZGRyZXNzCitUYXJnZXRfU2VnCWR3IDIwaAkJCTsgVGFyZ2V0IENTCisKK0EyMFR5cGUJCWR3IDAJCQk7IERlZmF1bHQgPSB1bmtub3duCisKKwkJc2VjdGlvbiAudGV4dAorCQliaXRzIDE2Cis7Cis7IFJvdXRpbmVzIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSAoeXVjaykgQTIwLiAgVGhlc2Ugcm91dGluZXMgYXJlIGdhdGhlcmVkCis7IGZyb20gdGlwcyBmcm9tIGEgY291cGxlIG9mIHNvdXJjZXMsIGluY2x1ZGluZyB0aGUgTGludXgga2VybmVsIGFuZAorOyBodHRwOi8vd3d3Lng4Ni5vcmcvLiAgVGhlIG5lZWQgZm9yIHRoZSBkZWxheSB0byBiZSBhcyBsYXJnZSBhcyBnaXZlbiBoZXJlCis7IGlzIGluZGljYXRlZCBieSBEb25uaWUgQmFybmVzIG9mIFJlZEhhdCwgdGhlIHByb2JsZW1hdGljIHN5c3RlbSBiZWluZyBhbgorOyBJQk0gVGhpbmtQYWQgNzYwRUwuCis7Cis7IFdlIHR5cGljYWxseSB0b2dnbGUgQTIwIHR3aWNlIGZvciBldmVyeSA2NEsgdHJhbnNmZXJyZWQuCis7CislZGVmaW5lCWlvX2RlbGF5CWNhbGwgX2lvX2RlbGF5CislZGVmaW5lIElPX0RFTEFZX1BPUlQJODBoCQk7IEludmFsaWQgcG9ydCAod2UgaG9wZSEpCislZGVmaW5lIGRpc2FibGVfd2FpdAkzMgkJOyBIb3cgbG9uZyB0byB3YWl0IGZvciBhIGRpc2FibGUKKworJWRlZmluZSBBMjBfRFVOTk8JMAkJOyBBMjAgdHlwZSB1bmtub3duCislZGVmaW5lIEEyMF9OT05FCTEJCTsgQTIwIGFsd2F5cyBvbj8KKyVkZWZpbmUgQTIwX0JJT1MJMgkJOyBBMjAgQklPUyBlbmFibGUKKyVkZWZpbmUgQTIwX0tCQwkJMwkJOyBBMjAgdGhyb3VnaCBLQkMKKyVkZWZpbmUgQTIwX0ZBU1QJNAkJOyBBMjAgdGhyb3VnaCBwb3J0IDkyaAorCisJCWFsaWduIDIsIGRiIDAKK0EyMExpc3QJCWR3IGEyMF9kdW5ubywgYTIwX25vbmUsIGEyMF9iaW9zLCBhMjBfa2JjLCBhMjBfZmFzdAorQTIwRExpc3QJZHcgYTIwZF9kdW5ubywgYTIwZF9ub25lLCBhMjBkX2Jpb3MsIGEyMGRfa2JjLCBhMjBkX2Zhc3QKK2EyMF9hZGp1c3RfY250CWVxdSAoJC1BMjBMaXN0KS8yCisKK3Nsb3dfb3V0OglvdXQgZHgsIGFsCQk7IEZhbGwgdGhyb3VnaAorCitfaW9fZGVsYXk6CW91dCBJT19ERUxBWV9QT1JULGFsCisJCW91dCBJT19ERUxBWV9QT1JULGFsCisJCXJldAorCitlbmFibGVfYTIwOgorCQlwdXNoYWQKKwkJbW92IGJ5dGUgW0EyMFRyaWVzXSwyNTUgOyBUaW1lcyB0byB0cnkgdG8gbWFrZSB0aGlzIHdvcmsKKwordHJ5X2VuYWJsZV9hMjA6CisKKzsKKzsgRmx1c2ggdGhlIGNhY2hlcworOworJWlmIERPX1dCSU5WRAorCQljYWxsIHRyeV93YmludmQKKyVlbmRpZgorCis7Cis7IElmIHRoZSBBMjAgdHlwZSBpcyBrbm93biwganVtcCBzdHJhaWdodCB0byB0eXBlCis7CisJCW1vdiBicCxbQTIwVHlwZV0KKwkJYWRkIGJwLGJwCQkJOyBDb252ZXJ0IHRvIHdvcmQgb2Zmc2V0CisuYWRqNDoJCWptcCB3b3JkIFticCtBMjBMaXN0XQorCis7Cis7IEZpcnN0LCBzZWUgaWYgd2UgYXJlIG9uIGEgc3lzdGVtIHdpdGggbm8gQTIwIGdhdGUKKzsKK2EyMF9kdW5ubzoKK2EyMF9ub25lOgorCQltb3YgYnl0ZSBbQTIwVHlwZV0sIEEyMF9OT05FCisJCWNhbGwgYTIwX3Rlc3QKKwkJam56IGEyMF9kb25lCisKKzsKKzsgTmV4dCwgdHJ5IHRoZSBCSU9TIChJTlQgMTVoIEFYPTI0MDFoKQorOworYTIwX2Jpb3M6CisJCW1vdiBieXRlIFtBMjBUeXBlXSwgQTIwX0JJT1MKKwkJbW92IGF4LDI0MDFoCisJCXB1c2hmCQkJCTsgU29tZSBCSU9TZXMgbXVjayB3aXRoIElGCisJCWludCAxNWgKKwkJcG9wZgorCisJCWNhbGwgYTIwX3Rlc3QKKwkJam56IGEyMF9kb25lCisKKzsKKzsgRW5hYmxlIHRoZSBrZXlib2FyZCBjb250cm9sbGVyIEEyMCBnYXRlCis7CithMjBfa2JjOgorCQltb3YgZGwsIDEJCQk7IEFsbG93IGVhcmx5IGV4aXQKKwkJY2FsbCBlbXB0eV84MDQyCisJCWpueiBhMjBfZG9uZQkJCTsgQTIwIGxpdmUsIG5vIG5lZWQgdG8gdXNlIEtCQworCisJCW1vdiBieXRlIFtBMjBUeXBlXSwgQTIwX0tCQwk7IFN0YXJ0aW5nIEtCQyBjb21tYW5kIHNlcXVlbmNlCisKKwkJbW92IGFsLDBEMWgJCQk7IFdyaXRlIG91dHB1dCBwb3J0CisJCW91dCAwNjRoLCBhbAorCQljYWxsIGVtcHR5XzgwNDJfdW5jb25kCisKKwkJbW92IGFsLDBERmgJCQk7IEEyMCBvbgorCQlvdXQgMDYwaCwgYWwKKwkJY2FsbCBlbXB0eV84MDQyX3VuY29uZAorCisJCTsgQXBwYXJlbnRseSB0aGUgVUhDSSBzcGVjIGFzc3VtZXMgdGhhdCBBMjAgdG9nZ2xlCisJCTsgZW5kcyB3aXRoIGEgbnVsbCBjb21tYW5kIChhc3N1bWVkIHRvIGJlIGZvciBzeWNocm9uaXphdGlvbj8pCisJCTsgUHV0IGl0IGhlcmUgdG8gc2VlIGlmIGl0IGhlbHBzIGFueXRoaW5nLi4uCisJCW1vdiBhbCwwRkZoCQkJOyBOdWxsIGNvbW1hbmQKKwkJb3V0IDA2NGgsIGFsCisJCWNhbGwgZW1wdHlfODA0Ml91bmNvbmQKKworCQk7IFZlcmlmeSB0aGF0IEEyMCBhY3R1YWxseSBpcyBlbmFibGVkLiAgRG8gdGhhdCBieQorCQk7IG9ic2VydmluZyBhIHdvcmQgaW4gbG93IG1lbW9yeSBhbmQgdGhlIHNhbWUgd29yZCBpbgorCQk7IHRoZSBITUEgdW50aWwgdGhleSBhcmUgbm8gbG9uZ2VyIGNvaGVyZW50LiAgTm90ZSB0aGF0CisJCTsgd2UgZG9uJ3QgZG8gdGhlIHNhbWUgY2hlY2sgaW4gdGhlIGRpc2FibGUgY2FzZSwgYmVjYXVzZQorCQk7IHdlIGRvbid0IHdhbnQgdG8gKnJlcXVpcmUqIEEyMCBtYXNraW5nIChTWVNMSU5VWCBzaG91bGQKKwkJOyB3b3JrIGZpbmUgd2l0aG91dCBpdCwgaWYgdGhlIEJJT1MgZG9lcy4pCisua2JjX3dhaXQ6CXB1c2ggY3gKKwkJeG9yIGN4LGN4Cisua2JjX3dhaXRfbG9vcDoKKwkJY2FsbCBhMjBfdGVzdAorCQlqbnogYTIwX2RvbmVfcG9wCisJCWxvb3AgLmtiY193YWl0X2xvb3AKKworCQlwb3AgY3gKKzsKKzsgUnVubmluZyBvdXQgb2Ygb3B0aW9ucyBoZXJlLiAgRmluYWwgYXR0ZW1wdDogZW5hYmxlIHRoZSAiZmFzdCBBMjAgZ2F0ZSIKKzsKK2EyMF9mYXN0OgorCQltb3YgYnl0ZSBbQTIwVHlwZV0sIEEyMF9GQVNUCTsgSGF2ZW4ndCB1c2VkIHRoZSBLQkMgeWV0CisJCWluIGFsLCAwOTJoCisJCW9yIGFsLDAyaAorCQlhbmQgYWwsfjAxaAkJCTsgRG9uJ3QgYWNjaWRlbnRhbGx5IHJlc2V0IHRoZSBtYWNoaW5lIQorCQlvdXQgMDkyaCwgYWwKKworLmZhc3Rfd2FpdDoJcHVzaCBjeAorCQl4b3IgY3gsY3gKKy5mYXN0X3dhaXRfbG9vcDoKKwkJY2FsbCBhMjBfdGVzdAorCQlqbnogYTIwX2RvbmVfcG9wCisJCWxvb3AgLmZhc3Rfd2FpdF9sb29wCisKKwkJcG9wIGN4CisKKzsKKzsgT2ggYnVnZ2VyLiAgQTIwIGlzIG5vdCByZXNwb25kaW5nLiAgVHJ5IGZyb2JiaW5nIGl0IGFnYWluOyBldmVudHVhbGx5IGdpdmUgdXAKKzsgYW5kIHJlcG9ydCBmYWlsdXJlIHRvIHRoZSB1c2VyLgorOworCisJCWRlYyBieXRlIFtBMjBUcmllc10KKwkJam56IHRyeV9lbmFibGVfYTIwCisKKworCQk7IEVycm9yIG1lc3NhZ2UgdGltZQorCQltb3Ygc2ksZXJyX2EyMAorcHJpbnRfZXJyOgorCQlsb2RzYgorCQlhbmQgYWwsYWwKKwkJanogZGllCisJCW1vdiBieCw3CisJCW1vdiBhaCwweGUKKwkJaW50IDEwaAorCQlqbXAgcHJpbnRfZXJyCisKKworZGllOgorCQlzdGkKKy5obHQ6CQlobHQKKwkJam1wIHNob3J0IC5obHQKKworOworOyBBMjAgdW5tYXNrZWQsIHByb2NlZWQuLi4KKzsKK2EyMF9kb25lX3BvcDoJcG9wIGN4CithMjBfZG9uZToJcG9wYWQKKwkJcmV0CisKKzsKKzsgVGhpcyByb3V0aW5lIHRlc3RzIGlmIEEyMCBpcyBlbmFibGVkIChaRiA9IDApLiAgVGhpcyByb3V0aW5lCis7IG11c3Qgbm90IGRlc3Ryb3kgYW55IHJlZ2lzdGVyIGNvbnRlbnRzLgorOworCis7IFRoaXMgaXMgdGhlIElOVCAxRmggdmVjdG9yLCB3aGljaCBpcyBzdGFuZGFyZCBQQ3MgaXMgdXNlZCBieSB0aGUKKzsgQklPUyB3aGVuIHRoZSBzY3JlZW4gaXMgaW4gZ3JhcGhpY3MgbW9kZS4gIEV2ZW4gaWYgaXQgaXMsIGl0IHBvaW50cyB0bworOyBkYXRhLCBub3QgY29kZSwgc28gaXQgc2hvdWxkIGJlIHNhZmUgZW5vdWdoIHRvIGZpZGRsZSB3aXRoLgorQTIwVGVzdAkJZXF1ICgxRmgqNCkKKworYTIwX3Rlc3Q6CisJCXB1c2ggZHMKKwkJcHVzaCBlcworCQlwdXNoIGN4CisJCXB1c2ggZWF4CisJCXhvciBheCxheAorCQltb3YgZHMsYXgJCTsgRFMgPT0gMAorCQlkZWMgYXgKKwkJbW92IGVzLGF4CQk7IEVTID09IDBGRkZGaAorCQltb3YgY3gsMzIJCTsgTG9vcCBjb3VudAorCQltb3YgZWF4LFtBMjBUZXN0XQorCQljbXAgZWF4LFtlczpBMjBUZXN0KzEwaF0KKwkJam5lIC5hMjBfZG9uZQorCQlwdXNoIGVheAorLmEyMF93YWl0OgorCQlpbmMgZWF4CisJCW1vdiBbQTIwVGVzdF0sZWF4CisJCWlvX2RlbGF5CisJCWNtcCBlYXgsW2VzOkEyMFRlc3QrMTBoXQorCQlsb29weiAuYTIwX3dhaXQKKwkJcG9wIGR3b3JkIFtBMjBUZXN0XQk7IFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUKKy5hMjBfZG9uZToKKwkJcG9wIGVheAorCQlwb3AgY3gKKwkJcG9wIGVzCisJCXBvcCBkcworCQlyZXQKKworZGlzYWJsZV9hMjA6CisJCXB1c2hhZAorOworOyBGbHVzaCB0aGUgY2FjaGVzCis7CislaWYgRE9fV0JJTlZECisJCWNhbGwgdHJ5X3diaW52ZAorJWVuZGlmCisKKwkJbW92IGJwLFtBMjBUeXBlXQorCQlhZGQgYnAsYnAJCQk7IENvbnZlcnQgdG8gd29yZCBvZmZzZXQKKy5hZGo1OgkJam1wIHdvcmQgW2JwK0EyMERMaXN0XQorCithMjBkX2Jpb3M6CisJCW1vdiBheCwyNDAwaAorCQlwdXNoZgkJCQk7IFNvbWUgQklPU2VzIG11Y2sgd2l0aCBJRgorCQlpbnQgMTVoCisJCXBvcGYKKwkJam1wIHNob3J0IGEyMGRfc25vb3plCisKKzsKKzsgRGlzYWJsZSB0aGUgImZhc3QgQTIwIGdhdGUiCis7CithMjBkX2Zhc3Q6CisJCWluIGFsLCAwOTJoCisJCWFuZCBhbCx+MDNoCisJCW91dCAwOTJoLCBhbAorCQlqbXAgc2hvcnQgYTIwZF9zbm9vemUKKworOworOyBEaXNhYmxlIHRoZSBrZXlib2FyZCBjb250cm9sbGVyIEEyMCBnYXRlCis7CithMjBkX2tiYzoKKwkJY2FsbCBlbXB0eV84MDQyX3VuY29uZAorCisJCW1vdiBhbCwwRDFoCisJCW91dCAwNjRoLCBhbAkJOyBXcml0ZSBvdXRwdXQgcG9ydAorCQljYWxsIGVtcHR5XzgwNDJfdW5jb25kCisKKwkJbW92IGFsLDBERGgJCTsgQTIwIG9mZgorCQlvdXQgMDYwaCwgYWwKKwkJY2FsbCBlbXB0eV84MDQyX3VuY29uZAorCisJCW1vdiBhbCwwRkZoCQk7IE51bGwgY29tbWFuZC9zeW5jaHJvbml6YXRpb24KKwkJb3V0IDA2NGgsIGFsCisJCWNhbGwgZW1wdHlfODA0Ml91bmNvbmQKKworCQk7IFdhaXQgYSBiaXQgZm9yIGl0IHRvIHRha2UgZWZmZWN0CithMjBkX3Nub296ZToKKwkJcHVzaCBjeAorCQltb3YgY3gsIGRpc2FibGVfd2FpdAorLmRlbGF5bG9vcDoJY2FsbCBhMjBfdGVzdAorCQlqeiAuZGlzYWJsZWQKKwkJbG9vcCAuZGVsYXlsb29wCisuZGlzYWJsZWQ6CXBvcCBjeAorYTIwZF9kdW5ubzoKK2EyMGRfbm9uZToKKwkJcG9wYWQKKwkJcmV0CisKKzsKKzsgUm91dGluZSB0byBlbXB0eSB0aGUgODA0MiBLQkMgY29udHJvbGxlci4gIElmIGRsICE9IDAKKzsgdGhlbiB3ZSB3aWxsIHRlc3QgQTIwIGluIHRoZSBsb29wIGFuZCBleGl0IGlmIEEyMCBpcworOyBzdWRkZW5seSBlbmFibGVkLgorOworZW1wdHlfODA0Ml91bmNvbmQ6CisJCXhvciBkbCxkbAorZW1wdHlfODA0MjoKKwkJY2FsbCBhMjBfdGVzdAorCQlqeiAuYTIwX29uCisJCWFuZCBkbCxkbAorCQlqbnogLmRvbmUKKy5hMjBfb246CWlvX2RlbGF5CisJCWluIGFsLCAwNjRoCQk7IFN0YXR1cyBwb3J0CisJCXRlc3QgYWwsMQorCQlqeiAubm9fb3V0cHV0CisJCWlvX2RlbGF5CisJCWluIGFsLCAwNjBoCQk7IFJlYWQgaW5wdXQKKwkJam1wIHNob3J0IGVtcHR5XzgwNDIKKy5ub19vdXRwdXQ6CisJCXRlc3QgYWwsMgorCQlqbnogZW1wdHlfODA0MgorCQlpb19kZWxheQorLmRvbmU6CQlyZXQKKworOworOyBFeGVjdXRlIGEgV0JJTlZEIGluc3RydWN0aW9uIGlmIHBvc3NpYmxlIG9uIHRoaXMgQ1BVCis7CislaWYgRE9fV0JJTlZECit0cnlfd2JpbnZkOgorCQl3YmludmQKKwkJcmV0CislZW5kaWYKKworCQlzZWN0aW9uIC5ic3MKKwkJYWxpZ25iIDQKK1BNRVNQCQlyZXNkIDEJCQk7IFByb3RlY3RlZCBtb2RlICVlc3AKKworCQlzZWN0aW9uIC5pZHQgbm9iaXRzIGFsaWduPTQwOTYKKwkJYWxpZ25iIDQwOTYKK3BtX2lkdAkJcmVzYiA0MDk2CQk7IFByb3RlY3RlZC1tb2RlIElEVCwgZm9sbG93ZWQgYnkgaW50ZXJydXB0IHN0dWJzCisKKworCisKK3BtX2VudHJ5OgllcXUgMHgxMDAwMDAKKworCQlzZWN0aW9uIC5yb2RhdGEKKwkJYWxpZ24gMiwgZGIgMAorY2FsbDMyX3JtaWR0OgorCQlkdyAwZmZmZmgJCTsgTGltaXQKKwkJZGQgMAkJCTsgQWRkcmVzcworCisJCXNlY3Rpb24gLmRhdGEKKwkJYWxpZ25iIDIKK2NhbGwzMl9wbWlkdDoKKwkJZHcgOCoyNTYJCTsgTGltaXQKKwkJZGQgMAkJCTsgQWRkcmVzcyAoZW50ZXJlZCBsYXRlcikKKworCQlzZWN0aW9uIC50ZXh0Cis7Cis7IFRoaXMgaXMgdGhlIG1haW4gZW50cnlwb2ludCBpbiB0aGlzIGZ1bmN0aW9uCis7Citpbml0MzI6CisJCW1vdiBieCxjYWxsMzJfY2FsbF9zdGFydAk7IFdoZXJlIHRvIGdvIGluIFBNCisKKzsKKzsgRW50ZXIgcHJvdGVjdGVkIG1vZGUuICBCWCBjb250YWlucyB0aGUgZW50cnkgcG9pbnQgcmVsYXRpdmUgdG8gdGhlCis7IHJlYWwtbW9kZSBDUy4KKzsKK2NhbGwzMl9lbnRlcl9wbToKKwkJbW92IGF4LGNzCisJCW1vdiBkcyxheAorCQltb3Z6eCBlYnAsYXgKKwkJc2hsIGVicCw0CQk7IEVCUCA8LSBDU19CQVNFCisJCW1vdnp4IGVieCxieAorCQlhZGQgZWJ4LGVicAkJOyBlbnRyeSBwb2ludCArPSBDU19CQVNFCisJCWNsaQorCQltb3YgW1NhdmVkU1BdLHNwCisJCWNsZAorCQljYWxsIGVuYWJsZV9hMjAKKwkJbW92IGJ5dGUgW2NhbGwzMl9nZHQrOCs1XSw4OWgJOyBNYXJrIFRTUyB1bmJ1c3kKKwkJbzMyIGxnZHQgW2NhbGwzMl9nZHRdCTsgU2V0IHVwIEdEVAorCQlvMzIgbGlkdCBbY2FsbDMyX3BtaWR0XQk7IFNldCB1cCBJRFQKKwkJbW92IGVheCxjcjAKKwkJb3IgYWwsMQorCQltb3YgY3IwLGVheAkJOyBFbnRlciBwcm90ZWN0ZWQgbW9kZQorCQlqbXAgMjBoOnN0cmljdCBkd29yZCAuaW5fcG0rQ1NfQkFTRQorLnBtX2ptcAkJZXF1ICQtNgorCisKKwkJYml0cyAzMgorLmluX3BtOgorCQl4b3IgZWF4LGVheAkJOyBBdmFpbGFibGUgZm9yIGZ1dHVyZSB1c2UuLi4KKwkJbW92IGZzLGVheAorCQltb3YgZ3MsZWF4CisJCWxsZHQgYXgKKworCQltb3YgYWwsMjhoCQk7IFNldCB1cCBkYXRhIHNlZ21lbnRzCisJCW1vdiBlcyxlYXgKKwkJbW92IGRzLGVheAorCQltb3Ygc3MsZWF4CisKKwkJbW92IGFsLDA4aAorCQlsdHIgYXgKKworCQltb3YgZXNwLFtlYnArUE1FU1BdCTsgTG9hZCBwcm90bW9kZSAlZXNwIGlmIGF2YWlsYWJsZQorCQlqbXAgZWJ4CQkJOyBHbyB0byB3aGVyZSB3ZSBuZWVkIHRvIGdvCisKKzsKKzsgVGhpcyBpcyBpbnZva2VkIGJlZm9yZSBmaXJzdCBkaXNwYXRjaCBvZiB0aGUgMzItYml0IGNvZGUsIGluIDMyLWJpdCBtb2RlCis7CitjYWxsMzJfY2FsbF9zdGFydDoKKwkJOworCQk7IFNldCB1cCBhIHRlbXBvcmFyeSBzdGFjayBpbiB0aGUgYm91bmNlIGJ1ZmZlcjsKKwkJOyBzdGFydDMyLlMgd2lsbCBvdmVycmlkZSB0aGlzIHRvIHBvaW50IHVzIHRvIHRoZSByZWFsCisJCTsgaGlnaC1tZW1vcnkgc3RhY2suCisJCTsKKwkJbW92IGVzcCwgKEJPVU5DRV9TRUcgPDwgNCkgKyAweDEwMDAwCisKKwkJcHVzaCBkd29yZCBjYWxsMzJfZW50ZXJfcm0ucm1fam1wK0NTX0JBU0UKKwkJcHVzaCBkd29yZCBjYWxsMzJfZW50ZXJfcG0ucG1fam1wK0NTX0JBU0UKKwkJcHVzaCBkd29yZCBzdGFja19lbmQJCTsgUk0gc2l6ZQorCQlwdXNoIGR3b3JkIGNhbGwzMl9nZHQrQ1NfQkFTRQorCQlwdXNoIGR3b3JkIGNhbGwzMl9oYW5kbGVfaW50ZXJydXB0K0NTX0JBU0UKKwkJcHVzaCBkd29yZCBDU19CQVNFCQk7IFNlZ21lbnQgYmFzZQorCQlwdXNoIGR3b3JkIChCT1VOQ0VfU0VHIDw8IDQpCTsgQm91bmNlIGJ1ZmZlciBhZGRyZXNzCisJCXB1c2ggZHdvcmQgY2FsbDMyX3N5c2NhbGwrQ1NfQkFTRSA7IFN5c2NhbGwgZW50cnkgcG9pbnQKKworCQljYWxsIHBtX2VudHJ5LUNTX0JBU0UJCTsgUnVuIHRoZSBwcm9ncmFtLi4uCisKKwkJOyAuLi4gZmFsbCB0aHJvdWdoIHRvIGNhbGwzMl9leGl0IC4uLgorCitjYWxsMzJfZXhpdDoKKwkJbW92IGJ4LGNhbGwzMl9kb25lCTsgUmV0dXJuIHRvIGNvbW1hbmQgbG9vcAorCitjYWxsMzJfZW50ZXJfcm06CisJCTsgQ2FyZWZ1bCBoZXJlLi4uIHRoZSBQTSBjb2RlIG1heSBoYXZlIHJlbG9jYXRlZCB0aGUKKwkJOyBlbnRpcmUgUk0gY29kZSwgc28gd2UgbmVlZCB0byBmaWd1cmUgb3V0IGV4YWN0bHkKKwkJOyB3aGVyZSB3ZSBhcmUgZXhlY3V0aW5nIGZyb20uICBJZiB0aGUgUE0gY29kZSBoYXMKKwkJOyByZWxvY2F0ZWQgdXMsIGl0ICp3aWxsKiBoYXZlIGFkanVzdGVkIHRoZSBHRFQgdG8KKwkJOyBtYXRjaCwgdGhvdWdoLgorCQljYWxsIC5oZXJlCisuaGVyZToJCXBvcCBlYnAKKwkJc3ViIGVicCwuaGVyZQorCQlvMzIgc2lkdCBbZWJwK2NhbGwzMl9wbWlkdF0KKwkJY2xpCisJCWNsZAorCQltb3YgW2VicCtQTUVTUF0sZXNwCTsgU2F2ZSBleGl0ICVlc3AKKwkJeG9yIGVzcCxlc3AJCTsgTWFrZSBzdXJlIHRoZSBoaWdoIGJpdHMgYXJlIHplcm8KKwkJam1wIDEwaDouaW5fcG0xNgk7IFJldHVybiB0byAxNi1iaXQgbW9kZSBmaXJzdAorCisJCWJpdHMgMTYKKy5pbl9wbTE2OgorCQltb3YgYXgsMThoCQk7IFJlYWwtbW9kZS1saWtlIHNlZ21lbnQKKwkJbW92IGVzLGF4CisJCW1vdiBkcyxheAorCQltb3Ygc3MsYXgKKwkJbW92IGZzLGF4CisJCW1vdiBncyxheAorCisJCWxpZHQgW2NhbGwzMl9ybWlkdF0JOyBSZWFsLW1vZGUgSURUIChybSBuZWVkcyBubyBHRFQpCisJCW1vdiBlYXgsY3IwCisJCWFuZCBhbCx+MQorCQltb3YgY3IwLGVheAorCQlqbXAgTVlfQ1M6LmluX3JtCisucm1fam1wCQllcXUgJC0yCisKKy5pbl9ybToJCQkJCTsgQmFjayBpbiByZWFsIG1vZGUKKwkJbW92IGF4LGNzCisJCW1vdiBkcyxheAorCQltb3YgZXMsYXgKKwkJbW92IGZzLGF4CisJCW1vdiBncyxheAorCQltb3Ygc3MsYXgKKwkJbW92IHNwLFtTYXZlZFNQXQk7IFJlc3RvcmUgc3RhY2sKKwkJam1wIGJ4CQkJOyBHbyB0byB3aGVyZWV2ZXIgd2UgbmVlZCB0byBnby4uLgorCitjYWxsMzJfZG9uZToKKwkJY2FsbCBkaXNhYmxlX2EyMAorCQlzdGkKKwkJcmV0CisKKzsKKzsgMTYtYml0IHN1cHBvcnQgY29kZQorOworCQliaXRzIDE2CisKKzsKKzsgMTYtYml0IGludGVycnVwdC1oYW5kbGluZyBjb2RlCis7CitjYWxsMzJfaW50X3JtOgorCQlwdXNoZgkJCQk7IEZsYWdzIG9uIHN0YWNrCisJCXB1c2ggY3MJCQkJOyBSZXR1cm4gc2VnbWVudAorCQlwdXNoIHdvcmQgLmNvbnQJCQk7IFJldHVybiBhZGRyZXNzCisJCXB1c2ggZHdvcmQgZWR4CQkJOyBTZWdtZW50Om9mZnNldCBvZiBJVlQgZW50cnkKKwkJcmV0ZgkJCQk7IEludm9rZSBJVlQgcm91dGluZQorLmNvbnQ6CQk7IC4uLiBvbiByZXN1bWUgLi4uCisJCW1vdiBieCxjYWxsMzJfaW50X3Jlc3VtZQorCQlqbXAgY2FsbDMyX2VudGVyX3BtCQk7IEdvIGJhY2sgdG8gUE0KKworOworOyAxNi1iaXQgc3lzdGVtIGNhbGwgaGFuZGxpbmcgY29kZQorOworY2FsbDMyX3N5c19ybToKKwkJcG9wIGdzCisJCXBvcCBmcworCQlwb3AgZXMKKwkJcG9wIGRzCisJCXBvcGFkCisJCXBvcGZkCisJCXJldGYJCQkJOyBJbnZva2Ugcm91dGluZQorLnJldHVybjoKKwkJcHVzaGZkCisJCXB1c2hhZAorCQlwdXNoIGRzCisJCXB1c2ggZXMKKwkJcHVzaCBmcworCQlwdXNoIGdzCisJCW1vdiBieCxjYWxsMzJfc3lzX3Jlc3VtZQorCQlqbXAgY2FsbDMyX2VudGVyX3BtCisKKzsKKzsgMzItYml0IHN1cHBvcnQgY29kZQorOworCQliaXRzIDMyCisKKzsKKzsgVGhpcyBpcyBpbnZva2VkIG9uIGdldHRpbmcgYW4gaW50ZXJydXB0IGluIHByb3RlY3RlZCBtb2RlLiAgQXQKKzsgdGhpcyBwb2ludCwgd2UgbmVlZCB0byBjb250ZXh0LXN3aXRjaCB0byByZWFsIG1vZGUgYW5kIGludm9rZQorOyB0aGUgaW50ZXJydXB0IHJvdXRpbmUuCis7Cis7IFdoZW4gdGhpcyBnZXRzIGludm9rZWQsIHRoZSByZWdpc3RlcnMgYXJlIHNhdmVkIG9uIHRoZSBzdGFjayBhbmQKKzsgQUwgY29udGFpbnMgdGhlIHJlZ2lzdGVyIG51bWJlci4KKzsKK2NhbGwzMl9oYW5kbGVfaW50ZXJydXB0OgorCQltb3Z6eCBlYXgsYWwKKwkJeG9yIGVieCxlYngJCTsgQWN0dWFsbHkgbWFrZXMgdGhlIGNvZGUgc21hbGxlcgorCQltb3YgZWR4LFtlYngrZWF4KjRdCTsgR2V0IHRoZSBzZWdtZW50Om9mZnNldCBvZiB0aGUgcm91dGluZQorCQltb3YgYngsY2FsbDMyX2ludF9ybQorCQlqbXAgY2FsbDMyX2VudGVyX3JtCTsgR28gdG8gcmVhbCBtb2RlCisKK2NhbGwzMl9pbnRfcmVzdW1lOgorCQlwb3BhZAorCQlpcmV0CisKKzsKKzsgU3lzY2FsbCBpbnZvY2F0aW9uLiAgV2UgbWFuaWZlc3QgYSBzdHJ1Y3R1cmUgb24gdGhlIHJlYWwtbW9kZSBzdGFjaywKKzsgY29udGFpbmluZyB0aGUgY2FsbDMyc3lzX3Qgc3RydWN0dXJlIGZyb20gPGNhbGwzMi5oPiBhcyB3ZWxsIGFzCis7IHRoZSBmb2xsb3dpbmcgZW50cmllcyAoZnJvbSBsb3cgdG8gaGlnaCBhZGRyZXNzKToKKzsgLSBUYXJnZXQgb2Zmc2V0Cis7IC0gVGFyZ2V0IHNlZ21lbnQKKzsgLSBSZXR1cm4gb2Zmc2V0Cis7IC0gUmV0dXJuIHNlZ21lbnQgKD09IHJlYWwgbW9kZSBjcykKKzsgLSBSZXR1cm4gZmxhZ3MKKzsKK2NhbGwzMl9zeXNjYWxsOgorCQlwdXNoZmQJCQk7IFNhdmUgSUYgYW1vbmcgb3RoZXIgdGhpbmdzLi4uCisJCXB1c2hhZAkJCTsgV2Ugb25seSBuZWVkIHRvIHNhdmUgc29tZSwgYnV0Li4uCisJCWNsZAorCQljYWxsIC5oZXJlCisuaGVyZToJCXBvcCBlYnAKKwkJc3ViIGVicCwuaGVyZQorCisJCW1vdnp4IGVkaSx3b3JkIFtlYnArU2F2ZWRTUF0KKwkJc3ViIGVkaSw1NAkJOyBBbGxvY2F0ZSA1NCBieXRlcworCQltb3YgW2VicCtTYXZlZFNQXSxkaQorCQlhZGQgZWRpLGVicAkJOyBDcmVhdGUgbGluZWFyIGFkZHJlc3MKKworCQltb3YgZXNpLFtlc3ArMTEqNF0JOyBTb3VyY2UgcmVncworCQl4b3IgZWN4LGVjeAorCQltb3YgY2wsMTEJCTsgNDQgYnl0ZXMgdG8gY29weQorCQlyZXAgbW92c2QKKworCQltb3Z6eCBlYXgsYnl0ZSBbZXNwKzEwKjRdIDsgSW50ZXJydXB0IG51bWJlcgorCQk7IGVjeCA9PSAwIGhlcmU7IGFkZGluZyBpdCB0byB0aGUgRUEgbWFrZXMgdGhlCisJCTsgZW5jb2Rpbmcgc21hbGxlcgorCQltb3YgZWF4LFtlY3grZWF4KjRdCTsgR2V0IElWVCBlbnRyeQorCQlzdG9zZAkJCTsgU2F2ZSBpbiBzdGFjayBmcmFtZQorCQltb3YgYXgsY2FsbDMyX3N5c19ybS5yZXR1cm4JOyBSZXR1cm4gb2Zmc2V0CisJCXN0b3N3CQkJCTsgU2F2ZSBpbiBzdGFjayBmcmFtZQorCQltb3YgZWF4LGVicAorCQlzaHIgZWF4LDQJCQk7IFJldHVybiBzZWdtZW50CisJCXN0b3N3CQkJCTsgU2F2ZSBpbiBzdGFjayBmcmFtZQorCQltb3YgZWF4LFtlZGktMTJdCTsgUmV0dXJuIGZsYWdzCisJCWFuZCBlYXgsMHgyMDBjZDcJOyBNYXNrIChwb3RlbnRpYWxseSkgdW5zYWZlIGZsYWdzCisJCW1vdiBbZWRpLTEyXSxlYXgJOyBQcmltYXJ5IGZsYWdzIGVudHJ5CisJCXN0b3N3CQkJOyBSZXR1cm4gZmxhZ3MKKworCQltb3YgYngsY2FsbDMyX3N5c19ybQorCQlqbXAgY2FsbDMyX2VudGVyX3JtCTsgR28gdG8gcmVhbCBtb2RlCisKKwkJOyBPbiByZXR1cm4sIHRoZSA0NC1ieXRlIHJldHVybiBzdHJ1Y3R1cmUgaXMgb24gdGhlCisJCTsgcmVhbC1tb2RlIHN0YWNrLiAgY2FsbDMyX2VudGVyX3BtIHdpbGwgbGVhdmUgZWJwCisJCTsgcG9pbnRpbmcgdG8gdGhlIHJlYWwtbW9kZSBiYXNlLgorY2FsbDMyX3N5c19yZXN1bWU6CisJCW1vdnp4IGVzaSx3b3JkIFtlYnArU2F2ZWRTUF0KKwkJbW92IGVkaSxbZXNwKzEyKjRdCTsgRGVzdCByZWdzCisJCWFkZCBlc2ksZWJwCQk7IENyZWF0ZSBsaW5lYXIgYWRkcmVzcworCQlhbmQgZWRpLGVkaQkJOyBOVUxMIHBvaW50ZXI/CisJCWpueiAuZG9fY29weQorLm5vX2NvcHk6CW1vdiBlZGksZXNpCQk7IERvIGEgZHVtbXkgY29weS10by1zZWxmCisuZG9fY29weToJeG9yIGVjeCxlY3gKKwkJbW92IGNsLDExCQk7IDQ0IGJ5dGVzCisJCXJlcCBtb3ZzZAkJOyBDb3B5IHJlZ2lzdGVyIGJsb2NrCisKKwkJYWRkIHdvcmQgW2VicCtTYXZlZFNQXSw0NAk7IFJlbW92ZSBmcm9tIHN0YWNrCisKKwkJcG9wYWQKKwkJcG9wZmQKKwkJcmV0CQkJOyBSZXR1cm4gdG8gMzItYml0IHByb2dyYW0KZGlmZiAtLWdpdCBhL21lbWRpc2svbWVtZGlza19jaHNfNTEyLmFzbSBiL21lbWRpc2svbWVtZGlza19jaHNfNTEyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQzNmYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9tZW1kaXNrX2Noc181MTIuYXNtCkBAIC0wLDAgKzEsNSBAQAorCVttYXAgYWxsIG1lbWRpc2tfY2hzXzUxMi5tYXBdCislZGVmaW5lIEVERCAwCislZGVmaW5lIEVMVE9SSVRPIDAKKyVkZWZpbmUgU0VDVE9SU0laRV9MRzIgOQk7IGxvZzIoc2VjdG9yIHNpemUpCislaW5jbHVkZSAibWVtZGlzay5pbmMiCmRpZmYgLS1naXQgYS9tZW1kaXNrL21lbWRpc2tfZWRkXzUxMi5hc20gYi9tZW1kaXNrL21lbWRpc2tfZWRkXzUxMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2ZDVjYQotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svbWVtZGlza19lZGRfNTEyLmFzbQpAQCAtMCwwICsxLDUgQEAKKwlbbWFwIGFsbCBtZW1kaXNrX2VkZF81MTIubWFwXQorJWRlZmluZSBFREQgMQorJWRlZmluZSBFTFRPUklUTyAwCislZGVmaW5lIFNFQ1RPUlNJWkVfTEcyIDkJOyBsb2cyKHNlY3RvciBzaXplKQorJWluY2x1ZGUgIm1lbWRpc2suaW5jIgpkaWZmIC0tZ2l0IGEvbWVtZGlzay9tZW1kaXNrX2lzb18yMDQ4LmFzbSBiL21lbWRpc2svbWVtZGlza19pc29fMjA0OC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4ZmZlZQotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svbWVtZGlza19pc29fMjA0OC5hc20KQEAgLTAsMCArMSw1IEBACisJW21hcCBhbGwgbWVtZGlza19pc29fMjA0OC5tYXBdCislZGVmaW5lIEVERCAxCislZGVmaW5lIEVMVE9SSVRPIDEKKyVkZWZpbmUgU0VDVE9SU0laRV9MRzIgMTEJOyBsb2cyKHNlY3RvciBzaXplKQorJWluY2x1ZGUgIm1lbWRpc2suaW5jIgpkaWZmIC0tZ2l0IGEvbWVtZGlzay9tZW1kaXNrX2lzb181MTIuYXNtIGIvbWVtZGlzay9tZW1kaXNrX2lzb181MTIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTViNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL21lbWRpc2tfaXNvXzUxMi5hc20KQEAgLTAsMCArMSw1IEBACisJW21hcCBhbGwgbWVtZGlza19pc29fNTEyLm1hcF0KKyVkZWZpbmUgRUREIDEKKyVkZWZpbmUgRUxUT1JJVE8gMQorJWRlZmluZSBTRUNUT1JTSVpFX0xHMiA5CTsgbG9nMihzZWN0b3Igc2l6ZSkKKyVpbmNsdWRlICJtZW1kaXNrLmluYyIKZGlmZiAtLWdpdCBhL21lbWRpc2svbWVtbW92ZS5TIGIvbWVtZGlzay9tZW1tb3ZlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhYzY3NgotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svbWVtbW92ZS5TCkBAIC0wLDAgKzEsMTM5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1lbW1vdmUuUworICoKKyAqIFJlYXNvbmFibHkgZWZmaWNpZW50IG1lbW1vdmUsIHVzaW5nIGFsaWduZWQgdHJhbnNmZXJzIGF0IGxlYXN0CisgKiBmb3IgdGhlIGRlc3RpbmF0aW9uIG9wZXJhbmQuCisgKi8KKworCS5nbG9ibAltZW1tb3ZlCisJLnR5cGUJbWVtbW92ZSxAZnVuY3Rpb24KKwkudGV4dAorbWVtbW92ZToKKwlqZWN4egkzZgorCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlwdXNobAklZWF4CQkvKiBSZXR1cm4gdmFsdWUgKi8KKworCW1vdmwJJWVheCwlZWRpCisJbW92bAklZWR4LCVlc2kKKworCWNtcGwJJWVkaSwlZXNpCisJamIJMWYKKworCS8qIHNvdXJjZSA+PSBkZXN0LCBmb3J3YXJkcyBtb3ZlICovCisKKwkvKiBJbml0aWFsIGFsaWdubWVudCAqLworCW1vdmwJJWVkaSwlZWR4CisJc2hybAkkMSwlZWR4CisJam5jCTExZgorCW1vdnNiCisJZGVjbAklZWN4CisxMToKKwltb3ZiCSVjbCwlYWwKKwljbXBsCSQyLCVlY3gKKwlqYgkxM2YKKworCXNocmwJJDEsJWVkeAorCWpuYwkxMmYKKwltb3ZzdworCXN1YmwJJDIsJWVjeAorMTI6CisJLyogQnVsayB0cmFuc2ZlciAqLworCW1vdmIJJWNsLCVhbAorCXNocmwJJDIsJWVjeAorCXJlcDsgbW92c2wKKworCS8qIEZpbmFsIGFsaWdubWVudCAqLworCXRlc3RiCSQyLCVhbAorCWp6CTE0ZgorCW1vdnN3CisxMzoKKzE0OgorCXRlc3RiCSQxLCVhbAorCWp6CTE1ZgorCW1vdnNiCisxNToKKwlqbXAJMmYKKworCisxOgorCS8qIHNvdXJjZSA8IGRlc3QsIGJhY2t3YXJkcyBtb3ZlICovCisJc3RkCisJbGVhbAktMSglZWN4LCVlc2kpLCVlc2kKKwlsZWFsCS0xKCVlY3gsJWVkaSksJWVkaQorCisJLyogSW5pdGlhbCBhbGlnbm1lbnQgKi8KKwltb3ZsCSVlZGksJWVkeAorCXNocmwJJDEsJWVkeAorCWpjCTIxZgorCW1vdnNiCisJZGVjbAklZWN4CisyMToKKwlkZWNsCSVlc2kKKwlkZWNsCSVlZGkKKwltb3ZiCSVjbCwlYWwKKwljbXBsCSQyLCVlY3gKKwlqYgkyM2YKKwlzaHJsCSQxLCVlZHgKKwlqYwkyMmYKKwltb3ZzdworCXN1YmwJJDIsJWVjeAorMjI6CisJLyogQnVsayB0cmFuc2ZlciAqLworCXN1YmwJJDIsJWVzaQorCXN1YmwJJDIsJWVkaQorCW1vdmIJJWNsLCVhbAorCXNocmwJJDIsJWVjeAorCXJlcDsgbW92c2wKKworCS8qIEZpbmFsIGFsaWdubWVudCAqLworCWFkZGwJJDIsJWVzaQorCWFkZGwJJDIsJWVkaQorCXRlc3RiCSQyLCVhbAorCWp6CTI0ZgorCW1vdnN3CisyMzoKKzI0OgorCWluY2wJJWVzaQorCWluY2wJJWVkaQorCXRlc3RiCSQxLCVhbAorCWp6CTI1ZgorCW1vdnNiCisyNToKKwljbGQKKzI6CisJcG9wbAklZWF4CQkvKiBSZXR1cm4gdmFsdWUgKi8KKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKzM6CisJcmV0CisKKwkuc2l6ZQltZW1tb3ZlLCAuLW1lbW1vdmUKZGlmZiAtLWdpdCBhL21lbWRpc2svbWVtbW92ZS5jIGIvbWVtZGlzay9tZW1tb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5OGNkOAotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svbWVtbW92ZS5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBtZW1tb3ZlLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgKm1lbW1vdmUodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworCWNvbnN0IGNoYXIgKnAgPSBzcmM7CisJY2hhciAqcSA9IGRzdDsKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJaWYgKHEgPCBwKSB7CisJCWFzbSB2b2xhdGlsZSgiY2xkOyByZXA7IG1vdnNiIgorCQkJICAgICA6ICIrYyIgKG4pLCAiK1MiKHApLCAiK0QiKHEpKTsKKwl9IGVsc2UgeworCQlwICs9IChuIC0gMSk7CisJCXEgKz0gKG4gLSAxKTsKKwkJYXNtIHZvbGF0aWxlKCJzdGQ7IHJlcDsgbW92c2I7IGNsZCIKKwkJCSAgICAgOiAiK2MiIChuKSwgIitTIihwKSwgIitEIihxKSk7CisJfQorI2Vsc2UKKwlpZiAocSA8IHApIHsKKwkJd2hpbGUgKG4tLSkgeworCQkJKnErKyA9ICpwKys7CisJCX0KKwl9IGVsc2UgeworCQlwICs9IG47CisJCXEgKz0gbjsKKwkJd2hpbGUgKG4tLSkgeworCQkJKi0tcSA9ICotLXA7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS9tZW1kaXNrL21lbXNldC5TIGIvbWVtZGlzay9tZW1zZXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQxNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9tZW1zZXQuUwpAQCAtMCwwICsxLDg2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1lbXNldC5TCisgKgorICogUmVhc29uYWJseSBlZmZpY2llbnQgbWVtc2V0LCB1c2luZyBhbGlnbmVkIHRyYW5zZmVycyBhdCBsZWFzdAorICogZm9yIHRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kLgorICovCisKKwkuZ2xvYmwJbWVtc2V0CisJLnR5cGUJbWVtc2V0LEBmdW5jdGlvbgorCS50ZXh0CittZW1zZXQ6CisJamVjeHoJNmYKKworCXB1c2hsCSVlZGkKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVheAkJLyogUmV0dXJuIHZhbHVlICovCisKKwltb3ZsCSVlYXgsJWVkaQorCW1vdmIJJWRsLCVkaAorCW1vdnp3bAklZHgsJWVheAorCXNobGwJJDE2LCVlZHgKKwlvcmwJJWVkeCwlZWF4CisKKwkvKiBJbml0aWFsIGFsaWdubWVudCAqLworCW1vdmwJJWVkaSwlZWR4CisJc2hybAkkMSwlZWR4CisJam5jCTFmCisJc3Rvc2IKKwlkZWNsCSVlY3gKKzE6CisJbW92YgklY2wsJWJsCisJY21wbAkkMiwlZWN4CisJamIJM2YKKwlzaHJsCSQxLCVlZHgKKwlqbmMJMmYKKwlzdG9zdworCXN1YmwJJDIsJWVjeAorMjoKKwkvKiBCdWxrIHRyYW5zZmVyICovCisJbW92YgklY2wsJWJsCisJc2hybAkkMiwlZWN4CisJcmVwOyBzdG9zbAorCisJdGVzdGIJJDIsJWJsCisJanoJNGYKKwlzdG9zdworMzoKKzQ6CisJdGVzdGIJJDEsJWJsCisJanoJNWYKKwlzdG9zYgorNToKKwlwb3BsCSVlYXgJCS8qIFJldHVybiB2YWx1ZSAqLworCXBvcGwJJWVieAorCXBvcGwJJWVkaQorNjoKKwlyZXQKKworCS5zaXplCW1lbXNldCwgLi1tZW1zZXQKZGlmZiAtLWdpdCBhL21lbWRpc2svbWVtc2V0LmMgYi9tZW1kaXNrL21lbXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDBiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL21lbXNldC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBtZW1zZXQuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCAqbWVtc2V0KHZvaWQgKmRzdCwgaW50IGMsIHNpemVfdCBuKQoreworCWNoYXIgKnEgPSBkc3Q7CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorCXNpemVfdCBubCA9IG4gPj4gMjsKKwlhc20gdm9sYXRpbGUgKCJjbGQgOyByZXAgOyBzdG9zbCA7IG1vdmwgJTMsJTAgOyByZXAgOyBzdG9zYiIKKwkJICAgICAgOiAiK2MiIChubCksICIrRCIgKHEpCisJCSAgICAgIDogImEiICgodW5zaWduZWQgY2hhciljICogMHgwMTAxMDEwMVUpLCAiciIgKG4gJiAzKSk7CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisJc2l6ZV90IG5xID0gbiA+PiAzOworCWFzbSB2b2xhdGlsZSAoImNsZCA7IHJlcCA7IHN0b3NxIDsgbW92bCAlMywlJWVjeCA7IHJlcCA7IHN0b3NiIgorCQkgICAgICA6IitjIiAobnEpLCAiK0QiIChxKQorCQkgICAgICA6ICJhIiAoKHVuc2lnbmVkIGNoYXIpYyAqIDB4MDEwMTAxMDEwMTAxMDEwMVUpLAorCQkJInIiICgodWludDMyX3QpIG4gJiA3KSk7CisjZWxzZQorCXdoaWxlIChuLS0pIHsKKwkJKnErKyA9IGM7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvbWVtZGlzay9tc2V0dXAuYyBiL21lbWRpc2svbXNldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwYTJjNgotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svbXNldHVwLmMKQEAgLTAsMCArMSwxNzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1zZXR1cC5jCisgKgorICogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgbWVtb3J5LWJhc2VkIGRpc2sKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWZkZWYgVEVTVAorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgaW5jbHVkZSA8c3RkaW8uaD4KKyNlbHNlCisjIGluY2x1ZGUgIm1lbWRpc2suaCIKKyMgaW5jbHVkZSAiY29uaW8uaCIKKyNlbmRpZgorI2luY2x1ZGUgImU4MjAuaCIKKwordWludDMyX3QgZG9zX21lbSA9IDA7CQkvKiAwLTFNQiAqLwordWludDMyX3QgbG93X21lbSA9IDA7CQkvKiAxLTE2TUIgKi8KK3VpbnQzMl90IGhpZ2hfbWVtID0gMDsJCS8qIDE2KyBNQiAqLworCisjaWZuZGVmIFRFU1QKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2U4MjAodm9pZCkKK3sKKyAgICBzdHJ1Y3QgZTgyMF9pbmZvIHsKKwl1aW50NjRfdCBiYXNlOworCXVpbnQ2NF90IGxlbjsKKwl1aW50MzJfdCB0eXBlOworICAgIH0gKmJ1ZiA9IHN5c19ib3VuY2U7CisgICAgdWludDMyX3QgY29waWVkOworICAgIGludCByYW5nZV9jb3VudCA9IDA7CisgICAgY29tMzJzeXNfdCByZWdzOworCisgICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YgcmVncyk7CisgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mICpidWYpOworCisgICAgZG8geworCXJlZ3MuZWF4LmwgPSAweDAwMDBlODIwOworCXJlZ3MuZWN4LmwgPSBzaXplb2YoKmJ1Zik7CisJcmVncy5lZHgubCA9IDB4NTM0ZDQxNTA7CisJcmVncy5lZGkud1swXSA9IE9GRlMoYnVmKTsKKwlyZWdzLmVzID0gU0VHKGJ1Zik7CisKKwlpbnRjYWxsKDB4MTUsICZyZWdzLCAmcmVncyk7CisJY29waWVkID0gKHJlZ3MuZWZsYWdzLmwgJiAxKSA/IDAgOiByZWdzLmVjeC5sOworCisJaWYgKHJlZ3MuZWF4LmwgIT0gMHg1MzRkNDE1MCB8fCBjb3BpZWQgPCAyMCkKKwkgICAgYnJlYWs7CisKKwlwcmludGYoImU4MjA6ICUwOHglMDh4ICUwOHglMDh4ICVkXG4iLAorCSAgICAgICAodWludDMyX3QpIChidWYtPmJhc2UgPj4gMzIpLCAodWludDMyX3QpIGJ1Zi0+YmFzZSwKKwkgICAgICAgKHVpbnQzMl90KSAoYnVmLT5sZW4gPj4gMzIpLCAodWludDMyX3QpIGJ1Zi0+bGVuLCBidWYtPnR5cGUpOworCisJaW5zZXJ0cmFuZ2UoYnVmLT5iYXNlLCBidWYtPmxlbiwgYnVmLT50eXBlKTsKKwlyYW5nZV9jb3VudCsrOworCisgICAgfSB3aGlsZSAocmVncy5lYngubCk7CisKKyAgICByZXR1cm4gIXJhbmdlX2NvdW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2Rvc19tZW0odm9pZCkKK3sKKyAgICBjb20zMnN5c190IHJlZ3M7CisKKyAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZiByZWdzKTsKKyAgICBpbnRjYWxsKDB4MTIsICZyZWdzLCAmcmVncyk7CisgICAgaW5zZXJ0cmFuZ2UoMCwgKHVpbnQ2NF90KSAoKHVpbnQzMl90KSByZWdzLmVheC53WzBdIDw8IDEwKSwgMSk7CisgICAgcHJpbnRmKCIgRE9TOiAlZCBLXG4iLCByZWdzLmVheC53WzBdKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2U4MDEodm9pZCkKK3sKKyAgICBpbnQgZXJyOworICAgIGNvbTMyc3lzX3QgcmVnczsKKworICAgIG1lbXNldCgmcmVncywgMCwgc2l6ZW9mIHJlZ3MpOworCisgICAgcmVncy5lYXgud1swXSA9IDB4ZTgwMTsKKyAgICBpbnRjYWxsKDB4MTUsICZyZWdzLCAmcmVncyk7CisKKyAgICBpZiAoIShlcnIgPSByZWdzLmVmbGFncy5sICYgMSkpIHsKKwlpZiAocmVncy5lYXgud1swXSkgeworCSAgICBpbnNlcnRyYW5nZSgweDEwMDAwMCwgKHVpbnQ2NF90KSAoKHVpbnQzMl90KSByZWdzLmVheC53WzBdIDw8IDEwKSwKKwkJCTEpOworCX0KKwlpZiAocmVncy5lYngud1swXSkgeworCSAgICBpbnNlcnRyYW5nZSgweDEwMDAwMDAsICh1aW50NjRfdCkgKCh1aW50MzJfdCkgcmVncy5lYngud1swXSA8PCAxNiksCisJCQkxKTsKKwl9CisKKwlwcmludGYoImU4MDE6ICUwNHggJTA0eFxuIiwgcmVncy5lYXgud1swXSwgcmVncy5lYngud1swXSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0Xzg4KHZvaWQpCit7CisgICAgY29tMzJzeXNfdCByZWdzOworICAgIGludCBlcnI7CisKKyAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZiByZWdzKTsKKworICAgIHJlZ3MuZWF4LmJbMV0gPSAweDg4OworICAgIGludGNhbGwoMHgxNSwgJnJlZ3MsICZyZWdzKTsKKworICAgIGlmICghKGVyciA9IHJlZ3MuZWZsYWdzLmwgJiAxKSkgeworCWlmIChyZWdzLmVheC53WzBdKSB7CisJICAgIGluc2VydHJhbmdlKDB4MTAwMDAwLCAodWludDY0X3QpICgodWludDMyX3QpIHJlZ3MuZWF4LndbMF0gPDwgMTApLAorCQkJMSk7CisJfQorCisJcHJpbnRmKCIgIDg4OiAlMDR4XG4iLCByZWdzLmVheC53WzBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIGdldF9tZW0odm9pZCkKK3sKKyAgICBpZiAoZ2V0X2U4MjAoKSkgeworCWdldF9kb3NfbWVtKCk7CisJaWYgKGdldF9lODAxKCkpIHsKKwkgICAgaWYgKGdldF84OCgpKSB7CisJCWRpZSgiTUVNRElTSzogVW5hYmxlIHRvIG9idGFpbiBtZW1vcnkgbWFwXG4iKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKyNlbmRpZiAvKiBURVNUICovCisKKyNkZWZpbmUgUFcoeCkgKDFVTEwgPDwgKHgpKQorCit2b2lkIHBhcnNlX21lbSh2b2lkKQoreworICAgIHN0cnVjdCBlODIwcmFuZ2UgKmVwOworCisgICAgZG9zX21lbSA9IGxvd19tZW0gPSBoaWdoX21lbSA9IDA7CisKKyAgICAvKiBEZXJpdmUgImRvcyBtZW0iLCAiaGlnaCBtZW0iLCBhbmQgImxvdyBtZW0iIGZyb20gdGhlIHJhbmdlIGFycmF5ICovCisgICAgZm9yIChlcCA9IHJhbmdlczsgZXAtPnR5cGUgIT0gLTFVOyBlcCsrKSB7CisJaWYgKGVwLT50eXBlID09IDEpIHsKKwkgICAgLyogT25seSBsb29rIGF0IG1lbW9yeSByYW5nZXMgKi8KKwkgICAgaWYgKGVwLT5zdGFydCA9PSAwKSB7CisJCWlmIChlcFsxXS5zdGFydCA+IFBXKDIwKSkKKwkJICAgIGRvc19tZW0gPSBQVygyMCk7CisJCWVsc2UKKwkJICAgIGRvc19tZW0gPSBlcFsxXS5zdGFydDsKKwkgICAgfQorCSAgICBpZiAoZXAtPnN0YXJ0IDw9IFBXKDIwKSAmJiBlcFsxXS5zdGFydCA+IFBXKDIwKSkgeworCQlpZiAoZXBbMV0uc3RhcnQgPiBQVygyNCkpCisJCSAgICBsb3dfbWVtID0gUFcoMjQpIC0gUFcoMjApOworCQllbHNlCisJCSAgICBsb3dfbWVtID0gZXBbMV0uc3RhcnQgLSBQVygyMCk7CisJICAgIH0KKwkgICAgaWYgKGVwLT5zdGFydCA8PSBQVygyNCkgJiYgZXBbMV0uc3RhcnQgPiBQVygyNCkpIHsKKwkJaWYgKGVwWzFdLnN0YXJ0ID4gUFcoMzIpKQorCQkgICAgaGlnaF9tZW0gPSBQVygzMikgLSBQVygyNCk7CisJCWVsc2UKKwkJICAgIGhpZ2hfbWVtID0gZXBbMV0uc3RhcnQgLSBQVygyNCk7CisJICAgIH0KKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVtZGlzay9tc3RydWN0cy5oIGIvbWVtZGlzay9tc3RydWN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMGRjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL21zdHJ1Y3RzLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAxLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyAqICAgUG9ydGlvbnMgY29weXJpZ2h0IDIwMDktMjAxMCBTaGFvIE1pbGxlcgorICoJCQkJICBbRWwgVG9yaXRvIGNvZGUsIG1CRlQsICJzYWZlIGhvb2siXQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIGNvbW1vbiB0byBNRU1ESVNLIGFuZCBNRElTS0NISy5DT00gKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvbXBpbGVyLmgiCisKK3N0cnVjdCBzZWdfb2ZmIHsKKyAgICB1aW50MTZfdCBvZmZzZXQ7CisgICAgdWludDE2X3Qgc2VnbWVudDsKK307CisKK3R5cGVkZWYgdW5pb24geworICAgIHN0cnVjdCBzZWdfb2ZmIHNlZ19vZmY7CisgICAgdWludDMyX3QgdWludDMyOworfSByZWFsX2FkZHJfdDsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RydWN0IG1CRlQ7CisKK01FTURJU0tfUEFDS0VEX1BSRUZJWAorc3RydWN0IHNhZmVfaG9vayB7CisgICAgdWludDhfdCBqdW1wWzNdOwkJLyogTWF4LiB0aHJlZSBieXRlcyBmb3IganVtcCAqLworICAgIHVpbnQ4X3Qgc2lnbmF0dXJlWzhdOwkvKiAiJElOVDEzU0YiICovCisgICAgdWludDhfdCB2ZW5kb3JbOF07CQkvKiAiTUVNRElTSyAiICovCisgICAgcmVhbF9hZGRyX3Qgb2xkX2hvb2s7CS8qIFNFRzpPRkYgZm9yIHByZXZpb3VzIElOVCAxM2ggaG9vayAqLworICAgIHVpbnQzMl90IGZsYWdzOwkJLyogIlNhZmUgaG9vayIgZmxhZ3MgKi8KKyAgICAvKiBUaGUgbmV4dCBmaWVsZCBpcyBhIE1FTURJU0sgZXh0ZW5zaW9uIHRvIHRoZSAic2FmZSBob29rIiBzdHJ1Y3R1cmUgKi8KKyAgICB1aW50MzJfdCBtYmZ0OworfSBNRU1ESVNLX1BBQ0tFRF9QT1NURklYOworCitzdHJ1Y3QgbWVtZGlza19oZWFkZXIgeworICAgIHVpbnQxNl90IGludDEzX29mZnM7CisgICAgdWludDE2X3QgaW50MTVfb2ZmczsKKyAgICB1aW50MTZfdCBwYXRjaF9vZmZzOworICAgIHVpbnQxNl90IHRvdGFsX3NpemU7CisgICAgdWludDE2X3QgaXJldF9vZmZzOworICAgIHN0cnVjdCBzYWZlX2hvb2sgc2FmZV9ob29rOworfTsKKworTUVNRElTS19QQUNLRURfUFJFRklYCisvKiBFREQgZGlzayBwYXJhbWV0ZXIgdGFibGUgKi8KK3N0cnVjdCBlZGRfZHB0IHsKKyAgICB1aW50MTZfdCBsZW47CQkvKiBMZW5ndGggb2YgdGFibGUgKi8KKyAgICB1aW50MTZfdCBmbGFnczsJCS8qIEluZm9ybWF0aW9uIGZsYWdzICovCisgICAgdWludDMyX3QgYzsJCQkvKiBQaHlzaWNhbCBjeWxpbmRlcnMgKGNvdW50ISkgKi8KKyAgICB1aW50MzJfdCBoOwkJCS8qIFBoeXNpY2FsIGhlYWRzIChjb3VudCEpICovCisgICAgdWludDMyX3QgczsJCQkvKiBQaHlzaWNhbCBzZWN0b3JzL3RyYWNrIChjb3VudCEpICovCisgICAgdWludDY0X3Qgc2VjdG9yczsJCS8qIFRvdGFsIHNlY3RvcnMgKi8KKyAgICB1aW50MTZfdCBieXRlc3BlcnNlYzsJLyogQnl0ZXMvc2VjdG9yICovCisgICAgcmVhbF9hZGRyX3QgZHB0ZTsJCS8qIERQVEUgcG9pbnRlciAqLworICAgIHVpbnQxNl90IGRwaWtleTsJCS8qIERldmljZSBQYXRoIEluZm8gbWFnaWMgKi8KKyAgICB1aW50OF90ICBkcGlsZW47CQkvKiBEZXZpY2UgUGF0aCBJbmZvIGxlbmd0aCAqLworICAgIHVpbnQ4X3QgIHJlczE7CQkvKiBSZXNlcnZlZCAqLworICAgIHVpbnQxNl90IHJlczI7CQkvKiBSZXNlcnZlZCAqLworICAgIHVpbnQ4X3QgIGJ1c3R5cGVbNF07CS8qIEhvc3QgYnVzIHR5cGUgKi8KKyAgICB1aW50OF90ICBpbnR0eXBlWzhdOwkvKiBJbnRlcmZhY2UgdHlwZSAqLworICAgIHVpbnQ2NF90IGludHBhdGg7CQkvKiBJbnRlcmZhY2UgcGF0aCAqLworICAgIHVpbnQ2NF90IGRldnBhdGhbMl07CS8qIERldmljZSBwYXRoIChkb3VibGUgUXVhZFdvcmQhKSAqLworICAgIHVpbnQ4X3QgIHJlczM7CQkvKiBSZXNlcnZlZCAqLworICAgIHVpbnQ4X3QgIGNoa3N1bTsJCS8qIERQSSBjaGVja3N1bSAqLworfSBNRU1ESVNLX1BBQ0tFRF9QT1NURklYOworCisvKiBSZXF1aXJlbWVudCBmb3Igc3RydWN0IGVkZDRfY2RfcGt0ICovCisjaW5jbHVkZSAiLi4vbWVtZGlzay9lbHRvcml0by5oIgorCisvKiBPZmZpY2lhbCBNRU1ESVNLIEluZm8gc3RydWN0dXJlICgiTURJIikgKi8KK01FTURJU0tfUEFDS0VEX1BSRUZJWAorc3RydWN0IG1kaSB7CisgICAgY29uc3QgdWludDE2X3QgYnl0ZXM7CisgICAgY29uc3QgdWludDhfdCB2ZXJzaW9uX21pbm9yOworICAgIGNvbnN0IHVpbnQ4X3QgdmVyc2lvbl9tYWpvcjsKKworICAgIHVpbnQzMl90IGRpc2tidWY7CisgICAgdWludDMyX3QgZGlza3NpemU7CisgICAgcmVhbF9hZGRyX3QgY21kbGluZTsKKworICAgIHJlYWxfYWRkcl90IG9sZGludDEzOworICAgIHJlYWxfYWRkcl90IG9sZGludDE1OworCisgICAgdWludDE2X3Qgb2xkZG9zbWVtOworICAgIHVpbnQ4X3QgYm9vdGxvYWRlcmlkOworICAgIHVpbnQ4X3Qgc2VjdG9yX3NoaWZ0OworCisgICAgdWludDE2X3QgZHB0X3B0cjsKK30gTUVNRElTS19QQUNLRURfUE9TVEZJWDsKKworLyogUmVxdWlyZW1lbnQgZm9yIHN0cnVjdCBhY3BpX2Rlc2NyaXB0aW9uX2hlYWRlciAqLworI2luY2x1ZGUgIi4uL21lbWRpc2svYWNwaS5oIgorCitNRU1ESVNLX1BBQ0tFRF9QUkVGSVgKK3N0cnVjdCBtQkZUIHsKKyAgICBzdHJ1Y3QgYWNwaV9kZXNjcmlwdGlvbl9oZWFkZXIgYWNwaTsKKyAgICB1aW50MzJfdCBzYWZlX2hvb2s7CQkvKiAiU2FmZSBob29rIiBwaHlzaWNhbCBhZGRyZXNzICovCisgICAgc3RydWN0IG1kaSBtZGk7Cit9IE1FTURJU0tfUEFDS0VEX1BPU1RGSVg7CisKKy8qIFRoZSBEaXNrIFBhcmFtZXRlciBUYWJsZSBtYXkgYmUgcmVxdWlyZWQgKi8KK3R5cGVkZWYgdW5pb24geworICAgIHN0cnVjdCBoZF9kcHQgeworCXVpbnQxNl90IG1heF9jeWw7CS8qIE1heCBjeWxpbmRlciAqLworCXVpbnQ4X3QgbWF4X2hlYWQ7CS8qIE1heCBoZWFkICovCisJdWludDhfdCBqdW5rMVs1XTsJLyogT2Jzb2xldGUganVuaywgbGVhdmUgYXQgemVybyAqLworCXVpbnQ4X3QgY3RybDsJCS8qIENvbnRyb2wgYnl0ZSAqLworCXVpbnQ4X3QganVuazJbN107CS8qIE1vcmUgb2Jzb2xldGUganVuayAqLworICAgIH0gaGQ7CisgICAgc3RydWN0IGZkX2RwdCB7CisJdWludDhfdCBzcGVjaWZ5MTsJLyogIkZpcnN0IHNwZWNpZnkgYnl0ZSIgKi8KKwl1aW50OF90IHNwZWNpZnkyOwkvKiAiU2Vjb25kIHNwZWNpZnkgYnl0ZSIgKi8KKwl1aW50OF90IGRlbGF5OwkJLyogRGVsYXkgdW50aWwgbW90b3IgdHVybiBvZmYgKi8KKwl1aW50OF90IGJwczsJCS8qIEJ5dGVzL3NlY3RvciAoMDJoID0gNTEyKSAqLworCisJdWludDhfdCBzZWN0b3JzOwkvKiBTZWN0b3JzL3RyYWNrICovCisJdWludDhfdCBpc2dhcDsJCS8qIExlbmd0aCBvZiBpbnRlcnNlY3RvciBnYXAgKi8KKwl1aW50OF90IGRsZW47CQkvKiBEYXRhIGxlbmd0aCAoMEZGaCkgKi8KKwl1aW50OF90IGZnYXA7CQkvKiBGb3JtYXR0aW5nIGdhcCAqLworCisJdWludDhfdCBmZmlsbDsJCS8qIEZvcm1hdCBmaWxsIGJ5dGUgKi8KKwl1aW50OF90IHNldHRsZTsJCS8qIEhlYWQgc2V0dGxlIHRpbWUgKG1zKSAqLworCXVpbnQ4X3QgbXN0YXJ0OwkJLyogTW90b3Igc3RhcnQgdGltZSAqLworCXVpbnQ4X3QgbWF4dHJhY2s7CS8qIE1heGltdW0gdHJhY2sgbnVtYmVyICovCisKKwl1aW50OF90IHJhdGU7CQkvKiBEYXRhIHRyYW5zZmVyIHJhdGUgKi8KKwl1aW50OF90IGNtb3M7CQkvKiBDTU9TIHR5cGUgKi8KKwl1aW50OF90IHBhZFsyXTsKKworCXVpbnQzMl90IG9sZF9mZF9kcHQ7CS8qIEV4dGVuc2lvbjogcG9pbnRlciB0byBvbGQgSU5UIDFFaCAqLworICAgIH0gZmQ7Cit9IGRwdF90OworCitNRU1ESVNLX1BBQ0tFRF9QUkVGSVgKK3N0cnVjdCBwYXRjaF9hcmVhIHsKKyAgICBzdHJ1Y3QgbWRpIG1kaTsKKworICAgIHVpbnQ4X3QgZHJpdmVzaGlmdGxpbWl0OwkvKiBEbyBub3Qgc2hpZnQgZHJpdmVzIGFib3ZlIHRoaXMgcmVnaW9uICovCisgICAgdWludDhfdCBfcGFkMjsJCS8qIFBhZCB0byBEV09SRCAqLworICAgIHVpbnQxNl90IF9wYWQzOwkJLyogUGFkIHRvIFFXT1JEICovCisKKyAgICB1aW50MTZfdCBtZW1pbnQxNTg4OworCisgICAgdWludDE2X3QgY3lsaW5kZXJzOworICAgIHVpbnQxNl90IGhlYWRzOworICAgIHVpbnQzMl90IHNlY3RvcnM7CisKKyAgICB1aW50MzJfdCBtZW0xbWI7CisgICAgdWludDMyX3QgbWVtMTZtYjsKKworICAgIHVpbnQ4X3QgZHJpdmVubzsKKyAgICB1aW50OF90IGRyaXZldHlwZTsKKyAgICB1aW50OF90IGRyaXZlY250OworICAgIHVpbnQ4X3QgY29uZmlnZmxhZ3M7CisKKyNkZWZpbmUgQ09ORklHX1JFQURPTkxZCTB4MDEKKyNkZWZpbmUgQ09ORklHX1JBVwkweDAyCisjZGVmaW5lIENPTkZJR19TQUZFSU5UCTB4MDQKKyNkZWZpbmUgQ09ORklHX0JJR1JBVwkweDA4CS8qIE1VU1QgYmUgOCEgKi8KKyNkZWZpbmUgQ09ORklHX01PREVNQVNLCTB4MGUKKworICAgIHVpbnQxNl90IG15c3RhY2s7CisgICAgdWludDE2X3Qgc3RhdHVzcHRyOworCisgICAgZHB0X3QgZHB0OworICAgIHN0cnVjdCBlZGRfZHB0IGVkZF9kcHQ7CisgICAgc3RydWN0IGVkZDRfY2RfcGt0IGNkX3BrdDsJLyogT25seSByZWFsbHkgaW4gYSBtZW1kaXNrX2lzb18qIGhvb2sgKi8KK30gTUVNRElTS19QQUNLRURfUE9TVEZJWDsKZGlmZiAtLWdpdCBhL21lbWRpc2svcG9zdHByb2Nlc3MucGwgYi9tZW1kaXNrL3Bvc3Rwcm9jZXNzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZjZGE0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL3Bvc3Rwcm9jZXNzLnBsCkBAIC0wLDAgKzEsNTggQEAKKyMhL3Vzci9iaW4vcGVybAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAxLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIworIyBQb3N0cHJvY2VzcyB0aGUgbWVtZGlzayBiaW5hcnkuICBVc2VkIGR1cmluZyB0aGUgJ21ha2UnIHByb2Nlc3MuCisjIFdlIHdyaXRlIG1lbWRpc2sxNi5iaW4gb3V0IHRvIHRoZSBmaW5hbCBtZW1kaXNrIGtlcm5lbCwgcGFkIGl0IHRvIGFuCisjIGludGVncmFsIDUxMi1ieXRlIHNlY3RvciBsZW5ndGgsIHdyaXRlIHRoaXMgbnVtYmVyIG9mIHNlY3RvcnMgaW50byB0aGUKKyMga2VybmVsIGhlYWRlciBmaWVsZCAic2V0dXBfc2VjdHMiLCB0aGVuIGFwcGVuZCBtZW1kaXNrMzIuYmluCisKK2V2YWwgeyB1c2UgYnl0ZXM7IH07CisKKygkb3V0LCRmaWxlMTYsJGZpbGUzMikgPSBAQVJHVjsKKworb3BlbihPVVQsICI+ICRvdXRcMCIpIG9yIGRpZSAiJDA6IENhbm5vdCBjcmVhdGUgZmlsZTogJG91dFxuIjsKK2V2YWwgeyBiaW5tb2RlIE9VVDsgfTsKK29wZW4oRklMRSwgIjwgJGZpbGUxNlwwIikgb3IgZGllICIkMDogQ2Fubm90IG9wZW4gZmlsZTogJGZpbGUxNlxuIjsKK2V2YWwgeyBiaW5tb2RlIEZJTEUgfTsKKworQGluZm8gPSBzdGF0KEZJTEUpOworJHNpemUgPSAkaW5mb1s3XTsKKworJHNlY3RvcnMgPSAoJHNpemUgKyA1MTEpID4+IDk7CiskeHNpemUgPSAkc2VjdG9ycyA8PCA5OworCityZWFkKEZJTEUsICRmMTYsICRzaXplKTsKKworcHJpbnQgT1VUICRmMTY7CisKK2lmICggJHNpemUgIT0gJHhzaXplICkgeworICAgICMgUGFkIHRvIGEgc2VjdG9yIGJvdW5kYXJ5CisgICAgcHJpbnQgT1VUICJcMCIgeCAoJHhzaXplLSRzaXplKTsKK30KKworc2VlayhPVVQsIDB4MWYxLCBTRUVLX1NFVCk7CSMgc2V0dXBfc2VjdHMKKyMgQWxsIHNlY3RvcnMgYXJlIHNldHVwIGV4Y2VwdCB0aGUgZmlyc3QKK3ByaW50IE9VVCBwYWNrKCJDIiwgJHNlY3RvcnMtMSk7CisKK3NlZWsoT1VULCAkeHNpemUsIFNFRUtfU0VUKTsKK2Nsb3NlKEZJTEUpOworCitvcGVuKEZJTEUsICIrPCAkZmlsZTMyXDAiKSBvciBkaWUgIiQwOiBDYW5ub3Qgb3BlbiBmaWxlOiAkZmlsZTMyXG4iOworCit3aGlsZSAoICgkbiA9IHJlYWQoRklMRSwgJGYzMiwgNjU1MzYpKSA+IDAgKSB7CisgICAgcHJpbnQgT1VUICRmMzI7Cit9CisKK2Nsb3NlKEZJTEUpOworY2xvc2UoT1VUKTsKZGlmZiAtLWdpdCBhL21lbWRpc2svc2V0dXAuYyBiL21lbWRpc2svc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJkYjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay9zZXR1cC5jCkBAIC0wLDAgKzEsMTIzNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDEtMjAwOSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICogICBQb3J0aW9ucyBjb3B5cmlnaHQgMjAwOS0yMDEwIFNoYW8gTWlsbGVyCisgKgkJCQkgIFtFbCBUb3JpdG8gY29kZSwgbUJGVCwgInNhZmUgaG9vayJdCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1pbm1heC5oPgorI2luY2x1ZGUgPHN1ZmZpeF9udW1iZXIuaD4KKyNpbmNsdWRlICJiZGEuaCIKKyNpbmNsdWRlICJkc2twcm9iZS5oIgorI2luY2x1ZGUgImU4MjAuaCIKKyNpbmNsdWRlICJjb25pby5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJtZW1kaXNrLmgiCisjaW5jbHVkZSA8dmVyc2lvbi5oPgorCitjb25zdCBjaGFyIG1lbWRpc2tfdmVyc2lvbltdID0gIk1FTURJU0sgIiBWRVJTSU9OX1NUUiAiICIgREFURTsKK2NvbnN0IGNoYXIgY29weXJpZ2h0W10gPQorICAgICJDb3B5cmlnaHQgIiBGSVJTVFlFQVIgIi0iIFlFQVJfU1RSICIgSC4gUGV0ZXIgQW52aW4gZXQgYWwiOworCitleHRlcm4gY29uc3QgY2hhciBfYmluYXJ5X21lbWRpc2tfY2hzXzUxMl9iaW5fc3RhcnRbXTsKK2V4dGVybiBjb25zdCBjaGFyIF9iaW5hcnlfbWVtZGlza19jaHNfNTEyX2Jpbl9lbmRbXTsKK2V4dGVybiBjb25zdCBjaGFyIF9iaW5hcnlfbWVtZGlza19jaHNfNTEyX2Jpbl9zaXplW107CitleHRlcm4gY29uc3QgY2hhciBfYmluYXJ5X21lbWRpc2tfZWRkXzUxMl9iaW5fc3RhcnRbXTsKK2V4dGVybiBjb25zdCBjaGFyIF9iaW5hcnlfbWVtZGlza19lZGRfNTEyX2Jpbl9lbmRbXTsKK2V4dGVybiBjb25zdCBjaGFyIF9iaW5hcnlfbWVtZGlza19lZGRfNTEyX2Jpbl9zaXplW107CitleHRlcm4gY29uc3QgY2hhciBfYmluYXJ5X21lbWRpc2tfaXNvXzUxMl9iaW5fc3RhcnRbXTsKK2V4dGVybiBjb25zdCBjaGFyIF9iaW5hcnlfbWVtZGlza19pc29fNTEyX2Jpbl9lbmRbXTsKK2V4dGVybiBjb25zdCBjaGFyIF9iaW5hcnlfbWVtZGlza19pc29fNTEyX2Jpbl9zaXplW107CitleHRlcm4gY29uc3QgY2hhciBfYmluYXJ5X21lbWRpc2tfaXNvXzIwNDhfYmluX3N0YXJ0W107CitleHRlcm4gY29uc3QgY2hhciBfYmluYXJ5X21lbWRpc2tfaXNvXzIwNDhfYmluX2VuZFtdOworZXh0ZXJuIGNvbnN0IGNoYXIgX2JpbmFyeV9tZW1kaXNrX2lzb18yMDQ4X2Jpbl9zaXplW107CisKKy8qIFB1bGwgaW4gc3RydWN0dXJlcyBjb21tb24gdG8gTUVNRElTSyBhbmQgTURJU0tDSEsuQ09NICovCisjaW5jbHVkZSAibXN0cnVjdHMuaCIKKworLyogQW4gRUREIGRpc2sgcGFja2V0ICovCitzdHJ1Y3QgZWRkX2Rza19wa3QgeworICAgIHVpbnQ4X3Qgc2l6ZTsJCS8qIFBhY2tldCBzaXplICAgICAgICAqLworICAgIHVpbnQ4X3QgcmVzMTsJCS8qIFJlc2VydmVkICAgICAgICAgICAqLworICAgIHVpbnQxNl90IGNvdW50OwkJLyogQ291bnQgdG8gdHJhbnNmZXIgICovCisgICAgdWludDMyX3QgYnVmOwkJLyogQnVmZmVyIHBvaW50ZXIgICAgICovCisgICAgdWludDY0X3Qgc3RhcnQ7CQkvKiBMQkEgdG8gc3RhcnQgZnJvbSAgKi8KKyAgICB1aW50NjRfdCBidWY2NDsJCS8qIDY0LWJpdCBidWYgcG9pbnRlciAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIENoYW5nZSB0byAxIGZvciBFbCBUb3JpdG8gZGVidWdnaW5nICovCisjZGVmaW5lIERCR19FTFRPUklUTyAwCisKKyNpZiBEQkdfRUxUT1JJVE8KK2V4dGVybiB2b2lkIGVsdG9yaXRvX2R1bXAodWludDMyX3QpOworI2VuZGlmCisKKy8qCisgKiBSb3V0aW5lIHRvIHNlZWsgZm9yIGEgY29tbWFuZC1saW5lIGl0ZW0gYW5kIHJldHVybiBhIHBvaW50ZXIKKyAqIHRvIHRoZSBkYXRhIHBvcnRpb24sIGlmIHByZXNlbnQKKyAqLworCisvKiBNYWdpYyByZXR1cm4gdmFsdWVzICovCisjZGVmaW5lIENNRF9OT1RGT1VORCAgICgoY2hhciAqKS0xKQkvKiBOb3QgZm91bmQgKi8KKyNkZWZpbmUgQ01EX0JPT0wgICAgICAgKChjaGFyICopLTIpCS8qIEZvdW5kIGJvb2xlYW4gb3B0aW9uICovCisjZGVmaW5lIENNRF9IQVNEQVRBKFgpICgoaW50KShYKSA+PSAwKQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0Y21kaXRlbShjb25zdCBjaGFyICp3aGF0KQoreworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgY29uc3QgY2hhciAqd3AgPSB3aGF0OworICAgIGludCBtYXRjaCA9IDA7CisKKyAgICBmb3IgKHAgPSBzaGRyLT5jbWRsaW5lOyAqcDsgcCsrKSB7CisJc3dpdGNoIChtYXRjaCkgeworCWNhc2UgMDoJCS8qIEdyb3VuZCBzdGF0ZSAqLworCSAgICBpZiAoKnAgPT0gJyAnKQorCQlicmVhazsKKworCSAgICB3cCA9IHdoYXQ7CisJICAgIG1hdGNoID0gMTsKKwkgICAgLyogRmFsbCB0aHJvdWdoICovCisKKwljYXNlIDE6CQkvKiBNYXRjaGluZyAqLworCSAgICBpZiAoKndwID09ICdcMCcpIHsKKwkJaWYgKCpwID09ICc9JykKKwkJICAgIHJldHVybiBwICsgMTsKKwkJZWxzZSBpZiAoKnAgPT0gJyAnKQorCQkgICAgcmV0dXJuIENNRF9CT09MOworCQllbHNlIHsKKwkJICAgIG1hdGNoID0gMjsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgaWYgKCpwICE9ICp3cCsrKQorCQltYXRjaCA9IDI7CisJICAgIGJyZWFrOworCisJY2FzZSAyOgkJLyogTWlzbWF0Y2gsIHNraXAgcmVzdCBvZiBvcHRpb24gKi8KKwkgICAgaWYgKCpwID09ICcgJykKKwkJbWF0Y2ggPSAwOwkvKiBOZXh0IG9wdGlvbiAqLworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIG1hdGNoaW5nIHN0cmluZyBhdCBlbmQgb2YgbGluZSAqLworICAgIGlmIChtYXRjaCA9PSAxICYmICp3cCA9PSAnXDAnKQorCXJldHVybiBDTURfQk9PTDsKKworICAgIHJldHVybiBDTURfTk9URk9VTkQ7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIGd6aXAgaW1hZ2UKKyAqLworI2RlZmluZSBVTlpJUF9BTElHTiA1MTIKKworZXh0ZXJuIGNvbnN0IGNoYXIgX2VuZFtdOwkJLyogU3ltYm9sIHNpZ25hbGxpbmcgZW5kIG9mIGRhdGEgKi8KKwordm9pZCB1bnppcF9pZl9uZWVkZWQodWludDMyX3QgKiB3aGVyZV9wLCB1aW50MzJfdCAqIHNpemVfcCkKK3sKKyAgICB1aW50MzJfdCB3aGVyZSA9ICp3aGVyZV9wOworICAgIHVpbnQzMl90IHNpemUgPSAqc2l6ZV9wOworICAgIHVpbnQzMl90IHpieXRlczsKKyAgICB1aW50MzJfdCBzdGFydHJhbmdlLCBlbmRyYW5nZTsKKyAgICB1aW50MzJfdCBnemRhdGFzaXplLCBnendoZXJlOworICAgIHVpbnQzMl90IG9yaWdfY3JjLCBvZmZzZXQ7CisgICAgdWludDMyX3QgdGFyZ2V0ID0gMDsKKyAgICBpbnQgaSwgb2ttZW07CisKKyAgICAvKiBJcyBpdCBhIGd6aXAgaW1hZ2U/ICovCisgICAgaWYgKGNoZWNrX3ppcCgodm9pZCAqKXdoZXJlLCBzaXplLCAmemJ5dGVzLCAmZ3pkYXRhc2l6ZSwKKwkJICAmb3JpZ19jcmMsICZvZmZzZXQpID09IDApIHsKKworCWlmIChvZmZzZXQgKyB6Ynl0ZXMgPiBzaXplKSB7CisJICAgIC8qCisJICAgICAqIEFzc2VydGlvbiBmYWlsdXJlOyBjaGVja196aXAgaXMgc3VwcG9zZWQgdG8gZ3VhcmFudGVlIHRoaXMKKwkgICAgICogbmV2ZXIgaGFwcGVucy4KKwkgICAgICovCisJICAgIGRpZSgiaW50ZXJuYWwgZXJyb3I6IGNoZWNrX3ppcCByZXR1cm5lZCBub25zZW5zZVxuIik7CisJfQorCisJLyoKKwkgKiBGaW5kIGEgZ29vZCBwbGFjZSB0byBwdXQgaXQ6IHNlYXJjaCBtZW1vcnkgcmFuZ2VzIGluIGRlc2NlbmRpbmcKKwkgKiBvcmRlciB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGlzIGxlZ2FsIGFuZCBmaXRzCisJICovCisJb2ttZW0gPSAwOworCWZvciAoaSA9IG5yYW5nZXMgLSAxOyBpID49IDA7IGktLSkgeworCSAgICAvKgorCSAgICAgKiBXZSBjYW4ndCB1c2UgPiA0RyBtZW1vcnkgKDMyIGJpdHMgb25seS4pICBUcnVuY2F0ZSB0byAyXjMyLTEKKwkgICAgICogc28gd2UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggZnVubnkgd3JhcGFyb3VuZCBpc3N1ZXMuCisJICAgICAqLworCisJICAgIC8qIE11c3QgYmUgbWVtb3J5ICovCisJICAgIGlmIChyYW5nZXNbaV0udHlwZSAhPSAxKQorCQljb250aW51ZTsKKworCSAgICAvKiBSYW5nZSBzdGFydCAqLworCSAgICBpZiAocmFuZ2VzW2ldLnN0YXJ0ID49IDB4RkZGRkZGRkYpCisJCWNvbnRpbnVlOworCisJICAgIHN0YXJ0cmFuZ2UgPSAodWludDMyX3QpIHJhbmdlc1tpXS5zdGFydDsKKworCSAgICAvKiBSYW5nZSBlbmQgKDAgZm9yIGVuZCBtZWFucyAyXjY0KSAqLworCSAgICBlbmRyYW5nZSA9ICgocmFuZ2VzW2kgKyAxXS5zdGFydCA+PSAweEZGRkZGRkZGIHx8CisJCQkgcmFuZ2VzW2kgKyAxXS5zdGFydCA9PSAwKQorCQkJPyAweEZGRkZGRkZGIDogKHVpbnQzMl90KSByYW5nZXNbaSArIDFdLnN0YXJ0KTsKKworCSAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIG91cnNlbHZlcyAqLworCSAgICBpZiAoc3RhcnRyYW5nZSA8ICh1aW50MzJfdCkgX2VuZCkKKwkJc3RhcnRyYW5nZSA9ICh1aW50MzJfdCkgX2VuZDsKKworCSAgICAvKiBBbGxvdyBmb3IgYWxpZ25tZW50ICovCisJICAgIHN0YXJ0cmFuZ2UgPQorCQkocmFuZ2VzW2ldLnN0YXJ0ICsgKFVOWklQX0FMSUdOIC0gMSkpICYgfihVTlpJUF9BTElHTiAtIDEpOworCisJICAgIC8qIEluIGNhc2Ugd2UganVzdCBraWxsZWQgdGhlIHdob2xlIHJhbmdlLi4uICovCisJICAgIGlmIChzdGFydHJhbmdlID49IGVuZHJhbmdlKQorCQljb250aW51ZTsKKworCSAgICAvKgorCSAgICAgKiBNdXN0IGJlIGxhcmdlIGVub3VnaC4uLiBkb24ndCByZWx5IG9uIGd6d2hlcmUgZm9yIHRoaXMKKwkgICAgICogKHdyYXBhcm91bmQpCisJICAgICAqLworCSAgICBpZiAoZW5kcmFuZ2UgLSBzdGFydHJhbmdlIDwgZ3pkYXRhc2l6ZSkKKwkJY29udGludWU7CisKKwkgICAgLyoKKwkgICAgICogVGhpcyBpcyB3aGVyZSB0aGUgZ3ogaW1hZ2Ugd291bGQgYmUgcHV0IGlmIHdlIHB1dCBpdCBpbiB0aGlzCisJICAgICAqIHJhbmdlLi4uCisJICAgICAqLworCSAgICBnendoZXJlID0gKGVuZHJhbmdlIC0gZ3pkYXRhc2l6ZSkgJiB+KFVOWklQX0FMSUdOIC0gMSk7CisKKwkgICAgLyogQ2FzdCB0byB1aW50NjRfdCBqdXN0IGluIGNhc2Ugd2UncmUgZmx1c2ggd2l0aCB0aGUgdG9wIGJ5dGUgKi8KKwkgICAgaWYgKCh1aW50NjRfdCkgd2hlcmUgKyBzaXplID49IGd6d2hlcmUgJiYgd2hlcmUgPCBlbmRyYW5nZSkgeworCQkvKgorCQkgKiBOZWVkIHRvIG1vdmUgc291cmNlIGRhdGEgdG8gYXZvaWQgY29tcHJlc3NlZC91bmNvbXByZXNzZWQKKwkJICogb3ZlcmxhcAorCQkgKi8KKwkJdWludDMyX3QgbmV3d2hlcmU7CisKKwkJaWYgKGd6d2hlcmUgLSBzdGFydHJhbmdlIDwgc2l6ZSkKKwkJICAgIGNvbnRpbnVlOwkvKiBDYW4ndCBmaXQgYm90aCBvbGQgYW5kIG5ldyAqLworCisJCW5ld3doZXJlID0gKGd6d2hlcmUgLSBzaXplKSAmIH4oVU5aSVBfQUxJR04gLSAxKTsKKwkJcHJpbnRmKCJNb3ZpbmcgY29tcHJlc3NlZCBkYXRhIGZyb20gMHglMDh4IHRvIDB4JTA4eFxuIiwKKwkJICAgICAgIHdoZXJlLCBuZXd3aGVyZSk7CisKKwkJbWVtbW92ZSgodm9pZCAqKW5ld3doZXJlLCAodm9pZCAqKXdoZXJlLCBzaXplKTsKKwkJd2hlcmUgPSBuZXd3aGVyZTsKKwkgICAgfQorCisJICAgIHRhcmdldCA9IGd6d2hlcmU7CisJICAgIG9rbWVtID0gMTsKKwkgICAgYnJlYWs7CisJfQorCisJaWYgKCFva21lbSkKKwkgICAgZGllKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvbXByZXNzIGltYWdlIChuZWVkIDB4JTA4eCBieXRlcylcbiIsCisJCWd6ZGF0YXNpemUpOworCisJcHJpbnRmKCJnemlwIGltYWdlOiBkZWNvbXByZXNzZWQgYWRkciAweCUwOHgsIGxlbiAweCUwOHg6ICIsCisJICAgICAgIHRhcmdldCwgZ3pkYXRhc2l6ZSk7CisKKwkqc2l6ZV9wID0gZ3pkYXRhc2l6ZTsKKwkqd2hlcmVfcCA9ICh1aW50MzJfdCkgdW56aXAoKHZvaWQgKikod2hlcmUgKyBvZmZzZXQpLCB6Ynl0ZXMsCisJCQkJICAgIGd6ZGF0YXNpemUsIG9yaWdfY3JjLCAodm9pZCAqKXRhcmdldCk7CisgICAgfQorfQorCisvKgorICogRmlndXJlIG91dCB0aGUgImdlb21ldHJ5IiBvZiB0aGUgZGlzayBpbiBxdWVzdGlvbgorICovCitzdHJ1Y3QgZ2VvbWV0cnkgeworICAgIHVpbnQzMl90IHNlY3RvcnM7CQkvKiBTZWN0b3IgY291bnQgKi8KKyAgICB1aW50MzJfdCBjLCBoLCBzOwkJLyogQy9IL1MgZ2VvbWV0cnkgKi8KKyAgICB1aW50MzJfdCBvZmZzZXQ7CQkvKiBCeXRlIG9mZnNldCBmb3IgZGlzayAqLworICAgIHVpbnQzMl90IGJvb3RfbGJhOwkJLyogTEJBIG9mIGJvb3RzdHJhcCBjb2RlICovCisgICAgdWludDhfdCB0eXBlOwkJLyogVHlwZSBieXRlIGZvciBJTlQgMTNoIEFIPTA4aCAqLworICAgIHVpbnQ4X3QgZHJpdmVubzsJCS8qIERyaXZlIG5vICovCisgICAgdWludDhfdCBzZWN0b3Jfc2hpZnQ7CS8qIFNlY3RvciBzaXplIGFzIGEgcG93ZXIgb2YgMiAqLworICAgIGNvbnN0IGNoYXIgKmhzcmMsICpzc3JjOwkvKiBPcmlnaW5zIG9mIEggYW5kIFMgZ2VvbWV0cmllcyAqLworfTsKKworLyogRm9ybWF0IG9mIGEgRE9TIHBhcnRpdGlvbiB0YWJsZSBlbnRyeSAqLworc3RydWN0IHB0YWJfZW50cnkgeworICAgIHVpbnQ4X3QgYWN0aXZlOworICAgIHVpbnQ4X3Qgc3RhcnRfaCwgc3RhcnRfcywgc3RhcnRfYzsKKyAgICB1aW50OF90IHR5cGU7CisgICAgdWludDhfdCBlbmRfaCwgZW5kX3MsIGVuZF9jOworICAgIHVpbnQzMl90IHN0YXJ0OworICAgIHVpbnQzMl90IHNpemU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRm9ybWF0IG9mIGEgRkFUIGZpbGVzeXN0ZW0gc3VwZXJibG9jayAqLworc3RydWN0IGZhdF9leHRyYSB7CisgICAgdWludDhfdCBic19kcnZudW07CisgICAgdWludDhfdCBic19yZXN2MTsKKyAgICB1aW50OF90IGJzX2Jvb3RzaWc7CisgICAgdWludDMyX3QgYnNfdm9saWQ7CisgICAgY2hhciBic192b2xsYWJbMTFdOworICAgIGNoYXIgYnNfZmlsc3lzdHlwZVs4XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworc3RydWN0IGZhdF9zdXBlciB7CisgICAgdWludDhfdCBic19qbXBib290WzNdOworICAgIGNoYXIgYnNfb2VtbmFtZVs4XTsKKyAgICB1aW50MTZfdCBicGJfYnl0c3BlcnNlYzsKKyAgICB1aW50OF90IGJwYl9zZWNwZXJjbHVzOworICAgIHVpbnQxNl90IGJwYl9yc3Zkc2VjY250OworICAgIHVpbnQ4X3QgYnBiX251bWZhdHM7CisgICAgdWludDE2X3QgYnBiX3Jvb3RlbnRjbnQ7CisgICAgdWludDE2X3QgYnBiX3RvdHNlYzE2OworICAgIHVpbnQ4X3QgYnBiX21lZGlhOworICAgIHVpbnQxNl90IGJwYl9mYXRzejE2OworICAgIHVpbnQxNl90IGJwYl9zZWNwZXJ0cms7CisgICAgdWludDE2X3QgYnBiX251bWhlYWRzOworICAgIHVpbnQzMl90IGJwYl9oaWRkc2VjOworICAgIHVpbnQzMl90IGJwYl90b3RzZWMzMjsKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgc3RydWN0IGZhdF9leHRyYSBleHRyYTsKKwl9IGZhdDE2OworCXN0cnVjdCB7CisJICAgIHVpbnQzMl90IGJwYl9mYXRzejMyOworCSAgICB1aW50MTZfdCBicGJfZXh0ZmxhZ3M7CisJICAgIHVpbnQxNl90IGJwYl9mc3ZlcjsKKwkgICAgdWludDMyX3QgYnBiX3Jvb3RjbHVzOworCSAgICB1aW50MTZfdCBicGJfZnNpbmZvOworCSAgICB1aW50MTZfdCBicGJfYmtib290c2VjOworCSAgICBjaGFyIGJwYl9yZXNlcnZlZFsxMl07CisJICAgIC8qIENsZXZlciwgZWg/ICBTYW1lIGZpZWxkcywgZGlmZmVyZW50IG9mZnNldC4uLiAqLworCSAgICBzdHJ1Y3QgZmF0X2V4dHJhIGV4dHJhOworCX0gZmF0MzIgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgIH0geDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGb3JtYXQgb2YgYSBET1NFTVUgaGVhZGVyICovCitzdHJ1Y3QgZG9zZW11X2hlYWRlciB7CisgICAgdWludDhfdCBtYWdpY1s3XTsJCS8qIERPU0VNVVwwICovCisgICAgdWludDMyX3QgaDsKKyAgICB1aW50MzJfdCBzOworICAgIHVpbnQzMl90IGM7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHVpbnQ4X3QgcGFkWzEwNV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBGT1VSKGEsYixjLGQpICgoKGEpIDw8IDI0KXwoKGIpIDw8IDE2KXwoKGMpIDw8IDgpfChkKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnZW9tZXRyeSAqZ2V0X2Rpc2tfaW1hZ2VfZ2VvbWV0cnkodWludDMyX3Qgd2hlcmUsCisJCQkJCQkgICAgICB1aW50MzJfdCBzaXplKQoreworICAgIHN0YXRpYyBzdHJ1Y3QgZ2VvbWV0cnkgaGRfZ2VvbWV0cnk7CisgICAgc3RydWN0IGRvc2VtdV9oZWFkZXIgZG9zZW11OworICAgIHVuc2lnbmVkIGludCBzZWN0b3JzLCB4c2VjdG9ycywgdjsKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICBwcmludGYoImNvbW1hbmQgbGluZTogJXNcbiIsIHNoZHItPmNtZGxpbmUpOworCisgICAgaGRfZ2VvbWV0cnkuc2VjdG9yX3NoaWZ0ID0gOTsJLyogQXNzdW1lIGZsb3BweS9IREQgYXQgZmlyc3QgKi8KKworICAgIG9mZnNldCA9IDA7CisgICAgaWYgKENNRF9IQVNEQVRBKHAgPSBnZXRjbWRpdGVtKCJvZmZzZXQiKSkgJiYgKHYgPSBhdG91KHApKSkKKwlvZmZzZXQgPSB2OworCisgICAgc2VjdG9ycyA9IHhzZWN0b3JzID0gKHNpemUgLSBvZmZzZXQpID4+IGhkX2dlb21ldHJ5LnNlY3Rvcl9zaGlmdDsKKworICAgIGhkX2dlb21ldHJ5LmhzcmMgPSAiZ3Vlc3MiOworICAgIGhkX2dlb21ldHJ5LnNzcmMgPSAiZ3Vlc3MiOworICAgIGhkX2dlb21ldHJ5LnNlY3RvcnMgPSBzZWN0b3JzOworICAgIGhkX2dlb21ldHJ5Lm9mZnNldCA9IG9mZnNldDsKKworICAgIGlmICgocCA9IGdldGNtZGl0ZW0oImlzbyIpKSAhPSBDTURfTk9URk9VTkQpIHsKKyNpZiBEQkdfRUxUT1JJVE8KKwllbHRvcml0b19kdW1wKHdoZXJlKTsKKyNlbmRpZgorCXN0cnVjdCBlZGQ0X2J2ZCAqYnZkID0gKHN0cnVjdCBlZGQ0X2J2ZCAqKSh3aGVyZSArIDE3ICogMjA0OCk7CisJLyogVGlueSBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoKGJ2ZC0+Ym9vdF9yZWNfaW5kICE9IDApIHx8IChidmQtPnZlciAhPSAxKSkKKwkgICAgcHJpbnRmKCJFbCBUb3JpdG8gQlZEIHNhbml0eSBjaGVjayBmYWlsZWQuXG4iKTsKKwlzdHJ1Y3QgZWRkNF9ib290Y2F0ICpib290X2NhdCA9CisJICAgIChzdHJ1Y3QgZWRkNF9ib290Y2F0ICopKHdoZXJlICsgYnZkLT5ib290X2NhdCAqIDIwNDgpOworCS8qIEFub3RoZXIgdGlueSBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoKGJvb3RfY2F0LT52YWxpZGF0aW9uX2VudHJ5LnBsYXRmb3JtX2lkICE9IDApIHx8CisJICAgIChib290X2NhdC0+dmFsaWRhdGlvbl9lbnRyeS5rZXk1NSAhPSAweDU1KSB8fAorCSAgICAoYm9vdF9jYXQtPnZhbGlkYXRpb25fZW50cnkua2V5QUEgIT0gMHhBQSkpCisJICAgIHByaW50ZigiRWwgVG9yaXRvIGJvb3QgY2F0YWxvZyBzYW5pdHkgY2hlY2sgZmFpbGVkLlxuIik7CisJLyogSWYgd2UgaGF2ZSBhbiBlbXVsYXRpb24gbW9kZSwgc2V0IHRoZSBvZmZzZXQgdG8gdGhlIGltYWdlICovCisJaWYgKGJvb3RfY2F0LT5pbml0aWFsX2VudHJ5Lm1lZGlhX3R5cGUpCisJICAgIGhkX2dlb21ldHJ5Lm9mZnNldCArPSBib290X2NhdC0+aW5pdGlhbF9lbnRyeS5sb2FkX2Jsb2NrICogMjA0ODsKKwllbHNlCisJICAgIC8qIFdlJ3JlIGEgbm8tZW11bGF0aW9uIG1vZGUsIHNvIHdlIHdpbGwgYm9vdCB0byBhbiBvZmZzZXQgKi8KKwkgICAgaGRfZ2VvbWV0cnkuYm9vdF9sYmEgPSBib290X2NhdC0+aW5pdGlhbF9lbnRyeS5sb2FkX2Jsb2NrICogNDsKKwlpZiAoYm9vdF9jYXQtPmluaXRpYWxfZW50cnkubWVkaWFfdHlwZSA8IDQpIHsKKwkgICAgLyogV2UncmUgYSBmbG9wcHkgZW11bGF0aW9uIG1vZGUgb3Igb3VyIHBhcmFtcyB3aWxsIGJlCisJICAgICAqIG92ZXJ3cml0dGVuIGJ5IHRoZSBubyBlbXVsYXRpb24gbW9kZSBjYXNlCisJICAgICAqLworCSAgICBoZF9nZW9tZXRyeS5kcml2ZW5vID0gMHgwMDsKKwkgICAgaGRfZ2VvbWV0cnkuYyA9IDgwOworCSAgICBoZF9nZW9tZXRyeS5oID0gMjsKKwl9CisJc3dpdGNoIChib290X2NhdC0+aW5pdGlhbF9lbnRyeS5tZWRpYV90eXBlKSB7CisJY2FzZSAwOgkJLyogTm8gZW11bGF0aW9uICAgKi8KKwkgICAgaGRfZ2VvbWV0cnkuZHJpdmVubyA9IDB4RTA7CisJICAgIGhkX2dlb21ldHJ5LnR5cGUgPSAxMDsJLyogQVRBUEkgcmVtb3ZhYmxlIG1lZGlhIGRldmljZSAqLworCSAgICBoZF9nZW9tZXRyeS5jID0gNjU1MzU7CisJICAgIGhkX2dlb21ldHJ5LmggPSAyNTU7CisJICAgIGhkX2dlb21ldHJ5LnMgPSAxNTsKKwkgICAgLyogMjA0OC1ieXRlIHNlY3RvcnMsIHNvIGFkanVzdCB0aGUgc2l6ZSBhbmQgY291bnQgKi8KKwkgICAgaGRfZ2VvbWV0cnkuc2VjdG9yX3NoaWZ0ID0gMTE7CisJICAgIGJyZWFrOworCWNhc2UgMToJCS8qIDEuMiBNQiBmbG9wcHkgICovCisJICAgIGhkX2dlb21ldHJ5LnMgPSAxNTsKKwkgICAgaGRfZ2VvbWV0cnkudHlwZSA9IDI7CisJICAgIHNlY3RvcnMgPSAyNDAwOworCSAgICBicmVhazsKKwljYXNlIDI6CQkvKiAxLjQ0IE1CIGZsb3BweSAqLworCSAgICBoZF9nZW9tZXRyeS5zID0gMTg7CisJICAgIGhkX2dlb21ldHJ5LnR5cGUgPSA0OworCSAgICBzZWN0b3JzID0gMjg4MDsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgkJLyogMi44OCBNQiBmbG9wcHkgKi8KKwkgICAgaGRfZ2VvbWV0cnkucyA9IDM2OworCSAgICBoZF9nZW9tZXRyeS50eXBlID0gNjsKKwkgICAgc2VjdG9ycyA9IDU3NjA7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgaGRfZ2VvbWV0cnkuZHJpdmVubyA9IDB4ODA7CisJICAgIGhkX2dlb21ldHJ5LnR5cGUgPSAwOworCSAgICBicmVhazsKKwl9CisJc2VjdG9ycyA9IChzaXplIC0gaGRfZ2VvbWV0cnkub2Zmc2V0KSA+PiBoZF9nZW9tZXRyeS5zZWN0b3Jfc2hpZnQ7CisKKwkvKiBGb3IgSEREIGVtdWxhdGlvbiwgd2UgZmlndXJlIG91dCB0aGUgZ2VvbWV0cnkgbGF0ZXIuIE90aGVyd2lzZTogKi8KKwlpZiAoaGRfZ2VvbWV0cnkucykgeworCSAgICBoZF9nZW9tZXRyeS5oc3JjID0gaGRfZ2VvbWV0cnkuc3NyYyA9ICJFbCBUb3JpdG8iOworCX0KKwloZF9nZW9tZXRyeS5zZWN0b3JzID0gc2VjdG9yczsKKyAgICB9CisKKyAgICAvKiBEbyB3ZSBoYXZlIGEgRE9TRU1VIGhlYWRlcj8gKi8KKyAgICBtZW1jcHkoJmRvc2VtdSwgKGNoYXIgKil3aGVyZSArIGhkX2dlb21ldHJ5Lm9mZnNldCwgc2l6ZW9mIGRvc2VtdSk7CisgICAgaWYgKCFtZW1jbXAoIkRPU0VNVSIsIGRvc2VtdS5tYWdpYywgNykpIHsKKwkvKiBBbHdheXMgYSBoYXJkIGRpc2sgdW5sZXNzIG92ZXJydWxlZCBieSBjb21tYW5kLWxpbmUgb3B0aW9ucyAqLworCWhkX2dlb21ldHJ5LmRyaXZlbm8gPSAweDgwOworCWhkX2dlb21ldHJ5LnR5cGUgPSAwOworCWhkX2dlb21ldHJ5LmMgPSBkb3NlbXUuYzsKKwloZF9nZW9tZXRyeS5oID0gZG9zZW11Lmg7CisJaGRfZ2VvbWV0cnkucyA9IGRvc2VtdS5zOworCWhkX2dlb21ldHJ5Lm9mZnNldCArPSBkb3NlbXUub2Zmc2V0OworCXNlY3RvcnMgPSAoc2l6ZSAtIGhkX2dlb21ldHJ5Lm9mZnNldCkgPj4gaGRfZ2VvbWV0cnkuc2VjdG9yX3NoaWZ0OworCisJaGRfZ2VvbWV0cnkuaHNyYyA9IGhkX2dlb21ldHJ5LnNzcmMgPSAiRE9TRU1VIjsKKyAgICB9CisKKyAgICBpZiAoQ01EX0hBU0RBVEEocCA9IGdldGNtZGl0ZW0oImMiKSkgJiYgKHYgPSBhdG91KHApKSkKKwloZF9nZW9tZXRyeS5jID0gdjsKKyAgICBpZiAoQ01EX0hBU0RBVEEocCA9IGdldGNtZGl0ZW0oImgiKSkgJiYgKHYgPSBhdG91KHApKSkgeworCWhkX2dlb21ldHJ5LmggPSB2OworCWhkX2dlb21ldHJ5LmhzcmMgPSAiY21kIjsKKyAgICB9CisgICAgaWYgKENNRF9IQVNEQVRBKHAgPSBnZXRjbWRpdGVtKCJzIikpICYmICh2ID0gYXRvdShwKSkpIHsKKwloZF9nZW9tZXRyeS5zID0gdjsKKwloZF9nZW9tZXRyeS5zc3JjID0gImNtZCI7CisgICAgfQorCisgICAgaWYgKCFoZF9nZW9tZXRyeS5oIHx8ICFoZF9nZW9tZXRyeS5zKSB7CisJaW50IGgsIHMsIG1heF9oLCBtYXhfczsKKworCW1heF9oID0gaGRfZ2VvbWV0cnkuaDsKKwltYXhfcyA9IGhkX2dlb21ldHJ5LnM7CisKKwlpZiAoIShtYXhfaCB8IG1heF9zKSkgeworCSAgICAvKiBMb29rIGZvciBhIEZBVCBzdXBlcmJsb2NrIGFuZCBpZiB3ZSBmaW5kIHNvbWV0aGluZyB0aGF0IGxvb2tzCisJICAgICAgIGVub3VnaCBsaWtlIG9uZSwgdXNlIGdlb21ldHJ5IGZyb20gdGhhdC4gIFRoaXMgdGFrZXMgY2FyZSBvZgorCSAgICAgICBtZWdhZmxvcHB5IGltYWdlcyBhbmQgdW5wYXJ0aXRpb25lZCBoYXJkIGRpc2tzLiAqLworCSAgICBjb25zdCBzdHJ1Y3QgZmF0X2V4dHJhICpleHRyYSA9IE5VTEw7CisJICAgIGNvbnN0IHN0cnVjdCBmYXRfc3VwZXIgKmZzID0gKGNvbnN0IHN0cnVjdCBmYXRfc3VwZXIgKikKKwkJKChjaGFyICopd2hlcmUgKyBoZF9nZW9tZXRyeS5vZmZzZXQpOworCisJICAgIGlmICgoZnMtPmJwYl9tZWRpYSA9PSAweGYwIHx8IGZzLT5icGJfbWVkaWEgPj0gMHhmOCkgJiYKKwkJKGZzLT5ic19qbXBib290WzBdID09IDB4ZTkgfHwgZnMtPmJzX2ptcGJvb3RbMF0gPT0gMHhlYikgJiYKKwkJZnMtPmJwYl9ieXRzcGVyc2VjID09IDUxMiAmJgorCQlmcy0+YnBiX251bWhlYWRzID49IDEgJiYgZnMtPmJwYl9udW1oZWFkcyA8PSAyNTYgJiYKKwkJZnMtPmJwYl9zZWNwZXJ0cmsgPj0gMSAmJiBmcy0+YnBiX3NlY3BlcnRyayA8PSA2MykgeworCQlleHRyYSA9CisJCSAgICBmcy0+YnBiX2ZhdHN6MTYgPyAmZnMtPnguZmF0MTYuZXh0cmEgOiAmZnMtPnguZmF0MzIuZXh0cmE7CisJCWlmICghCisJCSAgICAoZXh0cmEtPmJzX2Jvb3RzaWcgPT0gMHgyOSAmJiBleHRyYS0+YnNfZmlsc3lzdHlwZVswXSA9PSAnRicKKwkJICAgICAmJiBleHRyYS0+YnNfZmlsc3lzdHlwZVsxXSA9PSAnQScKKwkJICAgICAmJiBleHRyYS0+YnNfZmlsc3lzdHlwZVsyXSA9PSAnVCcpKQorCQkgICAgZXh0cmEgPSBOVUxMOworCSAgICB9CisJICAgIGlmIChleHRyYSkgeworCQloZF9nZW9tZXRyeS5kcml2ZW5vID0gZXh0cmEtPmJzX2Rydm51bSAmIDB4ODA7CisJCW1heF9oID0gZnMtPmJwYl9udW1oZWFkczsKKwkJbWF4X3MgPSBmcy0+YnBiX3NlY3BlcnRyazsKKwkJaGRfZ2VvbWV0cnkuaHNyYyA9IGhkX2dlb21ldHJ5LnNzcmMgPSAiRkFUIjsKKwkgICAgfQorCX0KKworCWlmICghKG1heF9oIHwgbWF4X3MpKSB7CisJICAgIC8qIE5vIEZBVCBmaWxlc3lzdGVtIGZvdW5kIHRvIHN0ZWFsIGdlb21ldHJ5IGZyb20uLi4gKi8KKwkgICAgaWYgKChzZWN0b3JzIDwgNDA5NiAqIDIpICYmIChoZF9nZW9tZXRyeS5zZWN0b3Jfc2hpZnQgPT0gOSkpIHsKKwkJaW50IG9rID0gMDsKKwkJdW5zaWduZWQgaW50IHhzZWN0b3JzID0gc2VjdG9yczsKKworCQloZF9nZW9tZXRyeS5kcml2ZW5vID0gMDsJLyogQXNzdW1lIGZsb3BweSAqLworCisJCXdoaWxlICghb2spIHsKKwkJICAgIC8qIEFzc3VtZSBpdCdzIGEgZmxvcHB5IGRyaXZlLCBndWVzcyBhIGdlb21ldHJ5ICovCisJCSAgICB1bnNpZ25lZCBpbnQgdHlwZSwgdHJhY2s7CisJCSAgICBpbnQgYywgaCwgcyA9IDA7CisKKwkJICAgIGlmICh4c2VjdG9ycyA8IDMyMCAqIDIpIHsKKwkJCWMgPSA0MDsKKwkJCWggPSAxOworCQkJdHlwZSA9IDE7CisJCSAgICB9IGVsc2UgaWYgKHhzZWN0b3JzIDwgNjQwICogMikgeworCQkJYyA9IDQwOworCQkJaCA9IDI7CisJCQl0eXBlID0gMTsKKwkJICAgIH0gZWxzZSBpZiAoeHNlY3RvcnMgPCAxMjAwICogMikgeworCQkJYyA9IDgwOworCQkJaCA9IDI7CisJCQl0eXBlID0gMzsKKwkJICAgIH0gZWxzZSBpZiAoeHNlY3RvcnMgPCAxNDQwICogMikgeworCQkJYyA9IDgwOworCQkJaCA9IDI7CisJCQl0eXBlID0gMjsKKwkJICAgIH0gZWxzZSBpZiAoeHNlY3RvcnMgPCAyODgwICogMikgeworCQkJYyA9IDgwOworCQkJaCA9IDI7CisJCQl0eXBlID0gNDsKKwkJICAgIH0gZWxzZSB7CisJCQljID0gODA7CisJCQloID0gMjsKKwkJCXR5cGUgPSA2OworCQkgICAgfQorCQkgICAgdHJhY2sgPSBjICogaDsKKwkJICAgIHdoaWxlIChjIDwgMjU2KSB7CisJCQlzID0geHNlY3RvcnMgLyB0cmFjazsKKwkJCWlmIChzIDwgNjMgJiYgKHhzZWN0b3JzICUgdHJhY2spID09IDApIHsKKwkJCSAgICBvayA9IDE7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQljKys7CisJCQl0cmFjayArPSBoOworCQkgICAgfQorCQkgICAgaWYgKG9rKSB7CisJCQltYXhfaCA9IGg7CisJCQltYXhfcyA9IHM7CisJCQloZF9nZW9tZXRyeS5oc3JjID0gaGRfZ2VvbWV0cnkuc3NyYyA9ICJmZCI7CisJCSAgICB9IGVsc2UgeworCQkJLyogTm8gdmFsaWQgZmxvcHB5IGdlb21ldHJ5LCBmYWtlIGl0IGJ5IHNpbXVsYXRpbmcgYnJva2VuCisJCQkgICBzZWN0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIGltYWdlLi4uICovCisJCQl4c2VjdG9ycysrOworCQkgICAgfQorCisJCSAgICBoZF9nZW9tZXRyeS50eXBlID0gdHlwZTsKKwkJfQorCSAgICB9IGVsc2UgeworCQkvKiBBc3N1bWUgaXQgaXMgYSBoYXJkIGRpc2sgaW1hZ2UgYW5kIHNjYW4gZm9yIGEgcGFydGl0aW9uIHRhYmxlICovCisJCWNvbnN0IHN0cnVjdCBwdGFiX2VudHJ5ICpwdGFiID0gKGNvbnN0IHN0cnVjdCBwdGFiX2VudHJ5ICopCisJCSAgICAoKGNoYXIgKil3aGVyZSArIGhkX2dlb21ldHJ5Lm9mZnNldCArICg1MTIgLSAyIC0gNCAqIDE2KSk7CisKKwkJLyogQXNzdW1lIGhhcmQgZGlzayAqLworCQlpZiAoIWhkX2dlb21ldHJ5LmRyaXZlbm8pCisJCSAgICBoZF9nZW9tZXRyeS5kcml2ZW5vID0gMHg4MDsKKworCQlpZiAoKih1aW50MTZfdCAqKSAoKGNoYXIgKil3aGVyZSArIGhkX2dlb21ldHJ5Lm9mZnNldCArIDUxMiAtIDIpID09IDB4YWE1NSkgeworCQkgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJaWYgKHB0YWJbaV0udHlwZSAmJiAhKHB0YWJbaV0uYWN0aXZlICYgMHg3ZikpIHsKKwkJCSAgICBzID0gKHB0YWJbaV0uc3RhcnRfcyAmIDB4M2YpOworCQkJICAgIGggPSBwdGFiW2ldLnN0YXJ0X2ggKyAxOworCisJCQkgICAgaWYgKG1heF9oIDwgaCkKKwkJCQltYXhfaCA9IGg7CisJCQkgICAgaWYgKG1heF9zIDwgcykKKwkJCQltYXhfcyA9IHM7CisKKwkJCSAgICBzID0gKHB0YWJbaV0uZW5kX3MgJiAweDNmKTsKKwkJCSAgICBoID0gcHRhYltpXS5lbmRfaCArIDE7CisKKwkJCSAgICBpZiAobWF4X2ggPCBoKSB7CisJCQkJbWF4X2ggPSBoOworCQkJCWhkX2dlb21ldHJ5LmhzcmMgPSAiTUJSIjsKKwkJCSAgICB9CisJCQkgICAgaWYgKG1heF9zIDwgcykgeworCQkJCW1heF9zID0gczsKKwkJCQloZF9nZW9tZXRyeS5zc3JjID0gIk1CUiI7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQl9CisKKwkJaGRfZ2VvbWV0cnkudHlwZSA9IDA7CisJICAgIH0KKwl9CisKKwlpZiAoIW1heF9oKQorCSAgICBtYXhfaCA9IHhzZWN0b3JzID4gMjA5NzE1MiA/IDI1NSA6IDY0OworCWlmICghbWF4X3MpCisJICAgIG1heF9zID0geHNlY3RvcnMgPiAyMDk3MTUyID8gNjMgOiAzMjsKKworCWhkX2dlb21ldHJ5LmggICAgPSBtYXhfaDsKKwloZF9nZW9tZXRyeS5zICAgID0gbWF4X3M7CisgICAgfQorCisgICAgaWYgKCFoZF9nZW9tZXRyeS5jKQorCWhkX2dlb21ldHJ5LmMgPSB4c2VjdG9ycyAvIChoZF9nZW9tZXRyeS5oICogaGRfZ2VvbWV0cnkucyk7CisKKyAgICBpZiAoKHAgPSBnZXRjbWRpdGVtKCJmbG9wcHkiKSkgIT0gQ01EX05PVEZPVU5EKSB7CisJaGRfZ2VvbWV0cnkuZHJpdmVubyA9IENNRF9IQVNEQVRBKHApID8gYXRvdShwKSAmIDB4N2YgOiAwOworICAgIH0gZWxzZSBpZiAoKHAgPSBnZXRjbWRpdGVtKCJoYXJkZGlzayIpKSAhPSBDTURfTk9URk9VTkQpIHsKKwloZF9nZW9tZXRyeS5kcml2ZW5vID0gQ01EX0hBU0RBVEEocCkgPyBhdG91KHApIHwgMHg4MCA6IDB4ODA7CisgICAgfQorCisgICAgaWYgKGhkX2dlb21ldHJ5LmRyaXZlbm8gJiAweDgwKSB7CisJaGRfZ2VvbWV0cnkudHlwZSA9IDA7CS8qIFR5cGUgPSBoYXJkIGRpc2sgKi8KKyAgICB9IGVsc2UgeworCWlmIChoZF9nZW9tZXRyeS50eXBlID09IDApCisJICAgIGhkX2dlb21ldHJ5LnR5cGUgPSAweDEwOwkvKiBBVEFQSSBmbG9wcHksIGUuZy4gTFMtMTIwICovCisgICAgfQorCisgICAgaWYgKChzaXplIC0gaGRfZ2VvbWV0cnkub2Zmc2V0KSAmIDB4MWZmKSB7CisJcHV0cygiTUVNRElTSzogSW1hZ2UgaGFzIGZyYWN0aW9uYWwgZW5kIHNlY3RvclxuIik7CisgICAgfQorICAgIGlmIChzZWN0b3JzICUgKGhkX2dlb21ldHJ5LmggKiBoZF9nZW9tZXRyeS5zKSkgeworCXB1dHMoIk1FTURJU0s6IEltYWdlIHNlZW1zIHRvIGhhdmUgZnJhY3Rpb25hbCBlbmQgY3lsaW5kZXJcbiIpOworICAgIH0KKyAgICBpZiAoKGhkX2dlb21ldHJ5LmMgKiBoZF9nZW9tZXRyeS5oICogaGRfZ2VvbWV0cnkucykgPiBzZWN0b3JzKSB7CisJcHV0cygiTUVNRElTSzogSW1hZ2UgYXBwZWFycyB0byBiZSB0cnVuY2F0ZWRcbiIpOworICAgIH0KKworICAgIHJldHVybiAmaGRfZ2VvbWV0cnk7Cit9CisKKy8qCisgKiBGaW5kIGEgJFBuUCBpbnN0YWxsYXRpb24gY2hlY2sgc3RydWN0dXJlOyByZXR1cm4gKEVTIDw8IDE2KSArIERJIHZhbHVlCisgKi8KK3N0YXRpYyB1aW50MzJfdCBwbnBfaW5zdGFsbF9jaGVjayh2b2lkKQoreworICAgIHVpbnQzMl90ICpzZWc7CisgICAgdW5zaWduZWQgY2hhciAqcCwgY3N1bTsKKyAgICBpbnQgaSwgbGVuOworCisgICAgZm9yIChzZWcgPSAodWludDMyX3QgKikgMHhmMDAwMDsgc2VnIDwgKHVpbnQzMl90ICopIDB4MTAwMDAwOyBzZWcgKz0gNCkgeworCWlmICgqc2VnID09ICgnJCcgKyAoJ1AnIDw8IDgpICsgKCduJyA8PCAxNikgKyAoJ1AnIDw8IDI0KSkpIHsKKwkgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopc2VnOworCSAgICBsZW4gPSBwWzVdOworCSAgICBpZiAobGVuIDwgMHgyMSkKKwkJY29udGludWU7CisJICAgIGNzdW0gPSAwOworCSAgICBmb3IgKGkgPSBsZW47IGk7IGktLSkKKwkJY3N1bSArPSAqcCsrOworCSAgICBpZiAoY3N1bSAhPSAwKQorCQljb250aW51ZTsKKworCSAgICByZXR1cm4gKDB4ZjAwMCA8PCAxNikgKyAodWludDE2X3QpICh1bnNpZ25lZCBsb25nKXNlZzsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWxvY2F0ZSB0aGUgcmVhbC1tb2RlIGNvZGUgdG8gYSBuZXcgc2VnbWVudAorICovCitzdHJ1Y3QgZ2R0X3B0ciB7CisgICAgdWludDE2X3QgbGltaXQ7CisgICAgdWludDMyX3QgYmFzZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBzZXRfc2VnX2Jhc2UodWludDMyX3QgZ2R0X2Jhc2UsIGludCBzZWcsIHVpbnQzMl90IHYpCit7CisgICAgKih1aW50MTZfdCAqKSAoZ2R0X2Jhc2UgKyBzZWcgKyAyKSA9IHY7CisgICAgKih1aW50OF90ICopIChnZHRfYmFzZSArIHNlZyArIDQpID0gdiA+PiAxNjsKKyAgICAqKHVpbnQ4X3QgKikgKGdkdF9iYXNlICsgc2VnICsgNykgPSB2ID4+IDI0OworfQorCitzdGF0aWMgdm9pZCByZWxvY2F0ZV9ybV9jb2RlKHVpbnQzMl90IG5ld2Jhc2UpCit7CisgICAgdWludDMyX3QgZ2R0X2Jhc2U7CisgICAgdWludDMyX3Qgb2xkYmFzZSA9IHJtX2FyZ3Mucm1fYmFzZTsKKyAgICB1aW50MzJfdCBkZWx0YSA9IG5ld2Jhc2UgLSBvbGRiYXNlOworCisgICAgY2xpKCk7CisgICAgbWVtbW92ZSgodm9pZCAqKW5ld2Jhc2UsICh2b2lkICopb2xkYmFzZSwgcm1fYXJncy5ybV9zaXplKTsKKworICAgIHJtX2FyZ3Mucm1fcmV0dXJuICs9IGRlbHRhOworICAgIHJtX2FyZ3Mucm1faW50Y2FsbCArPSBkZWx0YTsKKyAgICBybV9hcmdzLnJtX2JvdW5jZSArPSBkZWx0YTsKKyAgICBybV9hcmdzLnJtX2Jhc2UgKz0gZGVsdGE7CisgICAgcm1fYXJncy5ybV9nZHQgKz0gZGVsdGE7CisgICAgcm1fYXJncy5ybV9wbWptcCArPSBkZWx0YTsKKyAgICBybV9hcmdzLnJtX3Jtam1wICs9IGRlbHRhOworCisgICAgZ2R0X2Jhc2UgPSBybV9hcmdzLnJtX2dkdDsKKworICAgICoodWludDMyX3QgKikgKGdkdF9iYXNlICsgMikgPSBnZHRfYmFzZTsJLyogR0RUIHNlbGYtcG9pbnRlciAqLworCisgICAgLyogU2VnbWVudHMgMHgxMCBhbmQgMHgxOCBhcmUgcmVhbC1tb2RlLWJhc2VkICovCisgICAgc2V0X3NlZ19iYXNlKGdkdF9iYXNlLCAweDEwLCBybV9hcmdzLnJtX2Jhc2UpOworICAgIHNldF9zZWdfYmFzZShnZHRfYmFzZSwgMHgxOCwgcm1fYXJncy5ybV9iYXNlKTsKKworI2lmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA0CisgICAgYXNtIHZvbGF0aWxlICgibGdkdGwgJTAiOjoibSIgKCooY2hhciAqKWdkdF9iYXNlKSk7CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAorICAgIGFzbSB2b2xhdGlsZSAoImxnZHQgJTAiOjoibSIgKCooY2hhciAqKWdkdF9iYXNlKSk7CisjZWxzZQorI2Vycm9yICJ1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUiCisjZW5kaWYKKworICAgICoodWludDMyX3QgKikgcm1fYXJncy5ybV9wbWptcCArPSBkZWx0YTsKKyAgICAqKHVpbnQxNl90ICopIHJtX2FyZ3Mucm1fcm1qbXAgKz0gZGVsdGEgPj4gNDsKKworICAgIHJtX2FyZ3Mucm1faGFuZGxlX2ludGVycnVwdCArPSBkZWx0YTsKKworICAgIHN0aSgpOworfQorCitzdGF0aWMgdWludDhfdCBjaGVja3N1bV9idWYoY29uc3Qgdm9pZCAqYnVmLCBpbnQgY291bnQpCit7CisgICAgY29uc3QgdWludDhfdCAqcCA9IGJ1ZjsKKyAgICB1aW50OF90IGMgPSAwOworCisgICAgd2hpbGUgKGNvdW50LS0pCisJYyArPSAqcCsrOworCisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbnQgc3RhY2tfbmVlZGVkKHZvaWQpCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBtaW5fc3RhY2sgPSAxMjg7CS8qIE1pbmltdW0gc3RhY2sgc2l6ZSAqLworICBjb25zdCB1bnNpZ25lZCBpbnQgZGVmX3N0YWNrID0gNTEyOwkvKiBEZWZhdWx0IHN0YWNrIHNpemUgKi8KKyAgdW5zaWduZWQgaW50IHYgPSAwOworICBjb25zdCBjaGFyICpwOworCisgIGlmIChDTURfSEFTREFUQShwID0gZ2V0Y21kaXRlbSgic3RhY2siKSkpCisgICAgdiA9IGF0b3UocCk7CisKKyAgaWYgKCF2KQorICAgIHYgPSBkZWZfc3RhY2s7CisKKyAgaWYgKHYgPCBtaW5fc3RhY2spCisgICAgdiA9IG1pbl9zdGFjazsKKworICByZXR1cm4gdjsKK30KKworLyoKKyAqIFNldCBtYXggbWVtb3J5IGJ5IHJlc2VydmF0aW9uCisgKiBBZGRzIHJlc2VydmF0aW9ucyB0byBkYXRhIGluIElOVDE1aCB0byBwcmV2ZW50IGFjY2VzcyB0byB0aGUgdG9wIG9mIFJBTQorICogaWYgdGhlcmUncyBhbnkgYWJvdmUgdGhlIHBvaW50IHNwZWNpZmllZC4KKyAqLwordm9pZCBzZXRtYXhtZW0odW5zaWduZWQgbG9uZyBsb25nIHJlc3RvcF91bGwpCit7CisgICAgdWludDMyX3QgcmVzdG9wOworICAgIHN0cnVjdCBlODIwcmFuZ2UgKmVwOworICAgIGNvbnN0IGludCBpbnQxNXJlc3R5cGUgPSAyOworCisgICAgLyogaW5zZXJ0cmFuZ2UoKSB3b3JrcyBvbiB1aW50MzJfdCAqLworICAgIHJlc3RvcCA9IG1pbihyZXN0b3BfdWxsLCBVSU5UMzJfTUFYKTsKKyAgICAvKiBwcmludGYoIiAgc2V0bWF4bWVtICAnJTA4eCUwOHgnICA9PiAlMDh4XG4iLAorCSh1bnNpZ25lZCBpbnQpKHJlc3RvcF91bGw+PjMyKSwgKHVuc2lnbmVkIGludClyZXN0b3BfdWxsLCByZXN0b3ApOyAqLworCisgICAgZm9yIChlcCA9IHJhbmdlczsgZXAtPnR5cGUgIT0gLTFVOyBlcCsrKSB7CisJaWYgKGVwLT50eXBlID09IDEpIHsJLyogT25seSBpZiBhdmFpbGFibGUgKi8KKwkgICAgaWYgKGVwLT5zdGFydCA+PSByZXN0b3ApIHsKKwkJLyogcHJpbnRmKCIgICUwOHggLT4gMlxuIiwgZXAtPnN0YXJ0KTsgKi8KKwkJZXAtPnR5cGUgPSBpbnQxNXJlc3R5cGU7CisJICAgIH0gZWxzZSBpZiAoZXBbMV0uc3RhcnQgPiByZXN0b3ApIHsKKwkJLyogcHJpbnRmKCIgICslMDh4ID0yOyBjdXQgJTA4eFxuIiwgcmVzdG9wLCBlcC0+c3RhcnQpOyAqLworCQlpbnNlcnRyYW5nZShyZXN0b3AsIChlcFsxXS5zdGFydCAtIHJlc3RvcCksIGludDE1cmVzdHlwZSk7CisJICAgIH0KKwl9CisgICAgfQorICAgIHBhcnNlX21lbSgpOworfQorCitzdHJ1Y3QgcmVhbF9tb2RlX2FyZ3Mgcm1fYXJnczsKKworLyoKKyAqIEFjdHVhbCBzZXR1cCByb3V0aW5lCisgKiBSZXR1cm5zIHRoZSBkcml2ZSBudW1iZXIgKHdoaWNoIGlzIHRoZW4gcGFzc2VkIGluICVkbCB0byB0aGUKKyAqIGNhbGxlZCByb3V0aW5lLikKKyAqLwordm9pZCBzZXR1cChjb25zdCBzdHJ1Y3QgcmVhbF9tb2RlX2FyZ3MgKnJtX2FyZ3NfcHRyKQoreworICAgIHVuc2lnbmVkIGludCBiaW5fc2l6ZTsKKyAgICBjaGFyICptZW1kaXNrX2hvb2s7CisgICAgc3RydWN0IG1lbWRpc2tfaGVhZGVyICpocHRyOworICAgIHN0cnVjdCBwYXRjaF9hcmVhICpwcHRyOworICAgIHN0cnVjdCBtQkZUICptYmZ0OworICAgIHVpbnQxNl90IGRyaXZlcnNlZzsKKyAgICB1aW50MzJfdCBkcml2ZXJwdHIsIGRyaXZlcmFkZHI7CisgICAgdWludDE2X3QgZG9zbWVtX2s7CisgICAgdWludDMyX3Qgc3RkZG9zbWVtOworICAgIGNvbnN0IHN0cnVjdCBnZW9tZXRyeSAqZ2VvbWV0cnk7CisgICAgdW5zaWduZWQgaW50IHRvdGFsX3NpemU7CisgICAgdW5zaWduZWQgaW50IGNtZGxpbmVfbGVuLCBzdGFja19sZW4sIGU4MjBfbGVuOworICAgIGNvbnN0IHN0cnVjdCBlZGQ0X2J2ZCAqYnZkOworICAgIGNvbnN0IHN0cnVjdCBlZGQ0X2Jvb3RjYXQgKmJvb3RfY2F0ID0gMDsKKyAgICBjb20zMnN5c190IHJlZ3M7CisgICAgdWludDMyX3QgcmFtZGlza19pbWFnZSwgcmFtZGlza19zaXplOworICAgIHVpbnQzMl90IGJvb3RfYmFzZSwgcm1fYmFzZTsKKyAgICBpbnQgYmlvc19kcml2ZXM7CisgICAgaW50IGRvX2VkZCA9IDE7CQkvKiAwID0gbm8sIDEgPSB5ZXMsIGRlZmF1bHQgaXMgeWVzICovCisgICAgaW50IGRvX2VsdG9yaXRvID0gMDsJLyogZGVmYXVsdCBpcyBubyAqLworICAgIGludCBub19icHQ7CQkJLyogTm8gdmFsaWQgQlBUIHByZXNlbnRlZCAqLworICAgIHVpbnQzMl90IGJvb3Rfc2VnID0gMDsJLyogTWVhbmluZyAwMDAwOjdDMDAgKi8KKyAgICB1aW50MzJfdCBib290X2xlbiA9IDUxMjsJLyogT25lIHNlY3RvciAqLworICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICAvKiBXZSBuZWVkIHRvIGNvcHkgdGhlIHJtX2FyZ3MgaW50byB0aGVpciBwcm9wZXIgcGxhY2UgKi8KKyAgICBtZW1jcHkoJnJtX2FyZ3MsIHJtX2FyZ3NfcHRyLCBzaXplb2Ygcm1fYXJncyk7CisgICAgc3RpKCk7CQkJLyogLi4uIHRoZW4gaW50ZXJydXB0cyBhcmUgc2FmZSAqLworCisgICAgLyogU2hvdyBzaWducyBvZiBsaWZlICovCisgICAgcHJpbnRmKCIlcyAgJXNcbiIsIG1lbWRpc2tfdmVyc2lvbiwgY29weXJpZ2h0KTsKKworICAgIGlmICghc2hkci0+cmFtZGlza19pbWFnZSB8fCAhc2hkci0+cmFtZGlza19zaXplKQorCWRpZSgiTUVNRElTSzogTm8gcmFtZGlzayBpbWFnZSBzcGVjaWZpZWQhXG4iKTsKKworICAgIHJhbWRpc2tfaW1hZ2UgPSBzaGRyLT5yYW1kaXNrX2ltYWdlOworICAgIHJhbWRpc2tfc2l6ZSA9IHNoZHItPnJhbWRpc2tfc2l6ZTsKKworICAgIGU4MjBtYXBfaW5pdCgpOwkJLyogSW5pdGlhbGl6ZSBtZW1vcnkgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBnZXRfbWVtKCk7CQkJLyogUXVlcnkgQklPUyBmb3IgbWVtb3J5IG1hcCAqLworICAgIHBhcnNlX21lbSgpOwkJLyogUGFyc2UgbWVtb3J5IG1hcCAqLworCisgICAgcHJpbnRmKCJSYW1kaXNrIGF0IDB4JTA4eCwgbGVuZ3RoIDB4JTA4eFxuIiwgcmFtZGlza19pbWFnZSwgcmFtZGlza19zaXplKTsKKworICAgIHVuemlwX2lmX25lZWRlZCgmcmFtZGlza19pbWFnZSwgJnJhbWRpc2tfc2l6ZSk7CisKKyAgICBnZW9tZXRyeSA9IGdldF9kaXNrX2ltYWdlX2dlb21ldHJ5KHJhbWRpc2tfaW1hZ2UsIHJhbWRpc2tfc2l6ZSk7CisKKyAgICBpZiAoZ2V0Y21kaXRlbSgiZWRkIikgIT0gQ01EX05PVEZPVU5EIHx8CisJZ2V0Y21kaXRlbSgiZWJpb3MiKSAhPSBDTURfTk9URk9VTkQpCisJZG9fZWRkID0gMTsKKyAgICBlbHNlIGlmIChnZXRjbWRpdGVtKCJub2VkZCIpICE9IENNRF9OT1RGT1VORCB8fAorCSAgICAgZ2V0Y21kaXRlbSgibm9lYmlvcyIpICE9IENNRF9OT1RGT1VORCB8fAorCSAgICAgZ2V0Y21kaXRlbSgiY2Jpb3MiKSAhPSBDTURfTk9URk9VTkQpCisJZG9fZWRkID0gMDsKKyAgICBlbHNlCisJZG9fZWRkID0gKGdlb21ldHJ5LT5kcml2ZW5vICYgMHg4MCkgPyAxIDogMDsKKworICAgIGlmIChnZXRjbWRpdGVtKCJpc28iKSAhPSBDTURfTk9URk9VTkQpIHsKKwlkb19lbHRvcml0byA9IDE7CisJZG9fZWRkID0gMTsJCS8qIE1hbmRhdG9yeSAqLworICAgIH0KKworICAgIC8qIENob29zZSB0aGUgYXBwcm9wcmlhdGUgaW5zdGFsbGFibGUgbWVtZGlzayBob29rICovCisgICAgaWYgKGRvX2VsdG9yaXRvKSB7CisJaWYgKGdlb21ldHJ5LT5zZWN0b3Jfc2hpZnQgPT0gMTEpIHsKKwkgICAgYmluX3NpemUgPSAoaW50KSZfYmluYXJ5X21lbWRpc2tfaXNvXzIwNDhfYmluX3NpemU7CisJICAgIG1lbWRpc2tfaG9vayA9IChjaGFyICopJl9iaW5hcnlfbWVtZGlza19pc29fMjA0OF9iaW5fc3RhcnQ7CisJfSBlbHNlIHsKKwkgICAgYmluX3NpemUgPSAoaW50KSZfYmluYXJ5X21lbWRpc2tfaXNvXzUxMl9iaW5fc2l6ZTsKKwkgICAgbWVtZGlza19ob29rID0gKGNoYXIgKikmX2JpbmFyeV9tZW1kaXNrX2lzb181MTJfYmluX3N0YXJ0OworCX0KKyAgICB9IGVsc2UgeworCWlmIChkb19lZGQpIHsKKwkgICAgYmluX3NpemUgPSAoaW50KSZfYmluYXJ5X21lbWRpc2tfZWRkXzUxMl9iaW5fc2l6ZTsKKwkgICAgbWVtZGlza19ob29rID0gKGNoYXIgKikmX2JpbmFyeV9tZW1kaXNrX2VkZF81MTJfYmluX3N0YXJ0OworCX0gZWxzZSB7CisJICAgIGJpbl9zaXplID0gKGludCkmX2JpbmFyeV9tZW1kaXNrX2Noc181MTJfYmluX3NpemU7CisJICAgIG1lbWRpc2tfaG9vayA9IChjaGFyICopJl9iaW5hcnlfbWVtZGlza19jaHNfNTEyX2Jpbl9zdGFydDsKKwl9CisgICAgfQorCisgICAgLyogUmVzZXJ2ZSB0aGUgcmFtZGlzayBtZW1vcnkgKi8KKyAgICBpbnNlcnRyYW5nZShyYW1kaXNrX2ltYWdlLCByYW1kaXNrX3NpemUsIDIpOworICAgIHBhcnNlX21lbSgpOwkJLyogUmVjb21wdXRlIHZhcmlhYmxlcyAqLworCisgICAgLyogRmlndXJlIG91dCB3aGVyZSBpdCBuZWVkcyB0byBnbyAqLworICAgIGhwdHIgPSAoc3RydWN0IG1lbWRpc2tfaGVhZGVyICopbWVtZGlza19ob29rOworICAgIHBwdHIgPSAoc3RydWN0IHBhdGNoX2FyZWEgKikobWVtZGlza19ob29rICsgaHB0ci0+cGF0Y2hfb2Zmcyk7CisKKyAgICBkb3NtZW1fayA9IHJkel8xNihCSU9TX0JBU0VNRU0pOworICAgIHBwdHItPm1kaS5vbGRkb3NtZW0gPSBkb3NtZW1fazsKKyAgICBzdGRkb3NtZW0gPSBkb3NtZW1fayA8PCAxMDsKKyAgICAvKiBJZiBJTlQgMTUgRTgyMCBhbmQgSU5UIDEyIGRpc2FncmVlLCBnbyB3aXRoIHRoZSBtb3N0IGNvbnNlcnZhdGl2ZSAqLworICAgIGlmIChzdGRkb3NtZW0gPiBkb3NfbWVtKQorCXN0ZGRvc21lbSA9IGRvc19tZW07CisKKyAgICBwcHRyLT5kcml2ZW5vID0gZ2VvbWV0cnktPmRyaXZlbm87CisgICAgcHB0ci0+ZHJpdmV0eXBlID0gZ2VvbWV0cnktPnR5cGU7CisgICAgcHB0ci0+Y3lsaW5kZXJzID0gZ2VvbWV0cnktPmM7CS8qIFBvc3NpYmxlIHByZWNpc2lvbiBsb3NzICovCisgICAgcHB0ci0+aGVhZHMgPSBnZW9tZXRyeS0+aDsKKyAgICBwcHRyLT5zZWN0b3JzID0gZ2VvbWV0cnktPnM7CisgICAgcHB0ci0+bWRpLmRpc2tzaXplID0gZ2VvbWV0cnktPnNlY3RvcnM7CisgICAgcHB0ci0+bWRpLmRpc2tidWYgPSByYW1kaXNrX2ltYWdlICsgZ2VvbWV0cnktPm9mZnNldDsKKyAgICBwcHRyLT5tZGkuc2VjdG9yX3NoaWZ0ID0gZ2VvbWV0cnktPnNlY3Rvcl9zaGlmdDsKKyAgICBwcHRyLT5zdGF0dXNwdHIgPSAoZ2VvbWV0cnktPmRyaXZlbm8gJiAweDgwKSA/IDB4NDc0IDogMHg0NDE7CisKKyAgICBwcHRyLT5tZGkuYm9vdGxvYWRlcmlkID0gc2hkci0+dHlwZV9vZl9sb2FkZXI7CisKKyAgICBwcHRyLT5jb25maWdmbGFncyA9IENPTkZJR19TQUZFSU5UOwkvKiBEZWZhdWx0ICovCisgICAgLyogU2V0IGNvbmZpZyBmbGFncyAqLworICAgIGlmIChnZXRjbWRpdGVtKCJybyIpICE9IENNRF9OT1RGT1VORCkgeworCXBwdHItPmNvbmZpZ2ZsYWdzIHw9IENPTkZJR19SRUFET05MWTsKKyAgICB9CisgICAgaWYgKGdldGNtZGl0ZW0oInJhdyIpICE9IENNRF9OT1RGT1VORCkgeworCXBwdHItPmNvbmZpZ2ZsYWdzICY9IH5DT05GSUdfTU9ERU1BU0s7CisJcHB0ci0+Y29uZmlnZmxhZ3MgfD0gQ09ORklHX1JBVzsKKyAgICB9CisgICAgaWYgKGdldGNtZGl0ZW0oImJpZ3JhdyIpICE9IENNRF9OT1RGT1VORCkgeworCXBwdHItPmNvbmZpZ2ZsYWdzICY9IH5DT05GSUdfTU9ERU1BU0s7CisJcHB0ci0+Y29uZmlnZmxhZ3MgfD0gQ09ORklHX0JJR1JBVyB8IENPTkZJR19SQVc7CisgICAgfQorICAgIGlmIChnZXRjbWRpdGVtKCJpbnQiKSAhPSBDTURfTk9URk9VTkQpIHsKKwlwcHRyLT5jb25maWdmbGFncyAmPSB+Q09ORklHX01PREVNQVNLOworCS8qIHBwdHItPmNvbmZpZ2ZsYWdzIHw9IDA7ICovCisgICAgfQorICAgIGlmIChnZXRjbWRpdGVtKCJzYWZlaW50IikgIT0gQ01EX05PVEZPVU5EKSB7CisJcHB0ci0+Y29uZmlnZmxhZ3MgJj0gfkNPTkZJR19NT0RFTUFTSzsKKwlwcHRyLT5jb25maWdmbGFncyB8PSBDT05GSUdfU0FGRUlOVDsKKyAgICB9CisKKyAgICBwcmludGYoIkRpc2sgaXMgJXMlZCwgJXUlcyBLLCBDL0gvUyA9ICV1LyV1LyV1ICglcy8lcyksIEVERCAlcywgJXNcbiIsCisJICAgKGdlb21ldHJ5LT5kcml2ZW5vICYgMHg4MCkgPyAiaGQiIDogImZkIiwKKwkgICBnZW9tZXRyeS0+ZHJpdmVubyAmIDB4N2YsCisJICAgZ2VvbWV0cnktPnNlY3RvcnMgPj4gMSwKKwkgICAoZ2VvbWV0cnktPnNlY3RvcnMgJiAxKSA/ICIuNSIgOiAiIiwKKwkgICBnZW9tZXRyeS0+YywgZ2VvbWV0cnktPmgsIGdlb21ldHJ5LT5zLAorCSAgIGdlb21ldHJ5LT5oc3JjLCBnZW9tZXRyeS0+c3NyYywKKwkgICBkb19lZGQgPyAib24iIDogIm9mZiIsCisJICAgcHB0ci0+Y29uZmlnZmxhZ3MgJiBDT05GSUdfUkVBRE9OTFkgPyAicm8iIDogInJ3Iik7CisKKyAgICBwdXRzKCJVc2luZyAiKTsKKyAgICBzd2l0Y2ggKHBwdHItPmNvbmZpZ2ZsYWdzICYgQ09ORklHX01PREVNQVNLKSB7CisgICAgY2FzZSAwOgorCXB1dHMoInN0YW5kYXJkIElOVCAxNWgiKTsKKwlicmVhazsKKyAgICBjYXNlIENPTkZJR19TQUZFSU5UOgorCXB1dHMoInNhZmUgSU5UIDE1aCIpOworCWJyZWFrOworICAgIGNhc2UgQ09ORklHX1JBVzoKKwlwdXRzKCJyYXciKTsKKwlicmVhazsKKyAgICBjYXNlIENPTkZJR19SQVcgfCBDT05GSUdfQklHUkFXOgorCXB1dHMoImJpZyByZWFsIG1vZGUgcmF3Iik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlwcmludGYoInVua25vd24gJSN4IiwgcHB0ci0+Y29uZmlnZmxhZ3MgJiBDT05GSUdfTU9ERU1BU0spOworCWJyZWFrOworICAgIH0KKyAgICBwdXRzKCIgYWNjZXNzIHRvIGhpZ2ggbWVtb3J5XG4iKTsKKworICAgIC8qIFNldCB1cCBhIGRyaXZlIHBhcmFtZXRlciB0YWJsZSAqLworICAgIGlmIChnZW9tZXRyeS0+ZHJpdmVubyAmIDB4ODApIHsKKwkvKiBIYXJkIGRpc2sgKi8KKwlwcHRyLT5kcHQuaGQubWF4X2N5bCA9IGdlb21ldHJ5LT5jIC0gMTsKKwlwcHRyLT5kcHQuaGQubWF4X2hlYWQgPSBnZW9tZXRyeS0+aCAtIDE7CisJcHB0ci0+ZHB0LmhkLmN0cmwgPSAoZ2VvbWV0cnktPmggPiA4KSA/IDB4MDggOiAwOworICAgIH0gZWxzZSB7CisJLyogRmxvcHB5IC0gbW9zdCBvZiB0aGVzZSBmaWVsZHMgYXJlIGJvZ3VzIGFuZCBtaW1pYworCSAgIGEgMS40NCBNQiBmbG9wcHkgZHJpdmUgKi8KKwlwcHRyLT5kcHQuZmQuc3BlY2lmeTEgPSAweGRmOworCXBwdHItPmRwdC5mZC5zcGVjaWZ5MiA9IDB4MDI7CisJcHB0ci0+ZHB0LmZkLmRlbGF5ID0gMHgyNTsKKwlwcHRyLT5kcHQuZmQuc2VjdG9ycyA9IGdlb21ldHJ5LT5zOworCXBwdHItPmRwdC5mZC5icHMgPSAweDAyOworCXBwdHItPmRwdC5mZC5pc2dhcCA9IDB4MTI7CisJcHB0ci0+ZHB0LmZkLmRsZW4gPSAweGZmOworCXBwdHItPmRwdC5mZC5mZ2FwID0gMHg2YzsKKwlwcHRyLT5kcHQuZmQuZmZpbGwgPSAweGY2OworCXBwdHItPmRwdC5mZC5zZXR0bGUgPSAweDBmOworCXBwdHItPmRwdC5mZC5tc3RhcnQgPSAweDA1OworCXBwdHItPmRwdC5mZC5tYXh0cmFjayA9IGdlb21ldHJ5LT5jIC0gMTsKKwlwcHRyLT5kcHQuZmQuY21vcyA9IGdlb21ldHJ5LT50eXBlID4gNSA/IDUgOiBnZW9tZXRyeS0+dHlwZTsKKworCXBwdHItPmRwdC5mZC5vbGRfZmRfZHB0ID0gcmR6XzMyKEJJT1NfSU5UMUUpOworICAgIH0KKworICAgIC8qIFNldCB1cCBhbiBFREQgZHJpdmUgcGFyYW1ldGVyIHRhYmxlICovCisgICAgaWYgKGRvX2VkZCkgeworCXBwdHItPmVkZF9kcHQuc2VjdG9ycyA9IGdlb21ldHJ5LT5zZWN0b3JzOworCS8qIFRoZSBFREQgc3BlYyBoYXMgdGhpcyBhcyA8PSAxNTQ4Mjg4MCAgc2VjdG9ycyAoMTAyNHgyNDB4NjMpOworCSAgIHRoaXMgc2VlbXMgdG8gbWFrZSB2ZXJ5IGxpdHRsZSBzZW5zZS4gIFRyeSBmb3Igc29tZXRoaW5nIHNhbmVyLiAqLworCWlmIChnZW9tZXRyeS0+YyA8PSAxMDI0ICYmIGdlb21ldHJ5LT5oIDw9IDI1NSAmJiBnZW9tZXRyeS0+cyA8PSA2MykgeworCSAgICBwcHRyLT5lZGRfZHB0LmMgPSBnZW9tZXRyeS0+YzsKKwkgICAgcHB0ci0+ZWRkX2RwdC5oID0gZ2VvbWV0cnktPmg7CisJICAgIHBwdHItPmVkZF9kcHQucyA9IGdlb21ldHJ5LT5zOworCSAgICAvKiBFREQtNCBzdGF0ZXMgdGhhdCBpbnZhbGlkIGdlb21ldHJ5IHNob3VsZCBiZSByZXR1cm5lZAorCSAgICAgKiBmb3IgSU5UIDB4MTMsIEFIPTB4NDggIkVERCBHZXQgRGlzayBQYXJhbWV0ZXJzIiBjYWxsIG9uIGFuCisJICAgICAqIEVsIFRvcml0byBPREQuICBDaGVjayBmb3IgMjA0OC1ieXRlIHNlY3RvciBzaXplCisJICAgICAqLworCSAgICBpZiAoZ2VvbWV0cnktPnNlY3Rvcl9zaGlmdCAhPSAxMSkKKwkJcHB0ci0+ZWRkX2RwdC5mbGFncyB8PSAweDAwMDI7CS8qIEdlb21ldHJ5IHZhbGlkICovCisJfQorCWlmICghKGdlb21ldHJ5LT5kcml2ZW5vICYgMHg4MCkpIHsKKwkgICAgLyogRmxvcHB5IGRyaXZlLiAgTWFyayBpdCBhcyBhIHJlbW92YWJsZSBkZXZpY2Ugd2l0aAorCSAgICAgICBtZWRpYSBjaGFuZ2Ugbm90aWZpY2F0aW9uOyBtZWRpYSBpcyBwcmVzZW50LiAqLworCSAgICBwcHRyLT5lZGRfZHB0LmZsYWdzIHw9IDB4MDAxNDsKKwl9CisKKwlwcHRyLT5lZGRfZHB0LmRldnBhdGhbMF0gPSBwcHRyLT5tZGkuZGlza2J1ZjsKKwlwcHRyLT5lZGRfZHB0LmNoa3N1bSA9IC1jaGVja3N1bV9idWYoJnBwdHItPmVkZF9kcHQuZHBpa2V5LCA3MyAtIDMwKTsKKyAgICB9CisKKyAgICBpZiAoZG9fZWx0b3JpdG8pIHsKKwlidmQgPSAoc3RydWN0IGVkZDRfYnZkICopKHJhbWRpc2tfaW1hZ2UgKyAxNyAqIDIwNDgpOworCWJvb3RfY2F0ID0KKwkgICAgKHN0cnVjdCBlZGQ0X2Jvb3RjYXQgKikocmFtZGlza19pbWFnZSArIGJ2ZC0+Ym9vdF9jYXQgKiAyMDQ4KTsKKwlwcHRyLT5jZF9wa3QudHlwZSA9IGJvb3RfY2F0LT5pbml0aWFsX2VudHJ5Lm1lZGlhX3R5cGU7CS8qIENoZWF0ICovCisJcHB0ci0+Y2RfcGt0LmRyaXZlbm8gPSBnZW9tZXRyeS0+ZHJpdmVubzsKKwlwcHRyLT5jZF9wa3Quc3RhcnQgPSBib290X2NhdC0+aW5pdGlhbF9lbnRyeS5sb2FkX2Jsb2NrOworCWJvb3Rfc2VnID0gcHB0ci0+Y2RfcGt0LmxvYWRfc2VnID0gYm9vdF9jYXQtPmluaXRpYWxfZW50cnkubG9hZF9zZWc7CisJcHB0ci0+Y2RfcGt0LnNlY3RfY291bnQgPSBib290X2NhdC0+aW5pdGlhbF9lbnRyeS5zZWN0X2NvdW50OworCWJvb3RfbGVuID0gcHB0ci0+Y2RfcGt0LnNlY3RfY291bnQgKiA1MTI7CisJcHB0ci0+Y2RfcGt0Lmdlb20xID0gKHVpbnQ4X3QpKHBwdHItPmN5bGluZGVycykgJiAweEZGOworCXBwdHItPmNkX3BrdC5nZW9tMiA9CisJICAgICh1aW50OF90KShwcHRyLT5zZWN0b3JzKSB8ICh1aW50OF90KSgocHB0ci0+Y3lsaW5kZXJzID4+IDIpICYgMHhDMCk7CisJcHB0ci0+Y2RfcGt0Lmdlb20zID0gKHVpbnQ4X3QpKHBwdHItPmhlYWRzKTsKKyAgICB9CisKKyAgICBpZiAoKHAgPSBnZXRjbWRpdGVtKCJtZW0iKSkgIT0gQ01EX05PVEZPVU5EKSB7CisJc2V0bWF4bWVtKHN1ZmZpeF9udW1iZXIocCkpOworICAgIH0KKworICAgIC8qIFRoZSBzaXplIGlzIGdpdmVuIGJ5IGhwdHItPnRvdGFsX3NpemUgcGx1cyB0aGUgc2l6ZSBvZiB0aGUgRTgyMAorICAgICAgIG1hcCAtLSAxMiBieXRlcyBwZXIgcmFuZ2U7IHdlIG1heSBuZWVkIGFzIG1hbnkgYXMgMiBhZGRpdGlvbmFsCisgICAgICAgcmFuZ2VzIChlYWNoIGluc2VydHJhbmdlKCkgY2FuIHdvcnN0LWNhc2UgdHVybiAxIGFyZWEgaW50byAzKQorICAgICAgIHBsdXMgdGhlIHRlcm1pbmF0aW5nIHJhbmdlLCBvdmVyIHdoYXQgbnJhbmdlcyBjdXJyZW50bHkgc2hvdy4gKi8KKyAgICB0b3RhbF9zaXplID0gaHB0ci0+dG90YWxfc2l6ZTsJLyogQWN0dWFsIG1lbWRpc2sgY29kZSAqLworICAgIGU4MjBfbGVuID0gKG5yYW5nZXMgKyAzKSAqIHNpemVvZihyYW5nZXNbMF0pOworICAgIHRvdGFsX3NpemUgKz0gZTgyMF9sZW47CQkvKiBFODIwIG1lbW9yeSByYW5nZXMgKi8KKyAgICBjbWRsaW5lX2xlbiA9IHN0cmxlbihzaGRyLT5jbWRsaW5lKSArIDE7CisgICAgdG90YWxfc2l6ZSArPSBjbWRsaW5lX2xlbjsJCS8qIENvbW1hbmQgbGluZSAqLworICAgIHN0YWNrX2xlbiA9IHN0YWNrX25lZWRlZCgpOworICAgIHRvdGFsX3NpemUgKz0gc3RhY2tfbGVuOwkJLyogU3RhY2sgKi8KKyAgICBwcmludGYoIkNvZGUgJXUsIG1lbWluZm8gJXUsIGNtZGxpbmUgJXUsIHN0YWNrICV1XG4iLAorCSAgIGhwdHItPnRvdGFsX3NpemUsIGU4MjBfbGVuLCBjbWRsaW5lX2xlbiwgc3RhY2tfbGVuKTsKKyAgICBwcmludGYoIlRvdGFsIHNpemUgbmVlZGVkID0gJXUgYnl0ZXMsIGFsbG9jYXRpbmcgJXVLXG4iLAorCSAgIHRvdGFsX3NpemUsICh0b3RhbF9zaXplICsgMHgzZmYpID4+IDEwKTsKKworICAgIGlmICh0b3RhbF9zaXplID4gZG9zX21lbSkKKwlkaWUoIk1FTURJU0s6IEluc3VmZmljaWVudCBsb3cgbWVtb3J5XG4iKTsKKworICAgIGRyaXZlcmFkZHIgPSBzdGRkb3NtZW0gLSB0b3RhbF9zaXplOworICAgIGRyaXZlcmFkZHIgJj0gfjB4M0ZGOworCisgICAgcHJpbnRmKCJPbGQgZG9zIG1lbW9yeSBhdCAweCUwNXggKG1hcCBzYXlzIDB4JTA1eCksIGxvYWRpbmcgYXQgMHglMDV4XG4iLAorCSAgIHN0ZGRvc21lbSwgZG9zX21lbSwgZHJpdmVyYWRkcik7CisKKyAgICAvKiBSZXNlcnZlIHRoaXMgcmFuZ2Ugb2YgbWVtb3J5ICovCisgICAgd3J6XzE2KEJJT1NfQkFTRU1FTSwgZHJpdmVyYWRkciA+PiAxMCk7CisgICAgaW5zZXJ0cmFuZ2UoZHJpdmVyYWRkciwgZG9zX21lbSAtIGRyaXZlcmFkZHIsIDIpOworICAgIHBhcnNlX21lbSgpOworCisgICAgcHB0ci0+bWVtMW1iID0gbG93X21lbSA+PiAxMDsKKyAgICBwcHRyLT5tZW0xNm1iID0gaGlnaF9tZW0gPj4gMTY7CisgICAgaWYgKGxvd19tZW0gPT0gKDE1IDw8IDIwKSkgeworCS8qIGxvd21lbSBtYXhlZCBvdXQgKi8KKwl1aW50MzJfdCBpbnQxNTg4bWVtID0gKGhpZ2hfbWVtID4+IDEwKSArIChsb3dfbWVtID4+IDEwKTsKKwlwcHRyLT5tZW1pbnQxNTg4ID0gKGludDE1ODhtZW0gPiAweGZmZmYpID8gMHhmZmZmIDogaW50MTU4OG1lbTsKKyAgICB9IGVsc2UgeworCXBwdHItPm1lbWludDE1ODggPSBsb3dfbWVtID4+IDEwOworICAgIH0KKworICAgIHByaW50ZigiMTU4ODogMHglMDR4ICAxNUU4MDE6IDB4JTA0eCAweCUwNHhcbiIsCisJICAgcHB0ci0+bWVtaW50MTU4OCwgcHB0ci0+bWVtMW1iLCBwcHRyLT5tZW0xNm1iKTsKKworICAgIGRyaXZlcnNlZyA9IGRyaXZlcmFkZHIgPj4gNDsKKyAgICBkcml2ZXJwdHIgPSBkcml2ZXJzZWcgPDwgMTY7CisKKyAgICAvKiBBbnl0aGluZyBiZXlvbmQgdGhlIGVuZCBpcyBmb3IgdGhlIHN0YWNrICovCisgICAgcHB0ci0+bXlzdGFjayA9ICh1aW50MTZfdCkgKHN0ZGRvc21lbSAtIGRyaXZlcmFkZHIpOworCisgICAgcHB0ci0+bWRpLm9sZGludDEzLnVpbnQzMiA9IHJkel8zMihCSU9TX0lOVDEzKTsKKyAgICBwcHRyLT5tZGkub2xkaW50MTUudWludDMyID0gcmR6XzMyKEJJT1NfSU5UMTUpOworCisgICAgLyogQWRqdXN0IHRoZSBFODIwIHRhYmxlOiBpZiB0aGVyZSBhcmUgbnVsbCByYW5nZXMgKHR5cGUgMCkKKyAgICAgICBhdCB0aGUgZW5kLCBjaGFuZ2UgdGhlbSB0byB0eXBlIGVuZCBvZiBsaXN0ICgtMSkuCisgICAgICAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBkcml2ZXIgdG8gYmUgYWJsZSB0byByZXBvcnQgZW5kCisgICAgICAgb2YgbGlzdCBjb3JyZWN0bHkuICovCisgICAgd2hpbGUgKG5yYW5nZXMgJiYgcmFuZ2VzW25yYW5nZXMgLSAxXS50eXBlID09IDApIHsKKwlyYW5nZXNbLS1ucmFuZ2VzXS50eXBlID0gLTE7CisgICAgfQorCisgICAgaWYgKGdldGNtZGl0ZW0oIm5vcGFzc2FueSIpICE9IENNRF9OT1RGT1VORCkgeworCXByaW50Zigibm9wYXNzYW55IHNwZWNpZmllZCAtIHdlJ3JlIHRoZSBvbmx5IGRyaXZlIG9mIGFueSBraW5kXG4iKTsKKwliaW9zX2RyaXZlcyA9IDA7CisJcHB0ci0+ZHJpdmVjbnQgPSAwOworCW5vX2JwdCA9IDE7CisJcHB0ci0+bWRpLm9sZGludDEzLnVpbnQzMiA9IGRyaXZlcnB0ciArIGhwdHItPmlyZXRfb2ZmczsKKwl3cnpfOChCSU9TX0VRVUlQLCByZHpfOChCSU9TX0VRVUlQKSAmIH4weGMxKTsKKwl3cnpfOChCSU9TX0hEX0NPVU5ULCAwKTsKKyAgICB9IGVsc2UgaWYgKGdldGNtZGl0ZW0oIm5vcGFzcyIpICE9IENNRF9OT1RGT1VORCkgeworCXByaW50Zigibm9wYXNzIHNwZWNpZmllZCAtIHdlJ3JlIHRoZSBvbmx5IGRyaXZlXG4iKTsKKwliaW9zX2RyaXZlcyA9IDA7CisJcHB0ci0+ZHJpdmVjbnQgPSAwOworCW5vX2JwdCA9IDE7CisgICAgfSBlbHNlIHsKKwkvKiBRdWVyeSBkcml2ZSBwYXJhbWV0ZXJzIG9mIHRoaXMgdHlwZSAqLworCW1lbXNldCgmcmVncywgMCwgc2l6ZW9mIHJlZ3MpOworCXJlZ3MuZXMgPSAwOworCXJlZ3MuZWF4LmJbMV0gPSAweDA4OworCXJlZ3MuZWR4LmJbMF0gPSBnZW9tZXRyeS0+ZHJpdmVubyAmIDB4ODA7CisJaW50Y2FsbCgweDEzLCAmcmVncywgJnJlZ3MpOworCisJLyogTm90ZTogcGVyIHN1Z2dlc3Rpb24gZnJvbSB0aGUgSW50ZXJydXB0IExpc3QsIGNvbnNpZGVyCisJICAgSU5UIDEzIDA4IHRvIGhhdmUgZmFpbGVkIGlmIHRoZSBzZWN0b3IgY291bnQgaW4gQ0wgaXMgemVyby4gKi8KKwlpZiAoKHJlZ3MuZWZsYWdzLmwgJiAxKSB8fCAhKHJlZ3MuZWN4LmJbMF0gJiAweDNmKSkgeworCSAgICBwcmludGYoIklOVCAxMyAwODogRmFpbHVyZSwgYXNzdW1pbmcgdGhpcyBpcyB0aGUgb25seSBkcml2ZVxuIik7CisJICAgIHBwdHItPmRyaXZlY250ID0gMDsKKwkgICAgbm9fYnB0ID0gMTsKKwl9IGVsc2UgeworCSAgICBwcmludGYoIklOVCAxMyAwODogU3VjY2VzcywgY291bnQgPSAldSwgQlBUID0gJTA0eDolMDR4XG4iLAorCQkgICByZWdzLmVkeC5iWzBdLCByZWdzLmVzLCByZWdzLmVkaS53WzBdKTsKKwkgICAgcHB0ci0+ZHJpdmVjbnQgPSByZWdzLmVkeC5iWzBdOworCSAgICBub19icHQgPSAhKHJlZ3MuZXMgfCByZWdzLmVkaS53WzBdKTsKKwl9CisKKwkvKiBDb21wYXJlIHdoYXQgSU5UIDEzaCByZXR1cm5lZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBlcXVpcG1lbnQgYnl0ZSAqLworCWlmIChnZW9tZXRyeS0+ZHJpdmVubyAmIDB4ODApIHsKKwkgICAgYmlvc19kcml2ZXMgPSByZHpfOChCSU9TX0hEX0NPVU5UKTsKKwl9IGVsc2UgeworCSAgICB1aW50OF90IGVxdWlwID0gcmR6XzgoQklPU19FUVVJUCk7CisKKwkgICAgaWYgKGVxdWlwICYgMSkKKwkJYmlvc19kcml2ZXMgPSAoZXF1aXAgPj4gNikgKyAxOworCSAgICBlbHNlCisJCWJpb3NfZHJpdmVzID0gMDsKKwl9CisKKwlpZiAocHB0ci0+ZHJpdmVjbnQgPiBiaW9zX2RyaXZlcykgeworCSAgICBwcmludGYoIkJJT1MgZXF1aXBtZW50IGJ5dGUgc2F5cyBjb3VudCA9ICVkLCBnbyB3aXRoIHRoYXRcbiIsCisJCSAgIGJpb3NfZHJpdmVzKTsKKwkgICAgcHB0ci0+ZHJpdmVjbnQgPSBiaW9zX2RyaXZlczsKKwl9CisgICAgfQorCisgICAgLyogQWRkIG91cnNlbHZlcyB0byB0aGUgZHJpdmUgY291bnQgKi8KKyAgICBwcHRyLT5kcml2ZWNudCsrOworCisgICAgLyogRGlzY29udGlndW91cyBkcml2ZSBzcGFjZS4gIFRoZXJlIGlzIG5vIHJlYWxseSBnb29kIHNvbHV0aW9uIGZvciB0aGlzLiAqLworICAgIGlmIChwcHRyLT5kcml2ZWNudCA8PSAoZ2VvbWV0cnktPmRyaXZlbm8gJiAweDdmKSkKKwlwcHRyLT5kcml2ZWNudCA9IChnZW9tZXRyeS0+ZHJpdmVubyAmIDB4N2YpICsgMTsKKworICAgIC8qIFByb2JlIGZvciBjb250aWd1b3VzIHJhbmdlIG9mIEJJT1MgZHJpdmVzIHN0YXJ0aW5nIHdpdGggZHJpdmVubyAqLworICAgIHBwdHItPmRyaXZlc2hpZnRsaW1pdCA9IHByb2JlX2RyaXZlX3JhbmdlKGdlb21ldHJ5LT5kcml2ZW5vKSArIDE7CisgICAgaWYgKChwcHRyLT5kcml2ZXNoaWZ0bGltaXQgJiAweDgwKSAhPSAoZ2VvbWV0cnktPmRyaXZlbm8gJiAweDgwKSkKKwlwcmludGYoIldlIGxvc3QgdGhlIGxhc3QgZHJpdmUgaW4gb3VyIGNsYXNzIG9mIGRyaXZlcy5cbiIpOworICAgIHByaW50ZigiRHJpdmUgcHJvYmluZyBnaXZlcyBkcml2ZSBzaGlmdCBsaW1pdDogMHglMDJ4XG4iLAorCXBwdHItPmRyaXZlc2hpZnRsaW1pdCk7CisKKyAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tYW5kIGxpbmUgKi8KKyAgICBwcHRyLT5tZGkuY21kbGluZS5zZWdfb2ZmLm9mZnNldCA9IGJpbl9zaXplICsgKG5yYW5nZXMgKyAxKSAqIHNpemVvZihyYW5nZXNbMF0pOworICAgIHBwdHItPm1kaS5jbWRsaW5lLnNlZ19vZmYuc2VnbWVudCA9IGRyaXZlcnNlZzsKKworICAgIC8qIENvcHkgZHJpdmVyIGZvbGxvd2VkIGJ5IEU4MjAgdGFibGUgZm9sbG93ZWQgYnkgY29tbWFuZCBsaW5lICovCisgICAgeworCXVuc2lnbmVkIGNoYXIgKmRwcCA9ICh1bnNpZ25lZCBjaGFyICopKGRyaXZlcnNlZyA8PCA0KTsKKworCS8qIEFkanVzdCB0aGVzZSBwb2ludGVycyB0byBwb2ludCB0byB0aGUgaW5zdGFsbGVkIGltYWdlICovCisJLyogQ2FyZWZ1bCBhYm91dCB0aGUgb3JkZXIgaGVyZS4uLiB0aGUgaW1hZ2UgaXNuJ3QgY29waWVkIHlldCEgKi8KKwlwcHRyID0gKHN0cnVjdCBwYXRjaF9hcmVhICopKGRwcCArIGhwdHItPnBhdGNoX29mZnMpOworCWhwdHIgPSAoc3RydWN0IG1lbWRpc2tfaGVhZGVyICopZHBwOworCisJLyogQWN0dWFsbHkgY29weSB0byBsb3cgbWVtb3J5ICovCisJZHBwID0gbWVtcGNweShkcHAsIG1lbWRpc2tfaG9vaywgYmluX3NpemUpOworCWRwcCA9IG1lbXBjcHkoZHBwLCByYW5nZXMsIChucmFuZ2VzICsgMSkgKiBzaXplb2YocmFuZ2VzWzBdKSk7CisJZHBwID0gbWVtcGNweShkcHAsIHNoZHItPmNtZGxpbmUsIGNtZGxpbmVfbGVuKTsKKyAgICB9CisKKyAgICAvKiBOb3RlIHRoZSBwcmV2aW91cyBJTlQgMTNoIGhvb2sgaW4gdGhlICJzYWZlIGhvb2siIHN0cnVjdHVyZSAqLworICAgIGhwdHItPnNhZmVfaG9vay5vbGRfaG9vay51aW50MzIgPSBwcHRyLT5tZGkub2xkaW50MTMudWludDMyOworCisgICAgLyogUmUtZmlsbCB0aGUgInNhZmUgaG9vayIgbUJGVCBmaWVsZCB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCisgICAgbWJmdCA9IChzdHJ1Y3QgbUJGVCAqKSgoKGNvbnN0IGNoYXIgKilocHRyKSArIGhwdHItPnNhZmVfaG9vay5tYmZ0KTsKKyAgICBocHRyLT5zYWZlX2hvb2subWJmdCA9IChzaXplX3QpbWJmdDsKKworICAgIC8qIFVwZGF0ZSB2YXJpb3VzIEJJT1MgbWFnaWMgZGF0YSBhcmVhcyAoZ290dGEgbG92ZSB0aGlzIHNoaXQpICovCisKKyAgICBpZiAoZ2VvbWV0cnktPmRyaXZlbm8gJiAweDgwKSB7CisJLyogVXBkYXRlIEJJT1MgaGFyZCBkaXNrIGNvdW50ICovCisJdWludDhfdCBuaGQgPSBwcHRyLT5kcml2ZWNudDsKKworCWlmIChuaGQgPiAxMjgpCisJICAgIG5oZCA9IDEyODsKKworCWlmICghZG9fZWx0b3JpdG8pCisJICAgIHdyel84KEJJT1NfSERfQ09VTlQsIG5oZCk7CisgICAgfSBlbHNlIHsKKwkvKiBVcGRhdGUgQklPUyBmbG9wcHkgZGlzayBjb3VudCAqLworCXVpbnQ4X3QgZXF1aXAgPSByZHpfOChCSU9TX0VRVUlQKTsKKwl1aW50OF90IG5mbG9wID0gcHB0ci0+ZHJpdmVjbnQ7CisKKwlpZiAobmZsb3AgPiA0KQkJLyogTGltaXQgb2YgZXF1aXBtZW50IGJ5dGUgKi8KKwkgICAgbmZsb3AgPSA0OworCisJZXF1aXAgJj0gMHgzRTsKKwlpZiAobmZsb3ApCisJICAgIGVxdWlwIHw9ICgobmZsb3AgLSAxKSA8PCA2KSB8IDB4MDE7CisKKwl3cnpfOChCSU9TX0VRVUlQLCBlcXVpcCk7CisKKwkvKiBJbnN0YWxsIERQVCBwb2ludGVyIGlmIHRoaXMgd2FzIHRoZSBvbmx5IGZsb3BweSAqLworCWlmIChnZXRjbWRpdGVtKCJkcHQiKSAhPSBDTURfTk9URk9VTkQgfHwKKwkgICAgKChuZmxvcCA9PSAxIHx8IG5vX2JwdCkgJiYgZ2V0Y21kaXRlbSgibm9kcHQiKSA9PSBDTURfTk9URk9VTkQpKSB7CisJICAgIC8qIERvIGluc3RhbGwgYSByZXBsYWNlbWVudCBEUFQgaW50byBJTlQgMUVoICovCisJICAgIHBwdHItPm1kaS5kcHRfcHRyID0KKwkJaHB0ci0+cGF0Y2hfb2ZmcyArIG9mZnNldG9mKHN0cnVjdCBwYXRjaF9hcmVhLCBkcHQpOworCX0KKyAgICB9CisKKyAgICAvKiBDb21wbGV0ZSB0aGUgbUJGVCAqLworICAgIG1iZnQtPmFjcGkuc2lnbmF0dXJlWzBdID0gJ20nOwkvKiAibUJGVCIgKi8KKyAgICBtYmZ0LT5hY3BpLnNpZ25hdHVyZVsxXSA9ICdCJzsKKyAgICBtYmZ0LT5hY3BpLnNpZ25hdHVyZVsyXSA9ICdGJzsKKyAgICBtYmZ0LT5hY3BpLnNpZ25hdHVyZVszXSA9ICdUJzsKKyAgICBtYmZ0LT5zYWZlX2hvb2sgPSAoc2l6ZV90KSZocHRyLT5zYWZlX2hvb2s7CisgICAgbWJmdC0+YWNwaS5jaGVja3N1bSA9IC1jaGVja3N1bV9idWYobWJmdCwgbWJmdC0+YWNwaS5sZW5ndGgpOworCisgICAgLyogSW5zdGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXJzICovCisgICAgcHJpbnRmKCJvbGQ6IGludDEzID0gJTA4eCAgaW50MTUgPSAlMDh4ICBpbnQxZSA9ICUwOHhcbiIsCisJICAgcmR6XzMyKEJJT1NfSU5UMTMpLCByZHpfMzIoQklPU19JTlQxNSksIHJkel8zMihCSU9TX0lOVDFFKSk7CisKKyAgICB3cnpfMzIoQklPU19JTlQxMywgZHJpdmVycHRyICsgaHB0ci0+aW50MTNfb2Zmcyk7CisgICAgd3J6XzMyKEJJT1NfSU5UMTUsIGRyaXZlcnB0ciArIGhwdHItPmludDE1X29mZnMpOworICAgIGlmIChwcHRyLT5tZGkuZHB0X3B0cikKKwl3cnpfMzIoQklPU19JTlQxRSwgZHJpdmVycHRyICsgcHB0ci0+bWRpLmRwdF9wdHIpOworCisgICAgcHJpbnRmKCJuZXc6IGludDEzID0gJTA4eCAgaW50MTUgPSAlMDh4ICBpbnQxZSA9ICUwOHhcbiIsCisJICAgcmR6XzMyKEJJT1NfSU5UMTMpLCByZHpfMzIoQklPU19JTlQxNSksIHJkel8zMihCSU9TX0lOVDFFKSk7CisKKyAgICAvKiBGaWd1cmUgb3V0IGVudHJ5IHBvaW50ICovCisgICAgaWYgKCFib290X3NlZykgeworCWJvb3RfYmFzZSA9IDB4N2MwMDsKKwlzaGRyLT5zc3NwID0gMHg3YzAwOworCXNoZHItPmNzaXAgPSAweDdjMDA7CisgICAgfSBlbHNlIHsKKwlib290X2Jhc2UgPSBib290X3NlZyA8PCA0OworCXNoZHItPnNzc3AgPSBib290X3NlZyA8PCAxNjsKKwlzaGRyLT5jc2lwID0gYm9vdF9zZWcgPDwgMTY7CisgICAgfQorCisgICAgLyogUmVsb2NhdGUgdGhlIHJlYWwtbW9kZSBjb2RlIHRvIGJlbG93IHRoZSBzdHViICovCisgICAgcm1fYmFzZSA9IChkcml2ZXJhZGRyIC0gcm1fYXJncy5ybV9zaXplKSAmIH4xNTsKKyAgICBpZiAocm1fYmFzZSA8IGJvb3RfYmFzZSArIGJvb3RfbGVuKQorCWRpZSgiTUVNRElTSzogYm9vdHN0cmFwIHRvbyBsYXJnZSB0byBsb2FkXG4iKTsKKworICAgIHJlbG9jYXRlX3JtX2NvZGUocm1fYmFzZSk7CisKKyAgICAvKiBSZWJvb3QgaW50byB0aGUgbmV3ICJkaXNrIiAqLworICAgIHB1dHMoIkxvYWRpbmcgYm9vdCBzZWN0b3IuLi4gIik7CisKKyAgICBtZW1jcHkoKHZvaWQgKilib290X2Jhc2UsCisJICAgKGNoYXIgKilwcHRyLT5tZGkuZGlza2J1ZiArIGdlb21ldHJ5LT5ib290X2xiYSAqIDUxMiwKKwkgICBib290X2xlbik7CisKKyAgICBpZiAoZ2V0Y21kaXRlbSgicGF1c2UiKSAhPSBDTURfTk9URk9VTkQpIHsKKwlwdXRzKCJwcmVzcyBhbnkga2V5IHRvIGJvb3QuLi4gIik7CisJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YgcmVncyk7CisJcmVncy5lYXgud1swXSA9IDA7CisJaW50Y2FsbCgweDE2LCAmcmVncywgTlVMTCk7CisgICAgfQorCisgICAgcHV0cygiYm9vdGluZy4uLlxuIik7CisKKyAgICAvKiBPbiByZXR1cm4gdGhlIGFzc2VtYmx5IGNvZGUgd2lsbCBqdW1wIHRvIHRoZSBib290IHZlY3RvciAqLworICAgIHNoZHItPmVzZGkgPSBwbnBfaW5zdGFsbF9jaGVjaygpOworICAgIHNoZHItPmVkeCA9IGdlb21ldHJ5LT5kcml2ZW5vOworfQorCmRpZmYgLS1naXQgYS9tZW1kaXNrL3N0YXJ0MzIuUyBiL21lbWRpc2svc3RhcnQzMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWJlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL3N0YXJ0MzIuUwpAQCAtMCwwICsxLDEwNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAyMDAzLTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBTaW1wbGUgc3R1YiB0byBnZXQgdXMgdG8gdGhlIHJpZ2h0IHBvaW50IGluIHRoZSAzMi1iaXQgY29kZTsKKyAqIHRoaXMgbW9kdWxlIG11c3QgYmUgbGlua2VkIGZpcnN0CisgKi8KKworCS5zZWN0aW9uICIuaW5pdCIsICJheCIKKwkuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisJLyogWmVybyB0aGUgYnNzICovCisJY2xkCisJbW92bAkkX19ic3Nfc3RhcnQsICVlZGkKKwltb3ZsCSRfX2Jzc19lbmQsICVlY3gKKwlzdWJsCSVlZGksICVlY3gKKwl4b3JsCSVlYXgsICVlYXgKKwlzaHJsCSQyLCAlZWN4CisJcmVwIDsgc3Rvc2wKKworCS8qIFNldCB1cCB0aGUgcHJvdGVjdGVkLW1vZGUgSURUIGFuZCB0aGUgaW50ZXJydXB0IGp1bXAgYnVmZmVycyAqLworCW1vdmwJJGlkdCwgJWVkaQorCW1vdmwJJGlqYiwgJWVheAorCW1vdmwJJDB4ZWUwMDAwMDAsICVlYngJLyogSW50ZXJydXB0IGdhdGUgKi8KKwltb3Z3CSVjcywgJWJ4CQkvKiBUYXJnZXQgc2VnbWVudCAqLworCisJLyogTWFrZSB0aGUgSURUICovCisJbW92bAkkMjU2LCAlZWN4CisxOgorCXN0b3NsCisJc3Rvc2wKKwltb3ZsCSVlYngsIC02KCVlZGkpCisJYWRkbAkkOCwgJWVheAorCWxvb3AJMWIKKworCS8qCisJICogRWFjaCBlbnRyeSBpbiB0aGUgaW50ZXJydXB0IGp1bXAgYnVmZmVyIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKKwkgKiBpbnN0cnVjdGlvbnM6CisJICoKKwkgKiA2MAkJcHVzaGFsCisJICogYjB4eAkJbW92YiAkeHgsICVhbAkJIyBpbnRlcnJ1cHQgbnVtYmVyCisJICogZTl4eHh4eHh4eAlqbXAgaGFuZGxlX2ludGVycnVwdAorCSAqLworCW1vdmwJJDB4ZTkwMGIwNjAsICVlYXgKKwltb3ZsCSQyNTYsICVlY3gKKzE6CisJbW92bAklZWF4LCAoJWVkaSkKKwlhZGRsCSQoMSA8PCAxNiksICVlYXgKKwltb3ZsCSRoYW5kbGVfaW50ZXJydXB0LTgsICVlZHgKKwlzdWJsCSVlZGksICVlZHgKKwltb3ZsCSVlZHgsIDQoJWVkaSkKKwlhZGRsCSQ4LCAlZWRpCisJbG9vcAkxYgorCisjaWYgX19TSVpFT0ZfUE9JTlRFUl9fID09IDQKKwlsaWR0bAlpZHRfcHRyCisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gOAorCWxpZHQJaWR0X3B0cgorI2Vsc2UKKyNlcnJvciAidW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIgorI2VuZGlmCisJCisJLyogU2F2ZSBhcmd1bWVudHMsIHN3aXRjaCBzdGFja3MgKi8KKwltb3ZsCSVlc3AsICVlYXgJCS8qIFBvaW50ZXIgdG8gYXJndW1lbnRzICovCisJbW92bAkkX19zdGFja19lbmQsICVlc3AKKwkKKwljYWxsCXNldHVwCisJam1wCSoocm1fYXJncykJCS8qIEZpcnN0IGFyZ3VtZW50IGlzIHJldHVybiAqLworCisJLnNlY3Rpb24gIi50ZXh0IiwiYXgiCisJLmdsb2JsCWludGNhbGwKKwkudHlwZQlpbnRjYWxsLCBAZnVuY3Rpb24KK2ludGNhbGw6CisJam1wCSoocm1fYXJncysxKjQpCQkvKiBJbnRjYWxsIGlzIGFyZ3VtZW50IDEgKi8KKwkuc2l6ZQlpbnRjYWxsLCAuLWludGNhbGwKKworCS50eXBlCWhhbmRsZV9pbnRlcnJ1cHQsIEBmdW5jdGlvbgoraGFuZGxlX2ludGVycnVwdDoKKwlqbXAJKihybV9hcmdzKzQqNCkJCS8qIEludGVycnVwdCBwb2ludGVyIGlzIGFyZ3VtZW50IDQgKi8KKwkuc2l6ZQloYW5kbGVfaW50ZXJydXB0LCAuLWhhbmRsZV9pbnRlcnJ1cHQKKworCS5zZWN0aW9uICIucm9kYXRhIiwiYSIKK2lkdF9wdHI6CisJLndvcmQJOCoyNTYtMQorCS5sb25nCWlkdAorCS53b3JkCTAKKworCS5zZWN0aW9uICIuYnNzLmxhcmdlIiwiYXciCisJLmJhbGlnbiAyMDQ4CitpZHQ6CisJLnNwYWNlCTgqMjU2CitpamI6CisJLnNwYWNlCTgqMjU2CisKK19fc3RhY2s6CisJLnNwYWNlCTY1NTM2CitfX3N0YWNrX2VuZDoKZGlmZiAtLWdpdCBhL21lbWRpc2svc3RybnRvdW1heC5jIGIvbWVtZGlzay9zdHJudG91bWF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhMmYzNQotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svc3RybnRvdW1heC5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi9jb20zMi9saWIvc3RybnRvdW1heC5jIgpkaWZmIC0tZ2l0IGEvbWVtZGlzay9zdHJ0b3VsbC5jIGIvbWVtZGlzay9zdHJ0b3VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDI1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL3N0cnRvdWxsLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uL2NvbTMyL2xpYi9zdHJ0b3VsbC5jIgpkaWZmIC0tZ2l0IGEvbWVtZGlzay9zdHJ0b3guYyBiL21lbWRpc2svc3RydG94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1NjgxZgotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svc3RydG94LmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uL2NvbTMyL2xpYi9zdHJ0b3guYyIKZGlmZiAtLWdpdCBhL21lbWRpc2svc3VmZml4X251bWJlci5jIGIvbWVtZGlzay9zdWZmaXhfbnVtYmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxYzVhMwotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2svc3VmZml4X251bWJlci5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi9jb20zMi9saWIvc3VmZml4X251bWJlci5jIgpkaWZmIC0tZ2l0IGEvbWVtZGlzay90ZXN0ZGF0YTEgYi9tZW1kaXNrL3Rlc3RkYXRhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFiNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay90ZXN0ZGF0YTEKQEAgLTAsMCArMSwxMyBAQAorMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDliYzAwIDEKKzAwMDAwMDAwMDAwOWJjMDAgMDAwMDAwMDAwMDAwNDQwMCAyCiswMDAwMDAwMDAwMGU5ODAwIDAwMDAwMDAwMDAwMTY4MDAgMgorMDAwMDAwMDAwMDEwMDAwMCAwMDAwMDAwMDA2ZWUwMDAwIDEKKzAwMDAwMDAwMDZmZTAwMDAgMDAwMDAwMDAwMDAwZmMwMCAzCiswMDAwMDAwMDA2ZmVmYzAwIDAwMDAwMDAwMDAwMDA0MDAgNAorMDAwMDAwMDAwNmZmMDAwMCAwMDAwMDAwMDAwMDAyMDAwIDIKKzAwMDAwMDAwMDZmZjIwMDAgMDAwMDAwMDAwMDAwZTAwMCAxCiswMDAwMDAwMDA3MDAwMDAwIDAwMDAwMDAwMDAxMDAwMDAgMgorMDAwMDAwMDBmZmYwMDAwMCAwMDAwMDAwMDAwMTAwMDAwIDIKKworMDAwMDAwMDAwMDU4NjAwMCAwMDAwMDAwMDAwMTY4MDAwIDIKKzAwMDAwMDAwMDAwOWJhMDAgMDAwMDAwMDAwMDAwMDIwMCAyCmRpZmYgLS1naXQgYS9tZW1kaXNrL3Rlc3RkYXRhMiBiL21lbWRpc2svdGVzdGRhdGEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZWM1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL3Rlc3RkYXRhMgpAQCAtMCwwICsxLDEwIEBACiswMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwOWJjMDAgMQorMDAwMDAwMDAwMDA5YmMwMCAwMDAwMDAwMDAwMDA0NDAwIDIKKzAwMDAwMDAwMDAwZTk4MDAgMDAwMDAwMDAwMDAxNjgwMCAyCiswMDAwMDAwMDAwMTAwMDAwIDAwMDAwMDAwMDZlZTAwMDAgMQorMDAwMDAwMDAwNmZlMDAwMCAwMDAwMDAwMDAwMDBmYzAwIDMKKzAwMDAwMDAwMDZmZWZjMDAgMDAwMDAwMDAwMDAwMDQwMCA0CiswMDAwMDAwMDA2ZmYwMDAwIDAwMDAwMDAwMDAwMDIwMDAgMgorMDAwMDAwMDAwNmZmMjAwMCAwMDAwMDAwMDAwMDBlMDAwIDEKKzAwMDAwMDAwMDcwMDAwMDAgMDAwMDAwMDAwMDEwMDAwMCAyCiswMDAwMDAwMGZmZjAwMDAwIDAwMDAwMDAwMDAxMDAwMDAgMgpkaWZmIC0tZ2l0IGEvbWVtZGlzay90ZXN0ZGF0YTMgYi9tZW1kaXNrL3Rlc3RkYXRhMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGE0NTAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay90ZXN0ZGF0YTMKQEAgLTAsMCArMSwxNCBAQAorMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDliYzAwIDEKKzAwMDAwMDAwMDAwOWJjMDAgMDAwMDAwMDAwMDAwNDQwMCAyCiswMDAwMDAwMDAwMGU5ODAwIDAwMDAwMDAwMDAwMTY4MDAgMgorMDAwMDAwMDAwMDEwMDAwMCAwMDAwMDAwMDA2ZWUwMDAwIDEKKzAwMDAwMDAwMDZmZTAwMDAgMDAwMDAwMDAwMDAwZmMwMCAzCiswMDAwMDAwMDA2ZmVmYzAwIDAwMDAwMDAwMDAwMDA0MDAgNAorMDAwMDAwMjAwMDAwMDAwMCAwMDAwMDAxMDAwMDAwMDAwIDEKKzAwMDAwMDAwMDZmZjAwMDAgMDAwMDAwMDAwMDAwMjAwMCAyCiswMDAwMDAwMDA2ZmYyMDAwIDAwMDAwMDAwMDAwMGUwMDAgMQorMDAwMDAwMDAwNzAwMDAwMCAwMDAwMDAwMDAwMTAwMDAwIDIKKzAwMDAwMDAwZmZmMDAwMDAgMDAwMDAwMDAwMDEwMDAwMCAyCisKKzAwMDAwMDAwMDA1ODYwMDAgMDAwMDAwMDAwMDE2ODAwMCAyCiswMDAwMDAwMDAwMDliYTAwIDAwMDAwMDAwMDAwMDAyMDAgMgpkaWZmIC0tZ2l0IGEvbWVtZGlzay91bnppcC5jIGIvbWVtZGlzay91bnppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTFkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZW1kaXNrL3VuemlwLmMKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiB1bnppcC5jCisgKgorICogVGhpcyBpcyBhIGNvbGxlY3Rpb24gb2Ygc2V2ZXJhbCByb3V0aW5lcyBmcm9tIGd6aXAtMS4wLjMKKyAqIGFkYXB0ZWQgZm9yIExpbnV4LgorICoKKyAqIG1hbGxvYyBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMgYW5kIE1hdHRoaWFzIFVybGljaHMgMTk5NAorICogcHV0cyBieSBOaWNrIEhvbGxvd2F5IDE5OTMsIGJldHRlciBwdXRzIGJ5IE1hcnRpbiBNYXJlcyAxOTk1CisgKiBIaWdoIGxvYWRlZCBzdHVmZiBieSBIYW5zIExlcm1lbiAmIFdlcm5lciBBbG1lc2JlcmdlciwgRmViLiAxOTk2CisgKgorICogQWRhcHRlZCBmb3IgTUVNRElTSyBieSBILiBQZXRlciBBbnZpbiwgQXByaWwgMjAwMworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJtZW1kaXNrLmgiCisjaW5jbHVkZSAiY29uaW8uaCIKKworI3VuZGVmIERFQlVHCQkJLyogTWVhbnMgc29tZXRoaW5nIGRpZmZlcmVudCBmb3IgdGhpcyBmaWxlICovCisKKy8qCisgKiBnemlwIGRlY2xhcmF0aW9ucworICovCisKKyNkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyNkZWZpbmUgU1RBVElDIHN0YXRpYworCisjZGVmaW5lIG1lbXplcm8ocywgbikgICAgIG1lbXNldCAoKHMpLCAwLCAobikpCisKK3R5cGVkZWYgdWludDhfdCB1Y2g7Cit0eXBlZGVmIHVpbnQxNl90IHVzaDsKK3R5cGVkZWYgdWludDMyX3QgdWxnOworCisjZGVmaW5lIFdTSVpFIDB4ODAwMAkJLyogV2luZG93IHNpemUgbXVzdCBiZSBhdCBsZWFzdCAzMmssICovCisJCQkJLyogYW5kIGEgcG93ZXIgb2YgdHdvICovCisKK3N0YXRpYyB1Y2ggKmluYnVmOwkJLyogaW5wdXQgcG9pbnRlciAqLworc3RhdGljIHVjaCB3aW5kb3dbV1NJWkVdOwkvKiBzbGlkaW5nIG91dHB1dCB3aW5kb3cgYnVmZmVyICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnNpemU7CQkvKiB0b3RhbCBpbnB1dCBieXRlcyByZWFkICovCitzdGF0aWMgdW5zaWduZWQgaW5ieXRlczsJLyogdmFsaWQgYnl0ZXMgaW4gaW5idWYgKi8KK3N0YXRpYyB1bnNpZ25lZCBvdXRjbnQ7CQkvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCisKKy8qIGd6aXAgZmxhZyBieXRlICovCisjZGVmaW5lIEFTQ0lJX0ZMQUcgICAweDAxCS8qIGJpdCAwIHNldDogZmlsZSBwcm9iYWJseSBBU0NJSSB0ZXh0ICovCisjZGVmaW5lIENPTlRJTlVBVElPTiAweDAyCS8qIGJpdCAxIHNldDogY29udGludWF0aW9uIG9mIG11bHRpLXBhcnQgZ3ppcCBmaWxlICovCisjZGVmaW5lIEVYVFJBX0ZJRUxEICAweDA0CS8qIGJpdCAyIHNldDogZXh0cmEgZmllbGQgcHJlc2VudCAqLworI2RlZmluZSBPUklHX05BTUUgICAgMHgwOAkvKiBiaXQgMyBzZXQ6IG9yaWdpbmFsIGZpbGUgbmFtZSBwcmVzZW50ICovCisjZGVmaW5lIENPTU1FTlQgICAgICAweDEwCS8qIGJpdCA0IHNldDogZmlsZSBjb21tZW50IHByZXNlbnQgKi8KKyNkZWZpbmUgRU5DUllQVEVEICAgIDB4MjAJLyogYml0IDUgc2V0OiBmaWxlIGlzIGVuY3J5cHRlZCAqLworI2RlZmluZSBSRVNFUlZFRCAgICAgMHhDMAkvKiBiaXQgNiw3OiAgIHJlc2VydmVkICovCisKKy8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCisjaWZkZWYgREVCVUcKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHtpZighKGNvbmQpKSBlcnJvcihtc2cpO30KKyMgIGRlZmluZSBUcmFjZSh4KSBmcHJpbnRmIHgKKyMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh2ZXJib3NlKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZXZ2KHgpIHtpZiAodmVyYm9zZT4xKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHZlcmJvc2UgJiYgKGMpKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWN2KGMseCkge2lmICh2ZXJib3NlPjEgJiYgKGMpKSBmcHJpbnRmIHggO30KKyNlbHNlCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQorIyAgZGVmaW5lIFRyYWNlKHgpCisjICBkZWZpbmUgVHJhY2V2KHgpCisjICBkZWZpbmUgVHJhY2V2dih4KQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpCisjICBkZWZpbmUgVHJhY2VjdihjLHgpCisjZW5kaWYKKworc3RhdGljIGludCBmaWxsX2luYnVmKHZvaWQpOworc3RhdGljIHZvaWQgZmx1c2hfd2luZG93KHZvaWQpOworc3RhdGljIHZvaWQgZXJyb3IoY2hhciAqbSk7CitzdGF0aWMgdm9pZCBnemlwX21hcmsodm9pZCAqKik7CitzdGF0aWMgdm9pZCBnemlwX3JlbGVhc2Uodm9pZCAqKik7CisKK3N0YXRpYyB1bGcgY3JjXzMyX3RhYlsyNTZdOworCisvKiBHZXQgYnl0ZSBmcm9tIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIGlubGluZSB1Y2ggZ2V0X2J5dGUodm9pZCkKK3sKKyAgICBpZiAoaW5ieXRlcykgeworCXVjaCBiID0gKmluYnVmKys7CisJaW5ieXRlcy0tOworCXJldHVybiBiOworICAgIH0gZWxzZSB7CisJcmV0dXJuIGZpbGxfaW5idWYoKTsJLyogSW5wdXQgYnVmZmVyIHVuZGVycnVuICovCisgICAgfQorfQorCisvKiBVbmdldCBieXRlIGZyb20gaW5wdXQgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgdW5nZXRfYnl0ZSh2b2lkKQoreworICAgIGluYnl0ZXMrKzsKKyAgICBpbmJ1Zi0tOworfQorCitzdGF0aWMgdWxnIGJ5dGVzX291dCA9IDA7CS8qIE51bWJlciBvZiBieXRlcyBvdXRwdXQgKi8KK3N0YXRpYyB1Y2ggKm91dHB1dF9kYXRhOwkvKiBPdXRwdXQgZGF0YSBwb2ludGVyICovCitzdGF0aWMgdWxnIG91dHB1dF9zaXplOwkJLyogTnVtYmVyIG9mIG91dHB1dCBieXRlcyBleHBlY3RlZCAqLworCitzdGF0aWMgdm9pZCAqbWFsbG9jKGludCBzaXplKTsKK3N0YXRpYyB2b2lkIGZyZWUodm9pZCAqd2hlcmUpOworCitzdGF0aWMgdWxnIGZyZWVfbWVtX3B0ciwgZnJlZV9tZW1fZW5kX3B0cjsKKworI2luY2x1ZGUgImluZmxhdGUuYyIKKworc3RhdGljIHZvaWQgKm1hbGxvYyhpbnQgc2l6ZSkKK3sKKyAgICB2b2lkICpwOworCisgICAgaWYgKHNpemUgPCAwKQorCWVycm9yKCJtYWxsb2MgZXJyb3IiKTsKKworICAgIGZyZWVfbWVtX3B0ciA9IChmcmVlX21lbV9wdHIgKyAzKSAmIH4zOwkvKiBBbGlnbiAqLworCisgICAgcCA9ICh2b2lkICopZnJlZV9tZW1fcHRyOworICAgIGZyZWVfbWVtX3B0ciArPSBzaXplOworCisgICAgaWYgKGZyZWVfbWVtX3B0ciA+PSBmcmVlX21lbV9lbmRfcHRyKQorCWVycm9yKCJvdXQgb2YgbWVtb3J5Iik7CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgZnJlZSh2b2lkICp3aGVyZSkKK3sKKyAgICAvKiBEb24ndCBjYXJlICovCisgICAgKHZvaWQpd2hlcmU7Cit9CisKK3N0YXRpYyB2b2lkIGd6aXBfbWFyayh2b2lkICoqcHRyKQoreworICAgICpwdHIgPSAodm9pZCAqKWZyZWVfbWVtX3B0cjsKK30KKworc3RhdGljIHZvaWQgZ3ppcF9yZWxlYXNlKHZvaWQgKipwdHIpCit7CisgICAgZnJlZV9tZW1fcHRyID0gKGxvbmcpKnB0cjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5CisgKiBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgcmVhbGx5IG5lZWRlZC4KKyAqLworc3RhdGljIGludCBmaWxsX2luYnVmKHZvaWQpCit7CisgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgV2UgaGF2ZSBhbHJlYWR5IHBvaW50ZWQgdGhlIGFsZ29yaXRobQorICAgICAgIHRvIGFsbCB0aGUgZGF0YSB3ZSBoYXZlLiAqLworICAgIGRpZSgiZmFpbGVkXG5EZWNvbXByZXNzaW9uIGVycm9yOiByYW4gb3V0IG9mIGlucHV0IGRhdGFcbiIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFdyaXRlIHRoZSBvdXRwdXQgd2luZG93IHdpbmRvd1swLi5vdXRjbnQtMV0gYW5kIHVwZGF0ZSBjcmMgYW5kIGJ5dGVzX291dC4KKyAqIChVc2VkIGZvciB0aGUgZGVjb21wcmVzc2VkIGRhdGEgb25seS4pCisgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX3dpbmRvdyh2b2lkKQoreworICAgIHVsZyBjID0gY3JjOwkJLyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCisgICAgdW5zaWduZWQgbjsKKyAgICB1Y2ggKmluLCAqb3V0LCBjaDsKKworICAgIGlmIChieXRlc19vdXQgKyBvdXRjbnQgPiBvdXRwdXRfc2l6ZSkKKwllcnJvcigib3V0cHV0IGJ1ZmZlciBvdmVycnVuIik7CisKKyAgICBpbiA9IHdpbmRvdzsKKyAgICBvdXQgPSBvdXRwdXRfZGF0YTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKKwljaCA9ICpvdXQrKyA9ICppbisrOworCWMgPSBjcmNfMzJfdGFiWyhjIF4gY2gpICYgMHhmZl0gXiAoYyA+PiA4KTsKKyAgICB9CisgICAgY3JjID0gYzsKKyAgICBvdXRwdXRfZGF0YSA9IG91dDsKKyAgICBieXRlc19vdXQgKz0gKHVsZykgb3V0Y250OworICAgIG91dGNudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGVycm9yKGNoYXIgKngpCit7CisgICAgZGllKCJmYWlsZWRcbkRlY29tcHJlc3Npb24gZXJyb3I6ICVzXG4iLCB4KTsKK30KKworLyogR1pJUCBoZWFkZXIgKi8KK3N0cnVjdCBnemlwX2hlYWRlciB7CisgICAgdWludDE2X3QgbWFnaWM7CisgICAgdWludDhfdCBtZXRob2Q7CisgICAgdWludDhfdCBmbGFnczsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXA7CisgICAgdWludDhfdCBleHRyYV9mbGFnczsKKyAgICB1aW50OF90IG9zX3R5cGU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKy8qIChmb2xsb3dlZCBieSBvcHRpb25hbCBhbmQgdmFyaWFibGUgbGVuZ3RoICJleHRyYSIsICJvcmlnaW5hbCBuYW1lIiwKKyAgIGFuZCAiY29tbWVudCIgZmllbGRzKSAqLworCitzdHJ1Y3QgZ3ppcF90cmFpbGVyIHsKKyAgICB1aW50MzJfdCBjcmM7CisgICAgdWludDMyX3QgZGJ5dGVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFBLWklQIGhlYWRlci4gIFNlZQorICogPGh0dHA6Ly93d3cucGt3YXJlLmNvbS9wcm9kdWN0cy9lbnRlcnByaXNlL3doaXRlX3BhcGVycy9hcHBub3RlLmh0bWw+LgorICovCitzdHJ1Y3QgcGt6aXBfaGVhZGVyIHsKKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB1aW50MTZfdCB2ZXJzaW9uOworICAgIHVpbnQxNl90IGZsYWdzOworICAgIHVpbnQxNl90IG1ldGhvZDsKKyAgICB1aW50MTZfdCBtb2RpZmllZF90aW1lOworICAgIHVpbnQxNl90IG1vZGlmaWVkX2RhdGU7CisgICAgdWludDMyX3QgY3JjOworICAgIHVpbnQzMl90IHpieXRlczsKKyAgICB1aW50MzJfdCBkYnl0ZXM7CisgICAgdWludDE2X3QgZmlsZW5hbWVfbGVuOworICAgIHVpbnQxNl90IGV4dHJhX2xlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworLyogKGZvbGxvd2VkIGJ5IG9wdGlvbmFsIGFuZCB2YXJpYWJsZSBsZW5ndGggImZpbGVuYW1lIiBhbmQgImV4dHJhIgorICAgZmllbGRzKSAqLworCisvKiBnemlwIGZsYWcgYnl0ZSAqLworI2RlZmluZSBBU0NJSV9GTEFHICAgMHgwMQkvKiBiaXQgMCBzZXQ6IGZpbGUgcHJvYmFibHkgQVNDSUkgdGV4dCAqLworI2RlZmluZSBDT05USU5VQVRJT04gMHgwMgkvKiBiaXQgMSBzZXQ6IGNvbnRpbnVhdGlvbiBvZiBtdWx0aS1wYXJ0IGd6aXAgZmlsZSAqLworI2RlZmluZSBFWFRSQV9GSUVMRCAgMHgwNAkvKiBiaXQgMiBzZXQ6IGV4dHJhIGZpZWxkIHByZXNlbnQgKi8KKyNkZWZpbmUgT1JJR19OQU1FICAgIDB4MDgJLyogYml0IDMgc2V0OiBvcmlnaW5hbCBmaWxlIG5hbWUgcHJlc2VudCAqLworI2RlZmluZSBDT01NRU5UICAgICAgMHgxMAkvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCisjZGVmaW5lIEVOQ1JZUFRFRCAgICAweDIwCS8qIGJpdCA1IHNldDogZmlsZSBpcyBlbmNyeXB0ZWQgKi8KKyNkZWZpbmUgUkVTRVJWRUQgICAgIDB4QzAJLyogYml0IDYsNzogICByZXNlcnZlZCAqLworCisvKiBwa3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgUEtfRU5DUllQVEVEICAgICAweDAxCS8qIGJpdCAwIHNldDogZmlsZSBpcyBlbmNyeXB0ZWQgKi8KKyNkZWZpbmUgUEtfREFUQURFU0MgICAgICAgMHgwOAkvKiBiaXQgMyBzZXQ6IGZpbGUgaGFzIHRyYWlsaW5nICJkYXRhCisJCQkJICAgZGVzY3JpcHRvciIgKi8KKyNkZWZpbmUgUEtfVU5TVVBQT1JURUQgICAgMHhGRkYwCS8qIEFsbCBvdGhlciBiaXRzIG11c3QgYmUgemVybyAqLworCisvKiBSZXR1cm4gMCBpZiAoaW5kYXRhLCBzaXplKSBwb2ludHMgdG8gYSBaSVAgZmlsZSwgYW5kIGZpbGwgaW4KKyAgIGNvbXByZXNzZWQgZGF0YSBzaXplLCB1bmNvbXByZXNzZWQgZGF0YSBzaXplLCBDUkMsIGFuZCBvZmZzZXQgb2YKKyAgIGRhdGEuCisKKyAgIElmIGluZGF0YSBpcyBub3QgYSBaSVAgZmlsZSwgcmV0dXJuIC0xLiAqLworaW50IGNoZWNrX3ppcCh2b2lkICppbmRhdGEsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90ICogemJ5dGVzX3AsCisJICAgICAgdWludDMyX3QgKiBkYnl0ZXNfcCwgdWludDMyX3QgKiBvcmlnX2NyYywgdWludDMyX3QgKiBvZmZzZXRfcCkKK3sKKyAgICBzdHJ1Y3QgZ3ppcF9oZWFkZXIgKmd6aCA9IChzdHJ1Y3QgZ3ppcF9oZWFkZXIgKilpbmRhdGE7CisgICAgc3RydWN0IHBremlwX2hlYWRlciAqcGt6aCA9IChzdHJ1Y3QgcGt6aXBfaGVhZGVyICopaW5kYXRhOworICAgIHVpbnQzMl90IG9mZnNldDsKKworICAgIGlmIChnemgtPm1hZ2ljID09IDB4OGIxZikgeworCXN0cnVjdCBnemlwX3RyYWlsZXIgKmd6dCA9IGluZGF0YSArIHNpemUgLSBzaXplb2Yoc3RydWN0IGd6aXBfdHJhaWxlcik7CisJLyogV2Ugb25seSBzdXBwb3J0IG1ldGhvZCAjOCwgREVGTEFURUQgKi8KKwlpZiAoZ3poLT5tZXRob2QgIT0gOCkgeworCSAgICBlcnJvcigiZ3ppcCBmaWxlIHVzZXMgaW52YWxpZCBtZXRob2QiKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwlpZiAoZ3poLT5mbGFncyAmIEVOQ1JZUFRFRCkgeworCSAgICBlcnJvcigiZ3ppcCBmaWxlIGlzIGVuY3J5cHRlZDsgbm90IHN1cHBvcnRlZCIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWlmIChnemgtPmZsYWdzICYgQ09OVElOVUFUSU9OKSB7CisJICAgIGVycm9yKCJnemlwIGZpbGUgaXMgYSBjb250aW51YXRpb24gZmlsZTsgbm90IHN1cHBvcnRlZCIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWlmIChnemgtPmZsYWdzICYgUkVTRVJWRUQpIHsKKwkgICAgZXJyb3IoImd6aXAgZmlsZSBoYXMgdW5zdXBwb3J0ZWQgZmxhZ3MiKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwlvZmZzZXQgPSBzaXplb2YoKmd6aCk7CisJaWYgKGd6aC0+ZmxhZ3MgJiBFWFRSQV9GSUVMRCkgeworCSAgICAvKiBTa2lwIGV4dHJhIGZpZWxkICovCisJICAgIHVuc2lnbmVkIGxlbiA9ICoodW5zaWduZWQgKikoaW5kYXRhICsgb2Zmc2V0KTsKKwkgICAgb2Zmc2V0ICs9IDIgKyBsZW47CisJfQorCWlmIChnemgtPmZsYWdzICYgT1JJR19OQU1FKSB7CisJICAgIC8qIERpc2NhcmQgdGhlIG9sZCBuYW1lICovCisJICAgIHVpbnQ4X3QgKnAgPSBpbmRhdGE7CisJICAgIHdoaWxlIChwW29mZnNldF0gIT0gMCAmJiBvZmZzZXQgPCBzaXplKSB7CisJCW9mZnNldCsrOworCSAgICB9CisJICAgIG9mZnNldCsrOworCX0KKworCWlmIChnemgtPmZsYWdzICYgQ09NTUVOVCkgeworCSAgICAvKiBEaXNjYXJkIHRoZSBjb21tZW50ICovCisJICAgIHVpbnQ4X3QgKnAgPSBpbmRhdGE7CisJICAgIHdoaWxlIChwW29mZnNldF0gIT0gMCAmJiBvZmZzZXQgPCBzaXplKSB7CisJCW9mZnNldCsrOworCSAgICB9CisJICAgIG9mZnNldCsrOworCX0KKworCWlmIChvZmZzZXQgPiBzaXplKSB7CisJICAgIGVycm9yKCJnemlwIGZpbGUgY29ycnVwdCIpOworCSAgICByZXR1cm4gLTE7CisJfQorCSp6Ynl0ZXNfcCA9IHNpemUgLSBvZmZzZXQgLSBzaXplb2Yoc3RydWN0IGd6aXBfdHJhaWxlcik7CisJKmRieXRlc19wID0gZ3p0LT5kYnl0ZXM7CisJKm9yaWdfY3JjID0gZ3p0LT5jcmM7CisJKm9mZnNldF9wID0gb2Zmc2V0OworCXJldHVybiAwOworICAgIH0gZWxzZSBpZiAocGt6aC0+bWFnaWMgPT0gMHgwNDAzNGI1MFVMKSB7CisJLyogTWFnaWMgbnVtYmVyIG1hdGNoZXMgcGt6aXAgZmlsZS4gKi8KKworCW9mZnNldCA9IHNpemVvZigqcGt6aCk7CisJaWYgKHBremgtPmZsYWdzICYgUEtfRU5DUllQVEVEKSB7CisJICAgIGVycm9yKCJwa3ppcCBmaWxlIGlzIGVuY3J5cHRlZDsgbm90IHN1cHBvcnRlZCIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWlmIChwa3poLT5mbGFncyAmIFBLX0RBVEFERVNDKSB7CisJICAgIGVycm9yKCJwa3ppcCBmaWxlIHVzZXMgZGF0YV9kZXNjcmlwdG9yIGZpZWxkOyBub3Qgc3VwcG9ydGVkIik7CisJICAgIHJldHVybiAtMTsKKwl9CisJaWYgKHBremgtPmZsYWdzICYgUEtfVU5TVVBQT1JURUQpIHsKKwkgICAgZXJyb3IoInBremlwIGZpbGUgaGFzIHVuc3VwcG9ydGVkIGZsYWdzIik7CisJICAgIHJldHVybiAtMTsKKwl9CisKKwkvKiBXZSBvbmx5IHN1cHBvcnQgbWV0aG9kICM4LCBERUZMQVRFRCAqLworCWlmIChwa3poLT5tZXRob2QgIT0gOCkgeworCSAgICBlcnJvcigicGt6aXAgZmlsZSB1c2VzIGludmFsaWQgbWV0aG9kIik7CisJICAgIHJldHVybiAtMTsKKwl9CisJLyogc2tpcCBoZWFkZXIgKi8KKwlvZmZzZXQgPSBzaXplb2YoKnBremgpOworCS8qIHNraXAgZmlsZW5hbWUgKi8KKwlvZmZzZXQgKz0gcGt6aC0+ZmlsZW5hbWVfbGVuOworCS8qIHNraXAgZXh0cmEgZmllbGQgKi8KKwlvZmZzZXQgKz0gcGt6aC0+ZXh0cmFfbGVuOworCisJaWYgKG9mZnNldCArIHBremgtPnpieXRlcyA+IHNpemUpIHsKKwkgICAgZXJyb3IoInBremlwIGZpbGUgY29ycnVwdCIpOworCSAgICByZXR1cm4gLTE7CisJfQorCisJKnpieXRlc19wID0gcGt6aC0+emJ5dGVzOworCSpkYnl0ZXNfcCA9IHBremgtPmRieXRlczsKKwkqb3JpZ19jcmMgPSBwa3poLT5jcmM7CisJKm9mZnNldF9wID0gb2Zmc2V0OworCXJldHVybiAwOworICAgIH0gZWxzZSB7CisJLyogTWFnaWMgbnVtYmVyIGRvZXMgbm90IG1hdGNoLiAqLworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBlcnJvcigiSW50ZXJuYWwgZXJyb3IgaW4gY2hlY2tfemlwIik7CisgICAgcmV0dXJuIC0xOworfQorCisvKgorICogRGVjb21wcmVzcyB0aGUgaW1hZ2UsIHRyeWluZyB0byBmbHVzaCB0aGUgZW5kIG9mIGl0IGFzIGNsb3NlCisgKiB0byBlbmRfbWVtIGFzIHBvc3NpYmxlLiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZGF0YSBibG9jaywKKyAqIGFuZCBjaGFuZ2UgZGF0YWxlbi4KKyAqLworZXh0ZXJuIHZvaWQgX2VuZDsKKworc3RhdGljIGNoYXIgaGVhcFs2NTUzNl07CisKK3ZvaWQgKnVuemlwKHZvaWQgKmluZGF0YSwgdWludDMyX3QgemJ5dGVzLCB1aW50MzJfdCBkYnl0ZXMsCisJICAgIHVpbnQzMl90IG9yaWdfY3JjLCB2b2lkICp0YXJnZXQpCit7CisgICAgLyogU2V0IHVwIHRoZSBoZWFwOyBpdCBpcyBzaW1wbHkgYSBjaHVuayBvZiBic3MgbWVtb3J5ICovCisgICAgZnJlZV9tZW1fcHRyICAgICA9IChzaXplX3QpaGVhcDsKKyAgICBmcmVlX21lbV9lbmRfcHRyID0gKHNpemVfdCloZWFwICsgc2l6ZW9mIGhlYXA7CisKKyAgICAvKiBTZXQgdXAgaW5wdXQgYnVmZmVyICovCisgICAgaW5idWYgPSBpbmRhdGE7CisgICAgLyogU29tZXRpbWVzIGluZmxhdGUoKSBsb29rcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLAorICAgICAgIGJ1dCBpdCBhbHdheXMgYmFja3MgdXAgYmVmb3JlIGl0IGlzIGRvbmUuICBTbyB3ZSBnaXZlIGl0IDQgYnl0ZXMKKyAgICAgICBvZiBzbGFjay4gKi8KKyAgICBpbnNpemUgPSBpbmJ5dGVzID0gemJ5dGVzICsgNDsKKworICAgIC8qIFNldCB1cCBvdXRwdXQgYnVmZmVyICovCisgICAgb3V0Y250ID0gMDsKKyAgICBvdXRwdXRfZGF0YSA9IHRhcmdldDsKKyAgICBvdXRwdXRfc2l6ZSA9IGRieXRlczsKKyAgICBieXRlc19vdXQgPSAwOworCisgICAgbWFrZWNyYygpOworICAgIGd1bnppcCgpOworCisgICAgLyogVmVyaWZ5IHRoYXQgZ3VuemlwKCkgY29uc3VtZWQgdGhlIGVudGlyZSBpbnB1dC4gKi8KKyAgICBpZiAoaW5ieXRlcyAhPSA0KQorCWVycm9yKCJjb21wcmVzc2VkIGRhdGEgbGVuZ3RoIGVycm9yIik7CisKKyAgICAvKiBDaGVjayB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbGVuZ3RoIGFuZCBDUkMuICovCisgICAgaWYgKGJ5dGVzX291dCAhPSBkYnl0ZXMpCisJZXJyb3IoInVuY29tcHJlc3NlZCBkYXRhIGxlbmd0aCBlcnJvciIpOworCisgICAgaWYgKG9yaWdfY3JjICE9IENSQ19WQUxVRSkKKwllcnJvcigiY3JjIGVycm9yIik7CisKKyAgICBwdXRzKCJva1xuIik7CisKKyAgICByZXR1cm4gdGFyZ2V0OworfQpkaWZmIC0tZ2l0IGEvbWVtZGlzay92ZXJzaW9uLmggYi9tZW1kaXNrL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmJjN2JiCi0tLSAvZGV2L251bGwKKysrIGIvbWVtZGlzay92ZXJzaW9uLmgKQEAgLTAsMCArMSwyNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDItMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogdmVyc2lvbi5oCisgKgorICogTUVNRElTSyB2ZXJzaW9uIGRhdGEKKyAqLworCisjaWZuZGVmIE1FTURJU0tfVkVSU0lPTl9ICisjZGVmaW5lIE1FTURJU0tfVkVSU0lPTl9ICisKKyNkZWZpbmUgRklSU1RZRUFSICIyMDAxIgorI2RlZmluZSBDT1BZWUVBUiAgIjIwMDgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVtZGlzay94ODZfNjQvbWVtZGlzay5sZCBiL21lbWRpc2sveDg2XzY0L21lbWRpc2subGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhYmIwYwotLS0gL2Rldi9udWxsCisrKyBiL21lbWRpc2sveDg2XzY0L21lbWRpc2subGQKQEAgLTAsMCArMSwxNDAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgTUVNRElTSworICovCisKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VYVEVSTihfc3RhcnQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDB4MTAwMDAwOworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAuKTsKKworICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorCisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDQpOworICBQUk9WSURFIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDogeyAqKC5wcmVpbml0X2FycmF5KSB9CisgIFBST1ZJREUgKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERSAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6IHsgKiguaW5pdF9hcnJheSkgfQorICBQUk9WSURFIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREUgKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOiB7ICooLmZpbmlfYXJyYXkpIH0KKyAgUFJPVklERSAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFIChfX2N0b3JzX3N0YXJ0ID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgUFJPVklERSAoX19jdG9yc19lbmQgPSAuKTsKKyAgUFJPVklERSAoX19kdG9yc19zdGFydCA9IC4pOworICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIFBST1ZJREUgKF9fZHRvcnNfZW5kID0gLik7CisKKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgQXZvaWQgbWl4aW5nIGNvZGUgYW5kCisgICAgIGRhdGEgd2l0aGluIHNhbWUgMTI4LWJ5dGUgY2h1bmsuICovCisgIC4gPSBBTElHTigxMjgpOworCisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gQUxJR04oMTYpOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICBfX2Jzc19zdGFydCA9IC47CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDQpOworICAgX19ic3NfZW5kID0gLjsKKyAgfQorICBfZW5kID0gLjsKKyAgUFJPVklERSAoZW5kID0gLik7CisKKworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgfQorfQpkaWZmIC0tZ2l0IGEvbWltZS9pbWFnZS94LWxzczE2LnhtbCBiL21pbWUvaW1hZ2UveC1sc3MxNi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzZjQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL21pbWUvaW1hZ2UveC1sc3MxNi54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWltZS1pbmZvIHhtbG5zPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvc2hhcmVkLW1pbWUtaW5mbyc+CisgIDxtaW1lLXR5cGUgdHlwZT0iaW1hZ2UveC1sc3MxNiI+CisgICAgPGNvbW1lbnQ+TFNTMTYgaW1hZ2U8L2NvbW1lbnQ+CisJPGNvbW1lbnQgeG1sOmxhbmc9ImJlQGxhdGluIj5WeWphdmEgTFNTMTY8L2NvbW1lbnQ+CisgICAgPGNvbW1lbnQgeG1sOmxhbmc9ImJnIj7QmNC30L7QsdGA0LDQttC10L3QuNC1IOKAlCBMU1MxNjwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0iY2EiPmltYXRnZSBMU1MxNjwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0iY3MiPk9icsOhemVrIExTUzE2PC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJkZSI+TFNTMTYtQmlsZDwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0iZW5fR0IiPkxTUzE2IGltYWdlPC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJlcyI+aW1hZ2VuIExTUzE2PC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJldSI+TFNTMTYgaXJ1ZGlhPC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJmaSI+TFNTMTYta3V2YTwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0iZnIiPmltYWdlIExTUzE2PC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJnYSI+w61vbWjDoSBMU1MxNjwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0iaHUiPkxTUzE2IGvDqXA8L2NvbW1lbnQ+CisgICAgPGNvbW1lbnQgeG1sOmxhbmc9ImlkIj5DaXRyYSBMU1MxNjwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0iaXQiPkltbWFnaW5lIExTUzE2PC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJqYSI+TFNTMTYg55S75YOPPC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJrbyI+TFNTMTYg6re466a8PC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJsdCI+TFNTMTYgcGF2ZWlrc2zEl2xpczwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0ibmIiPkxTUzE2LWJpbGRlPC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJubCI+TFNTMTYtYWZiZWVsZGluZzwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0ibm4iPkxTUzE2LWJpbGV0ZTwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0icGwiPk9icmF6IExTUzE2PC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJwdF9CUiI+SW1hZ2VtIExTUzE2PC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJydSI+0LjQt9C+0LHRgNCw0LbQtdC90LjQtSBMU1MxNjwvY29tbWVudD4KKyAgICA8Y29tbWVudCB4bWw6bGFuZz0ic3EiPkZpZ3Vyw6sgTFNTMTY8L2NvbW1lbnQ+CisgICAgPGNvbW1lbnQgeG1sOmxhbmc9InN2Ij5MU1MxNi1iaWxkPC9jb21tZW50PgorICAgIDxjb21tZW50IHhtbDpsYW5nPSJ1ayI+0JfQvtCx0YDQsNC20LXQvdC90Y8gTFNTMTY8L2NvbW1lbnQ+CisgICAgPGNvbW1lbnQgeG1sOmxhbmc9InZpIj7huqJuaCBMU1MxNjwvY29tbWVudD4KKyAgICA8YWNyb255bT5sc3MxNjwvYWNyb255bT4KKyAgICA8ZXhwYW5kZWQtYWNyb255bT5TWVNMSU5VWCcgTFNTMTYgaW1hZ2UgZGF0YTwvZXhwYW5kZWQtYWNyb255bT4KKyAgICA8Z2xvYiBwYXR0ZXJuPSIqLmxzcyIgLz4KKyAgICA8bWFnaWMgcHJpb3JpdHk9IjUwIj4KKyAgICAgIDxtYXRjaCB2YWx1ZT0iMHgxNDEzZjMzZCIgdHlwZT0ibGl0dGxlMzIiIG9mZnNldD0iMCIvPgorICAgIDwvbWFnaWM+CisgIDwvbWltZS10eXBlPgorPC9taW1lLWluZm8+CmRpZmYgLS1naXQgYS9tay9idWlsZC5tayBiL21rL2J1aWxkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTgyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tay9idWlsZC5tawpAQCAtMCwwICsxLDMzIEBACisjIyAtKi0gbWFrZWZpbGUgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyMgUmlnaHQgbm93IHdlIGRvbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gImJ1aWxkIiBzeXN0ZW0gYW5kIHRoZSAiaG9zdCIKKyMjIHN5c3RlbSwgYWx0aG91Z2ggd2UgcmVhbGx5IHNob3VsZC4uLgorIyMKK2luY2x1ZGUgJChNQUtFRElSKS9zeXNsaW51eC5taworCitPUFRGTEFHUyAgID0gLWcgLU9zCitJTkNMVURFUyAgID0KK0NGTEFHUyAgICAgPSAtVyAtV2FsbCAtV25vLXNpZ24tY29tcGFyZSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IFwKKyAgICAgICAgICAgICAkKE9QVEZMQUdTKSAkKElOQ0xVREVTKQorTERGTEFHUyAgICA9CitMSUJTCSAgID0KKworLlNVRkZJWEVTOiAuYyAubyAuUyAucyAuaSAuZWxmIC5jb20gLmJpbiAuYXNtIC5sc3QgLmMzMiAubHNzCisKKyUubzogJS5jCisJJChDQykgJChVTUFLRURFUFMpICQoQ0ZMQUdTKSAtYyAtbyAkQCAkPAorJS5pOiAlLmMKKwkkKENDKSAkKFVNQUtFREVQUykgJChDRkxBR1MpIC1FIC1vICRAICQ8CislLnM6ICUuYworCSQoQ0MpICQoVU1BS0VERVBTKSAkKENGTEFHUykgLVMgLW8gJEAgJDwKZGlmZiAtLWdpdCBhL21rL2NvbTMyLm1rIGIvbWsvY29tMzIubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzYjE5ZAotLS0gL2Rldi9udWxsCisrKyBiL21rL2NvbTMyLm1rCkBAIC0wLDAgKzEsMTE4IEBACisjIyAtKi0gbWFrZWZpbGUgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDA4LTIwMDkgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisjIyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIyBDT00zMiBjb21tb24gY29uZmlndXJhYmxlcworIyMKKworaW5jbHVkZSAkKE1BS0VESVIpL3N5c2xpbnV4Lm1rCisKKyMgU3VwcG9ydCBJQTMyIGFuZCB4ODZfNjQgcGxhdGZvcm1zIHdpdGggb25lIGJ1aWxkCisjIFNldCB1cCBhcmNoaXRlY3R1cmUgc3BlY2lmaWNzOyBmb3IgY3Jvc3MgY29tcGlsYXRpb24sIHNldCBBUkNIIGFzIGFwdAorR0NDT1BUIDo9ICQoY2FsbCBnY2Nfb2ssLXN0ZD1nbnU5OSwpCitpZmVxICgkKHN0cmlwICQoQVJDSCkpLGkzODYpCisJR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLW0zMiwpCisJR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLW1hcmNoPWkzODYpCisJR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiwpCisJR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWluY29taW5nLXN0YWNrLWJvdW5kYXJ5PTIsKQorZW5kaWYKK2lmZXEgKCQoc3RyaXAgJChBUkNIKSkseDg2XzY0KQorCUdDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1tNjQsKQorCUdDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1tYXJjaD14ODYtNjQpCisJI2xldCB0aGUgc3RhY2stYm91bmRhcnkgZGVmYXVsdCB0byB3aGF0ZXZlciBpdCBpcyBvbiA2NGJpdAorCSNHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT04LCkKKwkjR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWluY29taW5nLXN0YWNrLWJvdW5kYXJ5PTgsKQorZW5kaWYKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mbm8tc3RhY2stcHJvdGVjdG9yLCkKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1md3JhcHYsKQorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZyZWctc3RydWN0LXJldHVybiwpCitHQ0NPUFQgKz0gLU9zCisjIE5vdGUgLWZQSUUgZG9lcyBub3Qgd29yayB3aXRoIGxkIG9uIHg4Nl82NCwgdHJ5IC1mUElDIGluc3RlYWQKKyMgRG9lcyBCSU9TIGJ1aWxkIHJlcXVpcmUgLWZQSUU/CitHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtZlBJQykKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mbm8tZXhjZXB0aW9ucywpCitHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzLCkKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mbm8tc3RyaWN0LWFsaWFzaW5nLCkKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mYWxpZ24tZnVuY3Rpb25zPTAsLW1hbGlnbi1mdW5jdGlvbnM9MCkKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mYWxpZ24tanVtcHM9MCwtbWFsaWduLWp1bXBzPTApCitHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtZmFsaWduLWxhYmVscz0wLC1tYWxpZ24tbGFiZWxzPTApCitHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtZmFsaWduLWxvb3BzPTAsLW1hbGlnbi1sb29wcz0wKQorCitpZm5kZWYgRUZJX0JVSUxECitHQ0NPUFQgKz0gLW1yZWdwYXJtPTMgLURSRUdQQVJNPTMKK2VuZGlmCisKK2NvbTMyICA6PSAkKHRvcGRpcikvY29tMzIKK1JFTE9DUyA6PSAkKGNvbTMyKS90b29scy9yZWxvY3MKKworaWZuZXEgKCQoTk9HUEwpLDEpCitHUExMSUIgICAgID0gJChjb20zMikvZ3BsbGliL2xpYmNvbTMyZ3BsLmEKK0dQTElOQ0xVREUgPSAtSSQoY29tMzIpL2dwbGluY2x1ZGUKK2Vsc2UKK0dQTExJQiAgICAgPQorR1BMSU5DTFVERSA9CitlbmRpZgorCitDRkxBR1MgICAgID0gJChHQ0NPUFQpICQoR0NDV0FSTikgXAorCSAgICAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLURfX0NPTTMyX18gLURfX0ZJUk1XQVJFXyQoRklSTVdBUkUpX18gXAorCSAgICAgLW5vc3RkaW5jIC1pd2l0aHByZWZpeCBpbmNsdWRlIFwKKwkgICAgIC1JJChjb20zMikvbGlidXRpbC9pbmNsdWRlIC1JJChjb20zMikvaW5jbHVkZSBcCisJICAgICAtSSQoY29tMzIpL2luY2x1ZGUvc3lzICQoR1BMSU5DTFVERSkKK1NGTEFHUyAgICAgPSAkKEdDQ09QVCkgJChHQ0NXQVJOKSBcCisJICAgICAtZm9taXQtZnJhbWUtcG9pbnRlciAtRF9fQ09NMzJfXyAtRF9fRklSTVdBUkVfJChGSVJNV0FSRSlfXyBcCisJICAgICAtbm9zdGRpbmMgLWl3aXRocHJlZml4IGluY2x1ZGUgXAorCSAgICAgLUkkKGNvbTMyKS9saWJ1dGlsL2luY2x1ZGUgLUkkKGNvbTMyKS9pbmNsdWRlIFwKKwkgICAgIC1JJChjb20zMikvaW5jbHVkZS9zeXMgJChHUExJTkNMVURFKQorCitDT00zMkxECSAgID0gJChjb20zMikvbGliLyQoQVJDSCkvZWxmLmxkCitMREZMQUdTICAgID0gLW0gZWxmXyQoQVJDSCkgLXNoYXJlZCAtLWhhc2gtc3R5bGU9Z251IC1UICQoQ09NMzJMRCkKK0xJQkdDQyAgICA6PSAkKHNoZWxsICQoQ0MpICQoR0NDT1BUKSAtLXByaW50LWxpYmdjYykKKworTE5YQ0ZMQUdTICA9IC1JJChjb20zMikvbGlidXRpbC9pbmNsdWRlICQoR0NDV0FSTikgLU8gLWcgXAorCSAgICAgLURfR05VX1NPVVJDRSAtRF9GT1JUSUZZX1NPVVJDRT0wIC1Xbm8tZXJyb3IKK0xOWFNGTEFHUyAgPSAtZworTE5YTERGTEFHUyA9IC1nCisKK0NfTElCUwkgICA9ICQoR1BMTElCKSAkKGNvbTMyKS9saWIvbGliY29tMzIuYzMyICQoTElCR0NDKQorQ19MTlhMSUJTICA9ICQoY29tMzIpL2xpYnV0aWwvbGlidXRpbF9sbnguYQorCisuU1VGRklYRVM6IC5sc3MgLmMgLmxvIC5vIC5lbGYgLmMzMiAubG54CisKKy5QUkVDSU9VUzogJS5vCislLm86ICUuUworCSQoQ0MpICQoTUFLRURFUFMpICQoU0ZMQUdTKSAtYyAtbyAkQCAkPAorCisuUFJFQ0lPVVM6ICUubworJS5vOiAlLmMKKwkkKENDKSAkKE1BS0VERVBTKSAkKENGTEFHUykgLWMgLW8gJEAgJDwKKworLlBSRUNJT1VTOiAlLmVsZgorJS5lbGY6ICUubyAkKExJQlMpICQoQ19MSUJTKSAkKENPTTMyTEQpCisJJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKGZpbHRlci1vdXQgJChDT00zMkxEKSwkXikKKworLlBSRUNJT1VTOiAlLmxvCislLmxvOiAlLlMKKwkkKENDKSAkKE1BS0VERVBTKSAkKExOWFNGTEFHUykgLWMgLW8gJEAgJDwKKworLlBSRUNJT1VTOiAlLmxvCislLmxvOiAlLmMKKwkkKENDKSAkKE1BS0VERVBTKSAkKExOWENGTEFHUykgLWMgLW8gJEAgJDwKKworLlBSRUNJT1VTOiAlLmxueAorJS5sbng6ICUubG8gJChMTlhMSUJTKSAkKENfTE5YTElCUykKKwkkKENDKSAkKExOWENGTEFHUykgLW8gJEAgJF4KKworJS5jMzI6ICUuZWxmCisJJChPQkpDT1BZKSAtLXN0cmlwLWRlYnVnIC0tc3RyaXAtdW5uZWVkZWQgJDwgJEAKKwkjIyQoT0JKQ09QWSkgLU8gYmluYXJ5ICQ8ICRACisJIyMkKFJFTE9DUykgJDwgPj4gJEAgfHwgKCBybSAtZiAkQCA7IGZhbHNlICkKZGlmZiAtLWdpdCBhL21rL2VmaS5tayBiL21rL2VmaS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDk3YWQyCi0tLSAvZGV2L251bGwKKysrIGIvbWsvZWZpLm1rCkBAIC0wLDAgKzEsNjcgQEAKK2luY2x1ZGUgJChNQUtFRElSKS9zeXNsaW51eC5taworCitjb20zMiA9ICQodG9wZGlyKS9jb20zMgorY29yZSA9ICQodG9wZGlyKS9jb3JlCisKKyMgU3VwcG9ydCBJQTMyIGFuZCB4ODZfNjQgcGxhdGZvcm1zIHdpdGggb25lIGJ1aWxkCisjIFNldCB1cCBhcmNoaXRlY3R1cmUgc3BlY2lmaWNzOyBmb3IgY3Jvc3MgY29tcGlsYXRpb24sIHNldCBBUkNIIGFzIGFwdAorIyBnbnVlZmkgc2V0cyB1cCBhcmNoaXRlY3R1cmUgc3BlY2lmaWNzIGluIGlhMzIgb3IgeDg2XzY0IHN1YiBkaXJlY3RvcmllcworIyBzZXQgdXAgdGhlIExJQkRJUiBhbmQgRUZJSU5DIGZvciBidWlsZGluZyBmb3IgdGhlIGFwcHJvcHJpYXRlIGFyY2hpdGVjdHVyZQorR0NDT1BUIDo9ICQoY2FsbCBnY2Nfb2ssLWZuby1zdGFjay1wcm90ZWN0b3IsKQorRUZJSU5DID0gJChvYmpkaXIpL2luY2x1ZGUvZWZpCitMSUJESVIgID0gJChvYmpkaXIpL2xpYgorCitpZmVxICgkKEFSQ0gpLGkzODYpCisJQVJDSE9QVCA9IC1tMzIgLW1hcmNoPWkzODYKKwlFRklfU1VCQVJDSCA9IGlhMzIKK2VuZGlmCitpZmVxICgkKEFSQ0gpLHg4Nl82NCkKKwlBUkNIT1BUID0gLW02NCAtbWFyY2g9eDg2LTY0CisJRUZJX1NVQkFSQ0ggPSAkKEFSQ0gpCitlbmRpZgorCisjTElCRElSPS91c3IvbGliCitGT1JNQVQ9ZWZpLWFwcC0kKEVGSV9TVUJBUkNIKQorCitDRkxBR1MgPSAtSSQoRUZJSU5DKSAtSSQoRUZJSU5DKS8kKEVGSV9TVUJBUkNIKSBcCisJCS1ERUZJX0ZVTkNUSU9OX1dSQVBQRVIgLWZQSUMgLWZzaG9ydC13Y2hhciAtZmZyZWVzdGFuZGluZyBcCisJCS1XYWxsIC1JJChjb20zMikvaW5jbHVkZSAtSSQoY29tMzIpL2luY2x1ZGUvc3lzIFwKKwkJLUkkKGNvcmUpL2luY2x1ZGUgLUkkKGNvcmUpLyAkKEFSQ0hPUFQpIFwKKwkJLUkkKGNvbTMyKS9saWIvIC1JJChjb20zMikvbGlidXRpbC9pbmNsdWRlIC1zdGQ9Z251OTkgXAorCQktREVMRl9ERUJVRyAtRFNZU0xJTlVYX0VGSSAtSSQob2JqZGlyKSBcCisJCSQoR0NDV0FSTikgLURfX0NPTTMyX18gLURfX0ZJUk1XQVJFXyQoRklSTVdBUkUpX18gLW1uby1yZWQtem9uZSBcCisJCS1ETERMSU5VWD1cIiQoTERMSU5VWClcIiAtZnZpc2liaWxpdHk9aGlkZGVuIFwKKwkJLVduby11bnVzZWQtcGFyYW1ldGVyICQoR0NDT1BUKQorCitDUlQwIDo9ICQoTElCRElSKS9jcnQwLWVmaS0kKEVGSV9TVUJBUkNIKS5vCitMRFNDUklQVCA6PSAkKExJQkRJUikvZWxmXyQoRUZJX1NVQkFSQ0gpX2VmaS5sZHMKKworTERGTEFHUyA9IC1UICQoU1JDKS8kKEFSQ0gpL3N5c2xpbnV4LmxkIC1Cc3ltYm9saWMgLXBpZSAtbm9zdGRsaWIgLXpub2NvbWJyZWxvYyBcCisJCS1MJChMSUJESVIpIC0taGFzaC1zdHlsZT1nbnUgLW0gZWxmXyQoQVJDSCkgJChDUlQwKSAtRQorCitTRkxBR1MgICAgID0gJChHQ0NPUFQpICQoR0NDV0FSTikgJChBUkNIT1BUKSBcCisJICAgICAtZm9taXQtZnJhbWUtcG9pbnRlciAtRF9fQ09NMzJfXyAtRF9fRklSTVdBUkVfJChGSVJNV0FSRSlfXyBcCisJICAgICAtbm9zdGRpbmMgLWl3aXRocHJlZml4IGluY2x1ZGUgXAorCSAgICAgLUkkKGNvbTMyKS9saWJ1dGlsL2luY2x1ZGUgLUkkKGNvbTMyKS9pbmNsdWRlIC1JJChjb20zMikvaW5jbHVkZS9zeXMgJChHUExJTkNMVURFKQorCitMSUJFRkkgPSAkKG9iamRpcikvbGliL2xpYmVmaS5hCisKKyQoTElCRUZJKToKKwlAZWNobyBCdWlsZGluZyBnbnUtZWZpIGZvciAkKEVGSV9TVUJBUkNIKQorCSQodG9wZGlyKS9lZmkvY2hlY2stZ251LWVmaS5zaCAkKEVGSV9TVUJBUkNIKSAkKG9iamRpcikKKworJS5vOiAlLlMJIyBDYW5jZWwgb2xkIHJ1bGUKKworJS5vOiAlLmMKKworLlBSRUNJT1VTOiAlLm8KKyUubzogJS5TICQoTElCRUZJKQorCSQoQ0MpICQoU0ZMQUdTKSAtYyAtbyAkQCAkPAorCisuUFJFQ0lPVVM6ICUubworJS5vOiAlLmMgJChMSUJFRkkpCisJJChDQykgJChDRkxBR1MpIC1jIC1vICRAICQ8CisKKyMlLmVmaTogJS5zbworIwkkKE9CSkNPUFkpIC1qIC50ZXh0IC1qIC5zZGF0YSAtaiAuZGF0YSAtaiAuZHluYW1pYyAtaiAuZHluc3ltIC1qIC5yZWwgXAorIwkJLWogLnJlbGEgLWogLnJlbG9jIC0tdGFyZ2V0PSQoRk9STUFUKSAkKi5zbyAkQApkaWZmIC0tZ2l0IGEvbWsvZWxmLm1rIGIvbWsvZWxmLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDEwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tay9lbGYubWsKQEAgLTAsMCArMSwxMDcgQEAKKyMjIC0qLSBtYWtlZmlsZSAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgICAKKyMjICAgQ29weXJpZ2h0IDIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisjIyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIyBFTEYgY29tbW9uIGNvbmZpZ3VyYWJsZXMKKyMjCisKK2luY2x1ZGUgJChNQUtFRElSKS9zeXNsaW51eC5taworCisjIFN1cHBvcnQgSUEzMiBhbmQgeDg2XzY0IHBsYXRmb3JtcyB3aXRoIG9uZSBidWlsZAorIyBTZXQgdXAgYXJjaGl0ZWN0dXJlIHNwZWNpZmljczsgZm9yIGNyb3NzIGNvbXBpbGF0aW9uLCBzZXQgQVJDSCBhcyBhcHQKK0dDQ09QVCA6PSAkKGNhbGwgZ2NjX29rLC1zdGQ9Z251OTksKQoraWZlcSAoJChBUkNIKSxpMzg2KQorCUdDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1tMzIsKQorCUdDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1tYXJjaD1pMzg2KQorCUdDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIsKQorZW5kaWYKK2lmZXEgKCQoQVJDSCkseDg2XzY0KQorCUdDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1tNjQsKQorCUdDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1tYXJjaD14ODYtNjQpCisJI2xldCBwcmVmZXJyZWQtc3RhY2stYm91bmRhcnkgYmUgZGVmYXVsdCAoPTQpCitlbmRpZgorR0NDT1BUICs9IC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlcgorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZuby1zdGFjay1wcm90ZWN0b3IsKQorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZ3cmFwdiwpCitHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtZnJlZy1zdHJ1Y3QtcmV0dXJuLCkKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mbm8tZXhjZXB0aW9ucywpCitHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzLCkKKyMgTm90ZSAtZlBJRSBkb2VzIG5vdCB3b3JrIHdpdGggbGQgb24geDg2XzY0LCB0cnkgLWZQSUMgaW5zdGVhZAorIyBEb2VzIEJJT1MgYnVpbGQgZGVwZW5kIG9uIC1mUElFPworR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZQSUMpCitHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtZmFsaWduLWZ1bmN0aW9ucz0wLC1tYWxpZ24tZnVuY3Rpb25zPTApCitHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtZmFsaWduLWp1bXBzPTAsLW1hbGlnbi1qdW1wcz0wKQorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZhbGlnbi1sYWJlbHM9MCwtbWFsaWduLWxhYmVscz0wKQorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZhbGlnbi1sb29wcz0wLC1tYWxpZ24tbG9vcHM9MCkKKworY29tMzIgPSAkKHRvcGRpcikvY29tMzIKK2NvcmUgPSAkKHRvcGRpcikvY29yZQorCitpZm5lcSAoJChOT0dQTCksMSkKK0dQTExJQiAgICAgPSAkKG9iamRpcikvY29tMzIvZ3BsbGliL2xpYmdwbC5jMzIKK0dQTElOQ0xVREUgPSAtSSQoY29tMzIpL2dwbGluY2x1ZGUKK2Vsc2UKK0dQTExJQiAgICAgPQorR1BMSU5DTFVERSA9CitlbmRpZgorCitDRkxBR1MgICAgID0gJChHQ0NPUFQpICQoR0NDV0FSTikgLVcgLVdhbGwgXAorCSAgICAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLURfX0NPTTMyX18gLURfX0ZJUk1XQVJFXyQoRklSTVdBUkUpX18gLUREWU5BTUlDX01PRFVMRSBcCisJICAgICAtbm9zdGRpbmMgLWl3aXRocHJlZml4IGluY2x1ZGUgXAorCSAgICAgLUkkKGNvbTMyKS9saWJ1dGlsL2luY2x1ZGUgLUkkKGNvbTMyKS9pbmNsdWRlIFwKKwkJLUkkKGNvbTMyKS9pbmNsdWRlL3N5cyAkKEdQTElOQ0xVREUpIC1JJChjb3JlKS9pbmNsdWRlIFwKKwkJLUkkKG9iamRpcikgLURMRExJTlVYPVwiJChMRExJTlVYKVwiCitpZm5kZWYgRUZJX0JVSUxECitDRkxBR1MJICArPSAtbXJlZ3Bhcm09MyAtRFJFR1BBUk09MworZW5kaWYKKworU0ZMQUdTICAgICA9ICQoR0NDT1BUKSAtRF9fQ09NMzJfXyAtRF9fRklSTVdBUkVfJChGSVJNV0FSRSlfXyAKK0xERkxBR1MgICAgPSAtbSBlbGZfJChBUkNIKSAtc2hhcmVkIC0taGFzaC1zdHlsZT1nbnUgLVQgJChjb20zMikvbGliLyQoQVJDSCkvZWxmLmxkIC0tYXMtbmVlZGVkCitMSUJHQ0MgICAgOj0gJChzaGVsbCAkKENDKSAkKEdDQ09QVCkgLS1wcmludC1saWJnY2MpCisKK0xOWENGTEFHUyAgPSAtSSQoY29tMzIpL2xpYnV0aWwvaW5jbHVkZSAtVyAtV2FsbCAtTyAtZyAtRF9HTlVfU09VUkNFCitMTlhTRkxBR1MgID0gLWcKK0xOWExERkxBR1MgPSAtZworCitDX0xJQlMJICAgKz0gJChvYmpkaXIpL2NvbTMyL2xpYnV0aWwvbGlidXRpbC5jMzIgJChHUExMSUIpIFwKKwkgICAgICQob2JqZGlyKS9jb20zMi9saWIvbGliY29tMzIuYzMyCitDX0xOWExJQlMgID0gJChvYmpkaXIpL2NvbTMyL2xpYnV0aWwvbGlidXRpbF9sbnguYSBcCisJICAgICAkKG9iamRpcikvY29tMzIvZWxmbGluay9sZGxpbnV4L2xkbGludXhfbG54LmEKKworLlNVRkZJWEVTOiAubHNzIC5jIC5vCisKKy5QUkVDSU9VUzogJS5vCislLm86ICUuUworCSQoQ0MpICQoU0ZMQUdTKSAtYyAtbyAkQCAkPAorCisuUFJFQ0lPVVM6ICUubworJS5vOiAlLmMKKwkkKENDKSAkKENGTEFHUykgLWMgLW8gJEAgJDwKKworLlBSRUNJT1VTOiAlLmxvCislLmxvOiAlLlMKKwkkKENDKSAkKExOWFNGTEFHUykgLWMgLW8gJEAgJDwKKworLlBSRUNJT1VTOiAlLmxvCislLmxvOiAlLmMKKwkkKENDKSAkKExOWENGTEFHUykgLWMgLW8gJEAgJDwKKworLlBSRUNJT1VTOiAlLmxueAorJS5sbng6ICUubG8gJChMTlhMSUJTKSAkKENfTE5YTElCUykKKwkkKENDKSAkKExOWENGTEFHUykgLW8gJEAgJF4KKworLlBSRUNJT1VTOiAlLmVsZgorJS5lbGY6ICUubyAkKENfTElCUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICReCisKKyUuYzMyOiAlLmVsZgorCSQoT0JKQ09QWSkgLS1zdHJpcC1kZWJ1ZyAtLXN0cmlwLXVubmVlZGVkICQ8ICRACmRpZmYgLS1naXQgYS9tay9lbWJlZGRlZC5tayBiL21rL2VtYmVkZGVkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTRkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tay9lbWJlZGRlZC5tawpAQCAtMCwwICsxLDc1IEBACisjIyAtKi0gbWFrZWZpbGUgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyMgTWFrZSBjb25maWd1cmF0aW9uIGZvciBlbWJlZGRlZCBkaXJlY3RvcmllcworIyMKKworaW5jbHVkZSAkKE1BS0VESVIpL3N5c2xpbnV4Lm1rCisKKyMgU3VwcG9ydCBJQTMyIGFuZCB4ODZfNjQgcGxhdGZvcm1zIHdpdGggb25lIGJ1aWxkCisjIFNldCB1cCBhcmNoaXRlY3R1cmUgc3BlY2lmaWNzOyBmb3IgY3Jvc3MgY29tcGlsYXRpb24sIHNldCBBUkNIIGFzIGFwdAorIyBJbml0aWFsaXplIEdDQ09QVCB0byBudWxsIHRvIGJlZ2luIHdpdGguIFdpdGhvdXQgdGhpcywgbWFrZSBnZW5lcmF0ZXMKKyMgcmVjdXJzaXZlIGVycm9yIGZvciBHQ0NPUFQKK0dDQ09QVCA6PQoraWZlcSAoJChBUkNIKSxpMzg2KQorCUdDQ09QVCA6PSAkKGNhbGwgZ2NjX29rLC1tMzIpCisJR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLW1hcmNoPWkzODYpCisJR0NDT1BUICAgICs9ICQoY2FsbCBnY2Nfb2ssLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiwpCisJR0NDT1BUICAgICs9ICQoY2FsbCBnY2Nfb2ssLW1pbmNvbWluZy1zdGFjay1ib3VuZGFyeT0yLCkKK2VuZGlmCitpZmVxICgkKEFSQ0gpLHg4Nl82NCkKKwlHQ0NPUFQgOj0gJChjYWxsIGdjY19vaywtbTY0KQorCUdDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1tYXJjaD14ODYtNjQpCisJI2xldCBwcmVmZXJyZWQtc3RhY2stYm91bmRhcnkgYW5kIGluY29taW5nLXN0YWNrLWJvdW5kYXJ5IGJlIGRlZmF1bHQoPTQpCisjIFNvbWV3aGVyZSBkb3duIHRoZSBsaW5lIGxkIGJhcmZzIHJlcXVpcmluZyAtZlBJQworCUdDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mUElDKQorZW5kaWYKK0dDQ09QVCAgICArPSAkKGNhbGwgZ2NjX29rLC1mZnJlZXN0YW5kaW5nLCkKK0dDQ09QVAkgICs9ICQoY2FsbCBnY2Nfb2ssLWZuby1zdGFjay1wcm90ZWN0b3IsKQorR0NDT1BUCSAgKz0gJChjYWxsIGdjY19vaywtZndyYXB2LCkKK0dDQ09QVAkgICs9ICQoY2FsbCBnY2Nfb2ssLWZyZWctc3RydWN0LXJldHVybiwpCitpZmRlZiBFRklfQlVJTEQKK0dDQ09QVCAgICArPSAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLW1zb2Z0LWZsb2F0CitlbHNlCitHQ0NPUFQgICAgKz0gLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1tcmVncGFybT0zIC1EUkVHUEFSTT0zIFwKKyAgICAgICAgICAgICAtbXNvZnQtZmxvYXQKK2VuZGlmCitHQ0NPUFQgICAgKz0gJChjYWxsIGdjY19vaywtZm5vLWV4Y2VwdGlvbnMsKQorR0NDT1BUCSAgKz0gJChjYWxsIGdjY19vaywtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzLCkKK0dDQ09QVAkgICs9ICQoY2FsbCBnY2Nfb2ssLWZuby1zdHJpY3QtYWxpYXNpbmcsKQorR0NDT1BUCSAgKz0gJChjYWxsIGdjY19vaywtZmFsaWduLWZ1bmN0aW9ucz0wLC1tYWxpZ24tZnVuY3Rpb25zPTApCitHQ0NPUFQgICAgKz0gJChjYWxsIGdjY19vaywtZmFsaWduLWp1bXBzPTAsLW1hbGlnbi1qdW1wcz0wKQorR0NDT1BUICAgICs9ICQoY2FsbCBnY2Nfb2ssLWZhbGlnbi1sYWJlbHM9MCwtbWFsaWduLWxhYmVscz0wKQorR0NDT1BUICAgICs9ICQoY2FsbCBnY2Nfb2ssLWZhbGlnbi1sb29wcz0wLC1tYWxpZ24tbG9vcHM9MCkKK0dDQ09QVCAgICArPSAkKGNhbGwgZ2NjX29rLC1mdmlzaWJpbGl0eT1oaWRkZW4pCisKK0xJQkdDQyAgICA6PSAkKHNoZWxsICQoQ0MpICQoR0NDT1BUKSAtLXByaW50LWxpYmdjYykKKworTEQgICAgICAgICs9IC1tIGVsZl8kKEFSQ0gpCisKKyMgTm90ZTogdXNlICs9IGZvciBDRkxBR1MgYW5kIFNGTEFHUyBpbiBjYXNlIHNvbWV0aGluZyBpcyBzZXQgaW4gTUNPTkZJRy5sb2NhbAorQ0ZMQUdTICAgICs9ICQoR0NDT1BUKSAtZyAkKEdDQ1dBUk4pIC1Xbm8tc2lnbi1jb21wYXJlICQoT1BURkxBR1MpICQoSU5DTFVERVMpCitTRkxBR1MgICAgKz0gJChDRkxBR1MpIC1EX19BU1NFTUJMWV9fCisKKy5TVUZGSVhFUzogLmMgLm8gLlMgLnMgLmkgLmVsZiAuY29tIC5iaW4gLmFzbSAubHN0IC5jMzIgLmxzcworCislLm86ICUuYworCSQoQ0MpICQoTUFLRURFUFMpICQoQ0ZMQUdTKSAtYyAtbyAkQCAkPAorJS5pOiAlLmMKKwkkKENDKSAkKE1BS0VERVBTKSAkKENGTEFHUykgLUUgLW8gJEAgJDwKKyUuczogJS5jCisJJChDQykgJChNQUtFREVQUykgJChDRkxBR1MpIC1TIC1vICRAICQ8CislLm86ICUuUworCSQoQ0MpICQoTUFLRURFUFMpICQoU0ZMQUdTKSAtV2EsLWE9JCoubHN0IC1jIC1vICRAICQ8CislLnM6ICUuUworCSQoQ0MpICQoTUFLRURFUFMpICQoU0ZMQUdTKSAtRSAtbyAkQCAkPApkaWZmIC0tZ2l0IGEvbWsvbGliLm1rIGIvbWsvbGliLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjk1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9tay9saWIubWsKQEAgLTAsMCArMSwyNDggQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorCitpbmNsdWRlICQoTUFLRURJUikvc3lzbGludXgubWsKKworIyBTdXBwb3J0IElBMzIgYW5kIHg4Nl82NCBwbGF0Zm9ybXMgd2l0aCBvbmUgYnVpbGQKKyMgU2V0IHVwIGFyY2hpdGVjdHVyZSBzcGVjaWZpY3M7IGZvciBjcm9zcyBjb21waWxhdGlvbiwgc2V0IEFSQ0ggYXMgYXB0CitHQ0NPUFQgOj0gJChjYWxsIGdjY19vaywtc3RkPWdudTk5LCkKK2lmZXEgKCQoQVJDSCksaTM4NikKKwlHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtbTMyLCkKKwlHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yLCkKKwlNQVJDSCA9IGkzODYKK2VuZGlmCitpZmVxICgkKEFSQ0gpLHg4Nl82NCkKKwlHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtbTY0LCkKKwkjbGV0IHByZWZlcnJlZC1zdGFjay1ib3VuZGFyeSBiZSBkZWZhdWx0KD00KQorCU1BUkNIID0geDg2LTY0CitlbmRpZgorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZuby1zdGFjay1wcm90ZWN0b3IsKQorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZ3cmFwdiwpCitHQ0NPUFQgKz0gJChjYWxsIGdjY19vaywtZnJlZy1zdHJ1Y3QtcmV0dXJuLCkKKyMgTm90ZSAtZlBJRSBkb2VzIG5vdCB3b3JrIHdpdGggbGQgb24geDg2XzY0LCB0cnkgLWZQSUMgaW5zdGVhZAorIyBEb2VzIEJJT1MgYnVpbGQgcmVxdWlyZSAtZlBJRT8KK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mUElDKQorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZuby1leGNlcHRpb25zLCkKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMsKQorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZuby1zdHJpY3QtYWxpYXNpbmcsKQorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZhbGlnbi1mdW5jdGlvbnM9MCwtbWFsaWduLWZ1bmN0aW9ucz0wKQorR0NDT1BUICs9ICQoY2FsbCBnY2Nfb2ssLWZhbGlnbi1qdW1wcz0wLC1tYWxpZ24tanVtcHM9MCkKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mYWxpZ24tbGFiZWxzPTAsLW1hbGlnbi1sYWJlbHM9MCkKK0dDQ09QVCArPSAkKGNhbGwgZ2NjX29rLC1mYWxpZ24tbG9vcHM9MCwtbWFsaWduLWxvb3BzPTApCisKK0lOQ0xVREUJPSAtSSQoU1JDKQorU1RSSVAJPSBzdHJpcCAtLXN0cmlwLWFsbCAtUiAuY29tbWVudCAtUiAubm90ZQorCisjIHpsaWIgYW5kIGxpYnBuZyBjb25maWd1cmF0aW9uIGZsYWdzCitMSUJGTEFHUyA9IC1ERFlOQU1JQ19DUkNfVEFCTEUgLURQTkdfTk9fQ09OU09MRV9JTyBcCisJICAgLURQTkdfTk9fV1JJVEVfU1VQUE9SVEVEIFwKKwkgICAtRFBOR19OT19NTkdfRkVBVFVSRVMgXAorCSAgIC1EUE5HX05PX1JFQURfdElNRSAtRFBOR19OT19XUklURV90SU1FCisKKyMgV2UgbmVlZCBzb21lIGZlYXR1cmVzIGluIGxpYnBuZyB3aGljaCBhcHBhcmVudGx5IGFyZW4ndCBhdmFpbGFibGUgaW4gdGhlCisjIGZpeGVkLXBvaW50IHZlcnNpb25zLiAgSXQncyBPSywgYmVjYXVzZSB3ZSBoYXZlIHRvIGhhdmUgYSBub24tZ3JhcGhpY2FsCisjIGZhbGxiYWNrIGFueXdheSwganVzdCB1c2UgdGhhdCBvbiBvbGQgbWFjaGluZXMuLi4KKyMgTElCRkxBR1MgKz0gLURQTkdfTk9fRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECisKK1JFUUZMQUdTICA9ICQoR0NDT1BUKSAtZyAtRF9fQ09NMzJfXyAtRF9fRklSTVdBUkVfJChGSVJNV0FSRSlfXyBcCisJICAgIC1ub3N0ZGluYyAtaXdpdGhwcmVmaXggaW5jbHVkZSAtSS4gLUkkKFNSQykvc3lzIFwKKwkgICAgLUkkKFNSQykvLi4vaW5jbHVkZSAtSSQoY29tMzIpL2luY2x1ZGUvc3lzIFwKKwkgICAgLUkkKHRvcGRpcikvY29yZS9pbmNsdWRlIC1JJChjb20zMikvbGliLyBcCisJICAgIC1JJChjb20zMikvbGliL3N5cy9tb2R1bGUgLUkkKE9CSikvLi4vLi4KK09QVEZMQUdTICA9IC1PcyAtbWFyY2g9JChNQVJDSCkgLWZhbGlnbi1mdW5jdGlvbnM9MCAtZmFsaWduLWp1bXBzPTAgXAorCSAgICAtZmFsaWduLWxhYmVscz0wIC1mZmFzdC1tYXRoIC1mb21pdC1mcmFtZS1wb2ludGVyCitXQVJORkxBR1MgPSAkKEdDQ1dBUk4pIC1XcG9pbnRlci1hcml0aCAtV3dyaXRlLXN0cmluZ3MgLVdzdHJpY3QtcHJvdG90eXBlcyAtV2lubGluZQorCitDRkxBR1MgID0gJChPUFRGTEFHUykgJChSRVFGTEFHUykgJChXQVJORkxBR1MpICQoTElCRkxBR1MpCisKK2lmbmRlZiBFRklfQlVJTEQKK0NGTEFHUyArPSAtbXJlZ3Bhcm09MyAtRFJFR1BBUk09MworZW5kaWYKKworVlBBVEggPSAkKFNSQykKK0xJQk9USEVSX09CSlMgPSBcCisJYXRvaS5vIGF0b2wubyBhdG9sbC5vIGNhbGxvYy5vIGNyZWF0Lm8JCVwKKwlmZ2V0cy5vIGZwcmludGYubyBmcHV0Yy5vCVwKKwlwdXRjaGFyLm8JCQkJXAorCWdldG9wdC5vIGdldG9wdF9sb25nLm8JCQkJCQlcCisJbHJhbmQ0OC5vIHN0YWNrLm8gbWVtY2NweS5vIG1lbWNoci5vIAkJXAorCW1lbXBjcHkubyBtZW1tZW0ubyBtZW1tb3ZlLm8gbWVtc3dhcC5vCVwKKwlwZXJyb3IubyBxc29ydC5vIHNlZWQ0OC5vIFwKKwlzcmFuZDQ4Lm8gc3NjYW5mLm8gCQkJCQkJXAorCXN0cmVycm9yLm8gZXJybGlzdC5vCQlcCisJc3Rybmxlbi5vCQkJCQkJCVwKKwlzdHJuY2F0Lm8gc3RybmR1cC5vCQlcCisJc3RwbmNweS5vCQkJCQkJXAorCXN0cm50b2ltYXgubyBzdHJzZXAubyBzdHJzcG4ubyBzdHJzdHIubwkJCQlcCisJc3RydG9pbWF4Lm8gc3RydG9rLm8gc3RydG9sLm8gc3RydG9sbC5vIHN0cnRvdWxsLm8JCVwKKwlzdHJ0b3VtYXgubyB2cHJpbnRmLm8gdnNwcmludGYubwkJXAorCWFzcHJpbnRmLm8gdmFzcHJpbnRmLm8JCQlcCisJdnNzY2FuZi5vCQkJCQkJCVwKKwlza2lwc3BhY2UubwkJCQkJCQlcCisJY2hycmVwbGFjZS5vCQkJCQkJCVwKKwlidWZwcmludGYubwkJCQkJCQlcCisJaW5ldC5vIGRoY3BwYWNrLm8gZGhjcHVucGFjay5vCQkJCQlcCisJc3RycmVwbGFjZS5vCQkJCQkJCVwKKwlsc3RyZHVwLm8JCQkJCQlcCisJXAorCXN1ZmZpeF9udW1iZXIubwkJCQkJCQlcCisJXAorCWdldGN3ZC5vIGZkb3BlbmRpci5vCVwKKwlcCisJc3lzL2xpbmVfaW5wdXQubwkJCQlcCisJc3lzL2NvbG9ydGFibGUubyBzeXMvc2NyZWVuc2l6ZS5vCQkJCVwKKwlcCisJc3lzL3N0ZGNvbl9yZWFkLm8gc3lzL3N0ZGNvbl93cml0ZS5vIHN5cy9yYXdjb25fcmVhZC5vCQlcCisJc3lzL3Jhd2Nvbl93cml0ZS5vCQlcCisJc3lzL251bGxfcmVhZC5vIHN5cy9udWxsX3dyaXRlLm8gc3lzL3NlcmlhbF93cml0ZS5vCQlcCisJXAorCXN5cy94c2VyaWFsX3dyaXRlLm8JCQkJCQlcCisJXAorCXN5cy9hbnNpLm8JCQkJCQkJXAorCVwKKwlzeXMvYW5zaWNvbl93cml0ZS5vIHN5cy9hbnNpc2VyaWFsX3dyaXRlLm8JCQlcCisJXAorCXBjaS9jZmd0eXBlLm8gcGNpL3NjYW4ubyBwY2kvYmlvcy5vCQkJCQlcCisJcGNpL3JlYWRiLm8gcGNpL3JlYWR3Lm8gcGNpL3JlYWRsLm8JCQlcCisJcGNpL3dyaXRlYi5vIHBjaS93cml0ZXcubyBwY2kvd3JpdGVsLm8JXAorCVwKKwlzeXMveDg2X2luaXRfZnB1Lm8gbWF0aC9wb3cubyBtYXRoL3N0cnRvZC5vCQkJXAorCXN5c2xpbnV4L2Rpc2subwkJCQkJCQlcCisJXAorCXN5c2xpbnV4L3NldHVwX2RhdGEubworCisjIyBDT1JFIE9CSkVDVFMsIElOQ0xVREVEIElOIFRIRSBST09UIENPTTMyIE1PRFVMRQorTElCRU5UUllfT0JKUyA9IFwKKwlzeXMvaW50Y2FsbC5vIHN5cy9mYXJjYWxsLm8gc3lzL2NmYXJjYWxsLm8gc3lzL3plcm9yZWdzLm8JXAorCXN5cy9hcmd2Lm8gc3lzL3NsZWVwLm8JCQkJCQlcCisJc3lzL2ZpbGVpbmZvLm8gc3lzL29wZW5kZXYubyBzeXMvcmVhZC5vIHN5cy93cml0ZS5vIHN5cy9mdGVsbC5vIFwKKwlzeXMvY2xvc2UubyBzeXMvb3Blbi5vIHN5cy9maWxlcmVhZC5vIHN5cy9maWxlY2xvc2UubwkJXAorCXN5cy9vcGVubWVtLm8JCQkJCVwKKwlzeXMvaXNhdHR5Lm8gc3lzL2ZzdGF0Lm8JCQkJCVwKKwlcCisJZHByaW50Zi5vIHZkcHJpbnRmLm8JCQkJCQlcCisJXAorCXN5c2xpbnV4L2lkbGUubwkJCQkJCQlcCisJXAorCWV4aXQubworCitMSUJHQ0NfT0JKUyA9IFwKKwlsaWJnY2MvX19hc2hsZGkzLm8gbGliZ2NjL19fdWRpdmRpMy5vCQkJXAorCWxpYmdjYy9fX25lZ2RpMi5vIGxpYmdjYy9fX2FzaHJkaTMubyBsaWJnY2MvX19sc2hyZGkzLm8JCVwKKwlsaWJnY2MvX19tdWxkaTMubyBsaWJnY2MvX191ZGl2bW9kZGk0Lm8gbGliZ2NjL19fdW1vZGRpMy5vCVwKKwlsaWJnY2MvX19kaXZkaTMubyBsaWJnY2MvX19tb2RkaTMubworCitMSUJDT05TT0xFX09CSlMgPSBcCisJXAorCXN5cy9vcGVuY29uc29sZS5vIHN5cy9saW5lX2lucHV0Lm8JCQkJXAorCXN5cy9jb2xvcnRhYmxlLm8gc3lzL3NjcmVlbnNpemUubwkJCQlcCisJXAorCXN5cy9zdGRjb25fcmVhZC5vIHN5cy9yYXdjb25fcmVhZC5vCQlcCisJc3lzL3Jhd2Nvbl93cml0ZS5vCQkJCQkJXAorCXN5cy9udWxsX3dyaXRlLm8gc3lzL3NlcmlhbF93cml0ZS5vCQlcCisJXAorCXN5cy94c2VyaWFsX3dyaXRlLm8JCQkJCQlcCisJXAorCXN5cy9hbnNpLm8JCQkJCQkJXAorCVwKKwlzeXMvYW5zaWNvbl93cml0ZS5vIHN5cy9hbnNpc2VyaWFsX3dyaXRlLm8JXAorCVwKKwlzeXNsaW51eC9zZXJpYWwubworCitMSUJMT0FEX09CSlMgPSBcCisJc3lzbGludXgvYWRkbGlzdC5vIHN5c2xpbnV4L2ZyZWVsaXN0Lm8gc3lzbGludXgvbWVtbWFwLm8JXAorCXN5c2xpbnV4L21vdmViaXRzLm8gc3lzbGludXgvc2h1ZmZsZS5vIHN5c2xpbnV4L3NodWZmbGVfcG0ubwlcCisJc3lzbGludXgvc2h1ZmZsZV9ybS5vIHN5c2xpbnV4L2Jpb3Nib290Lm8gc3lzbGludXgvem9uZWxpc3QubwlcCisJc3lzbGludXgvZHVtcF9tbWFwLm8gc3lzbGludXgvZHVtcF9tb3ZlbGlzdC5vCQkJXAorCVwKKwlzeXNsaW51eC9ydW5fZGVmYXVsdC5vIHN5c2xpbnV4L3J1bl9jb21tYW5kLm8JCQlcCisJc3lzbGludXgvY2xlYW51cC5vIHN5c2xpbnV4L2xvY2FsYm9vdC5vCXN5c2xpbnV4L3J1bmltYWdlLm8JXAorCVwKKwlzeXNsaW51eC9sb2FkZmlsZS5vIHN5c2xpbnV4L2Zsb2FkZmlsZS5vIHN5c2xpbnV4L3psb2FkZmlsZS5vCVwKKwlcCisJc3lzbGludXgvbG9hZF9saW51eC5vIHN5c2xpbnV4L2luaXRyYW1mcy5vCQkJXAorCXN5c2xpbnV4L2luaXRyYW1mc19maWxlLm8gc3lzbGludXgvaW5pdHJhbWZzX2xvYWRmaWxlLm8JCVwKKwlzeXNsaW51eC9pbml0cmFtZnNfYXJjaGl2ZS5vCisKK0xJQk1PRFVMRV9PQkpTID0gXAorCXN5cy9tb2R1bGUvY29tbW9uLm8gc3lzL21vZHVsZS8kKEFSQ0gpL2VsZl9tb2R1bGUubwkJXAorCXN5cy9tb2R1bGUvZWxmdXRpbHMubwlcCisJc3lzL21vZHVsZS9leGVjLm8gc3lzL21vZHVsZS9lbGZfbW9kdWxlLm8KKworIyBaSVAgbGlicmFyeSBvYmplY3QgZmlsZXMKK0xJQlpMSUJfT0JKUyA9IFwKKwl6bGliL2FkbGVyMzIubyB6bGliL2NvbXByZXNzLm8gemxpYi9jcmMzMi5vIAkJCVwKKwl6bGliL3VuY29tcHIubyB6bGliL2RlZmxhdGUubyB6bGliL3RyZWVzLm8gemxpYi96dXRpbC5vCQlcCisJemxpYi9pbmZsYXRlLm8gemxpYi9pbmZiYWNrLm8gemxpYi9pbmZ0cmVlcy5vIHpsaWIvaW5mZmFzdC5vCVwKKwlzeXMvemZpbGUubyBzeXMvemZvcGVuLm8KKworTUlOTElCT0JKUyA9IFwKKwkkKGFkZHByZWZpeCAkKE9CSikvLHN5c2xpbnV4L2lwYXBwZW5kLm8gXAorCXN5c2xpbnV4L2RzaW5mby5vIFwKKwkkKExJQk9USEVSX09CSlMpIFwKKwkkKExJQkdDQ19PQkpTKSBcCisJJChMSUJDT05TT0xFX09CSlMpIFwKKwkkKExJQkxPQURfT0JKUykgXAorCSQoTElCWkxJQl9PQkpTKSkKKyMJJChMSUJWRVNBX09CSlMpCisKK0NPUkVMSUJPQkpTID0gXAorCW1lbWNweS5vIG1lbXNldC5vIG1lbWNtcC5vIHByaW50Zi5vIHN0cm5jbXAubyB2ZnByaW50Zi5vIAlcCisJc3RybGVuLm8gdnNucHJpbnRmLm8gc25wcmludGYubyBzdHBjcHkubyBzdHJjbXAubyBzdHJkdXAubyAJXAorCXN0cmNweS5vIHN0cm5jcHkubyBzZXRqbXAubyBmb3Blbi5vIGZyZWFkLm8gZnJlYWQyLm8gcHV0cy5vIAlcCisJc3RydG91bC5vIHN0cm50b3VtYXgubyBzdHJjYXNlY21wLm8gCQkJCVwKKwlzcHJpbnRmLm8gc3RybGNhdC5vIHN0cmNoci5vIHN0cmxjcHkubyBzdHJuY2FzZWNtcC5vIGN0eXBlcy5vIAlcCisJZnB1dHMubyBmd3JpdGUyLm8gZndyaXRlLm8gZmdldGMubyBmY2xvc2UubyBsbWFsbG9jLm8gCQlcCisJc3lzL2Vycl9yZWFkLm8gc3lzL2Vycl93cml0ZS5vIHN5cy9udWxsX3JlYWQubyAJCQlcCisJc3lzL3N0ZGNvbl93cml0ZS5vCQkJCQkJXAorCXN5c2xpbnV4L21lbXNjYW4ubyBzdHJyY2hyLm8gc3RyY2F0Lm8JCQkJXAorCWxpYmdjYy9fX2FzaGxkaTMubyBsaWJnY2MvX191ZGl2ZGkzLm8JCQkJXAorCWxpYmdjYy9fX25lZ2RpMi5vIGxpYmdjYy9fX2FzaHJkaTMubyBsaWJnY2MvX19sc2hyZGkzLm8JCVwKKwlsaWJnY2MvX19tdWxkaTMubyBsaWJnY2MvX191ZGl2bW9kZGk0Lm8gbGliZ2NjL19fdW1vZGRpMy5vCVwKKwlsaWJnY2MvX19kaXZkaTMubyBsaWJnY2MvX19tb2RkaTMubwkJCQlcCisJc3lzbGludXgvZGVidWcubwkJCQkJCVwKKwkkKExJQkVOVFJZX09CSlMpIFwKKwkkKExJQk1PRFVMRV9PQkpTKQorCitMREZMQUdTCT0gLW0gZWxmXyQoQVJDSCkgLS1oYXNoLXN0eWxlPWdudSAtVCAkKGNvbTMyKS9saWIvJChBUkNIKS9lbGYubGQKKworLlNVRkZJWEVTOiAuYyAubyAuYSAuc28gLmxvIC5pIC5TIC5zIC5scyAuc3MgLmxzcworCislIDogJS5jICMgQ2FuY2VsIGRlZmF1bHQgcnVsZQorCislIDogJS5TCisKKyUubzogJS5jCisJJChDQykgJChNQUtFREVQUykgJChDRkxBR1MpIC1jIC1vICRAICQ8CisKKy5jLmk6CisJJChDQykgJChNQUtFREVQUykgJChDRkxBR1MpIC1FIC1vICRAICQ8CisKKyUuczogJS5jCisJJChDQykgJChNQUtFREVQUykgJChDRkxBR1MpIC1TIC1vICRAICQ8CisKKyUubzogJS5TCisJJChDQykgJChNQUtFREVQUykgJChDRkxBR1MpIC1EX19BU1NFTUJMWV9fIC1jIC1vICRAICQ8CisKKy5TLnM6CisJJChDQykgJChNQUtFREVQUykgJChDRkxBR1MpIC1EX19BU1NFTUJMWV9fIC1FIC1vICRAICQ8CisKKy5TLmxvOgorCSQoQ0MpICQoTUFLRURFUFMpICQoQ0ZMQUdTKSAkKFNPRkxBR1MpIC1EX19BU1NFTUJMWV9fIC1jIC1vICRAICQ8CisKKy5TLmxzOgorCSQoQ0MpICQoTUFLRURFUFMpICQoQ0ZMQUdTKSAkKFNPRkxBR1MpIC1EX19BU1NFTUJMWV9fIC1FIC1vICRAICQ8CisKKyUoT0JKKS8lLm86ICQoU1JDKS8lLnMKKwkkKENDKSAkKE1BS0VERVBTKSAkKENGTEFHUykgLXggYXNzZW1ibGVyIC1jIC1vICRAICQ8CisKKy5scy5sbzoKKwkkKENDKSAkKE1BS0VERVBTKSAkKENGTEFHUykgJChTT0ZMQUdTKSAteCBhc3NlbWJsZXIgLWMgLW8gJEAgJDwKKworLmMubG86CisJJChDQykgJChNQUtFREVQUykgJChDRkxBR1MpICQoU09GTEFHUykgLWMgLW8gJEAgJDwKKworLmMubHM6CisJJChDQykgJChNQUtFREVQUykgJChDRkxBR1MpICQoU09GTEFHUykgLVMgLW8gJEAgJDwKKworJS5jMzI6ICUuZWxmCisJJChPQkpDT1BZKSAtLXN0cmlwLWRlYnVnIC0tc3RyaXAtdW5uZWVkZWQgJDwgJEAKZGlmZiAtLWdpdCBhL21rL3Jvc2gubWsgYi9tay9yb3NoLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjkzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9tay9yb3NoLm1rCkBAIC0wLDAgKzEsMjcgQEAKKyMjIC0qLSBtYWtlZmlsZSAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisjIyAgIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIyBDT00zMiBHUkMgY29uZmlndXJhYmxlcworIyMKKworIyMgSW5jbHVkZSB0aGUgQ09NMzIgY29tbW9uIGNvbmZpZ3VyYWJsZXMKK2luY2x1ZGUgJChNQUtFRElSKS9lbGYubWsKKworIyBDRkxBR1MgICAgID0gJChHQ0NPUFQpICQoR0NDV0FSTikgLW1hcmNoPWkzODYgXAorIyAJICAgICAtZm9taXQtZnJhbWUtcG9pbnRlciAtRF9fQ09NMzJfXyAtRF9fRklSTVdBUkVfJChGSVJNV0FSRSlfXyBcCisjIAkgICAgIC1ub3N0ZGluYyAtaXdpdGhwcmVmaXggaW5jbHVkZSBcCisjIAkgICAgIC1JJChjb20zMikvbGlidXRpbC9pbmNsdWRlIC1JJChjb20zMikvaW5jbHVkZQorIyAJIC1nMyAtZEQKKworIyBMTlhDRkxBR1MgID0gLUkkKGNvbTMyKS9saWJ1dGlsL2luY2x1ZGUgJChHQ0NXQVJOKSAtTyAtZzMgLURfR05VX1NPVVJDRSAtZEQKKyMgCSAtVV9fR05VQ19fCmRpZmYgLS1naXQgYS9tay9zeXNsaW51eC5tayBiL21rL3N5c2xpbnV4Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzU2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9tay9zeXNsaW51eC5tawpAQCAtMCwwICsxLDk2IEBACisjIyAtKi0gbWFrZWZpbGUgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjICAgCisjIyAgIENvcHlyaWdodCAyMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorIyMgICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyMgQ29tbW9uIGNvbmZpZ3VyYWJsZXMKKyMjCisKKyMgTm8gYnVpbHRpbiBydWxlcworTUFLRUZMQUdTICs9IC1yCitNQUtFICAgICAgKz0gLXIKKworQklORElSICAgPSAvdXNyL2JpbgorU0JJTkRJUiAgPSAvc2JpbgorTElCRElSICAgPSAvdXNyL2xpYgorREFUQURJUiAgPSAvdXNyL3NoYXJlCitBVVhESVIgICA9ICQoREFUQURJUikvc3lzbGludXgKK0RJQUdESVIgID0gJChBVVhESVIpL2RpYWcKK01BTkRJUgkgPSAvdXNyL21hbgorSU5DRElSICAgPSAvdXNyL2luY2x1ZGUKK1RGVFBCT09UID0gL3RmdHBib290CitDT00zMkRJUiA9ICQoQVVYRElSKS9jb20zMgorCitCT09URElSCSAgICA9IC9ib290CitFWFRMSU5VWERJUiA9ICQoQk9PVERJUikvZXh0bGludXgKKworaWZkZWYgREVCVUcKKyMgVGhpcyBhbGxvd3MgREVCVUdPUFQgdG8gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZQorREVCVUdPUFQgPSAtRERFQlVHPSQoREVCVUcpCitlbmRpZgorCitOQVNNCSA9IG5hc20KK05BU01PUFQgID0gLU94ICQoREVCVUdPUFQpCisKK1BFUkwJID0gcGVybAorUFlUSE9OCSA9IHB5dGhvbgorVVBYCSA9IHVweAorCitDSE1PRAkgPSBjaG1vZAorCitDQwkgPSBnY2MKK2djY19vayAgID0gJChzaGVsbCB0bXBmPWdjY19vay4kJCQkLnRtcDsgXAorCQkgICBpZiAkKENDKSAkKEdDQ09QVCkgJCgxKSAtYyAkKHRvcGRpcikvZHVtbXkuYyBcCisJCQktbyAkJHRtcGYgMj4vZGV2L251bGwgOyBcCisJCSAgIHRoZW4gZWNobyAnJCgxKSc7IGVsc2UgZWNobyAnJCgyKSc7IGZpOyBcCisJCSAgIHJtIC1mICQkdG1wZikKKworTEQJID0gbGQKK09CSkRVTVAJID0gb2JqZHVtcAorT0JKQ09QWSAgPSBvYmpjb3B5CitTVFJJUCAgICA9IHN0cmlwCitBUiAgICAgICA9IGFyCitOTSAgICAgICA9IG5tCitSQU5MSUIgICA9IHJhbmxpYgorU1RSSVAJID0gc3RyaXAKK0daSVBQUk9HID0gZ3ppcAorWFoJID0geHoKK1BOR1RPUE5NID0gcG5ndG9wbm0KK01DT1BZICAgID0gbWNvcHkKK01GT1JNQVQgID0gbWZvcm1hdAorTUtJU09GUyAgPSBta2lzb2ZzCitTRUQJID0gc2VkCitXR0VUCSA9IHdnZXQKKworY29tMzIgICAgPSAkKHRvcGRpcikvY29tMzIKKworIyBBcmNoaXRlY3R1cmUgZGVmaW5pdGlvbgorU1VCQVJDSCA6PSAkKHNoZWxsIHVuYW1lIC1tIHwgc2VkIC1lIHMvaS44Ni9pMzg2LykgCisjIG9uIHg4Nl82NCwgQVJDSCBoYXMgdHJhaWxpbmcgd2hpdGVzcGFjZQorIyBzdHJpcCB3aGl0ZSBzcGFjZXMgaW4gQVJDSAorQVJDSCA/PSAkKHN0cmlwICQoU1VCQVJDSCkpCisKKyMgQ29tbW9uIHdhcm5pbmdzIHdlIHdhbnQgZm9yIGFsbCBnY2MtZ2VuZXJhdGVkIGNvZGUKK0dDQ1dBUk4gID0gLVcgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAkKERFQlVHT1BUKQorCisjIENvbW1vbiBzdGFuemEgdG8gbWFrZSBnY2MgZ2VuZXJhdGUgLiouZCBkZXBlbmRlbmN5IGZpbGVzCitNQUtFREVQUyA9IC1XcCwtTVQsJEAsLU1ELCQoZGlyICRAKS4kKG5vdGRpciAkQCkuZAorCisjIERlcGVuZGVuY2llcyB0aGF0IGV4Y2x1ZGUgc3lzdGVtIGhlYWRlcnM7IHVzZSB3aGVuZXZlciB3ZSB1c2UKKyMgaGVhZGVyIGZpbGVzIGZyb20gdGhlIHBsYXRmb3JtLgorVU1BS0VERVBTID0gLVdwLC1NVCwkQCwtTU1ELCQoZGlyICRAKS4kKG5vdGRpciAkQCkuZAorCisjIEl0ZW1zIHRoYXQgYXJlIG9ubHkgYXBwcm9wcmlhdGUgZHVyaW5nIGRldmVsb3BtZW50OyB0aGlzIGZpbGUgaXMKKyMgcmVtb3ZlZCB3aGVuIHRhcmJhbGxzIGFyZSBnZW5lcmF0ZWQuCistaW5jbHVkZSAkKE1BS0VESVIpL2RldmVsLm1rCisKKyMgTG9jYWwgYWRkaXRpb25zLCBsaWtlIC1EREVCVUcgY2FuIGdvIGhlcmUKKy1pbmNsdWRlICQoTUFLRURJUikvbG9jYWwubWsKZGlmZiAtLWdpdCBhL210b29scy9NYWtlZmlsZSBiL210b29scy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MDI2OWVmCi0tLSAvZGV2L251bGwKKysrIGIvbXRvb2xzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDkgQEAKK2luY2x1ZGUgJChNQUtFRElSKS9zeXNsaW51eC5taworCitPUFRGTEFHUyA9IC1nIC1PcworSU5DTFVERVMgPSAtSSQoU1JDKSAtSSQob2JqZGlyKSAtSSQoU1JDKS8uLi9saWJmYXQgLUkkKFNSQykvLi4vbGliaW5zdGFsbGVyCitDRkxBR1MJID0gJChHQ0NXQVJOKSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0ICQoT1BURkxBR1MpICQoSU5DTFVERVMpCitMREZMQUdTCSA9IAorCitTUkNTICAgICA9IHN5c2xpbnV4LmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9mcy5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvc3lzbHhtb2QuYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL3N5c2x4b3B0LmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9zZXRhZHYuYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL2Jvb3RzZWN0X2Jpbi5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvbGRsaW51eF9iaW4uYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL2xkbGludXhjMzJfYmluLmMgXAorCSAgICQod2lsZGNhcmQgJChTUkMpLy4uL2xpYmZhdC8qLmMpCitPQkpTCSA9ICQocGF0c3Vic3QgJS5jLCUubywkKG5vdGRpciAkKFNSQ1MpKSkKKworLlNVRkZJWEVTOiAuYyAubyAuaSAucyAuUworCitWUEFUSCA9ICQoU1JDKTokKFNSQykvLi4vbGliZmF0OiQoU1JDKS8uLi9saWJpbnN0YWxsZXI6JChPQkopLy4uL2xpYmluc3RhbGxlcgorCithbGw6IGluc3RhbGxlcgorCit0aWR5IGRpc3Q6CisJLXJtIC1mICoubyAqLmkgKi5zICouYSAuKi5kICoudG1wCisKK2NsZWFuOiB0aWR5CisJLXJtIC1mIHN5c2xpbnV4CisKK3Nwb3RsZXNzOiBjbGVhbgorCS1ybSAtZiAqfgorCitpbnN0YWxsZXI6IHN5c2xpbnV4CisKK3N5c2xpbnV4OiAkKE9CSlMpCisJJChDQykgJChMREZMQUdTKSAtbyAkQCAkXgorCitzdHJpcDoKKwkkKFNUUklQKSBzeXNsaW51eAorCislLm86ICUuYworCSQoQ0MpICQoVU1BS0VERVBTKSAkKENGTEFHUykgLWMgLW8gJEAgJDwKKyUuaTogJS5jCisJJChDQykgJChVTUFLRURFUFMpICQoQ0ZMQUdTKSAtRSAtbyAkQCAkPAorJS5zOiAlLmMKKwkkKENDKSAkKFVNQUtFREVQUykgJChDRkxBR1MpIC1TIC1vICRAICQ8CisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL210b29scy9zeXNsaW51eC5jIGIvbXRvb2xzL3N5c2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTkyNDQzMAotLS0gL2Rldi9udWxsCisrKyBiL210b29scy9zeXNsaW51eC5jCkBAIC0wLDAgKzEsNDA4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMTk5OC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXNsaW51eC5jIC0gTGludXggaW5zdGFsbGVyIHByb2dyYW0gZm9yIFNZU0xJTlVYCisgKgorICogVGhpcyBwcm9ncmFtIG5vdyByZXF1aXJlcyBtdG9vbHMuICBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgbG90CisgKiBlYXNpZXIgdG8gZGVhbCB3aXRoIHRoYW4gZGVhbGluZyB3aXRoIG5lZWRpbmcgbW91bnQgcHJpdmlsZWdlcy4KKyAqIFdlIG5lZWQgZGV2aWNlIHdyaXRlIHBlcm1pc3Npb24gYW55d2F5LgorICovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzZXhpdHMuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlICJzeXNsaW51eC5oIgorI2luY2x1ZGUgImxpYmZhdC5oIgorI2luY2x1ZGUgInNldGFkdi5oIgorI2luY2x1ZGUgInN5c2x4b3B0LmgiCisjaW5jbHVkZSAic3lzbHhmcy5oIgorCitjaGFyICpwcm9ncmFtOwkJCS8qIE5hbWUgb2YgcHJvZ3JhbSAqLworcGlkX3QgbXlwaWQ7CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkgZGllKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZ3JhbSwgbXNnKTsKKyAgICBleGl0KDEpOworfQorCit2b2lkIF9fYXR0cmlidXRlX18gKChub3JldHVybikpIGRpZV9lcnIoY29uc3QgY2hhciAqbXNnKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgcHJvZ3JhbSwgbXNnLCBzdHJlcnJvcihlcnJubykpOworICAgIGV4aXQoMSk7Cit9CisKKy8qCisgKiByZWFkL3dyaXRlIHdyYXBwZXIgZnVuY3Rpb25zCisgKi8KK3NzaXplX3QgeHByZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCkKK3sKKyAgICBjaGFyICpidWZwID0gKGNoYXIgKilidWY7CisgICAgc3NpemVfdCBydjsKKyAgICBzc2l6ZV90IGRvbmUgPSAwOworCisgICAgd2hpbGUgKGNvdW50KSB7CisJcnYgPSBwcmVhZChmZCwgYnVmcCwgY291bnQsIG9mZnNldCk7CisJaWYgKHJ2ID09IDApIHsKKwkgICAgZGllKCJzaG9ydCByZWFkIik7CisJfSBlbHNlIGlmIChydiA9PSAtMSkgeworCSAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKwkJY29udGludWU7CisJICAgIH0gZWxzZSB7CisJCWRpZShzdHJlcnJvcihlcnJubykpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgYnVmcCArPSBydjsKKwkgICAgb2Zmc2V0ICs9IHJ2OworCSAgICBkb25lICs9IHJ2OworCSAgICBjb3VudCAtPSBydjsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIGRvbmU7Cit9CisKK3NzaXplX3QgeHB3cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBvZmZfdCBvZmZzZXQpCit7CisgICAgY29uc3QgY2hhciAqYnVmcCA9IChjb25zdCBjaGFyICopYnVmOworICAgIHNzaXplX3QgcnY7CisgICAgc3NpemVfdCBkb25lID0gMDsKKworICAgIHdoaWxlIChjb3VudCkgeworCXJ2ID0gcHdyaXRlKGZkLCBidWZwLCBjb3VudCwgb2Zmc2V0KTsKKwlpZiAocnYgPT0gMCkgeworCSAgICBkaWUoInNob3J0IHdyaXRlIik7CisJfSBlbHNlIGlmIChydiA9PSAtMSkgeworCSAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKwkJY29udGludWU7CisJICAgIH0gZWxzZSB7CisJCWRpZShzdHJlcnJvcihlcnJubykpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgYnVmcCArPSBydjsKKwkgICAgb2Zmc2V0ICs9IHJ2OworCSAgICBkb25lICs9IHJ2OworCSAgICBjb3VudCAtPSBydjsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIGRvbmU7Cit9CisKKy8qCisgKiBWZXJzaW9uIG9mIHRoZSByZWFkIGZ1bmN0aW9uIHN1aXRhYmxlIGZvciBsaWJmYXQKKyAqLworaW50IGxpYmZhdF94cHJlYWQoaW50cHRyX3QgcHAsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNlY3NpemUsCisJCSAgbGliZmF0X3NlY3Rvcl90IHNlY3RvcikKK3sKKyAgICBvZmZfdCBvZmZzZXQgPSAob2ZmX3QpIHNlY3RvciAqIHNlY3NpemUgKyBvcHQub2Zmc2V0OworICAgIHJldHVybiB4cHJlYWQocHAsIGJ1Ziwgc2Vjc2l6ZSwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBtb3ZlX2ZpbGUoY2hhciAqZmlsZW5hbWUpCit7CisgICAgY2hhciB0YXJnZXRfZmlsZVs0MDk2XSwgY29tbWFuZFs1MTIwXTsKKyAgICBjaGFyICpjcCA9IHRhcmdldF9maWxlLCAqZXAgPSB0YXJnZXRfZmlsZSArIHNpemVvZiB0YXJnZXRfZmlsZSAtIDE2OworICAgIGNvbnN0IGNoYXIgKnNkOworICAgIGludCBzbGFzaCA9IDE7CisgICAgaW50IHN0YXR1czsKKworICAgIGNwICs9IHNwcmludGYoY3AsICInczovIik7CisgICAgZm9yIChzZCA9IG9wdC5kaXJlY3Rvcnk7ICpzZDsgc2QrKykgeworCWlmICgqc2QgPT0gJy8nIHx8ICpzZCA9PSAnXFwnKSB7CisJICAgIGlmIChzbGFzaCkKKwkJY29udGludWU7CS8qIFJlbW92ZSBkdXBsaWNhdGVkIHNsYXNoZXMgKi8KKwkgICAgc2xhc2ggPSAxOworCX0gZWxzZSBpZiAoKnNkID09ICdcJycgfHwgKnNkID09ICchJykgeworCSAgICBzbGFzaCA9IDA7CisJICAgIGlmIChjcCA8IGVwKQorCQkqY3ArKyA9ICdcJyc7CisJICAgIGlmIChjcCA8IGVwKQorCQkqY3ArKyA9ICdcXCc7CisJICAgIGlmIChjcCA8IGVwKQorCQkqY3ArKyA9ICpzZDsKKwkgICAgaWYgKGNwIDwgZXApCisJCSpjcCsrID0gJ1wnJzsKKwkgICAgY29udGludWU7CisJfSBlbHNlIHsKKwkgICAgc2xhc2ggPSAwOworCX0KKworCWlmIChjcCA8IGVwKQorCSAgICAqY3ArKyA9ICpzZDsKKyAgICB9CisgICAgaWYgKCFzbGFzaCkKKwkqY3ArKyA9ICcvJzsKKyAgICBzcHJpbnRmKGNwLCAiJXMnIiwgZmlsZW5hbWUpOworCisgICAgLyogVGhpcyBjb21tYW5kIG1heSBmYWlsIGxlZ2l0aW1hdGVseSAqLworICAgIHNwcmludGYoY29tbWFuZCwgIm1hdHRyaWIgLWggLXIgLXMgJXMgMj4vZGV2L251bGwiLCB0YXJnZXRfZmlsZSk7CisgICAgc3RhdHVzID0gc3lzdGVtKGNvbW1hbmQpOworICAgICh2b2lkKXN0YXR1czsJCS8qIEtlZXAgX0ZPUlRJRllfU09VUkNFIGhhcHB5ICovCisKKyAgICBzcHJpbnRmKGNvbW1hbmQsICJtbW92ZSAtRCBvIC1EIE8gczovJXMgJXMiLCBmaWxlbmFtZSwgdGFyZ2V0X2ZpbGUpOworICAgIHN0YXR1cyA9IHN5c3RlbShjb21tYW5kKTsKKworICAgIGlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSkgeworCWZwcmludGYoc3RkZXJyLAorCQkiJXM6IHdhcm5pbmc6IHVuYWJsZSB0byBtb3ZlICVzXG4iLCBwcm9ncmFtLCBmaWxlbmFtZSk7CisKKwlzcHJpbnRmKGNvbW1hbmQsICJtYXR0cmliICtyICtoICtzIHM6LyVzIiwgZmlsZW5hbWUpOworCXN0YXR1cyA9IHN5c3RlbShjb21tYW5kKTsKKyAgICB9IGVsc2UgeworCXNwcmludGYoY29tbWFuZCwgIm1hdHRyaWIgK3IgK2ggK3MgJXMiLCB0YXJnZXRfZmlsZSk7CisJc3RhdHVzID0gc3lzdGVtKGNvbW1hbmQpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgc2VjdGJ1ZltTRUNUT1JfU0laRV07CisgICAgaW50IGRldl9mZDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBpbnQgc3RhdHVzOworICAgIGNvbnN0IGNoYXIgKnRtcGRpcjsKKyAgICBjaGFyICptdG9vbHNfY29uZjsKKyAgICBpbnQgbXRjX2ZkOworICAgIEZJTEUgKm10YywgKm10cDsKKyAgICBzdHJ1Y3QgbGliZmF0X2ZpbGVzeXN0ZW0gKmZzOworICAgIGxpYmZhdF9zZWN0b3JfdCBzLCAqc2VjcDsKKyAgICBsaWJmYXRfc2VjdG9yX3QgKnNlY3RvcnM7CisgICAgaW50MzJfdCBsZGxpbnV4X2NsdXN0ZXI7CisgICAgaW50IG5zZWN0b3JzOworICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKKyAgICBpbnQgbGRsaW51eF9zZWN0b3JzLCBwYXRjaF9zZWN0b3JzOworICAgIGludCBpOworCisgICAgKHZvaWQpYXJnYzsJCQkvKiBVbnVzZWQgKi8KKworICAgIG15cGlkID0gZ2V0cGlkKCk7CisgICAgcHJvZ3JhbSA9IGFyZ3ZbMF07CisKKyAgICBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIE1PREVfU1lTTElOVVgpOworCisgICAgaWYgKCFvcHQuZGV2aWNlKQorCXVzYWdlKEVYX1VTQUdFLCBNT0RFX1NZU0xJTlVYKTsKKworICAgIGlmIChvcHQuc2VjdG9ycyB8fCBvcHQuaGVhZHMgfHwgb3B0LnJlc2V0X2FkdiB8fCBvcHQuc2V0X29uY2UKKwl8fCAob3B0LnVwZGF0ZV9vbmx5ID4gMCkgfHwgb3B0Lm1lbnVfc2F2ZSkgeworCWZwcmludGYoc3RkZXJyLAorCQkiQXQgbGVhc3Qgb25lIHNwZWNpZmllZCBvcHRpb24gbm90IHlldCBpbXBsZW1lbnRlZCIKKwkJIiBmb3IgdGhpcyBpbnN0YWxsZXIuXG4iKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qCisgICAgICogVGVtcCBkaXJlY3Rvcnkgb2YgY2hvaWNlLi4uCisgICAgICovCisgICAgdG1wZGlyID0gZ2V0ZW52KCJUTVBESVIiKTsKKyAgICBpZiAoIXRtcGRpcikgeworI2lmZGVmIFBfdG1wZGlyCisJdG1wZGlyID0gUF90bXBkaXI7CisjZWxpZiBkZWZpbmVkKF9QQVRIX1RNUCkKKwl0bXBkaXIgPSBfUEFUSF9UTVA7CisjZWxzZQorCXRtcGRpciA9ICIvdG1wIjsKKyNlbmRpZgorICAgIH0KKworICAgIC8qCisgICAgICogRmlyc3QgbWFrZSBzdXJlIHdlIGNhbiBvcGVuIHRoZSBkZXZpY2UgYXQgYWxsLCBhbmQgdGhhdCB3ZSBoYXZlCisgICAgICogcmVhZC93cml0ZSBwZXJtaXNzaW9uLgorICAgICAqLworICAgIGRldl9mZCA9IG9wZW4ob3B0LmRldmljZSwgT19SRFdSKTsKKyAgICBpZiAoZGV2X2ZkIDwgMCB8fCBmc3RhdChkZXZfZmQsICZzdCkgPCAwKSB7CisJZGllX2VycihvcHQuZGV2aWNlKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIGlmICghb3B0LmZvcmNlICYmICFTX0lTQkxLKHN0LnN0X21vZGUpICYmICFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJZnByaW50ZihzdGRlcnIsCisJCSIlczogbm90IGEgYmxvY2sgZGV2aWNlIG9yIHJlZ3VsYXIgZmlsZSAodXNlIC1mIHRvIG92ZXJyaWRlKVxuIiwKKwkJb3B0LmRldmljZSk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICB4cHJlYWQoZGV2X2ZkLCBzZWN0YnVmLCBTRUNUT1JfU0laRSwgb3B0Lm9mZnNldCk7CisKKyAgICAvKgorICAgICAqIENoZWNrIHRvIHNlZSB0aGF0IHdoYXQgd2UgZ290IHdhcyBpbmRlZWQgYW4gTVMtRE9TIGJvb3Qgc2VjdG9yL3N1cGVyYmxvY2sKKyAgICAgKi8KKyAgICBpZiAoKGVycm1zZyA9IHN5c2xpbnV4X2NoZWNrX2Jvb3RzZWN0KHNlY3RidWYsIE5VTEwpKSkgeworCWRpZShlcnJtc2cpOworICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlIGFuIG10b29scyBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgKi8KKyAgICBpZiAoYXNwcmludGYoJm10b29sc19jb25mLCAiJXMvL3N5c2xpbnV4LW10b29scy1YWFhYWFgiLCB0bXBkaXIpIDwgMCB8fAorCSFtdG9vbHNfY29uZikKKwlkaWVfZXJyKHRtcGRpcik7CisKKyAgICBtdGNfZmQgPSBta3N0ZW1wKG10b29sc19jb25mKTsKKyAgICBpZiAobXRjX2ZkIDwgMCB8fCAhKG10YyA9IGZkb3BlbihtdGNfZmQsICJ3IikpKQorCWRpZV9lcnIobXRvb2xzX2NvbmYpOworCisgICAgZnByaW50ZihtdGMsCisJICAgIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIHNvbWUgZmxhc2ggbWVtb3JpZXMgKi8KKwkgICAgIk1UT09MU19TS0lQX0NIRUNLPTFcbiIKKwkgICAgIk1UT09MU19GQVRfQ09NUEFUSUJJTElUWT0xXG4iCisJICAgICJkcml2ZSBzOlxuIgorCSAgICAiICBmaWxlPVwiL3Byb2MvJWx1L2ZkLyVkXCJcbiIKKwkgICAgIiAgb2Zmc2V0PSVsbHVcbiIsCisJICAgICh1bnNpZ25lZCBsb25nKW15cGlkLAorCSAgICBkZXZfZmQsICh1bnNpZ25lZCBsb25nIGxvbmcpb3B0Lm9mZnNldCk7CisKKyAgICBpZiAoZmVycm9yKG10YykgfHwgZmNsb3NlKG10YykpCisJZGllX2VycihtdG9vbHNfY29uZik7CisKKyAgICAvKgorICAgICAqIFJ1biBtdG9vbHMgdG8gY3JlYXRlIHRoZSBMRExJTlVYLlNZUyBmaWxlCisgICAgICovCisgICAgaWYgKHNldGVudigiTVRPT0xTUkMiLCBtdG9vbHNfY29uZiwgMSkpIHsKKwlwZXJyb3IocHJvZ3JhbSk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBhIHZhY3VvdXMgQURWIGluIG1lbW9yeS4gIFRoaXMgc2hvdWxkIGJlIHNtYXJ0ZXIuCisgICAgICovCisgICAgc3lzbGludXhfcmVzZXRfYWR2KHN5c2xpbnV4X2Fkdik7CisKKyAgICAvKiBUaGlzIGNvbW1hbmQgbWF5IGZhaWwgbGVnaXRpbWF0ZWx5ICovCisgICAgc3RhdHVzID0gc3lzdGVtKCJtYXR0cmliIC1oIC1yIC1zIHM6L2xkbGludXguc3lzIDI+L2Rldi9udWxsIik7CisgICAgKHZvaWQpc3RhdHVzOwkJLyogS2VlcCBfRk9SVElGWV9TT1VSQ0UgaGFwcHkgKi8KKworICAgIG10cCA9IHBvcGVuKCJtY29weSAtRCBvIC1EIE8gLW8gLSBzOi9sZGxpbnV4LnN5cyIsICJ3Iik7CisgICAgaWYgKCFtdHAgfHwKKwlmd3JpdGUoKGNvbnN0IHZvaWQgX2ZvcmNlICopc3lzbGludXhfbGRsaW51eCwKKwkgICAgICAgMSwgc3lzbGludXhfbGRsaW51eF9sZW4sIG10cCkKKwkJIT0gc3lzbGludXhfbGRsaW51eF9sZW4gfHwKKwlmd3JpdGUoKGNvbnN0IHZvaWQgX2ZvcmNlICopc3lzbGludXhfYWR2LAorCSAgICAgICAxLCAyICogQURWX1NJWkUsIG10cCkKKwkJIT0gMiAqIEFEVl9TSVpFIHx8CisJKHN0YXR1cyA9IHBjbG9zZShtdHApLCAhV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSkpIHsKKwlkaWUoImZhaWxlZCB0byBjcmVhdGUgbGRsaW51eC5zeXMiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdywgdXNlIGxpYmZhdCB0byBjcmVhdGUgYSBibG9jayBtYXAKKyAgICAgKi8KKyAgICBsZGxpbnV4X3NlY3RvcnMgPSAoc3lzbGludXhfbGRsaW51eF9sZW4gKyAyICogQURWX1NJWkUKKwkJICAgICAgICsgU0VDVE9SX1NJWkUgLSAxKSA+PiBTRUNUT1JfU0hJRlQ7CisgICAgc2VjdG9ycyA9IGNhbGxvYyhsZGxpbnV4X3NlY3RvcnMsIHNpemVvZiAqc2VjdG9ycyk7CisgICAgZnMgPSBsaWJmYXRfb3BlbihsaWJmYXRfeHByZWFkLCBkZXZfZmQpOworICAgIGxkbGludXhfY2x1c3RlciA9IGxpYmZhdF9zZWFyY2hkaXIoZnMsIDAsICJMRExJTlVYIFNZUyIsIE5VTEwpOworICAgIHNlY3AgPSBzZWN0b3JzOworICAgIG5zZWN0b3JzID0gMDsKKyAgICBzID0gbGliZmF0X2NsdXN0ZXJ0b3NlY3RvcihmcywgbGRsaW51eF9jbHVzdGVyKTsKKyAgICB3aGlsZSAocyAmJiBuc2VjdG9ycyA8IGxkbGludXhfc2VjdG9ycykgeworCSpzZWNwKysgPSBzOworCW5zZWN0b3JzKys7CisJcyA9IGxpYmZhdF9uZXh0c2VjdG9yKGZzLCBzKTsKKyAgICB9CisgICAgbGliZmF0X2Nsb3NlKGZzKTsKKworICAgIC8qIFBhdGNoIGxkbGludXguc3lzIGFuZCB0aGUgYm9vdCBzZWN0b3IgKi8KKyAgICBpID0gc3lzbGludXhfcGF0Y2goc2VjdG9ycywgbnNlY3RvcnMsIG9wdC5zdHVwaWRfbW9kZSwgb3B0LnJhaWRfbW9kZSwKKwkJICAgICAgIG9wdC5kaXJlY3RvcnksIE5VTEwpOworICAgIHBhdGNoX3NlY3RvcnMgPSAoaSArIFNFQ1RPUl9TSVpFIC0gMSkgPj4gU0VDVE9SX1NISUZUOworCisgICAgLyogV3JpdGUgdGhlIG5vdy1wYXRjaGVkIGZpcnN0IHNlY3RvcnMgb2YgbGRsaW51eC5zeXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGF0Y2hfc2VjdG9yczsgaSsrKSB7CisJeHB3cml0ZShkZXZfZmQsIChjb25zdCBjaGFyIF9mb3JjZSAqKXN5c2xpbnV4X2xkbGludXgKKwkJKyBpICogU0VDVE9SX1NJWkUsIFNFQ1RPUl9TSVpFLAorCQlvcHQub2Zmc2V0ICsgKChvZmZfdCkgc2VjdG9yc1tpXSA8PCBTRUNUT1JfU0hJRlQpKTsKKyAgICB9CisKKyAgICAvKiBNb3ZlIGxkbGludXguc3lzIHRvIHRoZSBkZXNpcmVkIGxvY2F0aW9uICovCisgICAgaWYgKG9wdC5kaXJlY3RvcnkpIHsKKwlzdGF0dXMgPSBtb3ZlX2ZpbGUoImxkbGludXguc3lzIik7CisgICAgfSBlbHNlIHsKKwlzdGF0dXMgPSBzeXN0ZW0oIm1hdHRyaWIgK3IgK2ggK3MgczovbGRsaW51eC5zeXMiKTsKKyAgICB9CisKKyAgICBpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykpIHsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIiVzOiB3YXJuaW5nOiBmYWlsZWQgdG8gc2V0IHN5c3RlbSBiaXQgb24gbGRsaW51eC5zeXNcbiIsCisJCXByb2dyYW0pOworICAgIH0KKworICAgIC8qIFRoaXMgY29tbWFuZCBtYXkgZmFpbCBsZWdpdGltYXRlbHkgKi8KKyAgICBzdGF0dXMgPSBzeXN0ZW0oIm1hdHRyaWIgLWggLXIgLXMgczovbGRsaW51eC5jMzIgMj4vZGV2L251bGwiKTsKKyAgICAodm9pZClzdGF0dXM7CQkvKiBLZWVwIF9GT1JUSUZZX1NPVVJDRSBoYXBweSAqLworCisgICAgbXRwID0gcG9wZW4oIm1jb3B5IC1EIG8gLUQgTyAtbyAtIHM6L2xkbGludXguYzMyIiwgInciKTsKKyAgICBpZiAoIW10cCB8fAlmd3JpdGUoKGNvbnN0IGNoYXIgX2ZvcmNlICopc3lzbGludXhfbGRsaW51eGMzMiwKKwkJICAgICAgIDEsIHN5c2xpbnV4X2xkbGludXhjMzJfbGVuLCBtdHApCisJIT0gc3lzbGludXhfbGRsaW51eGMzMl9sZW4gfHwKKwkoc3RhdHVzID0gcGNsb3NlKG10cCksICFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpKSkgeworCWRpZSgiZmFpbGVkIHRvIGNyZWF0ZSBsZGxpbnV4LmMzMiIpOworICAgIH0KKworICAgIC8qIE1vdmUgbGRsaW51eC5jMzIgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24gKi8KKyAgICBpZiAob3B0LmRpcmVjdG9yeSkgeworCXN0YXR1cyA9IG1vdmVfZmlsZSgibGRsaW51eC5jMzIiKTsKKyAgICB9IGVsc2UgeworCXN0YXR1cyA9IHN5c3RlbSgibWF0dHJpYiArciAraCArcyBzOi9sZGxpbnV4LmMzMiIpOworICAgIH0KKworICAgIGlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSkgeworCWZwcmludGYoc3RkZXJyLAorCQkiJXM6IHdhcm5pbmc6IGZhaWxlZCB0byBzZXQgc3lzdGVtIGJpdCBvbiBsZGxpbnV4LmMzMlxuIiwKKwkJcHJvZ3JhbSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGVhbnVwCisgICAgICovCisgICAgdW5saW5rKG10b29sc19jb25mKTsKKworICAgIC8qCisgICAgICogVG8gZmluaXNoIHVwLCB3cml0ZSB0aGUgYm9vdCBzZWN0b3IKKyAgICAgKi8KKworICAgIC8qIFJlYWQgdGhlIHN1cGVyYmxvY2sgYWdhaW4gc2luY2UgaXQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHdoaWxlIG1vdW50ZWQgKi8KKyAgICB4cHJlYWQoZGV2X2ZkLCBzZWN0YnVmLCBTRUNUT1JfU0laRSwgb3B0Lm9mZnNldCk7CisKKyAgICAvKiBDb3B5IHRoZSBzeXNsaW51eCBjb2RlIGludG8gdGhlIGJvb3Qgc2VjdG9yICovCisgICAgc3lzbGludXhfbWFrZV9ib290c2VjdChzZWN0YnVmLCBWRkFUKTsKKworICAgIC8qIFdyaXRlIG5ldyBib290IHNlY3RvciAqLworICAgIHhwd3JpdGUoZGV2X2ZkLCBzZWN0YnVmLCBTRUNUT1JfU0laRSwgb3B0Lm9mZnNldCk7CisKKyAgICBjbG9zZShkZXZfZmQpOworICAgIHN5bmMoKTsKKworICAgIC8qIERvbmUhICovCisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25vdy5wbCBiL25vdy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I1YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbm93LnBsCkBAIC0wLDAgKzEsMjEgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBQcmludCB0aGUgdGltZSAocG9zc2libHkgdGhlIG10aW1lIG9mIGEgZmlsZSkgYXMgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyCisjIElmIG1vcmUgdGhhbiBvbmUgZmlsZSwgcHJpbnQgdGhlIG10aW1lIG9mIHRoZSAqbmV3ZXN0KiBmaWxlLgorIworCit1bmRlZiAkbm93OworCitmb3JlYWNoICRmaWxlICggQEFSR1YgKSB7CisgICAgKCRkZXYsJGlubywkbW9kZSwkbmxpbmssJHVpZCwkZ2lkLCRyZGV2LCRzaXplLCRhdGltZSwkbXRpbWUsCisgICAgICRjdGltZSwkYmxrc2l6ZSwkYmxvY2tzKSA9IHN0YXQoJGZpbGUpOworICAgIGlmICggIWRlZmluZWQoJG5vdykgfHwgJG5vdyA8ICRtdGltZSApIHsKKwkkbm93ID0gJG10aW1lOworICAgIH0KK30KKworaWYgKCAhZGVmaW5lZCgkbm93KSApIHsKKyAgICAkbm93ID0gdGltZTsKK30KKworcHJpbnRmICIweCUwOHhcbiIsICRub3c7CmRpZmYgLS1naXQgYS9zYW1wbGUvTWFrZWZpbGUgYi9zYW1wbGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxNWEwNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZS9NYWtlZmlsZQpAQCAtMCwwICsxLDQwIEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyMgc2FtcGxlcyBmb3Igc3lzbGludXggdXNlcnMKKyMjCisKK2luY2x1ZGUgJChNQUtFRElSKS9lbWJlZGRlZC5taworVlBBVEggPSAkKFNSQykKKworUFBNVE9MU1MxNiA9ICQodG9wZGlyKS91dGlscy9wcG10b2xzczE2CisKK2FsbDogc3lzbG9nby5sc3MKKworJS5sc3M6CSUucHBtLmd6ICQoUFBNVE9MU1MxNikKKwkkKEdaSVBQUk9HKSAtY2QgJDwgfCBcCisJCSQoUFBNVE9MU1MxNikgXCMwMDAwMDA9MCBcI2QwZDBkMD03IFwjZjZmNmY2PTE1CVwKKwkJPiAkQAorCislLnBwbS5nejogJS5wbmcKKwkkKFBOR1RPUE5NKSAkPCB8IGd6aXAgLTkgPiAkQAorCit0aWR5IGRpc3Q6CisJcm0gLWYgKi5vICouYSAqLmxzdCAqLmVsZiAuKi5kCisKK2NsZWFuOiB0aWR5CisJcm0gLWYgKi5sc3MgKi5vICouYzMyICouY29tCisKK3Nwb3RsZXNzOiBjbGVhbgorCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS9zYW1wbGUvbTE2LTY0MHg2NDAtc3lzbGludXguanBnIGIvc2FtcGxlL20xNi02NDB4NjQwLXN5c2xpbnV4LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE2YmVhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlL20xNi02NDB4NjQwLXN5c2xpbnV4LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGUvc2FtcGxlLm1zZyBiL3NhbXBsZS9zYW1wbGUubXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5M2NkNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGUvc2FtcGxlLm1zZwpAQCAtMCwwICsxLDEzIEBACisQc2FtcGxlLm1zZworTm90ZSB0aGF0IDxDdHJsLVA+Li4uPEN0cmwtVz4gY2FuIGJlIHVzZWQgdG8gZGVsaW1pdCBzb21ldGhpbmcKK3RoYXQgaXMgZWZmZWN0aXZlbHkgYSBjb21tZW50LgorF1RoaXMgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgYmVmb3JlIHRoZSBpbWFnZS4KKxhzeXNsb2dvLmxzcworVGhpcyBtZXNzYWdlIGlzIGRpc3BsYXllZCBhZnRlciB0aGUgaW1hZ2UuCisSCitQbGVhc2Ugbm90ZSBjb2xvcnMgZG8gbm90IHdvcmsgcXVpdGUgYXMgZXhwZWN0ZWQgaW4gZ3JhcGhpY3MgbW9kZSEKKxcKKw8wNCBSRUQgDzA3IA8wMiBHUkVFTiAPMDcgDzAxIEJMVUUgDzA3CisPNDcgUkVEIA8wNyAPMjcgR1JFRU4gDzA3IA8xNyBCTFVFIA8wNworCisKZGlmZiAtLWdpdCBhL3NhbXBsZS9zeXNsaW51eF9zcGxhc2guanBnIGIvc2FtcGxlL3N5c2xpbnV4X3NwbGFzaC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1ZGRiZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZS9zeXNsaW51eF9zcGxhc2guanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZS9zeXNsb2dvLnBwbS5neiBiL3NhbXBsZS9zeXNsb2dvLnBwbS5negpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTQ2ZDliCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlL3N5c2xvZ28ucHBtLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c2xpbnV4LnNwZWMgYi9zeXNsaW51eC5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMmJiZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNsaW51eC5zcGVjCkBAIC0wLDAgKzEsMjcwIEBACisjIC0qLSBycG0gLSotCislZGVmaW5lIFJQTVZFUlNJT04gNi4wMworJWRlZmluZSBWRVJTSU9OICAgIDYuMDMKK1N1bW1hcnk6IEtlcm5lbCBsb2FkZXIgd2hpY2ggdXNlcyBhIEZBVCwgZXh0Mi8zIG9yIGlzbzk2NjAgZmlsZXN5c3RlbSBvciBhIFBYRSBuZXR3b3JrCitOYW1lOiBzeXNsaW51eAorVmVyc2lvbjogJXtSUE1WRVJTSU9OfQorUmVsZWFzZTogMQorTGljZW5zZTogR1BMCitHcm91cDogU3lzdGVtL0Jvb3QKK1NvdXJjZTA6IGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9ib290L3N5c2xpbnV4LyV7bmFtZX0tJXtWRVJTSU9OfS50YXIuZ3oKK0V4Y2x1c2l2ZUFyY2g6IGkzODYgaTQ4NiBpNTg2IGk2ODYgYXRobG9uIHBlbnRpdW00IHg4Nl82NAorUGFja2FnZXI6IEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorQnVpbGRyb290OiAle190bXBwYXRofS8le25hbWV9LSV7VkVSU0lPTn0tcm9vdAorQnVpbGRSZXF1aXJlczogbmFzbSA+PSAyLjAzLCBwZXJsCitBdXRvcmVxOiAwCislaWZhcmNoIHg4Nl82NAorUmVxdWlyZXM6IG10b29scywgbGliYy5zby42KCkoNjRiaXQpCislZGVmaW5lIG15X2NjIGdjYworJWVsc2UKK1JlcXVpcmVzOiBtdG9vbHMsIGxpYmMuc28uNgorJWRlZmluZSBteV9jYyBnY2MgLW0zMgorJWVuZGlmCisKKyMgTk9URTogZXh0bGludXggYmVsb25ncyBpbiAvc2Jpbiwgbm90IGluIC91c3Ivc2Jpbiwgc2luY2UgaXQgaXMgdHlwaWNhbGx5CisjIGEgc3lzdGVtIGJvb3Rsb2FkZXIsIGFuZCBtYXkgYmUgbmVjZXNzYXJ5IGZvciBzeXN0ZW0gcmVjb3ZlcnkuCislZGVmaW5lIF9zYmluZGlyIC9zYmluCisKKyVwYWNrYWdlIGRldmVsCitTdW1tYXJ5OiBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IgU1lTTElOVVggYWRkLW9uIG1vZHVsZXMKK0dyb3VwOiBEZXZlbG9wbWVudC9MaWJyYXJpZXMKK1JlcXVpcmVzOiBzeXNsaW51eAorCislZGVzY3JpcHRpb24KK1NZU0xJTlVYIGlzIGEgc3VpdGUgb2YgYm9vdGxvYWRlcnMsIGN1cnJlbnRseSBzdXBwb3J0aW5nIERPUyBGQVQKK2ZpbGVzeXN0ZW1zLCBMaW51eCBleHQyL2V4dDMgZmlsZXN5c3RlbXMgKEVYVExJTlVYKSwgUFhFIG5ldHdvcmsgYm9vdHMKKyhQWEVMSU5VWCksIG9yIElTTyA5NjYwIENELVJPTXMgKElTT0xJTlVYKS4gIEl0IGFsc28gaW5jbHVkZXMgYSB0b29sLAorTUVNRElTSywgd2hpY2ggbG9hZHMgbGVnYWN5IG9wZXJhdGluZyBzeXN0ZW1zIGZyb20gdGhlc2UgbWVkaWEuCisKKyVkZXNjcmlwdGlvbiBkZXZlbAorVGhlIFNZU0xJTlVYIGJvb3QgbG9hZGVyIGNvbnRhaW5zIGFuIEFQSSwgY2FsbGVkIENPTTMyLCBmb3Igd3JpdGluZworc29waGlzdGljYXRlZCBhZGQtb24gbW9kdWxlcy4gIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgbGlicmFyaWVzCituZWNlc3NhcnkgdG8gY29tcGlsZSBzdWNoIG1vZHVsZXMuCisKKyVwYWNrYWdlIGV4dGxpbnV4CitTdW1tYXJ5OiBUaGUgRVhUTElOVVggYm9vdGxvYWRlciwgZm9yIGJvb3RpbmcgdGhlIGxvY2FsIHN5c3RlbS4KK0dyb3VwOiBTeXN0ZW0vQm9vdAorUmVxdWlyZXM6IHN5c2xpbnV4CisKKyVkZXNjcmlwdGlvbiBleHRsaW51eAorVGhlIEVYVExJTlVYIGJvb3Rsb2FkZXIsIGZvciBib290aW5nIHRoZSBsb2NhbCBzeXN0ZW0sIGFzIHdlbGwgYXMgYWxsCit0aGUgU1lTTElOVVgvUFhFTElOVVggbW9kdWxlcyBpbiAvYm9vdC4KKworJXBhY2thZ2UgdGZ0cGJvb3QKK1N1bW1hcnk6IFNZU0xJTlVYIG1vZHVsZXMgaW4gL3RmdHBib290LCBhdmFpbGFibGUgZm9yIG5ldHdvcmsgYm9vdGluZworR3JvdXA6IEFwcGxpY2F0aW9ucy9JbnRlcm5ldAorUmVxdWlyZXM6IHN5c2xpbnV4CisKKyVkZXNjcmlwdGlvbiB0ZnRwYm9vdAorQWxsIHRoZSBTWVNMSU5VWC9QWEVMSU5VWCBtb2R1bGVzIGRpcmVjdGx5IGF2YWlsYWJsZSBmb3IgbmV0d29yaworYm9vdGluZyBpbiB0aGUgL3RmdHBib290IGRpcmVjdG9yeS4KKworJXByZXAKKyVzZXR1cCAtcSAtbiBzeXNsaW51eC0le1ZFUlNJT059CisKKyVidWlsZAorbWFrZSBDQz0nJXtteV9jY30nIGNsZWFuCittYWtlIENDPScle215X2NjfScgaW5zdGFsbGVyCittYWtlIENDPScle215X2NjfScgLUMgc2FtcGxlIHRpZHkKKworJWluc3RhbGwKK3JtIC1yZiAle2J1aWxkcm9vdH0KK21ha2UgQ0M9JyV7bXlfY2N9JyBpbnN0YWxsLWFsbCBcCisJSU5TVEFMTFJPT1Q9JXtidWlsZHJvb3R9IEJJTkRJUj0le19iaW5kaXJ9IFNCSU5ESVI9JXtfc2JpbmRpcn0gXAorCUxJQkRJUj0le19saWJkaXJ9IERBVEFESVI9JXtfZGF0YWRpcn0gXAorCU1BTkRJUj0le19tYW5kaXJ9IElOQ0RJUj0le19pbmNsdWRlZGlyfSBcCisJVEZUUEJPT1Q9L3RmdHBib290IEVYVExJTlVYRElSPS9ib290L2V4dGxpbnV4CittYWtlIENDPScle215X2NjfScgLUMgc2FtcGxlIHRpZHkKK21rZGlyIC1wICV7YnVpbGRyb290fS9ldGMKKyggY2QgJXtidWlsZHJvb3R9L2V0YyAmJiBsbiAtcyAuLi9ib290L2V4dGxpbnV4L2V4dGxpbnV4LmNvbmYgLiApCisKKyVjbGVhbgorcm0gLXJmICV7YnVpbGRyb290fQorCislZmlsZXMKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJWRvYyBDT1BZSU5HIE5FV1MgZG9jLyoKKyVkb2Mgc2FtcGxlCisle19tYW5kaXJ9L21hbiovKgorJXtfYmluZGlyfS8qCisle19kYXRhZGlyfS9zeXNsaW51eC8qLmNvbQorJXtfZGF0YWRpcn0vc3lzbGludXgvKi5leGUKKyV7X2RhdGFkaXJ9L3N5c2xpbnV4LyouYzMyCisle19kYXRhZGlyfS9zeXNsaW51eC8qLmJpbgorJXtfZGF0YWRpcn0vc3lzbGludXgvKi4wCisle19kYXRhZGlyfS9zeXNsaW51eC9tZW1kaXNrCisle19kYXRhZGlyfS9zeXNsaW51eC9kb3N1dGlsLyoKKyV7X2RhdGFkaXJ9L3N5c2xpbnV4L2RpYWcvKgorCislZmlsZXMgZGV2ZWwKKyV7X2RhdGFkaXJ9L3N5c2xpbnV4L2NvbTMyCisKKyVmaWxlcyBleHRsaW51eAorJXtfc2JpbmRpcn0vZXh0bGludXgKKy9ib290L2V4dGxpbnV4CislY29uZmlnIC9ldGMvZXh0bGludXguY29uZgorCislZmlsZXMgdGZ0cGJvb3QKKy90ZnRwYm9vdAorCislcG9zdCBleHRsaW51eAorIyBJZiB3ZSBoYXZlIGEgL2Jvb3QvZXh0bGludXguY29uZiBmaWxlLCBhc3N1bWUgZXh0bGludXggaXMgb3VyIGJvb3Rsb2FkZXIKKyMgYW5kIHVwZGF0ZSBpdC4KK2lmIFsgLWYgL2Jvb3QvZXh0bGludXgvZXh0bGludXguY29uZiBdOyB0aGVuIFwKKwlleHRsaW51eCAtLXVwZGF0ZSAvYm9vdC9leHRsaW51eCA7IFwKK2VsaWYgWyAtZiAvYm9vdC9leHRsaW51eC5jb25mIF07IHRoZW4gXAorCW1rZGlyIC1wIC9ib290L2V4dGxpbnV4ICYmIFwKKwltdiAvYm9vdC9leHRsaW51eC5jb25mIC9ib290L2V4dGxpbnV4L2V4dGxpbnV4LmNvbmYgJiYgXAorCWV4dGxpbnV4IC0tdXBkYXRlIC9ib290L2V4dGxpbnV4IDsgXAorZmkKKworJXBvc3R1bgorCislY2hhbmdlbG9nCisqIEZyaSBEZWMgMTggMjAwOSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gUmVxdWlyZSBOQVNNIDIuMDMKKy0gUGFja2FnZSBkb3N1dGlsCisKKyogVGh1IE1heSAyOSAyMDA4IEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorLSBVc2UgaW5zdGFsbCB0YXJnZXRzOyBjbGVhbiB1cCB2YXJpb3VzIHBhdGhzLgorCisqIFRodSBKYW4gMTAgMjAwOCBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gQWRkIG1hbiBwYWdlcy4KKworKiBNb24gTm92IDE5IDIwMDcgQmVybmFyZCBMaSA8YmVybmFyZEB2YW5ocGMub3JnPgorLSBBZGRlZCBuZXRwYm0tcHJvZ3MgKHByb3ZpZGVzIHBuZ3RvcG5tKSB0byBCdWlsZFByZXJlcSAodGhpcyBzaG91bGQgYmUKKyAgY2hhbmdlZCB0byBCdWlsZFJlcXVpcmVzIHNpbmNlIGl0IGlzIGRlcHJlY2F0ZWQuLi4pCisKKyogVGh1IE1hciAxNSAyMDA3IEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorLSBNb3ZlIGV4dGxpbnV4IC9ib290IHN0dWZmIGludG8gL2Jvb3QvZXh0bGludXguCisKKyogVGh1IEphbiAyNSAyMDA3IEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorLSBIYWNrcyB0byBtYWtlIHRoZSAzMi1iaXQgdmVyc2lvbiBidWlsZCBjb3JyZWN0bHkgb24gNjQtYml0IG1hY2hpbmVzLgorCisqIE1vbiBTZXAgMTkgMjAwNiBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gQWRkIGEgc3lzbGludXgtdGZ0cGJvb3QgbW9kdWxlLgorLSBGYWN0b3IgZXh0bGludXggaW50byBpdHMgb3duIHBhY2thZ2UuCistIE1vdmUgdG8gJXtfZGF0YWRpcn0gKC91c3Ivc2hhcmUpLgorCisqIFdlZCBTZXAgMjEgMjAwNSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gSWYgL2Jvb3QvZXh0bGludXguY29uZiBleGlzdCwgcnVuIGV4dGxpbnV4IC0tdXBkYXRlLgorCisqIEZyaSBTZXAgIDkgMjAwNSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gQ29weSwgZG9uJ3QgbGluaywgKi5jMzIgaW50byAvYm9vdDsgcnBtIGRvZXNuJ3QgbGlrZSBicmVha2luZyBsaW5rcy4KKworKiBUdWUgQXVnIDIzIDIwMDUgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFB1dCAqLmMzMiBpbnRvIC9ib290LgorCisqIFRodSBEZWMgMzAgMjAwNCBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gbGlic3lzbGludXggZHJvcHBlZCBpbiBzeXNsaW51eCAzLjAwLgorLSBBZGRpdGlvbmFsIGRvY3VtZW50YXRpb24uCistIEFkZCBleHRsaW51eC4KKworKiBUdWUgRGVjIDE0IDIwMDQgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIEFkZCBhIGRldmVsIHBhY2thZ2UgZm9yIHRoZSBjb20zMiBsaWJyYXJ5IGFkZGVkIGluIDIuMTIuCisKKyogV2VkIEFwciAxNiAyMDAzIEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPiAyLjA0LTEKKy0gMi4wNCByZWxlYXNlCistIEFkZCBzdXBwb3J0IGZvciBsaWJzeXNsaW51eC5zbyoKKy0gVGVtcGxhdGl6ZSBmb3IgaW5jbHVzaW9uIGluIENWUyB0cmVlCisKKyogVGh1IEFwciAxMCAyMDAzIEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorLSAyLjAzIHJlbGVhc2UKKy0gQWRkIHN1cHBvcnQgZm9yIGxpYnN5c2xpbnV4LmEKKy0gQWRkIGtleXRhYi1saWxvLnBsIHRvIHRoZSAvdXNyL2xpYi9zeXNsaW51eCBkaXJlY3RvcnkKKy0gTW9kZXJuaXplIHN5bnRheAorLSBTdXBwb3J0IGJ1aWxkaW5nIG9uIHg4Ni02NAorCisqIFRodSBGZWIgMTMgMjAwMyBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gMi4wMiByZWxlYXNlOyBubyBsb25nZXIgc2V0dWlkCisKKyogVGh1IEphbiAzMCAyMDAzIEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorLSBQcmVwYXJlIGZvciAyLjAxIHJlbGVhc2U7IG1ha2UgL3Vzci9iaW4vc3lzbGludXggc2V0dWlkIHJvb3QKKworKiBGcmkgT2N0IDI1IDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMi4wMC4KKworKiBUdWUgQXVnIDI3IDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS43Ni4KKworKiBGcmkgSnVuIDE0IDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS43NS4KKworKiBTYXQgSnVuICAxIDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS43NC4KKworKiBTdW4gTWF5IDI2IDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS43My4KKworKiBUdWUgQXByIDIzIDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS43Mi4KKworKiBXZWQgQXByIDE3IDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS43MS4KKy0gVXBkYXRlIHRoZSB0aXRsZS4KKworKiBXZWQgQXByIDE3IDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS43MC4KKworKiBTYXQgRmViICAzIDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS42Ny4KKworKiBUdWUgSmFuICAxIDIwMDIgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS42Ni4KKworKiBTYXQgRGVjIDE1IDIwMDEgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIFVwZ3JhZGUgdG8gMS42NTsgbWFrZSBhcHByb3ByaWF0ZSBjaGFuZ2VzLgorCisqIFNhdCBBdWcgMjQgMjAwMSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gVXBncmFkZSB0byAxLjY0LgorCisqIE1vbiBBdWcgIDYgMjAwMSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gVXBncmFkZSB0byAxLjYzLgorLSBVc2UgbWFrZSBpbnN0YWxsIHNpbmNlIHRoZSBzdG9jayBTWVNMSU5VWCBkaXN0cmlidXRpb24gbm93IHN1cHBvcnRzCisgIElOU1RBTExST09ULgorCisqIFNhdCBBcHIgMjQgMjAwMSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gVXBncmFkZSB0byAxLjYyLgorCisqIFNhdCBBcHIgMTQgMjAwMSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gRml4IG1pc3NpbmcgJWZpbGVzOyBjb3JyZWN0IG1vZGVzLgorCisqIEZyaSBBcHIgMTMgMjAwMSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gVXBncmFkZSB0byAxLjYxCistIEluc3RhbGwgYXV4aWxsaWFyeSBwcm9ncmFtcyBpbiAvdXNyL2xpYi9zeXNsaW51eAorCisqIFNhdCBGZWIgMTAgMjAwMSBNYXR0IFdpbHNvbiA8bXN3QHJlZGhhdC5jb20+CistIDEuNTIKKworKiBXZWQgSmFuIDI0IDIwMDEgTWF0dCBXaWxzb24gPG1zd0ByZWRoYXQuY29tPgorLSAxLjUxcHJlNworCisqIE1vbiBKYW4gMjIgMjAwMSBNYXR0IFdpbHNvbiA8bXN3QHJlZGhhdC5jb20+CistIDEuNTFwcmU1CisKKyogRnJpIEphbiAxOSAyMDAxIE1hdHQgV2lsc29uIDxtc3dAcmVkaGF0LmNvbT4KKy0gMS41MXByZTMsIHdpdGggZTgyMCBkZXRlY3Rpb24KKworKiBUdWUgRGVjIDEyIDIwMDAgVGhhbiBOZ28gPHRoYW5AcmVkaGF0LmNvbT4KKy0gcmVidWlsdCB3aXRoIGZpeGVkIGZpbGV1dGlscworCisqIFRodSBOb3YgOSAyMDAwIFRoYW4gTmdvIDx0aGFuQHJlZGhhdC5jb20+CistIHVwZGF0ZSB0byAxLjQ5CistIHVwZGF0ZSBmdHAgc2l0ZQorLSBjbGVhbiB1cCBzcGVjZmlsZQorLSBhZGQgc29tZSB1c2VmdWwgZG9jdW1lbnRzCisKKyogVHVlIEp1bCAxOCAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KKy0gYWRkICUlZGVmYXR0ciAocmVsZWFzZSA0KQorCisqIFdlZCBKdWwgMTIgMjAwMCBQcm9zcGVjdG9yIDxidWd6aWxsYUByZWRoYXQuY29tPgorLSBhdXRvbWF0aWMgcmVidWlsZAorCisqIFRodSBKdWwgMDYgMjAwMCBUcm9uZCBFaXZpbmQgR2xvbXNy+GQgPHRlZ0ByZWRoYXQuY29tPgorLSB1c2UgJSV7X3RtcHBhdGh9CistIGNoYW5nZSBhcHBsaWNhdGlvbiBncm91cCAoQXBwbGljYXRpb25zL0ludGVybmV0IGRvZXNuJ3Qgc2VlbQorICByaWdodCB0byBtZSkKKy0gYWRkZWQgQnVpbGRSZXF1aXJlcworCisqIFR1ZSBBcHIgMDQgMjAwMCBFcmlrIFRyb2FuIDxld3RAcmVkaGF0LmNvbT4KKy0gaW5pdGlhbCBwYWNrYWdpbmcKZGlmZiAtLWdpdCBhL3R4dC9NYWtlZmlsZSBiL3R4dC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDljNzk5Ci0tLSAvZGV2L251bGwKKysrIGIvdHh0L01ha2VmaWxlCkBAIC0wLDAgKzEsMTE4IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMTIgR2VuZSBDdW1tCisjIworIyMgICBTb21lIGxvZ2ljIGZyb20gd2luMzIvTWFrZWZpbGU6CisjIyAgICAgQ29weXJpZ2h0IDE5OTgtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgICBDb3B5cmlnaHQgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIyBBc2NpaURvYyBkb2N1bWVudGF0aW9uIGZvciBzeXNsaW51eAorIyMKKwordG9wZGlyID0gLi4KK01BS0VESVIgPSAkKHRvcGRpcikvbWsKKyMgaW5jbHVkZSAkKE1BS0VESVIpL2VtYmVkZGVkLm1rCisKK1ZQQVRIID0gJChTUkMpCisKK0EyWF9PUFRTCSA9IC1rCisjIEEyWF9PUFRTCSs9IC12CitBMlhfTUFOX09QVFMJID0gLUQgbWFuIC1mIG1hbnBhZ2UKKworRE9DUyAJCSA9IHN5c2xpbnV4LnR4dCBzeXNsaW51eC1jbGkudHh0IHN5c2xpbnV4LmNmZy50eHQgXAorCQkgICBpc29saW51eC50eHQgcHhlbGludXgudHh0CitNQU5fRE9DUwkgPSBtYW4vc3lzbGludXguMSBtYW4vc3lzbGludXgtY2xpLjEgbWFuL3N5c2xpbnV4LmNmZy41IFwKKwkJICAgbWFuL2lzb2xpbnV4LjEgbWFuL3B4ZWxpbnV4LjEKK0hUTUxfRE9DUwk6PSAkKHBhdHN1YnN0ICUudHh0LGh0bWwvJS5odG1sLCQoRE9DUykpIAorWEhUTUxfRE9DUwk6PSAkKHBhdHN1YnN0ICUudHh0LCUuaHRtbCwkKERPQ1MpKQorIyBNQU5fRE9DUwk6PSAkKHBhdHN1YnN0ICUudHh0LG1hbi8lLjEsJChET0NTMSkpICQocGF0c3Vic3QgJS50eHQsbWFuLyUuNSwkKERPQ1M1KSkKK1RFWFRfRE9DUwk6PSAkKHBhdHN1YnN0ICUudHh0LCUudGV4dCwkKERPQ1MpKQorUERGX0RPQ1MJOj0gJChwYXRzdWJzdCAlLnR4dCwlLnBkZiwkKERPQ1MpKQorVEFSR0VUUwkJID0KKworIyBBU0NJSURPQ19PSyA6PSAkKHNoZWxsIHdoaWNoIGFzY2lpZG9jIDI+JjEgOyBlY2hvICQkPykKK0FTQ0lJRE9DX09LCTo9ICQoc2hlbGwgd2hpY2ggYXNjaWlkb2MgPiAvZGV2L251bGwgOyBlY2hvICQkPykKK0EyWF9YTUxfT0sJOj0gJChzaGVsbCBhMnggJChBMlhfT1BUUykgLWYgZG9jYm9vayBoZWxsby50eHQgMj4mMSA7IGVjaG8gJCQ/KQoraWZlcSAoJChBMlhfWE1MX09LKSwwKQorQTJYX01BTl9PSwk6PSAkKHNoZWxsIFsgISAtZCBtYW4gXSAmJiBta2RpciBtYW4gOyBhMnggJChBMlhfTUFOX09QVFMpIGhlbGxvLnR4dCAyPiYxIDsgZWNobyAkJD8pCitBMlhfWEhUTUxfT0sJOj0gJChzaGVsbCBhMnggJChBMlhfT1BUUykgLWYgeGh0bWwgaGVsbG8ueG1sIDI+JjEgOyBlY2hvICQkPykKK0EyWF9URVhUX09LCTo9ICQoc2hlbGwgYTJ4ICQoQTJYX09QVFMpIC1mIHRleHQgaGVsbG8ueG1sIDI+JjEgOyBlY2hvICQkPykKK2VuZGlmCisKK2lmZXEgKCQoQVNDSUlET0NfT0spLDApCitUQVJHRVRTCQkrPSAkKEhUTUxfRE9DUykKK2VuZGlmCitpZmVxICgkKEEyWF9NQU5fT0spLDApCitUQVJHRVRTCQkrPSAkKE1BTl9ET0NTKQorZW5kaWYKK2lmZXEgKCQoQTJYX1hIVE1MX09LKSwwKQorVEFSR0VUUwkJKz0gJChYSFRNTF9ET0NTKQorZW5kaWYKK2lmZXEgKCQoQTJYX1RFWFRfT0spLDApCitUQVJHRVRTCQkrPSAkKFRFWFRfRE9DUykKK2VuZGlmCisKKyMgJChIVE1MX0RPQ1MpICQoTUFOX0RPQ1MpICQoWEhUTUxfRE9DUykgJChURVhUX0RPQ1MpCithbGw6CSQoVEFSR0VUUykKKworc3lzbGludXguY2ZnLnR4dDoJY29tLWJ1Zy50eHQgY29tLXJwdC50eHQKKworIyBEdXJpbmcgJ21ha2UgYWxsJywgKi54bWwgaXMga2VwdCBidXQgZGVsZXRlZCBhdCB0aGUgZW5kOyBkbyB3ZSBfcmVhbGx5XworIwluZWVkIHRoZSBYTUwgbG9uZ2VyPworLlBSRUNJT1VTOgklLnhtbAorCisjICUuaHRtbDoJJS50eHQKKyMgCWFzY2lpZG9jIC1EIGh0bWwgJDwKKworIyBNYXJrIGFzIC5QSE9OWSBzbyB0aGV5J3JlIGlnbm9yZWQgaWYgZm91bmQgaW4gVlBBVEgKKy5QSE9OWTogaHRtbC8gbWFuLyB0ZXh0LyB4aHRtbC8KKworaHRtbC8gbWFuLyB0ZXh0LyB4aHRtbC86CisJbWtkaXIgLXAgJEAKKworaHRtbC8lLmh0bWw6CSUudHh0CXwgaHRtbC8KKwlhc2NpaWRvYyAtbyAkQCAkPAorCisjIEFzIG9mIEFzY2lpRG9jLTguNS4yLCBhbHRlcmluZyB0aGUgb3V0cHV0IGZpbGVuYW1lIGZvciBhMnggZG9lcyBub3QgYXBwZWFyIHBvc3NpYmxlCisjIHhodG1sLyUuaHRtbDoJJS50eHQKKyMgCWEyeCAkKEEyWF9PUFRTKSAtRCB4aHRtbCAtZiB4aHRtbCAkPAorIyB0ZXh0LyUudGV4dDoJJS54bWwgJS50eHQKKyMgCWEyeCAkKEEyWF9PUFRTKSAtRCB0ZXh0IC1mIHRleHQgJDwKKworJS54bWw6CSUudHh0CisJYTJ4ICQoQTJYX09QVFMpIC1mIGRvY2Jvb2sgJDwKKworIyB3aGVuICUueG1sIGlzIG1pc3NpbmcsIGFuIHVwZGF0ZSB0byAlLnR4dCBtdXN0IGZvcmNlIHJlZ2VuZXJhdGlvbgorJS5odG1sOgklLnhtbCAlLnR4dAorCWEyeCAkKEEyWF9PUFRTKSAtZiB4aHRtbCAkPAorCittYW4vJS4xOgklLnR4dAl8IG1hbi8KKwlhMnggJChBMlhfTUFOX09QVFMpICQ8CisKK21hbi8lLjU6CSUudHh0CXwgbWFuLworCWEyeCAkKEEyWF9NQU5fT1BUUykgJDwKKworJS50ZXh0OgklLnhtbCAlLnR4dAorCWEyeCAkKEEyWF9PUFRTKSAtZiB0ZXh0ICQ8CisKKyUucGRmOgklLnhtbCAlLnR4dAorCWEyeCAkKEEyWF9PUFRTKSAtZiBwZGYgJDwKKwordGlkeSBkaXN0OgorCXJtIC1mICp+ICoueG1sICoudGV4dC5odG1sIHRleHQvKi50ZXh0Lmh0bWwgdGV4dC8qLnhtbCB4aHRtbC8qLnhtbAorCitjbGVhbjogdGlkeQorCitzcG90bGVzczogY2xlYW4KKwlybSAtZiAqLjEgKi41ICouY3NzICouaHRtbCAqLnRleHQgaHRtbC8qLmh0bWwgbWFuLyouMSBtYW4vKi41IHRleHQvKi50ZXh0IHhodG1sLyouaHRtbCB4aHRtbC8qLmNzcworCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS90eHQvY29tLWJ1Zy50eHQgYi90eHQvY29tLWJ1Zy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2MTM5YQotLS0gL2Rldi9udWxsCisrKyBiL3R4dC9jb20tYnVnLnR4dApAQCAtMCwwICsxLDExIEBACisKKy8vID09IEtOT1dOIEJVR1MgPT0KKworU2V2ZXJhbCBrbm93biBidWdzL2NvbW1vbiBwcm9ibGVtcyBhcmUgbGlzdGVkIGF0CitodHRwOi8vd3d3LnN5c2xpbnV4Lm9yZy93aWtpL2luZGV4LnBocC9Db21tb25fUHJvYmxlbXMgYW5kIGtub3duCitoYXJkd2FyZSBjb21wYXRpYmlsaXR5IGlzc3VlcyBhcmUgbGlzdGVkIGF0CitodHRwOi8vd3d3LnN5c2xpbnV4Lm9yZy93aWtpL2luZGV4LnBocC9IYXJkd2FyZV9Db21wYXRpYmlsaXR5IHdpdGgKK2ZpbGVuYW1lIHRyYW5zbGF0aW9uIGRpZmZpY3VsdHkgYW5kIGVhcmx5IFBYRSBzdGFja3MgYmVpbmcgc29tZSBvZiB0aGUKK21vc3QgY29tbW9uLiAgUmVwb3J0aW5nIG9mIG90aGVyIGVuY291bnRlcmVkIGlzc3VlcyBpcyB3ZWxjb21lIGFuZAorYXBwcmVjaWF0ZWQuCisKZGlmZiAtLWdpdCBhL3R4dC9jb20tZGVydi50eHQgYi90eHQvY29tLWRlcnYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzcwYzcKLS0tIC9kZXYvbnVsbAorKysgYi90eHQvY29tLWRlcnYudHh0CkBAIC0wLDAgKzEsMTEgQEAKKworLy8gPT0gREVSSVZBVElWRVMgPT0KKworVGhlICpTeXNsaW51eCogc3VpdGUgY29udGFpbnMgc2V2ZXJhbCBib290IGxvYWRlciAoY29yZSkgZGVyaXZhdGl2ZXMgKHZhcmlhbnRzKSwgY3VycmVudGx5IGJhc2VkIHNvbGVseSBvbiB0aGUgYm9vdCBtZWRpYToKKworCSpTWVNMSU5VWCogLSBEaXNrIChmbG9wcHkvaGFyZCBkaXNrKSBiYXNlZAorCSpQWEVMSU5VWCogLSBQWEUgbmV0d29yayBib290aW5nCisJKklTT0xJTlVYKiAtIElTTzk2NjAgKENEL0RWRDsgRWwgVG9yaXRvKSBiYXNlZAorCitQcmlvciB0byB2NC4wMCwgKlNZU0xJTlVYKiB3YXMgb25seSBmb3IgRkFUMTIvRkFUMTYvRkFUMzIgYW5kIGFub3RoZXIgZGVyaXZhdGl2ZSwgKkVYVExJTlVYKiwgd2FzIGZvciBleHQyL2V4dDMgZmlsZSBzeXN0ZW1zLCB3aG9zZSBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIG1lcmdlZCBpbnRvICpTWVNMSU5VWCouCisKZGlmZiAtLWdpdCBhL3R4dC9jb20tbmFtZS50eHQgYi90eHQvY29tLW5hbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDgxMWYKLS0tIC9kZXYvbnVsbAorKysgYi90eHQvY29tLW5hbWUudHh0CkBAIC0wLDAgKzEsMTIgQEAKKworLy8gPT0gTkFNSU5HIENPTlZFTlRJT04gPT0KKworQXMgb2YgMy43MywgYSBzdGFuZGFyZCBmb3IgbmFtaW5nIGNvbnZlbnRpb25zIHdhcyBhZG9wdGVkIHRvIG1vcmUKK2NsZWFybHkgZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGFzcGVjdHMuICBUaGUgbW9uaWtlciAiVGhlICpTeXNsaW51eCoKK1Byb2plY3QiLCBpbiBzdGFuZGFyZCBwcm9wZXIgbm91biBjYXBpdGFsaXphdGlvbiwgc2hhbGwgYmUgdXNlZCB0byByZWZlcgordG8gdGhlIHByb2plY3QgYXMgYSB3aG9sZS4gVGhlIGFsbC1jYXBzIGZvcm0gc2hhbGwgYmUgdXNlZCB0byByZWZlciB0byBhCitwYXJ0aWN1bGFyIGxvYWRlciB2YXJpYW50IHN1Y2ggYXMgIipTWVNMSU5VWCoiIGZvciB0aGUgc3RhbmRhcmQgZGlzaworKGZsb3BweS9oYXJkIGRpc2s7IGZvcm1lcmx5IGp1c3QgRkFUKSBsb2FkZXIuICBUaGUgYWxsLWxvd2VyIGNhc2UgZm9ybQorc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXIgdG8gYSBwYXJ0aWN1bGFyIGluc3RhbGxlciBzdWNoIGFzCisic3lzbGludXgtbXRvb2xzIiBmb3IgdGhlIG10b29scy1iYXNlZCBpbnN0YWxsZXIgZm9yICpTWVNMSU5VWCouCisKZGlmZiAtLWdpdCBhL3R4dC9jb20tcnB0LnR4dCBiL3R4dC9jb20tcnB0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTM2OGVlCi0tLSAvZGV2L251bGwKKysrIGIvdHh0L2NvbS1ycHQudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworLy8gPT0gQlVHIFJFUE9SVFMgPT0KKworSSB3b3VsZCBhcHByZWNpYXRlIGhlYXJpbmcgb2YgYW55IHByb2JsZW1zIHlvdSBoYXZlIHdpdGggU3lzbGludXguICBJCit3b3VsZCBhbHNvIGxpa2UgdG8gaGVhciBmcm9tIHlvdSBpZiB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgdXNlZCBTeXNsaW51eCwKKyplc3BlY2lhbGx5KiBpZiB5b3UgYXJlIHVzaW5nIGl0IGZvciBhIGRpc3RyaWJ1dGlvbi4KKworSWYgeW91IGFyZSByZXBvcnRpbmcgcHJvYmxlbXMsIHBsZWFzZSBpbmNsdWRlIGFsbCBwb3NzaWJsZSBpbmZvcm1hdGlvbgorYWJvdXQgeW91ciBzeXN0ZW0gYW5kIHlvdXIgQklPUzsgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWxsIHByb2JsZW1zCityZXBvcnRlZCB0dXJuIG91dCB0byBiZSBCSU9TIG9yIGhhcmR3YXJlIGJ1Z3MsIGFuZCBJIG5lZWQgYXMgbXVjaAoraW5mb3JtYXRpb24gYXMgcG9zc2libGUgaW4gb3JkZXIgdG8gZGlhZ25vc2UgdGhlIHByb2JsZW1zLgorCitUaGVyZSBpcyBhIG1haWxpbmcgbGlzdCBmb3IgZGlzY3Vzc2lvbiBhbW9uZyBTeXNsaW51eCB1c2VycyBhbmQgZm9yCithbm5vdW5jZW1lbnRzIG9mIG5ldyBhbmQgdGVzdCB2ZXJzaW9ucy4gIFRvIGpvaW4sIG9yIHRvIGJyb3dzZSB0aGUKK2FyY2hpdmUsIGdvIHRvOgorCitodHRwOi8vd3d3Lnp5dG9yLmNvbS9tYWlsbWFuL2xpc3RpbmZvL3N5c2xpbnV4CisKK1BsZWFzZSBETyBOT1Qgc2VuZCBIVE1MIG1lc3NhZ2VzIG9yIGF0dGFjaG1lbnRzIHRvIHRoZSBtYWlsaW5nIGxpc3QKKyhpbmNsdWRpbmcgbXVsdGlwYXJ0L2FsdGVybmF0aXZlIG9yIHNpbWlsYXIuKSAgQWxsIHN1Y2ggbWVzc2FnZXMgd2lsbCBiZQorYm91bmNlZC4KKwpkaWZmIC0tZ2l0IGEvdHh0L2hlbGxvLnR4dCBiL3R4dC9oZWxsby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1NzYyNwotLS0gL2Rldi9udWxsCisrKyBiL3R4dC9oZWxsby50eHQKQEAgLTAsMCArMSwxNiBAQAorPSBoZWxsbygxKSA9Cis6ZG9jdHlwZTogbWFucGFnZQorOmF1dGhvcjogV29ybGQgR3JlZXRlcgorOmF1dGhvci1lbWFpbDogaGVsbG9AZG9tYWluLmxvY2FsCis6cmV2ZGF0ZTogMTk3MC0wMS0wMQorOmRhdGEtdXJpOgorCisKKz09IE5BTUUgPT0KK2hlbGxvIC0gaGVsbG8gd29ybGQKKworPT0gU1lOT1BTSVMgPT0KK2hlbGxvCisKKz09IERlc2NyaXB0aW9uID09CitTYXkgaGVsbG8gYW5kIGdyZWV0IHRoZSB3b3JsZApkaWZmIC0tZ2l0IGEvdHh0L2lzb2xpbnV4LnR4dCBiL3R4dC9pc29saW51eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlN2Q3YwotLS0gL2Rldi9udWxsCisrKyBiL3R4dC9pc29saW51eC50eHQKQEAgLTAsMCArMSwxMTYgQEAKKz0gaXNvbGludXgoMSkgPQorOmRvY3R5cGU6IG1hbnBhZ2UKKzpyZXZkYXRlOiAyMDEzLTA2LTEyCis6YXV0aG9yOiBILiBQZXRlciBBbnZpbgorOmF1dGhvci1lbWFpbDogaHBhQHp5dG9yLmNvbQorOmVkaXRvcjE6IEdlbmUgQ3VtbQorOmVkaXRvcjEtZW1haWw6IGdlbmUuY3VtbUBnbWFpbC5jb20KKzplZGl0b3IxLXJldmxhc3Q6IDIwMTMtMDYtMTIKKworCis9PSBOQU1FID09Citpc29saW51eCAtIFRoZSBTeXNsaW51eCBkZXJpdmF0aXZlIElTT0xJTlVYIGZvciBJU085NjYwIENEL0RWRCBtZWRpYQorCisKKz09IFNZTk9QU0lTID09CitbdmVyc2VdCisqbWtpc29mcyogLW8gJ2lzb2ltYWdlJyBcCisJLWIgJ2lzb2xpbnV4L2lzb2xpbnV4LmJpbicgLWMgJ2lzb2xpbnV4L2Jvb3QuY2F0JyBcCisJLW5vLWVtdWwtYm9vdCAtYm9vdC1sb2FkLXNpemUgNCAtYm9vdC1pbmZvLXRhYmxlIFwKKwkncm9vdC1vZi1pc28tdHJlZScKKworCis9PSBERVNDUklQVElPTiA9PQorSVNPTElOVVggaXMgYSBib290IGxvYWRlciBmb3IgTGludXgvaTM4NiB0aGF0IG9wZXJhdGVzIG9mZiBJU08gOTY2MC9FbAorVG9yaXRvIENELVJPTXMgaW4gIm5vIGVtdWxhdGlvbiIgbW9kZS4gIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIGNyZWF0ZQorYW4gImVtdWxhdGlvbiBkaXNrIGltYWdlIiB3aXRoIGxpbWl0ZWQgc3BhY2UgKGZvciAiZmxvcHB5IGVtdWxhdGlvbiIpCitvciBjb21wYXRpYmlsaXR5IHByb2JsZW1zIChmb3IgImhhcmQgZGlzayBlbXVsYXRpb24iLikKKworVG8gY3JlYXRlIGFuIGltYWdlLCBjcmVhdGUgYSBkaXJlY3RvcnkgY2FsbGVkICJpc29saW51eC8iIChvciwgaWYgeW91CitwcmVmZXIsICJib290L2lzb2xpbnV4LyIpIHVuZGVybmVhdGggdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHlvdXIgSVNPIGltYWdlCittYXN0ZXIgZmlsZSB0cmVlLiAgQ29weSBpc29saW51eC5iaW4sIGEgY29uZmlnIGZpbGUgY2FsbGVkCisiaXNvbGludXguY2ZnIiAoc2VlICpzeXNsaW51eC5jZmcqKDUpIGZvciBkZXRhaWxzIG9uIHRoZSBjb25maWd1cmF0aW9uIGZpbGUpLAorYW5kIGFsbCBuZWNlc3NhcnkgZmlsZXMgKGtlcm5lbHMsIGluaXRyZCwgZGlzcGxheSBmaWxlcywgZXRjLikgaW50byB0aGlzCitkaXJlY3RvcnksIHRoZW4gdXNlIHRoZSBhYm92ZSBjb21tYW5kIHRvIGNyZWF0ZSB5b3VyIElTTyBpbWFnZSAoYWRkCithZGRpdGlvbmFsIG9wdGlvbnMgYXMgYXBwcm9wcmlhdGUsIHN1Y2ggYXMgLUogb3IgLVIpLiAgSWYgeW91IG5hbWVkIHRoZQorZGlyZWN0b3J5IGJvb3QvaXNvbGludXggdGhhdCBzaG91bGQgb2YgY291cnNlIGJlICsKKwktYiBib290L2lzb2xpbnV4L2lzb2xpbnV4LmJpbiAtYyBib290L2lzb2xpbnV4L2Jvb3QuY2F0LgorCisKKz09IENPTkZJRyBGSUxFIERJUkVDVE9SWSA9PQorCitJU09MSU5VWCB3aWxsIHNlYXJjaCBmb3IgdGhlIGNvbmZpZyBmaWxlIGRpcmVjdG9yeSBpbiB0aGUgb3JkZXIKKy9ib290L2lzb2xpbnV4LCAvaXNvbGludXgsIC8uICBUaGUgZmlyc3QgZGlyZWN0b3J5IHRoYXQgZXhpc3RzIGlzCit1c2VkLCBldmVuIGlmIGl0IGNvbnRhaW5zIG5vIGZpbGVzLiAgVGhlcmVmb3JlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQKK3RoZXNlIGRpcmVjdG9yaWVzIGRvbid0IGV4aXN0IGlmIHlvdSBkb24ndCB3YW50IElTT0xJTlVYIHRvIHVzZSB0aGVtLgorCisKKz09IEhZQlJJRCBDRC1ST00vSEFSRCBESVNLIE1PREUgPT0KKworU3RhcnRpbmcgaW4gdmVyc2lvbiAzLjcyLCBJU09MSU5VWCBzdXBwb3J0cyBhICJoeWJyaWQgbW9kZSIgd2hpY2ggY2FuCitiZSBib290ZWQgZnJvbSBlaXRoZXIgQ0QtUk9NIG9yIGZyb20gYSBkZXZpY2Ugd2hpY2ggQklPUyBjb25zaWRlcnMgYQoraGFyZCBkaXNrIG9yIFpJUCBkaXNrLCBlLmcuIGEgVVNCIGtleSBvciBzaW1pbGFyLgorCitUbyBlbmFibGUgdGhpcyBtb2RlLCB0aGUgLmlzbyBpbWFnZSBzaG91bGQgYmUgcG9zdHByb2Nlc3NlZCB3aXRoIHRoZQorImlzb2h5YnJpZCIgc2NyaXB0IGZyb20gdGhlIHV0aWxzIGRpcmVjdG9yeToKKworCWlzb2h5YnJpZCBmaWxlbmFtZS5pc28KKworVGhpcyBzY3JpcHQgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYmUgYWJsZSB0bworYm9vdCBpbiBoeWJyaWQgbW9kZS4gIEl0IGFsc28gcGFkcyBvdXQgdGhlIGltYWdlIHRvIGFuIGV2ZW4gbXVsdGlwbGUKK29mIDEgTUIuCisKK1RoaXMgaW1hZ2UgY2FuIHRoZW4gYmUgY29waWVkIHVzaW5nIGFueSByYXcgZGlzayB3cml0aW5nIHRvb2wgKG9uIFVuaXgKK3N5c3RlbXMsIHR5cGljYWxseSAiZGQiIG9yICJjYXQiKSB0byBhIFVTQiBkaXNrLCBvciB3cml0dGVuIHRvIGEKK0NELVJPTSB1c2luZyBzdGFuZGFyZCBDRCBidXJuaW5nIHRvb2xzLgorCitUaGUgSVNPIDk2NjAgZmlsZXN5c3RlbSBpcyBlbmNhcHN1bGF0ZWQgaW4gYSBwYXJ0aXRpb24gKHdoaWNoIHN0YXJ0cworYXQgb2Zmc2V0IHplcm8sIHdoaWNoIG1heSBjb25mdXNlIHNvbWUgc3lzdGVtcy4pICBUaGlzIG1ha2VzIGl0Citwb3NzaWJsZSBmb3IgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIG9uY2UgYm9vdGVkLCB0byB1c2UgdGhlIHJlbWFpbmRlcgorb2YgdGhlIGRldmljZSBmb3IgcGVyc2lzdGVudCBzdG9yYWdlIGJ5IGNyZWF0aW5nIGEgc2Vjb25kIHBhcnRpdGlvbi4KKworCis9PSBNSVNDRUxMQU5FT1VTID09CitNYWtlIHN1cmUgeW91IGhhdmUgYSByZWNlbnQgZW5vdWdoIHZlcnNpb24gb2YgbWtpc29mcy4gIEkgcmVjb21tZW5kCitta2lzb2ZzIDEuMTMgKGRpc3RyaWJ1dGVkIHdpdGggY2RyZWNvcmQgMS45KSwgYnV0IDEuMTIgbWlnaHQgd29yayBhcword2VsbCAobm90IHRlc3RlZC4pCisKK0lTT0xJTlVYIHJlc29sdmVzIHBhdGhuYW1lcyB0aGUgZm9sbG93aW5nIHdheToKKworLSBBIHBhdGhuYW1lIGNvbnNpc3RzIG9mIG5hbWVzIHNlcGFyYXRlZCBieSBzbGFzaGVzLCBVbml4LXN0eWxlLgorLSBBIGxlYWRpbmcgLyBtZWFucyBpdCBzZWFyY2hlcyBmcm9tIHRoZSByb290IGRpcmVjdG9yeTsgb3RoZXJ3aXNlIHRoZQorICBzZWFyY2ggaXMgZnJvbSB0aGUgaXNvbGludXggZGlyZWN0b3J5ICh0aGluayBvZiB0aGlzIGFzIHRoZSAiY3VycmVudAorICBkaXJlY3RvcnkiLikKKy0gLiBhbmQgLi4gaW4gcGF0aG5hbWUgc2VhcmNoZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCistIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbnkgcGF0aG5hbWUgaXMgMjU1IGNoYXJhY3RlcnMuCisKK05vdGUgdGhhdCBJU09MSU5VWCBvbmx5IHVzZXMgdGhlICJwbGFpbiIgSVNPIDk2NjAgZmlsZW5hbWVzLCBpLmUuIGl0Citkb2VzIG5vdCBzdXBwb3J0IFJvY2sgUmlkZ2Ugb3IgSm9saWV0IGZpbGVuYW1lcy4gIEl0IGNhbiBzdGlsbCBiZSB1c2VkCitvbiBhIGRpc2sgd2hpY2ggdXNlcyBSb2NrIFJpZGdlIGFuZC9vciBKb2xpZXQgZXh0ZW5zaW9ucywgb2YgY291cnNlLgorVW5kZXIgTGludXgsIHlvdSBjYW4gdmVyaWZ5IHRoZSBwbGFpbiBmaWxlbmFtZXMgYnkgbW91bnRpbmcgd2l0aCB0aGUKKyItbyBub3JvY2ssbm9qb2xpZXQiIG9wdGlvbiB0byB0aGUgbW91bnQgY29tbWFuZC4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQKK0lTT0xJTlVYIGRvZXMgc3VwcG9ydCAibG9uZyIgKGxldmVsIDIpIElTTyA5NjYwIHBsYWluIGZpbGVuYW1lcywgc28gaWYKK2NvbXBhdGliaWxpdHkgd2l0aCBzaG9ydC1uYW1lcy1vbmx5IG9wZXJhdGluZyBzeXN0ZW1zIGxpa2UgTVMtRE9TIGlzCitub3QgYW4gaXNzdWUsIHlvdSBjYW4gdXNlIHRoZSAiLWwiIG9yICItaXNvLWxldmVsIDIiIG9wdGlvbiB0byBta2lzb2ZzCit0byBnZW5lcmF0ZSBsb25nICh1cCB0byAzMSBjaGFyYWN0ZXJzKSBwbGFpbiBmaWxlbmFtZXMuCisKK0lTT0xJTlVYIGRvZXMgbm90IHN1cHBvcnQgZGlzY29udGlndW91cyBmaWxlcywgaW50ZXJsZWF2ZWQgbW9kZSwgb3IKK2xvZ2ljYWwgYmxvY2sgYW5kIHNlY3RvciBzaXplcyBvdGhlciB0aGFuIDIwNDguICBUaGlzIHNob3VsZCBub3JtYWxseQorbm90IGJlIGEgcHJvYmxlbS4KKworSVNPTElOVVggaXMgYnkgZGVmYXVsdCBidWlsdCBpbiB0d28gdmVyc2lvbnMsIG9uZSB2ZXJzaW9uIHdpdGggZXh0cmEKK2RlYnVnZ2luZyBtZXNzYWdlcyBlbmFibGVkLiAgSWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCBJU09MSU5VWCwKK0kgd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGlmIHlvdSBjb3VsZCB0cnkgb3V0IHRoZSBkZWJ1Z2dpbmcgdmVyc2lvbgorKGlzb2xpbnV4LWRlYnVnLmJpbikgYW5kIGxldCBtZSBrbm93IHdoYXQgaXQgcmVwb3J0cy4gIFRoZSBkZWJ1Z2dpbmcKK3ZlcnNpb24gZG9lcyBub3QgaW5jbHVkZSBoeWJyaWQgbW9kZSBzdXBwb3J0IChzZWUgYmVsb3cuKQorCisKKz09IFNFRSBBTFNPID09Cisqc3lzbGludXguY2ZnKig1KSwgKnN5c2xpbnV4LWNsaSooMSksICpsaWxvKig4KSwgKmtleXRhYi1saWxvLnBsKig4KSwKKypmZGlzayooOCksICpta2ZzKig4KSwgKnN1cGVyZm9ybWF0KigxKS4KKworCis9PSBBVVRIT1IgPT0KK1RoaXMgQXNjaWlEb2MgZGVyaXZlZCBkb2N1bWVudCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsCisqU1lTTElOVVgqIGRvY3VtZW50YXRpb24gYnkge2F1dGhvcn0gPHthdXRob3ItZW1haWx9Pi4gIFRoZSBjb252ZXJzaW9uCit0byBhbiBBc2NpaURvYyB3YXMgbWFkZSBieSB7ZWRpdG9yMX0gPHtlZGl0b3IxLWVtYWlsfT4KZGlmZiAtLWdpdCBhL3R4dC9weGVsaW51eC50eHQgYi90eHQvcHhlbGludXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDM0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90eHQvcHhlbGludXgudHh0CkBAIC0wLDAgKzEsNDYxIEBACis9IHB4ZWxpbnV4KDEpID0KKzpkb2N0eXBlOiBtYW5wYWdlCis6cmV2ZGF0ZTogMjAxMy0wNi0xMgorOmF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKzphdXRob3ItZW1haWw6IGhwYUB6eXRvci5jb20KKzplZGl0b3IxOiBHZW5lIEN1bW0KKzplZGl0b3IxLWVtYWlsOiBnZW5lLmN1bW1AZ21haWwuY29tCis6ZWRpdG9yMS1yZXZsYXN0OiAyMDEzLTA2LTEyCisKKworPT0gTkFNRSA9PQorcHhlbGludXggLSBUaGUgU3lzbGludXggZGVyaXZhdGl2ZSBQWEVMSU5VWCBmb3IgUFhFIG5ldHdvcmsgYm9vdGluZworCisKKz09IFNZTk9QU0lTID09CitbdmVyc2VdCitweGVsaW51eC4wCisKKworPT0gREVTQ1JJUFRJT04gPT0KKypQWEVMSU5VWCogaXMgYSBTeXNsaW51eCBkZXJpdmF0aXZlLCBmb3IgYm9vdGluZyBMaW51eCBvZmYgYSBuZXR3b3JrCitzZXJ2ZXIsIHVzaW5nIGEgbmV0d29yayBST00gY29uZm9ybWluZyB0byB0aGUgSW50ZWwgUFhFIChQcmUtRXhlY3V0aW9uCitFbnZpcm9ubWVudCkgc3BlY2lmaWNhdGlvbi4gICpQWEVMSU5VWCogaXMgXypub3QqXyBhIHByb2dyYW0gdGhhdCBpcworaW50ZW5kZWQgdG8gYmUgZmxhc2hlZCBvciBidXJuZWQgaW50byBhIFBST00gb24gdGhlIG5ldHdvcmsgY2FyZDsgaWYKK3lvdSB3YW50IHRoYXQsIGNoZWNrIG91dCBFdGhlcmJvb3QgKGh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy8pLgorRXRoZXJib290IDUuNCBvciBsYXRlciBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBhIFBYRS1jb21wbGlhbnQgYm9vdAorUFJPTSBmb3IgbWFueSBuZXR3b3JrIGNhcmRzLgorLy9GSVhNRTogTmVlZHMgZ1BYRS9pUFhFIG5vdGUKKworUFhFTElOVVggZ2VuZXJhbGx5IHJlcXVpcmVzIHRoYXQgZnVsbCBmaWxlIHBhdGhuYW1lcyBhcmUgMTI3IGNoYXJhY3RlcnMgb3Igc2hvcnRlciBpbiBsZW5ndGguCisvL0ZJWE1FOiB3aHk/ICBtYW55IHRmdHBkcyBsaW1pdGluZyB0byAxMjcrbnVsbD8gIG91dGRhdGVkPworCisKKz09IENVUlJFTlQgRElSRUNUT1JZID09CitUaGUgaW5pdGlhbCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIGVpdGhlciBhcyBzdXBwbGllZCBieSBESENQCitvcHRpb24gMjEwIChweGVsaW51eC5wYXRocHJlZml4KSwgdGhlIGhhcmRjb2RlZCBwYXRoLXByZWZpeCBvciB0aGUKK3BhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIFBYRUxJTlVYIGZpbGUsIGFzIGluZGljYXRlZCBieSBESENQIGZpZWxkcworJ3NuYW1lJyBhbmQgJ2ZpbGUnIChzbmFtZT0iMTkyLjE2OC4yLjMiIGFuZCBmaWxlPSJib290L3B4ZWxpbnV4LjAiCityZXN1bHRzIGluICJ0ZnRwOi8vMTkyLjE2OC4yLjMvYm9vdC8iLCAiMTkyLjE2OC4yLjM6OmJvb3QvIiBpbiBvbGRlcgorUFhFTElOVVggZm9ybWF0KSB3aXRoIHByZWNlZGVuY2Ugc3BlY2lmaWVkIHVuZGVyICpPUFRJT05TKi4KKworQWxsIHVucXVhbGlmaWVkIGZpbGVuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCisKKz09IENPTkZJR1VSQVRJT04gPT0KK1NlZSAqc3lzbGludXguY2ZnKig1KSBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgY29udGVudHMuCisKK0JlY2F1c2UgbW9yZSB0aGFuIG9uZSBzeXN0ZW0gbWF5IGJlIGJvb3RlZCBmcm9tIHRoZSBzYW1lIHNlcnZlciwgdGhlCitjb25maWd1cmF0aW9uIGZpbGUgbmFtZSBkZXBlbmRzIG9uIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBib290aW5nCittYWNoaW5lLiAgQWZ0ZXIgYXR0ZW1wdGluZyB0aGUgZmlsZSBhcyBzcGVjaWZpZWQgaW4gdGhlIERIQ1Agb3IKK2hhcmRjb2RlZCBvcHRpb25zLCBQWEVMSU5VWCB3aWxsIHByb2JlIHRoZSBmb2xsb3dpbmcgcGF0aHMsIHByZWZpeGVkCit3aXRoICJweGVsaW51eC5jZmcvIiwgdW5kZXIgdGhlIGluaXRpYWwgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeToKKworLSBUaGUgY2xpZW50IFVVSUQgaWYgcHJvdmlkZWQgYnkgdGhlIFBYRSBzdGFjayAobm90ZSwgc29tZSBCSU9TZXMgZG9uJ3QKK2hhdmUgYSB2YWxpZCBVVUlELCBhbmQgeW91IG1pZ2h0IGVuZCB1cCB3aXRoIHNvbWV0aGluZyBsaWtlIGFsbCAxJ3MuKSAKK1RoaXMgaXMgaW4gdGhlIHN0YW5kYXJkIFVVSUQgZm9ybWF0IHVzaW5nIGxvd2VyIGNhc2UgaGV4YWRlY2ltYWwgZGlnaXRzLAorZS5nLiBiODk0NTkwOC1kNmE2LTQxYTktNjExZC03NGE2YWI4MGI4M2QuCisKKy0gVGhlIGhhcmR3YXJlIHR5cGUgKHVzaW5nIGl0cyBBUlAgdHlwZSBjb2RlKSBhbmQgYWRkcmVzcywgYWxsIGluIGxvd2VyCitjYXNlIGhleGFkZWNpbWFsIHdpdGggZGFzaCBzZXBhcmF0b3JzOyBmb3IgZXhhbXBsZSwgZm9yIGFuIEV0aGVybmV0IChBUlAKK3R5cGUgMSkgd2l0aCBhZGRyZXNzIDg4Ojk5OkFBOkJCOkNDOkREIGl0IHdvdWxkIHNlYXJjaCBmb3IgdGhlIGZpbGVuYW1lCiswMS04OC05OS1hYS1iYi1jYy1kZC4KKworLSBUaGUgY2xpZW50J3MgSVB2NCBhZGRyZXNzIGluIHVwcGVyLWNhc2UgaGV4aWRlY2ltYWwgKGllIDE5Mi4xNjguMi45MQorLT4gQzBBODAyNUI7IHlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlZCBwcm9nYW0gImdldGhvc3RpcCIgdG8gY29tcHV0ZSB0aGUKK2hleGFkZWNpbWFsIElQIGFkZHJlc3MgZm9yIGFueSBob3N0LikgZm9sbG93ZWQgYnkgcmVtb3ZpbmcgY2hhcmFjdGVycywKK29uZSBhdCBhIHRpbWUsIGZyb20gdGhlIGVuZC4KKworLSAiZGVmYXVsdCIKKworU3RhcnRpbmcgaW4gcmVsZWFzZSAzLjIwLCBpZiBQWEVMSU5VWCBjYW4gbm90IGZpbmQgYSBjb25maWd1cmF0aW9uIGZpbGUsCitpdCB3aWxsIHJlYm9vdCBhZnRlciB0aGUgdGltZW91dCBpbnRlcnZhbCBoYXMgZXhwaXJlZC4gIFRoaXMga2VlcHMgYQorbWFjaGluZSBmcm9tIGdldHRpbmcgc3R1Y2sgaW5kZWZpbml0ZWx5IGR1ZSB0byBhIGJvb3Qgc2VydmVyIGZhaWx1cmUuCisKKworPT0gT1BUSU9OUyA9PQorKlBYRUxJTlVYKiAoc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNjIpIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcKK25vbnN0YW5kYXJkIERIQ1Agb3B0aW9ucywgd2hpY2ggZGVwZW5kaW5nIG9uIHlvdXIgREhDUCBzZXJ2ZXIgeW91IG1heSBiZQorYWJsZSB0byB1c2UgdG8gY3VzdG9taXplIHRoZSBzcGVjaWZpYyBiZWhhdmlvdXIgb2YgKlBYRUxJTlVYKi4gIFNlZSBSRkMKKzUwNzEgZm9yIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBvcHRpb25zLiBPcHRpb25zIGZvcgorKlBYRUxJTlVYKiBjYW4gYmUgc3BlY2lmaWVkIGJ5IERIQ1Agb3B0aW9ucyBvciBoYXJkY29kZWQgaW50byB0aGUKK2JpbmFyeS4KKworPT09IE9wdGlvbiBQcmlvcml0eSA9PT0KK0hhcmRjb2RlZCBhZnRlci1vcHRpb25zIGFyZSBhcHBsaWVkIGFmdGVyIERIQ1Agb3B0aW9ucyAoYW5kIG92ZXJycmlkZSkKK3doaWxlIGhhcmRjb2RlZCBiZWZvcmUtb3B0aW9ucyBhcmUgYXBwbGllZCBwcmlvciB0byBESENQIG9wdGlvbnMgYW5kCitkZWZhdWx0IGJlaGF2aW9yIHRha2VzIHRoZSBsb3dlc3QgcHJpb3JpdHkuCisKKz09PSBESENQIG9wdGlvbnMgPT09CisqT3B0aW9uIDIwOCogKHB4ZWxpbnV4Lm1hZ2ljKTo6CitFYXJsaWVyIHZlcnNpb25zIG9mICpQWEVMSU5VWCogcmVxdWlyZWQgdGhpcyB0byBiZSBzZXQgdG8gRjE6MDA6NzQ6N0UKKygyNDEuMC4xMTYuMTI2KSBmb3IgKlBYRUxJTlVYKiB0byByZWNvZ25pemUgYW55IHNwZWNpYWwgREhDUCBvcHRpb25zCit3aGF0c29ldmVyLiAgQXMgb2YgKlBYRUxJTlVYKiAzLjU1LCB0aGlzIG9wdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBpcyBubworbG9uZ2VyIHJlcXVpcmVkLgorCisqT3B0aW9uIDIwOSogKHB4ZWxpbnV4LmNvbmZpZ2ZpbGUpOjoKK1NwZWNpZmllcyB0aGUgaW5pdGlhbCAqUFhFTElOVVgqIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lIHdoaWNoIG1heSBiZQorcXVhbGlmaWVkIG9yIHVucXVhbGlmaWVkLgorCisqT3B0aW9uIDIxMCogKHB4ZWxpbnV4LnBhdGhwcmVmaXgpOjoKK1NwZWNpZmllcyB0aGUgKlBYRUxJTlVYKiBjb21tb24gcGF0aCBwcmVmaXgsIGluc3RlYWQgb2YgZGVyaXZpbmcgaXQgZnJvbQordGhlIGJvb3QgZmlsZSBuYW1lLiAgVGhpcyBhbG1vc3QgY2VydGFpbmx5IG5lZWRzIHRvIGVuZCBpbiB3aGF0ZXZlcgorY2hhcmFjdGVyIHRoZSBURlRQIHNlcnZlciBPUyB1c2VzIGFzIGEgcGF0aG5hbWUgc2VwYXJhdG9yLCBlLmcuIHNsYXNoCisoLykgZm9yIFVuaXguCisKKypPcHRpb24gMjExKiAocHhlbGludXgucmVib290dGltZSk6OgorU3BlY2lmaWVzLCBpbiBzZWNvbmRzLCB0aGUgdGltZSB0byB3YWl0IGJlZm9yZSByZWJvb3QgaW4gdGhlIGV2ZW50IG9mCitURlRQIGZhaWx1cmUuICAwIG1lYW5zIHdhaXQgImZvcmV2ZXIiIChpbiByZWFsaXR5LCBpdCB3YWl0cworYXBwcm94aW1hdGVseSAxMzYgeWVhcnMuKQorCis9PT0gSGFyZGNvZGVkIG9wdGlvbnMgPT09CitTaW5jZSB2ZXJzaW9uIDMuODMsIHRoZSBwcm9ncmFtICJweGVsaW51eC1vcHRpb25zIiBjYW4gYmUgdXNlZCB0bworaGFyZC1jb2RlIERIQ1Agb3B0aW9ucyBpbnRvIHRoZSBweGVsaW51eC4wIGltYWdlIGZpbGU7IHRoaXMgaXMKK3NvbWV0aW1lcyB1c2VmdWwgd2hlbiB0aGUgREhDUCBzZXJ2ZXIgaXMgdW5kZXIgZGlmZmVyZW50CithZG1pbmlzdHJhdGl2ZSBjb250cm9sLiAgSGFyZGNvZGVkIG9wdGlvbnMgCisKKyAgICAgIDYgPT4gJ2RvbWFpbi1uYW1lLXNlcnZlcnMnLAorICAgICAxNSA9PiAnZG9tYWluLW5hbWUnLAorICAgICA1NCA9PiAnbmV4dC1zZXJ2ZXInLAorICAgIDIwOSA9PiAnY29uZmlnLWZpbGUnLAorICAgIDIxMCA9PiAncGF0aC1wcmVmaXgnLAorICAgIDIxMSA9PiAncmVib290dGltZScKKworCis9PSBIVFRQL0ZUUCA9PQorU2luY2UgdmVyc2lvbiA1LjEwLCBhIHNwZWNpYWwgUFhFTElOVVggYmluYXJ5LCBscHhlbGludXguMCwgbmF0aXZlbHkKK3N1cHBvcnRzIEhUVFAgYW5kIEZUUCB0cmFuc2ZlcnMsIGdyZWF0bHkgaW5jcmVhc2luZyBsb2FkIHNwZWVkIGFuZAorYWxsb3dpbmcgZm9yIHN0YW5kYXJkIEhUVFAgc2NyaXB0cyB0byBwcmVzZW50IFBYRUxJTlVYJ3MgY29uZmlndXJhdGlvbgorZmlsZS4gIFRvIHVzZSBodHRwIG9yIGZ0cCwgdXNlIHN0YW5kYXJkIFVSTCBzeW50YXggYXMgZmlsZW5hbWU7IHVzZSB0aGUKK0RIQ1Agb3B0aW9ucyBiZWxvdyB0byB0cmFuc21pdCBhIHN1aXRhYmxlIFVSTCBwcmVmaXggdG8gdGhlIGNsaWVudCwgb3IKK3VzZSB0aGUgInB4ZWxpbnV4LW9wdGlvbnMiIHRvb2wgcHJvdmlkZWQgaW4gdGhlIHV0aWxzIGRpcmVjdG9yeSB0bworcHJvZ3JhbSBpdCBkaXJlY3RseSBpbnRvIHRoZSBscHhlbGludXguMCBmaWxlLgorCisKKz09IEZJTEVOQU1FIFNZTlRBWCA9PQorLy9GSVhNRQorUFhFTElOVVggc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHBhdGhuYW1lIGNvbnZlbnRpb25zOgorCisqOjpmaWxlbmFtZSo6OgorU3VwcHJlc3NlcyB0aGUgY29tbW9uIGZpbGVuYW1lIHByZWZpeCwgaS5lLiBwYXNzZXMgdGhlIHN0cmluZyAiZmlsZW5hbWUiCit1bm1vZGlmaWVkIHRvIHRoZSBzZXJ2ZXIuCisKKypJUCBhZGRyZXNzOjpmaWxlbmFtZSogKGUuZy4gMTkyLjE2OC4yLjM6OmZpbGVuYW1lKTo6CitTdXBwcmVzc2VzIHRoZSBjb21tb24gZmlsZW5hbWUgcHJlZml4LCAqYW5kKiBzZW5kcyBhIHJlcXVlc3QgdG8gYW4gYWx0ZXJuYXRlIFRGVFAgc2VydmVyLiAgSW5zdGVhZCBvZiBhbiBJUCBhZGRyZXNzLCBhIEROUyBuYW1lIGNhbiBiZSB1c2VkLiAgSXQgd2lsbCBiZSBhc3N1bWVkIHRvIGJlIGZ1bGx5IHF1YWxpZmllZCBpZiBpdCBjb250YWlucyBkb3RzOyBvdGhlcndpc2UgdGhlIGxvY2FsIGRvbWFpbiBhcyByZXBvcnRlZCBieSB0aGUgREhDUCBzZXJ2ZXIgKG9wdGlvbiAxNSkgd2lsbCBiZSBhZGRlZC4KKworOjogd2FzIGNob3NlbiBiZWNhdXNlIGl0IGlzIHVubGlrZWx5IHRvIGNvbmZsaWN0IHdpdGggb3BlcmF0aW5nIHN5c3RlbQordXNhZ2UuICBIb3dldmVyLCBpZiB5b3UgaGFwcGVuIHRvIGhhdmUgYW4gZW52aXJvbm1lbnQgZm9yIHdoaWNoIHRoZQorc3BlY2lhbCB0cmVhdG1lbnQgb2YgOjogaXMgYSBwcm9ibGVtLCBwbGVhc2UgY29udGFjdCB0aGUgU3lzbGludXgKK21haWxpbmcgbGlzdC4KKworU2luY2UgdmVyc2lvbiA0LjAwLCBQWEVMSU5VWCBhbHNvIHN1cHBvcnRzIHN0YW5kYXJkIFVSTCBzeW50YXguCisKKworPT0gS0VFUFBYRSA9PQorTm9ybWFsbHksIFBYRUxJTlVYIHdpbGwgdW5sb2FkIHRoZSBQWEUgYW5kIFVOREkgc3RhY2tzIGJlZm9yZSBpbnZva2luZwordGhlIGtlcm5lbC4gIEluIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyAoZm9yIGV4YW1wbGUsIHdoZW4gdXNpbmcgTUVNRElTSwordG8gYm9vdCBhbiBvcGVyYXRpbmcgc3lzdGVtIHdpdGggYW4gVU5ESSBuZXR3b3JrIGRyaXZlcikgaXQgbWlnaHQgYmUKK2Rlc2lyYWJsZSB0byBrZWVwIHRoZSBQWEUgc3RhY2sgaW4gbWVtb3J5LiAgSWYgdGhlIG9wdGlvbiAia2VlcHB4ZSIKK2lzIGdpdmVuIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLCBQWEVMSU5VWCB3aWxsIGtlZXAgdGhlIFBYRSBhbmQKK1VOREkgc3RhY2tzIGluIG1lbW9yeS4gIChJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgbWVhbnMsIHlvdQorcHJvYmFibHkgZG9uJ3QgbmVlZCBpdC4pCisKKworPT0gRVhBTVBMRVMgPT0KKworPT09IENvbmZpZ3VyYXRpb24gZmlsZW5hbWUgPT09CitGb3IgREhDUCBzaWFkZHIgMTkyLjE2OC4yLjMsIGZpbGUgJ215Ym9vdGRpci9weGVsaW51eC4wJywgY2xpZW50IFVVSUQKK2I4OTQ1OTA4LWQ2YTYtNDFhOS02MTFkLTc0YTZhYjgwYjgzZCwgRXRoZXJuZXQgTUFDIGFkZHJlc3MKKzg4Ojk5OkFBOkJCOkNDOkREIGFuZCBJUHY0IGFkZHJlc3MgMTkyLjE2OC4yLjkxLCB0aGUgZm9sbG93aW5nIGZpbGVzIGluCit0aGlzIG9yZGVyIHdpbGwgYmUgYXR0ZW1wdGVkIChhZnRlciBjb25maWctZmlsZSBvcHRpb25zKToKKworCW15Ym9vdGRpci9weGVsaW51eC5jZmcvYjg5NDU5MDgtZDZhNi00MWE5LTYxMWQtNzRhNmFiODBiODNkCisJbXlib290ZGlyL3B4ZWxpbnV4LmNmZy8wMS04OC05OS1hYS1iYi1jYy1kZAorCW15Ym9vdGRpci9weGVsaW51eC5jZmcvQzBBODAyNUIKKwlteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgwMjUKKwlteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgwMgorCW15Ym9vdGRpci9weGVsaW51eC5jZmcvQzBBODAKKwlteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQTgKKwlteWJvb3RkaXIvcHhlbGludXguY2ZnL0MwQQorCW15Ym9vdGRpci9weGVsaW51eC5jZmcvQzAKKwlteWJvb3RkaXIvcHhlbGludXguY2ZnL0MKKwlteWJvb3RkaXIvcHhlbGludXguY2ZnL2RlZmF1bHQKKworCis9PT0gVEZUUCBzZXJ2ZXJzID09PQorRm9yIGJlc3QgcmVzdWx0cywgdXNlIGEgVEZUUCBzZXJ2ZXIgd2hpY2ggc3VwcG9ydHMgdGhlICJ0c2l6ZSIgVEZUUAorb3B0aW9uIChSRkMgMTc4NC9SRkMgMjM0OSkuICBUaGUgInRmdHAtaHBhIiBURlRQIHNlcnZlciwgd2hpY2ggc3VwcG9ydAorb3B0aW9ucywgaXMgYXZhaWxhYmxlIGF0OgorCisJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9uZXR3b3JrL3RmdHAvCisJZnRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL25ldHdvcmsvdGZ0cC8KKworYW5kIG9uIGFueSBrZXJuZWwub3JnIG1pcnJvciAoc2VlIGh0dHA6Ly93d3cua2VybmVsLm9yZy9taXJyb3JzLykuCisKK0Fub3RoZXIgVEZUUCBzZXJ2ZXIgd2hpY2ggc3VwcG9ydHMgdGhpcyBpcyBhdGZ0cCBieSBKZWFuLVBpZXJyZQorTGVmZWJ2cmU6CisKKwlmdHA6Ly9mdHAubWFtYWxpbnV4LmNvbS9wdWIvYXRmdHAvCisKK0lmIHlvdXIgYm9vdCBzZXJ2ZXIgaXMgcnVubmluZyBXaW5kb3dzIChhbmQgeW91IGNhbid0IGZpeCB0aGF0KSwgdHJ5Cit0ZnRwZDMyIGJ5IFBoaWxpcHBlIEpvdW5pbiAoeW91IG5lZWQgdmVyc2lvbiAyLjExIG9yIGxhdGVyOyBwcmV2aW91cwordmVyc2lvbnMgaGFkIGEgYnVnIHdoaWNoIG1hZGUgaXQgaW5jb21wYXRpYmxlIHdpdGggUFhFTElOVVgpOgorCisJaHR0cDovL3RmdHBkMzIuam91bmluLm5ldC8KKworCis9PT0gREhDUCBjb25maWc6IFNpbXBsZSA9PT0KK1RoZSBQWEUgcHJvdG9jb2wgdXNlcyBhIHZlcnkgY29tcGxleCBzZXQgb2YgZXh0ZW5zaW9ucyB0byBESENQIG9yCitCT09UUC4gIEhvd2V2ZXIsIG1vc3QgUFhFIGltcGxlbWVudGF0aW9ucyAtLSB0aGlzIGluY2x1ZGVzIGFsbCBJbnRlbAorb25lcyB2ZXJzaW9uIDAuOTluIGFuZCBsYXRlciAtLSBzZWVtIHRvIGJlIGFibGUgdG8gYm9vdCBpbiBhCisiY29udmVudGlvbmFsIiBESENQL1RGVFAgY29uZmlndXJhdGlvbi4gIEFzc3VtaW5nIHlvdSBkb24ndCBoYXZlIHRvCitzdXBwb3J0IGFueSB2ZXJ5IG9sZCBvciBvdGhlcndpc2Ugc2V2ZXJlbHkgYnJva2VuIGNsaWVudHMsIHRoaXMgaXMKK3Byb2JhYmx5IHRoZSBiZXN0IGNvbmZpZ3VyYXRpb24gdW5sZXNzIHlvdSBhbHJlYWR5IGhhdmUgYSBQWEUgYm9vdAorc2VydmVyIG9uIHlvdXIgbmV0d29yay4KKworQSBzYW1wbGUgREhDUCBzZXR1cCwgdXNpbmcgdGhlICJjb252ZW50aW9uYWwgVEZUUCIgY29uZmlndXJhdGlvbiwKK3dvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgdXNpbmcgSVNDIGRoY3AgMi4wIGRoY3BkLmNvbmYKK3N5bnRheDoKKworLS0tLS0KK2FsbG93IGJvb3Rpbmc7CithbGxvdyBib290cDsKKworIyBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4KKworb3B0aW9uIGRvbWFpbi1uYW1lICI8ZG9tYWluIG5hbWU+IjsKK29wdGlvbiBzdWJuZXQtbWFzayA8c3VibmV0IG1hc2s+Oworb3B0aW9uIGJyb2FkY2FzdC1hZGRyZXNzIDxicm9hZGNhc3QgYWRkcmVzcz47CitvcHRpb24gZG9tYWluLW5hbWUtc2VydmVycyA8ZG5zIHNlcnZlcnM+Oworb3B0aW9uIHJvdXRlcnMgPGRlZmF1bHQgcm91dGVyPjsKKworIyBHcm91cCB0aGUgUFhFIGJvb3RhYmxlIGhvc3RzIHRvZ2V0aGVyCitncm91cCB7CisJIyBQWEUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uCisJbmV4dC1zZXJ2ZXIgPFRGVFAgc2VydmVyIGFkZHJlc3M+OworCWZpbGVuYW1lICIvdGZ0cGJvb3QvcHhlbGludXguMCI7CisKKwkjIFlvdSBuZWVkIGFuIGVudHJ5IGxpa2UgdGhpcyBmb3IgZXZlcnkgaG9zdAorCSMgdW5sZXNzIHlvdSdyZSB1c2luZyBkeW5hbWljIGFkZHJlc3NlcworCWhvc3QgPGhvc3RuYW1lPiB7CisJCWhhcmR3YXJlIGV0aGVybmV0IDxldGhlcm5ldCBhZGRyZXNzPjsKKwkJZml4ZWQtYWRkcmVzcyA8aG9zdG5hbWU+OworCX0KK30KKy0tLS0tCisKK05vdGUgdGhhdCBpZiB5b3VyIHBhcnRpY3VsYXIgVEZUUCBkYWVtb24gcnVucyB1bmRlciBjaHJvb3QgKHRmdHAtaHBhCit3aWxsIGRvIHRoaXMgaWYgeW91IHNwZWNpZnkgdGhlIC1zIChzZWN1cmUpIG9wdGlvbjsgdGhpcyBpcyBoaWdobHkKK3JlY29tbWVuZGVkKSwgeW91IGFsbW9zdCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSAvdGZ0cGJvb3QKK3ByZWZpeCBpbiB0aGUgZmlsZW5hbWUgc3RhdGVtZW50LgorCisKKz09PSBESENQIENvbmZpZzogUFhFLTEgPT09CitJZiB0aGUgc2ltcGxlIGNvbmZpZyBkb2VzIG5vdCB3b3JrIGZvciB5b3VyIGVudmlyb25tZW50LCB5b3UgcHJvYmFibHkKK3Nob3VsZCBzZXQgdXAgYSAiUFhFIGJvb3Qgc2VydmVyIiBvbiBwb3J0IDQwMTEgb2YgeW91ciBURlRQIHNlcnZlcjsgYQorZnJlZSBQWEUgYm9vdCBzZXJ2ZXIgaXMgYXZhaWxhYmxlIGF0OgorCitodHRwOi8vd3d3Lmthbm8ub3JnLnVrL3Byb2plY3RzL3B4ZS8KKworV2l0aCBzdWNoIGEgYm9vdCBzZXJ2ZXIgZGVmaW5lZCwgeW91ciBESENQIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGxvb2sKK3RoZSBzYW1lIGV4Y2VwdCBmb3IgYW4gIm9wdGlvbiBkaGNwLWNsYXNzLWlkZW50aWZpZXIiICgib3B0aW9uCit2ZW5kb3ItY2xhc3MtaWRlbnRpZmllciIgaWYgeW91IGFyZSB1c2luZyBESENQIDMuMCk6CisKKy0tLS0KK2FsbG93IGJvb3Rpbmc7CithbGxvdyBib290cDsKKworIyBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuLi4KKworb3B0aW9uIGRvbWFpbi1uYW1lICI8ZG9tYWluIG5hbWU+IjsKK29wdGlvbiBzdWJuZXQtbWFzayA8c3VibmV0IG1hc2s+Oworb3B0aW9uIGJyb2FkY2FzdC1hZGRyZXNzIDxicm9hZGNhc3QgYWRkcmVzcz47CitvcHRpb24gZG9tYWluLW5hbWUtc2VydmVycyA8ZG5zIHNlcnZlcnM+Oworb3B0aW9uIHJvdXRlcnMgPGRlZmF1bHQgcm91dGVyPjsKKworIyBHcm91cCB0aGUgUFhFIGJvb3RhYmxlIGhvc3RzIHRvZ2V0aGVyCitncm91cCB7CisJIyBQWEUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uCisJb3B0aW9uIGRoY3AtY2xhc3MtaWRlbnRpZmllciAiUFhFQ2xpZW50IjsKKwluZXh0LXNlcnZlciA8cHhlIGJvb3Qgc2VydmVyIGFkZHJlc3M+OworCisJIyBZb3UgbmVlZCBhbiBlbnRyeSBsaWtlIHRoaXMgZm9yIGV2ZXJ5IGhvc3QKKwkjIHVubGVzcyB5b3UncmUgdXNpbmcgZHluYW1pYyBhZGRyZXNzZXMKKwlob3N0IDxob3N0bmFtZT4geworCQloYXJkd2FyZSBldGhlcm5ldCA8ZXRoZXJuZXQgYWRkcmVzcz47CisJCWZpeGVkLWFkZHJlc3MgPGhvc3RuYW1lPjsKKwl9Cit9CistLS0tCisKK0hlcmUsIHRoZSBib290IGZpbGUgbmFtZSBpcyBvYnRhaW5lZCBmcm9tIHRoZSBQWEUgc2VydmVyLgorCisKKz09PSBESENQIENvbmZpZzogRW5jYXBzdWxhdGVkID09PQorSWYgdGhlICJjb252ZW50aW9uYWwgVEZUUCIgY29uZmlndXJhdGlvbiBkb2Vzbid0IHdvcmsgb24geW91ciBjbGllbnRzLAorYW5kIHNldHRpbmcgdXAgYSBQWEUgYm9vdCBzZXJ2ZXIgaXMgbm90IGFuIG9wdGlvbiwgeW91IGNhbiBhdHRlbXB0IHRoZQorZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24uICBJdCBoYXMgYmVlbiBrbm93biB0byBib290IHNvbWUKK2NvbmZpZ3VyYXRpb25zIGNvcnJlY3RseTsgaG93ZXZlciwgdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXM6CistLS0tCithbGxvdyBib290aW5nOworYWxsb3cgYm9vdHA7CisKKyMgU3RhbmRhcmQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLi4uCisKK29wdGlvbiBkb21haW4tbmFtZSAiPGRvbWFpbiBuYW1lPiI7CitvcHRpb24gc3VibmV0LW1hc2sgPHN1Ym5ldCBtYXNrPjsKK29wdGlvbiBicm9hZGNhc3QtYWRkcmVzcyA8YnJvYWRjYXN0IGFkZHJlc3M+Oworb3B0aW9uIGRvbWFpbi1uYW1lLXNlcnZlcnMgPGRucyBzZXJ2ZXJzPjsKK29wdGlvbiByb3V0ZXJzIDxkZWZhdWx0IHJvdXRlcj47CisKKyMgR3JvdXAgdGhlIFBYRSBib290YWJsZSBob3N0cyB0b2dldGhlcgorZ3JvdXAgeworCSMgUFhFLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLgorCW9wdGlvbiBkaGNwLWNsYXNzLWlkZW50aWZpZXIgIlBYRUNsaWVudCI7CisJb3B0aW9uIHZlbmRvci1lbmNhcHN1bGF0ZWQtb3B0aW9ucyAwOTowZjo4MDowMDowYzo0ZTo2NTo3NDo3Nzo2Zjo3Mjo2YjoyMDo2Mjo2Zjo2Zjo3NDowYTowNzowMDo1MDo3Mjo2Zjo2ZDo3MDo3NDowNjowMTowMjowODowMzo4MDowMDowMDo0NzowNDo4MDowMDowMDowMDpmZjsKKwluZXh0LXNlcnZlciA8VEZUUCBzZXJ2ZXI+OworCWZpbGVuYW1lICIvdGZ0cGJvb3QvcHhlbGludXguMCI7CisKKwkjIFlvdSBuZWVkIGFuIGVudHJ5IGxpa2UgdGhpcyBmb3IgZXZlcnkgaG9zdAorCSMgdW5sZXNzIHlvdSdyZSB1c2luZyBkeW5hbWljIGFkZHJlc3NlcworCWhvc3QgPGhvc3RuYW1lPiB7CisJCWhhcmR3YXJlIGV0aGVybmV0IDxldGhlcm5ldCBhZGRyZXNzPjsKKwkJZml4ZWQtYWRkcmVzcyA8aG9zdG5hbWU+OworCX0KK30KKy0tLS0KK05vdGUgdGhhdCB0aGlzICp3aWxsIG5vdCogYm9vdCBzb21lIGNsaWVudHMgdGhhdCAqd2lsbCogYm9vdCB3aXRoIHRoZQorImNvbnZlbnRpb25hbCBURlRQIiBjb25maWd1cmF0aW9uOyBJbnRlbCBCb290IENsaWVudCAzLjAgYW5kIGxhdGVyIGFyZQora25vd24gdG8gZmFsbCBpbnRvIHRoaXMgY2F0ZWdvcnkuCisKKworPT09IERIQ1AgQ29uZmlnOiBJU0MgZGhjcGQgb3B0aW9ucyA9PT0KK0lTQyBkaGNwIDMuMCBzdXBwb3J0cyBhIHJhdGhlciBuaWNlIHN5bnRheCBmb3Igc3BlY2lmeWluZyBjdXN0b20KK29wdGlvbnM7IHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgc3ludGF4IGluIGRoY3BkLmNvbmYgaWYgeW91IGFyZQorcnVubmluZyB0aGlzIHZlcnNpb24gb2YgZGhjcGQ6CistLS0tCitvcHRpb24gc3BhY2UgcHhlbGludXg7CitvcHRpb24gcHhlbGludXgubWFnaWMgICAgICBjb2RlIDIwOCA9IHN0cmluZzsKK29wdGlvbiBweGVsaW51eC5jb25maWdmaWxlIGNvZGUgMjA5ID0gdGV4dDsKK29wdGlvbiBweGVsaW51eC5wYXRocHJlZml4IGNvZGUgMjEwID0gdGV4dDsKK29wdGlvbiBweGVsaW51eC5yZWJvb3R0aW1lIGNvZGUgMjExID0gdW5zaWduZWQgaW50ZWdlciAzMjsKKy0tLS0KKyAgICBOT1RFOiBJbiBlYXJsaWVyIHZlcnNpb25zIG9mIFBYRUxJTlVYLCB0aGlzIHdvdWxkIG9ubHkgd29yayBhcyBhCisgICAgInNpdGUtb3B0aW9uLXNwYWNlIi4gIFNpbmNlIFBYRUxJTlVYIDIuMDcsIHRoaXMgd2lsbCB3b3JrIGJvdGggYXMgYQorICAgICJzaXRlLW9wdGlvbi1zcGFjZSIgKHVuZW5jYXBzdWxhdGVkKSBhbmQgYXMgYSAidmVuZG9yLW9wdGlvbi1zcGFjZSIKKyAgICAodHlwZSA0MyBlbmNhcHN1bGF0ZWQuKSAgVGhpcyBtYXkgYXZvaWQgbWVzc2luZyB3aXRoIHRoZQorICAgIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCwgYXMgZGV0YWlsZWQgYmVsb3cuCisKK1RoZW4sIGluc2lkZSB5b3VyIFBYRUxJTlVYLWJvb3RpbmcgZ3JvdXAgb3IgY2xhc3MgKHdoZXJlZXZlciB5b3UgaGF2ZQordGhlIFBYRUxJTlVYLXJlbGF0ZWQgb3B0aW9ucywgc3VjaCBhcyB0aGUgZmlsZW5hbWUgb3B0aW9uKSwgeW91IGNhbgorYWRkLCBmb3IgZXhhbXBsZToKKy0tLS0KKyMgQWx3YXlzIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBsaW5lcyBmb3IgYWxsIFBYRUxJTlVYIGNsaWVudHMKK3NpdGUtb3B0aW9uLXNwYWNlICJweGVsaW51eCI7CitvcHRpb24gcHhlbGludXgubWFnaWMgZjE6MDA6NzQ6N2U7CitpZiBleGlzdHMgZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0IHsKKwkjIEFsd2F5cyBzZW5kIHRoZSBQWEVMSU5VWCBvcHRpb25zIChzcGVjaWZpZWQgaW4gaGV4YWRlY2ltYWwpCisJb3B0aW9uIGRoY3AtcGFyYW1ldGVyLXJlcXVlc3QtbGlzdCA9IGNvbmNhdChvcHRpb24gZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0LGQwLGQxLGQyLGQzKTsKK30KKyMgVGhlc2UgbGluZXMgc2hvdWxkIGJlIGN1c3RvbWl6ZWQgdG8geW91ciBzZXR1cAorb3B0aW9uIHB4ZWxpbnV4LmNvbmZpZ2ZpbGUgImNvbmZpZ3MvY29tbW9uIjsKK29wdGlvbiBweGVsaW51eC5wYXRocHJlZml4ICIvdGZ0cGJvb3QvcHhlbGludXgvZmlsZXMvIjsKK29wdGlvbiBweGVsaW51eC5yZWJvb3R0aW1lIDMwOworZmlsZW5hbWUgIi90ZnRwYm9vdC9weGVsaW51eC9weGVsaW51eC5iaW4iOworLS0tLQorTm90ZSB0aGF0IHRoZSBjb25maWdmaWxlIGlzIHJlbGF0aXZlIHRvIHRoZSBwYXRocHJlZml4OiB0aGlzIHdpbGwgbG9vaworZm9yIGEgY29uZmlnIGZpbGUgY2FsbGVkIC90ZnRwYm9vdC9weGVsaW51eC9maWxlcy9jb25maWdzL2NvbW1vbiBvbgordGhlIFRGVFAgc2VydmVyLgorCitUaGUgIm9wdGlvbiBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QiIHN0YXRlbWVudCBmb3JjZXMgdGhlIERIQ1AKK3NlcnZlciB0byBzZW5kIHRoZSBQWEVMSU5VWC1zcGVjaWZpYyBvcHRpb25zLCBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QKK2V4cGxpY2l0bHkgcmVxdWVzdGVkLiAgU2luY2UgdGhlIERIQ1AgcmVxdWVzdCBpcyBkb25lIGJlZm9yZSBQWEVMSU5VWAoraXMgbG9hZGVkLCB0aGUgUFhFIGNsaWVudCB3b24ndCBrbm93IHRvIHJlcXVlc3QgdGhlbS4KKworVXNpbmcgSVNDIGRoY3AgMy4wIHlvdSBjYW4gY3JlYXRlIGEgbG90IG9mIHRoZXNlIHN0cmluZ3Mgb24gdGhlIGZseS4KK0ZvciBleGFtcGxlLCB0byB1c2UgdGhlIGhleGFkZWNpbWFsIGZvcm0gb2YgdGhlIGhhcmR3YXJlIGFkZHJlc3MgYXMKK3RoZSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSwgeW91IGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlOgorLS0tLQorc2l0ZS1vcHRpb24tc3BhY2UgInB4ZWxpbnV4IjsKK29wdGlvbiBweGVsaW51eC5tYWdpYyBmMTowMDo3NDo3ZTsKK2lmIGV4aXN0cyBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QgeworCSMgQWx3YXlzIHNlbmQgdGhlIFBYRUxJTlVYIG9wdGlvbnMgKHNwZWNpZmllZCBpbiBoZXhhZGVjaW1hbCkKKwlvcHRpb24gZGhjcC1wYXJhbWV0ZXItcmVxdWVzdC1saXN0ID0gY29uY2F0KG9wdGlvbiBkaGNwLXBhcmFtZXRlci1yZXF1ZXN0LWxpc3QsZDAsZDEsZDIsZDMpOworfQorb3B0aW9uIHB4ZWxpbnV4LmNvbmZpZ2ZpbGUgPQorCWNvbmNhdCgicHhlbGludXguY2ZnLyIsIGJpbmFyeS10by1hc2NpaSgxNiwgOCwgIjoiLCBoYXJkd2FyZSkpOworZmlsZW5hbWUgIi90ZnRwYm9vdC9weGVsaW51eC5iaW4iOworLS0tLQorSWYgeW91IHVzZWQgdGhpcyBmcm9tIGEgY2xpZW50IHdob3NlIEV0aGVybmV0IGFkZHJlc3Mgd2FzCis1ODpGQTo4NDpDRjo1NTowRSwgdGhpcyB3b3VsZCBsb29rIGZvciBhIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lZAorIi90ZnRwYm9vdC9weGVsaW51eC5jZmcvMTo1ODpmYTo4NDpjZjo1NTplIi4KKworCis9PSBLTk9XTiBJU1NVRVMgPT0KK1RoZSBmb2xsb3dpbmcgcHJvYmxlbXMgYXJlIGtub3duIHdpdGggUFhFTElOVVgsIHNvIGZhcjoKKworLSBUaGUgZXJyb3IgcmVjb3Zlcnkgcm91dGluZSBkb2Vzbid0IHdvcmsgcXVpdGUgcmlnaHQuICBGb3IgcmlnaHQgbm93LAorICBpdCBqdXN0IGRvZXMgYSBoYXJkIHJlc2V0IC0gc2VlbXMgZ29vZCBlbm91Z2guCistIFdlIHNob3VsZCBwcm9iYWJseSBjYWxsIHRoZSBVRFAgcmVjZWl2ZSBmdW5jdGlvbiBpbiB0aGUga2V5Ym9hcmQKKyAgZW50cnkgbG9vcCwgc28gdGhhdCB3ZSBhbnN3ZXIgQVJQIHJlcXVlc3RzLgorLSBCb290IHNlY3RvcnMvZGlzayBpbWFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgorCitJZiB5b3UgaGF2ZSBhZGRpdGlvbmFsIHByb2JsZW1zLCBwbGVhc2UgY29udGFjdCB0aGUgU3lzbGludXggbWFpbGluZworbGlzdCAoc2VlIHN5c2xpbnV4LnR4dCBmb3IgdGhlIGFkZHJlc3MuKQorCis9PT0gQnJva2VuIFBYRSBzdGFja3MgPT09CitMb3RzIG9mIFBYRSBzdGFja3MsIGVzcGVjaWFsbHkgb2xkIG9uZXMsIGhhdmUgdmFyaW91cyBwcm9ibGVtcyBvZgordmFyeWluZyBkZWdyZWVzIG9mIHNldmVyaXR5LiAgUGxlYXNlIHNlZToKKworCWh0dHA6Ly9zeXNsaW51eC56eXRvci5jb20vaGFyZHdhcmUucGhwCisKKy4uLiBmb3IgYSBsaXN0IG9mIGN1cnJlbnRseSBrbm93biBoYXJkd2FyZSBwcm9ibGVtcywgd2l0aCB3b3JrYXJvdW5kcworaWYga25vd24uCisKK1RoZXJlIGFyZSBhIG51bWJlciBvZiBleHRyZW1lbHkgYnJva2VuIFBYRSBzdGFja3MgaW4gdGhlIGZpZWxkLiAgVGhlCitnUFhFIHByb2plY3QgKGZvcm1lcmx5IGtub3duIGFzIEV0aGVyYm9vdCkgcHJvdmlkZXMgYW4gb3Blbi1zb3VyY2UgUFhFCitzdGFjayB0aGF0IHdvcmtzIHdpdGggYSBudW1iZXIgb2YgY2FyZHMsIGFuZCB3aGljaCBjYW4gYmUgbG9hZGVkIGZyb20KK2EgQ0QtUk9NLCBVU0Iga2V5LCBvciBmbG9wcHkgaWYgZGVzaXJlZC4KKworSW5mb3JtYXRpb24gb24gZ1BYRSBpcyBhdmFpbGFibGUgZnJvbToKKworCWh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy8KKworLi4uIGFuZCByZWFkeS10by11c2UgUk9NIG9yIGRpc2sgaW1hZ2VzIGZyb206CisKKwlodHRwOi8vd3d3LnJvbS1vLW1hdGljLm5ldC8KKworU29tZSBjYXJkcywgbGlrZSBtYXkgc3lzdGVtcyB3aXRoIHRoZSBTaVMgOTAwLCBoYXMgYSBQWEUgc3RhY2sgd2hpY2gKK3dvcmtzIGp1c3QgYmFyZWx5IHdlbGwgZW5vdWdoIHRvIGxvYWQgYSBzaW5nbGUgZmlsZSwgYnV0IGRvZXNuJ3QKK2hhbmRsZSB0aGUgbW9yZSBhZHZhbmNlZCBpdGVtcyByZXF1aXJlZCBieSBQWEVMSU5VWC4gIElmIHNvLCBpdCBpcworcG9zc2libGUgdG8gdXNlIHRoZSBidWlsdC1pbiBQWEUgc3RhY2sgdG8gbG9hZCBnUFhFLCB3aGljaCBjYW4gdGhlbgorbG9hZCBQWEVMSU5VWC4gIFNlZToKKworCWh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy93aWtpL3B4ZWNoYWluaW5nCisKKworPT0gTk9URVMgPT0KKz09PSBNVEZUUCA9PT0KK1BYRUxJTlVYIGRvZXMgbm90IHN1cHBvcnQgTVRGVFAsIGFuZCB0aGVyZSBhcmUgbm8gcGxhbnMgb2YgZG9pbmcgc28sIGFzCitNVEZUUCBpcyBpbmhlcmVudGx5IGJyb2tlbiBmb3IgZmlsZXMgbW9yZSB0aGFuIDY1NTM1IHBhY2tldHMgKGFib3V0IDkyCitNQikgaW4gc2l6ZS4gIEl0IGlzIG9mIGNvdXJzZSBwb3NzaWJsZSB0byB1c2UgTVRGVFAgZm9yIHRoZSBpbml0aWFsCitib290LCBpZiB5b3UgaGF2ZSBzdWNoIGEgc2V0dXAuICBNVEZUUCBzZXJ2ZXIgc2V0dXAgaXMgYmV5b25kIHRoZSBzY29wZQorb2YgdGhpcyBkb2N1bWVudC4KKworPT09IEVycm9yIFJlY292ZXJ5ID09PQorSWYgdGhlIGJvb3QgZmFpbHMsIFBYRUxJTlVYICh1bmxpa2UgU1lTTElOVVgpIHdpbGwgbm90IHdhaXQgZm9yZXZlcjsKK3JhdGhlciwgaWYgaXQgaGFzIG5vdCByZWNlaXZlZCBhbnkgaW5wdXQgZm9yIGFwcHJveGltYXRlbHkgZml2ZQorbWludXRlcyBhZnRlciBkaXNwbGF5aW5nIGFuIGVycm9yIG1lc3NhZ2UsIGl0IHdpbGwgcmVzZXQgdGhlIG1hY2hpbmUuCitUaGlzIGFsbG93cyBhbiB1bmF0dGVuZGVkIG1hY2hpbmUgdG8gcmVjb3ZlciBpbiBjYXNlIGl0IGhhZCBiYWQgZW5vdWdoCitsdWNrIG9mIHRyeWluZyB0byBib290IGF0IHRoZSBzYW1lIHRpbWUgdGhlIFRGVFAgc2VydmVyIGdvZXMgZG93bi4KKworCis9PSBTRUUgQUxTTyA9PQorKnN5c2xpbnV4LmNmZyooNSksICpzeXNsaW51eC1jbGkqKDEpLCAqbGlsbyooOCksICprZXl0YWItbGlsby5wbCooOCksCisqZmRpc2sqKDgpLCAqbWtmcyooOCksICpzdXBlcmZvcm1hdCooMSkuCisKKworPT0gQVVUSE9SID09CitUaGlzIEFzY2lpRG9jIGRlcml2ZWQgZG9jdW1lbnQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbAorKlNZU0xJTlVYKiBkb2N1bWVudGF0aW9uIGJ5IHthdXRob3J9IDx7YXV0aG9yLWVtYWlsfT4uICBUaGUgY29udmVyc2lvbgordG8gYW4gQXNjaWlEb2Mgd2FzIG1hZGUgYnkge2VkaXRvcjF9IDx7ZWRpdG9yMS1lbWFpbH0+CmRpZmYgLS1naXQgYS90eHQvc3lzbGludXgtY2xpLnR4dCBiL3R4dC9zeXNsaW51eC1jbGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGU4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90eHQvc3lzbGludXgtY2xpLnR4dApAQCAtMCwwICsxLDkzIEBACis9IHN5c2xpbnV4LWNsaSgxKSA9Cis6ZG9jdHlwZTogbWFucGFnZQorOnJldmRhdGU6IDIwMTItMTEtMTAKKzphdXRob3I6IEguIFBldGVyIEFudmluCis6YXV0aG9yLWVtYWlsOiBocGFAenl0b3IuY29tCis6ZWRpdG9yMTogR2VuZSBDdW1tCis6ZWRpdG9yMS1lbWFpbDogZ2VuZS5jdW1tQGdtYWlsLmNvbQorOmVkaXRvcjEtcmV2bGFzdDogMjAxMi0xMS0xMAorOmRhdGEtdXJpOgorCis9PSBOQU1FID09CitzeXNsaW51eC1jbGkgLSAqU3lzbGludXgqIGJvb3QgcHJvbXB0L2NvbW1hbmQgbGluZSBpbnRlcmZhY2UKKworCis9PSBERVNDUklQVElPTiA9PQorKlN5c2xpbnV4KidzIGJvb3QgcHJvbXB0IHByb3ZpZGVzIGEgdmVyeSBzaW1wbGlzdGljIGNvbW1hbmQgbGluZQoraW50ZXJmYWNlIGZvciBsb2FkaW5nIG1vZHVsZXMgYW5kIGJvb3Rpbmcga2VybmVscy4KKworCis9PSBCT09UIFBST01QVCA9PQorPT09IENPTU1BTkQgTElORSBLRVlTVFJPS0VTID09PQorVGhlIGNvbW1hbmQgbGluZSBwcm9tcHQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBrZXlzdHJva2VzOgorCisgIDxFbnRlcj4JCWJvb3Qgc3BlY2lmaWVkIGNvbW1hbmQgbGluZQorICA8QmFja1NwYWNlPgkJZXJhc2Ugb25lIGNoYXJhY3RlcgorICA8Q3RybC1VPgkJZXJhc2UgdGhlIHdob2xlIGxpbmUKKyAgPEN0cmwtVj4JCWRpc3BsYXkgdGhlIGN1cnJlbnQgU3lzbGludXggdmVyc2lvbgorICA8Q3RybC1XPgkJZXJhc2Ugb25lIHdvcmQKKyAgPEN0cmwtWD4JCWZvcmNlIHRleHQgbW9kZQorICA8VGFiPgkJCWxpc3QgbWF0Y2hpbmcgbGFiZWxzCisgIDxGMT4uLjxGMTI+CQloZWxwIHNjcmVlbnMgKGlmIGNvbmZpZ3VyZWQpCisgIDxDdHJsLUY+PGRpZ2l0PgllcXVpdmFsZW50IHRvIEYxLi5GMTAKKyAgPEN0cmwtQz4JCWludGVycnVwdCBib290IGluIHByb2dyZXNzCisgIDxFc2M+CQkJaW50ZXJydXB0IGJvb3QgaW4gcHJvZ3Jlc3MKKyAgPEN0cmwtTj4JCWRpc3BsYXkgbmV0d29yayBpbmZvcm1hdGlvbiAoUFhFTElOVVggb25seTsgMy41MC00LjA2KQorCisKKz09PSBXT1JLSU5HIERJUkVDVE9SWSA9PT0KK0F0IHN0YXJ0LCB0aGUgaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgKlNZU0xJTlVYKi8qSVNPTElOVVgqIHdpbGwKK2JlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uIGZpbGUuICBJZiBubworY29uZmlndXJhdGlvbiBmaWxlIGlzIGZvdW5kLCAqU1lTTElOVVgqIHNob3VsZCBkZWZhdWx0IHRvIHRoZQoraW5zdGFsbC10aW1lIHdvcmtpbmcgZGlyZWN0b3J5LCBob3dldmVyIHRoaXMgaXMgYSBrbm93biBpc3N1ZSB3aXRoIHNvbWUKK3ZlcnNpb25zIGluY2x1ZGluZyA0LjA2LgorCitBdCBzdGFydCwgdGhlIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkgZm9yICpQWEVMSU5VWCogd2lsbCBiZSB0aGUKK3BhcmVudCBkaXJlY3Rvcnkgb2YgcHhlbGludXguMCB1bmxlc3Mgb3ZlcnJpZGRlbiB3aXRoIERIQ1Agb3B0aW9uIDIxMC4gCitJZiBubyBjb25maWd1cmF0aW9uIGZpbGUgaXMgZm91bmQsICpQWEVMSU5VWCogd2lsbCBzdGFydCBhIHRpbWVyIHRvCityZWJvb3QgdGhlIHN5c3RlbSBpbiBhbiBhdHRlbXB0IHRvIHJlc3RhcnQgdGhlIGJvb3QgcHJvY2VzcyBhbmQgcmVzb2x2ZQorYSBwb3NzaWJsZSB0cmFuc2llbnQgaXNzdWUuCisKKworPT09IEFMVEVSTkFURSBGSUxFTkFNRVMgPT09CitGb3Iga2VybmVsLWxpa2UgZmlsZSBuYW1lcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCAqU3lzbGludXgqIHdpbGwKK2F0dGVtcHQgdG8gYXBwZW5kIGZpbGUgbmFtZSBleHRlbnNpb25zIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIHdoZW4KK3RoZSBmaWxlIGlzIG5vdCBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAuMFsqUFhFTElOVVgqIG9ubHldLAorLmJpblsqSVNPTElOVVgqIG9ubHldLCAuYnNbKlNZU0xJTlVYKiBvbmx5XSwgLmJzc1sqU1lTTElOVVgqIG9ubHldLAorLmMzMiwgLmNidFtVcCB0byA0LjA2XSwgLmNvbVtVcCB0byA0LjA2XSBhbmQgLmltZ1sqSVNPTElOVVgqIDEuNjUtNC4wNCBvbmx5XS4KKworLy8gSXMgdGhpcyB0cnVlIG9mIGZpbGUgbmFtZXMgc3BlY2lmaWVkIGluIGEgY29uZmlnPyAgQXMgb2Ygd2hlbj8KKworCis9PT0gUEFUSCBSVUxFUyA9PT0KKworVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgKmFsd2F5cyogc2VhcmNoZWQgZmlyc3QsIGJlZm9yZSBQQVRILAord2hlbiBhdHRlbXB0aW5nIHRvIG9wZW4gYSBmaWxlbmFtZS4gVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMKK25vdCBhZmZlY3RlZCB3aGVuIHNwZWNpZnlpbmcgYSBmaWxlIHdpdGggYW4gYWJzb2x1dGUgcGF0aC4gRm9yCitleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIGZpbGUgc3lzdGVtIGxheW91dCwKKworLi4uLgorL2Jvb3QvCisJL2Jpbi8KKwkJbHMuYzMyCisJCWxpYmxzLmMzMgorCS9mb28vCisJCWxpYmxzLmMzMgorLi4uLgorCithc3N1bWluZyB0aGF0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIC9ib290L2ZvbywgYW5kIGFzc3VtaW5nCit0aGF0IGxpYmxzLmMzMiBpcyBhIGRlcGVuZGVuY3kgb2YgbHMuYzMyLCBleGVjdXRpbmcgL2Jvb3QvYmluL2xzLmMzMgord2lsbCBjYXVzZSAvYm9vdC9mb28vbGlibHMuYzMyIHRvIGJlIGxvYWRlZCwgbm90IC9ib290L2Jpbi9saWJscy5jMzIsCitldmVuIGlmIC9ib290L2JpbiBpcyBzcGVjaWZpZWQgaW4gdGhlIFBBVEggZGlyZWN0aXZlIG9mIGEgY29uZmlnIGZpbGUuCisKK1RoZSByZWFzb24gdGhhdCB0aGluZ3Mgd29yayB0aGlzIHdheSBpcyB0aGF0IHR5cGljYWxseSBhIHVzZXIgd2lsbAoraW5zdGFsbCBhbGwgbGlicmFyeSBmaWxlcyBpbiB0aGUgU3lzbGludXggaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgYXMKK3NwZWNpZmllZCB3aXRoIHRoZSAtLWRpcmVjdG9yeSBpbnN0YWxsZXIgb3B0aW9uLiBUaGlzIG1ldGhvZCBhbGxvd3MKK3RoZSB1c2VyIHRvIG9taXQgdGhlIFBBVEggZGlyZWN0aXZlIGZyb20gdGhlaXIgY29uZmlnIGZpbGUgYW5kIHN0aWxsCitoYXZlIHRoaW5ncyB3b3JrIGNvcnJlY3RseS4KKworCis9PSBBVVRIT1IgPT0KK1RoaXMgQXNjaWlEb2MgZGVyaXZlZCBkb2N1bWVudCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsCisqU1lTTElOVVgqIGRvY3VtZW50YXRpb24gYnkge2F1dGhvcn0gPHthdXRob3ItZW1haWx9Pi4gIFRoZSBjb252ZXJzaW9uCit0byBhbiBBc2NpaURvYyB3YXMgbWFkZSBieSB7ZWRpdG9yMX0gPHtlZGl0b3IxLWVtYWlsfT4KZGlmZiAtLWdpdCBhL3R4dC9zeXNsaW51eC5jZmcudHh0IGIvdHh0L3N5c2xpbnV4LmNmZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2ZmUwNQotLS0gL2Rldi9udWxsCisrKyBiL3R4dC9zeXNsaW51eC5jZmcudHh0CkBAIC0wLDAgKzEsNjk3IEBACis9IHN5c2xpbnV4LmNmZyg1KSA9Cis6ZG9jdHlwZTogbWFucGFnZQorOnJldmRhdGU6IDIwMTItMTAtMjgKKzphdXRob3I6IEguIFBldGVyIEFudmluCis6YXV0aG9yLWVtYWlsOiBocGFAenl0b3IuY29tCis6ZWRpdG9yMTogR2VuZSBDdW1tCis6ZWRpdG9yMS1lbWFpbDogZ2VuZS5jdW1tQGdtYWlsLmNvbQorOmVkaXRvcjEtcmV2bGFzdDogMjAxMi0xMC0yOAorOm5ic3A4OiAmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsmIzE2MDsKKzpuYnNwMzI6IHtuYnNwOH17bmJzcDh9e25ic3A4fXtuYnNwOH0KKzpkYXRhLXVyaToKKworPT0gTkFNRSA9PQorc3lzbGludXguY2ZnIC0gKlN5c2xpbnV4KiBjb25maWd1cmF0aW9uIGZpbGUKKworCis9PSBERVNDUklQVElPTiA9PQorQ29uZmlndXJhdGlvbiBmb3IgdGhlIGJvb3QgYmVoYXZpb3IgYW5kIHVzZXIgZXhwZXJpZW5jZSBvZiAqU3lzbGludXgqCitib290IGxvYWRlcnMsIHRoZSBmb3JtYXQgb2YgZGlzcGxheSBmaWxlcyBhbmQgdGhlIGJvb3QgcHJvbXB0IGJlaGF2aW9yLgorCitCbGFuayBsaW5lcyBhcmUgaWdub3JlZC4KKworTm90ZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IGNvbXBsZXRlbHkgZGVjb2RlZC4gIFN5bnRheAorZGlmZmVyZW50IGZyb20gdGhlIG9uZSBkZXNjcmliZWQgYWJvdmUgbWF5IHN0aWxsIHdvcmsgY29ycmVjdGx5IGluIHRoaXMKK3ZlcnNpb24gb2YgKlN5c2xpbnV4KiwgYnV0IG1heSBicmVhayBpbiBhIGZ1dHVyZSBvbmUuCisKKworPT0gTE9DQVRJT04vTkFNRSA9PQorKlNZU0xJTlVYKiAoYmVmb3JlIDQuMDApIHVzZWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZW5hbWUgb2YKK3N5c2xpbnV4LmNmZy4gICpFWFRMSU5VWCogKG1lcmdlZCBpbnRvICpTWVNMSU5VWCogYXMgb2YgNC4wMCkgdXNlZCB0aGUKK2ZpbGVuYW1lIGV4dGxpbnV4LmNvbmYuICBCb3RoIGRlZmF1bHQgdG8gc2VhcmNoaW5nIGZvciB0aGUgY29uZmlnIGZpbGUKK2luIHRoZSBpbnN0YWxsZWQgZGlyZWN0b3J5IChjb250YWluaW5nIGxkbGludXguc3lzL2V4dGxpbnV4LnN5cykuICBBcyBvZgorNC4wMCwgKlNZU0xJTlVYKiB3aWxsIHNlYXJjaCBmb3IgZXh0bGludXguY29uZiB0aGVuIHN5c2xpbnV4LmNmZyBpbiBlYWNoCitkaXJlY3RvcnkgYmVmb3JlIGZhbGxpbmcgYmFjayB0byB0aGUgbmV4dCBkaXJlY3RvcnkuCisKK0FzIG9mIDMuMzUsICpTWVNMSU5VWCogYWxzbyBzZWFyY2hlcyAvYm9vdC9zeXNsaW51eCwgL3N5c2xpbnV4IGFuZCAvLgorCisqSVNPTElOVVgqIChiZWZvcmUgNC4wMikgdXNlZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlbmFtZSBvZgoraXNvbGludXguY2ZnLCBzZWFyY2hpbmcgIC9ib290L2lzb2xpbnV4IChzdGFydGluZyAyLjAwKSwgdGhlbiAvaXNvbGludXgKK2FuZCAvLiAgQXMgb2YgNC4wMiwgKklTT0xJTlVYKiB3aWxsIHNlYXJjaCBmb3IgaXNvbGludXguY2ZnIHRoZW4KK3N5c2xpbnV4LmNmZyBpbiAvYm9vdC9pc29saW51eCBiZWZvcmUgc2VhcmNoaW5nIGZvciB0aGUgc2FtZSBmaWxlcyBpbgorL2lzb2xpbnV4LCAvYm9vdC9zeXNsaW51eCwgL3N5c2xpbnV4LCBhbmQgLy4KKworCis9PSBHTE9CQUwgRElSRUNUSVZFUyAtIE1BSU4gPT0KKyojKiBjb21tZW50OjoKK0EgbGluZSBjb21tZW50LiAgQXMgb2YgdmVyc2lvbiAzLjEwLCB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgKiMqIGFuZCB0aGUKK2NvbW1lbnQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgorCisqTUVOVSogYW55IHN0cmluZzo6CisoMy4wMCspIEEgZGlyZWN0aXZlIGZvciB0aGUgc2ltcGxlIG1lbnUgc3lzdGVtLCB0cmVhdGVkIGFzIGEgY29tbWVudAorb3V0c2lkZSB0aGUgbWVudS4gIFNlZSBtZW51LnR4dC4KKworKklOQ0xVREUqICdmaWxlbmFtZSc6OgorSW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYW5vdGhlciBmaWxlIGF0IHRoaXMgcG9pbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KK2ZpbGUuIEZpbGVzIGNhbiBjdXJyZW50bHkgYmUgbmVzdGVkIHVwIHRvIDE2IGxldmVscyBkZWVwLCBidXQgaXQgaXMgbm90CitndWFyYW50ZWVkIHRoYXQgbW9yZSB0aGFuIDggbGV2ZWxzIHdpbGwgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuCisKKypERUZBVUxUKiAna2VybmVsJyAnb3B0aW9ucy4uLic6OgorU2V0cyB0aGUgZGVmYXVsdCBjb21tYW5kIGxpbmUgKHdoaWNoIG9mdGVuIHJlZmVyZW5jZXMgYSBMQUJFTCkuICBJZgorKlN5c2xpbnV4KiBib290cyBhdXRvbWF0aWNhbGx5LCBpdCB3aWxsIGFjdCBqdXN0IGFzIGlmIHRoZSBlbnRyaWVzIGFmdGVyCisqREVGQVVMVCogaGFkIGJlZW4gdHlwZWQgaW4gYXQgdGhlICdib290OicgcHJvbXB0LiAgTXVsdGlwbGUgdXNlcyB3aWxsCityZXN1bHQgaW4gYW4gb3ZlcnJpZGUuCisrCitJZiBubyBjb25maWd1cmF0aW9uIGZpbGUgaXMgcHJlc2VudCwgb3Igbm8gKkRFRkFVTFQqIG9yICpVSSogZW50cnkgaXMKK3ByZXNlbnQgaW4gdGhlIGNvbmZpZyBmaWxlLCBhbiBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZCBhbmQgdGhlCisnYm9vdDonIHByb21wdCBpcyBzaG93biAoMy44NSspLgorCisqVUkqICdtb2R1bGUnICdvcHRpb25zLi4uJzo6CitTZWxlY3RzIGEgc3BlY2lmaWMgdXNlciBpbnRlcmZhY2UgJ21vZHVsZScgKHR5cGljYWxseSBtZW51LmMzMiBvcgordmVzYW1lbnUuYzMyKS4gIFRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHRyZWF0cyB0aGlzIGFzIGEgZGlyZWN0aXZlCit0aGF0IG92ZXJyaWRlcyB0aGUgKkRFRkFVTFQqIGRpcmVjdGl2ZSB0byBsb2FkIHRoaXMgbW9kdWxlIGluc3RlYWQgYXQKK3N0YXJ0dXAsIGZvciBhbiBlbXB0eSBjb21tYW5kIGxpbmUgYW5kIGF0IHRpbWVvdXQgYW5kICpQUk9NUFQqIGRpcmVjdGl2ZQordG8gbm90IHByb21wdCAoYnV0IHRoZXNlIGRpcmVjdGl2ZXMgbWF5IGhhdmUgZWZmZWN0cyBvbiBvdGhlcgorY29uZmlndXJhdGlvbiBwYXJzZXJzKS4gIE11bHRpcGxlIHVzZXMgd2lsbCByZXN1bHQgaW4gYW4gb3ZlcnJpZGUuCisKKypMQUJFTCogJ215bGFiZWwnOjoKK0JlZ2luIGEgbmV3ICpMQUJFTCogY2xhdXNlLiAgSWYgJ215bGFiZWwnIGlzIGVudGVyZWQgYXMgdGhlIGtlcm5lbCB0bworYm9vdCwgKlN5c2xpbnV4KiBzaG91bGQgaW5zdGVhZCBib290ICJpbWFnZSIgKHNwZWNpZmllZCBieSBhIGRpcmVjdGl2ZQorZnJvbSAqS0VSTkVMLUxJS0UgRElSRUNUSVZFUyopIHdpdGggYW55IHNwZWNpZmllZCAqRFVBTC1QVVJQT1NFCitESVJFQ1RJVkVTKiBiZWluZyB1c2VkIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBpbnN0YW5jZS4KKysKKydteWxhYmVsJyBtdXN0IGJlIHVuaXF1ZS4gIEN1cnJlbnRseSB0aGUgZmlyc3QgaW5zdGFuY2UgaXMgdXNlZCBidXQgbWF5CityZXN1bHQgaW4gYW4gZXJyb3Igb3IgdW5kZXNpcmVkIGJlaGF2aW9yLiAgJ215bGFiZWwnIGVuZHMgYXQgdGhlIGZpcnN0CitjaGFyYWN0ZXIgdGhhdCBpcyBub3QgYSBub24td2hpdGUtc3BhY2UgcHJpbnRhYmxlIGNoYXJhY3RlciBhbmQgc2hvdWxkCitiZSByZXN0cmljdGVkIHRvIG5vbi13aGl0ZS1zcGFjZSB0eXBlYWJsZSBjaGFyYWN0ZXJzLiAgUHJpb3IgdG8gdmVyc2lvbgorMy4zMiwgdGhpcyB3b3VsZCB0cmFuc2Zvcm1lZCB0byBhIERPUyBjb21wYXRpYmxlIGZvcm1hdCBvZiA4LjMgd2l0aCBhCityZXN0cmljdGVkIGNoYXJhY3RlciBzZXQuICBBICpMQUJFTCogY2xhdXNlIG11c3QgY29udGFpbiBleGFjdGx5IDEgb2YKK3RoZSAqS0VSTkVMLUxJS0UgRElSRUNUSVZFUyogYW5kIG1heSBjb250YWluIDEgZWFjaCBvZiB0aGUgKkxBQkVMLU9OTFkKK0RJUkVDVElWRVMqIG9yICpEVUFMLVBVUlBPU0UgRElSRUNUSVZFUyouCisrCitXaXRoaW4gYSAqTEFCRUwqLCB1c2luZyBtdWx0aXBsZSAqS0VSTkVMLUxJS0UgRElSRUNUSVZFUyogb3IgcmV1c2Ugb2YKKypMQUJFTC1PTkxZIERJUkVDVElWRVMqIG9yICpEVUFMLVBVUlBPU0UgRElSRUNUSVZFUyogd2lsbCByZXN1bHQgaW4gYW4KK292ZXJyaWRlLiAgT3RoZXJ3aXNlLCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZGlyZWN0aXZlIHdpbGwKK3Jlc3VsdCBpbiB0aGUgbGFzdCBiZWluZyBlZmZlY3RpdmUuCisKKworPT0gRFVBTC1QVVJQT1NFIERJUkVDVElWRVMgPT0KK1VzZSBvZiBhbnkgb2YgdGhlICpEVUFMLVBVUlBPU0UgRElSRUNUSVZFUyogYXMgKkdMT0JBTCBESVJFQ1RJVkVTKiBpcworZGlzY291cmFnZWQgaWYgdGhlcmUgd2lsbCBiZSBhbnkgbm9uLUxpbnV4IGltYWdlcyBsb2FkZWQgYXMgKkFMTCogaW1hZ2VzCit3aWxsIGdldCB0aGVzZSwgaW5jbHVkaW5nIHRob3NlIG1hbnVhbGx5IGVudGVyZWQgYXQgdGhlICdib290OicgcHJvbXB0LgorCisqQVBQRU5EKiAnb3B0aW9ucy4uLic6OgorQWRkIG9uZSBvciBtb3JlIG9wdGlvbnMgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuICBUaGVzZSBhcmUgYWRkZWQKK2JvdGggZm9yIGF1dG9tYXRpYyBhbmQgbWFudWFsIGJvb3RzLiAgVGhlIG9wdGlvbnMgYXJlIGFkZGVkIGF0IHRoZSB2ZXJ5CitiZWdpbm5pbmcgb2YgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUsIHVzdWFsbHkgcGVybWl0dGluZyBleHBsaWNpdGx5CitlbnRlcmVkIGtlcm5lbCBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZW0uICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZQorTElMTyAiYXBwZW5kIiBvcHRpb24uCisrCitVc2Ugb2YgdGhlIHBhcmFtZXRlciAnaW5pdHJkPScgc3VwcG9ydHMgbXVsdGlwbGUgZmlsZW5hbWVzIHNlcGFyYXRlZCBieQorY29tbWFzIChpZSAnaW5pdHJkPWluaXRyZF9maWxlMSxpbml0cmRfZmlsZTInKSB3aXRoaW4gYSBzaW5nbGUgaW5zdGFuY2UuCitUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGluaXRyYW1mcywgd2hpY2ggY2FuIGJlIGNvbXBvc2VkIG9mIG11bHRpcGxlCitzZXBhcmF0ZSBjcGlvIG9yIGNwaW8uZ3ogYXJjaGl2ZXMuCisrCitOb3RlOiBhbGwgaW5pdHJkIGZpbGVzIGV4Y2VwdCB0aGUgbGFzdCBvbmUgYXJlIHplcm8tcGFkZGVkIHRvIGEgNEsgcGFnZQorYm91bmRhcnkuICBUaGlzIHNob3VsZCBub3QgYWZmZWN0IGluaXRyYW1mcy4KKysKK05vdGU6IE9ubHkgdGhlIGxhc3QgZWZmZWN0aXZlICdpbml0cmQ9JyBwYXJhbWV0ZXIgaXMgdXNlZCBmb3IgbG9hZGluZworaW5pdHJkIGZpbGVzLgorCisqQVBQRU5EKiAtOjoKK0FwcGVuZCBub3RoaW5nLiAgKkFQUEVORCogd2l0aCBhIHNpbmdsZSBoeXBoZW4gYXMgYXJndW1lbnQgaW4gYSAqTEFCRUwqCitzZWN0aW9uIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIGEgZ2xvYmFsICpBUFBFTkQqLgorCisvL1tGSVhNRTogU2hvcnRlbiBzdWJkZWZpbml0aW9uc10KKypTWVNBUFBFTkQqICdiaXRtYXNrJzo6CisqSVBBUFBFTkQqICdiaXRtYXNrJzo6CisoKlNZU0FQUEVORCo6IDUuMTArOyAqSVBBUFBFTkQqOiAqUFhFTElOVVgqIG9ubHkpCitUaGUgKlNZU0FQUEVORCogb3B0aW9uIHdhcyBpbnRyb2R1Y2VkIGluICpTeXNsaW51eCogNS4xMDsgaXQgaXMgYW4KK2VuaGFuY2VtZW50IG9mIGEgcHJldmlvdXMgb3B0aW9uICpJUEFQUEVORCogd2hpY2ggd2FzIG9ubHkgYXZhaWxhYmxlIG9uCisqUFhFTElOVVgqLiAgJ2JpdG1hc2snIGlzIGludGVycHJldGVkIGFzIGRlY2ltYWwgZm9ybWF0IHVubGVzcyBwcmVmaXhlZAord2l0aCAiMHgiIGZvciBoZXhhZGVjaW1hbCBvciAiMCIgKHplcm8pIGZvciBvY3RhbC4gIFRoZSAnYml0bWFzaycgaXMgYW4KK09SIChzdW0pIG9mIHRoZSBmb2xsb3dpbmcgaW50ZWdlciBvcHRpb25zOgorCitpZm5kZWY6OmRvY3R5cGUtbWFucGFnZVtbaG9yaXpvbnRhbF1dCisqMSo6OjogQW4gb3B0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0IHNob3VsZCBiZSBnZW5lcmF0ZWQsIGJhc2VkIG9uCit0aGUgaW5wdXQgZnJvbSB0aGUgREhDUC9CT09UUCBvciBQWEUgYm9vdCBzZXJ2ZXIgYW5kIGFkZGVkIHRvIHRoZSBrZXJuZWwKK2NvbW1hbmQgbGluZShzZWUgbm90ZSBiZWxvdzsgZW1wdHkgZm9yIG5vbi1QWEVMSU5VWCB2YXJpYW50cyk6CisrCistLS0tCitpcD08Y2xpZW50LWlwPjo8Ym9vdC1zZXJ2ZXItaXA+Ojxndy1pcD46PG5ldG1hc2s+CistLS0tCisrCitOT1RFOiAgVGhlIHVzZSBvZiBvcHRpb24gMSBpcyBubyBzdWJzdGl0dXRlIGZvciBydW5uaW5nIGEgREhDUCBjbGllbnQgaW4KK3RoZSBib290ZWQgc3lzdGVtIGFuZCBzaG91bGQgaW5zdGVhZCBvbmx5IGJlIHVzZWQgdG8gc2VlZCB0aGUgY2xpZW50IGZvcgorYSByZXF1ZXN0LiAgV2l0aG91dCByZWd1bGFyIHJlbmV3YWxzLCB0aGUgbGVhc2UgYWNxdWlyZWQgYnkgdGhlIFBYRSBCSU9TCit3aWxsIGV4cGlyZSwgbWFraW5nIHRoZSBJUCBhZGRyZXNzIGF2YWlsYWJsZSBmb3IgcmV1c2UgYnkgdGhlIERIQ1AKK3NlcnZlci4KKysKKyoyKjo6OiBBbiBvcHRpb24gb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCwgaW4KK2Rhc2gtc2VwYXJhdGVkIGhleGFkZWNpbWFsIHdpdGggbGVhZGluZyBoYXJkd2FyZSB0eXBlIChzYW1lIGFzIGZvciB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZTsgc2VlIHB4ZWxpbnV4LnR4dC4pIGFuZCBhZGRlZCB0byB0aGUga2VybmVsIGNvbW1hbmQKK2xpbmUsIGFsbG93aW5nIGFuIGluaXRyZCBwcm9ncmFtIHRvIGRldGVybWluZSBmcm9tIHdoaWNoIGludGVyZmFjZSB0aGUKK3N5c3RlbSBib290ZWQoZW1wdHkgZm9yIG5vbi1QWEVMSU5VWCB2YXJpYW50cyk6CisrCistLS0tCitCT09USUY9PGhhcmR3YXJlLWFkZHJlc3Mtb2YtYm9vdC1pbnRlcmZhY2U+CistLS0tCisrCisqNCo6OjogQW4gb3B0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0IHNob3VsZCBiZSBnZW5lcmF0ZWQsIGluIGxvd2VyCitjYXNlIGhleGFkZWNpbWFsIGluIHRoZSBmb3JtYXQgbm9ybWFsbHkgdXNlZCBmb3IgVVVJRHMgKHNhbWUgYXMgZm9yIHRoZQorY29uZmlndXJhdGlvbiBmaWxlOyBzZWUgcHhlbGludXgudHh0LikgYW5kIGFkZGVkIHRvIHRoZSBrZXJuZWwgY29tbWFuZAorbGluZToKKysKKy0tLS0KK1NZU1VVSUQ9PHN5c3RlbSB1dWlkPgorLS0tLQorKworKjgqOjo6ICg1LjEwKykgaW5kaWNhdGUgdGhlIENQVSBmYW1pbHkgYW5kIGNlcnRhaW4gcGFydGljdWxhcmx5CitzaWduaWZpY2FudCBDUFUgZmVhdHVyZSBiaXRzOgorKworLS0tLQorQ1BVPTxmYW1pbHk+PGZlYXR1cmVzPgorLS0tLQorKworVGhlIDxmYW1pbHk+IGlzIGEgc2luZ2xlIGRpZ2l0IGZyb20gMyAoaTM4NikgdG8gNiAoaTY4NiBvciBoaWdoZXIuKSAgVGhlCitmb2xsb3dpbmcgQ1BVIGZlYXR1cmVzIGFyZSBjdXJyZW50bHkgcmVwb3J0ZWQ7IGFkZGl0aW9uYWwgZmxhZ3MgbWF5IGJlCithZGRlZCBpbiB0aGUgZnV0dXJlOgorKworLi4uLgorUAlQaHlzaWNhbCBBZGRyZXNzIEV4dGVuc2lvbiAoUEFFKQorVglJbnRlbCBWaXJ0dWFsaXphdGlvbiBUZWNobm9sb2d5IChWVC9WTVgpCitUCUludGVsIFRydXN0ZWQgRXhlY3Rpb24gVGVjaG5vbG9neSAoVFhUL1NNWCkKK1gJRXhlY3V0aW9uIERpc2FibGUgKFhEL05YKQorTAlMb25nIE1vZGUgKHg4Ni02NCkKK1MJQU1EIFNNWCB2aXJ0dWFsaXphdGlvbgorLi4uLgorKworKkRNSSo6OjogKDUuMTArKSBUaGUgZm9sbG93aW5nIHN0cmluZ3MgYXJlIGRlcml2ZWQgZnJvbSBETUkvU01CSU9TCitpbmZvcm1hdGlvbiBpZiBhdmFpbGFibGU6CisrCisJQml0CVN0cmluZwkJU2lnbmlmaWNhbmNlCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCTB4MDAwMTAJU1lTVkVORE9SPQlTeXN0ZW0gdmVuZG9yIG5hbWUKKwkweDAwMDIwCVNZU1BST0RVQ1Q9CVN5c3RlbSBwcm9kdWN0IG5hbWUKKwkweDAwMDQwCVNZU1ZFUlNJT049CVN5c3RlbSB2ZXJzaW9uCisJMHgwMDA4MAlTWVNTRVJJQUw9CVN5c3RlbSBzZXJpYWwgbnVtYmVyCisJMHgwMDEwMAlTWVNTS1U9CQlTeXN0ZW0gU0tVCisJMHgwMDIwMAlTWVNGQU1JTFk9CVN5c3RlbSBmYW1pbHkKKwkweDAwNDAwCU1CVkVORE9SPQlNb3RoZXJib2FyZCB2ZW5kb3IgbmFtZQorCTB4MDA4MDAJTUJWRVJTSU9OPQlNb3RoZXJib2FyZCB2ZXJzaW9uCisJMHgwMTAwMAlNQlNFUklBTD0JTW90aGVyYm9hcmQgc2VyaWFsIG51bWJlcgorCTB4MDIwMDAJTUJBU1NFVD0JTW90aGVyYm9hcmQgYXNzZXQgdGFnCisJMHgwNDAwMCBCSU9TVkVORE9SPQlCSU9TIHZlbmRvciBuYW1lCisJMHgwODAwMAlCSU9TVkVSU0lPTj0JQklPUyB2ZXJzaW9uCisJMHgxMDAwMAlTWVNGRj0JCVN5c3RlbSBmb3JtIGZhY3RvcgorKworSWYgdGhlc2Ugc3RyaW5ncyBjb250YWluIHdoaXRlLXNwYWNlIGNoYXJhY3RlcnMsIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGgKK3VuZGVyc2NvcmVzIChfKS4KKysKK1RoZSBzeXN0ZW0gZm9ybSBmYWN0b3IgdmFsdWUgaXMgYSBudW1iZXIgZGVmaW5lZCBpbiB0aGUgU01CSU9TCitzcGVjaWZpY2F0aW9uLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5kbXRmLm9yZy8uICBBcyBvZiB2ZXJzaW9uIDIuNy4xCitvZiB0aGUgc3BlY2lmaWNhdGlvbiwgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGRlZmluZWQ6CisrCisJICAxCU90aGVyCisJICAyCVVua25vd24KKwkgIDMJRGVza3RvcAorCSAgNAlMb3cgcHJvZmlsZSBkZXNrdG9wCisJICA1CVBpenphIGJveAorCSAgNglNaW5pIHRvd2VyCisJICA3CVRvd2VyCisJICA4CVBvcnRibGUKKwkgIDkJTGFwdG9wCisJIDEwCU5vdGVib29rCisJIDExCUhhbmRoZWxkCisJIDEyCURvY2tpbmcgc3RhdGlvbgorCSAxMwlBbGwtaW4tb25lCisJIDE0CVN1Ym5vdGVib29rCisJIDE1CVNwYWNlLXNhdmluZworCSAxNglMdW5jaCBib3gKKwkgMTcJTWFpbiBzZXJ2ZXIgY2hhc3NpcworCSAxOAlFeHBhbnNpb24gY2hhc3NpcworCSAxOQlTdWJjaGFzc2lzCisJIDIwCUJ1cyBleHBhbnNpb24gY2hhc3NpcworCSAyMQlQZXJpcGhlcmFsIGNoYXNzaXMKKwkgMjIJUkFJRCBjaGFzc2lzCisJIDIzCVJhY2sgbW91bnQgY2hhc3NzCisJIDI0CVNlYWxlZC1jYXNlIFBDCisJIDI1CU11bHRpLXN5c3RlbSBjaGFzc2lzCisJIDI2CUNvbXBhY3QgUENJCisJIDI3CUFkdmFuY2VkIFRDSQorCSAyOAlCbGFkZQorCSAyOQlCbGFkZSBlbmNsb3N1cmUKKworCisKKz09IEtFUk5FTC1MSUtFIERJUkVDVElWRVMgPT0KKy8vIEFscGhhIHNvcnQgYWZ0ZXIgS0VSTkVMIGFuZCBMSU5VWAorKktFUk5FTCogJ2ltYWdlJzo6CitMb2FkIGEga2VybmVsLWxpa2UgZmlsZSAnaW1hZ2UnIHdpdGggYXV0b21hdGljIGZpbGV0eXBlIGRldGVjdGlvbiBiYXNlZAorb24gZmlsZSBleHRlbnNpb24sIGxpc3RlZCB1bmRlciB0aGUgbm9uLWF1dG8tZGV0ZWN0aW5nIGRpcmVjdGl2ZXMsCitkZWZhdWx0aW5nIHRvICpMSU5VWCouCisKKy8vW0ZJWE1FOiBTaG91bGQgIidpbWFnZScgYXMgIiBiZSByZW1vdmVkIGVudGlyZWx5IG9yIGFkZGVkIHRvIGFsbD8gCisqTElOVVgqIGlzIHVzZWQgYXMgYW4gZXhhbXBsZV0KKypMSU5VWCogJ2ltYWdlJzo6CitMb2FkICdpbWFnZScgYXMgYSBMaW51eC1saWtlIGtlcm5lbC4gTUVNRElTSyBpcyBhbiBleGFtcGxlIG9mIGEKK25vbi1MaW51eCBrZXJuZWwgbG9hZGVkIGluIGEgTGludXgtbGlrZSBmYXNoaW9uLgorCisqQk9PVCogJ2ltYWdlJzo6CisoKklTT0xJTlVYKiBvbmx5OiAuYmluOyAqU1lTTElOVVgqIG9ubHk6IC5icykgTG9hZCBhIGJvb3Qgc2VjdG9yLiAgLmJpbgoraXMgYSAiQ0QgYm9vdCBzZWN0b3IiIGFuZCAuYnMgaXMgYSByZWd1bGFyIGRpc2sgYm9vdCBzZWN0b3IuCisKKypCU1MqICdpbWFnZSc6OgorKCpTWVNMSU5VWCogb25seTogLmJzcykgTG9hZCBhIEJTUyBpbWFnZSwgYSAuYnMgaW1hZ2Ugd2l0aCB0aGUgRE9TCitzdXBlcmJsb2NrIHBhdGNoZWQgaW4uCisKKypDT01CT09UKiAnaW1hZ2UnOjoKKyguY29tLCAuY2J0OyBSZW1vdmVkIGFzIG9mIDUuMDApIExvYWQgYSAqU3lzbGludXgqIENPTUJPT1QgaW1hZ2UuICAuY29tCitpbWFnZXMgbWF5IGFsc28gYmUgcnVubmFibGUgZnJvbSBET1Mgd2hpbGUgLmNidCBpbWFnZXMgYXJlIG5vdC4gIFNlZQorYWxzbyAqY29tYm9vdC50eHQqCisKKypDT00zMiogJ2ltYWdlJzo6CisoLmMzMikgTG9hZCBhICpTeXNsaW51eCogQ09NMzIgKDMyLWJpdCAqQ09NQk9PVCopIGltYWdlLiAgU2VlIGFsc28KKypjb21ib290LnR4dCoKKworKkNPTkZJRyogJ2ltYWdlJzo6CitMb2FkIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgcmVhZCwgdGhlCit3b3JraW5nIGRpcmVjdG9yeSBpcyBjaGFuZ2VkIChpZiBzcGVjaWZpZWQgdmlhIGFuICpBUFBFTkQqKSwgdGhlbiB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZSBpcyBwYXJzZWQuCisKKypGRElNQUdFKiAnaW1hZ2UnOjoKKyhSZW1vdmVkIGFzIG9mIDQuMDUsIGFkZGVkIDEuNjU7ICpJU09MSU5VWCogb25seTogLmltZykgTG9hZCBhIGRpc2sKK2ltYWdlLgorCisqTE9DQUxCT09UKiAndHlwZSc6OgorKCpQWEVMSU5VWCogMS41Mys7ICpJU09MSU5VWCogPz8zLjEwKzsgKlNZU0xJTlVYKiAzLjcwKylBdHRlbXB0IGEKK2RpZmZlcmVudCBsb2NhbCBib290IG1ldGhvZC4gIFRoZSBzcGVjaWFsIHZhbHVlIC0xIGNhdXNlcyB0aGUgYm9vdAorbG9hZGVyIHRvIHJlcG9ydCBmYWlsdXJlIHRvIHRoZSBCSU9TLCB3aGljaCwgb24gcmVjZW50IEJJT1Nlcywgc2hvdWxkCittZWFuIHRoYXQgdGhlIG5leHQgYm9vdCBkZXZpY2UgaW4gdGhlIGJvb3Qgc2VxdWVuY2Ugc2hvdWxkIGJlIGFjdGl2YXRlZC4KKyBWYWx1ZXMgb3RoZXIgdGhhbiB0aG9zZSBkb2N1bWVudGVkIG1heSBwcm9kdWNlIHVuZGVzaXJlZCByZXN1bHRzLgorKworT24gKlBYRUxJTlVYKiwgJ3R5cGUnIDAgbWVhbnMgcGVyZm9ybSBhIG5vcm1hbCBib290LiAgJ3R5cGUnIDQgd2lsbAorcGVyZm9ybSBhIGxvY2FsIGJvb3Qgd2l0aCB0aGUgVW5pdmVyc2FsIE5ldHdvcmsgRHJpdmVyIEludGVyZmFjZSAoVU5ESSkKK2RyaXZlciBzdGlsbCByZXNpZGVudCBpbiBtZW1vcnkuICBGaW5hbGx5LCAndHlwZScgNSB3aWxsIHBlcmZvcm0gYSBsb2NhbAorYm9vdCB3aXRoIHRoZSBlbnRpcmUgUFhFIHN0YWNrLCBpbmNsdWRpbmcgdGhlIFVOREkgZHJpdmVyLCBzdGlsbAorcmVzaWRlbnQgaW4gbWVtb3J5LiBBbGwgb3RoZXIgdmFsdWVzIGFyZSB1bmRlZmluZWQuICBJZiB5b3UgZG9uJ3Qga25vdword2hhdCB0aGUgVU5ESSBvciBQWEUgc3RhY2tzIGFyZSwgZG9uJ3Qgd29ycnkgLS0geW91IGRvbid0IHdhbnQgdGhlbSwKK2p1c3Qgc3BlY2lmeSAwLgorKworT24gKklTT0xJTlVYKi8qU1lTTElOVVgqLCB0aGUgJ3R5cGUnIHNwZWNpZmllcyB0aGUgbG9jYWwgZHJpdmUgbnVtYmVyIHRvCitib290IGZyb207IDB4MDAgaXMgdGhlIHByaW1hcnkgZmxvcHB5IGRyaXZlIGFuZCAweDgwIGlzIHRoZSBwcmltYXJ5IGhhcmQKK2RyaXZlLgorCisqUFhFKiAnaW1hZ2UnOjoKKygqUFhFTElOVVgqIG9ubHk6IC4wKSBMb2FkIGEgUFhFIE5CUCAoTmV0d29yayBCb290IFByb2dyYW0pIGltYWdlLiAgVGhlCitQWEUgcHJvdG9jb2wgZG9lcyBub3QgcHJvdmlkZSBhbnkgbWVhbnMgZm9yIHNwZWNpZml5aW5nIG9yIHVzaW5nIGEKK2NvbW1hbmQgbGluZSBvciBpbml0cmQuCisKKworPT0gTEFCRUwtT05MWSBESVJFQ1RJVkVTID09CisqSU5JVFJEKiAnaW5pdHJkX2ZpbGUnOjoKKygzLjcxKykgQW4gaW5pdHJkIGNhbiBiZSBzcGVjaWZpZWQgaW4gYSBzZXBhcmF0ZSBzdGF0ZW1lbnQgKElOSVRSRCkKK2luc3RlYWQgb2YgYXMgcGFydCBvZiB0aGUgKkFQUEVORCogc3RhdGVtZW50OyB0aGlzIGZ1bmN0aW9uYWxseSBhcHBlbmRzCisiaW5pdHJkPWluaXRyZF9maWxlIiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4gIExpa2UgJ2luaXRyZD0nLCB0aGlzCithbHNvIHN1cHBvcnRzIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCBmaWxlIG5hbWVzIChzZWUgKkFQUEVORCopLgorCisKKz09IEdMT0JBTCBESVJFQ1RJVkVTIC0gU0VDT05EQVJZID09CitUaGVzZSBhcmUgZ2xvYmFsIGRpcmVjdGl2ZXMgdGhhdCBhcmUgb2YgbGVzc2VyIGltcG9ydGFuY2UsIG9mdGVuCithZmZlY3RpbmcgdGhlIHVzZXIgZXhwZXJpZW5jZSBhbmQgbm90IHRoZSBib290IHByb2Nlc3MuCisKKypBTExPV09QVElPTlMqICdmbGFnX3ZhbCc6OgorSWYgJ2ZsYWdfdmFsJyBpcyAwLCB0aGUgdXNlciBpcyBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IGFueSBhcmd1bWVudHMgb24KK3RoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgVGhlIG9ubHkgb3B0aW9ucyByZWNvZ25pemVkIGFyZSB0aG9zZQorc3BlY2lmaWVkIGluIGFuICpBUFBFTkQqKSBzdGF0ZW1lbnQuICBUaGUgZGVmYXVsdCBpcyAxLgorCisqSU1QTElDSVQqICdmbGFnX3ZhbCc6OgorSWYgJ2ZsYWdfdmFsJyBpcyAwLCBkbyBub3QgbG9hZCBhIGtlcm5lbCBpbWFnZSB1bmxlc3MgaXQgaGFzIGJlZW4KK2V4cGxpY2l0bHkgbmFtZWQgaW4gYSAqTEFCRUwqIHN0YXRlbWVudC4gIFRoZSBkZWZhdWx0IGlzIDEuCisKKypUSU1FT1VUKiAndGltZW91dCc6OgorSW5kaWNhdGVzIGhvdyBsb25nIHRvIHdhaXQgYXQgdGhlICdib290OicgcHJvbXB0IHVudGlsIGJvb3RpbmcKK2F1dG9tYXRpY2FsbHksIGluIHVuaXRzIG9mIDEvMTAgcy4gIFRoZSB0aW1lb3V0IGlzIGNhbmNlbGxlZCBhcyBzb29uIGFzCit0aGUgdXNlciB0eXBlcyBhbnl0aGluZyBvbiB0aGUga2V5Ym9hcmQsIHRoZSBhc3N1bXB0aW9uIGJlaW5nIHRoYXQgdGhlCit1c2VyIHdpbGwgY29tcGxldGUgdGhlIGNvbW1hbmQgbGluZSBhbHJlYWR5IGJlZ3VuLiAgVGhlIHRpbWVyIGlzIHJlc2V0Cit0byAwIHVwb24gcmV0dXJuIGZyb20gYW4gdW5zdWNjZXNzZnVsIGF0dGVtcHQgdG8gYm9vdCBvciBmcm9tIGEgbW9kdWxlLiAKK0EgdGltZW91dCBvZiB6ZXJvICh0aGUgZGVmYXVsdCkgd2lsbCBkaXNhYmxlIHRoZSB0aW1lb3V0IGNvbXBsZXRlbHkuCisKKypUT1RBTFRJTUVPVVQqICd0aW1lb3V0Jzo6CitJbmRpY2F0ZXMgaG93IGxvbmcgdG8gd2FpdCB1bnRpbCBib290aW5nIGF1dG9tYXRpY2FsbHksIGluIHVuaXRzIG9mCisxLzEwIHMuICBUaGlzIHRpbWVvdXQgaXMgKm5vdCogY2FuY2VsbGVkIGJ5IHVzZXIgaW5wdXQsIGFuZCBjYW4gdGh1cyBiZQordXNlZCB0byBkZWFsIHdpdGggc2VyaWFsIHBvcnQgZ2xpdGNoZXMgb3IgInRoZSB1c2VyIHdhbGtlZCBhd2F5IiB0eXBlCitzaXR1YXRpb25zLiAgQSB0aW1lb3V0IG9mIHplcm8gKHRoZSBkZWZhdWx0KSB3aWxsIGRpc2FibGUgdGhlIHRpbWVvdXQKK2NvbXBsZXRlbHkuCisrCitCb3RoICpUSU1FT1VUKiBhbmQgKlRPVEFMVElNRU9VVCogY2FuIGJlIHVzZWQgdG9nZXRoZXIsIGZvciBleGFtcGxlOgorKworLS0tLQorIyBXYWl0IDUgc2Vjb25kcyB1bmxlc3MgdGhlIHVzZXIgdHlwZXMgc29tZXRoaW5nLCBidXQKKyMgYWx3YXlzIGJvb3QgYWZ0ZXIgMTUgbWludXRlcy4KK1RJTUVPVVQgNTAKK1RPVEFMVElNRU9VVCA5MDAwCistLS0tCisKKy8vIEZJWE1FOiBiZSBjb25zaXN0ZW50CisqT05USU1FT1VUKiAna2VybmVsIG9wdGlvbnMuLi4nOjoKK1NldHMgdGhlIGNvbW1hbmQgbGluZSBpbnZva2VkIG9uIGEgdGltZW91dCAod2hpY2ggb2Z0ZW4gcmVmZXJlbmNlcyBhCitMQUJFTCkuICBJZiBub3Qgc3BlY2lmaWVkLCAnVUknIChpZiB1c2VkKSBvciAnREVGQVVMVCBpcyB1c2VkLgorCisqT05FUlJPUiogJ2tlcm5lbCBvcHRpb25zLi4uJzo6CitJZiBhIGtlcm5lbCBpbWFnZSBpcyBub3QgZm91bmQgKGVpdGhlciBkdWUgdG8gaXQgbm90IGV4aXN0aW5nLCBvcgorYmVjYXVzZSAqSU1QTElDSVQqIGlzIHNldCksIHJ1biB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuICBUaGUgZmF1bHR5Citjb21tYW5kIGxpbmUgaXMgYXBwZW5kZWQgdG8gdGhlIHNwZWNpZmllZCBvcHRpb25zLCBzbyBpZiB0aGUgKk9ORVJST1IqCitkaXJlY3RpdmUgcmVhZHMgYXM6CisrCistLS0tCitPTkVSUk9SIHh5enp5IHBsdWdoCistLS0tCisrCithbmQgdGhlIGNvbW1hbmQgbGluZSBhcyBlbnRlcmVkIGJ5IHRoZSB1c2VyIGlzOgorKworLS0tLQorZm9vIGJhciBiYXoKKy0tLS0KKysKKypTeXNsaW51eCogd2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgYXMgaWYgZW50ZXJlZCBieSB0aGUgdXNlcjoKKysKKy0tLS0KK3h5enp5IHBsdWdoIGZvbyBiYXIgYmF6CistLS0tCisKKypTRVJJQUwqICdwb3J0IFtiYXVkcmF0ZSBbZmxvd2NvbnRyb2xdXSc6OgorRW5hYmxlcyBhIHNlcmlhbCBwb3J0IHRvIGFjdCBhcyB0aGUgY29uc29sZS4gICdwb3J0JyBpcyBhIG51bWJlciAoMCA9CisvZGV2L3R0eVMwID0gQ09NMSwgZXRjLikgb3IgYW4gSS9PIHBvcnQgYWRkcmVzcyAoZS5nLiAweDNGOCk7IGlmCisnYmF1ZHJhdGUnIGlzIG9taXR0ZWQsIHRoZSBiYXVkIHJhdGUgZGVmYXVsdHMgdG8gOTYwMCBicHMuICBUaGUgc2VyaWFsCitwYXJhbWV0ZXJzIGFyZSBoYXJkY29kZWQgdG8gYmUgOCBiaXRzLCBubyBwYXJpdHksIDEgc3RvcCBiaXQuCisrCisnZmxvd2NvbnRyb2wnIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBiaXRzOgorKworLi4uLgorMHgwMDEgLSBBc3NlcnQgRFRSCisweDAwMiAtIEFzc2VydCBSVFMKKzB4MDA4IC0gRW5hYmxlIGludGVycnVwdHMKKzB4MDEwIC0gV2FpdCBmb3IgQ1RTIGFzc2VydGlvbgorMHgwMjAgLSBXYWl0IGZvciBEU1IgYXNzZXJ0aW9uCisweDA0MCAtIFdhaXQgZm9yIFJJIGFzc2VydGlvbgorMHgwODAgLSBXYWl0IGZvciBEQ0QgYXNzZXJ0aW9uCisweDEwMCAtIElnbm9yZSBpbnB1dCB1bmxlc3MgQ1RTIGFzc2VydGVkCisweDIwMCAtIElnbm9yZSBpbnB1dCB1bmxlc3MgRFNSIGFzc2VydGVkCisweDQwMCAtIElnbm9yZSBpbnB1dCB1bmxlc3MgUkkgYXNzZXJ0ZWQKKzB4ODAwIC0gSWdub3JlIGlucHV0IHVubGVzcyBEQ0QgYXNzZXJ0ZWQKKy4uLi4KKysKK0FsbCBvdGhlciBiaXRzIGFyZSByZXNlcnZlZC4KKysKK1R5cGljYWwgdmFsdWVzIGFyZToKKysKKy4uLi4KKyAgICAwIC0gTm8gZmxvdyBjb250cm9sIChkZWZhdWx0KQorMHgzMDMgLSBOdWxsIG1vZGVtIGNhYmxlIGRldGVjdAorMHgwMTMgLSBSVFMvQ1RTIGZsb3cgY29udHJvbAorMHg4MTMgLSBSVFMvQ1RTIGZsb3cgY29udHJvbCwgbW9kZW0gaW5wdXQKKzB4MDIzIC0gRFRSL0RTUiBmbG93IGNvbnRyb2wKKzB4MDgzIC0gRFRSL0RDRCBmbG93IGNvbnRyb2wKKy4uLi4KKysKK0ZvciB0aGUgKlNFUklBTCogZGlyZWN0aXZlIHRvIGJlIGd1YXJhbnRlZWQgdG8gd29yayBwcm9wZXJseSwgaXQgc2hvdWxkCitiZSB0aGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisrCitOT1RFOiAncG9ydCcgdmFsdWVzIGZyb20gMCB0byAzIG1lYW5zIHRoZSBmaXJzdCBmb3VyIHNlcmlhbCBwb3J0cworZGV0ZWN0ZWQgYnkgdGhlIEJJT1MuICBUaGV5IG1heSBvciBtYXkgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGxlZ2FjeSBwb3J0Cit2YWx1ZXMgMHgzRjgsIDB4MkY4LCAweDNFOCwgMHgyRTguCisrCitFbmFibGluZyBpbnRlcnJ1cHRzIChzZXR0aW5nIHRoZSAweDAwOCBiaXQpIG1heSBnaXZlIGJldHRlcgorcmVzcG9uc2l2ZW5lc3Mgd2l0aG91dCBzZXR0aW5nIHRoZSAqTk9IQUxUKiBvcHRpb24sIGJ1dCBjb3VsZAorcG90ZW50aWFsbHkgY2F1c2UgcHJvYmxlbXMgd2l0aCBidWdneSBCSU9TZXMuCisrCitUaGlzIG9wdGlvbiBpcyAic3RpY2t5IiBhbmQgaXMgbm90IGF1dG9tYXRpY2FsbHkgcmVzZXQgd2hlbiBsb2FkaW5nIGEKK25ldyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgQ09ORklHIGNvbW1hbmQuCisKKypOT0hBTFQqICdmbGFnX3ZhbCc6OgorSWYgJ2ZsYWdfdmFsJyBpcyAxLCBkb24ndCBoYWx0IHRoZSBwcm9jZXNzb3Igd2hpbGUgaWRsZS4gSGFsdGluZyB0aGUKK3Byb2Nlc3NvciB3aGlsZSBpZGxlIHNpZ25pZmljYW50bHkgcmVkdWNlcyB0aGUgcG93ZXIgY29uc3VtcHRpb24sIGJ1dAorY2FuIGNhdXNlIHBvb3IgcmVzcG9uc2l2ZW5lc3MgdG8gdGhlIHNlcmlhbCBjb25zb2xlLCBlc3BlY2lhbGx5IHdoZW4KK3VzaW5nIHNjcmlwdHMgdG8gZHJpdmUgdGhlIHNlcmlhbCBjb25zb2xlLCBhcyBvcHBvc2VkIHRvIGh1bWFuCitpbnRlcmFjdGlvbi4KKworKkNPTlNPTEUqICdmbGFnX3ZhbCc6OgorSWYgJ2ZsYWdfdmFsJyBpcyAwLCBkaXNhYmxlIG91dHB1dCB0byB0aGUgbm9ybWFsIHZpZGVvIGNvbnNvbGUuIElmCisnZmxhZ192YWwnIGlzIDEsIGVuYWJsZSBvdXRwdXQgdG8gdGhlIHZpZGVvIGNvbnNvbGUgKHRoaXMgaXMgdGhlCitkZWZhdWx0LikKKysKK1NvbWUgQklPU2VzIHRyeSB0byBmb3J3YXJkIHRoaXMgdG8gdGhlIHNlcmlhbCBjb25zb2xlIGFuZCBzb21ldGltZXMgbWFrZQorYSB0b3RhbCBtZXNzIHRoZXJlb2YsIHNvIHRoaXMgb3B0aW9uIGxldHMgeW91IGRpc2FibGUgdGhlIHZpZGVvIGNvbnNvbGUKK29uIHRoZXNlIHN5c3RlbXMuCisKKypGT05UKiAnZmlsZW5hbWUnOjoKK0xvYWQgYSBmb250IGluIC5wc2YgZm9ybWF0IGJlZm9yZSBkaXNwbGF5aW5nIGFueSBvdXRwdXQgKGV4Y2VwdCB0aGUKK2NvcHlyaWdodCBsaW5lLCB3aGljaCBpcyBvdXRwdXQgYXMgbGRsaW51eC5zeXMgaXRzZWxmIGlzIGxvYWRlZC4pIAorKlN5c2xpbnV4KiBvbmx5IGxvYWRzIHRoZSBmb250IG9udG8gdGhlIHZpZGVvIGNhcmQ7IGlmIHRoZSAucHNmIGZpbGUKK2NvbnRhaW5zIGEgVW5pY29kZSB0YWJsZSBpdCBpcyBpZ25vcmVkLiAgVGhpcyBvbmx5IHdvcmtzIG9uIEVHQSBhbmQgVkdBCitjYXJkczsgaG9wZWZ1bGx5IGl0IHNob3VsZCBkbyBub3RoaW5nIG9uIG90aGVycy4KKworKktCRE1BUCogJ2tleW1hcCc6OgorSW5zdGFsbCBhIHNpbXBsZSBrZXlib2FyZCBtYXAuICBUaGUga2V5Ym9hcmQgcmVtYXBwZXIgdXNlZCBpcyAqdmVyeSoKK3NpbXBsaXN0aWMgKGl0IHNpbXBseSByZW1hcHMgdGhlIGtleWNvZGVzIHJlY2VpdmVkIGZyb20gdGhlIEJJT1MsIHdoaWNoCittZWFucyB0aGF0IG9ubHkgdGhlIGtleSBjb21iaW5hdGlvbnMgcmVsZXZhbnQgaW4gdGhlIGRlZmF1bHQgbGF5b3V0IC0tCit1c3VhbGx5IFUuUy4gRW5nbGlzaCAtLSBjYW4gYmUgbWFwcGVkKSBidXQgc2hvdWxkIGF0IGxlYXN0IGhlbHAgcGVvcGxlCit3aXRoIEFaRVJUWSBrZXlib2FyZCBsYXlvdXQgYW5kIHRoZSBsb2NhdGlvbnMgb2YgPSBhbmQgLCAodHdvIHNwZWNpYWwKK2NoYXJhY3RlcnMgdXNlZCBoZWF2aWx5IG9uIHRoZSBMaW51eCBrZXJuZWwgY29tbWFuZCBsaW5lLikKKysKK1RoZSBpbmNsdWRlZCBwcm9ncmFtIGtleXRhYi1saWxvLnBsIGZyb20gdGhlIExJTE8gZGlzdHJpYnV0aW9uIGNhbiBiZQordXNlZCB0byBjcmVhdGUgc3VjaCBrZXltYXBzLiAgVGhlIGZpbGUga2V5dGFiLWxpbG8udHh0IGNvbnRhaW5zIHRoZQorZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBwcm9ncmFtLgorCisqRElTUExBWSogJ2ZpbGVuYW1lJzo6CitEaXNwbGF5cyB0aGUgaW5kaWNhdGVkIGZpbGUgb24gdGhlIHNjcmVlbiBhdCBib290IHRpbWUgKGJlZm9yZSB0aGUgYm9vdDoKK3Byb21wdCwgaWYgZGlzcGxheWVkKS4gIFBsZWFzZSBzZWUgdGhlIHNlY3Rpb24gYmVsb3cgb24gKkRJU1BMQVkqIGZpbGVzLgorKworTk9URTogSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgdGhpcyBvcHRpb24gaXMgc2ltcGx5IGlnbm9yZWQuCisKKypTQVkqICdtZXNzYWdlJzo6CitQcmludHMgdGhlIG1lc3NhZ2Ugb24gdGhlIHNjcmVlbi4KKworKlBST01QVCogJ2ZsYWdfdmFsJzo6CitJZiAnZmxhZ192YWwnIGlzIDAsIGRpc3BsYXkgdGhlIGJvb3Q6IHByb21wdCBvbmx5IGlmIHRoZSBTaGlmdCBvciBBbHQKK2tleSBpcyBwcmVzc2VkLCBvciBDYXBzIExvY2sgb3IgU2Nyb2xsIGxvY2sgaXMgc2V0ICh0aGlzIGlzIHRoZQorZGVmYXVsdCkuICBJZiAnZmxhZ192YWwnIGlzIDEsIGFsd2F5cyBkaXNwbGF5IHRoZSBib290OiBwcm9tcHQuCisKKypOT0VTQ0FQRSogJ2ZsYWdfdmFsJzo6CitJZiAnZmxhZ192YWwnIGlzIHNldCB0byAxLCBpZ25vcmUgdGhlIFNoaWZ0L0FsdC9DYXBzIExvY2svU2Nyb2xsIExvY2sKK2VzY2FwZXMuICBVc2UgdGhpcyAodG9nZXRoZXIgd2l0aCBQUk9NUFQgMCkgdG8gZm9yY2UgdGhlIGRlZmF1bHQgYm9vdAorYWx0ZXJuYXRpdmUuCisKKypOT0NPTVBMRVRFKiAnZmxhZ192YWwnOjoKK0lmICdmbGFnX3ZhbCcgaXMgc2V0IHRvIDEsIHRoZSBUYWIga2V5IGRvZXMgbm90IGRpc3BsYXkgbGFiZWxzIGF0IHRoZQorYm9vdDogcHJvbXB0LgorCisvLyAgIC4uLmV0Yy4uLgorKkYxKiAnZmlsZW5hbWUnOjoKKypGMiogJ2ZpbGVuYW1lJzo6CisqRjMqICdmaWxlbmFtZSc6OgorKkY0KiAnZmlsZW5hbWUnOjoKKypGNSogJ2ZpbGVuYW1lJzo6CisqRjYqICdmaWxlbmFtZSc6OgorKkY3KiAnZmlsZW5hbWUnOjoKKypGOCogJ2ZpbGVuYW1lJzo6CisqRjkqICdmaWxlbmFtZSc6OgorKkYxMCogJ2ZpbGVuYW1lJzo6CisqRjExKiAnZmlsZW5hbWUnOjoKKypGMTIqICdmaWxlbmFtZSc6OgorRGlzcGxheXMgdGhlIGluZGljYXRlZCBmaWxlIG9uIHRoZSBzY3JlZW4gd2hlbiBhIGZ1bmN0aW9uIGtleSBpcyBwcmVzc2VkCithdCB0aGUgYm9vdDogcHJvbXB0LiAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgcHJlLWJvb3Qgb25saW5lIGhlbHAKKyhwcmVzdW1hYmx5IGZvciB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb25zLikgIFBsZWFzZSBzZWUgdGhlCitzZWN0aW9uIGJlbG93IG9uIERJU1BMQVkgZmlsZXMuCisrCitXaGVuIHVzaW5nIHRoZSBzZXJpYWwgY29uc29sZSwgcHJlc3MgPEN0cmwtRj48ZGlnaXQ+IHRvIGdldCB0byB0aGUgaGVscAorc2NyZWVucywgZS5nLiA8Q3RybC1GPjwyPiB0byBnZXQgdG8gdGhlIEYyIHNjcmVlbi4gRm9yIEYxMC1GMTIsIGhpdAorPEN0cmwtRj48QT4sIDxDdHJsLUY+QiwgPEN0cmwtRj5DLiAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyCit2ZXJzaW9ucywgRjEwIGNhbiBhbHNvIGJlIGVudGVyZWQgYXMgPEN0cmwtRj4wLgorCisqUEFUSCogJ3BhdGgnOjoKKyg1LjAwKykgU3BlY2lmeSBhIHNwYWNlLXNlcGFyYXRlZCAoJyAnOyA1LjAwLTUuMTAgd2FzIGEgY29sb24gJzonKSBsaXN0CitvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgbW9kdWxlcy4gVGhpcyBkaXJlY3RpdmUKK2lzIHVzZWZ1bCBmb3Igc3BlY2lmeWluZyB0aGUgZGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgbGliKi5jMzIgbGlicmFyeQorZmlsZXMgYXMgb3RoZXIgbW9kdWxlcyBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZXNlIGZpbGVzLCBidXQgbWF5IG5vdAorcmVzaWRlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4gIE11bHRpcGxlIGluc3RhbmNlcyB3aWxsIGFwcGVuZCBhZGRpdGlvbmFsCitwYXRocy4KKworKlNFTkRDT09LSUVTKiAnYml0bWFzayc6OgorKCpQWEVMSU5VWCogNS4xMCspIFdoZW4gZG93bmxvYWRpbmcgZmlsZXMgb3ZlciBodHRwLCB0aGUgU1lTQVBQRU5ECitzdHJpbmdzIGFyZSBwcmVwZW5kZWQgd2l0aCBfU3lzbGludXhfIGFuZCBzZW50IHRvIHRoZSBzZXJ2ZXIgYXMgY29va2llcy4KK1RoZSBjb29raWVzIGFyZSBVUkwtZW5jb2RlZDsgd2hpdGVzcGFjZSBpcyAqbm90KiByZXBsYWNlZCB3aXRoCit1bmRlcnNjb3Jlcy4KKysKK1RoaXMgY29tbWFuZCBsaW1pdHMgdGhlIGNvb2tpZXMgc2VuZDsgMCBtZWFucyBubyBjb29raWVzLiAgVGhlIGRlZmF1bHQKK2lzIC0xLCBtZWFuaW5nIHNlbmQgYWxsIGNvb2tpZXMuCisrCitUaGlzIG9wdGlvbiBpcyAic3RpY2t5IiBhbmQgaXMgbm90IGF1dG9tYXRpY2FsbHkgcmVzZXQgd2hlbiBsb2FkaW5nIGEKK25ldyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgQ09ORklHIGNvbW1hbmQuCisKKworPT0gRElTUExBWSBGSUxFIEZPUk1BVCA9PQorRElTUExBWSBhbmQgZnVuY3Rpb24ta2V5IGhlbHAgZmlsZXMgYXJlIHRleHQgZmlsZXMgaW4gZWl0aGVyIERPUyBvciBVTklYCitmb3JtYXQgKHdpdGggb3Igd2l0aG91dCA8Q1I+KS4gIEluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIHNwZWNpYWwgY29kZXMKK2FyZSBpbnRlcnByZXRlZDoKKworLy9bRklYTUVdOiAjMSBkb2Vzbid0IGJyZWFrOyAjMiBhcy1pczsgIzMgYnJva2VuIGJ1dCBub3Qgb24gcmlnaHQ7ICM0CitpZGVudGljYWwgdG8gIzMKKy8vIGhvcml6b250YWwgZXh0ZW5kcyB0aGUgbGluZSdzIGxhYmVsLCByZWR1Y2luZyB0aGUgZGVmaW5pdGlvbgorLy8gdGFiIG9yIHNwYWNlIHRvIHNoaWZ0IGV4cGxhbmF0aW9uID8gIGFsaWduIGJlZ2lubmluZyBvciBlbmQ/CisKKy8vIGlmbmRlZjo6ZG9jdHlwZS1tYW5wYWdlW1tob3Jpem9udGFsXV0KKyo8RkY+Kjo6IHtuYnNwMzJ9IAkJCQk9IDxDdHJsLUw+ID0gQVNDSUkgMTIgKworQ2xlYXIgdGhlIHNjcmVlbiwgaG9tZSB0aGUgY3Vyc29yLiAgTm90ZSB0aGF0IHRoZSBzY3JlZW4gaXMgZmlsbGVkIHdpdGgKK3RoZSBjdXJyZW50IGRpc3BsYXkgY29sb3IuCisKKyo8RkY+Kjo6Cis9IDxDdHJsLUw+ID0gQVNDSUkgMTI7IENsZWFyIHRoZSBzY3JlZW4sIGhvbWUgdGhlIGN1cnNvci4gIE5vdGUgdGhhdCB0aGUKK3NjcmVlbiBpcyBmaWxsZWQgd2l0aCB0aGUgY3VycmVudCBkaXNwbGF5IGNvbG9yLgorCisqPEZGPio6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZGPiA9IDxDdHJsLUw+ID0gQVNDSUkgMTIKKysKK0NsZWFyIHRoZSBzY3JlZW4sIGhvbWUgdGhlIGN1cnNvci4gIE5vdGUgdGhhdCB0aGUgc2NyZWVuIGlzIGZpbGxlZCB3aXRoCit0aGUgY3VycmVudCBkaXNwbGF5IGNvbG9yLgorCisqPEZGPio6OgorPEZGPiA9IDxDdHJsLUw+ID0gQVNDSUkgMTIgKworQ2xlYXIgdGhlIHNjcmVlbiwgaG9tZSB0aGUgY3Vyc29yLiAgTm90ZSB0aGF0IHRoZSBzY3JlZW4gaXMgZmlsbGVkIHdpdGgKK3RoZSBjdXJyZW50IGRpc3BsYXkgY29sb3IuCisKKyo8U0k+Kic8Ymc+PGZnPic6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U0k+ID0gPEN0cmwtTz4gPSBBU0NJSSAxNQorKworU2V0IHRoZSBkaXNwbGF5IGNvbG9ycyB0byB0aGUgc3BlY2lmaWVkIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQKK2NvbG9ycywgd2hlcmUgPGJnPiBhbmQgPGZnPiBhcmUgdGhlIDIgaGV4IGRpZ2l0cyByZXByZXNlbnRpbmcgMSBieXRlLAorY29ycmVzcG9uZGluZyB0byB0aGUgc3RhbmRhcmQgUEMgZGlzcGxheSBhdHRyaWJ1dGVzOgorKworICAgICAgICAwID0gYmxhY2sgICAgICAgICAgICAgICA4ID0gZGFyayBncmV5CisgICAgICAgIDEgPSBkYXJrIGJsdWUgICAgICAgICAgIDkgPSBicmlnaHQgYmx1ZQorICAgICAgICAyID0gZGFyayBncmVlbiAgICAgICAgICBhID0gYnJpZ2h0IGdyZWVuCisgICAgICAgIDMgPSBkYXJrIGN5YW4gICAgICAgICAgIGIgPSBicmlnaHQgY3lhbgorICAgICAgICA0ID0gZGFyayByZWQgICAgICAgICAgICBjID0gYnJpZ2h0IHJlZAorICAgICAgICA1ID0gZGFyayBwdXJwbGUgICAgICAgICBkID0gYnJpZ2h0IHB1cnBsZQorICAgICAgICA2ID0gYnJvd24gICAgICAgICAgICAgICBlID0geWVsbG93CisgICAgICAgIDcgPSBsaWdodCBncmV5ICAgICAgICAgIGYgPSB3aGl0ZQorKworUGlja2luZyBhIGJyaWdodCBjb2xvciAoOC1mKSBmb3IgdGhlIGJhY2tncm91bmQgcmVzdWx0cyBpbiB0aGUKK2NvcnJlc3BvbmRpbmcgZGFyayBjb2xvciAoMC03KSwgd2l0aCB0aGUgZm9yZWdyb3VuZCBmbGFzaGluZy4KKysKK0NvbG9ycyBhcmUgbm90IHZpc2libGUgb3ZlciB0aGUgc2VyaWFsIGNvbnNvbGUuCisKKyo8Q0FOPionZmlsZW5hbWU8bmV3bGluZT4nOjogICAgICAgICAgICAgICAgIDxDQU4+ID0gPEN0cmwtWD4gPSBBU0NJSSAyNAorKworSWYgYSBWR0EgZGlzcGxheSBpcyBwcmVzZW50LCBlbnRlciBncmFwaGljcyBtb2RlIGFuZCBkaXNwbGF5IHRoZSBncmFwaGljCitpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQgaXMgYW4gYWQgaG9jIGZvcm1hdAorY2FsbGVkIExTUzE2OyB0aGUgaW5jbHVkZWQgUGVybCBwcm9ncmFtICJwcG10b2xzczE2IiBjYW4gYmUgdXNlZCB0bworcHJvZHVjZSB0aGVzZSBpbWFnZXMuICBUaGlzIFBlcmwgcHJvZ3JhbSBhbHNvIGluY2x1ZGVzIHRoZSBmaWxlIGZvcm1hdAorc3BlY2lmaWNhdGlvbi4KKysKK1RoZSBpbWFnZSBpcyBkaXNwbGF5ZWQgaW4gNjQweDQ4MCAxNi1jb2xvciBtb2RlLiAgT25jZSBpbiBncmFwaGljcyBtb2RlLAordGhlIGRpc3BsYXkgYXR0cmlidXRlcyAoc2V0IGJ5IDxTST4gY29kZSBzZXF1ZW5jZXMpIHdvcmsgc2xpZ2h0bHkKK2RpZmZlcmVudGx5OiB0aGUgYmFja2dyb3VuZCBjb2xvciBpcyBpZ25vcmVkLCBhbmQgdGhlIGZvcmVncm91bmQgY29sb3JzCithcmUgdGhlIDE2IGNvbG9ycyBzcGVjaWZpZWQgaW4gdGhlIGltYWdlIGZpbGUuICBGb3IgdGhhdCByZWFzb24sCitwcG10b2xzczE2IGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGF0IGNlcnRhaW4gY29sb3JzIHNob3VsZCBiZSBhc3NpZ25lZAordG8gc3BlY2lmaWMgY29sb3IgaW5kaWNpZXMuCisrCitDb2xvciBpbmRpY2llcyAwIGFuZCA3LCBpbiBwYXJ0aWN1bGFyLCBzaG91bGQgYmUgY2hvc2VuIHdpdGggY2FyZTogMCBpcwordGhlIGJhY2tncm91bmQgY29sb3IsIGFuZCA3IGlzIHRoZSBjb2xvciB1c2VkIGZvciB0aGUgdGV4dCBwcmludGVkIGJ5CisqU3lzbGludXgqIGl0c2VsZi4KKworKjxFTT4qOjoJCQkJPEVNPiA9IDxDdHJsLVk+ID0gQVNDSUkgMjUgKworSWYgd2UgYXJlIGN1cnJlbnRseSBpbiBncmFwaGljcyBtb2RlLCByZXR1cm4gdG8gdGV4dCBtb2RlLgorCisqPERMRT4qLi4qPEVUQj4qOjoJCQk8Q3RybC1QPi4uPEN0cmwtVz4gPSBBU0NJSSAxNi0yMworKworVGhlc2UgY29kZXMgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG1vZGVzIHRvIHByaW50IGEgY2VydGFpbiBwYXJ0IG9mCit0aGUgbWVzc2FnZSBmaWxlIGluLiAgRWFjaCBvZiB0aGVzZSBjb250cm9sIGNoYXJhY3RlcnMgc2VsZWN0IGEgc3BlY2lmaWMKK3NldCBvZiBtb2RlcyAodGV4dCBzY3JlZW4sIGdyYXBoaWNzIHNjcmVlbiwgc2VyaWFsIHBvcnQpIGZvciB3aGljaCB0aGUKK291dHB1dCBpcyBhY3R1YWxseSBkaXNwbGF5ZWQ6CisrCisJQ2hhcmFjdGVyCQkJVGV4dAlHcmFwaAlTZXJpYWwKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwk8RExFPiA9IDxDdHJsLVA+ID0gQVNDSUkgMTYJTm8JTm8JTm8KKwk8REMxPiA9IDxDdHJsLVE+ID0gQVNDSUkgMTcJWWVzCU5vCU5vCisJPERDMj4gPSA8Q3RybC1SPiA9IEFTQ0lJIDE4CU5vCVllcwlObworCTxEQzM+ID0gPEN0cmwtUz4gPSBBU0NJSSAxOQlZZXMJWWVzCU5vCisJPERDND4gPSA8Q3RybC1UPiA9IEFTQ0lJIDIwCU5vCU5vCVllcworCTxOQUs+ID0gPEN0cmwtVT4gPSBBU0NJSSAyMQlZZXMJTm8JWWVzCisJPFNZTj4gPSA8Q3RybC1WPiA9IEFTQ0lJIDIyCU5vCVllcwlZZXMKKwk8RVRCPiA9IDxDdHJsLVc+ID0gQVNDSUkgMjMJWWVzCVllcwlZZXMKKysKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHdpbGwgYWN0dWFsbHkgcHJpbnQgb3V0IHdoaWNoIG1vZGUgdGhlCitjb25zb2xlIGlzIGluOgorKworCTxEQzE+VGV4dCBtb2RlPERDMj5HcmFwaGljcyBtb2RlPERDND5TZXJpYWwgcG9ydDxFVEI+CisKKyo8U1VCPio6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNVQj4gPSA8Q3RybC1aPiA9IEFTQ0lJIDI2CisrCitFbmQgb2YgZmlsZSAoRE9TIGNvbnZlbnRpb24pLgorCisqPEJFTD4qOjoJCQkJPEJFTD4gPSA8Q3RybC1HPiA9IEFTQ0lJIDcgKworQmVlcCB0aGUgc3BlYWtlci4KKworCis9PSBCT09UIExPQURFUiBJRFMgVVNFRCA9PQorVGhlIExpbnV4IGJvb3QgcHJvdG9jb2wgc3VwcG9ydHMgYSAiYm9vdCBsb2FkZXIgSUQiLCBhIHNpbmdsZSBieXRlIHdoZXJlCit0aGUgdXBwZXIgbnliYmxlIHNwZWNpZmllcyBhIGJvb3QgbG9hZGVyIGZhbWlseSAoMyA9ICpTeXNsaW51eCopIGFuZCB0aGUKK2xvd2VyIG55YmJsZSBpcyB2ZXJzaW9uIG9yLCBpbiB0aGUgY2FzZSBvZiAqU3lzbGludXgqLCBtZWRpYToKKworCTB4MzEgKDQ5KSA9IFNZU0xJTlVYCisJMHgzMiAoNTApID0gUFhFTElOVVgKKwkweDMzICg1MSkgPSBJU09MSU5VWAorCTB4MzQgKDUyKSA9IEVYVExJTlVYCisKK0luIHJlY2VudCB2ZXJzaW9ucyBvZiBMaW51eCwgdGhpcyBJRCBpcyBhdmFpbGFibGUgYXMKKy9wcm9jL3N5cy9rZXJuZWwvYm9vdGxvYWRlcl90eXBlLgorCisKKz09IE5PVklDRSBQUk9URUNUSU9OID09CisqU3lzbGludXgqIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3QgYm9vdGluZyBvbiBhIG1hY2hpbmUgd2l0aCB0b28gbGl0dGxlCittZW1vcnksIHdoaWNoIG1lYW5zIHRoZSBMaW51eCBib290IHNlcXVlbmNlIGNhbm5vdCBjb21wbGV0ZS4gIElmIHNvLCBhCittZXNzYWdlIGlzIGRpc3BsYXllZCBhbmQgdGhlIGJvb3Qgc2VxdWVuY2UgYWJvcnRlZC4gIEhvbGRpbmcgZG93biB0aGUKK0N0cmwga2V5IHdoaWxlIGJvb3RpbmcgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLgorCitBbnkgZmlsZSB0aGF0ICpTeXNsaW51eCogdXNlcyBjYW4gYmUgbWFya2VkIGhpZGRlbiwgc3lzdGVtIG9yIHJlYWRvbmx5CitpZiBzbyBpcyBjb252ZW5pZW50OyAqU3lzbGludXgqIGlnbm9yZXMgYWxsIGZpbGUgYXR0cmlidXRlcy4gIFRoZQorKlNZU0xJTlVYKiBpbnN0YWxsZXIgYXV0b21hdGljYWxseSBzZXRzIHRoZSByZWFkb25seS9oaWRkZW4vc3lzdGVtCithdHRyaWJ1dGVzIG9uIExETElOVVguU1lTLgorCis9PSBFWEFNUExFID09CitIZXJlIGFyZSBzb21lIHNhbXBsZSBjb25maWcgZmlsZXM6CistLS0tCisjIFNFUklBTCAwIDExNTIwMAorREVGQVVMVCBsaW51eAorUFJPTVBUIDEKK1RJTUVPVVQgNjAwCisKK0xBQkVMIGxpbnV4CisgIExJTlVYIHZtbGludXoKKyAgQVBQRU5EIGluaXRyZD1pbml0cmQxLmd6LGluaXRyZDIuZ3oKKworTEFCRUwgbQorICBDT00zMiBtZW51LmMzMgorLS0tLQorSW4gdGhpcyBleGFtcGxlLCBzZXJpYWwgcG9ydCB1c2UgaXMgZGlzYWJsZWQgYnV0IGNhbiBiZSBlbmFibGVkIGJ5Cit1bmNvbW1lbnRpbmcgdGhlIGZpcnN0IGxpbmUgYW5kIHV0aWxpemUgc2VyaWFsIHBvcnQgMCBhdCAxMTUyMDAgYnBzLiAgSWYKKydsaW51eCcgaXMgdHlwZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIGtlcm5lbC1saWtlIGZpbGUgJ3ZtbGludXonIGlzCitleGVjdXRlZCBhcyBhIExpbnV4IGtlcm5lbCwgaW5pdHJkIGZpbGVzIGluaXRyZDEuZ3ogYW5kIGluaXRyZDIuZ3ogYXJlCitsb2FkZWQgYXMgaW5pdGlhbCByYW1kaXNrIGZpbGVzIChsaWtlIGNwaW8uZ3ogZmlsZXMgZm9yIGluaXRyYW1mcykuICBJZgorJ20nIGlzIHR5cGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBDT00zMiBtb2R1bGUgJ21lbnUuYzMyJyBpcworZXhlY3V0ZWQgdG8gbGF1bmNoIGEgbWVudSBzeXN0ZW0uCisKKworCis9PSBLTk9XTiBCVUdTID09CitpbmNsdWRlOjpjb20tYnVnLnR4dFtdCisKKworPT0gQlVHIFJFUE9SVFMgPT0KK2luY2x1ZGU6OmNvbS1ycHQudHh0W10KKworCis9PSBBVVRIT1IgPT0KK1RoaXMgQXNjaWlEb2MgZGVyaXZlZCBkb2N1bWVudCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsCisqU1lTTElOVVgqIGRvY3VtZW50YXRpb24gYnkge2F1dGhvcn0gPHthdXRob3ItZW1haWx9Pi4gIFRoZSBjb252ZXJzaW9uCit0byBhbiBBc2NpaURvYyB3YXMgbWFkZSBieSB7ZWRpdG9yMX0gPHtlZGl0b3IxLWVtYWlsfT4KZGlmZiAtLWdpdCBhL3R4dC9zeXNsaW51eC50eHQgYi90eHQvc3lzbGludXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjY2NjMKLS0tIC9kZXYvbnVsbAorKysgYi90eHQvc3lzbGludXgudHh0CkBAIC0wLDAgKzEsMjE5IEBACis9IHN5c2xpbnV4KDEpID0KKzpkb2N0eXBlOiBtYW5wYWdlCis6cmV2ZGF0ZTogMjAxMy0wNi0xMgorOmF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKzphdXRob3ItZW1haWw6IGhwYUB6eXRvci5jb20KKzplZGl0b3IxOiBHZW5lIEN1bW0KKzplZGl0b3IxLWVtYWlsOiBnZW5lLmN1bW1AZ21haWwuY29tCis6ZWRpdG9yMS1yZXZsYXN0OiAyMDEzLTA2LTEyCisKKworPT0gTkFNRSA9PQorc3lzbGludXggLSBJbnN0YWxsIFNZU0xJTlVYIHRvIGEgZmlsZSBzeXN0ZW0KKworCis9PSBTWU5PUFNJUyA9PQorW3ZlcnNlXQorKnN5c2xpbnV4KiBbJ09QVElPTlMnXSAnREVWSUNFJworKmV4dGxpbnV4KiBbJ09QVElPTlMnXSAnUEFUSCcKKypzeXNsaW51eCogWy1oIHwgLS1oZWxwIHwgLXYgfCAtLXZlcnNpb25dCisqZXh0bGludXgqIFstaCB8IC0taGVscCB8IC12IHwgLS12ZXJzaW9uXQorCisKKz09IERFU0NSSVBUSU9OID09CitJbnN0YWxsICpTWVNMSU5VWCogdG8gdGhlICdERVZJQ0UnLydQQVRIJywgYWx0ZXJpbmcgdGhlIGJvb3Qgc2VjdG9yIGFuZAoraW5zdGFsbGluZyB0aGUgJ2xkbGludXguc3lzJyBib290IGxvYWRlciBmaWxlLiAgRm9yIHRoZSBMaW51eCBpbnN0YWxsZXIKK2V4dGxpbnV4LCAnUEFUSCcgaXMgdGhlIGRlc2lyZWQgcGF0aCBmb3IgdGhlIGNvbnRyb2wgZmlsZXMgb24gYSBtb3VudGVkLAorc3VwcG9ydGVkIGZpbGUgc3lzdGVtIGFuZCBzZXRzIHRoZSBpbnN0YWxsLXRpbWUgd29ya2luZyBkaXJlY3RvcnkuICBGb3IKK2FsbCBvdGhlcnMsICdERVZJQ0UnIG11c3Qgc3BlY2lmeSBhIEZBVDEyL0ZBVDE2L0ZBVDMyIGZpbGUgc3lzdGVtLiAgRm9yCit0aGUgTGludXggaW5zdGFsbGVycyBzeXNsaW51eCBhbmQgc3lzbGludXgtbXRvb2xzLCAnREVWSUNFJyBzaG91bGQgYmUgYW4KK3VubW91bnRlZCBmaWxlIHN5c3RlbS4gIEZvciB0aGUgRE9TL1dpbjMyL1dpbjY0IGluc3RhbGxlcnMsICdERVZJQ0UnCitzaG91bGQgYmUgYSBkcml2ZSBsaWtlICdhOicgKGNhc2UgaW5zZW5zaXRpdmUpLgorCitGb3IgdmVyc2lvbnMgfjQuMDAgYW5kIGxhdGVyLCBlaXRoZXIgLWkvLS1pbnN0YWxsIG9yIC1VLy0tdXBkYXRlIG11c3QgYmUKK3NwZWNpZmllZCB1bmxlc3MgbW9kaWZ5aW5nIHRoZSBBRFYgb2YgYW4gZXhpc3RpbmcgaW5zdGFsbCAob3B0aW9ucwordGFnZ2VkIHdpdGggJ0FEVicpIG9yIHJlcXVlc3RpbmcgdGhlIGhlbHAvdXNhZ2Ugb3IgdmVyc2lvbiBpbmZvLCAuCisKK0lmLCBkdXJpbmcgYm9vdCwgdGhlIFNoaWZ0IG9yIEFsdCBrZXlzIGFyZSBoZWxkIGRvd24sIG9yIHRoZSBDYXBzIG9yCitTY3JvbGwgbG9ja3MgYXJlIHNldCwgKlN5c2xpbnV4KiB3aWxsIGRpc3BsYXkgYSAqbGlsbyooOCkgLXN0eWxlICJib290OiIKK3Byb21wdC4gVGhlIHVzZXIgY2FuIHRoZW4gdHlwZSBhIGtlcm5lbCBmaWxlIG5hbWUgZm9sbG93ZWQgYnkgYW55IGtlcm5lbAorcGFyYW1ldGVycy4gVGhlICpTeXNsaW51eCogYm9vdGxvYWRlciBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgdGhlCitrZXJuZWwgb3IgY29uZmlnIGZpbGVzIGluIGFkdmFuY2UuCisKKypTeXNsaW51eCogc3VwcG9ydHMgdGhlIGxvYWRpbmcgb2YgaW5pdGlhbCByYW1kaXNrcyAoaW5pdHJkKSBhbmQgdGhlCitiekltYWdlIGtlcm5lbCBmb3JtYXQuCisKK1BsZWFzZSBub3RlLCB0aGUgbGRsaW51eC5zeXMgYm9vdCBsb2FkZXIgZmlsZSBpcyBmbGFnZ2VkIGFzIGltbXV0YWJsZQorKHdoZXJlIGFwcGxpY2FibGUpIGFuZCBpcyBtb2RpZmllZCBhZnRlciBjb3B5aW5nIGluIHRvIGhlbHAgZW5zdXJlCitib290LXRpbWUgaW50ZWdyaXR5LiAgRmlsZSBzeXN0ZW1zIHdpdGggYSBzdWZmaWNpZW50bHkgbGFyZ2UgYm9vdCBsb2FkZXIKK3Jlc2VydmVkIGFyZWEsIGxpa2UgYnRyZnMsIHdpbGwgaGF2ZSBsZGxpbnV4LnN5cyBpbnN0YWxsZWQgdGhlcmUgcmF0aGVyCit0aGFuIGFzIGEgbm9ybWFsIGZpbGUuICBQcmlvciB0byB2ZXJzaW9uIDQuMDAsIGV4dGxpbnV4IHdvdWxkIGluc3RhbGwgYQorZmlsZSBleHRsaW51eC5zeXMgd2hpY2ggdmVyc2lvbnMgNC4wMCBhbmQgbGF0ZXIgaW5zdGFsbGVycyB3aWxsIHJlcGxhY2Ugd2l0aCBsZGxpbnV4LnN5cy4KKworCis9PSBPUFRJT05TID09CisvLyAiU2VlIi8iU2VlIGFsc28iIG5vdGVzIHNob3VsZCByZWZlcmVuY2UgbG9uZyBvcHRpb25zLgorPT09IFN0YW5kYWxvbmUgb3B0aW9ucyA9PT0KKyotaSosICotLWluc3RhbGwqOjoKKyh+NC4wMCspIEluc3RhbGwgU1lTTElOVVgsIHJlZ2FyZGxlc3Mgb2YgYW4gZXhpc3RpbmcgaW5zdGFsbC4KKworKi1VKiwgKi0tdXBkYXRlKjo6CisofjQuMDArKSBVcGRhdGUgYW4gZXhpc3RpbmcgU1lTTElOVVgvRVhUTElOVVggaW5zdGFsbC4gIElmIG5vIFN5c2xpbnV4Citib290IGxvYWRlciBpcyBwcmVzZW50LCByZXR1cm4gYW4gZXJyb3IuCisKKyotaCosICotLWhlbHAqOjoKK0Rpc3BsYXkgaGVscC91c2FnZSBpbmZvcm1hdGlvbi4KKworKi12KiwgKi0tdmVyc2lvbio6OgorRGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IGltbWVkaWF0ZWx5LgorCis9PT0gUmVndWxhciBPcHRpb25zID09PQorLy8gU29ydGVkIGdlbmVyYWxseSBieSBzaG9ydCBhcmd1bWVudAorKi1hKiwgKi0tYWN0aXZlKjo6CisoRE9TL1dpbjMyL1dpbjY0IE9OTFkpIE1hcmsgdGhlIGluc3RhbGwgdGFyZ2V0IGZpbGUgc3lzdGVtJ3MgcGFydGl0aW9uCithY3RpdmUuCisKKyotZCosICotLWRpcmVjdG9yeSogJ3N1YmRpcmVjdG9yeSc6OgorKE5vdCBuZWNlc3NhcnkgZm9yIGV4dGxpbnV4IGFzIGl0IGlzIGltcGxpZWQgYnkgJ1BBVEgnKSBJbnN0YWxsIHRoZQorKlNZU0xJTlVYKiBjb250cm9sIGZpbGVzIGluIGEgc3ViZGlyZWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisocmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IG9uIHRoZSBkZXZpY2UpLgorCisqLS1kZXZpY2UqICdERVZJQ0UnOjoKKyhleHRsaW51eCBPTkxZOyA0LjA2KykgRm9yY2UgdXNlIG9mIGEgc3BlY2lmaWMgYmxvY2sgZGV2aWNlIChleHBlcnRzCitvbmx5KS4KKworKi1mKiwgKi0tZm9yY2UqOjoKK0ZvcmNlIGluc3RhbGwgZXZlbiBpZiBpdCBhcHBlYXJzIHVuc2FmZS4gIEJlZm9yZSA0LjAwLCAtZiB3YXMgdXNlZCBmb3IKKy0tb2Zmc2V0IGluIHRoZSBMaW51eCBpbnN0YWxsZXJzLgorCisqLUgqLCAqLS1oZWFkcyogJ2hlYWQtY291bnQnOjoKK092ZXJyaWRlIHRoZSBkZXRlY3RlZCBudW1iZXIgb2YgaGVhZHMgZm9yIHRoZSBnZW9tZXRyeS4gIFNlZSBhbHNvCisqLS1zZWN0b3IqLgorCisqLW0qLCAqLS1tYnIqOgorKERPUy9XaW4zMi9XaW42NCBPTkxZKSBJbnN0YWxsIHRoZSByZWd1bGFyIFN5c2xpbnV4IE1CUiBjb2RlIHRvIHRoZSBNQlIuCisKKyotTSosICotLW1lbnUtc2F2ZSo6OgorKDQuMDArOyBBRFYpIFNldCB0aGUgbGFiZWwgdG8gc2VsZWN0IGFzIGRlZmF1bHQgb24gdGhlIG5leHQgYm9vdC4KKworKi1vKiwgKi0tb25jZSogJ2NvbW1hbmQnOjoKKyhBRFYpIERlY2xhcmUgYSBib290IGNvbW1hbmQgdG8gYmUgdHJpZWQgb24gdGhlIGZpcnN0IGJvb3Qgb25seS4gIFRoZQordXNlIG9mICotbyogZm9yIHRoZSBMaW51eCBpbnN0YWxsZXJzIHN5c2xpbnV4IG9yIHN5c2xpbnV4LW10b29scyBoYXMKK2JlZW4gZGVwcmVjYXRlZCBhcyBvZiBcfjQuMDAgYW5kIGlzIG5vIGxvbmdlciB2YWxpZCBhcyBvZiB+NC4wMi4KKworKi1PKiwgKi0tY2xlYXItb25jZSo6OgorQ2xlYXIgdGhlIGJvb3Qtb25jZSBjb21tYW5kLiAgU2VlIGFsc28gKi0tb25jZSouCisKKyotciosICotLXJhaWQqOjoKKyhBRFYpIFJBSUQgbW9kZS4gIElmIGJvb3QgZmFpbHMsIHRlbGwgdGhlIEJJT1MgdG8gYm9vdCB0aGUgbmV4dCBkZXZpY2UKK2luIHRoZSBib290IHNlcXVlbmNlICh1c3VhbGx5IHRoZSBuZXh0IGhhcmQgZGlzaykgaW5zdGVhZCBvZiBzdG9wcGluZword2l0aCBhbiBlcnJvciBtZXNzYWdlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIFJBSUQtMSBib290aW5nLgorCisqLS1yZXNldC1hZHYqOjoKKyhBRFYpIFJlc2V0IGF1eGlsbGlhcnkgZGF0YSB2ZWN0b3IuCisKKyotUyosICotLXNlY3RvcnMqICdzZWN0b3ItY291bnQnOjoKK092ZXJyaWRlIHRoZSBkZXRlY3RlZCBudW1iZXIgb2Ygc2VjdG9ycyBmb3IgdGhlIGdlb21ldHJ5LiAgU2VlIGFsc28KKyotLWhlYWQqLgorCisqLXMqLCAqLS1zdHVwaWQqOjoKK0luc3RhbGwgYSAic2FmZSwgc2xvdyBhbmQgc3R1cGlkIiB2ZXJzaW9uIG9mICpTWVNMSU5VWCouIFRoaXMgdmVyc2lvbgorbWF5IHdvcmsgb24gc29tZSB2ZXJ5IGJ1Z2d5IEJJT1NlcyBvbiB3aGljaCAqU1lTTElOVVgqIHdvdWxkIG90aGVyd2lzZQorZmFpbC4gSWYgeW91IGZpbmQgYSBtYWNoaW5lIG9uIHdoaWNoIHRoZSAtcyBvcHRpb24gaXMgcmVxdWlyZWQgdG8gbWFrZQoraXQgYm9vdCByZWxpYWJseSwgcGxlYXNlIHNlbmQgYXMgbXVjaCBpbmZvIGFib3V0IHlvdXIgbWFjaGluZSBhcyB5b3UKK2NhbiwgYW5kIGluY2x1ZGUgdGhlIGZhaWx1cmUgbW9kZS4KKworKi10KiwgKi0tb2Zmc2V0KiAnb2Zmc2V0Jzo6CisoTGludXggc3lzbGludXgvc3lzbGludXgtbXRvb2xzIE9OTFkpIEluZGljYXRlcyB0aGF0IHRoZSBmaWxlc3lzdGVtIGlzCithdCBhbiBvZmZzZXQgZnJvbSB0aGUgYmFzZSBvZiB0aGUgZGV2aWNlIG9yIGZpbGUuCisKKyoteiosICotLXppcGRyaXZlKgorQXNzdW1lIHppcGRyaXZlIGdlb21ldHJ5ICgnLS1oZWFkcyA2NCAtLXNlY3RvcnMgMzInKS4gIFNlZSBhbHNvICotLWhlYWQqCithbmQgKi0tc2VjdG9yKi4KKworCis9PSBFWEFNUExFUyA9PQorPT09IEJvb3RpbmcgRE9TID09PQorRm9yIGJvb3RpbmcgRE9TIGFuZCBvdGhlciBzaW1pbGFyIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVyZSBpcyBhbiBlYXN5CithbmQgZ2VuZXJhbGx5IHJlbGlhYmxlIHNvbHV0aW9uIHRvIHN1YnN0aXR1dGUgaW4gU1lTTElOVVggYXMgdGhlIHByaW1hcnkKK2Jvb3QgbG9hZGVyLgorCistIE1ha2UgYSBET1MtYm9vdGFibGUgZGlzazsgIFRoZSBmb2xsb3dpbmcgYXJlIHBvc3NpYmxlIGNvbW1hbmRzOgorCisJZm9ybWF0IGE6IC9zCisJc3lzIGE6CisKKy0gQ29weSB0aGUgRE9TIGJvb3Qgc2VjdG9yIG9mZiB1c2luZyBMaW51eCBvciBjb3B5YnMuY29tOgorCisJZGQgaWY9L2Rldi9mZDAgb2Y9ZG9zLmJzcyBicz01MTIgY291bnQ9MQorCWNvcHlicyBhOiBhOmRvcy5ic3MKKworLSBJbnN0YWxsIFNZU0xJTlVYIHVzaW5nIG9uZSBvZjoKKworCXN5c2xpbnV4IGE6CisJc3lzbGludXggL2Rldi9mZDAJCShiZWZvcmUgNC4wMCkKKwlzeXNsaW51eCAtaSAvZGV2L2ZkMAkJKDQuMDArKQorCistIEZvciBMaW51eCwgbW91bnQgdGhlIGRpc2sgYW5kIGNvcHkgdGhlIGRvcy5ic3MgdG8gdGhlIGRpc2s6CisKKwltb3VudCAtdCBtc2RvcyAvZGV2L2ZkMCAvbW50CisJY3AgZG9zLmJzcyAvbW50CisKKy0gQ29weSBhIExpbnV4IGtlcm5lbCBpbWFnZSBhbmQgaW5pdHJkIHBheWxvYWQgZmlsZXM6CisqTGludXg6Kjo6CisJY3Agdm1saW51eCAvbW50CisJY3AgaW5pdHJkLmd6IC9tbnQKKypET1MvV2luZG93czoqOjoKKwljb3B5IHZtbGludXggYToKKwljb3B5IGluaXRyZC5neiBhOgorCistIEZvciBMaW51eCwgdW1vdW50IHRoZSBkaXNrIChpZiBhcHBsaWNhYmxlKToKKworCXVtb3VudCAvbW50CisKKz09PSBNQlIgPT09CitJbiBvcmRlciB0byBib290IGZyb20gYSBoYXJkIGRpc2sgKG9yIGhhcmQgZGlzay1saWtlIGRldmljZSkgaW4gQklPUworbW9kZSwgYW4gYXBwcm9wcmlhdGUgTUJSIGJvb3QgYmxvY2sgbXVzdCBhbHNvIGJlIGluc3RhbGxlZCBpbiB0aGUgTUJSCisoZmlyc3Qgc2VjdG9yIG9yIDUxMiBieXRlcyBvZiB0aGUgZGlzayksIG9jY3VweWluZyBhdCBtb3N0IDQ0MCBieXRlcy4KKworKkRPUy9XaW5kb3dzOio6OgorSWYgdXNpbmcgRkRJU0ssIEZESVNLIG9yIGEgc2ltaWxhciBhcHBsaWNhdGlvbiBtdXN0IGFsc28gYmUgdXNlZCB0byBtYXJrCit0aGUgcGFydGl0aW9uIGFzIGFjdGl2ZS4KKysKKwlmZGlzayAvbWJyCisgICAgT1IKKwlzeXNsaW51eCAtbWEgYzoKKworKkxpbnV4Oio6OgorKworCWRkIGJzPTQ0MCBjb3VudD0xIGNvbnY9bm90cnVuYyBpZj1tYnIvbWJyLmJpbiBvZj0vZGV2L3NkYQorKworRm9yIGFsdG1ici5iaW4sIGFuIGVhc3kgd2F5IHRvIG92ZXJ3cml0ZSB0aGUgTUJSIGJvb3QgYmxvY2sgYW5kIHNwZWNpZnkKK3RoZSBwYXJ0aW9uIG51bWJlciBpczoKKysKKyAgcHJpbnRmICdcMScgfCBjYXQgYWx0bWJyLmJpbiAtIHwgZGQgYnM9NDQwIGNvdW50PTEgXAorICAgIGlmbGFnPWZ1bGxibG9jayBjb252PW5vdHJ1bmMgb2Y9L2Rldi9zZGEKKysKK05vdGU6IHVzaW5nICdjYXQnIGZvciB3cml0aW5nIHRoZSBNQlIgY2FuIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyBjYXVzZQorZGF0YSBsb3NzIG9yIG92ZXJ3cml0dGluZy4gIEZvciB0aGlzIHJlYXNvbiwgdXNpbmcgJ2RkJyBpcyByZWNvbW1lbmRlZAorZm9yIGFsbCBzaXR1YXRpb25zLgorCisvL1tGSVhNRV06IGFueSBjbGVhbiB3YXkgdG8gaGFuZGxlIHRoZSBhYm92ZSBsb25nIGNvbW1hbmQgZm9yIG1hbnBhZ2U/CisKKworPT0gU0VFIEFMU08gPT0KKypzeXNsaW51eC5jZmcqKDUpLCAqc3lzbGludXgtY2xpKigxKSwgKmxpbG8qKDgpLCAqa2V5dGFiLWxpbG8ucGwqKDgpLAorKmZkaXNrKig4KSwgKm1rZnMqKDgpLCAqc3VwZXJmb3JtYXQqKDEpLgorCisKKz09IEFVVEhPUiA9PQorVGhpcyBBc2NpaURvYyBkZXJpdmVkIGRvY3VtZW50IGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwKKypTWVNMSU5VWCogZG9jdW1lbnRhdGlvbiBieSB7YXV0aG9yfSA8e2F1dGhvci1lbWFpbH0+LiBUaGUgY29udmVyc2lvbiB0bworYSBtYW5wYWdlIHdhcyBtYWRlIGJ5IEFydGh1ciBLb3JuIDxhcnRodXJAa29ybi5jaD4uICBUaGUgY29udmVyc2lvbiB0bworYW4gQXNjaWlEb2Mgd2FzIG1hZGUgYnkge2VkaXRvcjF9IDx7ZWRpdG9yMS1lbWFpbH0+CisKKworPT0gQ09QWVJJR0hUID09CitDb3B5cmlnaHQgXChDKSAxOTk0LTIwMTIge2F1dGhvcn0uIEZyZWUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdmVyc2lvbiAyCisoR1BMdjIpIChvciwgYXQgeW91ciBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uKS4KZGlmZiAtLWdpdCBhL3V0aWxzL01ha2VmaWxlIGIvdXRpbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlNjI1OQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWxzL01ha2VmaWxlCkBAIC0wLDAgKzEsNzkgQEAKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIworIyMgICBDb3B5cmlnaHQgMTk5OC0yMDA4IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyMKKyMjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisjIyAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyMgU1lTTElOVVggdXRpbGl0aWVzCisjCisKK1ZQQVRIID0gJChTUkMpCitpbmNsdWRlICQoTUFLRURJUikvc3lzbGludXgubWsKKworQ0ZMQUdTICAgPSAkKEdDQ1dBUk4pIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IC1JJChTUkMpCitMREZMQUdTICA9IC1PMgorCitDX1RBUkdFVFMJID0gaXNvaHlicmlkIGdldGhvc3RpcCBtZW1kaXNrZmluZAorU0NSSVBUX1RBUkdFVFMJID0gbWtkaXNraW1hZ2UKK1NDUklQVF9UQVJHRVRTCSs9IGlzb2h5YnJpZC5wbCAgIyBhYm91dCB0byBiZSBvYnNvbGV0ZWQKK0FTSVMJCSA9ICQoYWRkcHJlZml4ICQoU1JDKS8sa2V5dGFiLWxpbG8gbHNzMTZ0b3BwbSBtZDVwYXNzIFwKKwkJICAgcHBtdG9sc3MxNiBzaGExcGFzcyBzeXNsaW51eDJhbnNpIHB4ZWxpbnV4LW9wdGlvbnMpCisKK1RBUkdFVFMgPSAkKENfVEFSR0VUUykgJChTQ1JJUFRfVEFSR0VUUykKKworSVNPSERQRlggPSAkKGFkZHByZWZpeCAkKE9CSikvLC4uL21ici9pc29oZHBmeC5iaW4gLi4vbWJyL2lzb2hkcGZ4X2YuYmluIFwKKwkgICAuLi9tYnIvaXNvaGRwZnhfYy5iaW4gXAorCSAgIC4uL21ici9pc29oZHBweC5iaW4gLi4vbWJyL2lzb2hkcHB4X2YuYmluIC4uL21ici9pc29oZHBweF9jLmJpbikKKworYWxsOiAkKFRBUkdFVFMpCisKKyUubzogJS5jCisJJChDQykgJChVTUFLRURFUFMpICQoQ0ZMQUdTKSAtYyAtbyAkQCAkPAorCitta2Rpc2tpbWFnZTogbWtkaXNraW1hZ2UuaW4gLi4vbWJyL21ici5iaW4gYmluMmhleC5wbAorCSQoUEVSTCkgJChTUkMpL2JpbjJoZXgucGwgPCAkKE9CSikvLi4vbWJyL21ici5iaW4gfCBjYXQgJChTUkMpL21rZGlza2ltYWdlLmluIC0gPiAkQAorCWNobW9kIGEreCAkQAorCisjIFdvcmtzIG9uIGFueXRoaW5nIHdpdGggYSBQZXJsIGludGVycHJldGVyLi4uCitpc29oeWJyaWQucGw6IGlzb2h5YnJpZC5pbiAkKElTT0hEUEZYKSBiaW4yaGV4LnBsCisJY3AgLWYgJChTUkMpL2lzb2h5YnJpZC5pbiAkQAorCWZvciBmIGluICQoSVNPSERQRlgpIDsgZG8gJChQRVJMKSAkKFNSQykvYmluMmhleC5wbCA8ICQkZiA+PiAkQCA7IGRvbmUKKwljaG1vZCBhK3ggJEAKKworaXNvaGRwZnguYzogJChJU09IRFBGWCkgaXNvaGRwZnhhcnJheS5wbAorCSQoUEVSTCkgJChTUkMpL2lzb2hkcGZ4YXJyYXkucGwgJChJU09IRFBGWCkgPiAkQAorCitpc29oeWJyaWQ6IGlzb2h5YnJpZC5vIGlzb2hkcGZ4Lm8KKwkkKENDKSAkKExERkxBR1MpIC1vICRAICReIC1sdXVpZAorCitnZXRob3N0aXA6IGdldGhvc3RpcC5vCisJJChDQykgJChMREZMQUdTKSAtbyAkQCAkXgorCittZW1kaXNrZmluZDogbWVtZGlza2ZpbmQubworCSQoQ0MpICQoTERGTEFHUykgLW8gJEAgJF4KKwordGlkeSBkaXN0OgorCXJtIC1mICoubyAuKi5kIGlzb2hkcGZ4LmMKKworY2xlYW46IHRpZHkKKwlybSAtZiAkKFRBUkdFVFMpCisKK3Nwb3RsZXNzOiBjbGVhbgorCitpbnN0YWxsZXI6IGFsbAorCitpbnN0YWxsOiBpbnN0YWxsZXIKKwlta2RpciAtbSA3NTUgLXAgJChJTlNUQUxMUk9PVCkkKEJJTkRJUikKKwlpbnN0YWxsIC1tIDc1NSAkKFRBUkdFVFMpICQoQVNJUykgJChJTlNUQUxMUk9PVCkkKEJJTkRJUikKKworc3RyaXA6CisJJChTVFJJUCkgJChDX1RBUkdFVFMpCisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL3V0aWxzL2JpbjJoZXgucGwgYi91dGlscy9iaW4yaGV4LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGI2OTkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9iaW4yaGV4LnBsCkBAIC0wLDAgKzEsNDggQEAKKyMhL3Vzci9iaW4vcGVybAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAzLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIworIyMgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyMgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorIyMgICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisjIyAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorIyMgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyMjICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorIyMgICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyMjICAgY29uZGl0aW9uczoKKyMjCisjIyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisjIyAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIyMKKyMjICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworIyMgICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyMgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorIyMgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyMjICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisjIyAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyMjICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V2YWwgeyB1c2UgYnl0ZXM7IH07CitldmFsIHsgYmlubW9kZSBTVERJTjsgfTsKKworJGxlbiA9IDA7Cit3aGlsZSAoIHJlYWQoU1RESU4sJGNoLDEpICkgeworICAgICRjYyA9IG9yZCgkY2gpOworICAgICRzID0gc3ByaW50ZigiJXgiLCAkY2MpOworICAgIHByaW50ICRzOworICAgICRsZW4gKz0gbGVuZ3RoKCRzKTsKKyAgICBpZiAoICRsZW4gPiA3MiApIHsKKwlwcmludCAiXG4iOworCSRsZW4gPSAwOworICAgIH0gZWxzZSB7CisJcHJpbnQgIiAiOworCSRsZW4rKzsKKyAgICB9Cit9CitwcmludCAiXG4iIGlmICggJGxlbiApOworcHJpbnQgIipcbiI7CitleGl0IDA7CmRpZmYgLS1naXQgYS91dGlscy9nZXRob3N0aXAuYyBiL3V0aWxzL2dldGhvc3RpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjg3NTcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9nZXRob3N0aXAuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZ2V0aG9zdGlwLmMKKyAqCisgKiBTbWFsbCBwcm9ncmFtIHRvIHVzZSBnZXRob3N0YnluYW1lKCkgdG8gcHJpbnQgb3V0IGEgaG9zdG5hbWUgaW4KKyAqIGhleCBhbmQvb3IgZG90dGVkLXF1YWQgbm90YXRpb24KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNleGl0cy5oPgorI2RlZmluZSBfR05VX1NPVVJDRQkJLyogRm9yIGdldG9wdF9sb25nICovCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK2NvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworICAgIHsiaGV4YWRlY2ltYWwiLCAwLCBOVUxMLCAneCd9LAorICAgIHsiZGVjaW1hbCIsIDAsIE5VTEwsICdkJ30sCisgICAgeyJkb3R0ZWQtcXVhZCIsIDAsIE5VTEwsICdkJ30sCisgICAgeyJmdWxsLW91dHB1dCIsIDAsIE5VTEwsICdmJ30sCisgICAgeyJuYW1lIiwgMCwgTlVMTCwgJ24nfSwKKyAgICB7ImhlbHAiLCAwLCBOVUxMLCAnaCd9LAorICAgIHtOVUxMLCAwLCBOVUxMLCAwfQorfTsKKworY29uc3QgY2hhciAqcHJvZ3JhbTsKKwordm9pZCB1c2FnZShpbnQgZXhpdF9jb2RlKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZHhuZl0gaG9zdG5hbWUvaXAuLi5cbiIsIHByb2dyYW0pOworICAgIGV4aXQoZXhpdF9jb2RlKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgb3B0OworICAgIGludCBvdXRwdXQgPSAwOworICAgIGludCBpOworICAgIGNoYXIgKnNlcDsKKyAgICBpbnQgZXJyID0gMDsKKworICAgIHN0cnVjdCBob3N0ZW50ICpob3N0OworCisgICAgcHJvZ3JhbSA9IGFyZ3ZbMF07CisKKyAgICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJkeGZuaCIsIG9wdGlvbnMsIE5VTEwpKSAhPSAtMSkgeworCXN3aXRjaCAob3B0KSB7CisJY2FzZSAnZCc6CisJICAgIG91dHB1dCB8PSAyOwkvKiBEZWNpbWFsIG91dHB1dCAqLworCSAgICBicmVhazsKKwljYXNlICd4JzoKKwkgICAgb3V0cHV0IHw9IDQ7CS8qIEhleGFkZWNpbWFsIG91dHB1dCAqLworCSAgICBicmVhazsKKwljYXNlICduJzoKKwkgICAgb3V0cHV0IHw9IDE7CS8qIENhbm9uaWNhbCBuYW1lIG91dHB1dCAqLworCSAgICBicmVhazsKKwljYXNlICdmJzoKKwkgICAgb3V0cHV0ID0gNzsJCS8qIEZ1bGwgb3V0cHV0ICovCisJICAgIGJyZWFrOworCWNhc2UgJ2gnOgorCSAgICB1c2FnZSgwKTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgdXNhZ2UoRVhfVVNBR0UpOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA9PSBhcmdjKQorCXVzYWdlKEVYX1VTQUdFKTsKKworICAgIGlmIChvdXRwdXQgPT0gMCkKKwlvdXRwdXQgPSA3OwkJLyogRGVmYXVsdCBvdXRwdXQgKi8KKworICAgIGZvciAoaSA9IG9wdGluZDsgaSA8IGFyZ2M7IGkrKykgeworCXNlcCA9ICIiOworCWhvc3QgPSBnZXRob3N0YnluYW1lKGFyZ3ZbaV0pOworCWlmICghaG9zdCkgeworCSAgICBoZXJyb3IoYXJndltpXSk7CisJICAgIGVyciA9IDE7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmIChob3N0LT5oX2FkZHJ0eXBlICE9IEFGX0lORVQgfHwgaG9zdC0+aF9sZW5ndGggIT0gNCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBObyBJUHY0IGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIG5hbWVcbiIsCisJCSAgICBhcmd2W2ldKTsKKwkgICAgZXJyID0gMTsKKwkgICAgY29udGludWU7CisJfQorCisJaWYgKG91dHB1dCAmIDEpIHsKKwkgICAgcHJpbnRmKCIlcyVzIiwgc2VwLCBob3N0LT5oX25hbWUpOworCSAgICBzZXAgPSAiICI7CisJfQorCisJaWYgKG91dHB1dCAmIDIpIHsKKwkgICAgcHJpbnRmKCIlcyV1LiV1LiV1LiV1Iiwgc2VwLAorCQkgICAoKHVuc2lnbmVkIGNoYXIgKilob3N0LT5oX2FkZHIpWzBdLAorCQkgICAoKHVuc2lnbmVkIGNoYXIgKilob3N0LT5oX2FkZHIpWzFdLAorCQkgICAoKHVuc2lnbmVkIGNoYXIgKilob3N0LT5oX2FkZHIpWzJdLAorCQkgICAoKHVuc2lnbmVkIGNoYXIgKilob3N0LT5oX2FkZHIpWzNdKTsKKwkgICAgc2VwID0gIiAiOworCX0KKworCWlmIChvdXRwdXQgJiA0KSB7CisJICAgIHByaW50ZigiJXMlMDJYJTAyWCUwMlglMDJYIiwgc2VwLAorCQkgICAoKHVuc2lnbmVkIGNoYXIgKilob3N0LT5oX2FkZHIpWzBdLAorCQkgICAoKHVuc2lnbmVkIGNoYXIgKilob3N0LT5oX2FkZHIpWzFdLAorCQkgICAoKHVuc2lnbmVkIGNoYXIgKilob3N0LT5oX2FkZHIpWzJdLAorCQkgICAoKHVuc2lnbmVkIGNoYXIgKilob3N0LT5oX2FkZHIpWzNdKTsKKwkgICAgc2VwID0gIiAiOworCX0KKworCXB1dGNoYXIoJ1xuJyk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3V0aWxzL2lzb2hkcGZ4YXJyYXkucGwgYi91dGlscy9pc29oZHBmeGFycmF5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzcxYmYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9pc29oZHBmeGFycmF5LnBsCkBAIC0wLDAgKzEsNTcgQEAKKyMhL3Vzci9iaW4vcGVybAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAoQykgMjAxMCBQIEogUCA8cGoucGFuZGl0QHlhaG9vLmNvLmluPgorIyMKKyMjICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyMjICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyMjICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorIyMgICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyMjICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIyAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyMjICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisjIyAgIGNvbmRpdGlvbnM6CisjIworIyMgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorIyMgICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMjCisjIyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyMgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyMjICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMjICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyMjICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisjIyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworIyMgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisjIyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitiaW5tb2RlIFNURElOOworCitwcmludCAiI2luY2x1ZGUgPGludHR5cGVzLmg+XG4iOworcHJpbnQgIiNpbmNsdWRlIFwiaXNvaHlicmlkLmhcIlxuIjsKK3ByaW50ICJcbiI7CitwcmludCAidWludDhfdCBpc29oZHBmeFtdW01CUlNJWkVdID1cbiI7CitwcmludCAie1xuIjsKKworZm9yZWFjaCBteSAkZmlsZSAoQEFSR1YpIHsKKyAgICBteSAkbGVuID0gMDsKKyAgICBteSAkY2g7CisKKyAgICBvcGVuKElOLCAnPCcsICRmaWxlKSBvciBkaWUgIiQwOiAkZmlsZTogJCFcbiI7CisgICAgcHJpbnRmKCIgICAge1xuIik7CisgICAgd2hpbGUgKHJlYWQoSU4sICRjaCwgMSkpCisgICAgeworCXByaW50ZigiXHQvKiAweCUwM3ggKi8gIiwgJGxlbikgaWYgKCEoJGxlbiAlIDgpKTsKKwlwcmludGYoIjB4JTAyeCwiLCBvcmQoJGNoKSk7CisJJGxlbisrOworICAgIAorCXByaW50KCJcbiIpIGlmICghKCRsZW4gJSA4KSk7CisgICAgfQorICAgIHByaW50ICIgICAgfSxcbiI7CisgICAgY2xvc2UoSU4pOworfQorcHJpbnQgIn07XG4iOwpkaWZmIC0tZ2l0IGEvdXRpbHMvaXNvaHlicmlkLmMgYi91dGlscy9pc29oeWJyaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTIwMzIxCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbHMvaXNvaHlicmlkLmMKQEAgLTAsMCArMSwxMjAwIEBACisvKgorICogaXNvaHlicmlkLmM6IFBvc3QgcHJvY2VzcyBhbiBJU08gOTY2MCBpbWFnZSBnZW5lcmF0ZWQgd2l0aCBta2lzb2ZzIG9yCisgKiBnZW5pc29pbWFnZSB0byBhbGxvdyAtIGh5YnJpZCBib290aW5nIC0gYXMgYSBDRC1ST00gb3IgYXMgYSBoYXJkCisgKiBkaXNrLgorICoKKyAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFBlcmwgc2NyaXB0IHdyaXR0ZW4gYnkgSC4gUGV0ZXIgQW52aW4uIFRoZQorICogcmV3cml0ZSBpbiBDIGlzIHRvIGF2b2lkIGRlcGVuZGVuY3kgb24gUGVybCBvbiBhIHN5c3RlbSB1bmRlciBpbnN0YWxsYXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFAgSiBQIDxwai5wYW5kaXRAeWFob28uY28uaW4+CisgKgorICogaXNvaHlicmlkIGlzIGEgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBsaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogdmVyc2lvbi4KKyAqCisgKiBpc29oeWJyaWQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggaXNvaHlicmlkOyBpZiBub3QsIHNlZTogPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcz4uCisgKgorICovCisKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKyNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV1aWQvdXVpZC5oPgorCisjaW5jbHVkZSAiaXNvaHlicmlkLmgiCisKK2NoYXIgKnByb2cgPSBOVUxMOworZXh0ZXJuIGludCBvcHRlcnIsIG9wdGluZDsKK3N0cnVjdCBzdGF0IGlzb3N0YXQ7Cit1bnNpZ25lZCBpbnQgcGFkZGluZyA9IDA7CisKK3V1aWRfdCBkaXNrX3V1aWQsIHBhcnRfdXVpZCwgaXNvX3V1aWQ7CisKK3VpbnQ4X3QgbW9kZSA9IDA7CitlbnVtIHsgVkVSQk9TRSA9IDEgLCBFRkkgPSAyICwgTUFDID0gNH07CisKKy8qIHVzZXIgb3B0aW9ucyAqLwordWludDE2X3QgaGVhZCA9IDY0OyAgICAgICAgICAgICAvKiAxIDw9IGhlYWQgPD0gMjU2ICovCit1aW50OF90IHNlY3RvciA9IDMyOyAgICAgICAgICAgIC8qIDEgPD0gc2VjdG9yIDw9IDYzICAqLworCit1aW50OF90IGVudHJ5ID0gMDsgICAgICAgICAgICAgIC8qIHBhcnRpdGlvbiBudW1iZXI6IDEgPD0gZW50cnkgPD0gNCAqLwordWludDhfdCBvZmZzZXQgPSAwOyAgICAgICAgICAgICAvKiBwYXJ0aXRpb24gb2Zmc2V0OiAwIDw9IG9mZnNldCA8PSA2NCAqLwordWludDE2X3QgdHlwZSA9IDB4MTc7ICAgICAgICAgICAvKiBwYXJ0aXRpb24gdHlwZTogMCA8PSB0eXBlIDw9IDI1NSAqLwordWludDMyX3QgaWQgPSAwOyAgICAgICAgICAgICAgICAvKiBNQlI6IDAgPD0gaWQgPD0gMHhGRkZGRkZGRig0Mjk0OTY3Mjk2KSAqLworCit1aW50OF90IGhkMCA9IDA7ICAgICAgICAgICAgICAgIC8qIDAgPD0gaGQwIDw9IDIgKi8KK3VpbnQ4X3QgcGFydG9rID0gMDsgICAgICAgICAgICAgLyogMCA8PSBwYXJ0b2sgPD0gMSAqLworCitjaGFyIG1icl90ZW1wbGF0ZV9wYXRoWzEwMjRdID0gezB9OyAgIC8qIFBhdGggdG8gTUJSIHRlbXBsYXRlICovCisKK3VpbnQxNl90IHZlWzE2XTsKK3VpbnQzMl90IGNhdG9mZnNldCA9IDA7Cit1aW50MzJfdCBjID0gMCwgY2MgPSAwLCBjcyA9IDA7CisKK3VpbnQzMl90IHBzaXplID0gMCwgaXNvc2l6ZSA9IDA7CisKKy8qIGJvb3QgY2F0YWxvZ3VlIHBhcmFtZXRlcnMgKi8KK3VpbnQzMl90IGRlX2xiYSA9IDA7Cit1aW50MTZfdCBkZV9zZWcgPSAwLCBkZV9jb3VudCA9IDAsIGRlX21iejIgPSAwOwordWludDhfdCBkZV9ib290ID0gMCwgZGVfbWVkaWEgPSAwLCBkZV9zeXMgPSAwLCBkZV9tYnoxID0gMDsKK3VpbnQzMl90IGVmaV9sYmEgPSAwLCBtYWNfbGJhID0gMDsKK3VpbnQxNl90IGVmaV9jb3VudCA9IDAsIG1hY19jb3VudCA9IDA7Cit1aW50OF90IGVmaV9ib290ID0gMCwgZWZpX21lZGlhID0gMCwgZWZpX3N5cyA9IDA7CisKK2ludCBhcG1fcGFydHMgPSAzOworCit1aW50OF90IGFmcF9oZWFkZXJbXSA9IHsgMHg0NSwgMHg1MiwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCit1dWlkX3QgZWZpX3N5c3RlbV9wYXJ0aXRpb24gPSB7MHhDMSwgMHgyQSwgMHg3MywgMHgyOCwgMHhGOCwgMHgxRiwgMHgxMSwgMHhEMiwgMHhCQSwgMHg0QiwgMHgwMCwgMHhBMCwgMHhDOSwgMHgzRSwgMHhDOSwgMHgzQn07Cit1dWlkX3QgYmFzaWNfcGFydGl0aW9uID0gezB4RUIsMHhEMCwweEEwLDB4QTIsMHhCOSwweEU1LDB4NDQsMHgzMywweDg3LDB4QzAsMHg2OCwweEI2LDB4QjcsMHgyNiwweDk5LDB4Qzd9OwordXVpZF90IGhmc19wYXJ0aXRpb24gPSB7MHg0OCwgMHg0NiwgMHg1MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHhBQSwgMHhBQSwgMHgxMSwgMHgwMCwgMHgzMCwgMHg2NSwgMHg0MywgMHhFQywgMHhBQ307CisKK3VpbnQzMl90IGNyY190YWJbMjU2XSA9Cit7CisgICAgMCwgMHg3NzA3MzA5NiwgMHhFRTBFNjEyQywgMHg5OTA5NTFCQSwKKyAgICAweDA3NkRDNDE5LCAweDcwNkFGNDhGLCAweEU5NjNBNTM1LCAweDlFNjQ5NUEzLAorICAgIDB4MEVEQjg4MzIsIDB4NzlEQ0I4QTQsIDB4RTBENUU5MUUsIDB4OTdEMkQ5ODgsCisgICAgMHgwOUI2NEMyQiwgMHg3RUIxN0NCRCwgMHhFN0I4MkQwNywgMHg5MEJGMUQ5MSwKKyAgICAweDFEQjcxMDY0LCAweDZBQjAyMEYyLCAweEYzQjk3MTQ4LCAweDg0QkU0MURFLAorICAgIDB4MUFEQUQ0N0QsIDB4NkREREU0RUIsIDB4RjRENEI1NTEsIDB4ODNEMzg1QzcsCisgICAgMHgxMzZDOTg1NiwgMHg2NDZCQThDMCwgMHhGRDYyRjk3QSwgMHg4QTY1QzlFQywKKyAgICAweDE0MDE1QzRGLCAweDYzMDY2Q0Q5LCAweEZBMEYzRDYzLCAweDhEMDgwREY1LAorICAgIDB4M0I2RTIwQzgsIDB4NEM2OTEwNUUsIDB4RDU2MDQxRTQsIDB4QTI2NzcxNzIsCisgICAgMHgzQzAzRTREMSwgMHg0QjA0RDQ0NywgMHhEMjBEODVGRCwgMHhBNTBBQjU2QiwKKyAgICAweDM1QjVBOEZBLCAweDQyQjI5ODZDLCAweERCQkJDOUQ2LCAweEFDQkNGOTQwLAorICAgIDB4MzJEODZDRTMsIDB4NDVERjVDNzUsIDB4RENENjBEQ0YsIDB4QUJEMTNENTksCisgICAgMHgyNkQ5MzBBQywgMHg1MURFMDAzQSwgMHhDOEQ3NTE4MCwgMHhCRkQwNjExNiwKKyAgICAweDIxQjRGNEI1LCAweDU2QjNDNDIzLCAweENGQkE5NTk5LCAweEI4QkRBNTBGLAorICAgIDB4MjgwMkI4OUUsIDB4NUYwNTg4MDgsIDB4QzYwQ0Q5QjIsIDB4QjEwQkU5MjQsCisgICAgMHgyRjZGN0M4NywgMHg1ODY4NEMxMSwgMHhDMTYxMURBQiwgMHhCNjY2MkQzRCwKKyAgICAweDc2REM0MTkwLCAweDAxREI3MTA2LCAweDk4RDIyMEJDLCAweEVGRDUxMDJBLAorICAgIDB4NzFCMTg1ODksIDB4MDZCNkI1MUYsIDB4OUZCRkU0QTUsIDB4RThCOEQ0MzMsCisgICAgMHg3ODA3QzlBMiwgMHgwRjAwRjkzNCwgMHg5NjA5QTg4RSwgMHhFMTBFOTgxOCwKKyAgICAweDdGNkEwREJCLCAweDA4NkQzRDJELCAweDkxNjQ2Qzk3LCAweEU2NjM1QzAxLAorICAgIDB4NkI2QjUxRjQsIDB4MUM2QzYxNjIsIDB4ODU2NTMwRDgsIDB4RjI2MjAwNEUsCisgICAgMHg2QzA2OTVFRCwgMHgxQjAxQTU3QiwgMHg4MjA4RjRDMSwgMHhGNTBGQzQ1NywKKyAgICAweDY1QjBEOUM2LCAweDEyQjdFOTUwLCAweDhCQkVCOEVBLCAweEZDQjk4ODdDLAorICAgIDB4NjJERDFEREYsIDB4MTVEQTJENDksIDB4OENEMzdDRjMsIDB4RkJENDRDNjUsCisgICAgMHg0REIyNjE1OCwgMHgzQUI1NTFDRSwgMHhBM0JDMDA3NCwgMHhENEJCMzBFMiwKKyAgICAweDRBREZBNTQxLCAweDNERDg5NUQ3LCAweEE0RDFDNDZELCAweEQzRDZGNEZCLAorICAgIDB4NDM2OUU5NkEsIDB4MzQ2RUQ5RkMsIDB4QUQ2Nzg4NDYsIDB4REE2MEI4RDAsCisgICAgMHg0NDA0MkQ3MywgMHgzMzAzMURFNSwgMHhBQTBBNEM1RiwgMHhERDBEN0NDOSwKKyAgICAweDUwMDU3MTNDLCAweDI3MDI0MUFBLCAweEJFMEIxMDEwLCAweEM5MEMyMDg2LAorICAgIDB4NTc2OEI1MjUsIDB4MjA2Rjg1QjMsIDB4Qjk2NkQ0MDksIDB4Q0U2MUU0OUYsCisgICAgMHg1RURFRjkwRSwgMHgyOUQ5Qzk5OCwgMHhCMEQwOTgyMiwgMHhDN0Q3QThCNCwKKyAgICAweDU5QjMzRDE3LCAweDJFQjQwRDgxLCAweEI3QkQ1QzNCLCAweEMwQkE2Q0FELAorICAgIDB4RURCODgzMjAsIDB4OUFCRkIzQjYsIDB4MDNCNkUyMEMsIDB4NzRCMUQyOUEsCisgICAgMHhFQUQ1NDczOSwgMHg5REQyNzdBRiwgMHgwNERCMjYxNSwgMHg3M0RDMTY4MywKKyAgICAweEUzNjMwQjEyLCAweDk0NjQzQjg0LCAweDBENkQ2QTNFLCAweDdBNkE1QUE4LAorICAgIDB4RTQwRUNGMEIsIDB4OTMwOUZGOUQsIDB4MEEwMEFFMjcsIDB4N0QwNzlFQjEsCisgICAgMHhGMDBGOTM0NCwgMHg4NzA4QTNEMiwgMHgxRTAxRjI2OCwgMHg2OTA2QzJGRSwKKyAgICAweEY3NjI1NzVELCAweDgwNjU2N0NCLCAweDE5NkMzNjcxLCAweDZFNkIwNkU3LAorICAgIDB4RkVENDFCNzYsIDB4ODlEMzJCRTAsIDB4MTBEQTdBNUEsIDB4NjdERDRBQ0MsCisgICAgMHhGOUI5REY2RiwgMHg4RUJFRUZGOSwgMHgxN0I3QkU0MywgMHg2MEIwOEVENSwKKyAgICAweEQ2RDZBM0U4LCAweEExRDE5MzdFLCAweDM4RDhDMkM0LCAweDRGREZGMjUyLAorICAgIDB4RDFCQjY3RjEsIDB4QTZCQzU3NjcsIDB4M0ZCNTA2REQsIDB4NDhCMjM2NEIsCisgICAgMHhEODBEMkJEQSwgMHhBRjBBMUI0QywgMHgzNjAzNEFGNiwgMHg0MTA0N0E2MCwKKyAgICAweERGNjBFRkMzLCAweEE4NjdERjU1LCAweDMxNkU4RUVGLCAweDQ2NjlCRTc5LAorICAgIDB4Q0I2MUIzOEMsIDB4QkM2NjgzMUEsIDB4MjU2RkQyQTAsIDB4NTI2OEUyMzYsCisgICAgMHhDQzBDNzc5NSwgMHhCQjBCNDcwMywgMHgyMjAyMTZCOSwgMHg1NTA1MjYyRiwKKyAgICAweEM1QkEzQkJFLCAweEIyQkQwQjI4LCAweDJCQjQ1QTkyLCAweDVDQjM2QTA0LAorICAgIDB4QzJEN0ZGQTcsIDB4QjVEMENGMzEsIDB4MkNEOTlFOEIsIDB4NUJERUFFMUQsCisgICAgMHg5QjY0QzJCMCwgMHhFQzYzRjIyNiwgMHg3NTZBQTM5QywgMHgwMjZEOTMwQSwKKyAgICAweDlDMDkwNkE5LCAweEVCMEUzNjNGLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLAorICAgIDB4OTVCRjRBODIsIDB4RTJCODdBMTQsIDB4N0JCMTJCQUUsIDB4MENCNjFCMzgsCisgICAgMHg5MkQyOEU5QiwgMHhFNUQ1QkUwRCwgMHg3Q0RDRUZCNywgMHgwQkRCREYyMSwKKyAgICAweDg2RDNEMkQ0LCAweEYxRDRFMjQyLCAweDY4RERCM0Y4LCAweDFGREE4MzZFLAorICAgIDB4ODFCRTE2Q0QsIDB4RjZCOTI2NUIsIDB4NkZCMDc3RTEsIDB4MThCNzQ3NzcsCisgICAgMHg4ODA4NUFFNiwgMHhGRjBGNkE3MCwgMHg2NjA2M0JDQSwgMHgxMTAxMEI1QywKKyAgICAweDhGNjU5RUZGLCAweEY4NjJBRTY5LCAweDYxNkJGRkQzLCAweDE2NkNDRjQ1LAorICAgIDB4QTAwQUUyNzgsIDB4RDcwREQyRUUsIDB4NEUwNDgzNTQsIDB4MzkwM0IzQzIsCisgICAgMHhBNzY3MjY2MSwgMHhEMDYwMTZGNywgMHg0OTY5NDc0RCwgMHgzRTZFNzdEQiwKKyAgICAweEFFRDE2QTRBLCAweEQ5RDY1QURDLCAweDQwREYwQjY2LCAweDM3RDgzQkYwLAorICAgIDB4QTlCQ0FFNTMsIDB4REVCQjlFQzUsIDB4NDdCMkNGN0YsIDB4MzBCNUZGRTksCisgICAgMHhCREJERjIxQywgMHhDQUJBQzI4QSwgMHg1M0IzOTMzMCwgMHgyNEI0QTNBNiwKKyAgICAweEJBRDAzNjA1LCAweENERDcwNjkzLCAweDU0REU1NzI5LCAweDIzRDk2N0JGLAorICAgIDB4QjM2NjdBMkUsIDB4QzQ2MTRBQjgsIDB4NUQ2ODFCMDIsIDB4MkE2RjJCOTQsCisgICAgMHhCNDBCQkUzNywgMHhDMzBDOEVBMSwgMHg1QTA1REYxQiwgMHgyRDAyRUY4RAorfTsKKworc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgeworICAgIHVpbnQ4X3QgaWdub3JlIFs4MF07CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50OF90IGlnbm9yZTIgWzQ0XTsKKyAgICB1aW50MTZfdCBibG9ja19zaXplOworfTsKKworc3RydWN0IGdwdF9oZWFkZXIgeworICAgIHVpbnQ2NF90IHNpZ25hdHVyZTsKKyAgICB1aW50MzJfdCByZXZpc2lvbjsKKyAgICB1aW50MzJfdCBoZWFkZXJTaXplOworICAgIHVpbnQzMl90IGhlYWRlckNSQzsKKyAgICB1aW50MzJfdCByZXNlcnZlZDsKKyAgICB1aW50NjRfdCBjdXJyZW50TEJBOworICAgIHVpbnQ2NF90IGJhY2t1cExCQTsKKyAgICB1aW50NjRfdCBmaXJzdFVzYWJsZUxCQTsKKyAgICB1aW50NjRfdCBsYXN0VXNhYmxlTEJBOworICAgIHV1aWRfdCBkaXNrR1VJRDsKKyAgICB1aW50NjRfdCBwYXJ0aXRpb25FbnRyaWVzTEJBOworICAgIHVpbnQzMl90IG51bVBhcnRzOworICAgIHVpbnQzMl90IHNpemVPZlBhcnRpdGlvbkVudHJpZXM7CisgICAgdWludDMyX3QgcGFydGl0aW9uRW50cmllc0NSQzsKKyAgICB1aW50OF90IHJlc2VydmVkMls0MjBdOworfTsKKworc3RydWN0IGdwdF9wYXJ0X2hlYWRlciB7CisgICAgdXVpZF90IHBhcnRUeXBlR1VJRDsKKyAgICB1dWlkX3QgcGFydEdVSUQ7CisgICAgdWludDY0X3QgZmlyc3RMQkE7CisgICAgdWludDY0X3QgbGFzdExCQTsKKyAgICB1aW50NjRfdCBhdHRyaWJ1dGVzOworICAgIHVpbnQxNl90IG5hbWVbMzZdOworfTsKKworI2RlZmluZSBBUE1fT0ZGU0VUIDIwNDgKKworc3RydWN0IGFwcGxlX3BhcnRfaGVhZGVyIHsKKyAgICB1aW50MTZfdCAgICAgICAgc2lnbmF0dXJlOyAgICAgIC8qIGV4cGVjdGVkIHRvIGJlIE1BQ19QQVJUSVRJT05fTUFHSUMgKi8KKyAgICB1aW50MTZfdCAgICAgICAgcmVzMTsKKyAgICB1aW50MzJfdCAgICAgICAgbWFwX2NvdW50OyAgICAgIC8qICMgYmxvY2tzIGluIHBhcnRpdGlvbiBtYXAgKi8KKyAgICB1aW50MzJfdCAgICAgICAgc3RhcnRfYmxvY2s7ICAgIC8qIGFic29sdXRlIHN0YXJ0aW5nIGJsb2NrICMgb2YgcGFydGl0aW9uICovCisgICAgdWludDMyX3QgICAgICAgIGJsb2NrX2NvdW50OyAgICAvKiBudW1iZXIgb2YgYmxvY2tzIGluIHBhcnRpdGlvbiAqLworICAgIGNoYXIgICAgICAgICAgICBuYW1lWzMyXTsgICAgICAgLyogcGFydGl0aW9uIG5hbWUgKi8KKyAgICBjaGFyICAgICAgICAgICAgdHlwZVszMl07ICAgICAgIC8qIHN0cmluZyB0eXBlIGRlc2NyaXB0aW9uICovCisgICAgdWludDMyX3QgICAgICAgIGRhdGFfc3RhcnQ7ICAgICAvKiByZWwgYmxvY2sgIyBvZiBmaXJzdCBkYXRhIGJsb2NrICovCisgICAgdWludDMyX3QgICAgICAgIGRhdGFfY291bnQ7ICAgICAvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgKi8KKyAgICB1aW50MzJfdCAgICAgICAgc3RhdHVzOyAgICAgICAgIC8qIHBhcnRpdGlvbiBzdGF0dXMgYml0cyAqLworICAgIHVpbnQzMl90ICAgICAgICBib290X3N0YXJ0OworICAgIHVpbnQzMl90ICAgICAgICBib290X2NvdW50OworICAgIHVpbnQzMl90ICAgICAgICBib290X2xvYWQ7CisgICAgdWludDMyX3QgICAgICAgIGJvb3RfbG9hZDI7CisgICAgdWludDMyX3QgICAgICAgIGJvb3RfZW50cnk7CisgICAgdWludDMyX3QgICAgICAgIGJvb3RfZW50cnkyOworICAgIHVpbnQzMl90ICAgICAgICBib290X2Nrc3VtOworICAgIGNoYXIgICAgICAgICAgICBwcm9jZXNzb3JbMTZdOyAgLyogQ29udGFpbnMgNjgweDAsIHg9MCwyLDMsNDsgb3IgZW1wdHkgKi8KKyAgICB1aW50MzJfdCAgICAgICAgZHJpdmVyX3NpZzsKKyAgICBjaGFyICAgICAgICAgICAgX3BhZGRpbmdbMzcyXTsKK307CisKKwordm9pZAordXNhZ2Uodm9pZCkKK3sKKyAgICBwcmludGYoIlVzYWdlOiAlcyBbT1BUSU9OU10gPGJvb3QuaXNvPlxuIiwgcHJvZyk7Cit9CisKKwordm9pZAorcHJpbnRoKHZvaWQpCit7CisjZGVmaW5lIEZNVCAiJS0yMHMgJXNcbiIKKworICAgIHVzYWdlKCk7CisKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJPcHRpb25zOlxuIik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC1oIDxYPiIsICJOdW1iZXIgb2YgZ2VvbWV0cnkgaGVhZHMgKGRlZmF1bHQgNjQpIik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC1zIDxYPiIsICJOdW1iZXIgb2YgZ2VvbWV0cnkgc2VjdG9ycyAoZGVmYXVsdCAzMikiKTsKKyAgICBwcmludGYoRk1ULCAiICAgLWUgLS1lbnRyeSIsICJTcGVjaWZ5IHBhcnRpdGlvbiBlbnRyeSBudW1iZXIgKDEtNCkiKTsKKyAgICBwcmludGYoRk1ULCAiICAgLW8gLS1vZmZzZXQiLCAiU3BlY2lmeSBwYXJ0aXRpb24gb2Zmc2V0IChkZWZhdWx0IDApIik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC10IC0tdHlwZSIsICJTcGVjaWZ5IHBhcnRpdGlvbiB0eXBlIChkZWZhdWx0IDB4MTcpIik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC1pIC0taWQiLCAiU3BlY2lmeSBNQlIgSUQgKGRlZmF1bHQgcmFuZG9tKSIpOworICAgIHByaW50ZihGTVQsICIgICAtdSAtLXVlZmkiLCAiQnVpbGQgRUZJIGJvb3RhYmxlIGltYWdlIik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC1tIC0tbWFjIiwgIkFkZCBBRlAgdGFibGUgc3VwcG9ydCIpOworICAgIHByaW50ZihGTVQsICIgICAtYiAtLW1iciA8UEFUSD4iLCAiTG9hZCBNQlIgZnJvbSBQQVRIIik7CisKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC0tZm9yY2VoZDAiLCAiQXNzdW1lIHdlIGFyZSBsb2FkZWQgYXMgZGlzayBJRCAwIik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC0tY3RybGhkMCIsICJBc3N1bWUgZGlzayBJRCAwIGlmIHRoZSBDdHJsIGtleSBpcyBwcmVzc2VkIik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC0tcGFydG9rIiwgIkFsbG93IGJvb3RpbmcgZnJvbSB3aXRoaW4gYSBwYXJ0aXRpb24iKTsKKworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoRk1ULCAiICAgLT8gLS1oZWxwIiwgIkRpc3BsYXkgdGhpcyBoZWxwIik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC12IC0tdmVyYm9zZSIsICJEaXNwbGF5IHZlcmJvc2Ugb3V0cHV0Iik7CisgICAgcHJpbnRmKEZNVCwgIiAgIC1WIC0tdmVyc2lvbiIsICJEaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24iKTsKKworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlJlcG9ydCBidWdzIHRvIDxwai5wYW5kaXRAeWFob28uY28uaW4+XG4iKTsKK30KKworCitpbnQKK2NoZWNrX29wdGlvbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGNoYXIgKmVyciA9IE5VTEw7CisgICAgaW50IG4gPSAwLCBpbmQgPSAwOworCisgICAgY29uc3QgY2hhciBvcHRzdHJbXSA9ICI6aDpzOmU6bzp0Omk6Yjp1bWZjcD92ViI7CisgICAgc3RydWN0IG9wdGlvbiBsb3B0W10gPSBcCisgICAgeworICAgICAgICB7ICJlbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZScgfSwKKyAgICAgICAgeyAib2Zmc2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdvJyB9LAorICAgICAgICB7ICJ0eXBlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd0JyB9LAorICAgICAgICB7ICJpZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnaScgfSwKKworICAgICAgICB7ICJmb3JjZWhkMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZicgfSwKKyAgICAgICAgeyAiY3RybGhkMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYycgfSwKKyAgICAgICAgeyAicGFydG9rIiwgbm9fYXJndW1lbnQsIE5VTEwsICdwJ30sCisJeyAidWVmaSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndSd9LAorCXsgIm1hYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbSd9LAorICAgICAgICB7ICJtYnIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InIH0sCisKKyAgICAgICAgeyAiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnPycgfSwKKyAgICAgICAgeyAidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndicgfSwKKyAgICAgICAgeyAidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVicgfSwKKworICAgICAgICB7IDAsIDAsIDAsIDAgfQorICAgIH07CisKKyAgICBvcHRlcnIgPSBtb2RlID0gMDsKKyAgICB3aGlsZSAoKG4gPSBnZXRvcHRfbG9uZ19vbmx5KGFyZ2MsIGFyZ3YsIG9wdHN0ciwgbG9wdCwgJmluZCkpICE9IC0xKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChuKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgaGVhZCA9IHN0cnRvdWwob3B0YXJnLCAmZXJyLCAwKTsKKyAgICAgICAgICAgIGlmIChoZWFkIDwgMSB8fCBoZWFkID4gMjU2KQorICAgICAgICAgICAgICAgIGVycngoMSwgImludmFsaWQgaGVhZDogYCVzJywgMSA8PSBoZWFkIDw9IDI1NiIsIG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgIHNlY3RvciA9IHN0cnRvdWwob3B0YXJnLCAmZXJyLCAwKTsKKyAgICAgICAgICAgIGlmIChzZWN0b3IgPCAxIHx8IHNlY3RvciA+IDYzKQorICAgICAgICAgICAgICAgIGVycngoMSwgImludmFsaWQgc2VjdG9yOiBgJXMnLCAxIDw9IHNlY3RvciA8PSA2MyIsIG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgIGVudHJ5ID0gc3RydG91bChvcHRhcmcsICZlcnIsIDApOworICAgICAgICAgICAgaWYgKGVudHJ5IDwgMSB8fCBlbnRyeSA+IDQpCisgICAgICAgICAgICAgICAgZXJyeCgxLCAiaW52YWxpZCBlbnRyeTogYCVzJywgMSA8PSBlbnRyeSA8PSA0Iiwgb3B0YXJnKTsKKwkgICAgaWYgKG1vZGUgJiBNQUMgfHwgbW9kZSAmIEVGSSkKKwkJZXJyeCgxLCAic2V0dGluZyBhbiBlbnRyeSBpcyB1bnN1cHBvcnRlZCB3aXRoIEVGSSBvciBNYWMiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ28nOgorICAgICAgICAgICAgb2Zmc2V0ID0gc3RydG91bChvcHRhcmcsICZlcnIsIDApOworICAgICAgICAgICAgaWYgKCplcnIgfHwgb2Zmc2V0ID4gNjQpCisgICAgICAgICAgICAgICAgZXJyeCgxLCAiaW52YWxpZCBvZmZzZXQ6IGAlcycsIDAgPD0gb2Zmc2V0IDw9IDY0Iiwgb3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgdHlwZSA9IHN0cnRvdWwob3B0YXJnLCAmZXJyLCAwKTsKKyAgICAgICAgICAgIGlmICgqZXJyIHx8IHR5cGUgPiAyNTUpCisgICAgICAgICAgICAgICAgZXJyeCgxLCAiaW52YWxpZCB0eXBlOiBgJXMnLCAwIDw9IHR5cGUgPD0gMjU1Iiwgb3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgaWQgPSBzdHJ0b3VsKG9wdGFyZywgJmVyciwgMCk7CisgICAgICAgICAgICBpZiAoKmVycikKKyAgICAgICAgICAgICAgICBlcnJ4KDEsICJpbnZhbGlkIGlkOiBgJXMnIiwgb3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgaGQwID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgaGQwID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgcGFydG9rID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisJY2FzZSAndSc6CisJICAgIG1vZGUgfD0gRUZJOworCSAgICBpZiAoZW50cnkpCisJCWVycngoMSwgInNldHRpbmcgYW4gZW50cnkgaXMgdW5zdXBwb3J0ZWQgd2l0aCBFRkkgb3IgTWFjIik7CisJICAgIGJyZWFrOworCisJY2FzZSAnbSc6CisJICAgIG1vZGUgfD0gTUFDOworCSAgICBpZiAoZW50cnkpCisJCWVycngoMSwgInNldHRpbmcgYW4gZW50cnkgaXMgdW5zdXBwb3J0ZWQgd2l0aCBFRkkgb3IgTWFjIik7CisJICAgIGJyZWFrOworCisJY2FzZSAnYic6CisgICAgICAgICAgICBpZiAoc3RybGVuKG9wdGFyZykgPj0gc2l6ZW9mKG1icl90ZW1wbGF0ZV9wYXRoKSkKKyAgICAgICAgICAgICAgICBlcnJ4KDEsICItLW1iciA6IFBhdGggdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHN0cmNweShtYnJfdGVtcGxhdGVfcGF0aCwgb3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgbW9kZSB8PSBWRVJCT1NFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnVic6CisgICAgICAgICAgICBwcmludGYoIiVzIHZlcnNpb24gJXNcbiIsIHByb2csIFZFUlNJT04pOworICAgICAgICAgICAgZXhpdCgwKTsKKworICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgIGVycngoMSwgIm9wdGlvbiBgLSVjJyB0YWtlcyBhbiBhcmd1bWVudCIsIG9wdG9wdCk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICBpZiAob3B0b3B0KQorICAgICAgICAgICAgICAgIGVycngoMSwgImludmFsaWQgb3B0aW9uIGAtJWMnLCBzZWUgLS1oZWxwIiwgb3B0b3B0KTsKKworICAgICAgICAgICAgcHJpbnRoKCk7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9wdGluZDsKK30KKwordWludDE2X3QKK2JlbmRpYW5fc2hvcnQoY29uc3QgdWludDE2X3QgcykKK3sKKyAgICB1aW50MTZfdCByID0gMTsKKworICAgIGlmICghKih1aW50OF90ICopJnIpCisgICAgICAgIHJldHVybiBzOworCisgICAgciA9IChzICYgMHgwMEZGKSA8PCA4IHwgKHMgJiAweEZGMDApID4+IDg7CisKKyAgICByZXR1cm4gcjsKK30KKworCit1aW50MzJfdAorYmVuZGlhbl9pbnQoY29uc3QgdWludDMyX3QgcykKK3sKKyAgICB1aW50MzJfdCByID0gMTsKKworICAgIGlmICghKih1aW50OF90ICopJnIpCisgICAgICAgIHJldHVybiBzOworCisgICAgciA9IChzICYgMHgwMDAwMDBGRikgPDwgMjQgfCAocyAmIDB4RkYwMDAwMDApID4+IDI0CisgICAgICAgIHwgKHMgJiAweDAwMDBGRjAwKSA8PCA4IHwgKHMgJiAweDAwRkYwMDAwKSA+PiA4OworCisgICAgcmV0dXJuIHI7Cit9CisKK3VpbnQxNl90CitsZW5kaWFuX3Nob3J0KGNvbnN0IHVpbnQxNl90IHMpCit7CisgICAgdWludDE2X3QgciA9IDE7CisKKyAgICBpZiAoKih1aW50OF90ICopJnIpCisgICAgICAgIHJldHVybiBzOworCisgICAgciA9IChzICYgMHgwMEZGKSA8PCA4IHwgKHMgJiAweEZGMDApID4+IDg7CisKKyAgICByZXR1cm4gcjsKK30KKworCit1aW50MzJfdAorbGVuZGlhbl9pbnQoY29uc3QgdWludDMyX3QgcykKK3sKKyAgICB1aW50MzJfdCByID0gMTsKKworICAgIGlmICgqKHVpbnQ4X3QgKikmcikKKyAgICAgICAgcmV0dXJuIHM7CisKKyAgICByID0gKHMgJiAweDAwMDAwMEZGKSA8PCAyNCB8IChzICYgMHhGRjAwMDAwMCkgPj4gMjQKKyAgICAgICAgfCAocyAmIDB4MDAwMEZGMDApIDw8IDggfCAocyAmIDB4MDBGRjAwMDApID4+IDg7CisKKyAgICByZXR1cm4gcjsKK30KKwordWludDY0X3QKK2xlbmRpYW5fNjQoY29uc3QgdWludDY0X3QgcykKK3sKKwl1aW50NjRfdCByID0gMTsKKworCWlmICgqKHVpbnQ4X3QgKikmcikKKwkJcmV0dXJuIHM7CisKKyAgICAgICByID0gKHMgJiAweDAwMDAwMDAwMDAwMDAwRkZ1bGwpIDw8IDU2IHwgKHMgJiAweEZGMDAwMDAwMDAwMDAwMDB1bGwpID4+IDU2CisgICAgICAgICAgICB8IChzICYgMHgwMDAwMDAwMDAwMDBGRjAwdWxsKSA8PCA0MCB8IChzICYgMHgwMEZGMDAwMDAwMDAwMDAwdWxsKSA+PiA0MAorICAgICAgICAgICAgfCAocyAmIDB4MDAwMDAwMDAwMEZGMDAwMHVsbCkgPDwgMjQgfCAocyAmIDB4MDAwMEZGMDAwMDAwMDAwMHVsbCkgPj4gMjQKKyAgICAgICAgICAgIHwgKHMgJiAweDAwMDAwMDAwRkYwMDAwMDB1bGwpIDw8IDggfCAocyAmIDB4MDAwMDAwRkYwMDAwMDAwMHVsbCkgPj4gODsKKworCXJldHVybiByOworfQorCisKK2ludAorY2hlY2tfYmFubmVyKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciBiYW5uZXJbXSA9ICJcMENEMDAxXDFFTCBUT1JJVE8gU1BFQ0lGSUNBVElPTlwwXDBcMFwwIiBcCisgICAgICAgICJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiBcCisgICAgICAgICJcMFwwXDBcMFwwIjsKKworICAgIGlmICghYnVmIHx8IG1lbWNtcChidWYsIGJhbm5lciwgc2l6ZW9mKGJhbm5lcikgLSAxKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBidWYgKz0gc2l6ZW9mKGJhbm5lcikgLSAxOworICAgIG1lbWNweSgmY2F0b2Zmc2V0LCBidWYsIHNpemVvZihjYXRvZmZzZXQpKTsKKworICAgIGNhdG9mZnNldCA9IGxlbmRpYW5faW50KGNhdG9mZnNldCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQKK2NoZWNrX2NhdGFsb2d1ZShjb25zdCB1aW50OF90ICpidWYpCit7CisgICAgaW50IGkgPSAwOworCisgICAgZm9yIChpID0gMCwgY3MgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHZlW2ldID0gMDsKKyAgICAgICAgbWVtY3B5KCZ2ZVtpXSwgYnVmLCBzaXplb2YodmVbaV0pKTsKKworICAgICAgICB2ZVtpXSA9IGxlbmRpYW5fc2hvcnQodmVbaV0pOworCisgICAgICAgIGJ1ZiArPSAyOworICAgICAgICBjcyArPSB2ZVtpXTsKKworICAgICAgICBpZiAobW9kZSAmIFZFUkJPU0UpCisgICAgICAgICAgICBwcmludGYoInZlWyVkXTogJWQsIGNzOiAlZFxuIiwgaSwgdmVbaV0sIGNzKTsKKyAgICB9CisgICAgaWYgKCh2ZVswXSAhPSAweDAwMDEpIHx8ICh2ZVsxNV0gIT0gMHhBQTU1KSB8fCAoY3MgJiAweEZGRkYpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorCisKK2ludAorcmVhZF9jYXRhbG9ndWUoY29uc3QgdWludDhfdCAqYnVmKQoreworICAgIG1lbWNweSgmZGVfYm9vdCwgYnVmKyssIDEpOworICAgIG1lbWNweSgmZGVfbWVkaWEsIGJ1ZisrLCAxKTsKKworICAgIG1lbWNweSgmZGVfc2VnLCBidWYsIDIpOworICAgIGRlX3NlZyA9IGxlbmRpYW5fc2hvcnQoZGVfc2VnKTsKKyAgICBidWYgKz0gMjsKKworICAgIG1lbWNweSgmZGVfc3lzLCBidWYrKywgMSk7CisgICAgbWVtY3B5KCZkZV9tYnoxLCBidWYrKywgMSk7CisKKyAgICBtZW1jcHkoJmRlX2NvdW50LCBidWYsIDIpOworICAgIGRlX2NvdW50ID0gbGVuZGlhbl9zaG9ydChkZV9jb3VudCk7CisgICAgYnVmICs9IDI7CisKKyAgICBtZW1jcHkoJmRlX2xiYSwgYnVmLCA0KTsKKyAgICBkZV9sYmEgPSBsZW5kaWFuX2ludChkZV9sYmEpOworICAgIGJ1ZiArPSA0OworCisgICAgbWVtY3B5KCZkZV9tYnoyLCBidWYsIDIpOworICAgIGRlX21iejIgPSBsZW5kaWFuX3Nob3J0KGRlX21iejIpOworICAgIGJ1ZiArPSAyOworCisgICAgaWYgKGRlX2Jvb3QgIT0gMHg4OCB8fCBkZV9tZWRpYSAhPSAwCisgICAgICAgIHx8IChkZV9zZWcgIT0gMCAmJiBkZV9zZWcgIT0gMHg3QzApIHx8IGRlX2NvdW50ICE9IDQpCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKworaW50CityZWFkX2VmaV9zZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKwl1bnNpZ25lZCBjaGFyIGhlYWRlcl9pbmRpY2F0b3I7CisJdW5zaWduZWQgY2hhciBwbGF0Zm9ybV9pZDsKKwlzaG9ydCBjb3VudDsKKworCW1lbWNweSgmaGVhZGVyX2luZGljYXRvciwgYnVmKyssIDEpOworCW1lbWNweSgmcGxhdGZvcm1faWQsIGJ1ZisrLCAxKTsKKworCW1lbWNweSgmY291bnQsIGJ1ZiwgMik7CisJY291bnQgPSBsZW5kaWFuX3Nob3J0KGNvdW50KTsKKwlidWYgKz0gMjsKKworCWlmIChwbGF0Zm9ybV9pZCA9PSAweGVmKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitpbnQKK3JlYWRfZWZpX2NhdGFsb2d1ZShjb25zdCB1aW50OF90ICpidWYsIHVpbnQxNl90ICpjb3VudCwgdWludDMyX3QgKmxiYSkKK3sKKyAgICBidWYgKz0gNjsKKworICAgIG1lbWNweShjb3VudCwgYnVmLCAyKTsKKyAgICAqY291bnQgPSBsZW5kaWFuX3Nob3J0KCpjb3VudCk7CisgICAgYnVmICs9IDI7CisKKyAgICBtZW1jcHkobGJhLCBidWYsIDQpOworICAgICpsYmEgPSBsZW5kaWFuX2ludCgqbGJhKTsKKyAgICBidWYgKz0gNjsKKworICAgIHJldHVybiAwOworfQorCisKK3ZvaWQKK2Rpc3BsYXlfY2F0YWxvZ3VlKHZvaWQpCit7CisgICAgcHJpbnRmKCJkZV9ib290OiAlaGh1XG4iLCBkZV9ib290KTsKKyAgICBwcmludGYoImRlX21lZGlhOiAlaGh1XG4iLCBkZV9tZWRpYSk7CisgICAgcHJpbnRmKCJkZV9zZWc6ICVodVxuIiwgZGVfc2VnKTsKKyAgICBwcmludGYoImRlX3N5czogJWhodVxuIiwgZGVfc3lzKTsKKyAgICBwcmludGYoImRlX21iejE6ICVoaHVcbiIsIGRlX21iejEpOworICAgIHByaW50ZigiZGVfY291bnQ6ICVodVxuIiwgZGVfY291bnQpOworICAgIHByaW50ZigiZGVfbGJhOiAldVxuIiwgZGVfbGJhKTsKKyAgICBwcmludGYoImRlX21iejI6ICVodVxuIiwgZGVfbWJ6Mik7Cit9CisKKwordm9pZAorcmVhZF9tYnJfdGVtcGxhdGUoY2hhciAqcGF0aCwgdWludDhfdCAqbWJyKQoreworICAgIEZJTEUgKmZwOworICAgIGludCByZXQ7CisKKyAgICBmcCA9IGZvcGVuKHBhdGgsICJyYiIpOworICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICBlcnIoMSwgImNvdWxkIG5vdCBvcGVuIE1CUiB0ZW1wbGF0ZSBmaWxlIGAlcyciLCBwYXRoKTsKKyAgICBjbGVhcmVycihmcCk7CisgICAgcmV0ID0gZnJlYWQobWJyLCAxLCBNQlJTSVpFLCBmcCk7CisgICAgaWYgKGZlcnJvcihmcCkgfHwgcmV0ICE9IE1CUlNJWkUpCisgICAgICAgIGVycigxLCAiZXJyb3Igd2hpbGUgcmVhZGluZyBNQlIgdGVtcGxhdGUgZmlsZSBgJXMnIiwgcGF0aCk7CisgICAgZmNsb3NlKGZwKTsKK30KKworCitpbnQKK2luaXRpYWxpc2VfbWJyKHVpbnQ4X3QgKm1icikKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgdWludDMyX3QgdG1wID0gMDsKKyAgICB1aW50OF90IHB0eXBlID0gMCwgKnJibSA9IG1icjsKKyAgICB1aW50OF90IGJoZWFkID0gMCwgYnNlY3QgPSAwLCBiY3lsZSA9IDA7CisgICAgdWludDhfdCBlaGVhZCA9IDAsIGVzZWN0ID0gMCwgZWN5bGUgPSAwOworCisjaWZuZGVmIElTT0hZQlJJRF9DX1NUQU5EQUxPTkUKKyAgICBleHRlcm4gdW5zaWduZWQgY2hhciBpc29oZHBmeFtdW01CUlNJWkVdOworI2VuZGlmCisKKyAgICBpZiAobWJyX3RlbXBsYXRlX3BhdGhbMF0pIHsKKyAgICAgICAgcmVhZF9tYnJfdGVtcGxhdGUobWJyX3RlbXBsYXRlX3BhdGgsIG1icik7CisgICAgfSBlbHNlIHsKKworI2lmZGVmIElTT0hZQlJJRF9DX1NUQU5EQUxPTkUKKworICAgICAgICBlcnIoMSwgIlRoaXMgaXMgYSBzdGFuZGFsb25lIGJpbmFyeS4gWW91IG11c3Qgc3BlY2lmeSAtLW1ici4gRS5nIHdpdGggL3Vzci9saWIvc3lzbGludXgvaXNvaGRwZnguYmluIik7CisKKyNlbHNlCisKKyAgICAgICAgbWVtY3B5KG1iciwgJmlzb2hkcGZ4W2hkMCArIDMgKiBwYXJ0b2tdLCBNQlJTSVpFKTsKKworI2VuZGlmIC8qICEgSVNPSFlCUklEX0NfU1RBTkRBTE9ORSAqLworCisgICAgfQorCisgICAgaWYgKG1vZGUgJiBNQUMpIHsKKwltZW1jcHkobWJyLCBhZnBfaGVhZGVyLCBzaXplb2YoYWZwX2hlYWRlcikpOworICAgIH0KKworICAgIGlmICghZW50cnkpCisJZW50cnkgPSAxOworCisgICAgaWYgKG1vZGUgJiBFRkkpCisJdHlwZSA9IDA7CisKKyAgICBtYnIgKz0gTUJSU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgNDMyICovCisKKyAgICB0bXAgPSBsZW5kaWFuX2ludChkZV9sYmEgKiA0KTsKKyAgICBtZW1jcHkobWJyLCAmdG1wLCBzaXplb2YodG1wKSk7CisgICAgbWJyICs9IHNpemVvZih0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IDQzNiAqLworCisgICAgdG1wID0gMDsKKyAgICBtZW1jcHkobWJyLCAmdG1wLCBzaXplb2YodG1wKSk7CisgICAgbWJyICs9IHNpemVvZih0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IDQ0MCAqLworCisgICAgdG1wID0gbGVuZGlhbl9pbnQoaWQpOworICAgIG1lbWNweShtYnIsICZ0bXAsIHNpemVvZih0bXApKTsKKyAgICBtYnIgKz0gc2l6ZW9mKHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgNDQ0ICovCisKKyAgICBtYnJbMF0gPSAnXDAnOworICAgIG1iclsxXSA9ICdcMCc7CisgICAgbWJyICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IDQ0NiAqLworCisgICAgcHR5cGUgPSB0eXBlOworICAgIHBzaXplID0gYyAqIGhlYWQgKiBzZWN0b3IgLSBvZmZzZXQ7CisKKyAgICBiaGVhZCA9IChvZmZzZXQgLyBzZWN0b3IpICUgaGVhZDsKKyAgICBic2VjdCA9IChvZmZzZXQgJSBzZWN0b3IpICsgMTsKKyAgICBiY3lsZSA9IG9mZnNldCAvIChoZWFkICogc2VjdG9yKTsKKworICAgIGJzZWN0ICs9IChiY3lsZSAmIDB4MzAwKSA+PiAyOworICAgIGJjeWxlICAmPSAweEZGOworCisgICAgZWhlYWQgPSBoZWFkIC0gMTsKKyAgICBlc2VjdCA9IHNlY3RvciArICgoKGNjIC0gMSkgJiAweDMwMCkgPj4gMik7CisgICAgZWN5bGUgPSAoY2MgLSAxKSAmIDB4RkY7CisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDQ7IGkrKykKKyAgICB7CisgICAgICAgIG1lbXNldChtYnIsIDAsIDE2KTsKKyAgICAgICAgaWYgKGkgPT0gZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iclswXSA9IDB4ODA7CisgICAgICAgICAgICBtYnJbMV0gPSBiaGVhZDsKKyAgICAgICAgICAgIG1iclsyXSA9IGJzZWN0OworICAgICAgICAgICAgbWJyWzNdID0gYmN5bGU7CisgICAgICAgICAgICBtYnJbNF0gPSBwdHlwZTsKKyAgICAgICAgICAgIG1icls1XSA9IGVoZWFkOworICAgICAgICAgICAgbWJyWzZdID0gZXNlY3Q7CisgICAgICAgICAgICBtYnJbN10gPSBlY3lsZTsKKworICAgICAgICAgICAgdG1wID0gbGVuZGlhbl9pbnQob2Zmc2V0KTsKKyAgICAgICAgICAgIG1lbWNweSgmbWJyWzhdLCAmdG1wLCBzaXplb2YodG1wKSk7CisKKyAgICAgICAgICAgIHRtcCA9IGxlbmRpYW5faW50KHBzaXplKTsKKyAgICAgICAgICAgIG1lbWNweSgmbWJyWzEyXSwgJnRtcCwgc2l6ZW9mKHRtcCkpOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IDIgJiYgKG1vZGUgJiBFRkkpKQorICAgICAgICB7CisgICAgICAgICAgICBtYnJbMF0gPSAweDA7CisgICAgICAgICAgICBtYnJbMV0gPSAweGZlOworICAgICAgICAgICAgbWJyWzJdID0gMHhmZjsKKyAgICAgICAgICAgIG1iclszXSA9IDB4ZmY7CisgICAgICAgICAgICBtYnJbNF0gPSAweGVmOworICAgICAgICAgICAgbWJyWzVdID0gMHhmZTsKKyAgICAgICAgICAgIG1icls2XSA9IDB4ZmY7CisgICAgICAgICAgICBtYnJbN10gPSAweGZmOworCisgICAgICAgICAgICB0bXAgPSBsZW5kaWFuX2ludChlZmlfbGJhICogNCk7CisgICAgICAgICAgICBtZW1jcHkoJm1icls4XSwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCisgICAgICAgICAgICB0bXAgPSBsZW5kaWFuX2ludChlZmlfY291bnQpOworICAgICAgICAgICAgbWVtY3B5KCZtYnJbMTJdLCAmdG1wLCBzaXplb2YodG1wKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gMyAmJiAobW9kZSAmIE1BQykpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iclswXSA9IDB4MDsKKyAgICAgICAgICAgIG1iclsxXSA9IDB4ZmU7CisgICAgICAgICAgICBtYnJbMl0gPSAweGZmOworICAgICAgICAgICAgbWJyWzNdID0gMHhmZjsKKyAgICAgICAgICAgIG1icls0XSA9IDB4MDsKKyAgICAgICAgICAgIG1icls1XSA9IDB4ZmU7CisgICAgICAgICAgICBtYnJbNl0gPSAweGZmOworICAgICAgICAgICAgbWJyWzddID0gMHhmZjsKKworICAgICAgICAgICAgdG1wID0gbGVuZGlhbl9pbnQobWFjX2xiYSAqIDQpOworICAgICAgICAgICAgbWVtY3B5KCZtYnJbOF0sICZ0bXAsIHNpemVvZih0bXApKTsKKworICAgICAgICAgICAgdG1wID0gbGVuZGlhbl9pbnQobWFjX2NvdW50KTsKKyAgICAgICAgICAgIG1lbWNweSgmbWJyWzEyXSwgJnRtcCwgc2l6ZW9mKHRtcCkpOworICAgICAgICB9CisgICAgICAgIG1iciArPSAxNjsKKyAgICB9CisgICAgbWJyWzBdID0gMHg1NTsKKyAgICBtYnJbMV0gPSAweEFBOworICAgIG1iciArPSAyOworCisgICAgcmV0dXJuIG1iciAtIHJibTsKK30KKwordm9pZAorZGlzcGxheV9tYnIoY29uc3QgdWludDhfdCAqbWJyLCBzaXplX3QgbGVuKQoreworICAgIHVuc2lnbmVkIGNoYXIgYyA9IDA7CisgICAgdW5zaWduZWQgaW50IGkgPSAwLCBqID0gMDsKKworICAgIHByaW50Zigic2l6ZW9mKE1CUik6ICV6dSBieXRlc1xuIiwgbGVuKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoIShpICUgMTYpKQorICAgICAgICAgICAgcHJpbnRmKCIlMDRkICIsIGkpOworCisgICAgICAgIGlmICghKGkgJSA4KSkKKyAgICAgICAgICAgIHByaW50ZigiICIpOworCisgICAgICAgIGMgPSBtYnJbaV07CisgICAgICAgIHByaW50ZigiJTAyeCAiLCBjKTsKKworICAgICAgICBpZiAoISgoaSArIDEpICUgMTYpKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIiB8Iik7CisgICAgICAgICAgICBmb3IgKDsgaiA8PSBpOyBqKyspCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsIGlzcHJpbnQobWJyW2pdKSA/IG1icltqXSA6ICcuJyk7CisgICAgICAgICAgICBwcmludGYoInxcbiIpOworICAgICAgICB9CisgICAgfQorfQorCisKK3VpbnQzMl90IGNoa3N1bV9jcmMzMiAodW5zaWduZWQgY2hhciAqYmxvY2ssIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjcmM7CisJdW5zaWduZWQgbG9uZyBpOworCisJY3JjID0gMHhGRkZGRkZGRjsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJeworCQljcmMgPSAoKGNyYyA+PiA4KSAmIDB4MDBGRkZGRkYpIF4gY3JjX3RhYlsoY3JjIF4gKmJsb2NrKyspICYgMHhGRl07CisJfQorCXJldHVybiAoY3JjIF4gMHhGRkZGRkZGRik7Cit9CisKK3ZvaWQKK3JldmVyc2VfdXVpZCh1dWlkX3QgdXVpZCkKK3sKKwl1aW50OF90IHQsICpwID0gKHVpbnQ4X3QgKil1dWlkOworCisJdCA9IHBbMF07IHBbMF0gPSBwWzNdOyBwWzNdID0gdDsKKwl0ID0gcFsxXTsgcFsxXSA9IHBbMl07IHBbMl0gPSB0OworCXQgPSBwWzRdOyBwWzRdID0gcFs1XTsgcFs1XSA9IHQ7CisJdCA9IHBbNl07IHBbNl0gPSBwWzddOyBwWzddID0gdDsKK30KKworc3RhdGljIHVpbnQxNl90ICoKK2FzY2lpX3RvX3V0ZjE2bGUodWludDE2X3QgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworICAgIHVpbnQ4X3QgKnAgPSAodWludDhfdCAqKWRzdDsKKyAgICBjaGFyIGM7CisKKyAgICBkbyB7CisJYyA9ICpzcmMrKzsKKwkqcCsrID0gYzsKKwkqcCsrID0gMDsKKyAgICB9IHdoaWxlIChjKTsKKworICAgIHJldHVybiAodWludDE2X3QgKilwOworfQorCit2b2lkCitpbml0aWFsaXNlX2dwdCh1aW50OF90ICpncHQsIHVpbnQzMl90IGN1cnJlbnQsIHVpbnQzMl90IGFsdGVybmF0ZSwgaW50IHByaW1hcnkpCit7CisgICAgc3RydWN0IGdwdF9oZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgZ3B0X2hlYWRlciAqKWdwdDsKKyAgICBzdHJ1Y3QgZ3B0X3BhcnRfaGVhZGVyICpwYXJ0OworICAgIGludCBob2xlID0gMDsKKyAgICBpbnQgZ3B0c2l6ZSA9IDEyOCAvIDQgKyAyOworCisgICAgaWYgKG1hY19sYmEpIHsKKwkvKiAyMDQ4IGJ5dGVzIHBlciBwYXJ0aXRpb24sIHBsdXMgcm91bmQgdG8gMjA0OCBib3VuZGFyeSAqLworCWhvbGUgPSAoYXBtX3BhcnRzICogNCkgKyAyOworICAgIH0KKworICAgIGlmIChwcmltYXJ5KSB7CisJdXVpZF9nZW5lcmF0ZShkaXNrX3V1aWQpOworCXJldmVyc2VfdXVpZChkaXNrX3V1aWQpOworICAgIH0KKworICAgIGhlYWRlci0+c2lnbmF0dXJlID0gbGVuZGlhbl82NCgweDU0NTI0MTUwMjA0OTQ2NDV1bGwpOworICAgIGhlYWRlci0+cmV2aXNpb24gPSBsZW5kaWFuX2ludCgweDAxMDAwMCk7CisgICAgaGVhZGVyLT5oZWFkZXJTaXplID0gbGVuZGlhbl9pbnQoMHg1Yyk7CisgICAgaGVhZGVyLT5jdXJyZW50TEJBID0gbGVuZGlhbl82NChjdXJyZW50KTsKKyAgICBoZWFkZXItPmJhY2t1cExCQSA9IGxlbmRpYW5fNjQoYWx0ZXJuYXRlKTsKKyAgICBoZWFkZXItPmZpcnN0VXNhYmxlTEJBID0gbGVuZGlhbl82NChncHRzaXplICsgaG9sZSk7CisgICAgaGVhZGVyLT5sYXN0VXNhYmxlTEJBID0gbGVuZGlhbl82NCgoaXNvc3RhdC5zdF9zaXplICsgcGFkZGluZykvNTEyIC0KKwkJCQkgICAgICAgZ3B0c2l6ZSk7CisgICAgaWYgKHByaW1hcnkpCisJaGVhZGVyLT5wYXJ0aXRpb25FbnRyaWVzTEJBID0gbGVuZGlhbl82NCgweDAyICsgaG9sZSk7CisgICAgZWxzZQorCWhlYWRlci0+cGFydGl0aW9uRW50cmllc0xCQSA9IGxlbmRpYW5fNjQoY3VycmVudCAtICgxMjggLyA0KSk7CisgICAgaGVhZGVyLT5udW1QYXJ0cyA9IGxlbmRpYW5faW50KDB4ODApOworICAgIGhlYWRlci0+c2l6ZU9mUGFydGl0aW9uRW50cmllcyA9IGxlbmRpYW5faW50KDB4ODApOworICAgIG1lbWNweShoZWFkZXItPmRpc2tHVUlELCBkaXNrX3V1aWQsIHNpemVvZih1dWlkX3QpKTsKKworICAgIGlmIChwcmltYXJ5KQorCWdwdCArPSBzaXplb2Yoc3RydWN0IGdwdF9oZWFkZXIpICsgaG9sZSAqIDUxMjsKKyAgICBlbHNlCisJZ3B0IC09IGhlYWRlci0+c2l6ZU9mUGFydGl0aW9uRW50cmllcyAqIGhlYWRlci0+bnVtUGFydHM7CisKKyAgICBwYXJ0ID0gKHN0cnVjdCBncHRfcGFydF9oZWFkZXIgKilncHQ7CisgICAgaWYgKHByaW1hcnkpIHsKKwl1dWlkX2dlbmVyYXRlKHBhcnRfdXVpZCk7CisJdXVpZF9nZW5lcmF0ZShpc29fdXVpZCk7CisJcmV2ZXJzZV91dWlkKHBhcnRfdXVpZCk7CisJcmV2ZXJzZV91dWlkKGlzb191dWlkKTsKKyAgICB9CisKKyAgICBtZW1jcHkocGFydC0+cGFydEdVSUQsIGlzb191dWlkLCBzaXplb2YodXVpZF90KSk7CisgICAgbWVtY3B5KHBhcnQtPnBhcnRUeXBlR1VJRCwgYmFzaWNfcGFydGl0aW9uLCBzaXplb2YodXVpZF90KSk7CisgICAgcGFydC0+Zmlyc3RMQkEgPSBsZW5kaWFuXzY0KDApOworICAgIHBhcnQtPmxhc3RMQkEgPSBsZW5kaWFuXzY0KHBzaXplIC0gMSk7CisgICAgYXNjaWlfdG9fdXRmMTZsZShwYXJ0LT5uYW1lLCAiSVNPSHlicmlkIElTTyIpOworCisgICAgZ3B0ICs9IHNpemVvZihzdHJ1Y3QgZ3B0X3BhcnRfaGVhZGVyKTsKKyAgICBwYXJ0Kys7CisKKyAgICBtZW1jcHkocGFydC0+cGFydEdVSUQsIHBhcnRfdXVpZCwgc2l6ZW9mKHV1aWRfdCkpOworICAgIG1lbWNweShwYXJ0LT5wYXJ0VHlwZUdVSUQsIGJhc2ljX3BhcnRpdGlvbiwgc2l6ZW9mKHV1aWRfdCkpOworICAgIHBhcnQtPmZpcnN0TEJBID0gbGVuZGlhbl82NChlZmlfbGJhICogNCk7CisgICAgcGFydC0+bGFzdExCQSA9IGxlbmRpYW5fNjQocGFydC0+Zmlyc3RMQkEgKyBlZmlfY291bnQgLSAxKTsKKyAgICBhc2NpaV90b191dGYxNmxlKHBhcnQtPm5hbWUsICJJU09IeWJyaWQiKTsKKworICAgIGdwdCArPSBzaXplb2Yoc3RydWN0IGdwdF9wYXJ0X2hlYWRlcik7CisKKyAgICBpZiAobWFjX2xiYSkgeworCWdwdCArPSBzaXplb2Yoc3RydWN0IGdwdF9wYXJ0X2hlYWRlcik7CisKKwlwYXJ0Kys7CisKKwltZW1jcHkocGFydC0+cGFydEdVSUQsIHBhcnRfdXVpZCwgc2l6ZW9mKHV1aWRfdCkpOworCW1lbWNweShwYXJ0LT5wYXJ0VHlwZUdVSUQsIGhmc19wYXJ0aXRpb24sIHNpemVvZih1dWlkX3QpKTsKKwlwYXJ0LT5maXJzdExCQSA9IGxlbmRpYW5fNjQobWFjX2xiYSAqIDQpOworCXBhcnQtPmxhc3RMQkEgPSBsZW5kaWFuXzY0KHBhcnQtPmZpcnN0TEJBICsgbWFjX2NvdW50IC0gMSk7CisJYXNjaWlfdG9fdXRmMTZsZShwYXJ0LT5uYW1lLCAiSVNPSHlicmlkIik7CisKKwlwYXJ0LS07CisgICAgfQorCisgICAgcGFydC0tOworCisgICAgaGVhZGVyLT5wYXJ0aXRpb25FbnRyaWVzQ1JDID0gbGVuZGlhbl9pbnQgKGNoa3N1bV9jcmMzMigodWludDhfdCAqKXBhcnQsCisJCQkgICBoZWFkZXItPm51bVBhcnRzICogaGVhZGVyLT5zaXplT2ZQYXJ0aXRpb25FbnRyaWVzKSk7CisKKyAgICBoZWFkZXItPmhlYWRlckNSQyA9IGxlbmRpYW5faW50KGNoa3N1bV9jcmMzMigodWludDhfdCAqKWhlYWRlciwKKwkJCQkJCSBoZWFkZXItPmhlYWRlclNpemUpKTsKK30KKwordm9pZAoraW5pdGlhbGlzZV9hcG0odWludDhfdCAqZ3B0LCB1aW50MzJfdCBzdGFydCkKK3sKKyAgICBzdHJ1Y3QgYXBwbGVfcGFydF9oZWFkZXIgKnBhcnQgPSAoc3RydWN0IGFwcGxlX3BhcnRfaGVhZGVyICopZ3B0OworCisgICAgcGFydC0+c2lnbmF0dXJlID0gYmVuZGlhbl9zaG9ydCgweDUwNGQpOworICAgIHBhcnQtPm1hcF9jb3VudCA9IGJlbmRpYW5faW50KGFwbV9wYXJ0cyk7CisgICAgcGFydC0+c3RhcnRfYmxvY2sgPSBiZW5kaWFuX2ludCgxKTsKKyAgICBwYXJ0LT5ibG9ja19jb3VudCA9IGJlbmRpYW5faW50KDQpOworICAgIHN0cmNweShwYXJ0LT5uYW1lLCAiQXBwbGUiKTsKKyAgICBzdHJjcHkocGFydC0+dHlwZSwgIkFwcGxlX3BhcnRpdGlvbl9tYXAiKTsKKyAgICBwYXJ0LT5kYXRhX3N0YXJ0ID0gYmVuZGlhbl9pbnQoMCk7CisgICAgcGFydC0+ZGF0YV9jb3VudCA9IGJlbmRpYW5faW50KDEwKTsKKyAgICBwYXJ0LT5zdGF0dXMgPSBiZW5kaWFuX2ludCgweDAzKTsKKworICAgIHBhcnQgPSAoc3RydWN0IGFwcGxlX3BhcnRfaGVhZGVyICopKGdwdCArIDIwNDgpOworCisgICAgcGFydC0+c2lnbmF0dXJlID0gYmVuZGlhbl9zaG9ydCgweDUwNGQpOworICAgIHBhcnQtPm1hcF9jb3VudCA9IGJlbmRpYW5faW50KDMpOworICAgIHBhcnQtPnN0YXJ0X2Jsb2NrID0gYmVuZGlhbl9pbnQoZWZpX2xiYSk7CisgICAgcGFydC0+YmxvY2tfY291bnQgPSBiZW5kaWFuX2ludChlZmlfY291bnQgLyA0KTsKKyAgICBzdHJjcHkocGFydC0+bmFtZSwgIkVGSSIpOworICAgIHN0cmNweShwYXJ0LT50eXBlLCAiQXBwbGVfSEZTIik7CisgICAgcGFydC0+ZGF0YV9zdGFydCA9IGJlbmRpYW5faW50KDApOworICAgIHBhcnQtPmRhdGFfY291bnQgPSBiZW5kaWFuX2ludChlZmlfY291bnQgLyA0KTsKKyAgICBwYXJ0LT5zdGF0dXMgPSBiZW5kaWFuX2ludCgweDMzKTsKKworICAgIHBhcnQgPSAoc3RydWN0IGFwcGxlX3BhcnRfaGVhZGVyICopKGdwdCArIDQwOTYpOworCisgICAgaWYgKG1hY19sYmEpCisgICAgeworCXBhcnQtPnNpZ25hdHVyZSA9IGJlbmRpYW5fc2hvcnQoMHg1MDRkKTsKKwlwYXJ0LT5tYXBfY291bnQgPSBiZW5kaWFuX2ludCgzKTsKKwlwYXJ0LT5zdGFydF9ibG9jayA9IGJlbmRpYW5faW50KG1hY19sYmEpOworCXBhcnQtPmJsb2NrX2NvdW50ID0gYmVuZGlhbl9pbnQobWFjX2NvdW50IC8gNCk7CisJc3RyY3B5KHBhcnQtPm5hbWUsICJFRkkiKTsKKwlzdHJjcHkocGFydC0+dHlwZSwgIkFwcGxlX0hGUyIpOworCXBhcnQtPmRhdGFfc3RhcnQgPSBiZW5kaWFuX2ludCgwKTsKKwlwYXJ0LT5kYXRhX2NvdW50ID0gYmVuZGlhbl9pbnQobWFjX2NvdW50IC8gNCk7CisJcGFydC0+c3RhdHVzID0gYmVuZGlhbl9pbnQoMHgzMyk7CisgICAgfSBlbHNlIHsKKwlwYXJ0LT5zaWduYXR1cmUgPSBiZW5kaWFuX3Nob3J0KDB4NTA0ZCk7CisJcGFydC0+bWFwX2NvdW50ID0gYmVuZGlhbl9pbnQoMyk7CisJcGFydC0+c3RhcnRfYmxvY2sgPSBiZW5kaWFuX2ludCgoc3RhcnQvMjA0OCkgKyAxMCk7CisJcGFydC0+YmxvY2tfY291bnQgPSBiZW5kaWFuX2ludChlZmlfbGJhIC0gc3RhcnQvMjA0OCAtIDEwKTsKKwlzdHJjcHkocGFydC0+bmFtZSwgIklTTyIpOworCXN0cmNweShwYXJ0LT50eXBlLCAiQXBwbGVfRnJlZSIpOworCXBhcnQtPmRhdGFfc3RhcnQgPSBiZW5kaWFuX2ludCgwKTsKKwlwYXJ0LT5kYXRhX2NvdW50ID0gYmVuZGlhbl9pbnQoZWZpX2xiYSAtIHN0YXJ0LzIwNDggLSAxMCk7CisJcGFydC0+c3RhdHVzID0gYmVuZGlhbl9pbnQoMHgwMSk7CisgICAgfQorfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgRklMRSAqZnAgPSBOVUxMOworICAgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEwsICpidWZ6ID0gTlVMTDsKKyAgICBpbnQgY3lsc2l6ZSA9IDAsIGZyYWMgPSAwOworICAgIHNpemVfdCBvcmlnX2dwdF9zaXplLCBmcmVlX3NwYWNlLCBncHRfc2l6ZTsKKyAgICBzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciBkZXNjcmlwdG9yOworCisgICAgcHJvZyA9IHN0cmNweShhbGxvY2Eoc3RybGVuKGFyZ3ZbMF0pICsgMSksIGFyZ3ZbMF0pOworICAgIGkgPSBjaGVja19vcHRpb24oYXJnYywgYXJndik7CisgICAgYXJnYyAtPSBpOworICAgIGFyZ3YgKz0gaTsKKworICAgIGlmICghYXJnYykKKyAgICB7CisgICAgICAgIHVzYWdlKCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICgobW9kZSAmIEVGSSkgJiYgb2Zmc2V0KQorCWVycngoMSwgIiVzOiAtLW9mZnNldCBpcyBpbnZhbGlkIHdpdGggVUVGSSBpbWFnZXNcbiIsIGFyZ3ZbMF0pOworCisgICAgc3JhbmQodGltZShOVUxMKSA8PCAoZ2V0cHBpZCgpIDw8IGdldHBpZCgpKSk7CisKKyAgICBpZiAoIShmcCA9IGZvcGVuKGFyZ3ZbMF0sICJyKyIpKSkKKyAgICAgICAgZXJyKDEsICJjb3VsZCBub3Qgb3BlbiBmaWxlIGAlcyciLCBhcmd2WzBdKTsKKworICAgIGlmIChmc2Vla28oZnAsIChvZmZfdCkgKDE2IDw8IDExKSwgU0VFS19TRVQpKQorICAgICAgICBlcnIoMSwgIiVzOiBzZWVrIGVycm9yIC0gMCIsIGFyZ3ZbMF0pOworCisgICAgaWYgKGZyZWFkKCZkZXNjcmlwdG9yLCBzaXplb2YoY2hhciksIHNpemVvZihkZXNjcmlwdG9yKSwgZnApICE9IHNpemVvZihkZXNjcmlwdG9yKSkKKyAgICAgICAgZXJyKDEsICIlczogcmVhZCBlcnJvciAtIDAiLCBhcmd2WzBdKTsKKworICAgIGlmIChmc2Vla28oZnAsIChvZmZfdCkgMTcgKiAyMDQ4LCBTRUVLX1NFVCkpCisgICAgICAgIGVycigxLCAiJXM6IHNlZWsgZXJyb3IgLSAxIiwgYXJndlswXSk7CisKKyAgICBidWZ6ID0gYnVmID0gY2FsbG9jKEJVRlNJWkUsIHNpemVvZihjaGFyKSk7CisgICAgaWYgKGZyZWFkKGJ1Ziwgc2l6ZW9mKGNoYXIpLCBCVUZTSVpFLCBmcCkgIT0gQlVGU0laRSkKKyAgICAgICAgZXJyKDEsICIlcyIsIGFyZ3ZbMF0pOworCisgICAgaWYgKGNoZWNrX2Jhbm5lcihidWYpKQorICAgICAgICBlcnJ4KDEsICIlczogY291bGQgbm90IGZpbmQgYm9vdCByZWNvcmQiLCBhcmd2WzBdKTsKKworICAgIGlmIChtb2RlICYgVkVSQk9TRSkKKyAgICAgICAgcHJpbnRmKCJjYXRhbG9ndWUgb2Zmc2V0OiAlZFxuIiwgY2F0b2Zmc2V0KTsKKworICAgIGlmIChmc2Vla28oZnAsICgob2ZmX3QpIGNhdG9mZnNldCkgKiAyMDQ4LCBTRUVLX1NFVCkpCisgICAgICAgIGVycigxLCAiJXM6IHNlZWsgZXJyb3IgLSAyIiwgYXJndlswXSk7CisKKyAgICBidWYgPSBidWZ6OworICAgIG1lbXNldChidWYsIDAsIEJVRlNJWkUpOworICAgIGlmIChmcmVhZChidWYsIHNpemVvZihjaGFyKSwgQlVGU0laRSwgZnApICE9IEJVRlNJWkUpCisgICAgICAgIGVycigxLCAiJXMiLCBhcmd2WzBdKTsKKworICAgIGlmIChjaGVja19jYXRhbG9ndWUoYnVmKSkKKyAgICAgICAgZXJyeCgxLCAiJXM6IGludmFsaWQgYm9vdCBjYXRhbG9ndWUiLCBhcmd2WzBdKTsKKworICAgIGJ1ZiArPSBzaXplb2YodmUpOworICAgIGlmIChyZWFkX2NhdGFsb2d1ZShidWYpKQorICAgICAgICBlcnJ4KDEsICIlczogdW5leHBlY3RlZCBib290IGNhdGFsb2d1ZSBwYXJhbWV0ZXJzIiwgYXJndlswXSk7CisKKyAgICBpZiAobW9kZSAmIFZFUkJPU0UpCisgICAgICAgIGRpc3BsYXlfY2F0YWxvZ3VlKCk7CisKKyAgICBidWYgKz0gMzI7CisKKyAgICBpZiAobW9kZSAmIEVGSSkKKyAgICB7CisJaWYgKCFyZWFkX2VmaV9zZWN0aW9uKGJ1ZikpIHsKKwkgICAgYnVmICs9IDMyOworCSAgICBpZiAoIXJlYWRfZWZpX2NhdGFsb2d1ZShidWYsICZlZmlfY291bnQsICZlZmlfbGJhKSAmJiBlZmlfbGJhKSB7CisJCW9mZnNldCA9IDA7CisJICAgIH0gZWxzZSB7CisJCWVycngoMSwgIiVzOiBpbnZhbGlkIGVmaSBjYXRhbG9ndWUiLCBhcmd2WzBdKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGVycngoMSwgIiVzOiB1bmFibGUgdG8gZmluZCBlZmkgaW1hZ2UiLCBhcmd2WzBdKTsKKwl9CisgICAgfQorCisgICAgYnVmICs9IDMyOworCisgICAgaWYgKG1vZGUgJiBNQUMpCisgICAgeworCWlmICghcmVhZF9lZmlfc2VjdGlvbihidWYpKSB7CisJICAgIGJ1ZiArPSAzMjsKKwkgICAgaWYgKCFyZWFkX2VmaV9jYXRhbG9ndWUoYnVmLCAmbWFjX2NvdW50LCAmbWFjX2xiYSkgJiYgbWFjX2xiYSkgeworCQlvZmZzZXQgPSAwOworCSAgICB9IGVsc2UgeworCQllcnJ4KDEsICIlczogaW52YWxpZCBlZmkgY2F0YWxvZ3VlIiwgYXJndlswXSk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBlcnJ4KDEsICIlczogdW5hYmxlIHRvIGZpbmQgbWFjIGVmaSBpbWFnZSIsIGFyZ3ZbMF0pOworCX0KKyAgICB9CisKKyAgICBpZiAoZnNlZWtvKGZwLCAoKChvZmZfdCkgZGVfbGJhKSAqIDIwNDggKyAweDQwKSwgU0VFS19TRVQpKQorICAgICAgICBlcnIoMSwgIiVzOiBzZWVrIGVycm9yIC0gMyIsIGFyZ3ZbMF0pOworCisgICAgYnVmID0gYnVmejsKKyAgICBtZW1zZXQoYnVmLCAwLCBCVUZTSVpFKTsKKyAgICBpZiAoZnJlYWQoYnVmLCBzaXplb2YoY2hhciksIDQsIGZwKSAhPSA0KQorICAgICAgICBlcnIoMSwgIiVzIiwgYXJndlswXSk7CisKKyAgICBpZiAobWVtY21wKGJ1ZiwgIlx4RkJceEMwXHg3OFx4NzAiLCA0KSkKKyAgICAgICAgZXJyeCgxLCAiJXM6IGJvb3QgbG9hZGVyIGRvZXMgbm90IGhhdmUgYW4gaXNvbGludXguYmluIGh5YnJpZCAiIFwKKyAgICAgICAgICAgICAgICAgInNpZ25hdHVyZS4gTm90ZSB0aGF0IGlzb2xpbnV4LWRlYnVnLmJpbiBkb2VzIG5vdCBzdXBwb3J0ICIgXAorICAgICAgICAgICAgICAgICAiaHlicmlkIGJvb3RpbmciLCBhcmd2WzBdKTsKKworICAgIGlmIChzdGF0KGFyZ3ZbMF0sICZpc29zdGF0KSkKKyAgICAgICAgZXJyKDEsICIlcyIsIGFyZ3ZbMF0pOworCisgICAgaXNvc2l6ZSA9IGxlbmRpYW5faW50KGRlc2NyaXB0b3Iuc2l6ZSkgKiBsZW5kaWFuX3Nob3J0KGRlc2NyaXB0b3IuYmxvY2tfc2l6ZSk7CisgICAgZnJlZV9zcGFjZSA9IGlzb3N0YXQuc3Rfc2l6ZSAtIGlzb3NpemU7CisKKyAgICBjeWxzaXplID0gaGVhZCAqIHNlY3RvciAqIDUxMjsKKyAgICBmcmFjID0gaXNvc3RhdC5zdF9zaXplICUgY3lsc2l6ZTsKKyAgICBwYWRkaW5nID0gKGZyYWMgPiAwKSA/IGN5bHNpemUgLSBmcmFjIDogMDsKKworICAgIGlmIChtb2RlICYgVkVSQk9TRSkKKyAgICAgICAgcHJpbnRmKCJpbWdzaXplOiAlenUsIHBhZGRpbmc6ICVkXG4iLCAoc2l6ZV90KWlzb3N0YXQuc3Rfc2l6ZSwgcGFkZGluZyk7CisKKyAgICBjYyA9IGMgPSAoIGlzb3N0YXQuc3Rfc2l6ZSArIHBhZGRpbmcpIC8gY3lsc2l6ZTsKKyAgICBpZiAoYyA+IDEwMjQpCisgICAgeworICAgICAgICB3YXJueCgiV2FybmluZzogbW9yZSB0aGFuIDEwMjQgY3lsaW5kZXJzOiAlZCIsIGMpOworICAgICAgICB3YXJueCgiTm90IGFsbCBCSU9TZXMgd2lsbCBiZSBhYmxlIHRvIGJvb3QgdGhpcyBkZXZpY2UiKTsKKyAgICAgICAgY2MgPSAxMDI0OworICAgIH0KKworICAgIGlmICghaWQpCisgICAgeworICAgICAgICBpZiAoZnNlZWtvKGZwLCAob2ZmX3QpIDQ0MCwgU0VFS19TRVQpKQorICAgICAgICAgICAgZXJyKDEsICIlczogc2VlayBlcnJvciAtIDQiLCBhcmd2WzBdKTsKKworCWlmIChmcmVhZCgmaWQsIDEsIDQsIGZwKSAhPSA0KQorCSAgICBlcnIoMSwgIiVzOiByZWFkIGVycm9yIiwgYXJndlswXSk7CisKKyAgICAgICAgaWQgPSBsZW5kaWFuX2ludChpZCk7CisgICAgICAgIGlmICghaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtb2RlICYgVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBwcmludGYoInJhbmRvbSAiKTsKKyAgICAgICAgICAgIGlkID0gcmFuZCgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtb2RlICYgVkVSQk9TRSkKKyAgICAgICAgcHJpbnRmKCJpZDogJXVcbiIsIGlkKTsKKworICAgIGJ1ZiA9IGJ1Zno7CisgICAgbWVtc2V0KGJ1ZiwgMCwgQlVGU0laRSk7CisgICAgaSA9IGluaXRpYWxpc2VfbWJyKGJ1Zik7CisKKyAgICBpZiAobW9kZSAmIFZFUkJPU0UpCisgICAgICAgIGRpc3BsYXlfbWJyKGJ1ZiwgaSk7CisKKyAgICBpZiAoZnNlZWtvKGZwLCAob2ZmX3QpIDAsIFNFRUtfU0VUKSkKKyAgICAgICAgZXJyKDEsICIlczogc2VlayBlcnJvciAtIDUiLCBhcmd2WzBdKTsKKworICAgIGlmIChmd3JpdGUoYnVmLCBzaXplb2YoY2hhciksIGksIGZwKSAhPSAoc2l6ZV90KWkpCisgICAgICAgIGVycigxLCAiJXM6IHdyaXRlIGVycm9yIC0gMSIsIGFyZ3ZbMF0pOworCisgICAgaWYgKGVmaV9sYmEpIHsKKwlyZXZlcnNlX3V1aWQoYmFzaWNfcGFydGl0aW9uKTsKKwlyZXZlcnNlX3V1aWQoaGZzX3BhcnRpdGlvbik7CisKKwkvKiA1MTIgYnl0ZSBoZWFkZXIsIDEyOCBlbnRyaWVzIG9mIDEyOCBieXRlcyAqLworCW9yaWdfZ3B0X3NpemUgPSBncHRfc2l6ZSA9IDUxMiArICgxMjggKiAxMjgpOworCisJLyogTGVhdmUgc3BhY2UgZm9yIHRoZSBBUE0gaWYgbmVjZXNzYXJ5ICovCisJaWYgKG1hY19sYmEpCisJICAgIGdwdF9zaXplICs9ICg0ICogMjA0OCk7CisKKwlidWYgPSBjYWxsb2MoZ3B0X3NpemUsIHNpemVvZihjaGFyKSk7CisJbWVtc2V0KGJ1ZiwgMCwgZ3B0X3NpemUpOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgc2Vjb25kYXJ5IEdQVC4KKwkgKiBVbmxpa2UgdGhlIHByaW1hcnksIHRoaXMgZG9lc24ndCBuZWVkIGEgaG9sZSBmb3IgdGhlIEFQTS4gV2Ugc3RpbGwKKwkgKiB3YW50IHRvIGJlIDFNQiBhbGlnbmVkIHNvIGp1c3QgYnVtcCB0aGUgcGFkZGluZyBieSBhIG1lZ2FieXRlLgorCSAqLworCWlmIChmcmVlX3NwYWNlIDwgb3JpZ19ncHRfc2l6ZSAmJiBwYWRkaW5nIDwgb3JpZ19ncHRfc2l6ZSkgeworCSAgICBwYWRkaW5nICs9IDEwMjQgKiAxMDI0OworCX0KKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBJU08gZmlsZXN5c3RlbS4gVGhpcyB3aWxsIGRlZmluZSB0aGUgc2l6ZQorCSAqIG9mIHRoZSBwYXJ0aXRpb24gdGhhdCBjb3ZlcnMgaXQuCisJICovCisJcHNpemUgPSBpc29zaXplIC8gNTEyOworCisJLyoKKwkgKiBQcmltYXJ5IEdQVCBzdGFydHMgYXQgc2VjdG9yIDEsIHNlY29uZGFyeSBHUFQgc3RhcnRzIGF0IDEgc2VjdG9yCisJICogYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGltYWdlCisJICovCisJaW5pdGlhbGlzZV9ncHQoYnVmLCAxLCAoaXNvc3RhdC5zdF9zaXplICsgcGFkZGluZyAtIDUxMikgLyA1MTIsIDEpOworCisJaWYgKGZzZWVrbyhmcCwgKG9mZl90KSA1MTIsIFNFRUtfU0VUKSkKKwkgICAgZXJyKDEsICIlczogc2VlayBlcnJvciAtIDYiLCBhcmd2WzBdKTsKKworCWlmIChmd3JpdGUoYnVmLCBzaXplb2YoY2hhciksIGdwdF9zaXplLCBmcCkgIT0gKHNpemVfdClncHRfc2l6ZSkKKwkgICAgZXJyKDEsICIlczogd3JpdGUgZXJyb3IgLSAyIiwgYXJndlswXSk7CisgICAgfQorCisgICAgaWYgKG1hY19sYmEpCisgICAgeworCS8qIEFwcGxlIHBhcnRpdGlvbiBlbnRyaWVzIGZpbGxpbmcgMjA0OCBieXRlcyBlYWNoICovCisJaW50IGFwbV9zaXplID0gYXBtX3BhcnRzICogMjA0ODsKKworCWJ1ZiA9IHJlYWxsb2MoYnVmLCBhcG1fc2l6ZSk7CisJbWVtc2V0KGJ1ZiwgMCwgYXBtX3NpemUpOworCisJaW5pdGlhbGlzZV9hcG0oYnVmLCBBUE1fT0ZGU0VUKTsKKworCWZzZWVrbyhmcCwgKG9mZl90KSBBUE1fT0ZGU0VULCBTRUVLX1NFVCk7CisJZndyaXRlKGJ1Ziwgc2l6ZW9mKGNoYXIpLCBhcG1fc2l6ZSwgZnApOworICAgIH0KKworICAgIGlmIChwYWRkaW5nKQorICAgIHsKKyAgICAgICAgaWYgKGZzeW5jKGZpbGVubyhmcCkpKQorICAgICAgICAgICAgZXJyKDEsICIlczogY291bGQgbm90IHN5bmNocm9uaXNlIiwgYXJndlswXSk7CisKKyAgICAgICAgaWYgKGZ0cnVuY2F0ZShmaWxlbm8oZnApLCBpc29zdGF0LnN0X3NpemUgKyBwYWRkaW5nKSkKKyAgICAgICAgICAgIGVycigxLCAiJXM6IGNvdWxkIG5vdCBhZGQgcGFkZGluZyBieXRlcyIsIGFyZ3ZbMF0pOworICAgIH0KKworICAgIGlmIChlZmlfbGJhKSB7CisJYnVmID0gcmVhbGxvYyhidWYsIG9yaWdfZ3B0X3NpemUpOworCW1lbXNldChidWYsIDAsIG9yaWdfZ3B0X3NpemUpOworCisJYnVmICs9IG9yaWdfZ3B0X3NpemUgLSBzaXplb2Yoc3RydWN0IGdwdF9oZWFkZXIpOworCisJaW5pdGlhbGlzZV9ncHQoYnVmLCAoaXNvc3RhdC5zdF9zaXplICsgcGFkZGluZyAtIDUxMikgLyA1MTIsIDEsIDApOworCisJLyogU2hpZnQgYmFjayBmYXIgZW5vdWdoIHRvIHdyaXRlIHRoZSAxMjggR1BUIGVudHJpZXMgKi8KKwlidWYgLT0gMTI4ICogc2l6ZW9mKHN0cnVjdCBncHRfcGFydF9oZWFkZXIpOworCisJLyoKKwkgKiBTZWVrIGZhciBlbm91Z2ggYmFjayB0aGF0IHRoZSBncHQgaGVhZGVyIGlzIDUxMiBieXRlcyBiZWZvcmUgdGhlCisJICogZW5kIG9mIHRoZSBpbWFnZQorCSAqLworCisJaWYgKGZzZWVrbyhmcCwgKGlzb3N0YXQuc3Rfc2l6ZSArIHBhZGRpbmcpIC0gb3JpZ19ncHRfc2l6ZSwgU0VFS19TRVQpKQorCSAgICBlcnIoMSwgIiVzOiBzZWVrIGVycm9yIC0gOCIsIGFyZ3ZbMF0pOworCisJaWYgKGZ3cml0ZShidWYsIHNpemVvZihjaGFyKSwgb3JpZ19ncHRfc2l6ZSwgZnApICE9IG9yaWdfZ3B0X3NpemUpCisJICAgIGVycigxLCAiJXM6IHdyaXRlIGVycm9yIC0gNCIsIGFyZ3ZbMF0pOworICAgIH0KKworICAgIGZyZWUoYnVmKTsKKyAgICBmY2xvc2UoZnApOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlscy9pc29oeWJyaWQuaCBiL3V0aWxzL2lzb2h5YnJpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlY2YxY2EKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9pc29oeWJyaWQuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogaXNvaHlicmlkLmg6IGhlYWRlciBmaWxlIGZvciBpc29oeWJyaWQuYzogUG9zdCBwcm9jZXNzIGFuIElTTyA5NjYwIGltYWdlCisgKiBnZW5lcmF0ZWQgd2l0aCBta2lzb2ZzIG9yIGdlbmlzb2ltYWdlIHRvIGFsbG93IC0gaHlicmlkIGJvb3RpbmcgLSBhcyBhCisgKiBDRC1ST00gb3IgYXMgYSBoYXJkIGRpc2suCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdlZXJ0IFN0YXBwZXJzIDxzdGFwcGVyc0BzdGFwcGVycy5ubD4KKyAqCisgKiBpc29oeWJyaWQgaXMgYSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIGxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiB2ZXJzaW9uLgorICoKKyAqIGlzb2h5YnJpZCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBpc29oeWJyaWQ7IGlmIG5vdCwgc2VlOiA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzPi4KKyAqCisgKi8KKworI2RlZmluZSBWRVJTSU9OICAgICAiMC4xMiIKKyNkZWZpbmUgQlVGU0laRSAgICAgMjA0OAorI2RlZmluZSBNQlJTSVpFICAgICAgNDMyCisKKy8qIEVuZCBvZiBoZWFkZXIgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvdXRpbHMvaXNvaHlicmlkLmluIGIvdXRpbHMvaXNvaHlicmlkLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjc3ODQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9pc29oeWJyaWQuaW4KQEAgLTAsMCArMSwyNTggQEAKKyMhL3Vzci9iaW4vcGVybAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAyLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIworIyBQb3N0LXByb2Nlc3MgYW4gSVNPIDk2NjAgaW1hZ2UgZ2VuZXJhdGVkIHdpdGggbWtpc29mcy9nZW5pc29pbWFnZQorIyB0byBhbGxvdyAiaHlicmlkIGJvb3RpbmciIGFzIGEgQ0QtUk9NIG9yIGFzIGEgaGFyZCBkaXNrLgorIworCit1c2UgYnl0ZXM7Cit1c2UgRmNudGw7CisKKyMgVXNlci1zcGVjaWZ5YWJsZSBvcHRpb25zCislb3B0ID0gKAorICAgICMgRmFrZSBnZW9tZXRyeSAoemlwZHJpdmUtc3R5bGUuLi4pCisgICAgJ2gnICAgICAgPT4gNjQsCisgICAgJ3MnICAgICAgPT4gMzIsCisgICAgIyBQYXJ0aXRpb24gbnVtYmVyCisgICAgJ2VudHJ5JyAgPT4gMSwKKyAgICAjIFBhcnRpdGlvbiBvZmZzZXQKKyAgICAnb2Zmc2V0JyA9PiAwLAorICAgICMgUGFydGl0aW9uIHR5cGUKKyAgICAndHlwZScgICA9PiAweDE3LAkJIyAiV2luZG93cyBoaWRkZW4gSUZTIgorICAgICMgTUJSIElECisgICAgJ2lkJyAgICAgPT4gdW5kZWYsCispOworCisldmFsaWRfcmFuZ2UgPSAoCisgICAgJ2gnICAgICAgPT4gWzEsIDI1Nl0sCisgICAgJ3MnICAgICAgPT4gWzEsIDYzXSwKKyAgICAnZW50cnknICA9PiBbMSwgNF0sCisgICAgJ29mZnNldCcgPT4gWzAsIDY0XSwKKyAgICAndHlwZScgICA9PiBbMCwgMjU1XSwKKyAgICAnaWQnICAgICA9PiBbMCwgMHhmZmZmZmZmZl0sCisgICAgJ2hkMCcgICAgPT4gWzAsIDJdLAorICAgICdwYXJ0b2snID0+IFswLCAxXSwKKyk7CisKKyMgQm9vbGVhbiBvcHRpb25zIGp1c3Qgc2V0IG90aGVyIG9wdGlvbnMKKyVib29sX29wdCA9ICgKKyAgICAnbm9oZDAnICAgID0+IFsnaGQwJywgMF0sCisgICAgJ2ZvcmNlaGQwJyA9PiBbJ2hkMCcsIDFdLAorICAgICdjdHJsaGQwJyAgPT4gWydoZDAnLCAyXSwKKyAgICAnbm9wYXJ0b2snID0+IFsncGFydG9rJywgMF0sCisgICAgJ3BhcnRvaycgICA9PiBbJ3BhcnRvaycsIDFdLAorKTsKKworc3ViIHVzYWdlKCkgeworICAgIHByaW50IFNUREVSUiAiVXNhZ2U6ICQwIFtvcHRpb25zXSBmaWxlbmFtZS5pc29cbiIsCisgICAgIk9wdGlvbnM6XG4iLAorICAgICIgIC1oICAgICAgICAgIE51bWJlciBvZiBkZWZhdWx0IGdlb21ldHJ5IGhlYWRzXG4iLAorICAgICIgIC1zICAgICAgICAgIE51bWJlciBvZiBkZWZhdWx0IGdlb21ldHJ5IHNlY3RvcnNcbiIsCisgICAgIiAgLWVudHJ5ICAgICAgU3BlY2lmeSBwYXJ0aXRpb24gZW50cnkgbnVtYmVyICgxLTQpXG4iLAorICAgICIgIC1vZmZzZXQgICAgIFNwZWNpZnkgcGFydGl0aW9uIG9mZnNldCAoZGVmYXVsdCAwKVxuIiwKKyAgICAiICAtdHlwZSAgICAgICBTcGVjaWZ5IHBhcnRpdGlvbiB0eXBlIChkZWZhdWx0IDB4MTcpXG4iLAorICAgICIgIC1pZCAgICAgICAgIFNwZWNpZnkgTUJSIElEIChkZWZhdWx0IHJhbmRvbSlcbiIsCisgICAgIiAgLWZvcmNlaGQwICAgQWx3YXlzIGFzc3VtZSB3ZSBhcmUgbG9hZGVkIGFzIGRpc2sgSUQgMFxuIiwKKyAgICAiICAtY3RybGhkMCAgICBBc3N1bWUgZGlzayBJRCAwIGlmIHRoZSBDdHJsIGtleSBpcyBwcmVzc2VkXG4iLAorICAgICIgIC1wYXJ0b2sgICAgIEFsbG93IGJvb3RpbmcgZnJvbSB3aXRoaW4gYSBwYXJ0aXRpb25cbiI7CisgICAgZXhpdCAxOworfQorCisjIFBhcnNlIGEgQy1zdHlsZSBpbnRlZ2VyIChkZWNpbWFsL29jdGFsL2hleCkKK3N1YiBkb2goJCkgeworICAgIG15KCRuKSA9IEBfOworICAgIHJldHVybiAoJG4gPX4gL14wLykgPyBvY3QgJG4gOiAkbiswOworfQorCitzdWIgZ2V0X3JhbmRvbSgpIHsKKyAgICAjIEdldCBhIDMyLWJpdCByYW5kb20gbnVtYmVyCisgICAgbXkgJHJmZCwgJHJuZDsKKyAgICBteSAkcmlkOworCisgICAgaWYgKG9wZW4oJHJmZCwgIjwgL2Rldi91cmFuZG9tXDAiKSAmJiByZWFkKCRyZmQsICRybmQsIDQpID09IDQpIHsKKwkkcmlkID0gdW5wYWNrKCJWIiwgJHJuZCk7CisgICAgfQorCisgICAgY2xvc2UoJHJmZCkgaWYgKGRlZmluZWQoJHJmZCkpOworICAgIHJldHVybiAkcmlkIGlmIChkZWZpbmVkKCRyaWQpKTsKKworICAgICMgVGhpcyBzdWNrcyBidXQgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4uLgorICAgIHJldHVybiAoJCQrdGltZSgpKSAmIDB4ZmZmZmZmZmY7Cit9CisKK3N1YiBnZXRfaGV4X2RhdGEoKSB7CisgICAgbXkgJG1iciA9ICcnOworICAgIG15ICRsaW5lLCAkYnl0ZTsKKyAgICB3aGlsZSAoICRsaW5lID0gPERBVEE+ICkgeworCWNob21wICRsaW5lOworCWxhc3QgaWYgKCRsaW5lIGVxICcqJyk7CisJZm9yZWFjaCAkYnl0ZSAoIHNwbGl0KC9ccysvLCAkbGluZSkgKSB7CisJICAgICRtYnIgLj0gY2hyKGhleCgkYnl0ZSkpOworCX0KKyAgICB9CisgICAgcmV0dXJuICRtYnI7Cit9CisKK3doaWxlICgkQVJHVlswXSA9fiAvXlwtKC4qKSQvKSB7CisgICAgJG8gPSAkMTsKKyAgICBzaGlmdCBAQVJHVjsKKyAgICBpZiAoZGVmaW5lZCgkYm9vbF9vcHR7JG99KSkgeworCSgkbywgJHYpID0gQHskYm9vbF9vcHR7JG99fTsKKwkkb3B0eyRvfSA9ICR2OworICAgIH0gZWxzaWYgKGV4aXN0cygkb3B0eyRvfSkpIHsKKwkkb3B0eyRvfSA9IGRvaChzaGlmdCBAQVJHVik7CisJaWYgKGRlZmluZWQoJHZhbGlkX3JhbmdleyRvfSkpIHsKKwkgICAgKCRsLCAkaCkgPSBAeyR2YWxpZF9yYW5nZXskb319OworCSAgICBpZiAoJG9wdHskb30gPCAkbCB8fCAkb3B0eyRvfSA+ICRoKSB7CisJCWRpZSAiJDA6IHZhbGlkIHZhbHVlcyBmb3IgdGhlIC0kbyBwYXJhbWV0ZXIgYXJlICRsIHRvICRoXG4iOworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisJdXNhZ2UoKTsKKyAgICB9Cit9CisKKygkZmlsZSkgPSBAQVJHVjsKKworaWYgKCFkZWZpbmVkKCRmaWxlKSkgeworICAgIHVzYWdlKCk7Cit9CisKK29wZW4oRklMRSwgIis8ICRmaWxlXDAiKSBvciBkaWUgIiQwOiBjYW5ub3Qgb3BlbiAkZmlsZTogJCFcbiI7CitiaW5tb2RlIEZJTEU7CisKKyMKKyMgRmlyc3QsIGFjdHVhbGx5IGZpZ3VyZSBvdXQgd2hlcmUgbWtpc29mcyBoaWQgaXNvbGludXguYmluCisjCitzZWVrKEZJTEUsIDE3KjIwNDgsIFNFRUtfU0VUKSBvciBkaWUgIiQwOiAkZmlsZTogJCFcbiI7CityZWFkKEZJTEUsICRib290X3JlY29yZCwgMjA0OCkgPT0gMjA0OCBvciBkaWUgIiQwOiAkZmlsZTogcmVhZCBlcnJvclxuIjsKKygkYnJfc2lnbiwgJGJyX2NhdF9vZmZzZXQpID0gdW5wYWNrKCJhNzFWIiwgJGJvb3RfcmVjb3JkKTsKK2lmICgkYnJfc2lnbiBuZSAoIlwwQ0QwMDFcMUVMIFRPUklUTyBTUEVDSUZJQ0FUSU9OIiAuICgiXDAiIHggNDEpKSkgeworICAgIGRpZSAiJDA6ICRmaWxlOiBubyBib290IHJlY29yZCBmb3VuZFxuIjsKK30KK3NlZWsoRklMRSwgJGJyX2NhdF9vZmZzZXQqMjA0OCwgU0VFS19TRVQpIG9yIGRpZSAiJDA6ICRmaWxlOiAkIVxuIjsKK3JlYWQoRklMRSwgJGJvb3RfY2F0LCAyMDQ4KSA9PSAyMDQ4IG9yIGRpZSAiJDA6ICRmaWxlOiByZWFkIGVycm9yXG4iOworCisjIFdlIG11c3QgaGF2ZSBhIFZhbGlkYXRpb24gRW50cnkgZm9sbG93ZWQgYnkgYSBEZWZhdWx0IEVudHJ5Li4uCisjIG5vIGZhbmNpbmVzcyBhbGxvd2VkIGZvciB0aGUgSHlicmlkIG1vZGUgW1hYWDogbWlnaHQgcmVsYXggdGhpcyBsYXRlcl0KK0B2ZSA9IHVucGFjaygidjE2IiwgJGJvb3RfY2F0KTsKKyRjcyA9IDA7Citmb3IgKCRpID0gMDsgJGkgPCAxNjsgJGkrKykgeworICAgICRjcyArPSAkdmVbJGldOworfQoraWYgKCR2ZVswXSAhPSAweDAwMDEgfHwgJHZlWzE1XSAhPSAweGFhNTUgfHwgJGNzICYgMHhmZmZmKSB7CisgICAgZGllICIkMDogJGZpbGU6IGludmFsaWQgYm9vdCBjYXRhbG9nXG4iOworfQorKCRkZV9ib290LCAkZGVfbWVkaWEsICRkZV9zZWcsICRkZV9zeXMsICRkZV9tYnoxLCAkZGVfY291bnQsIAorICRkZV9sYmEsICRkZV9tYnoyKSA9IHVucGFjaygiQ0N2Q0N2VnYiLCBzdWJzdHIoJGJvb3RfY2F0LCAzMiwgMzIpKTsKK2lmICgkZGVfYm9vdCAhPSAweDg4IHx8ICRkZV9tZWRpYSAhPSAwIHx8CisgICAgKCRkZV9zZWdtZW50ICE9IDAgJiYgJGRlX3NlZ21lbnQgIT0gMHg3YzApIHx8ICRkZV9jb3VudCAhPSA0KSB7CisgICAgZGllICIkMDogJGZpbGU6IHVuZXhwZWN0ZWQgYm9vdCBjYXRhbG9nIHBhcmFtZXRlcnNcbiI7Cit9CisKKyMgTm93ICRkZV9sYmEgc2hvdWxkIGNvbnRhaW4gdGhlIENEIHNlY3RvciBudW1iZXIgZm9yIGlzb2xpbnV4LmJpbgorc2VlayhGSUxFLCAkZGVfbGJhKjIwNDgrMHg0MCwgU0VFS19TRVQpIG9yIGRpZSAiJDA6ICRmaWxlOiAkIVxuIjsKK3JlYWQoRklMRSwgJGlic2lnLCA0KTsKK2lmICgkaWJzaWcgbmUgIlx4ZmJceGMwXHg3OFx4NzAiKSB7CisgICAgZGllICIkMDogJGZpbGU6IGJvb3Rsb2FkZXIgZG9lcyBub3QgaGF2ZSBhIGlzb2xpbnV4LmJpbiBoeWJyaWQgc2lnbmF0dXJlLiIuCisgICAgICAgICJOb3RlIHRoYXQgaXNvbGludXgtZGVidWcuYmluIGRvZXMgbm90IHN1cHBvcnQgaHlicmlkIGJvb3RpbmcuXG4iOworfQorCisjIEdldCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaW1hZ2UKKyhAaW1nc3RhdCA9IHN0YXQoRklMRSkpIG9yIGRpZSAiJDA6ICRmaWxlOiAkIVxuIjsKKyRpbWdzaXplID0gJGltZ3N0YXRbN107CitpZiAoISRpbWdzaXplKSB7CisgICAgZGllICIkMDogJGZpbGU6IGNhbm5vdCBkZXRlcm1pbmUgbGVuZ3RoIG9mIGZpbGVcbiI7Cit9CisjIFRhcmdldCBpbWFnZSBzaXplOiByb3VuZCB1cCB0byBhIG11bHRpcGxlIG9mICRoKiRzKjUxMgorJGggPSAkb3B0eydoJ307CiskcyA9ICRvcHR7J3MnfTsKKyRjeWxzaXplID0gJGgqJHMqNTEyOworJGZyYWMgPSAkaW1nc2l6ZSAlICRjeWxzaXplOworJHBhZGRpbmcgPSAoJGZyYWMgPiAwKSA/ICRjeWxzaXplIC0gJGZyYWMgOiAwOworJGltZ3NpemUgKz0gJHBhZGRpbmc7CiskYyA9IGludCgkaW1nc2l6ZS8kY3lsc2l6ZSk7CitpZiAoJGMgPiAxMDI0KSB7CisgICAgcHJpbnQgU1RERVJSICJXYXJuaW5nOiBtb3JlIHRoYW4gMTAyNCBjeWxpbmRlcnMgKCRjKS5cbiI7CisgICAgcHJpbnQgU1RERVJSICJOb3QgYWxsIEJJT1NlcyB3aWxsIGJlIGFibGUgdG8gYm9vdCB0aGlzIGRldmljZS5cbiI7CisgICAgJGNjID0gMTAyNDsKK30gZWxzZSB7CisgICAgJGNjID0gJGM7Cit9CisKKyMgUHJlc2VydmUgaWQgd2hlbiBydW4gYWdhaW4KK2lmIChkZWZpbmVkKCRvcHR7J2lkJ30pKSB7CisgICAgJGlkID0gcGFjaygiViIsIGRvaCgkb3B0eydpZCd9KSk7Cit9IGVsc2UgeworICAgIHNlZWsoRklMRSwgNDQwLCBTRUVLX1NFVCkgb3IgZGllICIkMDogJGZpbGU6ICQhXG4iOworICAgIHJlYWQoRklMRSwgJGlkLCA0KTsKKyAgICBpZiAoJGlkIGVxICJceDAwXHgwMFx4MDBceDAwIikgeworCSRpZCA9IHBhY2soIlYiLCBnZXRfcmFuZG9tKCkpOworICAgIH0KK30KKworIyBQcmludCB0aGUgTUJSIGFuZCBwYXJ0aXRpb24gdGFibGUKK3NlZWsoRklMRSwgMCwgU0VFS19TRVQpIG9yIGRpZSAiJDA6ICRmaWxlOiAkIVxuIjsKKworZm9yICgkaSA9IDA7ICRpIDw9ICRvcHR7J2hkMCd9KzMqJG9wdHsncGFydG9rJ307ICRpKyspIHsKKyAgICAkbWJyID0gZ2V0X2hleF9kYXRhKCk7Cit9CitpZiAoIGxlbmd0aCgkbWJyKSA+IDQzMiApIHsKKyAgICBkaWUgIiQwOiBCYWQgTUJSIGNvZGVcbiI7Cit9CisKKyRtYnIgLj0gIlwwIiB4ICg0MzIgLSBsZW5ndGgoJG1icikpOworCiskbWJyIC49IHBhY2soIlZWIiwgJGRlX2xiYSo0LCAwKTsgCSMgT2Zmc2V0IDQzMjogTEJBIG9mIGlzb2xpbnV4LmJpbgorJG1iciAuPSAkaWQ7CQkJCSMgT2Zmc2V0IDQ0MDogTUJSIElECiskbWJyIC49ICJcMFwwIjsJCQkJIyBPZmZzZXQgNDQ2OiBhY3R1YWwgcGFydGl0aW9uIHRhYmxlCisKKyMgUHJpbnQgcGFydGl0aW9uIHRhYmxlCiskb2Zmc2V0ICA9ICRvcHR7J29mZnNldCd9OworJHBzaXplICAgPSAkYyokaCokcyAtICRvZmZzZXQ7CiskYmhlYWQgICA9IGludCgkb2Zmc2V0LyRzKSAlICRoOworJGJzZWN0ICAgPSAoJG9mZnNldCAlICRzKSArIDE7CiskYmN5bCAgICA9IGludCgkb2Zmc2V0LygkaCokcykpOworJGJzZWN0ICArPSAoJGJjeWwgJiAweDMwMCkgPj4gMjsKKyRiY3lsICAgJj0gMHhmZjsKKyRlaGVhZCAgID0gJGgtMTsKKyRlc2VjdCAgID0gJHMgKyAoKCgkY2MtMSkgJiAweDMwMCkgPj4gMik7CiskZWN5bCAgICA9ICgkY2MtMSkgJiAweGZmOworJGZzdHlwZSAgPSAkb3B0eyd0eXBlJ307CSMgUGFydGl0aW9uIHR5cGUKKyRwZW50cnkgID0gJG9wdHsnZW50cnknfTsJIyBQYXJ0aXRpb24gc2xvdAorCitmb3IgKCAkaSA9IDEgOyAkaSA8PSA0IDsgJGkrKyApIHsKKyAgICBpZiAoICRpID09ICRwZW50cnkgKSB7CisJJG1iciAuPSBwYWNrKCJDQ0NDQ0NDQ1ZWIiwgMHg4MCwgJGJoZWFkLCAkYnNlY3QsICRiY3lsLCAkZnN0eXBlLAorCQkgICAgICRlaGVhZCwgJGVzZWN0LCAkZWN5bCwgJG9mZnNldCwgJHBzaXplKTsKKyAgICB9IGVsc2UgeworCSRtYnIgLj0gIlwwIiB4IDE2OworICAgIH0KK30KKyRtYnIgLj0gIlx4NTVceGFhIjsKKworcHJpbnQgRklMRSAkbWJyOworCisjIFBhZCB0aGUgaW1hZ2UgdG8gYSBmYWtlIGN5bGluZGVyIGJvdW5kYXJ5CitzZWVrKEZJTEUsICRpbWdzdGF0WzddLCBTRUVLX1NFVCkgb3IgZGllICIkMDogJGZpbGU6ICQhXG4iOworaWYgKCRwYWRkaW5nKSB7CisgICAgcHJpbnQgRklMRSAiXDAiIHggJHBhZGRpbmc7Cit9CisKKyMgRG9uZS4uLgorY2xvc2UoRklMRSk7CisKK2V4aXQgMDsKK19fRU5EX18KZGlmZiAtLWdpdCBhL3V0aWxzL2tleXRhYi1saWxvIGIvdXRpbHMva2V5dGFiLWxpbG8KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWUzNDE2MAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWxzL2tleXRhYi1saWxvCkBAIC0wLDAgKzEsOTUgQEAKKyMhL3Vzci9iaW4vcGVybAorCitldmFsIHsgdXNlIGJ5dGVzOyB9OworZXZhbCB7IGJpbm1vZGUgU1RET1VUOyB9OworCiskREVGQVVMVF9NQVAgPSAidXMiOworJERFRkFVTFRfRVhUID0gIi5rbWFwIjsKKworc3ViIHVzYWdlCit7CisgICAgcHJpbnQgU1RERVJSCisgICAgICAidXNhZ2U6ICQwIFsgLXAgb2xkX2NvZGU9bmV3X2NvZGUgXSAuLi5cbiIuCisgICAgICAoIiAieCg4K2xlbmd0aCAkMCkpLiJbcGF0aF1kZWZhdWx0X2xheW91dFsua21hcF0gXSAiLgorICAgICAgIltwYXRoXWtiZF9sYXlvdXRbLmttYXBdXG4iOworICAgIGV4aXQgMTsKK30KKworCit3aGlsZSAoJEFSR1ZbMF0gZXEgIi1wIikgeworICAgIHNoaWZ0KEBBUkdWKTsKKyAgICAmdXNhZ2UgdW5sZXNzICRBUkdWWzBdID1+IC89LzsKKyAgICAkdGFibGVbZXZhbCgkYCldID0gZXZhbCgkJyk7CisgICAgc2hpZnQoQEFSR1YpOworfQorJnVzYWdlIHVubGVzcyBkZWZpbmVkICRBUkdWWzBdOworbG9hZF9tYXAoImRlZiIsZGVmaW5lZCAkQVJHVlsxXSA/ICRBUkdWWzBdIDogdW5kZWYpOworbG9hZF9tYXAoImtiZCIsZGVmaW5lZCAkQVJHVlsxXSA/ICRBUkdWWzFdIDogJEFSR1ZbMF0pOworJmJ1aWxkX3RhYmxlKCJwbGFpbiIsInNoaWZ0IiwiY3RybCIsImFsdGdyIiwic2hpZnRfY3RybCIsCisgICJhbHRncl9jdHJsIiwiYWx0Iiwic2hpZnRfYWx0IiwiY3RybF9hbHQiKTsKK2ZvciAoJGkgPSAwOyAkaSA8IDI1NjsgJGkrKykgeworICAgIHByaW50ZigiJWMiLCR0YWJsZVskaV0gPyAkdGFibGVbJGldIDogJGkpIHx8IGRpZSAicHJpbnQ6ICQhIjsKK30KK2Nsb3NlIFNURE9VVCB8fCBkaWUgImNsb3NlOiAkISI7CisKKworc3ViIGxvYWRfbWFwCit7CisgICAgbG9jYWwgKCRwZngsJG1hcCkgPSBAXzsKKyAgICBsb2NhbCAoJGVtcHR5LCRjdXJyZW50KTsKKworICAgICRtYXAgPSAkREVGQVVMVF9NQVAgdW5sZXNzIGRlZmluZWQgJG1hcDsKKyAgICAkbWFwIC49ICRERUZBVUxUX0VYVCB1bmxlc3MgJG1hcCA9fiBtfC9bXi9dK1wuW14vXSskfDsKKyAgICBpZiAoIW9wZW4oRklMRSwibG9hZGtleXMgLW0gJG1hcCB8IikpIHsKKwlwcmludCBTVERFUlIgImxvYWRrZXlzIC1tICRtYXA6ICQhXG4iOworCWV4aXQgMTsKKyAgICB9CisgICAgdW5kZWYgJGN1cnJlbnQ7CisgICAgJGVtcHR5ID0gMTsKKyAgICB3aGlsZSAoPEZJTEU+KSB7CisJY2hvcDsKKwlpZiAoL14oc3RhdGljXHMrKT91X3Nob3J0XHMrKFxTKylfbWFwXFtcUypcXVxzKz1ccyt7XHMqJC8pIHsKKwkgICAgZGllICJhY3RpdmUgYXQgYmVnaW5uaW5nIG9mIG1hcCIgaWYgZGVmaW5lZCAkY3VycmVudDsKKwkgICAgJGN1cnJlbnQgPSAkcGZ4LiI6Ii4kMjsKKwkgICAgbmV4dDsKKwl9CisJdW5kZWYgJGN1cnJlbnQgaWYgL159O1xzKiQvOworCW5leHQgdW5sZXNzIGRlZmluZWQgJGN1cnJlbnQ7CisJcy9ccy8vZzsKKwkkbWFweyRjdXJyZW50fSAuPSAkXzsKKwkkZW1wdHkgPSAwOworICAgIH0KKyAgICBjbG9zZSBGSUxFOworICAgIHJldHVybiB1bmxlc3MgJGVtcHR5OworICAgIHByaW50IFNUREVSUiAiS2V5bWFwIGlzIGVtcHR5XG4iOworICAgIGV4aXQgMTsKK30KKworCitzdWIgYnVpbGRfdGFibGUKK3sKKyAgICBsb2NhbCAoQG1hcHMpID0gQF87CisgICAgbG9jYWwgKEB0bXApOworCisgICAgJHNldCA9IDA7CisgICAgZm9yICRtYXAgKEBtYXBzKSB7CisJJGNvZGUgPSAkc2V0OworCWZvciAoc3BsaXQoIiwiLCRtYXB7ImRlZjoiLiRtYXB9KSkgeworCSAgICBkaWUgImJhZCBtYXAgZW50cnkgJF8gKGRlZiwgbWFwICRtYXApIiB1bmxlc3MgL14weFxTXFMoXFNcUykkLzsKKwkgICAgJHRtcFskY29kZV0gPSBoZXggJDEgdW5sZXNzICR0bXBbJGNvZGVdOworCSAgICAkY29kZSsrOworCX0KKwkkc2V0ICs9IDI1NjsKKyAgICB9CisgICAgJHNldCA9IDA7CisgICAgZm9yICRtYXAgKEBtYXBzKSB7CisJJGNvZGUgPSAkc2V0OworCWZvciAoc3BsaXQoIiwiLCRtYXB7ImtiZDoiLiRtYXB9KSkgeworCSAgICBkaWUgImJhZCBtYXAgZW50cnkgJF8gKGtiZCwgbWFwICRtYXApIiB1bmxlc3MgL14weFxTXFMoXFNcUykkLzsKKwkgICAgJHRhYmxlWyR0bXBbJGNvZGVdXSA9IGhleCAkMSB1bmxlc3MgJHRhYmxlWyR0bXBbJGNvZGVdXTsKKwkgICAgJGNvZGUrKzsKKwl9CisJJHNldCArPSAyNTY7CisgICAgfQorICAgICR0YWJsZVswXSA9IDA7Cit9CmRpZmYgLS1naXQgYS91dGlscy9sc3MxNnRvcHBtIGIvdXRpbHMvbHNzMTZ0b3BwbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOGI3ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbHMvbHNzMTZ0b3BwbQpAQCAtMCwwICsxLDExMSBAQAorIyEvdXNyL2Jpbi9wZXJsCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDIwMDEtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyMgbHNzMTZ0b3BwbToKKyMjIENvbnZlcnQgYW4gTFNTLTE2IGltYWdlIHRvIFBQTQorIyMKKyMjIFVzYWdlOgorIyMKKyMjCWxzczE2dG9wcG0gWy1tYXBdIDwgZmlsZS5sc3MgPiBmaWxlLnBwbQorIyMKKyMjIFRoZSAtbWFwIGNhdXNlcyB0aGUgY29sb3IgbWFwIHRvIGJlIG91dHB1dCBvbiBzdGRlcnIuCisjIworCitldmFsIHsgdXNlIGJ5dGVzOyB9OworZXZhbCB7IGJpbm1vZGUgU1RESU47IH07CitldmFsIHsgYmlubW9kZSBTVERPVVQ7IH07CisKKyRtYXAgPSAwOworZm9yZWFjaCAkYXJnICggQEFSR1YgKSB7CisgICAgaWYgKCAkYXJnIGVxICctbWFwJyApIHsKKwkkbWFwID0gMTsKKyAgICB9IGVsc2UgeworCXByaW50IFNUREVSUiAiJDA6IFVua25vd24gb3B0aW9uOiAkYXJnXG4iOworCWV4aXQgMTI3OworICAgIH0KK30KKworaWYgKCByZWFkKFNURElOLCAkaGVhZGVyLCA1NikgIT0gNTYgKSB7CisgICAgcHJpbnQgU1RERVJSICIkMDogU2hvcnQgZmlsZVxuIjsKKyAgICBleGl0IDE7Cit9CisKKygkbWFnaWMsICR4c2l6ZSwgJHlzaXplLCBAY29sb3JzZXQpID0gdW5wYWNrKCJWdnZjNDgiLCAkaGVhZGVyKTsKKworaWYgKCAkbWFnaWMgIT0gMHgxNDEzZjMzZCApIHsKKyAgICBwcmludCBTVERFUlIgIiQwOiBJbnZhbGlkIGZpbGUgZm9ybWF0XG4iOworICAgIGV4aXQgMTsKK30KKworJWNvbG9yID0gKCk7Citmb3IgKCAkaSA9IDAgOyAkaSA8IDE2IDsgJGkrKyApIHsKKyAgICAkciA9IGludCgoc2hpZnQgQGNvbG9yc2V0KSAqIDI1NSAvIDYzICsgMC41KTsKKyAgICAkZyA9IGludCgoc2hpZnQgQGNvbG9yc2V0KSAqIDI1NSAvIDYzICsgMC41KTsKKyAgICAkYiA9IGludCgoc2hpZnQgQGNvbG9yc2V0KSAqIDI1NSAvIDYzICsgMC41KTsKKworICAgICRjb2xvcnskaX0gPSBwYWNrKCJjY2MiLCAkciwgJGcsICRiKTsKKworICAgIGlmICggJG1hcCApIHsKKwlwcmludGYgU1RERVJSICIjJTAyeCUwMnglMDJ4PSVkXG4iLCAkciwgJGcsICRiLCAkaTsKKyAgICB9Cit9CisKK3N1YiBnZXRfbnliYmxlKCkgeworICAgIG15KCRjaCwkbik7CisgICAgaWYgKCBkZWZpbmVkKCRueWJibGVfYnVmKSApIHsKKwkkbiA9ICRueWJibGVfYnVmOworCXVuZGVmICRueWJibGVfYnVmOworICAgIH0gZWxzZSB7CisJaWYgKCByZWFkKFNURElOLCAkY2gsIDEpICE9IDEgKSB7CisJICAgIHByaW50IFNUREVSUiAiJDA6IFNob3J0IHJlYWQgb24gaW5wdXQgKGZpbGUgY29ycnVwdClcbiI7CisJICAgIGV4aXQgMTsKKwl9CisJJGNoID0gb3JkKCRjaCk7CisJJG55YmJsZV9idWYgPSAkY2ggPj4gNDsKKwkkbiA9ICRjaCAmIDB4RjsKKyAgICB9CisgICAgcmV0dXJuICRuOworfQorCitwcmludCAiUDZcbiI7CitwcmludCAiJHhzaXplICR5c2l6ZVxuIjsKK3ByaW50ICIyNTVcbiI7CisKK2ZvciAoICR5ID0gMCA7ICR5IDwgJHlzaXplIDsgJHkrKyApIHsKKyAgICAkeCA9IDA7CisgICAgJGxhc3QgPSAwOworICAgIHVuZGVmICRueWJibGVfYnVmOwkJIyBOeWJibGUgYnVmZmVyIHN0YXJ0cyBjbGVhciBvbiBlYWNoIGxpbmUKKyAgICB3aGlsZSAoICR4IDwgJHhzaXplICkgeworCSRuID0gZ2V0X255YmJsZSgpOworCisJaWYgKCAkbiAhPSAkbGFzdCApIHsKKwkgICAgcHJpbnQgJGNvbG9yeyRufTsKKwkgICAgJGxhc3QgPSAkbjsKKwkgICAgJHgrKzsKKwl9IGVsc2UgeworCSAgICAkYyA9IGdldF9ueWJibGUoKTsKKwkgICAgaWYgKCAkYyA9PSAwICkgeworCQkjIERvdWJsZS1ueWJibGUgcnVuCisJCSRjID0gZ2V0X255YmJsZSgpOworCQkkYyArPSBnZXRfbnliYmxlKCkgPDwgNDsKKwkJJGMgKz0gMTY7CisJICAgIH0KKwkgICAgIyBUcnVuY2F0ZSBvdmVybG9uZyBydW5zCisJICAgICRjID0gJHhzaXplLSR4IGlmICggJGMgPiAkeHNpemUtJHggKTsKKwkgICAgIyBPdXRwdXQgcnVuCisJICAgIHByaW50ICRjb2xvcnskbn0geCAkYzsKKwkgICAgJHggKz0gJGM7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3V0aWxzL21kNXBhc3MgYi91dGlscy9tZDVwYXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0MDRmMWQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9tZDVwYXNzCkBAIC0wLDAgKzEsMzQgQEAKKyMhL3Vzci9iaW4vcGVybAorCit1c2UgYnl0ZXM7Cit1c2UgQ3J5cHQ6OlBhc3N3ZE1ENTsKK3VzZSBNSU1FOjpCYXNlNjQ7CisKK3N1YiByYW5kb21fYnl0ZXMoJCkgeworICAgIG15KCRuKSA9IEBfOworICAgIG15KCR2LCAkaSk7CisKKyAgICBpZiAoIG9wZW4oUkFORE9NLCAnPCcsICcvZGV2L3JhbmRvbScpIHx8CisJIG9wZW4oUkFORE9NLCAnPCcsICcvZGV2L3VyYW5kb20nKSApIHsKKwlyZWFkKFJBTkRPTSwgJHYsICRuKTsKKyAgICB9IGVsc2UgeworCSMgTm8gcmVhbCBSTkcgYXZhaWxhYmxlLi4uCisJc3JhbmQoJCQgXiB0aW1lKTsKKwkkdiA9ICcnOworCWZvciAoICRpID0gMCA7ICRpIDwgJG4gOyAkaSsrICkgeworCSAgICAkdiAuPSBvcmQoaW50KHJhbmQoKSAqIDI1NikpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gJHY7Cit9CisKKworKCRwYXNzLCAkc2FsdCkgPSBAQVJHVjsKKwordW5sZXNzIChkZWZpbmVkKCRzYWx0KSkgeworICAgICRzYWx0ID0gTUlNRTo6QmFzZTY0OjplbmNvZGUocmFuZG9tX2J5dGVzKDYpLCAnJyk7CisgICAgJHNhbHQgPX4gdHIvXCsvLi87CQkjIC4gbm90ICsKK30KKworcHJpbnQgdW5peF9tZDVfY3J5cHQoJHBhc3MsICRzYWx0KSwgIlxuIjsKZGlmZiAtLWdpdCBhL3V0aWxzL21lbWRpc2tmaW5kLmMgYi91dGlscy9tZW1kaXNrZmluZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNWY4YmMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9tZW1kaXNrZmluZC5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yOiBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogICBCb3N0b24gTUEgMDIxMTAtMTMwMSwgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbWVtZGlza2ZpbmQuYworICoKKyAqIFNpbXBsZSB1dGlsaXR5IHRvIHNlYXJjaCBmb3IgYSBNRU1ESVNLIGluc3RhbmNlIGFuZCBvdXRwdXQgdGhlIHBhcmFtZXRlcnMKKyAqIG5lZWRlZCB0byB1c2UgdGhlICJwaHJhbSIgZHJpdmVyIGluIExpbnV4IHRvIG1hcCBpdC4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgIi4uL21lbWRpc2svbXN0cnVjdHMuaCIKKworI2RlZmluZSBNQkZUX01JTl9MRU5HVEgJKDM2KzQrMjYpCisKK3N0YXRpYyBib29sIHZhbGlkX21iZnQoY29uc3Qgc3RydWN0IG1CRlQgKm1iZnQsIHNpemVfdCBzcGFjZSkKK3sKKyAgICB1aW50OF90IGNzdW07CisgICAgc2l6ZV90IGk7CisKKyAgICBpZiAobWVtY21wKG1iZnQtPmFjcGkuc2lnbmF0dXJlLCAibUJGVCIsIDQpKQorCXJldHVybiBmYWxzZTsKKworICAgIGlmIChtYmZ0LT5hY3BpLmxlbmd0aCA8IE1CRlRfTUlOX0xFTkdUSCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobWJmdC0+YWNwaS5sZW5ndGggPiBzcGFjZSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoKHNpemVfdCltYmZ0LT5hY3BpLmxlbmd0aCAhPSAoc2l6ZV90KW1iZnQtPm1kaS5ieXRlcyArIDM2KzQpCisJcmV0dXJuIGZhbHNlOworCisgICAgY3N1bSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG1iZnQtPmFjcGkubGVuZ3RoOyBpKyspCisJY3N1bSArPSAoKGNvbnN0IHVpbnQ4X3QgKiltYmZ0KVtpXTsKKworICAgIGlmIChjc3VtKQorCXJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfcGFyYW1zKGNvbnN0IHN0cnVjdCBtQkZUICptYmZ0KQoreworICAgIGludCBzZWN0b3Jfc2hpZnQgPSBtYmZ0LT5tZGkuc2VjdG9yX3NoaWZ0OworCisgICAgaWYgKCFzZWN0b3Jfc2hpZnQpCisJc2VjdG9yX3NoaWZ0ID0gOTsKKworICAgIHByaW50ZigiJSN4LCUjeFxuIiwKKwkgICBtYmZ0LT5tZGkuZGlza2J1ZiwgbWJmdC0+bWRpLmRpc2tzaXplIDw8IHNlY3Rvcl9zaGlmdCk7Cit9CisKK3N0YXRpYyBzaXplX3QgbWVtbGltaXQodm9pZCkKK3sKKyAgICBjaGFyIHR4dGxpbmVbMjU2XSwgdXNlclsyNTZdOworICAgIHNpemVfdCBtYXhyYW0gPSAwOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwgZW5kOworICAgIEZJTEUgKmlvbWVtOworCisgICAgaW9tZW0gPSBmb3BlbigiL3Byb2MvaW9tZW0iLCAiciIpOworICAgIGlmICghaW9tZW0pCisJcmV0dXJuIDA7CisKKyAgICB3aGlsZSAoZmdldHModHh0bGluZSwgc2l6ZW9mIHR4dGxpbmUsIGlvbWVtKSAhPSBOVUxMKSB7CisJaWYgKHNzY2FuZih0eHRsaW5lLCAiJWxseC0lbGx4IDogJVteXG5dIiwgJnN0YXJ0LCAmZW5kLCB1c2VyKSAhPSAzKQorCSAgICBjb250aW51ZTsKKwlpZiAoc3RyY21wKHVzZXIsICJTeXN0ZW0gUkFNIikpCisJICAgIGNvbnRpbnVlOworCWlmIChzdGFydCA+PSAweGEwMDAwKQorCSAgICBjb250aW51ZTsKKwltYXhyYW0gPSAoZW5kID49IDB4YTAwMDApID8gMHhhMDAwMCA6IGVuZCsxOworICAgIH0KKyAgICBmY2xvc2UoaW9tZW0pOworCisgICAgcmV0dXJuIG1heHJhbTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QgZ2V0X3BhZ2Vfc2l6ZSh2b2lkKQoreworI2lmZGVmIF9TQ19QQUdFU0laRQorICAgIHJldHVybiBzeXNjb25mKF9TQ19QQUdFU0laRSk7CisjZWxzZQorICAgIC8qIGtsaWJjLCBmb3Igb25lLCBkb2Vzbid0IGhhdmUgc3lzY29uZigpIGR1ZSB0byBleGNlc3NpdmUgbXVsdGlwbGV4ICovCisgICAgcmV0dXJuIGdldHBhZ2VzaXplKCk7CisjZW5kaWYKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBjb25zdCBjaGFyICptYXA7CisgICAgaW50IG1lbWZkOworICAgIHNpemVfdCBmYm07CisgICAgY29uc3QgY2hhciAqcHRyLCAqZW5kOworICAgIHNpemVfdCBwYWdlID0gZ2V0X3BhZ2Vfc2l6ZSgpOworICAgIHNpemVfdCBtYXBiYXNlLCBtYXBsZW47CisgICAgaW50IGVyciA9IDE7CisKKyAgICAodm9pZClhcmdjOworCisgICAgbWFwYmFzZSA9IG1lbWxpbWl0KCkgJiB+KHBhZ2UgLSAxKTsKKyAgICBpZiAoIW1hcGJhc2UpCisJcmV0dXJuIDI7CisKKyAgICBtZW1mZCA9IG9wZW4oIi9kZXYvbWVtIiwgT19SRE9OTFkpOworICAgIGlmIChtZW1mZCA8IDApIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3Qgb3BlbiAvZGV2L21lbTogJXNcbiIsCisJCWFyZ3ZbMF0sIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIDI7CisgICAgfQorCisgICAgbWFwID0gbW1hcChOVUxMLCBwYWdlLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIG1lbWZkLCAwKTsKKyAgICBpZiAobWFwID09IE1BUF9GQUlMRUQpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgbWFwIHBhZ2UgMDogJXNcbiIsCisJCWFyZ3ZbMF0sIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIDI7CisgICAgfQorCisgICAgZmJtID0gKih1aW50MTZfdCAqKShtYXAgKyAweDQxMykgPDwgMTA7CisgICAgaWYgKGZibSA8IG1hcGJhc2UpCisJZmJtID0gbWFwYmFzZTsKKworICAgIG11bm1hcCgodm9pZCAqKW1hcCwgcGFnZSk7CisKKyAgICBpZiAoZmJtIDwgNjQqMTAyNCB8fCBmYm0gPj0gNjQwKjEwMjQpCisJcmV0dXJuIDE7CisKKyAgICBtYXBsZW4gID0gMHhhMDAwMCAtIG1hcGJhc2U7CisgICAgbWFwID0gbW1hcChOVUxMLCBtYXBsZW4sIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgbWVtZmQsIG1hcGJhc2UpOworICAgIGlmIChtYXAgPT0gTUFQX0ZBSUxFRCkgeworCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCBtYXAgYmFzZSBtZW1vcnk6ICVzXG4iLAorCQlhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAyOworICAgIH0KKworICAgIHB0ciA9IG1hcCArIChmYm0gLSBtYXBiYXNlKTsKKyAgICBlbmQgPSBtYXAgKyAoMHhhMDAwMCAtIG1hcGJhc2UpOworICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKKwlpZiAodmFsaWRfbWJmdCgoY29uc3Qgc3RydWN0IG1CRlQgKilwdHIsIGVuZC1wdHIpKSB7CisJICAgIG91dHB1dF9wYXJhbXMoKGNvbnN0IHN0cnVjdCBtQkZUICopcHRyKTsKKwkgICAgZXJyID0gMDsKKwkgICAgYnJlYWs7CisJfQorCXB0ciArPSAxNjsKKyAgICB9CisKKyAgICBtdW5tYXAoKHZvaWQgKiltYXAsIG1hcGxlbik7CisKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdXRpbHMvbWtkaXNraW1hZ2UuaW4gYi91dGlscy9ta2Rpc2tpbWFnZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzMxOTNhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbHMvbWtkaXNraW1hZ2UuaW4KQEAgLTAsMCArMSwzMjEgQEAKKyMhL3Vzci9iaW4vcGVybAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDAyLTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDA5LTIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjCisjIENyZWF0ZXMgYSBibGFuayBNUy1ET1MgZm9ybWF0dGVkIGhhcmQgZGlzayBpbWFnZQorIworCit1c2UgYnl0ZXM7Cit1c2UgaW50ZWdlcjsKK3VzZSBGY250bDsKK3VzZSBFcnJubzsKK3VzZSBDd2Q7Cit1c2UgSU86OkhhbmRsZTsJCQkjIEZvciBmbHVzaCgpCisKK3N1YiBhYnNvbHV0ZV9wYXRoKCQpIHsKKyAgICBteSgkZikgPSBAXzsKKyAgICBteSgkYyk7CisKKyAgICByZXR1cm4gJGYgaWYgKCAkZiA9fiAvXlwvLyApOworICAgICRjID0gY3dkKCk7CisgICAgJGMgPSAnJyBpZiAoICRjIGVxICcvJyApOworICAgIHJldHVybiAkYy4nLycuJGY7Cit9CisKK3N1YiBpc19saW51eCgpIHsKKyAgICByZXR1cm4gISFldmFsICd7ICcuCisJJ3VzZSBQT1NJWDsgJy4KKwknKCRzeXNuYW1lLCAkbm9kZW5hbWUsICRyZWxlYXNlLCAkdmVyc2lvbiwgJG1hY2hpbmUpID0gUE9TSVg6OnVuYW1lKCk7ICcuCisJInJldHVybiBcJHN5c25hbWUgZXEgXCdMaW51eFwnOyB9IjsKK30KKworc3ViIGdldF9yYW5kb20oKSB7CisgICAgIyBHZXQgYSAzMi1iaXQgcmFuZG9tIG51bWJlcgorICAgIG15ICRyZmQsICRybmQ7CisgICAgbXkgJHJpZDsKKworICAgIGlmIChvcGVuKCRyZmQsICI8IC9kZXYvdXJhbmRvbVwwIikgJiYgcmVhZCgkcmZkLCAkcm5kLCA0KSA9PSA0KSB7CisJJHJpZCA9IHVucGFjaygiViIsICRybmQpOworICAgIH0KKworICAgIGNsb3NlKCRyZmQpIGlmIChkZWZpbmVkKCRyZmQpKTsKKyAgICByZXR1cm4gJHJpZCBpZiAoZGVmaW5lZCgkcmlkKSk7CisKKyAgICAjIFRoaXMgc3Vja3MgYnV0IGlzIGJldHRlciB0aGFuIG5vdGhpbmcuLi4KKyAgICByZXR1cm4gKCQkK3RpbWUoKSkgJiAweGZmZmZmZmZmOworfQorCitzdWIgZ2V0X2hleF9kYXRhKCkgeworICAgIG15ICRtYnIgPSAnJzsKKyAgICBteSAkbGluZSwgJGJ5dGU7CisgICAgd2hpbGUgKCAkbGluZSA9IDxEQVRBPiApIHsKKwljaG9tcCAkbGluZTsKKwlsYXN0IGlmICgkbGluZSBlcSAnKicpOworCWZvcmVhY2ggJGJ5dGUgKCBzcGxpdCgvXHMrLywgJGxpbmUpICkgeworCSAgICAkbWJyIC49IGNocihoZXgoJGJ5dGUpKTsKKwl9CisgICAgfQorICAgIHJldHVybiAkbWJyOworfQorCiskaXNfbGludXggPSBpc19saW51eCgpOworaWYgKCAkaXNfbGludXggKSB7CisgICAgIyBJT0NUTCBudW1iZXJzCisgICAgJEJMS1JSUEFSVCAgICA9IDB4MTI1ZjsKKyAgICAkQkxLR0VUU0laRSAgID0gMHgxMjYwOworfQorCislb3B0ID0gKCk7CitAYXJncyA9ICgpOworCit3aGlsZSAoZGVmaW5lZCgkYSA9IHNoaWZ0KEBBUkdWKSkpIHsKKyAgICBpZiAoICRhID1+IC9eXC0vICkgeworCWZvcmVhY2ggJG8gKCBzcGxpdCgvLywgc3Vic3RyKCRhLDEpKSApIHsKKwkgICAgJG9wdHskb30gPSAxOworCSAgICBpZiAoJG8gZXEgJ2knKSB7CisJCSRpZCA9IHNoaWZ0KEBBUkdWKTsKKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeworCXB1c2goQGFyZ3MsICRhKTsKKyAgICB9Cit9CisKKygkZmlsZSwkYywkaCwkcykgPSBAYXJnczsKKyRjICs9IDA7ICAkaCArPSAwOyAgJHMgKz0gMDsKKworJHBlbnRyeSA9IDE7CiskcGVudHJ5ID0gMiBpZiAoICRvcHR7JzInfSApOworJHBlbnRyeSA9IDMgaWYgKCAkb3B0eyczJ30gKTsKKyRwZW50cnkgPSA0IGlmICggJG9wdHsnNCd9ICk7CisKK2lmICggJG9wdHsneid9ICkgeworICAgICRoID0gJGggfHwgNjQ7CisgICAgJHMgPSAkcyB8fCAzMjsKK30KKworaWYgKCAkb3B0eydNJ30gJiYgJGggJiYgJHMgKSB7CisgICAgIyBTcGVjaWZ5IHNpemUgaW4gbWVnYWJ5dGVzLCBub3QgaW4gY3lsaW5kZXJzCisgICAgJGMgPSAoJGMqMTAyNCoyKS8oJGgqJHMpOworfQorCiskaXNfb3BlbiA9IDA7CisKK2lmICggJGMgPT0gMCAmJiAkZmlsZSBuZSAnJyApIHsKKyAgICAkbGVuID0gMDsKKyAgICBpZiAoIHN5c29wZW4oT1VUUFVULCAkZmlsZSwgT19SRFdSLCAwNjY2KSApIHsKKwkkaXNfb3BlbiA9IDE7CisKKwlpZiAoIChAZmlsZXN0YXQgPSBzdGF0KE9VVFBVVCkpICYmIFNfSVNSRUcoJGZpbGVzdGF0WzJdKSApIHsKKwkgICAgJGxlbiA9ICRmaWxlc3RhdFs3XSA+PiA5OworCX0gZWxzaWYgKCAkaXNfbGludXggJiYgU19JU0JMSygkZmlsZXN0YXRbMl0pICkgeworCSAgICAkYmxrc2l6ZSA9IHBhY2soIkwhIiwgMCk7CisJICAgIGlmICggaW9jdGwoT1VUUFVULCAkQkxLR0VUU0laRSwgJGJsa3NpemUpID09IDAgKSB7CisJCSRsZW4gPSB1bnBhY2soIkwhIiwgJGJsa3NpemUpOyAjIEluIDUxMi1ieXRlIHNlY3RvcnMhCisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKCAhJGxlbiApIHsKKwlwcmludCBTVERFUlIgIiQwOiAkZmlsZTogZG9uJ3Qga25vdyBob3cgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoaXMgZGV2aWNlXG4iOworCWV4aXQgMTsKKyAgICB9CisKKyAgICAkYyA9ICRsZW4vKCRoKiRzKTsKK30KKworaWYgKCAkZmlsZSBlcSAnJyB8fCAkYyA8IDEgfHwgJGggPCAxIHx8ICRoID4gMjU2IHx8ICRzIDwgMSB8fCAkcyA+IDYzICkgeworICAgIHByaW50IFNUREVSUiAiVXNhZ2U6ICQwIFstZG9GTXo0XVstaSBpZF0gZmlsZSBjIGggcyAobWF4OiAxMDI0IDI1NiA2MylcbiI7CisgICAgcHJpbnQgU1RERVJSICIgICAgLWQgICAgYWRkIERPU0VNVSBoZWFkZXJcbiI7CisgICAgcHJpbnQgU1RERVJSICIgICAgLW8gICAgcHJpbnQgZmlsZXN5c3RlbSBvZmZzZXQgdG8gc3Rkb3V0XG4iOworICAgIHByaW50IFNUREVSUiAiICAgIC1GICAgIGZvcm1hdCBwYXJ0aXRpb24gYXMgRkFUMzJcbiI7CisgICAgcHJpbnQgU1RERVJSICIgICAgLU0gICAgXCJjXCIgYXJndW1lbnQgaXMgbWVnYWJ5dGVzLCBjYWxjdWxhdGUgY3lsaW5kZXJzXG4iOworICAgIHByaW50IFNUREVSUiAiICAgIC16ICAgIHVzZSB6aXBkaXNrIGdlb21ldHJ5IChoPTY0IHM9MzIpXG4iOworICAgIHByaW50IFNUREVSUiAiICAgIC00ICAgIHVzZSBwYXJ0aXRpb24gZW50cnkgNCAoc3RhbmRhcmQgZm9yIHppcGRpc2tzKVxuIjsKKyAgICBwcmludCBTVERFUlIgIiAgICAtaSAgICBzcGVjaWZ5IHRoZSBNQlIgSURcbiI7CisgICAgcHJpbnQgU1RERVJSICIgICAgLXMgICAgb3V0cHV0IGEgc3BhcnNlIGZpbGUgKGRvbid0IGFsbG9jYXRlIGFsbCBibG9ja3MpXG4iOworICAgIGV4aXQgMTsKK30KKworaWYgKCRjID4gMTAyNCkgeworICAgIHByaW50IFNUREVSUiAiV2FybmluZzogbW9yZSB0aGFuIDEwMjQgY3lsaW5kZXJzICgkYykuXG4iOworICAgIHByaW50IFNUREVSUiAiTm90IGFsbCBCSU9TZXMgd2lsbCBiZSBhYmxlIHRvIGJvb3QgdGhpcyBkZXZpY2UuXG4iOworICAgICRjYyA9IDEwMjQ7Cit9IGVsc2UgeworICAgICRjYyA9ICRjOworfQorCiskY3lsc2l6ZSA9ICRoKiRzKjUxMjsKKworaWYgKCAhJGlzX29wZW4gKSB7CisgICAgc3lzb3BlbihPVVRQVVQsICRmaWxlLCBPX0NSRUFUfE9fUkRXUnxPX1RSVU5DLCAwNjY2KQorCW9yIGRpZSAiJDA6IENhbm5vdCBvcGVuOiAkZmlsZVxuIjsKK30KK2Jpbm1vZGUgT1VUUFVUOworCisjIFByaW50IG91dCBET1NFTVUgaGVhZGVyLCBpZiByZXF1ZXN0ZWQKK2lmICggJG9wdHsnZCd9ICkgeworICAgICRlbXVoZHIgPSAiRE9TRU1VXDAiIC4gcGFjaygiVlZWViIsICRoLCAkcywgJGMsIDEyOCk7CisgICAgJGVtdWhkciAuPSAiXDAiIHggKDEyOCAtIGxlbmd0aCgkZW11aGRyKSk7CisgICAgcHJpbnQgT1VUUFVUICRlbXVoZHI7Cit9CisKKyMgUHJpbnQgdGhlIE1CUiBhbmQgcGFydGl0aW9uIHRhYmxlCiskbWJyID0gZ2V0X2hleF9kYXRhKCk7CitpZiAoIGxlbmd0aCgkbWJyKSA+IDQ0MCApIHsKKyAgICBkaWUgIiQwOiBCYWQgTUJSIGNvZGVcbiI7Cit9CisKKyRtYnIgLj0gIlwwIiB4ICg0NDAgLSBsZW5ndGgoJG1icikpOworaWYgKGRlZmluZWQoJGlkKSkgeworICAgICRpZCA9IHRvX2ludCgkaWQpOworfSBlbHNlIHsKKyAgICAkaWQgPSBnZXRfcmFuZG9tKCk7Cit9CiskbWJyIC49IHBhY2soIlYiLCAkaWQpOwkJIyBPZmZzZXQgNDQwOiBNQlIgSUQKKyRtYnIgLj0gIlwwXDAiOwkJCSMgT2Zmc2V0IDQ0NjogYWN0dWFsIHBhcnRpdGlvbiB0YWJsZQorCitwcmludCBPVVRQVVQgJG1icjsKKworIyBQcmludCBwYXJ0aXRpb24gdGFibGUKKyRwc2l6ZSA9ICRjKiRoKiRzLSRzOworJGJoZWFkICAgPSAoJGggPiAxKSA/IDEgOiAwOworJGJzZWN0ICAgPSAxOworJGJjeWwgICAgPSAoJGggPiAxKSA/IDAgOiAxOworJGVoZWFkICAgPSAkaC0xOworJGVzZWN0ICAgPSAkcyArICgoKCRjYy0xKSAmIDB4MzAwKSA+PiAyKTsKKyRlY3lsICAgID0gKCRjYy0xKSAmIDB4ZmY7CitpZiAoICRjID4gMTAyNCApIHsKKyAgICAkZnN0eXBlID0gMHgwZTsKK30gZWxzaWYgKCAkcHNpemUgPiA2NTUzNiApIHsKKyAgICAkZnN0eXBlID0gMHgwNjsKK30gZWxzZSB7CisgICAgJGZzdHlwZSA9IDB4MDQ7Cit9Citmb3IgKCAkaSA9IDEgOyAkaSA8PSA0IDsgJGkrKyApIHsKKyAgICBpZiAoICRpID09ICRwZW50cnkgKSB7CisJcHJpbnQgT1VUUFVUIHBhY2soIkNDQ0NDQ0NDVlYiLCAweDgwLCAkYmhlYWQsICRic2VjdCwgJGJjeWwsICRmc3R5cGUsCisJCQkgICRlaGVhZCwgJGVzZWN0LCAkZWN5bCwgJHMsICRwc2l6ZSk7CisgICAgfSBlbHNlIHsKKwlwcmludCBPVVRQVVQgIlwwIiB4IDE2OworICAgIH0KK30KK3ByaW50IE9VVFBVVCAiXHg1NVx4YWEiOworCisjIE91dHB1dCBibGFuayBmaWxlCiskdG90YWxzaXplID0gJGMqJGgqJHM7CiskdHJhY2tzICAgID0gJGMqJGg7CisKKyMgSWYgLXMgaXMgZ2l2ZW4sIHRyeSB0byBzaW1wbHkgdXNlIHRydW5jYXRlLi4uCit1bmxlc3MgKCRvcHR7J3MnfSAmJiB0cnVuY2F0ZShPVVRQVVQsICR0b3RhbHNpemUpKSB7CisgICAgJHRyYWNrID0gIlwwIiB4ICg1MTIqJHMpOworCisgICAgIyBQcmludCBmcmFjdGlvbmFsIHRyYWNrCisgICAgcHJpbnQgT1VUUFVUICJcMCIgeCAoNTEyICogKCRzLTEpKTsKKworICAgIGZvciAoICRpID0gMSA7ICRpIDwgJHRyYWNrcyA7ICRpKysgKSB7CisJcHJpbnQgT1VUUFVUICR0cmFjazsKKyAgICB9Cit9CisKKyMgUHJpbnQgbXRvb2xzIHRlbXAgZmlsZQorJG4gPSAwOword2hpbGUgKCAhZGVmaW5lZCgkdG1wZGlyKSApIHsKKyAgICAkdG1wZGlyID0gIi90bXAvbWtkaXNraW1hZ2UuJCQuIi4oJG4rKyk7CisgICAgaWYgKCAhbWtkaXIoJHRtcGRpciwgMDcwMCkgKSB7CisJZGllICIkMDogRmFpbGVkIHRvIG1ha2UgdGVtcCBkaXJlY3Rvcnk6ICR0bXBkaXJcbiIKKwkgICAgaWYgKCAkISAhPSBFRVhJU1QgKTsKKwl1bmRlZiAkdG1wZGlyOworICAgIH0KK30KKworJGNmZ2ZpbGUgPSAkdG1wZGlyLicvbXRvb2xzLmNvbmYnOworJGltZ2xpbmsgPSAkdG1wZGlyLicvZGlzay5pbWcnOworZGllICIkMDogRmFpbGVkIHRvIGNyZWF0ZSBzeW1saW5rICRpbWdsaW5rXG4iCisgICAgaWYgKCAhc3ltbGluayhhYnNvbHV0ZV9wYXRoKCRmaWxlKSwgJGltZ2xpbmspICk7CisKKyRoZWFkZXJfc2l6ZSA9ICgkb3B0eydkJ30gPyAxMjggOiAwKTsKKworIyBTdGFydCBvZiBmaWxlc3lzdGVtCiskb2Zmc2V0ID0gJHMqNTEyICsgJGhlYWRlcl9zaXplOworCisjIFN0YXJ0IG9mIHBhcnRpdGlvbiB0YWJsZSBlbnRyeQorJHBzdGFydCA9ICRoZWFkZXJfc2l6ZSArIDQ0NiArIDE2KigkcGVudHJ5LTEpOworCitvcGVuKE1DT05GSUcsICI+ICR7Y2ZnZmlsZX0iKSBvciBkaWUgIiQwOiBDYW5ub3QgbWFrZSBtdG9vbHMgY29uZmlnXG4iOworcHJpbnQgTUNPTkZJRyAiZHJpdmUgejpcbiI7CitwcmludCBNQ09ORklHICJmaWxlPVwiJHtpbWdsaW5rfVwiXG4iOworcHJpbnQgTUNPTkZJRyAiY3lsaW5kZXJzPSR7Y31cbiI7CitwcmludCBNQ09ORklHICJoZWFkcz0ke2h9XG4iOworcHJpbnQgTUNPTkZJRyAic2VjdG9ycz0ke3N9XG4iOworcHJpbnQgTUNPTkZJRyAib2Zmc2V0PSR7b2Zmc2V0fVxuIjsKK3ByaW50IE1DT05GSUcgIm1mb3JtYXRfb25seVxuIjsKK2Nsb3NlKE1DT05GSUcpOworCisjIE91dHB1dCB0aGUgZmlsZXN5c3RlbSBvZmZzZXQgdG8gc3Rkb3V0IGlmIGFwcHJvcHJpYXRlCitpZiAoICRvcHR7J28nfSApIHsKKyAgICBwcmludCAkb2Zmc2V0LCAiXG4iOworfQorCiskRU5WeydNVE9PTFNSQyd9ID0gJGNmZ2ZpbGU7CitpZiAoICRvcHR7J0YnfSApIHsKKyAgICBzeXN0ZW0oJ21mb3JtYXQnLCAnLUYnLCAnejonKTsKK30gZWxzZSB7CisgICAgc3lzdGVtKCdtZm9ybWF0JywgJ3o6Jyk7Cit9CisKKyMgQ2xlYW4gdXAgaW4gL3RtcAordW5saW5rKCRjZmdmaWxlKTsKK3VubGluaygkaW1nbGluayk7CitybWRpcigkdG1wZGlyKTsKKworIyBNVE9PTFMgZG9lc24ndCB3cml0ZSB0aGUgYnNIaWRkZW5TZWNzIGZpZWxkIGNvcnJlY3RseQorc2VlayhPVVRQVVQsICRvZmZzZXQgKyAweDFjLCAwKTsKK3ByaW50IE9VVFBVVCBwYWNrKCJWIiwgKCRvZmZzZXQtJGhlYWRlcl9zaXplKT4+OSk7CisKKyMgU2V0IHRoZSBwYXJ0aXRpb24gdHlwZQoraWYgKCAkb3B0eydGJ30gKSB7CisgICAgaWYgKCAkYyA+IDEwMjQgKSB7CisJJGZzdHlwZSA9IDB4MGM7CQkjIEZBVDMyIExCQQorICAgIH0gZWxzZSB7CisJJGZzdHlwZSA9IDB4MGI7CisgICAgfQorfSBlbHNlIHsKKyAgICBpZiAoICRjID4gMTAyNCApIHsKKwkkZnN0eXBlID0gMHgwZTsJCSMgRkFUMTYgTEJBCisgICAgfSBlbHNpZiAoICRwc2l6ZSA+IDY1NTM2ICkgeworCSRmc3R5cGUgPSAweDA2OwkJIyBGQVQxNiA+IDMyTUIKKyAgICB9IGVsc2UgeworCSRmc3R5cGUgPSAweDA0OwkJIyBGQVQxNiA8PSAzMk1CCisgICAgfQorICAgIHNlZWsoT1VUUFVULCAkb2Zmc2V0ICsgMHgzNiwgMCk7CisgICAgcmVhZChPVVRQVVQsICRmc25hbWUsIDgpOworCisgICAgIyBGQVQxMjogYWRqdXN0IHBhcnRpdGlvbiB0eXBlCisgICAgaWYgKCAkZnNuYW1lIGVxICdGQVQxMiAgICcgKSB7CisJJGZzdHlwZSA9IDB4MDE7CQkjIEZBVDEyCisgICAgfQorfQorc2VlayhPVVRQVVQsICRwc3RhcnQrNCwgMCk7CitwcmludCBPVVRQVVQgcGFjaygiQyIsICRmc3R5cGUpOworCitmbHVzaCBPVVRQVVQ7CisKKyMgSnVzdCBpbiBjYXNlIHRoaXMgaXMgYSBibG9jayBkZXZpY2UsIHRyeSB0byBmbHVzaCB0aGUgcGFydGl0aW9uIHRhYmxlCitpZiAoICRpc19saW51eCApIHsKKyAgICBpb2N0bChPVVRQVVQsICRCTEtSUlBBUlQsIDApOworfTsKKworZXhpdCAwOworX19FTkRfXwpkaWZmIC0tZ2l0IGEvdXRpbHMvcHBtdG9sc3MxNiBiL3V0aWxzL3BwbXRvbHNzMTYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWUyZDU0NgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWxzL3BwbXRvbHNzMTYKQEAgLTAsMCArMSwzOTMgQEAKKyMhL3Vzci9iaW4vcGVybAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAyMDA0LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMjIHBwbXRvbHNzMTYKKyMjCisjIyBDb252ZXJ0IGEgUE5NIGZpbGUgd2l0aCBtYXggMTYgY29sb3JzIHRvIGEgc2ltcGxlIFJMRS1iYXNlZCBmb3JtYXQ6CisjIworIyMgdWludDMyIDB4MTQxM2YzM2QgICAgOyBtYWdpYyAobGl0dGxlZW5kaWFuKQorIyMgdWludDE2IHhzaXplCQk7IGxpdHRsZWVuZGlhbgorIyMgdWludDE2IHlzaXplCQk7IGxpdHRsZWVuZGlhbgorIyMgMTYgeCB1aW50OCByLGcsYgk7IGNvbG9yIG1hcCwgaW4gNi1iaXQgZm9ybWF0IChlYWNoIGJ5dGUgaXMgMC4uNjMpCisjIworIyMgVGhlbiwgYSBzZXF1ZW5jZSBvZiBueWJibGVzOgorIyMKKyMjIE4JLi4uIGlmIE4gaXMgIT0gcHJldmlvdXMgcGl4ZWwsIG9uZSBwaXhlbCBvZiBjb2xvciBOCisjIyAuLi4gb3RoZXJ3aXNlIHJ1biBzZXF1ZW5jZSBmb2xsb3dzIC4uLgorIyMgTSAgICAuLi4gaWYgTSA+IDAgdGhlbiBydW4gbGVuZ3RoIGlzIE0KKyMjIC4uLiBvdGhlcndpc2UgcnVuIHNlcXVlbmNlIGlzIGVuY29kZWQgaW4gdHdvIG55YmJsZXMsCisjIyAgICAgbGl0dGxlZW5kaWFuLCArMTYKKyMjCisjIyBUaGUgbnliYmxlIHNlcXVlbmNlcyBhcmUgb24gYSBwZXItcm93IGJhc2lzOyBydW5zIG1heSBub3QgZXh0ZW5kCisjIyBhY3Jvc3Mgcm93cyBhbmQgb2RkLW55YmJsZSByb3dzIGFyZSB6ZXJvLXBhZGRlZC4KKyMjCisjIyBBdCB0aGUgc3RhcnQgb2Ygcm93LCB0aGUgInByZXZpb3VzIHBpeGVsIiBpcyBhc3N1bWVkIHRvIGJlIHplcm8uCisjIworIyMgVXNhZ2U6CisjIworIyMJcHBtdG9sc3MxNiBbI3JyZ2diYj1pIC4uLl0gPCBpbnB1dC5wcG0gPiBvdXRwdXQucmxlCisjIworIyMgQ29tbWFuZCBsaW5lIG9wdGlvbnMgb2YgdGhlIGZvcm0gI3JyZ2diYj1pIGluZGljYXRlIHRoYXQKKyMjIHRoZSBjb2xvciAjcnJnZ2JiIChoZXgpIHNob3VsZCBiZSBhc3NpZ25lZCBpbmRleCBpIChkZWNpbWFsKQorIyMKKworZXZhbCB7IHVzZSBieXRlczsgfTsKK2V2YWwgeyBiaW5tb2RlIFNURElOOyB9OworZXZhbCB7IGJpbm1vZGUgU1RET1VUOyB9OworCiskbWFnaWMgPSAweDE0MTNmMzNkOworCisjIEdldCBhIHRva2VuIGZyb20gdGhlIFBQTSBoZWFkZXIuICBJZ25vcmUgY29tbWVudHMgYW5kIGxlYWRpbmcKKyMgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGFzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjLgorIyBUaGlzIHJvdXRpbmUgZWF0cyBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgb2YgdHJhaWxpbmcgd2hpdGVzcGFjZSwKKyMgdW5sZXNzIGl0IGlzIGEgY29tbWVudCAoaW4gd2hpY2ggY2FzZSBpdCBlYXRzIHRoZSBjb21tZW50IHVwCisjIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGVuZCBvZiBsaW5lLikKK3N1YiBnZXRfdG9rZW4oKSB7CisgICAgbXkoJHRva2VuLCAkY2gpOworICAgIG15KCRjaCk7CisKKyAgICBkbyB7CisJJGNoID0gZ2V0YyhTVERJTik7CisJcmV0dXJuIHVuZGVmIGlmICggIWRlZmluZWQoJGNoKSApOyAjIEVPRgorCWlmICggJGNoIGVxICcjJyApIHsKKwkgICAgZG8geworCQkkY2ggPSBnZXRjKFNURElOKTsKKwkJcmV0dXJuIHVuZGVmIGlmICggIWRlZmluZWQoJGNoKSApOworCSAgICB9IHdoaWxlICggJGNoIG5lICJcbiIgKTsKKwl9CisgICAgfSB3aGlsZSAoICRjaCA9fiAvXlsgXHRcblx2XGZccl0kLyApOworCisgICAgJHRva2VuID0gJGNoOworICAgIHdoaWxlICggMSApIHsKKwkkY2ggPSBnZXRjKFNURElOKTsKKwlsYXN0IGlmICggJGNoID1+IC9eWyBcdFxuXHZcZlxyXCNdJC8gKTsKKwkkdG9rZW4gLj0gJGNoOworICAgIH0KKyAgICBpZiAoICRjaCBlcSAnIycgKSB7CisJZG8geworCSAgICAkY2ggPSBnZXRjKFNURElOKTsKKwl9IHdoaWxlICggZGVmaW5lZCgkY2gpICYmICRjaCBuZSAiXG4iICk7CisgICAgfQorICAgIHJldHVybiAkdG9rZW47Cit9CisKKyMgR2V0IGEgdG9rZW4sIGFuZCBtYWtlIHN1cmUgaXQgaXMgbnVtZXJpYyAoYW5kIGV4aXN0cykKK3N1YiBnZXRfbnVtZXJpY190b2tlbigpIHsKKyAgICBteSgkdG9rZW4pID0gZ2V0X3Rva2VuKCk7CisKKyAgICBpZiAoICR0b2tlbiAhfiAvXlswLTldKyQvICkgeworCXByaW50IFNUREVSUiAiRm9ybWF0IGVycm9yIG9uIGlucHV0XG4iOworCWV4aXQgMTsKKyAgICB9CisKKyAgICByZXR1cm4gJHRva2VuICsgMDsKK30KKworIyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgZWFjaCBwaXhlbCByb3cgaXMgcmVhZAorc3ViIHN0YXJ0X25ld19yb3coKSB7CisgICAgJGdldHJnYl9sZWZ0b3Zlcl9iaXRfY250ID0gMDsKKyAgICAkZ2V0cmdiX2xlZnRvdmVyX2JpdF92YWwgPSAwOworfQorCisjIEdldCBhIHNpbmdsZSBSR0IgdG9rZW4gZGVwZW5kaW5nIG9uIHRoZSBQTk0gdHlwZQorc3ViIGdldHJnYigkKSB7CisgICAgbXkoJGZvcm0pID0gQF87CisgICAgbXkoJHJnYiwkciwkZywkYik7CisKKyAgICBpZiAoICRmb3JtID09IDYgKSB7CisJIyBSYXcgUFBNLCBtb3N0IGNvbW1vbgorCXJldHVybiB1bmRlZiB1bmxlc3MgKCByZWFkKFNURElOLCRyZ2IsMykgPT0gMyApOworCXJldHVybiB1bnBhY2soIkNDQyIsICRyZ2IpOworICAgIH0gZWxzaWYgKCAkZm9ybSA9PSAzICkgeworCSMgUGxhaW4gUFBNCisJJHIgPSBnZXRfbnVtZXJpY190b2tlbigpOworCSRnID0gZ2V0X251bWVyaWNfdG9rZW4oKTsKKwkkYiA9IGdldF9udW1lcmljX3Rva2VuKCk7CisJcmV0dXJuICgkciwkZywkYik7CisgICAgfSBlbHNpZiAgKCAkZm9ybSA9PSA1ICkgeworCSMgUmF3IFBHTQorCXJldHVybiB1bmRlZiB1bmxlc3MgKCByZWFkKFNURElOLCRyZ2IsMSkgPT0gMSApOworCSRyID0gdW5wYWNrKCJDIiwgJHJnYik7CisJcmV0dXJuICgkciwkciwkcik7CisgICAgfSBlbHNpZiAoICRmb3JtID09IDIgKSB7CisJIyBQbGFpbiBQR00KKwkkciA9IGdldF9udW1lcmljX3Rva2VuKCk7CisJcmV0dXJuICgkciwkciwkcik7CisgICAgfSBlbHNpZiAoICRmb3JtID09IDQgKSB7CisJIyBSYXcgUEJNCisJaWYgKCAhJGdldHJnYl9sZWZ0b3Zlcl9iaXRfY250ICkgeworCSAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggcmVhZChTVERJTiwkcmdiLDEpID09IDEgKTsKKwkgICAgJGdldHJnYl9sZWZ0b3Zlcl9iaXRfdmFsID0gdW5wYWNrKCJDIiwgJHJnYik7CisJICAgICRnZXRyZ2JfbGVmdG92ZXJfYml0X2NudCA9IDg7CisJfQorCSRyID0gKCAkZ2V0cmdiX2xlZnRvdmVyX2JpdF92YWwgJiAweDgwICkgPyAweDAwIDogMHhmZjsKKwkkZ2V0cmdiX2xlZnRvdmVyX2JpdF92YWwgPDw9IDE7CisJJGdldHJnYl9sZWZ0b3Zlcl9iaXRfY250LS07CisKKwlyZXR1cm4gKCRyLCRyLCRyKTsKKyAgICB9IGVsc2lmICggJGZvcm0gPT0gMSApIHsKKwkjIFBsYWluIFBCTQorCW15KCRjaCk7CisKKwlkbyB7CisJICAgICRjaCA9IGdldGMoU1RESU4pOworCSAgICByZXR1cm4gdW5kZWYgaWYgKCAhZGVmaW5lZCgkY2gpICk7CisJICAgIHJldHVybiAoMjU1LDI1NSwyNTUpIGlmICggJGNoIGVxICcwJyApOyAjIFdoaXRlCisJICAgIHJldHVybiAoMCwwLDApIGlmICggJGNoIGVxICcxJyk7ICMgQmxhY2sKKwkgICAgaWYgKCAkY2ggZXEgJyMnICkgeworCQlkbyB7CisJCSAgICAkY2ggPSBnZXRjKFNURElOKTsKKwkJICAgIHJldHVybiB1bmRlZiBpZiAoICFkZWZpbmVkKCRjaCkgKTsKKwkJfSB3aGlsZSAoICRjaCBuZSAiXG4iICk7CisJICAgIH0KKwl9IHdoaWxlICggJGNoID1+IC9eWyBcdFxuXHZcZlxyXSQvICk7CisJcmV0dXJuIHVuZGVmOworICAgIH0gZWxzZSB7CisJZGllICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBmb3JtYXQ6ICRmb3JtXG4iOworICAgIH0KK30KKworc3ViIHJnYmNvbnZlcnQoJCQkJCkgeworICAgIG15KCRyLCRnLCRiLCRtYXhtdWx0KSA9IEBfOworICAgIG15KCRyZ2IpOworCisgICAgJHIgPSBpbnQoJHIqJG1heG11bHQpOworICAgICRnID0gaW50KCRnKiRtYXhtdWx0KTsKKyAgICAkYiA9IGludCgkYiokbWF4bXVsdCk7CisgICAgJHJnYiA9IHBhY2soIkNDQyIsICRyLCAkZywgJGIpOworICAgIHJldHVybiAkcmdiOworfQorCitmb3JlYWNoICRhcmcgKCBAQVJHViApIHsKKyAgICBpZiAoICRhcmcgPX4gL15cIyhbMC05YS1mXSkoWzAtOWEtZl0pKFswLTlhLWZdKT0oWzAtOV0rKSQvaSApIHsKKwkkciA9IGhleCgkMSkgPDwgNDsKKwkkZyA9IGhleCgkMikgPDwgNDsKKwkkYiA9IGhleCgkMykgPDwgNDsKKwkkaSA9ICQ0ICsgMDsKKyAgICB9IGVsc2lmICggJGFyZyA9fiAvXlwjKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPShbMC05XSspJC9pICkgeworCSRyID0gaGV4KCQxKTsKKwkkZyA9IGhleCgkMik7CisJJGIgPSBoZXgoJDMpOworCSRpID0gJDQgKyAwOworICAgIH0gZWxzaWYgKCAkYXJnID1+IC9eXCMoWzAtOWEtZl17M30pKFswLTlhLWZdezN9KShbMC05YS1mXXszfSk9KFswLTldKykkL2kgKSB7CisJJHIgPSBoZXgoJDEpID4+IDQ7CisJJGcgPSBoZXgoJDIpID4+IDQ7CisJJGIgPSBoZXgoJDMpID4+IDQ7CisJJGkgPSAkNCArIDA7CisgICAgfSBlbHNpZiAoICRhcmcgPX4gL15cIyhbMC05YS1mXXs0fSkoWzAtOWEtZl17NH0pKFswLTlhLWZdezR9KT0oWzAtOV0rKSQvaSApIHsKKwkkciA9IGhleCgkMSkgPj4gODsKKwkkZyA9IGhleCgkMikgPj4gODsKKwkkYiA9IGhleCgkMykgPj4gODsKKwkkaSA9ICQ0ICsgMDsKKyAgICB9IGVsc2UgeworCXByaW50IFNUREVSUiAiJDA6IFVua25vd24gYXJndW1lbnQ6ICRhcmdcbiI7CisJbmV4dDsKKyAgICB9CisKKyAgICBpZiAoICRpID4gMTUgKSB7CisJcHJpbnQgU1RERVJSICIkMDogQ29sb3IgaW5kZXggb3V0IG9mIHJhbmdlOiAkYXJnXG4iOworCW5leHQ7CisgICAgfQorCisgICAgJHJnYiA9IHJnYmNvbnZlcnQoJHIsICRnLCAkYiwgNjQvMjU2KTsKKworICAgIGlmICggZGVmaW5lZCgkaW5kZXhfZm9yY2VkeyRpfSkgKSB7CisJcHJpbnQgU1RERVJSICIkMDogTW9yZSB0aGFuIG9uZSBjb2xvciBpbmRleCAkaVxuIjsKKwlleGl0KDEpOworICAgIH0KKyAgICAkaW5kZXhfZm9yY2VkeyRpfSA9ICRyZ2I7CisgICAgJGZvcmNlX2luZGV4eyRyZ2J9ID0gJGk7Cit9CisKKyRmb3JtID0gZ2V0X3Rva2VuKCk7CitkaWUgIiQwOiBzdGRpbiBpcyBub3QgYSBQTk0gZmlsZSIgaWYgKCAkZm9ybSAhfiAvXlAoWzEtNl0pJC8gKTsKKyRmb3JtID0gJDErMDsKKworJHhzaXplID0gZ2V0X251bWVyaWNfdG9rZW4oKTsKKyR5c2l6ZSA9IGdldF9udW1lcmljX3Rva2VuKCk7CitpZiAoICRmb3JtID09IDEgfHwgJGZvcm0gPT0gNCApIHsKKyAgICAkbWF4Y29sID0gMjU1OwkJIyBJbnRlcm5hbCBjb252ZW50aW9uCit9IGVsc2UgeworICAgICRtYXhjb2wgPSBnZXRfbnVtZXJpY190b2tlbigpOworfQorJG1heG11bHQgPSA2NC8oJG1heGNvbCsxKTsJIyBFcXVhbCBidWNrZXRzIGNvbnZlcnNpb24KKworQGRhdGEgPSAoKTsKKworZm9yICggJHkgPSAwIDsgJHkgPCAkeXNpemUgOyAkeSsrICkgeworICAgIHN0YXJ0X25ld19yb3coKTsKKyAgICBmb3IgKCAkeCA9IDAgOyAkeCA8ICR4c2l6ZSA7ICR4KysgKSB7CisJZGllICIkMDogUHJlbWF0dXJlIEVPRiBhdCAoJHgsJHkpIG9mICgkeHNpemUsJHlzaXplKVxuIgorCSAgICBpZiAoICFzY2FsYXIoQHBubXJnYiA9IGdldHJnYigkZm9ybSkpICk7CisJIyBDb252ZXJ0IHRvIDYtYml0IHJlcHJlc2VudGF0aW9uCisJJHJnYiA9IHJnYmNvbnZlcnQoJHBubXJnYlswXSwgJHBubXJnYlsxXSwgJHBubXJnYlsyXSwgJG1heG11bHQpOworCSRjb2xvcl9jb3VudHskcmdifSsrOworCXB1c2goQGRhdGEsICRyZ2IpOworICAgIH0KK30KKworIyBTb3J0IGxpc3Qgb2YgY29sb3JzIGFjY29yZGluZyB0byBmcmVxZW5jeQorQGNvbG9ycyA9IHNvcnQgeyAkY29sb3JfY291bnR7JGJ9IDw9PiAkY29sb3JfY291bnR7JGF9IH0ga2V5cyglY29sb3JfY291bnQpOworCisjIE5vdyB3ZSBoYXZlIG91ciBwaWNrIG9mIGNvbG9ycy4gIFNvcnQgYWNjb3JkaW5nIHRvIGludGVuc2l0eTsKKyMgdGhpcyBpcyBtb3JlIG9yIGxlc3MgYW4gdWdseSBoYWNrIHRvIGNvdmVyIGZvciB0aGUgZmFjdCB0aGF0CisjIHVzaW5nIFBQTSBhcyBpbnB1dCBkb2Vzbid0IGxldCB0aGUgdXNlciBzZXQgdGhlIGNvbG9yIG1hcCwKKyMgd2hpY2ggdGhlIHVzZXIgcmVhbGx5IG5lZWRzIHRvIGJlIGFibGUgdG8gZG8uCisKK3N1YiBieV9pbnRlbnNpdHkoKSB7CisgICAgbXkoJHJhLCRnYSwkYmEpID0gdW5wYWNrKCJDQ0MiLCAkYSk7CisgICAgbXkoJHJiLCRnYiwkYmIpID0gdW5wYWNrKCJDQ0MiLCAkYik7CisKKyAgICBteSgkaWEpID0gJHJhKjAuMjk5ICsgJGdhKjAuNTg3ICsgJGJhKjAuMTE0OworICAgIG15KCRpYikgPSAkcmIqMC4yOTkgKyAkZ2IqMC41ODcgKyAkYmIqMC4xMTQ7CisKKyAgICByZXR1cm4gKCAkaWEgPD0+ICRpYiApIGlmICggJGlhICE9ICRpYiApOworCisgICAgIyBJZiBzYW1lLCBzb3J0IGJhc2VkIG9uIFJHQiBjb21wb25lbnRzLAorICAgICMgd2l0aCBoaWdoZXN0IHByaW9yaXR5IGdpdmVuIHRvIEcsIHRoZW4gUiwgdGhlbiBCLgorCisgICAgcmV0dXJuICggJGdhIDw9PiAkZ2IgKSBpZiAoICRnYSAhPSAkZ2IgKTsKKyAgICByZXR1cm4gKCAkcmEgPD0+ICRyYiApIGlmICggJHJhICE9ICRyYiApOworICAgIHJldHVybiAoICRiYSA8PT4gJGJiICk7Cit9CisKK0BpY29sb3JzID0gc29ydCBieV9pbnRlbnNpdHkgQGNvbG9yczsKKworIyBJbnNlcnQgZm9yY2VkIGNvbG9ycyBpbnRvICJmaW5hbCIgYXJyYXkKK0Bjb2xvcnMgPSAodW5kZWYpIHggMTY7Citmb3JlYWNoICRyZ2IgKCBrZXlzKCVmb3JjZV9pbmRleCkgKSB7CisgICAgJGkgPSAkZm9yY2VfaW5kZXh7JHJnYn07CisgICAgJGNvbG9yc1skaV0gPSAkcmdiOworICAgICRjb2xvcl9pbmRleHskcmdifSA9ICRpOworfQorCit1bmRlZiAlZm9yY2VfaW5kZXg7CisKKyMgSW5zZXJ0IHJlbWFpbmluZyBjb2xvcnMgaW4gdGhlIHJlbWFpbmluZyBzbG90cywKKyMgaW4gbHVtaW5vc2l0eS1zb3J0ZWQgb3JkZXIKKyRuaXggPSAwOword2hpbGUgKCBzY2FsYXIoQGljb2xvcnMpICkgeworICAgICMgQWR2YW5jZSB0byB0aGUgbmV4dCBmcmVlIHNsb3QKKyAgICAkbml4Kysgd2hpbGUgKCBkZWZpbmVkKCRjb2xvcnNbJG5peF0pICYmICRuaXggPCAxNiApOworICAgIGxhc3QgaWYgKCAkbml4ID49IDE2ICk7CisgICAgJHJnYiA9IHNoaWZ0IEBpY29sb3JzOworICAgIGlmICggIWRlZmluZWQoJGNvbG9yX2luZGV4eyRyZ2J9KSApIHsKKwkkY29sb3JzWyRuaXhdID0gJHJnYjsKKwkkY29sb3JfaW5kZXh7JHJnYn0gPSAkbml4OworICAgIH0KK30KKword2hpbGUgKCBzY2FsYXIoQGljb2xvcnMpICkgeworICAgICRyZ2IgPSBzaGlmdCBAaWNvbG9yczsKKyAgICAkbG9zdCsrIGlmICggIWRlZmluZWQoJGNvbG9yX2luZGV4eyRyZ2J9KSApOworfQorCitpZiAoICRsb3N0ICkgeworICAgIHByaW50ZiBTVERFUlIKKwkiJDA6IFdhcm5pbmc6IGNvbG9yIHBhbGV0dGUgdHJ1bmNhdGVkICglZCBjb2xvcnMgaWdub3JlZClcbiIsICRsb3N0OworfQorCit1bmRlZiBAaWNvbG9yczsKKworIyBPdXRwdXQgaGVhZGVyCitwcmludCBwYWNrKCJWdnYiLCAkbWFnaWMsICR4c2l6ZSwgJHlzaXplKTsKKworIyBPdXRwdXQgY29sb3IgbWFwCitmb3IgKCAkaSA9IDAgOyAkaSA8IDE2IDsgJGkrKyApIHsKKyAgICBpZiAoIGRlZmluZWQoJGNvbG9yc1skaV0pICkgeworCXByaW50ICRjb2xvcnNbJGldOworICAgIH0gZWxzZSB7CisJIyBQYWRkaW5nIGZvciB1bnVzZWQgY29sb3IgZW50cmllcworCXByaW50IHBhY2soIkNDQyIsIDYzKiRpLzE1LCA2MyokaS8xNSwgNjMqJGkvMTUpOworICAgIH0KK30KKworc3ViIG91dHB1dF9ueWJibGUoJCkgeworICAgIG15KCRueSkgPSBAXzsKKworICAgIGlmICggIWRlZmluZWQoJG55KSApIHsKKwlpZiAoIGRlZmluZWQoJG55YmJsZV90bXApICkgeworCSAgICAkbnkgPSAwOwkJIyBGb3JjZSB0aGUgbGFzdCBieXRlIG91dAorCX0gZWxzZSB7CisJICAgIHJldHVybjsKKwl9CisgICAgfQorCisgICAgJG55ID0gJG55ICYgMHgwRjsKKworICAgIGlmICggZGVmaW5lZCgkbnliYmxlX3RtcCkgKSB7CisJJG55ID0gKCRueSA8PCA0KSB8ICRueWJibGVfdG1wOworCXByaW50IGNocigkbnkpOworCSRieXRlcysrOworCXVuZGVmICRueWJibGVfdG1wOworICAgIH0gZWxzZSB7CisJJG55YmJsZV90bXAgPSAkbnk7CisgICAgfQorfQorCitzdWIgb3V0cHV0X3J1bigkJCQpIHsKKyAgICBteSgkbGFzdCwkdGhpcywkcnVuKSA9IEBfOworCisgICAgaWYgKCAkdGhpcyAhPSAkbGFzdCApIHsKKwlvdXRwdXRfbnliYmxlKCR0aGlzKTsKKwkkcnVuLS07CisgICAgfQorICAgIHdoaWxlICggJHJ1biApIHsKKwlpZiAoICRydW4gPj0gMTYgKSB7CisJICAgIG91dHB1dF9ueWJibGUoJHRoaXMpOworCSAgICBvdXRwdXRfbnliYmxlKDApOworCSAgICBpZiAoICRydW4gPiAyNzEgKSB7CisJCSRlcnVuID0gMjU1OworCQkkcnVuIC09IDI3MTsKKwkgICAgfSBlbHNlIHsKKwkJJGVydW4gPSAkcnVuLTE2OworCQkkcnVuID0gMDsKKwkgICAgfQorCSAgICBvdXRwdXRfbnliYmxlKCRlcnVuKTsKKwkgICAgb3V0cHV0X255YmJsZSgkZXJ1biA+PiA0KTsKKwl9IGVsc2UgeworCSAgICBvdXRwdXRfbnliYmxlKCR0aGlzKTsKKwkgICAgb3V0cHV0X255YmJsZSgkcnVuKTsKKwkgICAgJHJ1biA9IDA7CisJfQorICAgIH0KK30KKworJGJ5dGVzICA9IDA7Cit1bmRlZiAkbnliYmxlX3RtcDsKKworZm9yICggJHkgPSAwIDsgJHkgPCAkeXNpemUgOyAkeSsrICkgeworICAgICRsYXN0ID0gJHByZXYgPSAwOworICAgICRydW4gPSAwOworICAgIGZvciAoICR4ID0gMCA7ICR4IDwgJHhzaXplIDsgJHgrKyApIHsKKwkkcmdiID0gc2hpZnQoQGRhdGEpOworCSRpICAgPSAkY29sb3JfaW5kZXh7JHJnYn0gKyAwOworCWlmICggJGkgPT0gJGxhc3QgKSB7CisJICAgICRydW4rKzsKKwl9IGVsc2UgeworCSAgICBvdXRwdXRfcnVuKCRwcmV2LCAkbGFzdCwgJHJ1bik7CisJICAgICRwcmV2ID0gJGxhc3Q7CisJICAgICRsYXN0ID0gJGk7CisJICAgICRydW4gID0gMTsKKwl9CisgICAgfQorICAgICMgT3V0cHV0IGZpbmFsIGRhdHVtIGZvciByb3c7IHdlJ3JlIGFsd2F5cyBhdCBsZWFzdCBvbmUgcGl4ZWwgYmVoaW5kCisgICAgb3V0cHV0X3J1bigkcHJldiwgJGxhc3QsICRydW4pOworICAgIG91dHB1dF9ueWJibGUodW5kZWYpOwkjIEZsdXNoIHJvdworfQorCiskcGl4ZWxzID0gJHhzaXplICogJHlzaXplOworJHNpemUgPSAoJHBpeGVscysxKS8yOworcHJpbnRmIFNUREVSUiAiJWQgcGl4ZWxzLCAlZCBieXRlcywgKCUyLjJmJSUgY29tcHJlc3Npb24pXG4iLAorICAgICRwaXhlbHMsICRieXRlcywgMTAwKigkc2l6ZS0kYnl0ZXMpLyRzaXplOwpkaWZmIC0tZ2l0IGEvdXRpbHMvcHhlbGludXgtb3B0aW9ucyBiL3V0aWxzL3B4ZWxpbnV4LW9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDczZWVlNQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWxzL3B4ZWxpbnV4LW9wdGlvbnMKQEAgLTAsMCArMSw1NTIgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBTZXQgUFhFTElOVVggaGFyZC1jb2RlZCBvcHRpb25zCisjCisKK3VzZSBTb2NrZXQ7CQkJIyBGb3IgZ2V0aG9zdGJ5bmFtZQordXNlIEZjbnRsOwordXNlIGJ5dGVzOworCislb3B0aW9uX25hbWVzID0gKAorICAgICAgNiA9PiAnZG9tYWluLW5hbWUtc2VydmVycycsCisgICAgIDE1ID0+ICdkb21haW4tbmFtZScsCisgICAgIDU0ID0+ICduZXh0LXNlcnZlcicsCisgICAgMjA5ID0+ICdjb25maWctZmlsZScsCisgICAgMjEwID0+ICdwYXRoLXByZWZpeCcsCisgICAgMjExID0+ICdyZWJvb3R0aW1lJworICAgICk7CisKK0BmbXRfb25laXAgICA9ICgiaXAtYWRkcmVzcyIsIFwmcGFyc2Vfb25laXAsIFwmc2hvd19pcCk7CitAZm10X211bHRpaXAgPSAoImlwLWFkZHJlc3MtbGlzdCIsIFwmcGFyc2VfbXVsdGlpcCwgXCZzaG93X2lwKTsKK0BmbXRfc3RyaW5nICA9ICgic3RyaW5nIiwgXCZwYXJzZV9zdHJpbmcsIFwmc2hvd19zdHJpbmcpOworQGZtdF91aW50MzIgID0gKCJ1aW50MzIiLCBcJnBhcnNlX3VpbnQzMiwgXCZzaG93X3VpbnQzMik7CisKKyVvcHRpb25fZm9ybWF0ID0gKAorICAgICAgNiA9PiBcQGZtdF9tdWx0aWlwLAorICAgICAxNSA9PiBcQGZtdF9zdHJpbmcsCisgICAgIDU0ID0+IFxAZm10X29uZWlwLAorICAgICA2NyA9PiBcQGZtdF9zdHJpbmcsCisgICAgMjA5ID0+IFxAZm10X3N0cmluZywKKyAgICAyMTAgPT4gXEBmbXRfc3RyaW5nLAorICAgIDIxMSA9PiBcQGZtdF91aW50MzIKKyAgICApOworCitzdWIgcGFyc2Vfb25laXAoJCkKK3sKKyAgICBteSgkcykgPSBAXzsKKyAgICBteSgkbmFtZSwkYWxpYXNlcywkYWRkcnR5cGUsJGxlbmd0aCxAYWRkcnMpID0gZ2V0aG9zdGJ5bmFtZSgkcyk7CisKKyAgICByZXR1cm4gKCRhZGRydHlwZSA9PSBBRl9JTkVUKSA/ICRhZGRyc1swXSA6IHVuZGVmOworfQorCitzdWIgcGFyc2VfbXVsdGlpcCgkKQoreworICAgIG15KCRsKSA9IEBfOworICAgIG15ICRzOworICAgIG15IEBhID0gKCk7CisgICAgbXkgJGFkZHI7CisgICAgbXkgJGQgPSAnJzsKKworICAgIGZvcmVhY2ggJHMgKHNwbGl0KC8sLywgJGwpKSB7CisJbXkoJG5hbWUsJGFsaWFzZXMsJGFkZHJ0eXBlLCRsZW5ndGgsQGFkZHJzKQorCSAgICA9IGdldGhvc3RieW5hbWUoJHMpOworCWlmICgkYWRkcnR5cGUgPT0gQUZfSU5FVCkgeworCSAgICBmb3JlYWNoICRhZGRyIChAYWRkcnMpIHsKKwkJJGQgLj0gJGFkZHI7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuICRkIG5lICcnID8gJGQgOiB1bmRlZjsKK30KKworc3ViIHNob3dfaXAoJCkKK3sKKyAgICBteSgkbCkgPSBAXzsKKworICAgIGlmIChsZW5ndGgoJGwpICYgMykgeworCXJldHVybiB1bmRlZjsKKyAgICB9IGVsc2UgeworCW15IEBoID0gKCk7CisJbXkgJGk7CisKKwlmb3IgKCRpID0gMDsgJGkgPCBsZW5ndGgoJGwpOyAkaSArPSA0KSB7CisJICAgIHB1c2goQGgsIGluZXRfbnRvYShzdWJzdHIoJGwsICRpLCA0KSkpOworCX0KKworCXJldHVybiBqb2luKCcsJywgQGgpOworICAgIH0KK30KKworc3ViIHBhcnNlX3N0cmluZygkKQoreworICAgIHJldHVybiAkX1swXTsKK30KKworc3ViIHNob3dfc3RyaW5nKCQpCit7CisgICAgbXkoJHMpID0gQF87CisgICAgbXkgJG8sICRpLCAkYzsKKworICAgICRvID0gIlwnIjsKKyAgICBmb3IgKCRpID0gMDsgJGkgPCBsZW5ndGgoJHMpOyAkaSsrKSB7CisJJGMgPSBzdWJzdHIoJHMsICRpLCAxKTsKKwlpZiAoJGMgZXEgIlwnIiB8fCAkYyBlcSAnIScpIHsKKwkgICAgJG8gLj0gIlwnXFwkY1wnIjsKKwl9IGVsc2UgeworCSAgICAkbyAuPSAkYzsKKwl9CisgICAgfQorICAgICRvIC49ICJcJyI7CisKKyAgICByZXR1cm4gJG87Cit9CisKK3N1YiBwYXJzZV91aW50MzIoJCkKK3sKKyAgICBteSgkcykgPSBAXzsKKworICAgIGlmICgkcyA9fiAvXlswLTldKyQvKSB7CisJcmV0dXJuIHBhY2soIk4iLCAkcyk7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorfQorCitzdWIgc2hvd191aW50MzIoJCkKK3sKKyAgICBteSgkbCkgPSBAXzsKKworICAgIGlmIChsZW5ndGgoJGwpID09IDQpIHsKKwlyZXR1cm4gdW5wYWNrKCJOIiwgJGwpOworICAgIH0gZWxzZSB7CisJcmV0dXJuIHVuZGVmOworICAgIH0KK30KKworc3ViIHBhcnNlX2dlbmVyaWMoJCkKK3sKKyAgICBteSgkcykgPSBAXzsKKworICAgIGlmICgkcyA9fiAvXlswLTlhLWZdezEsMn0oOlswLTlhLWZdezEsMn0pKiQvKSB7CisJbXkgJGg7CisJbXkgQGIgPSAoKTsKKworCWZvcmVhY2ggJGggKHNwbGl0KC9cOi8sICRzKSkgeworCSAgICBwdXNoKEBiLCBoZXggJGgpOworCX0KKworCXJldHVybiBwYWNrKCJDIiwgQGIpOworICAgIH0gZWxzZSB7CisJcmV0dXJuIHVuZGVmOworICAgIH0KK30KKworc3ViIHNob3dfZ2VuZXJpYygkKQoreworICAgIG15KCRsKSA9IEBfOworICAgIG15ICRpOworICAgIG15IEBoOworCisgICAgZm9yICgkaSA9IDA7ICRpIDwgbGVuZ3RoKCRsKTsgJGkrKykgeworCXB1c2goQGgsIHNwcmludGYoIiUwMngiLCB1bnBhY2soIkMiLCBzdWJzdHIoJGwsICRpLCAkMSkpKSk7CisgICAgfQorCisgICAgcmV0dXJuIGpvaW4oJzonLCBAaCk7Cit9CisKK3N1YiBwYXJzZV9vcHRpb24oJCQpCit7CisgICAgbXkoJG9wdCwgJGFyZykgPSBAXzsKKyAgICBteSAkdjsKKworICAgIGlmIChkZWZpbmVkKCRvcHRpb25fZm9ybWF0eyRvcHR9KSkgeworCSR2ID0gJG9wdGlvbl9mb3JtYXR7JG9wdH1bMV0oJGFyZyk7CisJcmV0dXJuICR2IGlmIChkZWZpbmVkKCR2KSk7CisgICAgfQorCisgICAgcmV0dXJuIHBhcnNlX2dlbmVyaWMoJGFyZyk7Cit9CisKK3N1YiBzaG93X29wdGlvbigkJCkKK3sKKyAgICBteSgkb3B0LCAkYXJnKSA9IEBfOworICAgIG15ICR2OworCisgICAgaWYgKGRlZmluZWQoJG9wdGlvbl9mb3JtYXR7JG9wdH0pKSB7CisJJHYgPSAkb3B0aW9uX2Zvcm1hdHskb3B0fVsyXSgkYXJnKTsKKwlyZXR1cm4gJHYgaWYgKGRlZmluZWQoJHYpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2hvd19nZW5lcmljKCRhcmcpOworfQorCitzdWIgb3B0aW9uX251bWJlcigkKQoreworICAgIG15KCRuKSA9IEBfOworCisgICAgaWYgKGRlZmluZWQoJG9wdGlvbl9ybmFtZXN7JG59KSkgeworCXJldHVybiAkb3B0aW9uX3JuYW1lc3skbn07CisgICAgfSBlbHNpZiAoJG4gPX4gL15bMC05XSskLyAmJiAkbiA+PSAxICYmICRuIDw9IDI1NCkgeworCXJldHVybiAkbiswOworICAgIH0gZWxzZSB7CisJcmV0dXJuIHVuZGVmOworICAgIH0KK30KKworc3ViIHJlYWRfb3B0c2V0cygkKQoreworICAgIG15KCRmaWxlKSA9IEBfOworICAgIG15ICRkYXRhLCAkYmRhdGEsICRhZGF0YTsKKyAgICBteSAkcGF0Y2hfc3RhcnQgPSAoc3RhdCgkZmlsZSkpWzddOworICAgIG15ICRoZHJvZmZzZXQgPSAwOwkJIyAwIG1lYW5zIG5vbi1kZWVwLWVtYmVkZGVkCisgICAgbXkgJGJ1ZnNpemUgPSAwOworICAgIG15ICRqdW5rOworICAgIG15ICVoZHI7CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIChzZWVrKCRmaWxlLCAwLCBTRUVLX1NFVCkpOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKHJlYWQoJGZpbGUsICRkYXRhLCA0OCkgPT0gNDgpOworCisgICAgbXkoJG16bWFnaWMsICRqdW5rLCAkbWFnaWMsICRsZW4sICRmbGFncywgJGJvZmYsICRibGVuLCAkYW9mZiwgJGFsZW4pCisJPSB1bnBhY2soInZhWzZdVlZWVlZWViIsICRkYXRhKTsKKworICAgIGlmICgkbXptYWdpYyA9PSAweDVhNGQpIHsKKwkjIEl0IGlzIGFuIEVGSSBmaWxlLi4uIHNlYXJjaCBmb3IgdGhlIG1hZ2ljIG51bWJlcgorCSRoZHJvZmZzZXQgPSA0ODsKKwlteSAkbWFnaWMgPSBwYWNrKCJWVlZWIiwgMHgyYTE3MWVhZCwgMHgwNjAwZTY1ZSwKKwkJCSAweDQwMjVhNGU0LCAweDQyMzg4ZmM4KTsKKworCXdoaWxlICgxKSB7CisJICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKHJlYWQoJGZpbGUsICRkYXRhLCAxNikgPT0gMTYpOworCSAgICBsYXN0IGlmICgkZGF0YSBlcSAkbWFnaWMpOworCisJICAgICRoZHJvZmZzZXQgKz0gMTY7CisJfQorCisJcmV0dXJuIHVuZGVmIHVubGVzcyAocmVhZCgkZmlsZSwgJGRhdGEsIDE2KSA9PSAxNik7CisJKCRibGVuLCAkYWxlbiwgJGJ1ZnNpemUsICRqdW5rKSA9IHVucGFjaygiVlZWViIsICRkYXRhKTsKKworCSRwYXRjaF9zdGFydCA9ICRib2ZmID0gJGhkcm9mZnNldCArIDMyOworCSRhb2ZmID0gJGJvZmYgKyAkYmxlbjsKKworCSRoZHJ7J2RlZXAnfSA9IDE7CisJJGhkcnsnYnVmc2l6ZSd9ID0gJGJ1ZnNpemU7CisJJGhkcnsnaGRyb2Zmc2V0J30gPSAkaGRyb2Zmc2V0OworICAgIH0gZWxzZSB7CisJIyBJdCBpcyBhIEJJT1MgUFhFIGZpbGUKKworCXJldHVybiB1bmRlZiBpZiAoJG1hZ2ljICE9IDB4Mjk4M2M4YWMpOworCXJldHVybiB1bmRlZiBpZiAoJGxlbiA8IDcqNCk7CisKKwkkaGRyeydkZWVwJ30gPSAwOworICAgIH0KKworICAgIGlmICgkYmxlbiA9PSAwKSB7CisJJGJkYXRhID0gJyc7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzIChzZWVrKCRmaWxlLCAkYm9mZiwgU0VFS19TRVQpKTsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzIChyZWFkKCRmaWxlLCAkYmRhdGEsICRibGVuKSA9PSAkYmxlbik7CisJJHBhdGNoX3N0YXJ0ID0gJGJvZmYgaWYgKCRib2ZmIDwgcGF0Y2hfc3RhcnQpOworICAgIH0KKworICAgIGlmICgkYWxlbiA9PSAwKSB7CisJJGFkYXRhID0gJyc7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzIChzZWVrKCRmaWxlLCAkYW9mZiwgU0VFS19TRVQpKTsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzIChyZWFkKCRmaWxlLCAkYWRhdGEsICRhbGVuKSA9PSAkYWxlbik7CisJJHBhdGNoX3N0YXJ0ID0gJGFvZmYgaWYgKCRhb2ZmIDwgJHBhdGNoX3N0YXJ0KTsKKyAgICB9CisKKyAgICAkaGRyeydwYXRjaF9zdGFydCd9ID0gJHBhdGNoX3N0YXJ0OworCisgICAgcmV0dXJuIChcJWhkciwgJGJkYXRhLCAkYWRhdGEpOworfQorCitzdWIgd3JpdGVfb3B0c2V0cygkJEApCit7CisgICAgbXkoJGZpbGUsICRoZHIsICRiZGF0YSwgJGFkYXRhKSA9IEBfOworICAgIG15ICRib2ZmID0gMDsKKyAgICBteSAkYW9mZiA9IDA7CisgICAgbXkgJGJ1ZnNpemUgPSAwOworICAgIG15ICRwYXRjaF9zdGFydCA9ICRoZHItPnsncGF0Y2hfc3RhcnQnfTsKKyAgICBteSAkbGVuOworCisgICAgJGJkYXRhIC49ICJceGZmIiB1bmxlc3MgKCRiZGF0YSBlcSAnJyk7CisgICAgJGFkYXRhIC49ICJceGZmIiB1bmxlc3MgKCRhZGF0YSBlcSAnJyk7CisKKyAgICAkbGVuID0gbGVuZ3RoKCRiZGF0YSkgKyBsZW5ndGgoJGFkYXRhKTsKKworICAgIGlmIChkZWZpbmVkKCRoZHItPnsnYnVmc2l6ZSd9KSkgeworCXJldHVybiB1bmRlZiB1bmxlc3MgKCRsZW4gPD0gJGhkci0+eydidWZzaXplJ30pOworICAgIH0KKworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKHNlZWsoJGZpbGUsICRwYXRjaF9zdGFydCwgU0VFS19TRVQpKTsKKworICAgIGlmIChsZW5ndGgoJGJkYXRhKSkgeworCSRib2ZmID0gJHBhdGNoX3N0YXJ0OworCXJldHVybiB1bmRlZiB1bmxlc3MgKHByaW50ICRmaWxlICRiZGF0YSk7CisJJHBhdGNoX3N0YXJ0ICs9IGxlbmd0aCgkYmRhdGEpOworICAgIH0KKworICAgIGlmIChsZW5ndGgoJGFkYXRhKSkgeworCSRhb2ZmID0gJHBhdGNoX3N0YXJ0OworCXJldHVybiB1bmRlZiB1bmxlc3MgKHByaW50ICRmaWxlICRhZGF0YSk7CisJJHBhdGNoX3N0YXJ0ICs9IGxlbmd0aCgkYWRhdGEpOworICAgIH0KKworICAgIGlmICgkaGRyLT57J2RlZXAnfSkgeworCXJldHVybiB1bmRlZiB1bmxlc3MgKHByaW50ICRmaWxlICJcMCIgeCAoJGhkci0+eydidWZzaXplJ30gLSAkbGVuKSk7CisJcmV0dXJuIHVuZGVmIHVubGVzcyAoc2VlaygkZmlsZSwgJGhkci0+eydoZHJvZmZzZXQnfSArIDE2LCBTRUVLX1NFVCkpOworCW15ICRoZHIgPSBwYWNrKCJWViIsIGxlbmd0aCgkYmRhdGEpLCBsZW5ndGgoJGFkYXRhKSk7CisJcmV0dXJuIHVuZGVmIHVubGVzcyAocHJpbnQgJGZpbGUgJGhkcik7CisgICAgfSBlbHNlIHsKKwlteSAkaGRyID0gcGFjaygiVlZWViIsICRib2ZmLCBsZW5ndGgoJGJkYXRhKSwgJGFvZmYsIGxlbmd0aCgkYWRhdGEpKTsKKworCXJldHVybiB1bmRlZiB1bmxlc3MgKHNlZWsoJGZpbGUsIDgrMyo0LCBTRUVLX1NFVCkpOworCXJldHVybiB1bmRlZiB1bmxlc3MgKHByaW50ICRmaWxlICRoZHIpOworCisJdHJ1bmNhdGUoJGZpbGUsICRwYXRjaF9zdGFydCk7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBkZWxldGVfb3B0aW9uKCQkKQoreworICAgIG15ICgkbnVtLCAkYmxvY2spID0gQF87CisgICAgbXkgJG8sICRsLCAkYywgJHg7CisKKyAgICAkeCA9IDA7CisgICAgd2hpbGUgKCR4IDwgbGVuZ3RoKCRibG9jaykpIHsKKwkoJG8sICRsKSA9IHVucGFjaygiQ0MiLCBzdWJzdHIoJGJsb2NrLCAkeCwgMikpOworCWlmICgkbyA9PSAkbnVtKSB7CisJICAgICMgRGVsZXRlIHRoaXMgb3B0aW9uCisJICAgIHN1YnN0cigkYmxvY2ssICR4LCAkbCsyKSA9ICcnOworCX0gZWxzaWYgKCRvID09IDApIHsKKwkgICAgIyBEZWxldGUgYSBudWxsIG9wdGlvbgorCSAgICBzdWJzdHIoJGJsb2NrLCAkeCwgMSkgPSAnJzsKKwl9IGVsc2lmICgkbyA9PSAyNTUpIHsKKwkgICAgIyBFbmQgbWFya2VyIC0gdHJ1bmNhdGUgYmxvY2sKKwkgICAgJGJsb2NrID0gc3Vic3RyKCRibG9jaywgMCwgJHgpOworCSAgICBsYXN0OworCX0gZWxzZSB7CisJICAgICMgU2tpcCB0byB0aGUgbmV4dCBvcHRpb24KKwkgICAgJHggKz0gJGwrMjsKKwl9CisgICAgfQorCisgICAgcmV0dXJuICRibG9jazsKK30KKworc3ViIGFkZF9vcHRpb24oJCQkKQoreworICAgIG15ICgkbnVtLCAkZGF0YSwgJGJsb2NrKSA9IEBfOworCisgICAgJGJsb2NrID0gZGVsZXRlX29wdGlvbigkbnVtLCAkYmxvY2spOworCisgICAgaWYgKGxlbmd0aCgkZGF0YSkgPT0gMCkgeworCXJldHVybiAkYmxvY2s7CisgICAgfSBlbHNpZiAobGVuZ3RoKCRkYXRhKSA+IDI1NSkgeworCWRpZSAiJDA6IG9wdGlvbiAkbnVtIGhhcyB0b28gbXVjaCBkYXRhIChtYXggMjU1IGJ5dGVzKVxuIjsKKyAgICB9IGVsc2UgeworCXJldHVybiAkYmxvY2sgLiBwYWNrKCJDQyIsICRudW0sIGxlbmd0aCgkZGF0YSkpIC4gJGRhdGE7CisgICAgfQorfQorCitzdWIgbGlzdF9vcHRpb25zKCQkKQoreworICAgIG15KCRwZngsICRkYXRhKSA9IEBfOworICAgIG15ICR4LCAkbywgJGw7CisKKyAgICB3aGlsZSAoJHggPCBsZW5ndGgoJGRhdGEpKSB7CisJKCRvLCAkbCkgPSB1bnBhY2soIkNDIiwgc3Vic3RyKCRkYXRhLCAkeCwgMikpOworCisJaWYgKCRvID09IDApIHsKKwkgICAgJHgrKzsKKwl9IGVsc2lmICgkbyA9PSAyNTUpIHsKKwkgICAgbGFzdDsKKwl9IGVsc2UgeworCSAgICBteSAkb2RhdGEgPSBzdWJzdHIoJGRhdGEsICR4KzIsICRsKTsKKwkgICAgbGFzdCBpZiAobGVuZ3RoKCRvZGF0YSkgIT0gJGwpOyAjIEluY29tcGxldGUgb3B0aW9uCisKKwkgICAgcHJpbnRmICIlcyUtMjBzICVzXG4iLCAkcGZ4LAorCQkkb3B0aW9uX25hbWVzeyRvfSB8fCBzcHJpbnRmKCIlZCIsICRvKSwKKwkJc2hvd19vcHRpb24oJG8sICRvZGF0YSk7CisKKwkgICAgJHggKz0gJGwrMjsKKwl9CisgICAgfQorfQorCitzdWIgdXNhZ2UoKQoreworICAgIG15ICRpOworCisgICAgcHJpbnQgU1RERVJSICJVc2FnZTogJDAgb3B0aW9ucyBweGVsaW51eC4wXG4iOworICAgIHByaW50IFNUREVSUiAiT3B0aW9uczpcbiI7CisgICAgcHJpbnQgU1RERVJSICItLWJlZm9yZSBvcHRpb24gdmFsdWUgICAtYiAgIEFkZCBhbiBvcHRpb24gYmVmb3JlIERIQ1AgZGF0YVxuIjsKKyAgICBwcmludCBTVERFUlIgIi0tYWZ0ZXIgIG9wdGlvbiB2YWx1ZSAgIC1hICAgQWRkIGFuIG9wdGlvbiBhZnRlciBESENQIGRhdGFcbiI7CisgICAgcHJpbnQgU1RERVJSICItLWRlbGV0ZSBvcHRpb24gICAgICAgICAtZCAgIERlbGV0ZSBhbiBvcHRpb25cbiI7CisgICAgcHJpbnQgU1RERVJSICItLWxpc3QgICAgICAgICAgICAgICAgICAtbCAgIExpc3Qgc2V0IG9wdGlvbnNcbiI7CisgICAgcHJpbnQgU1RERVJSICItLWRyeS1ydW4gICAgICAgICAgICAgICAtbiAgIERvbid0IG1vZGlmeSB0aGUgdGFyZ2V0IGZpbGVcbiI7CisgICAgcHJpbnQgU1RERVJSICItLWhlbHAgICAgICAgICAgICAgICAgICAtaCAgIERpc3BsYXkgdGhpcyBoZWxwIHRleHRcbiI7CisgICAgcHJpbnQgU1RERVJSICJcbiI7CisgICAgcHJpbnQgU1RERVJSICJUaGUgZm9sbG93aW5nIERIQ1Agb3B0aW9ucyBhcmUgY3VycmVudGx5IHJlY29nbml6ZWQ6XG4iOworICAgIHByaW50ZiBTVERFUlIgIiUtMjNzICUtM3MgICVzXG4iLCAnTmFtZScsICdOdW0nLCAnVmFsdWUgRm9ybWF0JzsKKworICAgIGZvcmVhY2ggJGkgKHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzKCVvcHRpb25fbmFtZXMpKSB7CisJcHJpbnRmIFNUREVSUiAiJS0yM3MgJTNkICAlc1xuIiwKKwkJJG9wdGlvbl9uYW1lc3skaX0sICRpLCAkb3B0aW9uX2Zvcm1hdHskaX1bMF07CisgICAgfQorfQorCislb3B0aW9uX3JuYW1lcyA9ICgpOworZm9yZWFjaCAkb3B0IChrZXlzKCVvcHRpb25fbmFtZXMpKSB7CisgICAgJG9wdGlvbl9ybmFtZXN7JG9wdGlvbl9uYW1lc3skb3B0fX0gPSAkb3B0OworfQorCislYmVmb3JlICAgPSAoKTsKKyVhZnRlciAgICA9ICgpOworQGNsZWFyICAgID0gKCk7CiskdXNhZ2UgICAgPSAwOworJGVyciAgICAgID0gMDsKKyRsaXN0ICAgICA9IDA7Ciskbm9fd3JpdGUgPSAwOwordW5kZWYgJGZpbGU7CisKK3doaWxlIChkZWZpbmVkKCRvcHQgPSBzaGlmdChAQVJHVikpKSB7CisgICAgaWYgKCRvcHQgIX4gL14tLykgeworCWlmIChkZWZpbmVkKCRmaWxlKSkgeworCSAgICAkZXJyID0gJHVzYWdlID0gMTsKKwkgICAgbGFzdDsKKwl9CisJJGZpbGUgPSAkb3B0OworICAgIH0gZWxzaWYgKCRvcHQgZXEgJy1iJyB8fCAkb3B0IGVxICctLWJlZm9yZScpIHsKKwkkb25hbWUgPSBzaGlmdChAQVJHVik7CisJJG9kYXRhID0gc2hpZnQoQEFSR1YpOworCisJaWYgKCFkZWZpbmVkKCRvZGF0YSkpIHsKKwkgICAgJGVyciA9ICR1c2FnZSA9IDE7CisJICAgIGxhc3Q7CisJfQorCisJJG9udW0gPSBvcHRpb25fbnVtYmVyKCRvbmFtZSk7CisJaWYgKCFkZWZpbmVkKCRvbnVtKSkgeworCSAgICBwcmludCBTVERFUlIgIiQwOiB1bmtub3duIG9wdGlvbiBuYW1lOiAkb25hbWVcbiI7CisJICAgICRlcnIgPSAxOworCSAgICBuZXh0OworCX0KKworCSRvZGF0YSA9IHBhcnNlX29wdGlvbigkb251bSwgJG9kYXRhKTsKKwlpZiAoIWRlZmluZWQoJG9kYXRhKSkgeworCSAgICBwcmludCBTVERFUlIgIiQwOiB1bmFibGUgdG8gcGFyc2UgZGF0YSBmb3Igb3B0aW9uICRvbmFtZVxuIjsKKwkgICAgJGVyciA9IDE7CisJICAgIG5leHQ7CisJfQorCisJZGVsZXRlICRhZnRlcnskb251bX07CisJJGJlZm9yZXskb251bX0gPSAkb2RhdGE7CisJcHVzaChAY2xlYXIsICRvbnVtKTsKKyAgICB9IGVsc2lmICgkb3B0IGVxICctYScgfHwgJG9wdCBlcSAnLS1hZnRlcicpIHsKKwkkb25hbWUgPSBzaGlmdChAQVJHVik7CisJJG9kYXRhID0gc2hpZnQoQEFSR1YpOworCisJaWYgKCFkZWZpbmVkKCRvZGF0YSkpIHsKKwkgICAgJGVyciA9ICR1c2FnZSA9IDE7CisJICAgIGxhc3Q7CisJfQorCisJJG9udW0gPSBvcHRpb25fbnVtYmVyKCRvbmFtZSk7CisJaWYgKCFkZWZpbmVkKCRvbnVtKSkgeworCSAgICBwcmludCBTVERFUlIgIiQwOiB1bmtub3duIG9wdGlvbiBuYW1lOiAkb25hbWVcbiI7CisJICAgICRlcnIgPSAxOworCSAgICBuZXh0OworCX0KKworCSRvZGF0YSA9IHBhcnNlX29wdGlvbigkb251bSwgJG9kYXRhKTsKKwlpZiAoIWRlZmluZWQoJG9kYXRhKSkgeworCSAgICBwcmludCBTVERFUlIgIiQwOiB1bmFibGUgdG8gcGFyc2UgZGF0YSBmb3Igb3B0aW9uICRvbmFtZVxuIjsKKwkgICAgJGVyciA9IDE7CisJICAgIG5leHQ7CisJfQorCisJZGVsZXRlICRiZWZvcmV7JG9udW19OworCSRhZnRlcnskb251bX0gPSAkb2RhdGE7CisJcHVzaChAY2xlYXIsICRvbnVtKTsKKyAgICB9IGVsc2lmICgkb3B0IGVxICctZCcgfHwgJG9wdCBlcSAnLS1kZWxldGUnKSB7CisJJG9uYW1lID0gc2hpZnQoQEFSR1YpOworCisJaWYgKCFkZWZpbmVkKCRvbmFtZSkpIHsKKwkgICAgJGVyciA9ICR1c2FnZSA9IDE7CisJICAgIGxhc3Q7CisJfQorCisJJG9udW0gPSBvcHRpb25fbnVtYmVyKCRvbmFtZSk7CisJaWYgKCFkZWZpbmVkKCRvbnVtKSkgeworCSAgICBwcmludCBTVERFUlIgIiQwOiB1bmtub3duIG9wdGlvbiBuYW1lOiAkb25hbWVcbiI7CisJICAgICRlcnIgPSAxOworCSAgICBuZXh0OworCX0KKworCXB1c2goQGNsZWFyLCAkb251bSk7CisJZGVsZXRlICRiZWZvcmV7JG9udW19OworCWRlbGV0ZSAkYWZ0ZXJ7JG9udW19OworICAgIH0gZWxzaWYgKCRvcHQgZXEgJy1uJyB8fCAkb3B0IGVxICctLW5vLXdyaXRlJyB8fCAkb3B0IGVxICctLWRyeS1ydW4nKSB7CisJJG5vX3dyaXRlID0gMTsKKyAgICB9IGVsc2lmICgkb3B0IGVxICctbCcgfHwgJG9wdCBlcSAnLS1saXN0JykgeworCSRsaXN0ID0gMTsKKyAgICB9IGVsc2lmICgkb3B0IGVxICctaCcgfHwgJG9wdCBlcSAnLS1oZWxwJykgeworCSR1c2FnZSA9IDE7CisgICAgfSBlbHNlIHsKKwlwcmludCBTVERFUlIgIkludmFsaWQgb3B0aW9uOiAkb3B0XG4iOworCSRlcnIgPSAkdXNhZ2UgPSAxOworICAgIH0KK30KKworaWYgKCFkZWZpbmVkKCRmaWxlKSAmJiAhJHVzYWdlKSB7CisgICAgJGVyciA9ICR1c2FnZSA9IDE7Cit9CitpZiAoJHVzYWdlKSB7CisgICAgdXNhZ2UoKTsKK30KK2lmICgkZXJyIHx8ICR1c2FnZSkgeworICAgIGV4aXQoJGVycik7Cit9CisKK2lmICghc2NhbGFyKEBjbGVhcikpIHsKKyAgICAkbm9fd3JpdGUgPSAxOwkJIyBObyBtb2RpZmljYXRpb25zIHJlcXVlc3RlZAorfQorCiskbW9kZSA9ICRub193cml0ZSA/ICc8JyA6ICcrPCc7CisKK29wZW4oRklMRSwgJG1vZGUsICRmaWxlKQorICAgIG9yIGRpZSAiJDA6IGNhbm5vdCBvcGVuOiAkZmlsZTogJCFcbiI7CisoJGhkcmluZm8sIEBkYXRhKSA9IHJlYWRfb3B0c2V0cyhcKkZJTEUpOworaWYgKCFkZWZpbmVkKCRoZHJpbmZvKSkgeworICAgIGRpZSAiJDA6ICRmaWxlOiBwYXRjaCBibG9jayBub3QgZm91bmQgb3IgZmlsZSBjb3JydXB0XG4iOworfQorCitmb3JlYWNoICRvIChAY2xlYXIpIHsKKyAgICAkZGF0YVswXSA9IGRlbGV0ZV9vcHRpb24oJG8sICRkYXRhWzBdKTsKKyAgICAkZGF0YVsxXSA9IGRlbGV0ZV9vcHRpb24oJG8sICRkYXRhWzFdKTsKK30KK2ZvcmVhY2ggJG8gKGtleXMoJWJlZm9yZSkpIHsKKyAgICAkZGF0YVswXSA9IGFkZF9vcHRpb24oJG8sICRiZWZvcmV7JG99LCAkZGF0YVswXSk7Cit9Citmb3JlYWNoICRvIChrZXlzKCVhZnRlcikpIHsKKyAgICAkZGF0YVsxXSA9IGFkZF9vcHRpb24oJG8sICRhZnRlcnskb30sICRkYXRhWzFdKTsKK30KKworaWYgKCRsaXN0KSB7CisgICAgbGlzdF9vcHRpb25zKCctYiAnLCAkZGF0YVswXSk7CisgICAgbGlzdF9vcHRpb25zKCctYSAnLCAkZGF0YVsxXSk7Cit9CisKK2lmICghJG5vX3dyaXRlKSB7CisgICAgaWYgKCF3cml0ZV9vcHRzZXRzKFwqRklMRSwgJGhkcmluZm8sIEBkYXRhKSkgeworCWRpZSAiJDA6ICRmaWxlOiBmYWlsZWQgdG8gd3JpdGUgb3B0aW9uczogJCFcbiI7CisgICAgfQorfQorCitjbG9zZShGSUxFKTsKK2V4aXQgMDsKZGlmZiAtLWdpdCBhL3V0aWxzL3NoYTFwYXNzIGIvdXRpbHMvc2hhMXBhc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2JlMmRiYwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWxzL3NoYTFwYXNzCkBAIC0wLDAgKzEsMzQgQEAKKyMhL3Vzci9iaW4vcGVybAorCit1c2UgYnl0ZXM7Cit1c2UgRGlnZXN0OjpTSEExOwordXNlIE1JTUU6OkJhc2U2NDsKKworc3ViIHJhbmRvbV9ieXRlcygkKSB7CisgICAgbXkoJG4pID0gQF87CisgICAgbXkoJHYsICRpKTsKKworICAgIGlmICggb3BlbihSQU5ET00sICc8JywgJy9kZXYvcmFuZG9tJykgfHwKKwkgb3BlbihSQU5ET00sICc8JywgJy9kZXYvdXJhbmRvbScpICkgeworCXJlYWQoUkFORE9NLCAkdiwgJG4pOworICAgIH0gZWxzZSB7CisJIyBObyByZWFsIFJORyBhdmFpbGFibGUuLi4KKwlzcmFuZCgkJCBeIHRpbWUpOworCSR2ID0gJyc7CisJZm9yICggJGkgPSAwIDsgJGkgPCAkbiA7ICRpKysgKSB7CisJICAgICR2IC49IG9yZChpbnQocmFuZCgpICogMjU2KSk7CisJfQorICAgIH0KKworICAgIHJldHVybiAkdjsKK30KKworCisoJHBhc3MsICRzYWx0KSA9IEBBUkdWOworCit1bmxlc3MgKGRlZmluZWQoJHNhbHQpKSB7CisgICAgJHNhbHQgPSBNSU1FOjpCYXNlNjQ6OmVuY29kZShyYW5kb21fYnl0ZXMoNiksICcnKTsKK30KKyRwYXNzID0gRGlnZXN0OjpTSEExOjpzaGExX2Jhc2U2NCgkc2FsdCwgJHBhc3MpOworCitwcmludCAnJDQkJywgJHNhbHQsICckJywgJHBhc3MsICJcJFxuIjsKZGlmZiAtLWdpdCBhL3V0aWxzL3N5c2xpbnV4MmFuc2kgYi91dGlscy9zeXNsaW51eDJhbnNpCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA4NWY2YzkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9zeXNsaW51eDJhbnNpCkBAIC0wLDAgKzEsNTMgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBQZXJsIHNjcmlwdCB0byBjb252ZXJ0IGEgU3lzbGludXgtZm9ybWF0IHNjcmVlbiB0byBQQy1BTlNJCisjIHRvIGRpc3BsYXkgaW4gYSBjb2xvciB4dGVybSBvciBvbiB0aGUgTGludXggY29uc29sZQorIworCitAYW5zaWNvbCA9ICgwLDQsMiw2LDEsNSwzLDcpOworCiskZ2V0dGluZ19maWxlID0gMDsKKyRlbmFibGUgPSAxOworCit3aGlsZSAoIHJlYWQoU1RESU4sICRjaCwgMSkgPiAwICkgeworICAgIGlmICggJGNoIGVxICJceDFBIiApIHsJIyA8U1VCPiA8Q3RybC1aPiBFT0YKKwlsYXN0OworICAgIH0gZWxzaWYgKCAkY2ggZXEgIlx4MEMiICkgewkjIDxGRj4gIDxDdHJsLUw+IENsZWFyIHNjcmVlbgorCXByaW50ICJceDFiWzJKIiBpZiAoICRlbmFibGUgJiYgISRnZXR0aW5nX2ZpbGUgKTsKKyAgICB9IGVsc2lmICggJGNoIGVxICJceDBGIiApIHsJIyA8U0k+ICA8Q3RybC1PPiBBdHRyaWJ1dGUgY2hhbmdlCisJaWYgKCAhJGdldHRpbmdfZmlsZSApIHsKKwkgICAgaWYgKCByZWFkKFNURElOLCAkYXR0ciwgMikgPT0gMiApIHsKKwkJJGF0dHIgPSBoZXggJGF0dHI7CisJCWlmICggJGVuYWJsZSApIHsKKwkJICAgIHByaW50ICJceDFiWzA7IjsKKwkJICAgIGlmICggJGF0dHIgJiAweDgwICkgeworCQkJcHJpbnQgIjU7IjsKKwkJCSRhdHRyICY9IH4weDgwOworCQkgICAgfQorCQkgICAgaWYgKCAkYXR0ciAmIDB4MDggKSB7CisJCQlwcmludCAiMTsiOworCQkJJGF0dHIgJj0gfjB4MDg7CisJCSAgICB9CisJCSAgICBwcmludGYgIiVkOyVkbSIsCisJCSAgICAkYW5zaWNvbFskYXR0ciA+PiA0XSArIDQwLCAkYW5zaWNvbFskYXR0ciAmIDddICsgMzA7CisJCX0KKwkgICAgfQorCX0KKyAgICB9IGVsc2lmICggJGNoIGVxICJceDE4IiApIHsJIyA8Q0FOPiA8Q3RybC1YPiBEaXNwbGF5IGltYWdlCisJIyBXZSBjYW4ndCBkaXNwbGF5IGFuIGltYWdlOyBwcmV0ZW5kIHRvIGJlIGEgdGV4dCBzY3JlZW4KKwkjIElnbm9yZSBhbGwgaW5wdXQgdW50aWwgZW5kIG9mIGxpbmUKKwkkZ2V0dGluZ19maWxlID0gMTsKKyAgICB9IGVsc2lmICggKG9yZCgkY2gpICYgfjA3KSA9PSAweDEwICkgeyAjIE1vZGUgY29udHJvbHMKKwkkZW5hYmxlID0gKG9yZCgkY2gpICYgMHgwMSk7ICMgRW11bGF0ZSB0aGUgdGV4dCBzY3JlZW4KKyAgICB9IGVsc2lmICggJGNoIGVxICJceDBEIiApIHsJIyA8Q1I+ICA8Q3RybC1NPiBDYXJyaWFnZSByZXR1cm4KKwkjIElnbm9yZQorICAgIH0gZWxzaWYgKCAkY2ggZXEgIlx4MEEiICkgeyAjIDxMRj4gIDxDdHJsLUo+IExpbmUgZmVlZAorCWlmICggJGdldHRpbmdfZmlsZSApIHsKKwkgICAgJGdldHRpbmdfZmlsZSA9IDA7CisJfSBlbHNlIHsKKwkgICAgcHJpbnQgJGNoIGlmICggJGVuYWJsZSApOworCX0KKyAgICB9IGVsc2UgeworCXByaW50ICRjaCBpZiAoICRlbmFibGUgJiYgISRnZXR0aW5nX2ZpbGUgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92ZXJzaW9uIGIvdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGYzMmYwCi0tLSAvZGV2L251bGwKKysrIGIvdmVyc2lvbgpAQCAtMCwwICsxIEBACis2LjAzIDIwMTQKZGlmZiAtLWdpdCBhL3ZlcnNpb24ucGwgYi92ZXJzaW9uLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwOGNlODMKLS0tIC9kZXYvbnVsbAorKysgYi92ZXJzaW9uLnBsCkBAIC0wLDAgKzEsMzkgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBSZWFkIHRoZSAidmVyc2lvbiIgZmlsZSBhbmQgcHJvZHVjZSBzb21lIG1hY3JvIGRlY2xhcmF0aW9ucworIworCit1c2UgRmNudGw7CisKK3N1YiBkZWZ4KCQkJCkgeworICAgIG15KCRkZWYsICRuYW1lLCAkdmFsKSA9IEBfOworCisgICAgJGRlZiA9fiBzL1w8LyR7bmFtZX0vZzsKKyAgICAkZGVmID1+IHMvXEAvJHt2YWx9L2c7CisKKyAgICByZXR1cm4gJGRlZi4iXG4iOworfQorCisoJHZmaWxlLCAkdm91dCwgJGRlZikgPSBAQVJHVjsKK3N5c29wZW4oVkVSU0lPTiwgJHZmaWxlLCBPX1JET05MWSkgb3IgZGllICIkMDogQ2Fubm90IG9wZW4gJHZmaWxlXG4iOworJHZmaWxlID0gPFZFUlNJT04+OworY2hvbXAgJHZmaWxlOworY2xvc2UoVkVSU0lPTik7CisKK3VubGVzcyAoICR2ZmlsZSA9fiAvXigoWzAtOV0rKVwuKFswLTldKykpXHMrKFswLTldKykkLyApIHsKKyAgICBkaWUgIiQwOiBDYW5ub3QgcGFyc2UgdmVyc2lvbiBmb3JtYXRcbiI7Cit9CiskdmVyc2lvbiA9ICQxOworJHZtYSA9ICQyKzA7Ciskdm1pID0gJDMrMDsKKyR5ZWFyID0gJDQ7CisKK3N5c29wZW4oVkksICR2b3V0LCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMpCisgICAgb3IgZGllICIkMDogQ2Fubm90IGNyZWF0ZSAkdm91dDogJCFcbiI7CitwcmludCBWSSBkZWZ4KCRkZWYsICdWRVJTSU9OJywgICAgICAgJHZlcnNpb24pOworcHJpbnQgVkkgZGVmeCgkZGVmLCAnVkVSU0lPTl9TVFInLCAgICciJy4kdmVyc2lvbi4nIicpOworcHJpbnQgVkkgZGVmeCgkZGVmLCAnVkVSU0lPTl9NQUpPUicsICR2bWEpOworcHJpbnQgVkkgZGVmeCgkZGVmLCAnVkVSU0lPTl9NSU5PUicsICR2bWkpOworcHJpbnQgVkkgZGVmeCgkZGVmLCAnWUVBUicsICAgICAgICAgICR5ZWFyKTsKK3ByaW50IFZJIGRlZngoJGRlZiwgJ1lFQVJfU1RSJywgICAgICAnIicuJHllYXIuJyInKTsKK2Nsb3NlKFZJKTsKZGlmZiAtLWdpdCBhL3dpbi9oZWxsby5jIGIvd2luL2hlbGxvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzNDY4OQotLS0gL2Rldi9udWxsCisrKyBiL3dpbi9oZWxsby5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBUZXN0IHByb2dyYW0gZm9yIEMgY29tcGlsZXI7IGlmIHRoaXMgZG9lc24ndCBjb21waWxlLCB0aGUKKyAqIEMgY29tcGlsZXIgaXMgc2VyaW91c2x5IGJyb2tlbi4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBwcmludGYoIkhlbGxvLCBXb3JsZCFcbiIpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvd2luL250ZnNzZWN0LmMgYi93aW4vbnRmc3NlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJiY2NhCi0tLSAvZGV2L251bGwKKysrIGIvd2luL250ZnNzZWN0LmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIFNoYW8gTWlsbGVyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioKKyAqIG50ZnNzZWN0LmMKKyAqCisgKiBGZXRjaCBOVEZTIGZpbGUgY2x1c3RlciAmIHNlY3RvciBpbmZvcm1hdGlvbiB2aWEgV2luZG93cworICoKKyAqIFdpdGggc3BlY2lhbCB0aGFua3MgdG8gTWFyayBSb2RkeSBmb3IgaGlzIGFydGljbGU6CisgKiAgIGh0dHA6Ly93d3cud2QtMy5jb20vYXJjaGl2ZS9sdXNlcmxhbmQuaHRtCisgKi8KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5pb2N0bC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibnRmc3NlY3QuaCIKKworLyoqKiBNYWNyb3MgKi8KKyNkZWZpbmUgTV9FUlIobXNnKSAoTnRmc1NlY3RMYXN0RXJyb3JNZXNzYWdlID0gKG1zZykpCisKKy8qKiogRnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgRFdPUkQgTnRmc1NlY3RHZXRWb2x1bWVIYW5kbGUoCisgICAgQ0hBUiAqIFZvbHVtZU5hbWUsCisgICAgU19OVEZTU0VDVF9WT0xJTkZPICogVm9sdW1lSW5mbworICApOworc3RhdGljIERXT1JEIE50ZnNTZWN0R2V0Vm9sdW1lUGFydGl0aW9uTGJhKFNfTlRGU1NFQ1RfVk9MSU5GTyAqIFZvbHVtZUluZm8pOworCisvKioqIE9iamVjdHMgKi8KK0NIQVIgKiBOdGZzU2VjdExhc3RFcnJvck1lc3NhZ2U7CisKKy8qKiogRnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KK0RXT1JEIE1fTlRGU1NFQ1RfQVBJIE50ZnNTZWN0R2V0RmlsZVZjbkV4dGVudCgKKyAgICBIQU5ETEUgRmlsZSwKKyAgICBMQVJHRV9JTlRFR0VSICogVmNuLAorICAgIFNfTlRGU1NFQ1RfRVhURU5UICogRXh0ZW50CisgICkgeworICAgIEJPT0wgYmFkLCBvazsKKyAgICBEV09SRCBvdXRwdXRfc2l6ZSwgcmM7CisgICAgU1RBUlRJTkdfVkNOX0lOUFVUX0JVRkZFUiBpbnB1dDsKKyAgICBSRVRSSUVWQUxfUE9JTlRFUlNfQlVGRkVSIG91dHB1dDsKKworICAgIGJhZCA9ICgKKyAgICAgICAgRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fAorICAgICAgICAhVmNuIHx8CisgICAgICAgIFZjbi0+UXVhZFBhcnQgPCAwIHx8CisgICAgICAgICFFeHRlbnQKKyAgICAgICk7CisgICAgaWYgKGJhZCkKKyAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKworICAgIGlucHV0LlN0YXJ0aW5nVmNuID0gKlZjbjsKKyAgICBvayA9IERldmljZUlvQ29udHJvbCgKKyAgICAgICAgRmlsZSwKKyAgICAgICAgRlNDVExfR0VUX1JFVFJJRVZBTF9QT0lOVEVSUywKKyAgICAgICAgJmlucHV0LAorICAgICAgICBzaXplb2YgaW5wdXQsCisgICAgICAgICZvdXRwdXQsCisgICAgICAgIHNpemVvZiBvdXRwdXQsCisgICAgICAgICZvdXRwdXRfc2l6ZSwKKyAgICAgICAgTlVMTAorICAgICAgKTsKKyAgICByYyA9IEdldExhc3RFcnJvcigpOworICAgIHN3aXRjaCAocmMpIHsKKyAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgY2FzZSBFUlJPUl9NT1JFX0RBVEE6CisgICAgICAgICAgRXh0ZW50LT5GaXJzdFZjbiA9IG91dHB1dC5TdGFydGluZ1ZjbjsKKyAgICAgICAgICBFeHRlbnQtPk5leHRWY24gPSBvdXRwdXQuRXh0ZW50c1swXS5OZXh0VmNuOworICAgICAgICAgIEV4dGVudC0+Rmlyc3RMY24gPSBvdXRwdXQuRXh0ZW50c1swXS5MY247CisgICAgICAgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CisKKyAgICAgICAgY2FzZSBFUlJPUl9IQU5ETEVfRU9GOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgTV9FUlIoIk50ZnNTZWN0R2V0RmlsZVZjbkV4dGVudCgpOiBVbmtub3duIHN0YXR1cyEiKTsKKyAgICAgIH0KKworICAgIHJldHVybiByYzsKKyAgfQorCisvKiBJbnRlcm5hbCB1c2Ugb25seSAqLworc3RhdGljIERXT1JEIE50ZnNTZWN0R2V0Vm9sdW1lSGFuZGxlKAorICAgIENIQVIgKiBWb2x1bWVOYW1lLAorICAgIFNfTlRGU1NFQ1RfVk9MSU5GTyAqIFZvbHVtZUluZm8KKyAgKSB7CisgICAgI2RlZmluZSBNX1ZPTF9QUkVGSVggIlxcXFwuXFwiCisgICAgQ0hBUiB2b2xuYW1lW3NpemVvZiBNX1ZPTF9QUkVGSVggLSAxICsgTUFYX1BBVEggKyAxXSA9IE1fVk9MX1BSRUZJWDsKKyAgICBDSEFSICogY29uc3Qgdm9sbmFtZV9zaG9ydCA9IHZvbG5hbWUgKyBzaXplb2YgTV9WT0xfUFJFRklYIC0gMTsKKyAgICBDSEFSICogYzsKKyAgICBEV09SRCByYzsKKworICAgIC8qIFByZWZpeCAiXFwuXCIgb250byB0aGUgcGFzc2VkIHZvbHVtZSBuYW1lICovCisgICAgc3RyY3B5KHZvbG5hbWUgKyBzaXplb2YgTV9WT0xfUFJFRklYIC0gMSwgVm9sdW1lTmFtZSk7CisKKyAgICAvKiBGaW5kIHRoZSBsYXN0IG5vbi1udWxsIGNoYXJhY3RlciAqLworICAgIGZvciAoYyA9IHZvbG5hbWVfc2hvcnQ7ICpjOyArK2MpCisgICAgICA7CisKKyAgICAvKiBSZW1vdmUgdHJhaWxpbmcgYmFjay1zbGFzaCAqLworICAgIGlmIChjWy0xXSA9PSAnXFwnKQorICAgICAgY1stMV0gPSAwOworCisgICAgLyogT3BlbiB0aGUgdm9sdW1lICovCisgICAgVm9sdW1lSW5mby0+SGFuZGxlID0gQ3JlYXRlRmlsZSgKKyAgICAgICAgdm9sbmFtZSwKKyAgICAgICAgR0VORVJJQ19SRUFELAorICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAorICAgICAgICBOVUxMLAorICAgICAgICBPUEVOX0VYSVNUSU5HLAorICAgICAgICAwLAorICAgICAgICBOVUxMCisgICAgICApOworICAgIHJjID0gR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKFZvbHVtZUluZm8tPkhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBNX0VSUigiVW5hYmxlIHRvIG9wZW4gdm9sdW1lIGhhbmRsZSEiKTsKKyAgICAgICAgZ290byBlcnJfaGFuZGxlOworICAgICAgfQorCisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CisKKyAgICBDbG9zZUhhbmRsZShWb2x1bWVJbmZvLT5IYW5kbGUpOworICAgIGVycl9oYW5kbGU6CisKKyAgICByZXR1cm4gcmM7CisgIH0KKworRFdPUkQgTV9OVEZTU0VDVF9BUEkgTnRmc1NlY3RHZXRWb2x1bWVJbmZvKAorICAgIENIQVIgKiBWb2x1bWVOYW1lLAorICAgIFNfTlRGU1NFQ1RfVk9MSU5GTyAqIFZvbHVtZUluZm8KKyAgKSB7CisgICAgU19OVEZTU0VDVF9YUEZVTkNTIHhwX2Z1bmNzOworICAgIERXT1JEIHJjLCBmcmVlX2NsdXN0cywgdG90YWxfY2x1c3RzOworICAgIEJPT0wgb2s7CisKKyAgICBpZiAoIVZvbHVtZU5hbWUgfHwgIVZvbHVtZUluZm8pCisgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICByYyA9IE50ZnNTZWN0R2V0Vm9sdW1lSGFuZGxlKFZvbHVtZU5hbWUsIFZvbHVtZUluZm8pOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgZ290byBlcnJfaGFuZGxlOworCisgICAgcmMgPSBOdGZzU2VjdExvYWRYcEZ1bmNzKCZ4cF9mdW5jcyk7CisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICBnb3RvIGVycl94cF9mdW5jczsKKworICAgIG9rID0geHBfZnVuY3MuR2V0RGlza0ZyZWVTcGFjZSgKKyAgICAgICAgVm9sdW1lTmFtZSwKKyAgICAgICAgJlZvbHVtZUluZm8tPlNlY3RvcnNQZXJDbHVzdGVyLAorICAgICAgICAmVm9sdW1lSW5mby0+Qnl0ZXNQZXJTZWN0b3IsCisgICAgICAgICZmcmVlX2NsdXN0cywKKyAgICAgICAgJnRvdGFsX2NsdXN0cworICAgICAgKTsKKyAgICByYyA9IEdldExhc3RFcnJvcigpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTV9FUlIoIkdldERpc2tGcmVlU3BhY2UoKSBmYWlsZWQhIik7CisgICAgICAgIGdvdG8gZXJyX2ZyZWVzcGFjZTsKKyAgICAgIH0KKworICAgIHJjID0gTnRmc1NlY3RHZXRWb2x1bWVQYXJ0aXRpb25MYmEoVm9sdW1lSW5mbyk7CisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICBnb3RvIGVycl9sYmE7CisKKyAgICBWb2x1bWVJbmZvLT5TaXplID0gc2l6ZW9mICpWb2x1bWVJbmZvOworICAgIHJjID0gRVJST1JfU1VDQ0VTUzsKKworICAgIGVycl9sYmE6CisKKyAgICBlcnJfZnJlZXNwYWNlOgorCisgICAgTnRmc1NlY3RVbmxvYWRYcEZ1bmNzKCZ4cF9mdW5jcyk7CisgICAgZXJyX3hwX2Z1bmNzOgorCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgQ2xvc2VIYW5kbGUoVm9sdW1lSW5mby0+SGFuZGxlKTsKKyAgICAgICAgVm9sdW1lSW5mby0+SGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgICB9CisgICAgZXJyX2hhbmRsZToKKworICAgIHJldHVybiByYzsKKyAgfQorCitEV09SRCBNX05URlNTRUNUX0FQSSBOdGZzU2VjdEdldFZvbHVtZUluZm9Gcm9tRmlsZU5hbWUoCisgICAgQ0hBUiAqIEZpbGVOYW1lLAorICAgIFNfTlRGU1NFQ1RfVk9MSU5GTyAqIFZvbHVtZUluZm8KKyAgKSB7CisgICAgU19OVEZTU0VDVF9YUEZVTkNTIHhwX2Z1bmNzOworICAgIERXT1JEIHJjOworICAgIENIQVIgdm9sbmFtZVtNQVhfUEFUSCArIDFdOworICAgIEJPT0wgb2s7CisKKyAgICBpZiAoIUZpbGVOYW1lIHx8ICFWb2x1bWVJbmZvKQorICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworCisgICAgcmMgPSBOdGZzU2VjdExvYWRYcEZ1bmNzKCZ4cF9mdW5jcyk7CisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgZ290byBlcnJfeHBfZnVuY3M7CisgICAgICB9CisKKyAgICBvayA9IHhwX2Z1bmNzLkdldFZvbHVtZVBhdGhOYW1lKAorICAgICAgICBGaWxlTmFtZSwKKyAgICAgICAgdm9sbmFtZSwKKyAgICAgICAgc2l6ZW9mIHZvbG5hbWUKKyAgICAgICk7CisgICAgcmMgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIE1fRVJSKCJHZXRWb2x1bWVQYXRoTmFtZSgpIGZhaWxlZCEiKTsKKyAgICAgICAgZ290byBlcnJfdm9sbmFtZTsKKyAgICAgIH0KKworICAgIHJjID0gTnRmc1NlY3RHZXRWb2x1bWVJbmZvKHZvbG5hbWUsIFZvbHVtZUluZm8pOworCisgICAgZXJyX3ZvbG5hbWU6CisKKyAgICBOdGZzU2VjdFVubG9hZFhwRnVuY3MoJnhwX2Z1bmNzKTsKKyAgICBlcnJfeHBfZnVuY3M6CisKKyAgICByZXR1cm4gcmM7CisgIH0KKworLyogSW50ZXJuYWwgdXNlIG9ubHkgKi8KK3N0YXRpYyBEV09SRCBOdGZzU2VjdEdldFZvbHVtZVBhcnRpdGlvbkxiYShTX05URlNTRUNUX1ZPTElORk8gKiBWb2x1bWVJbmZvKSB7CisgICAgQk9PTCBvazsKKyAgICBWT0xVTUVfRElTS19FWFRFTlRTIHZvbF9kaXNrX2V4dGVudHM7CisgICAgRFdPUkQgb3V0cHV0X3NpemUsIHJjOworCisgICAgb2sgPSBEZXZpY2VJb0NvbnRyb2woCisgICAgICAgIFZvbHVtZUluZm8tPkhhbmRsZSwKKyAgICAgICAgSU9DVExfVk9MVU1FX0dFVF9WT0xVTUVfRElTS19FWFRFTlRTLAorICAgICAgICBOVUxMLAorICAgICAgICAwLAorICAgICAgICAmdm9sX2Rpc2tfZXh0ZW50cywKKyAgICAgICAgc2l6ZW9mIHZvbF9kaXNrX2V4dGVudHMsCisgICAgICAgICZvdXRwdXRfc2l6ZSwKKyAgICAgICAgTlVMTAorICAgICAgKTsKKyAgICByYyA9IEdldExhc3RFcnJvcigpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTV9FUlIoIkNvdWxkbid0IGZldGNoIHZvbHVtZSBkaXNrIGV4dGVudChzKSEiKTsKKyAgICAgICAgZ290byBlcnJfdm9sX2Rpc2tfZXh0ZW50czsKKyAgICAgIH0KKworICAgIGlmICh2b2xfZGlza19leHRlbnRzLk51bWJlck9mRGlza0V4dGVudHMgIT0gMSkgeworICAgICAgICBNX0VSUigiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHZvbHVtZSBkaXNrIGV4dGVudHMhIik7CisgICAgICAgIGdvdG8gZXJyX251bV9vZl9leHRlbnRzOworICAgICAgfQorCisgICAgVm9sdW1lSW5mby0+UGFydGl0aW9uTGJhLlF1YWRQYXJ0ID0gKAorICAgICAgICB2b2xfZGlza19leHRlbnRzLkV4dGVudHNbMF0uU3RhcnRpbmdPZmZzZXQuUXVhZFBhcnQgLworICAgICAgICBWb2x1bWVJbmZvLT5CeXRlc1BlclNlY3RvcgorICAgICAgKTsKKworICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOworCisgICAgZXJyX251bV9vZl9leHRlbnRzOgorCisgICAgZXJyX3ZvbF9kaXNrX2V4dGVudHM6CisKKyAgICByZXR1cm4gcmM7CisgIH0KKworRFdPUkQgTV9OVEZTU0VDVF9BUEkgTnRmc1NlY3RMY25Ub0xiYSgKKyAgICBjb25zdCBTX05URlNTRUNUX1ZPTElORk8gKiBWb2x1bWVJbmZvLAorICAgIGNvbnN0IExBUkdFX0lOVEVHRVIgKiBMY24sCisgICAgTEFSR0VfSU5URUdFUiAqIExiYQorICApIHsKKyAgICBCT09MIGJhZDsKKyAgICBiYWQgPSAoCisgICAgICAgICFWb2x1bWVJbmZvIHx8CisgICAgICAgICFWb2x1bWVJbmZvLT5CeXRlc1BlclNlY3RvciB8fAorICAgICAgICAhVm9sdW1lSW5mby0+U2VjdG9yc1BlckNsdXN0ZXIgfHwKKyAgICAgICAgIUxjbiB8fAorICAgICAgICBMY24tPlF1YWRQYXJ0IDwgMCB8fAorICAgICAgICAhTGJhCisgICAgICApOworICAgIGlmIChiYWQpCisgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICBMYmEtPlF1YWRQYXJ0ID0gKAorICAgICAgICBWb2x1bWVJbmZvLT5QYXJ0aXRpb25MYmEuUXVhZFBhcnQgKworICAgICAgICBMY24tPlF1YWRQYXJ0ICoKKyAgICAgICAgVm9sdW1lSW5mby0+U2VjdG9yc1BlckNsdXN0ZXIKKyAgICAgICk7CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CisgIH0KKworRFdPUkQgTV9OVEZTU0VDVF9BUEkgTnRmc1NlY3RMb2FkWHBGdW5jcyhTX05URlNTRUNUX1hQRlVOQ1MgKiBYcEZ1bmNzKSB7CisgICAgRFdPUkQgcmM7CisKKyAgICBpZiAoIVhwRnVuY3MpCisgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICBYcEZ1bmNzLT5TaXplID0gc2l6ZW9mICpYcEZ1bmNzOworCisgICAgWHBGdW5jcy0+S2VybmVsMzIgPSBMb2FkTGlicmFyeSgia2VybmVsMzIuZGxsIik7CisgICAgcmMgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBpZiAoIVhwRnVuY3MtPktlcm5lbDMyKSB7CisgICAgICAgIE1fRVJSKCJLRVJORUwzMi5ETEwgbm90IGZvdW5kISIpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKworICAgIFhwRnVuY3MtPkdldFZvbHVtZVBhdGhOYW1lID0gKEZfS0VSTkVMMzJfR0VUVk9MVU1FUEFUSE5BTUUgKikgKAorICAgICAgICBHZXRQcm9jQWRkcmVzcygKKyAgICAgICAgICAgIFhwRnVuY3MtPktlcm5lbDMyLAorICAgICAgICAgICAgIkdldFZvbHVtZVBhdGhOYW1lQSIKKyAgICAgICAgICApCisgICAgICApOworICAgIHJjID0gR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKCFYcEZ1bmNzLT5HZXRWb2x1bWVQYXRoTmFtZSkgeworICAgICAgICBNX0VSUigiR2V0Vm9sdW1lUGF0aE5hbWUoKSBub3QgZm91bmQgaW4gS0VSTkVMMzIuRExMISIpOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKworICAgIFhwRnVuY3MtPkdldERpc2tGcmVlU3BhY2UgPSAoRl9LRVJORUwzMl9HRVRESVNLRlJFRVNQQUNFICopICgKKyAgICAgICAgR2V0UHJvY0FkZHJlc3MoCisgICAgICAgICAgICBYcEZ1bmNzLT5LZXJuZWwzMiwKKyAgICAgICAgICAgICJHZXREaXNrRnJlZVNwYWNlQSIKKyAgICAgICAgICApCisgICAgICApOworICAgIHJjID0gR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKCFYcEZ1bmNzLT5HZXREaXNrRnJlZVNwYWNlKSB7CisgICAgICAgIE1fRVJSKCJHZXREaXNrRnJlZVNwYWNlKCkgbm90IGZvdW5kIGluIEtFUk5FTDMyLkRMTCEiKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisKKyAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKKworICAgIGVycjoKKyAgICBOdGZzU2VjdFVubG9hZFhwRnVuY3MoWHBGdW5jcyk7CisgICAgcmV0dXJuIHJjOworICB9CisKK1ZPSUQgTV9OVEZTU0VDVF9BUEkgTnRmc1NlY3RVbmxvYWRYcEZ1bmNzKFNfTlRGU1NFQ1RfWFBGVU5DUyAqIFhwRnVuY3MpIHsKKyAgICBpZiAoIVhwRnVuY3MpCisgICAgICByZXR1cm47CisKKyAgICBYcEZ1bmNzLT5HZXREaXNrRnJlZVNwYWNlID0gTlVMTDsKKyAgICBYcEZ1bmNzLT5HZXRWb2x1bWVQYXRoTmFtZSA9IE5VTEw7CisgICAgaWYgKFhwRnVuY3MtPktlcm5lbDMyKQorICAgICAgRnJlZUxpYnJhcnkoWHBGdW5jcy0+S2VybmVsMzIpOworICAgIFhwRnVuY3MtPktlcm5lbDMyID0gTlVMTDsKKyAgICBYcEZ1bmNzLT5TaXplID0gMDsKKyAgICByZXR1cm47CisgIH0KKwpkaWZmIC0tZ2l0IGEvd2luL250ZnNzZWN0LmggYi93aW4vbnRmc3NlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZjMjZkCi0tLSAvZGV2L251bGwKKysrIGIvd2luL250ZnNzZWN0LmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIFNoYW8gTWlsbGVyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZm5kZWYgTV9OVEZTU0VDVF9IXworCisvKioqKgorICogbnRmc3NlY3QuaAorICoKKyAqIEZldGNoIE5URlMgZmlsZSBjbHVzdGVyICYgc2VjdG9yIGluZm9ybWF0aW9uIHZpYSBXaW5kb3dzCisgKgorICogV2l0aCBzcGVjaWFsIHRoYW5rcyB0byBNYXJrIFJvZGR5IGZvciBoaXMgYXJ0aWNsZToKKyAqICAgaHR0cDovL3d3dy53ZC0zLmNvbS9hcmNoaXZlL2x1c2VybGFuZC5odG0KKyAqLworCisvKioqIE1hY3JvcyAqLworI2RlZmluZSBNX05URlNTRUNUX0hfCisjZGVmaW5lIE1fTlRGU1NFQ1RfQVBJCisKKy8qKiogT2JqZWN0IHR5cGVzICovCisKKy8qIEFuICJleHRlbnQ7IiBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgZmlsZSBkYXRhICovCit0eXBlZGVmIHN0cnVjdCBTX05URlNTRUNUX0VYVEVOVF8gU19OVEZTU0VDVF9FWFRFTlQ7CisKKy8qIFZvbHVtZSBpbmZvIHJlbGV2YW50IHRvIGZpbGUgY2x1c3RlciAmIHNlY3RvciBpbmZvICovCit0eXBlZGVmIHN0cnVjdCBTX05URlNTRUNUX1ZPTElORk9fIFNfTlRGU1NFQ1RfVk9MSU5GTzsKKworLyogU3RvcmVzIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHNvbWUgV2luZG93cyBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IFNfTlRGU1NFQ1RfWFBGVU5DU18gU19OVEZTU0VDVF9YUEZVTkNTOworCisvKioqIEZ1bmN0aW9uIHR5cGVzICovCisKKy8qIFRoZSBmdW5jdGlvbiB0eXBlIGZvciBLZXJuZWwzMi5kbGwncyBHZXREaXNrRnJlZVNwYWNlKCkgKi8KK3R5cGVkZWYgQk9PTCBXSU5BUEkgRl9LRVJORUwzMl9HRVRESVNLRlJFRVNQQUNFKAorICAgIExQQ1RTVFIsCisgICAgTFBEV09SRCwKKyAgICBMUERXT1JELAorICAgIExQRFdPUkQsCisgICAgTFBEV09SRAorICApOworCisvKiBUaGUgZnVuY3Rpb24gdHlwZSBmb3IgS2VybmVsMzIuZGxsJ3MgR2V0Vm9sdW1lUGF0aE5hbWUoKSAqLwordHlwZWRlZiBCT09MIFdJTkFQSSBGX0tFUk5FTDMyX0dFVFZPTFVNRVBBVEhOQU1FKExQQ1RTVFIsIExQQ1RTVFIsIERXT1JEKTsKKworLyoqKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKworLyoqCisgKiBGZXRjaCB0aGUgZXh0ZW50IGNvbnRhaW5pbmcgYSBwYXJ0aWN1bGFyIFZDTgorICoKKyAqIEB2IEZpbGUKKyAqIEB2IFZjbgorICogQHYgRXh0ZW50CisgKiBAcmV0IERXT1JECisgKi8KK0RXT1JEIE1fTlRGU1NFQ1RfQVBJIE50ZnNTZWN0R2V0RmlsZVZjbkV4dGVudCgKKyAgICBIQU5ETEUgRmlsZSwKKyAgICBMQVJHRV9JTlRFR0VSICogVmNuLAorICAgIFNfTlRGU1NFQ1RfRVhURU5UICogRXh0ZW50CisgICk7CisKKy8qKgorICogUG9wdWxhdGUgYSB2b2x1bWUgaW5mbyBvYmplY3QKKyAqCisgKiBAdiBWb2x1bWVOYW1lCisgKiBAdiBWb2x1bWVJbmZvCisgKiBAcmV0IERXT1JECisgKi8KK0RXT1JEIE1fTlRGU1NFQ1RfQVBJIE50ZnNTZWN0R2V0Vm9sdW1lSW5mbygKKyAgICBDSEFSICogVm9sdW1lTmFtZSwKKyAgICBTX05URlNTRUNUX1ZPTElORk8gKiBWb2x1bWVJbmZvCisgICk7CisKKy8qKgorICogUG9wdWxhdGUgYSB2b2x1bWUgaW5mbyBvYmplY3QKKyAqCisgKiBAdiBGaWxlTmFtZQorICogQHYgVm9sdW1lSW5mbworICogQHJldCBEV09SRAorICovCitEV09SRCBNX05URlNTRUNUX0FQSSBOdGZzU2VjdEdldFZvbHVtZUluZm9Gcm9tRmlsZU5hbWUoCisgICAgQ0hBUiAqIEZpbGVOYW1lLAorICAgIFNfTlRGU1NFQ1RfVk9MSU5GTyAqIFZvbHVtZUluZm8KKyAgKTsKKworLyoqCisgKiBDb252ZXJ0IGEgdm9sdW1lIExDTiB0byBhbiBhYnNvbHV0ZSBkaXNrIExCQQorICoKKyAqIEB2IFZvbHVtZUluZm8KKyAqIEB2IExjbgorICogQHYgTGJhCisgKiBAcmV0IERXT1JECisgKi8KK0RXT1JEIE1fTlRGU1NFQ1RfQVBJIE50ZnNTZWN0TGNuVG9MYmEoCisgICAgY29uc3QgU19OVEZTU0VDVF9WT0xJTkZPICogVm9sdW1lSW5mbywKKyAgICBjb25zdCBMQVJHRV9JTlRFR0VSICogTGNuLAorICAgIExBUkdFX0lOVEVHRVIgKiBMYmEKKyAgKTsKKworLyoqCisgKiBMb2FkIHNvbWUgaGVscGVyIFhQIGZ1bmN0aW9ucworICoKKyAqIEB2IFhwRnVuY3MKKyAqIEByZXQgRFdPUkQKKyAqLworRFdPUkQgTV9OVEZTU0VDVF9BUEkgTnRmc1NlY3RMb2FkWHBGdW5jcyhTX05URlNTRUNUX1hQRlVOQ1MgKiBYcEZ1bmNzKTsKKworLyoqCisgKiBVbmxvYWQgc29tZSBoZWxwZXIgWFAgZnVuY3Rpb25zCisgKgorICogQHYgWHBGdW5jcworICogQHJldCBEV09SRAorICovCitWT0lEIE1fTlRGU1NFQ1RfQVBJIE50ZnNTZWN0VW5sb2FkWHBGdW5jcyhTX05URlNTRUNUX1hQRlVOQ1MgKiBYcEZ1bmNzKTsKKworLyoqKiBPYmplY3QgZGVjbGFyYXRpb25zICovCisKKy8qKgorICogVGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBzZXQgYnkgb25lIG9mIG91ciBmdW5jdGlvbnMuCisgKiBPYnZpb3VzbHkgbm90IHBlci10aHJlYWQKKyAqLworZXh0ZXJuIENIQVIgKiBOdGZzU2VjdExhc3RFcnJvck1lc3NhZ2U7CisKKy8qKiogU3RydWN0L3VuaW9uIGRlZmluaXRpb25zICovCitzdHJ1Y3QgU19OVEZTU0VDVF9FWFRFTlRfIHsKKyAgICBMQVJHRV9JTlRFR0VSIEZpcnN0VmNuOworICAgIExBUkdFX0lOVEVHRVIgTmV4dFZjbjsKKyAgICBMQVJHRV9JTlRFR0VSIEZpcnN0TGNuOworICB9OworCitzdHJ1Y3QgU19OVEZTU0VDVF9WT0xJTkZPXyB7CisgICAgRFdPUkQgU2l6ZTsKKyAgICBIQU5ETEUgSGFuZGxlOworICAgIERXT1JEIEJ5dGVzUGVyU2VjdG9yOworICAgIERXT1JEIFNlY3RvcnNQZXJDbHVzdGVyOworICAgIExBUkdFX0lOVEVHRVIgUGFydGl0aW9uTGJhOworICB9OworCitzdHJ1Y3QgU19OVEZTU0VDVF9YUEZVTkNTXyB7CisgICAgRFdPUkQgU2l6ZTsKKyAgICBITU9EVUxFIEtlcm5lbDMyOworICAgIEZfS0VSTkVMMzJfR0VUVk9MVU1FUEFUSE5BTUUgKiBHZXRWb2x1bWVQYXRoTmFtZTsKKyAgICBGX0tFUk5FTDMyX0dFVERJU0tGUkVFU1BBQ0UgKiBHZXREaXNrRnJlZVNwYWNlOworICB9OworCisjZW5kaWYgLyogTV9OVEZTU0VDVF9IXyAqLwpkaWZmIC0tZ2l0IGEvd2luL250ZnN0ZXN0LmMgYi93aW4vbnRmc3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmMyNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvd2luL250ZnN0ZXN0LmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDExIFNoYW8gTWlsbGVyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioKKyAqIG50ZnN0ZXN0LmMKKyAqCisgKiAoQykgU2hhbyBNaWxsZXIsIDIwMTEKKyAqCisgKiBUZXN0cyBudGZzc2VjdC5jIGZ1bmN0aW9ucworICoKKyAqIFdpdGggc3BlY2lhbCB0aGFua3MgdG8gTWFyayBSb2RkeSBmb3IgaGlzIGFydGljbGU6CisgKiAgIGh0dHA6Ly93d3cud2QtMy5jb20vYXJjaGl2ZS9sdXNlcmxhbmQuaHRtCisgKi8KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIm50ZnNzZWN0LmgiCisKKy8qKiogT2JqZWN0IHR5cGVzICovCisKKy8qKiogRnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCBzaG93X3VzYWdlKHZvaWQpOworc3RhdGljIHZvaWQgc2hvd19sYXN0X2Vycih2b2lkKTsKK3N0YXRpYyB2b2lkIHNob3dfZXJyKERXT1JEKTsKKworLyoqKiBTdHJ1Y3QvdW5pb24gZGVmaW5pdGlvbnMgKi8KKworLyoqKiBGdW5jdGlvbiBkZWZpbml0aW9ucyAqLworCisvKiogUHJvZ3JhbSBlbnRyeS1wb2ludCAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikgeworICAgIGludCByYzsKKyAgICBEV09SRCBlcnI7CisgICAgU19OVEZTU0VDVF9WT0xJTkZPIHZvbF9pbmZvOworICAgIEhBTkRMRSBmaWxlOworICAgIExBUkdFX0lOVEVHRVIgdmNuLCBsYmE7CisgICAgU19OVEZTU0VDVF9FWFRFTlQgZXh0ZW50OworICAgIExPTkdMT05HIGxlbjsKKyAgICBCT09MIG9rOworCisgICAgaWYgKGFyZ2MgIT0gMikgeworICAgICAgICByYyA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgc2hvd191c2FnZSgpOworICAgICAgICBnb3RvIGVycl9hcmdzOworICAgICAgfQorCisgICAgLyogR2V0IHZvbHVtZSBpbmZvICovCisgICAgZXJyID0gTnRmc1NlY3RHZXRWb2x1bWVJbmZvRnJvbUZpbGVOYW1lKGFyZ3ZbMV0sICZ2b2xfaW5mbyk7CisgICAgaWYgKGVyciAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIHNob3dfZXJyKGVycik7CisgICAgICAgIGdvdG8gZXJyX3ZvbF9pbmZvOworICAgICAgfQorICAgIHByaW50ZigKKyAgICAgICAgIlZvbHVtZSBoYXMgJWQgYnl0ZXMgcGVyIHNlY3RvciwgJWQgc2VjdG9ycyBwZXIgY2x1c3RlclxuIiwKKyAgICAgICAgdm9sX2luZm8uQnl0ZXNQZXJTZWN0b3IsCisgICAgICAgIHZvbF9pbmZvLlNlY3RvcnNQZXJDbHVzdGVyCisgICAgICApOworCisgICAgLyogT3BlbiB0aGUgZmlsZSBmb3IgcmVhZGluZyAqLworICAgIGZpbGUgPSBDcmVhdGVGaWxlKAorICAgICAgICBhcmd2WzFdLAorICAgICAgICBHRU5FUklDX1JFQUQsCisgICAgICAgIEZJTEVfU0hBUkVfUkVBRCwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgT1BFTl9FWElTVElORywKKyAgICAgICAgMCwKKyAgICAgICAgTlVMTAorICAgICAgKTsKKyAgICBpZiAoZmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICByYyA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgc2hvd19sYXN0X2VycigpOworICAgICAgICBnb3RvIGVycl9maWxlOworICAgICAgfQorCisgICAgLyogRm9yIGVhY2ggZXh0ZW50ICovCisgICAgZm9yICgKKyAgICAgICAgdmNuLlF1YWRQYXJ0ID0gMDsKKyAgICAgICAgTnRmc1NlY3RHZXRGaWxlVmNuRXh0ZW50KGZpbGUsICZ2Y24sICZleHRlbnQpID09IEVSUk9SX1NVQ0NFU1M7CisgICAgICAgIHZjbiA9IGV4dGVudC5OZXh0VmNuCisgICAgICApIHsKKyAgICAgICAgbGVuID0gZXh0ZW50Lk5leHRWY24uUXVhZFBhcnQgLSBleHRlbnQuRmlyc3RWY24uUXVhZFBhcnQ7CisgICAgICAgIHByaW50ZigiRXh0ZW50IEAgVkNOICMlbGxkLCIsIGV4dGVudC5GaXJzdFZjbi5RdWFkUGFydCk7CisgICAgICAgIHByaW50ZigiICVsbGQgY2x1c3RlcnMgbG9uZzpcbiIsIGxlbik7CisgICAgICAgIHByaW50ZigiICBWQ04gIyVsbGQgLSIsIGV4dGVudC5GaXJzdFZjbi5RdWFkUGFydCk7CisgICAgICAgIHByaW50ZigiICMlbGxkXG4iLCBleHRlbnQuRmlyc3RWY24uUXVhZFBhcnQgKyBsZW4gLSAxKTsKKyAgICAgICAgcHJpbnRmKCIgIExDTiAjJWxsZCAtIiwgZXh0ZW50LkZpcnN0TGNuLlF1YWRQYXJ0KTsKKyAgICAgICAgcHJpbnRmKCIgIyVsbGRcbiIsIGV4dGVudC5GaXJzdExjbi5RdWFkUGFydCArIGxlbiAtIDEpOworICAgICAgICBlcnIgPSBOdGZzU2VjdExjblRvTGJhKAorICAgICAgICAgICAgJnZvbF9pbmZvLAorICAgICAgICAgICAgJmV4dGVudC5GaXJzdExjbiwKKyAgICAgICAgICAgICZsYmEKKyAgICAgICAgICApOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHByaW50ZigiICBMQkEgIyVsbGQgLSIsIGxiYS5RdWFkUGFydCk7CisgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgIiAjJWxsZFxuIiwKKyAgICAgICAgICAgICAgICBsYmEuUXVhZFBhcnQgKyBsZW4gKiB2b2xfaW5mby5TZWN0b3JzUGVyQ2x1c3RlcgorICAgICAgICAgICAgICApOworICAgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICByYyA9IEVYSVRfU1VDQ0VTUzsKKworICAgIENsb3NlSGFuZGxlKGZpbGUpOworICAgIGVycl9maWxlOgorCisgICAgQ2xvc2VIYW5kbGUodm9sX2luZm8uSGFuZGxlKTsKKyAgICBlcnJfdm9sX2luZm86CisKKyAgICBlcnJfYXJnczoKKworICAgIHJldHVybiByYzsKKyAgfQorCisvKiogRGlzcGxheSB1c2FnZSAqLworc3RhdGljIHZvaWQgc2hvd191c2FnZSh2b2lkKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfdGV4dFtdID0gIlwKKyAgRmlsZSBzZWN0b3IgaW5mbyAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gU2hhbyBNaWxsZXIsIDIwMTFcblwKK1xuXAorICBVc2FnZTogTlRGU1RFU1QuRVhFIDxmaWxlbmFtZT5cblwKK1xuXAorICBBdHRlbXB0cyB0byBkdW1wIGNsdXN0ZXIgYW5kIHNlY3RvciBpbmZvIGZvciA8ZmlsZW5hbWU+LlxuIjsKKworICAgIHByaW50Zih1c2FnZV90ZXh0KTsKKyAgICByZXR1cm47CisgIH0KKworc3RhdGljIHZvaWQgc2hvd19sYXN0X2Vycih2b2lkKSB7CisgICAgc2hvd19lcnIoR2V0TGFzdEVycm9yKCkpOworICAgIHJldHVybjsKKyAgfQorCisvKiogRGlzcGxheSBhbiBlcnJvciAqLworc3RhdGljIHZvaWQgc2hvd19lcnIoRFdPUkQgZXJyX2NvZGUpIHsKKyAgICB2b2lkICogYnVmOworCisgICAgRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICAgIE5VTEwsCisgICAgICAgIGVycl9jb2RlLAorICAgICAgICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKKyAgICAgICAgKExQVFNUUikgJmJ1ZiwKKyAgICAgICAgMCwKKyAgICAgICAgTlVMTAorICAgICAgKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiAlc1xuIiwgYnVmKTsKKyAgICBMb2NhbEZyZWUoYnVmKTsKKyAgICByZXR1cm47CisgIH0KKwpkaWZmIC0tZ2l0IGEvd2luL250ZnN0ZXN0LnJjIGIvd2luL250ZnN0ZXN0LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MmQyMWYKLS0tIC9kZXYvbnVsbAorKysgYi93aW4vbnRmc3Rlc3QucmMKQEAgLTAsMCArMSwyNiBAQAorCisxIFZFUlNJT05JTkZPCitGSUxFVkVSU0lPTiAwLDAsMCwxCitQUk9EVUNUVkVSU0lPTiAwLDAsMCwxCitGSUxFT1MgMHg0MDAwNAorRklMRVRZUEUgMHgxCisgIHsKKyAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgICB7CisgICAgICAgIEJMT0NLICIwNDA5MDRCMCIKKyAgICAgICAgICB7CisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiU2hhbyBNaWxsZXIiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIk5URlMgRmlsZSBTZWN0b3IgSW5mbyIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICIwLjAuMC4xIChBdWctMTItMjAxMSkiCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgIk5URlNUZXN0IgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIqkgMjAxMSBTaGFvIE1pbGxlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4iCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJOVEZTVEVTVC5FWEUiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiVXRpbGl0aWVzIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjAuMC4wLjEiCisgICAgICAgICAgfQorICAgICAgfQorICB9CisKKyNpZiAwCisxIElDT04gIm50ZnN0ZXN0LmljbyIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd2luL3N5c2V4aXRzLmggYi93aW4vc3lzZXhpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNkM2JhCi0tLSAvZGV2L251bGwKKysrIGIvd2luL3N5c2V4aXRzLmgKQEAgLTAsMCArMSBAQAorI2RlZmluZSBFWF9VU0FHRSAweDQwCmRpZmYgLS1naXQgYS93aW4vc3lzbGludXguYyBiL3dpbi9zeXNsaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTg0NGUKLS0tIC9kZXYvbnVsbAorKysgYi93aW4vc3lzbGludXguYwpAQCAtMCwwICsxLDU4OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDMgTGFycyBNdW5jaCBDaHJpc3RlbnNlbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDE5OTgtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIEJhc2VkIG9uIHRoZSBMaW51eCBpbnN0YWxsZXIgcHJvZ3JhbSBmb3IgU1lTTElOVVggYnkgSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzbGludXgtbWluZ3cuYyAtIFdpbjJrL1dpblhQIGluc3RhbGxlciBwcm9ncmFtIGZvciBTWVNMSU5VWAorICovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSAic3lzbGludXguaCIKKyNpbmNsdWRlICJsaWJmYXQuaCIKKyNpbmNsdWRlICJzZXRhZHYuaCIKKyNpbmNsdWRlICJzeXNleGl0cy5oIgorI2luY2x1ZGUgInN5c2x4b3B0LmgiCisjaW5jbHVkZSAic3lzbHhmcy5oIgorI2luY2x1ZGUgIm50ZnNzZWN0LmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgbm9yZXR1cm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZWxzZQorIyBkZWZpbmUgbm9yZXR1cm4gdm9pZAorI2VuZGlmCisKK3ZvaWQgZXJyb3IoY2hhciAqbXNnKTsKKworLyogQmVnaW4gc3R1ZmYgZm9yIE1CUiBjb2RlICovCisKKyNpbmNsdWRlIDx3aW5pb2N0bC5oPgorCisjZGVmaW5lIFBBUlRfVEFCTEUgIDB4MWJlCisjZGVmaW5lIFBBUlRfU0laRSAgIDB4MTAKKyNkZWZpbmUgUEFSVF9DT1VOVCAgNAorI2RlZmluZSBQQVJUX0FDVElWRSAweDgwCisKKy8vIFRoZSBmb2xsb3dpbmcgc3RydWN0IHNob3VsZCBiZSBpbiB0aGUgbnRkZHN0b3IuaCBmaWxlLCBidXQgSSBkaWRuJ3QgaGF2ZSBpdC4KKy8vIG1pbmd3MzIgaGFzIDxkZGsvbnRkZHN0b3IuaD4sIGJ1dCBpbmNsdWRpbmcgdGhhdCBmaWxlIGNhdXNlcyBhbGwga2luZHMKKy8vIG9mIG90aGVyIGZhaWx1cmVzLiAgbWluZ3c2NCBoYXMgaXQgaW4gPHdpbmlvY3RsLmg+LgorLy8gVGh1cywgaW5zdGVhZCBvZiBTVE9SQUdFX0RFVklDRV9OVU1CRVIsIHVzZSBhIGxvd2VyLWNhc2UgcHJpdmF0ZQorLy8gZGVmaW5pdGlvbi4uLgorc3RydWN0IHN0b3JhZ2VfZGV2aWNlX251bWJlciB7CisgICAgREVWSUNFX1RZUEUgRGV2aWNlVHlwZTsKKyAgICBVTE9ORyBEZXZpY2VOdW1iZXI7CisgICAgVUxPTkcgUGFydGl0aW9uTnVtYmVyOworfTsKKworQk9PTCBHZXRTdG9yYWdlRGV2aWNlTnVtYmVyQnlIYW5kbGUoSEFORExFIGhhbmRsZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHN0b3JhZ2VfZGV2aWNlX251bWJlciAqc2RuKQoreworICAgIEJPT0wgcmVzdWx0ID0gRkFMU0U7CisgICAgRFdPUkQgY291bnQ7CisKKyAgICBpZiAoRGV2aWNlSW9Db250cm9sKGhhbmRsZSwgSU9DVExfU1RPUkFHRV9HRVRfREVWSUNFX05VTUJFUiwgTlVMTCwKKwkJCTAsIChMUFZPSUQpIHNkbiwgc2l6ZW9mKCpzZG4pLCAmY291bnQsIE5VTEwpKSB7CisJcmVzdWx0ID0gVFJVRTsKKyAgICB9IGVsc2UgeworCWVycm9yKCJHZXREcml2ZU51bWJlcjogRGV2aWNlSW9Db250cm9sIGZhaWxlZCIpOworICAgIH0KKworICAgIHJldHVybiAocmVzdWx0KTsKK30KKworaW50IEdldEJ5dGVzUGVyU2VjdG9yKEhBTkRMRSBkcml2ZSkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBESVNLX0dFT01FVFJZIGc7CisgICAgRFdPUkQgY291bnQ7CisKKyAgICBpZiAoRGV2aWNlSW9Db250cm9sKGRyaXZlLCBJT0NUTF9ESVNLX0dFVF9EUklWRV9HRU9NRVRSWSwgTlVMTCwgMCwKKwkJCSZnLCBzaXplb2YoZyksICZjb3VudCwgTlVMTCkpIHsKKwlyZXN1bHQgPSBnLkJ5dGVzUGVyU2VjdG9yOworICAgIH0KKworICAgIHJldHVybiAocmVzdWx0KTsKK30KKworQk9PTCBGaXhNQlIoaW50IGRyaXZlTnVtLCBpbnQgcGFydGl0aW9uTnVtLCBpbnQgd3JpdGVfbWJyLCBpbnQgc2V0X2FjdGl2ZSkKK3sKKyAgICBCT09MIHJlc3VsdCA9IFRSVUU7CisgICAgSEFORExFIGRyaXZlOworCisgICAgY2hhciBkcml2ZU5hbWVbMTI4XTsKKworICAgIHNwcmludGYoZHJpdmVOYW1lLCAiXFxcXC5cXFBIWVNJQ0FMRFJJVkUlZCIsIGRyaXZlTnVtKTsKKworICAgIGRyaXZlID0gQ3JlYXRlRmlsZShkcml2ZU5hbWUsCisJCSAgICAgICBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAorCQkgICAgICAgRklMRV9TSEFSRV9XUklURSB8IEZJTEVfU0hBUkVfUkVBRCwKKwkJICAgICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsIDAsIE5VTEwpOworCisgICAgaWYgKGRyaXZlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJZXJyb3IoIkFjY2Vzc2luZyBwaHlzaWNhbCBkcml2ZSIpOworCXJlc3VsdCA9IEZBTFNFOworICAgIH0KKworICAgIGlmIChyZXN1bHQpIHsKKwl1bnNpZ25lZCBjaGFyIHNlY3RvcltTRUNUT1JfU0laRV07CisJRFdPUkQgaG93TWFueTsKKworCWlmIChHZXRCeXRlc1BlclNlY3Rvcihkcml2ZSkgIT0gU0VDVE9SX1NJWkUpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsCisJCSAgICAiRXJyb3I6IFNlY3RvciBzaXplIG9mIHRoaXMgZHJpdmUgaXMgJWQ7IG11c3QgYmUgJWRcbiIsCisJCSAgICBHZXRCeXRlc1BlclNlY3Rvcihkcml2ZSksIFNFQ1RPUl9TSVpFKTsKKwkgICAgcmVzdWx0ID0gRkFMU0U7CisJfQorCisJaWYgKHJlc3VsdCkgeworCSAgICBpZiAoUmVhZEZpbGUoZHJpdmUsIHNlY3Rvciwgc2l6ZW9mKHNlY3RvciksICZob3dNYW55LCBOVUxMKSA9PSAwKSB7CisJCWVycm9yKCJSZWFkaW5nIHJhdyBkcml2ZSIpOworCQlyZXN1bHQgPSBGQUxTRTsKKwkgICAgfSBlbHNlIGlmIChob3dNYW55ICE9IHNpemVvZihzZWN0b3IpKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkVycm9yOiBSZWFkRmlsZSBvbiBkcml2ZSBvbmx5IGdvdCAlZCBvZiAlZCBieXRlc1xuIiwKKwkJCShpbnQpaG93TWFueSwgc2l6ZW9mKHNlY3RvcikpOworCQlyZXN1bHQgPSBGQUxTRTsKKwkgICAgfQorCX0KKwkvLyBDb3B5IG92ZXIgdGhlIE1CUiBjb2RlIGlmIHNwZWNpZmllZCAoLW0pCisJaWYgKHdyaXRlX21icikgeworCSAgICBpZiAocmVzdWx0KSB7CisJCWlmIChzeXNsaW51eF9tYnJfbGVuID49IFBBUlRfVEFCTEUpIHsKKwkJICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IE1CUiB3aWxsIG5vdCBmaXQ7IG5vdCB3cml0aW5nXG4iKTsKKwkJICAgIHJlc3VsdCA9IEZBTFNFOworCQl9IGVsc2UgeworCQkgICAgbWVtY3B5KHNlY3Rvciwgc3lzbGludXhfbWJyLCBzeXNsaW51eF9tYnJfbGVuKTsKKwkJfQorCSAgICB9CisJfQorCS8vIENoZWNrIHRoYXQgb3VyIHBhcnRpdGlvbiBpcyBhY3RpdmUgaWYgc3BlY2lmaWVkICgtYSkKKwlpZiAoc2V0X2FjdGl2ZSkgeworCSAgICBpZiAoc2VjdG9yW1BBUlRfVEFCTEUgKyAoUEFSVF9TSVpFICogKHBhcnRpdGlvbk51bSAtIDEpKV0gIT0gMHg4MCkgeworCQlpbnQgcDsKKwkJZm9yIChwID0gMDsgcCA8IFBBUlRfQ09VTlQ7IHArKykKKwkJICAgIHNlY3RvcltQQVJUX1RBQkxFICsgKFBBUlRfU0laRSAqIHApXSA9CisJCQkocCA9PSBwYXJ0aXRpb25OdW0gLSAxID8gMHg4MCA6IDApOworCSAgICB9CisJfQorCisJaWYgKHJlc3VsdCkgeworCSAgICBTZXRGaWxlUG9pbnRlcihkcml2ZSwgMCwgTlVMTCwgRklMRV9CRUdJTik7CisKKwkgICAgaWYgKFdyaXRlRmlsZShkcml2ZSwgc2VjdG9yLCBzaXplb2Yoc2VjdG9yKSwgJmhvd01hbnksIE5VTEwpID09IDApIHsKKwkJZXJyb3IoIldyaXRpbmcgTUJSIik7CisJCXJlc3VsdCA9IEZBTFNFOworCSAgICB9IGVsc2UgaWYgKGhvd01hbnkgIT0gc2l6ZW9mKHNlY3RvcikpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiRXJyb3I6IFdyaXRlRmlsZSBvbiBkcml2ZSBvbmx5IHdyb3RlICVkIG9mICVkIGJ5dGVzXG4iLAorCQkJKGludClob3dNYW55LCBzaXplb2Yoc2VjdG9yKSk7CisJCXJlc3VsdCA9IEZBTFNFOworCSAgICB9CisJfQorCisJaWYgKCFDbG9zZUhhbmRsZShkcml2ZSkpIHsKKwkgICAgZXJyb3IoIkNsb3NlRmlsZSBvbiBkcml2ZSIpOworCSAgICByZXN1bHQgPSBGQUxTRTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIChyZXN1bHQpOworfQorCisvKiBFbmQgc3R1ZmYgZm9yIE1CUiBjb2RlICovCisKK2NvbnN0IGNoYXIgKnByb2dyYW07CQkvKiBOYW1lIG9mIHByb2dyYW0gKi8KKworLyoKKyAqIENoZWNrIFdpbmRvd3MgdmVyc2lvbi4KKyAqCisgKiBPbiBXaW5kb3dzIE1lLzk4Lzk1IHlvdSBjYW5ub3Qgb3BlbiBhIGRpcmVjdG9yeSwgcGh5c2ljYWwgZGlzaywgb3IKKyAqIHZvbHVtZSB1c2luZyBDcmVhdGVGaWxlLgorICovCitpbnQgY2hlY2t2ZXIodm9pZCkKK3sKKyAgICBPU1ZFUlNJT05JTkZPIG9zdmk7CisKKyAgICBvc3ZpLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YoT1NWRVJTSU9OSU5GTyk7CisgICAgR2V0VmVyc2lvbkV4KCZvc3ZpKTsKKworICAgIHJldHVybiAob3N2aS5kd1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX05UKSAmJgorCSgob3N2aS5kd01ham9yVmVyc2lvbiA+IDQpIHx8CisJICgob3N2aS5kd01ham9yVmVyc2lvbiA9PSA0KSAmJiAob3N2aS5kd01pbm9yVmVyc2lvbiA9PSAwKSkpOworfQorCisvKgorICogV2luZG93cyBlcnJvciBmdW5jdGlvbgorICovCit2b2lkIGVycm9yKGNoYXIgKm1zZykKK3sKKyAgICBMUFZPSUQgbHBNc2dCdWY7CisKKyAgICAvKiBGb3JtYXQgdGhlIFdpbmRvd3MgZXJyb3IgbWVzc2FnZSAqLworICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfCBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgTlVMTCwgR2V0TGFzdEVycm9yKCksIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAkvLyBEZWZhdWx0IGxhbmd1YWdlCisJCSAgKExQVFNUUikgJiBscE1zZ0J1ZiwgMCwgTlVMTCk7CisKKyAgICAvKiBQcmludCBpdCAqLworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzIiwgbXNnLCAoY2hhciAqKWxwTXNnQnVmKTsKKworICAgIC8qIEZyZWUgdGhlIGJ1ZmZlciAqLworICAgIExvY2FsRnJlZShscE1zZ0J1Zik7Cit9CisKKy8qCisgKiBXcmFwcGVyIGZvciBSZWFkRmlsZSBzdWl0YWJsZSBmb3IgbGliZmF0CisgKi8KK2ludCBsaWJmYXRfcmVhZGZpbGUoaW50cHRyX3QgcHAsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNlY3NpemUsCisJCSAgICBsaWJmYXRfc2VjdG9yX3Qgc2VjdG9yKQoreworICAgIHVpbnQ2NF90IG9mZnNldCA9ICh1aW50NjRfdCkgc2VjdG9yICogc2Vjc2l6ZTsKKyAgICBMT05HIGxvd29yZCA9IChMT05HKSBvZmZzZXQ7CisgICAgTE9ORyBoaXdvcmQgPSAoTE9ORykgKG9mZnNldCA+PiAzMik7CisgICAgTE9ORyBoaXdvcmR4ID0gaGl3b3JkOworICAgIERXT1JEIGJ5dGVzX3JlYWQ7CisKKyAgICBpZiAoU2V0RmlsZVBvaW50ZXIoKEhBTkRMRSkgcHAsIGxvd29yZCwgJmhpd29yZHgsIEZJTEVfQkVHSU4pICE9IGxvd29yZCB8fAorCWhpd29yZCAhPSBoaXdvcmR4IHx8CisJIVJlYWRGaWxlKChIQU5ETEUpIHBwLCBidWYsIHNlY3NpemUsICZieXRlc19yZWFkLCBOVUxMKSB8fAorCWJ5dGVzX3JlYWQgIT0gc2Vjc2l6ZSkgeworCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlYWQgc2VjdG9yICV1XG4iLCBzZWN0b3IpOworCWV4aXQoMSk7CisgICAgfQorCisgICAgcmV0dXJuIHNlY3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIG1vdmVfZmlsZShjaGFyICpwYXRobmFtZSwgY2hhciAqZmlsZW5hbWUpCit7CisgICAgY2hhciBuZXdfbmFtZVtzdHJsZW4ob3B0LmRpcmVjdG9yeSkgKyAxNl07CisgICAgY2hhciAqY3AgPSBuZXdfbmFtZSArIDM7CisgICAgY29uc3QgY2hhciAqc2Q7CisgICAgaW50IHNsYXNoID0gMTsKKworICAgIG5ld19uYW1lWzBdID0gb3B0LmRldmljZVswXTsKKyAgICBuZXdfbmFtZVsxXSA9ICc6JzsKKyAgICBuZXdfbmFtZVsyXSA9ICdcXCc7CisKKyAgICBmb3IgKHNkID0gb3B0LmRpcmVjdG9yeTsgKnNkOyBzZCsrKSB7CisJY2hhciBjID0gKnNkOworCisJaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ1xcJykgeworCSAgICBpZiAoc2xhc2gpCisJCWNvbnRpbnVlOworCSAgICBjID0gJ1xcJzsKKwkgICAgc2xhc2ggPSAxOworCX0gZWxzZSB7CisJICAgIHNsYXNoID0gMDsKKwl9CisKKwkqY3ArKyA9IGM7CisgICAgfQorCisgICAgLyogU2tpcCBpZiBzdWJkaXJlY3RvcnkgPT0gcm9vdCAqLworICAgIGlmIChjcCA+IG5ld19uYW1lICsgMykgeworCWlmICghc2xhc2gpCisJICAgICpjcCsrID0gJ1xcJzsKKworCW1lbWNweShjcCwgZmlsZW5hbWUsIDEyKTsKKworCS8qIERlbGV0ZSBhbnkgcHJldmlvdXMgZmlsZSAqLworCVNldEZpbGVBdHRyaWJ1dGVzKG5ld19uYW1lLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwpOworCURlbGV0ZUZpbGUobmV3X25hbWUpOworCWlmICghTW92ZUZpbGUocGF0aG5hbWUsIG5ld19uYW1lKSkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwKKwkJICAgICJGYWlsZWQgdG8gbW92ZSAlcyB0byBkZXN0aW5hdGlvbiBkaXJlY3Rvcnk6ICVzXG4iLAorCQkgICAgZmlsZW5hbWUsIG9wdC5kaXJlY3RvcnkpOworCisJICAgIFNldEZpbGVBdHRyaWJ1dGVzKHBhdGhuYW1lLCBGSUxFX0FUVFJJQlVURV9SRUFET05MWSB8CisJCQkgICAgICBGSUxFX0FUVFJJQlVURV9TWVNURU0gfAorCQkJICAgICAgRklMRV9BVFRSSUJVVEVfSElEREVOKTsKKwl9IGVsc2UKKwkgICAgU2V0RmlsZUF0dHJpYnV0ZXMobmV3X25hbWUsIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZIHwKKwkJCSAgICAgIEZJTEVfQVRUUklCVVRFX1NZU1RFTSB8CisJCQkgICAgICBGSUxFX0FUVFJJQlVURV9ISURERU4pOworICAgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBIQU5ETEUgZl9oYW5kbGUsIGRfaGFuZGxlOworICAgIERXT1JEIGJ5dGVzX3JlYWQ7CisgICAgRFdPUkQgYnl0ZXNfd3JpdHRlbjsKKyAgICBEV09SRCBkcml2ZXM7CisgICAgVUlOVCBkcml2ZV90eXBlOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgc2VjdGJ1ZltTRUNUT1JfU0laRV07CisgICAgY2hhciAqKmFyZ3A7CisgICAgc3RhdGljIGNoYXIgZHJpdmVfbmFtZVtdID0gIlxcXFwuXFw/OiI7CisgICAgc3RhdGljIGNoYXIgZHJpdmVfcm9vdFtdID0gIj86XFwiOworICAgIHN0YXRpYyBjaGFyIGxkbGludXhfbmFtZVtdID0gIj86XFxsZGxpbnV4LnN5cyI7CisgICAgc3RhdGljIGNoYXIgbGRsaW51eGMzMl9uYW1lW10gPSAiPzpcXGxkbGludXguYzMyIjsKKyAgICBjb25zdCBjaGFyICplcnJtc2c7CisgICAgc3RydWN0IGxpYmZhdF9maWxlc3lzdGVtICpmczsKKyAgICBsaWJmYXRfc2VjdG9yX3QgcywgKnNlY3A7CisgICAgbGliZmF0X3NlY3Rvcl90ICpzZWN0b3JzOworICAgIGludCBsZGxpbnV4X3NlY3RvcnM7CisgICAgdWludDMyX3QgbGRsaW51eF9jbHVzdGVyOworICAgIGludCBuc2VjdG9yczsKKyAgICBpbnQgZnNfdHlwZTsKKworICAgIGlmICghY2hlY2t2ZXIoKSkgeworCWZwcmludGYoc3RkZXJyLAorCQkiWW91IG5lZWQgdG8gYmUgcnVubmluZyBhdCBsZWFzdCBXaW5kb3dzIE5UOyB1c2Ugc3lzbGludXguY29tIGluc3RlYWQuXG4iKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIHByb2dyYW0gPSBhcmd2WzBdOworCisgICAgcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBNT0RFX1NZU0xJTlVYX0RPU1dJTik7CisKKyAgICBpZiAoIW9wdC5kZXZpY2UgfHwgIWlzYWxwaGEob3B0LmRldmljZVswXSkgfHwgb3B0LmRldmljZVsxXSAhPSAnOicKKwl8fCBvcHQuZGV2aWNlWzJdKQorCXVzYWdlKEVYX1VTQUdFLCBNT0RFX1NZU0xJTlVYX0RPU1dJTik7CisKKyAgICBpZiAob3B0LnNlY3RvcnMgfHwgb3B0LmhlYWRzIHx8IG9wdC5yZXNldF9hZHYgfHwgb3B0LnNldF9vbmNlCisJfHwgKG9wdC51cGRhdGVfb25seSA+IDApIHx8IG9wdC5tZW51X3NhdmUgfHwgb3B0Lm9mZnNldCkgeworCWZwcmludGYoc3RkZXJyLAorCQkiQXQgbGVhc3Qgb25lIHNwZWNpZmllZCBvcHRpb24gbm90IHlldCBpbXBsZW1lbnRlZCIKKwkJIiBmb3IgdGhpcyBpbnN0YWxsZXIuXG4iKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qIFRlc3QgaWYgZHJpdmUgZXhpc3RzICovCisgICAgZHJpdmVzID0gR2V0TG9naWNhbERyaXZlcygpOworICAgIGlmICghKGRyaXZlcyAmICgxIDw8ICh0b2xvd2VyKG9wdC5kZXZpY2VbMF0pIC0gJ2EnKSkpKSB7CisJZnByaW50ZihzdGRlcnIsICJObyBzdWNoIGRyaXZlICVjOlxuIiwgb3B0LmRldmljZVswXSk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBEZXRlcm1pbmVzIHRoZSBkcml2ZSB0eXBlICovCisgICAgZHJpdmVfbmFtZVs0XSA9IG9wdC5kZXZpY2VbMF07CisgICAgbGRsaW51eF9uYW1lWzBdID0gb3B0LmRldmljZVswXTsKKyAgICBsZGxpbnV4YzMyX25hbWVbMF0gPSBvcHQuZGV2aWNlWzBdOworICAgIGRyaXZlX3Jvb3RbMF0gPSBvcHQuZGV2aWNlWzBdOworICAgIGRyaXZlX3R5cGUgPSBHZXREcml2ZVR5cGUoZHJpdmVfcm9vdCk7CisKKyAgICAvKiBUZXN0IGZvciByZW1vdmVhYmxlIG1lZGlhICovCisgICAgaWYgKChkcml2ZV90eXBlID09IERSSVZFX0ZJWEVEKSAmJiAob3B0LmZvcmNlID09IDApKSB7CisJZnByaW50ZihzdGRlcnIsICJOb3QgYSByZW1vdmFibGUgZHJpdmUgKHVzZSAtZiB0byBvdmVycmlkZSkgXG4iKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qIFRlc3QgZm9yIHVuc3VwcG9ydGVkIG1lZGlhICovCisgICAgaWYgKChkcml2ZV90eXBlICE9IERSSVZFX0ZJWEVEKSAmJiAoZHJpdmVfdHlwZSAhPSBEUklWRV9SRU1PVkFCTEUpKSB7CisJZnByaW50ZihzdGRlcnIsICJVbnN1cHBvcnRlZCBtZWRpYVxuIik7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZpcnN0IG9wZW4gdGhlIGRyaXZlCisgICAgICovCisgICAgZF9oYW5kbGUgPSBDcmVhdGVGaWxlKGRyaXZlX25hbWUsIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsCisJCQkgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsCisJCQkgIE5VTEwsIE9QRU5fRVhJU1RJTkcsIDAsIE5VTEwpOworCisgICAgaWYgKGRfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJZXJyb3IoIkNvdWxkIG5vdCBvcGVuIGRyaXZlIik7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE1ha2Ugc3VyZSB3ZSBjYW4gcmVhZCB0aGUgYm9vdCBzZWN0b3IKKyAgICAgKi8KKyAgICBpZiAoIVJlYWRGaWxlKGRfaGFuZGxlLCBzZWN0YnVmLCBTRUNUT1JfU0laRSwgJmJ5dGVzX3JlYWQsIE5VTEwpKSB7CisJZXJyb3IoIlJlYWRpbmcgYm9vdCBzZWN0b3IiKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBpZiAoYnl0ZXNfcmVhZCAhPSBTRUNUT1JfU0laRSkgeworCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJlYWQgdGhlIHdob2xlIGJvb3Qgc2VjdG9yXG4iKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qIENoZWNrIHRvIHNlZSB0aGF0IHdoYXQgd2UgZ290IHdhcyBpbmRlZWQgYW4gRkFUL05URlMKKyAgICAgKiBib290IHNlY3Rvci9zdXBlcmJsb2NrCisgICAgICovCisgICAgaWYgKChlcnJtc2cgPSBzeXNsaW51eF9jaGVja19ib290c2VjdChzZWN0YnVmLCAmZnNfdHlwZSkpKSB7CisJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZXJybXNnKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qIENoYW5nZSB0byBub3JtYWwgYXR0cmlidXRlcyB0byBlbmFibGUgZGVsZXRpb24gKi8KKyAgICAvKiBKdXN0IGlnbm9yZSBlcnJvciBpZiB0aGUgZmlsZSBkbyBub3QgZXhpc3RzICovCisgICAgU2V0RmlsZUF0dHJpYnV0ZXMobGRsaW51eF9uYW1lLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwpOworICAgIFNldEZpbGVBdHRyaWJ1dGVzKGxkbGludXhjMzJfbmFtZSwgRklMRV9BVFRSSUJVVEVfTk9STUFMKTsKKworICAgIC8qIERlbGV0ZSB0aGUgZmlsZSAqLworICAgIC8qIEp1c3QgaWdub3JlIGVycm9yIGlmIHRoZSBmaWxlIGRvIG5vdCBleGlzdHMgKi8KKyAgICBEZWxldGVGaWxlKGxkbGludXhfbmFtZSk7CisgICAgRGVsZXRlRmlsZShsZGxpbnV4YzMyX25hbWUpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgQURWIC0tIHRoaXMgc2hvdWxkIGJlIHNtYXJ0ZXIgKi8KKyAgICBzeXNsaW51eF9yZXNldF9hZHYoc3lzbGludXhfYWR2KTsKKworICAgIC8qIENyZWF0ZSBsZGxpbnV4LnN5cyBmaWxlICovCisgICAgZl9oYW5kbGUgPSBDcmVhdGVGaWxlKGxkbGludXhfbmFtZSwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwKKwkJCSAgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwKKwkJCSAgTlVMTCwgQ1JFQVRFX0FMV0FZUywKKwkJCSAgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkgfCBGSUxFX0FUVFJJQlVURV9TWVNURU0gfAorCQkJICBGSUxFX0FUVFJJQlVURV9ISURERU4sIE5VTEwpOworCisgICAgaWYgKGZfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgbGRsaW51eC5zeXMiKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qIFdyaXRlIGxkbGludXguc3lzIGZpbGUgKi8KKyAgICBpZiAoIVdyaXRlRmlsZShmX2hhbmRsZSwgKGNvbnN0IGNoYXIgX2ZvcmNlICopc3lzbGludXhfbGRsaW51eCwKKwkJICAgc3lzbGludXhfbGRsaW51eF9sZW4sICZieXRlc193cml0dGVuLCBOVUxMKSB8fAorCWJ5dGVzX3dyaXR0ZW4gIT0gc3lzbGludXhfbGRsaW51eF9sZW4pIHsKKwllcnJvcigiQ291bGQgbm90IHdyaXRlIGxkbGludXguc3lzIik7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKCFXcml0ZUZpbGUoZl9oYW5kbGUsIHN5c2xpbnV4X2FkdiwgMiAqIEFEVl9TSVpFLAorCQkgICAmYnl0ZXNfd3JpdHRlbiwgTlVMTCkgfHwKKwlieXRlc193cml0dGVuICE9IDIgKiBBRFZfU0laRSkgeworCWVycm9yKCJDb3VsZCBub3Qgd3JpdGUgQURWIHRvIGxkbGludXguc3lzIik7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBOb3cgZmx1c2ggdGhlIG1lZGlhICovCisgICAgaWYgKCFGbHVzaEZpbGVCdWZmZXJzKGZfaGFuZGxlKSkgeworCWVycm9yKCJGbHVzaEZpbGVCdWZmZXJzIGZhaWxlZCIpOworCWV4aXQoMSk7CisgICAgfQorCisgICAgLyogTWFwIHRoZSBmaWxlIChpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz8pICovCisgICAgbGRsaW51eF9zZWN0b3JzID0gKHN5c2xpbnV4X2xkbGludXhfbGVuICsgMiAqIEFEVl9TSVpFICsgU0VDVE9SX1NJWkUgLSAxKQorCT4+IFNFQ1RPUl9TSElGVDsKKyAgICBzZWN0b3JzID0gY2FsbG9jKGxkbGludXhfc2VjdG9ycywgc2l6ZW9mICpzZWN0b3JzKTsKKyAgICBpZiAoZnNfdHlwZSA9PSBOVEZTKSB7CisJRFdPUkQgZXJyOworCVNfTlRGU1NFQ1RfVk9MSU5GTyB2b2xfaW5mbzsKKwlMQVJHRV9JTlRFR0VSIHZjbiwgbGJhLCBsZW47CisJU19OVEZTU0VDVF9FWFRFTlQgZXh0ZW50OworCisJZXJyID0gTnRmc1NlY3RHZXRWb2x1bWVJbmZvKGRyaXZlX25hbWUgKyA0LCAmdm9sX2luZm8pOworCWlmIChlcnIgIT0gRVJST1JfU1VDQ0VTUykgeworCSAgICBlcnJvcigiQ291bGQgbm90IGZldGNoIE5URlMgdm9sdW1lIGluZm8iKTsKKwkgICAgZXhpdCgxKTsKKwl9CisJc2VjcCA9IHNlY3RvcnM7CisJbnNlY3RvcnMgPSAwOworCWZvciAodmNuLlF1YWRQYXJ0ID0gMDsKKwkgICAgIE50ZnNTZWN0R2V0RmlsZVZjbkV4dGVudChmX2hhbmRsZSwgJnZjbiwgJmV4dGVudCkgPT0gRVJST1JfU1VDQ0VTUzsKKwkgICAgIHZjbiA9IGV4dGVudC5OZXh0VmNuKSB7CisJICAgIGVyciA9IE50ZnNTZWN0TGNuVG9MYmEoJnZvbF9pbmZvLCAmZXh0ZW50LkZpcnN0TGNuLCAmbGJhKTsKKwkgICAgaWYgKGVyciAhPSBFUlJPUl9TVUNDRVNTKSB7CisJCWVycm9yKCJDb3VsZCBub3QgdHJhbnNsYXRlIExETElOVVguU1lTIExDTiB0byBkaXNrIExCQSIpOworCQlleGl0KDEpOworCSAgICB9CisJICAgIGxiYS5RdWFkUGFydCAtPSB2b2xfaW5mby5QYXJ0aXRpb25MYmEuUXVhZFBhcnQ7CisJICAgIGxlbi5RdWFkUGFydCA9ICgoZXh0ZW50Lk5leHRWY24uUXVhZFBhcnQgLQorCQkJICAgICBleHRlbnQuRmlyc3RWY24uUXVhZFBhcnQpICoKKwkJCSAgICB2b2xfaW5mby5TZWN0b3JzUGVyQ2x1c3Rlcik7CisJICAgIHdoaWxlIChsZW4uUXVhZFBhcnQtLSAmJiBuc2VjdG9ycyA8IGxkbGludXhfc2VjdG9ycykgeworCQkqc2VjcCsrID0gbGJhLlF1YWRQYXJ0Kys7CisJCW5zZWN0b3JzKys7CisJICAgIH0KKwl9CisJZ290byBtYXBfZG9uZTsKKyAgICB9CisgICAgZnMgPSBsaWJmYXRfb3BlbihsaWJmYXRfcmVhZGZpbGUsIChpbnRwdHJfdCkgZF9oYW5kbGUpOworICAgIGxkbGludXhfY2x1c3RlciA9IGxpYmZhdF9zZWFyY2hkaXIoZnMsIDAsICJMRExJTlVYIFNZUyIsIE5VTEwpOworICAgIHNlY3AgPSBzZWN0b3JzOworICAgIG5zZWN0b3JzID0gMDsKKyAgICBzID0gbGliZmF0X2NsdXN0ZXJ0b3NlY3RvcihmcywgbGRsaW51eF9jbHVzdGVyKTsKKyAgICB3aGlsZSAocyAmJiBuc2VjdG9ycyA8IGxkbGludXhfc2VjdG9ycykgeworCSpzZWNwKysgPSBzOworCW5zZWN0b3JzKys7CisJcyA9IGxpYmZhdF9uZXh0c2VjdG9yKGZzLCBzKTsKKyAgICB9CisgICAgbGliZmF0X2Nsb3NlKGZzKTsKK21hcF9kb25lOgorCisgICAgLyoKKyAgICAgKiBQYXRjaCBsZGxpbnV4LnN5cyBhbmQgdGhlIGJvb3Qgc2VjdG9yCisgICAgICovCisgICAgc3lzbGludXhfcGF0Y2goc2VjdG9ycywgbnNlY3RvcnMsIG9wdC5zdHVwaWRfbW9kZSwgb3B0LnJhaWRfbW9kZSwgb3B0LmRpcmVjdG9yeSwgTlVMTCk7CisKKyAgICAvKgorICAgICAqIFJld3JpdGUgdGhlIGZpbGUKKyAgICAgKi8KKyAgICBpZiAoU2V0RmlsZVBvaW50ZXIoZl9oYW5kbGUsIDAsIE5VTEwsIEZJTEVfQkVHSU4pICE9IDAgfHwKKwkhV3JpdGVGaWxlKGZfaGFuZGxlLCBzeXNsaW51eF9sZGxpbnV4LCBzeXNsaW51eF9sZGxpbnV4X2xlbiwKKwkJICAgJmJ5dGVzX3dyaXR0ZW4sIE5VTEwpCisJfHwgYnl0ZXNfd3JpdHRlbiAhPSBzeXNsaW51eF9sZGxpbnV4X2xlbikgeworCWVycm9yKCJDb3VsZCBub3Qgd3JpdGUgbGRsaW51eC5zeXMiKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qIElmIGRlc2lyZWQsIGZpeCB0aGUgTUJSICovCisgICAgaWYgKG9wdC5pbnN0YWxsX21iciB8fCBvcHQuYWN0aXZhdGVfcGFydGl0aW9uKSB7CisJc3RydWN0IHN0b3JhZ2VfZGV2aWNlX251bWJlciBzZG47CisJaWYgKEdldFN0b3JhZ2VEZXZpY2VOdW1iZXJCeUhhbmRsZShkX2hhbmRsZSwgJnNkbikpIHsKKwkgICAgaWYgKCFGaXhNQlIoc2RuLkRldmljZU51bWJlciwgc2RuLlBhcnRpdGlvbk51bWJlciwgb3B0Lmluc3RhbGxfbWJyLCBvcHQuYWN0aXZhdGVfcGFydGl0aW9uKSkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJEaWQgbm90IHN1Y2Nlc3NmdWxseSB1cGRhdGUgdGhlIE1CUjsgY29udGludWluZy4uLlxuIik7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBmcHJpbnRmKHN0ZGVyciwKKwkJICAgICJDb3VsZCBub3QgZmluZCBkZXZpY2UgbnVtYmVyIGZvciB1cGRhdGluZyBNQlI7IGNvbnRpbnVpbmcuLi5cbiIpOworCX0KKyAgICB9CisKKyAgICAvKiBDbG9zZSBmaWxlICovCisgICAgQ2xvc2VIYW5kbGUoZl9oYW5kbGUpOworCisgICAgLyogTW92ZSB0aGUgZmlsZSB0byB0aGUgZGVzaXJlZCBsb2NhdGlvbiAqLworICAgIGlmIChvcHQuZGlyZWN0b3J5KQorCW1vdmVfZmlsZShsZGxpbnV4X25hbWUsICJsZGxpbnV4LnN5cyIpOworCisgICAgZl9oYW5kbGUgPSBDcmVhdGVGaWxlKGxkbGludXhjMzJfbmFtZSwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwKKwkJCSAgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwKKwkJCSAgTlVMTCwgQ1JFQVRFX0FMV0FZUywKKwkJCSAgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkgfCBGSUxFX0FUVFJJQlVURV9TWVNURU0gfAorCQkJICBGSUxFX0FUVFJJQlVURV9ISURERU4sIE5VTEwpOworCisgICAgaWYgKGZfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgbGRsaW51eC5jMzIiKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIC8qIFdyaXRlIGxkbGludXguYzMyIGZpbGUgKi8KKyAgICBpZiAoIVdyaXRlRmlsZShmX2hhbmRsZSwgKGNvbnN0IGNoYXIgX2ZvcmNlICopc3lzbGludXhfbGRsaW51eGMzMiwKKwkJICAgc3lzbGludXhfbGRsaW51eGMzMl9sZW4sICZieXRlc193cml0dGVuLCBOVUxMKSB8fAorCWJ5dGVzX3dyaXR0ZW4gIT0gc3lzbGludXhfbGRsaW51eGMzMl9sZW4pIHsKKwllcnJvcigiQ291bGQgbm90IHdyaXRlIGxkbGludXguYzMyIik7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBOb3cgZmx1c2ggdGhlIG1lZGlhICovCisgICAgaWYgKCFGbHVzaEZpbGVCdWZmZXJzKGZfaGFuZGxlKSkgeworCWVycm9yKCJGbHVzaEZpbGVCdWZmZXJzIGZhaWxlZCIpOworCWV4aXQoMSk7CisgICAgfQorCisgICAgQ2xvc2VIYW5kbGUoZl9oYW5kbGUpOworCisgICAgLyogTW92ZSB0aGUgZmlsZSB0byB0aGUgZGVzaXJlZCBsb2NhdGlvbiAqLworICAgIGlmIChvcHQuZGlyZWN0b3J5KQorCW1vdmVfZmlsZShsZGxpbnV4YzMyX25hbWUsICJsZGxpbnV4LmMzMiIpOworCisgICAgLyogTWFrZSB0aGUgc3lzbGludXggYm9vdCBzZWN0b3IgKi8KKyAgICBzeXNsaW51eF9tYWtlX2Jvb3RzZWN0KHNlY3RidWYsIGZzX3R5cGUpOworCisgICAgLyogV3JpdGUgdGhlIHN5c2xpbnV4IGJvb3Qgc2VjdG9yIGludG8gdGhlIGJvb3Qgc2VjdG9yICovCisgICAgaWYgKG9wdC5ib290c2VjZmlsZSkgeworCWZfaGFuZGxlID0gQ3JlYXRlRmlsZShvcHQuYm9vdHNlY2ZpbGUsIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsCisJCQkgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAorCQkJICAgICAgTlVMTCwgQ1JFQVRFX0FMV0FZUywKKwkJCSAgICAgIEZJTEVfQVRUUklCVVRFX0FSQ0hJVkUsIE5VTEwpOworCWlmIChmX2hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCSAgICBlcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBib290c2VjdG9yIGZpbGUiKTsKKwkgICAgZXhpdCgxKTsKKwl9CisJaWYgKCFXcml0ZUZpbGUoZl9oYW5kbGUsIHNlY3RidWYsIFNFQ1RPUl9TSVpFLCAmYnl0ZXNfd3JpdHRlbiwgTlVMTCkpIHsKKwkgICAgZXJyb3IoIkNvdWxkIG5vdCB3cml0ZSBib290IHNlY3RvciBmaWxlIik7CisJICAgIGV4aXQoMSk7CisJfQorCUNsb3NlSGFuZGxlKGZfaGFuZGxlKTsKKyAgICB9IGVsc2UgeworCVNldEZpbGVQb2ludGVyKGRfaGFuZGxlLCAwLCBOVUxMLCBGSUxFX0JFR0lOKTsKKwlXcml0ZUZpbGUoZF9oYW5kbGUsIHNlY3RidWYsIFNFQ1RPUl9TSVpFLCAmYnl0ZXNfd3JpdHRlbiwgTlVMTCk7CisgICAgfQorCisgICAgaWYgKGJ5dGVzX3dyaXR0ZW4gIT0gU0VDVE9SX1NJWkUpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCB3cml0ZSB0aGUgd2hvbGUgYm9vdCBzZWN0b3JcbiIpOworCWV4aXQoMSk7CisgICAgfQorCisgICAgLyogQ2xvc2UgZmlsZSAqLworICAgIENsb3NlSGFuZGxlKGRfaGFuZGxlKTsKKworICAgIC8qIERvbmUhICovCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9NYWtlZmlsZSBiL3dpbjMyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzN2Y5NTQKLS0tIC9kZXYvbnVsbAorKysgYi93aW4zMi9NYWtlZmlsZQpAQCAtMCwwICsxLDEwNCBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAxOTk4LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIworIyBNYWtlZmlsZSBmb3IgU1lTTElOVVggV2luMzIKKyMKKyMgVGhpcyBpcyBzZXBhcmF0ZWQgb3V0IG1vc3RseSBzbyB3ZSBjYW4gaGF2ZSBhIGRpZmZlcmVudCBzZXQgb2YgTWFrZWZpbGUKKyMgdmFyaWFibGVzLgorIworCitPU1RZUEUgICA9ICQoc2hlbGwgdW5hbWUgLW1zcikKK2lmZXEgKCQoZmluZHN0cmluZyBDWUdXSU4sJChPU1RZUEUpKSxDWUdXSU4pCisjIyBDb21waWxpbmcgb24gQ3lnd2luCitXSU5QUkVGSVggIDo9CitXSU5DRkxBR1MgIDo9IC1tbm8tY3lnd2luICQoR0NDV0FSTikgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQKK1dJTkxERkxBR1MgOj0gLW1uby1jeWd3aW4gLU9zIC1zCitlbHNlCisjIyBDb21waWxpbmcgb24gc29tZSB2YXJpYW50IG9mIE1pbkdXCitpZmVxICgkKGZpbmRzdHJpbmcgTUlOR1czMiwkKE9TVFlQRSkpLE1JTkdXMzIpCitXSU5QUkVGSVggIDo9CitlbHNlCitXSU5QUkVGSVggIDo9ICQoc2hlbGwgJChTUkMpL2ZpbmQtbWluZ3czMi5zaCBnY2MpCitlbmRpZgorV0lOQ0ZMQUdTICA6PSAkKEdDQ1dBUk4pIC1Xbm8tc2lnbi1jb21wYXJlIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciBcCisJICAgICAgLURfRklMRV9PRkZTRVRfQklUUz02NAorV0lOTERGTEFHUyA6PSAtT3MgLXMKK2VuZGlmCitXSU5DRkxBR1MgKz0gLUkkKFNSQykgLUkkKFNSQykvLi4vd2luIC1JJChvYmpkaXIpIFwKKwkgICAgIC1JJChTUkMpLy4uL2xpYmZhdCAtSSQoU1JDKS8uLi9saWJpbnN0YWxsZXIgXAorCSAgICAgLUkkKFNSQykvLi4vbGliaW5zdGFsbGVyL2dldG9wdAorCitXSU5DQyAgICAgIDo9ICQoV0lOUFJFRklYKWdjYworV0lOQVIJICAgOj0gJChXSU5QUkVGSVgpYXIKK1dJTlJBTkxJQiAgOj0gJChXSU5QUkVGSVgpcmFubGliCisKK1dJTkNDX0lTX0dPT0QgOj0gJChzaGVsbCAkKFdJTkNDKSAkKFdJTkNGTEFHUykgJChXSU5MREZMQUdTKSBcCisJLW8gaGVsbG8uZXhlICQoU1JDKS8uLi93aW4vaGVsbG8uYyA+L2Rldi9udWxsIDI+JjEgOyBlY2hvICQkPykKKworLlNVRkZJWEVTOiAuYyAub2JqIC5saWIgLmV4ZSAuaSAucyAuUworCitTUkNTICAgICA9IC4uL3dpbi9zeXNsaW51eC5jIC4uL3dpbi9udGZzc2VjdC5jCitPQkpTICAgICA9ICQocGF0c3Vic3QgJS5jLCUub2JqLCQobm90ZGlyICQoU1JDUykpKQorTElCU1JDICAgPSAuLi9saWJpbnN0YWxsZXIvZnMuYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL3N5c2x4bW9kLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9zeXNseG9wdC5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvc2V0YWR2LmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9nZXRvcHQvZ2V0b3B0X2xvbmcuYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL2Jvb3RzZWN0X2Jpbi5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvbGRsaW51eF9iaW4uYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL2xkbGludXhjMzJfYmluLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9tYnJfYmluLmMgXAorCSAgICQod2lsZGNhcmQgJChTUkMpLy4uL2xpYmZhdC8qLmMpCitMSUJPQkpTICA9ICQocGF0c3Vic3QgJS5jLCUub2JqLCQobm90ZGlyICQoTElCU1JDKSkpCisKK0xJQgkgPSBzeXNsaW51eC5saWIKKworVlBBVEggPSAkKFNSQyk6JChTUkMpLy4uL3dpbjokKFNSQykvLi4vbGliZmF0OiQoU1JDKS8uLi9saWJpbnN0YWxsZXI6JChTUkMpLy4uL2xpYmluc3RhbGxlci9nZXRvcHQ6JChPQkopLy4uL2xpYmluc3RhbGxlcgorCitUQVJHRVRTID0gc3lzbGludXguZXhlCisKK2lmZXEgKCQoV0lOQ0NfSVNfR09PRCksMCkKK2FsbDogJChUQVJHRVRTKQorZWxzZQorYWxsOgorCXJtIC1mICQoVEFSR0VUUykKK2VuZGlmCisKK3RpZHkgZGlzdDoKKwktcm0gLWYgKi5vICoub2JqICoubGliICouaSAqLnMgKi5hIC4qLmQgKi50bXAgKl9iaW4uYyBoZWxsby5leGUKKworY2xlYW46IHRpZHkKKworc3BvdGxlc3M6IGNsZWFuCisJLXJtIC1mICp+ICQoVEFSR0VUUykKKworaW5zdGFsbGVyOgorCiskKExJQik6ICQoTElCT0JKUykKKwlybSAtZiAkQAorCSQoV0lOQVIpIGNxICRAICReCisJJChXSU5SQU5MSUIpICRACisKK3N5c2xpbnV4LmV4ZTogJChPQkpTKSAkKExJQikKKwkkKFdJTkNDKSAkKFdJTkxERkxBR1MpIC1vICRAICReCisKKworJS5vYmo6ICUuYworCSQoV0lOQ0MpICQoVU1BS0VERVBTKSAkKFdJTkNGTEFHUykgLWMgLW8gJEAgJDwKKyUuaTogJS5jCisJJChXSU5DQykgJChVTUFLRURFUFMpICQoV0lOQ0ZMQUdTKSAtRSAtbyAkQCAkPAorJS5zOiAlLmMKKwkkKFdJTkNDKSAkKFVNQUtFREVQUykgJChXSU5DRkxBR1MpIC1TIC1vICRAICQ8CisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL3dpbjMyL1JFQURNRSBiL3dpbjMyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc1Y2YwCi0tLSAvZGV2L251bGwKKysrIGIvd2luMzIvUkVBRE1FCkBAIC0wLDAgKzEsNiBAQAorQnVpbGRpbmcgdGhlIFdpbjMyIGluc3RhbGxlciByZXF1aXJlcyB0aGUgTWluR1cgY29tcGlsZXIsIGF2YWlsYWJsZSBhdDoKKworCSBodHRwOi8vd3d3Lm1pbmd3Lm9yZy8KKworUHJlcGFja2FnZWQgdmVyc2lvbnMgb2YgdGhlIE1pbkdXIGNyb3NzLWNvbXBpbGVyIGFyZSBub3cgaW5jbHVkZWQgaW4KK3NldmVyYWwgTGludXggZGlzdHJpYnV0aW9ucywgaW5jbHVkaW5nIEZlZG9yYS4KZGlmZiAtLWdpdCBhL3dpbjMyL2ZpbmQtbWluZ3czMi5zaCBiL3dpbjMyL2ZpbmQtbWluZ3czMi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MWRjZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvd2luMzIvZmluZC1taW5ndzMyLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaAorCitjYz0iJDEiCisKK2ZvciBwcmVmaXggaW4gXAorICAgIG1pbmd3LSBcCisgICAgbWluZ3czMi0gXAorICAgIGkzODYtcGMtbWluZ3czMi0gXAorICAgIGk0ODYtcGMtbWluZ3czMi0gXAorICAgIGk1ODYtcGMtbWluZ3czMi0gXAorICAgIGk2ODYtcGMtbWluZ3czMi0gXAorICAgIGkzODYtcGMtbWluZ3czMm1zdmMtIFwKKyAgICBpNDg2LXBjLW1pbmd3MzJtc3ZjLSBcCisgICAgaTU4Ni1wYy1taW5ndzMybXN2Yy0gXAorICAgIGk2ODYtcGMtbWluZ3czMm1zdmMtIFwKKyAgICBpMzg2LW1pbmd3MzItIFwKKyAgICBpNDg2LW1pbmd3MzItIFwKKyAgICBpNTg2LW1pbmd3MzItIFwKKyAgICBpNjg2LW1pbmd3MzItIFwKKyAgICBpMzg2LW1pbmd3MzJtc3ZjLSBcCisgICAgaTQ4Ni1taW5ndzMybXN2Yy0gXAorICAgIGk1ODYtbWluZ3czMm1zdmMtIFwKKyAgICBpNjg2LW1pbmd3MzJtc3ZjLSBcCisgICAgaTY4Ni13NjQtbWluZ3czMi07IGRvCisgICAgaWYgIiR7cHJlZml4fSR7Y2N9IiAtdiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisJZWNobyAiJHByZWZpeCIKKwlleGl0IDAKKyAgICBmaQorZG9uZQorCisjIE5vIHByZWZpeCwgbm8gaWRlYSB3aGF0IHRvIGRvIG5vdy4uLgorZWNobyBtaXNzaW5nLQorZXhpdCAxCmRpZmYgLS1naXQgYS93aW4zMi9udGZzdGVzdC9NYWtlZmlsZSBiL3dpbjMyL250ZnN0ZXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODM3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi93aW4zMi9udGZzdGVzdC9NYWtlZmlsZQpAQCAtMCwwICsxLDg3IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDE5OTgtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjCisjIE1ha2VmaWxlIGZvciBXaW4zMiBOVEZTIGZpbGUgY2x1c3RlciB0ZXN0CisjCisjIFRoaXMgaXMgc2VwYXJhdGVkIG91dCBtb3N0bHkgc28gd2UgY2FuIGhhdmUgYSBkaWZmZXJlbnQgc2V0IG9mIE1ha2VmaWxlCisjIHZhcmlhYmxlcy4KKyMKKworT1NUWVBFICAgPSAkKHNoZWxsIHVuYW1lIC1tc3IpCitpZmVxICgkKGZpbmRzdHJpbmcgQ1lHV0lOLCQoT1NUWVBFKSksQ1lHV0lOKQorIyMgQ29tcGlsaW5nIG9uIEN5Z3dpbgorV0lOUFJFRklYICA6PQorV0lOQ0ZMQUdTICA6PSAtbW5vLWN5Z3dpbiAkKEdDQ1dBUk4pIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtRF9GSUxFX09GRlNFVF9CSVRTPTY0CitXSU5MREZMQUdTIDo9IC1tbm8tY3lnd2luIC1PcyAtcworZWxzZQorIyMgQ29tcGlsaW5nIG9uIHNvbWUgdmFyaWFudCBvZiBNaW5HVworaWZlcSAoJChmaW5kc3RyaW5nIE1JTkdXMzIsJChPU1RZUEUpKSxNSU5HVzMyKQorV0lOUFJFRklYICA6PQorZWxzZQorV0lOUFJFRklYICA6PSAkKHNoZWxsIC4uL2ZpbmQtbWluZ3czMi5zaCBnY2MpCitlbmRpZgorV0lOQ0ZMQUdTICA6PSAkKEdDQ1dBUk4pIC1Xbm8tc2lnbi1jb21wYXJlIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciBcCisJICAgICAgLURfRklMRV9PRkZTRVRfQklUUz02NAorV0lOTERGTEFHUyA6PSAtT3MgLXMKK2VuZGlmCitXSU5DRkxBR1MgKz0gLUkuIC1JLi4vLi4vd2luCisKK1dJTkNDICAgICAgOj0gJChXSU5QUkVGSVgpZ2NjCitXSU5BUgkgICA6PSAkKFdJTlBSRUZJWClhcgorV0lOUkFOTElCICA6PSAkKFdJTlBSRUZJWClyYW5saWIKK1dJTkRSRVMgICAgOj0gJChXSU5QUkVGSVgpd2luZHJlcworCitXSU5DQ19JU19HT09EIDo9ICQoc2hlbGwgJChXSU5DQykgJChXSU5DRkxBR1MpICQoV0lOTERGTEFHUykgXAorCS1vIGhlbGxvLmV4ZSAuLi8uLi93aW4vaGVsbG8uYyA+L2Rldi9udWxsIDI+JjEgOyBlY2hvICQkPykKKworLlNVRkZJWEVTOiAuYyAub2JqIC5saWIgLmV4ZSAuaSAucyAuUyAucmMgLnJlcworCitTUkNTICAgICA9IC4uLy4uL3dpbi9udGZzdGVzdC5jIC4uLy4uL3dpbi9udGZzc2VjdC5jIAorUkNTICAgICAgPSAuLi8uLi93aW4vbnRmc3Rlc3QucmMgCitPQkpTICAgICA9ICQocGF0c3Vic3QgJS5jLCUub2JqLCQobm90ZGlyICQoU1JDUykpKQorUkVTUyAgICAgPSAkKHBhdHN1YnN0ICUucmMsJS5yZXMsJChub3RkaXIgJChSQ1MpKSkKKworVlBBVEggPSAuOi4uLy4uL3dpbgorCitUQVJHRVRTID0gbnRmc3Rlc3QuZXhlCisKK2lmZXEgKCQoV0lOQ0NfSVNfR09PRCksMCkKK2FsbDogJChUQVJHRVRTKQorZWxzZQorYWxsOgorCXJtIC1mICQoVEFSR0VUUykKK2VuZGlmCisKK3RpZHkgZGlzdDoKKwktcm0gLWYgKi5vICoub2JqICoubGliICouaSAqLnMgKi5hIC4qLmQgKi50bXAgKl9iaW4uYyBoZWxsby5leGUKKworY2xlYW46IHRpZHkKKworc3BvdGxlc3M6IGNsZWFuCisJLXJtIC1mICp+ICQoVEFSR0VUUykKKworbnRmc3Rlc3QuZXhlOiAkKE9CSlMpICQoUkVTUykKKwkkKFdJTkNDKSAkKFdJTkxERkxBR1MpIC1vICRAICReCisKKworJS5vYmo6ICUuYworCSQoV0lOQ0MpICQoVU1BS0VERVBTKSAkKFdJTkNGTEFHUykgLWMgLW8gJEAgJDwKKyUuaTogJS5jCisJJChXSU5DQykgJChVTUFLRURFUFMpICQoV0lOQ0ZMQUdTKSAtRSAtbyAkQCAkPAorJS5zOiAlLmMKKwkkKFdJTkNDKSAkKFVNQUtFREVQUykgJChXSU5DRkxBR1MpIC1TIC1vICRAICQ8CislLnJlczogJS5yYworCSQoV0lORFJFUykgLU8gQ09GRiAkPCAkQAorCistaW5jbHVkZSAuKi5kCmRpZmYgLS1naXQgYS93aW42NC9NYWtlZmlsZSBiL3dpbjY0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNDdlMmUKLS0tIC9kZXYvbnVsbAorKysgYi93aW42NC9NYWtlZmlsZQpAQCAtMCwwICsxLDk0IEBACisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMKKyMjICAgQ29weXJpZ2h0IDE5OTgtMjAwOCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMjICAgQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvcjogSC4gUGV0ZXIgQW52aW4KKyMjCisjIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorIyMgICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjCisjIE1ha2VmaWxlIGZvciBTWVNMSU5VWCBXaW42NAorIworIyBUaGlzIGlzIHNlcGFyYXRlZCBvdXQgbW9zdGx5IHNvIHdlIGNhbiBoYXZlIGEgZGlmZmVyZW50IHNldCBvZiBNYWtlZmlsZQorIyB2YXJpYWJsZXMuCisjCisKK09TVFlQRSAgID0gJChzaGVsbCB1bmFtZSAtbXNyKQorIyBEb24ndCBrbm93IGhvdyB0byBkbyBhIG5hdGl2ZSBjb21waWxlIGhlcmUuLi4KK1dJTlBSRUZJWCAgOj0gJChzaGVsbCAkKFNSQykvZmluZC1taW5ndzY0LnNoIGdjYykKK1dJTkNGTEFHUyAgOj0gJChHQ0NXQVJOKSAtV25vLXNpZ24tY29tcGFyZSAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgXAorCSAgICAgIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQKK1dJTkxERkxBR1MgOj0gLU9zIC1zCisKK1dJTkNGTEFHUyArPSAtSSQoU1JDKSAtSSQoU1JDKS8uLi93aW4gLUkkKG9iamRpcikgXAorCSAgICAgLUkkKFNSQykvLi4vbGliZmF0IC1JJChTUkMpLy4uL2xpYmluc3RhbGxlciBcCisJICAgICAtSSQoU1JDKS8uLi9saWJpbnN0YWxsZXIvZ2V0b3B0CisKK1dJTkNDICAgICAgOj0gJChXSU5QUkVGSVgpZ2NjCitXSU5BUgkgICA6PSAkKFdJTlBSRUZJWClhcgorV0lOUkFOTElCICA6PSAkKFdJTlBSRUZJWClyYW5saWIKKworV0lOQ0NfSVNfR09PRCA6PSAkKHNoZWxsICQoV0lOQ0MpICQoV0lOQ0ZMQUdTKSAkKFdJTkxERkxBR1MpIFwKKwktbyBoZWxsby5leGUgJChTUkMpLy4uL3dpbi9oZWxsby5jID4vZGV2L251bGwgMj4mMSA7IGVjaG8gJCQ/KQorCisuU1VGRklYRVM6IC5jIC5vYmogLmxpYiAuZXhlIC5pIC5zIC5TCisKK1NSQ1MgICAgID0gLi4vd2luL3N5c2xpbnV4LmMgLi4vd2luL250ZnNzZWN0LmMKK09CSlMgICAgID0gJChwYXRzdWJzdCAlLmMsJS5vYmosJChub3RkaXIgJChTUkNTKSkpCitMSUJTUkMgICA9IC4uL2xpYmluc3RhbGxlci9mcy5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvc3lzbHhtb2QuYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL3N5c2x4b3B0LmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9zZXRhZHYuYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL2dldG9wdC9nZXRvcHRfbG9uZy5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvYm9vdHNlY3RfYmluLmMgXAorCSAgIC4uL2xpYmluc3RhbGxlci9sZGxpbnV4X2Jpbi5jIFwKKwkgICAuLi9saWJpbnN0YWxsZXIvbGRsaW51eGMzMl9iaW4uYyBcCisJICAgLi4vbGliaW5zdGFsbGVyL21icl9iaW4uYyBcCisJICAgJCh3aWxkY2FyZCAkKFNSQykvLi4vbGliZmF0LyouYykKK0xJQk9CSlMgID0gJChwYXRzdWJzdCAlLmMsJS5vYmosJChub3RkaXIgJChMSUJTUkMpKSkKKworTElCCSA9IHN5c2xpbnV4LmxpYgorCitWUEFUSCA9ICQoU1JDKTokKFNSQykvLi4vd2luOiQoU1JDKS8uLi9saWJmYXQ6JChTUkMpLy4uL2xpYmluc3RhbGxlcjokKFNSQykvLi4vbGliaW5zdGFsbGVyL2dldG9wdDokKE9CSikvLi4vbGliaW5zdGFsbGVyCisKK1RBUkdFVFMgPSBzeXNsaW51eDY0LmV4ZQorCitpZmVxICgkKFdJTkNDX0lTX0dPT0QpLDApCithbGw6ICQoVEFSR0VUUykKK2Vsc2UKK2FsbDoKKwlybSAtZiAkKFRBUkdFVFMpCitlbmRpZgorCit0aWR5IGRpc3Q6CisJLXJtIC1mICoubyAqLm9iaiAqLmxpYiAqLmkgKi5zICouYSAuKi5kICoudG1wICpfYmluLmMgaGVsbG8uZXhlCisKK2NsZWFuOiB0aWR5CisKK3Nwb3RsZXNzOiBjbGVhbgorCS1ybSAtZiAqfiAkKFRBUkdFVFMpCisKK2luc3RhbGxlcjoKKworJChMSUIpOiAkKExJQk9CSlMpCisJcm0gLWYgJEAKKwkkKFdJTkFSKSBjcSAkQCAkXgorCSQoV0lOUkFOTElCKSAkQAorCitzeXNsaW51eDY0LmV4ZTogJChPQkpTKSAkKExJQikKKwkkKFdJTkNDKSAkKFdJTkxERkxBR1MpIC1vICRAICReCisKKworJS5vYmo6ICUuYworCSQoV0lOQ0MpICQoVU1BS0VERVBTKSAkKFdJTkNGTEFHUykgLWMgLW8gJEAgJDwKKyUuaTogJS5jCisJJChXSU5DQykgJChVTUFLRURFUFMpICQoV0lOQ0ZMQUdTKSAtRSAtbyAkQCAkPAorJS5zOiAlLmMKKwkkKFdJTkNDKSAkKFVNQUtFREVQUykgJChXSU5DRkxBR1MpIC1TIC1vICRAICQ8CisKKy1pbmNsdWRlIC4qLmQKZGlmZiAtLWdpdCBhL3dpbjY0L1JFQURNRSBiL3dpbjY0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI0MTYwCi0tLSAvZGV2L251bGwKKysrIGIvd2luNjQvUkVBRE1FCkBAIC0wLDAgKzEsMTAgQEAKK0J1aWxkaW5nIHRoZSBXaW42NCBpbnN0YWxsZXIgcmVxdWlyZXMgdGhlIE1pbkdXLVc2NCBjb21waWxlciwKK2F2YWlsYWJsZSBhdDoKKworCWh0dHA6Ly9taW5ndy13NjQuc291cmNlZm9yZ2UubmV0LworCitGb3IgcHJlcGFja2FnZWQgdmVyc2lvbnMgb2YgdGhlIE1pbkdXLVc2NCBjcm9zcy1jb21waWxlciBmb3IgdGhlCitGZWRvcmEgTGludXggZGlzdHJpYnV0aW9uIChhbmQgcG9zc2libHkgb3RoZXIgUlBNLWJhc2VkCitkaXN0cmlidXRpb25zKSwgc2VlOgorCisJaHR0cDovL2xpc3RzLmZlZG9yYXByb2plY3Qub3JnL3BpcGVybWFpbC9taW5ndy8yMDEwLU1heS8wMDI1ODkuaHRtbApkaWZmIC0tZ2l0IGEvd2luNjQvZmluZC1taW5ndzY0LnNoIGIvd2luNjQvZmluZC1taW5ndzY0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyZTQyY2QKLS0tIC9kZXYvbnVsbAorKysgYi93aW42NC9maW5kLW1pbmd3NjQuc2gKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL3NoCisKK2NjPSIkMSIKKworZm9yIHByZWZpeCBpbiBcCisgICAgbWluZ3c2NC0gXAorICAgIHg4Nl82NC1wYy1taW5ndzY0LSBcCisgICAgeDg2XzY0LXBjLW1pbmd3NjRtc3ZjLSBcCisgICAgeDg2XzY0LXBjLW1pbmd3MzItIFwKKyAgICB4ODZfNjQtcGMtbWluZ3czMm1zdmMtIFwKKyAgICB4ODZfNjQtbWluZ3c2NC0gXAorICAgIHg4Nl82NC1taW5ndzY0bXN2Yy0gXAorICAgIHg4Nl82NC1taW5ndzMyLSBcCisgICAgeDg2XzY0LW1pbmd3MzJtc3ZjLSBcCisgICAgeDg2XzY0LXc2NC1taW5ndzMyLSBcCisgICAgeDg2XzY0LXc2NC1taW5ndzMybXN2Yy0gXAorICAgIGFtZDY0LXBjLW1pbmd3NjQtIFwKKyAgICBhbWQ2NC1wYy1taW5ndzY0bXN2Yy0gXAorICAgIGFtZDY0LXBjLW1pbmd3MzItIFwKKyAgICBhbWQ2NC1wYy1taW5ndzMybXN2Yy0gXAorICAgIGFtZDY0LW1pbmd3NjQtIFwKKyAgICBhbWQ2NC1taW5ndzY0bXN2Yy0gXAorICAgIGFtZDY0LW1pbmd3MzItIFwKKyAgICBhbWQ2NC1taW5ndzMybXN2Yy0gXAorICAgIGFtZDY0LXc2NC1taW5ndzMyLSBcCisgICAgYW1kNjQtdzY0LW1pbmd3MzJtc3ZjLSBcCisgICAgOyBkbworICAgIGlmICIke3ByZWZpeH0ke2NjfSIgLXYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorCWVjaG8gIiRwcmVmaXgiCisJZXhpdCAwCisgICAgZmkKK2RvbmUKKworIyBObyBwcmVmaXgsIG5vIGlkZWEgd2hhdCB0byBkbyBub3cuLi4KK2VjaG8gbWlzc2luZy0KK2V4aXQgMQpkaWZmIC0tZ2l0IGEvd2luNjQvbnRmc3Rlc3QvTWFrZWZpbGUgYi93aW42NC9udGZzdGVzdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjBkNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvd2luNjQvbnRmc3Rlc3QvTWFrZWZpbGUKQEAgLTAsMCArMSw3NiBAQAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjCisjIyAgIENvcHlyaWdodCAxOTk4LTIwMDggSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjIyAgIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uOyBhdXRob3I6IEguIFBldGVyIEFudmluCisjIworIyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyMjICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIworIyBNYWtlZmlsZSBmb3IgV2luNjQgTlRGUyBmaWxlIGNsdXN0ZXIgdGVzdAorIworIyBUaGlzIGlzIHNlcGFyYXRlZCBvdXQgbW9zdGx5IHNvIHdlIGNhbiBoYXZlIGEgZGlmZmVyZW50IHNldCBvZiBNYWtlZmlsZQorIyB2YXJpYWJsZXMuCisjCisKK09TVFlQRSAgID0gJChzaGVsbCB1bmFtZSAtbXNyKQorIyBEb24ndCBrbm93IGhvdyB0byBkbyBhIG5hdGl2ZSBjb21waWxlIGhlcmUuLi4KK1dJTlBSRUZJWCAgOj0gJChzaGVsbCAuLi9maW5kLW1pbmd3NjQuc2ggZ2NjKQorV0lOQ0ZMQUdTICA6PSAkKEdDQ1dBUk4pIC1Xbm8tc2lnbi1jb21wYXJlIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciBcCisJICAgICAgLURfRklMRV9PRkZTRVRfQklUUz02NAorV0lOTERGTEFHUyA6PSAtT3MgLXMKK1dJTkNGTEFHUyArPSAtSS4gLUkuLi8uLi93aW4KKworV0lOQ0MgICAgICA6PSAkKFdJTlBSRUZJWClnY2MKK1dJTkFSCSAgIDo9ICQoV0lOUFJFRklYKWFyCitXSU5SQU5MSUIgIDo9ICQoV0lOUFJFRklYKXJhbmxpYgorV0lORFJFUyAgICA6PSAkKFdJTlBSRUZJWCl3aW5kcmVzCisKK1dJTkNDX0lTX0dPT0QgOj0gJChzaGVsbCAkKFdJTkNDKSAkKFdJTkNGTEFHUykgJChXSU5MREZMQUdTKSBcCisJLW8gaGVsbG8uZXhlIC4uLy4uL3dpbi9oZWxsby5jID4vZGV2L251bGwgMj4mMSA7IGVjaG8gJCQ/KQorCisuU1VGRklYRVM6IC5jIC5vYmogLmxpYiAuZXhlIC5pIC5zIC5TIC5yYyAucmVzCisKK1NSQ1MgICAgID0gLi4vLi4vd2luL250ZnN0ZXN0LmMgLi4vLi4vd2luL250ZnNzZWN0LmMKK1JDUyAgICAgID0gLi4vLi4vd2luL250ZnN0ZXN0LnJjCitPQkpTICAgICA9ICQocGF0c3Vic3QgJS5jLCUub2JqLCQobm90ZGlyICQoU1JDUykpKQorUkVTUyAgICAgPSAkKHBhdHN1YnN0ICUucmMsJS5yZXMsJChub3RkaXIgJChSQ1MpKSkKKworVlBBVEggPSAuOi4uLy4uL3dpbgorCitUQVJHRVRTID0gbnRmc3Rlc3Q2NC5leGUKKworaWZlcSAoJChXSU5DQ19JU19HT09EKSwwKQorYWxsOiAkKFRBUkdFVFMpCitlbHNlCithbGw6CisJcm0gLWYgJChUQVJHRVRTKQorZW5kaWYKKwordGlkeSBkaXN0OgorCS1ybSAtZiAqLm8gKi5vYmogKi5saWIgKi5pICoucyAqLmEgLiouZCAqLnRtcCAqX2Jpbi5jIGhlbGxvLmV4ZQorCitjbGVhbjogdGlkeQorCitzcG90bGVzczogY2xlYW4KKwktcm0gLWYgKn4gJChUQVJHRVRTKQorCitudGZzdGVzdDY0LmV4ZTogJChPQkpTKSAkKFJFU1MpCisJJChXSU5DQykgJChXSU5MREZMQUdTKSAtbyAkQCAkXgorCisKKyUub2JqOiAlLmMKKwkkKFdJTkNDKSAkKFVNQUtFREVQUykgJChXSU5DRkxBR1MpIC1jIC1vICRAICQ8CislLmk6ICUuYworCSQoV0lOQ0MpICQoVU1BS0VERVBTKSAkKFdJTkNGTEFHUykgLUUgLW8gJEAgJDwKKyUuczogJS5jCisJJChXSU5DQykgJChVTUFLRURFUFMpICQoV0lOQ0ZMQUdTKSAtUyAtbyAkQCAkPAorJS5yZXM6ICUucmMKKwkkKFdJTkRSRVMpIC1PIENPRkYgJDwgJEAKKworLWluY2x1ZGUgLiouZAo=